From 1749dd69c7562badc75746301c5aa364b768c6fa Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Mon, 31 Oct 2016 19:57:30 -0500 Subject: [PATCH 0001/1062] Fix incorrect locking in CCryptoKeyStore --- src/wallet/crypter.cpp | 4 ++-- src/wallet/crypter.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/wallet/crypter.cpp b/src/wallet/crypter.cpp index a5ef786d8..69fe55ebd 100644 --- a/src/wallet/crypter.cpp +++ b/src/wallet/crypter.cpp @@ -153,7 +153,7 @@ static bool DecryptSpendingKey(const CKeyingMaterial& vMasterKey, bool CCryptoKeyStore::SetCrypted() { - LOCK(cs_KeyStore); + LOCK2(cs_KeyStore, cs_SpendingKeyStore); if (fUseCrypto) return true; if (!(mapKeys.empty() && mapSpendingKeys.empty())) @@ -179,7 +179,7 @@ bool CCryptoKeyStore::Lock() bool CCryptoKeyStore::Unlock(const CKeyingMaterial& vMasterKeyIn) { { - LOCK(cs_KeyStore); + LOCK2(cs_KeyStore, cs_SpendingKeyStore); if (!SetCrypted()) return false; diff --git a/src/wallet/crypter.h b/src/wallet/crypter.h index b310b77b0..d09cfa846 100644 --- a/src/wallet/crypter.h +++ b/src/wallet/crypter.h @@ -207,7 +207,7 @@ public: bool HaveSpendingKey(const libzcash::PaymentAddress &address) const { { - LOCK(cs_KeyStore); + LOCK(cs_SpendingKeyStore); if (!IsCrypted()) return CBasicKeyStore::HaveSpendingKey(address); return mapCryptedSpendingKeys.count(address) > 0; From dec148f4986beb88cf752a6b6f4781662bbb17b4 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 23 Mar 2017 18:57:13 +1300 Subject: [PATCH 0002/1062] Fix prioritisetransaction RPC test Part of #1884. --- qa/rpc-tests/prioritisetransaction.py | 28 ++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/qa/rpc-tests/prioritisetransaction.py b/qa/rpc-tests/prioritisetransaction.py index 2e8f11656..19dc6ade1 100755 --- a/qa/rpc-tests/prioritisetransaction.py +++ b/qa/rpc-tests/prioritisetransaction.py @@ -81,6 +81,30 @@ class PrioritiseTransactionTest (BitcoinTestFramework): priority_result = self.nodes[0].prioritisetransaction(priority_tx_0, 1000, int(3 * base_fee * COIN)) + # Check that prioritized transaction is not in getblocktemplate() + # (not updated because no new txns) + in_block_template = False + block_template = self.nodes[0].getblocktemplate() + for tx in block_template['transactions']: + if tx['hash'] == priority_tx_0: + in_block_template = True + break + assert_equal(in_block_template, False) + + self.nodes[0].sendtoaddress(self.nodes[1].getnewaddress(), 0.1) + + # Check that prioritized transaction is not in getblocktemplate() + # (too soon) + in_block_template = False + block_template = self.nodes[0].getblocktemplate() + for tx in block_template['transactions']: + if tx['hash'] == priority_tx_0: + in_block_template = True + break + assert_equal(in_block_template, False) + + sleep(10) + # Check that prioritized transaction is in getblocktemplate() in_block_template = False block_template = self.nodes[0].getblocktemplate() @@ -88,9 +112,7 @@ class PrioritiseTransactionTest (BitcoinTestFramework): if tx['hash'] == priority_tx_0: in_block_template = True break - # NOTE: getblocktemplate() should return prioritized transaction, but is not - # Noted by user in issue #1884 - assert_equal(in_block_template, False) + assert_equal(in_block_template, True) # Node 1 doesn't get the next block, so this *shouldn't* be mined despite being prioritized on node 1 priority_tx_1 = self.nodes[1].sendtoaddress(self.nodes[0].getnewaddress(), 0.1) From 704547965af4877d0db8192e7e15f75330b69960 Mon Sep 17 00:00:00 2001 From: Jay Graber Date: Fri, 24 Mar 2017 14:52:28 -0700 Subject: [PATCH 0003/1062] Change help text examples to use Zcash addresses --- src/rpcmisc.cpp | 10 +-- src/rpcrawtransaction.cpp | 2 +- src/wallet/rpcwallet.cpp | 146 +++++++++++++++++++------------------- 3 files changed, 79 insertions(+), 79 deletions(-) diff --git a/src/rpcmisc.cpp b/src/rpcmisc.cpp index 9eab8c217..c12e0ccfa 100644 --- a/src/rpcmisc.cpp +++ b/src/rpcmisc.cpp @@ -356,9 +356,9 @@ UniValue createmultisig(const UniValue& params, bool fHelp) "\nExamples:\n" "\nCreate a multisig address from 2 addresses\n" - + HelpExampleCli("createmultisig", "2 \"[\\\"16sSauSf5pF2UkUwvKGq4qjNRzBZYqgEL5\\\",\\\"171sgjn4YtPu27adkKGrdDwzRTxnRkBfKV\\\"]\"") + + + HelpExampleCli("createmultisig", "2 \"[\\\"t16sSauSf5pF2UkUwvKGq4qjNRzBZYqgEL5\\\",\\\"t171sgjn4YtPu27adkKGrdDwzRTxnRkBfKV\\\"]\"") + "\nAs a json rpc call\n" - + HelpExampleRpc("createmultisig", "2, \"[\\\"16sSauSf5pF2UkUwvKGq4qjNRzBZYqgEL5\\\",\\\"171sgjn4YtPu27adkKGrdDwzRTxnRkBfKV\\\"]\"") + + HelpExampleRpc("createmultisig", "2, \"[\\\"t16sSauSf5pF2UkUwvKGq4qjNRzBZYqgEL5\\\",\\\"t171sgjn4YtPu27adkKGrdDwzRTxnRkBfKV\\\"]\"") ; throw runtime_error(msg); } @@ -391,11 +391,11 @@ UniValue verifymessage(const UniValue& params, bool fHelp) "\nUnlock the wallet for 30 seconds\n" + HelpExampleCli("walletpassphrase", "\"mypassphrase\" 30") + "\nCreate the signature\n" - + HelpExampleCli("signmessage", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\" \"my message\"") + + + HelpExampleCli("signmessage", "\"t14oHp2v54vfmdgQ3v3SNuQga8JKHTNi2a1\" \"my message\"") + "\nVerify the signature\n" - + HelpExampleCli("verifymessage", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\" \"signature\" \"my message\"") + + + HelpExampleCli("verifymessage", "\"t14oHp2v54vfmdgQ3v3SNuQga8JKHTNi2a1\" \"signature\" \"my message\"") + "\nAs json rpc\n" - + HelpExampleRpc("verifymessage", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\", \"signature\", \"my message\"") + + HelpExampleRpc("verifymessage", "\"t14oHp2v54vfmdgQ3v3SNuQga8JKHTNi2a1\", \"signature\", \"my message\"") ); LOCK(cs_main); diff --git a/src/rpcrawtransaction.cpp b/src/rpcrawtransaction.cpp index 5ff035164..b971991cf 100644 --- a/src/rpcrawtransaction.cpp +++ b/src/rpcrawtransaction.cpp @@ -511,7 +511,7 @@ UniValue decoderawtransaction(const UniValue& params, bool fHelp) " \"reqSigs\" : n, (numeric) The required sigs\n" " \"type\" : \"pubkeyhash\", (string) The type, eg 'pubkeyhash'\n" " \"addresses\" : [ (json array of string)\n" - " \"12tvKAXCxZjSmdNbao16dKXC8tRWfcF5oc\" (string) bitcoin address\n" + " \"t12tvKAXCxZjSmdNbao16dKXC8tRWfcF5oc\" (string) bitcoin address\n" " ,...\n" " ]\n" " }\n" diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index efa1a18a3..c19cd6fc5 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -110,7 +110,7 @@ UniValue getnewaddress(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - + if (fHelp || params.size() > 1) throw runtime_error( "getnewaddress ( \"account\" )\n" @@ -187,7 +187,7 @@ UniValue getaccountaddress(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - + if (fHelp || params.size() != 1) throw runtime_error( "getaccountaddress \"account\"\n" @@ -219,7 +219,7 @@ UniValue getrawchangeaddress(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - + if (fHelp || params.size() > 1) throw runtime_error( "getrawchangeaddress\n" @@ -254,7 +254,7 @@ UniValue setaccount(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - + if (fHelp || params.size() < 1 || params.size() > 2) throw runtime_error( "setaccount \"zcashaddress\" \"account\"\n" @@ -263,8 +263,8 @@ UniValue setaccount(const UniValue& params, bool fHelp) "1. \"zcashaddress\" (string, required) The zcash address to be associated with an account.\n" "2. \"account\" (string, required) MUST be set to the empty string \"\" to represent the default account. Passing any other string will result in an error.\n" "\nExamples:\n" - + HelpExampleCli("setaccount", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\" \"tabby\"") - + HelpExampleRpc("setaccount", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\", \"tabby\"") + + HelpExampleCli("setaccount", "\"t14oHp2v54vfmdgQ3v3SNuQga8JKHTNi2a1\" \"tabby\"") + + HelpExampleRpc("setaccount", "\"t14oHp2v54vfmdgQ3v3SNuQga8JKHTNi2a1\", \"tabby\"") ); LOCK2(cs_main, pwalletMain->cs_wallet); @@ -300,7 +300,7 @@ UniValue getaccount(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - + if (fHelp || params.size() != 1) throw runtime_error( "getaccount \"zcashaddress\"\n" @@ -310,8 +310,8 @@ UniValue getaccount(const UniValue& params, bool fHelp) "\nResult:\n" "\"accountname\" (string) the account address\n" "\nExamples:\n" - + HelpExampleCli("getaccount", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\"") - + HelpExampleRpc("getaccount", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\"") + + HelpExampleCli("getaccount", "\"t14oHp2v54vfmdgQ3v3SNuQga8JKHTNi2a1\"") + + HelpExampleRpc("getaccount", "\"t14oHp2v54vfmdgQ3v3SNuQga8JKHTNi2a1\"") ); LOCK2(cs_main, pwalletMain->cs_wallet); @@ -332,7 +332,7 @@ UniValue getaddressesbyaccount(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - + if (fHelp || params.size() != 1) throw runtime_error( "getaddressesbyaccount \"account\"\n" @@ -400,7 +400,7 @@ UniValue sendtoaddress(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - + if (fHelp || params.size() < 2 || params.size() > 5) throw runtime_error( "sendtoaddress \"zcashaddress\" amount ( \"comment\" \"comment-to\" subtractfeefromamount )\n" @@ -419,10 +419,10 @@ UniValue sendtoaddress(const UniValue& params, bool fHelp) "\nResult:\n" "\"transactionid\" (string) The transaction id.\n" "\nExamples:\n" - + HelpExampleCli("sendtoaddress", "\"1M72Sfpbz1BPpXFHz9m3CdqATR44Jvaydd\" 0.1") - + HelpExampleCli("sendtoaddress", "\"1M72Sfpbz1BPpXFHz9m3CdqATR44Jvaydd\" 0.1 \"donation\" \"seans outpost\"") - + HelpExampleCli("sendtoaddress", "\"1M72Sfpbz1BPpXFHz9m3CdqATR44Jvaydd\" 0.1 \"\" \"\" true") - + HelpExampleRpc("sendtoaddress", "\"1M72Sfpbz1BPpXFHz9m3CdqATR44Jvaydd\", 0.1, \"donation\", \"seans outpost\"") + + HelpExampleCli("sendtoaddress", "\"t1M72Sfpbz1BPpXFHz9m3CdqATR44Jvaydd\" 0.1") + + HelpExampleCli("sendtoaddress", "\"t1M72Sfpbz1BPpXFHz9m3CdqATR44Jvaydd\" 0.1 \"donation\" \"seans outpost\"") + + HelpExampleCli("sendtoaddress", "\"t1M72Sfpbz1BPpXFHz9m3CdqATR44Jvaydd\" 0.1 \"\" \"\" true") + + HelpExampleRpc("sendtoaddress", "\"t1M72Sfpbz1BPpXFHz9m3CdqATR44Jvaydd\", 0.1, \"donation\", \"seans outpost\"") ); LOCK2(cs_main, pwalletMain->cs_wallet); @@ -458,7 +458,7 @@ UniValue listaddressgroupings(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - + if (fHelp) throw runtime_error( "listaddressgroupings\n" @@ -509,7 +509,7 @@ UniValue signmessage(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - + if (fHelp || params.size() != 2) throw runtime_error( "signmessage \"zcashaddress\" \"message\"\n" @@ -524,11 +524,11 @@ UniValue signmessage(const UniValue& params, bool fHelp) "\nUnlock the wallet for 30 seconds\n" + HelpExampleCli("walletpassphrase", "\"mypassphrase\" 30") + "\nCreate the signature\n" - + HelpExampleCli("signmessage", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\" \"my message\"") + + + HelpExampleCli("signmessage", "\"t14oHp2v54vfmdgQ3v3SNuQga8JKHTNi2a1\" \"my message\"") + "\nVerify the signature\n" - + HelpExampleCli("verifymessage", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\" \"signature\" \"my message\"") + + + HelpExampleCli("verifymessage", "\"t14oHp2v54vfmdgQ3v3SNuQga8JKHTNi2a1\" \"signature\" \"my message\"") + "\nAs json rpc\n" - + HelpExampleRpc("signmessage", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\", \"my message\"") + + HelpExampleRpc("signmessage", "\"t14oHp2v54vfmdgQ3v3SNuQga8JKHTNi2a1\", \"my message\"") ); LOCK2(cs_main, pwalletMain->cs_wallet); @@ -565,7 +565,7 @@ UniValue getreceivedbyaddress(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - + if (fHelp || params.size() < 1 || params.size() > 2) throw runtime_error( "getreceivedbyaddress \"zcashaddress\" ( minconf )\n" @@ -577,13 +577,13 @@ UniValue getreceivedbyaddress(const UniValue& params, bool fHelp) "amount (numeric) The total amount in btc received at this address.\n" "\nExamples:\n" "\nThe amount from transactions with at least 1 confirmation\n" - + HelpExampleCli("getreceivedbyaddress", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\"") + + + HelpExampleCli("getreceivedbyaddress", "\"t14oHp2v54vfmdgQ3v3SNuQga8JKHTNi2a1\"") + "\nThe amount including unconfirmed transactions, zero confirmations\n" - + HelpExampleCli("getreceivedbyaddress", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\" 0") + + + HelpExampleCli("getreceivedbyaddress", "\"t14oHp2v54vfmdgQ3v3SNuQga8JKHTNi2a1\" 0") + "\nThe amount with at least 6 confirmation, very safe\n" - + HelpExampleCli("getreceivedbyaddress", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\" 6") + + + HelpExampleCli("getreceivedbyaddress", "\"t14oHp2v54vfmdgQ3v3SNuQga8JKHTNi2a1\" 6") + "\nAs a json rpc call\n" - + HelpExampleRpc("getreceivedbyaddress", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\", 6") + + HelpExampleRpc("getreceivedbyaddress", "\"t14oHp2v54vfmdgQ3v3SNuQga8JKHTNi2a1\", 6") ); LOCK2(cs_main, pwalletMain->cs_wallet); @@ -623,7 +623,7 @@ UniValue getreceivedbyaccount(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - + if (fHelp || params.size() < 1 || params.size() > 2) throw runtime_error( "getreceivedbyaccount \"account\" ( minconf )\n" @@ -712,7 +712,7 @@ UniValue getbalance(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - + if (fHelp || params.size() > 3) throw runtime_error( "getbalance ( \"account\" minconf includeWatchonly )\n" @@ -784,7 +784,7 @@ UniValue getunconfirmedbalance(const UniValue ¶ms, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - + if (fHelp || params.size() > 0) throw runtime_error( "getunconfirmedbalance\n" @@ -800,7 +800,7 @@ UniValue movecmd(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - + if (fHelp || params.size() < 3 || params.size() > 5) throw runtime_error( "move \"fromaccount\" \"toaccount\" amount ( minconf \"comment\" )\n" @@ -872,7 +872,7 @@ UniValue sendfrom(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - + if (fHelp || params.size() < 3 || params.size() > 6) throw runtime_error( "sendfrom \"fromaccount\" \"tozcashaddress\" amount ( minconf \"comment\" \"comment-to\" )\n" @@ -893,11 +893,11 @@ UniValue sendfrom(const UniValue& params, bool fHelp) "\"transactionid\" (string) The transaction id.\n" "\nExamples:\n" "\nSend 0.01 btc from the default account to the address, must have at least 1 confirmation\n" - + HelpExampleCli("sendfrom", "\"\" \"1M72Sfpbz1BPpXFHz9m3CdqATR44Jvaydd\" 0.01") + + + HelpExampleCli("sendfrom", "\"\" \"t1M72Sfpbz1BPpXFHz9m3CdqATR44Jvaydd\" 0.01") + "\nSend 0.01 from the tabby account to the given address, funds must have at least 6 confirmations\n" - + HelpExampleCli("sendfrom", "\"tabby\" \"1M72Sfpbz1BPpXFHz9m3CdqATR44Jvaydd\" 0.01 6 \"donation\" \"seans outpost\"") + + + HelpExampleCli("sendfrom", "\"tabby\" \"t1M72Sfpbz1BPpXFHz9m3CdqATR44Jvaydd\" 0.01 6 \"donation\" \"seans outpost\"") + "\nAs a json rpc call\n" - + HelpExampleRpc("sendfrom", "\"tabby\", \"1M72Sfpbz1BPpXFHz9m3CdqATR44Jvaydd\", 0.01, 6, \"donation\", \"seans outpost\"") + + HelpExampleRpc("sendfrom", "\"tabby\", \"t1M72Sfpbz1BPpXFHz9m3CdqATR44Jvaydd\", 0.01, 6, \"donation\", \"seans outpost\"") ); LOCK2(cs_main, pwalletMain->cs_wallet); @@ -937,7 +937,7 @@ UniValue sendmany(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - + if (fHelp || params.size() < 2 || params.size() > 5) throw runtime_error( "sendmany \"fromaccount\" {\"address\":amount,...} ( minconf \"comment\" [\"address\",...] )\n" @@ -965,13 +965,13 @@ UniValue sendmany(const UniValue& params, bool fHelp) " the number of addresses.\n" "\nExamples:\n" "\nSend two amounts to two different addresses:\n" - + HelpExampleCli("sendmany", "\"\" \"{\\\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\\\":0.01,\\\"1353tsE8YMTA4EuV7dgUXGjNFf9KpVvKHz\\\":0.02}\"") + + + HelpExampleCli("sendmany", "\"\" \"{\\\"t14oHp2v54vfmdgQ3v3SNuQga8JKHTNi2a1\\\":0.01,\\\"t1353tsE8YMTA4EuV7dgUXGjNFf9KpVvKHz\\\":0.02}\"") + "\nSend two amounts to two different addresses setting the confirmation and comment:\n" - + HelpExampleCli("sendmany", "\"\" \"{\\\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\\\":0.01,\\\"1353tsE8YMTA4EuV7dgUXGjNFf9KpVvKHz\\\":0.02}\" 6 \"testing\"") + + + HelpExampleCli("sendmany", "\"\" \"{\\\"t14oHp2v54vfmdgQ3v3SNuQga8JKHTNi2a1\\\":0.01,\\\"t1353tsE8YMTA4EuV7dgUXGjNFf9KpVvKHz\\\":0.02}\" 6 \"testing\"") + "\nSend two amounts to two different addresses, subtract fee from amount:\n" - + HelpExampleCli("sendmany", "\"\" \"{\\\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\\\":0.01,\\\"1353tsE8YMTA4EuV7dgUXGjNFf9KpVvKHz\\\":0.02}\" 1 \"\" \"[\\\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\\\",\\\"1353tsE8YMTA4EuV7dgUXGjNFf9KpVvKHz\\\"]\"") + + + HelpExampleCli("sendmany", "\"\" \"{\\\"t14oHp2v54vfmdgQ3v3SNuQga8JKHTNi2a1\\\":0.01,\\\"t1353tsE8YMTA4EuV7dgUXGjNFf9KpVvKHz\\\":0.02}\" 1 \"\" \"[\\\"t14oHp2v54vfmdgQ3v3SNuQga8JKHTNi2a1\\\",\\\"t1353tsE8YMTA4EuV7dgUXGjNFf9KpVvKHz\\\"]\"") + "\nAs a json rpc call\n" - + HelpExampleRpc("sendmany", "\"\", \"{\\\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\\\":0.01,\\\"1353tsE8YMTA4EuV7dgUXGjNFf9KpVvKHz\\\":0.02}\", 6, \"testing\"") + + HelpExampleRpc("sendmany", "\"\", \"{\\\"t14oHp2v54vfmdgQ3v3SNuQga8JKHTNi2a1\\\":0.01,\\\"t1353tsE8YMTA4EuV7dgUXGjNFf9KpVvKHz\\\":0.02}\", 6, \"testing\"") ); LOCK2(cs_main, pwalletMain->cs_wallet); @@ -1051,7 +1051,7 @@ UniValue addmultisigaddress(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - + if (fHelp || params.size() < 2 || params.size() > 3) { string msg = "addmultisigaddress nrequired [\"key\",...] ( \"account\" )\n" @@ -1073,9 +1073,9 @@ UniValue addmultisigaddress(const UniValue& params, bool fHelp) "\nExamples:\n" "\nAdd a multisig address from 2 addresses\n" - + HelpExampleCli("addmultisigaddress", "2 \"[\\\"16sSauSf5pF2UkUwvKGq4qjNRzBZYqgEL5\\\",\\\"171sgjn4YtPu27adkKGrdDwzRTxnRkBfKV\\\"]\"") + + + HelpExampleCli("addmultisigaddress", "2 \"[\\\"t16sSauSf5pF2UkUwvKGq4qjNRzBZYqgEL5\\\",\\\"t171sgjn4YtPu27adkKGrdDwzRTxnRkBfKV\\\"]\"") + "\nAs json rpc call\n" - + HelpExampleRpc("addmultisigaddress", "2, \"[\\\"16sSauSf5pF2UkUwvKGq4qjNRzBZYqgEL5\\\",\\\"171sgjn4YtPu27adkKGrdDwzRTxnRkBfKV\\\"]\"") + + HelpExampleRpc("addmultisigaddress", "2, \"[\\\"t16sSauSf5pF2UkUwvKGq4qjNRzBZYqgEL5\\\",\\\"t171sgjn4YtPu27adkKGrdDwzRTxnRkBfKV\\\"]\"") ; throw runtime_error(msg); } @@ -1232,7 +1232,7 @@ UniValue listreceivedbyaddress(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - + if (fHelp || params.size() > 3) throw runtime_error( "listreceivedbyaddress ( minconf includeempty includeWatchonly)\n" @@ -1269,7 +1269,7 @@ UniValue listreceivedbyaccount(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - + if (fHelp || params.size() > 3) throw runtime_error( "listreceivedbyaccount ( minconf includeempty includeWatchonly)\n" @@ -1401,7 +1401,7 @@ UniValue listtransactions(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - + if (fHelp || params.size() > 4) throw runtime_error( "listtransactions ( \"account\" count from includeWatchonly)\n" @@ -1523,7 +1523,7 @@ UniValue listaccounts(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - + if (fHelp || params.size() > 2) throw runtime_error( "listaccounts ( minconf includeWatchonly)\n" @@ -1603,7 +1603,7 @@ UniValue listsinceblock(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - + if (fHelp) throw runtime_error( "listsinceblock ( \"blockhash\" target-confirmations includeWatchonly)\n" @@ -1694,7 +1694,7 @@ UniValue gettransaction(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - + if (fHelp || params.size() < 1 || params.size() > 2) throw runtime_error( "gettransaction \"txid\" ( includeWatchonly )\n" @@ -1783,7 +1783,7 @@ UniValue backupwallet(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - + if (fHelp || params.size() != 1) throw runtime_error( "backupwallet \"destination\"\n" @@ -1826,7 +1826,7 @@ UniValue keypoolrefill(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - + if (fHelp || params.size() > 1) throw runtime_error( "keypoolrefill ( newsize )\n" @@ -1870,7 +1870,7 @@ UniValue walletpassphrase(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - + if (pwalletMain->IsCrypted() && (fHelp || params.size() != 2)) throw runtime_error( "walletpassphrase \"passphrase\" timeout\n" @@ -1932,7 +1932,7 @@ UniValue walletpassphrasechange(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - + if (pwalletMain->IsCrypted() && (fHelp || params.size() != 2)) throw runtime_error( "walletpassphrasechange \"oldpassphrase\" \"newpassphrase\"\n" @@ -1978,7 +1978,7 @@ UniValue walletlock(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - + if (pwalletMain->IsCrypted() && (fHelp || params.size() != 0)) throw runtime_error( "walletlock\n" @@ -1989,7 +1989,7 @@ UniValue walletlock(const UniValue& params, bool fHelp) "\nSet the passphrase for 2 minutes to perform a transaction\n" + HelpExampleCli("walletpassphrase", "\"my pass phrase\" 120") + "\nPerform a send (requires passphrase set)\n" - + HelpExampleCli("sendtoaddress", "\"1M72Sfpbz1BPpXFHz9m3CdqATR44Jvaydd\" 1.0") + + + HelpExampleCli("sendtoaddress", "\"t1M72Sfpbz1BPpXFHz9m3CdqATR44Jvaydd\" 1.0") + "\nClear the passphrase since we are done before 2 minutes is up\n" + HelpExampleCli("walletlock", "") + "\nAs json rpc call\n" @@ -2085,7 +2085,7 @@ UniValue lockunspent(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - + if (fHelp || params.size() < 1 || params.size() > 2) throw runtime_error( "lockunspent unlock [{\"txid\":\"txid\",\"vout\":n},...]\n" @@ -2169,7 +2169,7 @@ UniValue listlockunspent(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - + if (fHelp || params.size() > 0) throw runtime_error( "listlockunspent\n" @@ -2218,7 +2218,7 @@ UniValue settxfee(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - + if (fHelp || params.size() < 1 || params.size() > 1) throw runtime_error( "settxfee amount\n" @@ -2245,7 +2245,7 @@ UniValue getwalletinfo(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - + if (fHelp || params.size() != 0) throw runtime_error( "getwalletinfo\n" @@ -2287,7 +2287,7 @@ UniValue resendwallettransactions(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - + if (fHelp || params.size() != 0) throw runtime_error( "resendwallettransactions\n" @@ -2312,7 +2312,7 @@ UniValue listunspent(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - + if (fHelp || params.size() > 3) throw runtime_error( "listunspent ( minconf maxconf [\"address\",...] )\n" @@ -2345,8 +2345,8 @@ UniValue listunspent(const UniValue& params, bool fHelp) "\nExamples\n" + HelpExampleCli("listunspent", "") - + HelpExampleCli("listunspent", "6 9999999 \"[\\\"1PGFqEzfmQch1gKD3ra4k18PNj3tTUUSqg\\\",\\\"1LtvqCaApEdUGFkpKMM4MstjcaL4dKg8SP\\\"]\"") - + HelpExampleRpc("listunspent", "6, 9999999 \"[\\\"1PGFqEzfmQch1gKD3ra4k18PNj3tTUUSqg\\\",\\\"1LtvqCaApEdUGFkpKMM4MstjcaL4dKg8SP\\\"]\"") + + HelpExampleCli("listunspent", "6 9999999 \"[\\\"t1PGFqEzfmQch1gKD3ra4k18PNj3tTUUSqg\\\",\\\"t1LtvqCaApEdUGFkpKMM4MstjcaL4dKg8SP\\\"]\"") + + HelpExampleRpc("listunspent", "6, 9999999 \"[\\\"t1PGFqEzfmQch1gKD3ra4k18PNj3tTUUSqg\\\",\\\"t1LtvqCaApEdUGFkpKMM4MstjcaL4dKg8SP\\\"]\"") ); RPCTypeCheck(params, boost::assign::list_of(UniValue::VNUM)(UniValue::VNUM)(UniValue::VARR)); @@ -2971,8 +2971,8 @@ UniValue z_listaddresses(const UniValue& params, bool fHelp) CAmount getBalanceTaddr(std::string transparentAddress, int minDepth=1) { set setAddress; vector vecOutputs; - CAmount balance = 0; - + CAmount balance = 0; + if (transparentAddress.length() > 0) { CBitcoinAddress taddr = CBitcoinAddress(transparentAddress); if (!taddr.IsValid()) { @@ -2980,7 +2980,7 @@ CAmount getBalanceTaddr(std::string transparentAddress, int minDepth=1) { } setAddress.insert(taddr); } - + LOCK2(cs_main, pwalletMain->cs_wallet); pwalletMain->AvailableCoins(vecOutputs, false, NULL, true); @@ -3000,7 +3000,7 @@ CAmount getBalanceTaddr(std::string transparentAddress, int minDepth=1) { continue; } } - + CAmount nValue = out.tx->vout[out.i].nValue; balance += nValue; } @@ -3048,7 +3048,7 @@ UniValue z_listreceivedbyaddress(const UniValue& params, bool fHelp) if (nMinDepth < 0) { throw JSONRPCError(RPC_INVALID_PARAMETER, "Minimum number of confirmations cannot be less than 0"); } - + // Check that the from address is valid. auto fromaddress = params[0].get_str(); @@ -3063,8 +3063,8 @@ UniValue z_listreceivedbyaddress(const UniValue& params, bool fHelp) if (!pwalletMain->HaveSpendingKey(zaddr)) { throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "From address does not belong to this node, zaddr spending key not found."); } - - + + UniValue result(UniValue::VARR); std::vector entries; pwalletMain->GetFilteredNotes(entries, fromaddress, nMinDepth, false); @@ -3112,7 +3112,7 @@ UniValue z_getbalance(const UniValue& params, bool fHelp) if (nMinDepth < 0) { throw JSONRPCError(RPC_INVALID_PARAMETER, "Minimum number of confirmations cannot be less than 0"); } - + // Check that the from address is valid. auto fromaddress = params[0].get_str(); bool fromTaddr = false; @@ -3179,7 +3179,7 @@ UniValue z_gettotalbalance(const UniValue& params, bool fHelp) } // getbalance and "getbalance * 1 true" should return the same number - // but they don't because wtx.GetAmounts() does not handle tx where there are no outputs + // but they don't because wtx.GetAmounts() does not handle tx where there are no outputs // pwalletMain->GetBalance() does not accept min depth parameter // so we use our own method to get balance of utxos. CAmount nBalance = getBalanceTaddr("", nMinDepth); @@ -3207,7 +3207,7 @@ UniValue z_getoperationresult(const UniValue& params, bool fHelp) "\nResult:\n" "\" [object, ...]\" (array) A list of JSON objects\n" ); - + // This call will remove finished operations return z_getoperationstatus_IMPL(params, true); } @@ -3227,7 +3227,7 @@ UniValue z_getoperationstatus(const UniValue& params, bool fHelp) "\nResult:\n" "\" [object, ...]\" (array) A list of JSON objects\n" ); - + // This call is idempotent so we don't want to remove finished operations return z_getoperationstatus_IMPL(params, false); } @@ -3252,7 +3252,7 @@ UniValue z_getoperationstatus_IMPL(const UniValue& params, bool fRemoveFinishedO for (auto id : ids) { if (useFilter && !filter.count(id)) continue; - + std::shared_ptr operation = q->getOperationForId(id); if (!operation) { continue; From 99eb947a983aad2ea169e19a4e1b329c928a7943 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 8 Mar 2017 16:19:54 -0800 Subject: [PATCH 0004/1062] Add AMQP 1.0 support via Apache Qpid Proton C++ API 0.17.0 --- configure.ac | 26 +++ contrib/amqp/amqp_sub.py | 48 ++++++ contrib/debian/copyright | 221 +++++++++++++++++++++++++ depends/packages/packages.mk | 2 +- depends/packages/proton.mk | 30 ++++ doc/amqp.md | 123 ++++++++++++++ qa/pull-tester/rpc-tests.sh | 4 + qa/pull-tester/tests-config.sh.in | 1 + qa/rpc-tests/proton_test.py | 125 ++++++++++++++ src/Makefile.am | 21 +++ src/Makefile.gtest.include | 5 + src/Makefile.test.include | 4 + src/amqp/amqpabstractnotifier.cpp | 21 +++ src/amqp/amqpabstractnotifier.h | 43 +++++ src/amqp/amqpconfig.h | 33 ++++ src/amqp/amqpnotificationinterface.cpp | 136 +++++++++++++++ src/amqp/amqpnotificationinterface.h | 36 ++++ src/amqp/amqppublishnotifier.cpp | 177 ++++++++++++++++++++ src/amqp/amqppublishnotifier.h | 56 +++++++ src/amqp/amqpsender.h | 115 +++++++++++++ src/init.cpp | 39 +++++ 21 files changed, 1265 insertions(+), 1 deletion(-) create mode 100644 contrib/amqp/amqp_sub.py create mode 100644 depends/packages/proton.mk create mode 100644 doc/amqp.md create mode 100755 qa/rpc-tests/proton_test.py create mode 100644 src/amqp/amqpabstractnotifier.cpp create mode 100644 src/amqp/amqpabstractnotifier.h create mode 100644 src/amqp/amqpconfig.h create mode 100644 src/amqp/amqpnotificationinterface.cpp create mode 100644 src/amqp/amqpnotificationinterface.h create mode 100644 src/amqp/amqppublishnotifier.cpp create mode 100644 src/amqp/amqppublishnotifier.h create mode 100644 src/amqp/amqpsender.h diff --git a/configure.ac b/configure.ac index 70ba71601..a9086b9fb 100644 --- a/configure.ac +++ b/configure.ac @@ -106,6 +106,12 @@ AC_ARG_ENABLE([upnp-default], [use_upnp_default=$enableval], [use_upnp_default=no]) +AC_ARG_ENABLE([proton], + [AS_HELP_STRING([--disable-proton], + [disable Proton (AMQP messaging)])], + [use_proton=$enableval], + [use_proton=yes]) + AC_ARG_ENABLE(tests, AS_HELP_STRING([--enable-tests],[compile tests (default is yes)]), [use_tests=$enableval], @@ -534,6 +540,23 @@ if test x$enable_wallet != xno; then BITCOIN_FIND_BDB62 fi +dnl Check Qpid Proton headers and library exist +if test x$use_proton = xyes; then + AC_CHECK_HEADERS([proton/connection.hpp], + [], + [AC_MSG_WARN([Proton headers not found, disabling Proton support]) + use_proton=no]) + AC_CHECK_LIB([qpid-proton-cpp], [main], + [PROTON_LIBS="-lqpid-proton-cpp -lqpid-proton"], + [AC_MSG_WARN([Proton libraries not found, disabling Proton support]) + use_proton=no]) +fi +if test x$use_proton = xyes; then + AC_DEFINE(ENABLE_PROTON, 1, [Define to 1 to enable Proton functions]) +else + AC_DEFINE(ENABLE_PROTON, 0, [Define to 1 to enable Proton functions]) +fi + dnl Check for libminiupnpc (optional) if test x$use_upnp != xno; then AC_CHECK_HEADERS( @@ -883,6 +906,8 @@ fi AM_CONDITIONAL([ENABLE_ZMQ], [test "x$use_zmq" = "xyes"]) +AM_CONDITIONAL([ENABLE_PROTON], [test "x$use_proton" = "xyes"]) + AC_MSG_CHECKING([whether to build test_bitcoin]) if test x$use_tests = xyes; then AC_MSG_RESULT([yes]) @@ -941,6 +966,7 @@ AC_SUBST(GMP_LIBS) AC_SUBST(GMPXX_LIBS) AC_SUBST(LIBSNARK_LIBS) AC_SUBST(LIBZCASH_LIBS) +AC_SUBST(PROTON_LIBS) AC_CONFIG_FILES([Makefile src/Makefile doc/man/Makefile share/setup.nsi src/test/buildenv.py]) AC_CONFIG_FILES([qa/pull-tester/run-bitcoind-for-test.sh],[chmod +x qa/pull-tester/run-bitcoind-for-test.sh]) AC_CONFIG_FILES([qa/pull-tester/tests-config.sh],[chmod +x qa/pull-tester/tests-config.sh]) diff --git a/contrib/amqp/amqp_sub.py b/contrib/amqp/amqp_sub.py new file mode 100644 index 000000000..bc51e8428 --- /dev/null +++ b/contrib/amqp/amqp_sub.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python2 +# Copyright (c) 2017 The Zcash developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +# Requirements: +# pip install python-qpid-proton + +import binascii +from proton.handlers import MessagingHandler +from proton.reactor import Container + +port = 5672 + +class Server(MessagingHandler): + def __init__(self, url): + super(Server, self).__init__() + self.url = url + self.senders = {} + + def on_start(self, event): + print "Listening on:", self.url + self.container = event.container + self.acceptor = event.container.listen(self.url) + + def on_message(self, event): + m = event.message + topic = m.subject + body = m.body + sequence = str( m.properties['x-opt-sequence-number'] ) + if topic == "hashablock": + print '- HASH BLOCK ('+sequence+') -' + print binascii.hexlify(body) + elif topic == "hashtx": + print '- HASH TX ('+sequence+') -' + print binascii.hexlify(body) + elif topic == "rawblock": + print '- RAW BLOCK HEADER ('+sequence+') -' + print binascii.hexlify(body[:80]) + elif topic == "rawtx": + print '- RAW TX ('+sequence+') -' + print binascii.hexlify(body) + +try: + Container(Server("127.0.0.1:%i" % port)).run() +except KeyboardInterrupt: + pass + diff --git a/contrib/debian/copyright b/contrib/debian/copyright index aea954e07..f1316160a 100644 --- a/contrib/debian/copyright +++ b/contrib/debian/copyright @@ -59,6 +59,10 @@ Files: depends/sources/google*.tar.gz Copyright: 2008 Google Inc. License: BSD-3clause-Google +Files: depends/sources/qpid-proton-*.tar.gz +Copyright: 2012-2017 The Apache Software Foundation +License: Apache-Qpid-Proton-with-BSD-Subcomponents + License: Boost-Software-License-1.0 Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by @@ -1091,3 +1095,220 @@ License: LGPL-with-ZeroMQ-exception Comment: You should have received a copy of the GNU General Public License along with this program. If not, see . + +License: Apache-Qpid-Proton-with-BSD-Subcomponents + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + . + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + . + 1. Definitions. + . + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + . + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + . + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + . + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + . + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + . + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + . + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + . + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + . + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + . + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + . + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + . + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + . + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + . + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + . + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + . + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + . + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + . + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + . + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + . + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + . + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + . + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + . + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + . + END OF TERMS AND CONDITIONS + . + APPENDIX: How to apply the Apache License to your work. + . + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + . + Copyright [yyyy] [name of copyright owner] + . + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + . + http://www.apache.org/licenses/LICENSE-2.0 + . + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + . + . + PROTON SUBCOMPONENTS: + . + Proton includes freegetopt with a separate BSD license. Your use + of the source code for freegetopt is subject to the terms and + conditions of its license in examples/include/pncompat/internal/LICENSE. + . + The setup scripts for the python bindings include files derived by + PyZMQ and are licensed with a separate Modified BSD license. Use of + the source code in these setup files are subject to the terms and + conditions in the license: + proton-c/bindings/python/setuputils/PYZMQ_LICENSE.BSD. + diff --git a/depends/packages/packages.mk b/depends/packages/packages.mk index 9d025a6b2..33f45aea3 100644 --- a/depends/packages/packages.mk +++ b/depends/packages/packages.mk @@ -1,6 +1,6 @@ rust_packages := rust librustzcash zcash_packages := libsnark libgmp libsodium -packages := boost openssl libevent zeromq $(zcash_packages) googletest googlemock +packages := boost openssl libevent zeromq $(zcash_packages) googletest googlemock proton native_packages := native_ccache wallet_packages=bdb diff --git a/depends/packages/proton.mk b/depends/packages/proton.mk new file mode 100644 index 000000000..fa1779ead --- /dev/null +++ b/depends/packages/proton.mk @@ -0,0 +1,30 @@ +package=proton +$(package)_version=0.17.0 +$(package)_download_path=http://apache.cs.utah.edu/qpid/proton/$($(package)_version) +$(package)_file_name=qpid-proton-$($(package)_version).tar.gz +$(package)_sha256_hash=6ffd26d3d0e495bfdb5d9fefc5349954e6105ea18cc4bb191161d27742c5a01a +$(package)_dependencies= + +define $(package)_preprocess_cmds + sed -i.old 's/qpid-proton SHARED/qpid-proton STATIC/' proton-c/CMakeLists.txt && \ + sed -i.old 's/SASL/_DO_NOT_BUILD_SASL_/' proton-c/CMakeLists.txt && \ + sed -i.old 's/qpid-proton-core SHARED/qpid-proton-core STATIC/' proton-c/CMakeLists.txt && \ + sed -i.old 's/find_package(OpenSSL)/#find_package(OpenSSL)/' proton-c/CMakeLists.txt && \ + sed -i.old 's/qpid-proton-cpp SHARED/qpid-proton-cpp STATIC/' proton-c/bindings/cpp/CMakeLists.txt && \ + sed -i.old 's/DEFAULT_GO ON/DEFAULT_GO OFF/' proton-c/bindings/CMakeLists.txt && \ + mkdir build +endef + +define $(package)_config_cmds + cd build; cmake .. -DCMAKE_CXX_STANDARD=11 -DCMAKE_INSTALL_PREFIX=/ -DSYSINSTALL_BINDINGS=ON -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DBUILD_PYTHON=OFF -DBUILD_PHP=OFF -DBUILD_JAVA=OFF -DBUILD_PERL=OFF -DBUILD_RUBY=OFF -DDEFAULT_GO=OFF +endef + +define $(package)_build_cmds + cd build; $(MAKE) VERBOSE=1 all && \ + cp CMakeCache.txt /tmp/CMakeCache.txt +endef + +define $(package)_stage_cmds + cd build; $(MAKE) VERBOSE=1 DESTDIR=$($(package)_staging_prefix_dir) install +endef + diff --git a/doc/amqp.md b/doc/amqp.md new file mode 100644 index 000000000..f733fa514 --- /dev/null +++ b/doc/amqp.md @@ -0,0 +1,123 @@ +# Block and Transaction Broadcasting With AMQP 1.0 (Experimental Feature) + +[AMQP](https://www.amqp.org/) is an enterprise-level message queuing +protocol for the reliable passing of real-time data and business +transactions between applications. AMQP supports both broker and +brokerless messaging. AMQP 1.0 is an open standard and has been +ratified as ISO/IEC 19464. + +The Zcash daemon can be configured to act as a trusted "border +router", implementing the Zcash P2P protocol and relay, making +consensus decisions, maintaining the local blockchain database, +broadcasting locally generated transactions into the network, and +providing a queryable RPC interface to interact on a polled basis for +requesting blockchain related data. However, there exists only a +limited service to notify external software of events like the arrival +of new blocks or transactions. + +The AMQP facility implements a notification interface through a set +of specific notifiers. Currently there are notifiers that publish +blocks and transactions. This read-only facility requires only the +connection of a corresponding AMQP subscriber port in receiving +software. + +Currently the facility is not authenticated nor is there any two-way +protocol involvement. Therefore, subscribers should validate the +received data since it may be out of date, incomplete or even invalid. + +Because AMQP is message oriented, subscribers receive transactions +and blocks all-at-once and do not need to implement any sort of +buffering or reassembly. + +## Prerequisites + +The AMQP feature in Zcash requires [Qpid Proton](https://qpid.apache.org/proton/) +version 0.17 or newer, which you will need to install if you are not +using the depends system. Typically, it is packaged by distributions as +something like *libqpid-proton*. The C++ wrapper for AMQP *is* required. + +In order to run the example Python client scripts in contrib/ one must +also install *python-qpid-proton*, though this is not necessary for +daemon operation. + +## Enabling + +By default, the AMQP feature is automatically compiled in if the +necessary prerequisites are found. To disable, use --disable-proton +during the *configure* step of building zcashd: + + $ ./configure --disable-proton (other options) + +To actually enable operation, one must set the appropriate options on +the commandline or in the configuration file. + +## Usage + +AMQP support is currently an experimental feature, so you must pass +the option: + + -experimentalfeatures + +Currently, the following notifications are supported: + + -amqppubhashtx=address + -amqppubhashblock=address + -amqppubrawblock=address + -amqppubrawtx=address + +The address must be a valid AMQP address, where the same address can be +used in more than notification. Note that SSL and SASL addresses are +not currently supported. + +Launch zcashd like this: + + $ zcashd -amqppubhashtx=amqp://127.0.0.1:5672 + +Or this: + + $ zcashd -amqppubhashtx=amqp://127.0.0.1:5672 \ + -amqppubrawtx=amqp://127.0.0.1:5672 \ + -amqppubrawblock=amqp://127.0.0.1:5672 \ + -amqppubhashblock=amqp://127.0.0.1:5672 \ + -debug=amqp + +The debug category `amqp` enables AMQP-related logging. + +Each notification has a topic and body, where the header corresponds +to the notification type. For instance, for the notification `-amqpubhashtx` +the topic is `hashtx` (no null terminator) and the body is the hexadecimal +transaction hash (32 bytes). This transaction hash and the block hash +found in `hashblock` are in RPC byte order. + +These options can also be provided in zcash.conf. + +Please see `contrib/amqp/amqp_sub.py` for a working example of an +AMQP server listening for messages. + +## Remarks + +From the perspective of zcashd, the local end of an AMQP link is write-only. + +No information is broadcast that wasn't already received from the public +P2P network. + +No authentication or authorization is done on peers that zcashd connects +to; it is assumed that the AMQP link is exposed only to trusted entities, +using other means such as firewalling. + +TLS support may be added once OpenSSL has been removed from the Zcash +project and alternative TLS implementations have been evaluated. + +SASL support may be added in a future update for secure communication. + +Note that when the block chain tip changes, a reorganisation may occur +and just the tip will be notified. It is up to the subscriber to +retrieve the chain from the last known block to the new tip. + +At present, zcashd does not try to resend a notification if there was +a problem confirming receipt. Support for delivery guarantees such as +*at-least-once* and *exactly-once* will be added in in a future update. + +Currently, zcashd appends an up-counting sequence number to each notification +which allows listeners to detect lost notifications. + diff --git a/qa/pull-tester/rpc-tests.sh b/qa/pull-tester/rpc-tests.sh index 08ff3fe7a..f90bf9760 100755 --- a/qa/pull-tester/rpc-tests.sh +++ b/qa/pull-tester/rpc-tests.sh @@ -65,6 +65,10 @@ if [ "x$ENABLE_ZMQ" = "x1" ]; then testScripts+=('zmq_test.py') fi +if [ "x$ENABLE_PROTON" = "x1" ]; then + testScripts+=('proton_test.py') +fi + extArg="-extended" passOn=${@#$extArg} diff --git a/qa/pull-tester/tests-config.sh.in b/qa/pull-tester/tests-config.sh.in index 1cb9ee06b..cc76e8ad8 100755 --- a/qa/pull-tester/tests-config.sh.in +++ b/qa/pull-tester/tests-config.sh.in @@ -11,6 +11,7 @@ EXEEXT="@EXEEXT@" @BUILD_BITCOIN_UTILS_TRUE@ENABLE_UTILS=1 @BUILD_BITCOIND_TRUE@ENABLE_BITCOIND=1 @ENABLE_ZMQ_TRUE@ENABLE_ZMQ=1 +@ENABLE_PROTON_TRUE@ENABLE_PROTON=1 REAL_BITCOIND="$BUILDDIR/src/zcashd${EXEEXT}" REAL_BITCOINCLI="$BUILDDIR/src/zcash-cli${EXEEXT}" diff --git a/qa/rpc-tests/proton_test.py b/qa/rpc-tests/proton_test.py new file mode 100755 index 000000000..b895c087f --- /dev/null +++ b/qa/rpc-tests/proton_test.py @@ -0,0 +1,125 @@ +#!/usr/bin/env python2 +# Copyright (c) 2017 The Zcash developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +# +# Test Proton interface (provides AMQP 1.0 messaging support). +# +# Requirements: +# Python library for Qpid Proton: +# https://pypi.python.org/pypi/python-qpid-proton +# To install: +# pip install python-qpid-proton +# + +from test_framework.test_framework import BitcoinTestFramework +from test_framework.util import * +from proton.handlers import MessagingHandler +from proton.reactor import Container +import binascii +import struct +import threading + +try: + import http.client as httplib +except ImportError: + import httplib +try: + import urllib.parse as urlparse +except ImportError: + import urlparse + + +class Server(MessagingHandler): + + def __init__(self, url, limit): + super(Server, self).__init__() + self.url = url + self.counter = limit + self.blockhashes = [] + self.txids = [] + self.blockseq = -1 + self.txidseq = -1 + + def on_start(self, event): + print "Proton listening on:", self.url + self.container = event.container + self.acceptor = event.container.listen(self.url) + + def on_message(self, event): + m = event.message + hash = bytes_to_hex_str(m.body) + sequence = m.properties['x-opt-sequence-number'] + if m.subject == "hashtx": + self.txids.append(hash) + + # Test that sequence id is incrementing + assert(sequence == 1 + self.txidseq) + self.txidseq = sequence + elif m.subject == "hashblock": + self.blockhashes.append(hash) + + # Test that sequence id is incrementing + assert(sequence == 1 + self.blockseq) + self.blockseq = sequence + + self.counter = self.counter - 1 + if self.counter == 0: + self.container.stop() + + +class ProtonTest (BitcoinTestFramework): + + port = 25672 + numblocks = 10 # must be even, as two nodes generate equal number + assert(numblocks % 2 == 0) + + def setup_nodes(self): + + # Launch proton server in background thread + # It terminates after receiving numblocks * 2 messages (one for coinbase, one for block) + self.server = Server("127.0.0.1:%i" % self.port, self.numblocks * 2) + self.container = Container(self.server) + self.t1 = threading.Thread(target=self.container.run) + self.t1.start() + + return start_nodes(4, self.options.tmpdir, extra_args=[ + ['-experimentalfeatures', '-debug=amqp', '-amqppubhashtx=amqp://127.0.0.1:'+str(self.port), + '-amqppubhashblock=amqp://127.0.0.1:'+str(self.port)], + [], + [], + [] + ]) + + def run_test(self): + self.sync_all() + baseheight = self.nodes[0].getblockcount() # 200 blocks already mined + + # generate some blocks + self.nodes[0].generate(self.numblocks/2) + self.sync_all() + self.nodes[1].generate(self.numblocks/2) + self.sync_all() + + # wait for server to finish + self.t1.join() + + # sequence numbers have already been checked in the server's message handler + + # sanity check that we have the right number of block hashes and coinbase txids + assert_equal(len(self.server.blockhashes), self.numblocks) + assert_equal(len(self.server.txids), self.numblocks) + + # verify that each block has the correct coinbase txid + for i in xrange(0, self.numblocks): + height = baseheight + i + 1 + blockhash = self.nodes[0].getblockhash(height) + assert_equal(blockhash, self.server.blockhashes[i]) + resp = self.nodes[0].getblock(blockhash) + coinbase = resp["tx"][0] + assert_equal(coinbase, self.server.txids[i]) + + +if __name__ == '__main__': + ProtonTest().main() diff --git a/src/Makefile.am b/src/Makefile.am index 33c1fba2d..e2ce181b1 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -55,6 +55,9 @@ endif if ENABLE_ZMQ EXTRA_LIBRARIES += libbitcoin_zmq.a endif +if ENABLE_PROTON +EXTRA_LIBRARIES += libbitcoin_proton.a +endif if BUILD_BITCOIN_LIBS lib_LTLIBRARIES = libzcashconsensus.la @@ -92,6 +95,11 @@ BITCOIN_CORE_H = \ addrman.h \ alert.h \ amount.h \ + amqp/amqpabstractnotifier.h \ + amqp/amqpconfig.h \ + amqp/amqpnotificationinterface.h \ + amqp/amqppublishnotifier.h \ + amqp/amqpsender.h \ arith_uint256.h \ asyncrpcoperation.h \ asyncrpcqueue.h \ @@ -243,6 +251,15 @@ libbitcoin_zmq_a_SOURCES = \ zmq/zmqpublishnotifier.cpp endif +if ENABLE_PROTON +LIBBITCOIN_PROTON=libbitcoin_proton.a + +libbitcoin_proton_a_CPPFLAGS = $(BITCOIN_INCLUDES) +libbitcoin_proton_a_SOURCES = \ + amqp/amqpabstractnotifier.cpp \ + amqp/amqpnotificationinterface.cpp \ + amqp/amqppublishnotifier.cpp +endif # wallet: zcashd, but only linked when wallet enabled libbitcoin_wallet_a_CPPFLAGS = $(BITCOIN_INCLUDES) @@ -401,6 +418,10 @@ zcashd_LDADD += \ $(LIBBITCOIN_CRYPTO) \ $(LIBZCASH_LIBS) +if ENABLE_PROTON +zcashd_LDADD += $(LIBBITCOIN_PROTON) $(PROTON_LIBS) +endif + # bitcoin-cli binary # zcash_cli_SOURCES = bitcoin-cli.cpp zcash_cli_CPPFLAGS = $(BITCOIN_INCLUDES) $(EVENT_CFLAGS) diff --git a/src/Makefile.gtest.include b/src/Makefile.gtest.include index 3752e0d48..471ecd008 100644 --- a/src/Makefile.gtest.include +++ b/src/Makefile.gtest.include @@ -53,6 +53,11 @@ endif zcash_gtest_LDADD += $(LIBZCASH_CONSENSUS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(LIBZCASH) $(LIBZCASH_LIBS) +if ENABLE_PROTON +zcash_gtest_LDADD += $(LIBBITCOIN_PROTON) $(PROTON_LIBS) +endif + + zcash_gtest_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) -static zcash-gtest_check: zcash-gtest FORCE diff --git a/src/Makefile.test.include b/src/Makefile.test.include index 7de8c392f..10cecd59b 100644 --- a/src/Makefile.test.include +++ b/src/Makefile.test.include @@ -112,6 +112,10 @@ if ENABLE_ZMQ test_test_bitcoin_LDADD += $(ZMQ_LIBS) endif +if ENABLE_PROTON +test_test_bitcoin_LDADD += $(PROTON_LIBS) +endif + nodist_test_test_bitcoin_SOURCES = $(GENERATED_TEST_FILES) $(BITCOIN_TESTS): $(GENERATED_TEST_FILES) diff --git a/src/amqp/amqpabstractnotifier.cpp b/src/amqp/amqpabstractnotifier.cpp new file mode 100644 index 000000000..57686ef1d --- /dev/null +++ b/src/amqp/amqpabstractnotifier.cpp @@ -0,0 +1,21 @@ +// Copyright (c) 2017 The Zcash developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "amqpabstractnotifier.h" +#include "util.h" + + +AMQPAbstractNotifier::~AMQPAbstractNotifier() +{ +} + +bool AMQPAbstractNotifier::NotifyBlock(const CBlockIndex * /*CBlockIndex*/) +{ + return true; +} + +bool AMQPAbstractNotifier::NotifyTransaction(const CTransaction &/*transaction*/) +{ + return true; +} diff --git a/src/amqp/amqpabstractnotifier.h b/src/amqp/amqpabstractnotifier.h new file mode 100644 index 000000000..c993a2b3e --- /dev/null +++ b/src/amqp/amqpabstractnotifier.h @@ -0,0 +1,43 @@ +// Copyright (c) 2017 The Zcash developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef ZCASH_AMQP_AMQPABSTRACTNOTIFIER_H +#define ZCASH_AMQP_AMQPABSTRACTNOTIFIER_H + +#include "amqpconfig.h" + +class CBlockIndex; +class AMQPAbstractNotifier; + +typedef AMQPAbstractNotifier* (*AMQPNotifierFactory)(); + +class AMQPAbstractNotifier +{ +public: + AMQPAbstractNotifier() { } + virtual ~AMQPAbstractNotifier(); + + template + static AMQPAbstractNotifier* Create() + { + return new T(); + } + + std::string GetType() const { return type; } + void SetType(const std::string &t) { type = t; } + std::string GetAddress() const { return address; } + void SetAddress(const std::string &a) { address = a; } + + virtual bool Initialize() = 0; + virtual void Shutdown() = 0; + + virtual bool NotifyBlock(const CBlockIndex *pindex); + virtual bool NotifyTransaction(const CTransaction &transaction); + +protected: + std::string type; + std::string address; +}; + +#endif // ZCASH_AMQP_AMQPABSTRACTNOTIFIER_H diff --git a/src/amqp/amqpconfig.h b/src/amqp/amqpconfig.h new file mode 100644 index 000000000..dcc5f7709 --- /dev/null +++ b/src/amqp/amqpconfig.h @@ -0,0 +1,33 @@ +// Copyright (c) 2017 The Zcash developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef ZCASH_AMQP_AMQPCONFIG_H +#define ZCASH_AMQP_AMQPCONFIG_H + +#if defined(HAVE_CONFIG_H) +#include "config/bitcoin-config.h" +#endif + +#include +#include + +#if ENABLE_PROTON +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#endif + +#include "primitives/block.h" +#include "primitives/transaction.h" + +#endif // ZCASH_AMQP_AMQPCONFIG_H diff --git a/src/amqp/amqpnotificationinterface.cpp b/src/amqp/amqpnotificationinterface.cpp new file mode 100644 index 000000000..66f5398ca --- /dev/null +++ b/src/amqp/amqpnotificationinterface.cpp @@ -0,0 +1,136 @@ +// Copyright (c) 2017 The Zcash developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "amqpnotificationinterface.h" +#include "amqppublishnotifier.h" + +#include "version.h" +#include "main.h" +#include "streams.h" +#include "util.h" + +// AMQP 1.0 Support +// +// The boost::signals2 signals and slot system is thread safe, so CValidationInterface listeners +// can be invoked from any thread. +// +// Currently signals are fired from main.cpp so the callbacks should be invoked on the same thread. +// It should be safe to share objects responsible for sending, as they should not be run concurrently +// across different threads. +// +// Developers should be mindful of where notifications are fired to avoid potential race conditions. +// For example, different signals targeting the same address could be fired from different threads +// in different parts of the system around the same time. +// +// Like the ZMQ notification interface, if a notifier fails to send a message, the notifier is shut down. +// + +AMQPNotificationInterface::AMQPNotificationInterface() +{ +} + +AMQPNotificationInterface::~AMQPNotificationInterface() +{ + Shutdown(); + + for (std::list::iterator i = notifiers.begin(); i != notifiers.end(); ++i) { + delete *i; + } +} + +AMQPNotificationInterface* AMQPNotificationInterface::CreateWithArguments(const std::map &args) +{ + AMQPNotificationInterface* notificationInterface = nullptr; + std::map factories; + std::list notifiers; + + factories["pubhashblock"] = AMQPAbstractNotifier::Create; + factories["pubhashtx"] = AMQPAbstractNotifier::Create; + factories["pubrawblock"] = AMQPAbstractNotifier::Create; + factories["pubrawtx"] = AMQPAbstractNotifier::Create; + + for (std::map::const_iterator i=factories.begin(); i!=factories.end(); ++i) { + std::map::const_iterator j = args.find("-amqp" + i->first); + if (j!=args.end()) { + AMQPNotifierFactory factory = i->second; + std::string address = j->second; + AMQPAbstractNotifier *notifier = factory(); + notifier->SetType(i->first); + notifier->SetAddress(address); + notifiers.push_back(notifier); + } + } + + if (!notifiers.empty()) { + notificationInterface = new AMQPNotificationInterface(); + notificationInterface->notifiers = notifiers; + + if (!notificationInterface->Initialize()) { + delete notificationInterface; + notificationInterface = nullptr; + } + } + + return notificationInterface; +} + +// Called at startup to conditionally set up +bool AMQPNotificationInterface::Initialize() +{ + LogPrint("amqp", "amqp: Initialize notification interface\n"); + + std::list::iterator i = notifiers.begin(); + for (; i != notifiers.end(); ++i) { + AMQPAbstractNotifier *notifier = *i; + if (notifier->Initialize()) { + LogPrint("amqp", "amqp: Notifier %s ready (address = %s)\n", notifier->GetType(), notifier->GetAddress()); + } else { + LogPrint("amqp", "amqp: Notifier %s failed (address = %s)\n", notifier->GetType(), notifier->GetAddress()); + break; + } + } + + if (i != notifiers.end()) { + return false; + } + + return true; +} + +// Called during shutdown sequence +void AMQPNotificationInterface::Shutdown() +{ + LogPrint("amqp", "amqp: Shutdown notification interface\n"); + + for (std::list::iterator i = notifiers.begin(); i != notifiers.end(); ++i) { + AMQPAbstractNotifier *notifier = *i; + notifier->Shutdown(); + } +} + +void AMQPNotificationInterface::UpdatedBlockTip(const CBlockIndex *pindex) +{ + for (std::list::iterator i = notifiers.begin(); i != notifiers.end(); ) { + AMQPAbstractNotifier *notifier = *i; + if (notifier->NotifyBlock(pindex)) { + i++; + } else { + notifier->Shutdown(); + i = notifiers.erase(i); + } + } +} + +void AMQPNotificationInterface::SyncTransaction(const CTransaction &tx, const CBlock *pblock) +{ + for (std::list::iterator i = notifiers.begin(); i != notifiers.end(); ) { + AMQPAbstractNotifier *notifier = *i; + if (notifier->NotifyTransaction(tx)) { + i++; + } else { + notifier->Shutdown(); + i = notifiers.erase(i); + } + } +} diff --git a/src/amqp/amqpnotificationinterface.h b/src/amqp/amqpnotificationinterface.h new file mode 100644 index 000000000..0c07ce235 --- /dev/null +++ b/src/amqp/amqpnotificationinterface.h @@ -0,0 +1,36 @@ +// Copyright (c) 2017 The Zcash developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef ZCASH_AMQP_AMQPNOTIFICATIONINTERFACE_H +#define ZCASH_AMQP_AMQPNOTIFICATIONINTERFACE_H + +#include "validationinterface.h" +#include +#include + +class CBlockIndex; +class AMQPAbstractNotifier; + +class AMQPNotificationInterface : public CValidationInterface +{ +public: + virtual ~AMQPNotificationInterface(); + + static AMQPNotificationInterface* CreateWithArguments(const std::map &args); + +protected: + bool Initialize(); + void Shutdown(); + + // CValidationInterface + void SyncTransaction(const CTransaction &tx, const CBlock *pblock); + void UpdatedBlockTip(const CBlockIndex *pindex); + +private: + AMQPNotificationInterface(); + + std::list notifiers; +}; + +#endif // ZCASH_AMQP_AMQPNOTIFICATIONINTERFACE_H diff --git a/src/amqp/amqppublishnotifier.cpp b/src/amqp/amqppublishnotifier.cpp new file mode 100644 index 000000000..589eb151f --- /dev/null +++ b/src/amqp/amqppublishnotifier.cpp @@ -0,0 +1,177 @@ +// Copyright (c) 2017 The Zcash developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "amqppublishnotifier.h" +#include "main.h" +#include "util.h" + +#include "amqpsender.h" + +#include +#include + +static std::multimap mapPublishNotifiers; + +static const char *MSG_HASHBLOCK = "hashblock"; +static const char *MSG_HASHTX = "hashtx"; +static const char *MSG_RAWBLOCK = "rawblock"; +static const char *MSG_RAWTX = "rawtx"; + +// Invoke this method from a new thread to run the proton container event loop. +void AMQPAbstractPublishNotifier::SpawnProtonContainer() +{ + try { + proton::default_container(*handler_).run(); + } + catch (const proton::error_condition &e) { + LogPrint("amqp", "amqp: container error: %s\n", e.what()); + } + catch (const std::runtime_error &e) { + LogPrint("amqp", "amqp: runtime error: %s\n", e.what()); + } + catch (const std::exception &e) { + LogPrint("amqp", "amqp: exception: %s\n", e.what()); + } + catch (...) { + LogPrint("amqp", "amqp: unknown error\n"); + } + handler_->terminate(); +} + +bool AMQPAbstractPublishNotifier::Initialize() +{ + std::multimap::iterator i = mapPublishNotifiers.find(address); + + if (i == mapPublishNotifiers.end()) { + try { + handler_ = std::make_shared(address); + thread_ = std::make_shared(&AMQPAbstractPublishNotifier::SpawnProtonContainer, this); + } + catch (std::exception &e) { + LogPrint("amqp", "amqp: initialization error: %s\n", e.what()); + return false; + } + mapPublishNotifiers.insert(std::make_pair(address, this)); + } else { + // copy the shared ptrs to the message handler and the thread where the proton container is running + handler_ = i->second->handler_; + thread_ = i->second->thread_; + mapPublishNotifiers.insert(std::make_pair(address, this)); + } + + return true; +} + + +void AMQPAbstractPublishNotifier::Shutdown() +{ + LogPrint("amqp", "amqp: Shutdown notifier %s at %s\n", GetType(), GetAddress()); + + int count = mapPublishNotifiers.count(address); + + // remove this notifier from the list of publishers using this address + typedef std::multimap::iterator iterator; + std::pair iterpair = mapPublishNotifiers.equal_range(address); + + for (iterator it = iterpair.first; it != iterpair.second; ++it) { + if (it->second == this) { + mapPublishNotifiers.erase(it); + break; + } + } + + // terminate the connection if this is the last publisher using this address + if (count == 1) { + handler_->terminate(); + if (thread_.get() != nullptr) { + if (thread_->joinable()) { + thread_->join(); + } + } + } +} + + +bool AMQPAbstractPublishNotifier::SendMessage(const char *command, const void* data, size_t size) +{ + try { + proton::binary content; + const char *p = (const char *)data; + content.assign(p, p + size); + + proton::message message(content); + message.subject(std::string(command)); + proton::message::property_map & props = message.properties(); + props.put("x-opt-sequence-number", sequence_); + handler_->publish(message); + + } catch (proton::error_condition &e) { + LogPrint("amqp", "amqp: error : %s\n", e.what()); + return false; + } + catch (const std::runtime_error &e) { + LogPrint("amqp", "amqp: runtime error: %s\n", e.what()); + return false; + } + catch (const std::exception &e) { + LogPrint("amqp", "amqp: exception: %s\n", e.what()); + return false; + } + catch (...) { + LogPrint("amqp", "amqp: unknown error\n"); + return false; + } + + sequence_++; + + return true; +} + +bool AMQPPublishHashBlockNotifier::NotifyBlock(const CBlockIndex *pindex) +{ + uint256 hash = pindex->GetBlockHash(); + LogPrint("amqp", "amqp: Publish hashblock %s\n", hash.GetHex()); + char data[32]; + for (unsigned int i = 0; i < 32; i++) + data[31 - i] = hash.begin()[i]; + return SendMessage(MSG_HASHBLOCK, data, 32); +} + +bool AMQPPublishHashTransactionNotifier::NotifyTransaction(const CTransaction &transaction) +{ + uint256 hash = transaction.GetHash(); + LogPrint("amqp", "amqp: Publish hashtx %s\n", hash.GetHex()); + char data[32]; + for (unsigned int i = 0; i < 32; i++) + data[31 - i] = hash.begin()[i]; + return SendMessage(MSG_HASHTX, data, 32); +} + +bool AMQPPublishRawBlockNotifier::NotifyBlock(const CBlockIndex *pindex) +{ + LogPrint("amqp", "amqp: Publish rawblock %s\n", pindex->GetBlockHash().GetHex()); + + CDataStream ss(SER_NETWORK, PROTOCOL_VERSION); + { + LOCK(cs_main); + CBlock block; + if(!ReadBlockFromDisk(block, pindex)) { + LogPrint("amqp", "amqp: Can't read block from disk"); + return false; + } + + ss << block; + } + + return SendMessage(MSG_RAWBLOCK, &(*ss.begin()), ss.size()); +} + +bool AMQPPublishRawTransactionNotifier::NotifyTransaction(const CTransaction &transaction) +{ + uint256 hash = transaction.GetHash(); + LogPrint("amqp", "amqp: Publish rawtx %s\n", hash.GetHex()); + CDataStream ss(SER_NETWORK, PROTOCOL_VERSION); + ss << transaction; + return SendMessage(MSG_RAWTX, &(*ss.begin()), ss.size()); +} diff --git a/src/amqp/amqppublishnotifier.h b/src/amqp/amqppublishnotifier.h new file mode 100644 index 000000000..08b3aba08 --- /dev/null +++ b/src/amqp/amqppublishnotifier.h @@ -0,0 +1,56 @@ +// Copyright (c) 2017 The Zcash developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef ZCASH_AMQP_AMQPPUBLISHNOTIFIER_H +#define ZCASH_AMQP_AMQPPUBLISHNOTIFIER_H + +#include "amqpabstractnotifier.h" +#include "amqpconfig.h" +#include "amqpsender.h" + +#include +#include + +class CBlockIndex; + +class AMQPAbstractPublishNotifier : public AMQPAbstractNotifier +{ +private: + uint64_t sequence_; // memory only, per notifier instance: upcounting message sequence number + + std::shared_ptr thread_; // proton container thread, may be shared between notifiers + std::shared_ptr handler_; // proton container message handler, may be shared between notifiers + +public: + bool SendMessage(const char *command, const void* data, size_t size); + bool Initialize(); + void Shutdown(); + void SpawnProtonContainer(); +}; + +class AMQPPublishHashBlockNotifier : public AMQPAbstractPublishNotifier +{ +public: + bool NotifyBlock(const CBlockIndex *pindex); +}; + +class AMQPPublishHashTransactionNotifier : public AMQPAbstractPublishNotifier +{ +public: + bool NotifyTransaction(const CTransaction &transaction); +}; + +class AMQPPublishRawBlockNotifier : public AMQPAbstractPublishNotifier +{ +public: + bool NotifyBlock(const CBlockIndex *pindex); +}; + +class AMQPPublishRawTransactionNotifier : public AMQPAbstractPublishNotifier +{ +public: + bool NotifyTransaction(const CTransaction &transaction); +}; + +#endif // ZCASH_AMQP_AMQPPUBLISHNOTIFIER_H diff --git a/src/amqp/amqpsender.h b/src/amqp/amqpsender.h new file mode 100644 index 000000000..7fa85d89c --- /dev/null +++ b/src/amqp/amqpsender.h @@ -0,0 +1,115 @@ +// Copyright (c) 2017 The Zcash developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef ZCASH_AMQP_AMQPSENDER_H +#define ZCASH_AMQP_AMQPSENDER_H + +#include "amqpconfig.h" + +#include +#include +#include +#include + +class AMQPSender : public proton::messaging_handler { + private: + std::deque messages_; + proton::url url_; + proton::connection conn_; + proton::sender sender_; + std::mutex lock_; + std::atomic terminated_ = {false}; + + public: + + AMQPSender(const std::string& url) : url_(url) {} + + // Callback to initialize the container when run() is invoked + void on_container_start(proton::container& c) override { + proton::duration t(10000); // milliseconds + proton::connection_options opts = proton::connection_options().idle_timeout(t); + conn_ = c.connect(url_, opts); + sender_ = conn_.open_sender(url_.path()); + } + + // Remote end signals when the local end can send (i.e. has credit) + void on_sendable(proton::sender &s) override { + dispatch(); + } + + // Publish message by adding to queue and trying to dispatch it + void publish(const proton::message &m) { + add_message(m); + dispatch(); + } + + // Add message to queue + void add_message(const proton::message &m) { + std::lock_guard guard(lock_); + messages_.push_back(m); + } + + // Send messages in queue + void dispatch() { + std::lock_guard guard(lock_); + + if (isTerminated()) { + throw std::runtime_error("amqp connection was terminated"); + } + + if (!conn_.active()) { + throw std::runtime_error("amqp connection is not active"); + } + + while (messages_.size() > 0) { + if (sender_.credit()) { + const proton::message& m = messages_.front(); + sender_.send(m); + messages_.pop_front(); + } else { + break; + } + } + } + + // Close connection to remote end. Container event-loop, by default, will auto-stop. + void terminate() { + std::lock_guard guard(lock_); + conn_.close(); + terminated_.store(true); + } + + bool isTerminated() const { + return terminated_.load(); + } + + void on_transport_error(proton::transport &t) override { + t.connection().close(); + throw t.error(); + } + + void on_connection_error(proton::connection &c) override { + c.close(); + throw c.error(); + } + + void on_session_error(proton::session &s) override { + s.connection().close(); + throw s.error(); + } + + void on_receiver_error(proton::receiver &r) override { + r.connection().close(); + throw r.error(); + } + + void on_sender_error(proton::sender &s) override { + s.connection().close(); + throw s.error(); + } + +}; + + +#endif //ZCASH_AMQP_AMQPSENDER_H diff --git a/src/init.cpp b/src/init.cpp index 66f7005eb..f8a684bc3 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -58,6 +58,10 @@ #include "zmq/zmqnotificationinterface.h" #endif +#if ENABLE_PROTON +#include "amqp/amqpnotificationinterface.h" +#endif + using namespace std; extern void ThreadSendAlert(); @@ -73,6 +77,10 @@ bool fFeeEstimatesInitialized = false; static CZMQNotificationInterface* pzmqNotificationInterface = NULL; #endif +#if ENABLE_PROTON +static AMQPNotificationInterface* pAMQPNotificationInterface = NULL; +#endif + #ifdef WIN32 // Win32 LevelDB doesn't use file descriptors, and the ones used for // accessing block files don't count towards the fd_set size limit @@ -233,6 +241,14 @@ void Shutdown() } #endif +#if ENABLE_PROTON + if (pAMQPNotificationInterface) { + UnregisterValidationInterface(pAMQPNotificationInterface); + delete pAMQPNotificationInterface; + pAMQPNotificationInterface = NULL; + } +#endif + #ifndef WIN32 try { boost::filesystem::remove(GetPidFile()); @@ -408,6 +424,14 @@ std::string HelpMessage(HelpMessageMode mode) strUsage += HelpMessageOpt("-zmqpubrawtx=
", _("Enable publish raw transaction in
")); #endif +#if ENABLE_PROTON + strUsage += HelpMessageGroup(_("AMQP 1.0 notification options:")); + strUsage += HelpMessageOpt("-amqppubhashblock=
", _("Enable publish hash block in
")); + strUsage += HelpMessageOpt("-amqppubhashtx=
", _("Enable publish hash transaction in
")); + strUsage += HelpMessageOpt("-amqppubrawblock=
", _("Enable publish raw block in
")); + strUsage += HelpMessageOpt("-amqppubrawtx=
", _("Enable publish raw transaction in
")); +#endif + strUsage += HelpMessageGroup(_("Debugging/Testing options:")); if (showDebug) { @@ -1230,6 +1254,21 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) } #endif +#if ENABLE_PROTON + pAMQPNotificationInterface = AMQPNotificationInterface::CreateWithArguments(mapArgs); + + if (pAMQPNotificationInterface) { + + // AMQP support is currently an experimental feature, so fail if user configured AMQP notifications + // without enabling experimental features. + if (!fExperimentalMode) { + return InitError(_("AMQP support requires -experimentalfeatures.")); + } + + RegisterValidationInterface(pAMQPNotificationInterface); + } +#endif + // ********************************************************* Step 7: load block chain fReindex = GetBoolArg("-reindex", false); From f493d3e044189db0c77793c614055c9c9b1715fc Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 25 Mar 2017 09:03:22 -0700 Subject: [PATCH 0005/1062] Add --disable-proton flag to build.sh. Proton has build/linker issues with gcc 4.9.2 and requires gcc 5.x. --- depends/Makefile | 3 ++- depends/packages/packages.mk | 3 ++- zcutil/build.sh | 18 +++++++++++++++--- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/depends/Makefile b/depends/Makefile index d23002a5e..90cb83394 100644 --- a/depends/Makefile +++ b/depends/Makefile @@ -75,8 +75,9 @@ include packages/packages.mk rust_packages_$(NO_RUST) = $(rust_packages) wallet_packages_$(NO_WALLET) = $(wallet_packages) upnp_packages_$(NO_UPNP) = $(upnp_packages) +proton_packages_$(NO_PROTON) = $(proton_packages) -packages += $($(host_arch)_$(host_os)_packages) $($(host_os)_packages) $(rust_packages_) $(wallet_packages_) $(upnp_packages_) +packages += $($(host_arch)_$(host_os)_packages) $($(host_os)_packages) $(rust_packages_) $(proton_packages_) $(wallet_packages_) $(upnp_packages_) native_packages += $($(host_arch)_$(host_os)_native_packages) $($(host_os)_native_packages) all_packages = $(packages) $(native_packages) diff --git a/depends/packages/packages.mk b/depends/packages/packages.mk index 33f45aea3..5e45dbe98 100644 --- a/depends/packages/packages.mk +++ b/depends/packages/packages.mk @@ -1,6 +1,7 @@ rust_packages := rust librustzcash +proton_packages := proton zcash_packages := libsnark libgmp libsodium -packages := boost openssl libevent zeromq $(zcash_packages) googletest googlemock proton +packages := boost openssl libevent zeromq $(zcash_packages) googletest googlemock native_packages := native_ccache wallet_packages=bdb diff --git a/zcutil/build.sh b/zcutil/build.sh index 2e3837f3a..71cff726b 100755 --- a/zcutil/build.sh +++ b/zcutil/build.sh @@ -33,7 +33,7 @@ Usage: $0 --help Show this help message and exit. -$0 [ --enable-lcov || --disable-tests ] [ --disable-mining ] [ --disable-rust ] [ MAKEARGS... ] +$0 [ --enable-lcov || --disable-tests ] [ --disable-mining ] [ --disable-rust ] [ --disable-proton ] [ MAKEARGS... ] Build Zcash and most of its transitive dependencies from source. MAKEARGS are applied to both dependencies and Zcash itself. @@ -46,6 +46,10 @@ $0 [ --enable-lcov || --disable-tests ] [ --disable-mining ] [ --disable-rust ] If --disable-rust is passed, Zcash is configured to not build any Rust language assets. It must be passed after mining/test arguments, if present. + + If --disable-proton is passed, Zcash is configured to not build the Apache + Qpid Proton library required for AMQP support. It must be passed after the + test arguments, if present. EOF exit 0 fi @@ -84,9 +88,17 @@ then shift fi +# If --disable-proton is the next argument, disable building Proton code: +PROTON_ARG='' +if [ "x${1:-}" = 'x--disable-proton' ] +then + PROTON_ARG='--enable-proton=no' + shift +fi + PREFIX="$(pwd)/depends/$BUILD/" -HOST="$HOST" BUILD="$BUILD" NO_RUST="$RUST_ARG" "$MAKE" "$@" -C ./depends/ V=1 +HOST="$HOST" BUILD="$BUILD" NO_RUST="$RUST_ARG" NO_PROTON="$PROTON_ARG" "$MAKE" "$@" -C ./depends/ V=1 ./autogen.sh -CC="$CC" CXX="$CXX" ./configure --prefix="${PREFIX}" --host="$HOST" --build="$BUILD" "$RUST_ARG" "$HARDENING_ARG" "$LCOV_ARG" "$TEST_ARG" "$MINING_ARG" CXXFLAGS='-fwrapv -fno-strict-aliasing -Werror -g' +CC="$CC" CXX="$CXX" ./configure --prefix="${PREFIX}" --host="$HOST" --build="$BUILD" "$RUST_ARG" "$HARDENING_ARG" "$LCOV_ARG" "$TEST_ARG" "$MINING_ARG" "$PROTON_ARG" CXXFLAGS='-fwrapv -fno-strict-aliasing -Werror -g' "$MAKE" "$@" V=1 From da1357e6cce51c9ed3cd1c1f0c8e5593fd5b3a22 Mon Sep 17 00:00:00 2001 From: "Wladimir J. van der Laan" Date: Wed, 1 Jul 2015 17:38:15 +0200 Subject: [PATCH 0006/1062] Use real number of cores for default -par, ignore virtual cores To determine the default for `-par`, the number of script verification threads, use [boost::thread::physical_concurrency()](http://www.boost.org/doc/libs/1_58_0/doc/html/thread/thread_management.html#thread.thread_management.thread.physical_concurrency) which counts only physical cores, not virtual cores. Virtual cores are roughly a set of cached registers to avoid context switches while threading, they cannot actually perform work, so spawning a verification thread for them could even reduce efficiency and will put undue load on the system. Should fix issue #6358, as well as some other reported system overload issues, especially on Intel processors. The function was only introduced in boost 1.56, so provide a utility function `GetNumCores` to fall back for older Boost versions. --- src/init.cpp | 4 ++-- src/miner.cpp | 2 +- src/util.cpp | 10 ++++++++++ src/util.h | 7 +++++++ 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/init.cpp b/src/init.cpp index ec3553c46..5e133de9c 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -333,7 +333,7 @@ std::string HelpMessage(HelpMessageMode mode) strUsage += HelpMessageOpt("-loadblock=", _("Imports blocks from external blk000??.dat file") + " " + _("on startup")); strUsage += HelpMessageOpt("-maxorphantx=", strprintf(_("Keep at most unconnectable transactions in memory (default: %u)"), DEFAULT_MAX_ORPHAN_TRANSACTIONS)); strUsage += HelpMessageOpt("-par=", strprintf(_("Set the number of script verification threads (%u to %d, 0 = auto, <0 = leave that many cores free, default: %d)"), - -(int)boost::thread::hardware_concurrency(), MAX_SCRIPTCHECK_THREADS, DEFAULT_SCRIPTCHECK_THREADS)); + -GetNumCores(), MAX_SCRIPTCHECK_THREADS, DEFAULT_SCRIPTCHECK_THREADS)); #ifndef WIN32 strUsage += HelpMessageOpt("-pid=", strprintf(_("Specify pid file (default: %s)"), "zcashd.pid")); #endif @@ -901,7 +901,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) // -par=0 means autodetect, but nScriptCheckThreads==0 means no concurrency nScriptCheckThreads = GetArg("-par", DEFAULT_SCRIPTCHECK_THREADS); if (nScriptCheckThreads <= 0) - nScriptCheckThreads += boost::thread::hardware_concurrency(); + nScriptCheckThreads += GetNumCores(); if (nScriptCheckThreads <= 1) nScriptCheckThreads = 0; else if (nScriptCheckThreads > MAX_SCRIPTCHECK_THREADS) diff --git a/src/miner.cpp b/src/miner.cpp index e65b9c5f0..320262090 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -753,7 +753,7 @@ void GenerateBitcoins(bool fGenerate, int nThreads) if (Params().DefaultMinerThreads()) nThreads = Params().DefaultMinerThreads(); else - nThreads = boost::thread::hardware_concurrency(); + nThreads = GetNumCores(); } if (minerThreads != NULL) diff --git a/src/util.cpp b/src/util.cpp index 420ce043c..233ec322e 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -908,3 +908,13 @@ std::string LicenseInfo() FormatParagraph(_("This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.")) + "\n"; } + +int GetNumCores() +{ +#if BOOST_VERSION >= 105600 + return boost::thread::physical_concurrency(); +#else // Must fall back to hardware_concurrency, which unfortunately counts virtual cores + return boost::thread::hardware_concurrency(); +#endif +} + diff --git a/src/util.h b/src/util.h index 00c48582c..392ddff9c 100644 --- a/src/util.h +++ b/src/util.h @@ -219,6 +219,13 @@ std::string HelpMessageGroup(const std::string& message); */ std::string HelpMessageOpt(const std::string& option, const std::string& message); +/** + * Return the number of physical cores available on the current system. + * @note This does not count virtual cores, such as those provided by HyperThreading + * when boost is newer than 1.56. + */ +int GetNumCores(); + void SetThreadPriority(int nPriority); void RenameThread(const char* name); From 2854c4e366d2aa4f7377d037ef94c02d59cff31d Mon Sep 17 00:00:00 2001 From: "Wladimir J. van der Laan" Date: Fri, 3 Jul 2015 09:13:56 +0200 Subject: [PATCH 0007/1062] Remove ChainParams::DefaultMinerThreads No longer relevant after #5957. This hack existed because of another hack where the numthreads parameter, on regtest, doubled as how many blocks to generate. --- src/chainparams.cpp | 3 --- src/chainparams.h | 3 --- src/miner.cpp | 9 ++------- 3 files changed, 2 insertions(+), 13 deletions(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index ce71a3aaa..3a1691ee8 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -59,7 +59,6 @@ public: pchMessageStart[3] = 0x64; vAlertPubKey = ParseHex("04b7ecf0baa90495ceb4e4090f6b2fd37eec1e9c85fac68a487f3ce11589692e4a317479316ee814e066638e1db54e37a10689b70286e6315b1087b6615d179264"); nDefaultPort = 8233; - nMinerThreads = 0; nMaxTipAge = 24 * 60 * 60; nPruneAfterHeight = 100000; const size_t N = 200, K = 9; @@ -219,7 +218,6 @@ public: pchMessageStart[3] = 0xbf; vAlertPubKey = ParseHex("044e7a1553392325c871c5ace5d6ad73501c66f4c185d6b0453cf45dec5a1322e705c672ac1a27ef7cdaf588c10effdf50ed5f95f85f2f54a5f6159fca394ed0c6"); nDefaultPort = 18233; - nMinerThreads = 0; nPruneAfterHeight = 1000; //! Modify the testnet genesis block so the timestamp is valid for a later start. @@ -308,7 +306,6 @@ public: pchMessageStart[1] = 0xe8; pchMessageStart[2] = 0x3f; pchMessageStart[3] = 0x5f; - nMinerThreads = 1; nMaxTipAge = 24 * 60 * 60; const size_t N = 48, K = 5; BOOST_STATIC_ASSERT(equihash_parameters_acceptable(N, K)); diff --git a/src/chainparams.h b/src/chainparams.h index dc7cbc383..a1de7b493 100644 --- a/src/chainparams.h +++ b/src/chainparams.h @@ -53,8 +53,6 @@ public: const std::vector& AlertKey() const { return vAlertPubKey; } int GetDefaultPort() const { return nDefaultPort; } - /** Used if GenerateBitcoins is called with a negative number of threads */ - int DefaultMinerThreads() const { return nMinerThreads; } const CBlock& GenesisBlock() const { return genesis; } /** Make miner wait to have peers to avoid wasting work */ bool MiningRequiresPeers() const { return fMiningRequiresPeers; } @@ -91,7 +89,6 @@ protected: //! Raw pub key bytes for the broadcast alert signing key. std::vector vAlertPubKey; int nDefaultPort = 0; - int nMinerThreads = 0; long nMaxTipAge = 0; uint64_t nPruneAfterHeight = 0; unsigned int nEquihashN = 0; diff --git a/src/miner.cpp b/src/miner.cpp index 320262090..3434a0d7c 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -748,13 +748,8 @@ void GenerateBitcoins(bool fGenerate, int nThreads) { static boost::thread_group* minerThreads = NULL; - if (nThreads < 0) { - // In regtest threads defaults to 1 - if (Params().DefaultMinerThreads()) - nThreads = Params().DefaultMinerThreads(); - else - nThreads = GetNumCores(); - } + if (nThreads < 0) + nThreads = GetNumCores(); if (minerThreads != NULL) { From 0d0265fd11b8acbbebbbb8d1f6e9668c4ff3c41d Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 14 Feb 2017 22:06:35 +0000 Subject: [PATCH 0008/1062] Use AtomicTimer for metrics screen thread count --- src/metrics.cpp | 17 ++++++++--------- src/metrics.h | 2 ++ 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/metrics.cpp b/src/metrics.cpp index fd8000548..db0d1965d 100644 --- a/src/metrics.cpp +++ b/src/metrics.cpp @@ -45,6 +45,12 @@ bool AtomicTimer::running() return threads > 0; } +uint64_t AtomicTimer::threadCount() +{ + std::unique_lock lock(mtx); + return threads; +} + double AtomicTimer::rate(const AtomicCounter& count) { std::unique_lock lock(mtx); @@ -191,15 +197,8 @@ int printMiningStatus(bool mining) int lines = 1; if (mining) { - int nThreads = GetArg("-genproclimit", 1); - if (nThreads < 0) { - // In regtest threads defaults to 1 - if (Params().DefaultMinerThreads()) - nThreads = Params().DefaultMinerThreads(); - else - nThreads = boost::thread::hardware_concurrency(); - } - if (miningTimer.running()) { + auto nThreads = miningTimer.threadCount(); + if (nThreads > 0) { std::cout << strprintf(_("You are mining with the %s solver on %d threads."), GetArg("-equihashsolver", "default"), nThreads) << std::endl; } else { diff --git a/src/metrics.h b/src/metrics.h index 3e830f823..701306a4a 100644 --- a/src/metrics.h +++ b/src/metrics.h @@ -49,6 +49,8 @@ public: bool running(); + uint64_t threadCount(); + double rate(const AtomicCounter& count); }; From 338ff45787e6ad240bbd83654e34ff159fd4780e Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 7 Apr 2017 13:20:13 +1200 Subject: [PATCH 0009/1062] Use a larger -rpcclienttimeout for slow performance measurements Closes #2238. --- qa/zcash/performance-measurements.sh | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/qa/zcash/performance-measurements.sh b/qa/zcash/performance-measurements.sh index 2c79e04ef..2b6abee3e 100755 --- a/qa/zcash/performance-measurements.sh +++ b/qa/zcash/performance-measurements.sh @@ -8,6 +8,16 @@ function zcash_rpc { ./src/zcash-cli -datadir="$DATADIR" -rpcwait -rpcuser=user -rpcpassword=password -rpcport=5983 "$@" } +function zcash_rpc_slow { + # Timeout of 1 hour + ./src/zcash-cli -datadir="$DATADIR" -rpcwait -rpcuser=user -rpcpassword=password -rpcport=5983 -rpcclienttimeout=3600 "$@" +} + +function zcash_rpc_veryslow { + # Timeout of 2.5 hours + ./src/zcash-cli -datadir="$DATADIR" -rpcwait -rpcuser=user -rpcpassword=password -rpcport=5983 -rpcclienttimeout=9000 "$@" +} + function zcashd_generate { zcash_rpc generate 101 > /dev/null } @@ -83,7 +93,7 @@ case "$1" in zcash_rpc zcbenchmark verifyjoinsplit 1000 "\"$RAWJOINSPLIT\"" ;; solveequihash) - zcash_rpc zcbenchmark solveequihash 50 "${@:3}" + zcash_rpc_slow zcbenchmark solveequihash 50 "${@:3}" ;; verifyequihash) zcash_rpc zcbenchmark verifyequihash 1000 @@ -114,13 +124,13 @@ case "$1" in zcash_rpc zcbenchmark parameterloading 1 ;; createjoinsplit) - zcash_rpc zcbenchmark createjoinsplit 1 "${@:3}" + zcash_rpc_slow zcbenchmark createjoinsplit 1 "${@:3}" ;; verifyjoinsplit) zcash_rpc zcbenchmark verifyjoinsplit 1 "\"$RAWJOINSPLIT\"" ;; solveequihash) - zcash_rpc zcbenchmark solveequihash 1 "${@:3}" + zcash_rpc_slow zcbenchmark solveequihash 1 "${@:3}" ;; verifyequihash) zcash_rpc zcbenchmark verifyequihash 1 @@ -149,13 +159,13 @@ case "$1" in zcash_rpc zcbenchmark parameterloading 1 ;; createjoinsplit) - zcash_rpc zcbenchmark createjoinsplit 1 "${@:3}" + zcash_rpc_veryslow zcbenchmark createjoinsplit 1 "${@:3}" ;; verifyjoinsplit) zcash_rpc zcbenchmark verifyjoinsplit 1 "\"$RAWJOINSPLIT\"" ;; solveequihash) - zcash_rpc zcbenchmark solveequihash 1 "${@:3}" + zcash_rpc_veryslow zcbenchmark solveequihash 1 "${@:3}" ;; verifyequihash) zcash_rpc zcbenchmark verifyequihash 1 From 5a49c929ddccb8a6ca1ac744cefa6af7817ea3de Mon Sep 17 00:00:00 2001 From: Daira Hopwood Date: Sun, 9 Apr 2017 13:19:48 +0100 Subject: [PATCH 0010/1062] Delete old protocol version constants and simplify code that used them. fixes #2244 Signed-off-by: Daira Hopwood --- src/main.cpp | 53 +++++++++++++++++--------------------------------- src/net.cpp | 2 +- src/protocol.h | 3 +-- src/version.h | 19 +----------------- 4 files changed, 21 insertions(+), 56 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index ab91ee41e..f4cef9370 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4412,11 +4412,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, } // Get recent addresses - if (pfrom->fOneShot || pfrom->nVersion >= CADDR_TIME_VERSION || addrman.size() < 1000) - { - pfrom->PushMessage("getaddr"); - pfrom->fGetAddr = true; - } + pfrom->PushMessage("getaddr"); + pfrom->fGetAddr = true; addrman.Good(pfrom->addr); } else { if (((CNetAddr)pfrom->addr) == (CNetAddr)addrFrom) @@ -4475,9 +4472,6 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, vector vAddr; vRecv >> vAddr; - // Don't want addr from older versions unless seeding - if (pfrom->nVersion < CADDR_TIME_VERSION && addrman.size() > 1000) - return true; if (vAddr.size() > 1000) { Misbehaving(pfrom->GetId(), 20); @@ -4512,8 +4506,6 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, multimap mapMix; BOOST_FOREACH(CNode* pnode, vNodes) { - if (pnode->nVersion < CADDR_TIME_VERSION) - continue; unsigned int nPointer; memcpy(&nPointer, &pnode, sizeof(nPointer)); uint256 hashKey = ArithToUint256(UintToArith256(hashRand) ^ nPointer); @@ -4964,23 +4956,20 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, else if (strCommand == "ping") { - if (pfrom->nVersion > BIP0031_VERSION) - { - uint64_t nonce = 0; - vRecv >> nonce; - // Echo the message back with the nonce. This allows for two useful features: - // - // 1) A remote node can quickly check if the connection is operational - // 2) Remote nodes can measure the latency of the network thread. If this node - // is overloaded it won't respond to pings quickly and the remote node can - // avoid sending us more work, like chain download requests. - // - // The nonce stops the remote getting confused between different pings: without - // it, if the remote node sends a ping once per second and this node takes 5 - // seconds to respond to each, the 5th ping the remote sends would appear to - // return very quickly. - pfrom->PushMessage("pong", nonce); - } + uint64_t nonce = 0; + vRecv >> nonce; + // Echo the message back with the nonce. This allows for two useful features: + // + // 1) A remote node can quickly check if the connection is operational + // 2) Remote nodes can measure the latency of the network thread. If this node + // is overloaded it won't respond to pings quickly and the remote node can + // avoid sending us more work, like chain download requests. + // + // The nonce stops the remote getting confused between different pings: without + // it, if the remote node sends a ping once per second and this node takes 5 + // seconds to respond to each, the 5th ping the remote sends would appear to + // return very quickly. + pfrom->PushMessage("pong", nonce); } @@ -5308,14 +5297,8 @@ bool SendMessages(CNode* pto, bool fSendTrickle) } pto->fPingQueued = false; pto->nPingUsecStart = GetTimeMicros(); - if (pto->nVersion > BIP0031_VERSION) { - pto->nPingNonceSent = nonce; - pto->PushMessage("ping", nonce); - } else { - // Peer is too old to support ping command with nonce, pong will never arrive. - pto->nPingNonceSent = 0; - pto->PushMessage("ping"); - } + pto->nPingNonceSent = nonce; + pto->PushMessage("ping", nonce); } TRY_LOCK(cs_main, lockMain); // Acquire cs_main for IsInitialBlockDownload() and CNodeState() diff --git a/src/net.cpp b/src/net.cpp index de624c72a..d49af2610 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -1194,7 +1194,7 @@ void ThreadSocketHandler() LogPrintf("socket sending timeout: %is\n", nTime - pnode->nLastSend); pnode->fDisconnect = true; } - else if (nTime - pnode->nLastRecv > (pnode->nVersion > BIP0031_VERSION ? TIMEOUT_INTERVAL : 90*60)) + else if (nTime - pnode->nLastRecv > TIMEOUT_INTERVAL) { LogPrintf("socket receive timeout: %is\n", nTime - pnode->nLastRecv); pnode->fDisconnect = true; diff --git a/src/protocol.h b/src/protocol.h index b5e65032a..8bcf6e2ab 100644 --- a/src/protocol.h +++ b/src/protocol.h @@ -103,8 +103,7 @@ public: Init(); if (nType & SER_DISK) READWRITE(nVersion); - if ((nType & SER_DISK) || - (nVersion >= CADDR_TIME_VERSION && !(nType & SER_GETHASH))) + if ((nType & SER_DISK) || !(nType & SER_GETHASH)) READWRITE(nTime); READWRITE(nServices); READWRITE(*(CService*)this); diff --git a/src/version.h b/src/version.h index 91a464030..bd71a5574 100644 --- a/src/version.h +++ b/src/version.h @@ -12,26 +12,9 @@ static const int PROTOCOL_VERSION = 170002; //! initial proto version, to be increased after version/verack negotiation -static const int INIT_PROTO_VERSION = 209; - -//! In this version, 'getheaders' was introduced. -static const int GETHEADERS_VERSION = 31800; +static const int INIT_PROTO_VERSION = 170002; //! disconnect from peers older than this proto version static const int MIN_PEER_PROTO_VERSION = 170002; -//! nTime field added to CAddress, starting with this version; -//! if possible, avoid requesting addresses nodes older than this -static const int CADDR_TIME_VERSION = 31402; - -//! only request blocks from nodes outside this range of versions -static const int NOBLKS_VERSION_START = 32000; -static const int NOBLKS_VERSION_END = 32400; - -//! BIP 0031, pong message, is enabled for all versions AFTER this one -static const int BIP0031_VERSION = 60000; - -//! "mempool" command, enhanced "getdata" behavior starts with this version -static const int MEMPOOL_GD_VERSION = 60002; - #endif // BITCOIN_VERSION_H From 0090c64534a9d63f3993964625fed6eb78cd3f41 Mon Sep 17 00:00:00 2001 From: Daira Hopwood Date: Sun, 9 Apr 2017 23:29:10 +0100 Subject: [PATCH 0011/1062] Don't rely on a finite upper bound on fee rate or priority. Signed-off-by: Daira Hopwood --- src/policy/fees.cpp | 22 +++++++++++++++------- src/policy/fees.h | 11 +++++++++-- src/test/policyestimator_tests.cpp | 19 +++++++++++++++++++ 3 files changed, 43 insertions(+), 9 deletions(-) diff --git a/src/policy/fees.cpp b/src/policy/fees.cpp index ffe31d194..f08cec311 100644 --- a/src/policy/fees.cpp +++ b/src/policy/fees.cpp @@ -16,10 +16,14 @@ void TxConfirmStats::Initialize(std::vector& defaultBuckets, { decay = _decay; dataTypeString = _dataTypeString; - for (unsigned int i = 0; i < defaultBuckets.size(); i++) { - buckets.push_back(defaultBuckets[i]); - bucketMap[defaultBuckets[i]] = i; + + buckets.insert(buckets.end(), defaultBuckets.begin(), defaultBuckets.end()); + buckets.push_back(std::numeric_limits::infinity()); + + for (unsigned int i = 0; i < buckets.size(); i++) { + bucketMap[buckets[i]] = i; } + confAvg.resize(maxConfirms); curBlockConf.resize(maxConfirms); unconfTxs.resize(maxConfirms); @@ -49,13 +53,19 @@ void TxConfirmStats::ClearCurrent(unsigned int nBlockHeight) } } +unsigned int TxConfirmStats::FindBucketIndex(double val) +{ + auto it = bucketMap.lower_bound(val); + assert(it != bucketMap.end()); + return it->second; +} void TxConfirmStats::Record(int blocksToConfirm, double val) { // blocksToConfirm is 1-based if (blocksToConfirm < 1) return; - unsigned int bucketindex = bucketMap.lower_bound(val)->second; + unsigned int bucketindex = FindBucketIndex(val); for (size_t i = blocksToConfirm; i <= curBlockConf.size(); i++) { curBlockConf[i - 1][bucketindex]++; } @@ -246,7 +256,7 @@ void TxConfirmStats::Read(CAutoFile& filein) unsigned int TxConfirmStats::NewTx(unsigned int nBlockHeight, double val) { - unsigned int bucketindex = bucketMap.lower_bound(val)->second; + unsigned int bucketindex = FindBucketIndex(val); unsigned int blockIndex = nBlockHeight % unconfTxs.size(); unconfTxs[blockIndex][bucketindex]++; LogPrint("estimatefee", "adding to %s", dataTypeString); @@ -306,7 +316,6 @@ CBlockPolicyEstimator::CBlockPolicyEstimator(const CFeeRate& _minRelayFee) for (double bucketBoundary = minTrackedFee.GetFeePerK(); bucketBoundary <= MAX_FEERATE; bucketBoundary *= FEE_SPACING) { vfeelist.push_back(bucketBoundary); } - vfeelist.push_back(INF_FEERATE); feeStats.Initialize(vfeelist, MAX_BLOCK_CONFIRMS, DEFAULT_DECAY, "FeeRate"); minTrackedPriority = AllowFreeThreshold() < MIN_PRIORITY ? MIN_PRIORITY : AllowFreeThreshold(); @@ -314,7 +323,6 @@ CBlockPolicyEstimator::CBlockPolicyEstimator(const CFeeRate& _minRelayFee) for (double bucketBoundary = minTrackedPriority; bucketBoundary <= MAX_PRIORITY; bucketBoundary *= PRI_SPACING) { vprilist.push_back(bucketBoundary); } - vprilist.push_back(INF_PRIORITY); priStats.Initialize(vprilist, MAX_BLOCK_CONFIRMS, DEFAULT_DECAY, "Priority"); feeUnlikely = CFeeRate(0); diff --git a/src/policy/fees.h b/src/policy/fees.h index d37d4b184..d990442ae 100644 --- a/src/policy/fees.h +++ b/src/policy/fees.h @@ -73,7 +73,9 @@ static const double DEFAULT_DECAY = .998; * We will instantiate two instances of this class, one to track transactions * that were included in a block due to fee, and one for tx's included due to * priority. We will lump transactions into a bucket according to their approximate - * fee or priority and then track how long it took for those txs to be included in a block + * fee or priority and then track how long it took for those txs to be included + * in a block. There is always a bucket into which any given double value + * (representing a fee or priority) falls. * * The tracking of unconfirmed (mempool) transactions is completely independent of the * historical tracking of transactions that have been confirmed in a block. @@ -118,9 +120,14 @@ private: std::vector oldUnconfTxs; public: + /** Find the bucket index of a given value */ + unsigned int FindBucketIndex(double val); + /** * Initialize the data structures. This is called by BlockPolicyEstimator's - * constructor with default values. + * constructor with default values. A final bucket is created implicitly for + * values greater than the last upper limit in defaultBuckets. + * * @param defaultBuckets contains the upper limits for the bucket boundaries * @param maxConfirms max number of confirms to track * @param decay how much to decay the historical moving average per block diff --git a/src/test/policyestimator_tests.cpp b/src/test/policyestimator_tests.cpp index cb64ee7c6..33144ed53 100644 --- a/src/test/policyestimator_tests.cpp +++ b/src/test/policyestimator_tests.cpp @@ -183,4 +183,23 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates) } } + +BOOST_AUTO_TEST_CASE(TxConfirmStats_FindBucketIndex) +{ + std::vector buckets {0.0, 3.5, 42.0}; + TxConfirmStats txcs; + + txcs.Initialize(buckets, MAX_BLOCK_CONFIRMS, DEFAULT_DECAY, "Test"); + + BOOST_CHECK_EQUAL(txcs.FindBucketIndex(-1.0), 0); + BOOST_CHECK_EQUAL(txcs.FindBucketIndex(0.0), 0); + BOOST_CHECK_EQUAL(txcs.FindBucketIndex(1.0), 1); + BOOST_CHECK_EQUAL(txcs.FindBucketIndex(3.5), 1); + BOOST_CHECK_EQUAL(txcs.FindBucketIndex(4.0), 2); + BOOST_CHECK_EQUAL(txcs.FindBucketIndex(43.0), 3); + BOOST_CHECK_EQUAL(txcs.FindBucketIndex(INF_FEERATE), 3); + BOOST_CHECK_EQUAL(txcs.FindBucketIndex(2.0*INF_FEERATE), 3); + BOOST_CHECK_EQUAL(txcs.FindBucketIndex(nan("")), 0); +} + BOOST_AUTO_TEST_SUITE_END() From e40180aa0ff5d5a03b8f5a9b7b8e46cbd9abdb07 Mon Sep 17 00:00:00 2001 From: str4d Date: Thu, 13 Apr 2017 11:15:57 +1200 Subject: [PATCH 0012/1062] Update tests to check actual infinity as well as INF_FEERATE --- src/test/policyestimator_tests.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/test/policyestimator_tests.cpp b/src/test/policyestimator_tests.cpp index 33144ed53..3fcd39661 100644 --- a/src/test/policyestimator_tests.cpp +++ b/src/test/policyestimator_tests.cpp @@ -199,6 +199,8 @@ BOOST_AUTO_TEST_CASE(TxConfirmStats_FindBucketIndex) BOOST_CHECK_EQUAL(txcs.FindBucketIndex(43.0), 3); BOOST_CHECK_EQUAL(txcs.FindBucketIndex(INF_FEERATE), 3); BOOST_CHECK_EQUAL(txcs.FindBucketIndex(2.0*INF_FEERATE), 3); + BOOST_CHECK_EQUAL(txcs.FindBucketIndex(std::numeric_limits::infinity()), 3); + BOOST_CHECK_EQUAL(txcs.FindBucketIndex(2.0*std::numeric_limits::infinity()), 3); BOOST_CHECK_EQUAL(txcs.FindBucketIndex(nan("")), 0); } From c83c5932e4feab923517b2187c816bc3d0c71b84 Mon Sep 17 00:00:00 2001 From: str4d Date: Fri, 14 Apr 2017 02:03:29 +1200 Subject: [PATCH 0013/1062] Add unit test for security issue 2017-04-11.a --- src/Makefile.gtest.include | 1 + src/gtest/test_mempool.cpp | 86 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 src/gtest/test_mempool.cpp diff --git a/src/Makefile.gtest.include b/src/Makefile.gtest.include index 3752e0d48..b6dc8c848 100644 --- a/src/Makefile.gtest.include +++ b/src/Makefile.gtest.include @@ -23,6 +23,7 @@ zcash_gtest_SOURCES += \ gtest/test_joinsplit.cpp \ gtest/test_keystore.cpp \ gtest/test_noteencryption.cpp \ + gtest/test_mempool.cpp \ gtest/test_merkletree.cpp \ gtest/test_metrics.cpp \ gtest/test_miner.cpp \ diff --git a/src/gtest/test_mempool.cpp b/src/gtest/test_mempool.cpp new file mode 100644 index 000000000..328252d51 --- /dev/null +++ b/src/gtest/test_mempool.cpp @@ -0,0 +1,86 @@ +#include +#include + +#include "core_io.h" +#include "primitives/transaction.h" +#include "txmempool.h" + +// Fake the input of transaction 5295156213414ed77f6e538e7e8ebe14492156906b9fe995b242477818789364 +// - 532639cc6bebed47c1c69ae36dd498c68a012e74ad12729adbd3dbb56f8f3f4a, 0 +class FakeCoinsViewDB : public CCoinsView { +public: + FakeCoinsViewDB() {} + + bool GetAnchorAt(const uint256 &rt, ZCIncrementalMerkleTree &tree) const { + return false; + } + + bool GetNullifier(const uint256 &nf) const { + return false; + } + + bool GetCoins(const uint256 &txid, CCoins &coins) const { + CTxOut txOut; + txOut.nValue = 4288035; + CCoins newCoins; + newCoins.vout.resize(2); + newCoins.vout[0] = txOut; + newCoins.nHeight = 92045; + coins.swap(newCoins); + return true; + } + + bool HaveCoins(const uint256 &txid) const { + return true; + } + + uint256 GetBestBlock() const { + uint256 a; + return a; + } + + uint256 GetBestAnchor() const { + uint256 a; + return a; + } + + bool BatchWrite(CCoinsMap &mapCoins, + const uint256 &hashBlock, + const uint256 &hashAnchor, + CAnchorsMap &mapAnchors, + CNullifiersMap &mapNullifiers) { + return false; + } + + bool GetStats(CCoinsStats &stats) const { + return false; + } +}; + +TEST(Mempool, PriorityStatsDoNotCrash) { + // Test for security issue 2017-04-11.a + // https://z.cash/blog/security-announcement-2017-04-12.html + + // Trigger transaction in block 92046 + std::string triggerTx = "02000000014a3f8f6fb5dbd3db9a7212ad742e018ac698d46de39ac6c147edeb6bcc392653000000006b483045022100da0514afd80d3bbd0743458efe3b2abd18f727b4268b124c3885094c26ea09cd02207d37d7934ec90618fc5a345cb2a6d1755d8b1a432ea1df517a85e36628449196012103e9b41072e9d2cbe04e6b22a6ac4862ec3f5a76b3823b071ded0dfd5455a0803fffffffff000000000001236e4100000000000000000000000000cf592f6776810cf9fb961d80e683f5529a6b34894b00446c396022512a02dc2e96918294bffdc988a2627d9b12a9f3176b671e286fc62e3c7441cf35ea5e03d561bd5817ca5827cb2761f88dde280a6da5281af2cc69053816f31abd2170722f72c258c7c6b865c97ff8ae53b697f3b77c239a73e1d0296c2c73d21c3b50059d82866cf9f6e2f5dbbf9b4de9caa3cf836080373311978e1f1b1150ce564336ebf0fd502c2e783ff23252fba4efbb110c28c4fbe31efb6a67bc24c0ad8fd8346c5c9ed1791b555b3e43a309aa8d855a294847368ebdf30365d4dfa9b25dd8ed7adf272ecc08f4756fb9d93b8e20d45548dd4aeab6abb76a2081b6e36a9af9d38ebae378df422f40589769c07a3c12e5da253330314cbc4beaa863fac7ab10055d0310089a44c45179a39b2c4e210cec2e053f54983d744abed49f66959f45785ea90325a310fba15f946e245a0e64caec303f2a3e1d457e3e3ca5d892956c1a93b05e0b0373cf862d7bbb5908148b475c03eec96c9b9ecc7d2d78716d2c2e8ccf96175b25738dfb5b0d356a7e30604ee014c6be1db5e43af0fa6ad3f4e917a9f84b4d6f030cad0ffe0738e1effe570b0552b407ca9c26023b74b99f431cc28b79116f717703158404e343b1b47a0556f593441dc64758930f19e84d5ee468fd9a7958c6c63503054f60680f7147e88bf6da65415450230ef7437481023fc5d94872d5aa18bf3b0212b4c0d938e6c84debb8a4e65f99970c59193873a72b2440f19a652073abd960021bfef4e1e52b8f353c6e517bb97053afd4c8035defc27c3fd16faba5bc924a4179f69cfdcdb82253b5f6472a99d4b78ad2c6c18c45ed4dda5bf2adc019c99b55702f4e7b3fcaeb6f3b84ad411d36e901cba9d49ac1d6b916aa88794fb23501aeb0c585cbc2bed952846f41a03bd5c74dfe004e7ac21f7a20d32b009ccf6f70b3e577d25c679421225522b6290d5fa00a5d9a02b97a62aab60e040a03efa946d87c5e65dbf10d66df5b0834c262c31c23f3c2643451e614695003fb3a95bf21444bebb45cdcb8169245e34a76f754c89c3a90f36598a71ef4645eef4c82f1fb322536097fcf0cbe061e80ae887dbb88d8ed910be9ef18b8794930addab1a140b16c4b50f93926b1e5df03ee6e4b5ec6d7f0ed49fbbae50330ae94c5ae9182f4b58870022e423e7d80adccdb90680f7a7fe11a4ed4fe005a0af2d22bf9e7d1bef7caf4f37f5777e4aa6c9b9ea44f5973575c20fb3482fe357c19fc0c20594f492f5694e3e8eb3599e968fd23b5bdd6c4bf5aee1374b38aafe59dd5af83011e642a9427b5ff03e7a4cce92ee201a0fac0acb69d6ad3b7e4c26dfefaa53a737889e759c4b5695c1a7fd5d988e531acf66dae5067f252a25a102d92916b2d84c730645e15a78d3dce1c787634f6f7323cb949a5b6ad004e208cb8c6b734761629c13b9974dc80b082f83357f3bc703d835acbbf72aba225ffe69396c151d2646fac9bd1acc184dd047ebfaadc6b60a9185ce80c7bc8ac5dbb2219cbc0d35af91673b95d28335f0ee2774b8084871d54ca8eab3a285e4b4adf3f34b4263d67474bb5de2e1e37aa7a4ecbd5b49575caaa9e7208c2b9871946b11f2c54cd1ca7660dff44cf206e7da46ab57dd49ec0aa06ded7980f1557cc7c84023690b4df77f26d6b4eff7553b9a8628c28e8e5c38c6170bc61af0969b072586fa740f68ab33c0f62d0507cc8fe41c680b2f077e49cc2691048006311b46cd5ed18e63089f11c115b797ed5fbcd86836a4da2ab90a00745077f2f13bc9e390fc2f92b941d4fb70a3f098548953566141670317fc17e0ba81e98b8a94919992fb008c5480f4018f3a1ea673fe94a6ba3363656a944855d7c799ccb73d95d4ed6ce04c26f79c4cf79f883f0f810519f28eabe8cf6d833f24227f5074763c7b80f1431e5463cc07eff2f1d6cbfaf0411d38e62528a39b093ed7b51fa8c1008e5c1ce4bf39e67b1703554cefef44b71457bfddf43d23a54fa0145fa0e716d02a5304d85345a2b4ebf98c5010d0df468c8cbfc2db22083b0f5a74d4324ee74b46daa5ab70f2575ef5390e6aa2acb8d3b3eb2065e8c06fd6276aca283f5850e7a8b4da37455430df55621e4af59bb355ba2db0ac6cae6ceed2f538ec8c928ee895bd190fd9c1dff4956bad27d567023bc847dd64d83bac399f8d10248a077c9b2f50d5dda4789e09eae4ed8609da085b6370f6529f3c7b8b13442f9a1cc93565734a81c38c6360235ba23ddf87d1b44413c24b363552a322b01d88d1cae6c5ccd88f8cef15776035934fd24adce913282983d9b55181b382ed61242fb4a5e459c3cad8d38626ef8ccdccb9899d5962dec3f3cc2422f109d902e764186cf166ed88c383f428f195dd5fec4f781bcd2308dec66927f41c9e06369c6806ed8ec9a59c096b29b2a74dc85f4f7cd77a23650c0662b5c2602ef5e41cdc13d16074500aac461f823e3bba7178bcffa000db4ffc9b1618395824ffbee1cad1d9c138a20e0b8bbea2d9a07fade932f81c3daf2d64c4991daf4a1b8b531f9b958a252c6c38cd463342aef3e03e3dae3370581d6cddf5af3ef1585780cf83db1909a1daca156018cd2f7483e53a5fccda49640de60b24523617c7ae84ec5fa987ba8a108"; + CTransaction tx; + ASSERT_TRUE(DecodeHexTx(tx, triggerTx)); + ASSERT_EQ(tx.GetHash().GetHex(), "5295156213414ed77f6e538e7e8ebe14492156906b9fe995b242477818789364"); + + // Fake its inputs + FakeCoinsViewDB fakeDB; + CCoinsViewCache view(&fakeDB); + + CTxMemPool testPool(CFeeRate(0)); + + // Values taken from core dump (parameters of entry) + CAmount nFees = 0; + int64_t nTime = 0x58e5fed9; + unsigned int nHeight = 92045; + double dPriority = view.GetPriority(tx, nHeight); + + CTxMemPoolEntry entry(tx, nFees, nTime, dPriority, nHeight, true); + + // Check it does not crash (ie. the death test fails) + EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(testPool.addUnchecked(tx.GetHash(), entry), ""), ""); +} From ec19e8e2835b91100e3b2c2459f1977ccbcdda1d Mon Sep 17 00:00:00 2001 From: Daira Hopwood Date: Thu, 13 Apr 2017 22:40:20 +0100 Subject: [PATCH 0014/1062] Simplify JoinSplit priority calculation. refs 1896 Signed-off-by: Daira Hopwood --- src/coins.cpp | 38 ++++++++++++-------------------------- 1 file changed, 12 insertions(+), 26 deletions(-) diff --git a/src/coins.cpp b/src/coins.cpp index 1116f159b..250354614 100644 --- a/src/coins.cpp +++ b/src/coins.cpp @@ -7,6 +7,7 @@ #include "memusage.h" #include "random.h" #include "version.h" +#include "policy/fees.h" #include @@ -443,7 +444,17 @@ double CCoinsViewCache::GetPriority(const CTransaction &tx, int nHeight) const { if (tx.IsCoinBase()) return 0.0; - CAmount nTotalIn = 0; + + // Joinsplits do not reveal any information about the value or age of a note, so we + // cannot apply the priority algorithm used for transparent utxos. Instead, we just + // use the maximum priority whenever a transaction contains any JoinSplits. + // (Note that coinbase transactions cannot contain JoinSplits.) + // FIXME: this logic is partially duplicated between here and CreateNewBlock in miner.cpp. + + if (tx.vjoinsplit.size() > 0) { + return MAX_PRIORITY; + } + double dResult = 0.0; BOOST_FOREACH(const CTxIn& txin, tx.vin) { @@ -452,34 +463,9 @@ double CCoinsViewCache::GetPriority(const CTransaction &tx, int nHeight) const if (!coins->IsAvailable(txin.prevout.n)) continue; if (coins->nHeight < nHeight) { dResult += coins->vout[txin.prevout.n].nValue * (nHeight-coins->nHeight); - nTotalIn += coins->vout[txin.prevout.n].nValue; } } - // If a transaction contains a joinsplit, we boost the priority of the transaction. - // Joinsplits do not reveal any information about the value or age of a note, so we - // cannot apply the priority algorithm used for transparent utxos. Instead, we pick a - // very large number and multiply it by the transaction's fee per 1000 bytes of data. - // One trillion, 1000000000000, is equivalent to 1 ZEC utxo * 10000 blocks (~17 days). - if (tx.vjoinsplit.size() > 0) { - unsigned int nTxSize = ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION); - nTotalIn += tx.GetJoinSplitValueIn(); - CAmount fee = nTotalIn - tx.GetValueOut(); - CFeeRate feeRate(fee, nTxSize); - CAmount feePerK = feeRate.GetFeePerK(); - - if (feePerK == 0) { - feePerK = 1; - } - - dResult += 1000000000000 * double(feePerK); - // We cast feePerK from int64_t to double because if feePerK is a large number, say - // close to MAX_MONEY, the multiplication operation will result in an integer overflow. - // The variable dResult should never overflow since a 64-bit double in C++ is typically - // a double-precision floating-point number as specified by IEE 754, with a maximum - // value DBL_MAX of 1.79769e+308. - } - return tx.ComputePriority(dResult); } From 60b7410ccee26524c09c785520168c86e18701bb Mon Sep 17 00:00:00 2001 From: Daira Hopwood Date: Thu, 13 Apr 2017 21:53:33 +0100 Subject: [PATCH 0015/1062] Add check for JoinSplit priority as calculated by CCoinsViewCache::GetPriority. Signed-off-by: Daira Hopwood --- src/gtest/test_mempool.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gtest/test_mempool.cpp b/src/gtest/test_mempool.cpp index 328252d51..88b0e2593 100644 --- a/src/gtest/test_mempool.cpp +++ b/src/gtest/test_mempool.cpp @@ -4,6 +4,7 @@ #include "core_io.h" #include "primitives/transaction.h" #include "txmempool.h" +#include "policy/fees.h" // Fake the input of transaction 5295156213414ed77f6e538e7e8ebe14492156906b9fe995b242477818789364 // - 532639cc6bebed47c1c69ae36dd498c68a012e74ad12729adbd3dbb56f8f3f4a, 0 @@ -83,4 +84,6 @@ TEST(Mempool, PriorityStatsDoNotCrash) { // Check it does not crash (ie. the death test fails) EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(testPool.addUnchecked(tx.GetHash(), entry), ""), ""); + + EXPECT_EQ(dPriority, MAX_PRIORITY); } From 451047d14a6f3d11b633a35eb8ae3dbe273c720f Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Thu, 13 Apr 2017 17:10:32 -0700 Subject: [PATCH 0016/1062] Bump version numbers for v1.0.8-1. --- README.md | 4 ++-- configure.ac | 2 +- contrib/gitian-descriptors/gitian-linux.yml | 2 +- src/clientversion.h | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index d04105591..ca78f36eb 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -Zcash 1.0.8 -=========== +Zcash 1.0.8-1 +============= What is Zcash? -------------- diff --git a/configure.ac b/configure.ac index e356b9e07..de205561c 100644 --- a/configure.ac +++ b/configure.ac @@ -3,7 +3,7 @@ AC_PREREQ([2.60]) define(_CLIENT_VERSION_MAJOR, 1) define(_CLIENT_VERSION_MINOR, 0) define(_CLIENT_VERSION_REVISION, 8) -define(_CLIENT_VERSION_BUILD, 50) +define(_CLIENT_VERSION_BUILD, 51) define(_ZC_BUILD_VAL, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, m4_incr(_CLIENT_VERSION_BUILD), m4_eval(_CLIENT_VERSION_BUILD < 50), 1, m4_eval(_CLIENT_VERSION_BUILD - 24), m4_eval(_CLIENT_VERSION_BUILD == 50), 1, , m4_eval(_CLIENT_VERSION_BUILD - 50))) define(_CLIENT_VERSION_SUFFIX, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, _CLIENT_VERSION_REVISION-beta$1, m4_eval(_CLIENT_VERSION_BUILD < 50), 1, _CLIENT_VERSION_REVISION-rc$1, m4_eval(_CLIENT_VERSION_BUILD == 50), 1, _CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION-$1))) define(_CLIENT_VERSION_IS_RELEASE, true) diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml index 90c21be45..4799bb476 100644 --- a/contrib/gitian-descriptors/gitian-linux.yml +++ b/contrib/gitian-descriptors/gitian-linux.yml @@ -1,5 +1,5 @@ --- -name: "zcash-1.0.8" +name: "zcash-1.0.8-1" enable_cache: true distro: "debian" suites: diff --git a/src/clientversion.h b/src/clientversion.h index fb934ab24..bba551eeb 100644 --- a/src/clientversion.h +++ b/src/clientversion.h @@ -18,7 +18,7 @@ #define CLIENT_VERSION_MAJOR 1 #define CLIENT_VERSION_MINOR 0 #define CLIENT_VERSION_REVISION 8 -#define CLIENT_VERSION_BUILD 50 +#define CLIENT_VERSION_BUILD 51 //! Set to true for release, false for prerelease or test build #define CLIENT_VERSION_IS_RELEASE true From a4f764bb289bc7ffe493a0755012954fe025a39e Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Thu, 13 Apr 2017 17:39:36 -0700 Subject: [PATCH 0017/1062] Commit the changes from gen-manpages.sh, except manually tweak the version strings. --- doc/man/zcash-cli.1 | 8 ++++++-- doc/man/zcash-tx.1 | 8 ++++++-- doc/man/zcashd.1 | 10 +++++++--- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/doc/man/zcash-cli.1 b/doc/man/zcash-cli.1 index 9dbefb9e8..b66838b65 100644 --- a/doc/man/zcash-cli.1 +++ b/doc/man/zcash-cli.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.4. -.TH ZCASH-CLI "1" "March 2017" "zcash-cli v1.0.8" "User Commands" +.TH ZCASH-CLI "1" "April 2017" "zcash-cli v1.0.8-1" "User Commands" .SH NAME zcash-cli \- manual page for zcash-cli v1.0.8 .SH DESCRIPTION -Zcash RPC client version v1.0.8 +Zcash RPC client version v1.0.8\-1 .PP In order to ensure you are adequately protecting your privacy when using Zcash, please see . @@ -66,6 +66,10 @@ Password for JSON\-RPC connections Timeout in seconds during HTTP requests, or 0 for no timeout. (default: 900) .SH COPYRIGHT + +In order to ensure you are adequately protecting your privacy when using Zcash, +please see . + Copyright (C) 2009-2017 The Bitcoin Core Developers Copyright (C) 2015-2017 The Zcash Developers diff --git a/doc/man/zcash-tx.1 b/doc/man/zcash-tx.1 index 4bd1b6b1d..73d80230d 100644 --- a/doc/man/zcash-tx.1 +++ b/doc/man/zcash-tx.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.4. -.TH ZCASH-TX "1" "March 2017" "zcash-tx v1.0.8" "User Commands" +.TH ZCASH-TX "1" "April 2017" "zcash-tx v1.0.8-1" "User Commands" .SH NAME zcash-tx \- manual page for zcash-tx v1.0.8 .SH DESCRIPTION -Zcash zcash\-tx utility version v1.0.8 +Zcash zcash\-tx utility version v1.0.8\-1 .SS "Usage:" .TP zcash\-tx [options] [commands] @@ -84,6 +84,10 @@ set=NAME:JSON\-STRING .IP Set register NAME to given JSON\-STRING .SH COPYRIGHT + +In order to ensure you are adequately protecting your privacy when using Zcash, +please see . + Copyright (C) 2009-2017 The Bitcoin Core Developers Copyright (C) 2015-2017 The Zcash Developers diff --git a/doc/man/zcashd.1 b/doc/man/zcashd.1 index 3fbfe32e6..876562408 100644 --- a/doc/man/zcashd.1 +++ b/doc/man/zcashd.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.4. -.TH ZCASHD "1" "March 2017" "zcashd v1.0.8" "User Commands" +.TH ZCASHD "1" "April 2017" "zcashd v1.0.8-1" "User Commands" .SH NAME zcashd \- manual page for zcashd v1.0.8 .SH DESCRIPTION -Zcash Daemon version v1.0.8 +Zcash Daemon version v1.0.8\-1 .PP In order to ensure you are adequately protecting your privacy when using Zcash, please see . @@ -382,7 +382,7 @@ Generate coins (default: 0) .HP \fB\-genproclimit=\fR .IP -Set the number of threads for coin generation if enabled (\fB\-1\fR = all +Set the number of threads for coin generation if enabled (\fB\fR = all cores, default: 1) .HP \fB\-equihashsolver=\fR @@ -454,6 +454,10 @@ output (default: 1 if running in a console, 0 otherwise) Number of seconds between metrics refreshes (default: 1 if running in a console, 600 otherwise) .SH COPYRIGHT + +In order to ensure you are adequately protecting your privacy when using Zcash, +please see . + Copyright (C) 2009-2017 The Bitcoin Core Developers Copyright (C) 2015-2017 The Zcash Developers From 1c360b2128342aa967533f269f38cd61d9596218 Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Thu, 13 Apr 2017 17:48:08 -0700 Subject: [PATCH 0018/1062] Fix a release-process.md bug; commit results changelog + debian updates. --- contrib/debian/changelog | 6 ++++++ doc/authors.md | 7 ++++--- doc/release-notes/release-notes-1.0.8-1.md | 16 ++++++++++++++++ doc/release-process.md | 2 +- 4 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 doc/release-notes/release-notes-1.0.8-1.md diff --git a/contrib/debian/changelog b/contrib/debian/changelog index c400dca73..3157e06b2 100644 --- a/contrib/debian/changelog +++ b/contrib/debian/changelog @@ -1,3 +1,9 @@ +zcash (v1.0.8+1) jessie; urgency=high + + * 1.0.8-1 release. + + -- Zcash Company Thu, 13 Apr 2017 17:44:23 -0700 + zcash (1.0.8) jessie; urgency=medium * 1.0.8 release. diff --git a/doc/authors.md b/doc/authors.md index f9fc63367..03a92cb24 100644 --- a/doc/authors.md +++ b/doc/authors.md @@ -1,10 +1,10 @@ Zcash Contributors ================== -Jack Grigg (392) +Jack Grigg (393) Simon Liu (254) Sean Bowe (185) -Daira Hopwood (80) +Daira Hopwood (83) Taylor Hornby (65) Wladimir J. van der Laan (58) Jonas Schnelli (48) @@ -12,7 +12,7 @@ Jay Graber (47) Kevin Gallagher (38) Cory Fields (15) Pieter Wuille (14) -Nathan Wilcox (10) +Nathan Wilcox (12) nomnombtc (9) fanquake (5) Paige Peterson (5) @@ -30,6 +30,7 @@ Daniel Cousens (4) lpescher (3) Pavel Janík (3) Alfie John (3) +str4d (2) paveljanik (2) aniemerg (2) Scott (2) diff --git a/doc/release-notes/release-notes-1.0.8-1.md b/doc/release-notes/release-notes-1.0.8-1.md new file mode 100644 index 000000000..4650f552c --- /dev/null +++ b/doc/release-notes/release-notes-1.0.8-1.md @@ -0,0 +1,16 @@ +Daira Hopwood (3): + Don't rely on a finite upper bound on fee rate or priority. + Simplify JoinSplit priority calculation. refs 1896 + Add check for JoinSplit priority as calculated by CCoinsViewCache::GetPriority. + +Jack Grigg (1): + Use a larger -rpcclienttimeout for slow performance measurements + +Nathan Wilcox (2): + Bump version numbers for v1.0.8-1. + Commit the changes from gen-manpages.sh, except manually tweak the version strings. + +str4d (2): + Update tests to check actual infinity as well as INF_FEERATE + Add unit test for security issue 2017-04-11.a + diff --git a/doc/release-process.md b/doc/release-process.md index b4e2a3565..f86e59933 100644 --- a/doc/release-process.md +++ b/doc/release-process.md @@ -77,7 +77,7 @@ Run the release-notes.py script to generate release notes and update authors.md Add the newly created release notes to the Git repository: - $ git add doc/release-notes/release-notes-$ZCASH_RELEASE.md + $ git add ./doc/authors.md ./doc/release-notes/release-notes-$ZCASH_RELEASE.md Update the Debian package changelog: From 9bfe6e88542948c880351724f9522f8fb4b8a33d Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Thu, 13 Apr 2017 18:08:12 -0700 Subject: [PATCH 0019/1062] Undo a documentation error due to an automated tool. --- doc/man/zcashd.1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/man/zcashd.1 b/doc/man/zcashd.1 index 876562408..394ca314c 100644 --- a/doc/man/zcashd.1 +++ b/doc/man/zcashd.1 @@ -382,7 +382,7 @@ Generate coins (default: 0) .HP \fB\-genproclimit=\fR .IP -Set the number of threads for coin generation if enabled (\fB\fR = all +Set the number of threads for coin generation if enabled (\fB-1\fR = all cores, default: 1) .HP \fB\-equihashsolver=\fR From c4bfb295a96b51233787c1a88521c1639ca5bb3e Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Thu, 13 Apr 2017 18:10:19 -0700 Subject: [PATCH 0020/1062] Fix the previous incorrect fix to the manpage. --- doc/man/zcashd.1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/man/zcashd.1 b/doc/man/zcashd.1 index 394ca314c..f9e976a19 100644 --- a/doc/man/zcashd.1 +++ b/doc/man/zcashd.1 @@ -382,7 +382,7 @@ Generate coins (default: 0) .HP \fB\-genproclimit=\fR .IP -Set the number of threads for coin generation if enabled (\fB-1\fR = all +Set the number of threads for coin generation if enabled (\fB\-1\fR = all cores, default: 1) .HP \fB\-equihashsolver=\fR From c5229b5603f21aa10c6d230c8c2ec3f27df81f0a Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Thu, 13 Apr 2017 20:24:28 -0700 Subject: [PATCH 0021/1062] [Direct master commit] Fix a release snafu in debian version string. --- contrib/debian/changelog | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/debian/changelog b/contrib/debian/changelog index 3157e06b2..cffa58070 100644 --- a/contrib/debian/changelog +++ b/contrib/debian/changelog @@ -1,8 +1,8 @@ -zcash (v1.0.8+1) jessie; urgency=high +zcash (1.0.8+1) jessie; urgency=high * 1.0.8-1 release. - -- Zcash Company Thu, 13 Apr 2017 17:44:23 -0700 + -- Zcash Company Thu, 13 Apr 2017 20:20:37 -0700 zcash (1.0.8) jessie; urgency=medium From 80cbdbc7493c3742f0c6536f4b8771ee7f0dc221 Mon Sep 17 00:00:00 2001 From: Daira Hopwood Date: Fri, 14 Apr 2017 21:40:30 +0100 Subject: [PATCH 0022/1062] Fix an error reporting bug due to BrokenPipeError and ConnectionResetError not existing in Python 2. refs #2263 Signed-off-by: Daira Hopwood --- qa/rpc-tests/test_framework/authproxy.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/qa/rpc-tests/test_framework/authproxy.py b/qa/rpc-tests/test_framework/authproxy.py index ad0a31798..28b33e286 100644 --- a/qa/rpc-tests/test_framework/authproxy.py +++ b/qa/rpc-tests/test_framework/authproxy.py @@ -118,19 +118,18 @@ class AuthServiceProxy(object): try: self.__conn.request(method, path, postdata, headers) return self._get_response() - except httplib.BadStatusLine as e: - if e.line == "''": # if connection was closed, try again + except Exception as e: + # If connection was closed, try again. + # Python 3.5+ raises BrokenPipeError instead of BadStatusLine when the connection was reset. + # ConnectionResetError happens on FreeBSD with Python 3.4. + # These classes don't exist in Python 2.x, so we can't refer to them directly. + if ((isinstance(e, httplib.BadStatusLine) and e.line == "''") + or e.__class__.__name__ in ('BrokenPipeError', 'ConnectionResetError')): self.__conn.close() self.__conn.request(method, path, postdata, headers) return self._get_response() else: raise - except (BrokenPipeError,ConnectionResetError): - # Python 3.5+ raises BrokenPipeError instead of BadStatusLine when the connection was reset - # ConnectionResetError happens on FreeBSD with Python 3.4 - self.__conn.close() - self.__conn.request(method, path, postdata, headers) - return self._get_response() def __call__(self, *args): AuthServiceProxy.__id_count += 1 From 0a561353369bb22a427eff9a32aa7d19a5072d96 Mon Sep 17 00:00:00 2001 From: Jay Graber Date: Fri, 14 Apr 2017 17:31:35 -0700 Subject: [PATCH 0023/1062] Poll on getblocktemplate result rather than use bare sleep to avoid race condition. --- qa/rpc-tests/prioritisetransaction.py | 31 ++++++++++++++++++--------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/qa/rpc-tests/prioritisetransaction.py b/qa/rpc-tests/prioritisetransaction.py index 19dc6ade1..19697fc4a 100755 --- a/qa/rpc-tests/prioritisetransaction.py +++ b/qa/rpc-tests/prioritisetransaction.py @@ -7,6 +7,8 @@ from test_framework.test_framework import BitcoinTestFramework from test_framework.util import * from time import * from test_framework.mininode import COIN +import time + class PrioritiseTransactionTest (BitcoinTestFramework): @@ -67,7 +69,7 @@ class PrioritiseTransactionTest (BitcoinTestFramework): self.sync_all() # Create tx of lower value to be prioritized on node 0 - # Older transactions get mined first, so this lower value, newer tx is unlikely to be mined without prioritization + # Older transactions get mined first, so this lower value, newer tx is unlikely to be mined without prioritisation priority_tx_0 = self.nodes[0].sendtoaddress(self.nodes[1].getnewaddress(), 0.1) # Check that priority_tx_0 is not in block_template() prior to prioritisation @@ -79,7 +81,8 @@ class PrioritiseTransactionTest (BitcoinTestFramework): break assert_equal(in_block_template, False) - priority_result = self.nodes[0].prioritisetransaction(priority_tx_0, 1000, int(3 * base_fee * COIN)) + priority_success = self.nodes[0].prioritisetransaction(priority_tx_0, 1000, int(3 * base_fee * COIN)) + assert(priority_success) # Check that prioritized transaction is not in getblocktemplate() # (not updated because no new txns) @@ -91,6 +94,7 @@ class PrioritiseTransactionTest (BitcoinTestFramework): break assert_equal(in_block_template, False) + # Sending a new transaction will make getblocktemplate refresh within 10s self.nodes[0].sendtoaddress(self.nodes[1].getnewaddress(), 0.1) # Check that prioritized transaction is not in getblocktemplate() @@ -103,16 +107,23 @@ class PrioritiseTransactionTest (BitcoinTestFramework): break assert_equal(in_block_template, False) - sleep(10) - # Check that prioritized transaction is in getblocktemplate() - in_block_template = False + # getblocktemplate() will refresh after 1 min, or after 10 sec if new transaction is added to mempool + # Mempool is probed every 10 seconds. We'll give getblocktemplate() a maximum of 30 seconds to refresh block_template = self.nodes[0].getblocktemplate() - for tx in block_template['transactions']: - if tx['hash'] == priority_tx_0: - in_block_template = True - break - assert_equal(in_block_template, True) + start = time.time(); + in_block_template = False + while in_block_template == False: + for tx in block_template['transactions']: + if tx['hash'] == priority_tx_0: + in_block_template = True + break + if time.time() - start > 30: + raise AssertionError("Test timed out because prioritised transaction was not returned by getblocktemplate within 30 seconds.") + sleep(1) + block_template = self.nodes[0].getblocktemplate() + + assert(in_block_template) # Node 1 doesn't get the next block, so this *shouldn't* be mined despite being prioritized on node 1 priority_tx_1 = self.nodes[1].sendtoaddress(self.nodes[0].getnewaddress(), 0.1) From 56f66372c52bf7f4dfb86b56b5b348f1c75bf13c Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 16 Apr 2017 00:30:58 -0700 Subject: [PATCH 0024/1062] Fix proton build issue with debian jessie, as used on CI servers. Debian 8 stable ships with gcc 4.9.2 and cmake 3.0.2. Previously the depends package used CMAKE_CXX_STANDARD to tell cmake to use C++11, but the option requires cmakes 3.1+. To resolve the issue we now update relevant CMakeLists.txt and set CMAKE_CXX_FLAGS. --- depends/packages/proton.mk | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/depends/packages/proton.mk b/depends/packages/proton.mk index fa1779ead..b898a6662 100644 --- a/depends/packages/proton.mk +++ b/depends/packages/proton.mk @@ -6,6 +6,9 @@ $(package)_sha256_hash=6ffd26d3d0e495bfdb5d9fefc5349954e6105ea18cc4bb191161d2774 $(package)_dependencies= define $(package)_preprocess_cmds + sed -i '1i set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")' proton-c/bindings/cpp/CMakeLists.txt && \ + sed -i '1i set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")' examples/cpp/CMakeLists.txt && \ + sed -i '1i set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")' CMakeLists.txt && \ sed -i.old 's/qpid-proton SHARED/qpid-proton STATIC/' proton-c/CMakeLists.txt && \ sed -i.old 's/SASL/_DO_NOT_BUILD_SASL_/' proton-c/CMakeLists.txt && \ sed -i.old 's/qpid-proton-core SHARED/qpid-proton-core STATIC/' proton-c/CMakeLists.txt && \ @@ -20,8 +23,7 @@ define $(package)_config_cmds endef define $(package)_build_cmds - cd build; $(MAKE) VERBOSE=1 all && \ - cp CMakeCache.txt /tmp/CMakeCache.txt + cd build; $(MAKE) VERBOSE=1 endef define $(package)_stage_cmds From 05844ba53ba854e2abc4324b0b174d8684d3dd4d Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 16 Apr 2017 14:48:04 -0700 Subject: [PATCH 0025/1062] Change regtest port to 18344. Closes #2269. --- src/chainparams.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index ce71a3aaa..498514d51 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -319,7 +319,7 @@ public: genesis.nNonce = uint256S("0x0000000000000000000000000000000000000000000000000000000000000009"); genesis.nSolution = ParseHex("01936b7db1eb4ac39f151b8704642d0a8bda13ec547d54cd5e43ba142fc6d8877cab07b3"); consensus.hashGenesisBlock = genesis.GetHash(); - nDefaultPort = 18444; + nDefaultPort = 18344; assert(consensus.hashGenesisBlock == uint256S("0x029f11d80ef9765602235e1bc9727e3eb6ba20839319f761fee920d63401e327")); nPruneAfterHeight = 1000; From b93cedafe455b95a3c4e0387bce4cf294c615068 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 11 Apr 2017 18:30:42 +1200 Subject: [PATCH 0026/1062] torcontrol: Handle escapes in Tor QuotedStrings https://trac.torproject.org/projects/tor/ticket/14999 is tracking an encoding bug with the Tor control protocol, where many of the QuotedString instances that Tor outputs are in fact CStrings, but it is not documented which ones are which. https://spec.torproject.org/control-spec section 2.1.1 provides a future-proofed rule for handing QuotedStrings, which this commit implements. --- src/test/torcontrol_tests.cpp | 30 +++++++++++++++++----- src/torcontrol.cpp | 48 ++++++++++++++++++++++++++++++++--- 2 files changed, 68 insertions(+), 10 deletions(-) diff --git a/src/test/torcontrol_tests.cpp b/src/test/torcontrol_tests.cpp index 68516599d..8d3bb8f77 100644 --- a/src/test/torcontrol_tests.cpp +++ b/src/test/torcontrol_tests.cpp @@ -119,27 +119,43 @@ BOOST_AUTO_TEST_CASE(util_ParseTorReplyMapping) {"Foo", "Bar Baz"}, }); - // Escapes (which are left escaped by the parser) + // Escapes CheckParseTorReplyMapping( "Foo=\"Bar\\ Baz\"", { - {"Foo", "Bar\\ Baz"}, + {"Foo", "Bar Baz"}, }); CheckParseTorReplyMapping( "Foo=\"Bar\\Baz\"", { - {"Foo", "Bar\\Baz"}, + {"Foo", "BarBaz"}, }); CheckParseTorReplyMapping( "Foo=\"Bar\\@Baz\"", { - {"Foo", "Bar\\@Baz"}, + {"Foo", "Bar@Baz"}, }); CheckParseTorReplyMapping( "Foo=\"Bar\\\"Baz\" Spam=\"\\\"Eggs\\\"\"", { - {"Foo", "Bar\\\"Baz"}, - {"Spam", "\\\"Eggs\\\""}, + {"Foo", "Bar\"Baz"}, + {"Spam", "\"Eggs\""}, }); CheckParseTorReplyMapping( "Foo=\"Bar\\\\Baz\"", { - {"Foo", "Bar\\\\Baz"}, + {"Foo", "Bar\\Baz"}, + }); + + // C escapes + CheckParseTorReplyMapping( + "Foo=\"Bar\\nBaz\\t\" Spam=\"\\rEggs\" Octals=\"\\1a\\11\\17\\18\\81\\377\\378\\400\" Final=Check", { + {"Foo", "Bar\nBaz\t"}, + {"Spam", "\rEggs"}, + {"Octals", "\1a\11\17\1" "881\377\37" "8400"}, + {"Final", "Check"}, + }); + CheckParseTorReplyMapping( + "Valid=Mapping Bare=\"Escape\\\"", {}); + CheckParseTorReplyMapping( + "OneOctal=\"OneEnd\\1\" TwoOctal=\"TwoEnd\\11\"", { + {"OneOctal", "OneEnd\1"}, + {"TwoOctal", "TwoEnd\11"}, }); // A more complex valid grammar. PROTOCOLINFO accepts a VersionLine that diff --git a/src/torcontrol.cpp b/src/torcontrol.cpp index 60181b440..b2f229cba 100644 --- a/src/torcontrol.cpp +++ b/src/torcontrol.cpp @@ -292,10 +292,52 @@ static std::map ParseTorReplyMapping(const std::string if (ptr == s.size()) // unexpected end of line return std::map(); ++ptr; // skip closing '"' - /* TODO: unescape value - according to the spec this depends on the - * context, some strings use C-LogPrintf style escape codes, some - * don't. So may be better handled at the call site. + /** + * Escape value. Per https://spec.torproject.org/control-spec section 2.1.1: + * + * For future-proofing, controller implementors MAY use the following + * rules to be compatible with buggy Tor implementations and with + * future ones that implement the spec as intended: + * + * Read \n \t \r and \0 ... \377 as C escapes. + * Treat a backslash followed by any other character as that character. */ + std::string escaped_value; + for (size_t i = 0; i < value.size(); ++i) { + if (value[i] == '\\') { + // This will always be valid, because if the final character + // in the QuotedString was a \ then the parser would already + // have returned above, due to a missing terminating + // double-quote. + ++i; + if (value[i] == 'n') { + escaped_value.push_back('\n'); + } else if (value[i] == 't') { + escaped_value.push_back('\t'); + } else if (value[i] == 'r') { + escaped_value.push_back('\r'); + } else if ('0' <= value[i] && value[i] <= '7') { + size_t j; + // Octal escape sequences have a limit of three octal digits, + // but terminate at the first character that is not a valid + // octal digit if encountered sooner. + for (j = 1; '0' <= value[i+j] && value[i+j] <= '7' && j < 3; ++j) {} + // Tor restricts first digit to 0-3 for three-digit octals. + if (j < 3 || ('0' <= value[i] && value[i] <= '3')) { + escaped_value.push_back(strtol(value.substr(i, j).c_str(), NULL, 8)); + // Account for automatic incrementing at loop end + i += j - 1; + } else { + escaped_value.push_back(value[i]); + } + } else { + escaped_value.push_back(value[i]); + } + } else { + escaped_value.push_back(value[i]); + } + } + value = escaped_value; } else { // Unquoted value. Note that values can contain '=' at will, just no spaces while (ptr < s.size() && s[ptr] != ' ') { value.push_back(s[ptr]); From 519713d32e3b16f996a43bf9f7401d41a404323b Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 11 Apr 2017 18:31:02 +1200 Subject: [PATCH 0027/1062] torcontrol: Add missing copyright header --- src/torcontrol.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/torcontrol.cpp b/src/torcontrol.cpp index b2f229cba..d43a8823e 100644 --- a/src/torcontrol.cpp +++ b/src/torcontrol.cpp @@ -1,3 +1,8 @@ +// Copyright (c) 2015-2017 The Bitcoin Core developers +// Copyright (c) 2017 The Zcash developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + #include "torcontrol.h" #include "utilstrencodings.h" #include "net.h" From a2e20e9ac6021d6d5f0f1cef440e1cbce216ed80 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 9 Mar 2017 10:48:24 +1300 Subject: [PATCH 0028/1062] Convert Zcash versions to Debian format --- doc/release-process.md | 2 +- zcutil/build-debian-package.sh | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/release-process.md b/doc/release-process.md index f86e59933..3288ce9ec 100644 --- a/doc/release-process.md +++ b/doc/release-process.md @@ -81,7 +81,7 @@ Add the newly created release notes to the Git repository: Update the Debian package changelog: - export DEBVERSION="${ZCASH_RELEASE}" + export DEBVERSION=$(echo $ZCASH_RELEASE | sed 's/-beta/~beta/' | sed 's/-rc/~rc/' | sed 's/-/+/') export DEBEMAIL="${DEBEMAIL:-team@z.cash}" export DEBFULLNAME="${DEBFULLNAME:-Zcash Company}" diff --git a/zcutil/build-debian-package.sh b/zcutil/build-debian-package.sh index 8c2d05c3f..694b74929 100755 --- a/zcutil/build-debian-package.sh +++ b/zcutil/build-debian-package.sh @@ -18,6 +18,7 @@ if [ ! -d $BUILD_PATH ]; then fi PACKAGE_VERSION=$($SRC_PATH/src/zcashd --version | grep version | cut -d' ' -f4 | tr -d v) +DEBVERSION=$(echo $PACKAGE_VERSION | sed 's/-beta/~beta/' | sed 's/-rc/~rc/' | sed 's/-/+/') BUILD_DIR="$BUILD_PATH/$PACKAGE_NAME-$PACKAGE_VERSION-amd64" if [ -d $BUILD_DIR ]; then @@ -63,7 +64,7 @@ cd $SRC_PATH/contrib # Create the control file dpkg-shlibdeps $DEB_BIN/zcashd $DEB_BIN/zcash-cli -dpkg-gencontrol -P$BUILD_DIR +dpkg-gencontrol -P$BUILD_DIR -v$DEBVERSION # Create the Debian package fakeroot dpkg-deb --build $BUILD_DIR From 2bf4f2781b7f94114df32005035c36a1561e9d61 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 19 Apr 2017 13:56:32 +1200 Subject: [PATCH 0029/1062] [manpage] Handle build numbers in versions --- contrib/devtools/gen-manpages.sh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/contrib/devtools/gen-manpages.sh b/contrib/devtools/gen-manpages.sh index 245714814..be54bc1dd 100755 --- a/contrib/devtools/gen-manpages.sh +++ b/contrib/devtools/gen-manpages.sh @@ -11,7 +11,9 @@ ZCASHTX=${ZCASHTX:-$SRCDIR/zcash-tx} [ ! -x $ZCASHD ] && echo "$ZCASHD not found or not executable." && exit 1 # The autodetected version git tag can screw up manpage output a little bit -ZECVER=($($ZCASHCLI --version | head -n1 | awk -F'[ -]' '{ print $5, $6 }')) +ZECVERSTR=$($ZCASHCLI --version | head -n1 | awk '{ print $NF }') +ZECVER=$(echo $ZECVERSTR | awk -F- '{ OFS="-"; NF--; print $0; }') +ZECCOMMIT=$(echo $ZECVERSTR | awk -F- '{ print $NF }') # Create a footer file with copyright content. # This gets autodetected fine for zcashd if --version-string is not set, @@ -21,8 +23,8 @@ $ZCASHD --version | sed -n '1!p' >> footer.h2m for cmd in $ZCASHD $ZCASHCLI $ZCASHTX; do cmdname="${cmd##*/}" - help2man -N --version-string=${ZECVER[0]} --include=footer.h2m -o ${MANDIR}/${cmdname}.1 ${cmd} - sed -i "s/\\\-${ZECVER[1]}//g" ${MANDIR}/${cmdname}.1 + help2man -N --version-string=$ZECVER --include=footer.h2m -o ${MANDIR}/${cmdname}.1 ${cmd} + sed -i "s/\\\-$ZECCOMMIT//g" ${MANDIR}/${cmdname}.1 done rm -f footer.h2m From 0b431fbdb507f5bfb34bba8014963c23856f2b71 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 19 Apr 2017 15:23:28 +1200 Subject: [PATCH 0030/1062] Address Daira's comments --- src/test/torcontrol_tests.cpp | 5 +++++ src/torcontrol.cpp | 13 +++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/test/torcontrol_tests.cpp b/src/test/torcontrol_tests.cpp index 8d3bb8f77..608991250 100644 --- a/src/test/torcontrol_tests.cpp +++ b/src/test/torcontrol_tests.cpp @@ -150,6 +150,11 @@ BOOST_AUTO_TEST_CASE(util_ParseTorReplyMapping) {"Octals", "\1a\11\17\1" "881\377\37" "8400"}, {"Final", "Check"}, }); + CheckParseTorReplyMapping( + "Valid=Mapping Escaped=\"Escape\\\\\"", { + {"Valid", "Mapping"}, + {"Escaped", "Escape\\"}, + }); CheckParseTorReplyMapping( "Valid=Mapping Bare=\"Escape\\\"", {}); CheckParseTorReplyMapping( diff --git a/src/torcontrol.cpp b/src/torcontrol.cpp index d43a8823e..4ca6f8571 100644 --- a/src/torcontrol.cpp +++ b/src/torcontrol.cpp @@ -290,7 +290,8 @@ static std::map ParseTorReplyMapping(const std::string ++ptr; // skip opening '"' bool escape_next = false; while (ptr < s.size() && (escape_next || s[ptr] != '"')) { - escape_next = (s[ptr] == '\\'); + // Repeated backslashes must be interpreted as pairs + escape_next = (s[ptr] == '\\' && !escape_next); value.push_back(s[ptr]); ++ptr; } @@ -298,7 +299,7 @@ static std::map ParseTorReplyMapping(const std::string return std::map(); ++ptr; // skip closing '"' /** - * Escape value. Per https://spec.torproject.org/control-spec section 2.1.1: + * Unescape value. Per https://spec.torproject.org/control-spec section 2.1.1: * * For future-proofing, controller implementors MAY use the following * rules to be compatible with buggy Tor implementations and with @@ -310,10 +311,10 @@ static std::map ParseTorReplyMapping(const std::string std::string escaped_value; for (size_t i = 0; i < value.size(); ++i) { if (value[i] == '\\') { - // This will always be valid, because if the final character - // in the QuotedString was a \ then the parser would already - // have returned above, due to a missing terminating - // double-quote. + // This will always be valid, because if the QuotedString + // ended in an odd number of backslashes, then the parser + // would already have returned above, due to a missing + // terminating double-quote. ++i; if (value[i] == 'n') { escaped_value.push_back('\n'); From d15cab21bc7218f3812bdbf5714be77205b4bd2a Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 21 Apr 2017 13:15:39 +1200 Subject: [PATCH 0031/1062] Address Daira's further comments --- src/test/torcontrol_tests.cpp | 10 ++++++++++ src/torcontrol.cpp | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/test/torcontrol_tests.cpp b/src/test/torcontrol_tests.cpp index 608991250..2a4457721 100644 --- a/src/test/torcontrol_tests.cpp +++ b/src/test/torcontrol_tests.cpp @@ -163,6 +163,16 @@ BOOST_AUTO_TEST_CASE(util_ParseTorReplyMapping) {"TwoOctal", "TwoEnd\11"}, }); + // Special handling for null case + // (needed because string comparison reads the null as end-of-string) + BOOST_TEST_MESSAGE(std::string("CheckParseTorReplyMapping(Null=\"\\0\")")); + auto ret = ParseTorReplyMapping("Null=\"\\0\""); + BOOST_CHECK_EQUAL(ret.size(), 1); + auto r_it = ret.begin(); + BOOST_CHECK_EQUAL(r_it->first, "Null"); + BOOST_CHECK_EQUAL(r_it->second.size(), 1); + BOOST_CHECK_EQUAL(r_it->second[0], '\0'); + // A more complex valid grammar. PROTOCOLINFO accepts a VersionLine that // takes a key=value pair followed by an OptArguments, making this valid. // Because an OptArguments contains no semantic data, there is no point in diff --git a/src/torcontrol.cpp b/src/torcontrol.cpp index 4ca6f8571..446d4402a 100644 --- a/src/torcontrol.cpp +++ b/src/torcontrol.cpp @@ -327,7 +327,7 @@ static std::map ParseTorReplyMapping(const std::string // Octal escape sequences have a limit of three octal digits, // but terminate at the first character that is not a valid // octal digit if encountered sooner. - for (j = 1; '0' <= value[i+j] && value[i+j] <= '7' && j < 3; ++j) {} + for (j = 1; j < 3 && (i+j) < value.size() && '0' <= value[i+j] && value[i+j] <= '7'; ++j) {} // Tor restricts first digit to 0-3 for three-digit octals. if (j < 3 || ('0' <= value[i] && value[i] <= '3')) { escaped_value.push_back(strtol(value.substr(i, j).c_str(), NULL, 8)); From 8df5fd1116b93c08614c05790d5c3d905ed64b82 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 21 Apr 2017 13:22:51 +1200 Subject: [PATCH 0032/1062] Correctly handle three-digit octals with leading digit 4-7 --- src/test/torcontrol_tests.cpp | 2 +- src/torcontrol.cpp | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/test/torcontrol_tests.cpp b/src/test/torcontrol_tests.cpp index 2a4457721..5624c818c 100644 --- a/src/test/torcontrol_tests.cpp +++ b/src/test/torcontrol_tests.cpp @@ -147,7 +147,7 @@ BOOST_AUTO_TEST_CASE(util_ParseTorReplyMapping) "Foo=\"Bar\\nBaz\\t\" Spam=\"\\rEggs\" Octals=\"\\1a\\11\\17\\18\\81\\377\\378\\400\" Final=Check", { {"Foo", "Bar\nBaz\t"}, {"Spam", "\rEggs"}, - {"Octals", "\1a\11\17\1" "881\377\37" "8400"}, + {"Octals", "\1a\11\17\1" "881\377\37" "8\40" "0"}, {"Final", "Check"}, }); CheckParseTorReplyMapping( diff --git a/src/torcontrol.cpp b/src/torcontrol.cpp index 446d4402a..a5cd1b7c6 100644 --- a/src/torcontrol.cpp +++ b/src/torcontrol.cpp @@ -329,13 +329,14 @@ static std::map ParseTorReplyMapping(const std::string // octal digit if encountered sooner. for (j = 1; j < 3 && (i+j) < value.size() && '0' <= value[i+j] && value[i+j] <= '7'; ++j) {} // Tor restricts first digit to 0-3 for three-digit octals. - if (j < 3 || ('0' <= value[i] && value[i] <= '3')) { - escaped_value.push_back(strtol(value.substr(i, j).c_str(), NULL, 8)); - // Account for automatic incrementing at loop end - i += j - 1; - } else { - escaped_value.push_back(value[i]); + // A leading digit of 4-7 would therefore be interpreted as + // a two-digit octal. + if (j == 3 && value[i] > '3') { + j--; } + escaped_value.push_back(strtol(value.substr(i, j).c_str(), NULL, 8)); + // Account for automatic incrementing at loop end + i += j - 1; } else { escaped_value.push_back(value[i]); } From 409606118b547c729691b9caa504287766096fc2 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 21 Apr 2017 13:23:29 +1200 Subject: [PATCH 0033/1062] Check that >3-digit octals are truncated. --- src/test/torcontrol_tests.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/torcontrol_tests.cpp b/src/test/torcontrol_tests.cpp index 5624c818c..b7affaacd 100644 --- a/src/test/torcontrol_tests.cpp +++ b/src/test/torcontrol_tests.cpp @@ -144,10 +144,10 @@ BOOST_AUTO_TEST_CASE(util_ParseTorReplyMapping) // C escapes CheckParseTorReplyMapping( - "Foo=\"Bar\\nBaz\\t\" Spam=\"\\rEggs\" Octals=\"\\1a\\11\\17\\18\\81\\377\\378\\400\" Final=Check", { + "Foo=\"Bar\\nBaz\\t\" Spam=\"\\rEggs\" Octals=\"\\1a\\11\\17\\18\\81\\377\\378\\400\\2222\" Final=Check", { {"Foo", "Bar\nBaz\t"}, {"Spam", "\rEggs"}, - {"Octals", "\1a\11\17\1" "881\377\37" "8\40" "0"}, + {"Octals", "\1a\11\17\1" "881\377\37" "8\40" "0\222" "2"}, {"Final", "Check"}, }); CheckParseTorReplyMapping( From fa151bc51747ba9f9b8864daa245644ae627bb8b Mon Sep 17 00:00:00 2001 From: Daira Hopwood Date: Mon, 24 Apr 2017 19:42:12 +0100 Subject: [PATCH 0034/1062] Alert 1002 (versions 1.0.0-1.0.2 inclusive). Signed-off-by: Daira Hopwood --- src/sendalert.cpp | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/sendalert.cpp b/src/sendalert.cpp index fbe6dc03a..94f864bdb 100644 --- a/src/sendalert.cpp +++ b/src/sendalert.cpp @@ -71,9 +71,9 @@ void ThreadSendAlert() // CAlert alert; alert.nRelayUntil = GetTime() + 15 * 60; - alert.nExpiration = GetTime() + 90 * 24 * 60 * 60; - alert.nID = 1001; // use https://github.com/zcash/zcash/wiki/specification#assigned-numbers to keep track of alert IDs - alert.nCancel = 0; // cancels previous messages up to this ID number + alert.nExpiration = GetTime() + 20 * 365 * 24 * 60 * 60; + alert.nID = 1002; // use https://github.com/zcash/zcash/wiki/specification#assigned-numbers to keep track of alert IDs + alert.nCancel = 1000; // cancels previous messages up to this ID number // These versions are protocol versions // 170002 : 1.0.0 @@ -81,19 +81,25 @@ void ThreadSendAlert() alert.nMaxVer = 170002; // - // main.cpp: + // main.cpp: // 1000 for Misc warnings like out of disk space and clock is wrong - // 2000 for longer invalid proof-of-work chain + // 2000 for longer invalid proof-of-work chain // Higher numbers mean higher priority // 4000 or higher will put the RPC into safe mode - alert.nPriority = 1500; + alert.nPriority = 4000; alert.strComment = ""; - alert.strStatusBar = "Your client is out of date and potentially vulnerable to denial of service. Please update to the most recent version of Zcash (1.0.5). More info at: https://z.cash/support/security.html"; - alert.strRPCError = "Your client is out of date and potentially vulnerable to denial of service. Please update to the most recent version of Zcash (1.0.5). More info at: https://z.cash/support/security.html"; + alert.strStatusBar = "Your client is out of date and potentially vulnerable to blockchain disruption. Please update to the most recent version of Zcash and use -reindex to ensure integrity of your blockchain state. More info at: https://z.cash/support/security/"; + alert.strRPCError = alert.strStatusBar; // Set specific client version/versions here. If setSubVer is empty, no filtering on subver is done: // alert.setSubVer.insert(std::string("/MagicBean:0.7.2/")); - alert.setSubVer.insert(std::string("/MagicBean:1.0.3/")); + const std::vector useragents = {"MagicBean", "BeanStalk", "AppleSeed", "EleosZcash"}; + + BOOST_FOREACH(const std::string& useragent, useragents) { + alert.setSubVer.insert(std::string("/"+useragent+":1.0.0/")); + alert.setSubVer.insert(std::string("/"+useragent+":1.0.1/")); + alert.setSubVer.insert(std::string("/"+useragent+":1.0.2/")); + } // Sanity check assert(alert.strComment.length() <= 65536); // max length in alert.h From 8d8318c9476bf47c48b025a0a988d22ded57ac69 Mon Sep 17 00:00:00 2001 From: Daira Hopwood Date: Mon, 24 Apr 2017 19:55:20 +0100 Subject: [PATCH 0035/1062] Alert 1003 (versions 1.0.3-1.0.8 inclusive). Signed-off-by: Daira Hopwood --- src/sendalert.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/sendalert.cpp b/src/sendalert.cpp index 94f864bdb..f4935212f 100644 --- a/src/sendalert.cpp +++ b/src/sendalert.cpp @@ -71,9 +71,9 @@ void ThreadSendAlert() // CAlert alert; alert.nRelayUntil = GetTime() + 15 * 60; - alert.nExpiration = GetTime() + 20 * 365 * 24 * 60 * 60; - alert.nID = 1002; // use https://github.com/zcash/zcash/wiki/specification#assigned-numbers to keep track of alert IDs - alert.nCancel = 1000; // cancels previous messages up to this ID number + alert.nExpiration = GetTime() + 6 * 30 * 24 * 60 * 60; + alert.nID = 1003; // use https://github.com/zcash/zcash/wiki/specification#assigned-numbers to keep track of alert IDs + alert.nCancel = 1001; // cancels previous messages up to this ID number // These versions are protocol versions // 170002 : 1.0.0 @@ -86,9 +86,9 @@ void ThreadSendAlert() // 2000 for longer invalid proof-of-work chain // Higher numbers mean higher priority // 4000 or higher will put the RPC into safe mode - alert.nPriority = 4000; + alert.nPriority = 1500; alert.strComment = ""; - alert.strStatusBar = "Your client is out of date and potentially vulnerable to blockchain disruption. Please update to the most recent version of Zcash and use -reindex to ensure integrity of your blockchain state. More info at: https://z.cash/support/security/"; + alert.strStatusBar = "Your client is out of date and vulnerable to denial of service. Please update to the most recent version of Zcash (1.0.8-1 or later). More info at: https://z.cash/support/security/"; alert.strRPCError = alert.strStatusBar; // Set specific client version/versions here. If setSubVer is empty, no filtering on subver is done: @@ -96,9 +96,13 @@ void ThreadSendAlert() const std::vector useragents = {"MagicBean", "BeanStalk", "AppleSeed", "EleosZcash"}; BOOST_FOREACH(const std::string& useragent, useragents) { - alert.setSubVer.insert(std::string("/"+useragent+":1.0.0/")); - alert.setSubVer.insert(std::string("/"+useragent+":1.0.1/")); - alert.setSubVer.insert(std::string("/"+useragent+":1.0.2/")); + alert.setSubVer.insert(std::string("/"+useragent+":1.0.3/")); + alert.setSubVer.insert(std::string("/"+useragent+":1.0.4/")); + alert.setSubVer.insert(std::string("/"+useragent+":1.0.5/")); + alert.setSubVer.insert(std::string("/"+useragent+":1.0.6/")); + alert.setSubVer.insert(std::string("/"+useragent+":1.0.7/")); + alert.setSubVer.insert(std::string("/"+useragent+":1.0.7-1/")); + alert.setSubVer.insert(std::string("/"+useragent+":1.0.8/")); } // Sanity check From b9f6e40c9c1b57a36ad8d45b36d036c918580584 Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 27 Apr 2017 18:11:24 -0700 Subject: [PATCH 0036/1062] Patch to build Proton with minimal dependencies. Closes #2279. Configures CMake to enable C++11, build static libaries and only build cpp bindings with minimal dependencies. Documentation, examples, tests and other language bindings are no longer built. CMake will no longer try to find commands and packages which are not required for building the target. --- depends/packages/proton.mk | 16 +- depends/patches/proton/minimal-build.patch | 288 +++++++++++++++++++++ 2 files changed, 292 insertions(+), 12 deletions(-) create mode 100644 depends/patches/proton/minimal-build.patch diff --git a/depends/packages/proton.mk b/depends/packages/proton.mk index b898a6662..aa49f380f 100644 --- a/depends/packages/proton.mk +++ b/depends/packages/proton.mk @@ -3,23 +3,15 @@ $(package)_version=0.17.0 $(package)_download_path=http://apache.cs.utah.edu/qpid/proton/$($(package)_version) $(package)_file_name=qpid-proton-$($(package)_version).tar.gz $(package)_sha256_hash=6ffd26d3d0e495bfdb5d9fefc5349954e6105ea18cc4bb191161d27742c5a01a -$(package)_dependencies= +$(package)_patches=minimal-build.patch define $(package)_preprocess_cmds - sed -i '1i set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")' proton-c/bindings/cpp/CMakeLists.txt && \ - sed -i '1i set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")' examples/cpp/CMakeLists.txt && \ - sed -i '1i set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")' CMakeLists.txt && \ - sed -i.old 's/qpid-proton SHARED/qpid-proton STATIC/' proton-c/CMakeLists.txt && \ - sed -i.old 's/SASL/_DO_NOT_BUILD_SASL_/' proton-c/CMakeLists.txt && \ - sed -i.old 's/qpid-proton-core SHARED/qpid-proton-core STATIC/' proton-c/CMakeLists.txt && \ - sed -i.old 's/find_package(OpenSSL)/#find_package(OpenSSL)/' proton-c/CMakeLists.txt && \ - sed -i.old 's/qpid-proton-cpp SHARED/qpid-proton-cpp STATIC/' proton-c/bindings/cpp/CMakeLists.txt && \ - sed -i.old 's/DEFAULT_GO ON/DEFAULT_GO OFF/' proton-c/bindings/CMakeLists.txt && \ - mkdir build + patch -p1 < $($(package)_patch_dir)/minimal-build.patch && \ + mkdir -p build/proton-c/src endef define $(package)_config_cmds - cd build; cmake .. -DCMAKE_CXX_STANDARD=11 -DCMAKE_INSTALL_PREFIX=/ -DSYSINSTALL_BINDINGS=ON -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DBUILD_PYTHON=OFF -DBUILD_PHP=OFF -DBUILD_JAVA=OFF -DBUILD_PERL=OFF -DBUILD_RUBY=OFF -DDEFAULT_GO=OFF + cd build; cmake .. -DCMAKE_CXX_STANDARD=11 -DCMAKE_INSTALL_PREFIX=/ -DSYSINSTALL_BINDINGS=ON -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DBUILD_PYTHON=OFF -DBUILD_PHP=OFF -DBUILD_JAVA=OFF -DBUILD_PERL=OFF -DBUILD_RUBY=OFF -DBUILD_JAVASCRIPT=OFF -DBUILD_GO=OFF endef define $(package)_build_cmds diff --git a/depends/patches/proton/minimal-build.patch b/depends/patches/proton/minimal-build.patch new file mode 100644 index 000000000..90588929f --- /dev/null +++ b/depends/patches/proton/minimal-build.patch @@ -0,0 +1,288 @@ +From 03f5fc0826115edbfca468261b70c0daf627f488 Mon Sep 17 00:00:00 2001 +From: Simon +Date: Thu, 27 Apr 2017 17:15:59 -0700 +Subject: [PATCH] Enable C++11, build static library and cpp bindings with minimal dependencies. + +--- + CMakeLists.txt | 13 +++++++------ + examples/cpp/CMakeLists.txt | 1 + + proton-c/CMakeLists.txt | 32 +++++++++++++++---------------- + proton-c/bindings/CMakeLists.txt | 6 +++--- + proton-c/bindings/cpp/CMakeLists.txt | 24 +++++++++++------------ + proton-c/bindings/cpp/docs/CMakeLists.txt | 2 +- + proton-c/docs/api/CMakeLists.txt | 2 +- + 7 files changed, 41 insertions(+), 39 deletions(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index b538ffd..4a5e787 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -18,14 +18,15 @@ + # + cmake_minimum_required (VERSION 2.8.7) + ++set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") + project (Proton C) + + # Enable C++ now for examples and bindings subdirectories, but make it optional. + enable_language(CXX OPTIONAL) + + # Enable testing +-enable_testing() +-include (CTest) ++#enable_testing() ++#include (CTest) + + # Pull in local cmake modules + set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/tools/cmake/Modules/") +@@ -141,7 +142,7 @@ set (BINDINGS_DIR ${LIB_INSTALL_DIR}/proton/bindings) + + set (SYSINSTALL_BINDINGS OFF CACHE BOOL "If SYSINSTALL_BINDINGS is OFF then proton bindings will be installed underneath ${BINDINGS_DIR} and each user will need to modify their interpreter configuration to load the appropriate binding. If SYSINSTALL_BINDINGS is ON, then each language interpreter will be queried for the appropriate directory and proton bindings will be installed and available system wide with no additional per user configuration.") + +-set (BINDING_LANGS PERL PHP PYTHON RUBY) ++#set (BINDING_LANGS PERL PHP PYTHON RUBY) + + foreach (LANG ${BINDING_LANGS}) + set (SYSINSTALL_${LANG} OFF CACHE BOOL "Install ${LANG} bindings into interpreter specified location.") +@@ -156,10 +157,10 @@ set (PROTON_SHARE ${SHARE_INSTALL_DIR}/proton-${PN_VERSION}) + # End of variables used during install + + # Check for valgrind here so tests under proton-c/ and examples/ can use it. +-find_program(VALGRIND_EXE valgrind DOC "Location of the valgrind program") ++#find_program(VALGRIND_EXE valgrind DOC "Location of the valgrind program") + mark_as_advanced (VALGRIND_EXE) + +-option(ENABLE_VALGRIND "Use valgrind to detect run-time problems" ON) ++#option(ENABLE_VALGRIND "Use valgrind to detect run-time problems" ON) + if (ENABLE_VALGRIND) + if (NOT VALGRIND_EXE) + message(STATUS "Can't locate the valgrind command; no run-time error detection") +@@ -171,7 +172,7 @@ if (ENABLE_VALGRIND) + endif (ENABLE_VALGRIND) + + add_subdirectory(proton-c) +-add_subdirectory(examples) ++#add_subdirectory(examples) + + install (FILES LICENSE README.md + DESTINATION ${PROTON_SHARE}) +diff --git a/examples/cpp/CMakeLists.txt b/examples/cpp/CMakeLists.txt +index 304d899..f4877b4 100644 +--- a/examples/cpp/CMakeLists.txt ++++ b/examples/cpp/CMakeLists.txt +@@ -17,6 +17,7 @@ + # under the License. + # + ++set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") + find_package(ProtonCpp REQUIRED) + + include_directories(${ProtonCpp_INCLUDE_DIRS}) +diff --git a/proton-c/CMakeLists.txt b/proton-c/CMakeLists.txt +index 8edb661..dc7b99c 100644 +--- a/proton-c/CMakeLists.txt ++++ b/proton-c/CMakeLists.txt +@@ -22,24 +22,24 @@ include(CheckSymbolExists) + + include(soversion.cmake) + +-add_custom_target(docs) +-add_custom_target(doc DEPENDS docs) ++#add_custom_target(docs) ++#add_custom_target(doc DEPENDS docs) + + # Set the default SSL/TLS implementation +-find_package(OpenSSL) ++#find_package(OpenSSL) + find_package(PythonInterp REQUIRED) +-find_package(SWIG) ++#find_package(SWIG) + # FindSwig.cmake "forgets" make its outputs advanced like a good citizen + mark_as_advanced(SWIG_DIR SWIG_EXECUTABLE SWIG_VERSION) + + # See if Cyrus SASL is available +-find_library(CYRUS_SASL_LIBRARY sasl2) +-find_path(CYRUS_SASL_INCLUDE_DIR sasl/sasl.h PATH_SUFFIXES include) +-find_package_handle_standard_args(CyrusSASL DEFAULT_MSG CYRUS_SASL_LIBRARY CYRUS_SASL_INCLUDE_DIR) ++#find_library(CYRUS_SASL_LIBRARY sasl2) ++#find_path(CYRUS_SASL_INCLUDE_DIR sasl/sasl.h PATH_SUFFIXES include) ++#find_package_handle_standard_args(CyrusSASL DEFAULT_MSG CYRUS_SASL_LIBRARY CYRUS_SASL_INCLUDE_DIR) + mark_as_advanced(CYRUS_SASL_LIBRARY CYRUS_SASL_INCLUDE_DIR) + + # Find saslpasswd2 executable to generate test config +-find_program(SASLPASSWD_EXE saslpasswd2 DOC "Program used to make SASL user db for testing") ++#find_program(SASLPASSWD_EXE saslpasswd2 DOC "Program used to make SASL user db for testing") + mark_as_advanced(SASLPASSWD_EXE) + + if(WIN32 AND NOT CYGWIN) +@@ -315,8 +315,8 @@ pn_absolute_install_dir(EXEC_PREFIX "." ${CMAKE_INSTALL_PREFIX}) + pn_absolute_install_dir(LIBDIR ${LIB_INSTALL_DIR} ${CMAKE_INSTALL_PREFIX}) + pn_absolute_install_dir(INCLUDEDIR ${INCLUDE_INSTALL_DIR} ${CMAKE_INSTALL_PREFIX}) + +-add_subdirectory(docs/api) +-add_subdirectory(../tests/tools/apps/c ../tests/tools/apps/c) ++#add_subdirectory(docs/api) ++#add_subdirectory(../tests/tools/apps/c ../tests/tools/apps/c) + + # for full source distribution: + set (qpid-proton-platform-all +@@ -507,7 +507,7 @@ if (BUILD_WITH_CXX) + endif (BUILD_WITH_CXX) + + add_library ( +- qpid-proton-core SHARED ++ qpid-proton-core STATIC + ${qpid-proton-core} + ${qpid-proton-layers} + ${qpid-proton-platform} +@@ -527,7 +527,7 @@ set_target_properties ( + ) + + add_library( +- qpid-proton SHARED ++ qpid-proton STATIC + # Proton Core + ${qpid-proton-core} + ${qpid-proton-layers} +@@ -629,7 +629,7 @@ install (FILES + + # c tests: + +-add_subdirectory(src/tests) ++#add_subdirectory(src/tests) + + if (CMAKE_SYSTEM_NAME STREQUAL Windows) + # No change needed for windows already use correct separator +@@ -712,7 +712,7 @@ if (BUILD_PYTHON) + + endif (BUILD_PYTHON) + +-find_program(RUBY_EXE "ruby") ++#find_program(RUBY_EXE "ruby") + if (RUBY_EXE AND BUILD_RUBY) + set (rb_root "${pn_test_root}/ruby") + set (rb_src "${CMAKE_CURRENT_SOURCE_DIR}/bindings/ruby") +@@ -751,8 +751,8 @@ if (RUBY_EXE AND BUILD_RUBY) + else (DEFAULT_RUBY_TESTING) + message(STATUS "Skipping Ruby tests: missing dependencies") + endif (DEFAULT_RUBY_TESTING) +-else (RUBY_EXE) +- message (STATUS "Cannot find ruby, skipping ruby tests") ++#else (RUBY_EXE) ++# message (STATUS "Cannot find ruby, skipping ruby tests") + endif() + + mark_as_advanced (RUBY_EXE RSPEC_EXE) +diff --git a/proton-c/bindings/CMakeLists.txt b/proton-c/bindings/CMakeLists.txt +index 6b88384..d1a50a5 100644 +--- a/proton-c/bindings/CMakeLists.txt ++++ b/proton-c/bindings/CMakeLists.txt +@@ -19,14 +19,14 @@ + + # Add bindings that do not require swig here - the directory name must be the same as the binding name + # See below for swig bindings +-set(BINDINGS javascript cpp go) ++set(BINDINGS cpp) + + # Prerequisites for javascript. + # + # It uses a C/C++ to JavaScript cross-compiler called emscripten (https://github.com/kripken/emscripten). Emscripten takes C/C++ + # and compiles it into a highly optimisable subset of JavaScript called asm.js (http://asmjs.org/) that can be + # aggressively optimised and run at near-native speed (usually between 1.5 to 10 times slower than native C/C++). +-find_package(Emscripten) ++#find_package(Emscripten) + if (EMSCRIPTEN_FOUND) + set (DEFAULT_JAVASCRIPT ON) + endif (EMSCRIPTEN_FOUND) +@@ -37,7 +37,7 @@ if (CMAKE_CXX_COMPILER) + endif (CMAKE_CXX_COMPILER) + + # Prerequisites for Go +-find_program(GO_EXE go) ++#find_program(GO_EXE go) + mark_as_advanced(GO_EXE) + if (GO_EXE) + if(WIN32) +diff --git a/proton-c/bindings/cpp/CMakeLists.txt b/proton-c/bindings/cpp/CMakeLists.txt +index 0cc4024..796fe29 100644 +--- a/proton-c/bindings/cpp/CMakeLists.txt ++++ b/proton-c/bindings/cpp/CMakeLists.txt +@@ -16,7 +16,7 @@ + # specific language governing permissions and limitations + # under the License. + # +- ++set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") + include(cpp.cmake) # Compiler checks + + include_directories( +@@ -89,7 +89,7 @@ set_source_files_properties ( + COMPILE_FLAGS "${LTO}" + ) + +-add_library(qpid-proton-cpp SHARED ${qpid-proton-cpp-source}) ++add_library(qpid-proton-cpp STATIC ${qpid-proton-cpp-source}) + + target_link_libraries (qpid-proton-cpp ${PLATFORM_LIBS} qpid-proton) + +@@ -120,8 +120,8 @@ endif (MSVC) + + install (DIRECTORY "include/proton" DESTINATION ${INCLUDE_INSTALL_DIR} FILES_MATCHING PATTERN "*.hpp") + +-add_subdirectory(docs) +-add_subdirectory(${CMAKE_SOURCE_DIR}/tests/tools/apps/cpp ${CMAKE_BINARY_DIR}/tests/tools/apps/cpp) ++#add_subdirectory(docs) ++#add_subdirectory(${CMAKE_SOURCE_DIR}/tests/tools/apps/cpp ${CMAKE_BINARY_DIR}/tests/tools/apps/cpp) + + # Pkg config file + configure_file( +@@ -171,12 +171,12 @@ macro(add_cpp_test test) + endif () + endmacro(add_cpp_test) + +-add_cpp_test(codec_test) ++#add_cpp_test(codec_test) + #add_cpp_test(engine_test) +-add_cpp_test(thread_safe_test) +-add_cpp_test(interop_test ${CMAKE_SOURCE_DIR}/tests) +-add_cpp_test(message_test) +-add_cpp_test(scalar_test) +-add_cpp_test(value_test) +-add_cpp_test(container_test) +-add_cpp_test(url_test) ++#add_cpp_test(thread_safe_test) ++#add_cpp_test(interop_test ${CMAKE_SOURCE_DIR}/tests) ++#add_cpp_test(message_test) ++#add_cpp_test(scalar_test) ++#add_cpp_test(value_test) ++#add_cpp_test(container_test) ++#add_cpp_test(url_test) +diff --git a/proton-c/bindings/cpp/docs/CMakeLists.txt b/proton-c/bindings/cpp/docs/CMakeLists.txt +index d512d15..8576867 100644 +--- a/proton-c/bindings/cpp/docs/CMakeLists.txt ++++ b/proton-c/bindings/cpp/docs/CMakeLists.txt +@@ -17,7 +17,7 @@ + # under the License. + # + +-find_package(Doxygen) ++#find_package(Doxygen) + + if (DOXYGEN_FOUND) + configure_file ( +diff --git a/proton-c/docs/api/CMakeLists.txt b/proton-c/docs/api/CMakeLists.txt +index 7756e48..71ebb93 100644 +--- a/proton-c/docs/api/CMakeLists.txt ++++ b/proton-c/docs/api/CMakeLists.txt +@@ -17,7 +17,7 @@ + # under the License. + # + +-find_package(Doxygen) ++#find_package(Doxygen) + if (DOXYGEN_FOUND) + configure_file (${CMAKE_CURRENT_SOURCE_DIR}/user.doxygen.in + ${CMAKE_CURRENT_BINARY_DIR}/user.doxygen) +-- +2.7.4 + From bed9dd2cd28253a315ea00aaf5e6dc9af7cd25f6 Mon Sep 17 00:00:00 2001 From: Amgad Abdelhafez Date: Tue, 2 May 2017 19:33:52 -0400 Subject: [PATCH 0037/1062] Update timedata.cpp Changing error message string from botcoin core to zcash --- src/timedata.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/timedata.cpp b/src/timedata.cpp index a14d69c11..8a579a3d3 100644 --- a/src/timedata.cpp +++ b/src/timedata.cpp @@ -99,7 +99,7 @@ void AddTimeData(const CNetAddr& ip, int64_t nOffsetSample) if (!fMatch) { fDone = true; - string strMessage = _("Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly."); + string strMessage = _("Warning: Please check that your computer's date and time are correct! If your clock is wrong zcash will not work properly."); strMiscWarning = strMessage; LogPrintf("*** %s\n", strMessage); uiInterface.ThreadSafeMessageBox(strMessage, "", CClientUIInterface::MSG_WARNING); From d5cdb0519a8dc28d0396eff94feb28303ddc5ef6 Mon Sep 17 00:00:00 2001 From: Paige Peterson Date: Wed, 3 May 2017 21:25:06 -0400 Subject: [PATCH 0038/1062] wallet backup instructions --- doc/wallet-backup.md | 85 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 doc/wallet-backup.md diff --git a/doc/wallet-backup.md b/doc/wallet-backup.md new file mode 100644 index 000000000..88d60e3c0 --- /dev/null +++ b/doc/wallet-backup.md @@ -0,0 +1,85 @@ +# Wallet Backup Instructions + +## Overview + +Backing up your Zcash private keys is the best way to be proactive about preventing loss of access to your ZEC. + +Problems resulting from bugs in the code, user error, device failure, etc. may lead to losing access to your wallet (and as a result, the private keys of addresses which are required to spend from them). + +No matter what the cause of a corrupted or lost wallet could be, we highly recommend all users backup on a regular basis. Anytime a new address in the wallet is generated, we recommending making a new backup so all private keys for addresses in your wallet are safe. + +Note that a backup is a duplicate of data needed to spend ZEC so where you keep your backup(s) is another important consideration. You should not store backups where they would be equally or increasingly susceptible to loss or theft. + +## Instructions for backing up your wallet and/or private keys + +These instructions are specific for the officially supported Zcash Linux client. For backing up with third-party wallets, please consult with user guides or support channels provided for those services. + +There are multiple ways to make sure you have at least one other copy of the private keys needed to spend ZEC and view shielded ZEC. + +For all methods, you will need to include an export directory setting in your config file (`zcash.conf` located in the data directory which is `~/.zcash/` unless it's been overridden with `datadir=` setting): + +`exportdir=/path/to/chosen/export/directory` + +You may chose any directory as the location for export & backup files. If the directory doesn't exist, it will be created. + +### Using `backupwallet` + +To create a backup of your wallet, use: + +`zcash-cli backupwallet `. + +The backup will be an exact copy of the current state of your wallet.dat file stored in the export directory you specified in the config file. The file path will also be returned. + +If you generate a new Zcash address, it will not be included in the backup file. + +If your original `wallet.dat` file becomes inaccessible for whatever reason, you can use your backup by placing it into your data directory and renaming it to `wallet.dat`. + +### Using `z_exportwallet` & `z_importwallet` + +If you prefer to have an export of your private keys in human readable format, you can use: + +`zcash-cli z_exportwallet ` + +This will generate a text file in the export directory with all transparent and shielded private keys with their associated public addresses. It will also return the file path. + +To import keys into a wallet which were previously exported to a file, use: + +`zcash-cli z_importwallet ` + +### Using `z_exportkey`, `z_importkey`, `dumpprivkey` & `importprivkey` + +If you prefer to export a single private key for a shielded address, you can use: + +`zcash-cli z_exportkey ` + +This will return the private key and will not create a new file. + +For exporting a single private key for a transparent address, you can use the command inherited from Bitcoin: + +`zcash-cli dumpprivkey ` + +This will return the private key and will not create a new file. + +To import a private key for a shielded address, use: + +`zcash-cli z_importkey ` + +This will add the key to your wallet and rescan the wallet for associated transactions if it is not already part of the wallet. + +See the command's help documentation for instructions on fine-tuning the wallet rescan: + +`zcash-cli help z_importkey` + +To import a private key for a transparent address, use: + +`zcash-cli importprivkey ` + +This has the same functionality as `z_importkey` but works with transparent addresses. + +See the command's help documentation for instructions on fine-tuning the wallet rescan: + +`zcash-cli help importprivkey` + +### Using `dumpwallet` + +This command inherited from Bitcoin is depreciated. If you use it, they will export private keys in a similar fashion as `z_exportwallet` but only for transparent addresses. \ No newline at end of file From 8e27d624aa4e8284b0f4ce1c86b0228670c31a26 Mon Sep 17 00:00:00 2001 From: Paige Peterson Date: Wed, 3 May 2017 21:49:19 -0400 Subject: [PATCH 0039/1062] typo and rewording edits --- doc/wallet-backup.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/wallet-backup.md b/doc/wallet-backup.md index 88d60e3c0..35827c96e 100644 --- a/doc/wallet-backup.md +++ b/doc/wallet-backup.md @@ -30,7 +30,7 @@ To create a backup of your wallet, use: The backup will be an exact copy of the current state of your wallet.dat file stored in the export directory you specified in the config file. The file path will also be returned. -If you generate a new Zcash address, it will not be included in the backup file. +If you generate a new Zcash address, it will not be reflected in the backup file. If your original `wallet.dat` file becomes inaccessible for whatever reason, you can use your backup by placing it into your data directory and renaming it to `wallet.dat`. @@ -40,7 +40,7 @@ If you prefer to have an export of your private keys in human readable format, y `zcash-cli z_exportwallet ` -This will generate a text file in the export directory with all transparent and shielded private keys with their associated public addresses. It will also return the file path. +This will generate a file in the export directory listing all transparent and shielded private keys with their associated public addresses. The file path will be returned in the command line. To import keys into a wallet which were previously exported to a file, use: @@ -54,7 +54,7 @@ If you prefer to export a single private key for a shielded address, you can use This will return the private key and will not create a new file. -For exporting a single private key for a transparent address, you can use the command inherited from Bitcoin: +For exporting a single private key for a transparent address, you can use the command inherited from bitcoin: `zcash-cli dumpprivkey ` @@ -82,4 +82,4 @@ See the command's help documentation for instructions on fine-tuning the wallet ### Using `dumpwallet` -This command inherited from Bitcoin is depreciated. If you use it, they will export private keys in a similar fashion as `z_exportwallet` but only for transparent addresses. \ No newline at end of file +This command inherited from bitcoin is depreciated. It will export private keys in a similar fashion as `z_exportwallet` but only for transparent addresses. \ No newline at end of file From 8dafb9c6cee260f095a85bb693726600329b9c98 Mon Sep 17 00:00:00 2001 From: Amgad Abdelhafez Date: Fri, 5 May 2017 11:24:48 -0400 Subject: [PATCH 0040/1062] Update timedata.cpp Capitalizing the 'z' in "Zcash" string --- src/timedata.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/timedata.cpp b/src/timedata.cpp index 8a579a3d3..1dcef2de3 100644 --- a/src/timedata.cpp +++ b/src/timedata.cpp @@ -99,7 +99,7 @@ void AddTimeData(const CNetAddr& ip, int64_t nOffsetSample) if (!fMatch) { fDone = true; - string strMessage = _("Warning: Please check that your computer's date and time are correct! If your clock is wrong zcash will not work properly."); + string strMessage = _("Warning: Please check that your computer's date and time are correct! If your clock is wrong Zcash will not work properly."); strMiscWarning = strMessage; LogPrintf("*** %s\n", strMessage); uiInterface.ThreadSafeMessageBox(strMessage, "", CClientUIInterface::MSG_WARNING); From b04529fefdccffc8921f213a83e407fd346dc84c Mon Sep 17 00:00:00 2001 From: Daira Hopwood Date: Wed, 10 May 2017 16:54:58 +0100 Subject: [PATCH 0041/1062] Disable building Proton by default. Signed-off-by: Daira Hopwood --- zcutil/build.sh | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/zcutil/build.sh b/zcutil/build.sh index 71cff726b..0122a24f5 100755 --- a/zcutil/build.sh +++ b/zcutil/build.sh @@ -33,7 +33,7 @@ Usage: $0 --help Show this help message and exit. -$0 [ --enable-lcov || --disable-tests ] [ --disable-mining ] [ --disable-rust ] [ --disable-proton ] [ MAKEARGS... ] +$0 [ --enable-lcov || --disable-tests ] [ --disable-mining ] [ --disable-rust ] [ --enable-proton ] [ MAKEARGS... ] Build Zcash and most of its transitive dependencies from source. MAKEARGS are applied to both dependencies and Zcash itself. @@ -45,11 +45,11 @@ $0 [ --enable-lcov || --disable-tests ] [ --disable-mining ] [ --disable-rust ] code. It must be passed after the test arguments, if present. If --disable-rust is passed, Zcash is configured to not build any Rust language - assets. It must be passed after mining/test arguments, if present. + assets. It must be passed after test/mining arguments, if present. - If --disable-proton is passed, Zcash is configured to not build the Apache - Qpid Proton library required for AMQP support. It must be passed after the - test arguments, if present. + If --enable-proton is passed, Zcash is configured to build the Apache Qpid Proton + library required for AMQP support. This library is not built by default. + It must be passed after the test/mining/Rust arguments, if present. EOF exit 0 fi @@ -88,11 +88,11 @@ then shift fi -# If --disable-proton is the next argument, disable building Proton code: -PROTON_ARG='' -if [ "x${1:-}" = 'x--disable-proton' ] +# If --enable-proton is the next argument, enable building Proton code: +PROTON_ARG='--enable-proton=no' +if [ "x${1:-}" = 'x--enable-proton' ] then - PROTON_ARG='--enable-proton=no' + PROTON_ARG='' shift fi From 1e9db0b38a64e8df510294e44b5e6afb4b2dffc8 Mon Sep 17 00:00:00 2001 From: Daira Hopwood Date: Thu, 11 May 2017 07:27:43 +0100 Subject: [PATCH 0042/1062] Remove an unneeded version workaround as per @str4d's review comment. Signed-off-by: Daira Hopwood --- src/main.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index f4cef9370..c1acd1c27 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4352,8 +4352,6 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, return false; } - if (pfrom->nVersion == 10300) - pfrom->nVersion = 300; if (!vRecv.empty()) vRecv >> addrFrom >> nNonce; if (!vRecv.empty()) { From bcbcf1437e8731dbe4e7e5c1f4f609d662420616 Mon Sep 17 00:00:00 2001 From: emilrus Date: Thu, 11 May 2017 11:41:13 +0300 Subject: [PATCH 0043/1062] Replace bitcoind with zcashd --- doc/tor.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/tor.md b/doc/tor.md index ce717515a..d9ddb87e2 100644 --- a/doc/tor.md +++ b/doc/tor.md @@ -76,7 +76,7 @@ In a typical situation, where you're only reachable via Tor, this should suffice listen on all devices and another node could establish a clearnet connection, when knowing your address. To mitigate this, additionally bind the address of your Tor proxy: - ./bitcoind ... -bind=127.0.0.1 + ./zcashd ... -bind=127.0.0.1 If you don't care too much about hiding your node, and want to be reachable on IPv4 as well, use `discover` instead: From 56dbd7b564426324defb78f0dd6867f097cd658d Mon Sep 17 00:00:00 2001 From: Paige Peterson Date: Thu, 11 May 2017 19:51:21 -0400 Subject: [PATCH 0044/1062] str4d and Ariel's suggestions --- doc/wallet-backup.md | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/doc/wallet-backup.md b/doc/wallet-backup.md index 35827c96e..2c36ebb41 100644 --- a/doc/wallet-backup.md +++ b/doc/wallet-backup.md @@ -14,7 +14,7 @@ Note that a backup is a duplicate of data needed to spend ZEC so where you keep These instructions are specific for the officially supported Zcash Linux client. For backing up with third-party wallets, please consult with user guides or support channels provided for those services. -There are multiple ways to make sure you have at least one other copy of the private keys needed to spend ZEC and view shielded ZEC. +There are multiple ways to make sure you have at least one other copy of the private keys needed to spend your ZEC and view your shielded ZEC. For all methods, you will need to include an export directory setting in your config file (`zcash.conf` located in the data directory which is `~/.zcash/` unless it's been overridden with `datadir=` setting): @@ -22,6 +22,8 @@ For all methods, you will need to include an export directory setting in your co You may chose any directory as the location for export & backup files. If the directory doesn't exist, it will be created. +Note that zcashd will need to be stopped and restarted for edits in the config file to take effect. + ### Using `backupwallet` To create a backup of your wallet, use: @@ -32,7 +34,7 @@ The backup will be an exact copy of the current state of your wallet.dat file st If you generate a new Zcash address, it will not be reflected in the backup file. -If your original `wallet.dat` file becomes inaccessible for whatever reason, you can use your backup by placing it into your data directory and renaming it to `wallet.dat`. +If your original `wallet.dat` file becomes inaccessible for whatever reason, you can use your backup by copying it into your data directory and renaming the copy to `wallet.dat`. ### Using `z_exportwallet` & `z_importwallet` @@ -44,7 +46,7 @@ This will generate a file in the export directory listing all transparent and sh To import keys into a wallet which were previously exported to a file, use: -`zcash-cli z_importwallet ` +`zcash-cli z_importwallet ` ### Using `z_exportkey`, `z_importkey`, `dumpprivkey` & `importprivkey` @@ -54,7 +56,7 @@ If you prefer to export a single private key for a shielded address, you can use This will return the private key and will not create a new file. -For exporting a single private key for a transparent address, you can use the command inherited from bitcoin: +For exporting a single private key for a transparent address, you can use the command inherited from Bitcoin: `zcash-cli dumpprivkey ` @@ -66,7 +68,11 @@ To import a private key for a shielded address, use: This will add the key to your wallet and rescan the wallet for associated transactions if it is not already part of the wallet. -See the command's help documentation for instructions on fine-tuning the wallet rescan: +The rescanning process can take a few minutes for a new private key. To skip it, instead use: + +`zcash-cli z_importkey no` + +For other instructions on fine-tuning the wallet rescan, see the command's help documentation: `zcash-cli help z_importkey` @@ -82,4 +88,4 @@ See the command's help documentation for instructions on fine-tuning the wallet ### Using `dumpwallet` -This command inherited from bitcoin is depreciated. It will export private keys in a similar fashion as `z_exportwallet` but only for transparent addresses. \ No newline at end of file +This command inherited from Bitcoin is deprecated. It will export private keys in a similar fashion as `z_exportwallet` but only for transparent addresses. \ No newline at end of file From 5b3bc9716ec1095b7a4624cfe6e1b03d739ab90f Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 25 Apr 2017 18:06:29 +1200 Subject: [PATCH 0045/1062] Implement automatic shutdown of deprecated Zcash versions Closes #2274. --- doc/release-process.md | 9 ++- src/Makefile.am | 2 + src/Makefile.gtest.include | 1 + src/clientversion.cpp | 2 +- src/clientversion.h | 1 + src/deprecation.cpp | 55 +++++++++++++++++ src/deprecation.h | 23 ++++++++ src/gtest/test_deprecation.cpp | 105 +++++++++++++++++++++++++++++++++ src/init.cpp | 2 + src/main.cpp | 5 ++ 10 files changed, 203 insertions(+), 2 deletions(-) create mode 100644 src/deprecation.cpp create mode 100644 src/deprecation.h create mode 100644 src/gtest/test_deprecation.cpp diff --git a/doc/release-process.md b/doc/release-process.md index f86e59933..8b95123e0 100644 --- a/doc/release-process.md +++ b/doc/release-process.md @@ -36,7 +36,9 @@ previous release: ### B1. Check that you are up-to-date with current master, then create a release branch. -### B2. Update (commit) version in sources. +### B2. Update (commit) version and deprecation in sources. + +Update the client version in these files: README.md src/clientversion.h @@ -56,6 +58,11 @@ In `configure.ac` and `clientversion.h`: - Change `CLIENT_VERSION_IS_RELEASE` to false while Zcash is in beta-test phase. +Update `APPROX_RELEASE_HEIGHT` and `WEEKS_UNTIL_DEPRECATION` in `src/deprecation.h` +so that `APPROX_RELEASE_HEIGHT` will be reached shortly after release, and +`WEEKS_UNTIL_DEPRECATION` is the number of weeks from release day until the +deprecation target (as defined by the current deprecation policy). + If this release changes the behavior of the protocol or fixes a serious bug, we may also wish to change the `PROTOCOL_VERSION` in `version.h`. diff --git a/src/Makefile.am b/src/Makefile.am index cb31b8a37..8a7b4aec2 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -125,6 +125,7 @@ BITCOIN_CORE_H = \ core_io.h \ core_memusage.h \ eccryptoverify.h \ + deprecation.h \ ecwrapper.h \ hash.h \ httprpc.h \ @@ -215,6 +216,7 @@ libbitcoin_server_a_SOURCES = \ bloom.cpp \ chain.cpp \ checkpoints.cpp \ + deprecation.cpp \ httprpc.cpp \ httpserver.cpp \ init.cpp \ diff --git a/src/Makefile.gtest.include b/src/Makefile.gtest.include index daa10ca49..e4e126866 100644 --- a/src/Makefile.gtest.include +++ b/src/Makefile.gtest.include @@ -19,6 +19,7 @@ zcash_gtest_SOURCES += \ endif zcash_gtest_SOURCES += \ gtest/test_tautology.cpp \ + gtest/test_deprecation.cpp \ gtest/test_equihash.cpp \ gtest/test_joinsplit.cpp \ gtest/test_keystore.cpp \ diff --git a/src/clientversion.cpp b/src/clientversion.cpp index 1e3eccbea..ae67e678f 100644 --- a/src/clientversion.cpp +++ b/src/clientversion.cpp @@ -100,7 +100,7 @@ const std::string CLIENT_NAME("MagicBean"); const std::string CLIENT_BUILD(BUILD_DESC CLIENT_VERSION_SUFFIX); const std::string CLIENT_DATE(BUILD_DATE); -static std::string FormatVersion(int nVersion) +std::string FormatVersion(int nVersion) { if (nVersion % 100 < 25) return strprintf("%d.%d.%d-beta%d", nVersion / 1000000, (nVersion / 10000) % 100, (nVersion / 100) % 100, (nVersion % 100)+1); diff --git a/src/clientversion.h b/src/clientversion.h index bba551eeb..b739ed73a 100644 --- a/src/clientversion.h +++ b/src/clientversion.h @@ -63,6 +63,7 @@ extern const std::string CLIENT_BUILD; extern const std::string CLIENT_DATE; +std::string FormatVersion(int nVersion); std::string FormatFullVersion(); std::string FormatSubVersion(const std::string& name, int nClientVersion, const std::vector& comments); diff --git a/src/deprecation.cpp b/src/deprecation.cpp new file mode 100644 index 000000000..7f5749319 --- /dev/null +++ b/src/deprecation.cpp @@ -0,0 +1,55 @@ +// Copyright (c) 2017 The Zcash developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "deprecation.h" + +#include "clientversion.h" +#include "init.h" +#include "ui_interface.h" +#include "util.h" + +static const std::string CLIENT_VERSION_STR = FormatVersion(CLIENT_VERSION); + +void EnforceNodeDeprecation(int nHeight, bool forceLogging) { + int blocksToDeprecation = DEPRECATION_HEIGHT - nHeight; + bool disableDeprecation = (GetArg("-disabledeprecation", "") == CLIENT_VERSION_STR); + if (blocksToDeprecation <= 0) { + // In order to ensure we only log once per process when deprecation is + // disabled (to avoid log spam), we only need to log in two cases: + // - The deprecating block just arrived + // - This can be triggered more than once if a block chain reorg + // occurs, but that's an irregular event that won't cause spam. + // - The node is starting + if (blocksToDeprecation == 0 || forceLogging) { + auto msg = strprintf(_("This version has been deprecated as of block height %d."), + DEPRECATION_HEIGHT) + " " + + _("You should upgrade to the latest version of Zcash."); + if (!disableDeprecation) { + msg += " " + strprintf(_("To disable deprecation for this version, set %s%s."), + "-disabledeprecation=", CLIENT_VERSION_STR); + } + LogPrintf("*** %s\n", msg); + uiInterface.ThreadSafeMessageBox(msg, "", CClientUIInterface::MSG_ERROR); + } + if (!disableDeprecation) { + StartShutdown(); + } + } else if (blocksToDeprecation == DEPRECATION_WARN_LIMIT || + (blocksToDeprecation < DEPRECATION_WARN_LIMIT && forceLogging)) { + std::string msg; + if (disableDeprecation) { + msg = strprintf(_("This version will be deprecated at block height %d."), + DEPRECATION_HEIGHT) + " " + + _("You should upgrade to the latest version of Zcash."); + } else { + msg = strprintf(_("This version will be deprecated at block height %d, and will automatically shut down."), + DEPRECATION_HEIGHT) + " " + + _("You should upgrade to the latest version of Zcash.") + " " + + strprintf(_("To disable deprecation for this version, set %s%s."), + "-disabledeprecation=", CLIENT_VERSION_STR); + } + LogPrintf("*** %s\n", msg); + uiInterface.ThreadSafeMessageBox(msg, "", CClientUIInterface::MSG_WARNING); + } +} \ No newline at end of file diff --git a/src/deprecation.h b/src/deprecation.h new file mode 100644 index 000000000..f109384a9 --- /dev/null +++ b/src/deprecation.h @@ -0,0 +1,23 @@ +// Copyright (c) 2017 The Zcash developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef ZCASH_DEPRECATION_H +#define ZCASH_DEPRECATION_H + +// Deprecation policy is 4th third-Tuesday after a release +static const int APPROX_RELEASE_HEIGHT = 115000; +static const int WEEKS_UNTIL_DEPRECATION = 18; +static const int DEPRECATION_HEIGHT = APPROX_RELEASE_HEIGHT + (WEEKS_UNTIL_DEPRECATION * 7 * 24 * 24); + +// Number of blocks before deprecation to warn users +static const int DEPRECATION_WARN_LIMIT = 14 * 24 * 24; // 2 weeks + +/** + * Checks whether the node is deprecated based on the current block height, and + * shuts down the node with an error if so (and deprecation is not disabled for + * the current client version). + */ +void EnforceNodeDeprecation(int nHeight, bool forceLogging=false); + +#endif // ZCASH_DEPRECATION_H diff --git a/src/gtest/test_deprecation.cpp b/src/gtest/test_deprecation.cpp new file mode 100644 index 000000000..72d98cf91 --- /dev/null +++ b/src/gtest/test_deprecation.cpp @@ -0,0 +1,105 @@ +#include +#include + +#include "clientversion.h" +#include "deprecation.h" +#include "init.h" +#include "ui_interface.h" +#include "util.h" + +using ::testing::StrictMock; + +static const std::string CLIENT_VERSION_STR = FormatVersion(CLIENT_VERSION); +extern std::atomic fRequestShutdown; + +class MockUIInterface { +public: + MOCK_METHOD3(ThreadSafeMessageBox, bool(const std::string& message, + const std::string& caption, + unsigned int style)); +}; + +static bool ThreadSafeMessageBox(MockUIInterface *mock, + const std::string& message, + const std::string& caption, + unsigned int style) +{ + mock->ThreadSafeMessageBox(message, caption, style); +} + +class DeprecationTest : public ::testing::Test { +protected: + virtual void SetUp() { + uiInterface.ThreadSafeMessageBox.disconnect_all_slots(); + uiInterface.ThreadSafeMessageBox.connect(boost::bind(ThreadSafeMessageBox, &mock_, _1, _2, _3)); + } + + virtual void TearDown() { + fRequestShutdown = false; + mapArgs["-disabledeprecation"] = ""; + } + + StrictMock mock_; +}; + +TEST_F(DeprecationTest, NonDeprecatedNodeKeepsRunning) { + EXPECT_FALSE(ShutdownRequested()); + EnforceNodeDeprecation(DEPRECATION_HEIGHT - DEPRECATION_WARN_LIMIT - 1); + EXPECT_FALSE(ShutdownRequested()); +} + +TEST_F(DeprecationTest, NodeNearDeprecationIsWarned) { + EXPECT_FALSE(ShutdownRequested()); + EXPECT_CALL(mock_, ThreadSafeMessageBox(::testing::_, "", CClientUIInterface::MSG_WARNING)); + EnforceNodeDeprecation(DEPRECATION_HEIGHT - DEPRECATION_WARN_LIMIT); + EXPECT_FALSE(ShutdownRequested()); +} + +TEST_F(DeprecationTest, NodeNearDeprecationWarningIsNotDuplicated) { + EXPECT_FALSE(ShutdownRequested()); + EnforceNodeDeprecation(DEPRECATION_HEIGHT - DEPRECATION_WARN_LIMIT + 1); + EXPECT_FALSE(ShutdownRequested()); +} + +TEST_F(DeprecationTest, NodeNearDeprecationWarningIsRepeatedOnStartup) { + EXPECT_FALSE(ShutdownRequested()); + EXPECT_CALL(mock_, ThreadSafeMessageBox(::testing::_, "", CClientUIInterface::MSG_WARNING)); + EnforceNodeDeprecation(DEPRECATION_HEIGHT - DEPRECATION_WARN_LIMIT + 1, true); + EXPECT_FALSE(ShutdownRequested()); +} + +TEST_F(DeprecationTest, DeprecatedNodeShutsDown) { + EXPECT_FALSE(ShutdownRequested()); + EXPECT_CALL(mock_, ThreadSafeMessageBox(::testing::_, "", CClientUIInterface::MSG_ERROR)); + EnforceNodeDeprecation(DEPRECATION_HEIGHT); + EXPECT_TRUE(ShutdownRequested()); +} + +TEST_F(DeprecationTest, DeprecatedNodeErrorIsNotDuplicated) { + EXPECT_FALSE(ShutdownRequested()); + EnforceNodeDeprecation(DEPRECATION_HEIGHT + 1); + EXPECT_TRUE(ShutdownRequested()); +} + +TEST_F(DeprecationTest, DeprecatedNodeErrorIsRepeatedOnStartup) { + EXPECT_FALSE(ShutdownRequested()); + EXPECT_CALL(mock_, ThreadSafeMessageBox(::testing::_, "", CClientUIInterface::MSG_ERROR)); + EnforceNodeDeprecation(DEPRECATION_HEIGHT + 1, true); + EXPECT_TRUE(ShutdownRequested()); +} + +TEST_F(DeprecationTest, DeprecatedNodeShutsDownIfOldVersionDisabled) { + EXPECT_FALSE(ShutdownRequested()); + mapArgs["-disabledeprecation"] = "1.0.0"; + EXPECT_CALL(mock_, ThreadSafeMessageBox(::testing::_, "", CClientUIInterface::MSG_ERROR)); + EnforceNodeDeprecation(DEPRECATION_HEIGHT); + EXPECT_TRUE(ShutdownRequested()); +} + +TEST_F(DeprecationTest, DeprecatedNodeKeepsRunningIfCurrentVersionDisabled) { + EXPECT_FALSE(ShutdownRequested()); + mapArgs["-disabledeprecation"] = CLIENT_VERSION_STR; + EXPECT_CALL(mock_, ThreadSafeMessageBox(::testing::_, "", CClientUIInterface::MSG_ERROR)); + EnforceNodeDeprecation(DEPRECATION_HEIGHT); + EXPECT_FALSE(ShutdownRequested()); +} \ No newline at end of file diff --git a/src/init.cpp b/src/init.cpp index 2c905bd38..34df422f5 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -344,6 +344,8 @@ std::string HelpMessage(HelpMessageMode mode) #endif } strUsage += HelpMessageOpt("-datadir=", _("Specify data directory")); + strUsage += HelpMessageOpt("-disabledeprecation=", strprintf(_("Disable block-height node deprecation and automatic shutdown (example: -disabledeprecation=%s)"), + FormatVersion(CLIENT_VERSION))); strUsage += HelpMessageOpt("-exportdir=", _("Specify directory to be used when exporting data")); strUsage += HelpMessageOpt("-dbcache=", strprintf(_("Set database cache size in megabytes (%d to %d, default: %d)"), nMinDbCache, nMaxDbCache, nDefaultDbCache)); strUsage += HelpMessageOpt("-loadblock=", _("Imports blocks from external blk000??.dat file") + " " + _("on startup")); diff --git a/src/main.cpp b/src/main.cpp index ab91ee41e..a3de5e6d7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -14,6 +14,7 @@ #include "checkpoints.h" #include "checkqueue.h" #include "consensus/validation.h" +#include "deprecation.h" #include "init.h" #include "merkleblock.h" #include "metrics.h" @@ -2520,6 +2521,8 @@ bool static ConnectTip(CValidationState &state, CBlockIndex *pindexNew, CBlock * // Update cached incremental witnesses GetMainSignals().ChainTip(pindexNew, pblock, oldTree, true); + EnforceNodeDeprecation(pindexNew->nHeight); + int64_t nTime6 = GetTimeMicros(); nTimePostConnect += nTime6 - nTime5; nTimeTotal += nTime6 - nTime1; LogPrint("bench", " - Connect postprocess: %.2fms [%.2fs]\n", (nTime6 - nTime5) * 0.001, nTimePostConnect * 0.000001); LogPrint("bench", "- Connect block: %.2fms [%.2fs]\n", (nTime6 - nTime1) * 0.001, nTimeTotal * 0.000001); @@ -3613,6 +3616,8 @@ bool static LoadBlockIndexDB() DateTimeStrFormat("%Y-%m-%d %H:%M:%S", chainActive.Tip()->GetBlockTime()), Checkpoints::GuessVerificationProgress(chainparams.Checkpoints(), chainActive.Tip())); + EnforceNodeDeprecation(chainActive.Height(), true); + return true; } From b4f861d1919e962df426fc279ade032936ac90fb Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 11 May 2017 15:35:57 +1200 Subject: [PATCH 0046/1062] Wrap messages nicely on metrics screen --- src/metrics.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/metrics.cpp b/src/metrics.cpp index fd8000548..374245668 100644 --- a/src/metrics.cpp +++ b/src/metrics.cpp @@ -10,6 +10,7 @@ #include "util.h" #include "utiltime.h" #include "utilmoneystr.h" +#include "utilstrencodings.h" #include #include @@ -334,20 +335,19 @@ int printMessageBox(size_t cols) int lines = 2 + u->size(); std::cout << _("Messages:") << std::endl; for (auto it = u->cbegin(); it != u->cend(); ++it) { - std::cout << *it << std::endl; + auto msg = FormatParagraph(*it, cols, 2); + std::cout << "- " << msg << std::endl; // Handle newlines and wrapped lines size_t i = 0; size_t j = 0; - while (j < it->size()) { - i = it->find('\n', j); + while (j < msg.size()) { + i = msg.find('\n', j); if (i == std::string::npos) { - i = it->size(); + i = msg.size(); } else { // Newline lines++; } - // Wrapped lines - lines += ((i-j) / cols); j = i + 1; } } From 4088ac68dbabb0216e1fb008c19cb81d6292abfd Mon Sep 17 00:00:00 2001 From: Paige Peterson Date: Thu, 11 May 2017 22:43:01 -0400 Subject: [PATCH 0047/1062] specify exportdir being within homedirectory --- doc/wallet-backup.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/wallet-backup.md b/doc/wallet-backup.md index 2c36ebb41..9f7bc0f40 100644 --- a/doc/wallet-backup.md +++ b/doc/wallet-backup.md @@ -20,7 +20,7 @@ For all methods, you will need to include an export directory setting in your co `exportdir=/path/to/chosen/export/directory` -You may chose any directory as the location for export & backup files. If the directory doesn't exist, it will be created. +You may chose any directory within the home directory as the location for export & backup files. If the directory doesn't exist, it will be created. Note that zcashd will need to be stopped and restarted for edits in the config file to take effect. From 867d3e344f9572b0990d78314f205c66c136f3fb Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Thu, 11 May 2017 22:02:00 -0700 Subject: [PATCH 0048/1062] Show toolchain versions in build.sh. --- zcutil/build.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/zcutil/build.sh b/zcutil/build.sh index 71cff726b..46c46d872 100755 --- a/zcutil/build.sh +++ b/zcutil/build.sh @@ -98,6 +98,12 @@ fi PREFIX="$(pwd)/depends/$BUILD/" +eval "$MAKE" --version +eval "$CC" --version +eval "$CXX" --version +as --version +ld --version + HOST="$HOST" BUILD="$BUILD" NO_RUST="$RUST_ARG" NO_PROTON="$PROTON_ARG" "$MAKE" "$@" -C ./depends/ V=1 ./autogen.sh CC="$CC" CXX="$CXX" ./configure --prefix="${PREFIX}" --host="$HOST" --build="$BUILD" "$RUST_ARG" "$HARDENING_ARG" "$LCOV_ARG" "$TEST_ARG" "$MINING_ARG" "$PROTON_ARG" CXXFLAGS='-fwrapv -fno-strict-aliasing -Werror -g' From 2857f6960d09e7700a142faee0d15fe4509806f3 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 12 May 2017 10:17:15 +1200 Subject: [PATCH 0049/1062] Regenerate miner tests Closes #2271. --- src/test/miner_tests.cpp | 226 +++++++++++++++++++-------------------- 1 file changed, 112 insertions(+), 114 deletions(-) diff --git a/src/test/miner_tests.cpp b/src/test/miner_tests.cpp index 4a960df76..0db80ec3e 100644 --- a/src/test/miner_tests.cpp +++ b/src/test/miner_tests.cpp @@ -23,119 +23,118 @@ struct { const char *nonce_hex; const char *solution_hex; } blockinfo[] = { - {"0000000000000000000000000000000000000000000000000000000000000017", "004e2b5a2020abd95263f39c4d65c1d9112073ccf30a7df5428e5e8a7bbffdb556d6d4fb1978eeae589e10a155f665fbc57bf3b4d1a10ca38b9d4f9ab6d5931524deacd7cf9b774fdf72eb87425950bde392c8cf0c8447c08156f8679702a1a3866b7e4d13601ca5761003db87feea6febda45c5a3b76e5a0992b91182c30eef5a91516c57b3cf8102af61e893561c0e3f6d48582b8beea1de094b33ac87c8725c2386a2eebf434d01d46cfa27ca3ca54a84e0b4853a49ef2862bcb18933a9a41efe8f1081c57fc661db7dbe56c2e7f85af813b0dca2e0e233d1a1cfd65a013de09e12d4bdcf89210246d735486ffab49b468606e091e5e2ba55617602400a7cb91de9e3a217252aec3c6d861f75f8e0611ece2c4efbb174558be083cbe752e2bef323bb6a74179fe2d11eb15627b53321f73ac7684b591f3afb8819767f67e406d78eced8840c19ef57fd38e06bcde60152101804a71d0374a9f34f1fcb9db6f9b9f8ed7418bc8c363348390d246253275fccb27e872e351eab0f7b02899043fd0b4c9ae22f6c95ac52a91fdd185f41852d34be23f14be1de966838724956d436d8c9881199ced14c5fa8511975a65e02c358522cedb334fa2d15e47bebaf62b1be11c3b84265db3a36553a59eb14c24fff633573adb1afe53a2ec158eadfb27b82fe24df22b2229a2188f3d8044c6746a20a2c13b7f53c09ea775af45be369d209a3470644b765644131432427502d6e585269055c48136166bac32e46c2d559a80e91e1348731e7279cd6fa21d1ebc1ff5f451cb8a1134847da0450d1bdf534e3e914acfdfe8f0a1c39fb14b55f027aed21a7d7656305eea2e6a9cdacba0c612b0c0c43c0d1a16eb9fb4a81246a5e3337e5f9c6581d29e3566b20658f843fc43d09e71a220bd5bb75353b2dfcb708340de9a1da1580807c2a5987b8d19870004f355b95832071b52c72747a6a9f58ac41997e5a0ef9509e592229d315de45fb62d7d649eb6ad432f60f5f75a8e1045dfe69517159d6e850c9a3c15d7ac61b77467f04ca7091a99b46313dd5a639b4a77e3fd80a25308062d56ee0eb1eb44f784a316d66297be48b26e8d24e0b4fc88ff99407803d3cecafaed8ffaee81e19dc76f06eae5b790712cf14b3b534b8743d5cf93dd4e2a8111e24f17d2275973544608e88237d2fce06d62ad6f64649dc3e2ac3999a27b7bd0dff90aca9119a00aabb6ac8f1b6d9f43e63e1c0222d0e3b219d244551eb4e5c068b416d859f83d431066423b807ee3e2d5b80cee773a1991854c56ed703016f4febabd2159483ae1962fe5be771fa067ae8b95f4ad89f93141c7609fd8b9cf6b98c606222921eb9ecfdcdb06afa1cc2647e4d22d7411e4079904dd2fbd314f45abcf31e0707a6a85fd631b41fc3432be18c7b5b9b3b0cbb014de9b53643f6bc629ec0dcc82404247712fc62820618a6eb8d86f36893d7e199b678d2b22d8378246008402c962f9cef67db64c32d4231ec9553a7500fc410486ade3d8c506dc517b29972ae9e7528620bf4cc075902dee7ce6439d85a610d1badc39d7e4e118f22166eae2c0f492606f53e019c754df61e0069fcb13316b3bfd82e946497e97713fed435bba57a8f75b66419b32a435b24c907289bc1c6d527821ac4e4bf3eef04e9564b9328b82fd179c29cdfa6801a45a5d540900b894400c88c3790cb3260c59f878611d2881f60e00a3c0ee7ded90f971309c207caf1b8012d7872dd891e153f5cac1643bd54e51436c12607ba22d13e55c9081f2204bc07c996485dcacc41d794df509afdc0c00b4cf79d4e890dd4fdb9c19b2e1373f25b88d9fe5727afc6bc1ce57e2156e8f3c637d2cbb1826670252942df0be221d7495759ef659892bdc75f47c63cace6"}, - {"000000000000000000000000000000000000000000000000000000000000000e", "0067af1274820bfb2e16e1fca76120ea823e5e13b2229815a4cadd5a3f69a062dbaace24d646e73c6742151c1cab9a6e78db9bb8e59d497718be11c5d61c2f160b9d9ee28a907301f977efb9f9efda96e6ff75dd071421260fb945c3d2c5dcbb31f476ab4fd97ab81a1491c78dd2c76954e5a4d426edb110d1ec92bce38611dcc17d8a5435a6aaef673acb3e026215d07be0f0165884185c21819fab0e23d4051eabd209c7f11f040618ba8e4e91f3e9493fe2079d23030dacf9b415552732071db823633f53dec479315eacde8c94b7bb9928645146469b0d6fc0697324633c512e7d8d1c2c392ba9bfdf1fd687fce7a3764a45d79e22787ffb4a3c0a21448ba26ba2a1c3c5c27defd44dca084eba029b140e58ea37a88b2b50ff2a1a1162ab429d891d4c462f5ab9fc615ce14544fd34ebe0fcf8f145ad1200ca3f90d3cd9f2a90f178ee44e52a4ba2b1e6293933f303a3a54f7d586ce3a2263540a7caa5a5d1823035821ebecab9d531c019b29c5387b0e674362c4b75c06913771d4495da11d4db2bb2a001c97c3274f6b6c5f451378aab7462d0891c337a38756f092b127f1cc11503ce8ee245071052c779e17344fba8e72e8f3b1a4b2e6cfd9d104f4147aab9b397de2688f350fcbf568b0ace4c8abf45fc50eb07e87953c44bf6dd5f1775281f353bbac14adf29d3b772568f43b6b9b9b59c35d505bb02ebb455043f0b9070db025ddf02b74e9d23441eb0cc90f4cbdeab6e390a4530e99baabfaa9d84c716803e6239fa0663d47ef5ed5f338b3baf247dc78322d7cab715d3bd18c3fd7539d366ab8d691e1db73e1140ed5ddc0db729186ea24062e8fe31d2eadd2ac01fc737e476c95b6f1f7604daacb993c596c5fda7bc1740d66bd779115beceea175136a5bcdab3b5543884757247725167095ec41f7272dda8dd65e9e787ff300aeb008354a18e293f700985ef36bd19b0cbbc0444115bc05a11be26fefd2448741eb80a9291bd293c817854b84061ae038ec5ef393d37b950d5aa517f2ce2586dc265312de4974235466112ada1572962f3d821fa29e4ffe76c1b5c44084e76ec597e1e518f6ddaa245a4b25bb8bf5d10d206257f64c5844e2d6dfd1703a034424e56b78b987f594bcbd292fbef73c1db13c5d24134fbb306053b2ef07ce5256520292f47514d701a312da0c664097cbd2f1741aa7999583dc585654045d354d615b7a13ccfbb57cf95ba7ba5f219587100a602b30894cbc4ae7dd464496b3f3ea7675d59f072611d3d6af91d655fc7d2635e4771689e06098d5660293e6905316dd9ff91c103157d9879c1ef7e879fd066f011782655de589c4a119ed1197e2313cb5ea640878f0bf2564ef47ee57391d0ff83826848f5b59201ef99f409b9c98b521015682e9fef849b6701164a6031ca11109954dc9f7493266dcd8d635f7b331a7399f3427a84cb4a2bbdc0d09fae852ee167f96ddc2a430214ec29025c14f31b7c350b734959b00f03ae4013e230e5fab29d283f9af487ecc6016a6978f3c49b803fbb795646d79e7d6a4b22c7cacafcdd59d15943f0cc589f193455e5e9bfbd7ab2aec97ea7c19bbab6b0ae0c9b7fc23bc0f2e05b1f9acd991962580d728202eeca5aa104fc80be8fd886c43e1a7476c565b82b1050d75cb5147a7c65d6f12a860bf938daae6b6d13e23e717fc291b34f4e0fb58f42f6fb9030d637d89a507a871f03ea86881d6e04493d9c6c3759bb6f75481153472086f5e93e3867255f5e64c42f3488d1c50f5169767f29893576dfbf7f23767b6abe54fa48cc6cd1de60bb07e12824578a872c2a7538ee0b45f4fa36f397c0bf8bc2df303d76604e0f4ba56d3844a9eff9b4b079e97a052d146c18b67aa0945626e44793d38bf"}, - {"0000000000000000000000000000000000000000000000000000000000000039", "012f3a69fbe4852dbd5eb7ba5e6a284a651174d15e0806c99e6517e048ef61516e0774b4353c1a36693602d5be8037d079e5d425b1c61023cc3963b578da010706fce809dbd9ad849872bf65e0da167bccfea7b50ec5222cfe20b355b05751b1742c06b9e7f7afd519328aa9d494d80c2f5503a4af3d732c11db83b6e4bd47f45d303156e81ad54fd78648c889d6335c1a523b51363faeae6743d97ced65dd1ec4f0ee16e672ff6b02ebfc4336596e4cd03ba72775528919f41ad8d5cb0752e53b5e8c516cae6ef3d588cce01501464e0529569403c0da35e4cdbfe0662948b5963e036a9951d373faacb8872062b97ea8685bdb6786ef17039a0f280581ca5d84817511a54d56680957429aa8adf955aa56a1569bf06704a544c95742847e2835f7cd3a692628ea73366d9a11770ece790781d5db16cea29a988235807fe841a94e8bf8cc6405f5c454ca28b21b17350329c74c772048fb9026e5f7cd45051dd1bbde75ab0c98f11dc116683f00883a0f3d59a7d6fde0186cb623901f1fba687819e980e63f0cfb9801d2e7bd80de30e25d87605812a6cebc8474a17fe9ca41947515b106165bf6e95b322ffebb44cc944abe21f52b949b341b627f6a2d5588a9dd7492e8f3ccdf8142892f23171d4fb36aeb4935bb1eda3726ea753d7bee277fb7d961ddf71a91aa3b71f1e7e694cbc82ba9cb7b3e423a04bf0360dc32dd91f8af30ba61436071410e1df9ab0824fc93648bf223e223025a5cc724d95d166cd14b0538664e4b1950975dfa2132dc8b6e88cc1e094fac05675d166d9eaa8bc81d527bf135d32d6af4dc36410948acd47e14e8318804b29be99e49621779d557601571fc257f2622395ea152bcd361ba60eed8ae4e050bbd6a57371f8591eca6b2f46ba2ac7519d1d7eb1513d68d2f7c3305ada496e1e95b1a346b75fe1ff5180144dc03da8efcfd8b0ba48aa0504257580ebaf09b03c4dfdf29d17674cef1844249d13e05583d31260f05dfa686b484b69e87b851d77cf39761eab21bd9931a4a342da51369f5362a98f24849d4aac8e5ba4f24035ebec9c9a860c156b4d4c37ddfb23e9779d6ab273c6c5dbf15d500f944f669f45a6d7fdaa28cbaee121a8a7a06418e41eb66f2a63e10d16971a7b9f8b9b2218c4c0951758e0dcc46821e3819493a2b31b576a501ccb670d59204a950a551519792f610d5dcbbc22f193d7d9537b300fbafb3d5f2d2618e71e3fbd05d480288741be713054fe621530f722dd1f24c409566ff1ae0894bd05f4260fb29c2e176f6009122151fd4bd093f27b0ff20b6dd594c919f791c69ca5813b5f45c20b1c96dcc4be72723cec5a4d148e155c1045b4ce3177f894ba4072083c46411c41d46950ee9167ce6eb3464bf75bccfa90cdc1b5352925906aea5a29bb3070291b2d89561869db3bb01847737f14dcc21f22285419e4f61e01636cf5513850384488ecf27fbbe099b107617064e18447fdc15554b2c54ea8e96745501892a51b67c6cd95f7ddad5e8788df84eba9cd75e890f05c995cf62c46be46bee730c6ea3aac2e6d0bed9bf2408afe5ceca4e0e752264dd73e69672ad3cff6f030702067cfae0a437ca33e1499ab7131d505dec46741553b0cd3fc9ac365c5f6802db4f8862f5f4797282030d565bc66ca0a790c363ad9d6b47816e780e32d317aa82ee1e530c730e3bc59cc274dc7199476ccff72a8efb574fe5ea6bf9bcf46d17d529eb3988dc72934d721b7de7e05765cfe787242fd0e80746551f6c640ee6dc640d4d14da99f5a6ec655b004e60c69b7744303d04b7d8e3ea5bf4526872964d635304379a0e7d221f7b7721fddd45f92af259cab3a81287a2dc0530287d22b30492b2bb1d354481b2323c4ed5dfbbf0b5"}, - {"0000000000000000000000000000000000000000000000000000000000000005", "00315eb8fc4d578682ddf164933903e8ddba1ca90322f7a5d326700311f9dc82d0acd6b214c8d6ebdc6807f40d5b4943e079dea1739d4aabf5e6cd061727da14c0dfcda695819b360111fb9d6649926fc653d7ee1e1e1c6522deb1ed48e6f46f127e7081ce2a328291292b9d3162afb53180ca2706676972ce4439fcf0ac2634c9a337ad5395e1c9f3e1832edb5535b893ad98334e2fb747ce0e439187a77b674c0f4bb95cfdf1b400390cba29d24092bad472149569b0888547bfb7593e2506eeba9397d8babd07fa834c99fba158ffe4220307dc03d0c6e02bcd2b324cf11981128165f61a9d0b137a2edf698e1f6f84b2a8823baa6ece225b9f2d0188ad9873957daaea3101b883c812c999b7d9fd5c2316155a939fed619c25f32702bf29f5cf103e069635ec139b6ab83ecffb0d93d4f4a6fb6f1eb9df5e62588acff2a3b158fd9a7a477a6cfc63663c8ef70cda017eee67e9434db76ae712ca26a08a69217c09540d6f485c7fafa2da0fc7d317567fdb53e62667fd02561714299d93deef21413ef58e2a376a39ba94b0765b352dc1d46bda765d6bead72426ea0eb3c482ff716615a23186f6ccd37f798961c70f5bd741c715bd6ffb24a0c60a291f2491db12a7085653f836d791ff9c572261a51f68583068de670647be384a01927d5a555236d07eec65537659b17eb4518bca4f6220aff84eca06956084a1499bc94b6d31978772fcca4c663b844d254ed3bae09b900dd61e95d12d5eee366c3b5b237a0d6e40a7c115ed8beccde270bfad2ee5a61079b36937994f5288235b2d2b01062eec454769b92dbffc4f12cda572da6f4f0fd9c182f49ebecfb284503a46a726d67c340a6bc5298e2435b2a7f1b0e6033e7df2c118081b45b5cd517706c3f1e83a7066b54b003b5a1c23a6df4ef1a0aa55d3eb826b1e2dd6a2ea8ef964e800fbfecf1ed41fb585ebf97041ed193a9f5e5f55e81593c77563df944f42ae427466739df93fc4ae1a9d1458978461a4220d39d0b2d11d2d7bed2b359a2adc1514c5cf4c559135265473030c4db84f3322bb066f05b2a04d2a10ac0183a634739d420cc54acaf6cf4c0872dd96258307c4b32592e50fa8184a2626d19b0a0b02447d55d9797fe7f6825ef7dfd05938081022582eb33eb77c270241b97a157f1af8db01b7d358687f0229128be307ab1dc21493f4c27817795f71f18f643cc75e7d5451efb96b9a264906c7210337195a226110b078b8a1c7d4885fd35a0f3a7a44f2eaed3eebd434a2dffb1d11e43d2a9d779b106093a62ad8b5043706d8c08b3c4d5c21c37c32b5c6c7bb7cb075d9452c2ad23feeebd5bf1d3a8db6b8a46a9175f95658dde11b5d7d6d8c14a09f097be7bb54f8102b21a25924ee8982bd9044b7773fd18bb89e39775952b8b239e26001216a4333b1389de3cce0eef196175e1783d1c327125ec521510af88d21ed015ee8509a4dfd7d50e0601de3b1fbe1c797bb4ae162ad1ccc0f8ea1d9fcca9e2c1cd641554c7f417929175036498a1f712afbfb44053768d6dfea7367eb267400c0ebf58d121196ffe4272e0b0ce78d4201488ed6c962e1a8f667c2f76655056511b13a55a6bf63433119e57e6e61f60b9a43bd0d7cdc4ffc4cb8f59e6da62abc423d46c2457fc40f0156efd3cbc7d68ff5da24aafa49b709cbf3198d894483f22c041998015dc26797d0d0b0fa1828f88918066f0c581508e50d8b9c71d8332f061ce6037ea1e52950ae8212a563f9bbb148869a7a3f1287a958f4a209be299d475f9de3b1811784c7cf7b6ed7e33cc2d90c7dff20fa8d9a70da2089666b50667370bddec0d726897e1b99dc54f0f0fe2a84b1faccaeb40c1d6481380235f33f97bf21c3975556546f73c1f17e74476a"}, - {"0000000000000000000000000000000000000000000000000000000000000009", "007636b7d700cf6c94c7e31e417aef2d13444ccfb5012d9514e00a02dadec5c10ef2464f50adadaeffbf02c5b1621befff41b3eff8c38dee732ed868f958bd1e60366da214b0a3ce14b287a6f772c2c644b9b71406e74f2e43435c79f25fd145820f861ced6d93d74b1007e51c85458d8b3a23a170ab1c13512da397fb320bf9ee07fc243d37e30f26b0e4e79722a4509fe2bb18c586e495c8fdb9756fc1faa8c1de16a6dcf99a020a426cf96449f67fa265a1fa2b7bd8f559d5d7f29e307cf58129672001a3caf711123e07c65eb17d63e01410742cd29b807ee3b0458370b9945e82d27d70f019c3c580b0ee1ae79231a4755ad1e0b581ac33142d0d5204876de25717eb8401e545ed00ccace65cdb2a6dae05dc10a1cdf1142b075e36501d3fae3fbfe9b20e43992e0ed01789f998748f0db7336ebe705e23292a42ee01aad64a4f285b9ca21cf2e83f30e179bc1802ab3ad655bd0d2feba902831ddf3c451f4fbec28c1759b79a7ed6dd4ec8d9b638f0d11911e8049cbe841094e20a1595660f2d3a814f48226b0ebd4f7a8bc2406955574fa1a0d78428a9877cd10d82717a7beb0d05e4d3180f975f4bde54813ae42864a56c8f9632520a4452f91c5e80a7674e92352b2f0b4572d67c23841a8a9a35e5a28faf50f242d4d8bc4c85ef0856d2049b5f0d21aef8b31befcf49ddfc7e1836bf14bdfb500d21e9b88090fe0738cd51e8c1e46aec8f5706b24c196693a1e220f4cf27b3b4f648714796b1c0b66faf4ef3764fa913ffeebd4856f1f4716f4e9cac598f2460a86311ca633d197c56573c2a3d9873056cb8afe42a1cfd7772f108e5f46962d9b872a310cf7c9669d32e19ddb88c5a897de73bb8042d5990aa74667726c337b1f9d8a2b0a7f9ae2f983d405535567b68b9524c427b1ecf61148c52ad1a24c9c53484a240321a655a00c4adcffcd19edb6d470616804932c7d46f5ec0b41e6f4473d0626c87c360d284f6e19ed4b73ebbe7030a9a44c4d7dbfbd7fc6c2267a72f2b3997ff5f965f1636df70e550dca9f602625b9e9c5f50aa557e7b4c015acf3c6501b3a3fe33a2d964695e552a1c39781409a52b184bea227bb9c4c1431a784b14c530565339082a96edf349a5133513c514c867400dd46a71937209ca9cdd704d7315432ff55157b808031d3cbc717203a0045d07cd1d91f9d1a2f3914d00f6309cd8394a0b4ac3b1fa8e7052f8207221a1f6c2d0cacadb6f741263676e1a06ef96caa1d2ce7c51c4f5aeb1d4e78835f6c59eaa9ade353e14056a6733db224476956caa0cb44401d7c47a1062682b32ba5f8af75e12db2a091da681b6f9a4b7797e20d29cb1f4e43167ccfe21e61868251adce8cea7db96e2a9ec28a7a4beefc74d6232096f93ef60a39d1e5723f512d0edd6ad233c11a0030766fdd0e14079d65201ae922bb1e4d8d116a2458d12f73288b2068baf792b8ed9f5adcf214a9be69b152308aca00f0c5d2555a4b27e48aab1b09d3118db3be2cc322c5d1a630e3f742b6edff4fd91def6798111f4c322d395d12dbbbf7854b7f2d1ce17e83498321534e503b89bd009c5ccb89b865ec91b5b913c040a3a0afb5788f603e1fe95469b1adea2d9e4529e1eba561d4424be7cc3f5f14cf89ca24e97bf56dbdda8e503e23e217e5869a58b78e9190a7eceafac2f5ddf910fcc8ca9cfce3bdf35f3c5e8785ebece6fddf4401c197f092b8c1688d734b5641451fac9e9d50df441172fcb5ed111d561c3387826aaa6bb84f1f43cdbebb7071ef3c4cad2d9b9c68985b712e45ab99879f199681001b594eb875b5be6d42662aa72def9cc973d40e70999f0e694d39b5b94eec596e1d2169b15177b6c7b0cf091e32de60059b1dad6a613d87689deb45f5704"}, - {"0000000000000000000000000000000000000000000000000000000000000020", "0048c6dacd48a4d9091658d30050325257e636f68003a573707c08ff046193a08a75d2fceda084f4a8830ee75c5bc3dc738d3d4ad175d90e2309a94e7748853ab4fca24ee3b047ba85a4b0782ebb71bc19f3827903c469f670101c8b084a105d04949d9a17a91286dd26841134d0e570a762ce32e5fbc4a636556dd43b102060aa00358c84996579746863d8de8bc7ca1ef1592dbd54e09b60335bc018740e89b36519f3f01dba4c063781f8f08a040d970da2128036ef11645b7343631be849cb6a28ef7b7e15d2343ef814a6b3f65b4bee1f7ce2de1ad82c62fd3f32fc11ac19ef14083e8ebc34958d26a23894c1e91939699e6f6c7eeb94f98ce5130c56b50c8f7119f17ad33e44bebf662c5f742fd72dbc7531214f28e5ae02a413afa4f3c190b97e52fe1f65f29738ea0fef8baa7586c2ea538198993c6cb43fd947f2429a61c3fa3fb7f20a60d4a2c9c7dd503202a972101d22294159b8c20e486d727a9e50bb401e0ae7bcd1a50846b09399817760befd91556fb971780c3a3a2ae7844660fc3c351a7644efde236d9cc6c30f21590cc10f9767a90183489f20d5ae34fafafc1f0541e4645b093ac9893dd061989cdc0e388993e1ff2de60387c324da8d9f2dd53c0062904e28bf92069e0920bad3bc928576c85aeab861e8ba7720cb99a10b456faea4135f677d1e61984a2affac0704e898403203d38ba5c0d10c1d1b8a03dafcd2cb4562da7a7f3c42e47ed5499699b13465c51c16b3ed7759d7dbe52413dd5160c0237b058b2061d1144fb96228d377faa91b2acf70cb5b1ddb4c68244cbf3e47be66677e79920a8a8719df35a3d7fadbb14398905d8c56c7d3b41260406572a8db08596a7b2794843eab71fdb21d485226eb2b213d17b75151ba6456eefa0989f67c99941d2eb18feec1f3c0b3d84fd4b78fcb86c1f536d4f207017e1a87f5f0c795a70293d42aad0dae13dc39947c12f49fd19ce045510358e6fa96d8f0d38c52bf324b01b51bba9c13e93f158f51c375ed57d146de2ec9f82df9fd7c4018931994be34b622eca4093533104f05045d154dc16be633729741a9c2bda0c5b3b372451a07cbe901f21838c6da14f1c88b5d04894959341f622cd253691b13ff457367c5a641bb363680e2d4a26940bd3214205a240b5f1094afe0f7d1ee23b8de70dd01d47b495c5259f18f47a8d1f46677bb33699a9d570c79a52076d20535b78b62cd00d1341337517ecfdc0b31870d0f8f080cc8a6839c4a305e85960ad0605c75763cbba12ca20de78fe814a8c495eafcc73c1c631171b3128b10ce5897dca1992a76cdb767eb7c718c16ff9c738ba9de77f86eb2593861e7255062730162172581795d8606f392fb127975a34c54babff21f774ee18aeb60a503e943301a3595e66b6e951dfb6bf0051d7cf5df66cc2d3c2a20cbedbe99c915e9790def60d6bc232de181bdda7b4766cfe9859ac8cc5728743447935479173b7f311154f4f13391e99d136d4cac53af5df0a0d50faeebfcd59228609a717aed6e5084167c2d5101d1a5414263da16ee6a9f4343f8da599c28775a70f40dace09b3cc523c866d85f83151d25bc2b6b9e135a6ac4a9fb18a34cbbfbe551f93cde4ceb30270ca676710b199f38e565ceb3f39affafdbedf6055cda63f1213f237a0757a9bdfbee861c6f56ea4b0c87546c0363109d7d7254369be4bf992ac02c19fd151107555a74e219b066236a58ca47d9cb13f9f3171b6c452fce518a05d1d2a371fffef2669aa21ce0b110cfad72764a13c4d78891f983d76b04c9c2ebdaa24bd2c2d71fa51bdf98a2f932dd56f8db62147d1d3f27312d9330f1ff25d9aa8632e4c72d2a3867b7232232a33d5ac45be18102756706446302ddee16791717"}, - {"000000000000000000000000000000000000000000000000000000000000001e", "00300031f011ff93ca7dd320f7c4aac5aa695186612c84a6bbe2a3a09557eaf59cde41841672d8fce0f0081d091bc5e9150bbcdd63ceae7c7b2a5828bb34072543866e4313e4ff4a1fb551574d401b030519157103d40974ed67696fa5bfb67e00fc7e15dcbe9eb41428ad2e80a5a1ed3f97ce93b8a3593dd95614d4a3e715de2dca770aee7e64ea9315d72c14e0ec924af9084e3cfad35f59d28f58e4971daf39d19e06943e08db018ea7681a18ef25c13c1284fda08f9e88fa1485820bfb5f0eac973d9ec050f29a57175a1654d6fcaeeb172f67a993887ec1f79653a8baab2bcad739b6f5652c15c4426e141138bca656c0baffeaddd00c9a0329042101432e1690f6e378313a6d922ea15a05afaa0b20ad295c3f33ec91a08483fc2fb10972376ebdaad705c574499b1384a940bc11709bf32993c7661fa36b09544336efd1db17603812415f6c6755b4cc754ad103c97186b533e459d6d8a26ccd7533c3554adce1a71805adf7d8bd09f1efae23057b5d4d3d84065049b3088e6db401cc4731e309b587f4723eb70058f950b51c10a6b69c521a5f162564b20339d2da84945bb08f12b07a62ff4a7653f677a38f0a58cd82811bf61d3d72fc052bc56b6a5f6d6a091feb6f56a65d14f6bfa324afc756c918417ac3eff47dd73c00a97b080e70ae513fadeb44a6572d8c12ca252ae0eb92ef01da8b7404860921980ae093820281a33dceabb91131d066851c56c62057716a0bb8f4f3fd55549a09e56d92d94807003f83676accf556e423252ff3a3c9458db9824f096a3b194c83320c61b860a65948ca1c9a9bc8ba310ab74a8865887c579808145d11584acd95689bd62720c69a1111d413ab6302325b6d1e66ad46e97de6d518c9e6baf8689dd9fc5232cf1cc63bc507a6350a7b28288fc177d7a80b0a63c68cd1df9a631d64da6917028743f628e1abfd3f84d2ad40f3ad912cc2ade127110904d17f19f6f5861bd3f836dbb0a50d9f10349806fa8c6666f464d9ad5aa367442ad0e51be5197af32d9f472b0d674093473e23d84b4858e6adc8973f5f21167f4085d02b84d4ecb3a479e9a43de9ea3c9aa321bdd533cd5fd0bbba2912cef534a0ee3ee6d20f372e9072a6e5a0bc2599313900e34a79ee95669e9d2e66164e1ab79e25ab1968d6cbbdbf5b56137d1675cc03393ac7f7489686b30a834378c2e54d879e59ec251e539ebed55cd1d55eea28f5485418e240aa5728720fdf19af79d01607bfd3668c003893b3172adf214f139b70cf5a094b14bbf0c1a847189dc4ef8d89baaf1178cedf29512ed0a69cc319301b1c56fe0b5daf521d798fc908cbfae19017f4be3eaf2f76cc3dbd653529a64df493cb0c55241502d8cb57489cfd7ae8738248dd0dd613e92233ab4504aacee0e63271fede7a4b0320d245159cdf795a9d736e4153ac01b578559331033dc56252f242e1f791a69f9c55cd7e2a4e718f7212cd57c098a8f929daeb82eaff54634936fa1009f82bfc7f75048fe7b3c792a38f90540555ba12f633c310703b955c5921711e0c54dc5dff0319a5d7f8db931cd867d471257e7bce94344bdb5e779595d4ed42f316974248298c9410bdeb38090d7e67a2931f59a1d92968115aefa041b1c6fb050bb5bf3bd5be555ecbb307c0276f97d8e349ba0cd559d86f02bd92106f592e26c643da125b09b56b79f672117e4a05b942304f970b05db9e17561328cd9f9204dcc76b58bbe26967b7251787b38b1272a993be33f8294bf30586185d95e90bc80a12c94ffb67330ec986a5532d8e680d5d0499265dbace7e1282cf5ab785f1e3b3cdde8df95e6c6f142ec6a0034fda19b67f029ad259375d6187ece3132bf754e603e58f59736c842f6423eca9160c3713ad"}, - {"0000000000000000000000000000000000000000000000000000000000000008", "009a41ce877363d1ee5860fa19102756c11b5f196013bad670a9eb746bf29b344ce7fff419621578a5451dc5c94ba25c01ef1ae46578a0d1796999538e97163e9867213ea0737f8f6c19f6a97803db632c1b842e0166b525d0d7b8a53cf4103c10241afb23d0fd6ebb903a57ed0eb76757f74d19fb9dec8dbabca25b3cbb08ad89dcd7578381af0bf257a91e8dc0fa086c166a2a2b74e8c1fae651e2324567acd5281643699b77da00b65ebff019c4114ba47485c56642b21cf2d49e7e1d7f5641d85e268540fd653f6144c16d881fdd62de0427b751be0e7d70c4f9928381183bde8e729ee331131b87503ae99e99d0c7f1da03e0e3a21e0b741c0704327247cf9292a76062909ca71c92489f59fc48df20273bc6188e691999a2c49c96e3f61dbf866e457408d6d85aea628a2d2efac549dd64925e8f43fd60216d6f067c60fce977fa5c06e7e5ea54bdd13072aec200f493b60dd753ef1fa61401b0fd60337b47fd9a19059bdf531485c7da59ce91a42fddf169224c2fb6310192e5a81ec76e8fff2091f4c0ef42b9a37a921a2e2db1841d32d82e0b06ce458d2f44bb9a47ae34f2be04427895b4c76da145f766d6a458f46706cd3faf4c35a31487184dcf736216538f0476bc29342c6c4ab90ac60b9314231241b630d3c3be3c6bdde93c993aaf2cbcdd117691fa9495dc64a2093f4116e5315d17fe063bc65787de0fb7822f7242a45b35963d865cb7b70e3b74df7d1fb6c7b1da9423d0a96ee3092fd8639b0725d31f11c4960f502c9617b0fe4c61bd093ed4fa232ce26a89e0490fda79040965726b42455772d1df0a3664c1db346dc3d60403eed047325dd70f324390165b4680be05fa23eab23563c43c456196ad109dee0eb7c9e5e550b4f7dcf1b26676c24184f69437efe96188ecb6d1a7e145edf657f916578e0eeffed9a03c01549bcc6c4d66e58b1c1039d78dad56b25e1c529602b5fe514a5a3ab1d4a835313cb6072a2e10b2c3680905c523d8573035255e9223564d0ddcf1dfdb5e071f89d27b2a8d626cbb0674437766eee9924daca532031220a2aecb3ba38d21e83950f77cf659b0dd794c222572eec38c6db5716d14f66ab4b04d7f22bf5cd605566be496830e7eac9331d33eee6c0d24c06d6c7315247673b055699cfb17a37951f23752c59a7e03fc01ad904a5d026fa5fba1d5c8dc505ed5e85ddd1e72403a8e3815e17e6b77d4757fb1b109f20bcdfdc98023bb6d00edecbefbb3b13341c9b464829a8474f1712ba1c5067d9e0643412222f251b994d528d5d2c755150c59087115928927c9324df8d16ddcde404fc7ff269ac7c2c6951986d27e83910ef26bf53597ba1c771f370b7cc65679e79ccdba86a2f701beef2b9b5ef12c490549361e44e1aa808304209eb49b50135b2a380211549cc346d434bd4693304b307749c3c216a130039d01a63d5314a7cee6803d1c90cff04ec71d00410ccc5584608f5488b393334961426969ec64df51b42391ae7c7673d517fb271983f272712a64d35c3e7805b23b1d4d54f4e5a2c4443f7bbec389bf55d77990116516af405cf5672cc2b236185858ad4f2b2eebe81661ae0b8d4dd3b36e3633b36f1da3a15f8cd7e3914df16cea6af9b567cf3e59e4eaf7998b43dc5d9a6203516cecd1d85a83e520f20c81c50aac9d437509fe0742296d0fe37d51ef0ca12c804ec522fdf4b896330d1b4448b303a2cf229b311503b796154aeb3b36f10de522113b0bf8b8935d63c097bc4c514f26eabd9506873508b38aa3fbee462457c3db94671a8b1b132b2752ab64615178049043e27a9d7992a57090ddc8ec0f4f44ab7e1165dd7827680d41583696f5259ab34a154374742a157bc5a74983e9f5a87b7d2dca0fa2fd"}, - {"0000000000000000000000000000000000000000000000000000000000000028", "0028ba8566cb549b6729ca31366c4e57ba4f5fc0c21b57a1b9aea04acf8f06a2b9cb1dcf8a2fbaff1f8113822bb582922595a891ca07e9fd0b47b93c1fd8b54894e5234e74db73a88ab67ed5e815034cb17dcf7c059fc192e4522097420c39f5ccea3f6aa56adda3f408516b43650f6e44a5fc839972b29225cfaa9f26e01ca87585cd9c0b80f601b463d0aeb1a310fc1986553820875eee1dc0dbd668542c5b34b7a62f9cf98727016c949faa1fbe29e739f785cecc811b09191dbbfa0dd4636ca74534bfc7ba46a154f43fe6e4bbda100303fb5614d5337099c2f8f39996e54cb1e9b8b0b5414bb532c075a334ada46dc72d06f961e2e2c297bdd30f822b2b1554b3fcd55bf18f182b01427e179638691cb60fd2ffebc5a3806d74dd8ffadfa180bdf8dfde358b5ba197e1b04b460644202f57df152cd4f29a036e6cf56841a43887624a6ccfc9e9c3374f04fddfd6007ec81ff216eb4f382d61d97c26a8888d9896ed8a45240f27a3e475a39234169ede4c894f0be7ded8a70093045062847e03bb167037c2952a425e113530643cb8d2bd2074ca61bdd6a47a9abd6c917ed90c2bde0e930ec53a15b2099e304101a6c2b64058cbd750be146989819fa7d4d3472536ecc04fed49bd21d9d4b118c75cde96d4ea5d3f3bd326a63620096bdc53305623437c2ca88c933481ebc64c0677f0af7afabdd6ab01711574dd67d369ddb531215dbe7194f0e29123023e5923b5ff597553f213249655654301a2a12ee3fa0b58f7ce668de8d3150340c9503e77f988ff9792f627889ea7d69fe7abb38f82a19f6a6ac1876c32b9380c205f16fb13809ac8a4d1afad5806a57d13792f3515e8996da36896a15937546a074f02829265963cdd1e30269306cda0f886a5c2686f6c4424cd4856a1281ea79d9e60b165e5949c42c31d2218199936f12f73011e46133f40b3b703b76210b8641d593c6cebbea31d3bf1a77130a841c162657386b3622960a25a02780bd9c9b12c389707c88d64cdf8e6cb222181b5403f17db4a78568eea5dd50e3409b12753817dcbcd8cde06aa2712f9cf813711e9418cc09dbc00d19893bbc008b0bbb2bfd01c070d35a58d524ecd5ec4d198a13609de852ab353023b768183e100b74585204230eb4742142b7db65ca69722ef9534be386795615d5ea2c2029d7a5902cccce78d16f097272052683ce85fd6f22108fd4015db5a9b293ad25b06c10200e4c5be233b05b6a11b29f1b55ba9fa633576c061260da81bdd2105d297c72f2d4c91a48945ba206270c3845b5cd76518208a4ecae4744bd5f45283194900351e5a8ba735418f3dfb9fad92dfde64d5c22eef5d897a00185f671d92c1e0cf6d369dadb676495ae5bf5368ed3bc250232137c3884b304a7104f426c9e68565e906f20d9209b67eff681971d9b89151e59e335cd1600810cb3f179c3f2f6a208ad71a9f94d74cd6b4c94d39b465b30d53662ee1d04d8b7cf87291881c0466244979112f1971cedd2e86d25b8441626623b2b9c94ef6ddab720f62111d110edb8b22b9b1905aac911ba3c41f3c3b17e97f0f791e72e5a769e4a12f79ab5187c63e9f2b11d9c3772657165f49a0f24b867998812d085734762fcf0e654ed2e0e0b4bb245dc838fe16e177beb91a0bbc8b92d3ccb79c850251c02277767879f0daa3b72d90723cc590893adb9cb4bce6bc692569682bce622170120d03490ab5991ea375917305023029d8d0f24aa13c83343091f996ac54ceed79f08ee7a5f9fccd128f0f8c6d77976fdd388172fcdc4bdcd30eac49b514230fe28613a4abb139e521bfe9094eabad3e0b8c1d2ab515360caae7c29573c9c0310096846999714f4e523e9acdafb1cda334088dbc6a6262c52af7e471"}, - {"0000000000000000000000000000000000000000000000000000000000000000", "005e10e25ade6dbb9f4a30b487a53178fc6ad3efc50ee83d9b18885575e3ca08a76fd1688251a41a89db13ba975fc245f79b735a47e4f6ee7a667f077ed01356dd935cafb0dc59a47ba6220dd8e16314b21de9f70a70b933d285f510f16572d5973480d8e1e17ba27528bc450faa0babf4d54dc67c87cd6dbf5bc1dbaeb22012174efd65bd83dca2058214d80c89b3b91816f22ea9ea866852a8d6e5da2c597071bef370857d3d2500d26cd1be85c1e1131123c9c4dc89d6bdf95c8f2a32ffdd691a8eeffb56b164b1e14e9e89524f14dbde055bee5da08ee4415b5f04806cee677936c02d61a52a4454218e1add637c2ac329c6c475f90c6a6ffeb703c9553e6d475399f325a21735e6272556c898ddb413bd660f3250540d873b63be28dca85288581513db0b492f213945009fcdb61470e5f1f80595cc72c05924671468fb9b84f5d24cd4c4dfbd456a036a590cf102a90bcf202786bd9c30306d3a16179ddeddf126c42d353c774c2f53d587b8392c0b701fc71c98bfa3ea03387e75fbf02bf9b11e13cce27f33c7c436df092224812db4ce0cad13e2e8631c44b4b202b4607691c00df8f677a55e269b88c765520cfa148954bdb31c88109efb58c3d24b7336a415a7b8398675de8178017113375e3a5ab0f7cbfd5386d09dbf5f7dd3ffdf98481555cb3b939eb80b72a8f25cb37b5ab6220959f15102d86b551d41c8e7ebe6c15cbf2538169fcbdb38a8075e054618a9ae238ca5209bc64464b20fc4f6c8701524832894dc742fdab2838e276164a29b71764fbe445bf7ffe5ab3ef3ec77c7922cd6cdb22cc9f7a4610a782ad2b884d69ef9dd661d6f7a54bd8e800d55ad0d2bac272ae02489039ce29d00d852761586f23dae30d17c44fea793696d8fc4d969a9f485639bdfcb2d3dea7bc0d41481f556b8268f6ef2d785c671f0315300d9b52fc41df40b3412601268e553fd113629672d05b8d2b8c191f40cd4bab0f2f2f0e3d6a8b9d5872c12ca16849d5731a6cd097422163f40c92966ab29dd1358fb2bb8e555bde2dfb16c2eb4a5cee3281cc21509db52720f2f6a95fbb982c136a37ab1fd449356dc1eba6e18f434d529d68cf3549eebea629320b50f242fed338760913e2acf1c37252a7bc8c6a8903d31f134fb8a10ffe3cd77e8a6f3fc9f4793f5e3a439cd86063fc56e999d902d225e33bfd577cf5ef232de9916096379b0c2505ce0e129f09d6b512bc8b5bc7ff9d40c6e0f00f84766072159d59a5d3424ad846f79eb0a14087bf5dc54723ae7a5718f49c20df6baa296f0c312d92648d78805ed5f7e52b7bff3f0d7a767defcba21b65b5eeed6e321a320b98c1bea1ab26d111d9ee024d3d132899950f11f9d54d0a42a84b21db678c19c27ba84f8e259f31ce1a794689873c98dac7c6d716301e9e69ec5cec3293f9912e7017a33f0ca6d2a0d7a0e51fe159fcbeaaef1042110a2ea09812dca9f579d18046c36611390e5316f64a622eb72efc9db3fbb413fda829caa558a91b0f2472ba8bd7e66fdd6788bf10389cda3185bdfdb2bee717c4d9393053519fa476f2f5aac52f034e34fdcec84462c3e51a67af39580c511b29ad2b718bb8b00d2e48b5c3739f5501675b2311f9daaa2ff53f0cfad70b31c81f49e8daafd92f11502aba187d21f641f06d7355286543aae01ef156ffc111f630a88a3924b45c1d595273892663ce79e477c165746b511c744defc4e6319097af15d56d397700b37f85f627e55a196ebbd743474bedf86365457966002d45e9374ca10a67827a381dab09dada93c7743ab1569eb6bd71e27018d44f529d535f49be59fbf520808a835ac471344dd5ef919d96e5804cb6effdd7ef244214eacb89503830a4846b9f455e0b9caf55f1281"}, - {"0000000000000000000000000000000000000000000000000000000000000025", "0013d902acc168f4772161f59bc274ddde6637cc660929fd408d183bc3da498864e072507f1cbfbbf9750e95cffe1c5ac0dce7cf512f964e5a31b90c8f18631a62aefd22dd34a9c82564efd24020f1b02ebea60a1820266102912491304fa22f0a67dcde78bb5583512fe99c6cce6c0779796313dc4c663d3d402f95b3e8413cdab98ad7c4158bfec465783d7f31af2bb143af415c7e13a2d0c332f63955ad11e6616b93385d763f00660c8816af28d5bc0613faacc54bd33b3aba3129080ffb112c463a25d2c590c6c4e8f5e1d2fe3c0e0e08ce6bdedb250faf39a79418e3bbf73bc2081e579a52ee45823263d2cd55aefab4e156202eef22d7bc320843678d0b0eacc2fd5790a7ca25877c4e9fba592b09362bff07e5b6b5b258e3d054ac0031166c6a7ba40c19e24e08cf2f53d1eb469cf6564072e1c35d1fb71165ac2fa404a80f9ebd31a1455512acb403cf8dba0182239a24e79f87f4c8f19bf50dd2f2ee5c3d299a11f610b2f8e84021986ae172cb32fce67d90bb559a06643a5be82b4c25a799e797acedacadf07651c54112f25a5ab62e244ff33f556091dad5866f87540a7213455c5bacc7ca26c73d78f2e4d4427295d216ebd4344c05dd1f510e1fb17df5b5da507dd676a334a8c11cf02533360e01a519fa05a6f33a644e849d17e49a29c52b414b5e9b34f63723461d3e4a02e0811f67c706bf78e0f8cb8d0fb06f61809cdf706534287343cd0c9ed326fe98f1def93e2352b2ff19dda7abf29eb318dc36e5d45a6d9cf3e352c0b9965b28dc424ae32a40cefaa1ccdf1f95a90dd425c2e7ac2670931afb1308d3e4eb861754492dbfd554cb470d5e9ac5b9fabd0d18164ab45980037e64d15d03552224bb330be845139b4f49491becef03b9415388986d6893ae88b0e616a60f5a5da2a2e7c10276586d6199de9a521dddf700ba683addd758b312c2509d4ba13bd46581239d8a30ee11b271a64711c80ef97802ea946a693f16c3060ccb85270de6f043495f98d397df04163b095b830f2632d7cbb8d0d3fff4c39d46dcfe58d358e25f3bb4132b26d88a06c1b3e3d7a32550301d1390663f6c1823cd3d6735ceeb6ad9fff2dda1f35c011306508dc918fb6f7466e81e577610646f1b70eeb649d95f4cf52d99023dc0a73daf50f927b41860bf4e0335b6c776082c7b66bb091c7d37c718a277c60b667c61f6cf1423af2990c2d840bda5ace5448f5a93e97c19ff4fa2169e8f5e19c609384f47492554f10552cce5d78b9f3ea964e1e2591855ee1c252337d2fd4200339833c20c1e03bf1e852a2d1691c7cebc56ae0ed27d59591a1a824365dddf6f27fa76b22d6d15945d79581631a322e69c3ac4d80b80f624c262e9fdcfc4a1675832335cd2673a51a091c12e63691ee675517a574999abd6024e80a5d8024b328fc094e09956d629c6ad3eb9ea052c25b7ed4bd3047734426f954089a1145b38000b0f978e5d2d5ddf5ba28881460d4ef34cf7ccbc2c143941023e6d703263aa9395ee015e4c7dedb6f64d5a100239c6850ae62396b04504a9c82ca7144b796d891231ca1fbd4527fb6b93d48c8ff8bf0f1f869ebf6d115a5a192353fabacac0e3b01fcecf3f34c71fb8435527feb3171d5907775f05c2a3b1d6a2f8ef3893250d372abe33879bbc60c633fb443256d15bf38fc23220e687de154b51cfc161a21e0fe310c6a6d7bed1b20fd778c08b5436a7d538228a8bb1b07e792e94fb4d1ffe1fe8cfd3b90b82311473b4afdecd97e8fbbd230d71e9d8ce10303cddf461677fcde6456e2dbcf26d715c65f372e36d5997818a6661fff2baeb1bd949240de6d3dede0f661accdf84347a5b9541f2f3cfde8c48f56afea71665b6d5f284e4d46f5f6dbdfb77b1d3"}, - {"0000000000000000000000000000000000000000000000000000000000000029", "0068a20b33963dffe13d80a07426f85a5d17d7a4496bec63ea6f9ed6e7c97af76673f3f96b0c945f316e0d04b6e7d10c3c8cf1c406889fd3d7c5ba80d2833a2466bb8123d34ec98aa984f1405e35c5d9a67072fc0c216a4900d71f7fb676219a3dd75c7a95b6dc8c0619b66435790f52a5015a45810db8062d6167592aa70e17ef1cdf94d94b16740b7e627f7a9b10faff45781a9ced61145a6a0be486028ae67ca80ae10d57be61022467c6b294dcc16d5bc6fb94f2b11298ab57a25d236bd146b772d051d2c87488bedabd85a176b23b330b8016e1d5c9755fc6c00464307968c65ef8db40f029b9caffa4684b09bbbbf787e077f8bae7bd17a3f90f713cbd4bc432319484e45ea240986e5ad4dfbe51112decfbbad4f08cf3be954db87debf69a741bcfd912d9a420b5a0717bf92001755fa90c74743bf89ca21c03b7a23a5189efd7f839655bce8ec34f3bdf144702fa91b160d03eb53601b09d8b183d3936b08bf6c526388e8de6dda4011f2bc49fa2ee2c5e00affeffa30d9b9d3af49382593e2a221ded929b956914f30c491b94d18c32198da95716829159f7259a004f9e51890cd1b37cc74c5e9523fff33d4a344ac5c4f4df5f1e20568c82a818d953688df2698ac3c130d97c6be66a12fcf12f44133e436a04d13accebd314c2e3fb7d2c2531079d60eee28ff512360b0e6332c2c9a15acb4603afba102f5a96dff90335080d5702765e76ddfb7e0c936ba1b65e38b8f89a814170d7e3ed2a79ccbf2f0777f3de461a6cebe9c79477b2e1945de1e0fae9dd197a0515c89cbbe2fb6623b0fe2e30cec7427b595a061911fd8c291227b37b734b4e2e7915d451dfcfcd06a2d5f0a6d865ad634480f0415916e0caf1ac96580703f52dd58dbdf92e0144e1f15d4bba0670748cde2cf0b1d96a969f13ed0cd419ab3ba59dc0f2722ace03c66b9fb5ab7a0dd79c049eaa475e8d6d5d5374a352153e01e2a0cd0b65eb86c20abdd48aa4863cb2430a2db95bcbfd4c21f35941732a7803da2022be79f02e934f7ddbdeb153e75105c1eed8abca7cdb366c48126b692fe896f95369efc2a5cb7db161090c3e18a42e10a3f1f8501071d27e374f5ac2e6864dac184cf712f171251b2547175206e40270fa6ffd89509b39571bab0c9d1e61507f2b5422937469c4f6ba2bbf890206a021e8ef56874978b664c45c4b117df9b9ba042e271d89c07bccaf392f8826210a39c39191b191b2b60c295c29510511b0c5ff43446bf6f249618d9db7d23f29a3bdfe9b8809a76e25b6ce71473d7604b5f6490c7d5a5b01cc4e5b717f7143b7ac28060e4a55dadd0e0d2964961e5f1d5435a49b733b332da38657b9172209eed5968c2c3d5bc75794ef67f09752ac3ac10262b7abc2de18df4f5c94da8fbdf4dc86e97339306703f2a320be07c59d5aa5720afdef29748d4cbfaed71215be30228e0cc2c47347faf946626e85f1d548c6286c24e193948d1562fb22f731ffedd4ecadaab0b43de68c000b5c438b476ba61026336d66d68a96d685041729ca1a81f1fff140417374c48e7328b9fc8391126cae4d4f8c9131ce1c024dd420fd1d178790aa150461c7ea8c889f579c4263d5e634bf81ebae373abc10641b05d16c7175a43e4120bff13da579f1ccd1b60440af7d0304323ddea3c55f81bcfa72417955932441cc7c9324e01fa9e5c0e78a975f221361dfff4f9805541a09ace945e5e5ff32567bfbf11d23a2f726a112c35292e00e1412f52b815112484effcb683f6da20799dd30a882a119cddf76a6d971651a2d4571736c2c3bcf76a9d58bed2c91b35ea9a15d84eedcb117df0feb1887188f0c04ff25419ae0e7d688773807e4031985b91aef468c99c7d3488541c574ba9eb1f97669"}, - {"0000000000000000000000000000000000000000000000000000000000000016", "0114026523aa61cb9c0ef1a0283d6164f0dcca4a283176afb68ba6a141b900481fbf776b12fc4a597580199bc7a218260c8d5529e3fca9d226c2d915d7655931a3e2a579db07c9c44f048da0aabc4a0d94ba19a5038c45e13118f49f6b62a2715e322b62ac6016aab22c00abe42ecf22996db812e8ec471bd5c652fca5b50d631a05c64979689701d1a556f930393233ddc7180fd554b5d90f6f0d724262a232e9ca65892f0d5d1407513dd7e3e0248d5b53e5553fd1f38167e8fc8096132737810c0b491b56ea740fedb9cf762343fbfd4610e7013591c47ac033be434449ba1c0e4b9674ff0929856f9682228e212b4552ea9064a5fd26617b55b9131f8f2fb454119ba93fe3abeef5c1014b428d83113a9bb73d76e68735ab5884912bd8b5b25d04b90c9e1b4333cf038d9254db60634f89e599957c6131af553ff17dac66d3bd6977dab6a6b5785d15eabaf4156201fcdb6580d926afc1a740eace9712ddb08295c43804f9b92cea91b91782b62238306a784219e992361d1c19af3eed50622307029433c4dbf1e3cc775ee3502432fc5416f4bb7dffc1296875596c33921efd146f06da1a52c0d539ab6bdd0397e8772393665f5ed19c38a12a5fbfd92ac4ff83c415abc361669827d5b9ea23f2947ca55354910b173a5854e2c00ea6be1fd1eb36cf234a1194095368f2c65f555425776233dee2720226a90200c20086f0eb614251216ac482232d47c91c2cb9080fa80d337c55c1c8755f7e31c90e1c82f70585df997a0517088e2962c176e928163346921940085c89096490c21aa1a150b18846d3cc4cf0b1c51207efadcddd9f231158ec03afb038a40d0764bf87a22d23cbf69e17bc1dffd1e684c53a4635ddd9eef79e14bf596d4447fb0165ecb3da89bd15de9f9cbb6804152c3bc525687aa78e83c23d087a7f7277c6fb9fc202f8cb48748b649edbac4137591b71ec4ff19b66ee1ea3da469c4cc1a0fb15e59417eb2529b3b1d12dcc06987432501ab5e5288740857efbdca0a33f48d5c72591d2c069d2b0391f36c523b2e99ab981a0ce65651c528a56b8efe4d383cec2a9deded0a95378af3f334cf5a5018533e019de8f081994cf7a5eeeb67b07ea1e89dd1a509243c391ef942297d72ff6c8abfe24cd2f630ea9fc25e58d912ba57ff247c529a98c6eec0b05a9f55f308e6bb9b201616d786259e0b2207c422f11c9e529609f22d99ce131a174e842f580476df8750e4d9a4f6d8841fc4e36566f3abf804de2b993333a2cbb7a3731982b7cc27257974ee711bad08ad8d7a317014b8b5bc7b30ee1d5522606e41f14b694897f48455b8f5dfd9399aeb43228ee99e3501a45b2d6cae719cc36589835cab5c402e3cd14faabc113fc7881ef1f899ce27bda0da30084953778cf4005d302942cd403011755214d9ea2d63566c48ae88c529947f8fa1117933221ddde1f55f3bac2ad5a5b91c662dbdf715c50f40f8796e96bab6baad88fdc5e6b9a7fdf3f4a905b48831c969a985347eec5e81b57aca6ad4d5575ef0cb2f4390990b60bdb5b118ac8453575929bae935c10ac5f1448e72fb19bcad2160f6059cb8ad13d0c1d165acf666886e073241772025eb814e909b86fc04847a94ee8a02d171f89b9f5f9354970d1946d78bf01091d33cdf3b07269beedc24ee71e124cd15f95b86f274b4d8b37603527ac4582cf59b113f26d6eb7b8d9107c67e73404add904dcb17b8025c6854de454d2272dbd61e780161f870452f4d02bcd24e2c48e3750590d090c962cc601e912a8b27677d16b4982d1dd3a2510b38c8cf69c4111f2bf91bba16da580bb60d073c71497e2f872c816895cb204e429710322bce69ab4b621661b4e902cdfe3a58cd32eb3edfea5045a9c6da1"}, - {"000000000000000000000000000000000000000000000000000000000000000c", "00337a3fdc5a3149803651d9c42a1698ba6d4f7a04072f15964cc6b212950c0314744437666e4d9395f00bf8254ace4a78b96114818016ed92edb00538342a17985a2f946cc93fd3c0249b0940db31bf9575941f00af32c134cb8c331e81e3802fc5969188a19abc7c073fe4fa46c9f2cc61fe4280ca220f266aff36069c06ec91b8ba5403637b8a1088fd165055b71afe22180c3c94b8ad1ba1af7d2d51957bcc636a1ba6d23c3b01865e9cf99d0667c1390466d8577a218f074dce1038f3fa07d799eaf5cc5c2477c7c6c6997082de22b30f5bb8f3a787f66069ffa3adfb73b02a086c1f2e2e20c1a4d188a863218c47c41b875b8a0700c67e38b109ab4f55a5f77ab9ccdb629eb9ee123156acb0646d1791fa277e1276a324bc021f614b9f38e285b2020f0a5d873b30e95d0fd877a8ae21d57a6e56505b53bf169b4c3bce1a75fd4137b286f73004b256b1f5c98103a4da5a3a954a98f0983a0b5b76b9e2be4bdc658e068a4458abf513fbcd79e270bc9f1c076f421f716505cef53d4acae9652656211c90bcc64c79df5fe3270fa669bc150b6c72cb4b66100c3f079e7990d4b65113625e4d35e8ff2dda45430e0a6b8042915cfef34c324b0ba0e7ef7b13c11eb5d63de1868a2070b2758e1d654a3462b5b3d9bc294af6a8fc895ec3ac77f0252467cb0d1e20ba63b32bab286572a63ef8c8de977207d37acc4885b9df3246d3d1b962b43142d23b599a11901931d65d0a7d1757e6d3364c5626041d98d24311a86663b75b3321c43c98f1d0e56e0a42a69647713182730c32e497d597688ac9385af782da05fa5a930b565fab56876050b541057e7a5f9a868342956c4a49b48d1635681abff86965fb474bafa99fd9be768013f2b667b2d48ab2d713b337115dc9f9ecf5bd207717578d72e806d498b411328b91692faa51d2dc4bc80097a046f3c23035c03421e58f7933015dfb35fed70d3b93ec4b6a5ed1ab8db0fa70f51fbd87f9b601f80766d72f08942deddc91a9986068671fb0173dcc4b0869c36f5e35c9d3b9a4239a805a222d9506f107bc0853db9339a178b30cdb371bd3f1b6ddf2627e3aad3d70b2bd045bd9574eb1e976e055d26f7dafbd68cf1d07e1436d1bbe55d2bb99db226d628f62d25b5bce4031d2bb489392fcd9be0635d5eb9c2eb7a19ac58203959ba221c355661e1154f05d6ee5e284ff3a62f10a0e8d7edc44289ab8fb123bcbff5032d7971e45fe1310caf4060fe9b339e4d160735b6fa1030193829e23554f04bd9715affb87247c91b221330a4fb8842c077a228d8f673ccdbdc2e14578a5d7d0b8ad729e9437ccbbaa8cda168cf395e50e47b462f353dabbbfb108549dc3570ea22cfe4de47823785fc937d47fa07e2086b642e9c851f70fef42682398c5b59ca112dfaa0102f66272441186d863c386332a8554f6f2fa5d9a1174943bd51442355bfd64fde83a49d94c63d82e2a05f164c8a92923bbcc1ec1f7619ac50370043c837d17cc67a9eec9ae5e7aacbdf7ce73777f895f5f9c1407053ea7668329cada2e71cc6c4928851cc14e0ff50aa15e9cd049ebdb557ea1627cb75e008e65a7760114ac5623efcd1985b5e633d1fd2148f92cc0588eb8464b6465aa14b819e491c5f50f5ed3f20da434cb670580c610cb862997a9f8641f29c179723044fd68ef18d3ab8b86e06dc1f8ab31afaa6eca5ef271991ac313cc4d0fcff76e53d4dd91fe3ffe78e5139a3505cd276424e6b0da449d602975edbfb86e05f448fc6be60a2c563eaccb3657add250f09c91a7249c27571027643623b3eea4180573c5a91b09f360625bd37f672a1659e4a95792dfa5656dd28fe9a129a61bd032e8f1340096c0fa51833147efe9b7e5ea85baf8163d54eb"}, - {"000000000000000000000000000000000000000000000000000000000000000d", "003947af0bc096d6e35ae733fdd820b28490ba62340af649a5643c04afe2913532b2f44f05d4c7911f6708e1f2c35bd7f91775f40207bebeb5816db111e53e104423db231554177c13c15fd0e14d3ca6767372671870247e6b54750ea8d25605ae46b7b61791b187323ac0fe693897731f52aae6c0256e49127a15d8c66a31e7b7fa7f976542f38469e82d57af3a98d1579ba7708e1de6be39b153dfb207f6bf45c9c30827784425059cbf1bb1045fab7343032368e66cdd8d739a3262460f6ae1682038ef09c9c5067a6780eabd3fdfe48514e05319891fd28b3bf9e703d4d1c2fe4d733d99392a3b11c1b4160e0b786de3944f551bc16ad9f7cabf075653379e0d79650974b800aa77ac7f5fd2defbe314d5277b6e16114dec52233ea0cecd2a4e13188ee51fd0e72db2e1400f519615f6f0ebab257ebadcf62d5283fd92df3b2895e2233d69ed6c841fc3b87e483b01216ca64a01fddf3a1c321faeb37bddf163df5e731780a4dca6cdeef3a0af2714f1c4ae81ca4854299919b7b536b3e3de2b29f1856875d1a7328eb7d8edf221a92662c61c8bf3a1386303c898838e080e79c12e0368f8cf785277e127d5b3fb9a5c07c503d233e4712647222769d660bde38df2ed1849add989174f0d9d0865ed5c77d36eef2376a1546ad328399d1ad22b8913257cd4ad5d2df1b4c671c86849e921ecebb85e2b04c315d0bd90ed698bc1572fed7f376a4652bdfb910fbcbc463ea26ff1e31f8203cc51d0f11a611d32ed08351d058d8741fd431ff5ff7ae35f5db25239b1a8194fcf659951956d4b9d241cbdba5ad20d67bb429d0bf4535bafa32ce15c7082f503f7f439f63f3ce93c123db0eced1eba9b0f8635745b4f9c95a8eef1da420c215a1542edcba7b5ead5406fc574b15127d4d8921b75bd30b3a234c573d67d2c0c7a24af65355bb91f00a481520c082d20519d52bff49bb60dce421bdde01dcd73e1494f6520fcef32e879d4102957136de86607986f3f05de9a89e0a9e0c5b7e654c234571b03301a230f5e00ca9551bfd9f52412c19d79cc5679b982030cbf2c37aa60415fa35112eb5d83aa9081b6186e149734f86150b303bf94119c3cbe7ef49c92497599134d6f508d491c01448a34330dba5d7db14a7de07525a266d2f4eadb0bf848a32985aa7d39dc959f3029039a8ebe4f95158b136101e55ff31a99b71cd248ab100e8275dc1536e8bfdb0163e56ddb27007bd9ee86098388fa348ebcd79175f684c0dd7cc9b5fdf4da500a81b136e3506f5d9fcf60af1a78917e5871351d37106291b51724644ddb7ef5f97f596a399cceece73950e0eb3d802ac8f3f68996fa91efa1d71bd07910e81881194dbfc6c75363d8c4d0155f697a4074dfa0d91b82877e4b13d37f8dc212f04e4527d971b2d9e1db00dbfe5bec61d057ffd172943cb664ed66b7d0702f0478854b9b70b553f4c0631003711ba63fdff6de4a0c8514cd6bcd600285abb2d95852ae966a1957f66943e974dcba9351e2c4de65a20950da0a03effab0fc02b7b709b1029fb1d668d162fb8e1a9db662cf7b6c17d95a1a14e8e519aa18f31c31420da51398f4fbdf0382517a288428ee48db13c0672bf282316598ca690a5a8a14ff9f6baf4f2fb21931cf0971b2527f92180227dceeb5d06147f304f2c863a65e49290f375691416c74bcb7a8beed7a6185ea29b4cb22def31a3bfe0f30f48daaa309b33ac8638e0a6e338d950059acaa3866960abd61970be4661556c638780773085c0906037f9889cfbaf2a3ec9645531dfa190f1a75fa4a9020c8e793cbd2a5ad40e1ab0e65ffaaf357789d61800431b77d310cd9789f8060bec1bdac1afe3739c4223d5b5b053bea015b60689469d94f9fa6ff9c1b918e"}, - {"0000000000000000000000000000000000000000000000000000000000000010", "0024f30f6a25882567ee711f7639c9bc6a556d177a1a528b6c0e86bd427b80a263729ed7291d7249b76d0edd43152c09c41390c9832c6571078e091cf2dd4b3fb52edce3dd9a0151ab369c2afbb249f00a9ed6150607286179f01a9fcba290bb3f32efb86c5a5f1334192c6ba7bf5781d1ad3465062fee9f4996fd723cf90cba5bcad047c0d371bcf30bbc699f31e0b0bd59111e1c3455b0f8d26de541b3658d48fed905a4ccada90b55f6c14f1143999bded49c3264bbcdd7e2dc3222315cb2f99ea05a17c76d836b882d32f1f59dd132650e1c8a7ec8ce503bb361d3dc5ff56b54f76b0a347452de37a46e58220da9f21756a7c57b4a7ec874acdb0e162d36c12d876fe79355b265462f55a6c81124b5165763c81707784bbebbe29220db258a779e1dade11316518e06c984a57a1804332335f55b4bc9ff2ee52a6015f6cff20893e66775d00278253334513e42dc003a38698c130569423a654adbf2b1bb0222ba56960da25a2985d39928aa39211d2af53cb84db8f538080f325e300f48caa1c881c43a51bcfd1f99d39dc2ff3a0fcb594d64650d66ac042b5a23bfd2363312b3fd06a8e60e102e2947f56d11edf8a24e65dc0a53b81c50f224481bb4a60ddfcb2893b2e5a902f150188b6015512ed0e2295d77811a17393bf083a2383f1efa7717fd537b1e86d6cc5ea9a28aad41b3c5322995563f0469678d7e9dc21b2d61f18d9de70445163e7497d22b67317bf8958dfb2eb58704ced631a25f6dbc6f1e0efcab9b6f968b87448d470e8e735e3b54ac1b515c56a4a3c5b3ddd3556b30b61b0f4c763ab9e19d87b4061d80601db0ec879e541dab3dfb8827a0b4be41e7227c6795ee8ded595ec096aff2f043bf7ba73ec12807e8d4ac10dad3e36d72c3efd979bd5d4a0eda0bfc095f4ea2b6cebdcece3486c4cafa47ae111c36efa300461bc89a2fb163d1bd60a48b48c948449106be8563f7bd9941dbbbc4ff97b85e8b67a96390761d584522e7e93b7e0ed5374bf856744165f059f71cdcc7662380215bc52e196786e52244c92b591ca56076bc1f0255f8ae42662d2336356296946b930149af9a74453f900e2f58e40eb3f6e40602e2ede835bfa2f11c44042829ee68492c5b1dcfb19407d43e399c1091addd66909615b26082d3b59f087b28ff9ea2a4df7b3c13084379f7694f1d149935210ee07cf321221bfac7ec22aa34aac62979d3ba06991533dbbfc25feefdb1b32195cbd35ea3eb636de4f23a12b0b105d67c990c7a49a5a29228a162c1fbb3fa4ae8eaa0f69c0affbe740d6c096561ebf7e9f29bc4cd21a8bf1318df9fe8cd12a626e61f475b193d51934660cba5832632bdeadb3a5a6c53999a2bab7c2564c8dbe2643320873c57cf4c480aa2fba71edb6d0af72d8b5ff26df0e53a22220316d49a40de8db14e3f0546b4d6994ddbcbdea8c9147896e2ca47524c586da79530c326a6a279be92c751680374b92b39d799cc0685d577ea0eefa41db1e95f1fbc28621af2cfcbdb569778ff1f8226907d904f0761c354be4f4c555338c2faff1808614f70fef68d1dbe07d4b38ffb17767d53bbc12e8ddd0d151782ad0b38a87d9a0f109990eeb2d320cf1c78df6aaabb7e2eae1f8f2d143fc2dfb352ec47a18dda4857fd2a76083027968c4829f7a904a2677b9a0fa0f6f436233d2682c5b0c1157eb7ab2473446e9be9891be1ed6bd508c61df845a6e7a163da92845bcb43fd7562ddc96617621e07fd74259fd0aa822c6cfdc17cdf7292bbb50fe609e0100c0f156da2923e76489eb6859e3edbe12072cf03b14d04b66930f417beec37530cda3cd8bb133945c789d0e7dace20b4df856bec76dfa01e195326c862f5724c299f711bd7c83653fdf9fc09567b9d"}, - {"0000000000000000000000000000000000000000000000000000000000000011", "0133ee8bedcf9a133108f3bbcdbc20ea045675d4460c9a61f5f791b15b91b7c0db1a98890582d4af7d0805e55b0b1c875c872acd76e629399a260362b2294447998efe0658d475935e383ab542ef1b14fd5929ea040500296da9df4d9cd774571d5fd981d040dea61a1d8114b75b60d11b0d3661f9e7bfa309da505330c610148a9ee44cc0e3175586361848302599f09e4ce463c21f146df3ededad1e77bbedc8a0ceeab61c82e5023e9b6120c734149756f126022eecde005550f1ba17489287858afed34370e335b0d79e5256475ae6f013064ba86cc8550d81d5730f4b23fecdd5ea7c17533aacab23ce6104b9d38e25b02af860b60fce1d1f1e1457d78d1ccaa04494ec85c8bb5ab61595cd31b3043beb6a3a854f9cfaf0aedbb8c77d32bfe3819fa6772f7db6dab772f323e358d75c2ed4bd434ce4fbab3b4358a380b5d32597c70c6507c06c85fe23a5dbe4fb01f9f23a4318ae07c873440d457553e52791d784830bddf9c0a5de768180287160791ce08b20813b53770caeee1c2d162a31add7e103a1c2d0010b231384612c0b71fafd923967818a43f939acfef2fddafcfbce0539add5792042b99f8d89d676f71862991c550da43c841410e395ee1ec885f3edc7521bb751177e8af31384e6503e222dbf630bb3b6e8b49125d37ed97da2526ae33048ecf5cb775a5a017ef653e2f7c97d50f4083c02ea0f479dfb091993cff5dec1861c1f77088d16af6b863415b000db43d4f790502715ead3d2b34a257c139c3cd9f9e4d2c1c34dec4d8e15d05e1932eb30120f01238eb179daaca436d3672e7eaef13c28fc0d9814b1007a77cfdd61695c6af0f3b6e76c1a092c37b38e806d194e8f05b188e78e7b49be4c62b91a560ec80d3d107164ffb204c67123f7bc3e0685331f3d28e05991a6a1afff58d884da125363018ff237798b046b5a5324181ec2c296f11cc4ed4178ebb16795ae055c83804dcd2714c45014abf4c42ed64c13d3ad3f102b7b22f3d4eec8d4e3b2257caeb49520886bc1e91d446da94211b978af11127370a0f53c9d1b31071107923993c404b9852a8910f7a8ad314e9bbf997bea0e2d463a9648a5a0c166f1732da29e399fb796869d0a74193e165b1cab8880e128386a5314631a37264c2bbb643c707d962dff31e531e4d907daf541f98ae9075aad322ecd5b39b57331602e90a7f95b890c36b721de8c6f091183e8fbd655d6807c3725f479b0d4fd0ceeca3b3b06a3a6e19374e1455c4d1d52758ad27f1d8286240248742539b55743625b66d2ba287fa3740c49272aa80ba4c8a06a2280eb14fac687efd7467e2126ffdc1d90c0efaff22415abc0665554749f302b140f6ed8a5dca60b892197a05ac392bea3ee5cb0af169af45b84987a1745dd080030d8756ee1fe5f85ee0496bd28dc9eec59570e52ed13edb00d30116c0ea00e1196b1bec78ed24103f3cd66ba838202afd0417e0929e16c98f60053da41a4a385eb5929d23a2ef0894b389c569031310bbe6e57092d4c3c26812aff0b5b07889cbf3f1dc7e5aaabd595cdbb5c31c7ba760b822363295e921051152d0695cb2ccae9f70b307c866b08d72c5b025045a5d44a60b007f71f5d30cad4654323f90375a329044bf32e030b0ef9d74558591a2ee00588e0e03ecb374ca50145f4b239b32b0b11bf37a2242517d2caa4a27b79b793f78542604e5a9e3cb08e17d5a73b92c9dac518a081bd7e9d5eee206733c833226caf94d5ae72e9ba9173ba2ba63d790c513b58ad07c0c329da151783484302c54cd17e7e2beb33284f0d15e3986dc9d8897bdf5724084ac9de96cd9cc4f612ed7a1a72093d3d05c6516f5f3b6f64d25c0b36eb1ca6260d4d6022859badb9520ae5abda7a1f567fc3"}, - {"0000000000000000000000000000000000000000000000000000000000000016", "00ad4c1b755dc9c58e34f04a73cd72d1fa52b1b901026c53f7a34bbc8d6a49b0e9f9d8147730727d923304fa4303d831cf23e0c770c23954aa3db6fa781ecc19d0046acf8b2cb3d9b591a423db77e5318dd494e9132255bd9a4cf7a1da661286f4a90b3f4add9be4ee13616e6fd5487344697922c68c3f09eda234baeb4917916be920a204013d311233e9991acca8833021b52b746554128ddca1c381b81865eb5236ea389fc610015c26eda3985ed36a68d049021cfd7c425a73940a3a3734845fe7bd7bd5b5a871cadec99699565653371b8c613629c95832a460c4afa969f7699e73fa70ca2294031b9de3b57f428b02956af9f6aa1dbf7cf09c064462d620ab60199a2923af322bbde70471daaafc28018569bcb794fbe5e295a6c6c2c0ab58813d19930c692a8e7d88d88a878a6557da3a9e8de343d5a49f3a06626ce293ddcf216e46dd4bb9c42a77609745cd0234d86e1520c4c1e6c200e8c864f675bacf95a2284658dbf8de946d9cc48ae56d14e6ca0f490adc3f672cb2df0227b14b9de92d231311cacf0ce3cdfdee7a34d4ede6b2e1e505586e474451f441975eee1e7eae0416bda82ad5a23df8e4f1514a418f58ae980d67702f4a652f78acc7c1afc5f481bc716add96075287e329dfeebdd84be8809831b6c2cfbfbf120d9e139ce13fbbe7672a2c302d996c96c272f3e792657f7dd03704650c001bad0cff9cf4a22e0cc63185b1e9faf617231491ddb98b837ea907b77f95ebb97b37e4fa9da628e214a9a9747981ff4bf5cb79d70c9f0a4878dd6b4b5407417525bea1657fa8f7b5f8f4ae4bff1748a1088adb41650598db865355dfbd57a4de9771ff11bf0973963aac5d8d4f754487e59ee436727ec51acc0718ea30d446255c3f547ba6762fd1fba6dd3a79fdf13962ff87511a8aacdbe743a71ec5955d626b3a7c3e00e9caab2614aa79f8d1e8d424702a3245c7fe701844f83acaded41ee53b23893083e788debafe19f3a40486a5fda582caf61af5a184ed7fb59cf8c7d438521b0ead4dd007f6afab892350afefab6d4bcbda981903879c05031d05bdf5f6257c415a87aa1af9dfae8a1ab4469829df644b7829b3fed35ba622148edd45ad04d88ded050f2a42fe4ad084677addec35c6efe69617e92271008eadfd5cd723ae39a9efaa47d85460af08305c72384789b50bf014ae2ff20f5debfc7dcbf013e8a555a9dd5dd95dac81d95865e1420eb930eea31a202958dea56b67e0ff6500e655c1a966af2b836e269a2a790f953917461e04cc96dc7dfe7fa0be006e0c0fb4c5b15648e7eb43439ed73686cd1996a923c2166318ced4062c9e7541a4482e28db5dbcbd5d363a342722137de0cd353a71140704cdf0d5bd1f16a3c74a3e52999c33d289b767288f82d08b22603afc476a01c242597bc13d0fcb75f2349922d9fe8fae376ce136843322775b5cb928d9b66bcabdd5032b39d9e6ab0727ce7e4dd767131908f12b8bbd8a3daf517097101580647e2725fab5520e846946efee91fee2ba711303fcd640434d8d1c71f06309d2b998326f3f95fa3227c5f61c2ed57f8d4b58b41144ddaf319eeb55a1a104477b0664cb74e3fb69d08e3c96df31d7795928890b5da88cdc85060a5263847291d41ac589863537280a37829bc4f4dc6ff2c7d144f7f86dfcaedc6b5dd2112fb8e1afdee45bc400261b39dcec7e6e581c99e50ec480b499dd6eaf8157816860bee36cb604df26d911b5c2272b0b822c84a6f72754f5e7aef93f5d4db80dc5cd8f6289f2725d28d8d36cd02ae647ba12a50c35f54a853c18797cd79cd376d8b13131562297e5f7113472769978ffc7df12a639ef427f05fabaf921ef21c8fee985237b2f5f8d35a057313dd9c93f74a07c"}, - {"0000000000000000000000000000000000000000000000000000000000000010", "002847a9e24b3a767545e138e4dd96516698cbf35528036ff7b170f245f14647de37f498ca93c87a134822575520850c1a31cbcbf53ddfe5cdfae2f55c865b6558f719629bd4abbe39d6943e45a83e155dfae96508c3b531da5c15d1d097979ab87f20b3a7255e4d630fe9711dbf92dcbfca63326bd898f68555e919101019b84d29a7117074cd476473f1372149f343f12b792dfd6c73f296a859ddde746aa666efd96421976e4a0290183133d93a738261f368002ab9e1b7c85bac1c0f5e8125495b2b5ef68f52a7b5460e2e44bb790cb10850bdc05e10a17edc78d5df9a583792510c37f3621634ba4caa53d68eafb5341879300667a8a35dfa7203440ca72641369c2b6008f3a2d4f91a910dd690fd0346decf48dfed91fb1ec11d3871c0b22df9b4553108fa947f9b1f841505de02efa66cb3726dea9c0768116acbd1bf4cbda712fc23c8dc446d99f4b291111f005e024f4a4f26cee7d15368c74d3e8a3388fa537230ffa6742c91e55771388b3f1aefdeb74a78bbd6160236609de4614687f7ae63f1c3a2c1e2fc4fdaf43c40bdbb5e749948bf609175a9b361169f8b453c7c57057dbd6e9e94c4973de8e2fc8b47f8c62cb1940e0f2ea83574dc6149b3e243c80085ca629bb0327f71f20d142f0b5ecef5cf2167a302d2aa600f4ded7d70121080f99edf8766036d1a235cf05991d201073aaace0326e4796b050ce559fbb123f909848d0e0149b32e27c8ca71e45236ef444b33ae3be7c8f94105fb62f00b5817787f211503b2f83252e63805a9026f93374d1ea31ae8a61302cfe71b67a7c7d7fb769388170272054faddbea5ce42b0ba4d16c3eb6544b6136be40ad164655f4419ac07956c13429f632bf72eed3d8daf0089a715f40647fdfbfef85816569761338d83f24ab1d5b5d8621986e6bf5256a1ba854d72b52ae9f412a006d704df8db7197022a13b0dfe61c0118bcd45b9a285fc3580ef8022fe97ed2fad3793b2d2a57ede2b9033bd6919bdb9c0bfd0de372e6b2c392d1f93e8ebb1435f20ed0673a077b5b4293d0e75d314116af14bd03ee42632bd1e629c68f8065321fc1ec735edb0ba41115ed819536c15fe66af3575b4415f4e076ae2f9a09d594b40fddda23da8193f97b37443d921bb686ed66b2dc6f4dee651d969496b6baecf91fbda73f4f040bdf7e6c8dced033e018515e969cbca90dc29cd7e80ec8bd83a1466f0b46facbb96dee8c375bc71ccdea0e0f3a82ce531802c44284c10b61cc260e641eb1ec16f7a225be28bc13910de4317271310952464baf400c6fdb9a07e470d941a0e1684bca68f4987468ba23157fb70fdcd1acd89aab023aad9d770cb2cc07d31c17ca66750ea77319878321f360f6c8648d4e55a9231858adaa238e8551e71d42d8374708de818ed8168b013ccafd1ee122b1d6b2639e5624dfd270c0de23a2203b7b2a2d2e1ca19e1e4411314f3ca190dad02cb80777f1675e45ea26a76950b4be21a941990c9de2613cd91ec3ae90af059886f50d92ffc1bb5605bc1c8607ed02a64bc6ccf2c57827ae91c8b66a9cc43ef1621e5fceec4d51383ef8f1c5bb51508d658bf915c50f0ccbb140341b01fdf028d6f349cd47231f5c1a44b419048c14fa758ca3d9a822b53db171a201c39c54c0109a1eb1198ee10d8877d4871cb6c4a38ae8be3628ac1b85fc346bd481cbdf3b3a40646e3718d51e8afa198801c3e496b1cb7dc1549f3d7402767c3c76d237264ecba4e45ac9ad953747b78c7802137dbd5c37191c98fe7b4ed2a81be2c8522d86cbfe5e1157b2b8fc58644f1afd623f09d062ed8eaffaaab36cb35f6de728281c0145f3dd35ac1e471b273b2b268f5ddb3bec3192facf438d639304566c4ac6f0e83794197ce276"}, - {"0000000000000000000000000000000000000000000000000000000000000017", "0234ad6332dcf330f5fc461f6fddcb899b0a1ca60e1c51ff039347c08ee76b14033dd30ec121769c0dfc058a4c74703146cd8b38e515b75503732853fa94db689113fb46e2da45a1d5285f8455fc2f858ddf9fc9055653070793bedfaa8f34151e2255e106f24998bf0cd5e5382905d6f2a889b398c0fba87b51a63e4a8a06247ab3c5d0e4cdddc8106625dd11b55fb5b3515819af119dd2637a7ba071a5461f6bbccdcca2fbf7ec02dd083d6f11a6cbe20bd72e77ef89d756777e39093f232f3eacd1a034cadbe4a55abde9934ee9fba4d6111854feaf909598bd0308e3354c923ac111bec1da20bbf404f3a4a62132ec52193a69f1ddb44b5bb47813dba9a534d5c8994be43298583b1699574dcf6e2f42e6cc05efaf490d9941c5059144b9cd82fc505ca71ea6b268fa08bab184e0d7f22172c10360acbd85044585dbb97c6ecdd7cfa844d567c567fe60f7968b7602423ee054823982b3bf7510874603f297031db5452124f6e6646693e5ed87b3aefbd6ac2d986f9cb3462e8966f602ee7d29e579834e51d9e8850007f0715531c1c68cc976e1b1ea26e466c1c6850157c8528f810661025ea444262ce98d74d7d436e35960e53bffd445e28e1bb41e9d5fdd7c145ece400355e51b1adc7a0aeb6efc664aa21d357c52d3c64d741a77b07915775442c58cf5a1b7cb34866a5b74def59b94b15d521c043a308d36518237ae59921401ccb3e91fb51c9bf02d154e9fd41266a5013274b74172304a10d8fb081b134b1edd53d4d9632e3ce86885e05a0ae9649ebd27200cdb7b6026358b930cb2c1e1a49bc61ff51c31120a4bdee14447961ccacfc6f51657d04a3102d30c9d3919562ed62735039be104b4d6b6555d5e740f14370af312a83cd46ec38b7052155795eebd97439c8bb61796aa49894c47ed2bd352cf8be97b8d6e4237d37702b3055fa4cc3db4a45c741b8a4eebdd3bb790e30e2315a477b0ee56f3a70f47969875241bdd113f909b0627a157a820ebd32b9c816869d4e4085a49e6a3dd1a8ce15e3da2c91920ac51ae5934868d8f58bd24810a8dac67bbce1921f8b364f45c2904aa0ee792dfc43bc84c9789da3226e84d278ccf581036411b18af0c2358b571254fe4fadb5e72feff38a1a6295a73299831404efe7b17c821e4f124943c4f0d29841c18b65303f5a4f18c101f57120c44d7bce07b5178489a0d97077c89e486a912e962071705a8723baa3455d5bf420baeddb22f15238b23ae81c461b52ba60d263bbfc731d9057c59ad88c1eebca3337ad122ff9537bde562247ebb6198152fa3c9e5d50c736fcc773812baae51562b45c76017ddbaddf875d97246a2f24726968307262ab69f2a159d653792627d482e8ff21801be8b2a3c41ba83f559fbc73d96d62c39611779cee90ff34102f27ffd6e8fcd04f8c1c983b8cfcb469cd07a49ed16c677666caded05882b11d04b7ea8b2a50abaa48b15923a0110e7b149884ba6431756042ea9fc3c20a01bc622bc2b6bbbaf9c9b424b372be84547c7daef8d12e2d4dda9454aa3801986e72b6eff4a56a75628e82f5164df1e10fef3c833d4a34c60e64dd09b7b6b1f17bdae9ee4e13069782d82d0dfe4aee17f94983ff61a4541266ea02ad3723071f42ae5a1e0f5485d725a09c37d5a072544a5629fb55ab642ca861bbe1f055f3056372ee1dcd3df8ffc091656d81ffb76e7feea4812bbadac26cabb89a587064239441225df503d193518c950c882c8d727a55d4602f95ca2165296b785270a33c220942385a7be67016a78571350c35f56be4c0cd512a0d71826858bef4754d03f70e326361a1df527a252136c730b379c54d2ccc1eaf830e7990eee982b8b5ad34e10b4fcb9c5b33cb22267d74e695c0c27"}, - {"000000000000000000000000000000000000000000000000000000000000000b", "0012b949cd1c913b7c4809115f6c369f7b6a9cea133415652c871a25e3fd5fe3b2f3b146ce2c805e235f224af3fe1b70b345ffebc67c4dc8c96eac9cbf874c32a85624efecdf397e3ab720075eeabddcf95386f701d86a24468c2de342b660bf71dc0ed8b0c02af85c41099f6e1b3078b9fb1a650d675bd27a229fbbbad80f7cb6623618da7ade7151810ad85b30f4cb5b5f783d848e78cc5f4f0f5a45e658cc3a037a656c5e163709e85ee7d64502332c8bd5f61ef4becdc10ef8d1f725be84a3fa23f099c0dce4d6a2f6d55b3b0f1e37b014663abdc68c4753b69b51cc5ae69fa4a9ae72518d28b57ff84f987b41a001e36f2424af6618085d7d950e8c0252f7dded49306f3aeba2f3934adc8b7ccc74342e83014455ba7faf54241515c95e51c05bb4b8db1bb9a327348bbff8be5b851bc5cf74597e951790dc1f84dc60f18bc266d77bc3dedcb7bacef722bf9fcd02bdca7e9b5adaabe9eb347ad0dff10339f83e82c81dcdd90ecc73e221e0e8352b86b5b752e5ce1b539203df03299db2216fd679c414612651f5e40119161507120745f6a4a1c3c21761fd19f4466db39af50e0f184d7e63be6878638d8f32781c6d7f632c4aba4e941f1ff5097d5e5934f7a298ba44f06bdab37f79fa801ef78c8311091e256daf42b8641c752d4f1a8ccc4429dddc971592f01d8967987afa51af32f99fbb468903173dd89d5b7c65e64310db1f6168ac71d8ca418a06e5fb2a65da0ea1e42d53abf86fe9b1eb9756fbbd2ce2bea9692124c391254547132ed0f191ca7baf2454bebbc56065cd9590e947938fd12d4e73439a5e870523889bc7839291ccfa633aaea667a2f3b01b4ebf67aacc6f761aa687418f26c713789bbf59a55c303e1cd62904b5d05819edce9305a3dfcd594670b0ae6b6252d51b88a9f93b8ccf67896478d8ca573f539486013db9a3b1e8cc2f70c8e4c07263a477167519ff9f7d62fc6519df82db6eda5957077338aa70971a0e1102ffafc7338f4f71c080a08089dfcf895a307fcb6407997c81fd46e6f1b2d1f2fb68752458f07f5db7b603897e1f0c61478f5699160305c95ce2fa1af809850ea0258f94b62d3bca81e5fea9e835e27599ff7e8803c005353ccb97afe221013cdb30b50d1d6c79252921eef267fe4b58266277847e44dbd75e87de590a71036fce65f2d8ea75affab3db612362dd5a5ceaecc334e03c3e267a62bbf6914580767ba8c6a1af1bd9bc09cb21e4725dccb74c90f10697a36dc56adcd6d4fa3d58c70230ddcdaf895a86b4befbad9e76837bbfab05557436782c6e91c879594d97d1034b4bf45eb8eb288e87ac390eb08c843e55e758f0b69d9246b31f8b163dc67f92557c132edd2229e7459b8cafd30e0dd8397cde63fa65b4976cdd8545023f0b5d9b9cb00f3702f8acfd61d27473064b434a18221d5674151cd75217a98b3d1d9b598da98ca3eeded8038246fcfc67ca17321b552e1552b7e55e1446e3d987f26574b9fab418b94b419b19e907b4ece45faa6b4732541474e79721bca7f1e3924106f1e393afb85d9268f1566cf0803c34250587e00781cfa3957040b184229804bd4b49249fa1fc108be3087fcdb61254edaf32b9963f0da8283ca96bbdcb1065bdf1b31a4ec91591edb6340af20878e2c80b1f20851bbad545d03ce5b1c4c81c9eea0e5b2b1284eb95a98c6d226e26eb19951ec7ae5a532ae9d6cb3833bf3bb7cab8a2f4c6e67a558ddfa55a2d0f2496f2929d49605633b14b78f3e116abb056eb0cd331a1e6561a8d459cd1e8e7925b3c9f02edf5e421d3270d0acee66703f0e2bae0d1db0e8a8435443e210c3f1307e579539f3ba259ad69811d254b940c8c32368a21145725d14dc3e43aaf419bd5f93c569ac2"}, - {"0000000000000000000000000000000000000000000000000000000000000007", "0122f69589efba97bd9073b0dbd55c0a2355df13142f9eb1f87f508d80d6985461666b17ab34fb39e4b305271f26c736ab25c2a2534abb5fc042bf1f3af8bf26d2c66ce5af1693ceb1c488df4b66a21ec83b6bcd02093f73a09fbb6b81cba47af15071deceb41cc3a92a756dce14d540c5d8e3931a96b1b465adee13b347064de7a36713d1154e00f22a1fb60be6acd3991cf60ba40a8396c778d2816334017ad2de5a5d63d7a8420131974094b04623faa8721292af6f6cb8c08a13ab210b1e1e8ba439034dca6350d86fdb2d39461a3bce095b7227e6a9c8a9ba37925e7e5cc3c52efa6a6cbd1ad86735cc9c6363b680956cbbc83e928bb17cdfa207d240435829a1f1ca66a6be49fc6f9f0952bca443197e034f8e57186d76dfe412aae8eedf3d79dc0b56163ba8f1b2e74059fdd402842529c8c8a4c53ef2aa228bcaf4af515da0f28d3791d8c6aff9f81ebd611e012ef6c93fcd6b26950183c18f4a4275aa74eeaf4f02e72ab5685c58d14b44057258ac7b3b91429cc0c51b829dbe529d63ddeea063061e32584d0401899ae31cc9b65c892f584d9615928e759f1ed53f210e14350217ff962d8e4bb7e122a220235df97cb6cede9f813a12ba109912706b0b0ee85e04f89bb2bbf0fbb7852631d42ef595c4378348244ed1cdef4eed805a75ad2fe62fb7e61c9d0d36dfa31a93f07671deab594a63016642b9dcf4cc1dbfa45045fa48dd62d2569ec272155c4d1f76d52c3b5d1791ff624650920dad3e70d7080b5d9e4e4afe44f268d58bea7e0d4a58ed3c608f092a3b3c690df3ff559fc0f821252941c7a6fe763f05f7d04f65930c45ea41543f40a75e55a6cad89ec4102f242534239c475961717cbffaf8a9f32bd8008d160ce18bbfa4ca636c50b24b4551d1e8a20dac21ae255aaecb1b11f64d856db3301042d35554080d3f8f016f60477fda27b30f8a80d327261a1197df9ab8e81f5373602f93c591d005d5dc36ef990e87c35c7c35098eab5d3194dae38474640578ab2f7dd38c1d48b80e9df41e17aa33cf8e2f76056269e1d6450658dfb903024e495a8fe42321d730d2b745059207649982260d253d3ccb6b8e29ac9af47f263a84821b1a7c6e2009d27dec586036a354d2680c22675816e7c31f16ca129b1c88427921d7f2f734513d3fae398c0e91f9950c261d1379232969ef2aeaf51d5da49efacabd3e24412d64b6e2e3c9e9f52175ec0b6d2d99e0e61d71221368ee8a7fe48bd79c06d79f267370e2ef7cd94b761998b25c5536caafd6bb34b0ade1d96341d15ff6470c9a78f157ac7ca57fd2c51c3bd50325adc312692218bce61c10df0175b39be6091e6d0fe232b97704aa0d59250a43c51394e12ca107efeb5da2390914e7c625ea8cb32030f2dd88d9b41214b0581d63691f111202af3f36a2ca986180bf86687dcefe762c0a58b1382a91be0c8ed1d7cb6a3247e29c6f703e77f53b8ac80c2887207b9d6aeb7cf4789b525228c743a37f9c6d1f9913866b098138f841fb1f865b5a1ee4dafca9410e4ade41fc968d2aebcfc1dc29bd22b173b3ad5ea52731355a438cecdc7020353de1b160de8467d4c3cb15c9c7f8594948ddacfe51f228eac7ad0d52dd1d6129e317759166d4e78a2c26344d70ed0a15899240ce02c784e229130532983f912435d837b05c5b8414af08fcf84c61a0252bf4dc11942c1ac7aa8a805ef86c4049ca21e49a7830fd73a57c5c2db48ad388bfa69f477c33d342d79cc1a744d8bd7b6e9b0a969d99d88c1a9eedd422b1462fd38de530a2711bf1dc5678615522e04aac0353a7ff5dd008ad465a5ed6a7a5d956472f7bfe6011d2ae017fd8e7a6c07f9e4aba929f061f44337733fe6baa23fadd866430b4e33275579ceae3"}, - {"0000000000000000000000000000000000000000000000000000000000000023", "004f01973c4ff102b9dd97838d712a664024fc2b75195bd5e56346be8dbef5e7307377cc96a89bfa8e8f22c9aace5f0abeb5d692837fcab54f1634bf3482f84a6872c838611f3fa004868929b8893acbea596b10044f72f810da984fb24e17d5a9ee20463c4b373fe42638698cd4cc3a848305e5d77e3f7d363eacbdff350fa45a98200b4dcab0dc93fa5628587d6dec9bd636256f823a370b830dd28f95a714cbb8b9f16171fceb084818a9cb59caf5449942f698cfdbb6ff9497fd5121f615c470af9d3bee96c2d1a83680b51a86dc5348279ad252eae9eb75dffff47b4175fd99dd8adcbe3f3d6195a4d859f39ce64443fc8b3dbece79b4f6b601085301da69430b964f5419f373573672ecfb58383d2375fd8d8bc8e10e9cf644000243e1a1b253de730e1eb76d18cf9d610aeb8729b877dc4a26e9925e3fd83a599e35c4e7082bb2705493acd8b5fda491528aa30a471ca15ca2bb874a6f3184e143e1106bbfeeb9aa155692d0df193c94fb6d76f810c2b9dde86fd951a115eccdf3a00c6652ab095272f8d7277d7c097c890d1b8a2646a356c100c47372ef3cd1a77eaa07b751060d9da58f34097257ec5f4186e190fe825ff57f5ac82e9641d52694e6b4cbe295d3d65c40af39943af044298b936f4f5cdf517206b340169a3d350d3479500e2ad674dfb250bc5ed06074cd4847953299137a79e40f96f1a47575350fd428c2c719a354216e4910e5821b5a4d463698a67793c6a39b29cbfac0f3fd9cce7f12b5272737e9ebf9a2d9836916a0775cedc6959c381dff099dc2491e5b569aa3bdfc6391a50192b036e01cfcab87a68990a7a39b4467b7b2ef71247a1a0a24421ca70bdb5111297563666dadfc022e7651382d862c9e7ec6e26933b1c201a31c10f72cc9a9cc1f5e0aa2ec7e507b2a755b59a3db29227c4e974c30ba75c4006e6be6d772b9b7b29523f3b84240e598033179203cb9c67d4edcdaa5c09eb6d7a23ad832eafdba7c3601ed9dea93eaa76bf1e0602b8a833d8a4f7bbcbef90f3164ec9a06f5f8f96f1a1353f014439d2cfe67c604e963dcfc4deff3c0d9a340cd37402239481ff1d409e3aed92b1ba5e58831519158354706b0ba16db43192bd2a5d08dcba1c10be4e418c4838e7fa9759b204386fb2365e1d2c3adfe0621d43f50760bbcda5dfb12178d418fa7fb319ff7262b08fd3d02893837d2f73e4c5b848024cbd5e38256fea5c42e9e97fbd7c7621ebd594bb50e0a3da064c7f62e6ebe0f72a0dc3e9d315acd01a90e4dc9b78715c75a468bc673a6b9a8921473db2e40ea4ebde5fce2a1584e641660951a5ce8324cab4748d45c83c616e3dada6d1fd5d16cfd12f41af7ec2450e5418dd5f927f2ee61a5b6d2999e8bf631be81dd3160d2814ca41559c73e2fc664b63e8f1204c318919a91414db9db50f47eb110857f342c716c548dfcccf8284c2d6c3359df51dd3aee8a775c7424177bed8f95d9d8e1058ce3aefcc5f7dfa45bfdd3ae2d43443a10cbca37e811853863799ac5b210d4ef6c06ea1d3d96964904ff405369554be8a540a24dda84223eb1f6a2d048511ff6c4237ae8ad7124bdbb533d3fabb7eb83e7c1f1cb22a8ac4d4b500ef84bf9f81c5567d63dbce2f6099c4f65e813f09e35f059922be60890f2213012b04df81855e93bd93e01cf7d7aa7a419814d48f5a61d196c64f38c834a1ee1247132e93c21443911a6092428eb2b34c0fad96b6177b0f4e9b2490d0b715da273f96b98f73ef9d9c26b8d30ffd9d311165b422d453c6af16d8412a954720f538e5d33ee3188aff044a537c5619236da90605cae091199e3cf2320ef56a2371f53e947d340c871dbbdb90bd74f893e33e680bb94831bc6e97460e2b51819fd293d94f5"}, - {"000000000000000000000000000000000000000000000000000000000000002f", "006096c727b210b9d1b9004b82b974adfb5df6c14e2a974c33260ab5a39f122791483dafc32bb95c6e2010b0c9177dae668be8462365c9e0546de581fa142f17e15c0811cafffd83bca7b759e5494e4cdd9432f302555b402184c88dfa55e15923e4a10612305471d812646ea3dd77fff5d8f5a387d2f16d3d3bafd634170ff7abef47da24d32ca16417e8b7c00278475ea4e642625f7451d9321f6b63aa09a7e821a28ec3dde6e301e05e57b1e0148784c3d32363993a117a12506b1c0eb01fa0126f59cfb633d353c61d2ce9a1b991221227db6a093351c6d5e6ed25ce8f6b95f9806f6de3d63a7b3ac299d44ef13ed0642eb12797f5b50fb51d4f0541dfc958f3482dbd8fd699f568d7eaa1175cae4754308bdc9bdd2d35b00bc6321633cd2ae081ba254311e261111189366d0744723f071cec38dc33d6136b55f545e71ee8c8b15af087adbdeb40f37b40bd8b920135331eacdcb465e054c0fb798efd1529374c108f15b87eaa38ae61fbc751d47208c7189a245a383d4632807dda88658e73da2535e743cebda9fa4079927637ea5e9704d435cd05103498f557d8416e8f9ae021052d289ea385caebcbf3b05e17bb9105603b7756c90d35a28a428bc57b9d8c221badeb27389be70a04870cf06939795082cfd267d0ecece5cc1e101a7ff63e24eab7cedfabfd8bba2492db05533e8d92cef3650d01d6e516f4cc4155b4c3f27f98c252a70aabb9784e126692242d928f9cb4cad3fffeb4604d43b83048d708981fbd3d8f9d0fe5d4445ddf3a7676dc5b9c6cc51efed4121953570dec81b84be3e1886b494bfb88c004d19d3d1ccab1ebaadbd1b436efa02736e2bac899270ca3653f8c10373177c4bcddad6b07275cfa3445056e3199e846522d5865a6417e6653e2a208bf74f32ec639b6ce57e02cce39b8fe2df7a9d6b2e85cf83302441ded5f4ad005eb7033a2815fc2712019b5f81629b2777ad68b83247f8c449b312926bf12687e380014f80731655a26f56f08a6d22a45a1a61c8cd8bf5f2df2cae8c7900ebfdda686279d69c6d5a35817d0c9097c1e73d8c2f61cfad213f88a55d8de2e1ab96bac0b35ad22e8d91289fccbd0d8cc9d91985ff458bd7918b97dc45814fa6f59fd96e76c775d09cebb52f25d1f9237c0af245205e928e9faf9565546e5fefadf2d037be71cc2935c610e8bd15649d70a30ac47a567d31998f46998d9804133f6549dc5ad847e874abe35b31699f4b096221cdb36a52437e56edb491faedcb49621f232b79f4c8ecbd487991a946b8c32b213dfbf380d738cb50b5da561e9f6a2ca547e3c6d5631b7a69e313ec6a21495dc014d74241b292a56c55b3c7e94b120098f9736a16c15baa3f35916f6c6f38492be565671db9bbc16a8e8f56429c8fb4eea372e66173c23c606e1bc9b1806d11523455360b5aabd2564fcf7a8c94bb71799465bf1c90ba817ea39f9f58dfae81a4b0a23fe31273d392907f36dc4410b3c26cdb191f5332033e7837933e24b0fb728f5d32bf2f2d2b8243f042d07b2fd6b13e6bd696815614603b5e1c20634b1e0360d53f322cba64e39797b314b2516872069d7b4cbc12b773d5e0396250dd32c96181742a2ced4dd78e9ba2fd2f3501f26a0f7ca48c99ad3e3d4a75f609f42db0e1f8cc4f15487a36ffb76ade862ceb201f33f47d1101d05765197c2b702a75497d066d449f3a8d7ba140e2e5f8f1de77fcb4bbe06c115cc382f0e173fabad37d21c75d950c7aaa307949db1beb70a2139955e2c1817a720e7b1d9f1b7e8b20b68a56fa48a7f5db066342564edfd5328c9fecea51358fe428a3031da466f23e5e698150cb41bcbbca4292854f86e70b79ab56c3d7774ec9a20e0af6ddc4818c8ca177a24eed16756"}, - {"0000000000000000000000000000000000000000000000000000000000000001", "011a0a8d08494acd366931eb0eaf77099f5f331eeb12ab66a72263d49952a612562efd7c511652dba74c28778ce5f21cbd435ab922eb84fe96012e6d1a1fe97ce00710cb74d02bb4c417f77c5bf0967554b9415f020bf73137a41603ee3bc4a9535aa6e213b9b9497907ddadba43996d92cf87a418b83cc026e97abcff052eef33a85d634565a3a6b47294cefa831e6cdcd0d153eb7db22919890101f7967c4cc2450efa857ac6e002e316c36c97430583ca31032cfc9c261c739ce7520c61bc2db09196f34ee7731838324709570ff01c070f71bcbcb19a153b4be243856c51ad9581fa1acc171c4a6e9c5a908ae707959275eafe5f2e848cdc541e03f6aa1451183b9b5bd1c446d1dc75119f50b2f6060d7ec943b934af5bdfcd16f506f8ba5eb1be7ab74729ccf584439b7fcf7c016a0d616c50d6bf4cb8c44b335f4472671e2c37e021b4d6b332cf9a34811dff7801591c4e8fc60161656f54ccf658aa02df6edf25a943370e1f2fe41fc7ef5814cbbcfb98cdf7ed5d9dbf09ae97fb6b4b6986f7d341fe67e354dcf017ae76c91a30d2373e1cb0e6f540e2fb805e654559dc3707e310f085d64284b688531444f0a939660282e19fc6ca24f0369b7fb8e9e3fa9fe335c2e240c6eb729f9d7f255dd178d172bca3ebafe51ada2f029b5de4dd0bba526d4d77eade16b30b9a45b2c0c26236b279575cd601a1e7d7b7c8fd29b823630d72722c1683def9dcbf2e3ea2863fa02387c19723d171e9bec9c3733237350288cb46be8e8b4496dcb296535a08331ecb9bd38904c67c26ab19245747b4570d94c9f041e030f50acb03ca34cb0a81976151ecf119ffa5b63616fdbc987649c7fff494a0c367e4a384e165b0c01d8216f357c9304e233ec1d23e32cd00e5ec795a1252d776f825333507c7285c2abba3d654d592cdd0908e2633de62ca0266cdfcd751a004bcde10f2562a5611f376b5ce271dadf6fbad140725d57762aeb86da32cd97f8b882d078aea81de849bbacaded65e1d5bd7f2b21bb6a00a3657ef1463574c33209654fde478945e01f8ba3bb10586a4ce50da5bd16322016cb195a0f5e00d75167f10568d38bd0a83f590bf6110ef75f34deb90f54a4e24a5597209500f8c932cc4b4fce52ab360289bcf4056435b71a7b0b0b1c7e8f737fac3dd66b3e89921f103f171303a5d1305dc8da541423645576dc75b75f0079d5b4ca8cd25f3024c420cd2eb10f086aa7c6dea097057fb3ed7a26396b7a0b50e78f9a82de16af07610ce4a9e69f06515a3f96357f6fe7c0992bc12b8b806961feeea168425b37311076ac1afb8afb3f857f2171807408ed21784cdddb354c67c2bbdcbc0b3df373c2bed09bf55b7199bd306c80270e916461052578e4ef3debe89ecf6f1ba57a4fe0976c2bef8191f9e8f02cbcd59a996915939b9b0fe8c33fa7133307ffe79080bbb4e2e91a067726b658fb0f44b6d717730cfab0f2f4b7e9b896f97f205d529192e7f4e1423df04d410d4930f11d07f7cae367193a970c720f19b48b89910b1c53d8fa8971f6e866740a0d227c394727d0cc217ce15f0ed9300d1295ca478886f62cd42a7ef2a3e31ced2756f9890c11374c5c13c5961fd9a34cd913d39f8874a585f2e0b1a8cb539a135c75db45cb6e50c0ce8575ca24a397fd6e5b1871ac6e2207e88db664f120d1210d8c4fdb8c8f703c5b0328be2cc15faf35f20dbbd86d75dd531673db680bef2026ec43f9ece9b419a24e394719b61c4ff8502a5fc68f9444ceb2fa80dab20e792b5fa4dbb8fc2df10675e991c08f4bcdb348add1d5217c7cd5388e3cf1c248eae242df84396413e8c77db1e3a1305ed87ae50f54ab32d21fbdd44577b9bec0a6adad3eee7866a11bf5b525a80dafae0"}, - {"0000000000000000000000000000000000000000000000000000000000000000", "00e60a09b0daded79b3d858c2657320e58333aa50a46a68d58b7204a95ba7154e20cafce3b0c14bca8e9026948d845ccdf8dec2f9612e338e13e9f2b7bc6b0697c058bbd66ada77cb517127e44ae3f5e84bc3f5a0b3c954d26570e0f7841a90fb3f0e4eed7421ff6e50f914d1cdba4855380c4b9593cdb297704657a76440f3eb55c095cde5520e8d58fba66596181474ca4c6543c3dfb579c9e07c59039211871aec70de01aa75b0139f26ca45ae0abb76fb24128d4f33e9ef93865c81dbdf2b8b0d0ab036e5d62d8d2693f397730d5b7520822ba70e1d3372512bd27a3b46df1be7a7116e49a1061688c1d4453c0f14152401230479d2ac42cab1501bb250a8f0e99ada39a211f8563aac607ad763e853216db65ea16270b53f3e45284e619d1272932f1d10ba1e0c99e9cf55159e651ee456bc23898492898231f04d6b200e08661241078496d637f031f0f1ceedb06d0f59676eaa109882b744348db7a922dbf594ad92b42fe601d65839bf2b11492b4fc8a72f5023b214b0cf3339685b155f992d59513abd51649e50cd4544025885a20c5e9d26db62e630da778d20956208b3cba0ee34989d313a346e981d18bfad9a7a466cc8c28a22c4cffb61431b739985fe634e23a558b20009f68ca2f3ec303aab6585dc5d7963fd074d9d6172e55fefc40205cf3bd936cf8a6c3b47db4c38051b26fee7d33108ed454aee43dfbdde723b432c008ccff257641eb269c7aa2b9240cafc12b46a98346320a4b7a759a9034b5ba1b57cf317ac4b2a7b606d1b60e5042fef8bc59075bbba4dc3183fb5867259b6aa55f1804f9c9d113dd6bfb1cac1f719cd541dbc02bb22cee5a52dee1306861956f955c1df4a1e51a56375a416a1b2c75221470f425079953b3382d023d0d29238ac962f9fe5120f24f95b7ce96173b7f14ab60f6c0d1690f3ba1e0016f947ac2815f224997e362df9f370cdf0e9c69af2e2c46192ccbfd93b2bfa76483d57dede5d6b015810aeef7d9ad6f39a5cc9985c3b3d0ac8dd85e133cad0f1578c0aa2f9cc7ae6244aa7770fee9ceb4721ef901c3184e265f0647f513009d302e898e1f883c0954075e926d7ec82d6a5ba5710f593bb97d048dbe51e80e1445a4dae51b61d9a2d147cabe8127437f3f3fe51a1b7438dfd0f035ea3e06f3dddcf2da6eb33ed9b70189ddebceee9bb37c178547606fd2e5d98ab3792946438f635e6f16e39c9759521266a46308a23857eb0f35ffecaab5b1bfbcc75422af39afdd801199c3443712468c162d955dbeacea4d1b570ecfa53a3e2206035d197b6f42d995147b16c55fcd9b0dfbe7b0144929e5297de8138a3f822835deb7e7ace5dfe333a5be0678f59c70e33f95ff9fb1b946b89fe902d67c77750d551619f69a00ced7be367a8b7d15ba662f1787f401b4f88b940d608f986952aac2c5b5fd6f6f96c43f3d322ed389716b03e403683e05ee06e333513bd9180adde39fd345232c9f9cb4ba34d928762fd43e56974395f2e8eb63e16d6fde15d37db47745d68fd88ab601ba9729b2898def6d83e10c374c83ae1b83b82cf40272b71664293f35d605b0cc44bd0bf1993ef005dd077567346b9660c0d156036ee4ac95f9215413f1b30bcc3c13a683b81cb9a8e28feaceba092148ebf1d90810019289f0c11bed39b95022d01de30091fd5c760d2bd68caf4f3c8c904504e8474aa807368ebc9ab80b7b5aaeaaeeed0fb352c1b2be349d9111a13c6604351327ecd29290258c4857f683c263ca94e4dcbbb7136c4af16149001ed61ad379b7a7aaf4f904717e312c39970da0962e51951d42d598cb30ffc47d5f774e1636d553b249fabf42fe4220f86086ad247efa9f002d7baa2af49d4d0bdd1e76d5fec29c67106bfb54f6"}, - {"0000000000000000000000000000000000000000000000000000000000000000", "00e85247c083dda6f079877a46f5820a8f2eb641362b2989caeb9e63ff802906e7b9f19ae701113feb1f024225c44ad11ba355f7b7615a505dbe42deb4cc7b43521720ff2d212bf24cc587fbe93a8994e59db787017c6e75e9976d31aeb0d4b996d9a4e39aeb5f37f304caa8584c66f5d186d8e273bd18cd356f7817a38f03eba740958ba406d6fa314f22be117a4e9c576d73546d63627ae2baabbf90c91dd7555aeab6d9b9488202dc4f60d6d6fa3f1c5a22e072740ef23021df77221d72a386422054b737e6c62551751f41ff9d71d1281e5c41dc17d5bc36b59ee59119e0a625beefd100a42580a4bcb1576087739ec5f30c4e9a0eb73b3ecf18069559405eca6d087c72e0984a19630887f69da35a0db6bcae483c4ee3fb1176c9f4c224f60738fdbe5f0f72ca9f95109e2551032467b863246573f8f266b9197dbabc072324eb5e89e1d330fa3a0d19ce17d981012765a3e449e9d18d2fd0ba95291ed689cd1dce5204ae6c3ea70cd86f4b71e1b834b07a269ed21aa36b028950c65082c6c82b0f92700dfdd1ecadb4730dad036e1252e408dc4e9edb345e4668abc5f40e9180aa10ddce4a5cc7416f915ea1c8e031b78094d1fde415962d6f95c5b239ddedc75b339dfd787b515e9d6cb318a6377a33180848c801d22dbfb17ab2a678f83f393be3d4df84ac03cbfb7cbc32076313bba23f3d1d5901d4e73925807634927a523a05dbf6a20a339c275f09fd794ba148bf4b877e23ec53d7947aa8205b1b8703436f605943f9c1c1551860dff042666c355bc823088784551b88450a53ac124e7db84845357a0cc86103bcc8f4c65daefda4149121ea257b567acbfddab12d5a773d64aa7239af89a2f1185a244602bfd338aa24ca4208dcaa6139c711f6a588da1496005d31d19b40c06f0ef2a58261569fa68ea7e217021d0fff1e0202a09226a44550d25789d85abc5add375f397dc17727af17e408224c6fcca149d801758b26e2c338e9c517cb04b596c6758cc0a3c28d9fd8c3c1757338a03c327abc9d6ed6fd3de32a14fac06b8005d5cfd0fe9904aa0b1fe12d8c8fe8a5449bbc7cfbcb1247397fb906350cdf55a4b82360eae07b9f55b3892aab1ccf7e39f6cecf2dac2e4bbc66c77f9858cf2689e9fd8de36583f458f0a08d9fdaaf98cba6d9cbd6354ebd964103e157c7e627f189666ab1eb15a0c4868010dd985f183f2959aad4742d291e73e69561a59122842b4848049aaca3ddce13496658e0f1c4b6a9c0adbd58152336ff0d97f7d700aad2dcd9edb0df7086fa08192aa20d67691b374c04cbdeafa7208644c89a4600976208201307db21181e151717f328a52fa580de60e83e95140baad0462a93ef7ca662c06bfd933203b554ce8e3725b371cf11b3d33cc79523b0b5b5779eab9e816d04456fc232557b6f522474f467b5ff126c1b1ba98f0c8e13f2781db937ef4f31c5b63fcc62cb8dd7418c0fc06ed4adda39d131c782f19f602e46d66d7bcbfd447b3714b8343235d4afe537deeec0f961381629dc04aac1fdc2200b1b60705053955dc7643599fa8efd1e15fcdb53dd9ad1b008d5a0a2ae3902dd833efd101b79edb4ee14081364fb46ccf3e5c1ae678efdecf02029e67db95f625b845d2682a5571e332bca1b25cf0ab44e44b5cfe3c90ee175048f2d156270e2385c8aa828f6da8f2c5f7f6aa7bb2343f4b7b312711d0a4d391e077e8e969279022b38826a6255aedc261cb1f546bcb43c8c16e01b05a104ce9bf2e09e17acbd5bd50c6207249544aa3b44d259bb6c663ffeb12dfe8bfa206c8219badc5b8b684fb2cd0fa41096fffababfff1d135dcd96137092feca89f1e1e7d7df2d043e05be23804f796925113b62ada49098413dceaa64b62183"}, - {"0000000000000000000000000000000000000000000000000000000000000004", "00b4d3e45fd4534b6ddcf4b787b87b118eb352c776018b895bbcd29420dd2e556bbecc22e16c385946cf0a624c72df66a1a1b2f5c55ff7570c156955f1e0270a67b42705067ae8a774e425d831146938fa2b3762029250f617621b59a0971781316b926df1d8104c84082822dedf59416ad008e674ae5ee3b5a0e2f8ac56232e538b622a553f962943858ad02bb903a7e83b812fd5d24a7e926b00c55c348d8678bd8a99569d8d7201aa147b021f1729b645f2a0c146648dc98dce4ce92bc587c2fda470e18458131906e50eceabd8772f5c08b9f6702c8c08c4c92ff533116c6c4611e59fe0211e61dec8c4d4692d011487f18b61f99ace0d1a366b10130ea1f9d026cf376914a42c297359ea38fcbddd10886b0af48989ca6846634fe3facae519db2ef6f2144c46e48e1d25a94b251432322dc9c9ab67f91acc39a89ae25612e6dfa145d4f854a8813a97c3b6fa02041d0773bb5919392bcdb4116241b1391b33b2586619f9691f53e5a997f3ba43e57c763cd5265a4d946109d3dcc419054872ad1b45c0bc71527dd0aaaecfa50d0f1f6530919c1e9b339118679f37ed00b275ef1e08c89465960a8c495f0890b4fd446c482f3a79798d226af30c6e4ac390febde51971b52c71673b32fe9b166f2b03e1d7333ddce7042e4cb7b6333c025b625f68b464d30c5af3d75b71b811f96dc632992d95d3ba0719e6ef4feb170d81096bbcad7f5a9b33a39ee5bb0f24e78aebd9e320f82bc1e503d109c5b0734ffaf408835670395a50e7663988cbc6e743723af99f98b931d2a5922fd48afdced489c723d6ee62f7427fdabd109b5c00aae6451970a2737b665cba092b650be6282f3346e7b9f4fb81d4a23b56b1ffc8a784919fff3f237bdcffa389be19e95cf4fb8861759698585e59ce35a7bfe9611abc19d5cae62c834dccaa447cb3adae00fe2780561299a4ddeae15c90231c1e5f1cd7dac519ec931dee65529df7ba52d5732f221d62398c0edc169de40cdac9c90079af34e3964a5a6ef2c15e8a9b1dc3213e41e3ba158306d4a5487aaa5581317b40a007baf9c9fc4bbc0799ee524b02950d48b4d19a514b470ff6d06e20c049da97966bc76e72d67768599ef726927433eed5b22f9c1dc2c92cacdd41ca405713142aa32f6dea9214517959f4e1fc41c99b56b15d00af023120760391fdad4e254273f2ab09525dfd7e4cd40e632c5b1e5dad494711f38bb15c9c4118eb9dfc8210a6e92d5c094b952e64b33373648e4dd49d1ae6451c1b4710754a74ec5885343ceec5ca8561c88d836c074b3e0aa8429909a8c920fa93543f9c5e622444861b84325e7a153d3f3aa37233236bca55351b165e3638d4bddf0d258679f840e64357bbdb9ae8473ee94d42b5e40366d6221957333c72fdfd94072b5cfa686b0264d7b495f90669e9d0026397b211611d6e700be423c77c4603ee115be71052bd0ce846914ac4dd31f40886bfd878955c8f76a931b51d37e27cea0ac910f209b841da8461baeb6df803481ba527f111ef92952e0280788ab3d2946f098f938bfc1f12a5635c7684f256f56f9f7660374119eec6c341595c327a3d798a9505f35e70c72cb88da03a2975ac6250e2db29575206200ebe764072bfd3cb2196f09dda07b2fc35bc4096059b29df8d9971a7a554f3518fc3345ee3f0fee9c6248d3e000cccb6913910e28aa8f03a8d80b8d6940b083b158560c696334af2f1a2aa348ef608c4f0c4542335d6e656cc1803cc66557dbd3acbb1ca81f62ac7089d4e30684cdfcf4960d094288ff1d03174a5c7141d588757bf1fc0a34e6f93f3e6f7febabb5717b8e20b3c9ac27bc9d721903b317c7772b366313dbdab9621c33601da77fa4deb5bd819266afd522bea542bf1"}, - {"0000000000000000000000000000000000000000000000000000000000000014", "00312dad99cd5e1c8c62b13a4e0dd02d358019d54804958d390494860f4c356391717c36a521d0ac82af08811a1ab545d0439b9331128756df25f1b271b7c7370a474c9851a244ed620535b6e7cb05705f1c180a0a1d0486846ab9395689555f09c8c16b0b5fde1f5e1a9f817bdfd120b3b44c66c71a685ccf6d289e390410c755285e444ba475f34330857eda40f9d6912b1c17bc057b966db755e2f171f617a6bab4a0fbde0bc001c4c7c872863804bc7eb0c1adc75a755f59f8d05f71c5f3f0626ee9d1b4700a0879f11c573d0f1c8bd30d209f68f66f686984979490f6dc05a1af9a38e3795434f32374568fd2bd7b56bd40e035d686b119a58b19b848df69c9bfdf16e9d61fb8e71965c9b693a9332852d798ef8ecbc33a3916e3ba4d9ec2fc34df0cef28978a79114ec27be85383c42acec32151d3de419935003eb696d1e5a8dcb9d97637e447937dfb1c437401800e3e750159508b53a28e932645c0bfcaf83f7b10d3e6f44ae4d073e31822d4155bf55a2d569c8da813528245eed072c8b65cc2182253b85e3e13fa2a2b165f9aa681cf7e9db02ce1f722d38ed25f0fd42ff00982864b58c40dc0ade4d325a4c18b2917132b842110d7b8d9d29490cfc31195071e6a19f979aab5769f0bcc5f445ae6e9afbec281c04325296201c875d8d521b781efa2d4f32f5cc80325ac68213d3de14f20ee037dada40b9718fafd2e522a42320fb58d4f5d400c0b5474745e0fc5dbdf01e3936f2d7109c493b53c130d65623529717899fb43f0e45c2fe13107099b79e60fcb86c9e6d970831392b132c7e7a2666546747556078ba1614852313957dfc0840012e6d4d0842ed23a1217135d7fe4639566ae623acfbedff8f7294fb51126dea7e8b79be93cff1177cad3da668ea0545ddbb929de496a1bb2b113db6ca4f0ccfce6171dd7f969a00109ad04d9cc86873b385a86ca66bf3ae3eada64241641d8dfa69894ef20f689c941e29712cc88b79bf60112c7790358ee58cd90b12f6124f02a8ca8baa2a70d9d9a8a21dd2194f665b15d8ad29c55854192f07909085ad78ef19addf964e7d50bcbeaeaf6a6dffbde908d7524746a2495af12d94d84f31ee2dd63d9a07910c7df87668a9d8273f751fbf7b8ea496c809b003211043faa2b2cc3bb6c90d59e9f4dfba1c910717ab901dfa74f75485f647119f1ba74fc1c9678669c4d781bef355de2e22059a93bf1c2604848b77db23cdf430289f9c64c067c53e3f6d0aa79aae378785224c6f7170ec5e39f1e7107dc6425c0c3d1f6ad78b4b110bf0ca427e76cc32cc8b00d93129fabfff18104d2e4440d533f88aab9fe47d68373df72ec520f3ebf9e285513992dcccfcf8294dde182c53b7d35cd7a2a6ef7fe2e7e56ce2351a9b50d6214f499e16e85654c79f2aa040eab284fc4e07fd59416f7d7f97b1df17f1c5de00cdbd3670d11ca01aaa301b3e34f81687a8cd8078309e9b7e02e1d1b09bef63105b68c4bc1eb08b6a91920f7bfa2b55fa8876a9af28c6d5bf249f6ce749be904bd11b673c89e93454f35311aae135e7b72f417d004dbfaad6a928b9b2bd617a343e1e68a0c9a16ffb80c19c6cd810701265e93f442074503aa265cd8e7464c56667eba65053f28e015ff67e688998f4ebc2441068a6074d142b5663cfa3215c2aa8adcb44a08c13a327b91ac301e2503e44d96cc2ed3a199dfab9a9a623a289cbb80ec1e6f71a7c44f76c34c6622269e1ba5704cde0996690aa97b8cc76814d8c3cae4519912d207175c2b1a84b051e7aaa3a224212f2b05ef1d458918df6645bd8fb536f7d4953081d0e4bdb8647e10311d02772a79a16b6b1ac8655d39f8f94235db5aa1427d047c7a4c62ec69b1c79ce16c75210739129bcb42"}, - {"0000000000000000000000000000000000000000000000000000000000000002", "004d8a744cd98656cf97a3c2dc6495915197d72f0b1dd822b385e4297d6e61344ad8cdddc115d70f7c131603a11165c84efce2a971b2782c6cca9a5ab58bec19bf92cb6f8fe051bd1c781264e2da9a9e58fea22108c6359763855e2ba211d17a6b4f5c9545717d1c650ac81b2ea92af9878b2062ffa91c06b777b7fcc2241843e9f705e23e89504802cf9545d329554a2c882e562133cab1999884e686b68a105a9e9bb0027fe6e600a96b5e35c7e929f57900c2fb398e40be0e2a119a3f241f8ef5117e7ef672d73fb1d116f28b321acefe04d6dce35952be03d5d47218a998eac9f29d761c840539743637116577745600d7d57111034d537accb21166058073633249b0d432cb0d4914496cad52279d1e9814b78799af6b515b948969645fb9675739000f260be93760d96e6954ba5271737345476af47de8ac2c7a2b870b5ecf87cd5513a64721db230756bacac5024099519f44f6af93ff72d70fbd6c81a288b8f62405e6c9ef88cbf513a70920d012f26c760e41d350f10df6a20e07059d91657542e980f154a619545c8ce7450ad73e89961177764c375637ceb587103f9f3cc9053ad06c17cb01a1efd660bbcbf345804e119af64a11dff1017e092f6a66f677b33949c0b218973f3d1724b914acfd123c215a1f139451fc80116c44f62eca76ca25a5d85ff3bbd6fb19fc006f2cef40aefd9db50dca532378497555e27f214fb510c322f3b657d4014f965c4360634ec173c3a913854a4d43008c1de83f6ed054b2dc5eafa75e82f6ff835af59a20ea97a7118068d69b4723e885970b68f4705df1475de57ec5ed1639a691ed128616cb8f2516d549dbfe98843720c91dfd474b36d2608bb0cb93b33ade837982544f13b2175ff1a1cd5d8e071fff24f0f9c238fde3b619b81c1bbf31f0766a28bff542830cca9e260248fe9349c60165411ed2b204c9f604818995fb426d84ca73b1393cc323e49dde91a18b30657c976ae622188eb5693816174afad40ecd9b69d154305263bd1980c8ec11a93ef6fc7e8e143015d634b5be01eeef1368897f3e8212b2b6158c3b64abe03613a4c54ffdb4fbc3ca40f738e7bc94f814eb70f76583c663e79e55c9309019bd2d389fb8a1d99ce4fdcbc3058fe6fe1a96e5993f0663bac7cfb099e76924c496a6dfedb0260d4fb739e4020315b8669759930b37c1051e1e86194a9ab6c52345c8cc151fb1c805c62c15202eba4b2d57a794881403b54cb16ddf70973e41b61758ff04d1c67b18ffda05cffe86a689aeb8a5b840a2d2abb4c0c25e54f286040cd5ac22474bb2dba07342756c37e4e12d98d2d9110279453ad11762a34e51f904129d1cebb7569bee0b3f17e3a8e266f3369d197adafe9c8a928fbf1a3c30ee5d1bc5d6a2a3d34df8ca33d7ec2a95aa9c64c60397063dd3de1cef7460962c8e5cf1618bc4d23198384699d8e411dedd194b84abad6b9a0b4cd1bdc66c0721a1b99dd118fee67e2270a04e79e13a94750771483dbe9671121798d823bb70fbed6d6ef5ca9d272f0a8333dd5db7f221f0bac12a36dc81a44a9f9aecc10ad3891687c96b853f4175959dae7ba6db7b96edda1e970bc1deee0cd3fc4d120fee54d262f89618973b387a754809d8cfd75a61f41128c2413345969e19620ed188f3910ba51f9823e23fca7700189835371a8e32e96b9dc2ec336d63f2c50927bad752b2469fb2f1177429a5fc4d8dab04748483912b2c2d252b0953ed32d78bdd40e5a863a55c973260742bf69ab0bb44930f32efd0d592b9dd866012d705a32ecd27dcd34c753eedc2ee2a22fb9d8bf725c4c9527eb20cc4148a6d17d25e35b18dc259c6cc783abf5f5c42d25edfca7d1f42a28814db7cd2f5ded48caea759117add16225b"}, - {"0000000000000000000000000000000000000000000000000000000000000025", "0027319d33403e08c63db54ab050c0062b07b971951e2aeda6764d93fbb980e42c4c462f4d5a495ef80b04c79f74c8369c3fd91478677353188663877d7c49108063ccc515873ad336216a947347f0b20ad2c31f29e8f2104964cc433da6b34b96455d1ea947beea0537a38ee14e5f4eedd3ad37105eef4dc639805345d72c2b637415aa226dc6520323a0c4b5f160631406532dfe3287c19b127b8394a4b5862ca945e8ea56961704c0dae6c1de326d990122565f727cf89bda51dfff0685fb2db9543eeaf10f13f5e4d923e9d85e599a7c218d35b172e2b7ed207cd2b01dab388707f7da3bf3476be3640a9ac94fd2fb257b49c9aac208587dc7fe0edb9534d917d27efbcb55543345b546115ed31d433a0843be9be40ec9c13294654c768ba58a704e7f2e1c283b57c9e42175aecbb6032d5f92bdddc551260921aa2ce62b93119c9a947413deb09303329bddb614062d2ec1f10bcd39d477921b22ec939e7b2c9b59f958618457802f61e3ea7bba0e1c62eec31b741e94ea165ed666cfcae4f27fa9d410d54cf77d46b8cf0618179dc63e6ead1e7d7fa8facde8d6e3cb36aefe586706cc3e204fc666a0ef26a2d19e298bed14c8c8fd1e5650c6b90bdc55b77349896da96eedcadd9d5905d11cc092a7df135870c8d0c30b61bd04396af811ef611dc7349c5d66e323ea2573f808d171de43b6bce22907327f46cf8a9aa5175e33ac29376681cbf35214c63b51ce17b190e787fd74884856f36c1e60fe5f28930a1cb799820a09c11bfd33184bacac8a90ee760fc7134ac5044767c93751ef0406df5de772607c9914e31697ca06fe392e39fbce4c6177ef52c36a325e98856f3b36d230b00031a2a61964f256f21ec8f67987f519bf7398c54b2d92cb2ef43957f81d5a0b1fd913af19d86d47f1178e5310c2e76b7eff849b7772bbbca1012651fb46ac1117b2ffb482a15771df8f67fdb6c52052fc6bfd92cedaecb004da00657795b73c9e132301fbee6920eb25f99927f0ef1a3b42169e771b27643e09b492685d83239ec3b3f92ce0dc611afdbb1212081b7e61a84f2f8510f030cf5f75bb4466da7b537f2a397418f554f35b2a1c04e5f4bff55ec50638d3b10aca9517d41a6f9ddddec658725c2ea6376c9adebc4575623fbda0378d50aca4f4e04d0371e9d7119b95103b7ad01c0f5d7f3998725e7afe36d959e77d9cb3319cf54a18ec4315971eb40a1b3f81b253e837601016235193d0273707428d416ba51f2f1d6f46b6f7875518153325a4038977a2ba931fdb50774856fa6e5a120bd2d79fcc0e571300e6a7043adf89d0327c6a631df5254ef027743fd521f7353cc581bded4cd29ba92bea32050a5749cd503c431f97a3280199ffda14f33f91eef206de879792be081aba684a5e4cc2991208039d298085a593db344dd351f6f07996745bb56d66462e7f354f9c68439b5fb79453d542e1fa1b56e27605e09de43d55f39542065160c3e95cc21fb6dcf4960ede7b45572e3f3d73bb7185140cabd0a6b5300d1206dcfc4c1f84809bcc4a73e00b3965a58a6c4eeb361757d1cff3952ae76d33032c025935125790562d570f4a2d2e52209b6f864691a08bff02e0c7069bedbb4dca57060dd43d8740de07f2dad6090a849eb94c9b05b04cda950377881c38e5154fb7f5b32e1cfc5836186b9c571217b607f41f34d95de62e016dbc6e48fd098445f588d74783475a02fa681e1291ecc3573f47226615aa7752146f0502624af6c8fdbb3c9e5f91410b6a17cf90ea797fcc170762d37c67e2d5e55c897f16f06bedb51064028c9f8235e09e483ab4321cc3a013a4f784c9207f1f7ec3814614439b24638c15169246c8fa938fa84bff5d628705f5fd5fbe29d9fa1547"}, - {"0000000000000000000000000000000000000000000000000000000000000004", "0005cb49890fbbe1ed60872c58f31241d0197d915d36c3fcee36ce5936fe3c495593fe6157294efbb2330ad15a4a30041898f8f8311a7bab44e4adf259854d2b81cd035d97f65127526425c94bb10d6051d8e67c17e578e1f956e16ff1af6333a9d020474fea3e70482e024cf5b350a97b1097b371d3616391d49c75fd3d1db75ddbfad85308ebd1334600ec3cd37937fc4f6d2d52feff5e0e73fe756f2548be3793a1f2acd2477708fc2c5fbe129b14e02024afea5162017961b711ad31aff4b64e525b73921703ec302cec99ae1bfefa74131f6bbf51c99da52d7fa4d282b145c2b7897f8f661af998ecfe222005882f827a4b1a166ab013be084e09fcb705f50ab19922e4674cd070d6825e3ed37a4a1cda93e4b713208cf2cc044aa362e102bd8db9586819e35ac93348e06d6db689742174f53a81961c3003921347ab7be5a4013fe53b3e7efb4d7312e65befb7007b362dc0441d6256eb4012b4ba5f30a755777d431aec1583466277d92ed8e4a5a8bd01274b79fb437910fe81a7e8d07c02976fc8d9436f6d125c78355d201d8e0ef26dd44a13f465e41262f60389f58d76b404124d0eecbe09a59ce24a12d97026e984be9132ca9e3dafdf459f5892854387f6ba23598c62b24dfb43b812d118eb75227cb5fcb7c2334fdef36d23ac2b907e1cf18c92cb87ee0858bf65b342daece21e2d1b6c7901b756f29b83849c6d252186c1fc5824805cb1a4ec0539205e1f1705fd0f1ca3cb72b3f92a39aaf87d0d08a2b494e1cfa6d1226f856399d7060a80ddfce7f43bb3b2f32654e09949e90500bf64893589579e11ac063b5629fe59edfd4ff103f0727f84224e49f514e81c669497f4189af9719d3231f3b8e37a2c51d9f0621fb11cc7ea52e3f0d4b035070f318a6dc768fdb4623cd62476de96439ed38834bf3075ecfb44621f38c200c7c6b4f70c436ca208d2ce816e7dc710551fd681035f205478de7afd46b183859d29cc221583bb7b5413848c8149e3dab13a0c54306c356489ac577149282e9b3b7cf417ca54c1d574e10f5327b6785f5d05cd088902cfd7162c2187b5f4a5d36391ee0aacfa805d27173ac325a4943db540e442d96c14920313dd41d2134fc5131355b303f6de852efa7c1d617a77987edf2130daef934da0994b6b6657053ebb62eb4ede769801b8232cc78952c3c73353820566ed32db1016f37a3f4fff0e64d0a7ccab98449ac1c20fc1574f5f1faf10243be3ed0d4c78893f73d9004dfd9dd9cbfa192e10fdff37d492abd3001e26b08fbed6ce81425cb34d02fec35a1f9131637b15d1dcc6f5dfc28d07168d9c431695dbf934fa45f9dd277f425534070b257cd0260545acc333b5d779fe13a098f649414cb3c0a8f78a5677e4346b2668c3b588f87a947969822497f34f9300d523e4b4c9301fa0c8b7df825788db8b60de94f149c94e536bf7724deb14b74984ef6632e4cd997b420dae69ffed044793dd91eb570076688393ff3d87f86c3c3f70cd9bce09371908355ff84f32e52dbbb8bd0d4ec96000a40cbb5314d59f3cadf842de3d5dc21314898dce76e40b1b55b1f44747f867b137cb71a39c1ba15e7a3f74af47fb6962e65f4c1700f9b1ca5cd82c05d3d511e3dd55a6ed46e6e6fb1d1e065719eed1023c401a8958b40d374820e4c823eeb9af98bee04a24c2bc96aead2d0dfb51534ba45e97aeafe09fdedb0679e5e55cc957f3f3d7f479206de77d4b0eeaf2b23f7c82343f23ba876e863564dee452d1696eaf4a6507218c64d84342f132b791055e913970bd4c6ad22a368c0f8d9b936a17e8fd757e82c09e818dc0d4974c0aba573d8e8ea4a4914e027491d0c6e0f9d26ca6610e5fa24d072badbdc75312399da890090cc1f47446"}, - {"000000000000000000000000000000000000000000000000000000000000002d", "0079283d17c2603c55e540feb3fa41b94d64589c5901b69e428e54993bff01e0712e7b4ddd5a778fd98b00ce35210c0e69b56172506713c5ec507f51d3bf390191750d1522112590a260253b879be5712872e9380ce782bc5512e64d05f25423af49c751aa1916ec68198faa507f9bfecfb06c12c4e9a08e8d8c01f7c51c1df9698d5271309de07aa1f6707c7341fff9fa09652a153ce2e5b1c9199c6813304bc16844f00d90531400ea7ce7613377cbd2dd238560d1c7018926dc278e11fab1423e98e7b92dba524cb5e7ecd2646518f3c314f7ec23fd0e9f4525723580d7415de5afd9f8afa73615a658388e03f6a619845d974d1b353d888bf77e027f885017d30365c078e09fed11f999372c796c1316a99af4bba29f1bceb96cffbee81f2b46a9bdbf2f2ff7c6c98e2293b7748fe383246b658cf67d7060793dd206a4fe91bd4b1c8a48d30e48269a597dbbef150439d9c69f4780be6c5d2cb7466f27af4ba5da798b188cf32f686ecd81a907e8844566698232c9bdfd2304ac5d231eda4a68fdeff3bfad3d39419cfb9a059832bb2a00e7108d6991cb36e5cfdc9369eb7579d72604bb284e7143d5007243f38dccf99fab29ac1e767c1078caa048074e123f95fa7b4ef1de06ba4a5c81c8067a61c613aa83d1f298c454a5bf84f24c40bd0ff406a04baad15b8b8ddee805e0a7b0433b68eb5eca3f0a35a5eff9528523f679182aa5513e9f6658df6411209793cb309a0a2d33a0443ec128d779543c9ababf1728473f2e1227b56364523bcf74d52e65e4be1f7855b5b5646c597d5d540d955fe67b7379a39d7fe6b010d952496990a268c46fe32b72757d50d2c166bb4c176599bb526bf6b9a592a5ac57d4edb57ecf1430ce14ed354ddfce3ddeb6ef91acf5c192c17870dbe2141d243c4b0d4a215b043602211030cbe8a2acdb2c05009d28a21e1797edfa45b2a63fd25eed657036cfef56b7ff01371da8a56ce0d9599969a95adf433dc2443e8bace91c54f8d1ec58d547f4f611f6c6e41f149a467c243067e3567b3e5b758b6ddc8097ef941fe489019336647d54e87fdf45d490dbed6119ee1f1b80412c828e383cb36d51a137838ceea3b888f5cc56fa4212c2c514d65f4c09d244e3ea84c5254aa21cbe64b920a68c0c38e1e0e77e9fd2e7c86e0e08e84688a129030bbb3970c8f6ed4d4860fd9ad4f92542aad12e23071a074cdde459357c03534302dda1ef3fc87e38090c0d61f823e98f2bd99c5570707817d5cba7ffa7ab11397e955e5f13e12a32441ba47a64166daf56ae5912770975444d3a39137ea35d1e36353238443e41ea1ab56f20fc07b71147eca273357b2bc50046dd8d7016418f1ec306c3be97668236d596d18d4fc70e351040fe9c828a6ffae9b608b622f26df589afa576fa480216a86f0682dc451e4712cb994ca6cf074c1a87130bf8caf65f4ccafea49b70dd5bcdf0a4554670f3b014dc5d90b05b8c1ded9955bff2efaca3879e5f9cd74a75c76413aaba61d797c57044af0352c8d8f9d5a103be323afa53d875a8ad03a0094a8d8f85ed1d4a6505bb472ac8cf7252f609f09eec7262e3a7abffae0905ac7afb3f8881b1b00a352edd3272116ae6ee2060266e99545a938f3cdf45b47ce06c3f755d37cc912c03c100225f362ee3f15b817c11128d1aa209bd51830bd0fd69b7a4f7ab7d57b37f9ae4d8fa344196f1cd249856dfa24f7e23bf14fa83ac54322efb2bfdb2ee2ce466b12c52107afb1162ee65ccf22711b5fc793506f8e7df08666f67bd83c3d4703eb682249b7a41630ffdaf0e04dc2053f298a3269ecdd3ad563a95343f102c8260005646f6b4499372c83e6e19e539db870f143d30ce549b59e567d466f1efde59625eb51a5b88"}, - {"0000000000000000000000000000000000000000000000000000000000000076", "000be8f3069e2d41840af4ad792af3ad9b316d18f429af355677e4cae5e224134bbf2eee21c2c331cdc10347b24c4af87f2bd477109e8e57272d5985b43c621feaa6af16ea2c31a7faf36874d32185bb91fe0aaa0e450eb4b1ccba1e7a97d106e743bcf5695b903e7d426c76ae05e6522d7052068973ee5a2dfdcc1507c23881fdf5759043ff8992672dc26ea95e3aebdfbe473ad4cf0e0265bc4d6b7a56bb2958d71ae92b588fe003e0472aa762d977df0c62b39d51819cb6788a316816f54bc6e998c03142b24262d0eef4d946e68b9afc0e12fd564f18c0dcc71ac3fa3120d91e284ad337285fa7cb530eb570aff3fbf932fdfff0d277d39ca5ef0d426aab3649117d9a58d31c35f62944f20afa428a194e748cecd1e4e6fd52f4d90a63f4214f62bc8d53159b294f2948c53c941d87b7926c38129686180a412e5b74678694ffeda791f7e21fda9b637982bc405f02a56c2eb91b5b3b566c31acebbca57dec4259e6232ee296fb3e4f098786d658302ff26eae10c71554b00b2246161450f5d187261376e2b1b19dab5236ed6d0e27249a62315145b093b0ebcc993e044f07ae291004585d90a75e46fb4598f49aa76ee252277999ceea0fadfe35760e4121c62c2785c67e008a3e74f220c80bcf21ea5b08908d709aa2080516187a4723f3dc042502834dd89f8139a45a04e0365226699a37bdf495059f92c769722f77c94242484f14bc96c0aebb9a660991cee144daba431c3b553622cf2056e586f80c4d0ed3fdd1e1b1d991e74d12ed53d773ee18c5fbcfe1340d44b58019e2356112859958346c260ead90955d05c8a2e79f4272a66a2ba2577e3f889d41913baf260b2f65fcb4d70bc8ced173180938243af1f39c4a1914d8b2221abe36cdf7f431c90c51dcc8c78751c5161ffc9d4fa663927fb24205a40fcb471d7325af6dc2002b46c3f74a4ed931d360f1acdf1756daacd7661f1bb809889ba6e6e3c3ec22700f1f65658f7492e50410a7762247a351cdaa4962680aeff6bceb67ab6ec6113a2f1c5a0ecbbb0066a7bca65c63b2a0277faeff069949ef496cc4e3ef5ae13c33af7c95aab3f4e58e4c898533fc1fa64dcb86c97ac75982bf5f3b9d8d8329c37c9ebd4b9835e708690eb36fc10e614a39384738a59f5cba928edba032b3f68e562429b2ca1b646e04df77be0909c2fb3de1a11093c427c169c076da00222184e01e4f7f48ef2dc3c668ab34bad5f27a64a408052a85c15b91536a220208ac5cab01163b6dc2662afc5663caf48ab7be83c2ee3f4d01c51fda36c19c1c35da4c3388e2a728c4d23d7e7531e3e4faffc53a40e8679b5497fc411287d42ee355b75a15db31bcf72396156c68b3d115d701180fc1e3a3fa5a7ddf95b44082dcf8ec26dc1d99a2251e7b7c2f168dff9bf4f40140db799dc152075a7b340d9b4b879126803f6f65084d17b4c32c87a9e60200b52230e91118c371ac4f22ce5f2b53628f5d704536f9a350b29ae88258f3f131565bbf109e43815c2126383838d9d6134f1e1bd602e8b678b5ab508fb741809fe7cac6c88b7ac4eed0117b867613c825a8acddc1f7176765ccb1848c02191c286ba567166fc57086e2d360b92eaa0a893b89812ee9ef58c4abf841c2bfd3c8dce0a3ca41a91c0d9d0536d45e2742d395be42f0d6e890928e42d0fd27dc084fba52388af6d9de6ce45816bc998e44ab589aae063c3b9ca442012186cde20abfca9ae536effeaafd192427d5638d3cfef1fbf2b455acb91d48fb768e9a06c484d208a9fa6756e385a917d814ad8e2e7599d42c53d3beac1031fd957f7373017556a60f24f3ac4806ea5a3ce5d4718b05b7454b524ec97aef1839d39e0e0a07c96b9d0023ed342133abe0686120a35d0a1a"}, - {"0000000000000000000000000000000000000000000000000000000000000002", "0014b7063799854fb8a070b8ab2921ee9d5cfd845610453b2c681a443b7c8222afe24c960f25ff5a834107187da435d1b17f1976f18867d74c629cc81b9c143476adec85aaeea1cf7746c5d4452e0b001c5b495b00a3c007124af6472d1706d6467f7005f3affcd9de4cbfa72bbb56287ccdbb45b1bfdd4b921dca1d25a70f61da071fc5a7bcc48187a7487ad0c645e79887d41524d6f505b021abf601b2452cbd4a38cbbd48e6140083843fb7c9643ba7a5233d667b0aa95029718c042a692b770f6e6ffdd52555f97b704d3f054ebe1cf21306fc016e8fdb4b7a77f7d7e053c5aa858bdca429286aefa65e288955b7fd456091c4a2f204a0ba2c7e021870e50fddeee713f9c1c002fa9584afd02876e907d2d2ca5d635a056b4f108b57416d1502def186c40ea86a9f21210e81c47993b06668a1ff482b9be19b1101b6c3e10ec7ea94f6a4648468f0059832cead50004ce3575005cdc86e9e52e0934ca055e3c87dcb7f2e1e749fba91102d1fae252414f4de76042fb8bb4213441652a3cdd37acb2f92a0ea361ee8da2f9227351f03ad92a5b1b2958f95f5b114597472c0da1cb325043da101088f376deb5d32d407420cf9ad02b385833f1ce384006e3b2df0a9664ce6e485e7143f7cf3f40834b687eec385aff1b243d8d33485567e55bcc24b4b3ede9e7c30262392fb761151b7ca4e6bc19e17c302582bcdfd1573b1ff82d3289945221cedf6cb042e2501563db625000979ebf7511df7616a1e823932590587c6db394a7a5706d752f6db6e0944f738b10b322cad0ac02e50b476d0855741d9d2e12644aff780c504115bccc07a9d55d9c0d1c23b299639fad516f9fd2322ab81599c7f95ee2f691db6fc7e1738203ac56a052ecd19d7a9b647e8b8229595ec4606df711cba8907b54a863669b9c952ac84dbb2f266de83301c647902f08dfa2b0d8e777190d5f015ed98368f8e181ab407d7d16e5652243ded8dd2e23d708b6d43b7501d2409151a368197c798d3abb47d96bf4119fac1b3fdd775475cd333667c8dbd04cb207b6ecadfa69b9d631d06643444fc4e9d089844e44c5125e04d2973d5a5271c7fde453fd02cefe15f14364141c0416e08ce9a0d0a8a09ef410e3e0ebfada580d76270028cf4177ce3170a2f55ec61eae35e19e61f276524cad3bebc363903965ace871b4f1b508e33bc2cb01c75cf2754abcd0da88e17adb0bd9fea4b647ac87eb3826f6b38c8011c98f7aa70d9d94d123bb2b45f29b4b55efb7ce23f2ec47d4473af6ee7ee28e52d1c3400c623ed1c073016aff96e8307ca3753192375b2d262a65cf8bb532c4a164b7cecdef1a542556539ad645aa2a2f7bcc6f519baeb84818d13f4ab4383ee53337d47ceb27f2cb449a4166bf1e4b8c3b740068dadd13161d8326ed9f50409073fd891403af49a3087b004c98998e21ddc9122d991de070bcbb9f33042e503f3c8c8ea5f278f0f153b357a821842bf62ef329fac24922d9bd0922e842b08dbe58899092bf49f138939f04afa8ec199a1d5120bba186f54d221452414f06af903aea37fbf0a2e5b2ee323096e2407e20669ee4fee91f2ee4b9dbc551e3252c770506964afee84c74e6b845de66e3851852d63fcf49bd7c24d819a83fcf365482f8ec41c959a0d73bcbf4252f90c98c112b2eb4c0641f0021101fd120ec72969a0a63582e454b61470e919df059509b92f71c6e3290ddf26f8f7c68fc9bc33e6135e354a4e30ad2190f111c709c04d2707886fc7ef471c1dd9ef10ffcd20ed8c351f614a02dacbcff7f7431eda65f43cae22c1fab2a2e3d458053b0243a909bb56b0126e2064dfaea0a17b194d1c62292b1ac294b71670c84345f963805061687f8700a48004cd0385dcfe51409e"}, - {"000000000000000000000000000000000000000000000000000000000000000d", "001b30abcb837a1ec9e513cf6347dcb1de621eadbc162046dab8d72d25a74d148ddafc4a99a276b346380a74b0c72fd6a43fd56d163d7a6e3c2998a0f7a5152b055e1aad13e4eff8b6c5a8d4637cae54ce792f4e03173f7ccba5e6777f129548b3ff3755557b1ddacb3e09d7b549130021ab7263f13bbf90ef53285da548052023ec4bc3aebefb9e733de71bb0d1adce90fdd50849c8cb6f55eb2b6e81e29a5ead2c1d91dd15ec8e005cbac67c21affb2b91e0ea71e59e5e46ca53217a0e78db591310703f080ea726f7ed466637e0127e781f3a23cc8a67d1ebdb90131dd2ca766e76f215960175be87f113e22577ee3db7dbc748ba6a86ec1e31671f358628e291baa4ef502684d947eb92413914c8662e773b9b8f66c591c477b416b8a5c5a14b3c4b2cac2e221dbfe64f0c67a18ba97fd374393f44e61d99a14b9156c5626a8b456312e7cfd5c5463b65d37f39a5018cb353a5cc6cc5e5cd83311acfeeb5ec0c19a02e0fbeb8faa1a7ff375f42610e0fc989a557293d68061458e318f28c9ae95a6db7365f700aca89c1bf72622b21b444f558acd3244585abddebac21c53c50cf7f02bebe2be5d4c140ea03e6abef6f22bdb485182de4355d1279cb94438902df6853d65e10ae9c49dc7d2d1d15c152def826a3eb91f79d22f7439e4bb43f67424993ebbda26a8fc58144f556b4482b25d8f8bdd811027713cb8cc691f18c4462db66ef39f984f94f86db0b9a4725d0139c616eefc42895e2954d9d5c2de5f202aebf36e9ce636f274ce327b7e67e7f038b5826e1056f58af8edd4c779e6a24b1f9d2f9de15c11e9eb902c33ab3c809f5e470e63579cab87d1d7b9c4da16e301b7acbb3589f5cecc0895814ee80a2d80b1c02fc087f7fae6730ec41b57dc4aa4c71eaa53b2e735e3418183476b09b37ff8729a5c1d7402dca8d96daeedc00649f2fcbb207d1e97d224dbdbacfec970cfab2120a88a79c990579b7607712ad05a8444674a3d775b70248a6fc3262f269fbc547773d4fb9c74d24bfc54e3847f5e2df5bf0bf076389d5b0d7112f307dfe1a8e0e160d99a305ba7a7125a2fb4f78cc72640f186ced0ffd4c494b143b86b82894abe5393c8562d64dacd318a2c1464bdfa797dd4215395331a316db7e5a4e5d1ffa72b60952da1ebde6422448227d5dd744b620a701e6e974ace344d38a489579a3e09281651bd64da532da4eb018d4ee28f560f667b3d0817a728d741fa90cf1d992a08fc1c7c9b8e610194e174a862c547b201d83f70977081e3050a5c558032e6d8b88443c7f390304d3d27a0b2461fd8c11f743d5a26e03903854ff06b0364087906d6e938ce4dcb93437016aefb8f4fb04c44bcb4e977f6156d00385b93d48c9e057eff9a41cc678fb03882b897a6f321d213234e60041b0b43f0092dd7df978e039dd63e1ad6a50fc816d0e3639b6054e3cd0b8155cd4ff0b32f546188f2e9c6256341701a045180f6b0abf5e7db87ba9ff9c8a61f21865ac0f69f6341f5f5c756d5a067a03edecdf4d9f9ed483080e79d84d42a39359c100f892b17d186c5f89995b0b7894f6c161045d2798f6ebf1e744e6fc9e9cadc71471a3a9993761c9d0af8271a93c6e2a715955a3d623d03e6cb0a9e40bf337924e63161df703ffbb1b8b0284ed74a1c7e55a77ef51d584229ceecb747a929d32ca8673e514730dd1cca3572f9e6efe6341bf46fe1e2597c10c521b718d46f2b4811b7a20e9492b8741519e2f748970a1b5f40b06f395f31c5a116357a8781e40863a066ade0dfabd191064f47cbef0d07947d92360fee6c9ed41e9d401b9597e7d3c3ae0cf9dc4c352e6a7a8c92575338962989cc2f727b29f41352f0675c2ded18fe05c134cdfc8707063f10f246cbb70cb"}, - {"000000000000000000000000000000000000000000000000000000000000000b", "006b446880e0536bf7282041cfadc1f9f7c8b593670178892734551c4bc526549a90e45d7e8437f5bc871a58ba1f9ef95953d9ab929b024aa6b5e7e4b2da2061843c81c99ab4171f4d7b0893765dd787851e31530121274cc34eecd59ab56593b4e27cf9ccded9cd5705de9064c756c46949010072a0d40b45f45099b024244e4da3bc6c718b98a373abe258658a83331693ecaf2a66ede9704995c7c17cfba56969c3b89b5f5ed3022ce963a868204f7751117663732a19b5c3db43b740e627433a59d8cd684dea348f60701ffe88bffbd907a9f6626c4ab604663e47cce56eaab672937b77aa270bab062fdcc87b4cf413ae5ba40f430e787897110f6b7fd9c976801fd29252bb0670fb655e16b8f57c1124ed7636c98a0f11d1d3d813a8e835dbb5de9b201f3f870317c7eda77a1c2679a64d746dcbe73dfcc0305ce27cd51876ebc01ca51425336ba1b01c2df25a0160901ff01db14f47dab6890ec16072cba8fac369078c13a1ef4385b14dcfd231f6f817d7a9d6dee1311b755b77be9e1d7da78454518e6f9352a2d07a9713561a1ad95a3a1febdd4786c27a4422f628ce938b9a05a2e9226fa75ef16ea07272eb950ce16434781a3a0684dcf784e8e8d5c476287b6ec7c1cecb07b9e9e106f2360fd553ed03c5544494d06a73aaf4e39fb24d2d14924b2b8d8dc8cd8ea6eec6c69b5f00a27caf840d380df3a4633bcbb98bf1c333c7c71534d8130e2211f11ac0c65dd81f55349279dc42cf6a2d673b302e0e38ae9483cc0441ec6231a35e17a0346ca95f3cea55fafc801b23a28bf2923713f15eaee677811cf56227ff924d4bd490dfbef8a85e7a70e35e44375e07c82dfb3fd9517828ebed9775839bfa64c68a269c85433908920f97966442e0ca97371cd969f62a907f788656f73f39bae574e764b777fc546d809a29a4f3831001366f9daa10fc73f714c105ef3b19fd062e9650071c557764ead388a52e65c53dc0c23bf56f883d70b507dd72039527f73ff2f85541ad445136228b5858ad14df4dde44d481a8d6537240a566ce10ff21f6797b0b211d5876c84a369d07425a81f06d2a524d1930c564d9b4dedbe2903f7993278df7fe0d1a53a8ddc6fd16aef3863519dacb822db6b50b652d15b80a37d83d67b0b669285a30b7ddb6a81be1c8defacd56fc916e0619e155430c47111932a06fdef6bf60217b5a30211b1bd3824fc7eac58e57c1de4b5cfa372a275f2eac0d4dbc81f0c797dfc59b02d43e56ff6a64209a5de423d86ab7d26a84ef6cae73cdaf605bf2a4ed78017c0bab9663f92ac3dbbdbe52c74eda756d2510dc6e6b309321d901a7a303e544c63549cdc99a8c977ae85a268e855ef7392fcbeb00067bc360aa26d46558171f3dd653399ca8c5a164ea6735dce1609e564e1b70b2042b7decf73801a9c3ec4289d47ad1f54cd131864e4001f4957d515b0f0d2bb9dac9dfc02b284d3f2cb904d19bb12f433eec96a661b2c036d5fb90607ef43929008a4e2c69c8bfc6a1451d0bec4c2eab3e7937bc08fe69a585a4a26ffce823b949ee48c5131434141d1923d4fee324e195b77394281f2a82d144736a9aee1265b74e5dca8f2bed0c84d32f4acac9463ded6857785187162fa7a24ff071e7950a67874a0f71f1b117053f8d55794e5f69810530e6b09f1370a97a776fff0a3eb48b215c434d04e432d7a2583656dd15b7fb3015ea72c743da0bc2d35582b0182cba8d0d1b38ff4a1652fbed589719a0fae072cb9dcfb775985e746e7212cbdf6f59d73cd55d8505960ebbed79b82a31f375338e47e59f16386aca4297ed2864e71664385579241867ccdfad8b6d12c03564ff105b2f69e76d75aa73240811be6f0bf0348e3152e63c402ce70b9f9907f0"}, - {"0000000000000000000000000000000000000000000000000000000000000002", "00207482d20c9371ac8ee33f6f642eddeeb13a74e300ea88538e0372273983b4bdf5541d1143e8705bdb0172a69593d236b3d492712ce2cbc76a1a5f3b677e47177589a915684d0b3ce731c9c135d2a67e3ccf680177fedda7abedef9c20a6473556da9f3e02bae08d1034cab60135c83fbc42b38e8b1e840662179519e01d803c6706a80829734212cdd93b05c6ef5d9a44b11f770ad4a547f2e4554ea2049fd615ad9b44f8b87100b0e226c5d466eedd306047e51443ede9c415a9bd0a8b750dfc7c76adfd95f25fdef595fa26b814ed830d56fc51119cbdf5f1a586d024424b4e13bd151d9716e5fe431e6429473ac06428047c1af6eab4178059012913276775752bc70b73fbd0e6015dada77d90bc0827f2a22487a2bd8baac29f599b7fddc7ecf9ae9f2684cb7f52cba2bbb0073604ac58ee9e11111a76c3334adc491e10999b7bf9c7fe79cddcf6959f3e1a73012c79f67ca827b1a6ac40cd143d1bd86d9c24d9851b79f3fd83cc9e8393f4b22fbd56972c8ea8b26a151203a68ec86101437be57427b6b2cce152809bd4e21a1fef9e6a0f8d3499858a3ce6f1850bc1543f65b4022ef6caead06f0bc8d5b2f70c99f4f50ba25a7af20a68d20edfcf42df43bd92a956f9f89928b8576f4130172db37c56c1c7a7a735f895f2a0f22fa69b4fd635db7c370816bb97b94ef5b75ed8d68669179e0b1d021281f834782053fd6898a4ad69813a2a3134de45309545ef9ecf6580f154d38e807b48263583bda821097f2cc03d62f3b9985bf3aad6e1653a2efe1ef4a81cb9d257eb104c251324762f28d72b422cf0d6320a0615bf644201d54e142148be07cbcbf22fea3711ea20557d8a4149a909f484e2821995f24f256e99bb2409514f15ddd6dd56c74082d509988fc550f53b508009e226fe5bceb005d76d8362c9bf6208db486d4bfa0212559dd04261a9b2b6e8e24178f6665e9f13949002a120dc37e6e76f96841180235a281cd454da36140894db242c0a2cdc76b812abb0c1a0f662699d55690ffc0fa7d053beb0d4ceda0d11691cded3aeb91c5e0c353966468c7c67466c82908d3a1872fcc67d4eea23458f421f53c4896652866e016f3f079b405f74921e44e8faa9a22bf736a5359ac5cc7346cc295ff07e20889d2c26efe4cdda1d82afb117b1ae215bd564b3072d34a05286ee6b9cf711c2d82fe35da15a8d9b4d379756ece560328176eb1671926524ee773159544a1339a7db5f5bf619a9e9e6e599f6e61f2ee09c8b38220b2d06e1c9b89f4e3a4b4730f72faba44c3de68c233d265ca6498a8fd754f379f6ed918abefa373ecf27cc4b0e71645227d92218468d64c6a70c59f8b91b36fbfc74d7f43b2ffd9a564551b648124d013f9bfc3f07024323244e396214f48096c203aa368957e70505e1bca107c5765ceed495d96cbb77f39da1de565f1c177fa3de0f3c2483a6d22da66f1da6ce81fdb0d00e6f25e9395f599d82ed91cae2465d3699d41adf0a16f20ce21aae2275a2992871b0f5cc2ea582558a32108d19b24dcc92e55c1e8405a72c71f99bc4f01dcd194a9980b1e3f015aa4ec3fef94b95c27210d49bab1aab8eff1f59f6fd96db59068cdf464e7d8a3857071f4a25ef889a61dd85d5526bb1d2ce56979255084c1188b51eaf1b8d950330413a76298684589610d02646b1d4c840f8ccbbe4c928b152ca67f677689bcbcb22a547294fe24bd9b006a4c2de28ede976128d878a67e64e7df22de64bb880b8917dfb3b9b7ccc1e664330565db410a0154f5ef82b31c473b0ff784d9bfa305f1c8cddc69f4da752266708acd230f2ef7158e19a3bfcc647edecf4d7c85c08b767db5e23543ffc04da43c2f397fa9c973536b2c5ad78479c097c517698d4"}, - {"000000000000000000000000000000000000000000000000000000000000001f", "006aa79a0aa0efc9da0f9172f8430d93917c9dc6e6176b5af2868871915b0d435878e5183de2791ff451072acb90e4052950aa82034b324823d60deb98e5010b741e46fcdbc6651700911dfaa191cd7a08b377710a1d5584aa67b7cf623dc570d6eb10ff483e9a5cdd1bb11c9fa9b4cf77dda3b349a5dc1125cb2230b23523d3caf9f58aa5a57d964549835bcc736b81bc02cd26e4b27c130e3434d2af0432ea23ea597c633145dc035a5b45325521c0d3df51a4cf67b7064bd9ddd0bc071da705ac20c65907cba62f8be286069a52fce29b0e6811e3568dc9852416e2d1a7b1b309c6759971d529eac7a373df38dbcc67c73767ee07bdcf11f62d35096bf6ec0ea741c9ca3bb875bd5f09423a66fc29314146ef2a5095ee0ee74054d9ce2964962878bb115e0faaf5923c06322f85e7a86df743d0827d481632cb5473b461b6ae2803e0e938e9d1efb596eff4186e94052d2eda984630ec5f6c243862b078ef8ba71d57850ad3561735c507b1bf3ff3b567c213f9631375f98c0de462e35158d775c01ff1844dd0c49e31b713aee155f96d1844b90ea5d1bc569cf263c822e08e3903470a5fcc948a8712c7382815cd3b707d7ddc72b103b01ef9c2d06cfbde11df1ef3c875d04d756ea6d275f7210a2cd8212619cba17f88a0836cdae6c5f876e7e82b37bf0fd30d1b00f24f1431fceb35c2601b9fa995075cda962a0f2dfbfed4d5af8bc2d62a97009bb98b111e898af691c9f09e1f425dcfd85d221dde5460ef395c67cfb815c993f2f184a9f3f8f809cb88f64f19489d0bad2e5b74e95b5885209d4123ca667fb3959d0c99bbe41615c8eb141dc3dd2d646131c0dc523fcb16b42b76081a0d5fa3c59567a859e422ef38fe9a102477ac899f0e04ab02c3a41569b9afb50a885ae81d26586b0399a10dd9534043c59a2d4c629b0336e69f009e9d2d5cdc72f3344ae048f32927f35267de420808822c891c26771fe941d72c4cc5406f81d2dccd4f05af7ef6494db39d150de49708bbece206bddc3a562b3b718f071818cbb9d6a5af23fb035a3bc252e0f006a14d243858eba79d6986ed7a51799389fbbc5f3a35c6223c13e83acdee58fb9434f0902b90775d748c08b149c58606fd148995126675dfaf258369f34f90145391076650fbb16c5933456d23f25172b96e0cec0aadf8705030c2df878c832438de51f8cdf64c91480d1316e7b4db5785d2c5281725cebf4e1386b1da111862f4d8959a157eeb0c04b6ed2958fa1b25ddc5e727d4fb6a629cc8cde6fea47abe6733a3268739aee518b77b08375eae810ff7d4c24c3fc59a50fd58a99569aeaba38ea036d31e417ad6c765019726ec9bd042229d55681b4df6d88c4a532e5fa36955fe07bdd21024aa4b8e9faafda19f32527bfb2753adccd8383c750351a581f0d14edb56d6333082c975d2abcc79f4e020aa271850d8aa94e7fc15a9c1f3b0972474fe7d2304d057c43102bd1aa139a252a4259ca53cc40a34763fe9fca1d866bc077a29189a22c6447b0a529994c2065bf9ad7106c2afd50af6815770c6ce016295cb0116361b63c5cb6314768cd1cb77cfaa35e0049617ca0a667b46ab6ffd979cbbb882fac4cf0ebb5d1d21fe1106d89936992d1587ddc55cde366f1da92b6daa751002f9de3a1c07bd2bf302db4d60dca5f09addcd481583f0b3bd9dc4a1d4e94369004f232688357de1d52282f6054fddfa25a415a24ee7d12fc4c1e0c6c7af4221ab7193577436c784458897e5ca22d3057c5f761c67a35cbfd22ef5e20c427cbeddfbc6bfe93d3c923d50bf5544dddfcbc19e33db672f6c0360d71f721f2126fa903e25217b5d0f12dc58ea3f560b279412b4313cdb72e94cea716b1ee5a954d289fdd9d2b658f1"}, - {"000000000000000000000000000000000000000000000000000000000000000f", "008f85222f0a8177517b716351943994c6f586e0fa0fc66377010f7806ea2807bcb4f5c1764c833c12dc0d688b9a0b3beedde858e6317966e91692e0fcf971377d2414749472136ceea64fb93bcfbb689d5e96a500c146659345f881173581e131adb3a8d4e1945b84032b994b9885d71e642883a3bca6a0a5e47b5fac7408509ecf6a7710fdcd4a24788453df8a2e49f40b46369cbab31c22cb9d8223c53c9a731a9a8cafdb3e5200e86ef703345e5fd3cb52476072573286a8fd282d07fe4929024bcfb58952112558c55f5850092f78161aa6aa834954295904f333010fdf28412c099a84a14a3c3ad97ba16a8d43ceb573177af8e77c007c7e42016d35d757430afd68b0c6bf3cfde3d23f2032d37933cca5c22722f0176d6d79a30bd5e66ab4767d77690c3a87ea2f453fef8059e44c46c47bb2ce12168f9014368d35e057d2dad49dc4512a7b66169ad3bfa84c0266ae5d38cbf7b0af2631a22c1a1d148faf093f580a782e8d63aa5069e2f3131b8729ce967d329b8e2123392567201233b2a78702db646d0e46366c762fa72955fd57e1d3206f0119d5d97545cdc289b2962003028bcaca94c5988a795c932f8265d6222ad9d6f82d16b81789679b875b378822bf2d60f8e18c8df2c9b91a92391b8759ac8b204075fd7eb3de2603b9bf13ec212d850a5c91324fbfe8f2a519a0bf3a77eb7c8e3903d5b1d04942a2368752a2a0b8b54eb726de3fe4f82f92a2e564b05dedf25713bf202eb1213ebed681c8150b5a7a084fa1c4f2fec277d4d1fd3163873fa39e33a7cbb7ac1c5411ad068a18dd5fe612b2ab5ff16a0cd7afc8c00715e1686e80e5d314b57612823bf5242a67fba3e4d7bf53b548332f1747e1eac997fecea729e5076e79d1057897c4b4ed1c778ee352917a9f352d1b8e316f7574b7c3d922d281cc35313e44d1f69d0396dbab9c92eb411f880313b1d85fb59cb7ffb0e536252d76a7dc7de1dc8935c7185eb09b0b48b97ac22e4b2e95ec165474c936b5c189fdab4ae45ff9057b35c2f7077163af47697716c5165d4499dfa998ee46054ef0c5fb175a69e50873b451454a371b54ffa6841001ab4c466b8cb38869f20cf1370e9982c49fb7f6221d65b1f6e42581a3cf7295b418eb40aecf77238031c287f2a20d38b9eacbd4e7cc62b5c5a10fb9e6ca0c072964841c5b8357e2b508802f808e1f76bfccd621b55b62fb4a0ffaa9dc46d4a24dd035f0f0b52b550d4c9a09eb0d1a7c869e05a921d4b6638d76bfdb5d2b707ae2ac0c56abbf8a94ac9ebd091b0ccc7f292114e32f3f8ed45d51a79b89558bd9d3fb45035c3b7f5c1ced97f262e5219499b9e3f7f8436af7df39a4ed1da362249e07a93a451e230dea9e89b57666b35f5d243d9e230a0e730d446112c6b4a1dced3d627e3e8e072047edb0671c7da30f325e69f97b19e7a9bb819622c83d4d0be39c5137a8a387b3b29bca9ab17e8721107628b29eae163f930a42eee1ad655a936618aded1633a5fed853d957a2c2545360f0994b1210b8d5a10c99527eff96dc3d521b97f636478fbb61d8bb69c35aa3e670662f1b9bbe7da6f7b6bcfe7e21509bb5ea1d4ffc3ca0c7a21e4adb68d50dc9a7d715825f545a1ddd34e2752ff791fcd0c6971c5d51d23919b684be08276f13f00ffa873790d249897b021651155f07fc37353383e1e5f3a9b15a953ee6be307aa344fe190e12991f0037a16605abfba57dda676ed2399672b51580458cfa6cad8dfddaeed8dcc2ede672d82e9cc7181ac5361508a1e5b9c872e2dd467fca391e39f6f0a01f1721e99d9e556d896b635d8632d760e2f078392f377b62c4be5f7819d45db501b37bb49d89dfba39d83f824c5b2720b9a71422545492675a19cbdffdb89b"}, - {"0000000000000000000000000000000000000000000000000000000000000000", "00c6b1a88a89208c577f80d3306e8d14e40bbfe0b20e334b2a3018ce556c16d3247d99b22164e719dfcf070895990645c6a5ca60d146b5c7f52c80e02b8cec31eac4967898b52f1076c4f5c3ba5dc189a313c53a02f08ad575864c9e3323b0c6c2b4b8a8b1799d965519887d267fc78c43fe6c17e54fcffcafe1fb5f1305036acf8f85697681890b305afa233b4d90139019b529e91e12810ae6675cab65f400c7367f531f5b25f00528edf2b5d508791f84c2838f6580acb90fa6f63e07579f138749749d51b5f3497d52a771d1017a3d470e303b96260619195d4413fa77a3d0f9413fb916e247435307c227a70db6e9d4cdef47a67ed295bd2f1209b50057b1cebcaecdb2c19eaad27888a5526bf2760d86dd696a053d61fbfc913acc48f754fd091a9f663fc1da98e1e82fada08214e1fda8af7f44a0ff82fd692fd5ae7bf0b061fbba5765074a6e369839989c08028a5a229214f533a3a3a0f4b63031f998ced73ad81456f1109f866caa7fcbf152ab6b5aaebb06de492e041f23c973b5ddf1cc6bd64726e1c9b9e76b395b38306504a3da98b569dbe533ea80bd392950179d2e9d10365a83e18624d907190689675cf07e5079d369621a701609ecdb4305acd3c45eef71f18f09a2d9746721a469343f51a701830706ba1855ec6f45f43bd8de43c9eaa6eed9b239fd7ae546e7d08b8b3ba57ca4ee0341c69b884aad2094b803aa74ee635148e02a97c604fccbdecb1a800754aa4401bf4bb5b65b9ffb97db0c986b4f2be88cb1c7c59116b8dfd6264bd23d61ca2129ab14c09c31d538b4f2cdd1e810daf5e0de4eb305ee7dd8fbd23ae595f549469d6bb96ebebcbffa791d4bee182e8db69fc8a3d37fd75f3eb9f07590828e15a55eae1bccb77d063184342a527d528e119d2d9f328242306554c4ddd150254ea6719efe0376d5ee6503b44a8beecacdf195f936d753d7bc761a26d5e1166b8543d0d03ced97f51ee72541da1707521ffb50040cb7c5aacdcfd392a9a5366c41508f624c7319028917c5c7130290f9cdf3d69357b55737990a1fef91be0b688cd5e068588f90bab0d46f1c6e38364daffc982210d7314e08aa1eb275c28f325fec54a41d0a0134123bb5cc4f978fe2e96302c962a10cf11a04527e0c314417e47a9e94a1a8d1854f503199dafa065a21e4042e5d8d4b880f5bbdf1f33cd4a310cda0c7be87bd0b6826e7690dd9b7c9521237eda6b369120a4ab6810911466f4be3fb7fe0f3b36236cbaf3dd0a22eff6509422a141c16276d83ee25ab6c2d9cbb1e059c83af0719c8570edc11cda5a140a82f2834d30f599bb28b4500bc143d5ff7a3bfaf06ba836138a60a20d8221f0cda4c20776ee32be733d3d52c5edc4fb8d3bfe67b1bb1c3ed95a23261311dc42d62e4cf412844fa78820438c53bc6dc107bd770265b9dfeabee9b13d686b30c1f91933a915e571e3232eaa0c40189dd66bc9c4f048868c3df1964f3cc82f04db641f2f1997ed4a1060f07bc05e5d60a378be1f39dff9fc5a2b57df7769d04c3e329ef555b930630e37c96e8e905c170f154f12c6586c8ef6c0c4fb2086402f867975644a155e88334eb15ab12ff0057f90224eac861f6da3f2dd7bc7648a57f835b9d82d57cf4455a39f835da364a5bc47d091cb6089863248d8b8e60f9c1fcffe9ca85d03e88161e5c6eaee19a5d630f04c742f049fa6224d5def3169ac50ced191c3725c9c35c25677a264fa155755227fc5a2e3fa11e05a8b085a88732ad59e85e967df7123ba163072a0f4d5eae3462dcbfce7deb3b5828ae1b5f231db1c9bf0a803f5998b9ebca32c2f87c9438352753f806764387c289548b11b6b795f3165db49a40d8cccc7c17669f7100b57bd4ff1bfdec3cba4267"}, - {"000000000000000000000000000000000000000000000000000000000000000a", "008666ae56c04ce79db3d3085e185bcda4dc9bc65817af22485ca3647942effa0dd6f3f7ab69501d0aff137a9ca30d716925e2d03410bbf417691d63f5d2c718306d53d3da53eb42ae9c08446613df04b6be66a4094ad52a16628d8dafecf5e8793f89aa1a091bb46254ea16f77da42bd36a4e573d33e3113dd623dca20412984bc34a0e8401b85223a46976e7c5fb911c5d95250c9216425befd5eea0628eb55354dced0014b2b20e6ae74092cf4c1cdb8ef82170cc27ea0c8078c62431013c1846a630a9cc28f45f1eeb972a7d9ddb8df2145d653388a1d2b367814201b4df3db1c003b92efe2b6d1bd1dc9da6f5b49e27a3ab57e43e8df47f46d41086ffc812190c7354fc0db20f7c637bef20ffe91c4323d3a9f1d26851a43d16c554fe0adb5a205c7e4212564a87205512caca2485ac38ce937273c0b70c771453c69b3a8d0710747de3e802d6852278b4f5cce9014a123fe2dee09def03a0e54de67dedce177b102806360cf913591644f1e8863629bb3db5e226dfa9a404604a533f05d4ab0788861652b48a4ea4707697941fcd5de7aa3015a7b83aa2fbfa6d14f23d6759d25a077f3d84ab5331d994e734b2dca89fc650eb35f1a45f250db950eac1c97a2766c6edd6296e56649c76992354d3d98bd9bf8aeaae9296e9f23141ad607d80c9426352a5cd13af6f35b194db2432a97a849b3c67130495f932018d16d98cc1c9c5cc57400a80cd143da90f60dbe3abe0d0f9416462e7e3d44f7578cedeb1931a4a4dce6f1ae167f635c950c95ea68baf8f7dad9d3aa995f9e070d5f9958994debe4d274aa2ecb91d8404d643792a46ad4935a6a3cbe8fe2f4eed8cb9d65d075646d5fbac271388981585d17b97cd8bf359b092207917c02ae89551c46d439aa9aab85601da73074c43df0c3886ef20d99ca6c6385172908a3da7b8784b00d2739a1086125fe3ca32f59a6a44f1dcd61d78db2929652174ecd2ff675fa2c4009c4aad49396dadec02bc08850b41f97e344e90461bdfe3fdbd84da7ea81af437e5d589e7a1506555d58063abaa1087ff7d210799a36b4d084172b606e39e001efcad9bea1b0f8f4b66a7fbe7e7d34168b5f82004c436826b3b3f41d724d7c6079b89bb939c4942fff0dbe16e48831f30512eeae201f9548ac30ea2e6c66c75ee46ea5b3f3b791a9ea1d5c2bb2871ee6782f580d79cf548f88e099927c8038d7dd22c609498f37c0cac074956ad94b11923e871809a5197a90c4c638390bb5b3d7855b39e4e3fbf4d96e9a6632f388cd54cb9f53ffb61e4feb7231f5cf578a6d1601feb8135685dfdfd9233d2bdc62220bc0263941cc6d7b19276123445e5b2e69679707f3d26efbbad6e69b1d78779115a493c26b373def3e467fc86922bbaa167d9c436d6aa7ad2268bdcd921ed0403cc99f9d7fb33a89bd0f076debecc7411930937361fe7c4ee9c90697770e974cadfc5f73ba01e42c20cdcf312baa08cebb40ef1046bc174a9421737f5f141e4525302ba94a5fde2d6f83a628786c8e19a20e5046541bbc7ad2bcf9635327878fd440dc62b3d4deb305f3a5175d99e2f737fe89da4fd39e2b41afe4a781d06010f3c1228439e05f41fed6173c5b7113be8d4221f63c17ba2d0c1e6fb36cf73f3639a1f387b3d8c07d87bb2999d57372389174f7d6c59b6e843dcb9721b4553cc6809f9fb4c5324e8b435e31b0d6afae1c81c5e8190902107c582d0f38e243647e5612c19f44e32a9fb187ad6c12958634362e5573519ceab39115007d9c9a19230d36dfcbd4238c6245fe1fee15fc1001b675106679ab361cb7691fbb81cd4e8b663b2f0a011d735163746d36b9e6e4427a0bd36a10a4e5aaebb24d901ca48e80fb17e01fa77a6fd606bc721ffc215"}, - {"0000000000000000000000000000000000000000000000000000000000000001", "00f48ca73716345f177ba8517fcbbfa282b6b88a3a0969e90515185833cb7cb403bd49c301534e50cf5c01da94d1038cadf570b534b3e1bc588391a95f2f701132ffc6629dbc7d608c1133ee4162c1ba825c572507e6f14eea22905d9bd0d5317a3965f362a4de3e6b09bdd25d1783b4146f3e921d0c6127a9a524cf3eb1112a7de0940f4738cfdee2acaf7ffd1f450e7eddbd3c0f2a6e72ab459b5a91a571f0d23e258d9a4fbea004aac2f501c62178a94dd0b0c5687974ed66a84c2f0a0d558036c55c3c4428115627dabd84c60308986f088d38d6d746cb174c92544a447cf3699931791c340cb3c52c60ddb00b3389614ef8f5bb52bf9f594997082bccb64c1314cd971ef47f67e079896149b88d3d0ba715ec1969f9e3f2454161a410f974dafe750c1f14518a74bfe0219f5ad3d17d05c3f9bc797a39506b1cbcf6d5908a216bc10228e6a1e4b8db04f9fe147d0248cebb4349da05ad55c1216e6952c6a688dec32317a368ed212fd4cfe1b2630587987499a301d947920375acb86acbaaa59ff57510d957efad57b56ba6bb19438a50c7a74edd733d32ed9daeaa4b0a5b387e261631e24912e9a551c25516f098f7336f52abbc864421fc02a1eba05a83b1397b4cd0e205f2dd22788b371e23a48b9b331077ea6684b713c209499dc13ba7d445a142604f2a6689ac1a5547dcb9696d99b1930743062a5b74c0683625b6ab731478ab13d976d91a5bbf14b3339c8e533996d3436287fead52922ec33ddd8a0ec09568d916019be61ec17c044cf9e99eabd4ad5f222776a1ab1cbc07f9a118baecf0be236aedddf8820677bd19e9cee206ceb6b6592069ca49abafeef5e910726af92f6dbed3834dc137989dec61890c0ff11e15f674a4e2d2d019a3d81284749a72320d7c5da47b1d1e5d9b2c4f355b91f2b696fdc5bb9de1f23daf290108ee042ba83a5b7ff852de764a5ea1b497d9478d094cd5d54d540962a832f606e8d3258f99b6de241b03a43b6ca21bf68fca3e50b88a2748509fca66369510a099da7372f547fc9be69ed9c6968b7556dd08fd07d55ddd99a1d9333fb39239d7eb47ba316d94911e2c9b6d56c3e025374380f73a6ef63f4379ef3f24880a2c47a875947e12dc77a77c02dd26ce732c56928a18ca09c0f8cb3be759e664831b26917759b87c1ec303f41868453d3db1ef41d4150e6e031e32729c69424518cda366e5f003301d35c8aa7d3e41b76d3216270462dd7f10c39508b851804b27fccbf062e948cb043231f7ccb291be2339d716033658d66e145fd49481070293b70747e5c84128f073f604f83da06a7d0fc52902979cfbf00895a74549c43ffadb06f259d7f0c6156e4c940dd519e90a3856149d5b88e9b87a379a304da0874e335594f35ef5392de5e43b3f0972b8b35303b7c553360f44a28b85987c9df75382a291d783380c5f4ef9af5cd2cdefdeb61e72c2c6ceb4ab979afc03edc43b496047a97af512cbe6f7f0de0475fce6310831e61bea84be090ea651feafc962599a7d2fc60e068cce31bc3090abbd4eb5cf65ca278a660d36f1342683a959d24a03fedfc8b86948f3d1be216654cbbb06edd174f242ea92b3cda34cbfa083990443cb36045d567607df5fc0fd9ec356d45eebf00b6b8f5ea7410677c7dcad4a2189d3f92256999e9cc6551ed446dd3a52e30d925bc68fd435e4f69f3be39f279ffb54c70a641bd85666a48f591c20c296dce721ed581244e715467ac131ee5c977668798703756b16d07cdba9c00aad64bd55a06fed9b28b0fad7924c352ac2d582f311797d80254aabdce991316028e3158641f7d76d69149f3a1cbad0f24af28aba27daed7027d20b9fc64c2ea0e52b2be2054b146c860302be39b58f227c923c"}, - {"0000000000000000000000000000000000000000000000000000000000000010", "00333f1e90c31543d056c279b4fb5a78c7511484ad30d4643ca2cc58b527a0d376074b2703450c7d64da01ff2f247567a9dd5230e3d352e9a0bdbe453b55270b8518f1928ea1dce3f30105e5653aab145e9f619b08361e4373847d9bf8d3315ce6eac5c0da06dd7e4e12bfea98c7a20fd969e3e14707d0be9a6359ff8a060862cfb60263acb5aa6a5505f2413fa679095f0c331623aa2d4bd72342d8b082d0742cfde563230cf10f17264e9eb95faacf584ff5998c641dbd78011cb01319852fb656552a58b3f674c18a414e5560b2b2d4fc1751eb5613cfe89ad37893758deb75b72d771d177a240cff727129b75d4e69361b46e2d261ff751ee13020c98adea7372543d1616721d7c8b3aeea12f89a364831d31d9fed9881a85e452c094c5e6d73845194df4dc5e6909355a2f7ac6737646ac4fd13f2aebfac89823b261156bdd1ebf05b185abfcc817ac1753fb80f005725ae2f8d077cdf15b0cf50d8921b12d1391b5c36c593c9cd15f6cd27a495a472e3bdf5bf9a3dfb1101ea7f28fa16aea0d8bd5645a45f19ba1048dc3c8e112f41b8a8c55abcedd8c1916e6d5c137869fe9e16097c11f8d86346cfdca584743f38deae0c33bc736f137537bff74fed4548d461dd3592e78cabd1069cd52ec93a649a9f7e49f260553496c165be459bb856133dd1bdb4f22bdccfc534255a9975967afa2e998e1b029c48afa8c25308d19bc1b3bb42435a36fcdbe6031c9f94294c75fb4fc05033332b6df895935e1607b62816bfeb991a7875ec9fe471f06d756190b45a713b2896abb67c6d3df9d9154546436ef10989ddec98162cbb04e72cf897a5d96ba4c0b36bf25e26c737096e36d945f55ff1c0ffe1c2f50d2d31718a89b7b8c8683db0dbd17bde93edad78b503ade82112a2eadeb3fa49cad7a7282691199f7d171e3e39bb29f4b0716367027aa9402ba59037cf6e604be62048c87a112401c70d885b7a5096d98d9a38c25dff48f6e2674d9f2af40a155a631d59bd593ebdf83a9efa2c229ac976a3ec25f6227968cc076f3377c606c45ffe42c206fb85ac0370c5791190ed98a68051ca1d1fec994313dfe3b2221fabfbfe5d2a1f44201b59fd7a909b84fb1ddceb0c0361fad596d9a39aaab6eb89f1a809ed725861580f1ed410d4c7233d4137d185207edab17ffab92859050850921383a7ddabedf1b897fd03ce9f6d17b3d5255047f89626db49b0dfe9e4757f0d66fea69c564c0b00d440fb179c29a7f867ed29e80262c9c4bb0fb22ae2a7fb3e5c437fe943935cdc33b9c9011069d9ea0a4553d44cc438e1a1f363c4f2df30623af41ecebf1779f99bfcd79fabfb64d46706bdce5e1c5f96aa30114bec90575ab1dde53252c4346f82ca3d497b88b715504766ba0ec36db9a934bdae69cbce57cad55ece052c9d3301c4a8643b9f3067bccba300bc59c686bd15048426e1d173b0ef7bf5da65670139ce12391aac05fd22d39a1f255b122af0a64bbbd5ebc23afe755d06cabc7fbb1a09cb590342c85af404926dc119ed451089bd44b8dfad2fd992b15206a2bbced7bd7cf5571862371cb8e663b9f10b431419c189f279fafdddae25b855304a8cb3ce7a3625b16ece469a1cc539188338c8925ac48e9658ff864915dbf70d4ee8a578f2a615fca6fb9f07885162720457e65ab97d16f5362ca448ad970e80b7f7edfeacc79b06c7bd6650adfdaf1f1ff49b6c484eea2be071343cebc8ce027e79fa9c2b3581e4f5b657c77cf494792fd1fa8fee6fecbdc99b2f225d8e4f0c32b526482485686531259d3093a42337d0afe9dc9786f18ff703a413a8a70359313cb27e3323147a6e0d6dbd3a561867e0c93ae2468eb48409517257f17218ef8d4439f9731d58f7866a63b7a688"}, - {"0000000000000000000000000000000000000000000000000000000000000015", "010570a8b3c77a7f88fd653f90aec919f098343fd55cd48f0f56fc814be970db12d768d507c0d39ffe6e021e483e248543f6ba9d434e61b9bd2164e24e8aa308b7d88235429dadcb2c518769d92e31be2a58bde201a51dfd34842222661a25630f5e1a0990a0b40c6901d3ba8b6f112c2e984904254adc91c9c7727f87d005cdff01b5cd68c1f76a8292caae8164eccf31fe4a1c6414dcae730e01a416d92b69ec98d26462948e980279a7352990f8bfcdaf1776926cea8acdfa58a2331b2c43258037151dd6a392b912a9416b69667ebc093610856b74175c1581d58928665e908a950114ef7c5cfb6cca92a2ba957a68e5eecfdfe2e33a3cdf240815c70ac4506eafbfe5ac325f89380127afa65ed4dd2b7f4612aba61e5b508767ff43ff9b9349b95aca521d6d57df59755973fd2033ad8fd6f5b5bf7a548e1669139e50f223248de4eb08492fca6eb6b9be9b19360108d5d0624da616b189e530567d99b1704095701e3da7aa036b15ba1350598511323408316bb5784c19031e2d81e572aeabc3d580cf9aee56a8f87607e8e2056e9ef2739ae98be514b4c82bcdd5a65093b3de7402c4f23b1f2245d9d07b05db5d3fa8f9cb6e8f263025b6d179e0d6140fdcc564389836e65e060dd85fc109b9450730d65dcebe5c446dc77c3f11e437bbb382246d629741d7de03cf5865bae16fa801ce7ff796a60d645edd72882c00ac349a7f9ae4bf9b6f6b5c26dd492673690754ca37256ff49bab3b42423f87fe3dfb1021bfc433b7b535f03136f91057a01616c77aad073bedea0b11646dd389c08a933d76072762d1ff641d0e69c55f8a4a68f692c013cecdae063b84269e58ca309de9da6acd538950f7d32647f4b0757247f06c7d1b58b9b0d1ce868194631568fbdb7006449bfa511b2198b6269f32b69bb38a463c3e446f0724b01c7c380186e1ab33d195bbe6b861442bc580f228971d03d124cdb24fc8302275a3b0f2632eeb28c5dc98b6fe7d01d51e3944e94ebdd8c36bbe2bde0313813ffc5a6b318915d169d1a5549f39b327535852690dbcf5cd2c0e4bb9068686ae89d814112620b327e0bd3f8e4b0a0f2c7249951ece69be201613586a726745acdf219e22463d7992984710c7d618924bcf9e5ab894dd00ad28067406c9cb91df33e91374b0ab5121f9a01789790e667ce09c0439f3377c64f6a26ec425e37356a6bd24f64db91a2a76b580448576b571b09b2a26bc0d14165111972315c7d152a083f7737286891e38b9aa7b220fe7a65112501a9f3ee29e4622c48bbcc3bf5064101838c9df5cabc8f8da918547f384e58cf7d2288e1415d2e2949377b9f37fa546f3d2045b1e0e3ff4f9129f66be5989860e6cc1220690e5aa62a94f58fdec370ca4ef60d0ec211a3e25abacba54523ec19fe6d301a971b5171491dd0254d7ec2ec138e644aefbf46d133b79ab0426924d9cfc79b56d5e77f7cc28ff47c71533040805ca643a5ab08424cd2d501141b577139b2a8b2c615c559ea6fa847a9ac8778582bba81e30ef0381a3977ca671d7a28920a6d3b821ac5b290a54420c7c334f9752104b33a5835315754689e2a851ba2b067b1bae1de9588ffdfa034da646ed8636e69678020a71b710ceb4f3c5ee86d189d8388674cd3f0b08560f7fca8a505ccf41e5c6d444dccbd515bb2b5d5c5b16a2eee3c9c6acfd7e66f2ad1f51d650ef60d311cc2013050ed892ff11f543b6596070b2d1a0fcd2d491342807355754d15128e8456f0cc5ccc96da0ef7f130fdc623aa393ca4fe4b086925f463856cfcb1e91d2138d5e945309c85686b4a477a77e52226287faf7311f5f4971e2081ade6eca7337092882e13acfaabab55b383ae335662005ee6ab5e95165fe5265fdd89322"}, - {"000000000000000000000000000000000000000000000000000000000000000e", "007087bcb52115f3833f40ddc74d5eb8692f4e3eb84bb5a7c4cb99b98efcbc8643bbf7035f461ebe42fa0b48dae3c59507ef0ca8f457402b74c65dd554b3e11b2bc0f44f8d7f70cddf490e706b422266c99a099808da81c3154f8216888f52a3a972424277f5bfd36d28c5898c6558fdd0f5e2f652ea7e7135f47b5a8b851889b1139ee31371661f86e5ca471da1e5d950c24a502af4bb2960ba251715489d44cfe9ce5d8176733001c06f3cd44fe544e6a64618e5fff79a3a983d317a1f6aba8b41d40bb50597c2acb4c197a651cd984110240381f09425817b5a3bb250864da83635d7bdee21409d4cc1c123b4314c50a62f98719687a01ebe0c6e020a1575e4ca0baf1f8845f5e2ef71ee08d759112b38c21b357852efd93e4cf3bdf66fbb352bea30940a197c5b7ca3a75ccbc58f4414eb35a33d9441d972432d347b33512564a78534e77c3fd5b8d5f33c9296d602cfd3d88153ccf6e67ca17175f4a6c9eb3e55640f09280df50146830af0b4a5fcfc66ce8dc1969b74b10b434301b495b884bbe11387f16326d23a1872a8cb122565271f0add5e90e0ead151e07da2fe2afa3ec20f0c8236b01d0da7aa7ab1e8c0ef025a5b50fc7ce136086f1b061204a6d543f76eade7c81256a79c821a29ed3c84e2e5aa9b6a3a382aabf31767d1703f8867325ae576445ea8f5c5ac65ec66de2dc279751ae6f702e05abe3d57dae9022af220772ca846e3a43a435939d08dd2d10f9ea7a9a319326fec2b3f3b085d84b3065245d7ddd7695f1edfc43d98b2c2dd390bb6427b10efd6c22dd21abb683f45b93cdf3061da7016980109269a6a294d6f25e7d7a5a183b93a53d64d1f774b23741f7e956b9de1eeb7e31926a50c911ef670c4f60ef71a061d29901b8fa9a10212d429390486cfce1227cb7b4b33ecba91bcafb301a36d92751729beae4b0303bbb4e1837c272729283b0ddca1be914f9aed780405bb44fd88808ade6bd4736664ec69f1f76fd517036562fc820894ee56d7037676571faa0d8f5e36f92280618e709c4bbf4e7814b1b1387bf1afe01e9a6e08a07fb0103631b5db4b8203f5c2967746df3af6bf1f42d236ffd467bd315f771b5fce0575fa00fb90200e29ecc77d51d82e9684a2521f96d818a4276a19e611e2e670d191ac057db7d23e1fbb552d9ed01d63a9053031b88f5171b9304ed0f5810a53367cc8d66a032bccc2ea54a1f9b391b623197ecd01060ccef20afd0adfc2e2c50517aeb393f8c9ce632176adee7731ec13ca43b1b45808e6e19ee7e7d2f613d38db69c8b130823041d8c4d2901f4960300e9c4725e1dc297037230f029f7e9ece985b0f543963c6d819e522814fec42c31b4895363f0dbb8b40a683a5e9c0b03d85b16fe353f2d710e98ee28e2e5e7f1d346455372a89ca775032df7a2f54c713e9ce3221091671110a28be6f64e09c38e3f03878bba758a429a8b5d15b2b119f5deea0d2d698157955a70c936a4dab0b25b89a32d7ea9b9103f1e67f9b1ef71a3644221f021336d675f9627eb147fec996f5c1c13753026e61a6c4d0aa65e9daf6e32fc7e2660cf2307ddbc645c17dffecd2c49b1e4ee160285a4d150e4eab5e2e5dddafb89563ce0562662226abd0d72d071b7f877f4e3c1780c1a67281fb0460bfa93e51dddfda0fd1053c599ce679a07c1728c3b4807b24d16dcc16d6c85889641fe8f2336cabe34142c590220f82a8715caf73600f3f3f452739fbfc57b4766456c801c31f79a6dd75042dee3a730133eb92616ea89f0a64734479d8bb2801d557638b7db7915d92ce18b484f8bca4dcdac14e59a4f79ffbc3cbfc5311c46128a395d1ab1739862618b76d585b8f8cf670623b1bcac63b15b8dc317841476bce7a5270e89f5c1"}, - {"000000000000000000000000000000000000000000000000000000000000000b", "01c5c04fc4cf1132a804d2afabe6d5f9d90a1590061b93fa8dcb4e45c148d0768ba646a181c737fb7fc11a493d3ba2a07be3bddae1f0e94017823ede38fb1025b27a5c3cea448db26093c34ccbaaa18a21b830db073a80ffe05530dcde8a2369c3e236dd37ba7c8598339a5cd2f830c41bcf59440354ee4599a7a4b2fa790b39d662dec5089ad403948e204890fdd38fd4f7f61281b3205616b72b2a86aa6ea174a0271f715a4cac0ca64d80f998c5a52bbbf23c07cee85566b0f4548146ec94e4a623aeb1d67e548e80cb279ea2347b906213083794f6ae914d80208196bbb23156d58dde461231640584d6261f418f1cb5b65c429369e0940f2d920f25d9af9f29dc63b123325df5615d70b06d6b006b16b479742f17c389e102825905612cb66e92d646b3185deb6629988751d56a778e50db3e1a3a731ebf9630b75477298de2e11656a3e3a5fed2c1961857003d0441d51ff056718ad13d559ace383f521c61f1e0e10c500432aa963ceb83c4f4feb3db669f5bdbdfed450e616d52f0a99bbb8fb192dc17e154d1f71ddd7667442a7b5ad6d584e5b2f4773bc2c3ddde2e3ff6f8141600fe08844a99706da396aeb263580afad23c0460393595dda40ea1cda479b3fd354062dde3f47cfb881c405a8d2564673b96ae9774896cbffdf3f6323f6f5786841fbd248961a0bca5ca5560396270ae177a4905b7bf50a59ff8f129890106ba6855ad4d5a6e5db8073ddd3ce50e2665cda4710788c8e3995750f93ffe4449d358db9fc94bb4b336fe937269e256dc3d9dde59b1d4c863e47001c62a45a8b162a87e1f81df2b280fb2fb6ef8cb249df9ae8b2c23696eeaefbddcca521b30db42884b71d8e8e8940ffbddf5425eb45fb7e1123b07718be33515401c02fd0bcf000d1553b901b1219c6adac8d3600dc580526658ad65a4a7f8ddbc740352bbc7fbc423ef2d7bf1621d5df428c7871461b930f019ebc92c3c17751d64a2df6e957d9608d20a0924cc51f495d586ffaa9155d538dcc8c24af0956f8e3fdd47fc97535276fbf239f2756826d31909bdb2820da815381e4780231de3f0ebef217fb90b9b33bd061ec8bf2b5a8c9b5ced7544e5b0cfe376aa0d15f4a12045cd476b55acab88f602e2c552d271a306f33ead265e3eb3fd563c4ac85062f3e79acb5cf681f1a03208d21cf77286de6ab996a24dc1cebf91278cbcade92a65c9b11f1c43ab12d9e3c587299ed34b69bc05630d28eda7a550b938b712e1e587f093d4c716a89c455105c7de06dacf9f6dc8453ca4f4a1f9bad43db358184266bfd54d96a7e82762e8286325821b285ecf9c2e2386bdf15ccdd361a7762bba7285035ebc5f5e712311bfa664162a19170c16fca75e415dc1adee2570241fa448f81aedd72b78c36caef855ea0034b18acb05bd2875064acc68b639937ecb35431f2cbefc3b592f34a4de81637221f46295ab8cd7626d9ef77f528423829c67b7915d21fde6f610526450c63f04163eb5513e2b51b72bf4c18bf728bf7b5ff6daf4e1d86b890f8ffe5948d0b490dcbf4a2e8360ad56f9e5d94f6b82af0ee24d7475ebe989593fd9dbed7b81f0bc6d721493a7a33a564a68f90514ceabee2835c3e770386c1b04be023c06d833b75ab2a10ac77d924b6eb7a8f506e04d79d1f44335ff52f1ce06d2dc033519fc3a5d297d2eb2a1156d70f326a8447bc740de7080199df60b4611cb4e511749b7f530f1b84370b64e72d916f341eb9acefd94a510a9d2e9c7bad7b896b4119805a112aa644a5c0af8e663af9153cc44b5b6f15b9d76e45eae0da95f398223ec82678ffc655172827f94eec038c66752db5f61e56008a43e572fa91de4799e62075ced9fe37d2039bf8c89a84378fac37f363cffa2e8"}, - {"0000000000000000000000000000000000000000000000000000000000000001", "0014f0ece6e362455de0a39d79f74a891df9af877b16188b2d296065b16fded57006d76112807a5609ce0398b2bcc301e3730b0d162abdccbc3a9be8fed6be0d73e97cfd060757ab6cf3a51d6ef97e47c4f8c670016e4a000ec76810b667e23c73c7e151b57cff351b02ae4a0b461b64b18aeab389f53a549710b73dd96b036662330ee4b567bedd3783d8ec823a6b3e9bd824229fed332b1f888565ce028505e73a8a324e93fcb007e6cdcfe78f3ce692771a2799f148e3139dbd42c73deb8c37929d15470c05960d87d9d492b0d2b99ec70c1b4b2180dabed5c150b47527b25e261a3639c2a45c265c355ca5045bf310d6c856368d5e5e963a5c5e0c4d0cbc2a08216bcdc24166c3ae4728cfc4bcc01c59344c1d8aea513b741d55aab8b1be82190b354ee80d1700b3ca919733f82124e16b60f3ae36b03bb1ba1a67bbffc8983ab35df2433f28f36c494dbd53bb670094ae65f9743d4fc4996102835da41a39d0de1f124af0caf0c5303f29bcb939168bc938d6a656fdb64d0a4394c4921ba46f492b11d0d9f4c91e142ef516601808cf7f6c2547256a34424f181d33b6cb10fc3754075e3f1df4d4711f7d66c1cb0e1dd27d795251886b219a0ac683a193c7b58233e8cf2c4fcef5733bda2b29890bbc52580262eff5867c2ed4261dcd8af90e2f3bbf1c49ddd57c09bdc125da89e1db423cc9370d4b02fc0222efa74e7b4f2d23e117ef2425a9041e43543a8eb46b4f907fd19d145667f9c2aefe20bcf96f950558a3ecd760011bf844647640fa13099fc033853610f5c9c709f1b8b1ec62552f37e9bce179e7fe0af3138b92caea1f5957c41952e2f77f44b3dd821f88f817984b7c6dd0af81c747c3009f6ad8ecd19e874b08165dccbec0c90545103d337b35553e01dba90fffe81f4e1123ad4c792767cda348f6e26ebe77729fd2d500768734b59642e1de22c186b598be97bc7f3de9513036437b494db41b3bdce8cb38de749a64d61b1ecc064bc89b54c77e7672c744e2e4b5fb25e0e89dbcdb518f233140f9245dd021a5df09b784f5c8697644f70b92e5066d30180b88afa537aec17429ab192e76c14c58ec93c769ea97b6d868728cdd44668d2c5b2e6c1af4ceddd62ec3d9e329447a9a3919834ffcfd2a30353e2ebc414fc9ccfabe2445bd5647d236055ee0a4014167d17600aa2243c0f060e3ebba6cdb425857f40600f6a74183fd25e8e701ac9255eae4a164196b9909e2ec94b250baa309c7e30be4201464f6925c74070f05f5615b44880ee7daa1ad8a6a3ded93c89aef5a09fb5da27426a327e0e420abbea18969c6f58f01720e01d07b510949ea7974817432455710e9e66d6f2b1777027a7f6082e9276a467383cd755e57dbbdb17d249787210876f447bc10057a6bdd2051b40d4f3cf101efa91dc6dd943993ceb19e3553feb12b9a95ed7615021eca63ca9cc0f1f213e9dac85fd6e1967ffc0b056f7bcfb485cbdb0688354d913eeff98c56925af0250f655e67495742ee24c2778a583ad1a1be18a208026962239ea8e287d72ac1d8486bd6dcf51c7f77a80706734e572923e9c183b3e512f76e41dc3ef7675f06eb077619d9900bd24270e08ae2c1e3d9085ee6131a55c42d3f916bfbd24d368c68d5002b4b4a9d454307957a5745a541dbd09cf5aebe437072ae6177a34a195a06874c0f170f004a33dfd6fb19857046bad37f0ab3a588c95db2934f0fc0e59c7273a10ccccc093523120189d7f76c2df13ec2a52deaa4b26ca6bf877b09e5679eba89bbe5051b178625d42f569d629bb0aa342a3369eb5922b4dc3fc54ab3bdd81b6fd95cb6441416e60c88547b177eaff29ec42a3f5b26b53bcdd125d2f20e4faa602b8c4dea4da072b88f30d77b5bc8"}, - {"0000000000000000000000000000000000000000000000000000000000000005", "0012ff803deee80dfcaa92f0b5345608fd6fac5d0f067cd5a691057d46a5a47170c08ca571fec0b64335045a1c92780f2088cfd2113df6b8466ef48679a0df0ddef88fc0882b71d429216c210ff9e4776f967e1f07038f232c070b8eb541389f8df83a1faa3efeb78a2f3f628cd2a47fe1bfedc38977d741951d1ff3423107d5a8dbe50f96d10968d23e50b6a51246067aac9a20d3dadaaee16e4bd9efe38859df1bd11d3bd357bc072397d6a2dabfc3a3d040e4ac769082b2953a21b918a3c956b50970ca77e7c3ee1df0f049d1f53d74cc10b424f0df1514859fbff3f76b2f8bcdac037fff9a156d3ff0cf659a716fc7f33175fd4bf51fd30bf8c50c9f2fdcd9c78b4f0998f42226b77755f06e1e69d81cad7c7c9b9ca3ab6f0b67ebe173008391b3decf4817815e0926665c33e77ed17996978239601c3bda4f2ccce4a6b4580e458f9794262059c636726ed3fc700317cd6d921892c73ea30847bec7e41e53a4bc5bde53aa65181addb207ca1437a3f6731cb6ee55fd72470bb082db0e0386e30b29734e715b4fe35bdc5e42581a19e1a842cd875befd11262163e2509b615b0641a045808b4c2cc673ca47903c65038ca0d5db4332e8f31d8e654abaa0bf1cbcf1a95e76bd34790d3fdcb88185f81beb6580a87468db2d133daefb57c17f42ae22d2c43eb3a260e055a3e34819c45cd057d6cde27fc09e0da0b06e0ae79c39c23832ed3fde2ef753ceb982920a50c1da48735f9da0598157e2706315af4c0ec0da2387c78dd32e3022ad125c67e27193e511c5773370b974cfc9e00ed2b24c375e1ac4842d022983b2f1489ead8bd7a9ddbe305231f1def0a4a64d916e93741a29c5d4e232adbada96771b1766cd271725affa116486914be5807c7d1b603a6ce68e4d5249d1cd38633e95661c18d70217fe2c3562f52021f37873d8353009c7387559e96636e91b4a07bedae75cbb05c89133a7294b7320ef6275d934472c9ef6cb66a7d954d242bfe9da6df7b3bf5e5f654160f49c1ef1a9c1b2c3042ff522ad6e58ce37455e58920e2efe596c6fc7d140793ba97d53a88c7f8a53672a1d16c43a2c59ff6431c8e88f1a0dd22530af5c20a66779014d69a59d62230e1e2d3079af6d3c7cc59a63ad7ae9366121bcd3e5993d78b22176fb57f0bb8eabe546abfbc119fb54e01a5a708e50464c5d3a9f0d20bc29f815cb57ef8273f83da54d09cdda316654429462f9a2214a11f19db16d4a4052305eb98c779f7bdfc695c56a5e33c09062382158f408b2a46f9fdb7dd84ca024e5ecbf6bb7a08925b569e8f03611911245cf26d9309c9ec1183432f6e0c2f0f9850515bd5e9c4e74fc0e2734799f8a80f66b302a330a273da71e103619064cdd9b07e627d13c93ad77cface39da3a22039e12aeca3886b8c3960122cd9b84cdd3df390c55b2f8cfa95a39f4f8937a2987d9b889a06cc1115642bed17fcf25b79ad92434104f6751d3f69171e183c5bf71e97ae5840451d93510521eedca53457b23457143ab458edb5763de41db1678d106bdfd9987f7e683376058667506550d301c1bc811db3ccb5fc1fcb1e22703e3db5eb9ff7ab943515c43b766ae3bf7c01c984f4cee2a3255705b694954134db59ca537b3a98217d15275dc6203b83269fd02aa3ba9d7984f2d25368422955a1cb5d1793e23f12002cb09a75137eebb4346ea3de0f0e1e1819489f20552e2602418090ce73a80fe77990d81244b50b03e100065bd3d99b603d8e384f21673fb4540796a6e2e062c5f1e148ca1dfeeed75c9f261224a029db20c7e19a1772dccc8a116918f2243e71378717300fc1e160fe2a08ab14c2a5e6f84c3bbc124d7c0f3673dda9c341fa427335179bcff0dd45148a8ff591832906447"}, - {"000000000000000000000000000000000000000000000000000000000000019c", "0044a6c2c7e036d77992e156fac954cf173818c6a7231e3de5cf893397c5f1944b7db3b8d62c6e9ebb4a173dd7e335b0eba3c5bb32708cd0d6d1a7729a1aa41b2624d24c1b543d00e19467abe4ae451fa4fed03701aa6d9aa4920b9b4ff320d82573fbbfd67ddfd10145ac57c86fd1b1131d2829f6f67eece783265d676d037f1ca3224e62c55f18e14df4ea250d1c0a78d8b329a39c3325582755d38f557df253dd6a825776bb35042f15da17e070af615115a58335f76789a65e5d8139afef952195d3ead846a725a66cd2ae2b8afb91eb0917a555f42e739ba74de1d009a4897c78dbdfdb110d8427635f89f122c11c858218cecd91ad951918b4078d492826e1eda33482911c21d67e51923a8ef32312cf4a514af8e54be258f2a4f7bdc90e100c380ffb0ac36c91ff2429a94500f577614189ae7f0436aa8339c9dac09657b60341bbd886de496a96c7205aefd100983a8d1a04c90edcaa38ae2b7d31c29f7a59f0754df62d215155e225fe429548453c1845ee3dd95df7130805ce4b169eeb2c6e268656cc9e4f54a37cd4751b3c29652e9ae00eec50476296cc4659e6431a9b4d078f01b0cc88b705f84e824bccaa54aa15b99425510fa91fbed00d9d64b91421a31ce5666884ab5dbcce17058b46cbaf486bb5cf11e8bde5395a95f436217b24fd5d8e428aac71d70457796a4d5929e765f54aa400a8ae709de75dd1a04da83dd15ddad2e2765ec29243549e4777d317fcbee975a358cd447de07259075b1bb32ac0cb485f6f30e4d428d747a53a3afd1cf76a30c27f85d9ae0e2f8924152caf75e26aa77b588775050d94bce6c545c303c370f83609ea51b72eb502280eb0c5a18bccf3c7553c514fc71dbf1edea29a15b3059dc1434f51a167e21c90b59f500aec870e3e50920664f44bd91ec1c5e9d39234cd28604dae1c2fc829033fc5c53407f8018f46332406f433f5325d69f967075bfe83ff9a6e3d8bfca3fa10aa52fb3d947d7fca0601e8c119fd531bf991227141f0f76e29d7fe36d61946f112a314cce6f6d5f5116b2d953394643fab610cd4faab3a8706a08a01f18008ddeb5db90e5d8adf49f7ef69a81a8cf5e729f53542b1bd2a1657f358910dcc7b73f02c2951b500ab05556e8c7ac8c75c73792327c1f0b8ef82b57fc372e94a3e5e5907ed75a86c039593dcdf119ead2315a20f92268f19f233ba9b26169f7171e6513906af76c206c099dc3232337a2ba21a4e2e8eab4d72f8a0ccc26d632765ce9f22565e7f2dbfabfd08dd8a7efa2de4a4a1b7c35f04145f80b90d8211143f4767bbb5f44764243f365604321790bd44f522f4d2f18599d2c3071f11d3283a73afda82a0189d277a0d4a38fab1be535f26f85480ff388d3b5837b38ad98353c72103c306eca0478951fa9f7363f7035ae7fc0d5e01fb1f8b274bd4dd2f2306165d28c32ec5ed3986db2c2fc9de53ba4a7de5c33b1f9c3db80b0472ffc9d4058cfe3ad23b0da9b28a97a71fe57b103893dd050722d4d0c9f1a4d7440335d690795fe1049765770ca024cfd78bc27dae60c5621a40b891410bf55a04a9cc383ec4cec1096bb829ed458cd2d56d1058d4396848c091723d8175d5e5024cc9a7d4d08012e0776a7e46776722fe84eb37d659822d7b12374503b7c7e11a110959d57462e501a3668d7cba59be26344e73240af87f97d4dff47f1b4dab89be77baa4290c3b114afbc31a4ac79f41d012a7cd2564f72e7b5624f292e5c49b7bd54e6689c2087292de9ea797c84004984f29deed27496e0a431a31dec199b16917a7906497cc35709d6c5bcb329a1724d4f896bca9593c0a0d258e2e5b8e6469d627b23a71c007b12118ecc9bf16a5e404f1618df963d8252e85b564797ed58d42f2"}, - {"0000000000000000000000000000000000000000000000000000000000000006", "0005c144030ab585ab2a30eab225663dc7ced30fcc62184f9a78e7dc0d45d416e5396b251235de32785203189426cb289dd3ef1440623b8bd69b7deddbf8ec0da47fb7e5c4c501c24bc5d47e3c57d97b3db5cac302f3fc93f6c8529fad480a83865f7a0ab7a43893920af3b5e6a7d002a3cdefb21e0f477100a084fc6a0d594c93818d69af5b5cfbf5f9244fc5fe4ec2f8e28d62d2652689255bc12b4f68cf3571152e57e89de0fe08c4c948f855480720e7221e37e35d1add6c9cbb1f264c75b3eed17946ccb57282e6aa6081344e78324612a0c1aea3a1b5ff3bc1337eae35f04b5f719f4170138a1a1fd1d76dabcbe72268da79d8d52efc6a7f920a8b00bd71865e644d5f5717dfe02f9340b59fbece26325c4f45d3deb319d7058d777372417dadaeb3071da6b45e30d68438ed2c04ef7ef50e91bebf5550372615857d2eaf7ef39a60264de575e1063b4452cd46052062b7a3a346fb607822194d5b3f41366d0b1311172b3ace03d684d37534a85b905ebbda697cfb47a0181cbbb519995d2dd0f29209cfd8f4e2e54ebc6cb12f750cf7549bcded308b27eb626d80ee089b7bae352ba3dda65b1ea4dffaeb99900a6b8b167443192b45338a83a1948d61519c34e48b58cbd5e5e00d3278a82c57127c44ce3db531f92497a1d209560aeaddccc1466537e05de898e3af70e4c4c66b6565d14c1c2ff307a3369bd59cc1cf98dc05f85ff0c516cb07fdfa23241022aea13c2c09fbac36dfcdf74739e3b97e165f0c802c5017663e5d6bc411d804ad6025b21f72ded44bd0a58da4943a27dcd007f858c091f3111efd437b140a0c8d131b5b24eb07752f9aaf09f9c2f57f282615e03b5f5096db69420e43a7856ef021f3df725c981512e15e7fc817e7a75c518bbea553ea76bf58c78b18474dc6c9573d82e528832a764d785d4ab717c1a5004a53aeb8d998e0eb2b13e9d0389b8da16758bb4a0327146e48c8a92d757a19ab5fef4973bb775dee3b07d93d4470c3032e4d32f44492d4cb69cddf51bb0c49b92545cc579160bf2316c96cf18645e46b3fcf7305a54a24e3447c573333532e3fba4f499a90f3d7872da9a75af75105895f9cf375ab62d60986b8ec3baa1eca190fa3cdb826944ba6f09dda27fdbf497c0fad26a81c6a75b1e8c5c2a862d3844722f5033e7c5d5001a8a1403e6d5bbd9a31f315f69e4d813c7b8ce004057741d4db90f7bb697d42fc6020516359787df443063ce1dc3e567b85c13c91d07798396d9e11b508ff28640d3e639068d7a7c945e4c5fbc12e700edd9af304f88b2dd967ad45afe550fe5423865961207505af13d536347ae5eee3b08831dbadc0e2bd629af93af90799cade484e2e79fa66c147adb4e48ee1fcfca9c012660d1ef98802fdc3c3f3ae65ce4362be8e36313302f5bc7e360bff86798a303bd7a540ed224c5197a67b597df4bf6722857338c92809cb95b6d02c1706a40ade0d139c0b9d1bf985d27345b1b79678cb54967b32f19e094a8eec4d8719e3fba37af2fd81add298460464c5513d81b6cb46849092a98f5ad0cc57ffeaff04c386e516193554e2f80142841270c8fd784e45d80693a5224d980abaea4905ce4b425905dd50fef12018dfca457109fbe36313925a8d15dde64686d8c12406902f83814f81b10ee4d0b3e97ad0d8dfa5ebf09226d213b177db69f5613cb4ccfcafc8ad4c664ab5b8127f94364851dc031177924ba3d6a3659538d74c151dcd7103680a1e8b460b15656c7d82e601639cc8eb0a512b995e84275aded8121409ddcf362c2d13f7eb0c83a459d662893148d5a81f6572803663e0349d9d1884d2e5c5b67d35ff8cd697e0ea993f4dd49eefcb31f0b482228f04a14f125328ce2de5d5dfccdcee76"}, - {"0000000000000000000000000000000000000000000000000000000000000006", "003ed39a7e92e5c4a21132e5d32301a1d8376fba6b1b011feabb95cf19a91e532449dc35bdde6b54a8a9210d3a3e908dd2bfdf49737bde6880ae349f54f77d4468c339a4d3ea0bf826c8bf51ef9b7e4f529ace2f1342742b3c29a0c7eff632e2aaaab799cd975faf7928b945eed88d64b897e6d4423064c13f2734fceb31223eb679cf25d601784093a7df70223a0f4abf1ecb2fbc0b67c81c933f6a98537d98780de1293d5d342200a0a816f7052a853329f4be39baabdde2ce78bb6e15903a4bc4320107ba665186af678d0a25a118c69d18672bee3c063b5ca84154ac19b5de2e067699d6213afae214b651167de318179639e90912282f11cb7d01269728c7263121514e29a82b5a8c1bc3035efbb71c950118b2ed530393bcab338f6194ff3a219f306a0efcc74305b3029bd08085b34ccd51da11a057c78a5232050700d89fb13acf455c854e448a04a6db4f82011e91551e0de0507b57451d44f5e079990378bf2c1734ce15df9536bedaab35152031d15accf9d6e07d1365e321d153c78f7b51e843e6cc194eaf473d92074498832402e79a0d6e3427ce73dd44168bbdb7a8d80167dbc7e21a2d45c38a80c16638230a612816cf60045d07592355d1e712bba058e2062e24627f14a77003c57398c3462880961a83c6286bd3953f43f265f34874ab1c53e8983d6b8ee9e286f37bbeb224bca435081962a95384bb907a07f459c737e492d0463b8ac62e554b8a04ea4f0f750314d9126795a60f91bbfa671e2b44e467a762195e9bf5cce7e41989b35ef6683449cdc3bc6e1b9827a3dfa68152d32207062bbf7a590978019a45545b5366f0c135629b9e61c76c1e6646136d86f73921d437d3e60981016a3e97a8847e49ab0bd575eff4d090c57b6c112442c2ac12c0463c00211c356185b5700be1c3a2d35231c2b828f994d0e61801cde136bd80c65459213124bc40d6ce33969f9d0a1fb491f2bb53e543f866e2c0d33fcc1a4ca6d5ea050ba5ef29bdc437aaabe964e9f754be99a76bb4f5e00e5b14ca0ed5ed39b8c1b74080fef37eb522b831260a39bdcb6f1c6a39f78404a591eb8b113087ee8cea3851f4afe15e4b6b08a8f9c90757cdda8a0e34b953113657baf55529656dd0e7b4db7dd7d3061c5d31901d1d35adae11c915e7a137b7b957db868475ff916f0b41ad69861698f778dbb0b61297cb26a27dbbceb21bc90e161f8f79e5eb70354c9a68afd15882b4909c1d9e70f231ab66b3a2d3b7178bf2011232fb9325b71f06c79b015c224ef3bd73a623d6f122b7a8df28710dcc9ed902e749cf4a62111b6bad791daba84ea8753c02ec8edddda8faffef24bf624a9de94efd3525f413cfe6fd6d26a91da6fc1b3ed564031b89b75f43c6512aebe2fb9fa79537f7b6a1f46b986b08c49fa907083cf859f2831692bc06d1f8ef6be56108324c59bf1bfb16c6f609185374f6e29d5bf63bc8c9f8b0b14b12b3a8de7f655447440ae51f9b45efad7700fd86a01a9c874b59e51e71518bf1ef1ac15528b0c9bebf1619c29cb3ad4fead6b496c5cf75dd1fba5d3719f650224414f92f8fad496109347b96651cc5cd2e5f827326c2ee6143194e2d750f54947e68466e288a5b205c344854cf035d6c82fa0cc6d04bf36ccfb1ba7f55f40b81e31e585db1e126d1ab232c663cbacdc87e9a892d3bbc4d4e9352b4d65663ee1854cec0fd7c8803931b34cbca8862b30fad1f151aecdae2525b7f7b32942221c42cff1799a2fb8a23a2933c1d0775f97c1857133e50bd860aa25a63a7b504d0acd46ea16b1cb0934182bf497a9ee3e9f1b5647809d8e6c3440e5fc23614d745a10572ce5bddf0d4a05db220a5911850b1a11c745ffd85b7de21c1d043bdf0f954c55e2add53fa"}, - {"0000000000000000000000000000000000000000000000000000000000000010", "01f460cd7acc8a0b205c813580297a189abbbbec6f02882b11ce42c03b32a8e1f53494bf0979a5d75d0f243a1c8148556666b54d931f3ddbae8573b5f7f8a230792b71b42aa519f2b256e5433fa0330cd8dd449f1d51abfa6aedcf97b73f83dc6ba62dfddff4b4a16a201b128fdfa5be599b20245c5fc32e7288f33ea0ad37a1c4ea0a169091459e5877895d844ad1ba396baf4b96fab70ae0215fbfc4e65a07dad30613f23bc44e027ea8a5bd07a71ab7f6f0b110b918f1db889605a323938aa2f4ca7bca60e7d7d629ea3dda8dff7909670d5862c82258872aedd7258b9cd031b1eb1eb4443729375faf14e654e7373dc5c870b8969eb9755f540c048f0a5af6d02aa78b18b5af4e6623328548f5a1891b37b913be6e5a03b504b2003c3083095e413eb23321d6c16c61174a2d3ea752687de16877a5ee1e20b265791b4b361f4bdfe09196ee443c5166a039b7f73e071447c264c93a65c277a4d167cff245af335a10030c719a76506755bb871bb50eea2dba59f8203e727c0fb1bb1d2a11d227bfcb47397ee588332a511e2cfb36b909c80d7a350bea3b338d36cc29a917b0bc9a7f0b0b6db40c43705cc59004203e6db18950b8f1dff425fdd20e50d3b746c7f8e2636f42cb3d4c7f904e212456afaca33839cfc83c236153a6425782b63ec95a3db1f6cc6993b3bfbe1bc62fb237c3768828f960380b971587b4e34cf3a39ee11f8ad155fa149bb7583a10ac6f49140feb257f0567616c770d13d8bcdfb9511481622e0b1b7b17c1ffb4a514f0e32e21b8b3ab201d8492ee8d07af618212f4ed0c674895ef32d208f20f995eb6a03a365dd62b61d3b3283ae2b285dc40316267f5c4c9a305498491a7f12ac832628a703743051c2bdfea3c563c38c4a885891733242f571f7b27b42597c15e47ca00cbaf8666ba6c4a24ddfba135be6b0622c7576b44658ee1919066c88503193fa44cec890fae38a4e1f03a03e5719413983d957d635ddd46100fb9c4eefeb6d12db755b8b4adef17b234477949b022ade6f83129ca9fee144350d3d87bd9d7681d426b0818a0dd7a02ec51f511f20697ba1805c025d379071d7cc57a1863f1d727dae3a7a243463596fcbd4cc12ac3d2e498d56b2b9472e5ef68cbb4edf26d5c5dd04344d68e1b97eb0acae9c523994ca3a5f73698fc1d0edd6f1219cca2707acbc34ceec10f9269f9db54fd111f1f4bef2773e54b81f25745485ded35e0d7beac2faba6879f201f8f50b603ef55bdbfe1a1d3b8ed484fdeaca8ccd9dc954b8bc5c4c5b709a5f18cd50e4e18ecf7cff8d09badbe1cf364b24b0f865e513cb5c120a824e6a79bfb498b3a658deb4af919fa5afd70c6263f07929f904da3c243d7054c72111b5d93fd01c42b1ffbd59791919d544b34c8346dc74733d37a508d071155e5969427f52f32d699256ef01b07f078b4c30f0b0e50cb65d0fbe336915e51327fc46e4e1ae8dd1973e3e93a09c83d2456788416fcef1242031a84164d990c7ce5a039bd8519a584d3bebbe1f74c3c498d0b403a9b7a8e2a748333e57263bbc615c9be7a130a1f12e161db8c67509fd1a658d54e157671c3bc8b011119df87fc9c05dd506445e437414741a96a51238012658177c5eeef5995bca3107556f78a3bd1b7530d07a1fbbb8f108f8b5ead10d6e173cc086755502c6c3703b2f0a94deec5c9ff655450daeb79cd51fe4d16094a9381f40b747ef5fda524f175679dcfd7f5cceb24b84c84e4377a2dcffb23ced2fe2765345dd25dff214b8a3eff167d13b9c852a42fb02ad7163bfa3dcb2435a4a048ec1a37e9a1598edf66463bc70e7f6ebd2cc05b3af6d705295b190989757d9b832e2b9e02be50a62e6472e04709264d8613c7f0cb86152bd1e664"}, - {"0000000000000000000000000000000000000000000000000000000000000004", "000f0222044557a1a3f1e59f77c1d05eb6ca77aa3b011d436e92d453d2fc1270b7458c8c56851fbb55dc031692e27609e19aeeef8101bbf568184f709729b828ccb31de159a270f8e6d4671be090c75b5cdbe16810635a9ad2fbbdbfe479550772b8a8de02dd74497929c872fd55cad6809ef93799e56019d2990196176027a2fd58aaa05a5d32cf82f9d9df9f65338dded4224fb50502d8d477a346460780773f38eeb5ad166900023e1455065ef0176fe0c27f6ef561ab5a1c7d804f30abe3f3f4a1f8ff19e5176c74d39d425f9b3317e20268e3b22385ecf08943d1f3a157f936a784b9dc754216efbd3eb70cbbc967045751f3c9facdedb6ad7502c1eabd788952399cd851f54af0d73938206ba4b00d692288f464739b46e341208a9f788ebe08baa4e2094421c80d0f4884b2d8830a41357585097fed6c38126916fff54720d397c7114dfcec0efd85446d985200117357d78df645f41575c10c5eb452dc9d98b0aa4afe3651a82d184dc7b5460f4ffbe00d86487e7c44049591448151f0cae11982c10d74be720d2f51b6110e0015953444e58d493f830f15329981aede986563087bd9cf4268fd574deb5664cde606eeb910f7a5261b6cccb5314c16746f2c21dbbf2ef63ceecf2b1c0911fd341aca65aea993aee23a95210edcab23cc503c19b309c7c12a3741572bc35afca20261c1a8ffa2f90abab9b6ac85e587a198043cb3acff3535e9fc450435bd9d87edf33135b48f443124ebdd51cddc106f5033961412b6e10cc30e4cc597d1d0afe25ff4ba2d6c35edea841f29c285a36c2524514cfb4afa363ecb330ad468df81aa64c5d599d29c5b3c716b0e4bfc243063427363efee2cfbaa354927bf6512beea4559aa651b96ccbb6ad49f2f0204f1dfe831ccb917c5f091e9405254e9325515c59daee6fa753e9962ca02feb13900a903ddff290cd582a314180ff84bae4ae6f98ad208f71047f488afa506e8a11e1633b6a91f63abcd0e33fabe25baefc7e1dc9c589557693d027699bf96b3498f5b2cd69e57290e5bd79eaad5fe82dbda3753f00bdc9092d251c8611963345bc2f744020c839e027c0df789cef00b02aed51178c555ee77eab0c699fb260cc72b22619681ed38b408527561e122f6767f7f832493fd9293970bf78c41d7647bef7ef2fca8f8f3420857f6dc5b4f2ac70283a6e912c7ac4a0a4a1260192e2475c718f1d587ec09b566614358c9c92374c3e41a9f96605d4f4bd740495273ade22ff25f8ddcb4491de9fecf7f9efc85ce0a383be2684a0a272f9f99491e4b7aa3623a0f6df6e645fc95780fef3a0ade48a121064ec1714a5d06a551a313595dd755f9957841f427d92c33e5e8ff235dc1b7f03662df4a99a457a2562d4663d8f2ea1347851604eb5aebd1b5bd7d9e933c049fdca62e62a14b703ce720c23c32da401b369ca82207871ea5ca82eafeb0f5ea82713fa6125e3b48f80c000ae32a742259d522a0cc2c2015d600c49dc7991f60bd210f9c9dada0ae6386b24cb67d8e5db92733129bb15cbba0ec1f78df486de97cb2f2eb65d772d830f39d2f8b586244fb43e9fdff752bff65c1fde49f164a5bdd63dc13dd2b6967153ce2d1c28254d68e445470cb36433c429df67cc6f9fbd732820b4557daf607a4f17133cfe9556c55936f61bcbf6eebbfdaa1d7162c4d597908760bcc03a3eb086da2ca160cb0b2711a11e3b6a6e8caa5c72521b61f3c961182d36c8bae23b34a83be9610013bec8266add7cbab17db5c05d7098af7b85af4f9cbcdfe3c1fe1725ac31a0f3afefd1ef2ca0de648733dbcf382963537b9222c5598e91f1964f654201bdab93bd9922323ca3bbd9e283930544967ecfb419fed3f6a569b1b615b3e5f4d43fccc6c"}, - {"0000000000000000000000000000000000000000000000000000000000000027", "005b86c33be0c0b9bbb13648ebcc428e9584dc3b1215f609aeeb6cb103902079bef67829e6eba839b18a0454d23f63c8abd5a60ba3a9622775053b65bce948074be9e449eb2fa5adcb00abefbd2aa87c37797898015bf562c6df6768fc2f324e0ae9bfbcdded49fd0d19b4a99422ec804bb698b7672e3d1e0f1aefbc2deb0383270ea4a1efc9eb9f846883ca151224baf2ba1226b9bbaee70dd3e1d1322b6cccf4cf3339e039e0fb0af14da450d491daca2602e21753413e0ff9bd284d57277529c8964155aaf987abe97c80b296df9a0b830ebc25ea6228fbedd5a9c1177b32b92905ae0e02aa1c740e90cadd6a5bba3703e2e9c284bea9a03bd97f123fa497110a5e3a89fa324c20315aad62469cd61813ee51d1cd788feff6f133bbb4f77cae23aa1346321b67aa9206bc3de9f11256c7165b1b12fb95fcd80a1cc3dc637ddb2cc36e3ba464d0395bf983e29d032905a4f431732ea6e7bd05e41e5046ab0ecf463edd4b0bdd34df6dc4dc2a8d1804ab2ff26a6db43cd5dc1507967deb30de73efeede308d8af684987420587e670850feb9851e5e25bb9fb089687aa9a52edf5455e6113a31a6e4b0032d9c644411ccb4930681fbfe914342e67fa643566df7a56e974445f7cb6effa4385f7b2153444e628d76c73c6468eb4bd2801288feb5cba8310266b5856022631a5c64dbb1541aa5cefd7885550b016fe5271a4a69fe0ad602a947e8d229f8d8b1a11454d306960c36e2ebc3e32efa38648eb90d3b66982b65fb40b96e51ddb129b2f40b25749d6e0cabf6a437b73fe5d020c9730a60a55de76e953678385b6bb116a342c343ca8ba2773f724112bd9d2247d632e19e58d262f5ff31329ba37aa5a27f4e932e324f1c18ac261b249700251233554303986fa5426d1a88090fd62d891ae844e4b69ff1bf93f64e7787d114f033db9a0278179b640f0a7fe49303549745339ded54f82d7f86b34ff6b8a521358fa309e1eefc278f31873ad5c20adb8118cf5543b929b884ca85cee8fadae15b63045ca6fc27555f5ba35c6e55cd4b3856fa0fe21d6b0a07dfce73e9837ed34176607f16b997c85b61c9a28323cef1ed40abfd05b6e5a7533fce75d76fa27fc9b9146da498c6097e015fedb2cad2e5d401a0b1566b4a4ce8cbd75d54e0a38378f861725318025931584f860300cb85a792c614ed42829d29a908e524ae4aee29040973ba4bca0db3d912f28d377a5da0f451d3812b067659b0e85d1aa163cd21cbae92098353cb9ee68a2a5b6a47e255885f648df501adde230e46f7b3ba09062a6e5b76e1c1efebd1c40128c39e854b689dc47815d03b9c56a64bfd450f07658ac30a12215efac19e15cad4027d4993b1082b83a535eec39114ebacf6241b5e0d7733da8ef6ea94637b61cf08b747083b1701097c9f6c9ee6b6438ed372ac891a1bb0cec31ce807120bcc734e157a994f9ca13eb73aff8954d3b1cb6c14e1dce7b2971547173b75e388c69439aed67bdbf818200a08c232da51fa96c1af22e705e2c78cdc7e090f480c3e9a29fb5b8321f315c6c10dfcfeab4d25622d48a2689cced2447950d7d02fe63357a3399ddf5c11b796afa0081f9eaec8b1dab096c2374736ff212a348446626e91c09d247a73a7a87821e8edf4ce516f0e833e4bd293b7e3c69d4b2f2c751057c80d1f46da516d93cd0fecc4bdc51095e75b414a259a4fbe44e810293ecfc6696f5f5832324b6e76e87d537a38cb6c21f2ae1841da27d744c8d489f5e1dae57976d552a80eeb68f91a2cacd3ed63214d18b8fa68fe792db4674bfb2647badcec654084eabab0fd39e3582a3e2efa10e372ee6655bfe139466336ad56f91310241f15761113d1501b53094fab3522785326d14cf9564b3290"}, - {"0000000000000000000000000000000000000000000000000000000000000400", "003d8c676b8be132abb260199b5e36a02f1db1666c3050d1928377ea75de7a4a8271fc29c33d619cd41e02aede70c18dfd2077b229b062620ac6e0bd5c5fdc0e808b5133962da7aa9bf4e608643cede0dd1bebeb0cdd73b15ca6d7cbb805e1f7545fc5953e860a87c24daba46415944de74f2ee8dca4e27e6643411f86f643a40333cc7a1cdfe5e424a720b582455cc20e6280640ecbeb63e9654587101670c7cefe51cfd94fc056012235962c417145a4b328bc4047c20a7e22dd2fb3145230b15f105331bc8da1fa522495c2450af9a4120535ddfa26060fab00b8530773de90ed4b48f88c8d05bd2d2f2f544413d3c3253c09cfaf93d2cabfbd38034a292600df56d7b40151096fc83024cfb1510e201b936caa48c9a6b0cd6b664c2efd412df3bddee7850c151e161fe6682d96e8a1fbc163560e2905381ee81fd608ffe39bc5b961185216689357a20c675abe350183f33b90830cdccc7d71291b49802b5df67d2aee649f3333d1708b23c0897658e3d11b4208cf9c510e28a3ac2007537adea74fb491c15e82cae8b19e70f45c339c1fc4578630c682997daa600f92b6d77ff0880dfb72d6dc15716f9b5a26361bb691fa09ba727ae912afe9d2d30b39a18948b40d8bae20897838bacd3f13876e19b0093e63f4d372457e476a50e329701d3a1f0e9fac56e379a530c8a22b192ce9389c24e76d7d05ed38c79c468a75a35de0a96c1ca37b1ef99beb3d1641c44d89d50e85848162877a613f20a913716c930f559b0c634fa8639cfb558ad2becebe1318d4cf4a1bff5f925c6acabd78a484b5b53a926933d79c56750c3181cdef562857c1e1e10950b87130ad67b2b04f1ebf03c56fd660e1d75a979f2fdf9bbeab87bfef081a6576f9d114b5f4ffc6123c2ca185e8a1769935f71b094be549d5da42b4f6a1cf06ad0f809a6fc7f9b1014091005f050da648c3575ad0f6eb5b7de65dbbba773573f277af77058906286ead65aed696f1b60bcf0262095fa2d98eed1ce0034be5f2d89e786c94fcb6105a523aec17bb618169d6bb0357d749dfdc79a8420dd42acce40da69d48b8f5abf4b11ef692e67c602238080344286a988ff4d8656c36597c32b02bb6f5eb4a369c15205fa20bc1a42937496cb8f29811ddf80466522f6960a479a1922dc793c46cad0edc0f792204014a8e7c30aef1ab8830e697533dfba9fa1f1efe3f3bea6471b42b25d39899382a0ac55cc25c5f1682fc01a12336d049e436dbc7045614fa4c9921163539a32bff070402b07541ef61e3953f6d6925463cdc3b570d853461054806953254b31e7ef6bb819bcc17b0d70e4ed268b0970d7105f04569bf42fe755fa0bed9151ee43b200e2f390decd202a1e5a8d48dca14b22fca3c9dedc150e4a33b677179cfbbd8b7769fdafcf87b0838ca64f7703499f9b4617c753ff63890a5f5b5e20c4d41cf36d9d157eecbd255ee39b7a4aed348a40b0d574acf9ce5d093df4724d06777a3c6d4fbbe6dfb173a75acbf6d45ab791dc5f96ae3e3727c21fc31cc09a93eae980a9375dd34e4a617600d66c12b3e5022467514f39b2334b9ad02772a1b628512c7487bd7500cd002cd2ee4cb8595e20234b63ee640bd10d9327d13bd116e3c0e49b38f4d941b2c5e88f6a74bdd4e4c0bb95502d0430e746ade08f495d471c30d653a63aa1a00376442abfc876f7965e91f7f4171c627193d081244b8ddd9995fb9bc33e42522ba2cba2c5cb9fc701fb331628b90d9ddf5ddd6e428f9a4ea37699473190c3c2a991e8fd20dba1214ec976174460362bfe5cf1fc56cb3234e1d8bbb52a25a343571ed7abd3116660ed3519cbe29d29f9b3e66c74dbddeb2cee97980ba1f4a5c8952884bad4eace33884e38e71ac71b8fe2e"}, - {"0000000000000000000000000000000000000000000000000000000000000004", "02c7a8e145dcbc037ba5031cb2d7d5159f344d3c155661bd830f2be755ac66a63f886c8ed9da84707975143bf25ef752693ef6d46171d9c2a7115c4f7174671a4234182152832f6358947c17f4635788035ed5c61cbad5919262ccf96226f3533855083abb141857c1387b1fbc4399a01b813995de8d4455b9896f978acf2113294163df9675fc5233c4fd7e42b1bd925e1f34400a57dbd696742b8a98a668534b0eaab085f6f853034eaaed58649f91e1c0c0c0c4d9d0a036572dd0172b177af8ed96a24ec177046917f914a2a4bcb695e505e0db803fd3a68926a900996b5c3dcc7f608d7d0b3fd7c5f771efa073b7fc645a5952c58ab416d6f08c0580a0f5e844e7e77f40240499ec25263578fbc6ff11102fe6668ccb50871281ce4ca43afc907b6c0c641359518b9c883aed826f92db962a4eda0732357257240661e1dbe62df3c20387d82d605d92fc2f5d44c1048c0ab932d1cfdee2956151983a8e4212969cd0bf2d45ef4c0e4d9b8b9aecc7574e6346c26f881f231818c1297be15509412a0a53ca61bab2dda5091ac21b29f266cd6e523f20d6f084ae4dfa1a59ce947c50c4079bbd175b0deda888b94404ab4ef79d87ebbbc43b26913a5dce4dad91220a66edf7f7538ddc4d79ab991121429e86affe55bedba4737d2c9725d157f1b18e35394bb95f94a79b717423ff75f483160e71da6aeb0dcfcae5b18ee5f8f7fc50e8b34681f15722d243cd1115b663f2564b83e450b370685606c931935392951d6e2b93ed47a02a4e0201d84c268238c6d0d9aa483660f7484e3865d5fcd043c59048897704467b38ab1c882ce2404c881dd043a7a6c3f20f561eba5bbd032aa1a791e814ab66b80283ab3d314695359e6ff4202bfc2a941f6f3715bc0344ea1ac8e76a9d587caad4325f85bcf42317db7d42d58401bd8395894f8e6ffb03a129536c472bd1b673f3b6349e478ac04fdfb49d117919a6e639d243ff4d91423716ee32bbba5b2e3d0be97cd6215c38eb8ea14b52c7ff7c777b059fc8cf13a4324d748881549d99d17297b527367708161eb0046c156c004439350b2070952957e69853d315e7b02707652cdcef3ff7cb9be8d6117e27a2932ab9e1aa2475fe3d87f7a815bf39c35702b2c6c1a4e59c0e602ec09fc6f42985c37d1647a23be51f9244f8d3cee505a61f81a1e74773bce972027d2d8a99e60e341ab115060242c38d23b2be25626464dc3b719ec77e5c6d0bf70adcce43541ee289417d21337202aaea3ec52b1512ffc1c3aedd3fb6e2e425a35807f9fa3450f9c413416cef9508c592e195a3c8b3b7b98dcff57794443afb433be1a91fcbc588d6cd5a40c1e6105939328c1bc6c6e7ad47e553838243b509fd8425a4573bef721c7b5bff844ace9ddba7879f5df0bdf5f4fa11e8a4046bc1223614355bd28de1ef7b9e32e5c2fdb8c64c43a9aeb368f09fd5fe6775d7e735e69a0bebdc8f950fa96295ecb3e163dde88298db15400930d62db165255554cfe994836d9f2726e19de8d8c2a6ac9e9373048c31797636d7a5ecafd81d10e6265a9a4458d6640f6956c741e8b8c3864859dd41d92e269106f9e1f30b290ff9a689954de793d2955b9dcc94da210eed5f2b7099cee30ca705041344f069c345975829bcb4dd04f8f475534ad6b4822c611ad3c79d485f213707080f8378d26f44211d2c29130c7dae6449453c1e349a07db2d5bbe02f619cf08a1778c6488e9b2203a2eed1f53093e789186b5305179cc2669e71a92af9d62540789c8d671ca7480e9f370c65629254440025a07bd3929757b215b887ff2201469f6e10cf1bb4d7fc6f016265d5754660e8373217553a04f3baf18069b97953f15a460dd231fd773220752c852e24deb17789ea3"}, - {"0000000000000000000000000000000000000000000000000000000000000000", "00ff597115286b1d48fcf26e094c5f0179084e36590811fdf3c2c8d6fbca0604154cc45f4b7389bf877f02e1e15da306595c72a8c0bbdcbaafd4841765ea5b0414d9b2d58d222e919dd7e80578a9cdffbb5e5fec03f3f942970a48c51cf1fa3377ed4f4e99d31af5e205f4954d711d9e4518fa03ded777b4abfd307ff1b2078f66bac850a2ad00788539d5676323e53fbf96781c10cd212413a922b9c7620959dc577d93e51a1c2d0ebafaa45068c8e9bde940f4d22565f2b2bf1aba461b3631efcb513a4bda6f844b922735c5296d3a5ff2174cb5d0924a4be38ab963f7312aaef9acb01e2d4d34a326e086e6ca9bfeea83994521296f835c9e258310f142f9268727b4f5d3942ac274631a34c0175aa71a56bd4e36603f3b179f732171beaf99ff5f105ca9169d2e277acce7ab57a4d8bf96effd2a90f5dc0cce1c1396aae890eb489d96c34a8cedb1918b04ed417d01b0b1d556d796fbc99340d3a1fd28aee83218113b02b7d114ed956a1fdccdd11362d5a78067a62489fa3d8b1d82ed558a58c8d084d4eb6180422af7ba9ae046d14faaf7e39ccffe43b51d3a5e6cc22561337c25081df1aab24bd075c8d400f3dec2b224a87f1c75c80ad51f52678edf17605401be2940f034f171ba032d265ae18552c99f8f5cb86292b052716e0dd3fb9588379d6ae4400e55db9bb53539eeed8b75eccd30b5ce03aec61b2513fd75d41856cfe5c64ea213919464f2127b75557a6cb5d7fb104949a07e8e6b8bb93c997c12bcf4d4ce5302ecafed32900dfc2040dc63c6f8a62854a2415ed01e088d4b25cf9ce32bca7cd57d047f102621eb17ca840f945d664ea2725b26cc593ab75d1631c68249528e1d55a436bc6847a1f6ede87baa0a21a426f3ed5bb224f2d2b2307ad37b9550c83c66502cf6fdf739261f97ba3ce385e4eb13a6bee4dce6bb0350257e03e5ecdfa9e221c34e1c2e05bd887f2b2915015d17d6200ba94a6d824708ada25e60c5bf55851e230160b852d4479b6be815f0de92e2a413fd59272ecef4673932eb67bb6fe353ac2a67159f495fca5b064ff60bafa75b35f5b0f0dc3166ad176c665dbc780e25be8884119b63dc2d5343e171eef5bd789596861be80ee96adde4efffd92325c4d2fff92fde79baf14a633d40cbd49ab9682ae9a33b53bd0e8693158ffe0464677ec4e0fadfcedc633508be32c1a3c23e5a53163e3434bdf9e38bd69f53fed876032609eb38d5652a85b4e0b0db85d3e7f5c5a243dac7ba0ea539af362b18aff205a6620ff8013681fc3838b9be8b5782e009b512df6a311c3deb06b0ae03c51cfa66379fd84936d48b57576a010bec1673eea1a08e59aa86541c6d1b7377be7c224169318f550af7f9c2e2a236b7bb4c3335975319141c018165f88ab953b54b6be0ff5e8e041b118c35949809c423d207384e6f597f50cff7d82671751cf3b54e3be0796278923c6d8d1eba4e4b950e3c7106a91359097e13d13466b24b2cac26e82829135ead0f70983c7cf63ae382f0a94971eee996d9d308147debbf57b36f558542e84d4d27badc70fed9810a7095bff446a1a4e400710a13e565be4285389e600f7807104585c190ee5d359568c3ac3efde2b9cea316130d7fd2a34e25a674e40c99f103052af7566843129a10c788d35a6bee5dc2bf37a31e916b3833854c501adb7e32299cd98c1d38e883dfa72b2f6c3c0b391848135358defb635fd4a7d76bd086160cd41b1db22aa773aadbda72774bdc22e5cf613dea734798773a208f51686db70b61be5625d53ad7f1c66b1dbbe7c9240b12536ff2ab91bc3515a4a33caa21e5199bcab32d795c5e9b93985bd99f1daa2c78ccbb6bc41d6a866f569bb541b8d135cd5dbaa2fc6e783b391c9a6e29"}, - {"000000000000000000000000000000000000000000000000000000000000000b", "000f72279dcb3abb7879e4072acde4a253c658f93912d41c7c01a4ad95d9bde241c14b335c9ff8bbccac05fbe515c44e2485eae2823e2eac8695a672d15dc111f6e0c1344df74ae281c3521f768bb5b2577fbcf20acccfa3e60d7cd162a6426136ef375a9f273c408e13b98f1724d3f7e7829da3d30bc6a38968e44ef4330b40b214fa06f629264526667d78c341b5f8f61c331cd35430c8e147a730fb21e2536f60f0cd5a5dbbe501e6c16b9d42bf01d5e800ecb3c09075e5ddb957180da3ce20e8977f3bec4592cc4ff65c9def5433e41f088c1568cc899eec79caf09b6af2d6118496d48cdd2c32a1db0e29b901adc92343224a18b53a5ced6d94102d9c1268e4c327d33ac41db63a5b06194a17044e30673df9965605ad2508b7e8a76ae3aef8cf7fce591255f58e294f69df994282cd86d3e2119b785e121c7a59369c54aaa477adc8697651d6c813ac841dff600c8207926c4981f1d03405fcc1c44da67e66744b4813c569f8b81504b1f40ca223ac313e8da1659f05830cc58d2b0b97617d94a5d3d6b846b3fe64d9ba4e8f3b29959c9b56d5e4e61d494079789762be21b788c8112d9a406dddabe794389194af5004b9698f7278001169933968522e2d568e07c5706101ce7558b74b781b9b5d24fdde87f7a5b458befef5b58f6a197bad9b27317e23189fb5d9fb7d2307ca32ab81f2d85e812f0fa89e711d49e866bd4682882335dc0e6a98f978ab7dd0dbf86bee4bd7bfbe89692c4dc90efe437cedf434855d085b9b0f4dd826d54f456cb0aa349873e7d234d8631cc10faa7abc6cf35a8cbc371756dbfcec0b18cadf98c5923e119cbca4bc2a3b7e6b7d955fb01668eb1b73b0aced87f59249596968e96edcaa3e95a71f944e61bb49779b99a97607b4c21905f4ad76f29a31bda5ea2457be7542557568d9d6f9995a6f0c116400897c496db996bfd015d2bfed9b51a67559373d8d33371a9e5b601fcf4571f3965fd155529aeede7c8a07f436d9c58be0307eb722b3891b845a70c174dcd23dd8ca0a5f34f1b9e0ded52c32daa005752336ba4f290c67dad7370723fe9c454471dcc36a7ba1ddc7f168cbd7aabff09c0bcefc7994f8702d36afae79df06480a8c1f491e9097d8650570f65239657934da7d5687e0d6022ee5a289ec8eaac5fbed13d2c39217fc8f034be25bae7066d5b31a614756a839ddc4cef8ae5b26c3e2842d20416dc2e5e3f9d7fc43e5e7d4f61a2c0bb0f66a07524e513f380811a6ece9de9d7a1f2532126edef15c6ed469e0158389e6cca63f0c601d6889169c3d466e585a99a826e29c84a2e599ab32b174564dc57af4c8335a3bbfc1f7f190e3fdf24441f3f04d1a6a5ee9efa0b657f0baca1a8b79a1caed4efb81cd2ca89e2246f23933a8cbd89dcb7292be303b185a7c059d7a56c0e0d9ad4367e0db240fa7f074959ca80c06f07f4723ceeb3acb69035d3ed780798906974d7d23674e3dcb1bfb7cf77c34398272fc155d863cd7a0378253db7fb5e0fbd2efb3af935d4ab951938e5960060b6ddaf80e46cf38980a3aa0ddabaaf2f1bd8b45129135418aef00fbe90c4244a75852431ae43d77a809dd92ab72c58da7b1abd5c62bc4e1199fecd351652e2ee47c71cd961d9fabf5d901cc484b309d1db8be08577c418ed4dfab334cc6b080e0910a13c7524d811d8f1cbdbe87d79fd6fa6515b1501bde57285cace81095da64c7696ee15b2b21857aeacf456dc154cd044d4dabd3e6b564fbece8c55bbbbcd1d6ba16d8b3381f661ad17e9910818ec48473b2e73b39bfb6719f905218dcb9f7968e8997c5e54bbf59831d652390d195263dff937f0a294a9f96545413d8b75916152ca996380a9301ec97c8c3608843ed12baf555df4bfe4d01"}, - {"000000000000000000000000000000000000000000000000000000000000001c", "008c21b118c4cbb1d0528338165cdfd9d3bab17cdf14bf14b8414d93710508426ec1b6e645c7cf32de5303342ee0e2cfb227ca6e68f37c5fc79a80c11e1d5c15e323053a703995a5e01257d1e948491a9af052c6038a7e7c07877b2704e7b0774e434f8a6d6e3ec012428f97e3e6b393cbbf20664681b687029833362d1804c9ab42fa0b37ffd133707f7a9939cf30a81feff31b3ea35b8a13a261d55857296af59931d812b23639033702142a9e58b9bb5e277dfcc893330a351e59dc199a9e9501189039e51b6a1e5c5d624aa2d7df1cc819832e7cc3a091ab51b744af75e6c202ebdd9ca5b871d985e6716006856fb23737f87e88ab222bbaf346052082bfc754622f101595f172b70d4f2a30dc5e0f057e07875899bcef4c1782c4dfab59d9083e7163b50ec4c9f9a692ab47d18bc314524270616c3d76cf2610ba9ff837dae6933c034153946c521bd275ff01650243df22e552a53bbed742f1585d1c08dc2e6b89df213762e62e194a3533315256c1dfa0ea9cab9b20f7196abe015b9f28ff7deefbf1d9ed40b760d51b0864431bdd889ea828bbac3128758c53af2ece1e1ea12f167e66634edbbfd9b80e41c78e3a94bf39051d859329c6ba3c4551eb8fa26a8afee2fc43cf80b75eaab02169224209093838cc17a26b177f29c59be0540b267e9a7ec662e25193d9cf991a1c6912eae4009e3efe03986d281cc63e9930d384f12cf608c2e5071e84021aef875f0892cf66b0d6b838bdda0ca6225fb712562f7d99af2e6e3145eb98b42f04753e999244919109371c967632a1b281789bba917a6b705efaa0d80cb50b1e39a8440f7cc590f842e9be411b86553d7786641e7829bd3ea1ba89f1223359547b469254e47436de273365e33f93933fb14f92f9f0b0870515ae6cefac57512693169b0b9ce72778caf5da5b17a2abde709f01d2b8654482e62c958a436c80fb5174f783887eab2572e2e96bd922475d391286141e7be5bf1bb33fb81119ed1a922d184bcb89f381c1f4f9c9bba4b2f5822e2f6d7e78ce5141e9b839ea4267695297d0ba6e6010a405e7db0c13b2cf03f3dbaa5b4f4aad143fc5813b2e376d899e1b63192ceaaf75d8b3cb1168bec95f135696c322e62a07c9e2b139be13d24f0ac49cc4b24ee21c3e70ae2039b36396335eea1e6a03125fa0540337410c1b492700d5fd053810fdda71c88ede9d1207af7e47451f2854fefb1092462bc750b99a73e79e1b1c756af3157175e15ef4f15a7b177d60bc9a24248a835d3d7526dced758549cb02d25602e8965ef1a70979a31e8589353b37f873a9a5266259c10f6f7daf1f64e1318f4bab128914b1fa553890f5cfaaf173d00d16adf00dcb0347458952b74636f9c17fe2754d6430dbbb32bd53000d067f257a594c06d2c717967d7e02db4451821e060b29204285b5272a8744b07a891e3aef04d1974f1995f6c2ba4b4fd994f69ca29e67f1062a7def51c70edcbcf53615e974ba3645559b6ca03a21ff158753df395384d598c74a4c9a89309af5b506c8b5a0db8229caf3d624957ba67bade9241765b315edbb6fe457ed33529521e4b1c1e31dc2491e05dd170c7d7d565178e7e39c51d7f14b0dfc79dd940d9e1a2724ceb6d7947f094972fc412cac5615e5d3b35206af049bd115fca9916e15c210af78fa609494e3f80dcd2ffe4a5514e5d18250fdb0d43cc77d671e0a9315f2b3ec5c943a2abb61635978d5f026eed7ddfee44c92acc4d660e589510f989538ea96fec2d2b970800d46c7651a4ad0d6b4e562c4eed566226d971ca70627e047f82b935f831382d3d97440974a66f4df52f51bf47dd53e25f0b53d524265827766d19a5e9a9eb91eeb039fb988e23a7ead242055d7dcb1706eeed6bc"}, - {"0000000000000000000000000000000000000000000000000000000000000005", "0008b49b3508f49d7672d280c575bda9c1f7ba3e9510af18dbf7477d17919b92a06f9a56d97c7d0da97e20571fe3cd59ecfbfbd8a7d96bc306aa60b1fdf34537fa15a2a91d9f511e89849df9694d36860e1aff54056d229fb91be979f6d5561d7e656a9fcc5abe94e4072f457af864f7554371f281ab5d5382a60f372b840a8c960ca1d508e3ff72568d04ddba55a88436e7372220fe996fd8c880d95fd5d5467ccd65d7d6b8fa62026a08e7f706a59fb37fa759476dae5e80427495720cfa241b130baf37c6587357b05b42cea0075554ea0cb41bca4ece396ab90de1337226aaa112fb7d1d420da1762f110aa4a0b22a51ef336304ee49bc5b32470ac00365d1320fb1a1b081da123fc45107700897a90b31c6e141191e1555c9a494cd77e8d202113a8e900de40cb2591f012974ef65eeed6383c6c9227e64e419f79a27200d5b1ec2f958faa3d6e81a5aecfe5b3c01e1786077f4c483ddec93ac272c5eb1a77298f19943fcfc2c462628d7469faa03a9deb992df493a829203495c5755b65c53be69a3c7d92763559d36da8bbb24d11f850397acefa8f852d67a1a0be92dac1d12550974d2fc315bead1c8a832baf8d6ddced13bbcb6ee0fc52b84c8505f45008d447517ab99e9d79c92e2e70af0f178f360646f2a349837cc6aca331959b8d1b51233639fcd185777b05e81c319e1c8a4d7ae6d147715482e4c5e1a04a77e7994195baec8fd95f3d4e38b205f0fb1175440479ab9863947f2d952345ff9a67a1ee1ae769dd364c99b3c94c5e5bccae759213d88c148cb6c1460a24a0530e916755158214aa2ceb606ca20b817582e4cd578e86c2530cceac1ea8bffb564ca78d097fb4fb23b1fe4e4a9cb6859c5a36d93bea0d624ba1e1bcc506fe58ab3797afb63621ad5c7bd02252548141012cec1d89be8e3283bdb5828ee96ff5cf80076a0b658b64bb5fcd9f2aee7e1382e4f14b86df900ed31c71d616823f9320116157c067c9a548dc047211f893f64195853d7a355d6e86f271dc9e5da54b43488a1d2ae1370c09f4bd55263cfca6d82db1032bb0164f27b20c336b05cdf83afccdeb7cd6fbc7d69700c20bb45b9c947c0c10e633428b67bda522e37bf2316f322fce0913fe6ad0d04d073adf18e24ee9c1dd02520e563738c0aebea04f26b732bec509d4dbabc8d0259dfbf2eabca8b5e97b11e1b0b35e6f4c499ee1d2be45542d856ce39ff454436e53fffd169bd516f5a1f20494a19c7dae8fe81b279c42b14826a3d1984432086a6fcb28b4b99f34d47f59bcc4ece5999f7d2e6029f71f8574d33b93f3613b0ded36795c5263817423771ec802d8fdd4b1c7e23ef63781f8ed3d75e781f0971e7a783caedeae0d2b556a0f321a993abfca7571a375751964e37ef4eecb3f4fa6c81ca3a051927a10343e755f10e6c6acb8db078cb9ffe6d7a8273a878146670cf5530ed33f6c623d305d5debb82959eef970559a70bbfd50ba5313600b847f64ee1887512d7d711c5b1ed916ab06d729aa3d82768a8a4fc577869f919c5faddaa5a059dae02f21330d996fa4fb8fa63ea28d755839113207bbaea85c9cceca9657fd59389f1213ea4c1248a7f5f1b5f52e5c558053a2c657d194f270806ee84d47283ef1d72a0436d6b9d503f4d41b107455c62ca9b3cb2f493540e2ef0a149a3a357474512d48a052c452b48de1fe1ccc4219cb51f30940b0f2296d9595060c07139298239bbe878208e8586bd7935e094a2082ab135ac7cdd83a7f28b37a9061f8c4e0c3be63ab3cb6a0b8956c471c6757879320a1f81cb0e41867a33ccb53477d922170f6b1e19d8b3ffdbb1133b8d0de13996d3d1f3819bc9bed78938a593d3e8228b9b9f7a49947d80e9c4f10c59593a6c543984e3"}, - {"0000000000000000000000000000000000000000000000000000000000000436", "0005f1979ef84397e453e2042a228ad0ddcabae0880f51e27d84d79209d6f3d36d77f284d57e2e1741d4019b6edc05c6ddf4ff1fe3d2883ee09ef0ffb8efc656bf3d4016e2c407ab7d05b89b3d2e6a387a78b2ab0e436efae23741d3f661570e2f6f77e28fb43d1d7113c1ba11b9262e3d997a12e0ca609f4dbfa3f8941e179c3c25a41336538a709860aa5aeee38a36fc9aaa4443168d5ed1b0bfc06da4f55e72ee632a7e3af7590617511c220cd648ade47201b53c687a1fa551031735a086fc0375a3cbdf2fd3f5c8eb6bb2cb1ade55ca072773c2e3aa78b96aa8f1bea011f70953ba1a9ce70aa69404863810d3dd86c12157ab83cd384a508ee00953f476971b98abe0ff2643ca4395a9c7f9f2d14c0f76167ee49397654986e754ef7b365e4b861c20290cd7f38f6b55430acfd8712709fd221f12da1a8df1130b9e7d0c55f37f6cc2b13abf7585e7b43ddfe93c0219c7715fdc3ebf5e97464c80cf789e1311daebae15932e24e9d6eaa7926e960ea1d6aed705d35c6c011a45f46a0390db750682b4106aadf811b3ce38b9f15d3172fec11b6ee12bc48ab8166f355b0c53197cd60c49d0742fe48f7be106238f017507fde1bcd944770f956d7cf7d5deab4896551216c12cdb51823f8fc2195fb17b51a33f151d4fe39bb7e358e67f363b1b162391e1a9438a016d2ecb33b2c5bce5a5b6659e31b508444e4b87077ebd4d0f11f8b2fe3d2dde28b02a5a27139c50654a5b67e1528350a0b9ec797d279a4ecb0f890c05c8a253a7f9cf8441f2ef5b39548b12745e3914240c28e677b5d894b8880968bbff9f69bdac700bcc4cde1204d7c6ccef422215f2a8f231099e936d242d1e9b21d05d43e72d0649c6d7b8aa0a7877703221daea4d02a0568b461942ee43da05711505be9de7285a32166ffd7bfbfd5177b0c3e0205a0974be58c7001d4a8015d04697df6356c317593422228ff1c5e40b1e67a2506b6fb5a9fb5109fa3eb9dcc3ba9c0ea30f8969c597ee7b6d8d5dc8b999df286f81175fab9f1476c7d20e0ce2e38205315560b2e39066169b57b30f92046829e0aba3bb05f1ab300e8bb892acb6fbbb24bdccc80fcc111d02759b305a6886fb233cdefb2228c04c2e97550dcd2e3172c7a7eaddf1c0435661f442904f7cb5997133ef6dea7f1f78ddff55debb8857050c8d740a5b28877290f35100cd096143292c9bea39c86bc2f5fba8f9f6d8846892402ea1649bd70b8b0f51fd5a1e07d0cf6f3eb5994f6464de8892159be31bb37254214a393b7693f5a0c65f34c6ad11f63f651117e3d0bf0f711c7e36747be6d64ed1496559082a6c050442d4ab901772ceb7e24cc2a4a6395e923b30163ececa2c959308e695d4260defabb9998f36d4431ccd8d1ea70bdcf1db9b23a0ceefc103c8a01e5d470219513cdb30b7fda48e02611be3f755877def8bfe0b3cb57b1e338395ca6620b3fbdfe3c5049b2f381f0bc8a21c2fc85de44c0bb198c01acbfd8dfa3dd63e1c9a0194984d28535232f693737e4df704045d53490eb4613af7a8d55d5284e36cef492b6a50cd7bb3b61a021cd72fccf6f331dd7319b63a8125b9fe16c68311e65fc2e48d78b08f26f69d8c5a6612a092963c263b990a3d28743b6bdb0e4b6e2d5f8297a5f2bea59e096d93023f4c322af2de73287a4f28dea6def5626c122a99ea8a53183d763d51c926ca8b74b1bb388c921ec31f62b19900878e81baaca5e3f9c3815dbfdb5a2ab18649da1b5a891d277398165d51df5cd6dcdc820ef847d5e1e0df5f8509d249505b67e0bc37f3e3a7345ece854c926fa59eb7c5493ce9146ba25ddf201811480a96ad94c28d1a69b5799577c3b16a531b73e718af3969b06dabd7c93e82f62f280741cddf7df1b5"}, - {"0000000000000000000000000000000000000000000000000000000000000012", "0079da69eca3a8e3a644948e61303a5762b03d127c373ed4630ccef73ce9d338a3effafd963538f5d91100ab56511165c673f558b1aad60e0b60872ef6435b0eb88a7073b702cdbb7e86cc85ec9172aa967b28fd00d59f7f52c86e8672a07135760e4df5284250b1841c1dfbabb61bd95b3d2192e35a57eba12bf5316e3507e362e1a52ac47b67e3b55ad5d120f630b6b59df912bc9e28cf8f6ad2ee6367e77944deea50669d642501d58ce5c487e7297a8970880514dd1028e013643c0631e10eea62ad33f892f5546dc10d8584fa59f8a6093eccc122c5e777138744695162b159fce473ff4c139d4e584f251005721e34d068e900f1a9e40fa92312206ddd34c9db14fd5967eb00d82367c56c1ee1063712c343edd99c89e830e67419bc4499aec64fc18119738d5abcad02a599ce51e6d6bf3d05938cb39be96edd0f937c39606ddbd2aa32c2dbacaf5f46feb51203f1b9b66b444383902040547094d9ed53503bb7e919b9e7521e20fa71d188b46b3047984327b6fdd7fb19598968c18677e5541bb1f3e24fcd0d4638f00ad24311231fe867922dbea084d34a4101b6e750f9127a0bf2352386cc665af9302111c55e147d6bafbc49ee3958b48d0b6dd28bba9407f85f531a5e0bf1bd05bc0dbe80b703a413639cd142a69d321b55b5d1919fbd138cef7a728acc7776915a043b55940e97939b0f840852ecf52944f792ba84d0b276873e8f11e21a4618389326350c3e3183f795b723b7d7e8ce97637e1413147c70b47888874a6649233f7cd5b361c1151867023bca7a7e87570c3bfa234539e3b7a5d650d01a4bae08f49ecdd89ce7a5a243255c6bad1a06181f5811322007357171e8cc15d8b072326ec644c6d1531cd69f0fd36e723e5e45bd240431dd05c8b384a74678e9141f4e4bd957a64c59d7cb352bf974f601f62a7b32bf007ff4bc85d8f59bd2a1610e7cbcce3162d63d36c845b3a6f0f6658cf1f5b816d466bedda1b8d056a015093a4777fb5ea0ab03cad632d1698bc65d96fd397014c48d909511fc7bf5d8a70c857b320b4f9fda86bf03accdb104147b515c1b525086abb2f19e1394669d4de72cf8be5f52ff1873551d82d0007235233c3375084fb88a53e8b607b4e56149f3903828f540b006f01fc95205118c3ca396b58507856bf6a18ec8ae7d6f00a948773751e539d19a5438f5c342025df7dbbc9212c67b182be6009ba211353b7550d15b74659c768b118a15b4d7d1da67f21872d50471b54d558cf9f3142249c79e38288db3df25b9ed42fa5acf85945da4eb0147f00a588d1c6aa717013974d51aa05bc868df3605673188034c075edc9ae426f6c38679cc24bd5e6301fedc52c5d33f238463b74fd7c1054a322c72f11302e0f0de8d7520afe484c65d40f8ab4a84d677fa5200c01ba44e8117bdf30ce4aff2336f4a199e5f6cf3306ea73233aa6a0198c5a75c766e8d76d04439c7300d2b49014f193e32e1ae6753a0e7895a253ed88ce7135f3d403894ec399e4101716be9de54a12a55d29a01dffea96101b38b7de783c0f0654f3e539afb14603fdd0d6f2a8ff9a5f220e4fa2965c4ea8a1d1f49640b239e614cb0f055cac81176bcb3adb55b2bcdbd68244ae50af0aa7f5b79429344a928cf71641c6d62e40825ac33401c8749adf850e5a5b6b17c3b2762281e218f951980d1c883e40e4712c4e5b0ba98727c655d1aed46d693087587f754dcb0c478e79b40d4dfeb1420f9f4242b960c79b707650cc6ec74ba62ea5b0e8f160a5798fbea18d7c7ca04fb8bbe78271dac5997fc320fc6335f65874ff35b9331a2def7f99744af87d343001b1d5b54e8ab538458966cc96bbb1329ff869c51dcce9781de4cb144768523c1ce94bd8203502510"}, - {"0000000000000000000000000000000000000000000000000000000000000016", "000011581d5e0a197314b23ed76975590c56d1bd6a074a30eaead093bbbfb9c552e8c7706ae11b797f1704b88b1c108e18209293b13939d46999c98cbb75a70fb43afab64af32dba76b1f1e4a2f1fd8ebc939d8204c177541aa7effbf023130758fcffcd42ec6cb00410146cfc0bd5f7b177f5874efe55285348ee7f2106381a0e566054c193510cc4219622c1913a94194abb496e2da8b694155b2b78a6719fd70581d75f73534c02d10985c6aad453b66fc2ec322e47e703fc5f1179294ba3c7b3adc1b584db32b02771e2390c9d9ebc320ea376e49c125fea9d90515959db898702c7fc463b1c8a8b44125dc867add343e7465068ad6ef82ba547078b216fbb084a6ed545a1f5cd905394b3d75f396535f1c5673530aba1db8f65fc41b4c225ef9ed77cc215f20d5dffdb429515a9d3ffdf2f2b79a8531229702e1b540d128e1861b210c42c7e58651e8ac77d4a47023fd932ff49efd67b0305318f3e526ab02a1fb5c145fce61914272983910a455b74d1fb65974e1f32860fe4b122e252a4a3674266e3ffc336c75d0e1dd3ec2c0e7e3607508b95a48e05c616d55e69f69d7a81120b20afa4994658a633e8c26da021fbb4efc2d96afb176c354fef0ea6774ff113d0c8676f55471259aa960fc26dcaaae0876b88cd342988bf49651e85bed78b171c1595ce50573fb4939c65867c5b2333a81a915b027c6aae1eaa136bcb0b93139930ea0e77019a3e56134a40e7f50a8b30e1cda8bf2ff79d6e345451fe990f02ca185296f537980064f4cdc4afb7109399466e16c795ca8c4c6743c9c2b4a644e4f025c8b21ffbae1869621af4508e1aea73023adb3abbc0aed99250f034ae3ec6d12ad617c6f678f9e2dd98d7a45dbd646718eefc8969d90dd5228b58bad9d778a2ac9c7a9f4520987e46c5a2fe5375e0f32f3d2810137223df73dd0295811c8748cc67a1a97295ef67b07d88a591754809d66f10db8afcbc79aac0eafcaa98bc5fbcdd0d7c03075f7c90367fb1db88f9d95de0f9431fe67cde1a1a5f78ea02c8a6d769e84550be4a3945c068bc4deb065790edf794fca38d88f2bc66176d2e2415baf7fe2568db4460755e17e801933e137c433726a8de632d0f07aee36f94085ad5aa53c8372cbff1fde279359e3267e5069c5c2eb53234a3b2e82992e15a452e2c7e0757f28d5b1d27535e3cf254b736a2809d4a3099060983d54a890f67969c69734aa0d637b2b44e16645815686e530686e886fea4217291a9643e31cb7c289d5d572e9fa5ae5bf7aaa2ca61a35ef6b6e9015861df09b9f96b20603c6907d145351852bd9de502577b1d24b8d2d16fd41631af65b77e1f75d14e8a823d160e23881543c46b8543868c126c22eee1da6eb9d67acc2c16352ba4ddbda3039699df9dee1b96b69afbd6b50305461ccfd7c0ebc7ffe35e169afd9f50ee1b4832122bc77456a738b3518db269d430c4da2be29d2f660d0b9202805c4c7ee53024580ff79c1d1daf0ac562145813f1a60b76d983a4e2ce6a7fa962a0e4ffa2e40385387365c52d9058028058d4411964a361f4808e0bb8c94ac3613a457a5bc0ebe32f9d20e9fbd9507313be852e989099589ccbd3956cc7909a6bd6dabec928451333d992a795efc6d8e25c59621e94b4d8af460319dd37d42b267598d620a379965076c3d35ac62433773ca08cdef207be59c7c688ce1bcacc1a18558810fa215b04509eb5dac761db8a4c3ad10beba9e39011795309ac0fc3dd417e447279e889e9eb8f5ed4400384b98b09e7c7699489747933a78de5351ffd71531422b35d92db078ff44fa7108353cbcdfa539d62b703faa4d8cc87a323164954067724ef9732bc3fa583175f9b5ab0b50119af9bd7a61847bafb03989f5529"}, - {"0000000000000000000000000000000000000000000000000000000000000004", "0051032be70cfed8bea63361ba582eff3d513f9bea66145bb17f376b15d525d86b757f04331f00bd701801e1687d2f47989b9194e04a5c571f144591e5dbe109bc4b31dbd859aad2cc59aa80ef26b3016f3e41b700ac7b49ccc485bb86d5127934e8d6e0d58b98db6e12b90b1a91e486d1c2488b740fe448ef3a3cfaa1230621a2102b4d8065cb3a128275e6c7f54b67bd600576aa2ccf7bf2f1a7b028c9fa82e7cb570ff538b019008df5759ca0d985c9a425a9315e455760e91eb9c5207ca6f5d0aa87f1dece4377e2d03948e522f9a45901aeacb71fe1f22334cc0455507270921f8cd543aa06dacae06b66210fa767b56942faf637c1083f372b0e78cb2c6ea335838c86736038a5d9d703e87b1ca61979e6d09f8ca948fa15731b879d94c5ebcb99d8df1420f92d075c36419edd530905b486550b65b572ac1a514b2568e1fa59a6b80234452cb2aa8aebdeb44e025a990e88d3dcc2a8e3603831bcd6887997709a0f3e5ced3eb7562b64fa78853c3ff8266e54a83fb4aa10509ab0a430d9a1dbe7f86aacecc39ea45d1fb4e1175026886063446dbf34352e8842343bbc83fdf4230614c1dcba86150ec9c698b0cc6af8c2ce47dc4d371aebad5bf91018b3429073c1d24727de1388b0e3ff14d36e5a741018cf9ebf015078ead152c76bf8439b4ab26607e9a5809f4c16450ae543b695a93f9af85c02efaadc59066421c682a290fd3665526acdbb0f1008a361c3d7a7fba5f94a43cde2bb5565fccaf166b91bd602ea4bda0bc8f09838334aecd38a53f7f4511a479747e30253522f59c917198a62a3feebd61f6b93050be733b20fc7bd26f2c2dab03b14d14b93907aae65184e999f99c9add99e5a4b41fe2072bed95663be2cac3f761f9a891be509aaa27f7ce36b0d81bce14243f7e5b0945ec9313160e55fcde6851f8cd49d86fb03d7de5e49949b51fc81b0719672437c39fbb2720a526fff75d2352b63d715b52bab3d7171a07b1ccd9f08dd60d33f4da5f8da6f119acb21ec8a4335bae3ae30ef9785384dc2f3024308434145475a47e7f7a3f5056e3178ceb51d33c974a439e8eb4a4b2666fcc5bb217ab511c0893d6eee0cc58e1e40ca01f49ffa726c057c71a1d0056b7a3ea380723e9c93184d7f1d1dd61f3b9de786967ce9e544a44a8ad996255b28eb99fe062f286564dd6523de0280efe38d1460f1391c1b844b49adc723263d95660c35f381613b4a051d9349f216653f29738fc1fdd1e5e3e18fa2e26e2292d908bc3caf7db2b8a348171d62e69395393c3a9263ff02de0b0ec8b619ca0bcb29c9f0f160ceb811b0288d87760da70111584b9a2e70ec73385f45a8ea1f6778a8661a6434594929240bc7cda88f1362d4de48745e325c338c1ac3bfb0a4d9dbe6b95e77e7068aca119872f803de8426fa0e5a01ccf8a1d5f6634fe9ab154e0df709f1d34d05d9f4571bb481203a34ef6db2c193fa862a05fca3afb1cfa9beda34be6abc44e32ab5db1ce133f7cf1e507134f3cc40267b7bd7d3f27529be597306a1f5772cc312e55ebd01c38810dc7c738c916e8d0b40fe6501dd8175e2cbd2709242cc80a7b934614e0e7d8c51e589ebccdf4e431b2ba57960d1206c9a311b6a4e29f71ffa133a7ee2ee2aab3da92b7d56a7c30843ae75ed5b3653bda1715b7cf648b227b1b59747320883b9e0a4f68f9b4937da73f1972ee0d7d8ac3b0cbbdcde1c45500fdee380fc9d45a042747c1988a42e8cf7646499c181af3da3a3b6ec1151912cf6cf550fab20c0fb266c09490a5506f2f80491c7c1ef63a43257e9aef0de7555ab4955f3b43046edef39dd756819a99c21df922433b11c8282de4629954f096bf4a120e3cb42556dbbc3d99ce478e95cd64ee92cf8f439"}, - {"0000000000000000000000000000000000000000000000000000000000000002", "007f06c9fd40e6ea745d12f8504d4269f7ce39aff91a88de03be12f0055c4584d3ccc8c74f0bb319f4f201adffdcb113acdf198910f360dba5c9213d37c4c119ee79a22e677737e4dfc1b5b7f3367e4c3d73502614ae659fb8c8b79ba756d839a0e847965a6d14f6362bbf64be651b29e9b71f95bfbed0f8aeb95e7f861a2e4bbbb394d9618521d9c5193b46e7ee7d0776428848253bedec148c5caec43a8924dba3ef4930db5e1f0295c46cf30b08cf999d8045654d7d8eee2818c74d0f1804338d841457fa45d1915a770005c0647b6dd316720d539cdfd771276b835d1fb9bd5329e99bb7bf4ba905ab0d6036418688e7627ace3c8b79ed5ceb611154ea1a1e890c4d3111b5b5efbd2dcd7c554fdb39405fa7c8a5d55115ce377597aade97fb564d3fe36941b18e893850c65120e1b5511cc5389dc804959206499407dcc5a46da54d82b5b268e1b33655227692cb00ef1defb633ed2fb564953a4dfeda2dd4d22eb706512c92ef851ae043eed65610c23734de828b3807f0127a04fd927d6247ef17e6cc6165edcdbb0495f1eb1e0c15b16fe86de38627a4e9dd61a811e628bb5c9b01d3cbfbe15cf90de2543171cc8e6210d2642de184137f6495d94af0796eb7485f8dc9bcb37c547d5ded0c108177d60fb06597535728565fb5ba1f6d390edd0cdaf8d231902b01427363f698d6f85a5c319857ab0c0a6d4c0a990745e52ff40b0073d6d110aaa899a30fcd4c9ecae6a6238bdca1ac11e62a50e824b5b1a32e1092fc78380103d3f4147397a4864b2657dc60b430b57458da0d7376f99cf4f5c17e686a3520f24f460d9f32a8ece4b471be1651f4ba6b2b7cb7132f3833136a16ced924e6f3e7114594c0bf3ce170539f3225175dc8e6f450856edb57f2d1ae48917e3477fc52911777069ad2e2981f9843a2ec32a05e965c797d521e02100f223a12413da5e0320fd81401808f64cb039616e2e3ed8964adf9aef2d353b76d60f1760c96df5f17479534f330cb83b74d42651b9dc54d000bb8aabe1c7b47ddcd8a80afb29737900f7aedf3990e5dfd700385683e1d8193028b8a914c6df325b2b892b74cdb107a22d01ecee813d8a4331328d29746582538618e146d51d7ffd54739cae6f351c1b75b0e748c174b203aa507eda31e720595b0f4fb27e6b697414f3f06ce061804429a99747b3e99268d51d9dc1e27897e482b21228c9fd8e72ee7f97ec73a2b7258daf31e3fefe8140b7cda1f1012df022071526e2f6c30cd06bc700e2e902bbf1e5274a72a1e738c0964acd0fd1f9aeb8507c0410f794d792d551721632bb8d38e4afc137f1d0b8bf24922dc2abba459e3cfb11ee2b5c2e50e51181621438ce2ddb619eed8c312bda500e19fa54d0999189192dea44fe48fe6121927b773f3368e5b7589f4025c4f46f8e7c015bb517505cae93305f4edf6b9ff1f298a6f7464efb94603d31ff7ea6ee6a87cfff9a40e0eaf2bf58e72d77b9f61c937e00d9109737e2b7b218cae3511576ccf8aab027d652c983d080f388795085c577dcae058c9df2060dc274b3985cab75bcd692976f4d0f0300fe7ce12ea3d2a56d1cb0887dd0d602a334f48d35849a78a12246088c02ed55749ba99a240800af023f0edb5d86a8b08f86bd7cec7521878f107ad338c0ee0025ba260111cfbcea6454b497e54f41de5d3e7992338c7ae181523d2367ee700f7fed6411e23afc40ba59f63365f628c0a712dd8dfced01c8f2ec3eb4ae795c94fcff784e8ddf439c235f07f2fc00ac866c2525ab165902957bcc56d6dce1fce950ee0380f6c86ab12e13d4dd105ef423406ea742878dbd61d46466fd8918949015343a4a71d27c179be6c706c2716c46bfe2dd6eb99a3a423c53eedf537e793c542"}, - {"0000000000000000000000000000000000000000000000000000000000000012", "001210e9cfca13c38157c0211b3ef81db65038d98016c8e3a83061c5f7cc9d7537c02eebe675bc79e4c22a0534d4a09018b79d2c63c4304b5dc7300edb7dd343c31f835ca83753ed5506a4674de55aca437aee7b01895a28c1556eb5ee94169a4f504e120cf736eb6b299e3f7f710bb31d8809f3d7b5d15e1b0119f9a6c323417ffc2d4de2fd3e9412a886f0015ab7a3fd9a7a34cc5b4886aec3a1bb6306a76cbaea4dd748729240010df3609556b26f38e75435926ba19f47969d59e72183b51801c98ecda2b803ed012af582544899fd72036503b4304dbc45092c70c5710b74df552c5d0edc40684b3be2a5daa5d1ade641efbb4a322275f1324a0bc5d4982e4ea951677365e511596a1da09fbaa4d735a76caa5ecddba19ceb04962efe9362e702f797b90bcb24fc510a8e1bd3461507e566497e1d18d6a4e9337547527f9183fbcadcd85dcec7873b50bddf14ef05d678f76051b2c37c04f095c5eb4a9036a559d620368b9a2e8415e62f479e84f54dd091e1b1399b165d1812458f5a87f003816782a551515f3cec46c8e1b139ffadf944619b3955d703e6f6b872771d7a18fa4108946b166411485aacab520b7550fc91537f92114d18ea7c18b419f4074d184687cffab87b58b91dd5110bb52540e990abe1ea2294e777d299515d911025981f64c56108abe5c1e00e32940a9c64c0f35a39f9a507e7ce16c684c4fdd344f1e13919da556596d5f9352d9445beefd70cb1b87624cc37ae359d424fef570f29554353bdb83781db17e5872ae02e5aa51ade84c1340ae3c983e311b36406170226488bf2c284ba0e6923abcb1ab9e40bf72446341d2925b5bd5717dc4c9e43645a7a789f301d25c2956c03d6a5baebc73966c53d8dcf891233d3b9efeab4674fcf106eb3bc586ba66bf2e36ed3a935354db6ca478762610ecbb797ad62022f78a172059f6b2defd1abd1b4d0c2a6229e635c023afac4c49b497b822a913ae7be04a48d3d0885e61bc8f7d7a18b071be5af9258b71a37f1a1bcce82d34195ccf15d75de63b09d073e944ec8d21b205ec90617b72197041098af0a36b49cbedfd631a03bf70dc329c9174e0d397b29d6a8268b3c5029469ed77e9d4e2205da3ff856ab2af11ee83a9d738bf6421dbc63fe691f4edeedee3bf1fe79881bc2e5fb3eda3b1cfee8065fa4fb3b6d5565ccb6b0a592ffed920ef93973a606bf2f77b8462d01379020eb8a41c0654fda1b6ab00b46d5ed54a539fb597f92eb916fffbbbf6dfe84a223275fa1fa8a8f4ca4b7d5865156c5ab68bc9fa6b00c2d1c38dc962ce4c7e062d0167836111f1449e20715344526f1d70d86ddc13772cbe4d49f34ce3d32c630154487ac65c4ebe5cb1307fd63dfd548b0971fa34f824b4065fb95e9ebf5a91efaf02a0a827bfb19b104ed76c5e107a66d42c5547ae57623e93b6ec9e47911c36e4361d8de1396a8d4aaae6e602aaf773c85470af8d43d055f0adb9e88d1a7b37e1710fd4974eca078bf9d55109ff579f77b779d453de56332fbba360f06959e4ac2e6e8abcbb81b4f12fd710b08065e1fa70d2d18f97593930ca188c16bc7f63406593a13d1a6368a44d19f9bed8ba0ecf62fa2ce6026a2475fd5413e79a798fed7a40743d59410527b062e0f83718d920aa938c2d6ca3115a6fa52de57a66825c9bd8e5dc4194b48e2f50b1069da4493ca4a3f18af5f271e82931cbb38f730113580963d06c8924552e27862d71ec432f89b17bcedf39f99f58397ae78328a7cb43893140b30c218708a21379881d400dda67181e2599bd3b8197dc7826409a93e9cf116ee5fc3609e43ce98d1b20f0ebbc10b8c7f39c58513f08dbb206b2d145a45771232a1ec86973170d16031bd0cdf9464dab3923142"}, - {"0000000000000000000000000000000000000000000000000000000000000358", "01c238139398c8a6f3e0c793c34f437a675e186ca22d0b03c6b720100fd5a2355d44b2260ec3313704a40df0b1f5f5f90c61d0c043a6027b8f664878fce82b176226af6c980ba714f5d20663492d423e7b520c99096a2def500adf1ea1321177ffff16d1acec0e63761d314d7cbb5bf934f9a011fbd9336b5d64f87269880dfa196930e419c793f4e14d641ce5e47aa3b3363c7474453d5ba292c97e12bd01446bd96bb3f5df16ac04b5a97057d346dbba00364db2bb82a6cc365d962309b53d530f0e40c1a86da26883e710eda6565aea382cfbdf84634ed9e70e38291dfd6acc2b2fb71a31054340fbdedfa2c971b74e947eb94f6e393a863556c90b3dd7024126c41140e0344bed35e2f2c49a1fc259177cebfd7966ae439deec608a037a1b5c94612946b19bcfab6f78b42451d02b63727417105e528faf6861a57434346391863f6c55242df7711f2cac2b7575b03742f93d3df08ab809311675956dbb9cedbb2fe2d069e22afcc492edb9042b14fd897a26c5c28322dc116ca454722d11279f44437c9d9585dca7a677725b32510ce39e353e88bb8f698dca46958e36ccb5c6063067fa69e0c08a04c474bf721bf690a92bd681d3ecf0dbcb1cd2d4803d4fb12d0def66f392b634d7c4498159fa7cea611c7e33871449d53e1fecb001db91e5c2fca345d7423287b928936c40058370e5073ddc2f00ee4066507f9aabdf17ab84941e369e223db91ffe36204aba7095c50f70269ca6b377384f3d3321e9d862d5839b29fa693a5d01cd2f949d7b900e7ed539e253c9d86af82f2b145f86c8550192c61f197badd3d7f0f9104288a59d7a1bdfb42bf9958579723aaf9d5ff1c2fcea21089841eb14bd52cece703c22aee7d74f60fd47dba0e9182772ebff2a39b4bc00ddeae9c0ca745ab7e8accdc32736d71859df15dec1365eb3d120603ae8e94e548b6eb9edf54496bbf5b8962e9f0497942b29fffc15afc10fe242bc5d2fd19a30d911efef606f51c31901d7b3fa3d5945630ae64c292c19676b2111a4b2280462b5d6444d299a99f105a08fb35fd900dce03cf07888b40bfcc12c31e7a9a3d24c7b9590b3408a9df714e6d63ff40235fe79ee77571f09ccd5d16557be7530a23967ae0b1e1815b0bb95c433fa9ba3368a65081e6780b6dffe95f00efa76efc4efad79e04179a11a8685097867f50794e4de82ae0d1b86cbd10e68d92e77739bdc4cb2345eb462d20dbef8d23cf26f92ac64bd1d728e3ec43cf7bdba962e4b2178062298b8fab4cd9c0c7835d774f5e59c6fb19f85f2f040a71466ff8acc403be6680ba1038cd1fe0011fbf2720c07faf4aaf06ffdf84a600003a79b668649af5a34736dd6d03592ba9aafb84bfccb51ea1cdef7a33cd550a3766c19877b140a7a66e484fb9ee72b0ddc59f055298e1adb2bfb9ed5ad2fa021a8a462e82b4bdf036b1f4211e77bb3fce70055ca3cbfb4e082e14844d4beec4b8739b66b5f4da991ae3ce754e9b4057fdcb67ab853736a4fa77b374a6ceb1504efec92236cd490b5234a3b51d813cf37f35316139a92e49961a71b63dab1a1454ddcde1f614357006e9e1cd87333c2f8c16861940c6ac36836c4ae445a3c280c60d4872d70e17bd3a9f9d996227c8bfa47c3edd136ad8475947e005bc9476f45b6ce5fb2a00bf2897c09ea9b05fcb8b12c62ab0a295e1b9b3d4a604cf42e3d58769dd7861120355bb09de7b713ab1d5fa52e0bdb77f223d96df62dc3533f0a1c5c5ae5319451ade29beb46fdce3cc0b0269690cebf00172bcc78fe8eb9856cca516c453348ebcbfce1eab279e61d54dc0ebb6968f8bfaafdd1033ec1483df6dd972a8e4c706af455144939f28072b000a400e56c1bd08fa46573ff5924dcac674d071"}, - {"0000000000000000000000000000000000000000000000000000000000000001", "006e1e15bcb15dbdc47c815d44b3bd471a90de82fc4547977b349d9537622316515c6f3b85cfe5b66ff2018178a7b3264a3959da30a953a576207a2b9392585e406edd179acc035dbd865673b74f0a0ab1b1cf5b0357854e3056ce98d48a2127a89167985b0ab3b35d461d1ae6aa276b7bb8327675f17e13d1e863b7de3c072d2ee2cf9fbb596346056359dc4c1bc74f7eb5b53fe552ec7b1001db40b7e4e27da967ce6e74db51fe06d369e5920fe77f0741c57c84f1a556b2f1da6b1e2e5ad2cacff0f059c9771591247294664c1679e90407302990e03828c7de0cf3fc89eb3cc562f4b8cfe82d8263cafdd2ba27d6f9539dfb24d9be0e543598ed0af92c6acf9a61fdc2770616003fba6b3a645d45c944dbb6c0f0612c352fee653857fd5955e67b9d4dee1055379a8e74a643f965c81278cef68e6cb19cde9b15f3369c621733e7c7f8a62951d2ecb2bd8bfa200601111f20c2cc6d5896345585ad74663d89d87a3bc4099868519a9163b4ff08b405106805337b15fc7d4e06d57f0d32cb356ffbade3d2b6b527ff6b5d3d3006392884a7f8e7b1fd6294e713ae5f3f4ab51178543506fbb74e8ca76f678f693236bd56d98a17d7ba243609e0cd82564410a2710a82d1ce4e26714270cb87c3164c4c3164699fd777a2561bda754026873c9f12144011163401ab130f63aa1465e6580c56915b9b66030191a8d78858cb152aabf091a3cadb8e41a6d43b1205ca93825010d28a9da91223564af03a8a0ed5a0ee1c428ea66bd80302e82b55b5cbb157e98c97178f5c34c8268c85d046536f6f25e68fe0d1ad9fbb78e2ce118645179113e392dc8b12bd1f181009fabf78ba471d47d15f97dd667b3d70f3cf2150f0a118e93d7425133ae222aaa0cf352219336cd460d3a4e23f98e81d1604e6c3178f4297638842acb9dfc2299b878fac3c00c307b488cb117ff24f542459ec7781948efcac4b0f083be43084f80a5855984f976a362a1babf2d7fd383f0fcdd266d247cc5917b5a565d8ba1e5a3e3afa5e236b95af5cb63f949617ce237b45ea1479fc92d2074281e58e997748fc3081166a39bba8cbcb469c57238bb4852e933c60fdd492ce9bcd525ad2a757fe9c0d45427dcb195174db8a22d41a3475c0e6770fed5f66b4541be1dd5c45cecae74f18dc54a21faa9f0a8f121a6f71ffa0a5d942ab84e1c17c89a62378d2f7002c3084ef160f1e238179840bccefee9d367e914fa81df1cfacf64ad03d946cb2b87658778192d5dae75f29a2dcf66465bf1791a9a2f6babb17d98bccbdc002133294bff267e7cf9d4198608359821f111cb9e7a9351eabe789571cf4f37b058e32bbf21db38ffe32b514756160f1d07117f13c41aa57c7af9c9a0dba072f780aade5372f0ec9bde947a68b49dc224ff19fef9b00d2b759bfc8c1dd6af283417844b46cd3043f632108330883d5b15a339aa28443f7e8f33165dcf7a5e315c7128ce530dfa9da66b1682b951e2d9ae2ad2b913de657668a5388e6fd067a80f5f35bfad2cbba27491a380227f52a77f7b78265ef8ffa2d32184251287a1de22e5282dd6967bdd5f29cff64ce15a49b5d31fc29d3dace32da8135fc35e4fe593c54d5f614fa40bc37ee9280961adb9d7032d554e1c431f337fefd1999015db3b0080eebbf6f09c68de3feb91347e4df90c927688c1cf8d411dd9664f6f21a6095160211b0fe7418456e66dff18411b02773013c6de70e9d49ba2b0d50e9b2d4a498ffff530ae64562710e869439d692bf01c55e32bbd1b930cbccc1ef38f2482d1040945a5c02609799808099ba2ae8d0e3deecc8306d1add12bb049342b4b2e720dd80a3a175d6dfbc6a6fde3ccbf6058adcc98aa165933b3d50a478709d787b1aa41a86"}, - {"0000000000000000000000000000000000000000000000000000000000000000", "001fc828b48aaf46eefee2b03a2221f8c36088737e012602db650d10db2bfe6353836642f64a42f9c08a09bfe726abed9845aa3ec160068c5c0c81dc888fe3257fe2a03ab2e949e749640a876b2e491d0930e9100e9b3ee0145e1aef3b70d25358dd20d18cdf3973973430d394336008137ce1654d76e63bc6b916fa746a1cbcd32455f6aadde935a533c2d2586f038bdfc27036275c261ae11cd17036758a3d6ebe0b54201af5da02764b28cc1b68b99fc6c248b9b0d9a1fc6357ac7c19631b8b37db0887c89e92040efb1894dac68a22a203bc97d2e7d963457b70d75ff9592e26bc503b44ce10b3c9936db61c2dc7a7f344d5de32022d6a741bda0f870918254e16b72c3f92f6fadc67599b309aedb635e8d2ad685f87ab2efe58e07d48ad47781d7bda57106166594bd9720cdab5110782eb361e2852f9c51324e4b92c6613dc3776f01412f364871d49582d352f010170275100bce051ebe323ad34feb154826ceea30b8703fe7f12f92938a0b1886598919d03ba3510b7011ea5227b66fd775ed19528cd643d5d53d91cefc0245f775af6160512c8f8843c49c83db65302fb0bb50eb88fe15453a6d4b05e21d6e33630c1ca7134ffd12ed7218b94641385d11fb541f67e04ad6aedd65ec9109515890e4dea69f6cb626d7b6017760dbb1332542355475cf1c9bb07551cbbd7e07ca357792a3fc51a0276847b23567deaf4767822c5533962da3e9889e027ab2ac93bd4e8af2172b368d7685a8aaaf0fefc340cfc09f82159dd53073c6139f5696a20afbd07686a2d9966d61dab6805d920f30492df6df386395e249d15a293c7e808e3d91034b3878e47796d2ee651f2cb1d543bd38593dc2edd4572e2f35bb1e98734f9965a2fd04b0a7896113f5ebfc3e8266abba94993752f5945e2dc2ecda79869d97934e3092a0d966f2e5de2b70049f08975480ce09358744a0a7079d1335d312b1313f0aff0599550bef2a602a37974eb2cffdc3f22b80497245da7dd4155b92cc4889b71bc8af991bf25f4109bdf28c58aec7297fb9324052f60a2049b39410b013b27e3d5c4d96c824b51c2a7c1c97276c0bc2bc622011a266756f986fe5434f75fd8b5bd85b43514800d0d7cf693d46545d29744a8fb70912da24e31928a0ea5b46d34c489ca505aa1d068cc876557acf0182400a95f542b6a0e2fd7cd913640c627f5c0931d3eab47a2bd5f18634e256867267e0adc092f0a45bf2eb506af007adc725a43df3af52039a9388b5ecc5b020a1289f7ec0c225b913d6293f47bdcfba176e476d6cf05486add3dac5a2d681261519c35cfecdd713b11be0ae60a9426e7ea059c93a23ace24da4318951cfe87065755feab3610cbc9f841812ca431aad1a87fbf971171c794bb156bad191a834b4e41476a3845d8b98802258bd0270c3aef1ac0b03fd3cb681dc64db5e14a1d643d94f0e0c00d3b9333797459e60137effa22b609c782917b2a3053865437b79c40b095f932703ce82e75b69ff094f352f0fbd34545a1839f1ca77c58a802fdcc3ffd6963fb68e7b5b524d0d80dbfbff16a070d6ba2abdc10e9095595413f92583141097c0b747d1645a54808c81fa918b9e502eed7e70d6b3dbd5627286d2e7eabcaebf57065b4c9757ec2cdf571bd19ae03255570a6d01f24d772423217a446cde30a8f4f0d04809d746aaf6b05f286e4791c6d780e482894e44e2106b28e51aad553ffc392e8eefe308e116cb700de430abceeb82a12856bea25e6d13fc51a5d81dcaf8308003105fc4ab660cebfd6e0faf749e5f213953b0b2fb9fb6f32d7adbbf97fa398c7bc7922d7843be94c09bec7c96e252147ab0bf7d9174bef339f303d0a22160bf1baf387e36f6e02c64b90d10373370bdf2870"}, - {"0000000000000000000000000000000000000000000000000000000000000003", "006d4fc54a0adf96ce1fc11c64e3de217fdf1ea7391764f4e9113675f7f5921347cdc9bcad7c08f23ac408c51171dd6e8a818c1861e4ddad260132eb1ebf872db71693311b8b2b179b44c9e5fc5abab0657cb8081330b55fc28e08e8e40cc37902d841a0e2d20987b77d9dcd50e2619ef1fd7a48b383d2ba4b5a7fdfc84b147d82b50d452ab2a2101635605561bd91649de60d154b8c9faa6341edf082019eb84a33b5f32c1fd3d5102e18ec78cad22680bb3161cbb64505b4bd355f03232f86292056f15b30c66490e9d65b823eef55ce081100fddc02364eb3fafb8351c96faf6a43903e792f187dd5c43f8db35fc5e6054dfabd8bb70adefd9c2a1305541af1d789eaff7f024d4b790c59908a32669531c8dc865b8c7876ba26349288364282de6adb4de4137e6fe3fe901b47c823c5417a6f8a96b6639b3b4a1b4a1494b6efeb79a7e773364c51832d1b90eb71a000f038439e1146d89b3740937b6a43a2af79fed63b5df0a70982ac7067d425b9c5d2d90f06eebad8e6360b0ccd9cfd1d7401e608d5a63e5fa33b08b2fca4cf3bd8dc9f56691999f43585b7a258309f2b1d7a7aab0fb186b7c0512b2eceeff7137c7c33e70a561f0dc01554de456d0647e5f7e4f5c7c450ace214101241841353fae09bc8a8f6bf6706ffc7cda431ff07b2f5d032a89b7d3f0f757d1ef779546b4e4c47821dbcd16903697889838bf8d9018f41e922286fede2ddd734aa5f7f94468bf0791dfa5656d138ebc75e5fda3bb952048255a288e67d3df49450fab20fd102f8db5a0136068e0f2b74550a72fabe6920b95b6cb30fb21b032f05ff7edf7aa1bed7919f714adce29f64e6cc7c82913d9a8785a7a25389df0ed714233ece561eec76950319ccea3f37e557df5e14854a8936c11738be9cae622e05799af097ef654c5ed72fd2d310daa94157e65a02ef45d1a248d4dbcadff4a9a23c0da166104cde9b462a656101630a714d49f4ebfa64240ad5b9dfc73240656bd34413a6a186e854f55eba59661a5cba6249699df5b4a6a0feb1acca9a3dde70804a9b129fd147098b47d871cd468f7d60d3068ab639a0ca0d54c6344d1363cf9cd3ccdd06aea77dba7e67fdf91bb777c60a940796b5d784a113ce83f74b450572306899353d1dfc037fbf606c438c84b203a2a885e9c8149d1f1705c766aa7757b6ad9d9ec455635ea929d65f507ea816fa89abb1c6809276db631de82c3c59457c5098b821ff4631cb8dc5eed7b1a32173ed1690d9925aaf51655b773db96e972d942efa7830fe8ae2e23d17d764077fedc57d591144fdc22562f8caddbab84a16b4c8126cbce87ccff940dc8c8456035468567a6a1829da14162e02724c578ccf9c66423f73756a8802fac4f13f4e820dc6771863f36324485d60cf5d7902b627a604aab5a8ddea272d97b560e43e8a24c10e339d164d0bb37d9f42903266e0cdbacc1d5d01e71eb65fd41d0eba7b7a065093b2eb7e7462bd6316c550271db1b012e9ef24905f1645f68c519325a8cb1e0e2b99fee909c847209298864aeee2a6d9c23b90e61b6b96732c6ae09b93f45e8d019e7bc749776a3cabd635dfc13d0a0d1d508a9e5725df9a92ce4a2c1f24c5eb685e2b2383c605dbeeef6dd668986fb2601bd6722d5fb9a309ff28ae86a1e969cb0a0457e73ee3b68932b71f730d1979ca6f052244b4100631db70a8ae4f3f75d7220cd3f77d9286fd83147345a9ad64e5ae4b1afe123327dcab55e3e3ef5bdcbcb291ff3c2cb2047af79697135050c2a195d8ed43c2f1c4fc51ec8cc6c390ce8f29b4b7055dd0a203ebae858f01ba71a7aed67f9e8e3b81baec9c5b1e85785968d06272443f6460bf9e5940687b90f05985dd827684fbdad90dc6e54719b678"}, - {"0000000000000000000000000000000000000000000000000000000000000001", "012230ffdf84d68f1b31a025c04f744049728b8ba401516fde3f82dcbce044a856cdfda10a6ae9b52f9801ba5562bd14a2ffda98a1fa32bc46190ec27f2b231d8487910c2a3a5f55ecb2a98a3065aa8d957e31650cca1bcbe7e29c7fe8a2838b113e8031111ced3e12261646b2844f1fef373426420377f1a70c6e1e1b8b12ddf169836134bb417c29dd71db00b6c3e3fd3cb71659f576a3e40b215c63761ae7e01545e5e112ece7031e48e9616304297c2b312884b8eae494adfe0fc41146b5b86612a4d3471104dd0afcc96643823ba6e4277932869a9e3111d95554c4d95822397f7bbef0b92c6329cbb117d0b2d17b13d08944fe6dbfef98fdb3051c286c89472e012d1d45377f7cce7a0aa0bd60c90cc95dadd38e0e2e9111c65e0973450ad8835f987507d2ee209a179f6be63de689274029c9c6d07d72390ec06489cc4d0c8375c84635c4b5062f98b5df34f501a79fad370e58c70427903e202bf1babe589df25f10ba38c7614d6867572791cff3b77a41dc553e6c7b0dc124ed151915c9ece614314f70a0ede2d678476214fad467dfd99005b3cf83fa636608bd2ee3ad80460c07cd4026a53e07b85e11a473edd81224193eb19e0f39d76aa08d21f14248b27a5971732924866b79e50e05b08f6b46a0f879a950f9a8c46681f3e6fff2fd333a3ead1ad84b89faf9845a8a583e834b315d13eb0589cb21604507b7d36f858426b1f015d01b727f9c0da77b76caf11fe3c93f675852e72a8f522a3fb3463c9b72d3179dd4113af7f73edf79d1e5fc07fc102f6c69dfda4a26713771ec66e55f6181e65572f5cae505c8630ad35908d7704ce7352dba0aa3730d1d46572220cf4a84a2ce8164e9d4bee0e2b77e2870bbe632069a17f94d8efa710246c66db7e401a7a7b0fe0dd5208645ad8b8a4431c2d403efaa6aec59dfcdff6c7f023764f5e992ae8d5ea2a19fa8a44779acbefca0de102dadbece101f81228c18c98b5189b748535d104c034b699556d0665abfcac19c8f3cfcd88d1d903e8709b9f14e8453852ae4a9c657fab42e0a690afcca8115486f664f221533326d44afba5c86a640a8d2dcb82190fb09234ffac08ba0a59064eef9517e39b27b652c3341edf4d1a09eed97f2f2ed4162fd56a2d07ee943a3e79188d90efb2928d5f3c23b954982373152e4094f142844ce5cb0b9e084109861c45eb7b8bc703d11d3be71d9ca3dbd643037cf756cdf262ecb76994c209fb9c3f72ad54f6b7463981c43fcd9177e6ff15827b5fc132d8a4885a862f2b8996f7ff0ce7a358b702112020bfd714185cff7a53171e61d4db63fdb2edb222843b07aadff81d5c0c44270eea2591e2c1e8ee02c0cf4f9936dbb3bab15d2cb62d9bd1dbbc1af819249b9d5b333db8a491bfa5662343ab2c21dd371382004bd111ea991a8958719742e49d72c913866d8372b20746c06dc1a8b03f5bea64aa9700d55d1535fe3eb0862631046a37b95b7221185e9428481060e1a35d51c2f95553f1c4ef5e8c64828fd6bb32675151cb8d506c2bda5f85512cb3c17c509f22b3f0d7b7454b1405ac6fed39f19d109c3ed3905b1de4b070fc61cda3011d2bf4ac85564b75836741ba4d453cb368ddfee0413311d47dd0ab204c9ccf1c84fae633cce7571954a0d1742d65d0706758cb5215023bd815535a63416f61044876adccee5a68b8b817348dd85016326be09ca114a739b7f5da90f1da2d121dcae5d205d7ccb268713ec5d456d125c97df0802f3f746278530e7cdd489126b825e8f8b72b13211f37ed2a48145047c8d00d621a2bcebaf61b0397d49c49c742f8976c98cffe5101d7fa3da662eef01f47a25fd4d495946e71857f9a32e3247019450f99d9f9074662472ddcbf10e5fd98a"}, - {"0000000000000000000000000000000000000000000000000000000000000003", "002a1775ce594566fc7c63c3862029fa4406954e2e07976c812720045f0822e22da9ddcb3d9ff6b8bee90962eec23418527f1386417302fd5fd22841fb69804e9203c047269397b828a5a85447b4adcac114019c06094cd24798fdfd2cb0d1a5c4454ac798d97e64542b1cc1956c1286eb6c30e5db54dcae997c2e31eda0089c1432fc0a650aa78b5130ed4c56fe685c38dc105c1634e97be38319841a18b60ee8c36b2487dd2d960e057c14d3d285c1fdff40e592f00078a1b20dfe13537215221f9e94c5fec3fb9be6f99ce325817bff432876ea860e8c72c90779d3d681694e157a4830b83e2bfc84babf9d2d4541a655206c2ad7c5b183de818e10280a63394b0805fc7f92305051e03179ad1d8c085a4686fc335ae455eb526c41ad739233af6f3f05531c65a1c5676cdff3b492c3d5efae19bdd10b5b772d1fc00a9230486235be4233bfa44cfedef6b97b8c8900648c29f48792dbd8c5f2bb66f980d191879eed15186ec275998ec66b8ebda3460352105926e6d5c8fd0efeeeefdc151335b7881835b9d706de21fe599a7a29ca7ec61faf2f81b314a7234ed3d335e9f2d534b40272be855ac34aba6d2d2a9c2861643f8c885e0f912573e4c45153156b948575bf4eff497970554f3ae23005039003bd89ddfda584dacf2e0d824c1c542a42318762c29d0dc982b8c425e952f73fa9837353bf5e081542a0571e082524ccd2f65550b9e5ca063dd5d039daaa2e86b7e035d501247210eb4ce1835e3c06461a95b40c8198ca22c8539c0d736fd76b6ad17d8ac21f1bd29d14d49f0ce07e42d7cd1a7b61239013a3c309e8a7e6aced2341be6c9b38e95a094b509e7ac2902630f299742c06b3d0a21598c0f009168ef6da5fe13ca40f58b75b4db95330b7ae0e7c149705acf925ef3ce1bd7840ad3241f8cd171d2bd1f7065b4d9af52801d8cbc1535f8c6b8f57516d30e4466136d0b9b94126012638668afd22d303a5bdc6d269b6a5771928a602552d27f0c3aff0c68c51e5b4d29f9b40ab7a81db12125f1459d7c1cfffaad46eb0a3fb99dac9fd85dc16f69df8a3ccd04fe0c9340a15ae98b12cb432281e1dfdca29871275acddd9727690a24a1ce81fb29c821c0ab2dd37335949c462053355b6a496f19ffd423439023f3a37129e053b52f5543bae88a25ba19707e504c27ff17c9d512f560b9202dcfc7f3c85475c74e80507589adb7a05abd428f15981c7c1c724a55c0d2121ae0c75aa4c03e0b27818bf4c479052e5609f19743de0675816d6d167cdbb65df7c628f5a1aceff41a2051b3cd2a91674854730a1667e5127d9718dda64354c961e887fd32fe36c6ca7efc0e6c412120b73478c1c832ea00b2db109b22da4b18928a307177a3eaec16201c398a6374583d98d09a0846ff472b333db5bb10274ff77d3b4b275ef5861e9a31c8d74ca4e2ab2b7027568a95d9679233ee6d4fc53536636f449daead206f286a103475d9178b3f34bcdca3b4dccec1726a71c721ad4138f872ab9020356b4ba413df93f9978021189c0d8adcbbc40fd7a75a849532fe1d3457337bc37040e1e6416825b7567c40ab24d7e919f9e78da8f1b89434c299db6fb32ca827f081c8708b5e23ed337217b1a270588bc0f3f71924c29ccb75cbc3fc8c80303161ffc84c4bbf8b58080831030211c6c74375a262b8062b53ad225cfc071d58d94b6bce71021dbe52d13f87d95609a6993b03c028a73a4f41a5348770997165f84e3bca930cd9f132406dd66fb66c1255855fe0c62dbd62e5804fd7ad6b3ee474e5c198cb370b482745acccddba1d9a3bfed4828bbfe2b8f672ebf78db0efcac51e813dcedbdd1e1de854f514df8c25f5dc71d15021a74e6b9537c09b3f9b561ef19a7d37df9e3"}, - {"0000000000000000000000000000000000000000000000000000000000000403", "0037d3d925920a7bb424b0c80b94bda2acb6fa61811ab235f33ad0e2738a9b635a1fc8f51dba091de56009f231c1c7c47fb0a285973f06ef78d282dafb71281f065fb1756c9129a3da73aa224c062936fc96a46105228b6e56e3b785f7b0a8996e5f435a45a17bf24d31c394cededd00fb2254969f39cb80a9ad291148aa136d0969506c4febeb5ed446a161b87949a32b37981df661592366d6a7f99792ba8656dfd1ccd10fa94000aaf4af0a5713b9cafeb6a66175afe271d3f88200146921658717418ef5cfc80f7ffb9003833adedaa80595f99c9008765a55e0831db26538413491d1f0d6081a3bd74ad5cf59421280b883b24acde924d40fec0736692e4c841513b3553b029569100753e5ff55f82a8aae42a38e177ec14d42eab14a0050d99f1ed1ca195da9b8909bdd47d40d12923540144e86d59f423c1fbb33244cdef909720cd5b872753a2b1e4f1c60ff0307a187e9879098e5b2573938c57a97cad27f8378083f8b112df08101c184bcb619f1e5d739899d50b51964efeaf26174e9c9edd5e0e9e9da91f651d0032331bd9e3ceea89d4f5733c5d8754224299ccf35a0781633a2467e876f468bba69083fe95276e210de6fb15f6e73c515b278a5c0d9469ee1c820b5d2711e8ba31a9b27e5241a283d468af873f0564d32d3d59bb4194349728fbaf12b4fd1f67781d74f05eaeda4ffd4d60943f4060b02d6faecf8b4ec41d62c9b2a19bcd80d0daaa21e5c5d586bfd9c35115cc4960698af774d550abea1f5ea4bcbbf0e8cc27a7227d5e18694b7bd95155965551f1ef25fb393d4becdd6313a7dcfb686980bdd1c4d8dda32338f6ad47ea2448322193eb25f6611a09d6f9868f9cd8c85a4f87d3fd98b49753fda4d138a4c81c6d90d731b0fa17ab049a3b70745bcf7b4287a83c592daa2bfe714059ba3c6a4bf0d6378f3b7012a85bbdc8df0f535fcb498a76c9c594a599935d82f665b7a8635de9df314d48f0e68be267ff995b22211bbf107db3614cbd8eed1e6ac99f0e900fcfc1c4b325b12e43ab7edb3e361b397f52298f24b1c361a9e03e9cfc99681d9e03dcb408067bb35f87935d4201f186836d9044d977d10dc7863297b95d273487f286209090569819825f8d099a392ce75cc2261809a838b11a1fde4ef958a89c586113b3bb78fd2c3ea1e581701ee335d045745fba4bab5d0594d3ce72ddcbeb48404a495c0e1497bbfd3dd38f716cc7602cdc79861bd167305f9db8c552c9fcd6571b435add986ef1b034939006c69f2e51ec96d68159019ac90ba84fcd8b5e9060afc88a948cacdd26b8a416ae21d03b6bb1feaaf15975532514c53ac7ee99193b89dd0f1082813fa5c0eaddac6fc49e492cef823b67eccad7dd78911380725ce8690f159cb1f205d781c1579409721959a297a0263a5ab647231d3beef42e5947b4fccda97da82f92d839d27dfda132d42b44342c535fdaa59f13ef8130b17cdf6c1333e17ba5c949ad1f6fba777c27d237a47dabce40f6a4a2b9f1d45d3b3e3ba43a8bf5dbb360bcbf7d013541a6ae713818fee49b665cb0432448917fb6ea2f0500c7a80d6622d76bddbda3129d3d4080ce0def2290b90e480c621f816def77184f8bd016022749d9ed512bc015a6c429f8d3a39ab618bdc1ac2053ad996ea098fd6d24fe2d3ff256a7181cada84cf14fe5ec8dce6f27bfcd0f739bb77700311515d26c40daffacd4338bfffff55e51641397b49831e90ef772c0fdd49c14e3894cd5b566fc6cab2aea3adbaecd3078dac3ba883069edcc401b461e0e7f60816fd34a22a1e8752b1cafce7dba3b37fbde24b7da1bd51633a0d66a903005cea113985f48181d3958e4855d4834b4f5125b33857822b73cfc908c356e05e61151aafd2"}, - {"0000000000000000000000000000000000000000000000000000000000000003", "0066f07022cd4b851d91a1b28726eccb69ea7eee710331ccabe9e134851a95c512d0bc98c6bab45e4ac90ffe5c8f2408f463de3b24398f27755e51a5b8bdb63801dbf777dc24a19be33777c8fba7da22239f991f0448c867bb5bc6e943f2813c832577d6cfdfb7402b097b3b2b21d62ef9cf94f25aa2a0dfad983f722daf09c412ec301f9785e716d335c4edd79a5672d66c2855d574b11b5ae5bd5b4e368a06c79d4636175b096903a509dedc0f28cf6c779a5597ee87eaff5f5a17990a05b310109bdf6fcc0ac220d5654f2cb3344842890908c34c090a56bcad0860936e22423c2a085585a31cf0154dca18af4344733a3b3eedd8cad5ce58de5506b9a99a698cbb8b212b70eefc23945ca01647d5d0277d599a95aa7e4b77354640e238dcfe1a19dd25552ab531f7c10d2ddd317485258f70e54e13c3b91c5a301fbf3b574f5151808f1478016d61c5a2522de0e1023f145e00c6cabe472c7398dbf952d32f7e9e2fd00520ee95852840d1c82255cdc64cd01ab2bf1fc2850ff2cb1d53b1a313a5d554b1d7725ccd2ce91daff438112bebb41f25319aee94c0d8412f4dcb2239776c063f65bb5544d694aec9c0cc39195a3d67e0de786a10f6690602a15c611a008509a3b58e91674ddd23df0d5023033f5a353be7f5635e40c236fe818195c8e63544ca845f1f708d083205365539fccec1431c349802d8255fcdec0c2d7a9b106a4f7b23e228aa5b04c509a6a676dd0b3a549ce65635bcc89d7f66ac9d3fd81137ba333673350dc2ba984fb649b8e3a26b3d18f241e4a7f4e0a8ac8bb6500a28ddfb51e2cc453a283e085d1cd57f4dee72c1a9b2335b747d6135137505f60d0aece7a6debbdb3b4632471528cf591036161a741cd403a7614c2178d140f7e9ec49ef86b09c36ce52511f26b3e898a6caf4e6561c91ee2e86e933bfdb6001433d2d7411358fa466e464a63c4baee734795f535694eadd5de944b59651272d5ac044ab2eb03c18971d452fa10fd318ef2f9e2519b8bbc5fd977a762bb32ad1b5b5f1729f1bf7d96488184b4025a26833d7630484a34886c857d8866e608a4b07d47d29c4f82e251aef12f5638982554c3a87b04974e972be687e0de810abffcd190a1d855a04b11225f3db9c64bcca081b369253bd7ba388eb8abd7736f73faca69f4ad65a57054ca733a845981b30ff4176bd363d92d6e7fda7d617b4f77f72656283745e1b5025690633128bfa6456079d65bb1291e2f1c2d4246a11523b223b2198ec401abe7cb6f00e42d13bd6221b6312d455672015239c0b6c1d91e0e34795ba30a2a69bb3f58a267ed69d7f1222f62f7bd8e02d6eced1e6e7f89faa295eb83ca81028194563999e58cdfe39342e70895b8e47dc9f9312edd0a8f8988d33bc2e11345c9f46d507e73dc6bb04b9e33ad012403752b0149ec4ffdf02ca7f365ca238bc8ccfa0a14ac96d2dd7713c3e17d600665ab6b9165758f86baee113b43b15598aaf4fc1ea0897360233b82d804091bb0fafa6c8ea0a5c0deec9757beb321e29cca7911006a33d2f462420db5b968b14d6aba9281a56052ccd7a606c2c4975fa639deb136f59bde51f0e4dcf4510e5c6f03238bfc4fb082700537ed68a28645cccc828e79d7f1b835d8324bc92dab9fda587059e55fcb6888bf2c7fc34e215d98922a7e3bb301a10a568b4f60c322196a6847a212cf275716afe3fce196f616b7a896374d0f11271014dddad9bd95ac59537dba2f4e93e7c3ff553068ca4d0eb61c394cfaf790d4690dadf8eb6d737e95390e34f83e8e989779adf35d66d9654b70131bf03c7587b573cbe4cab79dce62563467161d406730b7d7308cfe88d298575fdbe4044dd936aca1d11496fb2150db476093146ae4a4a6f"}, - {"0000000000000000000000000000000000000000000000000000000000000016", "0012abbb486c2095622f0530c5419392f1a07d1a3c037ab4440cd0214104d002d69da5fb6b27e49dd3a5084cfc25520423f4bb057791ca63619e24dabf439038c44f4d26f194b3f26816a0d7ff519e18ddd78cab23e574a967dbf07bbd29129a21698af930d11a84f62c7fca5755924e69509b134e9347ecddaf5698179f3033cdc73dd7d819fee3940cb2d2716951225f7a763b198c89b855a8d8b8c3b66515c5e5b2225c5e1e7701298f70550fbc448f6035efc772e1eb34353b0dd308e87968d7b146519c6332dc6cb7b8268d8c7956ed0526ab53e6919637d0c7c2445ffdf1be41ebd52bdb0aab4422131d20139a55a2d857f547ae931fdfd5bd0ff2393a400afab482f0f5d2a4720df9be24793e382194deab364a008db6e7e2be6af02dacd59a0a8b4d1464faeee212ad26f4de44b329d8ee0e3edd764552304b061d5ee6fee1727c265f1b4801bba39a5e571e023f098d344642d90bdeb18172e7ccede4b090d377317857126455ac2909eeb68940b50411bf5292f5031cdd86213ad48815cb1fd9ab78ea7b6f1579fe12a12bfc65de8fad90539b942539d0499a0152e56aba35039fde89b1a266652cbab6e2fccd87ead3f7194acb0946433716d3a2c4aa4cb15893b44898696487caab06eaf09db1a7329368c4f2a2854c7a24efb3ac9e6f173a839846928cece2c0a86ab8c45332adf897a838156ca77c7ad288356489e3a1975311e9508b1cbb9a187cc6db48547d99c84cb450e5ba645e9e85fd77ff3b72fb47416053e1a0d7ca0e45e79c929cc43fc3ee435b04492f69e4cd87c4864deeba76a1d5b0b7a666249b5342d74ac0767a94a8109af3674e39641accaa461cb5443be63d45552e36c5843e909dc7bc138e64387d7f1d80519175534b6547d7d212b2c2daf802b548c57384c9f1f3f7c607c6c632dde02b384fff9fae0112877b451ad43bab1438cdb2f7b3ce77bf3a26dc13a804a4495dc113b88f3155402397a0a03937c02e0e299dca552f6551df76817d0aecf95ce702d06f191dedfeec198990f85b25c646d648b48d95f30fbf80012e3974dac413b17556525ec919af6d1f9430c7c42a820b50f3cd909b242efa2e6e5a944ad76b1e5433171525885a53f164b6a3e380ca2bceb374f01fa1933ada6346dd74ae53fc5c764ff7781a567547d9a6600ed6d7801d94da713226230d47df06c5752a57cfc0221e0c4b3009514f5d2c4252adf3e2399bbbd822b92b467c7a6ca2e8a1986d33bceb7c1fed1203316948502487b4bcd96d090b0ea7711ee14eb64ae37a18cc14177aad4bda9ecbc5bd823b5a145ebd3cde9065f32dbb4414e3b24275d20e4529c8ac061e73d1d3feee18a612e2f8c6772c56af51e125b8935cdf72b6fd87281ecaccc42dce5bbe989905de557e039b333d69ea0180e6a6e3482bec7074511c11291610bd0ff8435a1e8b47a0858b79133776b3b333b255bb34ca5aaad20b5bdcc3878329af57ba581265c70bbe30297879ae36ec965e76504c18b94e665eaec443c209d0319d96099423f284a3c5fdc74ee1169fead76b2ecf5b6f9210900a888859236598eb54aae75165fddf411985610b420ddd9ac51be3455dd460f8cd56bde7ba4fb6c02683c703ea21b451794b747be67b266a0faf5fb7b702efc30d9304e1e5bb9a01582349d54916e24e1efe0b048f98f3cb6b08f676d0b668abba38413ff5db6b272435680a95d567241454dae7bde15ad40f7c92d235605c5a2c5b56b16b25c7b6a2599e3685ac94c8b5036718b4875361f32a7a504ffd87ad32f9189e1eb82975baa8d0d2daf92458182748574f2770cd9d1c9505b3095225824c06d1054817724e50ce400d5457a343285eced8782b21d85716affdbc326224ecff3150"}, - {"0000000000000000000000000000000000000000000000000000000000000003", "00027229c452938ea70bf42bfb67ac95cd6d1d00fd2e206e5d4698d08be38733fa6d5fcec27716f4a77b049b93154f9b2e11ae08a069cccdf6b453437fb7d010f1a1f32b5b7b0daaceb194615622f5692eacc377082eaf3706c3ea6b2f79e2d812c1ffdd28b490afbc149b52f0006185c3624535ca4e6778e2781997993e32e38bf1e87401c3e142560218554d1e658038f09254239b3e012e9f538380b6c05fe868d34a2d1fb0eb0c4b399d823a9c9de897e7c0cf6b1a7ead90bc50dd1c02474ef3cc166303e1924df7d29c7e2089d6b6723a75745b61a63a9f821c87567970c76a3c1edf320b469097e8945b92377d74d5b99b7587bd858b6eea321082e6787255ecedbb9bb18f31e92e4928dabf60291c2758e8fbe57f19b08103c3156672a5701b0f3e5c4b07fb33bd2571a376d4cc32b7fcb0cba09dffce726cc6f42d3922018f38fe47f0e44f41870f879dd4fc013980d1fe97b9e3a3437337fae41b20eafd5cc4a6116499cb104461eff772a70f1f79077a4810d55a06044200e8f2e233a357ab90d4e76892111130910c3b29745ae6081ae10727a634826ff6897f0055bd7a71050a6d26a141a3f27659b389d3b714a5dda61b76e0066a9b30be5deb1f1e3e16b656d4b83ebcc0bb165807e113bfd3ab9e21b0f772e52321109d49ac92a33410d835807a879630ec1d61769ac04a620de8bf42ad043d6bac5004214a90a181ac77c838f6a318d69ecc18fbc63961d40502d2bdb33370e98fa58557ed8e8d086a1771931eacd7e71672078ac4ada9870b9246e05826b30e7057a749398468e1166d5c8f3efa5c2bc608143a790f035d5984d6a25045eb1c4a07cd3daff44760c6c74418777b4038148d143fb1a5c4b011919513a14ea9aca46213e58be28eb3e8ee756babdb3cbc15432fe28aa678c1e68773667643cfd11268dc7eb10078842afadeeb5f72dce239b85d7bdd51fbb805211c6bb66b902763d353aab353989ca19a268c34436e031018da9469d669c87d845c51d40d6965111018382e00ddacd21cf0a56a21233fd0a033a9998d74b2760def9ea4f64a6f11d4831474ba62d5e1b03e75fe3523517a09e6b339cdeaa513a040f6a6f302a4d8c94d12d703d39e8e1201295884d4d7e8a78e0c6b33f08d1dc386f07a0e5351c40a431efea3c37518b038ab1801b5d121ecd1967e9df732dc27d02a78bc7b1fa51d2d759b2261d15868998244b02f3a449252b6d51f5a133b10b33651f46bb405ca1c25f8a1e7a5a45fe13517b8fe759e18505b926e55b7f5626122ae16beed8e0801d8df9b9f0d09853d60cbdee2b549bb221a7b251f66bd80f2ea84c175bda85b9867737acc171f4b3b0c47be34cc636da5a50e63965ca63145ef4b332a95463752beba55f98f1bef570ee1e0fc7e9eb0b8866e00989904bb0c20ed1614006948ade62d302aadc9e40830519cb3176cc1fc0080cce1fdbca9d655323cc41f7c47d3ec0e35cbf77998debfc7c6be776955b28e2c29d4f1352387e13cb5e84347ecb8beebdf982b7a07adbcbe630805174414db766065034f1571dc78ca1f19bfeb7e1d2cff7cf022300e95ab31f200d642b20d2e12d7d7fde863f878f19b5f7182e0e6d73e14740e9f1151e7c4600486602595f9fc4689e76532695b017e707149e4ed0b6a7cc665db42644dac1a7d28ed0a26bc2dee4af88ea5fcc37aedb3872ec5a8bab9dd0f0e851ca185e39eadc977d0444e27b2f0aafae44f5d56f42b17bafe21ead48a80d5628263985fbd679606263ddcab8721c98114172dc4edbf1e80383c72a810ffad98a91dc183f1ece3aeb3b5fc01a38fd0bd3213fad3e2ed075d52eb2ee8fa774e91027d605a055c1f4831659a92f54716c5e292b5e5831672c8b8afc3"}, - {"0000000000000000000000000000000000000000000000000000000000000007", "003b58a789a43e9b6b98f2155f4659953c81555d9e1b93f33dd8487c55fbe9f93f3c6f6732cf0758066715473740121bcbb31d2673de9adb3e25884f2e9f071b1d2556ebd5cdcd3a0b1770fd43ae56aef457dfce041e7a36e8d11121f2c800b359c0de6577908e5aad330399edc6a8642f64f3c554b2ab0a3d83c3daebe10a842feafbc5a18f36f250de47d60f1f866dbf92e21b568d90c6c9efec7009aa84835a4616b4c43fb77d0108b19cb3c3c5e776645334c9c3100d91cc9aa6280c862c09b316f38f2486e70ac9f4f341cf5f31bfed0777a1d4f2205c9d848c68282e5b0d0f3752fd1cbc136d8d7357081d7b093d659291f9ca89986a920cab01f928bcfa86eb7f28f65450aafc77052a225964af0e964f018eaadb93d477b59d3dd685919979b4be860cece9754fd961e9689a92f0dad3ee760bc99aaa6d284792c57e54c88151da3615704002b73298de031e00b9ee4659512cdea39821bf28b71f9e618db3365310e81091835ad19d5e6c95289d4ed9ce4bbc39a03925e1c957ad21b2d9357c05059feea319b365ae9068502f5b9885d7e1476aa41884dc521eda99793e034a0d608459c9a6e665ac7bc53d39e006c5c2a7d0a5ee24bd616c815f3941b8a0256a6ec9d72676fbdf140219480aa6dd866b51397493d1e6a2d60d3d5b789e671ac394f985620c0168b824364278033a1e829b7ad7065eb8f10b033150a437f48b22634ae2900ab4a45d190938e615d95e6fd733b5c1ed44d2afdb2a3f6f0a198cae5ca6a600fb418ee30e92f1139d0cae3e1d5f31338c84ad1bd72b09dd63c3661f023d757cccfb81073b6a129f079d17dad8211f552387fe5f1bfa47160a2d83c310697c795be047254944727a338f96c6a01163fd7b5ce45f53261114abca4547958776d8eeed39401ccfd55171aa93f2d4832b6389a70c939eafa40125367d8052e671857e82656a5716de77d39cb9703bdcc31eca5d43fba1835749e2f95843312a1bd07a02808d25b24ecfedf6d88070f68638da4432178170587975cb122138d3b42be9a154530cd37ed89f65fe109fb8f44f8fb9e32bfe820a8c267378cd593b2517224c16b7a1c9b24c880043e3d75debfedef47e3d9c15161cceb54d7eb0767db29b276a393798b77d970b7275877989a0a1d90f43675e017fb4171e94fc59a408845cedb8156eff8bd7a27b85e3230531eeebf7242a045df482253105d95183d4ee67636142423ab85e15f085ff115a10cd9df82231c123ceecd49977e3c12911cd1cc5a2700380e5556729f0d0f2dc2efb8078120ab48dd91c9204f0da71a9622bf0f9c968ce8a7473725bfee73a4a61dad649740077cb46afedf7cc021244e165a40fd370eaef121b9c1800acdf26fbd11133415ff15e52d50cee1d55bc6dd84cd5888b5cae770359f3c8dd5214b2ae42737eb4d6f925010ccc6b1d12e8dac86b691fb5d3afb516f6cbdaa1efff12aef0189e7a4f1b5fa0bd8e73d281d01aaa9d6abb2ef8ec93468d121b653d9996403a7c04f43b5f7950fbebde0dfee5de50cfbbf5fc6064bf1ffeba8de2fef7a3d734b21277bed7bc91f0f625c740d058d6a59cbaee4019e67b69351f332bd2c0f5a88577b5c589594efbe1211b6e0b5dd3225ac87d42f9c73542a20a66bad5800414f86a4408c73b9d24a209dac245d971483f9f242ae6fbf7ba75db83f95ae363192f91fa0f9dd9ef420dbd7b9d01e3040f86272279a9f1e7c70b1f7cc1592cfe9ca8dcb5a7edea3d6618e4384c99c64f3c66d807354e42a778e777cffd30e26abd99e0e7e1b3ea410bbc5c604bd7aad31ee94275c7cba742d7cbdea8b213177350965602ef06d30153b7d9de2924d93086a72a0eee4c26e7bb4d9a1b72e47af0d694dd000b4e38"}, - {"000000000000000000000000000000000000000000000000000000000000000d", "001d3a5e7d663d53a3234107da4892c638e5d5310d03647e6b65b127b1c818b2ee605aa1369a9dbc57130c7e464079ddde53f199c52ef3edf3b15233f65cef12ac3b49fddaaffdc70a5222175f5e6d814b9d04ed0194747430122a137e0a91048e5a2e69480b91a8c20b181dc853868b3c8240233121cf11a9a4151343f10bb4d3e7890d9a6f5b5cc2c66bad89fb0fa6fc865e22ab04ebc80d96efbd4b124ea97539ddf2b5d5572501833238f2e06f6d960ff0d6c4f3aa3a0dccbf94100e13c48797954883d651453b835701eaada9d848cb0bbfcd7fa8103eb5a174913bc06b36958db9f64dec1d2a77cb89dbbb49724d9578df34e306e069bd2926022bb3386f255b45f0c1d4640a785225445b188af30806023c19cd06ab225811993829b668979747180c07b3611db48e4679a36011592ea328b4c720dedcf12f669f5cd95170f2b01673f8b6599fb51921d05bfa01aba1270fdc426d87e955034ecb77ca9bbc358bcf11fd26d317aa8787cf98067ba9f9430616bedea8df0832a654839827632378116722b6d578fd2f4c661c13727da103519fe5903b4414ddfa61adbfc3d63df107fa2dbbf094a382fee5f428976ca735a275ddc6373496b3b4345772b0d345e40af1ddb22e78f2fab84e0f7a230d5d5de452f60e21fe5ded0c6a61d37ad9861603ae291a177c1f02a184a2cb29cf3734325c0ab606d01ec2e83a7945f9d0d72daf7c1dc31105fc12d17abb347c10a939b3df7539ae6d55853e88723d4c7607b1c8f82fca9336f6dda8ad60f7c43f87ff9c86f53b0ec326459de63feb95ba3e41611fa31b20db56ef0bdda6163f39125bfb11b3baa95090b788639edc0011c75f34364958a0dc24547ddf62ce1b704c3c758a3044c5ebf51d194990c4835598794ca1be5b96cbce32f59e245d22cd59e723c54416c75515fd1e5587450031c008d044b236ed73208022f3cac590bc310e9c0a170431ebeeeaa1b9a012f27f226072a0b4dc47ff29c75deee315d1af76e34a053e78dcced8b0b7df192c6249d76ecbd147aab54656a2e28842d0b65dd00906c33fb7a463d2b1c06fd564853fd4d28821d6cc8b2132a9f69a6c84276f8b62dd141f3672f2ed389409104236e8384eb9d34379e366bec2353a3e07f22f15154692f4d2221e33cf2e6b8ce76a1f6aeb177ee8d50b6d7e3ef9db45d595e054eee2350de7b4fabe54a9178a62216720fb814ea686753bb6ecd6f2739a9d22134c6f17315b11bf2242332d02409e0a7a877f82c24e5d5485dc6c4b9fe5aca85942cfd13b266079a21e0e96e7beab135e7b58e06484e9369d9923c16ad6bc252bbc0c94de7a7ff1b5b42768b440320153114ce2178f00ca7fe20b09f545ac35dcf9d99f36347a0cd520b03e632f16a34d8405251cebcb7846475db7343f00cf75fb9b0f981ae8f4302aab1b07aa00929ed525032fb760724c0f53889413ce633a811d3379bc72df05fc9e1b9fc20c9947c510e28d1c32287553e73e001c42cd3f56a4e43943ef13842d600523c8ff3fbb290292e672471ed8a1cd1c9196c92a2e1307cc79b4372c0897c2c5a057b914d2437dc0b837b13ce598575508525db5b9451ebd486241ed47b1d2eedef2b7893b65b21690cf2791a1502b1a56f0e20e331a9cfc8dee085c21456d4e67ae85b12126f43b5e4081eaee897c0faa449ee36408ff279024fde1d8bb89cb05f67aef35157c5d9396606eb30ed63df677450634c19a970257e1151ad2ef1a17bc8c46cf575e21ee219f5883c50e444e06ade9d5399c95a3efb124c6da002ed608ec3c4d53dc1e611517885c059195cf84c31eb21de5001fc17728e0a8b0bfbe2eb8f514ebf3d29ce256dd4939339c7a14a644e5c0caa4445adc54211fa4ca2789"}, - {"00000000000000000000000000000000000000000000000000000000000003f1", "002d56c2e04ab1885ef230446aa853491c0af04f1b4d54bfcb7b5ec65796b9f7dbf9de5e06d9c5775988105991f35827dc65b8a673cdb56a2f1a0a36f5c82a2bd4726d6294613b4f5ba335162cc3470bab9ae5280082636f3fe2de79e2d1f5bd3ded7cd630b572813e43647aab7d51bd9da4cb4579b6d8d3e3099d5e8248211d46b0dc158028c5da1347d1307ff68a6657e67a313f1341725da4011ee1774919fcc13e1a3a7e995201a09f0ddfc6ce5bdcf9e4fe9c28ac3a0527358e391a6d020e4b12a6fdf3bba524005bc7be7ab638f50e01f5e79903c122b76123f48c9c4339c934dc9ca02a49e50293311f3c4734bd696fc56ad9ead62bfc2b05051261997e535f2759c242d09ac66f1943029f1e0f1d604f39340c6a69bef18998d3f18a978b581f0f460c53dfd732c92f5f204fd34c23aad653c601bf8def15b09b95f4df7971997b495c0bf7d4dae13c19bae0038539267c934679889c77844ed2b6aaefbb7dcb3c2183ca521d22c319d675a4d7f6e821b9bcc9745bdb11f6d154ae1089bdee6173c1ebf69dfcf8894ca4433586342e47aebdafa26af3e0e069450b24855cb3470aa7db853a257fdb6034c15e87b77e84e3f5690a7720f09740d7adfd65750a53635f5f6f70ed64b411380d9d2feb241724d312b0313514acbd394930f5dce11661de2c31995b4b6c5962e2f8a574d6e2c83dcb17057a4b6b0e86f363bc41529ea93445a8b5ae39285a323d9400ec7046ddded9b334f1698b4d368f140e0d07027f0ce09c1e8974bf812968d359987fc0b5ee6b4ce847931b1a1dcda07236624b55505b07435afe960b448988f29f246ba72423f90463e55526466ab0e21dba872ba1c9dbbcc0975570fe42a99abe8ade73be1304de1cabcf7efd7da2c9e2eb5b85f6c260fbdf3f23ac240fcb89175c49faf437b0e34c0575aedfb4b700990ac41e0d43897d9746f48e4aaccaa8ff1aa6dd4da56602dfaaa3e55686466b8eba81db1a5bdaca6e07381afde89aca03747d90bd422440c4579f255ff91444512b3769427ff36ff19abf51ac5b149cbbb6f90d7580f494a33447d9fad0f516bc19c45bb5857a5a40a3f2241d611f6f9b5f36da41ed374a31533d004a239c2aa63399a6270cfd46f7da5ffb6e22b158d52442f2f5348f6dee85fad5471aa967d9d2a1521a087902b629bf4c99ebfee383f2490bd22aae74a0bfba5820fedfdd259c14ccfa840595983b67b31230fccdd20af299f860c905e590ed50c62073d2925919dc14d40b055d604764cc07cf2924967de559915050bf8af004b9023e64da4b85e4df31dee0d280a2d1977c80ec1e04c7690d91f076d47b3319f0ff385df1d8be5e2f1bc45c29f4ed1d67f9f794e62b68d26f51001bdd3c2ef8d6a2d50f363d9769971bb2d426771c947a7bb302a00f15b15f328153d4e4d3c07a4ac19bdc9b188e45998f072b7c3d3ff743657a77461e13a24a1e1e8f24a513de999a9101f2ac837ab0404431b8ed2f6bfb292e41ab43ad7753f56c15425df53f517ffe1c517413cc86561959267b001842b21536ca5a5791b3e47d3a5f06c8b05ac0f1db556772b1cf2ea34f637cbdef156dfdcd76b102438b284a17465e12ff80909c7949355fb7abac6d4243ebab1770f5ed8115fd3bd195a00379859bc2ac3c81710fd355156f4a31148012db5648efbf7bc29d0c1709bd453f9cc34bc73aaa5c6d5c07443d9b1f765c0fe2477113244f9adced56fdd95d2ea82996adcc3f5897a0d89834dcfcca32147466d410a2d0f8de9d13e514285303cbc273f902d45048dc25d4fb102cca0fcfa777369ec4e8962dc1875457612699155d28a77407857c79e97463b4b34ec89bc39e3dbef44437b766adf76ac820befe7586f8d1daebc4"}, - {"000000000000000000000000000000000000000000000000000000000000000f", "00893317f3e2b0ebe43b6437d0ea447d629932d94c289d25cf206b6dbb7d23e330c348b338f135fde6890c50f1ae1c09b220c09ec62ca4da5dd6472d1cee792974e70918115059544767d168ca8f422dd63ada4707f6752040e4c4018ece56262dd38e7ec0541d0225115ba61b7bd1a9e1caad32be1c326de96e8c9e5e202e86d9bff820175f25d1b4600742367919fe35351166bde4342aa6d245fcfdf6727c7e9ed234d85cf13d0596de227f43fc410c6261a2065ba234f8bbd5da36360416d88fdfa2c3cec7262ceeeb1bd22cda97b65b0d821304dcd862cb795225615553f0270ebcfc2b331975a38acb3bb53bf13c24e911e539d59d92bb012409a5ad8affd4fe09087f0127fed9200097fdb2db7d1dd3b692b66705cf732d61df4d9cb2ff24d0fc5f710d211e3f740db38c9b95226494a457da4bc71e51580fd256ae05cfcdb34a17b731323d4d1f75a23e13aa0112a3bcc41c1a35cc186258a3c32e7e24867dfb8702ff2c162587be23ad0932b938a9e3e0d923d1bf9a02ce137e38e06dd9c32b09d845554e6ac35dba1f7d1e78e7f6a59b88a9b3f762a8cee2df5d6f895bcc4c027bed3939823933e5c5a35081a3b10a2954337cab214c897c721ac39feb1df24784277c9eee37df962f0666042a475d1d916343d106131d05f4aa5c51d7fe15705f454e89456fb541db2fef69cc2b0281f855ce06d1fffab651226ba51c3118e673dca2193f99dfe0193057c5778ca24d6cdb81ae4812b8e38ce03f504b09165ca636ccc3a173c0130c4564f36ee3fe9f2c57116f59c7058543b2a0d031f45ba52f790c80ef4dee09174aae5baeeeafa968856e1ecfd0626c2475e3ff28636c34d1d69241bd648a04f8e17802ba4b5909990ee6bc5075478021cc3863b04db2c7eac9f3dcc3fe36bb8f8ab9143371ff94ca2d6be653c2ec67dcddb600aedec913c5bdb259cf912d05473b1225fa3e1d64131ccb557c2640c5db0de72fdccc25721d4c7ca99a0f7e8bc14c633d6337c97587f8656801ed6f515269154f8126722a0ba7ff7431c9fe8e50f4c7e697a52603756f9793cf889f0f9261d4c56d430d3855b37c83077dcc15fedc672ba3dd75f10335975d84e0cdd15d08b7ad507c9627856aaf652e82fb227e7b9bbb778d5b5605461fa285f3974e96b7dcc5aeb6b21b38e7c70957f0d313f6801be776c2783fcd2446cc84b8d852270e9b9c0f8c9fad906e6b148eef8d87b720bea95e133bbba91bce2942d4e6b2bcd27d80a11f5a8d3f9315690cb03d4f5327aa5e52c3d6a32533592f3ae652106681d095517ac7642384d9d54197fd68ee8f2a8a7329cec960e5a87df3de685ed2664a5f998a3d9f7254d34ff0a52fb837ff1225d24370297ece9dd8a005733ae73fb81e6ec1365fdae946fb78e2c5e8de0172043944512ad2aa5caf9f659f364226d2d0bb5c20390e31f60cb05f1449ec84e172285fdb49b5a378bbab060819f9e4c1f67bf41555c003f69fc772b7fbf50b0f39f5a386df504f795b5461a1b452494534783fba11f184b18b19b5cad6a953a7b2d5ffe7b399ff9d973303df99b26683695e51762940e54c5a28311aed2f1c81ad2c23673ac1487f62d1bda673b24abcfed6f0403615273f7455c1b7b585d5a6ee4dd5c15afe32de0661b7fdf1cf9421cef3c86389794f7b9de91f5d36074f9b2ac0a429ddff1cf1d1d57c6f4cc7d5b8733a0cc91912a1cb7fb4a54db7b8bd6282165d361ce03239a79add42923da38992551e1f7e00e655ab56d6721104d275d59f45016d6f01d1baf830856fbe14be4519adc560cde02939f1d5d313627ff67db99173331523f2f9505755f196fad835a2a4783e662047144e1d42376c14cad323cdc89b1438a43be4276fdffc8f3d"}, - {"0000000000000000000000000000000000000000000000000000000000000040", "005b32b36a9169b7b99a110fbec8837486e4bca13110c247c840cd761be100328c07a10f3ac6b05821043cbd966461162c4597be649dfa51939df4831fe1ad74da1f150829fb87afcac8f832fc953a5947d78f3f050d186c0102cd691374560df7737c7632431cc6df23e69770cd166ef8b9595ba989e7708b542affb57b1503320e7ac676909c4231ec40129e8b2a42fb1b8331d1d3e3f47d86e5f7f936cc54738b3de983f01af30b2b76afe2c62a63427311c29bdbc97d0c40d4b94a47a84ef55aaac15bf05586d36e6a315df9983e990716be07eb910897936a5b918af3928d5cb82fd8a10a2a0c73c9b65c12b5c8d9b3d6c9d2dc359b0cee79240c8fae92f5accba5798c811dee7dc8ac72c8557d8f23ea7a1bd6a92325b8b3c2b7163417cd77a19d711e0dabacc2f6ce452e96fc04d67153ea5d8adb1ec2e1171a898b26c9c30d1f83a33c604ff77e5ab8fbc13b0216d7b9e74ea22d18e58522233329a30b777d92462c969b053025224fb733571ea749d292441b9ea0d605a4aef04798470d43542378251d78edbd5fb36fe6064ae9eab551459948c9672b9ad07d8e15bd7c37700230673f40a6521f6d86809ac860a642c334bd74a006999336a34a1e55853de3f13b2352d985ecdfad3f0c242318d1c4f1dec90e814c2ff401ccf5d5ca1eba0e18a1415707ff372f72410e0b58db9e3428f95dce04e2c847d9495dbcc32014bf17a6b3c61ac8dbeacd0d23169cd550426f834904de8a33002e872197d69c0e8b121aa0c6b665331e85353d68ca823ef2bbac3b295a9d52baefac49ab8de55183fe9f3aaac5da289905898414a658a59cc63f309c26c36c313861789bdd1afd87ae0f86d6ed2c359806e4508c7a0fd47558e20ee775e4ae4b85a0b92d8231e035828965e3fb1ada2f86a5f17a238a8b7cfea8237c58a2670a79d9e5ac018dce55d7c42f975bd2708b07da46dd1838ecf7e21a83964c34ac6055d918531f9156c912a390f9596f1553a659371101dbb7ebc1d75be5b97cb3b46b6e522b6afbf5ec65050175a053838cc4683e5426bbb3e31065d7684c9665f15edf1422263898f957f3f09f4712869b2803069648387292b92a96aeb55032fcbb2f17f4a137fd90e2f79cd1d721d1749d3e0b8c35107f2197e29456b1671fcec2966f9833c227382e9c5c5d039af24e0e302dd58d9721b6ecde586942be1471e92513e742f91a47f75d01e2b17bab98fa2eef557ed9231e0ab04ee186fd2b032449a7b5d8851761d80c064204dd87eb5d17a59e6525a7b7597b45b8115da03c0b4a9c0baa1bc953889623f6c6e9696d9de99fc08910b6aa2c8e5faae7aa72b356d7fd2a4fc6a7df831510f3f168ec4d3337a1c48a8db2f25cc2e4e9b9ad3f16dbbc649260802942438287eff74db641b2b229df01e9e6176228aaf9f13a449ef34ed8392f023908e57caf7f70c82393f1b0c569912ce55576b595ffd33406e4095ec5075034d0af181f5273e56e3fecd202261ab4f4025494420f402c8716d1df651a953fba1a4009b7872fd4b1bbebebf8f22001f3d8e7a7dcbf459311265a728fdb77ffee37b1eb2fe9f92d5f5876f7ce0dd35f5277e3fa35436271da1b545b6d05cd0cb4174262daf665275bb9cbd6b7839be19e8f3ee4dc9a9f02d033b39d9092fbb4c1434edd2a0ac511adf84f70194fc6319a0bdaabdd7a2387551f3255d45c763093053e66cdaf4382b44bdab21a2d2f5b35985e95857a074c8ceed798cf03bca2d22f81a2dc8cc390bc0c680463e6354accd9d5b959551ce8bb83a2adc33f2b550f1fdb6dac0a71853d8551ac326a34c1333dff1c9b219f492e9bd6e525dd33734747d9c8863d6c9461d2533b9f301f15e0b8b242b9ff376d71331c4d3f230a"}, - {"0000000000000000000000000000000000000000000000000000000000000006", "00080440fa43a4305708d1a60b2db84114295dc0ea0c5d7c7e508323fc4da1820298da1314dc3770737729c136a45ccd747f7e2164cda6600c5de4f070db144f803cdf809c421786559ba1f5e7bbc765453d03450589bbe40dce6e76b507d62003f8081ea99cfbc1a052aaa4a45fb37267af0cf5db0ae272ae09c2b114670e7c731eae4d334b1d9c11183850faa5a1b1578de225af72a95e2b5c839c4ea46d995cc6e32fea5eca8700e01cf97b344201d5a59090f874138eda581f91ac1411faa6c62ef4f5c6113320e8468e1f58be5d760b020905baa504f19a4920d4d52fc48f22b21c5aa28a296b474d9fa0edad55744407a0f80305a5177a557f12f5afddfc9698639c4ba9b08ce5d2f2e74a38d50e4694c4f2939ba385a49d8685d65351e38dfa3f2e3c19349a5df5b197c3e0a742e660d180a6727b1f264628f08308310ee353818a72b6b9f4169db62113695604827fdc595b4d0b724ce2d4055cef656bc49b417014c5ad7183cb8dfcd49834e57cf411c3ac04bfabe90b4c9c4a7b1ce7f345daa32fa2ee7d72250799e30f0be54fc7fc496958b022fd82aa768f6b6550df25b116df11bc332be9fbd03952ca09c9b0c98507366c8f1b1aa3745e546407e77996cd5338058dbad79bcc8418b3f4cedb6c5b59aba974920cf9d3973e48bc43f443b944232aa42d47a21a1a684c5b519716cd9dac4e0536b9d0f4842f05e25f133b5d21434512ff9ecc3b3a79247b419df9c50dbbb5128db7505e30c43825e30888b9f7671607a3c869b54fcf2aaf0db828dabd422e3d4446c1ece4f79d94f683b0c7d11b0115fa2d100c96bbc8a61bf2e7da9ef1a74145b149afbbefb11d0d40693b6417dd35b66e2b678876d7471eb1bd63090dbc73ae75cbcce7ac3372758d7907ea81cef43d4b49024f9762d6b50ec1c0483f0554b9b6c290168c5500322be3128f66fe8ed166dcb3d6f8be2fcdd26af70d81d2a1c9688fada806389b266bfdbae1e71d2b611338bbf033886203fa57a545b2ecd061ec62df23fd2ea19271ebef42df8b14178d626dfc725e601cbc33052abaca9546a113ca22d31f3e9bf1c27bd7fa435f07d3b9237ca9b9fd9dfae0876db97d86a0fc1902fe185de9dda18e0181569451d6fdfdcf0a0efc9ac1cb51df4cbe1e70390f98d3d5452ab658719ef11747c90b0a8e4dd15186bdd1ee561c44ed235261997fe47023ac7c71af52ab5726a3825614b6f8b8a075dfebc00d9e5dd8eacfaa3bb8f28373e6c75ad5c7bc9224461efc561f7f87df65ab973303031e9a4645eb3ef4f113763d1aea9f82f5d54001cf4aac06ddebee5b835213f4778a8af4a96bb3f051b729720f420e139bbefe242d6b5ff066c5cd5170444d66d7edd7a1673e98996b1f939097345e2dfcec78588c525c57eee4ffce4606749a8b4bca77f5731a31c39ca0b1267b74f9699f09834c8c22f2d901b53051e2e6b78e3934c470c1cd194f4bcb45b41501b78a03c614d8ce8eaca3fac9692a94841241342c2ffb4cc3cfd35ccf392a19fb9e5e11c0341853110650e8d705f5de303c79e2cc97df721a916a25a0f7971bfeca7463b8db92e95871ab907d2b1496254b8c99aa776264146dbd7282eb98db53aa527ba580e16d3e9776941678be53eea64496967fb70a7d2167ffc6c2b51e0b948aed2e553acaabb6a4f919905d0bc84830eff90e8497e3d4acddcace1c560f0c9c2903b7c4c2dfb4ade16a3df6a8f93d92794cfe353a3d64de77a62dd22f748871ce0c9e663eb63d3d12db28b05328cef1d6d7d3230f3a46ed580c0eddfe69702d0971ad8cad852cd815c97d91c61292be9f61167520eaa191c68cbd1b24b31ab82b71446bb3aaa31f429233187227b9ea33f2f09261b4ee975a5db5ca"}, - {"0000000000000000000000000000000000000000000000000000000000000002", "006f901c59a010c72be0e2e881e81a61565d0e0a97261214ee04d3968be764e43e4e3edb9a918b596de90d214f243b243d2372e99464aa5b4ac1650bb8f65b0dc97c089c92c0af49a55436c5b3597529467e57b706dd3c39eb077549462dc11a99f13729c538ba656337178449b7d4fd10e56e5432f374379f1b47ba24fd1b9e9db876b0b8adddcee3f0e5776f2506e4592fbc4a654712805b0551a18cd8e294faae7affccf8b57b0a80f79219472ea69f3fe11d4d93bf59c37596dc1f2e028bef28e87f93c0cef646bf61918a581fd6d6ae28038f2c8ccfd6437649452fb74a8c1695ba357cc82ab20c9229bcde4ff3c1a2fe15e520e264317f32351430d1bab4e00ebf977c63ff3bde679d11f08e1da71bf659fec6b2ced3980adc5aa4e8bba73cf71cfcea14f0f7992988e005c49be188aba80bde34b097f7b1694a2bd2a79ca5dbd95c57822b67d232abec56723001401cc1cccd886f5f239982504fbcfec461b899a257384fb3a359be15613ef72becf64445cdf1dedd13069c25178c483de9b97550dbffc70e75d4d69683be1b0885b7564cfd1f245cdb268efcaa2acd653ce4a609ba48ea102342773c03b10eb470a3acc0d76f71b014c71176b548d632b01ef34acce3eb22a62ebae70f10da2f2ed05c3985572bd1f4d9a8feeecd18bb7d16207f6d6920700d759f28d3396c27f016ce2579d792083a8e4aed5b85af5cc3510c98cc19a6dc947cfc400c11d90b052ad0e7a23f85289b4b4cb1ca28161cbd0d4ec7d00f0523df792a79a738f9b99e88b4da277a1aeb3bf992b93f03d1eab1e8d84b7768ffc152d1f20e8f97d467a17691c922c1b276100b9d4bb2fbb8de2940b2fcb84afa9c899eb656ef629c46a5717eb1ec0ec600a4fc04d45d3502247643280abd9db11c88d35888ae8e635b057b0a670589233caa1a4098f4b4cf00c36fc6279609a1058aa014030e492d3555de66e70b99e89efc51df58b586c2f89f2624be7b7857990a050bfa8f6a0bcdab4ad17180a44ca6be843cbc948030236b97a1aefd47aa7ed4a3e955b98d2c7e7ebd650dd68b698dc43b3858a7e91b3d73573aa2447ec29b433ac6329766502dfcf9c8555bc9fca703701d4ff52fddf4c0c34e23c1f951f3f6d852d94a4f613e57307706b51f3521caf733c3f881434b3fa70474fcd97c0478d752b4cdc599bbb2574e00526bb324ee1cf4351fd71b312d134a998bf0632c57e8e172306279f72308763e6753103c8786e71895655b403ecc0db9c278096b22fa978a74ea8bb481cc8d66d0d8c825df06ea05b44165345bc852e47e0451cf475c159de432beec12def11f4bd5266f9e3ac20b4d1c8c3cb5e6e7ff351a0e3feccce21d4f820ed26a41694cf98c503ba59f2dc7d9b56114b0f5f954b7fca7e987775a12bde18d00d1b2c5b605a38f8e2fe11b64d4bb14c53cbf320839056d9c5f1509d2ccaad48b56d05cba2d9a5fc3ee035f94dc71ca91cc8e43d05d7bffcad92415723b3707403b40810ce625be9b138ce34cc3b61b94741c6c03e55bcf7b5b1a9eda2a420c3ef417412758fa548b07d72911790546c84202e0eb507960b16f1f78635211b077d032e35f81e97094643b7199de9ba17630f52c4dbe3277e0071d2d2f84c33273085187a538062a01523cd23a18476b9ec210f4bead92896b2b56c8a306ccd454dca44eed84d1440082213039838b1770020ad1841d6122929b170db4024036014178d1f676700c75e2a1a6474da78ecfa5a16dbe42e9cd979a12af092f754a434e0457f546c0c22c66c16db76cf4ceec245385a0c15edae5473c92ceebda0d331c325a02d00a27799a22d7f9d9e5c2b54a08c043f1a88c107d1d0b9f709f79080d7d586d92645a72a4712311ccabdd"}, - {"0000000000000000000000000000000000000000000000000000000000000004", "005ac1e7e9ec960df137f0750ebbef144eb4ec488904723a2d7892c80cb4a622f429301ad5bda92fd58a08d3d7312be01f473d4f16a045ef0566f0759de91c2622b235d554e5a962341290fba5d6891a0c75c8bf090f4c168a696cc953d130fb16473678ce81d16a0c17ba6164ace4870b775ea1ace76beab06fce7368180f6fa53c3e0b3acacc69f37b72b718daed04bd2d9e6f9eee43a7a587e7629698d0dc702ad2b75718bc99011a473fdc8d32d9128fb54a56c3d01a5f55d8226b066e3e5a1503945660549325e8ee963e50a05f6dc7088c28a2e9eb7a2bba736219c63f4b8e25f17384f00cae7fdd741fe02b09c0ebc881de48f39e035ee60e1878ad84ca5077bf30e0164e50c8ffda294034e9814f5262f4f1e7856bb316b983c768806b7b77df74da1de495dd2f18f917243bb9aa19d09212a956bdb72a3a6aaca7ffed6e9bdbf6f45cabf04bb3113e9ad48601ba70e17a11a8f7bc5aa07494d8a56540ad3b89171baff6b4f40f43d8eb3f53d748f2770e30dfb44fff07af9f22066fc9cfff4ec2f953611ff138995ed32a4e484b17b895bcd35cb2150c074eeb9a4011d27f160404c93cef7d6eb5f0ceb178af1d1fc204015529a2392752f0482acf5fbdd29719786de15601e1f6a33e066de607fa0cf1a5a4e100e62b2f58bdf86cd33b5b52cd6f05095526f3887a15fbcd3f78f731c25c79b002fe41eb092ef3f3bbb7037238c028e19e94b3354e35188c4c3e9cff19e655891847ebad9e5735d2d3d70eda488f53c45f230171017d2fd1d482766695b856158952a6d3e0cdbf3b38f374863f541d7e86d0dc280430dd4c654a7265aafc31b7a4584a494811eb874a1c591a6a4254c76dd947b22d794ed734ce9918570f0e64dd7412608e2fe82fc0f5aef760e8a8526574f613c41cfa16342589a9d7e666b4b87ca62c2416e16c0136daab3cf6faebc08d81e1d3ca97bd536a9a21da03516f545e483108c5ba057310d3ef4a841b17e45803821dfad8121771657f75fff6d6fe95c9ce524f5516608d6d6adf3187ab74ca3f9853c12b56a99e134c0802df629407aa83a733952341e166e9747b1d12643983a6b37b3d180dee9675501f666d6d69ba198ba90c0fcb9e868746a983be62ddb443d55e01acde3e0e2084e27ff326c05ffb9b5297b09601cd93f7761ea20405562bccad0b076f4310c0ae1c8c20a7da4629b60c4378a4cbc741636556c1a21a29537185030fd4a918d457e289a6e8038533725b24ebdc05ba7850201739cba3e56d5261bd8878e88ad94adec6334bbf221e04f092ed3a482042b17986013f6f2c15bccbde228f0bf81614643181e7bfc3f2b979ed63b0d3e2195641109c964ccace0642e6b4022f12f7781939115025c3654255c75330d333d62d16d305e23a562ef159121003eb5f03c3c829eca4e650d41b5d6894b2d15489c42f2eed7d6d0fd00760ddb646db57d2b5a0d3501e12071bd3842c480400697861523abeec70cf07b92c9e1b917c0cd19522f77d9a84d731e34a95dae27921b310531ccd7acbb0bf75b112a919b7e76afccedb2bf217f5f2ce965b6ee574cc81b7652515599db95e8ba125490a04d2497fe5654394ad60f933b21c339d20a53cafee417b19adfb9a15869f2bd3548e08e9361bfb04a1a75a43299cdd82d9d14621ed1ba07993f5d94209a2cf3816579da4c86444279ae7f10923adccf24311cfdc390514d9bad9d0e33a1248e94e2e6112a80613cde4f76e89664c719c91e4c494e226af2c3d77e50e82eedf635d167d7019d59421c41dad737e78be422119b4e3e6c8d5df923714ff735aa41709c73ce1890fa9b1859806b675c3ca911a281adf944b2fea9f5d30314e5325676e6dd0ab048a4d28e91abcd89a630e"}, - {"00000000000000000000000000000000000000000000000000000000000003aa", "0046e8aa8dd6bccde4d227d290e391f698cb7f87890951bbd93689486d3658b5d7a7d43eae85857530cd0697c0777597e6ccc603345600bceeca3c88b7c5c32b0a9742fae7e9417005a70e75cfb4e5cd631205eb020a4db66dcaebab30d17114f627f9bd54612d75af05f1059238c3374aa54153a59550034e76e3b651280496f7a79793b2b1afe061bf967777728dc25f96f219388c9d27d83e7af7ecd2d709c0589bc8ab7eb0b202db4e5855c3bc6cede5913db23b96d4ca4456797f1442467d0ed665cec38363b6e6dd00e61f6c112b941434b3b20a4a596c6eabe290f460b309edc97f0050158a2e575049f27eaaa59be14ae2510b2d4a3fd83204068dc93aa45abf8c02e8dd0778957e5ae7b8f98f0f2d49ad53debc4f557d53a01c40b70ea681ddc4d332fadb9fd9536836d06f54fe1c7117a26abcdd03353aac743ea3d8f41b2ebc25946f6a70fa441edbf633007a3f47d54c778bf0a8d68c144d75d785177d29130d06ddfe488b4cf0956bd14212fd2b129af2b71b0d10550c9755918807a2f0d6d23753df95c0a16f97101fa7ee4d5d3b110ff67d155abef48db18b6ad825a707fd1b05864e84e9b7b534f417e7887579ba71149811d5e8fff825f2cf3c24536a099d561ea4a75c03e012bc7699098fe0d29e3a8682fc6530b339129db6df2ae5bfd3521e15c723ba548a4bc2e9132ae45ebc9000ff9dcb77513ab59b3330205fc59f20895dadcb9b5f3f2434296aacc9faf218eebd68456a7499df7b6a072ad3277349989994561236c4e6bc617765b95920388494e2ee8eaf034cac54c7dff92a519dcd58d4f20af6cd1e924bdc587f327c7147fbf073a80e1f63e320a164b1450bfbbf8505a2d9c9c996ad154d1733ef2a649616aedfda7dcf71152c7eab551375077cda99344a72c899dc3989f9c58411a457c299db4b94b5aa0118686bc720a599ad8c65b02dff19f3ddbedfc825353c4512130ef31bb451b47082e6e89a9c9c3835b817101c9432db0d1341e5b5ff164605727cb7ba08641c46fed9eddc6cff4ab5574deb46953a6df776f9b4063021cd417a1c49f8a9d0e3b2b7c3359d6732a1e2067a87e9fec1ccb26e2fa7d139cfd1172aff7fe85c0f4f1d550e48d917cc23b343886c5e8abc455e1eb4355a96659d22a62fd65d53912e2d9ce2a9709a65770140a318ff14cad780daf4bf1fec9b9d30a9b315fc1101bd1140f9f267f4bd83a5c9f03e7e54c9dd18423c1289f24de0411364a157752b79b966eb3f7a08405c01ab7a90a990ed9ee6d627bce2b125979b2cf2000249dc49df55d53ac9fbe025a599c7402f3c26d7b2296943d8528e3b19d84687abc4f715f2f0cedde98a2adce728bce0313b0248766339e84f89e72cf8fafb451f0f9e3197fc7bcd9696da4dc2b84a1b12595a1104dd60c943d4b059ce8430e23adfd8ea49bd52997e139026fa5e482cd953f0115d80362c3628ebf4e2cc1b09744b5687fa64419dc4bccfd33c1286f1b684b930e16de24dcefebf8121a674feeb5d6a31f936edb5058d9ada2d316e2b972982fde1f3d7ace7ab5c10aa1835de690af2d241fb9c93a0d95e40b73749fe2baf1aaa9c4c534d96f4a202c26d057ee8e35f7e7cd9a248c2c38c91a5c319fefd262083b40092cd2bdffae60521508f04c5f4b3ad85508b361427f565005b07c91653b14f7e1cb631d2e394ceaa59dc62386c1b590d110f614b7195e7cdeca73764f9ec96f34e327f6c5b338135934268410f958dc421296ff1a6284d5564f10a9eee81c81500f18e91b1d1801e633e99281e94461145646acbd80b5f634e68d60cd6fb8f2b9d9ecb9c0c0a0b803b5065fdd324f604d36a3eb23f34f260d724d106a3628ecbff474b564aced796e26d39b57777"}, - {"000000000000000000000000000000000000000000000000000000000000000b", "004119923cced1f108e0372cbf43ee2e60f3bed7bd13a6d8eac89c27e30763e301df2dedd1d073be53110cd1f9d93dc73898462ef5650cbf5bf1ce6f3e6a4d1f610e7a12244bebc286b4e01f4c1da9d8dd1857c60f6cfd343a0760838fcc423aa1c1bc791e4b0abb4f1c2cace44dd302d8b17ad569da5f7665d2c86fc89c28c21c65ad8b5915cc4ee3d2a26f75da1d48da36c66d1cfd8ddeefb40bed77795b4a5d0512ade89d28b304ede16a2e5b443948181242defcca3db866721d6b47020b66e3191200ea80768394c552c6220c5980080c3d622c4343c5dd9a6bd6110ff5b972c9663fa26915d5d2a0f1e19c8d1161246eebb1631dd18434538e09e316be4dcf9edb96a6e19549ef2c652ec9959b3d2ea46db8f34dd53b1eda4541af7a7efa4a213f726f22ba2eb94011683d8d12065663c8376297639b56e94894ab3713d3323f2692356cc2338e8615f2bd37ab0138f3a8d15a5e9731cd42bd30dc3b7ce8496c25f41098e60e3f0c5fbbf33261e33ecc1b46164473369002d4423f541c2d37e52d63b776d4f7514ba39c99bc433b2397f159b279f32717e025d4b8b68d09b9f64c01daeb48826a0cddb056423abbaa8346d86e5f152419767c31f95cda75047275ac6d4de69e18ced487040536b9ea1f072109936f12e1dbd68439de0336477a1ac125609668e04fd82a658b82de7da28b913e478d0854d115298bb28c6d5f424b497bc21d3eddac8c2f164013e301aa9629e44ad65d1f5a39fa153751a5660f6e43bc0c5170f78100e4b3b9bec6055ccf0cda831496fe149762f50938a43232191ef0d52c318eb52308c5205ea1e68dcf3806b88c7b6f1b063641f4ad170ee96b68921f60c97b2814821ee1dc2eb9d5b782711968c17854258a97aea897e2e9c595e6269378a21e2b0675873310d9bac1722381e49e0927c3fe1fb3240073f2333a4d87009e868294aed97d18cece4f9930042c6792bd1a87cb5ded35a4e3475bfe741f73c3fe191accd72188df7ec4d451e896e307e4a0c1677b821e4dfc7d0de662a5dad882dc066fa16536dd1b17e1010605ce59e61cb9ccfc51f3275336091056dce72c08482c4128a7a8633eda71eddf9d83810372487b1505634ce5f4903847c1d340f70b08472e49e85f43a4216087a5f4c908c55191949336c68b76ea8d1ee438008e9ba8dea54a95bbe0b2c92e59788cd5ceb64aef279d3e38f665cf43968c459444576181c3de5772e31ffcfbccccf4ba87b985ea6be9ecbdab78ba5ffb47292d4760865bc5f17fc934e57b4accf59b91f3ffbc02ba72bce1d93110f0a1e0a19fafccad7194ac43061f835dbdeedc82112bb112d55f227a06058cf702b3030e10465ac32cab38b35283b5f0feea73b4583b57062b3bdb160c966ac2db959569c41ce9b9666f017e050cfe3f00c9ed0f54c7063938419135df9556b72f056ed2fa90c89b5ec41f677f25c855535ca6dcd5a70834d3307b473521236bd166c328518abf5f3a095629d9f6ca05dc1df3d77fa64d31c888d5bbf8d37e3b083e6dc6adc5e11329e042058d991c35ec379f17301efb5664a5cdf78ccbc85771525690620ae61dc9a31d7cff74965594a199aee3788c3072f97c299b173925864e1bc6da49373d80f29f372af33b2f5bdfb0c90a58f9704845462b42ca03c052c07b811ed5711a4f3d2b6b7c7b6c3139f30098020243fa62223ad9fcf51809767f1c9e2699f94477d8a0c344622b26d7f9aa1a79d709cc21e8e73509151e4155b65a2b5857a2d70fc9bd52c8e73515bc99667052775c71a2fb57f9d711f1d7894e05ec9055ae51f5ef9e2080a6686ceb051e4cfe681b7c4dabfd37724b5bb9233caa171ff9683ee989fd8f50842aea35f6a7efdf15ca61ddf5652a"}, - {"0000000000000000000000000000000000000000000000000000000000000005", "0035afde4b88e0f3cd1dd4e703b3487d6380763f0332a16ccccf942641c04db473567969be7d073b631c1c9edcbbcb2225331de373414cf6f93b9b45fd09d22c94e4bea9910f59dadc049970745932c82ddae8240d6df10b2ef89441eaead62030fea4170a7699ddde3fa42a159311d805894805c1a15231b1e598580b3b0e41575b04674925e98364b9316b2205e489de876f1399e290b8cc339fe49467b50c4d23df45ec5a6c82029db50ca4cc6ce0d37c516451b9726d70090eaf6019b2a2bf9bcc873b6aeb76b5333d71be1a669a850b1379b0ea0116d174b796626ed97d39ee98bbf7fc50435755290998ddc1afd9277e1843994e4221fad12515c89f3cad9d2ead2d45345f8eec679181a9ecff73242f956c5c0d4e3d6536674df4fb80de4f7cdeb23c2f03be9cebd13bf36f0d0518f6d8191d74c0700d7d6bd23e0b637387b5f2da075a6ac0e1f2aeb87986100479234733970f2fa06655f24673caf1c9825e84e626a7c5ac418bab251f30d2902d9b1fba6b4f57ec751a1c6ff2f44a985bb23e18de56d990df03ce9f958c335403fa5993df45a9bee3eb99d23e9ac7f83ff5120a235d9f63dc1479fd0f6352ac5a31a309e61e2f6624cae95ab814961bb57b23323b5fd1bec2ba3cc44b0bf4a0e25a24a839f403b6dc2cd074da30301f81da106aafadc86fad47ce23c514f87562f181aa512b4704b3e02d2b0dd6390314626b92f84fe5d0d434859e12492ae7bcdd8c1b8037455a3d361e02982ab709020b9d7ad31d8d56bb2aa832c367d7eb9f19337e310124107a42de2122d71f5d74a0aebdb2b9909e7bac5505d6c0d4e66a54455799053fe77987b5b13bfccc86137067277b07471f6b5d32d993afd9956515cda6b506b32d54e9d56ec16056010ec59474f641c2dd893942e5a42356187f79707a590882f4e4c33aa67f7e0f00469f5b3587597b4df960bca2537872b35addc1851a4af9b3970dc963bdc101b754166f4e993114f91801516a0e885355b1e55f00f7c7db7f14e166945dff18ba34bdc15b9b4fb96da284b95277c5047fd95140013b2f5564a46aafa39df705ed748a31fc4479e28724eca5b6fa0ea3372d81c261eb9ea0b0db5aba2baf030307c9401a2a9eda1908bfed5befae53a21c51030df559e94460859be0e9c7b44e70086e4a3636e1840429286643db06af1f2e12d9fd599eedc73c9c4e655328139cc8d66fa9e9915564b0f3d2b6b1ea9da8c20aa0191a7d82b3e70d5911e0dc9d97b0bd30313fbc365d72402438e229f4f033b108b0bbe1485f14f2a90a189fdfa251c7c29bcc010c0009a30dc163ee8db836813c43b456e9ff4ddef6aadadca5cdc9611b31700acffedc7e83977ef8a7312cbdc36a94d2ab771031201d8539ba217f494abb1a65df7dfe8f15d13d570f07368cc0cf0f97930745d2ada0aff5632a6dda46c908396a1dcfc23937546140abb1bdd30045c30670c133451368932f6081c9a0d4aac16a1b8a024410e5e5410156cc855c2792fa1926002be0ae2e8c14b565a00b3b0d25f9ce0795402292a85c665e4585f20f75ae435a2be3c910d76e963a76af9167159eb321bb941f0d356dc12c912438c4ce259d9af1aaf9cbaa96d99814a38dfca7567b72eded81fbeafc0c6c8aefaaeabd07bb36896b46dc10629190bddd279ed912edd44d644023be19279065ee86fd06b7dcdbe68293481dc5810d583d8f388d800352f352f68121bed788a37cbcd412cbaed54a2334d79917f34158a090f9cdfbb4c9790af073ee42c929076919541b805bce268c71f4bebe1b63622257b2b475b8418521a775eba1a3d81f8ffc10294ef4348c9bdbc4fef2d5e167f9e9ba53f4c6b92e4ba560ba8c5075f97ef5861e52f271a9d7f45469"}, - {"0000000000000000000000000000000000000000000000000000000000000004", "0045cc55438ec569072433ac0b4a3c314bad15e9ea0bbc1daac7914ab6e487c4b90a460e016fdbbb944701c21a300c9d917daf7600c93f55ff0dd8d2b8ce3e21528deda497b17bfe7512751eac6e5920afcc6c1709c32b821c96d679a48db3c17273ad16251c3357b426405cecfaccf9678533f328ad2a6f90fe8a5ea626173a0637108c0517cd6991f5b221eb989740786d991e2793a15497744309a38388b5bfcb69cc9ef915aa024229a2f59f9103367dc777b06a928e8b551abea9118849e101d3bbb1677e7217e4e265a5e306172aa827957e826156c243bd82234d63249c556328dff7502f1f69ff90524913b4a992f5124054c61414d0b52209371555831572b1dac0b2658942b6a17331f16b1b0f1f3a6e93ea218dbf5047a2024261067c1d7c99d109b806bffb05ac79e85e41c2dbd14e3eb68c7739a21122bbb0af0b06385d9a614ec3b5404064b3bcfb0f0626a2fa0d0406d2d45dd587b6ad6f4a1039d5e509412bf7a354e14e8b55f624cbdbcacb797fab7c6a9320c7f467eb937efcc9f6a4b8d83e3faaeb8d590ea424519c02ea0aa6f8f15f94fafba840073b149fe4ee0b53d112940de10d7e81d12c758cc2e986974d429b2856e38d8866ddd997f8842b4af6c3b24946761d3e1d57a1056234c2b7ef3b339915b24b21d49db365ff249d6459e653465b52e2b2a03828c6e20116746dff06418b11dd87629c6c8fb0f69a2334d99c04db69001518c56e8807bbbca8498230e930d1f93186bbb6c0080baf83c76a34d3e59f0462fcb503a9901efad6a01dae857207cfbbe6ec4114f0c7e9e1befe5d1bab510f01c17cc08abbb1e41e5190ffc0f0d770dc3caa411c3b4b0a471ef053fbf6540e34b54b96614dfaf319174b9b81b72aa63bef1255bc2fd792ba3a5f7c82983b0753fffd54fab7248533c43a56387ec32b36e10500af84affe504a5aac050125f8e746f246d19c3510600436ac55acf3198e9e673726e95389daa4b0541c146bac2644190d82f93fd2a9ed1ddf271a2b38fcdb1e5b5c26759b39c1881b334638b753e15d50f8b41d06f4d684840e94957e64a227a9c6417d2976b5b2b92e11251f0ae568916cabc307dbd3e7ea8a67f58b470916770f400c7cf26c5f4a1319647a3ac02a1720e10caf8476dc0e53bf45d77395ea340e6e3e061ad15d08098598614aa2d8c7ffa1b942cb1bf1f435927b4b0f5eb5a5f790e97cd47c164a7fc8035ac63eda3bf60ca54f5686930932d1e0a453ad7c4dd183234e1f0316754dcbf8cf1caddbabe2b5c0a54999a54f1f24821c2004e91218a7eb168af5b28d7cfe65dc3bb4417e3559fea3f6a1d1156ba4b446093c176eac4e57757a2efe45bf904c83a0da2303a17ad0b9e340d37c4d7932b19ee1988f39f30ea50381bb6c26ceb92cddf63100e808c2f666fe87c609f6e7dbda384a2642bedd54085b46ae4cc503a4b6e9fbe1c8720797f94effcbc0051f4cba5a18ff1ba2e2008ad01dbc255f37548c9908e3a3e1bd19511106fac6542e7de6be2140b8c8290a6df3dbdc03dfe557e166070cc19c073fb1baf7010e23cbe9f4c578a3d01a51b378133655616d6cf16d159921a1bec984e2e62c615aed7cdd1b0d27fc3c3f61bde50d20a358f5cab9e98760f9e38f7ed97f90b8074d05736b43358d8f0ae355fecd12f61dd89a29b0272dd7a3f013bc4dd75493844cd7f97ec6d4fbd2b30e0686a9d89e5481fc5e03984af7952d9c6a7840c715fbed41c3768483d69b0a2cea6abe5719c4b9c6d60967ef909a632079dd6b36ecc97c0c85e596bc0fce193b5fc2658e9352e3ee5399ffbf5d0e47013ec77c1746daa6791473e3136a8195f95ae0f4c2c6eb9c101f55d586b15953c57928a60caf4abc438debbce892"}, - {"0000000000000000000000000000000000000000000000000000000000000021", "00b4902728a8a8db67b1344baf4a1541ecf8b81a13497b3d1afdef05e987b8371d61bc7e91ea3d5623da211b3cdb2c7937e1dc8ff280a14bbb2e1ab93e1ef63f42443440707e9fa9e9544cb3aa0211ad11127de20510adad4304c3d22c7896d03642b7520650dab1e440815ac4565306cd56af65fdd8c4e2398c5fcf921d092a3375fc546f490983514747c08e0d05b93cc87809b3ed5caf6f3cb9bc0150ffb77d090646df553a8a05da226fd5e3e28f255bd2c3261eeae68a59d50b890a6d0c15cd4f4210c67500f4ca5f3ceca4eeb54b1f199ef8edab49c3438d29a5882e51555d95911b505a1e7572ef79079f85386bb2aa543cd6bcce024964040e1c11e176f6bf41f06a8279d5278e653298cc5f45174369adc50e0b0923c8522c4197ab18ee88dd344619869faff6e7a3ef6ab48454e34718994dc35517483418b334a1ea80cd78fc2347f6a0ec869485d8e8cd011e4876cd487ab6abba1033b85aa2ccac03cd8bbd1b8674e18c675e69d85952d782b7475164e4b684e00546885da78b59bd3cf1c22b15593ede908e56e86506f46ef8eec72c65d028c0fcda75ff46fa77f8443a04a02602a9e72ca9ea5e169e94538cd2b28279b7a50fe890a963499df14b0f2397f3a630d5562aff50f00674ddac27f82dc3d8c393d36620273a385b5c2b760dff53fadac9b7ff651d555fb1b47f8f01939f7f4301f8a97f6aac5ddf951261176acf434ca0d67e16341bea85245eb5f345cb1ae2904a4f2954eceedd30d914e32f30c4b2e9cbd659645ac4ccef27a8111eb6da21aa258f5812cb3d94ae13fa2c2beadd675b558cef04808a72859cc96584a32964a9cf1c26803df5d53e0667d5edd244e3a3f41530c428a069b534fa337fae113c9734d30ecc8f488b1238e4c2a3b96d101b6ec95ef9a6b173d99401feee86f0dc6fdf8f3bddfbcda1018f8fd12e50dce74be42313456b8334fa0051512b22c10e554fda2429ab2df2713c2d1a624511366ec72495b94943c94f367e3e83dd3be2c5610467ef0ee228008798fa5e8d8f5b2673ec00791f82fac57e51310924ba88fc28ff13c9ef7454dcb9a3265d75f31cac1bf164e9b752d691346c3c4308f62ddb5ce07ee76e101d19500bb571d5e40bd139d25180e328f439960e5ee2330143623c8d9e15263638bc6f69c94035ca4608b0dde2ed0908aa84b290b77213355d42aa35abc01ae7299e7b4ec649b761b5f02db0c24997c75c23d22012c9e4acca4f47d8d274362c63995b2bb81967cb26b4b7bdc058c61cee0f829b7f60bf64e8fa2f4a152bdaa99004a90aa9a2e8d5dfb6ba073a269c3b8a9f46df4edc7caf04ebbca7552dbae525ffc2bd5f68cc352d1bbdf2d07bf79581337650a19a894e11d91e144397ecdd70e4be315068c43d416c323e38eff7f5f20191bd02519c0121eb6fd3027c3403b1b527b4d9622ac3ea2b21e429c3e085f57f4b340136a3bfbc196505e729cc84ad8373a63a926acf4ebf9e5a5e9edf011b6af75e98b7a11de8a19363577f034a2b05f467c4061e6db182b8cb01cd7d95f60378387e8bf37e09030f1629865f10dcf0e4fd24f3d557e129894232db240ac8be642c4bd483530351721934850a1782f74c7b6cd964442c65acedca5ab7458dd11a3ea721f96be80582d796e0440d287425317bf9478cb4a396da9c4a11f4f2f4b10590b64abae528d14267a2fd2c5fecd417c9c4a0ae5f4c91c22cd7d037e494ce972dba0400362fb5c5f662a7a78ba1252186d5b487a2dfde81ca072a52dacf8c03d4ce1f02bbc5eb6e81cf00b51b4420f20cbc2362e8a34dbc64ebd83ffb25920bfead7435a3ed98dddbb9bdafb0b37653eddd6eb65bd6e34a5dda65bba828a4eb8e542807f5661ada22497e01c9"}, - {"0000000000000000000000000000000000000000000000000000000000000003", "000f32f3eff1e9a9cfb380d8ee306ac44bf431106c23699a165dadc6d184dcf3c54bc5bc6da1192d1b3004306658e45998cb67d5b3f82b3a4f39281bdcd6f81bdb790c5e4704189ff85278081f4850a1d6fcc91403b8677ed8084e1e90f16292d9c604d92b16ea840432e2ff8e44d3c26bec3a769e11dd94b5b8a5dbe91905d0ff96830fa8ffc78210725eddb200638e77acab0aa2339544c6fe96b020a657e5fa1671bc64926f1e0e39defb94dfa6c920ad428b4228b155855b8d9d251e6042dde91482c9a69152ac82afb39516b9e9a4261d2b7796c7aafae5cc87f6e778c8026e45b4199bab1fe07fd3e2ce325699b968a2bc4f20fe799113db890ed66ac04954a19ff8b2c18ea31d17550e475a9b2442bc0dc7dc1a920743d795e219bd38aa880317dad93d900354a9e4648b842bc81a25d7446782d55e248e42dda29a05ef12419dbe49d9e5f8ccb78ef7fca428005e79a3aca4018bf75ee0fc5a6d3e461c3f1a140012349dc5ad4f8d2ac200133c2620fd6a5e0695d57601182aa49d27997978af144a45f4333772bb3eba67113ae1f32b0cf6fee17ce133c6a2415cac2af1a22a03d16f75ae74fb53d617f22d431e82bcf84fbef73808158bc8aac8a898a249d77de8ef09ca481c5ef8441663279562ef9555ebc59a3c7a63c7736e99fd4bf617c65490f74f2492b77ec4226d281c272af33c802b0081689404512551582a03e1524ad5215a9f9c1bb4283d0b61fde8f155a2e582ec29a2016e5e7d3bd7960cb2e566298d3790c0f7e38fbf271ffe4f0e58b61223715a68a6997fa7bab2d30d7570cecd1b1db314970253d209e64e610514c54374542723c6cd789b9e3f126e5ac2ab77ecf7de6952b789ebf29a96b0b606913b76959e3c6f9d8f9bc1e5e95bba5d59ed4ed58b77497a7f8b9a1c4591ec03452a09b4fa96da1099813a006398a5a105de7d331fc14ebb2ff7f9727af5319d229fdc67271d057b7360f5f2dccbbbbb2e40de7aa604ae06cdafd07120fb50c08a8ccb51a42fec2478e50c3327a90cddd4c78b37240b0c4a2dc51110798234015b28cae7146d1b43f4095789d3a3265ed7dcc9c3486f7d14f057a9f7e2d24a1943f47452cb40da643709647a2426826c917b4701413a2a3d78dce02c538462aea6afb39bcaef22d548cfdf65d4265d11fe943a098cbcab39277761d2da41371cd9c6b679c5165cb8714a5c1d215f14bd227b08eddbe17ab75b0f7dcfa12d0fa56395d24e97add3a3ceae5b67fa604c7597813b5f39dfc05564d0fb4ef4cb637393c75c95bb77060c98fefd99498812b573d8c1ed5106a673075acb337638ccc40a2d894981aaa85335df82775f46db3d0f21e0cd3ba48db7537810973b0f7dcbd5ebf63d71b4a3c00f86032b32b5769f9debc87d9dff8281ddefb201d34ba6a991a0796ed0208c361e1f1a63d5f861b40d29cae09b9e4a2f6b9fb6fa47da12b264c354d93d06e44e5e744b004b967a047d93ade54567f3369b194790dede375a9b391d83ba4c65ef7ca29b1fb743d2056e53cac90d6d7fcbac352ecdcae66666da362b1d5f0c83165022ec355c4f480032705883237dff7775217fce56b9dd41634a47ebd96af5051bc2ca1ec45030dad36ff1e3e3955324238532b71bc144de979772033d472e25d20c5e964bd2ce2ec177420a6cd6aa313f90c316a738405bcbd6483618e9f20a0e4e78fcad0525944d3ec20a69e85fa08aed1acd9d8dc817d0d1384744d1d0e7dab599b07a264bd5518aded2b71fe404d70c6c5d6bed0fa89501dbc93c1f30be76fc42832b7d77688d0d8db3c3c4247edeea19d242db524ae9129bffd6014a15b8eb4ba1abcf446470cd824c46c81e5cda5bb70a69a31d77b200f95597ed601e0ba72a"}, - {"00000000000000000000000000000000000000000000000000000000000003d6", "01547d9556dbf38f94c2c76036fa35c277563aa87714b0bb9f2a89eb5cffd0b5d7c4dbd1ba6e3d98c0fa0e3c85fa9e8d0e155e7bb472b5a9ca8e43a9b8db304889faec5016840584df3580bbfa2d3e057b3b22a20347f399c5d00a6180b292c8b9b4eaf8f9407541c029df33f6462e218bb8acf4e88fbf71024702be3bb60ca88bebaf48673a939cc17e452c115dad937448bf26a41974cc4b3898f5bd743b6fec796b32ca5f3aeb0dcde1b7ebcfd78710d43a3b265a9aa6d7991fef692ad239a4e6e86d95e52d38e136e952668e8815d7d412d6f7a1bb93e83f4aa9e29554534dbddb0fbf22f115e1e36f06e48751e59a8313d67d94b0cd6c9b24e11497d93988cff91927f13404233d8cb2745cf4de2e511a7c209cd73f174188c83fe0e9c63e70fff6bbfb3654adede531c5239bb143e41fd6c5415297bdd3636e3a54d003b20153bdb939533fcaf16f6d3a5db7a301c2a2965fc2993cac59a19b42dc63c8f4a5ed3af7063bbb0a2ae29c0d23d6e1c45d9cd73d16b83f3b0001e1737faa20c3bb920c74eaf6e3f58a4ca35c1db22136f4cb7b0aa5a49c7734a34d70a0c56af18d526a028656e6d2d42f4d7d39f3f515d0ac4d495d50b096054c3ec74c8adec87ed2b2c20cdd56aa8f5d784e84148342979aabe26bfcb3986b6afd09a71225dc0ce11c2fa326c8161383212bd21b47aafac9a60af05a7701f8ca2b6e27f7ff91210052d7f720a0456844f1830a94bb1d9c93354eafc07242a272dfd75feb5c8d1716ab6d269c77ccfdde2079ee19efb5dea2c81d2e1316b03ee737e36463eed618fa7359e39fc80adeddad12c910b770cdd132b90f91a55ea62e236918feeb4a42ab5b9ca92bd263870cc8adf1de2cab4a19ff14012414b635b1dbe429dff8f2fbe3bf65c4e1f59671917553c7ea0670a023dbc54806ef648a8b2fef7b7cf80160f9ba3b8a584e7dabb8cd2475b9c6c490f8c0551eab1602a8de4250f3dc2555887543c68a06b60c0a2a12b60ccccfa8d5e09c2575e1ea917a5686d4b48b746b8ef0551daa3326f1cb5e4a6a38b70737dbf435097ce68b26452b5d56c931995fdd3021825153ec4c0bfc815bfae5715567a9210facf8d0bdbc267359d22695acb3439157e1c738d43e885de3d15a0c8e05b745d103e4b024190ba875857f113ce9ad72e43146cd065ac17248d86017025e56fdc7d44f4ece6b9cabb92daf25dd0e92e14d83eee4745bdd17996a448c13aa17aa5de5b9d1a0753ee664403fc5ec626de3dce15c38d6df7734d91d87a17d459b733bdabeb22cfaf96009d51ee859d42760ac4d2502a938ab06968cf536582f872ee5b9e536117036d7236cbd3609cb359949e810181d2e52532b0ba650d70f9ee4c1322c09fa427a19ba13194acaa6473cc31248821cf22ebd5f5d7f6704ae7ecc87cd8ba2e11d6224ca9580a19c3f18ea10050671895aca2bb1c88131f703ac64c88d31de9c4007ca6ae713fc5991e42a9276393a448cd3c6dc137f143ed4ed82ded4abf5a215d00e74d72610225ee8e72bc71ccf57207a2f8d01062e076995b6a1f0988e7e5887dfdd1f9806078f7c296c375953925da7dd0a4b30c4fcfc02e253c172eb887adcca02aa2fe355a7b7445d06e9f71a294fde89850ab2fba51303d99a8281095ee4bbe2576ce5c9d7b0a21aeadd25d8779a43b414fc4b5ce4d6bac558d9c1e040c796f9f0551e675832fd375a2b920d6fa67964df61f1e68a954afaec8044abd60e30d35210f8bfa48785f992e58fee3925050e566bbae5e1cca39ea48922cd72afab0c5e3eda043fc74d23691dda518812e462f8dac3a645f7dcdc071b3312174894bfb382fc63bdf7c7f9d5b371769bd01d63b614844e64f58ea50732037a892e7880d9efcb"}, - {"0000000000000000000000000000000000000000000000000000000000000022", "0004030f316defaf9df74ca4d571f86b38835d3a8f0e003d42f55a25c5f2a20ce561748f836a02fb932805c5ed5f87968f32d14f30fa97a8c84cb5dbb3945d07056576db6426f1f78cd174b0b54ea4cc3f79defc100a3c420629d717a55b9164a83e6e9467cba74d5d4c073e64031492c3686f6593dacfb48e1099b82a4f1837036f8d4eaf3bb41622a9799aba00ef6be78d3b18b8f0cce7a0692315e8e18f36e6074096549ce4c9000ead6f1c0f29438e4c818c315681b47df6f2d541088aabd003c9a5fbb20088065ad19ee35364de556630f766eac192a9a390c43478d851b793743ebc4fe831a697081a7627c7f493249e1db07825d221354e0206d8ab4de52cb291a3789124773e16057890bed07012aa8b6efbf77579d3de913961d869ba9c2f5b6b5a0e98712f48a4dd39c07623b5abffe9a9008c4aa8e30eb4fff8fcf3f611c92c9323be76bc42700015a60d0c6a6c6f3d08351269ef76785a447e8e8deb7d319d23711a88560b6760f7fe32a6e272fa21e4f132de61239c9fdf8b0e32baf920e24eab7dcea2d57c5851b52e08fca69553a7ffa0dea34ac53bd6930a76ba5a3b201accc3d9c9cb62d359543049c8ba737a43ff8782382926f6e611a7e55511263161e72a33849a7fbb1c2bd0fa6398d4b924d274c2c1f47f057d35794efd2b2f3c856b94a5f4ef495dd394886cfe1ced5db871e70da73ee9e4092ddf11d923284dfb2cf2c5dc37a8fc10bcd17be84b65b56bf974a63bd02ece81a8bb6b6d19ad07876e2dd7d57451e385ca1c9ee230567a810f1fd98dcfae4ee88eacf7126004ab777d6d19cd3d6213ee528cd1c895babc2c44d5f55270a2b785dbea9b5861778dff9a565769eef739b0ff655ebddf99a07b18935369318da2569d5352cb765b7dacc58a1a801a2e7839e6291fd7a10f93e31dc0fb0d9938592a4839011b0f3afb4b0534e51ca2416fddf3f5c890f0d06705c1d445f2776da7f28dc5cfd7c1a1addf5b3eca8a18fd2dada3da8987337fd278b82db151579eda43ee38b60ca56f0ee1c2a727f7e19dc828da67913f0cd60f03dae010ca7f075c423539d2e25b7a4114deab1b104bfd0dfee955856ff745efd0b510d6270431bed41dd6522857dc20798cdec92de84dfb4a9888ba26ae277696d9ae948ba9e46d749b91d6ccc16dceaec2dd0397ca4c96539528b5f5f612985c444297569674e819e6bbb983ca255c5ef88238aff4f54215a11a15a945d477af3d63852b622dd4aa657f9c2616b11b72b150d50fafc3286e0173d898e089637d5736b4dffa4d08af68a42b873e819161c5cf2b71093575bd175ef6211c3c95708a770b97cd1317379f028e0c3d32a9390dce999ebfcbbff9e019815930db0f9894f82870e52fde36a1e3991559f3cdf5a449bedd76633d36797a0432943863f69fdfefb2f0a3a805ef8ab3b0db81eb27f4634a8dd6187f97d1430a4ce7684cc4c8efbfeb219a738bb1a1ad57524c94419cb1d3b5f143fbb7e84d392d2ddb96a57f0095861655ea485a94241ec7100ef1be41a91a429feefd1247f75f61c697153f9b231a539948562bff157485b55f962ca4ea139aff0a1712a9cdf1ef0c5b37aacea28ecfe69ed62f5391d05313066d0ac7e6034f640c067d324d991a5040fcd34605edac20bd09ca27af68c77f6cc1a0c2c36979d0530fc62eb2c25e962944b1a428afa316a920dfdbc68e1bcbb1a38d4be191a38a12a7d1248ce4f0112cb3c46938ae654ded4a29e9ca86c58b4a423e714b5b9a76099f432143631e738579e29c5ad5ee8cab31cb6b630d2b473623ca5d008a217113ea168b6c694c252f322eca52b1c1665f87bcc394145e52ebfdf5103132ae3025e50f9d6c55b9bae2081d227099c7bb031fd331"}, - {"0000000000000000000000000000000000000000000000000000000000000006", "007c0779e65899914a5f2305887132ce6d59fd1f8d453843ae6ca8b847f3a04859657a79d3055dff8ecf1708b8cfe74ac0cea6e7f7ab8bc02b220a21bf13521fbe964eb52ae2fdede4637c13e417599da8f56e341a3882542bf269d1c662359afb6d48eaf0bdb7b03f31bc73c6c497ec497e45c3c260f68315a5f23f881a2b6596bf81e5af698123864be236244f3c7c7ff0553236edca5ee270e3c8fef886666c6f5f05a6fd193807b6c4b405f0dd6df1c190d8ed09fe961d389608d727dd54098a322e95eea025a345496a06b7a63cf0490ed6153f39076deafa13393240d117fb55fa9d04d8275b0bac9250f0659c9a046f24e4a83a74dff7b36c165b13766d91fdf5713ad7a6f54e4603b966df8bb020e00b3c11519b553c55353613e7609246327d934716e2df91a9166ca11e7e31f745dcb628e58974fa9a212f5f7eff13590ce3dc6553c749583edc4859c27d013b64419ba28325ddcf1761d4722f2e3c733c839d5a3b5bc7ffa24ed58b10c63676b3071201c7117e0732696215dedd240572b4946852684fe55a3b9a30a5336569e36579f1efd05d4557556ae49d7b3c1205c4042dac08f319e6456394817a17d128e0700f76d29511d13b4c7b5cb8dbec21657305bab5ae4720fda51a0f86ef9a74f38f1be70ba3c29d6f77c98e9194412428c8e4c2884afd3d03e71a5379f91e8ae032170ccc03d583fd231518a0d5be37caff7b694e60a79e96eb0ce0953243cf059ec95e12a47456fd6a962f79fba40841489643d3733ee64352b2caa43e5136d8d99c511d093ab292dbbf5d6065e2d80b9e6b557f73384100099488c8abd9e1c9e391d0d886bbb479bbef97393a1011011e13a234c73ef5724420d0fcd26e7e99c0800a7e2d1194ad9da7db46718ff3c056548b820b54b721c18ba54fb9cbf3f7d8f33ae31af82a450454a67d00d37174ae62eb6130da52dcae17f958e4ff2d21931d64174fdd4a66c33ac4925b473a4da907885d3dd30c11c4e32792f5c0c79713a1b4723c8917b077fa814067968919912c71e2f587963cc9529df70db356910a4ead4b34846acf14d296e9cc6bd555cb697851d614133acf2155c891e001654cbdf0d8cde63556736a1391162c5421b23527fc8275ac7369add549ffa47322c6e3cb45d9fd2da85e53942733d85627549590a701b72818f5f2723f9ee0625b3f303a5b00533dde4d1726a386538bee79c838d58ea138b045708a7830250a7de278a4b94949d677b2003ce2b8adbd14f6e1c10b7afdff7246d85453bf254ca14deef310d49c13bd02622932dcf163effe4200ec549e10e0bdfd7b303e2d1c0266fda0b9b71461b2f8ac4298b1e0d417af6c165903ae52f98b35fa038272971e69b6058896c1132278d16cff57e0758326c2c49ebf0445eb32b9542d0134615b3b27a469f93944718efe20972fd17994f5061e158d0a25f09b621e91680a280b8605df12e8e216a739d2dbe6b867790ae242597a61e0c0c8762dde2764c365570c8bc0a3fab2a82b5e4f8227e176b55d0264f666ddab9deb6d3b42caf9993b39286fbf49d409561b473e7659cbd776117ea0fa3325b31e1d629832167c7765f4b6b5ddcec89dcb5537fbdb81df44405f535304e55deb6b838566c20b37dc839ef13ea11803999dfbd4c999cb018006dfb2f256a20f3b5e062d2535d1b58d541c8eee061556ccb7bc3d8846998348184cb4805348760bb88e537240c949c8f3708ae514254547f0fb57afadc6fb9754c1f877b24e737903ac0b31c3bda8d46d6946920953ab745c7f83239d58070b7cea5f7ade5bb960bfa201243aed52cfed97b44b17a4cb2e140910a28c74d1a4a3ce0149e5fafa104730f443cdef95c336efb5754f7abb30c1c0315f97b2"}, - {"0000000000000000000000000000000000000000000000000000000000000003", "003722b77b8537f5c469d0e521551b484a0279cfc718434a3e86d3a77bb738127d77a00e45432731433614bf7ac9b3f2d2fbc36bb193fdf1fcd872eb4c404f2277ac8977d97c28eaecc361307c6b277786fd62cb0844d2069d8f5d1be32eb3235c2117355e543f95850bbee1ccea0bb485c0f33a72385a355ac208bbde970f070f95c3abf0b3785de3f90b40bd7f629b9dcc023cf362029c53c40d1931346ac55f1641810fb076960e86e7f919482b5e8f13a3e43c61606d272a7a952917812c10a51ff2f5c94e0572c6b8744d5f9254bd2f3e2f867ff69b7055e44c8521954967cb1e487914c05f455d7be7eaf1115935276620f5829a69e9f3c4a31239bf92b8ea9411d7802163d6dd8a24b68fb700f04d13e36ed4d5ef2fdd3449ba9cecd24f4d1cbe8fd61322cceb94ab1875d76891ee4c550ca2504373e32e2420cc222da96719df87d32319b68c5149897127e00586abed611ef0ff0ce90171823371d97bc656be8c1df21f729e289bbff49b45ec95c11b2da78b1e042906d8dcaa26d95cc3aa9f755d92644095e902f692a63feabfa5226afd4758fb848e84f1bec14e73ac397608815c7d288a036868bc81fd7e77881d9d8c8fe64c11395e283b1a74dbaaa40940b065b16eef53d7bdae0a663e902e6efd53c2b923213e44ba15d62ad99cbb1705c6c65fa0c09fb8ed720158681fc9530478c600077138e051121519a46cf0ad2df662bda3ef9f0b9d3ae92d19fbea5b9d823ec4f846cb54be195d54d6670bf4e7f8549eed7fdcc6554083d069ae1842350f7a1a17172e5b19b32fa556741f6a7e7aef1ec01b40f80e0eaa934f690247e90f2338c733e091d0c333b9f70fcffa1852c64e8cccb4b24e1c2342f4d5fbb842a0145de19fde995c6dea095218119c0fb212c3575eb624ac8adc1289e6bdbc7c663282c807c9edccbe354401460c0c5a22c31fbe6bb37c22e259c5e10af1cf7e0f45888fa25b76c9559952c020507c4181e995def51469a29a98091ca44a5e64e5bc3d60b7300b5dd32c1e307793e65dfe8588cb17a33a7a8fc26ce33c478906ba35f363a43c0bb394c5c9e3501e432a11fb9d580dfe316ac806a2dd1b2924d207ea761a3758d239ca0fd7ce93100fcad18b79343889ef032ad6dc984e7a2396dabce695e9b5f5b417ad03e890fb3a3f3f36e104693d1665988c577bf0c174e8486a7eb8a519b66d284255119058a733687ca6e90046e1631a1d3b223b05e4d192490c5d14c40a6494e6c8689d5714cbc2bf17a63d5c0206c452789315270671ed6b7af9bc473e0a9fd16055da3265c5c4d2dda07be40ba3c5be09ea11f5e7ca40ac73c9743ba1245e09b4927a54ff017519ce0a632a24e0fb773304b509679882a2bb3777331acc411f5b93708cf4d499259b4a09f3909b3cc7ea0328b050b9461bf12a6215f8dab129e5c4c8b1560910e1ee004d4ad22138e871da837ea47496db377f7013880776574d96bd9322a13e668dd00ccffe8c409c1dfd0d4ab6d1672cbd3e73db24cd41ad800f72061911f5a55802e846775cce085844ec6e1a3fdaf367a43b3dcc57c956024ac64bd66975d15ee345509fede13de83e3377980cfdb6834509bb5e514a005d5de8e0405605a61fad1db5ba44e4ba22f3f49ec7eafcc04a133487243dcb85f97c84617f53bc52fd5cfdec7c3a29606b8081e36005ab4e6829f662d2424c0438cc5e200a27808f908b85e907459c5e51c172893cb942103da90219d0cff6e4d046a42b4451b879605ceeaf8b13f91376601c856dd97f351fdccc84a3536b1b03e62781aa73412a4f456e1873dd357e0d3907e9572fb33de314a10f922257ec0dd5573ebe5cf9be23787f133faaaffc931405057f8f946cf7c2d9114f7f6be357"}, - {"0000000000000000000000000000000000000000000000000000000000000016", "018ec6ba92014dfd68d6d702e5d92f8612b957060628b6c1c8c21dc6d4f9206421c6e67882bbf77b1ec71f7db235daeb8403a501454718ac7d1b4064ba14bf304faa7d6e50073687615304fe783834f8767898450764e545de19a3c331ada2e6119b1a28ce85683af60b7f7ffad94345deb15451f089f652c5f3353684790cdfa9cf30d288cbf8c385fa61e6d47e5376fbe2c434b7cb21dad7f06124cd848abb7842c587cff7f0bf026a6b75558533c196f21419c3db0cb1e88a3fdccb1163a39a0548767fff16415efed8b8b93a970c35ee04b924dd46d87a6b71c3633f04226305e52713101a167c5d52a0fa2ec3ddb7746c86b8857a102850f9c205a8b58cb60deb23c33282a2e77f80411c9fb517b30c247eb508cec00d67c451bf8659d309ba962e974526fbebe7fc582fa73f08c55015fc738de47096387a32e9fb691252ce3333460b9b2c732743480a7e447a01cd41e810cb2e292f18e1897af3b975338ed3b949215bcce013d741af5c8d636c536d725e2cbb1466420d6e08d1f4ecda478b12963e96f6e67a492fd3823213497c24035e07f957fe11f613fc61de198d9651c2067e451d63c8eb39165ff09030d1630046c3d2b1561f95948f78ced4f7019ef5b272634ebdd1b3fe319807702bded3432745453266332e650e3b2245de303039cf6eae27524e8771afe3cc19c471924320de3bb1033608e0bc30d17da136229e14dd44b115e50e85ce31b704854ba97a278d86f57517ccbd42694919df20058c84492fe2a8a93ea0f76b0e5c302b8f51df485320834fc9a09c6c7378f0327c0dd85b0de1435a931e049f78d6044afe6bd4e1716205cf728cf95c924210218b81adc0edf99bdb46d4d3dae202dbc6597f679d1870bdd9740a3e45aa2bc1c0c453499942a5b5b41f1f3155b9ff60432751d1a4dc975018ddef5197e725027df477974633706f01d1e543ecdfa1b3d85e3c7b06a5bf7254d3d9491966f3fbab34f2652698337cfb067e3d3a3459e08980afd759c6eb7365de13bac7a03fd2bb4731aff64be614360d3c63796e0984787828170af98c8ca6bc73b716725ffbab80566df27d99911c768152ab507a6562c5436f267f94f25713dd0e571ce60c875926a739942be251e0c6d6d691cfd52b712462c48e4692d9c0ff650b67eb7de3df3d4a7ff70c04530304e593c331a7a8e113bbad358dce983ca5570542cc5326ee44277262b9d70f59f62f29451d666b315e4380e6ee91d1a86463c12f6a6c1199e353f7fd57a507d7722bcacdcac31a43c1586ad296c15e91040a94786581e57a1555701413a2e7f34acefa7c2e72131804b60fdad673410f138500c4dd828ab39fc1b8178365a484e8e00fb62cf2c4d4b2e87da72a7f63261a87555fe867c09d9837932ec8fe5309192d8b65a1029eadcb2b540abb865ef2aac5e3ebcdb9d259f05f169e8d3a1f54187d87c581f0666e6373bc471f41901b2b5bb2df66ddcde0c6e1e496d9ca552cb78b9ae84788dd26fbe951fbd28296cf6846e72a33de59a64c0c2d8cfe76e04227181613f56e4486e99a78ee84da2b5e735bc40c145d33e324b76f628359e8e5fec02e123410bc258af427bf2184797bcb71ad8a8852bc5512bf3481384aa648f884e67ea9c1198b844b3d80830526244a544e52a690972324f827e1324a84bfaa2c422cee4315612215327a5bfbc17b79f33dbf1b42150ab782627f04a1543acd75b000eb40258cb3373ebf23288e5504efde17892814e2dcdff8f98265160a7422e74fd8a81a0f0daa8d677c63cd53525870db92fc4fd1b5311c1eab2dd21f46970dc8f3a5cf48aea80a2de535a32faf987594080a3b8cedb1df985a3f0e1c6ae7354e789d8b272cc2d76b313fe0c32d921a121d"}, - {"0000000000000000000000000000000000000000000000000000000000000020", "00830f6275c3027f210387bd9a4ed45a46257cf51a3dac95cc53641a75db5aa511bb38374e2ea699581f1723f93ddfbd62cff22d722ef2960ae65bd95c928022906b5fdf6469117aa97283651da1855e57972fed03333fcd0a2446c9821aa50f59e2428f4ae49bf8230691f2fb16ca48c7f9e44294cef8e5860a5b1e82e204da5680932d6f6ddc1c01809d95eb38e145d7fb771bdd7e877fa3281f41b3858911ecf1debc2599533c06f2793cb29bd029ca0a217416531fce78813b679c0eedd685cfca0579d1a8b4d2a1345fb652b67cb2cb0b5cfaa1398b54dc6cefa269a29534f6f1449984991af8635adf489d35a5aed8864762ea0ab057d7747407434e2b9c5a084dc0d3d1167bcc0199620b6e273f0f236516d5fa3bcbd7f466517a3a03fa0ef3def9c1134a21b56baf43a3e4ad83e41dceb08a0956d8030829bbf7964fb48855d45754c869ddb1ad32d23e2a18015c11f4d903cdf131df70e86f0e9b7306e1196ae201b01d76642af6797f31c078ba6ecea9c6545c02d401d2e5193b4b275124982252ce6fc6fd4c4b9ca74e3a01bf5cfdda084baf94a59753dfaf3236237abe4809c630ee6aa6287f9422911a162b82ca5bcabc2cf62ed31fe06f5aa37705664a3f1b63e246b63b7e84171630bc4fde0ba87a76df7608147a42829bfb9a92a21efb64494a1ccd672980aac73a7f727b250c3f7c5c05b50b99ceb3e313d03702f9fc9e0f6a184e10d096133f1a847839bd1fdaa1763fe479ff6374569f907c2b4126cea5e219ab452f13803f40a5ad2ec8d481923c982288a2e03f816a24d51d9430e06a35817240a50c0b0da11851bc53f74bc6eb35d8d739c7ea3ce7f10c43fa0723a142cfb85563db9a5842e959c1b9910712838999915ebe057a89034d02723cb65919d8da4f20477fb16390472b12cca3eecfded97fe6859f87a200bd26471fa1b78fec2e105a684965c9c5a0d071ee39fb5bab75508929c9f7e4b26c3cc931e7f49cb323135e90cdc5d52bf8d0b274c1f37c0af9da14fe6bbcab8075a0296b3dd9fd40bb61cdfe397f1a299aae15030fc20f3ba853779076e2143e592ad3c730fea0c43224cdca1fdff475858fc6d8997daf2dcfd1f6b6f02af4e4d719b01bcbffc284ba4a52e94abbc4f790782db0ef4b4a6972e5aad833d0012bdf4d1e0b8d7b0904a5b57b9f4c833c78026288f2c1760617355ebc993c4cfa7ca03312afbf3b95ccf87f6f2989a0cf9ec824de04738092fe6954cee2896adfefe1ad80ef326a39f595622a4f5c63f21c67f0a7f8502a277d7b96490cd304e794d8fb539308110431178f16ab0578bf7d157b01f93a2b89f1ec6943a2c7af4fa525a45588e312b126bde465cae77315b399a87b35292f433260b1352ecd29ff99329acdd854a20d4c10dac08bffd4ab00c85a016090129566d9c27a3623bb1aafec189cf71519c934da0f98928b66e49cb43fefe665b0d7128d0e689293f0cab85a5c7714ff184737176f911bbdc0184d7ef5650db672fccf435ebb53fb51e3e3546d52011fa43fc3ebc923fcd412deeb32f8a93aa8ef052125ec39f56456e449b5844520463e1715548818f05315b1559d7321ceef55bc52e09f999149c36b0ea4e72763b3f1078fe283f518f4576561849726087ff5980a07870512693dff75ddb2b3dfadaa95a9940e6dac1584cf717bdd8653e53f44a117dcbbc94de8d765630d610c0a7e1c490940163135116aa53d5c6caee5424c8985b6b2963a073e3c9524d3484bb6ba5bdbd7f6112f959b876c6d0def13566d3069a64a23685722781246be504d04c045dbd5c236cff366fcbcad29268f137a7c457754bfe2eb10f30d816f315b05cd3bfbfa3830050ab46481416eb4e738195d45e266e43ee698"}, - {"00000000000000000000000000000000000000000000000000000000000003bf", "004f47f15f8a883b31d12097f23d3d2d0c3717979248266c9ef992ee4ec685f992abe88cc6ecfe97eaf404e2d89968212109dbee22a71099b30a8d0a7c2906384a43ed4bbd41b9f75924d8ab38060da092d3e83205cb07218d6f75ffd7b238e1275fe1e6de757ba59c137c548866898a7f081f614f47970541a675d4f5d7062393f8a1cdf98ca4d44168a690f951652914e044128c99b90288eef5da43b302f9651a8af198babe510641e63c2b30f2099a6911f8e6104f55fecf70d96c440fad23dc2a582fc455f7ad90c467a2c5fc97fb172a00a98f410ac29da7a744a6d375ac2988fb6d550046f5f53b90d3fa3b3aa386b7ebd8e372f1dcbf335907103a7384d775dbaa2963b1a172dce181da5d78ad38584f2860ecefa5e8c993c39f290809ffdc906584152a793303735e65db65e169cb2c8354af8496029854a19d359f72bc6dcbda55ffbeeb5509d220393a78013bcdd194d878397fef48b51468acb34a369ce4b70a46bbee434413151ebac7711ac576b644ff97568301930043360560913799223d18f90109ca2bb80fc5208b291c9389451d0cbc944b785d5595c598fbc2cc119ae6086e8d460b7433837660f15c2552505ca02e12b207bb0fd19fddab1156a37365f8bdb2ba563d061bb1a6facba58e7b673de25bfc2d5b7dbede5eb418524c0bb8051e2323c5c2999920dfa04b41cb7e78f201b9bf88a0d7a9e17384d31ed7e7c141e8e9b62f291525a6c7a849ae9c7844238661bd1436c2bb3f23df0bbc4dd14c4c1ae3846f838c58276dcce995147b7830320feeca95936bfbeaa3bc4eef8f90fc5fd4693a0cd8792ea6940b4993f0955ca5cc38d38a55be54e015b56161f7b99883defc7b10f4f8305f8010bf61091e23671ef427107d567ba6813251cab26053d81e194d5b7344f29e679f0bf5d58c9c50f23e01ac94e745072186f8d5c2be7136d49459f64bc031aec0b3d2e60e2ef48152d117e9c173c7b61a76967a1594d74b621c5107f1b50e8623070002b06258d2c2ae571f83d548371fe02ed806a39783851b244af352d40b7c08a5245dc2f5ee4aba0918d025406f35dc8a5c7717ec55305ff4aa4d1b43d4e4503571294768ad8906af41b625329d86395f947d6546a40245e7ee56259ff9f94a6b2766d6b2f224e5e978895da24b29032dfe1d2901093f1b6faee481a5687cd0c4e21133055514cf876b0c34595fe81ada4f19d6870323e0742b0c0158b2f40f4ad586f2a28a478caac17a4ee97212ea2e3c756b2ba9c3d41ad8d1d5078d489a36c7e57231a63eea650b74a65a6e46ab60a95ca1cc047a3b9077fd7d1e850c06db155b96a68ffd9e817edc6b5fd10053d26af033ddeafe2dabf5d38b4633404c1cfc6a18013576f75a6cdbf9aa9a02718d478766d2c7f531e5a6b6db8008111be60e486de2ac91f47ecce4c4ea36bffefda83113e990e5220b2d2d3a05d409dfed2e90e479669c0927f2274f99d358d0c973df4e3d7531073c39ebb1303cdb28ae578d7d4a8e641fe2b100fef83b3c52cb172ca39abaa875a173544513dac8898aaf7a394b742606f6bf6290ca29d7c6242f14df2cda44d1b4da401d3531ba5f9072b2ea6ae9ba28e87a52e2d95db82d29e214b98c10a8aabf1ce53f1e49d7fa2b23f3a5630a66f963b74812b91a92524ec5f891f8ede4e9ad7a2cfa9d5f44f2abd7beea44047a340d429a29f5ed7a231f5c50dd9a6344fe78629001fb0a8dab7855b783585b1517ae97791d9d20e6376a487eca1e5bf2b27a0e37e967dea3c631866a539959294be9e8d81a5a5d410f943f33a56b3dea8964413f2e4d8e87d31be62c3fedd3acf56c0109863f57b4bedd09fe7d4afabc1645d5fc241a5891131e3a6a245452281fa984be4b17"}, - {"000000000000000000000000000000000000000000000000000000000000001f", "0031f9e6e8645e35b05014daeaf5ae630e121eaf6a01029d772831524df94858acc070f4568fee3c286411a24c5403c933ab239b12c4174fec6f134759ede43cb5f3b91cd54bf3c3052484c145dda5214d3d3c7d06a85b188caad0e79a7462bd8bd6c553701a9e33ce2904c1fc8ba89a1dcd69d6f67a7991b7c9effeaf1a150db95625a793cf6a5e4579e7dc31927d26ff2ce62823e3934b54bd70b11ef3985b2e260d1a67708eb3041e3d667f2159db0e15a2206fdf23154da99848fb096cbcb40e876c6d795e8217c3a01014fba5dddf7a0b2f7e9d2490b912fae6734552524b3dcaf0baa8ef0e4aeab9ee134ef31ea6b1e09962fec983416e1f2e05daf1e915a44791a854e61c58db84ba9e83da727a2f519c72722123974b82081f47e43aeaddda1e26f90e35171052dcdf913301a7909dfdf236b050986fbe24d78c350b904c28f7eee297384a7721a00553a14603e835c97b8192c0d87f613365aa178499928a1f101712570e4f8850ba60e5f781a53cd13e4c82194acc15b4fa52dcdb85a7dd67f3654ac72aca0dff1f42c41af3f9204f5545d551fa763682b8f3d5ee5d0fa85d0be048e04311fddfd18406004dea1c45c0bff886c9141a4eac9b120e43316765e6dfcd97b9bcc79cf1ed116b81de248d4013a06b227daab703b90e091dc1a1173b657e46a4d70bdb7972daea582fe4d0c433a595067769d385e378a3c64df0e7240d675e0221b0939b0fcf50c0ef9e1db7111c025e90ddb70cabe38b4ec71303a324a35edd81bb99b6709fdea69d9c73d5249d3fc744106f1f835d902317eebbc244721f94feca3113948fbe91a6ebd7be0fa360101efec73dd0fecdc73527aba73258e6076e44674c93d9b4f64754b75a3230cb5e4260611f976d13b45bedf1bc3531b5eb43674b62ea6bd6a7d85b59db066fc959a6d60b221bcd1b00ed31fc0c0798369a7fe147bc513f8131e57410dc01741edc91a9638b6035404c5137b7df7f4bde1340301a69f7fb62cb05271b56b350433b8310197d331262b9634ac06498f1cecdf80f344b8a87216a5b30300a0ef8e95a5203b8b895f5e01f366d55d1555287b939f66502ea66ec0b4dc2f8aba1fc8a7afeb03bbea10f750344b60d11ad57cfa30b2c3fded95bf378cdfa20df23f7875fb119c203c39aca435c29cc611bba7b026279a91496c9d2e783c1d417320fd4f8a907fd1948175d643b2ac54ff8bac4bf037a9d773054bf18a00e75cf8d168e425d2a16a1a435d15b2153efacbc2f2809c7ef5b4b53212c1053c79cc390f92a1bdc4f5107c72fb471143167fa980143772fd446d96e7bfd290f36bba4a70e8891d8f4c8b0826a3f5ba4e19d389a1d4776a0f32e753fd3d7a40c3abef9a5f40cd038dd5eac3c7ad872b669a4ef869d4c7e1eb634d5929d680203991f58a20f5dd70dd5d79f35cf35d6762f0eaa0b704d85ed6a40598985550bab7b5325e0437822be094caf8a60c3ff6d3b8451c1ffaecfacca92f7b3ff4d5463f5e32e7b41a38ff8f5cb7ec73253691e619003c5b6177c0c195fce18c37989513fe18400f00aeb1339d9639277575fc6a243906f71aad5adb91c29380480d1532588b999722de0bedbcdcec89651f796364a7ad56cff71d6e79e0857155bc5e0535b7dbcd11b04739981159dab2bec07b2f967de57735e3f9b8ee710c36544af8fa84e7f5c428516dbd3b934d629ffdc0daa17de278e8953ffcc93828aa9725503d7f1d1031edfea2bf20d5990ef4f48e356fe3902a9f3d7f8e21903eab38a4e19f4b151727528bc1e750363f6f3f5241fea13028fd6d910c3235933eeef59129cf3fedd2feccfc3a8ee94b9ae2fa7fa44569de21d50516e5837c4ef18f1e1fe8b5171b7a6a1d431ff110c9dca0d"}, - {"0000000000000000000000000000000000000000000000000000000000000006", "0053769b0f2ab8cf56de834c6e21de00dbac896b3b3b94f4b16d945f61e609953053aa7796acff7ff73100ed25744a11099e9f0d822052124f849650b7a6f90a976d1c59ab4a9bc0e8e119a7c46695fa32b113d910442a6644d3bc1570f7d6205e3484ae5fc5ff0ea91cdd85e584d2daeafe58e51722af3e1d4b2a9296ad22836921a219ba70db5174af187705baab1af944e02512dce59bd0549c860a77fe3f5c335b027b38aec70e9a888c3a8d8127571b9165c53448f502cd2a8e411d5cf1d935e4b9eb7349868b85fd859a2ba47f9beb5a6142e119a8f081756d3a13d251b5cef895fbd426700eabab991f310ba3bff72749471d22fb539a003d27c6817ba8d699fbac2ea3b5c344e2c50c782f662637aa252e1e5662a2e67e15f5dd6d4395b5d4bdca953366f550e820f311b2093d0db1f299675a7c9bcb013a7cffe25bb1031be800065961f354d5972a34e87b024b9d504ef7f841ea945361fba51b510be6f25d743a48cd280e23521d3c52a4030053a093141b9a4a010f8cb49ca658a222de2744f5a0d0791e11d251c21310d4f8d790d14929e6668144b3450be8a0bcac25f8047184ff42951e27be4c963f63d4d1cda83d989d2311fdcab09786b8197e0301b82ec9b7f5c34e531c4d04e70b0658a21e27dd1f828fd741744cd10bc7bb2f0d1c69e14e6160df0f35d27951b912e2f0863e36bc038b176e36e900e3cbb941021a6df9e4a3f48d636926441610a6c9cb490a16e3726ddaa8467e9f3cba5016af8653146a320dec98f49b7d26519aaccd55e5ff19ef9aa7589ccb616f490265eb195cad00d5123199190755a7e5c7ffb108d0e5fbbb3a813e0f1096cbe727e9660b718a19f9876db43ab2b6999531a017593b363bb7495e58b9a5c96de4bf7ab7d92d48d213ca2358d864e23fa19661b9a8984584c6c7264ed2ba57b8005c7acf5c9d2c710889ba554ad75172f9caf9bbc77380a59d1c641e8dcda8c73b2c46ddbab4b057bc551e1022b9088a6dcf58b9b235eced236533ac4d9ffc5af8d489662c22efa681a9a0f769a7b28a387cb55800b23b76ba910e47f431631e4bad14bcfd991590c01bf4327a7ba46e19d6996519bbaad5e587cacc80fe0fe9cb00e4888caf19023619dc62003a38f9bd8a2b1d195d34df8abe0dd317e45aa8da568d97ec951873011cf9c9c449bf4994111589c67d8dea92b5954be21c4d7ea662a0e025cc8b257de573f6617d227f340c023fa510359ec8df312d60e2b4a56e80bddb50617b06dfe491c28a57933ff36316cca0443edccff81d7f056ea897f293714b5d43f39da5d3b2610aca4939b512f3c2ec83c6177ea26a8440a133657e4cef5c3b351439846c526b01c9a7a1f1c4eb60909d28773397e942d692c117258bebd11a95b2a5d63ac7a4c95d565d038e593990514e28c7a8d0a1912cd639f7a4fac19b3ef3c45e18a7e3ed733483f974d56c3e5e5bd69b0c082189d34d142ac3785dc562f03f5aa565f20fb4e91bc5f6143f07c2e47f0f826b5fb8f53344153d29ec0461506efb8f086b6d6230f2349723ca59aa9ab1f8246d24dfb81089153973c753774a541e299fb4e0cc0b13abc6b69bd6fd04b8e890d2f14bc28b33d9f8de37894c36f7dca4caf5bec7acd46e0d8a88855ec3ea0842491d6e0c67a4f20141964872d2a0d462af533a0dd75bf1499c1c955161e259966b8a27531dfb42350b988581110466bf230c71a17362893cf385540221105a6462d74d501b84ec5203b96afe9afc02bcbf090b3451d38108f7c0e5375441e22d114598bad9a71423476ba5634c7f79387db3660d2ce4ad96243ab78e110ae5b95351b3533e4d9705b77dd24b577edec5141d4075b1d8d702d32761663f383709fb137e5f50f1"}, - {"000000000000000000000000000000000000000000000000000000000000001e", "0049495267c57b1546cea029f70e2fc48e49908f3a01843e2f0796e8e0d472157fbec9a90247333e22a108fd27d70b619297cc915527a4c635967502ff0712254c46e44199cb235e76e604693a04aa7b4bd4ebb20e7faabb070ee4d6e7a33559873b1801b73b7312ad18504f22f763e9afb61db1ea05cf3024ec81cb42f223fdbe8cc8da8b611cca43516efb968ce3a132782e36dbc7396f6278ed4f8816923853a151c6f01cd88700bcc256a2868670bfe860ffb6d52261405d9401f44c1535b479177af1c636568611de408a556b5fcaf00aafd3c5e005fb3de8203721f1c4db7f327d1b304d3c7d0cf862b3ec3dc89a19794d6b62927a97d9c83d02a08ee56846d7c437dde05c92aa4e81a59fdd97e324ac0db35476e9b5b79565f5257dd84f4f237e31c40b6b1a234008934f43f8a24ee16e8bd65fde97c6c5337a4e2b421a223de5b3a618c26c621f62033fc4ab010eb966eda13b75ef31823fc4d70148ba911cb6744d34bba0659e26394a387643375e60422a0ad4de3d136769c12f05c69d5675741b1c20f1e95f4eb9533745fcb71047b821a9ed87a4ea3a3cd973c5865e4c4c0d8615f645ea9805e64813c900a771dd120cecc4f01089f8cd3f260ec5a5d4615c44ab47210d7d4c0d4410bddf6c3108e38f9662e4a92df3d9a66ff279f0c426d902c9d124dded451e235ae8b4e9e27371d76d92050b377caaa65209d27a13f68d2f314df8a2599d3e15756178750975acd5eaf4f36eeee8d9ea931305bc274a241189ef8635b4c6fabcdeeed55af641dda4433d4c8b78e2a9e77f5e3aa802ccc1e9c695573a996c098b4be66d242c633b20710ab5a9a38ddf3fd6151f2852b402bc0fecbcff6c930f71ebd073061ed83ef60c3a22c24b4ffd38d985163777dbc9da97627e17eb52ac642cecb13fdfcad2b7decc78ce9e1e9df511ed0279397c20299163524ef703036852d7540d3fec0e06d6499934dbe831d998f3ad9ae97b4210f7ba705618df8fe1fcd0470d239dc1dfd25d64b5d54cd5669c31b8cf77af56c3a99439774a137186a762491e48b104c9e7f692c310c51f03307ab11cea4dfe817967f207757d67c20771bc469862d3d96de570f9cd2b4abb19d6640ab4d71f8fc8ebb3364976ce2a281fb2fcf574d703ea02a26239354ed9e092ebc9170da098ef460416d4bc504fcad4ce8f76c0936d93be273333d5eb0896248c98b36d99df3e71c6c896db227a2b9a2add1657d913f120d285e493e7cc9045bbb21264117a21695baf6b08616f8767e86907af59421eae08dedeb30c3f5f48ba4bf9c8f36370c5057166783838b1c8990cca43dd621c8d073aa8b42430c441ce87fe7838a31e92b2f9f7288c917ce80dfd997d030bb9e79f03e42f0cc3bd9c55bf057356d50cd753c9cd73be9ee6060409b0f76f2d1d85b7e2d1ddb2100dfda9217476140d4c5e14fcdd67cdb85313dc0cc6e173431c3c2fea1f9b4bcad8c9a36b29878387a2ad17125ec33a2a5123478454f98bdd89a273a58d3364a23a2b8a1d0f2504aa042d2bd06eddf42a04e39f69013d42fb5f8d2b1718f2065f202b07cf12c1b69f584f618f5cb93cc20ccf036013d1f77d95dd0257a23e14ea7e80f8b9a71d3e7f2752530cb4eeff22ba4b4132a5673db25cbe045eec6b69418aa1c037a114fc18f4d9db99f093c209d1b10bf8082e44772b37522176e4d60f2d1abb8415da35947c8bcda53a28d35d4741807b28f65f251e59c42faba1b39be1c81e273ccd42e87f6e1fbf935a05dab6b10094b1caa654a30e7fb895bcea386af68b12bb7e7d4bdabf64fd8d163fc4e78ef5f7c2df555808498d78c9e5bb59f9ec6a344ee8dc0fcd73bfdc632227b29f6b63d7515d0e126c1b9c8699ab7494834d"}, - {"0000000000000000000000000000000000000000000000000000000000000029", "00346c46f773deb7cb31a1fcb128fa86577ffe731225dc3ee84ae1e513fbf905d6d3381f42de6cffc355104e1d19fb5d98c934ef3310b57568973aeb9d3e6e2ec80b35b0e04a47f7d3c5b384d0c609ce94f37ac3080ca5b653924d3ca2ff31c5bd377ab4ef8fbdd18d14c3a9aa47f9d367d6c3891cd06676bfb6339ff2dd125293338790bb39314f69cd39d0043eec4a19cf854058bc3978db881d9cf976d0b877bf4a0d28d67ccf00752de3964194ba3daa66287d5435a1d12b90c4cb00fbbe0be902666fe08a051c3759089d70fd56fd01244b475e76a3c67fdf5c74041c65417d336b32442d2732448b4e5f055362e4766744b628d1c89d8e52ed01847433f7827e32c7c4e059c28e6364283aba6e990f97bd9da5116cd3d728017a8f7d7f74fc10948078118d27729d6583bf49f4048f1cf894c1ca90b657a22f85bdb96427ced9a926a40b0e3604167e13d9f2500198f9ba43d7e2890ac4d47b2b27dccf9a737dcaed21e851c88ad765d9f2a3a5218be71b0d623a4bd7930a294afbb6323b01986f332b746535d1ecf6959252107019ab428a82673ede33c7dfbdaf7dbf605909c0022f7e3ac3573c477d27e7a95674d262aaa2d79e8c0be7a5ea6a031a3443dcf1139bb19b80579019e4a5047b85b1a38e862e96fc21502925bac11fae51479c45bfefa7c89c2c617b5294c8cfe6b53582b0d4e9c0019dcacde633be57b154612caa14c7544ff8dfcdd808cd587d26cccb3f994f53c580f497559bddd9ecdd07d88c46af03e10a5ba7d141f78b0dae5a62b4d0bd1bff020a7493e94925f451d6029c2f2515fdda6aec06538c61f7c42c07f8bb90f0e2e69a9ad966170d42077e8cfe7b61ed89232312825dc08ea776c93c6a920bfcd5ef3be76709773140dd1254b2e0968b8f2bae303da4e147176a37e13c03fdbee2c07d6aa2114b4102054346f3d2843fdf1a37380d4b3ed20743d2e7a73a3f8d44d7f0bd099ddfa659c25f27130a903ee7170afd2aad1f1d4c5943d191960ae52a397da58c8d323923ecf7408ffd43bb5d29c0d777035ee9c85874350b3114c30551e1fbf48cf64448fa333ee74b1b2de3198364636d0940b9723312036d3bcfb65482b8eff012612eafbe84ca4d18ef019b096ba31b27cbdc56a049cc1afead9edcdbaaf85567d7f63a2d9336bb5bb1044dd65b270a09931dcc1077229bfccc963a06970f101b58d5c90a07fe78dbf6f833f4ae5a879377c45926af1cfa451885adeb43132bc4715cd975953bce394bdbd55523da50c9a9c4057c29d848269aacdc926f05016b2d51b771bdf75f518cae231614d97e1e443413ee435b7d9b8521039194b28137f2360738dc6f430a3dc3ef13d3fb5f0441a40a5f7d10811043aea7a5231d35bafde571f186b8f6ff60622342ee8d3f9c9304ddd0855b661413bacc03dbcffd45b143cebdb5ff1e2947f7860c75bdc50b033187e9b444d3441c0a6010a08f5ddf17b417edaf115db20e306505f28edddc56276dac60b4f5d1aa0606a2c7b7b866ccb89c1e71057c97c798720b4dd42126e325f4aea717c899b74705f4103127c9c1f5eeb4921d3db230fb4672bf493a295cda244d9df485f04935267648dba1d10a552c8f324c11e1c2e36959a99997b4c9d4d9462a2fd6991f06cec44cb961b1e97601e534e7e8b7bee52e791d831d6a6660f89817df52c4c2b4fe4c9f0d5f93ba573009b86505ccd809cff0e3950df9f7ca5ed37a5d91ce1a9ecbdc1f1c5d8ae91034b70c31535718bd9ea4fd09c7aac4bc55e9ecf0a20220804cba3ad7183bf52b0fc95fd0f90df0b9ff9a6192961e7261320991174d10ab099c635406936570428cb498131dab2a5c41d61e4d8684a454c3d5135ad24560454bd9dd3b1a9b1c"}, - {"000000000000000000000000000000000000000000000000000000000000000e", "0043c00c93738ce1e4352b017bdcae3f75a1bccd1c08902516d4101534b5c350e2a64a98d28d59d6d1110221c59d260516a738a5b62aeb43c38e2d73f948290dd4265e6975c123f7c62982d77c6d7f45f71d77690e71e8dad90a02316a314318c2195b1925ad7708be50d5ee04c39b8bfb7c2305719af1877df90f3282066af655aeafa5e93b941c97f35f484be624b0f8b2197bc464202c72fc5dfe356927afd57bee7684b7488003fe09134e5e33adebc5b3f043ef93e9e0d9bb2e3a14eb8ff47f4dd2b89b80c6148c60853a85321c8b2509fe155edaae1497de84c166d243d6b55d78944aba205543425157f28ff3ba135b6ce4dc9ae08b1badd40f0f23393e21e9475182934d9b4ae1e5b87718f93b376e7d95ef5556234956d4e82e6e9079778cd8404c19af44de7d49eb90b3bc443f28e07e1ec5f49eaaa13bed563262d6c08dd3f3447c51e5b785b56f8fd50c02cb16bd06da18993593338701c4f72d4df7d7132109e0147f218da7f33dbdb77340d02b1a4c2c3d793b087dc4c6c6cf3b6742f43098cfdac2994ea4dd77d456484775ab95f67ebdcd85ed4bfd29099a1cbdf4bb0aa9c602ec4f7037696a34bb08458299d97b93c53a0d1f89baf1da77950083e3c7edb394e54bc1d9e9fc34e78b60759fee4575be27cbdb72cd26222759d8c04c240bf9b76ccf4d9170d707594d6851cff89cff0205f21e76034994a335c3216187493dfe7f953b26e051b1263b4bba34abda7d15ab447cdb1b4d665a71c608c6c49fff84a2a87f4350dfb5450dcc89ddc8b1585757af4c7ae619e792669761343fde4de49a9236e70f66aa2dfae48a779385744d5f30939ab3dcff5a6f12514a24e607210edaf044226665352271e138b56347c8ae317d92d6558934c77466f4645634cdf1e9b549e0d5e6715a96b3fe00d60aa87e5302688cd71df400ae4c7748845a57d3d6c2038e389fe50e6e3893e62785ee5327db8cf37c1fd43bc135bd55d63fd704170148c95b21b46509fc5ff37f834e391de60fbe4c840da7368f20c5e41dd3fb72ee525b13bd42cd3f722502b660f71a399de1d2a2d11b700be708bf4bf20ba911dcbf6e9a4a01d3ff4321ce21f0948a4bfc5e2253068b65f3705289c7835f344be0338df9b3939ff7df31e3b5c2269be23fb77b349f61d2e1a326de7f1a12025a004862939d5383c4d4883753acbe0b2ff535dc1bf7c19f39e3582fb1ad03ad5ee3462df6b8bf9470171355f69535a6e7f33e9532dffc0839c41db9bb25226e2f8a2c22ba175e4d590efee2b406531b3439a80d45879124623991197bf14dbc7ead1ea854194b2c203ce620bb5ba161a627426d2a1a304afb8bf994c513d6aa22e959ef50e58ae30544c5ec260b4f5ab874302786ad7e5da58763058782637d026de7c137a7a603487fc94a6028cf56235344c5daafb9fd801cf9292bc7251f83a7ea05ec5c7964147c39d3b87f7e4f44067bd9bbe274166fbe2803792be9537629ccde0bf01524ca3427900550f876f2bf9b2b48e95573fbcd0803777f18bda516a3cd38e368f8b41b41c18e1d021c04571ffc1a3460f9ad1452a34675c9e56f0977459b183ac4f218861969692763c0b8c48a1931c31610bc3cd58f9120ef1d3bb4af7511c7b55265e38cb62f0e084f992b176fa29be07e6578f165596efbbefb7b7743725cd533ddb54ef5db649f49ad107dca5f9eea510ed65ac6b48745b151fb3427b9ce6edd3ad31291f33eef9279799b02b99ec954711aeb22a6526ff8f2c80b697b8326d92d6b2c3ca35e6af6539972e51e4a9a42a79c57b0d5619bfb398705955951e612aebdc7a50d5bbefffdc85e96608c92700b32e03751e5fb937a38cb7484e41432210c04f41ef4cf44d9a52d962528"}, - {"000000000000000000000000000000000000000000000000000000000000035b", "003d7a484b0c9c1872b2a16fe1476995f749b182520262e83fc45ecbb7642f678e4eef29fb90abfdd14117990f170c084ba0de053323ed733b79d1151f52a524bc9edb53d06f81833562e4d5f93a4a83c0785c541047d2219c17c767db219328409bed873e693af1f4310d4e236216aadf7c8d9b38afda10e6d5939e1d644cd1feda485d8b1529e95544c3d3b4f5f33ab153535bb04cf6281b3b5533ab67382b7cff5a5c69b8b4fa0bd97e35d50b92656d20a50ad03be5776263fed1b1248bf6e2a74b7adc6030a9e4bd63866e8942fc38cb0f91bdbc2c880002e98601752e3aac459e8ded4ba019395b9e034ff0df4dce62592974d1c5dafc51560a1504870964d1655d09df36554af4e3869c9257827725b2acd7ae0b82edc7ac669189418219a725fcc6b12209ca1ee6b6079bc382e894f9eaa06f382cbb20f624e66ccec2b15627a80833f9ec7edce361ce3f617b00637b7da3d468abac4eb4c7e755a4f15a8131bc573cda0a36d52b299dd50f840a17f52c2ec874b6d12101365e514cafad29f261a40a553e3e318254721fc91cc8469005584e2729c0b2e052eacbed4135383952021196e76cc82def307452bbcdc386a6466275144726bbd4d52266b497c0aa67def97224166db716e5b90321f491519d42034cfc32b4df53d25cc61739069d299f05193890910cb7e302ddcfcd10f9cccb1891d7034ce4223e5bb1b108a6e1cc4f61802c961eaa49530d39ea3e4ca9bfc5e1cae3b183a1bf25113b372e9b381eecf71355b84151b1548e1a265115f4de3b03b938a2bb483354eee32073f5565ae6024555f7f999190da3d358fd1c559b8b23c18a8a981d4f94ef1f5941195aa331d9cca467611272f8812abc2f1b505a43800eef6c128fcb63569ca1b3123caba429742d8ede44135b7343059623af2c9911be1234771ca7ce0d451302bd0e7b774f3316fd9d70c2267b986e1598be5d0807100ccdb50313637fd01584fdff70ca4ab21da6090751f5d516975f39e2e5e2e0a6bffb11a358bcbc6008a951741da7f669ce259999d57bc38e8ad2db6bf52bd6a255e4696537e2ed830921eb8096f86edbddb363804d64629cdc0f3022b6b78ec18d51fff57c42b839e13bd99491759cce1c050a4836e3ca17cd120113468952b459f64473fc04a6110a4d5b5a1bdc570a65099b668151564a939323942743f2979612a857a2e50e2ae78ffbf65bade3b5f38a43f74fe90d6f3df4f80a823dc10609cc2ab6b5811f0970b3758610d034f810fd5c58bea3a817859983c3005d135322d9db7d86266344ce4f13f482b89e9292b64327dd30f93d6451353ee4ebc1686857cf03a5a277428445ec455dd3fd47fce49ce056a257d65534e85bb2c10a1bbab8b90267a91d1100fa6913f850385921c935f22cff7fade002d77c5bf0d7be357e1c10d57b0ca9e639381c6b2944b83ae1acaa14c7db1ac5e02efd9a1dcc05b18ada0e0dd16add5850eff56e40fd77ca4d75102d36f54231a5ed01299f161b44e979273950dfc2d8de1e55f0139f40f6b38df696a249b51e18c06cb559272afb521801962c44ccfa0bd0b5e47a794eedd1a5e7cf6dad1443249a4a8fbcc7b7e153db7478767232041555072aa286c2a8d6d66fe07086c635b633ae8432dd93b405094b6622649fade3f985f25cb072ce35baf3f27705a1ee53e75a14859b1b909af48f7ec84e025f5e5818495a6780cecbd1be16d59444ea7d69bbf658db191a364ea87a4a34793e6d54f7a52f23029e3d553dba0970a90b33d446d1c9c4421a5de94ed16b783af097453ca78306519c4111f33b366776838af453ff0e1715984d9eee0d617ea10472f9806878936776fe2a091b471f7aec0db1bfda02c2714de560d21b69db16d2"}, - {"000000000000000000000000000000000000000000000000000000000000000a", "000ee6ddaac3c7a9b5fd21f541ae6d81bc436ea24000876ced434cc9c12fea943c0e3c605a482f7e39d323af314c0fa0922fc0fd92e4e53906113f923f1f6d61170b87a01ddff30003f6ca51fc12c9bc11ae9f3605eb3b26abab9a838f5040d56f47ecd8b5360e8a6a0a5cb575052bb499b2d0764602da8059d3a5785d7b1b9b2dbd9c089483a40f63e3662a88016808d6d5992cafdf32ed68d2eb9f65752f24e0ef972fa4dbd6210672ce2e9569819b8199e4011065f7499d90d31a1c3c420393528ff96d2f22d6eb9dfa7e767299bf5ebd0e3c5eba2e1dccd7b5d9725a57438d46854fbe5c092ceae5bcfd993ddf734db4e1fbd5baa5febb1d9446075e771fec902fcded5f07adf4da714e27c778c42226f12f455d5216ff769383447cdffd5a3d2659cbf60de5d69555131e8ccf39d20461da66b0fa9c4b8c1927e7539058d4bbf914cd8624a3384e66c9527864e10217fcda4582732d2fc0871b423dc4e71a9c1dd152241057fdb6233a49576ba356bde1ecc0eef2ab54d81b6403f0ed7753a5ea595441147a67a98bd7beb916319d79ce72aead53d895b5ff47d87b8660e2d8f04a076bf2bba4e3a6896343920661e089b4da803fdc24457b65887ae473d746ae78d670dd8ade98567cebbb083d6ef133c94beb730b21ad8d144388927a9ef6991915a672d55e0fd1c121860c68f8a94350f25c4ae50d5567cc458c9063863c871942efdf9312a0df14d3111f3ea58ba3aa9df9089219c1a1dc2915b7d99f531881956e48e25d4f260c06a393f5d736a4d8da086e48ac068f9af5cfedf3c42811275e1db6830bd4eda91758fed0ef616aadbe64a45493e0c721db9c9eae85227bcc7aee5a1031823776fca2c64929e3dc772a2531e28f7dfc5979c94cae67de766503d685249b50ed3fa91bc2ed5cc52bb1e754a2825a482e5d557dd2cc0130a1b3f4cf54a307c2c164b620089ee600ff69fe1c875e34b00a2c75042134b6daed32769f0f9fea77049977742f4312742f90b69dcb6c53aeaabb595c15688e7d86ccf0cee3945cca9cede542c786269ee04e06866260ac07032ae7f3d50dba2a34627f15f5e3ee490cefefe4d87cd190323cdbbc7afa6b81935dd2780fdc652b46219249f76af3d83cb22ff1dff1bd03c5108f5c9ad90db2526e2112ee8be6694500a4fdeeeb0730b23093dcb2891fe626df9cee0092e16cfa61520fece3c865a064d5385392791dddd3b0ccfa98b9d7122a02ac05d7b05f67beb3780fa69c2337819b5dea1fd037bfe54cef70e45607065c47bf4e15d4b8464f09599d2ecd46194b9b7dd0af43397b2eb8f8f940b3188a765af2208a4119cff795f3c7838eae8c9b1cc616e388fdb046b9234fec74881d452e3daf53da606219f5f0dc07acf8fdb523929662fbb162bed9f83807020a6cb65d510fe6e6be1669f6dedd92aaabdfecd40c9e09bbc3913d66e1ce1542507be3ce6a609b5eda0f22ededd3dd0c6db963c25a267c97c210a1733c544fc91b854af331cdf7652b16e5eeaa66e1de79ea4103af543dbc18bd8f2a3126116ef08cb5e85dd1a5d528d32216078c7e015e4d961c1168c03219fc9627c72d0465b1509763cebc38f67d7de6f06278227c11125308dfb28ae37e27641ce535cb2c56f6f1eafba3dc053a960fc294a217c2cd307476094039e7bd9b953512bc8ec4e64f71792c0fb3f0b04ba7990605199aa10ab8acd10dcfcead0a7a3261325b83b9f84d1c6a8a262b3ef822f1bb2be3e0e26b1c2bf9d8df3408930709ecf71aad43338be7dd119077663271e26cbcd16231a0ca0a2f9c4457f3a11590e561d78db1567df54815e9b3aaeb5516a904423c24256deb6746c91fc44d1c0a4c7c416b1d07d292f31178f34b9e7eab1e12af"}, - {"000000000000000000000000000000000000000000000000000000000000000f", "00a437c55f115f8de60ad25789f4eb05876819ba2403e5816da12e283bd5cb134d9d2619a67e061c45c102c92d5f0e4279752ac7935a49a6acd51ad7e9d631055a1434dfb056efe8d7e4e0cd788dca2eac1e02a1031bbac286e2fc6feaed70603640ba608825fb28c81da7a512848cb3d0c862f4c5875347f29523ba57d507f3795329030b251e02d5e519ebdf02bd049a341333a9823cc2661e193d19d6cf8071d87e890196fb7400f2dee19708553f002b52992e742f2d727ed38483039e11bb7a837c9170f1b3746ab1fee6cc68fd8fd5070b42ce0421fd555c3050bb6a592e4cbd0c486cf717dc26d83fec4045c23be7cfbfc0085f65f17c700802d1f65887592eab0185d62b7f4ad231e4139319a309e49bf0f928f6e1e28c714c6feeb366ccc27866ad08bd6355c66fcc87c344d6ce513d0ba7a5af3f22470bbc967e054f93c3d71e62cd76606dd4d7591584bb0206cdcb43cfff78e994b5b48bc1a99317d87ad5590f7778829d8af0e05c25165b70dd32ad99400e80f72f7c6f940a6395b72be1032d2c1f25ed1c9614d893365fd66fbe57ad2bd739047f87297b469f2d3660470262ce3be10c6a6da9a7b29633be985181d43dd3b722a6f6d9bc1d5f1fe9e327f37dc49b16f6221b856008a703b4f8ccc2df8bfb60dc617382f5ccf33f85a6132edcb00e5d70392d46213cd2a03f8089b7cd703e02e74fe9ca5015ca954e30e6dfc27ad613ef3e2a2e242625a6645a40f5008812665d3e5e71ffcf916f38048cb1fc0e4f24c7f6da2240d2581784cd7f4c08880740405d479d8121753e24db0e7baad9bac4b09ef0063ae567bf972aed6f52049d982df2c5bc141263251330424cf225b22d6e9f07d5ceed8b12907b56c76e093eeaebed1a94dff82d13db1ae4ebfd5d247d248016b4b719c14c400b8cd27759254efa926f519a2b300158903c16c0d87ace5c85ecc92ff0fa320734cdf555a0268c4c1c817d0ad085f90a64aa9615be9ffadf2ae51d07e84cc639d7e494111c24e4413172ae8e8171e1dddfce75ebebd10fd769f06b9f76566e3fb7c604a9495731deaf3f40e2d079d9e1597842eed1c8b13a6f05113ca16f830d4344324ef2f6c2dd0fdab7881b3196f47f0d6ba0c407f1faebddf96ad4d03a697a2fa87639b498c9694bc3d7e475f28213121e7fda4901d7451cccdc1a5d8362e2cef275e791321b0ad1ed27d1d721ab6c1345cec304977854604e0a7f7bf02f0b4702605143a96ca89d424dd2ae69665543b7f737151fe8b5d294189b6350234622a3f72b8f0bdeb86813b9b1a1ee1bc4e1e54073aead70a089e3516fc06f46da5c220d21391df4b898d1b2d10cfa4a191de52b1a0c3cfd551ff14f69cd53e62bf438f9dbe5764f2f2ddc9a20ec558b9bd1ce965e856ff85694855c9b44070a8f01b34ca7a108f861655d127aa33ef7bb8cb24e6bfcfef85c7907f32fa53b55d5e979c6201bcdb5135155e3e51f274780e5a49776e042bb10053b005b4d9d6ca6bb5d1bd5f80516805172d69f24e69ea1260f799573cae3821bae7cc6c865f91c46c8dbdd7272151e93e0030c8c09804c615ef4693cf945909859c12fa8dc4ea1b209d7f75834a3cae7d9594bc15e4d4e4e361c40641b0384fd20271798727f0e52e5bf8ff00ac50232d6956666b58f07e2d16020523daf16aa2d2d6dc1c7e95d936d9def73786251a46fb1009e90d71c766d585c13e3212c2b74bfee47ac8e952af6069566332422f89b9bdfc4d467f80fcb940a0bc39af47019b04e7c3e9e043131d7234075bbf464d5609760ab2105bc744ccc40f6824b45b7bfc826fa366a38c94b1f8b6c113892986cf2e4b897c67c52a2dbd93f05572046f7456a0dc9e2bbb986b3d74fc01dcdba989c47"}, - {"000000000000000000000000000000000000000000000000000000000000003d", "0046697102de3edbdfbcb7bac3d92cc9fc30d75db801b27d97cdc296c7f07010b21cd4a3727c57fa90d4147be341ef8dd335bd5ef436686b9e8d25e0f989591c45433154d9ee12ef9403ec5c62bf86ab29b9cf9f025b464e042428bd3a169226f5aed925e1b1ef3a7e0e766c86c5c88828636c62579f9719431566dd26a938e2460cdf28065fee86165be74769caf0fe3bd94b4ff6d3f07d5c7307350c260d4a5a8aea691e1f0de6031d898099c2a70e6b45927cb06aa4e595622cad1c27ac053414d82675ff4875dbd954428238f399b4930c00a1678b0b87dff740e30410573d34c906951e1334c462bdc057d8f51c4a2b21cadf17f6ffdad8ac6806ea8418108ac619ddbf75365ce18bb608825c4f350ee77a6a2225687b818393e428f94171fde358f2e217a535ba8c9d1ccf708bc53429569dc2986996e0d05213eefd549db4758fcc79e8087b3a86ec3a3958e30095b33bc50d3427e62b44f375c226eda19ecebd9f14f9c64e5545ae30814ee4b408b2a4cd81a3dd34740f3d81082a73c7bfbc3835b5286b64769ba6fb5af618cf99cbec5c5331349aa9a6356cc7cf15c4ff15c60ae2d6a2765e437fa0fbd467227e29152b3a296f1a221c8189b28f18bb591549e6935c6e56a8e595ca951435bc3eb9492329ccee2443e2b251f287dfb80e241ce2b590f7a956bf8117059a454ecf6d96c631c5e706d59d9df2525c0ea857668d9270252afc647940bc38925230b3d01443fe5cd684ebe478bdefca1921e10c871f2bc3267f95ce8023e9c8accc9100da6e38d6373193e9afe46d8f3cc168f4c3c9ca7b6bf3be7f740b37cb79c926308d3f6ff7c89cf03b2ad9317d98b4277a7b75a112df07596866e1e7ee93e20276d903d82bb399d01e162d4fa0504494e9e727f76ebdbbe3783d15ebe530e68ef5bc2796f6f4bc74bb481afc120d00cfeb7c940709a6fc217785cc42c3fe9f471d858c1dce0e16a392c13f1cdfc6becf39606e8de87d075909771ac61d21772f623bb1998537663ab5b65ef6452d2f35935651ad7a9e48c493f7eb2fb54ad170d07404fbbb63fc90f77d96221a4909f053efd7883f2d050692fcf4e91c4cd73786057edcf9f4c262619db8381cb70be70a07f3dc714732901cb99c58ed23959bb43ecddb2260e10e816299481540f0d9fe6b74de4156053c248396e3f1fb29ef008ae43dc50dcd6c71d07d0904af23af2bccf59073f2b911717690b332543fe4073193fabee8e99d9180f0bb61f1f89851198f6fdb53a6de801e2178618a90e6bcd7f319bdcf7b6f700e09cdbef24acb9c5ad45132c369fde1a4c0594ab58720406bd36dcaa2dd59cca51822bbf5322e6f9238930de7b5c11a89b012a2327761f74a597a7595d69e891a7d0b16e9a8395be75032a54254b87aec137a6cab01106b863930a1ddfbf940190c420da24688969287395e97d0579c3074f006555a49559d9b5d72bfe6ae1284d6e3c2924b4b698888a563cfa0ea98595afd97360a8f6101e18937e003e9c7a36f65d6c052def65e05f1e422f60f4932c73a440fbd5f55ce7b427def2f1e7425e956ee78177e6ae913407bc036f8fc9c67e6112fcff4be7b8747e0ad859be8c11939fad71c0681163e26de84550ddd5952fb13d2f80fc30fc93e0dbf0306df6a618a7f8ee862f4d8eac1aff64c1f1cdafe0df2b4155688c2ded14e035328dd0060e7bd87eb0d108372db39a407f981fc212efcdaec82c7cf1b56b3155d229be449860b7327a9b6206fc6d2e31d5e25500d315e6bc507b53aaa2ef4c76b276086e7d1db92fc6c358f645c7ef49ffed557e02879795f296ede9f5726120563ad4a6d34a1d356ac3f3cf08e79fc16612070047dace7aa3fd3bd20e71048e9d8cdfba1daf049"}, - {"000000000000000000000000000000000000000000000000000000000000002a", "007fdaed3735b74db866f0f936aeaa78f4e730076d1814817a5a4b969dd96f947a277fe80540d3bcf9723381f9b570e3350942d413d4a62c7d2985599ab3be3f100fb2a6960f4adca107ad8df5601252d994dd5904f54138ac9ef2834ffc96b21e60f2e3be40de123b334c8b52956fe923c512874394600c873a903f3e2a18b3e1dbf5cb640f41ab18cc9bfb627eb3d73830942ec27c80191eed6b27f4c6a8e1e29385f1fd97d9f6060d4327bdca27b8a08421da6775d5b98831b8f1e715d0a21e7087fd7083c7e1bf98ad3bde49e6f81ec0071442152be2e227ed7e508d4ec0ba018767716a800d882992d75191e4e83231724dfd9e597e563805a3158fb93d63d7c86d693d62f27ffdf138f639092bb8206515d1280c9d61bc4605878b47b59e0fc0da96e61897ed23914999356c5a2637bcd4757711b7fd45de4dd7cdc786b3e3c7cdacc5480d744c2aa0fe5f45ec01be7900034938948d62a24c947fba5d60b9dc55aa15ebe457d99bcc85cded031cbaf9a62ce2d2d1c495026474489e29ec376be0570497c6c2c5f80419bd8325bb61420c2ab8cda04485e0ece768d603e15aec6303e83451b8554d3b2d4d50e498342cf83ba4f1af4b1b59aa10b4258dffe6867479ede8f1cdffef95b0260f7cdac03146bc68576ee3beef6bdcf51ed8bc2aef1e775387361d0e49de19a30f36ac743dca381371a9022e119b122a32cd5eab19dba7d45387ec221f823b1bc8310f66c8a7d247e3c3c8f2ceec875c05dc11d50794963106b1bfa59c19321ed1f7838309e35e221a0fdf16610d2076316cc4a3fa115184a9f29592b8a002cd97382dc618e072373171777a788098721f0f3628c203c996cd0bee78a8250213352fee728dd6330530ad7d2eb8ab4853cd9133c4964c3a6510b28e4cc656aeab959e977f86c89bf63572d9c946716fbaac18011e87801409c4d5da6fd397e3b2a639ab90b6ac150719b96e60c395cd1bcc54492cc9b8e5900e16a0b30221e88c7cc783990402e57d05dab21da16fcda3d906f06aa33f98f9fd90f930f1c49c8b3c8ac18bebeb110668e56efbdf2ff9286346bea82318f5703e55cd27f7fb8b97513e71f83833118e59465d1312ca5fd016596d39eacfc8708d2613d98f68a04e116c1500f82fb39da8254ed32331bb489cb45e2dd2d948ff772e0184d40fceca7f8ea96b119147b7c06d87b014fb10171fa5c76d2229716af6c5a2b35d691a652f96347f02e7df99f7d5f268b9b7d44f1ec7d00d147999bbb7060e5f4169210ded0f7cf782467721d61618f79c57046b2496b0b7258dcc9d32215d5c883371559c45f96329c690e57997ffd28896cd2175f24de922f173c205921d2bed45f967779cc69d24ce4a89bc0dbbfba634f71a39c1a9cfc78e0dc84a515fe456653a7f9e380122f628a3c7a14132f1610278b4a738988b78028d0e071a121f1b29bd9edc01f97b303fbccc6d2b139d1333fc6e47dc0727b3876478737a4a45a5609a892e26e71d7ef5cdfe3083c0330682d4ed226676bfdf54052fae7c4fa33f4392f123536d2fb5fe0440b092150e9e8978f2e97563aeb80416b4dc80e18c8938c7d22186fe888c5318195ed3e238db6a462125888be5dc224fcde0fad00c7179502a6cc66977eeb19a5d918d01cd4158d2e0f9fde335d2985d9d02ed03cacd0e9f0d011db68ea3197954b211178cc7bee19648d8d89619c49be46ee7e69bb8bb697b5e7f61fa64acddeef14668861c2f975bc1b9f8965c32fcbe81e299b9b94e1bbcc3f8201a7c71ff2352f8bfb8b099f73197ada11e88cf9c3d188cd5174762c460385ff8c6eea786d537777f802ed2efe1a7f1842d1d3b62693640fb8026596eaccd09d95fb2f5a9e7c856c8c636615337c634"}, - {"0000000000000000000000000000000000000000000000000000000000000007", "0124a9483114abcb470b4644f2cf0c79d142f09e3e1c028db098d6ec64e237357ebd60856a0942daa62f3cd91fff2593e1ecfe5b3aa33bfac3975b13fb5c624fd5bc1ef29e67c5766de67bfec9ed96e1d35c52b60b7d350c26ac1e1d947f256db25b470db54fb536023ee5fa6711a71ed3ad058423c2f1f0637db17c3c1e2f94e4e1c6903a98a744593af94bdcc699761576883b1b9c196cf62827bf5c886d88de70bacca35a009e029feb8c978f97918cb1d267f52ebc952bd2d4162833638ce3f3d6b0fbb1d2e4b06b2afdea241e9c815f1837dfb801699b77fe8942ea50ef8274e2604d06662fbcf24bfd5129709df0031483fb5f412119bfef390656821d989ed737128d52bcb0cf72be7ecad52bbf06c48911f5920a1f86cd50b81971ac9c78101e93731887a562b794b7b59a84b55bfddb40e58a663063021e88dcb6789c86573b6c522801eb34c54dd5b63d6e0346a794486bb9e9a8d57adefe6ba766bf28594127386e9bd98aa0d69d710665f37078234d83c8d6da651c49331deee7d5f9ad338a1507619aeaf74c5bfca21e3ed691f972c66bc4cda5fb9ec1dc323323f1c4fd171b5e3579063df5996948b8c2758aa75f653d9ea3355b03d3b18d8360db935676ad37de3b7117be472132c86b3e949fa9798aefa78304caf386c08f7ea9d0363f0b04106adb29934ea473b5724a3543db2acca711ae95165e9cf7c74e8232e4cace2fb8bf35a8e24814c88b8ca831bea3d71394ebac3de3d643eb3cddb7165df9d0229a749f4db6c846bd44c33636b8f96e342020fbd424db48759ac6347cdbc5ec770fa53ccee0211a12c6ada9bd87543e89257760729eb5527655f123040dfc3717671de71e4261c8f2f2fb72debf8bbc25f6eb6283d1497cd1c31298576b0782ff58597025284d077d70e4cf999366b2c3e2dd56c4c3ed726469061722b9b9a38115efa5e71fb0ce736662df7cfb9512d3c5e099ad7cb978cd94a7aa3ad76d5864b0a25a27cf6bf1a7bb69c1fa32c33a2f4e51d9db00d5f2e45f5962fceaa2272739320b4394f2ae2333e3dd4a1d0ffd6cb19d5979d756ebf1d1939d4c80f8d919b85829424a929790855518122525e96f1f4580ebb7180119f39386de894be4e021e5d0577a813291cc5aec652b160f2d0ed8af4b30ce772169f35bba4fea3a8ed006ccc5306ac8139c4510674e59f0bac1eb1acfc9da27d22c4fcd20fdb741ec03262c1fd7b50e2c5e2a170a0424b8e69ee5a33458715940955a4c60fa876d140b82d19a8b0c760f6145417ade1c9966bc837a6df609b03af89a6804af498d815eb66f4e72ca0a7c34aa47b224a2a457ff430b79a62e74cc4773a40e5e4627246dd178a71ef2ed65f6861fc0c53e418af1cd928047bbed2aaadf8503fd29253a91daf3718af2df3eaa0775286d46b8db7dda05f1b602324aed65d05b573f39b45ca4457153adaa381457c42b90bed706d7cfa024fa1b7b80945305a43993aa95461c1617a439d0db38ff8e09cfda99a192e0c60e8d53eb17a130fd76370d93e946de975bd3446501dc532be416953db9c0c81deadce3981499cfc3ea5628817cb64baf07ff2f8831b81c4285cd3ca55b0873962ae6b0c951203eb5ad3eb3ef4a1a52a112dab955f68cb4abd9c71ad206f20c9882d757f09c8b8dbc9162f1a5f6b8a235d242592c740c559e1dd325248915c380ddb9b65052de1b1f0d7e3e9907a738496c48e0e968ef9aad0ff5bcdc9f36b3fc9e1319d945b0e1fa4b6554463f6c595f710a0ff791f59cd0ffbeeea1451e852978d1f83454d0d738862470a5f261e9a07d461bbd43373221f53d368f161577826a099bd981cd5867ae7dffc288307e653e437eb74c1692908caefa967236f250a7221d5cfa73"}, - {"0000000000000000000000000000000000000000000000000000000000000339", "005b0b144ecae618b78d94feb671c1cd62701926100102ce1111ee9b5f876444df913b007a4ed875cb2218516b240fb910a9e67e91cc14102011fb67d78db42183bf7fba6d15df6f75130fff65a02e940f1fa70000fc074bcf57d47f56d210233a40c7af88adff801e07df5941c24a6a6a794221a9a6acf8a8ea28bb471d0954c6ae014381f9ac162173092fccf0e074738e36420ce66bae78f17df294747424c5d2ad6fa6d6620e040c7ec25e8d0ea7c73e55264e7d80a175681182951a46c37b0f9daedcfb4e27b2fad8142e059d59d57b0ba9fc8629cb85e35cb5d4df38748f7bae0dbf4cea39e2f77507d99883c1d9942cb05418c23405f66311058c0423862ce173b23700a092d8571a8a3d15826a36a28462a329f56f600645bbb859b83971cf5e696b12ee6ee6dd6327fb49a151cdb720688da3cbb31f1b2d1c4c4db6e7ec09b132e2e43676848a08e6f812ed0332051f6e05cc651e7b73b36cf8720dd159dad37b58361bb3dc5eb0736024f6531a44627609e11af8be03ec1486694353925c608236eac9b8fa19405a01452e43175a998f478d2719758a7c507b269cc81c060e033c7fbefb8a4951303ec6d4b74bb5864a0abf5cb416e9adad5032e2c1e41a347b8dc48d335c7efb86c1095d95fb0b4de0e3aaf062fbcef3aaae316dde18ea1b2a2ab1144a13ebdb0dd1dcf10f199d4b6e9bf51f0b61d5e765f48f87e0dbe2e210335bdaacc7df52e3190d392ea208d8004dbb642a3a3e5f3d3d787d90130e094f06405afe599863c2660727cfadf80cd35751344d4d50e29c7a33717dc58a0d7bc0fedf1ffcf3b80c266591a9728105cc8ab35a14e0b2d5b184df795f62757da16a6821954c31b75534e615526f81f71d8c2876ca0fe94fa1d5479f154a78ebbdf9ecea75c8ee289837ed6f20533d78476461912a3ab71273bf93a2018f55dc7f4255edec0d4280ff6892c689f17e6f994762ba94d6dd3233b8652547ee620981a07c1bc4a70a1dabab24698ae5b53a42b991e771acc7c9a86263294c9a33e08a65251c25f6973cca1ae9ac12fa3791038c55d8544bbe7c7901f0b6c2dae02d363ab98e8b24d046fbbd1f6941676564456e65b2ea031819692204cd1eb5df28ec07508ba1cc9946d6188fa5bf49ce07d72e2d655f7845e913e1f5de78517176d0f5b96a03399230ba072d986a38d08c3977467214c3510ced176aed91c6773671e591c1886d16fea2fbd5d9464b1de3ee1db813a6276a5543a1b7e702c8fc37af44f124f02fefe0d3b879d156f619c0cfdcda5014ffeed00626247be75b2743947d72af8951d82a746a1c5ec320b6db327508dde108bc3346fa4e4cf3030affb0e72d2b157b660e26dabec9fa968a6b3703a3765f4446314835c0e56caa81805d63ff0e66439572d8ac9b0402c6cc06891862333fccb03ac263eb0a50b595dc692e858274d3e722bfc2fc441077e1566f0f99be988f081fd95dcdc83ca29581d46d56cdce06273358b56515c071d68848f511c0f3c21fecdc543f71c17c5829094d53f884a6596d9b2da2c1e367f3aedaa3dc6e080b1800f1b1d7ce6f5c2552476dc7157dfb849995b00d5f7c2ee003d76f3ec8a53cc4f79765a58fce1aa736da67f9936542e571d03669da6893660a6adb24f20b6ec35fc6eea42b9242c5191140a9be8a561fa71221d2dacab2737c2baede34867233ccb17697983c9c100772333487993d620a92d28b5a12a92f897e611321a6f1a6a75f59f36da725d8dd5e17cabc9b59ddde0cafe79e04e7fb6da0675252e6c687452e0e3c738e326606cba192c5615194c42526acf0a5e575b95da919030697070b1679f61b2257ef7fa2b71d051e91892fc0dfd181341597c553c46449ca7c032f80bc1169"}, + {"00000000000000000000000000000000000000000000000000000000000024b2", "0026ca22cec36c1937fcc1c7379c054dced412c3a11becd6e3cdd3090b1961a4f9db3c30b6ce55f77f32187ea5f868a23955853a54583ae4cfea025f159044407c6bff1a9bc6494a6ed52d697cc395c50cd879f30637d73f100409a6c428f42a0ddea12a71edd8cf3f0c1da21072091ef36e6ca2596c1e86be5b107536e420fee672cfa22417dfaad91d906ac41a7b8a76c0c2213482f207ef1c6ff95a8220e27bf2eef62019256203036f50bc90809ebcc1db0676e52d1b4f033ff903183b27d45f0f67ed53f683fd56b43a699dc9f091e117e6621e9af0b02be0992a733ffeddbac5fb7c49852ad10c2fa3b0b92fc0cda438c8be0e127621f6e4f90df4a9b703d1e74297f7a1c8b433a016006e1f769b155d6e6b01ebaed3adfb83027543da91799d8fa49219d7eba700c94d88b836f3a3a5517ca57f3d1120ce26d189a1074b6f5abf75d3100c3157b925e94a46ba042488e905d47bc18880e0a828ef9e81b832d0b61427686b2940ab3be198d307fc64498f8baf6f9f29fe193dbf9b9048a3424d8f22432ebabee2ef795ff8153e4717dea77004c3ac24a41d272ea9fa5dd1d9b8c605f7b3180a83bae378fb52a1b26deabcf0daa98f120c10d42762a6b72d695331878fba6165dad0734e3f08059f7a8dcf7c7cd3d440f009b4b4f58b6af1258e14c67593f89a2def471fb5b2e9b15e3df016f5132407126a431f4304488d3550a88822234242657a07311c198e10044c9c3d4692167a6df59e6a5ed7f51e970801b91e9c8ae26e82225168421fef16ddc579d1d32dd74d3b661beaf5a9ffb4d7c928db3e5937151abf0f29137e4bdb99f9ae96f34db7487236c0519e024223e1fcff065d50ff938d9581947aa36d7797d761311fe1a9ffe3cbdb7b3f43d6ba76c465f2544cf8f12f25c732c12d49a6a274be62efc64dc8f9ef24fb6a3b007b7d568c544469628b42c3e371db76e542be84311ebcf6c07ad7ec34ce2fe2debf3173971b92df9b150252818a1e0a4339661f46414fff41a201e211173627de34c75acdf3e35fc4b843d2efe7a7a3c8de46b600d1ea22f95e318d537f220d99a70c192cc1bc8c850d8a6f977a498c94673ce2a04532c1c30f36199e650519d318b2cfc205e09b64ec34b98e0d3c90da7f604a096e33e89e5e15f139c501ad60cb6df2e731449f008924270e05119342a3a2e24a37159db7d13092411b1d06728d4a07671089d3fd0c5e642df3da5c2a3c027426696f9aa0c38e43632745ed08de3c47569ec214922d44b8e6c077f602b3a84e4004a2475c1c24a201aa2d9dd3c8f6753d7c37eedeef7a22b3d81f6d531a7ebe59d36191d78c59551c9ebe501594447c947f0c308f1641cd72976f5b69dd2dd76aff033b5e91141f7d45593710cea54f65e41bd5bd4fe9c5240e8ac201b3cf649e01b10c83ef88771cf783fecf30383a7b593f76a758dd518925a9f883897ef44f4d523d46e70dbbc5570c1ac3618c3de53172592a9dc537d4e7d20f4df281c1919a5ae04ec2a2191b8ff8ecc8a78ff302555dedb24551e726ef62121de15ba173c0bd34ab1e350d749fc8f3135e05d205691ad2ccc8257a957b0803c20a3054b130cc2ab5e9ebdb57ce1e3e75815e0bc0e21fa5d2ceff943034a3c5b887bd61b33f647d01e9bd2c2e8dedfea5a8d489ffeb203b518d7fe2a829a29e4cf44d18615a0d865435457481cb69587d3019c334b55789a97bd1dd52bcf270b23d165aedfda01aab0afe6323332328c1b223cb4ab11278487b1fd303a53ad1090b4bcd4a17b152352e2761a0642e4a780f6875ed99cfede0d08e978d6cdf083ec748f68d41115800d56026bb0986e274f52a58049aaba31618fe2ffded45a0632711b138243499455971f3bbf5eacd"}, + {"00000000000000000000000000000000000000000000000000000000000000cc", "00ef1327f8e5fd65553e60ef249d8c786f59d7bae20c9053dfc20643233a3ab273223f6b46308c12cbfe0baa7b3f716c28cff80516b49b79fceb38ec1b7dee31fcfacf8a8feb3daf0d036390e0a0073bccbc2af210838f54f38fd9907f96250c4ed258e5b950f393ff1138146d8eed4e4d7b95e12c2a982e29e9d998afd51895228fba8bbce4682605fd5c45da65f03e12fd2d4294a5afe696e430e88594791baac0e5365caeedc70291d9c6458ed294ecaf32b4915c217958ab6d27b3121818d41e056014c457c1333c97c1f55f3f98c35b09f6873bf70521fd6ed613bef8515a4b58c7fe8f4335f65b220c1ce6695250e50f7cc8eed22bd81e68e507f5677ab75adc81ccd0f55100b6e7a9e10b51dcf744a7ffbea6746e23bcc81466bf5da1070adf79f5ef10598175c6aa47abb1ada659136114faec87996c8927431acc98e890d1daf8c8f9e6e0cb8e50d67ec45f03305c716fc52a2429d061947af64c51d579b3c6430b2fe493ec5acc0fc104f276d1e7a20532e58e24a91076d722914e1751c2de5393584f1f61aa02b22d8524f3515e474d1ad8c98c134582d50c8a8fbe9da4150a2422195656b361155214b5bd79fa2975c87789fb13cf2ce2c0ca5bc0de8d53ae783b5bd9fa1af10be50f6887d48ede2e77b2fd34c5f65e6e0677c819dc8d113c9de81aca9b4323f2366c6de96efa11c294e1fa06efb894f84973b7623cf1ef59b957ca17d8fae0a90c1a0c6c010401f51e4482ff3257ffd628983b3f122a875f50ba1d0ec1aee0b2f931ee9274c4ee70cf333feb6cb08f21a4fb11edf84157c828b7727f3c729c0a0fa1f45f1d0110ff1e24528278956ec4a8da544c482b73ad873467dbb9fca69e3859512abb70772e72170f00d6ca6cfd419e2311e0c476ce5a1715fea60a198d5d1e3cdf9df3eda682fbb728b3b4e6993b4ba90118c4561182e9e0aa28b2e66a6ff0525a2b7fbeff3313669d36e44a014c0d2745477592c654a1f656fc0b75e06254f3cfe9b4f0814ad4315540956d1fc179370e25a73092c3c78872662e58f5f3b26143bc7e9f05dbd98cfa4b12590a0e34c00c5d048f9c95fe20ab089206acea458d06eb5ef1326aa09dbcef945f78920ea21e81f4e52e79e2517a726579c4c3d3af3fffad2f8f3a02e14c49506c1bb761d5ce5f8f6b147cccfd0317839dd354df430a5f7ad1f4fbe8db7e6e9c969f1137d98095527757559372e5fc479eaccc5d6baa5a0a06ef9608d5dccffb2d92719ae4f6730923fa4daa1b5884a4785d9f97a1d5e73e9fc90eb2910998424911274f10ecd1a860d35f7177118d9eca1625f42cfe2091e34e4b5b3e5572e6958bf0d1a9818b0dd0a8d413666fff245c37e3393a21a37da18d0110022b817e20bc4a3819cdd0a4b0fc4827c0e16a2f88209fc2e301e5275341a5cbd766b9b8a44479f8527f6c194f78070a63115a598cf9c14e7479c83f18f62177769c2a05fcf28b260f263cc06583903addcc52e322dfcf61287cb7897d9091ece987a2ddbe588a6a979977d9fb0fe23cb8e8f0c1658df903764a75b8a23d14bc4c743d785fe3b9695443f42444606723808b496afbe97e37770b3918a05be3ea1084b44bf4c2614ee2bd8ee144c8ad3d4bfd152dfcc5a80d8872d136ec46fe57ef07cbd0e1155ec8e560bce2330cd1443e00e5346ee7106a7c28d7d951c5359612985425a2f9be58f0462814a2dc4c1b14419cb3be0291cdd81ff61b3896c5c7230374a127143269e6d2f45e673f5199fff93940530902ab1806981382f7979361bbe0695e4662f39aa811fa176bc0d77259d963f367c9e7eb40f5333132c60e4cdad5903a1545e273667aa8ebd42216405e68d131844f1578ce591eda470aaf0cda3d1f2b141b1df4"}, + {"000000000000000000000000000000000000000000000000000000000000138f", "005ccdc553532b92e89982161cf128fe755f1e25f30811e95b59086c3b30ba6396b8ac8e0d27446f749a325ffcfdc7300e199b5bb824d949883e39f2f4933132ccfe2280d1d24fc3f82357eaa9e132f1827f8f4d01ea432f314793715dfe35578567e33a93c0be85a217a79f4a730f3625ab93731c1fc01c6f86ee1dd1880acac4998461e32950b6373c35d8378e6afc3f10660fd5c6f1ece9c09fd1a632417c4841f1f18d794ed803e7449268428c6c26ed56110969837aa03a37b72a2290e640486e9d6d9b2b42cd7d67172e85ae3794be083e35a9b9482a89e27c19485afb2842c8c0f941792a24d5718451ae90d77d84cd5edc47edaf0b7b66b00aa607e59d48ccf08194f2c04b990110fd2457188f517017cfae2ae47ff83a3559bce297357371d28ff21d046a3a401504c5656a827a5cddf96e6852f4d70558c3571f7adefad5c52e162f57b9a79997757dfa3206574c4a81126796b7f5130610dcd38acfde57df1714b2bb19eba14bdfaa7e91a983bbea51b524ceadfa2f35cde5390c1fd59bb4f77e9fea37f63cd4324b9642176b68069fc849594254b571d8ead30254fbe879096a46bc2393cbb7a76e6670beb85d6dcd906f44860f16f9c350d9aed94c3b07aa42fcf7e26e4d96bcd00ca07b0cdf8f60898fc2e4230f6803c5e99e53a9dd1f54a1d502d3ad97161d82b5121974eb3b47fd6ff809284abe789746df0d4662852fa28191ebd5b80cda2811cece07f29d5fb2c05568526e3ca2b35f7b8ff91061093661a23b712df134da00d7e261aa2190e3016900fd4330a1e539c0cbe94e14cd0c8b87e71d59a00daeb08a900ed3410c5c820817456c7582bbb9365534b0f710020d7a454a7bf7f06742469b28dbdfbcd92c922587f4e4466394fff4f872e4e65e4c189fa8f23a3142ab17548621e07b05c3dff647526e78563c8300ec300cdf9365173928352d69e1c75d7e9c588e480fa294a26650f0d7ac0fd2893abb9332979f5daa9a1eae2e0ede1a51b4ecce926157725b5147f93f034731d356166eb60c77f091c3951baadbf9493e9a3f320d4f5510d16496e92b9ca1505a220d48c86a0c6e8444214f66291c9907e11b478eb3435032364ad829a34340bebd27558a75e65b34f87eb9a7cd7a25ba86a26b829ed3c32136afbbe357656b41e67f70695fb349027406ff0af14a25dfe56278a26a59ed20423f89c1035d6e53175aa0c9a16a9089e78ea05ccb6d68c38a08b56553e56f520be89910901206455397b45d882c44fe2eb7fe28674594cb75af6abb0931c389aed1e410fb3471892460d9c1e9b717547174ca0ff932ea0a4208e25ba763c291826a447cc5e32941cdbab4948c14c7335302cb4f0ab2e8f1ea79213498a790f9f8196555d7a3606e9b71e1e0c83c1ec9ea439dd33d8e0c02a08a72a896428b1ac8929f72fc0085a5f4df70510b24a8e9e3d42b84c76e65e94d2fb94f8b185fc7721bc49540b74fde3d3c38a2b33cba6ca25f18d4778b52a87f52956d1551ca88e59254af1a21a05a796cdb0a59f6fbf8545a13b52040aea237dad97be22e53ab2497da2e370a3c855d2e37a873bf478692d2da94c6159148d1dfdc4b99bbd444ade4f598116d45b8a8ab1df65f75e2c7c522820992f1cc47c676c16bf6bc3803d37767a5f60895b2ddf41d32563b82d0447988cf0c0ffa8a980e8331d595719d4bac8e2d22cdede8a4131b7c64585cba15416b2173d4e153946c92c405d12890c779192c395774411348bea8745ec7871c98d203efa07c3d7465bdbfed09aef6cd89133cbf9cda872c43cc46fadfc17b16c6c819277a36d67f28da34370f184aed92c7c062552bd3bed2c7f861a9dbd9c61c22dc4e2f28a6d7b144bfb9b99d5243e2ab33588d83"}, + {"0000000000000000000000000000000000000000000000000000000000000b6c", "008876c9418cc0fabf51d07b658daa5a465cda0ddd05c3042d8daaf603ba9245a1c2afa7158f485c376e27232e770956972b85ec33db7df69901fffff136fc4c7c9ca7c3a230218694475fd2dbff8ee74d5f217b0509fa79f307b49a8f03d367f841564f4eb6bb18404ddc37538ddd0d17c2da3626cb675b6ea03e796f1f168ccb5f7cf7ab51c22752a8567e96d144084c13c335fbfbd654f86015d4da1401916b7b9988f49c5d3109cbde61aba236a9a914b21ee040ea1f836d3cddfe0d379541091debbbd03ac0ee8f6b9ecc508cde61b41f24c9d2d326626dadb82249a99df311a54f7e05e020f85e5174341ddde5fd56400e44115f56cb1e4afb0e12c66755613f2f5fce152d29b686154fe7b362f126d04ab0828a7b85dd7244e03344e34de59cd7b7bd1029a7bb868ef1233172f97b4cdb05674c733bd9162f28849eb310e276d71dc46148da21b93f894defb30251c6951d5b4e2d9397777f404fdd96debb59a30d30d1db51602f651df858940a576fef3585534cfaaa1b5875b2170d914c91fcc514f87ad4aedd879a9d3e243d8f7c0f0e4ce68acff6f0704f01062a3c971dd50996eaea3891ea1fe0cf216d8b70ccac8ea9e4d2f520b48cc0b79d900ffa96b3bbce9fc8992d248e83f91b5aed1b975d6f3eedfb1274c9fe5fe4a19477249b2995532d98ce7d9dc0d152ee05cb7254dc6e115c2f06304a6c68486d29b3956495fcf884cf4781de5cd10e60c99eb41921418588c7c81056c6ae0d5973ab322141f9bf5e8ed59f133934879859fa6627115c012e41bff31cff915fa15317b59f01edfea9981fb032270d8e749ea565035d47b6c23a959707e213f6bcfb2d13973b43b5068c8ef618aabfd65c0bcf47e97e15b11d641af00bde89b54c5e82137b3e39bde38493e35e31bdb5de184d58676374247d89d7317594feda81f2036d7bfdd387c4baaae400f187dd0f6d3df577a28a0a09fa9e81d9a9ed605396a8e661dd22f2eb9b6ebb09d8bb139c8c20d8e9c2a13b05c4f4954a709d463126bca3e545dc1125fa5483d1e9fc6a69444f8f4bf80b16a1728f9dc14372c326091655b8caea2c19cb4b2e7d83f4191f355b9e00e3a5f42984b7d5559f61e818d3be1d628a725ddb6692c9e3e1167ddab71ced541e8cacd17ca4ac654b0e33c2743c885194a911755b0cbbecf775a6030582fbd0e277c17308392a3526692b59edd6f8a4742330ae741a72d3abaf1b02992a341447871ab10c8108dcf2f67ec5ece479e55ed5036e241714670de5939382e4627d0398daaede6afabc71197db42093f3da9da0a093003a5c61f3a23f1fcff72aef5230630d098b367863cc31b81d96614b3f1e352fa0fc79dcd907934a8ad440dab9ea72e3d63e52fd32641317ddd1718cebbc97968bd5d7c9e663ef3c350623bddf64cb8c2f26d5091de0f2a9ca96ba1e97e01f6c29ad9a6aa5d9fc481605387622ddc1ee914cfc2745214407f0d529c1467458e5cd9c31adebae9f97334a7a37eb9e6a274802354dc56206e611c7dc84e409a61c4cf34ff43de3b8846afb75cefd6ef7ed382942bf62909f51167162d515a85f63f49f38231ea7070f8f95a543c434f24e3b44b78747df95b052fca2162bc50ab1c4a30c4f58ac25846c7e52d1b5a4f6cae209e152152b03f2a2334ae9e333ea41fb8693fcfa770e83ae46d1a56bf35a506641816f3a4a24281ec6a81829ef4f26a10fcdf40fc24bcdb649a73c2d1a772620957e5fc4e89b3d46cb66e3da4b0f7e4eba1c28fd0b2b56c4f65e0be6fbc641b0a15e6bfda334d4b7711f2d95a490cc3c92dc94a344584a4df32a3dbedfbe3f462624d7dfd41994d254f789fab49b89691e735f4e6d177e5a3858cdd72c5759c7dfb8067998ff1dc1"}, + {"0000000000000000000000000000000000000000000000000000000000002b93", "008f0670a8d50c02c3e44514f265459da51df724924796ec653c398f0fdf88b5543862d68dbb489258d1201e423accd7222f99ab0276d6d36e8d31bff3ee744cb36f6a4a23f72badafe8f635706aaa86e1758acb07fb70ff8946e8b1a65376503fb6806ab443b80f37175470f41b160ba1a0ec42e606e8a77b9cfade53f60ee08c182f083a968c1589f3545e824a7d4f158e5820ccc67cf6a3b807d4c8e550086d9c130f17dbf283046347155550ba735afd350bad59793980d3991145148da12f01103e53977bd2469d2ada767d6a3c7d5c38ec7d1405b0dc25f7f473cdaedbb53399e09d01bc431f0e7c5ba1e75365e86483eb37da69bb6f7d40c90675b04aac0773ca6307135ce0dc1ee6a1bb3f068b250bb45a558a77b073f4b71bdfbe8919f5ec592f5212738a276c6f4d61b37522429220cc4d0f97d58e9760c0bc7ca76b3503bad15880005e654a2fee34796601d8e8d182c6e8ec895040c8f1ae7b5d040df90c9d0ebc4241335e1e676dfc846c4bb068a22ae459a7dc17fb294cfdeb26f79790c55b1d5233a99491bc765c368b9462738e9face214e720a771f383059f9ba86a0cfa3f48941126f6ba193271c8627b45babf75a41118c94b759f2ba41ddb51b9360c4a8232f41a387e8f24d76c07e121f8bf2c2bb7b8b7ca3592a0289f60e09b644ee7d3ea8e9b8261dc04817d798f09b57a394601f865c71598e459065f9081e087c7509e59ee66ef46aa7719c593324dab4106d1fb47c9522bb2d2464d28db9bd61aa0771d10e374d1e0e7024aa75ad7064a2ca29fd37f9ac7331e1635ce09bed232c599fa0d1b033a628de59bddb3640d15a6e6eb7f0ad3231fbd2b07b393c5d15c7929ecfb527ebb702d0a1ef6fdfe292d4d7be16a64390376069af8acde8902da74fb098c30e4171d6c518b86ed9a23e11ca50931149ceeef0b00d4bd1cc3c2de1d9ff643dbb52db94f74241e285b223c379b1bd56f71683f7272fb675794da3d5a36d70e2a2a97b9aabacfc535f50153b54701f0e39b1f6f1506246b4f93c8337b14c5e9ed7060661b5916ef150112bad677f0fb6dff40e0fd4c18714986ac7be8d514a8cb3806b83cebe9851273db56b4cc9e9b4c1c6a0a5f649454a6c4cd425eb11fb9c50999d77630eac61d4522e35e0e8c155bc4744c406876a554109338a600f5c7c7198ee143dadfa62be2629195902c5504fa15cc00d4a586226fc09be7338efb62c1d0e9ef4af01bc51c09b0c922ffd69ed751a25f2daeaee25880391cf76f00fedb801fe898c3b0896f9376120f1d52e102ed3c2cdc424b837ef852484ef31bd5648c51af413d9db503f39cdf51a1b24a7f3367a95b0abe79966e0528139e1009d3bcf99bc62279fc1c35e7c0100f4717ee03a4ae1ba031243b122e97474a59a6615214cb0b393b138a4c36b3f915556994e7348e60addbb0a1129dca295ecea19fd6ebd3a7f16e5c76f252b7b0331b1957be11670aefae3531f9ea7141c8d6378e25b51b1a3a71814b10bbf18763de6ea1e26e56fe9bb5991f2ffc39301b27a587fff20b6314393e1ab7124ece4c6d7e817357f6fef290d542d4f96dd5fe6fb1b3dc230ce416c69ec331fecd52710d3ac9bb6b605dcb082543b96b568ae12ba768e8af0c53ab1714dbdd2eb30b7b86e5fbd7b875bedf8357e079a9baa87915cd5f1b6f01240e2502c5e29f8349f9f8e2767cc2b58f2813d6734acb190191e865c2d5f37a0e675761de92ec2ffc7636b0cfe354c562f37b1752646dea7d3d78570b9a89e994c530586220a8ebdc5b78d23de1b79bf516fadeed20cca40b05ee75cfca57790ec66cb936882426acdd92738ec9c6b2f2b0d4dd30eaf1ed5cb6af2d58f98e8aa5018f8512b65dbff3bacf12dbdc9126"}, + {"0000000000000000000000000000000000000000000000000000000000000399", "0105ce49bf09a646bf50f7b731f3bcf2721518c65a30f86eab949e7ebb83e73382adc20231341a9be93009a89d3f238e7faba90ce857bad9763e41b53b5832221459ea8d262d7b98a04733ccd908d1fb5a75195f0ceea9c95da010c5b04207d681684d1aa37ddb9cc754fb07234957be12f5ec968220e5b3c2adab9d2e8e17d3ec6f78a1b7dfdd219271ae958d34d7ef15dfff372a4af62156ecb2c86ee59fb248aa09fbf510cd72011d90c1d444e44de9f6c0eb0f7ab355f81053e4c82c4be498a15004a3fab4d40bcaf2f4a678e45644f5103b9ebad49fbf29c4bd51b5ac9446363270b48f62112a1a27cc62005394f90705a4ba8b35d6145128b40175991798527146fff705982761759a844b38deb323f8f61a25d0d3093c5f22d5a5bab957ac5bfe1cbf184d62ef5207caa8dd6203ec854b108a4191d3b4d22821bd0cb2bbc0e9f6e1d490cf547ee934511841af011f73d20caec2a7cf54935d16d5d9997dcffa58f10aa2520ec963ea8d71698364a2ea0830e9b4cd259f166d25003f99945153be36f1ecfce44a2f6955b12830b2b9ebb6180601491dc83c5d75fc963706f594910a5a2c7eb39602d5f29700ba37bbbf8441cfdd8b052396d5afc549bf2c9ed545fe7ee5495a325253acf60ce8a641cbf07c01fc74fa50cce8fcbb0dad9ba17b0d154a33cd62ab2fbdd006670061dd1ec65af656930768b896cb96c16b2caae40bdf4cf945b35158e34f10b513040c06510ebc0d3385e25aed1d36cd91dbf71872321a456f6c0f9159d571bc5eec7a870a3727353dcf4b5505a3636b4b9814096bc863d6b723789c870f17e74a5fdb2391dd38e3a37cb0b74d283e9d75f50fcf3e8b7917a4d8e1e4b18c7b2702a8aced2b74461be966a40d92847dfb4bc20d0b6b39b11f6b4a61f61c3a147065cabc9b1b5f43295a7e11d13f086e100c01b2d73861c65d978674d1a13363e48df4e9be0ec806770bc53d99b9a9326f81fcb632bfa9e7c5bc463e13c05b0a82871c443a4e717a9ae98861b4c814aa49500eec9fef9f95f3aed4c64f43e4352ec2dd16b082109c098c2a1e23b94b2ce26cee15ea250fd79d89042a9152f7ddcddf7f266a660200b58f323746b2e51313bf8b14b155e808d0c6c1b17f1aa6dac11539e26e3c947a905c1515757f8c463f26ded79a9be3bbed35146a556089f0aafdd2f6e1aa1d77f84d43cd0ca2cb2846e3658fe23d6b8fcf22aff7ad6b7535a3516dd217d56ea468715543926e8582a0fe55122a7d3e4f944c76a676d15727fcca0446a075454966dc763ed1ff1e2483876397c678bf4ef6d4264c27fae59e58c809283eb7d9ea9a4ced959dc6052abd75866db29fd07431a655763e6642f53ee79ca2f6ed603f7b9dbc1d36341a91aa3fba0231e6da8638a2cb8c35ff2eb1bcc7021e4ad37e535b49e64973a8646d514abe38b63c1406703a38620d8f38ac96fbaf8e6023539ced1fd1d01702dfc941a497c78f83d21726b4b1437056fba36c23cfc7546d8e48631e5774a9b235d72da806f3e055097e9b6b921f60013d816343cfc91aa0f446f661f912719aca431e4e278a18f3f4c55b79de776ddc38522bc7bbc361eec6a5ca9f939535a28f32cf8c7f19cc39f15ec03d16aacbca34d3a184a0d97f18ea1e0e210ae32e722a95a51b6341d12fcb1ba6f91e035ba958172b7fa6626ad2f77606e347b6cdc4550c8071cbb51c5aa30a6514d48de7b205c13e318ccedd3e3cd38e1cf2a49528164c92ef1ac3b58b4eb5e9bd43dac1d70be32f650508190fb83518ac40cc2e9270bd5f8733145f1edd520d81b55e8fb17f407b01ed0522f18e920c738b0e57ea1ba5acb3b1f9f6f3bce311e65da576437c12d8f7a853cb521a297f3e71292b6c035e73fb"}, + {"00000000000000000000000000000000000000000000000000000000000010f1", "00148ce2afce7bafa649a72c2fc68d2b22f75c922909661c03f24b1355b7fa626f6a35cfc1584638a893054b3dfc080161906bd013d4fcd79cc101dc50bb2012cdbbbd21caab62fa53d2ecea544852c621bd0a65049c1854ed5b17e0eec0b0ed4074bb5a8946397b850fcb0bb7eb9aaaab5ea6925dd251fc25769631380d0d505764454d68c38f1d86debae409f70a4cfd7ead11fbc19cc8206ef171207474c5d7e28e33145cae8600ffb3e8af5d73c3ec0c72405bf4522364eb3c60cd0d765498eee3ca53b107b3cd96d4556e46f6571f490c2a61e7d0c61c504844a5571a57266e230eff1d9249696741702c4deb72c707502d4d10625ba19eb84c0ad5d5b9d891f1231b77071335e47b9a2e353fde3a3641afdffb734f99b7e6d8988368e56eb08d3b48632ba25f79d74d06755fc987b5cc516b2734095ef0c32cf881ebd517f0a33a62746565f05f75a6d65bb0ec0240e6e75e3087fbf56054126a4befc1f356fe69912cef93940453c387413c556fdaae35ea33f05d2fa1043528508a09db9fd9b4e1ebd2d3548909332eb56c31c56a4043155dafffe714165273963f92efde19da02e458fc2ec1d85248b463b274dca2e2f5f8db473c1a325392a6cf117f3f3fc41b53def655f40c9d34c0201a7749b0cb0d77cfbea2484212d32156883b8fe92f5b94504fad2ad5e3f416e53048f555bc05b1d7f2053218a37ec45d710a63208155a0ccd19fa2b227c544a3037d98f7fdf7e540e49759efe3cd71c40c5379058f3ad762a56087976e162d50b8008ea5cd36f8c063e91ca7ece15433927efa649c7d9aa774673f7fac0c942866b050de2ef53d94001ba774aa67c8b8e23b3dbc534b7b95014b1695d756b349b6e9da1ed4a9f30ec2d3d4fe747585b96ab2533ca298ba1577b848291cd873e122a263ff3acf953685b56f560d4091d3b6003a2d48410594b0ba345396c83e85159101599a7035be2e88b6d0eca4dbf5a914535e85426596d3c36a075c43351a4a54049c3081cd9e4a63e647041902071bd4bdbd0ca2a7594df7d34c514a83c7260b3b98030c86be0a290b13b59abc76973df4eeda518f9f006e384bb31a3ea295cb1d3cd75f5ed07871f460353b51136a6ef84217b0b58ccf24cfe3c18b2a88b6dc65df1af290df4dfa4069f462b56dd6461309e92b71a09302b5d38bb3530777a353f136d045942dffea9f337d25c376162daeac2592a844eeabdfce8a3611be50281a8c1b26f9a78133501e0603b947cfbdaa1836bb053d484eb1c9dcc5f50d46e9382776f0924f9c7635690a12518060695d79988c418185c92602eb953e12331b11c5e379150e53d585478bbe40578afaa4791d0727cfd20a450c1c9c7e2904c3436d50fa8def149c585a56043dc9f48791c74215f3bbcf751d800d1f136801ade205cec6593de3870564f44839931efc7f62da01c64291ca822a0f1064b668fd72dd5ad37b185227040e4a0188610487867f21b6f0e12e9b46407aed4205f68f93ffc68e6510ca525e327dc260db627d6d6504e42065168acbc3793e419f3b54cab9159f5138fa279504151eca62398968663d96f2115a8ebb9d86770cef6543cf13290d0bf235a089db40897a412d57a23c7adb616d172bf79c23848d1bcfb69d24c9cc748a0741a4b289e271b1ae3cc3ffc5e4c8e1346d75c7aa183b86323b0bbc20808e437267d19685399f17f6732911a968fd55a9f7914e72beee9fe18912aabd68122a4af59e4634a729d96433f38fe14e8a1ab018dbe70d8c1b3d7f9ba2910fd2f20010636da0f6be8c366a1c730589018dc0ebdc6b2556f036db81bc82ff31780d9c3990141f2f81d48652043e1a442a2396f628481c70c9084870f551f32be346a5d9b650d5abb8b2f6"}, + {"00000000000000000000000000000000000000000000000000000000000008a6", "000bcfc59ad2b22723cf557da9ef5e465d7f133eff4d447dec3fd68ccb6a11d7fe67de526e665bb8b0fb456a0d16b6da51ccf3af245f00bf5dea05bcd98157630cac81e66817d780f2e70a3a6545d22ed07bf3c90ddf60d1b8039b51a8021230ea9ead269c26d7f12012e782afeeeb5d31aeb9b571eecddbae8c4cf5917a3259fd6201b149359798f3b67fb760511b88319d4532de545c4a189fd53287451cabc9a4d9e9c496f80a007d58131b887582e77a634b7c47820131dfaf3ebc09e758dd352e23d7f06f345242dd8205279ad678110a328661bd64f2eb73d6014117a35b576ffbde88bd191561bf48de6861c58347de95550a7f07e27c09d90ec336f87eac3f01c5ef3191e336d4c91dac36fe4e1d3d430dc70c7945c82dd3b957b25ebb19449b1756240e77f5db1fcbc5b3e6e91cf1fbde734d781d66899892d7af4da7a5bbfcd2ab79216cf94b209e59e79c044286933dc85ad3ec2fd167443e9c8e2e21790ccb3197befae817c941a37573d41e48b8690a2b0ff6e30fd89da1c9ca7e00bc40212aa09e4ac1bcdfb27a4320f946deae4e6a09600c325f7de146ba75b51a096d073b2cefa1865b22969f769370fc7eea88945f06044d34ff2550d6b9671e0f46efe6fc9e1621d51e889918959a92e7706105d1962244bcfeabe8d00a95dcaf212d0dd2e24b0a771be0c647a7fbf456b97675eee4076ed1f91844ea6eee5d5303d45aa701af709f8874961e3db8d1aebc13e07ca99c0d7d8f1f64ef5cded142874293f525a47792f4044239def3b5715679fb3342e2c50f4fa5ce81ef766a979169e272a92e5939a90ab42333b0ea4401ef78d3c92550d4d1837731d18420b12f23470835538793744f41cee9e724f5bf2d901cdc9914d10d7623aa7624cb122cdd6e0dccb51ea75708f5109d6d298fdabf05901673fe1592a37b4cc00691a42ebdc3b294a6946457794cbf496835f5d5f714ea228670a7a4a15a76943b51c8dfe996db74c7262533d43df717c3a3181c94e6b5fe500e193878f9903a17a4ae1b582483f9b2f438d5a57595fecf10c6ec0ed9ee3777ebf693ccddd69f34f72926d89297ee8e31c50d88f2515163075604c95f272357617bfcb263144e4b8aed1450b9a43ee3a4fdcd616a2d1357f2bd5c9fd34dfdea86abd73ac7fad3e0c24a87cb5a1df90baee4eeecd290c5f5eb7510c1fb33368e795e150e24a152a63e0aae59178db73b6d3c6f927327768c8f12269dea1fe2246d15879190f7b9cb40f0394fb0cd2651dbca84e3bbd3ee30e3ac48b679e183df93c9a913476cbbf99acccded3614181cf9f605529d9c18ba193341d0f8120f4898bd97d54dc5e849f7a57095d617c38417d5182628eca0a3d63d44c1e5e1ed10b5dd6b54779cfcac19f3c9cdc805aeecdc9b18e37a2bd40a4dee7351872af39efbb482ee635f49eff8582096177ee2e382379a8df57d121a9abf178a0d4f3d37b80b39f799c94af1a3b127a19d8f1d2c2ea5c69a83af3587a1bd88ed099d7dbcf51fb229c8757a9292db990ae646c9c4032bcc9bb77203f9512e04c43ac8ae6427eba478a24ad1b0d647b61944cf92562bde97278c24afcb7af3efb897920a73420d9f8e1b29609edc4c2a09dcaa38b3de19ca09a4a35e6ce0c1f6b637e4c90f16ef03694f067aaf10427b33738e8da5b12f506a3a8aeb9336d33d0bdab1160c83ba36b28778de4db21d1d5ea796e624b7eab9881283c7017ea07e36900c30d2928c0d94fac999ed46b60a77bbcf43749f900a22204f5a16981a9ff5e10379f922d449c74b7aa41d4614ed2e7ab34e93e57c25f790f1e6e2325ff45a952559be60f4b36389db149379823fb6c5e72675041c2bcf336f61588bb5bfaa14a4c7b8b409ce61d61ad0"}, + {"000000000000000000000000000000000000000000000000000000000000086b", "0003c35591af1b17dbeff0d6e4e5ab65efdab06825099efdbd4414c5cb0429e596f0f4d553913abeb64805e1612e8fc86f53a17c22f2abf69939af6b313b2011947e39672be2e98037974683ca23f24eebf731371ac49eaa9714dcfb11f5539471aad3120f5274396d1c3911fcae63a71f8f4f42acb6d3a1a99bfc34efde2105054a0a2844d5792d72c49fb603260357572adb4ce79fe51b9a9a7fbe3ca7dd3ccf00be8d8cbac91603eb28522e24a0715a9e76368cfe5fa3151e3dca8f19e9576173928aabd25b72aa3771d0a98a5833941d0ed647ee0f6164d72b47d278efafadde22c296fc1547dd872f10db03f116619690b3df198dfd2c7d212b09ba87688a57a28d5d9a32cfd7cf498d60538d5e4b0f0119c800cb935fcac256e134d86535bd1e7a9f5e0d622c2fcd628e7b94609155fec477b1624fde2de21095ffadfcc504d7d3cbc2eeb1bd14bcc59c8af52600a79e405fc66a22ad7e981158f509025d8d33ed4c0d29f641991e6d639c3265defc352e6daece7c7c9c170f5232d8690615f7d26480c9481745abff5bba033de88e6b96d89f5f7a50d524b16d8871dcc3ff22980919c866e703dce4822e25014ec8a2a28ca0f7903b137cbfa2db56f440da02c5dbd1d955eee05f9a80c31ee2f3a691a848a77b03e23ca265c86e8526d51f002fda0ad50fdab1d97cd548a950dcc27321e4df6df50cef98ededddfb55f2dcf189b050cff09dbff1a09c11fdf6b91e9ab687ee16a8d31febe04e5f36d69e1f1df4549524cd73a8bb11f73acbdcb423dba81f92a432b89277cca371c33af8b6ee7344bd6b03345b9feb0e2d8fef4e674099ed15045cf1b4b309aa94df56a91cd7099fa3cbddfbffb7b42752f0a3f7a47e5f7ab1144d72f148736a97c88d3a2e2c6c4192c3dc5c9d4e2e17029a784ce88bf83d82ee3a630190e53e70e411004a9680f18260d70cc7705388c45a792b7bf7aecc116a858b10693bfd7584c219aac86bc1d208ef359113ffe1541c1e50558b6982bced6bc0571ef47e2c6e24d8f435af5ad6a0dd6ee2575f981e7589a78ed8b8013c283bbf6dca21e3a8f863e3e6933643a9db9b680b464b830a91d142dba1e50c203fbc761388f4a2fb0a618b673877940bd7f024b87fc38af60aa679aa7f1a983c5520a2375fd45e05e2e8b9553a9850393ed80951ff1812169ee74257e17285eacc257a63ae7be33bdd4d30b69b9ad3a6aa67793b511a3653415a25b414019e1a1a69ecbfc02bf1bf119487c28fe5376018143e64e835dd447960b691f26bcefd44e9907f16f6228607672dce6af6aa7ef391735e811d228f9f2eea33192c0334523d9b37ea1340447786ce4a28f7f7da387fce077ca8f213c6593612ee46487a64d53ff339533b54cb773488c3aa14a7b3bb76d95a607bb9455500d34f0a3537d93df00d623266a5ca18cf215854d41c094b3a159a82f7258846e0dc6baf52a56f98db2007b7122330617a5b98ac714c4f56d736670c7709d61ffc3509eab71955df7012574a7ddd561918b55cbb01951da1ee8e6317c9aa442270a64a82114fd77b73112bed9d5a270eef920762127b3945466d63582b9d0ab07529c2a3863d47856215d6caf880ad35d928f321098da6ec4ab057ad3fe52774e9e1fa589a3431f105a6a1ec955ae9bfe11283c7a75a197dd4793a8eea1930f47a5f151f435761b1f9737ea6ef1a25ff53ad23fac30bd60d45834bc7e6f521616a25c2a57298042a3d118e300b52dcd1e93b9d83e4508b236b3fe0971c59e5ea6c594519f2a4f3400bb7bf78eb59ea60ea6526e37d719bdcf35b1327ad08ed88def87e1b81cb20da4d17511c157130d7552c117383ae034739ef793481d50dd2d28fb98e0407604164cd51f953fd109a"}, + {"0000000000000000000000000000000000000000000000000000000000000285", "002323f5168d9298971261aa304528ae13fb712a5d1d8ec7b757d4a1f18754935e17b67145015b3f58300babe567800f771b4ab14327562fba2613d2733c3c0f88a773e3a995d5c7c3e1b30a691f5ed97d3b905213d2427638ddc7331079d6978e38670723d7b9cef028da51a0bd385c3bdc0852c0d435c280e788f035042c27dbe964f3133bee9c130385c21b54dcc8aacfab3c9585be6c971127b6c713d3502eeaf1566595c2a003b6829d61b8193feddc511aa0ebe355905a59ca3e23fad13cb2cf2e53bc8933b1553abc77275c5e171e17172ec8668ca3d78a2ac380ddebcd852b8330eb911de095b84890a4d322e862e467c3971109033969401ec9a5dea70f011720e9b74195645a7adc0b597631379bdb53d89c1b7b780539218a66aaf29cfa39ccf627a05ab217535dacf90f341eb7370f2a8b6a5b1212301617aa97f59bfdb0e225f006347fd767819ffb30002e45b5d08240fbc81ff7c25673931f5a2adca8bd02a21a84734fb1f96f325591d8e271fa9e9a17fee5084e8722d548a6c862a8c50ba665ff6d62f7df308a599c76c7d62bf94d607e26c9834b9baadc3b3995e30ceab0907a6baa75aed3318fbe95cb44ec93ad6799123f2fe08d963419867cd1f790470561b57517b67f19cacfe9aa4e3f8152f8f65610d605ab76ec9d343b28675991100cb6bdce42e6b880c0dd5e06d41b8d6e032a04cbd581103842dd51b1b4cdde2541fb75230508995567f0567a9be11ea437f05afc39aeb0b53767204481e88499f3e17d5a46f3acf4fb6711687b8dc14d805656a762752bac8746dcfdc7202a60eb35ee570922315c5c6ccd7f88dbc204ff4d7acf51857f9482254572cb8a4bf311c7fdd63b044b74ee626096295b09821327465d3d9def3bd64c60b4ecaa7e737bf89a1e0c5431ad77e4dbe7c493f300483d7247dc1bcdbe00aeceb17b088bf5b2e3674367e8e56a120e9e9a8710b9e3bfca9eb5ab62c0a7df19f676062c3d7cf52d00db5d3f3f96b4e78aaf205af3ad5190fe5cb063bf010ab2e8c75f93c75ccae5ee10e4c61a68e11bd29a04cf07eff71cb8c98b90821c137cb94ce844ff2fcf14f9b5f1aeb3b765e1ad3682345a4f3a269e7a01181c1cd3f7f1ae9dd9dd84e6471d4ddba690775ada6f4da9ce9defdeeb93fbf376887a523a0a13c8ff1f6301ca93eb6e9bff47896381a1a194665abc29573ce709f6b230acc959eeed7e259234d060aa1f3b3b6b7a07c40fcae7985b8137a583f1accd0481132457d34a082edde78724adbf9087727652e49f714fd6cda4fb0236c4b4dbd1c35ddd25f68f283ab4aa61e77b466422333e07a0ad5c23e83fe85120e9f496fbbdbe96ef0df9171878a40d89298a231662c6fd1610adde76910f9823c5c20cdf7b7baed1446c4b6519c21dd3d3d700d1c8e55403fd298fa10380cf39dce36235bd2d16261c56a87a55f3c14e89b51c99588f32f9325dd98f0238a41a4898e265927e642e37417bc5c4b7f9a93a0e93775cd91ee1396c3d64955ef47d7179c27ab5dc00ddf0f8771c3ea1b44c34139d607cc587d7f6acd20b60bba0df65dff1e7a7b47b4bd56b122145172b690b1196099d8f4a697819a2b07ca2a061b5a95bf74917ac1b50899c97f1800391e6c66d0000ebbcf7d77901b0c0bbe85ec32d8ed3e72a23c679aea53ff9bb0f1b7eb1c3ecdc3719583cf2163354c1dcde51ba7b941b11555f9ddb4475bd880299f7f7bb3e159579cfcf2233fce372db0b9b53af75ae3de3a79dcb861399fb0c438a52ae1cbee13337f4b93e29ca2e27ea9ee53538cc4dbc238f28cea13203a1f5c00cad164af05b7f0d0b86b226c4b1f2761211ffc36c3fb117f5134a043227ce45606050cf1d25242d7be288b1de16ffa7bd"}, + {"00000000000000000000000000000000000000000000000000000000000003ae", "00a6772f6e1018f0fefa448e6342bd05a60572a2692d6a736e4e1903d8d69b568e507dd1ee7340be47850b182fd40846cdf311b094226e39f199a2693ba5db3b31773e3f10a12b3a9cd4080bfc0981a4f8f49f7b00eeaa2b46d7540341a1753ac0f6b676f225daf5cc0a4ac2c05d9d137938dd235948415dd90069c8bb1619df0421de488a9cadfeb830ea59b4320f1e78651f1af70b5fdc74909bdb651410562b170678109dcb3100de0d857121a1d99086b23d399318c1229fd67ff9076713c847954a9b90417091af0f3aa2aaa8f5ce8231acc3ef621a3dc5c6ea39a963530a5294db392b345323d71778f78657f1b0c6e70ad5e355ee5e3567fa192f299be7d3a7fb7d42c9f394ed73b352cd7d31b53a74db519f1454e524db2cef6aea884f53707fc1aa236a378554a33937fae89680f964cebdcebbf6fb4847cd9bfb25e7633961d495a2176dec360c3a542f290115a7bb0dd9fc8ffe7e229e1c78b6975bb93cd9160380cdfc404bd5f4e529218463430c6624a935477b1db83f7ed5ea554d9d4ba57bb5eac66d76e378dd6d527376eff2ef6e4dc7d418f2617898d6eeb99ff1300ea65bc34d99bc2b94b9e7d89d6e162e0382f70f48367da2f0ac768e7fc5de7733a56ae26e28e6f488a22b7eada245efa373ffee153f424cc4de425ebe32644e4a145551f6a461d3810ab59e7332bf0a4b78bc6b01ca4865f0504e92eabdb0311f44b7e474ec3f74d205f0aed08a6ca401bf496119fee1a859f1b49ee2c80fe75ed2fa12b671d38a43c52aa457a9eb12d6d9a12365bef5f84afbdebe2f14b82dd9859af09e9ebab00260b5216493078fbdce2705e7bcc3e9c8547f56bc331782d2bebe991ffbb0446063a93f9b24a95c713c1520fa0457504049f7a40851a96a38a27b8916ee08326e0a22495733caeef8f5814bcd5092e7283e143803b41d446059acf167ce6359e54d84bd4b664caebe1f37aaa046e1fd33b3a95434197e0c62b255dd930116659c03328675ab0c11e1c8c39b633e7f80594efa313edee95be69375b89858c19eed99c6b3855a0eca10307365a2c527a0dbe412a12734e2398547ae99743db88f6869e0450798049455d950d60e2048b8d01a12085c55d59caa05c8019acf6377582369233d06a72725af377ea8ac97fd32a4edbd7167b55354ade67b03c0bb2105e682eb99dd128042dd1a0eeb697a7893402a9ba798e327efb7f1e7fe4542a8c66d063af2060c30336cacc97a97c5985464372ca20b21827d011b3ba094853f9df8e77214a695ea6383b5d3e85897c407180c2c7ac9e973ba8854ace74f34327fe93c580c16fbb612cca08565943882e841d07f1e5bb858d9be15f2b9e3bfd1fcbf17bcb39be0b522a67939b3cd9b43f31286f571643fc3b7949461bfd31304531d0bd003de20c53aee5c2fb859c20c25b50c950368dd47e32298b96c6d65bb8362cc63b4b0fc45a60a05d59a151c3fd5644214c38b3e21b327c5d55c27f5057fcf4642a45e2566b8b6dbd2fb458cc76474edb38c3785dd26d75d91af580d36d1385384c3dd8e4d0c0dd5177f3dc6248aad125a215ddb0465f942e9493cc13ec3f428f55e58acd41d5f24c982a93acca750e79d6cc2a435b06d16ff913972c7a164aae5f61ab218b99f1f7b0677ae9e680e26bf9b14819548e90189cf9c2fcc5907604fa038f9bc25f44b42415b6386c11253907e62118715e0a1300abdb02da5b4c8d239ee956ef5ebf43e80235d3d360031e40eb426a27c3d266444150cf510d0e89d5c45292c409bf3789e743e01cf6d6f7717412e2c8b012d2b5bc8b2548cd148fdf1658ddb2ee4339942f4c9361963b1c958a6565335daa13abe7ccf5e5edffbb9237b812598f76c0a43214ae1d0d83ab8"}, + {"0000000000000000000000000000000000000000000000000000000000000276", "0030d24773a58caf67e24275edca3e562745b9356828f28788279f49b7604053e9b6febf95b500114bcc0153915d091de9d771a934a652a806fda19c703ba0117ec0be4b0f1f53aa96f1f0b463bb6d4621ebd800015e9c933702d7243927c429a8a502caf6b83fff980f1ddb119455981b31d64959806c307b4a42fc7c6208f8be5a63d50a171cedb36908e4c6a4e449f6cf9d880b2cdf7725d0937259695c68679a86be133759bb02a022d71f553f718d72606558fdd621e2823738ab0e2a9349180ab0c4f6c0a1fcb3fa80f8dfa8bf2c5d18e1fa6f2d8c65c377871206fc74407e2fb91c281e1ad07acd4e8cc5f8b6d0a41a0bb700d51d30377bbb0aa7655a094b2caad99e56eb44b7b452cbcf7fc6f2230ae492eeb79b31c0aec2f9c59c5c575999fee7d90d58a15418b04b3794096115ae2989c91380fae12017e1bc4d470c30e99d7ab6722bc6323648b2bcc48a03514c804fb75899f2c7c8b82dcce277643ade6e2f1b50adbff2d81443a7c84c2d62e637ef124e99783011129a6fd1bfa647fe622160c5c466009c5997709b16689c1fb30a26e1cc2052b8d0f05fcdc7ba3e995707897149551b0048ece314d6d93c4fa22489795a753bd02ad0a6908245025d070df8ee1bb2129c5422181165f392ef0e7b4ad0f822b5fb3640a66d093c62d81d1d1a5e8b9ae441bcfeb607a049e82da0cefe7128090cf621224ca482f78bc9f5c0fd672a87eb1e8aa415cddcb46b0dd292e3b322cd0722539554f8b413522cd384f10e923a4ac19c044b64f452fea6a9367059337f1a7dad4da1e3cbf4baf94de34aef5b547c9c1509cbc8b0bc443dc1c91e03a1c6d25830f37caee517419a766cb81be83f8b6288aacd4c60739fdbfd781028d2bebb570b8611497fb5e4ce3aa739d4ea3fb848401127cf9d571187cf7f25531be166aee9335fa6a101f0e2ee8b3ee321fdb07314309bd080f308dd99de13924df2db8aeb0fcb86b40bd44d3aba1ba7521b780a549ff49305c4f53a60c4ce5a72d07b149ebe8256110d735744876a27e10511e397d360e17f2cda548c08028a3bbe8e32ef8bd8ec04b36db4c325377d8db219a7d957a91b1b694926619ecc9373de5e20783c3410fe2ad5575ab60124f4d299c5cb0d46b708f832bf2cc7c9e8a0ec11bb8df292e4a22a802b56d9bcdeac0de5f0c88b6abc3de54f177e72c4b983377f5e61b4175ebfc9dfdba2ed1f704235de7d25d89c9431769b1f44698c8f91a809be55986bf7c5f0b249fdda8f2029e49fcdb6d9a7f7ed1b1a42f25e1272e5259e539022fdd4477c0b6bdd2a8da4381f2aa6913a82d7e3ae8972d62f1fec11f1bcdb591d10cb4d5271d0fa2b3436e784e5a4b07597cc425553cdbc8b61a8891149973bf33c3fec35953bed1204236a2ae1a5fa91f4da9f042d27e547f36ffffa5af4f6307e4aaf1a403a0b2924fd35e45f314bb5badc559d0a4e85b61e3dba877b13d2bc03dbf061d1c6afeb15d5f036fef793fb8cbc158fdba6f647e693b49b75e3e3e61c66f81839d8d90f19134da5d5a38b6796f2053f7eceecf46a5109971b19cf569570f9e7c69754d69839761a6dbeda09a317a474582d8fff46a1b5b36b5aa5f856a12bd65f9244b4d5e341d229a2b1a3192c0de477a76a45ff6ee706186e7a28c9807d9eb83232c5e7f8c49e49f9899107fedff9fb4f1a1d962db0b945439532a77b39de270e0879ccc150ba7ac16d616af29d466d79811ebdeb396133882ba1efeb9e92673268ef9e021e6bfa3fcd09eace20da4729234397e0e39f94174734b8df95ca3c2a7478445b8091bbfdb51f92c7b8b99a4defd0760eb33f1279d59c0cde4462673afe9998b47a52734419035fcc8a4bead91212e2ca612b4c9dc31351316e"}, + {"000000000000000000000000000000000000000000000000000000000000031c", "001109e266da0ec6eaba92c04af5769a68cb783cab1e7baa98f667990f699b041b5b611fa9b89b1d5f8904e99c5cd7d127379ae583d96568a4ff32fb7a4d4f0d23c2fafb036dd75d00035c9636af55a113db452d072a5c74d6b2e73be25bf678925b194f244d1f3e7a1d0587aa8c6b0e9177e9224c25730f1cc32e910709205342b212d6026ddb3ad41a1c5e82154ec1fc5ad02d7fc420a35937afa95c8467c4fd971b1ee89f675c04385d09bf07da0988a31193884c89047eb1152705080a4fade16b917ddcfc6675a0f935cf33099ca51209fd116844340b4bd52ac346bdbe7b5aed4b3c99db437d424bc3bbf039f2d5558ee95ed0172194de2a51056b89c90433a6ebe869917a8534b981364333956f1a9823c64bba44c1de60d408e4680599cbe1fb7bb734a77ab47d12adfb1e9424c01fc7b17758cedc6fcf694526fd53b26267c72b46a5eeb9525dcb4b5eace2031e0849355b1db5e553643017e7a5b5ff8e3784b72e7cf7c76f974f53c39a180b59ddb3c24fe37d1c0d13da52344baf6031a4dbc4dfd0750706e8e0d9a8ff1438aed3bed193c172b156c2595cc4addae1fe3f03042ff42d95c4dd4ba95e63b20abb3d320d143e2d6104662ce64917e7436af500cd38081fde3f7832d3880f215ab570ce1d3e899452be99f8ab96b0b19898b8232a557ba5df13bb00c9f34c00f6f7f6588277023805e61d83eb4be450a366825e7e4ce5f15730b89d571c497e14875643110632365581d58c3b50825b66b2229d6c881024ef97ac9b3234ca47b0e4f71e379b122c894166c010573db9888345e65cfdd12e073db85c0bd3ffb2b267d6fbddfbe1258c2e7561ef40b3922624a07c4391f4472dc7e6a934c9f32686502e7a5d161917e24c35497e47e7dee45f24761525dd3435d6f42cdd674027e8c9fbbb4183622e47671f791b9e0eb0009be12526d26baedb5984a4302a919d5c5671c50a3e769733e86c744fb74af5643c592e92d1ff18695d176ce3a8419aa4cb84f6b896a5c4f0fa5b769a7481293a8a74fc20f6499b1282b0a698f6a514affdfbc2019b64451bb337a5bfaf41d7233f3244eb6f8b0a4c1418cff1d6d9749b5422a361e2ff7d2e94999cff9d128615b11b864c584ae685811747ebfb3c059ead513cd5db45b925d3597fff27ba5050094b1c41de3cb1103a6122f3d2ccaf96f1a196861605fe1be918c51d206a2cec2b70c2ede18cc9d96a6692ea8643da72aa1501d36c2ee795cfb9b5918dc0dc4d7206c63271111e70f7ef520cdc7d99d435fc42d0dfadbf419f89e1162a48daee093883f7be7494e9b1dbdd2d403ff21e1a8c6bb71bd5ea836d2309b0ec4f4be6efdb1fbfdb16954234d3077dee73d761de62e473391ae63925ab1ea0da380850fd8ddd16c6590b4d284aced277869e00d8aec284c87f5972df05bf7ce3c75e982d3ed66121cf471da2dc41cf19e782a0ddb7bc49943afe0ca404c82b8aada3fa03c13fa67f73d12e764c5af7e00e134af5aecd6e991bd590e42b457dabb66d41790a6d02c8cdff1616c1e3b0157785807d4431ebae31c1574010540c2ba89cf5f4532983a45f19e28b7bf9b0640a2f4efaf38878491d0a628a6dd2acf4d9fd3eece3504592f05b229061b206b52aeaae62999fe196d176092af49eb8900d7b6cbdd2ebe8256e9d5ad9b04b851a6ad5b8a20d23f38201a499462d1cf94081ed0b7815a48f97b8e69dcbbd15465363653f8b279ebf3813179464806f98e7f7e1dca2efb25f329df57272771f10c956ac0e26dd958cc464ba38afbe2badf17f559a43cfac0d1257a26109812a6d77675d72c3709e749851189e3ee1956c9f8002262610f4ee764c0dd9e05255d9a745305b94bfe3d8190b8165df6abc7dbe96fa"}, + {"0000000000000000000000000000000000000000000000000000000000000329", "022e7f086a9b2dd6dbbf71736d8ff5c13af31713f42ae7664efb29ca8588c8c43b1d6f5ca1a073f181270a60d5e262973a07a58ea22830b5081fb9557e02d90b2af6027defc90b9f3b91f961a50f4a5d131b75e41045cffff8cdb6bb1ee8d71ce256687247661615e31e755cbac719e169e426c356cfed8b4db1c156d8bf220f1254fa8d00859a60a6ac07413f824a9dba945646cc8f476caa99c3e08064e5726c071e62d7fda8e802b227c58f4962dd1c0044211c2868deadfb38ad6922798a4576dfd6a1507b32e4b9e6a29d5fe3700fb30f1d658f685e55bf2452f87bcf47ee2ec0b1d72aad1da96cd23612eb15a962541e22c73a8d376f76ac4c0e44f9d8d44dfd31347aa51abbd733732ac35a57e10e7cddace8e74f93f4a5b1a701f3faae59cf548fdf2b652eb84a8faad3336a58080b7c9feef01a1fccee39e22214f990d6cae27a08eaeaf4374664acb4e1da0256f53a3193852b0e88763ac5719f722787d5ab0d03b1d2869696e5215ce621b04daf04e8769d7ad48704ee6931d1d595b6c835d070e3eb540937253bdf40235b417092afce9f946155b494d866d3adb6bd93ed05422b8d75e241d18c7ba401e47985fb875dbcdd301dfc91d5c4d756f5498222bd64b077022e9e396fe90dd865cf71aadd715ab5f6f918ffc48348a2fd760a1c351d285cce461d8e77e325c156c67217b8db318a05b640a5abdd1a379e7802379a2d3cc8c7787be2d0130272c5075b2e07759191b65b55b865c715ae88c709d57b04b1dee9cfd8bff10de85f01a24776f3ed8528c0978e85a5c9fd8e6ca5182be77411b4f45c5c30081937879ca0190904e562f6cc293f5dfb2ef03a060ce3e70b7f1917d6f217e423c4e41a0ab44a7c425c1fa9bb3dfab1e60bd06e2268e97e01f28983bfee772fa17612099aba71985d145f05c4ab2a3553bd674f027d6fc2189dac7b838041043a884388f275311877250d352767987d0bb119653e9c402e1d9f1d3f7d190e0642bbc69149cb93ea72a546158f7e22cb78748622cf9bb50a2539c15fa554a8bbec76f64110351a680a60f3d15e0c5948ee311482c1c0b161713a7322eb21648f81334c412f66e1476e613f1cf9f82d1cb75e3e2afd225b6e0537bf36c7c6e7dbbf9dfbc3d28f2842f826b2fea8d3d39815c457f2acd0053a890d3ba505199febdc0de53db63e311a647a5e344a96d8f14305bf4ce56d95fbb0d5b241d5e26c3b020aa2d433e7191ee1e16ac74ab738e995d6913b70a30cd599c2941f78f1f44023fa6f7c9222ff0b21d72a93911bfe4a09e79d1f8d042623d24d91bac6ad21a103179f8c9e316fa5226126643d7ea8535ad94d52e9b6acff707b0b76e13a1148e3234befd1b2d79761add0b79bcc61315555de5b1dea3777e6a3e95a2fdc4a2588542c4a06d0bf87d3177b099565e646ed3315f1a64b988b951352f53a404626c169b2e205ccd084c1b588fecff54350d73b7b2a44af9dc7d6e3ef6f8d36dcbefc9f67481b1351dfa2dbbdf3d11527babef4720dc1379f1709834adc5b876357f70d20f1e3e9e38274da3bf70417f0e4fad6df19513511c37f0fc6a3d1388909fe9b1ac3243f865964bda93325d3f7d8d3f9e5ffb4d6c92406df5212a12c67f1d3743f0be7e4d18b3a33e4d1071ed531286b05c1598f853a6d6ab5c6330cf51ea416c808c0619b26b1b26571e7fc76cfce0db53754550bce8a81bd88b65cc54d937726a6c095a51f2f20503c51c30a05643bcdfa812491ec35d52b6fa23c1b261b449e8a358b73230629b1e3105855808eecf3f10e38ecce180350607f28d34515544ced5269167e31651bbacc9f8bee2e81c4ffc201b6fe11b5aaecf4f4782e17d484e0bad7c1e8cdc9976af7a26f9416fe054f"}, + {"00000000000000000000000000000000000000000000000000000000000006a2", "0013b4e457c83e54503011ee8e27088c8b70ffbb5b1583aa037970c7658833f3b8862f969600bf9e83751119938d731229ed9ff243e5dcf4f5b9b68e90a1b31a4d8187b6954189e204b2b3e45e511e269b32e0c406bababdfcb42657f4fd94e230339dbbb6421ffb430c5ebc6b1dcf6d58d7405383b53f090622751d350723f8cb38ed90ac01e84d227a25aca6311b1b5d755f2ca16202751c73251187350793628a69648911d3910803eaaa5a85b43b45d2972e8f63710b989d1d77550ba1d71f3e8559497e98b824ef47cbef3910bd0f202221ba2345e9cca5826ef6f5ac5e4466eaa41f451c36a9d3597bd522eaedf36660f6df1106a64938be5d0d470e87325b3df3ca674125c2a5c2fcbc7554c8cc2e3713fee71c388fef0c13e48e211da9cff21d830616f56b909ccfc990f64291c55ea321d6d932b8c51020a0b5b3da68d0edb036249dad5ae6c145676d4a4b01131580d7841d93883f58eecfdd9ac70e64be6d490bdf15fbe45b07294c2c84dc8ffac7356e54fce4670515513f3b781617c3bb61675df2e7f19a27cfb2450ae00cab77260743e84299b315e5fb37b35f7fa420086d4e102ad9cb50f2b9579708ee331e08edd7cfa30e063617dc0c1b2cfef974e227c3860f200b7c7d98119a279cbb4cbbcf5830f66002ee26da0e2e97a4dd1ac00561afe7c62d4d1a471bacefdd531b49fac2ab05293ba78be5dc1991441071880b962575ab1967ef28cbf7620be79e19f6d86550006042d27a14fc84871ea0df741f2761e542574418a4f53e2e4045998bd91ee8959bb226d7b9f95c4a37487c2efaa23f9dd4a6166f4fc2b0b3c499a4a273ff5e27aa9906ebffff14538144ea9aa5967f568449668275e95fadd6be1bca194e11d332a3fc173296136f77eade51271d1cdc8b2bd4ec5cdd1a79cb17ac35988f50dc11b190760ee100eb9447542643c76efc6012d386ee3943e1d57055138cd9296345f707497175b57ab4ceeb2c035ef4c402e34bbaeb07bf3d5ba6855ba575e1b21cad17b71d052251c4ee1d25bf53b4f2f26f3629a32e415f6deb111005104a045b678e44e45c3d6e2031d63739ad582a79abbec2d8b727158c34212265f3020fe27e1c331aacc512a3b2cac1f0a8c57b2ae889b1ef0ebf5dfd1f41975d80e15ddf80f1f21199619e259e163621b901a0b16b6aa60ecf324b148e5575d3013bb38c6dbc021d2e88fca175133fe6703a5474bc818a61f7003d10661947f7ba621fe9bd6584d6e7f7e9d29d9892aa12804b1c4ea72585ac50b3b4ba399f9f04e3f8b55a01cd1d471260e917565f85088562da09baeeb973bf05a4bdc83aa1bfbde04e444a052ada92de627d14070a1b018cbae32843b41241da16fcdeb1f4caf7da971bf0b290ba653981f06d02b29b7f97f597a176992f013af8dd53c34ac239e9d765d941c5ab37db9d122c0c6949654448df88de493223012f08f54b591afd2a0a2ba0f8946955d5e30bf4dcb73ab5aba51c3ecd7011dbd1936c0e59e35279e37859fdbaa634fbdf106e0350bdf2f0f29ce9e3948366474ad141a567757457199d6ac11007d84eaadfd2719a986e75336aecf5182e758cc17f610fc597c6f4cc4cc46d9719105d53a445f79a8823d475b95ec4b7d4fe6e8132beccfd70bd0169abf1c3990be1f164c3e26b2553fabf957d709f2121b407f916aae0d9412372d6a72dd21c26da73f807dad14db7e21df3418c824947baea25b28fbd96ee20b135dc96e8dc6fef72044e6d65c4aa130b5921800d221d724d4468d350b476aa5ff92555be13d7302132605ae9ce8e7b5d0d86c79dc8418bbe9ceb37084011bbe76ee6c9cf4ad72b24b42cad9a31c6f7cecb5e26db141da68e020080ef75aa98cd62c2847c3aad1c"}, + {"00000000000000000000000000000000000000000000000000000000000023bc", "004110e7bb9afc4d10362018f22772502bae42d94223146ecc1015ee79918a25ae2bca73b2913556e98449eb8ac8845adf17ad03379fe1759a7a48a5fecadd529807471eab572594ec78cdc765185a6b7a1e0b6602a6bd3f936bf701cf1e427b499ed1e8d369ca0ad03ba17c8aa21732a35a0b643753c2c21b74a4dfaa24137f2435ed09adc8519d46a2cc7ce9c61f8e38ff041ab6646bf80cd380ab66e26c284200957ec99823bd005f4558ff5ef62b723c14103eb1b352cdd39ce38914c1dd79180d902f76cd62195b7d385181f0aefa780b8400da234da771fc5fd1c1634651888ad2c6e4d022eb1a3145387aa1e1bc73fd6c35d7fdfeb19a294209b74ea02ce21a8b462c93d1f65a56fd2ad7dca8540b62b175aa5e7a2ffdedb1a63aac666909f07d6d650a725765050aea56ceeac0d9a93963018bdeb24d951241b3fc0b4f392ababfc68a0f670c09bbf1ee5902007047897e8f5edd3913743592f93a6a0050d33c5834acc4af4b9ef4d7558b03a20fe4bdb15a59d73e21104cbfee0315ad61b5f6b58df546da35b949132f8936daef74ae8fec1b321a3630d3fcf1f1bd84f868c6117e9f045f4f560b0a7bd8c6e4638832f5cc7e0c872c956cef5c154487bb4fe3462c583bb9c113efd19e15f75d912689f182bf66b6ada33d1a864f099f92582f77cb6f81ee51fda17084b1d7f92f3aab423b34ec021c6fa2a6dc4fed599735ea19f2d2ddd6b1be25860bd398c1121a86e2fe1d1223d27b7e84f5ff28d4760470c96a3c064446f9a8696fa96ff18f5e6bdb909d40f26d38cda827f145d5a603037716d69ab9fff97f15c0f374dcc60554bd3ae27d8a1837a93968d00f481e4d21aa450d99c141df035f757299baaafdd9d71d1e89da1b121a0c7bae75d72c50ce819dde48b211b020cac4f1f63a3657d96c430339a9f6160855fc97aa0197c0db7ca81d11e5fd20f070a5151cccf05e34bf0bb6fb758683a10d0d6184a106df48ad9a8faf836907c1acb767890a6f5c75060a45fdedaad4da36d58611ca2d74fdb34173b70d85896ac7b24edc48d93c1505af4c9b8ca08fd99329234ae83027219dff56ba2b19d2045fefdbe269e59e76a4a2c2698682e9b97c7e19378f23c0124c97e641345a214e6ec53efadf72b8506053bfbd74dfc9c25396d1134f0afdb4935cf8b904dfeca598db8d8ce4be142d784a52de6e9d7d041e0f013c1c5129574bb6f641530a5a0856465cb2a8a00fcb036b4a6dcb4bded0a2c0ce671bd9bd5e3645552881863fa3d6a9e2db4502f16a3a0e691f26beb3771335312572162305c7be14e4245279cdf1628fe31f31da4e73026ad589f43493fdf15e1dd562c353e36d13ecde9aede3876b7f51d18e5943d92ae634b84b8b23a3269bf24d754f782ec417dfc86f6a2ba736113504b3fe4dfde7f3d7d9cf24a94144ce667033f92c6b28ad8560944ef92d12af84cedeba7936aed57707e316e05385d8a2cde3614c31ac6ad885962b2ff5154d1dccd5d4a0efd6ebb1e7b5288bc9276ac71ab6dd461b8c1126789090de89eb930ae3320d5992f4cf10e11cb65c1757d6b7cf6727830df6dc64ea709b76fb571e303cb5ea1844d1442114f2c2e49111ab0a307b0a2084dd0dc690e951412dd2c5b33938397ac2ec6c95065483d33cc5095f5276b3b9facf25d0fe6694ced60fb5097c6eafeae3db9981c87434946b11957a54b01cde156789abe5f5d593b22f854ec51d955ab7b9d64403ea464257aa8d607f4597dbe9497ee2e29dc2a20ddf188619f2bc57f6eb1328ebf101137d52bece05614537c879e4b615e1c029cbbad1df5f04a1bde8952637c578a0551a894c349398585dd3c2a638f6638a2ba59d25471598a9cc6e445fb26041534ce1ffb346"}, + {"0000000000000000000000000000000000000000000000000000000000000132", "01119fda2950ed71ca98d36a1c59b252ddd2d75032053a2e35ac4b389df205b7b660bf7fe77dd8dfe9a801c12246c6e62ce9fe6313b3597bb6053f091d3fe1025af2d1858e1b947819d2dcea7783ed289f0b09400481508a804b8468eada531440995fd3bb74bebd03105b354b4a95f424f761a228b1749d149c7b6c1f321b533a5e9fd98f49425cba2ae6f05a9f8ab47e7d9627b0256273ee3b318e4193299e5971ed0d60a97242033e97df2755982ec6f521ff9ca725f1d6f3799f1e2269d78564cbe52abc1b77d6f3d530aac88eff8bad0f6ab2ef3827bc37a66b356f0e57e8c7de2adef1fb2288416209981ccb4a1dd3216ebe3ad17ec05187460fe8a77874d4d0b8e050290c65584826e335f8d6cb290415299253ed17325892e63bdd6c4f053abdda1f1dac5cde54c90c0b6b2264a3e4558df5ca31ff7dc223fbf72d9321bcb7a27d474110dda761d2eef382f2018c3e2bd3c84857d66a11627331ef61eafefe5d4e0df764fdbf04ce07e1ed94d545b8cdb6aaec1d19b50344c44df99a7cf71ae3d220ceae6a98a460d2607c0b46b86e0173720bf99fb728f352c68251bb74932c1a77e5096cc92cc3b5b75757eefed99e7c7979bb7626f4d2e9f3cb716cae3648ad16617c16a4e8d8c4f81ba15900c860f41b21c1a78b0c6c7a4e4041d2eedd3b597526f0131c79d1be843d18fca237c21ddef3f70525202dd514bc0370561613397a0b5f6a45bc24d315b974265f10147fc001bace2e60486abdb876040a0bb02f1787905ac0c3fdf153449ce4490e85f4471d0e62f0a8a663eaa3d456a2df1b4a6f80cc8c76e74a0e3515ba9b0f8a70ac771450ac60e1ad59f8cbaac80eaca50166a4811f6174b57a765b646e409c35c8be100e4e06d8eee4d3cd60f2cc292cad0321e1dcbfdf2a9a97060768a1b5a130e3ef60520bbb72fffbba4601601502f6094d39d907a6b1e76ecdae98435b11870d257704c6a7403bfeea617ef6e2c297221bbe013f06ab9b31f382bf80497726ca0dec94f245edd4ecc509946f381044728719cb90ef087083196df1fa7daf02a977fa5b74ac37f4eb8053a482ae786084043d5612e8e2e1538a407b8d3ee47b962aad496effef27be0f047c7ec9c8019148a8b2384ab11661f5aafcdd982c4c99b9265a20052c45b4476350314b18ee7b5c20017acd44f750391dfc4775da16c4401184dd5175c126607bc8b1e59505ea1e835acc4328da1805195eb1041a5ba7531f4d457633332824b672b26589fa0fbc390787d659d2c3033c771501e9bee0330d96dfa88b05cc67627cc24077d5eda333caa7e8aa9658b588f50e8494fc0b5a3ad76e1fc4b893c7f811ce2dd264f20fd44cf0d90ea085c150e7aceee4ddb26c7a1874bc1da4561ac658626cd0b688f47fdf359eb54698eaa6040a335d294f6123cb70016fe390b1c0747b8552c763d1cf7cfb22a90547571cdee6f0495360f35bae0a1155147cfc610f216e43740a442525819884ce58c0122637ac50a5e46ff0a8dbb8e7ffa793320b9b72ca08dc52cf10877d2fc601509fbbc00c460a157ee93e0ca5c5d93515752f11d922c2e1e2f9497d83eef10010ed2b4a6a3b30b3ead30aecaee3e166c94d9e876d2671299e6e0c1a395563b52f485339160818f3245c06dafd54e8520f03613d966e13f57b5e56d593d17b4c315ddf242190c583b855f986c7fbd6033c3ce4ae1bcb7dc22bce617ac3a474651ab6b2bd1ff0d820242ec563cdd65d312b69c2f31966a3de79727dd870310cfc2a6f2e8d708cfde003c17732fb015b0e2ca78b1c9ead803e8f0a51a29b61d30d40417a811218846a2e32bf0c4a5e1e5fff4a962018e4f411d3599bfdf149bd4aa5da284f3d62e7c500c73bd1f5faf29bae30"}, + {"00000000000000000000000000000000000000000000000000000000000009c6", "0002c06fe29bbf7923cda38f12fa16fd84a0b08dd10132b1ad69a0402f54657106cdb92b6cae796b9f4200fc12fed958e15f95b3c0e05faf2d85d3e31edeae0b104e437f4fe0e8c56ab477f8ba9e2a5d77b4c40406b8f3ac1a4a9108f29fc63ffbf04455ab509937220f7738edc3dc17efe9a6d3ee35b9c8b6c856fc07e20c3ef48a30217309ed5ca38c7fe435098bb3d1af8912dc96e70ed89e9b30b6515db89579247db9e617e30c6e9a2d1908bf82d234b539e8cd6f2ec3927988cd31d74da009b183bfde4dd378583d7bb58721d1aae013a6a474cf5c9f29b49461fa9b9cb5e19ab7f9dbf14786fc16b2e3430d707a764202ed35a9bd8395200f23aec5de3a52bf79ab884307d7dcf79bb0929ef690302eaf7f23f12f1dae033604da35b5f6c6c4b8a1d63c49ff99a3e48fcdc9b4050c095277f5ec14b2ce6e414b64cf66d45368c51b5428f6b1ff12aac8bdfbe300eb33e5f2185ca124a45266b5b6cea96c7c4cfff90d3ddbdaf28c819dc6cda452372c709764a11f85bd04c2d2db4f46100d2097d181b1285b7ca4a45049a34b8e270245318733c34985b107432989e43efa78ed06aa1b230bcb0b5ace8f523df06aaffe89da35c37d08d393f1968747abe3e336246546518634073c7c8723e8fdc27ca7b647ebbf0296ffdfb620b152932f8b318fb3a3ddf076f7b0dd46342d7393e59f557828f10e96b9a9b60d4f5dff2a430cf4b0f323d13c9f12ba24a17fb8a72bba67bb9d73412db177eeaeab3910c90fedeeb90f16b83111a57665beb659ae4c4e5e472c430ccaa3de1a51fbe9c595c2c954c705b1d31422ad1d59248160e5b325947181dd4dc8ec0d25ff1dab2a22267b244809399cacaac345b2cf6a136cf9be2aa823bfa202eb4b633cc898144e1bbbed6b2235dc3575524a5cd978600b4b8857c673df35e86a19291dea6900199a824f8cbe13afffa3466c23d0a63b22bae8a906396332e84ffe952d00f4d567f3fb91b280549a7e0e1f3ba97866097544eb01bcb99f5e896aa4fe37d02f7da6330c8f6509c2472360163918c59689d7eac304e4054cb2f646d5bbe9f1571b45ed017d6a4d1236090a8f62ec18776af001d3f21f5ab7f97b6f2cdd4c23d68e516edd7e8dca2187cd6148163eb021df9f9c42236fdaedfb0c19f4ded9fb6c612c6b69f43d0464019139b46a2466419cb7b571ebf2fb2ec4145816e44297b38d6a9b036fe751558cf3419f258e2b8de0861ca246a03ec84d07eb4712c925a68290edd7f62b97502fb693f1d95587003519c84ff2410e97a176e08403b32351561cf16b403c460a70e3a9a29d26d5259942cc9410eda13e1fbfef85bd37f413ba06ec9b49040661cbc68cdfe2c19900766509c97f41c7741898700a6e68553798c8a980c4c26c097117793d1c3c663800e47f837c172cf95265b0e5d69bed72570d552b985b1e4668ab1d2ddd6414f82a4c526a9f2feb99c2ab02e10d2385565c29139654c4a5aa0e81e8dbf53f6c081a7c732c2c81fd751561ad3d5abcc0c6d0cf1d0d01b3f16fff5d12b748f061f7cee8c213b7deff868b302743cb4acfc2e7ef0617bb105458fab20fb833600d8eea28d0a737d348da6195552a2b19d4a4113fa939f015449bd13049a55095c13b4d865f76e3bd86ce0889df9815124089b96c63ddea452599aea8ee872909b696fc84e0d365b529d5406c6e2475c6929dd61a33fcea0dbfce878de63106f48679850a75c0b4147a55e075e54557f6fd78bd46361dff208a6bc396ec7209923a6e9be49d2fc5e0e20465282cea328dd1c4a50f14b9e5454bfbeb0de595092ef4ef95867459328214c51a566fcc4580c532b33de72c9206b2039bce69216d7c8651d8e64f65dc443b59b3e5c932cb5c0bce"}, + {"00000000000000000000000000000000000000000000000000000000000001dd", "002a7c283f0819ae52acf1326c185b70968be97b910213dae37f0810ed8ff00929e5680b4a7fa1fbd1b40a853d7acf9821b958ef87d8c653c8bb09c29c021d2b4f050e914cee96dc954d400e6ac6776d531f2b1f17d32341b88d029366c623f68cbd6bf1abaf92ac831b0409063655d467769e84042236faf6a393d68d0324f81f3d87cc79e67ccb5332e29f4cde455d156a2025e6f20e04f002cf84db665be340b0335c00ddba5f04a2fb69189ac66926b2709758e407cf41a5bacafa04c9963b6e42c57d12b272628cbee998e2a68edd231fb04cda4c958937716642bbb3d23b6d93216def8d4070acf2d31c20811b7e85fa783f5cfdbcd2db2c8c08f0d52296c97a12562e33f9bc785bb19cd9134e4650601e79de1f98cdab73e524e92a951d52f11fb9a51209dc381ce4a7997262737edbbd36c2c73cf6573920bbec99519d8ae9f053a2f0e6ecbf291f082ede2c02499431adc620750bfee03bd6b68a783a3476232d1330c8de18ea35b9cdc727c5a150348b1feff92d600b90a260ffe27803fb66a19b95729312ae8b3d6ac11fd70c66c5173ea555c46371d92c55d1c60c0f8a2904b45a50a846a1f24041154b0fbfc89ea4f83c265508ea574a16424479dc3df2c51f7f587df69c3ab65f12308b1ad5c8ce19f9d2248e93398e7d2e0c5b248313bf1f9b2cd0e085830644d92c7c241d3c8d0db1a30b5bbaf611dc70dbab3c8327dccc602955ccfdb04f0c47cec8ddab0df9f21a5437b65c3b7524a919b94d0b99630e3d55693eafd001d1149b84a91a67cb70e20c1135bc3fd76330e88c98de05481e22aae6596bc40c1b17b0bc98180deb79916a1cf3d48314fc9f395717e3ed97fa91664f2b6173f3c5470b1138b95b666f1e97fee0f9d820c2f0d72375eec25378f94517e8a729f2a30987f6e7edd69f233f13613396115e1604e3010bd72e8f011e5efa8a83893579cb662bb2ddfa4b061dc16b65b0bd01fb3a628f22dfeb970a629da7fa1988d5fb2f1e2e67aeb6a2a012d0f8892e7d9254aa303637cd4e74d9cbb4f0274d5dbba39aa65b1b65e00563aa16599842d71baa823e86c49a34f62f1151a52562c66d8199de2959a6e2fe219eaa550a0df310c912d30eb25acfe5fcc8e405e9c7b0dfb61f0393e5f92c346b78e6dfb0b3e77752e562b216ed2ebc341ebb05896774501d23f100eb31b8764a3b75df5d36e20871855467de5dfe09831758d81c6b90123831774b290c1b1cb57e88326defc91257cdd8d6bef79c9889941526eb7f12c7fdf30a7c559eb76073a1ee5dfbb21f10e7339256469fa651fea48db7ec8db1a5323f6740136b1ab4aa645d5d55b6e172c1ba994963131bedbb2171c95acf2048b5893d323e3fea4cc93d3333181a57dd32d4846b5c6765ec66dc404d29fe7644d90cc0028120190ed8255b91c09281962887e350f05db61e151a1aaddfd2e583a0b466607943eb45a27ad1cc56057fcc147670c3f7cf976078bbe63e083151cda990463b64855bdb57df4f18178bcde68c8ea17fdc8cb0071591037768d4aba0285147c730cb81d0f3fc2690513f92e9ab2cf9ef772b7a5d337482f2a6e23f38151165cfb84fab4d43ba8411679ad3558d2b155ec9991256b7a7de60f7511bae87f74c7da003262fdc6c2b07b9887d6e4c1dfabfb52cdf736da41b53c69f6a54447b27e05511f84b8f98b45b3ae330114956396cc123355a5e774f9e06d86653dcbdd7c0a5003b1e2c8e391f9415d5692ed58b457413acceb9fab33d77c90c0c44d9ef60619e693b43b72ba73df2ce39d1750ead1a4c92d88687ed5ddfd735a9b061b96f4d321ace5c1698f5b7078fc01f61ae934129c57da2863a7850616138b74e02db343166bfb8505048d97efc2d9ed520"}, + {"0000000000000000000000000000000000000000000000000000000000000634", "0193aef5ece2b7abaddc406076ff97dd4145f66f5901965a3ef8601209855f0239f9132e5132f535810003b3428af716f68fde4c31860264be34d381f726481eaf1e9321ea83539de4c2c9a7507e857c7e582ea622e2ad51edd08a51f582962d14b961ddeb99f7bfd72a38f5aea839e77ffa7f32b89e474dbb2cb219d77d28c5a5688de75addfd927314dec35da6fea6d8fa1b357649c141a471633a606592994371aaa317be964809fcd8b2eadd2a4bff602541d950ca6de236d18a0c1456c0a58311746d14ab61b1b52d69babf0b1d28020ea2245434e96f7fde784223681d7b5ce39bea5c6650e0fa8ca16ccff369e7d7c5b86323a23a78d4589d0deeb68e64a9bc39621fc1bd0239b54eeb4418271c5670b4ad8ee385978d9af623f7c4410b9332fd490e0f98475b4b8d3588ab8c43b4957b38e682ddb947c81ddfd27bda4f23ee8f10133488a5ca2e15b591fb080351e35e1babc4756e5b915229b721d8939448fcd4682e378be39d63abc6bc369477563281f3633cc494157924683fa6e2d759d9258bbb7d96a9aa736eb6462d74e3e8010e268915c3638fc5c4237cf45cbd8c48081fd8e7087139d3bbfb91ab052adc248957546f0b0fea0d6ffbcecdd969c7a44781252992a5e3f8e4fa0ec29db341c3c09b5d8414a4f8bce545c45a5fe28950686cf7616120adb42f29db2e750a2681aed564de0721a256454be190cc70b14f807ea5c49caeb5788808943f52b41c9885c567d31307e66452f35058af5d0aa78abf2f981c4ac44a733815a36a41044f9196160b93affc7604a6edd48a87b3d3d8bddee8dd7ce7990746efa4d153e383c03e5176ed3db530dd8b7c9e8e20282ac7b68d7f20926747c91a566c9b7afb3bdb2c0aa02590ac844fe5b73a65b7d9d33ffe5015dd7f880dcd6dc86caf6151dc0c132bf3b1ed960adad1c774024d624a30473f7ac2d699115e6b6352f1cdd8931b1a43574d2fe11a55d68a344bfadbe6894712bcfe380377b952d8743c7dce0e355986b68a5e32e237d9043fb2d7e6e9951ac8b333d50d26743a258736ee49ac076ae0f662550b43f046d95d3a5c866b79029ffd2a37f4cc33ead464b749d845bedc7ceefe6ecbf4731e26044a92235a597fe492d69b6ded2daebd4d1b570d27c8b13f5eeb759d86f662977c5c79f9336acf6b0f05b820e62ea3af7b24a4a1f89eb3e4592d8d168c4228a5d738bd146205b911a304f2577cae22a1d1512811cbb721e6a48a2bea4045ecb73b252e677ff782034981ac9dfa34f0a7dd1a380d1765e3f219989eb486072ebcc31783d16ea7fbd0b042bbfee5979a0e33f64005fd27f2e358d91b77f41fb44fbbb376fa1f8cf92df5326ed49af75ae5c405c82844cc3df7097e8fc233fda4edf5e9184db90024afa2e197c1a51b9fbcf5066759732a690e0fc1ff4774976886c63e87fc89751708acc4d692e9d0dc93a5af4643b311dbdfd4f70e0859bff5cff583e5ef8ca5a228658c39761b9342c98d604f2d042a233fba18ab6df7f67652f4dcf80b800d2270702b0c7fa79b70b0ed08ac91b936f812f70b2861bd03825e6571635f678333e40f0a0bf8d3068b35e535637df81f75ed9b182e5afc93aa67cd39ea263ea6ce0cb61612e79806c6450ae94aa62b13d977050a9a55f00794deafed5ef32cdbe849ff224ddc09b920d71e26bf5ee6dfecfa33a693a3f6ea13af55f7890b89bc2eb66bbe09a9c503c48e4b97f73216dbd7af126dfbc6ed228a9193fcf48bedbed0f5dcbdfd6899149ae17910cd678165c5764459c2d0ee2ae4584a2a244c56c1e6a9a6bf9fc8b5849ad91525e7d5d21682215bc1e999d59915cb14047c2ed03c3d5f2b1ec59c2f672ebd3cb020afdbf215f6ba3935b245e7f820bf"}, + {"0000000000000000000000000000000000000000000000000000000000001fe4", "0034d0d7ea85cb9ebadb02f966bd4f9979c65c359d1d065768e9dedb4fe25dca595adb5f2f2862fc9b6b2175ca9045140ce0f38ba3459e7b0255a5cefe3440280f23c18c8be782e5eb0635bf50c5b2d2ee1e45a11eaa3f4dea8f3f18a03de87d57e90a2e20b4546e93496a83814ffc2023ebcfb95c0b5853aac46d5f897f2036c98666cf3c04b75b59ef2f5cdaca8066f6d22f35f43334142e0acf86c9e45ab1a9df11c56d128dbb00c7c049a55cacdfd99af3c851cb0fba0295177d6b0a49560fc682968aeb40c0f3eca3ddd537e0fdd44701e46b1e174ce175dce4b6df83c02f134d7e9f6fa004f4ff5731217d3def62822b605413b29821fc95df0de4e8f1151e00156d28b1da703cb4b12ce1f312c83080c3864c6d183dd9e46a8cf9fde8cf03603b37271b9bb30b8c5ecfeb62429266a46b2d871599dde9dd251dfd71a60f6d9727d5759f2b4e8a020eadf6ed580815fa0dcaec087b72b7308ceac3600d2b5379eb420d5aef338da3fb0961e565915b2d90d78e959dee4917a8affe4b690df5b52929a8a3f30a77d894ff67812fb5ece0c0f3ea81dc2ed4385a5cf24a6a6ebbebf10ab4c9d53656df732869c26994213976cbcaf792c52ff4d55df0233a919770531cd7d4a236abd05978ed0d2026f259daba55c57c013e6fa830285159956afa17e824a74ae62e533a0f82d90b4fce29982d374ac20a03ac177e93bdf8e51893e683c662bf3cd33dfa6c0b8c6649efc9e946f2abd25484538c822c5b3952dd1266633b98591ac3c505f34c8b1c77e5bfdd9d6d873953dfd27f6116fbdd203545cc431bbf4fb01cccaf1580bd90330713d0fbbf1231b6dc2561bd207a162b3ca544ea9dd94ae51af433e120f068f908acd1246c2b2075dde71c60e3cfbc246d2fe868b5d1aa36cd994d165e56129d2d88fcdcf59b69672bb1e665580d5500c34291235ecaa792fd8570f6e6b4d17e47ce61b0147c33c0f9c842b0f34331a9b5951eaa59961a93e51104774705a0f595c20b71f55479b1d4e36875d58912c507da512bfb6d854cc91dcdfe2b66b8143614fc0436ecf89fc317e0a852b1305179c621c0357f706720071678f1745b25cec9f53ce55d17a183e4b70db70e0cecc42b148e48e5a371ff97da554558b358096c1a6e978b2cf09a899f4b2810e56ad6f30b4519ce6004a4698a20068d698aed91b63a7e25baf1eef9efe62174451fd74e9ae7a51da31f50e0b1551dce4efd060eac0f6eee55560d9e71733073fe5e2de9c47e8add32337422c85179c8f7cba6841c43eb5a369cbef07d0718d84b2ab839f9e1a3d5493969bcd6f8bf3fe783124c2b6cdc4b915dff90467f49720f0dc0605733dd113992bea19a77d91a9651a1e792af18def9698a0d72eecc9f8e301c5dede86744bacc100218ee9d4f8d0243fd8cd5198b233799e33ed2f34e2970b17b332024d59ecd6cea5e6bf79b530bf95158bb5c84ff91440bdca15963cf8916b0ec0384782e9ae9e8f03031a40cc67c1bbd4ffce51912a1791d20fb5d80b7dc6077042e7d829c5ea0e78e195812aa60b28a92c07ec25634ad5b6d0b3204a1f5fa6453e66cd376cd411fc3280bdbb1d0055c61b9c02fa4861278fb816719deac5618114ba17f542b4fdc90959953e95f6e72665acf1e02f4361117540971ab5fa0e7c10900b0ccda3508b70c376b57fcd41f77d6149367df3b34250e551d8c860bb5eafa6a4e892b256410c46ff67630799d06c45745c96fb9632978ada096774e9ac45c8ea0edd9bd530b641e2aebc74c52fea7e255d061095a8aeb3be901250439bb706ac49bd38e28ec43d5005a3c743dbec431185784cce36dfb86d2869593bf1eeda74f181c313fdbcc9b472fac1ffef50b60086b3af340d33ef54a"}, + {"00000000000000000000000000000000000000000000000000000000000026fe", "0076543e7f0921bb345aa4f261fc16b5dc8a13ac6f73df25b51db48c61d38e3bc7b57ee9eef3945ae7ca229d4d4d0454dfd8c94176269846c862827ef486b57efee6aa3264c1f7c60ef9acd872ee32ca0b9f49c908d53d3c31dd9645f37391dea0b230e26cf27ace8c51263dfade982e35a01bc5c7e3393cef20441a6b9c10620b5b97cefe60c3beb338fc7a006914957384dc1d70fea28a8e2ddef4e14312b73035c51bdddbc2fd00b2d234d99740adf366436de05483e5919cd78b5310990f980514e7e55051e34509f7255b2483ba18ea2a42eba3c5786b63d26ac91344526c5f5549fdfe5f4e9c3cd8a31dbf06f23dc53ef76e5bba37d57ee207016c8ac05ead2991e54b7234682dfc0d24bf98882506a57ff3e1cd45b928ff76623efa7eda7484b97b1512e5816f65d598fff6714539174746da3e19df4e8e4187e4115afa9da1f20c94234168744e425f5ffe9600a26cc76dd0505550e4c050327ff24e649a93f3820e530e5f816a8d51a14f81ddd677fbadb4f25324bc02571de3444b82b0afd97421edb1dbc945a19a81802bef6382f18c91196155969dd2ca4e39fc6df5ccfb0343119f356cbf796acf839de5d20c76182ddc8e0c2e1e326867e82f534fe364f02a6a217d7a3a18aa7812f82772a276825fc39cb2ecd1a91f6151c4daffab1606be448109db4cc88374895db49d8316ff5b4cf60f6a716bbd87bbc83fa9141817539e361e4c3ea19a400044971752b7a98d2247a292efadcfb4f97e16c7155be91d0a5060b8d42a9460ce551f3145b2bc531316ed65258a6cf111adec677005ffd5ae56efdc4b53142baa166587e03962d522575c43f64a13bb332af32b919517a66038f564b77385982ab1d1cc83f946f31bb516826460bf5930f182e438eda5da36c85373be54da04780ab375c3cfcda5ae15cfcf2634ff38012e035f09896fe9e373b20a80e4dac8fda848638ad36805474b4692d7eb8af1fef908fa6ab94f1be2d98bad108f96a5d029c91fb4fbb25b96fa725221405f5b1520bf67559f5846f9f56d4322799a098d95e8cf72751e2d5c9b5f9e7d73f0d01af116713c4ecccabc50771eba1e16ffaf1ca9f975a3e7add075113b119a3f2b33efe791355a3829128d0697d3e4f58aa868bf76ea3c8b74d2bca39e855fdee6fbb0fb37269aea962d6705303b9bfc5813d1ff99a0c2069388a520379f944e0ac598b544d886ade38bc5154f5165fac91e96571c07f849b4118a8898aecd70d903529f62f57b58a5510aa4589325a1e25d7d20921a41d1e9d9e3a1b1aa5b054b714fea049a16a6cf4067b44477fe33481fce8e06a662f7b91032ddeda4309c99b0b68258a4dfe290099e6f740390ecbaa4a354eeb9b35f1dd345fe59742184d4330e32ed41d86d73d2df796691f1069be93b07137a8545029cce34eff3566ee3f70d368f5d999110d8d661c68c55348eebb3bfe2cccd233e703e567110939a6cc48b8dd74f01f292b467225154a033164d3e162f8914db6923fdaf364c2f42a17ad3989cb9910901cad94543902d00ed5381dc3bc5c9d23794b0cd248119be05e83839690f2d3ce77625af60b05fbd220d3169e8369736e1180683eebf49e11d6798fdea8116e9320cef6a42659af786a468f9a32e3f0b1269380811e92c031934554aa9598646d71d8af10f9baa9d0d6284596520e1ffab3908154ac44c6e1737db2eb22b3fbdb58d8d4cb09a0f160aefb783b66c1b3d645d45951a2df4d3f4c3870e65675939a13a6ee89f5f170cb76e623e5fb05b429a76882a557082720a7efa7f2f05fe397b90ab81ff482772c34c01331b7e7dcd7c13403eb9b016aff0d1f4b709506399da40f89440c8152aec2a2ad4a3d7b3ebc91a366aee5b4dd2ddf9fb"}, + {"0000000000000000000000000000000000000000000000000000000000000cfc", "0053689b781f1e8fffb6a0767f5a9fee99d7f5db640eae25fbfd84a9410548732b02771bef4722fce6750408cb61be5101d77575888ca0f6ad36dfc53aee880b5c031a04d84d89470de1f04e25ecca4d43b7c451007a37a7e111a0b6e1df635b74a55718e30af326981b7ef4a227c8925cca36f2874aee43d516d6ec23f22bd3eb3a4e8fc52154d09553edf3bcbf4ce0fd7f5449cb475258b7c3b5ca8d275e17d1870f1a9819eaf300b503c1124ab934788fa407125084b59723ce5ffc0b232e91841423e382e281e09aed7782b9c4fecea00621d64f4582ef28594d25ff7f5007f64c8bd6f5e05fbbae0414d8d81bf53b98974add34ce6f64dc16580602f7d084b360f5c8a944fad5ea17e160141520f51bb18f2ec01625b106d102083b94f4e8db418c66fa075e7fb1dd0882608f91f52a2be78e5ecbfdd6a73f71a7cce13762ab4fc19ff7620dcb95eb562b1e769d08c6c935b009cc0d0e57f100b329e9d1da79f69036169e2cbc6956482513e7937823bceda16217eca0891ef6d2556a1e6707482cfc18ba7071272ef31a0bde2a5d93b29cad09e5be08a4f8c1391666c01e7834690a2a693452b07bc1bbf100d0f08d85a93115b74f4e10bb2b3996e4dfad594de2295b600d352ae7549440171cf8bf2fe3c41d5cf2d271e9ffc0152e5491892d264ec60847907bfb68591498cdcbfc2ae41db8f7c70d84147e779f58b3d764365297eb1d1deb599fe23b397a76658cea9eb9720a3837f9d3984e8c9275e9af1d5eab974ef90607e11d2c9b1e715be33a65fd9de1226a9944b0d9c4392aeed379493b178b5018ff3a2010b820d533148e66f91b25f29fd51509f4697ea604236e12c3e7d72635ece7a2f87e43bb70cf863be68e3303a48243dca5d537a173c39b58f551092ef0a284456a364c8f9bd28f2b3b097d85d9181f265cdff2d3014ee7c641df0e49426e155806e16161711b93332a06e6a9af819cbe2b077e820358b99c7ac954f89d47046404a465d6ecb1e6b9e25482cc4cd580f83e405535ba759cc4a4e9798a1e2588cfd26fc969675e063a0612aa1c5e15279b199381d3249b8bec8cf4eeda122d303a654b957690cfb655b4ede8d3c5df2fd4171611a75d3d05d0d330cfb6d20ec4e47a3d2e795aff0e2640abe0950b0ddd4fc0836ff4eb1a3e73e31f0e99049808296b9826a18369b7f20dcf31e70f38fa16542c2cd334c2d23eae9f0a268691ef71f5fc91385fe60fdb2329c95bef4148a2724687782f5261877e372c1395cb582b335911b6f54456a0c43fad1748fec0da167e444b6c2e9703c75921f4ed51bc149df95919c22054ef98eb1cdd416542624888ac4a58db834d48272b4e8f2d1ceaa1119fe4c8be6871bb43352d7c6251304ebd80f14ed030af37e674e4e43e4a59e43a0aad0268a6fed7c2298b2fd1109032c22c91012b6fa2320f0c27634d639d6df747023b5dab0bb70143faaf75085695f4b5904185926ab480d93c48628cf05bd9fa09edcd3811984a7ad45d29f4e7ffaeb6f72d1f87cf047cfc5c6aa697cfa96102d552ef1ab5a7cbd4e86f3f98c41ec990ecb1973fe9784c7a152a6bedfb1d2c1c15836e96d024f1ff2fa1d13fcddda1cd2778cd271c2df14b4b135823cf73d3db7cb03b3e2bbbb73fea02f47512b84272206c34c43ec5325bcf10ba3df5890f050f746047bc7547495117a749dcf1b50dda85380abd4114b1ca6b8bc8aad3a0866b3bbaf9ff7e4f491a925904e195a36711a047a6eb3e7c6edb083972791d6893886ab4aa6fb8ce721f8a1f28dc8bff52ab6e2c3ca216faa7b775e8df3746ffd0b25a4ccb3317bb22d535d71a1f5655288d235d699b0f4907f29202724181139d5b5429c8dac6a505a5f6aec980373482a8"}, + {"0000000000000000000000000000000000000000000000000000000000000836", "00747b2490a195794b752231ab22941d124b097253087d2f12c4a56d3fbc3d74f5952d605a780bfd44bb14c7beeb58a2a1614a2581b18742e900eaa02de062170b5b274e0bbd57e95a441bcda6185b11bf3fac4a0242cc19996039b34fd492e5983955891d834e8fa910263329c8c9735eec249842eed3c8febed8bf07101126c3dfa807a6c8ddcb912af6c31f5757d83d58b2118a9cbc9ed6179979a0f50537e89a257d6ef026270773b69261488692a523b35926a2c20da76e0f27e316f3e2029b18934b4682f2c211705386f2f59c7795172f7b09f28eeff4fcdaa1bb68d805e99493bc6e78438dbd858f29ea05ad49066b14c5978637c7984cf91807c69f7ec99f06e5b3836a15ab52f9735e51a1db1dddca1551196885f82f02a2d3fee29cd85a8c63772d623fb17333815da127640f63ad41d5a51d9840f53436ce9d43b3ee67b84b841a24576bcdb78430f34a00b42be43afbe283f7d631a0e1b4bbc1bd8f38e6ca239b463bb74a2b237bd233b5117f44dea09935697012ad23cf6352e38fa280945dcfbb73e726c07e3fe52a115c7374b8704bd302230c31ec3918d9e44dc8750b35ae07bb086bb1a7bc817b64702e89fc12dbc6103ba947f9004fd9dfdc97448be6caf485a5e1dacaa6126cc8d42f67296f687311ba62d807d15a74fc02ff22636468329fc9af4d65a31508fbbf32f79699e19102aa6cbe0f54d34d750ee322eca2652158bf4b265904852656dfa2ffffda3910c3f22c0d5d308d0f9bef119ff67ad68d8cd4dd7f81eb6e3b61c6d063d9e2e92637832a77ea16abdb45935b07e6a48d549dec5dce07b75eac59609dab8c92a220261ef3488a877dead3134da0ace8295f298cdaa71836ecf33ebb90dd64fe1a91d7bf11634cd7f6c6d28f854a67f3b4099f7abc7c801ffe5375e17fc44947f218d99282e4b63eee7e013936322c12c420a0e731db5bf1e448ed4d9bc57e13fbd62d249ed93b7b0b15861b6b3a675cc85dd5520989108eda0a93b4a0f8d70742c524726dde96c1001cbbb6516e5d421b1afa8a75cd7d6966ca5dd9e281054965b89f0ce9f1afaf64297b582dba65e47a78231d2ab95d76d2c2850f94e4ab34c2dbf5403950e4dc1559429e3c0805588b4891bbaafafab5558f3de40b2c7a7db305921cff13940620b37d0726eb92de69f317b77cedf1e13c55bed3d2f7b3e3b52d43755c16723bb87bf9e31656f19f14796a0a682adac4aa1c884f1a4bbf322595d811c3ef73a76d1d9d1e66b6564d1b4eb7abd30465108dc2b60705d159d02aaa8999eca824628ccf0d4a81cdeb6742fff9d29993723bbe72843b84a27a1c62b11d30c94571865489c7988adf2b4428fc29ba4b1805674e28b751ecfb043b06ccfc5cbd5910d507751bfa69c01b56573d7a8f76aa46b5e74e03c238f6d2533f14efeb353ef13808f1950d52e38803fbf217e9014411996668e1c24cba16457cf4cb400577b454c9979ab19c4684e83de06b2dafce7034be26cfbaa28c1e2b5987d38293769c59d1de105523b306f20b6eaddeb7e3145cf4b80e3b59a5738652f03f1eb77a71ad8ac526a1cb033ff0f266b52ef050d2941fc6e5f3723a623be07ac226becf8c34cef770ccb025f6ac6741141c913013d3d7ea46a82d5ffb3cf21105bc6874f4461783f494c963515d9aae6ade78634e144795bc1dea1e73b25df4c6d8dbd70b3b54fc950b0efa86d56408c8370aab51f5194f1241d5ecbe663610cd55cf84b6d931dff951f4d9c98500f2787de8720d9a5ceb08ceae3399215666bfb631075e9e5e8b4318bddfa5e40b279f14bc766ce3bda91f25dc5a1aac1ecf5d57d5888b29698fc55caac478d9bac5ee8ea1207a3b4969987e9dfff5e2b20520fe353b7dad6c42"}, + {"000000000000000000000000000000000000000000000000000000000000381a", "00031d3459d877ccdc94c47f5d3bf6d5a5c51204136475cd28eb276957ed86b78818440c422c4c5a569604759ec2d4c4bed2995df3d39a78af39901a0fc551686f8edbcda0a753ca48870edb7cfd9e09725a2b300b610e19624b63610b2c34d04efb970a8b7f39dd0410fe7dd340187b49732e8366e07f1d71bc307e54742ab3a59c0fcef57736143770c7ce80ff89847e808f67573efd70ebf101b8b30cad0e6633afd8715edae0067302ca7da030f1398454e4edd987fd5f18faa2d41813036bd5edf6b1a47761fec53af3d8d75d5b6b873b807408a8e6e33988c994f268d7d77541fb94a32d4533f72e70d17c74abe675d9774308068de15784c60ef60e1477f90eebf9b29309eff7c0d32769dffbf21392e3a18811a28f1df6c29faf1cdba8b1b9f256eb212d27e1a45443a19bde3599ca433b217a70d6fd392e2a3af2bf9148ab333d8422bf63fc656d36d9f1310278169d3111b40db0fa94eb45375005b9b9bc847a154229e47c5b0d5101f67833d97555fa79da1b102d19566b7cdb534e1b98e0941ee46fce0d432536cc6830c5a27586e0ab9d3850e5114cf33a42d351fc523027b03be4fa726309ea3ad6bd42c3477ed1117bf9907f54165171b0e809ba26585f916adbf65d7adf812e357989e65e62d7d563ce448d25fc5ad9370dcd9ce543783b2a4e6ef0f399ff36548ad46cef1b235e2fd7039e3fcf198b323f213db676163f784f53283a9b8424b82660d18c7269e26bc357bfde4bcb68321d442b06f816d09b0ef1dd07f6b3d9b3e24e29d9955e5bc50f071275eca982db742252d4a79f221a0ebc14ae0b0615e250ad570a52f942b5ddd3deb45b2d2fdb6af83dfdc67e0477e9d9c24a36ef02e1ff62b460f73832216ebe874e5079a11346e9be697af9d6f8429eb7ff693625368aaa532354e9b7bb0aeeeac6a91edb7ea80038877c584bce32737be215d8cc8c3e267792ba0a07065d4a0959bc14fb1bb39810233df73447dc6577027057e232125489f0a8707fc84f82b4c5f3f913a31a1c4e73d1ab9eaff751b473885cb5bdd16ad9ac91085180fe21972595ad543090bad2f46893dd79073b90cda659f66cbe29f5e10a89b8d6561700e6398e941fb85b28270afd7fce7564f2f73807aa6d47d774a0514a9f9d0e5afb03f70d55939d38d44da3474e5f9302843e3fc682628dda6c21014fb0475add71dafca80e5616825899d6c75fa8022940f78fb220501e0c19131c0de8ba5b0da6e5fc373f62feeeedf9167f63d932f703c59995be74d9e395c39f3dbce770215e2bfa0285bed0ec3274d1f514514ea81b7a74becb34b5212ae9ce81abcd32550b077870d7640eced31e1f8bd204a6b975f1925639a6d54369b49b5ef573646cc8b83416a3a42a9da2cd9019752a94fe5e715082fa446602cfe57b804651c6439ab31adb3ecbcf1223f94897051496285c144655729fd578144819927568fae6b50fb8eaf34c6b4da5f329871645748f12116f15f9fe46809cd9cb713797d7fdec04e5fbea0b1e82fe4036038b004dc2e236679ffde054ed8e18547e2bd5e7782da3cc8463cd8524d65da2f68c4784112c6773eeb70722ae3ea982a13090db11cfed10715e67b3d99aa5156db5005cda71e5575883b373abd2cdd50b7519bc032d601d25dcfe28f83e529827b9bc2f0ecefdadb1331a7c97f70ce5527ca263a7f1f68bbac4d67e1a0923471dc7cf4b5bc7ae0b28059a4bdc56aaa455b08232cb449cdf134de9114d458603dfaee6a1973e56f910e9bc74641623ed12e992bdf32c4b1985459a0e0520b957af1448d9dade2c23cbce2c0121edd45adf4623c014696149c76387220b1aff5e946f273e7d2d78298625429d90e1e3eefb638d68ef59c5c23eb83302"}, + {"0000000000000000000000000000000000000000000000000000000000000270", "00857b99c44b09aa8286005e75073e386a62b7f59c165cbefe6c301f09f41b917cb11400fe4133d9053c33ef39ac16146d213400e9f03bfdc102bdc09755825d0ec69fe6ed8875e2b06702a47ccbbe88d3d7c799065570f99605a4a7f9bdc079e0a1fc303ff65ee0ca144196f10894c060cc71f6817dd53b9ddbe491c8a424e1a982b5a320ab7e28b33acdaceace1742b1d7962699c1fb8dafd4e1e9082398a2ef55af82adfd687601fd63524a80a3b75d0cc68d37421f8e416e581c9a1e2e5917b551f1cba6cd071037cd06161b92d8ba72128c4cca478be1f1d1df83b46e541e791d1bb96cd41741cccc4461033928c8d18be3a241d2dbf53b99fc1d1caa091ab5b34ffcf582d58f4c15c1e4c21502662faa99fab04d1ef34a9775772ddbe7aa78225fe36d41f6d51bdfd17464cad776f628d38d39fecf7ed05a5f2a8f87adf0dd15d2ca2643db3da1f608753a79c5018dfd22aa04bd5240ea20a9ec7a810a454ad9466c163ce472c60f1842f3b1e19d69972c0c9d0fa6508333a8d3882170c6f5eea5f373062dcd214f9e8eb88536b86f6a23d31428b3be2676eb59a4623ce718006709f282d693a2e543d007f2106af79ef55d9098d6b93bc7b413225d906358a27790cbefaf02eff279a3a11419b78c191a584f1ffe93743eb82031f85478510018bde1555eaab79d8e19a73073ffa0b221835a77f9019e63aaaae043530266a4a445a796b5f904d155b423bc8b84c375d321ef1f95c86b5d5eb28e69d72ab40b831d0f62d1b81bcf4391a3616e7fcd31d30a2665106c65eca15a9eb3d3e854e0f3ec52a53913d23110037a7bac5c0559e27b0465b5b160a4eec290b7479e241e79556c9bc18190533780ca5b7a86b2ef17c3b3189a7ceca20dc70169f5e9cfcffb04f71b5bbdf01586afa5883428807fc808888a82e1e24e466b3f6eea011da3d6c184d2877a81311e6e7429b3accb7eb9f708e1642821c6300fa7be00923750525d4d4eb2d95201fa4bb6c8c8e638d72df7b08d40ab7e2b5c148c2065d894c38ff31a9dcdab26dd62470c49baad11e83f25979f3753db5fa1609a167d285400fecb2d5b91725a267ce6f4d71347c613d785cac3c7429db5de88d642331d3d3014194320f785b86ebe58099f17777d347c716ca383df6ea78c07b8729a507f0e2dfd9dcd7f017c6ba2751dc1c91e5098d6994c4686b8d1f7ef7e28615572217097fdb3f1329fd7aaea2dc42d742b9804f9c8e92e90a5e1c969b5c2717ca6e6a11e16c71e2487d1753889c5b36c4663488ba0d210f5d1d19eba075dc8677c50d334d73f370441f9275fa4b8de7f4413fd575af510041feb78e41353afec8587e19371511164ea9002d97a64e82de283895e7ed155be18a31535af43a1b5159a2368a225555fd3d4ae514fdb279801a8d33a978e556af97de25ed81f15b0a0b1b94e551d4edca48b199fd1afbc02aea7e77e9a6144b7312a05cd9965eb94e375d8cf55cc54cdceca1d379873640f9144be33f1053fe938b1afbadbfa8e5173b6032405dbc10148d277a4b2fca1880af30c1cbb075678861f93b410a4d63ba74375932b7d5385baf1a95930500e19d593e3d2c834d860e277793dde28c621b890052d3a4e7b5f9efb7b1757f2dd207ffa7590841dc62f01f88b65f6228d4715a57056053576749c6a3dd4d11191c3c1e5c6f41f080aa2773e4369faa37f3979c02aa4a603730c9a92db76c41698f529b2da461d8f303a8ab4472b61b963b406b68429d62b561ef83ed8d417865c76681223f6be6259311a5b2e4ad481782bb41e8545b7e1d1f709c9d7b62915ef554db6b350037b3314fbe3cb2f6a03dc6ec3c75dee54b9afaf73a27844bf0345979179812425e5221e57f176f9fc9d93c1"}, + {"00000000000000000000000000000000000000000000000000000000000008a5", "0003703e1f2a9869c342406284c7d828357c1a5cff49a05fa17d1276b7b80084fbd2d831338b055e56e411b4eee5d0dc950f0c33117e85e2d5e46fc9ccda883a5f67beaa91b7b0da00d79a15e21ff2fac3da0d060305a55397c579943cbf69df1a69da32c5f31df15a0c3e4611c5a7fbadf8c6d2d7715d5b7916a65cb8950ed98e1d2ed5545ef46b64aa7dd8d30a415d7389c41801ba308814b7397535579322c7e6be2ff0f5a4a802a68bc49fb54ea5de3d73786ccae32e1e043bd7df0c0452747a0a5e41354d01918bf8b4c0aab27f6f4c12f24ef77908215bde23516afed90175f69759db1319d12415b8c81ff150cde4b15032e021d050aeb3be151e35c939892cd529c8918cd0a39fa90f27ce58812d161cd96ca68c87a667b807e3d9b91ea2b89d025e22abbc345e5fd7fd5060a44436d69856e7c01a2a02278d9e9962cf437197d1c510466a45f777445d99fb027d13bc6b0ec90c79b6620c655ce7e587e4d003601db354f6d3d6222578bc221a17b7f229381c8bbb260cff2e111ba3a62b4780658c927de1aa4af2b6b8481c0af9d032e4eeb5b530c1e4e3fb2cfd34630aec2606fc489c34c8b48725bd5555df2f09edf44d9ac73f0b1bd3607704f1659395114fe451fe5f38b03e9a680fce33a44d952e418edbd4adbbe957761228fd19da2d43ded32c93644bdea5e4b4ad58e465fdc259454f069c7a1bf48c8c1f91f3a45568f5eab66494da0cc62d49860f5a9092d8a4aef3230244271a77aa355358088ed8d9ae08df4ea113c3822a370e01de34aef50815eb7e3a1a58a224f5df743831b6c272f47cfdc00a14e8f756a118c444e829e54c877dfea957015c038f1fe22eb8ba2489c16c801300a4ffeba59f7dddabbb1eef29f075ce3e8f7dc865c49e32630591de74d2412312076a6d1d797dc2c1c6d78df31021d2b772b72102a697b863d107d5abb7627545998ee52681ce488814a291cdb3c859f3ae4f06cc436a5ca23b82bc3a9c0773259a288c9ce9f4e27a5984e706f32029bb88f61ac35707a2ced552b5158516a86bce99ded4dd6e0d2319beb6be1540650a97a410026a96712eaa6b9120232db16402d33fc6acf0a75e4dcd231e11a8542986588f777f0cab1fcde08b0a2f0cd2ce36bbfa97dc5069289dd1051bf506f17f1726ab65df45d414baac8504fe052f2699f330ea42b13b3c9af520f8af558a5d34dea4ff68964f26f4a2f35076dfd759e3a6afaebd0f549932fc0590dec9ea3505d16daffeb940f8e4a64507f25a2ee792a57097846b29524e6d8618f7165f0c276eeaaee776ab69fe217f66cf05fd8afa5fb45d212fbc2ab10a4ba7d49072874ff4dd522229dd31a9184721323019aaf96551129e94171811d1dcfa331f5f3686ab7ba581a3a98606e35bc5555dbfd9db4d7c03414d7d8ee0eac3103df036bdba40a8a03437cce7244e1f490e1e6c275a6c059673fd6f3985c8d8d5640bbee197ee4a2e832baf6231a447ec79598c7cd4723227ff5f2da2a23155c8e607a9b8da6dc22395f28f07bcb399248adb0ea77440e2b24abf5d849971ebba0f232e09bc68e7f1968763e4ddfbc25eb2fefa5d2f165a42fb67d606cfc3ef723ebce570856b56fb5b4e2a73fb4270d8ddcee3dad7ea03f8ccda177f752e1e07b23ba68d686c43dfdbb2504bf13b8e08e75b129d0df00241679f72efeeeac389a9a964bced07dff2af08af67710a939f0da566d1ff1813b4e0ab4e7f381e78a527a688a50a33df79bb7af4f9da8f414f3a88770979bda57b05cd2ccc26d520a5bc708bb4859f15074058ce3bd71beb8f94a618b6ab5088e6fa3abb8e5f0ea9619b455005bfc19bc3ececeb41f103e1e97ab632692763b4a3ecf3e8cfa3e287673c21e6b30fa293"}, + {"00000000000000000000000000000000000000000000000000000000000000a5", "007363032a9d0cd1045df0c6a8f541d440291263e345ab659bba2e83efbca3964ad6f3112f866d7ebe6909ae4ceac14a4ae28b92d6f2c53e77372127fd2e3f3dcbe1f656917a9b4fcb7ad26478a56ee3b5da4b730eab2628d1547d80cda19122c5ab06905981b270d232cebdb17e4ee6d72a50637da7a53846530b9f5e26308323114c7c4e4bfea463a16bc23af637941aee148c8cc6dec67e70cdf389298729e4db5f1eb119e5dc05ca0bc1beeb5651611d90a370caef967cecfb2dd91ca8d4bf570886f5ec21552ba13757c37405de0f360832e61222de1b3da3c4b0efa2ab080e58cbb629b32f9e31f5585134c9d405347aeb4477be0613d8724a07b55c581a50e380cbfba468e8d35c1e05f57789a10ad7748fb9e61711513091a09d1b9e6ce725cb2b7c0b12e9e545db2d9fbac3560c5dc8dd35f3ec9b88c5105c4fff7d5cd5a9f5771134c954a59d30af2d444d008088b3a72c8cc1a90340562be178e1f531fab56e075075010d05ac0b05aed195da19b7311b97fbfc14136369e33e18f696d18a11a07f461fe23ef29a48407cdee5ad2efaf827e0cb88eea0793b266ce79bd1410096ea2fa7727381a45ac1dd59f538f15e8f333a000aa46b42220c21d666dda1b4e6f807177eddfcad7014c7fd885cf0bd5df7a1f48eea4ce435ba0a35a91b3cd8e786c7194235c458f578a2d5646ad2b77ed153033feda056d03961b39aa45ff641858d5092d65b9e097dae4d80cc3964dac4d18328a41594ca2dd0ae6d6159ae53b5b0cd8de443b80ea0e776c789953c8e507a6ffe998d26f227ff7e6c74416a10076d97bdcf980d66ee329e7565d1d639b3fc285795911fbd11a67f20a20c8201d557fd744524a07df8ebb5e92b348eb22cfe3b854917532d364442e6de35a3c1df9fd694204ccf44a170df99e50408052349ec1d0e95b33fc1ff01ace97e3886532a7db043b4467531edde95f532661acff3f5f8973b8b5d3fd39edb756595b02f1c40320cd8d25f38033bea8b83fa350efb4a9bb7b69e06a912b414df85d6d1b77d4cc34ceae6dae8df29f17bc204ddf9f2bcc4e4fe6394b362946b716ecd6f7fdd9c2c5193c94adeae85de2d983d75e04b46d9187fde1c1ba32b3488d9eaefa37411d22762034e8832bd62eb276db7d4641fa9315a1f936f9a2e8c21cde95c9af103dd48418bc2d2e0fa388902f6f62cdae2c07e79810b477cd7a9d528cad45d1d707a77c95762ad9fa0dd1bf3592bcb920201a6d6443b4ec25f21c38b346d5061ad73472d1c3471265df8293e4f21124e1795e7bc0758a9bc840b4df4d5bc849ce6fa89dd605334ef650c78775a8dccb27fabb993246d458365a62f5a60961265fb2087a5a94da47443e8d3ffab5994eab3b42e35cbf9edc7dc2eacea8654a0d2db7af5dcedd5689801c33561980b00010fd5151dc0fb3405d4f318f58009b50e6cfb4e55d0970cb8a3c9fe88f2beda9c798308ad87c6601b492dd35d26c87bf6cd71fafc3b22151b1d1d147df86977defbc386a6424ab66cec37c41f054399c49bdb1711c90a285cf57fedea1c6bdaa679237b4c199038c07dd4bda3aed87cc7864f597ea5bc05e7861d81ed37ab99159467274640a93fab79d8f808023faddf28a1cf9edd0507fec56705f14c520ede02cd2bb7bd0438c4c55902b857ea2d06a9ea971afd2260a588e7d9542ff0d522a98a3f372ea5375fc6a70adc25f5228c468935e7e67f44c11021c16638f795133d0798a032c60ba959f8d864626ad6a7c61b94ff0436b1c9b20111f48207d2fa6618c0d1959a7a5ba10cc2af268792acc4f697d1b20e8e34ea8e399d39151f17b926cc13b8d5053a12ddd5238f336a1f3c21002a759bf4fc5398e584f4e38517f1fc113efa34cadf"}, + {"0000000000000000000000000000000000000000000000000000000000000556", "003d75ea1757f9575803925110772a5a19c5bfc0d6097944e897871a13dac8f28e009f42657b13ae49480346774a6fe17d29d9d790c2f1793445e1253019f925598194932dad71e326e38c13f53909f812b0f663044f099edf42d597c57102f8369a2579fb5bfd54b90513b7457ddbda2b06e17338e4c24b0512885a0b9605f245ebcd072145b5fd96109a6e424336499fb2c325361a2b4c0d3b5eabfe8336fd497de6781dfb16130177dc49a096ce4b67cf31089341e5611e4fcb728e14ed6c193e321abbe068c1db6577c2549379f97ffe0a184e8bdfaca6bfde85b56751acfa9ab81199812430ced3db08a1cccb5d0ee3c031a6dadac9aa96564604261ebc3ecc82b2f7a7c1a882ef3c7a0dda35967426001135e51a2b5d6712836d9d780dcdd3b11cf78b1125834f45ce22c5f30bb17cfdec20fd82325199762984bf6fe15cc459a740e50006e1a76f1558fe87780111777de880ea5e170d708346888a3064f6524ea4064efd3ce54f889b0ab57887a265dafefe183c0d9a0aec8943821e842b5fffc631b0386885c6d21dd64f48c555bd8728b82daef26a49bd7156069729bbe12908dc03c7811fb3c7e94f5299996db0662d26fad60f19fdd4fc075d994b2c2c11e8d4aadc2dac50f31f700fa5bb4cb049cf6bb80ea5c4dd77810653663d40fd21baebba9d139818b0b2a6e249f55075bcae5eec97071f88f814cf85453e5b78b7894b5a0e4f953386b927ea3e5c708b494b736003de3fb7df2560a85547bf0ec2167578f1653bf5e175e7897226f6b2dc1da27240e85da0e8a2f5f9eac4ebb2b871076afd967fd2cf23cf6c35aecd7c2eb2a8f33b0da55424d2cff8dcd84766952249da7be8df5ef47e8cd547e152161e9c48289759c91acbd4d8f8fe4472cce3e6baf71279c4603ddf52f0e8e634fba79ee5704e78fa9572cdba53f20096448c7e44a98ad58545cb21be058677eb97d4262e66b63d7233345dab752ad96fe5ecf30faaf9fedd350e37b2c6d55b61f94666235dd0fe8b29a47f2ff35c1596ce9a9df163a423a5c984e97e7a3b351e026b036ccc3183a7bcef8c7861801df027736b8fdd38973005ede5798d37ffa39e5479444d5f6b7b427dab7e1468376746255fa16dc65238cdd30d8268ce7cdfad32d69d8786df101fcc6ae5d615ddd89ecd6c5e10290504ef975a1b5ee6e55ed19faa7ca2cdeb2a5f157b22b17d25710967dedf6174033f655eb90a4a70feca2d50c42efa90061fd434183012631caa4fd55fb5d730592a50f8e35ce1c42f26d617ca463a0e8bd8e844065f2ddaf16322cb73875526cfd6add22f7bb4d00e68ff4c2520245ae92e065a0033eb183eaa7c565ce210734c1a5f1d3ef94698732802cc2ea305f17e978b1e5d816ba692093090ec727a9b1e5edd265f7970c701de2c086ab0fc21dfc5252944c6697e60aa1d45ba0713c9331a2d49f3f861e3810770247a45c479954011d84196fe616939d4bc87e3dc4058af504b1b71a91236a179be47e774d4cd160816654921f52938f52d03eb8b82098b0ad9dd6b013446a071394b8bb2fd2354f5cc85f61c579d1ecd7895297ce2de46faf40f7c1269efae41ed7201c6f1559eaeafda2360ae1b17d82ee474229d912a0f6094a3bd804d9e2629c755060002ebc7ce290ef75fb56781f81c6c16ed367b2c06c77a845ccd74e1442d725c298cd9f6915747607d34a80ac9059b0e4603cf97e752a1f5ac1adcccacb561de0f707f18de4a7ac7b4dc9631053d031ac0fd381a6203930bb65ecc0b36e1b1d262cfb95f7a585f95795d4334fce09bec601fe7d3b505ef3b5cf54565b185a40d04621d5c4ea85c8c36415498c59e29353f4d994f2656d2f82692dad593f3d49f684cbceecc80ffa29d"}, + {"00000000000000000000000000000000000000000000000000000000000007d1", "00aeb44d7e06121526c0422e41f0069e1a2b9f4a020afd1e6ac00384b84d3d53d97c7e9bdd80cd1d9567021ec9c3704b9f28cc6f725724aeacd59b3a5234c024b5e287a6a86653c0ae156c4cdddffd628c32732409e94772ecc9476b9e8ca34bb3a6c434db5b301af035612f583f0f02d7efad53edafdc1a314a991bcedd1265a58749e5c443b0d891e12c61c1b16cbe50d9e617c5ad1b0ba737f1fa3921b7b968aa75da167e96fc02c6c74864d76fd78c9218d5aa6fa3e27a8f3e87160fc9557b8c0d1bd3ad37219a355e85cd7b2c17cdd60727c673606d595bcadaf1855b34dcd0f9cdbb745c3ce3eb235130dc7bf1230522553cec4e8cca155c3702e4c4dd2524fc47dbd7b16a2ea90b815c2311dfb5178fa138d65277e5e125018266d534b1e997afc21003ef6cdcdda029936ecb40dc63518a7a8a61b5b4900463a49c160291cbb03e725d116d3a4157f4dcbaf50351c8918302df255800611d5ed842d8b9cc660ce704200bdc664656536bb16939a5f3e092aef657cdc30c1ff956e0ebc8bda4c4760c7c5e22cde9935db2cd1182a427a25721477bf7f48a2b790bbd5e982cae960408558035c50793c39283f0b7c649398faa3e55d834114cea6bd72617d809ea2c4276ec6aa274bee2a9144357325d49afd9cb13717eebf89fa50b92aab01e1d2d2f6dc4569b7b0af4762d41bd4f11b4badd2433074284266ea281e13c1c45b70ced9d6e5ff09358c32345d7deafe7f4519557c7f33863c6a299f0b834783e21a7f3f8735bc1f95264327c5f5e098940de415854d6252e0adf7641c35376baf343beb1d7b57320e316b1e34cfd8a219b273e28da17ca39766eae154fc61c98ab96e22665a534f3562056e118ba623c7a87872909ed07ebd481afc6fe47d711d7129a8fdbdd56ce2c0c8afbaabd1e11eb163311ddb0a88594f537d3c80271b853dac925b99fa9114287ebfb11b873bb96030994f9c9758b5a96965c339ae7ef97c2c11d7865fe0fea5a31c5e2a2b1cb4d45fd2af0081eb10cda581f703b3d483e653cbb6363a9a31d7ca7dae0665ce81805021f432395627b50f852aaaf43a8cd432c1a1a463a793bef4bef1015df442474d1719df2a769f73eee22f341e14fe2db5525ed86df3cbff329ca33f228e8253073053ed8488f445b32848ab4751e4cc11963bb041fa557ae8c4db7e27100bac59e8c1c64c9b777a416c5dc88ec6a1bc1f13a4392009fb6ee565eda6aab0b1a831a9035d49bb10497dca74daa3efe9c3ff7a253ce7d2572a894997df188d855ce02e3acefdf5bd80fc217cfc56ee3e5eda231d291c815b130b12c281d101712f18a9afb8b9d2339b2294e262a76367e84da25982c6ae81b5b75892b7264802860952e98d5754e400c5a776ddc15b9c16d57ceb173a49b693e5f52fb0344e626dcc6353d06059b8ee8796c2389607fbf680a2d3f6b53875c38fbe1a672643b754deeeab7fc370525f76889503188f707c331eccd47b8df4e2f884028454ba10a92fd2b9845a329aab8d2f769c89d8abf053d897826cbfe94faa326b7535fb5a5eabcb07fb74033fc84e955271ba73ac8d2cb6999e68cf5df730f08d020b34b2ad6fbb91ee0b5241ca47d294131ca7a1724e35b36cdd007f8009173236af0963554fbdeb806f12f5a03d82339590ab666db5ff546b3469b7e38117d3c5856b276dfe50325f930f886a58ab7d897dc21851173e6cd72e98445e628a44fcc6dec0b18cd434321eded229c66970ce1f75950dbcea1ff27d829d6219b4c8f3425a883ef609520f56f8141ddbffb08f33ebacb078ba27aa3652c145996c00d1d1d973d83053a81960955aa4809fd7f3bbb9afc95d72f1d3bad543ba9baef3214cd26e048d3c31f3af18512183c30b9"}, + {"0000000000000000000000000000000000000000000000000000000000000ad8", "00366b8f109695c55333509096f3c8c1e29418145a32ab8a66bce2b3a7615757976eef5f5fb7e6be4a290fd5d18f73c84557b91053e8b6d5eb69acf37818333e693218e851acf4a5340a7ee063ff9321b8fed39f003c363bd6a8c363e1202359ebf3d9a514999600901003177a4ae17d9bd9a052c0685e9b6aabb4376e5605040b4e8901b78b6cbc165338585b4ad398dd6aee2e679bb04d8da856736194e1bb68d435ef15501ca2017a6256b1824e3905a510a34e592ceca8a37b579c3db3a208662faba7be4c642e7f39f16da2edffd7ea33fd766fcde5b2ddfe13364f1dde862a554776ddb4540e845bb3d9684ffff73a04c0d2a43bb41b7feea110d8f272c5a1ae0d545ea8c0b8ee8c9e440cb69a7d50c3dd78ca6a765b763b66ee9bbd6e6379f69e62cb117b4b5b7025cc5d36b4b2aba33c738e8919b606251821dfd423060f698c2a03b636f20cfd1d8bfc27ae01940ef3b2202271db504932f9d49a6f625fbd5eba0978a91681cd2a070fa9b151da2ffa617c08df98f5263f4f7f1e5535853ab626955ce86f75edc05f2bce2b8e132f3de37b47427ad6c8917bad9efd8d3eab9203ebfcbfe1e81e99481b713e5f9fb8d53670ec12f72b070b4bdbfc25adfef1c4456d61f57d3002b454f6228c0f25804a94a3bdc2d7bc1f7cd762471c76fa922429a7eaddf1c055a518544c66d1bdce7ee3d888b00507b5ef79d5c4e9002023c30c263f5a90d3b565301abbc4af2d2004afc73a998562d8a08b22f11fdc1012d1b1bba10547e4ff0d4452046cbef985439c115c2b2e03be55ec55d9b0f2e6e532e90eb34ccd1ec780060818b6e883ad709dbda122ab7c52d6ab29f64ffc2704d41e55e71f2fa0bfc2f481cbef5556df72e4ca0723f14c880444e49e9d88260151a66f1bc41a8d3c12a0c2fdf972fd75f367f179db1bd00964a47ca1b602b5f1be2ad6290fa322e0cf8c8bf77c3ab36adf4116b766a5140acae7f89c4282e23d1d2996d0f7e63e16eb59e1d5dda73f9d2b5464efb4e9b7a1cb9d95d157f1b4644a9a5d90f17d85f918ba50aeaefb96200502bca8cd738816429e6a34885aadf99ad856b8d38e03cf48943242771f2acae068c7e4cc9c2c919d96c60a5f778509230439852b13a15442dbd217ef9864360efc888e8adc754f3d3752e3fb5f65ecc298cb9cb302c7a36df502cddc846674789bb76d8e2d49bedd99196bce65c41c5beb5a9b64a3aaf3863e26d7b55af10e4221a1ff4437b47f2c1560123dca21d85ed61e261e6809b1c06a3e73ba52d36afbdca3f96c135a427908ea6b3f6049671fbcb3e1412c9ab879bb2797f3fb44033cd8dbdc6bbefb0309de6be914f6c8121ec36b0dfab72feed696dd1425037b933eef48eaae55331233d7caba161e44d8f49336f078c33f21be44b354da042259012a6575b13f712180ebf534f20a80930f0b33beb530b0584647bdfc344f21c64d5eadf7dd0af61889fbc6f2c76cebaac4f5026bd0015f4d1a5fa0d9233bc21535902a8e8cb912f322e73f08d96c1a69110e58cf6b80202183b70a4167a41fd291698b19ce98106f84d167ccb69b733eb5fa2db8941a4b959a14cf12669f1832263fe1b213c29e4839f919a925145e9d229a9d5412f406fdcd68f42b07b0e68e04bf93fb2604b4dbcc20ce4684e7fa11e1d7fc49d16787db629a439156c1aeaa28fbab019b55d9647df30be81f9f28076cc12741356cf5b992a2a3319b3621450d1ff3ab13d632d121547df9454a44b769b29f62fdcbdfbbaf0bd75f18621e43b7c8d6c4d04f30bf933a7e7c5e2c171225d83556e0314e6972607fe65e1ca2b0511b8222bc9c1ceae5d7b79340a3b9071e8fd530158c164a2e5aee5741d3acdd2ac163bc716438a9d10ccedd91"}, + {"00000000000000000000000000000000000000000000000000000000000003b3", "00b8c0bba0c9c897e3f42236a72d3d159d817f61472defb97ea1ec43e5e256b7c551e39dee023677c18812c290a23c1b15830ca511e8ec7f4a3535a8fabdaa30d2173d89a8026dbe43a5000e42e14ec17c3aa3b6015eac61ca18561928f11333a03226f5b33f1433f92f151ae50dda780ffa131636dcd2705e4dce98c8f103a4210c6bc8911124c914d6b131ca7a28b03e39e6182fd4a9a69b083b07af87190c433d03dff75fafc90884f760ba1538b3b36473fb2cee9b4f80a2ddce673bb67dde1f279b7de4fa791d88de2d7f70ab7d74811512f2f400196ce1cafad2e451c6757e9dc5d7dacf32f35cd6dd560874d1124491676487f5312aeb508f08e125dc06525ab0e77064d0a7da2f93d0541eb23c168dee7fc687a8d85dfef641547b0baab2cbbba6a809436479fccf8651f957630a8f4178d4e4ba8b4b51395b92d37c5cbcaf5bca35f1143b3aae6fba1d07be0176550fdc44f5af09a0031bb0d3067fcca35ff9e00d291733931f349b7f39c41bc7f28d7f89477d052802318b9c799bbd5dedea26f2efc3f7ba4a4435d66606e884787d157b0cfa3c69548adf8e92b46eb6738b02190223d551449145f91684aaea3566276d9696e43ab267deb5d873eb985645721fda0966bab09ccc5f06b0c7303301ad85570d833a4d9ab4c12bfdf2f293343e99bfcd212a2b9dbeb439e2e89a09b8b41a8d3504b7d752389a401b06cdf48bde2aaebd80915a85b82c1dbc7a6e4ecd356f2032f053f9fd4e21ac57818d0f7f9e2233c56f223fa98585a75e0a0de4a07f3a551a1eed947c8b077b0d1a787ceac6b46e30c033e58013e055c4660e19e1bc31caaa7f5df1f7542a5e59dc3e5687346b142b81b122e8858d526b6ea67a9f7d942d654d9bb0ae82778e9d878fbbc964fa094cd302e94bc6ff70c37c36bfff3ad52bd6bc79098c52af9c1700cfe6b1d38a0a4e879e73bb7f22cee26263547ecd5a8ec5ded919ec0191d126e5917d3bcada24380f08074e64e98af89413f11490f704ffb3a074d851ee580d77e32ff6d1e29fbd11274c0575ee1614a5b67cf2027e1a04bd6fcd1de14ba40945e610922b6a3a73ad0340383168ccbb4b4069f13264fda7bcd9a4cad0001e570c8b58cae235a8d275bfae438049c50e8f1bf123f8d76ce5703f3bb2d9e5a50a517ef74b6d1f5da600e9b471d30e85177ebc1a5ac57c554720b7dabe64055132c80e391efdffd6110ae17e5d9dab22ddd13906c5007c2ff0d45bcd7e042e495edad9d6555a58162712f56102ec7f3f6ff1c72f74f12336a24837cd320fb62ebdf68b5e43719603a1d868efe55c5f9140dd36124462f093af3da445b6a2194dadafb4b2de9cdb1ddbac4371484707069e0468e7f28c961f7c7142741fb6492b19dceabbfdd013220f7920b28a76355ece01bf461ed5027bced2e2c1a279c1caf57fa5920e0b4bb093a8105bd88bb8bde721a4c5ff8e8e3a95e741029be844db55fbe5a77bc4ce02ba5171eb3f0ff5490344e74842cda6454b35f04fc227d444a80a6e02d105a9247a30c2253c4bc6e0c258776c9846a89d301f57df0ce2ff163419dd1127bcae65621ec8689e6d410f940d85e4c86a60f1c731e21bacfe1e6c9c7d6e3f2a3869b45d8e4c7308f43316dbe8d1c743fe3c00af031799f39d5a92e9dff4b6cc9368358675b916b09b0ad092473e2118f71c6f59fde852cb739ca15e024c1d5524bb9c20754fea0a428d8556a2d311fdb8bfa5274e3cd39ad036515763628adf1a2a8d2a1dea896a06f2498143211ecb4db7829c043891b1abadefa532216133c76198fc590178a36099b02854ff731185db07b0c7ba4f0334f998fc20c081c95b28ee83b36694365fd7e13d1855f75ff3146bd4a8003941ac513c76"}, + {"0000000000000000000000000000000000000000000000000000000000000728", "028a9e3025d1b4412a3914f6ddfa9551a2ec7b53402350cb9a1c5843b326846964844f9cd2761ab8190d0ac01aa816d0424f63925148e7f55b4a10feba0dec1630d2c39fdcc99dac4a71f151a33d4e8711b948450caedea304b76565bdda31af8035a8d10c452a943e1c1fb69cfd89789f1da5a3506e6ffbecf894517b9615aa935ff31e9027745f4184e03eb614a3d076b5c124e9f37c841bb14d369a746fd0320bf541adaed4ac02c566fb0fe10c315acc112b211720aadc59d872552dc6bb749cd9c9c51b860763305c857203c19ba4721c28bc764b9aa81dcaf5024c0d17bc09af2213c9be66011baf495bcd13750e5934f6d4398aa0c81ae5761ac314e5b28fdba379d6c1e7c49460158d4635405a52879b47e09fa363245b0c23ea6485e314339e8e801fbccc7414f67777c6b1c456995ca71b7de71d4e85515ba5b4d5f2faa79df40abfaad9be4f758c3d2cd50295f018256191e369b10262951e2ac0a6054cb96e06f0cd69f144c1304527657fb9e68c55eb9050ecec1c6704b48d9ea9e920cf237c38dfe7454db83db4832fbdfe7496207ec3261d74cfa6b3b7727984dff21c10170bffc2cb6cf1924523e01575ffcd6dfeaf3e0710ae5cc224513fc4c74ca71c17eed741fb4f3b6429235d6e627cf587fbc3b1a30f8a59504500543d323a4836aedf0e52c7a777de150017ea3c622255727a80055ff22351c15b2bc72f673a4f4a913a0e9cbfd503087af234b3f2b027fd3d535f5fdb6efd89fdbe2a0c0e3dd48e17df4877732e3173553ae450f690170f2937579c17018fa21574b2b7efdbca81631a80bd08f105c4677171d82ee32373591df156f902fa25ff6b601abf3b1f4ba37009f34132147a388f5e487199e7720ae3fa61fb5ca69af75241cdbf37da191b7c0f3c1689557648beb38e91e893692f5f69a966617bbe9da50330fda891c6323c6d3cf0dbfde90e8881c308c67c17fe7fc6260c5339d3ef72279fd18de931b85e56e303664d014297b6db0dd331fdbbbeda21b6e494afed08f4f20fd21496fd643df18e91697dad9e6c9a464609969d8acf2e7b4d8f93711a83f89f38f9b0e86e9e17f5f10e5e9bf948fff5943679e6f179480a1c10610e585e5e2fc75f22a8a47380633b7128f4afb073f128b6cda6ac0aa67b366605deceb98e79ba1e969fce06d2ace7166f834989091180332068696a6f91e3644c72aec9c95e6629cd06a6ff8b6d28d6bb4d9bc0111e760793f88dbb30e6c3335d40bcb01d49088eb3132b206e67784b2f5e9ae2055ae9eac63e97af9c8ed2195a44b44b4a62ff9818f4aa43736955b1a371f7e37063dfc0fae29edf4c153b5866690f9b5cbe9c97a82ec6056943dba4ff45ee26e330dc224ee7f15aeb9341d11cdf20d1834695487510715df87209743d8ba903dd732a2fc60c4879b601b74758aa4d17b2f22dc4151cfaf94f8802150ccfc390e62286c5e28e9fd7890967596503f506cfef88f1c16f1577c1314a6dbf4f1386292195e5972d3576d27b82b7fc0b46c45a5b8d043e041ca3d6978f579cd215807f185cafbaaa06e03d49c44900e109cb130cd564e8e357fff364dff51443891dda0f519d10fc70874f13d44693130f59203b45d59b88bc6c20c7744cd49884ffb301959e8ee6c7053bd926260493ed6379859af5ffcf119fc1763bcb0c845f3ab1385625d9f4468251ffca2ebe0afcdb66368b15417898ec3dcfd6d3a2d949d56e3037f5cb6378576deca7e856e1749e4a0d747d2c4e9f5f968f5c0ba4e1fb25ca3753746d07803d5993f60b55bed9c5599525c1f8618c0ba411b9d174f2448f4ded5e205d0ebe747551c680fe775ce1442dff1c2d6c6b9791232c3a2eae57101a29006be97321f162b6ad74df656b"}, + {"00000000000000000000000000000000000000000000000000000000000022cc", "00685ddb1f521327b6abf189a5158a4575b72cde210d4a59245edd28715d3e753dd544b81dda6b9b67f2019c5dc24251eed9c903319b3356b430806d55b16808d35ffeb0e56fa531b0f15b1314ae84cedf39d1c902adb2058a894a8102021203dc44c0f29e1838b5602672269b56de2d16f85562684c4aebccdaea4b5acd0c3e7ff98abc931bf9ed74032042b7aa8ff319b86e39ee863b1e58cf1affa814f65d63444d829fbf07c7019bfba89a184f5aea9e97f88c407b0b010578d9af498c1ef3033b997be91745d60f74bade12c6787098070c32aba8098a7148ba91381fe5602498f62e20e64ca29317fc5cbf89b58dd585da6ecf45b8ed572d1102a2a0978d6779279af2807310be50a514eb1abaf91fb15445d84a75ae791ec2c79ed5c3568ba79d9f2c0cd48c7a3304e188cfd9f41fbbaee95d9e3996702f1303f5faa4d3ce42f28106a9086317ddd225b0b471008400e81f5b912dda2b352869e6399563428c063e144be4a22be1c50ff98523affb5b0f9501b25659f20c2639d1e54b0b9bad96e30a3a7952c4f53a9c56c32a3ffcf2238aa3bcf57b0835ad59200a5cb5fd95d5016493cfc00f0ac1c3a3a086397ce3c4e1598efaac02f9b7d979c1ede65797b260437136bb47907a577a0ebdb14d751534e9bd0637304944ee8fc839df44703d6cafd14eb00c83b0ec94dcdfe60929711ad39509064a09cbbfcdf35d6a57d63025c91a2293ae9d5bb41afa970e11eed59bc93c97a84041af56cda01c4b0108a94d99e14fdaa71fc03161bb4f59f0c4dc18caa215274961d3528e39cde0bc2a167ad29f27fabdb55b077761879f316a41db7ea2039e3ec7b94679edce833b70aec21253fdbf4bedb55b7354be798c18f077b313a600d0bf4f7a13d5a5a266ca35b698bc7d767fa154beffd4ce29ee399cca06ddf5bb40b6be641d044c00e42b7dba4a0f265afc2043ef05e7b07dc747b4fb08655d3ea29e46e7de4202497c67ebbd89d4f7a82715ae722a669038969420120537c032918d8ff49e37843d1f2ba73343b9a1a70e23c6fc9b5f8a6d3d86f003e869cc69506e8f51a7f0add4db277daa08b459301f80ac7d106e93c1ca07225f6e77c2e92fad52caff0556fe7b8483470105dec5a549da7a3ac398f670290bb0b97280edf13f8c5be284ce2c9d5ee682fb4e99034ba38ca9a2aca19415f1dfedc0e5907b5fb770010981c214628d09f9626f149d6b30893145bece1bb90fc462db8151f02da36f21989d621cedbb99ce23b32247596928168a4f72318738d27b329641cc7398050bc2d33ffa31b9bbd00462c4bfef52d1c18ef3b6e6634d6c72cc5ee54bc3d7d7a4895ce22e651394271f1159d6855c0c2de9ffdc870ffddcc722063438de9620df89b1f59966eeff04991ae8538c7278a1b62363016be01ae9d2e9a9fa97812f522ae8417a2a7667f02d7f54f82327f74d7e5f48d148505d9240409644d708cc757719e1d6852e4d718fb199b6f0d02aeab5750a3720fc826c5803da0ef2823dfefad8e24eea4eda06b0519aedd81e47745744a6a8af19e559e5ef6db73a323333128f2a578227a4c8eada4b6217ee9449f315c610bd3d6288bb5668e74e3ebae55208541150001eec95c25cda16abb08262fa9a7e0afadeb35b185301af6b3b93f14243e4e647b383da13760eefd6822d2439199b39cfd7c1020ff4214ff0c02b2c58bfd5b90d178dc60f8b640d6f637208d92f96391b830d989318f7e63b3436b647f80f9416bf6832d117f49bd4310ff4b14d126853775e3db251da9cffca1df09f88cb18bb47646297e461fcafc4f556bd257a68a814e7a832c10f80792cc797cf6114e819561063328d7da7583b2bb761c512edfcbcf1f6b81b47a0da14e79ed433"}, + {"0000000000000000000000000000000000000000000000000000000000000547", "00150450ad5048eaa719525e4920f869308a77de840a748122a990c028f42484a6b3aa51b6757e3eb7ad02a810a7c7dbf48eec9f91962ae40f29dd413efef16e95cc950a38b9c5c7510b8bdf654f9f03617eb0141b0588fa7e4be58744ce3595c0eaf1033d0abe64d31d4376a93d52650d9c0b56a2dd47fb61cb44112c4a1c3b9a73232d7689ddee841857e068ed4052cfde4a23ec0c3f73de7fb5238c37904b44612b2faabe36930074a25a5957d1f9caa6c10adbec46b65cc918321c1783827320061b70dc76a49c556adcd53052ea1026078f2b6bd0176e53ce11a1183fc573d0b20e95132d4fcc4ecb45f1b8abf4a08751baee3de5f33c3b7150092b450ab5c6d9c34a1488a68848ca968f021c06d64edf7f39d31bc08d27d579b117eed596ae9c37006b25d009d2369d71651d80a27a64eb497195cd144e1f27d18a7c16e2c2499c4d33ac91b07481a086328f63005d3905d806d47f039c702969cb3918798fd41b1e5a29c79a37e3a1abeaf91b1390e039cb1c3d9fd79d1549b655b2d0eb75fe6f6176d1fc08e96464b791221bbe5e4d1349e6d7d3f14800967aea1b4d0efd46b405dcf4c2b8dba259a57672380d7b0e8dfa91d9b7ed0d9acce599cf8f710b4431c4aa8f4dee4f46d3610b0fe54aa91425597b6e7fd57055af22a1af1abe940878c57c28582b96a78675db41e1636d6356955cb75c01eaeac08ce8f619be0a183574789b2ef3917a73b023b39d06c62256af43f9059093d39746b2a1de4c31023b3953bf4f399f7eee91b74b94e958d0259c715539c2f6c265cf83b39074663d776f304e62ea1783fd01ff0d1a03e553fdd4da030b262b22850672b460790593f120da87523157d950b3ad85c4ad9c0e189c5203222d72b0f6429db5b6d7d59ac2d3b29a5155171e4b0955004eaa5c1bfa0769dbb8d7403aa28b168959004340986067a57fae43a27ed0c49c0a0dcab32bb202b17cc908f81d1bf191c45fb56717812c8cd68f9c0329caeddac78cf3b45462f26158e17664c334f8bf50b6671f4f6e88b7831d2527e14794ce66e1568a7b0e4e95a0d24f2e98ccfaf8b205f64422d53219fcee21902571549863f36e5c12d40841c66fc1c0ffaa2b101b53f182baa2c3e406c7d092632cda2388152e39118a2aa04dc8bf18e73ef1b4d3e12f45585057b1c30748c5b7478baa54b6d3f1618836f37906fefd6152119bc963aa44d9afd6fc4242c494fedda33c93216e08ba38770c550474bc8a322d92445d38f24ab9930a15780b6fa7ec0f95f4c988000841e3fa72255461a40cc991760ca169fda4cfa3b24fa2ea55e85834970914b3a90e725b7b116b72026699ad011d0d89d4df5511ab11f0f5216da3e13bd571f334c09163e7d76c1a2229a9adce8a549d08e592d2b37b1181433c10721101fd841ec5079cfbe086c0b37f090349262550d8d6104841abf1c434273370429d953bea8112395f626f0252f7380ce0bb37342e7921f4e6a272f2539eb67b2ac1fb75711d00e55370e68cb3c031fa7d9a9696430ab811d84343f51dd12771cf3d72d290c63d7a62f419b4f7d2fb753057beccc1f083372a60b66df279c50ef691c3ec5cd6b93256a1a53eaa3c1cbed0cb4b8237db5af97393c94d9636e5074ec5661ad4803809ca0772cff53fa333495a86653c1377ae4f1dedbe835d0aee8ac8c169abcfa17d554d16dfab2a4153dae1740a8b6bec8442cff357a170fe89c6bb2dd851bd0d39219c2b88b9ed1bf58cd2868e7cceb1579797de22a910209370db957b2f4351f33017bae7dd1c668d968a387b0d1ef89f1b0baeeac616503b715a00ba30a3823120a6faaadbf0457898938ce373239defab589c0049520476d8aa8bebbe4fd72c5ae4589e061b546874"}, + {"0000000000000000000000000000000000000000000000000000000000000483", "0094a2bccd4dd6b9718d843db64f86fdce01f65ba317b7a27f63dabd953c2ca19a6cb9328e1d73b769260978805111d3e135fc34a1f8cbc42b957b161babea254d87450d993dd9c53b042743c98f352af27149fb13ed7dd32c596b8db803541307cb1252a03fb58fa81b83fca9d214b63be31df1e7d0965061f0927de83e1792edf669d05515ca6fe7b88ce001f29720f6a0fc1f45bd2b1e08dd34655dec06f672b2db39ff1c6a8f01b8df7401857891c971306436de3a3a5d773f82901071b556025c95e9a640e3b80ee4efa10930311f060c79e8be35b5c395efb8823e63491710d6b932e9551898063614b803b5f6f832efe71c6acdd1a9749c0e041c9afd599250efec533060f62edb5cbd2a5dbd5816f8ace96e5d5cbfca3eb44b7c4d2d9ac7e5785bf6100be51d61e00a29867f3a3944e98f4788225e41f22a380fc61a19415f88e365a2e66193323b169910d001ebc096215c846ba64194b87445d455b5722f1c050a09bb70925f7a55ce76a3822fb80d1a22e7bc9cea13bdb6019ad9551ae3c21325bc3781d1cc2d33da0720819312687c1ce3fb9e43a395ee77f205acd6911706258ca258d543af2a3a049ad75db632d0f797bee62fd53de03ca8c2256761a65d6dfb505206fa9c690806f452ea4817caf4c34fe1ca4dec9dbc8e073f916e1964e5688d150c7cc0db0374b12db6f9bb3afb5e2e059217e568966b22e2b1819df98e0270f6e0da8bca3b2f9fa282966b8f2d7d27e9f157972ec8e33989de0bdc999e698d3b7fe4e6d11f66be84c8cda0763b6329b9f9d1fae7cd27a864080a21c6a40ab3f0f7ff880f7c443b04f879dbf3c5a2daab9d1d150a5574bba60fa162f61a0524e30c9490ff88c7ccd8dc32d1f36d13b45414cb0e6f60e05662ed54de8552fae2fd9f4038dffe69e3d204baa2d7439489f1ac461e345c5e8f046378922049f423a5c084a7fdc4c0b23b22dd5dd6148cb627a18605f19cbf748122a656a55d439ecdcd295db303c797e1d99bc174441dca8c2355a5fd3a1538cb3371d51685fb8ce2e7567c790fda592756f95514b0b557532423cfe50c8bbe3ffe77ab398d5eb7a057600af630a3c827f6fb55d24f32fe8aeb36bb2b0c1bf8918046133305c7e59521df4150f7bbea1f308f4f3dcc2c10ddc141d295766188e3c349ddbfde44f1061f70856e8713b923d8cbc56e7371b3ef2f7f9d2f4a81f56401a56595ca046ba26b7fc16335d87a6fff2977dbc43cdf53fd074c029a72c7270d9522d1f7da6a931792faadde6dcc12f99d58eb82f66d3959ae150e6c4593488411de336938d099f6bc6b66247cefbb2d544c42fa9f876bde085771a5f5f7f33fbc3aa8061285e31d7716dbc0b9cb2188ca43ac4a6ba4392319427125488d3306419d86172059d2fd4e3dfc92c3e705bc81dc8e46ea27d671d508a17c26f62776d3595b28c397fd9ad1ec72bef54342ab7708623d9a75fca311f65a8e711a0307f5dcc23be44b215e3ba51377fc19f25950fc65b3677917b36bdaf0e4b2624e14980a07c753d7da886e9d1a8c81d26e6055c0d680ac932349945c77756273afcefd680fd5679c52c858198c0c1d3c55540e5ebaa9b1ffa1db0711bfef16495edebb25289ec88a59bff79a788415352bc0a228ab16e89f0e97930a30df0113d5c811b99a3735dccdfc6ec44a240c0f04094d73c9b909232973c57d79d506fffbd2321011ecd35356db7f156759b36fa6da3b9b3eed4c7bcce5dcd3a2b74335e187c7decd494e642c7c694212c3e614869012199a07a68a2cbd465e0c72525c51361b7c363e904293e6ca48ae97cd99ba3a4bb6be6621d15cece7d7629dff2f14addb5d7aefe1427f79be291534c511210687373f057541352cae2357d89ec9"}, + {"0000000000000000000000000000000000000000000000000000000000000523", "004168265f6724295a44579ca27b6c528e3a98af860998cb3367d28ebfee57a3367eccf8d5fa8c53a3c6015674e373d14515fe0df45a0656f9f98b539a64105729aae40ea242c17775257ba1ffb4fa7553796efc07b72edef6587bf3af64618f0b96536e37cbf4eb4c0b9913ba758aa3ba6422354af459f1fda3fb77c8a02ba7fe152b0ea337263eb3b89f37439e088874c2244c80bc754a1daa8d6639376052e52b7de6081b552c023163975b6c2515dd1b918556b17ae06f5adf229c4c40e28071167c8587236693eef6ad11a5d16e84ea0d43ea06d9085693301070d6f97229e51d5d79716b126ee2b3fb178eebf00f3307cd5483853ebedd47a309a973e2a5c9a5d2a06ef52045dc881e9f311a76a02dc62e2e5e98aa58cc7ae31899e95a9b66059d82af0a60db6b59cefcd2dc608155052fb1028cb07e519e0e0ee7fb7a17598143ddc14a284819d063f02c0c73004a26915121512fa7b521e7ce6e5ae0e2bcecf9b014bb612e86865810418f827ba7cd37696de574d81e181e8c7e4b496c1afa00044d41585d36f8577c0c782949ab8337600bd5adb206df334c37abdbd3df6afe033d78523fc54f4cc0d3f6d73e71bb89e0e93eceea3db5038ede9b0f19fb54d5b9c57a13b222c39fc332035216dea869342186a3210366f544fae32cb7d692322abbd0f61f4c05f7dd756633ece61e609096d81302cbed3212d45309433ad383d538e879e3b84fe5181085b1232dcfd131e36c2367475c3b6cdf415aca2623f2d51a359b49ff8626649e0bee716f07b4fb43b838cf1e701a240d93ca51b390c672d7b531f2500c3b0ff19ba1da58103ddfdbc48e93bf9a3573683154602309f4efa99af5b50b5413eb71feb8fdd9b5f7a86115cf3ae28b0d3a1acce2445e98290e73eb803fe7ae25091fd8188fd94eefc7972fc3f2b6efd1943f998b01dc789c2d8bb47ded7b6602f24f0932df443c82bc59c1fb7fc858893505f6275b35bb08ce46cedc80231b76653c6b12133dd05312c626abeebd3933d8a66d31fdaec9bdaa5a91d8a2593189ef0aab5ad77c64440a29ddc91513119f71a3c4dce2d80c91ec735567470d22b3abef0574031e375205d5d20f5985bc9056900d4c7ae608cd227331b8c1f98fafa56d2a2efc267c16e9e2ac43adcd0bdd29467458615dbe18dfb7f1310876ae1ccd920dd0a39af49e0ecd9ad987703e68f76557eb5386e3cd612172f83d29502422b07e7e34aa0a7e5185772908b1991fe34b5b3391ddd6fed1c598147728e2284abb67ce9843d3eaa7973d02cdcf9479171f25976cad1127bafa6300412ffef955cfb4c666196f9dd2d8adc0edcab4a2e8fac618f4ccf79269d920171d4b4927ff9b8ebad2a13d17393261b27dbf462e98fac5bcec4a2fe7f9e9265cd33bce666b5cf904057ae50c6010d868d04afa2de3d2bbf6b7c9578e7c1bf7f533f7c78785ca75e636ed7cfd6df4e43070ad06d306fac607f26be51aa1a7d6ee01a5803fb993560b0e59e662dc3703c572474db1d2f35a0008d58231077e174e8a43331e56ab8392474450debf40fd2f482cda4b8bc02139670e5ad36b68c01b1548f6b2ef761ba5c17e0d6fbc33a78e21c812d7d43aea1c58524229d07d432ff6a175f0e3942d8cd767b14884f8483106f73b0355957b8f17da083600c8b2e2bb601762093df302150191b001ce37a47e87dca8faed9017ecc4101d210e30d338ccefd29102e0699e16148dbd4da828ff65882b67628949945602c3ba365a04345df1620e4ef19cc4a4a9474cf31135f2246f958cd3582bf064bb65b3f75c18719643f877d0cb050692157807e01bb7c69f72989ffb784016bdb4e134d2246bf5aef823e977a7e7586be1348316cae7fa96931e4fdb8917"}, + {"0000000000000000000000000000000000000000000000000000000000000edf", "00488b0b4f619277300cb0166cc02f908c9b55623f27b94bf9a7d3858dc6f108d6e154fc9e7fe35a0c6418d78747511d324962d6c88686e6ff57a9729da7f92bf0ccbee86c7b959ee3a2fd629f1a454ecd6a972b06634ca69406ebefa6e5f2d66ed06de903b43ba6de336d99b7d6f19531ac58e6ce713fe421b4c9f8813f077dca472b696191dc19b3c914b7fb411185d379c73c812caf33b4a215da7cc64186792d064fe7fe3ff300f1e10c05407a2f4f8d31556a0ee5b9ca00bfc1cf0265c8ad4a0eee3bdc11f1871ee266574d42ddbdcb36a1735877681333830e0591cad79e63505b9d44075a4cac4831b9e78bd5e9c941f2d5179706c2defd9804ea694f6dca8bff7aedf3a66636e35f63c29e798920abfe43cc97bff2ec831356007689d0d8ff1c0273139f4c5ccce52d35e2d6e47798da9b0a036fb411fb17133e2ee01e2243acd043a541c45ab8f3e6d5a68d016cb925830e974d845021cdc44fabf65e73d814a8064d0cac336066fbeb10c33527597e8165408c14b401d63a56bf44dae4ef9041b01b5362b657a27fe0c60f3ce7a9edc83be8ba73c64711e38e4e9413f56f110abe62eff5d71c73d43ab24ff7fddb4e6566d6f22011b3f50c43d37e66dc71e2a63af67bf55e74bb9f2719cd4efc724aea43cfd5c478eb506a993bf5f07dc9248ba9e1c195b4f8b31bf4436c3e3ef1a31c7389ba06dd6cbddc8f275c7e8aa890e25e62562517f9259a25390accdd6ee4779852067c64d85ace462ede0c2311ed00fe9bcc0860633e646f7fd4af0b55cfbaca74313f3611665b078f3ac7e60982b989b5d9059ff87f06ee0868b6d729031ddf8818dc478632cbac9fb5782a0184198693255311d81458bc35f6c27006fddfd40cb01939d8841c195c65a10d933746047e40af22100f808a2919d87be72d79e8ea225c78c6eb455a28c1007f9bc76397b8e6dfe0f23294746c3e868ffb6c1f05520b89d3c9e3f2c93919d57671e1f6987a959f6c18db53a1ef8c299795050301be4be6c99e2e7f278b33ce16eea8e11a73d85e359e206f22e56fb47b8d740d7f7af44a4593a3a407115e4dc772e590645cfd5219fb3ed68ca53d8db817864fbbe768dda7491f0a7b162e9a9bc2376171d79a61a0dead62b55540abfd2e2395219dbc4cbc1673a832a1c6e2043134ce3bd3e80342b347d60d834bc29d508e23e3d2ca9e4e362ef110c8d2eb89cfae83175752a64a78f28adaef5ff0aa0968ab5b3a291e0f535e7231739534c5536fb12004355817b95c52555d6e18a974205d6c2f1b93fd3f2507cadc11740877e54adb56251fee367a73c6195074106fa68374d501036abdd34d6031f4a57db72d4e8208453323152eec59f506332e46f8e8d54b5fbc720a0c3ed353e30e4933f3ef685480652b668013d8cb4a05238b2335ec1e11627722050ff2e671815e336e52146413b053e71d19588462bc4e97e6f5f44fd6420607a2823e336ef909da59d22d27f79c36a38df7ce0545d5a73ad1947d390a97b5576f6070561753b3e2df0aa1dcb574c55e2b8ed3e0e0e4ec3e79a77cfc91f82efaaccafb4d146be56984d38d67a209868d30cf120b24cf04c555c7479605b7f6d5eb1cab346b3b3b0c40a472320b97d3392647e59cc4de3612cd63983b22095a57049a629443254c71207e53fc09653f31b8f40e635cef17cfb64b37b0d22c4441ea7593d615a465142592e6344bef7b1186a1ebe6373ec1a0819986eb18cfb49533e1bf3fda4f247f8eb153d7cfbd1ee98610315eaa2d054b4ebea05350e2fe6b7541429a45b432c10e07b86e117b86f4e3f7251fed4204d71073b135725e0f4f917103ddcaf463e9ca0f3d1eec999f3d62f9e4d0ee5e5b0763ed070cdf66b62ab787bfb9b4"}, + {"0000000000000000000000000000000000000000000000000000000000000277", "001009413583c088bcaa3416517245a52315ba878e06f0ac9f23209e3d6c6114de7167a0fd558e2b2fc30d1f9974936cd4a79611549ef47263aab79e79efbd114108f2480e2f49271e314b8318c3e8c531c8ca8d037fc79e8e192fcf4868b188056b556cee8d1a89e81ef76610ddd23670b53822f2662cef67a92e1dc428069273e57f255d1faba2e34aa7fef325932815e5b208998339bbc7eabdd46be6fe9ed3b686837078779b0064079cffcec933ce24a0504f5ebc386c1f4f79430a6b2eca04ca56e6b268a4104e625c57e177bf25020dd82f6099ed6295955a551930ab8283d83ddf15761b3221ee9bff35affbf7c91dffccc1070ee53d8b83055d015549d3f3bd5571218399cdad014b85522c360774ab93b4465012a67391afe23026cebde5d798e7059edbf1fa052111a147a4eb2a2e3519505db73a4735d66730b71a5237e5a647e1d8d65923ae8d1d9db500f9c3025e976a41d09bd063e4a7e6f2d9289ddfb20e53f76ec3636963e62d02130eb4cbe0cdedfad47c057c6628c70a497c6374e3d10ee9da7681475ff77c0b0b70711f0c34fd56bdf151c115599cc83ab7c0b619300542305ae2cb854113370f30883348e71acad34ce31fcddc5c4e87a139594303ce1d5ac4273956d01b300184661c34bb073ab1bb75a94f6cea7c12a2081f920730495a204b98df3356b9cf35cd119675700d0b22d88bf2231fa1fb8102bffe78a7e1a9e173662e2a9d8a3985d9ac7373b4d58795c6dd6e89c69d95361286a716d16362d1e66b247c7f727785a40bd31a6528afb58236e33acfd926e4bb29346aaa0b2dbbc39a0f7732e5fdaea8fd8823558674d1e105994177c9cd17d6cad34388a8e54b7c72aca8681ea91ad5f2bd2d17507522c85205acc62fa6d420eea247d70c1f526148e3b254d8d893c0e8fca7d2def9b6c2b23a595ebd005869313db0bef7d2de64f7907c2bd229889c4bf82058fb8fd70cd22360f78495767d021294b17ed71004b74ce8b2569b2f7dea90ffe32d78c6f2359de773248791d6dc11f0ab74dea8de254e4dca567c586432046cb52c5adbe161bdfca5a54361fe7225485a501b04a96d44060c622689b6245ddec72bc928efb9fd7a07e17ec9fd449c8dc1dcf1ed47bb29ace90ecbd674196b5c604a08f9eadbebb1dce3f0ef2f53f81bee0b04f905b870ddee750fb5b1555aeec5d96f647e075164345b3425dc3fb71bd87848876cd112de03f8695f366dc9def11c397d757de4d4af4bc72dd5bd5b7dd13fe35eb024117dc2f45de4f7a0dc3d56035ada057a08081c0ddc0fddc7a3a0b1fbdbb19010a0863821950dbb45aabd484d0d296db26684ee83bdf8505ab9601fee65f2a8d0a48ab9e4f22617253bc641171a75af71223ebd4b35739bad07678173c5056e216efd230c072eceecf248425b009d4612e0b243be092237aeb8626693212d26df2d9e760d1e4f7d430b5f645cdbe30b93c5bacb1033189ac6417616e7b22c6607722dbd31bd22190621aa0f5182137887ab06654a292bf62807aa49eb90c401b724fa83d37c73080d7170d704731391b7723aca3b1ff6fe85229547b15d58caac6b2b29aa03fb3110891b4235c52c6fc4dc23047d7f73e5392293d41d5b8a7d452c986400fff66afbfd5d691907e5c42176139faae70cc7cee748348b12c39bdb234fe10f6b2eaed9eff6224765b3ddec2a9a6db74a4a0c1b0aab73c34f6358c77906fc5137b37fb47cf232257553c4a9fd2bf3f3fc54159e72e7e14abfd29b800a8ba97f615a8757eb5ab8c155fe765b2e493c8d44624c94cb5befd2bfed4ab80e94d6a3f261ce15fb722fd51308e76f3151981c867a35fc979efd461ab0a93135c5d6d4a4abc78d3ce662dc3c49d29d92f8ce7b"}, + {"000000000000000000000000000000000000000000000000000000000000005f", "0033d78f74a4f55bc463d88cbc522f1a448397fbb2076e970b36e21c179d0803777d6378722197560aeb161b24bb8a5bfb23d220d2d32cea32d8f831dd5afc369ef6121eaaf19187e57551e846ef1753e6bb450e01713ac33a173f039dd6b27d1f2152dd54cf31c4c02393f554cc0cc2c9a40fb28d8972b893e8cd5f9c9b1d5d269e272450a36ebc25b6375c61460bdcb30300622975ea93d88eff6b4187322cca4d2dfb8737fa060277bbe5da53a6938252a031f8c9a688cdb234527e160acc1df38d62e12321a58cf9fdad1366db9c2ec20a81fa7338d2a049397591f15eab8f5ab1673e6c5613b41cb4af235857eeecb7020cc549ce667a99e8060c223497ea987dafcf2518894fe9fb1e70723a32e41c1a8546365adfc7038b724acfa3360ea6fb7be82e12c1cd23d9d23e991094a1569f4b18fca7ab3738242097a3f1cd5609d9ba4805b33f3e142a2bb2735547008d821b7361c7ab1ca36065dddf998222f51cfc8a32f1a9a3e712c814ec42e51501dae7d1cbd332592501f9e74481d90c09cc82f5644faca52f67eede10be04cf570081676281d144610935d900365613d3c0dc037529deb384de07e05f046e163db462be87df18242f3c72791ceff7efb74d355bcdd9ce2ddd9978a31508f2db0a227662b3db55f959044d3c7fd9d37f30122aed87b3f1530505572c0437665c710a4cf17419cd019bc7e486a549c7494950683d473da302621afb110a87885f4fc707d17466218379fce88cab577c826b11d30d7e4e2e168df484e38bd4e160c4f4ecd648b03e3dfda8d9704c9fc46164c8d1c48e369f1079d5480cf9a6f5a9c9967a95692295686bc7d75040fdc9e21d6da5861e8e18098038222fa048aaad8bc038604a105d4fd091688b63d5d14815c74ba45e86ebb8bd21402c02ea84a260672d3b25f17fd245b61a76d27e7d0109e6a31583ebb07c7de4185458a31290c7549d090ad63bf30447b98f06140188867ef7aa6d907e8c691207463d84a0abeb0a4d66595c5712bded921a935723aef5ec97544ccca41364dba24f86d1981239f5620c73506f841fea636046888f28f4c8ee588cf7733c1f972a75c15451efda62237e516790e54210bcb5ec170151f129d474232229c28d29637b1e2ae6b4f9c63548e399f0d160ef05bb63b0646b1c31c1c41592570197111d7685a019438b44aef7e74cc5a71bd497a51568ddf9ebc860518364a20697c20a8cb92ccf65c61a6a0a64ea2b3f03c967821fb338828f90c15cdd0b256a69f65d1791a1b33544ee6ac1812d9c17709e06111794ae81061732d10ed562a4d9f55b5e7cfc79182b59ade138cc273149d809f057f5960b50e11f64121334f97ee1536a65fb2a0828e05be03eba8ed5daa53dc5ee9e8d29c655fcbfc61cae4b233a0f2e12a1f2024380490b645fa59ee390532244e745ce27fde712145c78a34957208d5923d78f464ae04e12d973833a22cdeb9aa14d1cdaf1ec84c75ff89a214bab7d7b4e423fefc16c31165fe7291695e2b5188f08379e9d4f036d638d975c4de3df4ba1b3b68f7a22dae477b7f151688fda6a663525b55428eb07c8b93e507c14bdcc03f7a861d9e06935387430f93d0a5fcdd1b7758d0f0c6db4d0f9106e2dc3fc526f704cc1dd2d5fdf19ab06e9dc980718f423a3879169c2a127fc840314a3db10ebb27567b45cc5c3eff71c555bcf96137d1979851634028b07faa467fdaa037c672e2152ad41fecabf2f0d1e0a9ad74ea724077689aff65c6f1c0a5bd9261021f3514ba21901e1412296149b5d68e6dbf059c01cc712aac5b3fa4daabd62be2a5304ccf03eea9985128f6b92abdbbecf264aa1b5e966de66fe929e850b254ada6f24906bcff882b2e062ef4f960df2dbb972"}, + {"0000000000000000000000000000000000000000000000000000000000000812", "00461f6d26517c89507da33b4d5233f4e64cf24abd0bf549b88ae7d1f1a24e23fd4ffdce425e699d700e10c4d14adc10dd0aa9c8f6f1736e82a62fc79a6f7314405130ca09c99b6dd0715aec486eaceddada5d51035e0515cc98d02b5facec879669d58b39e8bff7043b7917b481aa9313687316225a435bf59d9df137e40b409c811a5ee3af1b6ca1bc768e810eb6ea7e065b0c2dd69c3e9e5af1cde05729a0dc926610c7bffba9058c5080dc41e3a96d332458a7df9692d1373fc39e22e9493c56d802e0cc53435df47f72c1d88e1dea6e0f5e7b47a78a836d6c8030fca4ff37453557d5e6585236ff446de08f55d261f5dd1dca4bd74baddd658210ecbe570f0620de63842800d6df1f024155bb8ca81c0ef651c4e0039562ab22a8184cf05bb5a19e679b13a03fd888338433b305d3424fee2831fa1d925cb124692dab735d60a386e04511425e66ea54a39a650602ce093d660c0fbc6359e145b17f5d09713fba6f5c1c4b01639a5eb84139ae98637e4379e667c4d43817058dbd75774ae2ec5ee411cc4bf89df5727b79f3221df0d28c51944521dd68a38e245b5e6e76799f29df03950e741758cd99185711c31d1c8ea08a59e7c39c214044ac45f80ab9f9483224539d4aeab8697c5baf07b389e70048755a7ff0239da15df5970cbbfb80041c6f0931348d74bb60b4743f4c6eda86841e35c3a903e03e858d8a5dad9854d06deefef218abc058fe6e871ca6474564baf13563e9f22afcfb234e1d1b54a835bc9c61faab63f9c9b52579cb49f27e5bc9f41cc8376ebb1704cf2ac7611aa6edac55b2c9fe2e352d3606af7328154e52958a05b08a847135709df80fdcfe092814269696290983e12413da29ff264bfad2a5b30efafdbadd474511ca17548d032e26baa0a1bb42e53f5a6d06b4eb8a616ed3b5fb12f56605b83ed8ac8000f43a62790668d4b88599c5587878d6c9853b394a06d04d7c4c93764b24b784fe79feb8f1c1c40e8cfd0eec8571f0281e73c7842385a14d0645e64cf299e5112ec27a5d52eaa6dc0f9209d62830688f1afa7b180ab30b2189d3171f52c280fd1dc6322d6c7a936a9021cfc79ab90b8dbdba611410ef3b6d62f6b3dfb0c61a25ac3dadd70ac110df231a4bda28f685bf9940e549c1fb22a9df0047c6c4a841e866bf5add5ebf845e01caa70da561fa0d90925072596f578c83b0bd03e61c5b834020b039a9f7afb4b0195181653a78af718b0d1b59321d0a881270c267a321e16fde9c93fc7c01357b92c0cc5651e53d0f84566c4cc279f8367b2fb504958ee48baa1f497455540a747d5b258025b727791de93f6eece7b7573f9f8555d5478bbdb1436db2af055ce467e9d30037923960c79547acac3a4aba750c0e56830442d9081b1948e2d1b32dc74dc36a91c0b802fdd60b49c7f9af5c8112d92ef8902a9370180fe74d9fde4369e6badf89a095710d3daa622266b49843062c6068799d772f13e9a0f9b11cd9295ad654f09e1eee7a2f8ce9b75fa11af2e002e037e27c2f7e7ce0048242893c4d5f8d571ba67f253d62723d853ab63b0e505f103adde1076e403387f4abb52e2c92f87edb13daa1201988e8bcb0c441cbfcc7b4cdee87911f631d5e4c2c264b00dceeebd7cca1d965f2e6c17ec8e71528929bb30de3d942ec39542de423a283853f5a8b18add1fa4e0d2fe1b697b8aa20663f0f32a3dc45be1d3fa3a2228e1017178285df87616e060a69da20882ee4ad8c309d57951f35844b7ee6169940780f3f5f26fab710dc1b14030c9462ca2fd63791dd18dc1dbb4ef26b746416fb9dd8661845dcd0282e214b53fa7542f7b578f4762db1d16904d8dc7233617d4fabedca793a5fbefa1e52592a6d0c9c2deb7d3b73c7fd4316"}, + {"0000000000000000000000000000000000000000000000000000000000001b3b", "0047b17bb0414d1b5deb37f1d7c162fb0a44bf642e1eebfe8f9447d513a49197c13c4b35b2a1b3ded96f0565b735a308200fbedb20f16bfc3b72327754255a1880e4b70806aecdac9bb23da53d357a3612fc5ed32b609bdbc8552d64fd768468053be91ef5751ae19057873ac0469eaa6d729e459cd2c72a41d5f7dcb285373dddce26de92d1624a3467ccf5ee12c6ab1e94859e211feaf42b1be3c5e929f5edddf8773062df2ec306f9ee51936cfac7a07bb15d006a9fb1b78a7872ba632eed756426bc8bdb423779bbd4e53efb871840bd249a4d2580a463c9c9d9b39f68c236d655157409b4331b74e8ff1f559503131388456995e51221fd90c91f1706888c087b3f0aeee583ddb88d22c5f8bcffc61fe5053ee94f721769a318878c7e9efe256555908129fd53afa325ce9def2172ab1073b0c5a27cb91c6c34451522dd95069ba04fc8237e57109e63bdf715b7019834156af0a303a6dce23e2be6814d49d877344e1ecf34878caf2ce3999354b783e5a506e2d65dbf3a0542b5c33268de85ed71e08fa0ee9e316741da64184a7bc7e9ebb32bb7c26c2b3bd5ef266ad104d79abd0448e450ef8703588eb770a3af1722cc98b651aaa828cf57e52b551beb727453cfdd2b0fdddd4233d22918be4faa53471c79aa21d1ca893eccbf487e9e67bb5b3715d90febfd6b8596892f627dc84f5e4d1d86820348445fa59f61bbb55cc415d13bc8f9f259f005b6037d62b6eeb09e01aac4f25fd5c2380a174b1fff08258acc90660b4fbaea7815d193433521e5207df95e2d23797b5a10c5774ae5834ac9f0a2153dcd6e8af605d715586302c42d4e2d03c08664c73540ac8dd6ce31d7ea8b22d8267b7b96079621f940a63eddfe44f5330977e55b51db4e9acc64fbc6b78cb7072d1db0794b91e2b4abdebff38ea60900bbd7a65795ecbed13d047516b81914d649c7d1b545c5fe7195d9a6f84c4e53c62fc44b3b056be8b7867df9538a21e6ae1576381930db774f763fefe27725e68238960196bf70c98165399e8b692b802bdd75279f12d3533b3dd43cb0b50f530175e32635b7c114e5950163036e1dad1dfe871a52b3a740d2cdd5b09f356eb4defd9ae4c218f94126eb25e4b1519f654581f4bc75fb704991e55d796438c71697d9e6aadd7ded4964ba6bbdcf6f1d7ee46b0b559beaca914b71501cc502617258eef0eb7cb99e49362612dc9a5853d12b549ad0d39a953c9638485115cdb1e42f1f908f16d6751af9518b21aa9814a15b16eb2d77cf998972eefbd46e187bfae67da95646080c7b02c32443e44a8f662610d0ee839265e557ce0017646bf075485bbcc43c61f7260fcd3f39d61cdceb2496d5b3399726faf72063f6a767f5e5cfc43f366826003cf34f73ba939e48d40c56479431c2fb9289f806d9aa83ba42df6a7c54a5b1cdeb2b166d6c5eb66a19064351a3edc0c98d8a5449c5c8162d9d6af470db18ad6923010e03ada185733d0c37fb3d0f72f2f4b440b5df33356948eda247ca88bd7cb372aeb7febe5e115c6dffee1adedeecf4344c98c726bd5dfe6c603135a27c0f1ce1d197cf3f637ef3258ac0ff434f0b25203b4aeb879c3d4bf7a053deaee3d414f7fbf4c5804ee82bf20ba4fbdfe5d5f521c7e17819ef057dd90a09ad6bc93151687dd5bba87cc9f39c4ed323bc9941144b8e7ebdd058435f8c41cdcc772f08e4ab0b76aa1c87f412ab4f90c5f7f142e4cd77a4713b217accbb2936633bba682a9949b464f58cd531e693d5bd4cc90d05494744ee8e9f90ee376c9ad6e865de6dbbd0a315b7862d594c956d6b2302137ea90226d098179644303aa742e52ee233883da52260cfca3ab38519480f3af93f220016ff91fbdaa544d0fa037b0362de3d28"}, + {"0000000000000000000000000000000000000000000000000000000000002324", "01aff257a2dc9edd0a0d746c6a6cef718c99b8369c06a3bec78c4214f38b4180bc582d01c337605b00581b1985dcfc5b9937405c6254504cc7b931c7de64d42139418b928b87c47c1cd6f4ba4eb3f7529f3d065c105694b36a865841ead3214063678b82dd3c9965f02c72757a10d55e32ea0c356ceb3daf660eb7f3af4d162c9df4ec78ac63c64d81b4e576120b7dadffa6c31dce3592f6edb9fbe1b2d340aba9532cd4cf66b6b0030b20bd12417aac6c0bd1442f1192a8f439d7ad2043afefc125e9f5dda794290145fff626f55d5942262417aee79f22d0fbd911a2cfde7f462108ea90cd6844a3f497cfd40f48a85e7493037ed0c9bb962f2f510389f68a139fb52165eb21e780290235c9dbbbb74e15c13639eb0bb488d8e39a637c63c1eec6d55db60503cac2ed44e15945cf85636027ac1b665162b853dd06810f95ba4fc34bab6a613027d9e505496978245502d59463be442ce3602ba4e1a2ebe2f1c06bbe82a51b2789a259077f0042d694cf66dd92c9e78bb60a5c033889716d09a1871be142c3f1b8d6824696740a12107bc55959d97ce171b243d4885e65a77c63dc95e90a6a150a77dd9f3fe04020e07db6b5f1ce78bdb4e3122d71095cd127ff9c18a2a0497990d153316ad26a1e4a7d2075cc8dbb57d1159103d4fa62642e37c65e200c5f2d2763d601fa00023b4153a4874e21fad80302e0523050aea40d9a396102f2f5726aa6bcf9f02a0ac599579f48552dbeaa00e01607bf0e4f7cd7341617cb8d857346c35051abca6703f4010eb4685b47d01949a2256c597e22ebefb2c6db7f0ecd98e31c1ed00cd93a3ede88e102af36a0e18f10d17913085f848d554a6ca5a798bf3b2a1256ae6d5accae8a16b9260e150d9c5b2d2e35efaeb74773aaf1f81a81275cd9c01a13cc7c888af68edf9e54a0e74ff67d4b29d29c5702277fe6605ab4c306f35a76485c1ed2b85c3fd3bb08d31271ed550d49bf2bc21414e11a790cd0b886c909fef20a016b3f53d29b549e852c4f91fb57584e1a0d1051fc1a3694dff82510df42c024acea9650123f033e2d23d380f525116f55d945e22f19e56c3773b953b6fdc0f19cd86bdfcd47990b4ac7ea01bbb4124c2144aa39a95f4b6b19cca33752fad7aa08465ae3732845bf911e2954335503928c539a70f112e779967b02794a8bd19378e6f7a327556e76badedfdeb7e4212016fe5c08287a3fd89ad75117e3eb6df4f9b158c01b8f1f710ec6e8b7e93477a3b17515fa93dc9f450c1fbcea3e71da4908d4b5b5a5bf50b3465a78f971a11a987e5ddf92bce776742ce77b7deb9f60d97eb455566b9efc95ec580bfb7286c80b57c6ee956c78ddaf209f03c82f141a23361fe3ea8467652607fbbf435b46e4eef200a60e8b5224f60a485f4266ed16fe9e3e02daf37beca9eb476615b111237491fc56b17d9b5e0fb7992184ccfea8c04114c47cd66161c9a32ec850031e3a0bd084a81edd9fb22bcd23b8e165235cc43608ddad66978f4d19224ca6576957e596ed4d3f1f900915f9c276cec19eebdcf0cc7d42a0dcca2aa77c5829a9e7519bcfe1fef935a7ae6651ecda22a99e28621494cc4c70e5304d5a43c69c8a726f5e177db89690289196c6c3972fdb7320133b61dc6c3e24d05b4dfc0ba5132cc845ce03e93c42d4b49eace225d93464be0dd4e6536ed960f0d51a22a1bf7411b1d596385ef1580b574ff85c8a03aff086b11c4dfe2b327e3c6c355a4432e984e04229a74259d762fd908e82d197c1ae0fdf6166091bc2daf975d2a06bd9b8b92796db62954dfabde727d6bea1dea6187f3252b776d6f6fc113c265d61e0c359c0f3e1a45674c2fca8be9788b99a2335c6ce28aa956ddd1ff65d8ee6f036e78cc59e08f9"}, + {"0000000000000000000000000000000000000000000000000000000000000c80", "0124356ce1406f4b224e830c4b225b4539d479a139184889247b32ae75cb822872cfe75c93b51b1e3e28025357091b4b5f3f967fd3817cdb21a28185bcc0a60ad084ccc7af8eb39287a3efd248449ed5fe5d18b5040918ccf912fd29686511aeb5312af1bd90b18ff30f0eac4cecf23c77b299e0f64b28bf34dfb51158a609d15576c2d7a334cca305f665f942ce05afbf3f504ac0432c265d8671cd07f66ae251b5370f177977f604217ca683120afbfd6432ef19c40abce094133eb11bee6a3a67da754b7bd5a71635cd63b78ec19e2c0b059c2dc65709dabbaee5363b96fe4975a8e959ddb5111ba130ad37e4a9ce1f1699356a88fe8861ddaf04061a5603d9a16d233a8a551f1fbd368626a51cb09219035d0f5d133c1f9adc872220f8779dfe0376979315b6df1e608daf13a996943f8d730495158ed1d35a33a4425d8825fe9ff416e57cbab4f8e1631bb7a0080171bac7006a3799ca54828124e826dea07dfb40561d29fbb56eef47a9b7ad21d2c8f98331767038f6e5114d61a872db9d8b97ba2245a820ede98e1d16e4eb17e2fe1c9f0b553102f6e28cd24cb4291ec1d463d60917d2afa80f530d589a090ec36e004eca319aaece4dee27917e6ae8d983e145708de41481ca3073f0ca0f85e50b56ce9ed5068df200c27aeba2219593ef3f2915228b97e0a3eb279063479a56796af15cfd40d504f755add18b94cef8bb85040532a06d8dafafb71722685cf728615c0f2c0d46e60fe0bb05e3def7b5402a826fce02a40e9123de063870b4fc1377749d762e58cb1d77d95d617bc62b18980afe00de4353394b5c05b816754e062467a8b988bf8365dda63c87d4f07015787b407d4d3ca16d04e194b399ae019c78b635f826ca4466f6d3333afe6bd43d7233f87e6b4f5adcfa399855c02b91230e908303ca974c7c3fc38bbf645f0142f682af1f1a85c86e532dfd4b2fc4f3281b5512567103e96d9c79a0ff65b8df8b4bc7d29db95a97840819d4c94470d1dbc23f4c16e17a3c7b7404ff1ffa140f5a70dc097100b364d4365974528e7786ff63ff0afb65ec9a4f861284bcaa1adcf28c170c1e1bd924197afd20646b778583cbd2e132e96cd5cf00dd77da11ab33bd9f0736d9533474dd54d4c445605653b4db15e284228d9d2cc7b163653363e5a4057649f0f4f90c24ed10f1577cafc5c461ee4b114e25747976547424f3b9de811b3b77e6a392dc47647eb28218f5d20b0e103a0406dec78beb99f1b31d3d968e6766fe0510664886ea465e9d315f6b56c643cec672269a747db80c6368c28b134571399210f7d6de1069e23030a6e71149fbfd7cad846bb3ebd59979c9c39ed93fba839d1fac33fbdc4cb158c43b2853656e532a27469ef8fe41b27d66ce12adba9790d6b99fd0aa99fd61f3b5f80208f1a416f97cadd0a131074c5302146e57da0b350ab876b23df447fbaa38e4133ab29ca353935e871d083c1d1374237a65ee442165fb7575a16b687933c122a2738eef60d6bb7af8a3517b74288cf6c231b517038dad7c4d1072a6851f1398e0e9f12911493c67cf193359d6339f2ebb1b41b84e9fdd848a6170d8577a0b34db7ae5891e9103e790daa3d38acd0d80567e481245d892dfc51911acea791218e76bea7ad3bd5fd5058e60564c56e5ab44fcf4936ac0b37dc8412fcd3d21ac5a7d5d6374894193731e77a8219e9fae1f73370b5c07deb9c4234a7bf57549437cf3a1b0bd11c93516b1a39901505dbcab1beb9d7bede18bb6489dd9b90713d9bf66eeffbfe858a564555c194a0fdfdea8501dd95368a61e9a5f0efcc5347a58867e572dde64650e306446696b7b5df91a045adfd0d6167ed719576264c5be90f22714394bb997a316d0217b110c5b8077"}, + {"0000000000000000000000000000000000000000000000000000000000000625", "0027c7641442df2e7fa446c786bbf9e9eebcf5bda1342fb6c134955cb79f96035a0b45f7959e318ea0ea0721698467e53db73d4c50f25f643cd8595d37f7e20aca2776b6af0d5fcefca4815ff5e6dd3c4bcf765d00f0b220c2ee0047a43933e37dc8f6e677de5d251533d9feac5fce4eb3f261635b4c4a2425448870c30811766eb6b84684aaa86c845b32e824d1976a1a6cc4117cdec323e74ae9bd7867899273f2ef280a1cf81000fa80bda0e412f3bfefb25628a39c716ff7f12f61017bb7b9151e71839d6ae131c3e0feb9a1425f22fa19c71f06e996ae9f29ee033308c0b4c98a14303a8f2a4ce1872b9bcf3bee3d747390e4b64b1817fd45730e6fd151d74f2da3d992a59b0f34978ed435faff7e0fcc20d9a0681acda9f861e7c9947e58b6245ee2ac1affe932e8d5d4031d7ac8b78bd8ae1261239b382424e889c62dea95ed9bde99f5eff834dea5145e42b20201553a2097343b0559a6d920d3ea422e1c3b4fc11860a23ab5939c0183456261e6589bfaf47b5e312404047db844c96dcc4dd483844dedfa86536ed348880e9f8969f09e1bb1468124c22941d429dcaa95708e1ae54635c05b9fd0f6d3a218c8e28320ee481bbb161bfc1e81da29ca9f5adae67567d7042a548edbb82b22031a2ee809dfbabc8d14b36ade83460475bae7434a1ffd8bef15ac08ea35050245e5b5e64257f961e907d3d3aeb326882bad22314915f8bb7cf63829a06c0e6de8fb5f46287117909241554413aab686ff0f87125ebb91db0678d684f4e4b722e41ae1cdddbd197128940eb940d7a9a2e3af04d373cf0f01416dada9440d0a29ead657d0af21fb9588702f39c19febaeaec30d65abf1f21bc159adb762c8253803534d53bf4a1a21a8867158a061c5f6f206aab6c1a511ef055d43b7266f6b316fdbc105836414ba3a56dc0174a05716d20057f15ee3907c494db1c2304327b6589760aa9e8d735b259d86dd8b81999677ce947c5ede727dd9374a00921f76d87bdcd3fff578a02fde6a9fa02d3e081a054143229904a815d5a546f8c856b665dfb059372908c5c71f11301653a660b4218d35a18de4ca1ea1b612d46eeb819be50fcafc948a19aa52eaaee0dab7940fa240c350d99665d5a4a8402ed30e4a2687f512ff65755f8c1ca56c3b8b443a7cf1e7b1ffad671e1e170da5d455afdb4bfbf7b73375867074af081c7da6802d0cf1f1bce335536ce15641c44fbd5d96a30ff5fe1a0c76f7afed3e2db25c35953a553426ef62b7a0359e611db334f3b6efb8eb6b1e26f5832708ff5f6c901612926202d1af5ac95a3340d3a2fbaf30179b9fd121000787318e9b6df5c055db8f7028c1ac308f20731aee7b4943186cbec5d6d5e0e3710f1da076fbda753a0bf22c336741a170ccf3f7594d05117c603a91330173f143bf0123851aff70aa6cc297f9cb96da4e230c7f4c71d1d21507e671959672ed5bd322b5bfe5a50be58c96f294654d7c78e5ac3c7ae122877d5688cd0d364085faab9c7f608d41c5c1fe5c64f9167aaaf303cfa7f30d1d1897cd1a6147adb5afd13e33b472f21d472346110f601db3cc52229a668f8664229fec2e1bd922407d504baac86121d5311aecc7943b5d11f3281fbaae71686197fb0f968443c994e72556dbf09603c1ea203d7841cde7616798f776ea4e51b599aeee08e721d97106f1566ea879072ccbcc4668c735c6c20a57ef45063a8c6be8d3d16653164939157eda32e220bd3f787027f6a19ed886b252d1e23a752bbaadb60d83474f445bad9d1659f640cb324b4f24cf3fd24f164c62c4fea830ddedce5226952a75e0e9b7ec68ef31e6eaa96da7db817d5edcef11e8cfa756e67e44954dae5aaf837992c1dd6856dcb7c25152454074dbf2"}, + {"0000000000000000000000000000000000000000000000000000000000000217", "00497e2f54186131f9d932ca36aa90e171bc1f26bf3ac1db282010a527cb71c72fc3f5dd5e443bbc5c19136ffbd63b90f468bd55838c70bf98e2fa747ae92e1ab1a6f3cc89827ee1621c6671fa49972e257b05920cd22ebf4bc7579f49a4531ec77b73a16401f19fa819eb5fd8f3d32bf2de86a4266523f92dda26bb608620ca4f050a13602f6c3bd3275cc3530f56b31e14f32d4224b8e350f89310c71546c9b53519f540b3bf60056df6b33922e083a81213ba2c5121b51a5d3169a61edae13d48a1d33368366474b2aa58bd1e695e8f27064a326854d543ded2cc748a86fdbb02aa7e1e2a0c1d4a4382cf0afe129bae62d87ee6118e3a57b3f32a13bb7ab4f5d594c1c57061c13b0f6d8109e42f3d293c9f4f2d24fc512de33de8f1774a4832df29dabd3424b89f8f790ad5b6955912b3df3cfa398fd8eff5532c7cbba27ce3dc97bc62557ccb3887b60789f08da50832472d745651ad1ad768725e568082621f16664a1f48c3aa2ed0f2611787543d72a7f1258874ff35790a82f0d726628ac370f172992fe437aaf6ab78d430131879a8fd23ebb79b249257a86750fd6875b69783107a5335a017ae30c09b728bf4414f08fe6739cfca1e5b6f4373d5cac7ac077210814bed69c5e1b307b3443ec44e38939dab773278a283d066e69ba5fbbb255a28237735aa6e05792da6917d70b595abdf1243e60e863580ac1092b9f2b67341f4d4d0d79cf67d3b142dad3d974dd48471c481a5feebb570f2cf82bbea541006cfb5c34de3d7fbcb6229a7ed57153985de4e961cba255ec252aaeca6b383c2f9ba83022421d70e6017f456197e149910d07aea14bce14426a78cd7baa220b1b1c6ef60e5bb34e7a2ed82dc6968cbc2d824e91803dd5e89e40a87c2b4b94c71d7665385b0becafb21dcf36b060921dbad1fa274ee4b0a0fc2857ff813011e436e3f42f7ea6d1c52cf1eb778fef4837b7a433ffb4e738bb75f2bec3b7902e454251b70729be589167148f4cddd390f91c7c1e0d41de2c2ecc4f9e6052e79bc584b68632b5d46c318e2ebc495c9b9b30364033cdd204026fdbd5173f1fd3f12eec97f235a615f3e21e49b89e31abd1f2725582866aea19ae593fd0e1a98bb195d3b2f5bf0a3a860cde541db0a603f02301cafa7f79f4b7e2342a30244b1bdcf0a14945c44930268568e59ef41eda9d0e3d938d8bc81c164dcc3b00ba3438c9f845737127a661825f7debd9103f45b530ca5f61c701b3dcf5c76d281485fc71163f5ed5da81e2819f2b29297a7f69f5747f74c6efe0d53909294031deeeef18c0ed3c2d9c3fab7570332e90437d53c176983f51293ba994b5a73014c2485bddafd33b0f81307ca9c04c4f372db05720337dc23f5c428bf370a3a4f5dc6e2e8adbf7617c58464d038a9fb0bf7868b01dd1e947d429892c5a7c2ec585ddb04bcce4c11502b5ddc1f4a9c00af8163d4c4fe72288d6522d7e6cf161aa4e0ff4c76f75997638c4ab7687d67955ddbf14d9beb7e896e700beb5ef53d1f6e2ead8c717a60ff0847de075f0c3826a7383b149d6a3692cc365ed0e22e23a4150ad5305cc4aa56e080fe54e5dcdbffd2e51c9ffc56c89e18492b2a98f2f058bb723f1c52c78229a974f84c6534334508d895e2eb95468016bb5d060b56587df3efd927edd0072c8667f95afdadbc29b214888e73db9494a5733ea2672740861d72d1b681f611593ff28c851a13d6ffb1fff1ae4ab98d679d2e5e1ba80c0d5d5b2d0b2d9166ae9cdba0feb7ce5c2dca1079f8a1b79fcd89e31a12e2607763891552bf771d2f789a37cc52401d5cd4345314b8aeba499b5b16ea19865783c98e65a98840e57d3dbef8c5e15a5b17ec205acd22b153a4a3d0cbd3bacca73f767afb55a254"}, + {"0000000000000000000000000000000000000000000000000000000000000642", "0009f24f53dadd7efd36306647234aaef8de5f56700a07e381b985953a9c15d2888de9bd59acc9bd723805a58657dd5318caea8cb389d272ee2137303bd79214a3ba1db8d4e1b3943fd3ea324e3214fbc18bf9f510c8498f341437f36969d3fc60f2d48e615edb7aad181771fca6aabc4162b252c391e2368eed2bdfecd23e591a679920539b6f13842d7ca45c31733c16e3c047cc932458b54f3fe88428ff19cad172dbb7fef64e05e9006e68519fd5b2d6c923cfcdce86f9aa9d4c7910c0ac80a29884550732e45ca6abf2b2c84f9b2c520a64fb281c5903a107ad02d200fcd266c066f9885635355bc1ca3031ad912144a702253e9971a6de405409c241df3084ec5e87e013add16659957783715fd9269eaee8d9cb3e7ea67ed2e1774fc9fad4ed7c61e31cc135253596378b38fb7973db67b7974acd3f3af4455a04a169a9fa657fb9b49913ee539e39cdd96d0a001efebd9e0b53795880912b44d99b1a129192c4aa0bea4f3138e885b3b5bfb0e6806211acb97818260506b4faf4eee691f96e3b54132dda18daad947d17fc17812ef193880d136c4941ae995001f95e3a3d98e80aa2bab339432bbca59831ebf9b42a6ec8b53a9f0710006fa9a41a48093353d4de1fc8675be0299f3eac1eb7c9cdbc59ba538fc34360ac3f61f302149d6dae6127ddfef1df07bfe32636733f45bb95a0da756a9c057afdfaa0eb071db1ebb07a0534b84cb399c5bc101f25ab1fcf4b90a9bc50524a7c52861218af1c4194161b61d8516660f3790ec1f8a05271913077b6b4572e9893fd6c0d1c7d65d294fec5ab2375f61531fc130d64a22147244447fb54b1e424ddeabe8d0977d05f243e5d1376996d33f1b3b5641e733a7722abbd8a721b255e253ae246cf7e3fe9a9a95ba75e9456d51acd1d1a1ebac4e58da3f9e582206639b19a0ca9769257020e21bbb8c92a88e66bc09ed6b5195c2bee63feab0f337acbcc7b297ff23e74ecd6edaeb5c406568dca13d436bd52d0cdf4c0c3f49ee3bb5c77109b9baee34212cd5e835999c765f4857906f63cda7d7dfdad78023554ef672142e1bc4eb6e23d74d789eb3e1dbfe50c664458b58ce06bd55eb4af0bf67d5d2f40f848a202d8a84c2af14ce9bec0a0c62ad902d5be3cd825791c727f0f8a8d0121555832e35d583b44f4944abc11025bb59817a8688bc5fbd26c14acd9d4ed573bee8d32554e15d1505272fd73677971d0f22e1a8a141db6064f9bbf9898fae935d9f23b0eb9fccae499fb1c1a09d50f6be5cdb2aea62ee174bc737f12291491acb0043598581aa78d8bf16410afd5f0332c56531083f32ce9399250598b6f17b179a446fafff2cefd77304904dd841693959c51381d9317a2dc5e862cbcb556de2c2f6b5246a1d27bb8844707f96f0cb6d75b9b8c3a02821cf857f45e6ba9f301e4d52d72b0bed0f4a42e07b9e58a129baa9fdc078952137c16df0f2abe6d6a160e52ea337297b1dd37025c31cb564a021d74bb621a9abb6b614b08cec410c44308d223a519d98a57d108c62eccd1c4f93c9d58f3b8fd22da82234af27ed21a926f1ff8b4323df3d882e88165e1994b2e3669490a2a314920d1e0a31883c478234a39f9f7ae39b74037fe9c5133145997515ba661336ca7bb8984bfff450434c03e9c6854fd8e5fa19ecbd9a8a6849cbb6515254f4df50cd20b9fab9cb39d24fbe44562374dfe1b1e5d1adf10b37b2fbfffb5681130cfa62f033889793b9edc0d0c668bc99384e51b11d149a1795f1c6fc90e81c5b9dda9c069b7277163f7184add1968f825b01dcd1b0eac090bd3796fe38c15ff1895a410fcf8f61ad6fc295aa44021b83d84dcf047d2f64816773e0621ea4bbfdeb04f97c986d56be2ff5bd315a5ff6358"}, + {"0000000000000000000000000000000000000000000000000000000000000cbc", "002f39326974fc51d9ff50c71cd16570baf0ac5338199689bd654d577e96f4f6435c7b7c6b7b6b7d95a810e29437dcd0f66dcfbdd1148392eb95a839983803116b22d1ca8a7de7e0e335e0ace64fad927712ccea05667b86439a6a6f1648bb23a37bac837a9bff23b5290865c0749b2d60ed70b33e865e3bfa0a6570615d11e2d54bf78b90e900a551b329f2d12d8d2e1a927e3efefa451bab9153aac3a6fd2dc384e9ec9f3057c907cdd311d494ebacb005531cea193511a0e41859d60cc4166c95555b0177f157c620cbbfe5ffb7f48aa20e4f7afb7a6f45a1dea9d1b47b692e1ebb69dd4d4582f1a68531741cc1f2b159e3c56f437eb5863cedce10d8427073a6a3f5ef23e5db8c75dfa981e2d745471899ebbe8daa47c5be12459451d590068f6fd4d90f11b5f6b412884e5bc80d06a7ee68bdbb112c5dcdbd1582acbeb94b7f8fc15923ffd45917b61b9135f0d00185ba99e3b0fa89b16045536fb76bc1cdd313434e33f576ccf952a53de022048be9791ac55f5cb4b0c4169c1d0733da9ef1eebac5de197dfa0ba78b3dd7403d9d6d610ae5cd9769d1d5ff8bea94a5bc6d159eaf0a85a7226fe4c3cfcef09424bd4f02ae54789ecfae0feb047c96135ff7f17304a46e4c2b6e7b1a16d19b0fe347c6df1b97cde7c936a1d2cbba2b17a01eb2972389cd1665a49b8b8c0ec23fc1cc326d2d3a307d1006b1d0d20bb29f5da4eed3b5424f711754097d6fe308245b8c1923eb6de14c34203abf118938c9f3b4b50f1b695f7783d9a8fe9ac51b134aae1dc6433ca18c106964aced8792effb23186995546ae313fd7f6f39126cb2f02948a3967838e7756348b4422bc87a371c4b63a2f132d79f754d1de569a5e67c022a3d3a1d2d1400fedfc646a633b00a019d44a08a69ca31df87a316c018d17447d1da8e2e22d7d1d39b962ff89b6cd50252e667cb425de124a7c7e04373dd3a2961923bd30ee279150e57ddb1d162e5991e316c556ce0ef52d00da3ac2c50922ab1b88211827c6e4dfd4af1cf690a277dfedc7e5d32078665955f3ee7cdcdf0501355c40920385c2a5f63a98072e5f52cb3a862c8cddb202f35938e1dcb9dca119893aaaf0375b59fe4ab9f456d124c3626e74ca5f76b3d37b1e8c56b8291225d8252211014fd790d62e5e77cd2320365f772194538a24a05951e0cbf8eb54b93c7119b1a7330749b3adfe2b52323ce97aa14714bfb36f5112dd1c2758f248ed5260fa01f1ca6c9c705ffc73be1c77f5f9b1c233fcde01b63b9bc222285d51a30a613713c4786a9975b4a760ca2c88a8e6db4cdfbebe67c4e3fa7bf54f7fec4685747d48258a72b41b0bd75a05be43b85bd0f3f16b9290b0bada9bd11f9ebdc16ab22c6525ec41a3a4f19308b5a2e3114445b0534460d9043f7c676d2186e330441fb7c81274f39fe2fe36439cead729a1b7a62280f3d6921d4202c951c7b5589defc4b5e613cba90db09001f8ee0a576655670d211eac445a12248925eab395fdf84fd95dd9fc8d1f3c7814c68964ab4d29dcd0dda98cb67da517fb9ee8955007e8d3fab37fe8873431e9a90af3114938ca5f6b3064fe66ea27ed9048820a3da412496e51f2c44784f96e8665e525d1dcbd431cd422d3695ffaecd3514bd47ac543e6e1f3e5e7e0506228b1dd74d39bb5210937f6cf5e35a6c1d9d562b458443f118616aef7fb2c08e3bf5b7112f1f6f7b06278dcc470280882a7081e653b71a9714ae5c138e0d4bc79a9f6bcf0785b0d12d58e9b569b01f581b210522fd7f3147c874a6b7a4781c641936971cb8c2661748995f81108b5969e414401a300519efb8f9891e0b25c104ce8ce9dac543c24871db8c4e2db8b460b13fe69ef6be5f5387323664c4e64e4fcd48ddf4aae3"}, + {"0000000000000000000000000000000000000000000000000000000000002ca1", "00300bc198c86c744e2d0370e3e8d0352e382e24e80726bf4bb9084f6ca6a690b0da6e83c4cb805619d604a99ea32cd4b6ef82ad912c8eeee599ca5e6f371818a2cccea0196ea3a74663ec6e6a12019bc8d641db0263c7d6b91634d3e5edb0645673d4a0f87fbf0c950d0a7245e4868bfb323e545ed94724ca3dc236c3dd0bbb6b54dbd4fb1953fb11555d2e057a4ec7193cc2259ddbaa610e7af526dfc63bb9ca5d8756485bebc3089d4e8dbd16b0bcd9c4638b27eb28a11e812d8d6d31b32de0c69af329f227599ce3701c62c7faf769c108d93d54bbb23f03ec10a485b8bb0e77276e5a259920e4bcac5be6e4c36d5524a9a431fbee7c2e98dc280f9864ef5f888d0ee0de1330e99bf6ca8dddb7563832bbf530649abf10e09c1a208574ac7aa2699e06471e258759e7f74915c442e31d12b36405261b33409e2b18fa6a40a100059fe0b2b92dea646af8747b3f7c02c105fca211f76120c9a622997fc9da5229b94f7d07df869c032b2209f00260e327d3b496eaca59f6f612c9cdc432ec450b798651ec0f954120a4ea142d2f3e873b2954d0556b81774787214c2f930dd69c1747082f5a8cbb9510a9fbc602936feb4a8dc181749d321d1286d111ce3dcd28ebd78a67d37c925c711b35f20f175fd9ccd1e871a0c653d2da7995697b69f76251260a7c934f9fa12178bfb87148d7b8ded717777b030375dbc0a720471707dc5429907466c7096e5f60b5084eae315ed4179f5e3e946aa45fd65dbf9252d44b10d1e0c86e564be1a6dd71884cb0d86da424fa0bbf28cf4969ec0cddb765c773c7def8cdd65ec47ff87b1716c717dacf04df404a68fc5b4a7b1f23db7a881f1f3821b04cceea8de37d64fac6c6e55da86777922e265fc40161931f4aff68d7e0e140f55e65d4faa0cb2aa945f9e39462e17cd07708e8f839df0c3cb8e91b038b467faf30db51fddb24a838745f75ee25af970a06179f30468afe55780b61dba8cc82a53b4d09f23a1821adba10679e655aac72f7b1591a597135f73c451d37549a7edb5937f83671f4b55c8e0e1b6bd7f4bb095765cdfc973a6771cb02c4717e0dae79919782360c26b8ee13142a7decad40fbb539603c7c98d72872228d05b4cc98580be239775c50544365db4bbe6d0d785b7fd4ff33fe75ce622a665b57692b34409c365c0664af995197b7bdb6ae11c3564689916e2ddd86a71a7e8a4e771a95dfa37061d93cb84ffae50e9f3578223e6cf29834a3abd345c444c66982993a94f112fd34523455ee1ed819ecee642593dff6758f0c9d299e09f096b18753f572b27ab5406ef77765a8129973ca3857d6f81ed178c4901544a4f7fff2a600497bde8b21087db8ab8cf109c00c7328a42993cf530d7c3c8245a7f7722599f3bf53cf0ba5e263485b42e4bbb06c0421fab1389435214d866447ec67b2eef826fea6c32b4433a97fdcbe37383b6668abcef5dde9c719f7f22211749d8112df5d5d3993ac46a0b44129fc59bce52d8c9dbcc154807922f965738cd0b216b665fc5968062fbfdf6e5ea815e68ff613a33fb1f60b94dd9b7d255e8c80e81535b91f5f2ad0726d0bcabe803a5e3107166fb7e644eaeb86c942314a6de8e1f5801a012908571e03d7d548db16654125529f81d504e175062807410bd0b220833f778f41485e66b79ccec4bae7d526eabcc431195c97bb7dc296d6b154f65872d5506132df59cb525302d930eb633b5ab9d1560b3d5cd74f338dcc90242f01358f2d158731d89335fc1752b019096c72f88351d786ba8f86d2e551d85a21607adb662a436658e05c6dc7b69d83f444c4623f06dc3ca4910d9aef92380dae68f6f1044440f2ea399b1d78018b4e5352ab1598105582d30580c7ef85458bf273438d"}, + {"0000000000000000000000000000000000000000000000000000000000000601", "00a52925b268311fa6fbb0ff7c58061566097f05f4134f28ce5e8fea109cbed1fdc974da78a14fcbda7308cad94d90d184c3f0a621c8dfc6cf4ddaa793e5c30e1b28840fb8af27e770b2077cf2773e796af6d9df0fe82c8d5f316f37ad71b1294dddc1104f5596a87d1ae13fedcc10b174d9b5c66c653fbe4e4ab63e75841b5f7cfe06e60d8133af15bbda5b0eadbb5d707df71f71fb852c571ddbf6e9f618f6dc956dadb2ff76bd1022e5bd6d87f7d9169ed17fcfbcc30fe7fd9ff69d1be329f6410f72d9efad9b3d0cda839772f69ca3de1e5149b96e8cbac8f62c6334ec6f54ca1d62daae23273bef8b6dcdecd1bb1e25a193f1353eb4157ce7be1944ca3a842ccb45eeafa673203e66ea700f3b3ff821cc3d4c19f14f13e60612c86d6405635619dacc4b4c19bf94bbd494978555995d8b763f06a020fdb7475ad9af06c8f1e291e8148753fec5ea2656385a9c1d00f5309046c5ac15b70021c5311e1b3c9653f5cd9c0f67139ef4e1153b61914232301ed511aa17b340bc0417afea4d0df0d6cac405065937b5960c8a5aec8109c3f417958de737122162d321f95c7a44cdbbe23702cd543f10cd7c29da3506b717ec28779f551ddc94109c2fae409966f51fbdf12607de70b1e5c8afda891237da9bcf0d0bd14e1ed3284cb23d42d68f3f8cc81aeea2cbe690044328f5e24ce1416fb5dcf8f239ef016190574b349ae5fab6517571ff13e1009df52456197322d6411dd0b3770063e4c43b052561c6901f5e12d3f39cbd108e2511f235991b3a37d3062bf8a23744b38cc7271764f304a105de557ab0ae3d58932b9f04f58f9c1084c8637cda2869cde213d71d013bb01f0d8d91cea2a97bffa0b201fc6e14b7bf78829d40d50d3656bb849b9d7f620c058375c2a9aa35a973cfc639bb86b1d52976e96939f74d6ad6ae7e4c03d2ed800195da5b98c28a2cefdb21533bbef954e9b4b4e5560ebc097e8492d3c53dbad20ba56aa24db81c6fcab106dc3618bc873976dee2258d593a97b9a1f85fbbbf15656b780a0f1c2732b762033bf604a956a05ef4701121faaf9b86b70fd1ebb60cccfa580b1e9ebe4042161ab46ecc52b1a2cb6c01e3cd1a25b6ee17b79a7e1a56673affda3694f608028fe19da8bf1d0b59fbc62488f303e88f0f5df66e640364bf73beebafbfc60e05752c38aa43a8eb20a5e7037641ac8e430c7adbaf0b040f27846bfc6b803ef48049d756c139931da18a0b2395f7dec5ae1bd1b091508a2cadfc787231065a69dab68f8429e337922187171ed66dfa9904f9fd8f08e66aa1b321a2a138cde1dc1b3dea60c6931f1446509ce3ee8ad44ca1c159b867f86ffb6f103d5cea173012d56a940fbb658f54c5dd73421eae2a46f91e8037f3bbfcd05449a37d54772a19de807603e3bfe10104264a6cbf50f819c23d113b7057b679a1c0ae55a716e615225946bf484fe592b1006fa379fcdd500709133b095cea4862d94579721b3cc3dd09963bf16abf26e7c2dd366edb27bd55f3bf525c4cc5d697fcaa210633732f750448f5a36b922f65be40cd7bced73ac24f426591ee9468e6afb497b4d7ffca3abdd0ff179e0945ea42044354a73c2a416c2e9671310dab3f6649422f124c9ff052d1a8d8257619b69186d1d038b86c04716c5470cb9910e956f17d0d4a03a61ae77e45461bf4ef94301d5242ed66a3ffc0f920d205fdb070fd04a1da09129e9d93d0cfa18ce922faf13171b9d8dd0f66ba48cb07d3519c6123fd8a45107a3bde7885520d0d4d4da9cb115be9f2f686663d220dc7dc14ab06340314f14e11dd4f4d3f47474dcaa3fe6363bda3181055cbb05d9eb91d6bd86509c8507b7e72085c5939247ccfb0e549a10e69da348d255ed0b256291c1b60"}, + {"0000000000000000000000000000000000000000000000000000000000000385", "01664300c29c6af1b90f80a55969bf308f5b19c14f13b60d7e9e4fba01a614d4ba332bad5561e27fb807058f452c049995bd20e4749e492733cb3dcf9e78e111fa5d47f4ae4149d13f61d43fe989777813de776903f1f7c429ead11dc43dc3593ff246fe684576a4771579d7d9feed8179d50fc431d5c4f1756d9d0e79cb087e657974a4ec3182e227dbfebf48567196de552d17ce89ddb9e8401370525269e4a0120b0addb8ec5802d9a2b47cd1dac93ce3e70cc7be74decd5a7945c9148db917c545e83494a16749e3e0315e620519b0740a0f89a8e319570dc1de2122051c77b59e051a40f842eae3b897a655fb396b94989f32803166588fe6a507f867e759c7f8cde11431dee7acb0f770aa7c0f833f7d251d4aa0bb29dbe3b8d9bfd9a8db61a79b892e266bd7fd61d3c3d96f55b3b075ecec7dfdb3f53a7d405732e8adb1a0bbc704e5e6c632b28736b0bf18d201a62a95d7021f9b266a40d5a0d4796aac769915761183ac79e805ba14f51c12f3cfc668b66dad795fc513f14ad4eb19998f060af72f1147d4af9f371ee05a5f20931e64282a2de4b195f3f73fa00b1d2ebc7ae801ec63b74dc6fc4adebf38e6d36af7a6dcd77c4103157177958a5d04e4fe4f139c8a511b2953aad0c4fc102728a9691b689918dd99f799fcd833b11abe1a132165748f7dcdb06e8c1f832f46331de71a1ff9d8f3027fd81c1f12c24af2a4f39e3030ec71d7c3b7980c09dec7da9612afd4db31b22c6c67d71d455fcad6a31feb8c449e88bbdb5f3b78ab29e691ba961b1c1ca245bb2623a7606b03a47e3784a054122eca0af881020433e292dcce083d8e3992bb1f982481833b905c9e0eab776b8293aa4bff8d443a2ac0e1c5273e0df2a21e88457b054fc3fce190134932f86e310954f17677220bb3b3ea5a1ae71daadd793374c1eb733fdbbec9017b798f180b1d770c86c29c2f2db5795294ecc0370d8a014d8a8660dcd8ab245b4f4edf3531816f33f9298305cc1d9a7b9af1dd9336af5996995c9d3522e0361d763b69d5b1acee7b753cf9fce41360643d6b8601a8a256edc1f661761891d816ee96f124ff55a8c66ac505ce6b2ec6ebd54a79639270c84a71f71549010f99f7428759b815b36c25504cad4449e44b1eaf4739aeada9c9563057c6e4c5731a45ddb9800b73a9a3028e5de01f59440f0be0557d0d76858d7fe5ae1f1563b507b1c39a4d253524b9804ce863226cfe945ec527aee5cbae4bd2cd0454f38c90a2b65b573d1b7e622a84f15c1ff84a1ffa3273f433417e2284667fb9d5117e119be18a428c71e4525078313bd0b50034a6312583c1d98a101ec1d45f2463e460e5a55d3e0f6a201d16fc44a6106133af34c3c6ba4a964af8c6dcd67d21d3af23820f41514bddf30fae1f66ae6e229e6d630204f8a74dcbb35066f7543604a1b51aae09778d2b046ca48df654f616f1c143cb89a4a79577737505f822790206e70ff6e7e63d02f1874716f5a7577859c3259a2ac42fca3f8f5719a318159a17f53f976a411a04f82e7dadd58bf17b0348bb5eedae8ec99fdbea0d0c48739112106fe9752ec419a07ae5aa5b48b9c1b310714e09e1c71b6586c718ab756be95e80e71524bc225d69c0454e419eafb6d8c9a4eb2a8245e51a9a570247743aea18ccf6fff3b7d03dbfc5a6ce4178289839381f271eb804b5cfd2d3cda5bef1669c1c78a9c70710fc72d5ef29098bfd810d7cac4d2a25fd1d3c4454800c8556261947f3a8f9db13f030bf505e5b868108d0a287bd6052ff865310d5346d7ba83f9788a85a335977bee4a564c7a6822767e1cffd0f35197f98f110d3aac13155d03b0a3c43a4abc3d7d9bb22963fe111c16e112e0fd0915c84e6b8cc413142d16a3e1e24"}, + {"00000000000000000000000000000000000000000000000000000000000017be", "0056dbe2d1558381705130ea16a2e8291c0eeab8340a730e985dc5bb3b4c5770afef4da1e434e91de16f175d7122bf2286cda03291a2edb80d04c2945091b117e37a9ed655d0abd856f6a6b65ce7b1b7b63a489100951d6bf580b7a4f8dbe2306d9b58521de27895d302933432751a62efc0e604dd447cea35d6798ecf650fd391646e4a454f68d6415469d8788ec1a6590fc110c1175aafc4e1869408442466b616c1739b0bbd41041beb7e7ec639a3faf913576ad9113799faff70881b49395ed1a5a305b8abd6f645ef31523001f586bc1098fd142fdc83dd1685d60689dd80a6b64655eadc3a3f6316d79aea0b697206060b334e618db9f39fd8081f8feaf2df948167ff6115b77cd50a61e934e9c70b37b4264c47ee62b8de925cddc86a7d1ed6302e1727d053888e66478bc71764485bcdb541dcb45d947128ed6f3e2e5db80f996193c7ce53d17ebd20babbf502f77b665bd796a103c3220d2ceffe3d213135888b123c940f8b732f1ffa78913feb287884fc69fdf18223f9e9f2c7517d6bee5e434c05cb7f694bad0df62d3e7addadf35387398168e653be797a29ae9b9fda9405a9fd62d6d99effa8e140d4b26653284ce1f3f9760a8266c1a005aa9194a6362a40d249623340195ef609f0eab59ec79f6a696f245619709f3aa0d617a2ce0bed160722b2510db4f53132e96d292cd52d754686059ca6b9d60ce75e7d96406e71191c14b79dbaaf3816ff15dff1d83afcf982319cb0a566ea673fd44f241263a7319a5cd30eeb84a648e4e538cb1e8f9dc22450109db91f1a80d4fbe2085080dbc53e3e765439a111da67fac1b8663de5e953dcf0f307c69e563a1eed137f75dc8d974a234d89525cb4a78268e8cc1c2dc319d017d3b953406b6f45ca94c57a43d6a6b35a5e895834a66002292329b84d6bf948fa5e6f6f775d6afc009a6d95d28d99b39f5d11ff0b5bbf3d42300b98db0280a87ac55eb4d7da2a9385b4c17ea6861ff5ce2506853e601687710782d2a1b6b8aeef8327317bd3e41e29c376481d7a50f8b3a2ea56de0589e69b94b78605bc56aeb110f3e4ba27538124674af13c4bebe0f77ae35f16c560b09b662ce8f79f59f3766b9e5754a408784131f2d159adb2f60339471e4a18e11750bd4a24327a5e5bde53bd50d2c353c0cdc35dce39fa62ff03a631db1f4deaa33ddf31bf6d5893f93a48742efa2487ca742bff7b4dff42547e30db8cf5a3d17fb00a0645a270236038af2a21f727efe575025589b4da3c1cd5e47afd5f18bd6176a4860bba34212b88782bf91597021631cd5e29a79af1a72d4bcc612b7a3f957f18cf6388271cd871361f483fda456b322fa497e3031f61f731beaaee1bc18f26a76ee83d1e395e9e916f27355f26241f6ca33c30b3514376650d664b9525f101cbf1204318b6f3767ad3cab36d384e7dc7d4195e2cda2d5b5b15295f62f6a43736de37a13f9fdb382d0ce1af8c612d7915930d921c55b82ea19ca27318c80fd0b0ab0c93da291efde27a5adb1cda275597e2250609aec909ee372d9080b45293b329f303a93c4c54490d669010d696dd036f762868cd3355b1cdfc8cb523354d96cd4af67865f5351f3e5f27cdca605deedb251823e06d9c77f999dd8324b97dba76d9d798bfd302ee0b1aff04d5bd9db231c2746108d95e630b340e04dbbaa1180ca534797050679bdbb83127756a92ec170b9c08fcd0a17c881b35f249d995965735d66e1d2846a9dd18bb88e9eb3d63cd47d3d82d5f6f3ca2a112dc3af41208b1ccd4c2aaaccedcb8431843fbad4136a167f09c5f0b9b35e2d4556da71b4b2f291ed54f168a2c3cb66eda81aa8f27a7f075b9db1a1e1b196b1aeebc348bd13921fea0c6d73e7f5abe6cd5db085a"}, + {"000000000000000000000000000000000000000000000000000000000000088e", "006a43da6c7b9ffff09a81d276d11e2cebcfc993ed03e2e0a08044e792faf1a25cb14ae09619b0b42693029e72182700db8f314a311b868e8289184479bb306da514732963047130e0d9b8caedd856922498121f0ea14c5844e97cf9de6d8460ab25696e0af9bea25e3220caaedb90b23389beb613cec41cbb2ad15b70c5149f8b44cb60799d3f0df6617f54113f6fc7fe040c188aa0e3ec301aa3a2f555323936f2162d4f59510405a96b5a4f1c3bf140dd03a3dccddd956083ebd4441a596b48e1160f6da87d93897fa514d59282be8a80144dbc5c134cd3ed589e747d1f367c2f19ca19d5501968e10c00dea10b9266f8e64c4a5fea5b8b1941ef0c491d7f8924f0b1b285831c302bed5910b59db03e13231921b96023531942c95ec8d932cf5a6a7b819e0eaa595dc26cdc33819ac138d315abcd3bb3350851101ba8c06bd23e2f582ce5701cec58d6b6cddc267e06131b30849908dfbe0f2740c64da4aa938ab6b19d2ac977ec8e4fb813b52bd2ed3fbf5e9aa20c3c3cc51d1c9e9d6d876c0c782b5553f5397b562c5e16a64439c747641450fd94b45fe409d6f37fba182ab5d5150830d68bfee9e57ff0c0e4e2535830521ca05739a5101ae4b6ff4497133490b6a8d8eeb8c283ac38de921c3f0b921f6fcc9dd850894353f049d3407bdc3b5a398f27d66d70a031d4fc357e0665f90306447b12f00991e49a58ef4b3793c722199125a4b151bb7b2faf1f788e010adc87e57b6291fd1845dd552675592a93416917268929b593c94887f817705b167eb7fb3e5f8de57fa0f9699cd3c4e239e8767f640ad5ed7af76810bb7b99fc6101037362b50cebe3877207a7be6eca584b33d533dbb94ee4effa4e57e75a470347bde38b1281393e2f9f62b54c6ce3ed8c513df569be97c2493cf0372a5f61ce919d1f24160a4c850ee7e078c1c2047cd4017cc8afe7334f4323a9506ff92230393de007d7377756f7a88dfbb831fe96f44c39aedc7d4d2e0e05aed31407338dcf5730ffe2687955264ad1cf46543be5964f2b2cd39dba377818ecd1b63f767c6c8611453906a4a51cd15b5c7319c0bb84f21c3f3cc889175ba20487ec7809ba5cd801c5d181ce3bcadcc6213074318b72171d6cd593b3d8493b18e97c20f3e7f674964f1fb29d7697d05a99056cd9eb164ce0bab07609b999cdb39a0198ef74924f3f422cd6f78bfb365e3064656b0b223603eaadd3b9daae10b9c145f2c38c24d8cb3185384ce5ccb5f3952c9d12053385fa4ef22cccf54f2fa0810d31ade8dd1ff2607750903e792210077ecb3b11a88fb766587a6545704e828d3a9f0010739ffa3f95baad7a87a17b38bc993478c3ca7f001a9522fca20de10dad08a28f181f97950e87b396fa2ea8da2fdb6a04efa274d4779a64396788e1bd0a0f05adc1a99f650d8f474a8412cf228ab5bc9278f206123ff17fe60ee90b353731ebe3131054fa5aba5a5d29a1d4219279bc3bd27515e66733e0c6a1d1ba0ae82f031420602789bfdc8eb57e1378d2ed9bae4d8cb212936c0b0fce04af6df5eb5edf5b14bf09fb9e032c2eb229b15f309971b77233ccc1358e5a0cc1b164c8183a08e19fdeab40f6a921e6cddd84f20d2dba2bae3f4c63f9e290acc9b4fd048e7fff42f52ef975ed5210ab5729569149c346059d5aa073501bc36a1f14b91c6bbe64190ec1b2f56942e278ab6a374c6efcc756186e05b8555c49fb81d9d57f67347d167c0a1ab9d0269059a571a0ed39831dc91cf4d1632aacf7bc7df21a9f550806983a58c5faea14e96092e7b096ffb00e445274fdcc52e711cccfa7a979ca531dfee1373bee3b6d11fe4253b483d9bba50a8a46882e819e57ad0d81e2460dddab264b9e06283b37c6a6c6adb59b995e"}, + {"000000000000000000000000000000000000000000000000000000000000014d", "0096e1752a899332cae450367b2d6d7db1c25c36080800cf3bdba0efb50f8652ae7ceef6c4daddffc6e910085c886959aa3d001e7254e99f20352cf2bdc14024764bd9754c5d7f5643e3cd22f8e9b65b9f139ac503ae7d05d090b0e9ee809404b147d865f151ffce510d86373bc824b9612650f65c877382131e64fd59f61a83070673afaead918d730134527f5b2e3a9b2d5d2189c94e9b4cda25be2385f878d11ad628b53f2753009dac0588de2a5f6331b20ba5a8f8a894e85335e610d10ba447d35ba5c2aba36c35dfb9c9b9d2f3cba102198306e9f1c6a5f275419b80740df5d48b521b4c1dca1d93bd506c1b5933c44cdc406aded7b699e313240d83e1390979a11b5e0453dc5c90b95c4a1ec7ae2828f9fb005442cbcb1778a810d87e9f26f8be6b12240ec5f79dd3acffe5d6d8059be06242e5a7d9d2f4271c04ff890af8ed20a734cf3a3ce191376c4a8cb10118b471a688dbef3f6f01a0f6d5f8e973699b9df61a72c51ecd649613c6cfb2e0ecbfbc052d0e2d3ade08745505159bb1e19ec0e17d39ef5ed8f10d4a93a613e6919b1099190f49b6b24683128f0d4fc10dde770380b7a4bd05282b1e7473d235694c4ed0c83d599a0d29eaa2788f4c12ba0b017b1d690a657bf74f769d20b76bbbeaef0889cb8bb7f346e7c0f728765d7d6b23bb2749560e6b1702cf3369efa1cb710fb77b98e002bd053e79957b14f09ab1111c9ae521ab9833518d3357926618cd9a6512e8aa2de0e36b4791295c9fa8039576026e48347db4e6b377de9ff259534fdaa4984837439c2018e46f226c16d838d14756d012dd6d4a0acb577f0ea0e441980515f995d79f83356f9a738a204c9dfcb528457ba452d53ad64afffe6a89f9dde73962b56b029b2925e44fc5642ab029a1b8a49bb64a3b7044c1b7cf16ea8d1e5407f5b73f7bc5fdbfb36700db6ce17e46b8bedfe0124115cf0ebadfd47ea9ea2839d59af4db301d01c1f37b2e74479dfb12d861ae052ec4dfdb9752039fd1a4e129f6277a70af5d60b12772219d135944f94b5a855f0a5cfeddfc1a1bed540ce01650a151cce1ecf250e377e3c4bc78b4cce33a132462469a184de7449952c9397b4811ba139b490b20a6da7d8ca7abef458039759b5a132ec6011e76a92ed94b286b1747f97bd627d62565951e7f16d9e21308dd4f51d2c5ef638aedd54e0daf500588af9d4cdb62f89c9542a639d77119a942386bb256840e7eb71d1d1baf98a0db1f45801b16482b646821dbfdef4548461fadbb4128163d5beb647a1ab9321d363b0af0f30d61e75b2fcd4f61f6a36681647f688a5a0c58aa501cb4763a65a0a8f90612b2fa061bed65a91055856e36c3a66331f375d19e77547165575fdf26829af2974c504cbc19d79d64c11439d48bfde562f5a0fea2fa04d5e346ec08d18771c3814ddf712aecc20d1677315a51cd967bd87fe7a8da88b36f5803167e1a94b1c931d6a792ba8f7562e177970ce3dd37e6c0f4dc886134759ca07d59bbcce629d3fea7d7214115b42f87b30d0c8f70b346d4af728d6744bb401b05e67c7aa0640f704b158a69f3a3bd08131333c3ca05780b9c0d3f133e23433ec653cccfe0642843780bb62b327d61381cea345d700ce57d775ad35d70e0c22d52135e82d90885b67305c3c7692870b11ee4c1ad68c3d3bfca342e8363e55b9ec35f4552c8f4167b76db4635babdce0cef3cce355812f187c3d5f7ddc6e78df354becf871ab8d71a330c52489c41752e092f125daab95ee5fa0ae7fb9c53353dc7c9cdb1e7065e934d1e5b9125ba1560a429ebc7c6d6c1eb7203bdd9a708c7aa57ea5f2a5c7e5a46a56a59d8f7583f1b7ecd02c5069a1d9048387439bee951bd6a78c515dd3cc3196182ffc726"}, + {"0000000000000000000000000000000000000000000000000000000000000429", "0060e3d23bd52aa8bfe2335c5520fb0d70445fb60300790f2dea4511ba30b4b1eb7895b11e0de67b15011b6346bfa3d0d7d71dacc72d33fd6c423d303b3a391e1dd9055da1d1971fcdf4111249dae6b8197b40690eff645e6270221385e7b2ad83f41228ffe09a8f0f1936dd2a940b0dcc98f943b24539387320b53955222823a7b7c75af55522d7b4f5b8357e6e258b581e0828702bdc96cc0458ef5bc8536eff7b0f655e1dc3920494b8fff4c4bd1cdcee25a7b9ff2fdac1abd8b46f169ff2517f550f42c3d851e78ac1c88c953c3587150a539a2553917d734c1ee35af6ebc7dd6ba7ffc96f10fe3b574748d80477093443e250ccf7894a1fcc5409aa763a38cc6a03e799a1843579dbe7616d9cb3cc241fa96c5ace96dd6bcca4ad3a628e72ad37d780c71896cd7d9d903c4d6222d405205438217daccf2327485076a6fbed7349b59ee926b37cc67afa5cde9d0702f369299d5fed8d7086d0dccf3714df41a5bf43ae0a7e05b87195243736ece310d36aa626930075c1890ec64a4b45861021659983ed8c50b47d58fc7b05ba4e54ec290e24f0916b75c687045efddf2088bfd5c10e0021fd0dab63e1610f01a38421ce346d8126cba01b35da12f5cc4d92fc0078acb65844124e36bff2a7244994cb34d14035b73423e1d1b5f78ed4e31cadc533ea8d27c3180dc54c68c3daf32eb60dc1623cc50303e6de169584a34b0c1149a2f977f7576388fb48ed0bad2296aa49b823b26c06b08ce2e186bfa6dcd0a90afe377e2ba4aa7f6adc621b3fa4bdbd5743992b034dcb1283ab274d01930985e2a5bfe60f1f06bb5f3b0640153166de55f3ae1e235af9a2224cdfd30ac5b8133880b1c88b615aaf78d28aabd1374ed67d9efada122034653c4ccaaef88bb50f6dc3310261e57796fe15f253bb170d6c0f9bc9591bbdd3365a4c0bf45808008c027cbdc3832e93dbc591c8c76be99ac435aa1b050d2d0b4b833694b3281a484856f09f43af7b7bd72063fa262a48d9ecce02829696b5ce15d4b09b7d5342bd5f1cec16bc453c1b753cb862606157bf31043c0662c71466c68cf1eb03258c865ba462e2577f18e91b0876d25bf24895d142e5740562b02388f0bcbed1091147071dcaedeac7070610466c8371a6cf7eba2214fc90cf51519ad156f7f4e80d6edbcdbf453baa99077c0e493d88fb18eb5c87a7116e0f6f8846dcb5322158551ea1df5c3dee9852c2eea4e1cde3183d7f43230621ba0c5e38e5346926b62637111214473e9a4433180be3c7d4cb97451165798dfb129610c49c2c730af2fba5ff4d85b6b7c762183af310fc897b15088a38f2c3b1a3358125d53f99e5cf5f405725dafcdc521d3a96f864cda83e9308b97ed667c7bf199f3cbc6c250d56150751df9b860b430ea936fea22d1cfeea61021fe2acdac59a4ccaffe339a7f16a9adfba5ae4d0190a0e49a30fcb1d2d11d56dae49c1724e0eb51c0e0fa30fbbe54730512434f49e864c097e206f9a6816165544d14adbedaf384613160f6dd544ffbbef957d11fc28eda871ddedf48ff714417e61125ed95f9fbc349ffbc7e13a6e2defc8548914b0c6aa83d49531a5220585de42229ca97205c4bf3765993249f35c21973f5fc4e33595d66bf9a15551114f7aad95e738878302226836dfe1dc2566f1d1f079dcff37213ebffe86039adfd74d959bd1a6cd62d68020ace23b92b844061a6db673649464a9fefd224a252e28820a90544ed52dfbf78480cd6dd0aa88e390e3a032fd0f6d2d8c2b0baa11065b12dbe8b58f2380a0d7aa2975e47e8a273445eb6179daa2832a96f40cc0600785be6a7b945315a1b42e5650f896e439e63d9ffdc465de16ff63ca1b343d82fe53c49ad75c3546f7555705bbebf618af"}, + {"0000000000000000000000000000000000000000000000000000000000001274", "0000fea5fed6c72f6bf731cc279d5202341213079200b1c0a6869e1bdda1042210aac25e20e1b69c518a0afdf132be5630b0d30d82db52777462b560bace964d7535a3712fedf99ce787c69750bb0a6a46dca344090551b028e14aabc63a010aeb464e547820d874614234d665019840dcf2bbe8105eff4ca2a7f97b08a0097d4d83c9b60a23f3b2734d5f716ed31343b9a8b51c2c6d0ebe64f687afca442997299fdb59cadf141400fe55d700ddf767cb0098c566e5411ecf9b9d03912d1615dcec14e5c13d31c49ca2c02d6542c7d007bc0b1315bb9e98d2038c0f1807f85621f6c6657be879168ab6490cc5ff8ce607c3e531554ad31af79fdaf307eb04a880a143bdc609d104f567ee86347435e8d00dffb460f5580f154628a449cbb1186669fabecce211724f28ec7c6c75ffc5d5065968ffbe1fef9b6363618eb345a8b05f6d8fc2a760545b3ce2a18f7b343d00f1f22442982094fd1220648f6f1dd19f7a1cf0480bf259ba82d117f5608382395494e3ad44280cb1e50d116d4b078d524a9ee421e88f10767da2f17b4f3d2279c5a48b9ab0dfbd80b4e7dc5018ae966adad2b402b2029565d3dc0103e206d7eddbb089e7a41912ee0b5435e8500b66688c7e239ea7cf347a002e1c5cab1929dc4ce1e849e3bb3681a20a9b2c189490ea3e2b23e442b602e57fb1851463cb87b4aa860c3e5f046d04f34a15b7c2fcfbe57a25697dd3bc02efd83ccdc321b1e7a9fc92ed29fb4782fa83ca59b925c09c7bb40910ba9728c44535242622efb7253405a3e05ee7bc2eb782d959f2508b9d51a3cd854d4de9ba899309bb0b156eea797243d1dc1a71c8d27719bd98bc5436801da4dcec6cc856a7698233ea7e5a748b9def1f94df2d7baeb604d9c9a3c643d7c21370650249891a30275c26f449b89713d31f73d9688c66ceb3e147ffac070084a9662c855f510d90c0e22aa57e266f7f13e89b0093fc810697c4a0ddb8409ba34d153969ab357be204578a72dd1b1f3b733a21366f1c31251ec2dfabe7242f16e978ccb178a7d004a6f852617afc24d9f5de02888e4a181bf41b6698b4d6c252f549c974755baa38f1a2b001a2c0b99db2c6b269fc030283d8999db315dd7c328f5c92bb05dca1c3bafaa4dcfa887766901d0cd15acd0897dbb75ad6dd4d5d2b7e1208d8431704abe3ca1d0798f7a9e5b0c14064522cae85494cd62a8802db6d5e4717711bb453c8395207a6a15df25c236e22b5764bbf76e842d57ac2f8b6f262a133a522325099fd50114c9af0c6fc4397fe38871a6a3e94750f0fc482d40d133993ef532c6b9ba0ca4c53ba6369124f55256d0730377b65661020ba3edd9ad435a63612306c3cfc8de7c2cfa643fddd66d3ad3161ad31da304cf998bfecee8d67ce24698a40c131d964369ddf014660ad302c16dfa2d301041cb6cd3d6ddc7e059f04eb95ebb2d7a323cd8911ad58e07a137df9be150b19ce55fc5f8fadfdfa7d55e077baf39acbc57719f82022fb3816a4a0dfbac878a09affdd06cf25fc2af402fea3fbdc0a809f0765972176c2caa6520938fde81fb0720e805dc1710e7df3323e21f891877653b7601b156922f4e7cc4bc174d60ddc66c3c19e0e1659194e77939e2ce801b7c08046efea613ad9d42d1135b90210a37ac50fab71686bccc7d4e7456f692edda9960c41c170dbed4109f34ad7d16471e64a728fdba29a224f5ac74fde7667ecb3a92c5456422b41d11ea3ff54c937c5225ddb89b8c67d082a7258c7bf49df93de13155ef70f598cfbe9b1c410d0a790767d8f3fb5d51a116e6ec3d626b57e14a7dca9eb0ad6e2a91a1f5c16964dbad29081fc97b8439a3e728b3f11715e4799409a7e1cfe181feccd2099aef5db70eea12abde6e1"}, + {"0000000000000000000000000000000000000000000000000000000000001332", "007185e1818c8290cfe2c282e0964b24e4c0f615070d5ade4dd6ca5cf581cdd24ab6db2772ec4e1a5dca1a0a43d6cd711ad9d2cb674369437032a3b65b921f26788a127c9e6671ca356650cdf63aedad7c71df1811ead21f9f15a99cd7dce34722f9d2b1ceae9648e21e7099b50914601b3154b2c9cafc981e48ff5843eb2596a34547b7148fd3af33547c7eaf99bd770fc3073129ae98b3a8d1f37d0373ee9be1893e9b967e77e901427500d58c23a8a19364ccf96c5de66d57dbaca31d25c1baa3b3b2ffc03bf40098d57525751854c24127db24279c50af98d452c3a9caf4d36a949e5542b13a76e9e5fc9feb75ddd4358bab6111467b0297d5ca0216a07d77594d12f8b685f9455eb7ce13c4721616364c8e0be5621725a93a94ece36ea0d26e999a301c07ea87c92b43053122b09248ebbf72ae5b5bff3d1c3c71721c44afaa07e7cd19fc4af72656f69738f37f07cf67436e9453b6b87a81498ac0959c8d8bfd416b2d5c5e6d46df1d9d063ec934f77dc6aedfa53c0ecc189cf4610c86cbfec6c703381d9fa9132a5f1f816c4b56d2a28d972e99975708477469e48ea685b92332218584c4b7a4177139f07346cb4a66cdb6493de3c531075d7158a32f9b7e5bc504d258748d8d887b5ed92f86466f3b0c2a4f4c7053ec00e5e6b612df52eecc311e55c12c603b1d9ad0f562ffb4f1623ac5d2493f096d8fa3936dae99f756d1f4aeb6eb45d05eb3ae863e6ebe0a2510f85b32f533f254e195cb159cdfcf0129408de9000fb62b5dee364d7234dede1098772be32f473db0629901c1e6e6971440e4ca4b2e1cfae9411454eb1f82ac518b6687e42e1a73bb8ddd7358c2703149ffea1cf311fbc6e823bdcee584296696ed3e651b45768572cbcfe7eef4a29d53bb33463d4cf3f9171f9f054f0ca0e5e9bd59492d25ff2d9fb2d6be4aee036e335e5e52d77bfd4ec834886fa6164283f84cdd098a64fbe048827ab50a51d74812ca79177fd1974e177bfc2de45e203b5b667448e5229bf22f13f23fae389785c8a5b4d005c45326635c44ed7a55de3f79e7076f0b53cd0ee7d99c0c1558c963ccda1de8985f03197d6133a80b72ee868af21ef327a47ff333dfacd109612d4b4026748fd36da5a19853cb1615dd9714830e4b9f024866ecc76b918205ca3fa1f16cd90dc331052bbb516b9cf6173a5034c12c65883d93c9b3b6070b675ed847966d00b5119300e95a9454efdaf0c74b140ef749ffe7748bc3dba29a1dd8bec2c6557d18ff315e19a847a333bd55b1634c25daaa059bf9d147951589f4ef2289176340f4e7375efd8316fad93f8fdf1df699f60a6c654bcaf4c2b9d1eae8f1bab8bdf83015e7dc3bdd9298dab681656f147d3a9724347d79a3505b26346f9f564396239638d73cc4ce3bf955015506225d37d8a278e3dbc57063b14dadecfb92090567099d138d988e86d76b0c147488f266b97eaebd6b9e1be641bd75377b0fc07c2283b71d2d09143e2a3bd848df6ba93621609bf012659e3d74a4bf5abbfc78bf08e7d0b21648e9f4c7acf0bce34c45a1c035d030d811ac01035347c72eb5c1c23da2bf21c15b039763350c0fe787d6f0b8e7d4e84190a3bb5e197097953a651a10523bde57177d5ffb11dd75630269a231900b73089c884c3bcd842f9c09a213eb2784956c2b90ed462086f5f764200929574492a739b7b0b5b5177f176b08a17cb83149ae5ec96632104ede614d4e8f0c37bd13918204dc1e5a5115b144d7a22fe8432cb77f7f0d098feb14fa95b13aeca0891633591fd25248f8e448288b0b35a626740fd65fe6e19c48c04b21aeded8421f3755df945d0769590b5237f4b773e60fb912f34c56364bfb476cd9e184c1678d1a612f8a3dd65b9867"}, + {"0000000000000000000000000000000000000000000000000000000000000044", "00773b47fb113669fc24767d65d5008a5e9b1afc2017283d75319d04d3e51e84d5bdbfece9a03b77217b0b4f31f449e02565b62640bb52df516cf933f0148c1686a0e072661ad7a04aa6beb954af11e6d2f2cebd07cf48a41d70ecfbc868016550c7f2b4de887adaa8143c9685898b15948ce6e21669a19bbcc5b48d2a181ee6eb95ab21239dccd3a4b3e538c1d702fa590320294e23ed656f47cdc9a552bf22da30a5082b19ebf105153946446ed721c6ae619d64d2d51a9201f6604220a98ad3270c58ad5dde373e5ec58191d16211b4d60e9b9f1e16690405ee42e313542ac8ab057c3a8daf187f3dd776cf9b9d1b91b4de19709f49eddbd9bdea05edf73464a76c097d50a161d09524150f66b5b37108df7c531585d102ed57b114048f63ec69692e4416205126981d888be1f18805060ef10abd778e35469041493ea7e259e63f6043c4803768f0531821ba9f540108e6a0c21e347149e19023ef961f359bffd280521d4673c5b20fd0f6b7c902a7b196f0dcae48cf8a9a0db4cd4c7116d99ecfe313e56ff1742f356ebdb9ba3c227b43216894e3f48ab7099555a49e60e47793800614ac5a0b1bb2e1bc23a277985617d986f7ff3acd0e873181543d7885f1e9f131d7be10f9bc3f92d19a30ba13617daa1b65fb4f433847474d45fb4a9c9d75935f67c0d2b21b9393a1fb061f6e4787a1493dadb4024ffbc8834a7dfe7f5812cbdfa7168e9e4e9daa2f0d87c44a2b4f7991e01474a34966aa061235b6db1808cff4c379b812fdf0cff3559ef390e6e625fd845911d0e52a4f560f4d2558087ae57fefca5b46794b1e2363fa374c77c06be73b6259101a9ab2770cbe3f4741a017156979e6c7f3c305e1f6de3bf6d3315774d926df2d16385cfd12ef1d52bf6dbcda4a1ab773c6e64de7f336cceaf52d8639d7e62a7c5eae3727f2af79027f0e9be38512c8767242fc3439b28d3245d8598b1721a795d3d7f9b8cf453c0caaf1887b2ff8fb7da60362734a3bd6e299e5c1c4501b3f143d453ed340c426c3336127a98ec5cf1145b9bf52f90dd2810ffb06156506476e0d239d89bc07884e59fbf26f59b82ecb49984d4423e11ded798255527567d13ae7971f552730ca5b1ab42ed9bfff15e42eccb80c212c084dad7636a912d2f751a361799f44d4f1781e45eb20bda99904ba1832eb030ce3f303a05593ff8c169aedbad9895243d451fdd4b05580877845176f44fe7273f4f0c1193b4747c4d7552d4c47b46cd8b27ce6d257d920fe5fbf4476c1deb9550d03c700d5e942aab8ab1d2939053574f5cc208223dc9ce45816fce2897e7cdf6be7164b90ce13cc4167a5483321db5969dd7fe4b71984355bb1f4a6a146d5da1be62723da6aa6561537f0bd72b6e61249b156e5a973a90830d996430fc6bf2426037750e05db5f949fe8c174d355a286e32377cdf46584825e4165fde157d59a766457d477ac247f6557d14d0bc3218dab1f90fdc71dc40974a54944d51351f2a4f7da360965d879ab06611453db585c4df79137b03cbab6565242e77a311c260cb483a612a85781e104a49ec7326a7d133bd7b057c8c584a7e2b07fa067f32257ae8a1538a8d5a7f74b286fb07664ce1949a8a3370758bf2e25725799e7530c75b73b25ddf152b050396992a2ccc824defe3244065346441d0a8d6f89a0a2e6760ebc6b526ab6f14472cb4f88b55095c324a34d0efdb39ce22b92dc3073cce4485ceb89a5bda3f478b5b7fa695ead0c96498d85f6a0a5a595553d5aa09b2528a5745d947bdff22909955d55d6548d5542e3cf16fe1edad9d7db27fa71b69bfbd92706c7ee47c21dafd6ca7ec494b7f9c328219e73f26654b3f5f4b2509cc7ea0b4751db98b16854f547efe5c53130584"}, + {"00000000000000000000000000000000000000000000000000000000000004f1", "013de39a9540c2646bde41b816df2d89756bdd12fb1519bfa650deee25cbca4277adb58ace40dffc42a608438ea1119ca633e646e631b03936b9ece51732bf2587917048e4aff7846f769794d07b420ee6f52fb905b273ca0989c07bf81780ffdac8aac65e70d93e3846b73662fd535b015b08b67484f6130afb6b3f7d55154167e3de246cab7994c223ba113d09cc723108d918bc7ac36bcc679efa71a2115dcd197b42f7fa7bf401f1a12316127bc19a81442e48b7726d3177924d7f2bd83d32b059d91faa0012de7ffad2918d25d4db461826c786f0cdaf7cc6b0120164bbeaecfd349dc29024a976d76a18bd39e51e84ce8f7d7811f3efb4173103beca35bc76816bf43622bd26ca657133497f88ad4f39fcfbf3aa7edf86c98564414291f5e5e6dfab1d1c7bf5e30ecd784b9548a46bd446b4f534e73088df2d1c951d558cd550a9e4882f89c975ae87635ff501054814a1299fcdd5fca311975dd7dec1583f33c2460e41cd286f5e0b0bc601311b16f51b85370151249c077cea1c064ad9b32c64b53e63dd247b5d7fdc11466e3e1e2ca9f1af7dae9f5a30ef739456b3803aaa410d24591e5e5d0ba3d4cb93023a7e0e0dd2cf52cef6638beef88e5b6887193278889febe82e8850d56d7c2e5a4442ba10ec43bc6e4459775c5342822217ff79380bee68b11043ff0f52979e81770cf2c407b7770707d4d33ff613ed4b02a921150c4eb1f1ba1dbbde0244b6beb6b65561fccace36401a39ed89a344ae28661c57b2737dd1ffeee15234e177f32f970ecffacd6327afec43a84c9a44913296c3a5f55526f37a1aed340ddb79726214ee2784d0f653284fecbea5727865af54f6ad631967f8b78c8d9924d74cecf3378cfeb6ae105e2d80fa464fc3482118fc747f6cf76f74bc8d9f13a87badff596a55a63003deadc214ddf1c0b0b5db013ed70d1e4f7cbd8958234ec5b4016d0d3ab2d3ff1e63dc0e959adcf9903514fbd4726f86c52ebf643610034a52a26c7dc982e9d15ced1163c57f436c1a99195206f353699bf7f26fa3a721e78cbf3c67fe849d0fe0f78a094bd32d2b7041dc547d7f29cc81954e6319969d2c2b0da3919ab4726e53735e2cc468ec92c6163e9697b19ab3e3a33a2455a2cb3ba5a1f35e0c2b174ff6f88a22796dd8c6d236531aa7415b17d0fe40070f1c78f89544f0d849612f87483a11bfd0be8c0028e11418868f7c98fe3f9332adac616d8c743bdb5e10b7d0e0dec7895b661271617e3f2d01e7291c3bdd282283fd88d2e760b5d6d62bbcdb35c5ce5b17261f10bf5707732f8801e6c7814e397ab60f3394be9b933d6ddb6fac591a19394a19365150c0675f5c7ff951122153c0f4a6e44db6c7914e313a7ff5ba7993e22544581e4e4577d847c48e74d4885348795045164b0d04e266031ee2bf41fd7100a3ac724590cafdbe0b5b09d0e331d2363923c02af3d8f3661ad9aeb054f7e30602f4d88173b23fe4024328eb6759bd8813563b8b0b1872ac365333fd4bccf22b29d05255092f9db3b808531050c6249055347a940b65abf39da93afe3e9c0fa53a3fd98bda05f06cb3bdf5a7fff53aab73a3761d716f6059938e4d924fa282e69b3a7614a512c88239bf8f5ffeecd52beda493f570ecce168a99dbcba50af269f326068f774d496684b45688a5ec9c158eed1063a576ef09293128c02aef62db085fb7827f9b5d166d8d8533ce69a13f84c1cd3cefbe610756fc249877482dbddb5e98854221f8929fd11862d7db1d80b60d81f38c150e293ccb9103693da97c3ea2781decd2370653ceb6d11988982f1861ca6b3e96cf0477f0d51e356d9f832f32dba90a06b4935c4691ba74b420f43d2f3bcc20185b17858529f0ccfd110e8494b97cb5"}, + {"00000000000000000000000000000000000000000000000000000000000000d0", "00943c4eeac4ad0d2385d22d71b81ebe437852c94525b1ed45229dfa76fb38d3c5e3736381c00512db880d79a493af91f15b5d0e724b3b18c537401a1df07a399b94f38ca54e1b4e0c57c24dee681ea8f2d7023d00a40a3f340895f5ad8b9097ee0f9f60457f37828f4c5ddef2f4971f630523189312f512da43e732a4dc0a598e11680804927ac5111afc0db6dda838dd0aae11453e94f71714cd2d35931143a8b54ea1c6bab5610441db62264b442ac009b1417810cba534f24be7bb3f77a78f9b2085cf5acdf580e8db4b7b1a651d2eb8154ba6ff6fd6716980a2d15e4634a786f97458202b25a56627139d6ec14af3c6cd28b7fd2a1f8c1856ef055b58c0e8b59411d64592ab1315f20d4f3092b9c60f6fdb00d82a70957be28921ccea88869114de233d06443cdfaba549439af93128c0c1d2bcf5149f4e1f07d2b190bee2073b8edec31711c86c958c68be359b04510438ae27dde3b76e66a6bbbdd4ebbbe7bed65f77d8e5bdcb212db54a69a7af7e55342dee691eeb1a30f795018d93a048d6731368c99c59ba0ace59ad726f5d4da1c39e31fdc590e8b369fe369300ac98a0e90470d67b80d4cd010528742624c02a12c72496d03d05566248b30f7a92b38e817aa8ddb8449bf16507ea0c557ffb0263a39d6184241119e2619217569c89d43c8bb656e0d6cd790148b44781b2dce32fd65a03ad0d1d693d019cebf96dace0ead12ee5ee12395d3d5c1a7a17307c74f2e7ff1e86f461dfa295f2e9d738f71e895c22078e4d1195885821cb5cd89267631a2c8027f1a7f120255d634c8846bef37197e9dfe1feb34c0d717d2e02c7df7194ac73892b5034099dddde1ef130c697c9ffa00893187a33c962c42f81cf909bde472072d3516b8d7e1533db54e363c255897ebc8c44194db3bdc3bfe7cfd3ba84f6b7216146bdf6683d8edb015604c2f584fa43b43c618ca1936456d8f5deb9b712d09f8fefa3d29f655fa255ec17ff2ff47b7fd6cd0670340a82308ae3e7a481a3795376759adcfdbf5e4e46e52e53d9ebdde37a86659f6676e7c56bbf0c7e05822e03850e916ff6e7526035be5150b59b85d795458dc63dbe95a28fb10f086d5ff0b3137f755dae2a0fdeceeffdcc4213498b53035f721129a7714fbab81848696a6927aa81efaa8497f3bd60126e725a08d204657be4138155103456907750507e2e417f751151226674a099e9a391f7117260e737651d54c7d8c14808d43fec8803f8cccd7841b856c8bcc4920d48e5bc15bbfd8b2291fdf6fbd075dd89525c11aa7eef978e0b009d3660c2c77be674f71ec0479e6fbd269f59660cc084f6d14aa6e5065514d18135bf0955a2cfcefb0d7273565309d401d10523016266a5d3576e5ee2f81092f97f17d12c3152ebb1e7526a80615b2c3c06ae038fe7763c196881f523d1be7b901e06d2e7ff2f321b0b32a1771aa7ad36db32a825af1f624febd78cd91b0cc2f2c312fd9b439ef4c2e35e70d972b8743d3c302591fb1b1d79310bdd838260b98106c406585e51075abb9173520757b19f32aa94ef28f16b167ef10f12313a82e160a8eb31dc11371e5d4ee483deee4e861576d1092e688563930c37d8b66202264e361545f91a5c23ee6610b7f5e01813e07ccade756d7e9a0a87069c0b401717380dcb6d28370e6352ab44ef5ee46d495175b71d56660563318a4025715056fec21cc2c41c5955d8bc94b213606b646f994b726995ff953b611e71831e4f53d5f37f8713f6482786998126dd5b9e0b3642322f0bf056e71489e72d63928f56071be79137bb5d817d60285f4376cb1b84ebdb8709ee9e1823137f671b4047a8ed1f0812ff4d4ac6f12a0fb7b42e1b8418e197531640f68796f0bfddf059d4bb167244"}, + {"0000000000000000000000000000000000000000000000000000000000000ad5", "002f9b1e475e6f6321db87753b7399725380ffd1d030922fd167ed9a59f9517484e2fc88a27073f44d0f2145e6dc4d628cc387f3834f4f50cc7ce72b3c6c362f5c14858f1abfb5361026937df29502ad6536a6eb0099007c6b47e28a553665a0e750d00dfe2c7d1f0814288a5d699ec0ab654af1b5d59370775b65bfb0350242ea4a9fd588fac645e087b75cfc11e9e8b91471309c3c2b6450cd61f80c87dfafe51dd2f0c1be4db007c635ff650d21812f3b92df2638e5790cd68b8e8f2cf743684025ff05640993fd08781ff987096ea32d280647dbb8cff692e5eb884df7c6f7cace34f6b9e33daed25d1b68485de0c56492afc009cd3d7f0b0ffa07e94447af869087f903327482b1fa127a323a7ebf0ef75a4190e06a7365ea9238b0b5a5f8ad933243b907fa309638b9388fdce880ef5cdfcbd5de2b11f086135df6e539c8b8e87328230d38f89b957a55ebe88901eb232e221003f72960246fa87b01a148366bb293096e2edbeec527624d2350fc7cd6f7b50d2c4c26961effd55e49abc557ef3945ed494658922bb198b6ef20bd3ffe20748567cd466650d5bcb09a0d81d293e81663c513171613dbf54e228ba6c400d4e28f35b23e52891fbdc136391dc1d1c77fe4e7298e180951a8b31ee4c93428ea1add61a2c454a44c36359529d224ae6ea993aa47a2b5ed57212a75f06fd9b6a1edf9bca50424497104a0b1e1ed98a4e8cd3c2da749ce5bb45f359f9fab8a4db0aedb16281ad5ee3e1edad35d0261089696463e67e68fc8fa52803affb13d734650949733dc369449e7f03d6ad3c402f5760509592a3c0b920b120a05666b4b6f70d60571a8dfd375f559f927f22b35efc6ae5ea5fdd7a7c5852b398c16fcb099f94f0b69cdfce1e1212f862a628b4a25f025fc8438b6c1318f0ff25a6baca9622dc3198f1fec0932f1d8a930006d1db00d89fd452312f22bc250278e2f809a835b11c63c1ed1574880f0fb94508e323776d52c7c7951044d1be9578be013d7e7948846f53a2d42e4dca573065f1582866f89ddedcbb1b3eaaee070e8fd572394009432d8b74ab166a7b1e788dbe51772862f7a7dfc02ea8c87c68b06653e2373518e2763f278ecb5a844114abcfb22959d66bbd262561e18282560016ee1fa16e93be3fe1d26378e93945bfbe1118a13f21be2df04ec472d202f59b7d65bc350cf63f832b4cbddbe070f61fdaffe0ecbcaf708d276c9ca8ae79dcf3fa234154fd8f863a3b9bf5406a8e85cf0e4c66ff51536f637c4d46daa604fc39f8de4e39830b427d2d23eea021ce41ca58454fd6352f873b4037f861d523c2a9d0d4c1dc67120aa71edb956059f1de1a4861de118359b210a66868fe3020d67e9c339dbc1c61a73fb94110f23471e2c47cc99c135cb328ec0be55e12751f41ef700b20277d841532c79596e55b973de639cb9bf8af38196e4da61f73075bce6c8f9466caa96b7d4f8ccf61787915947ec86a77a71c387fc41e60a7b42dcb88f2cfaad144b12a8cba8da6449d83aaec1b5e8b399c2026d7668edab3d19d5112229ed54945a07fbb55f9a13388280dcd42e80dd1884da2bfc60871dc8ff45cb1bb06658d2e707f9ea7c64b15e67315a9966f746d44a47a3415264e57f3cfaa9ddf7d2686b68189b48bc0d409fc727cd66ddca78d3a50c3ec8924ad37f993926470e0c995f0fedc6ad25913d30818d80238d80531090562c15d27a3999dde1d58c95a26610a738ee4d167592f4d9a0ad3f5bb4a3d4999fc15dfc6ef46a14152982ecc90c4dee642cc2ec8f1a98f93342eef6e6561b435df8b08bc3c847256dd2d689a98ab25890783f8abf3e7d60b0a3e585168091e6deea06597724a65d193f01ab2f26a1d009e90469e3fc971eb3de729d"}, + {"0000000000000000000000000000000000000000000000000000000000001506", "005b0ceeeb6de013dab7318c122a19e234c493601e29c2dbcf6f4bd4d4868fe2e951e703a26ec576aa410cb721477fc940bbc704a57ed153630324139d9a621f324dc8114a5325c909a508fbf7541b18a75d657e1043378899e9e481514203baa4ffb806bf30570ee217e9e75e2d6b583f845853b721d74c4e86febb31f51223dfd95bd032817a4b91299c5d3d06dc72d914cf247271a6ae1047056f17b5d1cfbda5739c37de634401e03270b406865555c192d975564291646d9d5fa813e2370f7c72364bd11a96dba4f7c339fdee3d85a80e9a443ee14885598995b848e5597b9b88e83d57dd19627f5b481c2b6af858c41b02eb7a4a3862d3241802493cc3f7d199ab271c83e6342b4a24fad1ad1bc60d621fba25c814bb94e3610887e5046b0805bba111029fa2f47feb6ac7e881d15b4f2979ef9a04dd20b608f67f1bf1427b1545cca7321cff912b04f59f60fa03683b0af025abb161b021436916912e24b8574ffc91a3b6e5af31b577dd7b1c107c7cba4335de7e9d1e2290a5232a1ebb87d26c0afede785b8b1f0f1c148f436592584e9a769b9e91eabe2565965eeb85dec14c045c1b16011b4c379467085a2d7fc12b40d57d0e1004e79bfdec73a5afaa0f51bab6fe51e1946570f22c0620d83bbb0e364f1ee811137c4c0af33f9ffef98c0daca46fa9883cd1f546852fb0744a7a15ef7d342e06b4b5fde7565ff99ae7756671408ab55daef35878419e2e2313d5fed342bb043daa3f41e30b047e18710c6534fba79a12bbed3b820b6c3801549bb31a744a105e1d93fa5d1001219a5a1fb75ddd6acdc93f78de0ab97d6a6e4345a8b58f524157cceb3ced0199e69b23cd9cb797d5ea01da3aa7ce33689376b5ce57f68a10899b132b3bc72de7a3a8f7805b0892f2df599f7926a01b0227534ac1ba5362f1189c49aec2575bbeb2013880d204c82c38eb495174d43a2f15c8d1dc34e638c4eb9564559c476e29a414e2eda161f86f93dada0150ebf60d2252edfbbce0bf22d2fdfe2ac3d912a41007f95e4c9be0df7895720e6372360161b63ffc7508a3c5ff2a92e4756a9af2aff166f151a430df695f361184c7a98f0f15da9324cea3db906e97565ca1530b0c69bb4a9576a367e970b672deea16648156ecde17ad62ea1a470423dbbfa22535ed1ff09fc0384c99031fd2825cb1279198db125629ec3ff5f7a55845356533f5cd19b4e6c3f12927d744d167fe5726bfef7d117c16f05d61d9816572e2e8d4ae90f98243add2ac4ebc3b9a975534571fe5f5a6ede5ea8a1b713df7ab181c324c6b1b2f531c8c92fe192226b5bc95b0e7091d6d7e6fa3a3cf79b7baf2c4bdfbbb498a7ef875f32478fbc4892dadf3f1bf4909494cd7272b227c72fd653e2768cd1af301205b0731505f3ebe13431ac82207374727bbad295fe3986560af4684ce4e0b3c29a80bc02f8f635eca771576f55d5dac779dad0f5bd0521671c497cfeba1b36e80d1ea19dbc321d6f79c4a0a1811ec618ea977f35a9c2424ba4224eac9be1aeea809c0549624d447f90a3f40b96ad67bd09d3b320cd50f3fb219f36968977d87771b9d4fc98a928fb588c1105dde2e31d4af25bb18c3fc0436f5a661cd3a3b2c852c658398a5393bb7f568e33c71cba2f7231a31fa0ba510b7add98acb9dc7a13034f522adf9e1baf5ac3a7ece90314ed7e7493548498c42ab1645717ace7512ddd1b8b83695a5c1c0b17694224a766945ba5c0e41998dc21ab0cc1bb44a37e6477c03eaab0a9fd5d416bb5b921f0d5c8e9994437e827278911f087e0dc46621d7938d62ab4bd3db388fb6646bf2f81c7df38b2b747fe2d5f22c43aa3cc4544df641e934747256562ddd83b30ae40007b08a2365531d012ae8fbbddaec"}, + {"0000000000000000000000000000000000000000000000000000000000000064", "018d219242e7ff85dbe5c36843f9de75ff65516f0c27477d768f234c337ff1abfe1ae30fa30f3ed9ae102b2c237f56535bc1aebf46a20d3b3b05c5007518883a2574fe29942c1edd78972829fe44360db67bd0c702e20707e7063d25555283ab8b30b065454afec5451734e9734311dca8e993c5cb784ff0398bb4ad0d8d1adc72efc93467a5ed4552e2de471775c493534b1e1cbc4ad3d852df779c47c7faafe5553f411e7fdb800422e6539e5d979903322608ac6afe41d9013d4fd813a82b970148fb36ac5532d2572ae2ddacc391e57b0ccd22362a18652d47a1b34024e84aca10db5ac2461203293a87873386accae16a08dadf2080121e84a70a2b015f8d1fca4d7e3b61e090cf7f2cbd207549f2152711c6cbcdd7a8b13fe9c6646e4b12726759eacf17f4933a140bc60ffc69c3a5d451694552831f7ed41997ff8dceca138caa1de347143370ca3778920b0f03b36e2b3c0ad9c78b98a295a5787a557310902bd9274404219a97c60f22b495745cd6594dad4b58ec40156edefdde572b596bff8344953231e544a7bbf92721a9ab28b2e5463de747a284aa3460d8bc541121c804bf6f0bc71b99d93b2c02d68ffa7bcf99fd1f9a501e6cb402ac4fab39fdfbbc86a26bc65f56c89b264c095581bb52a540cbbebda1267de6d2907bc736dd281bb78f0b0ea3fa47ddf498f65b4877ee7010f38cd30650afc449b2900ffaf282656f26246cab5ae87d2610cf6bbe48982ab9771d93bba6bd307e788a5c169c07332ccc92ed0ead9ca1c539a565ead6575c32c4095bf9a491d3aaa509c456f5c953e9fd7e35859c9cc20ce7b6ce3fab2149707631e8e3956fa8a29dc57d533930148f431b9a45ddea87341556fd0a9f221834c925fd93370b2324932da723cb1a3e4cee1f607a8c2e3febdad32667b6634c8e3b2af56935bb2b21ff2302018d332ab59acf657e16220f7ac7fceab9fbfdf91e06b0a7a9ce4847c8fe22f0fd0b3d7d8954b1ab8e131889a6f37d8aaaeb8d9083f554fc41056da7179119564cb73c10d881096cb5a6de633d059dceed95fbfd0ae66250aecf9f6ac06f64e4ce2d152555238ff8100cf6ba6be32d4841faff4922f07dec1e5dc61dd48312ef3184421c8d854458a64f11d3a02277f61e04d7294c356b661ec9cf857a541a2524ffa9ca331794f703acb2b58ad25fcaa28eb1702572ec3635427b993a1a4daabcdad88969efa951e7d9be532f18fe19b79e0e4905674a909323eaa2a1f6232b9f4d86c7d9057b1f04852c782ac3d9eb0b33cc6566f4997f4cfb784a060710bc186860d5a00134e2207997fba2851f23c01de03ff31ece77e09660a35718fe9ac189105898b510a65f422f09f84b9274662b81b4a3d1b8ef7699b2533e7f119f6a43596806279cb14c4756cca577af3c03a72e7ba86915c9fb84f140c2fa2b7dee8ff4f5eb47099f80645b3470fe9d95172b3c7116e9ca5f59e809134f04e3613d5b3ec5e39033a73932bdc879838b40e0436c40f040c5c06cc43ce62386893363fa91160ba6826233cfd332b8598889b9526ba63c575431ab4b020cc2a25339414ed674bfccdebdd5e245fb43810fb1f69c17a8b6c1bbf4b1ce116c915d8cd71c536414a0a1b8840c9239249e54a321d7642593b67b48da0c89728cdb49691b8dbfb1cdca4cfaad76477650a42ab81b0ea197109ae44e33a415c3809e84c9b51e9f1047a5fc0be03c15201185898f55a3072c34bc01c92270698a124924ac632413e07ba2e6fa0aaf15db1019c317c138e89c1bc2ea46c59eed16b22c6fd9a1215560f50f4621593544a057d50de7afaa7165d3d37e51986b2afb22046b4c6656a7f0c0ab93ac9cff877259327fc860997f95fc6d98d38a6fce270d0e1f886e"}, + {"0000000000000000000000000000000000000000000000000000000000000f1d", "01062ede308a524f99e010cca87a186c810ccdb6de3a45a7e84ba5223f544005d93265e8e711ff3c691a0f280dff2d4e28509021c258ecb5ea0cb37baea0cc11ff1278daa52fc57e796226f7fdba715f8a3c6fdb02c5c6d08f4ebaa317c9e8fe8fef9646cf63382934454d5dd36356c19b245e07fbf34d39ae523ab69c6505702dae820e3b2358b4b4346fbb36a202e61d54e936a05714fe8e147f2549d5254a7a912e0d127f254a06fb78421c6291854ab9a0882ed6c86075e4f1006547a5ef87066bcc81d457c6f78df49d8a99ce96f67e2206ec2ae7e581374118d41f11efbb4afc16bdbfeb3aff2e67cf1ef7edb7b0c589883d8beee27539b985071d2e7f6e24b5a9e20412e888d40a00c08c19a37e31289e1b1d5537eddcd6b35b4c9b295b67f43ee0c41395ccff466c02e7781f11c7d64942d542195f630a2c5e02ed6fa4f4d19223f592fbb73402033e1fe7700274e4de8cde7287cabc80a88633ddf059d1f72ebd14e54b19798e668f60f4e428c4b4ccf2649d142a800526c251f11622c93f02b422dcb39f1d7678b4218014b7e6624d552f23896412f992c08e7605fdd7f498059450da4414896d452111bc2b3b6fa08769bb1d9b075f1d3bfbc24a24cd67a5f6f9db41a5e1cbb597e60eca9795ec4a896192e03d1663f17b637589fc3f6c17b5ac925bde5077f9739433875937f22b6452a76303c6cfaa981212614b6862838ad27b9f1d239abb34255301a8a1639c455e0a62cbc9dbfd1948308cae8f08f53a7cf602c4e5698877618c697112f9181bbcd81e81d9b10559eb91d247c35331724b5f29659ec4b312f1951a41d0c6577c1f64a71c779b55bd743056f85d733cdc155b08fb51a2aaef4372cfd2fa8d9e3f6d27237f55c956fce5486d7511fbe9f05edcdf9920894d60d5087a150f5dce5f84f43a2be68a5af59be27f01460a5f234408f3533461f404be17a18d90cc816450bb234c3c27ac3da24667b521c1dd576cdcfc395005a3bbdce78c4b13c5dd60d7c1e0e52d1316ce849259fe4d8cbdd71ed512449726d94d2641fbb3be3c550b41bf00ffe43ca34756622e4d9389c50a9bd075ba15eac9e83d46f354c9e672e0656c10be01685480bd2d8815c3e822a8c58c26ca539ae13d52e9857d00a07e98b5eff170736bcd7c3a4649d611e70feedeb7090179633f1ec1a512cf64a0a78dc973dad26ffa0f7c115325e3b0d172dbecd416fd4868004a23e7f884ca05542751e92d8227d5a6f3d9766798357e0d57138b186f71023da9d48dd8b90456d2e16241ae482dc52907c9eabbf2b2a6c9a4b74217e3beb8819390f8eb0e0ff6b9802964161fc3df235a03cacabab48affb18e1f52ea2c2cd8455959b8527dc3d01150b446da4e6a3b675a5feb6e4c45db2d2561c1e13dc1a92734c59f014cf2d6df88c8ef01a158081b74559efea75ca36b0443d48f8677a111c56b428f95dfc0ef1c377c428c06005d919f8f1ae73e9333f00a5d78c0fd1bd21d551ba9f8edca1c65ecf4db42016a46a76aeae5589169067934f8e6ddcd5743ae511812a587eb787ddd4e990e4878c172d915e14d3e00ea2b6b0f84875325b59c0ce250d2228acbaf98aaf0f28d1e766d1db10d22d7524dd483ef9ecb56ffbdb5ac37d29a1a5f3c9bea7901790819ac081b75af635344de53bfa9ac2ad8b11f086e4dc55ce2acb7e77132a0b37b6368c6345fa4cb05eba750cc979445848bd1ce341e70099f72d547f2299129eb20214cd50c94448a90b5d781a08a1d95c3074903823cd2889b6d02918d8a7eaa4e38157ae5232a0945b4731676dd7071164f22d5785eee03be1f7e17a4fa7db5d7313ba95b76b31cf237d2f9285d53301fb509213c0bac2f689842be6e56467ddde63e6913"}, + {"0000000000000000000000000000000000000000000000000000000000000553", "01df4850a61bb8118ce085d5b460c325bd235ce61a03205a69df444078db903655dad5f426947a9eef4704f53ad89bd182c507fde233904fb87962a50c9c753bdfe4debc1a59db9b8f143b3fa25f9dc905509a6f04267f02aa480acb2707ec28bde70cc3178c19731a27cca7a1a3cc59837b33d86e9175268a76fdf9e6891697b1d6fbc8f857ce381286ae24f447871c1dfc2220c091757468a695518fc5894871de917b0e7333640688c585039afaaadebc26d9ba702239cedd18db3f07b14e94d0a85d4d8995236ecc1eee0ed8ed9b64b20cbaad4399317b9db5b485feda571715881eb865cf358923e0480feb7f38e34ceefeffcd2770f0fea9e9099a63104a8e4b3dfcf3d793aa4a4986412333f8f90c36a3e13984d4fe702b26efcdee68e26544dafe5720334e0afaa2602db3fca47aa3c5c67e70ce36308622434a827915ae5abdaef765c87f6bee220013c87d084b28435bd22e7d8a5094175bc66651beda7c4e743707630a86ff03c7fb0e33839548d89101b3d03fb12dad82002896c2e8e44ac7c01d7ef616afe15aada83bbae27c42a26d51d0f9172011e293d5f3ce3532d41e183a0f7d5a2a4fe4e4235313b73be6d2a637be1120417a2280e8031df8eae6f0304b3693d22abf727928f83d935ecfd926c197b86cb8ff092eb5d576ccb731f08fe4b9ac93cfc671b45d94f57ae143d21bb6bb0dcb82d38717d82ff98728ce6a52cb8ee5d45d7b994ac70a64819fd9c343f2b6e69376d48211d6d2e81b1a9a2e5f935b655f2d653596ecd33c55d1e699222f3c173cc08fdede79b2a875b63e6126aab50b1d91eb11b7173dce4ba5f7212ce968eff9fad74516de15f02f2abaf9d32324d5e86219a2bff571b67b8693f77f1ffb62e626d1f62f7b0a66ccb2d33f21f6b5b0b93c4320d725bf72faaf98c44447b74041858cc599b09f03f7a798f447663d185954a27e5c5499f8589d5b4b16394427718d01091564b50aee559f2a1cb2def32a0d005b9a6903953530367cdc1aea11ef4b055b7f6b0f52f0db0e1e8ba56f8303258f221da2e91efca73e15368ac0e3c640bf28e2127374b3dd915a00ccd1431634b24ccf09be8a905874c1b94c9532f04cd7e9e12b91d1f0f20dcab5b23bd7694bc6b7f1ff363a4c6f4384543b2ea776c3bda2553816d520223de9da76040c8dee8d87e75d4bcbae929545ef08ccc16ef060050cae0b4f85affa6fc3e4a1e5bcb776949f979f3e0f1caaf6d35d91b139b1025991fc66dd32bfe69d60cc4ed8bb7ae815b64cbfc5557643499691ca489c7d28132a4a3470095ee1d026b19571eef439104febd0612005762a0eed1f19e34af2c07627c391f8a53ff8f51726a35be3073353935239beb6665b32952d55097a369244edeeaf266f9b5535da626f315e3d9b92547104ae62c7f18fc2d50606e15cbc724ae63724df884606a525e47e994bd4f0cf322cbbb28d3df17ef2455e0ec70fca599c040af378c44e8453be2203e39877c3165e330575071f299a2d527c762b1a1de5745f97cd08bd0320891f6995b516d1f6237a9d1e59a017c78f1dde51d8e08f3edccee925f2693a86aee7ce7d280d157d32965c226bf7efe8b2c75a4413366e5ab6be012bd17f9a52d3fd936671a5774eb6011170443d3a4e050e76457b464e1d94a0153d606fa75a2d51bb582023b905fca71183ed58165769d66101de24f13d5028191788e9711129a9a0b04bc991f9ba1f25249e252126d4c16df69313eed9c303a9ab7b62222ff6f71e940b4121fcbf61bd5d907ed49afd444095cdd65f6a1912ce39125404cab37c3774814532b986fc319dce710ead0d78df2706e572c6436617fb1e2d9051b676bf11b057e725148b47194b9798555faba733c7bfab71"}, + {"000000000000000000000000000000000000000000000000000000000000249a", "0033d4cfdad02b8deebc69050a4ffe064312de17e5058daf47655dc89b76ab74c028ab9ddd51299627270161875e140129f01f5cb32966f08521686f6fe56f4012135bee9358b12c1b26f0d2e5194ad52f5e488f0207724bb68a5bdc745983b7d7f55c4a0f9fdfd245104a1a315e5f23bb8bf595e0386b76f24db5fbd8f907f107b518c50debdb02f1add2b53f09346b96999509cfb0db8663d18d9b18d1717529ba20df65cd4c5d015a1c18d89d81391c515506c7440219fda458bb4108c580b11f2636a79f5163f87e512cb6eb8f17e47104048c72bf227bcf66f831523873d752042bd4178e19e6abd7bdcee2e9bd3a524640a9ed589221792764038d7be55d86eeaf7412038a51e05120fab79d97341522b72a4eafb83197129a089c5aaa12ba9ddb2def28cca24803bbc3edf45f46548bd03a2dc343ce83ec2cb8bf2008910095c26be6cfaffe3beadc3d5b542d00c4c8f77884a03d3acdc185ae207ced056f3689e903edbe62d20461c518da420cfbd1d07d72c8b907a00506f2ca668e2b6510b4514f1552ef809bcccdb3c23af494ce5a1bfc5596456421f87549aa785c3843db09dd443fdd94c1a566b32235fc684fca8fadf5d94e12f0c15fc09415aae29953ef3b722405bb3d5f96a541c8829623a5eed72f8ef4d0edb21acdbee6519c7145e1c41e455a0dceef693a1c1ee36ee6ec365e6c69059ecd8f9852aa7b757a50b55128ee60b4de7758093338844cad0d41bd36285468a4e0d233005a5c4b980889cb92dc9ff87b72796223da148c88a1f8edd89634f87fcad726f0e7ec6e16927efd9f8b53bd5d3f0a09cff7358307045862d231dc6e8f183668a0139dee1b10d77706a4522fc514f41c0d36b4cdb0316da922189a8192faf856abfb47b22d5c2f015689ba9d34416439cc0c339da37bd9f96d04f7f06993af471f3e0f01e0e8c9770b0658940f028eb7c48d7108b47edced177f6b8692ec422b6e1e0581432e7439f1f7394b26138a5c0e145fbe55f233d343de358e51ec6516de68250721db4acd1108da4a5464fd37f6bd57876bcb6d09003e5f10182b0f63fea20949a95756fd3ff83c6b2105570709c98b8a501e283fe8daa61eb6ff39f727106686fc5a05445e9b1a92976a216744fc8911d57f3cd655764fcf3b7a919c2a04cc7e0b7f72f27cb9e30292766f752039234f3132755f4543aa67c0d7bce429120a0b82def9cd7f71d4316a36877e7e53b4697c0375587238d8976926d7834c0d7ad81dfe5890626e09f0827ef4888eb45c86320e6b5a0c7e708e7e6288101ddb18f51ae51f4d25447806ee981ab1555a55c25d5fbee802adf249bc6f1723414a709a60c517ff411729b2034208ec3877be651534c19de163cc6e1a662326c536cd8a06dee8a984b1b76e3e8643d1fd8cda05f4b0d681eae78b977e55d77fedc2d18b52f5ec06165967e5204d9ab50f29c6a86a5bfe5ef5ae1c5ee30fc1e4dc174b604b59b5a22eee502fa1dd9c3e012763eb3f7fa5f1bde5e35ef8ef2ec80132bb659bf70e12ccc611ab1ac4aeea8485d20e7a09bb52aa3ea7e22e5a097c7e6f366fff5393c8ef2298d5965af45efb35f1d2be61626175a4a8c3f84c6f50b6044adbe3533e31c79baed3e515743844996fad41493f0dfefd94081bb55805e433e7e27be5a03fe8934df457fcf7b71c434f052a4890f395fe12dc10f857bba8cb1e3c5e1d52aec63ad06541f9f1b200b1f862a0b7a6fd144f374ea6b92a1d3d99bd7f06ed5bbd44b7afc69f614709c15b2a57615cbd35bad1ff96a0a8c96db812f28317b64cc4f198e19f8140c2ccc36150c0d2ee18392a29b0b37ea4cb0b26d60bc38b18ce32a8e6cb9e5db635c6ad903b4e4e5328e7c36c174672d14392ff00c2"}, + {"00000000000000000000000000000000000000000000000000000000000007de", "0006952d60d34eede8cf8204bb4d33364d3bda07650e399f130333af2fcf116389c01e1f0a8ded759e2b16a38fac874a04667ede58ba457b19dee41cdffbf4200f33d76b08c43d55dd972e5639f8ca61f35470ef0b6bdcd62e02f63bec3591b92afd00e9721ed3ff2a636aeb697a34762df48cf6c73254a032d4b51d83f126faae7f96e56ee1a00c976eaec5a69ee43c5df38d3774863bd9d6aa79d89373cc2020c9222c4b9218e70299307cc86ba995d2f8923da09ef2309bde2fcb1219ee64534c8ffe594a3432dd857cd890ea6adbdc50168603571f1a0e075be01306349c9bf19ea53ea0872450476bdad53c6be816f5d200e37d06082a715c840954656984a49567c34d4293a0156ec0c9b2f6dc5f1c6d87ba359ffba56f86b33a15a82e29459df4499b2d9719a163940cd7433535d85cbeecd5af6797a46836b322f511673dc19718a6f87bf96fb668c9346dc7016ad61ea54f237b627a0045e48d41a32390bc3ef10d9a2e29a1cddd0cc15e33695c509fbce0fc9116cc23052a373f0b6de384e4570d6b7b5812d188f82cec4394f27a84dbc09d5401575eaa7ad1aaa210becc24059107ef05d84ef3e074826749454ee2654e1ce73d1f96a7dde9b65b8bda1076b0805e74df55b1fe8a6a063e5a3ef99f9ea93e1e85b32cb5bd9aaa4357178546cdcb87fdaab0539820b7deaae845227009dba6e606160ce58fd45b755895d0dfa3f564a9f893bc15064d2c0d53fd9e0b4d9d5cc6ee3f7345e35185ff69d207b404ea2c61f2ed2c94e533c15b3aa1ddb3bcb4840d22e0fd1d26d91f3d2813b6cbc4d261dab6fcd59923a24d93b2768917cd4a34b601e40dbd47423581a8608aefeedc5877a961df86cebc705fa272c63672a92e210aa5fa639151e20a452b685792724b5f349e643d8e7447b35720550479c42a3fe1d1ba174a7c8277012efcacbb95e79ef606559786530bae7fde5ca9cc058d02de074851465c18719b2e4f6224e24d492a1f13db533cf58c7768e3d801422e9250de968e9fa09733930c53026ffe35a987e94a2edbcba6a5241bead20c48db6edbcc93bb7579b61ddbb14a0a6ef8fdbc8f19f068e6d4e0a93f76bbe76643660355e1e1d97d0d128baad86f32685d9f339271b06f4fb8ac8c9637c9148cfd168f60ee89754bb4568b4b80121878db39e8091baa5e62913147eb161327c765cefdb269bbf7b30a6871826c8dc686db94f377c9f5ae355aa777508115a894cad507ce7edb9672ca0f33196142eb6ee87967551667265db8a55a2ee7a1f170b2520831976ff71450852254c72e99ef92d14a78386e119e7b5d891c25132acd8ccc21d31a55b3d248a938a209af9eafa31c8a5d7bd397d3d5b7bc32744f5c1b58d270dc524d257216c34e19b36996681b81b65e2fdfb75a5f581602470dc97b82599574ee40e8116e9959fc1036cb281f2491bff754b8f17cf2d37a0fd0ffe3ee3cdff18902eb047fe91183e9459b83d181cb8479b9f29caecc2f860f2d60e67165e37c2623f4eedbcace8e16752a0c7fd8f5b70a78e466bb65fedd67325e2305be96f434ba8b969f508d40c073b82b64e03ca219e39903c211c834f3fd123c15f9cd5667f3dfdb8a9fd65e131c2875b1e8aadee5dd580bc2b584b5ba35c3461004bf0365f06b626e9e17b0fa022781eb4676c673fc582d1a034f65999589b591f2386993cc3d2e2888d1bff1108576fd6271a59fe54c220eeb77389d116379b8e2157878ef5a5e618f697fc6353d41e96aac4d1e45ad12264f4d10a67ad3c06bf23840761dd498228764261941679f28493d619bd671b6ffe20a0d85c3db39ab40b57a7df6a7ff71ea96d5b4f4d826730c4c3ce2084a5b1ed07ed2b4495d01466706fcb2a6406472523b"}, + {"000000000000000000000000000000000000000000000000000000000000095c", "01369a38b74c4ce5fbfee0c4ec36b800a484f9d1a20f00c52f568aea7a7d0622a58b4c30ea70257de7fc0f924d8cde1a770578bfe54839c2d56e8efddf1fb42023d9fcbf94a743b478133a4459c29248963294610aee346c13a4c0e9e96ce0fd524aedd8ec233c131f1a5a89b4288ef4ef92a986c76164c809bca21c3ffb12e55290210f037d2b58e4b08f5a752ec5c0df0cbd1e3e6984920d4e71175271ed8fb3e76d079b8b8bd5024bcdc6f9d2e33f6f27073ddb4dce8fb1757eeb1644827441e7dd6941b1a7fc10c1ecdce742c77f5ea30c26ccd227469b0f2a7a5567ddbde51f2342fbf12686a6f7b1cde21f433a27fa8f4c7ada9ac2d6393e880a0f079eae83af9732c9c5000f7adf05725313ad4523ca72650967a2b5cf36b31614cda5ca0f487e3fdb0b422fbd3fcad185d683d220d9e2f22f6d331d320e10babc0ba6e389dd34bd546378cf0f59f9759702e6018876855d2c4d79f3f8615064b5dc753ce2d3e91712bd7426d18adc01777676b64bd287ff20f91ba0f90ce3bb5d84d4cc0add0531f250f78214a0f8f29a1018bb1c74c3485f27c5a244bc7130b925a883744f530e65e963bcc9b44aa9ea8249456cf1b6c9dbb8c62d13db12b4a60566177299235483f52dd1da1bb69b0814754639000fa14116fda6801abce09da67cb875ae1bcff504aa1efb65c12b15f646619cc655c99649d503f68426361abd1d645f73b278b11642062d19fcdd1e2a8e6a103b218fe88dc23e7e70e751a88cde78ee27ddce4588583ccb1f66828bc29ace3d8f98d6f5e83a17f57b5ae81e45fc2937f7fff414cbb1aa7dcbfa06389e4cef98d4aee59a32e1e8fd2299d37cbc6a52089e5684b8cf1d118c6d65cf513fa1bbc2153eaa0b0d3842297e12d027968724884d448ecde73b7f74e65ef8efe0ebdd410b2542b692e5ca07bef4cd1f6a170292cd704c145c4123e240bf14f1751b817d3d299c13a19c4ff00d0c99ad4102283afc0468d3e88983c912c746b86650ecedba45aa1ea5e50ac2a18a9f397336e1361dfeec95c5a72d65ed7afbb2aa3b86b5f79b058a8fb20e4919085cf4e3d5ceb10f328c507600c452060b350960a3c33fefe6d627e36de2af7bb77dac24b20955a45413fbe5b654f96b79241ee4683ba5c03a268c429ee3d373fa8453f974b270790dda35bf070301d7db36c24e45e1f5d1198b532e130676f8b5b70c125df2336e207dc97c63ad0c3a76fe63c27828ec0b03ac952eb1e5d390e734fe6ecdf9fa99ce1e06630db1694af1237c472e97c3e3575aef84fa2598857b0afe7a997aad4adba8fc04460f239c5253a398d5951811cbde2254e3f6d98f371469d2f9833a5e1f4a110b6e3d16a0073cbfd86ff1d160ca9ed170e2dd71c629b51460f35e0509c405985715d9eaf71b4719d0ed03e4b5e0334881ea929097836ed1ccd66dc1dc1d264367a281391dd5699ecd47fe1dcaae2248713813db145cbe7e0dd26da3da3c52554fa3033901d6af089a29f03ef5f469271d4f4c562a75748bc9f04fdf04390e3edf8f7862982bcfd31b0b02590786c816b7928a377737511ca16ef361f1fa0c14628c675082dd67ab1ef2011f4f6abbf399df640c237fdf92a097fef2a825e93f7aca5491d6fe7be3547f1e3a6a63c21c1058041422894fb49089b5a634c5eef8075229cb71e9220a4b9c4adc8fc559e1142c43a77ddfd3c6e99ee7d637b762e9a2d7ca09cee578d5b8e74bfe42c53f3ed13c2f9ac1e51c9ab516edc4c236bb8f2adbbafc12a709df1295e98c72bf09fa12452a215f3d31ebf7608a2944cf585f536037f735d805c3c2979676b55f975e135a7c163d8b9c73b79dc23703ef178d87a4b1915815c50599327ce019fd6eb732f7bcbea632725574e3"}, + {"000000000000000000000000000000000000000000000000000000000000029c", "007c7cd7d3abd28fdc79b08d46b42a88b91c3ba9bd01243a458c0e28ef96b4ce0a47fe597fdf155f50910d02d469ab1179d5afb732627ed317f69616fd23710efb551a0386f627f5a8117e3ec617909dc59019bd068e37a4a99a1a692feac7b60abe1c42127f5cf3616d9a6ba2b0df6b0dfabae8ee58efa8cec682feca8415b87dc98f9df0c7a89fe54e30b617097726cf1ead1c62c35112cceb597fb317942e41db46f038dbfcf10fe7d7fe394b0f71cea7173d8f7d025a08ed37566b22270439aaf634f5e974a280cff8bfeecca8bdb2c013d08325e8469b5e4dcde36eb6eae36673dc93c13b1c5b0a4e061b9781b98e8689e739ba2dddd7b17f1e11b8c14c9923f01b342e735ad5b09349c31a7d261b3e9c656fec35dcdbf79e0423315d457e3c8eb9630f17840198244992b3de8d975e9e5f386ef44a99b0ac204f354b60aa30b56c53f2840595ac0ede571735c900f5ebce1303b686b4bf10cb1f7c70bc60b67654f507244c0b544bb263e38fc1ecf23ad3fe8763fcc72519e6f922019145a154c051ef90b0dbb0a106bc3f676590a3c9c1e0182f5a7806ae65bc91be36043391b4056a6a689ae01e91cccd5545b7c6393deb3fff0a0706502a0a7282c57b213e20cdc408765d755aba9ca60d678a01ae26c3c99e62f2ea2ab2e892406379c74b1e38b37316e0fefb85c4c3ce71ab6222761adbf2c20132cd561519200d56beb54292d92407b3b81e0a9c0a49e33cbd6701338497032fd12b878a3810971a45047f2b6ef7d47646c4f0a9d216564caf69ef1dc91c3b7cf778006b8d9fb0b4b79480d21b66d23a5c491a153336008adaaa79d7b7121362c1e4150032bb38ce15eb4274538e4eb4a716535fe0f862cd38219611e417d41a7db40c62aa95552236cc3695510fc248e6821d6a5cf056f3a149b1ed33e43152546d5ebb3810f2008bdd28d49dda4b05de709120ad0b0c37b50b4b764a033fdb745a2b496c017d60e5eeb3736cebbf3d710620e48f51aaad7fbda4509610949c38f6c29a494a2737a7a6af31d0e1bb78aa0213ed1c0ab2d7f762a50a3a34a83196de351ac5f6059d717ecb3eab3f94971c433b6f8ad6a52b5eb8588710d831a3a2bebd355b186435235b9b00897356a211984582ae590a93556e3af88283b59fedd5a2e005e35de087d2e68ebb8f2a038050cc61a11cefe1a194b49d25b52f33bd5acb8525940d1f905b435951336b672c71afb319e4bfd38a0d03ab4a261387fbd54bf431c2b4061d1893b460bd16fe9661ea0fe0d8b0e56285ae413370ac3dd0578c0aa35c845e095f94f97c24390f389b358fbefb01102d5e89a8811e999b0a77d7edb976d3ee8f3a5d0bca265ecba10d903ba38746d466beb0d3228e8d94e9fd2c30b6964f780f53f2837612885aa5a9fbe09b674d01bc610d9c0424ccf0df1617caf23c69bf9c3350a802fbe3d21fc1d5a93178d3b9fc2f7fedac795003d522a8a4a99cd7c81f229f849d6769b8de77cfd988476188ce72f62c1057a952d68d724874ca550b3b9bb10e790da6d3065445e98252dbcc5ab32cf5702e09681354c0b76068c9db8b18131127b58530d13156a4af4d7d2f7c4029aa69f6514767687d5e9e430d5d7a624e833781bb9819752277f529314f26499f38918baf054b34810637ad8dfe7831c0673d70458aa85e759b2d4f855cbd5a5041d3dbe56a88e085559b95bbc49e0656d8a56e9a2211e2d7227875759b8ea93abab5161144221edfd425dd5361d33044479fce4bbcd5f4130617e8ac53c9d9af4f02c27be9e8643207b2508844445b9aea41942111ddad85330c6940b598bbfa1061084ea74e60c27e74aa3451c626be7f87072d1b7be809882c5b684a50ceba58e1c2a03321bf26697f833f"}, + {"0000000000000000000000000000000000000000000000000000000000001357", "000617afffd9dce5be88e024370bab7ece4e5dbb9628ed3a3297d060afbf57737e3d61d52e3f321401a402991d8b79839e882d70403994a933b5960352d8df078ec9d2e111b776ecc374c68bd32871f9b1b0f10000c883e027c2dd28bea3945d894099c559fc37524634349d1c21a8114ba800643f19b50cbf6da0bd8b3218bd845b21fa442dec5dc32cf124d45203ab7d6b751a478536505582e976824450e025d4794684386d810a256ee7828553b93d38a55701cca4ae79f395c18327251ab984169001b70d333600741bb2997abfefbb3c37849daf9fc32bbab769c7a8d672828d75d7289c45a5867537195c6f230f968d4cb4857287e4761a900a346e0ca0a27927c60fa383de67af08efed4eee302025c543df9f98c1da90562addddc4d24d063736bc2f2f86ea30746b1bb808a3c469f229b569f811f1b5401b8de74b704bafbce494711758a68d4d4a9a629d02670a19e03a6c8df96760c6ed2ba94c7a193cd971217f75ccfb4a59468aefc4cd4be071913d214ca72c035ee4b8ba92f4d2b51762b9986364c60f379d03850aa7769e68c43f04fb54628c653f922654ed7cf1f50593c5d7f8022cf779ba317f6afff3155792536de929572d25ea5b7a29b462d414a1a88e7599704faa4915c107434d8813df0203c6f8c45420064a3a7e3e59227c5ee0750a5db155ee528afd9fd46cfa8378d20803791d9e3f8c8c727cbfd03d4703e044126b761d7e156f5a0fd1d4ff83c2db6256774084ab204db9dbb2417e86efda117b2978067440d24a07b1a94f51f35857255499002219f36de248d894e641cb31fc5ecf820a3dbc76845ed8d9c8bda15bcd588b2a235d985e568444cefe662cf93bf99f98c58c5646b6cdd07f27d723b419a1e95327b9695453b06a323b1105e9b5cba949288de4d361c19b40e856d2eabcee75f012bebd99004eb40314575b536ab2e2d6a55f86a4ee267ac88738d88d86fcd7464cf367e4741cb55a42e7775f9b5803f110924ea3e72f222db7cfe8d0719646035739df2fa442a3fad86d41e7c5699c7ff1c352c6ea5caf5504ecf67462e2dd5752a46a2ab4586daeda799d920c0e90747622d005474d4156f2a1456aa6181f1c3bef0677ae3cc31a43c7bbaa30b86d2f853938cd1626b51b994ec5c322fc7dab4774d9bcc29555f1fed4d50a0a613eaa8384bc10b88cc59fef6683b708a4be863a4ee7c5d9d6ac251bb8c4f590f9b32979f35c989e382a6fada31fe97bc38e2be67347daacbeee67ff62b13e6c5e44a6527293f1b5f54c34b42932d924d7a9620dfaffca500eccfb2c7dc0f4b31c7d1cddc012d48c2f23fdd90ed656ef607f14d815385bed65214e79b20f87c26abeddf0abcc0513d3de2bcdf2a6ee7c653f125bdd6f0b5d61b1ebf7e272afdf55c65d599394db01ef25b6adb939f5ee6f547e6825b1251fc390f95b1d3c237d1716f488b83936416c6687a632ecf970832a5f4362e71ec1234e06d5055873bd9a6cefbd171c7325e51ade2d4891f0370a19f256b7baaabefb6fb605903b783acd4361073d92c325340395bf2b54ebf13854a33f3d52de2b1592d72babfc359a55d613c6bf0e54f79d40d9114eda6164bbf4f114553cdc322bb410b0a307fc1306559c33656689cdae4fa13efe988402bba6cd6b83b15a697501fa82367baf10f2d936dd34dec6766b52cc6504131862c1ee7a46c25759f72a055dbaa66ba363fbe848c365eabcb151eb41173316678a2d8a516a08ad702559165764637e7783d51bbe19d04ad9e31caf3349e785753d751a755db299633b4372c7f2e891213cfb52f7a3ecd9ea4a45f6d5a2531c35d4aff1547169310851f81931bd1ac106774bc226c411756bb0cbf5916cc2f24be14cdd74a88baefd"}, + {"0000000000000000000000000000000000000000000000000000000000000ed4", "00b210d686183ba3e140f22b31aeef34b74b5b7aa630351e5c844c7e776de14458867cce9b1cfcdefd0c047ca29390f14d19c6c6e12d358d195486c3455fca0825b1631ddada4d6e8e33ad1b4aa02187e9d8e6eb018e63f18e1300cab8ae512ac85fea652e4e6a2e60545b83aa6a19cb37295de7071b66b44df64c73d3d7030be0fb628856756569168620eb1a35d82036456b188deeaf8ab419a9e8c102a37075cf39ac9c57c01c043c352e263377adba73a3d73d2ccf79e3a7dfb8b917dc3d10af15f915dfd5b233f62e760a7cf1582f4117654f5a2b9439ebd092051136ef9b05b92270e6901923297181c8d209d1cb72ce216ce80d290a8ecbfa0add0bd4f79e91891c4ba1d391b504d0d385711fa915eaad436ea9e8cd54ba13e8804e757b1d81bcaa4925576dffcd6477f1cb8f137a0278c901bd2f0e1b4b5a3322e3ba1fe21b1e1b16da51ea07eafc0ab8962303dd63595f44c8b3b3d4310ab30b6b4554827e3bb0401e64aebc151ed5d591852df5d1d6619a8152c3730cb6ef26dea1e60158f201689ad4de4dc0004eabf911c8fc8874132375c2eca1e99a6c022212c7de88b70d4cb080da666abfaa5f5481decf9059a9d475d47313c25e965316aaa3684771c5e653b4dd67204e40081765a399200fb0f8f03e24ad3e7ea1796f3f1b1cdb1fe93eee08e0f489dd47c41cecd6e49dc978d21b530f0293f08d53957767a637af8b3e4346627af737e1168b8451b05960f53690a322d9fa46a9ef9a5bf475219c326ce15fb8a18f0c92ae792bd96d4e0632f2433c4df66e1df30c45c6cd044566d1ade598e7f98fb9105d69a8b2c9d5b9470ec4922dde7ec27c55bb40174395ab24bb5810c9a8dc345378b0ddd925a5cc9eb816adcbf7f311adc7fa8078b90446275e6afb1ab598335efc08a5956f37083416df393a45ede948d978c100f5e1922e02a9686dd9018b04a4b55213fd1b824d1a5bcc7cda1d79c19ca6031b4faa60d9739f18b1cf0a1a0a76995a2513611709fa9fd1f6571d34be1ef84d4b04d07ce2a7ab638fb651a03c2005c9e9f54fa6110718c4e158f300de0f53f4cc792bcd227bef0d79237d3a38f91eea7387564487b6b5e2e1d4201a2a801651ca2c4da34bdff3db1334e5546209708b54e23f358404739f6d1517784569fc3f53b8bab698b86d610539143c43c6522473fc730bc560435572bcf48f8f37c4b6250fa95d5d9af9f79a53f097c6d073bad86714b31d242f9cafd79afcb3e3f5594775ee7eb9ba80153ad5ec43cd7bd1f474627aeaca44e50978d21e640659313d741048cceedfc0ca0d24e6ccdd05ae248344017406efea9ca9ba350445c36b03a677fb3a38700a0ea30f65748efbfc99fa5300d48bff673adf6c771fac02d796e8ce23d8c9987c56de2502306f351d820888761c275e13196a78937a4eac3ef17ed46db0d0244875ce54cbf5474f11124cd71b84fda8bef3457e20929c883d9ae7acfda464c8604a3726e46398f67626a68feb47ca79dcb6e243e340210bd1994f0dd04f176f997d930af38f9f68e2d042e980c5da0d9969082f1399d01d6a1799c4fe235a013eea8ce1caabca7819d81bd0e564c0dd5481d43b1b694aa524da9fb9cd22b766b9d8252c939c871919fcdc71d2e258fa6c690db15e3a011349bb0ec2f6d180c657cefed5fd37cf1b1acc7200238daf5d07d24f87a3d449602878db420f730b45a3d06be7f68ae13442e5642b185f5e3b7c60ffec96bb5a3cdb231ae714e1e0e68293b0fcb56615b81119a7da075d0fa2e4d28e66ae8d4da24f426b184b969a3423307fbce042666cd0f6555949307d9819011edfcccb71ac83d43402a8af8c7e02ea763bd01a63cf95d89c3ce1e218e4a038df776e9b535abd64"}, + {"0000000000000000000000000000000000000000000000000000000000003718", "00e2267ee3831153d2829094ad437a4cb96bb4dec017efefee40d496f5f67db7627178efaef6cebbf46d012c816701d892313e8da63e60f71ac9e784f217991416ce0117b367d7e60403d3403739b93e706a75510647d8590f4b0c4180e431f205efb901c96dbf44b32a50b6053955e679cc937347c99c9f72263ed75bbd092b372579def19b20926262845808158db32ef5021c95dc371e4e2ad89ad24b26d6f88012d4517c4fcc0253da36318d10a1c005816ffd9ed1693ae4d8285e25c9ac4ba174c971bfadc39aa956e48aaf27f5d39415072b92189d698b677c25e071f5b0b5995b78bc3426780cd31672debfbfeb32718a14296dd399ff68ea0d34be35fadefad3a98679326df84cf2a351fa613213f18688f51e5a2187311188bbf7197cd37353552a0f6e462aaf66cd3d4873b4738874c38b73053c3f61112af99bffde1ccd6ed3920176910cb38a995f596804acee4d6dced2d5fdd9c0ac60cd80daf0a7ff79c00e2a5311d3d195a1f337aa45b8d6eef2fe7f7d5c41104e2115da206be37082d6049038111dfbbc59ac7e13cc2c62dc9b2380fae1a1837bae437343119f44f604f22fab90d240d98cea8281a1a8f7236b519d4c194da4fe803fbd722fede8c66b65387a3ddabed3cc6713bcd44142896445597f58b908e38bf72183fce16819e92754ca0e675ef28ee62c174b25eaf26a79eb0008cb78f2704319971e5be14d52f8e88c6468f7842e36f74793539ec8d16113f720c85dfce6692db7e16a2248bdb74b5229d5479f15c3ffe321622462db17a6274935f2938ddf3f6d03352b1c605a9724e6fb32420a52d206e6f96a19f2fd411eeca0e3b09bc671646a236103f6301301975685226e92bb3118a2a8b981c8115c0f16d4d4626d3aedd3ad782898e11d645ce4652dcdde51f6a17463cd9f552f222ce3ee38c2b6a96e011269f0f71c851fb00050f5551bad6e37b39fafa1272dabf2eb25dc518fd349e32c5f84a7adaefd738c1399441106cf0a8ed01f364fe9d67f1a4aa5df7ea131d4b681a5e6346b711af7125be4d1120ae490ad4b05beeda0692193d7ac68a467b6e4397538293cbfe41d5fafc1178c5ac56dbc25c82c7638461eee9ca794105c9949518bfb98e09051f38cebffb71b26d8f5d220808c08024dae92a2d64423f6f3c9fa5dc83b863c101c88a1ca2c77997ad6e174613f85437710bca74e3bc9fc29e3f89ab1f30dc5a18e482bc5c6d8b3b8901d41cdf5355eec6138c912368648274cd6170a78a57083449734690d93923b37a5bb6a8079f01e77a28314ed1740ee6ac3fdf18bf3835e29e7f97d1a354cf2196b8fe12c22d02bfa31d2d9413dbb1ce9c3b08eb517e11a3552cdca9fff7691a2d29a75c07ce6f2717e1cd8db1627efebcdac256b281a63f02f8bfebfa0530157bfe4e2738887c90280410baa959469ca2f2f9210467a80ecd0f92b181552099f58b7dd5ebebe97760178003643c50aaf0cd21680595c64eaa9a5b75f500f97afc01528194dcf3ef397dcc6928e8d84d4ac641447090a34980f95f3cbd6c58ecee4beb4e41fb2722222f5497d5011e5b5ef443b4c5a4ebd59539bc9d429a6c2b09f24da31d21728e0b17e9c0707ed185f8e2f1196aec867744fe2cde85cad59915e99f0f62f800248d5f8bed239f3b1eb754d014993ae9f6bdbf4c60a516233fdcd1001b5d3521edaf50082add2fffb3f04722c135e9d1fc9a22a760afb7d992e44f07b30172d4729dcc293a3d9279b2411e7a84efb0b70dbae430c410b61fb50bbc5ca1b771079ce1159f8b7fb2d3c1648dffa7d1949a12ee236e4bc7b8a774ee7be26ce15f6164c692a93ebe3ca81c0a04c6b817c40ada83b328e62dedbdd08636a53a974aa6d2f6b119b7c2cd3"}, + {"0000000000000000000000000000000000000000000000000000000000003d9d", "0013f9595ddb1757dbc7715fc9af27689f17061cf81107350bc6d54d1ee82497599851cbeb009e7b5ca2058467ff82d0cffaf605008c60796de20184b26fda0fcc01d3e1cb0ad38e8f8453b8361b6dac55dd23dc1b381fd5fd17bc9da1bbc24c03f23345bbea961c8a231bcb3d979eae5360494515a4d87a2752e8feef931cd01a3f4a9eb3eb5c52b3e65128fac11576d7971727aacada34db7f3f4f0e53909ca320caeb495c4513049a7fe9a5901a5994774296c34ac1556eb094201318b22f6ccc9ca405009e655737c73e016d80b513020dda2f90c8dc5e3b717e42e318eff05127f1526c4a53c7feb951f2562be1698aab8ed7f1cb320ddc2740098a3f17f20e3c71cbb4b5f0613580ca1a89f9c08b639c4d6425f5446baadb99ed2758e4668374dd140d12dcf1da791d95632eece3a048f4ef34fa8be85a0639d8f72dd8a46ba1f88684a071621a813e701f05e200fdb9b363515a12b6ca6693a25b103a423b5b20a102f1cfa62c4f4d5f9135c24a2b365981900458908503626bc229578ea6ec91f42fb4f2718def18de879203669c2f61de1e9976cb53501d3b0799cca216bfaa01cadbf00480dafe819cb65da139ff2dc5a11df73524e10b62274b416b19e1348da64afb99d38df90e831b9c251db7d0ebc8fce81384af3e6b3d360d5913b42d0f560c49ee47c5d83ac2e0917ed6b5c4e7155259027ed3b2d0e8115f778f52cd5475b1c52ee437ed4b208b6b3153a052f7240682db933d99f5032cd8991b23c5869e6171609faa8de38dadeaebf213017f9d34534e8d63552fc03dfeba7739e6ecb28e48dcd496e0099c45ca3d690be7ffcc920f0a402edd7b2498de461acb83af2f20b5a72bf2c2e3732cdea0bd61d704f80a213ffc1183b5df9ff7e47bb0aba08fa6289d61550ac7834b4c4ebdef82a481886514b328c7949788f4014e1fee5d0129eac988d03549c2f3b4df006e7a7e0a01192161148055668cf52f83bc25818fbd4e70fb1afcfaf6fec9c596522c52116c7f4ca2041051add82b0b8c6ef769dc93bd8165550a5bcd59869e333e3103eb46c2a7838b6cc537d8f631d3ca06ffb2583cbb06f0eef51ca711e15dc2f54ca0550b05c41c3ea10c1223c89bd65591b4decd11ee2e3fb11d1e4c9ee2641fdb1acdca932e7746e0c27d162facb5406118b1d801dcb0514454fe7139b021a50e22801133005dc4760e4a8ed20db4e5f1ba5e342bafb4ca35208a7466081162c9a4012c692db60ae17185d9f9bd19e30e16493ed695595de4c16bdae7c426e3ddb90b2a55fdacb5059f806d891acc3d4e76d08e1ceff9e4f6fe52cdc70a452e5cea92198d672a30ae41edb6a945feeb6c76175fd9371fe11985920db41059c5759650f777522718f447546491cf613b3db54795f97d13ab06ff5af201fd965696dc9a4985f0e1421b3d97dd47acb0bfe30dbd76fc6c4466087add510cfafec11a242674d7f611c03717890a8852b154014de75d582d9dbc93def33c95b24b86508c14c87ca40ccf57d0ddf28ad8d41205976d3e9272b04ff6f043db35b8d2de98f79d500f1bbbeb144f33497d9ed292ef2127b69ce793bf863132cae57bb4ce739b4588d4a00c717031933bb3889f3ec4e2de3ede4649d4b6c56f8a5d96f76df4fcfbae09607dbec68b2781fba6d390165d8c59508132d90e1f3282c24b0afbbecd3472752efc1cb9e3d73a8e691aad5402655852858714c87fd85a4d6ee20edc490c2e47ac4c9fe559c7ef8aa5fcf8eadfa2a70e7f24551fff61cb1e9c8459870bc497ec7b3a55fc12f57e9c234a74a5d212e54924ffe46fd14c093d5f44da59bf23a3c17358d41d1f00a4d833ea432ec670b1d9df3b5f1dbbe2d41985cf4eaf28d91ee5713edc82b83495"}, + {"00000000000000000000000000000000000000000000000000000000000000a4", "00a0f3484914f2c3215661ee32b01b622e9e9273cb08e8d315319131b0b7bdc270cf2c98a15085b2f36010634ac03b4d4f45f46ac22bc93187019160d0702f25af860e77ce33a492459923eadc06cadf6fdd9242090abf00a25a560958b7b3dba24519691abd1aebd71d56842ec307c307ad5b43727a7e97714d171efd110a6ca95806325c9992f1726032379506d9541f261211ea26b26fc6aa259332428d821ae5db69cc5bf29c05c49f5004e753d76ea191de2e0f3e2dbc70511b2a2a719c02ffdc7ffd6ecd471073c63de60e4a1a8fa22831a77127536eb6b8012423736da7f5406577fd0440723ec3e23d8983f949c81485d59846b211385bf710cf93eefe968a772b8171e1a71cff757c6afb6b8217befce6d4ca207ecdc207c938fa95eeee0b9eac092153f74f611b0f4f9715fa0b2f597dd718affdb776245083c840d83c7359cd932b35b0bfbd0782344f5300e33d7143856ae12a6003d6b8e0007992698ee7245e3c13969731c07fbd2fd7d99ff3896e73fcff42680636c5bc007429a5d0a652e8bde3ec2304c219d08c1e34270b945b7955653996fba3d1e3fe9de13ac2f702e0e697cba54ef9d18b639fd32dea627ced966f9a1062b9545094746fc886c28f2a9f89d15e2d5c5dc81f0aa3f4e5de72570b2883daef766b555a0bdbcd3c9f712793d5b4c7c5de281a6c87e3f0c724effba7e006a09f8b6e15b387517773ea3fd894e9bc030f18934ceba2c0a7d3b6f5602aa8aba5487882fc3fd9bfc2156b92526f8705bff18c127da69eb9e5314a8f05dc2596aa55a3143486bd0476cdde5bf1a608ef750746105bf489891d0fd36785db3aacf479fb82e33f033550683aa8d0fcbf15f34376d36adfe4cee17d7c756b1745e20f6a9bbf4f1851474d3461aa92b23b38fce62048e6e4822c5e49753314c1e3f9617d66a47a59a900bfcd6b89f7407ff163e889c96599caae081989db1644b3583348b17c6487a3b9ac6fa005c48beed5d71419d1d335093640ce37648d73f4bb4a2119b68ec1263c2ddb6a5eafe5d39d78d035e7b51f07925972990b6618d942e5fba93fffa20cf2d3caf677c1377aac22fadc9505ca6882c076e370789e8ff6309817392412ac32f388a28dc19f99119b3b2f7745ec969297bc1b3f6eb347d843af6d09d4f7d6c8b8d9d04a506901078ce3c9f7e19521db45c14f758e60058ede1a7fed0a0f54d5d70cc37acb02b11795b91139eeb55afa6a0f1a0dc415c5c52dd4100298e1b609255ba6fc399057174f5de6f6b64fea73959901f15836a0e83a44e4117fa9957a4e4188e29d434833f6a0f6b7c59880c815dc7fce56f18a9bcdaaea4eb6711f03799fbf1e3d16175965d851af7bc7e703e832e7cf5586e558fe9328f6d3cf584be41790bfe71c72ce7b85fee7179f7b016f5dd587dafadfb2fa804423527cb0c679145053049f40a27c1299b7800443c0874e94ccf09ad49ade1ef65f69131b042de023128ca3419e2946139dfe7b2cea06d66d9ed0e9e026238d3af4ee51c7522ef18e05e307c2dd236781826f71dbfb106ba58563f260e11d334e689589beb3111263377afec3fd4e763bbc8644b5fc858e1fe63f024136d202635722f4797bd61c487d45a38b95b66fade7350b81ec3ff6a7ca7daea20351051711cf19a2fcfa04f34d3dc72950bbd255ee05a03f2614471c86c209154d72615459b418d7acdc31a33f3141d401eabd1d8793a74684ba575f9c01284d4d4e1b4ee83f414f8c569963528b330d5b39ad740ddd96d7e06ac64186ac41f0d5745aa198b4d248eb61dd15ba961d201f017459bcc67583ff66b05ee858136cddf43188d8318b233158ef5b0b38744969d0312d38a58ca30c074f7fab973857c4b5b7b2269dc051"}, + {"0000000000000000000000000000000000000000000000000000000000002d03", "001b01791c29861fac40658af2c22511a9cf3f5d21061acc6d1b57d59d5ff08257903f5a3973e658a0fb09d1aa56405edb6ba6e5e3a853b7e2fb19eb7c6ae932b4ded5895bc432ebb9a4b6003f639e3787bf6c1100ce7ddd5f428bc7fa7f861b1ffd1cf2ed9d9f4d4146c57375f35748b914e018202c4a7452664c948d540ce80ab222a7c8ab40f182dd8840ce9d783378050741b8938ad89a85852ec284a20fea77e9cc2c921a3e0582585965c9a9efcfcbb587f05a1d5a27d0b51f281ebd6fabf4d5e09b814416e823c9980aa1475abe3211d667ca464718c32d4e613a2aaed98d11c8d18a3850c822a96655f9d589c79599bf36382e41a6d3b19107f39dae678a1a6fb8dd12f71d6be9f1c77c6f82b141d68a75aed8d979708145b8f2ca14e9dde559a18611453716d1eb3c9db45043ea637ff2b14a7baaac851a4abcdf2791f60b32f2339b92c6385f40991e9def003c533e0d076f21be15a2c0bacaa81e28e015d7bb069ac1052849f0f33911b3079c9a1c44eeaaf8bd7b0124de1faacd374b92add4de04c794a9a748113f233c169235615ecb2b97f9c67e9152d41bbe947f8c840211567aff550f97d11f241c1ac8d5e9847ef4725319dd88fc19d11b71ec19e85f82ccddd63c96d5d66406a5cbbb26d3ed05787540c9617e83b56bb6923aa61133df8a6716beb369a351c258a19864b87626beb40b6431694a25b563ce1aa0ce2f7729650f66f4e26e1a85ccd2b7ab247f84bbb372a5eb801924d52b6d11172c643a23ca447b713db7a3e53dccea4a243fd2381a2c0555b9d79c85e667f28f54f9689792147f0c1e1a53adc8e526a6c79daa82f21cc4e6c5eec910c2961ec08415bd53b5b5e890e6402275dc46b92399c5153c57f63c361261f37515a7b77a5e90230bea7db9ed431f4ce7841200cd54b1447afdac752740bf5aa78b003866fd56c248bffa3402a17fc8bab5221e3fee32013bd6ae2b274a2da2a162a40b564625ccf1f45dfb02a4f3e84894608dc5b53286e9e9fc98b799dd015515d95ae0bf6363e1e62694d7fdebe9aad41479ea90055831124d82dfced368d42cb2e523daba1dfb651a3b252578fe275ddb71b9944d27c20f5a27e11ec186138b6bf02e8a25a0672e643c9f58c2f1c5827e6ca11559c69ebf14cbe9e63e119801a9dde8f72fdf234400cd3c9de515df634cfc706de99114fd230a513f760cc51347d1581576c12d25149c416875e7fa1ef65d11b94fdc85049611a2703369b0fbdf393a54127ace12b6c57a35e6bb27e9b2859a1273e0ee0e3c3f7672064a912020c7bce9ee26142746d8018a4dc4d954313048f23380520b0192c3c70a7be26a3322605b81820d5b0278c9d9ccffcd1d66ad6b7831ca1d8695bcdd275e5b3a1a9013b35e8e92c9b5373b59bc3bf2fe32007dad87d603ece90737f7b8bcd0e3a2991db7b0240873860b58923190edfbfab8a5673e0373825ff7ae023fbb90bf825b30870c80e4a9a31539ba5cefa708034a64024815065d932f53593bc5ac9ea6887aeced0f886d904471fbdff00c5155c4fcae399ffbf55dad3231679372e97d73d65fbaaa36da64aef236385ba9118bdec5377046c3a163841b81fa4cc326c2fdb9ae23fc2238d5530d097e58e26ab79fdfed2389f8641d053ebc07352c9febaca0e1ba2c2af14d0e7a1b374822b05c9e929fb38b7cdd93efc3fd54594174f94eef0abd8369a287de09e4e8b1015b730011ba51b178a00c198dffbcccae9ae70d93b24fd6a68dd7e1dc7c8408c01f4d669456f731f1b667c4fe75fa08443057d00ae009f5c95eeba1e7b1e29fe628951a971679bbae1c30d0ffdc074c775679033c797720ba16a8327dd32b76618ecc1591b1e593d9c5556469177355bf6869"}, + {"0000000000000000000000000000000000000000000000000000000000000ba5", "0084253538de5f112ab556c7543e759a170039e61b248352d419a55a4bce3ce68030d28af21e0d9fd9c31a71ef908d499222d34b360d23f0e13203699a60e9358e0a856752d0f19732fb60b26c38cb2ce73e410e08795745ae6f3a89da3c50989689db5f27fb9cb92d36dee44351ec1307d7fb86129b3372cf8495fc2a830c032f0e210f1f9dab9741103832d1d9c7a793756b143222e709140b69b99d83b908d261c331c25a88c601d2ac48d9c8d4dc8717803aa7c336974d4f5ebf1b076fcf47a5eb2779f93cf1b1ed4da09d2d858b16102642295761dc41e3568f34b9b2c0b7562d9c93aa729915d7444f6a660b57dc6a055d5f8eff087a987d3621baf2d5350e57db98010981f84ff976899cde7ec6328801a045d191eef8cac4ab8978f41dfc039c2ffa3e279ddd769c37c951c534b00ce3ec6640087697b76b35a75f2adf32dbd026bc790c73677753a53b0f6e013b28b36e5b6875b3785363fc7a0a054ea17668c41de19362ac9f9dfb3ced4448a842484aba7edef981149073118a646b79e3ae11939b1c910da9f13f63af1650853cd56b96697dabc1b1c8f1f3326faf53ae9508937078b007d116620088169effc0aea3005c723220ceae62706bb1879d31a243162a9ab562381d83b20a7ba37de827922bce04f2cc43a8482df2e9fbdf9226de9bde981f13c1bfbad42174fd8911d959fc13f40163b28ae192ffff999b901e3aa0c7b82d4ce4fcec10d4db119ddcf3d5d49613d0c7c55db7932c3f916d09a550de21a98e7fe729213aafcae03577e08d17e022648f68d4917e9b343a63319ce03b29e4697934db083790cf9e0f49c5f0dfe1cb01c09192d77dddf35e4c960784d9db3b0357b457f8c25c520e36a138627508d545b52d978f81b59db63028c38e0a40d933e80929d8fc01b4693a7dc6a5530648c32e7647ccfd62a40372924e36dfa77fa3acd20e2a42d574a20615cb7819d061137394350dc0b4451db8b9681f6fe27efd7c0868a397dc49d1e566a1522670fdb3598b8835b2fd4457c23e9df120a3edc1d76cbceaba7afd03f83eaf1a7a39c0fd3927bfda4a13beda27958d2cd36e391859f353c91a259ddd61e9bb04fdfbdaa2d6673d9f6c3209ff79481e3e638ea973e0d7d77d6960cd19b31d37862edbabf8793dd4c3e62b6c6717a1a108796c210459e92e700fc8278feef34fb1ef053746023ecd8d0d41107fba1ba921888dd1388ea193e2f156db092d166f8bad940a4f5489f8e60875e949e99f811d9714311fdfa49b13f185438e99c1e6792a07a5d83eed8a130c1db5d7d57c10fdc8f2e62645ed28fc27f64b15195964632152c955656c32a283616e013883e9def526dccaa8fa54e415cdc7368f38dc423e2b1ff297d953190d45eea4aab5adc0f93fb4e2eaee5908fc7f5a0605bbb5485cf0e3ea58536d3474c5f5ee57f86c684a8c16d4d5234d23ac5936f54cf8e44a09145b831425933fe28620998db520e8c027fed3627118d57fa82e4e83b5d30cc85be5b868b133d2e2f29d1c18baea198df7d4e86f2445e237c1bbc98e73b8c60ca87f7743acb3e6b472a269ab8c251ce0e322cb5b10bf75601ef896e951e17cf9256758d06665d04eaa1e9847c12338abae401ae539ac35e2ab9cffd6c986823c2b630884ed28cd8378c62b8835c23cdd99b9a26fd2c4731cda744270e5ff95dc97755a566d25f5a391b6f07d222acd9bffd572ccd8cf0535a27da96d92a3b2235825df6a7b09d96a99e99128f1af72f9436c945d1fdb08c4e638081069b7e1d396a4bdb65a8a9f965ae37c2accb7df552ed5cbdbd9c4a4edbc32ad41f5f2665309d8b97e4623ac9f6c6a40dfa864a0c90b6f5fc41c238e273179676f41c94c750eeb4695624ddfb967a8"}, + {"00000000000000000000000000000000000000000000000000000000000008ab", "0078683e3e9e738dabf610672e7e03f8280ac7c5c9401285ccbde1481bc7dc3c9bf3feacbf65057b9c2a3238f3b50d6e9eed9fb38736a1c58db6b3b83f2a8560c94c497ae517355661070eb34c129a4db03274d6035d44c6c4de8957c919a7b8ce78daeaff6c9f0e7f2b075ba0dd4d7727473cc2efcd51eb9f4a8e1e5ec305fcd31d7ec184dde8afb132d9632ef92ac2164ce90799c109d8058f3d61de961799d7d0dac6207fb782008ed49df8852faadbf9d58f0232b45ea8c41ddfab10b506559bd3becf5299b338307f016d926b394ba2069337c2c9666659f7cf02b4f4411379ae5171049127597a686f923ee1c55965f003de99028b13d9ac2a04711e4e1ee6895b42fe03f4e439d5ab2a111ee08c0ebf7b86261554bdc8f7f4372ecc16b94c8d13f7ed0d3987febbc5c1bb6e510576bac92c4315bcfd9a761be512cdab1b1ddbdc96532ddb43b011a1adda09cc0136dbf6da6235fb335767a85e6ce0930b78bf002908250c824b8cf472874dd1ec9fdefbb9fefe54bd8e0342d2dcfd11b900bb1a827c6545e11cd985d3aefd0dc5c1234c8989754d6f08fe1fe8e4ca993b1b378102493e8462f01609d20530c73d492fc92851db0db559e08f9b59a590c78edcb637c4e81a3e4905f4fabd0c054d7d7118abbbce02e1f09392936d40bfffad0529a1daec115053318f33d51085df49aeadcf15ca26083676137c0568c2520eb346502772fdd8b55ab3d3376ec2f7d6a39f6dfc5e9492bee7930e0ac8b3c91609fd62c20b84fdc2366fe16544f0df0859f73d35b0172cae239bdf42b31cd362865b45177e8e5a9fab9309bb99a19fc898630f04327c4f5899925f9c157c224e87cf5c12ee84edfa7105de185e9a65f2679cac972236e670f3d8df257e431b1329702bbef5927f1b0932422d2b9a28b579ad6583dfe7344ea92bf27530d60313868ced554588b001f15deb9251ecce4e7cf7322043316ee04c3dc13e0ee2eef44f909a84e73c365911c9510d7776021fcb1d25f03e69c462c0c69bfc061d5e56337f0f4463750d03f520be195a346b3a166d0d0713d248962ef9a01673537dc1f318f8c7c930413e6653ad899e459d22d6f71da9ce2c2dd961151f112acb45d97f2175c180bb081ee768243f73481e929b65823b8b8faf34097fb448753961bc766baa1ceacf09750d4ba5e1ab9f4c5a338595352f014ce9fbfe2f0aaf86ac4be52f69cf33315313bfcfc257f434e89f0eb680a776124d6d0b65a186f738fe0482e729742013a4751d6f07150af8c632736a9b174b547a3fefdf15f68b8e345c5c1d429761c66e37f5cdd945544af73c60ef3a7ddb7535af07a4e0725dc336260bde72c71c37f473e18e92d7d53fe58d0e5d968aa14c96034b1ce0e49bfe9e48317728bb340a7b3e5ef4e437dcec04c66bdc5aad383bdb7c1050759b32b8c21cd4374b39b8631712366c0bc83ba623286b2331ed2bbc8ac216b5727c3a550f58efc1035f5ba9759cf112d70bca4a3c5f682ad63277024284d8f4eecfb9cb537ba85404c9b6c61107b84d82213571c23f505d9c894fb2510e3dfc600ed2ead99054a173ff98c888b55ed44a0b085798a50f4e0249c64961a0ba21e4cdc46ef8092779e2cca722721571ae77e842cc62535a7e72f42b3008275931b77835f1c59e1bd144effb3b8f5cfdd4f7088964c7db54e7f1e3b272b6d0ff7d88b6a7e9221d3a20c26dc4d09561ce26344eb6755803408b5aa3b075d34fe6cfb1385de1802a67cffb8aa38e713e18760cbadab3bd1c2f9954a9715d9fa2b76a7393fe65f61f6ae5ac9d20883d268f49fd98d50d3b118f9fbfa84c03aa8c05a1f18de3a3a648696184ad98305ecb0759684bf6be1b6951bc3d98c07b6258eaf9849e27af"}, + {"0000000000000000000000000000000000000000000000000000000000000b98", "0191ccfa9d67dde9e6e144d8e045df95bc5df8f8d913bc09a21b9da2e7996901c781b48dc3273dbbe41b0c7a3c6cf188610173c0a1b50e3b353d302b4ef2b32962af06a5a710d7ab6036d3fe68ed7362c61e6444038e0793479b9def96e7570e3b69c83a99ae1a41dd0e22c55a8659b68daf2dc10b71f7a63998fa9782270ca7254128d23a729693e49f50aed3abb8047f392f1b244d486bce7bf1ab0e02877e6393bce78209ef4f0645e4cdaf5c775d24be0201a5d4acd5df0034baff36e31a7eb74f0914df2463798fc2cb96c99dbb22241f2b9ad90d8d7a553aff234a8f23d9ace9baf040c11f4bc4a91ba10485932aa66f3cd67adab569d994630b5f4b094aacdea57913d2ea656a3e1a98825829a03e793e841b588ea6e954b422ee573d2a6c27d4fea41bba7ee6384c4ee7cc1332eaa4de877b3af49f18671c372116e48b72995b8bd25eb2381ae5ab202dadf20338bbf8c491c6eb024c624d73bf6e6ec106bd898c12dda4da6064466d8408623eb1624be0d32cf44ed31589856fc7c85babbc8eb3288544554eb570db155444d4f2717962a87519f2761dff70d1fa5a089a2829052c7f048a8324a4901f74c1ccc878fa3e42f75fb70b6d78df8bb93227e7240ac446fa299f0e1758b8190d905952b92078d3bd6c3479cd75edc1c6444fc4a81544d559460558f1715bb18dcf254f15892e1bb6c70ce376e7fd930ae0a519023f674238c25ddfd376e71533117c2d4a9a71ddb44406f32f030d5521fa8a2827109231845a8dc70c05e4ee77d253e1fe6a9e191136b16513f91ed5a75d7bf3e19633fa3df54c3d9a91123db977e8d98fe78e94e48bba740e7e2dd0fd45ae171c5663c2cda71a85adea095aea6fd3f6075fda9b144940cefdb3eeabe3d0533133cb9c2b1e6fff0b881de876dd5b258373b3a3e4723feb5349ac04b1bc11028132dee0e2f7014ff502282c11d21a8a82566fc122d87be6a9d0c1913732c2f70b3f55bdaedc16e8f006236fe315d53e11bed1845d14c5e57a0df474679341d7cda1357b33ebe6ae9c5b9d6ec98b8d8a5edf9b03b48069a2b3d7cbbe5080eaafa53892a444b962d905d332f54a81f37270f0d448f739ba36214d1da52f21280520e5dbb497003536f0e4da089b65aefc3e8230319443135e57c766225cd6d668f5db61161ea5b206d9245c89e3de639a17e65ea671aff63b63fe169f115082690a0504c518fc21b3363e4d648f4e47918707d8ab013303e9883e4e6280b0ee2ec0fbc978b2dd198aae8f71d7e223dbf643cb7bb97a72155f5f277e07f2290d48cd759d2fba7a1c7663d37af447fa35a73797eb4843eaf309a1b6159957ba8bff75049bb0230c8f5760df859c6e52a122ebb4508909b15d558b821dae776b65505d291492354de9b6872d84cfd4f9d406701e47d58b116965cf92374eca417902827a5b801b3917c9098e3635785b8261ddf79c50f2e45d23ad11d16a5cc8567e8376a4d1b3c7f5a82c9a8bb80c7a60e7e453392632d9f4737622df74475dd9ad33b36407156880ec14d3ffb60882e7942a7cea9cd89a3cbb3aad351e26d18d22d7e9043d98d14f3ab90bf69b612794a22faacb5534a987138acab9e9e92b955f9c503a975ec71da87717a1ab74d4a3607b7d77fa4ca1be08562f188fe0938f6279213afcb98598817ccea7675e9cfea57e57daffab430753c6432aeeb2347e792e1e5a6a42b7e0d9715e5432e2a74295116220f86cb42b413770cb5f3cf756cc84c9a3d6ffc6ac61f69f4411bec7f0725583f5171e634818ce2099753cb4a7b2230ec40d21df63d3d15ba33aeed945bab5d3d6948c211c2b132d6254e52879565890e33012fb67bd23f4296da6eb660b70011c6775b096422fdeb006b7b8ef"}, + {"0000000000000000000000000000000000000000000000000000000000001f85", "0006523a496062e91bf9c3e6e07878b525bfa9e4582ea8fe2e7c10432bcabd97c3b25d35db64da7cb3280ca4a499eecba8e969e4358547458d9623ef7ee7191504ef48a3a4af3143a851faf39e4361763baec4c700ce15b79d8c93711e8900f1b64e111c7605168fbd0a65e48a19cb30f52a8db377fc73700a2a2379e5bc1a6b9977a91a12412e427563a3b45ed373f79d933c2193465cf11d22f19a1346347d62e2a26cfadf9cc3000ac97e74829767fa9a108a049fbe1d8e69382f120b6d290b5453b301def0f5bbd0f640f1882874f7e519d4915e3f8ea1767618d4e43076294e5c713495055939ffa71218b77d279ac7b1d25a02ce887818eccc03e07625c9d7ef34d8f85460cbedc5ad48b9af804845d9bf7fae9d9a1b4bb61599d4bf58b9fc9f5c124406078424491f413bd171e12d35ec39ff2715ffdf2267495bf584f4fe8dc22a67a01d41d049e98dfd635a0103bf056e61b187b08b2515e14aff6a21fc7e67aa1d176bc6704ff9f1f4b79433e642a54938807db0af0d7ece76e98d6629054e664dba4cdb49f376563f102bed02941c69cb357c22a6f52a6bbe4fe7d61ff1580985ec2cc6c8f0b99a4a819c961d6cdc81ab7aa41a0e4c017bf8bb5db5eb66256e2bd012b18245b7a3a50b611c7d2ed32497d8e142e03060a12d6e51f14afc0baa57da69cfff8b804c01b3bffabf4784ffdd2eed0ab72cbf2bd5eab4c8c5c4e40f30d1916bbf8d9f4927b19af49ecb842d4f288308582bd03226d2dd69751eefff2b772dff1b9390a25eb5acad59c8050f5ca21fe4fa1444e8e2d19de6238a7232394de96b55d1250b6cea8546052d6f96e91281715a4456297b79ddcf16139e87c411832d292914012b3a19d679e8bfe66f1f89f1920967c91b4270e2234e7774ae034974be40355f1efbbc12435afe9073d1c3b693610e90af1902000a1b493eea05455c71315fc4722256d96c5fb8d0085dc8aa58a70e45fa78c5db94b347366fbd3c999907f62b500d058df3dc9d61b6ef45b81e322d3485000dba3f4e92966042f4891176f56061f4619731773008346eb37ddad6170b08f40fe5755df384b0bdb4f614be5b8b0b52fff69eea733621401ec4daf63b68d014e58775b0cea898ad5751f3b47c9cb5cf4c4ed9386cdd4b891f671fadc671785462634beac6fef7cf0f0609022e47a3466bf793b8ccf860f1de6be17917f50ee817715504db079230d49b3cdf7236d79e5b00b50920112add9a391159ee43c1592de2f315e09be36e21c15c1d2bb07d9be64f3a865be0163b820d3e5c1b0970fc212205755c3cff1168051e2d70890a8c5bb85ca5667d859936992eb017786ff491d70c665a52ea1bc4f9f4198f23968011f3cad7b6f8a1455390c0ac25ad3d43a1de749927288ae72af0a48ad0fc9929c2032e49ab81472457aff7f2fbd29ef6d5cd4895932c17d85a741f87b486db2c95394f74c4ca6df4b373b11326bf048aa2d7537c34c58e4b70177e596b99387a1e2421a40f69c975ad9643cd81213a85b3eb3dae22067885f530ab72d9b982027bd7a85eb604f9d684f54c6993b31a6e125fc8bf262ab765bdc362761bdfbd1fe70caa430fbf77793802cc279ced84c85768fea932c0ce3a53cf6beda01624524f5ff6ffadd2de7dcd03b7b2c0c11fe07dad9b0420b250a85efd09bfe39d0c5cf8a2da87bbaded97011c1479117ca964f4196e044f0eea548339c1efbd71e98758b82db0241ca96c4110d5d988254d19f4a4748126efc90a0762bf193214389b77eee560ef58b1622a20cab630af8e6f027b2c8c6fe6cd58bcf1caabd8e8ee708b9a9dacd8100f1b7773db08a6713fc9dc01febf7a8948b83b5ca74c32d57f12a9b5ee77d808f4e455537bf9d8d69731ab"}, + {"0000000000000000000000000000000000000000000000000000000000000a65", "002a908ea8a042d1102da06927d821d44b39cf3a862da4da0e999a805ef49148dce3d077ef0dbffd176608450a6f8c4ce488847e08420a6e6ac7384e7d49dc2294d9c29349bf89a52f45cc7f667805e167dd9f7c0e39c0a1d691000cfeb5325a2dc6a2532a89b9a3c714ddf8dcc1a934b175a9f83a9861335f33b17b31db1ab49269cfb32629a659849c905395f31352de58124ee68e1c1269be71cb0de5fe063a9fbe68efd6e69a0103202d9904f258323ea8b79e4ddb9e75197f43fc0d4b05f2e8a642815ec53630cde9b126d3e9fb77b70beeff8001c7c2070ecd7300e3f8eb99004cf352201766e69cbb2289af90583786aff70d8a4d5d7bb39502c63a9c3a2c64e98eba50752ebbcc1c8c49fb4cb3079b8a2eda648399ee49e86636634a36d9399e70780664ed810809fd8166357277067b9421ca611fdd4b0742565fc4315c4dd0f8d37450bf4fa9caba18d71a005f197e176362b589a32277dd32917525eefd93d5203a252cd44c024dc8c22413c1ca6eae3441f5315b00f52d37eb01197c4bc1617ac064e661a1be7dc29e2162fb001965d1b135bcf7a55a7f23860dde17e4980a1fef24502f7103885d416ee9933c6d92787bb4d0323992f452950106acf074f1fef5c4121ea6bbf5eb20da24b1d19e78198594545286d67eee81863e95522d603dff9b27053ff7cfb7bd116061ab841eff9a3d06dce5f711132559a65ec4b9bab2f611436cd084261f376301ddcc21f5632df20b2d4624bcf1c3a9db221aca541f5ee747179b6565d784c92b3a73eb9b9ab3253d2241220c7fb4aeb6a43101271b49888b53ec0312864cea91a25ba576fda2146720bcaaa5f917944c448cbf6689a07e89828a55db6d39f6075353dd6fb42cfb3f6677cb6ed9841c33f01b582c1f2fb7fddd9d30da36b8b1165068ebc214ad76a82aa308149c1590004b9f6b114a03dae0bff2616c276e2ccb0d5bd884239f5e0da69f448be12fc26f10595aeefc82bb19c901afb7d2864f157ea19b408c803c1ca60ab2f2a8d1107a7a944825bc1f525ee240125664ab4cc3fcab5301204be6114e73368c80221cb154b26b85ecfe4e442b14c556a19b58f50fdcc7b427c926c67ad7950c310f983b8509a9cc1183e7833402fc5e6d603b707716525f5e5efee3271bad28b54c2b648d7f809a9d06f501c099fc3781e5fe4c95d1ad6b2c171c7b027a5cce1fa91eae8a5925f5b90e72ea6b659f3d2f1277c7cd023500ffb520fa5b7a66b4755771379e45df3fd1d64cc7a570b3e821c34fec14e9ef57987e96d5dda1c810db2e37d785894b0678675a00e8bebe6f6fb70dbd1cc1cf5eb1de297912a99560e5f2cbd7c9669fb75b1502aabecd7324d3e4485406ae5c31656bcaf8c0e44366d289c79f1527100be5d7ab379ffa0e0439661904f0764a860d8994fd8479e9d7d97eeeb725de3ceb1ae338e413a1b341ca47a36d595384897e9e78b0e018835b7ae2c6cab83f222389dcef596936cd19ce47573adea1d7eac72bc71ea5b569d0ae99f23d3753b00c6be5fd61acb463c68e5364a02eda916c7c543b75176de7157f1d82fefd62923ec4795f720aa213a4ce10cade890f1333549f65a426c53bf1c5f8fe995c4b3a1c97e58fda648312ffe7cef4edb92a5eecb6ee6309c027411f8ea0fe866693029ca68462fc48bca50217189c947f5f3d93532432beaba80020e1c14f22f820e75b2a78cdec10f4816694d5d41d3e9a7c7c672b3f76c47144a7a279685ac792fdf24322903e9bc8eb162dc1fbe954c90cfa4164ef9273ac6af79c782ae560089781f8f39f7bb48bd8fdf7d0d327c1a0dfa4c2177c83f2ebd042a3aef6e336dec062cdaf36f6cacb1c59dd1487a3e11364d442d3613468b8ce537393be"}, + {"00000000000000000000000000000000000000000000000000000000000001e0", "0019884ee8a0fc475b35817b1e9f98a12961fd1783238a62f800d7b82739f8c71642ded05e0519bf941f246983199d157574ef2d124ef7be1f7960850b13893e079fd3a0eb2ec782c56500c3f84caf987b9e150302e25bd9eb47e9ee5c4362e34ec2b50a45179ff67e059e4130334bb88dd76041188e5e4069865a56068e03fca6c8a0e083fdecc012d4f06422559ec7fa5d5507bc5a190a93222710f41284fa5096960c709e0cb1118b870ea1d4be53e059f3782656a621822f5b8033222c1749bb64e337477694baf6489ed3019c3c08b514888250fa4dcc3f4772588c0773db2a715d7be4c33fe75c4dd49d9cdf345b69494979ab7f1734df9f71123b09c916d08fc7b5dab1289d125e0481cde8c0e827a64c268255ddd50c5164a336e84ff66ef7feb1ff19c86d91fdd408bdb5dd03389a616fa1a278198a491c1bc1877b1b68ff6f7ff2544823b1918f483db6ae043ca8c91b92b9d5f50dd19671f70b89129d1cb94b05d2ead1ad054caba0df0460a1c1ec02e8f71b1116266ba1ab6d8b8007ccdf42b34eea361b4e04ddaec42bb29edbcfe4bd7137851339d79be7f74014fac5e609eced7c008f5b09d5dcc2dc2dd0f9aebe395808c038d53285c41ce11d317a14c425d3a7f2bf1a9a8b2f2d3826f8661d9a12ed87f2e39eadaa24fcf2d7ed5438088bdd9c24960dfe41d8c649cb554b36411a9bd20533971cd46b7f0be1a1016516f50a83a00b9d06e36f7b86d5d97143ddd389cc8c95e58c0f656d3e68930d44e3ad7391ffeca345326bff2f122615549f31ef37bd734b19325463c8cd94fc75dcb1ddbe209934ee101df2fbfeae0a1f9e944211a21f41e8b4ebb266b74cbb4493eb9d8a21cc0fe8b0f0eae82274585936e41362a3dd116f6733f28521aaaee40740bc370e1ffc258739794ea196dbd51245dd5c4111edc0843818d5002fe2df9d178c33c458424f111625b131bdf8cbd300316fa7b19e2a2f6d02a1bc1c1beedee5cf9af596060c6adc8e5e47a32c20c1bd0d18cfe5f0afda6feb097d2ef7a6cad5931ea560d7d7beb82a137478ad8b0670d8f424188973e0e1c5497bfd18d674e71516d62be6c9795a6cd9879ac666a0c2c56686093e7201c9123fd5126d3ddb49fd8082bd1fbdbc52c38eda38a73cc37a01f814eb95619a6415e6b33a4277061adae703bd4483d1dc0de7edf3346e7ee4553768363dc18b1a3d216aea599a992a82c844e4649ed6da8e7d454609dbeec6b8d412231dd8416e756062c171ab7a65a2239f2c31fc5c87dd5a5ee5de6d542acd8ef3178a200437f2cfbf0f4fb76872b11e79b8e1b4c69a93c8d3093caf4c1d71e9eba08963627cb63685176e5faa8c0bd0395e3c97e612fba0a14d5def6d9d74f98e08d029c84d9e9a35f037ff8bc2fd45eb3961c5f05a444100f0cddc0dd62c86f002647dc6baa869ce5efa72b12494a6c71329769f923a232971700b1dc867908bcf11246e496c9e95fb1c7783a7d93189556d5e136d0f2a2e6fbd3ff59dcfc3db22ed69c873d51f7aedf7dc0768ace4391460c11afe1148f8e2db70a3e333231217abe29303de9ab5dc48c17eecd6f5973f315d61b50b06a0fa544471e49ffac22dd56bfcaf1daf9b895a0edb03f6e0654187f05901eccd95589221a6b6c989069174f8460bfacd3617e322ca1aeb1d10bd68a1210c4b7c6bb49452ab84b6443e7e41f2d21b649a67d70ca34ceefbb7c7cff361f26d46956932cb2b1ee8993ddd442e6b12d45eb8d50453532534fd4f0a58e57c17a1bb5371dd86f98c5a048f2b6dbad14a3a745c1e1afdcbc17a10dbf5c91c522cff6d0cfa20deba878318092d1eb4f79d97bd3233888aaaad433c949d9e7b1a0d5f12e8676377cc8cd1a97c32cdfdd6dc9067b1"}, + {"0000000000000000000000000000000000000000000000000000000000000a2a", "002098293c21b2afafe052ad2ac3280d2fd75ea6300800ec336c981c77002cf200b3cddb6706597c5bb51f9379a383c8ea628b3893642153ca19ebe45eea4f4b315dad3ad5cfefc2f1668f9d717345aa681370e612d09c884f2c0f11c3ba249bb7c47dbb7caffcb29725b315921b2ff11f8675c459787c1c7efb33b9b6841345811784a1b21dbd133207daf652b117a18ca1253a2d953c7d19506917b0e77f16f0c61efa5318eeb8012a03db979aafa9aca568db25e3927a6eed3bd16901547fc7822f8aedc57623bd97adbe396e3b99ec7324662595f3cbc941673e26c49e528a069bec9f939e39ae97ce9cf02a01ca20d5dcc05ddf8fa36eddc9400882a424fb9981f3bdba3382efbab49d042a0ec5950e363c3a0c16c911b06c72a706cbd9f115fd7a4d0d2b017c9a04a290652f0d237e386a5b09bb5e58eb4e376a4d3149a106935ab01920c37949ba868b591045027244c960423012c9c630c6d3f13399b0975a1b503b5dd52190e25b7b3332a707133d17567507fea39403d945722e063f6ac21e10956554084a1a90d816404b994c9c6be197af8578157e23b283bdd7037c9946142b6f0d519bbf73f05e018f2b4f36192f70b9477219627c9e7d479c037c01f19bc132f98472b34d02e01c875a21dedd5af1423e11eefb2d67a1a704bb2ecc8ff65dd326ae4fc5ae748bca536f1d67795d9eac8c03fc18d34474ec07abc82185a48c8478df33d1b0bb28e35bf180cd36388d2f95ee7fc6a672589b56cd970dbb4e2f558d87e5a086d4229273030ddf8eb6067127e057cc12746869ee8095959450541efcf79ed1e104b45b4662c168b9685993938527b73e72fa988e7e10720180b525d77fd14281c80c67378cb83ad0cc380b60d983a708704bcc0302d954746c418169b1769b42de5c449ae123fb2023a4cd33f3397f1990da25610170d591b2993e679ded84388f40e9b5cbed178cf31a6abc88a655c8f374ef239ab3757a498b2e1a1ffb089f82c48bae0b659699221407a8e0a4cd30f6fa642c58cc164f0d0a3eaca112daef7ee3ccc675088796113d6e9ce38b655ef57964bff5c2105ba08f7f807733e747b51e97c7799960441d793468726cc2788b211806bda7a4e03c837c7d3594c841b069d8955b5a2f35a71b9cf1ce1770d26616e895f65b626917dfcaf2033da7e7c2d47c78e926e0f0d84a97ad5cecb986672442d9b2d8a94d3578a7d2ee56bceaecbf66bef3fe0c6ab878a0f0ca89d1ebb19eff1079cd48a33a2d680ef0de49181472578ade64fda5c4dfb70b455ac6cb11f3cfc67ed87d45308e31429e5113292d36785210299101ad215190029cd192a1c4e92cf0e0532bdd7e174dcc9a29d1f7c739cd33ca7e6d4b52430dbff50d1bfe41a22421ef9d7ae4747cb934962dee2d112b950678d6cfd28947868b84027681e2eb86baf35b5126070483adb8ce6ae32f8ec301cc7977a25feef877b406dc2dc7bfb9b907fda405fdaacf6bc6b5643b9e4d1d44ffb75a750847d2f2b433b2ee00f6faa63bddbf06a14ed775c581a2ff5a494685697f92d12ad92fd21a699ecec1c9c3a3acbb7555cb75617d5cb77b7d4919d0c24c5a5d1ed93f48e58770ae9d5624fdfcbdfb2146c42ef9777be1f83c08f6997a795b60065babe0069d1cdd3a556dc3fa7f30dbfd67ff206e00d61b7421395ab72669863dac5b6391594aaffdcc849f5fb413e4f8c38b0b77e77050c41105571b520dbad9e3201f3afd20940d0f34d64da3f78f3b010923a372f4160be63f296aee560185d6f2de56c5bcc1baefbcfae0128bee7d182ddd85d05612523076d7551f4c774637134a618c6ce621ab644ac33c6dc7996d373ddaee7a4bb6ad2c91a4f2a1c6640515af335cade400f6e8f1"}, + {"0000000000000000000000000000000000000000000000000000000000001b0b", "003242e09e94e78b29be96cc5b67ed0775373efa15482e2d90706d5d63c0cb853344b3c6a190de5395e200bdc6f56270ccfdb36873a95871941987f50d6dda18153d3b31567efcfaf1657ab2e8b62b2d99b9f5d7065f099334f31133ad06e22d1c17c601144aef204f0bd36f151288de93b0c7c56e8ffc9b9961e26ec6230c7f1eff814bf2abee2074988d267baa7985dc59a010905ff367903782f286e58d922fe199e8c83fb1190304a87687ca4e75d6dc2811604b6c9647ad766a503919afe7ce62ed57485b060f00df1076eb3f5c1b520519039f7210f6d782d1f3a9feb5a9f18e2c1f6013354f0b7a03de2301152583804f76a8a0f37e489dc5046fcacaf5a88fdb7dbd93635d2cb73288bb786c9708bb7a59f2a274fb9c15878a3565423e83a63d26150e259ddbd1f26ed1e178542c05fc6445b094fdb665178a7992dfb06829dffa96a6c270cbaa43f8b9904a012417a7bc1777e55fc2a060552e53adc8c49553aa02b5fe718fc4905944fba8596be4cc66efd0ba6e39125b092b3704ed5e8d7ec3b0d4c4d4667d8d59328f2cd38256da721525d91ec2d67d5374d97b309978e50221f98290728e219e5ce1c42fbf0b896cfd1258573bbf454a91cfe8338e7ec80480ef7462562956a5b202c9f6dd0c45d2269908952db4c6f48685b8fea3c62890594bb6924d19a3c3f7a414dbdddaf8f298a58403e7ed273622fc6b28cbf0eaec39c796781f795755125243d6886f706bd23181919861c81d72ba73e5dc09866166df1f9819056294e88cad9d560bbb75e2b874e9d450b53320d1bee6f8ace55c305a7b6ddb0e2b0fc9132b3b4c99e6c796c1bee31a9ebe95171e28ec36df9d3df3718d6bbd0fd406cfbffca1a1ea36193e2589cda3e3f025c9849403a72fa261e102054eac4642dadca69ca67a5beab9d59de7cb4902d8a79a0500012c19d097522321d0a1e3f210b9e5f55a2a8d38e01bf973d409140706db1161d72f75e33230ce1a5b452831f18892de588b3185c61a0fd4aa5a780b79bf9437b5439c6e530a5ab18a93dd05ccaeb553dbb76a2b02582e9af08a2bcfba8050cc6475981a53aeb7d4010b3b78c6cb8f69a79b5e030ad7d5ac49f3459642fe035bd50e1ac4504a468271c8ecbfc8fd1a86996fff464d62b98f173dc6be05775f9cf365eebc221b7a19014323718cd473a1cec5202163aa6e8c321e1288d12b02e165ef508a5df29968a91179cfc66c14ff278314fb97da0d547974b574b33536d6b379eb0a718c5034e393dfffe245f1d4c0098a12634e82e6657c3c0b06707856339d5c8359fe6152e9441178795cfcae9b2749429b4514e1efdeb7e36dceb8f47a3d55f47d4806767643ef231f7f3aeb2186878f96958f8518401a45800e45db53cdadd4ba0841fb6546f774b4bc571e033e12fb2684aeb7989282d4084460a2da71bb60c76033032302a8eb0bb3969658ce5ad9c213b957bc011d925d3c964ec456a9b8d8e8a1ced1cf530cbc845f28769a98a4ca90a4b91f74e18738b28f0daedfd3e6056740dfe2615e854f4ba05a68ead1b90242318ef7242da4d0af097d61dbd477c133f0fb3ea3cc37f64509235453241ee0e11d28e4657ae9408a26d0dcd5229d64becd9eb029d9d0726c749172073f804f5c1bd9073983da8fa48f63492de1658f1b3b8536317c010908f8b9c388935c1701b8314ff28accea9535fa14f90b0fb8731f8f232586093237c9e1af969f139bc6762132acc285c94954ddc632588eed3d48fc0b3aad801649fd5609c86972f32434400eb03259339b70bfe62f6911a4b36293f5bdb08436b3e6c0ca04f07814a11e1bbacc488a7c0dd367d5230dd22ce2c7251d019a84bd757f6f2ba849d7340a0bed713136a738f56bca"}, + {"0000000000000000000000000000000000000000000000000000000000000f8c", "003d0b5f1617c405285421306b2ae86a2d399c33a81e39c4502b59da9d13ac125ca547006da24d9a618901a158a9d3d6d8575dec7c1deafee59f41b0baeb190600272ddddb80ed090e20cee918c0245dfb0aaf44053edc86f958c2ed01a780d9088ea520a3eec533417da16c72f2efc48993461a0c0bd4c3b2cb55597b6205ec3b227fc219e156f5e08e18ac9d00a0810bec7c0cbee93aa29962bcf807d170d52d62da63f677e452051ef18472cc031ca8a732e403fa950975657008050b55bac826588ab8fb83c20d46e662f24afc364ea50cf9f4be8a55cfc0d46814cd75e70c0a6e3fff7f7013a77195bc15b42ce219020f31679f423e7b53ba420ecda6ef21862bc53a56a51f065dcba6879cf62ce6223f2c3779d752cce9ea447c616f85f16a7f197a05170a4bdc93a6e415a71e04b9e3cc5a015140ef7f382d2af23ceb1f94fbe2a4732ae2fa91e9acb5ae4a03027aa9072fda25250b32d1543422e8a5beddae017607c38bd34217331ff2c0f15ac97b55e73685de4a5f05e8578797e810f79e38d83e64c76fe2eec33fe516085cd23c2489375da7b225e781760146b536d9bec5070347988ece6f589edef376b59cd77e30a07de8b52192a4869594148757cf94eb9749b63eaa29fbeb941ea10acd359a19f1f7eb63be1235bca9d08f7da998250e91750c94b6e9e67af8de6f6ccb4e5d95d4cfde02a7bdbb414748c1080be0977b79c15ca44a6d90630ed9bb29380cae8c8d81e332736c732ec5bcdae4c009aa9e8ab65eaac5151fc1c4eefbf379231a113d2935740a1c5c60d5c7afb0b3b5dcc2eac2db62f7816b0324ba6b7eaaaadbb007a351f1df1c316e9a35f7ab0e355b45406526c3f70ef2862dc592d59ac16d02261d40aa5f8214193d9c4e54ab6f73fbfdc88c2ecd471d525af1b718193cfa0612c283aa2d4ce427996737003f1e8ba274669fb69f12f99f1d6ab589de93720803f20b2f0dd99d0f739720b9e055289847c3c997b92ccbd563078f5916a1aa55f9267fac233e359d0198440f0b2b961cfc15796684fda25ef9218539b9c9d405400a51aec15c704c6768829a4d15129e7c96dceb060889d81272e111a27954946ad564ea70b61fbf030dcfa4331e1e254bdc78d37fbf720d699a131f389f1829eec79c1e9d9b23c853da54c215b295ba17432705fbf1e9a2184688df6ae21c89294d154e3aee1b09071c02fa040fc131b806c0d946a3fa8c844e3a695815775e4383ec5a19b98366e013fc248f1835ff054a2891afdfd69f404171e392e268bc5ea923bbb9f55e0dd4e2b38eb13461d854521e40b6ec90eab71a0fa21f4b44c2d96f63bb99b2f362c3ce47ae0643bd74ff1a54e7f0d24e31472ebcc3b9cc7d3621cc137a2a71212c55b84c7b203df333742076ca81b571aeccee8000a47a791b823fa52a7b403c3e73e07a58641b537609b7ba9e0249a0bd0ad7b1d4d9b4145ca91853b8b42934a3d82522a7239b6f346cd1da18de7ed4ba8a0f2b5a3c1da04b6fb4721dd6ab37e53c1a47acfd7362101cff9cd096ef3fd77b83bb45b2d46a25b7517f1b20475ac7cdedaaf18f063506c86573fa69e217da1820f7fea1e55c5ddcea86442a15490963d20b9f63535695be809a66af2d5f2d46688eec17dae4665cebaa01fd8ba7c35637db73942232a79bdd3d25c18f8d911f4c3f72435fc07be7d5a286eced159f928e3eb55c1a53d74905dbfe21a7a2289d7bee229a59dfda234e1abc691f2150bb0b02ec064f4c5744de27c7d83d0f09a9d294cfc691fa98d291dd1ddde5fe8813f5bbdc18e6d2ce6c30ae6bd512d25e1e7c4769ae3e1b9f4d26c32943ab5079ff35c2163e70cb9225c381bf67e84bf9546b08b9deafd6b2660aeb65558dadd8f4b692"}, + {"0000000000000000000000000000000000000000000000000000000000000ad2", "0012c8aecc0d9278a5af2943d7f8dfd258a25feab011e66922091387cf5f40e1484a18b55ac3e23c5d480ca2f27c9e84e0fcc3a507c99dc008834ba37d4609148d9184108f2e45e8c023d14930c68cf84fb7c2f800c5a153230958c1d3f662037e7ca9ef6a96fff22c3fa8db088dd4618d56b58574774402f6374bf8171410083a8b14840dfbcb4d666a6e4966ff13563c9d2e8c49bd66ed2da24f8a3e89de7cd2b68295e758422f056fa7e8df8a330e9a9694dfb4755a42d21b1cae8d07341f5caa53e7acf53ac1bc9de268f47d356530bc17557543bb1395c779e6852ad8b69ef55c6eeaf16826147a44cae8842f563fe3351f58eda593308d17b10b1a5870c814f2a305b4118a3c7566719c34ee8c1623392b309dcf6947e842e3d0f1eac84d5c9b70b31f10ceefab6c0a4fce65fc52029d7c4fdd27ea0cc63d393e6dbc341f5379410cd8d0f7647ceae0535e50f70405f0e8b50768e599b234c2dac691459dd7550ddd226c4fa68e495e5fdd24b3eba1c9a262840036d4d70f62a4d9718d3bcfcbd9c4e18a3dab16b02afc1a3e1103a4c50a08effd0d2267b623c157e1f253be0b67085bddab048f049b9bf9838a274e4bce8e693b9f3b30de952726d550919f8a458974d3fda1817918b50d0bbfd5fa572246fd6644d0c2be411d11e573d0bba22015cc8433e420d1f06342ba3de72ee174656c664807039a5ed00869c858bf8859dd7186c65fb9dce1d31fef91b8008b5c39e21e546c834a78be7d2a7f5f7619f64ad0a4ac7803969e64ad6bde5772f2029963e61f537ef61914dd95988b52af7ed01c313dc7159c160d6037d3522027a9c45a6212479ac67a8989b5ebfc28150f5097739ad5b751254b9fc5a45dec8adc710b0e117bb100d3613b0f46516e91ed351a17ff3c0167482f1dd5669c08c137b8955d2ac7d5157bb919450a003b887343e633cd806005beb042c1aeb6833686bc3d33fbc0551e0843fb1f966392e551f9b8375441e10495edadb58131b5c85c03a2a7416a4562762e6e7a0e8ceb87b31cb534fcf9b5597f52de3318a43d055c054a224740e334cda4c325f9416d8f21a56ef380ed1a4113895a5c14ab9347b5fbeb62b0e5848f7901b207e97b3fb6c33538bdc650a8afc2a482a85df7f8f452f894d53228168773045668044407d59f78fb0c830185d8f7610ba9e5261aa0499521d161d1c66f074d0950af2baa6474dffd9eb15a9bae5a0c71e74542d4023e558c69dcaabb1b88048794605c4668f5fa14a91e242ec33a4fbccde155c458d44368ed66af8dbe8709541e740cd6750b45af7835b4c6422e2dbddfb5f534eece9b1b6c228dc1bb13590b5066be3165f42fa20b1226c12567ade97b12965e97516a3998f46ef4b23ec78b206ce8a8c9aa72954b2648b5656c1a0efd43011c261dc81fb6c3fa87d102c190f24630d73432e012635c68dd619a2ffbe2b22e13be13fa6524d975d002017837bd0f6994c3ef52e317c963bd5903daf66c349aa79e3519ef710bacea27e0d7e6ab12b9dae1e908f097a877c3971d22a121d91b2af3c9db695cc0ea0d16d0ecc6619027e8b7f173e0f795b62d6856e3fc09847629adde84bdc84fb140b3971ac11004d032f5324641fc4e5805cfd69f944ec1fda9735158ffe4c708a5158110079928a4e561c0325492469109dfaa9011cbddaac04b106f7af371a8c129575269fadad8f90c43a16ffa8c5da2aede71d7ff9a16458aec966d260e4caa59a2238433b0c25798db632757d6185eb210090e91e2d458228dfc6169280ee49f6252bd983315355542cedf652c4d975f67ac08bf3f632e3d3d06d90d792aa1dd46d1cc90d121321cd83bc4aa004f7eb8203527c622cbde50cff5c5dc5ce41a3a6d93bc1c41"}, + {"0000000000000000000000000000000000000000000000000000000000000f5a", "0081dd9be2e0ab034c9a00848a7fc8e51d33b0f13937b7825e5c549d05d3a4d3d6bd6e3ffdc9c59485e50d15ea06f2211fe70ac755e96fb20fb9ece71297d230ef019faccf3423aca8e439b4ff1476401b5dcda20213c05d22d0455537425a9980f116c2ae8f56458b42af122624a8a465878bd6f2ecf2ce51e82bfcb4f32a203d6076afff25b787c626cf5714c27321fe82263824d7814619ba7714dc48caabd54c2e8ed5bb1fae02ebe90a72e6adc171b424245cc84b5b346a7acca85a45fc786c96e73f3cec7886176f090263ba94371221a2eac4a1af596de0ce2ae2e4687a1ece961a31dc28567a085395d0a5b04ad394b31cf305d7e1b4f5ec049914fa1d0b3f493842d6a666df128699dcfd909136c0b32e0f6ef62dfa82348ec9f45edbabbc3e875c08c511c29fdfb6a94f96a1023ac5beca2b6b92344830ddb76cd2947827afde346c82ebf7056f05ad1c4601e68571c00ce1046fd0e1a319ee7215899e302cf20ac5e36dd5a025e796a5f28530c84200d16a4d83e911baf0de205726bd734852da04bb9c3ed73b98743523792d7dad9b7441df791632b5cd2d35cfad6ef03208143c5f3ecf474aab456240eded187f72711ec20e0df2e882e61cb1ab02ae46f0be7f5b4a1bdfbebe1632b69e12e2a4ec5d3387c3878c5915b9c6bdd1129f46ec0e1dfe6edf69c2c3b8b76cce6b66b20ffb44e1086feec161ddc387a85af2bb1be9067eabaf3c42d81a692f8e1b46d1356496041a1633d7993a4a7f894a2512844dff28074dea48b27b19a9454d5d60d83bb77c9b8654ed6d780571dd199c4ced0dc315371aa9e30e094258f0decb4dd921923732a51b0de3839360de2d2635db4264e00ba2d934f5113a5f8b12e59fbcc1130daf306a8cf72f2bdb33e77c51b6ceb650be0d9c26db2cb150abe415641a32bf0827256bade1ddee5f031eda0ca5c28829d130a08be2dbaa7848ef74f15915bfa6a0c865b755fc580358de3525c1e32d1adf730375531f2d653391875592782bd1dfd20dc41899d51a607e1d1fdc6edeeefe441c3dd00f7e16add63dd6048c9dc47b837414eeaba1132509d4df7adb5e44e50896d2a9955781f2d194b1e82efd69f981cd53874805da25d75dff76d3fbcb41d6677c9f78bd0e9d04a75d4fe3c6435f6e3fa64f5a1ec45af2168a6c9d27d4040f894a160eefe5eb452781467ba1c24d48bbf5481af0b28ae0aefe37b7c9e4516a53a8c12156a925b809839bb9978728368f3031b7f72df312558ad3bcb70b4a186752ca1bcbf027d3ccb43ba10519fed169460f2185baa7149d637cbfd2c0a14a871f1bfb9c2a7e1cb2dc48f79f026b4792f7825073f8c75252de3c7d3816cb1e1edd565796a7568356e5e85ebc8d5dcd734e29bba9a0e75f6d63ebf78fc2690067a67f7dc50c052cb9ddf548fb56e612431a4eb0bea8df9771e2d41602c533a7d30c5f47d0a5f3213254adcd24da906747bd37df137116cff45cc61876e4be4b02c33a4f61595636bfd2687bb34cff36b570508a1747779e44770e2bb13568a8c40fea61a2362df2cd08ccb0345e7021bf1f01e05d71def10cc7dadc763b966260f660d3139f1179f9af3d0b9d660791a5cba4165e53db3e3715e1514be20d199ccce436347d4a306e0b7090649b05cb5cd9b65b1ecf781ff782b2f358ea16dff27b2a074e441fe0301a7fb4b95232ea275d5216eadd28a309634f251285f30bc60e1494deb686da4407f321643e1387c662ebfa8d78253480395f3515ba83f5bad412b935b285f29a5da37732db394bf6652fdb362f4a1714412aee0ba9c471551604c8baf6119a231b859f17464421d888756ef8b7c5de8860b476164f1e85395b806510cd34b47fd140095a065a931a6ed2d8f5cd"}, + {"0000000000000000000000000000000000000000000000000000000000001ca7", "018bbb465b2c7d279b5c006c91f192d26bbedb0b5f0fc5ff3c9b5f5e0d854427dec85c3362136b980f5a0ac03a46b645bc87a963b1eab32dcee5ba5337948f13926e35cbe1c579a9d5c1e64160a0a8a1d335583e0388f86c9edb595165b483ab2c7354fea1a0b8ff8f0464b3371ec419e150f471a805d785b0f1341781cb055ca0783408ae4bd11d509dc586fe04d1edcbdd4008481ab564a2c379c9d541598b2a508e24addd9389025404aaca0bdd3fa71c58c32ad8bcd232f85d449d0d1635d048d2a17396c52702eb38c4ca013a76978c262822065c58368cd69ef2cfc66e89b6c1c9d9102a28a9423bfa51fa31b617b464c86f38ed86d67371ab031099c50b723e0dbe46e0db92e3439a257d3f0a7129b189a5ded6ded1b90693a621b584b984d5f3dbbc13720262a6922a119bc112c44fdc3e4d25973587791714293a30d714b1fb402508a27924a1bdee1c2aba06e68e64141d98e9fc62715efdbc9d25bea73133850804dffef7205e97c45a3207e52d7dc991f65c4a684c5536456198c7615f46a84ea9522b925352f31a9e577feb965ba116496d440681545857fa7a9d5e90a5094b91ed7e1079dd8f74e09a6e96d88add89d9ec8f365aa642b59cf685b61893fc634f820d6e8cdd65db14458d7b1714a4dfdd10e66e8b4e5e8eccd0d98f112a15060c85cc3f0b2e8a44daeded2521822090de5b0adf3ccb3e8b6732f0a504994eb1cab6357e7b929d1cb5b1a94eb71237d4ca1204b023eb3498267d233e0e583904ff4744888aad663bff64766a4259b4fe361926d67db397fffccab056426cf567f5f198f785300b081bfbd9d602b2e87ea12f9f269725b8e57839374f537fe6f6de3abba272658e405f18d5bfe3905ce81657e5544799da65686f2586084d54929ff83951982f2485c56d4d6cd6a092032e29b19ce9047a39e6c301cfae9b98cce93114694175c954810e6cae1f883c065bc1c4e45c19f389069424f0360e86cf6afd5e02048365346411a1e4cbfe0410e7f1ff122c1ab4857f169d211520d02433c7abc37705b8ac854611928c310888a456f616cebf3f77f79187ffc5dae6c95991c015bbaa622a4e9c95b9e883c588cfd3cbc8505ef01c1e471d4071e3d093ad6ae4888ca9632989341bbcba3a519652016ff17d91bb168c6de72b29f50554edd0081b549499e77025621ed0b5521358ed1d6993faa923a16d3d7c13f31375cc13ad2b4cc6758b565ecd7c19443a447f93fe573fd7f23c10313616074e1a2d572bdcfe71d1d252faab664544e653638f01793c71dc094476efe24788cc89e9432fda4b60e52381dd2c1e3faf67a9a39a11e52bf6a70b4b74ddea2a87dd321c0ceec5695e040afd0fc4e2b164e73531b4533ddd5b43f3a2bbe0715085a2bbe58e50e6b489c570f8360f0238fff1f2c91c5d670cf1c367cbd130cf87197025250fa3f5bbca3ff5c65f63cc1834aff629a73d5b8f125832fa3221241f6c59493f93ee8e62a4ebdae2911b8edce4ba109fccab6c635182cf91e92c5ddcf43502fe06d0b5890838d431a0cf91d3f3fac2359a4f4013248111d15716c753da540358a75399ea22bda000038514e1e58f9b5d04233122575201d165e1de156f11e2b44d19192abb4c93c7181cf13626c454dc8deb025320e7e113225cbccca02566e13ef4f3d2dc83c703c973e5bb4743faecd0a629a44495a7c8f01e69501062a247fbc98ff33471a107e17ad17578926cbc811b2436d6671d469331e463116f98ffa54caf4ba6180a65d92f4233931fe06fa84edfc9a58280f47a713b1abaac49d28c5834e760e506b3c1aa3bc3aa3ec408130a5daa0f52af39996115648b52c2fb3dd37d11f04d465d7dca21f76b6abbfa8dc76087aef78258f27b"}, + {"0000000000000000000000000000000000000000000000000000000000000bc1", "004450e8399792037fed35c905efa3c21e38d52c6b1a9e1b7f36c9078cd3168225bf4a17ba006a1c33c105ac22792314370dbdda79509dde862661105dd0bc1734ad9f12df287bc4e251893becc8d9a7a0b5a8b202a1b7af30a845d1eec9741ae35dc7ef76a75fca9a0ec65dcb909e1435111711ec74fed6bafaefba5d270d786fb0cb60ca87a597b21c7dbbdcb515bb158d6d525f1fccef9ae98fe891d5392df1b3668547dcafad00ac04cb81655fa9546532a56adc1485330f51eba6398e2ecafaa3af693566e7dfa46a01c7296aba34550cbd71a81810deedaf1d66f2bb61cc86b89d3e602e29509ea7455a9b5efc58e44f7532763a219991ad6904ee19a63a61c4d1afc1943eff55ed4ed59579b4da0c02414b38863837ae0014ea4061373ee69f7bd6fe1f4a2445a3dda331d4fae383a5b7a10d118211cf4a27be2e0764df3bb96234d4f270a868c26d94774415023370acf062d8df19e9d7af3b65fd1ea6e53b9209296b434df2d7e69dd42e46b02964107e79a83a193402ab263fe89b9c1f5940e26678f667d933e4fba3741a05bf62ffbe4543f829592ff5697b330a30d8df2609d23bc50150404a8742316ad3b8b00d1a850d0d451ddd8bf5be989c03731db39d09dbfb0e6096fb9e580e883695be8cc12535dc0155a3ed4206208d154a9b1b7b4190f135a6bbed2e82a070e2fc7d2a976b68aa06d04f38d85b93adcde182bdd0d2d8fd565378a11d50fc27b26d5c2d73e7f668a1ea5702668900fb067712d2a7e0a4c7c60b68fa02affbfa2aaab58e1f13702fa397ac1adb4849d174c3990342619d869e9f8eb40e902975cd075e796a2a3add92f799af086a5fc14a2623ba6ed063f95db88106cf46c6a529cfe38f2f4816075c3000652327de28734c84fcb355b92bf0f5662bbdcdec0cd39d311ee4331545cbf685ea12ba057a00c9b9744f721c01d7ade055ef7566cf443b7b6cfb22524f88ac256bef59d7430efd312c38df0aebf20b29808d72609075c5ef231dbac4f8ddab7818dd915834aa7307c32e829d9f99c4447e591856cf2638447201c3aaa04c80fd7264ef10af5037226b8b7d9de7d84c24d44ea5939d79b72025514d5ebbc6f5d17f07a22ed6fa88b85dac7fcf6b9503fcc08a8a750f798d7c378f2f294bbd927fedb2643ad7e3864b14e89ba467014145e3b224f46d37c862e0d9ccb89aca68f81b7644d04c03c3a427efe9b507aa1b3ed58e43a29c569e0a45e2cbdfc6a3b47bee33bf265dedea7fb5dea2b8139020a22b1c7873a89b556e8be7043d95fbbdc5e60428dad7014baec5c505c521ef479091b60890713d1c71293659d7b8e0f91f03985db97a758edc799a801977768cdba3c5f12a17e1b7226a8862e17e5ed7172fbe0279ae6f994bd85bc499563f5617471e1a49750621a11e464620fd1f2af10a849fb0a066486426b11766899f7ef0cf979f3074da42b7df8d6671d5f7ec1b63737f6cd4418906acc2e3aab3892cf5572a59a425c8b7c6ea0eace8a597b60df034eab5b15714c01c0ca5264020f3638bc743e2124d9fa82497780cb70f2a44f7e8d8cc99c1066002d42c56e72eec8cd837f311df8f6a174fa83ae245e2397cf7f4a8ee84cfda8a21d2071f4e5cb0c132b94c5b46ffa593bd817f62590687d979422367c9c057c895d64dfac2d957375d2c16f186588f928fcfd50a3283e3aa6aae7ca7783a7507606a3fe715dfaf71c028e0455ca1866e365e7dce08600ea80adf7aa5664481befea20a994b705db96e0693d7a2e85bdfadaddfd16322f05621dd8fd740bf1abb792df20f3d24e3e3e309596550cf0716ddb2ec159c219a71d22d53ecca729c0d62fd34b2519a7d081767873ac5e5a5b9e7b3524dbf39a810ab4df4d044"}, + {"0000000000000000000000000000000000000000000000000000000000002463", "011fe9bc62c35e571b70d8e6156662d3977edd9c6908d716a2f024c50f3a17416e5352b6b647827951db087e2c820307836c956e53e44e6c5ebe07a7f97c9b57ed4fefa85ace10d918c58db34a9039979d8fc68402399beca0aacb415cebe67c7cc1e45ac26bf63bc60837dc6c6fb132df9c5214b2d6d8038a13197e5fb90e16b5f2c99e364d026e243a42c45406a8115846e438294fa86f18db2fc2cd3bd3db65e00f1ecbdf23f3056e7094fd53bd63064799d24df66702ba03db5a90400a5ed7c81273b5cd7d8a39196a5167270bbb70e016888a83ea2329714d92a2a0f7192605ba24f3ddfd1aa8dc830967d769da99943e4bb3cab1700bedd9530cb1a88ecb4b99bdc01cb4e53d75a3ae2f8bd40dfe1823cdf4f1466e8dc95c44d35672fd49e4e0fc47cb0ccc007931c4828786264464ffe85877dd9f7f88a011be5754d79a027747c847258071cb024e9a566a79016b58ea58047a2f507c2274f034debd7d19cfc107175661aa6d871655b95574b3c0baf1aada84fb88a301b0a4a69655ac035f682920566486deba5b5f9d221771b0d2ca6fae19e8f1a40a57aabd1a0925d9af410818a516a2a4aec1c40744a78a2d2865efb8fa40673f49ea91f3319f79a47f44f78a6416930fc59c074840bcbdf6b8e0d4cf72c028b3dce4b9aea782ba2a6442842d16791bd0fedeab249c0f6519e3583bfb6e2f063c77bde9c4d4c4bc81c157113f95f6bc917e1faa11538e09391cd92f54703307b9f461c4f63a5c94773bb3376fe02a52affa58470da36d34ade11dde697149b574ea4b94128b1d1725340d3cc4617af47e61bd08162e78fd30fe29cd64639cceb0f521322bb0349b14d53add6b47b161fd3cb2f2d0fece01b71c90247f0dd91da60b879521094a362ce0daccae3fed16277f1c5962b1a5136eaceb7ee2131039c3d70561bb430001b724ea96932162f54920770aa0982109a111cbe13a478694199a3f1ffe746e3eb176b1e7b5bc7edb1507b99a57fd07b1727af34376945187dd6fd85584e41a8f830e2a75ea29ff53a49b46684c6e2d945901a60708a5971b846871c8bef0ce37f41ddc583a6e57cc25e2374c989b42fda99cea23d1e5c83f17b17c401415439540d9857694712a94e47734a4dd8028bc09fa2410dd7ea111eabaee6ce6d6a6f641428e341fb9fc09ab158aef08e2584d9235fd14d855fb39d93b1dc5171128cfffd11b4fbb460386ff4b9071cb926ef733209933a8dc50497eb26c328e947ce4ee2974bfa2ca3e5cfbc6cc263a5f7844d58376e952fb30d49d92b209f1cba737c4516abcb468684d7845ce4aa9b96459137f7dd1df2a8a3581f56b2972e33b3afb01b97d6b1133c4a6031df831e65c15f35f41864e9e66fe3d173c3f36b21fd292d8ef82845943cda1c2d8f2fe489b02a7516d88d4e139843f07e9bcdad45e8b75d5bd280d7511c690d681f5125f9455cc6aa2564a6c7fd62210d391f99be88ca58b6ef772aee490a2d39fd8fcb31ba7a1df74347d79c64241e493bf1fb21bd158ff2f02c71463efd424dd8b7503841bcd23a20fda5c4032037ff93329bc5511e8c5ad0369fb02e34e28bd04e9121dd774a41b91a594c0c3c773f2dc35fd28df5591554c137795e248cfd368e588167b91039fa35fdd9a05ab0f64e249c7479a8935e09d791936afd858271c303a7a00289c2e96fb19d351576aed59370e8cdd2606b820fa88936a87b132e10a232419d1d91c706a32222c06670891d3d15246c300694216aa6da7dcab8210ee67a1ba218d17245e112825899236e6957981e9262a86f1dbd6ffdfbc3dcad992dd1b8314269ddcab1a2555ecef9d73f16c8a6665735f9421c9853ede1c2228f26c5e4905a0a6285230581ae4d8bf0a31d3bb"}, + {"0000000000000000000000000000000000000000000000000000000000001247", "00d9f8926165d90d59f842aa762eec20afe572224d40aae70f81eac8fff933997516d05a167286fcfa571c77cffd5a16286f1ab3574698c89eae18f45d96c242a325860ba39713ac73e549a6bc1e23a8141ffcc9043bc596d385f7f28296b05b656d73c44736b707610fb61fd6ebd52feb755801c141d7736db5695a9dff095b92f2897074fbce157484c2d4f3f1346111c3ce45f9de9fcab1370f8ec0462348de6f89f461103a8009dca2efe3ddc5ebb27921ec6f7786453dbc89ee4d1ff011da43c89d092405558aa070cf02b62ade8b32280554734e1d203fb568c3552c626b59142fdcec592e64a6f09c573855b3230577f451103b5c833bcf2e11540d2f472918579534a33297fc60bb5f70be0f6717707b0bd6b9031bf34022f7397484ce47cddc11ad126c546fdd05b0183fea23d22afdc5f108784db20b1aa424f89657fcfde64ce27007391e10b4ebb31bb70206faa8b709221b8674272ec2ff05bb494d9f0546190ef3d682942591a02972b52f1646d3c77dfe97e817d61358f0176c1995c8c3100b2f0a8df04872883e7c7a2fa0b16393f755d9c956d84fc756ed8a5d091e02f5474c2e72c165d4025315cfb2ca4a72b87a660a11e0bf47ef9f4697f12bb13da664cafc9b07f4b5c035a5aaad6ded6a3bab4ef44e814d69929a033ce14b4a19ab9ee993bb23b9a0c5e0c8747b6f83545dd606031b3a11e61e6227e6e6e65a8ab663d2c9617e2f1823568c58648ebf0be2d652a85428bfe5070caf6b8812a54bb9b51d014b9ee9a3e29254f5c9243f9bf022343b81c401a17cf35ba529e5e86eb7db968a5f043c08850e32bb5bc8b1a5744639d8fac8f9bb95b684610898b13f4b5594d0e857b3d98dc915ad1b06b4595b126f4b2ced1af4df4fa721b2a00f5b3090c9eff0c92f48e5ddc95c09a34b59c53fcfb5e7b19cf1efcf8601e58121fc18cc19260eb880cd6306ae482bb6402d04d4724a5ffe27b9f7b131e6fee5d2c915564a28632996637e3263656bbdeaf823bceb8eb33f6a5cbcb638b60b2d86a3073537e957a77f72e92f2678dcf6aa0db2793e583586fff2b858376174642640c6b49adc17635c6dd44f87cfde15f3f1adca9f2a3ed85fcd813865a3d3a655f5a7ed84a5e0fadc1e76c727bab2f372704e3b96fc2b43f100a8722ccb051a3cb6f2640e0364b0bd46db9e393eeef07c58dc7fe1c07ed669381cadcefc2ad88158fad653951d6de38d2bb6b4be5303650dce6d862973f927b413bf5ebf2d91a132c15e2a7a5f64fbd3a645114773baa7cd26967f77992a68037d9c03700cb668cea553f86aba392b2597baee9832814a89cdf6de65edc10480b5f2e69d3b88f2a2910c6eb8b474565ca8dfb6c27db948240a9982f9593124661d3539e3f5edca34c2e35244cd0762badcf356021d657e8356b82b3cf973483052afcf3fcdbb072e03b46f8c48cfab14dfe1d512d1de438daa2b36acfe029ea5e6c29be7494bcfa23ff728d47204019297860e996d869891ede19390c66932eab4d23cbdfe2c93048458423c4547538c044171ac2a9738f913346dac1337e48d7550c8b55c8377d71962b6664dcfb9b2f20c42fcd4cf03fa30295911e33cdff7ce0666d6bc023d60674ebd8f60891eb5aad46a5d7b8f509bbe7f870309d1be8a168e0755e7c4bf11a64881538b53099e25ebe4d801ac5cefd3c1d2d444a9e73a5018540a440d8df44dbc3171edbff99284eb55c43caa1dd00e1f22cfd1f3b114024edd18d50dc1316fba04fa32f680059358debd94e2f7005d92ecb33319aaced43e2ea50a5c8f820e94095cbe51e19d44d58fc56658ac11000f2af5b1a0d895112f2a619903f91c64d9d1f85f3b110186f3bb06a0b34c824677bcd53a87af555ed997"}, + {"00000000000000000000000000000000000000000000000000000000000005bb", "001ac390930ab7f47acf242ec04f4911472a1e5560077ab1761ccf16e38e7c02e8e41ecad5434f54fa1c16df6d2f4d6b7e536226a4176d3c9b99c00fdd6cbe3c556bff6f980688fb7a985dda5766d2887a5dab3d0103cae41f102a8ca6949476ef713009f184511c7926717f6fcb58f8e1feefe3c4eef94f49ae89b9b7740e7ff0c9479df179a1067144ba11620cc53b482cb44b82248a041e2fa1336398f037cde886703b9b9b940400a5298b5c62e3fb96d522f5d6340e3eddfcc9374272969090d7b315be45664ee8c03f69f20896f18b105b22b414b37aebad77515f13b3dc950784915228117007617c91a377b3bfa55d3bd0738ecfa297f1d009e1061269cbc195c27b30dd7b401d6f26301bd8a42dd83a790294f539141b149e84659ad9594ad4c70010707ff5019a867735e8b14782b0bcbb334a1ff6bb21d422c1a4a5a5a75fd6a2b16be2f538e569a7545300807ca1b61a328fe527879aaffb3f6a6c98fd0a462e70128ffc26600150cee5d2fa5489b6f7f05f7a831c742749770f34df529313209ac4ddd1f2865a114c45b026c780d28cafd7dba619785105cb0166dd7f3f0eb90cdfae5204319e5ca7b664cf128a809e793b6a19c29d4ef5d74440c9e46b6a37ebdec6e320bb48a21650abe506252c3f9fc9544144f398d912374df3544dcf6bce18593862dbf236f546bc2b22e1c51ef6dd04b5b2ad1890cbeabc1a4129f432abecc1c887ae6f08a693ef72465a1dcc913172f8bc04e943abda415e1890392806200a7f67d5550e7871b7ce0fc170f8a619a922a013efdc93cd5ce56f446c9859926dd2edc206304e98060fe1796945f093341b01907ab5fd396d500794cc14e1cc01734ffa9bb2f65503665c9b9ae924d4223fb6d08745670bd86afa5917fe8b03f4f9ff4d4a6306b49a93997cf9a5f574d643170cd8fcc6de00f0523292edfa2dd78e813662465a61ffdefdf337142396c6f5d33da5dcc6154859b808433cf69e9025079c8b96266d2073bffdd12685f48cf9842a11c2e21df9f61b43e65143faa7aa593b62f75326acbe469403120ab2c90843e0471243a1077c84637e8b1c2fbb50aab37af398791d2d8605a33566921f22c87e5cb6157fb290daf2669bed6815b2cc7f0eb9e130ff21ce3062aee1d2e642af55aec81c2b5fb36a638bd9b75114137f2bb3d64c6bc36cea53a17b749748137f256d1f34aaf248ccdbe4731733329fd5ad0254fefa25091db48dad448bace3ba4e75b991e745afaf7ebf3af230182b83bc9f579fb4677393e94a3859ee3cd13e9720ee95ba2874db2fb3a4b22ce81b09ca7ed03fb43a238843eb990bb75b0ab9237ad2cebfd8ea1cb26682273eeb546e0e3503ae10941d8d513c31310acd33982fdbad57b7f3cc55aa35fc758479fb63b63b7f3fb00256badef4ccdbead01871048c2728215465afc370174cbab55a8f6a6d454a33e5cfbdf09211b5dca3850739bfc202b4373fcdfd91d244202bfd3731d2a67a08f3f467381c7f3ee95fd61114db1f41ab3432bdba03f5ba1833ef6007ed8e411808a7c7b512e65c4b9607cfec18ea243bcf7de8f3cf0ffb152d21773948592b141180c662388d4f72643f6f6f541aa71cb9bb8441e0a4fe0b53c6b9bf2a0496d2acac6952c3f451f2054ac5639542948944c312db53a92dccd7b15b80f6338dfbe85d617b5b2add87d7df7fd0b69d787d24d6126d79d533accb3beef8e6787741dedb7fdefe24e82d38ec8b394fb1bdf66c476649f54f05e39f1c0a970acc9fc2ff6330bd8028710b90bb430df6f49bc02a35775d27ade703c76a95e61f1db4045dd6c53f79ef13848eb20ab0fc3fcc9f33588528c05afa2abf59cb69ef1c7c3f5bae9eeba017823edd6959f63fbfef1c"}, + {"0000000000000000000000000000000000000000000000000000000000000ebb", "00acc80df3df6ab75aaca389d1c9804cf85cd3d09b01c202bb8551b1ddd46f6268b3f5475df3a311ec8c12c293e5061f4755c047ca3803f0a87ec82a98cf824122bc15952e0227e32965bd614b7f0191499fbf44046c9e9f558b849b90e7b7033bf9c84b106afbd32412873a5da595f92128b296f5d1eae88dea0b58612b26c05d8915976758c01a061a28bf1c81e3615489352707c26895699a0551d437c0ecfc819e4840fb522c04ce95a0390c1639f24431e4cdf949af9bd61dea182773a2d01414404985beb65f363d38cf22d45c4d5110ac5d0e3a94933dc354b2985ffc4da26ad475f6203031dc234ba62bfd46c9f3dbb9b95292b914d7a9220666d9e53c053358f45792dd884efd6e6a7a9831c547347c7099b314b3fce194bcaa66aec755237e78d72604044c7ee0cdd7f5e17371b1d1e1e8dfcb2e61c581a105eaf069e61d9d7fc8a00ee96f2787d9dc97b603ec0c3482891d9910dd72c26542fba4f6413c7e520855739b42e912eb7d74bbb0c97883ab555c1f7c4d082284b22446185ed92f52c26a722f6efd4558cc39240da45f0562b40bf2b034ff34ca770af5d89ab819053e886adc0acb2a572cc56079e92151cd1efdc8d0155917cf1a7931dff4a0946fa7d9f9331ddc5fefe410e7a6cbc58b3472e703ec79676d632f3fedfd141614a510af84ab79ef9d2a81cd53ad0eb950db908c1e0b7d964e6b5ffb8badaa23dd29ea4aa220bc3ad4b7103eba597576327bf24f3514d9c2b30188086e31bd12726c6f085462ace282e3faf0f47c6b622ebef4b2300f529a77d47401d699748b3fe4a03a3f8133f5f015956c65f1d587d5bf2361d523b512e8cf7333dcc01aa85190906f391db37d71e7451c4be2d0d916f7343909d348d4a15cf7be5b34b1445a5925ae30b01d683fa644849674b2c1d78ce7bed3f699f36a251f3d4f00f9822690169c8f088a4059409f5130784005b5d51a780647ba0ee4ecf1ef057c2dde7f5e260db9386c1d5679ce211fec33dcd2d37118b304c54a98b875ed38a65d5a7970b10bc994156fe555de1de1c7b2573b0699e60a82f1232990a9b1dd3ace2f0de8bfd85738506184892cd9fcc94774281eafd50ddf80a7dc4715075f734e0bdd8aeb513ed29decb9ad0b3c089a161807da806aa14e1c2aac8422fbdc37ce8900db1131eb042e34a6f192b7b53184b152a929c328b946f9925c2f051b2e959451fdf5e699e4665e9102a37e9f4b4c0c5f547bf9d9cabff3059262c1a023f61a9af36e3b1f6121d2bacc199e648e6662533c171a05baf37f690b353b435959763535d9c4efc971935b373edd80af640c9e03c3a00f815368a6d09a5c8dfa2841bea9281d54ba85ac498a5daf524594d57b144a06285960531e562a5da61630497cb704afc6f778dd59590bb9f903fcc38623c23310ddd506f22f71dd69f3b1972df123fdf2da6ed74f251263a5860450bf0de37cd601f90861d3c02eaf4f7fc13021de0628b834ac9b2723ca177e993c5636ada9e5518382c3387bb549bcd8d8460ec1bc835fd80e2acac0ba2392e41f42ef645c45cc31bc63b7886e9a13a83beaafa3dfa746c1fc19bedd2577bbd05ccf246f3e4356b2943ded55c5f25279ac4945aeb350aed435af3ba8547552c68670defb59100af8cd1e2be32dcf8ae3c821924cc09f5b93bcb0304ee7a2c1bad8fae2cccbf5c947d3ed4578bffd80121464e33fdacee2a97c5f58511aff67a2654cf9829d14ea5ace1685e4f6968ed32cdf28eb7a08a39936610c9b8bcef04e8180ede30149fb3e6a8180fb1501f06c29667ec22c68b3d5d279c9d6fe8b0f6a1cdf2b7c110d388c98c56f5ac449e23e0e3013f68044389d2512da8557b907f294f47a3326b1625e524040be6960"}, + {"000000000000000000000000000000000000000000000000000000000000159f", "004c6cb4d71465ccb24f4228ef9c0914b3efd2e2972635f932406cc7f5c558c7c832f30aca7ac5f5b76b1a8f63c3ccd640f1c2c6e3051328b9d5ab4e30b5a033f183bb080d1943136179754c52fe8b42077ee18d052cd3d3b9d537b5cfeed3f3c069e966991016c3b8201f09e81815ac91e557c60d3be1538e3477b56beb1636ad0b5c4643d0cbd438e92571182771063d6d5120e5c4689e0ecaf753aa527bac202ab1880699d14a0068cb730310ffb3c8d2e2bae94f9f0943d416495f1100199b535ffa750a8f6191b0e368bddbc5d1368908c07069b8848f9cead9b72cc0c213b1d0ed5827f773181d6b585cece5a33748925761c4ee7ddf78979110bb1b88d758661331e3e428c621e8198c79d2992a2836df40e6d31068e7c644924aa6e7fd50a0dacadc236ba79171d9f821c9f444edaf483485ec55b2473444526fb00d7c22ebf8dc048478397dfdfaea91c6e102e8d8ba8c64b58d7b2e3046d4ec2a3a45f2fa00d2429944de031d9b9d26f535270ad35131afc631fbbc03d06638b34b7d533e98c9cce355b7b6b51f390d8a1405fbf53547911dbae625146667af8a9bb258ae56041a36b0d50eab75debbc60265bc7953053c7a07ae0b2b2140760ec2497c7b45eedf662d558a755d3b1d05a2691829138564a4f71645c855713663d79613ff2d5e82d6cf53002b54c683e660aa706b92d99edced04e72670b8d449f73399d1b529db3ca1786efb14461f4bdb8b599e90bd5f9f42f43a49762583b79763f71a9c72a45b0ffcd084087207d84e8e24a6d64cf9ef2069ee5e18b3eb57dc4c7926585437373e8e5c2f9e0a9d3c69e548ffe28110e2e319ef91ad65c45361550aefc27f23b80df5f0ee13f3acc31c1ed68b58766327568ee0dbaaccd9639df3280f6ab232ac18be416d391d0f1f039bbc2931eed4db246aefddb27a3eff3d006690e49fc57eb076a9d3768eff3ae5b38c51625119b20199ee59162aceb5a1c758624b94e5a9bc711504cc4ad940440136958ae2ddf73bf03da892db2bd235e065f30fe58599de23e9b41fe7fb72be0eff78f00290ea95008d1ddd2babf4489c588621c9263727bb1eb4ab5055c8ed198bab72dcd4fda463506f1db4862e156da711a0c7a128909308d6a3e79dbe29168eea32c0e9a6700d581d032069f60b6abecb63373d8ac0012a43ec654fbda7e4a4c0251983b644840aabb64f0c9e0604dc5949ad2435f4a4455d4b7d35709cef650e8e79ab9e5450cd3b97e26d55efeca219ef731ec415cb6e1853ef625baa4462682359173175aad247c6041111accc534a3f9aa010a96e2728319719af6e732e2fb350a9115f530a4ae89a4bef504b492b7e13060464f557e790dfbacc99f46c6bac28b9d250906466065c11e37f183b52eaef314e20b633c16fa7b76afa01d2ce9379d054e16e4a21a7666923c5a191f7a23622bc19c7c4f65681ba55d35e547fad4583a614327c070400a2eca6dc038c59219873616574f13e3c188125e53cfded90d9756f3c03c0f6d4bb952e93f34170056bd2f2dfe9cc6ba41cb2a7535994a11326160b152048e9e3dd12cee3dc2e7961aa5aa65f0d093c1bdd0d0c064784d9a8f1332a59215061727ea27aff230647473d6044d5d3e6ed40969c94e7794660119ab0ea01ef9d0d5786e8db6603516a6aaa786a8b439a24a30ec11bc28247cfefccce234384780c0a0efa14b04f1027b97c23eece6bb51ae40499ad25c9552c2dc050107d857ae4647409e8e051c8b661bc1e260551f1580ce0d7187dc6cd968f9411fc55148f160c2351757e0d979597ce6a29475b8186dd16d1c2979227fd1f0013c4f4f5fba24ef33429d9756ae82d8f605a1f299e5efebe8de562aca1487db648ed7371d5e42e9d27b0"}, + {"0000000000000000000000000000000000000000000000000000000000000158", "001c93009f8bea13690e44cd634301914c568c720504cb4dd2940e05df7c715387076700d8e4ccdb88080ae0f27f0a6402532264320c597ce6c377e47cf15b0e79774c53cc9cc52ecae16cce3da43ef444fb6eae04506dc0741700573deab0c367c3e3e935b175fbbb1857e3803a24e005714821a342189b6d97ee7fe2821061cae7fd509681c8e8a6d6d3bb04af3079bfd3973539ac992216caf7809ca5478866649221d012a4fe010841dcacd822154ebb77f948ca7d4e45623b790522fd4ca4b90f9f41e814d2e00920a9368e899c4acd0c5aa6201acc973b444be2abee44d968fff81440642dfc7523bf9ae8a57b48e64110c890d5dec53ad2940d28690eb3f01975829015cf55f7f501de4f3488584d92da6cb0b19ddfab35f611e06481418c92db545b36566780ce9cd3e5e9eaa98d5ed00c668c2e7e51e96d7097c40de598713db776ec4cbecf7e9898fb08da0479a2e96152f29be672426345ca756d64af13477f29aac6d8204ca3590c3883e8fd5d60022063b74c6f06fef7b1b388ecbe7acfa576f43880bd6694b41e9a1545639003170985842318ce6bed782b5dae5e654e06a1e03dbdd7b1e1dca904d8182778b22d9dd9d3dc089c85edfec96683bec572a080e3c6e5904577dfa00e559ce9a0cc85b4e26921745f98fd6ce5f08c792a23416a8829dd14751ae6266eac67ed5f45413b65fb0671719128db3a1f1cbcb0fecd7dc3813dde6b29ce162d9c6f994ea679830c230e54ccf58f6674db43dd0b7b6b30505ca4eb4427767885e6590a316efaf16b2ed172a7085b16c74013d4e8b2d2321200de76fb6d11346f30266b84c190b681325a5f97e4736cc4afd81cfd1b1f999b9355c122c448e033adca410496901e161f2346c9c7704b5efe11dd1c53c16243e8bdcfee2285493160ef085facbd2349516f947226153dd52b00b7a4aa8f0983df184884deb9510639d0b23bc55f5a29d372ee98bad2e574e5edd34f27f6643974b467011029f151d850dd4ce6f1cd714f7b799dcfd4af982eae873c579794275762831698a945e57ae6dfd5370101cab4eee3662b5c64b028d4fbdb46b3f3ba3c1d61c9c769e99f8fbb4bd03675ff43a06a854d1f516314b412fb38f253a7a95c167b10d08f7e19d53a1c473de7a2cd246fc899cd6f345987f25945424affd7ac0c04f761d9915fde9754739edff6e71678f21c433d25498f5195b5218de3dd23e370b7a4fd64221fe85720af59a5e725144ba8ff05735b7f47c57538af672b422eeff0ba719367a2931ac36f62cebb58655d38d01cab24af0a1b257aed0ba60b886cf6ee30d05dfd492f29ccff5020ef79636a76b4ccdad03f1cf4db811b4290122163a0723dbccfd51086f39fae3143798295459bcd2977946d3de0210622cebca52e36943a9c28029490e07199b614d00673a6f9fdc36aa35ef9b73a0970d4fafacea3f48893c677e4d90f6638715d839d2c918dc0f89353fb6be2f7fa39bfe19a66bdbeb3b549fae6b2a29932712265984bfdf882b63438d4aa0f05f947c984eb9a47ee4d25fc214fcfc3211ebdb7e111a4ee4dde1e052b5c9d6621abe0b866dbe0385bed079fa914a0eee831ce2522d026b606851f8aeffef827e0b7aca6141b60c75f666c43d8b28e4f7d94a835039717d5c04af924d5f2d29471a91c9d23476c25e02c13599773298a71b617a2c56db97151334e8a06224979cd8ab3a60ac1479ac5a5a5f37e4d76f65b73165b22cfd6149766134e06aad6236eedfaf43f785b26242e8e8b661bcf8d00ae045e0f3af569e2acb4c4aa3c242bab53b8ac39fa0596df8574fe828892572ef8273e8f90474e1b6108a0e42185d04522120ad8517f31dbcf2485da1f211a232371389cb45f272b7eaba5"}, + {"0000000000000000000000000000000000000000000000000000000000000606", "0038adfe05454b9b32bde2b987b84eaa2b67f404a929cdceaba42338316a7053890c41637962dff6779a092d487520885f9484eec256caaef9e0d9c1fcba58511e8e79831970ef3b86469b6e728516f825988c3d0373fcf4360bfe86dc3345240cdc51138ca67fe6b60810e8c5664d09991d86a0f7962672610a25c93c8b1b16655e138ff9dcd621c52f7cead36279ccde199f2814afd8b98a30d98e8f79b0eacec1eb255afe49fc026a87d136936811ea0e7203135c2b85292a09b7730940b4a1252a0685b6143500352bcaa6f9ae78f77618aeb5f2e6a31055b7fcf3c0acec42d25a011d168f50397ac8a7df1141bf52f6bf3bd52a79f5987593640c3325a9f4d4a0db584e146a4e44da3945305b3eaa373253b53fe19cdd66a64902a0f961171dc75aa34b2e5aa5dfaf26a1b1844fd327a299b2a2f2c858ca1a31eba5613113b6f7f6a24409df3d8efa2bdaff945b00be977a889c3a9f748fd09e7b33ad80ffdbb61ffa107186e5bf09b33882ecc46e9f56a1ce0d5e78610604cad340b0d16af112b4019afafa4219192a7cf418219016e52695799dd49fb68cc1e6e799eebb502a66049d4ff3e20f5261a45cc7411f7b54ba7139b68ca30d85c5e822de11cb02d2a1b4cd37de192ace990fe70d8064123b9f3281fa53374f9265d55a612436b86c1f994f272f7418f5e5151256bac234eea6c1ba1e7f0c073cfafb3400b5a2be12b39362d010d8e9cad26727c3825a4d8a4beae68df31ae242c3d99003f7de923415e7885d1ab0a550f8e6de4dc76ad75696be78ba552e431bf6a1c2ad46e635f6a9cf3515a27ace66400f75fba5235c9b6351b04152048e37fcc6fb6a5a4640d3c5cfdad4ad6ba55014a5b9c62b19eab493e12c0f84c5b086610e47987f16b583422e3e1c803649b91593ba53626a0b3be8e677697553cba5f0d5dd774500c4f323b2939853b05f323269c8e1bd942bda22e60ae08e9e85b12407c2b63508173d59df5c145e79fd1f46752b94d7db60e05da3d0465946a6fc087d19ea328976de1bf562bdeb9af6b58539d451d2b971209305706b28d2092f40afb180e427d248ba31c036bd770729239580c9bf6747e120e126a3e315709e6d54670b99945127c822809e611178a49760ad941f74ca775312bbe91f585baf075238d32b4758aa83423671c201fb7f623e4c2c06e65cc5897dd53a8a786f58dd66060f293743aec6ad8d3f0229a7f20c3a7070593ec20327c7db38a61bc1d84f709dddb6cda82c100cf713415f7a5863e27d355d8c590555d0c8e2548dd3346308ac55091f4a58f75166633973642faa23bedc03ac1427f8b0fec9c7852659d35e3ae9957f9615fcb2f90bffb754c4eed927f642311602a0896c91fda519170d9af22e569b630b19bc039cbcb0ac55203677a4bc02df3e4e37d936e5cc6941ce49e2f83aac733f423d175a4584544ca8bce2ef74c5cde453755da4d4a64f257c9dd1379a5e5faab26724676a5bbe5e6afaec345b66558a6be02527678546c60143e5d64296193231094a096e011b6597993c60d439c8f6eb3d825b8ee8176dc625580a633b0db133e870cb35769625b6d85636806bb60c2231451cd656988167152e745693c30460b97d6d1fdfd5b149eaa6abce72d74e947476d68b04928069930f83e8a3bd418e9c39a4e8d6b607eb280ae89b759f71712bfa7915ad6fb8f899f77139b8f80c02bb301d0cd314a563b0fb11dcd359120ba9aa1142a8433f1853debeb1802a6eca725a27aa4e5ff21707ba93310c06dc02c552634d5d75ee69b37f3a7cc2180a64ec9e53da45a30b65963966ac32e645bdfe970928535ca4c93636bc59b0b6bdd6eb28869fda48282620aed0ea12a6d0be0c77a57ed2f1fa250f5c42a5"}, + {"00000000000000000000000000000000000000000000000000000000000004dd", "000229b5f56c140d9cce93f203ab56da28d85b8416067fcf6142a0acb1f38170c834bb4b763ae336393208b69c3faed40baf9ea951a6fae2ea82449ef8d8700d9c0c59825e2933e884811bb5ea95064355564f5a002bbd40f5ca75733d9a00ed8f594ae4c1ecfa245606ae7d04275e30698030c242e135c7a4cf3a885d0e0ad829b9b6960ad7af42a183ad61987f5d879b5bca2a30060b4ccfe85b7167753442c8618ddc821a9056001632bba8573f0fc5ad3475cf34bf4adef97c521112ac0b351489335d2ffdc2c009742520d75b594e651117240c1f571ca2e220c8c330d2635ad037f9653d2e4cf979dc684c4f98e899d0f2e3450ae2473eff4a006581abf591ef832fa4009e3f513809073752a97d022837d3c8085a26d9bc91b96119b030fcbbbe3e65084394dd498d29b56d6570ee44e5417873a25f8d2709eb169e8de22277b05490a437ca78e5bc6b79eb2101c7a6e13d1ac067ab6436c82f4423ae5cc75e1caf12a2c9da4f1a1aa11e20e3fdaf7d3e455115aaa3a709446e85c9ca86590dec9317a6b93fe0cdf9704fa219e41a0a65e6a9b9aaa9d2c8293e2a4a13b35716e00bd60b354e09f0f7d3aad140181c5c0b20747ae94716a45e11505cc1092f38922aa4e6a5dc9af8e742882e77b232be91a3353c2b65177d3c4d017c6e9a87fe3d7e735debd1d224a19ca61c1a5d5d77184219e63b02454b552dc0a2fd074b82c15ab141dcd5831c896b0fb122feafc787d6d89d3124631639722d611de99c02f48cae7e427b795851169f5159e496e160581d011b7ce5136bc7fbfef9651c58917739ab8ad75fcaa002738576fb27c01b5971e0681db816908c7e70ba003d20bdc541d08bc385ec0577b47d3f1a788ab5ef5510ae48d0aa2eba37b61d414c8af60b346f415c09524802b4eb3968384bce6b65423143776a8d94bac18a0040b94f62c1a1ccbc89b20336bcf08d9bc43826a8264dc6b8bb14b84f6fa633674460b356deacbe8ed1033e8b4a504f74ebfc101297a140b198edc92a5d17059cf3a5d1c62a30a02041b96093b4bce7deea7a130edc6a1e8f15f7e34863b2884351c404b5748bbed21109e515dad10ff99b26f5513058f2423573f5427e1456a1c2f207fb5563d1b36ed4d91fd4df73a88d615bd74ec51bb14c53a6cc8785c2bdeb62e06b1a8e4600d2dc349a968a31ced24053592f1c804e806eb3ba28b2accb725d252965edd9aaaf695256cc9cbf11b00a6470ef130f23b4adb530dd1d55445c55c23c66f70f9830960304c17b8c7ed3b018344c81693df1d46a0cefac4bc0074198f2aaa630863d6515ac471645dd2bff1a4b0633333da8065614cffd48558d710fac000e9f3ecb021f8c1bd944b3720e4244598fa1b5ed341c87c5b8fdd676c5c672a5633fcea06981758ff8f50048f7a18e4226dce5feb09ad6dc1310cdcb0c2564028c490c204b546c6a17d6671260870a4d469b91dd076adb89c19e56351903b2a8ce2d61aa0798f469b9149c6d5f99e5455bef79b680bd5b3f5fb069be3f3d0237a5f77406b6f3e1a1b24eb0e4c1ff6872fff7f51f2ee2c6860cf15b9482fb94ec6e462706beb9d65d147916ae6ddd38bf67f017bf97f98afb67c4dd3063202c3e42d55745278d48140fe9d7dc2ed7a8df5d3a0a4d6166e19e415593c5c538677d2ff5df54d3984010dbad82a2cd1eab5b9521555fc4ec4693ef17dd011b8ed7571f9ad777902ae34cbe68ff2323621eacd43f6a1cb52fe2dd8ffb6827e4127443cf20e05c32de11cf3b52b1856f3c7d66e12dd5665a9ab8193c731415a6f8fbb891bd0b354eb513563a125def22594c4e35c47215f7b70b3ffe34f8951e51607270b19b471038cae7f8ae4ff5ec803da7a08854cd7b4954dbbe88"}, + {"0000000000000000000000000000000000000000000000000000000000001190", "008e0a8d28735fb9cf5f448996d2ba76d7823f434f10d6a2cd14600b1d5deb743bfa24557210157f719505dbab16bb47fadbfbe4b20dc3cfc9ffa298fdccfb096b2ecf484fd30adeb3b6939d4cd4f33dbe7c65ee039aa58e7061e91b9643c16c0ea8eadf1119fedb1f0cc59fd6701f40dd04ad68a934e64d9a3b53f4aa3f2f4edaf01311c2c4ea5084278b472c9dbcb03e217e34dcf28f195c7b6d952595b81dc7a87fb7a13e15bb0406ea3744d5804fb73f280011dde222bd86d94b5e12ded672a5cbd51307c2e307b5d4b9e21ffbda2f4b0893da708f4c64c4997c526d34a6586e29837d843a1699441552d524efee90e8279763f72b027e59a87a15fd01adfae31d87b13ba75def47c8a6c2ae764d2f1a820146de0d779bf0433304bfaa66656165ba62ee2216ce7fae3c698bff1704391af5a42d51f39906254d2b2f26611e72ebac3bd5f2cdf85d53414ddec2cd037bc91dfe8ff0572ac7e8a5b4ffb7fe4311dec88d07e997b01c1feda17d67f08bd57ad8b08b66ae88b203f3e9579189d20ec1bf5124ee7caabdd9ccd6bd56141539b2b5087ebd08c8a3c1dd7a27bd583c6dae900777fd64f4b8e9ade68c05bce7c6221ba0b85ddc9e2b660da1e75869d580a3f336a56eeb77c5c19fc26b0c73dccf9218c7f55831d1e2a94cc7f9922331d22e1978bcba34d06b91d356a5c60734d89de3cc9e48380b4f299f0493e1d52240d801e67b4ad61e9c966d6c46a6b38ef4ab6115ce7db5023a339e457c816d32e12b8e03d2fad1b88b41fad7810245162ee6c4fc6ccf45ee6f880c954af7d357280f29c1c912c0a99d4fa410a66c7be31fc81530fbe5c35ad9f276c6e9170d8137976e73f3a1c885ea7d7466efd47cb19decb9181d1468cbae0432d915a5a7e7327f4ca16b0d335fd7f11a2e256c59d487679040d5b6843a416590e9583d2202c5b61c3588b4f2e68dc49bc6c80df678b41c80926f793e42225d156d81e22902e777596a67eb38aed60308f7791d21d02d4670e4afdce1ac3d38c5f6056e188cb10003dbd4a949aef1adb5e0549d79c3faf719143cef9a99972df9394e73aa91c3ca9993a0f4fc571cf04bcbd2cc3bb6cf5ee4d0c3c8936d496e5aca6c28503eaef65c16d1d8f8e2f0837f9928e2e45ec3663a54e451338f5d3beb9f7506b3b04e6588dd1ad7660458bf3cd7d69fb0ce1cd26bb85bacde9c1137bf510b6bf0bbc2caeff8acf9f3d38f61d74aae619af9450af04aae0873fff9b0b7519855cc9591d0d518f70a19a6594d478e60d5178494e547d034c7904abef270055792242dcaef3a7acbd1a9d76ba2c3a40e9f9a740fb4bf9de6c402d7bcfeb202e37c5809dc8b1a0cdb0959ca22c88b9329bf7dc2e435c0d1cdc3fab01b9211f088d01cd5bb91cb06217ba995ad3d0e03793c1903e64b43df12c4337148c067749636554428cbdd0b203a5f0fcf38aae1d83f562c8bf37e99e1500f18860974aa731d54f952f35f52716248b7b9c8ddf02ef51d8da60aaa78e4fbd64512d752c20489d7e93bbdf10ca5adbe825efd1f1e60356ed3ee16464ccc9df6951eb12720144831c9713f45c530f805557d873ca94612e6e99c161d2ef31221e1524d414f7b06e89acbf5216bee10e70c715f740b85ed8bdf15b6181236af6e0e9a7dcf33974ee922fe5682e0c87ef2b06df73095320c82364e28fa53c67bc6cbc9573fe6347bdb230310a221d648dd717fbe88026a52561f77032e9cc73b271c1ddc75e626155116c2c01ea4e1ed232c5e5a451056d10cfc13c4454efeb6fdd141162e19d7f274782c45fdc70e16e7bb3a784390e3f71052ab291aa5d2112501db51250917891e58e283d78bff3fbbbc7c4112b29e8ec9fe3ee3fbb091f456711d5192bcd9cea5"}, + {"000000000000000000000000000000000000000000000000000000000000130b", "017acafe3934c0f3b2595a9f9e71c84eeda3dbc2851f9fa4f3f91b641940d8d2522723f90642b93f56481fb42edb33d63983b630d21f04a33c1102be9b7b8829c32739f8d6ee22d1afa394fc414321746cb7b58d0b419c7d33a02db75efbf54eca5f7a33307d5a7b570eb455a34ab3a901e11f21ec8f9db329a1b29e7d370e56fbdb418dba8363ccc10dea501a2ed0825a4b8854fe55cf8499d1f8de6aaba0a4fffc335b43dd981e02af1c719e0e01bf236e52704f5db678d24fb8c17628abfa82bc1249b4d4401409a1decb3ac891dc9ba539d9776a5392b7b7eb10387b786921f2534b3ca2fd3db8f2ac07d4f77974d165c6dbf59379b9b039628c0376b0b42e6e4f41f2cdd3084cc0d3f5f85bf2191f0a4337386326cf9bda72d1c800ffc3c649447727621a30ed8796e085af0de481ccc2ca6bfcd7c9f44cbf287655763ecf5ff3b1e835f77beb4ff19a319a1acc020fe9ef526da61de2efb0df7a3e392cf440ed3d080b1e6cdd9a8cc3ab02ff94d684bd725e4c3298af4c1829e76017c84f3bc9ba659226d82b25688472098e2b69eb1c6ab0bfabc53e66490c521d76298c7f8baa0be26e87214db5090b19d43867e3de7eefee7b24d62165c966448ffb937d0093acd43ddb018196f415fc10b31d930e8a1dad2dd2a17e0eff383c95cb298ff32481a5b734f3309fd520b27ba1d3604e5f5f1dcefa04fdc4c2f34f1354873c5059441b809347cd3e233538b43fa96867a7ab8423962662d4ea1a24033b109810f60f33b51fd85dce52f36cb93af296f51a3f51bd32465fe792e320a34729e5c504e64c15d86373552f08ef1a4cfccaacbb3aaf31e92efd971ec3933d56a3093ce8c719a7b619bf53f32a94b04c12f8cb1be5ca0df68faeca370e21f8d302bfb2eaab56239059f7a51734e92d609bc3f926d644a65bb18749e4ddb97e0c0235f514a029a45dc54fe2c54e192ae54fd419574e55401b6b1f1c3e474a66459e3dad6d21847b9489f9044dae6767d94ea3f06b524caf484628c8360b0ca63a3cd205e81164ddfd9c66ee77d055eaa4a616edd2084e16ca86830de419b79415aa7d4745b75e91017409f16d1f5a893c45170b1336f8ad16cb340659a1f310ec4b76b34fce27f284b9d6dd6880eed38459600117071fd95d11992152b4221483e077ad7b70ad2c4602c01fbce1dc1697d70df210bdaa23c4a9103da8bc236c2e1918dcb4dfea88f6b282e5a753395e7fe4f8196bfd30520ad953f932021833985439273f1d0b6a19a4dc7d2f8ac9e9f20cf55c72c5eccdf5d4109cf81420eb9c1acf8d7e9bb79736535bdf4a65acf9c7f924a1057c3f20c14f2b5d8844fc48ca2e9028fe936d283b9adc006e6b5b7a8697afd47ed29b0c111d7d5e438cbd7b5220dccf7a2b36d5325eb2bebf0cbfe70d0516ce827089c3614f5e907a3bd016853dd77a687a34593360215a04ef502e19ccf4e0307e7588bc639d0c8e4bc01be77e8751f002a91de6ce357030130e9622949cf56764fd85bccd8a17cc7ed3ea975b976524153a3d6007a9e01de09801a43b5235518d873857ba24811c29429819ad5b7dd5066f57fa5fe10f7f3b6e1976074c1fa26e6de2c5942352dec3e5d9f29a048240e8ede2f87b8b4dfa1894c1cff217a59f03360894060a0e44e88bbabdece032f511c39425610696d2622921bcce6d3427b9ee35cabb535afc96d2601ddb360e35c660eb4e966576eff240edfebb910f4d1107b820cc1f675cd1b7c8bb2472b0b9beef43797d9c6fe30ab33a2c31979d01302b03db864c66b163ba3a369826f331d65f74a71dc66539aa76fe765a889096264a1b82278d78d76df7a9b21359cae5744d28d3eae7fc5e86acb7e3daaf4bf62a196abdf7f80a9d8319d242"}, + {"0000000000000000000000000000000000000000000000000000000000000154", "00a5d3d4fee34b1fd4fdd07abe65572e81e878262f06de2c3cc845e4074455648fa6b462a658ea18cf15075fa926d4dccce18f9bc12ba64e55dc9521f279b121fcf3a89dd72c3f6b03626f92a8b6ee0cd938b06103f3183339029f12317da6e277b95b27be997e5c1e11a1a8c273a86251c3324292d96beb8a54b69ebebc1546578c32aa0cbd7b70c63023ca035991d04f24df26ee278573dc1b7ef736945cdd7d6366ceb43a7ee512979207180be214c0bc8246bc695934e42ac9aa921aecad62106ec14bdc6af4aeb14a7589a280745f5a31ebae70422c8cbfb16f0336c625d3b2d7765f55045bef7d12a9dbfc15aa1b67037a720a961e621f78cf140d6e9f791a7e4dd95eb598acb370c63ac21dd5796257de205e3b0f11fcdfe6ee72b9d8bdd07f554e5e158a4bba9aa2af078988152d11d8ac7dfa06d957ce7c6badf323b3c275dde88a955f6959a7aa701fcd9000e43e4b27d850f7a2ad1547df42c14f808dbcb2eb256af40a3a1d348af684b491a9296e2a4720f79da316fdae084c124235ccaef3e84a478d8efabe9ae3615b9623976c3b1d47fbd9194f875fa75e6d723b5e9a0ef05fb7340b49cebea8b27da369aa8947fa56a5ed4b58b619ec2b6e7b7b68180cfbe28ff2edbe7e4aca16385a5122520ef544a2760722c3bdca8347dedd043e6646bce22147bfec2015fc19d3aaeadc5c5d012916ceefe7000d1e99e6448247a542fb994fcc2f089844fa957e5a958f736836d76b74e3a16a15b872d66120f56a2ca7661d2d5baf82e2d2b86e40c6bf4978002c7ba417dee26ee9abdca32aa56e46e5c6a26e980e1ca9e9b623cca30fbe8ba57a7b36850e4ff25ba8911d61da4e58cb7a5bf97052663fe93054c3114dee5221a3818d27238e69978e928a62ca51e4a9ab927eb12ec8c544615968b5dee90512ed61f76ec9e5bd0c1601c4f95b0221f55f345a722e68249a8c9ae33cc5290e6add805dd8632fd3f6f11d20df3622fdc33fe12619bbd9b2e6cbfb349503d4721d61f7556e9598850b1f6a22fb98c84da6f1cdc7c474cd4fa29a87bd6a5d0895f9a350c68161ac25b25a4a308b8d74e99b8d28150e77b06f526ff35acf91ded8944fd4b00d8c2fbf2166a2ec5cea7491c7a783ba7e728cede2e29660a424da32631e25faf3f0ed130451ed404ab8dc19030002fdb7cb4f2159b32913cae7265e9f92e3db5f57303f8e564e36d48d3f9032eaf137fb547b4da61e97b31e7455bb1ed22620bd6f355ff93ff312d584fb8cbd6966ee6b1e66fba378d1c6f651df4c1b44771d38840925a185af89961b4576825bc53c927ac2173f765b1e914ddb1e9ec2f1b708a36826bf8351bd26dd7a312978f2da5fdbbfc323bb64fcc0abe7a547795cdda1359205a0c9eb9637696583e1c46b2e2adead79442e03650780c74b8be92ed32767b97a82af38d4dd3cbe03cd9f669aa0c6918dc3833c96739b95e704defccc0392dcdedb687e2b7eaf848600fe891b713dbcc881139e0ace7708fc173bfffade3974006ed85a7e4432074b3c1626c8ee2e6924c1812b49f2e69aaadc139d35c3f225c86ba517a709c3de093d6e5b6c5edf3082153acdf0c828465f73b7c5644c59632db350572bbe6eeeadab9aa64d47c3c9d8588cf1836668ee56e6c305909ff879e6a24d4e7b74967331fe4a6e8e15479507089c835171f32df51218d0cac890727e5a1409d909085542a3d5c4a94c3ef6a4a5e0c629ce86f2f438284fe98899569490bbd36356dddfc08e955a7fe25009d1aac858779ae9d18260d5167a241e3e1f9f9c3012370bc4764cb5c87d1f928b309a469a73dd5fd4281cd37df42ad67df94b2b64ce2abd1fc568e15f3067561af7cd63e3bb39d4a0e6a2826db49236aa1b1925"}, + {"0000000000000000000000000000000000000000000000000000000000000bf6", "00282ba93bcb748b9fe6c7aeb755207f59377f360909990ac08116e389e69be15ecf7c37cce244bf07f10d031b17ccce0054841041acadfcd43262237f4a1a1661bb5a4e953b64b133eba14de1454723d6fd0615059d44488a0a3dff454506b0df4cbfbdb52a5d31700a4815198a461164efcb02de304ac5791c663676250a0e88623eb044af889e8653b963e22edfb05959550cfc12e11a57f880c66b714c2ea0d9d90506f3d7ac0129671ddd06950d1d59d273a53716da86d23c678627b0f647cf916c39813d96c6a5d020ae019616297718390a2e8651535fb415f3f1bfb69bef56025b60f11a49a0fca3314367c971b3741e304df69f16f66ac6051c203f7710369731b940a6fbe39e572b569e0cba112510c6dfd2df13d07c712279a5cb18ccf72acbcf0870276273ca2810d23861751b8ea43d805a6f9f540b36c0ef5a776fc1e3252259f7476c3eab107f78fa016bd2cd6059a333472c12de5619a53532bd0b244c2884fce94058873dbf052565013bdad9f4ed3755101a5c2dfc485cafe7a93a02ddaf66d5bcc7e934271825a6d4610228d65faf9c33bd4abc47ed0c158d3118044ddcd7bbda0c8da8445547dbec49d5ba69b04c633c45ba2daa9c165ae6a19590ea371d1185c1f6b71d1bf9bce2e612fae9803771f5f866e97d29e339f6cd20cbb4e11b5948ab52242346badb1dc29e8cdff7a30cb7f36e98cc955d8547f21e53b2a3412493ae9e231eb39cf1b5d0c37734280707d7ce057610d3f5b19c0cb9fc2cca0b9c7b8223b6ff8abf2ef1f939f7119f0e650ad1ae19a2f59fb5f3a3adc1b405b45f2f098a0ed1e42bd989715f2be63802daf66e06b795588cb41342e9c1208f0133d10f7942b74a23ffa6f15e4330193ef7aecc465e8d5ffa43aed367d1878f6d9db22d4d2544f779a93f977171d656bbc297321fc51ce13d010072361ec47cf7a00da0146f4e12d2f1f317e8fe229fce879a710d0dddbf6302e95ba70a8bbe36c9e60436007615ee5447af6322c3c97336c1bcb53722cb06822cdee647451097c0343acfdf52122622f76330022f52da86c6db1ec59b00848dcc168c687274080d03fe55484049e8009f6102ffeaa30f1e61117dcc0125327635bc25a55f59d2a4eeb7a93c69f5179e027e62d3c7a1e9f5b5c5e62888b6ac6c0c9ac75cbeb80d0e78538a86f5754bbd348465f44ca69e4a0237345d1d1b3acdd80e5cc16aec3a5ed3e7e79ed392799dc31076a6cecb8714bf3db1214722f8c731c15318de02170e5dc8fdf20bc197eb54108f3eb1e909f6108a580ff95c46400fb99b7ea0bdf381fa13a7bb757ef276320536a1e932e9bbd00dbc60ac6da1932050bf8aed1aab952a1b48c69aaf8082cae078dbe0ead6b267062763ac5297619cd59b7ad28a736d13a63082130b7e02bda966daecc28faf7a116331943400e7d4ef98e2153f99303dd2360944bb625dd997e1116f381f4c5e156eb7e9ede55b51f72f533568daab153eae30a72d1f923a3f0b181ccd77f2b313fae04a2e8cb65f1c13078bf500c90f660dcf0e232015bb577d837c33b42f0d8c5588de54aacecfa6e293e8f5059d48b8d8cce6081bf68686ad56c7ea9580ecb6f911c9fc1911dfe11eeb1729cf0bf5c5297378c0145c653b98ff9fe7a6038b1c01442f6937c7eb239f6fb55cc501c77b3b122a5e5e316a4b656f80f418078149378ab8c8386d6c2e07a1a02d4cc5bc6fc455ade53a8e1e017bf5e62635934396d7aa6487afb186800c368166093839f1a203fe37e276016b8c504863fd36b12abd1982374d053e3252710aac3e6596853a5b706b489ec3cadefff817681b3687a601c17916540e2dc47b2278891dac77188bd713f2cfa189a5ac819acd21a32738095d4005"}, + {"0000000000000000000000000000000000000000000000000000000000000904", "00d3689dcc540c42a60c1955cb611252b16afb7b770a0c061f9f943b16df69b808226189168d9eddee4c20db4c67daa9fb4d750c139d823804418e5f305dc0253293ccfd8a8026728235c937d0fb7a71cd1b874a064eb4d9255120f9d1daa37d595d109e8422db2c083039dc737de08c6f8ab0858d577cfb921af57fd6e11d6034cd9172f7e1ee6733fd76e76f1a449335c79d33b4f36208a183e1715903fb73e103bdd1fadc2252018eed1ada9a05bcf79ef79dc5e348c717d91dea9e3dae536e0813785d7c420504706e8f8a245218a69224e5d2b931e838b9cbcd23bc6c494e8e0b06f131414e9c8b2abf25529d8dff37ed8cf5b6be7833d53b3308a1dd148b93ec6bdb81d26b524f5ded8a3a7b0963099ea8f1b2893bf5bc1fd462a26d2f5b64a33c77951c5276eaf2f7737bebdbe4da87b34f028f86f7a388241d679fc65fb01fa8cee70001c405a293d0dadbaf02c65578c82a734b68cd83cf6a61591552d0bbad2a054c9bc71103dda2f491c3bd9ca532eb4797fbc8410e3fbdcb80a650eff265047199ab1a663cd873187932002d569511fdabda89e4ece0c8779d85d3b0d7f504984ea2431ed291ec944103fec85e78c9802be56006795135cce27499d912417df752d07e8141de3934091d6ed71e674ce79092e357424d2bae89a4df4ded1f64d9f3299b390b9869b24cb07d3e3a77cfdca58c03f008fb96cc6c3a78a5c281fde00d615e53558312142fd1207aec9e437792b57f66f965016739dc34e20934d4df4312742ba90b53b73ac71b77a7099f7f76250bf17ae499f863c800f73f0f5ed1cb57fbfd5ad7064288d9aec3c43c60a754e22d72013dde889a7a770a2dc7076e223e7df64a8373dbd75ed15ad012e2e327f7f716a9920a31c37522b602d30c4500e9fa81f63a13872dfd6c4713d21d67218474606e21157726aa00f3ec523f09d997cc5672ed83be986d3a430ad42e07452773904510fa39013bf6cee0f16beaa7df990b027d8b3ffe11cdc4aaa08331ffa14b2a8e33d7c1b018b20b6703d773b7f7769a92c95b3cdf58603f8b7105658e528d10ea212621a316a0d7db0e5e5d5c0c5108588419d664f2818f2837877d7d4592260134d46e20aaf1a276273fdd83a057a93f7739eb61a2fe875081928c146f70c567d07afab8056027137d3cff9bfc08c1e66717963b0d81b3b4a5a56d5c1d6fe8992fba10d179371c0ecd5fff9236b566fcfbf6faf19b999e0b8cecb0b3c86d63251bb23c13fc7ebd1aa132dd534d9ad56b0e7115e39cba898f3e639b628a869fd4a10d2bd19e9a6ad93ba011754537e1c0c20c46b90fe61ed75d45e31802a1d9f5432b5e7fd03e22cb976fcf125839f51aabd9fb729d55547dd2ba52179bb1566c42d6d61b4752878d2cbc76b42dfa56c24ff2bd538a032eef10474f7dc9a9ec8155c17abdbc9c16d942c935de1286caa3ea6f3bd686a3e77d9bef8ad51c9cb9264c656379b8e1c5dc5aa7421ae4c85e87577e5ef42f8eec68621066d9851454e0f9bd232dbe53f1546d099280e0ab853164df3e909d579329a5503d1be23750287e87276b9979b65936fce3414c9e1875b75a9610d58609bac54e9e98bf733ddbcd3c211c88af9ead39cd3d79c5564041ac7557554df2fe56b3c4374d630c1a056d955bf0256a4d7105b0b1dbf1d8bf9ebd8d1ec3914b339f44acfa72a78e5e7b17b2074319e09117ebd7cbb5788b47dade776d5dd6a01a1b9d57c4842d50cc64d9ad86c7ba543460d45b3bca6e9adec09e0c2b5b8679cddf19265ef13f8a7d9e1aa66456204a44c1d551b5dbcecffb0664bafbd5aef18bdfd8245814713a5cfed1d7e508fc4184c7e912e15df0f1f22e20d90515fe0ae7699a04b77d03bc399217f8f13453"}, + {"0000000000000000000000000000000000000000000000000000000000000869", "000a133e004e8576d8a950506bbf02c532919e76d30d102bd973ac33e17a11924dc35d0d00a239af04c80305f426deeac771c1b0a77a71c616da7f8556c18211b60af3949c3cf59f41c1d6ebd5bbc8911793ce0a015ce8d90ec5759c7be7119fcf1b0b08cbd1feb72407aaeedc0256f7b93c38b494bb6ef8f63571b25b2e13270c46e349ba50ac6bc2352a274520f7c3570a9519fec71b4bce532d6b9d943f8ecb6a698566f5953c0d8324db8fc786f30bd923f64172e83e5afe1f120450e4b6b984592a05cf10c88e057638863657bb164c11604a27af048ba55881f162612327bf0717bb0e6b31e1ec87ced10ca4bcc2a5c969f72eeed6439845cc1116a66606c58e88f8629562176d37a9bea10df69f19b0044fc3dec2e9f823f48a5e4c0746c1369e779a16201c405dd78b5f7501796f8f528f02e0653c61bf3801f2fd8b15e0d0b99398a72470e9d672929c21ee01623e0caf809c5d507eca8698fa8ba2ed40d9adb20beb65902c04a3c9684801c58e43c3f4cb235da033094a6735b9a6a85df77260e97339e3f90fbe546e83211c19fd256a7b4993490867537b10ab25585b845f07fea658644a00617ca25ac34fed58d6eb615a402d1bf431987b4d4eb09b76e2a1e2a93b50c891ad377e13f87d68c6a4b4e77dd324bdcd7b890dc0fa3b741d393cfbfeecd55b692f28aacd80da987edb685f33e50b8384b1fc69183348e295d8d3ed6a49c2139807fd399b9ff2319cb86902de5831e27bd32b1b0d1d82601abe4bf7e9af272daa1e82abfc71d111c0d2d7aa493073f58acb193f7b688434fce9cf07da92f53f3f3e0d275cda0e5d39978333213dbe235124931f2e262c1db1e6690e675595b9d7023d1c52d017a4725d3b4d34cca34c1ace4c61081a23c51671d565af4313d0204b245e833f625dd58b8b689a535c5b1730601db9c1000bf025d7dbbce5bdc612ec5aa69526057dfae4ec1b031c67362473f1edc5832d2dda48ace1d8073f0405611a4dfb8ea2f9048701914a6da6486b1a1198e72e1624b15714798ef272ba3c6a7cc02f065fbfeb2407481c06459f67a1040b80b0b527feb98cf47ba0846ac99367a9e235cb4bc86bd99ee087ff3f573de103079daeb9dc4f1d89ecd5632570f99815004a6e9a4b081dc60c2351b26503c753e58ed7f96ddae0f52d570543bdc5c8c1a6b7cad543caafaa0288f6bf35a5591ea349b6b158fb3f67670205a6f2d586ed76dd7d890a258d6c72a21bef6cec0196a2599ca521b2d4cdc133fb3b06deda3609da34473f665968ab73b6fc50cc0a5436ece951ac49fa81e8c58f75c20e629397b0ed17d0f61b499404cb6f15d1fb8c44f95d9f68168da20be3e48d8d56df832abc2104c84a35bc95d091fb4917e962a68a9480318bb3333bf1406214fe8792ab18031fda9e42267669ea92457855fd5cf5973914d947070751755850dd0da33a24843bc06159eca8b1f2044f927c702c67ea375c02b7dd4169b1f291a0dacfe0504fc75f70d88b77179d78bcd169a7dbc7e03ea3c311c5e0e440dfb737b89fa5eaa6c4469af88a996c692ef2aa6d73f1eeb9cc8817794bed7a2622487a9bd926aa49b1a1cf93a3412273b53a68c4e4fbb6b789d380f7f4419921d1ab19d63a4cdcd6537f40237e020304c5d270d75fb6bb1386c7ed34e47e330a7ddc5729077a864746915ce8f995a2f0bbbd53e1a3d813ffbd04ccd6f952919c934731d43d396370b9c7e051b5e7052ea3c794c2a84f43310346c45b05acd42b78173605615f6f2bd9b9e7b596e2311f9604b94730b9a7ba1450878a90d6d80743a1f2011c95035971af9ab344073bf4f7ec65aca969b565336272059db9b3dbbbcb2729f74f74379327f986d45162bfd1c557dc2ebe79"}, + {"00000000000000000000000000000000000000000000000000000000000015b8", "00e32ae2030b9cd4f0f3d7b26b711d260f14f4013b0489ad07dea76647ea6b6203b8f7cddeb68557f31e025d939699a83153a3dcb38e7ba92d19d35db29844250db9d5924b779af274d4d16370ced59f862d10960aad7919aeaef325ccb127ea7d60e84a40b577a1ad160d75fd1607bea35813a3b6cee4c999106c5726c41caa34dde44c9ea8ffa512e4ab35da2ccfb06c76ae601bac4ee8b42eb7e01ab62dcd771ec5cc41f0778c04eab882b3966abfcb22c08a832d5d172be3fb5b7b3680be82569c9ce734edc9cdc0650502f2f5387c2c0d92ffe7138c3f04f1ab916b1e37dd111e3e9947ae149571d9aa455e349f7c47711f7b952abc3c1897970b0b9f55af84dc84712333123453e01d228ade0e7f33c38673670dbf81326898937e4982f705e75984f811e4020bd5dd973193ca052b8c344077524cdf56dd2bbf1397951bd379187a63ee7762173202c33bd97801d8b6dcaa9fb753b730e24e8d522c462f725fd81e3817b529f5535a2d6ba074849afeea75678df9ea5019e9fca0021b29ead99b45b0325970c5ec71f44ba03207b6d48c5db78902e5068cdaf72d89b2fd9086390c415b1e26551f0f55f359731bd392a2ff1cdc113f32bd62fa8271896bc98af65694480145b130fa7c4c23b95281ade2e2893cadc31134f6e380ce8b08960626d7553a57940977cd83941c0c774a128d3bbc27210959147240c88d26dffaa2d7ecae87ad8bac2cf4a659448f117b9d63d5cc7fe76016d8e5da5ffa9390130be7f42a6199ad2f2b8631741427f4e93c7d7a517113fc63505d54ff0de4401693e96d7f226584b8e99525f93774e312c6dfdc147402316cb11561c4fd8a2d4edc1ae535dbcf3f8fabd7dd03fb00470f739fc1973cd3a72a3f167345a67ce6d5e1d0545a4a225d70af453f0d501b5f991b6f00552aef6634d23877d2485f011362966be5411d2e65b44c40b36615ce7c17bf0c43a3fda585d54ecb86939657ea528a56b5ab19f0ba0f8502d3a6f384a9b875d0fc96cd10657d0018d566293956c918136fb0cb9e799aabed7abab66bdcd24b0be6ed045630e13ff20a6c4600f9912fcd7d7e7b5842420c0a71e522394d7f8536604105ef15df9af8793579437920d3ca20ad23176f3053c51bacfc9d70d14c2b447d0fdc8d8becb115440148fadd65b6bd3b0203d34628da5381f0da4077397e417e4e2e5218af8f16674b9cc3a61373f7d821a3af41b28879add5cd4511337c6fa71546deba5d882fc35450ca8095bf7be3154cfb8da0dbdca95c05f34f87ce200e2c42f5ebd2081fe95054967b10fe6213baf35d29c4fe164857ac54dd6e292f97aa2590dd9765784e51c6c3171be4b20b0ef2ef0acb2b11b0b3b2c7eccc0d950750daa3af1ae23e3236c7a18bf902455453f707bdef10dafe5503e276ae6550cd81aaf7f1b67bb544c2192b3870f608f0eac944d50221bd1246d820d4dfba0480197cd8159885fadce642994520d44ae03a9e5a024873e9ff2e6b2a02ea6aa771f55ed3021169a7aea864bf94ca0f21342f38956a2105a37672263460da2049fcf3c43368b73844b380d39e7a142f11335175b274cfe36c11c23dae1c109bd8a61e32fa2cfd221a09bf3a88981937cc1c1a3100818a17d33562ab6960f19bf6757516ce36ab56c87c52f2bf524864a0e4bca8e7534eac1a54eab38493b0cd64db467c91d2e8cec6169e438a29b5b41a58e6a4b15f17f5725c4b3d95925270217e35aba7e3d95adc8adab0d52d05bf2c49922f33cec318dd85bbbcaaf6abec70630e7da1802e042698e5ff21cc34e5df15901dec9db35b1ee41575a01675b8ed26e06ac51dd815bece91e52580b7cbedf7e4f0615147a78c197bd2b6e516fe3510eaeb87819819de7b49"}, + {"00000000000000000000000000000000000000000000000000000000000010cb", "001c706aaf1d2d270809e6a7d2f0c2e6d14fdeb0fb45a06a7826a9bf5dd9d5351ca95cee56311238e38e265ab1e87b96e535a50b9274a52b7f050e1fdb2a613c8c34e4faeba1f1ab2ff9491d6a3ac2bab6de17f4034e289b81e2f115d98352582f39eabf0ee4b8a63609b1a731b294c00cb7d6050d91af99b5d0c59224bd1cde9904ee54d7c7e069b2548f463389d66fd94f513456a794ce7f6c25ffd2642312db55f952b23adf5e022d01bdc0095ec69602c86404fc877647665a0fbe052b212a8ec9af0e63fa91be31d7aa68f047fbe4f10849c857d496eb0ecb5e516fd336e9ea8ef9bce5e30c712538749a2fd33cbe29a7ba67f63ad4b41cfb8503db6a54cf09d339a6b840961a85daf8cde10e0e7f0530ca61d79d6e71c276a05da5d0fc28658271511a2c66ef1b089ad6ced7897863f35eb94a1f8d7e112340bbbc184fa328cd2480d5eb656ccb3a58f53ffce1018a6b65f742de3599b2e4f0e471a0ce0f4635feae6347b451c0aa6223c319c7559c42a6f621695b15e5026c9eee6324785743a9d1d43eb387fee23dbac6a92be0872fe6f14007e668c2dc4936656d8db61caff901b5c55eb763273f27ee701d04f975c1c7f13b27c40b3e7d442e20f995c8e860c81acf5d9944ae761c7f0774cecfac4f61954822734e27f59de61dfb5df1231e782cb80aa7306163f3c2c96d545a4e7d5cfc7941057dcc28d54fdbebd72f7223bff7e1ef3b993e731f44bae280d9d635c5926e45176255a9f16e1def3472091f7c03bb4d3195d89735d98b4c2841bdc696bd601b3d8d56f4d9f28b4c1dd3882750a9c962e419dac40aec8adc7778b479deedb1105a12a4533c0a3bcbee0d382def81ccc43535c3230cbf24d3c92deabf8ad3122d6509b010c152e0cf6331216de222dce3fa51f712b86777d4cab0f46946a42ecc7cbdc5a52799248c00a39cbb306a08c3f0c592aa08c6140a10bb59daaf1ffb1c3d0612ec912b7dd38cdb744a11109651cd301b33adc52337b3adede8b87cb9704107cb415e83835e2ab4116d9ba7ecfc83c6f49eea3a468cc23ce4c611025ed04229d7cdd9cef38f7dad66517b5d1a9310817a679dfa27f741c62ef98d4771523ada699db7152e806454200f205f27d435311a6d993200a892de3f47a34f10dfa283f92e4ff609a439dd8e5c85b9cef60376ccb769db5c8bda96128e9c55f352d93e39a5cf2d12c6c95aa141355fa1b5e670c90339aa335eff310cd0b53a3e5b391ef35ff3aaf1753eb542dcf689860e57616933f11347891342603b611e7965efd2148309c42bec5b58540d2b5353a9f742111d384009f33116cd0fb759612c0dded96217c01af53564426e3b3f0d7687e1ac911ee2cf3312a1dc60c524f380fd426215b2bfcf3145ec92aa2627bb12647b2ef1ca5e748908ebe5c036433f6749f3d377204a0580f690f50a972565a7288e542a6f6c5c762ed0e8fcd1cf8d9d6c3208ef9f7d6cc4f7b0e701e100ec524258961cb4601725880ba53c9f1f834bd495c42ae382da22705154402a68c9bfda353873f1ebb46396e10daab13e1b14da466184a4af77bce7e0b945b5e8e13f6a578b348b2b37cd3710a197733da82697069a4b39126f9af635bc6d609d5175206a3335f808c820df5b864912f59f55093e3602bc07fad2cc6250c345c3a0d8c7e16a98ef196aebd5a759410dbf9c56468664c211a06d1b699518505f83caccc905db5981d3bb38d7ac89e48549742e7b44e30326ec9b49cec38a614b046ec3f39ab607100ca0d19e94200f4dbd926d77f8fda50ae071e83d13473b3b255b4cf11e2c7252872da68c94d0df9e5626748f2b20af7ba3cf2fb2d64c6160cd984a35151d3963476e8f6c7103fd94370f55edca9a6c15b7699b"}, + {"0000000000000000000000000000000000000000000000000000000000001652", "000a779571c2b44d7fda937d5fe3bb9e115998225c27b127878d952eb93618234f049d80fdf74af479bc0e06a4ee7c3bf1f1f790a3fb656b9b6e102fd4bf1d37bc3d0c342841d58d6bb8077cc872f75dc09ed87b04f649f7b94de4c79ec550c893a5ce09fcca9c2ec41e996e951bcba813bae46a3ae564d7e2b74216ec1837769d422f628791a33469caccf222ff1cb09c0dc644a863e76ba8ad03b418277a4fc8d1a2294079054105f317a155c9e50b10bd6135d568d9bca73ebe0bfc09d6e360b6e5f6e734d355b727b1ad5e1a5cf6f8f2139e437b24ce679b154ce7934e47e5b38b08dea856305c12403b68b803c334b3a1dbb428b5d9719b4d8406198dae290c1a60d8df246f90d17736a7d5d9bb5a2b23b1a24e13b7873bd5f4c8ace717a5922d6d568e09dc3e4ebf46f037a15721cad1c89748c8e9fcdbc452dae3f63d260103fb3305b9bbc47db57d227f9eda01855c386233d5c5b206c0e98c0c571a145574ed8b01c41de3ce955a87961300a4e8e49df529279d792e02212d5f3145587d6f9bf0e275e0033d049d2984ee03a63cf8270aaa9968a7022d9cc7c8118fcdbd8fa9095f60901160ac5966268b05a3f78d5f27819c10a5121741864fc51b4abf4e52c3dd6b7e9692463ca933204b8f4174a9d2bf521f42253339225e0cb1d9788f25ab39d05a0cc696e3d33567c3ba73e78a0a3d42330249a879614ebc8d783eb2fe55ef9e812ec12ce9070dc8068eab914542a27551bd022dc6493c2a5eda760b506784f7ae16ad9cf601b6b9d6d5a0a9a8ff55bd49a9faedfc21ffa5c864fbfd4aea7a73032cd9b0aa10f9ce5e1d6e898ff162463d28792045ed503010e729cd33e68c9375739c87d3b316ac09699e79b22943276286057ecea191fa6353f119c0fc55560db0ab163c6f320637e3d99be0b8454e3c369f3ac24c5ece8f004a3d5a88cc21f292c6e0f1b4568a006b9ccf3c6d0fecc50d8cdc3d7eef5393a96bb16f399e860f377b0668190b2a05a01463d25a8f3570dfb2d4ee1ab83e09bbbdd6a68f20d5fd64414591438ddcd65e0fb14f0f38e8fa732c82cfdfaeb3bdc8c9f43f0d15de0ef9270afcc9395769c74a4863de8df68ba303ee38a39527bfaa4be42d797591ed74720c6cbede28589e6f12404eb2acfbdd50453ea0d44fefae3e1ee6819c409c0f21f70cc903f3eea75415ca5a74236978a80cd3771566da06fc513d0d8a9ee29f65d527f9a165175aa725808bf060ce3e93545ec355301f7671953179194e75b405acc35fa7f56e271ae8cfde2f3f3f94bf18c80fb6a0cf2a072b578791519cf875c9d86c7251ef470fc008c1ba440527f7df41bbfab4b7e5f7995d0f67185d0127afc6ceaebf375415aaec9d93615fbe1e7b3cb78b3ebf9022034719e860395f02425a28b3326800c06bff8570bf9fc7a090724ace349aa35d38831110204bca839e86f91c433102d21f36b1ad5097b42007b665d46b5daf0dffbc41ef49cd90397d0b1e083112709c889af0db7d9c4421831b651f71ade89676a30b889ab706a6d839586cd3e05ee4001112db88e2d12c71c540a2cb40fe79d4d3a5a355ac1345ad7b4b500e63cf4ccfd694df53b44300add9bc60e2c8bb3c5c24e50f9f30df7a196ea8d37300e934656cec2c3f6301707d660176f9edd674304c29fcca1d6d7c9c6352181344ce010873005edaac7f16e597c7258c5b6e8f2646d2d2a45acdd334e5a3ac041da8ba532ddb6e2b2e9ac20670ce59bcdb13b38e193e7ca33fd4faa93e24f02a49186692d1f022e27579fcb5c4b99c0b88ae26667f70b5d8b387b755969eb7711216996aff8cdc401f833dd0a6ef57b9c9270253e70a4dcc455de0e15c546644401f4a99e6a1f6cf366a94ab9b9a9da237"}, + {"00000000000000000000000000000000000000000000000000000000000008a3", "00bd559ad249caded7163150acabdd099a9b71d9ef0164c5d5474368d8e29427fad66f52da483cb24dc9099541a094c501522a12d13abc168d9597124cda1b09e8ccd1940fb1079f9bd523095d4a4222091f71d507a6f46ae61a5e4edbd368ac9755ceeaa96bb5559c2e4a76b261af004ffcfc341e305bab61c33a314a2708136892c6a1907dc94b611adbb024919f8fbab1333e0f7550f67b9399f9d806224251fce1fe581eb48d022f32780d1d0f479a0b90e56a445b40daf958ea08459284091c96cb78c3d1981c6359404b5ddbdfb15910c881a317e1bd338d0703eab164458f006b5850d328ac448b1591940bbe06646c1c3dbdd68a7f5d1d9e035de483af172f1dfea3442f487aa3fa6ad9de25180f771303ba48be41ae02b4517b38db6691c59ca7ce0efa114766102c9da3fe9354cad16525cf1c169af65032e2c9a4b5bc8dc5cea89327f3d65a6f491cf7b9016615bf0ddad08b90fcd33ea6673c1127ea92a5ad39533b84ede54811c7cb33ad216e1748fe98bea0010454b56d5e1540a8fdd57bd47c7d8573d9d75f86902be46a7925e3dc43b88e660e39b18c8e2eb439a4611ef1de111193cc7d2ab1358db7f3e05dd4d1dd1ccf2b166968fdcb5c18cca632f4d4998d4cfa37974a202265e71fbfcbd89729b9760dd036b2d594297f62b25b9f87360f6d6ab39372a5d0c5cf78aaedda7f090d055397152aa3943d374585e8bbbd9c06dc99df8d8b0eeb272c96d535997537317fd3587ee2f154fcb4a1061da9cbe782fa16acb2c2ed771849fd9414ceb99e2e94cc8a489e474fe11fd62fd65c5d55a36eb41bc90600b5e4b0dc3529705a7343f1ed08e52f683588f0153897538b32f38de09372603337e8722146db84700811669028a07ffbcee8408956ce92947cbdcd06cd347b1f3c7f1f23911593352178cd56a998e798dc06018981989865229f597f2042a7335f7441e59308362b91e7a2a1a159c9d27195273b31c36188fa9d64ad067578aa0cb55069aefb837c7de2babdbc56aedca62d51874d6e5929c901ed592cf56347c26f7976a0b90785793c7e42792d272956ae8d38d26e1d91d7b5042668be86fd21bac73d6f0422a6c49ffbb4b95fcadc0a0779e0bf13afe5afd9c1f0afd0f829477b79b7951bc1ec704c5ae185bee863e21b23f935842d53a2a70429dfdaa54f20435069461524c474f9e6c33ceaf717334af18008a3ec8f02d24b7174028570ca3d197713d70bdf671f6dcb6cb2552bbdd1c0c73e06febc042530bf7594d49253596db2ece2c6bba5d362787edc086dec83461bfd2b1af5c285235eddbdd0c8fb95011393ecc91d4b82c9a53b4823e756bc3ed9c97762f51758ef4643d760df66d5220ef2a8f16d0d584aa13b47f9ce5e3c95bfc8b527c4af0840547a96e1bab11c026da16b29b571b3c779b405b64c55fb25921d240815a7c92389e4ce0b400d0394244d275a2883fc9cad184a76bc4b67dafb9dd5f296c1fafdd0d52795c90b2359216bd8a3e7b130d2c6883f4b22c61a7edb043b04f1216b98b229bdee9de584f9c3cf51a18452ec346101275e18e9546dd7b1897ff0e56d27052dbc96e1089edee91097a616bd683320a61c3fcd99131be1ce1b1ad10379500751ea1907c550f3c1df249c5c1edb032aa0be98954b435de075e9daff4c3df0f41282e0196d679fa990cb85ea1946e6d0e212ea1f437cce8b1001b5f53545fcc2d862b11bdfdfc23532bd76650d737e7fb49224b7e56b92d79ac74e5b61ea9b3ccc4b0604c6988324320374bd5269f1739f30c4c1e736150b07a9158b152e45588b66ce13d7f33614dc55d18211ad8ba63caad39fee4c15548ef3d40162d6f5b3cd3aa9afeda0a2e20ba02f83c414e9c5e92a863c0eee"}, + {"000000000000000000000000000000000000000000000000000000000000060a", "01d2f32340427431391d16fabe7b216613d15d80681b62e9583e17017fdb641cb65170856f7448fc274902aeec53d897351cdd2f63ef74a588eac7df5d7bdb1eed33294d8cdf9d8bfcb28b5ee0534a07ec5cc10c03509defdcfe91c7f712d062511b03d228005d65f2173b5f718c4d2dad222fab662bf8f8b2f6d2de109f19b03f9ba70fcebfe3e257de5b5ba2ae85951e382c216f326211cbacdbfe8cc4024be6e39715ec3e368a029e2ddca4e2ca21891592041f956b9b415c5fba8a1915379a8e697b09b7f71302d4d426850ad5352d3e0ffa048387841826e7c6857a38db171572b2f7b6bc158033ee7499e27925c642d403bcd01512425287d303c43f35efc70112da7b91fb6c5506b4acdf0d7f2b0650346a801b280df734410f67d424a583d4efa53f0c8054496d59d613e16950ce9c2ed5fb41625aa25d1f10aea44d57a310e3bd165b333fcd05ff4cfa1a6004062daf12158bbbbae81178efd228997e7cfcd1ba04fc199894475cbdbc55330c482acd6a3b3afbad680d3ef334cc9354919c5af0e977e6d6797ad519e5512d62c72cd398d54ce381652cec4e999da727d3002406c17f4810cd21b7846e64d948d12a5f5a945e4c0408cd0fcf78f00d7f8523d25812fe7034cb1253f3c1098aa4d1c75ff18b110522270bac8e99bcdb365115126f4c0251abfca9d82913a83b2e6eda40503bf007053be4754a85a8f5fbb461fc43d1da45458c6de66f14bd8c1c6645d5b9342d079ddd58ee22189993dff62c94c9e5c56559cbddb7053489ae3f1a55c47340092f616db5fe5349eb3ed6da061bf8f016a02d95291d127b16475487d2bd7ed1d4422428a686bff8f7a9c73872cfdd604f3a92e0efab4f217d6a6339131f6c981515124083e57eb1e1213765564da43eb7b59f0c181dad1ad7954e285fe69c845f9aade7c9199e6a894a0201f8b90a1375ebeda6e68c233f8b163274d512751b65b3919309ba08f986c274de519e5d1c4cbc3a4d06535660c79deefb1810a2da09bac6f911ec1cd37145e3f2cf43d4a6eb9e81e5f904537fbe3dc01c90320b69bcfb5dc3dc1a970225107a416cd9ed0b51a1bc2394aecfbdccd5d9a2c6773b9bd8d241eea492157911464e093a0a77e76ac5746195e606bd58c2bb66d4260c133035d6490d905a842fa95f9f8a1c705a80cd0568245aa790bb0fea59b14fe210a37c5ff175b207448f961807231bf3568a668e5ab8242e71945a891707a696f660922bbeaf1b60bb640732dccecdc8eb3d1a5979e6935540213418c9ea545181c33ea91ec7f70a5c49801547285cf80e91f64ca2fea9ef607faf4365e49ff8a3a8552b7913b847ba52feba644af94b6c21e19ee9250a7927efb755aa243c2a92c9afbd649131a2d4f8bf702107f28fd3d56234bfda6d3eb7e52403e43c54411e0aabe1d111fb845a102b1f96fb5611250eac40028bece3911575d2e34076ad8e272db28405b3bf0dc686fb631251758bd2c9e33a4ef275876626c93d9a2deeeea1e1c785211b63fabf56b3de34dc0d4e7f4f7db40b23aed6f1710d408f407269777a071e737cffdf8f56b78f0fd33f17b0576d45301c82d20ff961fd4459071d4d81e12dca37b5ce2eaf7ad6915f3572ff28d946b6cfbc58766b4b6d7a33feb884e707e5cd61efe796ed9ea021e54f45dfeca3b8954bba3116cf9a92ff2a7fffa2767d9773ae3e7cc8ffe2a60d063ee9ae0c9fbb934d55d6cd4d2ab33d387d9a181769e9215d9892ef4109d2a5a524b3f54ae8ff77561983b9f1291c37d8fdc5b53636de572185001d59c11b242e16e4ac29d37a1f13e74a3bd5062ae31e8f4f1b8568ddf528ebb5d375d368b1e9d535ba2e3aeac93563bf40e3995f3f710cf8895369f17a5a5d14bb6a"}, + {"0000000000000000000000000000000000000000000000000000000000000e67", "006104bfc0d7d12fed0162241b28c22d415cb1cfce0298bccfdba64f6dd1ea60337cc2e4d07a2a2608811c6349d7c3fa24f5de5a3741e4673a334a157bc7fa446497645065ba7bf319e6084ab828ca589bf6e27505865af28b79e631d46d08bc72f7dee29844d9c4012ee92dbb696f5d137d70b668bff7a3b6a0021cbcf10a915468d66e6b379f96321d2d7e5d4a3e9457c03e0ed89d84b09ee9e9902e31d885a573c961d61ca35004f87f677c1c0bc5f488d05331602f80d9b57d42e906ab11d9be0fdc48b8f1968a87ebea39d083394e481675f2a85e35a76fdd1de94005578d7f693a1fd931472a4cda98ea6f19c532d61a6ecba7a5b7377b48ac08c9c485b7d187e37809d46f80d0f9d17b21fc57782e7716962acf2b6d67f246bfcfdf0aae04efd86fb019cd9e44c9133548ef9251a62eb596009bfeff55e01fa46402d88b00789d0173d96c73fed1aaf737ddbc00b9d2a4b0c56406c5c7371a98ef1fe39ba07d0f511c3457dfa65c99893954b45c89c76d493dbc106dfe1ee42ce1dd9f15c79636c50bfe76a99f1b909993451f39549b5e885c95e7ed75e570377be338d25bf783010541dc774b2b7baac350cc925bc2885f926dc6293e9dba3d86d3a8a1ff5a76c75d60892aedc1bd07e907fb5c3eec0af4e501bac201fa4364355e1daf0bef135d45bc07518f3b92dbe4abed79bb7de16eff7ffd05cd3cbbb283b05220f970d1cda05ea280dc3b684f0def76a6f31c62f39e6e340d2f7a74ca45621f32f41c791c8d5a13bce4a12dc77d7f40d502613454282b2a7b7c717ce58ad96444e327f1be4fd68e2915f30f069fa966b8629621a0ea11abd773a0589476ddefbc15d35bb95e6929f3af87317065100c4ce68327c09910467371ee469069fbfd773223ebd0c2a8a2b7c2c11893dc9cd8d091f0e476b4bd443021595daa9cd40b0283a1da707171afc89bf90a414d19b7a116fecac676aad68670af80f5b539eacbb3e14656edab7aed7910e572e131dba74ded3f34256be26e79ab133620c543cd346925515c433c4586b0e65d98df20607c8fc1104d709b7e9c8125e925a574aeae31b271245e4f6c7d311d9cdc318609960e595d15fd9eb75e357d03be1440d9d42f4994094dd387b02d458e56cd8c3eadf638360a1e2d53321d268eab48c07814ab4acf7dbfee02d774daf574feb9c0bce41c63cfe532eb4c7ece86657034e580bb9b47ebf6d9c528e5e0268ef3553bfc25283d6c9916cddf7129f341006f412f50759cea1f3d4bc67d8d5ba8a2e69f863f5add092a5cecbcc6d60bd61b8980affb1f99cbc145b0c19c98a79d8c7fc45cc9aef7dd2ce9bfba74d8dd6dccf18f26409e883317291cc6e7eae04fa97341f1cd640dedef071e10671e32746226230cd132f7a5f612634529c75b7b938d0566f3f07305d276f2e859100851c42ae052fefb4725d679933bb2e36baa6aa3cc7d1f6626c88f19cf7d13b49d05f686b8f37b82b44cb5bd315e0cb4fbb4bb18ecb40e0a0a8993ceaf329fd72e6ff9339cd77f870728a418d00340d554d7015a1022dbe49bd567b4473305afd1d0ac781199a7e58f2041bd9f1184fb60480d34924e1a793625d7ca514fea1f015a391e5dda8017155b7c80a94b9ba6863523682d2873bbc09e6cb0056ec4d7370db33ed7366511fead2d3b2a825990e922c1cd3180eba683eead129e264a09d92845edb40a2bb5db26a624b12f84e4d60d3ad954c1daefb622ab2d61ab41644e36bffc14a497a8d99bc14fc77072250b0d81157f95aeb0d52c133bf7a87fca50c138f61e37eecc99dcd121bc98b1d843624f90778e7a9ed64c18ca1a88450e5c76a82751948a291caeb301585e78263ddfed46da579fa16574a37776c8ad31d6dc2a66"}, + {"0000000000000000000000000000000000000000000000000000000000001a1e", "02c15514adacf021e7dc629d773d4eb9b9d4fb7e2f0bd2407da31e4923d48236140e69808da546b6e5ed0cc7515e51102a70df67f67cdc3721130fe67db65e300bcae2168cad7ecd25447c0949243d3eca0aec9b079344297cc4dcef96a1f1dc14e7a4059990f4e583092ad5c6d947c1c09a582435065637e1296eec816d12102b2758094c0665a0b469d176335e4639b368d420611dbf82d13dd5e1b1624b7868c5060459d8cdf80619f75625f4561df9a3e7765dc388a2503bbcf3e01d962c8042f9de6bd39a6538ece99fe6dc399bfa390e8c8d9cce6452ebe7ba1945b0756ee39e4f1e636f5605cea4f4f2ba91f0a2f748827ad725d5177bfb5127b53c7827d385a12d4432a0a8a244bd62d8ee88d028009364b3d94fcd17e6f3f112b15c757a6d9e627937afffbeca1284d3f891a703cd57907289853bd917494d324df71a6e3b2518473233b998e232fab930850783928ff2946959551d8174fbc01ef357c05acdd40a564fe99b4b87fd79a0f247b0bffd1da7a635bb6720f9947f9b26866da04a96fa00b956d6255056d01627cbd41f88d7636b757e72e530c1f4855720d7b6370f2e89749bc85394b74ef46d446aae767aa298e0304c989eea99608f3f8802666778bbbf0f403edf9b8c1ddff3b0abdb2f914b4ff3157ebb9244c83910d2ff26e3f7bd2b4a41278da2e35914f3339eb60eb673d3094e114395921ec7f999b37e1132719b6bec3c4c20364b2635f8d68160f2b9c462482c7d569303df78c80b9c0bd14049a15985ea3aa5a6578a3b5c6b9f73b214f48ad797171f492bad5211b164a5561fdbdf0d8211dc5722a48b4de16de122ffc1f0fa5657489889862c63a3b82b4c7af7f30097eeaffd955659eefa7d2e1447b37fbf659367815b92dd28aa31cd569810dd7f429f2a486ddae7d5c131a667b2c5fca7bd757fa6a802dc0a288dc3a7d92391f496186a32132bc879c0c4042f87432b1cdbe569da105d325097d821c193e3b106bea48a55164bd7d2de0c08bf7d3f2772961cf3b31c5f07a61de7c1d3738cb3eab256992e568cbaa24103d892044f61f23dd296c23936c873c51e383d1b82144dc3e97e8b9f3b916f916590b29c93c9bcde6db01a557312778f562d5dd16877d1f6355a30b29c0ec52cd2ae11171e93db29f57896b6567d6ab74d7ceea804dfd8a0910a5ee2df875427853c2da123307bb0dd59181dfedd9783e4e85a86365b58260a9fb67d644b08dad713428f6306a0ed4973c9f9b9b6658d1fd4693b5da341dd5194d5942ea677b93be4d9c73c548e38092341a411ce321f986e553ff6745dc2464816b8422c935c0f40633a5771d7b3edddc1648e2b453308200d79af05b952d17aa994a1d1d8fbbdf68ded95051324de11b9ff90bd2e9af81625a8d1cd5285bd1e6f0e039a5d2e5b43aa49197ea123b3481c60fa99d43185098683ee4620e871fd1b9118c6998eb4bb9d1dea490b8222218f5792fce4f516a849c15a6ed5c5bc564d122f34c37c22439b4d450223a340729b42c7fe162a08fc2af542dbe8f3492330c8b2f107de7d2ddf172a0deb5df3a94a081968b5b5a321f3a3a5ac94d46dcb12e6f7b889a7dcf96f1e48562be67dca745f5f1d8f2c36fca37ee8cea56414933c655e91a595e3940cee08215963559728f4dbbd32900d1fc23a62fa75dfff13db343b85c73a6aba40d7d3ecc9a44e434d179bfa2636a7cb3b8adfdca3f76a96d3f3baaaf1aaba183c3deec644305f6f7d1fdcc798e36fb2d675aa376a4f12c6aa342214dc1bb979698e71e9a6b67a709e34822f6454c866dcfa7b60f91833346643c2dd12bf0b0f1575133e6905a5e0b28773c9697a47cea5c7d7c1e62bf283b4f6243523e887b566e56a1372f297bb3e33"}, + {"00000000000000000000000000000000000000000000000000000000000022de", "007f388bed6b91756ea3e0866716ef6e9485fae6160195c7cda5c1e43f96ee359e105bcf4e8c293690420939124f04a0196363910421187811575929db40500b0bfdd1e8964aa334b801e3339a336d585a30852f1dc294a2d3d36f9ecc747458f3d41b4572415496df2a9fb1f882156cdabf9f65e681f38019865d6d47482277e24c9b8973eb34a41254faae4c5e2caa9dde5925ec118f3d8fa767ae00f434645957154367afe72000c59c79182c8faddd24424b9ebbb09ccd651b00540c96b9c7eec648a28a1d72c2e575d0f2250078511a011598db8e0788edf0ddc15ae24b62f63d6f93f71a2743a3c43ece55471a9802a76f31561a6f365c3647029bfa736395883afc0632bc25d4a8661b25d5aa0310f3c3fd3a183e75d359d6de3e5910b5dfbb74b7660af906917dc42b12e3e484aae1dbd20eaee037ef301572b7fc24d85b4aff9c82b27dcd421cee1639230d0188fec59f0dd4c0ced69c1ad07abd23692b1bd30735af942df597dcf6f403a36371bc416cf3e29a58570f586b05c357dc49515689788ad9581b8887dd913a41dc35e1ac9c9f9f4ea534eb6b36cc8af0299b6d3905750425da0366bdc59a7824477d7946b6f35c4ec90b8e61790fa74a4fa92396ea856661027828d40abb11dbe36bba516fe8ec8913106677285a4790d8034d1d1bf9fd87990889ddffc369b954a3d1c172be7e1812226c2b100cbe82c42bf4423456b6cb2bac3b4828135cb54f7a933a01f7f4a2057ad92136ba8e19fec313b412d43c089a71f06fd1625329b78d49ac92c59e4080932ddb1645910fd874dfb1f358e214231f62041acc41fd2c4e7b7127b3042459e1457f6b307fce9825aa4d2b942277f52665f2a77dd107b4f16cb3280f20c7551ff6cd855f97a6144131f69bab5648fb4b81261eefbf629094e8bcc4e36077f46d51a647da51fc01dca9a9ac12e2f7e2e2b1c9229dae099e95370177143d3b38ab661f19758494a01b32f0c27155b45a872a867dc50f9d76473695e9e2c4f9357f5ba6bb6c455d985f4e2c21486fde6576c6a8ceda6e010a7dc2b504130f429ac33376781ee4af5bbe8d768005bc4cb5092b15c4f296a8bd8c54a298eecd790a5161755a8605cc46bf890b8ff93d508501842b78c7261e5deeb1096891c528a300e57bf2f0aa9e8af2623cdf16bba20427704120484b6af8be26e4983d2685c783ce85d0174f84598719c6beefcc3603a94d4aa62750725df50671d7f9903ec255f779643ebd2fd8122fae3319e61928dcdaa44880d6a483140de63d2d7d7dc9dd449e0ee00d908e0f2164fc054198641e8fb0d74279c9b4117884b9335028a9f50c7223d3c03675ecf73329e52603f77f20cffba99356e51a365b75825f7db56d77542784f3c2663c493a2e564d73f753e9d6ebb0c2f2027a2330a7117c67a20507474fc47282a02cb572de17bbc7a335959316f74a05e3687cfb5227bc5b1b7f084f50902760e77740d420df9a495521c09b911e5f199a8343918b8386fc74f22552a76524a22c8c70ff06084e7fefe9b3ab98e004fadf35eb5f60483f287851712d90ebdd6b512877170d3b7fb34f16813917ae3b5ed54ede6081bdd7cc646fb336658121fd8fbafc52959b48d13375dfa4ce8616c157533a05ee1dc1120f215c348b54357d68adb4da7f5f48d55c005b3e7a23d05746e44d968f7601d4dbdff702861030d6e3a4140e6e1a29978be541f713f8e2cc9aa1ac32fecc941ee4aa4c41bc7f91ea5328ff87cbf35a8de17d1d3d1ad6d4384b0df52d10b3984d62e1678e86dd150ee425490bc727ee7107fda0f5d2433ab1c5d407be9d123fad5c201355601d926d3923787be86a4aa5be0b8d5750171ad658f8e97798b5dcaed46345a9af70c441"}, }; -/* TODO: Regenerate miner tests after launch // NOTE: These tests rely on CreateNewBlock doing its own self-validation! BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) { @@ -175,7 +174,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) pblock->nNonce = uint256S(blockinfo[i].nonce_hex); pblock->nSolution = ParseHex(blockinfo[i].solution_hex); -*//* +/* { arith_uint256 try_nonce(0); unsigned int n = Params().EquihashN(); @@ -254,7 +253,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) std::cout << "\"}," << std::endl; } -*//* +*/ CValidationState state; BOOST_CHECK(ProcessNewBlock(state, NULL, pblock, true, NULL)); @@ -443,6 +442,5 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) fCheckpointsEnabled = true; fCoinbaseEnforcedProtectionEnabled = true; } -*/ BOOST_AUTO_TEST_SUITE_END() From c66c731adf766b5085eefe0008b7c83fe02f5162 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 12 May 2017 13:00:15 +1200 Subject: [PATCH 0050/1062] Add a benchmark for calling ConnectBlock on a block with many inputs Requires placing block-107134.tar.gz (containing the block, and a fake CoinsDB containing its inputs) into the base directory of the repository. This can be generated using qa/zcash/create_benchmark_archive.py (see the script for usage details). To facilitate generation of the fake CoinsDB, an additional field 'valueZat' has been added to 'getrawtransaction' containing the integer number of zatoshis instead of a decimal number of ZEC. Closes #2355. --- qa/zcash/create_benchmark_archive.py | 236 +++++++++++++++++++++++++++ qa/zcash/performance-measurements.sh | 44 ++++- src/rpcrawtransaction.cpp | 1 + src/txdb.cpp | 3 + src/txdb.h | 1 + src/wallet/rpcwallet.cpp | 5 + src/zcbenchmarks.cpp | 83 ++++++++++ src/zcbenchmarks.h | 1 + 8 files changed, 369 insertions(+), 5 deletions(-) create mode 100644 qa/zcash/create_benchmark_archive.py diff --git a/qa/zcash/create_benchmark_archive.py b/qa/zcash/create_benchmark_archive.py new file mode 100644 index 000000000..c61b10cf2 --- /dev/null +++ b/qa/zcash/create_benchmark_archive.py @@ -0,0 +1,236 @@ +import binascii +import json +import plyvel +import progressbar +import os +import struct +import subprocess +import sys + +ZCASH_CLI = './src/zcash-cli' +USAGE = """ +Requirements: +- faketime +- tar +- %s (edit ZCASH_CLI in this script to alter the path) +- A running mainnet zcashd using the default datadir with -txindex=1 + +Example usage: + +make -C src/leveldb/ +virtualenv venv +. venv/bin/activate +pip install --global-option=build_ext --global-option="-L$(pwd)/src/leveldb/" --global-option="-I$(pwd)/src/leveldb/include/" plyvel +pip install progressbar2 +LD_LIBRARY_PATH=src/leveldb python qa/zcash/create_benchmark_archive.py +""" % ZCASH_CLI + +def check_deps(): + if subprocess.call(['which', 'faketime', 'tar', ZCASH_CLI], stdout=subprocess.PIPE): + print USAGE + sys.exit() + +def encode_varint(n): + v = bytearray() + l = 0 + while True: + v.append((n & 0x7F) | (0x80 if l else 0x00)) + if (n <= 0x7F): + break + n = (n >> 7) - 1 + l += 1 + return bytes(v)[::-1] + +def decode_varint(v): + n = 0 + for ch in range(len(v)): + n = (n << 7) | (ord(v[ch]) & 0x7F) + if (ord(v[ch]) & 0x80): + n += 1 + else: + return n + +def compress_amount(n): + if n == 0: + return 0 + e = 0 + while (((n % 10) == 0) and e < 9): + n /= 10 + e += 1 + if e < 9: + d = (n % 10) + assert(d >= 1 and d <= 9) + n /= 10 + return 1 + (n*9 + d - 1)*10 + e + else: + return 1 + (n - 1)*10 + 9 + +OP_DUP = 0x76 +OP_EQUAL = 0x87 +OP_EQUALVERIFY = 0x88 +OP_HASH160 = 0xa9 +OP_CHECKSIG = 0xac +def to_key_id(script): + if len(script) == 25 and \ + script[0] == OP_DUP and \ + script[1] == OP_HASH160 and \ + script[2] == 20 and \ + script[23] == OP_EQUALVERIFY and \ + script[24] == OP_CHECKSIG: + return script[3:23] + return bytes() + +def to_script_id(script): + if len(script) == 23 and \ + script[0] == OP_HASH160 and \ + script[1] == 20 and \ + script[22] == OP_EQUAL: + return script[2:22] + return bytes() + +def to_pubkey(script): + if len(script) == 35 and \ + script[0] == 33 and \ + script[34] == OP_CHECKSIG and \ + (script[1] == 0x02 or script[1] == 0x03): + return script[1:34] + if len(script) == 67 and \ + script[0] == 65 and \ + script[66] == OP_CHECKSIG and \ + script[1] == 0x04: + return script[1:66] # assuming is fully valid + return bytes() + +def compress_script(script): + result = bytearray() + + key_id = to_key_id(script) + if key_id: + result.append(0x00) + result.extend(key_id) + return bytes(result) + + script_id = to_script_id(script) + if script_id: + result.append(0x01) + result.extend(script_id) + return bytes(result) + + pubkey = to_pubkey(script) + if pubkey: + result.append(0x00) + result.extend(pubkey[1:33]) + if pubkey[0] == 0x02 or pubkey[0] == 0x03: + result[0] = pubkey[0] + return bytes(result) + elif pubkey[0] == 0x04: + result[0] = 0x04 | (pubkey[64] & 0x01) + return bytes(result) + + size = len(script) + 6 + result.append(encode_varint(size)) + result.extend(script) + return bytes(result) + +def create_benchmark_archive(blk_hash): + blk = json.loads(subprocess.check_output([ZCASH_CLI, 'getblock', blk_hash])) + print 'Height: %d' % blk['height'] + print 'Transactions: %d' % len(blk['tx']) + + os.mkdir('benchmark') + with open('benchmark/block-%d.dat' % blk['height'], 'wb') as f: + f.write(binascii.unhexlify(subprocess.check_output([ZCASH_CLI, 'getblock', blk_hash, 'false']).strip())) + + txs = [json.loads(subprocess.check_output([ZCASH_CLI, 'getrawtransaction', tx, '1']) + ) for tx in blk['tx']] + + js_txs = len([tx for tx in txs if len(tx['vjoinsplit']) > 0]) + if js_txs: + print 'Block contains %d JoinSplit-containing transactions' % js_txs + return + + inputs = [(x['txid'], x['vout']) for tx in txs for x in tx['vin'] if x.has_key('txid')] + print 'Total inputs: %d' % len(inputs) + + unique_inputs = {} + for i in sorted(inputs): + if unique_inputs.has_key(i[0]): + unique_inputs[i[0]].append(i[1]) + else: + unique_inputs[i[0]] = [i[1]] + print 'Unique input transactions: %d' % len(unique_inputs) + + db_path = 'benchmark/block-%d-inputs' % blk['height'] + db = plyvel.DB(db_path, create_if_missing=True) + wb = db.write_batch() + bar = progressbar.ProgressBar(redirect_stdout=True) + print 'Collecting input coins for block' + for tx in bar(unique_inputs.keys()): + rawtx = json.loads(subprocess.check_output([ZCASH_CLI, 'getrawtransaction', tx, '1'])) + + mask_size = 0 + mask_code = 0 + b = 0 + while 2+b*8 < len(rawtx['vout']): + zero = True + i = 0 + while i < 8 and 2+b*8+i < len(rawtx['vout']): + if 2+b*8+i in unique_inputs[tx]: + zero = False + i += 1 + if not zero: + mask_size = b + 1 + mask_code += 1 + b += 1 + + coinbase = len(rawtx['vin']) == 1 and 'coinbase' in rawtx['vin'][0] + first = len(rawtx['vout']) > 0 and 0 in unique_inputs[tx] + second = len(rawtx['vout']) > 1 and 1 in unique_inputs[tx] + code = 8*(mask_code - (0 if first or second else 1)) + \ + (1 if coinbase else 0) + \ + (2 if first else 0) + \ + (4 if second else 0) + + coins = bytearray() + # Serialized format: + # - VARINT(nVersion) + coins.extend(encode_varint(rawtx['version'])) + # - VARINT(nCode) + coins.extend(encode_varint(code)) + # - unspentness bitvector, for vout[2] and further; least significant byte first + for b in range(mask_size): + avail = 0 + i = 0 + while i < 8 and 2+b*8+i < len(rawtx['vout']): + if 2+b*8+i in unique_inputs[tx]: + avail |= (1 << i) + i += 1 + coins.append(avail) + # - the non-spent CTxOuts (via CTxOutCompressor) + for i in range(len(rawtx['vout'])): + if i in unique_inputs[tx]: + coins.extend(encode_varint(compress_amount(int(rawtx['vout'][i]['valueZat'])))) + coins.extend(compress_script( + binascii.unhexlify(rawtx['vout'][i]['scriptPubKey']['hex']))) + # - VARINT(nHeight) + coins.extend(encode_varint(json.loads( + subprocess.check_output([ZCASH_CLI, 'getblockheader', rawtx['blockhash']]) + )['height'])) + + db_key = b'c' + bytes(binascii.unhexlify(tx)[::-1]) + db_val = bytes(coins) + wb.put(db_key, db_val) + + wb.write() + db.close() + + # Make reproducible archive + os.remove('%s/LOG' % db_path) + archive_name = 'block-%d.tar.gz' % blk['height'] + subprocess.check_call(['faketime', '2017-05-17T00:00:00Z', 'tar', 'czf', archive_name, '--mtime=2017-05-17T00:00:00Z', 'benchmark']) + print 'Created archive %s' % archive_name + subprocess.call(['rm', '-r', 'benchmark']) + +if __name__ == '__main__': + check_deps() + create_benchmark_archive('0000000007cdb809e48e51dd0b530e8f5073e0a9e9bd7ae920fe23e874658c74') diff --git a/qa/zcash/performance-measurements.sh b/qa/zcash/performance-measurements.sh index 2b6abee3e..6070c319d 100755 --- a/qa/zcash/performance-measurements.sh +++ b/qa/zcash/performance-measurements.sh @@ -1,8 +1,8 @@ #!/bin/bash -set -e - DATADIR=./benchmark-datadir +SHA256CMD="$(command -v sha256sum || echo shasum)" +SHA256ARGS="$(command -v sha256sum >/dev/null || echo '-a 256')" function zcash_rpc { ./src/zcash-cli -datadir="$DATADIR" -rpcwait -rpcuser=user -rpcpassword=password -rpcport=5983 "$@" @@ -24,7 +24,7 @@ function zcashd_generate { function zcashd_start { rm -rf "$DATADIR" - mkdir -p "$DATADIR" + mkdir -p "$DATADIR/regtest" touch "$DATADIR/zcash.conf" ./src/zcashd -regtest -datadir="$DATADIR" -rpcuser=user -rpcpassword=password -rpcport=5983 -showmetrics=0 & ZCASHD_PID=$! @@ -37,7 +37,7 @@ function zcashd_stop { function zcashd_massif_start { rm -rf "$DATADIR" - mkdir -p "$DATADIR" + mkdir -p "$DATADIR/regtest" touch "$DATADIR/zcash.conf" rm -f massif.out valgrind --tool=massif --time-unit=ms --massif-out-file=massif.out ./src/zcashd -regtest -datadir="$DATADIR" -rpcuser=user -rpcpassword=password -rpcport=5983 -showmetrics=0 & @@ -52,7 +52,7 @@ function zcashd_massif_stop { function zcashd_valgrind_start { rm -rf "$DATADIR" - mkdir -p "$DATADIR" + mkdir -p "$DATADIR/regtest" touch "$DATADIR/zcash.conf" rm -f valgrind.out valgrind --leak-check=yes -v --error-limit=no --log-file="valgrind.out" ./src/zcashd -regtest -datadir="$DATADIR" -rpcuser=user -rpcpassword=password -rpcport=5983 -showmetrics=0 & @@ -65,6 +65,28 @@ function zcashd_valgrind_stop { cat valgrind.out } +function extract_benchmark_data { + if [ -f "block-107134.tar.gz" ]; then + # Check the hash of the archive: + "$SHA256CMD" $SHA256ARGS -c < #include +#include #include #include #include @@ -9,6 +11,7 @@ #include "primitives/transaction.h" #include "base58.h" #include "crypto/equihash.h" +#include "chain.h" #include "chainparams.h" #include "consensus/validation.h" #include "main.h" @@ -17,6 +20,7 @@ #include "script/sign.h" #include "sodium.h" #include "streams.h" +#include "txdb.h" #include "utiltest.h" #include "wallet/wallet.h" @@ -322,3 +326,82 @@ double benchmark_increment_note_witnesses(size_t nTxs) return timer_stop(tv_start); } +// Fake the input of a given block +class FakeCoinsViewDB : public CCoinsViewDB { + uint256 hash; + ZCIncrementalMerkleTree t; + +public: + FakeCoinsViewDB(std::string dbName, uint256& hash) : CCoinsViewDB(dbName, 100, false, false), hash(hash) {} + + bool GetAnchorAt(const uint256 &rt, ZCIncrementalMerkleTree &tree) const { + if (rt == t.root()) { + tree = t; + return true; + } + return false; + } + + bool GetNullifier(const uint256 &nf) const { + return false; + } + + uint256 GetBestBlock() const { + return hash; + } + + uint256 GetBestAnchor() const { + return t.root(); + } + + bool BatchWrite(CCoinsMap &mapCoins, + const uint256 &hashBlock, + const uint256 &hashAnchor, + CAnchorsMap &mapAnchors, + CNullifiersMap &mapNullifiers) { + return false; + } + + bool GetStats(CCoinsStats &stats) const { + return false; + } +}; + +double benchmark_connectblock_slow() +{ + // Test for issue 2017-05-01.a + SelectParams(CBaseChainParams::MAIN); + CBlock block; + FILE* fp = fopen((GetDataDir() / "benchmark/block-107134.dat").string().c_str(), "rb"); + if (!fp) throw new std::runtime_error("Failed to open block data file"); + CAutoFile blkFile(fp, SER_DISK, CLIENT_VERSION); + blkFile >> block; + blkFile.fclose(); + + // Fake its inputs + auto hashPrev = uint256S("00000000159a41f468e22135942a567781c3f3dc7ad62257993eb3c69c3f95ef"); + FakeCoinsViewDB fakeDB("benchmark/block-107134-inputs", hashPrev); + CCoinsViewCache view(&fakeDB); + + // Fake the chain + CBlockIndex index(block); + index.nHeight = 107134; + CBlockIndex indexPrev; + indexPrev.phashBlock = &hashPrev; + indexPrev.nHeight = index.nHeight - 1; + index.pprev = &indexPrev; + mapBlockIndex.insert(std::make_pair(hashPrev, &indexPrev)); + + CValidationState state; + struct timeval tv_start; + timer_start(tv_start); + assert(ConnectBlock(block, state, &index, view, true)); + auto duration = timer_stop(tv_start); + + // Undo alterations to global state + mapBlockIndex.erase(hashPrev); + SelectParamsFromCommandLine(); + + return duration; +} + diff --git a/src/zcbenchmarks.h b/src/zcbenchmarks.h index b2bc2e373..b00b76789 100644 --- a/src/zcbenchmarks.h +++ b/src/zcbenchmarks.h @@ -15,5 +15,6 @@ extern double benchmark_verify_equihash(); extern double benchmark_large_tx(); extern double benchmark_try_decrypt_notes(size_t nAddrs); extern double benchmark_increment_note_witnesses(size_t nTxs); +extern double benchmark_connectblock_slow(); #endif From 30cc01ef13108b3da9d5b18deb52abc6ffbf51c3 Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Fri, 19 May 2017 12:14:46 -0700 Subject: [PATCH 0051/1062] Start on a make-release.py script; currently just arg parsing and unittests [unittests fail]. --- zcutil/make-release.py | 140 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100755 zcutil/make-release.py diff --git a/zcutil/make-release.py b/zcutil/make-release.py new file mode 100755 index 000000000..f54c5116d --- /dev/null +++ b/zcutil/make-release.py @@ -0,0 +1,140 @@ +#! /usr/bin/env python2 + +import os +import re +import sys +import time +import logging +import argparse +import unittest + + +def main(args=sys.argv[1:]): + """ + Perform the final Zcash release process up to the git tag. + """ + chdir_to_repo() + opts = parse_args(args) + initialize_logging() + logging.debug('argv %r parsed %r', sys.argv, opts) + raise NotImplementedError((main, opts)) + + +def chdir_to_repo(): + dn = os.path.dirname + repodir = dn(dn(os.path.abspath(sys.argv[0]))) + os.chdir(repodir) + + +def initialize_logging(): + TIME_FMT = '%Y-%m-%dT%H:%M:%S' + logname = './zcash-make-release.{}.log'.format(time.strftime(TIME_FMT)) + fmtr = logging.Formatter( + '%(asctime)s L%(lineno)-4d %(levelname)-5s | %(message)s', + TIME_FMT, + ) + + hout = logging.StreamHandler(sys.stdout) + hout.setLevel(logging.INFO) + hout.setFormatter(fmtr) + + hpath = logging.FileHandler(logname, mode='a') + hpath.setLevel(logging.DEBUG) + hpath.setFormatter(fmtr) + + root = logging.getLogger() + root.setLevel(logging.DEBUG) + root.addHandler(hout) + root.addHandler(hpath) + logging.info('zcash make-release.py logging to: %r', logname) + + +def parse_args(args): + p = argparse.ArgumentParser(description=main.__doc__) + p.add_argument( + 'RELEASE_VERSION', + type=Version.parse_arg, + help='The release version: vX.Y.Z-N', + ) + return p.parse_args(args) + + +class Version (object): + '''A release version.''' + + RGX = re.compile( + r'^v([1-9]\d*)\.([1-9]\d*)\.([1-9]\d*)(-([1-9]\d*))?$', + ) + + @staticmethod + def parse_arg(text): + m = Version.RGX.match(text) + if m is None: + raise argparse.ArgumentTypeError( + 'Could not parse version {!r} against regex {}'.format( + text, + Version.RGX.pattern, + ), + ) + else: + [major, minor, patch, _, hotfix] = m.groups() + return Version( + int(major), + int(minor), + int(patch), + int(hotfix) if hotfix is not None else None, + ) + + def __init__(self, major, minor, patch, hotfix): + self.major = major + self.minor = minor + self.patch = patch + self.hotfix = hotfix + + self.vtext = 'v{}.{}.{}'.format(major, minor, patch) + if hotfix is not None: + self.vtext += '-{}'.format(hotfix) + + def __repr__(self): + return ''.format(self.vtext) + + +# Unit Tests +class TestVersion (unittest.TestCase): + def test_arg_parse_and_vtext_identity(self): + cases = [ + 'v0.0.0', + 'v1.0.0', + 'v1.0.0-7', + 'v1.2.3-0', + ] + + for case in cases: + v = Version.parse_arg(case) + self.assertEqual(v.vtext, case) + + def test_arg_parse_negatives(self): + cases = [ + 'v07.0.0', + 'v1.0.03', + 'v1.0.0-rc2', + 'v1.2.3~0', + '1.2.3', + ] + + for case in cases: + self.assertRaises( + argparse.ArgumentTypeError, + Version.parse_arg, + case, + ) + + +if __name__ == '__main__': + if len(sys.argv) >= 2 and sys.argv[1] == 'test': + sys.argv.pop(1) + if len(sys.argv) == 1: + sys.argv.append('--verbose') + unittest.main() + else: + main() From 6e5b990a35ce1e2f5ac43e9b20b93e17884cdb63 Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Fri, 19 May 2017 12:16:13 -0700 Subject: [PATCH 0052/1062] Update version spec by altering test; also update regex to pass single 0 digits in major/minor/patch. --- zcutil/make-release.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/zcutil/make-release.py b/zcutil/make-release.py index f54c5116d..8f288ddca 100755 --- a/zcutil/make-release.py +++ b/zcutil/make-release.py @@ -63,7 +63,7 @@ class Version (object): '''A release version.''' RGX = re.compile( - r'^v([1-9]\d*)\.([1-9]\d*)\.([1-9]\d*)(-([1-9]\d*))?$', + r'^v(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-([1-9]\d*))?$', ) @staticmethod @@ -106,7 +106,7 @@ class TestVersion (unittest.TestCase): 'v0.0.0', 'v1.0.0', 'v1.0.0-7', - 'v1.2.3-0', + 'v1.2.3-1', ] for case in cases: @@ -118,6 +118,7 @@ class TestVersion (unittest.TestCase): 'v07.0.0', 'v1.0.03', 'v1.0.0-rc2', + 'v1.2.3-0', # Hotfix numbers must begin w/ 1 'v1.2.3~0', '1.2.3', ] From 987d040660e38b1227409846c737a4019900217e Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Fri, 19 May 2017 12:17:07 -0700 Subject: [PATCH 0053/1062] Add another case from debian-style versions. --- zcutil/make-release.py | 1 + 1 file changed, 1 insertion(+) diff --git a/zcutil/make-release.py b/zcutil/make-release.py index 8f288ddca..0a10c1e99 100755 --- a/zcutil/make-release.py +++ b/zcutil/make-release.py @@ -120,6 +120,7 @@ class TestVersion (unittest.TestCase): 'v1.0.0-rc2', 'v1.2.3-0', # Hotfix numbers must begin w/ 1 'v1.2.3~0', + 'v1.2.3+0', '1.2.3', ] From a93f4de2f6b1f1a9f27fd8f6184c6af13fddb83b Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Fri, 19 May 2017 12:20:14 -0700 Subject: [PATCH 0054/1062] Add all of the zcash release tags in my current repo as positive test vector. --- zcutil/make-release.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/zcutil/make-release.py b/zcutil/make-release.py index 0a10c1e99..7df62b7a8 100755 --- a/zcutil/make-release.py +++ b/zcutil/make-release.py @@ -107,6 +107,24 @@ class TestVersion (unittest.TestCase): 'v1.0.0', 'v1.0.0-7', 'v1.2.3-1', + + # These are taken from: git tag --list | grep '^v1' + 'v1.0.0', + 'v1.0.0-beta1', + 'v1.0.0-beta2', + 'v1.0.0-rc1', + 'v1.0.0-rc2', + 'v1.0.0-rc3', + 'v1.0.0-rc4', + 'v1.0.1', + 'v1.0.2', + 'v1.0.3', + 'v1.0.4', + 'v1.0.5', + 'v1.0.6', + 'v1.0.7-1', + 'v1.0.8', + 'v1.0.8-1', ] for case in cases: From 7f537857357a67a2a7abba75637a42524e931fc9 Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Fri, 19 May 2017 12:24:22 -0700 Subject: [PATCH 0055/1062] Add support for beta/rc release versions. --- zcutil/make-release.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/zcutil/make-release.py b/zcutil/make-release.py index 7df62b7a8..99cf25c45 100755 --- a/zcutil/make-release.py +++ b/zcutil/make-release.py @@ -63,7 +63,7 @@ class Version (object): '''A release version.''' RGX = re.compile( - r'^v(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-([1-9]\d*))?$', + r'^v(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-(beta|rc)?([1-9]\d*))?$', ) @staticmethod @@ -77,23 +77,33 @@ class Version (object): ), ) else: - [major, minor, patch, _, hotfix] = m.groups() + [major, minor, patch, _, betarc, hotfix] = m.groups() return Version( int(major), int(minor), int(patch), + betarc, int(hotfix) if hotfix is not None else None, ) - def __init__(self, major, minor, patch, hotfix): + def __init__(self, major, minor, patch, betarc, hotfix): + for i in [major, minor, patch]: + assert type(i) is int, i + assert betarc in {None, 'rc', 'beta'}, betarc + assert hotfix is None or type(hotfix) is int, hotfix + self.major = major self.minor = minor self.patch = patch + self.betarc = betarc self.hotfix = hotfix self.vtext = 'v{}.{}.{}'.format(major, minor, patch) if hotfix is not None: - self.vtext += '-{}'.format(hotfix) + self.vtext += '-{}{}'.format( + '' if betarc is None else betarc, + hotfix, + ) def __repr__(self): return ''.format(self.vtext) @@ -135,7 +145,6 @@ class TestVersion (unittest.TestCase): cases = [ 'v07.0.0', 'v1.0.03', - 'v1.0.0-rc2', 'v1.2.3-0', # Hotfix numbers must begin w/ 1 'v1.2.3~0', 'v1.2.3+0', From 3250b3d34e228cfa0df193d15f87a81eb6065ea8 Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Fri, 19 May 2017 13:00:59 -0700 Subject: [PATCH 0056/1062] Add version sorting, assert that RELEASE_PREV is the most recent release. --- zcutil/make-release.py | 146 +++++++++++++++++++++++++++++++---------- 1 file changed, 111 insertions(+), 35 deletions(-) diff --git a/zcutil/make-release.py b/zcutil/make-release.py index 99cf25c45..0f6ae63ce 100755 --- a/zcutil/make-release.py +++ b/zcutil/make-release.py @@ -6,7 +6,10 @@ import sys import time import logging import argparse +import subprocess +import traceback import unittest +import random def main(args=sys.argv[1:]): @@ -17,9 +20,61 @@ def main(args=sys.argv[1:]): opts = parse_args(args) initialize_logging() logging.debug('argv %r parsed %r', sys.argv, opts) - raise NotImplementedError((main, opts)) + + try: + main_logged(opts.RELEASE_VERSION, opts.RELEASE_PREV) + except SystemExit as e: + logging.error(str(e)) + raise + except: + logging.error(traceback.format_exc()) + raise +# Top-level flow: +def main_logged(release, releaseprev): + verify_releaseprev_tag(releaseprev) + raise NotImplementedError(main_logged) + + +def parse_args(args): + p = argparse.ArgumentParser(description=main.__doc__) + p.add_argument( + 'RELEASE_VERSION', + type=Version.parse_arg, + help='The release version: vX.Y.Z-N', + ) + p.add_argument( + 'RELEASE_PREV', + type=Version.parse_arg, + help='The previously released version.', + ) + return p.parse_args(args) + + +def verify_releaseprev_tag(releaseprev): + candidates = [] + for tag in sh_out('git', 'tag', '--list').splitlines(): + if tag.startswith('v1'): # Ignore v0.* bitcoin tags and other stuff. + candidates.append(Version.parse_arg(tag)) + + candidates.sort() + try: + latest = candidates[-1] + except IndexError: + raise SystemExit('No previous releases found by `git tag --list`.') + + if releaseprev != latest: + raise SystemExit( + 'The latest candidate in `git tag --list` is {} not {}' + .format( + latest.vtext, + releaseprev.vtext, + ), + ) + + +# Helper code: def chdir_to_repo(): dn = os.path.dirname repodir = dn(dn(os.path.abspath(sys.argv[0]))) @@ -49,14 +104,9 @@ def initialize_logging(): logging.info('zcash make-release.py logging to: %r', logname) -def parse_args(args): - p = argparse.ArgumentParser(description=main.__doc__) - p.add_argument( - 'RELEASE_VERSION', - type=Version.parse_arg, - help='The release version: vX.Y.Z-N', - ) - return p.parse_args(args) +def sh_out(*args): + logging.debug('Run: %r', args) + return subprocess.check_output(args) class Version (object): @@ -91,6 +141,8 @@ class Version (object): assert type(i) is int, i assert betarc in {None, 'rc', 'beta'}, betarc assert hotfix is None or type(hotfix) is int, hotfix + if betarc is not None: + assert hotfix is not None, (betarc, hotfix) self.major = major self.minor = minor @@ -108,36 +160,48 @@ class Version (object): def __repr__(self): return ''.format(self.vtext) + def _sort_tup(self): + if self.hotfix is None: + prio = 2 + else: + prio = {'beta': 0, 'rc': 1, None: 3}[self.betarc] + + return ( + self.major, + self.minor, + self.patch, + prio, + self.hotfix, + ) + + def __cmp__(self, other): + return cmp(self._sort_tup(), other._sort_tup()) + # Unit Tests class TestVersion (unittest.TestCase): + ValidVersions = [ + # These are taken from: git tag --list | grep '^v1' + 'v1.0.0-beta1', + 'v1.0.0-beta2', + 'v1.0.0-rc1', + 'v1.0.0-rc2', + 'v1.0.0-rc3', + 'v1.0.0-rc4', + 'v1.0.0', + 'v1.0.1', + 'v1.0.2', + 'v1.0.3', + 'v1.0.4', + 'v1.0.5', + 'v1.0.6', + 'v1.0.7-1', + 'v1.0.8', + 'v1.0.8-1', + ] + def test_arg_parse_and_vtext_identity(self): - cases = [ - 'v0.0.0', - 'v1.0.0', - 'v1.0.0-7', - 'v1.2.3-1', - - # These are taken from: git tag --list | grep '^v1' - 'v1.0.0', - 'v1.0.0-beta1', - 'v1.0.0-beta2', - 'v1.0.0-rc1', - 'v1.0.0-rc2', - 'v1.0.0-rc3', - 'v1.0.0-rc4', - 'v1.0.1', - 'v1.0.2', - 'v1.0.3', - 'v1.0.4', - 'v1.0.5', - 'v1.0.6', - 'v1.0.7-1', - 'v1.0.8', - 'v1.0.8-1', - ] - - for case in cases: + for case in self.ValidVersions: v = Version.parse_arg(case) self.assertEqual(v.vtext, case) @@ -158,6 +222,18 @@ class TestVersion (unittest.TestCase): case, ) + def test_version_sort(self): + expected = [Version.parse_arg(v) for v in self.ValidVersions] + + rng = random.Random() + rng.seed(0) + + for _ in range(1024): + vec = list(expected) + rng.shuffle(vec) + vec.sort() + self.assertEqual(vec, expected) + if __name__ == '__main__': if len(sys.argv) >= 2 and sys.argv[1] == 'test': From b9b7f25fb9b070554aafbcfb8b529d19bf233dcb Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Fri, 19 May 2017 13:05:55 -0700 Subject: [PATCH 0057/1062] Make SystemExit errors less redundant in output; verify clean git status on master. --- zcutil/make-release.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/zcutil/make-release.py b/zcutil/make-release.py index 0f6ae63ce..b44c0e19a 100755 --- a/zcutil/make-release.py +++ b/zcutil/make-release.py @@ -25,7 +25,7 @@ def main(args=sys.argv[1:]): main_logged(opts.RELEASE_VERSION, opts.RELEASE_PREV) except SystemExit as e: logging.error(str(e)) - raise + raise SystemExit(1) except: logging.error(traceback.format_exc()) raise @@ -34,6 +34,7 @@ def main(args=sys.argv[1:]): # Top-level flow: def main_logged(release, releaseprev): verify_releaseprev_tag(releaseprev) + verify_git_clean_master() raise NotImplementedError(main_logged) @@ -74,6 +75,20 @@ def verify_releaseprev_tag(releaseprev): ) +def verify_git_clean_master(): + junk = sh_out('git', 'status', '--porcelain') + if junk.strip(): + raise SystemExit('There are uncommitted changes:\n' + junk) + + branch = sh_out('git', 'rev-parse', '--abbrev-ref', 'HEAD').strip() + if branch != 'master': + raise SystemExit( + "Expected branch 'master', found branch {!r}".format( + branch, + ), + ) + + # Helper code: def chdir_to_repo(): dn = os.path.dirname From 1ecb494896d0033acbbe1d25f23c98f1ad69b67b Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Fri, 19 May 2017 13:08:26 -0700 Subject: [PATCH 0058/1062] Always run unittests prior to actual runs. --- zcutil/make-release.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/zcutil/make-release.py b/zcutil/make-release.py index b44c0e19a..01d492bcd 100755 --- a/zcutil/make-release.py +++ b/zcutil/make-release.py @@ -251,10 +251,16 @@ class TestVersion (unittest.TestCase): if __name__ == '__main__': - if len(sys.argv) >= 2 and sys.argv[1] == 'test': - sys.argv.pop(1) - if len(sys.argv) == 1: - sys.argv.append('--verbose') + actualargs = sys.argv + sys.argv = [sys.argv[0], '--verbose'] + + print '=== Self Test ===' + try: unittest.main() - else: - main() + except SystemExit as e: + if e.args[0] != 0: + raise + + sys.argv = actualargs + print '=== Running ===' + main() From b43194baee708eaf6733b871c6615910d860a224 Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Fri, 19 May 2017 13:09:24 -0700 Subject: [PATCH 0059/1062] Make --help output clean by not running self-test. --- zcutil/make-release.py | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/zcutil/make-release.py b/zcutil/make-release.py index 01d492bcd..323a3dbef 100755 --- a/zcutil/make-release.py +++ b/zcutil/make-release.py @@ -251,16 +251,19 @@ class TestVersion (unittest.TestCase): if __name__ == '__main__': - actualargs = sys.argv - sys.argv = [sys.argv[0], '--verbose'] + if len(sys.argv) == 2 and sys.argv[1] == '--help': + main() + else: + actualargs = sys.argv + sys.argv = [sys.argv[0], '--verbose'] - print '=== Self Test ===' - try: - unittest.main() - except SystemExit as e: - if e.args[0] != 0: - raise + print '=== Self Test ===' + try: + unittest.main() + except SystemExit as e: + if e.args[0] != 0: + raise - sys.argv = actualargs - print '=== Running ===' - main() + sys.argv = actualargs + print '=== Running ===' + main() From ea5abe2ca76c6eef3ff74837617c74b59aec46ba Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Fri, 19 May 2017 15:15:59 -0700 Subject: [PATCH 0060/1062] Add an option to run against a different repo directory. --- zcutil/make-release.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/zcutil/make-release.py b/zcutil/make-release.py index 323a3dbef..14c9b959e 100755 --- a/zcutil/make-release.py +++ b/zcutil/make-release.py @@ -16,8 +16,8 @@ def main(args=sys.argv[1:]): """ Perform the final Zcash release process up to the git tag. """ - chdir_to_repo() opts = parse_args(args) + chdir_to_repo(opts.REPO) initialize_logging() logging.debug('argv %r parsed %r', sys.argv, opts) @@ -40,6 +40,12 @@ def main_logged(release, releaseprev): def parse_args(args): p = argparse.ArgumentParser(description=main.__doc__) + p.add_argument( + '--repo', + dest='REPO', + type=str, + help='Path to repository root.', + ) p.add_argument( 'RELEASE_VERSION', type=Version.parse_arg, @@ -90,10 +96,11 @@ def verify_git_clean_master(): # Helper code: -def chdir_to_repo(): - dn = os.path.dirname - repodir = dn(dn(os.path.abspath(sys.argv[0]))) - os.chdir(repodir) +def chdir_to_repo(repo): + if repo is None: + dn = os.path.dirname + repo = dn(dn(os.path.abspath(sys.argv[0]))) + os.chdir(repo) def initialize_logging(): From fad06b020be27542749752c539f84dba525a428b Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Fri, 19 May 2017 15:25:39 -0700 Subject: [PATCH 0061/1062] Make sure to pull the latest master. --- zcutil/make-release.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/zcutil/make-release.py b/zcutil/make-release.py index 14c9b959e..449d4d557 100755 --- a/zcutil/make-release.py +++ b/zcutil/make-release.py @@ -94,6 +94,9 @@ def verify_git_clean_master(): ), ) + out = sh_out('git', 'pull', '--ff-only') + logging.debug('+ git pull --ff-only\n%s', out) + # Helper code: def chdir_to_repo(repo): From 2d8d493ff9b1f52d11366aaac6b542e13d007fc0 Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Fri, 19 May 2017 15:27:07 -0700 Subject: [PATCH 0062/1062] Exit instead of raising an unexpected exception, since it's already logged. --- zcutil/make-release.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zcutil/make-release.py b/zcutil/make-release.py index 449d4d557..e3c81fe80 100755 --- a/zcutil/make-release.py +++ b/zcutil/make-release.py @@ -28,7 +28,7 @@ def main(args=sys.argv[1:]): raise SystemExit(1) except: logging.error(traceback.format_exc()) - raise + raise SystemExit(2) # Top-level flow: From 68ab915a24e1b5e78337f462696c049cebfaa9dc Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Fri, 19 May 2017 16:32:09 -0700 Subject: [PATCH 0063/1062] Implement `PathPatcher` abstraction, `clientversion.h` rewrite, and build numbering w/ unittests. --- zcutil/make-release.py | 141 +++++++++++++++++++++++++++++++++-------- 1 file changed, 114 insertions(+), 27 deletions(-) diff --git a/zcutil/make-release.py b/zcutil/make-release.py index e3c81fe80..78bc8e82e 100755 --- a/zcutil/make-release.py +++ b/zcutil/make-release.py @@ -10,6 +10,7 @@ import subprocess import traceback import unittest import random +from cStringIO import StringIO def main(args=sys.argv[1:]): @@ -34,7 +35,9 @@ def main(args=sys.argv[1:]): # Top-level flow: def main_logged(release, releaseprev): verify_releaseprev_tag(releaseprev) - verify_git_clean_master() + initialize_git(release) + patch_version_in_files(release, releaseprev) + raise NotImplementedError(main_logged) @@ -81,7 +84,7 @@ def verify_releaseprev_tag(releaseprev): ) -def verify_git_clean_master(): +def initialize_git(release): junk = sh_out('git', 'status', '--porcelain') if junk.strip(): raise SystemExit('There are uncommitted changes:\n' + junk) @@ -94,8 +97,18 @@ def verify_git_clean_master(): ), ) - out = sh_out('git', 'pull', '--ff-only') - logging.debug('+ git pull --ff-only\n%s', out) + logging.info('Pulling to latest master.') + sh_out_logged('git', 'pull', '--ff-only') + + branch = 'release-' + release.vtext + logging.info('Creating release branch: %r', branch) + sh_out_logged('git', 'checkout', '-b', branch) + return branch + + +def patch_version_in_files(release, releaseprev): + patch_README(release, releaseprev) + patch_clientversion_h(release, releaseprev) # Helper code: @@ -106,6 +119,36 @@ def chdir_to_repo(repo): os.chdir(repo) +def patch_README(release, releaseprev): + with PathPatcher('README.md') as (inf, outf): + firstline = inf.readline() + assert firstline == 'Zcash {}\n'.format(releaseprev.novtext), \ + repr(firstline) + + outf.write('Zcash {}\n'.format(release.novtext)) + outf.write(inf.read()) + + +def patch_clientversion_h(release, releaseprev): + rgx = re.compile( + r'^(#define CLIENT_VERSION_(MAJOR|MINOR|REVISION|BUILD)) \d+$' + ) + with PathPatcher('src/clientversion.h') as (inf, outf): + for line in inf: + m = rgx.match(line) + if m: + prefix, label = m.groups() + repl = { + 'MAJOR': release.major, + 'MINOR': release.minor, + 'REVISION': release.patch, + 'BUILD': release.build, + }[label] + outf.write('{} {}\n'.format(prefix, repl)) + else: + outf.write(line) + + def initialize_logging(): TIME_FMT = '%Y-%m-%dT%H:%M:%S' logname = './zcash-make-release.{}.log'.format(time.strftime(TIME_FMT)) @@ -134,6 +177,12 @@ def sh_out(*args): return subprocess.check_output(args) +def sh_out_logged(*args): + out = sh_out(*args) + logging.debug('Output:\n%s', out) + return out + + class Version (object): '''A release version.''' @@ -175,12 +224,22 @@ class Version (object): self.betarc = betarc self.hotfix = hotfix - self.vtext = 'v{}.{}.{}'.format(major, minor, patch) - if hotfix is not None: - self.vtext += '-{}{}'.format( - '' if betarc is None else betarc, - hotfix, - ) + self.novtext = '{}.{}.{}'.format(major, minor, patch) + + if hotfix is None: + self.build = 50 + else: + assert hotfix > 0, hotfix + if betarc is None: + assert hotfix < 50, hotfix + self.build = 50 + hotfix + self.novtext += '-{}'.format(hotfix) + else: + assert hotfix < 26, hotfix + self.novtext += '-{}{}'.format(betarc, hotfix) + self.build = {'beta': 0, 'rc': 25}[betarc] + hotfix - 1 + + self.vtext = 'v' + self.novtext def __repr__(self): return ''.format(self.vtext) @@ -203,26 +262,49 @@ class Version (object): return cmp(self._sort_tup(), other._sort_tup()) +class PathPatcher (object): + def __init__(self, path): + self._path = path + + def __enter__(self): + logging.info('Patching %r', self._path) + self._inf = file(self._path, 'r') + self._outf = StringIO() + return (self._inf, self._outf) + + def __exit__(self, et, ev, tb): + if (et, ev, tb) == (None, None, None): + self._inf.close() + with file(self._path, 'w') as f: + f.write(self._outf.getvalue()) + + # Unit Tests class TestVersion (unittest.TestCase): - ValidVersions = [ + ValidVersionsAndBuilds = [ # These are taken from: git tag --list | grep '^v1' - 'v1.0.0-beta1', - 'v1.0.0-beta2', - 'v1.0.0-rc1', - 'v1.0.0-rc2', - 'v1.0.0-rc3', - 'v1.0.0-rc4', - 'v1.0.0', - 'v1.0.1', - 'v1.0.2', - 'v1.0.3', - 'v1.0.4', - 'v1.0.5', - 'v1.0.6', - 'v1.0.7-1', - 'v1.0.8', - 'v1.0.8-1', + ('v1.0.0-beta1', 0), + ('v1.0.0-beta2', 1), + ('v1.0.0-rc1', 25), + ('v1.0.0-rc2', 26), + ('v1.0.0-rc3', 27), + ('v1.0.0-rc4', 28), + ('v1.0.0', 50), + ('v1.0.1', 50), + ('v1.0.2', 50), + ('v1.0.3', 50), + ('v1.0.4', 50), + ('v1.0.5', 50), + ('v1.0.6', 50), + ('v1.0.7-1', 51), + ('v1.0.8', 50), + ('v1.0.8-1', 51), + ] + + ValidVersions = [ + v + for (v, _) + in ValidVersionsAndBuilds ] def test_arg_parse_and_vtext_identity(self): @@ -259,6 +341,11 @@ class TestVersion (unittest.TestCase): vec.sort() self.assertEqual(vec, expected) + def test_build_nums(self): + for (text, expected) in self.ValidVersionsAndBuilds: + version = Version.parse_arg(text) + self.assertEqual(version.build, expected) + if __name__ == '__main__': if len(sys.argv) == 2 and sys.argv[1] == '--help': From 482291582e755596c2b2051da041ad5397de0341 Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Fri, 19 May 2017 16:35:44 -0700 Subject: [PATCH 0064/1062] Implement the IS_RELEASE rule for betas. --- zcutil/make-release.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/zcutil/make-release.py b/zcutil/make-release.py index 78bc8e82e..b0d578798 100755 --- a/zcutil/make-release.py +++ b/zcutil/make-release.py @@ -131,7 +131,8 @@ def patch_README(release, releaseprev): def patch_clientversion_h(release, releaseprev): rgx = re.compile( - r'^(#define CLIENT_VERSION_(MAJOR|MINOR|REVISION|BUILD)) \d+$' + r'^(#define CLIENT_VERSION_(MAJOR|MINOR|REVISION|BUILD|IS_RELEASE))' + r' \d+$' ) with PathPatcher('src/clientversion.h') as (inf, outf): for line in inf: @@ -143,6 +144,9 @@ def patch_clientversion_h(release, releaseprev): 'MINOR': release.minor, 'REVISION': release.patch, 'BUILD': release.build, + 'IS_RELEASE': ( + 'false' if release.betarc == 'beta' else 'true' + ), }[label] outf.write('{} {}\n'.format(prefix, repl)) else: From ab55424763abfd8bbb19558d62c924854c9cf4d4 Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Fri, 19 May 2017 16:45:01 -0700 Subject: [PATCH 0065/1062] Generalize buildnum patching for both `clientversion.h` and `configure.ac`. --- zcutil/make-release.py | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/zcutil/make-release.py b/zcutil/make-release.py index b0d578798..fb397c466 100755 --- a/zcutil/make-release.py +++ b/zcutil/make-release.py @@ -108,7 +108,8 @@ def initialize_git(release): def patch_version_in_files(release, releaseprev): patch_README(release, releaseprev) - patch_clientversion_h(release, releaseprev) + patch_clientversion_h(release) + patch_configure_ac(release) # Helper code: @@ -129,16 +130,31 @@ def patch_README(release, releaseprev): outf.write(inf.read()) -def patch_clientversion_h(release, releaseprev): - rgx = re.compile( - r'^(#define CLIENT_VERSION_(MAJOR|MINOR|REVISION|BUILD|IS_RELEASE))' - r' \d+$' +def patch_clientversion_h(release): + _patch_build_defs( + release, + 'src/clientversion.h', + (r'^(#define CLIENT_VERSION_(MAJOR|MINOR|REVISION|BUILD|IS_RELEASE))' + r' \d+()$'), ) - with PathPatcher('src/clientversion.h') as (inf, outf): + + +def patch_configure_ac(release): + _patch_build_defs( + release, + 'configure.ac', + (r'^(define\(_CLIENT_VERSION_(MAJOR|MINOR|REVISION|BUILD|IS_RELEASE),)' + r' \d+(\))$'), + ) + + +def _patch_build_defs(release, path, pattern): + rgx = re.compile(pattern) + with PathPatcher(path) as (inf, outf): for line in inf: m = rgx.match(line) if m: - prefix, label = m.groups() + prefix, label, suffix = m.groups() repl = { 'MAJOR': release.major, 'MINOR': release.minor, @@ -148,7 +164,7 @@ def patch_clientversion_h(release, releaseprev): 'false' if release.betarc == 'beta' else 'true' ), }[label] - outf.write('{} {}\n'.format(prefix, repl)) + outf.write('{} {}{}\n'.format(prefix, repl, suffix)) else: outf.write(line) From 08dc7889d237ca1daf9b7e5d4d8a6e9356ad2692 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 19 May 2017 16:42:55 +1200 Subject: [PATCH 0066/1062] Remove additional sources of determinism from benchmark archive The archive has also been moved from .tar.gz to .tar.xz for a 33% reduction in size. Closes #2388. --- qa/zcash/create_benchmark_archive.py | 39 +++++++++++++++++++++++----- qa/zcash/performance-measurements.sh | 8 +++--- 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/qa/zcash/create_benchmark_archive.py b/qa/zcash/create_benchmark_archive.py index c61b10cf2..67ad5b101 100644 --- a/qa/zcash/create_benchmark_archive.py +++ b/qa/zcash/create_benchmark_archive.py @@ -1,17 +1,21 @@ import binascii +import calendar import json import plyvel import progressbar import os +import stat import struct import subprocess import sys +import tarfile +import time ZCASH_CLI = './src/zcash-cli' USAGE = """ Requirements: -- faketime -- tar +- find +- xz - %s (edit ZCASH_CLI in this script to alter the path) - A running mainnet zcashd using the default datadir with -txindex=1 @@ -26,7 +30,7 @@ LD_LIBRARY_PATH=src/leveldb python qa/zcash/create_benchmark_archive.py """ % ZCASH_CLI def check_deps(): - if subprocess.call(['which', 'faketime', 'tar', ZCASH_CLI], stdout=subprocess.PIPE): + if subprocess.call(['which', 'find', 'xz', ZCASH_CLI], stdout=subprocess.PIPE): print USAGE sys.exit() @@ -132,6 +136,24 @@ def compress_script(script): result.extend(script) return bytes(result) +def deterministic_filter(tarinfo): + tarinfo.uid = tarinfo.gid = 0 + tarinfo.uname = tarinfo.gname = "root" + tarinfo.mtime = calendar.timegm(time.strptime('2017-05-17', '%Y-%m-%d')) + tarinfo.mode |= stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP + tarinfo.mode &= ~stat.S_IWGRP + if tarinfo.isdir(): + tarinfo.mode |= \ + stat.S_IXUSR | \ + stat.S_IXGRP | \ + stat.S_IXOTH + else: + tarinfo.mode &= \ + ~stat.S_IXUSR & \ + ~stat.S_IXGRP & \ + ~stat.S_IXOTH + return tarinfo + def create_benchmark_archive(blk_hash): blk = json.loads(subprocess.check_output([ZCASH_CLI, 'getblock', blk_hash])) print 'Height: %d' % blk['height'] @@ -226,9 +248,14 @@ def create_benchmark_archive(blk_hash): # Make reproducible archive os.remove('%s/LOG' % db_path) - archive_name = 'block-%d.tar.gz' % blk['height'] - subprocess.check_call(['faketime', '2017-05-17T00:00:00Z', 'tar', 'czf', archive_name, '--mtime=2017-05-17T00:00:00Z', 'benchmark']) - print 'Created archive %s' % archive_name + files = subprocess.check_output(['find', 'benchmark']).strip().split('\n') + archive_name = 'block-%d.tar' % blk['height'] + tar = tarfile.open(archive_name, 'w') + for name in sorted(files): + tar.add(name, recursive=False, filter=deterministic_filter) + tar.close() + subprocess.check_call(['xz', '-6', archive_name]) + print 'Created archive %s.xz' % archive_name subprocess.call(['rm', '-r', 'benchmark']) if __name__ == '__main__': diff --git a/qa/zcash/performance-measurements.sh b/qa/zcash/performance-measurements.sh index 6070c319d..7339609da 100755 --- a/qa/zcash/performance-measurements.sh +++ b/qa/zcash/performance-measurements.sh @@ -66,14 +66,14 @@ function zcashd_valgrind_stop { } function extract_benchmark_data { - if [ -f "block-107134.tar.gz" ]; then + if [ -f "block-107134.tar.xz" ]; then # Check the hash of the archive: "$SHA256CMD" $SHA256ARGS -c < Date: Fri, 19 May 2017 17:09:37 -0700 Subject: [PATCH 0067/1062] Modify the `APPROX_RELEASE_HEIGHT`. --- zcutil/make-release.py | 49 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/zcutil/make-release.py b/zcutil/make-release.py index fb397c466..a94e26f80 100755 --- a/zcutil/make-release.py +++ b/zcutil/make-release.py @@ -23,7 +23,11 @@ def main(args=sys.argv[1:]): logging.debug('argv %r parsed %r', sys.argv, opts) try: - main_logged(opts.RELEASE_VERSION, opts.RELEASE_PREV) + main_logged( + opts.RELEASE_VERSION, + opts.RELEASE_PREV, + opts.RELEASE_HEIGHT, + ) except SystemExit as e: logging.error(str(e)) raise SystemExit(1) @@ -33,10 +37,11 @@ def main(args=sys.argv[1:]): # Top-level flow: -def main_logged(release, releaseprev): +def main_logged(release, releaseprev, releaseheight): verify_releaseprev_tag(releaseprev) initialize_git(release) patch_version_in_files(release, releaseprev) + patch_release_height(releaseheight) raise NotImplementedError(main_logged) @@ -59,6 +64,11 @@ def parse_args(args): type=Version.parse_arg, help='The previously released version.', ) + p.add_argument( + 'RELEASE_HEIGHT', + type=int, + help='A block height approximately occuring on release day.', + ) return p.parse_args(args) @@ -110,6 +120,27 @@ def patch_version_in_files(release, releaseprev): patch_README(release, releaseprev) patch_clientversion_h(release) patch_configure_ac(release) + patch_gitian_linux_yml(release, releaseprev) + + +def patch_release_height(releaseheight): + rgx = re.compile( + r'^(static const int APPROX_RELEASE_HEIGHT = )\d+(;)$', + ) + with PathPatcher('src/deprecation.h') as (inf, outf): + for line in inf: + m = rgx.match(line) + if m is None: + outf.write(line) + else: + [prefix, suffix] = m.groups() + outf.write( + '{}{}{}\n'.format( + prefix, + releaseheight, + suffix, + ), + ) # Helper code: @@ -148,6 +179,20 @@ def patch_configure_ac(release): ) +def patch_gitian_linux_yml(release, releaseprev): + path = 'contrib/gitian-descriptors/gitian-linux.yml' + with PathPatcher(path) as (inf, outf): + outf.write(inf.readline()) + + secondline = inf.readline() + assert secondline == 'name: "zcash-{}"\n'.format( + releaseprev.novtext + ), repr(secondline) + + outf.write('name: "zcash-{}"\n'.format(release.novtext)) + outf.write(inf.read()) + + def _patch_build_defs(release, path, pattern): rgx = re.compile(pattern) with PathPatcher(path) as (inf, outf): From cf97f669874872dc2edf005ab8aaad88aef701f7 Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Fri, 19 May 2017 17:16:59 -0700 Subject: [PATCH 0068/1062] Remove portions of `./doc/release-process.md` now implemented in `make-release.py`. --- doc/release-process.md | 51 ++++++------------------------------------ 1 file changed, 7 insertions(+), 44 deletions(-) diff --git a/doc/release-process.md b/doc/release-process.md index 45dd3af22..f16325984 100644 --- a/doc/release-process.md +++ b/doc/release-process.md @@ -16,57 +16,20 @@ The following should have been checked well in advance of the release: - miniupnpc - OpenSSL +If this release changes the behavior of the protocol or fixes a serious +bug, verify that a pre-release PR merge updated `PROTOCOL_VERSION` in +`version.h` correctly. + ## Release process -## A. Define the release version as: +Run the release script: - $ ZCASH_RELEASE=MAJOR.MINOR.REVISION(-BUILD_STRING) + $ ./zcutil/make-release.py Example: - $ ZCASH_RELEASE=1.0.0-beta2 - -Also, the following commands use the `ZCASH_RELEASE_PREV` bash variable for the -previous release: - - $ ZCASH_RELEASE_PREV=1.0.0-beta1 - -## B. Create a new release branch / github PR - -### B1. Check that you are up-to-date with current master, then create a release branch. - -### B2. Update (commit) version and deprecation in sources. - -Update the client version in these files: - - README.md - src/clientversion.h - configure.ac - contrib/gitian-descriptors/gitian-linux.yml - -In `configure.ac` and `clientversion.h`: - -- Increment `CLIENT_VERSION_BUILD` according to the following schema: - - - 0-24: `1.0.0-beta1`-`1.0.0-beta25` - - 25-49: `1.0.0-rc1`-`1.0.0-rc25` - - 50: `1.0.0` - - 51-99: `1.0.0-1`-`1.0.0-49` - - (`CLIENT_VERSION_REVISION` rolls over) - - 0-24: `1.0.1-beta1`-`1.0.1-beta25` - -- Change `CLIENT_VERSION_IS_RELEASE` to false while Zcash is in beta-test phase. - -Update `APPROX_RELEASE_HEIGHT` and `WEEKS_UNTIL_DEPRECATION` in `src/deprecation.h` -so that `APPROX_RELEASE_HEIGHT` will be reached shortly after release, and -`WEEKS_UNTIL_DEPRECATION` is the number of weeks from release day until the -deprecation target (as defined by the current deprecation policy). - -If this release changes the behavior of the protocol or fixes a serious bug, we may -also wish to change the `PROTOCOL_VERSION` in `version.h`. - -Commit these changes. (Be sure to do this before building, or else the built binary will include the flag `-dirty`) + $ ./zcutil/make-release.py v1.0.8-1 v1.0.9 Build by running `./zcutil/build.sh`. From 14b2a420d32d96cb40929d52050110366e6acc75 Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Fri, 19 May 2017 17:35:20 -0700 Subject: [PATCH 0069/1062] Switch from `sh_out_logged` to `sh_log`. --- zcutil/make-release.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/zcutil/make-release.py b/zcutil/make-release.py index a94e26f80..7b09c31ed 100755 --- a/zcutil/make-release.py +++ b/zcutil/make-release.py @@ -108,11 +108,11 @@ def initialize_git(release): ) logging.info('Pulling to latest master.') - sh_out_logged('git', 'pull', '--ff-only') + sh_log('git', 'pull', '--ff-only') branch = 'release-' + release.vtext logging.info('Creating release branch: %r', branch) - sh_out_logged('git', 'checkout', '-b', branch) + sh_log('git', 'checkout', '-b', branch) return branch @@ -238,14 +238,19 @@ def initialize_logging(): def sh_out(*args): - logging.debug('Run: %r', args) + logging.debug('Run (out): %r', args) return subprocess.check_output(args) -def sh_out_logged(*args): - out = sh_out(*args) - logging.debug('Output:\n%s', out) - return out +def sh_log(*args): + logging.debug('Run (log): %r', args) + p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + logging.debug('PID: %r', p.pid) + for line in p.stdout: + logging.debug('> %s', line.rstrip()) + status = p.wait() + if status != 0: + raise SystemExit('Nonzero exit status: {!r}'.format(status)) class Version (object): From f6b9ffefb7d2204cb908e71c92e87ef9c8cbcf27 Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Fri, 19 May 2017 17:47:21 -0700 Subject: [PATCH 0070/1062] Shorten the arg log line. --- zcutil/make-release.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zcutil/make-release.py b/zcutil/make-release.py index 7b09c31ed..0b4d222c1 100755 --- a/zcutil/make-release.py +++ b/zcutil/make-release.py @@ -20,7 +20,7 @@ def main(args=sys.argv[1:]): opts = parse_args(args) chdir_to_repo(opts.REPO) initialize_logging() - logging.debug('argv %r parsed %r', sys.argv, opts) + logging.debug('argv %r', sys.argv) try: main_logged( From 785244020a66ad19aedbd5314dbb0b24a00cdf60 Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Fri, 19 May 2017 17:47:34 -0700 Subject: [PATCH 0071/1062] Commit the version changes and build. --- zcutil/make-release.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/zcutil/make-release.py b/zcutil/make-release.py index 0b4d222c1..9303fdb8d 100755 --- a/zcutil/make-release.py +++ b/zcutil/make-release.py @@ -43,6 +43,15 @@ def main_logged(release, releaseprev, releaseheight): patch_version_in_files(release, releaseprev) patch_release_height(releaseheight) + logging.info('Committing version changes.') + sh_log( + 'git', + 'commit', + '--all', + '-m', 'make-release.py versioning changes.', + ) + + build() raise NotImplementedError(main_logged) @@ -143,6 +152,12 @@ def patch_release_height(releaseheight): ) +def build(): + logging.info('Building...') + nproc = sh_out('nproc').strip() + sh_log('./zcutil/build.sh', '-j', nproc) + + # Helper code: def chdir_to_repo(repo): if repo is None: From c62edf9471472e8546281ef7a72b701c755ac4a4 Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Fri, 19 May 2017 18:03:28 -0700 Subject: [PATCH 0072/1062] Generate manpages; commit that; improve error output in sh_log. --- doc/release-process.md | 8 -------- zcutil/make-release.py | 33 ++++++++++++++++++++++----------- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/doc/release-process.md b/doc/release-process.md index f16325984..d681040f7 100644 --- a/doc/release-process.md +++ b/doc/release-process.md @@ -31,14 +31,6 @@ Example: $ ./zcutil/make-release.py v1.0.8-1 v1.0.9 -Build by running `./zcutil/build.sh`. - -Then perform the following command: - - $ bash contrib/devtools/gen-manpages.sh - -Commit the changes. - ### B3. Generate release notes Run the release-notes.py script to generate release notes and update authors.md file. For example: diff --git a/zcutil/make-release.py b/zcutil/make-release.py index 9303fdb8d..97661c1b5 100755 --- a/zcutil/make-release.py +++ b/zcutil/make-release.py @@ -42,16 +42,11 @@ def main_logged(release, releaseprev, releaseheight): initialize_git(release) patch_version_in_files(release, releaseprev) patch_release_height(releaseheight) - - logging.info('Committing version changes.') - sh_log( - 'git', - 'commit', - '--all', - '-m', 'make-release.py versioning changes.', - ) + commit('Versioning changes.') build() + gen_manpages() + commit('Updated manpages.') raise NotImplementedError(main_logged) @@ -158,7 +153,18 @@ def build(): sh_log('./zcutil/build.sh', '-j', nproc) +def gen_manpages(): + logging.info('Generating manpages.') + sh_log('./contrib/devtools/gen-manpages.sh') + + # Helper code: +def commit(message): + logging.info('Committing: %r', message) + fullmsg = 'make-release.py: {}'.format(message) + sh_log('git', 'commit', '--all', '-m', fullmsg) + + def chdir_to_repo(repo): if repo is None: dn = os.path.dirname @@ -258,9 +264,14 @@ def sh_out(*args): def sh_log(*args): - logging.debug('Run (log): %r', args) - p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - logging.debug('PID: %r', p.pid) + PIPE = subprocess.PIPE + try: + p = subprocess.Popen(args, stdout=PIPE, stderr=PIPE) + except OSError: + logging.error('Error launching %r...', args) + raise + + logging.debug('Run (log PID %r): %r', p.pid, args) for line in p.stdout: logging.debug('> %s', line.rstrip()) status = p.wait() From 08d66a9c01c9f144f1822a052553477bdff6af65 Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Fri, 19 May 2017 18:09:35 -0700 Subject: [PATCH 0073/1062] Polish logging a bit more. --- zcutil/make-release.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/zcutil/make-release.py b/zcutil/make-release.py index 97661c1b5..b91d83916 100755 --- a/zcutil/make-release.py +++ b/zcutil/make-release.py @@ -3,7 +3,6 @@ import os import re import sys -import time import logging import argparse import subprocess @@ -236,11 +235,10 @@ def _patch_build_defs(release, path, pattern): def initialize_logging(): - TIME_FMT = '%Y-%m-%dT%H:%M:%S' - logname = './zcash-make-release.{}.log'.format(time.strftime(TIME_FMT)) + logname = './zcash-make-release.log' fmtr = logging.Formatter( '%(asctime)s L%(lineno)-4d %(levelname)-5s | %(message)s', - TIME_FMT, + '%Y-%m-%d %H:%M:%S' ) hout = logging.StreamHandler(sys.stdout) @@ -255,7 +253,7 @@ def initialize_logging(): root.setLevel(logging.DEBUG) root.addHandler(hout) root.addHandler(hpath) - logging.info('zcash make-release.py logging to: %r', logname) + logging.info('zcash make-release.py debug log: %r', logname) def sh_out(*args): From c66c5ab21f25f2c76130694df523040e6b203659 Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Fri, 19 May 2017 18:20:00 -0700 Subject: [PATCH 0074/1062] Tidy up / systematize logging output a bit more. --- zcutil/make-release.py | 50 ++++++++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/zcutil/make-release.py b/zcutil/make-release.py index b91d83916..40151b70c 100755 --- a/zcutil/make-release.py +++ b/zcutil/make-release.py @@ -10,6 +10,7 @@ import traceback import unittest import random from cStringIO import StringIO +from functools import wraps def main(args=sys.argv[1:]): @@ -35,20 +36,6 @@ def main(args=sys.argv[1:]): raise SystemExit(2) -# Top-level flow: -def main_logged(release, releaseprev, releaseheight): - verify_releaseprev_tag(releaseprev) - initialize_git(release) - patch_version_in_files(release, releaseprev) - patch_release_height(releaseheight) - commit('Versioning changes.') - - build() - gen_manpages() - commit('Updated manpages.') - raise NotImplementedError(main_logged) - - def parse_args(args): p = argparse.ArgumentParser(description=main.__doc__) p.add_argument( @@ -75,6 +62,32 @@ def parse_args(args): return p.parse_args(args) +# Top-level flow: +def main_logged(release, releaseprev, releaseheight): + verify_releaseprev_tag(releaseprev) + initialize_git(release) + patch_version_in_files(release, releaseprev) + patch_release_height(releaseheight) + commit('Versioning changes.') + + build() + gen_manpages() + commit('Updated manpages.') + + raise NotImplementedError(main_logged) + + +def phase(message): + def deco(f): + @wraps(f) + def g(*a, **kw): + logging.info('%s', message) + return f(*a, **kw) + return g + return deco + + +@phase('Checking RELEASE_PREV tag.') def verify_releaseprev_tag(releaseprev): candidates = [] for tag in sh_out('git', 'tag', '--list').splitlines(): @@ -97,6 +110,7 @@ def verify_releaseprev_tag(releaseprev): ) +@phase('Initializing git.') def initialize_git(release): junk = sh_out('git', 'status', '--porcelain') if junk.strip(): @@ -119,6 +133,7 @@ def initialize_git(release): return branch +@phase('Patching versioning in files.') def patch_version_in_files(release, releaseprev): patch_README(release, releaseprev) patch_clientversion_h(release) @@ -126,6 +141,7 @@ def patch_version_in_files(release, releaseprev): patch_gitian_linux_yml(release, releaseprev) +@phase('Patching release height for auto-senescence.') def patch_release_height(releaseheight): rgx = re.compile( r'^(static const int APPROX_RELEASE_HEIGHT = )\d+(;)$', @@ -146,14 +162,14 @@ def patch_release_height(releaseheight): ) +@phase('Building...') def build(): - logging.info('Building...') nproc = sh_out('nproc').strip() sh_log('./zcutil/build.sh', '-j', nproc) +@phase('Generating manpages.') def gen_manpages(): - logging.info('Generating manpages.') sh_log('./contrib/devtools/gen-manpages.sh') @@ -361,7 +377,7 @@ class PathPatcher (object): self._path = path def __enter__(self): - logging.info('Patching %r', self._path) + logging.debug('Patching %r', self._path) self._inf = file(self._path, 'r') self._outf = StringIO() return (self._inf, self._outf) From 0df82709b45b973b79d4e9e9b08d31c988506921 Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Mon, 22 May 2017 12:34:00 -0700 Subject: [PATCH 0075/1062] First full-release-branch version of script; rewrite large swatch of release-process.md. [Manually tested.] --- doc/release-process.md | 137 +++++++++++++++++++--------------------- zcutil/make-release.py | 67 ++++++++++++++++++-- zcutil/release-notes.py | 0 3 files changed, 125 insertions(+), 79 deletions(-) mode change 100644 => 100755 zcutil/release-notes.py diff --git a/doc/release-process.md b/doc/release-process.md index d681040f7..8299bf6e4 100644 --- a/doc/release-process.md +++ b/doc/release-process.md @@ -4,26 +4,45 @@ Meta: There should always be a single release engineer to disambiguate responsib ## Pre-release -The following should have been checked well in advance of the release: +### Github Milestone -- All dependencies have been updated as appropriate: - - BDB - - Boost - - ccache - - libgmp - - libsnark (upstream of our fork) - - libsodium - - miniupnpc - - OpenSSL +Ensure all goals for the github milestone are met. If not, remove tickets +or PRs with a comment as to why it is not included. (Running out of time +is a common reason.) + +### Pre-release checklist: + +Check that dependencies are properly hosted by looking at the `check-depends` builder: + + https://ci.z.cash/#/builders/1 + +Check that there are no surprising performance regressions: + + https://speed.z.cash + +Ensure that new performance metrics appear on that site. + +### Protocol Safety Checks: If this release changes the behavior of the protocol or fixes a serious bug, verify that a pre-release PR merge updated `PROTOCOL_VERSION` in `version.h` correctly. +If this release breaks backwards compatibility or needs to prevent +interaction with software forked projects, change the network magic +numbers. Set the four `pchMessageStart` in `CTestNetParams` in +`chainparams.cpp` to random values. + +Both of these should be done in standard PRs ahead of the release +process. If these were not anticipated correctly, this could block the +release, so if you suspect this is necessary, double check with the +whole engineering team. ## Release process -Run the release script: +Run the release script, which will verify you are on the latest clean +checkout of master, create a branch, then commit standard automated +changes to that branch locally: $ ./zcutil/make-release.py @@ -31,58 +50,50 @@ Example: $ ./zcutil/make-release.py v1.0.8-1 v1.0.9 -### B3. Generate release notes +### Create, Review, and Merge the release branch pull request -Run the release-notes.py script to generate release notes and update authors.md file. For example: +Review the automated changes in git: - $ python zcutil/release-notes.py --version $ZCASH_RELEASE + $ git log master..HEAD -Add the newly created release notes to the Git repository: +Push the resulting branch to github: - $ git add ./doc/authors.md ./doc/release-notes/release-notes-$ZCASH_RELEASE.md + $ git push 'git@github.com:$YOUR_GITHUB_NAME/zcash' $(git rev-parse --abbrev-ref HEAD) -Update the Debian package changelog: +Then create the PR on github. Complete the standard review process, +then merge, then wait for CI to complete. - export DEBVERSION=$(echo $ZCASH_RELEASE | sed 's/-beta/~beta/' | sed 's/-rc/~rc/' | sed 's/-/+/') - export DEBEMAIL="${DEBEMAIL:-team@z.cash}" - export DEBFULLNAME="${DEBFULLNAME:-Zcash Company}" - - dch -v $DEBVERSION -D jessie -c contrib/debian/changelog - -(`dch` comes from the devscripts package.) - -### B4. Change the network magics - -If this release breaks backwards compatibility, change the network magic -numbers. Set the four `pchMessageStart` in `CTestNetParams` in `chainparams.cpp` -to random values. - -### B5. Merge the previous changes - -Do the normal pull-request, review, testing process for this release PR. - -## C. Verify code artifact hosting - -### C1. Ensure depends tree is working - -https://ci.z.cash/builders/depends-sources - -### C2. Ensure public parameters work - -Run `./fetch-params.sh`. - -## D. Make tag for the newly merged result +## Make tag for the newly merged result Checkout master and pull the latest version to ensure master is up to date with the release PR which was merged in before. -Check the last commit on the local and remote versions of master to make sure they are the same. + $ git checkout master + $ git pull --ff-only -Then create the git tag: +Check the last commit on the local and remote versions of master to make sure they are the same: - $ git tag -s v${ZCASH_RELEASE} - $ git push origin v${ZCASH_RELEASE} + $ git log -1 -## E. Deploy testnet +The output should include something like, which is created by Homu: + + Auto merge of #4242 - nathan-at-least:release-v1.0.9, r=nathan-at-least + +Then create the git tag. The `-s` means the release tag will be +signed. **CAUTION:** Remember the `v` at the beginning here: + + $ git tag -s v1.0.9 + $ git push origin v1.0.9 + +## Make and deploy deterministic builds + +- Run the [Gitian deterministic build environment](https://github.com/zcash/zcash-gitian) +- Compare the uploaded [build manifests on gitian.sigs](https://github.com/zcash/gitian.sigs) +- If all is well, the DevOps engineer will build the Debian packages and update the + [apt.z.cash package repository](https://apt.z.cash). + +## Post Release Task List + +### Deploy testnet Notify the Zcash DevOps engineer/sysadmin that the release has been tagged. They update some variables in the company's automation code and then run an Ansible playbook, which: @@ -93,26 +104,8 @@ Notify the Zcash DevOps engineer/sysadmin that the release has been tagged. They Then, verify that nodes can connect to the testnet server, and update the guide on the wiki to ensure the correct hostname is listed in the recommended zcash.conf. -## F. Update the 1.0 User Guide +### Update the 1.0 User Guide -## G. Publish the release announcement (blog, zcash-dev, slack) +### Publish the release announcement (blog, zcash-dev, slack) -### G1. Check in with users who opened issues that were resolved in the release - -Contact all users who opened `user support` issues that were resolved in the release, and ask them if the release fixes or improves their issue. - -## H. Make and deploy deterministic builds - -- Run the [Gitian deterministic build environment](https://github.com/zcash/zcash-gitian) -- Compare the uploaded [build manifests on gitian.sigs](https://github.com/zcash/gitian.sigs) -- If all is well, the DevOps engineer will build the Debian packages and update the - [apt.z.cash package repository](https://apt.z.cash). - -## I. Celebrate - -## missing steps -Zcash still needs: - -* thorough pre-release testing (presumably more thorough than standard PR tests) - -* automated release deployment (e.g.: updating build-depends mirror, deploying testnet, etc...) +## Celebrate diff --git a/zcutil/make-release.py b/zcutil/make-release.py index 40151b70c..0ea2b3bac 100755 --- a/zcutil/make-release.py +++ b/zcutil/make-release.py @@ -74,7 +74,9 @@ def main_logged(release, releaseprev, releaseheight): gen_manpages() commit('Updated manpages.') - raise NotImplementedError(main_logged) + gen_release_notes(release) + update_debian_changelog(release) + commit('Updated release notes and changelog.') def phase(message): @@ -173,6 +175,30 @@ def gen_manpages(): sh_log('./contrib/devtools/gen-manpages.sh') +@phase('Generating release notes.') +def gen_release_notes(release): + sh_log('python', './zcutil/release-notes.py', '--version', release.novtext) + sh_log( + 'git', + 'add', + './doc/authors.md', + './doc/release-notes/release-notes-{}.md'.format(release.novtext), + ) + + +@phase('Updating debian changelog.') +def update_debian_changelog(release): + os.environ['DEBEMAIL'] = 'team@z.cash' + os.environ['DEBFULLNAME'] = 'Zcash Company' + sh_log( + 'debchange', + '--newversion', release.debversion, + '--distribution', 'stable', + '--changelog', './contrib/debian/changelog', + '{} release.'.format(release.novtext), + ) + + # Helper code: def commit(message): logging.info('Committing: %r', message) @@ -280,7 +306,7 @@ def sh_out(*args): def sh_log(*args): PIPE = subprocess.PIPE try: - p = subprocess.Popen(args, stdout=PIPE, stderr=PIPE) + p = subprocess.Popen(args, stdout=PIPE, stderr=PIPE, stdin=None) except OSError: logging.error('Error launching %r...', args) raise @@ -334,8 +360,6 @@ class Version (object): self.betarc = betarc self.hotfix = hotfix - self.novtext = '{}.{}.{}'.format(major, minor, patch) - if hotfix is None: self.build = 50 else: @@ -343,13 +367,42 @@ class Version (object): if betarc is None: assert hotfix < 50, hotfix self.build = 50 + hotfix - self.novtext += '-{}'.format(hotfix) else: assert hotfix < 26, hotfix - self.novtext += '-{}{}'.format(betarc, hotfix) self.build = {'beta': 0, 'rc': 25}[betarc] + hotfix - 1 - self.vtext = 'v' + self.novtext + @property + def novtext(self): + return self._novtext(debian=False) + + @property + def vtext(self): + return 'v' + self.novtext + + @property + def debversion(self): + return self._novtext(debian=True) + + def _novtext(self, debian): + novtext = '{}.{}.{}'.format(self.major, self.minor, self.patch) + + if self.hotfix is None: + return novtext + else: + assert self.hotfix > 0, self.hotfix + if self.betarc is None: + assert self.hotfix < 50, self.hotfix + sep = '+' if debian else '-' + return '{}{}{}'.format(novtext, sep, self.hotfix) + else: + assert self.hotfix < 26, self.hotfix + sep = '~' if debian else '-' + return '{}{}{}{}'.format( + novtext, + sep, + self.betarc, + self.hotfix, + ) def __repr__(self): return ''.format(self.vtext) diff --git a/zcutil/release-notes.py b/zcutil/release-notes.py old mode 100644 new mode 100755 From 0cfc9d65fa00bb6102d8fed5ac56ad4951451ac0 Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Mon, 22 May 2017 17:46:13 -0700 Subject: [PATCH 0076/1062] Enable set -u mode. --- qa/zcash/performance-measurements.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/qa/zcash/performance-measurements.sh b/qa/zcash/performance-measurements.sh index 7339609da..4b32ba146 100755 --- a/qa/zcash/performance-measurements.sh +++ b/qa/zcash/performance-measurements.sh @@ -1,4 +1,6 @@ #!/bin/bash +set -u + DATADIR=./benchmark-datadir SHA256CMD="$(command -v sha256sum || echo shasum)" From 453c74743cacf3f42e557fd20e4aa505c15eb757 Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Mon, 22 May 2017 17:46:26 -0700 Subject: [PATCH 0077/1062] Fix a variable name typo. --- qa/zcash/performance-measurements.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qa/zcash/performance-measurements.sh b/qa/zcash/performance-measurements.sh index 4b32ba146..e01337169 100755 --- a/qa/zcash/performance-measurements.sh +++ b/qa/zcash/performance-measurements.sh @@ -34,7 +34,7 @@ function zcashd_start { function zcashd_stop { zcash_rpc stop > /dev/null - wait $ZCASH_PID + wait $ZCASHD_PID } function zcashd_massif_start { From 4e4769863375f32b9dbfbd3fbd1af016274dbcbb Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Mon, 22 May 2017 17:47:36 -0700 Subject: [PATCH 0078/1062] Reuse zcash_rpc. --- qa/zcash/performance-measurements.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qa/zcash/performance-measurements.sh b/qa/zcash/performance-measurements.sh index e01337169..ba6cc54f4 100755 --- a/qa/zcash/performance-measurements.sh +++ b/qa/zcash/performance-measurements.sh @@ -12,12 +12,12 @@ function zcash_rpc { function zcash_rpc_slow { # Timeout of 1 hour - ./src/zcash-cli -datadir="$DATADIR" -rpcwait -rpcuser=user -rpcpassword=password -rpcport=5983 -rpcclienttimeout=3600 "$@" + zcash_rpc -rpcclienttimeout=3600 "$@" } function zcash_rpc_veryslow { # Timeout of 2.5 hours - ./src/zcash-cli -datadir="$DATADIR" -rpcwait -rpcuser=user -rpcpassword=password -rpcport=5983 -rpcclienttimeout=9000 "$@" + zcash_rpc -rpcclienttimeout=9000 "$@" } function zcashd_generate { From 5a027a4a6e6e10bd41f992f85698abe8e3719fb4 Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Mon, 22 May 2017 17:51:23 -0700 Subject: [PATCH 0079/1062] Do not use `-rpcwait` on all `zcash_rpc` invocations, only block when starting zcashd. --- qa/zcash/performance-measurements.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/qa/zcash/performance-measurements.sh b/qa/zcash/performance-measurements.sh index ba6cc54f4..e1eb242be 100755 --- a/qa/zcash/performance-measurements.sh +++ b/qa/zcash/performance-measurements.sh @@ -7,7 +7,7 @@ SHA256CMD="$(command -v sha256sum || echo shasum)" SHA256ARGS="$(command -v sha256sum >/dev/null || echo '-a 256')" function zcash_rpc { - ./src/zcash-cli -datadir="$DATADIR" -rpcwait -rpcuser=user -rpcpassword=password -rpcport=5983 "$@" + ./src/zcash-cli -datadir="$DATADIR" -rpcuser=user -rpcpassword=password -rpcport=5983 "$@" } function zcash_rpc_slow { @@ -20,6 +20,10 @@ function zcash_rpc_veryslow { zcash_rpc -rpcclienttimeout=9000 "$@" } +function zcash_rpc_wait_for_start { + zcash_rpc -rpcwait getinfo > /dev/null +} + function zcashd_generate { zcash_rpc generate 101 > /dev/null } @@ -30,6 +34,7 @@ function zcashd_start { touch "$DATADIR/zcash.conf" ./src/zcashd -regtest -datadir="$DATADIR" -rpcuser=user -rpcpassword=password -rpcport=5983 -showmetrics=0 & ZCASHD_PID=$! + zcash_rpc_wait_for_start } function zcashd_stop { @@ -44,6 +49,7 @@ function zcashd_massif_start { rm -f massif.out valgrind --tool=massif --time-unit=ms --massif-out-file=massif.out ./src/zcashd -regtest -datadir="$DATADIR" -rpcuser=user -rpcpassword=password -rpcport=5983 -showmetrics=0 & ZCASHD_PID=$! + zcash_rpc_wait_for_start } function zcashd_massif_stop { @@ -59,6 +65,7 @@ function zcashd_valgrind_start { rm -f valgrind.out valgrind --leak-check=yes -v --error-limit=no --log-file="valgrind.out" ./src/zcashd -regtest -datadir="$DATADIR" -rpcuser=user -rpcpassword=password -rpcport=5983 -showmetrics=0 & ZCASHD_PID=$! + zcash_rpc_wait_for_start } function zcashd_valgrind_stop { From 7f10df4785a41b7c4bb156af1521c11fc028deb3 Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Mon, 22 May 2017 20:24:42 -0700 Subject: [PATCH 0080/1062] Fix `release-process.md` doc usage for `make-release.py` to have correct arguments and order. --- doc/release-process.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/release-process.md b/doc/release-process.md index 8299bf6e4..d6090dfcd 100644 --- a/doc/release-process.md +++ b/doc/release-process.md @@ -44,11 +44,11 @@ Run the release script, which will verify you are on the latest clean checkout of master, create a branch, then commit standard automated changes to that branch locally: - $ ./zcutil/make-release.py + $ ./zcutil/make-release.py Example: - $ ./zcutil/make-release.py v1.0.8-1 v1.0.9 + $ ./zcutil/make-release.py v1.0.9 v1.0.8-1 120000 ### Create, Review, and Merge the release branch pull request From 73a3f7dc024e0f79e2d434e64dd942359cdffab5 Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Mon, 22 May 2017 20:38:06 -0700 Subject: [PATCH 0081/1062] Include release version in commit comments. --- zcutil/make-release.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/zcutil/make-release.py b/zcutil/make-release.py index 0ea2b3bac..bdbaf03a0 100755 --- a/zcutil/make-release.py +++ b/zcutil/make-release.py @@ -68,15 +68,19 @@ def main_logged(release, releaseprev, releaseheight): initialize_git(release) patch_version_in_files(release, releaseprev) patch_release_height(releaseheight) - commit('Versioning changes.') + commit('Versioning changes for {}.'.format(release.novtext)) build() gen_manpages() - commit('Updated manpages.') + commit('Updated manpages for {}.'.format(release.novtext)) gen_release_notes(release) update_debian_changelog(release) - commit('Updated release notes and changelog.') + commit( + 'Updated release notes and changelog for {}.'.format( + release.novtext, + ), + ) def phase(message): From 92333721e59ebbb919d326e4b8486d4e60a17175 Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Mon, 22 May 2017 20:38:22 -0700 Subject: [PATCH 0082/1062] Examine all future versions which are assumed to follow the same Version parser schema. --- zcutil/make-release.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/zcutil/make-release.py b/zcutil/make-release.py index bdbaf03a0..162cef682 100755 --- a/zcutil/make-release.py +++ b/zcutil/make-release.py @@ -96,8 +96,15 @@ def phase(message): @phase('Checking RELEASE_PREV tag.') def verify_releaseprev_tag(releaseprev): candidates = [] + + # Any tag beginning with a 'v' followed by [1-9] must be a version + # matching our Version parser. Tags beginning with v0 may exist from + # upstream and those do not follow our schema and are silently + # ignored. Any other tag is silently ignored. + candidatergx = re.compile('^v[1-9].*$') + for tag in sh_out('git', 'tag', '--list').splitlines(): - if tag.startswith('v1'): # Ignore v0.* bitcoin tags and other stuff. + if candidatergx.match(tag): candidates.append(Version.parse_arg(tag)) candidates.sort() From 187e64c7abff570e1467ddeb1432e040bb6a67e7 Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Mon, 22 May 2017 20:42:00 -0700 Subject: [PATCH 0083/1062] Consider both beta and rc versions to be `IS_RELEASE == false`. --- zcutil/make-release.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zcutil/make-release.py b/zcutil/make-release.py index 162cef682..07eda1a5a 100755 --- a/zcutil/make-release.py +++ b/zcutil/make-release.py @@ -279,7 +279,7 @@ def _patch_build_defs(release, path, pattern): 'REVISION': release.patch, 'BUILD': release.build, 'IS_RELEASE': ( - 'false' if release.betarc == 'beta' else 'true' + 'false' if release.build < 50 else 'true' ), }[label] outf.write('{} {}{}\n'.format(prefix, repl, suffix)) From 88bf7eb0506195eb69a43ea08954225f81c6d31c Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Mon, 22 May 2017 21:23:11 -0700 Subject: [PATCH 0084/1062] Add a few more version strings to positive parser test. --- zcutil/make-release.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/zcutil/make-release.py b/zcutil/make-release.py index 07eda1a5a..514d5883f 100755 --- a/zcutil/make-release.py +++ b/zcutil/make-release.py @@ -473,6 +473,9 @@ class TestVersion (unittest.TestCase): ('v1.0.7-1', 51), ('v1.0.8', 50), ('v1.0.8-1', 51), + ('v1.0.9', 50), + ('v1.0.10', 50), + ('v7.42.1000', 50), ] ValidVersions = [ From 9eb9eebbb8701edd5e99ce5b7663192e43cc7daa Mon Sep 17 00:00:00 2001 From: Sean Bowe Date: Tue, 23 May 2017 16:31:41 -0600 Subject: [PATCH 0085/1062] Check that pairings work properly when the G1 point is at infinity. --- src/gtest/test_proofs.cpp | 45 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/src/gtest/test_proofs.cpp b/src/gtest/test_proofs.cpp index 49202f1f6..cf097d716 100644 --- a/src/gtest/test_proofs.cpp +++ b/src/gtest/test_proofs.cpp @@ -22,6 +22,51 @@ typedef libsnark::default_r1cs_ppzksnark_pp::Fqe_type curve_Fq2; #include "version.h" #include "utilstrencodings.h" +TEST(proofs, g1_pairing_at_infinity) +{ + for (size_t i = 0; i < 100; i++) { + auto r1 = curve_G1::random_element(); + auto r2 = curve_G2::random_element(); + ASSERT_TRUE( + curve_pp::reduced_pairing(curve_G1::zero(), r2) == + curve_GT::one() + ); + ASSERT_TRUE( + curve_pp::final_exponentiation( + curve_pp::double_miller_loop( + curve_pp::precompute_G1(curve_G1::zero()), + curve_pp::precompute_G2(r2), + curve_pp::precompute_G1(curve_G1::zero()), + curve_pp::precompute_G2(r2) + ) + ) == + curve_GT::one() + ); + ASSERT_TRUE( + curve_pp::final_exponentiation( + curve_pp::double_miller_loop( + curve_pp::precompute_G1(r1), + curve_pp::precompute_G2(r2), + curve_pp::precompute_G1(curve_G1::zero()), + curve_pp::precompute_G2(r2) + ) + ) == + curve_pp::reduced_pairing(r1, r2) + ); + ASSERT_TRUE( + curve_pp::final_exponentiation( + curve_pp::double_miller_loop( + curve_pp::precompute_G1(curve_G1::zero()), + curve_pp::precompute_G2(r2), + curve_pp::precompute_G1(r1), + curve_pp::precompute_G2(r2) + ) + ) == + curve_pp::reduced_pairing(r1, r2) + ); + } +} + TEST(proofs, g2_subgroup_check) { // all G2 elements are order r From ce7e7cafbfab83ab7bf2428bd28d68a85e5d96da Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Wed, 24 May 2017 07:37:10 -0700 Subject: [PATCH 0086/1062] Define the deprecation policy for 1.0.9. This explicitly avoids naming any release-specific data so we can leave this text unchanged for upcoming releases. --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index ca78f36eb..54d594a32 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,14 @@ See important security warnings in **Zcash is unfinished and highly experimental.** Use at your own risk. +Deprecation Policy +------------------ + +This release is considered deprecated 16 weeks after the release day. There +is an automatic deprecation feature which will halt the node some time after +this 16 week time period. The automatic feature is based on block height +and can be explicitly disabled. + Where do I begin? ----------------- We have a guide for joining the main Zcash network: From e895b8631a311ef398c29d17965c7e1d1681245d Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Wed, 24 May 2017 08:15:03 -0700 Subject: [PATCH 0087/1062] Clarify that the feature is automated *shutdown*. --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 54d594a32..61bc85bac 100644 --- a/README.md +++ b/README.md @@ -27,9 +27,9 @@ Deprecation Policy ------------------ This release is considered deprecated 16 weeks after the release day. There -is an automatic deprecation feature which will halt the node some time after -this 16 week time period. The automatic feature is based on block height -and can be explicitly disabled. +is an automatic deprecation shutdown feature which will halt the node some +time after this 16 week time period. The automatic feature is based on block +height and can be explicitly disabled. Where do I begin? ----------------- From de9c56c88abc8b21d69eb65717ed9d33ad36be26 Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Wed, 24 May 2017 12:50:05 -0700 Subject: [PATCH 0088/1062] make-release.py: Versioning changes for 1.0.9. --- README.md | 2 +- configure.ac | 4 ++-- contrib/gitian-descriptors/gitian-linux.yml | 2 +- src/clientversion.h | 4 ++-- src/deprecation.h | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 61bc85bac..6ad2f1b38 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Zcash 1.0.8-1 +Zcash 1.0.9 ============= What is Zcash? diff --git a/configure.ac b/configure.ac index 9aee14148..724ae6e17 100644 --- a/configure.ac +++ b/configure.ac @@ -2,8 +2,8 @@ dnl require autoconf 2.60 (AS_ECHO/AS_ECHO_N) AC_PREREQ([2.60]) define(_CLIENT_VERSION_MAJOR, 1) define(_CLIENT_VERSION_MINOR, 0) -define(_CLIENT_VERSION_REVISION, 8) -define(_CLIENT_VERSION_BUILD, 51) +define(_CLIENT_VERSION_REVISION, 9) +define(_CLIENT_VERSION_BUILD, 50) define(_ZC_BUILD_VAL, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, m4_incr(_CLIENT_VERSION_BUILD), m4_eval(_CLIENT_VERSION_BUILD < 50), 1, m4_eval(_CLIENT_VERSION_BUILD - 24), m4_eval(_CLIENT_VERSION_BUILD == 50), 1, , m4_eval(_CLIENT_VERSION_BUILD - 50))) define(_CLIENT_VERSION_SUFFIX, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, _CLIENT_VERSION_REVISION-beta$1, m4_eval(_CLIENT_VERSION_BUILD < 50), 1, _CLIENT_VERSION_REVISION-rc$1, m4_eval(_CLIENT_VERSION_BUILD == 50), 1, _CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION-$1))) define(_CLIENT_VERSION_IS_RELEASE, true) diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml index 4799bb476..9281d4378 100644 --- a/contrib/gitian-descriptors/gitian-linux.yml +++ b/contrib/gitian-descriptors/gitian-linux.yml @@ -1,5 +1,5 @@ --- -name: "zcash-1.0.8-1" +name: "zcash-1.0.9" enable_cache: true distro: "debian" suites: diff --git a/src/clientversion.h b/src/clientversion.h index b739ed73a..3bd8540c3 100644 --- a/src/clientversion.h +++ b/src/clientversion.h @@ -17,8 +17,8 @@ //! These need to be macros, as clientversion.cpp's and bitcoin*-res.rc's voodoo requires it #define CLIENT_VERSION_MAJOR 1 #define CLIENT_VERSION_MINOR 0 -#define CLIENT_VERSION_REVISION 8 -#define CLIENT_VERSION_BUILD 51 +#define CLIENT_VERSION_REVISION 9 +#define CLIENT_VERSION_BUILD 50 //! Set to true for release, false for prerelease or test build #define CLIENT_VERSION_IS_RELEASE true diff --git a/src/deprecation.h b/src/deprecation.h index f109384a9..0b8e20b92 100644 --- a/src/deprecation.h +++ b/src/deprecation.h @@ -6,7 +6,7 @@ #define ZCASH_DEPRECATION_H // Deprecation policy is 4th third-Tuesday after a release -static const int APPROX_RELEASE_HEIGHT = 115000; +static const int APPROX_RELEASE_HEIGHT = 120500; static const int WEEKS_UNTIL_DEPRECATION = 18; static const int DEPRECATION_HEIGHT = APPROX_RELEASE_HEIGHT + (WEEKS_UNTIL_DEPRECATION * 7 * 24 * 24); From 98574ff5994b90836ba8db44566e78cb4cde8ac5 Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Wed, 24 May 2017 12:51:06 -0700 Subject: [PATCH 0089/1062] make-release.py: Updated manpages for 1.0.9. --- doc/man/zcash-cli.1 | 6 +++--- doc/man/zcash-tx.1 | 6 +++--- doc/man/zcashd.1 | 11 ++++++++--- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/doc/man/zcash-cli.1 b/doc/man/zcash-cli.1 index b66838b65..ab37c76f8 100644 --- a/doc/man/zcash-cli.1 +++ b/doc/man/zcash-cli.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.4. -.TH ZCASH-CLI "1" "April 2017" "zcash-cli v1.0.8-1" "User Commands" +.TH ZCASH-CLI "1" "May 2017" "zcash-cli v1.0.9" "User Commands" .SH NAME -zcash-cli \- manual page for zcash-cli v1.0.8 +zcash-cli \- manual page for zcash-cli v1.0.9 .SH DESCRIPTION -Zcash RPC client version v1.0.8\-1 +Zcash RPC client version v1.0.9 .PP In order to ensure you are adequately protecting your privacy when using Zcash, please see . diff --git a/doc/man/zcash-tx.1 b/doc/man/zcash-tx.1 index 73d80230d..a7468d7a8 100644 --- a/doc/man/zcash-tx.1 +++ b/doc/man/zcash-tx.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.4. -.TH ZCASH-TX "1" "April 2017" "zcash-tx v1.0.8-1" "User Commands" +.TH ZCASH-TX "1" "May 2017" "zcash-tx v1.0.9" "User Commands" .SH NAME -zcash-tx \- manual page for zcash-tx v1.0.8 +zcash-tx \- manual page for zcash-tx v1.0.9 .SH DESCRIPTION -Zcash zcash\-tx utility version v1.0.8\-1 +Zcash zcash\-tx utility version v1.0.9 .SS "Usage:" .TP zcash\-tx [options] [commands] diff --git a/doc/man/zcashd.1 b/doc/man/zcashd.1 index f9e976a19..eed39a4e2 100644 --- a/doc/man/zcashd.1 +++ b/doc/man/zcashd.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.4. -.TH ZCASHD "1" "April 2017" "zcashd v1.0.8-1" "User Commands" +.TH ZCASHD "1" "May 2017" "zcashd v1.0.9" "User Commands" .SH NAME -zcashd \- manual page for zcashd v1.0.8 +zcashd \- manual page for zcashd v1.0.9 .SH DESCRIPTION -Zcash Daemon version v1.0.8\-1 +Zcash Daemon version v1.0.9 .PP In order to ensure you are adequately protecting your privacy when using Zcash, please see . @@ -51,6 +51,11 @@ Run in the background as a daemon and accept commands .IP Specify data directory .HP +\fB\-disabledeprecation=\fR +.IP +Disable block\-height node deprecation and automatic shutdown (example: +\fB\-disabledeprecation\fR=\fI\,1\/\fR.0.9) +.HP \fB\-exportdir=\fR .IP Specify directory to be used when exporting data From 8b922a4ad474367730586717ae91a654321c3e40 Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Wed, 24 May 2017 12:51:06 -0700 Subject: [PATCH 0090/1062] make-release.py: Updated release notes and changelog for 1.0.9. --- contrib/debian/changelog | 6 ++ doc/authors.md | 16 +++-- doc/release-notes/release-notes-1.0.9.md | 90 ++++++++++++++++++++++++ 3 files changed, 105 insertions(+), 7 deletions(-) create mode 100644 doc/release-notes/release-notes-1.0.9.md diff --git a/contrib/debian/changelog b/contrib/debian/changelog index cffa58070..43ef18295 100644 --- a/contrib/debian/changelog +++ b/contrib/debian/changelog @@ -1,3 +1,9 @@ +zcash (1.0.9) stable; urgency=medium + + * 1.0.9 release. + + -- Zcash Company Wed, 24 May 2017 12:51:06 -0700 + zcash (1.0.8+1) jessie; urgency=high * 1.0.8-1 release. diff --git a/doc/authors.md b/doc/authors.md index 03a92cb24..a2336391b 100644 --- a/doc/authors.md +++ b/doc/authors.md @@ -1,21 +1,21 @@ Zcash Contributors ================== -Jack Grigg (393) -Simon Liu (254) -Sean Bowe (185) -Daira Hopwood (83) +Jack Grigg (407) +Simon Liu (259) +Sean Bowe (186) +Daira Hopwood (87) Taylor Hornby (65) Wladimir J. van der Laan (58) +Nathan Wilcox (51) +Jay Graber (49) Jonas Schnelli (48) -Jay Graber (47) Kevin Gallagher (38) Cory Fields (15) Pieter Wuille (14) -Nathan Wilcox (12) nomnombtc (9) +Paige Peterson (9) fanquake (5) -Paige Peterson (5) MarcoFalke (5) Johnathan Corgan (5) Gregory Maxwell (5) @@ -41,6 +41,7 @@ Joe Turgeon (2) Jack Gavigan (2) ITH4Coinomia (2) Gavin Andresen (2) +Amgad Abdelhafez (2) zathras-crypto (1) unsystemizer (1) mruddy (1) @@ -48,6 +49,7 @@ mrbandrews (1) kazcw (1) isle2983 (1) instagibbs (1) +emilrus (1) dexX7 (1) calebogden (1) ayleph (1) diff --git a/doc/release-notes/release-notes-1.0.9.md b/doc/release-notes/release-notes-1.0.9.md new file mode 100644 index 000000000..a1335ec97 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.9.md @@ -0,0 +1,90 @@ +Amgad Abdelhafez (2): + Update timedata.cpp + Update timedata.cpp + +Daira Hopwood (4): + Fix an error reporting bug due to BrokenPipeError and ConnectionResetError not existing in Python 2. refs #2263 + Alert 1002 (versions 1.0.0-1.0.2 inclusive). + Alert 1003 (versions 1.0.3-1.0.8 inclusive). + Disable building Proton by default. + +Jack Grigg (14): + Fix prioritisetransaction RPC test + torcontrol: Handle escapes in Tor QuotedStrings + torcontrol: Add missing copyright header + Convert Zcash versions to Debian format + [manpage] Handle build numbers in versions + Address Daira's comments + Address Daira's further comments + Correctly handle three-digit octals with leading digit 4-7 + Check that >3-digit octals are truncated. + Implement automatic shutdown of deprecated Zcash versions + Wrap messages nicely on metrics screen + Regenerate miner tests + Add a benchmark for calling ConnectBlock on a block with many inputs + Remove additional sources of determinism from benchmark archive + +Jay Graber (2): + Change help text examples to use Zcash addresses + Poll on getblocktemplate result rather than use bare sleep to avoid race condition. + +Nathan Wilcox (39): + [Direct master commit] Fix a release snafu in debian version string. + Show toolchain versions in build.sh. + Start on a make-release.py script; currently just arg parsing and unittests [unittests fail]. + Update version spec by altering test; also update regex to pass single 0 digits in major/minor/patch. + Add another case from debian-style versions. + Add all of the zcash release tags in my current repo as positive test vector. + Add support for beta/rc release versions. + Add version sorting, assert that RELEASE_PREV is the most recent release. + Make SystemExit errors less redundant in output; verify clean git status on master. + Always run unittests prior to actual runs. + Make --help output clean by not running self-test. + Add an option to run against a different repo directory. + Make sure to pull the latest master. + Exit instead of raising an unexpected exception, since it's already logged. + Implement `PathPatcher` abstraction, `clientversion.h` rewrite, and build numbering w/ unittests. + Implement the IS_RELEASE rule for betas. + Generalize buildnum patching for both `clientversion.h` and `configure.ac`. + Modify the `APPROX_RELEASE_HEIGHT`. + Remove portions of `./doc/release-process.md` now implemented in `make-release.py`. + Switch from `sh_out_logged` to `sh_log`. + Shorten the arg log line. + Commit the version changes and build. + Generate manpages; commit that; improve error output in sh_log. + Polish logging a bit more. + Tidy up / systematize logging output a bit more. + First full-release-branch version of script; rewrite large swatch of release-process.md. [Manually tested.] + Enable set -u mode. + Fix a variable name typo. + Reuse zcash_rpc. + Do not use `-rpcwait` on all `zcash_rpc` invocations, only block when starting zcashd. + Fix `release-process.md` doc usage for `make-release.py` to have correct arguments and order. + Include release version in commit comments. + Examine all future versions which are assumed to follow the same Version parser schema. + Consider both beta and rc versions to be `IS_RELEASE == false`. + Add a few more version strings to positive parser test. + Define the deprecation policy for 1.0.9. + Clarify that the feature is automated *shutdown*. + make-release.py: Versioning changes for 1.0.9. + make-release.py: Updated manpages for 1.0.9. + +Paige Peterson (4): + wallet backup instructions + typo and rewording edits + str4d and Ariel's suggestions + specify exportdir being within homedirectory + +Sean Bowe (1): + Check that pairings work properly when the G1 point is at infinity. + +Simon Liu (5): + Add AMQP 1.0 support via Apache Qpid Proton C++ API 0.17.0 + Add --disable-proton flag to build.sh. Proton has build/linker issues with gcc 4.9.2 and requires gcc 5.x. + Fix proton build issue with debian jessie, as used on CI servers. + Change regtest port to 18344. Closes #2269. + Patch to build Proton with minimal dependencies. + +emilrus (1): + Replace bitcoind with zcashd + From cf4f400ca8738c34dba9c4e13810e85f0c45db2b Mon Sep 17 00:00:00 2001 From: kozyilmaz Date: Wed, 31 May 2017 10:38:02 +0300 Subject: [PATCH 0091/1062] =?UTF-8?q?[macOS]=20system=20linker=20does=20no?= =?UTF-8?q?t=20support=20=E2=80=9C--version=E2=80=9D=20option=20but=20only?= =?UTF-8?q?=20=E2=80=9C-v=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zcutil/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zcutil/build.sh b/zcutil/build.sh index 7d9e7142a..857bcf6f7 100755 --- a/zcutil/build.sh +++ b/zcutil/build.sh @@ -102,7 +102,7 @@ eval "$MAKE" --version eval "$CC" --version eval "$CXX" --version as --version -ld --version +ld -v HOST="$HOST" BUILD="$BUILD" NO_RUST="$RUST_ARG" NO_PROTON="$PROTON_ARG" "$MAKE" "$@" -C ./depends/ V=1 ./autogen.sh From c63417bbe7e01c82f645206b15b4d99983cdf326 Mon Sep 17 00:00:00 2001 From: kozyilmaz Date: Sun, 4 Jun 2017 19:46:35 +0300 Subject: [PATCH 0092/1062] option to disable building libraries (zcutil/build.sh) --- zcutil/build.sh | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/zcutil/build.sh b/zcutil/build.sh index 7d9e7142a..f6fd34807 100755 --- a/zcutil/build.sh +++ b/zcutil/build.sh @@ -33,7 +33,7 @@ Usage: $0 --help Show this help message and exit. -$0 [ --enable-lcov || --disable-tests ] [ --disable-mining ] [ --disable-rust ] [ --enable-proton ] [ MAKEARGS... ] +$0 [ --enable-lcov || --disable-tests ] [ --disable-mining ] [ --disable-rust ] [ --enable-proton ] [ --disable-libs ] [ MAKEARGS... ] Build Zcash and most of its transitive dependencies from source. MAKEARGS are applied to both dependencies and Zcash itself. @@ -50,6 +50,9 @@ $0 [ --enable-lcov || --disable-tests ] [ --disable-mining ] [ --disable-rust ] If --enable-proton is passed, Zcash is configured to build the Apache Qpid Proton library required for AMQP support. This library is not built by default. It must be passed after the test/mining/Rust arguments, if present. + + If --disable-libs is passed, Zcash is configured to not build any libraries like + 'libzcashconsensus'. EOF exit 0 fi @@ -96,6 +99,14 @@ then shift fi +# If --disable-libs is the next argument, build without libs: +LIBS_ARG='' +if [ "x${1:-}" = 'x--disable-libs' ] +then + LIBS_ARG='--without-libs' + shift +fi + PREFIX="$(pwd)/depends/$BUILD/" eval "$MAKE" --version @@ -106,5 +117,5 @@ ld --version HOST="$HOST" BUILD="$BUILD" NO_RUST="$RUST_ARG" NO_PROTON="$PROTON_ARG" "$MAKE" "$@" -C ./depends/ V=1 ./autogen.sh -CC="$CC" CXX="$CXX" ./configure --prefix="${PREFIX}" --host="$HOST" --build="$BUILD" "$RUST_ARG" "$HARDENING_ARG" "$LCOV_ARG" "$TEST_ARG" "$MINING_ARG" "$PROTON_ARG" CXXFLAGS='-fwrapv -fno-strict-aliasing -Werror -g' +CC="$CC" CXX="$CXX" ./configure --prefix="${PREFIX}" --host="$HOST" --build="$BUILD" "$RUST_ARG" "$HARDENING_ARG" "$LCOV_ARG" "$TEST_ARG" "$MINING_ARG" "$PROTON_ARG" "$LIBS_ARG" CXXFLAGS='-fwrapv -fno-strict-aliasing -Werror -g' "$MAKE" "$@" V=1 From 3326155481da10ca06e068d0646467918a61928a Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 2 May 2017 17:53:54 +1200 Subject: [PATCH 0093/1062] Revert "Fix secp256k1 test compilation" This reverts commit 87da7b4ea0d5515dad5d204c76945f1e5f7eff03 to make updating the subtree easier. --- src/secp256k1/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/secp256k1/Makefile.am b/src/secp256k1/Makefile.am index 5f388f3fd..cc15338b7 100644 --- a/src/secp256k1/Makefile.am +++ b/src/secp256k1/Makefile.am @@ -70,7 +70,7 @@ noinst_PROGRAMS += tests tests_SOURCES = src/tests.c tests_CPPFLAGS = -DVERIFY $(SECP_INCLUDES) $(SECP_TEST_INCLUDES) tests_LDADD = $(SECP_LIBS) $(SECP_TEST_LIBS) -tests_LDFLAGS = -static -pthread +tests_LDFLAGS = -static TESTS = tests endif From 77404203ee87992f34ff57c2e8a6f0c85717318f Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 6 Jun 2017 17:49:31 +1200 Subject: [PATCH 0094/1062] Squashed 'src/secp256k1/' changes from 22f60a6..84973d3 84973d3 Merge #454: Remove residual parts from the schnorr expirement. 5e95bf2 Remove residual parts from the schnorr expirement. cbc20b8 Merge #452: Minor optimizations to _scalar_inverse to save 4M 4cc8f52 Merge #437: Unroll secp256k1_fe_(get|set)_b32 to make them much faster. 465159c Further shorten the addition chain for scalar inversion. a2b6b19 Fix benchmark print_number infinite loop. 8b7680a Unroll secp256k1_fe_(get|set)_b32 for 10x26. aa84990 Unroll secp256k1_fe_(get|set)_b32 for 5x52. cf12fa1 Minor optimizations to _scalar_inverse to save 4M 1199492 Merge #408: Add `secp256k1_ec_pubkey_negate` and `secp256k1_ec_privkey_negate` 6af0871 Merge #441: secp256k1_context_randomize: document. ab31a52 Merge #444: test: Use checked_alloc eda5c1a Merge #449: Remove executable bit from secp256k1.c 51b77ae Remove executable bit from secp256k1.c 5eb030c test: Use checked_alloc 72d952c FIXUP: Missing "is" 70ff29b secp256k1_context_randomize: document. 9d560f9 Merge #428: Exhaustive recovery 8e48aa6 Add `secp256k1_ec_pubkey_negate` and `secp256k1_ec_privkey_negate` 2cee5fd exhaustive tests: add recovery module 8225239 Merge #433: Make the libcrypto detection fail the newer API. 12de863 Make the libcrypto detection fail the newer API. 678b0e5 exhaustive tests: remove erroneous comment from ecdsa_sig_sign 2928420 Merge #427: Remove Schnorr from travis as well 03ff8c2 group_impl.h: remove unused `secp256k1_ge_set_infinity` function a724d72 configure: add --enable-coverage to set options for coverage analysis b595163 recovery: add tests to cover API misusage 8eecc4a Remove Schnorr from travis as well 6f8ae2f ecdh: test NULL-checking of arguments 25e3cfb ecdsa_impl: replace scalar if-checks with VERIFY_CHECKs in ecdsa_sig_sign a8abae7 Merge #310: Add exhaustive test for group functions on a low-order subgroup b4ceedf Add exhaustive test for verification 83836a9 Add exhaustive tests for group arithmetic, signing, and ecmult on a small group 20b8877 Add exhaustive test for group functions on a low-order subgroup 80773a6 Merge #425: Remove Schnorr experiment e06e878 Remove Schnorr experiment 04c8ef3 Merge #407: Modify parameter order of internal functions to match API parameter order 6e06696 Merge #411: Remove guarantees about memcmp-ability 40c8d7e Merge #421: Update scalar_4x64_impl.h a922365 Merge #422: Restructure nonce clearing 3769783 Restructure nonce clearing 0f9e69d Restructure nonce clearing 9d67afa Update scalar_4x64_impl.h 7d15cd7 Merge #413: fix auto-enabled static precompuatation 00c5d2e fix auto-enabled static precompuatation 91219a1 Remove guarantees about memcmp-ability 7a49cac Merge #410: Add string.h include to ecmult_impl 0bbd5d4 Add string.h include to ecmult_impl 353c1bf Fix secp256k1_ge_set_table_gej_var parameter order 541b783 Fix secp256k1_ge_set_all_gej_var parameter order 7d893f4 Fix secp256k1_fe_inv_all_var parameter order c5b32e1 Merge #405: Make secp256k1_fe_sqrt constant time 926836a Make secp256k1_fe_sqrt constant time e2a8e92 Merge #404: Replace 3M + 4S doubling formula with 2M + 5S one 8ec49d8 Add note about 2M + 5S doubling formula 5a91bd7 Merge #400: A couple minor cleanups ac01378 build: add -DSECP256K1_BUILD to benchmark_internal build flags a6c6f99 Remove a bunch of unused stdlib #includes 65285a6 Merge #403: configure: add flag to disable OpenSSL tests a9b2a5d configure: add flag to disable OpenSSL tests b340123 Merge #402: Add support for testing quadratic residues e6e9805 Add function for testing quadratic residue field/group elements. efd953a Add Jacobi symbol test via GMP fa36a0d Merge #401: ecmult_const: unify endomorphism and non-endomorphism skew cases c6191fd ecmult_const: unify endomorphism and non-endomorphism skew cases 0b3e618 Merge #378: .gitignore build-aux cleanup 6042217 Merge #384: JNI: align shared files copyright/comments to bitcoinj's 24ad20f Merge #399: build: verify that the native compiler works for static precomp b3be852 Merge #398: Test whether ECDH and Schnorr are enabled for JNI aa0b1fd build: verify that the native compiler works for static precomp eee808d Test whether ECDH and Schnorr are enabled for JNI 7b0fb18 Merge #366: ARM assembly implementation of field_10x26 inner (rebase of #173) 001f176 ARM assembly implementation of field_10x26 inner 0172be9 Merge #397: Small fixes for sha256 3f8b78e Fix undefs in hash_impl.h 2ab4695 Fix state size in sha256 struct 6875b01 Merge #386: Add some missing `VERIFY_CHECK(ctx != NULL)` 2c52b5d Merge #389: Cast pointers through uintptr_t under JNI 43097a4 Merge #390: Update bitcoin-core GitHub links 31c9c12 Merge #391: JNI: Only call ecdsa_verify if its inputs parsed correctly 1cb2302 Merge #392: Add testcase which hits additional branch in secp256k1_scalar_sqr d2ee340 Merge #388: bench_ecdh: fix call to secp256k1_context_create 093a497 Add testcase which hits additional branch in secp256k1_scalar_sqr a40c701 JNI: Only call ecdsa_verify if its inputs parsed correctly faa2a11 Update bitcoin-core GitHub links 47b9e78 Cast pointers through uintptr_t under JNI f36f9c6 bench_ecdh: fix call to secp256k1_context_create bcc4881 Add some missing `VERIFY_CHECK(ctx != NULL)` for functions that use `ARG_CHECK` 6ceea2c align shared files copyright/comments to bitcoinj's 70141a8 Update .gitignore 7b549b1 Merge #373: build: fix x86_64 asm detection for some compilers bc7c93c Merge #374: Add note about y=0 being possible on one of the sextic twists e457018 Merge #364: JNI rebased 86e2d07 JNI library: cleanup, removed unimplemented code 3093576a JNI library bd2895f Merge pull request #371 e72e93a Add note about y=0 being possible on one of the sextic twists 3f8fdfb build: fix x86_64 asm detection for some compilers e5a9047 [Trivial] Remove double semicolons c18b869 Merge pull request #360 3026daa Merge pull request #302 03d4611 Add sage verification script for the group laws a965937 Merge pull request #361 83221ec Add experimental features to configure 5d4c5a3 Prevent damage_array in the signature test from going out of bounds. 419bf7f Merge pull request #356 6c527ec Merge pull request #357 445f7f1 Fix for Windows compile issue 03d84a4 Benchmark against OpenSSL verification 2bfb82b Merge pull request #351 06aeea5 Turn secp256k1_ec_pubkey_serialize outlen to in/out 970164d Merge pull request #348 6466625 Improvements for coordinate decompression e2100ad Merge pull request #347 8e48787 Change secp256k1_ec_pubkey_combine's count argument to size_t. c69dea0 Clear output in more cases for pubkey_combine, adds tests. 269d422 Comment copyediting. b4d17da Merge pull request #344 4709265 Merge pull request #345 26abce7 Adds 32 static test vectors for scalar mul, sqr, inv. 5b71a3f Better error case handling for pubkey_create & pubkey_serialize, more tests. 3b7bc69 Merge pull request #343 eed87af Change contrib/laxder from headers-only to files compilable as standalone C d7eb1ae Merge pull request #342 7914a6e Make lax_der_privatekey_parsing.h not depend on internal code 73f64ff Merge pull request #339 9234391 Overhaul flags handling 1a36898 Make flags more explicit, add runtime checks. 1a3e03a Merge pull request #340 96be204 Add additional tests for eckey and arg-checks. bb5aa4d Make the tweak function zeroize-output-on-fail behavior consistent. 4a243da Move secp256k1_ec_privkey_import/export to contrib. 1b3efc1 Move secp256k1_ecdsa_sig_recover into the recovery module. e3cd679 Eliminate all side-effects from VERIFY_CHECK() usage. b30fc85 Avoid nonce_function_rfc6979 algo16 argument emulation. 70d4640 Make secp256k1_ec_pubkey_create skip processing invalid secret keys. 6c476a8 Minor comment improvements. 131afe5 Merge pull request #334 0c6ab2f Introduce explicit lower-S normalization fea19e7 Add contrib/lax_der_parsing.h 3bb9c44 Rewrite ECDSA signature parsing code fa57f1b Use secp256k1_rand_int and secp256k1_rand_bits more 49b3749 Add new tests for the extra testrand functions f684d7d Faster secp256k1_rand_int implementation 251b1a6 Improve testrand: add extra random functions 31994c8 Merge pull request #338 f79aa88 Bugfix: swap arguments to noncefp c98df26 Merge pull request #319 67f7da4 Extensive interface and operations tests for secp256k1_ec_pubkey_parse. ee2cb40 Add ARG_CHECKs to secp256k1_ec_pubkey_parse/secp256k1_ec_pubkey_serialize 7450ef1 Merge pull request #328 68a3c76 Merge pull request #329 98135ee Merge pull request #332 37100d7 improve ECDH header-doc b13d749 Fix couple of typos in API comments 7c823e3 travis: fixup module configs cc3141a Merge pull request #325 ee58fae Merge pull request #326 213aa67 Do not force benchmarks to be statically linked. 338fc8b Add API exports to secp256k1_nonce_function_default and secp256k1_nonce_function_rfc6979. 52fd03f Merge pull request #320 9f6993f Remove some dead code. 357f8cd Merge pull request #314 118cd82 Use explicit symbol visibility. 4e64608 Include public module headers when compiling modules. 1f41437 Merge pull request #316 fe0d463 Merge pull request #317 cfe0ed9 Fix miscellaneous style nits that irritate overactive static analysis. 2b199de Use the explicit NULL macro for pointer comparisons. 9e90516 Merge pull request #294 dd891e0 Get rid of _t as it is POSIX reserved 201819b Merge pull request #313 912f203 Eliminate a few unbraced statements that crept into the code. eeab823 Merge pull request #299 486b9bb Use a flags bitfield for compressed option to secp256k1_ec_pubkey_serialize and secp256k1_ec_privkey_export 05732c5 Callback data: Accept pointers to either const or non-const data 1973c73 Bugfix: Reinitialise buffer lengths that have been used as outputs 788038d Use size_t for lengths (at least in external API) c9d7c2a secp256k1_context_set_{error,illegal}_callback: Restore default handler by passing NULL as function argument 9aac008 secp256k1_context_destroy: Allow NULL argument as a no-op 64b730b secp256k1_context_create: Use unsigned type for flags bitfield cb04ab5 Merge pull request #309 a551669 Merge pull request #295 81e45ff Update group_impl.h 85e3a2c Merge pull request #112 b2eb63b Merge pull request #293 dc0ce9f [API BREAK] Change argument order to out/outin/in 6d947ca Merge pull request #298 c822693 Merge pull request #301 6d04350 Merge pull request #303 7ab311c Merge pull request #304 5fb3229 Fixes a bug where bench_sign would fail due to passing in too small a buffer. 263dcbc remove unused assignment b183b41 bugfix: "ARG_CHECK(ctx != NULL)" makes no sense 6da1446 build: fix parallel build 5eb4356 Merge pull request #291 c996d53 Print success 9f443be Move pubkey recovery code to separate module d49abbd Separate ECDSA recovery tests 439d34a Separate recoverable and normal signatures a7b046e Merge pull request #289 f66907f Improve/reformat API documentation secp256k1.h 2f77487 Add context building benchmarks cc623d5 Merge pull request #287 de7e398 small typo fix 9d96e36 Merge pull request #280 432e1ce Merge pull request #283 14727fd Use correct name in gitignore 356b0e9 Actually test static precomputation in Travis ff3a5df Merge pull request #284 2587208 Merge pull request #212 a5a66c7 Add support for custom EC-Schnorr-SHA256 signatures d84a378 Merge pull request #252 72ae443 Improve perf. of cmov-based table lookup 92e53fc Implement endomorphism optimization for secp256k1_ecmult_const ed35d43 Make `secp256k1_scalar_add_bit` conditional; make `secp256k1_scalar_split_lambda_var` constant time 91c0ce9 Add benchmarks for ECDH and const-time multiplication 0739bbb Add ECDH module which works by hashing the output of ecmult_const 4401500 Add constant-time multiply `secp256k1_ecmult_const` for ECDH e4ce393 build: fix hard-coded usage of "gen_context" b8e39ac build: don't use BUILT_SOURCES for the static context header baa75da tests: add a couple tests ae4f0c6 Merge pull request #278 995c548 Introduce callback functions for dealing with errors. c333074 Merge pull request #282 18c329c Remove the internal secp256k1_ecdsa_sig_t type 74a2acd Add a secp256k1_ecdsa_signature_t type 23cfa91 Introduce secp256k1_pubkey_t type 4c63780 Merge pull request #269 3e6f1e2 Change rfc6979 implementation to be a generic PRNG ed5334a Update configure.ac to make it build on OpenBSD 1b68366 Merge pull request #274 a83bb48 Make ecmult static precomputation default 166b32f Merge pull request #276 c37812f Add gen_context src/ecmult_static_context.h to CLEANFILES to fix distclean. 125c15d Merge pull request #275 76f6769 Fix build with static ecmult altroot and make dist. 5133f78 Merge pull request #254 b0a60e6 Merge pull request #258 733c1e6 Add travis build to test the static context. fbecc38 Add ability to use a statically generated ecmult context. 4fb174d Merge pull request #263 4ab8990 Merge pull request #270 bdf0e0c Merge pull request #271 31d0c1f Merge pull request #273 eb2c8ff Add missing casts to SECP256K1_FE_CONST_INNER 55399c2 Further performance improvements to _ecmult_wnaf 99fd963 Add secp256k1_ec_pubkey_compress(), with test similar to the related decompress() function. 145cc6e Improve performance of _ecmult_wnaf 36b305a Verify the result of GMP modular inverse using non-GMP code 0cbc860 Merge pull request #266 06ff7fe Merge pull request #267 5a43124 Save 1 _fe_negate since s1 == -s2 a5d796e Update code comments 3f3964e Add specific VERIFY tests for _fe_cmov 7d054cd Refactor to save a _fe_negate b28d02a Refactor to remove a local var 55e7fc3 Perf. improvement in _gej_add_ge a0601cd Fix VERIFY calculations in _fe_cmov methods 17f7148 Merge pull request #261 7657420 Add tests for adding P+Q with P.x!=Q.x and P.y=-Q.y 8c5d5f7 tests: Add failing unit test for #257 (bad addition formula) 5de4c5d gej_add_ge: fix degenerate case when computing P + (-lambda)P bcf2fcf gej_add_ge: rearrange algebra e2a07c7 Fix compilation with C++ 873a453 Merge pull request #250 91eb0da Merge pull request #247 210ffed Use separate in and out pointers in `secp256k1_ec_pubkey_decompress` a1d5ae1 Tiny optimization 729badf Merge pull request #210 2d5a186 Apply effective-affine trick to precomp 4f9791a Effective affine addition in EC multiplication 2b4cf41 Use pkg-config always when possible, with failover to manual checks for libcrypto git-subtree-dir: src/secp256k1 git-subtree-split: 84973d393ac240a90b2e1a6538c5368202bc2224 --- .gitignore | 24 +- .travis.yml | 24 +- Makefile.am | 136 +- README.md | 2 +- build-aux/m4/ax_jni_include_dir.m4 | 140 + build-aux/m4/ax_prog_cc_for_build.m4 | 125 + build-aux/m4/bitcoin_secp.m4 | 26 +- configure.ac | 203 +- contrib/lax_der_parsing.c | 150 + contrib/lax_der_parsing.h | 91 + contrib/lax_der_privatekey_parsing.c | 113 + contrib/lax_der_privatekey_parsing.h | 90 + include/secp256k1.h | 733 ++-- include/secp256k1_ecdh.h | 31 + include/secp256k1_recovery.h | 110 + libsecp256k1.pc.in | 2 +- sage/group_prover.sage | 322 ++ sage/secp256k1.sage | 306 ++ sage/weierstrass_prover.sage | 264 ++ src/asm/field_10x26_arm.s | 919 +++++ src/basic-config.h | 32 + src/bench.h | 22 +- src/bench_ecdh.c | 54 + src/bench_internal.c | 96 +- src/bench_recover.c | 25 +- src/bench_sign.c | 22 +- src/bench_verify.c | 72 +- src/ecdsa.h | 15 +- src/ecdsa_impl.h | 280 +- src/eckey.h | 17 +- src/eckey_impl.h | 127 +- src/ecmult.h | 20 +- src/ecmult_const.h | 15 + src/ecmult_const_impl.h | 239 ++ src/ecmult_gen.h | 24 +- src/ecmult_gen_impl.h | 102 +- src/ecmult_impl.h | 303 +- src/field.h | 73 +- src/field_10x26.h | 24 +- src/field_10x26_impl.h | 133 +- src/field_5x52.h | 22 +- src/field_5x52_impl.h | 144 +- src/field_5x52_int128_impl.h | 4 +- src/field_impl.h | 80 +- src/gen_context.c | 74 + src/group.h | 109 +- src/group_impl.h | 469 ++- src/hash.h | 4 +- src/hash_impl.h | 22 +- src/java/org/bitcoin/NativeSecp256k1.java | 440 +- src/java/org/bitcoin/NativeSecp256k1Test.java | 226 ++ src/java/org/bitcoin/NativeSecp256k1Util.java | 45 + src/java/org/bitcoin/Secp256k1Context.java | 51 + src/java/org_bitcoin_NativeSecp256k1.c | 378 +- src/java/org_bitcoin_NativeSecp256k1.h | 106 +- src/java/org_bitcoin_Secp256k1Context.c | 15 + src/java/org_bitcoin_Secp256k1Context.h | 22 + src/modules/ecdh/Makefile.am.include | 8 + src/modules/ecdh/main_impl.h | 54 + src/modules/ecdh/tests_impl.h | 105 + src/modules/recovery/Makefile.am.include | 8 + src/modules/recovery/main_impl.h | 193 + src/modules/recovery/tests_impl.h | 393 ++ src/num.h | 34 +- src/num_gmp.h | 2 +- src/num_gmp_impl.h | 66 +- src/scalar.h | 61 +- src/scalar_4x64.h | 2 +- src/scalar_4x64_impl.h | 107 +- src/scalar_8x32.h | 2 +- src/scalar_8x32_impl.h | 90 +- src/scalar_impl.h | 254 +- src/scalar_low.h | 15 + src/scalar_low_impl.h | 114 + src/secp256k1.c | 695 ++-- src/testrand.h | 12 +- src/testrand_impl.h | 86 +- src/tests.c | 3567 ++++++++++++++--- src/tests_exhaustive.c | 470 +++ src/util.h | 31 +- 80 files changed, 11846 insertions(+), 2240 deletions(-) create mode 100644 build-aux/m4/ax_jni_include_dir.m4 create mode 100644 build-aux/m4/ax_prog_cc_for_build.m4 create mode 100644 contrib/lax_der_parsing.c create mode 100644 contrib/lax_der_parsing.h create mode 100644 contrib/lax_der_privatekey_parsing.c create mode 100644 contrib/lax_der_privatekey_parsing.h create mode 100644 include/secp256k1_ecdh.h create mode 100644 include/secp256k1_recovery.h create mode 100644 sage/group_prover.sage create mode 100644 sage/secp256k1.sage create mode 100644 sage/weierstrass_prover.sage create mode 100644 src/asm/field_10x26_arm.s create mode 100644 src/basic-config.h create mode 100644 src/bench_ecdh.c create mode 100644 src/ecmult_const.h create mode 100644 src/ecmult_const_impl.h create mode 100644 src/gen_context.c create mode 100644 src/java/org/bitcoin/NativeSecp256k1Test.java create mode 100644 src/java/org/bitcoin/NativeSecp256k1Util.java create mode 100644 src/java/org/bitcoin/Secp256k1Context.java create mode 100644 src/java/org_bitcoin_Secp256k1Context.c create mode 100644 src/java/org_bitcoin_Secp256k1Context.h create mode 100644 src/modules/ecdh/Makefile.am.include create mode 100644 src/modules/ecdh/main_impl.h create mode 100644 src/modules/ecdh/tests_impl.h create mode 100644 src/modules/recovery/Makefile.am.include create mode 100755 src/modules/recovery/main_impl.h create mode 100644 src/modules/recovery/tests_impl.h create mode 100644 src/scalar_low.h create mode 100644 src/scalar_low_impl.h create mode 100644 src/tests_exhaustive.c diff --git a/.gitignore b/.gitignore index 076ff1295..87fea161b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,13 @@ bench_inv +bench_ecdh bench_sign bench_verify +bench_schnorr_verify bench_recover bench_internal tests +exhaustive_tests +gen_context *.exe *.so *.a @@ -22,16 +26,24 @@ config.status libtool .deps/ .dirstamp -build-aux/ *.lo *.o *~ src/libsecp256k1-config.h src/libsecp256k1-config.h.in -m4/libtool.m4 -m4/ltoptions.m4 -m4/ltsugar.m4 -m4/ltversion.m4 -m4/lt~obsolete.m4 +src/ecmult_static_context.h +build-aux/config.guess +build-aux/config.sub +build-aux/depcomp +build-aux/install-sh +build-aux/ltmain.sh +build-aux/m4/libtool.m4 +build-aux/m4/lt~obsolete.m4 +build-aux/m4/ltoptions.m4 +build-aux/m4/ltsugar.m4 +build-aux/m4/ltversion.m4 +build-aux/missing +build-aux/compile +build-aux/test-driver src/stamp-h1 libsecp256k1.pc diff --git a/.travis.yml b/.travis.yml index 0d8089cfe..243952924 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,22 +6,30 @@ addons: compiler: - clang - gcc +cache: + directories: + - src/java/guava/ env: global: - - FIELD=auto BIGNUM=auto SCALAR=auto ENDOMORPHISM=no ASM=no BUILD=check EXTRAFLAGS= HOST= + - FIELD=auto BIGNUM=auto SCALAR=auto ENDOMORPHISM=no STATICPRECOMPUTATION=yes ASM=no BUILD=check EXTRAFLAGS= HOST= ECDH=no RECOVERY=no EXPERIMENTAL=no + - GUAVA_URL=https://search.maven.org/remotecontent?filepath=com/google/guava/guava/18.0/guava-18.0.jar GUAVA_JAR=src/java/guava/guava-18.0.jar matrix: - - SCALAR=32bit + - SCALAR=32bit RECOVERY=yes + - SCALAR=32bit FIELD=32bit ECDH=yes EXPERIMENTAL=yes - SCALAR=64bit - - FIELD=64bit + - FIELD=64bit RECOVERY=yes - FIELD=64bit ENDOMORPHISM=yes + - FIELD=64bit ENDOMORPHISM=yes ECDH=yes EXPERIMENTAL=yes - FIELD=64bit ASM=x86_64 - FIELD=64bit ENDOMORPHISM=yes ASM=x86_64 - - FIELD=32bit - FIELD=32bit ENDOMORPHISM=yes - BIGNUM=no - - BIGNUM=no ENDOMORPHISM=yes + - BIGNUM=no ENDOMORPHISM=yes RECOVERY=yes EXPERIMENTAL=yes + - BIGNUM=no STATICPRECOMPUTATION=no - BUILD=distcheck - - EXTRAFLAGS=CFLAGS=-DDETERMINISTIC + - EXTRAFLAGS=CPPFLAGS=-DDETERMINISTIC + - EXTRAFLAGS=CFLAGS=-O0 + - BUILD=check-java ECDH=yes EXPERIMENTAL=yes matrix: fast_finish: true include: @@ -51,9 +59,11 @@ matrix: packages: - gcc-multilib - libgmp-dev:i386 +before_install: mkdir -p `dirname $GUAVA_JAR` +install: if [ ! -f $GUAVA_JAR ]; then wget $GUAVA_URL -O $GUAVA_JAR; fi before_script: ./autogen.sh script: - if [ -n "$HOST" ]; then export USE_HOST="--host=$HOST"; fi - if [ "x$HOST" = "xi686-linux-gnu" ]; then export CC="$CC -m32"; fi - - ./configure --enable-endomorphism=$ENDOMORPHISM --with-field=$FIELD --with-bignum=$BIGNUM --with-scalar=$SCALAR $EXTRAFLAGS $USE_HOST && make -j2 $BUILD + - ./configure --enable-experimental=$EXPERIMENTAL --enable-endomorphism=$ENDOMORPHISM --with-field=$FIELD --with-bignum=$BIGNUM --with-scalar=$SCALAR --enable-ecmult-static-precomputation=$STATICPRECOMPUTATION --enable-module-ecdh=$ECDH --enable-module-recovery=$RECOVERY $EXTRAFLAGS $USE_HOST && make -j2 $BUILD os: linux diff --git a/Makefile.am b/Makefile.am index cc15338b7..c071fbe27 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,14 +1,22 @@ ACLOCAL_AMFLAGS = -I build-aux/m4 lib_LTLIBRARIES = libsecp256k1.la +if USE_JNI +JNI_LIB = libsecp256k1_jni.la +noinst_LTLIBRARIES = $(JNI_LIB) +else +JNI_LIB = +endif include_HEADERS = include/secp256k1.h noinst_HEADERS = noinst_HEADERS += src/scalar.h noinst_HEADERS += src/scalar_4x64.h noinst_HEADERS += src/scalar_8x32.h +noinst_HEADERS += src/scalar_low.h noinst_HEADERS += src/scalar_impl.h noinst_HEADERS += src/scalar_4x64_impl.h noinst_HEADERS += src/scalar_8x32_impl.h +noinst_HEADERS += src/scalar_low_impl.h noinst_HEADERS += src/group.h noinst_HEADERS += src/group_impl.h noinst_HEADERS += src/num_gmp.h @@ -19,6 +27,8 @@ noinst_HEADERS += src/eckey.h noinst_HEADERS += src/eckey_impl.h noinst_HEADERS += src/ecmult.h noinst_HEADERS += src/ecmult_impl.h +noinst_HEADERS += src/ecmult_const.h +noinst_HEADERS += src/ecmult_const_impl.h noinst_HEADERS += src/ecmult_gen.h noinst_HEADERS += src/ecmult_gen_impl.h noinst_HEADERS += src/num.h @@ -30,6 +40,7 @@ noinst_HEADERS += src/field_5x52_impl.h noinst_HEADERS += src/field_5x52_int128_impl.h noinst_HEADERS += src/field_5x52_asm_impl.h noinst_HEADERS += src/java/org_bitcoin_NativeSecp256k1.h +noinst_HEADERS += src/java/org_bitcoin_Secp256k1Context.h noinst_HEADERS += src/util.h noinst_HEADERS += src/testrand.h noinst_HEADERS += src/testrand_impl.h @@ -38,40 +49,129 @@ noinst_HEADERS += src/hash_impl.h noinst_HEADERS += src/field.h noinst_HEADERS += src/field_impl.h noinst_HEADERS += src/bench.h +noinst_HEADERS += contrib/lax_der_parsing.h +noinst_HEADERS += contrib/lax_der_parsing.c +noinst_HEADERS += contrib/lax_der_privatekey_parsing.h +noinst_HEADERS += contrib/lax_der_privatekey_parsing.c + +if USE_EXTERNAL_ASM +COMMON_LIB = libsecp256k1_common.la +noinst_LTLIBRARIES = $(COMMON_LIB) +else +COMMON_LIB = +endif pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libsecp256k1.pc -libsecp256k1_la_SOURCES = src/secp256k1.c -libsecp256k1_la_CPPFLAGS = -I$(top_srcdir)/include $(SECP_INCLUDES) -libsecp256k1_la_LIBADD = $(SECP_LIBS) +if USE_EXTERNAL_ASM +if USE_ASM_ARM +libsecp256k1_common_la_SOURCES = src/asm/field_10x26_arm.s +endif +endif +libsecp256k1_la_SOURCES = src/secp256k1.c +libsecp256k1_la_CPPFLAGS = -DSECP256K1_BUILD -I$(top_srcdir)/include -I$(top_srcdir)/src $(SECP_INCLUDES) +libsecp256k1_la_LIBADD = $(JNI_LIB) $(SECP_LIBS) $(COMMON_LIB) + +libsecp256k1_jni_la_SOURCES = src/java/org_bitcoin_NativeSecp256k1.c src/java/org_bitcoin_Secp256k1Context.c +libsecp256k1_jni_la_CPPFLAGS = -DSECP256K1_BUILD $(JNI_INCLUDES) noinst_PROGRAMS = if USE_BENCHMARK -noinst_PROGRAMS += bench_verify bench_recover bench_sign bench_internal +noinst_PROGRAMS += bench_verify bench_sign bench_internal bench_verify_SOURCES = src/bench_verify.c -bench_verify_LDADD = libsecp256k1.la $(SECP_LIBS) -bench_verify_LDFLAGS = -static -bench_recover_SOURCES = src/bench_recover.c -bench_recover_LDADD = libsecp256k1.la $(SECP_LIBS) -bench_recover_LDFLAGS = -static +bench_verify_LDADD = libsecp256k1.la $(SECP_LIBS) $(SECP_TEST_LIBS) $(COMMON_LIB) bench_sign_SOURCES = src/bench_sign.c -bench_sign_LDADD = libsecp256k1.la $(SECP_LIBS) -bench_sign_LDFLAGS = -static +bench_sign_LDADD = libsecp256k1.la $(SECP_LIBS) $(SECP_TEST_LIBS) $(COMMON_LIB) bench_internal_SOURCES = src/bench_internal.c -bench_internal_LDADD = $(SECP_LIBS) -bench_internal_LDFLAGS = -static -bench_internal_CPPFLAGS = $(SECP_INCLUDES) +bench_internal_LDADD = $(SECP_LIBS) $(COMMON_LIB) +bench_internal_CPPFLAGS = -DSECP256K1_BUILD $(SECP_INCLUDES) endif +TESTS = if USE_TESTS noinst_PROGRAMS += tests tests_SOURCES = src/tests.c -tests_CPPFLAGS = -DVERIFY $(SECP_INCLUDES) $(SECP_TEST_INCLUDES) -tests_LDADD = $(SECP_LIBS) $(SECP_TEST_LIBS) +tests_CPPFLAGS = -DSECP256K1_BUILD -I$(top_srcdir)/src -I$(top_srcdir)/include $(SECP_INCLUDES) $(SECP_TEST_INCLUDES) +if !ENABLE_COVERAGE +tests_CPPFLAGS += -DVERIFY +endif +tests_LDADD = $(SECP_LIBS) $(SECP_TEST_LIBS) $(COMMON_LIB) tests_LDFLAGS = -static -TESTS = tests +TESTS += tests endif -EXTRA_DIST = autogen.sh +if USE_EXHAUSTIVE_TESTS +noinst_PROGRAMS += exhaustive_tests +exhaustive_tests_SOURCES = src/tests_exhaustive.c +exhaustive_tests_CPPFLAGS = -DSECP256K1_BUILD -I$(top_srcdir)/src $(SECP_INCLUDES) +if !ENABLE_COVERAGE +exhaustive_tests_CPPFLAGS += -DVERIFY +endif +exhaustive_tests_LDADD = $(SECP_LIBS) +exhaustive_tests_LDFLAGS = -static +TESTS += exhaustive_tests +endif + +JAVAROOT=src/java +JAVAORG=org/bitcoin +JAVA_GUAVA=$(srcdir)/$(JAVAROOT)/guava/guava-18.0.jar +CLASSPATH_ENV=CLASSPATH=$(JAVA_GUAVA) +JAVA_FILES= \ + $(JAVAROOT)/$(JAVAORG)/NativeSecp256k1.java \ + $(JAVAROOT)/$(JAVAORG)/NativeSecp256k1Test.java \ + $(JAVAROOT)/$(JAVAORG)/NativeSecp256k1Util.java \ + $(JAVAROOT)/$(JAVAORG)/Secp256k1Context.java + +if USE_JNI + +$(JAVA_GUAVA): + @echo Guava is missing. Fetch it via: \ + wget https://search.maven.org/remotecontent?filepath=com/google/guava/guava/18.0/guava-18.0.jar -O $(@) + @false + +.stamp-java: $(JAVA_FILES) + @echo Compiling $^ + $(AM_V_at)$(CLASSPATH_ENV) javac $^ + @touch $@ + +if USE_TESTS + +check-java: libsecp256k1.la $(JAVA_GUAVA) .stamp-java + $(AM_V_at)java -Djava.library.path="./:./src:./src/.libs:.libs/" -cp "$(JAVA_GUAVA):$(JAVAROOT)" $(JAVAORG)/NativeSecp256k1Test + +endif +endif + +if USE_ECMULT_STATIC_PRECOMPUTATION +CPPFLAGS_FOR_BUILD +=-I$(top_srcdir) +CFLAGS_FOR_BUILD += -Wall -Wextra -Wno-unused-function + +gen_context_OBJECTS = gen_context.o +gen_context_BIN = gen_context$(BUILD_EXEEXT) +gen_%.o: src/gen_%.c + $(CC_FOR_BUILD) $(CPPFLAGS_FOR_BUILD) $(CFLAGS_FOR_BUILD) -c $< -o $@ + +$(gen_context_BIN): $(gen_context_OBJECTS) + $(CC_FOR_BUILD) $^ -o $@ + +$(libsecp256k1_la_OBJECTS): src/ecmult_static_context.h +$(tests_OBJECTS): src/ecmult_static_context.h +$(bench_internal_OBJECTS): src/ecmult_static_context.h + +src/ecmult_static_context.h: $(gen_context_BIN) + ./$(gen_context_BIN) + +CLEANFILES = $(gen_context_BIN) src/ecmult_static_context.h $(JAVAROOT)/$(JAVAORG)/*.class .stamp-java +endif + +EXTRA_DIST = autogen.sh src/gen_context.c src/basic-config.h $(JAVA_FILES) + +if ENABLE_MODULE_ECDH +include src/modules/ecdh/Makefile.am.include +endif + +if ENABLE_MODULE_RECOVERY +include src/modules/recovery/Makefile.am.include +endif diff --git a/README.md b/README.md index 6095db422..8cd344ea8 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ libsecp256k1 ============ -[![Build Status](https://travis-ci.org/bitcoin/secp256k1.svg?branch=master)](https://travis-ci.org/bitcoin/secp256k1) +[![Build Status](https://travis-ci.org/bitcoin-core/secp256k1.svg?branch=master)](https://travis-ci.org/bitcoin-core/secp256k1) Optimized C library for EC operations on curve secp256k1. diff --git a/build-aux/m4/ax_jni_include_dir.m4 b/build-aux/m4/ax_jni_include_dir.m4 new file mode 100644 index 000000000..1fc362761 --- /dev/null +++ b/build-aux/m4/ax_jni_include_dir.m4 @@ -0,0 +1,140 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_jni_include_dir.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_JNI_INCLUDE_DIR +# +# DESCRIPTION +# +# AX_JNI_INCLUDE_DIR finds include directories needed for compiling +# programs using the JNI interface. +# +# JNI include directories are usually in the Java distribution. This is +# deduced from the value of $JAVA_HOME, $JAVAC, or the path to "javac", in +# that order. When this macro completes, a list of directories is left in +# the variable JNI_INCLUDE_DIRS. +# +# Example usage follows: +# +# AX_JNI_INCLUDE_DIR +# +# for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS +# do +# CPPFLAGS="$CPPFLAGS -I$JNI_INCLUDE_DIR" +# done +# +# If you want to force a specific compiler: +# +# - at the configure.in level, set JAVAC=yourcompiler before calling +# AX_JNI_INCLUDE_DIR +# +# - at the configure level, setenv JAVAC +# +# Note: This macro can work with the autoconf M4 macros for Java programs. +# This particular macro is not part of the original set of macros. +# +# LICENSE +# +# Copyright (c) 2008 Don Anderson +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 10 + +AU_ALIAS([AC_JNI_INCLUDE_DIR], [AX_JNI_INCLUDE_DIR]) +AC_DEFUN([AX_JNI_INCLUDE_DIR],[ + +JNI_INCLUDE_DIRS="" + +if test "x$JAVA_HOME" != x; then + _JTOPDIR="$JAVA_HOME" +else + if test "x$JAVAC" = x; then + JAVAC=javac + fi + AC_PATH_PROG([_ACJNI_JAVAC], [$JAVAC], [no]) + if test "x$_ACJNI_JAVAC" = xno; then + AC_MSG_WARN([cannot find JDK; try setting \$JAVAC or \$JAVA_HOME]) + fi + _ACJNI_FOLLOW_SYMLINKS("$_ACJNI_JAVAC") + _JTOPDIR=`echo "$_ACJNI_FOLLOWED" | sed -e 's://*:/:g' -e 's:/[[^/]]*$::'` +fi + +case "$host_os" in + darwin*) _JTOPDIR=`echo "$_JTOPDIR" | sed -e 's:/[[^/]]*$::'` + _JINC="$_JTOPDIR/Headers";; + *) _JINC="$_JTOPDIR/include";; +esac +_AS_ECHO_LOG([_JTOPDIR=$_JTOPDIR]) +_AS_ECHO_LOG([_JINC=$_JINC]) + +# On Mac OS X 10.6.4, jni.h is a symlink: +# /System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers/jni.h +# -> ../../CurrentJDK/Headers/jni.h. + +AC_CACHE_CHECK(jni headers, ac_cv_jni_header_path, +[ +if test -f "$_JINC/jni.h"; then + ac_cv_jni_header_path="$_JINC" + JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $ac_cv_jni_header_path" +else + _JTOPDIR=`echo "$_JTOPDIR" | sed -e 's:/[[^/]]*$::'` + if test -f "$_JTOPDIR/include/jni.h"; then + ac_cv_jni_header_path="$_JTOPDIR/include" + JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $ac_cv_jni_header_path" + else + ac_cv_jni_header_path=none + fi +fi +]) + + + +# get the likely subdirectories for system specific java includes +case "$host_os" in +bsdi*) _JNI_INC_SUBDIRS="bsdos";; +darwin*) _JNI_INC_SUBDIRS="darwin";; +freebsd*) _JNI_INC_SUBDIRS="freebsd";; +linux*) _JNI_INC_SUBDIRS="linux genunix";; +osf*) _JNI_INC_SUBDIRS="alpha";; +solaris*) _JNI_INC_SUBDIRS="solaris";; +mingw*) _JNI_INC_SUBDIRS="win32";; +cygwin*) _JNI_INC_SUBDIRS="win32";; +*) _JNI_INC_SUBDIRS="genunix";; +esac + +if test "x$ac_cv_jni_header_path" != "xnone"; then + # add any subdirectories that are present + for JINCSUBDIR in $_JNI_INC_SUBDIRS + do + if test -d "$_JTOPDIR/include/$JINCSUBDIR"; then + JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $_JTOPDIR/include/$JINCSUBDIR" + fi + done +fi +]) + +# _ACJNI_FOLLOW_SYMLINKS +# Follows symbolic links on , +# finally setting variable _ACJNI_FOLLOWED +# ---------------------------------------- +AC_DEFUN([_ACJNI_FOLLOW_SYMLINKS],[ +# find the include directory relative to the javac executable +_cur="$1" +while ls -ld "$_cur" 2>/dev/null | grep " -> " >/dev/null; do + AC_MSG_CHECKING([symlink for $_cur]) + _slink=`ls -ld "$_cur" | sed 's/.* -> //'` + case "$_slink" in + /*) _cur="$_slink";; + # 'X' avoids triggering unwanted echo options. + *) _cur=`echo "X$_cur" | sed -e 's/^X//' -e 's:[[^/]]*$::'`"$_slink";; + esac + AC_MSG_RESULT([$_cur]) +done +_ACJNI_FOLLOWED="$_cur" +])# _ACJNI diff --git a/build-aux/m4/ax_prog_cc_for_build.m4 b/build-aux/m4/ax_prog_cc_for_build.m4 new file mode 100644 index 000000000..77fd346a7 --- /dev/null +++ b/build-aux/m4/ax_prog_cc_for_build.m4 @@ -0,0 +1,125 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_prog_cc_for_build.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_PROG_CC_FOR_BUILD +# +# DESCRIPTION +# +# This macro searches for a C compiler that generates native executables, +# that is a C compiler that surely is not a cross-compiler. This can be +# useful if you have to generate source code at compile-time like for +# example GCC does. +# +# The macro sets the CC_FOR_BUILD and CPP_FOR_BUILD macros to anything +# needed to compile or link (CC_FOR_BUILD) and preprocess (CPP_FOR_BUILD). +# The value of these variables can be overridden by the user by specifying +# a compiler with an environment variable (like you do for standard CC). +# +# It also sets BUILD_EXEEXT and BUILD_OBJEXT to the executable and object +# file extensions for the build platform, and GCC_FOR_BUILD to `yes' if +# the compiler we found is GCC. All these variables but GCC_FOR_BUILD are +# substituted in the Makefile. +# +# LICENSE +# +# Copyright (c) 2008 Paolo Bonzini +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 8 + +AU_ALIAS([AC_PROG_CC_FOR_BUILD], [AX_PROG_CC_FOR_BUILD]) +AC_DEFUN([AX_PROG_CC_FOR_BUILD], [dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_CPP])dnl +AC_REQUIRE([AC_EXEEXT])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl + +dnl Use the standard macros, but make them use other variable names +dnl +pushdef([ac_cv_prog_CPP], ac_cv_build_prog_CPP)dnl +pushdef([ac_cv_prog_gcc], ac_cv_build_prog_gcc)dnl +pushdef([ac_cv_prog_cc_works], ac_cv_build_prog_cc_works)dnl +pushdef([ac_cv_prog_cc_cross], ac_cv_build_prog_cc_cross)dnl +pushdef([ac_cv_prog_cc_g], ac_cv_build_prog_cc_g)dnl +pushdef([ac_cv_exeext], ac_cv_build_exeext)dnl +pushdef([ac_cv_objext], ac_cv_build_objext)dnl +pushdef([ac_exeext], ac_build_exeext)dnl +pushdef([ac_objext], ac_build_objext)dnl +pushdef([CC], CC_FOR_BUILD)dnl +pushdef([CPP], CPP_FOR_BUILD)dnl +pushdef([CFLAGS], CFLAGS_FOR_BUILD)dnl +pushdef([CPPFLAGS], CPPFLAGS_FOR_BUILD)dnl +pushdef([LDFLAGS], LDFLAGS_FOR_BUILD)dnl +pushdef([host], build)dnl +pushdef([host_alias], build_alias)dnl +pushdef([host_cpu], build_cpu)dnl +pushdef([host_vendor], build_vendor)dnl +pushdef([host_os], build_os)dnl +pushdef([ac_cv_host], ac_cv_build)dnl +pushdef([ac_cv_host_alias], ac_cv_build_alias)dnl +pushdef([ac_cv_host_cpu], ac_cv_build_cpu)dnl +pushdef([ac_cv_host_vendor], ac_cv_build_vendor)dnl +pushdef([ac_cv_host_os], ac_cv_build_os)dnl +pushdef([ac_cpp], ac_build_cpp)dnl +pushdef([ac_compile], ac_build_compile)dnl +pushdef([ac_link], ac_build_link)dnl + +save_cross_compiling=$cross_compiling +save_ac_tool_prefix=$ac_tool_prefix +cross_compiling=no +ac_tool_prefix= + +AC_PROG_CC +AC_PROG_CPP +AC_EXEEXT + +ac_tool_prefix=$save_ac_tool_prefix +cross_compiling=$save_cross_compiling + +dnl Restore the old definitions +dnl +popdef([ac_link])dnl +popdef([ac_compile])dnl +popdef([ac_cpp])dnl +popdef([ac_cv_host_os])dnl +popdef([ac_cv_host_vendor])dnl +popdef([ac_cv_host_cpu])dnl +popdef([ac_cv_host_alias])dnl +popdef([ac_cv_host])dnl +popdef([host_os])dnl +popdef([host_vendor])dnl +popdef([host_cpu])dnl +popdef([host_alias])dnl +popdef([host])dnl +popdef([LDFLAGS])dnl +popdef([CPPFLAGS])dnl +popdef([CFLAGS])dnl +popdef([CPP])dnl +popdef([CC])dnl +popdef([ac_objext])dnl +popdef([ac_exeext])dnl +popdef([ac_cv_objext])dnl +popdef([ac_cv_exeext])dnl +popdef([ac_cv_prog_cc_g])dnl +popdef([ac_cv_prog_cc_cross])dnl +popdef([ac_cv_prog_cc_works])dnl +popdef([ac_cv_prog_gcc])dnl +popdef([ac_cv_prog_CPP])dnl + +dnl Finally, set Makefile variables +dnl +BUILD_EXEEXT=$ac_build_exeext +BUILD_OBJEXT=$ac_build_objext +AC_SUBST(BUILD_EXEEXT)dnl +AC_SUBST(BUILD_OBJEXT)dnl +AC_SUBST([CFLAGS_FOR_BUILD])dnl +AC_SUBST([CPPFLAGS_FOR_BUILD])dnl +AC_SUBST([LDFLAGS_FOR_BUILD])dnl +]) diff --git a/build-aux/m4/bitcoin_secp.m4 b/build-aux/m4/bitcoin_secp.m4 index 4a398d6c9..b74acb8c1 100644 --- a/build-aux/m4/bitcoin_secp.m4 +++ b/build-aux/m4/bitcoin_secp.m4 @@ -3,21 +3,20 @@ AC_DEFUN([SECP_INT128_CHECK],[ has_int128=$ac_cv_type___int128 ]) -dnl +dnl escape "$0x" below using the m4 quadrigaph @S|@, and escape it again with a \ for the shell. AC_DEFUN([SECP_64BIT_ASM_CHECK],[ AC_MSG_CHECKING(for x86_64 assembly availability) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include ]],[[ uint64_t a = 11, tmp; - __asm__ __volatile__("movq $0x100000000,%1; mulq %%rsi" : "+a"(a) : "S"(tmp) : "cc", "%rdx"); + __asm__ __volatile__("movq \@S|@0x100000000,%1; mulq %%rsi" : "+a"(a) : "S"(tmp) : "cc", "%rdx"); ]])],[has_64bit_asm=yes],[has_64bit_asm=no]) AC_MSG_RESULT([$has_64bit_asm]) ]) dnl AC_DEFUN([SECP_OPENSSL_CHECK],[ -if test x"$use_pkgconfig" = x"yes"; then - : #NOP + has_libcrypto=no m4_ifdef([PKG_CHECK_MODULES],[ PKG_CHECK_MODULES([CRYPTO], [libcrypto], [has_libcrypto=yes],[has_libcrypto=no]) if test x"$has_libcrypto" = x"yes"; then @@ -27,11 +26,16 @@ if test x"$use_pkgconfig" = x"yes"; then LIBS="$TEMP_LIBS" fi ]) -else - AC_CHECK_HEADER(openssl/crypto.h,[AC_CHECK_LIB(crypto, main,[has_libcrypto=yes; CRYPTO_LIBS=-lcrypto; AC_DEFINE(HAVE_LIBCRYPTO,1,[Define this symbol if libcrypto is installed])] -)]) - LIBS= -fi + if test x$has_libcrypto = xno; then + AC_CHECK_HEADER(openssl/crypto.h,[ + AC_CHECK_LIB(crypto, main,[ + has_libcrypto=yes + CRYPTO_LIBS=-lcrypto + AC_DEFINE(HAVE_LIBCRYPTO,1,[Define this symbol if libcrypto is installed]) + ]) + ]) + LIBS= + fi if test x"$has_libcrypto" = x"yes" && test x"$has_openssl_ec" = x; then AC_MSG_CHECKING(for EC functions in libcrypto) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ @@ -42,6 +46,10 @@ if test x"$has_libcrypto" = x"yes" && test x"$has_openssl_ec" = x; then ECDSA_sign(0, NULL, 0, NULL, NULL, eckey); ECDSA_verify(0, NULL, 0, NULL, 0, eckey); EC_KEY_free(eckey); + ECDSA_SIG *sig_openssl; + sig_openssl = ECDSA_SIG_new(); + (void)sig_openssl->r; + ECDSA_SIG_free(sig_openssl); ]])],[has_openssl_ec=yes],[has_openssl_ec=no]) AC_MSG_RESULT([$has_openssl_ec]) fi diff --git a/configure.ac b/configure.ac index 3dc182951..e5fcbcb4e 100644 --- a/configure.ac +++ b/configure.ac @@ -17,24 +17,19 @@ PKG_PROG_PKG_CONFIG AC_PATH_TOOL(AR, ar) AC_PATH_TOOL(RANLIB, ranlib) AC_PATH_TOOL(STRIP, strip) +AX_PROG_CC_FOR_BUILD if test "x$CFLAGS" = "x"; then - CFLAGS="-O3 -g" + CFLAGS="-g" fi +AM_PROG_CC_C_O + AC_PROG_CC_C89 if test x"$ac_cv_prog_cc_c89" = x"no"; then AC_MSG_ERROR([c89 compiler support required]) fi - -case $host in - *mingw*) - use_pkgconfig=no - ;; - *) - use_pkgconfig=yes - ;; -esac +AM_PROG_AS case $host_os in *darwin*) @@ -80,22 +75,70 @@ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])], CFLAGS="$saved_CFLAGS" ]) +saved_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -fvisibility=hidden" +AC_MSG_CHECKING([if ${CC} supports -fvisibility=hidden]) +AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])], + [ AC_MSG_RESULT([yes]) ], + [ AC_MSG_RESULT([no]) + CFLAGS="$saved_CFLAGS" + ]) AC_ARG_ENABLE(benchmark, AS_HELP_STRING([--enable-benchmark],[compile benchmark (default is no)]), [use_benchmark=$enableval], [use_benchmark=no]) +AC_ARG_ENABLE(coverage, + AS_HELP_STRING([--enable-coverage],[enable compiler flags to support kcov coverage analysis]), + [enable_coverage=$enableval], + [enable_coverage=no]) + AC_ARG_ENABLE(tests, AS_HELP_STRING([--enable-tests],[compile tests (default is yes)]), [use_tests=$enableval], [use_tests=yes]) +AC_ARG_ENABLE(openssl_tests, + AS_HELP_STRING([--enable-openssl-tests],[enable OpenSSL tests, if OpenSSL is available (default is auto)]), + [enable_openssl_tests=$enableval], + [enable_openssl_tests=auto]) + +AC_ARG_ENABLE(experimental, + AS_HELP_STRING([--enable-experimental],[allow experimental configure options (default is no)]), + [use_experimental=$enableval], + [use_experimental=no]) + +AC_ARG_ENABLE(exhaustive_tests, + AS_HELP_STRING([--enable-exhaustive-tests],[compile exhaustive tests (default is yes)]), + [use_exhaustive_tests=$enableval], + [use_exhaustive_tests=yes]) + AC_ARG_ENABLE(endomorphism, AS_HELP_STRING([--enable-endomorphism],[enable endomorphism (default is no)]), [use_endomorphism=$enableval], [use_endomorphism=no]) +AC_ARG_ENABLE(ecmult_static_precomputation, + AS_HELP_STRING([--enable-ecmult-static-precomputation],[enable precomputed ecmult table for signing (default is yes)]), + [use_ecmult_static_precomputation=$enableval], + [use_ecmult_static_precomputation=auto]) + +AC_ARG_ENABLE(module_ecdh, + AS_HELP_STRING([--enable-module-ecdh],[enable ECDH shared secret computation (experimental)]), + [enable_module_ecdh=$enableval], + [enable_module_ecdh=no]) + +AC_ARG_ENABLE(module_recovery, + AS_HELP_STRING([--enable-module-recovery],[enable ECDSA pubkey recovery module (default is no)]), + [enable_module_recovery=$enableval], + [enable_module_recovery=no]) + +AC_ARG_ENABLE(jni, + AS_HELP_STRING([--enable-jni],[enable libsecp256k1_jni (default is auto)]), + [use_jni=$enableval], + [use_jni=auto]) + AC_ARG_WITH([field], [AS_HELP_STRING([--with-field=64bit|32bit|auto], [Specify Field Implementation. Default is auto])],[req_field=$withval], [req_field=auto]) @@ -105,8 +148,8 @@ AC_ARG_WITH([bignum], [AS_HELP_STRING([--with-bignum=gmp|no|auto], AC_ARG_WITH([scalar], [AS_HELP_STRING([--with-scalar=64bit|32bit|auto], [Specify scalar implementation. Default is auto])],[req_scalar=$withval], [req_scalar=auto]) -AC_ARG_WITH([asm], [AS_HELP_STRING([--with-asm=x86_64|no|auto] -[Specify assembly optimizations to use. Default is auto])],[req_asm=$withval], [req_asm=auto]) +AC_ARG_WITH([asm], [AS_HELP_STRING([--with-asm=x86_64|arm|no|auto] +[Specify assembly optimizations to use. Default is auto (experimental: arm)])],[req_asm=$withval], [req_asm=auto]) AC_CHECK_TYPES([__int128]) @@ -116,6 +159,42 @@ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[void myfunc() {__builtin_expect(0,0);}]])], [ AC_MSG_RESULT([no]) ]) +if test x"$enable_coverage" = x"yes"; then + AC_DEFINE(COVERAGE, 1, [Define this symbol to compile out all VERIFY code]) + CFLAGS="$CFLAGS -O0 --coverage" + LDFLAGS="--coverage" +else + CFLAGS="$CFLAGS -O3" +fi + +if test x"$use_ecmult_static_precomputation" != x"no"; then + save_cross_compiling=$cross_compiling + cross_compiling=no + TEMP_CC="$CC" + CC="$CC_FOR_BUILD" + AC_MSG_CHECKING([native compiler: ${CC_FOR_BUILD}]) + AC_RUN_IFELSE( + [AC_LANG_PROGRAM([], [return 0])], + [working_native_cc=yes], + [working_native_cc=no],[dnl]) + CC="$TEMP_CC" + cross_compiling=$save_cross_compiling + + if test x"$working_native_cc" = x"no"; then + set_precomp=no + if test x"$use_ecmult_static_precomputation" = x"yes"; then + AC_MSG_ERROR([${CC_FOR_BUILD} does not produce working binaries. Please set CC_FOR_BUILD]) + else + AC_MSG_RESULT([${CC_FOR_BUILD} does not produce working binaries. Please set CC_FOR_BUILD]) + fi + else + AC_MSG_RESULT([ok]) + set_precomp=yes + fi +else + set_precomp=no +fi + if test x"$req_asm" = x"auto"; then SECP_64BIT_ASM_CHECK if test x"$has_64bit_asm" = x"yes"; then @@ -133,6 +212,8 @@ else AC_MSG_ERROR([x86_64 assembly optimization requested but not available]) fi ;; + arm) + ;; no) ;; *) @@ -225,10 +306,15 @@ else fi # select assembly optimization +use_external_asm=no + case $set_asm in x86_64) AC_DEFINE(USE_ASM_X86_64, 1, [Define this symbol to enable x86_64 assembly optimizations]) ;; +arm) + use_external_asm=yes + ;; no) ;; *) @@ -283,16 +369,48 @@ esac if test x"$use_tests" = x"yes"; then SECP_OPENSSL_CHECK if test x"$has_openssl_ec" = x"yes"; then - AC_DEFINE(ENABLE_OPENSSL_TESTS, 1, [Define this symbol if OpenSSL EC functions are available]) - SECP_TEST_INCLUDES="$SSL_CFLAGS $CRYPTO_CFLAGS" - SECP_TEST_LIBS="$CRYPTO_LIBS" + if test x"$enable_openssl_tests" != x"no"; then + AC_DEFINE(ENABLE_OPENSSL_TESTS, 1, [Define this symbol if OpenSSL EC functions are available]) + SECP_TEST_INCLUDES="$SSL_CFLAGS $CRYPTO_CFLAGS" + SECP_TEST_LIBS="$CRYPTO_LIBS" - case $host in - *mingw*) - SECP_TEST_LIBS="$SECP_TEST_LIBS -lgdi32" - ;; - esac + case $host in + *mingw*) + SECP_TEST_LIBS="$SECP_TEST_LIBS -lgdi32" + ;; + esac + fi + else + if test x"$enable_openssl_tests" = x"yes"; then + AC_MSG_ERROR([OpenSSL tests requested but OpenSSL with EC support is not available]) + fi + fi +else + if test x"$enable_openssl_tests" = x"yes"; then + AC_MSG_ERROR([OpenSSL tests requested but tests are not enabled]) + fi +fi +if test x"$use_jni" != x"no"; then + AX_JNI_INCLUDE_DIR + have_jni_dependencies=yes + if test x"$enable_module_ecdh" = x"no"; then + have_jni_dependencies=no + fi + if test "x$JNI_INCLUDE_DIRS" = "x"; then + have_jni_dependencies=no + fi + if test "x$have_jni_dependencies" = "xno"; then + if test x"$use_jni" = x"yes"; then + AC_MSG_ERROR([jni support explicitly requested but headers/dependencies were not found. Enable ECDH and try again.]) + fi + AC_MSG_WARN([jni headers/dependencies not found. jni support disabled]) + use_jni=no + else + use_jni=yes + for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS; do + JNI_INCLUDES="$JNI_INCLUDES -I$JNI_INCLUDE_DIR" + done fi fi @@ -305,22 +423,67 @@ if test x"$use_endomorphism" = x"yes"; then AC_DEFINE(USE_ENDOMORPHISM, 1, [Define this symbol to use endomorphism optimization]) fi +if test x"$set_precomp" = x"yes"; then + AC_DEFINE(USE_ECMULT_STATIC_PRECOMPUTATION, 1, [Define this symbol to use a statically generated ecmult table]) +fi + +if test x"$enable_module_ecdh" = x"yes"; then + AC_DEFINE(ENABLE_MODULE_ECDH, 1, [Define this symbol to enable the ECDH module]) +fi + +if test x"$enable_module_recovery" = x"yes"; then + AC_DEFINE(ENABLE_MODULE_RECOVERY, 1, [Define this symbol to enable the ECDSA pubkey recovery module]) +fi + AC_C_BIGENDIAN() +if test x"$use_external_asm" = x"yes"; then + AC_DEFINE(USE_EXTERNAL_ASM, 1, [Define this symbol if an external (non-inline) assembly implementation is used]) +fi + +AC_MSG_NOTICE([Using static precomputation: $set_precomp]) AC_MSG_NOTICE([Using assembly optimizations: $set_asm]) AC_MSG_NOTICE([Using field implementation: $set_field]) AC_MSG_NOTICE([Using bignum implementation: $set_bignum]) AC_MSG_NOTICE([Using scalar implementation: $set_scalar]) AC_MSG_NOTICE([Using endomorphism optimizations: $use_endomorphism]) +AC_MSG_NOTICE([Building for coverage analysis: $enable_coverage]) +AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh]) +AC_MSG_NOTICE([Building ECDSA pubkey recovery module: $enable_module_recovery]) +AC_MSG_NOTICE([Using jni: $use_jni]) + +if test x"$enable_experimental" = x"yes"; then + AC_MSG_NOTICE([******]) + AC_MSG_NOTICE([WARNING: experimental build]) + AC_MSG_NOTICE([Experimental features do not have stable APIs or properties, and may not be safe for production use.]) + AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh]) + AC_MSG_NOTICE([******]) +else + if test x"$enable_module_ecdh" = x"yes"; then + AC_MSG_ERROR([ECDH module is experimental. Use --enable-experimental to allow.]) + fi + if test x"$set_asm" = x"arm"; then + AC_MSG_ERROR([ARM assembly optimization is experimental. Use --enable-experimental to allow.]) + fi +fi AC_CONFIG_HEADERS([src/libsecp256k1-config.h]) AC_CONFIG_FILES([Makefile libsecp256k1.pc]) +AC_SUBST(JNI_INCLUDES) AC_SUBST(SECP_INCLUDES) AC_SUBST(SECP_LIBS) AC_SUBST(SECP_TEST_LIBS) AC_SUBST(SECP_TEST_INCLUDES) +AM_CONDITIONAL([ENABLE_COVERAGE], [test x"$enable_coverage" = x"yes"]) AM_CONDITIONAL([USE_TESTS], [test x"$use_tests" != x"no"]) +AM_CONDITIONAL([USE_EXHAUSTIVE_TESTS], [test x"$use_exhaustive_tests" != x"no"]) AM_CONDITIONAL([USE_BENCHMARK], [test x"$use_benchmark" = x"yes"]) +AM_CONDITIONAL([USE_ECMULT_STATIC_PRECOMPUTATION], [test x"$set_precomp" = x"yes"]) +AM_CONDITIONAL([ENABLE_MODULE_ECDH], [test x"$enable_module_ecdh" = x"yes"]) +AM_CONDITIONAL([ENABLE_MODULE_RECOVERY], [test x"$enable_module_recovery" = x"yes"]) +AM_CONDITIONAL([USE_JNI], [test x"$use_jni" == x"yes"]) +AM_CONDITIONAL([USE_EXTERNAL_ASM], [test x"$use_external_asm" = x"yes"]) +AM_CONDITIONAL([USE_ASM_ARM], [test x"$set_asm" = x"arm"]) dnl make sure nothing new is exported so that we don't break the cache PKGCONFIG_PATH_TEMP="$PKG_CONFIG_PATH" diff --git a/contrib/lax_der_parsing.c b/contrib/lax_der_parsing.c new file mode 100644 index 000000000..5b141a994 --- /dev/null +++ b/contrib/lax_der_parsing.c @@ -0,0 +1,150 @@ +/********************************************************************** + * Copyright (c) 2015 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#include +#include + +#include "lax_der_parsing.h" + +int ecdsa_signature_parse_der_lax(const secp256k1_context* ctx, secp256k1_ecdsa_signature* sig, const unsigned char *input, size_t inputlen) { + size_t rpos, rlen, spos, slen; + size_t pos = 0; + size_t lenbyte; + unsigned char tmpsig[64] = {0}; + int overflow = 0; + + /* Hack to initialize sig with a correctly-parsed but invalid signature. */ + secp256k1_ecdsa_signature_parse_compact(ctx, sig, tmpsig); + + /* Sequence tag byte */ + if (pos == inputlen || input[pos] != 0x30) { + return 0; + } + pos++; + + /* Sequence length bytes */ + if (pos == inputlen) { + return 0; + } + lenbyte = input[pos++]; + if (lenbyte & 0x80) { + lenbyte -= 0x80; + if (pos + lenbyte > inputlen) { + return 0; + } + pos += lenbyte; + } + + /* Integer tag byte for R */ + if (pos == inputlen || input[pos] != 0x02) { + return 0; + } + pos++; + + /* Integer length for R */ + if (pos == inputlen) { + return 0; + } + lenbyte = input[pos++]; + if (lenbyte & 0x80) { + lenbyte -= 0x80; + if (pos + lenbyte > inputlen) { + return 0; + } + while (lenbyte > 0 && input[pos] == 0) { + pos++; + lenbyte--; + } + if (lenbyte >= sizeof(size_t)) { + return 0; + } + rlen = 0; + while (lenbyte > 0) { + rlen = (rlen << 8) + input[pos]; + pos++; + lenbyte--; + } + } else { + rlen = lenbyte; + } + if (rlen > inputlen - pos) { + return 0; + } + rpos = pos; + pos += rlen; + + /* Integer tag byte for S */ + if (pos == inputlen || input[pos] != 0x02) { + return 0; + } + pos++; + + /* Integer length for S */ + if (pos == inputlen) { + return 0; + } + lenbyte = input[pos++]; + if (lenbyte & 0x80) { + lenbyte -= 0x80; + if (pos + lenbyte > inputlen) { + return 0; + } + while (lenbyte > 0 && input[pos] == 0) { + pos++; + lenbyte--; + } + if (lenbyte >= sizeof(size_t)) { + return 0; + } + slen = 0; + while (lenbyte > 0) { + slen = (slen << 8) + input[pos]; + pos++; + lenbyte--; + } + } else { + slen = lenbyte; + } + if (slen > inputlen - pos) { + return 0; + } + spos = pos; + pos += slen; + + /* Ignore leading zeroes in R */ + while (rlen > 0 && input[rpos] == 0) { + rlen--; + rpos++; + } + /* Copy R value */ + if (rlen > 32) { + overflow = 1; + } else { + memcpy(tmpsig + 32 - rlen, input + rpos, rlen); + } + + /* Ignore leading zeroes in S */ + while (slen > 0 && input[spos] == 0) { + slen--; + spos++; + } + /* Copy S value */ + if (slen > 32) { + overflow = 1; + } else { + memcpy(tmpsig + 64 - slen, input + spos, slen); + } + + if (!overflow) { + overflow = !secp256k1_ecdsa_signature_parse_compact(ctx, sig, tmpsig); + } + if (overflow) { + memset(tmpsig, 0, 64); + secp256k1_ecdsa_signature_parse_compact(ctx, sig, tmpsig); + } + return 1; +} + diff --git a/contrib/lax_der_parsing.h b/contrib/lax_der_parsing.h new file mode 100644 index 000000000..6d27871a7 --- /dev/null +++ b/contrib/lax_der_parsing.h @@ -0,0 +1,91 @@ +/********************************************************************** + * Copyright (c) 2015 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +/**** + * Please do not link this file directly. It is not part of the libsecp256k1 + * project and does not promise any stability in its API, functionality or + * presence. Projects which use this code should instead copy this header + * and its accompanying .c file directly into their codebase. + ****/ + +/* This file defines a function that parses DER with various errors and + * violations. This is not a part of the library itself, because the allowed + * violations are chosen arbitrarily and do not follow or establish any + * standard. + * + * In many places it matters that different implementations do not only accept + * the same set of valid signatures, but also reject the same set of signatures. + * The only means to accomplish that is by strictly obeying a standard, and not + * accepting anything else. + * + * Nonetheless, sometimes there is a need for compatibility with systems that + * use signatures which do not strictly obey DER. The snippet below shows how + * certain violations are easily supported. You may need to adapt it. + * + * Do not use this for new systems. Use well-defined DER or compact signatures + * instead if you have the choice (see secp256k1_ecdsa_signature_parse_der and + * secp256k1_ecdsa_signature_parse_compact). + * + * The supported violations are: + * - All numbers are parsed as nonnegative integers, even though X.609-0207 + * section 8.3.3 specifies that integers are always encoded as two's + * complement. + * - Integers can have length 0, even though section 8.3.1 says they can't. + * - Integers with overly long padding are accepted, violation section + * 8.3.2. + * - 127-byte long length descriptors are accepted, even though section + * 8.1.3.5.c says that they are not. + * - Trailing garbage data inside or after the signature is ignored. + * - The length descriptor of the sequence is ignored. + * + * Compared to for example OpenSSL, many violations are NOT supported: + * - Using overly long tag descriptors for the sequence or integers inside, + * violating section 8.1.2.2. + * - Encoding primitive integers as constructed values, violating section + * 8.3.1. + */ + +#ifndef _SECP256K1_CONTRIB_LAX_DER_PARSING_H_ +#define _SECP256K1_CONTRIB_LAX_DER_PARSING_H_ + +#include + +# ifdef __cplusplus +extern "C" { +# endif + +/** Parse a signature in "lax DER" format + * + * Returns: 1 when the signature could be parsed, 0 otherwise. + * Args: ctx: a secp256k1 context object + * Out: sig: a pointer to a signature object + * In: input: a pointer to the signature to be parsed + * inputlen: the length of the array pointed to be input + * + * This function will accept any valid DER encoded signature, even if the + * encoded numbers are out of range. In addition, it will accept signatures + * which violate the DER spec in various ways. Its purpose is to allow + * validation of the Bitcoin blockchain, which includes non-DER signatures + * from before the network rules were updated to enforce DER. Note that + * the set of supported violations is a strict subset of what OpenSSL will + * accept. + * + * After the call, sig will always be initialized. If parsing failed or the + * encoded numbers are out of range, signature validation with it is + * guaranteed to fail for every message and public key. + */ +int ecdsa_signature_parse_der_lax( + const secp256k1_context* ctx, + secp256k1_ecdsa_signature* sig, + const unsigned char *input, + size_t inputlen +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/contrib/lax_der_privatekey_parsing.c b/contrib/lax_der_privatekey_parsing.c new file mode 100644 index 000000000..c2e63b4b8 --- /dev/null +++ b/contrib/lax_der_privatekey_parsing.c @@ -0,0 +1,113 @@ +/********************************************************************** + * Copyright (c) 2014, 2015 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#include +#include + +#include "lax_der_privatekey_parsing.h" + +int ec_privkey_import_der(const secp256k1_context* ctx, unsigned char *out32, const unsigned char *privkey, size_t privkeylen) { + const unsigned char *end = privkey + privkeylen; + int lenb = 0; + int len = 0; + memset(out32, 0, 32); + /* sequence header */ + if (end < privkey+1 || *privkey != 0x30) { + return 0; + } + privkey++; + /* sequence length constructor */ + if (end < privkey+1 || !(*privkey & 0x80)) { + return 0; + } + lenb = *privkey & ~0x80; privkey++; + if (lenb < 1 || lenb > 2) { + return 0; + } + if (end < privkey+lenb) { + return 0; + } + /* sequence length */ + len = privkey[lenb-1] | (lenb > 1 ? privkey[lenb-2] << 8 : 0); + privkey += lenb; + if (end < privkey+len) { + return 0; + } + /* sequence element 0: version number (=1) */ + if (end < privkey+3 || privkey[0] != 0x02 || privkey[1] != 0x01 || privkey[2] != 0x01) { + return 0; + } + privkey += 3; + /* sequence element 1: octet string, up to 32 bytes */ + if (end < privkey+2 || privkey[0] != 0x04 || privkey[1] > 0x20 || end < privkey+2+privkey[1]) { + return 0; + } + memcpy(out32 + 32 - privkey[1], privkey + 2, privkey[1]); + if (!secp256k1_ec_seckey_verify(ctx, out32)) { + memset(out32, 0, 32); + return 0; + } + return 1; +} + +int ec_privkey_export_der(const secp256k1_context *ctx, unsigned char *privkey, size_t *privkeylen, const unsigned char *key32, int compressed) { + secp256k1_pubkey pubkey; + size_t pubkeylen = 0; + if (!secp256k1_ec_pubkey_create(ctx, &pubkey, key32)) { + *privkeylen = 0; + return 0; + } + if (compressed) { + static const unsigned char begin[] = { + 0x30,0x81,0xD3,0x02,0x01,0x01,0x04,0x20 + }; + static const unsigned char middle[] = { + 0xA0,0x81,0x85,0x30,0x81,0x82,0x02,0x01,0x01,0x30,0x2C,0x06,0x07,0x2A,0x86,0x48, + 0xCE,0x3D,0x01,0x01,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F,0x30,0x06,0x04,0x01,0x00,0x04,0x01,0x07,0x04, + 0x21,0x02,0x79,0xBE,0x66,0x7E,0xF9,0xDC,0xBB,0xAC,0x55,0xA0,0x62,0x95,0xCE,0x87, + 0x0B,0x07,0x02,0x9B,0xFC,0xDB,0x2D,0xCE,0x28,0xD9,0x59,0xF2,0x81,0x5B,0x16,0xF8, + 0x17,0x98,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,0xBF,0xD2,0x5E, + 0x8C,0xD0,0x36,0x41,0x41,0x02,0x01,0x01,0xA1,0x24,0x03,0x22,0x00 + }; + unsigned char *ptr = privkey; + memcpy(ptr, begin, sizeof(begin)); ptr += sizeof(begin); + memcpy(ptr, key32, 32); ptr += 32; + memcpy(ptr, middle, sizeof(middle)); ptr += sizeof(middle); + pubkeylen = 33; + secp256k1_ec_pubkey_serialize(ctx, ptr, &pubkeylen, &pubkey, SECP256K1_EC_COMPRESSED); + ptr += pubkeylen; + *privkeylen = ptr - privkey; + } else { + static const unsigned char begin[] = { + 0x30,0x82,0x01,0x13,0x02,0x01,0x01,0x04,0x20 + }; + static const unsigned char middle[] = { + 0xA0,0x81,0xA5,0x30,0x81,0xA2,0x02,0x01,0x01,0x30,0x2C,0x06,0x07,0x2A,0x86,0x48, + 0xCE,0x3D,0x01,0x01,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F,0x30,0x06,0x04,0x01,0x00,0x04,0x01,0x07,0x04, + 0x41,0x04,0x79,0xBE,0x66,0x7E,0xF9,0xDC,0xBB,0xAC,0x55,0xA0,0x62,0x95,0xCE,0x87, + 0x0B,0x07,0x02,0x9B,0xFC,0xDB,0x2D,0xCE,0x28,0xD9,0x59,0xF2,0x81,0x5B,0x16,0xF8, + 0x17,0x98,0x48,0x3A,0xDA,0x77,0x26,0xA3,0xC4,0x65,0x5D,0xA4,0xFB,0xFC,0x0E,0x11, + 0x08,0xA8,0xFD,0x17,0xB4,0x48,0xA6,0x85,0x54,0x19,0x9C,0x47,0xD0,0x8F,0xFB,0x10, + 0xD4,0xB8,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,0xBF,0xD2,0x5E, + 0x8C,0xD0,0x36,0x41,0x41,0x02,0x01,0x01,0xA1,0x44,0x03,0x42,0x00 + }; + unsigned char *ptr = privkey; + memcpy(ptr, begin, sizeof(begin)); ptr += sizeof(begin); + memcpy(ptr, key32, 32); ptr += 32; + memcpy(ptr, middle, sizeof(middle)); ptr += sizeof(middle); + pubkeylen = 65; + secp256k1_ec_pubkey_serialize(ctx, ptr, &pubkeylen, &pubkey, SECP256K1_EC_UNCOMPRESSED); + ptr += pubkeylen; + *privkeylen = ptr - privkey; + } + return 1; +} diff --git a/contrib/lax_der_privatekey_parsing.h b/contrib/lax_der_privatekey_parsing.h new file mode 100644 index 000000000..2fd088f8a --- /dev/null +++ b/contrib/lax_der_privatekey_parsing.h @@ -0,0 +1,90 @@ +/********************************************************************** + * Copyright (c) 2014, 2015 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +/**** + * Please do not link this file directly. It is not part of the libsecp256k1 + * project and does not promise any stability in its API, functionality or + * presence. Projects which use this code should instead copy this header + * and its accompanying .c file directly into their codebase. + ****/ + +/* This file contains code snippets that parse DER private keys with + * various errors and violations. This is not a part of the library + * itself, because the allowed violations are chosen arbitrarily and + * do not follow or establish any standard. + * + * It also contains code to serialize private keys in a compatible + * manner. + * + * These functions are meant for compatibility with applications + * that require BER encoded keys. When working with secp256k1-specific + * code, the simple 32-byte private keys normally used by the + * library are sufficient. + */ + +#ifndef _SECP256K1_CONTRIB_BER_PRIVATEKEY_H_ +#define _SECP256K1_CONTRIB_BER_PRIVATEKEY_H_ + +#include + +# ifdef __cplusplus +extern "C" { +# endif + +/** Export a private key in DER format. + * + * Returns: 1 if the private key was valid. + * Args: ctx: pointer to a context object, initialized for signing (cannot + * be NULL) + * Out: privkey: pointer to an array for storing the private key in BER. + * Should have space for 279 bytes, and cannot be NULL. + * privkeylen: Pointer to an int where the length of the private key in + * privkey will be stored. + * In: seckey: pointer to a 32-byte secret key to export. + * compressed: 1 if the key should be exported in + * compressed format, 0 otherwise + * + * This function is purely meant for compatibility with applications that + * require BER encoded keys. When working with secp256k1-specific code, the + * simple 32-byte private keys are sufficient. + * + * Note that this function does not guarantee correct DER output. It is + * guaranteed to be parsable by secp256k1_ec_privkey_import_der + */ +SECP256K1_WARN_UNUSED_RESULT int ec_privkey_export_der( + const secp256k1_context* ctx, + unsigned char *privkey, + size_t *privkeylen, + const unsigned char *seckey, + int compressed +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); + +/** Import a private key in DER format. + * Returns: 1 if a private key was extracted. + * Args: ctx: pointer to a context object (cannot be NULL). + * Out: seckey: pointer to a 32-byte array for storing the private key. + * (cannot be NULL). + * In: privkey: pointer to a private key in DER format (cannot be NULL). + * privkeylen: length of the DER private key pointed to be privkey. + * + * This function will accept more than just strict DER, and even allow some BER + * violations. The public key stored inside the DER-encoded private key is not + * verified for correctness, nor are the curve parameters. Use this function + * only if you know in advance it is supposed to contain a secp256k1 private + * key. + */ +SECP256K1_WARN_UNUSED_RESULT int ec_privkey_import_der( + const secp256k1_context* ctx, + unsigned char *seckey, + const unsigned char *privkey, + size_t privkeylen +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/secp256k1.h b/include/secp256k1.h index 06afd4c65..fc4c5cefb 100644 --- a/include/secp256k1.h +++ b/include/secp256k1.h @@ -5,6 +5,93 @@ extern "C" { # endif +#include + +/* These rules specify the order of arguments in API calls: + * + * 1. Context pointers go first, followed by output arguments, combined + * output/input arguments, and finally input-only arguments. + * 2. Array lengths always immediately the follow the argument whose length + * they describe, even if this violates rule 1. + * 3. Within the OUT/OUTIN/IN groups, pointers to data that is typically generated + * later go first. This means: signatures, public nonces, private nonces, + * messages, public keys, secret keys, tweaks. + * 4. Arguments that are not data pointers go last, from more complex to less + * complex: function pointers, algorithm names, messages, void pointers, + * counts, flags, booleans. + * 5. Opaque data pointers follow the function pointer they are to be passed to. + */ + +/** Opaque data structure that holds context information (precomputed tables etc.). + * + * The purpose of context structures is to cache large precomputed data tables + * that are expensive to construct, and also to maintain the randomization data + * for blinding. + * + * Do not create a new context object for each operation, as construction is + * far slower than all other API calls (~100 times slower than an ECDSA + * verification). + * + * A constructed context can safely be used from multiple threads + * simultaneously, but API call that take a non-const pointer to a context + * need exclusive access to it. In particular this is the case for + * secp256k1_context_destroy and secp256k1_context_randomize. + * + * Regarding randomization, either do it once at creation time (in which case + * you do not need any locking for the other calls), or use a read-write lock. + */ +typedef struct secp256k1_context_struct secp256k1_context; + +/** Opaque data structure that holds a parsed and valid public key. + * + * The exact representation of data inside is implementation defined and not + * guaranteed to be portable between different platforms or versions. It is + * however guaranteed to be 64 bytes in size, and can be safely copied/moved. + * If you need to convert to a format suitable for storage, transmission, or + * comparison, use secp256k1_ec_pubkey_serialize and secp256k1_ec_pubkey_parse. + */ +typedef struct { + unsigned char data[64]; +} secp256k1_pubkey; + +/** Opaque data structured that holds a parsed ECDSA signature. + * + * The exact representation of data inside is implementation defined and not + * guaranteed to be portable between different platforms or versions. It is + * however guaranteed to be 64 bytes in size, and can be safely copied/moved. + * If you need to convert to a format suitable for storage, transmission, or + * comparison, use the secp256k1_ecdsa_signature_serialize_* and + * secp256k1_ecdsa_signature_serialize_* functions. + */ +typedef struct { + unsigned char data[64]; +} secp256k1_ecdsa_signature; + +/** A pointer to a function to deterministically generate a nonce. + * + * Returns: 1 if a nonce was successfully generated. 0 will cause signing to fail. + * Out: nonce32: pointer to a 32-byte array to be filled by the function. + * In: msg32: the 32-byte message hash being verified (will not be NULL) + * key32: pointer to a 32-byte secret key (will not be NULL) + * algo16: pointer to a 16-byte array describing the signature + * algorithm (will be NULL for ECDSA for compatibility). + * data: Arbitrary data pointer that is passed through. + * attempt: how many iterations we have tried to find a nonce. + * This will almost always be 0, but different attempt values + * are required to result in a different nonce. + * + * Except for test cases, this function should compute some cryptographic hash of + * the message, the algorithm, the key and the attempt. + */ +typedef int (*secp256k1_nonce_function)( + unsigned char *nonce32, + const unsigned char *msg32, + const unsigned char *key32, + const unsigned char *algo16, + void *data, + unsigned int attempt +); + # if !defined(SECP256K1_GNUC_PREREQ) # if defined(__GNUC__)&&defined(__GNUC_MINOR__) # define SECP256K1_GNUC_PREREQ(_maj,_min) \ @@ -26,6 +113,20 @@ extern "C" { # define SECP256K1_INLINE inline # endif +#ifndef SECP256K1_API +# if defined(_WIN32) +# ifdef SECP256K1_BUILD +# define SECP256K1_API __declspec(dllexport) +# else +# define SECP256K1_API +# endif +# elif defined(__GNUC__) && defined(SECP256K1_BUILD) +# define SECP256K1_API __attribute__ ((visibility ("default"))) +# else +# define SECP256K1_API +# endif +#endif + /**Warning attributes * NONNULL is not used if SECP256K1_BUILD is set to avoid the compiler optimizing out * some paranoid null checks. */ @@ -40,305 +141,471 @@ extern "C" { # define SECP256K1_ARG_NONNULL(_x) # endif -/** Opaque data structure that holds context information (precomputed tables etc.). - * Only functions that take a pointer to a non-const context require exclusive - * access to it. Multiple functions that take a pointer to a const context may - * run simultaneously. - */ -typedef struct secp256k1_context_struct secp256k1_context_t; +/** All flags' lower 8 bits indicate what they're for. Do not use directly. */ +#define SECP256K1_FLAGS_TYPE_MASK ((1 << 8) - 1) +#define SECP256K1_FLAGS_TYPE_CONTEXT (1 << 0) +#define SECP256K1_FLAGS_TYPE_COMPRESSION (1 << 1) +/** The higher bits contain the actual data. Do not use directly. */ +#define SECP256K1_FLAGS_BIT_CONTEXT_VERIFY (1 << 8) +#define SECP256K1_FLAGS_BIT_CONTEXT_SIGN (1 << 9) +#define SECP256K1_FLAGS_BIT_COMPRESSION (1 << 8) /** Flags to pass to secp256k1_context_create. */ -# define SECP256K1_CONTEXT_VERIFY (1 << 0) -# define SECP256K1_CONTEXT_SIGN (1 << 1) +#define SECP256K1_CONTEXT_VERIFY (SECP256K1_FLAGS_TYPE_CONTEXT | SECP256K1_FLAGS_BIT_CONTEXT_VERIFY) +#define SECP256K1_CONTEXT_SIGN (SECP256K1_FLAGS_TYPE_CONTEXT | SECP256K1_FLAGS_BIT_CONTEXT_SIGN) +#define SECP256K1_CONTEXT_NONE (SECP256K1_FLAGS_TYPE_CONTEXT) + +/** Flag to pass to secp256k1_ec_pubkey_serialize and secp256k1_ec_privkey_export. */ +#define SECP256K1_EC_COMPRESSED (SECP256K1_FLAGS_TYPE_COMPRESSION | SECP256K1_FLAGS_BIT_COMPRESSION) +#define SECP256K1_EC_UNCOMPRESSED (SECP256K1_FLAGS_TYPE_COMPRESSION) /** Create a secp256k1 context object. + * * Returns: a newly created context object. * In: flags: which parts of the context to initialize. + * + * See also secp256k1_context_randomize. */ -secp256k1_context_t* secp256k1_context_create( - int flags +SECP256K1_API secp256k1_context* secp256k1_context_create( + unsigned int flags ) SECP256K1_WARN_UNUSED_RESULT; /** Copies a secp256k1 context object. + * * Returns: a newly created context object. - * In: ctx: an existing context to copy + * Args: ctx: an existing context to copy (cannot be NULL) */ -secp256k1_context_t* secp256k1_context_clone( - const secp256k1_context_t* ctx -) SECP256K1_WARN_UNUSED_RESULT; +SECP256K1_API secp256k1_context* secp256k1_context_clone( + const secp256k1_context* ctx +) SECP256K1_ARG_NONNULL(1) SECP256K1_WARN_UNUSED_RESULT; /** Destroy a secp256k1 context object. + * * The context pointer may not be used afterwards. + * Args: ctx: an existing context to destroy (cannot be NULL) */ -void secp256k1_context_destroy( - secp256k1_context_t* ctx +SECP256K1_API void secp256k1_context_destroy( + secp256k1_context* ctx +); + +/** Set a callback function to be called when an illegal argument is passed to + * an API call. It will only trigger for violations that are mentioned + * explicitly in the header. + * + * The philosophy is that these shouldn't be dealt with through a + * specific return value, as calling code should not have branches to deal with + * the case that this code itself is broken. + * + * On the other hand, during debug stage, one would want to be informed about + * such mistakes, and the default (crashing) may be inadvisable. + * When this callback is triggered, the API function called is guaranteed not + * to cause a crash, though its return value and output arguments are + * undefined. + * + * Args: ctx: an existing context object (cannot be NULL) + * In: fun: a pointer to a function to call when an illegal argument is + * passed to the API, taking a message and an opaque pointer + * (NULL restores a default handler that calls abort). + * data: the opaque pointer to pass to fun above. + */ +SECP256K1_API void secp256k1_context_set_illegal_callback( + secp256k1_context* ctx, + void (*fun)(const char* message, void* data), + const void* data ) SECP256K1_ARG_NONNULL(1); -/** Verify an ECDSA signature. - * Returns: 1: correct signature - * 0: incorrect signature - * -1: invalid public key - * -2: invalid signature - * In: ctx: a secp256k1 context object, initialized for verification. - * msg32: the 32-byte message hash being verified (cannot be NULL) - * sig: the signature being verified (cannot be NULL) - * siglen: the length of the signature - * pubkey: the public key to verify with (cannot be NULL) - * pubkeylen: the length of pubkey +/** Set a callback function to be called when an internal consistency check + * fails. The default is crashing. + * + * This can only trigger in case of a hardware failure, miscompilation, + * memory corruption, serious bug in the library, or other error would can + * otherwise result in undefined behaviour. It will not trigger due to mere + * incorrect usage of the API (see secp256k1_context_set_illegal_callback + * for that). After this callback returns, anything may happen, including + * crashing. + * + * Args: ctx: an existing context object (cannot be NULL) + * In: fun: a pointer to a function to call when an internal error occurs, + * taking a message and an opaque pointer (NULL restores a default + * handler that calls abort). + * data: the opaque pointer to pass to fun above. */ -SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_verify( - const secp256k1_context_t* ctx, - const unsigned char *msg32, - const unsigned char *sig, - int siglen, - const unsigned char *pubkey, - int pubkeylen -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(5); +SECP256K1_API void secp256k1_context_set_error_callback( + secp256k1_context* ctx, + void (*fun)(const char* message, void* data), + const void* data +) SECP256K1_ARG_NONNULL(1); -/** A pointer to a function to deterministically generate a nonce. - * Returns: 1 if a nonce was successfully generated. 0 will cause signing to fail. - * In: msg32: the 32-byte message hash being verified (will not be NULL) - * key32: pointer to a 32-byte secret key (will not be NULL) - * attempt: how many iterations we have tried to find a nonce. - * This will almost always be 0, but different attempt values - * are required to result in a different nonce. - * data: Arbitrary data pointer that is passed through. - * Out: nonce32: pointer to a 32-byte array to be filled by the function. - * Except for test cases, this function should compute some cryptographic hash of - * the message, the key and the attempt. +/** Parse a variable-length public key into the pubkey object. + * + * Returns: 1 if the public key was fully valid. + * 0 if the public key could not be parsed or is invalid. + * Args: ctx: a secp256k1 context object. + * Out: pubkey: pointer to a pubkey object. If 1 is returned, it is set to a + * parsed version of input. If not, its value is undefined. + * In: input: pointer to a serialized public key + * inputlen: length of the array pointed to by input + * + * This function supports parsing compressed (33 bytes, header byte 0x02 or + * 0x03), uncompressed (65 bytes, header byte 0x04), or hybrid (65 bytes, header + * byte 0x06 or 0x07) format public keys. */ -typedef int (*secp256k1_nonce_function_t)( - unsigned char *nonce32, - const unsigned char *msg32, - const unsigned char *key32, - unsigned int attempt, - const void *data -); +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_parse( + const secp256k1_context* ctx, + secp256k1_pubkey* pubkey, + const unsigned char *input, + size_t inputlen +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +/** Serialize a pubkey object into a serialized byte sequence. + * + * Returns: 1 always. + * Args: ctx: a secp256k1 context object. + * Out: output: a pointer to a 65-byte (if compressed==0) or 33-byte (if + * compressed==1) byte array to place the serialized key + * in. + * In/Out: outputlen: a pointer to an integer which is initially set to the + * size of output, and is overwritten with the written + * size. + * In: pubkey: a pointer to a secp256k1_pubkey containing an + * initialized public key. + * flags: SECP256K1_EC_COMPRESSED if serialization should be in + * compressed format, otherwise SECP256K1_EC_UNCOMPRESSED. + */ +SECP256K1_API int secp256k1_ec_pubkey_serialize( + const secp256k1_context* ctx, + unsigned char *output, + size_t *outputlen, + const secp256k1_pubkey* pubkey, + unsigned int flags +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); + +/** Parse an ECDSA signature in compact (64 bytes) format. + * + * Returns: 1 when the signature could be parsed, 0 otherwise. + * Args: ctx: a secp256k1 context object + * Out: sig: a pointer to a signature object + * In: input64: a pointer to the 64-byte array to parse + * + * The signature must consist of a 32-byte big endian R value, followed by a + * 32-byte big endian S value. If R or S fall outside of [0..order-1], the + * encoding is invalid. R and S with value 0 are allowed in the encoding. + * + * After the call, sig will always be initialized. If parsing failed or R or + * S are zero, the resulting sig value is guaranteed to fail validation for any + * message and public key. + */ +SECP256K1_API int secp256k1_ecdsa_signature_parse_compact( + const secp256k1_context* ctx, + secp256k1_ecdsa_signature* sig, + const unsigned char *input64 +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +/** Parse a DER ECDSA signature. + * + * Returns: 1 when the signature could be parsed, 0 otherwise. + * Args: ctx: a secp256k1 context object + * Out: sig: a pointer to a signature object + * In: input: a pointer to the signature to be parsed + * inputlen: the length of the array pointed to be input + * + * This function will accept any valid DER encoded signature, even if the + * encoded numbers are out of range. + * + * After the call, sig will always be initialized. If parsing failed or the + * encoded numbers are out of range, signature validation with it is + * guaranteed to fail for every message and public key. + */ +SECP256K1_API int secp256k1_ecdsa_signature_parse_der( + const secp256k1_context* ctx, + secp256k1_ecdsa_signature* sig, + const unsigned char *input, + size_t inputlen +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +/** Serialize an ECDSA signature in DER format. + * + * Returns: 1 if enough space was available to serialize, 0 otherwise + * Args: ctx: a secp256k1 context object + * Out: output: a pointer to an array to store the DER serialization + * In/Out: outputlen: a pointer to a length integer. Initially, this integer + * should be set to the length of output. After the call + * it will be set to the length of the serialization (even + * if 0 was returned). + * In: sig: a pointer to an initialized signature object + */ +SECP256K1_API int secp256k1_ecdsa_signature_serialize_der( + const secp256k1_context* ctx, + unsigned char *output, + size_t *outputlen, + const secp256k1_ecdsa_signature* sig +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); + +/** Serialize an ECDSA signature in compact (64 byte) format. + * + * Returns: 1 + * Args: ctx: a secp256k1 context object + * Out: output64: a pointer to a 64-byte array to store the compact serialization + * In: sig: a pointer to an initialized signature object + * + * See secp256k1_ecdsa_signature_parse_compact for details about the encoding. + */ +SECP256K1_API int secp256k1_ecdsa_signature_serialize_compact( + const secp256k1_context* ctx, + unsigned char *output64, + const secp256k1_ecdsa_signature* sig +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +/** Verify an ECDSA signature. + * + * Returns: 1: correct signature + * 0: incorrect or unparseable signature + * Args: ctx: a secp256k1 context object, initialized for verification. + * In: sig: the signature being verified (cannot be NULL) + * msg32: the 32-byte message hash being verified (cannot be NULL) + * pubkey: pointer to an initialized public key to verify with (cannot be NULL) + * + * To avoid accepting malleable signatures, only ECDSA signatures in lower-S + * form are accepted. + * + * If you need to accept ECDSA signatures from sources that do not obey this + * rule, apply secp256k1_ecdsa_signature_normalize to the signature prior to + * validation, but be aware that doing so results in malleable signatures. + * + * For details, see the comments for that function. + */ +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_verify( + const secp256k1_context* ctx, + const secp256k1_ecdsa_signature *sig, + const unsigned char *msg32, + const secp256k1_pubkey *pubkey +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); + +/** Convert a signature to a normalized lower-S form. + * + * Returns: 1 if sigin was not normalized, 0 if it already was. + * Args: ctx: a secp256k1 context object + * Out: sigout: a pointer to a signature to fill with the normalized form, + * or copy if the input was already normalized. (can be NULL if + * you're only interested in whether the input was already + * normalized). + * In: sigin: a pointer to a signature to check/normalize (cannot be NULL, + * can be identical to sigout) + * + * With ECDSA a third-party can forge a second distinct signature of the same + * message, given a single initial signature, but without knowing the key. This + * is done by negating the S value modulo the order of the curve, 'flipping' + * the sign of the random point R which is not included in the signature. + * + * Forgery of the same message isn't universally problematic, but in systems + * where message malleability or uniqueness of signatures is important this can + * cause issues. This forgery can be blocked by all verifiers forcing signers + * to use a normalized form. + * + * The lower-S form reduces the size of signatures slightly on average when + * variable length encodings (such as DER) are used and is cheap to verify, + * making it a good choice. Security of always using lower-S is assured because + * anyone can trivially modify a signature after the fact to enforce this + * property anyway. + * + * The lower S value is always between 0x1 and + * 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, + * inclusive. + * + * No other forms of ECDSA malleability are known and none seem likely, but + * there is no formal proof that ECDSA, even with this additional restriction, + * is free of other malleability. Commonly used serialization schemes will also + * accept various non-unique encodings, so care should be taken when this + * property is required for an application. + * + * The secp256k1_ecdsa_sign function will by default create signatures in the + * lower-S form, and secp256k1_ecdsa_verify will not accept others. In case + * signatures come from a system that cannot enforce this property, + * secp256k1_ecdsa_signature_normalize must be called before verification. + */ +SECP256K1_API int secp256k1_ecdsa_signature_normalize( + const secp256k1_context* ctx, + secp256k1_ecdsa_signature *sigout, + const secp256k1_ecdsa_signature *sigin +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(3); /** An implementation of RFC6979 (using HMAC-SHA256) as nonce generation function. * If a data pointer is passed, it is assumed to be a pointer to 32 bytes of * extra entropy. */ -extern const secp256k1_nonce_function_t secp256k1_nonce_function_rfc6979; +SECP256K1_API extern const secp256k1_nonce_function secp256k1_nonce_function_rfc6979; /** A default safe nonce generation function (currently equal to secp256k1_nonce_function_rfc6979). */ -extern const secp256k1_nonce_function_t secp256k1_nonce_function_default; - +SECP256K1_API extern const secp256k1_nonce_function secp256k1_nonce_function_default; /** Create an ECDSA signature. - * Returns: 1: signature created - * 0: the nonce generation function failed, the private key was invalid, or there is not - * enough space in the signature (as indicated by siglen). - * In: ctx: pointer to a context object, initialized for signing (cannot be NULL) - * msg32: the 32-byte message hash being signed (cannot be NULL) - * seckey: pointer to a 32-byte secret key (cannot be NULL) - * noncefp:pointer to a nonce generation function. If NULL, secp256k1_nonce_function_default is used - * ndata: pointer to arbitrary data used by the nonce generation function (can be NULL) - * Out: sig: pointer to an array where the signature will be placed (cannot be NULL) - * In/Out: siglen: pointer to an int with the length of sig, which will be updated - * to contain the actual signature length (<=72). * - * The sig always has an s value in the lower half of the range (From 0x1 - * to 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, - * inclusive), unlike many other implementations. - * With ECDSA a third-party can can forge a second distinct signature - * of the same message given a single initial signature without knowing - * the key by setting s to its additive inverse mod-order, 'flipping' the - * sign of the random point R which is not included in the signature. - * Since the forgery is of the same message this isn't universally - * problematic, but in systems where message malleability or uniqueness - * of signatures is important this can cause issues. This forgery can be - * blocked by all verifiers forcing signers to use a canonical form. The - * lower-S form reduces the size of signatures slightly on average when - * variable length encodings (such as DER) are used and is cheap to - * verify, making it a good choice. Security of always using lower-S is - * assured because anyone can trivially modify a signature after the - * fact to enforce this property. Adjusting it inside the signing - * function avoids the need to re-serialize or have curve specific - * constants outside of the library. By always using a canonical form - * even in applications where it isn't needed it becomes possible to - * impose a requirement later if a need is discovered. - * No other forms of ECDSA malleability are known and none seem likely, - * but there is no formal proof that ECDSA, even with this additional - * restriction, is free of other malleability. Commonly used serialization - * schemes will also accept various non-unique encodings, so care should - * be taken when this property is required for an application. - */ -int secp256k1_ecdsa_sign( - const secp256k1_context_t* ctx, - const unsigned char *msg32, - unsigned char *sig, - int *siglen, - const unsigned char *seckey, - secp256k1_nonce_function_t noncefp, - const void *ndata -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4) SECP256K1_ARG_NONNULL(5); - -/** Create a compact ECDSA signature (64 byte + recovery id). * Returns: 1: signature created - * 0: the nonce generation function failed, or the secret key was invalid. - * In: ctx: pointer to a context object, initialized for signing (cannot be NULL) - * msg32: the 32-byte message hash being signed (cannot be NULL) + * 0: the nonce generation function failed, or the private key was invalid. + * Args: ctx: pointer to a context object, initialized for signing (cannot be NULL) + * Out: sig: pointer to an array where the signature will be placed (cannot be NULL) + * In: msg32: the 32-byte message hash being signed (cannot be NULL) * seckey: pointer to a 32-byte secret key (cannot be NULL) * noncefp:pointer to a nonce generation function. If NULL, secp256k1_nonce_function_default is used * ndata: pointer to arbitrary data used by the nonce generation function (can be NULL) - * Out: sig: pointer to a 64-byte array where the signature will be placed (cannot be NULL) - * In case 0 is returned, the returned signature length will be zero. - * recid: pointer to an int, which will be updated to contain the recovery id (can be NULL) + * + * The created signature is always in lower-S form. See + * secp256k1_ecdsa_signature_normalize for more details. */ -int secp256k1_ecdsa_sign_compact( - const secp256k1_context_t* ctx, - const unsigned char *msg32, - unsigned char *sig64, - const unsigned char *seckey, - secp256k1_nonce_function_t noncefp, - const void *ndata, - int *recid +SECP256K1_API int secp256k1_ecdsa_sign( + const secp256k1_context* ctx, + secp256k1_ecdsa_signature *sig, + const unsigned char *msg32, + const unsigned char *seckey, + secp256k1_nonce_function noncefp, + const void *ndata ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); -/** Recover an ECDSA public key from a compact signature. - * Returns: 1: public key successfully recovered (which guarantees a correct signature). - * 0: otherwise. - * In: ctx: pointer to a context object, initialized for verification (cannot be NULL) - * msg32: the 32-byte message hash assumed to be signed (cannot be NULL) - * sig64: signature as 64 byte array (cannot be NULL) - * compressed: whether to recover a compressed or uncompressed pubkey - * recid: the recovery id (0-3, as returned by ecdsa_sign_compact) - * Out: pubkey: pointer to a 33 or 65 byte array to put the pubkey (cannot be NULL) - * pubkeylen: pointer to an int that will contain the pubkey length (cannot be NULL) - */ -SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_recover_compact( - const secp256k1_context_t* ctx, - const unsigned char *msg32, - const unsigned char *sig64, - unsigned char *pubkey, - int *pubkeylen, - int compressed, - int recid -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4) SECP256K1_ARG_NONNULL(5); - /** Verify an ECDSA secret key. + * * Returns: 1: secret key is valid * 0: secret key is invalid - * In: ctx: pointer to a context object (cannot be NULL) - * seckey: pointer to a 32-byte secret key (cannot be NULL) + * Args: ctx: pointer to a context object (cannot be NULL) + * In: seckey: pointer to a 32-byte secret key (cannot be NULL) */ -SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_seckey_verify( - const secp256k1_context_t* ctx, - const unsigned char *seckey -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2); - -/** Just validate a public key. - * Returns: 1: public key is valid - * 0: public key is invalid - * In: ctx: pointer to a context object (cannot be NULL) - * pubkey: pointer to a 33-byte or 65-byte public key (cannot be NULL). - * pubkeylen: length of pubkey - */ -SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_verify( - const secp256k1_context_t* ctx, - const unsigned char *pubkey, - int pubkeylen +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_seckey_verify( + const secp256k1_context* ctx, + const unsigned char *seckey ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2); /** Compute the public key for a secret key. - * In: ctx: pointer to a context object, initialized for signing (cannot be NULL) - * compressed: whether the computed public key should be compressed - * seckey: pointer to a 32-byte private key (cannot be NULL) - * Out: pubkey: pointer to a 33-byte (if compressed) or 65-byte (if uncompressed) - * area to store the public key (cannot be NULL) - * pubkeylen: pointer to int that will be updated to contains the pubkey's - * length (cannot be NULL) + * * Returns: 1: secret was valid, public key stores * 0: secret was invalid, try again + * Args: ctx: pointer to a context object, initialized for signing (cannot be NULL) + * Out: pubkey: pointer to the created public key (cannot be NULL) + * In: seckey: pointer to a 32-byte private key (cannot be NULL) */ -SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_create( - const secp256k1_context_t* ctx, - unsigned char *pubkey, - int *pubkeylen, - const unsigned char *seckey, - int compressed -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); - -/** Decompress a public key. - * In: ctx: pointer to a context object (cannot be NULL) - * In/Out: pubkey: pointer to a 65-byte array to put the decompressed public key. - * It must contain a 33-byte or 65-byte public key already (cannot be NULL) - * pubkeylen: pointer to the size of the public key pointed to by pubkey (cannot be NULL) - * It will be updated to reflect the new size. - * Returns: 0: pubkey was invalid - * 1: pubkey was valid, and was replaced with its decompressed version - */ -SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_decompress( - const secp256k1_context_t* ctx, - unsigned char *pubkey, - int *pubkeylen +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_create( + const secp256k1_context* ctx, + secp256k1_pubkey *pubkey, + const unsigned char *seckey ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); -/** Export a private key in DER format. - * In: ctx: pointer to a context object, initialized for signing (cannot be NULL) +/** Negates a private key in place. + * + * Returns: 1 always + * Args: ctx: pointer to a context object + * In/Out: pubkey: pointer to the public key to be negated (cannot be NULL) */ -SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_export( - const secp256k1_context_t* ctx, - const unsigned char *seckey, - unsigned char *privkey, - int *privkeylen, - int compressed -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_negate( + const secp256k1_context* ctx, + unsigned char *seckey +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2); -/** Import a private key in DER format. */ -SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_import( - const secp256k1_context_t* ctx, - unsigned char *seckey, - const unsigned char *privkey, - int privkeylen -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); +/** Negates a public key in place. + * + * Returns: 1 always + * Args: ctx: pointer to a context object + * In/Out: pubkey: pointer to the public key to be negated (cannot be NULL) + */ +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_negate( + const secp256k1_context* ctx, + secp256k1_pubkey *pubkey +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2); -/** Tweak a private key by adding tweak to it. */ -SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_add( - const secp256k1_context_t* ctx, - unsigned char *seckey, - const unsigned char *tweak +/** Tweak a private key by adding tweak to it. + * Returns: 0 if the tweak was out of range (chance of around 1 in 2^128 for + * uniformly random 32-byte arrays, or if the resulting private key + * would be invalid (only when the tweak is the complement of the + * private key). 1 otherwise. + * Args: ctx: pointer to a context object (cannot be NULL). + * In/Out: seckey: pointer to a 32-byte private key. + * In: tweak: pointer to a 32-byte tweak. + */ +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_add( + const secp256k1_context* ctx, + unsigned char *seckey, + const unsigned char *tweak ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); /** Tweak a public key by adding tweak times the generator to it. - * In: ctx: pointer to a context object, initialized for verification (cannot be NULL) + * Returns: 0 if the tweak was out of range (chance of around 1 in 2^128 for + * uniformly random 32-byte arrays, or if the resulting public key + * would be invalid (only when the tweak is the complement of the + * corresponding private key). 1 otherwise. + * Args: ctx: pointer to a context object initialized for validation + * (cannot be NULL). + * In/Out: pubkey: pointer to a public key object. + * In: tweak: pointer to a 32-byte tweak. */ -SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_add( - const secp256k1_context_t* ctx, - unsigned char *pubkey, - int pubkeylen, - const unsigned char *tweak -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(4); - -/** Tweak a private key by multiplying it with tweak. */ -SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_mul( - const secp256k1_context_t* ctx, - unsigned char *seckey, - const unsigned char *tweak +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_add( + const secp256k1_context* ctx, + secp256k1_pubkey *pubkey, + const unsigned char *tweak ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); -/** Tweak a public key by multiplying it with tweak. - * In: ctx: pointer to a context object, initialized for verification (cannot be NULL) +/** Tweak a private key by multiplying it by a tweak. + * Returns: 0 if the tweak was out of range (chance of around 1 in 2^128 for + * uniformly random 32-byte arrays, or equal to zero. 1 otherwise. + * Args: ctx: pointer to a context object (cannot be NULL). + * In/Out: seckey: pointer to a 32-byte private key. + * In: tweak: pointer to a 32-byte tweak. */ -SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_mul( - const secp256k1_context_t* ctx, - unsigned char *pubkey, - int pubkeylen, - const unsigned char *tweak -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(4); +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_mul( + const secp256k1_context* ctx, + unsigned char *seckey, + const unsigned char *tweak +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); -/** Updates the context randomization. +/** Tweak a public key by multiplying it by a tweak value. + * Returns: 0 if the tweak was out of range (chance of around 1 in 2^128 for + * uniformly random 32-byte arrays, or equal to zero. 1 otherwise. + * Args: ctx: pointer to a context object initialized for validation + * (cannot be NULL). + * In/Out: pubkey: pointer to a public key obkect. + * In: tweak: pointer to a 32-byte tweak. + */ +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_mul( + const secp256k1_context* ctx, + secp256k1_pubkey *pubkey, + const unsigned char *tweak +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +/** Updates the context randomization to protect against side-channel leakage. * Returns: 1: randomization successfully updated * 0: error - * In: ctx: pointer to a context object (cannot be NULL) - * seed32: pointer to a 32-byte random seed (NULL resets to initial state) + * Args: ctx: pointer to a context object (cannot be NULL) + * In: seed32: pointer to a 32-byte random seed (NULL resets to initial state) + * + * While secp256k1 code is written to be constant-time no matter what secret + * values are, it's possible that a future compiler may output code which isn't, + * and also that the CPU may not emit the same radio frequencies or draw the same + * amount power for all values. + * + * This function provides a seed which is combined into the blinding value: that + * blinding value is added before each multiplication (and removed afterwards) so + * that it does not affect function results, but shields against attacks which + * rely on any input-dependent behaviour. + * + * You should call this after secp256k1_context_create or + * secp256k1_context_clone, and may call this repeatedly afterwards. */ -SECP256K1_WARN_UNUSED_RESULT int secp256k1_context_randomize( - secp256k1_context_t* ctx, - const unsigned char *seed32 +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_context_randomize( + secp256k1_context* ctx, + const unsigned char *seed32 ) SECP256K1_ARG_NONNULL(1); +/** Add a number of public keys together. + * Returns: 1: the sum of the public keys is valid. + * 0: the sum of the public keys is not valid. + * Args: ctx: pointer to a context object + * Out: out: pointer to a public key object for placing the resulting public key + * (cannot be NULL) + * In: ins: pointer to array of pointers to public keys (cannot be NULL) + * n: the number of public keys to add together (must be at least 1) + */ +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_combine( + const secp256k1_context* ctx, + secp256k1_pubkey *out, + const secp256k1_pubkey * const * ins, + size_t n +) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); # ifdef __cplusplus } diff --git a/include/secp256k1_ecdh.h b/include/secp256k1_ecdh.h new file mode 100644 index 000000000..4b84d7a96 --- /dev/null +++ b/include/secp256k1_ecdh.h @@ -0,0 +1,31 @@ +#ifndef _SECP256K1_ECDH_ +# define _SECP256K1_ECDH_ + +# include "secp256k1.h" + +# ifdef __cplusplus +extern "C" { +# endif + +/** Compute an EC Diffie-Hellman secret in constant time + * Returns: 1: exponentiation was successful + * 0: scalar was invalid (zero or overflow) + * Args: ctx: pointer to a context object (cannot be NULL) + * Out: result: a 32-byte array which will be populated by an ECDH + * secret computed from the point and scalar + * In: pubkey: a pointer to a secp256k1_pubkey containing an + * initialized public key + * privkey: a 32-byte scalar with which to multiply the point + */ +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdh( + const secp256k1_context* ctx, + unsigned char *result, + const secp256k1_pubkey *pubkey, + const unsigned char *privkey +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/include/secp256k1_recovery.h b/include/secp256k1_recovery.h new file mode 100644 index 000000000..055379725 --- /dev/null +++ b/include/secp256k1_recovery.h @@ -0,0 +1,110 @@ +#ifndef _SECP256K1_RECOVERY_ +# define _SECP256K1_RECOVERY_ + +# include "secp256k1.h" + +# ifdef __cplusplus +extern "C" { +# endif + +/** Opaque data structured that holds a parsed ECDSA signature, + * supporting pubkey recovery. + * + * The exact representation of data inside is implementation defined and not + * guaranteed to be portable between different platforms or versions. It is + * however guaranteed to be 65 bytes in size, and can be safely copied/moved. + * If you need to convert to a format suitable for storage or transmission, use + * the secp256k1_ecdsa_signature_serialize_* and + * secp256k1_ecdsa_signature_parse_* functions. + * + * Furthermore, it is guaranteed that identical signatures (including their + * recoverability) will have identical representation, so they can be + * memcmp'ed. + */ +typedef struct { + unsigned char data[65]; +} secp256k1_ecdsa_recoverable_signature; + +/** Parse a compact ECDSA signature (64 bytes + recovery id). + * + * Returns: 1 when the signature could be parsed, 0 otherwise + * Args: ctx: a secp256k1 context object + * Out: sig: a pointer to a signature object + * In: input64: a pointer to a 64-byte compact signature + * recid: the recovery id (0, 1, 2 or 3) + */ +SECP256K1_API int secp256k1_ecdsa_recoverable_signature_parse_compact( + const secp256k1_context* ctx, + secp256k1_ecdsa_recoverable_signature* sig, + const unsigned char *input64, + int recid +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +/** Convert a recoverable signature into a normal signature. + * + * Returns: 1 + * Out: sig: a pointer to a normal signature (cannot be NULL). + * In: sigin: a pointer to a recoverable signature (cannot be NULL). + */ +SECP256K1_API int secp256k1_ecdsa_recoverable_signature_convert( + const secp256k1_context* ctx, + secp256k1_ecdsa_signature* sig, + const secp256k1_ecdsa_recoverable_signature* sigin +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +/** Serialize an ECDSA signature in compact format (64 bytes + recovery id). + * + * Returns: 1 + * Args: ctx: a secp256k1 context object + * Out: output64: a pointer to a 64-byte array of the compact signature (cannot be NULL) + * recid: a pointer to an integer to hold the recovery id (can be NULL). + * In: sig: a pointer to an initialized signature object (cannot be NULL) + */ +SECP256K1_API int secp256k1_ecdsa_recoverable_signature_serialize_compact( + const secp256k1_context* ctx, + unsigned char *output64, + int *recid, + const secp256k1_ecdsa_recoverable_signature* sig +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); + +/** Create a recoverable ECDSA signature. + * + * Returns: 1: signature created + * 0: the nonce generation function failed, or the private key was invalid. + * Args: ctx: pointer to a context object, initialized for signing (cannot be NULL) + * Out: sig: pointer to an array where the signature will be placed (cannot be NULL) + * In: msg32: the 32-byte message hash being signed (cannot be NULL) + * seckey: pointer to a 32-byte secret key (cannot be NULL) + * noncefp:pointer to a nonce generation function. If NULL, secp256k1_nonce_function_default is used + * ndata: pointer to arbitrary data used by the nonce generation function (can be NULL) + */ +SECP256K1_API int secp256k1_ecdsa_sign_recoverable( + const secp256k1_context* ctx, + secp256k1_ecdsa_recoverable_signature *sig, + const unsigned char *msg32, + const unsigned char *seckey, + secp256k1_nonce_function noncefp, + const void *ndata +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); + +/** Recover an ECDSA public key from a signature. + * + * Returns: 1: public key successfully recovered (which guarantees a correct signature). + * 0: otherwise. + * Args: ctx: pointer to a context object, initialized for verification (cannot be NULL) + * Out: pubkey: pointer to the recovered public key (cannot be NULL) + * In: sig: pointer to initialized signature that supports pubkey recovery (cannot be NULL) + * msg32: the 32-byte message hash assumed to be signed (cannot be NULL) + */ +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_recover( + const secp256k1_context* ctx, + secp256k1_pubkey *pubkey, + const secp256k1_ecdsa_recoverable_signature *sig, + const unsigned char *msg32 +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/libsecp256k1.pc.in b/libsecp256k1.pc.in index 1c72dd000..a0d006f11 100644 --- a/libsecp256k1.pc.in +++ b/libsecp256k1.pc.in @@ -5,7 +5,7 @@ includedir=@includedir@ Name: libsecp256k1 Description: Optimized C library for EC operations on curve secp256k1 -URL: https://github.com/bitcoin/secp256k1 +URL: https://github.com/bitcoin-core/secp256k1 Version: @PACKAGE_VERSION@ Cflags: -I${includedir} Libs.private: @SECP_LIBS@ diff --git a/sage/group_prover.sage b/sage/group_prover.sage new file mode 100644 index 000000000..ab580c5b2 --- /dev/null +++ b/sage/group_prover.sage @@ -0,0 +1,322 @@ +# This code supports verifying group implementations which have branches +# or conditional statements (like cmovs), by allowing each execution path +# to independently set assumptions on input or intermediary variables. +# +# The general approach is: +# * A constraint is a tuple of two sets of of symbolic expressions: +# the first of which are required to evaluate to zero, the second of which +# are required to evaluate to nonzero. +# - A constraint is said to be conflicting if any of its nonzero expressions +# is in the ideal with basis the zero expressions (in other words: when the +# zero expressions imply that one of the nonzero expressions are zero). +# * There is a list of laws that describe the intended behaviour, including +# laws for addition and doubling. Each law is called with the symbolic point +# coordinates as arguments, and returns: +# - A constraint describing the assumptions under which it is applicable, +# called "assumeLaw" +# - A constraint describing the requirements of the law, called "require" +# * Implementations are transliterated into functions that operate as well on +# algebraic input points, and are called once per combination of branches +# exectured. Each execution returns: +# - A constraint describing the assumptions this implementation requires +# (such as Z1=1), called "assumeFormula" +# - A constraint describing the assumptions this specific branch requires, +# but which is by construction guaranteed to cover the entire space by +# merging the results from all branches, called "assumeBranch" +# - The result of the computation +# * All combinations of laws with implementation branches are tried, and: +# - If the combination of assumeLaw, assumeFormula, and assumeBranch results +# in a conflict, it means this law does not apply to this branch, and it is +# skipped. +# - For others, we try to prove the require constraints hold, assuming the +# information in assumeLaw + assumeFormula + assumeBranch, and if this does +# not succeed, we fail. +# + To prove an expression is zero, we check whether it belongs to the +# ideal with the assumed zero expressions as basis. This test is exact. +# + To prove an expression is nonzero, we check whether each of its +# factors is contained in the set of nonzero assumptions' factors. +# This test is not exact, so various combinations of original and +# reduced expressions' factors are tried. +# - If we succeed, we print out the assumptions from assumeFormula that +# weren't implied by assumeLaw already. Those from assumeBranch are skipped, +# as we assume that all constraints in it are complementary with each other. +# +# Based on the sage verification scripts used in the Explicit-Formulas Database +# by Tanja Lange and others, see http://hyperelliptic.org/EFD + +class fastfrac: + """Fractions over rings.""" + + def __init__(self,R,top,bot=1): + """Construct a fractional, given a ring, a numerator, and denominator.""" + self.R = R + if parent(top) == ZZ or parent(top) == R: + self.top = R(top) + self.bot = R(bot) + elif top.__class__ == fastfrac: + self.top = top.top + self.bot = top.bot * bot + else: + self.top = R(numerator(top)) + self.bot = R(denominator(top)) * bot + + def iszero(self,I): + """Return whether this fraction is zero given an ideal.""" + return self.top in I and self.bot not in I + + def reduce(self,assumeZero): + zero = self.R.ideal(map(numerator, assumeZero)) + return fastfrac(self.R, zero.reduce(self.top)) / fastfrac(self.R, zero.reduce(self.bot)) + + def __add__(self,other): + """Add two fractions.""" + if parent(other) == ZZ: + return fastfrac(self.R,self.top + self.bot * other,self.bot) + if other.__class__ == fastfrac: + return fastfrac(self.R,self.top * other.bot + self.bot * other.top,self.bot * other.bot) + return NotImplemented + + def __sub__(self,other): + """Subtract two fractions.""" + if parent(other) == ZZ: + return fastfrac(self.R,self.top - self.bot * other,self.bot) + if other.__class__ == fastfrac: + return fastfrac(self.R,self.top * other.bot - self.bot * other.top,self.bot * other.bot) + return NotImplemented + + def __neg__(self): + """Return the negation of a fraction.""" + return fastfrac(self.R,-self.top,self.bot) + + def __mul__(self,other): + """Multiply two fractions.""" + if parent(other) == ZZ: + return fastfrac(self.R,self.top * other,self.bot) + if other.__class__ == fastfrac: + return fastfrac(self.R,self.top * other.top,self.bot * other.bot) + return NotImplemented + + def __rmul__(self,other): + """Multiply something else with a fraction.""" + return self.__mul__(other) + + def __div__(self,other): + """Divide two fractions.""" + if parent(other) == ZZ: + return fastfrac(self.R,self.top,self.bot * other) + if other.__class__ == fastfrac: + return fastfrac(self.R,self.top * other.bot,self.bot * other.top) + return NotImplemented + + def __pow__(self,other): + """Compute a power of a fraction.""" + if parent(other) == ZZ: + if other < 0: + # Negative powers require flipping top and bottom + return fastfrac(self.R,self.bot ^ (-other),self.top ^ (-other)) + else: + return fastfrac(self.R,self.top ^ other,self.bot ^ other) + return NotImplemented + + def __str__(self): + return "fastfrac((" + str(self.top) + ") / (" + str(self.bot) + "))" + def __repr__(self): + return "%s" % self + + def numerator(self): + return self.top + +class constraints: + """A set of constraints, consisting of zero and nonzero expressions. + + Constraints can either be used to express knowledge or a requirement. + + Both the fields zero and nonzero are maps from expressions to description + strings. The expressions that are the keys in zero are required to be zero, + and the expressions that are the keys in nonzero are required to be nonzero. + + Note that (a != 0) and (b != 0) is the same as (a*b != 0), so all keys in + nonzero could be multiplied into a single key. This is often much less + efficient to work with though, so we keep them separate inside the + constraints. This allows higher-level code to do fast checks on the individual + nonzero elements, or combine them if needed for stronger checks. + + We can't multiply the different zero elements, as it would suffice for one of + the factors to be zero, instead of all of them. Instead, the zero elements are + typically combined into an ideal first. + """ + + def __init__(self, **kwargs): + if 'zero' in kwargs: + self.zero = dict(kwargs['zero']) + else: + self.zero = dict() + if 'nonzero' in kwargs: + self.nonzero = dict(kwargs['nonzero']) + else: + self.nonzero = dict() + + def negate(self): + return constraints(zero=self.nonzero, nonzero=self.zero) + + def __add__(self, other): + zero = self.zero.copy() + zero.update(other.zero) + nonzero = self.nonzero.copy() + nonzero.update(other.nonzero) + return constraints(zero=zero, nonzero=nonzero) + + def __str__(self): + return "constraints(zero=%s,nonzero=%s)" % (self.zero, self.nonzero) + + def __repr__(self): + return "%s" % self + + +def conflicts(R, con): + """Check whether any of the passed non-zero assumptions is implied by the zero assumptions""" + zero = R.ideal(map(numerator, con.zero)) + if 1 in zero: + return True + # First a cheap check whether any of the individual nonzero terms conflict on + # their own. + for nonzero in con.nonzero: + if nonzero.iszero(zero): + return True + # It can be the case that entries in the nonzero set do not individually + # conflict with the zero set, but their combination does. For example, knowing + # that either x or y is zero is equivalent to having x*y in the zero set. + # Having x or y individually in the nonzero set is not a conflict, but both + # simultaneously is, so that is the right thing to check for. + if reduce(lambda a,b: a * b, con.nonzero, fastfrac(R, 1)).iszero(zero): + return True + return False + + +def get_nonzero_set(R, assume): + """Calculate a simple set of nonzero expressions""" + zero = R.ideal(map(numerator, assume.zero)) + nonzero = set() + for nz in map(numerator, assume.nonzero): + for (f,n) in nz.factor(): + nonzero.add(f) + rnz = zero.reduce(nz) + for (f,n) in rnz.factor(): + nonzero.add(f) + return nonzero + + +def prove_nonzero(R, exprs, assume): + """Check whether an expression is provably nonzero, given assumptions""" + zero = R.ideal(map(numerator, assume.zero)) + nonzero = get_nonzero_set(R, assume) + expl = set() + ok = True + for expr in exprs: + if numerator(expr) in zero: + return (False, [exprs[expr]]) + allexprs = reduce(lambda a,b: numerator(a)*numerator(b), exprs, 1) + for (f, n) in allexprs.factor(): + if f not in nonzero: + ok = False + if ok: + return (True, None) + ok = True + for (f, n) in zero.reduce(numerator(allexprs)).factor(): + if f not in nonzero: + ok = False + if ok: + return (True, None) + ok = True + for expr in exprs: + for (f,n) in numerator(expr).factor(): + if f not in nonzero: + ok = False + if ok: + return (True, None) + ok = True + for expr in exprs: + for (f,n) in zero.reduce(numerator(expr)).factor(): + if f not in nonzero: + expl.add(exprs[expr]) + if expl: + return (False, list(expl)) + else: + return (True, None) + + +def prove_zero(R, exprs, assume): + """Check whether all of the passed expressions are provably zero, given assumptions""" + r, e = prove_nonzero(R, dict(map(lambda x: (fastfrac(R, x.bot, 1), exprs[x]), exprs)), assume) + if not r: + return (False, map(lambda x: "Possibly zero denominator: %s" % x, e)) + zero = R.ideal(map(numerator, assume.zero)) + nonzero = prod(x for x in assume.nonzero) + expl = [] + for expr in exprs: + if not expr.iszero(zero): + expl.append(exprs[expr]) + if not expl: + return (True, None) + return (False, expl) + + +def describe_extra(R, assume, assumeExtra): + """Describe what assumptions are added, given existing assumptions""" + zerox = assume.zero.copy() + zerox.update(assumeExtra.zero) + zero = R.ideal(map(numerator, assume.zero)) + zeroextra = R.ideal(map(numerator, zerox)) + nonzero = get_nonzero_set(R, assume) + ret = set() + # Iterate over the extra zero expressions + for base in assumeExtra.zero: + if base not in zero: + add = [] + for (f, n) in numerator(base).factor(): + if f not in nonzero: + add += ["%s" % f] + if add: + ret.add((" * ".join(add)) + " = 0 [%s]" % assumeExtra.zero[base]) + # Iterate over the extra nonzero expressions + for nz in assumeExtra.nonzero: + nzr = zeroextra.reduce(numerator(nz)) + if nzr not in zeroextra: + for (f,n) in nzr.factor(): + if zeroextra.reduce(f) not in nonzero: + ret.add("%s != 0" % zeroextra.reduce(f)) + return ", ".join(x for x in ret) + + +def check_symbolic(R, assumeLaw, assumeAssert, assumeBranch, require): + """Check a set of zero and nonzero requirements, given a set of zero and nonzero assumptions""" + assume = assumeLaw + assumeAssert + assumeBranch + + if conflicts(R, assume): + # This formula does not apply + return None + + describe = describe_extra(R, assumeLaw + assumeBranch, assumeAssert) + + ok, msg = prove_zero(R, require.zero, assume) + if not ok: + return "FAIL, %s fails (assuming %s)" % (str(msg), describe) + + res, expl = prove_nonzero(R, require.nonzero, assume) + if not res: + return "FAIL, %s fails (assuming %s)" % (str(expl), describe) + + if describe != "": + return "OK (assuming %s)" % describe + else: + return "OK" + + +def concrete_verify(c): + for k in c.zero: + if k != 0: + return (False, c.zero[k]) + for k in c.nonzero: + if k == 0: + return (False, c.nonzero[k]) + return (True, None) diff --git a/sage/secp256k1.sage b/sage/secp256k1.sage new file mode 100644 index 000000000..a97e732f7 --- /dev/null +++ b/sage/secp256k1.sage @@ -0,0 +1,306 @@ +# Test libsecp256k1' group operation implementations using prover.sage + +import sys + +load("group_prover.sage") +load("weierstrass_prover.sage") + +def formula_secp256k1_gej_double_var(a): + """libsecp256k1's secp256k1_gej_double_var, used by various addition functions""" + rz = a.Z * a.Y + rz = rz * 2 + t1 = a.X^2 + t1 = t1 * 3 + t2 = t1^2 + t3 = a.Y^2 + t3 = t3 * 2 + t4 = t3^2 + t4 = t4 * 2 + t3 = t3 * a.X + rx = t3 + rx = rx * 4 + rx = -rx + rx = rx + t2 + t2 = -t2 + t3 = t3 * 6 + t3 = t3 + t2 + ry = t1 * t3 + t2 = -t4 + ry = ry + t2 + return jacobianpoint(rx, ry, rz) + +def formula_secp256k1_gej_add_var(branch, a, b): + """libsecp256k1's secp256k1_gej_add_var""" + if branch == 0: + return (constraints(), constraints(nonzero={a.Infinity : 'a_infinite'}), b) + if branch == 1: + return (constraints(), constraints(zero={a.Infinity : 'a_finite'}, nonzero={b.Infinity : 'b_infinite'}), a) + z22 = b.Z^2 + z12 = a.Z^2 + u1 = a.X * z22 + u2 = b.X * z12 + s1 = a.Y * z22 + s1 = s1 * b.Z + s2 = b.Y * z12 + s2 = s2 * a.Z + h = -u1 + h = h + u2 + i = -s1 + i = i + s2 + if branch == 2: + r = formula_secp256k1_gej_double_var(a) + return (constraints(), constraints(zero={h : 'h=0', i : 'i=0', a.Infinity : 'a_finite', b.Infinity : 'b_finite'}), r) + if branch == 3: + return (constraints(), constraints(zero={h : 'h=0', a.Infinity : 'a_finite', b.Infinity : 'b_finite'}, nonzero={i : 'i!=0'}), point_at_infinity()) + i2 = i^2 + h2 = h^2 + h3 = h2 * h + h = h * b.Z + rz = a.Z * h + t = u1 * h2 + rx = t + rx = rx * 2 + rx = rx + h3 + rx = -rx + rx = rx + i2 + ry = -rx + ry = ry + t + ry = ry * i + h3 = h3 * s1 + h3 = -h3 + ry = ry + h3 + return (constraints(), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite'}, nonzero={h : 'h!=0'}), jacobianpoint(rx, ry, rz)) + +def formula_secp256k1_gej_add_ge_var(branch, a, b): + """libsecp256k1's secp256k1_gej_add_ge_var, which assume bz==1""" + if branch == 0: + return (constraints(zero={b.Z - 1 : 'b.z=1'}), constraints(nonzero={a.Infinity : 'a_infinite'}), b) + if branch == 1: + return (constraints(zero={b.Z - 1 : 'b.z=1'}), constraints(zero={a.Infinity : 'a_finite'}, nonzero={b.Infinity : 'b_infinite'}), a) + z12 = a.Z^2 + u1 = a.X + u2 = b.X * z12 + s1 = a.Y + s2 = b.Y * z12 + s2 = s2 * a.Z + h = -u1 + h = h + u2 + i = -s1 + i = i + s2 + if (branch == 2): + r = formula_secp256k1_gej_double_var(a) + return (constraints(zero={b.Z - 1 : 'b.z=1'}), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite', h : 'h=0', i : 'i=0'}), r) + if (branch == 3): + return (constraints(zero={b.Z - 1 : 'b.z=1'}), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite', h : 'h=0'}, nonzero={i : 'i!=0'}), point_at_infinity()) + i2 = i^2 + h2 = h^2 + h3 = h * h2 + rz = a.Z * h + t = u1 * h2 + rx = t + rx = rx * 2 + rx = rx + h3 + rx = -rx + rx = rx + i2 + ry = -rx + ry = ry + t + ry = ry * i + h3 = h3 * s1 + h3 = -h3 + ry = ry + h3 + return (constraints(zero={b.Z - 1 : 'b.z=1'}), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite'}, nonzero={h : 'h!=0'}), jacobianpoint(rx, ry, rz)) + +def formula_secp256k1_gej_add_zinv_var(branch, a, b): + """libsecp256k1's secp256k1_gej_add_zinv_var""" + bzinv = b.Z^(-1) + if branch == 0: + return (constraints(), constraints(nonzero={b.Infinity : 'b_infinite'}), a) + if branch == 1: + bzinv2 = bzinv^2 + bzinv3 = bzinv2 * bzinv + rx = b.X * bzinv2 + ry = b.Y * bzinv3 + rz = 1 + return (constraints(), constraints(zero={b.Infinity : 'b_finite'}, nonzero={a.Infinity : 'a_infinite'}), jacobianpoint(rx, ry, rz)) + azz = a.Z * bzinv + z12 = azz^2 + u1 = a.X + u2 = b.X * z12 + s1 = a.Y + s2 = b.Y * z12 + s2 = s2 * azz + h = -u1 + h = h + u2 + i = -s1 + i = i + s2 + if branch == 2: + r = formula_secp256k1_gej_double_var(a) + return (constraints(), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite', h : 'h=0', i : 'i=0'}), r) + if branch == 3: + return (constraints(), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite', h : 'h=0'}, nonzero={i : 'i!=0'}), point_at_infinity()) + i2 = i^2 + h2 = h^2 + h3 = h * h2 + rz = a.Z + rz = rz * h + t = u1 * h2 + rx = t + rx = rx * 2 + rx = rx + h3 + rx = -rx + rx = rx + i2 + ry = -rx + ry = ry + t + ry = ry * i + h3 = h3 * s1 + h3 = -h3 + ry = ry + h3 + return (constraints(), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite'}, nonzero={h : 'h!=0'}), jacobianpoint(rx, ry, rz)) + +def formula_secp256k1_gej_add_ge(branch, a, b): + """libsecp256k1's secp256k1_gej_add_ge""" + zeroes = {} + nonzeroes = {} + a_infinity = False + if (branch & 4) != 0: + nonzeroes.update({a.Infinity : 'a_infinite'}) + a_infinity = True + else: + zeroes.update({a.Infinity : 'a_finite'}) + zz = a.Z^2 + u1 = a.X + u2 = b.X * zz + s1 = a.Y + s2 = b.Y * zz + s2 = s2 * a.Z + t = u1 + t = t + u2 + m = s1 + m = m + s2 + rr = t^2 + m_alt = -u2 + tt = u1 * m_alt + rr = rr + tt + degenerate = (branch & 3) == 3 + if (branch & 1) != 0: + zeroes.update({m : 'm_zero'}) + else: + nonzeroes.update({m : 'm_nonzero'}) + if (branch & 2) != 0: + zeroes.update({rr : 'rr_zero'}) + else: + nonzeroes.update({rr : 'rr_nonzero'}) + rr_alt = s1 + rr_alt = rr_alt * 2 + m_alt = m_alt + u1 + if not degenerate: + rr_alt = rr + m_alt = m + n = m_alt^2 + q = n * t + n = n^2 + if degenerate: + n = m + t = rr_alt^2 + rz = a.Z * m_alt + infinity = False + if (branch & 8) != 0: + if not a_infinity: + infinity = True + zeroes.update({rz : 'r.z=0'}) + else: + nonzeroes.update({rz : 'r.z!=0'}) + rz = rz * 2 + q = -q + t = t + q + rx = t + t = t * 2 + t = t + q + t = t * rr_alt + t = t + n + ry = -t + rx = rx * 4 + ry = ry * 4 + if a_infinity: + rx = b.X + ry = b.Y + rz = 1 + if infinity: + return (constraints(zero={b.Z - 1 : 'b.z=1', b.Infinity : 'b_finite'}), constraints(zero=zeroes, nonzero=nonzeroes), point_at_infinity()) + return (constraints(zero={b.Z - 1 : 'b.z=1', b.Infinity : 'b_finite'}), constraints(zero=zeroes, nonzero=nonzeroes), jacobianpoint(rx, ry, rz)) + +def formula_secp256k1_gej_add_ge_old(branch, a, b): + """libsecp256k1's old secp256k1_gej_add_ge, which fails when ay+by=0 but ax!=bx""" + a_infinity = (branch & 1) != 0 + zero = {} + nonzero = {} + if a_infinity: + nonzero.update({a.Infinity : 'a_infinite'}) + else: + zero.update({a.Infinity : 'a_finite'}) + zz = a.Z^2 + u1 = a.X + u2 = b.X * zz + s1 = a.Y + s2 = b.Y * zz + s2 = s2 * a.Z + z = a.Z + t = u1 + t = t + u2 + m = s1 + m = m + s2 + n = m^2 + q = n * t + n = n^2 + rr = t^2 + t = u1 * u2 + t = -t + rr = rr + t + t = rr^2 + rz = m * z + infinity = False + if (branch & 2) != 0: + if not a_infinity: + infinity = True + else: + return (constraints(zero={b.Z - 1 : 'b.z=1', b.Infinity : 'b_finite'}), constraints(nonzero={z : 'conflict_a'}, zero={z : 'conflict_b'}), point_at_infinity()) + zero.update({rz : 'r.z=0'}) + else: + nonzero.update({rz : 'r.z!=0'}) + rz = rz * (0 if a_infinity else 2) + rx = t + q = -q + rx = rx + q + q = q * 3 + t = t * 2 + t = t + q + t = t * rr + t = t + n + ry = -t + rx = rx * (0 if a_infinity else 4) + ry = ry * (0 if a_infinity else 4) + t = b.X + t = t * (1 if a_infinity else 0) + rx = rx + t + t = b.Y + t = t * (1 if a_infinity else 0) + ry = ry + t + t = (1 if a_infinity else 0) + rz = rz + t + if infinity: + return (constraints(zero={b.Z - 1 : 'b.z=1', b.Infinity : 'b_finite'}), constraints(zero=zero, nonzero=nonzero), point_at_infinity()) + return (constraints(zero={b.Z - 1 : 'b.z=1', b.Infinity : 'b_finite'}), constraints(zero=zero, nonzero=nonzero), jacobianpoint(rx, ry, rz)) + +if __name__ == "__main__": + check_symbolic_jacobian_weierstrass("secp256k1_gej_add_var", 0, 7, 5, formula_secp256k1_gej_add_var) + check_symbolic_jacobian_weierstrass("secp256k1_gej_add_ge_var", 0, 7, 5, formula_secp256k1_gej_add_ge_var) + check_symbolic_jacobian_weierstrass("secp256k1_gej_add_zinv_var", 0, 7, 5, formula_secp256k1_gej_add_zinv_var) + check_symbolic_jacobian_weierstrass("secp256k1_gej_add_ge", 0, 7, 16, formula_secp256k1_gej_add_ge) + check_symbolic_jacobian_weierstrass("secp256k1_gej_add_ge_old [should fail]", 0, 7, 4, formula_secp256k1_gej_add_ge_old) + + if len(sys.argv) >= 2 and sys.argv[1] == "--exhaustive": + check_exhaustive_jacobian_weierstrass("secp256k1_gej_add_var", 0, 7, 5, formula_secp256k1_gej_add_var, 43) + check_exhaustive_jacobian_weierstrass("secp256k1_gej_add_ge_var", 0, 7, 5, formula_secp256k1_gej_add_ge_var, 43) + check_exhaustive_jacobian_weierstrass("secp256k1_gej_add_zinv_var", 0, 7, 5, formula_secp256k1_gej_add_zinv_var, 43) + check_exhaustive_jacobian_weierstrass("secp256k1_gej_add_ge", 0, 7, 16, formula_secp256k1_gej_add_ge, 43) + check_exhaustive_jacobian_weierstrass("secp256k1_gej_add_ge_old [should fail]", 0, 7, 4, formula_secp256k1_gej_add_ge_old, 43) diff --git a/sage/weierstrass_prover.sage b/sage/weierstrass_prover.sage new file mode 100644 index 000000000..03ef2ec90 --- /dev/null +++ b/sage/weierstrass_prover.sage @@ -0,0 +1,264 @@ +# Prover implementation for Weierstrass curves of the form +# y^2 = x^3 + A * x + B, specifically with a = 0 and b = 7, with group laws +# operating on affine and Jacobian coordinates, including the point at infinity +# represented by a 4th variable in coordinates. + +load("group_prover.sage") + + +class affinepoint: + def __init__(self, x, y, infinity=0): + self.x = x + self.y = y + self.infinity = infinity + def __str__(self): + return "affinepoint(x=%s,y=%s,inf=%s)" % (self.x, self.y, self.infinity) + + +class jacobianpoint: + def __init__(self, x, y, z, infinity=0): + self.X = x + self.Y = y + self.Z = z + self.Infinity = infinity + def __str__(self): + return "jacobianpoint(X=%s,Y=%s,Z=%s,inf=%s)" % (self.X, self.Y, self.Z, self.Infinity) + + +def point_at_infinity(): + return jacobianpoint(1, 1, 1, 1) + + +def negate(p): + if p.__class__ == affinepoint: + return affinepoint(p.x, -p.y) + if p.__class__ == jacobianpoint: + return jacobianpoint(p.X, -p.Y, p.Z) + assert(False) + + +def on_weierstrass_curve(A, B, p): + """Return a set of zero-expressions for an affine point to be on the curve""" + return constraints(zero={p.x^3 + A*p.x + B - p.y^2: 'on_curve'}) + + +def tangential_to_weierstrass_curve(A, B, p12, p3): + """Return a set of zero-expressions for ((x12,y12),(x3,y3)) to be a line that is tangential to the curve at (x12,y12)""" + return constraints(zero={ + (p12.y - p3.y) * (p12.y * 2) - (p12.x^2 * 3 + A) * (p12.x - p3.x): 'tangential_to_curve' + }) + + +def colinear(p1, p2, p3): + """Return a set of zero-expressions for ((x1,y1),(x2,y2),(x3,y3)) to be collinear""" + return constraints(zero={ + (p1.y - p2.y) * (p1.x - p3.x) - (p1.y - p3.y) * (p1.x - p2.x): 'colinear_1', + (p2.y - p3.y) * (p2.x - p1.x) - (p2.y - p1.y) * (p2.x - p3.x): 'colinear_2', + (p3.y - p1.y) * (p3.x - p2.x) - (p3.y - p2.y) * (p3.x - p1.x): 'colinear_3' + }) + + +def good_affine_point(p): + return constraints(nonzero={p.x : 'nonzero_x', p.y : 'nonzero_y'}) + + +def good_jacobian_point(p): + return constraints(nonzero={p.X : 'nonzero_X', p.Y : 'nonzero_Y', p.Z^6 : 'nonzero_Z'}) + + +def good_point(p): + return constraints(nonzero={p.Z^6 : 'nonzero_X'}) + + +def finite(p, *affine_fns): + con = good_point(p) + constraints(zero={p.Infinity : 'finite_point'}) + if p.Z != 0: + return con + reduce(lambda a, b: a + b, (f(affinepoint(p.X / p.Z^2, p.Y / p.Z^3)) for f in affine_fns), con) + else: + return con + +def infinite(p): + return constraints(nonzero={p.Infinity : 'infinite_point'}) + + +def law_jacobian_weierstrass_add(A, B, pa, pb, pA, pB, pC): + """Check whether the passed set of coordinates is a valid Jacobian add, given assumptions""" + assumeLaw = (good_affine_point(pa) + + good_affine_point(pb) + + good_jacobian_point(pA) + + good_jacobian_point(pB) + + on_weierstrass_curve(A, B, pa) + + on_weierstrass_curve(A, B, pb) + + finite(pA) + + finite(pB) + + constraints(nonzero={pa.x - pb.x : 'different_x'})) + require = (finite(pC, lambda pc: on_weierstrass_curve(A, B, pc) + + colinear(pa, pb, negate(pc)))) + return (assumeLaw, require) + + +def law_jacobian_weierstrass_double(A, B, pa, pb, pA, pB, pC): + """Check whether the passed set of coordinates is a valid Jacobian doubling, given assumptions""" + assumeLaw = (good_affine_point(pa) + + good_affine_point(pb) + + good_jacobian_point(pA) + + good_jacobian_point(pB) + + on_weierstrass_curve(A, B, pa) + + on_weierstrass_curve(A, B, pb) + + finite(pA) + + finite(pB) + + constraints(zero={pa.x - pb.x : 'equal_x', pa.y - pb.y : 'equal_y'})) + require = (finite(pC, lambda pc: on_weierstrass_curve(A, B, pc) + + tangential_to_weierstrass_curve(A, B, pa, negate(pc)))) + return (assumeLaw, require) + + +def law_jacobian_weierstrass_add_opposites(A, B, pa, pb, pA, pB, pC): + assumeLaw = (good_affine_point(pa) + + good_affine_point(pb) + + good_jacobian_point(pA) + + good_jacobian_point(pB) + + on_weierstrass_curve(A, B, pa) + + on_weierstrass_curve(A, B, pb) + + finite(pA) + + finite(pB) + + constraints(zero={pa.x - pb.x : 'equal_x', pa.y + pb.y : 'opposite_y'})) + require = infinite(pC) + return (assumeLaw, require) + + +def law_jacobian_weierstrass_add_infinite_a(A, B, pa, pb, pA, pB, pC): + assumeLaw = (good_affine_point(pa) + + good_affine_point(pb) + + good_jacobian_point(pA) + + good_jacobian_point(pB) + + on_weierstrass_curve(A, B, pb) + + infinite(pA) + + finite(pB)) + require = finite(pC, lambda pc: constraints(zero={pc.x - pb.x : 'c.x=b.x', pc.y - pb.y : 'c.y=b.y'})) + return (assumeLaw, require) + + +def law_jacobian_weierstrass_add_infinite_b(A, B, pa, pb, pA, pB, pC): + assumeLaw = (good_affine_point(pa) + + good_affine_point(pb) + + good_jacobian_point(pA) + + good_jacobian_point(pB) + + on_weierstrass_curve(A, B, pa) + + infinite(pB) + + finite(pA)) + require = finite(pC, lambda pc: constraints(zero={pc.x - pa.x : 'c.x=a.x', pc.y - pa.y : 'c.y=a.y'})) + return (assumeLaw, require) + + +def law_jacobian_weierstrass_add_infinite_ab(A, B, pa, pb, pA, pB, pC): + assumeLaw = (good_affine_point(pa) + + good_affine_point(pb) + + good_jacobian_point(pA) + + good_jacobian_point(pB) + + infinite(pA) + + infinite(pB)) + require = infinite(pC) + return (assumeLaw, require) + + +laws_jacobian_weierstrass = { + 'add': law_jacobian_weierstrass_add, + 'double': law_jacobian_weierstrass_double, + 'add_opposite': law_jacobian_weierstrass_add_opposites, + 'add_infinite_a': law_jacobian_weierstrass_add_infinite_a, + 'add_infinite_b': law_jacobian_weierstrass_add_infinite_b, + 'add_infinite_ab': law_jacobian_weierstrass_add_infinite_ab +} + + +def check_exhaustive_jacobian_weierstrass(name, A, B, branches, formula, p): + """Verify an implementation of addition of Jacobian points on a Weierstrass curve, by executing and validating the result for every possible addition in a prime field""" + F = Integers(p) + print "Formula %s on Z%i:" % (name, p) + points = [] + for x in xrange(0, p): + for y in xrange(0, p): + point = affinepoint(F(x), F(y)) + r, e = concrete_verify(on_weierstrass_curve(A, B, point)) + if r: + points.append(point) + + for za in xrange(1, p): + for zb in xrange(1, p): + for pa in points: + for pb in points: + for ia in xrange(2): + for ib in xrange(2): + pA = jacobianpoint(pa.x * F(za)^2, pa.y * F(za)^3, F(za), ia) + pB = jacobianpoint(pb.x * F(zb)^2, pb.y * F(zb)^3, F(zb), ib) + for branch in xrange(0, branches): + assumeAssert, assumeBranch, pC = formula(branch, pA, pB) + pC.X = F(pC.X) + pC.Y = F(pC.Y) + pC.Z = F(pC.Z) + pC.Infinity = F(pC.Infinity) + r, e = concrete_verify(assumeAssert + assumeBranch) + if r: + match = False + for key in laws_jacobian_weierstrass: + assumeLaw, require = laws_jacobian_weierstrass[key](A, B, pa, pb, pA, pB, pC) + r, e = concrete_verify(assumeLaw) + if r: + if match: + print " multiple branches for (%s,%s,%s,%s) + (%s,%s,%s,%s)" % (pA.X, pA.Y, pA.Z, pA.Infinity, pB.X, pB.Y, pB.Z, pB.Infinity) + else: + match = True + r, e = concrete_verify(require) + if not r: + print " failure in branch %i for (%s,%s,%s,%s) + (%s,%s,%s,%s) = (%s,%s,%s,%s): %s" % (branch, pA.X, pA.Y, pA.Z, pA.Infinity, pB.X, pB.Y, pB.Z, pB.Infinity, pC.X, pC.Y, pC.Z, pC.Infinity, e) + print + + +def check_symbolic_function(R, assumeAssert, assumeBranch, f, A, B, pa, pb, pA, pB, pC): + assumeLaw, require = f(A, B, pa, pb, pA, pB, pC) + return check_symbolic(R, assumeLaw, assumeAssert, assumeBranch, require) + +def check_symbolic_jacobian_weierstrass(name, A, B, branches, formula): + """Verify an implementation of addition of Jacobian points on a Weierstrass curve symbolically""" + R. = PolynomialRing(QQ,8,order='invlex') + lift = lambda x: fastfrac(R,x) + ax = lift(ax) + ay = lift(ay) + Az = lift(Az) + bx = lift(bx) + by = lift(by) + Bz = lift(Bz) + Ai = lift(Ai) + Bi = lift(Bi) + + pa = affinepoint(ax, ay, Ai) + pb = affinepoint(bx, by, Bi) + pA = jacobianpoint(ax * Az^2, ay * Az^3, Az, Ai) + pB = jacobianpoint(bx * Bz^2, by * Bz^3, Bz, Bi) + + res = {} + + for key in laws_jacobian_weierstrass: + res[key] = [] + + print ("Formula " + name + ":") + count = 0 + for branch in xrange(branches): + assumeFormula, assumeBranch, pC = formula(branch, pA, pB) + pC.X = lift(pC.X) + pC.Y = lift(pC.Y) + pC.Z = lift(pC.Z) + pC.Infinity = lift(pC.Infinity) + + for key in laws_jacobian_weierstrass: + res[key].append((check_symbolic_function(R, assumeFormula, assumeBranch, laws_jacobian_weierstrass[key], A, B, pa, pb, pA, pB, pC), branch)) + + for key in res: + print " %s:" % key + val = res[key] + for x in val: + if x[0] is not None: + print " branch %i: %s" % (x[1], x[0]) + + print diff --git a/src/asm/field_10x26_arm.s b/src/asm/field_10x26_arm.s new file mode 100644 index 000000000..5df561f2f --- /dev/null +++ b/src/asm/field_10x26_arm.s @@ -0,0 +1,919 @@ +@ vim: set tabstop=8 softtabstop=8 shiftwidth=8 noexpandtab syntax=armasm: +/********************************************************************** + * Copyright (c) 2014 Wladimir J. van der Laan * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ +/* +ARM implementation of field_10x26 inner loops. + +Note: + +- To avoid unnecessary loads and make use of available registers, two + 'passes' have every time been interleaved, with the odd passes accumulating c' and d' + which will be added to c and d respectively in the the even passes + +*/ + + .syntax unified + .arch armv7-a + @ eabi attributes - see readelf -A + .eabi_attribute 8, 1 @ Tag_ARM_ISA_use = yes + .eabi_attribute 9, 0 @ Tag_Thumb_ISA_use = no + .eabi_attribute 10, 0 @ Tag_FP_arch = none + .eabi_attribute 24, 1 @ Tag_ABI_align_needed = 8-byte + .eabi_attribute 25, 1 @ Tag_ABI_align_preserved = 8-byte, except leaf SP + .eabi_attribute 30, 2 @ Tag_ABI_optimization_goals = Agressive Speed + .eabi_attribute 34, 1 @ Tag_CPU_unaligned_access = v6 + .text + + @ Field constants + .set field_R0, 0x3d10 + .set field_R1, 0x400 + .set field_not_M, 0xfc000000 @ ~M = ~0x3ffffff + + .align 2 + .global secp256k1_fe_mul_inner + .type secp256k1_fe_mul_inner, %function + @ Arguments: + @ r0 r Restrict: can overlap with a, not with b + @ r1 a + @ r2 b + @ Stack (total 4+10*4 = 44) + @ sp + #0 saved 'r' pointer + @ sp + #4 + 4*X t0,t1,t2,t3,t4,t5,t6,t7,u8,t9 +secp256k1_fe_mul_inner: + stmfd sp!, {r4, r5, r6, r7, r8, r9, r10, r11, r14} + sub sp, sp, #48 @ frame=44 + alignment + str r0, [sp, #0] @ save result address, we need it only at the end + + /****************************************** + * Main computation code. + ****************************************** + + Allocation: + r0,r14,r7,r8 scratch + r1 a (pointer) + r2 b (pointer) + r3:r4 c + r5:r6 d + r11:r12 c' + r9:r10 d' + + Note: do not write to r[] here, it may overlap with a[] + */ + + /* A - interleaved with B */ + ldr r7, [r1, #0*4] @ a[0] + ldr r8, [r2, #9*4] @ b[9] + ldr r0, [r1, #1*4] @ a[1] + umull r5, r6, r7, r8 @ d = a[0] * b[9] + ldr r14, [r2, #8*4] @ b[8] + umull r9, r10, r0, r8 @ d' = a[1] * b[9] + ldr r7, [r1, #2*4] @ a[2] + umlal r5, r6, r0, r14 @ d += a[1] * b[8] + ldr r8, [r2, #7*4] @ b[7] + umlal r9, r10, r7, r14 @ d' += a[2] * b[8] + ldr r0, [r1, #3*4] @ a[3] + umlal r5, r6, r7, r8 @ d += a[2] * b[7] + ldr r14, [r2, #6*4] @ b[6] + umlal r9, r10, r0, r8 @ d' += a[3] * b[7] + ldr r7, [r1, #4*4] @ a[4] + umlal r5, r6, r0, r14 @ d += a[3] * b[6] + ldr r8, [r2, #5*4] @ b[5] + umlal r9, r10, r7, r14 @ d' += a[4] * b[6] + ldr r0, [r1, #5*4] @ a[5] + umlal r5, r6, r7, r8 @ d += a[4] * b[5] + ldr r14, [r2, #4*4] @ b[4] + umlal r9, r10, r0, r8 @ d' += a[5] * b[5] + ldr r7, [r1, #6*4] @ a[6] + umlal r5, r6, r0, r14 @ d += a[5] * b[4] + ldr r8, [r2, #3*4] @ b[3] + umlal r9, r10, r7, r14 @ d' += a[6] * b[4] + ldr r0, [r1, #7*4] @ a[7] + umlal r5, r6, r7, r8 @ d += a[6] * b[3] + ldr r14, [r2, #2*4] @ b[2] + umlal r9, r10, r0, r8 @ d' += a[7] * b[3] + ldr r7, [r1, #8*4] @ a[8] + umlal r5, r6, r0, r14 @ d += a[7] * b[2] + ldr r8, [r2, #1*4] @ b[1] + umlal r9, r10, r7, r14 @ d' += a[8] * b[2] + ldr r0, [r1, #9*4] @ a[9] + umlal r5, r6, r7, r8 @ d += a[8] * b[1] + ldr r14, [r2, #0*4] @ b[0] + umlal r9, r10, r0, r8 @ d' += a[9] * b[1] + ldr r7, [r1, #0*4] @ a[0] + umlal r5, r6, r0, r14 @ d += a[9] * b[0] + @ r7,r14 used in B + + bic r0, r5, field_not_M @ t9 = d & M + str r0, [sp, #4 + 4*9] + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + + /* B */ + umull r3, r4, r7, r14 @ c = a[0] * b[0] + adds r5, r5, r9 @ d += d' + adc r6, r6, r10 + + bic r0, r5, field_not_M @ u0 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u0 * R0 + umlal r3, r4, r0, r14 + + bic r14, r3, field_not_M @ t0 = c & M + str r14, [sp, #4 + 0*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u0 * R1 + umlal r3, r4, r0, r14 + + /* C - interleaved with D */ + ldr r7, [r1, #0*4] @ a[0] + ldr r8, [r2, #2*4] @ b[2] + ldr r14, [r2, #1*4] @ b[1] + umull r11, r12, r7, r8 @ c' = a[0] * b[2] + ldr r0, [r1, #1*4] @ a[1] + umlal r3, r4, r7, r14 @ c += a[0] * b[1] + ldr r8, [r2, #0*4] @ b[0] + umlal r11, r12, r0, r14 @ c' += a[1] * b[1] + ldr r7, [r1, #2*4] @ a[2] + umlal r3, r4, r0, r8 @ c += a[1] * b[0] + ldr r14, [r2, #9*4] @ b[9] + umlal r11, r12, r7, r8 @ c' += a[2] * b[0] + ldr r0, [r1, #3*4] @ a[3] + umlal r5, r6, r7, r14 @ d += a[2] * b[9] + ldr r8, [r2, #8*4] @ b[8] + umull r9, r10, r0, r14 @ d' = a[3] * b[9] + ldr r7, [r1, #4*4] @ a[4] + umlal r5, r6, r0, r8 @ d += a[3] * b[8] + ldr r14, [r2, #7*4] @ b[7] + umlal r9, r10, r7, r8 @ d' += a[4] * b[8] + ldr r0, [r1, #5*4] @ a[5] + umlal r5, r6, r7, r14 @ d += a[4] * b[7] + ldr r8, [r2, #6*4] @ b[6] + umlal r9, r10, r0, r14 @ d' += a[5] * b[7] + ldr r7, [r1, #6*4] @ a[6] + umlal r5, r6, r0, r8 @ d += a[5] * b[6] + ldr r14, [r2, #5*4] @ b[5] + umlal r9, r10, r7, r8 @ d' += a[6] * b[6] + ldr r0, [r1, #7*4] @ a[7] + umlal r5, r6, r7, r14 @ d += a[6] * b[5] + ldr r8, [r2, #4*4] @ b[4] + umlal r9, r10, r0, r14 @ d' += a[7] * b[5] + ldr r7, [r1, #8*4] @ a[8] + umlal r5, r6, r0, r8 @ d += a[7] * b[4] + ldr r14, [r2, #3*4] @ b[3] + umlal r9, r10, r7, r8 @ d' += a[8] * b[4] + ldr r0, [r1, #9*4] @ a[9] + umlal r5, r6, r7, r14 @ d += a[8] * b[3] + ldr r8, [r2, #2*4] @ b[2] + umlal r9, r10, r0, r14 @ d' += a[9] * b[3] + umlal r5, r6, r0, r8 @ d += a[9] * b[2] + + bic r0, r5, field_not_M @ u1 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u1 * R0 + umlal r3, r4, r0, r14 + + bic r14, r3, field_not_M @ t1 = c & M + str r14, [sp, #4 + 1*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u1 * R1 + umlal r3, r4, r0, r14 + + /* D */ + adds r3, r3, r11 @ c += c' + adc r4, r4, r12 + adds r5, r5, r9 @ d += d' + adc r6, r6, r10 + + bic r0, r5, field_not_M @ u2 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u2 * R0 + umlal r3, r4, r0, r14 + + bic r14, r3, field_not_M @ t2 = c & M + str r14, [sp, #4 + 2*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u2 * R1 + umlal r3, r4, r0, r14 + + /* E - interleaved with F */ + ldr r7, [r1, #0*4] @ a[0] + ldr r8, [r2, #4*4] @ b[4] + umull r11, r12, r7, r8 @ c' = a[0] * b[4] + ldr r8, [r2, #3*4] @ b[3] + umlal r3, r4, r7, r8 @ c += a[0] * b[3] + ldr r7, [r1, #1*4] @ a[1] + umlal r11, r12, r7, r8 @ c' += a[1] * b[3] + ldr r8, [r2, #2*4] @ b[2] + umlal r3, r4, r7, r8 @ c += a[1] * b[2] + ldr r7, [r1, #2*4] @ a[2] + umlal r11, r12, r7, r8 @ c' += a[2] * b[2] + ldr r8, [r2, #1*4] @ b[1] + umlal r3, r4, r7, r8 @ c += a[2] * b[1] + ldr r7, [r1, #3*4] @ a[3] + umlal r11, r12, r7, r8 @ c' += a[3] * b[1] + ldr r8, [r2, #0*4] @ b[0] + umlal r3, r4, r7, r8 @ c += a[3] * b[0] + ldr r7, [r1, #4*4] @ a[4] + umlal r11, r12, r7, r8 @ c' += a[4] * b[0] + ldr r8, [r2, #9*4] @ b[9] + umlal r5, r6, r7, r8 @ d += a[4] * b[9] + ldr r7, [r1, #5*4] @ a[5] + umull r9, r10, r7, r8 @ d' = a[5] * b[9] + ldr r8, [r2, #8*4] @ b[8] + umlal r5, r6, r7, r8 @ d += a[5] * b[8] + ldr r7, [r1, #6*4] @ a[6] + umlal r9, r10, r7, r8 @ d' += a[6] * b[8] + ldr r8, [r2, #7*4] @ b[7] + umlal r5, r6, r7, r8 @ d += a[6] * b[7] + ldr r7, [r1, #7*4] @ a[7] + umlal r9, r10, r7, r8 @ d' += a[7] * b[7] + ldr r8, [r2, #6*4] @ b[6] + umlal r5, r6, r7, r8 @ d += a[7] * b[6] + ldr r7, [r1, #8*4] @ a[8] + umlal r9, r10, r7, r8 @ d' += a[8] * b[6] + ldr r8, [r2, #5*4] @ b[5] + umlal r5, r6, r7, r8 @ d += a[8] * b[5] + ldr r7, [r1, #9*4] @ a[9] + umlal r9, r10, r7, r8 @ d' += a[9] * b[5] + ldr r8, [r2, #4*4] @ b[4] + umlal r5, r6, r7, r8 @ d += a[9] * b[4] + + bic r0, r5, field_not_M @ u3 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u3 * R0 + umlal r3, r4, r0, r14 + + bic r14, r3, field_not_M @ t3 = c & M + str r14, [sp, #4 + 3*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u3 * R1 + umlal r3, r4, r0, r14 + + /* F */ + adds r3, r3, r11 @ c += c' + adc r4, r4, r12 + adds r5, r5, r9 @ d += d' + adc r6, r6, r10 + + bic r0, r5, field_not_M @ u4 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u4 * R0 + umlal r3, r4, r0, r14 + + bic r14, r3, field_not_M @ t4 = c & M + str r14, [sp, #4 + 4*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u4 * R1 + umlal r3, r4, r0, r14 + + /* G - interleaved with H */ + ldr r7, [r1, #0*4] @ a[0] + ldr r8, [r2, #6*4] @ b[6] + ldr r14, [r2, #5*4] @ b[5] + umull r11, r12, r7, r8 @ c' = a[0] * b[6] + ldr r0, [r1, #1*4] @ a[1] + umlal r3, r4, r7, r14 @ c += a[0] * b[5] + ldr r8, [r2, #4*4] @ b[4] + umlal r11, r12, r0, r14 @ c' += a[1] * b[5] + ldr r7, [r1, #2*4] @ a[2] + umlal r3, r4, r0, r8 @ c += a[1] * b[4] + ldr r14, [r2, #3*4] @ b[3] + umlal r11, r12, r7, r8 @ c' += a[2] * b[4] + ldr r0, [r1, #3*4] @ a[3] + umlal r3, r4, r7, r14 @ c += a[2] * b[3] + ldr r8, [r2, #2*4] @ b[2] + umlal r11, r12, r0, r14 @ c' += a[3] * b[3] + ldr r7, [r1, #4*4] @ a[4] + umlal r3, r4, r0, r8 @ c += a[3] * b[2] + ldr r14, [r2, #1*4] @ b[1] + umlal r11, r12, r7, r8 @ c' += a[4] * b[2] + ldr r0, [r1, #5*4] @ a[5] + umlal r3, r4, r7, r14 @ c += a[4] * b[1] + ldr r8, [r2, #0*4] @ b[0] + umlal r11, r12, r0, r14 @ c' += a[5] * b[1] + ldr r7, [r1, #6*4] @ a[6] + umlal r3, r4, r0, r8 @ c += a[5] * b[0] + ldr r14, [r2, #9*4] @ b[9] + umlal r11, r12, r7, r8 @ c' += a[6] * b[0] + ldr r0, [r1, #7*4] @ a[7] + umlal r5, r6, r7, r14 @ d += a[6] * b[9] + ldr r8, [r2, #8*4] @ b[8] + umull r9, r10, r0, r14 @ d' = a[7] * b[9] + ldr r7, [r1, #8*4] @ a[8] + umlal r5, r6, r0, r8 @ d += a[7] * b[8] + ldr r14, [r2, #7*4] @ b[7] + umlal r9, r10, r7, r8 @ d' += a[8] * b[8] + ldr r0, [r1, #9*4] @ a[9] + umlal r5, r6, r7, r14 @ d += a[8] * b[7] + ldr r8, [r2, #6*4] @ b[6] + umlal r9, r10, r0, r14 @ d' += a[9] * b[7] + umlal r5, r6, r0, r8 @ d += a[9] * b[6] + + bic r0, r5, field_not_M @ u5 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u5 * R0 + umlal r3, r4, r0, r14 + + bic r14, r3, field_not_M @ t5 = c & M + str r14, [sp, #4 + 5*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u5 * R1 + umlal r3, r4, r0, r14 + + /* H */ + adds r3, r3, r11 @ c += c' + adc r4, r4, r12 + adds r5, r5, r9 @ d += d' + adc r6, r6, r10 + + bic r0, r5, field_not_M @ u6 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u6 * R0 + umlal r3, r4, r0, r14 + + bic r14, r3, field_not_M @ t6 = c & M + str r14, [sp, #4 + 6*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u6 * R1 + umlal r3, r4, r0, r14 + + /* I - interleaved with J */ + ldr r8, [r2, #8*4] @ b[8] + ldr r7, [r1, #0*4] @ a[0] + ldr r14, [r2, #7*4] @ b[7] + umull r11, r12, r7, r8 @ c' = a[0] * b[8] + ldr r0, [r1, #1*4] @ a[1] + umlal r3, r4, r7, r14 @ c += a[0] * b[7] + ldr r8, [r2, #6*4] @ b[6] + umlal r11, r12, r0, r14 @ c' += a[1] * b[7] + ldr r7, [r1, #2*4] @ a[2] + umlal r3, r4, r0, r8 @ c += a[1] * b[6] + ldr r14, [r2, #5*4] @ b[5] + umlal r11, r12, r7, r8 @ c' += a[2] * b[6] + ldr r0, [r1, #3*4] @ a[3] + umlal r3, r4, r7, r14 @ c += a[2] * b[5] + ldr r8, [r2, #4*4] @ b[4] + umlal r11, r12, r0, r14 @ c' += a[3] * b[5] + ldr r7, [r1, #4*4] @ a[4] + umlal r3, r4, r0, r8 @ c += a[3] * b[4] + ldr r14, [r2, #3*4] @ b[3] + umlal r11, r12, r7, r8 @ c' += a[4] * b[4] + ldr r0, [r1, #5*4] @ a[5] + umlal r3, r4, r7, r14 @ c += a[4] * b[3] + ldr r8, [r2, #2*4] @ b[2] + umlal r11, r12, r0, r14 @ c' += a[5] * b[3] + ldr r7, [r1, #6*4] @ a[6] + umlal r3, r4, r0, r8 @ c += a[5] * b[2] + ldr r14, [r2, #1*4] @ b[1] + umlal r11, r12, r7, r8 @ c' += a[6] * b[2] + ldr r0, [r1, #7*4] @ a[7] + umlal r3, r4, r7, r14 @ c += a[6] * b[1] + ldr r8, [r2, #0*4] @ b[0] + umlal r11, r12, r0, r14 @ c' += a[7] * b[1] + ldr r7, [r1, #8*4] @ a[8] + umlal r3, r4, r0, r8 @ c += a[7] * b[0] + ldr r14, [r2, #9*4] @ b[9] + umlal r11, r12, r7, r8 @ c' += a[8] * b[0] + ldr r0, [r1, #9*4] @ a[9] + umlal r5, r6, r7, r14 @ d += a[8] * b[9] + ldr r8, [r2, #8*4] @ b[8] + umull r9, r10, r0, r14 @ d' = a[9] * b[9] + umlal r5, r6, r0, r8 @ d += a[9] * b[8] + + bic r0, r5, field_not_M @ u7 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u7 * R0 + umlal r3, r4, r0, r14 + + bic r14, r3, field_not_M @ t7 = c & M + str r14, [sp, #4 + 7*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u7 * R1 + umlal r3, r4, r0, r14 + + /* J */ + adds r3, r3, r11 @ c += c' + adc r4, r4, r12 + adds r5, r5, r9 @ d += d' + adc r6, r6, r10 + + bic r0, r5, field_not_M @ u8 = d & M + str r0, [sp, #4 + 8*4] + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u8 * R0 + umlal r3, r4, r0, r14 + + /****************************************** + * compute and write back result + ****************************************** + Allocation: + r0 r + r3:r4 c + r5:r6 d + r7 t0 + r8 t1 + r9 t2 + r11 u8 + r12 t9 + r1,r2,r10,r14 scratch + + Note: do not read from a[] after here, it may overlap with r[] + */ + ldr r0, [sp, #0] + add r1, sp, #4 + 3*4 @ r[3..7] = t3..7, r11=u8, r12=t9 + ldmia r1, {r2,r7,r8,r9,r10,r11,r12} + add r1, r0, #3*4 + stmia r1, {r2,r7,r8,r9,r10} + + bic r2, r3, field_not_M @ r[8] = c & M + str r2, [r0, #8*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u8 * R1 + umlal r3, r4, r11, r14 + movw r14, field_R0 @ c += d * R0 + umlal r3, r4, r5, r14 + adds r3, r3, r12 @ c += t9 + adc r4, r4, #0 + + add r1, sp, #4 + 0*4 @ r7,r8,r9 = t0,t1,t2 + ldmia r1, {r7,r8,r9} + + ubfx r2, r3, #0, #22 @ r[9] = c & (M >> 4) + str r2, [r0, #9*4] + mov r3, r3, lsr #22 @ c >>= 22 + orr r3, r3, r4, asl #10 + mov r4, r4, lsr #22 + movw r14, field_R1 << 4 @ c += d * (R1 << 4) + umlal r3, r4, r5, r14 + + movw r14, field_R0 >> 4 @ d = c * (R0 >> 4) + t0 (64x64 multiply+add) + umull r5, r6, r3, r14 @ d = c.lo * (R0 >> 4) + adds r5, r5, r7 @ d.lo += t0 + mla r6, r14, r4, r6 @ d.hi += c.hi * (R0 >> 4) + adc r6, r6, 0 @ d.hi += carry + + bic r2, r5, field_not_M @ r[0] = d & M + str r2, [r0, #0*4] + + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + + movw r14, field_R1 >> 4 @ d += c * (R1 >> 4) + t1 (64x64 multiply+add) + umull r1, r2, r3, r14 @ tmp = c.lo * (R1 >> 4) + adds r5, r5, r8 @ d.lo += t1 + adc r6, r6, #0 @ d.hi += carry + adds r5, r5, r1 @ d.lo += tmp.lo + mla r2, r14, r4, r2 @ tmp.hi += c.hi * (R1 >> 4) + adc r6, r6, r2 @ d.hi += carry + tmp.hi + + bic r2, r5, field_not_M @ r[1] = d & M + str r2, [r0, #1*4] + mov r5, r5, lsr #26 @ d >>= 26 (ignore hi) + orr r5, r5, r6, asl #6 + + add r5, r5, r9 @ d += t2 + str r5, [r0, #2*4] @ r[2] = d + + add sp, sp, #48 + ldmfd sp!, {r4, r5, r6, r7, r8, r9, r10, r11, pc} + .size secp256k1_fe_mul_inner, .-secp256k1_fe_mul_inner + + .align 2 + .global secp256k1_fe_sqr_inner + .type secp256k1_fe_sqr_inner, %function + @ Arguments: + @ r0 r Can overlap with a + @ r1 a + @ Stack (total 4+10*4 = 44) + @ sp + #0 saved 'r' pointer + @ sp + #4 + 4*X t0,t1,t2,t3,t4,t5,t6,t7,u8,t9 +secp256k1_fe_sqr_inner: + stmfd sp!, {r4, r5, r6, r7, r8, r9, r10, r11, r14} + sub sp, sp, #48 @ frame=44 + alignment + str r0, [sp, #0] @ save result address, we need it only at the end + /****************************************** + * Main computation code. + ****************************************** + + Allocation: + r0,r14,r2,r7,r8 scratch + r1 a (pointer) + r3:r4 c + r5:r6 d + r11:r12 c' + r9:r10 d' + + Note: do not write to r[] here, it may overlap with a[] + */ + /* A interleaved with B */ + ldr r0, [r1, #1*4] @ a[1]*2 + ldr r7, [r1, #0*4] @ a[0] + mov r0, r0, asl #1 + ldr r14, [r1, #9*4] @ a[9] + umull r3, r4, r7, r7 @ c = a[0] * a[0] + ldr r8, [r1, #8*4] @ a[8] + mov r7, r7, asl #1 + umull r5, r6, r7, r14 @ d = a[0]*2 * a[9] + ldr r7, [r1, #2*4] @ a[2]*2 + umull r9, r10, r0, r14 @ d' = a[1]*2 * a[9] + ldr r14, [r1, #7*4] @ a[7] + umlal r5, r6, r0, r8 @ d += a[1]*2 * a[8] + mov r7, r7, asl #1 + ldr r0, [r1, #3*4] @ a[3]*2 + umlal r9, r10, r7, r8 @ d' += a[2]*2 * a[8] + ldr r8, [r1, #6*4] @ a[6] + umlal r5, r6, r7, r14 @ d += a[2]*2 * a[7] + mov r0, r0, asl #1 + ldr r7, [r1, #4*4] @ a[4]*2 + umlal r9, r10, r0, r14 @ d' += a[3]*2 * a[7] + ldr r14, [r1, #5*4] @ a[5] + mov r7, r7, asl #1 + umlal r5, r6, r0, r8 @ d += a[3]*2 * a[6] + umlal r9, r10, r7, r8 @ d' += a[4]*2 * a[6] + umlal r5, r6, r7, r14 @ d += a[4]*2 * a[5] + umlal r9, r10, r14, r14 @ d' += a[5] * a[5] + + bic r0, r5, field_not_M @ t9 = d & M + str r0, [sp, #4 + 9*4] + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + + /* B */ + adds r5, r5, r9 @ d += d' + adc r6, r6, r10 + + bic r0, r5, field_not_M @ u0 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u0 * R0 + umlal r3, r4, r0, r14 + bic r14, r3, field_not_M @ t0 = c & M + str r14, [sp, #4 + 0*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u0 * R1 + umlal r3, r4, r0, r14 + + /* C interleaved with D */ + ldr r0, [r1, #0*4] @ a[0]*2 + ldr r14, [r1, #1*4] @ a[1] + mov r0, r0, asl #1 + ldr r8, [r1, #2*4] @ a[2] + umlal r3, r4, r0, r14 @ c += a[0]*2 * a[1] + mov r7, r8, asl #1 @ a[2]*2 + umull r11, r12, r14, r14 @ c' = a[1] * a[1] + ldr r14, [r1, #9*4] @ a[9] + umlal r11, r12, r0, r8 @ c' += a[0]*2 * a[2] + ldr r0, [r1, #3*4] @ a[3]*2 + ldr r8, [r1, #8*4] @ a[8] + umlal r5, r6, r7, r14 @ d += a[2]*2 * a[9] + mov r0, r0, asl #1 + ldr r7, [r1, #4*4] @ a[4]*2 + umull r9, r10, r0, r14 @ d' = a[3]*2 * a[9] + ldr r14, [r1, #7*4] @ a[7] + umlal r5, r6, r0, r8 @ d += a[3]*2 * a[8] + mov r7, r7, asl #1 + ldr r0, [r1, #5*4] @ a[5]*2 + umlal r9, r10, r7, r8 @ d' += a[4]*2 * a[8] + ldr r8, [r1, #6*4] @ a[6] + mov r0, r0, asl #1 + umlal r5, r6, r7, r14 @ d += a[4]*2 * a[7] + umlal r9, r10, r0, r14 @ d' += a[5]*2 * a[7] + umlal r5, r6, r0, r8 @ d += a[5]*2 * a[6] + umlal r9, r10, r8, r8 @ d' += a[6] * a[6] + + bic r0, r5, field_not_M @ u1 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u1 * R0 + umlal r3, r4, r0, r14 + bic r14, r3, field_not_M @ t1 = c & M + str r14, [sp, #4 + 1*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u1 * R1 + umlal r3, r4, r0, r14 + + /* D */ + adds r3, r3, r11 @ c += c' + adc r4, r4, r12 + adds r5, r5, r9 @ d += d' + adc r6, r6, r10 + + bic r0, r5, field_not_M @ u2 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u2 * R0 + umlal r3, r4, r0, r14 + bic r14, r3, field_not_M @ t2 = c & M + str r14, [sp, #4 + 2*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u2 * R1 + umlal r3, r4, r0, r14 + + /* E interleaved with F */ + ldr r7, [r1, #0*4] @ a[0]*2 + ldr r0, [r1, #1*4] @ a[1]*2 + ldr r14, [r1, #2*4] @ a[2] + mov r7, r7, asl #1 + ldr r8, [r1, #3*4] @ a[3] + ldr r2, [r1, #4*4] + umlal r3, r4, r7, r8 @ c += a[0]*2 * a[3] + mov r0, r0, asl #1 + umull r11, r12, r7, r2 @ c' = a[0]*2 * a[4] + mov r2, r2, asl #1 @ a[4]*2 + umlal r11, r12, r0, r8 @ c' += a[1]*2 * a[3] + ldr r8, [r1, #9*4] @ a[9] + umlal r3, r4, r0, r14 @ c += a[1]*2 * a[2] + ldr r0, [r1, #5*4] @ a[5]*2 + umlal r11, r12, r14, r14 @ c' += a[2] * a[2] + ldr r14, [r1, #8*4] @ a[8] + mov r0, r0, asl #1 + umlal r5, r6, r2, r8 @ d += a[4]*2 * a[9] + ldr r7, [r1, #6*4] @ a[6]*2 + umull r9, r10, r0, r8 @ d' = a[5]*2 * a[9] + mov r7, r7, asl #1 + ldr r8, [r1, #7*4] @ a[7] + umlal r5, r6, r0, r14 @ d += a[5]*2 * a[8] + umlal r9, r10, r7, r14 @ d' += a[6]*2 * a[8] + umlal r5, r6, r7, r8 @ d += a[6]*2 * a[7] + umlal r9, r10, r8, r8 @ d' += a[7] * a[7] + + bic r0, r5, field_not_M @ u3 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u3 * R0 + umlal r3, r4, r0, r14 + bic r14, r3, field_not_M @ t3 = c & M + str r14, [sp, #4 + 3*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u3 * R1 + umlal r3, r4, r0, r14 + + /* F */ + adds r3, r3, r11 @ c += c' + adc r4, r4, r12 + adds r5, r5, r9 @ d += d' + adc r6, r6, r10 + + bic r0, r5, field_not_M @ u4 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u4 * R0 + umlal r3, r4, r0, r14 + bic r14, r3, field_not_M @ t4 = c & M + str r14, [sp, #4 + 4*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u4 * R1 + umlal r3, r4, r0, r14 + + /* G interleaved with H */ + ldr r7, [r1, #0*4] @ a[0]*2 + ldr r0, [r1, #1*4] @ a[1]*2 + mov r7, r7, asl #1 + ldr r8, [r1, #5*4] @ a[5] + ldr r2, [r1, #6*4] @ a[6] + umlal r3, r4, r7, r8 @ c += a[0]*2 * a[5] + ldr r14, [r1, #4*4] @ a[4] + mov r0, r0, asl #1 + umull r11, r12, r7, r2 @ c' = a[0]*2 * a[6] + ldr r7, [r1, #2*4] @ a[2]*2 + umlal r11, r12, r0, r8 @ c' += a[1]*2 * a[5] + mov r7, r7, asl #1 + ldr r8, [r1, #3*4] @ a[3] + umlal r3, r4, r0, r14 @ c += a[1]*2 * a[4] + mov r0, r2, asl #1 @ a[6]*2 + umlal r11, r12, r7, r14 @ c' += a[2]*2 * a[4] + ldr r14, [r1, #9*4] @ a[9] + umlal r3, r4, r7, r8 @ c += a[2]*2 * a[3] + ldr r7, [r1, #7*4] @ a[7]*2 + umlal r11, r12, r8, r8 @ c' += a[3] * a[3] + mov r7, r7, asl #1 + ldr r8, [r1, #8*4] @ a[8] + umlal r5, r6, r0, r14 @ d += a[6]*2 * a[9] + umull r9, r10, r7, r14 @ d' = a[7]*2 * a[9] + umlal r5, r6, r7, r8 @ d += a[7]*2 * a[8] + umlal r9, r10, r8, r8 @ d' += a[8] * a[8] + + bic r0, r5, field_not_M @ u5 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u5 * R0 + umlal r3, r4, r0, r14 + bic r14, r3, field_not_M @ t5 = c & M + str r14, [sp, #4 + 5*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u5 * R1 + umlal r3, r4, r0, r14 + + /* H */ + adds r3, r3, r11 @ c += c' + adc r4, r4, r12 + adds r5, r5, r9 @ d += d' + adc r6, r6, r10 + + bic r0, r5, field_not_M @ u6 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u6 * R0 + umlal r3, r4, r0, r14 + bic r14, r3, field_not_M @ t6 = c & M + str r14, [sp, #4 + 6*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u6 * R1 + umlal r3, r4, r0, r14 + + /* I interleaved with J */ + ldr r7, [r1, #0*4] @ a[0]*2 + ldr r0, [r1, #1*4] @ a[1]*2 + mov r7, r7, asl #1 + ldr r8, [r1, #7*4] @ a[7] + ldr r2, [r1, #8*4] @ a[8] + umlal r3, r4, r7, r8 @ c += a[0]*2 * a[7] + ldr r14, [r1, #6*4] @ a[6] + mov r0, r0, asl #1 + umull r11, r12, r7, r2 @ c' = a[0]*2 * a[8] + ldr r7, [r1, #2*4] @ a[2]*2 + umlal r11, r12, r0, r8 @ c' += a[1]*2 * a[7] + ldr r8, [r1, #5*4] @ a[5] + umlal r3, r4, r0, r14 @ c += a[1]*2 * a[6] + ldr r0, [r1, #3*4] @ a[3]*2 + mov r7, r7, asl #1 + umlal r11, r12, r7, r14 @ c' += a[2]*2 * a[6] + ldr r14, [r1, #4*4] @ a[4] + mov r0, r0, asl #1 + umlal r3, r4, r7, r8 @ c += a[2]*2 * a[5] + mov r2, r2, asl #1 @ a[8]*2 + umlal r11, r12, r0, r8 @ c' += a[3]*2 * a[5] + umlal r3, r4, r0, r14 @ c += a[3]*2 * a[4] + umlal r11, r12, r14, r14 @ c' += a[4] * a[4] + ldr r8, [r1, #9*4] @ a[9] + umlal r5, r6, r2, r8 @ d += a[8]*2 * a[9] + @ r8 will be used in J + + bic r0, r5, field_not_M @ u7 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u7 * R0 + umlal r3, r4, r0, r14 + bic r14, r3, field_not_M @ t7 = c & M + str r14, [sp, #4 + 7*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u7 * R1 + umlal r3, r4, r0, r14 + + /* J */ + adds r3, r3, r11 @ c += c' + adc r4, r4, r12 + umlal r5, r6, r8, r8 @ d += a[9] * a[9] + + bic r0, r5, field_not_M @ u8 = d & M + str r0, [sp, #4 + 8*4] + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u8 * R0 + umlal r3, r4, r0, r14 + + /****************************************** + * compute and write back result + ****************************************** + Allocation: + r0 r + r3:r4 c + r5:r6 d + r7 t0 + r8 t1 + r9 t2 + r11 u8 + r12 t9 + r1,r2,r10,r14 scratch + + Note: do not read from a[] after here, it may overlap with r[] + */ + ldr r0, [sp, #0] + add r1, sp, #4 + 3*4 @ r[3..7] = t3..7, r11=u8, r12=t9 + ldmia r1, {r2,r7,r8,r9,r10,r11,r12} + add r1, r0, #3*4 + stmia r1, {r2,r7,r8,r9,r10} + + bic r2, r3, field_not_M @ r[8] = c & M + str r2, [r0, #8*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u8 * R1 + umlal r3, r4, r11, r14 + movw r14, field_R0 @ c += d * R0 + umlal r3, r4, r5, r14 + adds r3, r3, r12 @ c += t9 + adc r4, r4, #0 + + add r1, sp, #4 + 0*4 @ r7,r8,r9 = t0,t1,t2 + ldmia r1, {r7,r8,r9} + + ubfx r2, r3, #0, #22 @ r[9] = c & (M >> 4) + str r2, [r0, #9*4] + mov r3, r3, lsr #22 @ c >>= 22 + orr r3, r3, r4, asl #10 + mov r4, r4, lsr #22 + movw r14, field_R1 << 4 @ c += d * (R1 << 4) + umlal r3, r4, r5, r14 + + movw r14, field_R0 >> 4 @ d = c * (R0 >> 4) + t0 (64x64 multiply+add) + umull r5, r6, r3, r14 @ d = c.lo * (R0 >> 4) + adds r5, r5, r7 @ d.lo += t0 + mla r6, r14, r4, r6 @ d.hi += c.hi * (R0 >> 4) + adc r6, r6, 0 @ d.hi += carry + + bic r2, r5, field_not_M @ r[0] = d & M + str r2, [r0, #0*4] + + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + + movw r14, field_R1 >> 4 @ d += c * (R1 >> 4) + t1 (64x64 multiply+add) + umull r1, r2, r3, r14 @ tmp = c.lo * (R1 >> 4) + adds r5, r5, r8 @ d.lo += t1 + adc r6, r6, #0 @ d.hi += carry + adds r5, r5, r1 @ d.lo += tmp.lo + mla r2, r14, r4, r2 @ tmp.hi += c.hi * (R1 >> 4) + adc r6, r6, r2 @ d.hi += carry + tmp.hi + + bic r2, r5, field_not_M @ r[1] = d & M + str r2, [r0, #1*4] + mov r5, r5, lsr #26 @ d >>= 26 (ignore hi) + orr r5, r5, r6, asl #6 + + add r5, r5, r9 @ d += t2 + str r5, [r0, #2*4] @ r[2] = d + + add sp, sp, #48 + ldmfd sp!, {r4, r5, r6, r7, r8, r9, r10, r11, pc} + .size secp256k1_fe_sqr_inner, .-secp256k1_fe_sqr_inner + diff --git a/src/basic-config.h b/src/basic-config.h new file mode 100644 index 000000000..c4c16eb7c --- /dev/null +++ b/src/basic-config.h @@ -0,0 +1,32 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_BASIC_CONFIG_ +#define _SECP256K1_BASIC_CONFIG_ + +#ifdef USE_BASIC_CONFIG + +#undef USE_ASM_X86_64 +#undef USE_ENDOMORPHISM +#undef USE_FIELD_10X26 +#undef USE_FIELD_5X52 +#undef USE_FIELD_INV_BUILTIN +#undef USE_FIELD_INV_NUM +#undef USE_NUM_GMP +#undef USE_NUM_NONE +#undef USE_SCALAR_4X64 +#undef USE_SCALAR_8X32 +#undef USE_SCALAR_INV_BUILTIN +#undef USE_SCALAR_INV_NUM + +#define USE_NUM_NONE 1 +#define USE_FIELD_INV_BUILTIN 1 +#define USE_SCALAR_INV_BUILTIN 1 +#define USE_FIELD_10X26 1 +#define USE_SCALAR_8X32 1 + +#endif // USE_BASIC_CONFIG +#endif // _SECP256K1_BASIC_CONFIG_ diff --git a/src/bench.h b/src/bench.h index db5f68cee..d67f08a42 100644 --- a/src/bench.h +++ b/src/bench.h @@ -20,8 +20,10 @@ static double gettimedouble(void) { void print_number(double x) { double y = x; int c = 0; - if (y < 0.0) y = -y; - while (y < 100.0) { + if (y < 0.0) { + y = -y; + } + while (y > 0 && y < 100.0) { y *= 10.0; c++; } @@ -35,13 +37,21 @@ void run_benchmark(char *name, void (*benchmark)(void*), void (*setup)(void*), v double max = 0.0; for (i = 0; i < count; i++) { double begin, total; - if (setup) setup(data); + if (setup != NULL) { + setup(data); + } begin = gettimedouble(); benchmark(data); total = gettimedouble() - begin; - if (teardown) teardown(data); - if (total < min) min = total; - if (total > max) max = total; + if (teardown != NULL) { + teardown(data); + } + if (total < min) { + min = total; + } + if (total > max) { + max = total; + } sum += total; } printf("%s: min ", name); diff --git a/src/bench_ecdh.c b/src/bench_ecdh.c new file mode 100644 index 000000000..cde5e2dbb --- /dev/null +++ b/src/bench_ecdh.c @@ -0,0 +1,54 @@ +/********************************************************************** + * Copyright (c) 2015 Pieter Wuille, Andrew Poelstra * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#include + +#include "include/secp256k1.h" +#include "include/secp256k1_ecdh.h" +#include "util.h" +#include "bench.h" + +typedef struct { + secp256k1_context *ctx; + secp256k1_pubkey point; + unsigned char scalar[32]; +} bench_ecdh_t; + +static void bench_ecdh_setup(void* arg) { + int i; + bench_ecdh_t *data = (bench_ecdh_t*)arg; + const unsigned char point[] = { + 0x03, + 0x54, 0x94, 0xc1, 0x5d, 0x32, 0x09, 0x97, 0x06, + 0xc2, 0x39, 0x5f, 0x94, 0x34, 0x87, 0x45, 0xfd, + 0x75, 0x7c, 0xe3, 0x0e, 0x4e, 0x8c, 0x90, 0xfb, + 0xa2, 0xba, 0xd1, 0x84, 0xf8, 0x83, 0xc6, 0x9f + }; + + /* create a context with no capabilities */ + data->ctx = secp256k1_context_create(SECP256K1_FLAGS_TYPE_CONTEXT); + for (i = 0; i < 32; i++) { + data->scalar[i] = i + 1; + } + CHECK(secp256k1_ec_pubkey_parse(data->ctx, &data->point, point, sizeof(point)) == 1); +} + +static void bench_ecdh(void* arg) { + int i; + unsigned char res[32]; + bench_ecdh_t *data = (bench_ecdh_t*)arg; + + for (i = 0; i < 20000; i++) { + CHECK(secp256k1_ecdh(data->ctx, res, &data->point, data->scalar) == 1); + } +} + +int main(void) { + bench_ecdh_t data; + + run_benchmark("ecdh", bench_ecdh, bench_ecdh_setup, NULL, &data, 10, 20000); + return 0; +} diff --git a/src/bench_internal.c b/src/bench_internal.c index a960549b9..0809f77bd 100644 --- a/src/bench_internal.c +++ b/src/bench_internal.c @@ -13,15 +13,17 @@ #include "field_impl.h" #include "group_impl.h" #include "scalar_impl.h" +#include "ecmult_const_impl.h" #include "ecmult_impl.h" #include "bench.h" +#include "secp256k1.c" typedef struct { - secp256k1_scalar_t scalar_x, scalar_y; - secp256k1_fe_t fe_x, fe_y; - secp256k1_ge_t ge_x, ge_y; - secp256k1_gej_t gej_x, gej_y; - unsigned char data[32]; + secp256k1_scalar scalar_x, scalar_y; + secp256k1_fe fe_x, fe_y; + secp256k1_ge ge_x, ge_y; + secp256k1_gej gej_x, gej_y; + unsigned char data[64]; int wnaf[256]; } bench_inv_t; @@ -51,6 +53,7 @@ void bench_setup(void* arg) { secp256k1_gej_set_ge(&data->gej_x, &data->ge_x); secp256k1_gej_set_ge(&data->gej_y, &data->ge_y); memcpy(data->data, init_x, 32); + memcpy(data->data + 32, init_y, 32); } void bench_scalar_add(void* arg) { @@ -95,8 +98,8 @@ void bench_scalar_split(void* arg) { bench_inv_t *data = (bench_inv_t*)arg; for (i = 0; i < 20000; i++) { - secp256k1_scalar_t l, r; - secp256k1_scalar_split_lambda_var(&l, &r, &data->scalar_x); + secp256k1_scalar l, r; + secp256k1_scalar_split_lambda(&l, &r, &data->scalar_x); secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); } } @@ -178,12 +181,12 @@ void bench_field_inverse_var(void* arg) { } } -void bench_field_sqrt_var(void* arg) { +void bench_field_sqrt(void* arg) { int i; bench_inv_t *data = (bench_inv_t*)arg; for (i = 0; i < 20000; i++) { - secp256k1_fe_sqrt_var(&data->fe_x, &data->fe_x); + secp256k1_fe_sqrt(&data->fe_x, &data->fe_x); secp256k1_fe_add(&data->fe_x, &data->fe_y); } } @@ -193,7 +196,7 @@ void bench_group_double_var(void* arg) { bench_inv_t *data = (bench_inv_t*)arg; for (i = 0; i < 200000; i++) { - secp256k1_gej_double_var(&data->gej_x, &data->gej_x); + secp256k1_gej_double_var(&data->gej_x, &data->gej_x, NULL); } } @@ -202,7 +205,7 @@ void bench_group_add_var(void* arg) { bench_inv_t *data = (bench_inv_t*)arg; for (i = 0; i < 200000; i++) { - secp256k1_gej_add_var(&data->gej_x, &data->gej_x, &data->gej_y); + secp256k1_gej_add_var(&data->gej_x, &data->gej_x, &data->gej_y, NULL); } } @@ -220,7 +223,16 @@ void bench_group_add_affine_var(void* arg) { bench_inv_t *data = (bench_inv_t*)arg; for (i = 0; i < 200000; i++) { - secp256k1_gej_add_ge_var(&data->gej_x, &data->gej_x, &data->ge_y); + secp256k1_gej_add_ge_var(&data->gej_x, &data->gej_x, &data->ge_y, NULL); + } +} + +void bench_group_jacobi_var(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 20000; i++) { + secp256k1_gej_has_quad_y_var(&data->gej_x); } } @@ -229,7 +241,17 @@ void bench_ecmult_wnaf(void* arg) { bench_inv_t *data = (bench_inv_t*)arg; for (i = 0; i < 20000; i++) { - secp256k1_ecmult_wnaf(data->wnaf, &data->scalar_x, WINDOW_A); + secp256k1_ecmult_wnaf(data->wnaf, 256, &data->scalar_x, WINDOW_A); + secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); + } +} + +void bench_wnaf_const(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 20000; i++) { + secp256k1_wnaf_const(data->wnaf, data->scalar_x, WINDOW_A); secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); } } @@ -265,11 +287,42 @@ void bench_rfc6979_hmac_sha256(void* arg) { secp256k1_rfc6979_hmac_sha256_t rng; for (i = 0; i < 20000; i++) { - secp256k1_rfc6979_hmac_sha256_initialize(&rng, data->data, 32, data->data, 32, NULL, 0); + secp256k1_rfc6979_hmac_sha256_initialize(&rng, data->data, 64); secp256k1_rfc6979_hmac_sha256_generate(&rng, data->data, 32); } } +void bench_context_verify(void* arg) { + int i; + (void)arg; + for (i = 0; i < 20; i++) { + secp256k1_context_destroy(secp256k1_context_create(SECP256K1_CONTEXT_VERIFY)); + } +} + +void bench_context_sign(void* arg) { + int i; + (void)arg; + for (i = 0; i < 200; i++) { + secp256k1_context_destroy(secp256k1_context_create(SECP256K1_CONTEXT_SIGN)); + } +} + +#ifndef USE_NUM_NONE +void bench_num_jacobi(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + secp256k1_num nx, norder; + + secp256k1_scalar_get_num(&nx, &data->scalar_x); + secp256k1_scalar_order_get_num(&norder); + secp256k1_scalar_get_num(&norder, &data->scalar_y); + + for (i = 0; i < 200000; i++) { + secp256k1_num_jacobi(&nx, &norder); + } +} +#endif int have_flag(int argc, char** argv, char *flag) { char** argm = argv + argc; @@ -278,7 +331,9 @@ int have_flag(int argc, char** argv, char *flag) { return 1; } while (argv != NULL && argv != argm) { - if (strcmp(*argv, flag) == 0) return 1; + if (strcmp(*argv, flag) == 0) { + return 1; + } argv++; } return 0; @@ -302,17 +357,26 @@ int main(int argc, char **argv) { if (have_flag(argc, argv, "field") || have_flag(argc, argv, "mul")) run_benchmark("field_mul", bench_field_mul, bench_setup, NULL, &data, 10, 200000); if (have_flag(argc, argv, "field") || have_flag(argc, argv, "inverse")) run_benchmark("field_inverse", bench_field_inverse, bench_setup, NULL, &data, 10, 20000); if (have_flag(argc, argv, "field") || have_flag(argc, argv, "inverse")) run_benchmark("field_inverse_var", bench_field_inverse_var, bench_setup, NULL, &data, 10, 20000); - if (have_flag(argc, argv, "field") || have_flag(argc, argv, "sqrt")) run_benchmark("field_sqrt_var", bench_field_sqrt_var, bench_setup, NULL, &data, 10, 20000); + if (have_flag(argc, argv, "field") || have_flag(argc, argv, "sqrt")) run_benchmark("field_sqrt", bench_field_sqrt, bench_setup, NULL, &data, 10, 20000); if (have_flag(argc, argv, "group") || have_flag(argc, argv, "double")) run_benchmark("group_double_var", bench_group_double_var, bench_setup, NULL, &data, 10, 200000); if (have_flag(argc, argv, "group") || have_flag(argc, argv, "add")) run_benchmark("group_add_var", bench_group_add_var, bench_setup, NULL, &data, 10, 200000); if (have_flag(argc, argv, "group") || have_flag(argc, argv, "add")) run_benchmark("group_add_affine", bench_group_add_affine, bench_setup, NULL, &data, 10, 200000); if (have_flag(argc, argv, "group") || have_flag(argc, argv, "add")) run_benchmark("group_add_affine_var", bench_group_add_affine_var, bench_setup, NULL, &data, 10, 200000); + if (have_flag(argc, argv, "group") || have_flag(argc, argv, "jacobi")) run_benchmark("group_jacobi_var", bench_group_jacobi_var, bench_setup, NULL, &data, 10, 20000); + if (have_flag(argc, argv, "ecmult") || have_flag(argc, argv, "wnaf")) run_benchmark("wnaf_const", bench_wnaf_const, bench_setup, NULL, &data, 10, 20000); if (have_flag(argc, argv, "ecmult") || have_flag(argc, argv, "wnaf")) run_benchmark("ecmult_wnaf", bench_ecmult_wnaf, bench_setup, NULL, &data, 10, 20000); if (have_flag(argc, argv, "hash") || have_flag(argc, argv, "sha256")) run_benchmark("hash_sha256", bench_sha256, bench_setup, NULL, &data, 10, 20000); if (have_flag(argc, argv, "hash") || have_flag(argc, argv, "hmac")) run_benchmark("hash_hmac_sha256", bench_hmac_sha256, bench_setup, NULL, &data, 10, 20000); if (have_flag(argc, argv, "hash") || have_flag(argc, argv, "rng6979")) run_benchmark("hash_rfc6979_hmac_sha256", bench_rfc6979_hmac_sha256, bench_setup, NULL, &data, 10, 20000); + + if (have_flag(argc, argv, "context") || have_flag(argc, argv, "verify")) run_benchmark("context_verify", bench_context_verify, bench_setup, NULL, &data, 10, 20); + if (have_flag(argc, argv, "context") || have_flag(argc, argv, "sign")) run_benchmark("context_sign", bench_context_sign, bench_setup, NULL, &data, 10, 200); + +#ifndef USE_NUM_NONE + if (have_flag(argc, argv, "num") || have_flag(argc, argv, "jacobi")) run_benchmark("num_jacobi", bench_num_jacobi, bench_setup, NULL, &data, 10, 200000); +#endif return 0; } diff --git a/src/bench_recover.c b/src/bench_recover.c index 56faed11a..6489378cc 100644 --- a/src/bench_recover.c +++ b/src/bench_recover.c @@ -1,15 +1,16 @@ /********************************************************************** - * Copyright (c) 2014 Pieter Wuille * + * Copyright (c) 2014-2015 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #include "include/secp256k1.h" +#include "include/secp256k1_recovery.h" #include "util.h" #include "bench.h" typedef struct { - secp256k1_context_t *ctx; + secp256k1_context *ctx; unsigned char msg[32]; unsigned char sig[64]; } bench_recover_t; @@ -17,16 +18,20 @@ typedef struct { void bench_recover(void* arg) { int i; bench_recover_t *data = (bench_recover_t*)arg; - unsigned char pubkey[33]; + secp256k1_pubkey pubkey; + unsigned char pubkeyc[33]; for (i = 0; i < 20000; i++) { int j; - int pubkeylen = 33; - CHECK(secp256k1_ecdsa_recover_compact(data->ctx, data->msg, data->sig, pubkey, &pubkeylen, 1, i % 2)); + size_t pubkeylen = 33; + secp256k1_ecdsa_recoverable_signature sig; + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(data->ctx, &sig, data->sig, i % 2)); + CHECK(secp256k1_ecdsa_recover(data->ctx, &pubkey, &sig, data->msg)); + CHECK(secp256k1_ec_pubkey_serialize(data->ctx, pubkeyc, &pubkeylen, &pubkey, SECP256K1_EC_COMPRESSED)); for (j = 0; j < 32; j++) { data->sig[j + 32] = data->msg[j]; /* Move former message to S. */ data->msg[j] = data->sig[j]; /* Move former R to message. */ - data->sig[j] = pubkey[j + 1]; /* Move recovered pubkey X coordinate to R (which must be a valid X coordinate). */ + data->sig[j] = pubkeyc[j + 1]; /* Move recovered pubkey X coordinate to R (which must be a valid X coordinate). */ } } } @@ -35,8 +40,12 @@ void bench_recover_setup(void* arg) { int i; bench_recover_t *data = (bench_recover_t*)arg; - for (i = 0; i < 32; i++) data->msg[i] = 1 + i; - for (i = 0; i < 64; i++) data->sig[i] = 65 + i; + for (i = 0; i < 32; i++) { + data->msg[i] = 1 + i; + } + for (i = 0; i < 64; i++) { + data->sig[i] = 65 + i; + } } int main(void) { diff --git a/src/bench_sign.c b/src/bench_sign.c index 072a37af5..ed7224d75 100644 --- a/src/bench_sign.c +++ b/src/bench_sign.c @@ -9,7 +9,7 @@ #include "bench.h" typedef struct { - secp256k1_context_t* ctx; + secp256k1_context* ctx; unsigned char msg[32]; unsigned char key[32]; } bench_sign_t; @@ -18,22 +18,28 @@ static void bench_sign_setup(void* arg) { int i; bench_sign_t *data = (bench_sign_t*)arg; - for (i = 0; i < 32; i++) data->msg[i] = i + 1; - for (i = 0; i < 32; i++) data->key[i] = i + 65; + for (i = 0; i < 32; i++) { + data->msg[i] = i + 1; + } + for (i = 0; i < 32; i++) { + data->key[i] = i + 65; + } } static void bench_sign(void* arg) { int i; bench_sign_t *data = (bench_sign_t*)arg; - unsigned char sig[64]; + unsigned char sig[74]; for (i = 0; i < 20000; i++) { + size_t siglen = 74; int j; - int recid = 0; - CHECK(secp256k1_ecdsa_sign_compact(data->ctx, data->msg, sig, data->key, NULL, NULL, &recid)); + secp256k1_ecdsa_signature signature; + CHECK(secp256k1_ecdsa_sign(data->ctx, &signature, data->msg, data->key, NULL, NULL)); + CHECK(secp256k1_ecdsa_signature_serialize_der(data->ctx, sig, &siglen, &signature)); for (j = 0; j < 32; j++) { - data->msg[j] = sig[j]; /* Move former R to message. */ - data->key[j] = sig[j + 32]; /* Move former S to key. */ + data->msg[j] = sig[j]; + data->key[j] = sig[j + 32]; } } } diff --git a/src/bench_verify.c b/src/bench_verify.c index c8c82752c..418defa0a 100644 --- a/src/bench_verify.c +++ b/src/bench_verify.c @@ -11,14 +11,23 @@ #include "util.h" #include "bench.h" +#ifdef ENABLE_OPENSSL_TESTS +#include +#include +#include +#endif + typedef struct { - secp256k1_context_t *ctx; + secp256k1_context *ctx; unsigned char msg[32]; unsigned char key[32]; unsigned char sig[72]; - int siglen; + size_t siglen; unsigned char pubkey[33]; - int pubkeylen; + size_t pubkeylen; +#ifdef ENABLE_OPENSSL_TESTS + EC_GROUP* ec_group; +#endif } benchmark_verify_t; static void benchmark_verify(void* arg) { @@ -26,30 +35,77 @@ static void benchmark_verify(void* arg) { benchmark_verify_t* data = (benchmark_verify_t*)arg; for (i = 0; i < 20000; i++) { + secp256k1_pubkey pubkey; + secp256k1_ecdsa_signature sig; data->sig[data->siglen - 1] ^= (i & 0xFF); data->sig[data->siglen - 2] ^= ((i >> 8) & 0xFF); data->sig[data->siglen - 3] ^= ((i >> 16) & 0xFF); - CHECK(secp256k1_ecdsa_verify(data->ctx, data->msg, data->sig, data->siglen, data->pubkey, data->pubkeylen) == (i == 0)); + CHECK(secp256k1_ec_pubkey_parse(data->ctx, &pubkey, data->pubkey, data->pubkeylen) == 1); + CHECK(secp256k1_ecdsa_signature_parse_der(data->ctx, &sig, data->sig, data->siglen) == 1); + CHECK(secp256k1_ecdsa_verify(data->ctx, &sig, data->msg, &pubkey) == (i == 0)); data->sig[data->siglen - 1] ^= (i & 0xFF); data->sig[data->siglen - 2] ^= ((i >> 8) & 0xFF); data->sig[data->siglen - 3] ^= ((i >> 16) & 0xFF); } } +#ifdef ENABLE_OPENSSL_TESTS +static void benchmark_verify_openssl(void* arg) { + int i; + benchmark_verify_t* data = (benchmark_verify_t*)arg; + + for (i = 0; i < 20000; i++) { + data->sig[data->siglen - 1] ^= (i & 0xFF); + data->sig[data->siglen - 2] ^= ((i >> 8) & 0xFF); + data->sig[data->siglen - 3] ^= ((i >> 16) & 0xFF); + { + EC_KEY *pkey = EC_KEY_new(); + const unsigned char *pubkey = &data->pubkey[0]; + int result; + + CHECK(pkey != NULL); + result = EC_KEY_set_group(pkey, data->ec_group); + CHECK(result); + result = (o2i_ECPublicKey(&pkey, &pubkey, data->pubkeylen)) != NULL; + CHECK(result); + result = ECDSA_verify(0, &data->msg[0], sizeof(data->msg), &data->sig[0], data->siglen, pkey) == (i == 0); + CHECK(result); + EC_KEY_free(pkey); + } + data->sig[data->siglen - 1] ^= (i & 0xFF); + data->sig[data->siglen - 2] ^= ((i >> 8) & 0xFF); + data->sig[data->siglen - 3] ^= ((i >> 16) & 0xFF); + } +} +#endif + int main(void) { int i; + secp256k1_pubkey pubkey; + secp256k1_ecdsa_signature sig; benchmark_verify_t data; data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); - for (i = 0; i < 32; i++) data.msg[i] = 1 + i; - for (i = 0; i < 32; i++) data.key[i] = 33 + i; + for (i = 0; i < 32; i++) { + data.msg[i] = 1 + i; + } + for (i = 0; i < 32; i++) { + data.key[i] = 33 + i; + } data.siglen = 72; - secp256k1_ecdsa_sign(data.ctx, data.msg, data.sig, &data.siglen, data.key, NULL, NULL); + CHECK(secp256k1_ecdsa_sign(data.ctx, &sig, data.msg, data.key, NULL, NULL)); + CHECK(secp256k1_ecdsa_signature_serialize_der(data.ctx, data.sig, &data.siglen, &sig)); + CHECK(secp256k1_ec_pubkey_create(data.ctx, &pubkey, data.key)); data.pubkeylen = 33; - CHECK(secp256k1_ec_pubkey_create(data.ctx, data.pubkey, &data.pubkeylen, data.key, 1)); + CHECK(secp256k1_ec_pubkey_serialize(data.ctx, data.pubkey, &data.pubkeylen, &pubkey, SECP256K1_EC_COMPRESSED) == 1); run_benchmark("ecdsa_verify", benchmark_verify, NULL, NULL, &data, 10, 20000); +#ifdef ENABLE_OPENSSL_TESTS + data.ec_group = EC_GROUP_new_by_curve_name(NID_secp256k1); + run_benchmark("ecdsa_verify_openssl", benchmark_verify_openssl, NULL, NULL, &data, 10, 20000); + EC_GROUP_free(data.ec_group); +#endif secp256k1_context_destroy(data.ctx); return 0; diff --git a/src/ecdsa.h b/src/ecdsa.h index 4ef78e8af..54ae101b9 100644 --- a/src/ecdsa.h +++ b/src/ecdsa.h @@ -7,18 +7,15 @@ #ifndef _SECP256K1_ECDSA_ #define _SECP256K1_ECDSA_ +#include + #include "scalar.h" #include "group.h" #include "ecmult.h" -typedef struct { - secp256k1_scalar_t r, s; -} secp256k1_ecdsa_sig_t; - -static int secp256k1_ecdsa_sig_parse(secp256k1_ecdsa_sig_t *r, const unsigned char *sig, int size); -static int secp256k1_ecdsa_sig_serialize(unsigned char *sig, int *size, const secp256k1_ecdsa_sig_t *a); -static int secp256k1_ecdsa_sig_verify(const secp256k1_ecmult_context_t *ctx, const secp256k1_ecdsa_sig_t *sig, const secp256k1_ge_t *pubkey, const secp256k1_scalar_t *message); -static int secp256k1_ecdsa_sig_sign(const secp256k1_ecmult_gen_context_t *ctx, secp256k1_ecdsa_sig_t *sig, const secp256k1_scalar_t *seckey, const secp256k1_scalar_t *message, const secp256k1_scalar_t *nonce, int *recid); -static int secp256k1_ecdsa_sig_recover(const secp256k1_ecmult_context_t *ctx, const secp256k1_ecdsa_sig_t *sig, secp256k1_ge_t *pubkey, const secp256k1_scalar_t *message, int recid); +static int secp256k1_ecdsa_sig_parse(secp256k1_scalar *r, secp256k1_scalar *s, const unsigned char *sig, size_t size); +static int secp256k1_ecdsa_sig_serialize(unsigned char *sig, size_t *size, const secp256k1_scalar *r, const secp256k1_scalar *s); +static int secp256k1_ecdsa_sig_verify(const secp256k1_ecmult_context *ctx, const secp256k1_scalar* r, const secp256k1_scalar* s, const secp256k1_ge *pubkey, const secp256k1_scalar *message); +static int secp256k1_ecdsa_sig_sign(const secp256k1_ecmult_gen_context *ctx, secp256k1_scalar* r, secp256k1_scalar* s, const secp256k1_scalar *seckey, const secp256k1_scalar *message, const secp256k1_scalar *nonce, int *recid); #endif diff --git a/src/ecdsa_impl.h b/src/ecdsa_impl.h index ed1d22818..453bb1188 100644 --- a/src/ecdsa_impl.h +++ b/src/ecdsa_impl.h @@ -1,5 +1,5 @@ /********************************************************************** - * Copyright (c) 2013, 2014 Pieter Wuille * + * Copyright (c) 2013-2015 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ @@ -28,7 +28,7 @@ * sage: '%x' % (EllipticCurve ([F (a), F (b)]).order()) * 'fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141' */ -static const secp256k1_fe_t secp256k1_ecdsa_const_order_as_fe = SECP256K1_FE_CONST( +static const secp256k1_fe secp256k1_ecdsa_const_order_as_fe = SECP256K1_FE_CONST( 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFEUL, 0xBAAEDCE6UL, 0xAF48A03BUL, 0xBFD25E8CUL, 0xD0364141UL ); @@ -42,82 +42,150 @@ static const secp256k1_fe_t secp256k1_ecdsa_const_order_as_fe = SECP256K1_FE_CON * sage: '%x' % (p - EllipticCurve ([F (a), F (b)]).order()) * '14551231950b75fc4402da1722fc9baee' */ -static const secp256k1_fe_t secp256k1_ecdsa_const_p_minus_order = SECP256K1_FE_CONST( +static const secp256k1_fe secp256k1_ecdsa_const_p_minus_order = SECP256K1_FE_CONST( 0, 0, 0, 1, 0x45512319UL, 0x50B75FC4UL, 0x402DA172UL, 0x2FC9BAEEUL ); -static int secp256k1_ecdsa_sig_parse(secp256k1_ecdsa_sig_t *r, const unsigned char *sig, int size) { - unsigned char ra[32] = {0}, sa[32] = {0}; - const unsigned char *rp; - const unsigned char *sp; - int lenr; - int lens; - int overflow; - if (sig[0] != 0x30) { +static int secp256k1_der_read_len(const unsigned char **sigp, const unsigned char *sigend) { + int lenleft, b1; + size_t ret = 0; + if (*sigp >= sigend) { + return -1; + } + b1 = *((*sigp)++); + if (b1 == 0xFF) { + /* X.690-0207 8.1.3.5.c the value 0xFF shall not be used. */ + return -1; + } + if ((b1 & 0x80) == 0) { + /* X.690-0207 8.1.3.4 short form length octets */ + return b1; + } + if (b1 == 0x80) { + /* Indefinite length is not allowed in DER. */ + return -1; + } + /* X.690-207 8.1.3.5 long form length octets */ + lenleft = b1 & 0x7F; + if (lenleft > sigend - *sigp) { + return -1; + } + if (**sigp == 0) { + /* Not the shortest possible length encoding. */ + return -1; + } + if ((size_t)lenleft > sizeof(size_t)) { + /* The resulting length would exceed the range of a size_t, so + * certainly longer than the passed array size. + */ + return -1; + } + while (lenleft > 0) { + if ((ret >> ((sizeof(size_t) - 1) * 8)) != 0) { + } + ret = (ret << 8) | **sigp; + if (ret + lenleft > (size_t)(sigend - *sigp)) { + /* Result exceeds the length of the passed array. */ + return -1; + } + (*sigp)++; + lenleft--; + } + if (ret < 128) { + /* Not the shortest possible length encoding. */ + return -1; + } + return ret; +} + +static int secp256k1_der_parse_integer(secp256k1_scalar *r, const unsigned char **sig, const unsigned char *sigend) { + int overflow = 0; + unsigned char ra[32] = {0}; + int rlen; + + if (*sig == sigend || **sig != 0x02) { + /* Not a primitive integer (X.690-0207 8.3.1). */ return 0; } - lenr = sig[3]; - if (5+lenr >= size) { + (*sig)++; + rlen = secp256k1_der_read_len(sig, sigend); + if (rlen <= 0 || (*sig) + rlen > sigend) { + /* Exceeds bounds or not at least length 1 (X.690-0207 8.3.1). */ return 0; } - lens = sig[lenr+5]; - if (sig[1] != lenr+lens+4) { + if (**sig == 0x00 && rlen > 1 && (((*sig)[1]) & 0x80) == 0x00) { + /* Excessive 0x00 padding. */ return 0; } - if (lenr+lens+6 > size) { + if (**sig == 0xFF && rlen > 1 && (((*sig)[1]) & 0x80) == 0x80) { + /* Excessive 0xFF padding. */ return 0; } - if (sig[2] != 0x02) { - return 0; + if ((**sig & 0x80) == 0x80) { + /* Negative. */ + overflow = 1; } - if (lenr == 0) { - return 0; + while (rlen > 0 && **sig == 0) { + /* Skip leading zero bytes */ + rlen--; + (*sig)++; } - if (sig[lenr+4] != 0x02) { - return 0; + if (rlen > 32) { + overflow = 1; } - if (lens == 0) { - return 0; + if (!overflow) { + memcpy(ra + 32 - rlen, *sig, rlen); + secp256k1_scalar_set_b32(r, ra, &overflow); } - sp = sig + 6 + lenr; - while (lens > 0 && sp[0] == 0) { - lens--; - sp++; - } - if (lens > 32) { - return 0; - } - rp = sig + 4; - while (lenr > 0 && rp[0] == 0) { - lenr--; - rp++; - } - if (lenr > 32) { - return 0; - } - memcpy(ra + 32 - lenr, rp, lenr); - memcpy(sa + 32 - lens, sp, lens); - overflow = 0; - secp256k1_scalar_set_b32(&r->r, ra, &overflow); if (overflow) { - return 0; - } - secp256k1_scalar_set_b32(&r->s, sa, &overflow); - if (overflow) { - return 0; + secp256k1_scalar_set_int(r, 0); } + (*sig) += rlen; return 1; } -static int secp256k1_ecdsa_sig_serialize(unsigned char *sig, int *size, const secp256k1_ecdsa_sig_t *a) { +static int secp256k1_ecdsa_sig_parse(secp256k1_scalar *rr, secp256k1_scalar *rs, const unsigned char *sig, size_t size) { + const unsigned char *sigend = sig + size; + int rlen; + if (sig == sigend || *(sig++) != 0x30) { + /* The encoding doesn't start with a constructed sequence (X.690-0207 8.9.1). */ + return 0; + } + rlen = secp256k1_der_read_len(&sig, sigend); + if (rlen < 0 || sig + rlen > sigend) { + /* Tuple exceeds bounds */ + return 0; + } + if (sig + rlen != sigend) { + /* Garbage after tuple. */ + return 0; + } + + if (!secp256k1_der_parse_integer(rr, &sig, sigend)) { + return 0; + } + if (!secp256k1_der_parse_integer(rs, &sig, sigend)) { + return 0; + } + + if (sig != sigend) { + /* Trailing garbage inside tuple. */ + return 0; + } + + return 1; +} + +static int secp256k1_ecdsa_sig_serialize(unsigned char *sig, size_t *size, const secp256k1_scalar* ar, const secp256k1_scalar* as) { unsigned char r[33] = {0}, s[33] = {0}; unsigned char *rp = r, *sp = s; - int lenR = 33, lenS = 33; - secp256k1_scalar_get_b32(&r[1], &a->r); - secp256k1_scalar_get_b32(&s[1], &a->s); + size_t lenR = 33, lenS = 33; + secp256k1_scalar_get_b32(&r[1], ar); + secp256k1_scalar_get_b32(&s[1], as); while (lenR > 1 && rp[0] == 0 && rp[1] < 0x80) { lenR--; rp++; } while (lenS > 1 && sp[0] == 0 && sp[1] < 0x80) { lenS--; sp++; } if (*size < 6+lenS+lenR) { + *size = 6 + lenS + lenR; return 0; } *size = 6 + lenS + lenR; @@ -132,26 +200,41 @@ static int secp256k1_ecdsa_sig_serialize(unsigned char *sig, int *size, const se return 1; } -static int secp256k1_ecdsa_sig_verify(const secp256k1_ecmult_context_t *ctx, const secp256k1_ecdsa_sig_t *sig, const secp256k1_ge_t *pubkey, const secp256k1_scalar_t *message) { +static int secp256k1_ecdsa_sig_verify(const secp256k1_ecmult_context *ctx, const secp256k1_scalar *sigr, const secp256k1_scalar *sigs, const secp256k1_ge *pubkey, const secp256k1_scalar *message) { unsigned char c[32]; - secp256k1_scalar_t sn, u1, u2; - secp256k1_fe_t xr; - secp256k1_gej_t pubkeyj; - secp256k1_gej_t pr; + secp256k1_scalar sn, u1, u2; +#if !defined(EXHAUSTIVE_TEST_ORDER) + secp256k1_fe xr; +#endif + secp256k1_gej pubkeyj; + secp256k1_gej pr; - if (secp256k1_scalar_is_zero(&sig->r) || secp256k1_scalar_is_zero(&sig->s)) { + if (secp256k1_scalar_is_zero(sigr) || secp256k1_scalar_is_zero(sigs)) { return 0; } - secp256k1_scalar_inverse_var(&sn, &sig->s); + secp256k1_scalar_inverse_var(&sn, sigs); secp256k1_scalar_mul(&u1, &sn, message); - secp256k1_scalar_mul(&u2, &sn, &sig->r); + secp256k1_scalar_mul(&u2, &sn, sigr); secp256k1_gej_set_ge(&pubkeyj, pubkey); secp256k1_ecmult(ctx, &pr, &pubkeyj, &u2, &u1); if (secp256k1_gej_is_infinity(&pr)) { return 0; } - secp256k1_scalar_get_b32(c, &sig->r); + +#if defined(EXHAUSTIVE_TEST_ORDER) +{ + secp256k1_scalar computed_r; + secp256k1_ge pr_ge; + secp256k1_ge_set_gej(&pr_ge, &pr); + secp256k1_fe_normalize(&pr_ge.x); + + secp256k1_fe_get_b32(c, &pr_ge.x); + secp256k1_scalar_set_b32(&computed_r, c, NULL); + return secp256k1_scalar_eq(sigr, &computed_r); +} +#else + secp256k1_scalar_get_b32(c, sigr); secp256k1_fe_set_b32(&xr, c); /** We now have the recomputed R point in pr, and its claimed x coordinate (modulo n) @@ -171,11 +254,11 @@ static int secp256k1_ecdsa_sig_verify(const secp256k1_ecmult_context_t *ctx, con * secp256k1_gej_eq_x implements the (xr * pr.z^2 mod p == pr.x) test. */ if (secp256k1_gej_eq_x_var(&xr, &pr)) { - /* xr.x == xr * xr.z^2 mod p, so the signature is valid. */ + /* xr * pr.z^2 mod p == pr.x, so the signature is valid. */ return 1; } if (secp256k1_fe_cmp_var(&xr, &secp256k1_ecdsa_const_p_minus_order) >= 0) { - /* xr + p >= n, so we can skip testing the second case. */ + /* xr + n >= p, so we can skip testing the second case. */ return 0; } secp256k1_fe_add(&xr, &secp256k1_ecdsa_const_order_as_fe); @@ -184,46 +267,14 @@ static int secp256k1_ecdsa_sig_verify(const secp256k1_ecmult_context_t *ctx, con return 1; } return 0; +#endif } -static int secp256k1_ecdsa_sig_recover(const secp256k1_ecmult_context_t *ctx, const secp256k1_ecdsa_sig_t *sig, secp256k1_ge_t *pubkey, const secp256k1_scalar_t *message, int recid) { - unsigned char brx[32]; - secp256k1_fe_t fx; - secp256k1_ge_t x; - secp256k1_gej_t xj; - secp256k1_scalar_t rn, u1, u2; - secp256k1_gej_t qj; - - if (secp256k1_scalar_is_zero(&sig->r) || secp256k1_scalar_is_zero(&sig->s)) { - return 0; - } - - secp256k1_scalar_get_b32(brx, &sig->r); - VERIFY_CHECK(secp256k1_fe_set_b32(&fx, brx)); /* brx comes from a scalar, so is less than the order; certainly less than p */ - if (recid & 2) { - if (secp256k1_fe_cmp_var(&fx, &secp256k1_ecdsa_const_p_minus_order) >= 0) { - return 0; - } - secp256k1_fe_add(&fx, &secp256k1_ecdsa_const_order_as_fe); - } - if (!secp256k1_ge_set_xo_var(&x, &fx, recid & 1)) { - return 0; - } - secp256k1_gej_set_ge(&xj, &x); - secp256k1_scalar_inverse_var(&rn, &sig->r); - secp256k1_scalar_mul(&u1, &rn, message); - secp256k1_scalar_negate(&u1, &u1); - secp256k1_scalar_mul(&u2, &rn, &sig->s); - secp256k1_ecmult(ctx, &qj, &xj, &u2, &u1); - secp256k1_ge_set_gej_var(pubkey, &qj); - return !secp256k1_gej_is_infinity(&qj); -} - -static int secp256k1_ecdsa_sig_sign(const secp256k1_ecmult_gen_context_t *ctx, secp256k1_ecdsa_sig_t *sig, const secp256k1_scalar_t *seckey, const secp256k1_scalar_t *message, const secp256k1_scalar_t *nonce, int *recid) { +static int secp256k1_ecdsa_sig_sign(const secp256k1_ecmult_gen_context *ctx, secp256k1_scalar *sigr, secp256k1_scalar *sigs, const secp256k1_scalar *seckey, const secp256k1_scalar *message, const secp256k1_scalar *nonce, int *recid) { unsigned char b[32]; - secp256k1_gej_t rp; - secp256k1_ge_t r; - secp256k1_scalar_t n; + secp256k1_gej rp; + secp256k1_ge r; + secp256k1_scalar n; int overflow = 0; secp256k1_ecmult_gen(ctx, &rp, nonce); @@ -231,28 +282,29 @@ static int secp256k1_ecdsa_sig_sign(const secp256k1_ecmult_gen_context_t *ctx, s secp256k1_fe_normalize(&r.x); secp256k1_fe_normalize(&r.y); secp256k1_fe_get_b32(b, &r.x); - secp256k1_scalar_set_b32(&sig->r, b, &overflow); - if (secp256k1_scalar_is_zero(&sig->r)) { - /* P.x = order is on the curve, so technically sig->r could end up zero, which would be an invalid signature. */ - secp256k1_gej_clear(&rp); - secp256k1_ge_clear(&r); - return 0; - } + secp256k1_scalar_set_b32(sigr, b, &overflow); + /* These two conditions should be checked before calling */ + VERIFY_CHECK(!secp256k1_scalar_is_zero(sigr)); + VERIFY_CHECK(overflow == 0); + if (recid) { + /* The overflow condition is cryptographically unreachable as hitting it requires finding the discrete log + * of some P where P.x >= order, and only 1 in about 2^127 points meet this criteria. + */ *recid = (overflow ? 2 : 0) | (secp256k1_fe_is_odd(&r.y) ? 1 : 0); } - secp256k1_scalar_mul(&n, &sig->r, seckey); + secp256k1_scalar_mul(&n, sigr, seckey); secp256k1_scalar_add(&n, &n, message); - secp256k1_scalar_inverse(&sig->s, nonce); - secp256k1_scalar_mul(&sig->s, &sig->s, &n); + secp256k1_scalar_inverse(sigs, nonce); + secp256k1_scalar_mul(sigs, sigs, &n); secp256k1_scalar_clear(&n); secp256k1_gej_clear(&rp); secp256k1_ge_clear(&r); - if (secp256k1_scalar_is_zero(&sig->s)) { + if (secp256k1_scalar_is_zero(sigs)) { return 0; } - if (secp256k1_scalar_is_high(&sig->s)) { - secp256k1_scalar_negate(&sig->s, &sig->s); + if (secp256k1_scalar_is_high(sigs)) { + secp256k1_scalar_negate(sigs, sigs); if (recid) { *recid ^= 1; } diff --git a/src/eckey.h b/src/eckey.h index 53b818485..42739a3be 100644 --- a/src/eckey.h +++ b/src/eckey.h @@ -7,20 +7,19 @@ #ifndef _SECP256K1_ECKEY_ #define _SECP256K1_ECKEY_ +#include + #include "group.h" #include "scalar.h" #include "ecmult.h" #include "ecmult_gen.h" -static int secp256k1_eckey_pubkey_parse(secp256k1_ge_t *elem, const unsigned char *pub, int size); -static int secp256k1_eckey_pubkey_serialize(secp256k1_ge_t *elem, unsigned char *pub, int *size, int compressed); +static int secp256k1_eckey_pubkey_parse(secp256k1_ge *elem, const unsigned char *pub, size_t size); +static int secp256k1_eckey_pubkey_serialize(secp256k1_ge *elem, unsigned char *pub, size_t *size, int compressed); -static int secp256k1_eckey_privkey_parse(secp256k1_scalar_t *key, const unsigned char *privkey, int privkeylen); -static int secp256k1_eckey_privkey_serialize(const secp256k1_ecmult_gen_context_t *ctx, unsigned char *privkey, int *privkeylen, const secp256k1_scalar_t *key, int compressed); - -static int secp256k1_eckey_privkey_tweak_add(secp256k1_scalar_t *key, const secp256k1_scalar_t *tweak); -static int secp256k1_eckey_pubkey_tweak_add(const secp256k1_ecmult_context_t *ctx, secp256k1_ge_t *key, const secp256k1_scalar_t *tweak); -static int secp256k1_eckey_privkey_tweak_mul(secp256k1_scalar_t *key, const secp256k1_scalar_t *tweak); -static int secp256k1_eckey_pubkey_tweak_mul(const secp256k1_ecmult_context_t *ctx, secp256k1_ge_t *key, const secp256k1_scalar_t *tweak); +static int secp256k1_eckey_privkey_tweak_add(secp256k1_scalar *key, const secp256k1_scalar *tweak); +static int secp256k1_eckey_pubkey_tweak_add(const secp256k1_ecmult_context *ctx, secp256k1_ge *key, const secp256k1_scalar *tweak); +static int secp256k1_eckey_privkey_tweak_mul(secp256k1_scalar *key, const secp256k1_scalar *tweak); +static int secp256k1_eckey_pubkey_tweak_mul(const secp256k1_ecmult_context *ctx, secp256k1_ge *key, const secp256k1_scalar *tweak); #endif diff --git a/src/eckey_impl.h b/src/eckey_impl.h index a332bd34e..ce38071ac 100644 --- a/src/eckey_impl.h +++ b/src/eckey_impl.h @@ -14,12 +14,12 @@ #include "group.h" #include "ecmult_gen.h" -static int secp256k1_eckey_pubkey_parse(secp256k1_ge_t *elem, const unsigned char *pub, int size) { +static int secp256k1_eckey_pubkey_parse(secp256k1_ge *elem, const unsigned char *pub, size_t size) { if (size == 33 && (pub[0] == 0x02 || pub[0] == 0x03)) { - secp256k1_fe_t x; + secp256k1_fe x; return secp256k1_fe_set_b32(&x, pub+1) && secp256k1_ge_set_xo_var(elem, &x, pub[0] == 0x03); } else if (size == 65 && (pub[0] == 0x04 || pub[0] == 0x06 || pub[0] == 0x07)) { - secp256k1_fe_t x, y; + secp256k1_fe x, y; if (!secp256k1_fe_set_b32(&x, pub+1) || !secp256k1_fe_set_b32(&y, pub+33)) { return 0; } @@ -33,7 +33,7 @@ static int secp256k1_eckey_pubkey_parse(secp256k1_ge_t *elem, const unsigned cha } } -static int secp256k1_eckey_pubkey_serialize(secp256k1_ge_t *elem, unsigned char *pub, int *size, int compressed) { +static int secp256k1_eckey_pubkey_serialize(secp256k1_ge *elem, unsigned char *pub, size_t *size, int compressed) { if (secp256k1_ge_is_infinity(elem)) { return 0; } @@ -51,110 +51,7 @@ static int secp256k1_eckey_pubkey_serialize(secp256k1_ge_t *elem, unsigned char return 1; } -static int secp256k1_eckey_privkey_parse(secp256k1_scalar_t *key, const unsigned char *privkey, int privkeylen) { - unsigned char c[32] = {0}; - const unsigned char *end = privkey + privkeylen; - int lenb = 0; - int len = 0; - int overflow = 0; - /* sequence header */ - if (end < privkey+1 || *privkey != 0x30) { - return 0; - } - privkey++; - /* sequence length constructor */ - if (end < privkey+1 || !(*privkey & 0x80)) { - return 0; - } - lenb = *privkey & ~0x80; privkey++; - if (lenb < 1 || lenb > 2) { - return 0; - } - if (end < privkey+lenb) { - return 0; - } - /* sequence length */ - len = privkey[lenb-1] | (lenb > 1 ? privkey[lenb-2] << 8 : 0); - privkey += lenb; - if (end < privkey+len) { - return 0; - } - /* sequence element 0: version number (=1) */ - if (end < privkey+3 || privkey[0] != 0x02 || privkey[1] != 0x01 || privkey[2] != 0x01) { - return 0; - } - privkey += 3; - /* sequence element 1: octet string, up to 32 bytes */ - if (end < privkey+2 || privkey[0] != 0x04 || privkey[1] > 0x20 || end < privkey+2+privkey[1]) { - return 0; - } - memcpy(c + 32 - privkey[1], privkey + 2, privkey[1]); - secp256k1_scalar_set_b32(key, c, &overflow); - memset(c, 0, 32); - return !overflow; -} - -static int secp256k1_eckey_privkey_serialize(const secp256k1_ecmult_gen_context_t *ctx, unsigned char *privkey, int *privkeylen, const secp256k1_scalar_t *key, int compressed) { - secp256k1_gej_t rp; - secp256k1_ge_t r; - int pubkeylen = 0; - secp256k1_ecmult_gen(ctx, &rp, key); - secp256k1_ge_set_gej(&r, &rp); - if (compressed) { - static const unsigned char begin[] = { - 0x30,0x81,0xD3,0x02,0x01,0x01,0x04,0x20 - }; - static const unsigned char middle[] = { - 0xA0,0x81,0x85,0x30,0x81,0x82,0x02,0x01,0x01,0x30,0x2C,0x06,0x07,0x2A,0x86,0x48, - 0xCE,0x3D,0x01,0x01,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F,0x30,0x06,0x04,0x01,0x00,0x04,0x01,0x07,0x04, - 0x21,0x02,0x79,0xBE,0x66,0x7E,0xF9,0xDC,0xBB,0xAC,0x55,0xA0,0x62,0x95,0xCE,0x87, - 0x0B,0x07,0x02,0x9B,0xFC,0xDB,0x2D,0xCE,0x28,0xD9,0x59,0xF2,0x81,0x5B,0x16,0xF8, - 0x17,0x98,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFE,0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,0xBF,0xD2,0x5E, - 0x8C,0xD0,0x36,0x41,0x41,0x02,0x01,0x01,0xA1,0x24,0x03,0x22,0x00 - }; - unsigned char *ptr = privkey; - memcpy(ptr, begin, sizeof(begin)); ptr += sizeof(begin); - secp256k1_scalar_get_b32(ptr, key); ptr += 32; - memcpy(ptr, middle, sizeof(middle)); ptr += sizeof(middle); - if (!secp256k1_eckey_pubkey_serialize(&r, ptr, &pubkeylen, 1)) { - return 0; - } - ptr += pubkeylen; - *privkeylen = ptr - privkey; - } else { - static const unsigned char begin[] = { - 0x30,0x82,0x01,0x13,0x02,0x01,0x01,0x04,0x20 - }; - static const unsigned char middle[] = { - 0xA0,0x81,0xA5,0x30,0x81,0xA2,0x02,0x01,0x01,0x30,0x2C,0x06,0x07,0x2A,0x86,0x48, - 0xCE,0x3D,0x01,0x01,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F,0x30,0x06,0x04,0x01,0x00,0x04,0x01,0x07,0x04, - 0x41,0x04,0x79,0xBE,0x66,0x7E,0xF9,0xDC,0xBB,0xAC,0x55,0xA0,0x62,0x95,0xCE,0x87, - 0x0B,0x07,0x02,0x9B,0xFC,0xDB,0x2D,0xCE,0x28,0xD9,0x59,0xF2,0x81,0x5B,0x16,0xF8, - 0x17,0x98,0x48,0x3A,0xDA,0x77,0x26,0xA3,0xC4,0x65,0x5D,0xA4,0xFB,0xFC,0x0E,0x11, - 0x08,0xA8,0xFD,0x17,0xB4,0x48,0xA6,0x85,0x54,0x19,0x9C,0x47,0xD0,0x8F,0xFB,0x10, - 0xD4,0xB8,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFE,0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,0xBF,0xD2,0x5E, - 0x8C,0xD0,0x36,0x41,0x41,0x02,0x01,0x01,0xA1,0x44,0x03,0x42,0x00 - }; - unsigned char *ptr = privkey; - memcpy(ptr, begin, sizeof(begin)); ptr += sizeof(begin); - secp256k1_scalar_get_b32(ptr, key); ptr += 32; - memcpy(ptr, middle, sizeof(middle)); ptr += sizeof(middle); - if (!secp256k1_eckey_pubkey_serialize(&r, ptr, &pubkeylen, 0)) { - return 0; - } - ptr += pubkeylen; - *privkeylen = ptr - privkey; - } - return 1; -} - -static int secp256k1_eckey_privkey_tweak_add(secp256k1_scalar_t *key, const secp256k1_scalar_t *tweak) { +static int secp256k1_eckey_privkey_tweak_add(secp256k1_scalar *key, const secp256k1_scalar *tweak) { secp256k1_scalar_add(key, key, tweak); if (secp256k1_scalar_is_zero(key)) { return 0; @@ -162,9 +59,9 @@ static int secp256k1_eckey_privkey_tweak_add(secp256k1_scalar_t *key, const secp return 1; } -static int secp256k1_eckey_pubkey_tweak_add(const secp256k1_ecmult_context_t *ctx, secp256k1_ge_t *key, const secp256k1_scalar_t *tweak) { - secp256k1_gej_t pt; - secp256k1_scalar_t one; +static int secp256k1_eckey_pubkey_tweak_add(const secp256k1_ecmult_context *ctx, secp256k1_ge *key, const secp256k1_scalar *tweak) { + secp256k1_gej pt; + secp256k1_scalar one; secp256k1_gej_set_ge(&pt, key); secp256k1_scalar_set_int(&one, 1); secp256k1_ecmult(ctx, &pt, &pt, &one, tweak); @@ -176,7 +73,7 @@ static int secp256k1_eckey_pubkey_tweak_add(const secp256k1_ecmult_context_t *ct return 1; } -static int secp256k1_eckey_privkey_tweak_mul(secp256k1_scalar_t *key, const secp256k1_scalar_t *tweak) { +static int secp256k1_eckey_privkey_tweak_mul(secp256k1_scalar *key, const secp256k1_scalar *tweak) { if (secp256k1_scalar_is_zero(tweak)) { return 0; } @@ -185,9 +82,9 @@ static int secp256k1_eckey_privkey_tweak_mul(secp256k1_scalar_t *key, const secp return 1; } -static int secp256k1_eckey_pubkey_tweak_mul(const secp256k1_ecmult_context_t *ctx, secp256k1_ge_t *key, const secp256k1_scalar_t *tweak) { - secp256k1_scalar_t zero; - secp256k1_gej_t pt; +static int secp256k1_eckey_pubkey_tweak_mul(const secp256k1_ecmult_context *ctx, secp256k1_ge *key, const secp256k1_scalar *tweak) { + secp256k1_scalar zero; + secp256k1_gej pt; if (secp256k1_scalar_is_zero(tweak)) { return 0; } diff --git a/src/ecmult.h b/src/ecmult.h index bab9e4ef5..20484134f 100644 --- a/src/ecmult.h +++ b/src/ecmult.h @@ -12,20 +12,20 @@ typedef struct { /* For accelerating the computation of a*P + b*G: */ - secp256k1_ge_storage_t (*pre_g)[]; /* odd multiples of the generator */ + secp256k1_ge_storage (*pre_g)[]; /* odd multiples of the generator */ #ifdef USE_ENDOMORPHISM - secp256k1_ge_storage_t (*pre_g_128)[]; /* odd multiples of 2^128*generator */ + secp256k1_ge_storage (*pre_g_128)[]; /* odd multiples of 2^128*generator */ #endif -} secp256k1_ecmult_context_t; +} secp256k1_ecmult_context; -static void secp256k1_ecmult_context_init(secp256k1_ecmult_context_t *ctx); -static void secp256k1_ecmult_context_build(secp256k1_ecmult_context_t *ctx); -static void secp256k1_ecmult_context_clone(secp256k1_ecmult_context_t *dst, - const secp256k1_ecmult_context_t *src); -static void secp256k1_ecmult_context_clear(secp256k1_ecmult_context_t *ctx); -static int secp256k1_ecmult_context_is_built(const secp256k1_ecmult_context_t *ctx); +static void secp256k1_ecmult_context_init(secp256k1_ecmult_context *ctx); +static void secp256k1_ecmult_context_build(secp256k1_ecmult_context *ctx, const secp256k1_callback *cb); +static void secp256k1_ecmult_context_clone(secp256k1_ecmult_context *dst, + const secp256k1_ecmult_context *src, const secp256k1_callback *cb); +static void secp256k1_ecmult_context_clear(secp256k1_ecmult_context *ctx); +static int secp256k1_ecmult_context_is_built(const secp256k1_ecmult_context *ctx); /** Double multiply: R = na*A + ng*G */ -static void secp256k1_ecmult(const secp256k1_ecmult_context_t *ctx, secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_scalar_t *na, const secp256k1_scalar_t *ng); +static void secp256k1_ecmult(const secp256k1_ecmult_context *ctx, secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_scalar *na, const secp256k1_scalar *ng); #endif diff --git a/src/ecmult_const.h b/src/ecmult_const.h new file mode 100644 index 000000000..2b0097655 --- /dev/null +++ b/src/ecmult_const.h @@ -0,0 +1,15 @@ +/********************************************************************** + * Copyright (c) 2015 Andrew Poelstra * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_ECMULT_CONST_ +#define _SECP256K1_ECMULT_CONST_ + +#include "scalar.h" +#include "group.h" + +static void secp256k1_ecmult_const(secp256k1_gej *r, const secp256k1_ge *a, const secp256k1_scalar *q); + +#endif diff --git a/src/ecmult_const_impl.h b/src/ecmult_const_impl.h new file mode 100644 index 000000000..0db314c48 --- /dev/null +++ b/src/ecmult_const_impl.h @@ -0,0 +1,239 @@ +/********************************************************************** + * Copyright (c) 2015 Pieter Wuille, Andrew Poelstra * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_ECMULT_CONST_IMPL_ +#define _SECP256K1_ECMULT_CONST_IMPL_ + +#include "scalar.h" +#include "group.h" +#include "ecmult_const.h" +#include "ecmult_impl.h" + +#ifdef USE_ENDOMORPHISM + #define WNAF_BITS 128 +#else + #define WNAF_BITS 256 +#endif +#define WNAF_SIZE(w) ((WNAF_BITS + (w) - 1) / (w)) + +/* This is like `ECMULT_TABLE_GET_GE` but is constant time */ +#define ECMULT_CONST_TABLE_GET_GE(r,pre,n,w) do { \ + int m; \ + int abs_n = (n) * (((n) > 0) * 2 - 1); \ + int idx_n = abs_n / 2; \ + secp256k1_fe neg_y; \ + VERIFY_CHECK(((n) & 1) == 1); \ + VERIFY_CHECK((n) >= -((1 << ((w)-1)) - 1)); \ + VERIFY_CHECK((n) <= ((1 << ((w)-1)) - 1)); \ + VERIFY_SETUP(secp256k1_fe_clear(&(r)->x)); \ + VERIFY_SETUP(secp256k1_fe_clear(&(r)->y)); \ + for (m = 0; m < ECMULT_TABLE_SIZE(w); m++) { \ + /* This loop is used to avoid secret data in array indices. See + * the comment in ecmult_gen_impl.h for rationale. */ \ + secp256k1_fe_cmov(&(r)->x, &(pre)[m].x, m == idx_n); \ + secp256k1_fe_cmov(&(r)->y, &(pre)[m].y, m == idx_n); \ + } \ + (r)->infinity = 0; \ + secp256k1_fe_negate(&neg_y, &(r)->y, 1); \ + secp256k1_fe_cmov(&(r)->y, &neg_y, (n) != abs_n); \ +} while(0) + + +/** Convert a number to WNAF notation. The number becomes represented by sum(2^{wi} * wnaf[i], i=0..return_val) + * with the following guarantees: + * - each wnaf[i] an odd integer between -(1 << w) and (1 << w) + * - each wnaf[i] is nonzero + * - the number of words set is returned; this is always (WNAF_BITS + w - 1) / w + * + * Adapted from `The Width-w NAF Method Provides Small Memory and Fast Elliptic Scalar + * Multiplications Secure against Side Channel Attacks`, Okeya and Tagaki. M. Joye (Ed.) + * CT-RSA 2003, LNCS 2612, pp. 328-443, 2003. Springer-Verlagy Berlin Heidelberg 2003 + * + * Numbers reference steps of `Algorithm SPA-resistant Width-w NAF with Odd Scalar` on pp. 335 + */ +static int secp256k1_wnaf_const(int *wnaf, secp256k1_scalar s, int w) { + int global_sign; + int skew = 0; + int word = 0; + + /* 1 2 3 */ + int u_last; + int u; + + int flip; + int bit; + secp256k1_scalar neg_s; + int not_neg_one; + /* Note that we cannot handle even numbers by negating them to be odd, as is + * done in other implementations, since if our scalars were specified to have + * width < 256 for performance reasons, their negations would have width 256 + * and we'd lose any performance benefit. Instead, we use a technique from + * Section 4.2 of the Okeya/Tagaki paper, which is to add either 1 (for even) + * or 2 (for odd) to the number we are encoding, returning a skew value indicating + * this, and having the caller compensate after doing the multiplication. */ + + /* Negative numbers will be negated to keep their bit representation below the maximum width */ + flip = secp256k1_scalar_is_high(&s); + /* We add 1 to even numbers, 2 to odd ones, noting that negation flips parity */ + bit = flip ^ !secp256k1_scalar_is_even(&s); + /* We check for negative one, since adding 2 to it will cause an overflow */ + secp256k1_scalar_negate(&neg_s, &s); + not_neg_one = !secp256k1_scalar_is_one(&neg_s); + secp256k1_scalar_cadd_bit(&s, bit, not_neg_one); + /* If we had negative one, flip == 1, s.d[0] == 0, bit == 1, so caller expects + * that we added two to it and flipped it. In fact for -1 these operations are + * identical. We only flipped, but since skewing is required (in the sense that + * the skew must be 1 or 2, never zero) and flipping is not, we need to change + * our flags to claim that we only skewed. */ + global_sign = secp256k1_scalar_cond_negate(&s, flip); + global_sign *= not_neg_one * 2 - 1; + skew = 1 << bit; + + /* 4 */ + u_last = secp256k1_scalar_shr_int(&s, w); + while (word * w < WNAF_BITS) { + int sign; + int even; + + /* 4.1 4.4 */ + u = secp256k1_scalar_shr_int(&s, w); + /* 4.2 */ + even = ((u & 1) == 0); + sign = 2 * (u_last > 0) - 1; + u += sign * even; + u_last -= sign * even * (1 << w); + + /* 4.3, adapted for global sign change */ + wnaf[word++] = u_last * global_sign; + + u_last = u; + } + wnaf[word] = u * global_sign; + + VERIFY_CHECK(secp256k1_scalar_is_zero(&s)); + VERIFY_CHECK(word == WNAF_SIZE(w)); + return skew; +} + + +static void secp256k1_ecmult_const(secp256k1_gej *r, const secp256k1_ge *a, const secp256k1_scalar *scalar) { + secp256k1_ge pre_a[ECMULT_TABLE_SIZE(WINDOW_A)]; + secp256k1_ge tmpa; + secp256k1_fe Z; + + int skew_1; + int wnaf_1[1 + WNAF_SIZE(WINDOW_A - 1)]; +#ifdef USE_ENDOMORPHISM + secp256k1_ge pre_a_lam[ECMULT_TABLE_SIZE(WINDOW_A)]; + int wnaf_lam[1 + WNAF_SIZE(WINDOW_A - 1)]; + int skew_lam; + secp256k1_scalar q_1, q_lam; +#endif + + int i; + secp256k1_scalar sc = *scalar; + + /* build wnaf representation for q. */ +#ifdef USE_ENDOMORPHISM + /* split q into q_1 and q_lam (where q = q_1 + q_lam*lambda, and q_1 and q_lam are ~128 bit) */ + secp256k1_scalar_split_lambda(&q_1, &q_lam, &sc); + skew_1 = secp256k1_wnaf_const(wnaf_1, q_1, WINDOW_A - 1); + skew_lam = secp256k1_wnaf_const(wnaf_lam, q_lam, WINDOW_A - 1); +#else + skew_1 = secp256k1_wnaf_const(wnaf_1, sc, WINDOW_A - 1); +#endif + + /* Calculate odd multiples of a. + * All multiples are brought to the same Z 'denominator', which is stored + * in Z. Due to secp256k1' isomorphism we can do all operations pretending + * that the Z coordinate was 1, use affine addition formulae, and correct + * the Z coordinate of the result once at the end. + */ + secp256k1_gej_set_ge(r, a); + secp256k1_ecmult_odd_multiples_table_globalz_windowa(pre_a, &Z, r); + for (i = 0; i < ECMULT_TABLE_SIZE(WINDOW_A); i++) { + secp256k1_fe_normalize_weak(&pre_a[i].y); + } +#ifdef USE_ENDOMORPHISM + for (i = 0; i < ECMULT_TABLE_SIZE(WINDOW_A); i++) { + secp256k1_ge_mul_lambda(&pre_a_lam[i], &pre_a[i]); + } +#endif + + /* first loop iteration (separated out so we can directly set r, rather + * than having it start at infinity, get doubled several times, then have + * its new value added to it) */ + i = wnaf_1[WNAF_SIZE(WINDOW_A - 1)]; + VERIFY_CHECK(i != 0); + ECMULT_CONST_TABLE_GET_GE(&tmpa, pre_a, i, WINDOW_A); + secp256k1_gej_set_ge(r, &tmpa); +#ifdef USE_ENDOMORPHISM + i = wnaf_lam[WNAF_SIZE(WINDOW_A - 1)]; + VERIFY_CHECK(i != 0); + ECMULT_CONST_TABLE_GET_GE(&tmpa, pre_a_lam, i, WINDOW_A); + secp256k1_gej_add_ge(r, r, &tmpa); +#endif + /* remaining loop iterations */ + for (i = WNAF_SIZE(WINDOW_A - 1) - 1; i >= 0; i--) { + int n; + int j; + for (j = 0; j < WINDOW_A - 1; ++j) { + secp256k1_gej_double_nonzero(r, r, NULL); + } + + n = wnaf_1[i]; + ECMULT_CONST_TABLE_GET_GE(&tmpa, pre_a, n, WINDOW_A); + VERIFY_CHECK(n != 0); + secp256k1_gej_add_ge(r, r, &tmpa); +#ifdef USE_ENDOMORPHISM + n = wnaf_lam[i]; + ECMULT_CONST_TABLE_GET_GE(&tmpa, pre_a_lam, n, WINDOW_A); + VERIFY_CHECK(n != 0); + secp256k1_gej_add_ge(r, r, &tmpa); +#endif + } + + secp256k1_fe_mul(&r->z, &r->z, &Z); + + { + /* Correct for wNAF skew */ + secp256k1_ge correction = *a; + secp256k1_ge_storage correction_1_stor; +#ifdef USE_ENDOMORPHISM + secp256k1_ge_storage correction_lam_stor; +#endif + secp256k1_ge_storage a2_stor; + secp256k1_gej tmpj; + secp256k1_gej_set_ge(&tmpj, &correction); + secp256k1_gej_double_var(&tmpj, &tmpj, NULL); + secp256k1_ge_set_gej(&correction, &tmpj); + secp256k1_ge_to_storage(&correction_1_stor, a); +#ifdef USE_ENDOMORPHISM + secp256k1_ge_to_storage(&correction_lam_stor, a); +#endif + secp256k1_ge_to_storage(&a2_stor, &correction); + + /* For odd numbers this is 2a (so replace it), for even ones a (so no-op) */ + secp256k1_ge_storage_cmov(&correction_1_stor, &a2_stor, skew_1 == 2); +#ifdef USE_ENDOMORPHISM + secp256k1_ge_storage_cmov(&correction_lam_stor, &a2_stor, skew_lam == 2); +#endif + + /* Apply the correction */ + secp256k1_ge_from_storage(&correction, &correction_1_stor); + secp256k1_ge_neg(&correction, &correction); + secp256k1_gej_add_ge(r, r, &correction); + +#ifdef USE_ENDOMORPHISM + secp256k1_ge_from_storage(&correction, &correction_lam_stor); + secp256k1_ge_neg(&correction, &correction); + secp256k1_ge_mul_lambda(&correction, &correction); + secp256k1_gej_add_ge(r, r, &correction); +#endif + } +} + +#endif diff --git a/src/ecmult_gen.h b/src/ecmult_gen.h index 3745633c4..eb2cc9ead 100644 --- a/src/ecmult_gen.h +++ b/src/ecmult_gen.h @@ -23,21 +23,21 @@ typedef struct { * None of the resulting prec group elements have a known scalar, and neither do any of * the intermediate sums while computing a*G. */ - secp256k1_ge_storage_t (*prec)[64][16]; /* prec[j][i] = 16^j * i * G + U_i */ - secp256k1_scalar_t blind; - secp256k1_gej_t initial; -} secp256k1_ecmult_gen_context_t; + secp256k1_ge_storage (*prec)[64][16]; /* prec[j][i] = 16^j * i * G + U_i */ + secp256k1_scalar blind; + secp256k1_gej initial; +} secp256k1_ecmult_gen_context; -static void secp256k1_ecmult_gen_context_init(secp256k1_ecmult_gen_context_t* ctx); -static void secp256k1_ecmult_gen_context_build(secp256k1_ecmult_gen_context_t* ctx); -static void secp256k1_ecmult_gen_context_clone(secp256k1_ecmult_gen_context_t *dst, - const secp256k1_ecmult_gen_context_t* src); -static void secp256k1_ecmult_gen_context_clear(secp256k1_ecmult_gen_context_t* ctx); -static int secp256k1_ecmult_gen_context_is_built(const secp256k1_ecmult_gen_context_t* ctx); +static void secp256k1_ecmult_gen_context_init(secp256k1_ecmult_gen_context* ctx); +static void secp256k1_ecmult_gen_context_build(secp256k1_ecmult_gen_context* ctx, const secp256k1_callback* cb); +static void secp256k1_ecmult_gen_context_clone(secp256k1_ecmult_gen_context *dst, + const secp256k1_ecmult_gen_context* src, const secp256k1_callback* cb); +static void secp256k1_ecmult_gen_context_clear(secp256k1_ecmult_gen_context* ctx); +static int secp256k1_ecmult_gen_context_is_built(const secp256k1_ecmult_gen_context* ctx); /** Multiply with the generator: R = a*G */ -static void secp256k1_ecmult_gen(const secp256k1_ecmult_gen_context_t* ctx, secp256k1_gej_t *r, const secp256k1_scalar_t *a); +static void secp256k1_ecmult_gen(const secp256k1_ecmult_gen_context* ctx, secp256k1_gej *r, const secp256k1_scalar *a); -static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context_t *ctx, const unsigned char *seed32); +static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context *ctx, const unsigned char *seed32); #endif diff --git a/src/ecmult_gen_impl.h b/src/ecmult_gen_impl.h index 4697753ac..35f254607 100644 --- a/src/ecmult_gen_impl.h +++ b/src/ecmult_gen_impl.h @@ -11,22 +11,26 @@ #include "group.h" #include "ecmult_gen.h" #include "hash_impl.h" - -static void secp256k1_ecmult_gen_context_init(secp256k1_ecmult_gen_context_t *ctx) { +#ifdef USE_ECMULT_STATIC_PRECOMPUTATION +#include "ecmult_static_context.h" +#endif +static void secp256k1_ecmult_gen_context_init(secp256k1_ecmult_gen_context *ctx) { ctx->prec = NULL; } -static void secp256k1_ecmult_gen_context_build(secp256k1_ecmult_gen_context_t *ctx) { - secp256k1_ge_t prec[1024]; - secp256k1_gej_t gj; - secp256k1_gej_t nums_gej; +static void secp256k1_ecmult_gen_context_build(secp256k1_ecmult_gen_context *ctx, const secp256k1_callback* cb) { +#ifndef USE_ECMULT_STATIC_PRECOMPUTATION + secp256k1_ge prec[1024]; + secp256k1_gej gj; + secp256k1_gej nums_gej; int i, j; +#endif if (ctx->prec != NULL) { return; } - - ctx->prec = (secp256k1_ge_storage_t (*)[64][16])checked_malloc(sizeof(*ctx->prec)); +#ifndef USE_ECMULT_STATIC_PRECOMPUTATION + ctx->prec = (secp256k1_ge_storage (*)[64][16])checked_malloc(cb, sizeof(*ctx->prec)); /* get the generator */ secp256k1_gej_set_ge(&gj, &secp256k1_ge_const_g); @@ -34,77 +38,93 @@ static void secp256k1_ecmult_gen_context_build(secp256k1_ecmult_gen_context_t *c /* Construct a group element with no known corresponding scalar (nothing up my sleeve). */ { static const unsigned char nums_b32[33] = "The scalar for this x is unknown"; - secp256k1_fe_t nums_x; - secp256k1_ge_t nums_ge; - VERIFY_CHECK(secp256k1_fe_set_b32(&nums_x, nums_b32)); - VERIFY_CHECK(secp256k1_ge_set_xo_var(&nums_ge, &nums_x, 0)); + secp256k1_fe nums_x; + secp256k1_ge nums_ge; + int r; + r = secp256k1_fe_set_b32(&nums_x, nums_b32); + (void)r; + VERIFY_CHECK(r); + r = secp256k1_ge_set_xo_var(&nums_ge, &nums_x, 0); + (void)r; + VERIFY_CHECK(r); secp256k1_gej_set_ge(&nums_gej, &nums_ge); /* Add G to make the bits in x uniformly distributed. */ - secp256k1_gej_add_ge_var(&nums_gej, &nums_gej, &secp256k1_ge_const_g); + secp256k1_gej_add_ge_var(&nums_gej, &nums_gej, &secp256k1_ge_const_g, NULL); } /* compute prec. */ { - secp256k1_gej_t precj[1024]; /* Jacobian versions of prec. */ - secp256k1_gej_t gbase; - secp256k1_gej_t numsbase; + secp256k1_gej precj[1024]; /* Jacobian versions of prec. */ + secp256k1_gej gbase; + secp256k1_gej numsbase; gbase = gj; /* 16^j * G */ numsbase = nums_gej; /* 2^j * nums. */ for (j = 0; j < 64; j++) { /* Set precj[j*16 .. j*16+15] to (numsbase, numsbase + gbase, ..., numsbase + 15*gbase). */ precj[j*16] = numsbase; for (i = 1; i < 16; i++) { - secp256k1_gej_add_var(&precj[j*16 + i], &precj[j*16 + i - 1], &gbase); + secp256k1_gej_add_var(&precj[j*16 + i], &precj[j*16 + i - 1], &gbase, NULL); } /* Multiply gbase by 16. */ for (i = 0; i < 4; i++) { - secp256k1_gej_double_var(&gbase, &gbase); + secp256k1_gej_double_var(&gbase, &gbase, NULL); } /* Multiply numbase by 2. */ - secp256k1_gej_double_var(&numsbase, &numsbase); + secp256k1_gej_double_var(&numsbase, &numsbase, NULL); if (j == 62) { /* In the last iteration, numsbase is (1 - 2^j) * nums instead. */ secp256k1_gej_neg(&numsbase, &numsbase); - secp256k1_gej_add_var(&numsbase, &numsbase, &nums_gej); + secp256k1_gej_add_var(&numsbase, &numsbase, &nums_gej, NULL); } } - secp256k1_ge_set_all_gej_var(1024, prec, precj); + secp256k1_ge_set_all_gej_var(prec, precj, 1024, cb); } for (j = 0; j < 64; j++) { for (i = 0; i < 16; i++) { secp256k1_ge_to_storage(&(*ctx->prec)[j][i], &prec[j*16 + i]); } } +#else + (void)cb; + ctx->prec = (secp256k1_ge_storage (*)[64][16])secp256k1_ecmult_static_context; +#endif secp256k1_ecmult_gen_blind(ctx, NULL); } -static int secp256k1_ecmult_gen_context_is_built(const secp256k1_ecmult_gen_context_t* ctx) { +static int secp256k1_ecmult_gen_context_is_built(const secp256k1_ecmult_gen_context* ctx) { return ctx->prec != NULL; } -static void secp256k1_ecmult_gen_context_clone(secp256k1_ecmult_gen_context_t *dst, - const secp256k1_ecmult_gen_context_t *src) { +static void secp256k1_ecmult_gen_context_clone(secp256k1_ecmult_gen_context *dst, + const secp256k1_ecmult_gen_context *src, const secp256k1_callback* cb) { if (src->prec == NULL) { dst->prec = NULL; } else { - dst->prec = (secp256k1_ge_storage_t (*)[64][16])checked_malloc(sizeof(*dst->prec)); +#ifndef USE_ECMULT_STATIC_PRECOMPUTATION + dst->prec = (secp256k1_ge_storage (*)[64][16])checked_malloc(cb, sizeof(*dst->prec)); memcpy(dst->prec, src->prec, sizeof(*dst->prec)); +#else + (void)cb; + dst->prec = src->prec; +#endif dst->initial = src->initial; dst->blind = src->blind; } } -static void secp256k1_ecmult_gen_context_clear(secp256k1_ecmult_gen_context_t *ctx) { +static void secp256k1_ecmult_gen_context_clear(secp256k1_ecmult_gen_context *ctx) { +#ifndef USE_ECMULT_STATIC_PRECOMPUTATION free(ctx->prec); +#endif secp256k1_scalar_clear(&ctx->blind); secp256k1_gej_clear(&ctx->initial); ctx->prec = NULL; } -static void secp256k1_ecmult_gen(const secp256k1_ecmult_gen_context_t *ctx, secp256k1_gej_t *r, const secp256k1_scalar_t *gn) { - secp256k1_ge_t add; - secp256k1_ge_storage_t adds; - secp256k1_scalar_t gnb; +static void secp256k1_ecmult_gen(const secp256k1_ecmult_gen_context *ctx, secp256k1_gej *r, const secp256k1_scalar *gn) { + secp256k1_ge add; + secp256k1_ge_storage adds; + secp256k1_scalar gnb; int bits; int i, j; memset(&adds, 0, sizeof(adds)); @@ -136,14 +156,15 @@ static void secp256k1_ecmult_gen(const secp256k1_ecmult_gen_context_t *ctx, secp } /* Setup blinding values for secp256k1_ecmult_gen. */ -static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context_t *ctx, const unsigned char *seed32) { - secp256k1_scalar_t b; - secp256k1_gej_t gb; - secp256k1_fe_t s; +static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context *ctx, const unsigned char *seed32) { + secp256k1_scalar b; + secp256k1_gej gb; + secp256k1_fe s; unsigned char nonce32[32]; secp256k1_rfc6979_hmac_sha256_t rng; int retry; - if (!seed32) { + unsigned char keydata[64] = {0}; + if (seed32 == NULL) { /* When seed is NULL, reset the initial point and blinding value. */ secp256k1_gej_set_ge(&ctx->initial, &secp256k1_ge_const_g); secp256k1_gej_neg(&ctx->initial, &ctx->initial); @@ -155,13 +176,18 @@ static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context_t *ctx, cons * and guards against weak or adversarial seeds. This is a simpler and safer interface than * asking the caller for blinding values directly and expecting them to retry on failure. */ - secp256k1_rfc6979_hmac_sha256_initialize(&rng, seed32 ? seed32 : nonce32, 32, nonce32, 32, NULL, 0); + memcpy(keydata, nonce32, 32); + if (seed32 != NULL) { + memcpy(keydata + 32, seed32, 32); + } + secp256k1_rfc6979_hmac_sha256_initialize(&rng, keydata, seed32 ? 64 : 32); + memset(keydata, 0, sizeof(keydata)); /* Retry for out of range results to achieve uniformity. */ do { secp256k1_rfc6979_hmac_sha256_generate(&rng, nonce32, 32); retry = !secp256k1_fe_set_b32(&s, nonce32); retry |= secp256k1_fe_is_zero(&s); - } while (retry); + } while (retry); /* This branch true is cryptographically unreachable. Requires sha256_hmac output > Fp. */ /* Randomize the projection to defend against multiplier sidechannels. */ secp256k1_gej_rescale(&ctx->initial, &s); secp256k1_fe_clear(&s); @@ -170,7 +196,7 @@ static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context_t *ctx, cons secp256k1_scalar_set_b32(&b, nonce32, &retry); /* A blinding value of 0 works, but would undermine the projection hardening. */ retry |= secp256k1_scalar_is_zero(&b); - } while (retry); + } while (retry); /* This branch true is cryptographically unreachable. Requires sha256_hmac output > order. */ secp256k1_rfc6979_hmac_sha256_finalize(&rng); memset(nonce32, 0, 32); secp256k1_ecmult_gen(ctx, &gb, &b); diff --git a/src/ecmult_impl.h b/src/ecmult_impl.h index 1b2856f83..4e40104ad 100644 --- a/src/ecmult_impl.h +++ b/src/ecmult_impl.h @@ -7,13 +7,29 @@ #ifndef _SECP256K1_ECMULT_IMPL_H_ #define _SECP256K1_ECMULT_IMPL_H_ +#include + #include "group.h" #include "scalar.h" #include "ecmult.h" +#if defined(EXHAUSTIVE_TEST_ORDER) +/* We need to lower these values for exhaustive tests because + * the tables cannot have infinities in them (this breaks the + * affine-isomorphism stuff which tracks z-ratios) */ +# if EXHAUSTIVE_TEST_ORDER > 128 +# define WINDOW_A 5 +# define WINDOW_G 8 +# elif EXHAUSTIVE_TEST_ORDER > 8 +# define WINDOW_A 4 +# define WINDOW_G 4 +# else +# define WINDOW_A 2 +# define WINDOW_G 2 +# endif +#else /* optimal for 128-bit and 256-bit exponents. */ #define WINDOW_A 5 - /** larger numbers may result in slightly better performance, at the cost of exponentially larger precomputed tables. */ #ifdef USE_ENDOMORPHISM @@ -23,63 +39,109 @@ /** One table for window size 16: 1.375 MiB. */ #define WINDOW_G 16 #endif - -/** Fill a table 'pre' with precomputed odd multiples of a. W determines the size of the table. - * pre will contains the values [1*a,3*a,5*a,...,(2^(w-1)-1)*a], so it needs place for - * 2^(w-2) entries. - * - * There are two versions of this function: - * - secp256k1_ecmult_precomp_wnaf_gej, which operates on group elements in jacobian notation, - * fast to precompute, but slower to use in later additions. - * - secp256k1_ecmult_precomp_wnaf_ge, which operates on group elements in affine notations, - * (much) slower to precompute, but a bit faster to use in later additions. - * To compute a*P + b*G, we use the jacobian version for P, and the affine version for G, as - * G is constant, so it only needs to be done once in advance. - */ -static void secp256k1_ecmult_table_precomp_gej_var(secp256k1_gej_t *pre, const secp256k1_gej_t *a, int w) { - secp256k1_gej_t d; - int i; - pre[0] = *a; - secp256k1_gej_double_var(&d, &pre[0]); - for (i = 1; i < (1 << (w-2)); i++) { - secp256k1_gej_add_var(&pre[i], &d, &pre[i-1]); - } -} - -static void secp256k1_ecmult_table_precomp_ge_storage_var(secp256k1_ge_storage_t *pre, const secp256k1_gej_t *a, int w) { - secp256k1_gej_t d; - int i; - const int table_size = 1 << (w-2); - secp256k1_gej_t *prej = (secp256k1_gej_t *)checked_malloc(sizeof(secp256k1_gej_t) * table_size); - secp256k1_ge_t *prea = (secp256k1_ge_t *)checked_malloc(sizeof(secp256k1_ge_t) * table_size); - prej[0] = *a; - secp256k1_gej_double_var(&d, a); - for (i = 1; i < table_size; i++) { - secp256k1_gej_add_var(&prej[i], &d, &prej[i-1]); - } - secp256k1_ge_set_all_gej_var(table_size, prea, prej); - for (i = 0; i < table_size; i++) { - secp256k1_ge_to_storage(&pre[i], &prea[i]); - } - free(prej); - free(prea); -} +#endif /** The number of entries a table with precomputed multiples needs to have. */ #define ECMULT_TABLE_SIZE(w) (1 << ((w)-2)) +/** Fill a table 'prej' with precomputed odd multiples of a. Prej will contain + * the values [1*a,3*a,...,(2*n-1)*a], so it space for n values. zr[0] will + * contain prej[0].z / a.z. The other zr[i] values = prej[i].z / prej[i-1].z. + * Prej's Z values are undefined, except for the last value. + */ +static void secp256k1_ecmult_odd_multiples_table(int n, secp256k1_gej *prej, secp256k1_fe *zr, const secp256k1_gej *a) { + secp256k1_gej d; + secp256k1_ge a_ge, d_ge; + int i; + + VERIFY_CHECK(!a->infinity); + + secp256k1_gej_double_var(&d, a, NULL); + + /* + * Perform the additions on an isomorphism where 'd' is affine: drop the z coordinate + * of 'd', and scale the 1P starting value's x/y coordinates without changing its z. + */ + d_ge.x = d.x; + d_ge.y = d.y; + d_ge.infinity = 0; + + secp256k1_ge_set_gej_zinv(&a_ge, a, &d.z); + prej[0].x = a_ge.x; + prej[0].y = a_ge.y; + prej[0].z = a->z; + prej[0].infinity = 0; + + zr[0] = d.z; + for (i = 1; i < n; i++) { + secp256k1_gej_add_ge_var(&prej[i], &prej[i-1], &d_ge, &zr[i]); + } + + /* + * Each point in 'prej' has a z coordinate too small by a factor of 'd.z'. Only + * the final point's z coordinate is actually used though, so just update that. + */ + secp256k1_fe_mul(&prej[n-1].z, &prej[n-1].z, &d.z); +} + +/** Fill a table 'pre' with precomputed odd multiples of a. + * + * There are two versions of this function: + * - secp256k1_ecmult_odd_multiples_table_globalz_windowa which brings its + * resulting point set to a single constant Z denominator, stores the X and Y + * coordinates as ge_storage points in pre, and stores the global Z in rz. + * It only operates on tables sized for WINDOW_A wnaf multiples. + * - secp256k1_ecmult_odd_multiples_table_storage_var, which converts its + * resulting point set to actually affine points, and stores those in pre. + * It operates on tables of any size, but uses heap-allocated temporaries. + * + * To compute a*P + b*G, we compute a table for P using the first function, + * and for G using the second (which requires an inverse, but it only needs to + * happen once). + */ +static void secp256k1_ecmult_odd_multiples_table_globalz_windowa(secp256k1_ge *pre, secp256k1_fe *globalz, const secp256k1_gej *a) { + secp256k1_gej prej[ECMULT_TABLE_SIZE(WINDOW_A)]; + secp256k1_fe zr[ECMULT_TABLE_SIZE(WINDOW_A)]; + + /* Compute the odd multiples in Jacobian form. */ + secp256k1_ecmult_odd_multiples_table(ECMULT_TABLE_SIZE(WINDOW_A), prej, zr, a); + /* Bring them to the same Z denominator. */ + secp256k1_ge_globalz_set_table_gej(ECMULT_TABLE_SIZE(WINDOW_A), pre, globalz, prej, zr); +} + +static void secp256k1_ecmult_odd_multiples_table_storage_var(int n, secp256k1_ge_storage *pre, const secp256k1_gej *a, const secp256k1_callback *cb) { + secp256k1_gej *prej = (secp256k1_gej*)checked_malloc(cb, sizeof(secp256k1_gej) * n); + secp256k1_ge *prea = (secp256k1_ge*)checked_malloc(cb, sizeof(secp256k1_ge) * n); + secp256k1_fe *zr = (secp256k1_fe*)checked_malloc(cb, sizeof(secp256k1_fe) * n); + int i; + + /* Compute the odd multiples in Jacobian form. */ + secp256k1_ecmult_odd_multiples_table(n, prej, zr, a); + /* Convert them in batch to affine coordinates. */ + secp256k1_ge_set_table_gej_var(prea, prej, zr, n); + /* Convert them to compact storage form. */ + for (i = 0; i < n; i++) { + secp256k1_ge_to_storage(&pre[i], &prea[i]); + } + + free(prea); + free(prej); + free(zr); +} + /** The following two macro retrieves a particular odd multiple from a table * of precomputed multiples. */ -#define ECMULT_TABLE_GET_GEJ(r,pre,n,w) do { \ +#define ECMULT_TABLE_GET_GE(r,pre,n,w) do { \ VERIFY_CHECK(((n) & 1) == 1); \ VERIFY_CHECK((n) >= -((1 << ((w)-1)) - 1)); \ VERIFY_CHECK((n) <= ((1 << ((w)-1)) - 1)); \ if ((n) > 0) { \ *(r) = (pre)[((n)-1)/2]; \ } else { \ - secp256k1_gej_neg((r), &(pre)[(-(n)-1)/2]); \ + secp256k1_ge_neg((r), &(pre)[(-(n)-1)/2]); \ } \ } while(0) + #define ECMULT_TABLE_GET_GE_STORAGE(r,pre,n,w) do { \ VERIFY_CHECK(((n) & 1) == 1); \ VERIFY_CHECK((n) >= -((1 << ((w)-1)) - 1)); \ @@ -92,15 +154,15 @@ static void secp256k1_ecmult_table_precomp_ge_storage_var(secp256k1_ge_storage_t } \ } while(0) -static void secp256k1_ecmult_context_init(secp256k1_ecmult_context_t *ctx) { +static void secp256k1_ecmult_context_init(secp256k1_ecmult_context *ctx) { ctx->pre_g = NULL; #ifdef USE_ENDOMORPHISM ctx->pre_g_128 = NULL; #endif } -static void secp256k1_ecmult_context_build(secp256k1_ecmult_context_t *ctx) { - secp256k1_gej_t gj; +static void secp256k1_ecmult_context_build(secp256k1_ecmult_context *ctx, const secp256k1_callback *cb) { + secp256k1_gej gj; if (ctx->pre_g != NULL) { return; @@ -109,35 +171,35 @@ static void secp256k1_ecmult_context_build(secp256k1_ecmult_context_t *ctx) { /* get the generator */ secp256k1_gej_set_ge(&gj, &secp256k1_ge_const_g); - ctx->pre_g = (secp256k1_ge_storage_t (*)[])checked_malloc(sizeof((*ctx->pre_g)[0]) * ECMULT_TABLE_SIZE(WINDOW_G)); + ctx->pre_g = (secp256k1_ge_storage (*)[])checked_malloc(cb, sizeof((*ctx->pre_g)[0]) * ECMULT_TABLE_SIZE(WINDOW_G)); /* precompute the tables with odd multiples */ - secp256k1_ecmult_table_precomp_ge_storage_var(*ctx->pre_g, &gj, WINDOW_G); + secp256k1_ecmult_odd_multiples_table_storage_var(ECMULT_TABLE_SIZE(WINDOW_G), *ctx->pre_g, &gj, cb); #ifdef USE_ENDOMORPHISM { - secp256k1_gej_t g_128j; + secp256k1_gej g_128j; int i; - ctx->pre_g_128 = (secp256k1_ge_storage_t (*)[])checked_malloc(sizeof((*ctx->pre_g_128)[0]) * ECMULT_TABLE_SIZE(WINDOW_G)); + ctx->pre_g_128 = (secp256k1_ge_storage (*)[])checked_malloc(cb, sizeof((*ctx->pre_g_128)[0]) * ECMULT_TABLE_SIZE(WINDOW_G)); /* calculate 2^128*generator */ g_128j = gj; for (i = 0; i < 128; i++) { - secp256k1_gej_double_var(&g_128j, &g_128j); + secp256k1_gej_double_var(&g_128j, &g_128j, NULL); } - secp256k1_ecmult_table_precomp_ge_storage_var(*ctx->pre_g_128, &g_128j, WINDOW_G); + secp256k1_ecmult_odd_multiples_table_storage_var(ECMULT_TABLE_SIZE(WINDOW_G), *ctx->pre_g_128, &g_128j, cb); } #endif } -static void secp256k1_ecmult_context_clone(secp256k1_ecmult_context_t *dst, - const secp256k1_ecmult_context_t *src) { +static void secp256k1_ecmult_context_clone(secp256k1_ecmult_context *dst, + const secp256k1_ecmult_context *src, const secp256k1_callback *cb) { if (src->pre_g == NULL) { dst->pre_g = NULL; } else { size_t size = sizeof((*dst->pre_g)[0]) * ECMULT_TABLE_SIZE(WINDOW_G); - dst->pre_g = (secp256k1_ge_storage_t (*)[])checked_malloc(size); + dst->pre_g = (secp256k1_ge_storage (*)[])checked_malloc(cb, size); memcpy(dst->pre_g, src->pre_g, size); } #ifdef USE_ENDOMORPHISM @@ -145,17 +207,17 @@ static void secp256k1_ecmult_context_clone(secp256k1_ecmult_context_t *dst, dst->pre_g_128 = NULL; } else { size_t size = sizeof((*dst->pre_g_128)[0]) * ECMULT_TABLE_SIZE(WINDOW_G); - dst->pre_g_128 = (secp256k1_ge_storage_t (*)[])checked_malloc(size); + dst->pre_g_128 = (secp256k1_ge_storage (*)[])checked_malloc(cb, size); memcpy(dst->pre_g_128, src->pre_g_128, size); } #endif } -static int secp256k1_ecmult_context_is_built(const secp256k1_ecmult_context_t *ctx) { +static int secp256k1_ecmult_context_is_built(const secp256k1_ecmult_context *ctx) { return ctx->pre_g != NULL; } -static void secp256k1_ecmult_context_clear(secp256k1_ecmult_context_t *ctx) { +static void secp256k1_ecmult_context_clear(secp256k1_ecmult_context *ctx) { free(ctx->pre_g); #ifdef USE_ENDOMORPHISM free(ctx->pre_g_128); @@ -168,54 +230,68 @@ static void secp256k1_ecmult_context_clear(secp256k1_ecmult_context_t *ctx) { * - each wnaf[i] is either 0, or an odd integer between -(1<<(w-1) - 1) and (1<<(w-1) - 1) * - two non-zero entries in wnaf are separated by at least w-1 zeroes. * - the number of set values in wnaf is returned. This number is at most 256, and at most one more - * - than the number of bits in the (absolute value) of the input. + * than the number of bits in the (absolute value) of the input. */ -static int secp256k1_ecmult_wnaf(int *wnaf, const secp256k1_scalar_t *a, int w) { - secp256k1_scalar_t s = *a; - int set_bits = 0; +static int secp256k1_ecmult_wnaf(int *wnaf, int len, const secp256k1_scalar *a, int w) { + secp256k1_scalar s = *a; + int last_set_bit = -1; int bit = 0; int sign = 1; + int carry = 0; + + VERIFY_CHECK(wnaf != NULL); + VERIFY_CHECK(0 <= len && len <= 256); + VERIFY_CHECK(a != NULL); + VERIFY_CHECK(2 <= w && w <= 31); + + memset(wnaf, 0, len * sizeof(wnaf[0])); if (secp256k1_scalar_get_bits(&s, 255, 1)) { secp256k1_scalar_negate(&s, &s); sign = -1; } - while (bit < 256) { + while (bit < len) { int now; int word; - if (secp256k1_scalar_get_bits(&s, bit, 1) == 0) { + if (secp256k1_scalar_get_bits(&s, bit, 1) == (unsigned int)carry) { bit++; continue; } - while (set_bits < bit) { - wnaf[set_bits++] = 0; - } + now = w; - if (bit + now > 256) { - now = 256 - bit; - } - word = secp256k1_scalar_get_bits_var(&s, bit, now); - if (word & (1 << (w-1))) { - secp256k1_scalar_add_bit(&s, bit + w); - wnaf[set_bits++] = sign * (word - (1 << w)); - } else { - wnaf[set_bits++] = sign * word; + if (now > len - bit) { + now = len - bit; } + + word = secp256k1_scalar_get_bits_var(&s, bit, now) + carry; + + carry = (word >> (w-1)) & 1; + word -= carry << w; + + wnaf[bit] = sign * word; + last_set_bit = bit; + bit += now; } - return set_bits; +#ifdef VERIFY + CHECK(carry == 0); + while (bit < 256) { + CHECK(secp256k1_scalar_get_bits(&s, bit++, 1) == 0); + } +#endif + return last_set_bit + 1; } -static void secp256k1_ecmult(const secp256k1_ecmult_context_t *ctx, secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_scalar_t *na, const secp256k1_scalar_t *ng) { - secp256k1_gej_t tmpj; - secp256k1_gej_t pre_a[ECMULT_TABLE_SIZE(WINDOW_A)]; - secp256k1_ge_t tmpa; +static void secp256k1_ecmult(const secp256k1_ecmult_context *ctx, secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_scalar *na, const secp256k1_scalar *ng) { + secp256k1_ge pre_a[ECMULT_TABLE_SIZE(WINDOW_A)]; + secp256k1_ge tmpa; + secp256k1_fe Z; #ifdef USE_ENDOMORPHISM - secp256k1_gej_t pre_a_lam[ECMULT_TABLE_SIZE(WINDOW_A)]; - secp256k1_scalar_t na_1, na_lam; + secp256k1_ge pre_a_lam[ECMULT_TABLE_SIZE(WINDOW_A)]; + secp256k1_scalar na_1, na_lam; /* Splitted G factors. */ - secp256k1_scalar_t ng_1, ng_128; + secp256k1_scalar ng_1, ng_128; int wnaf_na_1[130]; int wnaf_na_lam[130]; int bits_na_1; @@ -227,7 +303,7 @@ static void secp256k1_ecmult(const secp256k1_ecmult_context_t *ctx, secp256k1_ge #else int wnaf_na[256]; int bits_na; - int wnaf_ng[257]; + int wnaf_ng[256]; int bits_ng; #endif int i; @@ -235,11 +311,11 @@ static void secp256k1_ecmult(const secp256k1_ecmult_context_t *ctx, secp256k1_ge #ifdef USE_ENDOMORPHISM /* split na into na_1 and na_lam (where na = na_1 + na_lam*lambda, and na_1 and na_lam are ~128 bit) */ - secp256k1_scalar_split_lambda_var(&na_1, &na_lam, na); + secp256k1_scalar_split_lambda(&na_1, &na_lam, na); /* build wnaf representation for na_1 and na_lam. */ - bits_na_1 = secp256k1_ecmult_wnaf(wnaf_na_1, &na_1, WINDOW_A); - bits_na_lam = secp256k1_ecmult_wnaf(wnaf_na_lam, &na_lam, WINDOW_A); + bits_na_1 = secp256k1_ecmult_wnaf(wnaf_na_1, 130, &na_1, WINDOW_A); + bits_na_lam = secp256k1_ecmult_wnaf(wnaf_na_lam, 130, &na_lam, WINDOW_A); VERIFY_CHECK(bits_na_1 <= 130); VERIFY_CHECK(bits_na_lam <= 130); bits = bits_na_1; @@ -248,24 +324,33 @@ static void secp256k1_ecmult(const secp256k1_ecmult_context_t *ctx, secp256k1_ge } #else /* build wnaf representation for na. */ - bits_na = secp256k1_ecmult_wnaf(wnaf_na, na, WINDOW_A); + bits_na = secp256k1_ecmult_wnaf(wnaf_na, 256, na, WINDOW_A); bits = bits_na; #endif - /* calculate odd multiples of a */ - secp256k1_ecmult_table_precomp_gej_var(pre_a, a, WINDOW_A); + /* Calculate odd multiples of a. + * All multiples are brought to the same Z 'denominator', which is stored + * in Z. Due to secp256k1' isomorphism we can do all operations pretending + * that the Z coordinate was 1, use affine addition formulae, and correct + * the Z coordinate of the result once at the end. + * The exception is the precomputed G table points, which are actually + * affine. Compared to the base used for other points, they have a Z ratio + * of 1/Z, so we can use secp256k1_gej_add_zinv_var, which uses the same + * isomorphism to efficiently add with a known Z inverse. + */ + secp256k1_ecmult_odd_multiples_table_globalz_windowa(pre_a, &Z, a); #ifdef USE_ENDOMORPHISM for (i = 0; i < ECMULT_TABLE_SIZE(WINDOW_A); i++) { - secp256k1_gej_mul_lambda(&pre_a_lam[i], &pre_a[i]); + secp256k1_ge_mul_lambda(&pre_a_lam[i], &pre_a[i]); } /* split ng into ng_1 and ng_128 (where gn = gn_1 + gn_128*2^128, and gn_1 and gn_128 are ~128 bit) */ secp256k1_scalar_split_128(&ng_1, &ng_128, ng); /* Build wnaf representation for ng_1 and ng_128 */ - bits_ng_1 = secp256k1_ecmult_wnaf(wnaf_ng_1, &ng_1, WINDOW_G); - bits_ng_128 = secp256k1_ecmult_wnaf(wnaf_ng_128, &ng_128, WINDOW_G); + bits_ng_1 = secp256k1_ecmult_wnaf(wnaf_ng_1, 129, &ng_1, WINDOW_G); + bits_ng_128 = secp256k1_ecmult_wnaf(wnaf_ng_128, 129, &ng_128, WINDOW_G); if (bits_ng_1 > bits) { bits = bits_ng_1; } @@ -273,7 +358,7 @@ static void secp256k1_ecmult(const secp256k1_ecmult_context_t *ctx, secp256k1_ge bits = bits_ng_128; } #else - bits_ng = secp256k1_ecmult_wnaf(wnaf_ng, ng, WINDOW_G); + bits_ng = secp256k1_ecmult_wnaf(wnaf_ng, 256, ng, WINDOW_G); if (bits_ng > bits) { bits = bits_ng; } @@ -281,37 +366,41 @@ static void secp256k1_ecmult(const secp256k1_ecmult_context_t *ctx, secp256k1_ge secp256k1_gej_set_infinity(r); - for (i = bits-1; i >= 0; i--) { + for (i = bits - 1; i >= 0; i--) { int n; - secp256k1_gej_double_var(r, r); + secp256k1_gej_double_var(r, r, NULL); #ifdef USE_ENDOMORPHISM if (i < bits_na_1 && (n = wnaf_na_1[i])) { - ECMULT_TABLE_GET_GEJ(&tmpj, pre_a, n, WINDOW_A); - secp256k1_gej_add_var(r, r, &tmpj); + ECMULT_TABLE_GET_GE(&tmpa, pre_a, n, WINDOW_A); + secp256k1_gej_add_ge_var(r, r, &tmpa, NULL); } if (i < bits_na_lam && (n = wnaf_na_lam[i])) { - ECMULT_TABLE_GET_GEJ(&tmpj, pre_a_lam, n, WINDOW_A); - secp256k1_gej_add_var(r, r, &tmpj); + ECMULT_TABLE_GET_GE(&tmpa, pre_a_lam, n, WINDOW_A); + secp256k1_gej_add_ge_var(r, r, &tmpa, NULL); } if (i < bits_ng_1 && (n = wnaf_ng_1[i])) { ECMULT_TABLE_GET_GE_STORAGE(&tmpa, *ctx->pre_g, n, WINDOW_G); - secp256k1_gej_add_ge_var(r, r, &tmpa); + secp256k1_gej_add_zinv_var(r, r, &tmpa, &Z); } if (i < bits_ng_128 && (n = wnaf_ng_128[i])) { ECMULT_TABLE_GET_GE_STORAGE(&tmpa, *ctx->pre_g_128, n, WINDOW_G); - secp256k1_gej_add_ge_var(r, r, &tmpa); + secp256k1_gej_add_zinv_var(r, r, &tmpa, &Z); } #else if (i < bits_na && (n = wnaf_na[i])) { - ECMULT_TABLE_GET_GEJ(&tmpj, pre_a, n, WINDOW_A); - secp256k1_gej_add_var(r, r, &tmpj); + ECMULT_TABLE_GET_GE(&tmpa, pre_a, n, WINDOW_A); + secp256k1_gej_add_ge_var(r, r, &tmpa, NULL); } if (i < bits_ng && (n = wnaf_ng[i])) { ECMULT_TABLE_GET_GE_STORAGE(&tmpa, *ctx->pre_g, n, WINDOW_G); - secp256k1_gej_add_ge_var(r, r, &tmpa); + secp256k1_gej_add_zinv_var(r, r, &tmpa, &Z); } #endif } + + if (!r->infinity) { + secp256k1_fe_mul(&r->z, &r->z, &Z); + } } #endif diff --git a/src/field.h b/src/field.h index 41b280892..bbb1ee866 100644 --- a/src/field.h +++ b/src/field.h @@ -10,7 +10,7 @@ /** Field element module. * * Field elements can be represented in several ways, but code accessing - * it (and implementations) need to take certain properaties into account: + * it (and implementations) need to take certain properties into account: * - Each field element can be normalized or not. * - Each field element has a magnitude, which represents how far away * its representation is away from normalization. Normalized elements @@ -30,90 +30,103 @@ #error "Please select field implementation" #endif +#include "util.h" + /** Normalize a field element. */ -static void secp256k1_fe_normalize(secp256k1_fe_t *r); +static void secp256k1_fe_normalize(secp256k1_fe *r); /** Weakly normalize a field element: reduce it magnitude to 1, but don't fully normalize. */ -static void secp256k1_fe_normalize_weak(secp256k1_fe_t *r); +static void secp256k1_fe_normalize_weak(secp256k1_fe *r); /** Normalize a field element, without constant-time guarantee. */ -static void secp256k1_fe_normalize_var(secp256k1_fe_t *r); +static void secp256k1_fe_normalize_var(secp256k1_fe *r); /** Verify whether a field element represents zero i.e. would normalize to a zero value. The field * implementation may optionally normalize the input, but this should not be relied upon. */ -static int secp256k1_fe_normalizes_to_zero(secp256k1_fe_t *r); +static int secp256k1_fe_normalizes_to_zero(secp256k1_fe *r); /** Verify whether a field element represents zero i.e. would normalize to a zero value. The field * implementation may optionally normalize the input, but this should not be relied upon. */ -static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe_t *r); +static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe *r); /** Set a field element equal to a small integer. Resulting field element is normalized. */ -static void secp256k1_fe_set_int(secp256k1_fe_t *r, int a); +static void secp256k1_fe_set_int(secp256k1_fe *r, int a); + +/** Sets a field element equal to zero, initializing all fields. */ +static void secp256k1_fe_clear(secp256k1_fe *a); /** Verify whether a field element is zero. Requires the input to be normalized. */ -static int secp256k1_fe_is_zero(const secp256k1_fe_t *a); +static int secp256k1_fe_is_zero(const secp256k1_fe *a); /** Check the "oddness" of a field element. Requires the input to be normalized. */ -static int secp256k1_fe_is_odd(const secp256k1_fe_t *a); +static int secp256k1_fe_is_odd(const secp256k1_fe *a); /** Compare two field elements. Requires magnitude-1 inputs. */ -static int secp256k1_fe_equal_var(const secp256k1_fe_t *a, const secp256k1_fe_t *b); +static int secp256k1_fe_equal(const secp256k1_fe *a, const secp256k1_fe *b); + +/** Same as secp256k1_fe_equal, but may be variable time. */ +static int secp256k1_fe_equal_var(const secp256k1_fe *a, const secp256k1_fe *b); /** Compare two field elements. Requires both inputs to be normalized */ -static int secp256k1_fe_cmp_var(const secp256k1_fe_t *a, const secp256k1_fe_t *b); +static int secp256k1_fe_cmp_var(const secp256k1_fe *a, const secp256k1_fe *b); -/** Set a field element equal to 32-byte big endian value. If succesful, the resulting field element is normalized. */ -static int secp256k1_fe_set_b32(secp256k1_fe_t *r, const unsigned char *a); +/** Set a field element equal to 32-byte big endian value. If successful, the resulting field element is normalized. */ +static int secp256k1_fe_set_b32(secp256k1_fe *r, const unsigned char *a); /** Convert a field element to a 32-byte big endian value. Requires the input to be normalized */ -static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe_t *a); +static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe *a); /** Set a field element equal to the additive inverse of another. Takes a maximum magnitude of the input * as an argument. The magnitude of the output is one higher. */ -static void secp256k1_fe_negate(secp256k1_fe_t *r, const secp256k1_fe_t *a, int m); +static void secp256k1_fe_negate(secp256k1_fe *r, const secp256k1_fe *a, int m); /** Multiplies the passed field element with a small integer constant. Multiplies the magnitude by that * small integer. */ -static void secp256k1_fe_mul_int(secp256k1_fe_t *r, int a); +static void secp256k1_fe_mul_int(secp256k1_fe *r, int a); /** Adds a field element to another. The result has the sum of the inputs' magnitudes as magnitude. */ -static void secp256k1_fe_add(secp256k1_fe_t *r, const secp256k1_fe_t *a); +static void secp256k1_fe_add(secp256k1_fe *r, const secp256k1_fe *a); /** Sets a field element to be the product of two others. Requires the inputs' magnitudes to be at most 8. * The output magnitude is 1 (but not guaranteed to be normalized). */ -static void secp256k1_fe_mul(secp256k1_fe_t *r, const secp256k1_fe_t *a, const secp256k1_fe_t * SECP256K1_RESTRICT b); +static void secp256k1_fe_mul(secp256k1_fe *r, const secp256k1_fe *a, const secp256k1_fe * SECP256K1_RESTRICT b); /** Sets a field element to be the square of another. Requires the input's magnitude to be at most 8. * The output magnitude is 1 (but not guaranteed to be normalized). */ -static void secp256k1_fe_sqr(secp256k1_fe_t *r, const secp256k1_fe_t *a); +static void secp256k1_fe_sqr(secp256k1_fe *r, const secp256k1_fe *a); -/** Sets a field element to be the (modular) square root (if any exist) of another. Requires the - * input's magnitude to be at most 8. The output magnitude is 1 (but not guaranteed to be - * normalized). Return value indicates whether a square root was found. */ -static int secp256k1_fe_sqrt_var(secp256k1_fe_t *r, const secp256k1_fe_t *a); +/** If a has a square root, it is computed in r and 1 is returned. If a does not + * have a square root, the root of its negation is computed and 0 is returned. + * The input's magnitude can be at most 8. The output magnitude is 1 (but not + * guaranteed to be normalized). The result in r will always be a square + * itself. */ +static int secp256k1_fe_sqrt(secp256k1_fe *r, const secp256k1_fe *a); + +/** Checks whether a field element is a quadratic residue. */ +static int secp256k1_fe_is_quad_var(const secp256k1_fe *a); /** Sets a field element to be the (modular) inverse of another. Requires the input's magnitude to be * at most 8. The output magnitude is 1 (but not guaranteed to be normalized). */ -static void secp256k1_fe_inv(secp256k1_fe_t *r, const secp256k1_fe_t *a); +static void secp256k1_fe_inv(secp256k1_fe *r, const secp256k1_fe *a); /** Potentially faster version of secp256k1_fe_inv, without constant-time guarantee. */ -static void secp256k1_fe_inv_var(secp256k1_fe_t *r, const secp256k1_fe_t *a); +static void secp256k1_fe_inv_var(secp256k1_fe *r, const secp256k1_fe *a); /** Calculate the (modular) inverses of a batch of field elements. Requires the inputs' magnitudes to be * at most 8. The output magnitudes are 1 (but not guaranteed to be normalized). The inputs and * outputs must not overlap in memory. */ -static void secp256k1_fe_inv_all_var(size_t len, secp256k1_fe_t *r, const secp256k1_fe_t *a); +static void secp256k1_fe_inv_all_var(secp256k1_fe *r, const secp256k1_fe *a, size_t len); /** Convert a field element to the storage type. */ -static void secp256k1_fe_to_storage(secp256k1_fe_storage_t *r, const secp256k1_fe_t*); +static void secp256k1_fe_to_storage(secp256k1_fe_storage *r, const secp256k1_fe *a); /** Convert a field element back from the storage type. */ -static void secp256k1_fe_from_storage(secp256k1_fe_t *r, const secp256k1_fe_storage_t*); +static void secp256k1_fe_from_storage(secp256k1_fe *r, const secp256k1_fe_storage *a); /** If flag is true, set *r equal to *a; otherwise leave it. Constant-time. */ -static void secp256k1_fe_storage_cmov(secp256k1_fe_storage_t *r, const secp256k1_fe_storage_t *a, int flag); +static void secp256k1_fe_storage_cmov(secp256k1_fe_storage *r, const secp256k1_fe_storage *a, int flag); /** If flag is true, set *r equal to *a; otherwise leave it. Constant-time. */ -static void secp256k1_fe_cmov(secp256k1_fe_t *r, const secp256k1_fe_t *a, int flag); +static void secp256k1_fe_cmov(secp256k1_fe *r, const secp256k1_fe *a, int flag); #endif diff --git a/src/field_10x26.h b/src/field_10x26.h index 44bce6525..61ee1e096 100644 --- a/src/field_10x26.h +++ b/src/field_10x26.h @@ -16,20 +16,20 @@ typedef struct { int magnitude; int normalized; #endif -} secp256k1_fe_t; +} secp256k1_fe; /* Unpacks a constant into a overlapping multi-limbed FE element. */ #define SECP256K1_FE_CONST_INNER(d7, d6, d5, d4, d3, d2, d1, d0) { \ (d0) & 0x3FFFFFFUL, \ - ((d0) >> 26) | ((d1) & 0xFFFFFUL) << 6, \ - ((d1) >> 20) | ((d2) & 0x3FFFUL) << 12, \ - ((d2) >> 14) | ((d3) & 0xFFUL) << 18, \ - ((d3) >> 8) | ((d4) & 0x3) << 24, \ - ((d4) >> 2) & 0x3FFFFFFUL, \ - ((d4) >> 28) | ((d5) & 0x3FFFFFUL) << 4, \ - ((d5) >> 22) | ((d6) & 0xFFFF) << 10, \ - ((d6) >> 16) | ((d7) & 0x3FF) << 16, \ - ((d7) >> 10) \ + (((uint32_t)d0) >> 26) | (((uint32_t)(d1) & 0xFFFFFUL) << 6), \ + (((uint32_t)d1) >> 20) | (((uint32_t)(d2) & 0x3FFFUL) << 12), \ + (((uint32_t)d2) >> 14) | (((uint32_t)(d3) & 0xFFUL) << 18), \ + (((uint32_t)d3) >> 8) | (((uint32_t)(d4) & 0x3UL) << 24), \ + (((uint32_t)d4) >> 2) & 0x3FFFFFFUL, \ + (((uint32_t)d4) >> 28) | (((uint32_t)(d5) & 0x3FFFFFUL) << 4), \ + (((uint32_t)d5) >> 22) | (((uint32_t)(d6) & 0xFFFFUL) << 10), \ + (((uint32_t)d6) >> 16) | (((uint32_t)(d7) & 0x3FFUL) << 16), \ + (((uint32_t)d7) >> 10) \ } #ifdef VERIFY @@ -40,8 +40,8 @@ typedef struct { typedef struct { uint32_t n[8]; -} secp256k1_fe_storage_t; +} secp256k1_fe_storage; #define SECP256K1_FE_STORAGE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{ (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7) }} - +#define SECP256K1_FE_STORAGE_CONST_GET(d) d.n[7], d.n[6], d.n[5], d.n[4],d.n[3], d.n[2], d.n[1], d.n[0] #endif diff --git a/src/field_10x26_impl.h b/src/field_10x26_impl.h index 871b91f91..234c13a64 100644 --- a/src/field_10x26_impl.h +++ b/src/field_10x26_impl.h @@ -7,14 +7,12 @@ #ifndef _SECP256K1_FIELD_REPR_IMPL_H_ #define _SECP256K1_FIELD_REPR_IMPL_H_ -#include -#include #include "util.h" #include "num.h" #include "field.h" #ifdef VERIFY -static void secp256k1_fe_verify(const secp256k1_fe_t *a) { +static void secp256k1_fe_verify(const secp256k1_fe *a) { const uint32_t *d = a->n; int m = a->normalized ? 1 : 2 * a->magnitude, r = 1; r &= (d[0] <= 0x3FFFFFFUL * m); @@ -40,13 +38,9 @@ static void secp256k1_fe_verify(const secp256k1_fe_t *a) { } VERIFY_CHECK(r == 1); } -#else -static void secp256k1_fe_verify(const secp256k1_fe_t *a) { - (void)a; -} #endif -static void secp256k1_fe_normalize(secp256k1_fe_t *r) { +static void secp256k1_fe_normalize(secp256k1_fe *r) { uint32_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4], t5 = r->n[5], t6 = r->n[6], t7 = r->n[7], t8 = r->n[8], t9 = r->n[9]; @@ -101,7 +95,7 @@ static void secp256k1_fe_normalize(secp256k1_fe_t *r) { #endif } -static void secp256k1_fe_normalize_weak(secp256k1_fe_t *r) { +static void secp256k1_fe_normalize_weak(secp256k1_fe *r) { uint32_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4], t5 = r->n[5], t6 = r->n[6], t7 = r->n[7], t8 = r->n[8], t9 = r->n[9]; @@ -132,7 +126,7 @@ static void secp256k1_fe_normalize_weak(secp256k1_fe_t *r) { #endif } -static void secp256k1_fe_normalize_var(secp256k1_fe_t *r) { +static void secp256k1_fe_normalize_var(secp256k1_fe *r) { uint32_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4], t5 = r->n[5], t6 = r->n[6], t7 = r->n[7], t8 = r->n[8], t9 = r->n[9]; @@ -188,7 +182,7 @@ static void secp256k1_fe_normalize_var(secp256k1_fe_t *r) { #endif } -static int secp256k1_fe_normalizes_to_zero(secp256k1_fe_t *r) { +static int secp256k1_fe_normalizes_to_zero(secp256k1_fe *r) { uint32_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4], t5 = r->n[5], t6 = r->n[6], t7 = r->n[7], t8 = r->n[8], t9 = r->n[9]; @@ -217,7 +211,7 @@ static int secp256k1_fe_normalizes_to_zero(secp256k1_fe_t *r) { return (z0 == 0) | (z1 == 0x3FFFFFFUL); } -static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe_t *r) { +static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe *r) { uint32_t t0, t1, t2, t3, t4, t5, t6, t7, t8, t9; uint32_t z0, z1; uint32_t x; @@ -252,7 +246,7 @@ static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe_t *r) { t9 &= 0x03FFFFFUL; t1 += (x << 6); - t1 += (t0 >> 26); t0 = z0; + t1 += (t0 >> 26); t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; z0 |= t1; z1 &= t1 ^ 0x40UL; t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; z0 |= t2; z1 &= t2; t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; z0 |= t3; z1 &= t3; @@ -269,7 +263,7 @@ static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe_t *r) { return (z0 == 0) | (z1 == 0x3FFFFFFUL); } -SECP256K1_INLINE static void secp256k1_fe_set_int(secp256k1_fe_t *r, int a) { +SECP256K1_INLINE static void secp256k1_fe_set_int(secp256k1_fe *r, int a) { r->n[0] = a; r->n[1] = r->n[2] = r->n[3] = r->n[4] = r->n[5] = r->n[6] = r->n[7] = r->n[8] = r->n[9] = 0; #ifdef VERIFY @@ -279,7 +273,7 @@ SECP256K1_INLINE static void secp256k1_fe_set_int(secp256k1_fe_t *r, int a) { #endif } -SECP256K1_INLINE static int secp256k1_fe_is_zero(const secp256k1_fe_t *a) { +SECP256K1_INLINE static int secp256k1_fe_is_zero(const secp256k1_fe *a) { const uint32_t *t = a->n; #ifdef VERIFY VERIFY_CHECK(a->normalized); @@ -288,7 +282,7 @@ SECP256K1_INLINE static int secp256k1_fe_is_zero(const secp256k1_fe_t *a) { return (t[0] | t[1] | t[2] | t[3] | t[4] | t[5] | t[6] | t[7] | t[8] | t[9]) == 0; } -SECP256K1_INLINE static int secp256k1_fe_is_odd(const secp256k1_fe_t *a) { +SECP256K1_INLINE static int secp256k1_fe_is_odd(const secp256k1_fe *a) { #ifdef VERIFY VERIFY_CHECK(a->normalized); secp256k1_fe_verify(a); @@ -296,7 +290,7 @@ SECP256K1_INLINE static int secp256k1_fe_is_odd(const secp256k1_fe_t *a) { return a->n[0] & 1; } -SECP256K1_INLINE static void secp256k1_fe_clear(secp256k1_fe_t *a) { +SECP256K1_INLINE static void secp256k1_fe_clear(secp256k1_fe *a) { int i; #ifdef VERIFY a->magnitude = 0; @@ -307,7 +301,7 @@ SECP256K1_INLINE static void secp256k1_fe_clear(secp256k1_fe_t *a) { } } -static int secp256k1_fe_cmp_var(const secp256k1_fe_t *a, const secp256k1_fe_t *b) { +static int secp256k1_fe_cmp_var(const secp256k1_fe *a, const secp256k1_fe *b) { int i; #ifdef VERIFY VERIFY_CHECK(a->normalized); @@ -326,18 +320,18 @@ static int secp256k1_fe_cmp_var(const secp256k1_fe_t *a, const secp256k1_fe_t *b return 0; } -static int secp256k1_fe_set_b32(secp256k1_fe_t *r, const unsigned char *a) { - int i; - r->n[0] = r->n[1] = r->n[2] = r->n[3] = r->n[4] = 0; - r->n[5] = r->n[6] = r->n[7] = r->n[8] = r->n[9] = 0; - for (i=0; i<32; i++) { - int j; - for (j=0; j<4; j++) { - int limb = (8*i+2*j)/26; - int shift = (8*i+2*j)%26; - r->n[limb] |= (uint32_t)((a[31-i] >> (2*j)) & 0x3) << shift; - } - } +static int secp256k1_fe_set_b32(secp256k1_fe *r, const unsigned char *a) { + r->n[0] = (uint32_t)a[31] | ((uint32_t)a[30] << 8) | ((uint32_t)a[29] << 16) | ((uint32_t)(a[28] & 0x3) << 24); + r->n[1] = (uint32_t)((a[28] >> 2) & 0x3f) | ((uint32_t)a[27] << 6) | ((uint32_t)a[26] << 14) | ((uint32_t)(a[25] & 0xf) << 22); + r->n[2] = (uint32_t)((a[25] >> 4) & 0xf) | ((uint32_t)a[24] << 4) | ((uint32_t)a[23] << 12) | ((uint32_t)(a[22] & 0x3f) << 20); + r->n[3] = (uint32_t)((a[22] >> 6) & 0x3) | ((uint32_t)a[21] << 2) | ((uint32_t)a[20] << 10) | ((uint32_t)a[19] << 18); + r->n[4] = (uint32_t)a[18] | ((uint32_t)a[17] << 8) | ((uint32_t)a[16] << 16) | ((uint32_t)(a[15] & 0x3) << 24); + r->n[5] = (uint32_t)((a[15] >> 2) & 0x3f) | ((uint32_t)a[14] << 6) | ((uint32_t)a[13] << 14) | ((uint32_t)(a[12] & 0xf) << 22); + r->n[6] = (uint32_t)((a[12] >> 4) & 0xf) | ((uint32_t)a[11] << 4) | ((uint32_t)a[10] << 12) | ((uint32_t)(a[9] & 0x3f) << 20); + r->n[7] = (uint32_t)((a[9] >> 6) & 0x3) | ((uint32_t)a[8] << 2) | ((uint32_t)a[7] << 10) | ((uint32_t)a[6] << 18); + r->n[8] = (uint32_t)a[5] | ((uint32_t)a[4] << 8) | ((uint32_t)a[3] << 16) | ((uint32_t)(a[2] & 0x3) << 24); + r->n[9] = (uint32_t)((a[2] >> 2) & 0x3f) | ((uint32_t)a[1] << 6) | ((uint32_t)a[0] << 14); + if (r->n[9] == 0x3FFFFFUL && (r->n[8] & r->n[7] & r->n[6] & r->n[5] & r->n[4] & r->n[3] & r->n[2]) == 0x3FFFFFFUL && (r->n[1] + 0x40UL + ((r->n[0] + 0x3D1UL) >> 26)) > 0x3FFFFFFUL) { return 0; } @@ -350,25 +344,46 @@ static int secp256k1_fe_set_b32(secp256k1_fe_t *r, const unsigned char *a) { } /** Convert a field element to a 32-byte big endian value. Requires the input to be normalized */ -static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe_t *a) { - int i; +static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe *a) { #ifdef VERIFY VERIFY_CHECK(a->normalized); secp256k1_fe_verify(a); #endif - for (i=0; i<32; i++) { - int j; - int c = 0; - for (j=0; j<4; j++) { - int limb = (8*i+2*j)/26; - int shift = (8*i+2*j)%26; - c |= ((a->n[limb] >> shift) & 0x3) << (2 * j); - } - r[31-i] = c; - } + r[0] = (a->n[9] >> 14) & 0xff; + r[1] = (a->n[9] >> 6) & 0xff; + r[2] = ((a->n[9] & 0x3F) << 2) | ((a->n[8] >> 24) & 0x3); + r[3] = (a->n[8] >> 16) & 0xff; + r[4] = (a->n[8] >> 8) & 0xff; + r[5] = a->n[8] & 0xff; + r[6] = (a->n[7] >> 18) & 0xff; + r[7] = (a->n[7] >> 10) & 0xff; + r[8] = (a->n[7] >> 2) & 0xff; + r[9] = ((a->n[7] & 0x3) << 6) | ((a->n[6] >> 20) & 0x3f); + r[10] = (a->n[6] >> 12) & 0xff; + r[11] = (a->n[6] >> 4) & 0xff; + r[12] = ((a->n[6] & 0xf) << 4) | ((a->n[5] >> 22) & 0xf); + r[13] = (a->n[5] >> 14) & 0xff; + r[14] = (a->n[5] >> 6) & 0xff; + r[15] = ((a->n[5] & 0x3f) << 2) | ((a->n[4] >> 24) & 0x3); + r[16] = (a->n[4] >> 16) & 0xff; + r[17] = (a->n[4] >> 8) & 0xff; + r[18] = a->n[4] & 0xff; + r[19] = (a->n[3] >> 18) & 0xff; + r[20] = (a->n[3] >> 10) & 0xff; + r[21] = (a->n[3] >> 2) & 0xff; + r[22] = ((a->n[3] & 0x3) << 6) | ((a->n[2] >> 20) & 0x3f); + r[23] = (a->n[2] >> 12) & 0xff; + r[24] = (a->n[2] >> 4) & 0xff; + r[25] = ((a->n[2] & 0xf) << 4) | ((a->n[1] >> 22) & 0xf); + r[26] = (a->n[1] >> 14) & 0xff; + r[27] = (a->n[1] >> 6) & 0xff; + r[28] = ((a->n[1] & 0x3f) << 2) | ((a->n[0] >> 24) & 0x3); + r[29] = (a->n[0] >> 16) & 0xff; + r[30] = (a->n[0] >> 8) & 0xff; + r[31] = a->n[0] & 0xff; } -SECP256K1_INLINE static void secp256k1_fe_negate(secp256k1_fe_t *r, const secp256k1_fe_t *a, int m) { +SECP256K1_INLINE static void secp256k1_fe_negate(secp256k1_fe *r, const secp256k1_fe *a, int m) { #ifdef VERIFY VERIFY_CHECK(a->magnitude <= m); secp256k1_fe_verify(a); @@ -390,7 +405,7 @@ SECP256K1_INLINE static void secp256k1_fe_negate(secp256k1_fe_t *r, const secp25 #endif } -SECP256K1_INLINE static void secp256k1_fe_mul_int(secp256k1_fe_t *r, int a) { +SECP256K1_INLINE static void secp256k1_fe_mul_int(secp256k1_fe *r, int a) { r->n[0] *= a; r->n[1] *= a; r->n[2] *= a; @@ -408,7 +423,7 @@ SECP256K1_INLINE static void secp256k1_fe_mul_int(secp256k1_fe_t *r, int a) { #endif } -SECP256K1_INLINE static void secp256k1_fe_add(secp256k1_fe_t *r, const secp256k1_fe_t *a) { +SECP256K1_INLINE static void secp256k1_fe_add(secp256k1_fe *r, const secp256k1_fe *a) { #ifdef VERIFY secp256k1_fe_verify(a); #endif @@ -429,6 +444,14 @@ SECP256K1_INLINE static void secp256k1_fe_add(secp256k1_fe_t *r, const secp256k1 #endif } +#if defined(USE_EXTERNAL_ASM) + +/* External assembler implementation */ +void secp256k1_fe_mul_inner(uint32_t *r, const uint32_t *a, const uint32_t * SECP256K1_RESTRICT b); +void secp256k1_fe_sqr_inner(uint32_t *r, const uint32_t *a); + +#else + #ifdef VERIFY #define VERIFY_BITS(x, n) VERIFY_CHECK(((x) >> (n)) == 0) #else @@ -1037,9 +1060,9 @@ SECP256K1_INLINE static void secp256k1_fe_sqr_inner(uint32_t *r, const uint32_t VERIFY_BITS(r[2], 27); /* [r9 r8 r7 r6 r5 r4 r3 r2 r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ } +#endif - -static void secp256k1_fe_mul(secp256k1_fe_t *r, const secp256k1_fe_t *a, const secp256k1_fe_t * SECP256K1_RESTRICT b) { +static void secp256k1_fe_mul(secp256k1_fe *r, const secp256k1_fe *a, const secp256k1_fe * SECP256K1_RESTRICT b) { #ifdef VERIFY VERIFY_CHECK(a->magnitude <= 8); VERIFY_CHECK(b->magnitude <= 8); @@ -1055,7 +1078,7 @@ static void secp256k1_fe_mul(secp256k1_fe_t *r, const secp256k1_fe_t *a, const s #endif } -static void secp256k1_fe_sqr(secp256k1_fe_t *r, const secp256k1_fe_t *a) { +static void secp256k1_fe_sqr(secp256k1_fe *r, const secp256k1_fe *a) { #ifdef VERIFY VERIFY_CHECK(a->magnitude <= 8); secp256k1_fe_verify(a); @@ -1068,7 +1091,7 @@ static void secp256k1_fe_sqr(secp256k1_fe_t *r, const secp256k1_fe_t *a) { #endif } -static SECP256K1_INLINE void secp256k1_fe_cmov(secp256k1_fe_t *r, const secp256k1_fe_t *a, int flag) { +static SECP256K1_INLINE void secp256k1_fe_cmov(secp256k1_fe *r, const secp256k1_fe *a, int flag) { uint32_t mask0, mask1; mask0 = flag + ~((uint32_t)0); mask1 = ~mask0; @@ -1083,12 +1106,14 @@ static SECP256K1_INLINE void secp256k1_fe_cmov(secp256k1_fe_t *r, const secp256k r->n[8] = (r->n[8] & mask0) | (a->n[8] & mask1); r->n[9] = (r->n[9] & mask0) | (a->n[9] & mask1); #ifdef VERIFY - r->magnitude = (r->magnitude & mask0) | (a->magnitude & mask1); - r->normalized = (r->normalized & mask0) | (a->normalized & mask1); + if (a->magnitude > r->magnitude) { + r->magnitude = a->magnitude; + } + r->normalized &= a->normalized; #endif } -static SECP256K1_INLINE void secp256k1_fe_storage_cmov(secp256k1_fe_storage_t *r, const secp256k1_fe_storage_t *a, int flag) { +static SECP256K1_INLINE void secp256k1_fe_storage_cmov(secp256k1_fe_storage *r, const secp256k1_fe_storage *a, int flag) { uint32_t mask0, mask1; mask0 = flag + ~((uint32_t)0); mask1 = ~mask0; @@ -1102,7 +1127,7 @@ static SECP256K1_INLINE void secp256k1_fe_storage_cmov(secp256k1_fe_storage_t *r r->n[7] = (r->n[7] & mask0) | (a->n[7] & mask1); } -static void secp256k1_fe_to_storage(secp256k1_fe_storage_t *r, const secp256k1_fe_t *a) { +static void secp256k1_fe_to_storage(secp256k1_fe_storage *r, const secp256k1_fe *a) { #ifdef VERIFY VERIFY_CHECK(a->normalized); #endif @@ -1116,7 +1141,7 @@ static void secp256k1_fe_to_storage(secp256k1_fe_storage_t *r, const secp256k1_f r->n[7] = a->n[8] >> 16 | a->n[9] << 10; } -static SECP256K1_INLINE void secp256k1_fe_from_storage(secp256k1_fe_t *r, const secp256k1_fe_storage_t *a) { +static SECP256K1_INLINE void secp256k1_fe_from_storage(secp256k1_fe *r, const secp256k1_fe_storage *a) { r->n[0] = a->n[0] & 0x3FFFFFFUL; r->n[1] = a->n[0] >> 26 | ((a->n[1] << 6) & 0x3FFFFFFUL); r->n[2] = a->n[1] >> 20 | ((a->n[2] << 12) & 0x3FFFFFFUL); diff --git a/src/field_5x52.h b/src/field_5x52.h index 4513d36f4..8e69a560d 100644 --- a/src/field_5x52.h +++ b/src/field_5x52.h @@ -16,15 +16,15 @@ typedef struct { int magnitude; int normalized; #endif -} secp256k1_fe_t; +} secp256k1_fe; /* Unpacks a constant into a overlapping multi-limbed FE element. */ #define SECP256K1_FE_CONST_INNER(d7, d6, d5, d4, d3, d2, d1, d0) { \ - (d0) | ((uint64_t)(d1) & 0xFFFFFUL) << 32, \ - ((d1) >> 20) | ((uint64_t)(d2)) << 12 | ((uint64_t)(d3) & 0xFFUL) << 44, \ - ((d3) >> 8) | ((uint64_t)(d4) & 0xFFFFFFFUL) << 24, \ - ((d4) >> 28) | ((uint64_t)(d5)) << 4 | ((uint64_t)(d6) & 0xFFFFUL) << 36, \ - ((d6) >> 16) | ((uint64_t)(d7)) << 16 \ + (d0) | (((uint64_t)(d1) & 0xFFFFFUL) << 32), \ + ((uint64_t)(d1) >> 20) | (((uint64_t)(d2)) << 12) | (((uint64_t)(d3) & 0xFFUL) << 44), \ + ((uint64_t)(d3) >> 8) | (((uint64_t)(d4) & 0xFFFFFFFUL) << 24), \ + ((uint64_t)(d4) >> 28) | (((uint64_t)(d5)) << 4) | (((uint64_t)(d6) & 0xFFFFUL) << 36), \ + ((uint64_t)(d6) >> 16) | (((uint64_t)(d7)) << 16) \ } #ifdef VERIFY @@ -35,13 +35,13 @@ typedef struct { typedef struct { uint64_t n[4]; -} secp256k1_fe_storage_t; +} secp256k1_fe_storage; #define SECP256K1_FE_STORAGE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{ \ - (d0) | ((uint64_t)(d1)) << 32, \ - (d2) | ((uint64_t)(d3)) << 32, \ - (d4) | ((uint64_t)(d5)) << 32, \ - (d6) | ((uint64_t)(d7)) << 32 \ + (d0) | (((uint64_t)(d1)) << 32), \ + (d2) | (((uint64_t)(d3)) << 32), \ + (d4) | (((uint64_t)(d5)) << 32), \ + (d6) | (((uint64_t)(d7)) << 32) \ }} #endif diff --git a/src/field_5x52_impl.h b/src/field_5x52_impl.h index bda4c3dfc..8e8b286ba 100644 --- a/src/field_5x52_impl.h +++ b/src/field_5x52_impl.h @@ -11,7 +11,6 @@ #include "libsecp256k1-config.h" #endif -#include #include "util.h" #include "num.h" #include "field.h" @@ -31,7 +30,7 @@ */ #ifdef VERIFY -static void secp256k1_fe_verify(const secp256k1_fe_t *a) { +static void secp256k1_fe_verify(const secp256k1_fe *a) { const uint64_t *d = a->n; int m = a->normalized ? 1 : 2 * a->magnitude, r = 1; /* secp256k1 'p' value defined in "Standards for Efficient Cryptography" (SEC2) 2.7.1. */ @@ -50,13 +49,9 @@ static void secp256k1_fe_verify(const secp256k1_fe_t *a) { } VERIFY_CHECK(r == 1); } -#else -static void secp256k1_fe_verify(const secp256k1_fe_t *a) { - (void)a; -} #endif -static void secp256k1_fe_normalize(secp256k1_fe_t *r) { +static void secp256k1_fe_normalize(secp256k1_fe *r) { uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4]; /* Reduce t4 at the start so there will be at most a single carry from the first pass */ @@ -99,7 +94,7 @@ static void secp256k1_fe_normalize(secp256k1_fe_t *r) { #endif } -static void secp256k1_fe_normalize_weak(secp256k1_fe_t *r) { +static void secp256k1_fe_normalize_weak(secp256k1_fe *r) { uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4]; /* Reduce t4 at the start so there will be at most a single carry from the first pass */ @@ -123,7 +118,7 @@ static void secp256k1_fe_normalize_weak(secp256k1_fe_t *r) { #endif } -static void secp256k1_fe_normalize_var(secp256k1_fe_t *r) { +static void secp256k1_fe_normalize_var(secp256k1_fe *r) { uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4]; /* Reduce t4 at the start so there will be at most a single carry from the first pass */ @@ -167,7 +162,7 @@ static void secp256k1_fe_normalize_var(secp256k1_fe_t *r) { #endif } -static int secp256k1_fe_normalizes_to_zero(secp256k1_fe_t *r) { +static int secp256k1_fe_normalizes_to_zero(secp256k1_fe *r) { uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4]; /* z0 tracks a possible raw value of 0, z1 tracks a possible raw value of P */ @@ -190,7 +185,7 @@ static int secp256k1_fe_normalizes_to_zero(secp256k1_fe_t *r) { return (z0 == 0) | (z1 == 0xFFFFFFFFFFFFFULL); } -static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe_t *r) { +static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe *r) { uint64_t t0, t1, t2, t3, t4; uint64_t z0, z1; uint64_t x; @@ -219,7 +214,7 @@ static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe_t *r) { t4 &= 0x0FFFFFFFFFFFFULL; - t1 += (t0 >> 52); t0 = z0; + t1 += (t0 >> 52); t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; z0 |= t1; z1 &= t1; t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; z0 |= t2; z1 &= t2; t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; z0 |= t3; z1 &= t3; @@ -231,7 +226,7 @@ static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe_t *r) { return (z0 == 0) | (z1 == 0xFFFFFFFFFFFFFULL); } -SECP256K1_INLINE static void secp256k1_fe_set_int(secp256k1_fe_t *r, int a) { +SECP256K1_INLINE static void secp256k1_fe_set_int(secp256k1_fe *r, int a) { r->n[0] = a; r->n[1] = r->n[2] = r->n[3] = r->n[4] = 0; #ifdef VERIFY @@ -241,7 +236,7 @@ SECP256K1_INLINE static void secp256k1_fe_set_int(secp256k1_fe_t *r, int a) { #endif } -SECP256K1_INLINE static int secp256k1_fe_is_zero(const secp256k1_fe_t *a) { +SECP256K1_INLINE static int secp256k1_fe_is_zero(const secp256k1_fe *a) { const uint64_t *t = a->n; #ifdef VERIFY VERIFY_CHECK(a->normalized); @@ -250,7 +245,7 @@ SECP256K1_INLINE static int secp256k1_fe_is_zero(const secp256k1_fe_t *a) { return (t[0] | t[1] | t[2] | t[3] | t[4]) == 0; } -SECP256K1_INLINE static int secp256k1_fe_is_odd(const secp256k1_fe_t *a) { +SECP256K1_INLINE static int secp256k1_fe_is_odd(const secp256k1_fe *a) { #ifdef VERIFY VERIFY_CHECK(a->normalized); secp256k1_fe_verify(a); @@ -258,7 +253,7 @@ SECP256K1_INLINE static int secp256k1_fe_is_odd(const secp256k1_fe_t *a) { return a->n[0] & 1; } -SECP256K1_INLINE static void secp256k1_fe_clear(secp256k1_fe_t *a) { +SECP256K1_INLINE static void secp256k1_fe_clear(secp256k1_fe *a) { int i; #ifdef VERIFY a->magnitude = 0; @@ -269,7 +264,7 @@ SECP256K1_INLINE static void secp256k1_fe_clear(secp256k1_fe_t *a) { } } -static int secp256k1_fe_cmp_var(const secp256k1_fe_t *a, const secp256k1_fe_t *b) { +static int secp256k1_fe_cmp_var(const secp256k1_fe *a, const secp256k1_fe *b) { int i; #ifdef VERIFY VERIFY_CHECK(a->normalized); @@ -288,17 +283,41 @@ static int secp256k1_fe_cmp_var(const secp256k1_fe_t *a, const secp256k1_fe_t *b return 0; } -static int secp256k1_fe_set_b32(secp256k1_fe_t *r, const unsigned char *a) { - int i; - r->n[0] = r->n[1] = r->n[2] = r->n[3] = r->n[4] = 0; - for (i=0; i<32; i++) { - int j; - for (j=0; j<2; j++) { - int limb = (8*i+4*j)/52; - int shift = (8*i+4*j)%52; - r->n[limb] |= (uint64_t)((a[31-i] >> (4*j)) & 0xF) << shift; - } - } +static int secp256k1_fe_set_b32(secp256k1_fe *r, const unsigned char *a) { + r->n[0] = (uint64_t)a[31] + | ((uint64_t)a[30] << 8) + | ((uint64_t)a[29] << 16) + | ((uint64_t)a[28] << 24) + | ((uint64_t)a[27] << 32) + | ((uint64_t)a[26] << 40) + | ((uint64_t)(a[25] & 0xF) << 48); + r->n[1] = (uint64_t)((a[25] >> 4) & 0xF) + | ((uint64_t)a[24] << 4) + | ((uint64_t)a[23] << 12) + | ((uint64_t)a[22] << 20) + | ((uint64_t)a[21] << 28) + | ((uint64_t)a[20] << 36) + | ((uint64_t)a[19] << 44); + r->n[2] = (uint64_t)a[18] + | ((uint64_t)a[17] << 8) + | ((uint64_t)a[16] << 16) + | ((uint64_t)a[15] << 24) + | ((uint64_t)a[14] << 32) + | ((uint64_t)a[13] << 40) + | ((uint64_t)(a[12] & 0xF) << 48); + r->n[3] = (uint64_t)((a[12] >> 4) & 0xF) + | ((uint64_t)a[11] << 4) + | ((uint64_t)a[10] << 12) + | ((uint64_t)a[9] << 20) + | ((uint64_t)a[8] << 28) + | ((uint64_t)a[7] << 36) + | ((uint64_t)a[6] << 44); + r->n[4] = (uint64_t)a[5] + | ((uint64_t)a[4] << 8) + | ((uint64_t)a[3] << 16) + | ((uint64_t)a[2] << 24) + | ((uint64_t)a[1] << 32) + | ((uint64_t)a[0] << 40); if (r->n[4] == 0x0FFFFFFFFFFFFULL && (r->n[3] & r->n[2] & r->n[1]) == 0xFFFFFFFFFFFFFULL && r->n[0] >= 0xFFFFEFFFFFC2FULL) { return 0; } @@ -311,25 +330,46 @@ static int secp256k1_fe_set_b32(secp256k1_fe_t *r, const unsigned char *a) { } /** Convert a field element to a 32-byte big endian value. Requires the input to be normalized */ -static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe_t *a) { - int i; +static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe *a) { #ifdef VERIFY VERIFY_CHECK(a->normalized); secp256k1_fe_verify(a); #endif - for (i=0; i<32; i++) { - int j; - int c = 0; - for (j=0; j<2; j++) { - int limb = (8*i+4*j)/52; - int shift = (8*i+4*j)%52; - c |= ((a->n[limb] >> shift) & 0xF) << (4 * j); - } - r[31-i] = c; - } + r[0] = (a->n[4] >> 40) & 0xFF; + r[1] = (a->n[4] >> 32) & 0xFF; + r[2] = (a->n[4] >> 24) & 0xFF; + r[3] = (a->n[4] >> 16) & 0xFF; + r[4] = (a->n[4] >> 8) & 0xFF; + r[5] = a->n[4] & 0xFF; + r[6] = (a->n[3] >> 44) & 0xFF; + r[7] = (a->n[3] >> 36) & 0xFF; + r[8] = (a->n[3] >> 28) & 0xFF; + r[9] = (a->n[3] >> 20) & 0xFF; + r[10] = (a->n[3] >> 12) & 0xFF; + r[11] = (a->n[3] >> 4) & 0xFF; + r[12] = ((a->n[2] >> 48) & 0xF) | ((a->n[3] & 0xF) << 4); + r[13] = (a->n[2] >> 40) & 0xFF; + r[14] = (a->n[2] >> 32) & 0xFF; + r[15] = (a->n[2] >> 24) & 0xFF; + r[16] = (a->n[2] >> 16) & 0xFF; + r[17] = (a->n[2] >> 8) & 0xFF; + r[18] = a->n[2] & 0xFF; + r[19] = (a->n[1] >> 44) & 0xFF; + r[20] = (a->n[1] >> 36) & 0xFF; + r[21] = (a->n[1] >> 28) & 0xFF; + r[22] = (a->n[1] >> 20) & 0xFF; + r[23] = (a->n[1] >> 12) & 0xFF; + r[24] = (a->n[1] >> 4) & 0xFF; + r[25] = ((a->n[0] >> 48) & 0xF) | ((a->n[1] & 0xF) << 4); + r[26] = (a->n[0] >> 40) & 0xFF; + r[27] = (a->n[0] >> 32) & 0xFF; + r[28] = (a->n[0] >> 24) & 0xFF; + r[29] = (a->n[0] >> 16) & 0xFF; + r[30] = (a->n[0] >> 8) & 0xFF; + r[31] = a->n[0] & 0xFF; } -SECP256K1_INLINE static void secp256k1_fe_negate(secp256k1_fe_t *r, const secp256k1_fe_t *a, int m) { +SECP256K1_INLINE static void secp256k1_fe_negate(secp256k1_fe *r, const secp256k1_fe *a, int m) { #ifdef VERIFY VERIFY_CHECK(a->magnitude <= m); secp256k1_fe_verify(a); @@ -346,7 +386,7 @@ SECP256K1_INLINE static void secp256k1_fe_negate(secp256k1_fe_t *r, const secp25 #endif } -SECP256K1_INLINE static void secp256k1_fe_mul_int(secp256k1_fe_t *r, int a) { +SECP256K1_INLINE static void secp256k1_fe_mul_int(secp256k1_fe *r, int a) { r->n[0] *= a; r->n[1] *= a; r->n[2] *= a; @@ -359,7 +399,7 @@ SECP256K1_INLINE static void secp256k1_fe_mul_int(secp256k1_fe_t *r, int a) { #endif } -SECP256K1_INLINE static void secp256k1_fe_add(secp256k1_fe_t *r, const secp256k1_fe_t *a) { +SECP256K1_INLINE static void secp256k1_fe_add(secp256k1_fe *r, const secp256k1_fe *a) { #ifdef VERIFY secp256k1_fe_verify(a); #endif @@ -375,7 +415,7 @@ SECP256K1_INLINE static void secp256k1_fe_add(secp256k1_fe_t *r, const secp256k1 #endif } -static void secp256k1_fe_mul(secp256k1_fe_t *r, const secp256k1_fe_t *a, const secp256k1_fe_t * SECP256K1_RESTRICT b) { +static void secp256k1_fe_mul(secp256k1_fe *r, const secp256k1_fe *a, const secp256k1_fe * SECP256K1_RESTRICT b) { #ifdef VERIFY VERIFY_CHECK(a->magnitude <= 8); VERIFY_CHECK(b->magnitude <= 8); @@ -391,7 +431,7 @@ static void secp256k1_fe_mul(secp256k1_fe_t *r, const secp256k1_fe_t *a, const s #endif } -static void secp256k1_fe_sqr(secp256k1_fe_t *r, const secp256k1_fe_t *a) { +static void secp256k1_fe_sqr(secp256k1_fe *r, const secp256k1_fe *a) { #ifdef VERIFY VERIFY_CHECK(a->magnitude <= 8); secp256k1_fe_verify(a); @@ -404,7 +444,7 @@ static void secp256k1_fe_sqr(secp256k1_fe_t *r, const secp256k1_fe_t *a) { #endif } -static SECP256K1_INLINE void secp256k1_fe_cmov(secp256k1_fe_t *r, const secp256k1_fe_t *a, int flag) { +static SECP256K1_INLINE void secp256k1_fe_cmov(secp256k1_fe *r, const secp256k1_fe *a, int flag) { uint64_t mask0, mask1; mask0 = flag + ~((uint64_t)0); mask1 = ~mask0; @@ -414,12 +454,14 @@ static SECP256K1_INLINE void secp256k1_fe_cmov(secp256k1_fe_t *r, const secp256k r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1); r->n[4] = (r->n[4] & mask0) | (a->n[4] & mask1); #ifdef VERIFY - r->magnitude = (r->magnitude & mask0) | (a->magnitude & mask1); - r->normalized = (r->normalized & mask0) | (a->normalized & mask1); + if (a->magnitude > r->magnitude) { + r->magnitude = a->magnitude; + } + r->normalized &= a->normalized; #endif } -static SECP256K1_INLINE void secp256k1_fe_storage_cmov(secp256k1_fe_storage_t *r, const secp256k1_fe_storage_t *a, int flag) { +static SECP256K1_INLINE void secp256k1_fe_storage_cmov(secp256k1_fe_storage *r, const secp256k1_fe_storage *a, int flag) { uint64_t mask0, mask1; mask0 = flag + ~((uint64_t)0); mask1 = ~mask0; @@ -429,7 +471,7 @@ static SECP256K1_INLINE void secp256k1_fe_storage_cmov(secp256k1_fe_storage_t *r r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1); } -static void secp256k1_fe_to_storage(secp256k1_fe_storage_t *r, const secp256k1_fe_t *a) { +static void secp256k1_fe_to_storage(secp256k1_fe_storage *r, const secp256k1_fe *a) { #ifdef VERIFY VERIFY_CHECK(a->normalized); #endif @@ -439,7 +481,7 @@ static void secp256k1_fe_to_storage(secp256k1_fe_storage_t *r, const secp256k1_f r->n[3] = a->n[3] >> 36 | a->n[4] << 16; } -static SECP256K1_INLINE void secp256k1_fe_from_storage(secp256k1_fe_t *r, const secp256k1_fe_storage_t *a) { +static SECP256K1_INLINE void secp256k1_fe_from_storage(secp256k1_fe *r, const secp256k1_fe_storage *a) { r->n[0] = a->n[0] & 0xFFFFFFFFFFFFFULL; r->n[1] = a->n[0] >> 52 | ((a->n[1] << 12) & 0xFFFFFFFFFFFFFULL); r->n[2] = a->n[1] >> 40 | ((a->n[2] << 24) & 0xFFFFFFFFFFFFFULL); diff --git a/src/field_5x52_int128_impl.h b/src/field_5x52_int128_impl.h index 9280bb5ea..0bf22bdd3 100644 --- a/src/field_5x52_int128_impl.h +++ b/src/field_5x52_int128_impl.h @@ -137,7 +137,7 @@ SECP256K1_INLINE static void secp256k1_fe_mul_inner(uint64_t *r, const uint64_t VERIFY_BITS(r[2], 52); VERIFY_BITS(c, 63); /* [d 0 0 0 t4 t3+c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - c += d * R + t3;; + c += d * R + t3; VERIFY_BITS(c, 100); /* [t4 c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ r[3] = c & M; c >>= 52; @@ -259,7 +259,7 @@ SECP256K1_INLINE static void secp256k1_fe_sqr_inner(uint64_t *r, const uint64_t VERIFY_BITS(c, 63); /* [d 0 0 0 t4 t3+c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - c += d * R + t3;; + c += d * R + t3; VERIFY_BITS(c, 100); /* [t4 c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ r[3] = c & M; c >>= 52; diff --git a/src/field_impl.h b/src/field_impl.h index e6ec11e8f..5127b279b 100644 --- a/src/field_impl.h +++ b/src/field_impl.h @@ -21,15 +21,31 @@ #error "Please select field implementation" #endif -SECP256K1_INLINE static int secp256k1_fe_equal_var(const secp256k1_fe_t *a, const secp256k1_fe_t *b) { - secp256k1_fe_t na; +SECP256K1_INLINE static int secp256k1_fe_equal(const secp256k1_fe *a, const secp256k1_fe *b) { + secp256k1_fe na; + secp256k1_fe_negate(&na, a, 1); + secp256k1_fe_add(&na, b); + return secp256k1_fe_normalizes_to_zero(&na); +} + +SECP256K1_INLINE static int secp256k1_fe_equal_var(const secp256k1_fe *a, const secp256k1_fe *b) { + secp256k1_fe na; secp256k1_fe_negate(&na, a, 1); secp256k1_fe_add(&na, b); return secp256k1_fe_normalizes_to_zero_var(&na); } -static int secp256k1_fe_sqrt_var(secp256k1_fe_t *r, const secp256k1_fe_t *a) { - secp256k1_fe_t x2, x3, x6, x9, x11, x22, x44, x88, x176, x220, x223, t1; +static int secp256k1_fe_sqrt(secp256k1_fe *r, const secp256k1_fe *a) { + /** Given that p is congruent to 3 mod 4, we can compute the square root of + * a mod p as the (p+1)/4'th power of a. + * + * As (p+1)/4 is an even number, it will have the same result for a and for + * (-a). Only one of these two numbers actually has a square root however, + * so we test at the end by squaring and comparing to the input. + * Also because (p+1)/4 is an even number, the computed square root is + * itself always a square (a ** ((p+1)/4) is the square of a ** ((p+1)/8)). + */ + secp256k1_fe x2, x3, x6, x9, x11, x22, x44, x88, x176, x220, x223, t1; int j; /** The binary representation of (p + 1)/4 has 3 blocks of 1s, with lengths in @@ -114,11 +130,11 @@ static int secp256k1_fe_sqrt_var(secp256k1_fe_t *r, const secp256k1_fe_t *a) { /* Check that a square root was actually calculated */ secp256k1_fe_sqr(&t1, r); - return secp256k1_fe_equal_var(&t1, a); + return secp256k1_fe_equal(&t1, a); } -static void secp256k1_fe_inv(secp256k1_fe_t *r, const secp256k1_fe_t *a) { - secp256k1_fe_t x2, x3, x6, x9, x11, x22, x44, x88, x176, x220, x223, t1; +static void secp256k1_fe_inv(secp256k1_fe *r, const secp256k1_fe *a) { + secp256k1_fe x2, x3, x6, x9, x11, x22, x44, x88, x176, x220, x223, t1; int j; /** The binary representation of (p - 2) has 5 blocks of 1s, with lengths in @@ -207,11 +223,15 @@ static void secp256k1_fe_inv(secp256k1_fe_t *r, const secp256k1_fe_t *a) { secp256k1_fe_mul(r, a, &t1); } -static void secp256k1_fe_inv_var(secp256k1_fe_t *r, const secp256k1_fe_t *a) { +static void secp256k1_fe_inv_var(secp256k1_fe *r, const secp256k1_fe *a) { #if defined(USE_FIELD_INV_BUILTIN) secp256k1_fe_inv(r, a); #elif defined(USE_FIELD_INV_NUM) - secp256k1_num_t n, m; + secp256k1_num n, m; + static const secp256k1_fe negone = SECP256K1_FE_CONST( + 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, + 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFEUL, 0xFFFFFC2EUL + ); /* secp256k1 field prime, value p defined in "Standards for Efficient Cryptography" (SEC2) 2.7.1. */ static const unsigned char prime[32] = { 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, @@ -220,21 +240,28 @@ static void secp256k1_fe_inv_var(secp256k1_fe_t *r, const secp256k1_fe_t *a) { 0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F }; unsigned char b[32]; - secp256k1_fe_t c = *a; + int res; + secp256k1_fe c = *a; secp256k1_fe_normalize_var(&c); secp256k1_fe_get_b32(b, &c); secp256k1_num_set_bin(&n, b, 32); secp256k1_num_set_bin(&m, prime, 32); secp256k1_num_mod_inverse(&n, &n, &m); secp256k1_num_get_bin(b, 32, &n); - VERIFY_CHECK(secp256k1_fe_set_b32(r, b)); + res = secp256k1_fe_set_b32(r, b); + (void)res; + VERIFY_CHECK(res); + /* Verify the result is the (unique) valid inverse using non-GMP code. */ + secp256k1_fe_mul(&c, &c, r); + secp256k1_fe_add(&c, &negone); + CHECK(secp256k1_fe_normalizes_to_zero_var(&c)); #else #error "Please select field inverse implementation" #endif } -static void secp256k1_fe_inv_all_var(size_t len, secp256k1_fe_t *r, const secp256k1_fe_t *a) { - secp256k1_fe_t u; +static void secp256k1_fe_inv_all_var(secp256k1_fe *r, const secp256k1_fe *a, size_t len) { + secp256k1_fe u; size_t i; if (len < 1) { return; @@ -252,7 +279,7 @@ static void secp256k1_fe_inv_all_var(size_t len, secp256k1_fe_t *r, const secp25 secp256k1_fe_inv_var(&u, &r[--i]); while (i > 0) { - int j = i--; + size_t j = i--; secp256k1_fe_mul(&r[j], &r[i], &u); secp256k1_fe_mul(&u, &u, &a[j]); } @@ -260,4 +287,29 @@ static void secp256k1_fe_inv_all_var(size_t len, secp256k1_fe_t *r, const secp25 r[0] = u; } +static int secp256k1_fe_is_quad_var(const secp256k1_fe *a) { +#ifndef USE_NUM_NONE + unsigned char b[32]; + secp256k1_num n; + secp256k1_num m; + /* secp256k1 field prime, value p defined in "Standards for Efficient Cryptography" (SEC2) 2.7.1. */ + static const unsigned char prime[32] = { + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F + }; + + secp256k1_fe c = *a; + secp256k1_fe_normalize_var(&c); + secp256k1_fe_get_b32(b, &c); + secp256k1_num_set_bin(&n, b, 32); + secp256k1_num_set_bin(&m, prime, 32); + return secp256k1_num_jacobi(&n, &m) >= 0; +#else + secp256k1_fe r; + return secp256k1_fe_sqrt(&r, a); +#endif +} + #endif diff --git a/src/gen_context.c b/src/gen_context.c new file mode 100644 index 000000000..1835fd491 --- /dev/null +++ b/src/gen_context.c @@ -0,0 +1,74 @@ +/********************************************************************** + * Copyright (c) 2013, 2014, 2015 Thomas Daede, Cory Fields * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#define USE_BASIC_CONFIG 1 + +#include "basic-config.h" +#include "include/secp256k1.h" +#include "field_impl.h" +#include "scalar_impl.h" +#include "group_impl.h" +#include "ecmult_gen_impl.h" + +static void default_error_callback_fn(const char* str, void* data) { + (void)data; + fprintf(stderr, "[libsecp256k1] internal consistency check failed: %s\n", str); + abort(); +} + +static const secp256k1_callback default_error_callback = { + default_error_callback_fn, + NULL +}; + +int main(int argc, char **argv) { + secp256k1_ecmult_gen_context ctx; + int inner; + int outer; + FILE* fp; + + (void)argc; + (void)argv; + + fp = fopen("src/ecmult_static_context.h","w"); + if (fp == NULL) { + fprintf(stderr, "Could not open src/ecmult_static_context.h for writing!\n"); + return -1; + } + + fprintf(fp, "#ifndef _SECP256K1_ECMULT_STATIC_CONTEXT_\n"); + fprintf(fp, "#define _SECP256K1_ECMULT_STATIC_CONTEXT_\n"); + fprintf(fp, "#include \"group.h\"\n"); + fprintf(fp, "#define SC SECP256K1_GE_STORAGE_CONST\n"); + fprintf(fp, "static const secp256k1_ge_storage secp256k1_ecmult_static_context[64][16] = {\n"); + + secp256k1_ecmult_gen_context_init(&ctx); + secp256k1_ecmult_gen_context_build(&ctx, &default_error_callback); + for(outer = 0; outer != 64; outer++) { + fprintf(fp,"{\n"); + for(inner = 0; inner != 16; inner++) { + fprintf(fp," SC(%uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu)", SECP256K1_GE_STORAGE_CONST_GET((*ctx.prec)[outer][inner])); + if (inner != 15) { + fprintf(fp,",\n"); + } else { + fprintf(fp,"\n"); + } + } + if (outer != 63) { + fprintf(fp,"},\n"); + } else { + fprintf(fp,"}\n"); + } + } + fprintf(fp,"};\n"); + secp256k1_ecmult_gen_context_clear(&ctx); + + fprintf(fp, "#undef SC\n"); + fprintf(fp, "#endif\n"); + fclose(fp); + + return 0; +} diff --git a/src/group.h b/src/group.h index 0b08b3b99..4957b248f 100644 --- a/src/group.h +++ b/src/group.h @@ -12,110 +12,133 @@ /** A group element of the secp256k1 curve, in affine coordinates. */ typedef struct { - secp256k1_fe_t x; - secp256k1_fe_t y; + secp256k1_fe x; + secp256k1_fe y; int infinity; /* whether this represents the point at infinity */ -} secp256k1_ge_t; +} secp256k1_ge; #define SECP256K1_GE_CONST(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) {SECP256K1_FE_CONST((a),(b),(c),(d),(e),(f),(g),(h)), SECP256K1_FE_CONST((i),(j),(k),(l),(m),(n),(o),(p)), 0} #define SECP256K1_GE_CONST_INFINITY {SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), 1} /** A group element of the secp256k1 curve, in jacobian coordinates. */ typedef struct { - secp256k1_fe_t x; /* actual X: x/z^2 */ - secp256k1_fe_t y; /* actual Y: y/z^3 */ - secp256k1_fe_t z; + secp256k1_fe x; /* actual X: x/z^2 */ + secp256k1_fe y; /* actual Y: y/z^3 */ + secp256k1_fe z; int infinity; /* whether this represents the point at infinity */ -} secp256k1_gej_t; +} secp256k1_gej; #define SECP256K1_GEJ_CONST(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) {SECP256K1_FE_CONST((a),(b),(c),(d),(e),(f),(g),(h)), SECP256K1_FE_CONST((i),(j),(k),(l),(m),(n),(o),(p)), SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1), 0} #define SECP256K1_GEJ_CONST_INFINITY {SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), 1} typedef struct { - secp256k1_fe_storage_t x; - secp256k1_fe_storage_t y; -} secp256k1_ge_storage_t; + secp256k1_fe_storage x; + secp256k1_fe_storage y; +} secp256k1_ge_storage; #define SECP256K1_GE_STORAGE_CONST(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) {SECP256K1_FE_STORAGE_CONST((a),(b),(c),(d),(e),(f),(g),(h)), SECP256K1_FE_STORAGE_CONST((i),(j),(k),(l),(m),(n),(o),(p))} -/** Set a group element equal to the point at infinity */ -static void secp256k1_ge_set_infinity(secp256k1_ge_t *r); +#define SECP256K1_GE_STORAGE_CONST_GET(t) SECP256K1_FE_STORAGE_CONST_GET(t.x), SECP256K1_FE_STORAGE_CONST_GET(t.y) /** Set a group element equal to the point with given X and Y coordinates */ -static void secp256k1_ge_set_xy(secp256k1_ge_t *r, const secp256k1_fe_t *x, const secp256k1_fe_t *y); +static void secp256k1_ge_set_xy(secp256k1_ge *r, const secp256k1_fe *x, const secp256k1_fe *y); + +/** Set a group element (affine) equal to the point with the given X coordinate + * and a Y coordinate that is a quadratic residue modulo p. The return value + * is true iff a coordinate with the given X coordinate exists. + */ +static int secp256k1_ge_set_xquad(secp256k1_ge *r, const secp256k1_fe *x); /** Set a group element (affine) equal to the point with the given X coordinate, and given oddness * for Y. Return value indicates whether the result is valid. */ -static int secp256k1_ge_set_xo_var(secp256k1_ge_t *r, const secp256k1_fe_t *x, int odd); +static int secp256k1_ge_set_xo_var(secp256k1_ge *r, const secp256k1_fe *x, int odd); /** Check whether a group element is the point at infinity. */ -static int secp256k1_ge_is_infinity(const secp256k1_ge_t *a); +static int secp256k1_ge_is_infinity(const secp256k1_ge *a); /** Check whether a group element is valid (i.e., on the curve). */ -static int secp256k1_ge_is_valid_var(const secp256k1_ge_t *a); +static int secp256k1_ge_is_valid_var(const secp256k1_ge *a); -static void secp256k1_ge_neg(secp256k1_ge_t *r, const secp256k1_ge_t *a); +static void secp256k1_ge_neg(secp256k1_ge *r, const secp256k1_ge *a); /** Set a group element equal to another which is given in jacobian coordinates */ -static void secp256k1_ge_set_gej(secp256k1_ge_t *r, secp256k1_gej_t *a); +static void secp256k1_ge_set_gej(secp256k1_ge *r, secp256k1_gej *a); /** Set a batch of group elements equal to the inputs given in jacobian coordinates */ -static void secp256k1_ge_set_all_gej_var(size_t len, secp256k1_ge_t *r, const secp256k1_gej_t *a); +static void secp256k1_ge_set_all_gej_var(secp256k1_ge *r, const secp256k1_gej *a, size_t len, const secp256k1_callback *cb); +/** Set a batch of group elements equal to the inputs given in jacobian + * coordinates (with known z-ratios). zr must contain the known z-ratios such + * that mul(a[i].z, zr[i+1]) == a[i+1].z. zr[0] is ignored. */ +static void secp256k1_ge_set_table_gej_var(secp256k1_ge *r, const secp256k1_gej *a, const secp256k1_fe *zr, size_t len); + +/** Bring a batch inputs given in jacobian coordinates (with known z-ratios) to + * the same global z "denominator". zr must contain the known z-ratios such + * that mul(a[i].z, zr[i+1]) == a[i+1].z. zr[0] is ignored. The x and y + * coordinates of the result are stored in r, the common z coordinate is + * stored in globalz. */ +static void secp256k1_ge_globalz_set_table_gej(size_t len, secp256k1_ge *r, secp256k1_fe *globalz, const secp256k1_gej *a, const secp256k1_fe *zr); /** Set a group element (jacobian) equal to the point at infinity. */ -static void secp256k1_gej_set_infinity(secp256k1_gej_t *r); - -/** Set a group element (jacobian) equal to the point with given X and Y coordinates. */ -static void secp256k1_gej_set_xy(secp256k1_gej_t *r, const secp256k1_fe_t *x, const secp256k1_fe_t *y); +static void secp256k1_gej_set_infinity(secp256k1_gej *r); /** Set a group element (jacobian) equal to another which is given in affine coordinates. */ -static void secp256k1_gej_set_ge(secp256k1_gej_t *r, const secp256k1_ge_t *a); +static void secp256k1_gej_set_ge(secp256k1_gej *r, const secp256k1_ge *a); /** Compare the X coordinate of a group element (jacobian). */ -static int secp256k1_gej_eq_x_var(const secp256k1_fe_t *x, const secp256k1_gej_t *a); +static int secp256k1_gej_eq_x_var(const secp256k1_fe *x, const secp256k1_gej *a); /** Set r equal to the inverse of a (i.e., mirrored around the X axis) */ -static void secp256k1_gej_neg(secp256k1_gej_t *r, const secp256k1_gej_t *a); +static void secp256k1_gej_neg(secp256k1_gej *r, const secp256k1_gej *a); /** Check whether a group element is the point at infinity. */ -static int secp256k1_gej_is_infinity(const secp256k1_gej_t *a); +static int secp256k1_gej_is_infinity(const secp256k1_gej *a); -/** Set r equal to the double of a. */ -static void secp256k1_gej_double_var(secp256k1_gej_t *r, const secp256k1_gej_t *a); +/** Check whether a group element's y coordinate is a quadratic residue. */ +static int secp256k1_gej_has_quad_y_var(const secp256k1_gej *a); -/** Set r equal to the sum of a and b. */ -static void secp256k1_gej_add_var(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_gej_t *b); +/** Set r equal to the double of a. If rzr is not-NULL, r->z = a->z * *rzr (where infinity means an implicit z = 0). + * a may not be zero. Constant time. */ +static void secp256k1_gej_double_nonzero(secp256k1_gej *r, const secp256k1_gej *a, secp256k1_fe *rzr); + +/** Set r equal to the double of a. If rzr is not-NULL, r->z = a->z * *rzr (where infinity means an implicit z = 0). */ +static void secp256k1_gej_double_var(secp256k1_gej *r, const secp256k1_gej *a, secp256k1_fe *rzr); + +/** Set r equal to the sum of a and b. If rzr is non-NULL, r->z = a->z * *rzr (a cannot be infinity in that case). */ +static void secp256k1_gej_add_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_gej *b, secp256k1_fe *rzr); /** Set r equal to the sum of a and b (with b given in affine coordinates, and not infinity). */ -static void secp256k1_gej_add_ge(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_ge_t *b); +static void secp256k1_gej_add_ge(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b); /** Set r equal to the sum of a and b (with b given in affine coordinates). This is more efficient than secp256k1_gej_add_var. It is identical to secp256k1_gej_add_ge but without constant-time - guarantee, and b is allowed to be infinity. */ -static void secp256k1_gej_add_ge_var(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_ge_t *b); + guarantee, and b is allowed to be infinity. If rzr is non-NULL, r->z = a->z * *rzr (a cannot be infinity in that case). */ +static void secp256k1_gej_add_ge_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b, secp256k1_fe *rzr); + +/** Set r equal to the sum of a and b (with the inverse of b's Z coordinate passed as bzinv). */ +static void secp256k1_gej_add_zinv_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b, const secp256k1_fe *bzinv); #ifdef USE_ENDOMORPHISM /** Set r to be equal to lambda times a, where lambda is chosen in a way such that this is very fast. */ -static void secp256k1_gej_mul_lambda(secp256k1_gej_t *r, const secp256k1_gej_t *a); +static void secp256k1_ge_mul_lambda(secp256k1_ge *r, const secp256k1_ge *a); #endif -/** Clear a secp256k1_gej_t to prevent leaking sensitive information. */ -static void secp256k1_gej_clear(secp256k1_gej_t *r); +/** Clear a secp256k1_gej to prevent leaking sensitive information. */ +static void secp256k1_gej_clear(secp256k1_gej *r); -/** Clear a secp256k1_ge_t to prevent leaking sensitive information. */ -static void secp256k1_ge_clear(secp256k1_ge_t *r); +/** Clear a secp256k1_ge to prevent leaking sensitive information. */ +static void secp256k1_ge_clear(secp256k1_ge *r); /** Convert a group element to the storage type. */ -static void secp256k1_ge_to_storage(secp256k1_ge_storage_t *r, const secp256k1_ge_t*); +static void secp256k1_ge_to_storage(secp256k1_ge_storage *r, const secp256k1_ge *a); /** Convert a group element back from the storage type. */ -static void secp256k1_ge_from_storage(secp256k1_ge_t *r, const secp256k1_ge_storage_t*); +static void secp256k1_ge_from_storage(secp256k1_ge *r, const secp256k1_ge_storage *a); /** If flag is true, set *r equal to *a; otherwise leave it. Constant-time. */ -static void secp256k1_ge_storage_cmov(secp256k1_ge_storage_t *r, const secp256k1_ge_storage_t *a, int flag); +static void secp256k1_ge_storage_cmov(secp256k1_ge_storage *r, const secp256k1_ge_storage *a, int flag); /** Rescale a jacobian point by b which must be non-zero. Constant-time. */ -static void secp256k1_gej_rescale(secp256k1_gej_t *r, const secp256k1_fe_t *b); +static void secp256k1_gej_rescale(secp256k1_gej *r, const secp256k1_fe *b); #endif diff --git a/src/group_impl.h b/src/group_impl.h index 0f64576fb..7d723532f 100644 --- a/src/group_impl.h +++ b/src/group_impl.h @@ -7,44 +7,98 @@ #ifndef _SECP256K1_GROUP_IMPL_H_ #define _SECP256K1_GROUP_IMPL_H_ -#include - #include "num.h" #include "field.h" #include "group.h" +/* These points can be generated in sage as follows: + * + * 0. Setup a worksheet with the following parameters. + * b = 4 # whatever CURVE_B will be set to + * F = FiniteField (0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F) + * C = EllipticCurve ([F (0), F (b)]) + * + * 1. Determine all the small orders available to you. (If there are + * no satisfactory ones, go back and change b.) + * print C.order().factor(limit=1000) + * + * 2. Choose an order as one of the prime factors listed in the above step. + * (You can also multiply some to get a composite order, though the + * tests will crash trying to invert scalars during signing.) We take a + * random point and scale it to drop its order to the desired value. + * There is some probability this won't work; just try again. + * order = 199 + * P = C.random_point() + * P = (int(P.order()) / int(order)) * P + * assert(P.order() == order) + * + * 3. Print the values. You'll need to use a vim macro or something to + * split the hex output into 4-byte chunks. + * print "%x %x" % P.xy() + */ +#if defined(EXHAUSTIVE_TEST_ORDER) +# if EXHAUSTIVE_TEST_ORDER == 199 +const secp256k1_ge secp256k1_ge_const_g = SECP256K1_GE_CONST( + 0xFA7CC9A7, 0x0737F2DB, 0xA749DD39, 0x2B4FB069, + 0x3B017A7D, 0xA808C2F1, 0xFB12940C, 0x9EA66C18, + 0x78AC123A, 0x5ED8AEF3, 0x8732BC91, 0x1F3A2868, + 0x48DF246C, 0x808DAE72, 0xCFE52572, 0x7F0501ED +); + +const int CURVE_B = 4; +# elif EXHAUSTIVE_TEST_ORDER == 13 +const secp256k1_ge secp256k1_ge_const_g = SECP256K1_GE_CONST( + 0xedc60018, 0xa51a786b, 0x2ea91f4d, 0x4c9416c0, + 0x9de54c3b, 0xa1316554, 0x6cf4345c, 0x7277ef15, + 0x54cb1b6b, 0xdc8c1273, 0x087844ea, 0x43f4603e, + 0x0eaf9a43, 0xf6effe55, 0x939f806d, 0x37adf8ac +); +const int CURVE_B = 2; +# else +# error No known generator for the specified exhaustive test group order. +# endif +#else /** Generator for secp256k1, value 'g' defined in * "Standards for Efficient Cryptography" (SEC2) 2.7.1. */ -static const secp256k1_ge_t secp256k1_ge_const_g = SECP256K1_GE_CONST( +static const secp256k1_ge secp256k1_ge_const_g = SECP256K1_GE_CONST( 0x79BE667EUL, 0xF9DCBBACUL, 0x55A06295UL, 0xCE870B07UL, 0x029BFCDBUL, 0x2DCE28D9UL, 0x59F2815BUL, 0x16F81798UL, 0x483ADA77UL, 0x26A3C465UL, 0x5DA4FBFCUL, 0x0E1108A8UL, 0xFD17B448UL, 0xA6855419UL, 0x9C47D08FUL, 0xFB10D4B8UL ); -static void secp256k1_ge_set_infinity(secp256k1_ge_t *r) { - r->infinity = 1; +const int CURVE_B = 7; +#endif + +static void secp256k1_ge_set_gej_zinv(secp256k1_ge *r, const secp256k1_gej *a, const secp256k1_fe *zi) { + secp256k1_fe zi2; + secp256k1_fe zi3; + secp256k1_fe_sqr(&zi2, zi); + secp256k1_fe_mul(&zi3, &zi2, zi); + secp256k1_fe_mul(&r->x, &a->x, &zi2); + secp256k1_fe_mul(&r->y, &a->y, &zi3); + r->infinity = a->infinity; } -static void secp256k1_ge_set_xy(secp256k1_ge_t *r, const secp256k1_fe_t *x, const secp256k1_fe_t *y) { +static void secp256k1_ge_set_xy(secp256k1_ge *r, const secp256k1_fe *x, const secp256k1_fe *y) { r->infinity = 0; r->x = *x; r->y = *y; } -static int secp256k1_ge_is_infinity(const secp256k1_ge_t *a) { +static int secp256k1_ge_is_infinity(const secp256k1_ge *a) { return a->infinity; } -static void secp256k1_ge_neg(secp256k1_ge_t *r, const secp256k1_ge_t *a) { +static void secp256k1_ge_neg(secp256k1_ge *r, const secp256k1_ge *a) { *r = *a; secp256k1_fe_normalize_weak(&r->y); secp256k1_fe_negate(&r->y, &r->y, 1); } -static void secp256k1_ge_set_gej(secp256k1_ge_t *r, secp256k1_gej_t *a) { - secp256k1_fe_t z2, z3; +static void secp256k1_ge_set_gej(secp256k1_ge *r, secp256k1_gej *a) { + secp256k1_fe z2, z3; r->infinity = a->infinity; secp256k1_fe_inv(&a->z, &a->z); secp256k1_fe_sqr(&z2, &a->z); @@ -56,8 +110,8 @@ static void secp256k1_ge_set_gej(secp256k1_ge_t *r, secp256k1_gej_t *a) { r->y = a->y; } -static void secp256k1_ge_set_gej_var(secp256k1_ge_t *r, secp256k1_gej_t *a) { - secp256k1_fe_t z2, z3; +static void secp256k1_ge_set_gej_var(secp256k1_ge *r, secp256k1_gej *a) { + secp256k1_fe z2, z3; r->infinity = a->infinity; if (a->infinity) { return; @@ -72,73 +126,106 @@ static void secp256k1_ge_set_gej_var(secp256k1_ge_t *r, secp256k1_gej_t *a) { r->y = a->y; } -static void secp256k1_ge_set_all_gej_var(size_t len, secp256k1_ge_t *r, const secp256k1_gej_t *a) { - secp256k1_fe_t *az; - secp256k1_fe_t *azi; +static void secp256k1_ge_set_all_gej_var(secp256k1_ge *r, const secp256k1_gej *a, size_t len, const secp256k1_callback *cb) { + secp256k1_fe *az; + secp256k1_fe *azi; size_t i; size_t count = 0; - az = (secp256k1_fe_t *)checked_malloc(sizeof(secp256k1_fe_t) * len); + az = (secp256k1_fe *)checked_malloc(cb, sizeof(secp256k1_fe) * len); for (i = 0; i < len; i++) { if (!a[i].infinity) { az[count++] = a[i].z; } } - azi = (secp256k1_fe_t *)checked_malloc(sizeof(secp256k1_fe_t) * count); - secp256k1_fe_inv_all_var(count, azi, az); + azi = (secp256k1_fe *)checked_malloc(cb, sizeof(secp256k1_fe) * count); + secp256k1_fe_inv_all_var(azi, az, count); free(az); count = 0; for (i = 0; i < len; i++) { r[i].infinity = a[i].infinity; if (!a[i].infinity) { - secp256k1_fe_t zi2, zi3; - secp256k1_fe_t *zi = &azi[count++]; - secp256k1_fe_sqr(&zi2, zi); - secp256k1_fe_mul(&zi3, &zi2, zi); - secp256k1_fe_mul(&r[i].x, &a[i].x, &zi2); - secp256k1_fe_mul(&r[i].y, &a[i].y, &zi3); + secp256k1_ge_set_gej_zinv(&r[i], &a[i], &azi[count++]); } } free(azi); } -static void secp256k1_gej_set_infinity(secp256k1_gej_t *r) { +static void secp256k1_ge_set_table_gej_var(secp256k1_ge *r, const secp256k1_gej *a, const secp256k1_fe *zr, size_t len) { + size_t i = len - 1; + secp256k1_fe zi; + + if (len > 0) { + /* Compute the inverse of the last z coordinate, and use it to compute the last affine output. */ + secp256k1_fe_inv(&zi, &a[i].z); + secp256k1_ge_set_gej_zinv(&r[i], &a[i], &zi); + + /* Work out way backwards, using the z-ratios to scale the x/y values. */ + while (i > 0) { + secp256k1_fe_mul(&zi, &zi, &zr[i]); + i--; + secp256k1_ge_set_gej_zinv(&r[i], &a[i], &zi); + } + } +} + +static void secp256k1_ge_globalz_set_table_gej(size_t len, secp256k1_ge *r, secp256k1_fe *globalz, const secp256k1_gej *a, const secp256k1_fe *zr) { + size_t i = len - 1; + secp256k1_fe zs; + + if (len > 0) { + /* The z of the final point gives us the "global Z" for the table. */ + r[i].x = a[i].x; + r[i].y = a[i].y; + *globalz = a[i].z; + r[i].infinity = 0; + zs = zr[i]; + + /* Work our way backwards, using the z-ratios to scale the x/y values. */ + while (i > 0) { + if (i != len - 1) { + secp256k1_fe_mul(&zs, &zs, &zr[i]); + } + i--; + secp256k1_ge_set_gej_zinv(&r[i], &a[i], &zs); + } + } +} + +static void secp256k1_gej_set_infinity(secp256k1_gej *r) { r->infinity = 1; - secp256k1_fe_set_int(&r->x, 0); - secp256k1_fe_set_int(&r->y, 0); - secp256k1_fe_set_int(&r->z, 0); + secp256k1_fe_clear(&r->x); + secp256k1_fe_clear(&r->y); + secp256k1_fe_clear(&r->z); } -static void secp256k1_gej_set_xy(secp256k1_gej_t *r, const secp256k1_fe_t *x, const secp256k1_fe_t *y) { - r->infinity = 0; - r->x = *x; - r->y = *y; - secp256k1_fe_set_int(&r->z, 1); -} - -static void secp256k1_gej_clear(secp256k1_gej_t *r) { +static void secp256k1_gej_clear(secp256k1_gej *r) { r->infinity = 0; secp256k1_fe_clear(&r->x); secp256k1_fe_clear(&r->y); secp256k1_fe_clear(&r->z); } -static void secp256k1_ge_clear(secp256k1_ge_t *r) { +static void secp256k1_ge_clear(secp256k1_ge *r) { r->infinity = 0; secp256k1_fe_clear(&r->x); secp256k1_fe_clear(&r->y); } -static int secp256k1_ge_set_xo_var(secp256k1_ge_t *r, const secp256k1_fe_t *x, int odd) { - secp256k1_fe_t x2, x3, c; +static int secp256k1_ge_set_xquad(secp256k1_ge *r, const secp256k1_fe *x) { + secp256k1_fe x2, x3, c; r->x = *x; secp256k1_fe_sqr(&x2, x); secp256k1_fe_mul(&x3, x, &x2); r->infinity = 0; - secp256k1_fe_set_int(&c, 7); + secp256k1_fe_set_int(&c, CURVE_B); secp256k1_fe_add(&c, &x3); - if (!secp256k1_fe_sqrt_var(&r->y, &c)) { + return secp256k1_fe_sqrt(&r->y, &c); +} + +static int secp256k1_ge_set_xo_var(secp256k1_ge *r, const secp256k1_fe *x, int odd) { + if (!secp256k1_ge_set_xquad(r, x)) { return 0; } secp256k1_fe_normalize_var(&r->y); @@ -146,24 +233,25 @@ static int secp256k1_ge_set_xo_var(secp256k1_ge_t *r, const secp256k1_fe_t *x, i secp256k1_fe_negate(&r->y, &r->y, 1); } return 1; + } -static void secp256k1_gej_set_ge(secp256k1_gej_t *r, const secp256k1_ge_t *a) { +static void secp256k1_gej_set_ge(secp256k1_gej *r, const secp256k1_ge *a) { r->infinity = a->infinity; r->x = a->x; r->y = a->y; secp256k1_fe_set_int(&r->z, 1); } -static int secp256k1_gej_eq_x_var(const secp256k1_fe_t *x, const secp256k1_gej_t *a) { - secp256k1_fe_t r, r2; +static int secp256k1_gej_eq_x_var(const secp256k1_fe *x, const secp256k1_gej *a) { + secp256k1_fe r, r2; VERIFY_CHECK(!a->infinity); secp256k1_fe_sqr(&r, &a->z); secp256k1_fe_mul(&r, &r, x); r2 = a->x; secp256k1_fe_normalize_weak(&r2); return secp256k1_fe_equal_var(&r, &r2); } -static void secp256k1_gej_neg(secp256k1_gej_t *r, const secp256k1_gej_t *a) { +static void secp256k1_gej_neg(secp256k1_gej *r, const secp256k1_gej *a) { r->infinity = a->infinity; r->x = a->x; r->y = a->y; @@ -172,12 +260,12 @@ static void secp256k1_gej_neg(secp256k1_gej_t *r, const secp256k1_gej_t *a) { secp256k1_fe_negate(&r->y, &r->y, 1); } -static int secp256k1_gej_is_infinity(const secp256k1_gej_t *a) { +static int secp256k1_gej_is_infinity(const secp256k1_gej *a) { return a->infinity; } -static int secp256k1_gej_is_valid_var(const secp256k1_gej_t *a) { - secp256k1_fe_t y2, x3, z2, z6; +static int secp256k1_gej_is_valid_var(const secp256k1_gej *a) { + secp256k1_fe y2, x3, z2, z6; if (a->infinity) { return 0; } @@ -190,38 +278,59 @@ static int secp256k1_gej_is_valid_var(const secp256k1_gej_t *a) { secp256k1_fe_sqr(&x3, &a->x); secp256k1_fe_mul(&x3, &x3, &a->x); secp256k1_fe_sqr(&z2, &a->z); secp256k1_fe_sqr(&z6, &z2); secp256k1_fe_mul(&z6, &z6, &z2); - secp256k1_fe_mul_int(&z6, 7); + secp256k1_fe_mul_int(&z6, CURVE_B); secp256k1_fe_add(&x3, &z6); secp256k1_fe_normalize_weak(&x3); return secp256k1_fe_equal_var(&y2, &x3); } -static int secp256k1_ge_is_valid_var(const secp256k1_ge_t *a) { - secp256k1_fe_t y2, x3, c; +static int secp256k1_ge_is_valid_var(const secp256k1_ge *a) { + secp256k1_fe y2, x3, c; if (a->infinity) { return 0; } /* y^2 = x^3 + 7 */ secp256k1_fe_sqr(&y2, &a->y); secp256k1_fe_sqr(&x3, &a->x); secp256k1_fe_mul(&x3, &x3, &a->x); - secp256k1_fe_set_int(&c, 7); + secp256k1_fe_set_int(&c, CURVE_B); secp256k1_fe_add(&x3, &c); secp256k1_fe_normalize_weak(&x3); return secp256k1_fe_equal_var(&y2, &x3); } -static void secp256k1_gej_double_var(secp256k1_gej_t *r, const secp256k1_gej_t *a) { - /* Operations: 3 mul, 4 sqr, 0 normalize, 12 mul_int/add/negate */ - secp256k1_fe_t t1,t2,t3,t4; +static void secp256k1_gej_double_var(secp256k1_gej *r, const secp256k1_gej *a, secp256k1_fe *rzr) { + /* Operations: 3 mul, 4 sqr, 0 normalize, 12 mul_int/add/negate. + * + * Note that there is an implementation described at + * https://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-dbl-2009-l + * which trades a multiply for a square, but in practice this is actually slower, + * mainly because it requires more normalizations. + */ + secp256k1_fe t1,t2,t3,t4; /** For secp256k1, 2Q is infinity if and only if Q is infinity. This is because if 2Q = infinity, * Q must equal -Q, or that Q.y == -(Q.y), or Q.y is 0. For a point on y^2 = x^3 + 7 to have * y=0, x^3 must be -7 mod p. However, -7 has no cube root mod p. + * + * Having said this, if this function receives a point on a sextic twist, e.g. by + * a fault attack, it is possible for y to be 0. This happens for y^2 = x^3 + 6, + * since -6 does have a cube root mod p. For this point, this function will not set + * the infinity flag even though the point doubles to infinity, and the result + * point will be gibberish (z = 0 but infinity = 0). */ r->infinity = a->infinity; if (r->infinity) { + if (rzr != NULL) { + secp256k1_fe_set_int(rzr, 1); + } return; } + if (rzr != NULL) { + *rzr = a->y; + secp256k1_fe_normalize_weak(rzr); + secp256k1_fe_mul_int(rzr, 2); + } + secp256k1_fe_mul(&r->z, &a->z, &a->y); secp256k1_fe_mul_int(&r->z, 2); /* Z' = 2*Y*Z (2) */ secp256k1_fe_sqr(&t1, &a->x); @@ -244,17 +353,29 @@ static void secp256k1_gej_double_var(secp256k1_gej_t *r, const secp256k1_gej_t * secp256k1_fe_add(&r->y, &t2); /* Y' = 36*X^3*Y^2 - 27*X^6 - 8*Y^4 (4) */ } -static void secp256k1_gej_add_var(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_gej_t *b) { +static SECP256K1_INLINE void secp256k1_gej_double_nonzero(secp256k1_gej *r, const secp256k1_gej *a, secp256k1_fe *rzr) { + VERIFY_CHECK(!secp256k1_gej_is_infinity(a)); + secp256k1_gej_double_var(r, a, rzr); +} + +static void secp256k1_gej_add_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_gej *b, secp256k1_fe *rzr) { /* Operations: 12 mul, 4 sqr, 2 normalize, 12 mul_int/add/negate */ - secp256k1_fe_t z22, z12, u1, u2, s1, s2, h, i, i2, h2, h3, t; + secp256k1_fe z22, z12, u1, u2, s1, s2, h, i, i2, h2, h3, t; + if (a->infinity) { + VERIFY_CHECK(rzr == NULL); *r = *b; return; } + if (b->infinity) { + if (rzr != NULL) { + secp256k1_fe_set_int(rzr, 1); + } *r = *a; return; } + r->infinity = 0; secp256k1_fe_sqr(&z22, &b->z); secp256k1_fe_sqr(&z12, &a->z); @@ -266,8 +387,11 @@ static void secp256k1_gej_add_var(secp256k1_gej_t *r, const secp256k1_gej_t *a, secp256k1_fe_negate(&i, &s1, 1); secp256k1_fe_add(&i, &s2); if (secp256k1_fe_normalizes_to_zero_var(&h)) { if (secp256k1_fe_normalizes_to_zero_var(&i)) { - secp256k1_gej_double_var(r, a); + secp256k1_gej_double_var(r, a, rzr); } else { + if (rzr != NULL) { + secp256k1_fe_set_int(rzr, 0); + } r->infinity = 1; } return; @@ -275,7 +399,11 @@ static void secp256k1_gej_add_var(secp256k1_gej_t *r, const secp256k1_gej_t *a, secp256k1_fe_sqr(&i2, &i); secp256k1_fe_sqr(&h2, &h); secp256k1_fe_mul(&h3, &h, &h2); - secp256k1_fe_mul(&r->z, &a->z, &b->z); secp256k1_fe_mul(&r->z, &r->z, &h); + secp256k1_fe_mul(&h, &h, &b->z); + if (rzr != NULL) { + *rzr = h; + } + secp256k1_fe_mul(&r->z, &a->z, &h); secp256k1_fe_mul(&t, &u1, &h2); r->x = t; secp256k1_fe_mul_int(&r->x, 2); secp256k1_fe_add(&r->x, &h3); secp256k1_fe_negate(&r->x, &r->x, 3); secp256k1_fe_add(&r->x, &i2); secp256k1_fe_negate(&r->y, &r->x, 5); secp256k1_fe_add(&r->y, &t); secp256k1_fe_mul(&r->y, &r->y, &i); @@ -283,21 +411,23 @@ static void secp256k1_gej_add_var(secp256k1_gej_t *r, const secp256k1_gej_t *a, secp256k1_fe_add(&r->y, &h3); } -static void secp256k1_gej_add_ge_var(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_ge_t *b) { +static void secp256k1_gej_add_ge_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b, secp256k1_fe *rzr) { /* 8 mul, 3 sqr, 4 normalize, 12 mul_int/add/negate */ - secp256k1_fe_t z12, u1, u2, s1, s2, h, i, i2, h2, h3, t; + secp256k1_fe z12, u1, u2, s1, s2, h, i, i2, h2, h3, t; if (a->infinity) { - r->infinity = b->infinity; - r->x = b->x; - r->y = b->y; - secp256k1_fe_set_int(&r->z, 1); + VERIFY_CHECK(rzr == NULL); + secp256k1_gej_set_ge(r, b); return; } if (b->infinity) { + if (rzr != NULL) { + secp256k1_fe_set_int(rzr, 1); + } *r = *a; return; } r->infinity = 0; + secp256k1_fe_sqr(&z12, &a->z); u1 = a->x; secp256k1_fe_normalize_weak(&u1); secp256k1_fe_mul(&u2, &b->x, &z12); @@ -307,7 +437,69 @@ static void secp256k1_gej_add_ge_var(secp256k1_gej_t *r, const secp256k1_gej_t * secp256k1_fe_negate(&i, &s1, 1); secp256k1_fe_add(&i, &s2); if (secp256k1_fe_normalizes_to_zero_var(&h)) { if (secp256k1_fe_normalizes_to_zero_var(&i)) { - secp256k1_gej_double_var(r, a); + secp256k1_gej_double_var(r, a, rzr); + } else { + if (rzr != NULL) { + secp256k1_fe_set_int(rzr, 0); + } + r->infinity = 1; + } + return; + } + secp256k1_fe_sqr(&i2, &i); + secp256k1_fe_sqr(&h2, &h); + secp256k1_fe_mul(&h3, &h, &h2); + if (rzr != NULL) { + *rzr = h; + } + secp256k1_fe_mul(&r->z, &a->z, &h); + secp256k1_fe_mul(&t, &u1, &h2); + r->x = t; secp256k1_fe_mul_int(&r->x, 2); secp256k1_fe_add(&r->x, &h3); secp256k1_fe_negate(&r->x, &r->x, 3); secp256k1_fe_add(&r->x, &i2); + secp256k1_fe_negate(&r->y, &r->x, 5); secp256k1_fe_add(&r->y, &t); secp256k1_fe_mul(&r->y, &r->y, &i); + secp256k1_fe_mul(&h3, &h3, &s1); secp256k1_fe_negate(&h3, &h3, 1); + secp256k1_fe_add(&r->y, &h3); +} + +static void secp256k1_gej_add_zinv_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b, const secp256k1_fe *bzinv) { + /* 9 mul, 3 sqr, 4 normalize, 12 mul_int/add/negate */ + secp256k1_fe az, z12, u1, u2, s1, s2, h, i, i2, h2, h3, t; + + if (b->infinity) { + *r = *a; + return; + } + if (a->infinity) { + secp256k1_fe bzinv2, bzinv3; + r->infinity = b->infinity; + secp256k1_fe_sqr(&bzinv2, bzinv); + secp256k1_fe_mul(&bzinv3, &bzinv2, bzinv); + secp256k1_fe_mul(&r->x, &b->x, &bzinv2); + secp256k1_fe_mul(&r->y, &b->y, &bzinv3); + secp256k1_fe_set_int(&r->z, 1); + return; + } + r->infinity = 0; + + /** We need to calculate (rx,ry,rz) = (ax,ay,az) + (bx,by,1/bzinv). Due to + * secp256k1's isomorphism we can multiply the Z coordinates on both sides + * by bzinv, and get: (rx,ry,rz*bzinv) = (ax,ay,az*bzinv) + (bx,by,1). + * This means that (rx,ry,rz) can be calculated as + * (ax,ay,az*bzinv) + (bx,by,1), when not applying the bzinv factor to rz. + * The variable az below holds the modified Z coordinate for a, which is used + * for the computation of rx and ry, but not for rz. + */ + secp256k1_fe_mul(&az, &a->z, bzinv); + + secp256k1_fe_sqr(&z12, &az); + u1 = a->x; secp256k1_fe_normalize_weak(&u1); + secp256k1_fe_mul(&u2, &b->x, &z12); + s1 = a->y; secp256k1_fe_normalize_weak(&s1); + secp256k1_fe_mul(&s2, &b->y, &z12); secp256k1_fe_mul(&s2, &s2, &az); + secp256k1_fe_negate(&h, &u1, 1); secp256k1_fe_add(&h, &u2); + secp256k1_fe_negate(&i, &s1, 1); secp256k1_fe_add(&i, &s2); + if (secp256k1_fe_normalizes_to_zero_var(&h)) { + if (secp256k1_fe_normalizes_to_zero_var(&i)) { + secp256k1_gej_double_var(r, a, NULL); } else { r->infinity = 1; } @@ -324,11 +516,13 @@ static void secp256k1_gej_add_ge_var(secp256k1_gej_t *r, const secp256k1_gej_t * secp256k1_fe_add(&r->y, &h3); } -static void secp256k1_gej_add_ge(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_ge_t *b) { - /* Operations: 7 mul, 5 sqr, 5 normalize, 17 mul_int/add/negate/cmov */ - static const secp256k1_fe_t fe_1 = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1); - secp256k1_fe_t zz, u1, u2, s1, s2, z, t, m, n, q, rr; - int infinity; + +static void secp256k1_gej_add_ge(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b) { + /* Operations: 7 mul, 5 sqr, 4 normalize, 21 mul_int/add/negate/cmov */ + static const secp256k1_fe fe_1 = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1); + secp256k1_fe zz, u1, u2, s1, s2, t, tt, m, n, q, rr; + secp256k1_fe m_alt, rr_alt; + int infinity, degenerate; VERIFY_CHECK(!b->infinity); VERIFY_CHECK(a->infinity == 0 || a->infinity == 1); @@ -352,53 +546,102 @@ static void secp256k1_gej_add_ge(secp256k1_gej_t *r, const secp256k1_gej_t *a, c * Y3 = 4*(R*(3*Q-2*R^2)-M^4) * Z3 = 2*M*Z * (Note that the paper uses xi = Xi / Zi and yi = Yi / Zi instead.) + * + * This formula has the benefit of being the same for both addition + * of distinct points and doubling. However, it breaks down in the + * case that either point is infinity, or that y1 = -y2. We handle + * these cases in the following ways: + * + * - If b is infinity we simply bail by means of a VERIFY_CHECK. + * + * - If a is infinity, we detect this, and at the end of the + * computation replace the result (which will be meaningless, + * but we compute to be constant-time) with b.x : b.y : 1. + * + * - If a = -b, we have y1 = -y2, which is a degenerate case. + * But here the answer is infinity, so we simply set the + * infinity flag of the result, overriding the computed values + * without even needing to cmov. + * + * - If y1 = -y2 but x1 != x2, which does occur thanks to certain + * properties of our curve (specifically, 1 has nontrivial cube + * roots in our field, and the curve equation has no x coefficient) + * then the answer is not infinity but also not given by the above + * equation. In this case, we cmov in place an alternate expression + * for lambda. Specifically (y1 - y2)/(x1 - x2). Where both these + * expressions for lambda are defined, they are equal, and can be + * obtained from each other by multiplication by (y1 + y2)/(y1 + y2) + * then substitution of x^3 + 7 for y^2 (using the curve equation). + * For all pairs of nonzero points (a, b) at least one is defined, + * so this covers everything. */ secp256k1_fe_sqr(&zz, &a->z); /* z = Z1^2 */ u1 = a->x; secp256k1_fe_normalize_weak(&u1); /* u1 = U1 = X1*Z2^2 (1) */ secp256k1_fe_mul(&u2, &b->x, &zz); /* u2 = U2 = X2*Z1^2 (1) */ s1 = a->y; secp256k1_fe_normalize_weak(&s1); /* s1 = S1 = Y1*Z2^3 (1) */ - secp256k1_fe_mul(&s2, &b->y, &zz); /* s2 = Y2*Z2^2 (1) */ + secp256k1_fe_mul(&s2, &b->y, &zz); /* s2 = Y2*Z1^2 (1) */ secp256k1_fe_mul(&s2, &s2, &a->z); /* s2 = S2 = Y2*Z1^3 (1) */ - z = a->z; /* z = Z = Z1*Z2 (8) */ t = u1; secp256k1_fe_add(&t, &u2); /* t = T = U1+U2 (2) */ m = s1; secp256k1_fe_add(&m, &s2); /* m = M = S1+S2 (2) */ - secp256k1_fe_sqr(&n, &m); /* n = M^2 (1) */ - secp256k1_fe_mul(&q, &n, &t); /* q = Q = T*M^2 (1) */ - secp256k1_fe_sqr(&n, &n); /* n = M^4 (1) */ secp256k1_fe_sqr(&rr, &t); /* rr = T^2 (1) */ - secp256k1_fe_mul(&t, &u1, &u2); secp256k1_fe_negate(&t, &t, 1); /* t = -U1*U2 (2) */ - secp256k1_fe_add(&rr, &t); /* rr = R = T^2-U1*U2 (3) */ - secp256k1_fe_sqr(&t, &rr); /* t = R^2 (1) */ - secp256k1_fe_mul(&r->z, &m, &z); /* r->z = M*Z (1) */ - infinity = secp256k1_fe_normalizes_to_zero(&r->z) * (1 - a->infinity); - secp256k1_fe_mul_int(&r->z, 2 * (1 - a->infinity)); /* r->z = Z3 = 2*M*Z (2) */ - r->x = t; /* r->x = R^2 (1) */ - secp256k1_fe_negate(&q, &q, 1); /* q = -Q (2) */ - secp256k1_fe_add(&r->x, &q); /* r->x = R^2-Q (3) */ - secp256k1_fe_normalize(&r->x); - secp256k1_fe_mul_int(&q, 3); /* q = -3*Q (6) */ - secp256k1_fe_mul_int(&t, 2); /* t = 2*R^2 (2) */ - secp256k1_fe_add(&t, &q); /* t = 2*R^2-3*Q (8) */ - secp256k1_fe_mul(&t, &t, &rr); /* t = R*(2*R^2-3*Q) (1) */ - secp256k1_fe_add(&t, &n); /* t = R*(2*R^2-3*Q)+M^4 (2) */ - secp256k1_fe_negate(&r->y, &t, 2); /* r->y = R*(3*Q-2*R^2)-M^4 (3) */ - secp256k1_fe_normalize_weak(&r->y); - secp256k1_fe_mul_int(&r->x, 4 * (1 - a->infinity)); /* r->x = X3 = 4*(R^2-Q) */ - secp256k1_fe_mul_int(&r->y, 4 * (1 - a->infinity)); /* r->y = Y3 = 4*R*(3*Q-2*R^2)-4*M^4 (4) */ + secp256k1_fe_negate(&m_alt, &u2, 1); /* Malt = -X2*Z1^2 */ + secp256k1_fe_mul(&tt, &u1, &m_alt); /* tt = -U1*U2 (2) */ + secp256k1_fe_add(&rr, &tt); /* rr = R = T^2-U1*U2 (3) */ + /** If lambda = R/M = 0/0 we have a problem (except in the "trivial" + * case that Z = z1z2 = 0, and this is special-cased later on). */ + degenerate = secp256k1_fe_normalizes_to_zero(&m) & + secp256k1_fe_normalizes_to_zero(&rr); + /* This only occurs when y1 == -y2 and x1^3 == x2^3, but x1 != x2. + * This means either x1 == beta*x2 or beta*x1 == x2, where beta is + * a nontrivial cube root of one. In either case, an alternate + * non-indeterminate expression for lambda is (y1 - y2)/(x1 - x2), + * so we set R/M equal to this. */ + rr_alt = s1; + secp256k1_fe_mul_int(&rr_alt, 2); /* rr = Y1*Z2^3 - Y2*Z1^3 (2) */ + secp256k1_fe_add(&m_alt, &u1); /* Malt = X1*Z2^2 - X2*Z1^2 */ - /** In case a->infinity == 1, the above code results in r->x, r->y, and r->z all equal to 0. - * Replace r with b->x, b->y, 1 in that case. - */ + secp256k1_fe_cmov(&rr_alt, &rr, !degenerate); + secp256k1_fe_cmov(&m_alt, &m, !degenerate); + /* Now Ralt / Malt = lambda and is guaranteed not to be 0/0. + * From here on out Ralt and Malt represent the numerator + * and denominator of lambda; R and M represent the explicit + * expressions x1^2 + x2^2 + x1x2 and y1 + y2. */ + secp256k1_fe_sqr(&n, &m_alt); /* n = Malt^2 (1) */ + secp256k1_fe_mul(&q, &n, &t); /* q = Q = T*Malt^2 (1) */ + /* These two lines use the observation that either M == Malt or M == 0, + * so M^3 * Malt is either Malt^4 (which is computed by squaring), or + * zero (which is "computed" by cmov). So the cost is one squaring + * versus two multiplications. */ + secp256k1_fe_sqr(&n, &n); + secp256k1_fe_cmov(&n, &m, degenerate); /* n = M^3 * Malt (2) */ + secp256k1_fe_sqr(&t, &rr_alt); /* t = Ralt^2 (1) */ + secp256k1_fe_mul(&r->z, &a->z, &m_alt); /* r->z = Malt*Z (1) */ + infinity = secp256k1_fe_normalizes_to_zero(&r->z) * (1 - a->infinity); + secp256k1_fe_mul_int(&r->z, 2); /* r->z = Z3 = 2*Malt*Z (2) */ + secp256k1_fe_negate(&q, &q, 1); /* q = -Q (2) */ + secp256k1_fe_add(&t, &q); /* t = Ralt^2-Q (3) */ + secp256k1_fe_normalize_weak(&t); + r->x = t; /* r->x = Ralt^2-Q (1) */ + secp256k1_fe_mul_int(&t, 2); /* t = 2*x3 (2) */ + secp256k1_fe_add(&t, &q); /* t = 2*x3 - Q: (4) */ + secp256k1_fe_mul(&t, &t, &rr_alt); /* t = Ralt*(2*x3 - Q) (1) */ + secp256k1_fe_add(&t, &n); /* t = Ralt*(2*x3 - Q) + M^3*Malt (3) */ + secp256k1_fe_negate(&r->y, &t, 3); /* r->y = Ralt*(Q - 2x3) - M^3*Malt (4) */ + secp256k1_fe_normalize_weak(&r->y); + secp256k1_fe_mul_int(&r->x, 4); /* r->x = X3 = 4*(Ralt^2-Q) */ + secp256k1_fe_mul_int(&r->y, 4); /* r->y = Y3 = 4*Ralt*(Q - 2x3) - 4*M^3*Malt (4) */ + + /** In case a->infinity == 1, replace r with (b->x, b->y, 1). */ secp256k1_fe_cmov(&r->x, &b->x, a->infinity); secp256k1_fe_cmov(&r->y, &b->y, a->infinity); secp256k1_fe_cmov(&r->z, &fe_1, a->infinity); r->infinity = infinity; } -static void secp256k1_gej_rescale(secp256k1_gej_t *r, const secp256k1_fe_t *s) { +static void secp256k1_gej_rescale(secp256k1_gej *r, const secp256k1_fe *s) { /* Operations: 4 mul, 1 sqr */ - secp256k1_fe_t zz; + secp256k1_fe zz; VERIFY_CHECK(!secp256k1_fe_is_zero(s)); secp256k1_fe_sqr(&zz, s); secp256k1_fe_mul(&r->x, &r->x, &zz); /* r->x *= s^2 */ @@ -407,8 +650,8 @@ static void secp256k1_gej_rescale(secp256k1_gej_t *r, const secp256k1_fe_t *s) { secp256k1_fe_mul(&r->z, &r->z, s); /* r->z *= s */ } -static void secp256k1_ge_to_storage(secp256k1_ge_storage_t *r, const secp256k1_ge_t *a) { - secp256k1_fe_t x, y; +static void secp256k1_ge_to_storage(secp256k1_ge_storage *r, const secp256k1_ge *a) { + secp256k1_fe x, y; VERIFY_CHECK(!a->infinity); x = a->x; secp256k1_fe_normalize(&x); @@ -418,20 +661,20 @@ static void secp256k1_ge_to_storage(secp256k1_ge_storage_t *r, const secp256k1_g secp256k1_fe_to_storage(&r->y, &y); } -static void secp256k1_ge_from_storage(secp256k1_ge_t *r, const secp256k1_ge_storage_t *a) { +static void secp256k1_ge_from_storage(secp256k1_ge *r, const secp256k1_ge_storage *a) { secp256k1_fe_from_storage(&r->x, &a->x); secp256k1_fe_from_storage(&r->y, &a->y); r->infinity = 0; } -static SECP256K1_INLINE void secp256k1_ge_storage_cmov(secp256k1_ge_storage_t *r, const secp256k1_ge_storage_t *a, int flag) { +static SECP256K1_INLINE void secp256k1_ge_storage_cmov(secp256k1_ge_storage *r, const secp256k1_ge_storage *a, int flag) { secp256k1_fe_storage_cmov(&r->x, &a->x, flag); secp256k1_fe_storage_cmov(&r->y, &a->y, flag); } #ifdef USE_ENDOMORPHISM -static void secp256k1_gej_mul_lambda(secp256k1_gej_t *r, const secp256k1_gej_t *a) { - static const secp256k1_fe_t beta = SECP256K1_FE_CONST( +static void secp256k1_ge_mul_lambda(secp256k1_ge *r, const secp256k1_ge *a) { + static const secp256k1_fe beta = SECP256K1_FE_CONST( 0x7ae96a2bul, 0x657c0710ul, 0x6e64479eul, 0xac3434e9ul, 0x9cf04975ul, 0x12f58995ul, 0xc1396c28ul, 0x719501eeul ); @@ -440,4 +683,18 @@ static void secp256k1_gej_mul_lambda(secp256k1_gej_t *r, const secp256k1_gej_t * } #endif +static int secp256k1_gej_has_quad_y_var(const secp256k1_gej *a) { + secp256k1_fe yz; + + if (a->infinity) { + return 0; + } + + /* We rely on the fact that the Jacobi symbol of 1 / a->z^3 is the same as + * that of a->z. Thus a->y / a->z^3 is a quadratic residue iff a->y * a->z + is */ + secp256k1_fe_mul(&yz, &a->y, &a->z); + return secp256k1_fe_is_quad_var(&yz); +} + #endif diff --git a/src/hash.h b/src/hash.h index 843423d7f..fca98cab9 100644 --- a/src/hash.h +++ b/src/hash.h @@ -11,7 +11,7 @@ #include typedef struct { - uint32_t s[32]; + uint32_t s[8]; uint32_t buf[16]; /* In big endian */ size_t bytes; } secp256k1_sha256_t; @@ -34,7 +34,7 @@ typedef struct { int retry; } secp256k1_rfc6979_hmac_sha256_t; -static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha256_t *rng, const unsigned char *key, size_t keylen, const unsigned char *msg, size_t msglen, const unsigned char *rnd, size_t rndlen); +static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha256_t *rng, const unsigned char *key, size_t keylen); static void secp256k1_rfc6979_hmac_sha256_generate(secp256k1_rfc6979_hmac_sha256_t *rng, unsigned char *out, size_t outlen); static void secp256k1_rfc6979_hmac_sha256_finalize(secp256k1_rfc6979_hmac_sha256_t *rng); diff --git a/src/hash_impl.h b/src/hash_impl.h index 9828827bc..b47e65f83 100644 --- a/src/hash_impl.h +++ b/src/hash_impl.h @@ -202,7 +202,7 @@ static void secp256k1_hmac_sha256_finalize(secp256k1_hmac_sha256_t *hash, unsign } -static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha256_t *rng, const unsigned char *key, size_t keylen, const unsigned char *msg, size_t msglen, const unsigned char *rnd, size_t rndlen) { +static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha256_t *rng, const unsigned char *key, size_t keylen) { secp256k1_hmac_sha256_t hmac; static const unsigned char zero[1] = {0x00}; static const unsigned char one[1] = {0x01}; @@ -215,11 +215,6 @@ static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha2 secp256k1_hmac_sha256_write(&hmac, rng->v, 32); secp256k1_hmac_sha256_write(&hmac, zero, 1); secp256k1_hmac_sha256_write(&hmac, key, keylen); - secp256k1_hmac_sha256_write(&hmac, msg, msglen); - if (rnd && rndlen) { - /* RFC6979 3.6 "Additional data". */ - secp256k1_hmac_sha256_write(&hmac, rnd, rndlen); - } secp256k1_hmac_sha256_finalize(&hmac, rng->k); secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); secp256k1_hmac_sha256_write(&hmac, rng->v, 32); @@ -230,11 +225,6 @@ static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha2 secp256k1_hmac_sha256_write(&hmac, rng->v, 32); secp256k1_hmac_sha256_write(&hmac, one, 1); secp256k1_hmac_sha256_write(&hmac, key, keylen); - secp256k1_hmac_sha256_write(&hmac, msg, msglen); - if (rnd && rndlen) { - /* RFC6979 3.6 "Additional data". */ - secp256k1_hmac_sha256_write(&hmac, rnd, rndlen); - } secp256k1_hmac_sha256_finalize(&hmac, rng->k); secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); secp256k1_hmac_sha256_write(&hmac, rng->v, 32); @@ -279,15 +269,13 @@ static void secp256k1_rfc6979_hmac_sha256_finalize(secp256k1_rfc6979_hmac_sha256 rng->retry = 0; } - +#undef BE32 #undef Round -#undef sigma0 #undef sigma1 -#undef Sigma0 +#undef sigma0 #undef Sigma1 -#undef Ch +#undef Sigma0 #undef Maj -#undef ReadBE32 -#undef WriteBE32 +#undef Ch #endif diff --git a/src/java/org/bitcoin/NativeSecp256k1.java b/src/java/org/bitcoin/NativeSecp256k1.java index 90a498eaa..1c67802fb 100644 --- a/src/java/org/bitcoin/NativeSecp256k1.java +++ b/src/java/org/bitcoin/NativeSecp256k1.java @@ -1,60 +1,446 @@ +/* + * Copyright 2013 Google Inc. + * Copyright 2014-2016 the libsecp256k1 contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.bitcoin; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.math.BigInteger; import com.google.common.base.Preconditions; - +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantReadWriteLock; +import static org.bitcoin.NativeSecp256k1Util.*; /** - * This class holds native methods to handle ECDSA verification. - * You can find an example library that can be used for this at - * https://github.com/sipa/secp256k1 + *

This class holds native methods to handle ECDSA verification.

+ * + *

You can find an example library that can be used for this at https://github.com/bitcoin/secp256k1

+ * + *

To build secp256k1 for use with bitcoinj, run + * `./configure --enable-jni --enable-experimental --enable-module-ecdh` + * and `make` then copy `.libs/libsecp256k1.so` to your system library path + * or point the JVM to the folder containing it with -Djava.library.path + *

*/ public class NativeSecp256k1 { - public static final boolean enabled; - static { - boolean isEnabled = true; - try { - System.loadLibrary("javasecp256k1"); - } catch (UnsatisfiedLinkError e) { - isEnabled = false; - } - enabled = isEnabled; - } - + + private static final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); + private static final Lock r = rwl.readLock(); + private static final Lock w = rwl.writeLock(); private static ThreadLocal nativeECDSABuffer = new ThreadLocal(); /** * Verifies the given secp256k1 signature in native code. * Calling when enabled == false is undefined (probably library not loaded) - * + * * @param data The data which was signed, must be exactly 32 bytes * @param signature The signature * @param pub The public key which did the signing */ - public static boolean verify(byte[] data, byte[] signature, byte[] pub) { + public static boolean verify(byte[] data, byte[] signature, byte[] pub) throws AssertFailException{ Preconditions.checkArgument(data.length == 32 && signature.length <= 520 && pub.length <= 520); ByteBuffer byteBuff = nativeECDSABuffer.get(); - if (byteBuff == null) { - byteBuff = ByteBuffer.allocateDirect(32 + 8 + 520 + 520); + if (byteBuff == null || byteBuff.capacity() < 520) { + byteBuff = ByteBuffer.allocateDirect(520); byteBuff.order(ByteOrder.nativeOrder()); nativeECDSABuffer.set(byteBuff); } byteBuff.rewind(); byteBuff.put(data); - byteBuff.putInt(signature.length); - byteBuff.putInt(pub.length); byteBuff.put(signature); byteBuff.put(pub); - return secp256k1_ecdsa_verify(byteBuff) == 1; + + byte[][] retByteArray; + + r.lock(); + try { + return secp256k1_ecdsa_verify(byteBuff, Secp256k1Context.getContext(), signature.length, pub.length) == 1; + } finally { + r.unlock(); + } } /** - * @param byteBuff signature format is byte[32] data, - * native-endian int signatureLength, native-endian int pubkeyLength, - * byte[signatureLength] signature, byte[pubkeyLength] pub - * @returns 1 for valid signature, anything else for invalid + * libsecp256k1 Create an ECDSA signature. + * + * @param data Message hash, 32 bytes + * @param key Secret key, 32 bytes + * + * Return values + * @param sig byte array of signature */ - private static native int secp256k1_ecdsa_verify(ByteBuffer byteBuff); + public static byte[] sign(byte[] data, byte[] sec) throws AssertFailException{ + Preconditions.checkArgument(data.length == 32 && sec.length <= 32); + + ByteBuffer byteBuff = nativeECDSABuffer.get(); + if (byteBuff == null || byteBuff.capacity() < 32 + 32) { + byteBuff = ByteBuffer.allocateDirect(32 + 32); + byteBuff.order(ByteOrder.nativeOrder()); + nativeECDSABuffer.set(byteBuff); + } + byteBuff.rewind(); + byteBuff.put(data); + byteBuff.put(sec); + + byte[][] retByteArray; + + r.lock(); + try { + retByteArray = secp256k1_ecdsa_sign(byteBuff, Secp256k1Context.getContext()); + } finally { + r.unlock(); + } + + byte[] sigArr = retByteArray[0]; + int sigLen = new BigInteger(new byte[] { retByteArray[1][0] }).intValue(); + int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue(); + + assertEquals(sigArr.length, sigLen, "Got bad signature length."); + + return retVal == 0 ? new byte[0] : sigArr; + } + + /** + * libsecp256k1 Seckey Verify - returns 1 if valid, 0 if invalid + * + * @param seckey ECDSA Secret key, 32 bytes + */ + public static boolean secKeyVerify(byte[] seckey) { + Preconditions.checkArgument(seckey.length == 32); + + ByteBuffer byteBuff = nativeECDSABuffer.get(); + if (byteBuff == null || byteBuff.capacity() < seckey.length) { + byteBuff = ByteBuffer.allocateDirect(seckey.length); + byteBuff.order(ByteOrder.nativeOrder()); + nativeECDSABuffer.set(byteBuff); + } + byteBuff.rewind(); + byteBuff.put(seckey); + + r.lock(); + try { + return secp256k1_ec_seckey_verify(byteBuff,Secp256k1Context.getContext()) == 1; + } finally { + r.unlock(); + } + } + + + /** + * libsecp256k1 Compute Pubkey - computes public key from secret key + * + * @param seckey ECDSA Secret key, 32 bytes + * + * Return values + * @param pubkey ECDSA Public key, 33 or 65 bytes + */ + //TODO add a 'compressed' arg + public static byte[] computePubkey(byte[] seckey) throws AssertFailException{ + Preconditions.checkArgument(seckey.length == 32); + + ByteBuffer byteBuff = nativeECDSABuffer.get(); + if (byteBuff == null || byteBuff.capacity() < seckey.length) { + byteBuff = ByteBuffer.allocateDirect(seckey.length); + byteBuff.order(ByteOrder.nativeOrder()); + nativeECDSABuffer.set(byteBuff); + } + byteBuff.rewind(); + byteBuff.put(seckey); + + byte[][] retByteArray; + + r.lock(); + try { + retByteArray = secp256k1_ec_pubkey_create(byteBuff, Secp256k1Context.getContext()); + } finally { + r.unlock(); + } + + byte[] pubArr = retByteArray[0]; + int pubLen = new BigInteger(new byte[] { retByteArray[1][0] }).intValue(); + int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue(); + + assertEquals(pubArr.length, pubLen, "Got bad pubkey length."); + + return retVal == 0 ? new byte[0]: pubArr; + } + + /** + * libsecp256k1 Cleanup - This destroys the secp256k1 context object + * This should be called at the end of the program for proper cleanup of the context. + */ + public static synchronized void cleanup() { + w.lock(); + try { + secp256k1_destroy_context(Secp256k1Context.getContext()); + } finally { + w.unlock(); + } + } + + public static long cloneContext() { + r.lock(); + try { + return secp256k1_ctx_clone(Secp256k1Context.getContext()); + } finally { r.unlock(); } + } + + /** + * libsecp256k1 PrivKey Tweak-Mul - Tweak privkey by multiplying to it + * + * @param tweak some bytes to tweak with + * @param seckey 32-byte seckey + */ + public static byte[] privKeyTweakMul(byte[] privkey, byte[] tweak) throws AssertFailException{ + Preconditions.checkArgument(privkey.length == 32); + + ByteBuffer byteBuff = nativeECDSABuffer.get(); + if (byteBuff == null || byteBuff.capacity() < privkey.length + tweak.length) { + byteBuff = ByteBuffer.allocateDirect(privkey.length + tweak.length); + byteBuff.order(ByteOrder.nativeOrder()); + nativeECDSABuffer.set(byteBuff); + } + byteBuff.rewind(); + byteBuff.put(privkey); + byteBuff.put(tweak); + + byte[][] retByteArray; + r.lock(); + try { + retByteArray = secp256k1_privkey_tweak_mul(byteBuff,Secp256k1Context.getContext()); + } finally { + r.unlock(); + } + + byte[] privArr = retByteArray[0]; + + int privLen = (byte) new BigInteger(new byte[] { retByteArray[1][0] }).intValue() & 0xFF; + int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue(); + + assertEquals(privArr.length, privLen, "Got bad pubkey length."); + + assertEquals(retVal, 1, "Failed return value check."); + + return privArr; + } + + /** + * libsecp256k1 PrivKey Tweak-Add - Tweak privkey by adding to it + * + * @param tweak some bytes to tweak with + * @param seckey 32-byte seckey + */ + public static byte[] privKeyTweakAdd(byte[] privkey, byte[] tweak) throws AssertFailException{ + Preconditions.checkArgument(privkey.length == 32); + + ByteBuffer byteBuff = nativeECDSABuffer.get(); + if (byteBuff == null || byteBuff.capacity() < privkey.length + tweak.length) { + byteBuff = ByteBuffer.allocateDirect(privkey.length + tweak.length); + byteBuff.order(ByteOrder.nativeOrder()); + nativeECDSABuffer.set(byteBuff); + } + byteBuff.rewind(); + byteBuff.put(privkey); + byteBuff.put(tweak); + + byte[][] retByteArray; + r.lock(); + try { + retByteArray = secp256k1_privkey_tweak_add(byteBuff,Secp256k1Context.getContext()); + } finally { + r.unlock(); + } + + byte[] privArr = retByteArray[0]; + + int privLen = (byte) new BigInteger(new byte[] { retByteArray[1][0] }).intValue() & 0xFF; + int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue(); + + assertEquals(privArr.length, privLen, "Got bad pubkey length."); + + assertEquals(retVal, 1, "Failed return value check."); + + return privArr; + } + + /** + * libsecp256k1 PubKey Tweak-Add - Tweak pubkey by adding to it + * + * @param tweak some bytes to tweak with + * @param pubkey 32-byte seckey + */ + public static byte[] pubKeyTweakAdd(byte[] pubkey, byte[] tweak) throws AssertFailException{ + Preconditions.checkArgument(pubkey.length == 33 || pubkey.length == 65); + + ByteBuffer byteBuff = nativeECDSABuffer.get(); + if (byteBuff == null || byteBuff.capacity() < pubkey.length + tweak.length) { + byteBuff = ByteBuffer.allocateDirect(pubkey.length + tweak.length); + byteBuff.order(ByteOrder.nativeOrder()); + nativeECDSABuffer.set(byteBuff); + } + byteBuff.rewind(); + byteBuff.put(pubkey); + byteBuff.put(tweak); + + byte[][] retByteArray; + r.lock(); + try { + retByteArray = secp256k1_pubkey_tweak_add(byteBuff,Secp256k1Context.getContext(), pubkey.length); + } finally { + r.unlock(); + } + + byte[] pubArr = retByteArray[0]; + + int pubLen = (byte) new BigInteger(new byte[] { retByteArray[1][0] }).intValue() & 0xFF; + int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue(); + + assertEquals(pubArr.length, pubLen, "Got bad pubkey length."); + + assertEquals(retVal, 1, "Failed return value check."); + + return pubArr; + } + + /** + * libsecp256k1 PubKey Tweak-Mul - Tweak pubkey by multiplying to it + * + * @param tweak some bytes to tweak with + * @param pubkey 32-byte seckey + */ + public static byte[] pubKeyTweakMul(byte[] pubkey, byte[] tweak) throws AssertFailException{ + Preconditions.checkArgument(pubkey.length == 33 || pubkey.length == 65); + + ByteBuffer byteBuff = nativeECDSABuffer.get(); + if (byteBuff == null || byteBuff.capacity() < pubkey.length + tweak.length) { + byteBuff = ByteBuffer.allocateDirect(pubkey.length + tweak.length); + byteBuff.order(ByteOrder.nativeOrder()); + nativeECDSABuffer.set(byteBuff); + } + byteBuff.rewind(); + byteBuff.put(pubkey); + byteBuff.put(tweak); + + byte[][] retByteArray; + r.lock(); + try { + retByteArray = secp256k1_pubkey_tweak_mul(byteBuff,Secp256k1Context.getContext(), pubkey.length); + } finally { + r.unlock(); + } + + byte[] pubArr = retByteArray[0]; + + int pubLen = (byte) new BigInteger(new byte[] { retByteArray[1][0] }).intValue() & 0xFF; + int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue(); + + assertEquals(pubArr.length, pubLen, "Got bad pubkey length."); + + assertEquals(retVal, 1, "Failed return value check."); + + return pubArr; + } + + /** + * libsecp256k1 create ECDH secret - constant time ECDH calculation + * + * @param seckey byte array of secret key used in exponentiaion + * @param pubkey byte array of public key used in exponentiaion + */ + public static byte[] createECDHSecret(byte[] seckey, byte[] pubkey) throws AssertFailException{ + Preconditions.checkArgument(seckey.length <= 32 && pubkey.length <= 65); + + ByteBuffer byteBuff = nativeECDSABuffer.get(); + if (byteBuff == null || byteBuff.capacity() < 32 + pubkey.length) { + byteBuff = ByteBuffer.allocateDirect(32 + pubkey.length); + byteBuff.order(ByteOrder.nativeOrder()); + nativeECDSABuffer.set(byteBuff); + } + byteBuff.rewind(); + byteBuff.put(seckey); + byteBuff.put(pubkey); + + byte[][] retByteArray; + r.lock(); + try { + retByteArray = secp256k1_ecdh(byteBuff, Secp256k1Context.getContext(), pubkey.length); + } finally { + r.unlock(); + } + + byte[] resArr = retByteArray[0]; + int retVal = new BigInteger(new byte[] { retByteArray[1][0] }).intValue(); + + assertEquals(resArr.length, 32, "Got bad result length."); + assertEquals(retVal, 1, "Failed return value check."); + + return resArr; + } + + /** + * libsecp256k1 randomize - updates the context randomization + * + * @param seed 32-byte random seed + */ + public static synchronized boolean randomize(byte[] seed) throws AssertFailException{ + Preconditions.checkArgument(seed.length == 32 || seed == null); + + ByteBuffer byteBuff = nativeECDSABuffer.get(); + if (byteBuff == null || byteBuff.capacity() < seed.length) { + byteBuff = ByteBuffer.allocateDirect(seed.length); + byteBuff.order(ByteOrder.nativeOrder()); + nativeECDSABuffer.set(byteBuff); + } + byteBuff.rewind(); + byteBuff.put(seed); + + w.lock(); + try { + return secp256k1_context_randomize(byteBuff, Secp256k1Context.getContext()) == 1; + } finally { + w.unlock(); + } + } + + private static native long secp256k1_ctx_clone(long context); + + private static native int secp256k1_context_randomize(ByteBuffer byteBuff, long context); + + private static native byte[][] secp256k1_privkey_tweak_add(ByteBuffer byteBuff, long context); + + private static native byte[][] secp256k1_privkey_tweak_mul(ByteBuffer byteBuff, long context); + + private static native byte[][] secp256k1_pubkey_tweak_add(ByteBuffer byteBuff, long context, int pubLen); + + private static native byte[][] secp256k1_pubkey_tweak_mul(ByteBuffer byteBuff, long context, int pubLen); + + private static native void secp256k1_destroy_context(long context); + + private static native int secp256k1_ecdsa_verify(ByteBuffer byteBuff, long context, int sigLen, int pubLen); + + private static native byte[][] secp256k1_ecdsa_sign(ByteBuffer byteBuff, long context); + + private static native int secp256k1_ec_seckey_verify(ByteBuffer byteBuff, long context); + + private static native byte[][] secp256k1_ec_pubkey_create(ByteBuffer byteBuff, long context); + + private static native byte[][] secp256k1_ec_pubkey_parse(ByteBuffer byteBuff, long context, int inputLen); + + private static native byte[][] secp256k1_ecdh(ByteBuffer byteBuff, long context, int inputLen); + } diff --git a/src/java/org/bitcoin/NativeSecp256k1Test.java b/src/java/org/bitcoin/NativeSecp256k1Test.java new file mode 100644 index 000000000..c00d08899 --- /dev/null +++ b/src/java/org/bitcoin/NativeSecp256k1Test.java @@ -0,0 +1,226 @@ +package org.bitcoin; + +import com.google.common.io.BaseEncoding; +import java.util.Arrays; +import java.math.BigInteger; +import javax.xml.bind.DatatypeConverter; +import static org.bitcoin.NativeSecp256k1Util.*; + +/** + * This class holds test cases defined for testing this library. + */ +public class NativeSecp256k1Test { + + //TODO improve comments/add more tests + /** + * This tests verify() for a valid signature + */ + public static void testVerifyPos() throws AssertFailException{ + boolean result = false; + byte[] data = BaseEncoding.base16().lowerCase().decode("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A90".toLowerCase()); //sha256hash of "testing" + byte[] sig = BaseEncoding.base16().lowerCase().decode("3044022079BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F817980220294F14E883B3F525B5367756C2A11EF6CF84B730B36C17CB0C56F0AAB2C98589".toLowerCase()); + byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase()); + + result = NativeSecp256k1.verify( data, sig, pub); + assertEquals( result, true , "testVerifyPos"); + } + + /** + * This tests verify() for a non-valid signature + */ + public static void testVerifyNeg() throws AssertFailException{ + boolean result = false; + byte[] data = BaseEncoding.base16().lowerCase().decode("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A91".toLowerCase()); //sha256hash of "testing" + byte[] sig = BaseEncoding.base16().lowerCase().decode("3044022079BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F817980220294F14E883B3F525B5367756C2A11EF6CF84B730B36C17CB0C56F0AAB2C98589".toLowerCase()); + byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase()); + + result = NativeSecp256k1.verify( data, sig, pub); + //System.out.println(" TEST " + new BigInteger(1, resultbytes).toString(16)); + assertEquals( result, false , "testVerifyNeg"); + } + + /** + * This tests secret key verify() for a valid secretkey + */ + public static void testSecKeyVerifyPos() throws AssertFailException{ + boolean result = false; + byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase()); + + result = NativeSecp256k1.secKeyVerify( sec ); + //System.out.println(" TEST " + new BigInteger(1, resultbytes).toString(16)); + assertEquals( result, true , "testSecKeyVerifyPos"); + } + + /** + * This tests secret key verify() for a invalid secretkey + */ + public static void testSecKeyVerifyNeg() throws AssertFailException{ + boolean result = false; + byte[] sec = BaseEncoding.base16().lowerCase().decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF".toLowerCase()); + + result = NativeSecp256k1.secKeyVerify( sec ); + //System.out.println(" TEST " + new BigInteger(1, resultbytes).toString(16)); + assertEquals( result, false , "testSecKeyVerifyNeg"); + } + + /** + * This tests public key create() for a valid secretkey + */ + public static void testPubKeyCreatePos() throws AssertFailException{ + byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase()); + + byte[] resultArr = NativeSecp256k1.computePubkey( sec); + String pubkeyString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); + assertEquals( pubkeyString , "04C591A8FF19AC9C4E4E5793673B83123437E975285E7B442F4EE2654DFFCA5E2D2103ED494718C697AC9AEBCFD19612E224DB46661011863ED2FC54E71861E2A6" , "testPubKeyCreatePos"); + } + + /** + * This tests public key create() for a invalid secretkey + */ + public static void testPubKeyCreateNeg() throws AssertFailException{ + byte[] sec = BaseEncoding.base16().lowerCase().decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF".toLowerCase()); + + byte[] resultArr = NativeSecp256k1.computePubkey( sec); + String pubkeyString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); + assertEquals( pubkeyString, "" , "testPubKeyCreateNeg"); + } + + /** + * This tests sign() for a valid secretkey + */ + public static void testSignPos() throws AssertFailException{ + + byte[] data = BaseEncoding.base16().lowerCase().decode("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A90".toLowerCase()); //sha256hash of "testing" + byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase()); + + byte[] resultArr = NativeSecp256k1.sign(data, sec); + String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); + assertEquals( sigString, "30440220182A108E1448DC8F1FB467D06A0F3BB8EA0533584CB954EF8DA112F1D60E39A202201C66F36DA211C087F3AF88B50EDF4F9BDAA6CF5FD6817E74DCA34DB12390C6E9" , "testSignPos"); + } + + /** + * This tests sign() for a invalid secretkey + */ + public static void testSignNeg() throws AssertFailException{ + byte[] data = BaseEncoding.base16().lowerCase().decode("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A90".toLowerCase()); //sha256hash of "testing" + byte[] sec = BaseEncoding.base16().lowerCase().decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF".toLowerCase()); + + byte[] resultArr = NativeSecp256k1.sign(data, sec); + String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); + assertEquals( sigString, "" , "testSignNeg"); + } + + /** + * This tests private key tweak-add + */ + public static void testPrivKeyTweakAdd_1() throws AssertFailException { + byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase()); + byte[] data = BaseEncoding.base16().lowerCase().decode("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3".toLowerCase()); //sha256hash of "tweak" + + byte[] resultArr = NativeSecp256k1.privKeyTweakAdd( sec , data ); + String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); + assertEquals( sigString , "A168571E189E6F9A7E2D657A4B53AE99B909F7E712D1C23CED28093CD57C88F3" , "testPrivKeyAdd_1"); + } + + /** + * This tests private key tweak-mul + */ + public static void testPrivKeyTweakMul_1() throws AssertFailException { + byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase()); + byte[] data = BaseEncoding.base16().lowerCase().decode("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3".toLowerCase()); //sha256hash of "tweak" + + byte[] resultArr = NativeSecp256k1.privKeyTweakMul( sec , data ); + String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); + assertEquals( sigString , "97F8184235F101550F3C71C927507651BD3F1CDB4A5A33B8986ACF0DEE20FFFC" , "testPrivKeyMul_1"); + } + + /** + * This tests private key tweak-add uncompressed + */ + public static void testPrivKeyTweakAdd_2() throws AssertFailException { + byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase()); + byte[] data = BaseEncoding.base16().lowerCase().decode("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3".toLowerCase()); //sha256hash of "tweak" + + byte[] resultArr = NativeSecp256k1.pubKeyTweakAdd( pub , data ); + String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); + assertEquals( sigString , "0411C6790F4B663CCE607BAAE08C43557EDC1A4D11D88DFCB3D841D0C6A941AF525A268E2A863C148555C48FB5FBA368E88718A46E205FABC3DBA2CCFFAB0796EF" , "testPrivKeyAdd_2"); + } + + /** + * This tests private key tweak-mul uncompressed + */ + public static void testPrivKeyTweakMul_2() throws AssertFailException { + byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase()); + byte[] data = BaseEncoding.base16().lowerCase().decode("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3".toLowerCase()); //sha256hash of "tweak" + + byte[] resultArr = NativeSecp256k1.pubKeyTweakMul( pub , data ); + String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); + assertEquals( sigString , "04E0FE6FE55EBCA626B98A807F6CAF654139E14E5E3698F01A9A658E21DC1D2791EC060D4F412A794D5370F672BC94B722640B5F76914151CFCA6E712CA48CC589" , "testPrivKeyMul_2"); + } + + /** + * This tests seed randomization + */ + public static void testRandomize() throws AssertFailException { + byte[] seed = BaseEncoding.base16().lowerCase().decode("A441B15FE9A3CF56661190A0B93B9DEC7D04127288CC87250967CF3B52894D11".toLowerCase()); //sha256hash of "random" + boolean result = NativeSecp256k1.randomize(seed); + assertEquals( result, true, "testRandomize"); + } + + public static void testCreateECDHSecret() throws AssertFailException{ + + byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase()); + byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase()); + + byte[] resultArr = NativeSecp256k1.createECDHSecret(sec, pub); + String ecdhString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); + assertEquals( ecdhString, "2A2A67007A926E6594AF3EB564FC74005B37A9C8AEF2033C4552051B5C87F043" , "testCreateECDHSecret"); + } + + public static void main(String[] args) throws AssertFailException{ + + + System.out.println("\n libsecp256k1 enabled: " + Secp256k1Context.isEnabled() + "\n"); + + assertEquals( Secp256k1Context.isEnabled(), true, "isEnabled" ); + + //Test verify() success/fail + testVerifyPos(); + testVerifyNeg(); + + //Test secKeyVerify() success/fail + testSecKeyVerifyPos(); + testSecKeyVerifyNeg(); + + //Test computePubkey() success/fail + testPubKeyCreatePos(); + testPubKeyCreateNeg(); + + //Test sign() success/fail + testSignPos(); + testSignNeg(); + + //Test privKeyTweakAdd() 1 + testPrivKeyTweakAdd_1(); + + //Test privKeyTweakMul() 2 + testPrivKeyTweakMul_1(); + + //Test privKeyTweakAdd() 3 + testPrivKeyTweakAdd_2(); + + //Test privKeyTweakMul() 4 + testPrivKeyTweakMul_2(); + + //Test randomize() + testRandomize(); + + //Test ECDH + testCreateECDHSecret(); + + NativeSecp256k1.cleanup(); + + System.out.println(" All tests passed." ); + + } +} diff --git a/src/java/org/bitcoin/NativeSecp256k1Util.java b/src/java/org/bitcoin/NativeSecp256k1Util.java new file mode 100644 index 000000000..04732ba04 --- /dev/null +++ b/src/java/org/bitcoin/NativeSecp256k1Util.java @@ -0,0 +1,45 @@ +/* + * Copyright 2014-2016 the libsecp256k1 contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.bitcoin; + +public class NativeSecp256k1Util{ + + public static void assertEquals( int val, int val2, String message ) throws AssertFailException{ + if( val != val2 ) + throw new AssertFailException("FAIL: " + message); + } + + public static void assertEquals( boolean val, boolean val2, String message ) throws AssertFailException{ + if( val != val2 ) + throw new AssertFailException("FAIL: " + message); + else + System.out.println("PASS: " + message); + } + + public static void assertEquals( String val, String val2, String message ) throws AssertFailException{ + if( !val.equals(val2) ) + throw new AssertFailException("FAIL: " + message); + else + System.out.println("PASS: " + message); + } + + public static class AssertFailException extends Exception { + public AssertFailException(String message) { + super( message ); + } + } +} diff --git a/src/java/org/bitcoin/Secp256k1Context.java b/src/java/org/bitcoin/Secp256k1Context.java new file mode 100644 index 000000000..216c986a8 --- /dev/null +++ b/src/java/org/bitcoin/Secp256k1Context.java @@ -0,0 +1,51 @@ +/* + * Copyright 2014-2016 the libsecp256k1 contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.bitcoin; + +/** + * This class holds the context reference used in native methods + * to handle ECDSA operations. + */ +public class Secp256k1Context { + private static final boolean enabled; //true if the library is loaded + private static final long context; //ref to pointer to context obj + + static { //static initializer + boolean isEnabled = true; + long contextRef = -1; + try { + System.loadLibrary("secp256k1"); + contextRef = secp256k1_init_context(); + } catch (UnsatisfiedLinkError e) { + System.out.println("UnsatisfiedLinkError: " + e.toString()); + isEnabled = false; + } + enabled = isEnabled; + context = contextRef; + } + + public static boolean isEnabled() { + return enabled; + } + + public static long getContext() { + if(!enabled) return -1; //sanity check + return context; + } + + private static native long secp256k1_init_context(); +} diff --git a/src/java/org_bitcoin_NativeSecp256k1.c b/src/java/org_bitcoin_NativeSecp256k1.c index bb4cd7072..bcef7b32c 100644 --- a/src/java/org_bitcoin_NativeSecp256k1.c +++ b/src/java/org_bitcoin_NativeSecp256k1.c @@ -1,23 +1,377 @@ +#include +#include +#include #include "org_bitcoin_NativeSecp256k1.h" #include "include/secp256k1.h" +#include "include/secp256k1_ecdh.h" +#include "include/secp256k1_recovery.h" -JNIEXPORT jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1verify - (JNIEnv* env, jclass classObject, jobject byteBufferObject) + +SECP256K1_API jlong JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ctx_1clone + (JNIEnv* env, jclass classObject, jlong ctx_l) { - unsigned char* data = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); - int sigLen = *((int*)(data + 32)); - int pubLen = *((int*)(data + 32 + 4)); + const secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; + + jlong ctx_clone_l = (uintptr_t) secp256k1_context_clone(ctx); + + (void)classObject;(void)env; + + return ctx_clone_l; - return secp256k1_ecdsa_verify(data, 32, data+32+8, sigLen, data+32+8+sigLen, pubLen); } -static void __javasecp256k1_attach(void) __attribute__((constructor)); -static void __javasecp256k1_detach(void) __attribute__((destructor)); +SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1context_1randomize + (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) +{ + secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; + + const unsigned char* seed = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); + + (void)classObject; + + return secp256k1_context_randomize(ctx, seed); -static void __javasecp256k1_attach(void) { - secp256k1_start(SECP256K1_START_VERIFY); } -static void __javasecp256k1_detach(void) { - secp256k1_stop(); +SECP256K1_API void JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1destroy_1context + (JNIEnv* env, jclass classObject, jlong ctx_l) +{ + secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; + + secp256k1_context_destroy(ctx); + + (void)classObject;(void)env; +} + +SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1verify + (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint siglen, jint publen) +{ + secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; + + unsigned char* data = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); + const unsigned char* sigdata = { (unsigned char*) (data + 32) }; + const unsigned char* pubdata = { (unsigned char*) (data + siglen + 32) }; + + secp256k1_ecdsa_signature sig; + secp256k1_pubkey pubkey; + + int ret = secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigdata, siglen); + + if( ret ) { + ret = secp256k1_ec_pubkey_parse(ctx, &pubkey, pubdata, publen); + + if( ret ) { + ret = secp256k1_ecdsa_verify(ctx, &sig, data, &pubkey); + } + } + + (void)classObject; + + return ret; +} + +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1sign + (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) +{ + secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; + unsigned char* data = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); + unsigned char* secKey = (unsigned char*) (data + 32); + + jobjectArray retArray; + jbyteArray sigArray, intsByteArray; + unsigned char intsarray[2]; + + secp256k1_ecdsa_signature sig[72]; + + int ret = secp256k1_ecdsa_sign(ctx, sig, data, secKey, NULL, NULL ); + + unsigned char outputSer[72]; + size_t outputLen = 72; + + if( ret ) { + int ret2 = secp256k1_ecdsa_signature_serialize_der(ctx,outputSer, &outputLen, sig ); (void)ret2; + } + + intsarray[0] = outputLen; + intsarray[1] = ret; + + retArray = (*env)->NewObjectArray(env, 2, + (*env)->FindClass(env, "[B"), + (*env)->NewByteArray(env, 1)); + + sigArray = (*env)->NewByteArray(env, outputLen); + (*env)->SetByteArrayRegion(env, sigArray, 0, outputLen, (jbyte*)outputSer); + (*env)->SetObjectArrayElement(env, retArray, 0, sigArray); + + intsByteArray = (*env)->NewByteArray(env, 2); + (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); + (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); + + (void)classObject; + + return retArray; +} + +SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1seckey_1verify + (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) +{ + secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; + unsigned char* secKey = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); + + (void)classObject; + + return secp256k1_ec_seckey_verify(ctx, secKey); +} + +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1pubkey_1create + (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) +{ + secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; + const unsigned char* secKey = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); + + secp256k1_pubkey pubkey; + + jobjectArray retArray; + jbyteArray pubkeyArray, intsByteArray; + unsigned char intsarray[2]; + + int ret = secp256k1_ec_pubkey_create(ctx, &pubkey, secKey); + + unsigned char outputSer[65]; + size_t outputLen = 65; + + if( ret ) { + int ret2 = secp256k1_ec_pubkey_serialize(ctx,outputSer, &outputLen, &pubkey,SECP256K1_EC_UNCOMPRESSED );(void)ret2; + } + + intsarray[0] = outputLen; + intsarray[1] = ret; + + retArray = (*env)->NewObjectArray(env, 2, + (*env)->FindClass(env, "[B"), + (*env)->NewByteArray(env, 1)); + + pubkeyArray = (*env)->NewByteArray(env, outputLen); + (*env)->SetByteArrayRegion(env, pubkeyArray, 0, outputLen, (jbyte*)outputSer); + (*env)->SetObjectArrayElement(env, retArray, 0, pubkeyArray); + + intsByteArray = (*env)->NewByteArray(env, 2); + (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); + (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); + + (void)classObject; + + return retArray; + +} + +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1add + (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) +{ + secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; + unsigned char* privkey = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); + const unsigned char* tweak = (unsigned char*) (privkey + 32); + + jobjectArray retArray; + jbyteArray privArray, intsByteArray; + unsigned char intsarray[2]; + + int privkeylen = 32; + + int ret = secp256k1_ec_privkey_tweak_add(ctx, privkey, tweak); + + intsarray[0] = privkeylen; + intsarray[1] = ret; + + retArray = (*env)->NewObjectArray(env, 2, + (*env)->FindClass(env, "[B"), + (*env)->NewByteArray(env, 1)); + + privArray = (*env)->NewByteArray(env, privkeylen); + (*env)->SetByteArrayRegion(env, privArray, 0, privkeylen, (jbyte*)privkey); + (*env)->SetObjectArrayElement(env, retArray, 0, privArray); + + intsByteArray = (*env)->NewByteArray(env, 2); + (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); + (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); + + (void)classObject; + + return retArray; +} + +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1mul + (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) +{ + secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; + unsigned char* privkey = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); + const unsigned char* tweak = (unsigned char*) (privkey + 32); + + jobjectArray retArray; + jbyteArray privArray, intsByteArray; + unsigned char intsarray[2]; + + int privkeylen = 32; + + int ret = secp256k1_ec_privkey_tweak_mul(ctx, privkey, tweak); + + intsarray[0] = privkeylen; + intsarray[1] = ret; + + retArray = (*env)->NewObjectArray(env, 2, + (*env)->FindClass(env, "[B"), + (*env)->NewByteArray(env, 1)); + + privArray = (*env)->NewByteArray(env, privkeylen); + (*env)->SetByteArrayRegion(env, privArray, 0, privkeylen, (jbyte*)privkey); + (*env)->SetObjectArrayElement(env, retArray, 0, privArray); + + intsByteArray = (*env)->NewByteArray(env, 2); + (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); + (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); + + (void)classObject; + + return retArray; +} + +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1add + (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen) +{ + secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; +/* secp256k1_pubkey* pubkey = (secp256k1_pubkey*) (*env)->GetDirectBufferAddress(env, byteBufferObject);*/ + unsigned char* pkey = (*env)->GetDirectBufferAddress(env, byteBufferObject); + const unsigned char* tweak = (unsigned char*) (pkey + publen); + + jobjectArray retArray; + jbyteArray pubArray, intsByteArray; + unsigned char intsarray[2]; + unsigned char outputSer[65]; + size_t outputLen = 65; + + secp256k1_pubkey pubkey; + int ret = secp256k1_ec_pubkey_parse(ctx, &pubkey, pkey, publen); + + if( ret ) { + ret = secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, tweak); + } + + if( ret ) { + int ret2 = secp256k1_ec_pubkey_serialize(ctx,outputSer, &outputLen, &pubkey,SECP256K1_EC_UNCOMPRESSED );(void)ret2; + } + + intsarray[0] = outputLen; + intsarray[1] = ret; + + retArray = (*env)->NewObjectArray(env, 2, + (*env)->FindClass(env, "[B"), + (*env)->NewByteArray(env, 1)); + + pubArray = (*env)->NewByteArray(env, outputLen); + (*env)->SetByteArrayRegion(env, pubArray, 0, outputLen, (jbyte*)outputSer); + (*env)->SetObjectArrayElement(env, retArray, 0, pubArray); + + intsByteArray = (*env)->NewByteArray(env, 2); + (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); + (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); + + (void)classObject; + + return retArray; +} + +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1mul + (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen) +{ + secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; + unsigned char* pkey = (*env)->GetDirectBufferAddress(env, byteBufferObject); + const unsigned char* tweak = (unsigned char*) (pkey + publen); + + jobjectArray retArray; + jbyteArray pubArray, intsByteArray; + unsigned char intsarray[2]; + unsigned char outputSer[65]; + size_t outputLen = 65; + + secp256k1_pubkey pubkey; + int ret = secp256k1_ec_pubkey_parse(ctx, &pubkey, pkey, publen); + + if ( ret ) { + ret = secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, tweak); + } + + if( ret ) { + int ret2 = secp256k1_ec_pubkey_serialize(ctx,outputSer, &outputLen, &pubkey,SECP256K1_EC_UNCOMPRESSED );(void)ret2; + } + + intsarray[0] = outputLen; + intsarray[1] = ret; + + retArray = (*env)->NewObjectArray(env, 2, + (*env)->FindClass(env, "[B"), + (*env)->NewByteArray(env, 1)); + + pubArray = (*env)->NewByteArray(env, outputLen); + (*env)->SetByteArrayRegion(env, pubArray, 0, outputLen, (jbyte*)outputSer); + (*env)->SetObjectArrayElement(env, retArray, 0, pubArray); + + intsByteArray = (*env)->NewByteArray(env, 2); + (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); + (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); + + (void)classObject; + + return retArray; +} + +SECP256K1_API jlong JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1pubkey_1combine + (JNIEnv * env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint numkeys) +{ + (void)classObject;(void)env;(void)byteBufferObject;(void)ctx_l;(void)numkeys; + + return 0; +} + +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdh + (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen) +{ + secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; + const unsigned char* secdata = (*env)->GetDirectBufferAddress(env, byteBufferObject); + const unsigned char* pubdata = (const unsigned char*) (secdata + 32); + + jobjectArray retArray; + jbyteArray outArray, intsByteArray; + unsigned char intsarray[1]; + secp256k1_pubkey pubkey; + unsigned char nonce_res[32]; + size_t outputLen = 32; + + int ret = secp256k1_ec_pubkey_parse(ctx, &pubkey, pubdata, publen); + + if (ret) { + ret = secp256k1_ecdh( + ctx, + nonce_res, + &pubkey, + secdata + ); + } + + intsarray[0] = ret; + + retArray = (*env)->NewObjectArray(env, 2, + (*env)->FindClass(env, "[B"), + (*env)->NewByteArray(env, 1)); + + outArray = (*env)->NewByteArray(env, outputLen); + (*env)->SetByteArrayRegion(env, outArray, 0, 32, (jbyte*)nonce_res); + (*env)->SetObjectArrayElement(env, retArray, 0, outArray); + + intsByteArray = (*env)->NewByteArray(env, 1); + (*env)->SetByteArrayRegion(env, intsByteArray, 0, 1, (jbyte*)intsarray); + (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); + + (void)classObject; + + return retArray; } diff --git a/src/java/org_bitcoin_NativeSecp256k1.h b/src/java/org_bitcoin_NativeSecp256k1.h index d7fb004fa..fe613c9e9 100644 --- a/src/java/org_bitcoin_NativeSecp256k1.h +++ b/src/java/org_bitcoin_NativeSecp256k1.h @@ -1,5 +1,6 @@ /* DO NOT EDIT THIS FILE - it is machine generated */ #include +#include "include/secp256k1.h" /* Header for class org_bitcoin_NativeSecp256k1 */ #ifndef _Included_org_bitcoin_NativeSecp256k1 @@ -9,11 +10,108 @@ extern "C" { #endif /* * Class: org_bitcoin_NativeSecp256k1 - * Method: secp256k1_ecdsa_verify - * Signature: (Ljava/nio/ByteBuffer;)I + * Method: secp256k1_ctx_clone + * Signature: (J)J */ -JNIEXPORT jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1verify - (JNIEnv *, jclass, jobject); +SECP256K1_API jlong JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ctx_1clone + (JNIEnv *, jclass, jlong); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_context_randomize + * Signature: (Ljava/nio/ByteBuffer;J)I + */ +SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1context_1randomize + (JNIEnv *, jclass, jobject, jlong); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_privkey_tweak_add + * Signature: (Ljava/nio/ByteBuffer;J)[[B + */ +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1add + (JNIEnv *, jclass, jobject, jlong); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_privkey_tweak_mul + * Signature: (Ljava/nio/ByteBuffer;J)[[B + */ +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1mul + (JNIEnv *, jclass, jobject, jlong); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_pubkey_tweak_add + * Signature: (Ljava/nio/ByteBuffer;JI)[[B + */ +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1add + (JNIEnv *, jclass, jobject, jlong, jint); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_pubkey_tweak_mul + * Signature: (Ljava/nio/ByteBuffer;JI)[[B + */ +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1mul + (JNIEnv *, jclass, jobject, jlong, jint); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_destroy_context + * Signature: (J)V + */ +SECP256K1_API void JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1destroy_1context + (JNIEnv *, jclass, jlong); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_ecdsa_verify + * Signature: (Ljava/nio/ByteBuffer;JII)I + */ +SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1verify + (JNIEnv *, jclass, jobject, jlong, jint, jint); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_ecdsa_sign + * Signature: (Ljava/nio/ByteBuffer;J)[[B + */ +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1sign + (JNIEnv *, jclass, jobject, jlong); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_ec_seckey_verify + * Signature: (Ljava/nio/ByteBuffer;J)I + */ +SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1seckey_1verify + (JNIEnv *, jclass, jobject, jlong); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_ec_pubkey_create + * Signature: (Ljava/nio/ByteBuffer;J)[[B + */ +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1pubkey_1create + (JNIEnv *, jclass, jobject, jlong); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_ec_pubkey_parse + * Signature: (Ljava/nio/ByteBuffer;JI)[[B + */ +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1pubkey_1parse + (JNIEnv *, jclass, jobject, jlong, jint); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_ecdh + * Signature: (Ljava/nio/ByteBuffer;JI)[[B + */ +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdh + (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen); + #ifdef __cplusplus } diff --git a/src/java/org_bitcoin_Secp256k1Context.c b/src/java/org_bitcoin_Secp256k1Context.c new file mode 100644 index 000000000..a52939e7e --- /dev/null +++ b/src/java/org_bitcoin_Secp256k1Context.c @@ -0,0 +1,15 @@ +#include +#include +#include "org_bitcoin_Secp256k1Context.h" +#include "include/secp256k1.h" + +SECP256K1_API jlong JNICALL Java_org_bitcoin_Secp256k1Context_secp256k1_1init_1context + (JNIEnv* env, jclass classObject) +{ + secp256k1_context *ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); + + (void)classObject;(void)env; + + return (uintptr_t)ctx; +} + diff --git a/src/java/org_bitcoin_Secp256k1Context.h b/src/java/org_bitcoin_Secp256k1Context.h new file mode 100644 index 000000000..0d2bc84b7 --- /dev/null +++ b/src/java/org_bitcoin_Secp256k1Context.h @@ -0,0 +1,22 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +#include "include/secp256k1.h" +/* Header for class org_bitcoin_Secp256k1Context */ + +#ifndef _Included_org_bitcoin_Secp256k1Context +#define _Included_org_bitcoin_Secp256k1Context +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_bitcoin_Secp256k1Context + * Method: secp256k1_init_context + * Signature: ()J + */ +SECP256K1_API jlong JNICALL Java_org_bitcoin_Secp256k1Context_secp256k1_1init_1context + (JNIEnv *, jclass); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/modules/ecdh/Makefile.am.include b/src/modules/ecdh/Makefile.am.include new file mode 100644 index 000000000..e3088b469 --- /dev/null +++ b/src/modules/ecdh/Makefile.am.include @@ -0,0 +1,8 @@ +include_HEADERS += include/secp256k1_ecdh.h +noinst_HEADERS += src/modules/ecdh/main_impl.h +noinst_HEADERS += src/modules/ecdh/tests_impl.h +if USE_BENCHMARK +noinst_PROGRAMS += bench_ecdh +bench_ecdh_SOURCES = src/bench_ecdh.c +bench_ecdh_LDADD = libsecp256k1.la $(SECP_LIBS) $(COMMON_LIB) +endif diff --git a/src/modules/ecdh/main_impl.h b/src/modules/ecdh/main_impl.h new file mode 100644 index 000000000..9e30fb73d --- /dev/null +++ b/src/modules/ecdh/main_impl.h @@ -0,0 +1,54 @@ +/********************************************************************** + * Copyright (c) 2015 Andrew Poelstra * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_MODULE_ECDH_MAIN_ +#define _SECP256K1_MODULE_ECDH_MAIN_ + +#include "include/secp256k1_ecdh.h" +#include "ecmult_const_impl.h" + +int secp256k1_ecdh(const secp256k1_context* ctx, unsigned char *result, const secp256k1_pubkey *point, const unsigned char *scalar) { + int ret = 0; + int overflow = 0; + secp256k1_gej res; + secp256k1_ge pt; + secp256k1_scalar s; + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(result != NULL); + ARG_CHECK(point != NULL); + ARG_CHECK(scalar != NULL); + + secp256k1_pubkey_load(ctx, &pt, point); + secp256k1_scalar_set_b32(&s, scalar, &overflow); + if (overflow || secp256k1_scalar_is_zero(&s)) { + ret = 0; + } else { + unsigned char x[32]; + unsigned char y[1]; + secp256k1_sha256_t sha; + + secp256k1_ecmult_const(&res, &pt, &s); + secp256k1_ge_set_gej(&pt, &res); + /* Compute a hash of the point in compressed form + * Note we cannot use secp256k1_eckey_pubkey_serialize here since it does not + * expect its output to be secret and has a timing sidechannel. */ + secp256k1_fe_normalize(&pt.x); + secp256k1_fe_normalize(&pt.y); + secp256k1_fe_get_b32(x, &pt.x); + y[0] = 0x02 | secp256k1_fe_is_odd(&pt.y); + + secp256k1_sha256_initialize(&sha); + secp256k1_sha256_write(&sha, y, sizeof(y)); + secp256k1_sha256_write(&sha, x, sizeof(x)); + secp256k1_sha256_finalize(&sha, result); + ret = 1; + } + + secp256k1_scalar_clear(&s); + return ret; +} + +#endif diff --git a/src/modules/ecdh/tests_impl.h b/src/modules/ecdh/tests_impl.h new file mode 100644 index 000000000..85a5d0a9a --- /dev/null +++ b/src/modules/ecdh/tests_impl.h @@ -0,0 +1,105 @@ +/********************************************************************** + * Copyright (c) 2015 Andrew Poelstra * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_MODULE_ECDH_TESTS_ +#define _SECP256K1_MODULE_ECDH_TESTS_ + +void test_ecdh_api(void) { + /* Setup context that just counts errors */ + secp256k1_context *tctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN); + secp256k1_pubkey point; + unsigned char res[32]; + unsigned char s_one[32] = { 0 }; + int32_t ecount = 0; + s_one[31] = 1; + + secp256k1_context_set_error_callback(tctx, counting_illegal_callback_fn, &ecount); + secp256k1_context_set_illegal_callback(tctx, counting_illegal_callback_fn, &ecount); + CHECK(secp256k1_ec_pubkey_create(tctx, &point, s_one) == 1); + + /* Check all NULLs are detected */ + CHECK(secp256k1_ecdh(tctx, res, &point, s_one) == 1); + CHECK(ecount == 0); + CHECK(secp256k1_ecdh(tctx, NULL, &point, s_one) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ecdh(tctx, res, NULL, s_one) == 0); + CHECK(ecount == 2); + CHECK(secp256k1_ecdh(tctx, res, &point, NULL) == 0); + CHECK(ecount == 3); + CHECK(secp256k1_ecdh(tctx, res, &point, s_one) == 1); + CHECK(ecount == 3); + + /* Cleanup */ + secp256k1_context_destroy(tctx); +} + +void test_ecdh_generator_basepoint(void) { + unsigned char s_one[32] = { 0 }; + secp256k1_pubkey point[2]; + int i; + + s_one[31] = 1; + /* Check against pubkey creation when the basepoint is the generator */ + for (i = 0; i < 100; ++i) { + secp256k1_sha256_t sha; + unsigned char s_b32[32]; + unsigned char output_ecdh[32]; + unsigned char output_ser[32]; + unsigned char point_ser[33]; + size_t point_ser_len = sizeof(point_ser); + secp256k1_scalar s; + + random_scalar_order(&s); + secp256k1_scalar_get_b32(s_b32, &s); + + /* compute using ECDH function */ + CHECK(secp256k1_ec_pubkey_create(ctx, &point[0], s_one) == 1); + CHECK(secp256k1_ecdh(ctx, output_ecdh, &point[0], s_b32) == 1); + /* compute "explicitly" */ + CHECK(secp256k1_ec_pubkey_create(ctx, &point[1], s_b32) == 1); + CHECK(secp256k1_ec_pubkey_serialize(ctx, point_ser, &point_ser_len, &point[1], SECP256K1_EC_COMPRESSED) == 1); + CHECK(point_ser_len == sizeof(point_ser)); + secp256k1_sha256_initialize(&sha); + secp256k1_sha256_write(&sha, point_ser, point_ser_len); + secp256k1_sha256_finalize(&sha, output_ser); + /* compare */ + CHECK(memcmp(output_ecdh, output_ser, sizeof(output_ser)) == 0); + } +} + +void test_bad_scalar(void) { + unsigned char s_zero[32] = { 0 }; + unsigned char s_overflow[32] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, + 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41 + }; + unsigned char s_rand[32] = { 0 }; + unsigned char output[32]; + secp256k1_scalar rand; + secp256k1_pubkey point; + + /* Create random point */ + random_scalar_order(&rand); + secp256k1_scalar_get_b32(s_rand, &rand); + CHECK(secp256k1_ec_pubkey_create(ctx, &point, s_rand) == 1); + + /* Try to multiply it by bad values */ + CHECK(secp256k1_ecdh(ctx, output, &point, s_zero) == 0); + CHECK(secp256k1_ecdh(ctx, output, &point, s_overflow) == 0); + /* ...and a good one */ + s_overflow[31] -= 1; + CHECK(secp256k1_ecdh(ctx, output, &point, s_overflow) == 1); +} + +void run_ecdh_tests(void) { + test_ecdh_api(); + test_ecdh_generator_basepoint(); + test_bad_scalar(); +} + +#endif diff --git a/src/modules/recovery/Makefile.am.include b/src/modules/recovery/Makefile.am.include new file mode 100644 index 000000000..bf23c26e7 --- /dev/null +++ b/src/modules/recovery/Makefile.am.include @@ -0,0 +1,8 @@ +include_HEADERS += include/secp256k1_recovery.h +noinst_HEADERS += src/modules/recovery/main_impl.h +noinst_HEADERS += src/modules/recovery/tests_impl.h +if USE_BENCHMARK +noinst_PROGRAMS += bench_recover +bench_recover_SOURCES = src/bench_recover.c +bench_recover_LDADD = libsecp256k1.la $(SECP_LIBS) $(COMMON_LIB) +endif diff --git a/src/modules/recovery/main_impl.h b/src/modules/recovery/main_impl.h new file mode 100755 index 000000000..c6fbe2398 --- /dev/null +++ b/src/modules/recovery/main_impl.h @@ -0,0 +1,193 @@ +/********************************************************************** + * Copyright (c) 2013-2015 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_MODULE_RECOVERY_MAIN_ +#define _SECP256K1_MODULE_RECOVERY_MAIN_ + +#include "include/secp256k1_recovery.h" + +static void secp256k1_ecdsa_recoverable_signature_load(const secp256k1_context* ctx, secp256k1_scalar* r, secp256k1_scalar* s, int* recid, const secp256k1_ecdsa_recoverable_signature* sig) { + (void)ctx; + if (sizeof(secp256k1_scalar) == 32) { + /* When the secp256k1_scalar type is exactly 32 byte, use its + * representation inside secp256k1_ecdsa_signature, as conversion is very fast. + * Note that secp256k1_ecdsa_signature_save must use the same representation. */ + memcpy(r, &sig->data[0], 32); + memcpy(s, &sig->data[32], 32); + } else { + secp256k1_scalar_set_b32(r, &sig->data[0], NULL); + secp256k1_scalar_set_b32(s, &sig->data[32], NULL); + } + *recid = sig->data[64]; +} + +static void secp256k1_ecdsa_recoverable_signature_save(secp256k1_ecdsa_recoverable_signature* sig, const secp256k1_scalar* r, const secp256k1_scalar* s, int recid) { + if (sizeof(secp256k1_scalar) == 32) { + memcpy(&sig->data[0], r, 32); + memcpy(&sig->data[32], s, 32); + } else { + secp256k1_scalar_get_b32(&sig->data[0], r); + secp256k1_scalar_get_b32(&sig->data[32], s); + } + sig->data[64] = recid; +} + +int secp256k1_ecdsa_recoverable_signature_parse_compact(const secp256k1_context* ctx, secp256k1_ecdsa_recoverable_signature* sig, const unsigned char *input64, int recid) { + secp256k1_scalar r, s; + int ret = 1; + int overflow = 0; + + (void)ctx; + ARG_CHECK(sig != NULL); + ARG_CHECK(input64 != NULL); + ARG_CHECK(recid >= 0 && recid <= 3); + + secp256k1_scalar_set_b32(&r, &input64[0], &overflow); + ret &= !overflow; + secp256k1_scalar_set_b32(&s, &input64[32], &overflow); + ret &= !overflow; + if (ret) { + secp256k1_ecdsa_recoverable_signature_save(sig, &r, &s, recid); + } else { + memset(sig, 0, sizeof(*sig)); + } + return ret; +} + +int secp256k1_ecdsa_recoverable_signature_serialize_compact(const secp256k1_context* ctx, unsigned char *output64, int *recid, const secp256k1_ecdsa_recoverable_signature* sig) { + secp256k1_scalar r, s; + + (void)ctx; + ARG_CHECK(output64 != NULL); + ARG_CHECK(sig != NULL); + ARG_CHECK(recid != NULL); + + secp256k1_ecdsa_recoverable_signature_load(ctx, &r, &s, recid, sig); + secp256k1_scalar_get_b32(&output64[0], &r); + secp256k1_scalar_get_b32(&output64[32], &s); + return 1; +} + +int secp256k1_ecdsa_recoverable_signature_convert(const secp256k1_context* ctx, secp256k1_ecdsa_signature* sig, const secp256k1_ecdsa_recoverable_signature* sigin) { + secp256k1_scalar r, s; + int recid; + + (void)ctx; + ARG_CHECK(sig != NULL); + ARG_CHECK(sigin != NULL); + + secp256k1_ecdsa_recoverable_signature_load(ctx, &r, &s, &recid, sigin); + secp256k1_ecdsa_signature_save(sig, &r, &s); + return 1; +} + +static int secp256k1_ecdsa_sig_recover(const secp256k1_ecmult_context *ctx, const secp256k1_scalar *sigr, const secp256k1_scalar* sigs, secp256k1_ge *pubkey, const secp256k1_scalar *message, int recid) { + unsigned char brx[32]; + secp256k1_fe fx; + secp256k1_ge x; + secp256k1_gej xj; + secp256k1_scalar rn, u1, u2; + secp256k1_gej qj; + int r; + + if (secp256k1_scalar_is_zero(sigr) || secp256k1_scalar_is_zero(sigs)) { + return 0; + } + + secp256k1_scalar_get_b32(brx, sigr); + r = secp256k1_fe_set_b32(&fx, brx); + (void)r; + VERIFY_CHECK(r); /* brx comes from a scalar, so is less than the order; certainly less than p */ + if (recid & 2) { + if (secp256k1_fe_cmp_var(&fx, &secp256k1_ecdsa_const_p_minus_order) >= 0) { + return 0; + } + secp256k1_fe_add(&fx, &secp256k1_ecdsa_const_order_as_fe); + } + if (!secp256k1_ge_set_xo_var(&x, &fx, recid & 1)) { + return 0; + } + secp256k1_gej_set_ge(&xj, &x); + secp256k1_scalar_inverse_var(&rn, sigr); + secp256k1_scalar_mul(&u1, &rn, message); + secp256k1_scalar_negate(&u1, &u1); + secp256k1_scalar_mul(&u2, &rn, sigs); + secp256k1_ecmult(ctx, &qj, &xj, &u2, &u1); + secp256k1_ge_set_gej_var(pubkey, &qj); + return !secp256k1_gej_is_infinity(&qj); +} + +int secp256k1_ecdsa_sign_recoverable(const secp256k1_context* ctx, secp256k1_ecdsa_recoverable_signature *signature, const unsigned char *msg32, const unsigned char *seckey, secp256k1_nonce_function noncefp, const void* noncedata) { + secp256k1_scalar r, s; + secp256k1_scalar sec, non, msg; + int recid; + int ret = 0; + int overflow = 0; + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); + ARG_CHECK(msg32 != NULL); + ARG_CHECK(signature != NULL); + ARG_CHECK(seckey != NULL); + if (noncefp == NULL) { + noncefp = secp256k1_nonce_function_default; + } + + secp256k1_scalar_set_b32(&sec, seckey, &overflow); + /* Fail if the secret key is invalid. */ + if (!overflow && !secp256k1_scalar_is_zero(&sec)) { + unsigned char nonce32[32]; + unsigned int count = 0; + secp256k1_scalar_set_b32(&msg, msg32, NULL); + while (1) { + ret = noncefp(nonce32, msg32, seckey, NULL, (void*)noncedata, count); + if (!ret) { + break; + } + secp256k1_scalar_set_b32(&non, nonce32, &overflow); + if (!secp256k1_scalar_is_zero(&non) && !overflow) { + if (secp256k1_ecdsa_sig_sign(&ctx->ecmult_gen_ctx, &r, &s, &sec, &msg, &non, &recid)) { + break; + } + } + count++; + } + memset(nonce32, 0, 32); + secp256k1_scalar_clear(&msg); + secp256k1_scalar_clear(&non); + secp256k1_scalar_clear(&sec); + } + if (ret) { + secp256k1_ecdsa_recoverable_signature_save(signature, &r, &s, recid); + } else { + memset(signature, 0, sizeof(*signature)); + } + return ret; +} + +int secp256k1_ecdsa_recover(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const secp256k1_ecdsa_recoverable_signature *signature, const unsigned char *msg32) { + secp256k1_ge q; + secp256k1_scalar r, s; + secp256k1_scalar m; + int recid; + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); + ARG_CHECK(msg32 != NULL); + ARG_CHECK(signature != NULL); + ARG_CHECK(pubkey != NULL); + + secp256k1_ecdsa_recoverable_signature_load(ctx, &r, &s, &recid, signature); + VERIFY_CHECK(recid >= 0 && recid < 4); /* should have been caught in parse_compact */ + secp256k1_scalar_set_b32(&m, msg32, NULL); + if (secp256k1_ecdsa_sig_recover(&ctx->ecmult_ctx, &r, &s, &q, &m, recid)) { + secp256k1_pubkey_save(pubkey, &q); + return 1; + } else { + memset(pubkey, 0, sizeof(*pubkey)); + return 0; + } +} + +#endif diff --git a/src/modules/recovery/tests_impl.h b/src/modules/recovery/tests_impl.h new file mode 100644 index 000000000..765c7dd81 --- /dev/null +++ b/src/modules/recovery/tests_impl.h @@ -0,0 +1,393 @@ +/********************************************************************** + * Copyright (c) 2013-2015 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_MODULE_RECOVERY_TESTS_ +#define _SECP256K1_MODULE_RECOVERY_TESTS_ + +static int recovery_test_nonce_function(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter) { + (void) msg32; + (void) key32; + (void) algo16; + (void) data; + + /* On the first run, return 0 to force a second run */ + if (counter == 0) { + memset(nonce32, 0, 32); + return 1; + } + /* On the second run, return an overflow to force a third run */ + if (counter == 1) { + memset(nonce32, 0xff, 32); + return 1; + } + /* On the next run, return a valid nonce, but flip a coin as to whether or not to fail signing. */ + memset(nonce32, 1, 32); + return secp256k1_rand_bits(1); +} + +void test_ecdsa_recovery_api(void) { + /* Setup contexts that just count errors */ + secp256k1_context *none = secp256k1_context_create(SECP256K1_CONTEXT_NONE); + secp256k1_context *sign = secp256k1_context_create(SECP256K1_CONTEXT_SIGN); + secp256k1_context *vrfy = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY); + secp256k1_context *both = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); + secp256k1_pubkey pubkey; + secp256k1_pubkey recpubkey; + secp256k1_ecdsa_signature normal_sig; + secp256k1_ecdsa_recoverable_signature recsig; + unsigned char privkey[32] = { 1 }; + unsigned char message[32] = { 2 }; + int32_t ecount = 0; + int recid = 0; + unsigned char sig[74]; + unsigned char zero_privkey[32] = { 0 }; + unsigned char over_privkey[32] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; + + secp256k1_context_set_error_callback(none, counting_illegal_callback_fn, &ecount); + secp256k1_context_set_error_callback(sign, counting_illegal_callback_fn, &ecount); + secp256k1_context_set_error_callback(vrfy, counting_illegal_callback_fn, &ecount); + secp256k1_context_set_error_callback(both, counting_illegal_callback_fn, &ecount); + secp256k1_context_set_illegal_callback(none, counting_illegal_callback_fn, &ecount); + secp256k1_context_set_illegal_callback(sign, counting_illegal_callback_fn, &ecount); + secp256k1_context_set_illegal_callback(vrfy, counting_illegal_callback_fn, &ecount); + secp256k1_context_set_illegal_callback(both, counting_illegal_callback_fn, &ecount); + + /* Construct and verify corresponding public key. */ + CHECK(secp256k1_ec_seckey_verify(ctx, privkey) == 1); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, privkey) == 1); + + /* Check bad contexts and NULLs for signing */ + ecount = 0; + CHECK(secp256k1_ecdsa_sign_recoverable(none, &recsig, message, privkey, NULL, NULL) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ecdsa_sign_recoverable(sign, &recsig, message, privkey, NULL, NULL) == 1); + CHECK(ecount == 1); + CHECK(secp256k1_ecdsa_sign_recoverable(vrfy, &recsig, message, privkey, NULL, NULL) == 0); + CHECK(ecount == 2); + CHECK(secp256k1_ecdsa_sign_recoverable(both, &recsig, message, privkey, NULL, NULL) == 1); + CHECK(ecount == 2); + CHECK(secp256k1_ecdsa_sign_recoverable(both, NULL, message, privkey, NULL, NULL) == 0); + CHECK(ecount == 3); + CHECK(secp256k1_ecdsa_sign_recoverable(both, &recsig, NULL, privkey, NULL, NULL) == 0); + CHECK(ecount == 4); + CHECK(secp256k1_ecdsa_sign_recoverable(both, &recsig, message, NULL, NULL, NULL) == 0); + CHECK(ecount == 5); + /* This will fail or succeed randomly, and in either case will not ARG_CHECK failure */ + secp256k1_ecdsa_sign_recoverable(both, &recsig, message, privkey, recovery_test_nonce_function, NULL); + CHECK(ecount == 5); + /* These will all fail, but not in ARG_CHECK way */ + CHECK(secp256k1_ecdsa_sign_recoverable(both, &recsig, message, zero_privkey, NULL, NULL) == 0); + CHECK(secp256k1_ecdsa_sign_recoverable(both, &recsig, message, over_privkey, NULL, NULL) == 0); + /* This one will succeed. */ + CHECK(secp256k1_ecdsa_sign_recoverable(both, &recsig, message, privkey, NULL, NULL) == 1); + CHECK(ecount == 5); + + /* Check signing with a goofy nonce function */ + + /* Check bad contexts and NULLs for recovery */ + ecount = 0; + CHECK(secp256k1_ecdsa_recover(none, &recpubkey, &recsig, message) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ecdsa_recover(sign, &recpubkey, &recsig, message) == 0); + CHECK(ecount == 2); + CHECK(secp256k1_ecdsa_recover(vrfy, &recpubkey, &recsig, message) == 1); + CHECK(ecount == 2); + CHECK(secp256k1_ecdsa_recover(both, &recpubkey, &recsig, message) == 1); + CHECK(ecount == 2); + CHECK(secp256k1_ecdsa_recover(both, NULL, &recsig, message) == 0); + CHECK(ecount == 3); + CHECK(secp256k1_ecdsa_recover(both, &recpubkey, NULL, message) == 0); + CHECK(ecount == 4); + CHECK(secp256k1_ecdsa_recover(both, &recpubkey, &recsig, NULL) == 0); + CHECK(ecount == 5); + + /* Check NULLs for conversion */ + CHECK(secp256k1_ecdsa_sign(both, &normal_sig, message, privkey, NULL, NULL) == 1); + ecount = 0; + CHECK(secp256k1_ecdsa_recoverable_signature_convert(both, NULL, &recsig) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ecdsa_recoverable_signature_convert(both, &normal_sig, NULL) == 0); + CHECK(ecount == 2); + CHECK(secp256k1_ecdsa_recoverable_signature_convert(both, &normal_sig, &recsig) == 1); + + /* Check NULLs for de/serialization */ + CHECK(secp256k1_ecdsa_sign_recoverable(both, &recsig, message, privkey, NULL, NULL) == 1); + ecount = 0; + CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(both, NULL, &recid, &recsig) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(both, sig, NULL, &recsig) == 0); + CHECK(ecount == 2); + CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(both, sig, &recid, NULL) == 0); + CHECK(ecount == 3); + CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(both, sig, &recid, &recsig) == 1); + + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(both, NULL, sig, recid) == 0); + CHECK(ecount == 4); + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(both, &recsig, NULL, recid) == 0); + CHECK(ecount == 5); + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(both, &recsig, sig, -1) == 0); + CHECK(ecount == 6); + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(both, &recsig, sig, 5) == 0); + CHECK(ecount == 7); + /* overflow in signature will fail but not affect ecount */ + memcpy(sig, over_privkey, 32); + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(both, &recsig, sig, recid) == 0); + CHECK(ecount == 7); + + /* cleanup */ + secp256k1_context_destroy(none); + secp256k1_context_destroy(sign); + secp256k1_context_destroy(vrfy); + secp256k1_context_destroy(both); +} + +void test_ecdsa_recovery_end_to_end(void) { + unsigned char extra[32] = {0x00}; + unsigned char privkey[32]; + unsigned char message[32]; + secp256k1_ecdsa_signature signature[5]; + secp256k1_ecdsa_recoverable_signature rsignature[5]; + unsigned char sig[74]; + secp256k1_pubkey pubkey; + secp256k1_pubkey recpubkey; + int recid = 0; + + /* Generate a random key and message. */ + { + secp256k1_scalar msg, key; + random_scalar_order_test(&msg); + random_scalar_order_test(&key); + secp256k1_scalar_get_b32(privkey, &key); + secp256k1_scalar_get_b32(message, &msg); + } + + /* Construct and verify corresponding public key. */ + CHECK(secp256k1_ec_seckey_verify(ctx, privkey) == 1); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, privkey) == 1); + + /* Serialize/parse compact and verify/recover. */ + extra[0] = 0; + CHECK(secp256k1_ecdsa_sign_recoverable(ctx, &rsignature[0], message, privkey, NULL, NULL) == 1); + CHECK(secp256k1_ecdsa_sign(ctx, &signature[0], message, privkey, NULL, NULL) == 1); + CHECK(secp256k1_ecdsa_sign_recoverable(ctx, &rsignature[4], message, privkey, NULL, NULL) == 1); + CHECK(secp256k1_ecdsa_sign_recoverable(ctx, &rsignature[1], message, privkey, NULL, extra) == 1); + extra[31] = 1; + CHECK(secp256k1_ecdsa_sign_recoverable(ctx, &rsignature[2], message, privkey, NULL, extra) == 1); + extra[31] = 0; + extra[0] = 1; + CHECK(secp256k1_ecdsa_sign_recoverable(ctx, &rsignature[3], message, privkey, NULL, extra) == 1); + CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(ctx, sig, &recid, &rsignature[4]) == 1); + CHECK(secp256k1_ecdsa_recoverable_signature_convert(ctx, &signature[4], &rsignature[4]) == 1); + CHECK(memcmp(&signature[4], &signature[0], 64) == 0); + CHECK(secp256k1_ecdsa_verify(ctx, &signature[4], message, &pubkey) == 1); + memset(&rsignature[4], 0, sizeof(rsignature[4])); + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsignature[4], sig, recid) == 1); + CHECK(secp256k1_ecdsa_recoverable_signature_convert(ctx, &signature[4], &rsignature[4]) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &signature[4], message, &pubkey) == 1); + /* Parse compact (with recovery id) and recover. */ + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsignature[4], sig, recid) == 1); + CHECK(secp256k1_ecdsa_recover(ctx, &recpubkey, &rsignature[4], message) == 1); + CHECK(memcmp(&pubkey, &recpubkey, sizeof(pubkey)) == 0); + /* Serialize/destroy/parse signature and verify again. */ + CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(ctx, sig, &recid, &rsignature[4]) == 1); + sig[secp256k1_rand_bits(6)] += 1 + secp256k1_rand_int(255); + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsignature[4], sig, recid) == 1); + CHECK(secp256k1_ecdsa_recoverable_signature_convert(ctx, &signature[4], &rsignature[4]) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &signature[4], message, &pubkey) == 0); + /* Recover again */ + CHECK(secp256k1_ecdsa_recover(ctx, &recpubkey, &rsignature[4], message) == 0 || + memcmp(&pubkey, &recpubkey, sizeof(pubkey)) != 0); +} + +/* Tests several edge cases. */ +void test_ecdsa_recovery_edge_cases(void) { + const unsigned char msg32[32] = { + 'T', 'h', 'i', 's', ' ', 'i', 's', ' ', + 'a', ' ', 'v', 'e', 'r', 'y', ' ', 's', + 'e', 'c', 'r', 'e', 't', ' ', 'm', 'e', + 's', 's', 'a', 'g', 'e', '.', '.', '.' + }; + const unsigned char sig64[64] = { + /* Generated by signing the above message with nonce 'This is the nonce we will use...' + * and secret key 0 (which is not valid), resulting in recid 0. */ + 0x67, 0xCB, 0x28, 0x5F, 0x9C, 0xD1, 0x94, 0xE8, + 0x40, 0xD6, 0x29, 0x39, 0x7A, 0xF5, 0x56, 0x96, + 0x62, 0xFD, 0xE4, 0x46, 0x49, 0x99, 0x59, 0x63, + 0x17, 0x9A, 0x7D, 0xD1, 0x7B, 0xD2, 0x35, 0x32, + 0x4B, 0x1B, 0x7D, 0xF3, 0x4C, 0xE1, 0xF6, 0x8E, + 0x69, 0x4F, 0xF6, 0xF1, 0x1A, 0xC7, 0x51, 0xDD, + 0x7D, 0xD7, 0x3E, 0x38, 0x7E, 0xE4, 0xFC, 0x86, + 0x6E, 0x1B, 0xE8, 0xEC, 0xC7, 0xDD, 0x95, 0x57 + }; + secp256k1_pubkey pubkey; + /* signature (r,s) = (4,4), which can be recovered with all 4 recids. */ + const unsigned char sigb64[64] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + }; + secp256k1_pubkey pubkeyb; + secp256k1_ecdsa_recoverable_signature rsig; + secp256k1_ecdsa_signature sig; + int recid; + + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sig64, 0)); + CHECK(!secp256k1_ecdsa_recover(ctx, &pubkey, &rsig, msg32)); + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sig64, 1)); + CHECK(secp256k1_ecdsa_recover(ctx, &pubkey, &rsig, msg32)); + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sig64, 2)); + CHECK(!secp256k1_ecdsa_recover(ctx, &pubkey, &rsig, msg32)); + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sig64, 3)); + CHECK(!secp256k1_ecdsa_recover(ctx, &pubkey, &rsig, msg32)); + + for (recid = 0; recid < 4; recid++) { + int i; + int recid2; + /* (4,4) encoded in DER. */ + unsigned char sigbder[8] = {0x30, 0x06, 0x02, 0x01, 0x04, 0x02, 0x01, 0x04}; + unsigned char sigcder_zr[7] = {0x30, 0x05, 0x02, 0x00, 0x02, 0x01, 0x01}; + unsigned char sigcder_zs[7] = {0x30, 0x05, 0x02, 0x01, 0x01, 0x02, 0x00}; + unsigned char sigbderalt1[39] = { + 0x30, 0x25, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0x04, + }; + unsigned char sigbderalt2[39] = { + 0x30, 0x25, 0x02, 0x01, 0x04, 0x02, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + }; + unsigned char sigbderalt3[40] = { + 0x30, 0x26, 0x02, 0x21, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0x04, + }; + unsigned char sigbderalt4[40] = { + 0x30, 0x26, 0x02, 0x01, 0x04, 0x02, 0x21, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + }; + /* (order + r,4) encoded in DER. */ + unsigned char sigbderlong[40] = { + 0x30, 0x26, 0x02, 0x21, 0x00, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xBA, 0xAE, 0xDC, + 0xE6, 0xAF, 0x48, 0xA0, 0x3B, 0xBF, 0xD2, 0x5E, + 0x8C, 0xD0, 0x36, 0x41, 0x45, 0x02, 0x01, 0x04 + }; + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sigb64, recid) == 1); + CHECK(secp256k1_ecdsa_recover(ctx, &pubkeyb, &rsig, msg32) == 1); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbder, sizeof(sigbder)) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 1); + for (recid2 = 0; recid2 < 4; recid2++) { + secp256k1_pubkey pubkey2b; + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sigb64, recid2) == 1); + CHECK(secp256k1_ecdsa_recover(ctx, &pubkey2b, &rsig, msg32) == 1); + /* Verifying with (order + r,4) should always fail. */ + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderlong, sizeof(sigbderlong)) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 0); + } + /* DER parsing tests. */ + /* Zero length r/s. */ + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigcder_zr, sizeof(sigcder_zr)) == 0); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigcder_zs, sizeof(sigcder_zs)) == 0); + /* Leading zeros. */ + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt1, sizeof(sigbderalt1)) == 0); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt2, sizeof(sigbderalt2)) == 0); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt3, sizeof(sigbderalt3)) == 0); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt4, sizeof(sigbderalt4)) == 0); + sigbderalt3[4] = 1; + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt3, sizeof(sigbderalt3)) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 0); + sigbderalt4[7] = 1; + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt4, sizeof(sigbderalt4)) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 0); + /* Damage signature. */ + sigbder[7]++; + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbder, sizeof(sigbder)) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 0); + sigbder[7]--; + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbder, 6) == 0); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbder, sizeof(sigbder) - 1) == 0); + for(i = 0; i < 8; i++) { + int c; + unsigned char orig = sigbder[i]; + /*Try every single-byte change.*/ + for (c = 0; c < 256; c++) { + if (c == orig ) { + continue; + } + sigbder[i] = c; + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbder, sizeof(sigbder)) == 0 || secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 0); + } + sigbder[i] = orig; + } + } + + /* Test r/s equal to zero */ + { + /* (1,1) encoded in DER. */ + unsigned char sigcder[8] = {0x30, 0x06, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01}; + unsigned char sigc64[64] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + }; + secp256k1_pubkey pubkeyc; + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sigc64, 0) == 1); + CHECK(secp256k1_ecdsa_recover(ctx, &pubkeyc, &rsig, msg32) == 1); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigcder, sizeof(sigcder)) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyc) == 1); + sigcder[4] = 0; + sigc64[31] = 0; + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sigc64, 0) == 1); + CHECK(secp256k1_ecdsa_recover(ctx, &pubkeyb, &rsig, msg32) == 0); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigcder, sizeof(sigcder)) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyc) == 0); + sigcder[4] = 1; + sigcder[7] = 0; + sigc64[31] = 1; + sigc64[63] = 0; + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sigc64, 0) == 1); + CHECK(secp256k1_ecdsa_recover(ctx, &pubkeyb, &rsig, msg32) == 0); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigcder, sizeof(sigcder)) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyc) == 0); + } +} + +void run_recovery_tests(void) { + int i; + for (i = 0; i < count; i++) { + test_ecdsa_recovery_api(); + } + for (i = 0; i < 64*count; i++) { + test_ecdsa_recovery_end_to_end(); + } + test_ecdsa_recovery_edge_cases(); +} + +#endif diff --git a/src/num.h b/src/num.h index 339b6bb6e..7bb9c5be8 100644 --- a/src/num.h +++ b/src/num.h @@ -20,48 +20,54 @@ #endif /** Copy a number. */ -static void secp256k1_num_copy(secp256k1_num_t *r, const secp256k1_num_t *a); +static void secp256k1_num_copy(secp256k1_num *r, const secp256k1_num *a); /** Convert a number's absolute value to a binary big-endian string. * There must be enough place. */ -static void secp256k1_num_get_bin(unsigned char *r, unsigned int rlen, const secp256k1_num_t *a); +static void secp256k1_num_get_bin(unsigned char *r, unsigned int rlen, const secp256k1_num *a); /** Set a number to the value of a binary big-endian string. */ -static void secp256k1_num_set_bin(secp256k1_num_t *r, const unsigned char *a, unsigned int alen); +static void secp256k1_num_set_bin(secp256k1_num *r, const unsigned char *a, unsigned int alen); /** Compute a modular inverse. The input must be less than the modulus. */ -static void secp256k1_num_mod_inverse(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *m); +static void secp256k1_num_mod_inverse(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *m); + +/** Compute the jacobi symbol (a|b). b must be positive and odd. */ +static int secp256k1_num_jacobi(const secp256k1_num *a, const secp256k1_num *b); /** Compare the absolute value of two numbers. */ -static int secp256k1_num_cmp(const secp256k1_num_t *a, const secp256k1_num_t *b); +static int secp256k1_num_cmp(const secp256k1_num *a, const secp256k1_num *b); /** Test whether two number are equal (including sign). */ -static int secp256k1_num_eq(const secp256k1_num_t *a, const secp256k1_num_t *b); +static int secp256k1_num_eq(const secp256k1_num *a, const secp256k1_num *b); /** Add two (signed) numbers. */ -static void secp256k1_num_add(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b); +static void secp256k1_num_add(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b); /** Subtract two (signed) numbers. */ -static void secp256k1_num_sub(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b); +static void secp256k1_num_sub(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b); /** Multiply two (signed) numbers. */ -static void secp256k1_num_mul(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b); +static void secp256k1_num_mul(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b); /** Replace a number by its remainder modulo m. M's sign is ignored. The result is a number between 0 and m-1, even if r was negative. */ -static void secp256k1_num_mod(secp256k1_num_t *r, const secp256k1_num_t *m); +static void secp256k1_num_mod(secp256k1_num *r, const secp256k1_num *m); /** Right-shift the passed number by bits bits. */ -static void secp256k1_num_shift(secp256k1_num_t *r, int bits); +static void secp256k1_num_shift(secp256k1_num *r, int bits); /** Check whether a number is zero. */ -static int secp256k1_num_is_zero(const secp256k1_num_t *a); +static int secp256k1_num_is_zero(const secp256k1_num *a); + +/** Check whether a number is one. */ +static int secp256k1_num_is_one(const secp256k1_num *a); /** Check whether a number is strictly negative. */ -static int secp256k1_num_is_neg(const secp256k1_num_t *a); +static int secp256k1_num_is_neg(const secp256k1_num *a); /** Change a number's sign. */ -static void secp256k1_num_negate(secp256k1_num_t *r); +static void secp256k1_num_negate(secp256k1_num *r); #endif diff --git a/src/num_gmp.h b/src/num_gmp.h index baa1f2bf2..7dd813088 100644 --- a/src/num_gmp.h +++ b/src/num_gmp.h @@ -15,6 +15,6 @@ typedef struct { mp_limb_t data[2*NUM_LIMBS]; int neg; int limbs; -} secp256k1_num_t; +} secp256k1_num; #endif diff --git a/src/num_gmp_impl.h b/src/num_gmp_impl.h index dbbc458d5..3a46495ee 100644 --- a/src/num_gmp_impl.h +++ b/src/num_gmp_impl.h @@ -15,18 +15,18 @@ #include "num.h" #ifdef VERIFY -static void secp256k1_num_sanity(const secp256k1_num_t *a) { +static void secp256k1_num_sanity(const secp256k1_num *a) { VERIFY_CHECK(a->limbs == 1 || (a->limbs > 1 && a->data[a->limbs-1] != 0)); } #else #define secp256k1_num_sanity(a) do { } while(0) #endif -static void secp256k1_num_copy(secp256k1_num_t *r, const secp256k1_num_t *a) { +static void secp256k1_num_copy(secp256k1_num *r, const secp256k1_num *a) { *r = *a; } -static void secp256k1_num_get_bin(unsigned char *r, unsigned int rlen, const secp256k1_num_t *a) { +static void secp256k1_num_get_bin(unsigned char *r, unsigned int rlen, const secp256k1_num *a) { unsigned char tmp[65]; int len = 0; int shift = 0; @@ -42,7 +42,7 @@ static void secp256k1_num_get_bin(unsigned char *r, unsigned int rlen, const sec memset(tmp, 0, sizeof(tmp)); } -static void secp256k1_num_set_bin(secp256k1_num_t *r, const unsigned char *a, unsigned int alen) { +static void secp256k1_num_set_bin(secp256k1_num *r, const unsigned char *a, unsigned int alen) { int len; VERIFY_CHECK(alen > 0); VERIFY_CHECK(alen <= 64); @@ -59,7 +59,7 @@ static void secp256k1_num_set_bin(secp256k1_num_t *r, const unsigned char *a, un } } -static void secp256k1_num_add_abs(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b) { +static void secp256k1_num_add_abs(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b) { mp_limb_t c = mpn_add(r->data, a->data, a->limbs, b->data, b->limbs); r->limbs = a->limbs; if (c != 0) { @@ -68,8 +68,9 @@ static void secp256k1_num_add_abs(secp256k1_num_t *r, const secp256k1_num_t *a, } } -static void secp256k1_num_sub_abs(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b) { +static void secp256k1_num_sub_abs(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b) { mp_limb_t c = mpn_sub(r->data, a->data, a->limbs, b->data, b->limbs); + (void)c; VERIFY_CHECK(c == 0); r->limbs = a->limbs; while (r->limbs > 1 && r->data[r->limbs-1]==0) { @@ -77,7 +78,7 @@ static void secp256k1_num_sub_abs(secp256k1_num_t *r, const secp256k1_num_t *a, } } -static void secp256k1_num_mod(secp256k1_num_t *r, const secp256k1_num_t *m) { +static void secp256k1_num_mod(secp256k1_num *r, const secp256k1_num *m) { secp256k1_num_sanity(r); secp256k1_num_sanity(m); @@ -97,7 +98,7 @@ static void secp256k1_num_mod(secp256k1_num_t *r, const secp256k1_num_t *m) { } } -static void secp256k1_num_mod_inverse(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *m) { +static void secp256k1_num_mod_inverse(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *m) { int i; mp_limb_t g[NUM_LIMBS+1]; mp_limb_t u[NUM_LIMBS+1]; @@ -125,6 +126,7 @@ static void secp256k1_num_mod_inverse(secp256k1_num_t *r, const secp256k1_num_t } sn = NUM_LIMBS+1; gn = mpn_gcdext(g, r->data, &sn, u, m->limbs, v, m->limbs); + (void)gn; VERIFY_CHECK(gn == 1); VERIFY_CHECK(g[0] == 1); r->neg = a->neg ^ m->neg; @@ -142,15 +144,41 @@ static void secp256k1_num_mod_inverse(secp256k1_num_t *r, const secp256k1_num_t memset(v, 0, sizeof(v)); } -static int secp256k1_num_is_zero(const secp256k1_num_t *a) { +static int secp256k1_num_jacobi(const secp256k1_num *a, const secp256k1_num *b) { + int ret; + mpz_t ga, gb; + secp256k1_num_sanity(a); + secp256k1_num_sanity(b); + VERIFY_CHECK(!b->neg && (b->limbs > 0) && (b->data[0] & 1)); + + mpz_inits(ga, gb, NULL); + + mpz_import(gb, b->limbs, -1, sizeof(mp_limb_t), 0, 0, b->data); + mpz_import(ga, a->limbs, -1, sizeof(mp_limb_t), 0, 0, a->data); + if (a->neg) { + mpz_neg(ga, ga); + } + + ret = mpz_jacobi(ga, gb); + + mpz_clears(ga, gb, NULL); + + return ret; +} + +static int secp256k1_num_is_one(const secp256k1_num *a) { + return (a->limbs == 1 && a->data[0] == 1); +} + +static int secp256k1_num_is_zero(const secp256k1_num *a) { return (a->limbs == 1 && a->data[0] == 0); } -static int secp256k1_num_is_neg(const secp256k1_num_t *a) { +static int secp256k1_num_is_neg(const secp256k1_num *a) { return (a->limbs > 1 || a->data[0] != 0) && a->neg; } -static int secp256k1_num_cmp(const secp256k1_num_t *a, const secp256k1_num_t *b) { +static int secp256k1_num_cmp(const secp256k1_num *a, const secp256k1_num *b) { if (a->limbs > b->limbs) { return 1; } @@ -160,7 +188,7 @@ static int secp256k1_num_cmp(const secp256k1_num_t *a, const secp256k1_num_t *b) return mpn_cmp(a->data, b->data, a->limbs); } -static int secp256k1_num_eq(const secp256k1_num_t *a, const secp256k1_num_t *b) { +static int secp256k1_num_eq(const secp256k1_num *a, const secp256k1_num *b) { if (a->limbs > b->limbs) { return 0; } @@ -173,7 +201,7 @@ static int secp256k1_num_eq(const secp256k1_num_t *a, const secp256k1_num_t *b) return mpn_cmp(a->data, b->data, a->limbs) == 0; } -static void secp256k1_num_subadd(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b, int bneg) { +static void secp256k1_num_subadd(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b, int bneg) { if (!(b->neg ^ bneg ^ a->neg)) { /* a and b have the same sign */ r->neg = a->neg; if (a->limbs >= b->limbs) { @@ -192,19 +220,19 @@ static void secp256k1_num_subadd(secp256k1_num_t *r, const secp256k1_num_t *a, c } } -static void secp256k1_num_add(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b) { +static void secp256k1_num_add(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b) { secp256k1_num_sanity(a); secp256k1_num_sanity(b); secp256k1_num_subadd(r, a, b, 0); } -static void secp256k1_num_sub(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b) { +static void secp256k1_num_sub(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b) { secp256k1_num_sanity(a); secp256k1_num_sanity(b); secp256k1_num_subadd(r, a, b, 1); } -static void secp256k1_num_mul(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b) { +static void secp256k1_num_mul(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b) { mp_limb_t tmp[2*NUM_LIMBS+1]; secp256k1_num_sanity(a); secp256k1_num_sanity(b); @@ -231,13 +259,13 @@ static void secp256k1_num_mul(secp256k1_num_t *r, const secp256k1_num_t *a, cons memset(tmp, 0, sizeof(tmp)); } -static void secp256k1_num_shift(secp256k1_num_t *r, int bits) { - int i; +static void secp256k1_num_shift(secp256k1_num *r, int bits) { if (bits % GMP_NUMB_BITS) { /* Shift within limbs. */ mpn_rshift(r->data, r->data, r->limbs, bits % GMP_NUMB_BITS); } if (bits >= GMP_NUMB_BITS) { + int i; /* Shift full limbs. */ for (i = 0; i < r->limbs; i++) { int index = i + (bits / GMP_NUMB_BITS); @@ -253,7 +281,7 @@ static void secp256k1_num_shift(secp256k1_num_t *r, int bits) { } } -static void secp256k1_num_negate(secp256k1_num_t *r) { +static void secp256k1_num_negate(secp256k1_num *r) { r->neg ^= 1; } diff --git a/src/scalar.h b/src/scalar.h index f5d09f8d4..27e9d8375 100644 --- a/src/scalar.h +++ b/src/scalar.h @@ -13,7 +13,9 @@ #include "libsecp256k1-config.h" #endif -#if defined(USE_SCALAR_4X64) +#if defined(EXHAUSTIVE_TEST_ORDER) +#include "scalar_low.h" +#elif defined(USE_SCALAR_4X64) #include "scalar_4x64.h" #elif defined(USE_SCALAR_8X32) #include "scalar_8x32.h" @@ -22,72 +24,83 @@ #endif /** Clear a scalar to prevent the leak of sensitive data. */ -static void secp256k1_scalar_clear(secp256k1_scalar_t *r); +static void secp256k1_scalar_clear(secp256k1_scalar *r); /** Access bits from a scalar. All requested bits must belong to the same 32-bit limb. */ -static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar_t *a, unsigned int offset, unsigned int count); +static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar *a, unsigned int offset, unsigned int count); /** Access bits from a scalar. Not constant time. */ -static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar_t *a, unsigned int offset, unsigned int count); +static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar *a, unsigned int offset, unsigned int count); /** Set a scalar from a big endian byte array. */ -static void secp256k1_scalar_set_b32(secp256k1_scalar_t *r, const unsigned char *bin, int *overflow); +static void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *bin, int *overflow); /** Set a scalar to an unsigned integer. */ -static void secp256k1_scalar_set_int(secp256k1_scalar_t *r, unsigned int v); +static void secp256k1_scalar_set_int(secp256k1_scalar *r, unsigned int v); /** Convert a scalar to a byte array. */ -static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar_t* a); +static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar* a); /** Add two scalars together (modulo the group order). Returns whether it overflowed. */ -static int secp256k1_scalar_add(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b); +static int secp256k1_scalar_add(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b); -/** Add a power of two to a scalar. The result is not allowed to overflow. */ -static void secp256k1_scalar_add_bit(secp256k1_scalar_t *r, unsigned int bit); +/** Conditionally add a power of two to a scalar. The result is not allowed to overflow. */ +static void secp256k1_scalar_cadd_bit(secp256k1_scalar *r, unsigned int bit, int flag); /** Multiply two scalars (modulo the group order). */ -static void secp256k1_scalar_mul(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b); +static void secp256k1_scalar_mul(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b); + +/** Shift a scalar right by some amount strictly between 0 and 16, returning + * the low bits that were shifted off */ +static int secp256k1_scalar_shr_int(secp256k1_scalar *r, int n); /** Compute the square of a scalar (modulo the group order). */ -static void secp256k1_scalar_sqr(secp256k1_scalar_t *r, const secp256k1_scalar_t *a); +static void secp256k1_scalar_sqr(secp256k1_scalar *r, const secp256k1_scalar *a); /** Compute the inverse of a scalar (modulo the group order). */ -static void secp256k1_scalar_inverse(secp256k1_scalar_t *r, const secp256k1_scalar_t *a); +static void secp256k1_scalar_inverse(secp256k1_scalar *r, const secp256k1_scalar *a); /** Compute the inverse of a scalar (modulo the group order), without constant-time guarantee. */ -static void secp256k1_scalar_inverse_var(secp256k1_scalar_t *r, const secp256k1_scalar_t *a); +static void secp256k1_scalar_inverse_var(secp256k1_scalar *r, const secp256k1_scalar *a); /** Compute the complement of a scalar (modulo the group order). */ -static void secp256k1_scalar_negate(secp256k1_scalar_t *r, const secp256k1_scalar_t *a); +static void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar *a); /** Check whether a scalar equals zero. */ -static int secp256k1_scalar_is_zero(const secp256k1_scalar_t *a); +static int secp256k1_scalar_is_zero(const secp256k1_scalar *a); /** Check whether a scalar equals one. */ -static int secp256k1_scalar_is_one(const secp256k1_scalar_t *a); +static int secp256k1_scalar_is_one(const secp256k1_scalar *a); + +/** Check whether a scalar, considered as an nonnegative integer, is even. */ +static int secp256k1_scalar_is_even(const secp256k1_scalar *a); /** Check whether a scalar is higher than the group order divided by 2. */ -static int secp256k1_scalar_is_high(const secp256k1_scalar_t *a); +static int secp256k1_scalar_is_high(const secp256k1_scalar *a); + +/** Conditionally negate a number, in constant time. + * Returns -1 if the number was negated, 1 otherwise */ +static int secp256k1_scalar_cond_negate(secp256k1_scalar *a, int flag); #ifndef USE_NUM_NONE /** Convert a scalar to a number. */ -static void secp256k1_scalar_get_num(secp256k1_num_t *r, const secp256k1_scalar_t *a); +static void secp256k1_scalar_get_num(secp256k1_num *r, const secp256k1_scalar *a); /** Get the order of the group as a number. */ -static void secp256k1_scalar_order_get_num(secp256k1_num_t *r); +static void secp256k1_scalar_order_get_num(secp256k1_num *r); #endif /** Compare two scalars. */ -static int secp256k1_scalar_eq(const secp256k1_scalar_t *a, const secp256k1_scalar_t *b); +static int secp256k1_scalar_eq(const secp256k1_scalar *a, const secp256k1_scalar *b); #ifdef USE_ENDOMORPHISM /** Find r1 and r2 such that r1+r2*2^128 = a. */ -static void secp256k1_scalar_split_128(secp256k1_scalar_t *r1, secp256k1_scalar_t *r2, const secp256k1_scalar_t *a); +static void secp256k1_scalar_split_128(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a); /** Find r1 and r2 such that r1+r2*lambda = a, and r1 and r2 are maximum 128 bits long (see secp256k1_gej_mul_lambda). */ -static void secp256k1_scalar_split_lambda_var(secp256k1_scalar_t *r1, secp256k1_scalar_t *r2, const secp256k1_scalar_t *a); +static void secp256k1_scalar_split_lambda(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a); #endif /** Multiply a and b (without taking the modulus!), divide by 2**shift, and round to the nearest integer. Shift must be at least 256. */ -static void secp256k1_scalar_mul_shift_var(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b, unsigned int shift); +static void secp256k1_scalar_mul_shift_var(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b, unsigned int shift); #endif diff --git a/src/scalar_4x64.h b/src/scalar_4x64.h index 82899aa7b..cff406038 100644 --- a/src/scalar_4x64.h +++ b/src/scalar_4x64.h @@ -12,7 +12,7 @@ /** A scalar modulo the group order of the secp256k1 curve. */ typedef struct { uint64_t d[4]; -} secp256k1_scalar_t; +} secp256k1_scalar; #define SECP256K1_SCALAR_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{((uint64_t)(d1)) << 32 | (d0), ((uint64_t)(d3)) << 32 | (d2), ((uint64_t)(d5)) << 32 | (d4), ((uint64_t)(d7)) << 32 | (d6)}} diff --git a/src/scalar_4x64_impl.h b/src/scalar_4x64_impl.h index ff365292f..56e7bd82a 100644 --- a/src/scalar_4x64_impl.h +++ b/src/scalar_4x64_impl.h @@ -24,26 +24,26 @@ #define SECP256K1_N_H_2 ((uint64_t)0xFFFFFFFFFFFFFFFFULL) #define SECP256K1_N_H_3 ((uint64_t)0x7FFFFFFFFFFFFFFFULL) -SECP256K1_INLINE static void secp256k1_scalar_clear(secp256k1_scalar_t *r) { +SECP256K1_INLINE static void secp256k1_scalar_clear(secp256k1_scalar *r) { r->d[0] = 0; r->d[1] = 0; r->d[2] = 0; r->d[3] = 0; } -SECP256K1_INLINE static void secp256k1_scalar_set_int(secp256k1_scalar_t *r, unsigned int v) { +SECP256K1_INLINE static void secp256k1_scalar_set_int(secp256k1_scalar *r, unsigned int v) { r->d[0] = v; r->d[1] = 0; r->d[2] = 0; r->d[3] = 0; } -SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar_t *a, unsigned int offset, unsigned int count) { +SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar *a, unsigned int offset, unsigned int count) { VERIFY_CHECK((offset + count - 1) >> 6 == offset >> 6); return (a->d[offset >> 6] >> (offset & 0x3F)) & ((((uint64_t)1) << count) - 1); } -SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar_t *a, unsigned int offset, unsigned int count) { +SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar *a, unsigned int offset, unsigned int count) { VERIFY_CHECK(count < 32); VERIFY_CHECK(offset + count <= 256); if ((offset + count - 1) >> 6 == offset >> 6) { @@ -54,7 +54,7 @@ SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits_var(const secp256 } } -SECP256K1_INLINE static int secp256k1_scalar_check_overflow(const secp256k1_scalar_t *a) { +SECP256K1_INLINE static int secp256k1_scalar_check_overflow(const secp256k1_scalar *a) { int yes = 0; int no = 0; no |= (a->d[3] < SECP256K1_N_3); /* No need for a > check. */ @@ -66,7 +66,7 @@ SECP256K1_INLINE static int secp256k1_scalar_check_overflow(const secp256k1_scal return yes; } -SECP256K1_INLINE static int secp256k1_scalar_reduce(secp256k1_scalar_t *r, unsigned int overflow) { +SECP256K1_INLINE static int secp256k1_scalar_reduce(secp256k1_scalar *r, unsigned int overflow) { uint128_t t; VERIFY_CHECK(overflow <= 1); t = (uint128_t)r->d[0] + overflow * SECP256K1_N_C_0; @@ -80,7 +80,7 @@ SECP256K1_INLINE static int secp256k1_scalar_reduce(secp256k1_scalar_t *r, unsig return overflow; } -static int secp256k1_scalar_add(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { +static int secp256k1_scalar_add(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) { int overflow; uint128_t t = (uint128_t)a->d[0] + b->d[0]; r->d[0] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; @@ -96,9 +96,10 @@ static int secp256k1_scalar_add(secp256k1_scalar_t *r, const secp256k1_scalar_t return overflow; } -static void secp256k1_scalar_add_bit(secp256k1_scalar_t *r, unsigned int bit) { +static void secp256k1_scalar_cadd_bit(secp256k1_scalar *r, unsigned int bit, int flag) { uint128_t t; VERIFY_CHECK(bit < 256); + bit += ((uint32_t) flag - 1) & 0x100; /* forcing (bit >> 6) > 3 makes this a noop */ t = (uint128_t)r->d[0] + (((uint64_t)((bit >> 6) == 0)) << (bit & 0x3F)); r->d[0] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; t += (uint128_t)r->d[1] + (((uint64_t)((bit >> 6) == 1)) << (bit & 0x3F)); @@ -113,7 +114,7 @@ static void secp256k1_scalar_add_bit(secp256k1_scalar_t *r, unsigned int bit) { #endif } -static void secp256k1_scalar_set_b32(secp256k1_scalar_t *r, const unsigned char *b32, int *overflow) { +static void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *b32, int *overflow) { int over; r->d[0] = (uint64_t)b32[31] | (uint64_t)b32[30] << 8 | (uint64_t)b32[29] << 16 | (uint64_t)b32[28] << 24 | (uint64_t)b32[27] << 32 | (uint64_t)b32[26] << 40 | (uint64_t)b32[25] << 48 | (uint64_t)b32[24] << 56; r->d[1] = (uint64_t)b32[23] | (uint64_t)b32[22] << 8 | (uint64_t)b32[21] << 16 | (uint64_t)b32[20] << 24 | (uint64_t)b32[19] << 32 | (uint64_t)b32[18] << 40 | (uint64_t)b32[17] << 48 | (uint64_t)b32[16] << 56; @@ -125,18 +126,18 @@ static void secp256k1_scalar_set_b32(secp256k1_scalar_t *r, const unsigned char } } -static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar_t* a) { +static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar* a) { bin[0] = a->d[3] >> 56; bin[1] = a->d[3] >> 48; bin[2] = a->d[3] >> 40; bin[3] = a->d[3] >> 32; bin[4] = a->d[3] >> 24; bin[5] = a->d[3] >> 16; bin[6] = a->d[3] >> 8; bin[7] = a->d[3]; bin[8] = a->d[2] >> 56; bin[9] = a->d[2] >> 48; bin[10] = a->d[2] >> 40; bin[11] = a->d[2] >> 32; bin[12] = a->d[2] >> 24; bin[13] = a->d[2] >> 16; bin[14] = a->d[2] >> 8; bin[15] = a->d[2]; bin[16] = a->d[1] >> 56; bin[17] = a->d[1] >> 48; bin[18] = a->d[1] >> 40; bin[19] = a->d[1] >> 32; bin[20] = a->d[1] >> 24; bin[21] = a->d[1] >> 16; bin[22] = a->d[1] >> 8; bin[23] = a->d[1]; bin[24] = a->d[0] >> 56; bin[25] = a->d[0] >> 48; bin[26] = a->d[0] >> 40; bin[27] = a->d[0] >> 32; bin[28] = a->d[0] >> 24; bin[29] = a->d[0] >> 16; bin[30] = a->d[0] >> 8; bin[31] = a->d[0]; } -SECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar_t *a) { +SECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar *a) { return (a->d[0] | a->d[1] | a->d[2] | a->d[3]) == 0; } -static void secp256k1_scalar_negate(secp256k1_scalar_t *r, const secp256k1_scalar_t *a) { +static void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar *a) { uint64_t nonzero = 0xFFFFFFFFFFFFFFFFULL * (secp256k1_scalar_is_zero(a) == 0); uint128_t t = (uint128_t)(~a->d[0]) + SECP256K1_N_0 + 1; r->d[0] = t & nonzero; t >>= 64; @@ -148,11 +149,11 @@ static void secp256k1_scalar_negate(secp256k1_scalar_t *r, const secp256k1_scala r->d[3] = t & nonzero; } -SECP256K1_INLINE static int secp256k1_scalar_is_one(const secp256k1_scalar_t *a) { +SECP256K1_INLINE static int secp256k1_scalar_is_one(const secp256k1_scalar *a) { return ((a->d[0] ^ 1) | a->d[1] | a->d[2] | a->d[3]) == 0; } -static int secp256k1_scalar_is_high(const secp256k1_scalar_t *a) { +static int secp256k1_scalar_is_high(const secp256k1_scalar *a) { int yes = 0; int no = 0; no |= (a->d[3] < SECP256K1_N_H_3); @@ -164,6 +165,22 @@ static int secp256k1_scalar_is_high(const secp256k1_scalar_t *a) { return yes; } +static int secp256k1_scalar_cond_negate(secp256k1_scalar *r, int flag) { + /* If we are flag = 0, mask = 00...00 and this is a no-op; + * if we are flag = 1, mask = 11...11 and this is identical to secp256k1_scalar_negate */ + uint64_t mask = !flag - 1; + uint64_t nonzero = (secp256k1_scalar_is_zero(r) != 0) - 1; + uint128_t t = (uint128_t)(r->d[0] ^ mask) + ((SECP256K1_N_0 + 1) & mask); + r->d[0] = t & nonzero; t >>= 64; + t += (uint128_t)(r->d[1] ^ mask) + (SECP256K1_N_1 & mask); + r->d[1] = t & nonzero; t >>= 64; + t += (uint128_t)(r->d[2] ^ mask) + (SECP256K1_N_2 & mask); + r->d[2] = t & nonzero; t >>= 64; + t += (uint128_t)(r->d[3] ^ mask) + (SECP256K1_N_3 & mask); + r->d[3] = t & nonzero; + return 2 * (mask == 0) - 1; +} + /* Inspired by the macros in OpenSSL's crypto/bn/asm/x86_64-gcc.c. */ /** Add a*b to the number defined by (c0,c1,c2). c2 must never overflow. */ @@ -250,7 +267,7 @@ static int secp256k1_scalar_is_high(const secp256k1_scalar_t *a) { VERIFY_CHECK(c2 == 0); \ } -static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint64_t *l) { +static void secp256k1_scalar_reduce_512(secp256k1_scalar *r, const uint64_t *l) { #ifdef USE_ASM_X86_64 /* Reduce 512 bits into 385. */ uint64_t m0, m1, m2, m3, m4, m5, m6; @@ -265,8 +282,8 @@ static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint64_t *l "movq 56(%%rsi), %%r14\n" /* Initialize r8,r9,r10 */ "movq 0(%%rsi), %%r8\n" - "movq $0, %%r9\n" - "movq $0, %%r10\n" + "xorq %%r9, %%r9\n" + "xorq %%r10, %%r10\n" /* (r8,r9) += n0 * c0 */ "movq %8, %%rax\n" "mulq %%r11\n" @@ -274,7 +291,7 @@ static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint64_t *l "adcq %%rdx, %%r9\n" /* extract m0 */ "movq %%r8, %q0\n" - "movq $0, %%r8\n" + "xorq %%r8, %%r8\n" /* (r9,r10) += l1 */ "addq 8(%%rsi), %%r9\n" "adcq $0, %%r10\n" @@ -292,7 +309,7 @@ static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint64_t *l "adcq $0, %%r8\n" /* extract m1 */ "movq %%r9, %q1\n" - "movq $0, %%r9\n" + "xorq %%r9, %%r9\n" /* (r10,r8,r9) += l2 */ "addq 16(%%rsi), %%r10\n" "adcq $0, %%r8\n" @@ -315,7 +332,7 @@ static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint64_t *l "adcq $0, %%r9\n" /* extract m2 */ "movq %%r10, %q2\n" - "movq $0, %%r10\n" + "xorq %%r10, %%r10\n" /* (r8,r9,r10) += l3 */ "addq 24(%%rsi), %%r8\n" "adcq $0, %%r9\n" @@ -338,7 +355,7 @@ static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint64_t *l "adcq $0, %%r10\n" /* extract m3 */ "movq %%r8, %q3\n" - "movq $0, %%r8\n" + "xorq %%r8, %%r8\n" /* (r9,r10,r8) += n3 * c1 */ "movq %9, %%rax\n" "mulq %%r14\n" @@ -370,8 +387,8 @@ static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint64_t *l "movq %q11, %%r13\n" /* Initialize (r8,r9,r10) */ "movq %q5, %%r8\n" - "movq $0, %%r9\n" - "movq $0, %%r10\n" + "xorq %%r9, %%r9\n" + "xorq %%r10, %%r10\n" /* (r8,r9) += m4 * c0 */ "movq %12, %%rax\n" "mulq %%r11\n" @@ -379,7 +396,7 @@ static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint64_t *l "adcq %%rdx, %%r9\n" /* extract p0 */ "movq %%r8, %q0\n" - "movq $0, %%r8\n" + "xorq %%r8, %%r8\n" /* (r9,r10) += m1 */ "addq %q6, %%r9\n" "adcq $0, %%r10\n" @@ -397,7 +414,7 @@ static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint64_t *l "adcq $0, %%r8\n" /* extract p1 */ "movq %%r9, %q1\n" - "movq $0, %%r9\n" + "xorq %%r9, %%r9\n" /* (r10,r8,r9) += m2 */ "addq %q7, %%r10\n" "adcq $0, %%r8\n" @@ -455,7 +472,7 @@ static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint64_t *l "movq %%rax, 0(%q6)\n" /* Move to (r8,r9) */ "movq %%rdx, %%r8\n" - "movq $0, %%r9\n" + "xorq %%r9, %%r9\n" /* (r8,r9) += p1 */ "addq %q2, %%r8\n" "adcq $0, %%r9\n" @@ -466,7 +483,7 @@ static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint64_t *l "adcq %%rdx, %%r9\n" /* Extract r1 */ "movq %%r8, 8(%q6)\n" - "movq $0, %%r8\n" + "xorq %%r8, %%r8\n" /* (r9,r8) += p4 */ "addq %%r10, %%r9\n" "adcq $0, %%r8\n" @@ -475,7 +492,7 @@ static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint64_t *l "adcq $0, %%r8\n" /* Extract r2 */ "movq %%r9, 16(%q6)\n" - "movq $0, %%r9\n" + "xorq %%r9, %%r9\n" /* (r8,r9) += p3 */ "addq %q4, %%r8\n" "adcq $0, %%r9\n" @@ -559,7 +576,7 @@ static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint64_t *l secp256k1_scalar_reduce(r, c + secp256k1_scalar_check_overflow(r)); } -static void secp256k1_scalar_mul_512(uint64_t l[8], const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { +static void secp256k1_scalar_mul_512(uint64_t l[8], const secp256k1_scalar *a, const secp256k1_scalar *b) { #ifdef USE_ASM_X86_64 const uint64_t *pb = b->d; __asm__ __volatile__( @@ -721,12 +738,12 @@ static void secp256k1_scalar_mul_512(uint64_t l[8], const secp256k1_scalar_t *a, extract(l[5]); muladd_fast(a->d[3], b->d[3]); extract_fast(l[6]); - VERIFY_CHECK(c1 <= 0); + VERIFY_CHECK(c1 == 0); l[7] = c0; #endif } -static void secp256k1_scalar_sqr_512(uint64_t l[8], const secp256k1_scalar_t *a) { +static void secp256k1_scalar_sqr_512(uint64_t l[8], const secp256k1_scalar *a) { #ifdef USE_ASM_X86_64 __asm__ __volatile__( /* Preload */ @@ -871,19 +888,32 @@ static void secp256k1_scalar_sqr_512(uint64_t l[8], const secp256k1_scalar_t *a) #undef extract #undef extract_fast -static void secp256k1_scalar_mul(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { +static void secp256k1_scalar_mul(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) { uint64_t l[8]; secp256k1_scalar_mul_512(l, a, b); secp256k1_scalar_reduce_512(r, l); } -static void secp256k1_scalar_sqr(secp256k1_scalar_t *r, const secp256k1_scalar_t *a) { +static int secp256k1_scalar_shr_int(secp256k1_scalar *r, int n) { + int ret; + VERIFY_CHECK(n > 0); + VERIFY_CHECK(n < 16); + ret = r->d[0] & ((1 << n) - 1); + r->d[0] = (r->d[0] >> n) + (r->d[1] << (64 - n)); + r->d[1] = (r->d[1] >> n) + (r->d[2] << (64 - n)); + r->d[2] = (r->d[2] >> n) + (r->d[3] << (64 - n)); + r->d[3] = (r->d[3] >> n); + return ret; +} + +static void secp256k1_scalar_sqr(secp256k1_scalar *r, const secp256k1_scalar *a) { uint64_t l[8]; secp256k1_scalar_sqr_512(l, a); secp256k1_scalar_reduce_512(r, l); } -static void secp256k1_scalar_split_128(secp256k1_scalar_t *r1, secp256k1_scalar_t *r2, const secp256k1_scalar_t *a) { +#ifdef USE_ENDOMORPHISM +static void secp256k1_scalar_split_128(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a) { r1->d[0] = a->d[0]; r1->d[1] = a->d[1]; r1->d[2] = 0; @@ -893,12 +923,13 @@ static void secp256k1_scalar_split_128(secp256k1_scalar_t *r1, secp256k1_scalar_ r2->d[2] = 0; r2->d[3] = 0; } +#endif -SECP256K1_INLINE static int secp256k1_scalar_eq(const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { +SECP256K1_INLINE static int secp256k1_scalar_eq(const secp256k1_scalar *a, const secp256k1_scalar *b) { return ((a->d[0] ^ b->d[0]) | (a->d[1] ^ b->d[1]) | (a->d[2] ^ b->d[2]) | (a->d[3] ^ b->d[3])) == 0; } -SECP256K1_INLINE static void secp256k1_scalar_mul_shift_var(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b, unsigned int shift) { +SECP256K1_INLINE static void secp256k1_scalar_mul_shift_var(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b, unsigned int shift) { uint64_t l[8]; unsigned int shiftlimbs; unsigned int shiftlow; @@ -912,9 +943,7 @@ SECP256K1_INLINE static void secp256k1_scalar_mul_shift_var(secp256k1_scalar_t * r->d[1] = shift < 448 ? (l[1 + shiftlimbs] >> shiftlow | (shift < 384 && shiftlow ? (l[2 + shiftlimbs] << shifthigh) : 0)) : 0; r->d[2] = shift < 384 ? (l[2 + shiftlimbs] >> shiftlow | (shift < 320 && shiftlow ? (l[3 + shiftlimbs] << shifthigh) : 0)) : 0; r->d[3] = shift < 320 ? (l[3 + shiftlimbs] >> shiftlow) : 0; - if ((l[(shift - 1) >> 6] >> ((shift - 1) & 0x3f)) & 1) { - secp256k1_scalar_add_bit(r, 0); - } + secp256k1_scalar_cadd_bit(r, 0, (l[(shift - 1) >> 6] >> ((shift - 1) & 0x3f)) & 1); } #endif diff --git a/src/scalar_8x32.h b/src/scalar_8x32.h index f17017e24..1319664f6 100644 --- a/src/scalar_8x32.h +++ b/src/scalar_8x32.h @@ -12,7 +12,7 @@ /** A scalar modulo the group order of the secp256k1 curve. */ typedef struct { uint32_t d[8]; -} secp256k1_scalar_t; +} secp256k1_scalar; #define SECP256K1_SCALAR_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{(d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7)}} diff --git a/src/scalar_8x32_impl.h b/src/scalar_8x32_impl.h index 22b31d411..aae4f35c0 100644 --- a/src/scalar_8x32_impl.h +++ b/src/scalar_8x32_impl.h @@ -34,7 +34,7 @@ #define SECP256K1_N_H_6 ((uint32_t)0xFFFFFFFFUL) #define SECP256K1_N_H_7 ((uint32_t)0x7FFFFFFFUL) -SECP256K1_INLINE static void secp256k1_scalar_clear(secp256k1_scalar_t *r) { +SECP256K1_INLINE static void secp256k1_scalar_clear(secp256k1_scalar *r) { r->d[0] = 0; r->d[1] = 0; r->d[2] = 0; @@ -45,7 +45,7 @@ SECP256K1_INLINE static void secp256k1_scalar_clear(secp256k1_scalar_t *r) { r->d[7] = 0; } -SECP256K1_INLINE static void secp256k1_scalar_set_int(secp256k1_scalar_t *r, unsigned int v) { +SECP256K1_INLINE static void secp256k1_scalar_set_int(secp256k1_scalar *r, unsigned int v) { r->d[0] = v; r->d[1] = 0; r->d[2] = 0; @@ -56,12 +56,12 @@ SECP256K1_INLINE static void secp256k1_scalar_set_int(secp256k1_scalar_t *r, uns r->d[7] = 0; } -SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar_t *a, unsigned int offset, unsigned int count) { +SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar *a, unsigned int offset, unsigned int count) { VERIFY_CHECK((offset + count - 1) >> 5 == offset >> 5); return (a->d[offset >> 5] >> (offset & 0x1F)) & ((1 << count) - 1); } -SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar_t *a, unsigned int offset, unsigned int count) { +SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar *a, unsigned int offset, unsigned int count) { VERIFY_CHECK(count < 32); VERIFY_CHECK(offset + count <= 256); if ((offset + count - 1) >> 5 == offset >> 5) { @@ -72,7 +72,7 @@ SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits_var(const secp256 } } -SECP256K1_INLINE static int secp256k1_scalar_check_overflow(const secp256k1_scalar_t *a) { +SECP256K1_INLINE static int secp256k1_scalar_check_overflow(const secp256k1_scalar *a) { int yes = 0; int no = 0; no |= (a->d[7] < SECP256K1_N_7); /* No need for a > check. */ @@ -90,7 +90,7 @@ SECP256K1_INLINE static int secp256k1_scalar_check_overflow(const secp256k1_scal return yes; } -SECP256K1_INLINE static int secp256k1_scalar_reduce(secp256k1_scalar_t *r, uint32_t overflow) { +SECP256K1_INLINE static int secp256k1_scalar_reduce(secp256k1_scalar *r, uint32_t overflow) { uint64_t t; VERIFY_CHECK(overflow <= 1); t = (uint64_t)r->d[0] + overflow * SECP256K1_N_C_0; @@ -112,7 +112,7 @@ SECP256K1_INLINE static int secp256k1_scalar_reduce(secp256k1_scalar_t *r, uint3 return overflow; } -static int secp256k1_scalar_add(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { +static int secp256k1_scalar_add(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) { int overflow; uint64_t t = (uint64_t)a->d[0] + b->d[0]; r->d[0] = t & 0xFFFFFFFFULL; t >>= 32; @@ -136,9 +136,10 @@ static int secp256k1_scalar_add(secp256k1_scalar_t *r, const secp256k1_scalar_t return overflow; } -static void secp256k1_scalar_add_bit(secp256k1_scalar_t *r, unsigned int bit) { +static void secp256k1_scalar_cadd_bit(secp256k1_scalar *r, unsigned int bit, int flag) { uint64_t t; VERIFY_CHECK(bit < 256); + bit += ((uint32_t) flag - 1) & 0x100; /* forcing (bit >> 5) > 7 makes this a noop */ t = (uint64_t)r->d[0] + (((uint32_t)((bit >> 5) == 0)) << (bit & 0x1F)); r->d[0] = t & 0xFFFFFFFFULL; t >>= 32; t += (uint64_t)r->d[1] + (((uint32_t)((bit >> 5) == 1)) << (bit & 0x1F)); @@ -161,7 +162,7 @@ static void secp256k1_scalar_add_bit(secp256k1_scalar_t *r, unsigned int bit) { #endif } -static void secp256k1_scalar_set_b32(secp256k1_scalar_t *r, const unsigned char *b32, int *overflow) { +static void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *b32, int *overflow) { int over; r->d[0] = (uint32_t)b32[31] | (uint32_t)b32[30] << 8 | (uint32_t)b32[29] << 16 | (uint32_t)b32[28] << 24; r->d[1] = (uint32_t)b32[27] | (uint32_t)b32[26] << 8 | (uint32_t)b32[25] << 16 | (uint32_t)b32[24] << 24; @@ -177,7 +178,7 @@ static void secp256k1_scalar_set_b32(secp256k1_scalar_t *r, const unsigned char } } -static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar_t* a) { +static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar* a) { bin[0] = a->d[7] >> 24; bin[1] = a->d[7] >> 16; bin[2] = a->d[7] >> 8; bin[3] = a->d[7]; bin[4] = a->d[6] >> 24; bin[5] = a->d[6] >> 16; bin[6] = a->d[6] >> 8; bin[7] = a->d[6]; bin[8] = a->d[5] >> 24; bin[9] = a->d[5] >> 16; bin[10] = a->d[5] >> 8; bin[11] = a->d[5]; @@ -188,11 +189,11 @@ static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar_ bin[28] = a->d[0] >> 24; bin[29] = a->d[0] >> 16; bin[30] = a->d[0] >> 8; bin[31] = a->d[0]; } -SECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar_t *a) { +SECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar *a) { return (a->d[0] | a->d[1] | a->d[2] | a->d[3] | a->d[4] | a->d[5] | a->d[6] | a->d[7]) == 0; } -static void secp256k1_scalar_negate(secp256k1_scalar_t *r, const secp256k1_scalar_t *a) { +static void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar *a) { uint32_t nonzero = 0xFFFFFFFFUL * (secp256k1_scalar_is_zero(a) == 0); uint64_t t = (uint64_t)(~a->d[0]) + SECP256K1_N_0 + 1; r->d[0] = t & nonzero; t >>= 32; @@ -212,11 +213,11 @@ static void secp256k1_scalar_negate(secp256k1_scalar_t *r, const secp256k1_scala r->d[7] = t & nonzero; } -SECP256K1_INLINE static int secp256k1_scalar_is_one(const secp256k1_scalar_t *a) { +SECP256K1_INLINE static int secp256k1_scalar_is_one(const secp256k1_scalar *a) { return ((a->d[0] ^ 1) | a->d[1] | a->d[2] | a->d[3] | a->d[4] | a->d[5] | a->d[6] | a->d[7]) == 0; } -static int secp256k1_scalar_is_high(const secp256k1_scalar_t *a) { +static int secp256k1_scalar_is_high(const secp256k1_scalar *a) { int yes = 0; int no = 0; no |= (a->d[7] < SECP256K1_N_H_7); @@ -234,6 +235,31 @@ static int secp256k1_scalar_is_high(const secp256k1_scalar_t *a) { return yes; } +static int secp256k1_scalar_cond_negate(secp256k1_scalar *r, int flag) { + /* If we are flag = 0, mask = 00...00 and this is a no-op; + * if we are flag = 1, mask = 11...11 and this is identical to secp256k1_scalar_negate */ + uint32_t mask = !flag - 1; + uint32_t nonzero = 0xFFFFFFFFUL * (secp256k1_scalar_is_zero(r) == 0); + uint64_t t = (uint64_t)(r->d[0] ^ mask) + ((SECP256K1_N_0 + 1) & mask); + r->d[0] = t & nonzero; t >>= 32; + t += (uint64_t)(r->d[1] ^ mask) + (SECP256K1_N_1 & mask); + r->d[1] = t & nonzero; t >>= 32; + t += (uint64_t)(r->d[2] ^ mask) + (SECP256K1_N_2 & mask); + r->d[2] = t & nonzero; t >>= 32; + t += (uint64_t)(r->d[3] ^ mask) + (SECP256K1_N_3 & mask); + r->d[3] = t & nonzero; t >>= 32; + t += (uint64_t)(r->d[4] ^ mask) + (SECP256K1_N_4 & mask); + r->d[4] = t & nonzero; t >>= 32; + t += (uint64_t)(r->d[5] ^ mask) + (SECP256K1_N_5 & mask); + r->d[5] = t & nonzero; t >>= 32; + t += (uint64_t)(r->d[6] ^ mask) + (SECP256K1_N_6 & mask); + r->d[6] = t & nonzero; t >>= 32; + t += (uint64_t)(r->d[7] ^ mask) + (SECP256K1_N_7 & mask); + r->d[7] = t & nonzero; + return 2 * (mask == 0) - 1; +} + + /* Inspired by the macros in OpenSSL's crypto/bn/asm/x86_64-gcc.c. */ /** Add a*b to the number defined by (c0,c1,c2). c2 must never overflow. */ @@ -320,7 +346,7 @@ static int secp256k1_scalar_is_high(const secp256k1_scalar_t *a) { VERIFY_CHECK(c2 == 0); \ } -static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint32_t *l) { +static void secp256k1_scalar_reduce_512(secp256k1_scalar *r, const uint32_t *l) { uint64_t c; uint32_t n0 = l[8], n1 = l[9], n2 = l[10], n3 = l[11], n4 = l[12], n5 = l[13], n6 = l[14], n7 = l[15]; uint32_t m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12; @@ -462,7 +488,7 @@ static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint32_t *l secp256k1_scalar_reduce(r, c + secp256k1_scalar_check_overflow(r)); } -static void secp256k1_scalar_mul_512(uint32_t *l, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { +static void secp256k1_scalar_mul_512(uint32_t *l, const secp256k1_scalar *a, const secp256k1_scalar *b) { /* 96 bit accumulator. */ uint32_t c0 = 0, c1 = 0, c2 = 0; @@ -550,7 +576,7 @@ static void secp256k1_scalar_mul_512(uint32_t *l, const secp256k1_scalar_t *a, c l[15] = c0; } -static void secp256k1_scalar_sqr_512(uint32_t *l, const secp256k1_scalar_t *a) { +static void secp256k1_scalar_sqr_512(uint32_t *l, const secp256k1_scalar *a) { /* 96 bit accumulator. */ uint32_t c0 = 0, c1 = 0, c2 = 0; @@ -618,20 +644,36 @@ static void secp256k1_scalar_sqr_512(uint32_t *l, const secp256k1_scalar_t *a) { #undef extract #undef extract_fast -static void secp256k1_scalar_mul(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { +static void secp256k1_scalar_mul(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) { uint32_t l[16]; secp256k1_scalar_mul_512(l, a, b); secp256k1_scalar_reduce_512(r, l); } -static void secp256k1_scalar_sqr(secp256k1_scalar_t *r, const secp256k1_scalar_t *a) { +static int secp256k1_scalar_shr_int(secp256k1_scalar *r, int n) { + int ret; + VERIFY_CHECK(n > 0); + VERIFY_CHECK(n < 16); + ret = r->d[0] & ((1 << n) - 1); + r->d[0] = (r->d[0] >> n) + (r->d[1] << (32 - n)); + r->d[1] = (r->d[1] >> n) + (r->d[2] << (32 - n)); + r->d[2] = (r->d[2] >> n) + (r->d[3] << (32 - n)); + r->d[3] = (r->d[3] >> n) + (r->d[4] << (32 - n)); + r->d[4] = (r->d[4] >> n) + (r->d[5] << (32 - n)); + r->d[5] = (r->d[5] >> n) + (r->d[6] << (32 - n)); + r->d[6] = (r->d[6] >> n) + (r->d[7] << (32 - n)); + r->d[7] = (r->d[7] >> n); + return ret; +} + +static void secp256k1_scalar_sqr(secp256k1_scalar *r, const secp256k1_scalar *a) { uint32_t l[16]; secp256k1_scalar_sqr_512(l, a); secp256k1_scalar_reduce_512(r, l); } #ifdef USE_ENDOMORPHISM -static void secp256k1_scalar_split_128(secp256k1_scalar_t *r1, secp256k1_scalar_t *r2, const secp256k1_scalar_t *a) { +static void secp256k1_scalar_split_128(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a) { r1->d[0] = a->d[0]; r1->d[1] = a->d[1]; r1->d[2] = a->d[2]; @@ -651,11 +693,11 @@ static void secp256k1_scalar_split_128(secp256k1_scalar_t *r1, secp256k1_scalar_ } #endif -SECP256K1_INLINE static int secp256k1_scalar_eq(const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { +SECP256K1_INLINE static int secp256k1_scalar_eq(const secp256k1_scalar *a, const secp256k1_scalar *b) { return ((a->d[0] ^ b->d[0]) | (a->d[1] ^ b->d[1]) | (a->d[2] ^ b->d[2]) | (a->d[3] ^ b->d[3]) | (a->d[4] ^ b->d[4]) | (a->d[5] ^ b->d[5]) | (a->d[6] ^ b->d[6]) | (a->d[7] ^ b->d[7])) == 0; } -SECP256K1_INLINE static void secp256k1_scalar_mul_shift_var(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b, unsigned int shift) { +SECP256K1_INLINE static void secp256k1_scalar_mul_shift_var(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b, unsigned int shift) { uint32_t l[16]; unsigned int shiftlimbs; unsigned int shiftlow; @@ -673,9 +715,7 @@ SECP256K1_INLINE static void secp256k1_scalar_mul_shift_var(secp256k1_scalar_t * r->d[5] = shift < 352 ? (l[5 + shiftlimbs] >> shiftlow | (shift < 320 && shiftlow ? (l[6 + shiftlimbs] << shifthigh) : 0)) : 0; r->d[6] = shift < 320 ? (l[6 + shiftlimbs] >> shiftlow | (shift < 288 && shiftlow ? (l[7 + shiftlimbs] << shifthigh) : 0)) : 0; r->d[7] = shift < 288 ? (l[7 + shiftlimbs] >> shiftlow) : 0; - if ((l[(shift - 1) >> 5] >> ((shift - 1) & 0x1f)) & 1) { - secp256k1_scalar_add_bit(r, 0); - } + secp256k1_scalar_cadd_bit(r, 0, (l[(shift - 1) >> 5] >> ((shift - 1) & 0x1f)) & 1); } #endif diff --git a/src/scalar_impl.h b/src/scalar_impl.h index 33824983e..2690d8655 100644 --- a/src/scalar_impl.h +++ b/src/scalar_impl.h @@ -7,8 +7,6 @@ #ifndef _SECP256K1_SCALAR_IMPL_H_ #define _SECP256K1_SCALAR_IMPL_H_ -#include - #include "group.h" #include "scalar.h" @@ -16,7 +14,9 @@ #include "libsecp256k1-config.h" #endif -#if defined(USE_SCALAR_4X64) +#if defined(EXHAUSTIVE_TEST_ORDER) +#include "scalar_low_impl.h" +#elif defined(USE_SCALAR_4X64) #include "scalar_4x64_impl.h" #elif defined(USE_SCALAR_8X32) #include "scalar_8x32_impl.h" @@ -25,109 +25,120 @@ #endif #ifndef USE_NUM_NONE -static void secp256k1_scalar_get_num(secp256k1_num_t *r, const secp256k1_scalar_t *a) { +static void secp256k1_scalar_get_num(secp256k1_num *r, const secp256k1_scalar *a) { unsigned char c[32]; secp256k1_scalar_get_b32(c, a); secp256k1_num_set_bin(r, c, 32); } /** secp256k1 curve order, see secp256k1_ecdsa_const_order_as_fe in ecdsa_impl.h */ -static void secp256k1_scalar_order_get_num(secp256k1_num_t *r) { +static void secp256k1_scalar_order_get_num(secp256k1_num *r) { +#if defined(EXHAUSTIVE_TEST_ORDER) + static const unsigned char order[32] = { + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,EXHAUSTIVE_TEST_ORDER + }; +#else static const unsigned char order[32] = { 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, 0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B, 0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x41 }; +#endif secp256k1_num_set_bin(r, order, 32); } #endif -static void secp256k1_scalar_inverse(secp256k1_scalar_t *r, const secp256k1_scalar_t *x) { - secp256k1_scalar_t *t; +static void secp256k1_scalar_inverse(secp256k1_scalar *r, const secp256k1_scalar *x) { +#if defined(EXHAUSTIVE_TEST_ORDER) int i; - /* First compute x ^ (2^N - 1) for some values of N. */ - secp256k1_scalar_t x2, x3, x4, x6, x7, x8, x15, x30, x60, x120, x127; + *r = 0; + for (i = 0; i < EXHAUSTIVE_TEST_ORDER; i++) + if ((i * *x) % EXHAUSTIVE_TEST_ORDER == 1) + *r = i; + /* If this VERIFY_CHECK triggers we were given a noninvertible scalar (and thus + * have a composite group order; fix it in exhaustive_tests.c). */ + VERIFY_CHECK(*r != 0); +} +#else + secp256k1_scalar *t; + int i; + /* First compute xN as x ^ (2^N - 1) for some values of N, + * and uM as x ^ M for some values of M. */ + secp256k1_scalar x2, x3, x6, x8, x14, x28, x56, x112, x126; + secp256k1_scalar u2, u5, u9, u11, u13; - secp256k1_scalar_sqr(&x2, x); - secp256k1_scalar_mul(&x2, &x2, x); + secp256k1_scalar_sqr(&u2, x); + secp256k1_scalar_mul(&x2, &u2, x); + secp256k1_scalar_mul(&u5, &u2, &x2); + secp256k1_scalar_mul(&x3, &u5, &u2); + secp256k1_scalar_mul(&u9, &x3, &u2); + secp256k1_scalar_mul(&u11, &u9, &u2); + secp256k1_scalar_mul(&u13, &u11, &u2); - secp256k1_scalar_sqr(&x3, &x2); - secp256k1_scalar_mul(&x3, &x3, x); - - secp256k1_scalar_sqr(&x4, &x3); - secp256k1_scalar_mul(&x4, &x4, x); - - secp256k1_scalar_sqr(&x6, &x4); + secp256k1_scalar_sqr(&x6, &u13); secp256k1_scalar_sqr(&x6, &x6); - secp256k1_scalar_mul(&x6, &x6, &x2); + secp256k1_scalar_mul(&x6, &x6, &u11); - secp256k1_scalar_sqr(&x7, &x6); - secp256k1_scalar_mul(&x7, &x7, x); + secp256k1_scalar_sqr(&x8, &x6); + secp256k1_scalar_sqr(&x8, &x8); + secp256k1_scalar_mul(&x8, &x8, &x2); - secp256k1_scalar_sqr(&x8, &x7); - secp256k1_scalar_mul(&x8, &x8, x); - - secp256k1_scalar_sqr(&x15, &x8); - for (i = 0; i < 6; i++) { - secp256k1_scalar_sqr(&x15, &x15); + secp256k1_scalar_sqr(&x14, &x8); + for (i = 0; i < 5; i++) { + secp256k1_scalar_sqr(&x14, &x14); } - secp256k1_scalar_mul(&x15, &x15, &x7); + secp256k1_scalar_mul(&x14, &x14, &x6); - secp256k1_scalar_sqr(&x30, &x15); - for (i = 0; i < 14; i++) { - secp256k1_scalar_sqr(&x30, &x30); + secp256k1_scalar_sqr(&x28, &x14); + for (i = 0; i < 13; i++) { + secp256k1_scalar_sqr(&x28, &x28); } - secp256k1_scalar_mul(&x30, &x30, &x15); + secp256k1_scalar_mul(&x28, &x28, &x14); - secp256k1_scalar_sqr(&x60, &x30); - for (i = 0; i < 29; i++) { - secp256k1_scalar_sqr(&x60, &x60); + secp256k1_scalar_sqr(&x56, &x28); + for (i = 0; i < 27; i++) { + secp256k1_scalar_sqr(&x56, &x56); } - secp256k1_scalar_mul(&x60, &x60, &x30); + secp256k1_scalar_mul(&x56, &x56, &x28); - secp256k1_scalar_sqr(&x120, &x60); - for (i = 0; i < 59; i++) { - secp256k1_scalar_sqr(&x120, &x120); + secp256k1_scalar_sqr(&x112, &x56); + for (i = 0; i < 55; i++) { + secp256k1_scalar_sqr(&x112, &x112); } - secp256k1_scalar_mul(&x120, &x120, &x60); + secp256k1_scalar_mul(&x112, &x112, &x56); - secp256k1_scalar_sqr(&x127, &x120); - for (i = 0; i < 6; i++) { - secp256k1_scalar_sqr(&x127, &x127); + secp256k1_scalar_sqr(&x126, &x112); + for (i = 0; i < 13; i++) { + secp256k1_scalar_sqr(&x126, &x126); } - secp256k1_scalar_mul(&x127, &x127, &x7); + secp256k1_scalar_mul(&x126, &x126, &x14); - /* Then accumulate the final result (t starts at x127). */ - t = &x127; - for (i = 0; i < 2; i++) { /* 0 */ + /* Then accumulate the final result (t starts at x126). */ + t = &x126; + for (i = 0; i < 3; i++) { secp256k1_scalar_sqr(t, t); } - secp256k1_scalar_mul(t, t, x); /* 1 */ + secp256k1_scalar_mul(t, t, &u5); /* 101 */ for (i = 0; i < 4; i++) { /* 0 */ secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, &x3); /* 111 */ - for (i = 0; i < 2; i++) { /* 0 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 2; i++) { /* 0 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 2; i++) { /* 0 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ for (i = 0; i < 4; i++) { /* 0 */ secp256k1_scalar_sqr(t, t); } - secp256k1_scalar_mul(t, t, &x3); /* 111 */ - for (i = 0; i < 3; i++) { /* 0 */ + secp256k1_scalar_mul(t, t, &u5); /* 101 */ + for (i = 0; i < 5; i++) { /* 0 */ secp256k1_scalar_sqr(t, t); } - secp256k1_scalar_mul(t, t, &x2); /* 11 */ + secp256k1_scalar_mul(t, t, &u11); /* 1011 */ + for (i = 0; i < 4; i++) { + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &u11); /* 1011 */ for (i = 0; i < 4; i++) { /* 0 */ secp256k1_scalar_sqr(t, t); } @@ -136,38 +147,26 @@ static void secp256k1_scalar_inverse(secp256k1_scalar_t *r, const secp256k1_scal secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, &x3); /* 111 */ - for (i = 0; i < 4; i++) { /* 00 */ + for (i = 0; i < 6; i++) { /* 00 */ secp256k1_scalar_sqr(t, t); } - secp256k1_scalar_mul(t, t, &x2); /* 11 */ - for (i = 0; i < 2; i++) { /* 0 */ + secp256k1_scalar_mul(t, t, &u13); /* 1101 */ + for (i = 0; i < 4; i++) { /* 0 */ secp256k1_scalar_sqr(t, t); } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 2; i++) { /* 0 */ + secp256k1_scalar_mul(t, t, &u5); /* 101 */ + for (i = 0; i < 3; i++) { secp256k1_scalar_sqr(t, t); } - secp256k1_scalar_mul(t, t, x); /* 1 */ + secp256k1_scalar_mul(t, t, &x3); /* 111 */ for (i = 0; i < 5; i++) { /* 0 */ secp256k1_scalar_sqr(t, t); } - secp256k1_scalar_mul(t, t, &x4); /* 1111 */ - for (i = 0; i < 2; i++) { /* 0 */ + secp256k1_scalar_mul(t, t, &u9); /* 1001 */ + for (i = 0; i < 6; i++) { /* 000 */ secp256k1_scalar_sqr(t, t); } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 3; i++) { /* 00 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 4; i++) { /* 000 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 2; i++) { /* 0 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ + secp256k1_scalar_mul(t, t, &u5); /* 101 */ for (i = 0; i < 10; i++) { /* 0000000 */ secp256k1_scalar_sqr(t, t); } @@ -180,50 +179,34 @@ static void secp256k1_scalar_inverse(secp256k1_scalar_t *r, const secp256k1_scal secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, &x8); /* 11111111 */ - for (i = 0; i < 2; i++) { /* 0 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 3; i++) { /* 00 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 3; i++) { /* 00 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ for (i = 0; i < 5; i++) { /* 0 */ secp256k1_scalar_sqr(t, t); } - secp256k1_scalar_mul(t, t, &x4); /* 1111 */ - for (i = 0; i < 2; i++) { /* 0 */ + secp256k1_scalar_mul(t, t, &u9); /* 1001 */ + for (i = 0; i < 6; i++) { /* 00 */ secp256k1_scalar_sqr(t, t); } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 5; i++) { /* 000 */ + secp256k1_scalar_mul(t, t, &u11); /* 1011 */ + for (i = 0; i < 4; i++) { + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &u13); /* 1101 */ + for (i = 0; i < 5; i++) { secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, &x2); /* 11 */ - for (i = 0; i < 4; i++) { /* 00 */ + for (i = 0; i < 6; i++) { /* 00 */ secp256k1_scalar_sqr(t, t); } - secp256k1_scalar_mul(t, t, &x2); /* 11 */ - for (i = 0; i < 2; i++) { /* 0 */ + secp256k1_scalar_mul(t, t, &u13); /* 1101 */ + for (i = 0; i < 10; i++) { /* 000000 */ secp256k1_scalar_sqr(t, t); } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 8; i++) { /* 000000 */ + secp256k1_scalar_mul(t, t, &u13); /* 1101 */ + for (i = 0; i < 4; i++) { secp256k1_scalar_sqr(t, t); } - secp256k1_scalar_mul(t, t, &x2); /* 11 */ - for (i = 0; i < 3; i++) { /* 0 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, &x2); /* 11 */ - for (i = 0; i < 3; i++) { /* 00 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ + secp256k1_scalar_mul(t, t, &u9); /* 1001 */ for (i = 0; i < 6; i++) { /* 00000 */ secp256k1_scalar_sqr(t, t); } @@ -234,24 +217,45 @@ static void secp256k1_scalar_inverse(secp256k1_scalar_t *r, const secp256k1_scal secp256k1_scalar_mul(r, t, &x6); /* 111111 */ } -static void secp256k1_scalar_inverse_var(secp256k1_scalar_t *r, const secp256k1_scalar_t *x) { +SECP256K1_INLINE static int secp256k1_scalar_is_even(const secp256k1_scalar *a) { + return !(a->d[0] & 1); +} +#endif + +static void secp256k1_scalar_inverse_var(secp256k1_scalar *r, const secp256k1_scalar *x) { #if defined(USE_SCALAR_INV_BUILTIN) secp256k1_scalar_inverse(r, x); #elif defined(USE_SCALAR_INV_NUM) unsigned char b[32]; - secp256k1_num_t n, m; - secp256k1_scalar_get_b32(b, x); + secp256k1_num n, m; + secp256k1_scalar t = *x; + secp256k1_scalar_get_b32(b, &t); secp256k1_num_set_bin(&n, b, 32); secp256k1_scalar_order_get_num(&m); secp256k1_num_mod_inverse(&n, &n, &m); secp256k1_num_get_bin(b, 32, &n); secp256k1_scalar_set_b32(r, b, NULL); + /* Verify that the inverse was computed correctly, without GMP code. */ + secp256k1_scalar_mul(&t, &t, r); + CHECK(secp256k1_scalar_is_one(&t)); #else #error "Please select scalar inverse implementation" #endif } #ifdef USE_ENDOMORPHISM +#if defined(EXHAUSTIVE_TEST_ORDER) +/** + * Find k1 and k2 given k, such that k1 + k2 * lambda == k mod n; unlike in the + * full case we don't bother making k1 and k2 be small, we just want them to be + * nontrivial to get full test coverage for the exhaustive tests. We therefore + * (arbitrarily) set k2 = k + 5 and k1 = k - k2 * lambda. + */ +static void secp256k1_scalar_split_lambda(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a) { + *r2 = (*a + 5) % EXHAUSTIVE_TEST_ORDER; + *r1 = (*a + (EXHAUSTIVE_TEST_ORDER - *r2) * EXHAUSTIVE_TEST_LAMBDA) % EXHAUSTIVE_TEST_ORDER; +} +#else /** * The Secp256k1 curve has an endomorphism, where lambda * (x, y) = (beta * x, y), where * lambda is {0x53,0x63,0xad,0x4c,0xc0,0x5c,0x30,0xe0,0xa5,0x26,0x1c,0x02,0x88,0x12,0x64,0x5a, @@ -290,30 +294,31 @@ static void secp256k1_scalar_inverse_var(secp256k1_scalar_t *r, const secp256k1_ * The function below splits a in r1 and r2, such that r1 + lambda * r2 == a (mod order). */ -static void secp256k1_scalar_split_lambda_var(secp256k1_scalar_t *r1, secp256k1_scalar_t *r2, const secp256k1_scalar_t *a) { - secp256k1_scalar_t c1, c2; - static const secp256k1_scalar_t minus_lambda = SECP256K1_SCALAR_CONST( +static void secp256k1_scalar_split_lambda(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a) { + secp256k1_scalar c1, c2; + static const secp256k1_scalar minus_lambda = SECP256K1_SCALAR_CONST( 0xAC9C52B3UL, 0x3FA3CF1FUL, 0x5AD9E3FDUL, 0x77ED9BA4UL, 0xA880B9FCUL, 0x8EC739C2UL, 0xE0CFC810UL, 0xB51283CFUL ); - static const secp256k1_scalar_t minus_b1 = SECP256K1_SCALAR_CONST( + static const secp256k1_scalar minus_b1 = SECP256K1_SCALAR_CONST( 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0xE4437ED6UL, 0x010E8828UL, 0x6F547FA9UL, 0x0ABFE4C3UL ); - static const secp256k1_scalar_t minus_b2 = SECP256K1_SCALAR_CONST( + static const secp256k1_scalar minus_b2 = SECP256K1_SCALAR_CONST( 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFEUL, 0x8A280AC5UL, 0x0774346DUL, 0xD765CDA8UL, 0x3DB1562CUL ); - static const secp256k1_scalar_t g1 = SECP256K1_SCALAR_CONST( + static const secp256k1_scalar g1 = SECP256K1_SCALAR_CONST( 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00003086UL, 0xD221A7D4UL, 0x6BCDE86CUL, 0x90E49284UL, 0xEB153DABUL ); - static const secp256k1_scalar_t g2 = SECP256K1_SCALAR_CONST( + static const secp256k1_scalar g2 = SECP256K1_SCALAR_CONST( 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x0000E443UL, 0x7ED6010EUL, 0x88286F54UL, 0x7FA90ABFUL, 0xE4C42212UL ); VERIFY_CHECK(r1 != a); VERIFY_CHECK(r2 != a); + /* these _var calls are constant time since the shift amount is constant */ secp256k1_scalar_mul_shift_var(&c1, a, &g1, 272); secp256k1_scalar_mul_shift_var(&c2, a, &g2, 272); secp256k1_scalar_mul(&c1, &c1, &minus_b1); @@ -323,5 +328,6 @@ static void secp256k1_scalar_split_lambda_var(secp256k1_scalar_t *r1, secp256k1_ secp256k1_scalar_add(r1, r1, a); } #endif +#endif #endif diff --git a/src/scalar_low.h b/src/scalar_low.h new file mode 100644 index 000000000..5574c44c7 --- /dev/null +++ b/src/scalar_low.h @@ -0,0 +1,15 @@ +/********************************************************************** + * Copyright (c) 2015 Andrew Poelstra * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_SCALAR_REPR_ +#define _SECP256K1_SCALAR_REPR_ + +#include + +/** A scalar modulo the group order of the secp256k1 curve. */ +typedef uint32_t secp256k1_scalar; + +#endif diff --git a/src/scalar_low_impl.h b/src/scalar_low_impl.h new file mode 100644 index 000000000..4f94441f4 --- /dev/null +++ b/src/scalar_low_impl.h @@ -0,0 +1,114 @@ +/********************************************************************** + * Copyright (c) 2015 Andrew Poelstra * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_SCALAR_REPR_IMPL_H_ +#define _SECP256K1_SCALAR_REPR_IMPL_H_ + +#include "scalar.h" + +#include + +SECP256K1_INLINE static int secp256k1_scalar_is_even(const secp256k1_scalar *a) { + return !(*a & 1); +} + +SECP256K1_INLINE static void secp256k1_scalar_clear(secp256k1_scalar *r) { *r = 0; } +SECP256K1_INLINE static void secp256k1_scalar_set_int(secp256k1_scalar *r, unsigned int v) { *r = v; } + +SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar *a, unsigned int offset, unsigned int count) { + if (offset < 32) + return ((*a >> offset) & ((((uint32_t)1) << count) - 1)); + else + return 0; +} + +SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar *a, unsigned int offset, unsigned int count) { + return secp256k1_scalar_get_bits(a, offset, count); +} + +SECP256K1_INLINE static int secp256k1_scalar_check_overflow(const secp256k1_scalar *a) { return *a >= EXHAUSTIVE_TEST_ORDER; } + +static int secp256k1_scalar_add(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) { + *r = (*a + *b) % EXHAUSTIVE_TEST_ORDER; + return *r < *b; +} + +static void secp256k1_scalar_cadd_bit(secp256k1_scalar *r, unsigned int bit, int flag) { + if (flag && bit < 32) + *r += (1 << bit); +#ifdef VERIFY + VERIFY_CHECK(secp256k1_scalar_check_overflow(r) == 0); +#endif +} + +static void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *b32, int *overflow) { + const int base = 0x100 % EXHAUSTIVE_TEST_ORDER; + int i; + *r = 0; + for (i = 0; i < 32; i++) { + *r = ((*r * base) + b32[i]) % EXHAUSTIVE_TEST_ORDER; + } + /* just deny overflow, it basically always happens */ + if (overflow) *overflow = 0; +} + +static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar* a) { + memset(bin, 0, 32); + bin[28] = *a >> 24; bin[29] = *a >> 16; bin[30] = *a >> 8; bin[31] = *a; +} + +SECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar *a) { + return *a == 0; +} + +static void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar *a) { + if (*a == 0) { + *r = 0; + } else { + *r = EXHAUSTIVE_TEST_ORDER - *a; + } +} + +SECP256K1_INLINE static int secp256k1_scalar_is_one(const secp256k1_scalar *a) { + return *a == 1; +} + +static int secp256k1_scalar_is_high(const secp256k1_scalar *a) { + return *a > EXHAUSTIVE_TEST_ORDER / 2; +} + +static int secp256k1_scalar_cond_negate(secp256k1_scalar *r, int flag) { + if (flag) secp256k1_scalar_negate(r, r); + return flag ? -1 : 1; +} + +static void secp256k1_scalar_mul(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) { + *r = (*a * *b) % EXHAUSTIVE_TEST_ORDER; +} + +static int secp256k1_scalar_shr_int(secp256k1_scalar *r, int n) { + int ret; + VERIFY_CHECK(n > 0); + VERIFY_CHECK(n < 16); + ret = *r & ((1 << n) - 1); + *r >>= n; + return ret; +} + +static void secp256k1_scalar_sqr(secp256k1_scalar *r, const secp256k1_scalar *a) { + *r = (*a * *a) % EXHAUSTIVE_TEST_ORDER; +} + +static void secp256k1_scalar_split_128(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a) { + *r1 = *a; + *r2 = 0; +} + +SECP256K1_INLINE static int secp256k1_scalar_eq(const secp256k1_scalar *a, const secp256k1_scalar *b) { + return *a == *b; +} + +#endif diff --git a/src/secp256k1.c b/src/secp256k1.c index d6192dc4e..4f8c01655 100644 --- a/src/secp256k1.c +++ b/src/secp256k1.c @@ -4,8 +4,6 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#define SECP256K1_BUILD (1) - #include "include/secp256k1.h" #include "util.h" @@ -14,81 +12,326 @@ #include "scalar_impl.h" #include "group_impl.h" #include "ecmult_impl.h" +#include "ecmult_const_impl.h" #include "ecmult_gen_impl.h" #include "ecdsa_impl.h" #include "eckey_impl.h" #include "hash_impl.h" -struct secp256k1_context_struct { - secp256k1_ecmult_context_t ecmult_ctx; - secp256k1_ecmult_gen_context_t ecmult_gen_ctx; +#define ARG_CHECK(cond) do { \ + if (EXPECT(!(cond), 0)) { \ + secp256k1_callback_call(&ctx->illegal_callback, #cond); \ + return 0; \ + } \ +} while(0) + +static void default_illegal_callback_fn(const char* str, void* data) { + (void)data; + fprintf(stderr, "[libsecp256k1] illegal argument: %s\n", str); + abort(); +} + +static const secp256k1_callback default_illegal_callback = { + default_illegal_callback_fn, + NULL }; -secp256k1_context_t* secp256k1_context_create(int flags) { - secp256k1_context_t* ret = (secp256k1_context_t*)checked_malloc(sizeof(secp256k1_context_t)); +static void default_error_callback_fn(const char* str, void* data) { + (void)data; + fprintf(stderr, "[libsecp256k1] internal consistency check failed: %s\n", str); + abort(); +} + +static const secp256k1_callback default_error_callback = { + default_error_callback_fn, + NULL +}; + + +struct secp256k1_context_struct { + secp256k1_ecmult_context ecmult_ctx; + secp256k1_ecmult_gen_context ecmult_gen_ctx; + secp256k1_callback illegal_callback; + secp256k1_callback error_callback; +}; + +secp256k1_context* secp256k1_context_create(unsigned int flags) { + secp256k1_context* ret = (secp256k1_context*)checked_malloc(&default_error_callback, sizeof(secp256k1_context)); + ret->illegal_callback = default_illegal_callback; + ret->error_callback = default_error_callback; + + if (EXPECT((flags & SECP256K1_FLAGS_TYPE_MASK) != SECP256K1_FLAGS_TYPE_CONTEXT, 0)) { + secp256k1_callback_call(&ret->illegal_callback, + "Invalid flags"); + free(ret); + return NULL; + } secp256k1_ecmult_context_init(&ret->ecmult_ctx); secp256k1_ecmult_gen_context_init(&ret->ecmult_gen_ctx); - if (flags & SECP256K1_CONTEXT_SIGN) { - secp256k1_ecmult_gen_context_build(&ret->ecmult_gen_ctx); + if (flags & SECP256K1_FLAGS_BIT_CONTEXT_SIGN) { + secp256k1_ecmult_gen_context_build(&ret->ecmult_gen_ctx, &ret->error_callback); } - if (flags & SECP256K1_CONTEXT_VERIFY) { - secp256k1_ecmult_context_build(&ret->ecmult_ctx); + if (flags & SECP256K1_FLAGS_BIT_CONTEXT_VERIFY) { + secp256k1_ecmult_context_build(&ret->ecmult_ctx, &ret->error_callback); } return ret; } -secp256k1_context_t* secp256k1_context_clone(const secp256k1_context_t* ctx) { - secp256k1_context_t* ret = (secp256k1_context_t*)checked_malloc(sizeof(secp256k1_context_t)); - secp256k1_ecmult_context_clone(&ret->ecmult_ctx, &ctx->ecmult_ctx); - secp256k1_ecmult_gen_context_clone(&ret->ecmult_gen_ctx, &ctx->ecmult_gen_ctx); +secp256k1_context* secp256k1_context_clone(const secp256k1_context* ctx) { + secp256k1_context* ret = (secp256k1_context*)checked_malloc(&ctx->error_callback, sizeof(secp256k1_context)); + ret->illegal_callback = ctx->illegal_callback; + ret->error_callback = ctx->error_callback; + secp256k1_ecmult_context_clone(&ret->ecmult_ctx, &ctx->ecmult_ctx, &ctx->error_callback); + secp256k1_ecmult_gen_context_clone(&ret->ecmult_gen_ctx, &ctx->ecmult_gen_ctx, &ctx->error_callback); return ret; } -void secp256k1_context_destroy(secp256k1_context_t* ctx) { - secp256k1_ecmult_context_clear(&ctx->ecmult_ctx); - secp256k1_ecmult_gen_context_clear(&ctx->ecmult_gen_ctx); +void secp256k1_context_destroy(secp256k1_context* ctx) { + if (ctx != NULL) { + secp256k1_ecmult_context_clear(&ctx->ecmult_ctx); + secp256k1_ecmult_gen_context_clear(&ctx->ecmult_gen_ctx); - free(ctx); + free(ctx); + } } -int secp256k1_ecdsa_verify(const secp256k1_context_t* ctx, const unsigned char *msg32, const unsigned char *sig, int siglen, const unsigned char *pubkey, int pubkeylen) { - secp256k1_ge_t q; - secp256k1_ecdsa_sig_t s; - secp256k1_scalar_t m; - int ret = -3; - DEBUG_CHECK(ctx != NULL); - DEBUG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); - DEBUG_CHECK(msg32 != NULL); - DEBUG_CHECK(sig != NULL); - DEBUG_CHECK(pubkey != NULL); +void secp256k1_context_set_illegal_callback(secp256k1_context* ctx, void (*fun)(const char* message, void* data), const void* data) { + if (fun == NULL) { + fun = default_illegal_callback_fn; + } + ctx->illegal_callback.fn = fun; + ctx->illegal_callback.data = data; +} + +void secp256k1_context_set_error_callback(secp256k1_context* ctx, void (*fun)(const char* message, void* data), const void* data) { + if (fun == NULL) { + fun = default_error_callback_fn; + } + ctx->error_callback.fn = fun; + ctx->error_callback.data = data; +} + +static int secp256k1_pubkey_load(const secp256k1_context* ctx, secp256k1_ge* ge, const secp256k1_pubkey* pubkey) { + if (sizeof(secp256k1_ge_storage) == 64) { + /* When the secp256k1_ge_storage type is exactly 64 byte, use its + * representation inside secp256k1_pubkey, as conversion is very fast. + * Note that secp256k1_pubkey_save must use the same representation. */ + secp256k1_ge_storage s; + memcpy(&s, &pubkey->data[0], 64); + secp256k1_ge_from_storage(ge, &s); + } else { + /* Otherwise, fall back to 32-byte big endian for X and Y. */ + secp256k1_fe x, y; + secp256k1_fe_set_b32(&x, pubkey->data); + secp256k1_fe_set_b32(&y, pubkey->data + 32); + secp256k1_ge_set_xy(ge, &x, &y); + } + ARG_CHECK(!secp256k1_fe_is_zero(&ge->x)); + return 1; +} + +static void secp256k1_pubkey_save(secp256k1_pubkey* pubkey, secp256k1_ge* ge) { + if (sizeof(secp256k1_ge_storage) == 64) { + secp256k1_ge_storage s; + secp256k1_ge_to_storage(&s, ge); + memcpy(&pubkey->data[0], &s, 64); + } else { + VERIFY_CHECK(!secp256k1_ge_is_infinity(ge)); + secp256k1_fe_normalize_var(&ge->x); + secp256k1_fe_normalize_var(&ge->y); + secp256k1_fe_get_b32(pubkey->data, &ge->x); + secp256k1_fe_get_b32(pubkey->data + 32, &ge->y); + } +} + +int secp256k1_ec_pubkey_parse(const secp256k1_context* ctx, secp256k1_pubkey* pubkey, const unsigned char *input, size_t inputlen) { + secp256k1_ge Q; + + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(pubkey != NULL); + memset(pubkey, 0, sizeof(*pubkey)); + ARG_CHECK(input != NULL); + if (!secp256k1_eckey_pubkey_parse(&Q, input, inputlen)) { + return 0; + } + secp256k1_pubkey_save(pubkey, &Q); + secp256k1_ge_clear(&Q); + return 1; +} + +int secp256k1_ec_pubkey_serialize(const secp256k1_context* ctx, unsigned char *output, size_t *outputlen, const secp256k1_pubkey* pubkey, unsigned int flags) { + secp256k1_ge Q; + size_t len; + int ret = 0; + + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(outputlen != NULL); + ARG_CHECK(*outputlen >= ((flags & SECP256K1_FLAGS_BIT_COMPRESSION) ? 33 : 65)); + len = *outputlen; + *outputlen = 0; + ARG_CHECK(output != NULL); + memset(output, 0, len); + ARG_CHECK(pubkey != NULL); + ARG_CHECK((flags & SECP256K1_FLAGS_TYPE_MASK) == SECP256K1_FLAGS_TYPE_COMPRESSION); + if (secp256k1_pubkey_load(ctx, &Q, pubkey)) { + ret = secp256k1_eckey_pubkey_serialize(&Q, output, &len, flags & SECP256K1_FLAGS_BIT_COMPRESSION); + if (ret) { + *outputlen = len; + } + } + return ret; +} + +static void secp256k1_ecdsa_signature_load(const secp256k1_context* ctx, secp256k1_scalar* r, secp256k1_scalar* s, const secp256k1_ecdsa_signature* sig) { + (void)ctx; + if (sizeof(secp256k1_scalar) == 32) { + /* When the secp256k1_scalar type is exactly 32 byte, use its + * representation inside secp256k1_ecdsa_signature, as conversion is very fast. + * Note that secp256k1_ecdsa_signature_save must use the same representation. */ + memcpy(r, &sig->data[0], 32); + memcpy(s, &sig->data[32], 32); + } else { + secp256k1_scalar_set_b32(r, &sig->data[0], NULL); + secp256k1_scalar_set_b32(s, &sig->data[32], NULL); + } +} + +static void secp256k1_ecdsa_signature_save(secp256k1_ecdsa_signature* sig, const secp256k1_scalar* r, const secp256k1_scalar* s) { + if (sizeof(secp256k1_scalar) == 32) { + memcpy(&sig->data[0], r, 32); + memcpy(&sig->data[32], s, 32); + } else { + secp256k1_scalar_get_b32(&sig->data[0], r); + secp256k1_scalar_get_b32(&sig->data[32], s); + } +} + +int secp256k1_ecdsa_signature_parse_der(const secp256k1_context* ctx, secp256k1_ecdsa_signature* sig, const unsigned char *input, size_t inputlen) { + secp256k1_scalar r, s; + + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(sig != NULL); + ARG_CHECK(input != NULL); + + if (secp256k1_ecdsa_sig_parse(&r, &s, input, inputlen)) { + secp256k1_ecdsa_signature_save(sig, &r, &s); + return 1; + } else { + memset(sig, 0, sizeof(*sig)); + return 0; + } +} + +int secp256k1_ecdsa_signature_parse_compact(const secp256k1_context* ctx, secp256k1_ecdsa_signature* sig, const unsigned char *input64) { + secp256k1_scalar r, s; + int ret = 1; + int overflow = 0; + + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(sig != NULL); + ARG_CHECK(input64 != NULL); + + secp256k1_scalar_set_b32(&r, &input64[0], &overflow); + ret &= !overflow; + secp256k1_scalar_set_b32(&s, &input64[32], &overflow); + ret &= !overflow; + if (ret) { + secp256k1_ecdsa_signature_save(sig, &r, &s); + } else { + memset(sig, 0, sizeof(*sig)); + } + return ret; +} + +int secp256k1_ecdsa_signature_serialize_der(const secp256k1_context* ctx, unsigned char *output, size_t *outputlen, const secp256k1_ecdsa_signature* sig) { + secp256k1_scalar r, s; + + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(output != NULL); + ARG_CHECK(outputlen != NULL); + ARG_CHECK(sig != NULL); + + secp256k1_ecdsa_signature_load(ctx, &r, &s, sig); + return secp256k1_ecdsa_sig_serialize(output, outputlen, &r, &s); +} + +int secp256k1_ecdsa_signature_serialize_compact(const secp256k1_context* ctx, unsigned char *output64, const secp256k1_ecdsa_signature* sig) { + secp256k1_scalar r, s; + + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(output64 != NULL); + ARG_CHECK(sig != NULL); + + secp256k1_ecdsa_signature_load(ctx, &r, &s, sig); + secp256k1_scalar_get_b32(&output64[0], &r); + secp256k1_scalar_get_b32(&output64[32], &s); + return 1; +} + +int secp256k1_ecdsa_signature_normalize(const secp256k1_context* ctx, secp256k1_ecdsa_signature *sigout, const secp256k1_ecdsa_signature *sigin) { + secp256k1_scalar r, s; + int ret = 0; + + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(sigin != NULL); + + secp256k1_ecdsa_signature_load(ctx, &r, &s, sigin); + ret = secp256k1_scalar_is_high(&s); + if (sigout != NULL) { + if (ret) { + secp256k1_scalar_negate(&s, &s); + } + secp256k1_ecdsa_signature_save(sigout, &r, &s); + } + + return ret; +} + +int secp256k1_ecdsa_verify(const secp256k1_context* ctx, const secp256k1_ecdsa_signature *sig, const unsigned char *msg32, const secp256k1_pubkey *pubkey) { + secp256k1_ge q; + secp256k1_scalar r, s; + secp256k1_scalar m; + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); + ARG_CHECK(msg32 != NULL); + ARG_CHECK(sig != NULL); + ARG_CHECK(pubkey != NULL); secp256k1_scalar_set_b32(&m, msg32, NULL); - - if (secp256k1_eckey_pubkey_parse(&q, pubkey, pubkeylen)) { - if (secp256k1_ecdsa_sig_parse(&s, sig, siglen)) { - if (secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &s, &q, &m)) { - /* success is 1, all other values are fail */ - ret = 1; - } else { - ret = 0; - } - } else { - ret = -2; - } - } else { - ret = -1; - } - - return ret; + secp256k1_ecdsa_signature_load(ctx, &r, &s, sig); + return (!secp256k1_scalar_is_high(&s) && + secp256k1_pubkey_load(ctx, &q, pubkey) && + secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &r, &s, &q, &m)); } -static int nonce_function_rfc6979(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, unsigned int counter, const void *data) { +static int nonce_function_rfc6979(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter) { + unsigned char keydata[112]; + int keylen = 64; secp256k1_rfc6979_hmac_sha256_t rng; unsigned int i; - secp256k1_rfc6979_hmac_sha256_initialize(&rng, key32, 32, msg32, 32, (const unsigned char*)data, data != NULL ? 32 : 0); + /* We feed a byte array to the PRNG as input, consisting of: + * - the private key (32 bytes) and message (32 bytes), see RFC 6979 3.2d. + * - optionally 32 extra bytes of data, see RFC 6979 3.6 Additional Data. + * - optionally 16 extra bytes with the algorithm name. + * Because the arguments have distinct fixed lengths it is not possible for + * different argument mixtures to emulate each other and result in the same + * nonces. + */ + memcpy(keydata, key32, 32); + memcpy(keydata + 32, msg32, 32); + if (data != NULL) { + memcpy(keydata + 64, data, 32); + keylen = 96; + } + if (algo16 != NULL) { + memcpy(keydata + keylen, algo16, 16); + keylen += 16; + } + secp256k1_rfc6979_hmac_sha256_initialize(&rng, keydata, keylen); + memset(keydata, 0, sizeof(keydata)); for (i = 0; i <= counter; i++) { secp256k1_rfc6979_hmac_sha256_generate(&rng, nonce32, 32); } @@ -96,21 +339,19 @@ static int nonce_function_rfc6979(unsigned char *nonce32, const unsigned char *m return 1; } -const secp256k1_nonce_function_t secp256k1_nonce_function_rfc6979 = nonce_function_rfc6979; -const secp256k1_nonce_function_t secp256k1_nonce_function_default = nonce_function_rfc6979; +const secp256k1_nonce_function secp256k1_nonce_function_rfc6979 = nonce_function_rfc6979; +const secp256k1_nonce_function secp256k1_nonce_function_default = nonce_function_rfc6979; -int secp256k1_ecdsa_sign(const secp256k1_context_t* ctx, const unsigned char *msg32, unsigned char *signature, int *signaturelen, const unsigned char *seckey, secp256k1_nonce_function_t noncefp, const void* noncedata) { - secp256k1_ecdsa_sig_t sig; - secp256k1_scalar_t sec, non, msg; +int secp256k1_ecdsa_sign(const secp256k1_context* ctx, secp256k1_ecdsa_signature *signature, const unsigned char *msg32, const unsigned char *seckey, secp256k1_nonce_function noncefp, const void* noncedata) { + secp256k1_scalar r, s; + secp256k1_scalar sec, non, msg; int ret = 0; int overflow = 0; - unsigned int count = 0; - DEBUG_CHECK(ctx != NULL); - DEBUG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); - DEBUG_CHECK(msg32 != NULL); - DEBUG_CHECK(signature != NULL); - DEBUG_CHECK(signaturelen != NULL); - DEBUG_CHECK(seckey != NULL); + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); + ARG_CHECK(msg32 != NULL); + ARG_CHECK(signature != NULL); + ARG_CHECK(seckey != NULL); if (noncefp == NULL) { noncefp = secp256k1_nonce_function_default; } @@ -118,186 +359,112 @@ int secp256k1_ecdsa_sign(const secp256k1_context_t* ctx, const unsigned char *ms secp256k1_scalar_set_b32(&sec, seckey, &overflow); /* Fail if the secret key is invalid. */ if (!overflow && !secp256k1_scalar_is_zero(&sec)) { + unsigned char nonce32[32]; + unsigned int count = 0; secp256k1_scalar_set_b32(&msg, msg32, NULL); while (1) { - unsigned char nonce32[32]; - ret = noncefp(nonce32, msg32, seckey, count, noncedata); + ret = noncefp(nonce32, msg32, seckey, NULL, (void*)noncedata, count); if (!ret) { break; } secp256k1_scalar_set_b32(&non, nonce32, &overflow); - memset(nonce32, 0, 32); - if (!secp256k1_scalar_is_zero(&non) && !overflow) { - if (secp256k1_ecdsa_sig_sign(&ctx->ecmult_gen_ctx, &sig, &sec, &msg, &non, NULL)) { + if (!overflow && !secp256k1_scalar_is_zero(&non)) { + if (secp256k1_ecdsa_sig_sign(&ctx->ecmult_gen_ctx, &r, &s, &sec, &msg, &non, NULL)) { break; } } count++; } - if (ret) { - ret = secp256k1_ecdsa_sig_serialize(signature, signaturelen, &sig); - } + memset(nonce32, 0, 32); secp256k1_scalar_clear(&msg); secp256k1_scalar_clear(&non); secp256k1_scalar_clear(&sec); } - if (!ret) { - *signaturelen = 0; + if (ret) { + secp256k1_ecdsa_signature_save(signature, &r, &s); + } else { + memset(signature, 0, sizeof(*signature)); } return ret; } -int secp256k1_ecdsa_sign_compact(const secp256k1_context_t* ctx, const unsigned char *msg32, unsigned char *sig64, const unsigned char *seckey, secp256k1_nonce_function_t noncefp, const void* noncedata, int *recid) { - secp256k1_ecdsa_sig_t sig; - secp256k1_scalar_t sec, non, msg; - int ret = 0; - int overflow = 0; - unsigned int count = 0; - DEBUG_CHECK(ctx != NULL); - DEBUG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); - DEBUG_CHECK(msg32 != NULL); - DEBUG_CHECK(sig64 != NULL); - DEBUG_CHECK(seckey != NULL); - if (noncefp == NULL) { - noncefp = secp256k1_nonce_function_default; - } - - secp256k1_scalar_set_b32(&sec, seckey, &overflow); - /* Fail if the secret key is invalid. */ - if (!overflow && !secp256k1_scalar_is_zero(&sec)) { - secp256k1_scalar_set_b32(&msg, msg32, NULL); - while (1) { - unsigned char nonce32[32]; - ret = noncefp(nonce32, msg32, seckey, count, noncedata); - if (!ret) { - break; - } - secp256k1_scalar_set_b32(&non, nonce32, &overflow); - memset(nonce32, 0, 32); - if (!secp256k1_scalar_is_zero(&non) && !overflow) { - if (secp256k1_ecdsa_sig_sign(&ctx->ecmult_gen_ctx, &sig, &sec, &msg, &non, recid)) { - break; - } - } - count++; - } - if (ret) { - secp256k1_scalar_get_b32(sig64, &sig.r); - secp256k1_scalar_get_b32(sig64 + 32, &sig.s); - } - secp256k1_scalar_clear(&msg); - secp256k1_scalar_clear(&non); - secp256k1_scalar_clear(&sec); - } - if (!ret) { - memset(sig64, 0, 64); - } - return ret; -} - -int secp256k1_ecdsa_recover_compact(const secp256k1_context_t* ctx, const unsigned char *msg32, const unsigned char *sig64, unsigned char *pubkey, int *pubkeylen, int compressed, int recid) { - secp256k1_ge_t q; - secp256k1_ecdsa_sig_t sig; - secp256k1_scalar_t m; - int ret = 0; - int overflow = 0; - DEBUG_CHECK(ctx != NULL); - DEBUG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); - DEBUG_CHECK(msg32 != NULL); - DEBUG_CHECK(sig64 != NULL); - DEBUG_CHECK(pubkey != NULL); - DEBUG_CHECK(pubkeylen != NULL); - DEBUG_CHECK(recid >= 0 && recid <= 3); - - secp256k1_scalar_set_b32(&sig.r, sig64, &overflow); - if (!overflow) { - secp256k1_scalar_set_b32(&sig.s, sig64 + 32, &overflow); - if (!overflow) { - secp256k1_scalar_set_b32(&m, msg32, NULL); - - if (secp256k1_ecdsa_sig_recover(&ctx->ecmult_ctx, &sig, &q, &m, recid)) { - ret = secp256k1_eckey_pubkey_serialize(&q, pubkey, pubkeylen, compressed); - } - } - } - return ret; -} - -int secp256k1_ec_seckey_verify(const secp256k1_context_t* ctx, const unsigned char *seckey) { - secp256k1_scalar_t sec; +int secp256k1_ec_seckey_verify(const secp256k1_context* ctx, const unsigned char *seckey) { + secp256k1_scalar sec; int ret; int overflow; - DEBUG_CHECK(ctx != NULL); - DEBUG_CHECK(seckey != NULL); - (void)ctx; + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(seckey != NULL); secp256k1_scalar_set_b32(&sec, seckey, &overflow); - ret = !secp256k1_scalar_is_zero(&sec) && !overflow; + ret = !overflow && !secp256k1_scalar_is_zero(&sec); secp256k1_scalar_clear(&sec); return ret; } -int secp256k1_ec_pubkey_verify(const secp256k1_context_t* ctx, const unsigned char *pubkey, int pubkeylen) { - secp256k1_ge_t q; - DEBUG_CHECK(ctx != NULL); - DEBUG_CHECK(pubkey != NULL); - (void)ctx; - - return secp256k1_eckey_pubkey_parse(&q, pubkey, pubkeylen); -} - -int secp256k1_ec_pubkey_create(const secp256k1_context_t* ctx, unsigned char *pubkey, int *pubkeylen, const unsigned char *seckey, int compressed) { - secp256k1_gej_t pj; - secp256k1_ge_t p; - secp256k1_scalar_t sec; +int secp256k1_ec_pubkey_create(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const unsigned char *seckey) { + secp256k1_gej pj; + secp256k1_ge p; + secp256k1_scalar sec; int overflow; int ret = 0; - DEBUG_CHECK(ctx != NULL); - DEBUG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); - DEBUG_CHECK(pubkey != NULL); - DEBUG_CHECK(pubkeylen != NULL); - DEBUG_CHECK(seckey != NULL); + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(pubkey != NULL); + memset(pubkey, 0, sizeof(*pubkey)); + ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); + ARG_CHECK(seckey != NULL); secp256k1_scalar_set_b32(&sec, seckey, &overflow); - if (!overflow) { + ret = (!overflow) & (!secp256k1_scalar_is_zero(&sec)); + if (ret) { secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pj, &sec); - secp256k1_scalar_clear(&sec); secp256k1_ge_set_gej(&p, &pj); - ret = secp256k1_eckey_pubkey_serialize(&p, pubkey, pubkeylen, compressed); - } - if (!ret) { - *pubkeylen = 0; + secp256k1_pubkey_save(pubkey, &p); } + secp256k1_scalar_clear(&sec); return ret; } -int secp256k1_ec_pubkey_decompress(const secp256k1_context_t* ctx, unsigned char *pubkey, int *pubkeylen) { - secp256k1_ge_t p; +int secp256k1_ec_privkey_negate(const secp256k1_context* ctx, unsigned char *seckey) { + secp256k1_scalar sec; + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(seckey != NULL); + + secp256k1_scalar_set_b32(&sec, seckey, NULL); + secp256k1_scalar_negate(&sec, &sec); + secp256k1_scalar_get_b32(seckey, &sec); + + return 1; +} + +int secp256k1_ec_pubkey_negate(const secp256k1_context* ctx, secp256k1_pubkey *pubkey) { int ret = 0; - DEBUG_CHECK(pubkey != NULL); - DEBUG_CHECK(pubkeylen != NULL); - (void)ctx; + secp256k1_ge p; + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(pubkey != NULL); - if (secp256k1_eckey_pubkey_parse(&p, pubkey, *pubkeylen)) { - ret = secp256k1_eckey_pubkey_serialize(&p, pubkey, pubkeylen, 0); + ret = secp256k1_pubkey_load(ctx, &p, pubkey); + memset(pubkey, 0, sizeof(*pubkey)); + if (ret) { + secp256k1_ge_neg(&p, &p); + secp256k1_pubkey_save(pubkey, &p); } return ret; } -int secp256k1_ec_privkey_tweak_add(const secp256k1_context_t* ctx, unsigned char *seckey, const unsigned char *tweak) { - secp256k1_scalar_t term; - secp256k1_scalar_t sec; +int secp256k1_ec_privkey_tweak_add(const secp256k1_context* ctx, unsigned char *seckey, const unsigned char *tweak) { + secp256k1_scalar term; + secp256k1_scalar sec; int ret = 0; int overflow = 0; - DEBUG_CHECK(ctx != NULL); - DEBUG_CHECK(seckey != NULL); - DEBUG_CHECK(tweak != NULL); - (void)ctx; + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(seckey != NULL); + ARG_CHECK(tweak != NULL); secp256k1_scalar_set_b32(&term, tweak, &overflow); secp256k1_scalar_set_b32(&sec, seckey, NULL); - ret = secp256k1_eckey_privkey_tweak_add(&sec, &term) && !overflow; + ret = !overflow && secp256k1_eckey_privkey_tweak_add(&sec, &term); + memset(seckey, 0, 32); if (ret) { secp256k1_scalar_get_b32(seckey, &sec); } @@ -307,45 +474,43 @@ int secp256k1_ec_privkey_tweak_add(const secp256k1_context_t* ctx, unsigned char return ret; } -int secp256k1_ec_pubkey_tweak_add(const secp256k1_context_t* ctx, unsigned char *pubkey, int pubkeylen, const unsigned char *tweak) { - secp256k1_ge_t p; - secp256k1_scalar_t term; +int secp256k1_ec_pubkey_tweak_add(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const unsigned char *tweak) { + secp256k1_ge p; + secp256k1_scalar term; int ret = 0; int overflow = 0; - DEBUG_CHECK(ctx != NULL); - DEBUG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); - DEBUG_CHECK(pubkey != NULL); - DEBUG_CHECK(tweak != NULL); + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); + ARG_CHECK(pubkey != NULL); + ARG_CHECK(tweak != NULL); secp256k1_scalar_set_b32(&term, tweak, &overflow); - if (!overflow) { - ret = secp256k1_eckey_pubkey_parse(&p, pubkey, pubkeylen); - if (ret) { - ret = secp256k1_eckey_pubkey_tweak_add(&ctx->ecmult_ctx, &p, &term); - } - if (ret) { - int oldlen = pubkeylen; - ret = secp256k1_eckey_pubkey_serialize(&p, pubkey, &pubkeylen, oldlen <= 33); - VERIFY_CHECK(pubkeylen == oldlen); + ret = !overflow && secp256k1_pubkey_load(ctx, &p, pubkey); + memset(pubkey, 0, sizeof(*pubkey)); + if (ret) { + if (secp256k1_eckey_pubkey_tweak_add(&ctx->ecmult_ctx, &p, &term)) { + secp256k1_pubkey_save(pubkey, &p); + } else { + ret = 0; } } return ret; } -int secp256k1_ec_privkey_tweak_mul(const secp256k1_context_t* ctx, unsigned char *seckey, const unsigned char *tweak) { - secp256k1_scalar_t factor; - secp256k1_scalar_t sec; +int secp256k1_ec_privkey_tweak_mul(const secp256k1_context* ctx, unsigned char *seckey, const unsigned char *tweak) { + secp256k1_scalar factor; + secp256k1_scalar sec; int ret = 0; int overflow = 0; - DEBUG_CHECK(ctx != NULL); - DEBUG_CHECK(seckey != NULL); - DEBUG_CHECK(tweak != NULL); - (void)ctx; + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(seckey != NULL); + ARG_CHECK(tweak != NULL); secp256k1_scalar_set_b32(&factor, tweak, &overflow); secp256k1_scalar_set_b32(&sec, seckey, NULL); - ret = secp256k1_eckey_privkey_tweak_mul(&sec, &factor) && !overflow; + ret = !overflow && secp256k1_eckey_privkey_tweak_mul(&sec, &factor); + memset(seckey, 0, 32); if (ret) { secp256k1_scalar_get_b32(seckey, &sec); } @@ -355,65 +520,65 @@ int secp256k1_ec_privkey_tweak_mul(const secp256k1_context_t* ctx, unsigned char return ret; } -int secp256k1_ec_pubkey_tweak_mul(const secp256k1_context_t* ctx, unsigned char *pubkey, int pubkeylen, const unsigned char *tweak) { - secp256k1_ge_t p; - secp256k1_scalar_t factor; +int secp256k1_ec_pubkey_tweak_mul(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const unsigned char *tweak) { + secp256k1_ge p; + secp256k1_scalar factor; int ret = 0; int overflow = 0; - DEBUG_CHECK(ctx != NULL); - DEBUG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); - DEBUG_CHECK(pubkey != NULL); - DEBUG_CHECK(tweak != NULL); + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); + ARG_CHECK(pubkey != NULL); + ARG_CHECK(tweak != NULL); secp256k1_scalar_set_b32(&factor, tweak, &overflow); - if (!overflow) { - ret = secp256k1_eckey_pubkey_parse(&p, pubkey, pubkeylen); - if (ret) { - ret = secp256k1_eckey_pubkey_tweak_mul(&ctx->ecmult_ctx, &p, &factor); - } - if (ret) { - int oldlen = pubkeylen; - ret = secp256k1_eckey_pubkey_serialize(&p, pubkey, &pubkeylen, oldlen <= 33); - VERIFY_CHECK(pubkeylen == oldlen); - } - } - - return ret; -} - -int secp256k1_ec_privkey_export(const secp256k1_context_t* ctx, const unsigned char *seckey, unsigned char *privkey, int *privkeylen, int compressed) { - secp256k1_scalar_t key; - int ret = 0; - DEBUG_CHECK(seckey != NULL); - DEBUG_CHECK(privkey != NULL); - DEBUG_CHECK(privkeylen != NULL); - DEBUG_CHECK(ctx != NULL); - DEBUG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); - - secp256k1_scalar_set_b32(&key, seckey, NULL); - ret = secp256k1_eckey_privkey_serialize(&ctx->ecmult_gen_ctx, privkey, privkeylen, &key, compressed); - secp256k1_scalar_clear(&key); - return ret; -} - -int secp256k1_ec_privkey_import(const secp256k1_context_t* ctx, unsigned char *seckey, const unsigned char *privkey, int privkeylen) { - secp256k1_scalar_t key; - int ret = 0; - DEBUG_CHECK(seckey != NULL); - DEBUG_CHECK(privkey != NULL); - (void)ctx; - - ret = secp256k1_eckey_privkey_parse(&key, privkey, privkeylen); + ret = !overflow && secp256k1_pubkey_load(ctx, &p, pubkey); + memset(pubkey, 0, sizeof(*pubkey)); if (ret) { - secp256k1_scalar_get_b32(seckey, &key); + if (secp256k1_eckey_pubkey_tweak_mul(&ctx->ecmult_ctx, &p, &factor)) { + secp256k1_pubkey_save(pubkey, &p); + } else { + ret = 0; + } } - secp256k1_scalar_clear(&key); + return ret; } -int secp256k1_context_randomize(secp256k1_context_t* ctx, const unsigned char *seed32) { - DEBUG_CHECK(ctx != NULL); - DEBUG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); +int secp256k1_context_randomize(secp256k1_context* ctx, const unsigned char *seed32) { + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); secp256k1_ecmult_gen_blind(&ctx->ecmult_gen_ctx, seed32); return 1; } + +int secp256k1_ec_pubkey_combine(const secp256k1_context* ctx, secp256k1_pubkey *pubnonce, const secp256k1_pubkey * const *pubnonces, size_t n) { + size_t i; + secp256k1_gej Qj; + secp256k1_ge Q; + + ARG_CHECK(pubnonce != NULL); + memset(pubnonce, 0, sizeof(*pubnonce)); + ARG_CHECK(n >= 1); + ARG_CHECK(pubnonces != NULL); + + secp256k1_gej_set_infinity(&Qj); + + for (i = 0; i < n; i++) { + secp256k1_pubkey_load(ctx, &Q, pubnonces[i]); + secp256k1_gej_add_ge(&Qj, &Qj, &Q); + } + if (secp256k1_gej_is_infinity(&Qj)) { + return 0; + } + secp256k1_ge_set_gej(&Q, &Qj); + secp256k1_pubkey_save(pubnonce, &Q); + return 1; +} + +#ifdef ENABLE_MODULE_ECDH +# include "modules/ecdh/main_impl.h" +#endif + +#ifdef ENABLE_MODULE_RECOVERY +# include "modules/recovery/main_impl.h" +#endif diff --git a/src/testrand.h b/src/testrand.h index 041bb92c4..f8efa93c7 100644 --- a/src/testrand.h +++ b/src/testrand.h @@ -16,13 +16,23 @@ /** Seed the pseudorandom number generator for testing. */ SECP256K1_INLINE static void secp256k1_rand_seed(const unsigned char *seed16); -/** Generate a pseudorandom 32-bit number. */ +/** Generate a pseudorandom number in the range [0..2**32-1]. */ static uint32_t secp256k1_rand32(void); +/** Generate a pseudorandom number in the range [0..2**bits-1]. Bits must be 1 or + * more. */ +static uint32_t secp256k1_rand_bits(int bits); + +/** Generate a pseudorandom number in the range [0..range-1]. */ +static uint32_t secp256k1_rand_int(uint32_t range); + /** Generate a pseudorandom 32-byte array. */ static void secp256k1_rand256(unsigned char *b32); /** Generate a pseudorandom 32-byte array with long sequences of zero and one bits. */ static void secp256k1_rand256_test(unsigned char *b32); +/** Generate pseudorandom bytes with long sequences of zero and one bits. */ +static void secp256k1_rand_bytes_test(unsigned char *bytes, size_t len); + #endif diff --git a/src/testrand_impl.h b/src/testrand_impl.h index 21c69f1c5..15c7b9f12 100644 --- a/src/testrand_impl.h +++ b/src/testrand_impl.h @@ -1,5 +1,5 @@ /********************************************************************** - * Copyright (c) 2013, 2014 Pieter Wuille * + * Copyright (c) 2013-2015 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ @@ -16,9 +16,11 @@ static secp256k1_rfc6979_hmac_sha256_t secp256k1_test_rng; static uint32_t secp256k1_test_rng_precomputed[8]; static int secp256k1_test_rng_precomputed_used = 8; +static uint64_t secp256k1_test_rng_integer; +static int secp256k1_test_rng_integer_bits_left = 0; SECP256K1_INLINE static void secp256k1_rand_seed(const unsigned char *seed16) { - secp256k1_rfc6979_hmac_sha256_initialize(&secp256k1_test_rng, (const unsigned char*)"TestRNG", 7, seed16, 16, NULL, 0); + secp256k1_rfc6979_hmac_sha256_initialize(&secp256k1_test_rng, seed16, 16); } SECP256K1_INLINE static uint32_t secp256k1_rand32(void) { @@ -29,32 +31,80 @@ SECP256K1_INLINE static uint32_t secp256k1_rand32(void) { return secp256k1_test_rng_precomputed[secp256k1_test_rng_precomputed_used++]; } +static uint32_t secp256k1_rand_bits(int bits) { + uint32_t ret; + if (secp256k1_test_rng_integer_bits_left < bits) { + secp256k1_test_rng_integer |= (((uint64_t)secp256k1_rand32()) << secp256k1_test_rng_integer_bits_left); + secp256k1_test_rng_integer_bits_left += 32; + } + ret = secp256k1_test_rng_integer; + secp256k1_test_rng_integer >>= bits; + secp256k1_test_rng_integer_bits_left -= bits; + ret &= ((~((uint32_t)0)) >> (32 - bits)); + return ret; +} + +static uint32_t secp256k1_rand_int(uint32_t range) { + /* We want a uniform integer between 0 and range-1, inclusive. + * B is the smallest number such that range <= 2**B. + * two mechanisms implemented here: + * - generate B bits numbers until one below range is found, and return it + * - find the largest multiple M of range that is <= 2**(B+A), generate B+A + * bits numbers until one below M is found, and return it modulo range + * The second mechanism consumes A more bits of entropy in every iteration, + * but may need fewer iterations due to M being closer to 2**(B+A) then + * range is to 2**B. The array below (indexed by B) contains a 0 when the + * first mechanism is to be used, and the number A otherwise. + */ + static const int addbits[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 1, 0}; + uint32_t trange, mult; + int bits = 0; + if (range <= 1) { + return 0; + } + trange = range - 1; + while (trange > 0) { + trange >>= 1; + bits++; + } + if (addbits[bits]) { + bits = bits + addbits[bits]; + mult = ((~((uint32_t)0)) >> (32 - bits)) / range; + trange = range * mult; + } else { + trange = range; + mult = 1; + } + while(1) { + uint32_t x = secp256k1_rand_bits(bits); + if (x < trange) { + return (mult == 1) ? x : (x % range); + } + } +} + static void secp256k1_rand256(unsigned char *b32) { secp256k1_rfc6979_hmac_sha256_generate(&secp256k1_test_rng, b32, 32); } -static void secp256k1_rand256_test(unsigned char *b32) { - int bits=0; - uint64_t ent = 0; - int entleft = 0; - memset(b32, 0, 32); - while (bits < 256) { +static void secp256k1_rand_bytes_test(unsigned char *bytes, size_t len) { + size_t bits = 0; + memset(bytes, 0, len); + while (bits < len * 8) { int now; uint32_t val; - if (entleft < 12) { - ent |= ((uint64_t)secp256k1_rand32()) << entleft; - entleft += 32; - } - now = 1 + ((ent % 64)*((ent >> 6) % 32)+16)/31; - val = 1 & (ent >> 11); - ent >>= 12; - entleft -= 12; - while (now > 0 && bits < 256) { - b32[bits / 8] |= val << (bits % 8); + now = 1 + (secp256k1_rand_bits(6) * secp256k1_rand_bits(5) + 16) / 31; + val = secp256k1_rand_bits(1); + while (now > 0 && bits < len * 8) { + bytes[bits / 8] |= val << (bits % 8); now--; bits++; } } } +static void secp256k1_rand256_test(unsigned char *b32) { + secp256k1_rand_bytes_test(b32, 32); +} + #endif diff --git a/src/tests.c b/src/tests.c index d0e05057f..3d9bd5ebb 100644 --- a/src/tests.c +++ b/src/tests.c @@ -10,10 +10,12 @@ #include #include +#include #include #include "secp256k1.c" +#include "include/secp256k1.h" #include "testrand_impl.h" #ifdef ENABLE_OPENSSL_TESTS @@ -23,10 +25,40 @@ #include "openssl/obj_mac.h" #endif -static int count = 64; -static secp256k1_context_t *ctx = NULL; +#include "contrib/lax_der_parsing.c" +#include "contrib/lax_der_privatekey_parsing.c" -void random_field_element_test(secp256k1_fe_t *fe) { +#if !defined(VG_CHECK) +# if defined(VALGRIND) +# include +# define VG_UNDEF(x,y) VALGRIND_MAKE_MEM_UNDEFINED((x),(y)) +# define VG_CHECK(x,y) VALGRIND_CHECK_MEM_IS_DEFINED((x),(y)) +# else +# define VG_UNDEF(x,y) +# define VG_CHECK(x,y) +# endif +#endif + +static int count = 64; +static secp256k1_context *ctx = NULL; + +static void counting_illegal_callback_fn(const char* str, void* data) { + /* Dummy callback function that just counts. */ + int32_t *p; + (void)str; + p = data; + (*p)++; +} + +static void uncounting_illegal_callback_fn(const char* str, void* data) { + /* Dummy callback function that just counts (backwards). */ + int32_t *p; + (void)str; + p = data; + (*p)--; +} + +void random_field_element_test(secp256k1_fe *fe) { do { unsigned char b32[32]; secp256k1_rand256_test(b32); @@ -36,9 +68,9 @@ void random_field_element_test(secp256k1_fe_t *fe) { } while(1); } -void random_field_element_magnitude(secp256k1_fe_t *fe) { - secp256k1_fe_t zero; - int n = secp256k1_rand32() % 9; +void random_field_element_magnitude(secp256k1_fe *fe) { + secp256k1_fe zero; + int n = secp256k1_rand_int(9); secp256k1_fe_normalize(fe); if (n == 0) { return; @@ -47,23 +79,22 @@ void random_field_element_magnitude(secp256k1_fe_t *fe) { secp256k1_fe_negate(&zero, &zero, 0); secp256k1_fe_mul_int(&zero, n - 1); secp256k1_fe_add(fe, &zero); -#ifdef VERIFY - CHECK(fe->magnitude == n); -#endif + VERIFY_CHECK(fe->magnitude == n); } -void random_group_element_test(secp256k1_ge_t *ge) { - secp256k1_fe_t fe; +void random_group_element_test(secp256k1_ge *ge) { + secp256k1_fe fe; do { random_field_element_test(&fe); - if (secp256k1_ge_set_xo_var(ge, &fe, secp256k1_rand32() & 1)) { + if (secp256k1_ge_set_xo_var(ge, &fe, secp256k1_rand_bits(1))) { + secp256k1_fe_normalize(&ge->y); break; } } while(1); } -void random_group_element_jacobian_test(secp256k1_gej_t *gej, const secp256k1_ge_t *ge) { - secp256k1_fe_t z2, z3; +void random_group_element_jacobian_test(secp256k1_gej *gej, const secp256k1_ge *ge) { + secp256k1_fe z2, z3; do { random_field_element_test(&gej->z); if (!secp256k1_fe_is_zero(&gej->z)) { @@ -77,7 +108,7 @@ void random_group_element_jacobian_test(secp256k1_gej_t *gej, const secp256k1_ge gej->infinity = ge->infinity; } -void random_scalar_order_test(secp256k1_scalar_t *num) { +void random_scalar_order_test(secp256k1_scalar *num) { do { unsigned char b32[32]; int overflow = 0; @@ -90,7 +121,7 @@ void random_scalar_order_test(secp256k1_scalar_t *num) { } while(1); } -void random_scalar_order(secp256k1_scalar_t *num) { +void random_scalar_order(secp256k1_scalar *num) { do { unsigned char b32[32]; int overflow = 0; @@ -104,19 +135,34 @@ void random_scalar_order(secp256k1_scalar_t *num) { } void run_context_tests(void) { - secp256k1_context_t *none = secp256k1_context_create(0); - secp256k1_context_t *sign = secp256k1_context_create(SECP256K1_CONTEXT_SIGN); - secp256k1_context_t *vrfy = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY); - secp256k1_context_t *both = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); + secp256k1_pubkey pubkey; + secp256k1_pubkey zero_pubkey; + secp256k1_ecdsa_signature sig; + unsigned char ctmp[32]; + int32_t ecount; + int32_t ecount2; + secp256k1_context *none = secp256k1_context_create(SECP256K1_CONTEXT_NONE); + secp256k1_context *sign = secp256k1_context_create(SECP256K1_CONTEXT_SIGN); + secp256k1_context *vrfy = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY); + secp256k1_context *both = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); - secp256k1_gej_t pubj; - secp256k1_ge_t pub; - secp256k1_scalar_t msg, key, nonce; - secp256k1_ecdsa_sig_t sig; + secp256k1_gej pubj; + secp256k1_ge pub; + secp256k1_scalar msg, key, nonce; + secp256k1_scalar sigr, sigs; + + memset(&zero_pubkey, 0, sizeof(zero_pubkey)); + + ecount = 0; + ecount2 = 10; + secp256k1_context_set_illegal_callback(vrfy, counting_illegal_callback_fn, &ecount); + secp256k1_context_set_illegal_callback(sign, counting_illegal_callback_fn, &ecount2); + secp256k1_context_set_error_callback(sign, counting_illegal_callback_fn, NULL); + CHECK(vrfy->error_callback.fn != sign->error_callback.fn); /*** clone and destroy all of them to make sure cloning was complete ***/ { - secp256k1_context_t *ctx_tmp; + secp256k1_context *ctx_tmp; ctx_tmp = none; none = secp256k1_context_clone(none); secp256k1_context_destroy(ctx_tmp); ctx_tmp = sign; sign = secp256k1_context_clone(sign); secp256k1_context_destroy(ctx_tmp); @@ -124,30 +170,82 @@ void run_context_tests(void) { ctx_tmp = both; both = secp256k1_context_clone(both); secp256k1_context_destroy(ctx_tmp); } + /* Verify that the error callback makes it across the clone. */ + CHECK(vrfy->error_callback.fn != sign->error_callback.fn); + /* And that it resets back to default. */ + secp256k1_context_set_error_callback(sign, NULL, NULL); + CHECK(vrfy->error_callback.fn == sign->error_callback.fn); + /*** attempt to use them ***/ random_scalar_order_test(&msg); random_scalar_order_test(&key); secp256k1_ecmult_gen(&both->ecmult_gen_ctx, &pubj, &key); secp256k1_ge_set_gej(&pub, &pubj); + /* Verify context-type checking illegal-argument errors. */ + memset(ctmp, 1, 32); + CHECK(secp256k1_ec_pubkey_create(vrfy, &pubkey, ctmp) == 0); + CHECK(ecount == 1); + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_create(sign, &pubkey, ctmp) == 1); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ecdsa_sign(vrfy, &sig, ctmp, ctmp, NULL, NULL) == 0); + CHECK(ecount == 2); + VG_UNDEF(&sig, sizeof(sig)); + CHECK(secp256k1_ecdsa_sign(sign, &sig, ctmp, ctmp, NULL, NULL) == 1); + VG_CHECK(&sig, sizeof(sig)); + CHECK(ecount2 == 10); + CHECK(secp256k1_ecdsa_verify(sign, &sig, ctmp, &pubkey) == 0); + CHECK(ecount2 == 11); + CHECK(secp256k1_ecdsa_verify(vrfy, &sig, ctmp, &pubkey) == 1); + CHECK(ecount == 2); + CHECK(secp256k1_ec_pubkey_tweak_add(sign, &pubkey, ctmp) == 0); + CHECK(ecount2 == 12); + CHECK(secp256k1_ec_pubkey_tweak_add(vrfy, &pubkey, ctmp) == 1); + CHECK(ecount == 2); + CHECK(secp256k1_ec_pubkey_tweak_mul(sign, &pubkey, ctmp) == 0); + CHECK(ecount2 == 13); + CHECK(secp256k1_ec_pubkey_negate(vrfy, &pubkey) == 1); + CHECK(ecount == 2); + CHECK(secp256k1_ec_pubkey_negate(sign, &pubkey) == 1); + CHECK(ecount == 2); + CHECK(secp256k1_ec_pubkey_negate(sign, NULL) == 0); + CHECK(ecount2 == 14); + CHECK(secp256k1_ec_pubkey_negate(vrfy, &zero_pubkey) == 0); + CHECK(ecount == 3); + CHECK(secp256k1_ec_pubkey_tweak_mul(vrfy, &pubkey, ctmp) == 1); + CHECK(ecount == 3); + CHECK(secp256k1_context_randomize(vrfy, ctmp) == 0); + CHECK(ecount == 4); + CHECK(secp256k1_context_randomize(sign, NULL) == 1); + CHECK(ecount2 == 14); + secp256k1_context_set_illegal_callback(vrfy, NULL, NULL); + secp256k1_context_set_illegal_callback(sign, NULL, NULL); + + /* This shouldn't leak memory, due to already-set tests. */ + secp256k1_ecmult_gen_context_build(&sign->ecmult_gen_ctx, NULL); + secp256k1_ecmult_context_build(&vrfy->ecmult_ctx, NULL); + /* obtain a working nonce */ do { random_scalar_order_test(&nonce); - } while(!secp256k1_ecdsa_sig_sign(&both->ecmult_gen_ctx, &sig, &key, &msg, &nonce, NULL)); + } while(!secp256k1_ecdsa_sig_sign(&both->ecmult_gen_ctx, &sigr, &sigs, &key, &msg, &nonce, NULL)); /* try signing */ - CHECK(secp256k1_ecdsa_sig_sign(&sign->ecmult_gen_ctx, &sig, &key, &msg, &nonce, NULL)); - CHECK(secp256k1_ecdsa_sig_sign(&both->ecmult_gen_ctx, &sig, &key, &msg, &nonce, NULL)); + CHECK(secp256k1_ecdsa_sig_sign(&sign->ecmult_gen_ctx, &sigr, &sigs, &key, &msg, &nonce, NULL)); + CHECK(secp256k1_ecdsa_sig_sign(&both->ecmult_gen_ctx, &sigr, &sigs, &key, &msg, &nonce, NULL)); /* try verifying */ - CHECK(secp256k1_ecdsa_sig_verify(&vrfy->ecmult_ctx, &sig, &pub, &msg)); - CHECK(secp256k1_ecdsa_sig_verify(&both->ecmult_ctx, &sig, &pub, &msg)); + CHECK(secp256k1_ecdsa_sig_verify(&vrfy->ecmult_ctx, &sigr, &sigs, &pub, &msg)); + CHECK(secp256k1_ecdsa_sig_verify(&both->ecmult_ctx, &sigr, &sigs, &pub, &msg)); /* cleanup */ secp256k1_context_destroy(none); secp256k1_context_destroy(sign); secp256k1_context_destroy(vrfy); secp256k1_context_destroy(both); + /* Defined as no-op. */ + secp256k1_context_destroy(NULL); } /***** HASH TESTS *****/ @@ -178,7 +276,7 @@ void run_sha256_tests(void) { secp256k1_sha256_finalize(&hasher, out); CHECK(memcmp(out, outputs[i], 32) == 0); if (strlen(inputs[i]) > 0) { - int split = secp256k1_rand32() % strlen(inputs[i]); + int split = secp256k1_rand_int(strlen(inputs[i])); secp256k1_sha256_initialize(&hasher); secp256k1_sha256_write(&hasher, (const unsigned char*)(inputs[i]), split); secp256k1_sha256_write(&hasher, (const unsigned char*)(inputs[i] + split), strlen(inputs[i]) - split); @@ -222,7 +320,7 @@ void run_hmac_sha256_tests(void) { secp256k1_hmac_sha256_finalize(&hasher, out); CHECK(memcmp(out, outputs[i], 32) == 0); if (strlen(inputs[i]) > 0) { - int split = secp256k1_rand32() % strlen(inputs[i]); + int split = secp256k1_rand_int(strlen(inputs[i])); secp256k1_hmac_sha256_initialize(&hasher, (const unsigned char*)(keys[i]), strlen(keys[i])); secp256k1_hmac_sha256_write(&hasher, (const unsigned char*)(inputs[i]), split); secp256k1_hmac_sha256_write(&hasher, (const unsigned char*)(inputs[i] + split), strlen(inputs[i]) - split); @@ -233,16 +331,14 @@ void run_hmac_sha256_tests(void) { } void run_rfc6979_hmac_sha256_tests(void) { - static const unsigned char key1[32] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x00}; - static const unsigned char msg1[32] = {0x4b, 0xf5, 0x12, 0x2f, 0x34, 0x45, 0x54, 0xc5, 0x3b, 0xde, 0x2e, 0xbb, 0x8c, 0xd2, 0xb7, 0xe3, 0xd1, 0x60, 0x0a, 0xd6, 0x31, 0xc3, 0x85, 0xa5, 0xd7, 0xcc, 0xe2, 0x3c, 0x77, 0x85, 0x45, 0x9a}; + static const unsigned char key1[65] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x00, 0x4b, 0xf5, 0x12, 0x2f, 0x34, 0x45, 0x54, 0xc5, 0x3b, 0xde, 0x2e, 0xbb, 0x8c, 0xd2, 0xb7, 0xe3, 0xd1, 0x60, 0x0a, 0xd6, 0x31, 0xc3, 0x85, 0xa5, 0xd7, 0xcc, 0xe2, 0x3c, 0x77, 0x85, 0x45, 0x9a, 0}; static const unsigned char out1[3][32] = { {0x4f, 0xe2, 0x95, 0x25, 0xb2, 0x08, 0x68, 0x09, 0x15, 0x9a, 0xcd, 0xf0, 0x50, 0x6e, 0xfb, 0x86, 0xb0, 0xec, 0x93, 0x2c, 0x7b, 0xa4, 0x42, 0x56, 0xab, 0x32, 0x1e, 0x42, 0x1e, 0x67, 0xe9, 0xfb}, {0x2b, 0xf0, 0xff, 0xf1, 0xd3, 0xc3, 0x78, 0xa2, 0x2d, 0xc5, 0xde, 0x1d, 0x85, 0x65, 0x22, 0x32, 0x5c, 0x65, 0xb5, 0x04, 0x49, 0x1a, 0x0c, 0xbd, 0x01, 0xcb, 0x8f, 0x3a, 0xa6, 0x7f, 0xfd, 0x4a}, {0xf5, 0x28, 0xb4, 0x10, 0xcb, 0x54, 0x1f, 0x77, 0x00, 0x0d, 0x7a, 0xfb, 0x6c, 0x5b, 0x53, 0xc5, 0xc4, 0x71, 0xea, 0xb4, 0x3e, 0x46, 0x6d, 0x9a, 0xc5, 0x19, 0x0c, 0x39, 0xc8, 0x2f, 0xd8, 0x2e} }; - static const unsigned char key2[32] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - static const unsigned char msg2[32] = {0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c, 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55}; + static const unsigned char key2[64] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c, 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55}; static const unsigned char out2[3][32] = { {0x9c, 0x23, 0x6c, 0x16, 0x5b, 0x82, 0xae, 0x0c, 0xd5, 0x90, 0x65, 0x9e, 0x10, 0x0b, 0x6b, 0xab, 0x30, 0x36, 0xe7, 0xba, 0x8b, 0x06, 0x74, 0x9b, 0xaf, 0x69, 0x81, 0xe1, 0x6f, 0x1a, 0x2b, 0x95}, {0xdf, 0x47, 0x10, 0x61, 0x62, 0x5b, 0xc0, 0xea, 0x14, 0xb6, 0x82, 0xfe, 0xee, 0x2c, 0x9c, 0x02, 0xf2, 0x35, 0xda, 0x04, 0x20, 0x4c, 0x1d, 0x62, 0xa1, 0x53, 0x6c, 0x6e, 0x17, 0xae, 0xd7, 0xa9}, @@ -251,24 +347,23 @@ void run_rfc6979_hmac_sha256_tests(void) { secp256k1_rfc6979_hmac_sha256_t rng; unsigned char out[32]; - unsigned char zero[1] = {0}; int i; - secp256k1_rfc6979_hmac_sha256_initialize(&rng, key1, 32, msg1, 32, NULL, 1); + secp256k1_rfc6979_hmac_sha256_initialize(&rng, key1, 64); for (i = 0; i < 3; i++) { secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32); CHECK(memcmp(out, out1[i], 32) == 0); } secp256k1_rfc6979_hmac_sha256_finalize(&rng); - secp256k1_rfc6979_hmac_sha256_initialize(&rng, key1, 32, msg1, 32, zero, 1); + secp256k1_rfc6979_hmac_sha256_initialize(&rng, key1, 65); for (i = 0; i < 3; i++) { secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32); CHECK(memcmp(out, out1[i], 32) != 0); } secp256k1_rfc6979_hmac_sha256_finalize(&rng); - secp256k1_rfc6979_hmac_sha256_initialize(&rng, key2, 32, msg2, 32, zero, 0); + secp256k1_rfc6979_hmac_sha256_initialize(&rng, key2, 64); for (i = 0; i < 3; i++) { secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32); CHECK(memcmp(out, out2[i], 32) == 0); @@ -276,30 +371,102 @@ void run_rfc6979_hmac_sha256_tests(void) { secp256k1_rfc6979_hmac_sha256_finalize(&rng); } +/***** RANDOM TESTS *****/ + +void test_rand_bits(int rand32, int bits) { + /* (1-1/2^B)^rounds[B] < 1/10^9, so rounds is the number of iterations to + * get a false negative chance below once in a billion */ + static const unsigned int rounds[7] = {1, 30, 73, 156, 322, 653, 1316}; + /* We try multiplying the results with various odd numbers, which shouldn't + * influence the uniform distribution modulo a power of 2. */ + static const uint32_t mults[6] = {1, 3, 21, 289, 0x9999, 0x80402011}; + /* We only select up to 6 bits from the output to analyse */ + unsigned int usebits = bits > 6 ? 6 : bits; + unsigned int maxshift = bits - usebits; + /* For each of the maxshift+1 usebits-bit sequences inside a bits-bit + number, track all observed outcomes, one per bit in a uint64_t. */ + uint64_t x[6][27] = {{0}}; + unsigned int i, shift, m; + /* Multiply the output of all rand calls with the odd number m, which + should not change the uniformity of its distribution. */ + for (i = 0; i < rounds[usebits]; i++) { + uint32_t r = (rand32 ? secp256k1_rand32() : secp256k1_rand_bits(bits)); + CHECK((((uint64_t)r) >> bits) == 0); + for (m = 0; m < sizeof(mults) / sizeof(mults[0]); m++) { + uint32_t rm = r * mults[m]; + for (shift = 0; shift <= maxshift; shift++) { + x[m][shift] |= (((uint64_t)1) << ((rm >> shift) & ((1 << usebits) - 1))); + } + } + } + for (m = 0; m < sizeof(mults) / sizeof(mults[0]); m++) { + for (shift = 0; shift <= maxshift; shift++) { + /* Test that the lower usebits bits of x[shift] are 1 */ + CHECK(((~x[m][shift]) << (64 - (1 << usebits))) == 0); + } + } +} + +/* Subrange must be a whole divisor of range, and at most 64 */ +void test_rand_int(uint32_t range, uint32_t subrange) { + /* (1-1/subrange)^rounds < 1/10^9 */ + int rounds = (subrange * 2073) / 100; + int i; + uint64_t x = 0; + CHECK((range % subrange) == 0); + for (i = 0; i < rounds; i++) { + uint32_t r = secp256k1_rand_int(range); + CHECK(r < range); + r = r % subrange; + x |= (((uint64_t)1) << r); + } + /* Test that the lower subrange bits of x are 1. */ + CHECK(((~x) << (64 - subrange)) == 0); +} + +void run_rand_bits(void) { + size_t b; + test_rand_bits(1, 32); + for (b = 1; b <= 32; b++) { + test_rand_bits(0, b); + } +} + +void run_rand_int(void) { + static const uint32_t ms[] = {1, 3, 17, 1000, 13771, 999999, 33554432}; + static const uint32_t ss[] = {1, 3, 6, 9, 13, 31, 64}; + unsigned int m, s; + for (m = 0; m < sizeof(ms) / sizeof(ms[0]); m++) { + for (s = 0; s < sizeof(ss) / sizeof(ss[0]); s++) { + test_rand_int(ms[m] * ss[s], ss[s]); + } + } +} + /***** NUM TESTS *****/ #ifndef USE_NUM_NONE -void random_num_negate(secp256k1_num_t *num) { - if (secp256k1_rand32() & 1) { +void random_num_negate(secp256k1_num *num) { + if (secp256k1_rand_bits(1)) { secp256k1_num_negate(num); } } -void random_num_order_test(secp256k1_num_t *num) { - secp256k1_scalar_t sc; +void random_num_order_test(secp256k1_num *num) { + secp256k1_scalar sc; random_scalar_order_test(&sc); secp256k1_scalar_get_num(num, &sc); } -void random_num_order(secp256k1_num_t *num) { - secp256k1_scalar_t sc; +void random_num_order(secp256k1_num *num) { + secp256k1_scalar sc; random_scalar_order(&sc); secp256k1_scalar_get_num(num, &sc); } void test_num_negate(void) { - secp256k1_num_t n1; - secp256k1_num_t n2; + secp256k1_num n1; + secp256k1_num n2; random_num_order_test(&n1); /* n1 = R */ random_num_negate(&n1); secp256k1_num_copy(&n2, &n1); /* n2 = R */ @@ -318,16 +485,17 @@ void test_num_negate(void) { } void test_num_add_sub(void) { - secp256k1_num_t n1; - secp256k1_num_t n2; - secp256k1_num_t n1p2, n2p1, n1m2, n2m1; - int r = secp256k1_rand32(); + int i; + secp256k1_scalar s; + secp256k1_num n1; + secp256k1_num n2; + secp256k1_num n1p2, n2p1, n1m2, n2m1; random_num_order_test(&n1); /* n1 = R1 */ - if (r & 1) { + if (secp256k1_rand_bits(1)) { random_num_negate(&n1); } random_num_order_test(&n2); /* n2 = R2 */ - if (r & 2) { + if (secp256k1_rand_bits(1)) { random_num_negate(&n2); } secp256k1_num_add(&n1p2, &n1, &n2); /* n1p2 = R1 + R2 */ @@ -344,6 +512,110 @@ void test_num_add_sub(void) { CHECK(!secp256k1_num_eq(&n2p1, &n1)); secp256k1_num_sub(&n2p1, &n2p1, &n2); /* n2p1 = R2 + R1 - R2 = R1 */ CHECK(secp256k1_num_eq(&n2p1, &n1)); + + /* check is_one */ + secp256k1_scalar_set_int(&s, 1); + secp256k1_scalar_get_num(&n1, &s); + CHECK(secp256k1_num_is_one(&n1)); + /* check that 2^n + 1 is never 1 */ + secp256k1_scalar_get_num(&n2, &s); + for (i = 0; i < 250; ++i) { + secp256k1_num_add(&n1, &n1, &n1); /* n1 *= 2 */ + secp256k1_num_add(&n1p2, &n1, &n2); /* n1p2 = n1 + 1 */ + CHECK(!secp256k1_num_is_one(&n1p2)); + } +} + +void test_num_mod(void) { + int i; + secp256k1_scalar s; + secp256k1_num order, n; + + /* check that 0 mod anything is 0 */ + random_scalar_order_test(&s); + secp256k1_scalar_get_num(&order, &s); + secp256k1_scalar_set_int(&s, 0); + secp256k1_scalar_get_num(&n, &s); + secp256k1_num_mod(&n, &order); + CHECK(secp256k1_num_is_zero(&n)); + + /* check that anything mod 1 is 0 */ + secp256k1_scalar_set_int(&s, 1); + secp256k1_scalar_get_num(&order, &s); + secp256k1_scalar_get_num(&n, &s); + secp256k1_num_mod(&n, &order); + CHECK(secp256k1_num_is_zero(&n)); + + /* check that increasing the number past 2^256 does not break this */ + random_scalar_order_test(&s); + secp256k1_scalar_get_num(&n, &s); + /* multiply by 2^8, which'll test this case with high probability */ + for (i = 0; i < 8; ++i) { + secp256k1_num_add(&n, &n, &n); + } + secp256k1_num_mod(&n, &order); + CHECK(secp256k1_num_is_zero(&n)); +} + +void test_num_jacobi(void) { + secp256k1_scalar sqr; + secp256k1_scalar small; + secp256k1_scalar five; /* five is not a quadratic residue */ + secp256k1_num order, n; + int i; + /* squares mod 5 are 1, 4 */ + const int jacobi5[10] = { 0, 1, -1, -1, 1, 0, 1, -1, -1, 1 }; + + /* check some small values with 5 as the order */ + secp256k1_scalar_set_int(&five, 5); + secp256k1_scalar_get_num(&order, &five); + for (i = 0; i < 10; ++i) { + secp256k1_scalar_set_int(&small, i); + secp256k1_scalar_get_num(&n, &small); + CHECK(secp256k1_num_jacobi(&n, &order) == jacobi5[i]); + } + + /** test large values with 5 as group order */ + secp256k1_scalar_get_num(&order, &five); + /* we first need a scalar which is not a multiple of 5 */ + do { + secp256k1_num fiven; + random_scalar_order_test(&sqr); + secp256k1_scalar_get_num(&fiven, &five); + secp256k1_scalar_get_num(&n, &sqr); + secp256k1_num_mod(&n, &fiven); + } while (secp256k1_num_is_zero(&n)); + /* next force it to be a residue. 2 is a nonresidue mod 5 so we can + * just multiply by two, i.e. add the number to itself */ + if (secp256k1_num_jacobi(&n, &order) == -1) { + secp256k1_num_add(&n, &n, &n); + } + + /* test residue */ + CHECK(secp256k1_num_jacobi(&n, &order) == 1); + /* test nonresidue */ + secp256k1_num_add(&n, &n, &n); + CHECK(secp256k1_num_jacobi(&n, &order) == -1); + + /** test with secp group order as order */ + secp256k1_scalar_order_get_num(&order); + random_scalar_order_test(&sqr); + secp256k1_scalar_sqr(&sqr, &sqr); + /* test residue */ + secp256k1_scalar_get_num(&n, &sqr); + CHECK(secp256k1_num_jacobi(&n, &order) == 1); + /* test nonresidue */ + secp256k1_scalar_mul(&sqr, &sqr, &five); + secp256k1_scalar_get_num(&n, &sqr); + CHECK(secp256k1_num_jacobi(&n, &order) == -1); + /* test multiple of the order*/ + CHECK(secp256k1_num_jacobi(&order, &order) == 0); + + /* check one less than the order */ + secp256k1_scalar_set_int(&small, 1); + secp256k1_scalar_get_num(&n, &small); + secp256k1_num_sub(&n, &order, &n); + CHECK(secp256k1_num_jacobi(&n, &order) == 1); /* sage confirms this is 1 */ } void run_num_smalltests(void) { @@ -351,6 +623,8 @@ void run_num_smalltests(void) { for (i = 0; i < 100*count; i++) { test_num_negate(); test_num_add_sub(); + test_num_mod(); + test_num_jacobi(); } } #endif @@ -358,12 +632,12 @@ void run_num_smalltests(void) { /***** SCALAR TESTS *****/ void scalar_test(void) { - secp256k1_scalar_t s; - secp256k1_scalar_t s1; - secp256k1_scalar_t s2; + secp256k1_scalar s; + secp256k1_scalar s1; + secp256k1_scalar s2; #ifndef USE_NUM_NONE - secp256k1_num_t snum, s1num, s2num; - secp256k1_num_t order, half_order; + secp256k1_num snum, s1num, s2num; + secp256k1_num order, half_order; #endif unsigned char c[32]; @@ -390,10 +664,10 @@ void scalar_test(void) { { int i; /* Test that fetching groups of 4 bits from a scalar and recursing n(i)=16*n(i-1)+p(i) reconstructs it. */ - secp256k1_scalar_t n; + secp256k1_scalar n; secp256k1_scalar_set_int(&n, 0); for (i = 0; i < 256; i += 4) { - secp256k1_scalar_t t; + secp256k1_scalar t; int j; secp256k1_scalar_set_int(&t, secp256k1_scalar_get_bits(&s, 256 - 4 - i, 4)); for (j = 0; j < 4; j++) { @@ -406,13 +680,13 @@ void scalar_test(void) { { /* Test that fetching groups of randomly-sized bits from a scalar and recursing n(i)=b*n(i-1)+p(i) reconstructs it. */ - secp256k1_scalar_t n; + secp256k1_scalar n; int i = 0; secp256k1_scalar_set_int(&n, 0); while (i < 256) { - secp256k1_scalar_t t; + secp256k1_scalar t; int j; - int now = (secp256k1_rand32() % 15) + 1; + int now = secp256k1_rand_int(15) + 1; if (now + i > 256) { now = 256 - i; } @@ -429,9 +703,9 @@ void scalar_test(void) { #ifndef USE_NUM_NONE { /* Test that adding the scalars together is equal to adding their numbers together modulo the order. */ - secp256k1_num_t rnum; - secp256k1_num_t r2num; - secp256k1_scalar_t r; + secp256k1_num rnum; + secp256k1_num r2num; + secp256k1_scalar r; secp256k1_num_add(&rnum, &snum, &s2num); secp256k1_num_mod(&rnum, &order); secp256k1_scalar_add(&r, &s, &s2); @@ -440,10 +714,10 @@ void scalar_test(void) { } { - /* Test that multipying the scalars is equal to multiplying their numbers modulo the order. */ - secp256k1_scalar_t r; - secp256k1_num_t r2num; - secp256k1_num_t rnum; + /* Test that multiplying the scalars is equal to multiplying their numbers modulo the order. */ + secp256k1_scalar r; + secp256k1_num r2num; + secp256k1_num rnum; secp256k1_num_mul(&rnum, &snum, &s2num); secp256k1_num_mod(&rnum, &order); secp256k1_scalar_mul(&r, &s, &s2); @@ -457,9 +731,9 @@ void scalar_test(void) { } { - secp256k1_scalar_t neg; - secp256k1_num_t negnum; - secp256k1_num_t negnum2; + secp256k1_scalar neg; + secp256k1_num negnum; + secp256k1_num negnum2; /* Check that comparison with zero matches comparison with zero on the number. */ CHECK(secp256k1_num_is_zero(&snum) == secp256k1_scalar_is_zero(&s)); /* Check that comparison with the half order is equal to testing for high scalar. */ @@ -484,12 +758,12 @@ void scalar_test(void) { { /* Test secp256k1_scalar_mul_shift_var. */ - secp256k1_scalar_t r; - secp256k1_num_t one; - secp256k1_num_t rnum; - secp256k1_num_t rnum2; + secp256k1_scalar r; + secp256k1_num one; + secp256k1_num rnum; + secp256k1_num rnum2; unsigned char cone[1] = {0x01}; - unsigned int shift = 256 + (secp256k1_rand32() % 257); + unsigned int shift = 256 + secp256k1_rand_int(257); secp256k1_scalar_mul_shift_var(&r, &s1, &s2, shift); secp256k1_num_mul(&rnum, &s1num, &s2num); secp256k1_num_shift(&rnum, shift - 1); @@ -499,15 +773,29 @@ void scalar_test(void) { secp256k1_scalar_get_num(&rnum2, &r); CHECK(secp256k1_num_eq(&rnum, &rnum2)); } + + { + /* test secp256k1_scalar_shr_int */ + secp256k1_scalar r; + int i; + random_scalar_order_test(&r); + for (i = 0; i < 100; ++i) { + int low; + int shift = 1 + secp256k1_rand_int(15); + int expected = r.d[0] % (1 << shift); + low = secp256k1_scalar_shr_int(&r, shift); + CHECK(expected == low); + } + } #endif { /* Test that scalar inverses are equal to the inverse of their number modulo the order. */ if (!secp256k1_scalar_is_zero(&s)) { - secp256k1_scalar_t inv; + secp256k1_scalar inv; #ifndef USE_NUM_NONE - secp256k1_num_t invnum; - secp256k1_num_t invnum2; + secp256k1_num invnum; + secp256k1_num invnum2; #endif secp256k1_scalar_inverse(&inv, &s); #ifndef USE_NUM_NONE @@ -521,23 +809,27 @@ void scalar_test(void) { secp256k1_scalar_inverse(&inv, &inv); /* Inverting one must result in one. */ CHECK(secp256k1_scalar_is_one(&inv)); +#ifndef USE_NUM_NONE + secp256k1_scalar_get_num(&invnum, &inv); + CHECK(secp256k1_num_is_one(&invnum)); +#endif } } { /* Test commutativity of add. */ - secp256k1_scalar_t r1, r2; + secp256k1_scalar r1, r2; secp256k1_scalar_add(&r1, &s1, &s2); secp256k1_scalar_add(&r2, &s2, &s1); CHECK(secp256k1_scalar_eq(&r1, &r2)); } { - secp256k1_scalar_t r1, r2; - secp256k1_scalar_t b; + secp256k1_scalar r1, r2; + secp256k1_scalar b; int i; /* Test add_bit. */ - int bit = secp256k1_rand32() % 256; + int bit = secp256k1_rand_bits(8); secp256k1_scalar_set_int(&b, 1); CHECK(secp256k1_scalar_is_one(&b)); for (i = 0; i < bit; i++) { @@ -547,14 +839,17 @@ void scalar_test(void) { r2 = s1; if (!secp256k1_scalar_add(&r1, &r1, &b)) { /* No overflow happened. */ - secp256k1_scalar_add_bit(&r2, bit); + secp256k1_scalar_cadd_bit(&r2, bit, 1); + CHECK(secp256k1_scalar_eq(&r1, &r2)); + /* cadd is a noop when flag is zero */ + secp256k1_scalar_cadd_bit(&r2, bit, 0); CHECK(secp256k1_scalar_eq(&r1, &r2)); } } { /* Test commutativity of mul. */ - secp256k1_scalar_t r1, r2; + secp256k1_scalar r1, r2; secp256k1_scalar_mul(&r1, &s1, &s2); secp256k1_scalar_mul(&r2, &s2, &s1); CHECK(secp256k1_scalar_eq(&r1, &r2)); @@ -562,7 +857,7 @@ void scalar_test(void) { { /* Test associativity of add. */ - secp256k1_scalar_t r1, r2; + secp256k1_scalar r1, r2; secp256k1_scalar_add(&r1, &s1, &s2); secp256k1_scalar_add(&r1, &r1, &s); secp256k1_scalar_add(&r2, &s2, &s); @@ -572,7 +867,7 @@ void scalar_test(void) { { /* Test associativity of mul. */ - secp256k1_scalar_t r1, r2; + secp256k1_scalar r1, r2; secp256k1_scalar_mul(&r1, &s1, &s2); secp256k1_scalar_mul(&r1, &r1, &s); secp256k1_scalar_mul(&r2, &s2, &s); @@ -582,7 +877,7 @@ void scalar_test(void) { { /* Test distributitivity of mul over add. */ - secp256k1_scalar_t r1, r2, t; + secp256k1_scalar r1, r2, t; secp256k1_scalar_add(&r1, &s1, &s2); secp256k1_scalar_mul(&r1, &r1, &s); secp256k1_scalar_mul(&r2, &s1, &s); @@ -593,7 +888,7 @@ void scalar_test(void) { { /* Test square. */ - secp256k1_scalar_t r1, r2; + secp256k1_scalar r1, r2; secp256k1_scalar_sqr(&r1, &s1); secp256k1_scalar_mul(&r2, &s1, &s1); CHECK(secp256k1_scalar_eq(&r1, &r2)); @@ -601,7 +896,7 @@ void scalar_test(void) { { /* Test multiplicative identity. */ - secp256k1_scalar_t r1, v1; + secp256k1_scalar r1, v1; secp256k1_scalar_set_int(&v1,1); secp256k1_scalar_mul(&r1, &s1, &v1); CHECK(secp256k1_scalar_eq(&r1, &s1)); @@ -609,7 +904,7 @@ void scalar_test(void) { { /* Test additive identity. */ - secp256k1_scalar_t r1, v0; + secp256k1_scalar r1, v0; secp256k1_scalar_set_int(&v0,0); secp256k1_scalar_add(&r1, &s1, &v0); CHECK(secp256k1_scalar_eq(&r1, &s1)); @@ -617,7 +912,7 @@ void scalar_test(void) { { /* Test zero product property. */ - secp256k1_scalar_t r1, v0; + secp256k1_scalar r1, v0; secp256k1_scalar_set_int(&v0,0); secp256k1_scalar_mul(&r1, &s1, &v0); CHECK(secp256k1_scalar_eq(&r1, &v0)); @@ -633,7 +928,7 @@ void run_scalar_tests(void) { { /* (-1)+1 should be zero. */ - secp256k1_scalar_t s, o; + secp256k1_scalar s, o; secp256k1_scalar_set_int(&s, 1); CHECK(secp256k1_scalar_is_one(&s)); secp256k1_scalar_negate(&o, &s); @@ -646,8 +941,8 @@ void run_scalar_tests(void) { #ifndef USE_NUM_NONE { /* A scalar with value of the curve order should be 0. */ - secp256k1_num_t order; - secp256k1_scalar_t zero; + secp256k1_num order; + secp256k1_scalar zero; unsigned char bin[32]; int overflow = 0; secp256k1_scalar_order_get_num(&order); @@ -657,11 +952,605 @@ void run_scalar_tests(void) { CHECK(secp256k1_scalar_is_zero(&zero)); } #endif + + { + /* Does check_overflow check catch all ones? */ + static const secp256k1_scalar overflowed = SECP256K1_SCALAR_CONST( + 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, + 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL + ); + CHECK(secp256k1_scalar_check_overflow(&overflowed)); + } + + { + /* Static test vectors. + * These were reduced from ~10^12 random vectors based on comparison-decision + * and edge-case coverage on 32-bit and 64-bit implementations. + * The responses were generated with Sage 5.9. + */ + secp256k1_scalar x; + secp256k1_scalar y; + secp256k1_scalar z; + secp256k1_scalar zz; + secp256k1_scalar one; + secp256k1_scalar r1; + secp256k1_scalar r2; +#if defined(USE_SCALAR_INV_NUM) + secp256k1_scalar zzv; +#endif + int overflow; + unsigned char chal[33][2][32] = { + {{0xff, 0xff, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0x03, 0x00, 0xc0, 0xff, 0xff, 0xff}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff}}, + {{0xef, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x80, 0xff}}, + {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x80, 0xff, 0x3f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0x00}, + {0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xe0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff}}, + {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x1e, 0xf8, 0xff, 0xff, 0xff, 0xfd, 0xff}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, + 0x00, 0x00, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xe0, + 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, + 0xf3, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {{0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x1f, 0x00, 0x00, 0x80, 0xff, 0xff, 0x3f, + 0x00, 0xfe, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff}}, + {{0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xfc, 0x9f, + 0xff, 0xff, 0xff, 0x00, 0x80, 0x00, 0x00, 0x80, + 0xff, 0x0f, 0xfc, 0xff, 0x7f, 0x00, 0x00, 0x00, + 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}, + {0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x00, 0xf8, 0xff, 0x0f, 0xc0, 0xff, 0xff, + 0xff, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x07, 0x80, 0xff, 0xff, 0xff}}, + {{0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0x00, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xf0}, + {0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}, + {{0x00, 0xf8, 0xff, 0x03, 0xff, 0xff, 0xff, 0x00, + 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x03, 0xc0, 0xff, 0x0f, 0xfc, 0xff}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, + 0xff, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x00, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}, + {{0x8f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x03, 0x00, 0x80, 0x00, 0x00, 0x80, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x80, 0xff, 0x7f}, + {0xff, 0xcf, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xbf, 0xff, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, + 0xff, 0xff, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x80, 0x00, 0x00, 0x80, + 0xff, 0x01, 0xfc, 0xff, 0x01, 0x00, 0xfe, 0xff}, + {0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00}}, + {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf0, 0xff, 0xff, + 0xe0, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x00}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0xfc, 0xff, 0xff, 0x3f, 0xf0, 0xff, 0xff, 0x3f, + 0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0f, 0x7e, 0x00, 0x00}}, + {{0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x1f, 0x00, 0x00, 0xfe, 0x07, 0x00}, + {0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60}}, + {{0xff, 0x01, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x00, + 0x80, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, + {0xff, 0xff, 0x1f, 0x00, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00}}, + {{0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, + 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff}}, + {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xff, 0xff, 0xcf, 0xff, 0x1f, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x7e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00}, + {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0xff, 0xff, 0x7f, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff}}, + {{0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}, + {0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x80, + 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0x7f, 0xf8, 0xff, 0xff, 0x1f, 0x00, 0xfe}}, + {{0xff, 0xff, 0xff, 0x3f, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0x03, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0xff, 0xff, 0xff, 0xff, 0x01, 0x80, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}}, + {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, + 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40}}, + {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {{0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, + {0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}, + {{0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xc0, + 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0xff, 0xff}}, + {{0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}}, + {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, + 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}, + {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7e, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x07, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, + {0xff, 0x01, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}, + {{0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x00, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, + 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, + 0xff, 0xff, 0x3f, 0x00, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x3f, 0x00, 0x00, 0xc0, 0xf1, 0x7f, 0x00}}, + {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00}, + {0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, + 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1f, + 0x00, 0x00, 0xfc, 0xff, 0xff, 0x01, 0xff, 0xff}}, + {{0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x80, 0x00, 0x00, 0x80, 0xff, 0x03, 0xe0, 0x01, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}, + {0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0xfe, 0xff, 0xff, 0xf0, 0x07, 0x00, 0x3c, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x07, 0xe0, 0xff, 0x00, 0x00, 0x00}}, + {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xf8, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x80, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x7f, 0xfe, 0xff, 0x1f, + 0x00, 0xfe, 0xff, 0x03, 0x00, 0x00, 0xfe, 0xff}}, + {{0xff, 0xff, 0x81, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x83, + 0xff, 0xff, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xf0}, + {0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, + 0xf8, 0x07, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc7, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff}}, + {{0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00, + 0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x03, 0xfb, + 0xfa, 0x8a, 0x7d, 0xdf, 0x13, 0x86, 0xe2, 0x03}, + {0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00, + 0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x03, 0xfb, + 0xfa, 0x8a, 0x7d, 0xdf, 0x13, 0x86, 0xe2, 0x03}} + }; + unsigned char res[33][2][32] = { + {{0x0c, 0x3b, 0x0a, 0xca, 0x8d, 0x1a, 0x2f, 0xb9, + 0x8a, 0x7b, 0x53, 0x5a, 0x1f, 0xc5, 0x22, 0xa1, + 0x07, 0x2a, 0x48, 0xea, 0x02, 0xeb, 0xb3, 0xd6, + 0x20, 0x1e, 0x86, 0xd0, 0x95, 0xf6, 0x92, 0x35}, + {0xdc, 0x90, 0x7a, 0x07, 0x2e, 0x1e, 0x44, 0x6d, + 0xf8, 0x15, 0x24, 0x5b, 0x5a, 0x96, 0x37, 0x9c, + 0x37, 0x7b, 0x0d, 0xac, 0x1b, 0x65, 0x58, 0x49, + 0x43, 0xb7, 0x31, 0xbb, 0xa7, 0xf4, 0x97, 0x15}}, + {{0xf1, 0xf7, 0x3a, 0x50, 0xe6, 0x10, 0xba, 0x22, + 0x43, 0x4d, 0x1f, 0x1f, 0x7c, 0x27, 0xca, 0x9c, + 0xb8, 0xb6, 0xa0, 0xfc, 0xd8, 0xc0, 0x05, 0x2f, + 0xf7, 0x08, 0xe1, 0x76, 0xdd, 0xd0, 0x80, 0xc8}, + {0xe3, 0x80, 0x80, 0xb8, 0xdb, 0xe3, 0xa9, 0x77, + 0x00, 0xb0, 0xf5, 0x2e, 0x27, 0xe2, 0x68, 0xc4, + 0x88, 0xe8, 0x04, 0xc1, 0x12, 0xbf, 0x78, 0x59, + 0xe6, 0xa9, 0x7c, 0xe1, 0x81, 0xdd, 0xb9, 0xd5}}, + {{0x96, 0xe2, 0xee, 0x01, 0xa6, 0x80, 0x31, 0xef, + 0x5c, 0xd0, 0x19, 0xb4, 0x7d, 0x5f, 0x79, 0xab, + 0xa1, 0x97, 0xd3, 0x7e, 0x33, 0xbb, 0x86, 0x55, + 0x60, 0x20, 0x10, 0x0d, 0x94, 0x2d, 0x11, 0x7c}, + {0xcc, 0xab, 0xe0, 0xe8, 0x98, 0x65, 0x12, 0x96, + 0x38, 0x5a, 0x1a, 0xf2, 0x85, 0x23, 0x59, 0x5f, + 0xf9, 0xf3, 0xc2, 0x81, 0x70, 0x92, 0x65, 0x12, + 0x9c, 0x65, 0x1e, 0x96, 0x00, 0xef, 0xe7, 0x63}}, + {{0xac, 0x1e, 0x62, 0xc2, 0x59, 0xfc, 0x4e, 0x5c, + 0x83, 0xb0, 0xd0, 0x6f, 0xce, 0x19, 0xf6, 0xbf, + 0xa4, 0xb0, 0xe0, 0x53, 0x66, 0x1f, 0xbf, 0xc9, + 0x33, 0x47, 0x37, 0xa9, 0x3d, 0x5d, 0xb0, 0x48}, + {0x86, 0xb9, 0x2a, 0x7f, 0x8e, 0xa8, 0x60, 0x42, + 0x26, 0x6d, 0x6e, 0x1c, 0xa2, 0xec, 0xe0, 0xe5, + 0x3e, 0x0a, 0x33, 0xbb, 0x61, 0x4c, 0x9f, 0x3c, + 0xd1, 0xdf, 0x49, 0x33, 0xcd, 0x72, 0x78, 0x18}}, + {{0xf7, 0xd3, 0xcd, 0x49, 0x5c, 0x13, 0x22, 0xfb, + 0x2e, 0xb2, 0x2f, 0x27, 0xf5, 0x8a, 0x5d, 0x74, + 0xc1, 0x58, 0xc5, 0xc2, 0x2d, 0x9f, 0x52, 0xc6, + 0x63, 0x9f, 0xba, 0x05, 0x76, 0x45, 0x7a, 0x63}, + {0x8a, 0xfa, 0x55, 0x4d, 0xdd, 0xa3, 0xb2, 0xc3, + 0x44, 0xfd, 0xec, 0x72, 0xde, 0xef, 0xc0, 0x99, + 0xf5, 0x9f, 0xe2, 0x52, 0xb4, 0x05, 0x32, 0x58, + 0x57, 0xc1, 0x8f, 0xea, 0xc3, 0x24, 0x5b, 0x94}}, + {{0x05, 0x83, 0xee, 0xdd, 0x64, 0xf0, 0x14, 0x3b, + 0xa0, 0x14, 0x4a, 0x3a, 0x41, 0x82, 0x7c, 0xa7, + 0x2c, 0xaa, 0xb1, 0x76, 0xbb, 0x59, 0x64, 0x5f, + 0x52, 0xad, 0x25, 0x29, 0x9d, 0x8f, 0x0b, 0xb0}, + {0x7e, 0xe3, 0x7c, 0xca, 0xcd, 0x4f, 0xb0, 0x6d, + 0x7a, 0xb2, 0x3e, 0xa0, 0x08, 0xb9, 0xa8, 0x2d, + 0xc2, 0xf4, 0x99, 0x66, 0xcc, 0xac, 0xd8, 0xb9, + 0x72, 0x2a, 0x4a, 0x3e, 0x0f, 0x7b, 0xbf, 0xf4}}, + {{0x8c, 0x9c, 0x78, 0x2b, 0x39, 0x61, 0x7e, 0xf7, + 0x65, 0x37, 0x66, 0x09, 0x38, 0xb9, 0x6f, 0x70, + 0x78, 0x87, 0xff, 0xcf, 0x93, 0xca, 0x85, 0x06, + 0x44, 0x84, 0xa7, 0xfe, 0xd3, 0xa4, 0xe3, 0x7e}, + {0xa2, 0x56, 0x49, 0x23, 0x54, 0xa5, 0x50, 0xe9, + 0x5f, 0xf0, 0x4d, 0xe7, 0xdc, 0x38, 0x32, 0x79, + 0x4f, 0x1c, 0xb7, 0xe4, 0xbb, 0xf8, 0xbb, 0x2e, + 0x40, 0x41, 0x4b, 0xcc, 0xe3, 0x1e, 0x16, 0x36}}, + {{0x0c, 0x1e, 0xd7, 0x09, 0x25, 0x40, 0x97, 0xcb, + 0x5c, 0x46, 0xa8, 0xda, 0xef, 0x25, 0xd5, 0xe5, + 0x92, 0x4d, 0xcf, 0xa3, 0xc4, 0x5d, 0x35, 0x4a, + 0xe4, 0x61, 0x92, 0xf3, 0xbf, 0x0e, 0xcd, 0xbe}, + {0xe4, 0xaf, 0x0a, 0xb3, 0x30, 0x8b, 0x9b, 0x48, + 0x49, 0x43, 0xc7, 0x64, 0x60, 0x4a, 0x2b, 0x9e, + 0x95, 0x5f, 0x56, 0xe8, 0x35, 0xdc, 0xeb, 0xdc, + 0xc7, 0xc4, 0xfe, 0x30, 0x40, 0xc7, 0xbf, 0xa4}}, + {{0xd4, 0xa0, 0xf5, 0x81, 0x49, 0x6b, 0xb6, 0x8b, + 0x0a, 0x69, 0xf9, 0xfe, 0xa8, 0x32, 0xe5, 0xe0, + 0xa5, 0xcd, 0x02, 0x53, 0xf9, 0x2c, 0xe3, 0x53, + 0x83, 0x36, 0xc6, 0x02, 0xb5, 0xeb, 0x64, 0xb8}, + {0x1d, 0x42, 0xb9, 0xf9, 0xe9, 0xe3, 0x93, 0x2c, + 0x4c, 0xee, 0x6c, 0x5a, 0x47, 0x9e, 0x62, 0x01, + 0x6b, 0x04, 0xfe, 0xa4, 0x30, 0x2b, 0x0d, 0x4f, + 0x71, 0x10, 0xd3, 0x55, 0xca, 0xf3, 0x5e, 0x80}}, + {{0x77, 0x05, 0xf6, 0x0c, 0x15, 0x9b, 0x45, 0xe7, + 0xb9, 0x11, 0xb8, 0xf5, 0xd6, 0xda, 0x73, 0x0c, + 0xda, 0x92, 0xea, 0xd0, 0x9d, 0xd0, 0x18, 0x92, + 0xce, 0x9a, 0xaa, 0xee, 0x0f, 0xef, 0xde, 0x30}, + {0xf1, 0xf1, 0xd6, 0x9b, 0x51, 0xd7, 0x77, 0x62, + 0x52, 0x10, 0xb8, 0x7a, 0x84, 0x9d, 0x15, 0x4e, + 0x07, 0xdc, 0x1e, 0x75, 0x0d, 0x0c, 0x3b, 0xdb, + 0x74, 0x58, 0x62, 0x02, 0x90, 0x54, 0x8b, 0x43}}, + {{0xa6, 0xfe, 0x0b, 0x87, 0x80, 0x43, 0x67, 0x25, + 0x57, 0x5d, 0xec, 0x40, 0x50, 0x08, 0xd5, 0x5d, + 0x43, 0xd7, 0xe0, 0xaa, 0xe0, 0x13, 0xb6, 0xb0, + 0xc0, 0xd4, 0xe5, 0x0d, 0x45, 0x83, 0xd6, 0x13}, + {0x40, 0x45, 0x0a, 0x92, 0x31, 0xea, 0x8c, 0x60, + 0x8c, 0x1f, 0xd8, 0x76, 0x45, 0xb9, 0x29, 0x00, + 0x26, 0x32, 0xd8, 0xa6, 0x96, 0x88, 0xe2, 0xc4, + 0x8b, 0xdb, 0x7f, 0x17, 0x87, 0xcc, 0xc8, 0xf2}}, + {{0xc2, 0x56, 0xe2, 0xb6, 0x1a, 0x81, 0xe7, 0x31, + 0x63, 0x2e, 0xbb, 0x0d, 0x2f, 0x81, 0x67, 0xd4, + 0x22, 0xe2, 0x38, 0x02, 0x25, 0x97, 0xc7, 0x88, + 0x6e, 0xdf, 0xbe, 0x2a, 0xa5, 0x73, 0x63, 0xaa}, + {0x50, 0x45, 0xe2, 0xc3, 0xbd, 0x89, 0xfc, 0x57, + 0xbd, 0x3c, 0xa3, 0x98, 0x7e, 0x7f, 0x36, 0x38, + 0x92, 0x39, 0x1f, 0x0f, 0x81, 0x1a, 0x06, 0x51, + 0x1f, 0x8d, 0x6a, 0xff, 0x47, 0x16, 0x06, 0x9c}}, + {{0x33, 0x95, 0xa2, 0x6f, 0x27, 0x5f, 0x9c, 0x9c, + 0x64, 0x45, 0xcb, 0xd1, 0x3c, 0xee, 0x5e, 0x5f, + 0x48, 0xa6, 0xaf, 0xe3, 0x79, 0xcf, 0xb1, 0xe2, + 0xbf, 0x55, 0x0e, 0xa2, 0x3b, 0x62, 0xf0, 0xe4}, + {0x14, 0xe8, 0x06, 0xe3, 0xbe, 0x7e, 0x67, 0x01, + 0xc5, 0x21, 0x67, 0xd8, 0x54, 0xb5, 0x7f, 0xa4, + 0xf9, 0x75, 0x70, 0x1c, 0xfd, 0x79, 0xdb, 0x86, + 0xad, 0x37, 0x85, 0x83, 0x56, 0x4e, 0xf0, 0xbf}}, + {{0xbc, 0xa6, 0xe0, 0x56, 0x4e, 0xef, 0xfa, 0xf5, + 0x1d, 0x5d, 0x3f, 0x2a, 0x5b, 0x19, 0xab, 0x51, + 0xc5, 0x8b, 0xdd, 0x98, 0x28, 0x35, 0x2f, 0xc3, + 0x81, 0x4f, 0x5c, 0xe5, 0x70, 0xb9, 0xeb, 0x62}, + {0xc4, 0x6d, 0x26, 0xb0, 0x17, 0x6b, 0xfe, 0x6c, + 0x12, 0xf8, 0xe7, 0xc1, 0xf5, 0x2f, 0xfa, 0x91, + 0x13, 0x27, 0xbd, 0x73, 0xcc, 0x33, 0x31, 0x1c, + 0x39, 0xe3, 0x27, 0x6a, 0x95, 0xcf, 0xc5, 0xfb}}, + {{0x30, 0xb2, 0x99, 0x84, 0xf0, 0x18, 0x2a, 0x6e, + 0x1e, 0x27, 0xed, 0xa2, 0x29, 0x99, 0x41, 0x56, + 0xe8, 0xd4, 0x0d, 0xef, 0x99, 0x9c, 0xf3, 0x58, + 0x29, 0x55, 0x1a, 0xc0, 0x68, 0xd6, 0x74, 0xa4}, + {0x07, 0x9c, 0xe7, 0xec, 0xf5, 0x36, 0x73, 0x41, + 0xa3, 0x1c, 0xe5, 0x93, 0x97, 0x6a, 0xfd, 0xf7, + 0x53, 0x18, 0xab, 0xaf, 0xeb, 0x85, 0xbd, 0x92, + 0x90, 0xab, 0x3c, 0xbf, 0x30, 0x82, 0xad, 0xf6}}, + {{0xc6, 0x87, 0x8a, 0x2a, 0xea, 0xc0, 0xa9, 0xec, + 0x6d, 0xd3, 0xdc, 0x32, 0x23, 0xce, 0x62, 0x19, + 0xa4, 0x7e, 0xa8, 0xdd, 0x1c, 0x33, 0xae, 0xd3, + 0x4f, 0x62, 0x9f, 0x52, 0xe7, 0x65, 0x46, 0xf4}, + {0x97, 0x51, 0x27, 0x67, 0x2d, 0xa2, 0x82, 0x87, + 0x98, 0xd3, 0xb6, 0x14, 0x7f, 0x51, 0xd3, 0x9a, + 0x0b, 0xd0, 0x76, 0x81, 0xb2, 0x4f, 0x58, 0x92, + 0xa4, 0x86, 0xa1, 0xa7, 0x09, 0x1d, 0xef, 0x9b}}, + {{0xb3, 0x0f, 0x2b, 0x69, 0x0d, 0x06, 0x90, 0x64, + 0xbd, 0x43, 0x4c, 0x10, 0xe8, 0x98, 0x1c, 0xa3, + 0xe1, 0x68, 0xe9, 0x79, 0x6c, 0x29, 0x51, 0x3f, + 0x41, 0xdc, 0xdf, 0x1f, 0xf3, 0x60, 0xbe, 0x33}, + {0xa1, 0x5f, 0xf7, 0x1d, 0xb4, 0x3e, 0x9b, 0x3c, + 0xe7, 0xbd, 0xb6, 0x06, 0xd5, 0x60, 0x06, 0x6d, + 0x50, 0xd2, 0xf4, 0x1a, 0x31, 0x08, 0xf2, 0xea, + 0x8e, 0xef, 0x5f, 0x7d, 0xb6, 0xd0, 0xc0, 0x27}}, + {{0x62, 0x9a, 0xd9, 0xbb, 0x38, 0x36, 0xce, 0xf7, + 0x5d, 0x2f, 0x13, 0xec, 0xc8, 0x2d, 0x02, 0x8a, + 0x2e, 0x72, 0xf0, 0xe5, 0x15, 0x9d, 0x72, 0xae, + 0xfc, 0xb3, 0x4f, 0x02, 0xea, 0xe1, 0x09, 0xfe}, + {0x00, 0x00, 0x00, 0x00, 0xfa, 0x0a, 0x3d, 0xbc, + 0xad, 0x16, 0x0c, 0xb6, 0xe7, 0x7c, 0x8b, 0x39, + 0x9a, 0x43, 0xbb, 0xe3, 0xc2, 0x55, 0x15, 0x14, + 0x75, 0xac, 0x90, 0x9b, 0x7f, 0x9a, 0x92, 0x00}}, + {{0x8b, 0xac, 0x70, 0x86, 0x29, 0x8f, 0x00, 0x23, + 0x7b, 0x45, 0x30, 0xaa, 0xb8, 0x4c, 0xc7, 0x8d, + 0x4e, 0x47, 0x85, 0xc6, 0x19, 0xe3, 0x96, 0xc2, + 0x9a, 0xa0, 0x12, 0xed, 0x6f, 0xd7, 0x76, 0x16}, + {0x45, 0xaf, 0x7e, 0x33, 0xc7, 0x7f, 0x10, 0x6c, + 0x7c, 0x9f, 0x29, 0xc1, 0xa8, 0x7e, 0x15, 0x84, + 0xe7, 0x7d, 0xc0, 0x6d, 0xab, 0x71, 0x5d, 0xd0, + 0x6b, 0x9f, 0x97, 0xab, 0xcb, 0x51, 0x0c, 0x9f}}, + {{0x9e, 0xc3, 0x92, 0xb4, 0x04, 0x9f, 0xc8, 0xbb, + 0xdd, 0x9e, 0xc6, 0x05, 0xfd, 0x65, 0xec, 0x94, + 0x7f, 0x2c, 0x16, 0xc4, 0x40, 0xac, 0x63, 0x7b, + 0x7d, 0xb8, 0x0c, 0xe4, 0x5b, 0xe3, 0xa7, 0x0e}, + {0x43, 0xf4, 0x44, 0xe8, 0xcc, 0xc8, 0xd4, 0x54, + 0x33, 0x37, 0x50, 0xf2, 0x87, 0x42, 0x2e, 0x00, + 0x49, 0x60, 0x62, 0x02, 0xfd, 0x1a, 0x7c, 0xdb, + 0x29, 0x6c, 0x6d, 0x54, 0x53, 0x08, 0xd1, 0xc8}}, + {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}, + {{0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1, + 0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0, + 0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59, + 0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92}, + {0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1, + 0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0, + 0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59, + 0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92}}, + {{0x28, 0x56, 0xac, 0x0e, 0x4f, 0x98, 0x09, 0xf0, + 0x49, 0xfa, 0x7f, 0x84, 0xac, 0x7e, 0x50, 0x5b, + 0x17, 0x43, 0x14, 0x89, 0x9c, 0x53, 0xa8, 0x94, + 0x30, 0xf2, 0x11, 0x4d, 0x92, 0x14, 0x27, 0xe8}, + {0x39, 0x7a, 0x84, 0x56, 0x79, 0x9d, 0xec, 0x26, + 0x2c, 0x53, 0xc1, 0x94, 0xc9, 0x8d, 0x9e, 0x9d, + 0x32, 0x1f, 0xdd, 0x84, 0x04, 0xe8, 0xe2, 0x0a, + 0x6b, 0xbe, 0xbb, 0x42, 0x40, 0x67, 0x30, 0x6c}}, + {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4, + 0x40, 0x2d, 0xa1, 0x73, 0x2f, 0xc9, 0xbe, 0xbd}, + {0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1, + 0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0, + 0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59, + 0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92}}, + {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, + 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}, + {{0x1c, 0xc4, 0xf7, 0xda, 0x0f, 0x65, 0xca, 0x39, + 0x70, 0x52, 0x92, 0x8e, 0xc3, 0xc8, 0x15, 0xea, + 0x7f, 0x10, 0x9e, 0x77, 0x4b, 0x6e, 0x2d, 0xdf, + 0xe8, 0x30, 0x9d, 0xda, 0xe8, 0x9a, 0x65, 0xae}, + {0x02, 0xb0, 0x16, 0xb1, 0x1d, 0xc8, 0x57, 0x7b, + 0xa2, 0x3a, 0xa2, 0xa3, 0x38, 0x5c, 0x8f, 0xeb, + 0x66, 0x37, 0x91, 0xa8, 0x5f, 0xef, 0x04, 0xf6, + 0x59, 0x75, 0xe1, 0xee, 0x92, 0xf6, 0x0e, 0x30}}, + {{0x8d, 0x76, 0x14, 0xa4, 0x14, 0x06, 0x9f, 0x9a, + 0xdf, 0x4a, 0x85, 0xa7, 0x6b, 0xbf, 0x29, 0x6f, + 0xbc, 0x34, 0x87, 0x5d, 0xeb, 0xbb, 0x2e, 0xa9, + 0xc9, 0x1f, 0x58, 0xd6, 0x9a, 0x82, 0xa0, 0x56}, + {0xd4, 0xb9, 0xdb, 0x88, 0x1d, 0x04, 0xe9, 0x93, + 0x8d, 0x3f, 0x20, 0xd5, 0x86, 0xa8, 0x83, 0x07, + 0xdb, 0x09, 0xd8, 0x22, 0x1f, 0x7f, 0xf1, 0x71, + 0xc8, 0xe7, 0x5d, 0x47, 0xaf, 0x8b, 0x72, 0xe9}}, + {{0x83, 0xb9, 0x39, 0xb2, 0xa4, 0xdf, 0x46, 0x87, + 0xc2, 0xb8, 0xf1, 0xe6, 0x4c, 0xd1, 0xe2, 0xa9, + 0xe4, 0x70, 0x30, 0x34, 0xbc, 0x52, 0x7c, 0x55, + 0xa6, 0xec, 0x80, 0xa4, 0xe5, 0xd2, 0xdc, 0x73}, + {0x08, 0xf1, 0x03, 0xcf, 0x16, 0x73, 0xe8, 0x7d, + 0xb6, 0x7e, 0x9b, 0xc0, 0xb4, 0xc2, 0xa5, 0x86, + 0x02, 0x77, 0xd5, 0x27, 0x86, 0xa5, 0x15, 0xfb, + 0xae, 0x9b, 0x8c, 0xa9, 0xf9, 0xf8, 0xa8, 0x4a}}, + {{0x8b, 0x00, 0x49, 0xdb, 0xfa, 0xf0, 0x1b, 0xa2, + 0xed, 0x8a, 0x9a, 0x7a, 0x36, 0x78, 0x4a, 0xc7, + 0xf7, 0xad, 0x39, 0xd0, 0x6c, 0x65, 0x7a, 0x41, + 0xce, 0xd6, 0xd6, 0x4c, 0x20, 0x21, 0x6b, 0xc7}, + {0xc6, 0xca, 0x78, 0x1d, 0x32, 0x6c, 0x6c, 0x06, + 0x91, 0xf2, 0x1a, 0xe8, 0x43, 0x16, 0xea, 0x04, + 0x3c, 0x1f, 0x07, 0x85, 0xf7, 0x09, 0x22, 0x08, + 0xba, 0x13, 0xfd, 0x78, 0x1e, 0x3f, 0x6f, 0x62}}, + {{0x25, 0x9b, 0x7c, 0xb0, 0xac, 0x72, 0x6f, 0xb2, + 0xe3, 0x53, 0x84, 0x7a, 0x1a, 0x9a, 0x98, 0x9b, + 0x44, 0xd3, 0x59, 0xd0, 0x8e, 0x57, 0x41, 0x40, + 0x78, 0xa7, 0x30, 0x2f, 0x4c, 0x9c, 0xb9, 0x68}, + {0xb7, 0x75, 0x03, 0x63, 0x61, 0xc2, 0x48, 0x6e, + 0x12, 0x3d, 0xbf, 0x4b, 0x27, 0xdf, 0xb1, 0x7a, + 0xff, 0x4e, 0x31, 0x07, 0x83, 0xf4, 0x62, 0x5b, + 0x19, 0xa5, 0xac, 0xa0, 0x32, 0x58, 0x0d, 0xa7}}, + {{0x43, 0x4f, 0x10, 0xa4, 0xca, 0xdb, 0x38, 0x67, + 0xfa, 0xae, 0x96, 0xb5, 0x6d, 0x97, 0xff, 0x1f, + 0xb6, 0x83, 0x43, 0xd3, 0xa0, 0x2d, 0x70, 0x7a, + 0x64, 0x05, 0x4c, 0xa7, 0xc1, 0xa5, 0x21, 0x51}, + {0xe4, 0xf1, 0x23, 0x84, 0xe1, 0xb5, 0x9d, 0xf2, + 0xb8, 0x73, 0x8b, 0x45, 0x2b, 0x35, 0x46, 0x38, + 0x10, 0x2b, 0x50, 0xf8, 0x8b, 0x35, 0xcd, 0x34, + 0xc8, 0x0e, 0xf6, 0xdb, 0x09, 0x35, 0xf0, 0xda}}, + {{0xdb, 0x21, 0x5c, 0x8d, 0x83, 0x1d, 0xb3, 0x34, + 0xc7, 0x0e, 0x43, 0xa1, 0x58, 0x79, 0x67, 0x13, + 0x1e, 0x86, 0x5d, 0x89, 0x63, 0xe6, 0x0a, 0x46, + 0x5c, 0x02, 0x97, 0x1b, 0x62, 0x43, 0x86, 0xf5}, + {0xdb, 0x21, 0x5c, 0x8d, 0x83, 0x1d, 0xb3, 0x34, + 0xc7, 0x0e, 0x43, 0xa1, 0x58, 0x79, 0x67, 0x13, + 0x1e, 0x86, 0x5d, 0x89, 0x63, 0xe6, 0x0a, 0x46, + 0x5c, 0x02, 0x97, 0x1b, 0x62, 0x43, 0x86, 0xf5}} + }; + secp256k1_scalar_set_int(&one, 1); + for (i = 0; i < 33; i++) { + secp256k1_scalar_set_b32(&x, chal[i][0], &overflow); + CHECK(!overflow); + secp256k1_scalar_set_b32(&y, chal[i][1], &overflow); + CHECK(!overflow); + secp256k1_scalar_set_b32(&r1, res[i][0], &overflow); + CHECK(!overflow); + secp256k1_scalar_set_b32(&r2, res[i][1], &overflow); + CHECK(!overflow); + secp256k1_scalar_mul(&z, &x, &y); + CHECK(!secp256k1_scalar_check_overflow(&z)); + CHECK(secp256k1_scalar_eq(&r1, &z)); + if (!secp256k1_scalar_is_zero(&y)) { + secp256k1_scalar_inverse(&zz, &y); + CHECK(!secp256k1_scalar_check_overflow(&zz)); +#if defined(USE_SCALAR_INV_NUM) + secp256k1_scalar_inverse_var(&zzv, &y); + CHECK(secp256k1_scalar_eq(&zzv, &zz)); +#endif + secp256k1_scalar_mul(&z, &z, &zz); + CHECK(!secp256k1_scalar_check_overflow(&z)); + CHECK(secp256k1_scalar_eq(&x, &z)); + secp256k1_scalar_mul(&zz, &zz, &y); + CHECK(!secp256k1_scalar_check_overflow(&zz)); + CHECK(secp256k1_scalar_eq(&one, &zz)); + } + secp256k1_scalar_mul(&z, &x, &x); + CHECK(!secp256k1_scalar_check_overflow(&z)); + secp256k1_scalar_sqr(&zz, &x); + CHECK(!secp256k1_scalar_check_overflow(&zz)); + CHECK(secp256k1_scalar_eq(&zz, &z)); + CHECK(secp256k1_scalar_eq(&r2, &zz)); + } + } } /***** FIELD TESTS *****/ -void random_fe(secp256k1_fe_t *x) { +void random_fe(secp256k1_fe *x) { unsigned char bin[32]; do { secp256k1_rand256(bin); @@ -671,7 +1560,17 @@ void random_fe(secp256k1_fe_t *x) { } while(1); } -void random_fe_non_zero(secp256k1_fe_t *nz) { +void random_fe_test(secp256k1_fe *x) { + unsigned char bin[32]; + do { + secp256k1_rand256_test(bin); + if (secp256k1_fe_set_b32(x, bin)) { + return; + } + } while(1); +} + +void random_fe_non_zero(secp256k1_fe *nz) { int tries = 10; while (--tries >= 0) { random_fe(nz); @@ -684,25 +1583,25 @@ void random_fe_non_zero(secp256k1_fe_t *nz) { CHECK(tries >= 0); } -void random_fe_non_square(secp256k1_fe_t *ns) { - secp256k1_fe_t r; +void random_fe_non_square(secp256k1_fe *ns) { + secp256k1_fe r; random_fe_non_zero(ns); - if (secp256k1_fe_sqrt_var(&r, ns)) { + if (secp256k1_fe_sqrt(&r, ns)) { secp256k1_fe_negate(ns, ns, 1); } } -int check_fe_equal(const secp256k1_fe_t *a, const secp256k1_fe_t *b) { - secp256k1_fe_t an = *a; - secp256k1_fe_t bn = *b; +int check_fe_equal(const secp256k1_fe *a, const secp256k1_fe *b) { + secp256k1_fe an = *a; + secp256k1_fe bn = *b; secp256k1_fe_normalize_weak(&an); secp256k1_fe_normalize_var(&bn); return secp256k1_fe_equal_var(&an, &bn); } -int check_fe_inverse(const secp256k1_fe_t *a, const secp256k1_fe_t *ai) { - secp256k1_fe_t x; - secp256k1_fe_t one = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1); +int check_fe_inverse(const secp256k1_fe *a, const secp256k1_fe *ai) { + secp256k1_fe x; + secp256k1_fe one = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1); secp256k1_fe_mul(&x, a, ai); return check_fe_equal(&x, &one); } @@ -714,17 +1613,17 @@ void run_field_convert(void) { 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x40 }; - static const secp256k1_fe_storage_t fes = SECP256K1_FE_STORAGE_CONST( + static const secp256k1_fe_storage fes = SECP256K1_FE_STORAGE_CONST( 0x00010203UL, 0x04050607UL, 0x11121314UL, 0x15161718UL, 0x22232425UL, 0x26272829UL, 0x33343536UL, 0x37383940UL ); - static const secp256k1_fe_t fe = SECP256K1_FE_CONST( + static const secp256k1_fe fe = SECP256K1_FE_CONST( 0x00010203UL, 0x04050607UL, 0x11121314UL, 0x15161718UL, 0x22232425UL, 0x26272829UL, 0x33343536UL, 0x37383940UL ); - secp256k1_fe_t fe2; + secp256k1_fe fe2; unsigned char b322[32]; - secp256k1_fe_storage_t fes2; + secp256k1_fe_storage fes2; /* Check conversions to fe. */ CHECK(secp256k1_fe_set_b32(&fe2, b32)); CHECK(secp256k1_fe_equal_var(&fe, &fe2)); @@ -737,15 +1636,24 @@ void run_field_convert(void) { CHECK(memcmp(&fes2, &fes, sizeof(fes)) == 0); } +int fe_memcmp(const secp256k1_fe *a, const secp256k1_fe *b) { + secp256k1_fe t = *b; +#ifdef VERIFY + t.magnitude = a->magnitude; + t.normalized = a->normalized; +#endif + return memcmp(a, &t, sizeof(secp256k1_fe)); +} + void run_field_misc(void) { - secp256k1_fe_t x; - secp256k1_fe_t y; - secp256k1_fe_t z; - secp256k1_fe_t q; - secp256k1_fe_t fe5 = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 5); - int i; + secp256k1_fe x; + secp256k1_fe y; + secp256k1_fe z; + secp256k1_fe q; + secp256k1_fe fe5 = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 5); + int i, j; for (i = 0; i < 5*count; i++) { - secp256k1_fe_storage_t xs, ys, zs; + secp256k1_fe_storage xs, ys, zs; random_fe(&x); random_fe_non_zero(&y); /* Test the fe equality and comparison operations. */ @@ -756,14 +1664,27 @@ void run_field_misc(void) { /* Test fe conditional move; z is not normalized here. */ q = x; secp256k1_fe_cmov(&x, &z, 0); + VERIFY_CHECK(!x.normalized && x.magnitude == z.magnitude); secp256k1_fe_cmov(&x, &x, 1); - CHECK(memcmp(&x, &z, sizeof(x)) != 0); - CHECK(memcmp(&x, &q, sizeof(x)) == 0); + CHECK(fe_memcmp(&x, &z) != 0); + CHECK(fe_memcmp(&x, &q) == 0); secp256k1_fe_cmov(&q, &z, 1); - CHECK(memcmp(&q, &z, sizeof(q)) == 0); - /* Test storage conversion and conditional moves. */ - secp256k1_fe_normalize(&z); + VERIFY_CHECK(!q.normalized && q.magnitude == z.magnitude); + CHECK(fe_memcmp(&q, &z) == 0); + secp256k1_fe_normalize_var(&x); + secp256k1_fe_normalize_var(&z); CHECK(!secp256k1_fe_equal_var(&x, &z)); + secp256k1_fe_normalize_var(&q); + secp256k1_fe_cmov(&q, &z, (i&1)); + VERIFY_CHECK(q.normalized && q.magnitude == 1); + for (j = 0; j < 6; j++) { + secp256k1_fe_negate(&z, &z, j+1); + secp256k1_fe_normalize_var(&q); + secp256k1_fe_cmov(&q, &z, (j&1)); + VERIFY_CHECK(!q.normalized && q.magnitude == (j+2)); + } + secp256k1_fe_normalize_var(&z); + /* Test storage conversion and conditional moves. */ secp256k1_fe_to_storage(&xs, &x); secp256k1_fe_to_storage(&ys, &y); secp256k1_fe_to_storage(&zs, &z); @@ -797,7 +1718,7 @@ void run_field_misc(void) { } void run_field_inv(void) { - secp256k1_fe_t x, xi, xii; + secp256k1_fe x, xi, xii; int i; for (i = 0; i < 10*count; i++) { random_fe_non_zero(&x); @@ -809,7 +1730,7 @@ void run_field_inv(void) { } void run_field_inv_var(void) { - secp256k1_fe_t x, xi, xii; + secp256k1_fe x, xi, xii; int i; for (i = 0; i < 10*count; i++) { random_fe_non_zero(&x); @@ -821,21 +1742,21 @@ void run_field_inv_var(void) { } void run_field_inv_all_var(void) { - secp256k1_fe_t x[16], xi[16], xii[16]; + secp256k1_fe x[16], xi[16], xii[16]; int i; /* Check it's safe to call for 0 elements */ - secp256k1_fe_inv_all_var(0, xi, x); + secp256k1_fe_inv_all_var(xi, x, 0); for (i = 0; i < count; i++) { size_t j; - size_t len = (secp256k1_rand32() & 15) + 1; + size_t len = secp256k1_rand_int(15) + 1; for (j = 0; j < len; j++) { random_fe_non_zero(&x[j]); } - secp256k1_fe_inv_all_var(len, xi, x); + secp256k1_fe_inv_all_var(xi, x, len); for (j = 0; j < len; j++) { CHECK(check_fe_inverse(&x[j], &xi[j])); } - secp256k1_fe_inv_all_var(len, xii, xi); + secp256k1_fe_inv_all_var(xii, xi, len); for (j = 0; j < len; j++) { CHECK(check_fe_equal(&x[j], &xii[j])); } @@ -843,7 +1764,7 @@ void run_field_inv_all_var(void) { } void run_sqr(void) { - secp256k1_fe_t x, s; + secp256k1_fe x, s; { int i; @@ -858,9 +1779,9 @@ void run_sqr(void) { } } -void test_sqrt(const secp256k1_fe_t *a, const secp256k1_fe_t *k) { - secp256k1_fe_t r1, r2; - int v = secp256k1_fe_sqrt_var(&r1, a); +void test_sqrt(const secp256k1_fe *a, const secp256k1_fe *k) { + secp256k1_fe r1, r2; + int v = secp256k1_fe_sqrt(&r1, a); CHECK((v == 0) == (k == NULL)); if (k != NULL) { @@ -873,7 +1794,7 @@ void test_sqrt(const secp256k1_fe_t *a, const secp256k1_fe_t *k) { } void run_sqrt(void) { - secp256k1_fe_t ns, x, s, t; + secp256k1_fe ns, x, s, t; int i; /* Check sqrt(0) is 0 */ @@ -908,19 +1829,19 @@ void run_sqrt(void) { /***** GROUP TESTS *****/ -void ge_equals_ge(const secp256k1_ge_t *a, const secp256k1_ge_t *b) { +void ge_equals_ge(const secp256k1_ge *a, const secp256k1_ge *b) { CHECK(a->infinity == b->infinity); if (a->infinity) { return; } CHECK(secp256k1_fe_equal_var(&a->x, &b->x)); - CHECK(secp256k1_fe_equal_var(&b->y, &b->y)); + CHECK(secp256k1_fe_equal_var(&a->y, &b->y)); } /* This compares jacobian points including their Z, not just their geometric meaning. */ -int gej_xyz_equals_gej(const secp256k1_gej_t *a, const secp256k1_gej_t *b) { - secp256k1_gej_t a2; - secp256k1_gej_t b2; +int gej_xyz_equals_gej(const secp256k1_gej *a, const secp256k1_gej *b) { + secp256k1_gej a2; + secp256k1_gej b2; int ret = 1; ret &= a->infinity == b->infinity; if (ret && !a->infinity) { @@ -939,9 +1860,9 @@ int gej_xyz_equals_gej(const secp256k1_gej_t *a, const secp256k1_gej_t *b) { return ret; } -void ge_equals_gej(const secp256k1_ge_t *a, const secp256k1_gej_t *b) { - secp256k1_fe_t z2s; - secp256k1_fe_t u1, u2, s1, s2; +void ge_equals_gej(const secp256k1_ge *a, const secp256k1_gej *b) { + secp256k1_fe z2s; + secp256k1_fe u1, u2, s1, s2; CHECK(a->infinity == b->infinity); if (a->infinity) { return; @@ -958,21 +1879,39 @@ void ge_equals_gej(const secp256k1_ge_t *a, const secp256k1_gej_t *b) { void test_ge(void) { int i, i1; +#ifdef USE_ENDOMORPHISM + int runs = 6; +#else int runs = 4; +#endif /* Points: (infinity, p1, p1, -p1, -p1, p2, p2, -p2, -p2, p3, p3, -p3, -p3, p4, p4, -p4, -p4). * The second in each pair of identical points uses a random Z coordinate in the Jacobian form. * All magnitudes are randomized. - * All 17*17 combinations of points are added to eachother, using all applicable methods. + * All 17*17 combinations of points are added to each other, using all applicable methods. + * + * When the endomorphism code is compiled in, p5 = lambda*p1 and p6 = lambda^2*p1 are added as well. */ - secp256k1_ge_t *ge = (secp256k1_ge_t *)malloc(sizeof(secp256k1_ge_t) * (1 + 4 * runs)); - secp256k1_gej_t *gej = (secp256k1_gej_t *)malloc(sizeof(secp256k1_gej_t) * (1 + 4 * runs)); + secp256k1_ge *ge = (secp256k1_ge *)checked_malloc(&ctx->error_callback, sizeof(secp256k1_ge) * (1 + 4 * runs)); + secp256k1_gej *gej = (secp256k1_gej *)checked_malloc(&ctx->error_callback, sizeof(secp256k1_gej) * (1 + 4 * runs)); + secp256k1_fe *zinv = (secp256k1_fe *)checked_malloc(&ctx->error_callback, sizeof(secp256k1_fe) * (1 + 4 * runs)); + secp256k1_fe zf; + secp256k1_fe zfi2, zfi3; + secp256k1_gej_set_infinity(&gej[0]); secp256k1_ge_clear(&ge[0]); secp256k1_ge_set_gej_var(&ge[0], &gej[0]); for (i = 0; i < runs; i++) { int j; - secp256k1_ge_t g; + secp256k1_ge g; random_group_element_test(&g); +#ifdef USE_ENDOMORPHISM + if (i >= runs - 2) { + secp256k1_ge_mul_lambda(&g, &ge[1]); + } + if (i >= runs - 1) { + secp256k1_ge_mul_lambda(&g, &g); + } +#endif ge[1 + 4 * i] = g; ge[2 + 4 * i] = g; secp256k1_ge_neg(&ge[3 + 4 * i], &g); @@ -990,18 +1929,65 @@ void test_ge(void) { } } + /* Compute z inverses. */ + { + secp256k1_fe *zs = checked_malloc(&ctx->error_callback, sizeof(secp256k1_fe) * (1 + 4 * runs)); + for (i = 0; i < 4 * runs + 1; i++) { + if (i == 0) { + /* The point at infinity does not have a meaningful z inverse. Any should do. */ + do { + random_field_element_test(&zs[i]); + } while(secp256k1_fe_is_zero(&zs[i])); + } else { + zs[i] = gej[i].z; + } + } + secp256k1_fe_inv_all_var(zinv, zs, 4 * runs + 1); + free(zs); + } + + /* Generate random zf, and zfi2 = 1/zf^2, zfi3 = 1/zf^3 */ + do { + random_field_element_test(&zf); + } while(secp256k1_fe_is_zero(&zf)); + random_field_element_magnitude(&zf); + secp256k1_fe_inv_var(&zfi3, &zf); + secp256k1_fe_sqr(&zfi2, &zfi3); + secp256k1_fe_mul(&zfi3, &zfi3, &zfi2); + for (i1 = 0; i1 < 1 + 4 * runs; i1++) { int i2; for (i2 = 0; i2 < 1 + 4 * runs; i2++) { /* Compute reference result using gej + gej (var). */ - secp256k1_gej_t refj, resj; - secp256k1_ge_t ref; - secp256k1_gej_add_var(&refj, &gej[i1], &gej[i2]); + secp256k1_gej refj, resj; + secp256k1_ge ref; + secp256k1_fe zr; + secp256k1_gej_add_var(&refj, &gej[i1], &gej[i2], secp256k1_gej_is_infinity(&gej[i1]) ? NULL : &zr); + /* Check Z ratio. */ + if (!secp256k1_gej_is_infinity(&gej[i1]) && !secp256k1_gej_is_infinity(&refj)) { + secp256k1_fe zrz; secp256k1_fe_mul(&zrz, &zr, &gej[i1].z); + CHECK(secp256k1_fe_equal_var(&zrz, &refj.z)); + } secp256k1_ge_set_gej_var(&ref, &refj); - /* Test gej + ge (var). */ - secp256k1_gej_add_ge_var(&resj, &gej[i1], &ge[i2]); + /* Test gej + ge with Z ratio result (var). */ + secp256k1_gej_add_ge_var(&resj, &gej[i1], &ge[i2], secp256k1_gej_is_infinity(&gej[i1]) ? NULL : &zr); ge_equals_gej(&ref, &resj); + if (!secp256k1_gej_is_infinity(&gej[i1]) && !secp256k1_gej_is_infinity(&resj)) { + secp256k1_fe zrz; secp256k1_fe_mul(&zrz, &zr, &gej[i1].z); + CHECK(secp256k1_fe_equal_var(&zrz, &resj.z)); + } + + /* Test gej + ge (var, with additional Z factor). */ + { + secp256k1_ge ge2_zfi = ge[i2]; /* the second term with x and y rescaled for z = 1/zf */ + secp256k1_fe_mul(&ge2_zfi.x, &ge2_zfi.x, &zfi2); + secp256k1_fe_mul(&ge2_zfi.y, &ge2_zfi.y, &zfi3); + random_field_element_magnitude(&ge2_zfi.x); + random_field_element_magnitude(&ge2_zfi.y); + secp256k1_gej_add_zinv_var(&resj, &gej[i1], &ge2_zfi, &zf); + ge_equals_gej(&ref, &resj); + } /* Test gej + ge (const). */ if (i2 != 0) { @@ -1012,10 +1998,15 @@ void test_ge(void) { /* Test doubling (var). */ if ((i1 == 0 && i2 == 0) || ((i1 + 3)/4 == (i2 + 3)/4 && ((i1 + 3)%4)/2 == ((i2 + 3)%4)/2)) { - /* Normal doubling. */ - secp256k1_gej_double_var(&resj, &gej[i1]); + secp256k1_fe zr2; + /* Normal doubling with Z ratio result. */ + secp256k1_gej_double_var(&resj, &gej[i1], &zr2); ge_equals_gej(&ref, &resj); - secp256k1_gej_double_var(&resj, &gej[i2]); + /* Check Z ratio. */ + secp256k1_fe_mul(&zr2, &zr2, &gej[i1].z); + CHECK(secp256k1_fe_equal_var(&zr2, &resj.z)); + /* Normal doubling. */ + secp256k1_gej_double_var(&resj, &gej[i2], NULL); ge_equals_gej(&ref, &resj); } @@ -1040,41 +2031,121 @@ void test_ge(void) { /* Test adding all points together in random order equals infinity. */ { - secp256k1_gej_t sum = SECP256K1_GEJ_CONST_INFINITY; - secp256k1_gej_t *gej_shuffled = (secp256k1_gej_t *)malloc((4 * runs + 1) * sizeof(secp256k1_gej_t)); + secp256k1_gej sum = SECP256K1_GEJ_CONST_INFINITY; + secp256k1_gej *gej_shuffled = (secp256k1_gej *)checked_malloc(&ctx->error_callback, (4 * runs + 1) * sizeof(secp256k1_gej)); for (i = 0; i < 4 * runs + 1; i++) { gej_shuffled[i] = gej[i]; } for (i = 0; i < 4 * runs + 1; i++) { - int swap = i + secp256k1_rand32() % (4 * runs + 1 - i); + int swap = i + secp256k1_rand_int(4 * runs + 1 - i); if (swap != i) { - secp256k1_gej_t t = gej_shuffled[i]; + secp256k1_gej t = gej_shuffled[i]; gej_shuffled[i] = gej_shuffled[swap]; gej_shuffled[swap] = t; } } for (i = 0; i < 4 * runs + 1; i++) { - secp256k1_gej_add_var(&sum, &sum, &gej_shuffled[i]); + secp256k1_gej_add_var(&sum, &sum, &gej_shuffled[i], NULL); } CHECK(secp256k1_gej_is_infinity(&sum)); free(gej_shuffled); } - /* Test batch gej -> ge conversion. */ + /* Test batch gej -> ge conversion with and without known z ratios. */ { - secp256k1_ge_t *ge_set_all = (secp256k1_ge_t *)malloc((4 * runs + 1) * sizeof(secp256k1_ge_t)); - secp256k1_ge_set_all_gej_var(4 * runs + 1, ge_set_all, gej); + secp256k1_fe *zr = (secp256k1_fe *)checked_malloc(&ctx->error_callback, (4 * runs + 1) * sizeof(secp256k1_fe)); + secp256k1_ge *ge_set_table = (secp256k1_ge *)checked_malloc(&ctx->error_callback, (4 * runs + 1) * sizeof(secp256k1_ge)); + secp256k1_ge *ge_set_all = (secp256k1_ge *)checked_malloc(&ctx->error_callback, (4 * runs + 1) * sizeof(secp256k1_ge)); for (i = 0; i < 4 * runs + 1; i++) { - secp256k1_fe_t s; + /* Compute gej[i + 1].z / gez[i].z (with gej[n].z taken to be 1). */ + if (i < 4 * runs) { + secp256k1_fe_mul(&zr[i + 1], &zinv[i], &gej[i + 1].z); + } + } + secp256k1_ge_set_table_gej_var(ge_set_table, gej, zr, 4 * runs + 1); + secp256k1_ge_set_all_gej_var(ge_set_all, gej, 4 * runs + 1, &ctx->error_callback); + for (i = 0; i < 4 * runs + 1; i++) { + secp256k1_fe s; random_fe_non_zero(&s); secp256k1_gej_rescale(&gej[i], &s); + ge_equals_gej(&ge_set_table[i], &gej[i]); ge_equals_gej(&ge_set_all[i], &gej[i]); } + free(ge_set_table); free(ge_set_all); + free(zr); } free(ge); free(gej); + free(zinv); +} + +void test_add_neg_y_diff_x(void) { + /* The point of this test is to check that we can add two points + * whose y-coordinates are negatives of each other but whose x + * coordinates differ. If the x-coordinates were the same, these + * points would be negatives of each other and their sum is + * infinity. This is cool because it "covers up" any degeneracy + * in the addition algorithm that would cause the xy coordinates + * of the sum to be wrong (since infinity has no xy coordinates). + * HOWEVER, if the x-coordinates are different, infinity is the + * wrong answer, and such degeneracies are exposed. This is the + * root of https://github.com/bitcoin-core/secp256k1/issues/257 + * which this test is a regression test for. + * + * These points were generated in sage as + * # secp256k1 params + * F = FiniteField (0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F) + * C = EllipticCurve ([F (0), F (7)]) + * G = C.lift_x(0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798) + * N = FiniteField(G.order()) + * + * # endomorphism values (lambda is 1^{1/3} in N, beta is 1^{1/3} in F) + * x = polygen(N) + * lam = (1 - x^3).roots()[1][0] + * + * # random "bad pair" + * P = C.random_element() + * Q = -int(lam) * P + * print " P: %x %x" % P.xy() + * print " Q: %x %x" % Q.xy() + * print "P + Q: %x %x" % (P + Q).xy() + */ + secp256k1_gej aj = SECP256K1_GEJ_CONST( + 0x8d24cd95, 0x0a355af1, 0x3c543505, 0x44238d30, + 0x0643d79f, 0x05a59614, 0x2f8ec030, 0xd58977cb, + 0x001e337a, 0x38093dcd, 0x6c0f386d, 0x0b1293a8, + 0x4d72c879, 0xd7681924, 0x44e6d2f3, 0x9190117d + ); + secp256k1_gej bj = SECP256K1_GEJ_CONST( + 0xc7b74206, 0x1f788cd9, 0xabd0937d, 0x164a0d86, + 0x95f6ff75, 0xf19a4ce9, 0xd013bd7b, 0xbf92d2a7, + 0xffe1cc85, 0xc7f6c232, 0x93f0c792, 0xf4ed6c57, + 0xb28d3786, 0x2897e6db, 0xbb192d0b, 0x6e6feab2 + ); + secp256k1_gej sumj = SECP256K1_GEJ_CONST( + 0x671a63c0, 0x3efdad4c, 0x389a7798, 0x24356027, + 0xb3d69010, 0x278625c3, 0x5c86d390, 0x184a8f7a, + 0x5f6409c2, 0x2ce01f2b, 0x511fd375, 0x25071d08, + 0xda651801, 0x70e95caf, 0x8f0d893c, 0xbed8fbbe + ); + secp256k1_ge b; + secp256k1_gej resj; + secp256k1_ge res; + secp256k1_ge_set_gej(&b, &bj); + + secp256k1_gej_add_var(&resj, &aj, &bj, NULL); + secp256k1_ge_set_gej(&res, &resj); + ge_equals_gej(&res, &sumj); + + secp256k1_gej_add_ge(&resj, &aj, &b); + secp256k1_ge_set_gej(&res, &resj); + ge_equals_gej(&res, &sumj); + + secp256k1_gej_add_ge_var(&resj, &aj, &b, NULL); + secp256k1_ge_set_gej(&res, &resj); + ge_equals_gej(&res, &sumj); } void run_ge(void) { @@ -1082,36 +2153,142 @@ void run_ge(void) { for (i = 0; i < count * 32; i++) { test_ge(); } + test_add_neg_y_diff_x(); +} + +void test_ec_combine(void) { + secp256k1_scalar sum = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0); + secp256k1_pubkey data[6]; + const secp256k1_pubkey* d[6]; + secp256k1_pubkey sd; + secp256k1_pubkey sd2; + secp256k1_gej Qj; + secp256k1_ge Q; + int i; + for (i = 1; i <= 6; i++) { + secp256k1_scalar s; + random_scalar_order_test(&s); + secp256k1_scalar_add(&sum, &sum, &s); + secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &Qj, &s); + secp256k1_ge_set_gej(&Q, &Qj); + secp256k1_pubkey_save(&data[i - 1], &Q); + d[i - 1] = &data[i - 1]; + secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &Qj, &sum); + secp256k1_ge_set_gej(&Q, &Qj); + secp256k1_pubkey_save(&sd, &Q); + CHECK(secp256k1_ec_pubkey_combine(ctx, &sd2, d, i) == 1); + CHECK(memcmp(&sd, &sd2, sizeof(sd)) == 0); + } +} + +void run_ec_combine(void) { + int i; + for (i = 0; i < count * 8; i++) { + test_ec_combine(); + } +} + +void test_group_decompress(const secp256k1_fe* x) { + /* The input itself, normalized. */ + secp256k1_fe fex = *x; + secp256k1_fe fez; + /* Results of set_xquad_var, set_xo_var(..., 0), set_xo_var(..., 1). */ + secp256k1_ge ge_quad, ge_even, ge_odd; + secp256k1_gej gej_quad; + /* Return values of the above calls. */ + int res_quad, res_even, res_odd; + + secp256k1_fe_normalize_var(&fex); + + res_quad = secp256k1_ge_set_xquad(&ge_quad, &fex); + res_even = secp256k1_ge_set_xo_var(&ge_even, &fex, 0); + res_odd = secp256k1_ge_set_xo_var(&ge_odd, &fex, 1); + + CHECK(res_quad == res_even); + CHECK(res_quad == res_odd); + + if (res_quad) { + secp256k1_fe_normalize_var(&ge_quad.x); + secp256k1_fe_normalize_var(&ge_odd.x); + secp256k1_fe_normalize_var(&ge_even.x); + secp256k1_fe_normalize_var(&ge_quad.y); + secp256k1_fe_normalize_var(&ge_odd.y); + secp256k1_fe_normalize_var(&ge_even.y); + + /* No infinity allowed. */ + CHECK(!ge_quad.infinity); + CHECK(!ge_even.infinity); + CHECK(!ge_odd.infinity); + + /* Check that the x coordinates check out. */ + CHECK(secp256k1_fe_equal_var(&ge_quad.x, x)); + CHECK(secp256k1_fe_equal_var(&ge_even.x, x)); + CHECK(secp256k1_fe_equal_var(&ge_odd.x, x)); + + /* Check that the Y coordinate result in ge_quad is a square. */ + CHECK(secp256k1_fe_is_quad_var(&ge_quad.y)); + + /* Check odd/even Y in ge_odd, ge_even. */ + CHECK(secp256k1_fe_is_odd(&ge_odd.y)); + CHECK(!secp256k1_fe_is_odd(&ge_even.y)); + + /* Check secp256k1_gej_has_quad_y_var. */ + secp256k1_gej_set_ge(&gej_quad, &ge_quad); + CHECK(secp256k1_gej_has_quad_y_var(&gej_quad)); + do { + random_fe_test(&fez); + } while (secp256k1_fe_is_zero(&fez)); + secp256k1_gej_rescale(&gej_quad, &fez); + CHECK(secp256k1_gej_has_quad_y_var(&gej_quad)); + secp256k1_gej_neg(&gej_quad, &gej_quad); + CHECK(!secp256k1_gej_has_quad_y_var(&gej_quad)); + do { + random_fe_test(&fez); + } while (secp256k1_fe_is_zero(&fez)); + secp256k1_gej_rescale(&gej_quad, &fez); + CHECK(!secp256k1_gej_has_quad_y_var(&gej_quad)); + secp256k1_gej_neg(&gej_quad, &gej_quad); + CHECK(secp256k1_gej_has_quad_y_var(&gej_quad)); + } +} + +void run_group_decompress(void) { + int i; + for (i = 0; i < count * 4; i++) { + secp256k1_fe fe; + random_fe_test(&fe); + test_group_decompress(&fe); + } } /***** ECMULT TESTS *****/ void run_ecmult_chain(void) { /* random starting point A (on the curve) */ - secp256k1_gej_t a = SECP256K1_GEJ_CONST( + secp256k1_gej a = SECP256K1_GEJ_CONST( 0x8b30bbe9, 0xae2a9906, 0x96b22f67, 0x0709dff3, 0x727fd8bc, 0x04d3362c, 0x6c7bf458, 0xe2846004, 0xa357ae91, 0x5c4a6528, 0x1309edf2, 0x0504740f, 0x0eb33439, 0x90216b4f, 0x81063cb6, 0x5f2f7e0f ); /* two random initial factors xn and gn */ - secp256k1_scalar_t xn = SECP256K1_SCALAR_CONST( + secp256k1_scalar xn = SECP256K1_SCALAR_CONST( 0x84cc5452, 0xf7fde1ed, 0xb4d38a8c, 0xe9b1b84c, 0xcef31f14, 0x6e569be9, 0x705d357a, 0x42985407 ); - secp256k1_scalar_t gn = SECP256K1_SCALAR_CONST( + secp256k1_scalar gn = SECP256K1_SCALAR_CONST( 0xa1e58d22, 0x553dcd42, 0xb2398062, 0x5d4c57a9, 0x6e9323d4, 0x2b3152e5, 0xca2c3990, 0xedc7c9de ); /* two small multipliers to be applied to xn and gn in every iteration: */ - static const secp256k1_scalar_t xf = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0x1337); - static const secp256k1_scalar_t gf = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0x7113); + static const secp256k1_scalar xf = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0x1337); + static const secp256k1_scalar gf = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0x7113); /* accumulators with the resulting coefficients to A and G */ - secp256k1_scalar_t ae = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1); - secp256k1_scalar_t ge = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0); + secp256k1_scalar ae = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1); + secp256k1_scalar ge = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0); /* actual points */ - secp256k1_gej_t x = a; - secp256k1_gej_t x2; + secp256k1_gej x; + secp256k1_gej x2; int i; /* the point being computed */ @@ -1131,7 +2308,7 @@ void run_ecmult_chain(void) { /* verify */ if (i == 19999) { /* expected result after 19999 iterations */ - secp256k1_gej_t rp = SECP256K1_GEJ_CONST( + secp256k1_gej rp = SECP256K1_GEJ_CONST( 0xD6E96687, 0xF9B10D09, 0x2A6F3543, 0x9D86CEBE, 0xA4535D0D, 0x409F5358, 0x6440BD74, 0xB933E830, 0xB95CBCA2, 0xC77DA786, 0x539BE8FD, 0x53354D2D, @@ -1139,30 +2316,32 @@ void run_ecmult_chain(void) { ); secp256k1_gej_neg(&rp, &rp); - secp256k1_gej_add_var(&rp, &rp, &x); + secp256k1_gej_add_var(&rp, &rp, &x, NULL); CHECK(secp256k1_gej_is_infinity(&rp)); } } /* redo the computation, but directly with the resulting ae and ge coefficients: */ secp256k1_ecmult(&ctx->ecmult_ctx, &x2, &a, &ae, &ge); secp256k1_gej_neg(&x2, &x2); - secp256k1_gej_add_var(&x2, &x2, &x); + secp256k1_gej_add_var(&x2, &x2, &x, NULL); CHECK(secp256k1_gej_is_infinity(&x2)); } -void test_point_times_order(const secp256k1_gej_t *point) { +void test_point_times_order(const secp256k1_gej *point) { /* X * (point + G) + (order-X) * (pointer + G) = 0 */ - secp256k1_scalar_t x; - secp256k1_scalar_t nx; - secp256k1_gej_t res1, res2; - secp256k1_ge_t res3; + secp256k1_scalar x; + secp256k1_scalar nx; + secp256k1_scalar zero = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0); + secp256k1_scalar one = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1); + secp256k1_gej res1, res2; + secp256k1_ge res3; unsigned char pub[65]; - int psize = 65; + size_t psize = 65; random_scalar_order_test(&x); secp256k1_scalar_negate(&nx, &x); secp256k1_ecmult(&ctx->ecmult_ctx, &res1, point, &x, &x); /* calc res1 = x * point + x * G; */ secp256k1_ecmult(&ctx->ecmult_ctx, &res2, point, &nx, &nx); /* calc res2 = (order - x) * point + (order - x) * G; */ - secp256k1_gej_add_var(&res1, &res1, &res2); + secp256k1_gej_add_var(&res1, &res1, &res2, NULL); CHECK(secp256k1_gej_is_infinity(&res1)); CHECK(secp256k1_gej_is_valid_var(&res1) == 0); secp256k1_ge_set_gej(&res3, &res1); @@ -1171,19 +2350,29 @@ void test_point_times_order(const secp256k1_gej_t *point) { CHECK(secp256k1_eckey_pubkey_serialize(&res3, pub, &psize, 0) == 0); psize = 65; CHECK(secp256k1_eckey_pubkey_serialize(&res3, pub, &psize, 1) == 0); + /* check zero/one edge cases */ + secp256k1_ecmult(&ctx->ecmult_ctx, &res1, point, &zero, &zero); + secp256k1_ge_set_gej(&res3, &res1); + CHECK(secp256k1_ge_is_infinity(&res3)); + secp256k1_ecmult(&ctx->ecmult_ctx, &res1, point, &one, &zero); + secp256k1_ge_set_gej(&res3, &res1); + ge_equals_gej(&res3, point); + secp256k1_ecmult(&ctx->ecmult_ctx, &res1, point, &zero, &one); + secp256k1_ge_set_gej(&res3, &res1); + ge_equals_ge(&res3, &secp256k1_ge_const_g); } void run_point_times_order(void) { int i; - secp256k1_fe_t x = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 2); - static const secp256k1_fe_t xr = SECP256K1_FE_CONST( + secp256k1_fe x = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 2); + static const secp256k1_fe xr = SECP256K1_FE_CONST( 0x7603CB59, 0xB0EF6C63, 0xFE608479, 0x2A0C378C, 0xDB3233A8, 0x0F8A9A09, 0xA877DEAD, 0x31B38C45 ); for (i = 0; i < 500; i++) { - secp256k1_ge_t p; + secp256k1_ge p; if (secp256k1_ge_set_xo_var(&p, &x, 1)) { - secp256k1_gej_t j; + secp256k1_gej j; CHECK(secp256k1_ge_is_valid_var(&p)); secp256k1_gej_set_ge(&j, &p); CHECK(secp256k1_gej_is_valid_var(&j)); @@ -1195,15 +2384,118 @@ void run_point_times_order(void) { CHECK(secp256k1_fe_equal_var(&x, &xr)); } -void test_wnaf(const secp256k1_scalar_t *number, int w) { - secp256k1_scalar_t x, two, t; +void ecmult_const_random_mult(void) { + /* random starting point A (on the curve) */ + secp256k1_ge a = SECP256K1_GE_CONST( + 0x6d986544, 0x57ff52b8, 0xcf1b8126, 0x5b802a5b, + 0xa97f9263, 0xb1e88044, 0x93351325, 0x91bc450a, + 0x535c59f7, 0x325e5d2b, 0xc391fbe8, 0x3c12787c, + 0x337e4a98, 0xe82a9011, 0x0123ba37, 0xdd769c7d + ); + /* random initial factor xn */ + secp256k1_scalar xn = SECP256K1_SCALAR_CONST( + 0x649d4f77, 0xc4242df7, 0x7f2079c9, 0x14530327, + 0xa31b876a, 0xd2d8ce2a, 0x2236d5c6, 0xd7b2029b + ); + /* expected xn * A (from sage) */ + secp256k1_ge expected_b = SECP256K1_GE_CONST( + 0x23773684, 0x4d209dc7, 0x098a786f, 0x20d06fcd, + 0x070a38bf, 0xc11ac651, 0x03004319, 0x1e2a8786, + 0xed8c3b8e, 0xc06dd57b, 0xd06ea66e, 0x45492b0f, + 0xb84e4e1b, 0xfb77e21f, 0x96baae2a, 0x63dec956 + ); + secp256k1_gej b; + secp256k1_ecmult_const(&b, &a, &xn); + + CHECK(secp256k1_ge_is_valid_var(&a)); + ge_equals_gej(&expected_b, &b); +} + +void ecmult_const_commutativity(void) { + secp256k1_scalar a; + secp256k1_scalar b; + secp256k1_gej res1; + secp256k1_gej res2; + secp256k1_ge mid1; + secp256k1_ge mid2; + random_scalar_order_test(&a); + random_scalar_order_test(&b); + + secp256k1_ecmult_const(&res1, &secp256k1_ge_const_g, &a); + secp256k1_ecmult_const(&res2, &secp256k1_ge_const_g, &b); + secp256k1_ge_set_gej(&mid1, &res1); + secp256k1_ge_set_gej(&mid2, &res2); + secp256k1_ecmult_const(&res1, &mid1, &b); + secp256k1_ecmult_const(&res2, &mid2, &a); + secp256k1_ge_set_gej(&mid1, &res1); + secp256k1_ge_set_gej(&mid2, &res2); + ge_equals_ge(&mid1, &mid2); +} + +void ecmult_const_mult_zero_one(void) { + secp256k1_scalar zero = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0); + secp256k1_scalar one = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1); + secp256k1_scalar negone; + secp256k1_gej res1; + secp256k1_ge res2; + secp256k1_ge point; + secp256k1_scalar_negate(&negone, &one); + + random_group_element_test(&point); + secp256k1_ecmult_const(&res1, &point, &zero); + secp256k1_ge_set_gej(&res2, &res1); + CHECK(secp256k1_ge_is_infinity(&res2)); + secp256k1_ecmult_const(&res1, &point, &one); + secp256k1_ge_set_gej(&res2, &res1); + ge_equals_ge(&res2, &point); + secp256k1_ecmult_const(&res1, &point, &negone); + secp256k1_gej_neg(&res1, &res1); + secp256k1_ge_set_gej(&res2, &res1); + ge_equals_ge(&res2, &point); +} + +void ecmult_const_chain_multiply(void) { + /* Check known result (randomly generated test problem from sage) */ + const secp256k1_scalar scalar = SECP256K1_SCALAR_CONST( + 0x4968d524, 0x2abf9b7a, 0x466abbcf, 0x34b11b6d, + 0xcd83d307, 0x827bed62, 0x05fad0ce, 0x18fae63b + ); + const secp256k1_gej expected_point = SECP256K1_GEJ_CONST( + 0x5494c15d, 0x32099706, 0xc2395f94, 0x348745fd, + 0x757ce30e, 0x4e8c90fb, 0xa2bad184, 0xf883c69f, + 0x5d195d20, 0xe191bf7f, 0x1be3e55f, 0x56a80196, + 0x6071ad01, 0xf1462f66, 0xc997fa94, 0xdb858435 + ); + secp256k1_gej point; + secp256k1_ge res; + int i; + + secp256k1_gej_set_ge(&point, &secp256k1_ge_const_g); + for (i = 0; i < 100; ++i) { + secp256k1_ge tmp; + secp256k1_ge_set_gej(&tmp, &point); + secp256k1_ecmult_const(&point, &tmp, &scalar); + } + secp256k1_ge_set_gej(&res, &point); + ge_equals_gej(&res, &expected_point); +} + +void run_ecmult_const_tests(void) { + ecmult_const_mult_zero_one(); + ecmult_const_random_mult(); + ecmult_const_commutativity(); + ecmult_const_chain_multiply(); +} + +void test_wnaf(const secp256k1_scalar *number, int w) { + secp256k1_scalar x, two, t; int wnaf[256]; int zeroes = -1; int i; int bits; secp256k1_scalar_set_int(&x, 0); secp256k1_scalar_set_int(&two, 2); - bits = secp256k1_ecmult_wnaf(wnaf, number, w); + bits = secp256k1_ecmult_wnaf(wnaf, 256, number, w); CHECK(bits <= 256); for (i = bits-1; i >= 0; i--) { int v = wnaf[i]; @@ -1229,20 +2521,89 @@ void test_wnaf(const secp256k1_scalar_t *number, int w) { CHECK(secp256k1_scalar_eq(&x, number)); /* check that wnaf represents number */ } +void test_constant_wnaf_negate(const secp256k1_scalar *number) { + secp256k1_scalar neg1 = *number; + secp256k1_scalar neg2 = *number; + int sign1 = 1; + int sign2 = 1; + + if (!secp256k1_scalar_get_bits(&neg1, 0, 1)) { + secp256k1_scalar_negate(&neg1, &neg1); + sign1 = -1; + } + sign2 = secp256k1_scalar_cond_negate(&neg2, secp256k1_scalar_is_even(&neg2)); + CHECK(sign1 == sign2); + CHECK(secp256k1_scalar_eq(&neg1, &neg2)); +} + +void test_constant_wnaf(const secp256k1_scalar *number, int w) { + secp256k1_scalar x, shift; + int wnaf[256] = {0}; + int i; + int skew; + secp256k1_scalar num = *number; + + secp256k1_scalar_set_int(&x, 0); + secp256k1_scalar_set_int(&shift, 1 << w); + /* With USE_ENDOMORPHISM on we only consider 128-bit numbers */ +#ifdef USE_ENDOMORPHISM + for (i = 0; i < 16; ++i) { + secp256k1_scalar_shr_int(&num, 8); + } +#endif + skew = secp256k1_wnaf_const(wnaf, num, w); + + for (i = WNAF_SIZE(w); i >= 0; --i) { + secp256k1_scalar t; + int v = wnaf[i]; + CHECK(v != 0); /* check nonzero */ + CHECK(v & 1); /* check parity */ + CHECK(v > -(1 << w)); /* check range above */ + CHECK(v < (1 << w)); /* check range below */ + + secp256k1_scalar_mul(&x, &x, &shift); + if (v >= 0) { + secp256k1_scalar_set_int(&t, v); + } else { + secp256k1_scalar_set_int(&t, -v); + secp256k1_scalar_negate(&t, &t); + } + secp256k1_scalar_add(&x, &x, &t); + } + /* Skew num because when encoding numbers as odd we use an offset */ + secp256k1_scalar_cadd_bit(&num, skew == 2, 1); + CHECK(secp256k1_scalar_eq(&x, &num)); +} + void run_wnaf(void) { int i; - secp256k1_scalar_t n; + secp256k1_scalar n = {{0}}; + + /* Sanity check: 1 and 2 are the smallest odd and even numbers and should + * have easier-to-diagnose failure modes */ + n.d[0] = 1; + test_constant_wnaf(&n, 4); + n.d[0] = 2; + test_constant_wnaf(&n, 4); + /* Random tests */ for (i = 0; i < count; i++) { random_scalar_order(&n); test_wnaf(&n, 4+(i%10)); + test_constant_wnaf_negate(&n); + test_constant_wnaf(&n, 4 + (i % 10)); } + secp256k1_scalar_set_int(&n, 0); + CHECK(secp256k1_scalar_cond_negate(&n, 1) == -1); + CHECK(secp256k1_scalar_is_zero(&n)); + CHECK(secp256k1_scalar_cond_negate(&n, 0) == 1); + CHECK(secp256k1_scalar_is_zero(&n)); } void test_ecmult_constants(void) { /* Test ecmult_gen() for [0..36) and [order-36..0). */ - secp256k1_scalar_t x; - secp256k1_gej_t r; - secp256k1_ge_t ng; + secp256k1_scalar x; + secp256k1_gej r; + secp256k1_ge ng; int i; int j; secp256k1_ge_neg(&ng, &secp256k1_ge_const_g); @@ -1276,14 +2637,14 @@ void run_ecmult_constants(void) { } void test_ecmult_gen_blind(void) { - /* Test ecmult_gen() blinding and confirm that the blinding changes, the affline points match, and the z's don't match. */ - secp256k1_scalar_t key; - secp256k1_scalar_t b; + /* Test ecmult_gen() blinding and confirm that the blinding changes, the affine points match, and the z's don't match. */ + secp256k1_scalar key; + secp256k1_scalar b; unsigned char seed32[32]; - secp256k1_gej_t pgej; - secp256k1_gej_t pgej2; - secp256k1_gej_t i; - secp256k1_ge_t pge; + secp256k1_gej pgej; + secp256k1_gej pgej2; + secp256k1_gej i; + secp256k1_ge pge; random_scalar_order_test(&key); secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pgej, &key); secp256k1_rand256(seed32); @@ -1300,8 +2661,8 @@ void test_ecmult_gen_blind(void) { void test_ecmult_gen_blind_reset(void) { /* Test ecmult_gen() blinding reset and confirm that the blinding is consistent. */ - secp256k1_scalar_t b; - secp256k1_gej_t initial; + secp256k1_scalar b; + secp256k1_gej initial; secp256k1_ecmult_gen_blind(&ctx->ecmult_gen_ctx, 0); b = ctx->ecmult_gen_ctx.blind; initial = ctx->ecmult_gen_ctx.initial; @@ -1318,35 +2679,702 @@ void run_ecmult_gen_blind(void) { } } +#ifdef USE_ENDOMORPHISM +/***** ENDOMORPHISH TESTS *****/ +void test_scalar_split(void) { + secp256k1_scalar full; + secp256k1_scalar s1, slam; + const unsigned char zero[32] = {0}; + unsigned char tmp[32]; -void random_sign(secp256k1_ecdsa_sig_t *sig, const secp256k1_scalar_t *key, const secp256k1_scalar_t *msg, int *recid) { - secp256k1_scalar_t nonce; + random_scalar_order_test(&full); + secp256k1_scalar_split_lambda(&s1, &slam, &full); + + /* check that both are <= 128 bits in size */ + if (secp256k1_scalar_is_high(&s1)) { + secp256k1_scalar_negate(&s1, &s1); + } + if (secp256k1_scalar_is_high(&slam)) { + secp256k1_scalar_negate(&slam, &slam); + } + + secp256k1_scalar_get_b32(tmp, &s1); + CHECK(memcmp(zero, tmp, 16) == 0); + secp256k1_scalar_get_b32(tmp, &slam); + CHECK(memcmp(zero, tmp, 16) == 0); +} + +void run_endomorphism_tests(void) { + test_scalar_split(); +} +#endif + +void ec_pubkey_parse_pointtest(const unsigned char *input, int xvalid, int yvalid) { + unsigned char pubkeyc[65]; + secp256k1_pubkey pubkey; + secp256k1_ge ge; + size_t pubkeyclen; + int32_t ecount; + ecount = 0; + secp256k1_context_set_illegal_callback(ctx, counting_illegal_callback_fn, &ecount); + for (pubkeyclen = 3; pubkeyclen <= 65; pubkeyclen++) { + /* Smaller sizes are tested exhaustively elsewhere. */ + int32_t i; + memcpy(&pubkeyc[1], input, 64); + VG_UNDEF(&pubkeyc[pubkeyclen], 65 - pubkeyclen); + for (i = 0; i < 256; i++) { + /* Try all type bytes. */ + int xpass; + int ypass; + int ysign; + pubkeyc[0] = i; + /* What sign does this point have? */ + ysign = (input[63] & 1) + 2; + /* For the current type (i) do we expect parsing to work? Handled all of compressed/uncompressed/hybrid. */ + xpass = xvalid && (pubkeyclen == 33) && ((i & 254) == 2); + /* Do we expect a parse and re-serialize as uncompressed to give a matching y? */ + ypass = xvalid && yvalid && ((i & 4) == ((pubkeyclen == 65) << 2)) && + ((i == 4) || ((i & 251) == ysign)) && ((pubkeyclen == 33) || (pubkeyclen == 65)); + if (xpass || ypass) { + /* These cases must parse. */ + unsigned char pubkeyo[65]; + size_t outl; + memset(&pubkey, 0, sizeof(pubkey)); + VG_UNDEF(&pubkey, sizeof(pubkey)); + ecount = 0; + CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, pubkeyclen) == 1); + VG_CHECK(&pubkey, sizeof(pubkey)); + outl = 65; + VG_UNDEF(pubkeyo, 65); + CHECK(secp256k1_ec_pubkey_serialize(ctx, pubkeyo, &outl, &pubkey, SECP256K1_EC_COMPRESSED) == 1); + VG_CHECK(pubkeyo, outl); + CHECK(outl == 33); + CHECK(memcmp(&pubkeyo[1], &pubkeyc[1], 32) == 0); + CHECK((pubkeyclen != 33) || (pubkeyo[0] == pubkeyc[0])); + if (ypass) { + /* This test isn't always done because we decode with alternative signs, so the y won't match. */ + CHECK(pubkeyo[0] == ysign); + CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 1); + memset(&pubkey, 0, sizeof(pubkey)); + VG_UNDEF(&pubkey, sizeof(pubkey)); + secp256k1_pubkey_save(&pubkey, &ge); + VG_CHECK(&pubkey, sizeof(pubkey)); + outl = 65; + VG_UNDEF(pubkeyo, 65); + CHECK(secp256k1_ec_pubkey_serialize(ctx, pubkeyo, &outl, &pubkey, SECP256K1_EC_UNCOMPRESSED) == 1); + VG_CHECK(pubkeyo, outl); + CHECK(outl == 65); + CHECK(pubkeyo[0] == 4); + CHECK(memcmp(&pubkeyo[1], input, 64) == 0); + } + CHECK(ecount == 0); + } else { + /* These cases must fail to parse. */ + memset(&pubkey, 0xfe, sizeof(pubkey)); + ecount = 0; + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, pubkeyclen) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(ecount == 0); + CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); + CHECK(ecount == 1); + } + } + } + secp256k1_context_set_illegal_callback(ctx, NULL, NULL); +} + +void run_ec_pubkey_parse_test(void) { +#define SECP256K1_EC_PARSE_TEST_NVALID (12) + const unsigned char valid[SECP256K1_EC_PARSE_TEST_NVALID][64] = { + { + /* Point with leading and trailing zeros in x and y serialization. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x52, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x64, 0xef, 0xa1, 0x7b, 0x77, 0x61, 0xe1, 0xe4, 0x27, 0x06, 0x98, 0x9f, 0xb4, 0x83, + 0xb8, 0xd2, 0xd4, 0x9b, 0xf7, 0x8f, 0xae, 0x98, 0x03, 0xf0, 0x99, 0xb8, 0x34, 0xed, 0xeb, 0x00 + }, + { + /* Point with x equal to a 3rd root of unity.*/ + 0x7a, 0xe9, 0x6a, 0x2b, 0x65, 0x7c, 0x07, 0x10, 0x6e, 0x64, 0x47, 0x9e, 0xac, 0x34, 0x34, 0xe9, + 0x9c, 0xf0, 0x49, 0x75, 0x12, 0xf5, 0x89, 0x95, 0xc1, 0x39, 0x6c, 0x28, 0x71, 0x95, 0x01, 0xee, + 0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14, + 0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee, + }, + { + /* Point with largest x. (1/2) */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2c, + 0x0e, 0x99, 0x4b, 0x14, 0xea, 0x72, 0xf8, 0xc3, 0xeb, 0x95, 0xc7, 0x1e, 0xf6, 0x92, 0x57, 0x5e, + 0x77, 0x50, 0x58, 0x33, 0x2d, 0x7e, 0x52, 0xd0, 0x99, 0x5c, 0xf8, 0x03, 0x88, 0x71, 0xb6, 0x7d, + }, + { + /* Point with largest x. (2/2) */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2c, + 0xf1, 0x66, 0xb4, 0xeb, 0x15, 0x8d, 0x07, 0x3c, 0x14, 0x6a, 0x38, 0xe1, 0x09, 0x6d, 0xa8, 0xa1, + 0x88, 0xaf, 0xa7, 0xcc, 0xd2, 0x81, 0xad, 0x2f, 0x66, 0xa3, 0x07, 0xfb, 0x77, 0x8e, 0x45, 0xb2, + }, + { + /* Point with smallest x. (1/2) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14, + 0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee, + }, + { + /* Point with smallest x. (2/2) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0xbd, 0xe7, 0x0d, 0xf5, 0x19, 0x39, 0xb9, 0x4c, 0x9c, 0x24, 0x97, 0x9f, 0xa7, 0xdd, 0x04, 0xeb, + 0xd9, 0xb3, 0x57, 0x2d, 0xa7, 0x80, 0x22, 0x90, 0x43, 0x8a, 0xf2, 0xa6, 0x81, 0x89, 0x54, 0x41, + }, + { + /* Point with largest y. (1/3) */ + 0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6, + 0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e, + }, + { + /* Point with largest y. (2/3) */ + 0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c, + 0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e, + }, + { + /* Point with largest y. (3/3) */ + 0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc, + 0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e, + }, + { + /* Point with smallest y. (1/3) */ + 0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6, + 0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + }, + { + /* Point with smallest y. (2/3) */ + 0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c, + 0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + }, + { + /* Point with smallest y. (3/3) */ + 0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc, + 0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 + } + }; +#define SECP256K1_EC_PARSE_TEST_NXVALID (4) + const unsigned char onlyxvalid[SECP256K1_EC_PARSE_TEST_NXVALID][64] = { + { + /* Valid if y overflow ignored (y = 1 mod p). (1/3) */ + 0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6, + 0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30, + }, + { + /* Valid if y overflow ignored (y = 1 mod p). (2/3) */ + 0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c, + 0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30, + }, + { + /* Valid if y overflow ignored (y = 1 mod p). (3/3)*/ + 0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc, + 0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30, + }, + { + /* x on curve, y is from y^2 = x^3 + 8. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03 + } + }; +#define SECP256K1_EC_PARSE_TEST_NINVALID (7) + const unsigned char invalid[SECP256K1_EC_PARSE_TEST_NINVALID][64] = { + { + /* x is third root of -8, y is -1 * (x^3+7); also on the curve for y^2 = x^3 + 9. */ + 0x0a, 0x2d, 0x2b, 0xa9, 0x35, 0x07, 0xf1, 0xdf, 0x23, 0x37, 0x70, 0xc2, 0xa7, 0x97, 0x96, 0x2c, + 0xc6, 0x1f, 0x6d, 0x15, 0xda, 0x14, 0xec, 0xd4, 0x7d, 0x8d, 0x27, 0xae, 0x1c, 0xd5, 0xf8, 0x53, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + }, + { + /* Valid if x overflow ignored (x = 1 mod p). */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30, + 0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14, + 0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee, + }, + { + /* Valid if x overflow ignored (x = 1 mod p). */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30, + 0xbd, 0xe7, 0x0d, 0xf5, 0x19, 0x39, 0xb9, 0x4c, 0x9c, 0x24, 0x97, 0x9f, 0xa7, 0xdd, 0x04, 0xeb, + 0xd9, 0xb3, 0x57, 0x2d, 0xa7, 0x80, 0x22, 0x90, 0x43, 0x8a, 0xf2, 0xa6, 0x81, 0x89, 0x54, 0x41, + }, + { + /* x is -1, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 5. */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e, + 0xf4, 0x84, 0x14, 0x5c, 0xb0, 0x14, 0x9b, 0x82, 0x5d, 0xff, 0x41, 0x2f, 0xa0, 0x52, 0xa8, 0x3f, + 0xcb, 0x72, 0xdb, 0x61, 0xd5, 0x6f, 0x37, 0x70, 0xce, 0x06, 0x6b, 0x73, 0x49, 0xa2, 0xaa, 0x28, + }, + { + /* x is -1, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 5. */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e, + 0x0b, 0x7b, 0xeb, 0xa3, 0x4f, 0xeb, 0x64, 0x7d, 0xa2, 0x00, 0xbe, 0xd0, 0x5f, 0xad, 0x57, 0xc0, + 0x34, 0x8d, 0x24, 0x9e, 0x2a, 0x90, 0xc8, 0x8f, 0x31, 0xf9, 0x94, 0x8b, 0xb6, 0x5d, 0x52, 0x07, + }, + { + /* x is zero, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 7. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8f, 0x53, 0x7e, 0xef, 0xdf, 0xc1, 0x60, 0x6a, 0x07, 0x27, 0xcd, 0x69, 0xb4, 0xa7, 0x33, 0x3d, + 0x38, 0xed, 0x44, 0xe3, 0x93, 0x2a, 0x71, 0x79, 0xee, 0xcb, 0x4b, 0x6f, 0xba, 0x93, 0x60, 0xdc, + }, + { + /* x is zero, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 7. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0xac, 0x81, 0x10, 0x20, 0x3e, 0x9f, 0x95, 0xf8, 0xd8, 0x32, 0x96, 0x4b, 0x58, 0xcc, 0xc2, + 0xc7, 0x12, 0xbb, 0x1c, 0x6c, 0xd5, 0x8e, 0x86, 0x11, 0x34, 0xb4, 0x8f, 0x45, 0x6c, 0x9b, 0x53 + } + }; + const unsigned char pubkeyc[66] = { + /* Serialization of G. */ + 0x04, 0x79, 0xBE, 0x66, 0x7E, 0xF9, 0xDC, 0xBB, 0xAC, 0x55, 0xA0, 0x62, 0x95, 0xCE, 0x87, 0x0B, + 0x07, 0x02, 0x9B, 0xFC, 0xDB, 0x2D, 0xCE, 0x28, 0xD9, 0x59, 0xF2, 0x81, 0x5B, 0x16, 0xF8, 0x17, + 0x98, 0x48, 0x3A, 0xDA, 0x77, 0x26, 0xA3, 0xC4, 0x65, 0x5D, 0xA4, 0xFB, 0xFC, 0x0E, 0x11, 0x08, + 0xA8, 0xFD, 0x17, 0xB4, 0x48, 0xA6, 0x85, 0x54, 0x19, 0x9C, 0x47, 0xD0, 0x8F, 0xFB, 0x10, 0xD4, + 0xB8, 0x00 + }; + unsigned char sout[65]; + unsigned char shortkey[2]; + secp256k1_ge ge; + secp256k1_pubkey pubkey; + size_t len; + int32_t i; + int32_t ecount; + int32_t ecount2; + ecount = 0; + /* Nothing should be reading this far into pubkeyc. */ + VG_UNDEF(&pubkeyc[65], 1); + secp256k1_context_set_illegal_callback(ctx, counting_illegal_callback_fn, &ecount); + /* Zero length claimed, fail, zeroize, no illegal arg error. */ + memset(&pubkey, 0xfe, sizeof(pubkey)); + ecount = 0; + VG_UNDEF(shortkey, 2); + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, shortkey, 0) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(ecount == 0); + CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); + CHECK(ecount == 1); + /* Length one claimed, fail, zeroize, no illegal arg error. */ + for (i = 0; i < 256 ; i++) { + memset(&pubkey, 0xfe, sizeof(pubkey)); + ecount = 0; + shortkey[0] = i; + VG_UNDEF(&shortkey[1], 1); + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, shortkey, 1) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(ecount == 0); + CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); + CHECK(ecount == 1); + } + /* Length two claimed, fail, zeroize, no illegal arg error. */ + for (i = 0; i < 65536 ; i++) { + memset(&pubkey, 0xfe, sizeof(pubkey)); + ecount = 0; + shortkey[0] = i & 255; + shortkey[1] = i >> 8; + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, shortkey, 2) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(ecount == 0); + CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); + CHECK(ecount == 1); + } + memset(&pubkey, 0xfe, sizeof(pubkey)); + ecount = 0; + VG_UNDEF(&pubkey, sizeof(pubkey)); + /* 33 bytes claimed on otherwise valid input starting with 0x04, fail, zeroize output, no illegal arg error. */ + CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, 33) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(ecount == 0); + CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); + CHECK(ecount == 1); + /* NULL pubkey, illegal arg error. Pubkey isn't rewritten before this step, since it's NULL into the parser. */ + CHECK(secp256k1_ec_pubkey_parse(ctx, NULL, pubkeyc, 65) == 0); + CHECK(ecount == 2); + /* NULL input string. Illegal arg and zeroize output. */ + memset(&pubkey, 0xfe, sizeof(pubkey)); + ecount = 0; + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, NULL, 65) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(ecount == 1); + CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); + CHECK(ecount == 2); + /* 64 bytes claimed on input starting with 0x04, fail, zeroize output, no illegal arg error. */ + memset(&pubkey, 0xfe, sizeof(pubkey)); + ecount = 0; + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, 64) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(ecount == 0); + CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); + CHECK(ecount == 1); + /* 66 bytes claimed, fail, zeroize output, no illegal arg error. */ + memset(&pubkey, 0xfe, sizeof(pubkey)); + ecount = 0; + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, 66) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(ecount == 0); + CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); + CHECK(ecount == 1); + /* Valid parse. */ + memset(&pubkey, 0, sizeof(pubkey)); + ecount = 0; + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, 65) == 1); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(ecount == 0); + VG_UNDEF(&ge, sizeof(ge)); + CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 1); + VG_CHECK(&ge.x, sizeof(ge.x)); + VG_CHECK(&ge.y, sizeof(ge.y)); + VG_CHECK(&ge.infinity, sizeof(ge.infinity)); + ge_equals_ge(&secp256k1_ge_const_g, &ge); + CHECK(ecount == 0); + /* secp256k1_ec_pubkey_serialize illegal args. */ + ecount = 0; + len = 65; + CHECK(secp256k1_ec_pubkey_serialize(ctx, NULL, &len, &pubkey, SECP256K1_EC_UNCOMPRESSED) == 0); + CHECK(ecount == 1); + CHECK(len == 0); + CHECK(secp256k1_ec_pubkey_serialize(ctx, sout, NULL, &pubkey, SECP256K1_EC_UNCOMPRESSED) == 0); + CHECK(ecount == 2); + len = 65; + VG_UNDEF(sout, 65); + CHECK(secp256k1_ec_pubkey_serialize(ctx, sout, &len, NULL, SECP256K1_EC_UNCOMPRESSED) == 0); + VG_CHECK(sout, 65); + CHECK(ecount == 3); + CHECK(len == 0); + len = 65; + CHECK(secp256k1_ec_pubkey_serialize(ctx, sout, &len, &pubkey, ~0) == 0); + CHECK(ecount == 4); + CHECK(len == 0); + len = 65; + VG_UNDEF(sout, 65); + CHECK(secp256k1_ec_pubkey_serialize(ctx, sout, &len, &pubkey, SECP256K1_EC_UNCOMPRESSED) == 1); + VG_CHECK(sout, 65); + CHECK(ecount == 4); + CHECK(len == 65); + /* Multiple illegal args. Should still set arg error only once. */ + ecount = 0; + ecount2 = 11; + CHECK(secp256k1_ec_pubkey_parse(ctx, NULL, NULL, 65) == 0); + CHECK(ecount == 1); + /* Does the illegal arg callback actually change the behavior? */ + secp256k1_context_set_illegal_callback(ctx, uncounting_illegal_callback_fn, &ecount2); + CHECK(secp256k1_ec_pubkey_parse(ctx, NULL, NULL, 65) == 0); + CHECK(ecount == 1); + CHECK(ecount2 == 10); + secp256k1_context_set_illegal_callback(ctx, NULL, NULL); + /* Try a bunch of prefabbed points with all possible encodings. */ + for (i = 0; i < SECP256K1_EC_PARSE_TEST_NVALID; i++) { + ec_pubkey_parse_pointtest(valid[i], 1, 1); + } + for (i = 0; i < SECP256K1_EC_PARSE_TEST_NXVALID; i++) { + ec_pubkey_parse_pointtest(onlyxvalid[i], 1, 0); + } + for (i = 0; i < SECP256K1_EC_PARSE_TEST_NINVALID; i++) { + ec_pubkey_parse_pointtest(invalid[i], 0, 0); + } +} + +void run_eckey_edge_case_test(void) { + const unsigned char orderc[32] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, + 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41 + }; + const unsigned char zeros[sizeof(secp256k1_pubkey)] = {0x00}; + unsigned char ctmp[33]; + unsigned char ctmp2[33]; + secp256k1_pubkey pubkey; + secp256k1_pubkey pubkey2; + secp256k1_pubkey pubkey_one; + secp256k1_pubkey pubkey_negone; + const secp256k1_pubkey *pubkeys[3]; + size_t len; + int32_t ecount; + /* Group order is too large, reject. */ + CHECK(secp256k1_ec_seckey_verify(ctx, orderc) == 0); + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, orderc) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); + /* Maximum value is too large, reject. */ + memset(ctmp, 255, 32); + CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 0); + memset(&pubkey, 1, sizeof(pubkey)); + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, ctmp) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); + /* Zero is too small, reject. */ + memset(ctmp, 0, 32); + CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 0); + memset(&pubkey, 1, sizeof(pubkey)); + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, ctmp) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); + /* One must be accepted. */ + ctmp[31] = 0x01; + CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 1); + memset(&pubkey, 0, sizeof(pubkey)); + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, ctmp) == 1); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0); + pubkey_one = pubkey; + /* Group order + 1 is too large, reject. */ + memcpy(ctmp, orderc, 32); + ctmp[31] = 0x42; + CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 0); + memset(&pubkey, 1, sizeof(pubkey)); + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, ctmp) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); + /* -1 must be accepted. */ + ctmp[31] = 0x40; + CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 1); + memset(&pubkey, 0, sizeof(pubkey)); + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, ctmp) == 1); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0); + pubkey_negone = pubkey; + /* Tweak of zero leaves the value changed. */ + memset(ctmp2, 0, 32); + CHECK(secp256k1_ec_privkey_tweak_add(ctx, ctmp, ctmp2) == 1); + CHECK(memcmp(orderc, ctmp, 31) == 0 && ctmp[31] == 0x40); + memcpy(&pubkey2, &pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, ctmp2) == 1); + CHECK(memcmp(&pubkey, &pubkey2, sizeof(pubkey)) == 0); + /* Multiply tweak of zero zeroizes the output. */ + CHECK(secp256k1_ec_privkey_tweak_mul(ctx, ctmp, ctmp2) == 0); + CHECK(memcmp(zeros, ctmp, 32) == 0); + CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, ctmp2) == 0); + CHECK(memcmp(&pubkey, zeros, sizeof(pubkey)) == 0); + memcpy(&pubkey, &pubkey2, sizeof(pubkey)); + /* Overflowing key tweak zeroizes. */ + memcpy(ctmp, orderc, 32); + ctmp[31] = 0x40; + CHECK(secp256k1_ec_privkey_tweak_add(ctx, ctmp, orderc) == 0); + CHECK(memcmp(zeros, ctmp, 32) == 0); + memcpy(ctmp, orderc, 32); + ctmp[31] = 0x40; + CHECK(secp256k1_ec_privkey_tweak_mul(ctx, ctmp, orderc) == 0); + CHECK(memcmp(zeros, ctmp, 32) == 0); + memcpy(ctmp, orderc, 32); + ctmp[31] = 0x40; + CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, orderc) == 0); + CHECK(memcmp(&pubkey, zeros, sizeof(pubkey)) == 0); + memcpy(&pubkey, &pubkey2, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, orderc) == 0); + CHECK(memcmp(&pubkey, zeros, sizeof(pubkey)) == 0); + memcpy(&pubkey, &pubkey2, sizeof(pubkey)); + /* Private key tweaks results in a key of zero. */ + ctmp2[31] = 1; + CHECK(secp256k1_ec_privkey_tweak_add(ctx, ctmp2, ctmp) == 0); + CHECK(memcmp(zeros, ctmp2, 32) == 0); + ctmp2[31] = 1; + CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, ctmp2) == 0); + CHECK(memcmp(&pubkey, zeros, sizeof(pubkey)) == 0); + memcpy(&pubkey, &pubkey2, sizeof(pubkey)); + /* Tweak computation wraps and results in a key of 1. */ + ctmp2[31] = 2; + CHECK(secp256k1_ec_privkey_tweak_add(ctx, ctmp2, ctmp) == 1); + CHECK(memcmp(ctmp2, zeros, 31) == 0 && ctmp2[31] == 1); + ctmp2[31] = 2; + CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, ctmp2) == 1); + ctmp2[31] = 1; + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey2, ctmp2) == 1); + CHECK(memcmp(&pubkey, &pubkey2, sizeof(pubkey)) == 0); + /* Tweak mul * 2 = 1+1. */ + CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, ctmp2) == 1); + ctmp2[31] = 2; + CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey2, ctmp2) == 1); + CHECK(memcmp(&pubkey, &pubkey2, sizeof(pubkey)) == 0); + /* Test argument errors. */ + ecount = 0; + secp256k1_context_set_illegal_callback(ctx, counting_illegal_callback_fn, &ecount); + CHECK(ecount == 0); + /* Zeroize pubkey on parse error. */ + memset(&pubkey, 0, 32); + CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, ctmp2) == 0); + CHECK(ecount == 1); + CHECK(memcmp(&pubkey, zeros, sizeof(pubkey)) == 0); + memcpy(&pubkey, &pubkey2, sizeof(pubkey)); + memset(&pubkey2, 0, 32); + CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey2, ctmp2) == 0); + CHECK(ecount == 2); + CHECK(memcmp(&pubkey2, zeros, sizeof(pubkey2)) == 0); + /* Plain argument errors. */ + ecount = 0; + CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 1); + CHECK(ecount == 0); + CHECK(secp256k1_ec_seckey_verify(ctx, NULL) == 0); + CHECK(ecount == 1); + ecount = 0; + memset(ctmp2, 0, 32); + ctmp2[31] = 4; + CHECK(secp256k1_ec_pubkey_tweak_add(ctx, NULL, ctmp2) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, NULL) == 0); + CHECK(ecount == 2); + ecount = 0; + memset(ctmp2, 0, 32); + ctmp2[31] = 4; + CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, NULL, ctmp2) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, NULL) == 0); + CHECK(ecount == 2); + ecount = 0; + memset(ctmp2, 0, 32); + CHECK(secp256k1_ec_privkey_tweak_add(ctx, NULL, ctmp2) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ec_privkey_tweak_add(ctx, ctmp, NULL) == 0); + CHECK(ecount == 2); + ecount = 0; + memset(ctmp2, 0, 32); + ctmp2[31] = 1; + CHECK(secp256k1_ec_privkey_tweak_mul(ctx, NULL, ctmp2) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ec_privkey_tweak_mul(ctx, ctmp, NULL) == 0); + CHECK(ecount == 2); + ecount = 0; + CHECK(secp256k1_ec_pubkey_create(ctx, NULL, ctmp) == 0); + CHECK(ecount == 1); + memset(&pubkey, 1, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, NULL) == 0); + CHECK(ecount == 2); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); + /* secp256k1_ec_pubkey_combine tests. */ + ecount = 0; + pubkeys[0] = &pubkey_one; + VG_UNDEF(&pubkeys[0], sizeof(secp256k1_pubkey *)); + VG_UNDEF(&pubkeys[1], sizeof(secp256k1_pubkey *)); + VG_UNDEF(&pubkeys[2], sizeof(secp256k1_pubkey *)); + memset(&pubkey, 255, sizeof(secp256k1_pubkey)); + VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, pubkeys, 0) == 0); + VG_CHECK(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ec_pubkey_combine(ctx, NULL, pubkeys, 1) == 0); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); + CHECK(ecount == 2); + memset(&pubkey, 255, sizeof(secp256k1_pubkey)); + VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, NULL, 1) == 0); + VG_CHECK(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); + CHECK(ecount == 3); + pubkeys[0] = &pubkey_negone; + memset(&pubkey, 255, sizeof(secp256k1_pubkey)); + VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, pubkeys, 1) == 1); + VG_CHECK(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0); + CHECK(ecount == 3); + len = 33; + CHECK(secp256k1_ec_pubkey_serialize(ctx, ctmp, &len, &pubkey, SECP256K1_EC_COMPRESSED) == 1); + CHECK(secp256k1_ec_pubkey_serialize(ctx, ctmp2, &len, &pubkey_negone, SECP256K1_EC_COMPRESSED) == 1); + CHECK(memcmp(ctmp, ctmp2, 33) == 0); + /* Result is infinity. */ + pubkeys[0] = &pubkey_one; + pubkeys[1] = &pubkey_negone; + memset(&pubkey, 255, sizeof(secp256k1_pubkey)); + VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, pubkeys, 2) == 0); + VG_CHECK(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); + CHECK(ecount == 3); + /* Passes through infinity but comes out one. */ + pubkeys[2] = &pubkey_one; + memset(&pubkey, 255, sizeof(secp256k1_pubkey)); + VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, pubkeys, 3) == 1); + VG_CHECK(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0); + CHECK(ecount == 3); + len = 33; + CHECK(secp256k1_ec_pubkey_serialize(ctx, ctmp, &len, &pubkey, SECP256K1_EC_COMPRESSED) == 1); + CHECK(secp256k1_ec_pubkey_serialize(ctx, ctmp2, &len, &pubkey_one, SECP256K1_EC_COMPRESSED) == 1); + CHECK(memcmp(ctmp, ctmp2, 33) == 0); + /* Adds to two. */ + pubkeys[1] = &pubkey_one; + memset(&pubkey, 255, sizeof(secp256k1_pubkey)); + VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, pubkeys, 2) == 1); + VG_CHECK(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0); + CHECK(ecount == 3); + secp256k1_context_set_illegal_callback(ctx, NULL, NULL); +} + +void random_sign(secp256k1_scalar *sigr, secp256k1_scalar *sigs, const secp256k1_scalar *key, const secp256k1_scalar *msg, int *recid) { + secp256k1_scalar nonce; do { random_scalar_order_test(&nonce); - } while(!secp256k1_ecdsa_sig_sign(&ctx->ecmult_gen_ctx, sig, key, msg, &nonce, recid)); + } while(!secp256k1_ecdsa_sig_sign(&ctx->ecmult_gen_ctx, sigr, sigs, key, msg, &nonce, recid)); } void test_ecdsa_sign_verify(void) { - secp256k1_gej_t pubj; - secp256k1_ge_t pub; - secp256k1_scalar_t one; - secp256k1_scalar_t msg, key; - secp256k1_ecdsa_sig_t sig; + secp256k1_gej pubj; + secp256k1_ge pub; + secp256k1_scalar one; + secp256k1_scalar msg, key; + secp256k1_scalar sigr, sigs; int recid; int getrec; random_scalar_order_test(&msg); random_scalar_order_test(&key); secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pubj, &key); secp256k1_ge_set_gej(&pub, &pubj); - getrec = secp256k1_rand32()&1; - random_sign(&sig, &key, &msg, getrec?&recid:NULL); + getrec = secp256k1_rand_bits(1); + random_sign(&sigr, &sigs, &key, &msg, getrec?&recid:NULL); if (getrec) { CHECK(recid >= 0 && recid < 4); } - CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sig, &pub, &msg)); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sigr, &sigs, &pub, &msg)); secp256k1_scalar_set_int(&one, 1); secp256k1_scalar_add(&msg, &msg, &one); - CHECK(!secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sig, &pub, &msg)); + CHECK(!secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sigr, &sigs, &pub, &msg)); } void run_ecdsa_sign_verify(void) { @@ -1357,22 +3385,23 @@ void run_ecdsa_sign_verify(void) { } /** Dummy nonce generation function that just uses a precomputed nonce, and fails if it is not accepted. Use only for testing. */ -static int precomputed_nonce_function(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, unsigned int counter, const void *data) { +static int precomputed_nonce_function(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter) { (void)msg32; (void)key32; + (void)algo16; memcpy(nonce32, data, 32); return (counter == 0); } -static int nonce_function_test_fail(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, unsigned int counter, const void *data) { +static int nonce_function_test_fail(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter) { /* Dummy nonce generator that has a fatal error on the first counter value. */ if (counter == 0) { return 0; } - return nonce_function_rfc6979(nonce32, msg32, key32, counter - 1, data); + return nonce_function_rfc6979(nonce32, msg32, key32, algo16, data, counter - 1); } -static int nonce_function_test_retry(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, unsigned int counter, const void *data) { +static int nonce_function_test_retry(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter) { /* Dummy nonce generator that produces unacceptable nonces for the first several counter values. */ if (counter < 3) { memset(nonce32, counter==0 ? 0 : 255, 32); @@ -1394,17 +3423,17 @@ static int nonce_function_test_retry(unsigned char *nonce32, const unsigned char } return 1; } - /* Retry rate of 6979 is negligible esp. as we only call this in determinstic tests. */ + /* Retry rate of 6979 is negligible esp. as we only call this in deterministic tests. */ /* If someone does fine a case where it retries for secp256k1, we'd like to know. */ if (counter > 5) { return 0; } - return nonce_function_rfc6979(nonce32, msg32, key32, counter - 5, data); + return nonce_function_rfc6979(nonce32, msg32, key32, algo16, data, counter - 5); } -int is_empty_compact_signature(const unsigned char *sig64) { - static const unsigned char res[64] = {0}; - return memcmp(sig64, res, 64) == 0; +int is_empty_signature(const secp256k1_ecdsa_signature *sig) { + static const unsigned char res[sizeof(secp256k1_ecdsa_signature)] = {0}; + return memcmp(sig, res, sizeof(secp256k1_ecdsa_signature)) == 0; } void test_ecdsa_end_to_end(void) { @@ -1412,26 +3441,20 @@ void test_ecdsa_end_to_end(void) { unsigned char privkey[32]; unsigned char message[32]; unsigned char privkey2[32]; - unsigned char csignature[64]; - unsigned char signature[72]; - unsigned char signature2[72]; - unsigned char signature3[72]; - unsigned char signature4[72]; - unsigned char pubkey[65]; - unsigned char recpubkey[65]; + secp256k1_ecdsa_signature signature[6]; + secp256k1_scalar r, s; + unsigned char sig[74]; + size_t siglen = 74; + unsigned char pubkeyc[65]; + size_t pubkeyclen = 65; + secp256k1_pubkey pubkey; + secp256k1_pubkey pubkey_tmp; unsigned char seckey[300]; - int signaturelen = 72; - int signaturelen2 = 72; - int signaturelen3 = 72; - int signaturelen4 = 72; - int recid = 0; - int recpubkeylen = 0; - int pubkeylen = 65; - int seckeylen = 300; + size_t seckeylen = 300; /* Generate a random key and message. */ { - secp256k1_scalar_t msg, key; + secp256k1_scalar msg, key; random_scalar_order_test(&msg); random_scalar_order_test(&key); secp256k1_scalar_get_b32(privkey, &key); @@ -1440,117 +3463,127 @@ void test_ecdsa_end_to_end(void) { /* Construct and verify corresponding public key. */ CHECK(secp256k1_ec_seckey_verify(ctx, privkey) == 1); - CHECK(secp256k1_ec_pubkey_create(ctx, pubkey, &pubkeylen, privkey, (secp256k1_rand32() & 3) != 0) == 1); - if (secp256k1_rand32() & 1) { - CHECK(secp256k1_ec_pubkey_decompress(ctx, pubkey, &pubkeylen)); - } - CHECK(secp256k1_ec_pubkey_verify(ctx, pubkey, pubkeylen)); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, privkey) == 1); + + /* Verify exporting and importing public key. */ + CHECK(secp256k1_ec_pubkey_serialize(ctx, pubkeyc, &pubkeyclen, &pubkey, secp256k1_rand_bits(1) == 1 ? SECP256K1_EC_COMPRESSED : SECP256K1_EC_UNCOMPRESSED)); + memset(&pubkey, 0, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, pubkeyclen) == 1); + + /* Verify negation changes the key and changes it back */ + memcpy(&pubkey_tmp, &pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_negate(ctx, &pubkey_tmp) == 1); + CHECK(memcmp(&pubkey_tmp, &pubkey, sizeof(pubkey)) != 0); + CHECK(secp256k1_ec_pubkey_negate(ctx, &pubkey_tmp) == 1); + CHECK(memcmp(&pubkey_tmp, &pubkey, sizeof(pubkey)) == 0); /* Verify private key import and export. */ - CHECK(secp256k1_ec_privkey_export(ctx, privkey, seckey, &seckeylen, secp256k1_rand32() % 2) == 1); - CHECK(secp256k1_ec_privkey_import(ctx, privkey2, seckey, seckeylen) == 1); + CHECK(ec_privkey_export_der(ctx, seckey, &seckeylen, privkey, secp256k1_rand_bits(1) == 1)); + CHECK(ec_privkey_import_der(ctx, privkey2, seckey, seckeylen) == 1); CHECK(memcmp(privkey, privkey2, 32) == 0); /* Optionally tweak the keys using addition. */ - if (secp256k1_rand32() % 3 == 0) { + if (secp256k1_rand_int(3) == 0) { int ret1; int ret2; unsigned char rnd[32]; - unsigned char pubkey2[65]; - int pubkeylen2 = 65; + secp256k1_pubkey pubkey2; secp256k1_rand256_test(rnd); ret1 = secp256k1_ec_privkey_tweak_add(ctx, privkey, rnd); - ret2 = secp256k1_ec_pubkey_tweak_add(ctx, pubkey, pubkeylen, rnd); + ret2 = secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, rnd); CHECK(ret1 == ret2); if (ret1 == 0) { return; } - CHECK(secp256k1_ec_pubkey_create(ctx, pubkey2, &pubkeylen2, privkey, pubkeylen == 33) == 1); - CHECK(memcmp(pubkey, pubkey2, pubkeylen) == 0); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey2, privkey) == 1); + CHECK(memcmp(&pubkey, &pubkey2, sizeof(pubkey)) == 0); } /* Optionally tweak the keys using multiplication. */ - if (secp256k1_rand32() % 3 == 0) { + if (secp256k1_rand_int(3) == 0) { int ret1; int ret2; unsigned char rnd[32]; - unsigned char pubkey2[65]; - int pubkeylen2 = 65; + secp256k1_pubkey pubkey2; secp256k1_rand256_test(rnd); ret1 = secp256k1_ec_privkey_tweak_mul(ctx, privkey, rnd); - ret2 = secp256k1_ec_pubkey_tweak_mul(ctx, pubkey, pubkeylen, rnd); + ret2 = secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, rnd); CHECK(ret1 == ret2); if (ret1 == 0) { return; } - CHECK(secp256k1_ec_pubkey_create(ctx, pubkey2, &pubkeylen2, privkey, pubkeylen == 33) == 1); - CHECK(memcmp(pubkey, pubkey2, pubkeylen) == 0); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey2, privkey) == 1); + CHECK(memcmp(&pubkey, &pubkey2, sizeof(pubkey)) == 0); } /* Sign. */ - CHECK(secp256k1_ecdsa_sign(ctx, message, signature, &signaturelen, privkey, NULL, NULL) == 1); - CHECK(signaturelen > 0); - CHECK(secp256k1_ecdsa_sign(ctx, message, signature2, &signaturelen2, privkey, NULL, extra) == 1); - CHECK(signaturelen2 > 0); + CHECK(secp256k1_ecdsa_sign(ctx, &signature[0], message, privkey, NULL, NULL) == 1); + CHECK(secp256k1_ecdsa_sign(ctx, &signature[4], message, privkey, NULL, NULL) == 1); + CHECK(secp256k1_ecdsa_sign(ctx, &signature[1], message, privkey, NULL, extra) == 1); extra[31] = 1; - CHECK(secp256k1_ecdsa_sign(ctx, message, signature3, &signaturelen3, privkey, NULL, extra) == 1); - CHECK(signaturelen3 > 0); + CHECK(secp256k1_ecdsa_sign(ctx, &signature[2], message, privkey, NULL, extra) == 1); extra[31] = 0; extra[0] = 1; - CHECK(secp256k1_ecdsa_sign(ctx, message, signature4, &signaturelen4, privkey, NULL, extra) == 1); - CHECK(signaturelen3 > 0); - CHECK((signaturelen != signaturelen2) || (memcmp(signature, signature2, signaturelen) != 0)); - CHECK((signaturelen != signaturelen3) || (memcmp(signature, signature3, signaturelen) != 0)); - CHECK((signaturelen3 != signaturelen2) || (memcmp(signature3, signature2, signaturelen3) != 0)); - CHECK((signaturelen4 != signaturelen3) || (memcmp(signature4, signature3, signaturelen4) != 0)); - CHECK((signaturelen4 != signaturelen2) || (memcmp(signature4, signature2, signaturelen4) != 0)); - CHECK((signaturelen4 != signaturelen) || (memcmp(signature4, signature, signaturelen4) != 0)); + CHECK(secp256k1_ecdsa_sign(ctx, &signature[3], message, privkey, NULL, extra) == 1); + CHECK(memcmp(&signature[0], &signature[4], sizeof(signature[0])) == 0); + CHECK(memcmp(&signature[0], &signature[1], sizeof(signature[0])) != 0); + CHECK(memcmp(&signature[0], &signature[2], sizeof(signature[0])) != 0); + CHECK(memcmp(&signature[0], &signature[3], sizeof(signature[0])) != 0); + CHECK(memcmp(&signature[1], &signature[2], sizeof(signature[0])) != 0); + CHECK(memcmp(&signature[1], &signature[3], sizeof(signature[0])) != 0); + CHECK(memcmp(&signature[2], &signature[3], sizeof(signature[0])) != 0); /* Verify. */ - CHECK(secp256k1_ecdsa_verify(ctx, message, signature, signaturelen, pubkey, pubkeylen) == 1); - CHECK(secp256k1_ecdsa_verify(ctx, message, signature2, signaturelen2, pubkey, pubkeylen) == 1); - CHECK(secp256k1_ecdsa_verify(ctx, message, signature3, signaturelen3, pubkey, pubkeylen) == 1); - CHECK(secp256k1_ecdsa_verify(ctx, message, signature4, signaturelen4, pubkey, pubkeylen) == 1); - /* Destroy signature and verify again. */ - signature[signaturelen - 1 - secp256k1_rand32() % 20] += 1 + (secp256k1_rand32() % 255); - CHECK(secp256k1_ecdsa_verify(ctx, message, signature, signaturelen, pubkey, pubkeylen) != 1); - - /* Compact sign. */ - CHECK(secp256k1_ecdsa_sign_compact(ctx, message, csignature, privkey, NULL, NULL, &recid) == 1); - CHECK(!is_empty_compact_signature(csignature)); - /* Recover. */ - CHECK(secp256k1_ecdsa_recover_compact(ctx, message, csignature, recpubkey, &recpubkeylen, pubkeylen == 33, recid) == 1); - CHECK(recpubkeylen == pubkeylen); - CHECK(memcmp(pubkey, recpubkey, pubkeylen) == 0); - /* Destroy signature and verify again. */ - csignature[secp256k1_rand32() % 64] += 1 + (secp256k1_rand32() % 255); - CHECK(secp256k1_ecdsa_recover_compact(ctx, message, csignature, recpubkey, &recpubkeylen, pubkeylen == 33, recid) != 1 || - memcmp(pubkey, recpubkey, pubkeylen) != 0); - CHECK(recpubkeylen == pubkeylen); + CHECK(secp256k1_ecdsa_verify(ctx, &signature[0], message, &pubkey) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &signature[1], message, &pubkey) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &signature[2], message, &pubkey) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &signature[3], message, &pubkey) == 1); + /* Test lower-S form, malleate, verify and fail, test again, malleate again */ + CHECK(!secp256k1_ecdsa_signature_normalize(ctx, NULL, &signature[0])); + secp256k1_ecdsa_signature_load(ctx, &r, &s, &signature[0]); + secp256k1_scalar_negate(&s, &s); + secp256k1_ecdsa_signature_save(&signature[5], &r, &s); + CHECK(secp256k1_ecdsa_verify(ctx, &signature[5], message, &pubkey) == 0); + CHECK(secp256k1_ecdsa_signature_normalize(ctx, NULL, &signature[5])); + CHECK(secp256k1_ecdsa_signature_normalize(ctx, &signature[5], &signature[5])); + CHECK(!secp256k1_ecdsa_signature_normalize(ctx, NULL, &signature[5])); + CHECK(!secp256k1_ecdsa_signature_normalize(ctx, &signature[5], &signature[5])); + CHECK(secp256k1_ecdsa_verify(ctx, &signature[5], message, &pubkey) == 1); + secp256k1_scalar_negate(&s, &s); + secp256k1_ecdsa_signature_save(&signature[5], &r, &s); + CHECK(!secp256k1_ecdsa_signature_normalize(ctx, NULL, &signature[5])); + CHECK(secp256k1_ecdsa_verify(ctx, &signature[5], message, &pubkey) == 1); + CHECK(memcmp(&signature[5], &signature[0], 64) == 0); + /* Serialize/parse DER and verify again */ + CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, sig, &siglen, &signature[0]) == 1); + memset(&signature[0], 0, sizeof(signature[0])); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &signature[0], sig, siglen) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &signature[0], message, &pubkey) == 1); + /* Serialize/destroy/parse DER and verify again. */ + siglen = 74; + CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, sig, &siglen, &signature[0]) == 1); + sig[secp256k1_rand_int(siglen)] += 1 + secp256k1_rand_int(255); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &signature[0], sig, siglen) == 0 || + secp256k1_ecdsa_verify(ctx, &signature[0], message, &pubkey) == 0); } void test_random_pubkeys(void) { - secp256k1_ge_t elem; - secp256k1_ge_t elem2; + secp256k1_ge elem; + secp256k1_ge elem2; unsigned char in[65]; /* Generate some randomly sized pubkeys. */ - uint32_t r = secp256k1_rand32(); - int len = (r & 3) == 0 ? 65 : 33; - r>>=2; - if ((r & 3) == 0) { - len = (r & 252) >> 3; + size_t len = secp256k1_rand_bits(2) == 0 ? 65 : 33; + if (secp256k1_rand_bits(2) == 0) { + len = secp256k1_rand_bits(6); } - r>>=8; if (len == 65) { - in[0] = (r & 2) ? 4 : (r & 1? 6 : 7); + in[0] = secp256k1_rand_bits(1) ? 4 : (secp256k1_rand_bits(1) ? 6 : 7); } else { - in[0] = (r & 1) ? 2 : 3; + in[0] = secp256k1_rand_bits(1) ? 2 : 3; } - r>>=2; - if ((r & 7) == 0) { - in[0] = (r & 2040) >> 3; + if (secp256k1_rand_bits(3) == 0) { + in[0] = secp256k1_rand_bits(8); } - r>>=11; if (len > 1) { secp256k1_rand256(&in[1]); } @@ -1561,7 +3594,7 @@ void test_random_pubkeys(void) { unsigned char out[65]; unsigned char firstb; int res; - int size = len; + size_t size = len; firstb = in[0]; /* If the pubkey can be parsed, it should round-trip... */ CHECK(secp256k1_eckey_pubkey_serialize(&elem, out, &size, len == 33)); @@ -1577,7 +3610,7 @@ void test_random_pubkeys(void) { CHECK(secp256k1_eckey_pubkey_parse(&elem2, in, size)); ge_equals_ge(&elem,&elem2); /* Check that the X9.62 hybrid type is checked. */ - in[0] = (r & 1) ? 6 : 7; + in[0] = secp256k1_rand_bits(1) ? 6 : 7; res = secp256k1_eckey_pubkey_parse(&elem2, in, size); if (firstb == 2 || firstb == 3) { if (in[0] == firstb + 4) { @@ -1608,185 +3641,508 @@ void run_ecdsa_end_to_end(void) { } } -/* Tests several edge cases. */ -void test_ecdsa_edge_cases(void) { - const unsigned char msg32[32] = { - 'T', 'h', 'i', 's', ' ', 'i', 's', ' ', - 'a', ' ', 'v', 'e', 'r', 'y', ' ', 's', - 'e', 'c', 'r', 'e', 't', ' ', 'm', 'e', - 's', 's', 'a', 'g', 'e', '.', '.', '.' +int test_ecdsa_der_parse(const unsigned char *sig, size_t siglen, int certainly_der, int certainly_not_der) { + static const unsigned char zeroes[32] = {0}; +#ifdef ENABLE_OPENSSL_TESTS + static const unsigned char max_scalar[32] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, + 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40 }; - const unsigned char sig64[64] = { - /* Generated by signing the above message with nonce 'This is the nonce we will use...' - * and secret key 0 (which is not valid), resulting in recid 0. */ - 0x67, 0xCB, 0x28, 0x5F, 0x9C, 0xD1, 0x94, 0xE8, - 0x40, 0xD6, 0x29, 0x39, 0x7A, 0xF5, 0x56, 0x96, - 0x62, 0xFD, 0xE4, 0x46, 0x49, 0x99, 0x59, 0x63, - 0x17, 0x9A, 0x7D, 0xD1, 0x7B, 0xD2, 0x35, 0x32, - 0x4B, 0x1B, 0x7D, 0xF3, 0x4C, 0xE1, 0xF6, 0x8E, - 0x69, 0x4F, 0xF6, 0xF1, 0x1A, 0xC7, 0x51, 0xDD, - 0x7D, 0xD7, 0x3E, 0x38, 0x7E, 0xE4, 0xFC, 0x86, - 0x6E, 0x1B, 0xE8, 0xEC, 0xC7, 0xDD, 0x95, 0x57 - }; - unsigned char pubkey[65]; - int t; - int pubkeylen = 65; - /* signature (r,s) = (4,4), which can be recovered with all 4 recids. */ - const unsigned char sigb64[64] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, - }; - unsigned char pubkeyb[33]; - int pubkeyblen = 33; - int recid; +#endif - CHECK(!secp256k1_ecdsa_recover_compact(ctx, msg32, sig64, pubkey, &pubkeylen, 0, 0)); - CHECK(secp256k1_ecdsa_recover_compact(ctx, msg32, sig64, pubkey, &pubkeylen, 0, 1)); - CHECK(!secp256k1_ecdsa_recover_compact(ctx, msg32, sig64, pubkey, &pubkeylen, 0, 2)); - CHECK(!secp256k1_ecdsa_recover_compact(ctx, msg32, sig64, pubkey, &pubkeylen, 0, 3)); + int ret = 0; - for (recid = 0; recid < 4; recid++) { - int i; - int recid2; - /* (4,4) encoded in DER. */ - unsigned char sigbder[8] = {0x30, 0x06, 0x02, 0x01, 0x04, 0x02, 0x01, 0x04}; - unsigned char sigcder_zr[7] = {0x30, 0x05, 0x02, 0x00, 0x02, 0x01, 0x01}; - unsigned char sigcder_zs[7] = {0x30, 0x05, 0x02, 0x01, 0x01, 0x02, 0x00}; - unsigned char sigbderalt1[39] = { - 0x30, 0x25, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0x04, - }; - unsigned char sigbderalt2[39] = { - 0x30, 0x25, 0x02, 0x01, 0x04, 0x02, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, - }; - unsigned char sigbderalt3[40] = { - 0x30, 0x26, 0x02, 0x21, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0x04, - }; - unsigned char sigbderalt4[40] = { - 0x30, 0x26, 0x02, 0x01, 0x04, 0x02, 0x21, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, - }; - /* (order + r,4) encoded in DER. */ - unsigned char sigbderlong[40] = { - 0x30, 0x26, 0x02, 0x21, 0x00, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xBA, 0xAE, 0xDC, - 0xE6, 0xAF, 0x48, 0xA0, 0x3B, 0xBF, 0xD2, 0x5E, - 0x8C, 0xD0, 0x36, 0x41, 0x45, 0x02, 0x01, 0x04 - }; - CHECK(secp256k1_ecdsa_recover_compact(ctx, msg32, sigb64, pubkeyb, &pubkeyblen, 1, recid)); - CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbder, sizeof(sigbder), pubkeyb, pubkeyblen) == 1); - for (recid2 = 0; recid2 < 4; recid2++) { - unsigned char pubkey2b[33]; - int pubkey2blen = 33; - CHECK(secp256k1_ecdsa_recover_compact(ctx, msg32, sigb64, pubkey2b, &pubkey2blen, 1, recid2)); - /* Verifying with (order + r,4) should always fail. */ - CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbderlong, sizeof(sigbderlong), pubkey2b, pubkey2blen) != 1); + secp256k1_ecdsa_signature sig_der; + unsigned char roundtrip_der[2048]; + unsigned char compact_der[64]; + size_t len_der = 2048; + int parsed_der = 0, valid_der = 0, roundtrips_der = 0; + + secp256k1_ecdsa_signature sig_der_lax; + unsigned char roundtrip_der_lax[2048]; + unsigned char compact_der_lax[64]; + size_t len_der_lax = 2048; + int parsed_der_lax = 0, valid_der_lax = 0, roundtrips_der_lax = 0; + +#ifdef ENABLE_OPENSSL_TESTS + ECDSA_SIG *sig_openssl; + const unsigned char *sigptr; + unsigned char roundtrip_openssl[2048]; + int len_openssl = 2048; + int parsed_openssl, valid_openssl = 0, roundtrips_openssl = 0; +#endif + + parsed_der = secp256k1_ecdsa_signature_parse_der(ctx, &sig_der, sig, siglen); + if (parsed_der) { + ret |= (!secp256k1_ecdsa_signature_serialize_compact(ctx, compact_der, &sig_der)) << 0; + valid_der = (memcmp(compact_der, zeroes, 32) != 0) && (memcmp(compact_der + 32, zeroes, 32) != 0); + } + if (valid_der) { + ret |= (!secp256k1_ecdsa_signature_serialize_der(ctx, roundtrip_der, &len_der, &sig_der)) << 1; + roundtrips_der = (len_der == siglen) && memcmp(roundtrip_der, sig, siglen) == 0; + } + + parsed_der_lax = ecdsa_signature_parse_der_lax(ctx, &sig_der_lax, sig, siglen); + if (parsed_der_lax) { + ret |= (!secp256k1_ecdsa_signature_serialize_compact(ctx, compact_der_lax, &sig_der_lax)) << 10; + valid_der_lax = (memcmp(compact_der_lax, zeroes, 32) != 0) && (memcmp(compact_der_lax + 32, zeroes, 32) != 0); + } + if (valid_der_lax) { + ret |= (!secp256k1_ecdsa_signature_serialize_der(ctx, roundtrip_der_lax, &len_der_lax, &sig_der_lax)) << 11; + roundtrips_der_lax = (len_der_lax == siglen) && memcmp(roundtrip_der_lax, sig, siglen) == 0; + } + + if (certainly_der) { + ret |= (!parsed_der) << 2; + } + if (certainly_not_der) { + ret |= (parsed_der) << 17; + } + if (valid_der) { + ret |= (!roundtrips_der) << 3; + } + + if (valid_der) { + ret |= (!roundtrips_der_lax) << 12; + ret |= (len_der != len_der_lax) << 13; + ret |= (memcmp(roundtrip_der_lax, roundtrip_der, len_der) != 0) << 14; + } + ret |= (roundtrips_der != roundtrips_der_lax) << 15; + if (parsed_der) { + ret |= (!parsed_der_lax) << 16; + } + +#ifdef ENABLE_OPENSSL_TESTS + sig_openssl = ECDSA_SIG_new(); + sigptr = sig; + parsed_openssl = (d2i_ECDSA_SIG(&sig_openssl, &sigptr, siglen) != NULL); + if (parsed_openssl) { + valid_openssl = !BN_is_negative(sig_openssl->r) && !BN_is_negative(sig_openssl->s) && BN_num_bits(sig_openssl->r) > 0 && BN_num_bits(sig_openssl->r) <= 256 && BN_num_bits(sig_openssl->s) > 0 && BN_num_bits(sig_openssl->s) <= 256; + if (valid_openssl) { + unsigned char tmp[32] = {0}; + BN_bn2bin(sig_openssl->r, tmp + 32 - BN_num_bytes(sig_openssl->r)); + valid_openssl = memcmp(tmp, max_scalar, 32) < 0; } - /* DER parsing tests. */ - /* Zero length r/s. */ - CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigcder_zr, sizeof(sigcder_zr), pubkeyb, pubkeyblen) == -2); - CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigcder_zs, sizeof(sigcder_zs), pubkeyb, pubkeyblen) == -2); - /* Leading zeros. */ - CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbderalt1, sizeof(sigbderalt1), pubkeyb, pubkeyblen) == 1); - CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbderalt2, sizeof(sigbderalt2), pubkeyb, pubkeyblen) == 1); - CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbderalt3, sizeof(sigbderalt3), pubkeyb, pubkeyblen) == 1); - CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbderalt4, sizeof(sigbderalt4), pubkeyb, pubkeyblen) == 1); - sigbderalt3[4] = 1; - CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbderalt3, sizeof(sigbderalt3), pubkeyb, pubkeyblen) == -2); - sigbderalt4[7] = 1; - CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbderalt4, sizeof(sigbderalt4), pubkeyb, pubkeyblen) == -2); - /* Damage signature. */ - sigbder[7]++; - CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbder, sizeof(sigbder), pubkeyb, pubkeyblen) == 0); - sigbder[7]--; - CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbder, 6, pubkeyb, pubkeyblen) == -2); - CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbder, sizeof(sigbder)-1, pubkeyb, pubkeyblen) == -2); - for(i = 0; i < 8; i++) { - int c; - unsigned char orig = sigbder[i]; - /*Try every single-byte change.*/ - for (c = 0; c < 256; c++) { - if (c == orig ) { - continue; - } - sigbder[i] = c; - CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbder, sizeof(sigbder), pubkeyb, pubkeyblen) == - (i==4 || i==7) ? 0 : -2 ); - } - sigbder[i] = orig; + if (valid_openssl) { + unsigned char tmp[32] = {0}; + BN_bn2bin(sig_openssl->s, tmp + 32 - BN_num_bytes(sig_openssl->s)); + valid_openssl = memcmp(tmp, max_scalar, 32) < 0; } } + len_openssl = i2d_ECDSA_SIG(sig_openssl, NULL); + if (len_openssl <= 2048) { + unsigned char *ptr = roundtrip_openssl; + CHECK(i2d_ECDSA_SIG(sig_openssl, &ptr) == len_openssl); + roundtrips_openssl = valid_openssl && ((size_t)len_openssl == siglen) && (memcmp(roundtrip_openssl, sig, siglen) == 0); + } else { + len_openssl = 0; + } + ECDSA_SIG_free(sig_openssl); + + ret |= (parsed_der && !parsed_openssl) << 4; + ret |= (valid_der && !valid_openssl) << 5; + ret |= (roundtrips_openssl && !parsed_der) << 6; + ret |= (roundtrips_der != roundtrips_openssl) << 7; + if (roundtrips_openssl) { + ret |= (len_der != (size_t)len_openssl) << 8; + ret |= (memcmp(roundtrip_der, roundtrip_openssl, len_der) != 0) << 9; + } +#endif + return ret; +} + +static void assign_big_endian(unsigned char *ptr, size_t ptrlen, uint32_t val) { + size_t i; + for (i = 0; i < ptrlen; i++) { + int shift = ptrlen - 1 - i; + if (shift >= 4) { + ptr[i] = 0; + } else { + ptr[i] = (val >> shift) & 0xFF; + } + } +} + +static void damage_array(unsigned char *sig, size_t *len) { + int pos; + int action = secp256k1_rand_bits(3); + if (action < 1 && *len > 3) { + /* Delete a byte. */ + pos = secp256k1_rand_int(*len); + memmove(sig + pos, sig + pos + 1, *len - pos - 1); + (*len)--; + return; + } else if (action < 2 && *len < 2048) { + /* Insert a byte. */ + pos = secp256k1_rand_int(1 + *len); + memmove(sig + pos + 1, sig + pos, *len - pos); + sig[pos] = secp256k1_rand_bits(8); + (*len)++; + return; + } else if (action < 4) { + /* Modify a byte. */ + sig[secp256k1_rand_int(*len)] += 1 + secp256k1_rand_int(255); + return; + } else { /* action < 8 */ + /* Modify a bit. */ + sig[secp256k1_rand_int(*len)] ^= 1 << secp256k1_rand_bits(3); + return; + } +} + +static void random_ber_signature(unsigned char *sig, size_t *len, int* certainly_der, int* certainly_not_der) { + int der; + int nlow[2], nlen[2], nlenlen[2], nhbit[2], nhbyte[2], nzlen[2]; + size_t tlen, elen, glen; + int indet; + int n; + + *len = 0; + der = secp256k1_rand_bits(2) == 0; + *certainly_der = der; + *certainly_not_der = 0; + indet = der ? 0 : secp256k1_rand_int(10) == 0; + + for (n = 0; n < 2; n++) { + /* We generate two classes of numbers: nlow==1 "low" ones (up to 32 bytes), nlow==0 "high" ones (32 bytes with 129 top bits set, or larger than 32 bytes) */ + nlow[n] = der ? 1 : (secp256k1_rand_bits(3) != 0); + /* The length of the number in bytes (the first byte of which will always be nonzero) */ + nlen[n] = nlow[n] ? secp256k1_rand_int(33) : 32 + secp256k1_rand_int(200) * secp256k1_rand_int(8) / 8; + CHECK(nlen[n] <= 232); + /* The top bit of the number. */ + nhbit[n] = (nlow[n] == 0 && nlen[n] == 32) ? 1 : (nlen[n] == 0 ? 0 : secp256k1_rand_bits(1)); + /* The top byte of the number (after the potential hardcoded 16 0xFF characters for "high" 32 bytes numbers) */ + nhbyte[n] = nlen[n] == 0 ? 0 : (nhbit[n] ? 128 + secp256k1_rand_bits(7) : 1 + secp256k1_rand_int(127)); + /* The number of zero bytes in front of the number (which is 0 or 1 in case of DER, otherwise we extend up to 300 bytes) */ + nzlen[n] = der ? ((nlen[n] == 0 || nhbit[n]) ? 1 : 0) : (nlow[n] ? secp256k1_rand_int(3) : secp256k1_rand_int(300 - nlen[n]) * secp256k1_rand_int(8) / 8); + if (nzlen[n] > ((nlen[n] == 0 || nhbit[n]) ? 1 : 0)) { + *certainly_not_der = 1; + } + CHECK(nlen[n] + nzlen[n] <= 300); + /* The length of the length descriptor for the number. 0 means short encoding, anything else is long encoding. */ + nlenlen[n] = nlen[n] + nzlen[n] < 128 ? 0 : (nlen[n] + nzlen[n] < 256 ? 1 : 2); + if (!der) { + /* nlenlen[n] max 127 bytes */ + int add = secp256k1_rand_int(127 - nlenlen[n]) * secp256k1_rand_int(16) * secp256k1_rand_int(16) / 256; + nlenlen[n] += add; + if (add != 0) { + *certainly_not_der = 1; + } + } + CHECK(nlen[n] + nzlen[n] + nlenlen[n] <= 427); + } + + /* The total length of the data to go, so far */ + tlen = 2 + nlenlen[0] + nlen[0] + nzlen[0] + 2 + nlenlen[1] + nlen[1] + nzlen[1]; + CHECK(tlen <= 856); + + /* The length of the garbage inside the tuple. */ + elen = (der || indet) ? 0 : secp256k1_rand_int(980 - tlen) * secp256k1_rand_int(8) / 8; + if (elen != 0) { + *certainly_not_der = 1; + } + tlen += elen; + CHECK(tlen <= 980); + + /* The length of the garbage after the end of the tuple. */ + glen = der ? 0 : secp256k1_rand_int(990 - tlen) * secp256k1_rand_int(8) / 8; + if (glen != 0) { + *certainly_not_der = 1; + } + CHECK(tlen + glen <= 990); + + /* Write the tuple header. */ + sig[(*len)++] = 0x30; + if (indet) { + /* Indeterminate length */ + sig[(*len)++] = 0x80; + *certainly_not_der = 1; + } else { + int tlenlen = tlen < 128 ? 0 : (tlen < 256 ? 1 : 2); + if (!der) { + int add = secp256k1_rand_int(127 - tlenlen) * secp256k1_rand_int(16) * secp256k1_rand_int(16) / 256; + tlenlen += add; + if (add != 0) { + *certainly_not_der = 1; + } + } + if (tlenlen == 0) { + /* Short length notation */ + sig[(*len)++] = tlen; + } else { + /* Long length notation */ + sig[(*len)++] = 128 + tlenlen; + assign_big_endian(sig + *len, tlenlen, tlen); + *len += tlenlen; + } + tlen += tlenlen; + } + tlen += 2; + CHECK(tlen + glen <= 1119); + + for (n = 0; n < 2; n++) { + /* Write the integer header. */ + sig[(*len)++] = 0x02; + if (nlenlen[n] == 0) { + /* Short length notation */ + sig[(*len)++] = nlen[n] + nzlen[n]; + } else { + /* Long length notation. */ + sig[(*len)++] = 128 + nlenlen[n]; + assign_big_endian(sig + *len, nlenlen[n], nlen[n] + nzlen[n]); + *len += nlenlen[n]; + } + /* Write zero padding */ + while (nzlen[n] > 0) { + sig[(*len)++] = 0x00; + nzlen[n]--; + } + if (nlen[n] == 32 && !nlow[n]) { + /* Special extra 16 0xFF bytes in "high" 32-byte numbers */ + int i; + for (i = 0; i < 16; i++) { + sig[(*len)++] = 0xFF; + } + nlen[n] -= 16; + } + /* Write first byte of number */ + if (nlen[n] > 0) { + sig[(*len)++] = nhbyte[n]; + nlen[n]--; + } + /* Generate remaining random bytes of number */ + secp256k1_rand_bytes_test(sig + *len, nlen[n]); + *len += nlen[n]; + nlen[n] = 0; + } + + /* Generate random garbage inside tuple. */ + secp256k1_rand_bytes_test(sig + *len, elen); + *len += elen; + + /* Generate end-of-contents bytes. */ + if (indet) { + sig[(*len)++] = 0; + sig[(*len)++] = 0; + tlen += 2; + } + CHECK(tlen + glen <= 1121); + + /* Generate random garbage outside tuple. */ + secp256k1_rand_bytes_test(sig + *len, glen); + *len += glen; + tlen += glen; + CHECK(tlen <= 1121); + CHECK(tlen == *len); +} + +void run_ecdsa_der_parse(void) { + int i,j; + for (i = 0; i < 200 * count; i++) { + unsigned char buffer[2048]; + size_t buflen = 0; + int certainly_der = 0; + int certainly_not_der = 0; + random_ber_signature(buffer, &buflen, &certainly_der, &certainly_not_der); + CHECK(buflen <= 2048); + for (j = 0; j < 16; j++) { + int ret = 0; + if (j > 0) { + damage_array(buffer, &buflen); + /* We don't know anything anymore about the DERness of the result */ + certainly_der = 0; + certainly_not_der = 0; + } + ret = test_ecdsa_der_parse(buffer, buflen, certainly_der, certainly_not_der); + if (ret != 0) { + size_t k; + fprintf(stderr, "Failure %x on ", ret); + for (k = 0; k < buflen; k++) { + fprintf(stderr, "%02x ", buffer[k]); + } + fprintf(stderr, "\n"); + } + CHECK(ret == 0); + } + } +} + +/* Tests several edge cases. */ +void test_ecdsa_edge_cases(void) { + int t; + secp256k1_ecdsa_signature sig; /* Test the case where ECDSA recomputes a point that is infinity. */ { - secp256k1_gej_t keyj; - secp256k1_ge_t key; - secp256k1_scalar_t msg; - secp256k1_ecdsa_sig_t sig; - secp256k1_scalar_set_int(&sig.s, 1); - secp256k1_scalar_negate(&sig.s, &sig.s); - secp256k1_scalar_inverse(&sig.s, &sig.s); - secp256k1_scalar_set_int(&sig.r, 1); - secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &keyj, &sig.r); + secp256k1_gej keyj; + secp256k1_ge key; + secp256k1_scalar msg; + secp256k1_scalar sr, ss; + secp256k1_scalar_set_int(&ss, 1); + secp256k1_scalar_negate(&ss, &ss); + secp256k1_scalar_inverse(&ss, &ss); + secp256k1_scalar_set_int(&sr, 1); + secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &keyj, &sr); secp256k1_ge_set_gej(&key, &keyj); - msg = sig.s; - CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sig, &key, &msg) == 0); + msg = ss; + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0); } - /* Test r/s equal to zero */ + /* Verify signature with r of zero fails. */ { - /* (1,1) encoded in DER. */ - unsigned char sigcder[8] = {0x30, 0x06, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01}; - unsigned char sigc64[64] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + const unsigned char pubkey_mods_zero[33] = { + 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, + 0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, + 0x41 }; - unsigned char pubkeyc[65]; - int pubkeyclen = 65; - CHECK(secp256k1_ecdsa_recover_compact(ctx, msg32, sigc64, pubkeyc, &pubkeyclen, 0, 0) == 1); - CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigcder, sizeof(sigcder), pubkeyc, pubkeyclen) == 1); - sigcder[4] = 0; - sigc64[31] = 0; - CHECK(secp256k1_ecdsa_recover_compact(ctx, msg32, sigc64, pubkeyb, &pubkeyblen, 1, 0) == 0); - CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigcder, sizeof(sigcder), pubkeyc, pubkeyclen) == 0); - sigcder[4] = 1; - sigcder[7] = 0; - sigc64[31] = 1; - sigc64[63] = 0; - CHECK(secp256k1_ecdsa_recover_compact(ctx, msg32, sigc64, pubkeyb, &pubkeyblen, 1, 0) == 0); - CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigcder, sizeof(sigcder), pubkeyc, pubkeyclen) == 0); + secp256k1_ge key; + secp256k1_scalar msg; + secp256k1_scalar sr, ss; + secp256k1_scalar_set_int(&ss, 1); + secp256k1_scalar_set_int(&msg, 0); + secp256k1_scalar_set_int(&sr, 0); + CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey_mods_zero, 33)); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0); } - /*Signature where s would be zero.*/ + /* Verify signature with s of zero fails. */ { - const unsigned char nonce[32] = { + const unsigned char pubkey[33] = { + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01 + }; + secp256k1_ge key; + secp256k1_scalar msg; + secp256k1_scalar sr, ss; + secp256k1_scalar_set_int(&ss, 0); + secp256k1_scalar_set_int(&msg, 0); + secp256k1_scalar_set_int(&sr, 1); + CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33)); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0); + } + + /* Verify signature with message 0 passes. */ + { + const unsigned char pubkey[33] = { + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02 + }; + const unsigned char pubkey2[33] = { + 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, + 0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, + 0x43 + }; + secp256k1_ge key; + secp256k1_ge key2; + secp256k1_scalar msg; + secp256k1_scalar sr, ss; + secp256k1_scalar_set_int(&ss, 2); + secp256k1_scalar_set_int(&msg, 0); + secp256k1_scalar_set_int(&sr, 2); + CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33)); + CHECK(secp256k1_eckey_pubkey_parse(&key2, pubkey2, 33)); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 1); + secp256k1_scalar_negate(&ss, &ss); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 1); + secp256k1_scalar_set_int(&ss, 1); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 0); + } + + /* Verify signature with message 1 passes. */ + { + const unsigned char pubkey[33] = { + 0x02, 0x14, 0x4e, 0x5a, 0x58, 0xef, 0x5b, 0x22, + 0x6f, 0xd2, 0xe2, 0x07, 0x6a, 0x77, 0xcf, 0x05, + 0xb4, 0x1d, 0xe7, 0x4a, 0x30, 0x98, 0x27, 0x8c, + 0x93, 0xe6, 0xe6, 0x3c, 0x0b, 0xc4, 0x73, 0x76, + 0x25 + }; + const unsigned char pubkey2[33] = { + 0x02, 0x8a, 0xd5, 0x37, 0xed, 0x73, 0xd9, 0x40, + 0x1d, 0xa0, 0x33, 0xd2, 0xdc, 0xf0, 0xaf, 0xae, + 0x34, 0xcf, 0x5f, 0x96, 0x4c, 0x73, 0x28, 0x0f, + 0x92, 0xc0, 0xf6, 0x9d, 0xd9, 0xb2, 0x09, 0x10, + 0x62 + }; + const unsigned char csr[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4, + 0x40, 0x2d, 0xa1, 0x72, 0x2f, 0xc9, 0xba, 0xeb + }; + secp256k1_ge key; + secp256k1_ge key2; + secp256k1_scalar msg; + secp256k1_scalar sr, ss; + secp256k1_scalar_set_int(&ss, 1); + secp256k1_scalar_set_int(&msg, 1); + secp256k1_scalar_set_b32(&sr, csr, NULL); + CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33)); + CHECK(secp256k1_eckey_pubkey_parse(&key2, pubkey2, 33)); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 1); + secp256k1_scalar_negate(&ss, &ss); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 1); + secp256k1_scalar_set_int(&ss, 2); + secp256k1_scalar_inverse_var(&ss, &ss); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 0); + } + + /* Verify signature with message -1 passes. */ + { + const unsigned char pubkey[33] = { + 0x03, 0xaf, 0x97, 0xff, 0x7d, 0x3a, 0xf6, 0xa0, + 0x02, 0x94, 0xbd, 0x9f, 0x4b, 0x2e, 0xd7, 0x52, + 0x28, 0xdb, 0x49, 0x2a, 0x65, 0xcb, 0x1e, 0x27, + 0x57, 0x9c, 0xba, 0x74, 0x20, 0xd5, 0x1d, 0x20, + 0xf1 + }; + const unsigned char csr[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4, + 0x40, 0x2d, 0xa1, 0x72, 0x2f, 0xc9, 0xba, 0xee + }; + secp256k1_ge key; + secp256k1_scalar msg; + secp256k1_scalar sr, ss; + secp256k1_scalar_set_int(&ss, 1); + secp256k1_scalar_set_int(&msg, 1); + secp256k1_scalar_negate(&msg, &msg); + secp256k1_scalar_set_b32(&sr, csr, NULL); + CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33)); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1); + secp256k1_scalar_negate(&ss, &ss); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1); + secp256k1_scalar_set_int(&ss, 3); + secp256k1_scalar_inverse_var(&ss, &ss); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0); + } + + /* Signature where s would be zero. */ + { + secp256k1_pubkey pubkey; + size_t siglen; + int32_t ecount; + unsigned char signature[72]; + static const unsigned char nonce[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1810,21 +4166,72 @@ void test_ecdsa_edge_cases(void) { 0xb8, 0x12, 0xe0, 0x0b, 0x81, 0x7a, 0x77, 0x62, 0x65, 0xdf, 0xdd, 0x31, 0xb9, 0x3e, 0x29, 0xa9, }; - unsigned char sig[72]; - int siglen = 72; - CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, precomputed_nonce_function, nonce) == 0); - CHECK(siglen == 0); - CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, precomputed_nonce_function, nonce2) == 0); - CHECK(siglen == 0); + ecount = 0; + secp256k1_context_set_illegal_callback(ctx, counting_illegal_callback_fn, &ecount); + CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, precomputed_nonce_function, nonce) == 0); + CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, precomputed_nonce_function, nonce2) == 0); msg[31] = 0xaa; + CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, precomputed_nonce_function, nonce) == 1); + CHECK(ecount == 0); + CHECK(secp256k1_ecdsa_sign(ctx, NULL, msg, key, precomputed_nonce_function, nonce2) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ecdsa_sign(ctx, &sig, NULL, key, precomputed_nonce_function, nonce2) == 0); + CHECK(ecount == 2); + CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, NULL, precomputed_nonce_function, nonce2) == 0); + CHECK(ecount == 3); + CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, precomputed_nonce_function, nonce2) == 1); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, key) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, NULL, msg, &pubkey) == 0); + CHECK(ecount == 4); + CHECK(secp256k1_ecdsa_verify(ctx, &sig, NULL, &pubkey) == 0); + CHECK(ecount == 5); + CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg, NULL) == 0); + CHECK(ecount == 6); + CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg, &pubkey) == 1); + CHECK(ecount == 6); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, NULL) == 0); + CHECK(ecount == 7); + /* That pubkeyload fails via an ARGCHECK is a little odd but makes sense because pubkeys are an opaque data type. */ + CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg, &pubkey) == 0); + CHECK(ecount == 8); siglen = 72; - CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, precomputed_nonce_function, nonce) == 1); - CHECK(siglen > 0); - CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, precomputed_nonce_function, nonce2) == 1); - CHECK(siglen > 0); + CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, NULL, &siglen, &sig) == 0); + CHECK(ecount == 9); + CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, signature, NULL, &sig) == 0); + CHECK(ecount == 10); + CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, signature, &siglen, NULL) == 0); + CHECK(ecount == 11); + CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, signature, &siglen, &sig) == 1); + CHECK(ecount == 11); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, NULL, signature, siglen) == 0); + CHECK(ecount == 12); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, NULL, siglen) == 0); + CHECK(ecount == 13); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, signature, siglen) == 1); + CHECK(ecount == 13); siglen = 10; - CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, precomputed_nonce_function, nonce) != 1); - CHECK(siglen == 0); + /* Too little room for a signature does not fail via ARGCHECK. */ + CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, signature, &siglen, &sig) == 0); + CHECK(ecount == 13); + ecount = 0; + CHECK(secp256k1_ecdsa_signature_normalize(ctx, NULL, NULL) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ecdsa_signature_serialize_compact(ctx, NULL, &sig) == 0); + CHECK(ecount == 2); + CHECK(secp256k1_ecdsa_signature_serialize_compact(ctx, signature, NULL) == 0); + CHECK(ecount == 3); + CHECK(secp256k1_ecdsa_signature_serialize_compact(ctx, signature, &sig) == 1); + CHECK(ecount == 3); + CHECK(secp256k1_ecdsa_signature_parse_compact(ctx, NULL, signature) == 0); + CHECK(ecount == 4); + CHECK(secp256k1_ecdsa_signature_parse_compact(ctx, &sig, NULL) == 0); + CHECK(ecount == 5); + CHECK(secp256k1_ecdsa_signature_parse_compact(ctx, &sig, signature) == 1); + CHECK(ecount == 5); + memset(signature, 255, 64); + CHECK(secp256k1_ecdsa_signature_parse_compact(ctx, &sig, signature) == 0); + CHECK(ecount == 5); + secp256k1_context_set_illegal_callback(ctx, NULL, NULL); } /* Nonce function corner cases. */ @@ -1833,65 +4240,43 @@ void test_ecdsa_edge_cases(void) { int i; unsigned char key[32]; unsigned char msg[32]; - unsigned char sig[72]; - unsigned char sig2[72]; - secp256k1_ecdsa_sig_t s[512]; - int siglen = 72; - int siglen2 = 72; - int recid2; + secp256k1_ecdsa_signature sig2; + secp256k1_scalar sr[512], ss; const unsigned char *extra; extra = t == 0 ? NULL : zero; memset(msg, 0, 32); msg[31] = 1; /* High key results in signature failure. */ memset(key, 0xFF, 32); - CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, NULL, extra) == 0); - CHECK(siglen == 0); + CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, NULL, extra) == 0); + CHECK(is_empty_signature(&sig)); /* Zero key results in signature failure. */ memset(key, 0, 32); - CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, NULL, extra) == 0); - CHECK(siglen == 0); + CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, NULL, extra) == 0); + CHECK(is_empty_signature(&sig)); /* Nonce function failure results in signature failure. */ key[31] = 1; - CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, nonce_function_test_fail, extra) == 0); - CHECK(siglen == 0); - CHECK(secp256k1_ecdsa_sign_compact(ctx, msg, sig, key, nonce_function_test_fail, extra, &recid) == 0); - CHECK(is_empty_compact_signature(sig)); + CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, nonce_function_test_fail, extra) == 0); + CHECK(is_empty_signature(&sig)); /* The retry loop successfully makes its way to the first good value. */ - siglen = 72; - CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, nonce_function_test_retry, extra) == 1); - CHECK(siglen > 0); - CHECK(secp256k1_ecdsa_sign(ctx, msg, sig2, &siglen2, key, nonce_function_rfc6979, extra) == 1); - CHECK(siglen > 0); - CHECK((siglen == siglen2) && (memcmp(sig, sig2, siglen) == 0)); - CHECK(secp256k1_ecdsa_sign_compact(ctx, msg, sig, key, nonce_function_test_retry, extra, &recid) == 1); - CHECK(!is_empty_compact_signature(sig)); - CHECK(secp256k1_ecdsa_sign_compact(ctx, msg, sig2, key, nonce_function_rfc6979, extra, &recid2) == 1); - CHECK(!is_empty_compact_signature(sig2)); - CHECK((recid == recid2) && (memcmp(sig, sig2, 64) == 0)); - /* The default nonce function is determinstic. */ - siglen = 72; - siglen2 = 72; - CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, NULL, extra) == 1); - CHECK(siglen > 0); - CHECK(secp256k1_ecdsa_sign(ctx, msg, sig2, &siglen2, key, NULL, extra) == 1); - CHECK(siglen2 > 0); - CHECK((siglen == siglen2) && (memcmp(sig, sig2, siglen) == 0)); - CHECK(secp256k1_ecdsa_sign_compact(ctx, msg, sig, key, NULL, extra, &recid) == 1); - CHECK(!is_empty_compact_signature(sig)); - CHECK(secp256k1_ecdsa_sign_compact(ctx, msg, sig2, key, NULL, extra, &recid2) == 1); - CHECK(!is_empty_compact_signature(sig)); - CHECK((recid == recid2) && (memcmp(sig, sig2, 64) == 0)); + CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, nonce_function_test_retry, extra) == 1); + CHECK(!is_empty_signature(&sig)); + CHECK(secp256k1_ecdsa_sign(ctx, &sig2, msg, key, nonce_function_rfc6979, extra) == 1); + CHECK(!is_empty_signature(&sig2)); + CHECK(memcmp(&sig, &sig2, sizeof(sig)) == 0); + /* The default nonce function is deterministic. */ + CHECK(secp256k1_ecdsa_sign(ctx, &sig2, msg, key, NULL, extra) == 1); + CHECK(!is_empty_signature(&sig2)); + CHECK(memcmp(&sig, &sig2, sizeof(sig)) == 0); /* The default nonce function changes output with different messages. */ for(i = 0; i < 256; i++) { int j; - siglen2 = 72; msg[0] = i; - CHECK(secp256k1_ecdsa_sign(ctx, msg, sig2, &siglen2, key, NULL, extra) == 1); - CHECK(!is_empty_compact_signature(sig)); - CHECK(secp256k1_ecdsa_sig_parse(&s[i], sig2, siglen2)); + CHECK(secp256k1_ecdsa_sign(ctx, &sig2, msg, key, NULL, extra) == 1); + CHECK(!is_empty_signature(&sig2)); + secp256k1_ecdsa_signature_load(ctx, &sr[i], &ss, &sig2); for (j = 0; j < i; j++) { - CHECK(!secp256k1_scalar_eq(&s[i].r, &s[j].r)); + CHECK(!secp256k1_scalar_eq(&sr[i], &sr[j])); } } msg[0] = 0; @@ -1899,17 +4284,45 @@ void test_ecdsa_edge_cases(void) { /* The default nonce function changes output with different keys. */ for(i = 256; i < 512; i++) { int j; - siglen2 = 72; key[0] = i - 256; - CHECK(secp256k1_ecdsa_sign(ctx, msg, sig2, &siglen2, key, NULL, extra) == 1); - CHECK(secp256k1_ecdsa_sig_parse(&s[i], sig2, siglen2)); + CHECK(secp256k1_ecdsa_sign(ctx, &sig2, msg, key, NULL, extra) == 1); + CHECK(!is_empty_signature(&sig2)); + secp256k1_ecdsa_signature_load(ctx, &sr[i], &ss, &sig2); for (j = 0; j < i; j++) { - CHECK(!secp256k1_scalar_eq(&s[i].r, &s[j].r)); + CHECK(!secp256k1_scalar_eq(&sr[i], &sr[j])); } } key[0] = 0; } + { + /* Check that optional nonce arguments do not have equivalent effect. */ + const unsigned char zeros[32] = {0}; + unsigned char nonce[32]; + unsigned char nonce2[32]; + unsigned char nonce3[32]; + unsigned char nonce4[32]; + VG_UNDEF(nonce,32); + VG_UNDEF(nonce2,32); + VG_UNDEF(nonce3,32); + VG_UNDEF(nonce4,32); + CHECK(nonce_function_rfc6979(nonce, zeros, zeros, NULL, NULL, 0) == 1); + VG_CHECK(nonce,32); + CHECK(nonce_function_rfc6979(nonce2, zeros, zeros, zeros, NULL, 0) == 1); + VG_CHECK(nonce2,32); + CHECK(nonce_function_rfc6979(nonce3, zeros, zeros, NULL, (void *)zeros, 0) == 1); + VG_CHECK(nonce3,32); + CHECK(nonce_function_rfc6979(nonce4, zeros, zeros, zeros, (void *)zeros, 0) == 1); + VG_CHECK(nonce4,32); + CHECK(memcmp(nonce, nonce2, 32) != 0); + CHECK(memcmp(nonce, nonce3, 32) != 0); + CHECK(memcmp(nonce, nonce4, 32) != 0); + CHECK(memcmp(nonce2, nonce3, 32) != 0); + CHECK(memcmp(nonce2, nonce4, 32) != 0); + CHECK(memcmp(nonce3, nonce4, 32) != 0); + } + + /* Privkey export where pubkey is the point at infinity. */ { unsigned char privkey[300]; @@ -1919,9 +4332,10 @@ void test_ecdsa_edge_cases(void) { 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41, }; - int outlen = 300; - CHECK(!secp256k1_ec_privkey_export(ctx, seckey, privkey, &outlen, 0)); - CHECK(!secp256k1_ec_privkey_export(ctx, seckey, privkey, &outlen, 1)); + size_t outlen = 300; + CHECK(!ec_privkey_export_der(ctx, privkey, &outlen, seckey, 0)); + outlen = 300; + CHECK(!ec_privkey_export_der(ctx, privkey, &outlen, seckey, 1)); } } @@ -1930,46 +4344,48 @@ void run_ecdsa_edge_cases(void) { } #ifdef ENABLE_OPENSSL_TESTS -EC_KEY *get_openssl_key(const secp256k1_scalar_t *key) { +EC_KEY *get_openssl_key(const unsigned char *key32) { unsigned char privkey[300]; - int privkeylen; + size_t privkeylen; const unsigned char* pbegin = privkey; - int compr = secp256k1_rand32() & 1; + int compr = secp256k1_rand_bits(1); EC_KEY *ec_key = EC_KEY_new_by_curve_name(NID_secp256k1); - CHECK(secp256k1_eckey_privkey_serialize(&ctx->ecmult_gen_ctx, privkey, &privkeylen, key, compr)); + CHECK(ec_privkey_export_der(ctx, privkey, &privkeylen, key32, compr)); CHECK(d2i_ECPrivateKey(&ec_key, &pbegin, privkeylen)); CHECK(EC_KEY_check_key(ec_key)); return ec_key; } void test_ecdsa_openssl(void) { - secp256k1_gej_t qj; - secp256k1_ge_t q; - secp256k1_ecdsa_sig_t sig; - secp256k1_scalar_t one; - secp256k1_scalar_t msg2; - secp256k1_scalar_t key, msg; + secp256k1_gej qj; + secp256k1_ge q; + secp256k1_scalar sigr, sigs; + secp256k1_scalar one; + secp256k1_scalar msg2; + secp256k1_scalar key, msg; EC_KEY *ec_key; unsigned int sigsize = 80; - int secp_sigsize = 80; + size_t secp_sigsize = 80; unsigned char message[32]; unsigned char signature[80]; + unsigned char key32[32]; secp256k1_rand256_test(message); secp256k1_scalar_set_b32(&msg, message, NULL); random_scalar_order_test(&key); + secp256k1_scalar_get_b32(key32, &key); secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &qj, &key); secp256k1_ge_set_gej(&q, &qj); - ec_key = get_openssl_key(&key); - CHECK(ec_key); + ec_key = get_openssl_key(key32); + CHECK(ec_key != NULL); CHECK(ECDSA_sign(0, message, sizeof(message), signature, &sigsize, ec_key)); - CHECK(secp256k1_ecdsa_sig_parse(&sig, signature, sigsize)); - CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sig, &q, &msg)); + CHECK(secp256k1_ecdsa_sig_parse(&sigr, &sigs, signature, sigsize)); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sigr, &sigs, &q, &msg)); secp256k1_scalar_set_int(&one, 1); secp256k1_scalar_add(&msg2, &msg, &one); - CHECK(!secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sig, &q, &msg2)); + CHECK(!secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sigr, &sigs, &q, &msg2)); - random_sign(&sig, &key, &msg, NULL); - CHECK(secp256k1_ecdsa_sig_serialize(signature, &secp_sigsize, &sig)); + random_sign(&sigr, &sigs, &key, &msg, NULL); + CHECK(secp256k1_ecdsa_sig_serialize(signature, &secp_sigsize, &sigr, &sigs)); CHECK(ECDSA_verify(0, message, sizeof(message), signature, secp_sigsize, ec_key) == 1); EC_KEY_free(ec_key); @@ -1983,6 +4399,14 @@ void run_ecdsa_openssl(void) { } #endif +#ifdef ENABLE_MODULE_ECDH +# include "modules/ecdh/tests_impl.h" +#endif + +#ifdef ENABLE_MODULE_RECOVERY +# include "modules/recovery/tests_impl.h" +#endif + int main(int argc, char **argv) { unsigned char seed16[16] = {0}; unsigned char run32[32] = {0}; @@ -2007,7 +4431,7 @@ int main(int argc, char **argv) { } } else { FILE *frand = fopen("/dev/urandom", "r"); - if (!frand || !fread(&seed16, sizeof(seed16), 1, frand)) { + if ((frand == NULL) || !fread(&seed16, sizeof(seed16), 1, frand)) { uint64_t t = time(NULL) * (uint64_t)1337; seed16[0] ^= t; seed16[1] ^= t >> 8; @@ -2028,12 +4452,14 @@ int main(int argc, char **argv) { /* initialize */ run_context_tests(); ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); - - if (secp256k1_rand32() & 1) { + if (secp256k1_rand_bits(1)) { secp256k1_rand256(run32); - CHECK(secp256k1_context_randomize(ctx, secp256k1_rand32() & 1 ? run32 : NULL)); + CHECK(secp256k1_context_randomize(ctx, secp256k1_rand_bits(1) ? run32 : NULL)); } + run_rand_bits(); + run_rand_int(); + run_sha256_tests(); run_hmac_sha256_tests(); run_rfc6979_hmac_sha256_tests(); @@ -2057,6 +4483,7 @@ int main(int argc, char **argv) { /* group tests */ run_ge(); + run_group_decompress(); /* ecmult tests */ run_wnaf(); @@ -2064,9 +4491,28 @@ int main(int argc, char **argv) { run_ecmult_chain(); run_ecmult_constants(); run_ecmult_gen_blind(); + run_ecmult_const_tests(); + run_ec_combine(); + + /* endomorphism tests */ +#ifdef USE_ENDOMORPHISM + run_endomorphism_tests(); +#endif + + /* EC point parser test */ + run_ec_pubkey_parse_test(); + + /* EC key edge cases */ + run_eckey_edge_case_test(); + +#ifdef ENABLE_MODULE_ECDH + /* ecdh tests */ + run_ecdh_tests(); +#endif /* ecdsa tests */ run_random_pubkeys(); + run_ecdsa_der_parse(); run_ecdsa_sign_verify(); run_ecdsa_end_to_end(); run_ecdsa_edge_cases(); @@ -2074,10 +4520,17 @@ int main(int argc, char **argv) { run_ecdsa_openssl(); #endif +#ifdef ENABLE_MODULE_RECOVERY + /* ECDSA pubkey recovery tests */ + run_recovery_tests(); +#endif + secp256k1_rand256(run32); printf("random run = %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n", run32[0], run32[1], run32[2], run32[3], run32[4], run32[5], run32[6], run32[7], run32[8], run32[9], run32[10], run32[11], run32[12], run32[13], run32[14], run32[15]); /* shutdown */ secp256k1_context_destroy(ctx); + + printf("no problems found\n"); return 0; } diff --git a/src/tests_exhaustive.c b/src/tests_exhaustive.c new file mode 100644 index 000000000..b040bb073 --- /dev/null +++ b/src/tests_exhaustive.c @@ -0,0 +1,470 @@ +/*********************************************************************** + * Copyright (c) 2016 Andrew Poelstra * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#if defined HAVE_CONFIG_H +#include "libsecp256k1-config.h" +#endif + +#include +#include + +#include + +#undef USE_ECMULT_STATIC_PRECOMPUTATION + +#ifndef EXHAUSTIVE_TEST_ORDER +/* see group_impl.h for allowable values */ +#define EXHAUSTIVE_TEST_ORDER 13 +#define EXHAUSTIVE_TEST_LAMBDA 9 /* cube root of 1 mod 13 */ +#endif + +#include "include/secp256k1.h" +#include "group.h" +#include "secp256k1.c" +#include "testrand_impl.h" + +#ifdef ENABLE_MODULE_RECOVERY +#include "src/modules/recovery/main_impl.h" +#include "include/secp256k1_recovery.h" +#endif + +/** stolen from tests.c */ +void ge_equals_ge(const secp256k1_ge *a, const secp256k1_ge *b) { + CHECK(a->infinity == b->infinity); + if (a->infinity) { + return; + } + CHECK(secp256k1_fe_equal_var(&a->x, &b->x)); + CHECK(secp256k1_fe_equal_var(&a->y, &b->y)); +} + +void ge_equals_gej(const secp256k1_ge *a, const secp256k1_gej *b) { + secp256k1_fe z2s; + secp256k1_fe u1, u2, s1, s2; + CHECK(a->infinity == b->infinity); + if (a->infinity) { + return; + } + /* Check a.x * b.z^2 == b.x && a.y * b.z^3 == b.y, to avoid inverses. */ + secp256k1_fe_sqr(&z2s, &b->z); + secp256k1_fe_mul(&u1, &a->x, &z2s); + u2 = b->x; secp256k1_fe_normalize_weak(&u2); + secp256k1_fe_mul(&s1, &a->y, &z2s); secp256k1_fe_mul(&s1, &s1, &b->z); + s2 = b->y; secp256k1_fe_normalize_weak(&s2); + CHECK(secp256k1_fe_equal_var(&u1, &u2)); + CHECK(secp256k1_fe_equal_var(&s1, &s2)); +} + +void random_fe(secp256k1_fe *x) { + unsigned char bin[32]; + do { + secp256k1_rand256(bin); + if (secp256k1_fe_set_b32(x, bin)) { + return; + } + } while(1); +} +/** END stolen from tests.c */ + +int secp256k1_nonce_function_smallint(unsigned char *nonce32, const unsigned char *msg32, + const unsigned char *key32, const unsigned char *algo16, + void *data, unsigned int attempt) { + secp256k1_scalar s; + int *idata = data; + (void)msg32; + (void)key32; + (void)algo16; + /* Some nonces cannot be used because they'd cause s and/or r to be zero. + * The signing function has retry logic here that just re-calls the nonce + * function with an increased `attempt`. So if attempt > 0 this means we + * need to change the nonce to avoid an infinite loop. */ + if (attempt > 0) { + *idata = (*idata + 1) % EXHAUSTIVE_TEST_ORDER; + } + secp256k1_scalar_set_int(&s, *idata); + secp256k1_scalar_get_b32(nonce32, &s); + return 1; +} + +#ifdef USE_ENDOMORPHISM +void test_exhaustive_endomorphism(const secp256k1_ge *group, int order) { + int i; + for (i = 0; i < order; i++) { + secp256k1_ge res; + secp256k1_ge_mul_lambda(&res, &group[i]); + ge_equals_ge(&group[i * EXHAUSTIVE_TEST_LAMBDA % EXHAUSTIVE_TEST_ORDER], &res); + } +} +#endif + +void test_exhaustive_addition(const secp256k1_ge *group, const secp256k1_gej *groupj, int order) { + int i, j; + + /* Sanity-check (and check infinity functions) */ + CHECK(secp256k1_ge_is_infinity(&group[0])); + CHECK(secp256k1_gej_is_infinity(&groupj[0])); + for (i = 1; i < order; i++) { + CHECK(!secp256k1_ge_is_infinity(&group[i])); + CHECK(!secp256k1_gej_is_infinity(&groupj[i])); + } + + /* Check all addition formulae */ + for (j = 0; j < order; j++) { + secp256k1_fe fe_inv; + secp256k1_fe_inv(&fe_inv, &groupj[j].z); + for (i = 0; i < order; i++) { + secp256k1_ge zless_gej; + secp256k1_gej tmp; + /* add_var */ + secp256k1_gej_add_var(&tmp, &groupj[i], &groupj[j], NULL); + ge_equals_gej(&group[(i + j) % order], &tmp); + /* add_ge */ + if (j > 0) { + secp256k1_gej_add_ge(&tmp, &groupj[i], &group[j]); + ge_equals_gej(&group[(i + j) % order], &tmp); + } + /* add_ge_var */ + secp256k1_gej_add_ge_var(&tmp, &groupj[i], &group[j], NULL); + ge_equals_gej(&group[(i + j) % order], &tmp); + /* add_zinv_var */ + zless_gej.infinity = groupj[j].infinity; + zless_gej.x = groupj[j].x; + zless_gej.y = groupj[j].y; + secp256k1_gej_add_zinv_var(&tmp, &groupj[i], &zless_gej, &fe_inv); + ge_equals_gej(&group[(i + j) % order], &tmp); + } + } + + /* Check doubling */ + for (i = 0; i < order; i++) { + secp256k1_gej tmp; + if (i > 0) { + secp256k1_gej_double_nonzero(&tmp, &groupj[i], NULL); + ge_equals_gej(&group[(2 * i) % order], &tmp); + } + secp256k1_gej_double_var(&tmp, &groupj[i], NULL); + ge_equals_gej(&group[(2 * i) % order], &tmp); + } + + /* Check negation */ + for (i = 1; i < order; i++) { + secp256k1_ge tmp; + secp256k1_gej tmpj; + secp256k1_ge_neg(&tmp, &group[i]); + ge_equals_ge(&group[order - i], &tmp); + secp256k1_gej_neg(&tmpj, &groupj[i]); + ge_equals_gej(&group[order - i], &tmpj); + } +} + +void test_exhaustive_ecmult(const secp256k1_context *ctx, const secp256k1_ge *group, const secp256k1_gej *groupj, int order) { + int i, j, r_log; + for (r_log = 1; r_log < order; r_log++) { + for (j = 0; j < order; j++) { + for (i = 0; i < order; i++) { + secp256k1_gej tmp; + secp256k1_scalar na, ng; + secp256k1_scalar_set_int(&na, i); + secp256k1_scalar_set_int(&ng, j); + + secp256k1_ecmult(&ctx->ecmult_ctx, &tmp, &groupj[r_log], &na, &ng); + ge_equals_gej(&group[(i * r_log + j) % order], &tmp); + + if (i > 0) { + secp256k1_ecmult_const(&tmp, &group[i], &ng); + ge_equals_gej(&group[(i * j) % order], &tmp); + } + } + } + } +} + +void r_from_k(secp256k1_scalar *r, const secp256k1_ge *group, int k) { + secp256k1_fe x; + unsigned char x_bin[32]; + k %= EXHAUSTIVE_TEST_ORDER; + x = group[k].x; + secp256k1_fe_normalize(&x); + secp256k1_fe_get_b32(x_bin, &x); + secp256k1_scalar_set_b32(r, x_bin, NULL); +} + +void test_exhaustive_verify(const secp256k1_context *ctx, const secp256k1_ge *group, int order) { + int s, r, msg, key; + for (s = 1; s < order; s++) { + for (r = 1; r < order; r++) { + for (msg = 1; msg < order; msg++) { + for (key = 1; key < order; key++) { + secp256k1_ge nonconst_ge; + secp256k1_ecdsa_signature sig; + secp256k1_pubkey pk; + secp256k1_scalar sk_s, msg_s, r_s, s_s; + secp256k1_scalar s_times_k_s, msg_plus_r_times_sk_s; + int k, should_verify; + unsigned char msg32[32]; + + secp256k1_scalar_set_int(&s_s, s); + secp256k1_scalar_set_int(&r_s, r); + secp256k1_scalar_set_int(&msg_s, msg); + secp256k1_scalar_set_int(&sk_s, key); + + /* Verify by hand */ + /* Run through every k value that gives us this r and check that *one* works. + * Note there could be none, there could be multiple, ECDSA is weird. */ + should_verify = 0; + for (k = 0; k < order; k++) { + secp256k1_scalar check_x_s; + r_from_k(&check_x_s, group, k); + if (r_s == check_x_s) { + secp256k1_scalar_set_int(&s_times_k_s, k); + secp256k1_scalar_mul(&s_times_k_s, &s_times_k_s, &s_s); + secp256k1_scalar_mul(&msg_plus_r_times_sk_s, &r_s, &sk_s); + secp256k1_scalar_add(&msg_plus_r_times_sk_s, &msg_plus_r_times_sk_s, &msg_s); + should_verify |= secp256k1_scalar_eq(&s_times_k_s, &msg_plus_r_times_sk_s); + } + } + /* nb we have a "high s" rule */ + should_verify &= !secp256k1_scalar_is_high(&s_s); + + /* Verify by calling verify */ + secp256k1_ecdsa_signature_save(&sig, &r_s, &s_s); + memcpy(&nonconst_ge, &group[sk_s], sizeof(nonconst_ge)); + secp256k1_pubkey_save(&pk, &nonconst_ge); + secp256k1_scalar_get_b32(msg32, &msg_s); + CHECK(should_verify == + secp256k1_ecdsa_verify(ctx, &sig, msg32, &pk)); + } + } + } + } +} + +void test_exhaustive_sign(const secp256k1_context *ctx, const secp256k1_ge *group, int order) { + int i, j, k; + + /* Loop */ + for (i = 1; i < order; i++) { /* message */ + for (j = 1; j < order; j++) { /* key */ + for (k = 1; k < order; k++) { /* nonce */ + const int starting_k = k; + secp256k1_ecdsa_signature sig; + secp256k1_scalar sk, msg, r, s, expected_r; + unsigned char sk32[32], msg32[32]; + secp256k1_scalar_set_int(&msg, i); + secp256k1_scalar_set_int(&sk, j); + secp256k1_scalar_get_b32(sk32, &sk); + secp256k1_scalar_get_b32(msg32, &msg); + + secp256k1_ecdsa_sign(ctx, &sig, msg32, sk32, secp256k1_nonce_function_smallint, &k); + + secp256k1_ecdsa_signature_load(ctx, &r, &s, &sig); + /* Note that we compute expected_r *after* signing -- this is important + * because our nonce-computing function function might change k during + * signing. */ + r_from_k(&expected_r, group, k); + CHECK(r == expected_r); + CHECK((k * s) % order == (i + r * j) % order || + (k * (EXHAUSTIVE_TEST_ORDER - s)) % order == (i + r * j) % order); + + /* Overflow means we've tried every possible nonce */ + if (k < starting_k) { + break; + } + } + } + } + + /* We would like to verify zero-knowledge here by counting how often every + * possible (s, r) tuple appears, but because the group order is larger + * than the field order, when coercing the x-values to scalar values, some + * appear more often than others, so we are actually not zero-knowledge. + * (This effect also appears in the real code, but the difference is on the + * order of 1/2^128th the field order, so the deviation is not useful to a + * computationally bounded attacker.) + */ +} + +#ifdef ENABLE_MODULE_RECOVERY +void test_exhaustive_recovery_sign(const secp256k1_context *ctx, const secp256k1_ge *group, int order) { + int i, j, k; + + /* Loop */ + for (i = 1; i < order; i++) { /* message */ + for (j = 1; j < order; j++) { /* key */ + for (k = 1; k < order; k++) { /* nonce */ + const int starting_k = k; + secp256k1_fe r_dot_y_normalized; + secp256k1_ecdsa_recoverable_signature rsig; + secp256k1_ecdsa_signature sig; + secp256k1_scalar sk, msg, r, s, expected_r; + unsigned char sk32[32], msg32[32]; + int expected_recid; + int recid; + secp256k1_scalar_set_int(&msg, i); + secp256k1_scalar_set_int(&sk, j); + secp256k1_scalar_get_b32(sk32, &sk); + secp256k1_scalar_get_b32(msg32, &msg); + + secp256k1_ecdsa_sign_recoverable(ctx, &rsig, msg32, sk32, secp256k1_nonce_function_smallint, &k); + + /* Check directly */ + secp256k1_ecdsa_recoverable_signature_load(ctx, &r, &s, &recid, &rsig); + r_from_k(&expected_r, group, k); + CHECK(r == expected_r); + CHECK((k * s) % order == (i + r * j) % order || + (k * (EXHAUSTIVE_TEST_ORDER - s)) % order == (i + r * j) % order); + /* In computing the recid, there is an overflow condition that is disabled in + * scalar_low_impl.h `secp256k1_scalar_set_b32` because almost every r.y value + * will exceed the group order, and our signing code always holds out for r + * values that don't overflow, so with a proper overflow check the tests would + * loop indefinitely. */ + r_dot_y_normalized = group[k].y; + secp256k1_fe_normalize(&r_dot_y_normalized); + /* Also the recovery id is flipped depending if we hit the low-s branch */ + if ((k * s) % order == (i + r * j) % order) { + expected_recid = secp256k1_fe_is_odd(&r_dot_y_normalized) ? 1 : 0; + } else { + expected_recid = secp256k1_fe_is_odd(&r_dot_y_normalized) ? 0 : 1; + } + CHECK(recid == expected_recid); + + /* Convert to a standard sig then check */ + secp256k1_ecdsa_recoverable_signature_convert(ctx, &sig, &rsig); + secp256k1_ecdsa_signature_load(ctx, &r, &s, &sig); + /* Note that we compute expected_r *after* signing -- this is important + * because our nonce-computing function function might change k during + * signing. */ + r_from_k(&expected_r, group, k); + CHECK(r == expected_r); + CHECK((k * s) % order == (i + r * j) % order || + (k * (EXHAUSTIVE_TEST_ORDER - s)) % order == (i + r * j) % order); + + /* Overflow means we've tried every possible nonce */ + if (k < starting_k) { + break; + } + } + } + } +} + +void test_exhaustive_recovery_verify(const secp256k1_context *ctx, const secp256k1_ge *group, int order) { + /* This is essentially a copy of test_exhaustive_verify, with recovery added */ + int s, r, msg, key; + for (s = 1; s < order; s++) { + for (r = 1; r < order; r++) { + for (msg = 1; msg < order; msg++) { + for (key = 1; key < order; key++) { + secp256k1_ge nonconst_ge; + secp256k1_ecdsa_recoverable_signature rsig; + secp256k1_ecdsa_signature sig; + secp256k1_pubkey pk; + secp256k1_scalar sk_s, msg_s, r_s, s_s; + secp256k1_scalar s_times_k_s, msg_plus_r_times_sk_s; + int recid = 0; + int k, should_verify; + unsigned char msg32[32]; + + secp256k1_scalar_set_int(&s_s, s); + secp256k1_scalar_set_int(&r_s, r); + secp256k1_scalar_set_int(&msg_s, msg); + secp256k1_scalar_set_int(&sk_s, key); + secp256k1_scalar_get_b32(msg32, &msg_s); + + /* Verify by hand */ + /* Run through every k value that gives us this r and check that *one* works. + * Note there could be none, there could be multiple, ECDSA is weird. */ + should_verify = 0; + for (k = 0; k < order; k++) { + secp256k1_scalar check_x_s; + r_from_k(&check_x_s, group, k); + if (r_s == check_x_s) { + secp256k1_scalar_set_int(&s_times_k_s, k); + secp256k1_scalar_mul(&s_times_k_s, &s_times_k_s, &s_s); + secp256k1_scalar_mul(&msg_plus_r_times_sk_s, &r_s, &sk_s); + secp256k1_scalar_add(&msg_plus_r_times_sk_s, &msg_plus_r_times_sk_s, &msg_s); + should_verify |= secp256k1_scalar_eq(&s_times_k_s, &msg_plus_r_times_sk_s); + } + } + /* nb we have a "high s" rule */ + should_verify &= !secp256k1_scalar_is_high(&s_s); + + /* We would like to try recovering the pubkey and checking that it matches, + * but pubkey recovery is impossible in the exhaustive tests (the reason + * being that there are 12 nonzero r values, 12 nonzero points, and no + * overlap between the sets, so there are no valid signatures). */ + + /* Verify by converting to a standard signature and calling verify */ + secp256k1_ecdsa_recoverable_signature_save(&rsig, &r_s, &s_s, recid); + secp256k1_ecdsa_recoverable_signature_convert(ctx, &sig, &rsig); + memcpy(&nonconst_ge, &group[sk_s], sizeof(nonconst_ge)); + secp256k1_pubkey_save(&pk, &nonconst_ge); + CHECK(should_verify == + secp256k1_ecdsa_verify(ctx, &sig, msg32, &pk)); + } + } + } + } +} +#endif + +int main(void) { + int i; + secp256k1_gej groupj[EXHAUSTIVE_TEST_ORDER]; + secp256k1_ge group[EXHAUSTIVE_TEST_ORDER]; + + /* Build context */ + secp256k1_context *ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); + + /* TODO set z = 1, then do num_tests runs with random z values */ + + /* Generate the entire group */ + secp256k1_gej_set_infinity(&groupj[0]); + secp256k1_ge_set_gej(&group[0], &groupj[0]); + for (i = 1; i < EXHAUSTIVE_TEST_ORDER; i++) { + /* Set a different random z-value for each Jacobian point */ + secp256k1_fe z; + random_fe(&z); + + secp256k1_gej_add_ge(&groupj[i], &groupj[i - 1], &secp256k1_ge_const_g); + secp256k1_ge_set_gej(&group[i], &groupj[i]); + secp256k1_gej_rescale(&groupj[i], &z); + + /* Verify against ecmult_gen */ + { + secp256k1_scalar scalar_i; + secp256k1_gej generatedj; + secp256k1_ge generated; + + secp256k1_scalar_set_int(&scalar_i, i); + secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &generatedj, &scalar_i); + secp256k1_ge_set_gej(&generated, &generatedj); + + CHECK(group[i].infinity == 0); + CHECK(generated.infinity == 0); + CHECK(secp256k1_fe_equal_var(&generated.x, &group[i].x)); + CHECK(secp256k1_fe_equal_var(&generated.y, &group[i].y)); + } + } + + /* Run the tests */ +#ifdef USE_ENDOMORPHISM + test_exhaustive_endomorphism(group, EXHAUSTIVE_TEST_ORDER); +#endif + test_exhaustive_addition(group, groupj, EXHAUSTIVE_TEST_ORDER); + test_exhaustive_ecmult(ctx, group, groupj, EXHAUSTIVE_TEST_ORDER); + test_exhaustive_sign(ctx, group, EXHAUSTIVE_TEST_ORDER); + test_exhaustive_verify(ctx, group, EXHAUSTIVE_TEST_ORDER); + +#ifdef ENABLE_MODULE_RECOVERY + test_exhaustive_recovery_sign(ctx, group, EXHAUSTIVE_TEST_ORDER); + test_exhaustive_recovery_verify(ctx, group, EXHAUSTIVE_TEST_ORDER); +#endif + + secp256k1_context_destroy(ctx); + return 0; +} + diff --git a/src/util.h b/src/util.h index ae98639f7..4092a86c9 100644 --- a/src/util.h +++ b/src/util.h @@ -15,6 +15,15 @@ #include #include +typedef struct { + void (*fn)(const char *text, void* data); + const void* data; +} secp256k1_callback; + +static SECP256K1_INLINE void secp256k1_callback_call(const secp256k1_callback * const cb, const char * const text) { + cb->fn(text, (void*)cb->data); +} + #ifdef DETERMINISTIC #define TEST_FAILURE(msg) do { \ fprintf(stderr, "%s\n", msg); \ @@ -47,23 +56,23 @@ } while(0) #endif -/* Like assert(), but safe to use on expressions with side effects. */ -#ifndef NDEBUG -#define DEBUG_CHECK CHECK -#else -#define DEBUG_CHECK(cond) do { (void)(cond); } while(0) -#endif - -/* Like DEBUG_CHECK(), but when VERIFY is defined instead of NDEBUG not defined. */ -#ifdef VERIFY +/* Like assert(), but when VERIFY is defined, and side-effect safe. */ +#if defined(COVERAGE) +#define VERIFY_CHECK(check) +#define VERIFY_SETUP(stmt) +#elif defined(VERIFY) #define VERIFY_CHECK CHECK +#define VERIFY_SETUP(stmt) do { stmt; } while(0) #else #define VERIFY_CHECK(cond) do { (void)(cond); } while(0) +#define VERIFY_SETUP(stmt) #endif -static SECP256K1_INLINE void *checked_malloc(size_t size) { +static SECP256K1_INLINE void *checked_malloc(const secp256k1_callback* cb, size_t size) { void *ret = malloc(size); - CHECK(ret != NULL); + if (ret == NULL) { + secp256k1_callback_call(cb, "Out of memory"); + } return ret; } From c1afe40a17f098b2c1b633d9fa74025cbd0cbd44 Mon Sep 17 00:00:00 2001 From: Pieter Wuille Date: Wed, 11 Nov 2015 06:56:19 +0100 Subject: [PATCH 0095/1062] Update key.cpp to new secp256k1 API --- configure.ac | 2 +- src/key.cpp | 155 +++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 132 insertions(+), 25 deletions(-) diff --git a/configure.ac b/configure.ac index 724ae6e17..e2e4074be 100644 --- a/configure.ac +++ b/configure.ac @@ -994,7 +994,7 @@ PKGCONFIG_LIBDIR_TEMP="$PKG_CONFIG_LIBDIR" unset PKG_CONFIG_LIBDIR PKG_CONFIG_LIBDIR="$PKGCONFIG_LIBDIR_TEMP" -ac_configure_args="${ac_configure_args} --disable-shared --with-pic --with-bignum=no" +ac_configure_args="${ac_configure_args} --disable-shared --with-pic --with-bignum=no --enable-module-recovery" AC_CONFIG_SUBDIRS([src/secp256k1 src/univalue]) AC_OUTPUT diff --git a/src/key.cpp b/src/key.cpp index 4a6a1d25c..b5c7f4274 100644 --- a/src/key.cpp +++ b/src/key.cpp @@ -7,17 +7,120 @@ #include "arith_uint256.h" #include "crypto/common.h" #include "crypto/hmac_sha512.h" -#include "eccryptoverify.h" #include "pubkey.h" #include "random.h" #include -#include "ecwrapper.h" +#include -static secp256k1_context_t* secp256k1_context = NULL; +static secp256k1_context* secp256k1_context_sign = NULL; + +/** These functions are taken from the libsecp256k1 distribution and are very ugly. */ +static int ec_privkey_import_der(const secp256k1_context* ctx, unsigned char *out32, const unsigned char *privkey, size_t privkeylen) { + const unsigned char *end = privkey + privkeylen; + int lenb = 0; + int len = 0; + memset(out32, 0, 32); + /* sequence header */ + if (end < privkey+1 || *privkey != 0x30) { + return 0; + } + privkey++; + /* sequence length constructor */ + if (end < privkey+1 || !(*privkey & 0x80)) { + return 0; + } + lenb = *privkey & ~0x80; privkey++; + if (lenb < 1 || lenb > 2) { + return 0; + } + if (end < privkey+lenb) { + return 0; + } + /* sequence length */ + len = privkey[lenb-1] | (lenb > 1 ? privkey[lenb-2] << 8 : 0); + privkey += lenb; + if (end < privkey+len) { + return 0; + } + /* sequence element 0: version number (=1) */ + if (end < privkey+3 || privkey[0] != 0x02 || privkey[1] != 0x01 || privkey[2] != 0x01) { + return 0; + } + privkey += 3; + /* sequence element 1: octet string, up to 32 bytes */ + if (end < privkey+2 || privkey[0] != 0x04 || privkey[1] > 0x20 || end < privkey+2+privkey[1]) { + return 0; + } + memcpy(out32 + 32 - privkey[1], privkey + 2, privkey[1]); + if (!secp256k1_ec_seckey_verify(ctx, out32)) { + memset(out32, 0, 32); + return 0; + } + return 1; +} + +static int ec_privkey_export_der(const secp256k1_context *ctx, unsigned char *privkey, size_t *privkeylen, const unsigned char *key32, int compressed) { + secp256k1_pubkey pubkey; + size_t pubkeylen = 0; + if (!secp256k1_ec_pubkey_create(ctx, &pubkey, key32)) { + *privkeylen = 0; + return 0; + } + if (compressed) { + static const unsigned char begin[] = { + 0x30,0x81,0xD3,0x02,0x01,0x01,0x04,0x20 + }; + static const unsigned char middle[] = { + 0xA0,0x81,0x85,0x30,0x81,0x82,0x02,0x01,0x01,0x30,0x2C,0x06,0x07,0x2A,0x86,0x48, + 0xCE,0x3D,0x01,0x01,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F,0x30,0x06,0x04,0x01,0x00,0x04,0x01,0x07,0x04, + 0x21,0x02,0x79,0xBE,0x66,0x7E,0xF9,0xDC,0xBB,0xAC,0x55,0xA0,0x62,0x95,0xCE,0x87, + 0x0B,0x07,0x02,0x9B,0xFC,0xDB,0x2D,0xCE,0x28,0xD9,0x59,0xF2,0x81,0x5B,0x16,0xF8, + 0x17,0x98,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,0xBF,0xD2,0x5E, + 0x8C,0xD0,0x36,0x41,0x41,0x02,0x01,0x01,0xA1,0x24,0x03,0x22,0x00 + }; + unsigned char *ptr = privkey; + memcpy(ptr, begin, sizeof(begin)); ptr += sizeof(begin); + memcpy(ptr, key32, 32); ptr += 32; + memcpy(ptr, middle, sizeof(middle)); ptr += sizeof(middle); + pubkeylen = 33; + secp256k1_ec_pubkey_serialize(ctx, ptr, &pubkeylen, &pubkey, SECP256K1_EC_COMPRESSED); + ptr += pubkeylen; + *privkeylen = ptr - privkey; + } else { + static const unsigned char begin[] = { + 0x30,0x82,0x01,0x13,0x02,0x01,0x01,0x04,0x20 + }; + static const unsigned char middle[] = { + 0xA0,0x81,0xA5,0x30,0x81,0xA2,0x02,0x01,0x01,0x30,0x2C,0x06,0x07,0x2A,0x86,0x48, + 0xCE,0x3D,0x01,0x01,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F,0x30,0x06,0x04,0x01,0x00,0x04,0x01,0x07,0x04, + 0x41,0x04,0x79,0xBE,0x66,0x7E,0xF9,0xDC,0xBB,0xAC,0x55,0xA0,0x62,0x95,0xCE,0x87, + 0x0B,0x07,0x02,0x9B,0xFC,0xDB,0x2D,0xCE,0x28,0xD9,0x59,0xF2,0x81,0x5B,0x16,0xF8, + 0x17,0x98,0x48,0x3A,0xDA,0x77,0x26,0xA3,0xC4,0x65,0x5D,0xA4,0xFB,0xFC,0x0E,0x11, + 0x08,0xA8,0xFD,0x17,0xB4,0x48,0xA6,0x85,0x54,0x19,0x9C,0x47,0xD0,0x8F,0xFB,0x10, + 0xD4,0xB8,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,0xBF,0xD2,0x5E, + 0x8C,0xD0,0x36,0x41,0x41,0x02,0x01,0x01,0xA1,0x44,0x03,0x42,0x00 + }; + unsigned char *ptr = privkey; + memcpy(ptr, begin, sizeof(begin)); ptr += sizeof(begin); + memcpy(ptr, key32, 32); ptr += 32; + memcpy(ptr, middle, sizeof(middle)); ptr += sizeof(middle); + pubkeylen = 65; + secp256k1_ec_pubkey_serialize(ctx, ptr, &pubkeylen, &pubkey, SECP256K1_EC_UNCOMPRESSED); + ptr += pubkeylen; + *privkeylen = ptr - privkey; + } + return 1; +} bool CKey::Check(const unsigned char *vch) { - return eccrypto::Check(vch); + return secp256k1_ec_seckey_verify(secp256k1_context_sign, vch); } void CKey::MakeNewKey(bool fCompressedIn) { @@ -29,7 +132,7 @@ void CKey::MakeNewKey(bool fCompressedIn) { } bool CKey::SetPrivKey(const CPrivKey &privkey, bool fCompressedIn) { - if (!secp256k1_ec_privkey_import(secp256k1_context, (unsigned char*)begin(), &privkey[0], privkey.size())) + if (!ec_privkey_import_der(secp256k1_context_sign, (unsigned char*)begin(), &privkey[0], privkey.size())) return false; fCompressed = fCompressedIn; fValid = true; @@ -39,10 +142,11 @@ bool CKey::SetPrivKey(const CPrivKey &privkey, bool fCompressedIn) { CPrivKey CKey::GetPrivKey() const { assert(fValid); CPrivKey privkey; - int privkeylen, ret; + int ret; + size_t privkeylen; privkey.resize(279); privkeylen = 279; - ret = secp256k1_ec_privkey_export(secp256k1_context, begin(), (unsigned char*)&privkey[0], &privkeylen, fCompressed); + ret = ec_privkey_export_der(secp256k1_context_sign, (unsigned char*)&privkey[0], &privkeylen, begin(), fCompressed ? SECP256K1_EC_COMPRESSED : SECP256K1_EC_UNCOMPRESSED); assert(ret); privkey.resize(privkeylen); return privkey; @@ -50,11 +154,13 @@ CPrivKey CKey::GetPrivKey() const { CPubKey CKey::GetPubKey() const { assert(fValid); + secp256k1_pubkey pubkey; + size_t clen = 65; CPubKey result; - int clen = 65; - int ret = secp256k1_ec_pubkey_create(secp256k1_context, (unsigned char*)result.begin(), &clen, begin(), fCompressed); - assert((int)result.size() == clen); + int ret = secp256k1_ec_pubkey_create(secp256k1_context_sign, &pubkey, begin()); assert(ret); + secp256k1_ec_pubkey_serialize(secp256k1_context_sign, (unsigned char*)result.begin(), &clen, &pubkey, fCompressed ? SECP256K1_EC_COMPRESSED : SECP256K1_EC_UNCOMPRESSED); + assert(result.size() == clen); assert(result.IsValid()); return result; } @@ -63,11 +169,13 @@ bool CKey::Sign(const uint256 &hash, std::vector& vchSig, uint32_ if (!fValid) return false; vchSig.resize(72); - int nSigLen = 72; + size_t nSigLen = 72; unsigned char extra_entropy[32] = {0}; WriteLE32(extra_entropy, test_case); - int ret = secp256k1_ecdsa_sign(secp256k1_context, hash.begin(), (unsigned char*)&vchSig[0], &nSigLen, begin(), secp256k1_nonce_function_rfc6979, test_case ? extra_entropy : NULL); + secp256k1_ecdsa_signature sig; + int ret = secp256k1_ecdsa_sign(secp256k1_context_sign, &sig, hash.begin(), begin(), secp256k1_nonce_function_rfc6979, test_case ? extra_entropy : NULL); assert(ret); + secp256k1_ecdsa_signature_serialize_der(secp256k1_context_sign, (unsigned char*)&vchSig[0], &nSigLen, &sig); vchSig.resize(nSigLen); return true; } @@ -91,7 +199,10 @@ bool CKey::SignCompact(const uint256 &hash, std::vector& vchSig) return false; vchSig.resize(65); int rec = -1; - int ret = secp256k1_ecdsa_sign_compact(secp256k1_context, hash.begin(), &vchSig[1], begin(), secp256k1_nonce_function_rfc6979, NULL, &rec); + secp256k1_ecdsa_recoverable_signature sig; + int ret = secp256k1_ecdsa_sign_recoverable(secp256k1_context_sign, &sig, hash.begin(), begin(), secp256k1_nonce_function_rfc6979, NULL); + assert(ret); + secp256k1_ecdsa_recoverable_signature_serialize_compact(secp256k1_context_sign, (unsigned char*)&vchSig[1], &rec, &sig); assert(ret); assert(rec != -1); vchSig[0] = 27 + rec + (fCompressed ? 4 : 0); @@ -99,7 +210,7 @@ bool CKey::SignCompact(const uint256 &hash, std::vector& vchSig) } bool CKey::Load(CPrivKey &privkey, CPubKey &vchPubKey, bool fSkipCheck=false) { - if (!secp256k1_ec_privkey_import(secp256k1_context, (unsigned char*)begin(), &privkey[0], privkey.size())) + if (!ec_privkey_import_der(secp256k1_context_sign, (unsigned char*)begin(), &privkey[0], privkey.size())) return false; fCompressed = vchPubKey.IsCompressed(); fValid = true; @@ -125,7 +236,7 @@ bool CKey::Derive(CKey& keyChild, ChainCode &ccChild, unsigned int nChild, const } memcpy(ccChild.begin(), out+32, 32); memcpy((unsigned char*)keyChild.begin(), begin(), 32); - bool ret = secp256k1_ec_privkey_tweak_add(secp256k1_context, (unsigned char*)keyChild.begin(), out); + bool ret = secp256k1_ec_privkey_tweak_add(secp256k1_context_sign, (unsigned char*)keyChild.begin(), out); UnlockObject(out); keyChild.fCompressed = true; keyChild.fValid = ret; @@ -183,20 +294,16 @@ void CExtKey::Decode(const unsigned char code[74]) { } bool ECC_InitSanityCheck() { - if (!CECKey::SanityCheck()) { - return false; - } CKey key; key.MakeNewKey(true); CPubKey pubkey = key.GetPubKey(); return key.VerifyPubKey(pubkey); } - void ECC_Start() { - assert(secp256k1_context == NULL); + assert(secp256k1_context_sign == NULL); - secp256k1_context_t *ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN); + secp256k1_context *ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN); assert(ctx != NULL); { @@ -209,12 +316,12 @@ void ECC_Start() { UnlockObject(seed); } - secp256k1_context = ctx; + secp256k1_context_sign = ctx; } void ECC_Stop() { - secp256k1_context_t *ctx = secp256k1_context; - secp256k1_context = NULL; + secp256k1_context *ctx = secp256k1_context_sign; + secp256k1_context_sign = NULL; if (ctx) { secp256k1_context_destroy(ctx); From 3d02d0f63a51e71303695968293ef224047c98eb Mon Sep 17 00:00:00 2001 From: Pieter Wuille Date: Tue, 28 Jul 2015 20:11:20 +0200 Subject: [PATCH 0096/1062] Switch to libsecp256k1-based validation for ECDSA --- doc/release-notes.md | 20 +++ src/Makefile.am | 10 +- src/bitcoin-tx.cpp | 10 +- src/eccryptoverify.cpp | 68 --------- src/eccryptoverify.h | 21 --- src/ecwrapper.cpp | 223 ----------------------------- src/ecwrapper.h | 40 ------ src/init.cpp | 6 +- src/pubkey.cpp | 260 ++++++++++++++++++++++++++++++---- src/pubkey.h | 16 +++ src/script/interpreter.cpp | 13 +- src/script/zcashconsensus.cpp | 9 +- src/test/test_bitcoin.h | 3 + 13 files changed, 296 insertions(+), 403 deletions(-) create mode 100644 doc/release-notes.md delete mode 100644 src/eccryptoverify.cpp delete mode 100644 src/eccryptoverify.h delete mode 100644 src/ecwrapper.cpp delete mode 100644 src/ecwrapper.h diff --git a/doc/release-notes.md b/doc/release-notes.md new file mode 100644 index 000000000..67ef103b3 --- /dev/null +++ b/doc/release-notes.md @@ -0,0 +1,20 @@ +(note: this is a temporary file, to be added-to by anybody, and moved to +release-notes at release time) + +Notable changes +=============== + +Signature validation using libsecp256k1 +--------------------------------------- + +ECDSA signatures inside Zcash transactions now use validation using +[https://github.com/bitcoin/secp256k1](libsecp256k1) instead of OpenSSL. + +Depending on the platform, this means a significant speedup for raw signature +validation speed. The advantage is largest on x86_64, where validation is over +five times faster. In practice, this translates to a raw reindexing and new +block validation times that are less than half of what it was before. + +Libsecp256k1 has undergone very extensive testing and validation upstream. + +A side effect of this change is that libconsensus no longer depends on OpenSSL. diff --git a/src/Makefile.am b/src/Makefile.am index 8a7b4aec2..1f6704798 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -124,9 +124,7 @@ BITCOIN_CORE_H = \ consensus/validation.h \ core_io.h \ core_memusage.h \ - eccryptoverify.h \ deprecation.h \ - ecwrapper.h \ hash.h \ httprpc.h \ httpserver.h \ @@ -326,8 +324,6 @@ libbitcoin_common_a_SOURCES = \ compressor.cpp \ core_read.cpp \ core_write.cpp \ - eccryptoverify.cpp \ - ecwrapper.cpp \ hash.cpp \ key.cpp \ keystore.cpp \ @@ -505,8 +501,6 @@ libzcashconsensus_la_SOURCES = \ crypto/sha1.cpp \ crypto/sha256.cpp \ crypto/sha512.cpp \ - eccryptoverify.cpp \ - ecwrapper.cpp \ hash.cpp \ primitives/transaction.cpp \ pubkey.cpp \ @@ -521,8 +515,8 @@ if GLIBC_BACK_COMPAT endif libzcashconsensus_la_LDFLAGS = -no-undefined $(RELDFLAGS) -libzcashconsensus_la_LIBADD = $(CRYPTO_LIBS) -libzcashconsensus_la_CPPFLAGS = $(CRYPTO_CFLAGS) -I$(builddir)/obj -DBUILD_BITCOIN_INTERNAL +libzcashconsensus_la_LIBADD = $(LIBSECP256K1) +libzcashconsensus_la_CPPFLAGS = -I$(builddir)/obj -I$(srcdir)/secp256k1/include -DBUILD_BITCOIN_INTERNAL endif # diff --git a/src/bitcoin-tx.cpp b/src/bitcoin-tx.cpp index 0ba7e9a43..c6c7c93ed 100644 --- a/src/bitcoin-tx.cpp +++ b/src/bitcoin-tx.cpp @@ -445,9 +445,15 @@ static void MutateTxSign(CMutableTransaction& tx, const string& flagStr) class Secp256k1Init { + ECCVerifyHandle globalVerifyHandle; + public: - Secp256k1Init() { ECC_Start(); } - ~Secp256k1Init() { ECC_Stop(); } + Secp256k1Init() { + ECC_Start(); + } + ~Secp256k1Init() { + ECC_Stop(); + } }; static void MutateTx(CMutableTransaction& tx, const string& command, diff --git a/src/eccryptoverify.cpp b/src/eccryptoverify.cpp deleted file mode 100644 index e894e1122..000000000 --- a/src/eccryptoverify.cpp +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2009-2014 The Bitcoin Core developers -// Distributed under the MIT software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. - -#include "eccryptoverify.h" - -namespace { - -int CompareBigEndian(const unsigned char *c1, size_t c1len, const unsigned char *c2, size_t c2len) { - while (c1len > c2len) { - if (*c1) - return 1; - c1++; - c1len--; - } - while (c2len > c1len) { - if (*c2) - return -1; - c2++; - c2len--; - } - while (c1len > 0) { - if (*c1 > *c2) - return 1; - if (*c2 > *c1) - return -1; - c1++; - c2++; - c1len--; - } - return 0; -} - -/** Order of secp256k1's generator minus 1. */ -const unsigned char vchMaxModOrder[32] = { - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, - 0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B, - 0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x40 -}; - -/** Half of the order of secp256k1's generator minus 1. */ -const unsigned char vchMaxModHalfOrder[32] = { - 0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0x5D,0x57,0x6E,0x73,0x57,0xA4,0x50,0x1D, - 0xDF,0xE9,0x2F,0x46,0x68,0x1B,0x20,0xA0 -}; - -const unsigned char vchZero[1] = {0}; -} // anon namespace - -namespace eccrypto { - -bool Check(const unsigned char *vch) { - return vch && - CompareBigEndian(vch, 32, vchZero, 0) > 0 && - CompareBigEndian(vch, 32, vchMaxModOrder, 32) <= 0; -} - -bool CheckSignatureElement(const unsigned char *vch, int len, bool half) { - return vch && - CompareBigEndian(vch, len, vchZero, 0) > 0 && - CompareBigEndian(vch, len, half ? vchMaxModHalfOrder : vchMaxModOrder, 32) <= 0; -} - -} // namespace eccrypto diff --git a/src/eccryptoverify.h b/src/eccryptoverify.h deleted file mode 100644 index c67c1e44f..000000000 --- a/src/eccryptoverify.h +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2009-2014 The Bitcoin Core developers -// Distributed under the MIT software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. - -#ifndef BITCOIN_ECCRYPTOVERIFY_H -#define BITCOIN_ECCRYPTOVERIFY_H - -#include -#include - -class uint256; - -namespace eccrypto { - -bool Check(const unsigned char *vch); -bool CheckSignatureElement(const unsigned char *vch, int len, bool half); - -} // eccrypto namespace - -#endif // BITCOIN_ECCRYPTOVERIFY_H diff --git a/src/ecwrapper.cpp b/src/ecwrapper.cpp deleted file mode 100644 index ae2748806..000000000 --- a/src/ecwrapper.cpp +++ /dev/null @@ -1,223 +0,0 @@ -// Copyright (c) 2009-2014 The Bitcoin Core developers -// Distributed under the MIT software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. - -#include "ecwrapper.h" - -#include "serialize.h" -#include "uint256.h" - -#include -#include - -namespace { - -class ecgroup_order -{ -public: - static const EC_GROUP* get() - { - static const ecgroup_order wrapper; - return wrapper.pgroup; - } - -private: - ecgroup_order() - : pgroup(EC_GROUP_new_by_curve_name(NID_secp256k1)) - { - } - - ~ecgroup_order() - { - EC_GROUP_free(pgroup); - } - - EC_GROUP* pgroup; -}; - -/** - * Perform ECDSA key recovery (see SEC1 4.1.6) for curves over (mod p)-fields - * recid selects which key is recovered - * if check is non-zero, additional checks are performed - */ -int ECDSA_SIG_recover_key_GFp(EC_KEY *eckey, ECDSA_SIG *ecsig, const unsigned char *msg, int msglen, int recid, int check) -{ - if (!eckey) return 0; - - int ret = 0; - BN_CTX *ctx = NULL; - - BIGNUM *x = NULL; - BIGNUM *e = NULL; - BIGNUM *order = NULL; - BIGNUM *sor = NULL; - BIGNUM *eor = NULL; - BIGNUM *field = NULL; - EC_POINT *R = NULL; - EC_POINT *O = NULL; - EC_POINT *Q = NULL; - BIGNUM *rr = NULL; - BIGNUM *zero = NULL; - int n = 0; - int i = recid / 2; - - const BIGNUM *sig_r, *sig_s; - ECDSA_SIG_get0(ecsig, &sig_r, &sig_s); - - const EC_GROUP *group = EC_KEY_get0_group(eckey); - if ((ctx = BN_CTX_new()) == NULL) { ret = -1; goto err; } - BN_CTX_start(ctx); - order = BN_CTX_get(ctx); - if (!EC_GROUP_get_order(group, order, ctx)) { ret = -2; goto err; } - x = BN_CTX_get(ctx); - if (!BN_copy(x, order)) { ret=-1; goto err; } - if (!BN_mul_word(x, i)) { ret=-1; goto err; } - if (!BN_add(x, x, sig_r)) { ret=-1; goto err; } - field = BN_CTX_get(ctx); - if (!EC_GROUP_get_curve_GFp(group, field, NULL, NULL, ctx)) { ret=-2; goto err; } - if (BN_cmp(x, field) >= 0) { ret=0; goto err; } - if ((R = EC_POINT_new(group)) == NULL) { ret = -2; goto err; } - if (!EC_POINT_set_compressed_coordinates_GFp(group, R, x, recid % 2, ctx)) { ret=0; goto err; } - if (check) - { - if ((O = EC_POINT_new(group)) == NULL) { ret = -2; goto err; } - if (!EC_POINT_mul(group, O, NULL, R, order, ctx)) { ret=-2; goto err; } - if (!EC_POINT_is_at_infinity(group, O)) { ret = 0; goto err; } - } - if ((Q = EC_POINT_new(group)) == NULL) { ret = -2; goto err; } - n = EC_GROUP_get_degree(group); - e = BN_CTX_get(ctx); - if (!BN_bin2bn(msg, msglen, e)) { ret=-1; goto err; } - if (8*msglen > n) BN_rshift(e, e, 8-(n & 7)); - zero = BN_CTX_get(ctx); - if (!BN_zero(zero)) { ret=-1; goto err; } - if (!BN_mod_sub(e, zero, e, order, ctx)) { ret=-1; goto err; } - rr = BN_CTX_get(ctx); - if (!BN_mod_inverse(rr, sig_r, order, ctx)) { ret=-1; goto err; } - sor = BN_CTX_get(ctx); - if (!BN_mod_mul(sor, sig_s, rr, order, ctx)) { ret=-1; goto err; } - eor = BN_CTX_get(ctx); - if (!BN_mod_mul(eor, e, rr, order, ctx)) { ret=-1; goto err; } - if (!EC_POINT_mul(group, Q, eor, R, sor, ctx)) { ret=-2; goto err; } - if (!EC_KEY_set_public_key(eckey, Q)) { ret=-2; goto err; } - - ret = 1; - -err: - if (ctx) { - BN_CTX_end(ctx); - BN_CTX_free(ctx); - } - if (R != NULL) EC_POINT_free(R); - if (O != NULL) EC_POINT_free(O); - if (Q != NULL) EC_POINT_free(Q); - return ret; -} - -} // anon namespace - -CECKey::CECKey() { - pkey = EC_KEY_new(); - assert(pkey != NULL); - int result = EC_KEY_set_group(pkey, ecgroup_order::get()); - assert(result); -} - -CECKey::~CECKey() { - EC_KEY_free(pkey); -} - -void CECKey::GetPubKey(std::vector &pubkey, bool fCompressed) { - EC_KEY_set_conv_form(pkey, fCompressed ? POINT_CONVERSION_COMPRESSED : POINT_CONVERSION_UNCOMPRESSED); - int nSize = i2o_ECPublicKey(pkey, NULL); - assert(nSize); - assert(nSize <= 65); - pubkey.clear(); - pubkey.resize(nSize); - unsigned char *pbegin(begin_ptr(pubkey)); - int nSize2 = i2o_ECPublicKey(pkey, &pbegin); - assert(nSize == nSize2); -} - -bool CECKey::SetPubKey(const unsigned char* pubkey, size_t size) { - return o2i_ECPublicKey(&pkey, &pubkey, size) != NULL; -} - -bool CECKey::Verify(const uint256 &hash, const std::vector& vchSig) { - if (vchSig.empty()) - return false; - - // New versions of OpenSSL will reject non-canonical DER signatures. de/re-serialize first. - unsigned char *norm_der = NULL; - ECDSA_SIG *norm_sig = ECDSA_SIG_new(); - const unsigned char* sigptr = &vchSig[0]; - assert(norm_sig); - if (d2i_ECDSA_SIG(&norm_sig, &sigptr, vchSig.size()) == NULL) - { - /* As of OpenSSL 1.0.0p d2i_ECDSA_SIG frees and nulls the pointer on - * error. But OpenSSL's own use of this function redundantly frees the - * result. As ECDSA_SIG_free(NULL) is a no-op, and in the absence of a - * clear contract for the function behaving the same way is more - * conservative. - */ - ECDSA_SIG_free(norm_sig); - return false; - } - int derlen = i2d_ECDSA_SIG(norm_sig, &norm_der); - ECDSA_SIG_free(norm_sig); - if (derlen <= 0) - return false; - - // -1 = error, 0 = bad sig, 1 = good - bool ret = ECDSA_verify(0, (unsigned char*)&hash, sizeof(hash), norm_der, derlen, pkey) == 1; - OPENSSL_free(norm_der); - return ret; -} - -bool CECKey::Recover(const uint256 &hash, const unsigned char *p64, int rec) -{ - if (rec<0 || rec>=3) - return false; - ECDSA_SIG *sig = ECDSA_SIG_new(); - BIGNUM *sig_r = BN_bin2bn(&p64[0], 32, nullptr); - BIGNUM *sig_s = BN_bin2bn(&p64[32], 32, nullptr); - assert(sig && sig_r && sig_s); - bool ret = ECDSA_SIG_set0(sig, sig_r, sig_s); - assert(ret); - ret = ECDSA_SIG_recover_key_GFp(pkey, sig, (unsigned char*)&hash, sizeof(hash), rec, 0) == 1; - ECDSA_SIG_free(sig); - return ret; -} - -bool CECKey::TweakPublic(const unsigned char vchTweak[32]) { - bool ret = true; - BN_CTX *ctx = BN_CTX_new(); - BN_CTX_start(ctx); - BIGNUM *bnTweak = BN_CTX_get(ctx); - BIGNUM *bnOrder = BN_CTX_get(ctx); - BIGNUM *bnOne = BN_CTX_get(ctx); - const EC_GROUP *group = EC_KEY_get0_group(pkey); - EC_GROUP_get_order(group, bnOrder, ctx); // what a grossly inefficient way to get the (constant) group order... - BN_bin2bn(vchTweak, 32, bnTweak); - if (BN_cmp(bnTweak, bnOrder) >= 0) - ret = false; // extremely unlikely - EC_POINT *point = EC_POINT_dup(EC_KEY_get0_public_key(pkey), group); - BN_one(bnOne); - EC_POINT_mul(group, point, bnTweak, point, bnOne, ctx); - if (EC_POINT_is_at_infinity(group, point)) - ret = false; // ridiculously unlikely - EC_KEY_set_public_key(pkey, point); - EC_POINT_free(point); - BN_CTX_end(ctx); - BN_CTX_free(ctx); - return ret; -} - -bool CECKey::SanityCheck() -{ - const EC_GROUP *pgroup = ecgroup_order::get(); - if(pgroup == NULL) - return false; - // TODO Is there more EC functionality that could be missing? - return true; -} diff --git a/src/ecwrapper.h b/src/ecwrapper.h deleted file mode 100644 index efb6cd18a..000000000 --- a/src/ecwrapper.h +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) 2009-2014 The Bitcoin Core developers -// Distributed under the MIT software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. - -#ifndef BITCOIN_ECWRAPPER_H -#define BITCOIN_ECWRAPPER_H - -#include -#include - -#include - -class uint256; - -/** RAII Wrapper around OpenSSL's EC_KEY */ -class CECKey { -private: - EC_KEY *pkey; - -public: - CECKey(); - ~CECKey(); - - void GetPubKey(std::vector& pubkey, bool fCompressed); - bool SetPubKey(const unsigned char* pubkey, size_t size); - bool Verify(const uint256 &hash, const std::vector& vchSig); - - /** - * reconstruct public key from a compact signature - * This is only slightly more CPU intensive than just verifying it. - * If this function succeeds, the recovered public key is guaranteed to be valid - * (the signature is a valid signature of the given data for that key) - */ - bool Recover(const uint256 &hash, const unsigned char *p64, int rec); - - bool TweakPublic(const unsigned char vchTweak[32]); - static bool SanityCheck(); -}; - -#endif // BITCOIN_ECWRAPPER_H diff --git a/src/init.cpp b/src/init.cpp index 34df422f5..76a77fb9b 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -161,6 +161,7 @@ public: static CCoinsViewDB *pcoinsdbview = NULL; static CCoinsViewErrorCatcher *pcoinscatcher = NULL; +static boost::scoped_ptr globalVerifyHandle; void Interrupt(boost::thread_group& threadGroup) { @@ -266,6 +267,7 @@ void Shutdown() #endif delete pzcashParams; pzcashParams = NULL; + globalVerifyHandle.reset(); ECC_Stop(); LogPrintf("%s: done\n", __func__); } @@ -661,8 +663,7 @@ void ThreadImport(std::vector vImportFiles) bool InitSanityCheck(void) { if(!ECC_InitSanityCheck()) { - InitError("OpenSSL appears to lack support for elliptic curve cryptography. For more " - "information, visit https://en.bitcoin.it/wiki/OpenSSL_and_EC_Libraries"); + InitError("Elliptic curve cryptography sanity check failure. Aborting."); return false; } if (!glibc_sanity_test() || !glibcxx_sanity_test()) @@ -1044,6 +1045,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) // Initialize elliptic curve code ECC_Start(); + globalVerifyHandle.reset(new ECCVerifyHandle()); // Sanity check if (!InitSanityCheck()) diff --git a/src/pubkey.cpp b/src/pubkey.cpp index bdab13760..6ebb152c7 100644 --- a/src/pubkey.cpp +++ b/src/pubkey.cpp @@ -4,19 +4,184 @@ #include "pubkey.h" -#include "eccryptoverify.h" +#include +#include -#include "ecwrapper.h" +namespace +{ +/* Global secp256k1_context object used for verification. */ +secp256k1_context* secp256k1_context_verify = NULL; +} + +/** This function is taken from the libsecp256k1 distribution and implements + * DER parsing for ECDSA signatures, while supporting an arbitrary subset of + * format violations. + * + * Supported violations include negative integers, excessive padding, garbage + * at the end, and overly long length descriptors. This is safe to use in + * Bitcoin because since the activation of BIP66, signatures are verified to be + * strict DER before being passed to this module, and we know it supports all + * violations present in the blockchain before that point. + */ +static int ecdsa_signature_parse_der_lax(const secp256k1_context* ctx, secp256k1_ecdsa_signature* sig, const unsigned char *input, size_t inputlen) { + size_t rpos, rlen, spos, slen; + size_t pos = 0; + size_t lenbyte; + unsigned char tmpsig[64] = {0}; + int overflow = 0; + + /* Hack to initialize sig with a correctly-parsed but invalid signature. */ + secp256k1_ecdsa_signature_parse_compact(ctx, sig, tmpsig); + + /* Sequence tag byte */ + if (pos == inputlen || input[pos] != 0x30) { + return 0; + } + pos++; + + /* Sequence length bytes */ + if (pos == inputlen) { + return 0; + } + lenbyte = input[pos++]; + if (lenbyte & 0x80) { + lenbyte -= 0x80; + if (pos + lenbyte > inputlen) { + return 0; + } + pos += lenbyte; + } + + /* Integer tag byte for R */ + if (pos == inputlen || input[pos] != 0x02) { + return 0; + } + pos++; + + /* Integer length for R */ + if (pos == inputlen) { + return 0; + } + lenbyte = input[pos++]; + if (lenbyte & 0x80) { + lenbyte -= 0x80; + if (pos + lenbyte > inputlen) { + return 0; + } + while (lenbyte > 0 && input[pos] == 0) { + pos++; + lenbyte--; + } + if (lenbyte >= sizeof(size_t)) { + return 0; + } + rlen = 0; + while (lenbyte > 0) { + rlen = (rlen << 8) + input[pos]; + pos++; + lenbyte--; + } + } else { + rlen = lenbyte; + } + if (rlen > inputlen - pos) { + return 0; + } + rpos = pos; + pos += rlen; + + /* Integer tag byte for S */ + if (pos == inputlen || input[pos] != 0x02) { + return 0; + } + pos++; + + /* Integer length for S */ + if (pos == inputlen) { + return 0; + } + lenbyte = input[pos++]; + if (lenbyte & 0x80) { + lenbyte -= 0x80; + if (pos + lenbyte > inputlen) { + return 0; + } + while (lenbyte > 0 && input[pos] == 0) { + pos++; + lenbyte--; + } + if (lenbyte >= sizeof(size_t)) { + return 0; + } + slen = 0; + while (lenbyte > 0) { + slen = (slen << 8) + input[pos]; + pos++; + lenbyte--; + } + } else { + slen = lenbyte; + } + if (slen > inputlen - pos) { + return 0; + } + spos = pos; + pos += slen; + + /* Ignore leading zeroes in R */ + while (rlen > 0 && input[rpos] == 0) { + rlen--; + rpos++; + } + /* Copy R value */ + if (rlen > 32) { + overflow = 1; + } else { + memcpy(tmpsig + 32 - rlen, input + rpos, rlen); + } + + /* Ignore leading zeroes in S */ + while (slen > 0 && input[spos] == 0) { + slen--; + spos++; + } + /* Copy S value */ + if (slen > 32) { + overflow = 1; + } else { + memcpy(tmpsig + 64 - slen, input + spos, slen); + } + + if (!overflow) { + overflow = !secp256k1_ecdsa_signature_parse_compact(ctx, sig, tmpsig); + } + if (overflow) { + /* Overwrite the result again with a correctly-parsed but invalid + signature if parsing failed. */ + memset(tmpsig, 0, 64); + secp256k1_ecdsa_signature_parse_compact(ctx, sig, tmpsig); + } + return 1; +} bool CPubKey::Verify(const uint256 &hash, const std::vector& vchSig) const { if (!IsValid()) return false; - CECKey key; - if (!key.SetPubKey(begin(), size())) + secp256k1_pubkey pubkey; + secp256k1_ecdsa_signature sig; + if (!secp256k1_ec_pubkey_parse(secp256k1_context_verify, &pubkey, &(*this)[0], size())) { return false; - if (!key.Verify(hash, vchSig)) + } + if (vchSig.size() == 0) { return false; - return true; + } + if (!ecdsa_signature_parse_der_lax(secp256k1_context_verify, &sig, &vchSig[0], vchSig.size())) { + return false; + } + /* libsecp256k1's ECDSA verification requires lower-S signatures, which have + * not historically been enforced in Bitcoin, so normalize them first. */ + secp256k1_ecdsa_signature_normalize(secp256k1_context_verify, &sig, &sig); + return secp256k1_ecdsa_verify(secp256k1_context_verify, &sig, hash.begin(), &pubkey); } bool CPubKey::RecoverCompact(const uint256 &hash, const std::vector& vchSig) { @@ -24,33 +189,39 @@ bool CPubKey::RecoverCompact(const uint256 &hash, const std::vector pubkey; - key.GetPubKey(pubkey, fComp); - Set(pubkey.begin(), pubkey.end()); + } + if (!secp256k1_ecdsa_recover(secp256k1_context_verify, &pubkey, &sig, hash.begin())) { + return false; + } + unsigned char pub[65]; + size_t publen = 65; + secp256k1_ec_pubkey_serialize(secp256k1_context_verify, pub, &publen, &pubkey, fComp ? SECP256K1_EC_COMPRESSED : SECP256K1_EC_UNCOMPRESSED); + Set(pub, pub + publen); return true; } bool CPubKey::IsFullyValid() const { if (!IsValid()) return false; - CECKey key; - if (!key.SetPubKey(begin(), size())) - return false; - return true; + secp256k1_pubkey pubkey; + return secp256k1_ec_pubkey_parse(secp256k1_context_verify, &pubkey, &(*this)[0], size()); } bool CPubKey::Decompress() { if (!IsValid()) return false; - CECKey key; - if (!key.SetPubKey(begin(), size())) + secp256k1_pubkey pubkey; + if (!secp256k1_ec_pubkey_parse(secp256k1_context_verify, &pubkey, &(*this)[0], size())) { return false; - std::vector pubkey; - key.GetPubKey(pubkey, false); - Set(pubkey.begin(), pubkey.end()); + } + unsigned char pub[65]; + size_t publen = 65; + secp256k1_ec_pubkey_serialize(secp256k1_context_verify, pub, &publen, &pubkey, SECP256K1_EC_UNCOMPRESSED); + Set(pub, pub + publen); return true; } @@ -61,13 +232,18 @@ bool CPubKey::Derive(CPubKey& pubkeyChild, ChainCode &ccChild, unsigned int nChi unsigned char out[64]; BIP32Hash(cc, nChild, *begin(), begin()+1, out); memcpy(ccChild.begin(), out+32, 32); - CECKey key; - bool ret = key.SetPubKey(begin(), size()); - ret &= key.TweakPublic(out); - std::vector pubkey; - key.GetPubKey(pubkey, true); - pubkeyChild.Set(pubkey.begin(), pubkey.end()); - return ret; + secp256k1_pubkey pubkey; + if (!secp256k1_ec_pubkey_parse(secp256k1_context_verify, &pubkey, &(*this)[0], size())) { + return false; + } + if (!secp256k1_ec_pubkey_tweak_add(secp256k1_context_verify, &pubkey, out)) { + return false; + } + unsigned char pub[33]; + size_t publen = 33; + secp256k1_ec_pubkey_serialize(secp256k1_context_verify, pub, &publen, &pubkey, SECP256K1_EC_COMPRESSED); + pubkeyChild.Set(pub, pub + publen); + return true; } void CExtPubKey::Encode(unsigned char code[74]) const { @@ -95,3 +271,33 @@ bool CExtPubKey::Derive(CExtPubKey &out, unsigned int nChild) const { out.nChild = nChild; return pubkey.Derive(out.pubkey, out.chaincode, nChild, chaincode); } + +/* static */ bool CPubKey::CheckLowS(const std::vector& vchSig) { + secp256k1_ecdsa_signature sig; + if (!ecdsa_signature_parse_der_lax(secp256k1_context_verify, &sig, &vchSig[0], vchSig.size())) { + return false; + } + return (!secp256k1_ecdsa_signature_normalize(secp256k1_context_verify, NULL, &sig)); +} + +/* static */ int ECCVerifyHandle::refcount = 0; + +ECCVerifyHandle::ECCVerifyHandle() +{ + if (refcount == 0) { + assert(secp256k1_context_verify == NULL); + secp256k1_context_verify = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY); + assert(secp256k1_context_verify != NULL); + } + refcount++; +} + +ECCVerifyHandle::~ECCVerifyHandle() +{ + refcount--; + if (refcount == 0) { + assert(secp256k1_context_verify != NULL); + secp256k1_context_destroy(secp256k1_context_verify); + secp256k1_context_verify = NULL; + } +} diff --git a/src/pubkey.h b/src/pubkey.h index cce9c826e..a1d437e70 100644 --- a/src/pubkey.h +++ b/src/pubkey.h @@ -177,6 +177,11 @@ public: */ bool Verify(const uint256& hash, const std::vector& vchSig) const; + /** + * Check whether a signature is normalized (lower-S). + */ + static bool CheckLowS(const std::vector& vchSig); + //! Recover a public key from a compact signature. bool RecoverCompact(const uint256& hash, const std::vector& vchSig); @@ -205,4 +210,15 @@ struct CExtPubKey { bool Derive(CExtPubKey& out, unsigned int nChild) const; }; +/** Users of this module must hold an ECCVerifyHandle. The constructor and + * destructor of these are not allowed to run in parallel, though. */ +class ECCVerifyHandle +{ + static int refcount; + +public: + ECCVerifyHandle(); + ~ECCVerifyHandle(); +}; + #endif // BITCOIN_PUBKEY_H diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 19a6a8f4f..df1f1ccd5 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -9,7 +9,6 @@ #include "crypto/ripemd160.h" #include "crypto/sha1.h" #include "crypto/sha256.h" -#include "eccryptoverify.h" #include "pubkey.h" #include "script/script.h" #include "uint256.h" @@ -165,16 +164,8 @@ bool static IsLowDERSignature(const valtype &vchSig, ScriptError* serror) { if (!IsValidSignatureEncoding(vchSig)) { return set_error(serror, SCRIPT_ERR_SIG_DER); } - unsigned int nLenR = vchSig[3]; - unsigned int nLenS = vchSig[5+nLenR]; - const unsigned char *S = &vchSig[6+nLenR]; - // If the S value is above the order of the curve divided by two, its - // complement modulo the order could have been used instead, which is - // one byte shorter when encoded correctly. - if (!eccrypto::CheckSignatureElement(S, nLenS, true)) - return set_error(serror, SCRIPT_ERR_SIG_HIGH_S); - - return true; + std::vector vchSigCopy(vchSig.begin(), vchSig.begin() + vchSig.size() - 1); + return CPubKey::CheckLowS(vchSigCopy); } bool static IsDefinedHashtypeSignature(const valtype &vchSig) { diff --git a/src/script/zcashconsensus.cpp b/src/script/zcashconsensus.cpp index d66cf21c0..277b805e5 100644 --- a/src/script/zcashconsensus.cpp +++ b/src/script/zcashconsensus.cpp @@ -6,6 +6,7 @@ #include "zcashconsensus.h" #include "primitives/transaction.h" +#include "pubkey.h" #include "script/interpreter.h" #include "version.h" @@ -60,7 +61,13 @@ inline int set_error(zcashconsensus_error* ret, zcashconsensus_error serror) return 0; } -} // anon namespace +struct ECCryptoClosure +{ + ECCVerifyHandle handle; +}; + +ECCryptoClosure instance_of_eccryptoclosure; +} int zcashconsensus_verify_script(const unsigned char *scriptPubKey, unsigned int scriptPubKeyLen, const unsigned char *txTo , unsigned int txToLen, diff --git a/src/test/test_bitcoin.h b/src/test/test_bitcoin.h index 2f75332d4..205e5b5c4 100644 --- a/src/test/test_bitcoin.h +++ b/src/test/test_bitcoin.h @@ -1,6 +1,7 @@ #ifndef BITCOIN_TEST_TEST_BITCOIN_H #define BITCOIN_TEST_TEST_BITCOIN_H +#include "pubkey.h" #include "txdb.h" #include @@ -10,6 +11,8 @@ * This just configures logging and chain parameters. */ struct BasicTestingSetup { + ECCVerifyHandle globalVerifyHandle; + BasicTestingSetup(); ~BasicTestingSetup(); }; From 50fa079748eedbe0a5319f4af17ef3965c162d02 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 3 May 2017 00:14:55 +1200 Subject: [PATCH 0097/1062] Fix potential overflows in ECDSA DER parsers --- src/key.cpp | 32 +++++++++++++++++++------------- src/pubkey.cpp | 15 +++++++++------ 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/src/key.cpp b/src/key.cpp index b5c7f4274..ffc2407a3 100644 --- a/src/key.cpp +++ b/src/key.cpp @@ -1,4 +1,5 @@ // Copyright (c) 2009-2014 The Bitcoin Core developers +// Copyright (c) 2017 The Zcash developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. @@ -18,41 +19,46 @@ static secp256k1_context* secp256k1_context_sign = NULL; /** These functions are taken from the libsecp256k1 distribution and are very ugly. */ static int ec_privkey_import_der(const secp256k1_context* ctx, unsigned char *out32, const unsigned char *privkey, size_t privkeylen) { const unsigned char *end = privkey + privkeylen; - int lenb = 0; - int len = 0; + size_t lenb = 0; + size_t len = 0; memset(out32, 0, 32); /* sequence header */ - if (end < privkey+1 || *privkey != 0x30) { + if (end - privkey < 1 || *privkey != 0x30u) { return 0; } privkey++; /* sequence length constructor */ - if (end < privkey+1 || !(*privkey & 0x80)) { + if (end - privkey < 1 || !(*privkey & 0x80u)) { return 0; } - lenb = *privkey & ~0x80; privkey++; + lenb = *privkey & ~0x80u; privkey++; if (lenb < 1 || lenb > 2) { return 0; } - if (end < privkey+lenb) { + if (end - privkey < lenb) { return 0; } /* sequence length */ - len = privkey[lenb-1] | (lenb > 1 ? privkey[lenb-2] << 8 : 0); + len = privkey[lenb-1] | (lenb > 1 ? privkey[lenb-2] << 8 : 0u); privkey += lenb; - if (end < privkey+len) { + if (end - privkey < len) { return 0; } /* sequence element 0: version number (=1) */ - if (end < privkey+3 || privkey[0] != 0x02 || privkey[1] != 0x01 || privkey[2] != 0x01) { + if (end - privkey < 3 || privkey[0] != 0x02u || privkey[1] != 0x01u || privkey[2] != 0x01u) { return 0; } privkey += 3; /* sequence element 1: octet string, up to 32 bytes */ - if (end < privkey+2 || privkey[0] != 0x04 || privkey[1] > 0x20 || end < privkey+2+privkey[1]) { + if (end - privkey < 2 || privkey[0] != 0x04u) { return 0; } - memcpy(out32 + 32 - privkey[1], privkey + 2, privkey[1]); + size_t oslen = privkey[1]; + privkey += 2; + if (oslen > 32 || end - privkey < oslen) { + return 0; + } + memcpy(out32 + (32 - oslen), privkey, oslen); if (!secp256k1_ec_seckey_verify(ctx, out32)) { memset(out32, 0, 32); return 0; @@ -228,10 +234,10 @@ bool CKey::Derive(CKey& keyChild, ChainCode &ccChild, unsigned int nChild, const LockObject(out); if ((nChild >> 31) == 0) { CPubKey pubkey = GetPubKey(); - assert(pubkey.begin() + 33 == pubkey.end()); + assert(pubkey.size() == 33); BIP32Hash(cc, nChild, *pubkey.begin(), pubkey.begin()+1, out); } else { - assert(begin() + 32 == end()); + assert(size() == 32); BIP32Hash(cc, nChild, 0, begin(), out); } memcpy(ccChild.begin(), out+32, 32); diff --git a/src/pubkey.cpp b/src/pubkey.cpp index 6ebb152c7..e710c4644 100644 --- a/src/pubkey.cpp +++ b/src/pubkey.cpp @@ -1,4 +1,5 @@ // Copyright (c) 2009-2014 The Bitcoin Core developers +// Copyright (c) 2017 The Zcash developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. @@ -46,7 +47,7 @@ static int ecdsa_signature_parse_der_lax(const secp256k1_context* ctx, secp256k1 lenbyte = input[pos++]; if (lenbyte & 0x80) { lenbyte -= 0x80; - if (pos + lenbyte > inputlen) { + if (lenbyte > inputlen - pos) { return 0; } pos += lenbyte; @@ -65,14 +66,15 @@ static int ecdsa_signature_parse_der_lax(const secp256k1_context* ctx, secp256k1 lenbyte = input[pos++]; if (lenbyte & 0x80) { lenbyte -= 0x80; - if (pos + lenbyte > inputlen) { + if (lenbyte > inputlen - pos) { return 0; } while (lenbyte > 0 && input[pos] == 0) { pos++; lenbyte--; } - if (lenbyte >= sizeof(size_t)) { + static_assert(sizeof(size_t) >= 4, "size_t too small"); + if (lenbyte >= 4) { return 0; } rlen = 0; @@ -103,14 +105,15 @@ static int ecdsa_signature_parse_der_lax(const secp256k1_context* ctx, secp256k1 lenbyte = input[pos++]; if (lenbyte & 0x80) { lenbyte -= 0x80; - if (pos + lenbyte > inputlen) { + if (lenbyte > inputlen - pos) { return 0; } while (lenbyte > 0 && input[pos] == 0) { pos++; lenbyte--; } - if (lenbyte >= sizeof(size_t)) { + static_assert(sizeof(size_t) >= 4, "size_t too small"); + if (lenbyte >= 4) { return 0; } slen = 0; @@ -228,7 +231,7 @@ bool CPubKey::Decompress() { bool CPubKey::Derive(CPubKey& pubkeyChild, ChainCode &ccChild, unsigned int nChild, const ChainCode& cc) const { assert(IsValid()); assert((nChild >> 31) == 0); - assert(begin() + 33 == end()); + assert(size() == 33); unsigned char out[64]; BIP32Hash(cc, nChild, *begin(), begin()+1, out); memcpy(ccChild.begin(), out+32, 32); From 8a38e6c1d0a39b9116de3dab3c244f501d8d18c2 Mon Sep 17 00:00:00 2001 From: Boris Hajduk Date: Wed, 7 Jun 2017 15:49:49 +0800 Subject: [PATCH 0098/1062] documentatin z_validateaddress was missing param --- doc/payment-api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/payment-api.md b/doc/payment-api.md index c4127b223..5dc0eb907 100644 --- a/doc/payment-api.md +++ b/doc/payment-api.md @@ -55,7 +55,7 @@ Command | Parameters | Description --- | --- | --- z_getnewaddress | | Return a new zaddr for sending and receiving payments. The spending key for this zaddr will be added to the node’s wallet.

Output:
zN68D8hSs3... z_listaddresses | | Returns a list of all the zaddrs in this node’s wallet for which you have a spending key.

Output:
{ [“z123…”, “z456...”, “z789...”] } -z_validateaddress | | Return information about a given zaddr.

Output:
{"isvalid" : true,
"address" : "zcWsmq...",
"payingkey" : "f5bb3c...",
"transmissionkey" : "7a58c7...",
"ismine" : true} +z_validateaddress | zaddr | Return information about a given zaddr.

Output:
{"isvalid" : true,
"address" : "zcWsmq...",
"payingkey" : "f5bb3c...",
"transmissionkey" : "7a58c7...",
"ismine" : true} ### Key Management From e6dc07bc6907c36760e38b4b1fe9db44949d57b2 Mon Sep 17 00:00:00 2001 From: kozyilmaz Date: Fri, 9 Jun 2017 13:15:27 +0300 Subject: [PATCH 0099/1062] support per platform filename and hash setting for dependencies --- depends/funcs.mk | 4 ++++ depends/packages/rust.mk | 6 ++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/depends/funcs.mk b/depends/funcs.mk index db13ac8eb..bda04d5a2 100644 --- a/depends/funcs.mk +++ b/depends/funcs.mk @@ -43,6 +43,10 @@ $(eval $(1)_build_id_long:=$(1)-$($(1)_version)-$($(1)_recipe_hash)-$(release_ty $(eval $(1)_build_id:=$(shell echo -n "$($(1)_build_id_long)" | $(build_SHA256SUM) | cut -c-$(HASH_LENGTH))) final_build_id_long+=$($(package)_build_id_long) +#override platform specific files and hashes +$(eval $(1)_file_name=$(if $($(1)_file_name_$(host_os)),$($(1)_file_name_$(host_os)),$($(1)_file_name))) +$(eval $(1)_sha256_hash=$(if $($(1)_sha256_hash_$(host_os)),$($(1)_sha256_hash_$(host_os)),$($(1)_sha256_hash))) + #compute package-specific paths $(1)_build_subdir?=. $(1)_download_file?=$($(1)_file_name) diff --git a/depends/packages/rust.mk b/depends/packages/rust.mk index cdefbdbee..f61dd2230 100644 --- a/depends/packages/rust.mk +++ b/depends/packages/rust.mk @@ -1,8 +1,10 @@ package=rust $(package)_version=1.16.0 $(package)_download_path=https://static.rust-lang.org/dist -$(package)_file_name=rust-$($(package)_version)-x86_64-unknown-linux-gnu.tar.gz -$(package)_sha256_hash=48621912c242753ba37cad5145df375eeba41c81079df46f93ffb4896542e8fd +$(package)_file_name_linux=rust-$($(package)_version)-x86_64-unknown-linux-gnu.tar.gz +$(package)_sha256_hash_linux=48621912c242753ba37cad5145df375eeba41c81079df46f93ffb4896542e8fd +$(package)_file_name_darwin=rust-$($(package)_version)-x86_64-apple-darwin.tar.gz +$(package)_sha256_hash_darwin=2d08259ee038d3a2c77a93f1a31fc59e7a1d6d1bbfcba3dba3c8213b2e5d1926 define $(package)_stage_cmds ./install.sh --destdir=$($(package)_staging_dir) --prefix=$(host_prefix)/native --disable-ldconfig From c93a0872e852ced0591bc6c22fdba60cf57312d7 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 11 Jun 2017 23:13:14 -0700 Subject: [PATCH 0100/1062] Fix intermediate vpub_new leakage in multi joinsplit tx (#1360) --- src/wallet/asyncrpcoperation_sendmany.cpp | 480 ++++++++++------------ 1 file changed, 210 insertions(+), 270 deletions(-) diff --git a/src/wallet/asyncrpcoperation_sendmany.cpp b/src/wallet/asyncrpcoperation_sendmany.cpp index 1691452b8..00915c68f 100644 --- a/src/wallet/asyncrpcoperation_sendmany.cpp +++ b/src/wallet/asyncrpcoperation_sendmany.cpp @@ -342,9 +342,14 @@ bool AsyncRPCOperation_sendmany::main_impl() { tx_ = CTransaction(mtx); // Copy zinputs and zoutputs to more flexible containers - std::deque zInputsDeque; + std::deque zInputsDeque; // zInputsDeque stores minimum numbers of notes for target amount + CAmount tmp = 0; for (auto o : z_inputs_) { zInputsDeque.push_back(o); + tmp += std::get<2>(o); + if (tmp >= targetAmount) { + break; + } } std::deque zOutputsDeque; for (auto o : z_outputs_) { @@ -442,283 +447,216 @@ bool AsyncRPCOperation_sendmany::main_impl() { * zaddr -> taddrs * -> zaddrs * - * Processing order: - * Part 1: taddrs and miners fee - * Part 2: zaddrs - */ - - /** - * SCENARIO #3 - * Part 1: Add to the transparent value pool. + * Send to zaddrs by chaining JoinSplits together and immediately consuming any change + * Send to taddrs by creating dummy z outputs and accumulating value in a change note + * which is used to set vpub_new in the last chained joinsplit. */ UniValue obj(UniValue::VOBJ); CAmount jsChange = 0; // this is updated after each joinsplit int changeOutputIndex = -1; // this is updated after each joinsplit if jsChange > 0 - bool minersFeeProcessed = false; - + bool vpubNewProcessed = false; // updated when vpub_new for miner fee and taddr outputs is set in last joinsplit + CAmount vpubNewTarget = minersFee; if (t_outputs_total > 0) { add_taddr_outputs_to_tx(); - CAmount taddrTargetAmount = t_outputs_total + minersFee; - minersFeeProcessed = true; - while (zInputsDeque.size() > 0 && taddrTargetAmount > 0) { - AsyncJoinSplitInfo info; - info.vpub_old = 0; - info.vpub_new = 0; - std::vector outPoints; - int n = 0; - while (n++ < ZC_NUM_JS_INPUTS && taddrTargetAmount > 0) { - SendManyInputJSOP o = zInputsDeque.front(); - JSOutPoint outPoint = std::get<0>(o); - Note note = std::get<1>(o); - CAmount noteFunds = std::get<2>(o); - zInputsDeque.pop_front(); - - info.notes.push_back(note); - outPoints.push_back(outPoint); - - int wtxHeight = -1; - int wtxDepth = -1; - { - LOCK2(cs_main, pwalletMain->cs_wallet); - const CWalletTx& wtx = pwalletMain->mapWallet[outPoint.hash]; - wtxHeight = mapBlockIndex[wtx.hashBlock]->nHeight; - wtxDepth = wtx.GetDepthInMainChain(); - } - LogPrint("zrpcunsafe", "%s: spending note (txid=%s, vjoinsplit=%d, ciphertext=%d, amount=%s, height=%d, confirmations=%d)\n", - getId(), - outPoint.hash.ToString().substr(0, 10), - outPoint.js, - int(outPoint.n), // uint8_t - FormatMoney(noteFunds), - wtxHeight, - wtxDepth - ); - - - // Put value back into the value pool - if (noteFunds >= taddrTargetAmount) { - jsChange = noteFunds - taddrTargetAmount; - info.vpub_new += taddrTargetAmount; - } else { - info.vpub_new += noteFunds; - } - - taddrTargetAmount -= noteFunds; - if (taddrTargetAmount <= 0) { - break; - } - } - - if (jsChange > 0) { - info.vjsout.push_back(JSOutput()); - info.vjsout.push_back(JSOutput(frompaymentaddress_, jsChange)); - - LogPrint("zrpcunsafe", "%s: generating note for change (amount=%s)\n", - getId(), - FormatMoney(jsChange) - ); - } - - obj = perform_joinsplit(info, outPoints); - - if (jsChange > 0) { - changeOutputIndex = find_output(obj, 1); - } - } + vpubNewTarget += t_outputs_total; } + // Keep track of treestate within this transaction + boost::unordered_map intermediates; + std::vector previousCommitments; - /** - * SCENARIO #3 - * Part 2: Send to zaddrs by chaining JoinSplits together and immediately consuming any change - */ - if (z_outputs_total>0) { + while (!vpubNewProcessed) { + AsyncJoinSplitInfo info; + info.vpub_old = 0; + info.vpub_new = 0; - // Keep track of treestate within this transaction - boost::unordered_map intermediates; - std::vector previousCommitments; - - while (zOutputsDeque.size() > 0) { - AsyncJoinSplitInfo info; - info.vpub_old = 0; - info.vpub_new = 0; + CAmount jsInputValue = 0; + uint256 jsAnchor; + std::vector> witnesses; - CAmount jsInputValue = 0; - uint256 jsAnchor; - std::vector> witnesses; + JSDescription prevJoinSplit; - JSDescription prevJoinSplit; + // Keep track of previous JoinSplit and its commitments + if (tx_.vjoinsplit.size() > 0) { + prevJoinSplit = tx_.vjoinsplit.back(); + } - // Keep track of previous JoinSplit and its commitments - if (tx_.vjoinsplit.size() > 0) { - prevJoinSplit = tx_.vjoinsplit.back(); + // If there is no change, the chain has terminated so we can reset the tracked treestate. + if (jsChange==0 && tx_.vjoinsplit.size() > 0) { + intermediates.clear(); + previousCommitments.clear(); + } + + // + // Consume change as the first input of the JoinSplit. + // + if (jsChange > 0) { + LOCK2(cs_main, pwalletMain->cs_wallet); + + // Update tree state with previous joinsplit + ZCIncrementalMerkleTree tree; + auto it = intermediates.find(prevJoinSplit.anchor); + if (it != intermediates.end()) { + tree = it->second; + } else if (!pcoinsTip->GetAnchorAt(prevJoinSplit.anchor, tree)) { + throw JSONRPCError(RPC_WALLET_ERROR, "Could not find previous JoinSplit anchor"); } - - // If there is no change, the chain has terminated so we can reset the tracked treestate. - if (jsChange==0 && tx_.vjoinsplit.size() > 0) { - intermediates.clear(); - previousCommitments.clear(); + + assert(changeOutputIndex != -1); + boost::optional changeWitness; + int n = 0; + for (const uint256& commitment : prevJoinSplit.commitments) { + tree.append(commitment); + previousCommitments.push_back(commitment); + if (!changeWitness && changeOutputIndex == n++) { + changeWitness = tree.witness(); + } else if (changeWitness) { + changeWitness.get().append(commitment); + } } + if (changeWitness) { + witnesses.push_back(changeWitness); + } + jsAnchor = tree.root(); + intermediates.insert(std::make_pair(tree.root(), tree)); // chained js are interstitial (found in between block boundaries) + + // Decrypt the change note's ciphertext to retrieve some data we need + ZCNoteDecryption decryptor(spendingkey_.viewing_key()); + auto hSig = prevJoinSplit.h_sig(*pzcashParams, tx_.joinSplitPubKey); + try { + NotePlaintext plaintext = NotePlaintext::decrypt( + decryptor, + prevJoinSplit.ciphertexts[changeOutputIndex], + prevJoinSplit.ephemeralKey, + hSig, + (unsigned char) changeOutputIndex); + + Note note = plaintext.note(frompaymentaddress_); + info.notes.push_back(note); + + jsInputValue += plaintext.value; + + LogPrint("zrpcunsafe", "%s: spending change (amount=%s)\n", + getId(), + FormatMoney(plaintext.value) + ); + + } catch (const std::exception& e) { + throw JSONRPCError(RPC_WALLET_ERROR, strprintf("Error decrypting output note of previous JoinSplit: %s", e.what())); + } + } + + + // + // Consume spendable non-change notes + // + std::vector vInputNotes; + std::vector vOutPoints; + std::vector> vInputWitnesses; + uint256 inputAnchor; + int numInputsNeeded = (jsChange>0) ? 1 : 0; + while (numInputsNeeded++ < ZC_NUM_JS_INPUTS && zInputsDeque.size() > 0) { + SendManyInputJSOP t = zInputsDeque.front(); + JSOutPoint jso = std::get<0>(t); + Note note = std::get<1>(t); + CAmount noteFunds = std::get<2>(t); + zInputsDeque.pop_front(); + + WitnessAnchorData wad = jsopWitnessAnchorMap[ jso.ToString() ]; + vInputWitnesses.push_back(wad.witness); + if (inputAnchor.IsNull()) { + inputAnchor = wad.anchor; + } else if (inputAnchor != wad.anchor) { + throw JSONRPCError(RPC_WALLET_ERROR, "Selected input notes do not share the same anchor"); + } + + vOutPoints.push_back(jso); + vInputNotes.push_back(note); - // - // Consume change as the first input of the JoinSplit. - // - if (jsChange > 0) { + jsInputValue += noteFunds; + + int wtxHeight = -1; + int wtxDepth = -1; + { LOCK2(cs_main, pwalletMain->cs_wallet); - - // Update tree state with previous joinsplit - ZCIncrementalMerkleTree tree; - auto it = intermediates.find(prevJoinSplit.anchor); - if (it != intermediates.end()) { - tree = it->second; - } else if (!pcoinsTip->GetAnchorAt(prevJoinSplit.anchor, tree)) { - throw JSONRPCError(RPC_WALLET_ERROR, "Could not find previous JoinSplit anchor"); - } - - assert(changeOutputIndex != -1); - boost::optional changeWitness; - int n = 0; - for (const uint256& commitment : prevJoinSplit.commitments) { - tree.append(commitment); - previousCommitments.push_back(commitment); - if (!changeWitness && changeOutputIndex == n++) { - changeWitness = tree.witness(); - } else if (changeWitness) { - changeWitness.get().append(commitment); - } - } - if (changeWitness) { - witnesses.push_back(changeWitness); - } - jsAnchor = tree.root(); - intermediates.insert(std::make_pair(tree.root(), tree)); // chained js are interstitial (found in between block boundaries) - - // Decrypt the change note's ciphertext to retrieve some data we need - ZCNoteDecryption decryptor(spendingkey_.viewing_key()); - auto hSig = prevJoinSplit.h_sig(*pzcashParams, tx_.joinSplitPubKey); - try { - NotePlaintext plaintext = NotePlaintext::decrypt( - decryptor, - prevJoinSplit.ciphertexts[changeOutputIndex], - prevJoinSplit.ephemeralKey, - hSig, - (unsigned char) changeOutputIndex); - - Note note = plaintext.note(frompaymentaddress_); - info.notes.push_back(note); + const CWalletTx& wtx = pwalletMain->mapWallet[jso.hash]; + wtxHeight = mapBlockIndex[wtx.hashBlock]->nHeight; + wtxDepth = wtx.GetDepthInMainChain(); + } + LogPrint("zrpcunsafe", "%s: spending note (txid=%s, vjoinsplit=%d, ciphertext=%d, amount=%s, height=%d, confirmations=%d)\n", + getId(), + jso.hash.ToString().substr(0, 10), + jso.js, + int(jso.n), // uint8_t + FormatMoney(noteFunds), + wtxHeight, + wtxDepth + ); + } - jsInputValue += plaintext.value; - - LogPrint("zrpcunsafe", "%s: spending change (amount=%s)\n", - getId(), - FormatMoney(plaintext.value) - ); + // Add history of previous commitments to witness + if (vInputNotes.size() > 0) { - } catch (const std::exception& e) { - throw JSONRPCError(RPC_WALLET_ERROR, strprintf("Error decrypting output note of previous JoinSplit: %s", e.what())); - } + if (vInputWitnesses.size()==0) { + throw JSONRPCError(RPC_WALLET_ERROR, "Could not find witness for note commitment"); } - - // - // Consume spendable non-change notes - // - std::vector vInputNotes; - std::vector vOutPoints; - std::vector> vInputWitnesses; - uint256 inputAnchor; - int numInputsNeeded = (jsChange>0) ? 1 : 0; - while (numInputsNeeded++ < ZC_NUM_JS_INPUTS && zInputsDeque.size() > 0) { - SendManyInputJSOP t = zInputsDeque.front(); - JSOutPoint jso = std::get<0>(t); - Note note = std::get<1>(t); - CAmount noteFunds = std::get<2>(t); - zInputsDeque.pop_front(); - - WitnessAnchorData wad = jsopWitnessAnchorMap[ jso.ToString() ]; - vInputWitnesses.push_back(wad.witness); - if (inputAnchor.IsNull()) { - inputAnchor = wad.anchor; - } else if (inputAnchor != wad.anchor) { - throw JSONRPCError(RPC_WALLET_ERROR, "Selected input notes do not share the same anchor"); + for (auto & optionalWitness : vInputWitnesses) { + if (!optionalWitness) { + throw JSONRPCError(RPC_WALLET_ERROR, "Witness for note commitment is null"); } - - vOutPoints.push_back(jso); - vInputNotes.push_back(note); - - jsInputValue += noteFunds; - - int wtxHeight = -1; - int wtxDepth = -1; - { - LOCK2(cs_main, pwalletMain->cs_wallet); - const CWalletTx& wtx = pwalletMain->mapWallet[jso.hash]; - wtxHeight = mapBlockIndex[wtx.hashBlock]->nHeight; - wtxDepth = wtx.GetDepthInMainChain(); - } - LogPrint("zrpcunsafe", "%s: spending note (txid=%s, vjoinsplit=%d, ciphertext=%d, amount=%s, height=%d, confirmations=%d)\n", - getId(), - jso.hash.ToString().substr(0, 10), - jso.js, - int(jso.n), // uint8_t - FormatMoney(noteFunds), - wtxHeight, - wtxDepth - ); - } - - // Add history of previous commitments to witness - if (vInputNotes.size() > 0) { - - if (vInputWitnesses.size()==0) { - throw JSONRPCError(RPC_WALLET_ERROR, "Could not find witness for note commitment"); - } - - for (auto & optionalWitness : vInputWitnesses) { - if (!optionalWitness) { - throw JSONRPCError(RPC_WALLET_ERROR, "Witness for note commitment is null"); + ZCIncrementalWitness w = *optionalWitness; // could use .get(); + if (jsChange > 0) { + for (const uint256& commitment : previousCommitments) { + w.append(commitment); } - ZCIncrementalWitness w = *optionalWitness; // could use .get(); - if (jsChange > 0) { - for (const uint256& commitment : previousCommitments) { - w.append(commitment); - } - if (jsAnchor != w.root()) { - throw JSONRPCError(RPC_WALLET_ERROR, "Witness for spendable note does not have same anchor as change input"); - } + if (jsAnchor != w.root()) { + throw JSONRPCError(RPC_WALLET_ERROR, "Witness for spendable note does not have same anchor as change input"); } - witnesses.push_back(w); } - - // The jsAnchor is null if this JoinSplit is at the start of a new chain - if (jsAnchor.IsNull()) { - jsAnchor = inputAnchor; - } - - // Add spendable notes as inputs - std::copy(vInputNotes.begin(), vInputNotes.end(), std::back_inserter(info.notes)); + witnesses.push_back(w); } - - // - // Find recipient to transfer funds to - // + // The jsAnchor is null if this JoinSplit is at the start of a new chain + if (jsAnchor.IsNull()) { + jsAnchor = inputAnchor; + } + + // Add spendable notes as inputs + std::copy(vInputNotes.begin(), vInputNotes.end(), std::back_inserter(info.notes)); + } + + // Find recipient to transfer funds to + std::string address, hexMemo; + CAmount value = 0; + if (zOutputsDeque.size() > 0) { SendManyRecipient smr = zOutputsDeque.front(); - std::string address = std::get<0>(smr); - CAmount value = std::get<1>(smr); - std::string hexMemo = std::get<2>(smr); + address = std::get<0>(smr); + value = std::get<1>(smr); + hexMemo = std::get<2>(smr); zOutputsDeque.pop_front(); + } - // Will we have any change? Has the miners fee been processed yet? - jsChange = 0; - CAmount outAmount = value; - if (!minersFeeProcessed) { - if (jsInputValue < minersFee) { - throw JSONRPCError(RPC_WALLET_ERROR, "Not enough funds to pay miners fee"); - } - outAmount += minersFee; + // Reset change + jsChange = 0; + CAmount outAmount = value; + + // Set vpub_new in the last joinsplit (when there are no more notes to spend or zaddr outputs to satisfy) + if (zOutputsDeque.size() == 0 && zInputsDeque.size() == 0) { + assert(!vpubNewProcessed); + if (jsInputValue < vpubNewTarget) { + throw JSONRPCError(RPC_WALLET_ERROR, + strprintf("Insufficient funds for vpub_new %s (miners fee %s, taddr outputs %s)", + FormatMoney(vpubNewTarget), FormatMoney(minersFee), FormatMoney(t_outputs_total))); } - + outAmount += vpubNewTarget; + info.vpub_new += vpubNewTarget; // funds flowing back to public pool + vpubNewProcessed = true; + jsChange = jsInputValue - outAmount; + assert(jsChange >= 0); + } + else { + // This is not the last joinsplit, so compute change and any amount still due to the recipient if (jsInputValue > outAmount) { jsChange = jsInputValue - outAmount; } else if (outAmount > jsInputValue) { @@ -729,42 +667,44 @@ bool AsyncRPCOperation_sendmany::main_impl() { // reduce the amount being sent right now to the value of all inputs value = jsInputValue; - if (!minersFeeProcessed) { - value -= minersFee; - } } - - if (!minersFeeProcessed) { - minersFeeProcessed = true; - info.vpub_new += minersFee; // funds flowing back to public pool - } - - // create output for recipient + } + + // create output for recipient + if (address.empty()) { + assert(value==0); + info.vjsout.push_back(JSOutput()); // dummy output while we accumulate funds into a change note for vpub_new + } else { PaymentAddress pa = CZCPaymentAddress(address).Get(); JSOutput jso = JSOutput(pa, value); if (hexMemo.size() > 0) { jso.memo = get_memo_from_hex_string(hexMemo); } info.vjsout.push_back(jso); - - // create output for any change - if (jsChange>0) { - info.vjsout.push_back(JSOutput(frompaymentaddress_, jsChange)); + } - LogPrint("zrpcunsafe", "%s: generating note for change (amount=%s)\n", - getId(), - FormatMoney(jsChange) - ); - } + // create output for any change + if (jsChange>0) { + info.vjsout.push_back(JSOutput(frompaymentaddress_, jsChange)); - obj = perform_joinsplit(info, witnesses, jsAnchor); + LogPrint("zrpcunsafe", "%s: generating note for change (amount=%s)\n", + getId(), + FormatMoney(jsChange) + ); + } - if (jsChange > 0) { - changeOutputIndex = find_output(obj, 1); - } + obj = perform_joinsplit(info, witnesses, jsAnchor); + + if (jsChange > 0) { + changeOutputIndex = find_output(obj, 1); } } + // Sanity check in case changes to code block above exits loop by invoking 'break' + assert(zInputsDeque.size() == 0); + assert(zOutputsDeque.size() == 0); + assert(vpubNewProcessed); + sign_send_raw_transaction(obj); return true; } From be60c6d7f6a0759a5360bef6f7e5db21e07234f0 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 15 Jun 2017 16:32:36 +1200 Subject: [PATCH 0101/1062] Rename FALLBACK_DOWNLOAD_PATH to PRIORITY_DOWNLOAD_PATH Closes #1621. --- depends/Makefile | 2 +- depends/README.md | 2 +- depends/funcs.mk | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/depends/Makefile b/depends/Makefile index 90cb83394..a7c3477c5 100644 --- a/depends/Makefile +++ b/depends/Makefile @@ -5,7 +5,7 @@ BASE_CACHE ?= $(BASEDIR)/built SDK_PATH ?= $(BASEDIR)/SDKs NO_WALLET ?= NO_UPNP ?= -FALLBACK_DOWNLOAD_PATH ?= https://z.cash/depends-sources +PRIORITY_DOWNLOAD_PATH ?= https://z.cash/depends-sources BUILD ?= $(shell ./config.guess) HOST ?= $(BUILD) diff --git a/depends/README.md b/depends/README.md index 663d49584..09296cc47 100644 --- a/depends/README.md +++ b/depends/README.md @@ -33,7 +33,7 @@ The following can be set when running make: make FOO=bar SOURCES_PATH: downloaded sources will be placed here BASE_CACHE: built packages will be placed here SDK_PATH: Path where sdk's can be found (used by OSX) - FALLBACK_DOWNLOAD_PATH: If a source file can't be fetched, try here before giving up + PRIORITY_DOWNLOAD_PATH: Try fetching source files from here before using their own URLs NO_WALLET: Don't download/build/cache libs needed to enable the wallet NO_UPNP: Don't download/build/cache packages needed for enabling upnp DEBUG: disable some optimizations and enable more runtime checking diff --git a/depends/funcs.mk b/depends/funcs.mk index db13ac8eb..91794b477 100644 --- a/depends/funcs.mk +++ b/depends/funcs.mk @@ -22,7 +22,7 @@ endef define fetch_file (test -f $$($(1)_source_dir)/$(4) || \ ( mkdir -p $$($(1)_download_dir) && echo Fetching $(1)... && \ - ( $(build_DOWNLOAD) "$$($(1)_download_dir)/$(4).temp" "$(FALLBACK_DOWNLOAD_PATH)/$(4)" || \ + ( $(build_DOWNLOAD) "$$($(1)_download_dir)/$(4).temp" "$(PRIORITY_DOWNLOAD_PATH)/$(4)" || \ $(build_DOWNLOAD) "$$($(1)_download_dir)/$(4).temp" "$(2)/$(3)" ) && \ echo "$(5) $$($(1)_download_dir)/$(4).temp" > $$($(1)_download_dir)/.$(4).hash && \ $(build_SHA256SUM) -c $$($(1)_download_dir)/.$(4).hash && \ From 1b786a93c36bd15b9d3fe42a061aaf87e6366ca0 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 14 Jun 2017 15:33:11 +1200 Subject: [PATCH 0102/1062] Add test for incorrect consensus logic --- src/Makefile.gtest.include | 1 + src/gtest/test_validation.cpp | 63 +++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 src/gtest/test_validation.cpp diff --git a/src/Makefile.gtest.include b/src/Makefile.gtest.include index e4e126866..ababfa557 100644 --- a/src/Makefile.gtest.include +++ b/src/Makefile.gtest.include @@ -32,6 +32,7 @@ zcash_gtest_SOURCES += \ gtest/test_random.cpp \ gtest/test_rpc.cpp \ gtest/test_transaction.cpp \ + gtest/test_validation.cpp \ gtest/test_circuit.cpp \ gtest/test_txid.cpp \ gtest/test_libzcash_utils.cpp \ diff --git a/src/gtest/test_validation.cpp b/src/gtest/test_validation.cpp new file mode 100644 index 000000000..21ed20d84 --- /dev/null +++ b/src/gtest/test_validation.cpp @@ -0,0 +1,63 @@ +#include + +#include "consensus/validation.h" +#include "main.h" + +// Fake an empty view +class FakeCoinsViewDB : public CCoinsView { +public: + FakeCoinsViewDB() {} + + bool GetAnchorAt(const uint256 &rt, ZCIncrementalMerkleTree &tree) const { + return false; + } + + bool GetNullifier(const uint256 &nf) const { + return false; + } + + bool GetCoins(const uint256 &txid, CCoins &coins) const { + return false; + } + + bool HaveCoins(const uint256 &txid) const { + return false; + } + + uint256 GetBestBlock() const { + uint256 a; + return a; + } + + uint256 GetBestAnchor() const { + uint256 a; + return a; + } + + bool BatchWrite(CCoinsMap &mapCoins, + const uint256 &hashBlock, + const uint256 &hashAnchor, + CAnchorsMap &mapAnchors, + CNullifiersMap &mapNullifiers) { + return false; + } + + bool GetStats(CCoinsStats &stats) const { + return false; + } +}; + +TEST(Validation, ContextualCheckInputsPassesWithCoinbase) { + // Create fake coinbase transaction + CMutableTransaction mtx; + mtx.vin.resize(1); + CTransaction tx(mtx); + ASSERT_TRUE(tx.IsCoinBase()); + + // Fake an empty view + FakeCoinsViewDB fakeDB; + CCoinsViewCache view(&fakeDB); + + CValidationState state; + EXPECT_TRUE(ContextualCheckInputs(tx, state, view, false, 0, false, Params(CBaseChainParams::MAIN).GetConsensus())); +} From 30006a2e79fb184cd5fad14797a42f6a36bf7a29 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 18 May 2017 13:21:00 +1200 Subject: [PATCH 0103/1062] Correct consensus logic in ContextualCheckInputs Closes #2385. --- src/main.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index a3de5e6d7..6d8acde0c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1687,11 +1687,12 @@ bool CheckTxInputs(const CTransaction& tx, CValidationState& state, const CCoins bool ContextualCheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsViewCache &inputs, bool fScriptChecks, unsigned int flags, bool cacheStore, const Consensus::Params& consensusParams, std::vector *pvChecks) { - if (!Consensus::CheckTxInputs(tx, state, inputs, GetSpendHeight(inputs), consensusParams)) - return false; - if (!tx.IsCoinBase()) { + if (!Consensus::CheckTxInputs(tx, state, inputs, GetSpendHeight(inputs), consensusParams)) { + return false; + } + if (pvChecks) pvChecks->reserve(tx.vin.size()); From c032f1b687ee90cb1f24a6b446e3dcd6ec4b86ad Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 6 Jun 2017 17:44:17 +1200 Subject: [PATCH 0104/1062] Add comments --- src/key.cpp | 23 +++++++++++++++++++++++ src/script/interpreter.cpp | 6 ++++++ 2 files changed, 29 insertions(+) diff --git a/src/key.cpp b/src/key.cpp index ffc2407a3..98fc64c55 100644 --- a/src/key.cpp +++ b/src/key.cpp @@ -17,6 +17,22 @@ static secp256k1_context* secp256k1_context_sign = NULL; /** These functions are taken from the libsecp256k1 distribution and are very ugly. */ + +/** + * This parses a format loosely based on a DER encoding of the ECPrivateKey type from + * section C.4 of SEC 1 , with the following caveats: + * + * * The octet-length of the SEQUENCE must be encoded as 1 or 2 octets. It is not + * required to be encoded as one octet if it is less than 256, as DER would require. + * * The octet-length of the SEQUENCE must not be greater than the remaining + * length of the key encoding, but need not match it (i.e. the encoding may contain + * junk after the encoded SEQUENCE). + * * The privateKey OCTET STRING is zero-filled on the left to 32 octets. + * * Anything after the encoding of the privateKey OCTET STRING is ignored, whether + * or not it is validly encoded DER. + * + * out32 must point to an output buffer of length at least 32 bytes. + */ static int ec_privkey_import_der(const secp256k1_context* ctx, unsigned char *out32, const unsigned char *privkey, size_t privkeylen) { const unsigned char *end = privkey + privkeylen; size_t lenb = 0; @@ -66,6 +82,13 @@ static int ec_privkey_import_der(const secp256k1_context* ctx, unsigned char *ou return 1; } +/** + * This serializes to a DER encoding of the ECPrivateKey type from section C.4 of SEC 1 + * . The optional parameters and publicKey fields are + * included. + * + * key32 must point to a 32-byte raw private key. + */ static int ec_privkey_export_der(const secp256k1_context *ctx, unsigned char *privkey, size_t *privkeylen, const unsigned char *key32, int compressed) { secp256k1_pubkey pubkey; size_t pubkeylen = 0; diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index df1f1ccd5..1145e429a 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -164,7 +164,13 @@ bool static IsLowDERSignature(const valtype &vchSig, ScriptError* serror) { if (!IsValidSignatureEncoding(vchSig)) { return set_error(serror, SCRIPT_ERR_SIG_DER); } + // https://bitcoin.stackexchange.com/a/12556: + // Also note that inside transaction signatures, an extra hashtype byte + // follows the actual signature data. std::vector vchSigCopy(vchSig.begin(), vchSig.begin() + vchSig.size() - 1); + // If the S value is above the order of the curve divided by two, its + // complement modulo the order could have been used instead, which is + // one byte shorter when encoded correctly. return CPubKey::CheckLowS(vchSigCopy); } From f16175471a835c8788bf0dee26d4e7f5abf64528 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 6 Jun 2017 18:03:50 +1200 Subject: [PATCH 0105/1062] Update Debian copyright list --- contrib/debian/copyright | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/contrib/debian/copyright b/contrib/debian/copyright index f1316160a..5eb71ebb2 100644 --- a/contrib/debian/copyright +++ b/contrib/debian/copyright @@ -63,6 +63,14 @@ Files: depends/sources/qpid-proton-*.tar.gz Copyright: 2012-2017 The Apache Software Foundation License: Apache-Qpid-Proton-with-BSD-Subcomponents +Files: src/secp256k1/build-aux/m4/ax_jni_include_dir.m4 +Copyright: 2008 Don Anderson +License: GNU-All-permissive-License + +Files: src/secp256k1/build-aux/m4/ax_prog_cc_for_build.m4 +Copyright: 2008 Paolo Bonzini +License: GNU-All-permissive-License + License: Boost-Software-License-1.0 Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by @@ -1312,3 +1320,9 @@ License: Apache-Qpid-Proton-with-BSD-Subcomponents conditions in the license: proton-c/bindings/python/setuputils/PYZMQ_LICENSE.BSD. +License: GNU-All-permissive-License + Copying and distribution of this file, with or without modification, are + permitted in any medium without royalty provided the copyright notice + and this notice are preserved. This file is offered as-is, without any + warranty. + From 877964c82fc132efca9bb294d2e4ab9b8f31c9ef Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 6 Jun 2017 19:21:34 +1200 Subject: [PATCH 0106/1062] Specify ECDSA constant sizes as constants --- src/key.cpp | 24 +++++++++++++++--------- src/key.h | 12 +++++++----- src/pubkey.cpp | 20 ++++++++++---------- src/pubkey.h | 21 ++++++++++++--------- 4 files changed, 44 insertions(+), 33 deletions(-) diff --git a/src/key.cpp b/src/key.cpp index 98fc64c55..f78d06786 100644 --- a/src/key.cpp +++ b/src/key.cpp @@ -87,9 +87,13 @@ static int ec_privkey_import_der(const secp256k1_context* ctx, unsigned char *ou * . The optional parameters and publicKey fields are * included. * + * privkey must point to an output buffer of length at least PRIVATE_KEY_SIZE bytes. + * privkeylen must initially be set to the size of the privkey buffer. Upon return it + * will be set to the number of bytes used in the buffer. * key32 must point to a 32-byte raw private key. */ static int ec_privkey_export_der(const secp256k1_context *ctx, unsigned char *privkey, size_t *privkeylen, const unsigned char *key32, int compressed) { + assert(*privkeylen >= PRIVATE_KEY_SIZE); secp256k1_pubkey pubkey; size_t pubkeylen = 0; if (!secp256k1_ec_pubkey_create(ctx, &pubkey, key32)) { @@ -115,10 +119,11 @@ static int ec_privkey_export_der(const secp256k1_context *ctx, unsigned char *pr memcpy(ptr, begin, sizeof(begin)); ptr += sizeof(begin); memcpy(ptr, key32, 32); ptr += 32; memcpy(ptr, middle, sizeof(middle)); ptr += sizeof(middle); - pubkeylen = 33; + pubkeylen = COMPRESSED_PUBLIC_KEY_SIZE; secp256k1_ec_pubkey_serialize(ctx, ptr, &pubkeylen, &pubkey, SECP256K1_EC_COMPRESSED); ptr += pubkeylen; *privkeylen = ptr - privkey; + assert(*privkeylen == COMPRESSED_PRIVATE_KEY_SIZE); } else { static const unsigned char begin[] = { 0x30,0x82,0x01,0x13,0x02,0x01,0x01,0x04,0x20 @@ -140,10 +145,11 @@ static int ec_privkey_export_der(const secp256k1_context *ctx, unsigned char *pr memcpy(ptr, begin, sizeof(begin)); ptr += sizeof(begin); memcpy(ptr, key32, 32); ptr += 32; memcpy(ptr, middle, sizeof(middle)); ptr += sizeof(middle); - pubkeylen = 65; + pubkeylen = PUBLIC_KEY_SIZE; secp256k1_ec_pubkey_serialize(ctx, ptr, &pubkeylen, &pubkey, SECP256K1_EC_UNCOMPRESSED); ptr += pubkeylen; *privkeylen = ptr - privkey; + assert(*privkeylen == PRIVATE_KEY_SIZE); } return 1; } @@ -173,8 +179,8 @@ CPrivKey CKey::GetPrivKey() const { CPrivKey privkey; int ret; size_t privkeylen; - privkey.resize(279); - privkeylen = 279; + privkey.resize(PRIVATE_KEY_SIZE); + privkeylen = PRIVATE_KEY_SIZE; ret = ec_privkey_export_der(secp256k1_context_sign, (unsigned char*)&privkey[0], &privkeylen, begin(), fCompressed ? SECP256K1_EC_COMPRESSED : SECP256K1_EC_UNCOMPRESSED); assert(ret); privkey.resize(privkeylen); @@ -184,7 +190,7 @@ CPrivKey CKey::GetPrivKey() const { CPubKey CKey::GetPubKey() const { assert(fValid); secp256k1_pubkey pubkey; - size_t clen = 65; + size_t clen = PUBLIC_KEY_SIZE; CPubKey result; int ret = secp256k1_ec_pubkey_create(secp256k1_context_sign, &pubkey, begin()); assert(ret); @@ -197,8 +203,8 @@ CPubKey CKey::GetPubKey() const { bool CKey::Sign(const uint256 &hash, std::vector& vchSig, uint32_t test_case) const { if (!fValid) return false; - vchSig.resize(72); - size_t nSigLen = 72; + vchSig.resize(SIGNATURE_SIZE); + size_t nSigLen = SIGNATURE_SIZE; unsigned char extra_entropy[32] = {0}; WriteLE32(extra_entropy, test_case); secp256k1_ecdsa_signature sig; @@ -226,7 +232,7 @@ bool CKey::VerifyPubKey(const CPubKey& pubkey) const { bool CKey::SignCompact(const uint256 &hash, std::vector& vchSig) const { if (!fValid) return false; - vchSig.resize(65); + vchSig.resize(COMPACT_SIGNATURE_SIZE); int rec = -1; secp256k1_ecdsa_recoverable_signature sig; int ret = secp256k1_ecdsa_sign_recoverable(secp256k1_context_sign, &sig, hash.begin(), begin(), secp256k1_nonce_function_rfc6979, NULL); @@ -257,7 +263,7 @@ bool CKey::Derive(CKey& keyChild, ChainCode &ccChild, unsigned int nChild, const LockObject(out); if ((nChild >> 31) == 0) { CPubKey pubkey = GetPubKey(); - assert(pubkey.size() == 33); + assert(pubkey.size() == COMPRESSED_PUBLIC_KEY_SIZE); BIP32Hash(cc, nChild, *pubkey.begin(), pubkey.begin()+1, out); } else { assert(size() == 32); diff --git a/src/key.h b/src/key.h index 021eac2a8..292769098 100644 --- a/src/key.h +++ b/src/key.h @@ -1,5 +1,6 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto // Copyright (c) 2009-2014 The Bitcoin Core developers +// Copyright (c) 2017 The Zcash developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. @@ -17,17 +18,18 @@ /** * secp256k1: - * const unsigned int PRIVATE_KEY_SIZE = 279; - * const unsigned int PUBLIC_KEY_SIZE = 65; - * const unsigned int SIGNATURE_SIZE = 72; - * + */ +const unsigned int PRIVATE_KEY_SIZE = 279; +const unsigned int COMPRESSED_PRIVATE_KEY_SIZE = 214; +/** * see www.keylength.com * script supports up to 75 for single byte push */ /** * secure_allocator is defined in allocators.h - * CPrivKey is a serialized private key, with all parameters included (279 bytes) + * CPrivKey is a serialized private key, with all parameters included + * (PRIVATE_KEY_SIZE bytes) */ typedef std::vector > CPrivKey; diff --git a/src/pubkey.cpp b/src/pubkey.cpp index e710c4644..949adbb93 100644 --- a/src/pubkey.cpp +++ b/src/pubkey.cpp @@ -188,7 +188,7 @@ bool CPubKey::Verify(const uint256 &hash, const std::vector& vchS } bool CPubKey::RecoverCompact(const uint256 &hash, const std::vector& vchSig) { - if (vchSig.size() != 65) + if (vchSig.size() != COMPACT_SIGNATURE_SIZE) return false; int recid = (vchSig[0] - 27) & 3; bool fComp = ((vchSig[0] - 27) & 4) != 0; @@ -200,8 +200,8 @@ bool CPubKey::RecoverCompact(const uint256 &hash, const std::vector> 31) == 0); - assert(size() == 33); + assert(size() == COMPRESSED_PUBLIC_KEY_SIZE); unsigned char out[64]; BIP32Hash(cc, nChild, *begin(), begin()+1, out); memcpy(ccChild.begin(), out+32, 32); @@ -242,8 +242,8 @@ bool CPubKey::Derive(CPubKey& pubkeyChild, ChainCode &ccChild, unsigned int nChi if (!secp256k1_ec_pubkey_tweak_add(secp256k1_context_verify, &pubkey, out)) { return false; } - unsigned char pub[33]; - size_t publen = 33; + unsigned char pub[COMPRESSED_PUBLIC_KEY_SIZE]; + size_t publen = COMPRESSED_PUBLIC_KEY_SIZE; secp256k1_ec_pubkey_serialize(secp256k1_context_verify, pub, &publen, &pubkey, SECP256K1_EC_COMPRESSED); pubkeyChild.Set(pub, pub + publen); return true; @@ -255,8 +255,8 @@ void CExtPubKey::Encode(unsigned char code[74]) const { code[5] = (nChild >> 24) & 0xFF; code[6] = (nChild >> 16) & 0xFF; code[7] = (nChild >> 8) & 0xFF; code[8] = (nChild >> 0) & 0xFF; memcpy(code+9, chaincode.begin(), 32); - assert(pubkey.size() == 33); - memcpy(code+41, pubkey.begin(), 33); + assert(pubkey.size() == COMPRESSED_PUBLIC_KEY_SIZE); + memcpy(code+41, pubkey.begin(), COMPRESSED_PUBLIC_KEY_SIZE); } void CExtPubKey::Decode(const unsigned char code[74]) { diff --git a/src/pubkey.h b/src/pubkey.h index a1d437e70..fb1352266 100644 --- a/src/pubkey.h +++ b/src/pubkey.h @@ -1,5 +1,6 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto // Copyright (c) 2009-2014 The Bitcoin Core developers +// Copyright (c) 2017 The Zcash developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. @@ -15,10 +16,12 @@ /** * secp256k1: - * const unsigned int PRIVATE_KEY_SIZE = 279; - * const unsigned int PUBLIC_KEY_SIZE = 65; - * const unsigned int SIGNATURE_SIZE = 72; - * + */ +const unsigned int PUBLIC_KEY_SIZE = 65; +const unsigned int COMPRESSED_PUBLIC_KEY_SIZE = 33; +const unsigned int SIGNATURE_SIZE = 72; +const unsigned int COMPACT_SIGNATURE_SIZE = 65; +/** * see www.keylength.com * script supports up to 75 for single byte push */ @@ -42,15 +45,15 @@ private: * Just store the serialized data. * Its length can very cheaply be computed from the first byte. */ - unsigned char vch[65]; + unsigned char vch[PUBLIC_KEY_SIZE]; //! Compute the length of a pubkey with a given first byte. unsigned int static GetLen(unsigned char chHeader) { if (chHeader == 2 || chHeader == 3) - return 33; + return COMPRESSED_PUBLIC_KEY_SIZE; if (chHeader == 4 || chHeader == 6 || chHeader == 7) - return 65; + return PUBLIC_KEY_SIZE; return 0; } @@ -129,7 +132,7 @@ public: void Unserialize(Stream& s, int nType, int nVersion) { unsigned int len = ::ReadCompactSize(s); - if (len <= 65) { + if (len <= PUBLIC_KEY_SIZE) { s.read((char*)vch, len); } else { // invalid pubkey, skip available data @@ -168,7 +171,7 @@ public: //! Check whether this is a compressed public key. bool IsCompressed() const { - return size() == 33; + return size() == COMPRESSED_PUBLIC_KEY_SIZE; } /** From 1f5941062a3338999aaa64c0ab89495adca09fbc Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 6 Jun 2017 20:28:37 +1200 Subject: [PATCH 0107/1062] Remove redundant `= 0` initialisations --- src/key.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/key.cpp b/src/key.cpp index f78d06786..9da5ec891 100644 --- a/src/key.cpp +++ b/src/key.cpp @@ -35,8 +35,6 @@ static secp256k1_context* secp256k1_context_sign = NULL; */ static int ec_privkey_import_der(const secp256k1_context* ctx, unsigned char *out32, const unsigned char *privkey, size_t privkeylen) { const unsigned char *end = privkey + privkeylen; - size_t lenb = 0; - size_t len = 0; memset(out32, 0, 32); /* sequence header */ if (end - privkey < 1 || *privkey != 0x30u) { @@ -47,7 +45,7 @@ static int ec_privkey_import_der(const secp256k1_context* ctx, unsigned char *ou if (end - privkey < 1 || !(*privkey & 0x80u)) { return 0; } - lenb = *privkey & ~0x80u; privkey++; + size_t lenb = *privkey & ~0x80u; privkey++; if (lenb < 1 || lenb > 2) { return 0; } @@ -55,7 +53,7 @@ static int ec_privkey_import_der(const secp256k1_context* ctx, unsigned char *ou return 0; } /* sequence length */ - len = privkey[lenb-1] | (lenb > 1 ? privkey[lenb-2] << 8 : 0u); + size_t len = privkey[lenb-1] | (lenb > 1 ? privkey[lenb-2] << 8 : 0u); privkey += lenb; if (end - privkey < len) { return 0; From fd0d1c7d603ff33c65a596c005aa2408481ae52c Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 8 Jun 2017 16:07:49 +1200 Subject: [PATCH 0108/1062] Ensure that ECDSA constant sizes are correctly-sized --- src/key.cpp | 3 +++ src/pubkey.h | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/key.cpp b/src/key.cpp index 9da5ec891..a43131613 100644 --- a/src/key.cpp +++ b/src/key.cpp @@ -92,6 +92,9 @@ static int ec_privkey_import_der(const secp256k1_context* ctx, unsigned char *ou */ static int ec_privkey_export_der(const secp256k1_context *ctx, unsigned char *privkey, size_t *privkeylen, const unsigned char *key32, int compressed) { assert(*privkeylen >= PRIVATE_KEY_SIZE); + static_assert( + PRIVATE_KEY_SIZE >= COMPRESSED_PRIVATE_KEY_SIZE, + "COMPRESSED_PRIVATE_KEY_SIZE is larger than PRIVATE_KEY_SIZE"); secp256k1_pubkey pubkey; size_t pubkeylen = 0; if (!secp256k1_ec_pubkey_create(ctx, &pubkey, key32)) { diff --git a/src/pubkey.h b/src/pubkey.h index fb1352266..fcfa019cf 100644 --- a/src/pubkey.h +++ b/src/pubkey.h @@ -46,6 +46,9 @@ private: * Its length can very cheaply be computed from the first byte. */ unsigned char vch[PUBLIC_KEY_SIZE]; + static_assert( + PUBLIC_KEY_SIZE >= COMPRESSED_PUBLIC_KEY_SIZE, + "COMPRESSED_PUBLIC_KEY_SIZE is larger than PUBLIC_KEY_SIZE"); //! Compute the length of a pubkey with a given first byte. unsigned int static GetLen(unsigned char chHeader) From da6d93916d1d1080e6be7f589dd84a8b5848e1c6 Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 4 May 2017 11:35:08 -0700 Subject: [PATCH 0109/1062] Add option 'mempooltxinputlimit' so the mempool can reject a transaction based on the number of transparent inputs. --- src/init.cpp | 12 ++++++++++++ src/main.cpp | 11 +++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/init.cpp b/src/init.cpp index ec3553c46..c3b4dc45d 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -332,6 +332,7 @@ std::string HelpMessage(HelpMessageMode mode) strUsage += HelpMessageOpt("-dbcache=", strprintf(_("Set database cache size in megabytes (%d to %d, default: %d)"), nMinDbCache, nMaxDbCache, nDefaultDbCache)); strUsage += HelpMessageOpt("-loadblock=", _("Imports blocks from external blk000??.dat file") + " " + _("on startup")); strUsage += HelpMessageOpt("-maxorphantx=", strprintf(_("Keep at most unconnectable transactions in memory (default: %u)"), DEFAULT_MAX_ORPHAN_TRANSACTIONS)); + strUsage += HelpMessageOpt("-mempooltxinputlimit=", _("Set the maximum number of transparent inputs in a transaction that the mempool will accept (default: 0 = no limit applied)")); strUsage += HelpMessageOpt("-par=", strprintf(_("Set the number of script verification threads (%u to %d, 0 = auto, <0 = leave that many cores free, default: %d)"), -(int)boost::thread::hardware_concurrency(), MAX_SCRIPTCHECK_THREADS, DEFAULT_SCRIPTCHECK_THREADS)); #ifndef WIN32 @@ -1009,6 +1010,17 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) } #endif + // Default value of 0 for mempooltxinputlimit means no limit is applied + if (mapArgs.count("-mempooltxinputlimit")) { + int64_t limit = GetArg("-mempooltxinputlimit", 0); + if (limit < 0) { + return InitError(_("Mempool limit on transparent inputs to a transaction cannot be negative")); + } else if (limit > 0) { + LogPrintf("Mempool configured to reject transactions with greater than %lld transparent inputs\n", limit); + } + } + + // ********************************************************* Step 4: application initialization: dir lock, daemonize, pidfile, debug log // Initialize libsodium diff --git a/src/main.cpp b/src/main.cpp index ab91ee41e..e68970300 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1057,6 +1057,17 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa if (pfMissingInputs) *pfMissingInputs = false; + // Node operator can choose to reject tx by number of transparent inputs + static_assert(std::numeric_limits::max() >= std::numeric_limits::max(), "size_t too small"); + size_t limit = (size_t) GetArg("-mempooltxinputlimit", 0); + if (limit > 0) { + size_t n = tx.vin.size(); + if (n > limit) { + LogPrint("mempool", "Dropping txid %s : too many transparent inputs %zu > limit %zu\n", tx.GetHash().ToString(), n, limit ); + return false; + } + } + auto verifier = libzcash::ProofVerifier::Strict(); if (!CheckTransaction(tx, state, verifier)) return error("AcceptToMemoryPool: CheckTransaction failed"); From 5799c5f8c02cabe964970207b1d00708e7bbe25a Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Sat, 17 Jun 2017 14:59:16 +1200 Subject: [PATCH 0110/1062] Add test for -mempooltxinputlimit --- src/gtest/test_mempool.cpp | 45 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/src/gtest/test_mempool.cpp b/src/gtest/test_mempool.cpp index 88b0e2593..e84b2dead 100644 --- a/src/gtest/test_mempool.cpp +++ b/src/gtest/test_mempool.cpp @@ -1,10 +1,13 @@ #include #include +#include "consensus/validation.h" #include "core_io.h" +#include "main.h" #include "primitives/transaction.h" #include "txmempool.h" #include "policy/fees.h" +#include "util.h" // Fake the input of transaction 5295156213414ed77f6e538e7e8ebe14492156906b9fe995b242477818789364 // - 532639cc6bebed47c1c69ae36dd498c68a012e74ad12729adbd3dbb56f8f3f4a, 0 @@ -87,3 +90,45 @@ TEST(Mempool, PriorityStatsDoNotCrash) { EXPECT_EQ(dPriority, MAX_PRIORITY); } + +TEST(Mempool, TxInputLimit) { + CTxMemPool pool(::minRelayTxFee); + bool missingInputs; + + // Create an obviously-invalid transaction + CMutableTransaction mtx; + mtx.nVersion = 0; + mtx.vin.resize(10); + + // Check it fails as expected + CValidationState state1; + CTransaction tx1(mtx); + EXPECT_FALSE(AcceptToMemoryPool(pool, state1, tx1, false, &missingInputs)); + EXPECT_EQ(state1.GetRejectReason(), "bad-txns-version-too-low"); + + // Set a limit + mapArgs["-mempooltxinputlimit"] = "10"; + + // Check it stil fails as expected + CValidationState state2; + EXPECT_FALSE(AcceptToMemoryPool(pool, state2, tx1, false, &missingInputs)); + EXPECT_EQ(state2.GetRejectReason(), "bad-txns-version-too-low"); + + // Resize the transaction + mtx.vin.resize(11); + + // Check it now fails due to exceeding the limit + CValidationState state3; + CTransaction tx3(mtx); + EXPECT_FALSE(AcceptToMemoryPool(pool, state3, tx3, false, &missingInputs)); + EXPECT_NE(state3.GetRejectReason(), "bad-txns-version-too-low"); + + // Clear the limit + mapArgs.erase("-mempooltxinputlimit"); + + // Check it no longer fails due to exceeding the limit + CValidationState state4; + EXPECT_FALSE(AcceptToMemoryPool(pool, state4, tx3, false, &missingInputs)); + EXPECT_EQ(state4.GetRejectReason(), "bad-txns-version-too-low"); +} + From b661736b87974f9bf27641336c6183b0ecc06f53 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Sun, 18 Jun 2017 02:15:05 +1200 Subject: [PATCH 0111/1062] Hold an ECCVerifyHandle in zcash-gtest --- src/gtest/main.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/gtest/main.cpp b/src/gtest/main.cpp index 84e6f867c..d1ffa628a 100644 --- a/src/gtest/main.cpp +++ b/src/gtest/main.cpp @@ -1,9 +1,17 @@ #include "gtest/gtest.h" #include "crypto/common.h" +#include "pubkey.h" #include "libsnark/common/default_types/r1cs_ppzksnark_pp.hpp" #include "libsnark/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.hpp" +struct ECCryptoClosure +{ + ECCVerifyHandle handle; +}; + +ECCryptoClosure instance_of_eccryptoclosure; + int main(int argc, char **argv) { assert(init_and_check_sodium() != -1); libsnark::default_r1cs_ppzksnark_pp::init_public_params(); From 3c985d26ce73dfabe7c1ac5a047d4f96c217c9ca Mon Sep 17 00:00:00 2001 From: Daira Hopwood Date: Sun, 7 May 2017 18:34:47 +0100 Subject: [PATCH 0112/1062] Remove unneeded lax ECDSA signature verification. Signed-off-by: Daira Hopwood --- src/pubkey.cpp | 161 ++----------------------------------------------- 1 file changed, 6 insertions(+), 155 deletions(-) diff --git a/src/pubkey.cpp b/src/pubkey.cpp index 949adbb93..6e50a1334 100644 --- a/src/pubkey.cpp +++ b/src/pubkey.cpp @@ -14,158 +14,6 @@ namespace secp256k1_context* secp256k1_context_verify = NULL; } -/** This function is taken from the libsecp256k1 distribution and implements - * DER parsing for ECDSA signatures, while supporting an arbitrary subset of - * format violations. - * - * Supported violations include negative integers, excessive padding, garbage - * at the end, and overly long length descriptors. This is safe to use in - * Bitcoin because since the activation of BIP66, signatures are verified to be - * strict DER before being passed to this module, and we know it supports all - * violations present in the blockchain before that point. - */ -static int ecdsa_signature_parse_der_lax(const secp256k1_context* ctx, secp256k1_ecdsa_signature* sig, const unsigned char *input, size_t inputlen) { - size_t rpos, rlen, spos, slen; - size_t pos = 0; - size_t lenbyte; - unsigned char tmpsig[64] = {0}; - int overflow = 0; - - /* Hack to initialize sig with a correctly-parsed but invalid signature. */ - secp256k1_ecdsa_signature_parse_compact(ctx, sig, tmpsig); - - /* Sequence tag byte */ - if (pos == inputlen || input[pos] != 0x30) { - return 0; - } - pos++; - - /* Sequence length bytes */ - if (pos == inputlen) { - return 0; - } - lenbyte = input[pos++]; - if (lenbyte & 0x80) { - lenbyte -= 0x80; - if (lenbyte > inputlen - pos) { - return 0; - } - pos += lenbyte; - } - - /* Integer tag byte for R */ - if (pos == inputlen || input[pos] != 0x02) { - return 0; - } - pos++; - - /* Integer length for R */ - if (pos == inputlen) { - return 0; - } - lenbyte = input[pos++]; - if (lenbyte & 0x80) { - lenbyte -= 0x80; - if (lenbyte > inputlen - pos) { - return 0; - } - while (lenbyte > 0 && input[pos] == 0) { - pos++; - lenbyte--; - } - static_assert(sizeof(size_t) >= 4, "size_t too small"); - if (lenbyte >= 4) { - return 0; - } - rlen = 0; - while (lenbyte > 0) { - rlen = (rlen << 8) + input[pos]; - pos++; - lenbyte--; - } - } else { - rlen = lenbyte; - } - if (rlen > inputlen - pos) { - return 0; - } - rpos = pos; - pos += rlen; - - /* Integer tag byte for S */ - if (pos == inputlen || input[pos] != 0x02) { - return 0; - } - pos++; - - /* Integer length for S */ - if (pos == inputlen) { - return 0; - } - lenbyte = input[pos++]; - if (lenbyte & 0x80) { - lenbyte -= 0x80; - if (lenbyte > inputlen - pos) { - return 0; - } - while (lenbyte > 0 && input[pos] == 0) { - pos++; - lenbyte--; - } - static_assert(sizeof(size_t) >= 4, "size_t too small"); - if (lenbyte >= 4) { - return 0; - } - slen = 0; - while (lenbyte > 0) { - slen = (slen << 8) + input[pos]; - pos++; - lenbyte--; - } - } else { - slen = lenbyte; - } - if (slen > inputlen - pos) { - return 0; - } - spos = pos; - pos += slen; - - /* Ignore leading zeroes in R */ - while (rlen > 0 && input[rpos] == 0) { - rlen--; - rpos++; - } - /* Copy R value */ - if (rlen > 32) { - overflow = 1; - } else { - memcpy(tmpsig + 32 - rlen, input + rpos, rlen); - } - - /* Ignore leading zeroes in S */ - while (slen > 0 && input[spos] == 0) { - slen--; - spos++; - } - /* Copy S value */ - if (slen > 32) { - overflow = 1; - } else { - memcpy(tmpsig + 64 - slen, input + spos, slen); - } - - if (!overflow) { - overflow = !secp256k1_ecdsa_signature_parse_compact(ctx, sig, tmpsig); - } - if (overflow) { - /* Overwrite the result again with a correctly-parsed but invalid - signature if parsing failed. */ - memset(tmpsig, 0, 64); - secp256k1_ecdsa_signature_parse_compact(ctx, sig, tmpsig); - } - return 1; -} bool CPubKey::Verify(const uint256 &hash, const std::vector& vchSig) const { if (!IsValid()) @@ -178,11 +26,12 @@ bool CPubKey::Verify(const uint256 &hash, const std::vector& vchS if (vchSig.size() == 0) { return false; } - if (!ecdsa_signature_parse_der_lax(secp256k1_context_verify, &sig, &vchSig[0], vchSig.size())) { + /* Zcash, unlike Bitcoin, has always enforced strict DER signatures. */ + if (!secp256k1_ecdsa_signature_parse_der(secp256k1_context_verify, &sig, &vchSig[0], vchSig.size())) { return false; } /* libsecp256k1's ECDSA verification requires lower-S signatures, which have - * not historically been enforced in Bitcoin, so normalize them first. */ + * not historically been enforced in Bitcoin or Zcash, so normalize them first. */ secp256k1_ecdsa_signature_normalize(secp256k1_context_verify, &sig, &sig); return secp256k1_ecdsa_verify(secp256k1_context_verify, &sig, hash.begin(), &pubkey); } @@ -277,7 +126,9 @@ bool CExtPubKey::Derive(CExtPubKey &out, unsigned int nChild) const { /* static */ bool CPubKey::CheckLowS(const std::vector& vchSig) { secp256k1_ecdsa_signature sig; - if (!ecdsa_signature_parse_der_lax(secp256k1_context_verify, &sig, &vchSig[0], vchSig.size())) { + + /* Zcash, unlike Bitcoin, has always enforced strict DER signatures. */ + if (!secp256k1_ecdsa_signature_parse_der(secp256k1_context_verify, &sig, &vchSig[0], vchSig.size())) { return false; } return (!secp256k1_ecdsa_signature_normalize(secp256k1_context_verify, NULL, &sig)); From de609b8c540a174d340021175d5911e640db6cf9 Mon Sep 17 00:00:00 2001 From: Daira Hopwood Date: Sun, 7 May 2017 19:46:41 +0100 Subject: [PATCH 0113/1062] Strict DER signatures are always enforced; remove the flag and code that used it. Signed-off-by: Daira Hopwood --- src/main.cpp | 14 +---- src/script/interpreter.cpp | 2 +- src/script/interpreter.h | 3 +- src/script/standard.h | 7 +-- src/script/zcashconsensus.h | 1 - src/test/data/script_invalid.json | 98 +++++++++---------------------- src/test/data/script_valid.json | 70 +--------------------- src/test/script_tests.cpp | 91 ++++++---------------------- src/test/transaction_tests.cpp | 1 - 9 files changed, 57 insertions(+), 230 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index c253e834c..81901ade5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2078,19 +2078,9 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin REJECT_INVALID, "bad-txns-BIP30"); } - unsigned int flags = SCRIPT_VERIFY_P2SH; + unsigned int flags = SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY; - // Start enforcing the DERSIG (BIP66) rules, for block.nVersion=3 blocks, - // when 75% of the network has upgraded: - if (block.nVersion >= 3) { - flags |= SCRIPT_VERIFY_DERSIG; - } - - // Start enforcing CHECKLOCKTIMEVERIFY, (BIP65) for block.nVersion=4 - // blocks, when 75% of the network has upgraded: - if (block.nVersion >= 4) { - flags |= SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY; - } + // DERSIG (BIP66) is also always enforced, but does not have a flag. CBlockUndo blockundo; diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 1145e429a..e61b4bb49 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -191,7 +191,7 @@ bool static CheckSignatureEncoding(const valtype &vchSig, unsigned int flags, Sc if (vchSig.size() == 0) { return true; } - if ((flags & (SCRIPT_VERIFY_DERSIG | SCRIPT_VERIFY_LOW_S | SCRIPT_VERIFY_STRICTENC)) != 0 && !IsValidSignatureEncoding(vchSig)) { + if (!IsValidSignatureEncoding(vchSig)) { return set_error(serror, SCRIPT_ERR_SIG_DER); } else if ((flags & SCRIPT_VERIFY_LOW_S) != 0 && !IsLowDERSignature(vchSig, serror)) { // serror is set diff --git a/src/script/interpreter.h b/src/script/interpreter.h index b94916fac..f467f08fc 100644 --- a/src/script/interpreter.h +++ b/src/script/interpreter.h @@ -45,7 +45,8 @@ enum SCRIPT_VERIFY_STRICTENC = (1U << 1), // Passing a non-strict-DER signature to a checksig operation causes script failure (softfork safe, BIP62 rule 1) - SCRIPT_VERIFY_DERSIG = (1U << 2), + // In Zcash this is required, and validation of non-strict-DER signatures is not implemented. + //SCRIPT_VERIFY_DERSIG = (1U << 2), // Passing a non-strict-DER signature or one with S > order/2 to a checksig operation causes script failure // (softfork safe, BIP62 rule 5). diff --git a/src/script/standard.h b/src/script/standard.h index 6d72bad23..da778878b 100644 --- a/src/script/standard.h +++ b/src/script/standard.h @@ -31,9 +31,8 @@ extern unsigned nMaxDatacarrierBytes; /** * Mandatory script verification flags that all new blocks must comply with for * them to be valid. (but old blocks may not comply with) Currently just P2SH, - * but in the future other flags may be added, such as a soft-fork to enforce - * strict DER encoding. - * + * but in the future other flags may be added. + * * Failing one of these tests may trigger a DoS ban - see CheckInputs() for * details. */ @@ -45,7 +44,7 @@ static const unsigned int MANDATORY_SCRIPT_VERIFY_FLAGS = SCRIPT_VERIFY_P2SH; * blocks and we must accept those blocks. */ static const unsigned int STANDARD_SCRIPT_VERIFY_FLAGS = MANDATORY_SCRIPT_VERIFY_FLAGS | - SCRIPT_VERIFY_DERSIG | + // SCRIPT_VERIFY_DERSIG is always enforced SCRIPT_VERIFY_STRICTENC | SCRIPT_VERIFY_MINIMALDATA | SCRIPT_VERIFY_NULLDUMMY | diff --git a/src/script/zcashconsensus.h b/src/script/zcashconsensus.h index a68921d90..65e40bbb6 100644 --- a/src/script/zcashconsensus.h +++ b/src/script/zcashconsensus.h @@ -46,7 +46,6 @@ enum { zcashconsensus_SCRIPT_FLAGS_VERIFY_NONE = 0, zcashconsensus_SCRIPT_FLAGS_VERIFY_P2SH = (1U << 0), // evaluate P2SH (BIP16) subscripts - zcashconsensus_SCRIPT_FLAGS_VERIFY_DERSIG = (1U << 2), // enforce strict DER (BIP66) compliance zcashconsensus_SCRIPT_FLAGS_VERIFY_CHECKLOCKTIMEVERIFY = (1U << 9), // enable CHECKLOCKTIMEVERIFY (BIP65) }; diff --git a/src/test/data/script_invalid.json b/src/test/data/script_invalid.json index 7afa2abf4..7a50b8330 100644 --- a/src/test/data/script_invalid.json +++ b/src/test/data/script_invalid.json @@ -523,14 +523,14 @@ ], ["Increase DERSIG test coverage"], -["0x4a 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "0 CHECKSIG NOT", "DERSIG", "Overly long signature is incorrectly encoded for DERSIG"], -["0x25 0x30220220000000000000000000000000000000000000000000000000000000000000000000", "0 CHECKSIG NOT", "DERSIG", "Missing S is incorrectly encoded for DERSIG"], -["0x27 0x3024021077777777777777777777777777777777020a7777777777777777777777777777777701", "0 CHECKSIG NOT", "DERSIG", "S with invalid S length is incorrectly encoded for DERSIG"], -["0x27 0x302403107777777777777777777777777777777702107777777777777777777777777777777701", "0 CHECKSIG NOT", "DERSIG", "Non-integer R is incorrectly encoded for DERSIG"], -["0x27 0x302402107777777777777777777777777777777703107777777777777777777777777777777701", "0 CHECKSIG NOT", "DERSIG", "Non-integer S is incorrectly encoded for DERSIG"], -["0x17 0x3014020002107777777777777777777777777777777701", "0 CHECKSIG NOT", "DERSIG", "Zero-length R is incorrectly encoded for DERSIG"], -["0x17 0x3014021077777777777777777777777777777777020001", "0 CHECKSIG NOT", "DERSIG", "Zero-length S is incorrectly encoded for DERSIG"], -["0x27 0x302402107777777777777777777777777777777702108777777777777777777777777777777701", "0 CHECKSIG NOT", "DERSIG", "Negative S is incorrectly encoded for DERSIG"], +["0x4a 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "0 CHECKSIG NOT", "", "Overly long signature is incorrectly encoded"], +["0x25 0x30220220000000000000000000000000000000000000000000000000000000000000000000", "0 CHECKSIG NOT", "", "Missing S is incorrectly encoded"], +["0x27 0x3024021077777777777777777777777777777777020a7777777777777777777777777777777701", "0 CHECKSIG NOT", "", "S with invalid S length is incorrectly encoded"], +["0x27 0x302403107777777777777777777777777777777702107777777777777777777777777777777701", "0 CHECKSIG NOT", "", "Non-integer R is incorrectly encoded"], +["0x27 0x302402107777777777777777777777777777777703107777777777777777777777777777777701", "0 CHECKSIG NOT", "", "Non-integer S is incorrectly encoded"], +["0x17 0x3014020002107777777777777777777777777777777701", "0 CHECKSIG NOT", "", "Zero-length R is incorrectly encoded"], +["0x17 0x3014021077777777777777777777777777777777020001", "0 CHECKSIG NOT", "", "Zero-length S is incorrectly encoded"], +["0x27 0x302402107777777777777777777777777777777702108777777777777777777777777777777701", "0 CHECKSIG NOT", "", "Negative S is incorrectly encoded"], ["Automatically generated test cases"], [ @@ -578,140 +578,98 @@ [ "0x47 0x304402200060558477337b9022e70534f1fea71a318caf836812465a2509931c5e7c4987022078ec32bd50ac9e03a349ba953dfd9fe1c8d2dd8bdb1d38ddca844d3d5c78c11801", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG", - "DERSIG", + "", "P2PK with too much R padding" ], [ "0x48 0x304502202de8c03fc525285c9c535631019a5f2af7c6454fa9eb392a3756a4917c420edd02210046130bf2baf7cfc065067c8b9e33a066d9c15edcea9feb0ca2d233e3597925b401", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG", - "DERSIG", + "", "P2PK with too much S padding" ], [ "0x47 0x30440220d7a0417c3f6d1a15094d1cf2a3378ca0503eb8a57630953a9e2987e21ddd0a6502207a6266d686c99090920249991d3d42065b6d43eb70187b219c0db82e4f94d1a201", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG", - "DERSIG", + "", "P2PK with too little R padding" ], [ "0x47 0x30440220005ece1335e7f757a1a1f476a7fb5bd90964e8a022489f890614a04acfb734c002206c12b8294a6513c7710e8c82d3c23d75cdbfe83200eb7efb495701958501a5d601", "0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG NOT", - "DERSIG", + "", "P2PK NOT with bad sig with too much R padding" ], [ "0x47 0x30440220005ece1335e7f657a1a1f476a7fb5bd90964e8a022489f890614a04acfb734c002206c12b8294a6513c7710e8c82d3c23d75cdbfe83200eb7efb495701958501a5d601", "0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG NOT", "", - "P2PK NOT with too much R padding but no DERSIG" -], -[ - "0x47 0x30440220005ece1335e7f657a1a1f476a7fb5bd90964e8a022489f890614a04acfb734c002206c12b8294a6513c7710e8c82d3c23d75cdbfe83200eb7efb495701958501a5d601", - "0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG NOT", - "DERSIG", "P2PK NOT with too much R padding" ], [ "0x47 0x30440220d7a0417c3f6d1a15094d1cf2a3378ca0503eb8a57630953a9e2987e21ddd0a6502207a6266d686c99090920249991d3d42065b6d43eb70187b219c0db82e4f94d1a201", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG", - "DERSIG", - "BIP66 example 1, with DERSIG" + "", + "BIP66 example 1" ], [ "0x47 0x304402208e43c0b91f7c1e5bc58e41c8185f8a6086e111b0090187968a86f2822462d3c902200a58f4076b1133b18ff1dc83ee51676e44c60cc608d9534e0df5ace0424fc0be01", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT", "", - "BIP66 example 2, without DERSIG" -], -[ - "0x47 0x304402208e43c0b91f7c1e5bc58e41c8185f8a6086e111b0090187968a86f2822462d3c902200a58f4076b1133b18ff1dc83ee51676e44c60cc608d9534e0df5ace0424fc0be01", - "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT", - "DERSIG", - "BIP66 example 2, with DERSIG" + "BIP66 example 2" ], [ "0", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG", "", - "BIP66 example 3, without DERSIG" -], -[ - "0", - "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG", - "DERSIG", - "BIP66 example 3, with DERSIG" + "BIP66 example 3" ], [ "1", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG", "", - "BIP66 example 5, without DERSIG" -], -[ - "1", - "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG", - "DERSIG", - "BIP66 example 5, with DERSIG" + "BIP66 example 5" ], [ "1", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT", - "DERSIG", - "BIP66 example 6, with DERSIG" + "", + "BIP66 example 6" ], [ "0 0x47 0x30440220cae00b1444babfbf6071b0ba8707f6bd373da3df494d6e74119b0430c5db810502205d5231b8c5939c8ff0c82242656d6e06edb073d42af336c99fe8837c36ea39d501 0x47 0x3044022027c2714269ca5aeecc4d70edc88ba5ee0e3da4986e9216028f489ab4f1b8efce022022bd545b4951215267e4c5ceabd4c5350331b2e4a0b6494c56f361fa5a57a1a201", "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG", - "DERSIG", - "BIP66 example 7, with DERSIG" + "", + "BIP66 example 7" ], [ "0 0x47 0x30440220b119d67d389315308d1745f734a51ff3ec72e06081e84e236fdf9dc2f5d2a64802204b04e3bc38674c4422ea317231d642b56dc09d214a1ecbbf16ecca01ed996e2201 0x47 0x3044022079ea80afd538d9ada421b5101febeb6bc874e01dde5bca108c1d0479aec339a4022004576db8f66130d1df686ccf00935703689d69cf539438da1edab208b0d63c4801", "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT", "", - "BIP66 example 8, without DERSIG" -], -[ - "0 0x47 0x30440220b119d67d389315308d1745f734a51ff3ec72e06081e84e236fdf9dc2f5d2a64802204b04e3bc38674c4422ea317231d642b56dc09d214a1ecbbf16ecca01ed996e2201 0x47 0x3044022079ea80afd538d9ada421b5101febeb6bc874e01dde5bca108c1d0479aec339a4022004576db8f66130d1df686ccf00935703689d69cf539438da1edab208b0d63c4801", - "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT", - "DERSIG", - "BIP66 example 8, with DERSIG" + "BIP66 example 8" ], [ "0 0 0x47 0x3044022081aa9d436f2154e8b6d600516db03d78de71df685b585a9807ead4210bd883490220534bb6bdf318a419ac0749660b60e78d17d515558ef369bf872eff405b676b2e01", "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG", "", - "BIP66 example 9, without DERSIG" -], -[ - "0 0 0x47 0x3044022081aa9d436f2154e8b6d600516db03d78de71df685b585a9807ead4210bd883490220534bb6bdf318a419ac0749660b60e78d17d515558ef369bf872eff405b676b2e01", - "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG", - "DERSIG", - "BIP66 example 9, with DERSIG" + "BIP66 example 9" ], [ "0 0 0x47 0x30440220da6f441dc3b4b2c84cfa8db0cd5b34ed92c9e01686de5a800d40498b70c0dcac02207c2cf91b0c32b860c4cd4994be36cfb84caf8bb7c3a8e4d96a31b2022c5299c501", "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT", - "DERSIG", - "BIP66 example 10, with DERSIG" + "", + "BIP66 example 10" ], [ "0 0x47 0x30440220cae00b1444babfbf6071b0ba8707f6bd373da3df494d6e74119b0430c5db810502205d5231b8c5939c8ff0c82242656d6e06edb073d42af336c99fe8837c36ea39d501 0", "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG", "", - "BIP66 example 11, without DERSIG" -], -[ - "0 0x47 0x30440220cae00b1444babfbf6071b0ba8707f6bd373da3df494d6e74119b0430c5db810502205d5231b8c5939c8ff0c82242656d6e06edb073d42af336c99fe8837c36ea39d501 0", - "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG", - "DERSIG", - "BIP66 example 11, with DERSIG" + "BIP66 example 11" ], [ "0x48 0x304402203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022054e1c258c2981cdfba5df1f46661fb6541c44f77ca0092f3600331abfffb12510101", "0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG", - "DERSIG", - "P2PK with multi-byte hashtype, with DERSIG" + "", + "P2PK with multi-byte hashtype" ], [ "0x48 0x304502203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022100ab1e3da73d67e32045a20e0b999e049978ea8d6ee5480d485fcf2ce0d03b2ef001", diff --git a/src/test/data/script_valid.json b/src/test/data/script_valid.json index 4b10e3f1a..aed78e7fb 100644 --- a/src/test/data/script_valid.json +++ b/src/test/data/script_valid.json @@ -743,83 +743,17 @@ "P2SH", "P2SH(2-of-3)" ], -[ - "0x47 0x304402200060558477337b9022e70534f1fea71a318caf836812465a2509931c5e7c4987022078ec32bd50ac9e03a349ba953dfd9fe1c8d2dd8bdb1d38ddca844d3d5c78c11801", - "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG", - "", - "P2PK with too much R padding but no DERSIG" -], -[ - "0x48 0x304502202de8c03fc525285c9c535631019a5f2af7c6454fa9eb392a3756a4917c420edd02210046130bf2baf7cfc065067c8b9e33a066d9c15edcea9feb0ca2d233e3597925b401", - "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG", - "", - "P2PK with too much S padding but no DERSIG" -], -[ - "0x47 0x30440220d7a0417c3f6d1a15094d1cf2a3378ca0503eb8a57630953a9e2987e21ddd0a6502207a6266d686c99090920249991d3d42065b6d43eb70187b219c0db82e4f94d1a201", - "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG", - "", - "P2PK with too little R padding but no DERSIG" -], -[ - "0x47 0x30440220005ece1335e7f757a1a1f476a7fb5bd90964e8a022489f890614a04acfb734c002206c12b8294a6513c7710e8c82d3c23d75cdbfe83200eb7efb495701958501a5d601", - "0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG NOT", - "", - "P2PK NOT with bad sig with too much R padding but no DERSIG" -], -[ - "0x47 0x30440220d7a0417c3f6d1a15094d1cf2a3378ca0503eb8a57630953a9e2987e21ddd0a6502207a6266d686c99090920249991d3d42065b6d43eb70187b219c0db82e4f94d1a201", - "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG", - "", - "BIP66 example 1, without DERSIG" -], [ "0", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT", "", - "BIP66 example 4, without DERSIG" -], -[ - "0", - "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT", - "DERSIG", - "BIP66 example 4, with DERSIG" -], -[ - "1", - "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT", - "", - "BIP66 example 6, without DERSIG" -], -[ - "0 0x47 0x30440220cae00b1444babfbf6071b0ba8707f6bd373da3df494d6e74119b0430c5db810502205d5231b8c5939c8ff0c82242656d6e06edb073d42af336c99fe8837c36ea39d501 0x47 0x3044022027c2714269ca5aeecc4d70edc88ba5ee0e3da4986e9216028f489ab4f1b8efce022022bd545b4951215267e4c5ceabd4c5350331b2e4a0b6494c56f361fa5a57a1a201", - "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG", - "", - "BIP66 example 7, without DERSIG" -], -[ - "0 0 0x47 0x30440220da6f441dc3b4b2c84cfa8db0cd5b34ed92c9e01686de5a800d40498b70c0dcac02207c2cf91b0c32b860c4cd4994be36cfb84caf8bb7c3a8e4d96a31b2022c5299c501", - "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT", - "", - "BIP66 example 10, without DERSIG" + "BIP66 example 4" ], [ "0 0x47 0x30440220b119d67d389315308d1745f734a51ff3ec72e06081e84e236fdf9dc2f5d2a64802204b04e3bc38674c4422ea317231d642b56dc09d214a1ecbbf16ecca01ed996e2201 0", "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT", "", - "BIP66 example 12, without DERSIG" -], -[ - "0 0x47 0x30440220b119d67d389315308d1745f734a51ff3ec72e06081e84e236fdf9dc2f5d2a64802204b04e3bc38674c4422ea317231d642b56dc09d214a1ecbbf16ecca01ed996e2201 0", - "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT", - "DERSIG", - "BIP66 example 12, with DERSIG" -], -[ - "0x48 0x304402203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022054e1c258c2981cdfba5df1f46661fb6541c44f77ca0092f3600331abfffb12510101", - "0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG", - "", - "P2PK with multi-byte hashtype, without DERSIG" + "BIP66 example 12" ], [ "0x48 0x304502203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022100ab1e3da73d67e32045a20e0b999e049978ea8d6ee5480d485fcf2ce0d03b2ef001", diff --git a/src/test/script_tests.cpp b/src/test/script_tests.cpp index a1e3dbdc2..0f3ebe053 100644 --- a/src/test/script_tests.cpp +++ b/src/test/script_tests.cpp @@ -372,114 +372,61 @@ BOOST_AUTO_TEST_CASE(script_build) "P2SH(2-of-3), 1 sig", SCRIPT_VERIFY_P2SH, true ).Num(0).PushSig(keys.key1).Num(0).PushRedeem()); - good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG, - "P2PK with too much R padding but no DERSIG", 0 - ).PushSig(keys.key1, SIGHASH_ALL, 31, 32).EditPush(1, "43021F", "44022000")); bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG, - "P2PK with too much R padding", SCRIPT_VERIFY_DERSIG + "P2PK with too much R padding", 0 ).PushSig(keys.key1, SIGHASH_ALL, 31, 32).EditPush(1, "43021F", "44022000")); - good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG, - "P2PK with too much S padding but no DERSIG", 0 - ).PushSig(keys.key1, SIGHASH_ALL).EditPush(1, "44", "45").EditPush(37, "20", "2100")); bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG, - "P2PK with too much S padding", SCRIPT_VERIFY_DERSIG + "P2PK with too much S padding", 0 ).PushSig(keys.key1, SIGHASH_ALL).EditPush(1, "44", "45").EditPush(37, "20", "2100")); - good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG, - "P2PK with too little R padding but no DERSIG", 0 - ).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220")); bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG, - "P2PK with too little R padding", SCRIPT_VERIFY_DERSIG + "P2PK with too little R padding", 0 ).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220")); - good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG << OP_NOT, - "P2PK NOT with bad sig with too much R padding but no DERSIG", 0 - ).PushSig(keys.key2, SIGHASH_ALL, 31, 32).EditPush(1, "43021F", "44022000").DamagePush(10)); bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG << OP_NOT, - "P2PK NOT with bad sig with too much R padding", SCRIPT_VERIFY_DERSIG + "P2PK NOT with bad sig with too much R padding", 0 ).PushSig(keys.key2, SIGHASH_ALL, 31, 32).EditPush(1, "43021F", "44022000").DamagePush(10)); bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG << OP_NOT, - "P2PK NOT with too much R padding but no DERSIG", 0 - ).PushSig(keys.key2, SIGHASH_ALL, 31, 32).EditPush(1, "43021F", "44022000")); - bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG << OP_NOT, - "P2PK NOT with too much R padding", SCRIPT_VERIFY_DERSIG + "P2PK NOT with too much R padding", 0 ).PushSig(keys.key2, SIGHASH_ALL, 31, 32).EditPush(1, "43021F", "44022000")); - good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG, - "BIP66 example 1, without DERSIG", 0 - ).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220")); bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG, - "BIP66 example 1, with DERSIG", SCRIPT_VERIFY_DERSIG + "BIP66 example 1", 0 ).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220")); bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG << OP_NOT, - "BIP66 example 2, without DERSIG", 0 - ).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220")); - bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG << OP_NOT, - "BIP66 example 2, with DERSIG", SCRIPT_VERIFY_DERSIG + "BIP66 example 2", 0 ).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220")); bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG, - "BIP66 example 3, without DERSIG", 0 - ).Num(0)); - bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG, - "BIP66 example 3, with DERSIG", SCRIPT_VERIFY_DERSIG + "BIP66 example 3", 0 ).Num(0)); good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG << OP_NOT, - "BIP66 example 4, without DERSIG", 0 - ).Num(0)); - good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG << OP_NOT, - "BIP66 example 4, with DERSIG", SCRIPT_VERIFY_DERSIG + "BIP66 example 4", 0 ).Num(0)); bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG, - "BIP66 example 5, without DERSIG", 0 + "BIP66 example 5", 0 ).Num(1)); - bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG, - "BIP66 example 5, with DERSIG", SCRIPT_VERIFY_DERSIG - ).Num(1)); - good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG << OP_NOT, - "BIP66 example 6, without DERSIG", 0 - ).Num(1)); bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG << OP_NOT, - "BIP66 example 6, with DERSIG", SCRIPT_VERIFY_DERSIG + "BIP66 example 6", 0 ).Num(1)); - good.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG, - "BIP66 example 7, without DERSIG", 0 - ).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").PushSig(keys.key2)); bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG, - "BIP66 example 7, with DERSIG", SCRIPT_VERIFY_DERSIG + "BIP66 example 7", 0 ).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").PushSig(keys.key2)); bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG << OP_NOT, - "BIP66 example 8, without DERSIG", 0 - ).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").PushSig(keys.key2)); - bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG << OP_NOT, - "BIP66 example 8, with DERSIG", SCRIPT_VERIFY_DERSIG + "BIP66 example 8", 0 ).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").PushSig(keys.key2)); bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG, - "BIP66 example 9, without DERSIG", 0 + "BIP66 example 9", 0 ).Num(0).Num(0).PushSig(keys.key2, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220")); - bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG, - "BIP66 example 9, with DERSIG", SCRIPT_VERIFY_DERSIG - ).Num(0).Num(0).PushSig(keys.key2, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220")); - good.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG << OP_NOT, - "BIP66 example 10, without DERSIG", 0 - ).Num(0).Num(0).PushSig(keys.key2, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220")); bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG << OP_NOT, - "BIP66 example 10, with DERSIG", SCRIPT_VERIFY_DERSIG + "BIP66 example 10", 0 ).Num(0).Num(0).PushSig(keys.key2, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220")); bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG, - "BIP66 example 11, without DERSIG", 0 - ).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").Num(0)); - bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG, - "BIP66 example 11, with DERSIG", SCRIPT_VERIFY_DERSIG + "BIP66 example 11", 0 ).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").Num(0)); good.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG << OP_NOT, - "BIP66 example 12, without DERSIG", 0 + "BIP66 example 12", 0 ).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").Num(0)); - good.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG << OP_NOT, - "BIP66 example 12, with DERSIG", SCRIPT_VERIFY_DERSIG - ).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").Num(0)); - good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG, - "P2PK with multi-byte hashtype, without DERSIG", 0 - ).PushSig(keys.key2, SIGHASH_ALL).EditPush(70, "01", "0101")); + bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG, - "P2PK with multi-byte hashtype, with DERSIG", SCRIPT_VERIFY_DERSIG + "P2PK with multi-byte hashtype", 0 ).PushSig(keys.key2, SIGHASH_ALL).EditPush(70, "01", "0101")); good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG, diff --git a/src/test/transaction_tests.cpp b/src/test/transaction_tests.cpp index b8f9efd17..c2543b183 100644 --- a/src/test/transaction_tests.cpp +++ b/src/test/transaction_tests.cpp @@ -42,7 +42,6 @@ static std::map mapFlagNames = boost::assign::map_list_of (string("NONE"), (unsigned int)SCRIPT_VERIFY_NONE) (string("P2SH"), (unsigned int)SCRIPT_VERIFY_P2SH) (string("STRICTENC"), (unsigned int)SCRIPT_VERIFY_STRICTENC) - (string("DERSIG"), (unsigned int)SCRIPT_VERIFY_DERSIG) (string("LOW_S"), (unsigned int)SCRIPT_VERIFY_LOW_S) (string("SIGPUSHONLY"), (unsigned int)SCRIPT_VERIFY_SIGPUSHONLY) (string("MINIMALDATA"), (unsigned int)SCRIPT_VERIFY_MINIMALDATA) From 9e84b5aa0db99815b49ddc4195d43769d1949197 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 17 Jun 2017 14:41:25 -0700 Subject: [PATCH 0114/1062] Check mempooltxinputlimit when creating a transaction to avoid local mempool rejection. --- src/wallet/asyncrpcoperation_sendmany.cpp | 13 ++++++++++++- src/wallet/wallet.cpp | 10 ++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/wallet/asyncrpcoperation_sendmany.cpp b/src/wallet/asyncrpcoperation_sendmany.cpp index 1691452b8..3bbbfcc05 100644 --- a/src/wallet/asyncrpcoperation_sendmany.cpp +++ b/src/wallet/asyncrpcoperation_sendmany.cpp @@ -203,7 +203,18 @@ bool AsyncRPCOperation_sendmany::main_impl() { if (isfromzaddr_ && !find_unspent_notes()) { throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, "Insufficient funds, no unspent notes found for zaddr from address."); } - + + // Check mempooltxinputlimit to avoid creating a transaction which the local mempool rejects + if (isfromtaddr_) { + size_t limit = (size_t)GetArg("-mempooltxinputlimit", 0); + if (limit > 0) { + size_t n = t_inputs_.size(); + if (n > limit) { + throw JSONRPCError(RPC_WALLET_ERROR, strprintf("Too many transparent inputs %zu > limit %zu", n, limit)); + } + } + } + CAmount t_inputs_total = 0; for (SendManyInputUTXO & t : t_inputs_) { t_inputs_total += std::get<2>(t); diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 98deedf64..a61c1e2f7 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -2717,6 +2717,16 @@ bool CWallet::CreateTransaction(const vector& vecSend, CWalletTx& wt txNew.vin.push_back(CTxIn(coin.first->GetHash(),coin.second,CScript(), std::numeric_limits::max()-1)); + // Check mempooltxinputlimit to avoid creating a transaction which the local mempool rejects + size_t limit = (size_t)GetArg("-mempooltxinputlimit", 0); + if (limit > 0) { + size_t n = txNew.vin.size(); + if (n > limit) { + strFailReason = _(strprintf("Too many transparent inputs %zu > limit %zu", n, limit).c_str()); + return false; + } + } + // Sign int nIn = 0; CTransaction txNewConst(txNew); From 4a785b0a5ba9689e0a76f202c34e0d310a7487d7 Mon Sep 17 00:00:00 2001 From: Daira Hopwood Date: Wed, 10 May 2017 12:42:00 +0100 Subject: [PATCH 0115/1062] Repair tests for strict DER signatures. While we're at it, repair a similar test for CLTV, and make the repaired RPC tests run by default. Signed-off-by: Daira Hopwood --- qa/pull-tester/rpc-tests.sh | 4 +- qa/rpc-tests/bip65-cltv-p2p.py | 153 +++++++-------------------- qa/rpc-tests/bipdersig-p2p.py | 176 +++++++++----------------------- qa/rpc-tests/bipdersig.py | 89 ---------------- qa/rpc-tests/script_test.py | 8 +- src/test/data/script_valid.json | 10 -- src/test/data/tx_invalid.json | 31 ++++++ src/test/data/tx_valid.json | 32 ------ 8 files changed, 117 insertions(+), 386 deletions(-) delete mode 100755 qa/rpc-tests/bipdersig.py diff --git a/qa/pull-tester/rpc-tests.sh b/qa/pull-tester/rpc-tests.sh index f90bf9760..b58022139 100755 --- a/qa/pull-tester/rpc-tests.sh +++ b/qa/pull-tester/rpc-tests.sh @@ -40,10 +40,10 @@ testScripts=( 'zcjoinsplit.py' 'zcjoinsplitdoublespend.py' 'getblocktemplate.py' + 'bip65-cltv-p2p.py' + 'bipdersig-p2p.py' ); testScriptsExt=( - 'bipdersig-p2p.py' - 'bipdersig.py' 'getblocktemplate_longpoll.py' 'getblocktemplate_proposals.py' 'pruning.py' diff --git a/qa/rpc-tests/bip65-cltv-p2p.py b/qa/rpc-tests/bip65-cltv-p2p.py index 1f8548c21..6f31c7663 100755 --- a/qa/rpc-tests/bip65-cltv-p2p.py +++ b/qa/rpc-tests/bip65-cltv-p2p.py @@ -5,35 +5,24 @@ # from test_framework.test_framework import ComparisonTestFramework -from test_framework.util import * +from test_framework.util import start_nodes from test_framework.mininode import CTransaction, NetworkThread from test_framework.blocktools import create_coinbase, create_block from test_framework.comptool import TestInstance, TestManager from test_framework.script import CScript, OP_1NEGATE, OP_NOP2, OP_DROP -from binascii import hexlify, unhexlify +from binascii import unhexlify import cStringIO import time -def cltv_invalidate(tx): - '''Modify the signature in vin 0 of the tx to fail CLTV - - Prepends -1 CLTV DROP in the scriptSig itself. - ''' - tx.vin[0].scriptSig = CScript([OP_1NEGATE, OP_NOP2, OP_DROP] + - list(CScript(tx.vin[0].scriptSig))) ''' -This test is meant to exercise BIP65 (CHECKLOCKTIMEVERIFY) +This test is meant to exercise BIP65 (CHECKLOCKTIMEVERIFY). Connect to a single node. -Mine 2 (version 3) blocks (save the coinbases for later). -Generate 98 more version 3 blocks, verify the node accepts. -Mine 749 version 4 blocks, verify the node accepts. -Check that the new CLTV rules are not enforced on the 750th version 4 block. -Check that the new CLTV rules are enforced on the 751st version 4 block. -Mine 199 new version blocks. -Mine 1 old-version block. -Mine 1 new version block. -Mine 1 old version block, see that the node rejects. +Mine a coinbase block, and then ... +Mine 1 version 4 block. +Check that the CLTV rules are enforced. + +TODO: factor out common code from {bipdersig-p2p,bip65-cltv-p2p}.py. ''' class BIP65Test(ComparisonTestFramework): @@ -42,14 +31,14 @@ class BIP65Test(ComparisonTestFramework): self.num_nodes = 1 def setup_network(self): - # Must set the blockversion for this test self.nodes = start_nodes(1, self.options.tmpdir, - extra_args=[['-debug', '-whitelist=127.0.0.1', '-blockversion=3']], + extra_args=[['-debug', '-whitelist=127.0.0.1']], binary=[self.options.testbinary]) + self.is_network_split = False def run_test(self): test = TestManager(self, self.options.tmpdir) - test.add_all_connections(self.nodes) + # Don't call test.add_all_connections because there is only one node. NetworkThread().start() # Start up network handling in another thread test.run() @@ -64,112 +53,40 @@ class BIP65Test(ComparisonTestFramework): tx.deserialize(f) return tx - def get_tests(self): + def invalidate_transaction(self, tx): + ''' + Modify the signature in vin 0 of the tx to fail CLTV - self.coinbase_blocks = self.nodes[0].generate(2) + Prepends -1 CLTV DROP in the scriptSig itself. + ''' + tx.vin[0].scriptSig = CScript([OP_1NEGATE, OP_NOP2, OP_DROP] + + list(CScript(tx.vin[0].scriptSig))) + + def get_tests(self): + self.coinbase_blocks = self.nodes[0].generate(1) self.tip = int ("0x" + self.nodes[0].getbestblockhash() + "L", 0) self.nodeaddress = self.nodes[0].getnewaddress() - self.last_block_time = time.time() + self.block_time = time.time() + 1 - ''' 98 more version 3 blocks ''' - test_blocks = [] - for i in xrange(98): - block = create_block(self.tip, create_coinbase(2), self.last_block_time + 1) - block.nVersion = 3 - block.rehash() - block.solve() - test_blocks.append([block, True]) - self.last_block_time += 1 - self.tip = block.sha256 - yield TestInstance(test_blocks, sync_every_block=False) + '''Check that the rules are enforced.''' + for valid in (True, False): + spendtx = self.create_transaction(self.nodes[0], + self.coinbase_blocks[0], + self.nodeaddress, 1.0) + if not valid: + self.invalidate_transaction(spendtx) + spendtx.rehash() - ''' Mine 749 version 4 blocks ''' - test_blocks = [] - for i in xrange(749): - block = create_block(self.tip, create_coinbase(2), self.last_block_time + 1) + block = create_block(self.tip, create_coinbase(1), self.block_time) block.nVersion = 4 + block.vtx.append(spendtx) + block.hashMerkleRoot = block.calc_merkle_root() block.rehash() block.solve() - test_blocks.append([block, True]) - self.last_block_time += 1 + self.block_time += 1 self.tip = block.sha256 - yield TestInstance(test_blocks, sync_every_block=False) + yield TestInstance([[block, valid]]) - ''' - Check that the new CLTV rules are not enforced in the 750th - version 3 block. - ''' - spendtx = self.create_transaction(self.nodes[0], - self.coinbase_blocks[0], self.nodeaddress, 1.0) - cltv_invalidate(spendtx) - spendtx.rehash() - - block = create_block(self.tip, create_coinbase(2), self.last_block_time + 1) - block.nVersion = 4 - block.vtx.append(spendtx) - block.hashMerkleRoot = block.calc_merkle_root() - block.rehash() - block.solve() - - self.last_block_time += 1 - self.tip = block.sha256 - yield TestInstance([[block, True]]) - - ''' - Check that the new CLTV rules are enforced in the 751st version 4 - block. - ''' - spendtx = self.create_transaction(self.nodes[0], - self.coinbase_blocks[1], self.nodeaddress, 1.0) - cltv_invalidate(spendtx) - spendtx.rehash() - - block = create_block(self.tip, create_coinbase(1), self.last_block_time + 1) - block.nVersion = 4 - block.vtx.append(spendtx) - block.hashMerkleRoot = block.calc_merkle_root() - block.rehash() - block.solve() - self.last_block_time += 1 - yield TestInstance([[block, False]]) - - ''' Mine 199 new version blocks on last valid tip ''' - test_blocks = [] - for i in xrange(199): - block = create_block(self.tip, create_coinbase(1), self.last_block_time + 1) - block.nVersion = 4 - block.rehash() - block.solve() - test_blocks.append([block, True]) - self.last_block_time += 1 - self.tip = block.sha256 - yield TestInstance(test_blocks, sync_every_block=False) - - ''' Mine 1 old version block ''' - block = create_block(self.tip, create_coinbase(1), self.last_block_time + 1) - block.nVersion = 3 - block.rehash() - block.solve() - self.last_block_time += 1 - self.tip = block.sha256 - yield TestInstance([[block, True]]) - - ''' Mine 1 new version block ''' - block = create_block(self.tip, create_coinbase(1), self.last_block_time + 1) - block.nVersion = 4 - block.rehash() - block.solve() - self.last_block_time += 1 - self.tip = block.sha256 - yield TestInstance([[block, True]]) - - ''' Mine 1 old version block, should be invalid ''' - block = create_block(self.tip, create_coinbase(1), self.last_block_time + 1) - block.nVersion = 3 - block.rehash() - block.solve() - self.last_block_time += 1 - yield TestInstance([[block, False]]) if __name__ == '__main__': BIP65Test().main() diff --git a/qa/rpc-tests/bipdersig-p2p.py b/qa/rpc-tests/bipdersig-p2p.py index 41717377b..9604cdbdd 100755 --- a/qa/rpc-tests/bipdersig-p2p.py +++ b/qa/rpc-tests/bipdersig-p2p.py @@ -5,59 +5,39 @@ # from test_framework.test_framework import ComparisonTestFramework -from test_framework.util import * +from test_framework.util import start_nodes from test_framework.mininode import CTransaction, NetworkThread from test_framework.blocktools import create_coinbase, create_block from test_framework.comptool import TestInstance, TestManager from test_framework.script import CScript -from binascii import hexlify, unhexlify +from binascii import unhexlify import cStringIO import time -# A canonical signature consists of: -# <30> <02> <02> -def unDERify(tx): - ''' - Make the signature in vin 0 of a tx non-DER-compliant, - by adding padding after the S-value. - ''' - scriptSig = CScript(tx.vin[0].scriptSig) - newscript = [] - for i in scriptSig: - if (len(newscript) == 0): - newscript.append(i[0:-1] + '\0' + i[-1]) - else: - newscript.append(i) - tx.vin[0].scriptSig = CScript(newscript) - + ''' This test is meant to exercise BIP66 (DER SIG). Connect to a single node. -Mine 2 (version 2) blocks (save the coinbases for later). -Generate 98 more version 2 blocks, verify the node accepts. -Mine 749 version 3 blocks, verify the node accepts. -Check that the new DERSIG rules are not enforced on the 750th version 3 block. -Check that the new DERSIG rules are enforced on the 751st version 3 block. -Mine 199 new version blocks. -Mine 1 old-version block. -Mine 1 new version block. -Mine 1 old version block, see that the node rejects. +Mine a coinbase block, and then ... +Mine 1 version 4 block. +Check that the DERSIG rules are enforced. + +TODO: factor out common code from {bipdersig-p2p,bip65-cltv-p2p}.py. ''' - class BIP66Test(ComparisonTestFramework): def __init__(self): self.num_nodes = 1 def setup_network(self): - # Must set the blockversion for this test - self.nodes = start_nodes(1, self.options.tmpdir, - extra_args=[['-debug', '-whitelist=127.0.0.1', '-blockversion=2']], + self.nodes = start_nodes(1, self.options.tmpdir, + extra_args=[['-debug', '-whitelist=127.0.0.1']], binary=[self.options.testbinary]) + self.is_network_split = False def run_test(self): test = TestManager(self, self.options.tmpdir) - test.add_all_connections(self.nodes) + # Don't call test.add_all_connections because there is only one node. NetworkThread().start() # Start up network handling in another thread test.run() @@ -72,112 +52,48 @@ class BIP66Test(ComparisonTestFramework): tx.deserialize(f) return tx - def get_tests(self): + def invalidate_transaction(self, tx): + ''' + Make the signature in vin 0 of a tx non-DER-compliant, + by adding padding after the S-value. - self.coinbase_blocks = self.nodes[0].generate(2) + A canonical signature consists of: + <30> <02> <02> + ''' + scriptSig = CScript(tx.vin[0].scriptSig) + newscript = [] + for i in scriptSig: + if (len(newscript) == 0): + newscript.append(i[0:-1] + '\0' + i[-1]) + else: + newscript.append(i) + tx.vin[0].scriptSig = CScript(newscript) + + def get_tests(self): + self.coinbase_blocks = self.nodes[0].generate(1) self.tip = int ("0x" + self.nodes[0].getbestblockhash() + "L", 0) self.nodeaddress = self.nodes[0].getnewaddress() - self.last_block_time = time.time() + self.block_time = time.time() + 1 - ''' 98 more version 2 blocks ''' - test_blocks = [] - for i in xrange(98): - block = create_block(self.tip, create_coinbase(2), self.last_block_time + 1) - block.nVersion = 2 + '''Check that the rules are enforced.''' + for valid in (True, False): + spendtx = self.create_transaction(self.nodes[0], + self.coinbase_blocks[0], + self.nodeaddress, 1.0) + if not valid: + self.invalidate_transaction(spendtx) + spendtx.rehash() + + block = create_block(self.tip, create_coinbase(1), self.block_time) + block.nVersion = 4 + block.vtx.append(spendtx) + block.hashMerkleRoot = block.calc_merkle_root() block.rehash() block.solve() - test_blocks.append([block, True]) - self.last_block_time += 1 + self.block_time += 1 self.tip = block.sha256 - yield TestInstance(test_blocks, sync_every_block=False) + yield TestInstance([[block, valid]]) - ''' Mine 749 version 3 blocks ''' - test_blocks = [] - for i in xrange(749): - block = create_block(self.tip, create_coinbase(2), self.last_block_time + 1) - block.nVersion = 3 - block.rehash() - block.solve() - test_blocks.append([block, True]) - self.last_block_time += 1 - self.tip = block.sha256 - yield TestInstance(test_blocks, sync_every_block=False) - - ''' - Check that the new DERSIG rules are not enforced in the 750th - version 3 block. - ''' - spendtx = self.create_transaction(self.nodes[0], - self.coinbase_blocks[0], self.nodeaddress, 1.0) - unDERify(spendtx) - spendtx.rehash() - - block = create_block(self.tip, create_coinbase(2), self.last_block_time + 1) - block.nVersion = 3 - block.vtx.append(spendtx) - block.hashMerkleRoot = block.calc_merkle_root() - block.rehash() - block.solve() - - self.last_block_time += 1 - self.tip = block.sha256 - yield TestInstance([[block, True]]) - - ''' - Check that the new DERSIG rules are enforced in the 751st version 3 - block. - ''' - spendtx = self.create_transaction(self.nodes[0], - self.coinbase_blocks[1], self.nodeaddress, 1.0) - unDERify(spendtx) - spendtx.rehash() - - block = create_block(self.tip, create_coinbase(1), self.last_block_time + 1) - block.nVersion = 3 - block.vtx.append(spendtx) - block.hashMerkleRoot = block.calc_merkle_root() - block.rehash() - block.solve() - self.last_block_time += 1 - yield TestInstance([[block, False]]) - - ''' Mine 199 new version blocks on last valid tip ''' - test_blocks = [] - for i in xrange(199): - block = create_block(self.tip, create_coinbase(1), self.last_block_time + 1) - block.nVersion = 3 - block.rehash() - block.solve() - test_blocks.append([block, True]) - self.last_block_time += 1 - self.tip = block.sha256 - yield TestInstance(test_blocks, sync_every_block=False) - - ''' Mine 1 old version block ''' - block = create_block(self.tip, create_coinbase(1), self.last_block_time + 1) - block.nVersion = 2 - block.rehash() - block.solve() - self.last_block_time += 1 - self.tip = block.sha256 - yield TestInstance([[block, True]]) - - ''' Mine 1 new version block ''' - block = create_block(self.tip, create_coinbase(1), self.last_block_time + 1) - block.nVersion = 3 - block.rehash() - block.solve() - self.last_block_time += 1 - self.tip = block.sha256 - yield TestInstance([[block, True]]) - - ''' Mine 1 old version block, should be invalid ''' - block = create_block(self.tip, create_coinbase(1), self.last_block_time + 1) - block.nVersion = 2 - block.rehash() - block.solve() - self.last_block_time += 1 - yield TestInstance([[block, False]]) if __name__ == '__main__': BIP66Test().main() diff --git a/qa/rpc-tests/bipdersig.py b/qa/rpc-tests/bipdersig.py deleted file mode 100755 index 243f816f6..000000000 --- a/qa/rpc-tests/bipdersig.py +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/env python2 -# Copyright (c) 2014 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -# -# Test the BIP66 changeover logic -# - -from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * -import os -import shutil - -class BIP66Test(BitcoinTestFramework): - - def setup_network(self): - self.nodes = [] - self.nodes.append(start_node(0, self.options.tmpdir, [])) - self.nodes.append(start_node(1, self.options.tmpdir, ["-blockversion=2"])) - self.nodes.append(start_node(2, self.options.tmpdir, ["-blockversion=3"])) - connect_nodes(self.nodes[1], 0) - connect_nodes(self.nodes[2], 0) - self.is_network_split = False - self.sync_all() - - def run_test(self): - cnt = self.nodes[0].getblockcount() - - # Mine some old-version blocks - self.nodes[1].generate(100) - self.sync_all() - if (self.nodes[0].getblockcount() != cnt + 100): - raise AssertionError("Failed to mine 100 version=2 blocks") - - # Mine 750 new-version blocks - for i in xrange(15): - self.nodes[2].generate(50) - self.sync_all() - if (self.nodes[0].getblockcount() != cnt + 850): - raise AssertionError("Failed to mine 750 version=3 blocks") - - # TODO: check that new DERSIG rules are not enforced - - # Mine 1 new-version block - self.nodes[2].generate(1) - self.sync_all() - if (self.nodes[0].getblockcount() != cnt + 851): - raise AssertionFailure("Failed to mine a version=3 blocks") - - # TODO: check that new DERSIG rules are enforced - - # Mine 198 new-version blocks - for i in xrange(2): - self.nodes[2].generate(99) - self.sync_all() - if (self.nodes[0].getblockcount() != cnt + 1049): - raise AssertionError("Failed to mine 198 version=3 blocks") - - # Mine 1 old-version block - self.nodes[1].generate(1) - self.sync_all() - if (self.nodes[0].getblockcount() != cnt + 1050): - raise AssertionError("Failed to mine a version=2 block after 949 version=3 blocks") - - # Mine 1 new-version blocks - self.nodes[2].generate(1) - self.sync_all() - if (self.nodes[0].getblockcount() != cnt + 1051): - raise AssertionError("Failed to mine a version=3 block") - - # Mine 1 old-version blocks - try: - self.nodes[1].generate(1) - raise AssertionError("Succeeded to mine a version=2 block after 950 version=3 blocks") - except JSONRPCException: - pass - self.sync_all() - if (self.nodes[0].getblockcount() != cnt + 1051): - raise AssertionError("Accepted a version=2 block after 950 version=3 blocks") - - # Mine 1 new-version blocks - self.nodes[2].generate(1) - self.sync_all() - if (self.nodes[0].getblockcount() != cnt + 1052): - raise AssertionError("Failed to mine a version=3 block") - -if __name__ == '__main__': - BIP66Test().main() diff --git a/qa/rpc-tests/script_test.py b/qa/rpc-tests/script_test.py index 860fa56b6..85927d02c 100755 --- a/qa/rpc-tests/script_test.py +++ b/qa/rpc-tests/script_test.py @@ -54,9 +54,8 @@ class ScriptTestFile(object): # Helper for parsing the flags specified in the .json files SCRIPT_VERIFY_NONE = 0 -SCRIPT_VERIFY_P2SH = 1 +SCRIPT_VERIFY_P2SH = 1 SCRIPT_VERIFY_STRICTENC = 1 << 1 -SCRIPT_VERIFY_DERSIG = 1 << 2 SCRIPT_VERIFY_LOW_S = 1 << 3 SCRIPT_VERIFY_NULLDUMMY = 1 << 4 SCRIPT_VERIFY_SIGPUSHONLY = 1 << 5 @@ -64,12 +63,11 @@ SCRIPT_VERIFY_MINIMALDATA = 1 << 6 SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_NOPS = 1 << 7 SCRIPT_VERIFY_CLEANSTACK = 1 << 8 -flag_map = { +flag_map = { "": SCRIPT_VERIFY_NONE, - "NONE": SCRIPT_VERIFY_NONE, + "NONE": SCRIPT_VERIFY_NONE, "P2SH": SCRIPT_VERIFY_P2SH, "STRICTENC": SCRIPT_VERIFY_STRICTENC, - "DERSIG": SCRIPT_VERIFY_DERSIG, "LOW_S": SCRIPT_VERIFY_LOW_S, "NULLDUMMY": SCRIPT_VERIFY_NULLDUMMY, "SIGPUSHONLY": SCRIPT_VERIFY_SIGPUSHONLY, diff --git a/src/test/data/script_valid.json b/src/test/data/script_valid.json index aed78e7fb..572814c80 100644 --- a/src/test/data/script_valid.json +++ b/src/test/data/script_valid.json @@ -690,16 +690,6 @@ "2-of-2 CHECKMULTISIG NOT with both pubkeys valid, but second signature invalid. Valid pubkey fails, and CHECKMULTISIG exits early, prior to evaluation of second invalid signature." ], -["Increase test coverage for DERSIG"], -["0x4a 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "0 CHECKSIG NOT", "", "Overly long signature is correctly encoded"], -["0x25 0x30220220000000000000000000000000000000000000000000000000000000000000000000", "0 CHECKSIG NOT", "", "Missing S is correctly encoded"], -["0x27 0x3024021077777777777777777777777777777777020a7777777777777777777777777777777701", "0 CHECKSIG NOT", "", "S with invalid S length is correctly encoded"], -["0x27 0x302403107777777777777777777777777777777702107777777777777777777777777777777701", "0 CHECKSIG NOT", "", "Non-integer R is correctly encoded"], -["0x27 0x302402107777777777777777777777777777777703107777777777777777777777777777777701", "0 CHECKSIG NOT", "", "Non-integer S is correctly encoded"], -["0x17 0x3014020002107777777777777777777777777777777701", "0 CHECKSIG NOT", "", "Zero-length R is correctly encoded"], -["0x17 0x3014021077777777777777777777777777777777020001", "0 CHECKSIG NOT", "", "Zero-length S is correctly encoded for DERSIG"], -["0x27 0x302402107777777777777777777777777777777702108777777777777777777777777777777701", "0 CHECKSIG NOT", "", "Negative S is correctly encoded"], - ["Automatically generated test cases"], [ "0x47 0x304402200a5c6163f07b8d3b013c4d1d6dba25e780b39658d79ba37af7057a3b7f15ffa102201fd9b4eaa9943f734928b99a83592c2e7bf342ea2680f6a2bb705167966b742001", diff --git a/src/test/data/tx_invalid.json b/src/test/data/tx_invalid.json index ebd1f0403..b99a72da9 100644 --- a/src/test/data/tx_invalid.json +++ b/src/test/data/tx_invalid.json @@ -86,12 +86,43 @@ [[["b3da01dd4aae683c7aee4d5d8b52a540a508e1115f77cd7fa9a291243f501223", 0, "HASH160 0x14 0xb1ce99298d5f07364b57b1e5c9cc00be0b04a954 EQUAL"]], "01000000012312503f2491a2a97fcd775f11e108a540a5528b5d4dee7a3c68ae4add01dab300000000fdfe000048304502207aacee820e08b0b174e248abd8d7a34ed63b5da3abedb99934df9fddd65c05c4022100dfe87896ab5ee3df476c2655f9fbe5bd089dccbef3e4ea05b5d121169fe7f5f401483045022100f6649b0eddfdfd4ad55426663385090d51ee86c3481bdc6b0c18ea6c0ece2c0b0220561c315b07cffa6f7dd9df96dbae9200c2dee09bf93cc35ca05e6cdf613340aa014c695221031d11db38972b712a9fe1fc023577c7ae3ddb4a3004187d41c45121eecfdbb5b7210207ec36911b6ad2382860d32989c7b8728e9489d7bbc94a6b5509ef0029be128821024ea9fac06f666a4adc3fc1357b7bec1fd0bdece2b9d08579226a8ebde53058e453aeffffffff0180380100000000001976a914c9b99cddf847d10685a4fabaa0baf505f7c3dfab88ac00000000", "P2SH"], +["The following is 23b397edccd3740a74adb603c9756370fafcde9bcc4483eb271ecad09a94dd63"], +["It is of particular interest because it contains an invalidly-encoded signature which OpenSSL accepts"], +["See http://r6.ca/blog/20111119T211504Z.html"], +["It is also the first OP_CHECKMULTISIG transaction on the Bitcoin block chain in standard form"], +[[["60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1", 0, "1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG"]], +"0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba26000000000490047304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000", "P2SH"], + +["The following is a tweaked form of 23b397edccd3740a74adb603c9756370fafcde9bcc4483eb271ecad09a94dd63"], +["It is an OP_CHECKMULTISIG with an arbitrary extra byte stuffed into the signature at pos length - 2"], +["The dummy byte is fine however, so the NULLDUMMY flag should be happy"], +[[["60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1", 0, "1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG"]], +"0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba260000000004a0048304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2bab01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000", "P2SH,NULLDUMMY"], + +["The following is a tweaked form of 23b397edccd3740a74adb603c9756370fafcde9bcc4483eb271ecad09a94dd63"], +["It is an OP_CHECKMULTISIG with the dummy value set to something other than an empty string"], +[[["60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1", 0, "1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG"]], +"0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba260000000004a01ff47304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000", "P2SH"], + +["As above, but using a OP_1"], +[[["60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1", 0, "1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG"]], +"0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba26000000000495147304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000", "P2SH"], + +["As above, but using a OP_1NEGATE"], +[[["60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1", 0, "1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG"]], +"0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba26000000000494f47304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000", "P2SH"], ["The following is a tweaked form of 23b397edccd3740a74adb603c9756370fafcde9bcc4483eb271ecad09a94dd63"], ["It is an OP_CHECKMULTISIG with the dummy value missing"], [[["60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1", 0, "1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG"]], "0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba260000000004847304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000", "P2SH"], +["The following is f7fdd091fa6d8f5e7a8c2458f5c38faffff2d3f1406b6e4fe2c99dcc0d2d1cbb"], +["It caught a bug in the workaround for 23b397edccd3740a74adb603c9756370fafcde9bcc4483eb271ecad09a94dd63 in an overly simple implementation"], +[[["b464e85df2a238416f8bdae11d120add610380ea07f4ef19c5f9dfd472f96c3d", 0, "DUP HASH160 0x14 0xbef80ecf3a44500fda1bc92176e442891662aed2 EQUALVERIFY CHECKSIG"], +["b7978cc96e59a8b13e0865d3f95657561a7f725be952438637475920bac9eb21", 1, "DUP HASH160 0x14 0xbef80ecf3a44500fda1bc92176e442891662aed2 EQUALVERIFY CHECKSIG"]], +"01000000023d6cf972d4dff9c519eff407ea800361dd0a121de1da8b6f4138a2f25de864b4000000008a4730440220ffda47bfc776bcd269da4832626ac332adfca6dd835e8ecd83cd1ebe7d709b0e022049cffa1cdc102a0b56e0e04913606c70af702a1149dc3b305ab9439288fee090014104266abb36d66eb4218a6dd31f09bb92cf3cfa803c7ea72c1fc80a50f919273e613f895b855fb7465ccbc8919ad1bd4a306c783f22cd3227327694c4fa4c1c439affffffff21ebc9ba20594737864352e95b727f1a565756f9d365083eb1a8596ec98c97b7010000008a4730440220503ff10e9f1e0de731407a4a245531c9ff17676eda461f8ceeb8c06049fa2c810220c008ac34694510298fa60b3f000df01caa244f165b727d4896eb84f81e46bcc4014104266abb36d66eb4218a6dd31f09bb92cf3cfa803c7ea72c1fc80a50f919273e613f895b855fb7465ccbc8919ad1bd4a306c783f22cd3227327694c4fa4c1c439affffffff01f0da5200000000001976a914857ccd42dded6df32949d4646dfa10a92458cfaa88ac00000000", "P2SH"], + ["CHECKMULTISIG SCRIPT_VERIFY_NULLDUMMY tests:"], diff --git a/src/test/data/tx_valid.json b/src/test/data/tx_valid.json index e7f0464d8..265ba5de6 100644 --- a/src/test/data/tx_valid.json +++ b/src/test/data/tx_valid.json @@ -5,32 +5,6 @@ ["serializedTransaction, verifyFlags]"], ["Objects that are only a single string (like this one) are ignored"], -["The following is 23b397edccd3740a74adb603c9756370fafcde9bcc4483eb271ecad09a94dd63"], -["It is of particular interest because it contains an invalidly-encoded signature which OpenSSL accepts"], -["See http://r6.ca/blog/20111119T211504Z.html"], -["It is also the first OP_CHECKMULTISIG transaction in standard form"], -[[["60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1", 0, "1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG"]], -"0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba26000000000490047304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000", "P2SH"], - -["The following is a tweaked form of 23b397edccd3740a74adb603c9756370fafcde9bcc4483eb271ecad09a94dd63"], -["It is an OP_CHECKMULTISIG with an arbitrary extra byte stuffed into the signature at pos length - 2"], -["The dummy byte is fine however, so the NULLDUMMY flag should be happy"], -[[["60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1", 0, "1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG"]], -"0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba260000000004a0048304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2bab01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000", "P2SH,NULLDUMMY"], - -["The following is a tweaked form of 23b397edccd3740a74adb603c9756370fafcde9bcc4483eb271ecad09a94dd63"], -["It is an OP_CHECKMULTISIG with the dummy value set to something other than an empty string"], -[[["60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1", 0, "1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG"]], -"0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba260000000004a01ff47304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000", "P2SH"], - -["As above, but using a OP_1"], -[[["60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1", 0, "1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG"]], -"0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba26000000000495147304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000", "P2SH"], - -["As above, but using a OP_1NEGATE"], -[[["60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1", 0, "1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG"]], -"0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba26000000000494f47304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000", "P2SH"], - ["The following is c99c49da4c38af669dea436d3e73780dfdb6c1ecf9958baa52960e8baee30e73"], ["It is of interest because it contains a 0-sequence as well as a signature of SIGHASH type 0 (which is not a real type)"], [[["406b2b06bcd34d3c8733e6b79f7a394c8a431fbf4ff5ac705c93f4076bb77602", 0, "DUP HASH160 0x14 0xdc44b1164188067c3a32d4780f5996fa14a4f2d9 EQUALVERIFY CHECKSIG"]], @@ -40,12 +14,6 @@ [[["0000000000000000000000000000000000000000000000000000000000000100", 0, "DUP HASH160 0x14 0x5b6462475454710f3c22f5fdf0b40704c92f25c3 EQUALVERIFY CHECKSIGVERIFY 1"]], "01000000010001000000000000000000000000000000000000000000000000000000000000000000006a473044022067288ea50aa799543a536ff9306f8e1cba05b9c6b10951175b924f96732555ed022026d7b5265f38d21541519e4a1e55044d5b9e17e15cdbaf29ae3792e99e883e7a012103ba8c8b86dea131c22ab967e6dd99bdae8eff7a1f75a2c35f1f944109e3fe5e22ffffffff010000000000000000015100000000", "P2SH"], -["The following is f7fdd091fa6d8f5e7a8c2458f5c38faffff2d3f1406b6e4fe2c99dcc0d2d1cbb"], -["It caught a bug in the workaround for 23b397edccd3740a74adb603c9756370fafcde9bcc4483eb271ecad09a94dd63 in an overly simple implementation"], -[[["b464e85df2a238416f8bdae11d120add610380ea07f4ef19c5f9dfd472f96c3d", 0, "DUP HASH160 0x14 0xbef80ecf3a44500fda1bc92176e442891662aed2 EQUALVERIFY CHECKSIG"], -["b7978cc96e59a8b13e0865d3f95657561a7f725be952438637475920bac9eb21", 1, "DUP HASH160 0x14 0xbef80ecf3a44500fda1bc92176e442891662aed2 EQUALVERIFY CHECKSIG"]], -"01000000023d6cf972d4dff9c519eff407ea800361dd0a121de1da8b6f4138a2f25de864b4000000008a4730440220ffda47bfc776bcd269da4832626ac332adfca6dd835e8ecd83cd1ebe7d709b0e022049cffa1cdc102a0b56e0e04913606c70af702a1149dc3b305ab9439288fee090014104266abb36d66eb4218a6dd31f09bb92cf3cfa803c7ea72c1fc80a50f919273e613f895b855fb7465ccbc8919ad1bd4a306c783f22cd3227327694c4fa4c1c439affffffff21ebc9ba20594737864352e95b727f1a565756f9d365083eb1a8596ec98c97b7010000008a4730440220503ff10e9f1e0de731407a4a245531c9ff17676eda461f8ceeb8c06049fa2c810220c008ac34694510298fa60b3f000df01caa244f165b727d4896eb84f81e46bcc4014104266abb36d66eb4218a6dd31f09bb92cf3cfa803c7ea72c1fc80a50f919273e613f895b855fb7465ccbc8919ad1bd4a306c783f22cd3227327694c4fa4c1c439affffffff01f0da5200000000001976a914857ccd42dded6df32949d4646dfa10a92458cfaa88ac00000000", "P2SH"], - ["An invalid P2SH Transaction"], [[["0000000000000000000000000000000000000000000000000000000000000100", 0, "HASH160 0x14 0x7a052c840ba73af26755de42cf01cc9e0a49fef0 EQUAL"]], "010000000100010000000000000000000000000000000000000000000000000000000000000000000009085768617420697320ffffffff010000000000000000015100000000", "NONE"], From 00fde35b1cceaae0837b0bd8b0206bf50f6993d9 Mon Sep 17 00:00:00 2001 From: Daira Hopwood Date: Wed, 7 Jun 2017 13:09:56 +0100 Subject: [PATCH 0116/1062] Make transaction test failures print the comments preceding the test JSON. Signed-off-by: Daira Hopwood --- src/test/transaction_tests.cpp | 40 ++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/src/test/transaction_tests.cpp b/src/test/transaction_tests.cpp index c2543b183..3fa691a94 100644 --- a/src/test/transaction_tests.cpp +++ b/src/test/transaction_tests.cpp @@ -97,6 +97,7 @@ BOOST_AUTO_TEST_CASE(tx_valid) // // verifyFlags is a comma separated list of script verification flags to apply, or "NONE" UniValue tests = read_json(std::string(json_tests::tx_valid, json_tests::tx_valid + sizeof(json_tests::tx_valid))); + std::string comment(""); auto verifier = libzcash::ProofVerifier::Strict(); ScriptError err; @@ -107,7 +108,7 @@ BOOST_AUTO_TEST_CASE(tx_valid) { if (test.size() != 3 || !test[1].isStr() || !test[2].isStr()) { - BOOST_ERROR("Bad test: " << strTest); + BOOST_ERROR("Bad test: " << strTest << comment); continue; } @@ -132,7 +133,7 @@ BOOST_AUTO_TEST_CASE(tx_valid) } if (!fValid) { - BOOST_ERROR("Bad test: " << strTest); + BOOST_ERROR("Bad test: " << strTest << comment); continue; } @@ -142,23 +143,30 @@ BOOST_AUTO_TEST_CASE(tx_valid) stream >> tx; CValidationState state; - BOOST_CHECK_MESSAGE(CheckTransaction(tx, state, verifier), strTest); - BOOST_CHECK(state.IsValid()); + BOOST_CHECK_MESSAGE(CheckTransaction(tx, state, verifier), strTest + comment); + BOOST_CHECK_MESSAGE(state.IsValid(), comment); for (unsigned int i = 0; i < tx.vin.size(); i++) { if (!mapprevOutScriptPubKeys.count(tx.vin[i].prevout)) { - BOOST_ERROR("Bad test: " << strTest); + BOOST_ERROR("Bad test: " << strTest << comment); break; } unsigned int verify_flags = ParseScriptFlags(test[2].get_str()); BOOST_CHECK_MESSAGE(VerifyScript(tx.vin[i].scriptSig, mapprevOutScriptPubKeys[tx.vin[i].prevout], verify_flags, TransactionSignatureChecker(&tx, i), &err), - strTest); - BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); + strTest + comment); + BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err) + comment); } + + comment = ""; + } + else if (test.size() == 1) + { + comment += "\n# "; + comment += test[0].write(); } } } @@ -173,6 +181,7 @@ BOOST_AUTO_TEST_CASE(tx_invalid) // // verifyFlags is a comma separated list of script verification flags to apply, or "NONE" UniValue tests = read_json(std::string(json_tests::tx_invalid, json_tests::tx_invalid + sizeof(json_tests::tx_invalid))); + std::string comment(""); auto verifier = libzcash::ProofVerifier::Strict(); ScriptError err; @@ -183,7 +192,7 @@ BOOST_AUTO_TEST_CASE(tx_invalid) { if (test.size() != 3 || !test[1].isStr() || !test[2].isStr()) { - BOOST_ERROR("Bad test: " << strTest); + BOOST_ERROR("Bad test: " << strTest << comment); continue; } @@ -208,7 +217,7 @@ BOOST_AUTO_TEST_CASE(tx_invalid) } if (!fValid) { - BOOST_ERROR("Bad test: " << strTest); + BOOST_ERROR("Bad test: " << strTest << comment); continue; } @@ -224,7 +233,7 @@ BOOST_AUTO_TEST_CASE(tx_invalid) { if (!mapprevOutScriptPubKeys.count(tx.vin[i].prevout)) { - BOOST_ERROR("Bad test: " << strTest); + BOOST_ERROR("Bad test: " << strTest << comment); break; } @@ -232,8 +241,15 @@ BOOST_AUTO_TEST_CASE(tx_invalid) fValid = VerifyScript(tx.vin[i].scriptSig, mapprevOutScriptPubKeys[tx.vin[i].prevout], verify_flags, TransactionSignatureChecker(&tx, i), &err); } - BOOST_CHECK_MESSAGE(!fValid, strTest); - BOOST_CHECK_MESSAGE(err != SCRIPT_ERR_OK, ScriptErrorString(err)); + BOOST_CHECK_MESSAGE(!fValid, strTest + comment); + BOOST_CHECK_MESSAGE(err != SCRIPT_ERR_OK, ScriptErrorString(err) + comment); + + comment = ""; + } + else if (test.size() == 1) + { + comment += "\n# "; + comment += test[0].write(); } } } From c2a722d3c43c49d703002e0915bc84d6c37c8a63 Mon Sep 17 00:00:00 2001 From: Daira Hopwood Date: Wed, 7 Jun 2017 15:29:58 +0100 Subject: [PATCH 0117/1062] Fix a comment that was made stale before launch by #1016 (commit 542da61). Signed-off-by: Daira Hopwood --- src/main.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 81901ade5..209aeee47 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3093,11 +3093,10 @@ bool ContextualCheckBlock(const CBlock& block, CValidationState& state, CBlockIn } } - // Enforce block.nVersion=2 rule that the coinbase starts with serialized block height - // if 750 of the last 1,000 blocks are version 2 or greater (51/100 if testnet): - // Since MIN_BLOCK_VERSION = 4 all blocks with nHeight > 0 should satisfy this. - // This rule is not applied to the genesis block, which didn't include the height - // in the coinbase. + // Enforce BIP 34 rule that the coinbase starts with serialized block height. + // In Zcash this has been enforced since launch, except that the genesis + // block didn't include the height in the coinbase (see Zcash protocol spec + // section '6.8 Bitcoin Improvement Proposals'). if (nHeight > 0) { CScript expect = CScript() << nHeight; From 26d27a15ceb495d3c70365b8b0495bde3afe7902 Mon Sep 17 00:00:00 2001 From: Kevin Pan Date: Tue, 20 Jun 2017 10:41:46 +0800 Subject: [PATCH 0118/1062] "getblocktemplate" could work without wallet --- src/rpcserver.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/rpcserver.cpp b/src/rpcserver.cpp index 2e8aa5aad..c2c76a1e2 100644 --- a/src/rpcserver.cpp +++ b/src/rpcserver.cpp @@ -293,9 +293,7 @@ static const CRPCCommand vRPCCommands[] = { "blockchain", "verifychain", &verifychain, true }, /* Mining */ -#ifdef ENABLE_WALLET { "mining", "getblocktemplate", &getblocktemplate, true }, -#endif { "mining", "getmininginfo", &getmininginfo, true }, { "mining", "getlocalsolps", &getlocalsolps, true }, { "mining", "getnetworksolps", &getnetworksolps, true }, From 4ef014151d0c2d0f9c151a96b7ae8fb521f56282 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 20 Jun 2017 15:58:46 +1200 Subject: [PATCH 0119/1062] Additional testing of -mempooltxinputlimit --- qa/pull-tester/rpc-tests.sh | 1 + qa/rpc-tests/mempool_tx_input_limit.py | 138 +++++++++++++++++++++++++ src/gtest/test_mempool.cpp | 6 +- 3 files changed, 144 insertions(+), 1 deletion(-) create mode 100755 qa/rpc-tests/mempool_tx_input_limit.py diff --git a/qa/pull-tester/rpc-tests.sh b/qa/pull-tester/rpc-tests.sh index 08ff3fe7a..99706f178 100755 --- a/qa/pull-tester/rpc-tests.sh +++ b/qa/pull-tester/rpc-tests.sh @@ -26,6 +26,7 @@ testScripts=( 'rest.py' 'mempool_spendcoinbase.py' 'mempool_coinbase_spends.py' + 'mempool_tx_input_limit.py' 'httpbasics.py' 'zapwallettxes.py' 'proxy_test.py' diff --git a/qa/rpc-tests/mempool_tx_input_limit.py b/qa/rpc-tests/mempool_tx_input_limit.py new file mode 100755 index 000000000..ed0bf206e --- /dev/null +++ b/qa/rpc-tests/mempool_tx_input_limit.py @@ -0,0 +1,138 @@ +#!/usr/bin/env python2 +# Copyright (c) 2017 The Zcash developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +from test_framework.test_framework import BitcoinTestFramework +from test_framework.util import * +import os +import shutil +from time import sleep + +# Create one-input, one-output, no-fee transaction: +class MempoolTxInputLimitTest(BitcoinTestFramework): + + alert_filename = None # Set by setup_network + + def setup_network(self): + args = ["-checkmempool", "-debug=mempool", "-mempooltxinputlimit=2"] + self.nodes = [] + self.nodes.append(start_node(0, self.options.tmpdir, args)) + self.nodes.append(start_node(1, self.options.tmpdir, args)) + connect_nodes(self.nodes[1], 0) + self.is_network_split = False + self.sync_all + + def setup_chain(self): + print "Initializing test directory "+self.options.tmpdir + initialize_chain_clean(self.options.tmpdir, 2) + + def call_z_sendmany(self, from_addr, to_addr, amount): + recipients = [] + recipients.append({"address": to_addr, "amount": amount}) + myopid = self.nodes[0].z_sendmany(from_addr, recipients) + + opids = [] + opids.append(myopid) + + timeout = 120 + status = None + for x in xrange(1, timeout): + results = self.nodes[0].z_getoperationresult(opids) + if len(results)==0: + sleep(1) + else: + status = results[0]["status"] + assert_equal("success", status) + return results[0]["result"]["txid"] + + def run_test(self): + start_count = self.nodes[0].getblockcount() + + self.nodes[0].generate(100) + self.sync_all() + # Mine three blocks. After this, nodes[0] blocks + # 1, 2, and 3 are spend-able. + self.nodes[1].generate(3) + self.sync_all() + + # Check 1: z_sendmany is limited by -mempooltxinputlimit + + # Add zaddr to node 0 + node0_zaddr = self.nodes[0].z_getnewaddress() + + # Send three inputs from node 0 taddr to zaddr to get out of coinbase + node0_taddr = self.nodes[0].getnewaddress(); + recipients = [] + recipients.append({"address":node0_zaddr, "amount":Decimal('30.0')-Decimal('0.0001')}) # utxo amount less fee + myopid = self.nodes[0].z_sendmany(node0_taddr, recipients) + + opids = [] + opids.append(myopid) + + # Spend should fail due to -mempooltxinputlimit + timeout = 120 + status = None + for x in xrange(1, timeout): + results = self.nodes[0].z_getoperationresult(opids) + if len(results)==0: + sleep(1) + else: + status = results[0]["status"] + msg = results[0]["error"]["message"] + assert_equal("failed", status) + assert_equal("Too many transparent inputs 3 > limit 2", msg) + break + + # Mempool should be empty. + assert_equal(set(self.nodes[0].getrawmempool()), set()) + + # Reduce amount to only use two inputs + spend_zaddr_amount = Decimal('20.0') - Decimal('0.0001') + spend_zaddr_id = self.call_z_sendmany(node0_taddr, node0_zaddr, spend_zaddr_amount) # utxo amount less fee + self.sync_all() + + # Spend should be in the mempool + assert_equal(set(self.nodes[0].getrawmempool()), set([ spend_zaddr_id ])) + + self.nodes[0].generate(1) + self.sync_all() + + # mempool should be empty. + assert_equal(set(self.nodes[0].getrawmempool()), set()) + + # Check 2: sendfrom is limited by -mempooltxinputlimit + node1_taddr = self.nodes[1].getnewaddress(); + recipients = [] + spend_taddr_amount = spend_zaddr_amount - Decimal('0.0001') + spend_taddr_output = Decimal('8') + # Create three outputs + self.call_z_sendmany(node0_zaddr, node1_taddr, spend_taddr_output - Decimal('0.0001')) + self.nodes[1].generate(1) + self.sync_all() + self.call_z_sendmany(node0_zaddr, node1_taddr, spend_taddr_output - Decimal('0.0001')) + self.nodes[1].generate(1) + self.sync_all() + self.call_z_sendmany(node0_zaddr, node1_taddr, spend_taddr_amount - spend_taddr_output - spend_taddr_output - Decimal('0.0001')) # note amount less fees + self.nodes[1].generate(1) + self.sync_all() + + # Should use three UTXOs and fail + try: + self.nodes[1].sendtoaddress(node0_taddr, spend_taddr_amount - Decimal('1')) + assert(False) + except JSONRPCException,e: + msg = e.error['message'] + assert_equal("Too many transparent inputs 3 > limit 2", msg) + + # mempool should be empty. + assert_equal(set(self.nodes[1].getrawmempool()), set()) + + # Should use two UTXOs and succeed + spend_taddr_id2 = self.nodes[1].sendtoaddress(node0_taddr, spend_taddr_output + spend_taddr_output - Decimal('1')) + + # Spend should be in the mempool + assert_equal(set(self.nodes[1].getrawmempool()), set([ spend_taddr_id2 ])) + +if __name__ == '__main__': + MempoolTxInputLimitTest().main() diff --git a/src/gtest/test_mempool.cpp b/src/gtest/test_mempool.cpp index e84b2dead..14b4d83b1 100644 --- a/src/gtest/test_mempool.cpp +++ b/src/gtest/test_mempool.cpp @@ -96,6 +96,9 @@ TEST(Mempool, TxInputLimit) { bool missingInputs; // Create an obviously-invalid transaction + // We intentionally set tx.nVersion = 0 to reliably trigger an error, as + // it's the first check that occurs after the -mempooltxinputlimit check, + // and it means that we don't have to mock out a lot of global state. CMutableTransaction mtx; mtx.nVersion = 0; mtx.vin.resize(10); @@ -121,7 +124,8 @@ TEST(Mempool, TxInputLimit) { CValidationState state3; CTransaction tx3(mtx); EXPECT_FALSE(AcceptToMemoryPool(pool, state3, tx3, false, &missingInputs)); - EXPECT_NE(state3.GetRejectReason(), "bad-txns-version-too-low"); + // The -mempooltxinputlimit check doesn't set a reason + EXPECT_EQ(state3.GetRejectReason(), ""); // Clear the limit mapArgs.erase("-mempooltxinputlimit"); From d8616d012a5738b893f6ab4ae53a41792402fe96 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 19 Jun 2017 21:11:34 -0700 Subject: [PATCH 0120/1062] Partial revert & fix for commit 9e84b5a ; code block in wrong location. --- src/wallet/asyncrpcoperation_sendmany.cpp | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/wallet/asyncrpcoperation_sendmany.cpp b/src/wallet/asyncrpcoperation_sendmany.cpp index 3bbbfcc05..df48fb772 100644 --- a/src/wallet/asyncrpcoperation_sendmany.cpp +++ b/src/wallet/asyncrpcoperation_sendmany.cpp @@ -204,17 +204,6 @@ bool AsyncRPCOperation_sendmany::main_impl() { throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, "Insufficient funds, no unspent notes found for zaddr from address."); } - // Check mempooltxinputlimit to avoid creating a transaction which the local mempool rejects - if (isfromtaddr_) { - size_t limit = (size_t)GetArg("-mempooltxinputlimit", 0); - if (limit > 0) { - size_t n = t_inputs_.size(); - if (n > limit) { - throw JSONRPCError(RPC_WALLET_ERROR, strprintf("Too many transparent inputs %zu > limit %zu", n, limit)); - } - } - } - CAmount t_inputs_total = 0; for (SendManyInputUTXO & t : t_inputs_) { t_inputs_total += std::get<2>(t); @@ -292,6 +281,15 @@ bool AsyncRPCOperation_sendmany::main_impl() { t_inputs_ = selectedTInputs; t_inputs_total = selectedUTXOAmount; + // Check mempooltxinputlimit to avoid creating a transaction which the local mempool rejects + size_t limit = (size_t)GetArg("-mempooltxinputlimit", 0); + if (limit > 0) { + size_t n = t_inputs_.size(); + if (n > limit) { + throw JSONRPCError(RPC_WALLET_ERROR, strprintf("Too many transparent inputs %zu > limit %zu", n, limit)); + } + } + // update the transaction with these inputs CMutableTransaction rawTx(tx_); for (SendManyInputUTXO & t : t_inputs_) { From b1eb4f251a5e144609f16761ea3a15668f3fc1d2 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 20 Jun 2017 19:54:11 +1200 Subject: [PATCH 0121/1062] Fix comment --- qa/rpc-tests/mempool_tx_input_limit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qa/rpc-tests/mempool_tx_input_limit.py b/qa/rpc-tests/mempool_tx_input_limit.py index ed0bf206e..14bac9f85 100755 --- a/qa/rpc-tests/mempool_tx_input_limit.py +++ b/qa/rpc-tests/mempool_tx_input_limit.py @@ -9,7 +9,7 @@ import os import shutil from time import sleep -# Create one-input, one-output, no-fee transaction: +# Test -mempooltxinputlimit class MempoolTxInputLimitTest(BitcoinTestFramework): alert_filename = None # Set by setup_network From 193b3e8b285fbee4f8689536c05a886885354e5d Mon Sep 17 00:00:00 2001 From: Daira Hopwood Date: Tue, 20 Jun 2017 10:03:17 +0100 Subject: [PATCH 0122/1062] Delete test that is redundant and inapplicable to Zcash. Signed-off-by: Daira Hopwood --- qa/rpc-tests/bip65-cltv.py | 89 -------------------------------------- 1 file changed, 89 deletions(-) delete mode 100755 qa/rpc-tests/bip65-cltv.py diff --git a/qa/rpc-tests/bip65-cltv.py b/qa/rpc-tests/bip65-cltv.py deleted file mode 100755 index e60395dce..000000000 --- a/qa/rpc-tests/bip65-cltv.py +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/env python2 -# Copyright (c) 2015 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -# -# Test the CHECKLOCKTIMEVERIFY (BIP65) soft-fork logic -# - -from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * -import os -import shutil - -class BIP65Test(BitcoinTestFramework): - - def setup_network(self): - self.nodes = [] - self.nodes.append(start_node(0, self.options.tmpdir, [])) - self.nodes.append(start_node(1, self.options.tmpdir, ["-blockversion=3"])) - self.nodes.append(start_node(2, self.options.tmpdir, ["-blockversion=4"])) - connect_nodes(self.nodes[1], 0) - connect_nodes(self.nodes[2], 0) - self.is_network_split = False - self.sync_all() - - def run_test(self): - cnt = self.nodes[0].getblockcount() - - # Mine some old-version blocks - self.nodes[1].generate(100) - self.sync_all() - if (self.nodes[0].getblockcount() != cnt + 100): - raise AssertionError("Failed to mine 100 version=3 blocks") - - # Mine 750 new-version blocks - for i in xrange(15): - self.nodes[2].generate(50) - self.sync_all() - if (self.nodes[0].getblockcount() != cnt + 850): - raise AssertionError("Failed to mine 750 version=4 blocks") - - # TODO: check that new CHECKLOCKTIMEVERIFY rules are not enforced - - # Mine 1 new-version block - self.nodes[2].generate(1) - self.sync_all() - if (self.nodes[0].getblockcount() != cnt + 851): - raise AssertionFailure("Failed to mine a version=4 blocks") - - # TODO: check that new CHECKLOCKTIMEVERIFY rules are enforced - - # Mine 198 new-version blocks - for i in xrange(2): - self.nodes[2].generate(99) - self.sync_all() - if (self.nodes[0].getblockcount() != cnt + 1049): - raise AssertionError("Failed to mine 198 version=4 blocks") - - # Mine 1 old-version block - self.nodes[1].generate(1) - self.sync_all() - if (self.nodes[0].getblockcount() != cnt + 1050): - raise AssertionError("Failed to mine a version=3 block after 949 version=4 blocks") - - # Mine 1 new-version blocks - self.nodes[2].generate(1) - self.sync_all() - if (self.nodes[0].getblockcount() != cnt + 1051): - raise AssertionError("Failed to mine a version=3 block") - - # Mine 1 old-version blocks - try: - self.nodes[1].generate(1) - raise AssertionError("Succeeded to mine a version=3 block after 950 version=4 blocks") - except JSONRPCException: - pass - self.sync_all() - if (self.nodes[0].getblockcount() != cnt + 1051): - raise AssertionError("Accepted a version=3 block after 950 version=4 blocks") - - # Mine 1 new-version blocks - self.nodes[2].generate(1) - self.sync_all() - if (self.nodes[0].getblockcount() != cnt + 1052): - raise AssertionError("Failed to mine a version=4 block") - -if __name__ == '__main__': - BIP65Test().main() From 99f6d5da6caf714f185c1a943291508b3ef7116c Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 20 Jun 2017 22:49:03 +0000 Subject: [PATCH 0123/1062] Fix #b1eb4f2 so test checks sendfrom as originally intended. Also reduce number of z_sendmany calls made so test runs quicker. --- qa/rpc-tests/mempool_tx_input_limit.py | 38 ++++++++++++++++++-------- 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/qa/rpc-tests/mempool_tx_input_limit.py b/qa/rpc-tests/mempool_tx_input_limit.py index 14bac9f85..b2d71cf3a 100755 --- a/qa/rpc-tests/mempool_tx_input_limit.py +++ b/qa/rpc-tests/mempool_tx_input_limit.py @@ -31,20 +31,34 @@ class MempoolTxInputLimitTest(BitcoinTestFramework): recipients = [] recipients.append({"address": to_addr, "amount": amount}) myopid = self.nodes[0].z_sendmany(from_addr, recipients) + return self.wait_and_assert_operationid_status(myopid) + def wait_and_assert_operationid_status(self, myopid, in_status='success', in_errormsg=None): + print('waiting for async operation {}'.format(myopid)) opids = [] opids.append(myopid) - - timeout = 120 + timeout = 300 status = None + errormsg = None + txid = None for x in xrange(1, timeout): results = self.nodes[0].z_getoperationresult(opids) if len(results)==0: sleep(1) else: status = results[0]["status"] - assert_equal("success", status) - return results[0]["result"]["txid"] + if status == "failed": + errormsg = results[0]['error']['message'] + elif status == "success": + txid = results[0]['result']['txid'] + break + print('...returned status: {}'.format(status)) + assert_equal(in_status, status) + if errormsg is not None: + assert(in_errormsg is not None) + assert_equal(in_errormsg in errormsg, True) + print('...returned error: {}'.format(errormsg)) + return txid def run_test(self): start_count = self.nodes[0].getblockcount() @@ -106,20 +120,20 @@ class MempoolTxInputLimitTest(BitcoinTestFramework): recipients = [] spend_taddr_amount = spend_zaddr_amount - Decimal('0.0001') spend_taddr_output = Decimal('8') + # Create three outputs - self.call_z_sendmany(node0_zaddr, node1_taddr, spend_taddr_output - Decimal('0.0001')) - self.nodes[1].generate(1) - self.sync_all() - self.call_z_sendmany(node0_zaddr, node1_taddr, spend_taddr_output - Decimal('0.0001')) - self.nodes[1].generate(1) - self.sync_all() - self.call_z_sendmany(node0_zaddr, node1_taddr, spend_taddr_amount - spend_taddr_output - spend_taddr_output - Decimal('0.0001')) # note amount less fees + recipients.append({"address":self.nodes[1].getnewaddress(), "amount": spend_taddr_output}) + recipients.append({"address":self.nodes[1].getnewaddress(), "amount": spend_taddr_output}) + recipients.append({"address":self.nodes[1].getnewaddress(), "amount": spend_taddr_amount - spend_taddr_output - spend_taddr_output}) + + myopid = self.nodes[0].z_sendmany(node0_zaddr, recipients) + self.wait_and_assert_operationid_status(myopid) self.nodes[1].generate(1) self.sync_all() # Should use three UTXOs and fail try: - self.nodes[1].sendtoaddress(node0_taddr, spend_taddr_amount - Decimal('1')) + self.nodes[1].sendfrom("", node0_taddr, spend_taddr_amount - Decimal('1')) assert(False) except JSONRPCException,e: msg = e.error['message'] From 6ea58d15315dae2f65825221f1844856fa49df7e Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 22 Jun 2017 09:34:10 +1200 Subject: [PATCH 0124/1062] Use sendfrom for both t-addr calls --- qa/rpc-tests/mempool_tx_input_limit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qa/rpc-tests/mempool_tx_input_limit.py b/qa/rpc-tests/mempool_tx_input_limit.py index b2d71cf3a..89a96a0ca 100755 --- a/qa/rpc-tests/mempool_tx_input_limit.py +++ b/qa/rpc-tests/mempool_tx_input_limit.py @@ -143,7 +143,7 @@ class MempoolTxInputLimitTest(BitcoinTestFramework): assert_equal(set(self.nodes[1].getrawmempool()), set()) # Should use two UTXOs and succeed - spend_taddr_id2 = self.nodes[1].sendtoaddress(node0_taddr, spend_taddr_output + spend_taddr_output - Decimal('1')) + spend_taddr_id2 = self.nodes[1].sendfrom("", node0_taddr, spend_taddr_output + spend_taddr_output - Decimal('1')) # Spend should be in the mempool assert_equal(set(self.nodes[1].getrawmempool()), set([ spend_taddr_id2 ])) From dc2ead60211bd58d62501421dd43534b2ce941be Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 22 Jun 2017 14:47:15 +1200 Subject: [PATCH 0125/1062] make-release.py: Versioning changes for 1.0.10. --- README.md | 2 +- configure.ac | 2 +- contrib/gitian-descriptors/gitian-linux.yml | 2 +- src/clientversion.h | 2 +- src/deprecation.h | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 6ad2f1b38..93cff70b4 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Zcash 1.0.9 +Zcash 1.0.10 ============= What is Zcash? diff --git a/configure.ac b/configure.ac index e2e4074be..597e4138f 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ dnl require autoconf 2.60 (AS_ECHO/AS_ECHO_N) AC_PREREQ([2.60]) define(_CLIENT_VERSION_MAJOR, 1) define(_CLIENT_VERSION_MINOR, 0) -define(_CLIENT_VERSION_REVISION, 9) +define(_CLIENT_VERSION_REVISION, 10) define(_CLIENT_VERSION_BUILD, 50) define(_ZC_BUILD_VAL, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, m4_incr(_CLIENT_VERSION_BUILD), m4_eval(_CLIENT_VERSION_BUILD < 50), 1, m4_eval(_CLIENT_VERSION_BUILD - 24), m4_eval(_CLIENT_VERSION_BUILD == 50), 1, , m4_eval(_CLIENT_VERSION_BUILD - 50))) define(_CLIENT_VERSION_SUFFIX, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, _CLIENT_VERSION_REVISION-beta$1, m4_eval(_CLIENT_VERSION_BUILD < 50), 1, _CLIENT_VERSION_REVISION-rc$1, m4_eval(_CLIENT_VERSION_BUILD == 50), 1, _CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION-$1))) diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml index 9281d4378..bfb3f3d90 100644 --- a/contrib/gitian-descriptors/gitian-linux.yml +++ b/contrib/gitian-descriptors/gitian-linux.yml @@ -1,5 +1,5 @@ --- -name: "zcash-1.0.9" +name: "zcash-1.0.10" enable_cache: true distro: "debian" suites: diff --git a/src/clientversion.h b/src/clientversion.h index 3bd8540c3..9692d9682 100644 --- a/src/clientversion.h +++ b/src/clientversion.h @@ -17,7 +17,7 @@ //! These need to be macros, as clientversion.cpp's and bitcoin*-res.rc's voodoo requires it #define CLIENT_VERSION_MAJOR 1 #define CLIENT_VERSION_MINOR 0 -#define CLIENT_VERSION_REVISION 9 +#define CLIENT_VERSION_REVISION 10 #define CLIENT_VERSION_BUILD 50 //! Set to true for release, false for prerelease or test build diff --git a/src/deprecation.h b/src/deprecation.h index 0b8e20b92..98c624942 100644 --- a/src/deprecation.h +++ b/src/deprecation.h @@ -6,7 +6,7 @@ #define ZCASH_DEPRECATION_H // Deprecation policy is 4th third-Tuesday after a release -static const int APPROX_RELEASE_HEIGHT = 120500; +static const int APPROX_RELEASE_HEIGHT = 136000; static const int WEEKS_UNTIL_DEPRECATION = 18; static const int DEPRECATION_HEIGHT = APPROX_RELEASE_HEIGHT + (WEEKS_UNTIL_DEPRECATION * 7 * 24 * 24); From c04ffa0e32a2db6bdf03b7442444cb11229125fb Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 22 Jun 2017 15:05:04 +1200 Subject: [PATCH 0126/1062] make-release.py: Updated manpages for 1.0.10. --- doc/man/zcash-cli.1 | 8 ++++---- doc/man/zcash-tx.1 | 8 ++++---- doc/man/zcashd.1 | 17 +++++++++++------ 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/doc/man/zcash-cli.1 b/doc/man/zcash-cli.1 index ab37c76f8..423b46134 100644 --- a/doc/man/zcash-cli.1 +++ b/doc/man/zcash-cli.1 @@ -1,9 +1,9 @@ -.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.4. -.TH ZCASH-CLI "1" "May 2017" "zcash-cli v1.0.9" "User Commands" +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. +.TH ZCASH-CLI "1" "June 2017" "zcash-cli v1.0.10" "User Commands" .SH NAME -zcash-cli \- manual page for zcash-cli v1.0.9 +zcash-cli \- manual page for zcash-cli v1.0.10 .SH DESCRIPTION -Zcash RPC client version v1.0.9 +Zcash RPC client version v1.0.10 .PP In order to ensure you are adequately protecting your privacy when using Zcash, please see . diff --git a/doc/man/zcash-tx.1 b/doc/man/zcash-tx.1 index a7468d7a8..ac4119969 100644 --- a/doc/man/zcash-tx.1 +++ b/doc/man/zcash-tx.1 @@ -1,9 +1,9 @@ -.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.4. -.TH ZCASH-TX "1" "May 2017" "zcash-tx v1.0.9" "User Commands" +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. +.TH ZCASH-TX "1" "June 2017" "zcash-tx v1.0.10" "User Commands" .SH NAME -zcash-tx \- manual page for zcash-tx v1.0.9 +zcash-tx \- manual page for zcash-tx v1.0.10 .SH DESCRIPTION -Zcash zcash\-tx utility version v1.0.9 +Zcash zcash\-tx utility version v1.0.10 .SS "Usage:" .TP zcash\-tx [options] [commands] diff --git a/doc/man/zcashd.1 b/doc/man/zcashd.1 index eed39a4e2..9c450b4ec 100644 --- a/doc/man/zcashd.1 +++ b/doc/man/zcashd.1 @@ -1,9 +1,9 @@ -.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.4. -.TH ZCASHD "1" "May 2017" "zcashd v1.0.9" "User Commands" +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. +.TH ZCASHD "1" "June 2017" "zcashd v1.0.10" "User Commands" .SH NAME -zcashd \- manual page for zcashd v1.0.9 +zcashd \- manual page for zcashd v1.0.10 .SH DESCRIPTION -Zcash Daemon version v1.0.9 +Zcash Daemon version v1.0.10 .PP In order to ensure you are adequately protecting your privacy when using Zcash, please see . @@ -54,7 +54,7 @@ Specify data directory \fB\-disabledeprecation=\fR .IP Disable block\-height node deprecation and automatic shutdown (example: -\fB\-disabledeprecation\fR=\fI\,1\/\fR.0.9) +\fB\-disabledeprecation\fR=\fI\,1\/\fR.0.10) .HP \fB\-exportdir=\fR .IP @@ -72,9 +72,14 @@ Imports blocks from external blk000??.dat file on startup .IP Keep at most unconnectable transactions in memory (default: 100) .HP +\fB\-mempooltxinputlimit=\fR +.IP +Set the maximum number of transparent inputs in a transaction that the +mempool will accept (default: 0 = no limit applied) +.HP \fB\-par=\fR .IP -Set the number of script verification threads (\fB\-4\fR to 16, 0 = auto, <0 = +Set the number of script verification threads (\fB\-2\fR to 16, 0 = auto, <0 = leave that many cores free, default: 0) .HP \fB\-pid=\fR From 93a63765b62f0934372008930bf87b8be58af66e Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 22 Jun 2017 15:13:04 +1200 Subject: [PATCH 0127/1062] make-release.py: Updated release notes and changelog for 1.0.10. --- contrib/debian/changelog | 6 +++ doc/authors.md | 13 +++-- doc/release-notes/release-notes-1.0.10.md | 58 +++++++++++++++++++++++ 3 files changed, 72 insertions(+), 5 deletions(-) create mode 100644 doc/release-notes/release-notes-1.0.10.md diff --git a/contrib/debian/changelog b/contrib/debian/changelog index 43ef18295..7bc699f88 100644 --- a/contrib/debian/changelog +++ b/contrib/debian/changelog @@ -1,3 +1,9 @@ +zcash (1.0.10) stable; urgency=medium + + * 1.0.10 release. + + -- Zcash Company Thu, 22 Jun 2017 15:13:04 +1200 + zcash (1.0.9) stable; urgency=medium * 1.0.9 release. diff --git a/doc/authors.md b/doc/authors.md index a2336391b..612e133af 100644 --- a/doc/authors.md +++ b/doc/authors.md @@ -1,18 +1,18 @@ Zcash Contributors ================== -Jack Grigg (407) -Simon Liu (259) +Jack Grigg (427) +Simon Liu (264) Sean Bowe (186) -Daira Hopwood (87) +Daira Hopwood (95) Taylor Hornby (65) -Wladimir J. van der Laan (58) +Wladimir J. van der Laan (60) Nathan Wilcox (51) Jay Graber (49) Jonas Schnelli (48) Kevin Gallagher (38) +Pieter Wuille (16) Cory Fields (15) -Pieter Wuille (14) nomnombtc (9) Paige Peterson (9) fanquake (5) @@ -28,6 +28,7 @@ Jeff Garzik (4) David Mercer (4) Daniel Cousens (4) lpescher (3) +kozyilmaz (3) Pavel Janík (3) Alfie John (3) str4d (2) @@ -65,6 +66,7 @@ Matt Quinn (1) Louis Nyffenegger (1) Leo Arias (1) Lars-Magnus Skog (1) +Kevin Pan (1) Jorge Timón (1) Jeffrey Walton (1) Ian Kelling (1) @@ -79,6 +81,7 @@ Chirag Davé (1) Casey Rodarmor (1) Cameron Boehmer (1) Bryan Stitt (1) +Boris Hajduk (1) Bob McElrath (1) Bitcoin Error Log (1) Allan Niemerg (1) diff --git a/doc/release-notes/release-notes-1.0.10.md b/doc/release-notes/release-notes-1.0.10.md new file mode 100644 index 000000000..640b834a9 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.10.md @@ -0,0 +1,58 @@ +Boris Hajduk (1): + documentatin z_validateaddress was missing param + +Daira Hopwood (8): + Delete old protocol version constants and simplify code that used them. fixes #2244 + Remove an unneeded version workaround as per @str4d's review comment. + Remove unneeded lax ECDSA signature verification. + Strict DER signatures are always enforced; remove the flag and code that used it. + Repair tests for strict DER signatures. While we're at it, repair a similar test for CLTV, and make the repaired RPC tests run by default. + Make transaction test failures print the comments preceding the test JSON. + Fix a comment that was made stale before launch by #1016 (commit 542da61). + Delete test that is redundant and inapplicable to Zcash. + +Jack Grigg (20): + Fix incorrect locking in CCryptoKeyStore + Use AtomicTimer for metrics screen thread count + Revert "Fix secp256k1 test compilation" + Squashed 'src/secp256k1/' changes from 22f60a6..84973d3 + Fix potential overflows in ECDSA DER parsers + Rename FALLBACK_DOWNLOAD_PATH to PRIORITY_DOWNLOAD_PATH + Add test for incorrect consensus logic + Correct consensus logic in ContextualCheckInputs + Add comments + Update Debian copyright list + Specify ECDSA constant sizes as constants + Remove redundant `= 0` initialisations + Ensure that ECDSA constant sizes are correctly-sized + Add test for -mempooltxinputlimit + Hold an ECCVerifyHandle in zcash-gtest + Additional testing of -mempooltxinputlimit + Fix comment + Use sendfrom for both t-addr calls + make-release.py: Versioning changes for 1.0.10. + make-release.py: Updated manpages for 1.0.10. + +Kevin Pan (1): + "getblocktemplate" could work without wallet + +Pieter Wuille (2): + Update key.cpp to new secp256k1 API + Switch to libsecp256k1-based validation for ECDSA + +Simon Liu (5): + Fix intermediate vpub_new leakage in multi joinsplit tx (#1360) + Add option 'mempooltxinputlimit' so the mempool can reject a transaction based on the number of transparent inputs. + Check mempooltxinputlimit when creating a transaction to avoid local mempool rejection. + Partial revert & fix for commit 9e84b5a ; code block in wrong location. + Fix #b1eb4f2 so test checks sendfrom as originally intended. + +Wladimir J. van der Laan (2): + Use real number of cores for default -par, ignore virtual cores + Remove ChainParams::DefaultMinerThreads + +kozyilmaz (3): + [macOS] system linker does not support “--version” option but only “-v” + option to disable building libraries (zcutil/build.sh) + support per platform filename and hash setting for dependencies + From 5073467dadb4a5d68cc7e52fc2d434383ea00f4f Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 22 Jun 2017 15:23:02 +1200 Subject: [PATCH 0128/1062] Move temporary release notes to final ones --- doc/release-notes.md | 14 -------------- doc/release-notes/release-notes-1.0.10.md | 21 +++++++++++++++++++++ 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/doc/release-notes.md b/doc/release-notes.md index 67ef103b3..a29094b51 100644 --- a/doc/release-notes.md +++ b/doc/release-notes.md @@ -4,17 +4,3 @@ release-notes at release time) Notable changes =============== -Signature validation using libsecp256k1 ---------------------------------------- - -ECDSA signatures inside Zcash transactions now use validation using -[https://github.com/bitcoin/secp256k1](libsecp256k1) instead of OpenSSL. - -Depending on the platform, this means a significant speedup for raw signature -validation speed. The advantage is largest on x86_64, where validation is over -five times faster. In practice, this translates to a raw reindexing and new -block validation times that are less than half of what it was before. - -Libsecp256k1 has undergone very extensive testing and validation upstream. - -A side effect of this change is that libconsensus no longer depends on OpenSSL. diff --git a/doc/release-notes/release-notes-1.0.10.md b/doc/release-notes/release-notes-1.0.10.md index 640b834a9..16d2a62ba 100644 --- a/doc/release-notes/release-notes-1.0.10.md +++ b/doc/release-notes/release-notes-1.0.10.md @@ -1,3 +1,24 @@ +Notable changes +=============== + +Signature validation using libsecp256k1 +--------------------------------------- + +ECDSA signatures inside Zcash transactions now use validation using +[https://github.com/bitcoin/secp256k1](libsecp256k1) instead of OpenSSL. + +Depending on the platform, this means a significant speedup for raw signature +validation speed. The advantage is largest on x86_64, where validation is over +five times faster. In practice, this translates to a raw reindexing and new +block validation times that are less than half of what it was before. + +Libsecp256k1 has undergone very extensive testing and validation upstream. + +A side effect of this change is that libconsensus no longer depends on OpenSSL. + +Changelog +========= + Boris Hajduk (1): documentatin z_validateaddress was missing param From f86111d3f56c05d5eb90ddabb93f191cc9d82c50 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 23 Jun 2017 01:02:01 +1200 Subject: [PATCH 0129/1062] Disable building Proton in Gitian This is the patch used to build 1.0.9 and 1.0.10. Part of #2404. --- contrib/gitian-descriptors/gitian-linux.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml index bfb3f3d90..952b59fa9 100644 --- a/contrib/gitian-descriptors/gitian-linux.yml +++ b/contrib/gitian-descriptors/gitian-linux.yml @@ -85,7 +85,7 @@ script: | BASEPREFIX=`pwd`/depends # Build dependencies for each host for i in $HOSTS; do - make ${MAKEOPTS} -C ${BASEPREFIX} HOST="${i}" + NO_PROTON="x" make ${MAKEOPTS} -C ${BASEPREFIX} HOST="${i}" done # Faketime for binaries From aff0bf7fa1b8d2ce5d7ce39afdcf4089438ea486 Mon Sep 17 00:00:00 2001 From: Daira Hopwood Date: Tue, 20 Jun 2017 21:09:33 +0100 Subject: [PATCH 0130/1062] Clean up imports to be pyflakes-checkable. fixes #2450 Signed-off-by: Daira Hopwood --- qa/rpc-tests/decodescript.py | 4 +++- qa/rpc-tests/disablewallet.py | 3 ++- qa/rpc-tests/forknotify.py | 4 ++-- qa/rpc-tests/fundrawtransaction.py | 9 ++++++--- qa/rpc-tests/getblocktemplate.py | 3 ++- qa/rpc-tests/getblocktemplate_longpoll.py | 4 +++- qa/rpc-tests/getblocktemplate_proposals.py | 2 +- qa/rpc-tests/hardforkdetection.py | 5 +++-- qa/rpc-tests/httpbasics.py | 3 ++- qa/rpc-tests/invalidateblock.py | 5 ++++- qa/rpc-tests/invalidblockrequest.py | 8 ++++---- qa/rpc-tests/keypool.py | 11 +++++------ qa/rpc-tests/listtransactions.py | 2 +- qa/rpc-tests/maxblocksinflight.py | 10 ++++++++-- qa/rpc-tests/mempool_coinbase_spends.py | 5 ++--- qa/rpc-tests/mempool_resurrect_test.py | 5 ++--- qa/rpc-tests/mempool_spendcoinbase.py | 7 ++++--- qa/rpc-tests/mempool_tx_input_limit.py | 14 ++++++++------ qa/rpc-tests/merkle_blocks.py | 7 ++++--- qa/rpc-tests/nodehandling.py | 9 +++------ qa/rpc-tests/p2p-acceptblock.py | 11 ++++++++--- qa/rpc-tests/prioritisetransaction.py | 9 +++++---- qa/rpc-tests/proton_test.py | 16 ++++------------ qa/rpc-tests/proxy_test.py | 10 +++++----- qa/rpc-tests/pruning.py | 6 +++++- qa/rpc-tests/rawtransactions.py | 8 +++++--- qa/rpc-tests/receivedby.py | 2 +- qa/rpc-tests/reindex.py | 6 ++++-- qa/rpc-tests/rest.py | 18 ++++++++++-------- qa/rpc-tests/rpcbind_test.py | 13 +++++++------ qa/rpc-tests/script_test.py | 11 +++++------ qa/rpc-tests/signrawtransactions.py | 3 ++- qa/rpc-tests/smartfees.py | 6 +++++- qa/rpc-tests/test_framework/blockstore.py | 5 ++++- qa/rpc-tests/test_framework/blocktools.py | 3 +-- qa/rpc-tests/test_framework/comptool.py | 7 ++++--- qa/rpc-tests/test_framework/script.py | 4 ++-- qa/rpc-tests/test_framework/test_framework.py | 7 +++++-- qa/rpc-tests/test_framework/util.py | 3 +-- qa/rpc-tests/txn_doublespend.py | 7 +++---- qa/rpc-tests/wallet.py | 13 +++++++++---- qa/rpc-tests/wallet_1941.py | 10 ++++++---- qa/rpc-tests/wallet_nullifiers.py | 15 +++++++++------ qa/rpc-tests/wallet_protectcoinbase.py | 13 +++++++++---- qa/rpc-tests/wallet_treestate.py | 11 ++++++----- qa/rpc-tests/walletbackup.py | 9 ++++++++- qa/rpc-tests/zapwallettxes.py | 4 +++- qa/rpc-tests/zcjoinsplit.py | 8 +++----- qa/rpc-tests/zcjoinsplitdoublespend.py | 9 ++++----- qa/rpc-tests/zmq_test.py | 15 +++------------ 50 files changed, 215 insertions(+), 167 deletions(-) diff --git a/qa/rpc-tests/decodescript.py b/qa/rpc-tests/decodescript.py index ce3bc94ef..89364a840 100755 --- a/qa/rpc-tests/decodescript.py +++ b/qa/rpc-tests/decodescript.py @@ -4,7 +4,9 @@ # file COPYING or http://www.opensource.org/licenses/mit-license.php. from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * +from test_framework.util import assert_equal, initialize_chain_clean, \ + start_nodes + class DecodeScriptTest(BitcoinTestFramework): """Tests decoding scripts via RPC command "decodescript".""" diff --git a/qa/rpc-tests/disablewallet.py b/qa/rpc-tests/disablewallet.py index 67acdcea1..339c6a8f6 100755 --- a/qa/rpc-tests/disablewallet.py +++ b/qa/rpc-tests/disablewallet.py @@ -8,7 +8,8 @@ # from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * +from test_framework.util import initialize_chain_clean, start_nodes + class DisableWalletTest (BitcoinTestFramework): diff --git a/qa/rpc-tests/forknotify.py b/qa/rpc-tests/forknotify.py index 0acef8e30..059bfadde 100755 --- a/qa/rpc-tests/forknotify.py +++ b/qa/rpc-tests/forknotify.py @@ -8,9 +8,9 @@ # from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * +from test_framework.util import start_node, connect_nodes + import os -import shutil class ForkNotifyTest(BitcoinTestFramework): diff --git a/qa/rpc-tests/fundrawtransaction.py b/qa/rpc-tests/fundrawtransaction.py index 1d15fd132..42896be4f 100755 --- a/qa/rpc-tests/fundrawtransaction.py +++ b/qa/rpc-tests/fundrawtransaction.py @@ -4,9 +4,12 @@ # file COPYING or http://www.opensource.org/licenses/mit-license.php. from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * -from pprint import pprint -from time import sleep +from test_framework.authproxy import JSONRPCException +from test_framework.util import assert_equal, assert_greater_than, \ + initialize_chain_clean, start_nodes, connect_nodes_bi, stop_nodes, \ + wait_bitcoinds + +from decimal import Decimal # Create one-input, one-output, no-fee transaction: class RawTransactionsTest(BitcoinTestFramework): diff --git a/qa/rpc-tests/getblocktemplate.py b/qa/rpc-tests/getblocktemplate.py index c9777c0c7..82082afa9 100755 --- a/qa/rpc-tests/getblocktemplate.py +++ b/qa/rpc-tests/getblocktemplate.py @@ -4,7 +4,8 @@ # file COPYING or http://www.opensource.org/licenses/mit-license.php. from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * +from test_framework.util import initialize_chain_clean, start_nodes, \ + connect_nodes_bi class GetBlockTemplateTest(BitcoinTestFramework): diff --git a/qa/rpc-tests/getblocktemplate_longpoll.py b/qa/rpc-tests/getblocktemplate_longpoll.py index aab456242..37a40384b 100755 --- a/qa/rpc-tests/getblocktemplate_longpoll.py +++ b/qa/rpc-tests/getblocktemplate_longpoll.py @@ -4,8 +4,10 @@ # file COPYING or http://www.opensource.org/licenses/mit-license.php. from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * +from test_framework.authproxy import AuthServiceProxy +from test_framework.util import random_transaction +from decimal import Decimal def check_array_result(object_array, to_match, expected): """ diff --git a/qa/rpc-tests/getblocktemplate_proposals.py b/qa/rpc-tests/getblocktemplate_proposals.py index 0c9e7e4cc..16b2e9b94 100755 --- a/qa/rpc-tests/getblocktemplate_proposals.py +++ b/qa/rpc-tests/getblocktemplate_proposals.py @@ -4,7 +4,7 @@ # file COPYING or http://www.opensource.org/licenses/mit-license.php. from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * +from test_framework.authproxy import JSONRPCException from binascii import a2b_hex, b2a_hex from hashlib import sha256 diff --git a/qa/rpc-tests/hardforkdetection.py b/qa/rpc-tests/hardforkdetection.py index d399dc964..553f363a9 100755 --- a/qa/rpc-tests/hardforkdetection.py +++ b/qa/rpc-tests/hardforkdetection.py @@ -5,9 +5,10 @@ # from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * +from test_framework.authproxy import JSONRPCException +from test_framework.util import assert_equal, start_node + import os -import shutil class HardForkDetectionTest(BitcoinTestFramework): diff --git a/qa/rpc-tests/httpbasics.py b/qa/rpc-tests/httpbasics.py index b66533543..5944bb488 100755 --- a/qa/rpc-tests/httpbasics.py +++ b/qa/rpc-tests/httpbasics.py @@ -8,7 +8,8 @@ # from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * +from test_framework.util import assert_equal, start_nodes + import base64 try: diff --git a/qa/rpc-tests/invalidateblock.py b/qa/rpc-tests/invalidateblock.py index 2b9c8154e..9e9917b89 100755 --- a/qa/rpc-tests/invalidateblock.py +++ b/qa/rpc-tests/invalidateblock.py @@ -8,7 +8,10 @@ # from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * +from test_framework.util import initialize_chain_clean, start_node, \ + connect_nodes_bi, sync_blocks + +import time class InvalidateTest(BitcoinTestFramework): diff --git a/qa/rpc-tests/invalidblockrequest.py b/qa/rpc-tests/invalidblockrequest.py index 272cc08f9..0ef353628 100755 --- a/qa/rpc-tests/invalidblockrequest.py +++ b/qa/rpc-tests/invalidblockrequest.py @@ -5,11 +5,11 @@ # from test_framework.test_framework import ComparisonTestFramework -from test_framework.util import * +from test_framework.util import assert_equal from test_framework.comptool import TestManager, TestInstance -from test_framework.mininode import * -from test_framework.blocktools import * -import logging +from test_framework.mininode import NetworkThread +from test_framework.blocktools import create_block, create_coinbase, create_transaction + import copy import time diff --git a/qa/rpc-tests/keypool.py b/qa/rpc-tests/keypool.py index 38d6874dc..a7b32e13f 100755 --- a/qa/rpc-tests/keypool.py +++ b/qa/rpc-tests/keypool.py @@ -6,18 +6,17 @@ # Exercise the wallet keypool, and interaction with wallet encryption/locking # Add python-bitcoinrpc to module search path: + +from test_framework.authproxy import JSONRPCException +from test_framework.util import check_json_precision, initialize_chain, \ + start_nodes, start_node, stop_nodes, wait_bitcoinds, bitcoind_processes + import os import sys - -import json import shutil -import subprocess import tempfile import traceback -from test_framework.util import * - - def check_array_result(object_array, to_match, expected): """ Pass in array of JSON objects, a dictionary with key/value pairs diff --git a/qa/rpc-tests/listtransactions.py b/qa/rpc-tests/listtransactions.py index 4df8d795d..a735f41ab 100755 --- a/qa/rpc-tests/listtransactions.py +++ b/qa/rpc-tests/listtransactions.py @@ -6,8 +6,8 @@ # Exercise the listtransactions API from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * +from decimal import Decimal def check_array_result(object_array, to_match, expected): """ diff --git a/qa/rpc-tests/maxblocksinflight.py b/qa/rpc-tests/maxblocksinflight.py index a601147ce..4c646040b 100755 --- a/qa/rpc-tests/maxblocksinflight.py +++ b/qa/rpc-tests/maxblocksinflight.py @@ -4,9 +4,15 @@ # file COPYING or http://www.opensource.org/licenses/mit-license.php. # -from test_framework.mininode import * +from test_framework.mininode import NodeConn, NodeConnCB, NetworkThread, \ + EarlyDisconnectError, CInv, msg_inv, mininode_lock from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * +from test_framework.util import initialize_chain_clean, start_nodes, \ + p2p_port + +import os +import time +import random import logging ''' diff --git a/qa/rpc-tests/mempool_coinbase_spends.py b/qa/rpc-tests/mempool_coinbase_spends.py index 578ddb1fb..a5f426092 100755 --- a/qa/rpc-tests/mempool_coinbase_spends.py +++ b/qa/rpc-tests/mempool_coinbase_spends.py @@ -9,9 +9,8 @@ # from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * -import os -import shutil +from test_framework.util import assert_equal, start_node, connect_nodes + # Create one-input, one-output, no-fee transaction: class MempoolCoinbaseTest(BitcoinTestFramework): diff --git a/qa/rpc-tests/mempool_resurrect_test.py b/qa/rpc-tests/mempool_resurrect_test.py index dd3f0486f..1cbbd2cd5 100755 --- a/qa/rpc-tests/mempool_resurrect_test.py +++ b/qa/rpc-tests/mempool_resurrect_test.py @@ -9,9 +9,8 @@ # from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * -import os -import shutil +from test_framework.util import assert_equal, start_node + # Create one-input, one-output, no-fee transaction: class MempoolCoinbaseTest(BitcoinTestFramework): diff --git a/qa/rpc-tests/mempool_spendcoinbase.py b/qa/rpc-tests/mempool_spendcoinbase.py index b2ec6937b..5366fb955 100755 --- a/qa/rpc-tests/mempool_spendcoinbase.py +++ b/qa/rpc-tests/mempool_spendcoinbase.py @@ -14,9 +14,10 @@ # from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * -import os -import shutil +from test_framework.authproxy import JSONRPCException +from test_framework.util import assert_equal, assert_greater_than, assert_raises, \ + start_node + # Create one-input, one-output, no-fee transaction: class MempoolSpendCoinbaseTest(BitcoinTestFramework): diff --git a/qa/rpc-tests/mempool_tx_input_limit.py b/qa/rpc-tests/mempool_tx_input_limit.py index 89a96a0ca..8483c5d0a 100755 --- a/qa/rpc-tests/mempool_tx_input_limit.py +++ b/qa/rpc-tests/mempool_tx_input_limit.py @@ -4,10 +4,12 @@ # file COPYING or http://www.opensource.org/licenses/mit-license.php. from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * -import os -import shutil -from time import sleep +from test_framework.authproxy import JSONRPCException +from test_framework.util import assert_equal, initialize_chain_clean, \ + start_node, connect_nodes + +import time +from decimal import Decimal # Test -mempooltxinputlimit class MempoolTxInputLimitTest(BitcoinTestFramework): @@ -44,7 +46,7 @@ class MempoolTxInputLimitTest(BitcoinTestFramework): for x in xrange(1, timeout): results = self.nodes[0].z_getoperationresult(opids) if len(results)==0: - sleep(1) + time.sleep(1) else: status = results[0]["status"] if status == "failed": @@ -90,7 +92,7 @@ class MempoolTxInputLimitTest(BitcoinTestFramework): for x in xrange(1, timeout): results = self.nodes[0].z_getoperationresult(opids) if len(results)==0: - sleep(1) + time.sleep(1) else: status = results[0]["status"] msg = results[0]["error"]["message"] diff --git a/qa/rpc-tests/merkle_blocks.py b/qa/rpc-tests/merkle_blocks.py index 5c333124f..2c0fcd203 100755 --- a/qa/rpc-tests/merkle_blocks.py +++ b/qa/rpc-tests/merkle_blocks.py @@ -8,9 +8,10 @@ # from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * -import os -import shutil +from test_framework.authproxy import JSONRPCException +from test_framework.util import assert_equal, assert_raises, \ + initialize_chain_clean, start_node, connect_nodes + class MerkleBlockTest(BitcoinTestFramework): diff --git a/qa/rpc-tests/nodehandling.py b/qa/rpc-tests/nodehandling.py index 9a77bd97e..391a935d0 100755 --- a/qa/rpc-tests/nodehandling.py +++ b/qa/rpc-tests/nodehandling.py @@ -8,13 +8,10 @@ # from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * -import base64 +from test_framework.util import assert_equal, connect_nodes_bi, p2p_port + +import time -try: - import http.client as httplib -except ImportError: - import httplib try: import urllib.parse as urlparse except ImportError: diff --git a/qa/rpc-tests/p2p-acceptblock.py b/qa/rpc-tests/p2p-acceptblock.py index 83c03eeb7..25221fbed 100755 --- a/qa/rpc-tests/p2p-acceptblock.py +++ b/qa/rpc-tests/p2p-acceptblock.py @@ -4,12 +4,17 @@ # file COPYING or http://www.opensource.org/licenses/mit-license.php. # -from test_framework.mininode import * +from test_framework.mininode import CBlockHeader, CInv, NodeConn, NodeConnCB, \ + NetworkThread, msg_block, msg_headers, msg_inv, msg_ping, msg_pong, \ + mininode_lock from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * -import time +from test_framework.util import assert_equal, initialize_chain_clean, \ + start_node, p2p_port from test_framework.blocktools import create_block, create_coinbase +import os +import time + ''' AcceptBlockTest -- test processing of unrequested blocks. diff --git a/qa/rpc-tests/prioritisetransaction.py b/qa/rpc-tests/prioritisetransaction.py index 19697fc4a..9eeb72e8c 100755 --- a/qa/rpc-tests/prioritisetransaction.py +++ b/qa/rpc-tests/prioritisetransaction.py @@ -4,9 +4,10 @@ # file COPYING or http://www.opensource.org/licenses/mit-license.php. from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * -from time import * +from test_framework.util import assert_equal, initialize_chain_clean, \ + start_node, connect_nodes from test_framework.mininode import COIN + import time @@ -37,7 +38,7 @@ class PrioritiseTransactionTest (BitcoinTestFramework): for x in xrange(1, timeout): results = self.nodes[0].z_getoperationresult(opids) if len(results)==0: - sleep(1) + time.sleep(1) else: status = results[0]["status"] if status == "failed": @@ -120,7 +121,7 @@ class PrioritiseTransactionTest (BitcoinTestFramework): break if time.time() - start > 30: raise AssertionError("Test timed out because prioritised transaction was not returned by getblocktemplate within 30 seconds.") - sleep(1) + time.sleep(1) block_template = self.nodes[0].getblocktemplate() assert(in_block_template) diff --git a/qa/rpc-tests/proton_test.py b/qa/rpc-tests/proton_test.py index b895c087f..d9fb27bd3 100755 --- a/qa/rpc-tests/proton_test.py +++ b/qa/rpc-tests/proton_test.py @@ -14,21 +14,13 @@ # from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * +from test_framework.util import assert_equal, bytes_to_hex_str, \ + start_nodes + from proton.handlers import MessagingHandler from proton.reactor import Container -import binascii -import struct -import threading -try: - import http.client as httplib -except ImportError: - import httplib -try: - import urllib.parse as urlparse -except ImportError: - import urlparse +import threading class Server(MessagingHandler): diff --git a/qa/rpc-tests/proxy_test.py b/qa/rpc-tests/proxy_test.py index 3623c1616..e4fb48820 100755 --- a/qa/rpc-tests/proxy_test.py +++ b/qa/rpc-tests/proxy_test.py @@ -2,14 +2,14 @@ # Copyright (c) 2015 The Bitcoin Core developers # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. -import socket -import traceback, sys -from binascii import hexlify -import time, os from test_framework.socks5 import Socks5Configuration, Socks5Command, Socks5Server, AddressType from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * +from test_framework.util import assert_equal, start_nodes + +import socket +import os + ''' Test plan: - Start bitcoind's with different proxy configurations diff --git a/qa/rpc-tests/pruning.py b/qa/rpc-tests/pruning.py index 21f8d6938..6bf79933c 100755 --- a/qa/rpc-tests/pruning.py +++ b/qa/rpc-tests/pruning.py @@ -12,8 +12,12 @@ # ******** from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * +from test_framework.authproxy import JSONRPCException +from test_framework.util import initialize_chain_clean, start_node, \ + connect_nodes, stop_node, sync_blocks + import os.path +import time def calc_usage(blockdir): return sum(os.path.getsize(blockdir+f) for f in os.listdir(blockdir) if os.path.isfile(blockdir+f))/(1024*1024) diff --git a/qa/rpc-tests/rawtransactions.py b/qa/rpc-tests/rawtransactions.py index 45517d3fd..2eb04813f 100755 --- a/qa/rpc-tests/rawtransactions.py +++ b/qa/rpc-tests/rawtransactions.py @@ -9,9 +9,11 @@ # from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * -from pprint import pprint -from time import sleep +from test_framework.authproxy import JSONRPCException +from test_framework.util import assert_equal, initialize_chain_clean, \ + start_nodes, connect_nodes_bi + +from decimal import Decimal # Create one-input, one-output, no-fee transaction: class RawTransactionsTest(BitcoinTestFramework): diff --git a/qa/rpc-tests/receivedby.py b/qa/rpc-tests/receivedby.py index 16d6bd4cf..fcab3e29d 100755 --- a/qa/rpc-tests/receivedby.py +++ b/qa/rpc-tests/receivedby.py @@ -6,8 +6,8 @@ # Exercise the listreceivedbyaddress API from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * +from decimal import Decimal def get_sub_array_from_array(object_array, to_match): ''' diff --git a/qa/rpc-tests/reindex.py b/qa/rpc-tests/reindex.py index f2e3f248e..ae7563192 100755 --- a/qa/rpc-tests/reindex.py +++ b/qa/rpc-tests/reindex.py @@ -6,9 +6,11 @@ # # Test -reindex with CheckBlockIndex # + from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * -import os.path +from test_framework.util import assert_equal, initialize_chain_clean, \ + start_node, stop_node, wait_bitcoinds + class ReindexTest(BitcoinTestFramework): diff --git a/qa/rpc-tests/rest.py b/qa/rpc-tests/rest.py index d315c66d3..35d7aa5d1 100755 --- a/qa/rpc-tests/rest.py +++ b/qa/rpc-tests/rest.py @@ -9,12 +9,14 @@ from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * -from struct import * +from test_framework.util import assert_equal, assert_greater_than, \ + initialize_chain_clean, start_nodes, connect_nodes_bi + +import struct import binascii import json import StringIO -import decimal +from decimal import Decimal try: import http.client as httplib @@ -28,7 +30,7 @@ except ImportError: def deser_uint256(f): r = 0 for i in range(8): - t = unpack(b" '3': bchr = lambda x: bytes([x]) bord = lambda x: x -import copy import struct +import binascii -import test_framework.bignum +from test_framework import bignum MAX_SCRIPT_SIZE = 10000 MAX_SCRIPT_ELEMENT_SIZE = 520 diff --git a/qa/rpc-tests/test_framework/test_framework.py b/qa/rpc-tests/test_framework/test_framework.py index f44a10a40..56151bb3e 100755 --- a/qa/rpc-tests/test_framework/test_framework.py +++ b/qa/rpc-tests/test_framework/test_framework.py @@ -13,8 +13,11 @@ import shutil import tempfile import traceback -from authproxy import AuthServiceProxy, JSONRPCException -from util import * +from authproxy import JSONRPCException +from util import assert_equal, check_json_precision, \ + initialize_chain, initialize_chain_clean, \ + start_nodes, connect_nodes_bi, stop_nodes, \ + sync_blocks, sync_mempools, wait_bitcoinds class BitcoinTestFramework(object): diff --git a/qa/rpc-tests/test_framework/util.py b/qa/rpc-tests/test_framework/util.py index f5ef9dec6..4cf925c36 100644 --- a/qa/rpc-tests/test_framework/util.py +++ b/qa/rpc-tests/test_framework/util.py @@ -21,8 +21,7 @@ import subprocess import time import re -from authproxy import AuthServiceProxy, JSONRPCException -from util import * +from authproxy import AuthServiceProxy def p2p_port(n): return 11000 + n + os.getpid()%999 diff --git a/qa/rpc-tests/txn_doublespend.py b/qa/rpc-tests/txn_doublespend.py index 32699ad9d..3a45938b7 100755 --- a/qa/rpc-tests/txn_doublespend.py +++ b/qa/rpc-tests/txn_doublespend.py @@ -8,10 +8,9 @@ # from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * -from decimal import Decimal -import os -import shutil +from test_framework.util import assert_equal, connect_nodes, \ + sync_blocks, gather_inputs + class TxnMallTest(BitcoinTestFramework): diff --git a/qa/rpc-tests/wallet.py b/qa/rpc-tests/wallet.py index ff827892a..0e2a7983b 100755 --- a/qa/rpc-tests/wallet.py +++ b/qa/rpc-tests/wallet.py @@ -5,8 +5,13 @@ from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * -from time import * +from test_framework.authproxy import JSONRPCException +from test_framework.util import assert_equal, assert_greater_than, \ + initialize_chain_clean, start_nodes, start_node, connect_nodes_bi, \ + stop_nodes, sync_blocks, sync_mempools, wait_bitcoinds + +import time +from decimal import Decimal class WalletTest (BitcoinTestFramework): @@ -306,7 +311,7 @@ class WalletTest (BitcoinTestFramework): for x in xrange(1, timeout): results = self.nodes[2].z_getoperationresult(opids) if len(results)==0: - sleep(1) + time.sleep(1) else: status = results[0]["status"] mytxid = results[0]["result"]["txid"] @@ -363,7 +368,7 @@ class WalletTest (BitcoinTestFramework): for x in xrange(1, timeout): results = self.nodes[2].z_getoperationresult(opids) if len(results)==0: - sleep(1) + time.sleep(1) else: status = results[0]["status"] break diff --git a/qa/rpc-tests/wallet_1941.py b/qa/rpc-tests/wallet_1941.py index 5f2fe3f72..d6f024020 100755 --- a/qa/rpc-tests/wallet_1941.py +++ b/qa/rpc-tests/wallet_1941.py @@ -6,10 +6,12 @@ # This is a regression test for #1941. from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * -from time import * +from test_framework.util import assert_equal, initialize_chain_clean, \ + initialize_datadir, start_nodes, start_node, connect_nodes_bi, \ + bitcoind_processes -import sys +import time +from decimal import Decimal starttime = 1388534400 @@ -49,7 +51,7 @@ class Wallet1941RegressionTest (BitcoinTestFramework): for x in xrange(1, timeout): results = self.nodes[0].z_getoperationresult(opids) if len(results)==0: - sleep(1) + time.sleep(1) else: status = results[0]["status"] if status == "failed": diff --git a/qa/rpc-tests/wallet_nullifiers.py b/qa/rpc-tests/wallet_nullifiers.py index 93f5a499d..b69b9d7d1 100755 --- a/qa/rpc-tests/wallet_nullifiers.py +++ b/qa/rpc-tests/wallet_nullifiers.py @@ -5,8 +5,11 @@ from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * -from time import * +from test_framework.util import assert_equal, start_node, \ + start_nodes, connect_nodes_bi, bitcoind_processes + +import time +from decimal import Decimal class WalletNullifiersTest (BitcoinTestFramework): @@ -32,7 +35,7 @@ class WalletNullifiersTest (BitcoinTestFramework): for x in xrange(1, timeout): results = self.nodes[0].z_getoperationresult(opids) if len(results)==0: - sleep(1) + time.sleep(1) else: status = results[0]["status"] assert_equal("success", status) @@ -73,7 +76,7 @@ class WalletNullifiersTest (BitcoinTestFramework): for x in xrange(1, timeout): results = self.nodes[0].z_getoperationresult(opids) if len(results)==0: - sleep(1) + time.sleep(1) else: status = results[0]["status"] assert_equal("success", status) @@ -105,7 +108,7 @@ class WalletNullifiersTest (BitcoinTestFramework): for x in xrange(1, timeout): results = self.nodes[2].z_getoperationresult(opids) if len(results)==0: - sleep(1) + time.sleep(1) else: status = results[0]["status"] assert_equal("success", status) @@ -146,7 +149,7 @@ class WalletNullifiersTest (BitcoinTestFramework): for x in xrange(1, timeout): results = self.nodes[1].z_getoperationresult(opids) if len(results)==0: - sleep(1) + time.sleep(1) else: status = results[0]["status"] assert_equal("success", status) diff --git a/qa/rpc-tests/wallet_protectcoinbase.py b/qa/rpc-tests/wallet_protectcoinbase.py index 1ed0d5b1f..6dd023c55 100755 --- a/qa/rpc-tests/wallet_protectcoinbase.py +++ b/qa/rpc-tests/wallet_protectcoinbase.py @@ -5,8 +5,13 @@ from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * -from time import * +from test_framework.authproxy import JSONRPCException +from test_framework.util import assert_equal, initialize_chain_clean, \ + start_nodes, connect_nodes_bi + +import sys +import time +from decimal import Decimal class WalletProtectCoinbaseTest (BitcoinTestFramework): @@ -35,7 +40,7 @@ class WalletProtectCoinbaseTest (BitcoinTestFramework): for x in xrange(1, timeout): results = self.nodes[0].z_getoperationresult(opids) if len(results)==0: - sleep(1) + time.sleep(1) else: status = results[0]["status"] if status == "failed": @@ -94,7 +99,7 @@ class WalletProtectCoinbaseTest (BitcoinTestFramework): for x in xrange(1, timeout): results = self.nodes[0].z_getoperationresult(opids) if len(results)==0: - sleep(1) + time.sleep(1) else: status = results[0]["status"] errorString = results[0]["error"]["message"] diff --git a/qa/rpc-tests/wallet_treestate.py b/qa/rpc-tests/wallet_treestate.py index ae55368f0..c7fe9bf25 100755 --- a/qa/rpc-tests/wallet_treestate.py +++ b/qa/rpc-tests/wallet_treestate.py @@ -5,10 +5,11 @@ from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * -from time import * +from test_framework.util import assert_equal, initialize_chain_clean, \ + start_nodes, connect_nodes_bi -import sys +import time +from decimal import Decimal class WalletTreeStateTest (BitcoinTestFramework): @@ -35,7 +36,7 @@ class WalletTreeStateTest (BitcoinTestFramework): for x in xrange(1, timeout): results = self.nodes[0].z_getoperationresult(opids) if len(results)==0: - sleep(1) + time.sleep(1) else: status = results[0]["status"] if status == "failed": @@ -106,7 +107,7 @@ class WalletTreeStateTest (BitcoinTestFramework): status = results[0]["status"] if status == "executing": break - sleep(1) + time.sleep(1) # Now mine Tx 1 which will change global treestate before Tx 2's second joinsplit begins processing self.sync_all() diff --git a/qa/rpc-tests/walletbackup.py b/qa/rpc-tests/walletbackup.py index 5f3eb6fcc..37c1db9a5 100755 --- a/qa/rpc-tests/walletbackup.py +++ b/qa/rpc-tests/walletbackup.py @@ -34,9 +34,16 @@ and confirm again balances are correct. """ from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * +from test_framework.util import assert_equal, initialize_chain_clean, \ + start_nodes, start_node, connect_nodes, stop_node, \ + sync_blocks, sync_mempools + +import os +import shutil from random import randint +from decimal import Decimal import logging + logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.INFO) class WalletBackupTest(BitcoinTestFramework): diff --git a/qa/rpc-tests/zapwallettxes.py b/qa/rpc-tests/zapwallettxes.py index b15138818..c0c4e3646 100755 --- a/qa/rpc-tests/zapwallettxes.py +++ b/qa/rpc-tests/zapwallettxes.py @@ -4,7 +4,9 @@ # file COPYING or http://www.opensource.org/licenses/mit-license.php. from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * +from test_framework.authproxy import JSONRPCException +from test_framework.util import assert_equal, initialize_chain_clean, \ + start_nodes, start_node, connect_nodes_bi, bitcoind_processes class ZapWalletTXesTest (BitcoinTestFramework): diff --git a/qa/rpc-tests/zcjoinsplit.py b/qa/rpc-tests/zcjoinsplit.py index 2b439e831..7e5aba6e3 100755 --- a/qa/rpc-tests/zcjoinsplit.py +++ b/qa/rpc-tests/zcjoinsplit.py @@ -5,11 +5,9 @@ # from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * -from decimal import Decimal -import os -import shutil -import sys +from test_framework.util import assert_equal, start_node, \ + gather_inputs + class JoinSplitTest(BitcoinTestFramework): def setup_network(self): diff --git a/qa/rpc-tests/zcjoinsplitdoublespend.py b/qa/rpc-tests/zcjoinsplitdoublespend.py index cb89a9182..b8411c49d 100755 --- a/qa/rpc-tests/zcjoinsplitdoublespend.py +++ b/qa/rpc-tests/zcjoinsplitdoublespend.py @@ -5,11 +5,10 @@ # from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * -from decimal import Decimal -import os -import shutil -import sys +from test_framework.authproxy import JSONRPCException +from test_framework.util import assert_equal, connect_nodes, \ + gather_inputs, sync_blocks + import time class JoinSplitTest(BitcoinTestFramework): diff --git a/qa/rpc-tests/zmq_test.py b/qa/rpc-tests/zmq_test.py index 97850bea3..901d61699 100755 --- a/qa/rpc-tests/zmq_test.py +++ b/qa/rpc-tests/zmq_test.py @@ -8,19 +8,10 @@ # from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * -import zmq -import binascii -import struct +from test_framework.util import assert_equal, bytes_to_hex_str, start_nodes -try: - import http.client as httplib -except ImportError: - import httplib -try: - import urllib.parse as urlparse -except ImportError: - import urlparse +import zmq +import struct class ZMQTest (BitcoinTestFramework): From 811b36ba80f4a4199463eb5e7ad0cf9c288c81bb Mon Sep 17 00:00:00 2001 From: Daira Hopwood Date: Tue, 20 Jun 2017 21:20:50 +0100 Subject: [PATCH 0131/1062] For unused variables reported by pyflakes, either remove the variable, suppress the warning, or fix a bug (if the wrong variable was used). refs #2450 Signed-off-by: Daira Hopwood --- qa/rpc-tests/forknotify.py | 2 +- qa/rpc-tests/hardforkdetection.py | 2 +- qa/rpc-tests/httpbasics.py | 4 ++-- qa/rpc-tests/maxblocksinflight.py | 1 - qa/rpc-tests/mempool_coinbase_spends.py | 3 +-- qa/rpc-tests/mempool_tx_input_limit.py | 3 --- qa/rpc-tests/pruning.py | 4 ++-- qa/rpc-tests/rawtransactions.py | 2 ++ qa/rpc-tests/receivedby.py | 3 +-- qa/rpc-tests/rpcbind_test.py | 1 - qa/rpc-tests/test_framework/util.py | 2 +- qa/rpc-tests/txn_doublespend.py | 2 +- qa/rpc-tests/wallet.py | 12 ++++++------ qa/rpc-tests/wallet_nullifiers.py | 1 + qa/rpc-tests/zmq_test.py | 1 + 15 files changed, 20 insertions(+), 23 deletions(-) diff --git a/qa/rpc-tests/forknotify.py b/qa/rpc-tests/forknotify.py index 059bfadde..1be750a64 100755 --- a/qa/rpc-tests/forknotify.py +++ b/qa/rpc-tests/forknotify.py @@ -19,7 +19,7 @@ class ForkNotifyTest(BitcoinTestFramework): def setup_network(self): self.nodes = [] self.alert_filename = os.path.join(self.options.tmpdir, "alert.txt") - with open(self.alert_filename, 'w') as f: + with open(self.alert_filename, 'w'): pass # Just open then close to create zero-length file self.nodes.append(start_node(0, self.options.tmpdir, ["-blockversion=2", "-alertnotify=echo %s >> \"" + self.alert_filename + "\""])) diff --git a/qa/rpc-tests/hardforkdetection.py b/qa/rpc-tests/hardforkdetection.py index 553f363a9..dbfb5cd34 100755 --- a/qa/rpc-tests/hardforkdetection.py +++ b/qa/rpc-tests/hardforkdetection.py @@ -17,7 +17,7 @@ class HardForkDetectionTest(BitcoinTestFramework): def setup_network(self): self.nodes = [] self.alert_filename = os.path.join(self.options.tmpdir, "alert.txt") - with open(self.alert_filename, 'w') as f: + with open(self.alert_filename, 'w'): pass # Just open then close to create zero-length file self.nodes.append(start_node(0, self.options.tmpdir, ["-blockversion=2", "-alertnotify=echo %s >> \"" + self.alert_filename + "\""])) diff --git a/qa/rpc-tests/httpbasics.py b/qa/rpc-tests/httpbasics.py index 5944bb488..b2ea84b4f 100755 --- a/qa/rpc-tests/httpbasics.py +++ b/qa/rpc-tests/httpbasics.py @@ -44,7 +44,7 @@ class HTTPBasicsTest (BitcoinTestFramework): #send 2nd request without closing connection conn.request('POST', '/', '{"method": "getchaintips"}', headers) out2 = conn.getresponse().read(); - assert_equal('"error":null' in out1, True) #must also response with a correct json-rpc message + assert_equal('"error":null' in out2, True) # must also response with a correct json-rpc message assert_equal(conn.sock!=None, True) #according to http/1.1 connection must still be open! conn.close() @@ -61,7 +61,7 @@ class HTTPBasicsTest (BitcoinTestFramework): #send 2nd request without closing connection conn.request('POST', '/', '{"method": "getchaintips"}', headers) out2 = conn.getresponse().read(); - assert_equal('"error":null' in out1, True) #must also response with a correct json-rpc message + assert_equal('"error":null' in out2, True) # must also response with a correct json-rpc message assert_equal(conn.sock!=None, True) #according to http/1.1 connection must still be open! conn.close() diff --git a/qa/rpc-tests/maxblocksinflight.py b/qa/rpc-tests/maxblocksinflight.py index 4c646040b..227679b69 100755 --- a/qa/rpc-tests/maxblocksinflight.py +++ b/qa/rpc-tests/maxblocksinflight.py @@ -49,7 +49,6 @@ class TestManager(NodeConnCB): def run(self): try: - fail = False self.connection.rpc.generate(1) # Leave IBD numBlocksToGenerate = [ 8, 16, 128, 1024 ] diff --git a/qa/rpc-tests/mempool_coinbase_spends.py b/qa/rpc-tests/mempool_coinbase_spends.py index a5f426092..041de831b 100755 --- a/qa/rpc-tests/mempool_coinbase_spends.py +++ b/qa/rpc-tests/mempool_coinbase_spends.py @@ -35,8 +35,6 @@ class MempoolCoinbaseTest(BitcoinTestFramework): return signresult["hex"] def run_test(self): - start_count = self.nodes[0].getblockcount() - # Mine three blocks. After this, nodes[0] blocks # 101, 102, and 103 are spend-able. new_blocks = self.nodes[1].generate(4) @@ -68,6 +66,7 @@ class MempoolCoinbaseTest(BitcoinTestFramework): # Broadcast and mine 103_1: spend_103_1_id = self.nodes[0].sendrawtransaction(spend_103_1_raw) + [spend_103_1_id] # hush pyflakes self.nodes[0].generate(1) # ... now put spend_101 and spend_102_1 in memory pools: diff --git a/qa/rpc-tests/mempool_tx_input_limit.py b/qa/rpc-tests/mempool_tx_input_limit.py index 8483c5d0a..538122671 100755 --- a/qa/rpc-tests/mempool_tx_input_limit.py +++ b/qa/rpc-tests/mempool_tx_input_limit.py @@ -63,8 +63,6 @@ class MempoolTxInputLimitTest(BitcoinTestFramework): return txid def run_test(self): - start_count = self.nodes[0].getblockcount() - self.nodes[0].generate(100) self.sync_all() # Mine three blocks. After this, nodes[0] blocks @@ -118,7 +116,6 @@ class MempoolTxInputLimitTest(BitcoinTestFramework): assert_equal(set(self.nodes[0].getrawmempool()), set()) # Check 2: sendfrom is limited by -mempooltxinputlimit - node1_taddr = self.nodes[1].getnewaddress(); recipients = [] spend_taddr_amount = spend_zaddr_amount - Decimal('0.0001') spend_taddr_output = Decimal('8') diff --git a/qa/rpc-tests/pruning.py b/qa/rpc-tests/pruning.py index 6bf79933c..2639060fa 100755 --- a/qa/rpc-tests/pruning.py +++ b/qa/rpc-tests/pruning.py @@ -194,7 +194,7 @@ class PruneTest(BitcoinTestFramework): try: self.nodes[2].getblock(self.forkhash) raise AssertionError("Old block wasn't pruned so can't test redownload") - except JSONRPCException as e: + except JSONRPCException: print "Will need to redownload block",self.forkheight # Verify that we have enough history to reorg back to the fork point @@ -257,7 +257,7 @@ class PruneTest(BitcoinTestFramework): newtx = newtx + rawtx[94:] # Appears to be ever so slightly faster to sign with SIGHASH_NONE signresult = node.signrawtransaction(newtx,None,None,"NONE") - txid = node.sendrawtransaction(signresult["hex"], True) + node.sendrawtransaction(signresult["hex"], True) # Mine a full sized block which will be these transactions we just created node.generate(1) diff --git a/qa/rpc-tests/rawtransactions.py b/qa/rpc-tests/rawtransactions.py index 2eb04813f..82dbb7b26 100755 --- a/qa/rpc-tests/rawtransactions.py +++ b/qa/rpc-tests/rawtransactions.py @@ -106,11 +106,13 @@ class RawTransactionsTest(BitcoinTestFramework): mSigObj = self.nodes[2].addmultisigaddress(2, [addr1Obj['pubkey'], addr2Obj['pubkey'], addr3Obj['pubkey']]) mSigObjValid = self.nodes[2].validateaddress(mSigObj) + assert_equal(mSigObjValid['isvalid'], True) txId = self.nodes[0].sendtoaddress(mSigObj, 2.2); decTx = self.nodes[0].gettransaction(txId) rawTx = self.nodes[0].decoderawtransaction(decTx['hex']) sPK = rawTx['vout'][0]['scriptPubKey']['hex'] + [sPK] # hush pyflakes self.sync_all() self.nodes[0].generate(1) self.sync_all() diff --git a/qa/rpc-tests/receivedby.py b/qa/rpc-tests/receivedby.py index fcab3e29d..e928aec8b 100755 --- a/qa/rpc-tests/receivedby.py +++ b/qa/rpc-tests/receivedby.py @@ -14,7 +14,6 @@ def get_sub_array_from_array(object_array, to_match): Finds and returns a sub array from an array of arrays. to_match should be a unique idetifier of a sub array ''' - num_matched = 0 for item in object_array: all_match = True for key,value in to_match.items(): @@ -120,7 +119,7 @@ class ReceivedByTest(BitcoinTestFramework): received_by_account_json = get_sub_array_from_array(self.nodes[1].listreceivedbyaccount(),{"account":account}) if len(received_by_account_json) == 0: raise AssertionError("No accounts found in node") - balance_by_account = rec_by_accountArr = self.nodes[1].getreceivedbyaccount(account) + balance_by_account = self.nodes[1].getreceivedbyaccount(account) txid = self.nodes[0].sendtoaddress(addr, 0.1) self.sync_all() diff --git a/qa/rpc-tests/rpcbind_test.py b/qa/rpc-tests/rpcbind_test.py index ca0f9b1f8..676a4bf32 100755 --- a/qa/rpc-tests/rpcbind_test.py +++ b/qa/rpc-tests/rpcbind_test.py @@ -120,7 +120,6 @@ def main(): check_json_precision() success = False - nodes = [] try: print("Initializing test directory "+options.tmpdir) if not os.path.isdir(options.tmpdir): diff --git a/qa/rpc-tests/test_framework/util.py b/qa/rpc-tests/test_framework/util.py index 4cf925c36..8ac09f472 100644 --- a/qa/rpc-tests/test_framework/util.py +++ b/qa/rpc-tests/test_framework/util.py @@ -152,7 +152,7 @@ def initialize_chain_clean(test_dir, num_nodes): Useful if a test case wants complete control over initialization. """ for i in range(num_nodes): - datadir=initialize_datadir(test_dir, i) + initialize_datadir(test_dir, i) def _rpchost_to_args(rpchost): diff --git a/qa/rpc-tests/txn_doublespend.py b/qa/rpc-tests/txn_doublespend.py index 3a45938b7..bbe383d16 100755 --- a/qa/rpc-tests/txn_doublespend.py +++ b/qa/rpc-tests/txn_doublespend.py @@ -76,7 +76,7 @@ class TxnMallTest(BitcoinTestFramework): assert_equal(tx2["confirmations"], 0) # Now give doublespend to miner: - mutated_txid = self.nodes[2].sendrawtransaction(doublespend["hex"]) + self.nodes[2].sendrawtransaction(doublespend["hex"]) # ... mine a block... self.nodes[2].generate(1) diff --git a/qa/rpc-tests/wallet.py b/qa/rpc-tests/wallet.py index 0e2a7983b..0aeae995d 100755 --- a/qa/rpc-tests/wallet.py +++ b/qa/rpc-tests/wallet.py @@ -105,7 +105,7 @@ class WalletTest (BitcoinTestFramework): # Send 10 BTC normal address = self.nodes[0].getnewaddress("") self.nodes[2].settxfee(Decimal('0.001')) - txid = self.nodes[2].sendtoaddress(address, 10, "", "", False) + self.nodes[2].sendtoaddress(address, 10, "", "", False) self.sync_all() self.nodes[2].generate(1) self.sync_all() @@ -115,7 +115,7 @@ class WalletTest (BitcoinTestFramework): assert_equal(self.nodes[0].getbalance("*"), Decimal('10.00000000')) # Send 10 BTC with subtract fee from amount - txid = self.nodes[2].sendtoaddress(address, 10, "", "", True) + self.nodes[2].sendtoaddress(address, 10, "", "", True) self.sync_all() self.nodes[2].generate(1) self.sync_all() @@ -125,7 +125,7 @@ class WalletTest (BitcoinTestFramework): assert_equal(self.nodes[0].getbalance("*"), Decimal('19.99900000')) # Sendmany 10 BTC - txid = self.nodes[2].sendmany("", {address: 10}, 0, "", []) + self.nodes[2].sendmany("", {address: 10}, 0, "", []) self.sync_all() self.nodes[2].generate(1) self.sync_all() @@ -135,7 +135,7 @@ class WalletTest (BitcoinTestFramework): assert_equal(self.nodes[0].getbalance("*"), Decimal('29.99900000')) # Sendmany 10 BTC with subtract fee from amount - txid = self.nodes[2].sendmany("", {address: 10}, 0, "", [address]) + self.nodes[2].sendmany("", {address: 10}, 0, "", [address]) self.sync_all() self.nodes[2].generate(1) self.sync_all() @@ -176,7 +176,7 @@ class WalletTest (BitcoinTestFramework): signedRawTx = self.nodes[1].signrawtransaction(rawTx) decRawTx = self.nodes[1].decoderawtransaction(signedRawTx['hex']) zeroValueTxid= decRawTx['txid'] - sendResp = self.nodes[1].sendrawtransaction(signedRawTx['hex']) + self.nodes[1].sendrawtransaction(signedRawTx['hex']) self.sync_all() self.nodes[1].generate(1) #mine a block @@ -243,7 +243,7 @@ class WalletTest (BitcoinTestFramework): self.sync_all() mybalance = self.nodes[2].z_getbalance(mytaddr) - assert_equal(self.nodes[2].z_getbalance(mytaddr), Decimal('10.0')); + assert_equal(mybalance, Decimal('10.0')); mytxdetails = self.nodes[2].gettransaction(mytxid) myvjoinsplits = mytxdetails["vjoinsplit"] diff --git a/qa/rpc-tests/wallet_nullifiers.py b/qa/rpc-tests/wallet_nullifiers.py index b69b9d7d1..b7e94b6a6 100755 --- a/qa/rpc-tests/wallet_nullifiers.py +++ b/qa/rpc-tests/wallet_nullifiers.py @@ -154,6 +154,7 @@ class WalletNullifiersTest (BitcoinTestFramework): status = results[0]["status"] assert_equal("success", status) mytxid = results[0]["result"]["txid"] + [mytxid] # hush pyflakes break self.sync_all() diff --git a/qa/rpc-tests/zmq_test.py b/qa/rpc-tests/zmq_test.py index 901d61699..b895c628c 100755 --- a/qa/rpc-tests/zmq_test.py +++ b/qa/rpc-tests/zmq_test.py @@ -42,6 +42,7 @@ class ZMQTest (BitcoinTestFramework): assert_equal(topic, b"hashtx") body = msg[1] nseq = msg[2] + [nseq] # hush pyflakes msgSequence = struct.unpack(' Date: Tue, 20 Jun 2017 21:23:24 +0100 Subject: [PATCH 0132/1062] Cosmetics (trailing whitespace, comment conventions, etc.) Signed-off-by: Daira Hopwood --- qa/rpc-tests/httpbasics.py | 40 +++++++-------- qa/rpc-tests/invalidateblock.py | 8 ++- qa/rpc-tests/invalidblockrequest.py | 2 +- qa/rpc-tests/maxblocksinflight.py | 4 +- qa/rpc-tests/rawtransactions.py | 12 ++--- qa/rpc-tests/receivedby.py | 40 +++++++-------- qa/rpc-tests/rest.py | 59 +++++++++++------------ qa/rpc-tests/rpcbind_test.py | 2 +- qa/rpc-tests/test_framework/blockstore.py | 2 +- qa/rpc-tests/zapwallettxes.py | 46 +++++++++--------- qa/rpc-tests/zmq_test.py | 4 +- 11 files changed, 108 insertions(+), 111 deletions(-) diff --git a/qa/rpc-tests/httpbasics.py b/qa/rpc-tests/httpbasics.py index b2ea84b4f..b1a4623bd 100755 --- a/qa/rpc-tests/httpbasics.py +++ b/qa/rpc-tests/httpbasics.py @@ -37,45 +37,45 @@ class HTTPBasicsTest (BitcoinTestFramework): conn = httplib.HTTPConnection(url.hostname, url.port) conn.connect() conn.request('POST', '/', '{"method": "getbestblockhash"}', headers) - out1 = conn.getresponse().read(); + out1 = conn.getresponse().read() assert_equal('"error":null' in out1, True) - assert_equal(conn.sock!=None, True) #according to http/1.1 connection must still be open! + assert_equal(conn.sock!=None, True) # according to http/1.1 connection must still be open! - #send 2nd request without closing connection + # send 2nd request without closing connection conn.request('POST', '/', '{"method": "getchaintips"}', headers) - out2 = conn.getresponse().read(); + out2 = conn.getresponse().read() assert_equal('"error":null' in out2, True) # must also response with a correct json-rpc message - assert_equal(conn.sock!=None, True) #according to http/1.1 connection must still be open! + assert_equal(conn.sock!=None, True) # according to http/1.1 connection must still be open! conn.close() - #same should be if we add keep-alive because this should be the std. behaviour + # same should be if we add keep-alive because this should be the std. behaviour headers = {"Authorization": "Basic " + base64.b64encode(authpair), "Connection": "keep-alive"} conn = httplib.HTTPConnection(url.hostname, url.port) conn.connect() conn.request('POST', '/', '{"method": "getbestblockhash"}', headers) - out1 = conn.getresponse().read(); + out1 = conn.getresponse().read() assert_equal('"error":null' in out1, True) - assert_equal(conn.sock!=None, True) #according to http/1.1 connection must still be open! + assert_equal(conn.sock!=None, True) # according to http/1.1 connection must still be open! - #send 2nd request without closing connection + # send 2nd request without closing connection conn.request('POST', '/', '{"method": "getchaintips"}', headers) - out2 = conn.getresponse().read(); + out2 = conn.getresponse().read() assert_equal('"error":null' in out2, True) # must also response with a correct json-rpc message - assert_equal(conn.sock!=None, True) #according to http/1.1 connection must still be open! + assert_equal(conn.sock!=None, True) # according to http/1.1 connection must still be open! conn.close() - #now do the same with "Connection: close" + # now do the same with "Connection: close" headers = {"Authorization": "Basic " + base64.b64encode(authpair), "Connection":"close"} conn = httplib.HTTPConnection(url.hostname, url.port) conn.connect() conn.request('POST', '/', '{"method": "getbestblockhash"}', headers) - out1 = conn.getresponse().read(); + out1 = conn.getresponse().read() assert_equal('"error":null' in out1, True) - assert_equal(conn.sock!=None, False) #now the connection must be closed after the response + assert_equal(conn.sock!=None, False) # now the connection must be closed after the response - #node1 (2nd node) is running with disabled keep-alive option + # node1 (2nd node) is running with disabled keep-alive option urlNode1 = urlparse.urlparse(self.nodes[1].url) authpair = urlNode1.username + ':' + urlNode1.password headers = {"Authorization": "Basic " + base64.b64encode(authpair)} @@ -83,10 +83,10 @@ class HTTPBasicsTest (BitcoinTestFramework): conn = httplib.HTTPConnection(urlNode1.hostname, urlNode1.port) conn.connect() conn.request('POST', '/', '{"method": "getbestblockhash"}', headers) - out1 = conn.getresponse().read(); + out1 = conn.getresponse().read() assert_equal('"error":null' in out1, True) - #node2 (third node) is running with standard keep-alive parameters which means keep-alive is on + # node2 (third node) is running with standard keep-alive parameters which means keep-alive is on urlNode2 = urlparse.urlparse(self.nodes[2].url) authpair = urlNode2.username + ':' + urlNode2.password headers = {"Authorization": "Basic " + base64.b64encode(authpair)} @@ -94,9 +94,9 @@ class HTTPBasicsTest (BitcoinTestFramework): conn = httplib.HTTPConnection(urlNode2.hostname, urlNode2.port) conn.connect() conn.request('POST', '/', '{"method": "getbestblockhash"}', headers) - out1 = conn.getresponse().read(); + out1 = conn.getresponse().read() assert_equal('"error":null' in out1, True) - assert_equal(conn.sock!=None, True) #connection must be closed because bitcoind should use keep-alive by default + assert_equal(conn.sock!=None, True) # connection must be closed because bitcoind should use keep-alive by default if __name__ == '__main__': - HTTPBasicsTest ().main () + HTTPBasicsTest().main() diff --git a/qa/rpc-tests/invalidateblock.py b/qa/rpc-tests/invalidateblock.py index 9e9917b89..5cbd1ea98 100755 --- a/qa/rpc-tests/invalidateblock.py +++ b/qa/rpc-tests/invalidateblock.py @@ -14,19 +14,17 @@ from test_framework.util import initialize_chain_clean, start_node, \ import time class InvalidateTest(BitcoinTestFramework): - - def setup_chain(self): print("Initializing test directory "+self.options.tmpdir) initialize_chain_clean(self.options.tmpdir, 3) - + def setup_network(self): self.nodes = [] - self.is_network_split = False + self.is_network_split = False self.nodes.append(start_node(0, self.options.tmpdir, ["-debug"])) self.nodes.append(start_node(1, self.options.tmpdir, ["-debug"])) self.nodes.append(start_node(2, self.options.tmpdir, ["-debug"])) - + def run_test(self): print "Make sure we repopulate setBlockIndexCandidates after InvalidateBlock:" print "Mine 4 blocks on Node 0" diff --git a/qa/rpc-tests/invalidblockrequest.py b/qa/rpc-tests/invalidblockrequest.py index 0ef353628..05b33d772 100755 --- a/qa/rpc-tests/invalidblockrequest.py +++ b/qa/rpc-tests/invalidblockrequest.py @@ -25,7 +25,7 @@ re-requested. # Use the ComparisonTestFramework with 1 node: only use --testbinary. class InvalidBlockRequestTest(ComparisonTestFramework): - ''' Can either run this test as 1 node with expected answers, or two and compare them. + ''' Can either run this test as 1 node with expected answers, or two and compare them. Change the "outcome" variable from each TestInstance object to only do the comparison. ''' def __init__(self): self.num_nodes = 1 diff --git a/qa/rpc-tests/maxblocksinflight.py b/qa/rpc-tests/maxblocksinflight.py index 227679b69..beef3d2ea 100755 --- a/qa/rpc-tests/maxblocksinflight.py +++ b/qa/rpc-tests/maxblocksinflight.py @@ -61,7 +61,7 @@ class TestManager(NodeConnCB): current_invs = [] if len(current_invs) > 0: self.connection.send_message(msg_inv(current_invs)) - + # Wait and see how many blocks were requested time.sleep(2) @@ -80,7 +80,7 @@ class TestManager(NodeConnCB): self.disconnectOkay = True self.connection.disconnect_node() - + class MaxBlocksInFlightTest(BitcoinTestFramework): def add_options(self, parser): parser.add_option("--testbinary", dest="testbinary", diff --git a/qa/rpc-tests/rawtransactions.py b/qa/rpc-tests/rawtransactions.py index 82dbb7b26..dc919f028 100755 --- a/qa/rpc-tests/rawtransactions.py +++ b/qa/rpc-tests/rawtransactions.py @@ -117,9 +117,9 @@ class RawTransactionsTest(BitcoinTestFramework): self.nodes[0].generate(1) self.sync_all() - #THIS IS A INCOMPLETE FEATURE - #NODE2 HAS TWO OF THREE KEY AND THE FUNDS SHOULD BE SPENDABLE AND COUNT AT BALANCE CALCULATION - assert_equal(self.nodes[2].getbalance(), bal) #for now, assume the funds of a 2of3 multisig tx are not marked as spendable + # THIS IS A INCOMPLETE FEATURE + # NODE2 HAS TWO OF THREE KEY AND THE FUNDS SHOULD BE SPENDABLE AND COUNT AT BALANCE CALCULATION + assert_equal(self.nodes[2].getbalance(), bal) # for now, assume the funds of a 2of3 multisig tx are not marked as spendable txDetails = self.nodes[0].gettransaction(txId, True) rawTx = self.nodes[0].decoderawtransaction(txDetails['hex']) @@ -134,10 +134,10 @@ class RawTransactionsTest(BitcoinTestFramework): outputs = { self.nodes[0].getnewaddress() : 2.199 } rawTx = self.nodes[2].createrawtransaction(inputs, outputs) rawTxPartialSigned = self.nodes[1].signrawtransaction(rawTx, inputs) - assert_equal(rawTxPartialSigned['complete'], False) #node1 only has one key, can't comp. sign the tx - + assert_equal(rawTxPartialSigned['complete'], False) # node1 only has one key, can't comp. sign the tx + rawTxSigned = self.nodes[2].signrawtransaction(rawTx, inputs) - assert_equal(rawTxSigned['complete'], True) #node2 can sign the tx compl., own two of three keys + assert_equal(rawTxSigned['complete'], True) # node2 can sign the tx compl., own two of three keys self.nodes[2].sendrawtransaction(rawTxSigned['hex']) rawTx = self.nodes[0].decoderawtransaction(rawTxSigned['hex']) self.sync_all() diff --git a/qa/rpc-tests/receivedby.py b/qa/rpc-tests/receivedby.py index e928aec8b..59f7bf258 100755 --- a/qa/rpc-tests/receivedby.py +++ b/qa/rpc-tests/receivedby.py @@ -11,8 +11,8 @@ from decimal import Decimal def get_sub_array_from_array(object_array, to_match): ''' - Finds and returns a sub array from an array of arrays. - to_match should be a unique idetifier of a sub array + Finds and returns a sub array from an array of arrays. + to_match should be a unique idetifier of a sub array ''' for item in object_array: all_match = True @@ -25,12 +25,12 @@ def get_sub_array_from_array(object_array, to_match): return [] def check_array_result(object_array, to_match, expected, should_not_find = False): - """ - Pass in array of JSON objects, a dictionary with key/value pairs - to match against, and another dictionary with expected key/value - pairs. - If the should_not_find flag is true, to_match should not be found in object_array - """ + ''' + Pass in array of JSON objects, a dictionary with key/value pairs + to match against, and another dictionary with expected key/value + pairs. + If the should_not_find flag is true, to_match should not be found in object_array + ''' if should_not_find == True: expected = { } num_matched = 0 @@ -61,49 +61,49 @@ class ReceivedByTest(BitcoinTestFramework): txid = self.nodes[0].sendtoaddress(addr, 0.1) self.sync_all() - #Check not listed in listreceivedbyaddress because has 0 confirmations + # Check not listed in listreceivedbyaddress because has 0 confirmations check_array_result(self.nodes[1].listreceivedbyaddress(), {"address":addr}, { }, True) - #Bury Tx under 10 block so it will be returned by listreceivedbyaddress + # Bury Tx under 10 block so it will be returned by listreceivedbyaddress self.nodes[1].generate(10) self.sync_all() check_array_result(self.nodes[1].listreceivedbyaddress(), {"address":addr}, {"address":addr, "account":"", "amount":Decimal("0.1"), "confirmations":10, "txids":[txid,]}) - #With min confidence < 10 + # With min confidence < 10 check_array_result(self.nodes[1].listreceivedbyaddress(5), {"address":addr}, {"address":addr, "account":"", "amount":Decimal("0.1"), "confirmations":10, "txids":[txid,]}) - #With min confidence > 10, should not find Tx + # With min confidence > 10, should not find Tx check_array_result(self.nodes[1].listreceivedbyaddress(11),{"address":addr},{ },True) - #Empty Tx + # Empty Tx addr = self.nodes[1].getnewaddress() check_array_result(self.nodes[1].listreceivedbyaddress(0,True), {"address":addr}, {"address":addr, "account":"", "amount":0, "confirmations":0, "txids":[]}) ''' - getreceivedbyaddress Test + getreceivedbyaddress Test ''' # Send from node 0 to 1 addr = self.nodes[1].getnewaddress() txid = self.nodes[0].sendtoaddress(addr, 0.1) self.sync_all() - #Check balance is 0 because of 0 confirmations + # Check balance is 0 because of 0 confirmations balance = self.nodes[1].getreceivedbyaddress(addr) if balance != Decimal("0.0"): raise AssertionError("Wrong balance returned by getreceivedbyaddress, %0.2f"%(balance)) - #Check balance is 0.1 + # Check balance is 0.1 balance = self.nodes[1].getreceivedbyaddress(addr,0) if balance != Decimal("0.1"): raise AssertionError("Wrong balance returned by getreceivedbyaddress, %0.2f"%(balance)) - #Bury Tx under 10 block so it will be returned by the default getreceivedbyaddress + # Bury Tx under 10 block so it will be returned by the default getreceivedbyaddress self.nodes[1].generate(10) self.sync_all() balance = self.nodes[1].getreceivedbyaddress(addr) @@ -111,9 +111,9 @@ class ReceivedByTest(BitcoinTestFramework): raise AssertionError("Wrong balance returned by getreceivedbyaddress, %0.2f"%(balance)) ''' - listreceivedbyaccount + getreceivedbyaccount Test + listreceivedbyaccount + getreceivedbyaccount Test ''' - #set pre-state + # set pre-state addrArr = self.nodes[1].getnewaddress() account = self.nodes[1].getaccount(addrArr) received_by_account_json = get_sub_array_from_array(self.nodes[1].listreceivedbyaccount(),{"account":account}) @@ -146,7 +146,7 @@ class ReceivedByTest(BitcoinTestFramework): if balance != balance_by_account + Decimal("0.1"): raise AssertionError("Wrong balance returned by getreceivedbyaccount, %0.2f"%(balance)) - #Create a new account named "mynewaccount" that has a 0 balance + # Create a new account named "mynewaccount" that has a 0 balance self.nodes[1].getaccountaddress("mynewaccount") received_by_account_json = get_sub_array_from_array(self.nodes[1].listreceivedbyaccount(0,True),{"account":"mynewaccount"}) if len(received_by_account_json) == 0: diff --git a/qa/rpc-tests/rest.py b/qa/rpc-tests/rest.py index 35d7aa5d1..b14ec765d 100755 --- a/qa/rpc-tests/rest.py +++ b/qa/rpc-tests/rest.py @@ -7,7 +7,6 @@ # Test REST interface # - from test_framework.test_framework import BitcoinTestFramework from test_framework.util import assert_equal, assert_greater_than, \ initialize_chain_clean, start_nodes, connect_nodes_bi @@ -34,7 +33,7 @@ def deser_uint256(f): r += t << (i * 32) return r -#allows simple http get calls +# allows simple http get calls def http_get_call(host, port, path, response_object = 0): conn = httplib.HTTPConnection(host, port) conn.request('GET', path) @@ -44,7 +43,7 @@ def http_get_call(host, port, path, response_object = 0): return conn.getresponse().read() -#allows simple http post calls with a request body +# allows simple http post calls with a request body def http_post_call(host, port, path, requestdata = '', response_object = 0): conn = httplib.HTTPConnection(host, port) conn.request('POST', path, requestdata) @@ -86,7 +85,7 @@ class RESTTest (BitcoinTestFramework): self.sync_all() bb_hash = self.nodes[0].getbestblockhash() - assert_equal(self.nodes[1].getbalance(), Decimal("0.1")) #balance now should be 0.1 on node 1 + assert_equal(self.nodes[1].getbalance(), Decimal("0.1")) # balance now should be 0.1 on node 1 # load the latest 0.1 tx over the REST API json_string = http_get_call(url.hostname, url.port, '/rest/tx/'+txid+self.FORMAT_SEPARATOR+"json") @@ -121,13 +120,13 @@ class RESTTest (BitcoinTestFramework): json_string = http_get_call(url.hostname, url.port, '/rest/getutxos'+json_request+self.FORMAT_SEPARATOR+'json') json_obj = json.loads(json_string) - #check chainTip response + # check chainTip response assert_equal(json_obj['chaintipHash'], bb_hash) - #make sure there is no utox in the response because this oupoint has been spent + # make sure there is no utox in the response because this oupoint has been spent assert_equal(len(json_obj['utxos']), 0) - #check bitmap + # check bitmap assert_equal(json_obj['bitmap'], "0") @@ -140,7 +139,7 @@ class RESTTest (BitcoinTestFramework): assert_equal(len(json_obj['utxos']), 1) assert_equal(json_obj['bitmap'], "10") - #test binary response + # test binary response bb_hash = self.nodes[0].getbestblockhash() binaryRequest = b'\x01\x02' @@ -156,8 +155,8 @@ class RESTTest (BitcoinTestFramework): chainHeight = struct.unpack("i", output.read(4))[0] hashFromBinResponse = hex(deser_uint256(output))[2:].zfill(65).rstrip("L") - assert_equal(bb_hash, hashFromBinResponse) #check if getutxo's chaintip during calculation was fine - assert_equal(chainHeight, 102) #chain height must be 102 + assert_equal(bb_hash, hashFromBinResponse) # check if getutxo's chaintip during calculation was fine + assert_equal(chainHeight, 102) # chain height must be 102 ############################ @@ -178,41 +177,41 @@ class RESTTest (BitcoinTestFramework): json_request = '/'+txid+'-'+str(n) json_string = http_get_call(url.hostname, url.port, '/rest/getutxos'+json_request+self.FORMAT_SEPARATOR+'json') json_obj = json.loads(json_string) - assert_equal(len(json_obj['utxos']), 0) #there should be a outpoint because it has just added to the mempool + assert_equal(len(json_obj['utxos']), 0) # there should be a outpoint because it has just added to the mempool json_request = '/checkmempool/'+txid+'-'+str(n) json_string = http_get_call(url.hostname, url.port, '/rest/getutxos'+json_request+self.FORMAT_SEPARATOR+'json') json_obj = json.loads(json_string) - assert_equal(len(json_obj['utxos']), 1) #there should be a outpoint because it has just added to the mempool + assert_equal(len(json_obj['utxos']), 1) # there should be a outpoint because it has just added to the mempool - #do some invalid requests + # do some invalid requests json_request = '{"checkmempool' response = http_post_call(url.hostname, url.port, '/rest/getutxos'+self.FORMAT_SEPARATOR+'json', json_request, True) - assert_equal(response.status, 500) #must be a 500 because we send a invalid json request + assert_equal(response.status, 500) # must be a 500 because we send a invalid json request json_request = '{"checkmempool' response = http_post_call(url.hostname, url.port, '/rest/getutxos'+self.FORMAT_SEPARATOR+'bin', json_request, True) - assert_equal(response.status, 500) #must be a 500 because we send a invalid bin request + assert_equal(response.status, 500) # must be a 500 because we send a invalid bin request response = http_post_call(url.hostname, url.port, '/rest/getutxos/checkmempool'+self.FORMAT_SEPARATOR+'bin', '', True) - assert_equal(response.status, 500) #must be a 500 because we send a invalid bin request + assert_equal(response.status, 500) # must be a 500 because we send a invalid bin request - #test limits + # test limits json_request = '/checkmempool/' for x in range(0, 20): json_request += txid+'-'+str(n)+'/' json_request = json_request.rstrip("/") response = http_post_call(url.hostname, url.port, '/rest/getutxos'+json_request+self.FORMAT_SEPARATOR+'json', '', True) - assert_equal(response.status, 500) #must be a 500 because we exceeding the limits + assert_equal(response.status, 500) # must be a 500 because we exceeding the limits json_request = '/checkmempool/' for x in range(0, 15): json_request += txid+'-'+str(n)+'/' json_request = json_request.rstrip("/"); response = http_post_call(url.hostname, url.port, '/rest/getutxos'+json_request+self.FORMAT_SEPARATOR+'json', '', True) - assert_equal(response.status, 200) #must be a 500 because we exceeding the limits + assert_equal(response.status, 200) # must be a 500 because we exceeding the limits - self.nodes[0].generate(1) #generate block to not affect upcoming tests + self.nodes[0].generate(1) # generate block to not affect upcoming tests self.sync_all() ################ @@ -266,10 +265,10 @@ class RESTTest (BitcoinTestFramework): assert_equal(response_header_json.status, 200) response_header_json_str = response_header_json.read() json_obj = json.loads(response_header_json_str, parse_float=Decimal) - assert_equal(len(json_obj), 1) #ensure that there is one header in the json response - assert_equal(json_obj[0]['hash'], bb_hash) #request/response hash should be the same + assert_equal(len(json_obj), 1) # ensure that there is one header in the json response + assert_equal(json_obj[0]['hash'], bb_hash) # request/response hash should be the same - #compare with normal RPC block response + # compare with normal RPC block response rpc_block_json = self.nodes[0].getblock(bb_hash) assert_equal(json_obj[0]['hash'], rpc_block_json['hash']) assert_equal(json_obj[0]['confirmations'], rpc_block_json['confirmations']) @@ -283,14 +282,14 @@ class RESTTest (BitcoinTestFramework): assert_equal(json_obj[0]['chainwork'], rpc_block_json['chainwork']) assert_equal(json_obj[0]['previousblockhash'], rpc_block_json['previousblockhash']) - #see if we can get 5 headers in one response + # see if we can get 5 headers in one response self.nodes[1].generate(5) self.sync_all() response_header_json = http_get_call(url.hostname, url.port, '/rest/headers/5/'+bb_hash+self.FORMAT_SEPARATOR+"json", True) assert_equal(response_header_json.status, 200) response_header_json_str = response_header_json.read() json_obj = json.loads(response_header_json_str) - assert_equal(len(json_obj), 5) #now we should have 5 header objects + assert_equal(len(json_obj), 5) # now we should have 5 header objects # do tx test tx_hash = block_json_obj['tx'][0]['txid']; @@ -330,20 +329,20 @@ class RESTTest (BitcoinTestFramework): newblockhash = self.nodes[1].generate(1) self.sync_all() - #check if the 3 tx show up in the new block + # check if the 3 tx show up in the new block json_string = http_get_call(url.hostname, url.port, '/rest/block/'+newblockhash[0]+self.FORMAT_SEPARATOR+'json') json_obj = json.loads(json_string) for tx in json_obj['tx']: - if not 'coinbase' in tx['vin'][0]: #exclude coinbase + if not 'coinbase' in tx['vin'][0]: # exclude coinbase assert_equal(tx['txid'] in txs, True) - #check the same but without tx details + # check the same but without tx details json_string = http_get_call(url.hostname, url.port, '/rest/block/notxdetails/'+newblockhash[0]+self.FORMAT_SEPARATOR+'json') json_obj = json.loads(json_string) for tx in txs: assert_equal(tx in json_obj['tx'], True) - #test rest bestblock + # test rest bestblock bb_hash = self.nodes[0].getbestblockhash() json_string = http_get_call(url.hostname, url.port, '/rest/chaininfo.json') @@ -351,4 +350,4 @@ class RESTTest (BitcoinTestFramework): assert_equal(json_obj['bestblockhash'], bb_hash) if __name__ == '__main__': - RESTTest ().main () + RESTTest().main() diff --git a/qa/rpc-tests/rpcbind_test.py b/qa/rpc-tests/rpcbind_test.py index 676a4bf32..72e14d655 100755 --- a/qa/rpc-tests/rpcbind_test.py +++ b/qa/rpc-tests/rpcbind_test.py @@ -5,7 +5,7 @@ # Test for -rpcbind, as well as -rpcallowip and -rpcconnect -# Add python-bitcoinrpc to module search path: +# Dependency: python-bitcoinrpc from test_framework.util import assert_equal, check_json_precision, \ initialize_chain, start_nodes, stop_nodes, wait_bitcoinds, \ diff --git a/qa/rpc-tests/test_framework/blockstore.py b/qa/rpc-tests/test_framework/blockstore.py index 1fa981631..fc157f718 100644 --- a/qa/rpc-tests/test_framework/blockstore.py +++ b/qa/rpc-tests/test_framework/blockstore.py @@ -13,7 +13,7 @@ class BlockStore(object): def __init__(self, datadir): self.blockDB = dbm.open(datadir + "/blocks", 'c') self.currentBlock = 0L - + def close(self): self.blockDB.close() diff --git a/qa/rpc-tests/zapwallettxes.py b/qa/rpc-tests/zapwallettxes.py index c0c4e3646..5da4ba125 100755 --- a/qa/rpc-tests/zapwallettxes.py +++ b/qa/rpc-tests/zapwallettxes.py @@ -29,56 +29,56 @@ class ZapWalletTXesTest (BitcoinTestFramework): self.sync_all() self.nodes[1].generate(101) self.sync_all() - + assert_equal(self.nodes[0].getbalance(), 40) - + txid0 = self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 11) txid1 = self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 10) self.sync_all() self.nodes[0].generate(1) self.sync_all() - + txid2 = self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 11) txid3 = self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 5) - + tx0 = self.nodes[0].gettransaction(txid0) - assert_equal(tx0['txid'], txid0) #tx0 must be available (confirmed) - + assert_equal(tx0['txid'], txid0) # tx0 must be available (confirmed) + tx1 = self.nodes[0].gettransaction(txid1) - assert_equal(tx1['txid'], txid1) #tx1 must be available (confirmed) - + assert_equal(tx1['txid'], txid1) # tx1 must be available (confirmed) + tx2 = self.nodes[0].gettransaction(txid2) - assert_equal(tx2['txid'], txid2) #tx2 must be available (unconfirmed) - + assert_equal(tx2['txid'], txid2) # tx2 must be available (unconfirmed) + tx3 = self.nodes[0].gettransaction(txid3) - assert_equal(tx3['txid'], txid3) #tx3 must be available (unconfirmed) - - #restart bitcoind + assert_equal(tx3['txid'], txid3) # tx3 must be available (unconfirmed) + + # restart zcashd self.nodes[0].stop() bitcoind_processes[0].wait() self.nodes[0] = start_node(0,self.options.tmpdir) - + tx3 = self.nodes[0].gettransaction(txid3) - assert_equal(tx3['txid'], txid3) #tx must be available (unconfirmed) - + assert_equal(tx3['txid'], txid3) # tx must be available (unconfirmed) + self.nodes[0].stop() bitcoind_processes[0].wait() - - #restart bitcoind with zapwallettxes + + # restart zcashd with zapwallettxes self.nodes[0] = start_node(0,self.options.tmpdir, ["-zapwallettxes=1"]) - + aException = False try: tx3 = self.nodes[0].gettransaction(txid3) except JSONRPCException,e: print e aException = True - - assert_equal(aException, True) #there must be a expection because the unconfirmed wallettx0 must be gone by now + + assert_equal(aException, True) # there must be a expection because the unconfirmed wallettx0 must be gone by now tx0 = self.nodes[0].gettransaction(txid0) - assert_equal(tx0['txid'], txid0) #tx0 (confirmed) must still be available because it was confirmed + assert_equal(tx0['txid'], txid0) # tx0 (confirmed) must still be available because it was confirmed if __name__ == '__main__': - ZapWalletTXesTest ().main () + ZapWalletTXesTest().main() diff --git a/qa/rpc-tests/zmq_test.py b/qa/rpc-tests/zmq_test.py index b895c628c..d70e73114 100755 --- a/qa/rpc-tests/zmq_test.py +++ b/qa/rpc-tests/zmq_test.py @@ -13,7 +13,7 @@ from test_framework.util import assert_equal, bytes_to_hex_str, start_nodes import zmq import struct -class ZMQTest (BitcoinTestFramework): +class ZMQTest(BitcoinTestFramework): port = 28332 @@ -44,7 +44,7 @@ class ZMQTest (BitcoinTestFramework): nseq = msg[2] [nseq] # hush pyflakes msgSequence = struct.unpack(' Date: Wed, 14 Jun 2017 17:32:45 +0200 Subject: [PATCH 0133/1062] Net: Fix resource leak in ReadBinaryFile(...) Introduced in 3290567bbd54e01cb6fe6b1d04c659abca983af2 via PR #2177. --- src/torcontrol.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/torcontrol.cpp b/src/torcontrol.cpp index a5cd1b7c6..ffa1f75f8 100644 --- a/src/torcontrol.cpp +++ b/src/torcontrol.cpp @@ -376,8 +376,10 @@ static std::pair ReadBinaryFile(const std::string &filename, s while ((n=fread(buffer, 1, sizeof(buffer), f)) > 0) { // Check for reading errors so we don't return any data if we couldn't // read the entire file (or up to maxsize) - if (ferror(f)) + if (ferror(f)) { + fclose(f); return std::make_pair(false,""); + } retval.append(buffer, buffer+n); if (retval.size() > maxsize) break; From 9ad9a25eff871e8c8fdb2468558c1d8b4b0a0d8e Mon Sep 17 00:00:00 2001 From: Sean Bowe Date: Fri, 23 Jun 2017 18:19:17 -0600 Subject: [PATCH 0134/1062] Revert "Remove an unneeded version workaround as per @str4d's review comment." This reverts commit 1e9db0b38a64e8df510294e44b5e6afb4b2dffc8. --- src/main.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main.cpp b/src/main.cpp index 6d5ab00f1..50bd49620 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4358,6 +4358,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, return false; } + if (pfrom->nVersion == 10300) + pfrom->nVersion = 300; if (!vRecv.empty()) vRecv >> addrFrom >> nNonce; if (!vRecv.empty()) { From 15a9937654aa8385f0e5f95ba1712ebdd771ac9a Mon Sep 17 00:00:00 2001 From: Sean Bowe Date: Fri, 23 Jun 2017 18:19:25 -0600 Subject: [PATCH 0135/1062] Revert "Delete old protocol version constants and simplify code that used them." This reverts commit 5a49c929ddccb8a6ca1ac744cefa6af7817ea3de. --- src/main.cpp | 53 +++++++++++++++++++++++++++++++++----------------- src/net.cpp | 2 +- src/protocol.h | 3 ++- src/version.h | 19 +++++++++++++++++- 4 files changed, 56 insertions(+), 21 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 50bd49620..f6170ab60 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4418,8 +4418,11 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, } // Get recent addresses - pfrom->PushMessage("getaddr"); - pfrom->fGetAddr = true; + if (pfrom->fOneShot || pfrom->nVersion >= CADDR_TIME_VERSION || addrman.size() < 1000) + { + pfrom->PushMessage("getaddr"); + pfrom->fGetAddr = true; + } addrman.Good(pfrom->addr); } else { if (((CNetAddr)pfrom->addr) == (CNetAddr)addrFrom) @@ -4478,6 +4481,9 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, vector vAddr; vRecv >> vAddr; + // Don't want addr from older versions unless seeding + if (pfrom->nVersion < CADDR_TIME_VERSION && addrman.size() > 1000) + return true; if (vAddr.size() > 1000) { Misbehaving(pfrom->GetId(), 20); @@ -4512,6 +4518,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, multimap mapMix; BOOST_FOREACH(CNode* pnode, vNodes) { + if (pnode->nVersion < CADDR_TIME_VERSION) + continue; unsigned int nPointer; memcpy(&nPointer, &pnode, sizeof(nPointer)); uint256 hashKey = ArithToUint256(UintToArith256(hashRand) ^ nPointer); @@ -4962,20 +4970,23 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, else if (strCommand == "ping") { - uint64_t nonce = 0; - vRecv >> nonce; - // Echo the message back with the nonce. This allows for two useful features: - // - // 1) A remote node can quickly check if the connection is operational - // 2) Remote nodes can measure the latency of the network thread. If this node - // is overloaded it won't respond to pings quickly and the remote node can - // avoid sending us more work, like chain download requests. - // - // The nonce stops the remote getting confused between different pings: without - // it, if the remote node sends a ping once per second and this node takes 5 - // seconds to respond to each, the 5th ping the remote sends would appear to - // return very quickly. - pfrom->PushMessage("pong", nonce); + if (pfrom->nVersion > BIP0031_VERSION) + { + uint64_t nonce = 0; + vRecv >> nonce; + // Echo the message back with the nonce. This allows for two useful features: + // + // 1) A remote node can quickly check if the connection is operational + // 2) Remote nodes can measure the latency of the network thread. If this node + // is overloaded it won't respond to pings quickly and the remote node can + // avoid sending us more work, like chain download requests. + // + // The nonce stops the remote getting confused between different pings: without + // it, if the remote node sends a ping once per second and this node takes 5 + // seconds to respond to each, the 5th ping the remote sends would appear to + // return very quickly. + pfrom->PushMessage("pong", nonce); + } } @@ -5303,8 +5314,14 @@ bool SendMessages(CNode* pto, bool fSendTrickle) } pto->fPingQueued = false; pto->nPingUsecStart = GetTimeMicros(); - pto->nPingNonceSent = nonce; - pto->PushMessage("ping", nonce); + if (pto->nVersion > BIP0031_VERSION) { + pto->nPingNonceSent = nonce; + pto->PushMessage("ping", nonce); + } else { + // Peer is too old to support ping command with nonce, pong will never arrive. + pto->nPingNonceSent = 0; + pto->PushMessage("ping"); + } } TRY_LOCK(cs_main, lockMain); // Acquire cs_main for IsInitialBlockDownload() and CNodeState() diff --git a/src/net.cpp b/src/net.cpp index d49af2610..de624c72a 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -1194,7 +1194,7 @@ void ThreadSocketHandler() LogPrintf("socket sending timeout: %is\n", nTime - pnode->nLastSend); pnode->fDisconnect = true; } - else if (nTime - pnode->nLastRecv > TIMEOUT_INTERVAL) + else if (nTime - pnode->nLastRecv > (pnode->nVersion > BIP0031_VERSION ? TIMEOUT_INTERVAL : 90*60)) { LogPrintf("socket receive timeout: %is\n", nTime - pnode->nLastRecv); pnode->fDisconnect = true; diff --git a/src/protocol.h b/src/protocol.h index 8bcf6e2ab..b5e65032a 100644 --- a/src/protocol.h +++ b/src/protocol.h @@ -103,7 +103,8 @@ public: Init(); if (nType & SER_DISK) READWRITE(nVersion); - if ((nType & SER_DISK) || !(nType & SER_GETHASH)) + if ((nType & SER_DISK) || + (nVersion >= CADDR_TIME_VERSION && !(nType & SER_GETHASH))) READWRITE(nTime); READWRITE(nServices); READWRITE(*(CService*)this); diff --git a/src/version.h b/src/version.h index bd71a5574..91a464030 100644 --- a/src/version.h +++ b/src/version.h @@ -12,9 +12,26 @@ static const int PROTOCOL_VERSION = 170002; //! initial proto version, to be increased after version/verack negotiation -static const int INIT_PROTO_VERSION = 170002; +static const int INIT_PROTO_VERSION = 209; + +//! In this version, 'getheaders' was introduced. +static const int GETHEADERS_VERSION = 31800; //! disconnect from peers older than this proto version static const int MIN_PEER_PROTO_VERSION = 170002; +//! nTime field added to CAddress, starting with this version; +//! if possible, avoid requesting addresses nodes older than this +static const int CADDR_TIME_VERSION = 31402; + +//! only request blocks from nodes outside this range of versions +static const int NOBLKS_VERSION_START = 32000; +static const int NOBLKS_VERSION_END = 32400; + +//! BIP 0031, pong message, is enabled for all versions AFTER this one +static const int BIP0031_VERSION = 60000; + +//! "mempool" command, enhanced "getdata" behavior starts with this version +static const int MEMPOOL_GD_VERSION = 60002; + #endif // BITCOIN_VERSION_H From d444e1cf40be7fee4db05040e37513e4d5e85d05 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 23 Jun 2017 19:43:29 -0700 Subject: [PATCH 0136/1062] make-release.py: Versioning changes for 1.0.10-1. --- README.md | 2 +- configure.ac | 2 +- contrib/gitian-descriptors/gitian-linux.yml | 2 +- src/clientversion.h | 2 +- src/deprecation.h | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 93cff70b4..27aee7943 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Zcash 1.0.10 +Zcash 1.0.10-1 ============= What is Zcash? diff --git a/configure.ac b/configure.ac index 597e4138f..edf766a56 100644 --- a/configure.ac +++ b/configure.ac @@ -3,7 +3,7 @@ AC_PREREQ([2.60]) define(_CLIENT_VERSION_MAJOR, 1) define(_CLIENT_VERSION_MINOR, 0) define(_CLIENT_VERSION_REVISION, 10) -define(_CLIENT_VERSION_BUILD, 50) +define(_CLIENT_VERSION_BUILD, 51) define(_ZC_BUILD_VAL, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, m4_incr(_CLIENT_VERSION_BUILD), m4_eval(_CLIENT_VERSION_BUILD < 50), 1, m4_eval(_CLIENT_VERSION_BUILD - 24), m4_eval(_CLIENT_VERSION_BUILD == 50), 1, , m4_eval(_CLIENT_VERSION_BUILD - 50))) define(_CLIENT_VERSION_SUFFIX, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, _CLIENT_VERSION_REVISION-beta$1, m4_eval(_CLIENT_VERSION_BUILD < 50), 1, _CLIENT_VERSION_REVISION-rc$1, m4_eval(_CLIENT_VERSION_BUILD == 50), 1, _CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION-$1))) define(_CLIENT_VERSION_IS_RELEASE, true) diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml index 952b59fa9..cc3dcd701 100644 --- a/contrib/gitian-descriptors/gitian-linux.yml +++ b/contrib/gitian-descriptors/gitian-linux.yml @@ -1,5 +1,5 @@ --- -name: "zcash-1.0.10" +name: "zcash-1.0.10-1" enable_cache: true distro: "debian" suites: diff --git a/src/clientversion.h b/src/clientversion.h index 9692d9682..f2bc38e4d 100644 --- a/src/clientversion.h +++ b/src/clientversion.h @@ -18,7 +18,7 @@ #define CLIENT_VERSION_MAJOR 1 #define CLIENT_VERSION_MINOR 0 #define CLIENT_VERSION_REVISION 10 -#define CLIENT_VERSION_BUILD 50 +#define CLIENT_VERSION_BUILD 51 //! Set to true for release, false for prerelease or test build #define CLIENT_VERSION_IS_RELEASE true diff --git a/src/deprecation.h b/src/deprecation.h index 98c624942..bfc70e72c 100644 --- a/src/deprecation.h +++ b/src/deprecation.h @@ -6,7 +6,7 @@ #define ZCASH_DEPRECATION_H // Deprecation policy is 4th third-Tuesday after a release -static const int APPROX_RELEASE_HEIGHT = 136000; +static const int APPROX_RELEASE_HEIGHT = 137236; static const int WEEKS_UNTIL_DEPRECATION = 18; static const int DEPRECATION_HEIGHT = APPROX_RELEASE_HEIGHT + (WEEKS_UNTIL_DEPRECATION * 7 * 24 * 24); From a0a3eb70b924ac6610f38c073e8006bfa9730f2f Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 23 Jun 2017 19:50:40 -0700 Subject: [PATCH 0137/1062] make-release.py: Updated manpages for 1.0.10-1. --- doc/man/zcash-cli.1 | 6 +++--- doc/man/zcash-tx.1 | 6 +++--- doc/man/zcashd.1 | 10 +++++----- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/doc/man/zcash-cli.1 b/doc/man/zcash-cli.1 index 423b46134..ec1297a45 100644 --- a/doc/man/zcash-cli.1 +++ b/doc/man/zcash-cli.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASH-CLI "1" "June 2017" "zcash-cli v1.0.10" "User Commands" +.TH ZCASH-CLI "1" "June 2017" "zcash-cli v1.0.10-1" "User Commands" .SH NAME -zcash-cli \- manual page for zcash-cli v1.0.10 +zcash-cli \- manual page for zcash-cli v1.0.10-1 .SH DESCRIPTION -Zcash RPC client version v1.0.10 +Zcash RPC client version v1.0.10\-1 .PP In order to ensure you are adequately protecting your privacy when using Zcash, please see . diff --git a/doc/man/zcash-tx.1 b/doc/man/zcash-tx.1 index ac4119969..735c8385a 100644 --- a/doc/man/zcash-tx.1 +++ b/doc/man/zcash-tx.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASH-TX "1" "June 2017" "zcash-tx v1.0.10" "User Commands" +.TH ZCASH-TX "1" "June 2017" "zcash-tx v1.0.10-1" "User Commands" .SH NAME -zcash-tx \- manual page for zcash-tx v1.0.10 +zcash-tx \- manual page for zcash-tx v1.0.10-1 .SH DESCRIPTION -Zcash zcash\-tx utility version v1.0.10 +Zcash zcash\-tx utility version v1.0.10\-1 .SS "Usage:" .TP zcash\-tx [options] [commands] diff --git a/doc/man/zcashd.1 b/doc/man/zcashd.1 index 9c450b4ec..7d8a6a88e 100644 --- a/doc/man/zcashd.1 +++ b/doc/man/zcashd.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASHD "1" "June 2017" "zcashd v1.0.10" "User Commands" +.TH ZCASHD "1" "June 2017" "zcashd v1.0.10-1" "User Commands" .SH NAME -zcashd \- manual page for zcashd v1.0.10 +zcashd \- manual page for zcashd v1.0.10-1 .SH DESCRIPTION -Zcash Daemon version v1.0.10 +Zcash Daemon version v1.0.10\-1 .PP In order to ensure you are adequately protecting your privacy when using Zcash, please see . @@ -54,7 +54,7 @@ Specify data directory \fB\-disabledeprecation=\fR .IP Disable block\-height node deprecation and automatic shutdown (example: -\fB\-disabledeprecation\fR=\fI\,1\/\fR.0.10) +\fB\-disabledeprecation\fR=\fI\,1\/\fR.0.10\-1) .HP \fB\-exportdir=\fR .IP @@ -79,7 +79,7 @@ mempool will accept (default: 0 = no limit applied) .HP \fB\-par=\fR .IP -Set the number of script verification threads (\fB\-2\fR to 16, 0 = auto, <0 = +Set the number of script verification threads (\fB\-4\fR to 16, 0 = auto, <0 = leave that many cores free, default: 0) .HP \fB\-pid=\fR From 2762b685767473c7bb675efd0d636a5860726c12 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 23 Jun 2017 19:50:41 -0700 Subject: [PATCH 0138/1062] make-release.py: Updated release notes and changelog for 1.0.10-1. --- contrib/debian/changelog | 6 ++++++ doc/authors.md | 6 +++--- doc/release-notes/release-notes-1.0.10-1.md | 11 +++++++++++ 3 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 doc/release-notes/release-notes-1.0.10-1.md diff --git a/contrib/debian/changelog b/contrib/debian/changelog index 7bc699f88..e2cbaab82 100644 --- a/contrib/debian/changelog +++ b/contrib/debian/changelog @@ -1,3 +1,9 @@ +zcash (1.0.10+1) stable; urgency=medium + + * 1.0.10-1 release. + + -- Zcash Company Fri, 23 Jun 2017 19:50:41 -0700 + zcash (1.0.10) stable; urgency=medium * 1.0.10 release. diff --git a/doc/authors.md b/doc/authors.md index 612e133af..b1e6c924d 100644 --- a/doc/authors.md +++ b/doc/authors.md @@ -1,9 +1,9 @@ Zcash Contributors ================== -Jack Grigg (427) -Simon Liu (264) -Sean Bowe (186) +Jack Grigg (428) +Simon Liu (266) +Sean Bowe (188) Daira Hopwood (95) Taylor Hornby (65) Wladimir J. van der Laan (60) diff --git a/doc/release-notes/release-notes-1.0.10-1.md b/doc/release-notes/release-notes-1.0.10-1.md new file mode 100644 index 000000000..fea2f5156 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.10-1.md @@ -0,0 +1,11 @@ +Jack Grigg (1): + Disable building Proton in Gitian + +Sean Bowe (2): + Revert "Remove an unneeded version workaround as per @str4d's review comment." + Revert "Delete old protocol version constants and simplify code that used them." + +Simon Liu (2): + make-release.py: Versioning changes for 1.0.10-1. + make-release.py: Updated manpages for 1.0.10-1. + From 262fc5f4e3affc24b5da2577eb336be5048756ba Mon Sep 17 00:00:00 2001 From: Daira Hopwood Date: Sat, 24 Jun 2017 19:49:41 +0100 Subject: [PATCH 0139/1062] Alert 1004 (version 1.0.10 only) Author: Simon Signed-off-by: Daira Hopwood --- src/sendalert.cpp | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/src/sendalert.cpp b/src/sendalert.cpp index f4935212f..3b7b53734 100644 --- a/src/sendalert.cpp +++ b/src/sendalert.cpp @@ -71,8 +71,8 @@ void ThreadSendAlert() // CAlert alert; alert.nRelayUntil = GetTime() + 15 * 60; - alert.nExpiration = GetTime() + 6 * 30 * 24 * 60 * 60; - alert.nID = 1003; // use https://github.com/zcash/zcash/wiki/specification#assigned-numbers to keep track of alert IDs + alert.nExpiration = GetTime() + 12 * 30 * 24 * 60 * 60; + alert.nID = 1004; // use https://github.com/zcash/zcash/wiki/specification#assigned-numbers to keep track of alert IDs alert.nCancel = 1001; // cancels previous messages up to this ID number // These versions are protocol versions @@ -86,9 +86,9 @@ void ThreadSendAlert() // 2000 for longer invalid proof-of-work chain // Higher numbers mean higher priority // 4000 or higher will put the RPC into safe mode - alert.nPriority = 1500; + alert.nPriority = 4000; alert.strComment = ""; - alert.strStatusBar = "Your client is out of date and vulnerable to denial of service. Please update to the most recent version of Zcash (1.0.8-1 or later). More info at: https://z.cash/support/security/"; + alert.strStatusBar = "Your client version 1.0.10 has degraded networking behavior. Please update to the most recent version of Zcash (1.0.10-1 or later)."; alert.strRPCError = alert.strStatusBar; // Set specific client version/versions here. If setSubVer is empty, no filtering on subver is done: @@ -96,13 +96,7 @@ void ThreadSendAlert() const std::vector useragents = {"MagicBean", "BeanStalk", "AppleSeed", "EleosZcash"}; BOOST_FOREACH(const std::string& useragent, useragents) { - alert.setSubVer.insert(std::string("/"+useragent+":1.0.3/")); - alert.setSubVer.insert(std::string("/"+useragent+":1.0.4/")); - alert.setSubVer.insert(std::string("/"+useragent+":1.0.5/")); - alert.setSubVer.insert(std::string("/"+useragent+":1.0.6/")); - alert.setSubVer.insert(std::string("/"+useragent+":1.0.7/")); - alert.setSubVer.insert(std::string("/"+useragent+":1.0.7-1/")); - alert.setSubVer.insert(std::string("/"+useragent+":1.0.8/")); + alert.setSubVer.insert(std::string("/"+useragent+":1.0.10/")); } // Sanity check From caafbbb483068077173f32c9f3c09b7641744d12 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 22 Jun 2017 14:21:35 +1200 Subject: [PATCH 0140/1062] Pull in temporary release notes during the release process --- zcutil/release-notes.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/zcutil/release-notes.py b/zcutil/release-notes.py index 47f234906..24adff0d0 100755 --- a/zcutil/release-notes.py +++ b/zcutil/release-notes.py @@ -4,6 +4,21 @@ import argparse from itertools import islice from operator import itemgetter +TEMP_RELEASE_NOTES_HEADER = [ + '(note: this is a temporary file, to be added-to by anybody, and moved to\n', + 'release-notes at release time)\n', + '\n', + 'Notable changes\n', + '===============\n', + '\n', +] + +RELEASE_NOTES_CHANGELOG_HEADING = [ + 'Changelog\n', + '=========\n', + '\n', +] + author_aliases = { 'Simon': 'Simon Liu', 'bitcartel': 'Simon Liu', @@ -77,9 +92,22 @@ def generate_release_note(version, filename): notes = subprocess.Popen(['git shortlog --no-merges {0}..HEAD'.format(latest_tag)], shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE).communicate()[0] lines = notes.split('\n') lines = [alias_authors_in_release_notes(line) for line in lines] + temp_release_note = os.path.join(doc_dir, 'release-notes.md') + with open(temp_release_note, 'r') as f: + notable_changes = f.readlines() + # Assumes that all notable changes are appended to the default header + if len(notable_changes) > 6: + notable_changes = notable_changes[3:] + ['\n'] + else: + notable_changes = [] release_note = os.path.join(doc_dir, 'release-notes', 'release-notes-{0}.md'.format(version)) with open(release_note, 'w') as f: + f.writelines(notable_changes) + f.writelines(RELEASE_NOTES_CHANGELOG_HEADING) f.writelines('\n'.join(lines)) + # Clear temporary release notes file + with open(temp_release_note, 'w') as f: + f.writelines(TEMP_RELEASE_NOTES_HEADER) def main(version, filename): if version != None: From 506a21850a2c1c90703c06a3464fce78cbd4509e Mon Sep 17 00:00:00 2001 From: Daira Hopwood Date: Mon, 3 Jul 2017 08:57:05 +0100 Subject: [PATCH 0141/1062] Remove UPnP support. fixes #2500 Signed-off-by: Daira Hopwood --- .travis.yml | 4 +- COPYING | 3 +- configure.ac | 51 ------- contrib/debian/copyright | 4 - depends/Makefile | 5 +- depends/README.md | 1 - depends/config.site.in | 4 - depends/packages/miniupnpc.mk | 32 ----- depends/packages/packages.mk | 2 - .../miniupnpc/fix-solaris-compilation.patch | 42 ------ .../miniupnpc/patch-strlen-patch.patch | 22 --- .../miniupnpc/strlen-before-memcmp.patch | 23 --- doc/man/zcash-cli.1 | 2 +- doc/man/zcash-tx.1 | 2 +- doc/man/zcashd.1 | 6 +- src/Makefile.am | 3 +- src/Makefile.gtest.include | 2 +- src/Makefile.test.include | 2 +- src/init.cpp | 15 +- src/net.cpp | 136 ------------------ src/net.h | 9 +- src/util.cpp | 2 +- 22 files changed, 13 insertions(+), 359 deletions(-) delete mode 100644 depends/packages/miniupnpc.mk delete mode 100644 depends/patches/miniupnpc/fix-solaris-compilation.patch delete mode 100644 depends/patches/miniupnpc/patch-strlen-patch.patch delete mode 100644 depends/patches/miniupnpc/strlen-before-memcmp.patch diff --git a/.travis.yml b/.travis.yml index 662ac5681..b2cc7b02b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,7 +29,7 @@ matrix: fast_finish: true include: - compiler: ": ARM" - env: HOST=arm-linux-gnueabihf PACKAGES="g++-arm-linux-gnueabihf" DEP_OPTS="NO_QT=1" GOAL="install" BITCOIN_CONFIG="--enable-glibc-back-compat --enable-reduce-exports" + env: HOST=arm-linux-gnueabihf PACKAGES="g++-arm-linux-gnueabihf" DEP_OPTS="" GOAL="install" BITCOIN_CONFIG="--enable-glibc-back-compat --enable-reduce-exports" - compiler: ": Win32" env: HOST=i686-w64-mingw32 PACKAGES="nsis gcc-mingw-w64-i686 g++-mingw-w64-i686 binutils-mingw-w64-i686 mingw-w64-dev wine bc" RUN_TESTS=true GOAL="deploy" BITCOIN_CONFIG="--enable-reduce-exports" MAKEJOBS="-j2" - compiler: ": 32-bit + dash" @@ -37,7 +37,7 @@ matrix: - compiler: ": Win64" env: HOST=x86_64-w64-mingw32 PACKAGES="nsis gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64 binutils-mingw-w64-x86-64 mingw-w64-dev wine bc" RUN_TESTS=true GOAL="deploy" BITCOIN_CONFIG="--enable-reduce-exports" MAKEJOBS="-j2" - compiler: ": bitcoind" - env: HOST=x86_64-unknown-linux-gnu PACKAGES="bc python-zmq" PPA="ppa:chris-lea/zeromq" DEP_OPTS="NO_QT=1 NO_UPNP=1 DEBUG=1" RUN_TESTS=true GOAL="install" BITCOIN_CONFIG="--enable-zmq --enable-glibc-back-compat --enable-reduce-exports CPPFLAGS=-DDEBUG_LOCKORDER" + env: HOST=x86_64-unknown-linux-gnu PACKAGES="bc python-zmq" PPA="ppa:chris-lea/zeromq" DEP_OPTS="DEBUG=1" RUN_TESTS=true GOAL="install" BITCOIN_CONFIG="--enable-zmq --enable-glibc-back-compat --enable-reduce-exports CPPFLAGS=-DDEBUG_LOCKORDER" - compiler: ": No wallet" env: HOST=x86_64-unknown-linux-gnu DEP_OPTS="NO_WALLET=1" RUN_TESTS=true GOAL="install" BITCOIN_CONFIG="--enable-glibc-back-compat --enable-reduce-exports" - compiler: ": Cross-Mac" diff --git a/COPYING b/COPYING index 67a092a04..c84bfb7aa 100644 --- a/COPYING +++ b/COPYING @@ -28,8 +28,7 @@ open-source licenses. For further details see 'contrib/debian/copyright'. This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (https://www.openssl.org/). This product includes cryptographic -software written by Eric Young (eay@cryptsoft.com), -and UPnP software written by Thomas Bernard. +software written by Eric Young (eay@cryptsoft.com). Although almost all of the Zcash code is licensed under "permissive" open source diff --git a/configure.ac b/configure.ac index edf766a56..36a2059a4 100644 --- a/configure.ac +++ b/configure.ac @@ -94,18 +94,6 @@ AC_ARG_ENABLE([rust], [enable_rust=$enableval], [enable_rust=yes]) -AC_ARG_WITH([miniupnpc], - [AS_HELP_STRING([--with-miniupnpc], - [enable UPNP (default is yes if libminiupnpc is found)])], - [use_upnp=$withval], - [use_upnp=auto]) - -AC_ARG_ENABLE([upnp-default], - [AS_HELP_STRING([--enable-upnp-default], - [if UPNP is enabled, turn it on at startup (default is no)])], - [use_upnp_default=$enableval], - [use_upnp_default=no]) - AC_ARG_ENABLE([proton], [AS_HELP_STRING([--disable-proton], [disable Proton (AMQP messaging)])], @@ -557,15 +545,6 @@ else AC_DEFINE(ENABLE_PROTON, 0, [Define to 1 to enable Proton functions]) fi -dnl Check for libminiupnpc (optional) -if test x$use_upnp != xno; then - AC_CHECK_HEADERS( - [miniupnpc/miniwget.h miniupnpc/miniupnpc.h miniupnpc/upnpcommands.h miniupnpc/upnperrors.h], - [AC_CHECK_LIB([miniupnpc], [main],[MINIUPNPC_LIBS=-lminiupnpc], [have_miniupnpc=no])], - [have_miniupnpc=no] - ) -fi - if test x$build_bitcoin_utils$build_bitcoind$use_tests = xnonono; then use_boost=no else @@ -877,33 +856,6 @@ else AC_MSG_RESULT(no) fi -dnl enable upnp support -AC_MSG_CHECKING([whether to build with support for UPnP]) -if test x$have_miniupnpc = xno; then - if test x$use_upnp = xyes; then - AC_MSG_ERROR("UPnP requested but cannot be built. use --without-miniupnpc") - fi - AC_MSG_RESULT(no) -else - if test x$use_upnp != xno; then - AC_MSG_RESULT(yes) - AC_MSG_CHECKING([whether to build with UPnP enabled by default]) - use_upnp=yes - upnp_setting=0 - if test x$use_upnp_default != xno; then - use_upnp_default=yes - upnp_setting=1 - fi - AC_MSG_RESULT($use_upnp_default) - AC_DEFINE_UNQUOTED([USE_UPNP],[$upnp_setting],[UPnP support not compiled if undefined, otherwise value (0 or 1) determines default state]) - if test x$TARGET_OS = xwindows; then - MINIUPNPC_CPPFLAGS="-DSTATICLIB -DMINIUPNP_STATICLIB" - fi - else - AC_MSG_RESULT(no) - fi -fi - AM_CONDITIONAL([ENABLE_ZMQ], [test "x$use_zmq" = "xyes"]) AM_CONDITIONAL([ENABLE_PROTON], [test "x$use_proton" = "xyes"]) @@ -956,12 +908,9 @@ AC_SUBST(COPYRIGHT_YEAR, _COPYRIGHT_YEAR) AC_SUBST(RELDFLAGS) AC_SUBST(LIBTOOL_APP_LDFLAGS) -AC_SUBST(USE_UPNP) AC_SUBST(BOOST_LIBS) AC_SUBST(TESTDEFS) AC_SUBST(LEVELDB_TARGET_FLAGS) -AC_SUBST(MINIUPNPC_CPPFLAGS) -AC_SUBST(MINIUPNPC_LIBS) AC_SUBST(GMP_LIBS) AC_SUBST(GMPXX_LIBS) AC_SUBST(LIBSNARK_LIBS) diff --git a/contrib/debian/copyright b/contrib/debian/copyright index 5eb71ebb2..3fbaa848b 100644 --- a/contrib/debian/copyright +++ b/contrib/debian/copyright @@ -38,10 +38,6 @@ Files: depends/sources/openssl-*.tar.gz Copyright: 1998-2016 The OpenSSL Project and 1995-1998 Eric Young License: OpenSSL+SSLeay -Files: depends/sources/miniupnpc-*.tar.gz -Copyright: 2005-2016 Thomas BERNARD -License: BSD-3clause - Files: depends/sources/zeromq-*.tar.gz Copyright: 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. diff --git a/depends/Makefile b/depends/Makefile index a7c3477c5..897c4adab 100644 --- a/depends/Makefile +++ b/depends/Makefile @@ -4,7 +4,6 @@ SOURCES_PATH ?= $(BASEDIR)/sources BASE_CACHE ?= $(BASEDIR)/built SDK_PATH ?= $(BASEDIR)/SDKs NO_WALLET ?= -NO_UPNP ?= PRIORITY_DOWNLOAD_PATH ?= https://z.cash/depends-sources BUILD ?= $(shell ./config.guess) @@ -74,10 +73,9 @@ include packages/packages.mk rust_packages_$(NO_RUST) = $(rust_packages) wallet_packages_$(NO_WALLET) = $(wallet_packages) -upnp_packages_$(NO_UPNP) = $(upnp_packages) proton_packages_$(NO_PROTON) = $(proton_packages) -packages += $($(host_arch)_$(host_os)_packages) $($(host_os)_packages) $(rust_packages_) $(proton_packages_) $(wallet_packages_) $(upnp_packages_) +packages += $($(host_arch)_$(host_os)_packages) $($(host_os)_packages) $(rust_packages_) $(proton_packages_) $(wallet_packages_) native_packages += $($(host_arch)_$(host_os)_native_packages) $($(host_os)_native_packages) all_packages = $(packages) $(native_packages) @@ -114,7 +112,6 @@ $(host_prefix)/share/config.site : config.site.in $(host_prefix)/.stamp_$(final_ -e 's|@CPPFLAGS@|$(strip $(host_CPPFLAGS) $(host_$(release_type)_CPPFLAGS))|' \ -e 's|@LDFLAGS@|$(strip $(host_LDFLAGS) $(host_$(release_type)_LDFLAGS))|' \ -e 's|@no_wallet@|$(NO_WALLET)|' \ - -e 's|@no_upnp@|$(NO_UPNP)|' \ -e 's|@debug@|$(DEBUG)|' \ $< > $@ $(AT)touch $@ diff --git a/depends/README.md b/depends/README.md index 09296cc47..41898de1a 100644 --- a/depends/README.md +++ b/depends/README.md @@ -35,7 +35,6 @@ The following can be set when running make: make FOO=bar SDK_PATH: Path where sdk's can be found (used by OSX) PRIORITY_DOWNLOAD_PATH: Try fetching source files from here before using their own URLs NO_WALLET: Don't download/build/cache libs needed to enable the wallet - NO_UPNP: Don't download/build/cache packages needed for enabling upnp DEBUG: disable some optimizations and enable more runtime checking If some packages are not built, for example `make NO_WALLET=1`, the appropriate diff --git a/depends/config.site.in b/depends/config.site.in index 153330360..103486332 100644 --- a/depends/config.site.in +++ b/depends/config.site.in @@ -17,10 +17,6 @@ if test -z $enable_wallet && test -n "@no_wallet@"; then enable_wallet=no fi -if test -z $with_miniupnpc && test -n "@no_upnp@"; then - with_miniupnpc=no -fi - if test x@host_os@ = xdarwin; then BREW=no PORT=no diff --git a/depends/packages/miniupnpc.mk b/depends/packages/miniupnpc.mk deleted file mode 100644 index 0d8efbc3f..000000000 --- a/depends/packages/miniupnpc.mk +++ /dev/null @@ -1,32 +0,0 @@ -package=miniupnpc -$(package)_version=2.0 -$(package)_download_path=http://miniupnp.free.fr/files -$(package)_file_name=$(package)-$($(package)_version).tar.gz -$(package)_sha256_hash=d434ceb8986efbe199c5ca53f90ed53eab290b1e6d0530b717eb6fa49d61f93b -$(package)_patches=fix-solaris-compilation.patch strlen-before-memcmp.patch patch-strlen-patch.patch - -define $(package)_set_vars -$(package)_build_opts=CC="$($(package)_cc)" -$(package)_build_opts_darwin=OS=Darwin -$(package)_build_opts_mingw32=-f Makefile.mingw -$(package)_build_env+=CFLAGS="$($(package)_cflags) $($(package)_cppflags)" AR="$($(package)_ar)" -endef - -define $(package)_preprocess_cmds - mkdir dll && \ - sed -e 's|MINIUPNPC_VERSION_STRING \"version\"|MINIUPNPC_VERSION_STRING \"$($(package)_version)\"|' -e 's|OS/version|$(host)|' miniupnpcstrings.h.in > miniupnpcstrings.h && \ - sed -i.old "s|miniupnpcstrings.h: miniupnpcstrings.h.in wingenminiupnpcstrings|miniupnpcstrings.h: miniupnpcstrings.h.in|" Makefile.mingw && \ - patch -p2 < $($(package)_patch_dir)/fix-solaris-compilation.patch && \ - patch -p2 < $($(package)_patch_dir)/strlen-before-memcmp.patch && \ - patch -p2 < $($(package)_patch_dir)/patch-strlen-patch.patch -endef - -define $(package)_build_cmds - $(MAKE) libminiupnpc.a $($(package)_build_opts) -endef - -define $(package)_stage_cmds - mkdir -p $($(package)_staging_prefix_dir)/include/miniupnpc $($(package)_staging_prefix_dir)/lib &&\ - install *.h $($(package)_staging_prefix_dir)/include/miniupnpc &&\ - install libminiupnpc.a $($(package)_staging_prefix_dir)/lib -endef diff --git a/depends/packages/packages.mk b/depends/packages/packages.mk index 5e45dbe98..91873bf9f 100644 --- a/depends/packages/packages.mk +++ b/depends/packages/packages.mk @@ -5,5 +5,3 @@ packages := boost openssl libevent zeromq $(zcash_packages) googletest googlemoc native_packages := native_ccache wallet_packages=bdb - -upnp_packages=miniupnpc diff --git a/depends/patches/miniupnpc/fix-solaris-compilation.patch b/depends/patches/miniupnpc/fix-solaris-compilation.patch deleted file mode 100644 index 30eb3b106..000000000 --- a/depends/patches/miniupnpc/fix-solaris-compilation.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 71ce1d6dfa5424f8fe8633e23494c7638ea2c79e Mon Sep 17 00:00:00 2001 -From: Thomas Bernard -Date: Thu, 10 Nov 2016 21:55:33 +0100 -Subject: [PATCH] fix for Solaris 11 compilation - -see #216 ---- - miniupnpc/Makefile | 2 ++ - miniupnpc/minissdpc.c | 3 +++ - 2 files changed, 5 insertions(+) - -diff --git a/miniupnpc/Makefile b/miniupnpc/Makefile -index 5c23000..72cdc0f 100644 ---- a/miniupnpc/Makefile -+++ b/miniupnpc/Makefile -@@ -43,10 +43,12 @@ CFLAGS += -D_NETBSD_SOURCE - endif - ifneq ($(OS), FreeBSD) - ifneq ($(OS), Darwin) -+ifneq ($(OS), SunOS) - #CFLAGS += -D_POSIX_C_SOURCE=200112L - CFLAGS += -D_XOPEN_SOURCE=600 - endif - endif -+endif - #CFLAGS += -ansi - # -DNO_GETADDRINFO - INSTALL = install -diff --git a/miniupnpc/minissdpc.c b/miniupnpc/minissdpc.c -index f200f07..263160e 100644 ---- a/miniupnpc/minissdpc.c -+++ b/miniupnpc/minissdpc.c -@@ -73,6 +73,9 @@ struct sockaddr_un { - - #if !defined(HAS_IP_MREQN) && !defined(_WIN32) - #include -+#if defined(__sun) -+#include -+#endif - #endif - - #if defined(HAS_IP_MREQN) && defined(NEED_STRUCT_IP_MREQN) diff --git a/depends/patches/miniupnpc/patch-strlen-patch.patch b/depends/patches/miniupnpc/patch-strlen-patch.patch deleted file mode 100644 index df7140234..000000000 --- a/depends/patches/miniupnpc/patch-strlen-patch.patch +++ /dev/null @@ -1,22 +0,0 @@ -From 0aa7c46227acd8ddb135c577674ad454bf2fba86 Mon Sep 17 00:00:00 2001 -From: Thomas Bernard -Date: Fri, 11 Nov 2016 17:53:21 +0100 -Subject: [PATCH] remove unsigned/signed comparison - ---- - miniupnpc/portlistingparse.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/miniupnpc/portlistingparse.c b/miniupnpc/portlistingparse.c -index 1bed763..07f3f87 100644 ---- a/miniupnpc/portlistingparse.c -+++ b/miniupnpc/portlistingparse.c -@@ -55,7 +55,7 @@ startelt(void * d, const char * name, int l) - pdata->curelt = PortMappingEltNone; - for(i = 0; elements[i].str; i++) - { -- if(strlen(elements[i].str) == l && memcmp(name, elements[i].str, l) == 0) -+ if(strlen(elements[i].str) == (size_t)l && memcmp(name, elements[i].str, l) == 0) - { - pdata->curelt = elements[i].code; - break; diff --git a/depends/patches/miniupnpc/strlen-before-memcmp.patch b/depends/patches/miniupnpc/strlen-before-memcmp.patch deleted file mode 100644 index 8e1f2005e..000000000 --- a/depends/patches/miniupnpc/strlen-before-memcmp.patch +++ /dev/null @@ -1,23 +0,0 @@ -From ec1c49bb0cd5e448e6f0adee7de3a831c4869bdd Mon Sep 17 00:00:00 2001 -From: Thomas Bernard -Date: Fri, 11 Nov 2016 17:24:39 +0100 -Subject: [PATCH] check strlen before memcmp - -1st try to fix #220 ---- - miniupnpc/portlistingparse.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/miniupnpc/portlistingparse.c b/miniupnpc/portlistingparse.c -index 0e09278..1bed763 100644 ---- a/miniupnpc/portlistingparse.c -+++ b/miniupnpc/portlistingparse.c -@@ -55,7 +55,7 @@ startelt(void * d, const char * name, int l) - pdata->curelt = PortMappingEltNone; - for(i = 0; elements[i].str; i++) - { -- if(memcmp(name, elements[i].str, l) == 0) -+ if(strlen(elements[i].str) == l && memcmp(name, elements[i].str, l) == 0) - { - pdata->curelt = elements[i].code; - break; diff --git a/doc/man/zcash-cli.1 b/doc/man/zcash-cli.1 index ec1297a45..137e305a5 100644 --- a/doc/man/zcash-cli.1 +++ b/doc/man/zcash-cli.1 @@ -80,4 +80,4 @@ or . This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit and cryptographic software written -by Eric Young and UPnP software written by Thomas Bernard. +by Eric Young. diff --git a/doc/man/zcash-tx.1 b/doc/man/zcash-tx.1 index 735c8385a..4d8b929a4 100644 --- a/doc/man/zcash-tx.1 +++ b/doc/man/zcash-tx.1 @@ -98,4 +98,4 @@ or . This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit and cryptographic software written -by Eric Young and UPnP software written by Thomas Bernard. +by Eric Young. diff --git a/doc/man/zcashd.1 b/doc/man/zcashd.1 index 7d8a6a88e..c813b8426 100644 --- a/doc/man/zcashd.1 +++ b/doc/man/zcashd.1 @@ -217,10 +217,6 @@ Tor control port to use if onion listening enabled (default: .IP Tor control port password (default: empty) .HP -\fB\-upnp\fR -.IP -Use UPnP to map the listening port (default: 0) -.HP \fB\-whitebind=\fR .IP Bind to given address and whitelist peers connecting to it. Use @@ -478,4 +474,4 @@ or . This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit and cryptographic software written -by Eric Young and UPnP software written by Thomas Bernard. +by Eric Young. diff --git a/src/Makefile.am b/src/Makefile.am index 1f6704798..4f4b28764 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -203,7 +203,7 @@ obj/build.h: FORCE libbitcoin_util_a-clientversion.$(OBJEXT): obj/build.h # server: zcashd -libbitcoin_server_a_CPPFLAGS = $(BITCOIN_INCLUDES) $(MINIUPNPC_CPPFLAGS) $(EVENT_CFLAGS) $(EVENT_PTHREADS_CFLAGS) +libbitcoin_server_a_CPPFLAGS = $(BITCOIN_INCLUDES) $(EVENT_CFLAGS) $(EVENT_PTHREADS_CFLAGS) libbitcoin_server_a_SOURCES = \ sendalert.cpp \ addrman.cpp \ @@ -411,7 +411,6 @@ zcashd_LDADD += \ $(BDB_LIBS) \ $(SSL_LIBS) \ $(CRYPTO_LIBS) \ - $(MINIUPNPC_LIBS) \ $(EVENT_PTHREADS_LIBS) \ $(EVENT_LIBS) \ $(LIBZCASH) \ diff --git a/src/Makefile.gtest.include b/src/Makefile.gtest.include index ababfa557..b6cfec81b 100644 --- a/src/Makefile.gtest.include +++ b/src/Makefile.gtest.include @@ -54,7 +54,7 @@ if ENABLE_WALLET zcash_gtest_LDADD += $(LIBBITCOIN_WALLET) endif -zcash_gtest_LDADD += $(LIBZCASH_CONSENSUS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(LIBZCASH) $(LIBZCASH_LIBS) +zcash_gtest_LDADD += $(LIBZCASH_CONSENSUS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(LIBZCASH) $(LIBZCASH_LIBS) if ENABLE_PROTON zcash_gtest_LDADD += $(LIBBITCOIN_PROTON) $(PROTON_LIBS) diff --git a/src/Makefile.test.include b/src/Makefile.test.include index 2706bd490..f5d4d10b7 100644 --- a/src/Makefile.test.include +++ b/src/Makefile.test.include @@ -106,7 +106,7 @@ if ENABLE_WALLET test_test_bitcoin_LDADD += $(LIBBITCOIN_WALLET) endif -test_test_bitcoin_LDADD += $(LIBZCASH_CONSENSUS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(LIBZCASH) $(LIBZCASH_LIBS) +test_test_bitcoin_LDADD += $(LIBZCASH_CONSENSUS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(LIBZCASH) $(LIBZCASH_LIBS) test_test_bitcoin_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) -static if ENABLE_ZMQ diff --git a/src/init.cpp b/src/init.cpp index 2e16d6502..cb91a1c1d 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -393,13 +393,6 @@ std::string HelpMessage(HelpMessageMode mode) strUsage += HelpMessageOpt("-timeout=", strprintf(_("Specify connection timeout in milliseconds (minimum: 1, default: %d)"), DEFAULT_CONNECT_TIMEOUT)); strUsage += HelpMessageOpt("-torcontrol=:", strprintf(_("Tor control port to use if onion listening enabled (default: %s)"), DEFAULT_TOR_CONTROL)); strUsage += HelpMessageOpt("-torpassword=", _("Tor control port password (default: empty)")); -#ifdef USE_UPNP -#if USE_UPNP - strUsage += HelpMessageOpt("-upnp", _("Use UPnP to map the listening port (default: 1 when listening and no -proxy)")); -#else - strUsage += HelpMessageOpt("-upnp", strprintf(_("Use UPnP to map the listening port (default: %u)"), 0)); -#endif -#endif strUsage += HelpMessageOpt("-whitebind=", _("Bind to given address and whitelist peers connecting to it. Use [host]:port notation for IPv6")); strUsage += HelpMessageOpt("-whitelist=", _("Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.") + " " + _("Whitelisted peers cannot be DoS banned and their transactions are always relayed, even if they are already in the mempool, useful e.g. for a gateway")); @@ -829,19 +822,13 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) // to protect privacy, do not listen by default if a default proxy server is specified if (SoftSetBoolArg("-listen", false)) LogPrintf("%s: parameter interaction: -proxy set -> setting -listen=0\n", __func__); - // to protect privacy, do not use UPNP when a proxy is set. The user may still specify -listen=1 - // to listen locally, so don't rely on this happening through -listen below. - if (SoftSetBoolArg("-upnp", false)) - LogPrintf("%s: parameter interaction: -proxy set -> setting -upnp=0\n", __func__); // to protect privacy, do not discover addresses by default if (SoftSetBoolArg("-discover", false)) LogPrintf("%s: parameter interaction: -proxy set -> setting -discover=0\n", __func__); } if (!GetBoolArg("-listen", DEFAULT_LISTEN)) { - // do not map ports or try to retrieve public IP when not listening (pointless) - if (SoftSetBoolArg("-upnp", false)) - LogPrintf("%s: parameter interaction: -listen=0 -> setting -upnp=0\n", __func__); + // do not try to retrieve public IP when not listening (pointless) if (SoftSetBoolArg("-discover", false)) LogPrintf("%s: parameter interaction: -listen=0 -> setting -discover=0\n", __func__); if (SoftSetBoolArg("-listenonion", false)) diff --git a/src/net.cpp b/src/net.cpp index de624c72a..7a40d97d6 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -23,13 +23,6 @@ #include #endif -#ifdef USE_UPNP -#include -#include -#include -#include -#endif - #include #include @@ -1215,131 +1208,6 @@ void ThreadSocketHandler() } - - - - - - - -#ifdef USE_UPNP -void ThreadMapPort() -{ - std::string port = strprintf("%u", GetListenPort()); - const char * multicastif = 0; - const char * minissdpdpath = 0; - struct UPNPDev * devlist = 0; - char lanaddr[64]; - -#ifndef UPNPDISCOVER_SUCCESS - /* miniupnpc 1.5 */ - devlist = upnpDiscover(2000, multicastif, minissdpdpath, 0); -#elif MINIUPNPC_API_VERSION < 14 - /* miniupnpc 1.6 */ - int error = 0; - devlist = upnpDiscover(2000, multicastif, minissdpdpath, 0, 0, &error); -#else - /* miniupnpc 1.9.20150730 */ - int error = 0; - devlist = upnpDiscover(2000, multicastif, minissdpdpath, 0, 0, 2, &error); -#endif - - struct UPNPUrls urls; - struct IGDdatas data; - int r; - - r = UPNP_GetValidIGD(devlist, &urls, &data, lanaddr, sizeof(lanaddr)); - if (r == 1) - { - if (fDiscover) { - char externalIPAddress[40]; - r = UPNP_GetExternalIPAddress(urls.controlURL, data.first.servicetype, externalIPAddress); - if(r != UPNPCOMMAND_SUCCESS) - LogPrintf("UPnP: GetExternalIPAddress() returned %d\n", r); - else - { - if(externalIPAddress[0]) - { - LogPrintf("UPnP: ExternalIPAddress = %s\n", externalIPAddress); - AddLocal(CNetAddr(externalIPAddress), LOCAL_UPNP); - } - else - LogPrintf("UPnP: GetExternalIPAddress failed.\n"); - } - } - - string strDesc = "Bitcoin " + FormatFullVersion(); - - try { - while (true) { -#ifndef UPNPDISCOVER_SUCCESS - /* miniupnpc 1.5 */ - r = UPNP_AddPortMapping(urls.controlURL, data.first.servicetype, - port.c_str(), port.c_str(), lanaddr, strDesc.c_str(), "TCP", 0); -#else - /* miniupnpc 1.6 */ - r = UPNP_AddPortMapping(urls.controlURL, data.first.servicetype, - port.c_str(), port.c_str(), lanaddr, strDesc.c_str(), "TCP", 0, "0"); -#endif - - if(r!=UPNPCOMMAND_SUCCESS) - LogPrintf("AddPortMapping(%s, %s, %s) failed with code %d (%s)\n", - port, port, lanaddr, r, strupnperror(r)); - else - LogPrintf("UPnP Port Mapping successful.\n");; - - MilliSleep(20*60*1000); // Refresh every 20 minutes - } - } - catch (const boost::thread_interrupted&) - { - r = UPNP_DeletePortMapping(urls.controlURL, data.first.servicetype, port.c_str(), "TCP", 0); - LogPrintf("UPNP_DeletePortMapping() returned: %d\n", r); - freeUPNPDevlist(devlist); devlist = 0; - FreeUPNPUrls(&urls); - throw; - } - } else { - LogPrintf("No valid UPnP IGDs found\n"); - freeUPNPDevlist(devlist); devlist = 0; - if (r != 0) - FreeUPNPUrls(&urls); - } -} - -void MapPort(bool fUseUPnP) -{ - static boost::thread* upnp_thread = NULL; - - if (fUseUPnP) - { - if (upnp_thread) { - upnp_thread->interrupt(); - upnp_thread->join(); - delete upnp_thread; - } - upnp_thread = new boost::thread(boost::bind(&TraceThread, "upnp", &ThreadMapPort)); - } - else if (upnp_thread) { - upnp_thread->interrupt(); - upnp_thread->join(); - delete upnp_thread; - upnp_thread = NULL; - } -} - -#else -void MapPort(bool) -{ - // Intentionally left blank. -} -#endif - - - - - - void ThreadDNSAddressSeed() { // goal: only query DNS seeds if address need is acute @@ -1879,9 +1747,6 @@ void StartNode(boost::thread_group& threadGroup, CScheduler& scheduler) else threadGroup.create_thread(boost::bind(&TraceThread, "dnsseed", &ThreadDNSAddressSeed)); - // Map ports with UPnP - MapPort(GetBoolArg("-upnp", DEFAULT_UPNP)); - // Send and receive from sockets, accept connections threadGroup.create_thread(boost::bind(&TraceThread, "net", &ThreadSocketHandler)); @@ -1901,7 +1766,6 @@ void StartNode(boost::thread_group& threadGroup, CScheduler& scheduler) bool StopNode() { LogPrintf("StopNode()\n"); - MapPort(false); if (semOutbound) for (int i=0; ipost(); diff --git a/src/net.h b/src/net.h index f7ebf11f6..6fd49536d 100644 --- a/src/net.h +++ b/src/net.h @@ -51,12 +51,6 @@ static const unsigned int MAX_ADDR_TO_SEND = 1000; static const unsigned int MAX_PROTOCOL_MESSAGE_LENGTH = 2 * 1024 * 1024; /** -listen default */ static const bool DEFAULT_LISTEN = true; -/** -upnp default */ -#ifdef USE_UPNP -static const bool DEFAULT_UPNP = USE_UPNP; -#else -static const bool DEFAULT_UPNP = false; -#endif /** The maximum number of entries in mapAskFor */ static const size_t MAPASKFOR_MAX_SZ = MAX_INV_SZ; /** The maximum number of entries in setAskFor (larger due to getdata latency)*/ @@ -75,7 +69,6 @@ CNode* FindNode(const std::string& addrName); CNode* FindNode(const CService& ip); CNode* ConnectNode(CAddress addrConnect, const char *pszDest = NULL); bool OpenNetworkConnection(const CAddress& addrConnect, CSemaphoreGrant *grantOutbound = NULL, const char *strDest = NULL, bool fOneShot = false); -void MapPort(bool fUseUPnP); unsigned short GetListenPort(); bool BindListenPort(const CService &bindAddr, std::string& strError, bool fWhitelisted = false); void StartNode(boost::thread_group& threadGroup, CScheduler& scheduler); @@ -118,7 +111,7 @@ enum LOCAL_NONE, // unknown LOCAL_IF, // address a local interface listens on LOCAL_BIND, // address explicit bound to - LOCAL_UPNP, // address reported by UPnP + LOCAL_UPNP, // unused (was: address reported by UPnP) LOCAL_MANUAL, // address explicitly specified (-externalip=) LOCAL_MAX diff --git a/src/util.cpp b/src/util.cpp index 233ec322e..6ecb9af7c 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -905,7 +905,7 @@ std::string LicenseInfo() "\n" + FormatParagraph(_("Distributed under the MIT software license, see the accompanying file COPYING or .")) + "\n" + "\n" + - FormatParagraph(_("This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.")) + + FormatParagraph(_("This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit and cryptographic software written by Eric Young.")) + "\n"; } From 6db418c9827d2d205f6c1bde0229ff852b4e4dcc Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 4 Jul 2017 17:46:17 -0700 Subject: [PATCH 0142/1062] Ansible playbook for installing Zcash dependencies and Buildbot worker --- contrib/ci-workers/README.md | 4 +++ contrib/ci-workers/unix.yml | 56 +++++++++++++++++++++++++++++ contrib/ci-workers/vars/default.yml | 39 ++++++++++++++++++++ 3 files changed, 99 insertions(+) create mode 100644 contrib/ci-workers/README.md create mode 100644 contrib/ci-workers/unix.yml create mode 100644 contrib/ci-workers/vars/default.yml diff --git a/contrib/ci-workers/README.md b/contrib/ci-workers/README.md new file mode 100644 index 000000000..72b832fcb --- /dev/null +++ b/contrib/ci-workers/README.md @@ -0,0 +1,4 @@ +# Zcash CI workers + +This folder contains the Ansible playbooks for configuring a fresh OS +installation for use as a Buildbot worker in Zcash's CI. diff --git a/contrib/ci-workers/unix.yml b/contrib/ci-workers/unix.yml new file mode 100644 index 000000000..94e122447 --- /dev/null +++ b/contrib/ci-workers/unix.yml @@ -0,0 +1,56 @@ +--- +- name: Configure a Buildbot worker for Zcash CI + hosts: zcash-ci-worker-unix + become: true + gather_facts: False + + pre_tasks: + - set_fact: + python_raw: "test -e /usr/bin/python || test -e /usr/bin/python2 || test -e /usr/bin/python2.7 || test -e /usr/local/bin/python2.7 || (test -e /usr/bin/apt && apt -qqy update && apt install -qqy python) || (test -e /usr/bin/dnf && dnf install -qqy python2) || (test -e /usr/sbin/pkg && pkg install -qqy python2)" + - name: Install Python 2 for Ansible and Buildbot [bash] + raw: bash -c "'{{ python_raw }}'" + ignore_errors: true + register: output + changed_when: + - output.stdout != "" + - output.stdout != "\r\n" + - name: Install Python 2 for Ansible and Buildbot [tcsh] + raw: tcsh -c "{{ python_raw }}" + ignore_errors: true + register: output + changed_when: + - output.stdout != "" + - output.stdout != "\r\n" + - name: Gathering Facts + setup: + + tasks: + - name: Get default dependencies + include_vars: "vars/default.yml" + + - name: Get dependencies for distribution + include_vars: "{{ item }}" + with_first_found: + - files: + - "vars/{{ ansible_distribution }}-{{ ansible_distribution_version }}.yml" + - "vars/{{ ansible_distribution }}-{{ ansible_distribution_major_version | int }}.yml" + - "vars/{{ ansible_distribution }}.yml" + - "vars/{{ ansible_os_family }}.yml" + skip: true + + - name: Collate dependencies + set_fact: + package_deps: "{{ buildbot_deps + fetch_deps + conf_deps + build_deps + link_deps + dist_deps }}" + python_modules: "{{ buildbot_modules + rpc_test_modules }}" + + - name: Install required packages + package: + name: "{{ item }}" + state: present + with_items: "{{ package_deps }}" + + - name: Install required Python modules + pip: + name: "{{ item }}" + state: latest + with_items: "{{ python_modules }}" diff --git a/contrib/ci-workers/vars/default.yml b/contrib/ci-workers/vars/default.yml new file mode 100644 index 000000000..9aa79da5e --- /dev/null +++ b/contrib/ci-workers/vars/default.yml @@ -0,0 +1,39 @@ +--- +# These variables can be overridden in distribution files. + +# Dependencies required to install Buildbot +buildbot_deps: + - python-pip # So we can install Python modules + +# Dependencies required to download files +fetch_deps: + - git + - wget # For zcutil/fetch-params.sh + +# Dependencies required to configure Zcash +conf_deps: + - autoconf + - automake + - m4 + +# Dependencies required to compile Zcash +build_deps: + - g++ + - gcc + - make + +# Dependencies required to link Zcash +link_deps: + - libtool + +# Additional distribution-specific dependencies +dist_deps: [] + +# Python modules required for a Zcash Buildbot worker +buildbot_modules: + - pip # Needs to be updated first so Buildbot installs + - buildbot-worker + +# Python modules required to run the Zcash RPC test suite +rpc_test_modules: + - pyzmq From 6f4a1721f24bd0d5511895a9a89329ab83456640 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 4 Jul 2017 17:47:11 -0700 Subject: [PATCH 0143/1062] Variable overrides for Debian, Ubuntu and Fedora --- contrib/ci-workers/vars/Debian.yml | 6 ++++++ contrib/ci-workers/vars/Fedora.yml | 10 ++++++++++ contrib/ci-workers/vars/Ubuntu.yml | 5 +++++ 3 files changed, 21 insertions(+) create mode 100644 contrib/ci-workers/vars/Debian.yml create mode 100644 contrib/ci-workers/vars/Fedora.yml create mode 100644 contrib/ci-workers/vars/Ubuntu.yml diff --git a/contrib/ci-workers/vars/Debian.yml b/contrib/ci-workers/vars/Debian.yml new file mode 100644 index 000000000..992224721 --- /dev/null +++ b/contrib/ci-workers/vars/Debian.yml @@ -0,0 +1,6 @@ +--- +build_deps: + - build-essential # Depends on g++, libc6-dev, make +dist_deps: + - pkg-config # Required until b556beda264308e040f8d88aca4f2f386a0183d9 is pulled in + - python-dev diff --git a/contrib/ci-workers/vars/Fedora.yml b/contrib/ci-workers/vars/Fedora.yml new file mode 100644 index 000000000..1c6b0e0f3 --- /dev/null +++ b/contrib/ci-workers/vars/Fedora.yml @@ -0,0 +1,10 @@ +--- +build_deps: + - gcc + - gcc-c++ + - make + - patch +dist_deps: + - pkgconfig # Required until b556beda264308e040f8d88aca4f2f386a0183d9 is pulled in + - python-devel + - redhat-rpm-config diff --git a/contrib/ci-workers/vars/Ubuntu.yml b/contrib/ci-workers/vars/Ubuntu.yml new file mode 100644 index 000000000..4acca499b --- /dev/null +++ b/contrib/ci-workers/vars/Ubuntu.yml @@ -0,0 +1,5 @@ +--- +build_deps: + - build-essential # Depends on g++, libc6-dev, make +dist_deps: + - pkg-config # Required until b556beda264308e040f8d88aca4f2f386a0183d9 is pulled in From c73014a2e3b0c45b71343a5024dfe1ee532fef51 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 4 Jul 2017 17:47:34 -0700 Subject: [PATCH 0144/1062] Variable overrides for FreeBSD These are insufficient to enable FreeBSD to build. --- contrib/ci-workers/vars/FreeBSD.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 contrib/ci-workers/vars/FreeBSD.yml diff --git a/contrib/ci-workers/vars/FreeBSD.yml b/contrib/ci-workers/vars/FreeBSD.yml new file mode 100644 index 000000000..65909d71d --- /dev/null +++ b/contrib/ci-workers/vars/FreeBSD.yml @@ -0,0 +1,9 @@ +--- +buildbot_deps: + - py27-pip +build_deps: + - gcc + - gmake +dist_deps: + - bash + - pkgconf # Required until b556beda264308e040f8d88aca4f2f386a0183d9 is pulled in From 046c3d4f242f107a918f2ef821b68598aa199504 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Mon, 10 Jul 2017 10:30:23 -0500 Subject: [PATCH 0145/1062] Simplify Python installation, inform user if they need to manually configure --- contrib/ci-workers/unix.yml | 41 ++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/contrib/ci-workers/unix.yml b/contrib/ci-workers/unix.yml index 94e122447..6fd56a0a8 100644 --- a/contrib/ci-workers/unix.yml +++ b/contrib/ci-workers/unix.yml @@ -4,30 +4,43 @@ become: true gather_facts: False + vars_files: + - vars/default.yml + pre_tasks: - - set_fact: - python_raw: "test -e /usr/bin/python || test -e /usr/bin/python2 || test -e /usr/bin/python2.7 || test -e /usr/local/bin/python2.7 || (test -e /usr/bin/apt && apt -qqy update && apt install -qqy python) || (test -e /usr/bin/dnf && dnf install -qqy python2) || (test -e /usr/sbin/pkg && pkg install -qqy python2)" - - name: Install Python 2 for Ansible and Buildbot [bash] - raw: bash -c "'{{ python_raw }}'" - ignore_errors: true + - name: Install Python 2 for Ansible and Buildbot + raw: test -e /usr/bin/python || test -e /usr/bin/python2 || test -e /usr/bin/python2.7 || test -e /usr/local/bin/python2.7 || (test -e /usr/bin/apt && apt -qqy update && apt install -qqy python) || (test -e /usr/bin/dnf && dnf install -qqy python2) || (test -e /usr/sbin/pkg && pkg install -qqy python2) register: output changed_when: - output.stdout != "" - output.stdout != "\r\n" - - name: Install Python 2 for Ansible and Buildbot [tcsh] - raw: tcsh -c "{{ python_raw }}" + + - name: Check if Python is in the configured location + raw: test -e {{ ansible_python_interpreter }} ignore_errors: true - register: output - changed_when: - - output.stdout != "" - - output.stdout != "\r\n" + register: python_check + when: ansible_python_interpreter is defined + + - name: Fail if configured Python is unavailable + fail: + msg: Python is not accessible at {{ ansible_python_interpreter }} on this host! Please set the inventory variable 'ansible_python_interpreter' to the location of the Python 2 binary. + when: ansible_python_interpreter is defined and python_check.rc == 1 + + - name: Check if Python is in the default location + raw: test -e /usr/bin/python + ignore_errors: true + register: python_check + when: ansible_python_interpreter is undefined + + - name: Fail if default Python is unavailable + fail: + msg: Python is not accessible at /usr/bin/python on this host! Please set the inventory variable 'ansible_python_interpreter' to the location of the Python 2 binary. + when: ansible_python_interpreter is undefined and python_check.rc == 1 + - name: Gathering Facts setup: tasks: - - name: Get default dependencies - include_vars: "vars/default.yml" - - name: Get dependencies for distribution include_vars: "{{ item }}" with_first_found: From d77a0ac4a031ce59e706885da0ee7364231bb2cf Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 11 Jul 2017 00:53:55 -0700 Subject: [PATCH 0146/1062] Closes #2446 by adding generated field to listunspent. If generated is true, the unspent transaction output is from a coinbase transaction and can only be sent to a shielded address. --- qa/rpc-tests/wallet.py | 12 ++++++++++++ src/wallet/rpcwallet.cpp | 2 ++ 2 files changed, 14 insertions(+) diff --git a/qa/rpc-tests/wallet.py b/qa/rpc-tests/wallet.py index ff827892a..555a3e902 100755 --- a/qa/rpc-tests/wallet.py +++ b/qa/rpc-tests/wallet.py @@ -72,6 +72,18 @@ class WalletTest (BitcoinTestFramework): node0utxos = self.nodes[0].listunspent(1) assert_equal(len(node0utxos), 3) + # Check 'generated' field of listunspent + # Node 0: has one coinbase utxo and two regular utxos + assert_equal(sum(int(uxto["generated"] is True) for uxto in node0utxos), 1) + # Node 1: has 101 coinbase utxos and no regular utxos + node1utxos = self.nodes[1].listunspent(1) + assert_equal(len(node1utxos), 101) + assert_equal(sum(int(uxto["generated"] is True) for uxto in node1utxos), 101) + # Node 2: has no coinbase utxos and two regular utxos + node2utxos = self.nodes[2].listunspent(1) + assert_equal(len(node2utxos), 2) + assert_equal(sum(int(uxto["generated"] is True) for uxto in node2utxos), 0) + # create both transactions txns_to_send = [] for utxo in node0utxos: diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index aa1ad9955..112e05d89 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -2334,6 +2334,7 @@ UniValue listunspent(const UniValue& params, bool fHelp) " {\n" " \"txid\" : \"txid\", (string) the transaction id \n" " \"vout\" : n, (numeric) the vout value\n" + " \"generated\" : true|false (boolean) true if txout is a coinbase transaction output\n" " \"address\" : \"address\", (string) the zcash address\n" " \"account\" : \"account\", (string) DEPRECATED. The associated account, or \"\" for the default account\n" " \"scriptPubKey\" : \"key\", (string) the script key\n" @@ -2396,6 +2397,7 @@ UniValue listunspent(const UniValue& params, bool fHelp) UniValue entry(UniValue::VOBJ); entry.push_back(Pair("txid", out.tx->GetHash().GetHex())); entry.push_back(Pair("vout", out.i)); + entry.push_back(Pair("generated", out.tx->IsCoinBase())); CTxDestination address; if (ExtractDestination(out.tx->vout[out.i].scriptPubKey, address)) { entry.push_back(Pair("address", CBitcoinAddress(address).ToString())); From b639bb1eefe435a65a0646ab51202853f80b63b6 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 11 Jul 2017 11:29:43 -0700 Subject: [PATCH 0147/1062] Fixes #2519. When sending from a zaddr, minconf cannot be zero. --- doc/payment-api.md | 3 ++- src/test/rpc_wallet_tests.cpp | 12 ++++++++++++ src/wallet/asyncrpcoperation_sendmany.cpp | 4 ++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/doc/payment-api.md b/doc/payment-api.md index 5dc0eb907..72eef3644 100644 --- a/doc/payment-api.md +++ b/doc/payment-api.md @@ -71,7 +71,7 @@ z_importwallet | filename | _Requires an unlocked wallet or an unencrypted walle Command | Parameters | Description --- | --- | --- z_listreceivedbyaddress
| zaddr [minconf=1] | Return a list of amounts received by a zaddr belonging to the node’s wallet.

Optionally set the minimum number of confirmations which a received amount must have in order to be included in the result. Use 0 to count unconfirmed transactions.

Output:
[{
“txid”: “4a0f…”,
“amount”: 0.54,
“memo”:”F0FF…”,}, {...}, {...}
] -z_sendmany
| fromaddress amounts [minconf=1] [fee=0.0001] | _This is an Asynchronous RPC call_

Send funds from an address to multiple outputs. The address can be either a taddr or a zaddr.

Amounts is a list containing key/value pairs corresponding to the addresses and amount to pay. Each output address can be in taddr or zaddr format.

When sending to a zaddr, you also have the option of attaching a memo in hexadecimal format.

**NOTE:**When sending coinbase funds to a zaddr, the node's wallet does not allow any change. Put another way, spending a partial amount of a coinbase utxo is not allowed. This is not a consensus rule but a local wallet rule due to the current implementation of z_sendmany. In future, this rule may be removed.

Example of Outputs parameter:
[{“address”:”t123…”, “amount”:0.005},
,{“address”:”z010…”,”amount”:0.03, “memo”:”f508af…”}]

Optionally set the minimum number of confirmations which a private or transparent transaction must have in order to be used as an input.

Optionally set a transaction fee, which by default is 0.0001 ZEC.

Any transparent change will be sent to a new transparent address. Any private change will be sent back to the zaddr being used as the source of funds.

Returns an operationid. You use the operationid value with z_getoperationstatus and z_getoperationresult to obtain the result of sending funds, which if successful, will be a txid. +z_sendmany
| fromaddress amounts [minconf=1] [fee=0.0001] | _This is an Asynchronous RPC call_

Send funds from an address to multiple outputs. The address can be either a taddr or a zaddr.

Amounts is a list containing key/value pairs corresponding to the addresses and amount to pay. Each output address can be in taddr or zaddr format.

When sending to a zaddr, you also have the option of attaching a memo in hexadecimal format.

**NOTE:**When sending coinbase funds to a zaddr, the node's wallet does not allow any change. Put another way, spending a partial amount of a coinbase utxo is not allowed. This is not a consensus rule but a local wallet rule due to the current implementation of z_sendmany. In future, this rule may be removed.

Example of Outputs parameter:
[{“address”:”t123…”, “amount”:0.005},
,{“address”:”z010…”,”amount”:0.03, “memo”:”f508af…”}]

Optionally set the minimum number of confirmations which a private or transparent transaction must have in order to be used as an input. When sending from a zaddr, minconf must be greater than zero.

Optionally set a transaction fee, which by default is 0.0001 ZEC.

Any transparent change will be sent to a new transparent address. Any private change will be sent back to the zaddr being used as the source of funds.

Returns an operationid. You use the operationid value with z_getoperationstatus and z_getoperationresult to obtain the result of sending funds, which if successful, will be a txid. ### Operations @@ -112,6 +112,7 @@ Zcash error codes are defined in https://github.com/zcash/zcash/blob/master/src/ RPC_INVALID_PARAMETER (-8) | _Invalid, missing or duplicate parameter_ ---------------------------| ------------------------------------------------- +"Minconf cannot be zero when sending from zaddr" | Cannot accept minimum confirmation value of zero when sending from zaddr. "Minconf cannot be negative" | Cannot accept negative minimum confirmation number. "Minimum number of confirmations cannot be less than 0" | Cannot accept negative minimum confirmation number. "From address parameter missing" | Missing an address to send funds from. diff --git a/src/test/rpc_wallet_tests.cpp b/src/test/rpc_wallet_tests.cpp index 713f9c38b..42cbf109f 100644 --- a/src/test/rpc_wallet_tests.cpp +++ b/src/test/rpc_wallet_tests.cpp @@ -975,7 +975,19 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_internals) std::string msg = operation->getErrorMessage(); BOOST_CHECK( msg.find("Insufficient funds, no UTXOs found") != string::npos); } + + // minconf cannot be zero when sending from zaddr + { + try { + std::vector recipients = {SendManyRecipient(taddr1, 100.0, "DEADBEEF")}; + std::shared_ptr operation(new AsyncRPCOperation_sendmany(zaddr1, recipients, {}, 0)); + BOOST_CHECK(false); // Fail test if an exception is not thrown + } catch (const UniValue& objError) { + BOOST_CHECK(find_error(objError, "Minconf cannot be zero when sending from zaddr")); + } + } + // there are no unspent notes to spend { std::vector recipients = { SendManyRecipient(taddr1,100.0, "DEADBEEF") }; diff --git a/src/wallet/asyncrpcoperation_sendmany.cpp b/src/wallet/asyncrpcoperation_sendmany.cpp index ac4490197..8ba40928e 100644 --- a/src/wallet/asyncrpcoperation_sendmany.cpp +++ b/src/wallet/asyncrpcoperation_sendmany.cpp @@ -93,6 +93,10 @@ AsyncRPCOperation_sendmany::AsyncRPCOperation_sendmany( } } + if (isfromzaddr_ && minDepth==0) { + throw JSONRPCError(RPC_INVALID_PARAMETER, "Minconf cannot be zero when sending from zaddr"); + } + // Log the context info i.e. the call parameters to z_sendmany if (LogAcceptCategory("zrpcunsafe")) { LogPrint("zrpcunsafe", "%s: z_sendmany initialized (params=%s)\n", getId(), contextInfo.write()); From 689264bbffc89f0653b9b08467f0523061683ab5 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 12 Jul 2017 16:34:07 -0500 Subject: [PATCH 0148/1062] Add test for issue #2444 A WWW-Authenticate header must be present in the 401 response to make clients know that they can authenticate, and how. --- src/Makefile.gtest.include | 1 + src/gtest/test_httprpc.cpp | 62 ++++++++++++++++++++++++++++++++++++++ src/httpserver.h | 15 +++++---- 3 files changed, 72 insertions(+), 6 deletions(-) create mode 100644 src/gtest/test_httprpc.cpp diff --git a/src/Makefile.gtest.include b/src/Makefile.gtest.include index ababfa557..2e067f2bc 100644 --- a/src/Makefile.gtest.include +++ b/src/Makefile.gtest.include @@ -21,6 +21,7 @@ zcash_gtest_SOURCES += \ gtest/test_tautology.cpp \ gtest/test_deprecation.cpp \ gtest/test_equihash.cpp \ + gtest/test_httprpc.cpp \ gtest/test_joinsplit.cpp \ gtest/test_keystore.cpp \ gtest/test_noteencryption.cpp \ diff --git a/src/gtest/test_httprpc.cpp b/src/gtest/test_httprpc.cpp new file mode 100644 index 000000000..c630973fb --- /dev/null +++ b/src/gtest/test_httprpc.cpp @@ -0,0 +1,62 @@ +#include +#include + +#include "httprpc.cpp" +#include "httpserver.h" + +using ::testing::Return; + +class MockHTTPRequest : public HTTPRequest { +public: + MOCK_METHOD0(GetPeer, CService()); + MOCK_METHOD0(GetRequestMethod, HTTPRequest::RequestMethod()); + MOCK_METHOD1(GetHeader, std::pair(const std::string& hdr)); + MOCK_METHOD2(WriteHeader, void(const std::string& hdr, const std::string& value)); + MOCK_METHOD2(WriteReply, void(int nStatus, const std::string& strReply)); + + MockHTTPRequest() : HTTPRequest(nullptr) {} + void CleanUp() { + // So the parent destructor doesn't try to send a reply + replySent = true; + } +}; + +TEST(HTTPRPC, FailsOnGET) { + MockHTTPRequest req; + EXPECT_CALL(req, GetRequestMethod()) + .WillRepeatedly(Return(HTTPRequest::GET)); + EXPECT_CALL(req, WriteReply(HTTP_BAD_METHOD, "JSONRPC server handles only POST requests")) + .Times(1); + EXPECT_FALSE(HTTPReq_JSONRPC(&req, "")); + req.CleanUp(); +} + +TEST(HTTPRPC, FailsWithoutAuthHeader) { + MockHTTPRequest req; + EXPECT_CALL(req, GetRequestMethod()) + .WillRepeatedly(Return(HTTPRequest::POST)); + EXPECT_CALL(req, GetHeader("authorization")) + .WillRepeatedly(Return(std::make_pair(false, ""))); + EXPECT_CALL(req, WriteHeader("WWW-Authenticate", "Basic realm=\"jsonrpc\"")) + .Times(1); + EXPECT_CALL(req, WriteReply(HTTP_UNAUTHORIZED, "")) + .Times(1); + EXPECT_FALSE(HTTPReq_JSONRPC(&req, "")); + req.CleanUp(); +} + +TEST(HTTPRPC, FailsWithBadAuth) { + MockHTTPRequest req; + EXPECT_CALL(req, GetRequestMethod()) + .WillRepeatedly(Return(HTTPRequest::POST)); + EXPECT_CALL(req, GetHeader("authorization")) + .WillRepeatedly(Return(std::make_pair(true, "Basic spam:eggs"))); + EXPECT_CALL(req, GetPeer()) + .WillRepeatedly(Return(CService("127.0.0.1:1337"))); + EXPECT_CALL(req, WriteHeader("WWW-Authenticate", "Basic realm=\"jsonrpc\"")) + .Times(1); + EXPECT_CALL(req, WriteReply(HTTP_UNAUTHORIZED, "")) + .Times(1); + EXPECT_FALSE(HTTPReq_JSONRPC(&req, "")); + req.CleanUp(); +} diff --git a/src/httpserver.h b/src/httpserver.h index b377dc19f..347e7c3ab 100644 --- a/src/httpserver.h +++ b/src/httpserver.h @@ -56,11 +56,14 @@ class HTTPRequest { private: struct evhttp_request* req; + + // For test access +protected: bool replySent; public: HTTPRequest(struct evhttp_request* req); - ~HTTPRequest(); + virtual ~HTTPRequest(); enum RequestMethod { UNKNOWN, @@ -76,17 +79,17 @@ public: /** Get CService (address:ip) for the origin of the http request. */ - CService GetPeer(); + virtual CService GetPeer(); /** Get request method. */ - RequestMethod GetRequestMethod(); + virtual RequestMethod GetRequestMethod(); /** * Get the request header specified by hdr, or an empty string. * Return an pair (isPresent,string). */ - std::pair GetHeader(const std::string& hdr); + virtual std::pair GetHeader(const std::string& hdr); /** * Read request body. @@ -101,7 +104,7 @@ public: * * @note call this before calling WriteErrorReply or Reply. */ - void WriteHeader(const std::string& hdr, const std::string& value); + virtual void WriteHeader(const std::string& hdr, const std::string& value); /** * Write HTTP reply. @@ -111,7 +114,7 @@ public: * @note Can be called only once. As this will give the request back to the * main thread, do not call any other HTTPRequest methods after calling this. */ - void WriteReply(int nStatus, const std::string& strReply = ""); + virtual void WriteReply(int nStatus, const std::string& strReply = ""); }; /** Event handler closure. From 20fb708e6f6b8dd808e3c35f6aa7fb560a1275b9 Mon Sep 17 00:00:00 2001 From: "Wladimir J. van der Laan" Date: Fri, 5 Feb 2016 10:45:50 +0100 Subject: [PATCH 0149/1062] rpc: Add WWW-Authenticate header to 401 response A WWW-Authenticate header must be present in the 401 response to make clients know that they can authenticate, and how. WWW-Authenticate: Basic realm="jsonrpc" Fixes #7462. --- src/httprpc.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/httprpc.cpp b/src/httprpc.cpp index 98ac750bb..cdce110c5 100644 --- a/src/httprpc.cpp +++ b/src/httprpc.cpp @@ -13,6 +13,9 @@ #include // boost::trim +/** WWW-Authenticate to present with 401 Unauthorized response */ +static const char* WWW_AUTH_HEADER_DATA = "Basic realm=\"jsonrpc\""; + /** Simple one-shot callback timer to be used by the RPC mechanism to e.g. * re-lock the wellet. */ @@ -94,6 +97,7 @@ static bool HTTPReq_JSONRPC(HTTPRequest* req, const std::string &) // Check authorization std::pair authHeader = req->GetHeader("authorization"); if (!authHeader.first) { + req->WriteHeader("WWW-Authenticate", WWW_AUTH_HEADER_DATA); req->WriteReply(HTTP_UNAUTHORIZED); return false; } @@ -106,6 +110,7 @@ static bool HTTPReq_JSONRPC(HTTPRequest* req, const std::string &) shouldn't have their RPC port exposed. */ MilliSleep(250); + req->WriteHeader("WWW-Authenticate", WWW_AUTH_HEADER_DATA); req->WriteReply(HTTP_UNAUTHORIZED); return false; } From 52ca5aac5bc20b2b62154f8b25310b595615b4be Mon Sep 17 00:00:00 2001 From: Daira Hopwood Date: Fri, 14 Jul 2017 05:18:08 +0100 Subject: [PATCH 0150/1062] Change wording in Security Warnings section of README.md. Signed-off-by: Daira Hopwood --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 27aee7943..9a05f1ba8 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ Security Warnings See important security warnings in [doc/security-warnings.md](doc/security-warnings.md). -**Zcash is unfinished and highly experimental.** Use at your own risk. +**Zcash is experimental and a work-in-progress.** Use at your own risk. Deprecation Policy ------------------ From 9b5da42745431272120c00dd1a20d75707447e85 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 11 Jul 2017 18:03:10 -0700 Subject: [PATCH 0151/1062] Fixes #2480. Null entry in map was dereferenced leading to a segfault. --- src/wallet/asyncrpcoperation_sendmany.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/wallet/asyncrpcoperation_sendmany.cpp b/src/wallet/asyncrpcoperation_sendmany.cpp index ac4490197..901bd9e34 100644 --- a/src/wallet/asyncrpcoperation_sendmany.cpp +++ b/src/wallet/asyncrpcoperation_sendmany.cpp @@ -589,6 +589,10 @@ bool AsyncRPCOperation_sendmany::main_impl() { { LOCK2(cs_main, pwalletMain->cs_wallet); const CWalletTx& wtx = pwalletMain->mapWallet[jso.hash]; + // Zero confirmaton notes belong to transactions which have not yet been mined + if (mapBlockIndex.find(wtx.hashBlock) == mapBlockIndex.end()) { + throw JSONRPCError(RPC_WALLET_ERROR, strprintf("mapBlockIndex does not contain block hash %s", wtx.hashBlock.ToString())); + } wtxHeight = mapBlockIndex[wtx.hashBlock]->nHeight; wtxDepth = wtx.GetDepthInMainChain(); } From 6ff5a13497a1276fc03518bbdaa46a0bcf43a508 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Mon, 10 Jul 2017 11:08:36 -0500 Subject: [PATCH 0152/1062] Add Buildbot worker setup to Ansible playbook Currently assumes the host uses systemd --- .../templates/buildbot-worker.service.j2 | 17 +++++ contrib/ci-workers/templates/host.j2 | 4 ++ contrib/ci-workers/unix.yml | 68 +++++++++++++++++++ contrib/ci-workers/vars/buildbot.yml | 4 ++ 4 files changed, 93 insertions(+) create mode 100644 contrib/ci-workers/templates/buildbot-worker.service.j2 create mode 100644 contrib/ci-workers/templates/host.j2 create mode 100644 contrib/ci-workers/vars/buildbot.yml diff --git a/contrib/ci-workers/templates/buildbot-worker.service.j2 b/contrib/ci-workers/templates/buildbot-worker.service.j2 new file mode 100644 index 000000000..1fee26aa3 --- /dev/null +++ b/contrib/ci-workers/templates/buildbot-worker.service.j2 @@ -0,0 +1,17 @@ +[Unit] +Description=Buildbot worker +Wants=network.target +After=network.target + +[Service] +Type=forking +PIDFile=/home/{{ buildbot_worker_user }}/{{ buildbot_worker_name }}/twistd.pid +WorkingDirectory=/home/{{ buildbot_worker_user }} +ExecStart=/usr/local/bin/buildbot-worker start {{ buildbot_worker_name }} +ExecReload=/usr/local/bin/buildbot-worker restart {{ buildbot_worker_name }} +ExecStop=/usr/local/bin/buildbot-worker stop {{ buildbot_worker_name }} +Restart=always +User={{ buildbot_worker_user }} + +[Install] +WantedBy=multi-user.target diff --git a/contrib/ci-workers/templates/host.j2 b/contrib/ci-workers/templates/host.j2 new file mode 100644 index 000000000..708baf67b --- /dev/null +++ b/contrib/ci-workers/templates/host.j2 @@ -0,0 +1,4 @@ +OS: {{ ansible_distribution }} {{ ansible_distribution_version }} +Memory: {{ ansible_memtotal_mb }} MB +CPU: {{ ansible_processor[1] }} +{{ buildbot_worker_version.stdout }} diff --git a/contrib/ci-workers/unix.yml b/contrib/ci-workers/unix.yml index 6fd56a0a8..ecc826480 100644 --- a/contrib/ci-workers/unix.yml +++ b/contrib/ci-workers/unix.yml @@ -6,6 +6,17 @@ vars_files: - vars/default.yml + - vars/buildbot.yml + + vars_prompt: + - name: "buildbot_worker_admin" + prompt: "Admin details" + default: "Zcash " + - name: "buildbot_worker_name" + prompt: "Buildbot worker name (provided by ZECC)" + private: no + - name: "buildbot_worker_password" + prompt: "Buildbot worker password (provided by ZECC)" pre_tasks: - name: Install Python 2 for Ansible and Buildbot @@ -67,3 +78,60 @@ name: "{{ item }}" state: latest with_items: "{{ python_modules }}" + notify: restart buildbot-worker + + - name: Get installed Buildbot version + command: buildbot-worker --version + register: buildbot_worker_version + + - name: Set up the Buildbot worker user + user: + name: "{{ buildbot_worker_user }}" + comment: Buildbot worker + shell: /bin/bash + state: present + + - name: Create Buildbot worker + command: > + buildbot-worker create-worker ~/{{ buildbot_worker_name }} + {{ buildbot_master_host }}:{{ buildbot_master_port }} + {{ buildbot_worker_name|quote }} {{ buildbot_worker_password|quote }} + args: + creates: "~/{{ buildbot_worker_name }}/buildbot.tac" + become_user: "{{ buildbot_worker_user }}" + + - name: Set admin details for Buildbot worker + copy: + content: "{{ buildbot_worker_admin }}" + dest: "~/{{ buildbot_worker_name }}/info/admin" + become_user: "{{ buildbot_worker_user }}" + + - name: Set host details for Buildbot worker + template: + src: templates/host.j2 + dest: "~/{{ buildbot_worker_name }}/info/host" + become_user: "{{ buildbot_worker_user }}" + + - name: Copy Buildbot worker systemd service unit + template: + src: templates/buildbot-worker.service.j2 + dest: "/etc/systemd/system/buildbot-worker.service" + owner: root + group: root + mode: "0644" + notify: reload systemd + + - name: Start Buildbot worker. + service: + name: buildbot-worker + state: started + enabled: yes + + handlers: + - name: restart buildbot-worker + service: + name: buildbot-worker + state: restarted + + - name: reload systemd + command: /bin/systemctl daemon-reload diff --git a/contrib/ci-workers/vars/buildbot.yml b/contrib/ci-workers/vars/buildbot.yml new file mode 100644 index 000000000..3d21f400f --- /dev/null +++ b/contrib/ci-workers/vars/buildbot.yml @@ -0,0 +1,4 @@ +--- +buildbot_worker_user: zcbbworker +buildbot_master_host: dev-ci.z.cash +buildbot_master_port: 9899 From 64363d135108117528cce62444a1f3187567d2fc Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Mon, 10 Jul 2017 16:34:48 -0500 Subject: [PATCH 0153/1062] Add steps for setting up a latent worker on Amazon EC2 --- contrib/ci-workers/README.md | 44 ++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/contrib/ci-workers/README.md b/contrib/ci-workers/README.md index 72b832fcb..cc3c85ac2 100644 --- a/contrib/ci-workers/README.md +++ b/contrib/ci-workers/README.md @@ -2,3 +2,47 @@ This folder contains the Ansible playbooks for configuring a fresh OS installation for use as a Buildbot worker in Zcash's CI. + +# Setting up a latent worker on Amazon EC2 + +- Add a regular (non-latent) worker to the master.cfg for dev-ci.z.cash, and + deploy the changes. + - This enables the Ansible playbook to run to completion, ending in the worker + connecting to the master. + +- Start a basic EC2 instance using the template AMI for the target OS. + - Choose the smallest instance size, it won't be used for building Zcash. + +- Figure out which user to log into the instance with. + - E.g. for the Ubuntu template, use "ubuntu" instead of "root" + - If you get an Ansible error later with a message like "Failed to connect to + the host via ssh: Received message too long 1349281121\r\n", that means the + instance is sending a text string in response to the SSH connection, and the + Ansible protocol is balking. Try manually logging in with the same + credentials to diagnose. + +- Create `inventory/hosts` containing the following: + + [zcash-ci-worker-unix] + some-name ansible_host= ansible_ssh_user= + +- Run `ansible-playbook -i inventory/hosts unix.yml`, passing in the worker's + Buildbot name and password. + - After a successful run, the worker should be connected to dev-ci.z.cash and + visible in its worker list. + +- Create an AMI from the instance. This is the worker AMI to put into the + master.cfg for dev-ci.z.cash. + - 16 GB of storage should be sufficient. + +- SSH into the instance, and edit the worker config to connect to ci.z.cash. + +- Create an AMI from the instance. This is the worker AMI to put into the + master.cfg for ci.z.cash. + - 16 GB of storage should be sufficient. + +- Delete the instance (it is no longer needed). + +- Edit the master.cfg to turn the new worker into a latent (using the new AMI + IDs), add it to the appropriate worker groups, set up new builders etc. + - Deploy this via the normal PR review process. From 3ba809b6d71359938c7dc67995f7ed05cc3132c4 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 13 Jul 2017 17:40:19 -0500 Subject: [PATCH 0154/1062] Add pyblake2 to required Python modules See #2533 for details. --- contrib/ci-workers/vars/default.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/ci-workers/vars/default.yml b/contrib/ci-workers/vars/default.yml index 9aa79da5e..9afb8c55f 100644 --- a/contrib/ci-workers/vars/default.yml +++ b/contrib/ci-workers/vars/default.yml @@ -36,4 +36,5 @@ buildbot_modules: # Python modules required to run the Zcash RPC test suite rpc_test_modules: + - pyblake2 - pyzmq From 8247fd954c57de22ce0a89bc73a4c7ac9a616ac4 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 14 Jul 2017 10:02:14 -0500 Subject: [PATCH 0155/1062] Remove Buildbot version from host file Buildbot master already obtains and publishes this in the UI. --- contrib/ci-workers/templates/host.j2 | 1 - contrib/ci-workers/unix.yml | 4 ---- 2 files changed, 5 deletions(-) diff --git a/contrib/ci-workers/templates/host.j2 b/contrib/ci-workers/templates/host.j2 index 708baf67b..3a5abb0c2 100644 --- a/contrib/ci-workers/templates/host.j2 +++ b/contrib/ci-workers/templates/host.j2 @@ -1,4 +1,3 @@ OS: {{ ansible_distribution }} {{ ansible_distribution_version }} Memory: {{ ansible_memtotal_mb }} MB CPU: {{ ansible_processor[1] }} -{{ buildbot_worker_version.stdout }} diff --git a/contrib/ci-workers/unix.yml b/contrib/ci-workers/unix.yml index ecc826480..a33fac21e 100644 --- a/contrib/ci-workers/unix.yml +++ b/contrib/ci-workers/unix.yml @@ -80,10 +80,6 @@ with_items: "{{ python_modules }}" notify: restart buildbot-worker - - name: Get installed Buildbot version - command: buildbot-worker --version - register: buildbot_worker_version - - name: Set up the Buildbot worker user user: name: "{{ buildbot_worker_user }}" From e5f8e6185a50f9e164c9d929f2590ae884beb752 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 14 Jul 2017 12:24:01 -0500 Subject: [PATCH 0156/1062] Add a separate Buildbot host info template for EC2 Latent workers are not usually created on the instance type that will be used, so memory and CPU info collected at AMI creation will likely be inaccurate. --- contrib/ci-workers/README.md | 4 ++-- contrib/ci-workers/templates/host.ec2.j2 | 1 + contrib/ci-workers/unix.yml | 2 +- contrib/ci-workers/vars/buildbot.yml | 1 + 4 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 contrib/ci-workers/templates/host.ec2.j2 diff --git a/contrib/ci-workers/README.md b/contrib/ci-workers/README.md index cc3c85ac2..067c0cb5e 100644 --- a/contrib/ci-workers/README.md +++ b/contrib/ci-workers/README.md @@ -26,8 +26,8 @@ installation for use as a Buildbot worker in Zcash's CI. [zcash-ci-worker-unix] some-name ansible_host= ansible_ssh_user= -- Run `ansible-playbook -i inventory/hosts unix.yml`, passing in the worker's - Buildbot name and password. +- Run `ansible-playbook -e buildbot_worker_host_template=templates/host.ec2.j2 -i inventory/hosts unix.yml`, + passing in the worker's Buildbot name and password. - After a successful run, the worker should be connected to dev-ci.z.cash and visible in its worker list. diff --git a/contrib/ci-workers/templates/host.ec2.j2 b/contrib/ci-workers/templates/host.ec2.j2 new file mode 100644 index 000000000..dee692e02 --- /dev/null +++ b/contrib/ci-workers/templates/host.ec2.j2 @@ -0,0 +1 @@ +OS: {{ ansible_distribution }} {{ ansible_distribution_version }} diff --git a/contrib/ci-workers/unix.yml b/contrib/ci-workers/unix.yml index a33fac21e..42bcaafc2 100644 --- a/contrib/ci-workers/unix.yml +++ b/contrib/ci-workers/unix.yml @@ -104,7 +104,7 @@ - name: Set host details for Buildbot worker template: - src: templates/host.j2 + src: "{{ buildbot_worker_host_template }}" dest: "~/{{ buildbot_worker_name }}/info/host" become_user: "{{ buildbot_worker_user }}" diff --git a/contrib/ci-workers/vars/buildbot.yml b/contrib/ci-workers/vars/buildbot.yml index 3d21f400f..38e3fd25a 100644 --- a/contrib/ci-workers/vars/buildbot.yml +++ b/contrib/ci-workers/vars/buildbot.yml @@ -2,3 +2,4 @@ buildbot_worker_user: zcbbworker buildbot_master_host: dev-ci.z.cash buildbot_master_port: 9899 +buildbot_worker_host_template: templates/host.j2 From e0c696a1e7e09221ee20cb451ba13c6d5384d0b6 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 14 Jul 2017 12:25:15 -0500 Subject: [PATCH 0157/1062] Add pyflakes to required Python modules See #2494 for details. --- contrib/ci-workers/vars/default.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/ci-workers/vars/default.yml b/contrib/ci-workers/vars/default.yml index 9afb8c55f..13a04e7b4 100644 --- a/contrib/ci-workers/vars/default.yml +++ b/contrib/ci-workers/vars/default.yml @@ -33,6 +33,7 @@ dist_deps: [] buildbot_modules: - pip # Needs to be updated first so Buildbot installs - buildbot-worker + - pyflakes # Python modules required to run the Zcash RPC test suite rpc_test_modules: From 4272a1e2b1e19d66a196eea8cb9b1a2a50fba439 Mon Sep 17 00:00:00 2001 From: Bjorn Hjortsberg Date: Thu, 20 Jul 2017 13:27:37 +0200 Subject: [PATCH 0158/1062] Do not warn on built in declaration mismatch --- zcutil/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zcutil/build.sh b/zcutil/build.sh index 9d0194719..5e6b318f5 100755 --- a/zcutil/build.sh +++ b/zcutil/build.sh @@ -117,5 +117,5 @@ ld -v HOST="$HOST" BUILD="$BUILD" NO_RUST="$RUST_ARG" NO_PROTON="$PROTON_ARG" "$MAKE" "$@" -C ./depends/ V=1 ./autogen.sh -CC="$CC" CXX="$CXX" ./configure --prefix="${PREFIX}" --host="$HOST" --build="$BUILD" "$RUST_ARG" "$HARDENING_ARG" "$LCOV_ARG" "$TEST_ARG" "$MINING_ARG" "$PROTON_ARG" "$LIBS_ARG" CXXFLAGS='-fwrapv -fno-strict-aliasing -Werror -g' +CC="$CC" CXX="$CXX" ./configure --prefix="${PREFIX}" --host="$HOST" --build="$BUILD" "$RUST_ARG" "$HARDENING_ARG" "$LCOV_ARG" "$TEST_ARG" "$MINING_ARG" "$PROTON_ARG" "$LIBS_ARG" CXXFLAGS='-fwrapv -fno-strict-aliasing -Wno-builtin-declaration-mismatch -Werror -g' "$MAKE" "$@" V=1 From ecd04e914f2d34e905298a22c413eb4673132644 Mon Sep 17 00:00:00 2001 From: Bjorn Hjortsberg Date: Thu, 20 Jul 2017 13:58:39 +0200 Subject: [PATCH 0159/1062] Remove deprecated exception specification Warns on a newer compiler that these are deprecated in C++11 --- src/leveldbwrapper.cpp | 4 ++-- src/leveldbwrapper.h | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/leveldbwrapper.cpp b/src/leveldbwrapper.cpp index 26cacf95a..b5d024abb 100644 --- a/src/leveldbwrapper.cpp +++ b/src/leveldbwrapper.cpp @@ -13,7 +13,7 @@ #include #include -void HandleError(const leveldb::Status& status) throw(leveldb_error) +void HandleError(const leveldb::Status& status) { if (status.ok()) return; @@ -81,7 +81,7 @@ CLevelDBWrapper::~CLevelDBWrapper() options.env = NULL; } -bool CLevelDBWrapper::WriteBatch(CLevelDBBatch& batch, bool fSync) throw(leveldb_error) +bool CLevelDBWrapper::WriteBatch(CLevelDBBatch& batch, bool fSync) { leveldb::Status status = pdb->Write(fSync ? syncoptions : writeoptions, &batch.batch); HandleError(status); diff --git a/src/leveldbwrapper.h b/src/leveldbwrapper.h index c65e84270..639f736a5 100644 --- a/src/leveldbwrapper.h +++ b/src/leveldbwrapper.h @@ -22,7 +22,7 @@ public: leveldb_error(const std::string& msg) : std::runtime_error(msg) {} }; -void HandleError(const leveldb::Status& status) throw(leveldb_error); +void HandleError(const leveldb::Status& status); /** Batch of changes queued to be written to a CLevelDBWrapper */ class CLevelDBBatch @@ -90,7 +90,7 @@ public: ~CLevelDBWrapper(); template - bool Read(const K& key, V& value) const throw(leveldb_error) + bool Read(const K& key, V& value) const { CDataStream ssKey(SER_DISK, CLIENT_VERSION); ssKey.reserve(ssKey.GetSerializeSize(key)); @@ -115,7 +115,7 @@ public: } template - bool Write(const K& key, const V& value, bool fSync = false) throw(leveldb_error) + bool Write(const K& key, const V& value, bool fSync = false) { CLevelDBBatch batch; batch.Write(key, value); @@ -123,7 +123,7 @@ public: } template - bool Exists(const K& key) const throw(leveldb_error) + bool Exists(const K& key) const { CDataStream ssKey(SER_DISK, CLIENT_VERSION); ssKey.reserve(ssKey.GetSerializeSize(key)); @@ -142,14 +142,14 @@ public: } template - bool Erase(const K& key, bool fSync = false) throw(leveldb_error) + bool Erase(const K& key, bool fSync = false) { CLevelDBBatch batch; batch.Erase(key); return WriteBatch(batch, fSync); } - bool WriteBatch(CLevelDBBatch& batch, bool fSync = false) throw(leveldb_error); + bool WriteBatch(CLevelDBBatch& batch, bool fSync = false); // not available for LevelDB; provide for compatibility with BDB bool Flush() @@ -157,7 +157,7 @@ public: return true; } - bool Sync() throw(leveldb_error) + bool Sync() { CLevelDBBatch batch; return WriteBatch(batch, true); From 75401530d7a4f24810dee8e0dc1e1c08b7657ba4 Mon Sep 17 00:00:00 2001 From: Daira Hopwood Date: Tue, 25 Jul 2017 21:27:16 +0100 Subject: [PATCH 0160/1062] Document our criteria for adding CI workers. closes #2499 Author: Nathan Wilcox Author: Daira Hopwood Signed-off-by: Daira Hopwood --- contrib/ci-workers/README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/contrib/ci-workers/README.md b/contrib/ci-workers/README.md index 067c0cb5e..37f7ad833 100644 --- a/contrib/ci-workers/README.md +++ b/contrib/ci-workers/README.md @@ -3,6 +3,20 @@ This folder contains the Ansible playbooks for configuring a fresh OS installation for use as a Buildbot worker in Zcash's CI. +# Criteria for Adding Workers + +a. Don't add workers until users complain about a problem on a platform + that doesn't yet have workers or if we anticipate many users will use + a platform, we may pre-emptively add an unsupported worker for it. + +b. Prioritize the platforms that seem to have the most users. + +c. When adding workers start by adding workers for the "most common" + variant of any distro, then if users later encounter problems with a + sub-variant, we can consider adding new workers at that point. + Example: add Ubuntu Desktop before Xubuntu, on the assumption the + former has a larger population base. + # Setting up a latent worker on Amazon EC2 - Add a regular (non-latent) worker to the master.cfg for dev-ci.z.cash, and From 047aec1e0eafd0e5f9a80d841afd309730d8d4f8 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Mon, 26 Jun 2017 16:16:08 -0700 Subject: [PATCH 0161/1062] Add block download progress to metrics UI --- src/gtest/test_metrics.cpp | 25 +++++++++++++++++++++++++ src/metrics.cpp | 35 ++++++++++++++++++++++++++++++++++- src/metrics.h | 3 +++ 3 files changed, 62 insertions(+), 1 deletion(-) diff --git a/src/gtest/test_metrics.cpp b/src/gtest/test_metrics.cpp index c199b323e..8e0aa9e02 100644 --- a/src/gtest/test_metrics.cpp +++ b/src/gtest/test_metrics.cpp @@ -92,3 +92,28 @@ TEST(Metrics, GetLocalSolPS) { SetMockTime(104); EXPECT_EQ(1, GetLocalSolPS()); } + +TEST(Metrics, EstimateNetHeightInner) { + // Ensure that the (rounded) current height is returned if the tip is current + SetMockTime(15000); + EXPECT_EQ(100, EstimateNetHeightInner(100, 14250, 50, 7500, 150)); + SetMockTime(15150); + EXPECT_EQ(100, EstimateNetHeightInner(101, 14400, 50, 7500, 150)); + + // Ensure that correct estimates are returned if the tip is in the past + SetMockTime(15300); // Tip is 2 blocks behind + EXPECT_EQ(100, EstimateNetHeightInner(100, 14250, 50, 7500, 150)); + SetMockTime(15900); // Tip is 6 blocks behind + EXPECT_EQ(110, EstimateNetHeightInner(100, 14250, 50, 7500, 150)); + + // More complex calculations: + SetMockTime(20000); + // - Checkpoint spacing: 200 + // -> Average spacing: 175 + // -> estimated height: 127 -> 130 + EXPECT_EQ(130, EstimateNetHeightInner(100, 14250, 50, 5250, 150)); + // - Checkpoint spacing: 50 + // -> Average spacing: 100 + // -> estimated height: 153 -> 150 + EXPECT_EQ(150, EstimateNetHeightInner(100, 14250, 50, 12000, 150)); +} diff --git a/src/metrics.cpp b/src/metrics.cpp index af8052049..b10e94630 100644 --- a/src/metrics.cpp +++ b/src/metrics.cpp @@ -5,6 +5,7 @@ #include "metrics.h" #include "chainparams.h" +#include "checkpoints.h" #include "main.h" #include "ui_interface.h" #include "util.h" @@ -103,6 +104,30 @@ double GetLocalSolPS() return miningTimer.rate(solutionTargetChecks); } +int EstimateNetHeightInner(int height, int64_t tipmediantime, + int heightLastCheckpoint, int64_t timeLastCheckpoint, + int64_t targetSpacing) +{ + // We average the target spacing with the observed spacing to the last + // checkpoint, and use that to estimate the current network height. + int medianHeight = height - CBlockIndex::nMedianTimeSpan / 2; + double checkpointSpacing = (double (tipmediantime - timeLastCheckpoint)) / (medianHeight - heightLastCheckpoint); + double averageSpacing = (targetSpacing + checkpointSpacing) / 2; + int netheight = medianHeight + ((GetTime() - tipmediantime) / averageSpacing); + // Round to nearest ten to reduce noise + return ((netheight + 5) / 10) * 10; +} + +int EstimateNetHeight(int height, int64_t tipmediantime, CChainParams chainParams) +{ + auto checkpointData = chainParams.Checkpoints(); + return EstimateNetHeightInner( + height, tipmediantime, + Checkpoints::GetTotalBlocksEstimate(checkpointData), + checkpointData.nTimeLastCheckpoint, + chainParams.GetConsensus().nPowTargetSpacing); +} + void TriggerRefresh() { *nNextRefresh = GetTime(); @@ -169,17 +194,25 @@ int printStats(bool mining) int lines = 4; int height; + int64_t tipmediantime; size_t connections; int64_t netsolps; { LOCK2(cs_main, cs_vNodes); height = chainActive.Height(); + tipmediantime = chainActive.Tip()->GetMedianTimePast(); connections = vNodes.size(); netsolps = GetNetworkHashPS(120, -1); } auto localsolps = GetLocalSolPS(); - std::cout << " " << _("Block height") << " | " << height << std::endl; + if (IsInitialBlockDownload()) { + int netheight = EstimateNetHeight(height, tipmediantime, Params()); + int downloadPercent = height * 100 / netheight; + std::cout << " " << _("Downloading blocks") << " | " << height << " / ~" << netheight << " (" << downloadPercent << "%)" << std::endl; + } else { + std::cout << " " << _("Block height") << " | " << height << std::endl; + } std::cout << " " << _("Connections") << " | " << connections << std::endl; std::cout << " " << _("Network solution rate") << " | " << netsolps << " Sol/s" << std::endl; if (mining && miningTimer.running()) { diff --git a/src/metrics.h b/src/metrics.h index 701306a4a..7f7efdea6 100644 --- a/src/metrics.h +++ b/src/metrics.h @@ -63,6 +63,9 @@ void TrackMinedBlock(uint256 hash); void MarkStartTime(); double GetLocalSolPS(); +int EstimateNetHeightInner(int height, int64_t tipmediantime, + int heightLastCheckpoint, int64_t timeLastCheckpoint, + int64_t targetSpacing); void TriggerRefresh(); From 4a651837be5840e3f023a03a9a91c6537009153b Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 28 Jul 2017 10:35:46 +0000 Subject: [PATCH 0162/1062] Correct and extend EstimateNetHeightInner tests Corrections are to the median block times, which were generated by subtracting CBlockIndex::nMedianTimeSpan / 2 from the block height and then multiplying by the target spacing. GetMedianTimePast() takes an array sorted by std::sort() and returns element CBlockIndex::nMedianTimeSpan / 2, meaning that if CBlockIndex::nMedianTimeSpan is odd (which it is), there is an out-by-one error in the subtraction. --- src/gtest/test_metrics.cpp | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/gtest/test_metrics.cpp b/src/gtest/test_metrics.cpp index 8e0aa9e02..8f313b5d2 100644 --- a/src/gtest/test_metrics.cpp +++ b/src/gtest/test_metrics.cpp @@ -96,24 +96,40 @@ TEST(Metrics, GetLocalSolPS) { TEST(Metrics, EstimateNetHeightInner) { // Ensure that the (rounded) current height is returned if the tip is current SetMockTime(15000); - EXPECT_EQ(100, EstimateNetHeightInner(100, 14250, 50, 7500, 150)); + EXPECT_EQ(100, EstimateNetHeightInner(100, 14100, 50, 7500, 150)); SetMockTime(15150); - EXPECT_EQ(100, EstimateNetHeightInner(101, 14400, 50, 7500, 150)); + EXPECT_EQ(100, EstimateNetHeightInner(101, 14250, 50, 7500, 150)); // Ensure that correct estimates are returned if the tip is in the past SetMockTime(15300); // Tip is 2 blocks behind - EXPECT_EQ(100, EstimateNetHeightInner(100, 14250, 50, 7500, 150)); + EXPECT_EQ(100, EstimateNetHeightInner(100, 14100, 50, 7500, 150)); SetMockTime(15900); // Tip is 6 blocks behind - EXPECT_EQ(110, EstimateNetHeightInner(100, 14250, 50, 7500, 150)); + EXPECT_EQ(110, EstimateNetHeightInner(100, 14100, 50, 7500, 150)); + + // Check estimates during resync + SetMockTime(15000); + EXPECT_EQ(100, EstimateNetHeightInner( 0, 0, 50, 7500, 150)); + EXPECT_EQ(100, EstimateNetHeightInner( 7, 600, 50, 7500, 150)); + EXPECT_EQ(100, EstimateNetHeightInner( 8, 600, 50, 7500, 150)); + EXPECT_EQ(100, EstimateNetHeightInner(10, 750, 50, 7500, 150)); + EXPECT_EQ(100, EstimateNetHeightInner(11, 900, 50, 7500, 150)); + EXPECT_EQ(100, EstimateNetHeightInner(20, 2100, 50, 7500, 150)); + EXPECT_EQ(100, EstimateNetHeightInner(49, 6450, 50, 7500, 150)); + EXPECT_EQ(100, EstimateNetHeightInner(50, 6600, 50, 7500, 150)); + EXPECT_EQ(100, EstimateNetHeightInner(51, 6750, 50, 7500, 150)); + EXPECT_EQ(100, EstimateNetHeightInner(55, 7350, 50, 7500, 150)); + EXPECT_EQ(100, EstimateNetHeightInner(56, 7500, 50, 7500, 150)); + EXPECT_EQ(100, EstimateNetHeightInner(57, 7650, 50, 7500, 150)); + EXPECT_EQ(100, EstimateNetHeightInner(75, 10350, 50, 7500, 150)); // More complex calculations: SetMockTime(20000); // - Checkpoint spacing: 200 // -> Average spacing: 175 // -> estimated height: 127 -> 130 - EXPECT_EQ(130, EstimateNetHeightInner(100, 14250, 50, 5250, 150)); + EXPECT_EQ(130, EstimateNetHeightInner(100, 14100, 50, 5250, 150)); // - Checkpoint spacing: 50 // -> Average spacing: 100 // -> estimated height: 153 -> 150 - EXPECT_EQ(150, EstimateNetHeightInner(100, 14250, 50, 12000, 150)); + EXPECT_EQ(150, EstimateNetHeightInner(100, 14100, 50, 12000, 150)); } From 92bfde0edf5537576121c20ad8e5466fd9fa1e98 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 28 Jul 2017 10:50:07 +0000 Subject: [PATCH 0163/1062] Improve network height estimation --- src/gtest/test_metrics.cpp | 38 +++++++++++++++++++------------------- src/metrics.cpp | 14 ++++++++++---- src/metrics.h | 2 +- 3 files changed, 30 insertions(+), 24 deletions(-) diff --git a/src/gtest/test_metrics.cpp b/src/gtest/test_metrics.cpp index 8f313b5d2..143fe46d6 100644 --- a/src/gtest/test_metrics.cpp +++ b/src/gtest/test_metrics.cpp @@ -96,40 +96,40 @@ TEST(Metrics, GetLocalSolPS) { TEST(Metrics, EstimateNetHeightInner) { // Ensure that the (rounded) current height is returned if the tip is current SetMockTime(15000); - EXPECT_EQ(100, EstimateNetHeightInner(100, 14100, 50, 7500, 150)); + EXPECT_EQ(100, EstimateNetHeightInner(100, 14100, 50, 7500, 0, 150)); SetMockTime(15150); - EXPECT_EQ(100, EstimateNetHeightInner(101, 14250, 50, 7500, 150)); + EXPECT_EQ(100, EstimateNetHeightInner(101, 14250, 50, 7500, 0, 150)); // Ensure that correct estimates are returned if the tip is in the past SetMockTime(15300); // Tip is 2 blocks behind - EXPECT_EQ(100, EstimateNetHeightInner(100, 14100, 50, 7500, 150)); + EXPECT_EQ(100, EstimateNetHeightInner(100, 14100, 50, 7500, 0, 150)); SetMockTime(15900); // Tip is 6 blocks behind - EXPECT_EQ(110, EstimateNetHeightInner(100, 14100, 50, 7500, 150)); + EXPECT_EQ(110, EstimateNetHeightInner(100, 14100, 50, 7500, 0, 150)); // Check estimates during resync SetMockTime(15000); - EXPECT_EQ(100, EstimateNetHeightInner( 0, 0, 50, 7500, 150)); - EXPECT_EQ(100, EstimateNetHeightInner( 7, 600, 50, 7500, 150)); - EXPECT_EQ(100, EstimateNetHeightInner( 8, 600, 50, 7500, 150)); - EXPECT_EQ(100, EstimateNetHeightInner(10, 750, 50, 7500, 150)); - EXPECT_EQ(100, EstimateNetHeightInner(11, 900, 50, 7500, 150)); - EXPECT_EQ(100, EstimateNetHeightInner(20, 2100, 50, 7500, 150)); - EXPECT_EQ(100, EstimateNetHeightInner(49, 6450, 50, 7500, 150)); - EXPECT_EQ(100, EstimateNetHeightInner(50, 6600, 50, 7500, 150)); - EXPECT_EQ(100, EstimateNetHeightInner(51, 6750, 50, 7500, 150)); - EXPECT_EQ(100, EstimateNetHeightInner(55, 7350, 50, 7500, 150)); - EXPECT_EQ(100, EstimateNetHeightInner(56, 7500, 50, 7500, 150)); - EXPECT_EQ(100, EstimateNetHeightInner(57, 7650, 50, 7500, 150)); - EXPECT_EQ(100, EstimateNetHeightInner(75, 10350, 50, 7500, 150)); + EXPECT_EQ(100, EstimateNetHeightInner( 0, 0, 50, 7500, 0, 150)); + EXPECT_EQ(100, EstimateNetHeightInner( 7, 600, 50, 7500, 0, 150)); + EXPECT_EQ(100, EstimateNetHeightInner( 8, 600, 50, 7500, 0, 150)); + EXPECT_EQ(100, EstimateNetHeightInner(10, 750, 50, 7500, 0, 150)); + EXPECT_EQ(100, EstimateNetHeightInner(11, 900, 50, 7500, 0, 150)); + EXPECT_EQ(100, EstimateNetHeightInner(20, 2100, 50, 7500, 0, 150)); + EXPECT_EQ(100, EstimateNetHeightInner(49, 6450, 50, 7500, 0, 150)); + EXPECT_EQ(100, EstimateNetHeightInner(50, 6600, 50, 7500, 0, 150)); + EXPECT_EQ(100, EstimateNetHeightInner(51, 6750, 50, 7500, 0, 150)); + EXPECT_EQ(100, EstimateNetHeightInner(55, 7350, 50, 7500, 0, 150)); + EXPECT_EQ(100, EstimateNetHeightInner(56, 7500, 50, 7500, 0, 150)); + EXPECT_EQ(100, EstimateNetHeightInner(57, 7650, 50, 7500, 0, 150)); + EXPECT_EQ(100, EstimateNetHeightInner(75, 10350, 50, 7500, 0, 150)); // More complex calculations: SetMockTime(20000); // - Checkpoint spacing: 200 // -> Average spacing: 175 // -> estimated height: 127 -> 130 - EXPECT_EQ(130, EstimateNetHeightInner(100, 14100, 50, 5250, 150)); + EXPECT_EQ(130, EstimateNetHeightInner(100, 14100, 50, 5250, 0, 150)); // - Checkpoint spacing: 50 // -> Average spacing: 100 // -> estimated height: 153 -> 150 - EXPECT_EQ(150, EstimateNetHeightInner(100, 14100, 50, 12000, 150)); + EXPECT_EQ(150, EstimateNetHeightInner(100, 14100, 50, 12000, 0, 150)); } diff --git a/src/metrics.cpp b/src/metrics.cpp index b10e94630..1bac2c9c0 100644 --- a/src/metrics.cpp +++ b/src/metrics.cpp @@ -106,12 +106,17 @@ double GetLocalSolPS() int EstimateNetHeightInner(int height, int64_t tipmediantime, int heightLastCheckpoint, int64_t timeLastCheckpoint, - int64_t targetSpacing) + int64_t genesisTime, int64_t targetSpacing) { // We average the target spacing with the observed spacing to the last - // checkpoint, and use that to estimate the current network height. - int medianHeight = height - CBlockIndex::nMedianTimeSpan / 2; - double checkpointSpacing = (double (tipmediantime - timeLastCheckpoint)) / (medianHeight - heightLastCheckpoint); + // checkpoint (either from below or above depending on the current height), + // and use that to estimate the current network height. + int medianHeight = height > CBlockIndex::nMedianTimeSpan ? + height - (1 + ((CBlockIndex::nMedianTimeSpan - 1) / 2)) : + height / 2; + double checkpointSpacing = medianHeight > heightLastCheckpoint ? + (double (tipmediantime - timeLastCheckpoint)) / (medianHeight - heightLastCheckpoint) : + (double (timeLastCheckpoint - genesisTime)) / heightLastCheckpoint; double averageSpacing = (targetSpacing + checkpointSpacing) / 2; int netheight = medianHeight + ((GetTime() - tipmediantime) / averageSpacing); // Round to nearest ten to reduce noise @@ -125,6 +130,7 @@ int EstimateNetHeight(int height, int64_t tipmediantime, CChainParams chainParam height, tipmediantime, Checkpoints::GetTotalBlocksEstimate(checkpointData), checkpointData.nTimeLastCheckpoint, + chainParams.GenesisBlock().nTime, chainParams.GetConsensus().nPowTargetSpacing); } diff --git a/src/metrics.h b/src/metrics.h index 7f7efdea6..2d60d30ca 100644 --- a/src/metrics.h +++ b/src/metrics.h @@ -65,7 +65,7 @@ void MarkStartTime(); double GetLocalSolPS(); int EstimateNetHeightInner(int height, int64_t tipmediantime, int heightLastCheckpoint, int64_t timeLastCheckpoint, - int64_t targetSpacing); + int64_t genesisTime, int64_t targetSpacing); void TriggerRefresh(); From 8ebb299d40e49c82226200243d2772ffa9994ddc Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 1 Aug 2017 12:35:58 +0100 Subject: [PATCH 0164/1062] ci-workers: Enable pipelining, and use root to set admin and host details Workarounds for Ansible issues when becoming an unprivileged user: https://docs.ansible.com/ansible/become.html#becoming-an-unprivileged-user --- contrib/ci-workers/ansible.cfg | 2 ++ contrib/ci-workers/unix.yml | 12 ++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 contrib/ci-workers/ansible.cfg diff --git a/contrib/ci-workers/ansible.cfg b/contrib/ci-workers/ansible.cfg new file mode 100644 index 000000000..c58fea3c0 --- /dev/null +++ b/contrib/ci-workers/ansible.cfg @@ -0,0 +1,2 @@ +[ssh_connection] +pipelining = True diff --git a/contrib/ci-workers/unix.yml b/contrib/ci-workers/unix.yml index 42bcaafc2..ad78f7914 100644 --- a/contrib/ci-workers/unix.yml +++ b/contrib/ci-workers/unix.yml @@ -99,14 +99,18 @@ - name: Set admin details for Buildbot worker copy: content: "{{ buildbot_worker_admin }}" - dest: "~/{{ buildbot_worker_name }}/info/admin" - become_user: "{{ buildbot_worker_user }}" + dest: "~{{ buildbot_worker_user }}/{{ buildbot_worker_name }}/info/admin" + owner: "{{ buildbot_worker_user }}" + group: "{{ buildbot_worker_user }}" + mode: "0644" - name: Set host details for Buildbot worker template: src: "{{ buildbot_worker_host_template }}" - dest: "~/{{ buildbot_worker_name }}/info/host" - become_user: "{{ buildbot_worker_user }}" + dest: "~{{ buildbot_worker_user }}/{{ buildbot_worker_name }}/info/host" + owner: "{{ buildbot_worker_user }}" + group: "{{ buildbot_worker_user }}" + mode: "0644" - name: Copy Buildbot worker systemd service unit template: From fcf824e9f10e3a8dd34b4431d1a8686a5fb402f1 Mon Sep 17 00:00:00 2001 From: Ariel Gabizon Date: Tue, 1 Aug 2017 17:11:57 +0200 Subject: [PATCH 0165/1062] make-release.py: Versioning changes for 1.0.11-rc1. --- README.md | 2 +- configure.ac | 4 ++-- contrib/gitian-descriptors/gitian-linux.yml | 2 +- src/clientversion.h | 4 ++-- src/deprecation.h | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 9a05f1ba8..ca448c7c7 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Zcash 1.0.10-1 +Zcash 1.0.11-rc1 ============= What is Zcash? diff --git a/configure.ac b/configure.ac index 36a2059a4..129ddcde5 100644 --- a/configure.ac +++ b/configure.ac @@ -2,8 +2,8 @@ dnl require autoconf 2.60 (AS_ECHO/AS_ECHO_N) AC_PREREQ([2.60]) define(_CLIENT_VERSION_MAJOR, 1) define(_CLIENT_VERSION_MINOR, 0) -define(_CLIENT_VERSION_REVISION, 10) -define(_CLIENT_VERSION_BUILD, 51) +define(_CLIENT_VERSION_REVISION, 11) +define(_CLIENT_VERSION_BUILD, 25) define(_ZC_BUILD_VAL, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, m4_incr(_CLIENT_VERSION_BUILD), m4_eval(_CLIENT_VERSION_BUILD < 50), 1, m4_eval(_CLIENT_VERSION_BUILD - 24), m4_eval(_CLIENT_VERSION_BUILD == 50), 1, , m4_eval(_CLIENT_VERSION_BUILD - 50))) define(_CLIENT_VERSION_SUFFIX, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, _CLIENT_VERSION_REVISION-beta$1, m4_eval(_CLIENT_VERSION_BUILD < 50), 1, _CLIENT_VERSION_REVISION-rc$1, m4_eval(_CLIENT_VERSION_BUILD == 50), 1, _CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION-$1))) define(_CLIENT_VERSION_IS_RELEASE, true) diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml index cc3dcd701..9851ba791 100644 --- a/contrib/gitian-descriptors/gitian-linux.yml +++ b/contrib/gitian-descriptors/gitian-linux.yml @@ -1,5 +1,5 @@ --- -name: "zcash-1.0.10-1" +name: "zcash-1.0.11-rc1" enable_cache: true distro: "debian" suites: diff --git a/src/clientversion.h b/src/clientversion.h index f2bc38e4d..483264a15 100644 --- a/src/clientversion.h +++ b/src/clientversion.h @@ -17,8 +17,8 @@ //! These need to be macros, as clientversion.cpp's and bitcoin*-res.rc's voodoo requires it #define CLIENT_VERSION_MAJOR 1 #define CLIENT_VERSION_MINOR 0 -#define CLIENT_VERSION_REVISION 10 -#define CLIENT_VERSION_BUILD 51 +#define CLIENT_VERSION_REVISION 11 +#define CLIENT_VERSION_BUILD 25 //! Set to true for release, false for prerelease or test build #define CLIENT_VERSION_IS_RELEASE true diff --git a/src/deprecation.h b/src/deprecation.h index bfc70e72c..685b21f3e 100644 --- a/src/deprecation.h +++ b/src/deprecation.h @@ -6,7 +6,7 @@ #define ZCASH_DEPRECATION_H // Deprecation policy is 4th third-Tuesday after a release -static const int APPROX_RELEASE_HEIGHT = 137236; +static const int APPROX_RELEASE_HEIGHT = 159000; static const int WEEKS_UNTIL_DEPRECATION = 18; static const int DEPRECATION_HEIGHT = APPROX_RELEASE_HEIGHT + (WEEKS_UNTIL_DEPRECATION * 7 * 24 * 24); From dc5d6d5f5df1539f548634ff2e04416c2fb6ac29 Mon Sep 17 00:00:00 2001 From: Ariel Gabizon Date: Tue, 1 Aug 2017 17:12:50 +0200 Subject: [PATCH 0166/1062] make-release.py: Updated manpages for 1.0.11-rc1. --- doc/man/zcash-cli.1 | 6 +++--- doc/man/zcash-tx.1 | 6 +++--- doc/man/zcashd.1 | 10 +++++----- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/doc/man/zcash-cli.1 b/doc/man/zcash-cli.1 index 137e305a5..3f08ec685 100644 --- a/doc/man/zcash-cli.1 +++ b/doc/man/zcash-cli.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASH-CLI "1" "June 2017" "zcash-cli v1.0.10-1" "User Commands" +.TH ZCASH-CLI "1" "August 2017" "zcash-cli v1.0.11-rc1" "User Commands" .SH NAME -zcash-cli \- manual page for zcash-cli v1.0.10-1 +zcash-cli \- manual page for zcash-cli v1.0.11-rc1 .SH DESCRIPTION -Zcash RPC client version v1.0.10\-1 +Zcash RPC client version v1.0.11\-rc1 .PP In order to ensure you are adequately protecting your privacy when using Zcash, please see . diff --git a/doc/man/zcash-tx.1 b/doc/man/zcash-tx.1 index 4d8b929a4..425ec47e0 100644 --- a/doc/man/zcash-tx.1 +++ b/doc/man/zcash-tx.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASH-TX "1" "June 2017" "zcash-tx v1.0.10-1" "User Commands" +.TH ZCASH-TX "1" "August 2017" "zcash-tx v1.0.11-rc1" "User Commands" .SH NAME -zcash-tx \- manual page for zcash-tx v1.0.10-1 +zcash-tx \- manual page for zcash-tx v1.0.11-rc1 .SH DESCRIPTION -Zcash zcash\-tx utility version v1.0.10\-1 +Zcash zcash\-tx utility version v1.0.11\-rc1 .SS "Usage:" .TP zcash\-tx [options] [commands] diff --git a/doc/man/zcashd.1 b/doc/man/zcashd.1 index c813b8426..10c8905a6 100644 --- a/doc/man/zcashd.1 +++ b/doc/man/zcashd.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASHD "1" "June 2017" "zcashd v1.0.10-1" "User Commands" +.TH ZCASHD "1" "August 2017" "zcashd v1.0.11-rc1" "User Commands" .SH NAME -zcashd \- manual page for zcashd v1.0.10-1 +zcashd \- manual page for zcashd v1.0.11-rc1 .SH DESCRIPTION -Zcash Daemon version v1.0.10\-1 +Zcash Daemon version v1.0.11\-rc1 .PP In order to ensure you are adequately protecting your privacy when using Zcash, please see . @@ -54,7 +54,7 @@ Specify data directory \fB\-disabledeprecation=\fR .IP Disable block\-height node deprecation and automatic shutdown (example: -\fB\-disabledeprecation\fR=\fI\,1\/\fR.0.10\-1) +\fB\-disabledeprecation\fR=\fI\,1\/\fR.0.11\-rc1) .HP \fB\-exportdir=\fR .IP @@ -79,7 +79,7 @@ mempool will accept (default: 0 = no limit applied) .HP \fB\-par=\fR .IP -Set the number of script verification threads (\fB\-4\fR to 16, 0 = auto, <0 = +Set the number of script verification threads (\fB\-2\fR to 16, 0 = auto, <0 = leave that many cores free, default: 0) .HP \fB\-pid=\fR From 1ea4df6826119a72057c69e56e54b33ab470cc09 Mon Sep 17 00:00:00 2001 From: Ariel Gabizon Date: Tue, 1 Aug 2017 17:12:52 +0200 Subject: [PATCH 0167/1062] make-release.py: Updated release notes and changelog for 1.0.11-rc1. --- contrib/debian/changelog | 6 +++ doc/authors.md | 10 +++-- doc/release-notes/release-notes-1.0.11-rc1.md | 44 +++++++++++++++++++ 3 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 doc/release-notes/release-notes-1.0.11-rc1.md diff --git a/contrib/debian/changelog b/contrib/debian/changelog index e2cbaab82..96675ed7b 100644 --- a/contrib/debian/changelog +++ b/contrib/debian/changelog @@ -1,3 +1,9 @@ +zcash (1.0.11~rc1) stable; urgency=medium + + * 1.0.11-rc1 release. + + -- Zcash Company Tue, 01 Aug 2017 17:12:52 +0200 + zcash (1.0.10+1) stable; urgency=medium * 1.0.10-1 release. diff --git a/doc/authors.md b/doc/authors.md index b1e6c924d..9c62b43d0 100644 --- a/doc/authors.md +++ b/doc/authors.md @@ -1,12 +1,12 @@ Zcash Contributors ================== -Jack Grigg (428) -Simon Liu (266) +Jack Grigg (443) +Simon Liu (269) Sean Bowe (188) -Daira Hopwood (95) +Daira Hopwood (102) Taylor Hornby (65) -Wladimir J. van der Laan (60) +Wladimir J. van der Laan (61) Nathan Wilcox (51) Jay Graber (49) Jonas Schnelli (48) @@ -42,9 +42,11 @@ Joe Turgeon (2) Jack Gavigan (2) ITH4Coinomia (2) Gavin Andresen (2) +Ariel Gabizon (2) Amgad Abdelhafez (2) zathras-crypto (1) unsystemizer (1) +practicalswift (1) mruddy (1) mrbandrews (1) kazcw (1) diff --git a/doc/release-notes/release-notes-1.0.11-rc1.md b/doc/release-notes/release-notes-1.0.11-rc1.md new file mode 100644 index 000000000..4542a448c --- /dev/null +++ b/doc/release-notes/release-notes-1.0.11-rc1.md @@ -0,0 +1,44 @@ +Changelog +========= + +Ariel Gabizon (2): + make-release.py: Versioning changes for 1.0.11-rc1. + make-release.py: Updated manpages for 1.0.11-rc1. + +Daira Hopwood (7): + Clean up imports to be pyflakes-checkable. fixes #2450 + For unused variables reported by pyflakes, either remove the variable, suppress the warning, or fix a bug (if the wrong variable was used). refs #2450 + Cosmetics (trailing whitespace, comment conventions, etc.) + Alert 1004 (version 1.0.10 only) + Remove UPnP support. fixes #2500 + Change wording in Security Warnings section of README.md. + Document our criteria for adding CI workers. closes #2499 + +Jack Grigg (15): + Pull in temporary release notes during the release process + Ansible playbook for installing Zcash dependencies and Buildbot worker + Variable overrides for Debian, Ubuntu and Fedora + Variable overrides for FreeBSD + Simplify Python installation, inform user if they need to manually configure + Add test for issue #2444 + Add Buildbot worker setup to Ansible playbook + Add steps for setting up a latent worker on Amazon EC2 + Add pyblake2 to required Python modules + Remove Buildbot version from host file + Add a separate Buildbot host info template for EC2 + Add pyflakes to required Python modules + Add block download progress to metrics UI + Correct and extend EstimateNetHeightInner tests + Improve network height estimation + +Simon Liu (3): + Closes #2446 by adding generated field to listunspent. + Fixes #2519. When sending from a zaddr, minconf cannot be zero. + Fixes #2480. Null entry in map was dereferenced leading to a segfault. + +Wladimir J. van der Laan (1): + rpc: Add WWW-Authenticate header to 401 response + +practicalswift (1): + Net: Fix resource leak in ReadBinaryFile(...) + From c0fe29370a259dd3616226a4b6d27dbe8fd7a6e1 Mon Sep 17 00:00:00 2001 From: "Wladimir J. van der Laan" Date: Thu, 24 Sep 2015 17:29:22 +0200 Subject: [PATCH 0168/1062] Make HTTP server shutdown more graceful Shutting down the HTTP server currently breaks off all current requests. This can create a race condition with RPC `stop` command, where the calling process never receives confirmation. This change removes the listening sockets on shutdown so that no new requests can come in, but no longer breaks off requests in progress. Meant to fix bitcoin/#6717. Zcash: cherry-picked from commit 5e0c22135600fe36811da3b78216efc61ba765fb --- src/httpserver.cpp | 27 +++++++++++++++++++++------ src/rpcserver.cpp | 3 ++- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/httpserver.cpp b/src/httpserver.cpp index 4215a0f26..8acce2f0f 100644 --- a/src/httpserver.cpp +++ b/src/httpserver.cpp @@ -155,6 +155,8 @@ static std::vector rpc_allow_subnets; static WorkQueue* workQueue = 0; //! Handlers for (sub)paths std::vector pathHandlers; +//! Bound listening sockets +std::vector boundSockets; /** Check if a network address is allowed to access the HTTP server */ static bool ClientAllowed(const CNetAddr& netaddr) @@ -264,6 +266,13 @@ static void http_request_cb(struct evhttp_request* req, void* arg) } } +/** Callback to reject HTTP requests after shutdown. */ +static void http_reject_request_cb(struct evhttp_request* req, void*) +{ + LogPrint("http", "Rejecting request while shutting down\n"); + evhttp_send_error(req, HTTP_SERVUNAVAIL, NULL); +} + /** Event dispatcher thread */ static void ThreadHTTP(struct event_base* base, struct evhttp* http) { @@ -278,7 +287,6 @@ static void ThreadHTTP(struct event_base* base, struct evhttp* http) static bool HTTPBindAddresses(struct evhttp* http) { int defaultPort = GetArg("-rpcport", BaseParams().RPCPort()); - int nBound = 0; std::vector > endpoints; // Determine what addresses to bind to @@ -304,13 +312,14 @@ static bool HTTPBindAddresses(struct evhttp* http) // Bind addresses for (std::vector >::iterator i = endpoints.begin(); i != endpoints.end(); ++i) { LogPrint("http", "Binding RPC on address %s port %i\n", i->first, i->second); - if (evhttp_bind_socket(http, i->first.empty() ? NULL : i->first.c_str(), i->second) == 0) { - nBound += 1; + evhttp_bound_socket *bind_handle = evhttp_bind_socket_with_handle(http, i->first.empty() ? NULL : i->first.c_str(), i->second); + if (bind_handle) { + boundSockets.push_back(bind_handle); } else { LogPrintf("Binding RPC on address %s port %i failed.\n", i->first, i->second); } } - return nBound > 0; + return !boundSockets.empty(); } /** Simple wrapper to set thread name and run work queue */ @@ -414,8 +423,14 @@ bool StartHTTPServer(boost::thread_group& threadGroup) void InterruptHTTPServer() { LogPrint("http", "Interrupting HTTP server\n"); - if (eventBase) - event_base_loopbreak(eventBase); + if (eventHTTP) { + // Unlisten sockets + BOOST_FOREACH (evhttp_bound_socket *socket, boundSockets) { + evhttp_del_accept_socket(eventHTTP, socket); + } + // Reject requests on current connections + evhttp_set_gencb(eventHTTP, http_reject_request_cb, NULL); + } if (workQueue) workQueue->Interrupt(); } diff --git a/src/rpcserver.cpp b/src/rpcserver.cpp index c2c76a1e2..a01366f74 100644 --- a/src/rpcserver.cpp +++ b/src/rpcserver.cpp @@ -246,7 +246,8 @@ UniValue stop(const UniValue& params, bool fHelp) throw runtime_error( "stop\n" "\nStop Zcash server."); - // Shutdown will take long enough that the response should get back + // Event loop will exit after current HTTP requests have been handled, so + // this reply will get back to the client. StartShutdown(); return "Zcash server stopping"; } From dbf7057f7a61f6971f903c0e7fa9f3133ab22dbe Mon Sep 17 00:00:00 2001 From: "Wladimir J. van der Laan" Date: Fri, 25 Sep 2015 13:49:08 +0200 Subject: [PATCH 0169/1062] http: Wait for worker threads to exit Add a WaitExit() call to http's WorkQueue to make it delete the work queue only when all worker threads stopped. This fixes a problem that was reproducable by pressing Ctrl-C during AppInit2: ``` /usr/include/boost/thread/pthread/condition_variable_fwd.hpp:81: boost::condition_variable::~condition_variable(): Assertion `!ret' failed. /usr/include/boost/thread/pthread/mutex.hpp:108: boost::mutex::~mutex(): Assertion `!posix::pthread_mutex_destroy(&m)' failed. ``` I was assuming that `threadGroup->join_all();` would always have been called when entering the Shutdown(). However this is not the case in bitcoind's AppInit2-non-zero-exit case "was left out intentionally here". Zcash: cherry-picked from commit de9de2de361ab1355b976f17371d73e36fe3bf56 Fixes #2334 and #2214. --- src/httpserver.cpp | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/src/httpserver.cpp b/src/httpserver.cpp index 8acce2f0f..6cf09974e 100644 --- a/src/httpserver.cpp +++ b/src/httpserver.cpp @@ -72,13 +72,35 @@ private: std::deque queue; bool running; size_t maxDepth; + int numThreads; + + /** RAII object to keep track of number of running worker threads */ + class ThreadCounter + { + public: + WorkQueue &wq; + ThreadCounter(WorkQueue &w): wq(w) + { + boost::lock_guard lock(wq.cs); + wq.numThreads += 1; + } + ~ThreadCounter() + { + boost::lock_guard lock(wq.cs); + wq.numThreads -= 1; + wq.cond.notify_all(); + } + }; public: WorkQueue(size_t maxDepth) : running(true), - maxDepth(maxDepth) + maxDepth(maxDepth), + numThreads(0) { } - /* Precondition: worker threads have all stopped */ + /*( Precondition: worker threads have all stopped + * (call WaitExit) + */ ~WorkQueue() { while (!queue.empty()) { @@ -100,6 +122,7 @@ public: /** Thread function */ void Run() { + ThreadCounter count(*this); while (running) { WorkItem* i = 0; { @@ -122,6 +145,13 @@ public: running = false; cond.notify_all(); } + /** Wait for worker threads to exit */ + void WaitExit() + { + boost::unique_lock lock(cs); + while (numThreads > 0) + cond.wait(lock); + } /** Return current depth of queue */ size_t Depth() @@ -438,7 +468,11 @@ void InterruptHTTPServer() void StopHTTPServer() { LogPrint("http", "Stopping HTTP server\n"); - delete workQueue; + if (workQueue) { + LogPrint("http", "Waiting for HTTP worker threads to exit\n"); + workQueue->WaitExit(); + delete workQueue; + } if (eventHTTP) { evhttp_free(eventHTTP); eventHTTP = 0; From 2abe8ef721ea7bdff5d908f5ee3a9bc34d54a1c8 Mon Sep 17 00:00:00 2001 From: "Wladimir J. van der Laan" Date: Fri, 25 Sep 2015 15:35:37 +0200 Subject: [PATCH 0170/1062] http: Force-exit event loop after predefined time This makes sure that the event loop eventually terminates, even if an event (like an open timeout, or a hanging connection) happens to be holding it up. Zcash: cherry-picked from commit ec908d5f7aa9ad7e3487018e06a24cb6449cc58b --- src/httpserver.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/httpserver.cpp b/src/httpserver.cpp index 6cf09974e..f2da2de13 100644 --- a/src/httpserver.cpp +++ b/src/httpserver.cpp @@ -461,6 +461,13 @@ void InterruptHTTPServer() // Reject requests on current connections evhttp_set_gencb(eventHTTP, http_reject_request_cb, NULL); } + if (eventBase) { + // Force-exit event loop after predefined time + struct timeval tv; + tv.tv_sec = 10; + tv.tv_usec = 0; + event_base_loopexit(eventBase, &tv); + } if (workQueue) workQueue->Interrupt(); } From c7f77e28f0e4e8cb4f5ca6ba3877ab75bb983930 Mon Sep 17 00:00:00 2001 From: "Wladimir J. van der Laan" Date: Wed, 11 Nov 2015 17:34:10 +0100 Subject: [PATCH 0171/1062] http: speed up shutdown This continues/fixes #6719. `event_base_loopbreak` was not doing what I expected it to, at least in libevent 2.0.21. What I expected was that it sets a timeout, given that no other pending events it would exit in N seconds. However, what it does was delay the event loop exit with 10 seconds, even if nothing is pending. Solve it in a different way: give the event loop thread time to exit out of itself, and if it doesn't, send loopbreak. This speeds up the RPC tests a lot, each exit incurred a 10 second overhead, with this change there should be no shutdown overhead in the common case and up to two seconds if the event loop is blocking. As a bonus this breaks dependency on boost::thread_group, as the HTTP server minds its own offspring. Zcash: cherry-picked from commit a264c32e3321ae909ca59cb8ce8bf5d812dbc4e1 --- src/httpserver.cpp | 30 ++++++++++++++++++++---------- src/httpserver.h | 2 +- src/init.cpp | 2 +- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/httpserver.cpp b/src/httpserver.cpp index f2da2de13..a7ca741cc 100644 --- a/src/httpserver.cpp +++ b/src/httpserver.cpp @@ -438,15 +438,17 @@ bool InitHTTPServer() return true; } -bool StartHTTPServer(boost::thread_group& threadGroup) +boost::thread threadHTTP; + +bool StartHTTPServer() { LogPrint("http", "Starting HTTP server\n"); int rpcThreads = std::max((long)GetArg("-rpcthreads", DEFAULT_HTTP_THREADS), 1L); LogPrintf("HTTP: starting %d worker threads\n", rpcThreads); - threadGroup.create_thread(boost::bind(&ThreadHTTP, eventBase, eventHTTP)); + threadHTTP = boost::thread(boost::bind(&ThreadHTTP, eventBase, eventHTTP)); for (int i = 0; i < rpcThreads; i++) - threadGroup.create_thread(boost::bind(&HTTPWorkQueueRun, workQueue)); + boost::thread(boost::bind(&HTTPWorkQueueRun, workQueue)); return true; } @@ -461,13 +463,6 @@ void InterruptHTTPServer() // Reject requests on current connections evhttp_set_gencb(eventHTTP, http_reject_request_cb, NULL); } - if (eventBase) { - // Force-exit event loop after predefined time - struct timeval tv; - tv.tv_sec = 10; - tv.tv_usec = 0; - event_base_loopexit(eventBase, &tv); - } if (workQueue) workQueue->Interrupt(); } @@ -480,6 +475,20 @@ void StopHTTPServer() workQueue->WaitExit(); delete workQueue; } + if (eventBase) { + LogPrint("http", "Waiting for HTTP event thread to exit\n"); + // Give event loop a few seconds to exit (to send back last RPC responses), then break it + // Before this was solved with event_base_loopexit, but that didn't work as expected in + // at least libevent 2.0.21 and always introduced a delay. In libevent + // master that appears to be solved, so in the future that solution + // could be used again (if desirable). + // (see discussion in https://github.com/bitcoin/bitcoin/pull/6990) + if (!threadHTTP.try_join_for(boost::chrono::milliseconds(2000))) { + LogPrintf("HTTP event loop did not exit within allotted time, sending loopbreak\n"); + event_base_loopbreak(eventBase); + threadHTTP.join(); + } + } if (eventHTTP) { evhttp_free(eventHTTP); eventHTTP = 0; @@ -488,6 +497,7 @@ void StopHTTPServer() event_base_free(eventBase); eventBase = 0; } + LogPrint("http", "Stopped HTTP server\n"); } struct event_base* EventBase() diff --git a/src/httpserver.h b/src/httpserver.h index 347e7c3ab..93fb5d8d6 100644 --- a/src/httpserver.h +++ b/src/httpserver.h @@ -28,7 +28,7 @@ bool InitHTTPServer(); * This is separate from InitHTTPServer to give users race-condition-free time * to register their handlers between InitHTTPServer and StartHTTPServer. */ -bool StartHTTPServer(boost::thread_group& threadGroup); +bool StartHTTPServer(); /** Interrupt HTTP server threads */ void InterruptHTTPServer(); /** Stop HTTP server */ diff --git a/src/init.cpp b/src/init.cpp index cb91a1c1d..4f1618e28 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -712,7 +712,7 @@ bool AppInitServers(boost::thread_group& threadGroup) return false; if (GetBoolArg("-rest", false) && !StartREST()) return false; - if (!StartHTTPServer(threadGroup)) + if (!StartHTTPServer()) return false; return true; } From c98b91b7c5fd9779c67529aa9c7f99609075357f Mon Sep 17 00:00:00 2001 From: Cory Fields Date: Thu, 28 Jul 2016 18:21:00 -0400 Subject: [PATCH 0172/1062] httpserver: explicitly detach worker threads When using std::thread in place of boost::thread, letting the threads destruct results in a std::terminate. According to the docs, the same thing should be be happening in later boost versions: http://www.boost.org/doc/libs/1_55_0/doc/html/thread/thread_management.html#thread.thread_management.thread.destructor I'm unsure why this hasn't blown up already, but explicitly detaching can't hurt. Zcash: cherry-picked from commit d3773ca9aeb0d2f12dc0c5a0726778050c8cb455 This fixes #2554 (zcash-cli stop during getblocktemplate long poll causes 'Assertion `!pthread_mutex_unlock(&m)' failed.') --- src/httpserver.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/httpserver.cpp b/src/httpserver.cpp index a7ca741cc..e2a6af6ad 100644 --- a/src/httpserver.cpp +++ b/src/httpserver.cpp @@ -447,8 +447,10 @@ bool StartHTTPServer() LogPrintf("HTTP: starting %d worker threads\n", rpcThreads); threadHTTP = boost::thread(boost::bind(&ThreadHTTP, eventBase, eventHTTP)); - for (int i = 0; i < rpcThreads; i++) - boost::thread(boost::bind(&HTTPWorkQueueRun, workQueue)); + for (int i = 0; i < rpcThreads; i++) { + boost::thread rpc_worker(HTTPWorkQueueRun, workQueue); + rpc_worker.detach(); + } return true; } From 51e448641d6cbcd582afa22cd8475f8c3086dad7 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 2 Aug 2017 11:17:25 +0100 Subject: [PATCH 0173/1062] Squashed 'src/snark/' content from commit 9ada3f8 git-subtree-dir: src/snark git-subtree-split: 9ada3f84ab484c57b2247c2f41091fd6a0916573 --- .gitignore | 49 + AUTHORS | 19 + LICENSE | 24 + Makefile | 277 +++ README.md | 628 ++++++ doxygen.conf | 1807 +++++++++++++++++ src/algebra/curves/alt_bn128/alt_bn128_g1.cpp | 524 +++++ src/algebra/curves/alt_bn128/alt_bn128_g1.hpp | 95 + src/algebra/curves/alt_bn128/alt_bn128_g2.cpp | 505 +++++ src/algebra/curves/alt_bn128/alt_bn128_g2.hpp | 96 + .../curves/alt_bn128/alt_bn128_init.cpp | 273 +++ .../curves/alt_bn128/alt_bn128_init.hpp | 57 + .../curves/alt_bn128/alt_bn128_pairing.cpp | 547 +++++ .../curves/alt_bn128/alt_bn128_pairing.hpp | 92 + src/algebra/curves/alt_bn128/alt_bn128_pp.cpp | 58 + src/algebra/curves/alt_bn128/alt_bn128_pp.hpp | 50 + src/algebra/curves/curve_utils.hpp | 22 + src/algebra/curves/curve_utils.tcc | 37 + src/algebra/curves/public_params.hpp | 103 + src/algebra/curves/tests/test_bilinearity.cpp | 136 ++ src/algebra/curves/tests/test_groups.cpp | 175 ++ .../domains/basic_radix2_domain.hpp | 45 + .../domains/basic_radix2_domain.tcc | 112 + .../domains/basic_radix2_domain_aux.hpp | 48 + .../domains/basic_radix2_domain_aux.tcc | 242 +++ .../evaluation_domain/evaluation_domain.hpp | 125 ++ .../evaluation_domain/evaluation_domain.tcc | 117 ++ src/algebra/exponentiation/exponentiation.hpp | 31 + src/algebra/exponentiation/exponentiation.tcc | 53 + src/algebra/fields/bigint.hpp | 70 + src/algebra/fields/bigint.tcc | 278 +++ src/algebra/fields/field_utils.hpp | 51 + src/algebra/fields/field_utils.tcc | 183 ++ src/algebra/fields/fp.hpp | 182 ++ src/algebra/fields/fp.tcc | 790 +++++++ src/algebra/fields/fp12_2over3over2.hpp | 116 ++ src/algebra/fields/fp12_2over3over2.tcc | 412 ++++ src/algebra/fields/fp2.hpp | 120 ++ src/algebra/fields/fp2.tcc | 261 +++ src/algebra/fields/fp3.hpp | 122 ++ src/algebra/fields/fp3.tcc | 259 +++ src/algebra/fields/fp6_3over2.hpp | 104 + src/algebra/fields/fp6_3over2.tcc | 216 ++ src/algebra/fields/fp_aux.tcc | 389 ++++ src/algebra/fields/tests/test_bigint.cpp | 107 + src/algebra/fields/tests/test_fields.cpp | 245 +++ .../knowledge_commitment.hpp | 84 + .../knowledge_commitment.tcc | 111 + .../scalar_multiplication/kc_multiexp.hpp | 55 + .../scalar_multiplication/kc_multiexp.tcc | 274 +++ .../scalar_multiplication/multiexp.hpp | 110 + .../scalar_multiplication/multiexp.tcc | 590 ++++++ src/algebra/scalar_multiplication/wnaf.hpp | 39 + src/algebra/scalar_multiplication/wnaf.tcc | 123 ++ src/common/assert_except.hpp | 12 + .../data_structures/accumulation_vector.hpp | 74 + .../data_structures/accumulation_vector.tcc | 84 + src/common/data_structures/merkle_tree.hpp | 71 + src/common/data_structures/merkle_tree.tcc | 246 +++ src/common/data_structures/sparse_vector.hpp | 79 + src/common/data_structures/sparse_vector.tcc | 316 +++ src/common/default_types/ec_pp.hpp | 53 + .../default_types/r1cs_ppzksnark_pp.hpp | 22 + src/common/profiling.cpp | 379 ++++ src/common/profiling.hpp | 51 + src/common/serialization.hpp | 104 + src/common/serialization.tcc | 180 ++ src/common/template_utils.hpp | 26 + src/common/utils.cpp | 102 + src/common/utils.hpp | 57 + src/common/utils.tcc | 23 + src/gadgetlib1/constraint_profiling.cpp | 48 + src/gadgetlib1/constraint_profiling.hpp | 42 + src/gadgetlib1/examples/simple_example.hpp | 23 + src/gadgetlib1/examples/simple_example.tcc | 54 + src/gadgetlib1/gadget.hpp | 27 + src/gadgetlib1/gadget.tcc | 23 + src/gadgetlib1/gadgets/basic_gadgets.hpp | 351 ++++ src/gadgetlib1/gadgets/basic_gadgets.tcc | 705 +++++++ src/gadgetlib1/gadgets/gadget_from_r1cs.hpp | 45 + src/gadgetlib1/gadgets/gadget_from_r1cs.tcc | 123 ++ .../gadgets/hashes/digest_selector_gadget.hpp | 42 + .../gadgets/hashes/digest_selector_gadget.tcc | 62 + src/gadgetlib1/gadgets/hashes/hash_io.hpp | 63 + src/gadgetlib1/gadgets/hashes/hash_io.tcc | 105 + .../gadgets/hashes/sha256/sha256_aux.hpp | 160 ++ .../gadgets/hashes/sha256/sha256_aux.tcc | 297 +++ .../hashes/sha256/sha256_components.hpp | 108 + .../hashes/sha256/sha256_components.tcc | 250 +++ .../gadgets/hashes/sha256/sha256_gadget.hpp | 98 + .../gadgets/hashes/sha256/sha256_gadget.tcc | 230 +++ .../tests/generate_sha256_gadget_tests.py | 55 + .../hashes/sha256/tests/pypy_sha256.py | 263 +++ .../sha256/tests/test_sha256_gadget.cpp | 46 + .../merkle_authentication_path_variable.hpp | 38 + .../merkle_authentication_path_variable.tcc | 76 + .../merkle_tree_check_read_gadget.hpp | 73 + .../merkle_tree_check_read_gadget.tcc | 196 ++ .../merkle_tree_check_update_gadget.hpp | 91 + .../merkle_tree_check_update_gadget.tcc | 265 +++ .../tests/test_merkle_tree_gadgets.cpp | 48 + src/gadgetlib1/pb_variable.hpp | 144 ++ src/gadgetlib1/pb_variable.tcc | 330 +++ src/gadgetlib1/protoboard.hpp | 75 + src/gadgetlib1/protoboard.tcc | 189 ++ src/reductions/r1cs_to_qap/r1cs_to_qap.hpp | 70 + src/reductions/r1cs_to_qap/r1cs_to_qap.tcc | 338 +++ src/relations/arithmetic_programs/qap/qap.hpp | 193 ++ src/relations/arithmetic_programs/qap/qap.tcc | 324 +++ .../qap/tests/test_qap.cpp | 115 ++ .../r1cs/examples/r1cs_examples.hpp | 73 + .../r1cs/examples/r1cs_examples.tcc | 164 ++ .../r1cs/r1cs.hpp | 153 ++ .../r1cs/r1cs.tcc | 310 +++ src/relations/variable.hpp | 213 ++ src/relations/variable.tcc | 512 +++++ .../examples/run_r1cs_ppzksnark.hpp | 35 + .../examples/run_r1cs_ppzksnark.tcc | 114 ++ .../profiling/profile_r1cs_ppzksnark.cpp | 71 + .../r1cs_ppzksnark/r1cs_ppzksnark.hpp | 479 +++++ .../r1cs_ppzksnark/r1cs_ppzksnark.tcc | 762 +++++++ .../r1cs_ppzksnark/r1cs_ppzksnark_params.hpp | 34 + .../tests/test_r1cs_ppzksnark.cpp | 42 + 123 files changed, 22264 insertions(+) create mode 100644 .gitignore create mode 100644 AUTHORS create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 README.md create mode 100644 doxygen.conf create mode 100644 src/algebra/curves/alt_bn128/alt_bn128_g1.cpp create mode 100644 src/algebra/curves/alt_bn128/alt_bn128_g1.hpp create mode 100644 src/algebra/curves/alt_bn128/alt_bn128_g2.cpp create mode 100644 src/algebra/curves/alt_bn128/alt_bn128_g2.hpp create mode 100644 src/algebra/curves/alt_bn128/alt_bn128_init.cpp create mode 100644 src/algebra/curves/alt_bn128/alt_bn128_init.hpp create mode 100644 src/algebra/curves/alt_bn128/alt_bn128_pairing.cpp create mode 100644 src/algebra/curves/alt_bn128/alt_bn128_pairing.hpp create mode 100644 src/algebra/curves/alt_bn128/alt_bn128_pp.cpp create mode 100644 src/algebra/curves/alt_bn128/alt_bn128_pp.hpp create mode 100644 src/algebra/curves/curve_utils.hpp create mode 100644 src/algebra/curves/curve_utils.tcc create mode 100644 src/algebra/curves/public_params.hpp create mode 100644 src/algebra/curves/tests/test_bilinearity.cpp create mode 100644 src/algebra/curves/tests/test_groups.cpp create mode 100644 src/algebra/evaluation_domain/domains/basic_radix2_domain.hpp create mode 100644 src/algebra/evaluation_domain/domains/basic_radix2_domain.tcc create mode 100644 src/algebra/evaluation_domain/domains/basic_radix2_domain_aux.hpp create mode 100644 src/algebra/evaluation_domain/domains/basic_radix2_domain_aux.tcc create mode 100644 src/algebra/evaluation_domain/evaluation_domain.hpp create mode 100644 src/algebra/evaluation_domain/evaluation_domain.tcc create mode 100644 src/algebra/exponentiation/exponentiation.hpp create mode 100644 src/algebra/exponentiation/exponentiation.tcc create mode 100644 src/algebra/fields/bigint.hpp create mode 100644 src/algebra/fields/bigint.tcc create mode 100644 src/algebra/fields/field_utils.hpp create mode 100644 src/algebra/fields/field_utils.tcc create mode 100644 src/algebra/fields/fp.hpp create mode 100644 src/algebra/fields/fp.tcc create mode 100644 src/algebra/fields/fp12_2over3over2.hpp create mode 100644 src/algebra/fields/fp12_2over3over2.tcc create mode 100644 src/algebra/fields/fp2.hpp create mode 100644 src/algebra/fields/fp2.tcc create mode 100644 src/algebra/fields/fp3.hpp create mode 100644 src/algebra/fields/fp3.tcc create mode 100644 src/algebra/fields/fp6_3over2.hpp create mode 100644 src/algebra/fields/fp6_3over2.tcc create mode 100644 src/algebra/fields/fp_aux.tcc create mode 100644 src/algebra/fields/tests/test_bigint.cpp create mode 100644 src/algebra/fields/tests/test_fields.cpp create mode 100644 src/algebra/knowledge_commitment/knowledge_commitment.hpp create mode 100644 src/algebra/knowledge_commitment/knowledge_commitment.tcc create mode 100644 src/algebra/scalar_multiplication/kc_multiexp.hpp create mode 100644 src/algebra/scalar_multiplication/kc_multiexp.tcc create mode 100644 src/algebra/scalar_multiplication/multiexp.hpp create mode 100644 src/algebra/scalar_multiplication/multiexp.tcc create mode 100644 src/algebra/scalar_multiplication/wnaf.hpp create mode 100644 src/algebra/scalar_multiplication/wnaf.tcc create mode 100644 src/common/assert_except.hpp create mode 100644 src/common/data_structures/accumulation_vector.hpp create mode 100644 src/common/data_structures/accumulation_vector.tcc create mode 100644 src/common/data_structures/merkle_tree.hpp create mode 100644 src/common/data_structures/merkle_tree.tcc create mode 100644 src/common/data_structures/sparse_vector.hpp create mode 100644 src/common/data_structures/sparse_vector.tcc create mode 100644 src/common/default_types/ec_pp.hpp create mode 100644 src/common/default_types/r1cs_ppzksnark_pp.hpp create mode 100644 src/common/profiling.cpp create mode 100644 src/common/profiling.hpp create mode 100644 src/common/serialization.hpp create mode 100644 src/common/serialization.tcc create mode 100644 src/common/template_utils.hpp create mode 100644 src/common/utils.cpp create mode 100644 src/common/utils.hpp create mode 100644 src/common/utils.tcc create mode 100644 src/gadgetlib1/constraint_profiling.cpp create mode 100644 src/gadgetlib1/constraint_profiling.hpp create mode 100644 src/gadgetlib1/examples/simple_example.hpp create mode 100644 src/gadgetlib1/examples/simple_example.tcc create mode 100644 src/gadgetlib1/gadget.hpp create mode 100644 src/gadgetlib1/gadget.tcc create mode 100644 src/gadgetlib1/gadgets/basic_gadgets.hpp create mode 100644 src/gadgetlib1/gadgets/basic_gadgets.tcc create mode 100644 src/gadgetlib1/gadgets/gadget_from_r1cs.hpp create mode 100644 src/gadgetlib1/gadgets/gadget_from_r1cs.tcc create mode 100644 src/gadgetlib1/gadgets/hashes/digest_selector_gadget.hpp create mode 100644 src/gadgetlib1/gadgets/hashes/digest_selector_gadget.tcc create mode 100644 src/gadgetlib1/gadgets/hashes/hash_io.hpp create mode 100644 src/gadgetlib1/gadgets/hashes/hash_io.tcc create mode 100644 src/gadgetlib1/gadgets/hashes/sha256/sha256_aux.hpp create mode 100644 src/gadgetlib1/gadgets/hashes/sha256/sha256_aux.tcc create mode 100644 src/gadgetlib1/gadgets/hashes/sha256/sha256_components.hpp create mode 100644 src/gadgetlib1/gadgets/hashes/sha256/sha256_components.tcc create mode 100644 src/gadgetlib1/gadgets/hashes/sha256/sha256_gadget.hpp create mode 100644 src/gadgetlib1/gadgets/hashes/sha256/sha256_gadget.tcc create mode 100644 src/gadgetlib1/gadgets/hashes/sha256/tests/generate_sha256_gadget_tests.py create mode 100644 src/gadgetlib1/gadgets/hashes/sha256/tests/pypy_sha256.py create mode 100644 src/gadgetlib1/gadgets/hashes/sha256/tests/test_sha256_gadget.cpp create mode 100644 src/gadgetlib1/gadgets/merkle_tree/merkle_authentication_path_variable.hpp create mode 100644 src/gadgetlib1/gadgets/merkle_tree/merkle_authentication_path_variable.tcc create mode 100644 src/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_read_gadget.hpp create mode 100644 src/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_read_gadget.tcc create mode 100644 src/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_update_gadget.hpp create mode 100644 src/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_update_gadget.tcc create mode 100644 src/gadgetlib1/gadgets/merkle_tree/tests/test_merkle_tree_gadgets.cpp create mode 100644 src/gadgetlib1/pb_variable.hpp create mode 100644 src/gadgetlib1/pb_variable.tcc create mode 100644 src/gadgetlib1/protoboard.hpp create mode 100644 src/gadgetlib1/protoboard.tcc create mode 100644 src/reductions/r1cs_to_qap/r1cs_to_qap.hpp create mode 100644 src/reductions/r1cs_to_qap/r1cs_to_qap.tcc create mode 100644 src/relations/arithmetic_programs/qap/qap.hpp create mode 100644 src/relations/arithmetic_programs/qap/qap.tcc create mode 100644 src/relations/arithmetic_programs/qap/tests/test_qap.cpp create mode 100644 src/relations/constraint_satisfaction_problems/r1cs/examples/r1cs_examples.hpp create mode 100644 src/relations/constraint_satisfaction_problems/r1cs/examples/r1cs_examples.tcc create mode 100644 src/relations/constraint_satisfaction_problems/r1cs/r1cs.hpp create mode 100644 src/relations/constraint_satisfaction_problems/r1cs/r1cs.tcc create mode 100644 src/relations/variable.hpp create mode 100644 src/relations/variable.tcc create mode 100644 src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/examples/run_r1cs_ppzksnark.hpp create mode 100644 src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/examples/run_r1cs_ppzksnark.tcc create mode 100644 src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/profiling/profile_r1cs_ppzksnark.cpp create mode 100644 src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.hpp create mode 100644 src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.tcc create mode 100644 src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark_params.hpp create mode 100644 src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/tests/test_r1cs_ppzksnark.cpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..f6fb450a2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,49 @@ +*.o +*.a +*.so +*.d +depinst/ +depsrc/ +README.html +doxygen/ +src/gadgetlib2/examples/tutorial +src/gadgetlib2/tests/gadgetlib2_test + +src/algebra/curves/tests/test_bilinearity +src/algebra/curves/tests/test_groups +src/algebra/fields/tests/test_fields +src/common/routing_algorithms/profiling/profile_routing_algorithms +src/common/routing_algorithms/tests/test_routing_algorithms +src/gadgetlib1/gadgets/cpu_checkers/fooram/examples/test_fooram +src/gadgetlib1/gadgets/hashes/knapsack/tests/test_knapsack_gadget +src/gadgetlib1/gadgets/hashes/sha256/tests/test_sha256_gadget +src/gadgetlib1/gadgets/merkle_tree/tests/test_merkle_tree_gadgets +src/gadgetlib1/gadgets/routing/profiling/profile_routing_gadgets +src/gadgetlib1/gadgets/set_commitment/tests/test_set_commitment_gadget +src/gadgetlib1/gadgets/verifiers/tests/test_r1cs_ppzksnark_verifier_gadget +src/reductions/ram_to_r1cs/examples/demo_arithmetization +src/relations/arithmetic_programs/qap/tests/test_qap +src/relations/arithmetic_programs/ssp/tests/test_ssp +src/zk_proof_systems/pcd/r1cs_pcd/r1cs_mp_ppzkpcd/profiling/profile_r1cs_mp_ppzkpcd +src/zk_proof_systems/pcd/r1cs_pcd/r1cs_mp_ppzkpcd/tests/test_r1cs_mp_ppzkpcd +src/zk_proof_systems/pcd/r1cs_pcd/r1cs_sp_ppzkpcd/profiling/profile_r1cs_sp_ppzkpcd +src/zk_proof_systems/pcd/r1cs_pcd/r1cs_sp_ppzkpcd/tests/test_r1cs_sp_ppzkpcd +src/zk_proof_systems/ppzkadsnark/r1cs_ppzkadsnark/examples/demo_r1cs_ppzkadsnark +src/zk_proof_systems/ppzksnark/bacs_ppzksnark/profiling/profile_bacs_ppzksnark +src/zk_proof_systems/ppzksnark/bacs_ppzksnark/tests/test_bacs_ppzksnark +src/zk_proof_systems/ppzksnark/r1cs_gg_ppzksnark/profiling/profile_r1cs_gg_ppzksnark +src/zk_proof_systems/ppzksnark/r1cs_gg_ppzksnark/tests/test_r1cs_gg_ppzksnark +src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/profiling/profile_r1cs_ppzksnark +src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/tests/test_r1cs_ppzksnark +src/zk_proof_systems/ppzksnark/ram_ppzksnark/examples/demo_ram_ppzksnark +src/zk_proof_systems/ppzksnark/ram_ppzksnark/examples/demo_ram_ppzksnark_generator +src/zk_proof_systems/ppzksnark/ram_ppzksnark/examples/demo_ram_ppzksnark_prover +src/zk_proof_systems/ppzksnark/ram_ppzksnark/examples/demo_ram_ppzksnark_verifier +src/zk_proof_systems/ppzksnark/ram_ppzksnark/profiling/profile_ram_ppzksnark +src/zk_proof_systems/ppzksnark/ram_ppzksnark/tests/test_ram_ppzksnark +src/zk_proof_systems/ppzksnark/tbcs_ppzksnark/profiling/profile_tbcs_ppzksnark +src/zk_proof_systems/ppzksnark/tbcs_ppzksnark/tests/test_tbcs_ppzksnark +src/zk_proof_systems/ppzksnark/uscs_ppzksnark/profiling/profile_uscs_ppzksnark +src/zk_proof_systems/ppzksnark/uscs_ppzksnark/tests/test_uscs_ppzksnark +src/zk_proof_systems/zksnark/ram_zksnark/profiling/profile_ram_zksnark +src/zk_proof_systems/zksnark/ram_zksnark/tests/test_ram_zksnark diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 000000000..1b2d7a247 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,19 @@ +SCIPR Lab: + Eli Ben-Sasson + Alessandro Chiesa + Daniel Genkin + Shaul Kfir + Eran Tromer + Madars Virza + +External contributors: + Michael Backes + Manuel Barbosa + Dario Fiore + Jens Groth + Joshua A. Kroll + Shigeo MITSUNARI + Raphael Reischuk + Tadanori TERUYA + Sean Bowe + Daira Hopwood diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..81cea11e1 --- /dev/null +++ b/LICENSE @@ -0,0 +1,24 @@ +The libsnark library is developed by SCIPR Lab (http://scipr-lab.org) +and contributors. + +Copyright (c) 2012-2014 SCIPR Lab and contributors (see AUTHORS file). + +All files, with the exceptions below, are released under the MIT License: + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..13e54da68 --- /dev/null +++ b/Makefile @@ -0,0 +1,277 @@ +#******************************************************************************** +# Makefile for the libsnark library. +#******************************************************************************** +#* @author This file is part of libsnark, developed by SCIPR Lab +#* and contributors (see AUTHORS). +#* @copyright MIT license (see LICENSE file) +#*******************************************************************************/ + +# To override these, use "make OPTFLAGS=..." etc. +CURVE = BN128 +OPTFLAGS = -O2 -march=native -mtune=native +FEATUREFLAGS = -DUSE_ASM -DMONTGOMERY_OUTPUT + +# Initialize this using "CXXFLAGS=... make". The makefile appends to that. +CXXFLAGS += -std=c++11 -Wall -Wextra -Wno-unused-parameter -Wno-comment -Wfatal-errors $(OPTFLAGS) $(FEATUREFLAGS) -DCURVE_$(CURVE) + +DEPSRC = depsrc +DEPINST = depinst + +CXXFLAGS += -I$(DEPINST)/include -Isrc +LDFLAGS += -L$(DEPINST)/lib -Wl,-rpath,$(DEPINST)/lib +LDLIBS += -lgmpxx -lgmp -lboost_program_options +# OpenSSL and its dependencies (needed explicitly for static builds): +LDLIBS += -lcrypto -ldl -lz +# List of .a files to include within libsnark.a and libsnark.so: +AR_LIBS = +# List of library files to install: +INSTALL_LIBS = $(LIB_FILE) +# Sentinel file to check existence of this directory (since directories don't work as a Make dependency): +DEPINST_EXISTS = $(DEPINST)/.exists + + +COMPILE_GTEST := +ifneq ($(NO_GTEST),1) + GTESTDIR=/usr/src/gtest +# Compile GTest from sourcecode if we can (e.g., Ubuntu). Otherwise use precompiled one (e.g., Fedora). +# See https://code.google.com/p/googletest/wiki/FAQ#Why_is_it_not_recommended_to_install_a_pre-compiled_copy_of_Goog . + COMPILE_GTEST :=$(shell test -d $(GTESTDIR) && echo -n 1) + GTEST_LDLIBS += -lgtest -lpthread +endif + +ifneq ($(NO_SUPERCOP),1) + SUPERCOP_LDLIBS += -lsupercop + INSTALL_LIBS += depinst/lib/libsupercop.a + # Would have been nicer to roll supercop into libsnark.a ("AR_LIBS += $(DEPINST)/lib/libsupercop.a"), but it doesn't support position-independent code (libsnark issue #20). +endif + +LIB_SRCS = \ + src/algebra/curves/alt_bn128/alt_bn128_g1.cpp \ + src/algebra/curves/alt_bn128/alt_bn128_g2.cpp \ + src/algebra/curves/alt_bn128/alt_bn128_init.cpp \ + src/algebra/curves/alt_bn128/alt_bn128_pairing.cpp \ + src/algebra/curves/alt_bn128/alt_bn128_pp.cpp \ + src/common/profiling.cpp \ + src/common/utils.cpp \ + src/gadgetlib1/constraint_profiling.cpp \ + +ifeq ($(CURVE),BN128) + LIB_SRCS += \ + src/algebra/curves/bn128/bn128_g1.cpp \ + src/algebra/curves/bn128/bn128_g2.cpp \ + src/algebra/curves/bn128/bn128_gt.cpp \ + src/algebra/curves/bn128/bn128_init.cpp \ + src/algebra/curves/bn128/bn128_pairing.cpp \ + src/algebra/curves/bn128/bn128_pp.cpp + + CXXFLAGS += -DBN_SUPPORT_SNARK + AR_LIBS += $(DEPINST)/lib/libzm.a +endif + +# FIXME: most of these are broken due to removed code. +DISABLED_EXECUTABLES = \ + src/algebra/curves/tests/test_bilinearity \ + src/algebra/curves/tests/test_groups \ + src/algebra/fields/tests/test_fields \ + src/common/routing_algorithms/profiling/profile_routing_algorithms \ + src/common/routing_algorithms/tests/test_routing_algorithms \ + src/gadgetlib1/gadgets/cpu_checkers/fooram/examples/test_fooram \ + src/gadgetlib1/gadgets/hashes/knapsack/tests/test_knapsack_gadget \ + src/gadgetlib1/gadgets/hashes/sha256/tests/test_sha256_gadget \ + src/gadgetlib1/gadgets/merkle_tree/tests/test_merkle_tree_gadgets \ + src/gadgetlib1/gadgets/routing/profiling/profile_routing_gadgets \ + src/gadgetlib1/gadgets/set_commitment/tests/test_set_commitment_gadget \ + src/gadgetlib1/gadgets/verifiers/tests/test_r1cs_ppzksnark_verifier_gadget \ + src/reductions/ram_to_r1cs/examples/demo_arithmetization \ + src/relations/arithmetic_programs/qap/tests/test_qap \ + src/relations/arithmetic_programs/ssp/tests/test_ssp \ + src/zk_proof_systems/pcd/r1cs_pcd/r1cs_mp_ppzkpcd/profiling/profile_r1cs_mp_ppzkpcd \ + src/zk_proof_systems/pcd/r1cs_pcd/r1cs_mp_ppzkpcd/tests/test_r1cs_mp_ppzkpcd \ + src/zk_proof_systems/pcd/r1cs_pcd/r1cs_sp_ppzkpcd/profiling/profile_r1cs_sp_ppzkpcd \ + src/zk_proof_systems/pcd/r1cs_pcd/r1cs_sp_ppzkpcd/tests/test_r1cs_sp_ppzkpcd \ + src/zk_proof_systems/ppzksnark/bacs_ppzksnark/profiling/profile_bacs_ppzksnark \ + src/zk_proof_systems/ppzksnark/bacs_ppzksnark/tests/test_bacs_ppzksnark \ + src/zk_proof_systems/ppzksnark/r1cs_gg_ppzksnark/profiling/profile_r1cs_gg_ppzksnark \ + src/zk_proof_systems/ppzksnark/r1cs_gg_ppzksnark/tests/test_r1cs_gg_ppzksnark \ + src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/profiling/profile_r1cs_ppzksnark \ + src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/tests/test_r1cs_ppzksnark \ + src/zk_proof_systems/ppzksnark/ram_ppzksnark/examples/demo_ram_ppzksnark \ + src/zk_proof_systems/ppzksnark/ram_ppzksnark/examples/demo_ram_ppzksnark_generator \ + src/zk_proof_systems/ppzksnark/ram_ppzksnark/examples/demo_ram_ppzksnark_prover \ + src/zk_proof_systems/ppzksnark/ram_ppzksnark/examples/demo_ram_ppzksnark_verifier \ + src/zk_proof_systems/ppzksnark/ram_ppzksnark/profiling/profile_ram_ppzksnark \ + src/zk_proof_systems/ppzksnark/ram_ppzksnark/tests/test_ram_ppzksnark \ + src/zk_proof_systems/ppzksnark/tbcs_ppzksnark/profiling/profile_tbcs_ppzksnark \ + src/zk_proof_systems/ppzksnark/tbcs_ppzksnark/tests/test_tbcs_ppzksnark \ + src/zk_proof_systems/ppzksnark/uscs_ppzksnark/profiling/profile_uscs_ppzksnark \ + src/zk_proof_systems/ppzksnark/uscs_ppzksnark/tests/test_uscs_ppzksnark \ + src/zk_proof_systems/zksnark/ram_zksnark/profiling/profile_ram_zksnark \ + src/zk_proof_systems/zksnark/ram_zksnark/tests/test_ram_zksnark + +EXECUTABLES = \ + src/algebra/fields/tests/test_bigint + +EXECUTABLES_WITH_GTEST = \ + src/gadgetlib2/examples/tutorial \ + src/gadgetlib2/tests/gadgetlib2_test + +EXECUTABLES_WITH_SUPERCOP = \ + src/zk_proof_systems/ppzkadsnark/r1cs_ppzkadsnark/examples/demo_r1cs_ppzkadsnark + +DOCS = README.html + +LIBSNARK_A = libsnark.a + +# For documentation of the following options, see README.md . + +ifeq ($(NO_PROCPS),1) + CXXFLAGS += -DNO_PROCPS +else + LDLIBS += -lprocps +endif + +ifeq ($(LOWMEM),1) + CXXFLAGS += -DLOWMEM +endif + +ifeq ($(PROFILE_OP_COUNTS),1) + STATIC = 1 + CXXFLAGS += -DPROFILE_OP_COUNTS +endif + +ifeq ($(STATIC),1) + CXXFLAGS += -static -DSTATIC +else + CXXFLAGS += -fPIC +endif + +ifeq ($(MULTICORE),1) + CXXFLAGS += -DMULTICORE -fopenmp +endif + +ifeq ($(CPPDEBUG),1) + CXXFLAGS += -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC + DEBUG = 1 +endif + +ifeq ($(DEBUG),1) + CXXFLAGS += -DDEBUG -ggdb3 +endif + +ifeq ($(PERFORMANCE),1) + OPTFLAGS = -O3 -march=native -mtune=native + CXXFLAGS += -DNDEBUG + # Enable link-time optimization: + CXXFLAGS += -flto -fuse-linker-plugin + LDFLAGS += -flto +endif + +LIB_OBJS =$(patsubst %.cpp,%.o,$(LIB_SRCS)) +EXEC_OBJS =$(patsubst %,%.o,$(EXECUTABLES) $(EXECUTABLES_WITH_GTEST) $(EXECUTABLES_WITH_SUPERCOP)) + +all: \ + $(if $(NO_GTEST),,$(EXECUTABLES_WITH_GTEST)) \ + $(if $(NO_SUPERCOP),,$(EXECUTABLES_WITH_SUPERCOP)) \ + $(EXECUTABLES) \ + $(if $(NO_DOCS),,doc) + +doc: $(DOCS) + +$(DEPINST_EXISTS): + # Create placeholder directories for installed dependencies. Some make settings (including the default) require actually running ./prepare-depends.sh to populate this directory. + mkdir -p $(DEPINST)/lib $(DEPINST)/include + touch $@ + +# In order to detect changes to #include dependencies. -MMD below generates a .d file for each .o file. Include the .d file. +-include $(patsubst %.o,%.d, $(LIB_OBJS) $(EXEC_OBJS) ) + +$(LIB_OBJS) $(EXEC_OBJS): %.o: %.cpp + $(CXX) -o $@ $< -c -MMD $(CXXFLAGS) + +LIBGTEST_A = $(DEPINST)/lib/libgtest.a + +$(LIBGTEST_A): $(GTESTDIR)/src/gtest-all.cc $(DEPINST_EXISTS) + $(CXX) -o $(DEPINST)/lib/gtest-all.o -I $(GTESTDIR) -c -isystem $(GTESTDIR)/include $< $(CXXFLAGS) + $(AR) -rv $(LIBGTEST_A) $(DEPINST)/lib/gtest-all.o + +# libsnark.a will contains all of our relevant object files, and we also mash in the .a files of relevant dependencies built by ./prepare-depends.sh +$(LIBSNARK_A): $(LIB_OBJS) $(AR_LIBS) + ( \ + echo "create $(LIBSNARK_A)"; \ + echo "addmod $(LIB_OBJS)"; \ + if [ -n "$(AR_LIBS)" ]; then for AR_LIB in $(AR_LIBS); do echo addlib $$AR_LIB; done; fi; \ + echo "save"; \ + echo "end"; \ + ) | $(AR) -M + $(AR) s $(LIBSNARK_A) + +libsnark.so: $(LIBSNARK_A) $(DEPINST_EXISTS) + $(CXX) -o $@ --shared -Wl,--whole-archive $(LIBSNARK_A) $(CXXFLAGS) $(LDFLAGS) -Wl,--no-whole-archive $(LDLIBS) + +src/gadgetlib2/tests/gadgetlib2_test: \ + src/gadgetlib2/tests/adapters_UTEST.cpp \ + src/gadgetlib2/tests/constraint_UTEST.cpp \ + src/gadgetlib2/tests/gadget_UTEST.cpp \ + src/gadgetlib2/tests/integration_UTEST.cpp \ + src/gadgetlib2/tests/protoboard_UTEST.cpp \ + src/gadgetlib2/tests/variable_UTEST.cpp + +$(EXECUTABLES): %: %.o $(LIBSNARK_A) $(DEPINST_EXISTS) + $(CXX) -o $@ $@.o $(LIBSNARK_A) $(CXXFLAGS) $(LDFLAGS) $(LDLIBS) + +$(EXECUTABLES_WITH_GTEST): %: %.o $(LIBSNARK_A) $(if $(COMPILE_GTEST),$(LIBGTEST_A)) $(DEPINST_EXISTS) + $(CXX) -o $@ $@.o $(LIBSNARK_A) $(CXXFLAGS) $(LDFLAGS) $(GTEST_LDLIBS) $(LDLIBS) + +$(EXECUTABLES_WITH_SUPERCOP): %: %.o $(LIBSNARK_A) $(DEPINST_EXISTS) + $(CXX) -o $@ $@.o $(LIBSNARK_A) $(CXXFLAGS) $(LDFLAGS) $(SUPERCOP_LDLIBS) $(LDLIBS) + + +ifeq ($(STATIC),1) +LIB_FILE = $(LIBSNARK_A) +else +LIB_FILE = libsnark.so +endif + +lib: $(LIB_FILE) + +$(DOCS): %.html: %.md + markdown_py -f $@ $^ -x toc -x extra --noisy +# TODO: Would be nice to enable "-x smartypants" but Ubuntu 12.04 doesn't support that. +# TODO: switch to redcarpet, to produce same output as GitHub's processing of README.md. But what about TOC? + +ifeq ($(PREFIX),) +install: + $(error Please provide PREFIX. E.g. make install PREFIX=/usr) +else +HEADERS_SRC=$(shell find src -name '*.hpp' -o -name '*.tcc') +HEADERS_DEST=$(patsubst src/%,$(PREFIX)/include/libsnark/%,$(HEADERS_SRC)) + +$(HEADERS_DEST): $(PREFIX)/include/libsnark/%: src/% + mkdir -p $(shell dirname $@) + cp $< $@ + +install: $(INSTALL_LIBS) $(HEADERS_DEST) $(DEPINST_EXISTS) + mkdir -p $(PREFIX)/lib + cp -v $(INSTALL_LIBS) $(PREFIX)/lib/ + cp -rv $(DEPINST)/include $(PREFIX) +endif + +doxy: + doxygen doxygen.conf + +# Clean generated files, except locally-compiled dependencies +clean: + $(RM) \ + $(LIB_OBJS) $(EXEC_OBJS) \ + $(EXECUTABLES) $(EXECUTABLES_WITH_GTEST) $(EXECUTABLES_WITH_SUPERCOP) \ + $(DOCS) \ + ${patsubst %.o,%.d,${LIB_OBJS} ${EXEC_OBJS}} \ + libsnark.so $(LIBSNARK_A) \ + $(RM) -fr doxygen/ \ + $(RM) $(LIBGTEST_A) $(DEPINST)/lib/gtest-all.o + +# Clean all, including locally-compiled dependencies +clean-all: clean + $(RM) -fr $(DEPSRC) $(DEPINST) + +.PHONY: all clean clean-all doc doxy lib install diff --git a/README.md b/README.md new file mode 100644 index 000000000..d5aa34006 --- /dev/null +++ b/README.md @@ -0,0 +1,628 @@ +libsnark: a C++ library for zkSNARK proofs +================================================================================ + +-------------------------------------------------------------------------------- +Authors +-------------------------------------------------------------------------------- + +The libsnark library is developed by the [SCIPR Lab] project and contributors +and is released under the MIT License (see the [LICENSE] file). + +Copyright (c) 2012-2014 SCIPR Lab and contributors (see [AUTHORS] file). + +-------------------------------------------------------------------------------- +[TOC] + + + +-------------------------------------------------------------------------------- +Overview +-------------------------------------------------------------------------------- + +This library implements __zkSNARK__ schemes, which are a cryptographic method +for proving/verifying, in zero knowledge, the integrity of computations. + +A computation can be expressed as an NP statement, in forms such as the following: + +- "The C program _foo_, when executed, returns exit code 0 if given the input _bar_ and some additional input _qux_." +- "The Boolean circuit _foo_ is satisfiable by some input _qux_." +- "The arithmetic circuit _foo_ accepts the partial assignment _bar_, when extended into some full assignment _qux_." +- "The set of constraints _foo_ is satisfiable by the partial assignment _bar_, when extended into some full assignment _qux_." + +A prover who knows the witness for the NP statement (i.e., a satisfying input/assignment) can produce a short proof attesting to the truth of the NP statement. This proof can be verified by anyone, and offers the following properties. + +- __Zero knowledge:__ + the verifier learns nothing from the proof beside the truth of the statement (i.e., the value _qux_, in the above examples, remains secret). +- __Succinctness:__ + the proof is short and easy to verify. +- __Non-interactivity:__ + the proof is a string (i.e. it does not require back-and-forth interaction between the prover and the verifier). +- __Soundness:__ + the proof is computationally sound (i.e., it is infeasible to fake a proof of a false NP statement). Such a proof system is also called an _argument_. +- __Proof of knowledge:__ + the proof attests not just that the NP statement is true, but also that the + prover knows why (e.g., knows a valid _qux_). + +These properties are summarized by the _zkSNARK_ acronym, which stands for _Zero-Knowledge Succinct Non-interactive ARgument of Knowledge_ (though zkSNARKs are also knows as +_succinct non-interactive computationally-sound zero-knowledge proofs of knowledge_). +For formal definitions and theoretical discussions about these, see +\[BCCT12], \[BCIOP13], and the references therein. + +The libsnark library currently provides a C++ implementation of: + +1. General-purpose proof systems: + 1. A preprocessing zkSNARK for the NP-complete language "R1CS" + (_Rank-1 Constraint Systems_), which is a language that is similar to arithmetic + circuit satisfiability. + 2. A preprocessing SNARK for a language of arithmetic circuits, "BACS" + (_Bilinear Arithmetic Circuit Satisfiability_). This simplifies the writing + of NP statements when the additional flexibility of R1CS is not needed. + Internally, it reduces to R1CS. + 3. A preprocessing SNARK for the language "USCS" + (_Unitary-Square Constraint Systems_). This abstracts and implements the core + contribution of \[DFGK14] + 4. A preprocessing SNARK for a language of Boolean circuits, "TBCS" + (_Two-input Boolean Circuit Satisfiability_). Internally, it reduces to USCS. + This is much more efficient than going through R1CS. + 5. ADSNARK, a preprocessing SNARKs for proving statements on authenticated + data, as described in \[BBFR15]. + 6. Proof-Carrying Data (PCD). This uses recursive composition of SNARKs, as + explained in \[BCCT13] and optimized in \[BCTV14b]. +2. Gadget libraries (gadgetlib1 and gadgetlib2) for constructing R1CS + instances out of modular "gadget" classes. +3. Examples of applications that use the above proof systems to prove + statements about: + 1. Several toy examples. + 2. Execution of TinyRAM machine code, as explained in \[BCTV14a] and + \[BCGTV13]. (Such machine code can be obtained, e.g., by compiling from C.) + This is easily adapted to any other Random Access Machine that satisfies a + simple load-store interface. + 3. A scalable for TinyRAM using Proof-Carrying Data, as explained in \[BCTV14b] + 4. Zero-knowldge cluster MapReduce, as explained in \[CTV15]. + +The zkSNARK construction implemented by libsnark follows, extends, and +optimizes the approach described in \[BCTV14], itself an extension of +\[BCGTV13], following the approach of \[BCIOP13] and \[GGPR13]. An alternative +implementation of the basic approach is the _Pinocchio_ system of \[PGHR13]. +See these references for discussions of efficiency aspects that arise in +practical use of such constructions, as well as security and trust +considerations. + +This scheme is a _preprocessing zkSNARK_ (_ppzkSNARK_): before proofs can be +created and verified, one needs to first decide on a size/circuit/system +representing the NP statements to be proved, and run a _generator_ algorithm to +create corresponding public parameters (a long proving key and a short +verification key). + +Using the library involves the following high-level steps: + +1. Express the statements to be proved as an R1CS (or any of the other + languages above, such as arithmetic circuits, Boolean circuits, or TinyRAM). + This is done by writing C++ code that constructs an R1CS, and linking this code + together with libsnark +2. Use libsnark's generator algorithm to create the public parameters for this + statement (once and for all). +3. Use libsnark's prover algorithm to create proofs of true statements about + the satisfiability of the R1CS. +4. Use libsnark's verifier algorithm to check proofs for alleged statements. + + +-------------------------------------------------------------------------------- +The NP-complete language R1CS +-------------------------------------------------------------------------------- + +The ppzkSNARK supports proving/verifying membership in a specific NP-complete +language: R1CS (*rank-1 constraint systems*). An instance of the language is +specified by a set of equations over a prime field F, and each equation looks like: + < A, (1,X) > * < B , (1,X) > = < C, (1,X) > +where A,B,C are vectors over F, and X is a vector of variables. + +In particular, arithmetic (as well as boolean) circuits are easily reducible to +this language by converting each gate into a rank-1 constraint. See \[BCGTV13] +Appendix E (and "System of Rank 1 Quadratic Equations") for more details about this. + + +-------------------------------------------------------------------------------- +Elliptic curve choices +-------------------------------------------------------------------------------- + +The ppzkSNARK can be instantiated with different parameter choices, depending on +which elliptic curve is used. The libsnark library currently provides three +options: + +* "edwards": + an instantiation based on an Edwards curve, providing 80 bits of security. + +* "bn128": + an instantiation based on a Barreto-Naehrig curve, providing 128 + bits of security. The underlying curve implementation is + \[ate-pairing], which has incorporated our patch that changes the + BN curve to one suitable for SNARK applications. + + * This implementation uses dynamically-generated machine code for the curve + arithmetic. Some modern systems disallow execution of code on the heap, and + will thus block this implementation. + + For example, on Fedora 20 at its default settings, you will get the error + `zmInit ERR:can't protect` when running this code. To solve this, + run `sudo setsebool -P allow_execheap 1` to allow execution, + or use `make CURVE=ALT_BN128` instead. + +* "alt_bn128": + an alternative to "bn128", somewhat slower but avoids dynamic code generation. + +Note that bn128 requires an x86-64 CPU while the other curve choices +should be architecture-independent; see [portability](#portability). + + +-------------------------------------------------------------------------------- +Gadget libraries +-------------------------------------------------------------------------------- + +The libsnark library currently provides two libraries for conveniently constructing +R1CS instances out of reusable "gadgets". Both libraries provide a way to construct +gadgets on other gadgets as well as additional explicit equations. In this way, +complex R1CS instances can be built bottom up. + +### gadgetlib1 + +This is a low-level library which expose all features of the preprocessing +zkSNARK for R1CS. Its design is based on templates (as does the ppzkSNARK code) +to efficiently support working on multiple elliptic curves simultaneously. This +library is used for most of the constraint-building in libsnark, both internal +(reductions and Proof-Carrying Data) and examples applications. + +### gadgetlib2 + +This is an alternative library for constructing systems of polynomial equations +and, in particular, also R1CS instances. It is better documented and easier to +use than gadgetlib1, and its interface does not use templates. However, fewer +useful gadgets are provided. + + +-------------------------------------------------------------------------------- +Security +-------------------------------------------------------------------------------- + +The theoretical security of the underlying mathematical constructions, and the +requisite assumptions, are analyzed in detailed in the aforementioned research +papers. + +** +This code is a research-quality proof of concept, and has not +yet undergone extensive review or testing. It is thus not suitable, +as is, for use in critical or production systems. +** + +Known issues include the following: + +* The ppzkSNARK's generator and prover exhibit data-dependent running times + and memory usage. These form timing and cache-contention side channels, + which may be an issue in some applications. + +* Randomness is retrieved from /dev/urandom, but this should be + changed to a carefully considered (depending on system and threat + model) external, high-quality randomness source when creating + long-term proving/verification keys. + + +-------------------------------------------------------------------------------- +Build instructions +-------------------------------------------------------------------------------- + +The libsnark library relies on the following: + +- C++ build environment +- GMP for certain bit-integer arithmetic +- libprocps for reporting memory usage +- GTest for some of the unit tests + +So far we have tested these only on Linux, though we have been able to make the library work, +with some features disabled (such as memory profiling or GTest tests), on Windows via Cygwin +and on Mac OS X. (If you succeed in achieving more complete ports of the library, please +let us know!) See also the notes on [portability](#portability) below. + +For example, on a fresh install of Ubuntu 14.04, install the following packages: + + $ sudo apt-get install build-essential git libgmp3-dev libprocps3-dev libgtest-dev python-markdown libboost-all-dev libssl-dev + +Or, on Fedora 20: + + $ sudo yum install gcc-c++ make git gmp-devel procps-ng-devel gtest-devel python-markdown + +Run the following, to fetch dependencies from their GitHub repos and compile them. +(Not required if you set `CURVE` to other than the default `BN128` and also set `NO_SUPERCOP=1`.) + + $ ./prepare-depends.sh + +Then, to compile the library, tests, profiling harness and documentation, run: + + $ make + +To create just the HTML documentation, run + + $ make doc + +and then view the resulting `README.html` (which contains the very text you are reading now). + +To create Doxygen documentation summarizing all files, classes and functions, +with some (currently sparse) comments, install the `doxygen` and `graphviz` packages, then run + + $ make doxy + +(this may take a few minutes). Then view the resulting [`doxygen/index.html`](doxygen/index.html). + +### Using libsnark as a library + +To develop an application that uses libsnark, you could add it within the libsnark directory tree and adjust the Makefile, but it is far better to build libsnark as a (shared or static) library. You can then write your code in a separate directory tree, and link it against libsnark. + + +To build just the shared object library `libsnark.so`, run: + + $ make lib + +To build just the static library `libsnark.a`, run: + + $ make lib STATIC=1 + +Note that static compilation requires static versions of all libraries it depends on. +It may help to minize these dependencies by appending +`CURVE=ALT_BN128 NO_PROCPS=1 NO_GTEST=1 NO_SUPERCOP=1`. On Fedora 21, the requisite +library RPM dependencies are then: +`boost-static glibc-static gmp-static libstdc++-static openssl-static zlib-static + boost-devel glibc-devel gmp-devel gmp-devel libstdc++-devel openssl-devel openssl-devel`. + +To build *and install* the libsnark library: + + $ make install PREFIX=/install/path + +This will install `libsnark.so` into `/install/path/lib`; so your application should be linked using `-L/install/path/lib -lsnark`. It also installs the requisite headers into `/install/path/include`; so your application should be compiled using `-I/install/path/include`. + +In addition, unless you use `NO_SUPERCOP=1`, `libsupercop.a` will be installed and should be linked in using `-lsupercop`. + + +### Building on Windows using Cygwin +Install Cygwin using the graphical installer, including the `g++`, `libgmp` +and `git` packages. Then disable the dependencies not easily supported under CygWin, +using: + + $ make NO_PROCPS=1 NO_GTEST=1 NO_DOCS=1 + + +### Building on Mac OS X + +On Mac OS X, install GMP from MacPorts (`port install gmp`). Then disable the +dependencies not easily supported under CygWin, using: + + $ make NO_PROCPS=1 NO_GTEST=1 NO_DOCS=1 + +MacPorts does not write its libraries into standard system folders, so you +might need to explicitly provide the paths to the header files and libraries by +appending `CXXFLAGS=-I/opt/local/include LDFLAGS=-L/opt/local/lib` to the line +above. Similarly, to pass the paths to ate-pairing you would run +`INC_DIR=-I/opt/local/include LIB_DIR=-L/opt/local/lib ./prepare-depends.sh` +instead of `./prepare-depends.sh` above. + +-------------------------------------------------------------------------------- +Tutorials +-------------------------------------------------------------------------------- + +libsnark includes a tutorial, and some usage examples, for the high-level API. + +* `src/gadgetlib1/examples1` contains a simple example for constructing a + constraint system using gadgetlib1. + +* `src/gadgetlib2/examples` contains a tutorial for using gadgetlib2 to express + NP statements as constraint systems. It introduces basic terminology, design + overview, and recommended programming style. It also shows how to invoke + ppzkSNARKs on such constraint systems. The main file, `tutorial.cpp`, builds + into a standalone executable. + +* `src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/profiling/profile_r1cs_ppzksnark.cpp` + constructs a simple constraint system and runs the ppzksnark. See below for how to + run it. + + +-------------------------------------------------------------------------------- +Executing profiling example +-------------------------------------------------------------------------------- + +The command + + $ src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/profiling/profile_r1cs_ppzksnark 1000 10 Fr + +exercises the ppzkSNARK (first generator, then prover, then verifier) on an +R1CS instance with 1000 equations and an input consisting of 10 field elements. + +(If you get the error `zmInit ERR:can't protect`, see the discussion +[above](#elliptic-curve-choices).) + +The command + + $ src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/profiling/profile_r1cs_ppzksnark 1000 10 bytes + +does the same but now the input consists of 10 bytes. + + +-------------------------------------------------------------------------------- +Build options +-------------------------------------------------------------------------------- + +The following flags change the behavior of the compiled code. + +* `make FEATUREFLAGS='-Dname1 -Dname2 ...'` + + Override the active conditional #define names (you can see the default at the top of the Makefile). + The next bullets list the most important conditionally-#defined features. + For example, `make FEATUREFLAGS='-DBINARY_OUTPUT'` enables binary output and disables the default + assembly optimizations and Montgomery-representation output. + +* define `BINARY_OUTPUT` + + In serialization, output raw binary data (instead of decimal, when not set). + +* `make CURVE=choice` / define `CURVE_choice` (where `choice` is one of: + ALT_BN128, BN128, EDWARDS, MNT4, MNT6) + + Set the default curve to one of the above (see [elliptic curve choices](#elliptic-curve-choices)). + +* `make DEBUG=1` / define `DEBUG` + + Print additional information for debugging purposes. + +* `make LOWMEM=1` / define `LOWMEM` + + Limit the size of multi-exponentiation tables, for low-memory platforms. + +* `make NO_DOCS=1` + + Do not generate HTML documentation, e.g. on platforms where Markdown is not easily available. + +* `make NO_PROCPS=1` + + Do not link against libprocps. This disables memory profiling. + +* `make NO_GTEST=1` + + Do not link against GTest. The tutorial and test suite of gadgetlib2 tutorial won't be compiled. + +* `make NO_SUPERCOP=1` + + Do not link against SUPERCOP for optimized crypto. The ADSNARK executables will not be built. + +* `make MULTICORE=1` + + Enable parallelized execution of the ppzkSNARK generator and prover, using OpenMP. + This will utilize all cores on the CPU for heavyweight parallelizabe operations such as + FFT and multiexponentiation. The default is single-core. + + To override the maximum number of cores used, set the environment variable `OMP_NUM_THREADS` + at runtime (not compile time), e.g., `OMP_NUM_THREADS=8 test_r1cs_sp_ppzkpc`. It defaults + to the autodetected number of cores, but on some devices, dynamic core management confused + OpenMP's autodetection, so setting `OMP_NUM_THREADS` is necessary for full utilization. + +* define `NO_PT_COMPRESSION` + + Do not use point compression. + This gives much faster serialization times, at the expense of ~2x larger + sizes for serialized keys and proofs. + +* define `MONTGOMERY_OUTPUT` (on by default) + + Serialize Fp elements as their Montgomery representations. If this + option is disabled then Fp elements are serialized as their + equivalence classes, which is slower but produces human-readable + output. + +* `make PROFILE_OP_COUNTS=1` / define `PROFILE_OP_COUNTS` + + Collect counts for field and curve operations inside static variables + of the corresponding algebraic objects. This option works for all + curves except bn128. + +* define `USE_ASM` (on by default) + + Use unrolled assembly routines for F[p] arithmetic and faster heap in + multi-exponentiation. (When not set, use GMP's `mpn_*` routines instead.) + +* define `USE_MIXED_ADDITION` + + Convert each element of the proving key and verification key to + affine coordinates. This allows using mixed addition formulas in + multiexponentiation and results in slightly faster prover and + verifier runtime at expense of increased proving time. + +* `make PERFORMANCE=1` + + Enables compiler optimizations such as link-time optimization, and disables debugging aids. + (On some distributions this causes a `plugin needed to handle lto object` link error and `undefined reference`s, which can be remedied by `AR=gcc-ar make ...`.) + +Not all combinations are tested together or supported by every part of the codebase. + + +-------------------------------------------------------------------------------- +Portability +-------------------------------------------------------------------------------- + +libsnark is written in fairly standard C++11. + +However, having been developed on Linux on x86-64 CPUs, libsnark has some limitations +with respect to portability. Specifically: + +1. libsnark's algebraic data structures assume little-endian byte order. + +2. Profiling routines use `clock_gettime` and `readproc` calls, which are Linux-specific. + +3. Random-number generation is done by reading from `/dev/urandom`, which is + specific to Unix-like systems. + +4. libsnark binary serialization routines (see `BINARY_OUTPUT` above) assume + a fixed machine word size (i.e. sizeof(mp_limb_t) for GMP's limb data type). + Objects serialized in binary on a 64-bit system cannot be de-serialized on + a 32-bit system, and vice versa. + (The decimal serialization routines have no such limitation.) + +5. libsnark requires a C++ compiler with good C++11 support. It has been + tested with g++ 4.7, g++ 4.8, and clang 3.4. + +6. On x86-64, we by default use highly optimized assembly implementations for some + operations (see `USE_ASM` above). On other architectures we fall back to a + portable C++ implementation, which is slower. + +Tested configurations include: + +* Debian jessie with g++ 4.7 on x86-64 +* Debian jessie with clang 3.4 on x86-64 +* Fedora 20/21 with g++ 4.8.2/4.9.2 on x86-64 and i686 +* Ubuntu 14.04 LTS with g++ 4.8 on x86-64 +* Ubuntu 14.04 LTS with g++ 4.8 on x86-32, for EDWARDS and ALT_BN128 curve choices +* Debian wheezy with g++ 4.7 on ARM little endian (Debian armel port) inside QEMU, for EDWARDS and ALT_BN128 curve choices +* Windows 7 with g++ 4.8.3 under Cygwin 1.7.30 on x86-64 with NO_PROCPS=1, NO_GTEST=1 and NO_DOCS=1, for EDWARDS and ALT_BN128 curve choices +* Mac OS X 10.9.4 (Mavericks) with Apple LLVM version 5.1 (based on LLVM 3.4svn) on x86-64 with NO_PROCPS=1, NO_GTEST=1 and NO_DOCS=1 + + +-------------------------------------------------------------------------------- +Directory structure +-------------------------------------------------------------------------------- + +The directory structure of the libsnark library is as follows: + +* src/ --- main C++ source code, containing the following modules: + * algebra/ --- fields and elliptic curve groups + * common/ --- miscellaneous utilities + * gadgetlib1/ --- gadgetlib1, a library to construct R1CS instances + * gadgets/ --- basic gadgets for gadgetlib1 + * gadgetlib2/ --- gadgetlib2, a library to construct R1CS instances + * qap/ --- quadratic arithmetic program + * domains/ --- support for fast interpolation/evaluation, by providing + FFTs and Lagrange-coefficient computations for various domains + * relations/ --- interfaces for expressing statement (relations between instances and witnesses) as various NP-complete languages + * constraint_satisfaction_problems/ --- R1CS and USCS languages + * circuit_satisfaction_problems/ --- Boolean and arithmetic circuit satisfiability languages + * ram_computations/ --- RAM computation languages + * zk_proof_systems --- interfaces and implementations of the proof systems + * reductions --- reductions between languages (used internally, but contains many examples of building constraints) + + Some of these module directories have the following subdirectories: + + * ... + * examples/ --- example code and tutorials for this module + * tests/ --- unit tests for this module + + In particular, the top-level API examples are at `src/r1cs_ppzksnark/examples/` and `src/gadgetlib2/examples/`. + +* depsrc/ --- created by `prepare_depends.sh` for retrieved sourcecode and local builds of external code + (currently: \[ate-pairing], and its dependency xbyak). + +* depinst/ --- created by `prepare_depends.sh` and `Makefile` + for local installation of locally-compiled dependencies. + +* doxygen/ --- created by `make doxy` and contains a Doxygen summary of all files, classes etc. in libsnark. + + +-------------------------------------------------------------------------------- +Further considerations +-------------------------------------------------------------------------------- + +### Multiexponentiation window size + +The ppzkSNARK's generator has to solve a fixed-base multi-exponentiation +problem. We use a window-based method in which the optimal window size depends +on the size of the multiexponentiation instance *and* the platform. + +On our benchmarking platform (a 3.40 GHz Intel Core i7-4770 CPU), we have +computed for each curve optimal windows, provided as +"fixed_base_exp_window_table" initialization sequences, for each curve; see +`X_init.cpp` for X=edwards,bn128,alt_bn128. + +Performance on other platforms may not be optimal (but probably not be far off). +Future releases of the libsnark library will include a tool that generates +optimal window sizes. + + +-------------------------------------------------------------------------------- +References +-------------------------------------------------------------------------------- + +\[BBFR15] [ + _ADSNARK: nearly practical and privacy-preserving proofs on authenticated data_ +](https://eprint.iacr.org/2014/617), + Michael Backes, Manuel Barbosa, Dario Fiore, Raphael M. Reischuk, + IEEE Symposium on Security and Privacy (Oakland) 2015 + +\[BCCT12] [ + _From extractable collision resistance to succinct non-Interactive arguments of knowledge, and back again_ +](http://eprint.iacr.org/2011/443), + Nir Bitansky, Ran Canetti, Alessandro Chiesa, Eran Tromer, + Innovations in Computer Science (ITCS) 2012 + +\[BCCT13] [ + _Recursive composition and bootstrapping for SNARKs and proof-carrying data_ +](http://eprint.iacr.org/2012/095) + Nir Bitansky, Ran Canetti, Alessandro Chiesa, Eran Tromer, + Symposium on Theory of Computing (STOC) 13 + +\[BCGTV13] [ + _SNARKs for C: Verifying Program Executions Succinctly and in Zero Knowledge_ +](http://eprint.iacr.org/2013/507), + Eli Ben-Sasson, Alessandro Chiesa, Daniel Genkin, Eran Tromer, Madars Virza, + CRYPTO 2013 + +\[BCIOP13] [ + _Succinct Non-Interactive Arguments via Linear Interactive Proofs_ +](http://eprint.iacr.org/2012/718), + Nir Bitansky, Alessandro Chiesa, Yuval Ishai, Rafail Ostrovsky, Omer Paneth, + Theory of Cryptography Conference 2013 + +\[BCTV14a] [ + _Succinct Non-Interactive Zero Knowledge for a von Neumann Architecture_ +](http://eprint.iacr.org/2013/879), + Eli Ben-Sasson, Alessandro Chiesa, Eran Tromer, Madars Virza, + USENIX Security 2014 + +\[BCTV14b] [ + _Scalable succinct non-interactive arguments via cycles of elliptic curves_ +](https://eprint.iacr.org/2014/595), + Eli Ben-Sasson, Alessandro Chiesa, Eran Tromer, Madars Virza, + CRYPTO 2014 + +\[CTV15] [ + _Cluster computing in zero knowledge_ +](https://eprint.iacr.org/2015/377), + Alessandro Chiesa, Eran Tromer, Madars Virza, + Eurocrypt 2015 + +\[DFGK14] [ + Square span programs with applications to succinct NIZK arguments +](https://eprint.iacr.org/2014/718), + George Danezis, Cedric Fournet, Jens Groth, Markulf Kohlweiss, + ASIACCS 2014 + +\[GGPR13] [ + _Quadratic span programs and succinct NIZKs without PCPs_ +](http://eprint.iacr.org/2012/215), + Rosario Gennaro, Craig Gentry, Bryan Parno, Mariana Raykova, + EUROCRYPT 2013 + +\[ate-pairing] [ + _High-Speed Software Implementation of the Optimal Ate Pairing over Barreto-Naehrig Curves_ +](https://github.com/herumi/ate-pairing), + MITSUNARI Shigeo, TERUYA Tadanori + +\[PGHR13] [ + _Pinocchio: Nearly Practical Verifiable Computation_ +](http://eprint.iacr.org/2013/279), + Bryan Parno, Craig Gentry, Jon Howell, Mariana Raykova, + IEEE Symposium on Security and Privacy (Oakland) 2013 + +[SCIPR Lab]: http://www.scipr-lab.org/ (Succinct Computational Integrity and Privacy Research Lab) + +[LICENSE]: LICENSE (LICENSE file in top directory of libsnark distribution) + +[AUTHORS]: AUTHORS (AUTHORS file in top directory of libsnark distribution) diff --git a/doxygen.conf b/doxygen.conf new file mode 100644 index 000000000..5fbe61681 --- /dev/null +++ b/doxygen.conf @@ -0,0 +1,1807 @@ +# Doxyfile 1.8.2 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or sequence of words) that should +# identify the project. Note that if you do not use Doxywizard you need +# to put quotes around the project name if it contains spaces. + +PROJECT_NAME = libsnark + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer +# a quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = + +# With the PROJECT_LOGO tag one can specify an logo or icon that is +# included in the documentation. The maximum height of the logo should not +# exceed 55 pixels and the maximum width should not exceed 200 pixels. +# Doxygen will copy the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, +# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. Note that you specify absolute paths here, but also +# relative paths, which will be relative from the directory where doxygen is +# started. + +STRIP_FROM_PATH = src + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful if your file system +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = YES + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding +# "class=itcl::class" will allow you to use the command class in the +# itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, +# and language is one of the parsers supported by doxygen: IDL, Java, +# Javascript, CSharp, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, +# C++. For instance to make doxygen treat .inc files as Fortran files (default +# is PHP), and .f files as C (default is Fortran), use: inc=Fortran f=C. Note +# that for custom extensions you also need to set FILE_PATTERNS otherwise the +# files are not read by doxygen. + +EXTENSION_MAPPING = tcc=C++ + +# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all +# comments according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you +# can mix doxygen, HTML, and XML commands with Markdown formatting. +# Disable only in case of backward compatibilities issues. + +MARKDOWN_SUPPORT = YES + +# When enabled doxygen tries to link words that correspond to documented classes, +# or namespaces to their corresponding documentation. Such a link can be +# prevented in individual cases by by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also makes the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES (the +# default) will make doxygen replace the get and set methods by a property in +# the documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and +# unions are shown inside the group in which they are included (e.g. using +# @ingroup) instead of on a separate page (for HTML and Man pages) or +# section (for LaTeX and RTF). + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and +# unions with only public data fields will be shown inline in the documentation +# of the scope in which they are defined (i.e. file, namespace, or group +# documentation), provided this scope is documented. If set to NO (the default), +# structs, classes, and unions are shown on a separate page (for HTML and Man +# pages) or section (for LaTeX and RTF). + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penalty. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will roughly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols. + +SYMBOL_CACHE_SIZE = 0 + +# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be +# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given +# their name and scope. Since this can be an expensive process and often the +# same symbol appear multiple times in the code, doxygen keeps a cache of +# pre-resolved symbols. If the cache is too small doxygen will become slower. +# If the cache is too large, memory is wasted. The cache size is given by this +# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = YES + +# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal +# scope will be included in the documentation. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespaces are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation +# rather than with sharp brackets. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen +# will sort the (brief and detailed) documentation of class members so that +# constructors and destructors are listed first. If set to NO (the default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to +# do proper type resolution of all parameters of a function it will reject a +# match between the prototype and the implementation of a member function even +# if there is only one candidate or it is obvious which candidate to choose +# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen +# will still accept a match between prototype and implementation in such cases. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or macro consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and macros in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. +# You can optionally specify a file name after the option, if omitted +# DoxygenLayout.xml will be used as the name of the layout file. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files +# containing the references data. This must be a list of .bib files. The +# .bib extension is automatically appended if omitted. Using this command +# requires the bibtex tool to be installed. See also +# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style +# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this +# feature you need bibtex and perl available in the search path. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_NO_PARAMDOC option can be enabled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = src README.md + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh +# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py +# *.f90 *.f *.for *.vhd *.vhdl + +FILE_PATTERNS = *.md *.c *.h *.cpp *.hpp *.tcc *.inc *.cc + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = Debug \ + Release + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = "perl -pe 's/^(libsnark: .*)$/$1 {#mainpage}/ if $.==1; s!//+ *(TODO|FIXME|XXX)!/// \\todo!'" + # The 1st replacement marks README.md as the main page. + # The 2nd replacement identifies additional TODO notations. + # These should be done with FILTER_PATTERNS instead, but it looks like shell escaping is different there. + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty or if +# non of the patterns match the file name, INPUT_FILTER is applied. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) +# and it is also possible to disable source filtering for a specific pattern +# using *.ext= (so without naming a filter). This option only has effect when +# FILTER_SOURCE_FILES is enabled. + +FILTER_SOURCE_PATTERNS = + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = YES + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C, C++ and Fortran comments will always remain visible. + +STRIP_CODE_COMMENTS = NO + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = doxygen + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. Note that when using a custom header you are responsible +# for the proper inclusion of any scripts and style sheets that doxygen +# needs, which is dependent on the configuration options used. +# It is advised to generate a default header using "doxygen -w html +# header.html footer.html stylesheet.css YourConfigFile" and then modify +# that header. Note that the header is subject to change so you typically +# have to redo this when upgrading to a newer version of doxygen or when +# changing the value of configuration settings such as GENERATE_TREEVIEW! + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If left blank doxygen will +# generate a default style sheet. Note that it is recommended to use +# HTML_EXTRA_STYLESHEET instead of this one, as it is more robust and this +# tag will in the future become obsolete. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional +# user-defined cascading style sheet that is included after the standard +# style sheets created by doxygen. Using this option one can overrule +# certain style aspects. This is preferred over using HTML_STYLESHEET +# since it does not replace the standard style sheet and is therefor more +# robust against future updates. Doxygen will copy the style sheet file to +# the output directory. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that +# the files will be copied as-is; there are no commands or markers available. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. +# Doxygen will adjust the colors in the style sheet and background images +# according to this color. Hue is specified as an angle on a colorwheel, +# see http://en.wikipedia.org/wiki/Hue for more information. +# For instance the value 0 represents red, 60 is yellow, 120 is green, +# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. +# The allowed range is 0 to 359. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of +# the colors in the HTML output. For a value of 0 the output will use +# grayscales only. A value of 255 will produce the most vivid colors. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to +# the luminance component of the colors in the HTML output. Values below +# 100 gradually make the output lighter, whereas values above 100 make +# the output darker. The value divided by 100 is the actual gamma applied, +# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, +# and 100 does not change the gamma. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting +# this to NO can help when comparing the output of multiple runs. + +HTML_TIMESTAMP = NO + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of +# entries shown in the various tree structured indices initially; the user +# can expand and collapse entries dynamically later on. Doxygen will expand +# the tree to such a level that at most the specified number of entries are +# visible (unless a fully collapsed tree already exceeds this amount). +# So setting the number of entries 1 will produce a full collapsed tree by +# default. 0 is a special value representing an infinite number of entries +# and will result in a full expanded tree by default. + +HTML_INDEX_NUM_ENTRIES = 0 + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely +# identify the documentation publisher. This should be a reverse domain-name +# style string, e.g. com.mycompany.MyDocSet.documentation. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated +# that can be used as input for Qt's qhelpgenerator to generate a +# Qt Compressed Help (.qch) of the generated HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to +# add. For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see +# +# Qt Help Project / Custom Filters. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's +# filter section matches. +# +# Qt Help Project / Filter Attributes. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before +# the help appears. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have +# this name. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) +# at top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. Since the tabs have the same information as the +# navigation tree you can set this option to NO if you already set +# GENERATE_TREEVIEW to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to YES, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). +# Windows users are probably better off using the HTML help feature. +# Since the tree basically has the same information as the tab index you +# could consider to set DISABLE_INDEX to NO when enabling this option. + +GENERATE_TREEVIEW = YES + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values +# (range [0,1..20]) that doxygen will group on one line in the generated HTML +# documentation. Note that a value of 0 will completely suppress the enum +# values from appearing in the overview section. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open +# links to external symbols imported via tag files in a separate window. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are +# not supported properly for IE 6.0, but are supported on all modern browsers. +# Note that when changing this option you need to delete any form_*.png files +# in the HTML output before the changes have effect. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax +# (see http://www.mathjax.org) which uses client side Javascript for the +# rendering instead of using prerendered bitmaps. Use this if you do not +# have LaTeX installed or if you want to formulas look prettier in the HTML +# output. When enabled you may also need to install MathJax separately and +# configure the path to it using the MATHJAX_RELPATH option. + +USE_MATHJAX = YES + +# When MathJax is enabled you need to specify the location relative to the +# HTML output directory using the MATHJAX_RELPATH option. The destination +# directory should contain the MathJax.js script. For instance, if the mathjax +# directory is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to +# the MathJax Content Delivery Network so you can quickly see the result without +# installing MathJax. However, it is strongly recommended to install a local +# copy of MathJax from http://www.mathjax.org before deployment. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension +# names that should be enabled during MathJax rendering. + +MATHJAX_EXTENSIONS = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box +# for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets +# (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. + +SEARCHENGINE = YES + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a PHP enabled web server instead of at the web client +# using Javascript. Doxygen will generate the search PHP script and index +# file to put on the web server. The advantage of the server +# based approach is that it scales better to large projects and allows +# full text search. The disadvantages are that it is more difficult to setup +# and does not have live searching capabilities. + +SERVER_BASED_SEARCH = NO + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the +# Makefile that is written to the output directory. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4 + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = amsfonts + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for +# the generated latex document. The footer should contain everything after +# the last chapter. If it is left blank doxygen will generate a +# standard footer. Notice: only use this tag if you know what you are doing! + +LATEX_FOOTER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. + +LATEX_SOURCE_CODE = NO + +# The LATEX_BIB_STYLE tag can be used to specify the style to use for the +# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See +# http://en.wikipedia.org/wiki/BibTeX for more info. + +LATEX_BIB_STYLE = plain + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load style sheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# pointed to by INCLUDE_PATH will be searched when a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition that +# overrules the definition found in the source code. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all references to function-like macros +# that are alone on a line, have an all uppercase name, and do not end with a +# semicolon, because these will confuse the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. For each +# tag file the location of the external documentation should be added. The +# format of a tag file without this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths +# or URLs. Note that each tag file must have a unique name (where the name does +# NOT include the path). If a tag file is not located in the directory in which +# doxygen is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option also works with HAVE_DOT disabled, but it is recommended to +# install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = NO + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = YES + +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is +# allowed to run in parallel. When set to 0 (the default) doxygen will +# base this on the number of processors available in the system. You can set it +# explicitly to a value larger than 0 to get control over the balance +# between CPU load and processing speed. + +DOT_NUM_THREADS = 0 + +# By default doxygen will use the Helvetica font for all dot files that +# doxygen generates. When you want a differently looking font you can specify +# the font name using DOT_FONTNAME. You need to make sure dot is able to find +# the font, which can be done by putting it in a standard location or by setting +# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# directory containing the font. + +DOT_FONTNAME = Helvetica + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the Helvetica font. +# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to +# set the path where dot can find it. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If the UML_LOOK tag is enabled, the fields and methods are shown inside +# the class node. If there are many fields or methods and many nodes the +# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS +# threshold limits the number of items for each type to make the size more +# managable. Set this to 0 for no limit. Note that the threshold may be +# exceeded by 50% before the limit is enforced. + +UML_LIMIT_NUM_FIELDS = 10 + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = YES + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = YES + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will generate a graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are svg, png, jpg, or gif. +# If left blank png will be used. If you choose svg you need to set +# HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible in IE 9+ (other browsers do not have this requirement). + +DOT_IMAGE_FORMAT = png + +# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to +# enable generation of interactive SVG images that allow zooming and panning. +# Note that this requires a modern browser other than Internet Explorer. +# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you +# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible. Older versions of IE do not have SVG support. + +INTERACTIVE_SVG = NO + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the +# \mscfile command). + +MSCFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES diff --git a/src/algebra/curves/alt_bn128/alt_bn128_g1.cpp b/src/algebra/curves/alt_bn128/alt_bn128_g1.cpp new file mode 100644 index 000000000..bf7f43d6f --- /dev/null +++ b/src/algebra/curves/alt_bn128/alt_bn128_g1.cpp @@ -0,0 +1,524 @@ +/** @file + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#include "algebra/curves/alt_bn128/alt_bn128_g1.hpp" + +namespace libsnark { + +#ifdef PROFILE_OP_COUNTS +long long alt_bn128_G1::add_cnt = 0; +long long alt_bn128_G1::dbl_cnt = 0; +#endif + +std::vector alt_bn128_G1::wnaf_window_table; +std::vector alt_bn128_G1::fixed_base_exp_window_table; +alt_bn128_G1 alt_bn128_G1::G1_zero; +alt_bn128_G1 alt_bn128_G1::G1_one; + +alt_bn128_G1::alt_bn128_G1() +{ + this->X = G1_zero.X; + this->Y = G1_zero.Y; + this->Z = G1_zero.Z; +} + +void alt_bn128_G1::print() const +{ + if (this->is_zero()) + { + printf("O\n"); + } + else + { + alt_bn128_G1 copy(*this); + copy.to_affine_coordinates(); + gmp_printf("(%Nd , %Nd)\n", + copy.X.as_bigint().data, alt_bn128_Fq::num_limbs, + copy.Y.as_bigint().data, alt_bn128_Fq::num_limbs); + } +} + +void alt_bn128_G1::print_coordinates() const +{ + if (this->is_zero()) + { + printf("O\n"); + } + else + { + gmp_printf("(%Nd : %Nd : %Nd)\n", + this->X.as_bigint().data, alt_bn128_Fq::num_limbs, + this->Y.as_bigint().data, alt_bn128_Fq::num_limbs, + this->Z.as_bigint().data, alt_bn128_Fq::num_limbs); + } +} + +void alt_bn128_G1::to_affine_coordinates() +{ + if (this->is_zero()) + { + this->X = alt_bn128_Fq::zero(); + this->Y = alt_bn128_Fq::one(); + this->Z = alt_bn128_Fq::zero(); + } + else + { + alt_bn128_Fq Z_inv = Z.inverse(); + alt_bn128_Fq Z2_inv = Z_inv.squared(); + alt_bn128_Fq Z3_inv = Z2_inv * Z_inv; + this->X = this->X * Z2_inv; + this->Y = this->Y * Z3_inv; + this->Z = alt_bn128_Fq::one(); + } +} + +void alt_bn128_G1::to_special() +{ + this->to_affine_coordinates(); +} + +bool alt_bn128_G1::is_special() const +{ + return (this->is_zero() || this->Z == alt_bn128_Fq::one()); +} + +bool alt_bn128_G1::is_zero() const +{ + return (this->Z.is_zero()); +} + +bool alt_bn128_G1::operator==(const alt_bn128_G1 &other) const +{ + if (this->is_zero()) + { + return other.is_zero(); + } + + if (other.is_zero()) + { + return false; + } + + /* now neither is O */ + + // using Jacobian coordinates so: + // (X1:Y1:Z1) = (X2:Y2:Z2) + // iff + // X1/Z1^2 == X2/Z2^2 and Y1/Z1^3 == Y2/Z2^3 + // iff + // X1 * Z2^2 == X2 * Z1^2 and Y1 * Z2^3 == Y2 * Z1^3 + + alt_bn128_Fq Z1_squared = (this->Z).squared(); + alt_bn128_Fq Z2_squared = (other.Z).squared(); + + if ((this->X * Z2_squared) != (other.X * Z1_squared)) + { + return false; + } + + alt_bn128_Fq Z1_cubed = (this->Z) * Z1_squared; + alt_bn128_Fq Z2_cubed = (other.Z) * Z2_squared; + + if ((this->Y * Z2_cubed) != (other.Y * Z1_cubed)) + { + return false; + } + + return true; +} + +bool alt_bn128_G1::operator!=(const alt_bn128_G1& other) const +{ + return !(operator==(other)); +} + +alt_bn128_G1 alt_bn128_G1::operator+(const alt_bn128_G1 &other) const +{ + // handle special cases having to do with O + if (this->is_zero()) + { + return other; + } + + if (other.is_zero()) + { + return *this; + } + + // no need to handle points of order 2,4 + // (they cannot exist in a prime-order subgroup) + + // check for doubling case + + // using Jacobian coordinates so: + // (X1:Y1:Z1) = (X2:Y2:Z2) + // iff + // X1/Z1^2 == X2/Z2^2 and Y1/Z1^3 == Y2/Z2^3 + // iff + // X1 * Z2^2 == X2 * Z1^2 and Y1 * Z2^3 == Y2 * Z1^3 + + alt_bn128_Fq Z1Z1 = (this->Z).squared(); + alt_bn128_Fq Z2Z2 = (other.Z).squared(); + + alt_bn128_Fq U1 = this->X * Z2Z2; + alt_bn128_Fq U2 = other.X * Z1Z1; + + alt_bn128_Fq Z1_cubed = (this->Z) * Z1Z1; + alt_bn128_Fq Z2_cubed = (other.Z) * Z2Z2; + + alt_bn128_Fq S1 = (this->Y) * Z2_cubed; // S1 = Y1 * Z2 * Z2Z2 + alt_bn128_Fq S2 = (other.Y) * Z1_cubed; // S2 = Y2 * Z1 * Z1Z1 + + if (U1 == U2 && S1 == S2) + { + // dbl case; nothing of above can be reused + return this->dbl(); + } + + // rest of add case + alt_bn128_Fq H = U2 - U1; // H = U2-U1 + alt_bn128_Fq S2_minus_S1 = S2-S1; + alt_bn128_Fq I = (H+H).squared(); // I = (2 * H)^2 + alt_bn128_Fq J = H * I; // J = H * I + alt_bn128_Fq r = S2_minus_S1 + S2_minus_S1; // r = 2 * (S2-S1) + alt_bn128_Fq V = U1 * I; // V = U1 * I + alt_bn128_Fq X3 = r.squared() - J - (V+V); // X3 = r^2 - J - 2 * V + alt_bn128_Fq S1_J = S1 * J; + alt_bn128_Fq Y3 = r * (V-X3) - (S1_J+S1_J); // Y3 = r * (V-X3)-2 S1 J + alt_bn128_Fq Z3 = ((this->Z+other.Z).squared()-Z1Z1-Z2Z2) * H; // Z3 = ((Z1+Z2)^2-Z1Z1-Z2Z2) * H + + return alt_bn128_G1(X3, Y3, Z3); +} + +alt_bn128_G1 alt_bn128_G1::operator-() const +{ + return alt_bn128_G1(this->X, -(this->Y), this->Z); +} + + +alt_bn128_G1 alt_bn128_G1::operator-(const alt_bn128_G1 &other) const +{ + return (*this) + (-other); +} + +alt_bn128_G1 alt_bn128_G1::add(const alt_bn128_G1 &other) const +{ + // handle special cases having to do with O + if (this->is_zero()) + { + return other; + } + + if (other.is_zero()) + { + return *this; + } + + // no need to handle points of order 2,4 + // (they cannot exist in a prime-order subgroup) + + // handle double case + if (this->operator==(other)) + { + return this->dbl(); + } + +#ifdef PROFILE_OP_COUNTS + this->add_cnt++; +#endif + // NOTE: does not handle O and pts of order 2,4 + // http://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#addition-add-2007-bl + + alt_bn128_Fq Z1Z1 = (this->Z).squared(); // Z1Z1 = Z1^2 + alt_bn128_Fq Z2Z2 = (other.Z).squared(); // Z2Z2 = Z2^2 + alt_bn128_Fq U1 = (this->X) * Z2Z2; // U1 = X1 * Z2Z2 + alt_bn128_Fq U2 = (other.X) * Z1Z1; // U2 = X2 * Z1Z1 + alt_bn128_Fq S1 = (this->Y) * (other.Z) * Z2Z2; // S1 = Y1 * Z2 * Z2Z2 + alt_bn128_Fq S2 = (other.Y) * (this->Z) * Z1Z1; // S2 = Y2 * Z1 * Z1Z1 + alt_bn128_Fq H = U2 - U1; // H = U2-U1 + alt_bn128_Fq S2_minus_S1 = S2-S1; + alt_bn128_Fq I = (H+H).squared(); // I = (2 * H)^2 + alt_bn128_Fq J = H * I; // J = H * I + alt_bn128_Fq r = S2_minus_S1 + S2_minus_S1; // r = 2 * (S2-S1) + alt_bn128_Fq V = U1 * I; // V = U1 * I + alt_bn128_Fq X3 = r.squared() - J - (V+V); // X3 = r^2 - J - 2 * V + alt_bn128_Fq S1_J = S1 * J; + alt_bn128_Fq Y3 = r * (V-X3) - (S1_J+S1_J); // Y3 = r * (V-X3)-2 S1 J + alt_bn128_Fq Z3 = ((this->Z+other.Z).squared()-Z1Z1-Z2Z2) * H; // Z3 = ((Z1+Z2)^2-Z1Z1-Z2Z2) * H + + return alt_bn128_G1(X3, Y3, Z3); +} + +alt_bn128_G1 alt_bn128_G1::mixed_add(const alt_bn128_G1 &other) const +{ +#ifdef DEBUG + assert(other.is_special()); +#endif + + // handle special cases having to do with O + if (this->is_zero()) + { + return other; + } + + if (other.is_zero()) + { + return *this; + } + + // no need to handle points of order 2,4 + // (they cannot exist in a prime-order subgroup) + + // check for doubling case + + // using Jacobian coordinates so: + // (X1:Y1:Z1) = (X2:Y2:Z2) + // iff + // X1/Z1^2 == X2/Z2^2 and Y1/Z1^3 == Y2/Z2^3 + // iff + // X1 * Z2^2 == X2 * Z1^2 and Y1 * Z2^3 == Y2 * Z1^3 + + // we know that Z2 = 1 + + const alt_bn128_Fq Z1Z1 = (this->Z).squared(); + + const alt_bn128_Fq &U1 = this->X; + const alt_bn128_Fq U2 = other.X * Z1Z1; + + const alt_bn128_Fq Z1_cubed = (this->Z) * Z1Z1; + + const alt_bn128_Fq &S1 = (this->Y); // S1 = Y1 * Z2 * Z2Z2 + const alt_bn128_Fq S2 = (other.Y) * Z1_cubed; // S2 = Y2 * Z1 * Z1Z1 + + if (U1 == U2 && S1 == S2) + { + // dbl case; nothing of above can be reused + return this->dbl(); + } + +#ifdef PROFILE_OP_COUNTS + this->add_cnt++; +#endif + + // NOTE: does not handle O and pts of order 2,4 + // http://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#addition-madd-2007-bl + alt_bn128_Fq H = U2-(this->X); // H = U2-X1 + alt_bn128_Fq HH = H.squared() ; // HH = H&2 + alt_bn128_Fq I = HH+HH; // I = 4*HH + I = I + I; + alt_bn128_Fq J = H*I; // J = H*I + alt_bn128_Fq r = S2-(this->Y); // r = 2*(S2-Y1) + r = r + r; + alt_bn128_Fq V = (this->X) * I ; // V = X1*I + alt_bn128_Fq X3 = r.squared()-J-V-V; // X3 = r^2-J-2*V + alt_bn128_Fq Y3 = (this->Y)*J; // Y3 = r*(V-X3)-2*Y1*J + Y3 = r*(V-X3) - Y3 - Y3; + alt_bn128_Fq Z3 = ((this->Z)+H).squared() - Z1Z1 - HH; // Z3 = (Z1+H)^2-Z1Z1-HH + + return alt_bn128_G1(X3, Y3, Z3); +} + +alt_bn128_G1 alt_bn128_G1::dbl() const +{ +#ifdef PROFILE_OP_COUNTS + this->dbl_cnt++; +#endif + // handle point at infinity + if (this->is_zero()) + { + return (*this); + } + + // no need to handle points of order 2,4 + // (they cannot exist in a prime-order subgroup) + + // NOTE: does not handle O and pts of order 2,4 + // http://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-dbl-2009-l + + alt_bn128_Fq A = (this->X).squared(); // A = X1^2 + alt_bn128_Fq B = (this->Y).squared(); // B = Y1^2 + alt_bn128_Fq C = B.squared(); // C = B^2 + alt_bn128_Fq D = (this->X + B).squared() - A - C; + D = D+D; // D = 2 * ((X1 + B)^2 - A - C) + alt_bn128_Fq E = A + A + A; // E = 3 * A + alt_bn128_Fq F = E.squared(); // F = E^2 + alt_bn128_Fq X3 = F - (D+D); // X3 = F - 2 D + alt_bn128_Fq eightC = C+C; + eightC = eightC + eightC; + eightC = eightC + eightC; + alt_bn128_Fq Y3 = E * (D - X3) - eightC; // Y3 = E * (D - X3) - 8 * C + alt_bn128_Fq Y1Z1 = (this->Y)*(this->Z); + alt_bn128_Fq Z3 = Y1Z1 + Y1Z1; // Z3 = 2 * Y1 * Z1 + + return alt_bn128_G1(X3, Y3, Z3); +} + +bool alt_bn128_G1::is_well_formed() const +{ + if (this->is_zero()) + { + return true; + } + else + { + /* + y^2 = x^3 + b + + We are using Jacobian coordinates, so equation we need to check is actually + + (y/z^3)^2 = (x/z^2)^3 + b + y^2 / z^6 = x^3 / z^6 + b + y^2 = x^3 + b z^6 + */ + alt_bn128_Fq X2 = this->X.squared(); + alt_bn128_Fq Y2 = this->Y.squared(); + alt_bn128_Fq Z2 = this->Z.squared(); + + alt_bn128_Fq X3 = this->X * X2; + alt_bn128_Fq Z3 = this->Z * Z2; + alt_bn128_Fq Z6 = Z3.squared(); + + return (Y2 == X3 + alt_bn128_coeff_b * Z6); + } +} + +alt_bn128_G1 alt_bn128_G1::zero() +{ + return G1_zero; +} + +alt_bn128_G1 alt_bn128_G1::one() +{ + return G1_one; +} + +alt_bn128_G1 alt_bn128_G1::random_element() +{ + return (scalar_field::random_element().as_bigint()) * G1_one; +} + +std::ostream& operator<<(std::ostream &out, const alt_bn128_G1 &g) +{ + alt_bn128_G1 copy(g); + copy.to_affine_coordinates(); + + out << (copy.is_zero() ? 1 : 0) << OUTPUT_SEPARATOR; +#ifdef NO_PT_COMPRESSION + out << copy.X << OUTPUT_SEPARATOR << copy.Y; +#else + /* storing LSB of Y */ + out << copy.X << OUTPUT_SEPARATOR << (copy.Y.as_bigint().data[0] & 1); +#endif + + return out; +} + +std::istream& operator>>(std::istream &in, alt_bn128_G1 &g) +{ + char is_zero; + alt_bn128_Fq tX, tY; + +#ifdef NO_PT_COMPRESSION + in >> is_zero >> tX >> tY; + is_zero -= '0'; +#else + in.read((char*)&is_zero, 1); // this reads is_zero; + is_zero -= '0'; + consume_OUTPUT_SEPARATOR(in); + + unsigned char Y_lsb; + in >> tX; + consume_OUTPUT_SEPARATOR(in); + in.read((char*)&Y_lsb, 1); + Y_lsb -= '0'; + + // y = +/- sqrt(x^3 + b) + if (!is_zero) + { + alt_bn128_Fq tX2 = tX.squared(); + alt_bn128_Fq tY2 = tX2*tX + alt_bn128_coeff_b; + tY = tY2.sqrt(); + + if ((tY.as_bigint().data[0] & 1) != Y_lsb) + { + tY = -tY; + } + } +#endif + // using Jacobian coordinates + if (!is_zero) + { + g.X = tX; + g.Y = tY; + g.Z = alt_bn128_Fq::one(); + } + else + { + g = alt_bn128_G1::zero(); + } + + return in; +} + +std::ostream& operator<<(std::ostream& out, const std::vector &v) +{ + out << v.size() << "\n"; + for (const alt_bn128_G1& t : v) + { + out << t << OUTPUT_NEWLINE; + } + + return out; +} + +std::istream& operator>>(std::istream& in, std::vector &v) +{ + v.clear(); + + size_t s; + in >> s; + consume_newline(in); + + v.reserve(s); + + for (size_t i = 0; i < s; ++i) + { + alt_bn128_G1 g; + in >> g; + consume_OUTPUT_NEWLINE(in); + v.emplace_back(g); + } + + return in; +} + +template<> +void batch_to_special_all_non_zeros(std::vector &vec) +{ + std::vector Z_vec; + Z_vec.reserve(vec.size()); + + for (auto &el: vec) + { + Z_vec.emplace_back(el.Z); + } + batch_invert(Z_vec); + + const alt_bn128_Fq one = alt_bn128_Fq::one(); + + for (size_t i = 0; i < vec.size(); ++i) + { + alt_bn128_Fq Z2 = Z_vec[i].squared(); + alt_bn128_Fq Z3 = Z_vec[i] * Z2; + + vec[i].X = vec[i].X * Z2; + vec[i].Y = vec[i].Y * Z3; + vec[i].Z = one; + } +} + +} // libsnark diff --git a/src/algebra/curves/alt_bn128/alt_bn128_g1.hpp b/src/algebra/curves/alt_bn128/alt_bn128_g1.hpp new file mode 100644 index 000000000..da11a2e8c --- /dev/null +++ b/src/algebra/curves/alt_bn128/alt_bn128_g1.hpp @@ -0,0 +1,95 @@ +/** @file + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef ALT_BN128_G1_HPP_ +#define ALT_BN128_G1_HPP_ +#include +#include "algebra/curves/alt_bn128/alt_bn128_init.hpp" +#include "algebra/curves/curve_utils.hpp" + +namespace libsnark { + +class alt_bn128_G1; +std::ostream& operator<<(std::ostream &, const alt_bn128_G1&); +std::istream& operator>>(std::istream &, alt_bn128_G1&); + +class alt_bn128_G1 { +public: +#ifdef PROFILE_OP_COUNTS + static long long add_cnt; + static long long dbl_cnt; +#endif + static std::vector wnaf_window_table; + static std::vector fixed_base_exp_window_table; + static alt_bn128_G1 G1_zero; + static alt_bn128_G1 G1_one; + + typedef alt_bn128_Fq base_field; + typedef alt_bn128_Fr scalar_field; + + alt_bn128_Fq X, Y, Z; + + // using Jacobian coordinates + alt_bn128_G1(); + alt_bn128_G1(const alt_bn128_Fq& X, const alt_bn128_Fq& Y, const alt_bn128_Fq& Z) : X(X), Y(Y), Z(Z) {}; + + void print() const; + void print_coordinates() const; + + void to_affine_coordinates(); + void to_special(); + bool is_special() const; + + bool is_zero() const; + + bool operator==(const alt_bn128_G1 &other) const; + bool operator!=(const alt_bn128_G1 &other) const; + + alt_bn128_G1 operator+(const alt_bn128_G1 &other) const; + alt_bn128_G1 operator-() const; + alt_bn128_G1 operator-(const alt_bn128_G1 &other) const; + + alt_bn128_G1 add(const alt_bn128_G1 &other) const; + alt_bn128_G1 mixed_add(const alt_bn128_G1 &other) const; + alt_bn128_G1 dbl() const; + + bool is_well_formed() const; + + static alt_bn128_G1 zero(); + static alt_bn128_G1 one(); + static alt_bn128_G1 random_element(); + + static size_t size_in_bits() { return base_field::size_in_bits() + 1; } + static bigint base_field_char() { return base_field::field_char(); } + static bigint order() { return scalar_field::field_char(); } + + friend std::ostream& operator<<(std::ostream &out, const alt_bn128_G1 &g); + friend std::istream& operator>>(std::istream &in, alt_bn128_G1 &g); +}; + +template +alt_bn128_G1 operator*(const bigint &lhs, const alt_bn128_G1 &rhs) +{ + return scalar_mul(rhs, lhs); +} + +template& modulus_p> +alt_bn128_G1 operator*(const Fp_model &lhs, const alt_bn128_G1 &rhs) +{ + return scalar_mul(rhs, lhs.as_bigint()); +} + +std::ostream& operator<<(std::ostream& out, const std::vector &v); +std::istream& operator>>(std::istream& in, std::vector &v); + +template +void batch_to_special_all_non_zeros(std::vector &vec); +template<> +void batch_to_special_all_non_zeros(std::vector &vec); + +} // libsnark +#endif // ALT_BN128_G1_HPP_ diff --git a/src/algebra/curves/alt_bn128/alt_bn128_g2.cpp b/src/algebra/curves/alt_bn128/alt_bn128_g2.cpp new file mode 100644 index 000000000..c4152e437 --- /dev/null +++ b/src/algebra/curves/alt_bn128/alt_bn128_g2.cpp @@ -0,0 +1,505 @@ +/** @file + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#include "algebra/curves/alt_bn128/alt_bn128_g2.hpp" + +namespace libsnark { + +#ifdef PROFILE_OP_COUNTS +long long alt_bn128_G2::add_cnt = 0; +long long alt_bn128_G2::dbl_cnt = 0; +#endif + +std::vector alt_bn128_G2::wnaf_window_table; +std::vector alt_bn128_G2::fixed_base_exp_window_table; +alt_bn128_G2 alt_bn128_G2::G2_zero; +alt_bn128_G2 alt_bn128_G2::G2_one; + +alt_bn128_G2::alt_bn128_G2() +{ + this->X = G2_zero.X; + this->Y = G2_zero.Y; + this->Z = G2_zero.Z; +} + +alt_bn128_Fq2 alt_bn128_G2::mul_by_b(const alt_bn128_Fq2 &elt) +{ + return alt_bn128_Fq2(alt_bn128_twist_mul_by_b_c0 * elt.c0, alt_bn128_twist_mul_by_b_c1 * elt.c1); +} + +void alt_bn128_G2::print() const +{ + if (this->is_zero()) + { + printf("O\n"); + } + else + { + alt_bn128_G2 copy(*this); + copy.to_affine_coordinates(); + gmp_printf("(%Nd*z + %Nd , %Nd*z + %Nd)\n", + copy.X.c1.as_bigint().data, alt_bn128_Fq::num_limbs, + copy.X.c0.as_bigint().data, alt_bn128_Fq::num_limbs, + copy.Y.c1.as_bigint().data, alt_bn128_Fq::num_limbs, + copy.Y.c0.as_bigint().data, alt_bn128_Fq::num_limbs); + } +} + +void alt_bn128_G2::print_coordinates() const +{ + if (this->is_zero()) + { + printf("O\n"); + } + else + { + gmp_printf("(%Nd*z + %Nd : %Nd*z + %Nd : %Nd*z + %Nd)\n", + this->X.c1.as_bigint().data, alt_bn128_Fq::num_limbs, + this->X.c0.as_bigint().data, alt_bn128_Fq::num_limbs, + this->Y.c1.as_bigint().data, alt_bn128_Fq::num_limbs, + this->Y.c0.as_bigint().data, alt_bn128_Fq::num_limbs, + this->Z.c1.as_bigint().data, alt_bn128_Fq::num_limbs, + this->Z.c0.as_bigint().data, alt_bn128_Fq::num_limbs); + } +} + +void alt_bn128_G2::to_affine_coordinates() +{ + if (this->is_zero()) + { + this->X = alt_bn128_Fq2::zero(); + this->Y = alt_bn128_Fq2::one(); + this->Z = alt_bn128_Fq2::zero(); + } + else + { + alt_bn128_Fq2 Z_inv = Z.inverse(); + alt_bn128_Fq2 Z2_inv = Z_inv.squared(); + alt_bn128_Fq2 Z3_inv = Z2_inv * Z_inv; + this->X = this->X * Z2_inv; + this->Y = this->Y * Z3_inv; + this->Z = alt_bn128_Fq2::one(); + } +} + +void alt_bn128_G2::to_special() +{ + this->to_affine_coordinates(); +} + +bool alt_bn128_G2::is_special() const +{ + return (this->is_zero() || this->Z == alt_bn128_Fq2::one()); +} + +bool alt_bn128_G2::is_zero() const +{ + return (this->Z.is_zero()); +} + +bool alt_bn128_G2::operator==(const alt_bn128_G2 &other) const +{ + if (this->is_zero()) + { + return other.is_zero(); + } + + if (other.is_zero()) + { + return false; + } + + /* now neither is O */ + + // using Jacobian coordinates so: + // (X1:Y1:Z1) = (X2:Y2:Z2) + // iff + // X1/Z1^2 == X2/Z2^2 and Y1/Z1^3 == Y2/Z2^3 + // iff + // X1 * Z2^2 == X2 * Z1^2 and Y1 * Z2^3 == Y2 * Z1^3 + + alt_bn128_Fq2 Z1_squared = (this->Z).squared(); + alt_bn128_Fq2 Z2_squared = (other.Z).squared(); + + if ((this->X * Z2_squared) != (other.X * Z1_squared)) + { + return false; + } + + alt_bn128_Fq2 Z1_cubed = (this->Z) * Z1_squared; + alt_bn128_Fq2 Z2_cubed = (other.Z) * Z2_squared; + + if ((this->Y * Z2_cubed) != (other.Y * Z1_cubed)) + { + return false; + } + + return true; +} + +bool alt_bn128_G2::operator!=(const alt_bn128_G2& other) const +{ + return !(operator==(other)); +} + +alt_bn128_G2 alt_bn128_G2::operator+(const alt_bn128_G2 &other) const +{ + // handle special cases having to do with O + if (this->is_zero()) + { + return other; + } + + if (other.is_zero()) + { + return *this; + } + + // no need to handle points of order 2,4 + // (they cannot exist in a prime-order subgroup) + + // check for doubling case + + // using Jacobian coordinates so: + // (X1:Y1:Z1) = (X2:Y2:Z2) + // iff + // X1/Z1^2 == X2/Z2^2 and Y1/Z1^3 == Y2/Z2^3 + // iff + // X1 * Z2^2 == X2 * Z1^2 and Y1 * Z2^3 == Y2 * Z1^3 + + alt_bn128_Fq2 Z1Z1 = (this->Z).squared(); + alt_bn128_Fq2 Z2Z2 = (other.Z).squared(); + + alt_bn128_Fq2 U1 = this->X * Z2Z2; + alt_bn128_Fq2 U2 = other.X * Z1Z1; + + alt_bn128_Fq2 Z1_cubed = (this->Z) * Z1Z1; + alt_bn128_Fq2 Z2_cubed = (other.Z) * Z2Z2; + + alt_bn128_Fq2 S1 = (this->Y) * Z2_cubed; // S1 = Y1 * Z2 * Z2Z2 + alt_bn128_Fq2 S2 = (other.Y) * Z1_cubed; // S2 = Y2 * Z1 * Z1Z1 + + if (U1 == U2 && S1 == S2) + { + // dbl case; nothing of above can be reused + return this->dbl(); + } + + // rest of add case + alt_bn128_Fq2 H = U2 - U1; // H = U2-U1 + alt_bn128_Fq2 S2_minus_S1 = S2-S1; + alt_bn128_Fq2 I = (H+H).squared(); // I = (2 * H)^2 + alt_bn128_Fq2 J = H * I; // J = H * I + alt_bn128_Fq2 r = S2_minus_S1 + S2_minus_S1; // r = 2 * (S2-S1) + alt_bn128_Fq2 V = U1 * I; // V = U1 * I + alt_bn128_Fq2 X3 = r.squared() - J - (V+V); // X3 = r^2 - J - 2 * V + alt_bn128_Fq2 S1_J = S1 * J; + alt_bn128_Fq2 Y3 = r * (V-X3) - (S1_J+S1_J); // Y3 = r * (V-X3)-2 S1 J + alt_bn128_Fq2 Z3 = ((this->Z+other.Z).squared()-Z1Z1-Z2Z2) * H; // Z3 = ((Z1+Z2)^2-Z1Z1-Z2Z2) * H + + return alt_bn128_G2(X3, Y3, Z3); +} + +alt_bn128_G2 alt_bn128_G2::operator-() const +{ + return alt_bn128_G2(this->X, -(this->Y), this->Z); +} + + +alt_bn128_G2 alt_bn128_G2::operator-(const alt_bn128_G2 &other) const +{ + return (*this) + (-other); +} + +alt_bn128_G2 alt_bn128_G2::add(const alt_bn128_G2 &other) const +{ + // handle special cases having to do with O + if (this->is_zero()) + { + return other; + } + + if (other.is_zero()) + { + return *this; + } + + // no need to handle points of order 2,4 + // (they cannot exist in a prime-order subgroup) + + // handle double case + if (this->operator==(other)) + { + return this->dbl(); + } + +#ifdef PROFILE_OP_COUNTS + this->add_cnt++; +#endif + // NOTE: does not handle O and pts of order 2,4 + // http://www.hyperelliptic.org/EFD/g1p/auto-shortw-projective.html#addition-add-1998-cmo-2 + + alt_bn128_Fq2 Z1Z1 = (this->Z).squared(); // Z1Z1 = Z1^2 + alt_bn128_Fq2 Z2Z2 = (other.Z).squared(); // Z2Z2 = Z2^2 + alt_bn128_Fq2 U1 = (this->X) * Z2Z2; // U1 = X1 * Z2Z2 + alt_bn128_Fq2 U2 = (other.X) * Z1Z1; // U2 = X2 * Z1Z1 + alt_bn128_Fq2 S1 = (this->Y) * (other.Z) * Z2Z2; // S1 = Y1 * Z2 * Z2Z2 + alt_bn128_Fq2 S2 = (other.Y) * (this->Z) * Z1Z1; // S2 = Y2 * Z1 * Z1Z1 + alt_bn128_Fq2 H = U2 - U1; // H = U2-U1 + alt_bn128_Fq2 S2_minus_S1 = S2-S1; + alt_bn128_Fq2 I = (H+H).squared(); // I = (2 * H)^2 + alt_bn128_Fq2 J = H * I; // J = H * I + alt_bn128_Fq2 r = S2_minus_S1 + S2_minus_S1; // r = 2 * (S2-S1) + alt_bn128_Fq2 V = U1 * I; // V = U1 * I + alt_bn128_Fq2 X3 = r.squared() - J - (V+V); // X3 = r^2 - J - 2 * V + alt_bn128_Fq2 S1_J = S1 * J; + alt_bn128_Fq2 Y3 = r * (V-X3) - (S1_J+S1_J); // Y3 = r * (V-X3)-2 S1 J + alt_bn128_Fq2 Z3 = ((this->Z+other.Z).squared()-Z1Z1-Z2Z2) * H; // Z3 = ((Z1+Z2)^2-Z1Z1-Z2Z2) * H + + return alt_bn128_G2(X3, Y3, Z3); +} + +alt_bn128_G2 alt_bn128_G2::mixed_add(const alt_bn128_G2 &other) const +{ +#ifdef DEBUG + assert(other.is_special()); +#endif + + // handle special cases having to do with O + if (this->is_zero()) + { + return other; + } + + if (other.is_zero()) + { + return *this; + } + + // no need to handle points of order 2,4 + // (they cannot exist in a prime-order subgroup) + + // check for doubling case + + // using Jacobian coordinates so: + // (X1:Y1:Z1) = (X2:Y2:Z2) + // iff + // X1/Z1^2 == X2/Z2^2 and Y1/Z1^3 == Y2/Z2^3 + // iff + // X1 * Z2^2 == X2 * Z1^2 and Y1 * Z2^3 == Y2 * Z1^3 + + // we know that Z2 = 1 + + const alt_bn128_Fq2 Z1Z1 = (this->Z).squared(); + + const alt_bn128_Fq2 &U1 = this->X; + const alt_bn128_Fq2 U2 = other.X * Z1Z1; + + const alt_bn128_Fq2 Z1_cubed = (this->Z) * Z1Z1; + + const alt_bn128_Fq2 &S1 = (this->Y); // S1 = Y1 * Z2 * Z2Z2 + const alt_bn128_Fq2 S2 = (other.Y) * Z1_cubed; // S2 = Y2 * Z1 * Z1Z1 + + if (U1 == U2 && S1 == S2) + { + // dbl case; nothing of above can be reused + return this->dbl(); + } + +#ifdef PROFILE_OP_COUNTS + this->add_cnt++; +#endif + + // NOTE: does not handle O and pts of order 2,4 + // http://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#addition-madd-2007-bl + alt_bn128_Fq2 H = U2-(this->X); // H = U2-X1 + alt_bn128_Fq2 HH = H.squared() ; // HH = H&2 + alt_bn128_Fq2 I = HH+HH; // I = 4*HH + I = I + I; + alt_bn128_Fq2 J = H*I; // J = H*I + alt_bn128_Fq2 r = S2-(this->Y); // r = 2*(S2-Y1) + r = r + r; + alt_bn128_Fq2 V = (this->X) * I ; // V = X1*I + alt_bn128_Fq2 X3 = r.squared()-J-V-V; // X3 = r^2-J-2*V + alt_bn128_Fq2 Y3 = (this->Y)*J; // Y3 = r*(V-X3)-2*Y1*J + Y3 = r*(V-X3) - Y3 - Y3; + alt_bn128_Fq2 Z3 = ((this->Z)+H).squared() - Z1Z1 - HH; // Z3 = (Z1+H)^2-Z1Z1-HH + + return alt_bn128_G2(X3, Y3, Z3); +} + +alt_bn128_G2 alt_bn128_G2::dbl() const +{ +#ifdef PROFILE_OP_COUNTS + this->dbl_cnt++; +#endif + // handle point at infinity + if (this->is_zero()) + { + return (*this); + } + + // NOTE: does not handle O and pts of order 2,4 + // http://www.hyperelliptic.org/EFD/g1p/auto-shortw-projective.html#doubling-dbl-2007-bl + + alt_bn128_Fq2 A = (this->X).squared(); // A = X1^2 + alt_bn128_Fq2 B = (this->Y).squared(); // B = Y1^2 + alt_bn128_Fq2 C = B.squared(); // C = B^2 + alt_bn128_Fq2 D = (this->X + B).squared() - A - C; + D = D+D; // D = 2 * ((X1 + B)^2 - A - C) + alt_bn128_Fq2 E = A + A + A; // E = 3 * A + alt_bn128_Fq2 F = E.squared(); // F = E^2 + alt_bn128_Fq2 X3 = F - (D+D); // X3 = F - 2 D + alt_bn128_Fq2 eightC = C+C; + eightC = eightC + eightC; + eightC = eightC + eightC; + alt_bn128_Fq2 Y3 = E * (D - X3) - eightC; // Y3 = E * (D - X3) - 8 * C + alt_bn128_Fq2 Y1Z1 = (this->Y)*(this->Z); + alt_bn128_Fq2 Z3 = Y1Z1 + Y1Z1; // Z3 = 2 * Y1 * Z1 + + return alt_bn128_G2(X3, Y3, Z3); +} + +alt_bn128_G2 alt_bn128_G2::mul_by_q() const +{ + return alt_bn128_G2(alt_bn128_twist_mul_by_q_X * (this->X).Frobenius_map(1), + alt_bn128_twist_mul_by_q_Y * (this->Y).Frobenius_map(1), + (this->Z).Frobenius_map(1)); +} + +bool alt_bn128_G2::is_well_formed() const +{ + if (this->is_zero()) + { + return true; + } + else + { + /* + y^2 = x^3 + b + + We are using Jacobian coordinates, so equation we need to check is actually + + (y/z^3)^2 = (x/z^2)^3 + b + y^2 / z^6 = x^3 / z^6 + b + y^2 = x^3 + b z^6 + */ + alt_bn128_Fq2 X2 = this->X.squared(); + alt_bn128_Fq2 Y2 = this->Y.squared(); + alt_bn128_Fq2 Z2 = this->Z.squared(); + + alt_bn128_Fq2 X3 = this->X * X2; + alt_bn128_Fq2 Z3 = this->Z * Z2; + alt_bn128_Fq2 Z6 = Z3.squared(); + + return (Y2 == X3 + alt_bn128_twist_coeff_b * Z6); + } +} + +alt_bn128_G2 alt_bn128_G2::zero() +{ + return G2_zero; +} + +alt_bn128_G2 alt_bn128_G2::one() +{ + return G2_one; +} + +alt_bn128_G2 alt_bn128_G2::random_element() +{ + return (alt_bn128_Fr::random_element().as_bigint()) * G2_one; +} + +std::ostream& operator<<(std::ostream &out, const alt_bn128_G2 &g) +{ + alt_bn128_G2 copy(g); + copy.to_affine_coordinates(); + out << (copy.is_zero() ? 1 : 0) << OUTPUT_SEPARATOR; +#ifdef NO_PT_COMPRESSION + out << copy.X << OUTPUT_SEPARATOR << copy.Y; +#else + /* storing LSB of Y */ + out << copy.X << OUTPUT_SEPARATOR << (copy.Y.c0.as_bigint().data[0] & 1); +#endif + + return out; +} + +std::istream& operator>>(std::istream &in, alt_bn128_G2 &g) +{ + char is_zero; + alt_bn128_Fq2 tX, tY; + +#ifdef NO_PT_COMPRESSION + in >> is_zero >> tX >> tY; + is_zero -= '0'; +#else + in.read((char*)&is_zero, 1); // this reads is_zero; + is_zero -= '0'; + consume_OUTPUT_SEPARATOR(in); + + unsigned char Y_lsb; + in >> tX; + consume_OUTPUT_SEPARATOR(in); + in.read((char*)&Y_lsb, 1); + Y_lsb -= '0'; + + // y = +/- sqrt(x^3 + b) + if (!is_zero) + { + alt_bn128_Fq2 tX2 = tX.squared(); + alt_bn128_Fq2 tY2 = tX2 * tX + alt_bn128_twist_coeff_b; + tY = tY2.sqrt(); + + if ((tY.c0.as_bigint().data[0] & 1) != Y_lsb) + { + tY = -tY; + } + } +#endif + // using projective coordinates + if (!is_zero) + { + g.X = tX; + g.Y = tY; + g.Z = alt_bn128_Fq2::one(); + } + else + { + g = alt_bn128_G2::zero(); + } + + return in; +} + +template<> +void batch_to_special_all_non_zeros(std::vector &vec) +{ + std::vector Z_vec; + Z_vec.reserve(vec.size()); + + for (auto &el: vec) + { + Z_vec.emplace_back(el.Z); + } + batch_invert(Z_vec); + + const alt_bn128_Fq2 one = alt_bn128_Fq2::one(); + + for (size_t i = 0; i < vec.size(); ++i) + { + alt_bn128_Fq2 Z2 = Z_vec[i].squared(); + alt_bn128_Fq2 Z3 = Z_vec[i] * Z2; + + vec[i].X = vec[i].X * Z2; + vec[i].Y = vec[i].Y * Z3; + vec[i].Z = one; + } +} + +} // libsnark diff --git a/src/algebra/curves/alt_bn128/alt_bn128_g2.hpp b/src/algebra/curves/alt_bn128/alt_bn128_g2.hpp new file mode 100644 index 000000000..a996a2d1a --- /dev/null +++ b/src/algebra/curves/alt_bn128/alt_bn128_g2.hpp @@ -0,0 +1,96 @@ +/** @file + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef ALT_BN128_G2_HPP_ +#define ALT_BN128_G2_HPP_ +#include +#include "algebra/curves/alt_bn128/alt_bn128_init.hpp" +#include "algebra/curves/curve_utils.hpp" + +namespace libsnark { + +class alt_bn128_G2; +std::ostream& operator<<(std::ostream &, const alt_bn128_G2&); +std::istream& operator>>(std::istream &, alt_bn128_G2&); + +class alt_bn128_G2 { +public: +#ifdef PROFILE_OP_COUNTS + static long long add_cnt; + static long long dbl_cnt; +#endif + static std::vector wnaf_window_table; + static std::vector fixed_base_exp_window_table; + static alt_bn128_G2 G2_zero; + static alt_bn128_G2 G2_one; + + typedef alt_bn128_Fq base_field; + typedef alt_bn128_Fq2 twist_field; + typedef alt_bn128_Fr scalar_field; + + alt_bn128_Fq2 X, Y, Z; + + // using Jacobian coordinates + alt_bn128_G2(); + alt_bn128_G2(const alt_bn128_Fq2& X, const alt_bn128_Fq2& Y, const alt_bn128_Fq2& Z) : X(X), Y(Y), Z(Z) {}; + + static alt_bn128_Fq2 mul_by_b(const alt_bn128_Fq2 &elt); + + void print() const; + void print_coordinates() const; + + void to_affine_coordinates(); + void to_special(); + bool is_special() const; + + bool is_zero() const; + + bool operator==(const alt_bn128_G2 &other) const; + bool operator!=(const alt_bn128_G2 &other) const; + + alt_bn128_G2 operator+(const alt_bn128_G2 &other) const; + alt_bn128_G2 operator-() const; + alt_bn128_G2 operator-(const alt_bn128_G2 &other) const; + + alt_bn128_G2 add(const alt_bn128_G2 &other) const; + alt_bn128_G2 mixed_add(const alt_bn128_G2 &other) const; + alt_bn128_G2 dbl() const; + alt_bn128_G2 mul_by_q() const; + + bool is_well_formed() const; + + static alt_bn128_G2 zero(); + static alt_bn128_G2 one(); + static alt_bn128_G2 random_element(); + + static size_t size_in_bits() { return twist_field::size_in_bits() + 1; } + static bigint base_field_char() { return base_field::field_char(); } + static bigint order() { return scalar_field::field_char(); } + + friend std::ostream& operator<<(std::ostream &out, const alt_bn128_G2 &g); + friend std::istream& operator>>(std::istream &in, alt_bn128_G2 &g); +}; + +template +alt_bn128_G2 operator*(const bigint &lhs, const alt_bn128_G2 &rhs) +{ + return scalar_mul(rhs, lhs); +} + +template& modulus_p> +alt_bn128_G2 operator*(const Fp_model &lhs, const alt_bn128_G2 &rhs) +{ + return scalar_mul(rhs, lhs.as_bigint()); +} + +template +void batch_to_special_all_non_zeros(std::vector &vec); +template<> +void batch_to_special_all_non_zeros(std::vector &vec); + +} // libsnark +#endif // ALT_BN128_G2_HPP_ diff --git a/src/algebra/curves/alt_bn128/alt_bn128_init.cpp b/src/algebra/curves/alt_bn128/alt_bn128_init.cpp new file mode 100644 index 000000000..7c23773d6 --- /dev/null +++ b/src/algebra/curves/alt_bn128/alt_bn128_init.cpp @@ -0,0 +1,273 @@ +/** @file + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#include "algebra/curves/alt_bn128/alt_bn128_init.hpp" +#include "algebra/curves/alt_bn128/alt_bn128_g1.hpp" +#include "algebra/curves/alt_bn128/alt_bn128_g2.hpp" + +namespace libsnark { + +bigint alt_bn128_modulus_r; +bigint alt_bn128_modulus_q; + +alt_bn128_Fq alt_bn128_coeff_b; +alt_bn128_Fq2 alt_bn128_twist; +alt_bn128_Fq2 alt_bn128_twist_coeff_b; +alt_bn128_Fq alt_bn128_twist_mul_by_b_c0; +alt_bn128_Fq alt_bn128_twist_mul_by_b_c1; +alt_bn128_Fq2 alt_bn128_twist_mul_by_q_X; +alt_bn128_Fq2 alt_bn128_twist_mul_by_q_Y; + +bigint alt_bn128_ate_loop_count; +bool alt_bn128_ate_is_loop_count_neg; +bigint<12*alt_bn128_q_limbs> alt_bn128_final_exponent; +bigint alt_bn128_final_exponent_z; +bool alt_bn128_final_exponent_is_z_neg; + +void init_alt_bn128_params() +{ + typedef bigint bigint_r; + typedef bigint bigint_q; + + assert(sizeof(mp_limb_t) == 8 || sizeof(mp_limb_t) == 4); // Montgomery assumes this + + /* parameters for scalar field Fr */ + + alt_bn128_modulus_r = bigint_r("21888242871839275222246405745257275088548364400416034343698204186575808495617"); + assert(alt_bn128_Fr::modulus_is_valid()); + if (sizeof(mp_limb_t) == 8) + { + alt_bn128_Fr::Rsquared = bigint_r("944936681149208446651664254269745548490766851729442924617792859073125903783"); + alt_bn128_Fr::Rcubed = bigint_r("5866548545943845227489894872040244720403868105578784105281690076696998248512"); + alt_bn128_Fr::inv = 0xc2e1f593efffffff; + } + if (sizeof(mp_limb_t) == 4) + { + alt_bn128_Fr::Rsquared = bigint_r("944936681149208446651664254269745548490766851729442924617792859073125903783"); + alt_bn128_Fr::Rcubed = bigint_r("5866548545943845227489894872040244720403868105578784105281690076696998248512"); + alt_bn128_Fr::inv = 0xefffffff; + } + alt_bn128_Fr::num_bits = 254; + alt_bn128_Fr::euler = bigint_r("10944121435919637611123202872628637544274182200208017171849102093287904247808"); + alt_bn128_Fr::s = 28; + alt_bn128_Fr::t = bigint_r("81540058820840996586704275553141814055101440848469862132140264610111"); + alt_bn128_Fr::t_minus_1_over_2 = bigint_r("40770029410420498293352137776570907027550720424234931066070132305055"); + alt_bn128_Fr::multiplicative_generator = alt_bn128_Fr("5"); + alt_bn128_Fr::root_of_unity = alt_bn128_Fr("19103219067921713944291392827692070036145651957329286315305642004821462161904"); + alt_bn128_Fr::nqr = alt_bn128_Fr("5"); + alt_bn128_Fr::nqr_to_t = alt_bn128_Fr("19103219067921713944291392827692070036145651957329286315305642004821462161904"); + + /* parameters for base field Fq */ + + alt_bn128_modulus_q = bigint_q("21888242871839275222246405745257275088696311157297823662689037894645226208583"); + assert(alt_bn128_Fq::modulus_is_valid()); + if (sizeof(mp_limb_t) == 8) + { + alt_bn128_Fq::Rsquared = bigint_q("3096616502983703923843567936837374451735540968419076528771170197431451843209"); + alt_bn128_Fq::Rcubed = bigint_q("14921786541159648185948152738563080959093619838510245177710943249661917737183"); + alt_bn128_Fq::inv = 0x87d20782e4866389; + } + if (sizeof(mp_limb_t) == 4) + { + alt_bn128_Fq::Rsquared = bigint_q("3096616502983703923843567936837374451735540968419076528771170197431451843209"); + alt_bn128_Fq::Rcubed = bigint_q("14921786541159648185948152738563080959093619838510245177710943249661917737183"); + alt_bn128_Fq::inv = 0xe4866389; + } + alt_bn128_Fq::num_bits = 254; + alt_bn128_Fq::euler = bigint_q("10944121435919637611123202872628637544348155578648911831344518947322613104291"); + alt_bn128_Fq::s = 1; + alt_bn128_Fq::t = bigint_q("10944121435919637611123202872628637544348155578648911831344518947322613104291"); + alt_bn128_Fq::t_minus_1_over_2 = bigint_q("5472060717959818805561601436314318772174077789324455915672259473661306552145"); + alt_bn128_Fq::multiplicative_generator = alt_bn128_Fq("3"); + alt_bn128_Fq::root_of_unity = alt_bn128_Fq("21888242871839275222246405745257275088696311157297823662689037894645226208582"); + alt_bn128_Fq::nqr = alt_bn128_Fq("3"); + alt_bn128_Fq::nqr_to_t = alt_bn128_Fq("21888242871839275222246405745257275088696311157297823662689037894645226208582"); + + /* parameters for twist field Fq2 */ + alt_bn128_Fq2::euler = bigint<2*alt_bn128_q_limbs>("239547588008311421220994022608339370399626158265550411218223901127035046843189118723920525909718935985594116157406550130918127817069793474323196511433944"); + alt_bn128_Fq2::s = 4; + alt_bn128_Fq2::t = bigint<2*alt_bn128_q_limbs>("29943448501038927652624252826042421299953269783193801402277987640879380855398639840490065738714866998199264519675818766364765977133724184290399563929243"); + alt_bn128_Fq2::t_minus_1_over_2 = bigint<2*alt_bn128_q_limbs>("14971724250519463826312126413021210649976634891596900701138993820439690427699319920245032869357433499099632259837909383182382988566862092145199781964621"); + alt_bn128_Fq2::non_residue = alt_bn128_Fq("21888242871839275222246405745257275088696311157297823662689037894645226208582"); + alt_bn128_Fq2::nqr = alt_bn128_Fq2(alt_bn128_Fq("2"),alt_bn128_Fq("1")); + alt_bn128_Fq2::nqr_to_t = alt_bn128_Fq2(alt_bn128_Fq("5033503716262624267312492558379982687175200734934877598599011485707452665730"),alt_bn128_Fq("314498342015008975724433667930697407966947188435857772134235984660852259084")); + alt_bn128_Fq2::Frobenius_coeffs_c1[0] = alt_bn128_Fq("1"); + alt_bn128_Fq2::Frobenius_coeffs_c1[1] = alt_bn128_Fq("21888242871839275222246405745257275088696311157297823662689037894645226208582"); + + /* parameters for Fq6 */ + alt_bn128_Fq6::non_residue = alt_bn128_Fq2(alt_bn128_Fq("9"),alt_bn128_Fq("1")); + alt_bn128_Fq6::Frobenius_coeffs_c1[0] = alt_bn128_Fq2(alt_bn128_Fq("1"),alt_bn128_Fq("0")); + alt_bn128_Fq6::Frobenius_coeffs_c1[1] = alt_bn128_Fq2(alt_bn128_Fq("21575463638280843010398324269430826099269044274347216827212613867836435027261"),alt_bn128_Fq("10307601595873709700152284273816112264069230130616436755625194854815875713954")); + alt_bn128_Fq6::Frobenius_coeffs_c1[2] = alt_bn128_Fq2(alt_bn128_Fq("21888242871839275220042445260109153167277707414472061641714758635765020556616"),alt_bn128_Fq("0")); + alt_bn128_Fq6::Frobenius_coeffs_c1[3] = alt_bn128_Fq2(alt_bn128_Fq("3772000881919853776433695186713858239009073593817195771773381919316419345261"),alt_bn128_Fq("2236595495967245188281701248203181795121068902605861227855261137820944008926")); + alt_bn128_Fq6::Frobenius_coeffs_c1[4] = alt_bn128_Fq2(alt_bn128_Fq("2203960485148121921418603742825762020974279258880205651966"),alt_bn128_Fq("0")); + alt_bn128_Fq6::Frobenius_coeffs_c1[5] = alt_bn128_Fq2(alt_bn128_Fq("18429021223477853657660792034369865839114504446431234726392080002137598044644"),alt_bn128_Fq("9344045779998320333812420223237981029506012124075525679208581902008406485703")); + alt_bn128_Fq6::Frobenius_coeffs_c2[0] = alt_bn128_Fq2(alt_bn128_Fq("1"),alt_bn128_Fq("0")); + alt_bn128_Fq6::Frobenius_coeffs_c2[1] = alt_bn128_Fq2(alt_bn128_Fq("2581911344467009335267311115468803099551665605076196740867805258568234346338"),alt_bn128_Fq("19937756971775647987995932169929341994314640652964949448313374472400716661030")); + alt_bn128_Fq6::Frobenius_coeffs_c2[2] = alt_bn128_Fq2(alt_bn128_Fq("2203960485148121921418603742825762020974279258880205651966"),alt_bn128_Fq("0")); + alt_bn128_Fq6::Frobenius_coeffs_c2[3] = alt_bn128_Fq2(alt_bn128_Fq("5324479202449903542726783395506214481928257762400643279780343368557297135718"),alt_bn128_Fq("16208900380737693084919495127334387981393726419856888799917914180988844123039")); + alt_bn128_Fq6::Frobenius_coeffs_c2[4] = alt_bn128_Fq2(alt_bn128_Fq("21888242871839275220042445260109153167277707414472061641714758635765020556616"),alt_bn128_Fq("0")); + alt_bn128_Fq6::Frobenius_coeffs_c2[5] = alt_bn128_Fq2(alt_bn128_Fq("13981852324922362344252311234282257507216387789820983642040889267519694726527"),alt_bn128_Fq("7629828391165209371577384193250820201684255241773809077146787135900891633097")); + + /* parameters for Fq12 */ + + alt_bn128_Fq12::non_residue = alt_bn128_Fq2(alt_bn128_Fq("9"),alt_bn128_Fq("1")); + alt_bn128_Fq12::Frobenius_coeffs_c1[0] = alt_bn128_Fq2(alt_bn128_Fq("1"),alt_bn128_Fq("0")); + alt_bn128_Fq12::Frobenius_coeffs_c1[1] = alt_bn128_Fq2(alt_bn128_Fq("8376118865763821496583973867626364092589906065868298776909617916018768340080"),alt_bn128_Fq("16469823323077808223889137241176536799009286646108169935659301613961712198316")); + alt_bn128_Fq12::Frobenius_coeffs_c1[2] = alt_bn128_Fq2(alt_bn128_Fq("21888242871839275220042445260109153167277707414472061641714758635765020556617"),alt_bn128_Fq("0")); + alt_bn128_Fq12::Frobenius_coeffs_c1[3] = alt_bn128_Fq2(alt_bn128_Fq("11697423496358154304825782922584725312912383441159505038794027105778954184319"),alt_bn128_Fq("303847389135065887422783454877609941456349188919719272345083954437860409601")); + alt_bn128_Fq12::Frobenius_coeffs_c1[4] = alt_bn128_Fq2(alt_bn128_Fq("21888242871839275220042445260109153167277707414472061641714758635765020556616"),alt_bn128_Fq("0")); + alt_bn128_Fq12::Frobenius_coeffs_c1[5] = alt_bn128_Fq2(alt_bn128_Fq("3321304630594332808241809054958361220322477375291206261884409189760185844239"),alt_bn128_Fq("5722266937896532885780051958958348231143373700109372999374820235121374419868")); + alt_bn128_Fq12::Frobenius_coeffs_c1[6] = alt_bn128_Fq2(alt_bn128_Fq("21888242871839275222246405745257275088696311157297823662689037894645226208582"),alt_bn128_Fq("0")); + alt_bn128_Fq12::Frobenius_coeffs_c1[7] = alt_bn128_Fq2(alt_bn128_Fq("13512124006075453725662431877630910996106405091429524885779419978626457868503"),alt_bn128_Fq("5418419548761466998357268504080738289687024511189653727029736280683514010267")); + alt_bn128_Fq12::Frobenius_coeffs_c1[8] = alt_bn128_Fq2(alt_bn128_Fq("2203960485148121921418603742825762020974279258880205651966"),alt_bn128_Fq("0")); + alt_bn128_Fq12::Frobenius_coeffs_c1[9] = alt_bn128_Fq2(alt_bn128_Fq("10190819375481120917420622822672549775783927716138318623895010788866272024264"),alt_bn128_Fq("21584395482704209334823622290379665147239961968378104390343953940207365798982")); + alt_bn128_Fq12::Frobenius_coeffs_c1[10] = alt_bn128_Fq2(alt_bn128_Fq("2203960485148121921418603742825762020974279258880205651967"),alt_bn128_Fq("0")); + alt_bn128_Fq12::Frobenius_coeffs_c1[11] = alt_bn128_Fq2(alt_bn128_Fq("18566938241244942414004596690298913868373833782006617400804628704885040364344"),alt_bn128_Fq("16165975933942742336466353786298926857552937457188450663314217659523851788715")); + + /* choice of short Weierstrass curve and its twist */ + + alt_bn128_coeff_b = alt_bn128_Fq("3"); + alt_bn128_twist = alt_bn128_Fq2(alt_bn128_Fq("9"), alt_bn128_Fq("1")); + alt_bn128_twist_coeff_b = alt_bn128_coeff_b * alt_bn128_twist.inverse(); + alt_bn128_twist_mul_by_b_c0 = alt_bn128_coeff_b * alt_bn128_Fq2::non_residue; + alt_bn128_twist_mul_by_b_c1 = alt_bn128_coeff_b * alt_bn128_Fq2::non_residue; + alt_bn128_twist_mul_by_q_X = alt_bn128_Fq2(alt_bn128_Fq("21575463638280843010398324269430826099269044274347216827212613867836435027261"), + alt_bn128_Fq("10307601595873709700152284273816112264069230130616436755625194854815875713954")); + alt_bn128_twist_mul_by_q_Y = alt_bn128_Fq2(alt_bn128_Fq("2821565182194536844548159561693502659359617185244120367078079554186484126554"), + alt_bn128_Fq("3505843767911556378687030309984248845540243509899259641013678093033130930403")); + + /* choice of group G1 */ + alt_bn128_G1::G1_zero = alt_bn128_G1(alt_bn128_Fq::zero(), + alt_bn128_Fq::one(), + alt_bn128_Fq::zero()); + alt_bn128_G1::G1_one = alt_bn128_G1(alt_bn128_Fq("1"), + alt_bn128_Fq("2"), + alt_bn128_Fq::one()); + alt_bn128_G1::wnaf_window_table.push_back(11); + alt_bn128_G1::wnaf_window_table.push_back(24); + alt_bn128_G1::wnaf_window_table.push_back(60); + alt_bn128_G1::wnaf_window_table.push_back(127); + + alt_bn128_G1::fixed_base_exp_window_table.resize(0); + // window 1 is unbeaten in [-inf, 4.99] + alt_bn128_G1::fixed_base_exp_window_table.push_back(1); + // window 2 is unbeaten in [4.99, 10.99] + alt_bn128_G1::fixed_base_exp_window_table.push_back(5); + // window 3 is unbeaten in [10.99, 32.29] + alt_bn128_G1::fixed_base_exp_window_table.push_back(11); + // window 4 is unbeaten in [32.29, 55.23] + alt_bn128_G1::fixed_base_exp_window_table.push_back(32); + // window 5 is unbeaten in [55.23, 162.03] + alt_bn128_G1::fixed_base_exp_window_table.push_back(55); + // window 6 is unbeaten in [162.03, 360.15] + alt_bn128_G1::fixed_base_exp_window_table.push_back(162); + // window 7 is unbeaten in [360.15, 815.44] + alt_bn128_G1::fixed_base_exp_window_table.push_back(360); + // window 8 is unbeaten in [815.44, 2373.07] + alt_bn128_G1::fixed_base_exp_window_table.push_back(815); + // window 9 is unbeaten in [2373.07, 6977.75] + alt_bn128_G1::fixed_base_exp_window_table.push_back(2373); + // window 10 is unbeaten in [6977.75, 7122.23] + alt_bn128_G1::fixed_base_exp_window_table.push_back(6978); + // window 11 is unbeaten in [7122.23, 57818.46] + alt_bn128_G1::fixed_base_exp_window_table.push_back(7122); + // window 12 is never the best + alt_bn128_G1::fixed_base_exp_window_table.push_back(0); + // window 13 is unbeaten in [57818.46, 169679.14] + alt_bn128_G1::fixed_base_exp_window_table.push_back(57818); + // window 14 is never the best + alt_bn128_G1::fixed_base_exp_window_table.push_back(0); + // window 15 is unbeaten in [169679.14, 439758.91] + alt_bn128_G1::fixed_base_exp_window_table.push_back(169679); + // window 16 is unbeaten in [439758.91, 936073.41] + alt_bn128_G1::fixed_base_exp_window_table.push_back(439759); + // window 17 is unbeaten in [936073.41, 4666554.74] + alt_bn128_G1::fixed_base_exp_window_table.push_back(936073); + // window 18 is never the best + alt_bn128_G1::fixed_base_exp_window_table.push_back(0); + // window 19 is unbeaten in [4666554.74, 7580404.42] + alt_bn128_G1::fixed_base_exp_window_table.push_back(4666555); + // window 20 is unbeaten in [7580404.42, 34552892.20] + alt_bn128_G1::fixed_base_exp_window_table.push_back(7580404); + // window 21 is never the best + alt_bn128_G1::fixed_base_exp_window_table.push_back(0); + // window 22 is unbeaten in [34552892.20, inf] + alt_bn128_G1::fixed_base_exp_window_table.push_back(34552892); + + /* choice of group G2 */ + + alt_bn128_G2::G2_zero = alt_bn128_G2(alt_bn128_Fq2::zero(), + alt_bn128_Fq2::one(), + alt_bn128_Fq2::zero()); + + alt_bn128_G2::G2_one = alt_bn128_G2(alt_bn128_Fq2(alt_bn128_Fq("10857046999023057135944570762232829481370756359578518086990519993285655852781"), + alt_bn128_Fq("11559732032986387107991004021392285783925812861821192530917403151452391805634")), + alt_bn128_Fq2(alt_bn128_Fq("8495653923123431417604973247489272438418190587263600148770280649306958101930"), + alt_bn128_Fq("4082367875863433681332203403145435568316851327593401208105741076214120093531")), + alt_bn128_Fq2::one()); + alt_bn128_G2::wnaf_window_table.push_back(5); + alt_bn128_G2::wnaf_window_table.push_back(15); + alt_bn128_G2::wnaf_window_table.push_back(39); + alt_bn128_G2::wnaf_window_table.push_back(109); + + alt_bn128_G2::fixed_base_exp_window_table.resize(0); + // window 1 is unbeaten in [-inf, 5.10] + alt_bn128_G2::fixed_base_exp_window_table.push_back(1); + // window 2 is unbeaten in [5.10, 10.43] + alt_bn128_G2::fixed_base_exp_window_table.push_back(5); + // window 3 is unbeaten in [10.43, 25.28] + alt_bn128_G2::fixed_base_exp_window_table.push_back(10); + // window 4 is unbeaten in [25.28, 59.00] + alt_bn128_G2::fixed_base_exp_window_table.push_back(25); + // window 5 is unbeaten in [59.00, 154.03] + alt_bn128_G2::fixed_base_exp_window_table.push_back(59); + // window 6 is unbeaten in [154.03, 334.25] + alt_bn128_G2::fixed_base_exp_window_table.push_back(154); + // window 7 is unbeaten in [334.25, 742.58] + alt_bn128_G2::fixed_base_exp_window_table.push_back(334); + // window 8 is unbeaten in [742.58, 2034.40] + alt_bn128_G2::fixed_base_exp_window_table.push_back(743); + // window 9 is unbeaten in [2034.40, 4987.56] + alt_bn128_G2::fixed_base_exp_window_table.push_back(2034); + // window 10 is unbeaten in [4987.56, 8888.27] + alt_bn128_G2::fixed_base_exp_window_table.push_back(4988); + // window 11 is unbeaten in [8888.27, 26271.13] + alt_bn128_G2::fixed_base_exp_window_table.push_back(8888); + // window 12 is unbeaten in [26271.13, 39768.20] + alt_bn128_G2::fixed_base_exp_window_table.push_back(26271); + // window 13 is unbeaten in [39768.20, 106275.75] + alt_bn128_G2::fixed_base_exp_window_table.push_back(39768); + // window 14 is unbeaten in [106275.75, 141703.40] + alt_bn128_G2::fixed_base_exp_window_table.push_back(106276); + // window 15 is unbeaten in [141703.40, 462422.97] + alt_bn128_G2::fixed_base_exp_window_table.push_back(141703); + // window 16 is unbeaten in [462422.97, 926871.84] + alt_bn128_G2::fixed_base_exp_window_table.push_back(462423); + // window 17 is unbeaten in [926871.84, 4873049.17] + alt_bn128_G2::fixed_base_exp_window_table.push_back(926872); + // window 18 is never the best + alt_bn128_G2::fixed_base_exp_window_table.push_back(0); + // window 19 is unbeaten in [4873049.17, 5706707.88] + alt_bn128_G2::fixed_base_exp_window_table.push_back(4873049); + // window 20 is unbeaten in [5706707.88, 31673814.95] + alt_bn128_G2::fixed_base_exp_window_table.push_back(5706708); + // window 21 is never the best + alt_bn128_G2::fixed_base_exp_window_table.push_back(0); + // window 22 is unbeaten in [31673814.95, inf] + alt_bn128_G2::fixed_base_exp_window_table.push_back(31673815); + + /* pairing parameters */ + + alt_bn128_ate_loop_count = bigint_q("29793968203157093288"); + alt_bn128_ate_is_loop_count_neg = false; + alt_bn128_final_exponent = bigint<12*alt_bn128_q_limbs>("552484233613224096312617126783173147097382103762957654188882734314196910839907541213974502761540629817009608548654680343627701153829446747810907373256841551006201639677726139946029199968412598804882391702273019083653272047566316584365559776493027495458238373902875937659943504873220554161550525926302303331747463515644711876653177129578303191095900909191624817826566688241804408081892785725967931714097716709526092261278071952560171111444072049229123565057483750161460024353346284167282452756217662335528813519139808291170539072125381230815729071544861602750936964829313608137325426383735122175229541155376346436093930287402089517426973178917569713384748081827255472576937471496195752727188261435633271238710131736096299798168852925540549342330775279877006784354801422249722573783561685179618816480037695005515426162362431072245638324744480"); + alt_bn128_final_exponent_z = bigint_q("4965661367192848881"); + alt_bn128_final_exponent_is_z_neg = false; + +} +} // libsnark diff --git a/src/algebra/curves/alt_bn128/alt_bn128_init.hpp b/src/algebra/curves/alt_bn128/alt_bn128_init.hpp new file mode 100644 index 000000000..c3bea7673 --- /dev/null +++ b/src/algebra/curves/alt_bn128/alt_bn128_init.hpp @@ -0,0 +1,57 @@ +/** @file + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef ALT_BN128_INIT_HPP_ +#define ALT_BN128_INIT_HPP_ +#include "algebra/curves/public_params.hpp" +#include "algebra/fields/fp.hpp" +#include "algebra/fields/fp2.hpp" +#include "algebra/fields/fp6_3over2.hpp" +#include "algebra/fields/fp12_2over3over2.hpp" + +namespace libsnark { + +const mp_size_t alt_bn128_r_bitcount = 254; +const mp_size_t alt_bn128_q_bitcount = 254; + +const mp_size_t alt_bn128_r_limbs = (alt_bn128_r_bitcount+GMP_NUMB_BITS-1)/GMP_NUMB_BITS; +const mp_size_t alt_bn128_q_limbs = (alt_bn128_q_bitcount+GMP_NUMB_BITS-1)/GMP_NUMB_BITS; + +extern bigint alt_bn128_modulus_r; +extern bigint alt_bn128_modulus_q; + +typedef Fp_model alt_bn128_Fr; +typedef Fp_model alt_bn128_Fq; +typedef Fp2_model alt_bn128_Fq2; +typedef Fp6_3over2_model alt_bn128_Fq6; +typedef Fp12_2over3over2_model alt_bn128_Fq12; +typedef alt_bn128_Fq12 alt_bn128_GT; + +// parameters for Barreto--Naehrig curve E/Fq : y^2 = x^3 + b +extern alt_bn128_Fq alt_bn128_coeff_b; +// parameters for twisted Barreto--Naehrig curve E'/Fq2 : y^2 = x^3 + b/xi +extern alt_bn128_Fq2 alt_bn128_twist; +extern alt_bn128_Fq2 alt_bn128_twist_coeff_b; +extern alt_bn128_Fq alt_bn128_twist_mul_by_b_c0; +extern alt_bn128_Fq alt_bn128_twist_mul_by_b_c1; +extern alt_bn128_Fq2 alt_bn128_twist_mul_by_q_X; +extern alt_bn128_Fq2 alt_bn128_twist_mul_by_q_Y; + +// parameters for pairing +extern bigint alt_bn128_ate_loop_count; +extern bool alt_bn128_ate_is_loop_count_neg; +extern bigint<12*alt_bn128_q_limbs> alt_bn128_final_exponent; +extern bigint alt_bn128_final_exponent_z; +extern bool alt_bn128_final_exponent_is_z_neg; + +void init_alt_bn128_params(); + +class alt_bn128_G1; +class alt_bn128_G2; + +} // libsnark +#endif // ALT_BN128_INIT_HPP_ diff --git a/src/algebra/curves/alt_bn128/alt_bn128_pairing.cpp b/src/algebra/curves/alt_bn128/alt_bn128_pairing.cpp new file mode 100644 index 000000000..db556c5b2 --- /dev/null +++ b/src/algebra/curves/alt_bn128/alt_bn128_pairing.cpp @@ -0,0 +1,547 @@ +/** @file + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#include "algebra/curves/alt_bn128/alt_bn128_pairing.hpp" +#include "algebra/curves/alt_bn128/alt_bn128_init.hpp" +#include "algebra/curves/alt_bn128/alt_bn128_g1.hpp" +#include "algebra/curves/alt_bn128/alt_bn128_g2.hpp" +#include +#include "common/profiling.hpp" +#include "common/assert_except.hpp" + +namespace libsnark { + +bool alt_bn128_ate_G1_precomp::operator==(const alt_bn128_ate_G1_precomp &other) const +{ + return (this->PX == other.PX && + this->PY == other.PY); +} + +std::ostream& operator<<(std::ostream &out, const alt_bn128_ate_G1_precomp &prec_P) +{ + out << prec_P.PX << OUTPUT_SEPARATOR << prec_P.PY; + + return out; +} + +std::istream& operator>>(std::istream &in, alt_bn128_ate_G1_precomp &prec_P) +{ + in >> prec_P.PX; + consume_OUTPUT_SEPARATOR(in); + in >> prec_P.PY; + + return in; +} + +bool alt_bn128_ate_ell_coeffs::operator==(const alt_bn128_ate_ell_coeffs &other) const +{ + return (this->ell_0 == other.ell_0 && + this->ell_VW == other.ell_VW && + this->ell_VV == other.ell_VV); +} + +std::ostream& operator<<(std::ostream &out, const alt_bn128_ate_ell_coeffs &c) +{ + out << c.ell_0 << OUTPUT_SEPARATOR << c.ell_VW << OUTPUT_SEPARATOR << c.ell_VV; + return out; +} + +std::istream& operator>>(std::istream &in, alt_bn128_ate_ell_coeffs &c) +{ + in >> c.ell_0; + consume_OUTPUT_SEPARATOR(in); + in >> c.ell_VW; + consume_OUTPUT_SEPARATOR(in); + in >> c.ell_VV; + + return in; +} + +bool alt_bn128_ate_G2_precomp::operator==(const alt_bn128_ate_G2_precomp &other) const +{ + return (this->QX == other.QX && + this->QY == other.QY && + this->coeffs == other.coeffs); +} + +std::ostream& operator<<(std::ostream& out, const alt_bn128_ate_G2_precomp &prec_Q) +{ + out << prec_Q.QX << OUTPUT_SEPARATOR << prec_Q.QY << "\n"; + out << prec_Q.coeffs.size() << "\n"; + for (const alt_bn128_ate_ell_coeffs &c : prec_Q.coeffs) + { + out << c << OUTPUT_NEWLINE; + } + return out; +} + +std::istream& operator>>(std::istream& in, alt_bn128_ate_G2_precomp &prec_Q) +{ + in >> prec_Q.QX; + consume_OUTPUT_SEPARATOR(in); + in >> prec_Q.QY; + consume_newline(in); + + prec_Q.coeffs.clear(); + size_t s; + in >> s; + + consume_newline(in); + + prec_Q.coeffs.reserve(s); + + for (size_t i = 0; i < s; ++i) + { + alt_bn128_ate_ell_coeffs c; + in >> c; + consume_OUTPUT_NEWLINE(in); + prec_Q.coeffs.emplace_back(c); + } + + return in; +} + +/* final exponentiations */ + +alt_bn128_Fq12 alt_bn128_final_exponentiation_first_chunk(const alt_bn128_Fq12 &elt) +{ + enter_block("Call to alt_bn128_final_exponentiation_first_chunk"); + + /* + Computes result = elt^((q^6-1)*(q^2+1)). + Follows, e.g., Beuchat et al page 9, by computing result as follows: + elt^((q^6-1)*(q^2+1)) = (conj(elt) * elt^(-1))^(q^2+1) + More precisely: + A = conj(elt) + B = elt.inverse() + C = A * B + D = C.Frobenius_map(2) + result = D * C + */ + + const alt_bn128_Fq12 A = alt_bn128_Fq12(elt.c0,-elt.c1); + const alt_bn128_Fq12 B = elt.inverse(); + const alt_bn128_Fq12 C = A * B; + const alt_bn128_Fq12 D = C.Frobenius_map(2); + const alt_bn128_Fq12 result = D * C; + + leave_block("Call to alt_bn128_final_exponentiation_first_chunk"); + + return result; +} + +alt_bn128_Fq12 alt_bn128_exp_by_neg_z(const alt_bn128_Fq12 &elt) +{ + enter_block("Call to alt_bn128_exp_by_neg_z"); + + alt_bn128_Fq12 result = elt.cyclotomic_exp(alt_bn128_final_exponent_z); + if (!alt_bn128_final_exponent_is_z_neg) + { + result = result.unitary_inverse(); + } + + leave_block("Call to alt_bn128_exp_by_neg_z"); + + return result; +} + +alt_bn128_Fq12 alt_bn128_final_exponentiation_last_chunk(const alt_bn128_Fq12 &elt) +{ + enter_block("Call to alt_bn128_final_exponentiation_last_chunk"); + + /* + Follows Laura Fuentes-Castaneda et al. "Faster hashing to G2" + by computing: + + result = elt^(q^3 * (12*z^3 + 6z^2 + 4z - 1) + + q^2 * (12*z^3 + 6z^2 + 6z) + + q * (12*z^3 + 6z^2 + 4z) + + 1 * (12*z^3 + 12z^2 + 6z + 1)) + which equals + + result = elt^( 2z * ( 6z^2 + 3z + 1 ) * (q^4 - q^2 + 1)/r ). + + Using the following addition chain: + + A = exp_by_neg_z(elt) // = elt^(-z) + B = A^2 // = elt^(-2*z) + C = B^2 // = elt^(-4*z) + D = C * B // = elt^(-6*z) + E = exp_by_neg_z(D) // = elt^(6*z^2) + F = E^2 // = elt^(12*z^2) + G = epx_by_neg_z(F) // = elt^(-12*z^3) + H = conj(D) // = elt^(6*z) + I = conj(G) // = elt^(12*z^3) + J = I * E // = elt^(12*z^3 + 6*z^2) + K = J * H // = elt^(12*z^3 + 6*z^2 + 6*z) + L = K * B // = elt^(12*z^3 + 6*z^2 + 4*z) + M = K * E // = elt^(12*z^3 + 12*z^2 + 6*z) + N = M * elt // = elt^(12*z^3 + 12*z^2 + 6*z + 1) + O = L.Frobenius_map(1) // = elt^(q*(12*z^3 + 6*z^2 + 4*z)) + P = O * N // = elt^(q*(12*z^3 + 6*z^2 + 4*z) * (12*z^3 + 12*z^2 + 6*z + 1)) + Q = K.Frobenius_map(2) // = elt^(q^2 * (12*z^3 + 6*z^2 + 6*z)) + R = Q * P // = elt^(q^2 * (12*z^3 + 6*z^2 + 6*z) + q*(12*z^3 + 6*z^2 + 4*z) * (12*z^3 + 12*z^2 + 6*z + 1)) + S = conj(elt) // = elt^(-1) + T = S * L // = elt^(12*z^3 + 6*z^2 + 4*z - 1) + U = T.Frobenius_map(3) // = elt^(q^3(12*z^3 + 6*z^2 + 4*z - 1)) + V = U * R // = elt^(q^3(12*z^3 + 6*z^2 + 4*z - 1) + q^2 * (12*z^3 + 6*z^2 + 6*z) + q*(12*z^3 + 6*z^2 + 4*z) * (12*z^3 + 12*z^2 + 6*z + 1)) + result = V + + */ + + const alt_bn128_Fq12 A = alt_bn128_exp_by_neg_z(elt); + const alt_bn128_Fq12 B = A.cyclotomic_squared(); + const alt_bn128_Fq12 C = B.cyclotomic_squared(); + const alt_bn128_Fq12 D = C * B; + const alt_bn128_Fq12 E = alt_bn128_exp_by_neg_z(D); + const alt_bn128_Fq12 F = E.cyclotomic_squared(); + const alt_bn128_Fq12 G = alt_bn128_exp_by_neg_z(F); + const alt_bn128_Fq12 H = D.unitary_inverse(); + const alt_bn128_Fq12 I = G.unitary_inverse(); + const alt_bn128_Fq12 J = I * E; + const alt_bn128_Fq12 K = J * H; + const alt_bn128_Fq12 L = K * B; + const alt_bn128_Fq12 M = K * E; + const alt_bn128_Fq12 N = M * elt; + const alt_bn128_Fq12 O = L.Frobenius_map(1); + const alt_bn128_Fq12 P = O * N; + const alt_bn128_Fq12 Q = K.Frobenius_map(2); + const alt_bn128_Fq12 R = Q * P; + const alt_bn128_Fq12 S = elt.unitary_inverse(); + const alt_bn128_Fq12 T = S * L; + const alt_bn128_Fq12 U = T.Frobenius_map(3); + const alt_bn128_Fq12 V = U * R; + + const alt_bn128_Fq12 result = V; + + leave_block("Call to alt_bn128_final_exponentiation_last_chunk"); + + return result; +} + +alt_bn128_GT alt_bn128_final_exponentiation(const alt_bn128_Fq12 &elt) +{ + enter_block("Call to alt_bn128_final_exponentiation"); + /* OLD naive version: + alt_bn128_GT result = elt^alt_bn128_final_exponent; + */ + alt_bn128_Fq12 A = alt_bn128_final_exponentiation_first_chunk(elt); + alt_bn128_GT result = alt_bn128_final_exponentiation_last_chunk(A); + + leave_block("Call to alt_bn128_final_exponentiation"); + return result; +} + +/* ate pairing */ + +void doubling_step_for_flipped_miller_loop(const alt_bn128_Fq two_inv, + alt_bn128_G2 ¤t, + alt_bn128_ate_ell_coeffs &c) +{ + const alt_bn128_Fq2 X = current.X, Y = current.Y, Z = current.Z; + + const alt_bn128_Fq2 A = two_inv * (X * Y); // A = X1 * Y1 / 2 + const alt_bn128_Fq2 B = Y.squared(); // B = Y1^2 + const alt_bn128_Fq2 C = Z.squared(); // C = Z1^2 + const alt_bn128_Fq2 D = C+C+C; // D = 3 * C + const alt_bn128_Fq2 E = alt_bn128_twist_coeff_b * D; // E = twist_b * D + const alt_bn128_Fq2 F = E+E+E; // F = 3 * E + const alt_bn128_Fq2 G = two_inv * (B+F); // G = (B+F)/2 + const alt_bn128_Fq2 H = (Y+Z).squared() - (B+C); // H = (Y1+Z1)^2-(B+C) + const alt_bn128_Fq2 I = E-B; // I = E-B + const alt_bn128_Fq2 J = X.squared(); // J = X1^2 + const alt_bn128_Fq2 E_squared = E.squared(); // E_squared = E^2 + + current.X = A * (B-F); // X3 = A * (B-F) + current.Y = G.squared() - (E_squared+E_squared+E_squared); // Y3 = G^2 - 3*E^2 + current.Z = B * H; // Z3 = B * H + c.ell_0 = alt_bn128_twist * I; // ell_0 = xi * I + c.ell_VW = -H; // ell_VW = - H (later: * yP) + c.ell_VV = J+J+J; // ell_VV = 3*J (later: * xP) +} + +void mixed_addition_step_for_flipped_miller_loop(const alt_bn128_G2 base, + alt_bn128_G2 ¤t, + alt_bn128_ate_ell_coeffs &c) +{ + const alt_bn128_Fq2 X1 = current.X, Y1 = current.Y, Z1 = current.Z; + const alt_bn128_Fq2 &x2 = base.X, &y2 = base.Y; + + const alt_bn128_Fq2 D = X1 - x2 * Z1; // D = X1 - X2*Z1 + const alt_bn128_Fq2 E = Y1 - y2 * Z1; // E = Y1 - Y2*Z1 + const alt_bn128_Fq2 F = D.squared(); // F = D^2 + const alt_bn128_Fq2 G = E.squared(); // G = E^2 + const alt_bn128_Fq2 H = D*F; // H = D*F + const alt_bn128_Fq2 I = X1 * F; // I = X1 * F + const alt_bn128_Fq2 J = H + Z1*G - (I+I); // J = H + Z1*G - (I+I) + + current.X = D * J; // X3 = D*J + current.Y = E * (I-J)-(H * Y1); // Y3 = E*(I-J)-(H*Y1) + current.Z = Z1 * H; // Z3 = Z1*H + c.ell_0 = alt_bn128_twist * (E * x2 - D * y2); // ell_0 = xi * (E * X2 - D * Y2) + c.ell_VV = - E; // ell_VV = - E (later: * xP) + c.ell_VW = D; // ell_VW = D (later: * yP ) +} + +alt_bn128_ate_G1_precomp alt_bn128_ate_precompute_G1(const alt_bn128_G1& P) +{ + enter_block("Call to alt_bn128_ate_precompute_G1"); + + alt_bn128_G1 Pcopy = P; + Pcopy.to_affine_coordinates(); + + alt_bn128_ate_G1_precomp result; + result.PX = Pcopy.X; + result.PY = Pcopy.Y; + + leave_block("Call to alt_bn128_ate_precompute_G1"); + return result; +} + +alt_bn128_ate_G2_precomp alt_bn128_ate_precompute_G2(const alt_bn128_G2& Q) +{ + enter_block("Call to alt_bn128_ate_precompute_G2"); + + alt_bn128_G2 Qcopy(Q); + Qcopy.to_affine_coordinates(); + + alt_bn128_Fq two_inv = (alt_bn128_Fq("2").inverse()); // could add to global params if needed + + alt_bn128_ate_G2_precomp result; + result.QX = Qcopy.X; + result.QY = Qcopy.Y; + + alt_bn128_G2 R; + R.X = Qcopy.X; + R.Y = Qcopy.Y; + R.Z = alt_bn128_Fq2::one(); + + const bigint &loop_count = alt_bn128_ate_loop_count; + bool found_one = false; + alt_bn128_ate_ell_coeffs c; + + for (long i = loop_count.max_bits(); i >= 0; --i) + { + const bool bit = loop_count.test_bit(i); + if (!found_one) + { + /* this skips the MSB itself */ + found_one |= bit; + continue; + } + + doubling_step_for_flipped_miller_loop(two_inv, R, c); + result.coeffs.push_back(c); + + if (bit) + { + mixed_addition_step_for_flipped_miller_loop(Qcopy, R, c); + result.coeffs.push_back(c); + } + } + + alt_bn128_G2 Q1 = Qcopy.mul_by_q(); + assert_except(Q1.Z == alt_bn128_Fq2::one()); + alt_bn128_G2 Q2 = Q1.mul_by_q(); + assert_except(Q2.Z == alt_bn128_Fq2::one()); + + if (alt_bn128_ate_is_loop_count_neg) + { + R.Y = - R.Y; + } + Q2.Y = - Q2.Y; + + mixed_addition_step_for_flipped_miller_loop(Q1, R, c); + result.coeffs.push_back(c); + + mixed_addition_step_for_flipped_miller_loop(Q2, R, c); + result.coeffs.push_back(c); + + leave_block("Call to alt_bn128_ate_precompute_G2"); + return result; +} + +alt_bn128_Fq12 alt_bn128_ate_miller_loop(const alt_bn128_ate_G1_precomp &prec_P, + const alt_bn128_ate_G2_precomp &prec_Q) +{ + enter_block("Call to alt_bn128_ate_miller_loop"); + + alt_bn128_Fq12 f = alt_bn128_Fq12::one(); + + bool found_one = false; + size_t idx = 0; + + const bigint &loop_count = alt_bn128_ate_loop_count; + alt_bn128_ate_ell_coeffs c; + + for (long i = loop_count.max_bits(); i >= 0; --i) + { + const bool bit = loop_count.test_bit(i); + if (!found_one) + { + /* this skips the MSB itself */ + found_one |= bit; + continue; + } + + /* code below gets executed for all bits (EXCEPT the MSB itself) of + alt_bn128_param_p (skipping leading zeros) in MSB to LSB + order */ + + c = prec_Q.coeffs[idx++]; + f = f.squared(); + f = f.mul_by_024(c.ell_0, prec_P.PY * c.ell_VW, prec_P.PX * c.ell_VV); + + if (bit) + { + c = prec_Q.coeffs[idx++]; + f = f.mul_by_024(c.ell_0, prec_P.PY * c.ell_VW, prec_P.PX * c.ell_VV); + } + + } + + if (alt_bn128_ate_is_loop_count_neg) + { + f = f.inverse(); + } + + c = prec_Q.coeffs[idx++]; + f = f.mul_by_024(c.ell_0,prec_P.PY * c.ell_VW,prec_P.PX * c.ell_VV); + + c = prec_Q.coeffs[idx++]; + f = f.mul_by_024(c.ell_0,prec_P.PY * c.ell_VW,prec_P.PX * c.ell_VV); + + leave_block("Call to alt_bn128_ate_miller_loop"); + return f; +} + +alt_bn128_Fq12 alt_bn128_ate_double_miller_loop(const alt_bn128_ate_G1_precomp &prec_P1, + const alt_bn128_ate_G2_precomp &prec_Q1, + const alt_bn128_ate_G1_precomp &prec_P2, + const alt_bn128_ate_G2_precomp &prec_Q2) +{ + enter_block("Call to alt_bn128_ate_double_miller_loop"); + + alt_bn128_Fq12 f = alt_bn128_Fq12::one(); + + bool found_one = false; + size_t idx = 0; + + const bigint &loop_count = alt_bn128_ate_loop_count; + for (long i = loop_count.max_bits(); i >= 0; --i) + { + const bool bit = loop_count.test_bit(i); + if (!found_one) + { + /* this skips the MSB itself */ + found_one |= bit; + continue; + } + + /* code below gets executed for all bits (EXCEPT the MSB itself) of + alt_bn128_param_p (skipping leading zeros) in MSB to LSB + order */ + + alt_bn128_ate_ell_coeffs c1 = prec_Q1.coeffs[idx]; + alt_bn128_ate_ell_coeffs c2 = prec_Q2.coeffs[idx]; + ++idx; + + f = f.squared(); + + f = f.mul_by_024(c1.ell_0, prec_P1.PY * c1.ell_VW, prec_P1.PX * c1.ell_VV); + f = f.mul_by_024(c2.ell_0, prec_P2.PY * c2.ell_VW, prec_P2.PX * c2.ell_VV); + + if (bit) + { + alt_bn128_ate_ell_coeffs c1 = prec_Q1.coeffs[idx]; + alt_bn128_ate_ell_coeffs c2 = prec_Q2.coeffs[idx]; + ++idx; + + f = f.mul_by_024(c1.ell_0, prec_P1.PY * c1.ell_VW, prec_P1.PX * c1.ell_VV); + f = f.mul_by_024(c2.ell_0, prec_P2.PY * c2.ell_VW, prec_P2.PX * c2.ell_VV); + } + } + + if (alt_bn128_ate_is_loop_count_neg) + { + f = f.inverse(); + } + + alt_bn128_ate_ell_coeffs c1 = prec_Q1.coeffs[idx]; + alt_bn128_ate_ell_coeffs c2 = prec_Q2.coeffs[idx]; + ++idx; + f = f.mul_by_024(c1.ell_0, prec_P1.PY * c1.ell_VW, prec_P1.PX * c1.ell_VV); + f = f.mul_by_024(c2.ell_0, prec_P2.PY * c2.ell_VW, prec_P2.PX * c2.ell_VV); + + c1 = prec_Q1.coeffs[idx]; + c2 = prec_Q2.coeffs[idx]; + ++idx; + f = f.mul_by_024(c1.ell_0, prec_P1.PY * c1.ell_VW, prec_P1.PX * c1.ell_VV); + f = f.mul_by_024(c2.ell_0, prec_P2.PY * c2.ell_VW, prec_P2.PX * c2.ell_VV); + + leave_block("Call to alt_bn128_ate_double_miller_loop"); + + return f; +} + +alt_bn128_Fq12 alt_bn128_ate_pairing(const alt_bn128_G1& P, const alt_bn128_G2 &Q) +{ + enter_block("Call to alt_bn128_ate_pairing"); + alt_bn128_ate_G1_precomp prec_P = alt_bn128_ate_precompute_G1(P); + alt_bn128_ate_G2_precomp prec_Q = alt_bn128_ate_precompute_G2(Q); + alt_bn128_Fq12 result = alt_bn128_ate_miller_loop(prec_P, prec_Q); + leave_block("Call to alt_bn128_ate_pairing"); + return result; +} + +alt_bn128_GT alt_bn128_ate_reduced_pairing(const alt_bn128_G1 &P, const alt_bn128_G2 &Q) +{ + enter_block("Call to alt_bn128_ate_reduced_pairing"); + const alt_bn128_Fq12 f = alt_bn128_ate_pairing(P, Q); + const alt_bn128_GT result = alt_bn128_final_exponentiation(f); + leave_block("Call to alt_bn128_ate_reduced_pairing"); + return result; +} + +/* choice of pairing */ + +alt_bn128_G1_precomp alt_bn128_precompute_G1(const alt_bn128_G1& P) +{ + return alt_bn128_ate_precompute_G1(P); +} + +alt_bn128_G2_precomp alt_bn128_precompute_G2(const alt_bn128_G2& Q) +{ + return alt_bn128_ate_precompute_G2(Q); +} + +alt_bn128_Fq12 alt_bn128_miller_loop(const alt_bn128_G1_precomp &prec_P, + const alt_bn128_G2_precomp &prec_Q) +{ + return alt_bn128_ate_miller_loop(prec_P, prec_Q); +} + +alt_bn128_Fq12 alt_bn128_double_miller_loop(const alt_bn128_G1_precomp &prec_P1, + const alt_bn128_G2_precomp &prec_Q1, + const alt_bn128_G1_precomp &prec_P2, + const alt_bn128_G2_precomp &prec_Q2) +{ + return alt_bn128_ate_double_miller_loop(prec_P1, prec_Q1, prec_P2, prec_Q2); +} + +alt_bn128_Fq12 alt_bn128_pairing(const alt_bn128_G1& P, + const alt_bn128_G2 &Q) +{ + return alt_bn128_ate_pairing(P, Q); +} + +alt_bn128_GT alt_bn128_reduced_pairing(const alt_bn128_G1 &P, + const alt_bn128_G2 &Q) +{ + return alt_bn128_ate_reduced_pairing(P, Q); +} +} // libsnark diff --git a/src/algebra/curves/alt_bn128/alt_bn128_pairing.hpp b/src/algebra/curves/alt_bn128/alt_bn128_pairing.hpp new file mode 100644 index 000000000..15d325485 --- /dev/null +++ b/src/algebra/curves/alt_bn128/alt_bn128_pairing.hpp @@ -0,0 +1,92 @@ +/** @file + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef ALT_BN128_PAIRING_HPP_ +#define ALT_BN128_PAIRING_HPP_ +#include +#include "algebra/curves/alt_bn128/alt_bn128_init.hpp" + +namespace libsnark { + +/* final exponentiation */ + +alt_bn128_GT alt_bn128_final_exponentiation(const alt_bn128_Fq12 &elt); + +/* ate pairing */ + +struct alt_bn128_ate_G1_precomp { + alt_bn128_Fq PX; + alt_bn128_Fq PY; + + bool operator==(const alt_bn128_ate_G1_precomp &other) const; + friend std::ostream& operator<<(std::ostream &out, const alt_bn128_ate_G1_precomp &prec_P); + friend std::istream& operator>>(std::istream &in, alt_bn128_ate_G1_precomp &prec_P); +}; + +struct alt_bn128_ate_ell_coeffs { + alt_bn128_Fq2 ell_0; + alt_bn128_Fq2 ell_VW; + alt_bn128_Fq2 ell_VV; + + bool operator==(const alt_bn128_ate_ell_coeffs &other) const; + friend std::ostream& operator<<(std::ostream &out, const alt_bn128_ate_ell_coeffs &dc); + friend std::istream& operator>>(std::istream &in, alt_bn128_ate_ell_coeffs &dc); +}; + +struct alt_bn128_ate_G2_precomp { + alt_bn128_Fq2 QX; + alt_bn128_Fq2 QY; + std::vector coeffs; + + bool operator==(const alt_bn128_ate_G2_precomp &other) const; + friend std::ostream& operator<<(std::ostream &out, const alt_bn128_ate_G2_precomp &prec_Q); + friend std::istream& operator>>(std::istream &in, alt_bn128_ate_G2_precomp &prec_Q); +}; + +alt_bn128_ate_G1_precomp alt_bn128_ate_precompute_G1(const alt_bn128_G1& P); +alt_bn128_ate_G2_precomp alt_bn128_ate_precompute_G2(const alt_bn128_G2& Q); + +alt_bn128_Fq12 alt_bn128_ate_miller_loop(const alt_bn128_ate_G1_precomp &prec_P, + const alt_bn128_ate_G2_precomp &prec_Q); +alt_bn128_Fq12 alt_bn128_ate_double_miller_loop(const alt_bn128_ate_G1_precomp &prec_P1, + const alt_bn128_ate_G2_precomp &prec_Q1, + const alt_bn128_ate_G1_precomp &prec_P2, + const alt_bn128_ate_G2_precomp &prec_Q2); + +alt_bn128_Fq12 alt_bn128_ate_pairing(const alt_bn128_G1& P, + const alt_bn128_G2 &Q); +alt_bn128_GT alt_bn128_ate_reduced_pairing(const alt_bn128_G1 &P, + const alt_bn128_G2 &Q); + +/* choice of pairing */ + +typedef alt_bn128_ate_G1_precomp alt_bn128_G1_precomp; +typedef alt_bn128_ate_G2_precomp alt_bn128_G2_precomp; + +alt_bn128_G1_precomp alt_bn128_precompute_G1(const alt_bn128_G1& P); + +alt_bn128_G2_precomp alt_bn128_precompute_G2(const alt_bn128_G2& Q); + +alt_bn128_Fq12 alt_bn128_miller_loop(const alt_bn128_G1_precomp &prec_P, + const alt_bn128_G2_precomp &prec_Q); + +alt_bn128_Fq12 alt_bn128_double_miller_loop(const alt_bn128_G1_precomp &prec_P1, + const alt_bn128_G2_precomp &prec_Q1, + const alt_bn128_G1_precomp &prec_P2, + const alt_bn128_G2_precomp &prec_Q2); + +alt_bn128_Fq12 alt_bn128_pairing(const alt_bn128_G1& P, + const alt_bn128_G2 &Q); + +alt_bn128_GT alt_bn128_reduced_pairing(const alt_bn128_G1 &P, + const alt_bn128_G2 &Q); + +alt_bn128_GT alt_bn128_affine_reduced_pairing(const alt_bn128_G1 &P, + const alt_bn128_G2 &Q); + +} // libsnark +#endif // ALT_BN128_PAIRING_HPP_ diff --git a/src/algebra/curves/alt_bn128/alt_bn128_pp.cpp b/src/algebra/curves/alt_bn128/alt_bn128_pp.cpp new file mode 100644 index 000000000..25ea924d8 --- /dev/null +++ b/src/algebra/curves/alt_bn128/alt_bn128_pp.cpp @@ -0,0 +1,58 @@ +/** @file + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#include "algebra/curves/alt_bn128/alt_bn128_pp.hpp" + +namespace libsnark { + +void alt_bn128_pp::init_public_params() +{ + init_alt_bn128_params(); +} + +alt_bn128_GT alt_bn128_pp::final_exponentiation(const alt_bn128_Fq12 &elt) +{ + return alt_bn128_final_exponentiation(elt); +} + +alt_bn128_G1_precomp alt_bn128_pp::precompute_G1(const alt_bn128_G1 &P) +{ + return alt_bn128_precompute_G1(P); +} + +alt_bn128_G2_precomp alt_bn128_pp::precompute_G2(const alt_bn128_G2 &Q) +{ + return alt_bn128_precompute_G2(Q); +} + +alt_bn128_Fq12 alt_bn128_pp::miller_loop(const alt_bn128_G1_precomp &prec_P, + const alt_bn128_G2_precomp &prec_Q) +{ + return alt_bn128_miller_loop(prec_P, prec_Q); +} + +alt_bn128_Fq12 alt_bn128_pp::double_miller_loop(const alt_bn128_G1_precomp &prec_P1, + const alt_bn128_G2_precomp &prec_Q1, + const alt_bn128_G1_precomp &prec_P2, + const alt_bn128_G2_precomp &prec_Q2) +{ + return alt_bn128_double_miller_loop(prec_P1, prec_Q1, prec_P2, prec_Q2); +} + +alt_bn128_Fq12 alt_bn128_pp::pairing(const alt_bn128_G1 &P, + const alt_bn128_G2 &Q) +{ + return alt_bn128_pairing(P, Q); +} + +alt_bn128_Fq12 alt_bn128_pp::reduced_pairing(const alt_bn128_G1 &P, + const alt_bn128_G2 &Q) +{ + return alt_bn128_reduced_pairing(P, Q); +} + +} // libsnark diff --git a/src/algebra/curves/alt_bn128/alt_bn128_pp.hpp b/src/algebra/curves/alt_bn128/alt_bn128_pp.hpp new file mode 100644 index 000000000..ec8059dcb --- /dev/null +++ b/src/algebra/curves/alt_bn128/alt_bn128_pp.hpp @@ -0,0 +1,50 @@ +/** @file +***************************************************************************** +* @author This file is part of libsnark, developed by SCIPR Lab +* and contributors (see AUTHORS). +* @copyright MIT license (see LICENSE file) +*****************************************************************************/ + +#ifndef ALT_BN128_PP_HPP_ +#define ALT_BN128_PP_HPP_ +#include "algebra/curves/public_params.hpp" +#include "algebra/curves/alt_bn128/alt_bn128_init.hpp" +#include "algebra/curves/alt_bn128/alt_bn128_g1.hpp" +#include "algebra/curves/alt_bn128/alt_bn128_g2.hpp" +#include "algebra/curves/alt_bn128/alt_bn128_pairing.hpp" + +namespace libsnark { + +class alt_bn128_pp { +public: + typedef alt_bn128_Fr Fp_type; + typedef alt_bn128_G1 G1_type; + typedef alt_bn128_G2 G2_type; + typedef alt_bn128_G1_precomp G1_precomp_type; + typedef alt_bn128_G2_precomp G2_precomp_type; + typedef alt_bn128_Fq Fq_type; + typedef alt_bn128_Fq2 Fqe_type; + typedef alt_bn128_Fq12 Fqk_type; + typedef alt_bn128_GT GT_type; + + static const bool has_affine_pairing = false; + + static void init_public_params(); + static alt_bn128_GT final_exponentiation(const alt_bn128_Fq12 &elt); + static alt_bn128_G1_precomp precompute_G1(const alt_bn128_G1 &P); + static alt_bn128_G2_precomp precompute_G2(const alt_bn128_G2 &Q); + static alt_bn128_Fq12 miller_loop(const alt_bn128_G1_precomp &prec_P, + const alt_bn128_G2_precomp &prec_Q); + static alt_bn128_Fq12 double_miller_loop(const alt_bn128_G1_precomp &prec_P1, + const alt_bn128_G2_precomp &prec_Q1, + const alt_bn128_G1_precomp &prec_P2, + const alt_bn128_G2_precomp &prec_Q2); + static alt_bn128_Fq12 pairing(const alt_bn128_G1 &P, + const alt_bn128_G2 &Q); + static alt_bn128_Fq12 reduced_pairing(const alt_bn128_G1 &P, + const alt_bn128_G2 &Q); +}; + +} // libsnark + +#endif // ALT_BN128_PP_HPP_ diff --git a/src/algebra/curves/curve_utils.hpp b/src/algebra/curves/curve_utils.hpp new file mode 100644 index 000000000..33a8e1e17 --- /dev/null +++ b/src/algebra/curves/curve_utils.hpp @@ -0,0 +1,22 @@ +/** @file + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef CURVE_UTILS_HPP_ +#define CURVE_UTILS_HPP_ +#include + +#include "algebra/fields/bigint.hpp" + +namespace libsnark { + +template +GroupT scalar_mul(const GroupT &base, const bigint &scalar); + +} // libsnark +#include "algebra/curves/curve_utils.tcc" + +#endif // CURVE_UTILS_HPP_ diff --git a/src/algebra/curves/curve_utils.tcc b/src/algebra/curves/curve_utils.tcc new file mode 100644 index 000000000..251d75d8b --- /dev/null +++ b/src/algebra/curves/curve_utils.tcc @@ -0,0 +1,37 @@ +/** @file + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef CURVE_UTILS_TCC_ +#define CURVE_UTILS_TCC_ + +namespace libsnark { + +template +GroupT scalar_mul(const GroupT &base, const bigint &scalar) +{ + GroupT result = GroupT::zero(); + + bool found_one = false; + for (long i = scalar.max_bits() - 1; i >= 0; --i) + { + if (found_one) + { + result = result.dbl(); + } + + if (scalar.test_bit(i)) + { + found_one = true; + result = result + base; + } + } + + return result; +} + +} // libsnark +#endif // CURVE_UTILS_TCC_ diff --git a/src/algebra/curves/public_params.hpp b/src/algebra/curves/public_params.hpp new file mode 100644 index 000000000..07e047560 --- /dev/null +++ b/src/algebra/curves/public_params.hpp @@ -0,0 +1,103 @@ +/** @file + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef PUBLIC_PARAMS_HPP_ +#define PUBLIC_PARAMS_HPP_ +#include + +namespace libsnark { + +/* + for every curve the user should define corresponding + public_params with the following typedefs: + + Fp_type + G1_type + G2_type + G1_precomp_type + G2_precomp_type + affine_ate_G1_precomp_type + affine_ate_G2_precomp_type + Fq_type + Fqe_type + Fqk_type + GT_type + + one should also define the following static methods: + + void init_public_params(); + + GT final_exponentiation(const Fqk &elt); + + G1_precomp precompute_G1(const G1 &P); + G2_precomp precompute_G2(const G2 &Q); + + Fqk miller_loop(const G1_precomp &prec_P, + const G2_precomp &prec_Q); + + affine_ate_G1_precomp affine_ate_precompute_G1(const G1 &P); + affine_ate_G2_precomp affine_ate_precompute_G2(const G2 &Q); + + + Fqk affine_ate_miller_loop(const affine_ate_G1_precomp &prec_P, + const affine_ate_G2_precomp &prec_Q); + Fqk affine_ate_e_over_e_miller_loop(const affine_ate_G1_precomp &prec_P1, + const affine_ate_G2_precomp &prec_Q1, + const affine_ate_G1_precomp &prec_P2, + const affine_ate_G2_precomp &prec_Q2); + Fqk affine_ate_e_times_e_over_e_miller_loop(const affine_ate_G1_precomp &prec_P1, + const affine_ate_G2_precomp &prec_Q1, + const affine_ate_G1_precomp &prec_P2, + const affine_ate_G2_precomp &prec_Q2, + const affine_ate_G1_precomp &prec_P3, + const affine_ate_G2_precomp &prec_Q3); + Fqk double_miller_loop(const G1_precomp &prec_P1, + const G2_precomp &prec_Q1, + const G1_precomp &prec_P2, + const G2_precomp &prec_Q2); + + Fqk pairing(const G1 &P, + const G2 &Q); + GT reduced_pairing(const G1 &P, + const G2 &Q); + GT affine_reduced_pairing(const G1 &P, + const G2 &Q); +*/ + +template +using Fr = typename EC_ppT::Fp_type; +template +using G1 = typename EC_ppT::G1_type; +template +using G2 = typename EC_ppT::G2_type; +template +using G1_precomp = typename EC_ppT::G1_precomp_type; +template +using G2_precomp = typename EC_ppT::G2_precomp_type; +template +using affine_ate_G1_precomp = typename EC_ppT::affine_ate_G1_precomp_type; +template +using affine_ate_G2_precomp = typename EC_ppT::affine_ate_G2_precomp_type; +template +using Fq = typename EC_ppT::Fq_type; +template +using Fqe = typename EC_ppT::Fqe_type; +template +using Fqk = typename EC_ppT::Fqk_type; +template +using GT = typename EC_ppT::GT_type; + +template +using Fr_vector = std::vector >; +template +using G1_vector = std::vector >; +template +using G2_vector = std::vector >; + +} // libsnark + +#endif // PUBLIC_PARAMS_HPP_ diff --git a/src/algebra/curves/tests/test_bilinearity.cpp b/src/algebra/curves/tests/test_bilinearity.cpp new file mode 100644 index 000000000..295745281 --- /dev/null +++ b/src/algebra/curves/tests/test_bilinearity.cpp @@ -0,0 +1,136 @@ +/** + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ +#include "common/profiling.hpp" +#include "algebra/curves/edwards/edwards_pp.hpp" +#ifdef CURVE_BN128 +#include "algebra/curves/bn128/bn128_pp.hpp" +#endif +#include "algebra/curves/alt_bn128/alt_bn128_pp.hpp" +#include "algebra/curves/mnt/mnt4/mnt4_pp.hpp" +#include "algebra/curves/mnt/mnt6/mnt6_pp.hpp" + +using namespace libsnark; + +template +void pairing_test() +{ + GT GT_one = GT::one(); + + printf("Running bilinearity tests:\n"); + G1 P = (Fr::random_element()) * G1::one(); + //G1 P = Fr("2") * G1::one(); + G2 Q = (Fr::random_element()) * G2::one(); + //G2 Q = Fr("3") * G2::one(); + + printf("P:\n"); + P.print(); + P.print_coordinates(); + printf("Q:\n"); + Q.print(); + Q.print_coordinates(); + printf("\n\n"); + + Fr s = Fr::random_element(); + //Fr s = Fr("2"); + G1 sP = s * P; + G2 sQ = s * Q; + + printf("Pairing bilinearity tests (three must match):\n"); + GT ans1 = ppT::reduced_pairing(sP, Q); + GT ans2 = ppT::reduced_pairing(P, sQ); + GT ans3 = ppT::reduced_pairing(P, Q)^s; + ans1.print(); + ans2.print(); + ans3.print(); + assert(ans1 == ans2); + assert(ans2 == ans3); + + assert(ans1 != GT_one); + assert((ans1^Fr::field_char()) == GT_one); + printf("\n\n"); +} + +template +void double_miller_loop_test() +{ + const G1 P1 = (Fr::random_element()) * G1::one(); + const G1 P2 = (Fr::random_element()) * G1::one(); + const G2 Q1 = (Fr::random_element()) * G2::one(); + const G2 Q2 = (Fr::random_element()) * G2::one(); + + const G1_precomp prec_P1 = ppT::precompute_G1(P1); + const G1_precomp prec_P2 = ppT::precompute_G1(P2); + const G2_precomp prec_Q1 = ppT::precompute_G2(Q1); + const G2_precomp prec_Q2 = ppT::precompute_G2(Q2); + + const Fqk ans_1 = ppT::miller_loop(prec_P1, prec_Q1); + const Fqk ans_2 = ppT::miller_loop(prec_P2, prec_Q2); + const Fqk ans_12 = ppT::double_miller_loop(prec_P1, prec_Q1, prec_P2, prec_Q2); + assert(ans_1 * ans_2 == ans_12); +} + +template +void affine_pairing_test() +{ + GT GT_one = GT::one(); + + printf("Running bilinearity tests:\n"); + G1 P = (Fr::random_element()) * G1::one(); + G2 Q = (Fr::random_element()) * G2::one(); + + printf("P:\n"); + P.print(); + printf("Q:\n"); + Q.print(); + printf("\n\n"); + + Fr s = Fr::random_element(); + G1 sP = s * P; + G2 sQ = s * Q; + + printf("Pairing bilinearity tests (three must match):\n"); + GT ans1 = ppT::affine_reduced_pairing(sP, Q); + GT ans2 = ppT::affine_reduced_pairing(P, sQ); + GT ans3 = ppT::affine_reduced_pairing(P, Q)^s; + ans1.print(); + ans2.print(); + ans3.print(); + assert(ans1 == ans2); + assert(ans2 == ans3); + + assert(ans1 != GT_one); + assert((ans1^Fr::field_char()) == GT_one); + printf("\n\n"); +} + +int main(void) +{ + start_profiling(); + edwards_pp::init_public_params(); + pairing_test(); + double_miller_loop_test(); + + mnt6_pp::init_public_params(); + pairing_test(); + double_miller_loop_test(); + affine_pairing_test(); + + mnt4_pp::init_public_params(); + pairing_test(); + double_miller_loop_test(); + affine_pairing_test(); + + alt_bn128_pp::init_public_params(); + pairing_test(); + double_miller_loop_test(); + +#ifdef CURVE_BN128 // BN128 has fancy dependencies so it may be disabled + bn128_pp::init_public_params(); + pairing_test(); + double_miller_loop_test(); +#endif +} diff --git a/src/algebra/curves/tests/test_groups.cpp b/src/algebra/curves/tests/test_groups.cpp new file mode 100644 index 000000000..725e490d7 --- /dev/null +++ b/src/algebra/curves/tests/test_groups.cpp @@ -0,0 +1,175 @@ +/** + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ +#include "common/profiling.hpp" +#include "algebra/curves/edwards/edwards_pp.hpp" +#include "algebra/curves/mnt/mnt4/mnt4_pp.hpp" +#include "algebra/curves/mnt/mnt6/mnt6_pp.hpp" +#ifdef CURVE_BN128 +#include "algebra/curves/bn128/bn128_pp.hpp" +#endif +#include "algebra/curves/alt_bn128/alt_bn128_pp.hpp" +#include + +using namespace libsnark; + +template +void test_mixed_add() +{ + GroupT base, el, result; + + base = GroupT::zero(); + el = GroupT::zero(); + el.to_special(); + result = base.mixed_add(el); + assert(result == base + el); + + base = GroupT::zero(); + el = GroupT::random_element(); + el.to_special(); + result = base.mixed_add(el); + assert(result == base + el); + + base = GroupT::random_element(); + el = GroupT::zero(); + el.to_special(); + result = base.mixed_add(el); + assert(result == base + el); + + base = GroupT::random_element(); + el = GroupT::random_element(); + el.to_special(); + result = base.mixed_add(el); + assert(result == base + el); + + base = GroupT::random_element(); + el = base; + el.to_special(); + result = base.mixed_add(el); + assert(result == base.dbl()); +} + +template +void test_group() +{ + bigint<1> rand1 = bigint<1>("76749407"); + bigint<1> rand2 = bigint<1>("44410867"); + bigint<1> randsum = bigint<1>("121160274"); + + GroupT zero = GroupT::zero(); + assert(zero == zero); + GroupT one = GroupT::one(); + assert(one == one); + GroupT two = bigint<1>(2l) * GroupT::one(); + assert(two == two); + GroupT five = bigint<1>(5l) * GroupT::one(); + + GroupT three = bigint<1>(3l) * GroupT::one(); + GroupT four = bigint<1>(4l) * GroupT::one(); + + assert(two+five == three+four); + + GroupT a = GroupT::random_element(); + GroupT b = GroupT::random_element(); + + assert(one != zero); + assert(a != zero); + assert(a != one); + + assert(b != zero); + assert(b != one); + + assert(a.dbl() == a + a); + assert(b.dbl() == b + b); + assert(one.add(two) == three); + assert(two.add(one) == three); + assert(a + b == b + a); + assert(a - a == zero); + assert(a - b == a + (-b)); + assert(a - b == (-b) + a); + + // handle special cases + assert(zero + (-a) == -a); + assert(zero - a == -a); + assert(a - zero == a); + assert(a + zero == a); + assert(zero + a == a); + + assert((a + b).dbl() == (a + b) + (b + a)); + assert(bigint<1>("2") * (a + b) == (a + b) + (b + a)); + + assert((rand1 * a) + (rand2 * a) == (randsum * a)); + + assert(GroupT::order() * a == zero); + assert(GroupT::order() * one == zero); + assert((GroupT::order() * a) - a != zero); + assert((GroupT::order() * one) - one != zero); + + test_mixed_add(); +} + +template +void test_mul_by_q() +{ + GroupT a = GroupT::random_element(); + assert((GroupT::base_field_char()*a) == a.mul_by_q()); +} + +template +void test_output() +{ + GroupT g = GroupT::zero(); + + for (size_t i = 0; i < 1000; ++i) + { + std::stringstream ss; + ss << g; + GroupT gg; + ss >> gg; + assert(g == gg); + /* use a random point in next iteration */ + g = GroupT::random_element(); + } +} + +int main(void) +{ + edwards_pp::init_public_params(); + test_group >(); + test_output >(); + test_group >(); + test_output >(); + test_mul_by_q >(); + + mnt4_pp::init_public_params(); + test_group >(); + test_output >(); + test_group >(); + test_output >(); + test_mul_by_q >(); + + mnt6_pp::init_public_params(); + test_group >(); + test_output >(); + test_group >(); + test_output >(); + test_mul_by_q >(); + + alt_bn128_pp::init_public_params(); + test_group >(); + test_output >(); + test_group >(); + test_output >(); + test_mul_by_q >(); + +#ifdef CURVE_BN128 // BN128 has fancy dependencies so it may be disabled + bn128_pp::init_public_params(); + test_group >(); + test_output >(); + test_group >(); + test_output >(); +#endif +} diff --git a/src/algebra/evaluation_domain/domains/basic_radix2_domain.hpp b/src/algebra/evaluation_domain/domains/basic_radix2_domain.hpp new file mode 100644 index 000000000..3e127a063 --- /dev/null +++ b/src/algebra/evaluation_domain/domains/basic_radix2_domain.hpp @@ -0,0 +1,45 @@ +/** @file + ***************************************************************************** + + Declaration of interfaces for the "basic radix-2" evaluation domain. + + Roughly, the domain has size m = 2^k and consists of the m-th roots of unity. + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef BASIC_RADIX2_DOMAIN_HPP_ +#define BASIC_RADIX2_DOMAIN_HPP_ + +#include "algebra/evaluation_domain/evaluation_domain.hpp" + +namespace libsnark { + +template +class basic_radix2_domain : public evaluation_domain { +public: + + FieldT omega; + + basic_radix2_domain(const size_t m); + + void FFT(std::vector &a); + void iFFT(std::vector &a); + void cosetFFT(std::vector &a, const FieldT &g); + void icosetFFT(std::vector &a, const FieldT &g); + std::vector lagrange_coeffs(const FieldT &t); + FieldT get_element(const size_t idx); + FieldT compute_Z(const FieldT &t); + void add_poly_Z(const FieldT &coeff, std::vector &H); + void divide_by_Z_on_coset(std::vector &P); + +}; + +} // libsnark + +#include "algebra/evaluation_domain/domains/basic_radix2_domain.tcc" + +#endif // BASIC_RADIX2_DOMAIN_HPP_ diff --git a/src/algebra/evaluation_domain/domains/basic_radix2_domain.tcc b/src/algebra/evaluation_domain/domains/basic_radix2_domain.tcc new file mode 100644 index 000000000..d315e8319 --- /dev/null +++ b/src/algebra/evaluation_domain/domains/basic_radix2_domain.tcc @@ -0,0 +1,112 @@ +/** @file + ***************************************************************************** + + Implementation of interfaces for the "basic radix-2" evaluation domain. + + See basic_radix2_domain.hpp . + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef BASIC_RADIX2_DOMAIN_TCC_ +#define BASIC_RADIX2_DOMAIN_TCC_ + +#include "algebra/evaluation_domain/domains/basic_radix2_domain_aux.hpp" + +namespace libsnark { + +template +basic_radix2_domain::basic_radix2_domain(const size_t m) : evaluation_domain(m) +{ + assert(m > 1); + const size_t logm = log2(m); + assert(logm <= (FieldT::s)); + + omega = get_root_of_unity(m); +} + +template +void basic_radix2_domain::FFT(std::vector &a) +{ + enter_block("Execute FFT"); + assert(a.size() == this->m); + _basic_radix2_FFT(a, omega); + leave_block("Execute FFT"); +} + +template +void basic_radix2_domain::iFFT(std::vector &a) +{ + enter_block("Execute inverse FFT"); + assert(a.size() == this->m); + _basic_radix2_FFT(a, omega.inverse()); + + const FieldT sconst = FieldT(a.size()).inverse(); + for (size_t i = 0; i < a.size(); ++i) + { + a[i] *= sconst; + } + leave_block("Execute inverse FFT"); +} + +template +void basic_radix2_domain::cosetFFT(std::vector &a, const FieldT &g) +{ + enter_block("Execute coset FFT"); + _multiply_by_coset(a, g); + FFT(a); + leave_block("Execute coset FFT"); +} + +template +void basic_radix2_domain::icosetFFT(std::vector &a, const FieldT &g) +{ + enter_block("Execute inverse coset IFFT"); + iFFT(a); + _multiply_by_coset(a, g.inverse()); + leave_block("Execute inverse coset IFFT"); +} + +template +std::vector basic_radix2_domain::lagrange_coeffs(const FieldT &t) +{ + return _basic_radix2_lagrange_coeffs(this->m, t); +} + +template +FieldT basic_radix2_domain::get_element(const size_t idx) +{ + return omega^idx; +} + +template +FieldT basic_radix2_domain::compute_Z(const FieldT &t) +{ + return (t^this->m) - FieldT::one(); +} + +template +void basic_radix2_domain::add_poly_Z(const FieldT &coeff, std::vector &H) +{ + assert(H.size() == this->m+1); + H[this->m] += coeff; + H[0] -= coeff; +} + +template +void basic_radix2_domain::divide_by_Z_on_coset(std::vector &P) +{ + const FieldT coset = FieldT::multiplicative_generator; + const FieldT Z_inverse_at_coset = this->compute_Z(coset).inverse(); + for (size_t i = 0; i < this->m; ++i) + { + P[i] *= Z_inverse_at_coset; + } +} + +} // libsnark + +#endif // BASIC_RADIX2_DOMAIN_TCC_ diff --git a/src/algebra/evaluation_domain/domains/basic_radix2_domain_aux.hpp b/src/algebra/evaluation_domain/domains/basic_radix2_domain_aux.hpp new file mode 100644 index 000000000..c42ab2f6f --- /dev/null +++ b/src/algebra/evaluation_domain/domains/basic_radix2_domain_aux.hpp @@ -0,0 +1,48 @@ +/** @file + ***************************************************************************** + + Declaration of interfaces for auxiliary functions for the "basic radix-2" evaluation domain. + + These functions compute the radix-2 FFT (in single- or multi-thread mode) and, + also compute Lagrange coefficients. + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef BASIC_RADIX2_DOMAIN_AUX_HPP_ +#define BASIC_RADIX2_DOMAIN_AUX_HPP_ + +namespace libsnark { + +/** + * Compute the radix-2 FFT of the vector a over the set S={omega^{0},...,omega^{m-1}}. + */ +template +void _basic_radix2_FFT(std::vector &a, const FieldT &omega); + +/** + * A multi-thread version of _basic_radix2_FFT. + */ +template +void _parallel_basic_radix2_FFT(std::vector &a, const FieldT &omega); + +/** + * Translate the vector a to a coset defined by g. + */ +template +void _multiply_by_coset(std::vector &a, const FieldT &g); + +/** + * Compute the m Lagrange coefficients, relative to the set S={omega^{0},...,omega^{m-1}}, at the field element t. + */ +template +std::vector _basic_radix2_lagrange_coeffs(const size_t m, const FieldT &t); + +} // libsnark + +#include "algebra/evaluation_domain/domains/basic_radix2_domain_aux.tcc" + +#endif // BASIC_RADIX2_DOMAIN_AUX_HPP_ diff --git a/src/algebra/evaluation_domain/domains/basic_radix2_domain_aux.tcc b/src/algebra/evaluation_domain/domains/basic_radix2_domain_aux.tcc new file mode 100644 index 000000000..138b82dbc --- /dev/null +++ b/src/algebra/evaluation_domain/domains/basic_radix2_domain_aux.tcc @@ -0,0 +1,242 @@ +/** @file + ***************************************************************************** + + Implementation of interfaces for auxiliary functions for the "basic radix-2" evaluation domain. + + See basic_radix2_domain_aux.hpp . + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef BASIC_RADIX2_DOMAIN_AUX_TCC_ +#define BASIC_RADIX2_DOMAIN_AUX_TCC_ + +#include +#ifdef MULTICORE +#include +#endif +#include "algebra/fields/field_utils.hpp" +#include "common/profiling.hpp" +#include "common/utils.hpp" + +namespace libsnark { + +#ifdef MULTICORE +#define _basic_radix2_FFT _basic_parallel_radix2_FFT +#else +#define _basic_radix2_FFT _basic_serial_radix2_FFT +#endif + +/* + Below we make use of pseudocode from [CLRS 2n Ed, pp. 864]. + Also, note that it's the caller's responsibility to multiply by 1/N. + */ +template +void _basic_serial_radix2_FFT(std::vector &a, const FieldT &omega) +{ + const size_t n = a.size(), logn = log2(n); + assert(n == (1u << logn)); + + /* swapping in place (from Storer's book) */ + for (size_t k = 0; k < n; ++k) + { + const size_t rk = bitreverse(k, logn); + if (k < rk) + std::swap(a[k], a[rk]); + } + + size_t m = 1; // invariant: m = 2^{s-1} + for (size_t s = 1; s <= logn; ++s) + { + // w_m is 2^s-th root of unity now + const FieldT w_m = omega^(n/(2*m)); + + asm volatile ("/* pre-inner */"); + for (size_t k = 0; k < n; k += 2*m) + { + FieldT w = FieldT::one(); + for (size_t j = 0; j < m; ++j) + { + const FieldT t = w * a[k+j+m]; + a[k+j+m] = a[k+j] - t; + a[k+j] += t; + w *= w_m; + } + } + asm volatile ("/* post-inner */"); + m *= 2; + } +} + +template +void _basic_parallel_radix2_FFT_inner(std::vector &a, const FieldT &omega, const size_t log_cpus) +{ + const size_t num_cpus = 1ul< > tmp(num_cpus); + for (size_t j = 0; j < num_cpus; ++j) + { + tmp[j].resize(1ul<<(log_m-log_cpus), FieldT::zero()); + } + +#ifdef MULTICORE + #pragma omp parallel for +#endif + for (size_t j = 0; j < num_cpus; ++j) + { + const FieldT omega_j = omega^j; + const FieldT omega_step = omega^(j<<(log_m - log_cpus)); + + FieldT elt = FieldT::one(); + for (size_t i = 0; i < 1ul<<(log_m - log_cpus); ++i) + { + for (size_t s = 0; s < num_cpus; ++s) + { + // invariant: elt is omega^(j*idx) + const size_t idx = (i + (s<<(log_m - log_cpus))) % (1u << log_m); + tmp[j][i] += a[idx] * elt; + elt *= omega_step; + } + elt *= omega_j; + } + } + leave_block("Shuffle inputs"); + + enter_block("Execute sub-FFTs"); + const FieldT omega_num_cpus = omega^num_cpus; + +#ifdef MULTICORE + #pragma omp parallel for +#endif + for (size_t j = 0; j < num_cpus; ++j) + { + _basic_serial_radix2_FFT(tmp[j], omega_num_cpus); + } + leave_block("Execute sub-FFTs"); + + enter_block("Re-shuffle outputs"); + +#ifdef MULTICORE + #pragma omp parallel for +#endif + for (size_t i = 0; i < num_cpus; ++i) + { + for (size_t j = 0; j < 1ul<<(log_m - log_cpus); ++j) + { + // now: i = idx >> (log_m - log_cpus) and j = idx % (1u << (log_m - log_cpus)), for idx = ((i<<(log_m-log_cpus))+j) % (1u << log_m) + a[(j< +void _basic_parallel_radix2_FFT(std::vector &a, const FieldT &omega) +{ +#ifdef MULTICORE + const size_t num_cpus = omp_get_max_threads(); +#else + const size_t num_cpus = 1; +#endif + const size_t log_cpus = ((num_cpus & (num_cpus - 1)) == 0 ? log2(num_cpus) : log2(num_cpus) - 1); + +#ifdef DEBUG + print_indent(); printf("* Invoking parallel FFT on 2^%zu CPUs (omp_get_max_threads = %zu)\n", log_cpus, num_cpus); +#endif + + if (log_cpus == 0) + { + _basic_serial_radix2_FFT(a, omega); + } + else + { + _basic_parallel_radix2_FFT_inner(a, omega, log_cpus); + } +} + +template +void _multiply_by_coset(std::vector &a, const FieldT &g) +{ + //enter_block("Multiply by coset"); + FieldT u = g; + for (size_t i = 1; i < a.size(); ++i) + { + a[i] *= u; + u *= g; + } + //leave_block("Multiply by coset"); +} + +template +std::vector _basic_radix2_lagrange_coeffs(const size_t m, const FieldT &t) +{ + if (m == 1) + { + return std::vector(1, FieldT::one()); + } + + assert(m == (1u << log2(m))); + + const FieldT omega = get_root_of_unity(m); + + std::vector u(m, FieldT::zero()); + + /* + If t equals one of the roots of unity in S={omega^{0},...,omega^{m-1}} + then output 1 at the right place, and 0 elsewhere + */ + + if ((t^m) == (FieldT::one())) + { + FieldT omega_i = FieldT::one(); + for (size_t i = 0; i < m; ++i) + { + if (omega_i == t) // i.e., t equals omega^i + { + u[i] = FieldT::one(); + return u; + } + + omega_i *= omega; + } + } + + /* + Otherwise, if t does not equal any of the roots of unity in S, + then compute each L_{i,S}(t) as Z_{S}(t) * v_i / (t-\omega^i) + where: + - Z_{S}(t) = \prod_{j} (t-\omega^j) = (t^m-1), and + - v_{i} = 1 / \prod_{j \neq i} (\omega^i-\omega^j). + Below we use the fact that v_{0} = 1/m and v_{i+1} = \omega * v_{i}. + */ + + const FieldT Z = (t^m)-FieldT::one(); + FieldT l = Z * FieldT(m).inverse(); + FieldT r = FieldT::one(); + for (size_t i = 0; i < m; ++i) + { + u[i] = l * (t - r).inverse(); + l *= omega; + r *= omega; + } + + return u; +} + +} // libsnark + +#endif // BASIC_RADIX2_DOMAIN_AUX_TCC_ diff --git a/src/algebra/evaluation_domain/evaluation_domain.hpp b/src/algebra/evaluation_domain/evaluation_domain.hpp new file mode 100644 index 000000000..358db9798 --- /dev/null +++ b/src/algebra/evaluation_domain/evaluation_domain.hpp @@ -0,0 +1,125 @@ +/** @file + ***************************************************************************** + + Declaration of interfaces for evaluation domains. + + Roughly, given a desired size m for the domain, the constructor selects + a choice of domain S with size ~m that has been selected so to optimize + - computations of Lagrange polynomials, and + - FFT/iFFT computations. + An evaluation domain also provides other other functions, e.g., accessing + individual elements in S or evaluating its vanishing polynomial. + + The descriptions below make use of the definition of a *Lagrange polynomial*, + which we recall. Given a field F, a subset S=(a_i)_i of F, and an index idx + in {0,...,|S-1|}, the idx-th Lagrange polynomial (wrt to subset S) is defined to be + \f[ L_{idx,S}(z) := prod_{k \neq idx} (z - a_k) / prod_{k \neq idx} (a_{idx} - a_k) \f] + Note that, by construction: + \f[ \forall j \neq idx: L_{idx,S}(a_{idx}) = 1 \text{ and } L_{idx,S}(a_j) = 0 \f] + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef EVALUATION_DOMAIN_HPP_ +#define EVALUATION_DOMAIN_HPP_ + +#include + +namespace libsnark { + +/** + * An evaluation domain. + */ +template +class evaluation_domain { +public: + + const size_t m; + + /** + * Construct an evaluation domain S of size m, if possible. + * + * (See the function get_evaluation_domain below.) + */ + evaluation_domain(const size_t m) : m(m) {}; + + /** + * Get the idx-th element in S. + */ + virtual FieldT get_element(const size_t idx) = 0; + + /** + * Compute the FFT, over the domain S, of the vector a. + */ + virtual void FFT(std::vector &a) = 0; + + /** + * Compute the inverse FFT, over the domain S, of the vector a. + */ + virtual void iFFT(std::vector &a) = 0; + + /** + * Compute the FFT, over the domain g*S, of the vector a. + */ + virtual void cosetFFT(std::vector &a, const FieldT &g) = 0; + + /** + * Compute the inverse FFT, over the domain g*S, of the vector a. + */ + virtual void icosetFFT(std::vector &a, const FieldT &g) = 0; + + /** + * Evaluate all Lagrange polynomials. + * + * The inputs are: + * - an integer m + * - an element t + * The output is a vector (b_{0},...,b_{m-1}) + * where b_{i} is the evaluation of L_{i,S}(z) at z = t. + */ + virtual std::vector lagrange_coeffs(const FieldT &t) = 0; + + /** + * Evaluate the vanishing polynomial of S at the field element t. + */ + virtual FieldT compute_Z(const FieldT &t) = 0; + + /** + * Add the coefficients of the vanishing polynomial of S to the coefficients of the polynomial H. + */ + virtual void add_poly_Z(const FieldT &coeff, std::vector &H) = 0; + + /** + * Multiply by the evaluation, on a coset of S, of the inverse of the vanishing polynomial of S. + */ + virtual void divide_by_Z_on_coset(std::vector &P) = 0; +}; + +/** + * Return an evaluation domain object in which the domain S has size |S| >= min_size. + * The function chooses from different supported domains, depending on min_size. + */ +template +std::shared_ptr > get_evaluation_domain(const size_t min_size); + +/** + * Naive evaluation of a *single* Lagrange polynomial, used for testing purposes. + * + * The inputs are: + * - an integer m + * - a domain S = (a_{0},...,a_{m-1}) of size m + * - a field element element t + * - an index idx in {0,...,m-1} + * The output is the polynomial L_{idx,S}(z) evaluated at z = t. + */ +template +FieldT lagrange_eval(const size_t m, const std::vector &domain, const FieldT &t, const size_t idx); + +} // libsnark + +#include "algebra/evaluation_domain/evaluation_domain.tcc" + +#endif // EVALUATION_DOMAIN_HPP_ diff --git a/src/algebra/evaluation_domain/evaluation_domain.tcc b/src/algebra/evaluation_domain/evaluation_domain.tcc new file mode 100644 index 000000000..8e3ea7a62 --- /dev/null +++ b/src/algebra/evaluation_domain/evaluation_domain.tcc @@ -0,0 +1,117 @@ +/** @file + ***************************************************************************** + + Imeplementation of interfaces for evaluation domains. + + See evaluation_domain.hpp . + + We currently implement, and select among, three types of domains: + - "basic radix-2": the domain has size m = 2^k and consists of the m-th roots of unity + - "extended radix-2": the domain has size m = 2^{k+1} and consists of "the m-th roots of unity" union "a coset" + - "step radix-2": the domain has size m = 2^k + 2^r and consists of "the 2^k-th roots of unity" union "a coset of 2^r-th roots of unity" + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef EVALUATION_DOMAIN_TCC_ +#define EVALUATION_DOMAIN_TCC_ + +#include +#include "algebra/fields/field_utils.hpp" +#include "algebra/evaluation_domain/domains/basic_radix2_domain.hpp" + +namespace libsnark { + +template +std::shared_ptr > get_evaluation_domain(const size_t min_size) +{ + assert(min_size > 1); + const size_t log_min_size = log2(min_size); + assert(log_min_size <= (FieldT::s+1)); + + std::shared_ptr > result; + if (min_size == (1u << log_min_size)) + { + if (log_min_size == FieldT::s+1) + { + if (!inhibit_profiling_info) + { + print_indent(); printf("* Selected domain: extended_radix2\n"); + } + assert(0); + } + else + { + if (!inhibit_profiling_info) + { + print_indent(); printf("* Selected domain: basic_radix2\n"); + } + result.reset(new basic_radix2_domain(min_size)); + } + } + else + { + const size_t big = 1ul<<(log2(min_size)-1); + const size_t small = min_size - big; + const size_t rounded_small = (1ul<(big + rounded_small)); + } + else + { + if (!inhibit_profiling_info) + { + print_indent(); printf("* Selected domain: extended_radix2\n"); + } + assert(0); + } + } + else + { + if (!inhibit_profiling_info) + { + print_indent(); printf("* Selected domain: step_radix2\n"); + } + assert(0); + } + } + + return result; +} + +template +FieldT lagrange_eval(const size_t m, const std::vector &domain, const FieldT &t, const size_t idx) +{ + assert(m == domain.size()); + assert(idx < m); + + FieldT num = FieldT::one(); + FieldT denom = FieldT::one(); + + for (size_t k = 0; k < m; ++k) + { + if (k == idx) + { + continue; + } + + num *= t - domain[k]; + denom *= domain[idx] - domain[k]; + } + + return num * denom.inverse(); +} + +} // libsnark + +#endif // EVALUATION_DOMAIN_TCC_ diff --git a/src/algebra/exponentiation/exponentiation.hpp b/src/algebra/exponentiation/exponentiation.hpp new file mode 100644 index 000000000..a8a2c925c --- /dev/null +++ b/src/algebra/exponentiation/exponentiation.hpp @@ -0,0 +1,31 @@ +/** @file + ***************************************************************************** + + Declaration of interfaces for (square-and-multiply) exponentiation. + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef EXPONENTIATION_HPP_ +#define EXPONENTIATION_HPP_ + +#include + +#include "algebra/fields/bigint.hpp" + +namespace libsnark { + +template +FieldT power(const FieldT &base, const bigint &exponent); + +template +FieldT power(const FieldT &base, const unsigned long exponent); + +} // libsnark + +#include "algebra/exponentiation/exponentiation.tcc" + +#endif // EXPONENTIATION_HPP_ diff --git a/src/algebra/exponentiation/exponentiation.tcc b/src/algebra/exponentiation/exponentiation.tcc new file mode 100644 index 000000000..dd557eb12 --- /dev/null +++ b/src/algebra/exponentiation/exponentiation.tcc @@ -0,0 +1,53 @@ +/** @file + ***************************************************************************** + + Implementation of interfaces for (square-and-multiply) exponentiation. + + See exponentiation.hpp . + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef EXPONENTIATION_TCC_ +#define EXPONENTIATION_TCC_ + +#include "common/utils.hpp" + +namespace libsnark { + +template +FieldT power(const FieldT &base, const bigint &exponent) +{ + FieldT result = FieldT::one(); + + bool found_one = false; + + for (long i = exponent.max_bits() - 1; i >= 0; --i) + { + if (found_one) + { + result = result * result; + } + + if (exponent.test_bit(i)) + { + found_one = true; + result = result * base; + } + } + + return result; +} + +template +FieldT power(const FieldT &base, const unsigned long exponent) +{ + return power(base, bigint<1>(exponent)); +} + +} // libsnark + +#endif // EXPONENTIATION_TCC_ diff --git a/src/algebra/fields/bigint.hpp b/src/algebra/fields/bigint.hpp new file mode 100644 index 000000000..ff00dd5cf --- /dev/null +++ b/src/algebra/fields/bigint.hpp @@ -0,0 +1,70 @@ +/** @file + ***************************************************************************** + Declaration of bigint wrapper class around GMP's MPZ long integers. + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef BIGINT_HPP_ +#define BIGINT_HPP_ +#include +#include +#include +#include "common/serialization.hpp" + +namespace libsnark { + +template class bigint; +template std::ostream& operator<<(std::ostream &, const bigint&); +template std::istream& operator>>(std::istream &, bigint&); + +/** + * Wrapper class around GMP's MPZ long integers. It supports arithmetic operations, + * serialization and randomization. Serialization is fragile, see common/serialization.hpp. + */ + +template +class bigint { +public: + static const mp_size_t N = n; + + mp_limb_t data[n] = {0}; + + bigint() = default; + bigint(const unsigned long x); /// Initalize from a small integer + bigint(const char* s); /// Initialize from a string containing an integer in decimal notation + bigint(const mpz_t r); /// Initialize from MPZ element + + void print() const; + void print_hex() const; + bool operator==(const bigint& other) const; + bool operator!=(const bigint& other) const; + void clear(); + bool is_zero() const; + size_t max_bits() const { return n * GMP_NUMB_BITS; } + size_t num_bits() const; + + unsigned long as_ulong() const; /* return the last limb of the integer */ + void to_mpz(mpz_t r) const; + bool test_bit(const std::size_t bitno) const; + + template inline void operator+=(const bigint& other); + template inline bigint operator*(const bigint& other) const; + template static inline void div_qr(bigint& quotient, bigint& remainder, + const bigint& dividend, const bigint& divisor); + template inline bigint shorten(const bigint& q, const char *msg) const; + + inline void limit(const bigint& q, const char *msg) const; + bool operator>(const bigint& other) const; + + bigint& randomize(); + + friend std::ostream& operator<< (std::ostream &out, const bigint &b); + friend std::istream& operator>> (std::istream &in, bigint &b); +}; + +} // libsnark +#include "algebra/fields/bigint.tcc" +#endif diff --git a/src/algebra/fields/bigint.tcc b/src/algebra/fields/bigint.tcc new file mode 100644 index 000000000..f81addf45 --- /dev/null +++ b/src/algebra/fields/bigint.tcc @@ -0,0 +1,278 @@ +/** @file + ***************************************************************************** + Implementation of bigint wrapper class around GMP's MPZ long integers. + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef BIGINT_TCC_ +#define BIGINT_TCC_ +#include +#include +#include +#include "sodium.h" + +namespace libsnark { + +template +bigint::bigint(const unsigned long x) /// Initalize from a small integer +{ + static_assert(ULONG_MAX <= GMP_NUMB_MAX, "unsigned long does not fit in a GMP limb"); + this->data[0] = x; +} + +template +bigint::bigint(const char* s) /// Initialize from a string containing an integer in decimal notation +{ + size_t l = strlen(s); + unsigned char* s_copy = new unsigned char[l]; + + for (size_t i = 0; i < l; ++i) + { + assert(s[i] >= '0' && s[i] <= '9'); + s_copy[i] = s[i] - '0'; + } + + mp_size_t limbs_written = mpn_set_str(this->data, s_copy, l, 10); + assert(limbs_written <= n); + + delete[] s_copy; +} + +template +bigint::bigint(const mpz_t r) /// Initialize from MPZ element +{ + mpz_t k; + mpz_init_set(k, r); + + for (size_t i = 0; i < n; ++i) + { + data[i] = mpz_get_ui(k); + mpz_fdiv_q_2exp(k, k, GMP_NUMB_BITS); + } + + assert(mpz_sgn(k) == 0); + mpz_clear(k); +} + +template +void bigint::print() const +{ + gmp_printf("%Nd\n", this->data, n); +} + +template +void bigint::print_hex() const +{ + gmp_printf("%Nx\n", this->data, n); +} + +template +bool bigint::operator==(const bigint& other) const +{ + return (mpn_cmp(this->data, other.data, n) == 0); +} + +template +bool bigint::operator!=(const bigint& other) const +{ + return !(operator==(other)); +} + +template +void bigint::clear() +{ + mpn_zero(this->data, n); +} + +template +bool bigint::is_zero() const +{ + for (mp_size_t i = 0; i < n; ++i) + { + if (this->data[i]) + { + return false; + } + } + + return true; +} + +template +size_t bigint::num_bits() const +{ +/* + for (long i = max_bits(); i >= 0; --i) + { + if (this->test_bit(i)) + { + return i+1; + } + } + + return 0; +*/ + for (long i = n-1; i >= 0; --i) + { + mp_limb_t x = this->data[i]; + if (x == 0) + { + continue; + } + else + { + return ((i+1) * GMP_NUMB_BITS) - __builtin_clzl(x); + } + } + return 0; +} + +template +unsigned long bigint::as_ulong() const +{ + return this->data[0]; +} + +template +void bigint::to_mpz(mpz_t r) const +{ + mpz_set_ui(r, 0); + + for (int i = n-1; i >= 0; --i) + { + mpz_mul_2exp(r, r, GMP_NUMB_BITS); + mpz_add_ui(r, r, this->data[i]); + } +} + +template +bool bigint::test_bit(const std::size_t bitno) const +{ + if (bitno >= n * GMP_NUMB_BITS) + { + return false; + } + else + { + const std::size_t part = bitno/GMP_NUMB_BITS; + const std::size_t bit = bitno - (GMP_NUMB_BITS*part); + const mp_limb_t one = 1; + return (this->data[part] & (one< template +inline void bigint::operator+=(const bigint& other) +{ + static_assert(n >= m, "first arg must not be smaller than second arg for bigint in-place add"); + mpn_add(data, data, n, other.data, m); +} + +template template +inline bigint bigint::operator*(const bigint& other) const +{ + static_assert(n >= m, "first arg must not be smaller than second arg for bigint mul"); + bigint res; + mpn_mul(res.data, data, n, other.data, m); + return res; +} + +template template +inline void bigint::div_qr(bigint& quotient, bigint& remainder, + const bigint& dividend, const bigint& divisor) +{ + static_assert(n >= d, "dividend must not be smaller than divisor for bigint::div_qr"); + assert(divisor.data[d-1] != 0); + mpn_tdiv_qr(quotient.data, remainder.data, 0, dividend.data, n, divisor.data, d); +} + +// Return a copy shortened to m limbs provided it is less than limit, throwing std::domain_error if not in range. +template template +inline bigint bigint::shorten(const bigint& q, const char *msg) const +{ + static_assert(m <= n, "number of limbs must not increase for bigint::shorten"); + for (mp_size_t i = m; i < n; i++) { // high-order limbs + if (data[i] != 0) { + throw std::domain_error(msg); + } + } + bigint res; + mpn_copyi(res.data, data, n); + res.limit(q, msg); + return res; +} + +template +inline void bigint::limit(const bigint& q, const char *msg) const +{ + if (!(q > *this)) { + throw std::domain_error(msg); + } +} + +template +inline bool bigint::operator>(const bigint& other) const +{ + return mpn_cmp(this->data, other.data, n) > 0; +} + +template +bigint& bigint::randomize() +{ + assert(GMP_NUMB_BITS == sizeof(mp_limb_t) * 8); + + randombytes_buf(this->data, sizeof(mp_limb_t) * n); + + return (*this); +} + + +template +std::ostream& operator<<(std::ostream &out, const bigint &b) +{ +#ifdef BINARY_OUTPUT + out.write((char*)b.data, sizeof(b.data[0]) * n); +#else + mpz_t t; + mpz_init(t); + b.to_mpz(t); + + out << t; + + mpz_clear(t); +#endif + return out; +} + +template +std::istream& operator>>(std::istream &in, bigint &b) +{ +#ifdef BINARY_OUTPUT + in.read((char*)b.data, sizeof(b.data[0]) * n); +#else + std::string s; + in >> s; + + size_t l = s.size(); + unsigned char* s_copy = new unsigned char[l]; + + for (size_t i = 0; i < l; ++i) + { + assert(s[i] >= '0' && s[i] <= '9'); + s_copy[i] = s[i] - '0'; + } + + mp_size_t limbs_written = mpn_set_str(b.data, s_copy, l, 10); + assert(limbs_written <= n); + + delete[] s_copy; +#endif + return in; +} + +} // libsnark +#endif // BIGINT_TCC_ diff --git a/src/algebra/fields/field_utils.hpp b/src/algebra/fields/field_utils.hpp new file mode 100644 index 000000000..a07ecfe28 --- /dev/null +++ b/src/algebra/fields/field_utils.hpp @@ -0,0 +1,51 @@ +/** @file + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef FIELD_UTILS_HPP_ +#define FIELD_UTILS_HPP_ +#include + +#include "common/utils.hpp" +#include "algebra/fields/bigint.hpp" + +namespace libsnark { + +// returns root of unity of order n (for n a power of 2), if one exists +template +FieldT get_root_of_unity(const size_t n); + +template +std::vector pack_int_vector_into_field_element_vector(const std::vector &v, const size_t w); + +template +std::vector pack_bit_vector_into_field_element_vector(const bit_vector &v, const size_t chunk_bits); + +template +std::vector pack_bit_vector_into_field_element_vector(const bit_vector &v); + +template +std::vector convert_bit_vector_to_field_element_vector(const bit_vector &v); + +template +bit_vector convert_field_element_vector_to_bit_vector(const std::vector &v); + +template +bit_vector convert_field_element_to_bit_vector(const FieldT &el); + +template +bit_vector convert_field_element_to_bit_vector(const FieldT &el, const size_t bitcount); + +template +FieldT convert_bit_vector_to_field_element(const bit_vector &v); + +template +void batch_invert(std::vector &vec); + +} // libsnark +#include "algebra/fields/field_utils.tcc" + +#endif // FIELD_UTILS_HPP_ diff --git a/src/algebra/fields/field_utils.tcc b/src/algebra/fields/field_utils.tcc new file mode 100644 index 000000000..13197b226 --- /dev/null +++ b/src/algebra/fields/field_utils.tcc @@ -0,0 +1,183 @@ +/** @file + ***************************************************************************** + Implementation of misc. math and serialization utility functions + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef FIELD_UTILS_TCC_ +#define FIELD_UTILS_TCC_ + +#include "common/utils.hpp" + +namespace libsnark { + +template +FieldT coset_shift() +{ + return FieldT::multiplicative_generator.squared(); +} + +template +FieldT get_root_of_unity(const size_t n) +{ + const size_t logn = log2(n); + assert(n == (1u << logn)); + assert(logn <= FieldT::s); + + FieldT omega = FieldT::root_of_unity; + for (size_t i = FieldT::s; i > logn; --i) + { + omega *= omega; + } + + return omega; +} + +template +std::vector pack_int_vector_into_field_element_vector(const std::vector &v, const size_t w) +{ + const size_t chunk_bits = FieldT::capacity(); + const size_t repacked_size = div_ceil(v.size() * w, chunk_bits); + std::vector result(repacked_size); + + for (size_t i = 0; i < repacked_size; ++i) + { + bigint b; + for (size_t j = 0; j < chunk_bits; ++j) + { + const size_t word_index = (i * chunk_bits + j) / w; + const size_t pos_in_word = (i * chunk_bits + j) % w; + const size_t word_or_0 = (word_index < v.size() ? v[word_index] : 0); + const size_t bit = (word_or_0 >> pos_in_word) & 1; + + b.data[j / GMP_NUMB_BITS] |= bit << (j % GMP_NUMB_BITS); + } + result[i] = FieldT(b); + } + + return result; +} + +template +std::vector pack_bit_vector_into_field_element_vector(const bit_vector &v, const size_t chunk_bits) +{ + assert(chunk_bits <= FieldT::capacity()); + + const size_t repacked_size = div_ceil(v.size(), chunk_bits); + std::vector result(repacked_size); + + for (size_t i = 0; i < repacked_size; ++i) + { + bigint b; + for (size_t j = 0; j < chunk_bits; ++j) + { + b.data[j / GMP_NUMB_BITS] |= ((i * chunk_bits + j) < v.size() && v[i * chunk_bits + j] ? 1ll : 0ll) << (j % GMP_NUMB_BITS); + } + result[i] = FieldT(b); + } + + return result; +} + +template +std::vector pack_bit_vector_into_field_element_vector(const bit_vector &v) +{ + return pack_bit_vector_into_field_element_vector(v, FieldT::capacity()); +} + +template +std::vector convert_bit_vector_to_field_element_vector(const bit_vector &v) +{ + std::vector result; + result.reserve(v.size()); + + for (const bool b : v) + { + result.emplace_back(b ? FieldT::one() : FieldT::zero()); + } + + return result; +} + +template +bit_vector convert_field_element_vector_to_bit_vector(const std::vector &v) +{ + bit_vector result; + + for (const FieldT &el : v) + { + const bit_vector el_bits = convert_field_element_to_bit_vector(el); + result.insert(result.end(), el_bits.begin(), el_bits.end()); + } + + return result; +} + +template +bit_vector convert_field_element_to_bit_vector(const FieldT &el) +{ + bit_vector result; + + bigint b = el.as_bigint(); + for (size_t i = 0; i < FieldT::size_in_bits(); ++i) + { + result.push_back(b.test_bit(i)); + } + + return result; +} + +template +bit_vector convert_field_element_to_bit_vector(const FieldT &el, const size_t bitcount) +{ + bit_vector result = convert_field_element_to_bit_vector(el); + result.resize(bitcount); + + return result; +} + +template +FieldT convert_bit_vector_to_field_element(const bit_vector &v) +{ + assert(v.size() <= FieldT::size_in_bits()); + + FieldT res = FieldT::zero(); + FieldT c = FieldT::one(); + for (bool b : v) + { + res += b ? c : FieldT::zero(); + c += c; + } + return res; +} + +template +void batch_invert(std::vector &vec) +{ + std::vector prod; + prod.reserve(vec.size()); + + FieldT acc = FieldT::one(); + + for (auto el : vec) + { + assert(!el.is_zero()); + prod.emplace_back(acc); + acc = acc * el; + } + + FieldT acc_inverse = acc.inverse(); + + for (long i = vec.size()-1; i >= 0; --i) + { + const FieldT old_el = vec[i]; + vec[i] = acc_inverse * prod[i]; + acc_inverse = acc_inverse * old_el; + } +} + +} // libsnark +#endif // FIELD_UTILS_TCC_ diff --git a/src/algebra/fields/fp.hpp b/src/algebra/fields/fp.hpp new file mode 100644 index 000000000..a4986833c --- /dev/null +++ b/src/algebra/fields/fp.hpp @@ -0,0 +1,182 @@ +/** @file + ***************************************************************************** + Declaration of arithmetic in the finite field F[p], for prime p of fixed length. + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef FP_HPP_ +#define FP_HPP_ + +#include "algebra/fields/bigint.hpp" +#include "algebra/exponentiation/exponentiation.hpp" + +namespace libsnark { + +template& modulus> +class Fp_model; + +template& modulus> +std::ostream& operator<<(std::ostream &, const Fp_model&); + +template& modulus> +std::istream& operator>>(std::istream &, Fp_model &); + +/** + * Arithmetic in the finite field F[p], for prime p of fixed length. + * + * This class implements Fp-arithmetic, for a large prime p, using a fixed number + * of words. It is optimized for tight memory consumption, so the modulus p is + * passed as a template parameter, to avoid per-element overheads. + * + * The implementation is mostly a wrapper around GMP's MPN (constant-size integers). + * But for the integer sizes of interest for libsnark (3 to 5 limbs of 64 bits each), + * we implement performance-critical routines, like addition and multiplication, + * using hand-optimzied assembly code. +*/ +template& modulus> +class Fp_model { +public: + bigint mont_repr; +public: + static const mp_size_t num_limbs = n; + static const constexpr bigint& mod = modulus; +#ifdef PROFILE_OP_COUNTS + static long long add_cnt; + static long long sub_cnt; + static long long mul_cnt; + static long long sqr_cnt; + static long long inv_cnt; +#endif + static size_t num_bits; + static bigint euler; // (modulus-1)/2 + static size_t s; // modulus = 2^s * t + 1 + static bigint t; // with t odd + static bigint t_minus_1_over_2; // (t-1)/2 + static Fp_model nqr; // a quadratic nonresidue + static Fp_model nqr_to_t; // nqr^t + static Fp_model multiplicative_generator; // generator of Fp^* + static Fp_model root_of_unity; // generator^((modulus-1)/2^s) + static mp_limb_t inv; // modulus^(-1) mod W, where W = 2^(word size) + static bigint Rsquared; // R^2, where R = W^k, where k = ?? + static bigint Rcubed; // R^3 + + static bool modulus_is_valid() { return modulus.data[n-1] != 0; } // mpn inverse assumes that highest limb is non-zero + + Fp_model() {}; + Fp_model(const bigint &b); + Fp_model(const long x, const bool is_unsigned=false); + + void set_ulong(const unsigned long x); + + void mul_reduce(const bigint &other); + + void clear(); + + /* Return the standard (not Montgomery) representation of the + Field element's requivalence class. I.e. Fp(2).as_bigint() + would return bigint(2) */ + bigint as_bigint() const; + /* Return the last limb of the standard representation of the + field element. E.g. on 64-bit architectures Fp(123).as_ulong() + and Fp(2^64+123).as_ulong() would both return 123. */ + unsigned long as_ulong() const; + + bool operator==(const Fp_model& other) const; + bool operator!=(const Fp_model& other) const; + bool is_zero() const; + + void print() const; + + Fp_model& operator+=(const Fp_model& other); + Fp_model& operator-=(const Fp_model& other); + Fp_model& operator*=(const Fp_model& other); + Fp_model& operator^=(const unsigned long pow); + + template + Fp_model& operator^=(const bigint &pow); + + Fp_model operator+(const Fp_model& other) const; + Fp_model operator-(const Fp_model& other) const; + Fp_model operator*(const Fp_model& other) const; + Fp_model operator-() const; + Fp_model squared() const; + Fp_model& invert(); + Fp_model inverse() const; + Fp_model sqrt() const; // HAS TO BE A SQUARE (else does not terminate) + + Fp_model operator^(const unsigned long pow) const; + template + Fp_model operator^(const bigint &pow) const; + + static size_t size_in_bits() { return num_bits; } + static size_t capacity() { return num_bits - 1; } + static bigint field_char() { return modulus; } + + static Fp_model zero(); + static Fp_model one(); + static Fp_model random_element(); + + friend std::ostream& operator<< (std::ostream &out, const Fp_model &p); + friend std::istream& operator>> (std::istream &in, Fp_model &p); +}; + +#ifdef PROFILE_OP_COUNTS +template& modulus> +long long Fp_model::add_cnt = 0; + +template& modulus> +long long Fp_model::sub_cnt = 0; + +template& modulus> +long long Fp_model::mul_cnt = 0; + +template& modulus> +long long Fp_model::sqr_cnt = 0; + +template& modulus> +long long Fp_model::inv_cnt = 0; +#endif + +template& modulus> +size_t Fp_model::num_bits; + +template& modulus> +bigint Fp_model::euler; + +template& modulus> +size_t Fp_model::s; + +template& modulus> +bigint Fp_model::t; + +template& modulus> +bigint Fp_model::t_minus_1_over_2; + +template& modulus> +Fp_model Fp_model::nqr; + +template& modulus> +Fp_model Fp_model::nqr_to_t; + +template& modulus> +Fp_model Fp_model::multiplicative_generator; + +template& modulus> +Fp_model Fp_model::root_of_unity; + +template& modulus> +mp_limb_t Fp_model::inv; + +template& modulus> +bigint Fp_model::Rsquared; + +template& modulus> +bigint Fp_model::Rcubed; + +} // libsnark +#include "algebra/fields/fp.tcc" + +#endif // FP_HPP_ diff --git a/src/algebra/fields/fp.tcc b/src/algebra/fields/fp.tcc new file mode 100644 index 000000000..566e99324 --- /dev/null +++ b/src/algebra/fields/fp.tcc @@ -0,0 +1,790 @@ +/** @file + ***************************************************************************** + Implementation of arithmetic in the finite field F[p], for prime p of fixed length. + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef FP_TCC_ +#define FP_TCC_ +#include +#include +#include + +#include "algebra/fields/fp_aux.tcc" +#include "algebra/fields/field_utils.hpp" +#include "common/assert_except.hpp" + +namespace libsnark { + +template& modulus> +void Fp_model::mul_reduce(const bigint &other) +{ + /* stupid pre-processor tricks; beware */ +#if defined(__x86_64__) && defined(USE_ASM) + if (n == 3) + { // Use asm-optimized Comba multiplication and reduction + mp_limb_t res[2*n]; + mp_limb_t c0, c1, c2; + COMBA_3_BY_3_MUL(c0, c1, c2, res, this->mont_repr.data, other.data); + + mp_limb_t k; + mp_limb_t tmp1, tmp2, tmp3; + REDUCE_6_LIMB_PRODUCT(k, tmp1, tmp2, tmp3, inv, res, modulus.data); + + /* subtract t > mod */ + __asm__ + ("/* check for overflow */ \n\t" + MONT_CMP(16) + MONT_CMP(8) + MONT_CMP(0) + + "/* subtract mod if overflow */ \n\t" + "subtract%=: \n\t" + MONT_FIRSTSUB + MONT_NEXTSUB(8) + MONT_NEXTSUB(16) + "done%=: \n\t" + : + : [tmp] "r" (res+n), [M] "r" (modulus.data) + : "cc", "memory", "%rax"); + mpn_copyi(this->mont_repr.data, res+n, n); + } + else if (n == 4) + { // use asm-optimized "CIOS method" + + mp_limb_t tmp[n+1]; + mp_limb_t T0=0, T1=1, cy=2, u=3; // TODO: fix this + + __asm__ (MONT_PRECOMPUTE + MONT_FIRSTITER(1) + MONT_FIRSTITER(2) + MONT_FIRSTITER(3) + MONT_FINALIZE(3) + MONT_ITERFIRST(1) + MONT_ITERITER(1, 1) + MONT_ITERITER(1, 2) + MONT_ITERITER(1, 3) + MONT_FINALIZE(3) + MONT_ITERFIRST(2) + MONT_ITERITER(2, 1) + MONT_ITERITER(2, 2) + MONT_ITERITER(2, 3) + MONT_FINALIZE(3) + MONT_ITERFIRST(3) + MONT_ITERITER(3, 1) + MONT_ITERITER(3, 2) + MONT_ITERITER(3, 3) + MONT_FINALIZE(3) + "/* check for overflow */ \n\t" + MONT_CMP(24) + MONT_CMP(16) + MONT_CMP(8) + MONT_CMP(0) + + "/* subtract mod if overflow */ \n\t" + "subtract%=: \n\t" + MONT_FIRSTSUB + MONT_NEXTSUB(8) + MONT_NEXTSUB(16) + MONT_NEXTSUB(24) + "done%=: \n\t" + : + : [tmp] "r" (tmp), [A] "r" (this->mont_repr.data), [B] "r" (other.data), [inv] "r" (inv), [M] "r" (modulus.data), + [T0] "r" (T0), [T1] "r" (T1), [cy] "r" (cy), [u] "r" (u) + : "cc", "memory", "%rax", "%rdx" + ); + mpn_copyi(this->mont_repr.data, tmp, n); + } + else if (n == 5) + { // use asm-optimized "CIOS method" + + mp_limb_t tmp[n+1]; + mp_limb_t T0=0, T1=1, cy=2, u=3; // TODO: fix this + + __asm__ (MONT_PRECOMPUTE + MONT_FIRSTITER(1) + MONT_FIRSTITER(2) + MONT_FIRSTITER(3) + MONT_FIRSTITER(4) + MONT_FINALIZE(4) + MONT_ITERFIRST(1) + MONT_ITERITER(1, 1) + MONT_ITERITER(1, 2) + MONT_ITERITER(1, 3) + MONT_ITERITER(1, 4) + MONT_FINALIZE(4) + MONT_ITERFIRST(2) + MONT_ITERITER(2, 1) + MONT_ITERITER(2, 2) + MONT_ITERITER(2, 3) + MONT_ITERITER(2, 4) + MONT_FINALIZE(4) + MONT_ITERFIRST(3) + MONT_ITERITER(3, 1) + MONT_ITERITER(3, 2) + MONT_ITERITER(3, 3) + MONT_ITERITER(3, 4) + MONT_FINALIZE(4) + MONT_ITERFIRST(4) + MONT_ITERITER(4, 1) + MONT_ITERITER(4, 2) + MONT_ITERITER(4, 3) + MONT_ITERITER(4, 4) + MONT_FINALIZE(4) + "/* check for overflow */ \n\t" + MONT_CMP(32) + MONT_CMP(24) + MONT_CMP(16) + MONT_CMP(8) + MONT_CMP(0) + + "/* subtract mod if overflow */ \n\t" + "subtract%=: \n\t" + MONT_FIRSTSUB + MONT_NEXTSUB(8) + MONT_NEXTSUB(16) + MONT_NEXTSUB(24) + MONT_NEXTSUB(32) + "done%=: \n\t" + : + : [tmp] "r" (tmp), [A] "r" (this->mont_repr.data), [B] "r" (other.data), [inv] "r" (inv), [M] "r" (modulus.data), + [T0] "r" (T0), [T1] "r" (T1), [cy] "r" (cy), [u] "r" (u) + : "cc", "memory", "%rax", "%rdx" + ); + mpn_copyi(this->mont_repr.data, tmp, n); + } + else +#endif + { + mp_limb_t res[2*n]; + mpn_mul_n(res, this->mont_repr.data, other.data, n); + + /* + The Montgomery reduction here is based on Algorithm 14.32 in + Handbook of Applied Cryptography + . + */ + for (size_t i = 0; i < n; ++i) + { + mp_limb_t k = inv * res[i]; + /* calculate res = res + k * mod * b^i */ + mp_limb_t carryout = mpn_addmul_1(res+i, modulus.data, n, k); + carryout = mpn_add_1(res+n+i, res+n+i, n-i, carryout); + assert(carryout == 0); + } + + if (mpn_cmp(res+n, modulus.data, n) >= 0) + { + const mp_limb_t borrow = mpn_sub(res+n, res+n, n, modulus.data, n); + assert(borrow == 0); + } + + mpn_copyi(this->mont_repr.data, res+n, n); + } +} + +template& modulus> +Fp_model::Fp_model(const bigint &b) +{ + mpn_copyi(this->mont_repr.data, Rsquared.data, n); + mul_reduce(b); +} + +template& modulus> +Fp_model::Fp_model(const long x, const bool is_unsigned) +{ + if (is_unsigned || x >= 0) + { + this->mont_repr.data[0] = x; + } + else + { + const mp_limb_t borrow = mpn_sub_1(this->mont_repr.data, modulus.data, n, -x); + assert(borrow == 0); + } + + mul_reduce(Rsquared); +} + +template& modulus> +void Fp_model::set_ulong(const unsigned long x) +{ + this->mont_repr.clear(); + this->mont_repr.data[0] = x; + mul_reduce(Rsquared); +} + +template& modulus> +void Fp_model::clear() +{ + this->mont_repr.clear(); +} + +template& modulus> +bigint Fp_model::as_bigint() const +{ + bigint one; + one.clear(); + one.data[0] = 1; + + Fp_model res(*this); + res.mul_reduce(one); + + return (res.mont_repr); +} + +template& modulus> +unsigned long Fp_model::as_ulong() const +{ + return this->as_bigint().as_ulong(); +} + +template& modulus> +bool Fp_model::operator==(const Fp_model& other) const +{ + return (this->mont_repr == other.mont_repr); +} + +template& modulus> +bool Fp_model::operator!=(const Fp_model& other) const +{ + return (this->mont_repr != other.mont_repr); +} + +template& modulus> +bool Fp_model::is_zero() const +{ + return (this->mont_repr.is_zero()); // zero maps to zero +} + +template& modulus> +void Fp_model::print() const +{ + Fp_model tmp; + tmp.mont_repr.data[0] = 1; + tmp.mul_reduce(this->mont_repr); + + tmp.mont_repr.print(); +} + +template& modulus> +Fp_model Fp_model::zero() +{ + Fp_model res; + res.mont_repr.clear(); + return res; +} + +template& modulus> +Fp_model Fp_model::one() +{ + Fp_model res; + res.mont_repr.data[0] = 1; + res.mul_reduce(Rsquared); + return res; +} + +template& modulus> +Fp_model& Fp_model::operator+=(const Fp_model& other) +{ +#ifdef PROFILE_OP_COUNTS + this->add_cnt++; +#endif +#if defined(__x86_64__) && defined(USE_ASM) + if (n == 3) + { + __asm__ + ("/* perform bignum addition */ \n\t" + ADD_FIRSTADD + ADD_NEXTADD(8) + ADD_NEXTADD(16) + "/* if overflow: subtract */ \n\t" + "/* (tricky point: if A and B are in the range we do not need to do anything special for the possible carry flag) */ \n\t" + "jc subtract%= \n\t" + + "/* check for overflow */ \n\t" + ADD_CMP(16) + ADD_CMP(8) + ADD_CMP(0) + + "/* subtract mod if overflow */ \n\t" + "subtract%=: \n\t" + ADD_FIRSTSUB + ADD_NEXTSUB(8) + ADD_NEXTSUB(16) + "done%=: \n\t" + : + : [A] "r" (this->mont_repr.data), [B] "r" (other.mont_repr.data), [mod] "r" (modulus.data) + : "cc", "memory", "%rax"); + } + else if (n == 4) + { + __asm__ + ("/* perform bignum addition */ \n\t" + ADD_FIRSTADD + ADD_NEXTADD(8) + ADD_NEXTADD(16) + ADD_NEXTADD(24) + "/* if overflow: subtract */ \n\t" + "/* (tricky point: if A and B are in the range we do not need to do anything special for the possible carry flag) */ \n\t" + "jc subtract%= \n\t" + + "/* check for overflow */ \n\t" + ADD_CMP(24) + ADD_CMP(16) + ADD_CMP(8) + ADD_CMP(0) + + "/* subtract mod if overflow */ \n\t" + "subtract%=: \n\t" + ADD_FIRSTSUB + ADD_NEXTSUB(8) + ADD_NEXTSUB(16) + ADD_NEXTSUB(24) + "done%=: \n\t" + : + : [A] "r" (this->mont_repr.data), [B] "r" (other.mont_repr.data), [mod] "r" (modulus.data) + : "cc", "memory", "%rax"); + } + else if (n == 5) + { + __asm__ + ("/* perform bignum addition */ \n\t" + ADD_FIRSTADD + ADD_NEXTADD(8) + ADD_NEXTADD(16) + ADD_NEXTADD(24) + ADD_NEXTADD(32) + "/* if overflow: subtract */ \n\t" + "/* (tricky point: if A and B are in the range we do not need to do anything special for the possible carry flag) */ \n\t" + "jc subtract%= \n\t" + + "/* check for overflow */ \n\t" + ADD_CMP(32) + ADD_CMP(24) + ADD_CMP(16) + ADD_CMP(8) + ADD_CMP(0) + + "/* subtract mod if overflow */ \n\t" + "subtract%=: \n\t" + ADD_FIRSTSUB + ADD_NEXTSUB(8) + ADD_NEXTSUB(16) + ADD_NEXTSUB(24) + ADD_NEXTSUB(32) + "done%=: \n\t" + : + : [A] "r" (this->mont_repr.data), [B] "r" (other.mont_repr.data), [mod] "r" (modulus.data) + : "cc", "memory", "%rax"); + } + else +#endif + { + mp_limb_t scratch[n+1]; + const mp_limb_t carry = mpn_add_n(scratch, this->mont_repr.data, other.mont_repr.data, n); + scratch[n] = carry; + + if (carry || mpn_cmp(scratch, modulus.data, n) >= 0) + { + const mp_limb_t borrow = mpn_sub(scratch, scratch, n+1, modulus.data, n); + assert(borrow == 0); + } + + mpn_copyi(this->mont_repr.data, scratch, n); + } + + return *this; +} + +template& modulus> +Fp_model& Fp_model::operator-=(const Fp_model& other) +{ +#ifdef PROFILE_OP_COUNTS + this->sub_cnt++; +#endif +#if defined(__x86_64__) && defined(USE_ASM) + if (n == 3) + { + __asm__ + (SUB_FIRSTSUB + SUB_NEXTSUB(8) + SUB_NEXTSUB(16) + + "jnc done%=\n\t" + + SUB_FIRSTADD + SUB_NEXTADD(8) + SUB_NEXTADD(16) + + "done%=:\n\t" + : + : [A] "r" (this->mont_repr.data), [B] "r" (other.mont_repr.data), [mod] "r" (modulus.data) + : "cc", "memory", "%rax"); + } + else if (n == 4) + { + __asm__ + (SUB_FIRSTSUB + SUB_NEXTSUB(8) + SUB_NEXTSUB(16) + SUB_NEXTSUB(24) + + "jnc done%=\n\t" + + SUB_FIRSTADD + SUB_NEXTADD(8) + SUB_NEXTADD(16) + SUB_NEXTADD(24) + + "done%=:\n\t" + : + : [A] "r" (this->mont_repr.data), [B] "r" (other.mont_repr.data), [mod] "r" (modulus.data) + : "cc", "memory", "%rax"); + } + else if (n == 5) + { + __asm__ + (SUB_FIRSTSUB + SUB_NEXTSUB(8) + SUB_NEXTSUB(16) + SUB_NEXTSUB(24) + SUB_NEXTSUB(32) + + "jnc done%=\n\t" + + SUB_FIRSTADD + SUB_NEXTADD(8) + SUB_NEXTADD(16) + SUB_NEXTADD(24) + SUB_NEXTADD(32) + + "done%=:\n\t" + : + : [A] "r" (this->mont_repr.data), [B] "r" (other.mont_repr.data), [mod] "r" (modulus.data) + : "cc", "memory", "%rax"); + } + else +#endif + { + mp_limb_t scratch[n+1]; + if (mpn_cmp(this->mont_repr.data, other.mont_repr.data, n) < 0) + { + const mp_limb_t carry = mpn_add_n(scratch, this->mont_repr.data, modulus.data, n); + scratch[n] = carry; + } + else + { + mpn_copyi(scratch, this->mont_repr.data, n); + scratch[n] = 0; + } + + const mp_limb_t borrow = mpn_sub(scratch, scratch, n+1, other.mont_repr.data, n); + assert(borrow == 0); + + mpn_copyi(this->mont_repr.data, scratch, n); + } + return *this; +} + +template& modulus> +Fp_model& Fp_model::operator*=(const Fp_model& other) +{ +#ifdef PROFILE_OP_COUNTS + this->mul_cnt++; +#endif + + mul_reduce(other.mont_repr); + return *this; +} + +template& modulus> +Fp_model& Fp_model::operator^=(const unsigned long pow) +{ + (*this) = power >(*this, pow); + return (*this); +} + +template& modulus> +template +Fp_model& Fp_model::operator^=(const bigint &pow) +{ + (*this) = power, m>(*this, pow); + return (*this); +} + +template& modulus> +Fp_model Fp_model::operator+(const Fp_model& other) const +{ + Fp_model r(*this); + return (r += other); +} + +template& modulus> +Fp_model Fp_model::operator-(const Fp_model& other) const +{ + Fp_model r(*this); + return (r -= other); +} + +template& modulus> +Fp_model Fp_model::operator*(const Fp_model& other) const +{ + Fp_model r(*this); + return (r *= other); +} + +template& modulus> +Fp_model Fp_model::operator^(const unsigned long pow) const +{ + Fp_model r(*this); + return (r ^= pow); +} + +template& modulus> +template +Fp_model Fp_model::operator^(const bigint &pow) const +{ + Fp_model r(*this); + return (r ^= pow); +} + +template& modulus> +Fp_model Fp_model::operator-() const +{ +#ifdef PROFILE_OP_COUNTS + this->sub_cnt++; +#endif + + if (this->is_zero()) + { + return (*this); + } + else + { + Fp_model r; + mpn_sub_n(r.mont_repr.data, modulus.data, this->mont_repr.data, n); + return r; + } +} + +template& modulus> +Fp_model Fp_model::squared() const +{ +#ifdef PROFILE_OP_COUNTS + this->sqr_cnt++; + this->mul_cnt--; // zero out the upcoming mul +#endif + /* stupid pre-processor tricks; beware */ +#if defined(__x86_64__) && defined(USE_ASM) + if (n == 3) + { // use asm-optimized Comba squaring + mp_limb_t res[2*n]; + mp_limb_t c0, c1, c2; + COMBA_3_BY_3_SQR(c0, c1, c2, res, this->mont_repr.data); + + mp_limb_t k; + mp_limb_t tmp1, tmp2, tmp3; + REDUCE_6_LIMB_PRODUCT(k, tmp1, tmp2, tmp3, inv, res, modulus.data); + + /* subtract t > mod */ + __asm__ volatile + ("/* check for overflow */ \n\t" + MONT_CMP(16) + MONT_CMP(8) + MONT_CMP(0) + + "/* subtract mod if overflow */ \n\t" + "subtract%=: \n\t" + MONT_FIRSTSUB + MONT_NEXTSUB(8) + MONT_NEXTSUB(16) + "done%=: \n\t" + : + : [tmp] "r" (res+n), [M] "r" (modulus.data) + : "cc", "memory", "%rax"); + + Fp_model r; + mpn_copyi(r.mont_repr.data, res+n, n); + return r; + } + else +#endif + { + Fp_model r(*this); + return (r *= r); + } +} + +template& modulus> +Fp_model& Fp_model::invert() +{ +#ifdef PROFILE_OP_COUNTS + this->inv_cnt++; +#endif + + assert(!this->is_zero()); + + bigint g; /* gp should have room for vn = n limbs */ + + mp_limb_t s[n+1]; /* sp should have room for vn+1 limbs */ + mp_size_t sn; + + bigint v = modulus; // both source operands are destroyed by mpn_gcdext + + /* computes gcd(u, v) = g = u*s + v*t, so s*u will be 1 (mod v) */ + const mp_size_t gn = mpn_gcdext(g.data, s, &sn, this->mont_repr.data, n, v.data, n); + assert(gn == 1 && g.data[0] == 1); /* inverse exists */ + + mp_limb_t q; /* division result fits into q, as sn <= n+1 */ + /* sn < 0 indicates negative sn; will fix up later */ + + if (std::abs(sn) >= n) + { + /* if sn could require modulus reduction, do it here */ + mpn_tdiv_qr(&q, this->mont_repr.data, 0, s, std::abs(sn), modulus.data, n); + } + else + { + /* otherwise just copy it over */ + mpn_zero(this->mont_repr.data, n); + mpn_copyi(this->mont_repr.data, s, std::abs(sn)); + } + + /* fix up the negative sn */ + if (sn < 0) + { + const mp_limb_t borrow = mpn_sub_n(this->mont_repr.data, modulus.data, this->mont_repr.data, n); + assert(borrow == 0); + } + + mul_reduce(Rcubed); + return *this; +} + +template& modulus> +Fp_model Fp_model::inverse() const +{ + Fp_model r(*this); + return (r.invert()); +} + +template& modulus> +Fp_model Fp_model::random_element() /// returns random element of Fp_model +{ + /* note that as Montgomery representation is a bijection then + selecting a random element of {xR} is the same as selecting a + random element of {x} */ + Fp_model r; + do + { + r.mont_repr.randomize(); + + /* clear all bits higher than MSB of modulus */ + size_t bitno = GMP_NUMB_BITS * n - 1; + while (modulus.test_bit(bitno) == false) + { + const std::size_t part = bitno/GMP_NUMB_BITS; + const std::size_t bit = bitno - (GMP_NUMB_BITS*part); + + r.mont_repr.data[part] &= ~(1ul<= modulus -- repeat (rejection sampling) */ + while (mpn_cmp(r.mont_repr.data, modulus.data, n) >= 0); + + return r; +} + +template& modulus> +Fp_model Fp_model::sqrt() const +{ + if (is_zero()) { + return *this; + } + + Fp_model one = Fp_model::one(); + + size_t v = Fp_model::s; + Fp_model z = Fp_model::nqr_to_t; + Fp_model w = (*this)^Fp_model::t_minus_1_over_2; + Fp_model x = (*this) * w; + Fp_model b = x * w; // b = (*this)^t + + + // check if square with euler's criterion + Fp_model check = b; + for (size_t i = 0; i < v-1; ++i) + { + check = check.squared(); + } + if (check != one) + { + assert_except(0); + } + + + // compute square root with Tonelli--Shanks + // (does not terminate if not a square!) + + while (b != one) + { + size_t m = 0; + Fp_model b2m = b; + while (b2m != one) + { + /* invariant: b2m = b^(2^m) after entering this loop */ + b2m = b2m.squared(); + m += 1; + } + + int j = v-m-1; + w = z; + while (j > 0) + { + w = w.squared(); + --j; + } // w = z^2^(v-m-1) + + z = w.squared(); + b = b * z; + x = x * w; + v = m; + } + + return x; +} + +template& modulus> +std::ostream& operator<<(std::ostream &out, const Fp_model &p) +{ +#ifndef MONTGOMERY_OUTPUT + Fp_model tmp; + tmp.mont_repr.data[0] = 1; + tmp.mul_reduce(p.mont_repr); + out << tmp.mont_repr; +#else + out << p.mont_repr; +#endif + return out; +} + +template& modulus> +std::istream& operator>>(std::istream &in, Fp_model &p) +{ +#ifndef MONTGOMERY_OUTPUT + in >> p.mont_repr; + p.mul_reduce(Fp_model::Rsquared); +#else + in >> p.mont_repr; +#endif + return in; +} + +} // libsnark +#endif // FP_TCC_ diff --git a/src/algebra/fields/fp12_2over3over2.hpp b/src/algebra/fields/fp12_2over3over2.hpp new file mode 100644 index 000000000..1de9d88b4 --- /dev/null +++ b/src/algebra/fields/fp12_2over3over2.hpp @@ -0,0 +1,116 @@ +/** @file + ***************************************************************************** + Declaration of arithmetic in the finite field F[((p^2)^3)^2]. + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef FP12_2OVER3OVER2_HPP_ +#define FP12_2OVER3OVER2_HPP_ +#include "algebra/fields/fp.hpp" +#include "algebra/fields/fp2.hpp" +#include "algebra/fields/fp6_3over2.hpp" +#include + +namespace libsnark { + +template& modulus> +class Fp12_2over3over2_model; + +template& modulus> +std::ostream& operator<<(std::ostream &, const Fp12_2over3over2_model &); + +template& modulus> +std::istream& operator>>(std::istream &, Fp12_2over3over2_model &); + +/** + * Arithmetic in the finite field F[((p^2)^3)^2]. + * + * Let p := modulus. This interface provides arithmetic for the extension field + * Fp12 = Fp6[W]/(W^2-V) where Fp6 = Fp2[V]/(V^3-non_residue) and non_residue is in Fp2 + * + * ASSUMPTION: p = 1 (mod 6) + */ +template& modulus> +class Fp12_2over3over2_model { +public: + typedef Fp_model my_Fp; + typedef Fp2_model my_Fp2; + typedef Fp6_3over2_model my_Fp6; + + static Fp2_model non_residue; + static Fp2_model Frobenius_coeffs_c1[12]; // non_residue^((modulus^i-1)/6) for i=0,...,11 + + my_Fp6 c0, c1; + Fp12_2over3over2_model() {}; + Fp12_2over3over2_model(const my_Fp6& c0, const my_Fp6& c1) : c0(c0), c1(c1) {}; + + void clear() { c0.clear(); c1.clear(); } + void print() const { printf("c0/c1:\n"); c0.print(); c1.print(); } + + static Fp12_2over3over2_model zero(); + static Fp12_2over3over2_model one(); + static Fp12_2over3over2_model random_element(); + + bool is_zero() const { return c0.is_zero() && c1.is_zero(); } + bool operator==(const Fp12_2over3over2_model &other) const; + bool operator!=(const Fp12_2over3over2_model &other) const; + + Fp12_2over3over2_model operator+(const Fp12_2over3over2_model &other) const; + Fp12_2over3over2_model operator-(const Fp12_2over3over2_model &other) const; + Fp12_2over3over2_model operator*(const Fp12_2over3over2_model &other) const; + Fp12_2over3over2_model operator-() const; + Fp12_2over3over2_model squared() const; // default is squared_complex + Fp12_2over3over2_model squared_karatsuba() const; + Fp12_2over3over2_model squared_complex() const; + Fp12_2over3over2_model inverse() const; + Fp12_2over3over2_model Frobenius_map(unsigned long power) const; + Fp12_2over3over2_model unitary_inverse() const; + Fp12_2over3over2_model cyclotomic_squared() const; + + Fp12_2over3over2_model mul_by_024(const my_Fp2 &ell_0, const my_Fp2 &ell_VW, const my_Fp2 &ell_VV) const; + + static my_Fp6 mul_by_non_residue(const my_Fp6 &elt); + + template + Fp12_2over3over2_model cyclotomic_exp(const bigint &exponent) const; + + static bigint base_field_char() { return modulus; } + static size_t extension_degree() { return 12; } + + friend std::ostream& operator<< (std::ostream &out, const Fp12_2over3over2_model &el); + friend std::istream& operator>> (std::istream &in, Fp12_2over3over2_model &el); +}; + +template& modulus> +std::ostream& operator<<(std::ostream& out, const std::vector > &v); + +template& modulus> +std::istream& operator>>(std::istream& in, std::vector > &v); + +template& modulus> +Fp12_2over3over2_model operator*(const Fp_model &lhs, const Fp12_2over3over2_model &rhs); + +template& modulus> +Fp12_2over3over2_model operator*(const Fp2_model &lhs, const Fp12_2over3over2_model &rhs); + +template& modulus> +Fp12_2over3over2_model operator*(const Fp6_3over2_model &lhs, const Fp12_2over3over2_model &rhs); + +template& modulus, mp_size_t m> +Fp12_2over3over2_model operator^(const Fp12_2over3over2_model &self, const bigint &exponent); + +template& modulus, mp_size_t m, const bigint& exp_modulus> +Fp12_2over3over2_model operator^(const Fp12_2over3over2_model &self, const Fp_model &exponent); + +template& modulus> +Fp2_model Fp12_2over3over2_model::non_residue; + +template& modulus> +Fp2_model Fp12_2over3over2_model::Frobenius_coeffs_c1[12]; + +} // libsnark +#include "algebra/fields/fp12_2over3over2.tcc" +#endif // FP12_2OVER3OVER2_HPP_ diff --git a/src/algebra/fields/fp12_2over3over2.tcc b/src/algebra/fields/fp12_2over3over2.tcc new file mode 100644 index 000000000..2fbc0b649 --- /dev/null +++ b/src/algebra/fields/fp12_2over3over2.tcc @@ -0,0 +1,412 @@ +/** @file + ***************************************************************************** + Implementation of arithmetic in the finite field F[((p^2)^3)^2]. + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef FP12_2OVER3OVER2_TCC_ +#define FP12_2OVER3OVER2_TCC_ + +namespace libsnark { + +template& modulus> +Fp6_3over2_model Fp12_2over3over2_model::mul_by_non_residue(const Fp6_3over2_model &elt) +{ + return Fp6_3over2_model(non_residue * elt.c2, elt.c0, elt.c1); +} + +template& modulus> +Fp12_2over3over2_model Fp12_2over3over2_model::zero() +{ + return Fp12_2over3over2_model(my_Fp6::zero(), my_Fp6::zero()); +} + +template& modulus> +Fp12_2over3over2_model Fp12_2over3over2_model::one() +{ + return Fp12_2over3over2_model(my_Fp6::one(), my_Fp6::zero()); +} + +template& modulus> +Fp12_2over3over2_model Fp12_2over3over2_model::random_element() +{ + Fp12_2over3over2_model r; + r.c0 = my_Fp6::random_element(); + r.c1 = my_Fp6::random_element(); + + return r; +} + +template& modulus> +bool Fp12_2over3over2_model::operator==(const Fp12_2over3over2_model &other) const +{ + return (this->c0 == other.c0 && this->c1 == other.c1); +} + +template& modulus> +bool Fp12_2over3over2_model::operator!=(const Fp12_2over3over2_model &other) const +{ + return !(operator==(other)); +} + +template& modulus> +Fp12_2over3over2_model Fp12_2over3over2_model::operator+(const Fp12_2over3over2_model &other) const +{ + return Fp12_2over3over2_model(this->c0 + other.c0, + this->c1 + other.c1); +} + +template& modulus> +Fp12_2over3over2_model Fp12_2over3over2_model::operator-(const Fp12_2over3over2_model &other) const +{ + return Fp12_2over3over2_model(this->c0 - other.c0, + this->c1 - other.c1); +} + +template& modulus> +Fp12_2over3over2_model operator*(const Fp_model &lhs, const Fp12_2over3over2_model &rhs) +{ + return Fp12_2over3over2_model(lhs*rhs.c0, + lhs*rhs.c1); +} + +template& modulus> +Fp12_2over3over2_model operator*(const Fp2_model &lhs, const Fp12_2over3over2_model &rhs) +{ + return Fp12_2over3over2_model(lhs*rhs.c0, + lhs*rhs.c1); +} + +template& modulus> +Fp12_2over3over2_model operator*(const Fp6_3over2_model &lhs, const Fp12_2over3over2_model &rhs) +{ + return Fp12_2over3over2_model(lhs*rhs.c0, + lhs*rhs.c1); +} + +template& modulus> +Fp12_2over3over2_model Fp12_2over3over2_model::operator*(const Fp12_2over3over2_model &other) const +{ + /* Devegili OhEig Scott Dahab --- Multiplication and Squaring on Pairing-Friendly Fields.pdf; Section 3 (Karatsuba) */ + + const my_Fp6 &A = other.c0, &B = other.c1, + &a = this->c0, &b = this->c1; + const my_Fp6 aA = a * A; + const my_Fp6 bB = b * B; + + return Fp12_2over3over2_model(aA + Fp12_2over3over2_model::mul_by_non_residue(bB), + (a + b)*(A+B) - aA - bB); +} + +template& modulus> +Fp12_2over3over2_model Fp12_2over3over2_model::operator-() const +{ + return Fp12_2over3over2_model(-this->c0, + -this->c1); +} + +template& modulus> +Fp12_2over3over2_model Fp12_2over3over2_model::squared() const +{ + return squared_complex(); +} + +template& modulus> +Fp12_2over3over2_model Fp12_2over3over2_model::squared_karatsuba() const +{ + /* Devegili OhEig Scott Dahab --- Multiplication and Squaring on Pairing-Friendly Fields.pdf; Section 3 (Karatsuba squaring) */ + + const my_Fp6 &a = this->c0, &b = this->c1; + const my_Fp6 asq = a.squared(); + const my_Fp6 bsq = b.squared(); + + return Fp12_2over3over2_model(asq + Fp12_2over3over2_model::mul_by_non_residue(bsq), + (a + b).squared() - asq - bsq); +} + +template& modulus> +Fp12_2over3over2_model Fp12_2over3over2_model::squared_complex() const +{ + /* Devegili OhEig Scott Dahab --- Multiplication and Squaring on Pairing-Friendly Fields.pdf; Section 3 (Complex squaring) */ + + const my_Fp6 &a = this->c0, &b = this->c1; + const my_Fp6 ab = a * b; + + return Fp12_2over3over2_model((a + b) * (a + Fp12_2over3over2_model::mul_by_non_residue(b)) - ab - Fp12_2over3over2_model::mul_by_non_residue(ab), + ab + ab); +} + +template& modulus> +Fp12_2over3over2_model Fp12_2over3over2_model::inverse() const +{ + /* From "High-Speed Software Implementation of the Optimal Ate Pairing over Barreto-Naehrig Curves"; Algorithm 8 */ + + const my_Fp6 &a = this->c0, &b = this->c1; + const my_Fp6 t0 = a.squared(); + const my_Fp6 t1 = b.squared(); + const my_Fp6 t2 = t0 - Fp12_2over3over2_model::mul_by_non_residue(t1); + const my_Fp6 t3 = t2.inverse(); + const my_Fp6 c0 = a * t3; + const my_Fp6 c1 = - (b * t3); + + return Fp12_2over3over2_model(c0, c1); +} + +template& modulus> +Fp12_2over3over2_model Fp12_2over3over2_model::Frobenius_map(unsigned long power) const +{ + return Fp12_2over3over2_model(c0.Frobenius_map(power), + Frobenius_coeffs_c1[power % 12] * c1.Frobenius_map(power)); +} + +template& modulus> +Fp12_2over3over2_model Fp12_2over3over2_model::unitary_inverse() const +{ + return Fp12_2over3over2_model(this->c0, + -this->c1); +} + +template& modulus> +Fp12_2over3over2_model Fp12_2over3over2_model::cyclotomic_squared() const +{ + /* OLD: naive implementation + return (*this).squared(); + */ + my_Fp2 z0 = this->c0.c0; + my_Fp2 z4 = this->c0.c1; + my_Fp2 z3 = this->c0.c2; + my_Fp2 z2 = this->c1.c0; + my_Fp2 z1 = this->c1.c1; + my_Fp2 z5 = this->c1.c2; + + my_Fp2 t0, t1, t2, t3, t4, t5, tmp; + + // t0 + t1*y = (z0 + z1*y)^2 = a^2 + tmp = z0 * z1; + t0 = (z0 + z1) * (z0 + my_Fp6::non_residue * z1) - tmp - my_Fp6::non_residue * tmp; + t1 = tmp + tmp; + // t2 + t3*y = (z2 + z3*y)^2 = b^2 + tmp = z2 * z3; + t2 = (z2 + z3) * (z2 + my_Fp6::non_residue * z3) - tmp - my_Fp6::non_residue * tmp; + t3 = tmp + tmp; + // t4 + t5*y = (z4 + z5*y)^2 = c^2 + tmp = z4 * z5; + t4 = (z4 + z5) * (z4 + my_Fp6::non_residue * z5) - tmp - my_Fp6::non_residue * tmp; + t5 = tmp + tmp; + + // for A + + // z0 = 3 * t0 - 2 * z0 + z0 = t0 - z0; + z0 = z0 + z0; + z0 = z0 + t0; + // z1 = 3 * t1 + 2 * z1 + z1 = t1 + z1; + z1 = z1 + z1; + z1 = z1 + t1; + + // for B + + // z2 = 3 * (xi * t5) + 2 * z2 + tmp = my_Fp6::non_residue * t5; + z2 = tmp + z2; + z2 = z2 + z2; + z2 = z2 + tmp; + + // z3 = 3 * t4 - 2 * z3 + z3 = t4 - z3; + z3 = z3 + z3; + z3 = z3 + t4; + + // for C + + // z4 = 3 * t2 - 2 * z4 + z4 = t2 - z4; + z4 = z4 + z4; + z4 = z4 + t2; + + // z5 = 3 * t3 + 2 * z5 + z5 = t3 + z5; + z5 = z5 + z5; + z5 = z5 + t3; + + return Fp12_2over3over2_model(my_Fp6(z0,z4,z3),my_Fp6(z2,z1,z5)); +} + +template& modulus> +Fp12_2over3over2_model Fp12_2over3over2_model::mul_by_024(const Fp2_model &ell_0, + const Fp2_model &ell_VW, + const Fp2_model &ell_VV) const +{ + /* OLD: naive implementation + Fp12_2over3over2_model a(my_Fp6(ell_0, my_Fp2::zero(), ell_VV), + my_Fp6(my_Fp2::zero(), ell_VW, my_Fp2::zero())); + + return (*this) * a; + */ + my_Fp2 z0 = this->c0.c0; + my_Fp2 z1 = this->c0.c1; + my_Fp2 z2 = this->c0.c2; + my_Fp2 z3 = this->c1.c0; + my_Fp2 z4 = this->c1.c1; + my_Fp2 z5 = this->c1.c2; + + my_Fp2 x0 = ell_0; + my_Fp2 x2 = ell_VV; + my_Fp2 x4 = ell_VW; + + my_Fp2 t0, t1, t2, s0, T3, T4, D0, D2, D4, S1; + + D0 = z0 * x0; + D2 = z2 * x2; + D4 = z4 * x4; + t2 = z0 + z4; + t1 = z0 + z2; + s0 = z1 + z3 + z5; + + // For z.a_.a_ = z0. + S1 = z1 * x2; + T3 = S1 + D4; + T4 = my_Fp6::non_residue * T3 + D0; + z0 = T4; + + // For z.a_.b_ = z1 + T3 = z5 * x4; + S1 = S1 + T3; + T3 = T3 + D2; + T4 = my_Fp6::non_residue * T3; + T3 = z1 * x0; + S1 = S1 + T3; + T4 = T4 + T3; + z1 = T4; + + // For z.a_.c_ = z2 + t0 = x0 + x2; + T3 = t1 * t0 - D0 - D2; + T4 = z3 * x4; + S1 = S1 + T4; + T3 = T3 + T4; + + // For z.b_.a_ = z3 (z3 needs z2) + t0 = z2 + z4; + z2 = T3; + t1 = x2 + x4; + T3 = t0 * t1 - D2 - D4; + T4 = my_Fp6::non_residue * T3; + T3 = z3 * x0; + S1 = S1 + T3; + T4 = T4 + T3; + z3 = T4; + + // For z.b_.b_ = z4 + T3 = z5 * x2; + S1 = S1 + T3; + T4 = my_Fp6::non_residue * T3; + t0 = x0 + x4; + T3 = t2 * t0 - D0 - D4; + T4 = T4 + T3; + z4 = T4; + + // For z.b_.c_ = z5. + t0 = x0 + x2 + x4; + T3 = s0 * t0 - S1; + z5 = T3; + + return Fp12_2over3over2_model(my_Fp6(z0,z1,z2),my_Fp6(z3,z4,z5)); + +} + +template& modulus, mp_size_t m> +Fp12_2over3over2_model operator^(const Fp12_2over3over2_model &self, const bigint &exponent) +{ + return power >(self, exponent); +} + +template& modulus, mp_size_t m, const bigint& exp_modulus> +Fp12_2over3over2_model operator^(const Fp12_2over3over2_model &self, const Fp_model &exponent) +{ + return self^(exponent.as_bigint()); +} + + +template& modulus> +template +Fp12_2over3over2_model Fp12_2over3over2_model::cyclotomic_exp(const bigint &exponent) const +{ + Fp12_2over3over2_model res = Fp12_2over3over2_model::one(); + + bool found_one = false; + for (long i = m-1; i >= 0; --i) + { + for (long j = GMP_NUMB_BITS - 1; j >= 0; --j) + { + if (found_one) + { + res = res.cyclotomic_squared(); + } + + if (exponent.data[i] & (1ul<& modulus> +std::ostream& operator<<(std::ostream &out, const Fp12_2over3over2_model &el) +{ + out << el.c0 << OUTPUT_SEPARATOR << el.c1; + return out; +} + +template& modulus> +std::istream& operator>>(std::istream &in, Fp12_2over3over2_model &el) +{ + in >> el.c0 >> el.c1; + return in; +} + +template& modulus> +std::ostream& operator<<(std::ostream& out, const std::vector > &v) +{ + out << v.size() << "\n"; + for (const Fp12_2over3over2_model& t : v) + { + out << t << OUTPUT_NEWLINE; + } + + return out; +} + +template& modulus> +std::istream& operator>>(std::istream& in, std::vector > &v) +{ + v.clear(); + + size_t s; + in >> s; + + char b; + in.read(&b, 1); + + v.reserve(s); + + for (size_t i = 0; i < s; ++i) + { + Fp12_2over3over2_model el; + in >> el; + v.emplace_back(el); + } + + return in; +} + +} // libsnark +#endif // FP12_2OVER3OVER2_TCC_ diff --git a/src/algebra/fields/fp2.hpp b/src/algebra/fields/fp2.hpp new file mode 100644 index 000000000..f07726918 --- /dev/null +++ b/src/algebra/fields/fp2.hpp @@ -0,0 +1,120 @@ +/** @file + ***************************************************************************** + Implementation of arithmetic in the finite field F[p^2]. + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef FP2_HPP_ +#define FP2_HPP_ +#include "algebra/fields/fp.hpp" +#include + +namespace libsnark { + +template& modulus> +class Fp2_model; + +template& modulus> +std::ostream& operator<<(std::ostream &, const Fp2_model &); + +template& modulus> +std::istream& operator>>(std::istream &, Fp2_model &); + +/** + * Arithmetic in the field F[p^3]. + * + * Let p := modulus. This interface provides arithmetic for the extension field + * Fp2 = Fp[U]/(U^2-non_residue), where non_residue is in Fp. + * + * ASSUMPTION: p = 1 (mod 6) + */ +template& modulus> +class Fp2_model { +public: + typedef Fp_model my_Fp; + + static bigint<2*n> euler; // (modulus^2-1)/2 + static size_t s; // modulus^2 = 2^s * t + 1 + static bigint<2*n> t; // with t odd + static bigint<2*n> t_minus_1_over_2; // (t-1)/2 + static my_Fp non_residue; // X^4-non_residue irreducible over Fp; used for constructing Fp2 = Fp[X] / (X^2 - non_residue) + static Fp2_model nqr; // a quadratic nonresidue in Fp2 + static Fp2_model nqr_to_t; // nqr^t + static my_Fp Frobenius_coeffs_c1[2]; // non_residue^((modulus^i-1)/2) for i=0,1 + + my_Fp c0, c1; + Fp2_model() {}; + Fp2_model(const my_Fp& c0, const my_Fp& c1) : c0(c0), c1(c1) {}; + + void clear() { c0.clear(); c1.clear(); } + void print() const { printf("c0/c1:\n"); c0.print(); c1.print(); } + + static Fp2_model zero(); + static Fp2_model one(); + static Fp2_model random_element(); + + bool is_zero() const { return c0.is_zero() && c1.is_zero(); } + bool operator==(const Fp2_model &other) const; + bool operator!=(const Fp2_model &other) const; + + Fp2_model operator+(const Fp2_model &other) const; + Fp2_model operator-(const Fp2_model &other) const; + Fp2_model operator*(const Fp2_model &other) const; + Fp2_model operator-() const; + Fp2_model squared() const; // default is squared_complex + Fp2_model inverse() const; + Fp2_model Frobenius_map(unsigned long power) const; + Fp2_model sqrt() const; // HAS TO BE A SQUARE (else does not terminate) + Fp2_model squared_karatsuba() const; + Fp2_model squared_complex() const; + + template + Fp2_model operator^(const bigint &other) const; + + static size_t size_in_bits() { return 2*my_Fp::size_in_bits(); } + static bigint base_field_char() { return modulus; } + + friend std::ostream& operator<< (std::ostream &out, const Fp2_model &el); + friend std::istream& operator>> (std::istream &in, Fp2_model &el); +}; + +template& modulus> +std::ostream& operator<<(std::ostream& out, const std::vector > &v); + +template& modulus> +std::istream& operator>>(std::istream& in, std::vector > &v); + +template& modulus> +Fp2_model operator*(const Fp_model &lhs, const Fp2_model &rhs); + +template& modulus> +bigint<2*n> Fp2_model::euler; + +template& modulus> +size_t Fp2_model::s; + +template& modulus> +bigint<2*n> Fp2_model::t; + +template& modulus> +bigint<2*n> Fp2_model::t_minus_1_over_2; + +template& modulus> +Fp_model Fp2_model::non_residue; + +template& modulus> +Fp2_model Fp2_model::nqr; + +template& modulus> +Fp2_model Fp2_model::nqr_to_t; + +template& modulus> +Fp_model Fp2_model::Frobenius_coeffs_c1[2]; + +} // libsnark +#include "algebra/fields/fp2.tcc" + +#endif // FP2_HPP_ diff --git a/src/algebra/fields/fp2.tcc b/src/algebra/fields/fp2.tcc new file mode 100644 index 000000000..1632a04c7 --- /dev/null +++ b/src/algebra/fields/fp2.tcc @@ -0,0 +1,261 @@ +/** @file + ***************************************************************************** + Implementation of arithmetic in the finite field F[p^2]. + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef FP2_TCC_ +#define FP2_TCC_ + +#include "algebra/fields/field_utils.hpp" + +namespace libsnark { + +template& modulus> +Fp2_model Fp2_model::zero() +{ + return Fp2_model(my_Fp::zero(), my_Fp::zero()); +} + +template& modulus> +Fp2_model Fp2_model::one() +{ + return Fp2_model(my_Fp::one(), my_Fp::zero()); +} + +template& modulus> +Fp2_model Fp2_model::random_element() +{ + Fp2_model r; + r.c0 = my_Fp::random_element(); + r.c1 = my_Fp::random_element(); + + return r; +} + +template& modulus> +bool Fp2_model::operator==(const Fp2_model &other) const +{ + return (this->c0 == other.c0 && this->c1 == other.c1); +} + +template& modulus> +bool Fp2_model::operator!=(const Fp2_model &other) const +{ + return !(operator==(other)); +} + +template& modulus> +Fp2_model Fp2_model::operator+(const Fp2_model &other) const +{ + return Fp2_model(this->c0 + other.c0, + this->c1 + other.c1); +} + +template& modulus> +Fp2_model Fp2_model::operator-(const Fp2_model &other) const +{ + return Fp2_model(this->c0 - other.c0, + this->c1 - other.c1); +} + +template& modulus> +Fp2_model operator*(const Fp_model &lhs, const Fp2_model &rhs) +{ + return Fp2_model(lhs*rhs.c0, + lhs*rhs.c1); +} + +template& modulus> +Fp2_model Fp2_model::operator*(const Fp2_model &other) const +{ + /* Devegili OhEig Scott Dahab --- Multiplication and Squaring on Pairing-Friendly Fields.pdf; Section 3 (Karatsuba) */ + const my_Fp + &A = other.c0, &B = other.c1, + &a = this->c0, &b = this->c1; + const my_Fp aA = a * A; + const my_Fp bB = b * B; + + return Fp2_model(aA + non_residue * bB, + (a + b)*(A+B) - aA - bB); +} + +template& modulus> +Fp2_model Fp2_model::operator-() const +{ + return Fp2_model(-this->c0, + -this->c1); +} + +template& modulus> +Fp2_model Fp2_model::squared() const +{ + return squared_complex(); +} + +template& modulus> +Fp2_model Fp2_model::squared_karatsuba() const +{ + /* Devegili OhEig Scott Dahab --- Multiplication and Squaring on Pairing-Friendly Fields.pdf; Section 3 (Karatsuba squaring) */ + const my_Fp &a = this->c0, &b = this->c1; + const my_Fp asq = a.squared(); + const my_Fp bsq = b.squared(); + + return Fp2_model(asq + non_residue * bsq, + (a + b).squared() - asq - bsq); +} + +template& modulus> +Fp2_model Fp2_model::squared_complex() const +{ + /* Devegili OhEig Scott Dahab --- Multiplication and Squaring on Pairing-Friendly Fields.pdf; Section 3 (Complex squaring) */ + const my_Fp &a = this->c0, &b = this->c1; + const my_Fp ab = a * b; + + return Fp2_model((a + b) * (a + non_residue * b) - ab - non_residue * ab, + ab + ab); +} + +template& modulus> +Fp2_model Fp2_model::inverse() const +{ + const my_Fp &a = this->c0, &b = this->c1; + + /* From "High-Speed Software Implementation of the Optimal Ate Pairing over Barreto-Naehrig Curves"; Algorithm 8 */ + const my_Fp t0 = a.squared(); + const my_Fp t1 = b.squared(); + const my_Fp t2 = t0 - non_residue * t1; + const my_Fp t3 = t2.inverse(); + const my_Fp c0 = a * t3; + const my_Fp c1 = - (b * t3); + + return Fp2_model(c0, c1); +} + +template& modulus> +Fp2_model Fp2_model::Frobenius_map(unsigned long power) const +{ + return Fp2_model(c0, + Frobenius_coeffs_c1[power % 2] * c1); +} + +template& modulus> +Fp2_model Fp2_model::sqrt() const +{ + if (is_zero()) { + return *this; + } + + Fp2_model one = Fp2_model::one(); + + size_t v = Fp2_model::s; + Fp2_model z = Fp2_model::nqr_to_t; + Fp2_model w = (*this)^Fp2_model::t_minus_1_over_2; + Fp2_model x = (*this) * w; + Fp2_model b = x * w; // b = (*this)^t + + + // check if square with euler's criterion + Fp2_model check = b; + for (size_t i = 0; i < v-1; ++i) + { + check = check.squared(); + } + if (check != one) + { + assert_except(0); + } + + + // compute square root with Tonelli--Shanks + // (does not terminate if not a square!) + + while (b != one) + { + size_t m = 0; + Fp2_model b2m = b; + while (b2m != one) + { + /* invariant: b2m = b^(2^m) after entering this loop */ + b2m = b2m.squared(); + m += 1; + } + + int j = v-m-1; + w = z; + while (j > 0) + { + w = w.squared(); + --j; + } // w = z^2^(v-m-1) + + z = w.squared(); + b = b * z; + x = x * w; + v = m; + } + + return x; +} + +template& modulus> +template +Fp2_model Fp2_model::operator^(const bigint &pow) const +{ + return power, m>(*this, pow); +} + +template& modulus> +std::ostream& operator<<(std::ostream &out, const Fp2_model &el) +{ + out << el.c0 << OUTPUT_SEPARATOR << el.c1; + return out; +} + +template& modulus> +std::istream& operator>>(std::istream &in, Fp2_model &el) +{ + in >> el.c0 >> el.c1; + return in; +} + +template& modulus> +std::ostream& operator<<(std::ostream& out, const std::vector > &v) +{ + out << v.size() << "\n"; + for (const Fp2_model& t : v) + { + out << t << OUTPUT_NEWLINE; + } + + return out; +} + +template& modulus> +std::istream& operator>>(std::istream& in, std::vector > &v) +{ + v.clear(); + + size_t s; + in >> s; + + char b; + in.read(&b, 1); + + v.reserve(s); + + for (size_t i = 0; i < s; ++i) + { + Fp2_model el; + in >> el; + v.emplace_back(el); + } + + return in; +} + +} // libsnark +#endif // FP2_TCC_ diff --git a/src/algebra/fields/fp3.hpp b/src/algebra/fields/fp3.hpp new file mode 100644 index 000000000..53b178a27 --- /dev/null +++ b/src/algebra/fields/fp3.hpp @@ -0,0 +1,122 @@ +/** @file + ***************************************************************************** + Declaration of arithmetic in the finite field F[p^3]. + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef FP3_HPP_ +#define FP3_HPP_ +#include "algebra/fields/fp.hpp" +#include + +namespace libsnark { + +template& modulus> +class Fp3_model; + +template& modulus> +std::ostream& operator<<(std::ostream &, const Fp3_model &); + +template& modulus> +std::istream& operator>>(std::istream &, Fp3_model &); + +/** + * Arithmetic in the field F[p^3]. + * + * Let p := modulus. This interface provides arithmetic for the extension field + * Fp3 = Fp[U]/(U^3-non_residue), where non_residue is in Fp. + * + * ASSUMPTION: p = 1 (mod 6) + */ +template& modulus> +class Fp3_model { +public: + typedef Fp_model my_Fp; + + static bigint<3*n> euler; // (modulus^3-1)/2 + static size_t s; // modulus^3 = 2^s * t + 1 + static bigint<3*n> t; // with t odd + static bigint<3*n> t_minus_1_over_2; // (t-1)/2 + static my_Fp non_residue; // X^6-non_residue irreducible over Fp; used for constructing Fp3 = Fp[X] / (X^3 - non_residue) + static Fp3_model nqr; // a quadratic nonresidue in Fp3 + static Fp3_model nqr_to_t; // nqr^t + static my_Fp Frobenius_coeffs_c1[3]; // non_residue^((modulus^i-1)/3) for i=0,1,2 + static my_Fp Frobenius_coeffs_c2[3]; // non_residue^((2*modulus^i-2)/3) for i=0,1,2 + + my_Fp c0, c1, c2; + Fp3_model() {}; + Fp3_model(const my_Fp& c0, const my_Fp& c1, const my_Fp& c2) : c0(c0), c1(c1), c2(c2) {}; + + void clear() { c0.clear(); c1.clear(); c2.clear(); } + void print() const { printf("c0/c1/c2:\n"); c0.print(); c1.print(); c2.print(); } + + static Fp3_model zero(); + static Fp3_model one(); + static Fp3_model random_element(); + + bool is_zero() const { return c0.is_zero() && c1.is_zero() && c2.is_zero(); } + bool operator==(const Fp3_model &other) const; + bool operator!=(const Fp3_model &other) const; + + Fp3_model operator+(const Fp3_model &other) const; + Fp3_model operator-(const Fp3_model &other) const; + Fp3_model operator*(const Fp3_model &other) const; + Fp3_model operator-() const; + Fp3_model squared() const; + Fp3_model inverse() const; + Fp3_model Frobenius_map(unsigned long power) const; + Fp3_model sqrt() const; // HAS TO BE A SQUARE (else does not terminate) + + template + Fp3_model operator^(const bigint &other) const; + + static size_t size_in_bits() { return 3*my_Fp::size_in_bits(); } + static bigint base_field_char() { return modulus; } + + friend std::ostream& operator<< (std::ostream &out, const Fp3_model &el); + friend std::istream& operator>> (std::istream &in, Fp3_model &el); +}; + +template& modulus> +std::ostream& operator<<(std::ostream& out, const std::vector > &v); + +template& modulus> +std::istream& operator>>(std::istream& in, std::vector > &v); + +template& modulus> +Fp3_model operator*(const Fp_model &lhs, const Fp3_model &rhs); + +template& modulus> +bigint<3*n> Fp3_model::euler; + +template& modulus> +size_t Fp3_model::s; + +template& modulus> +bigint<3*n> Fp3_model::t; + +template& modulus> +bigint<3*n> Fp3_model::t_minus_1_over_2; + +template& modulus> +Fp_model Fp3_model::non_residue; + +template& modulus> +Fp3_model Fp3_model::nqr; + +template& modulus> +Fp3_model Fp3_model::nqr_to_t; + +template& modulus> +Fp_model Fp3_model::Frobenius_coeffs_c1[3]; + +template& modulus> +Fp_model Fp3_model::Frobenius_coeffs_c2[3]; + +} // libsnark +#include "algebra/fields/fp3.tcc" + +#endif // FP3_HPP_ diff --git a/src/algebra/fields/fp3.tcc b/src/algebra/fields/fp3.tcc new file mode 100644 index 000000000..590a2a987 --- /dev/null +++ b/src/algebra/fields/fp3.tcc @@ -0,0 +1,259 @@ +/** @file + ***************************************************************************** + Implementation of arithmetic in the finite field F[p^3]. + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef FP3_TCC_ +#define FP3_TCC_ + +#include "algebra/fields/field_utils.hpp" + +namespace libsnark { + +template& modulus> +Fp3_model Fp3_model::zero() +{ + return Fp3_model(my_Fp::zero(), my_Fp::zero(), my_Fp::zero()); +} + +template& modulus> +Fp3_model Fp3_model::one() +{ + return Fp3_model(my_Fp::one(), my_Fp::zero(), my_Fp::zero()); +} + +template& modulus> +Fp3_model Fp3_model::random_element() +{ + Fp3_model r; + r.c0 = my_Fp::random_element(); + r.c1 = my_Fp::random_element(); + r.c2 = my_Fp::random_element(); + + return r; +} + +template& modulus> +bool Fp3_model::operator==(const Fp3_model &other) const +{ + return (this->c0 == other.c0 && this->c1 == other.c1 && this->c2 == other.c2); +} + +template& modulus> +bool Fp3_model::operator!=(const Fp3_model &other) const +{ + return !(operator==(other)); +} + +template& modulus> +Fp3_model Fp3_model::operator+(const Fp3_model &other) const +{ + return Fp3_model(this->c0 + other.c0, + this->c1 + other.c1, + this->c2 + other.c2); +} + +template& modulus> +Fp3_model Fp3_model::operator-(const Fp3_model &other) const +{ + return Fp3_model(this->c0 - other.c0, + this->c1 - other.c1, + this->c2 - other.c2); +} + +template& modulus> +Fp3_model operator*(const Fp_model &lhs, const Fp3_model &rhs) +{ + return Fp3_model(lhs*rhs.c0, + lhs*rhs.c1, + lhs*rhs.c2); +} + +template& modulus> +Fp3_model Fp3_model::operator*(const Fp3_model &other) const +{ + /* Devegili OhEig Scott Dahab --- Multiplication and Squaring on Pairing-Friendly Fields.pdf; Section 4 (Karatsuba) */ + const my_Fp + &A = other.c0, &B = other.c1, &C = other.c2, + &a = this->c0, &b = this->c1, &c = this->c2; + const my_Fp aA = a*A; + const my_Fp bB = b*B; + const my_Fp cC = c*C; + + return Fp3_model(aA + non_residue*((b+c)*(B+C)-bB-cC), + (a+b)*(A+B)-aA-bB+non_residue*cC, + (a+c)*(A+C)-aA+bB-cC); +} + +template& modulus> +Fp3_model Fp3_model::operator-() const +{ + return Fp3_model(-this->c0, + -this->c1, + -this->c2); +} + +template& modulus> +Fp3_model Fp3_model::squared() const +{ + /* Devegili OhEig Scott Dahab --- Multiplication and Squaring on Pairing-Friendly Fields.pdf; Section 4 (CH-SQR2) */ + const my_Fp + &a = this->c0, &b = this->c1, &c = this->c2; + const my_Fp s0 = a.squared(); + const my_Fp ab = a*b; + const my_Fp s1 = ab + ab; + const my_Fp s2 = (a - b + c).squared(); + const my_Fp bc = b*c; + const my_Fp s3 = bc + bc; + const my_Fp s4 = c.squared(); + + return Fp3_model(s0 + non_residue * s3, + s1 + non_residue * s4, + s1 + s2 + s3 - s0 - s4); +} + +template& modulus> +Fp3_model Fp3_model::inverse() const +{ + const my_Fp + &a = this->c0, &b = this->c1, &c = this->c2; + + /* From "High-Speed Software Implementation of the Optimal Ate Pairing over Barreto-Naehrig Curves"; Algorithm 17 */ + const my_Fp t0 = a.squared(); + const my_Fp t1 = b.squared(); + const my_Fp t2 = c.squared(); + const my_Fp t3 = a*b; + const my_Fp t4 = a*c; + const my_Fp t5 = b*c; + const my_Fp c0 = t0 - non_residue * t5; + const my_Fp c1 = non_residue * t2 - t3; + const my_Fp c2 = t1 - t4; // typo in paper referenced above. should be "-" as per Scott, but is "*" + const my_Fp t6 = (a * c0 + non_residue * (c * c1 + b * c2)).inverse(); + return Fp3_model(t6 * c0, t6 * c1, t6 * c2); +} + +template& modulus> +Fp3_model Fp3_model::Frobenius_map(unsigned long power) const +{ + return Fp3_model(c0, + Frobenius_coeffs_c1[power % 3] * c1, + Frobenius_coeffs_c2[power % 3] * c2); +} + +template& modulus> +Fp3_model Fp3_model::sqrt() const +{ + Fp3_model one = Fp3_model::one(); + + size_t v = Fp3_model::s; + Fp3_model z = Fp3_model::nqr_to_t; + Fp3_model w = (*this)^Fp3_model::t_minus_1_over_2; + Fp3_model x = (*this) * w; + Fp3_model b = x * w; // b = (*this)^t + +#if DEBUG + // check if square with euler's criterion + Fp3_model check = b; + for (size_t i = 0; i < v-1; ++i) + { + check = check.squared(); + } + if (check != one) + { + assert(0); + } +#endif + + // compute square root with Tonelli--Shanks + // (does not terminate if not a square!) + + while (b != one) + { + size_t m = 0; + Fp3_model b2m = b; + while (b2m != one) + { + /* invariant: b2m = b^(2^m) after entering this loop */ + b2m = b2m.squared(); + m += 1; + } + + int j = v-m-1; + w = z; + while (j > 0) + { + w = w.squared(); + --j; + } // w = z^2^(v-m-1) + + z = w.squared(); + b = b * z; + x = x * w; + v = m; + } + + return x; +} + +template& modulus> +template +Fp3_model Fp3_model::operator^(const bigint &pow) const +{ + return power >(*this, pow); +} + +template& modulus> +std::ostream& operator<<(std::ostream &out, const Fp3_model &el) +{ + out << el.c0 << OUTPUT_SEPARATOR << el.c1 << OUTPUT_SEPARATOR << el.c2; + return out; +} + +template& modulus> +std::istream& operator>>(std::istream &in, Fp3_model &el) +{ + in >> el.c0 >> el.c1 >> el.c2; + return in; +} + +template& modulus> +std::ostream& operator<<(std::ostream& out, const std::vector > &v) +{ + out << v.size() << "\n"; + for (const Fp3_model& t : v) + { + out << t << OUTPUT_NEWLINE; + } + + return out; +} + +template& modulus> +std::istream& operator>>(std::istream& in, std::vector > &v) +{ + v.clear(); + + size_t s; + in >> s; + + char b; + in.read(&b, 1); + + v.reserve(s); + + for (size_t i = 0; i < s; ++i) + { + Fp3_model el; + in >> el; + v.emplace_back(el); + } + + return in; +} + +} // libsnark +#endif // FP3_TCC_ diff --git a/src/algebra/fields/fp6_3over2.hpp b/src/algebra/fields/fp6_3over2.hpp new file mode 100644 index 000000000..335d61c53 --- /dev/null +++ b/src/algebra/fields/fp6_3over2.hpp @@ -0,0 +1,104 @@ +/** @file + ***************************************************************************** + Declaration of arithmetic in the finite field F[(p^2)^3] + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef FP6_3OVER2_HPP_ +#define FP6_3OVER2_HPP_ +#include "algebra/fields/fp.hpp" +#include "algebra/fields/fp2.hpp" +#include + +namespace libsnark { + +template& modulus> +class Fp6_3over2_model; + +template& modulus> +std::ostream& operator<<(std::ostream &, const Fp6_3over2_model &); + +template& modulus> +std::istream& operator>>(std::istream &, Fp6_3over2_model &); + +/** + * Arithmetic in the finite field F[(p^2)^3]. + * + * Let p := modulus. This interface provides arithmetic for the extension field + * Fp6 = Fp2[V]/(V^3-non_residue) where non_residue is in Fp. + * + * ASSUMPTION: p = 1 (mod 6) + */ +template& modulus> +class Fp6_3over2_model { +public: + typedef Fp_model my_Fp; + typedef Fp2_model my_Fp2; + + static my_Fp2 non_residue; + static my_Fp2 Frobenius_coeffs_c1[6]; // non_residue^((modulus^i-1)/3) for i=0,1,2,3,4,5 + static my_Fp2 Frobenius_coeffs_c2[6]; // non_residue^((2*modulus^i-2)/3) for i=0,1,2,3,4,5 + + my_Fp2 c0, c1, c2; + Fp6_3over2_model() {}; + Fp6_3over2_model(const my_Fp2& c0, const my_Fp2& c1, const my_Fp2& c2) : c0(c0), c1(c1), c2(c2) {}; + + void clear() { c0.clear(); c1.clear(); c2.clear(); } + void print() const { printf("c0/c1/c2:\n"); c0.print(); c1.print(); c2.print(); } + + static Fp6_3over2_model zero(); + static Fp6_3over2_model one(); + static Fp6_3over2_model random_element(); + + bool is_zero() const { return c0.is_zero() && c1.is_zero() && c2.is_zero(); } + bool operator==(const Fp6_3over2_model &other) const; + bool operator!=(const Fp6_3over2_model &other) const; + + Fp6_3over2_model operator+(const Fp6_3over2_model &other) const; + Fp6_3over2_model operator-(const Fp6_3over2_model &other) const; + Fp6_3over2_model operator*(const Fp6_3over2_model &other) const; + Fp6_3over2_model operator-() const; + Fp6_3over2_model squared() const; + Fp6_3over2_model inverse() const; + Fp6_3over2_model Frobenius_map(unsigned long power) const; + + static my_Fp2 mul_by_non_residue(const my_Fp2 &elt); + + template + Fp6_3over2_model operator^(const bigint &other) const; + + static bigint base_field_char() { return modulus; } + static size_t extension_degree() { return 6; } + + friend std::ostream& operator<< (std::ostream &out, const Fp6_3over2_model &el); + friend std::istream& operator>> (std::istream &in, Fp6_3over2_model &el); +}; + +template& modulus> +std::ostream& operator<<(std::ostream& out, const std::vector > &v); + +template& modulus> +std::istream& operator>>(std::istream& in, std::vector > &v); + +template& modulus> +Fp6_3over2_model operator*(const Fp_model &lhs, const Fp6_3over2_model &rhs); + +template& modulus> +Fp6_3over2_model operator*(const Fp2_model &lhs, const Fp6_3over2_model &rhs); + +template& modulus> +Fp2_model Fp6_3over2_model::non_residue; + +template& modulus> +Fp2_model Fp6_3over2_model::Frobenius_coeffs_c1[6]; + +template& modulus> +Fp2_model Fp6_3over2_model::Frobenius_coeffs_c2[6]; + +} // libsnark +#include "algebra/fields/fp6_3over2.tcc" + +#endif // FP6_3OVER2_HPP_ diff --git a/src/algebra/fields/fp6_3over2.tcc b/src/algebra/fields/fp6_3over2.tcc new file mode 100644 index 000000000..f4fffde04 --- /dev/null +++ b/src/algebra/fields/fp6_3over2.tcc @@ -0,0 +1,216 @@ +/** @file + ***************************************************************************** + Implementation of arithmetic in the finite field F[(p^2)^3]. + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef FP6_3OVER2_TCC_ +#define FP6_3OVER2_TCC_ +#include "algebra/fields/field_utils.hpp" + +namespace libsnark { + +template& modulus> +Fp2_model Fp6_3over2_model::mul_by_non_residue(const Fp2_model &elt) +{ + return Fp2_model(non_residue * elt); +} + +template& modulus> +Fp6_3over2_model Fp6_3over2_model::zero() +{ + return Fp6_3over2_model(my_Fp2::zero(), my_Fp2::zero(), my_Fp2::zero()); +} + +template& modulus> +Fp6_3over2_model Fp6_3over2_model::one() +{ + return Fp6_3over2_model(my_Fp2::one(), my_Fp2::zero(), my_Fp2::zero()); +} + +template& modulus> +Fp6_3over2_model Fp6_3over2_model::random_element() +{ + Fp6_3over2_model r; + r.c0 = my_Fp2::random_element(); + r.c1 = my_Fp2::random_element(); + r.c2 = my_Fp2::random_element(); + + return r; +} + +template& modulus> +bool Fp6_3over2_model::operator==(const Fp6_3over2_model &other) const +{ + return (this->c0 == other.c0 && this->c1 == other.c1 && this->c2 == other.c2); +} + +template& modulus> +bool Fp6_3over2_model::operator!=(const Fp6_3over2_model &other) const +{ + return !(operator==(other)); +} + +template& modulus> +Fp6_3over2_model Fp6_3over2_model::operator+(const Fp6_3over2_model &other) const +{ + return Fp6_3over2_model(this->c0 + other.c0, + this->c1 + other.c1, + this->c2 + other.c2); +} + +template& modulus> +Fp6_3over2_model Fp6_3over2_model::operator-(const Fp6_3over2_model &other) const +{ + return Fp6_3over2_model(this->c0 - other.c0, + this->c1 - other.c1, + this->c2 - other.c2); +} + +template& modulus> +Fp6_3over2_model operator*(const Fp_model &lhs, const Fp6_3over2_model &rhs) +{ + return Fp6_3over2_model(lhs*rhs.c0, + lhs*rhs.c1, + lhs*rhs.c2); +} + +template& modulus> +Fp6_3over2_model operator*(const Fp2_model &lhs, const Fp6_3over2_model &rhs) +{ + return Fp6_3over2_model(lhs*rhs.c0, + lhs*rhs.c1, + lhs*rhs.c2); +} + +template& modulus> +Fp6_3over2_model Fp6_3over2_model::operator*(const Fp6_3over2_model &other) const +{ + /* Devegili OhEig Scott Dahab --- Multiplication and Squaring on Pairing-Friendly Fields.pdf; Section 4 (Karatsuba) */ + + const my_Fp2 &A = other.c0, &B = other.c1, &C = other.c2, + &a = this->c0, &b = this->c1, &c = this->c2; + const my_Fp2 aA = a*A; + const my_Fp2 bB = b*B; + const my_Fp2 cC = c*C; + + return Fp6_3over2_model(aA + Fp6_3over2_model::mul_by_non_residue((b+c)*(B+C)-bB-cC), + (a+b)*(A+B)-aA-bB+Fp6_3over2_model::mul_by_non_residue(cC), + (a+c)*(A+C)-aA+bB-cC); +} + +template& modulus> +Fp6_3over2_model Fp6_3over2_model::operator-() const +{ + return Fp6_3over2_model(-this->c0, + -this->c1, + -this->c2); +} + +template& modulus> +Fp6_3over2_model Fp6_3over2_model::squared() const +{ + /* Devegili OhEig Scott Dahab --- Multiplication and Squaring on Pairing-Friendly Fields.pdf; Section 4 (CH-SQR2) */ + + const my_Fp2 &a = this->c0, &b = this->c1, &c = this->c2; + const my_Fp2 s0 = a.squared(); + const my_Fp2 ab = a*b; + const my_Fp2 s1 = ab + ab; + const my_Fp2 s2 = (a - b + c).squared(); + const my_Fp2 bc = b*c; + const my_Fp2 s3 = bc + bc; + const my_Fp2 s4 = c.squared(); + + return Fp6_3over2_model(s0 + Fp6_3over2_model::mul_by_non_residue(s3), + s1 + Fp6_3over2_model::mul_by_non_residue(s4), + s1 + s2 + s3 - s0 - s4); +} + +template& modulus> +Fp6_3over2_model Fp6_3over2_model::inverse() const +{ + /* From "High-Speed Software Implementation of the Optimal Ate Pairing over Barreto-Naehrig Curves"; Algorithm 17 */ + + const my_Fp2 &a = this->c0, &b = this->c1, &c = this->c2; + const my_Fp2 t0 = a.squared(); + const my_Fp2 t1 = b.squared(); + const my_Fp2 t2 = c.squared(); + const my_Fp2 t3 = a*b; + const my_Fp2 t4 = a*c; + const my_Fp2 t5 = b*c; + const my_Fp2 c0 = t0 - Fp6_3over2_model::mul_by_non_residue(t5); + const my_Fp2 c1 = Fp6_3over2_model::mul_by_non_residue(t2) - t3; + const my_Fp2 c2 = t1 - t4; // typo in paper referenced above. should be "-" as per Scott, but is "*" + const my_Fp2 t6 = (a * c0 + Fp6_3over2_model::mul_by_non_residue((c * c1 + b * c2))).inverse(); + return Fp6_3over2_model(t6 * c0, t6 * c1, t6 * c2); +} + +template& modulus> +Fp6_3over2_model Fp6_3over2_model::Frobenius_map(unsigned long power) const +{ + return Fp6_3over2_model(c0.Frobenius_map(power), + Frobenius_coeffs_c1[power % 6] * c1.Frobenius_map(power), + Frobenius_coeffs_c2[power % 6] * c2.Frobenius_map(power)); +} + +template& modulus> +template +Fp6_3over2_model Fp6_3over2_model::operator^(const bigint &pow) const +{ + return power, m>(*this, pow); +} + +template& modulus> +std::ostream& operator<<(std::ostream &out, const Fp6_3over2_model &el) +{ + out << el.c0 << OUTPUT_SEPARATOR << el.c1 << OUTPUT_SEPARATOR << el.c2; + return out; +} + +template& modulus> +std::istream& operator>>(std::istream &in, Fp6_3over2_model &el) +{ + in >> el.c0 >> el.c1 >> el.c2; + return in; +} + +template& modulus> +std::ostream& operator<<(std::ostream& out, const std::vector > &v) +{ + out << v.size() << "\n"; + for (const Fp6_3over2_model& t : v) + { + out << t << OUTPUT_NEWLINE; + } + + return out; +} + +template& modulus> +std::istream& operator>>(std::istream& in, std::vector > &v) +{ + v.clear(); + + size_t s; + in >> s; + + char b; + in.read(&b, 1); + + v.reserve(s); + + for (size_t i = 0; i < s; ++i) + { + Fp6_3over2_model el; + in >> el; + v.emplace_back(el); + } + + return in; +} + +} // libsnark +#endif // FP6_3_OVER_2_TCC_ diff --git a/src/algebra/fields/fp_aux.tcc b/src/algebra/fields/fp_aux.tcc new file mode 100644 index 000000000..7f8a3eadf --- /dev/null +++ b/src/algebra/fields/fp_aux.tcc @@ -0,0 +1,389 @@ +/** @file + ***************************************************************************** + Assembly code snippets for F[p] finite field arithmetic, used by fp.tcc . + Specific to x86-64, and used only if USE_ASM is defined. + On other architectures or without USE_ASM, fp.tcc uses a portable + C++ implementation instead. + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef FP_AUX_TCC_ +#define FP_AUX_TCC_ + +namespace libsnark { + +#define STR_HELPER(x) #x +#define STR(x) STR_HELPER(x) + +/* addq is faster than adcq, even if preceded by clc */ +#define ADD_FIRSTADD \ + "movq (%[B]), %%rax \n\t" \ + "addq %%rax, (%[A]) \n\t" + +#define ADD_NEXTADD(ofs) \ + "movq " STR(ofs) "(%[B]), %%rax \n\t" \ + "adcq %%rax, " STR(ofs) "(%[A]) \n\t" + +#define ADD_CMP(ofs) \ + "movq " STR(ofs) "(%[mod]), %%rax \n\t" \ + "cmpq %%rax, " STR(ofs) "(%[A]) \n\t" \ + "jb done%= \n\t" \ + "ja subtract%= \n\t" + +#define ADD_FIRSTSUB \ + "movq (%[mod]), %%rax \n\t" \ + "subq %%rax, (%[A]) \n\t" + +#define ADD_FIRSTSUB \ + "movq (%[mod]), %%rax \n\t" \ + "subq %%rax, (%[A]) \n\t" + +#define ADD_NEXTSUB(ofs) \ + "movq " STR(ofs) "(%[mod]), %%rax \n\t" \ + "sbbq %%rax, " STR(ofs) "(%[A]) \n\t" + +#define SUB_FIRSTSUB \ + "movq (%[B]), %%rax\n\t" \ + "subq %%rax, (%[A])\n\t" + +#define SUB_NEXTSUB(ofs) \ + "movq " STR(ofs) "(%[B]), %%rax\n\t" \ + "sbbq %%rax, " STR(ofs) "(%[A])\n\t" + +#define SUB_FIRSTADD \ + "movq (%[mod]), %%rax\n\t" \ + "addq %%rax, (%[A])\n\t" + +#define SUB_NEXTADD(ofs) \ + "movq " STR(ofs) "(%[mod]), %%rax\n\t" \ + "adcq %%rax, " STR(ofs) "(%[A])\n\t" + +#define MONT_CMP(ofs) \ + "movq " STR(ofs) "(%[M]), %%rax \n\t" \ + "cmpq %%rax, " STR(ofs) "(%[tmp]) \n\t" \ + "jb done%= \n\t" \ + "ja subtract%= \n\t" + +#define MONT_FIRSTSUB \ + "movq (%[M]), %%rax \n\t" \ + "subq %%rax, (%[tmp]) \n\t" + +#define MONT_NEXTSUB(ofs) \ + "movq " STR(ofs) "(%[M]), %%rax \n\t" \ + "sbbq %%rax, " STR(ofs) "(%[tmp]) \n\t" + +/* + The x86-64 Montgomery multiplication here is similar + to Algorithm 2 (CIOS method) in http://eprint.iacr.org/2012/140.pdf + and the PowerPC pseudocode of gmp-ecm library (c) Paul Zimmermann and Alexander Kruppa + (see comments on top of powerpc64/mulredc.m4). +*/ + +#define MONT_PRECOMPUTE \ + "xorq %[cy], %[cy] \n\t" \ + "movq 0(%[A]), %%rax \n\t" \ + "mulq 0(%[B]) \n\t" \ + "movq %%rax, %[T0] \n\t" \ + "movq %%rdx, %[T1] # T1:T0 <- A[0] * B[0] \n\t" \ + "mulq %[inv] \n\t" \ + "movq %%rax, %[u] # u <- T0 * inv \n\t" \ + "mulq 0(%[M]) \n\t" \ + "addq %[T0], %%rax \n\t" \ + "adcq %%rdx, %[T1] \n\t" \ + "adcq $0, %[cy] # cy:T1 <- (M[0]*u + T1 * b + T0) / b\n\t" + +#define MONT_FIRSTITER(j) \ + "xorq %[T0], %[T0] \n\t" \ + "movq 0(%[A]), %%rax \n\t" \ + "mulq " STR((j*8)) "(%[B]) \n\t" \ + "addq %[T1], %%rax \n\t" \ + "movq %%rax, " STR(((j-1)*8)) "(%[tmp]) \n\t" \ + "adcq $0, %%rdx \n\t" \ + "movq %%rdx, %[T1] # now T1:tmp[j-1] <-- X[0] * Y[j] + T1\n\t" \ + "movq " STR((j*8)) "(%[M]), %%rax \n\t" \ + "mulq %[u] \n\t" \ + "addq %%rax, " STR(((j-1)*8)) "(%[tmp]) \n\t" \ + "adcq %[cy], %%rdx \n\t" \ + "adcq $0, %[T0] \n\t" \ + "xorq %[cy], %[cy] \n\t" \ + "addq %%rdx, %[T1] \n\t" \ + "adcq %[T0], %[cy] # cy:T1:tmp[j-1] <---- (X[0] * Y[j] + T1) + (M[j] * u + cy * b) \n\t" + +#define MONT_ITERFIRST(i) \ + "xorq %[cy], %[cy] \n\t" \ + "movq " STR((i*8)) "(%[A]), %%rax \n\t" \ + "mulq 0(%[B]) \n\t" \ + "addq 0(%[tmp]), %%rax \n\t" \ + "adcq 8(%[tmp]), %%rdx \n\t" \ + "adcq $0, %[cy] \n\t" \ + "movq %%rax, %[T0] \n\t" \ + "movq %%rdx, %[T1] # cy:T1:T0 <- A[i] * B[0] + tmp[1] * b + tmp[0]\n\t" \ + "mulq %[inv] \n\t" \ + "movq %%rax, %[u] # u <- T0 * inv\n\t" \ + "mulq 0(%[M]) \n\t" \ + "addq %[T0], %%rax \n\t" \ + "adcq %%rdx, %[T1] \n\t" \ + "adcq $0, %[cy] # cy:T1 <- (M[0]*u + cy * b * b + T1 * b + T0) / b\n\t" + +#define MONT_ITERITER(i, j) \ + "xorq %[T0], %[T0] \n\t" \ + "movq " STR((i*8)) "(%[A]), %%rax \n\t" \ + "mulq " STR((j*8)) "(%[B]) \n\t" \ + "addq %[T1], %%rax \n\t" \ + "movq %%rax, " STR(((j-1)*8)) "(%[tmp]) \n\t" \ + "adcq $0, %%rdx \n\t" \ + "movq %%rdx, %[T1] # now T1:tmp[j-1] <-- X[i] * Y[j] + T1 \n\t" \ + "movq " STR((j*8)) "(%[M]), %%rax \n\t" \ + "mulq %[u] \n\t" \ + "addq %%rax, " STR(((j-1)*8)) "(%[tmp]) \n\t" \ + "adcq %[cy], %%rdx \n\t" \ + "adcq $0, %[T0] \n\t" \ + "xorq %[cy], %[cy] \n\t" \ + "addq %%rdx, %[T1] \n\t" \ + "adcq %[T0], %[cy] # cy:T1:tmp[j-1] <-- (X[i] * Y[j] + T1) + M[j] * u + cy * b \n\t" \ + "addq " STR(((j+1)*8)) "(%[tmp]), %[T1] \n\t" \ + "adcq $0, %[cy] # cy:T1:tmp[j-1] <-- (X[i] * Y[j] + T1) + M[j] * u + (tmp[j+1] + cy) * b \n\t" + +#define MONT_FINALIZE(j) \ + "movq %[T1], " STR((j*8)) "(%[tmp]) \n\t" \ + "movq %[cy], " STR(((j+1)*8)) "(%[tmp]) \n\t" + +/* + Comba multiplication and squaring routines are based on the + public-domain tomsfastmath library by Tom St Denis + + + + Compared to the above, we save 5-20% of cycles by using careful register + renaming to implement Comba forward operation. + */ + +#define COMBA_3_BY_3_MUL(c0_, c1_, c2_, res_, A_, B_) \ + asm volatile ( \ + "movq 0(%[A]), %%rax \n\t" \ + "mulq 0(%[B]) \n\t" \ + "movq %%rax, 0(%[res]) \n\t" \ + "movq %%rdx, %[c0] \n\t" \ + \ + "xorq %[c1], %[c1] \n\t" \ + "movq 0(%[A]), %%rax \n\t" \ + "mulq 8(%[B]) \n\t" \ + "addq %%rax, %[c0] \n\t" \ + "adcq %%rdx, %[c1] \n\t" \ + \ + "xorq %[c2], %[c2] \n\t" \ + "movq 8(%[A]), %%rax \n\t" \ + "mulq 0(%[B]) \n\t" \ + "addq %%rax, %[c0] \n\t" \ + "movq %[c0], 8(%[res]) \n\t" \ + "adcq %%rdx, %[c1] \n\t" \ + "adcq $0, %[c2] \n\t" \ + \ + "// register renaming (c1, c2, c0)\n\t" \ + "xorq %[c0], %[c0] \n\t" \ + "movq 0(%[A]), %%rax \n\t" \ + "mulq 16(%[B]) \n\t" \ + "addq %%rax, %[c1] \n\t" \ + "adcq %%rdx, %[c2] \n\t" \ + "adcq $0, %[c0] \n\t" \ + \ + "movq 8(%[A]), %%rax \n\t" \ + "mulq 8(%[B]) \n\t" \ + "addq %%rax, %[c1] \n\t" \ + "adcq %%rdx, %[c2] \n\t" \ + "adcq $0, %[c0] \n\t" \ + \ + "movq 16(%[A]), %%rax \n\t" \ + "mulq 0(%[B]) \n\t" \ + "addq %%rax, %[c1] \n\t" \ + "movq %[c1], 16(%[res]) \n\t" \ + "adcq %%rdx, %[c2] \n\t" \ + "adcq $0, %[c0] \n\t" \ + \ + "// register renaming (c2, c0, c1)\n\t" \ + "xorq %[c1], %[c1] \n\t" \ + "movq 8(%[A]), %%rax \n\t" \ + "mulq 16(%[B]) \n\t" \ + "addq %%rax, %[c2] \n\t" \ + "adcq %%rdx, %[c0] \n\t" \ + "adcq $0, %[c1] \n\t" \ + \ + "movq 16(%[A]), %%rax \n\t" \ + "mulq 8(%[B]) \n\t" \ + "addq %%rax, %[c2] \n\t" \ + "movq %[c2], 24(%[res]) \n\t" \ + "adcq %%rdx, %[c0] \n\t" \ + "adcq $0, %[c1] \n\t" \ + \ + "// register renaming (c0, c1, c2)\n\t" \ + "xorq %[c2], %[c2] \n\t" \ + "movq 16(%[A]), %%rax \n\t" \ + "mulq 16(%[B]) \n\t" \ + "addq %%rax, %[c0] \n\t" \ + "movq %[c0], 32(%[res]) \n\t" \ + "adcq %%rdx, %[c1] \n\t" \ + "movq %[c1], 40(%[res]) \n\t" \ + : [c0] "=&r" (c0_), [c1] "=&r" (c1_), [c2] "=&r" (c2_) \ + : [res] "r" (res_), [A] "r" (A_), [B] "r" (B_) \ + : "%rax", "%rdx", "cc", "memory") + +#define COMBA_3_BY_3_SQR(c0_, c1_, c2_, res_, A_) \ + asm volatile ( \ + "xorq %[c1], %[c1] \n\t" \ + "xorq %[c2], %[c2] \n\t" \ + "movq 0(%[A]), %%rax \n\t" \ + "mulq %%rax \n\t" \ + "movq %%rax, 0(%[res]) \n\t" \ + "movq %%rdx, %[c0] \n\t" \ + \ + "movq 0(%[A]), %%rax \n\t" \ + "mulq 8(%[A]) \n\t" \ + "addq %%rax, %[c0] \n\t" \ + "adcq %%rdx, %[c1] \n\t" \ + "addq %%rax, %[c0] \n\t" \ + "movq %[c0], 8(%[res]) \n\t" \ + "adcq %%rdx, %[c1] \n\t" \ + "adcq $0, %[c2] \n\t" \ + \ + "// register renaming (c1, c2, c0)\n\t" \ + "movq 0(%[A]), %%rax \n\t" \ + "xorq %[c0], %[c0] \n\t" \ + "mulq 16(%[A]) \n\t" \ + "addq %%rax, %[c1] \n\t" \ + "adcq %%rdx, %[c2] \n\t" \ + "adcq $0, %[c0] \n\t" \ + "addq %%rax, %[c1] \n\t" \ + "adcq %%rdx, %[c2] \n\t" \ + "adcq $0, %[c0] \n\t" \ + \ + "movq 8(%[A]), %%rax \n\t" \ + "mulq %%rax \n\t" \ + "addq %%rax, %[c1] \n\t" \ + "movq %[c1], 16(%[res]) \n\t" \ + "adcq %%rdx, %[c2] \n\t" \ + "adcq $0, %[c0] \n\t" \ + \ + "// register renaming (c2, c0, c1)\n\t" \ + "movq 8(%[A]), %%rax \n\t" \ + "xorq %[c1], %[c1] \n\t" \ + "mulq 16(%[A]) \n\t" \ + "addq %%rax, %[c2] \n\t" \ + "adcq %%rdx, %[c0] \n\t" \ + "adcq $0, %[c1] \n\t" \ + "addq %%rax, %[c2] \n\t" \ + "movq %[c2], 24(%[res]) \n\t" \ + "adcq %%rdx, %[c0] \n\t" \ + "adcq $0, %[c1] \n\t" \ + \ + "// register renaming (c0, c1, c2)\n\t" \ + "movq 16(%[A]), %%rax \n\t" \ + "mulq %%rax \n\t" \ + "addq %%rax, %[c0] \n\t" \ + "movq %[c0], 32(%[res]) \n\t" \ + "adcq %%rdx, %[c1] \n\t" \ + "movq %[c1], 40(%[res]) \n\t" \ + \ + : [c0] "=&r" (c0_), [c1] "=&r" (c1_), [c2] "=&r" (c2_) \ + : [res] "r" (res_), [A] "r" (A_) \ + : "%rax", "%rdx", "cc", "memory") + +/* + The Montgomery reduction here is based on Algorithm 14.32 in + Handbook of Applied Cryptography + . + */ +#define REDUCE_6_LIMB_PRODUCT(k_, tmp1_, tmp2_, tmp3_, inv_, res_, mod_) \ + __asm__ volatile \ + ("///////////////////////////////////\n\t" \ + "movq 0(%[res]), %%rax \n\t" \ + "mulq %[modprime] \n\t" \ + "movq %%rax, %[k] \n\t" \ + \ + "movq (%[mod]), %%rax \n\t" \ + "mulq %[k] \n\t" \ + "movq %%rax, %[tmp1] \n\t" \ + "movq %%rdx, %[tmp2] \n\t" \ + \ + "xorq %[tmp3], %[tmp3] \n\t" \ + "movq 8(%[mod]), %%rax \n\t" \ + "mulq %[k] \n\t" \ + "addq %[tmp1], 0(%[res]) \n\t" \ + "adcq %%rax, %[tmp2] \n\t" \ + "adcq %%rdx, %[tmp3] \n\t" \ + \ + "xorq %[tmp1], %[tmp1] \n\t" \ + "movq 16(%[mod]), %%rax \n\t" \ + "mulq %[k] \n\t" \ + "addq %[tmp2], 8(%[res]) \n\t" \ + "adcq %%rax, %[tmp3] \n\t" \ + "adcq %%rdx, %[tmp1] \n\t" \ + \ + "addq %[tmp3], 16(%[res]) \n\t" \ + "adcq %[tmp1], 24(%[res]) \n\t" \ + "adcq $0, 32(%[res]) \n\t" \ + "adcq $0, 40(%[res]) \n\t" \ + \ + "///////////////////////////////////\n\t" \ + "movq 8(%[res]), %%rax \n\t" \ + "mulq %[modprime] \n\t" \ + "movq %%rax, %[k] \n\t" \ + \ + "movq (%[mod]), %%rax \n\t" \ + "mulq %[k] \n\t" \ + "movq %%rax, %[tmp1] \n\t" \ + "movq %%rdx, %[tmp2] \n\t" \ + \ + "xorq %[tmp3], %[tmp3] \n\t" \ + "movq 8(%[mod]), %%rax \n\t" \ + "mulq %[k] \n\t" \ + "addq %[tmp1], 8(%[res]) \n\t" \ + "adcq %%rax, %[tmp2] \n\t" \ + "adcq %%rdx, %[tmp3] \n\t" \ + \ + "xorq %[tmp1], %[tmp1] \n\t" \ + "movq 16(%[mod]), %%rax \n\t" \ + "mulq %[k] \n\t" \ + "addq %[tmp2], 16(%[res]) \n\t" \ + "adcq %%rax, %[tmp3] \n\t" \ + "adcq %%rdx, %[tmp1] \n\t" \ + \ + "addq %[tmp3], 24(%[res]) \n\t" \ + "adcq %[tmp1], 32(%[res]) \n\t" \ + "adcq $0, 40(%[res]) \n\t" \ + \ + "///////////////////////////////////\n\t" \ + "movq 16(%[res]), %%rax \n\t" \ + "mulq %[modprime] \n\t" \ + "movq %%rax, %[k] \n\t" \ + \ + "movq (%[mod]), %%rax \n\t" \ + "mulq %[k] \n\t" \ + "movq %%rax, %[tmp1] \n\t" \ + "movq %%rdx, %[tmp2] \n\t" \ + \ + "xorq %[tmp3], %[tmp3] \n\t" \ + "movq 8(%[mod]), %%rax \n\t" \ + "mulq %[k] \n\t" \ + "addq %[tmp1], 16(%[res]) \n\t" \ + "adcq %%rax, %[tmp2] \n\t" \ + "adcq %%rdx, %[tmp3] \n\t" \ + \ + "xorq %[tmp1], %[tmp1] \n\t" \ + "movq 16(%[mod]), %%rax \n\t" \ + "mulq %[k] \n\t" \ + "addq %[tmp2], 24(%[res]) \n\t" \ + "adcq %%rax, %[tmp3] \n\t" \ + "adcq %%rdx, %[tmp1] \n\t" \ + \ + "addq %[tmp3], 32(%[res]) \n\t" \ + "adcq %[tmp1], 40(%[res]) \n\t" \ + : [k] "=&r" (k_), [tmp1] "=&r" (tmp1_), [tmp2] "=&r" (tmp2_), [tmp3] "=&r" (tmp3_) \ + : [modprime] "r" (inv_), [res] "r" (res_), [mod] "r" (mod_) \ + : "%rax", "%rdx", "cc", "memory") + +} // libsnark +#endif // FP_AUX_TCC_ diff --git a/src/algebra/fields/tests/test_bigint.cpp b/src/algebra/fields/tests/test_bigint.cpp new file mode 100644 index 000000000..b66aae0a3 --- /dev/null +++ b/src/algebra/fields/tests/test_bigint.cpp @@ -0,0 +1,107 @@ +/** + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#include "algebra/fields/bigint.hpp" + +using namespace libsnark; + +void test_bigint() +{ + static_assert(ULONG_MAX == 0xFFFFFFFFFFFFFFFFul, "unsigned long not 64-bit"); + static_assert(GMP_NUMB_BITS == 64, "GMP limb not 64-bit"); + + const char *b1_decimal = "76749407"; + const char *b2_decimal = "435020359732196472065729437602"; + const char *b3_decimal = "33387554642372758038536799358397002014"; + const char *b2_binary = "0000000000000000000000000000010101111101101000000110100001011010" + "1101101010001001000001101000101000100110011001110001111110100010"; + + bigint<1> b0 = bigint<1>(0ul); + bigint<1> b1 = bigint<1>(b1_decimal); + bigint<2> b2 = bigint<2>(b2_decimal); + + assert(b0.as_ulong() == 0ul); + assert(b0.is_zero()); + assert(b1.as_ulong() == 76749407ul); + assert(!(b1.is_zero())); + assert(b2.as_ulong() == 15747124762497195938ul); + assert(!(b2.is_zero())); + assert(b0 != b1); + assert(!(b0 == b1)); + + assert(b2.max_bits() == 128); + assert(b2.num_bits() == 99); + for (size_t i = 0; i < 128; i++) { + assert(b2.test_bit(i) == (b2_binary[127-i] == '1')); + } + + bigint<3> b3 = b2 * b1; + + assert(b3 == bigint<3>(b3_decimal)); + assert(!(b3.is_zero())); + + bigint<3> b3a { b3 }; + assert(b3a == bigint<3>(b3_decimal)); + assert(b3a == b3); + assert(!(b3a.is_zero())); + + mpz_t m3; + mpz_init(m3); + b3.to_mpz(m3); + bigint<3> b3b { m3 }; + assert(b3b == b3); + + bigint<2> quotient; + bigint<2> remainder; + bigint<3>::div_qr(quotient, remainder, b3, b2); + assert(quotient.num_bits() < GMP_NUMB_BITS); + assert(quotient.as_ulong() == b1.as_ulong()); + bigint<1> b1inc = bigint<1>("76749408"); + bigint<1> b1a = quotient.shorten(b1inc, "test"); + assert(b1a == b1); + assert(remainder.is_zero()); + remainder.limit(b2, "test"); + + try { + (void)(quotient.shorten(b1, "test")); + assert(false); + } catch (std::domain_error) {} + try { + remainder.limit(remainder, "test"); + assert(false); + } catch (std::domain_error) {} + + bigint<1> br = bigint<1>("42"); + b3 += br; + assert(b3 != b3a); + assert(b3 > b3a); + assert(!(b3a > b3)); + + bigint<3>::div_qr(quotient, remainder, b3, b2); + assert(quotient.num_bits() < GMP_NUMB_BITS); + assert(quotient.as_ulong() == b1.as_ulong()); + assert(remainder.num_bits() < GMP_NUMB_BITS); + assert(remainder.as_ulong() == 42); + + b3a.clear(); + assert(b3a.is_zero()); + assert(b3a.num_bits() == 0); + assert(!(b3.is_zero())); + + bigint<4> bx = bigint<4>().randomize(); + bigint<4> by = bigint<4>().randomize(); + assert(!(bx == by)); + + // TODO: test serialization +} + +int main(void) +{ + test_bigint(); + return 0; +} + diff --git a/src/algebra/fields/tests/test_fields.cpp b/src/algebra/fields/tests/test_fields.cpp new file mode 100644 index 000000000..a05f601e6 --- /dev/null +++ b/src/algebra/fields/tests/test_fields.cpp @@ -0,0 +1,245 @@ +/** + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ +#include "common/profiling.hpp" +#include "algebra/curves/edwards/edwards_pp.hpp" +#include "algebra/curves/mnt/mnt4/mnt4_pp.hpp" +#include "algebra/curves/mnt/mnt6/mnt6_pp.hpp" +#ifdef CURVE_BN128 +#include "algebra/curves/bn128/bn128_pp.hpp" +#endif +#include "algebra/curves/alt_bn128/alt_bn128_pp.hpp" +#include "algebra/fields/fp6_3over2.hpp" +#include "algebra/fields/fp12_2over3over2.hpp" + +using namespace libsnark; + +template +void test_field() +{ + bigint<1> rand1 = bigint<1>("76749407"); + bigint<1> rand2 = bigint<1>("44410867"); + bigint<1> randsum = bigint<1>("121160274"); + + FieldT zero = FieldT::zero(); + FieldT one = FieldT::one(); + FieldT a = FieldT::random_element(); + FieldT a_ser; + a_ser = reserialize(a); + assert(a_ser == a); + + FieldT b = FieldT::random_element(); + FieldT c = FieldT::random_element(); + FieldT d = FieldT::random_element(); + + assert(a != zero); + assert(a != one); + + assert(a * a == a.squared()); + assert((a + b).squared() == a.squared() + a*b + b*a + b.squared()); + assert((a + b)*(c + d) == a*c + a*d + b*c + b*d); + assert(a - b == a + (-b)); + assert(a - b == (-b) + a); + + assert((a ^ rand1) * (a ^ rand2) == (a^randsum)); + + assert(a * a.inverse() == one); + assert((a + b) * c.inverse() == a * c.inverse() + (b.inverse() * c).inverse()); + +} + +template +void test_sqrt() +{ + for (size_t i = 0; i < 100; ++i) + { + FieldT a = FieldT::random_element(); + FieldT asq = a.squared(); + assert(asq.sqrt() == a || asq.sqrt() == -a); + } +} + +template +void test_two_squarings() +{ + FieldT a = FieldT::random_element(); + assert(a.squared() == a * a); + assert(a.squared() == a.squared_complex()); + assert(a.squared() == a.squared_karatsuba()); +} + +template +void test_Frobenius() +{ + FieldT a = FieldT::random_element(); + assert(a.Frobenius_map(0) == a); + FieldT a_q = a ^ FieldT::base_field_char(); + for (size_t power = 1; power < 10; ++power) + { + const FieldT a_qi = a.Frobenius_map(power); + assert(a_qi == a_q); + + a_q = a_q ^ FieldT::base_field_char(); + } +} + +template +void test_unitary_inverse() +{ + assert(FieldT::extension_degree() % 2 == 0); + FieldT a = FieldT::random_element(); + FieldT aqcubed_minus1 = a.Frobenius_map(FieldT::extension_degree()/2) * a.inverse(); + assert(aqcubed_minus1.inverse() == aqcubed_minus1.unitary_inverse()); +} + +template +void test_cyclotomic_squaring(); + +template<> +void test_cyclotomic_squaring >() +{ + typedef Fqk FieldT; + assert(FieldT::extension_degree() % 2 == 0); + FieldT a = FieldT::random_element(); + FieldT a_unitary = a.Frobenius_map(FieldT::extension_degree()/2) * a.inverse(); + // beta = a^((q^(k/2)-1)*(q+1)) + FieldT beta = a_unitary.Frobenius_map(1) * a_unitary; + assert(beta.cyclotomic_squared() == beta.squared()); +} + +template<> +void test_cyclotomic_squaring >() +{ + typedef Fqk FieldT; + assert(FieldT::extension_degree() % 2 == 0); + FieldT a = FieldT::random_element(); + FieldT a_unitary = a.Frobenius_map(FieldT::extension_degree()/2) * a.inverse(); + // beta = a^(q^(k/2)-1) + FieldT beta = a_unitary; + assert(beta.cyclotomic_squared() == beta.squared()); +} + +template<> +void test_cyclotomic_squaring >() +{ + typedef Fqk FieldT; + assert(FieldT::extension_degree() % 2 == 0); + FieldT a = FieldT::random_element(); + FieldT a_unitary = a.Frobenius_map(FieldT::extension_degree()/2) * a.inverse(); + // beta = a^((q^(k/2)-1)*(q+1)) + FieldT beta = a_unitary.Frobenius_map(1) * a_unitary; + assert(beta.cyclotomic_squared() == beta.squared()); +} + +template +void test_all_fields() +{ + test_field >(); + test_field >(); + test_field >(); + test_field >(); + + test_sqrt >(); + test_sqrt >(); + test_sqrt >(); + + test_Frobenius >(); + test_Frobenius >(); + + test_unitary_inverse >(); +} + +template +void test_Fp4_tom_cook() +{ + typedef typename Fp4T::my_Fp FieldT; + for (size_t i = 0; i < 100; ++i) + { + const Fp4T a = Fp4T::random_element(); + const Fp4T b = Fp4T::random_element(); + const Fp4T correct_res = a * b; + + Fp4T res; + + const FieldT + &a0 = a.c0.c0, + &a1 = a.c1.c0, + &a2 = a.c0.c1, + &a3 = a.c1.c1; + + const FieldT + &b0 = b.c0.c0, + &b1 = b.c1.c0, + &b2 = b.c0.c1, + &b3 = b.c1.c1; + + FieldT + &c0 = res.c0.c0, + &c1 = res.c1.c0, + &c2 = res.c0.c1, + &c3 = res.c1.c1; + + const FieldT v0 = a0 * b0; + const FieldT v1 = (a0 + a1 + a2 + a3) * (b0 + b1 + b2 + b3); + const FieldT v2 = (a0 - a1 + a2 - a3) * (b0 - b1 + b2 - b3); + const FieldT v3 = (a0 + FieldT(2)*a1 + FieldT(4)*a2 + FieldT(8)*a3) * (b0 + FieldT(2)*b1 + FieldT(4)*b2 + FieldT(8)*b3); + const FieldT v4 = (a0 - FieldT(2)*a1 + FieldT(4)*a2 - FieldT(8)*a3) * (b0 - FieldT(2)*b1 + FieldT(4)*b2 - FieldT(8)*b3); + const FieldT v5 = (a0 + FieldT(3)*a1 + FieldT(9)*a2 + FieldT(27)*a3) * (b0 + FieldT(3)*b1 + FieldT(9)*b2 + FieldT(27)*b3); + const FieldT v6 = a3 * b3; + + const FieldT beta = Fp4T::non_residue; + + c0 = v0 + beta*(FieldT(4).inverse()*v0 - FieldT(6).inverse()*(v1 + v2) + FieldT(24).inverse() * (v3 + v4) - FieldT(5) * v6); + c1 = - FieldT(3).inverse()*v0 + v1 - FieldT(2).inverse()*v2 - FieldT(4).inverse()*v3 + FieldT(20).inverse() * v4 + FieldT(30).inverse() * v5 - FieldT(12) * v6 + beta * ( - FieldT(12).inverse() * (v0 - v1) + FieldT(24).inverse()*(v2 - v3) - FieldT(120).inverse() * (v4 - v5) - FieldT(3) * v6); + c2 = - (FieldT(5)*(FieldT(4).inverse()))* v0 + (FieldT(2)*(FieldT(3).inverse()))*(v1 + v2) - FieldT(24).inverse()*(v3 + v4) + FieldT(4)*v6 + beta*v6; + c3 = FieldT(12).inverse() * (FieldT(5)*v0 - FieldT(7)*v1) - FieldT(24).inverse()*(v2 - FieldT(7)*v3 + v4 + v5) + FieldT(15)*v6; + + assert(res == correct_res); + + // {v0, v3, v4, v5} + const FieldT u = (FieldT::one() - beta).inverse(); + assert(v0 == u * c0 + beta * u * c2 - beta * u * FieldT(2).inverse() * v1 - beta * u * FieldT(2).inverse() * v2 + beta * v6); + assert(v3 == - FieldT(15) * u * c0 - FieldT(30) * u * c1 - FieldT(3) * (FieldT(4) + beta) * u * c2 - FieldT(6) * (FieldT(4) + beta) * u * c3 + (FieldT(24) - FieldT(3) * beta * FieldT(2).inverse()) * u * v1 + (-FieldT(8) + beta * FieldT(2).inverse()) * u * v2 + - FieldT(3) * (-FieldT(16) + beta) * v6); + assert(v4 == - FieldT(15) * u * c0 + FieldT(30) * u * c1 - FieldT(3) * (FieldT(4) + beta) * u * c2 + FieldT(6) * (FieldT(4) + beta) * u * c3 + (FieldT(24) - FieldT(3) * beta * FieldT(2).inverse()) * u * v2 + (-FieldT(8) + beta * FieldT(2).inverse()) * u * v1 + - FieldT(3) * (-FieldT(16) + beta) * v6); + assert(v5 == - FieldT(80) * u * c0 - FieldT(240) * u * c1 - FieldT(8) * (FieldT(9) + beta) * u * c2 - FieldT(24) * (FieldT(9) + beta) * u * c3 - FieldT(2) * (-FieldT(81) + beta) * u * v1 + (-FieldT(81) + beta) * u * v2 + - FieldT(8) * (-FieldT(81) + beta) * v6); + + // c0 + beta c2 - (beta v1)/2 - (beta v2)/ 2 - (-1 + beta) beta v6, + // -15 c0 - 30 c1 - 3 (4 + beta) c2 - 6 (4 + beta) c3 + (24 - (3 beta)/2) v1 + (-8 + beta/2) v2 + 3 (-16 + beta) (-1 + beta) v6, + // -15 c0 + 30 c1 - 3 (4 + beta) c2 + 6 (4 + beta) c3 + (-8 + beta/2) v1 + (24 - (3 beta)/2) v2 + 3 (-16 + beta) (-1 + beta) v6, + // -80 c0 - 240 c1 - 8 (9 + beta) c2 - 24 (9 + beta) c3 - 2 (-81 + beta) v1 + (-81 + beta) v2 + 8 (-81 + beta) (-1 + beta) v6 + } +} + +int main(void) +{ + edwards_pp::init_public_params(); + test_all_fields(); + test_cyclotomic_squaring >(); + + mnt4_pp::init_public_params(); + test_all_fields(); + test_Fp4_tom_cook(); + test_two_squarings >(); + test_cyclotomic_squaring >(); + + mnt6_pp::init_public_params(); + test_all_fields(); + test_cyclotomic_squaring >(); + + alt_bn128_pp::init_public_params(); + test_field(); + test_Frobenius(); + test_all_fields(); + +#ifdef CURVE_BN128 // BN128 has fancy dependencies so it may be disabled + bn128_pp::init_public_params(); + test_field >(); + test_field >(); +#endif +} diff --git a/src/algebra/knowledge_commitment/knowledge_commitment.hpp b/src/algebra/knowledge_commitment/knowledge_commitment.hpp new file mode 100644 index 000000000..902423134 --- /dev/null +++ b/src/algebra/knowledge_commitment/knowledge_commitment.hpp @@ -0,0 +1,84 @@ +/** @file + ***************************************************************************** + + Declaration of interfaces for: + - a knowledge commitment, and + - a knowledge commitment vector. + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef KNOWLEDGE_COMMITMENT_HPP_ +#define KNOWLEDGE_COMMITMENT_HPP_ + +#include "algebra/fields/fp.hpp" +#include "common/data_structures/sparse_vector.hpp" + +namespace libsnark { + +/********************** Knowledge commitment *********************************/ + +/** + * A knowledge commitment is a pair (g,h) where g is in T1 and h in T2, + * and T1 and T2 are groups (written additively). + * + * Such pairs form a group by defining: + * - "zero" = (0,0) + * - "one" = (1,1) + * - a * (g,h) + b * (g',h') := ( a * g + b * g', a * h + b * h'). + */ +template +struct knowledge_commitment { + + T1 g; + T2 h; + + knowledge_commitment() = default; + knowledge_commitment(const knowledge_commitment &other) = default; + knowledge_commitment(knowledge_commitment &&other) = default; + knowledge_commitment(const T1 &g, const T2 &h); + + knowledge_commitment& operator=(const knowledge_commitment &other) = default; + knowledge_commitment& operator=(knowledge_commitment &&other) = default; + knowledge_commitment operator+(const knowledge_commitment &other) const; + + bool is_zero() const; + bool operator==(const knowledge_commitment &other) const; + bool operator!=(const knowledge_commitment &other) const; + + static knowledge_commitment zero(); + static knowledge_commitment one(); + + void print() const; + + static size_t size_in_bits(); +}; + +template +knowledge_commitment operator*(const bigint &lhs, const knowledge_commitment &rhs); + +template &modulus_p> +knowledge_commitment operator*(const Fp_model &lhs, const knowledge_commitment &rhs); + +template +std::ostream& operator<<(std::ostream& out, const knowledge_commitment &kc); + +template +std::istream& operator>>(std::istream& in, knowledge_commitment &kc); + +/******************** Knowledge commitment vector ****************************/ + +/** + * A knowledge commitment vector is a sparse vector of knowledge commitments. + */ +template +using knowledge_commitment_vector = sparse_vector >; + +} // libsnark + +#include "algebra/knowledge_commitment/knowledge_commitment.tcc" + +#endif // KNOWLEDGE_COMMITMENT_HPP_ diff --git a/src/algebra/knowledge_commitment/knowledge_commitment.tcc b/src/algebra/knowledge_commitment/knowledge_commitment.tcc new file mode 100644 index 000000000..15b2926c8 --- /dev/null +++ b/src/algebra/knowledge_commitment/knowledge_commitment.tcc @@ -0,0 +1,111 @@ +/** @file + ***************************************************************************** + + Implementation of interfaces for: + - a knowledge commitment, and + - a knowledge commitment vector. + + See knowledge_commitment.hpp . + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef KNOWLEDGE_COMMITMENT_TCC_ +#define KNOWLEDGE_COMMITMENT_TCC_ + +namespace libsnark { + +template +knowledge_commitment::knowledge_commitment(const T1 &g, const T2 &h) : + g(g), h(h) +{ +} + +template +knowledge_commitment knowledge_commitment::zero() +{ + return knowledge_commitment(T1::zero(), T2::zero()); +} + +template +knowledge_commitment knowledge_commitment::one() +{ + return knowledge_commitment(T1::one(), T2::one()); +} + +template +knowledge_commitment knowledge_commitment::operator+(const knowledge_commitment &other) const +{ + return knowledge_commitment(this->g + other.g, + this->h + other.h); +} + +template +bool knowledge_commitment::is_zero() const +{ + return (g.is_zero() && h.is_zero()); +} + +template +bool knowledge_commitment::operator==(const knowledge_commitment &other) const +{ + return (this->g == other.g && + this->h == other.h); +} + +template +bool knowledge_commitment::operator!=(const knowledge_commitment &other) const +{ + return !((*this) == other); +} + +template +knowledge_commitment operator*(const bigint &lhs, const knowledge_commitment &rhs) +{ + return knowledge_commitment(lhs * rhs.g, + lhs * rhs.h); +} + +template &modulus_p> +knowledge_commitment operator*(const Fp_model &lhs, const knowledge_commitment &rhs) +{ + return (lhs.as_bigint()) * rhs; +} + +template +void knowledge_commitment::print() const +{ + printf("knowledge_commitment.g:\n"); + g.print(); + printf("knowledge_commitment.h:\n"); + h.print(); +} + +template +size_t knowledge_commitment::size_in_bits() +{ + return T1::size_in_bits() + T2::size_in_bits(); +} + +template +std::ostream& operator<<(std::ostream& out, const knowledge_commitment &kc) +{ + out << kc.g << OUTPUT_SEPARATOR << kc.h; + return out; +} + +template +std::istream& operator>>(std::istream& in, knowledge_commitment &kc) +{ + in >> kc.g; + consume_OUTPUT_SEPARATOR(in); + in >> kc.h; + return in; +} + +} // libsnark + +#endif // KNOWLEDGE_COMMITMENT_TCC_ diff --git a/src/algebra/scalar_multiplication/kc_multiexp.hpp b/src/algebra/scalar_multiplication/kc_multiexp.hpp new file mode 100644 index 000000000..4e8b55667 --- /dev/null +++ b/src/algebra/scalar_multiplication/kc_multiexp.hpp @@ -0,0 +1,55 @@ +/** @file + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef KC_MULTIEXP_HPP_ +#define KC_MULTIEXP_HPP_ + +/* + Split out from multiexp to prevent cyclical + dependencies. I.e. previously multiexp dependend on + knowledge_commitment, which dependend on sparse_vector, which + dependend on multiexp (to do accumulate). + + Will probably go away in more general exp refactoring. +*/ + +#include "algebra/knowledge_commitment/knowledge_commitment.hpp" + +namespace libsnark { + +template +knowledge_commitment opt_window_wnaf_exp(const knowledge_commitment &base, + const bigint &scalar, const size_t scalar_bits); + +template +knowledge_commitment kc_multi_exp_with_mixed_addition(const knowledge_commitment_vector &vec, + const size_t min_idx, + const size_t max_idx, + typename std::vector::const_iterator scalar_start, + typename std::vector::const_iterator scalar_end, + const size_t chunks, + const bool use_multiexp=false); + +template +void kc_batch_to_special(std::vector > &vec); + +template +knowledge_commitment_vector kc_batch_exp(const size_t scalar_size, + const size_t T1_window, + const size_t T2_window, + const window_table &T1_table, + const window_table &T2_table, + const FieldT &T1_coeff, + const FieldT &T2_coeff, + const std::vector &v, + const size_t suggested_num_chunks); + +} // libsnark + +#include "algebra/scalar_multiplication/kc_multiexp.tcc" + +#endif // KC_MULTIEXP_HPP_ diff --git a/src/algebra/scalar_multiplication/kc_multiexp.tcc b/src/algebra/scalar_multiplication/kc_multiexp.tcc new file mode 100644 index 000000000..e9c08d4bc --- /dev/null +++ b/src/algebra/scalar_multiplication/kc_multiexp.tcc @@ -0,0 +1,274 @@ +/** @file + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef KC_MULTIEXP_TCC_ +#define KC_MULTIEXP_TCC_ + +namespace libsnark { + +template +knowledge_commitment opt_window_wnaf_exp(const knowledge_commitment &base, + const bigint &scalar, const size_t scalar_bits) +{ + return knowledge_commitment(opt_window_wnaf_exp(base.g, scalar, scalar_bits), + opt_window_wnaf_exp(base.h, scalar, scalar_bits)); +} + +template +knowledge_commitment kc_multi_exp_with_mixed_addition(const knowledge_commitment_vector &vec, + const size_t min_idx, + const size_t max_idx, + typename std::vector::const_iterator scalar_start, + typename std::vector::const_iterator scalar_end, + const size_t chunks, + const bool use_multiexp) +{ + enter_block("Process scalar vector"); + auto index_it = std::lower_bound(vec.indices.begin(), vec.indices.end(), min_idx); + const size_t offset = index_it - vec.indices.begin(); + + auto value_it = vec.values.begin() + offset; + + const FieldT zero = FieldT::zero(); + const FieldT one = FieldT::one(); + + std::vector p; + std::vector > g; + + knowledge_commitment acc = knowledge_commitment::zero(); + + size_t num_skip = 0; + size_t num_add = 0; + size_t num_other = 0; + + const size_t scalar_length = std::distance(scalar_start, scalar_end); + + while (index_it != vec.indices.end() && *index_it < max_idx) + { + const size_t scalar_position = (*index_it) - min_idx; + assert(scalar_position < scalar_length); + + const FieldT scalar = *(scalar_start + scalar_position); + + if (scalar == zero) + { + // do nothing + ++num_skip; + } + else if (scalar == one) + { +#ifdef USE_MIXED_ADDITION + acc.g = acc.g.mixed_add(value_it->g); + acc.h = acc.h.mixed_add(value_it->h); +#else + acc.g = acc.g + value_it->g; + acc.h = acc.h + value_it->h; +#endif + ++num_add; + } + else + { + p.emplace_back(scalar); + g.emplace_back(*value_it); + ++num_other; + } + + ++index_it; + ++value_it; + } + + //print_indent(); printf("* Elements of w skipped: %zu (%0.2f%%)\n", num_skip, 100.*num_skip/(num_skip+num_add+num_other)); + //print_indent(); printf("* Elements of w processed with special addition: %zu (%0.2f%%)\n", num_add, 100.*num_add/(num_skip+num_add+num_other)); + //print_indent(); printf("* Elements of w remaining: %zu (%0.2f%%)\n", num_other, 100.*num_other/(num_skip+num_add+num_other)); + leave_block("Process scalar vector"); + + return acc + multi_exp, FieldT>(g.begin(), g.end(), p.begin(), p.end(), chunks, use_multiexp); +} + +template +void kc_batch_to_special(std::vector > &vec) +{ + enter_block("Batch-convert knowledge-commitments to special form"); + + std::vector g_vec; + g_vec.reserve(vec.size()); + + for (size_t i = 0; i < vec.size(); ++i) + { + if (!vec[i].g.is_zero()) + { + g_vec.emplace_back(vec[i].g); + } + } + + batch_to_special_all_non_zeros(g_vec); + auto g_it = g_vec.begin(); + T1 T1_zero_special = T1::zero(); + T1_zero_special.to_special(); + + for (size_t i = 0; i < vec.size(); ++i) + { + if (!vec[i].g.is_zero()) + { + vec[i].g = *g_it; + ++g_it; + } + else + { + vec[i].g = T1_zero_special; + } + } + + g_vec.clear(); + + std::vector h_vec; + h_vec.reserve(vec.size()); + + for (size_t i = 0; i < vec.size(); ++i) + { + if (!vec[i].h.is_zero()) + { + h_vec.emplace_back(vec[i].h); + } + } + + batch_to_special_all_non_zeros(h_vec); + auto h_it = h_vec.begin(); + T2 T2_zero_special = T2::zero(); + T2_zero_special.to_special(); + + for (size_t i = 0; i < vec.size(); ++i) + { + if (!vec[i].h.is_zero()) + { + vec[i].h = *h_it; + ++h_it; + } + else + { + vec[i].h = T2_zero_special; + } + } + + g_vec.clear(); + + leave_block("Batch-convert knowledge-commitments to special form"); +} + +template +knowledge_commitment_vector kc_batch_exp_internal(const size_t scalar_size, + const size_t T1_window, + const size_t T2_window, + const window_table &T1_table, + const window_table &T2_table, + const FieldT &T1_coeff, + const FieldT &T2_coeff, + const std::vector &v, + const size_t start_pos, + const size_t end_pos, + const size_t expected_size) +{ + knowledge_commitment_vector res; + + res.values.reserve(expected_size); + res.indices.reserve(expected_size); + + for (size_t pos = start_pos; pos != end_pos; ++pos) + { + if (!v[pos].is_zero()) + { + res.values.emplace_back(knowledge_commitment(windowed_exp(scalar_size, T1_window, T1_table, T1_coeff * v[pos]), + windowed_exp(scalar_size, T2_window, T2_table, T2_coeff * v[pos]))); + res.indices.emplace_back(pos); + } + } + + return res; +} + +template +knowledge_commitment_vector kc_batch_exp(const size_t scalar_size, + const size_t T1_window, + const size_t T2_window, + const window_table &T1_table, + const window_table &T2_table, + const FieldT &T1_coeff, + const FieldT &T2_coeff, + const std::vector &v, + const size_t suggested_num_chunks) +{ + knowledge_commitment_vector res; + res.domain_size_ = v.size(); + + size_t nonzero = 0; + for (size_t i = 0; i < v.size(); ++i) + { + nonzero += (v[i].is_zero() ? 0 : 1); + } + + const size_t num_chunks = std::max((size_t)1, std::min(nonzero, suggested_num_chunks)); + + if (!inhibit_profiling_info) + { + print_indent(); printf("Non-zero coordinate count: %zu/%zu (%0.2f%%)\n", nonzero, v.size(), 100.*nonzero/v.size()); + } + + std::vector > tmp(num_chunks); + std::vector chunk_pos(num_chunks+1); + + const size_t chunk_size = nonzero / num_chunks; + const size_t last_chunk = nonzero - chunk_size * (num_chunks - 1); + + chunk_pos[0] = 0; + + size_t cnt = 0; + size_t chunkno = 1; + + for (size_t i = 0; i < v.size(); ++i) + { + cnt += (v[i].is_zero() ? 0 : 1); + if (cnt == chunk_size && chunkno < num_chunks) + { + chunk_pos[chunkno] = i; + cnt = 0; + ++chunkno; + } + } + + chunk_pos[num_chunks] = v.size(); + +#ifdef MULTICORE +#pragma omp parallel for +#endif + for (size_t i = 0; i < num_chunks; ++i) + { + tmp[i] = kc_batch_exp_internal(scalar_size, T1_window, T2_window, T1_table, T2_table, T1_coeff, T2_coeff, v, + chunk_pos[i], chunk_pos[i+1], i == num_chunks - 1 ? last_chunk : chunk_size); +#ifdef USE_MIXED_ADDITION + kc_batch_to_special(tmp[i].values); +#endif + } + + if (num_chunks == 1) + { + tmp[0].domain_size_ = v.size(); + return tmp[0]; + } + else + { + for (size_t i = 0; i < num_chunks; ++i) + { + res.values.insert(res.values.end(), tmp[i].values.begin(), tmp[i].values.end()); + res.indices.insert(res.indices.end(), tmp[i].indices.begin(), tmp[i].indices.end()); + } + return res; + } +} + +} // libsnark + +#endif // KC_MULTIEXP_TCC_ diff --git a/src/algebra/scalar_multiplication/multiexp.hpp b/src/algebra/scalar_multiplication/multiexp.hpp new file mode 100644 index 000000000..eaf72d61f --- /dev/null +++ b/src/algebra/scalar_multiplication/multiexp.hpp @@ -0,0 +1,110 @@ +/** @file + ***************************************************************************** + + Declaration of interfaces for multi-exponentiation routines. + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef MULTIEXP_HPP_ +#define MULTIEXP_HPP_ + +namespace libsnark { + +/** + * Naive multi-exponentiation individually multiplies each base by the + * corresponding scalar and adds up the results. + */ +template +T naive_exp(typename std::vector::const_iterator vec_start, + typename std::vector::const_iterator vec_end, + typename std::vector::const_iterator scalar_start, + typename std::vector::const_iterator scalar_end); + +template +T naive_plain_exp(typename std::vector::const_iterator vec_start, + typename std::vector::const_iterator vec_end, + typename std::vector::const_iterator scalar_start, + typename std::vector::const_iterator scalar_end); + +/** + * Naive multi-exponentiation uses a variant of the Bos-Coster algorithm [1], + * and implementation suggestions from [2]. + * + * [1] = Bos and Coster, "Addition chain heuristics", CRYPTO '89 + * [2] = Bernstein, Duif, Lange, Schwabe, and Yang, "High-speed high-security signatures", CHES '11 + */ +template +T multi_exp(typename std::vector::const_iterator vec_start, + typename std::vector::const_iterator vec_end, + typename std::vector::const_iterator scalar_start, + typename std::vector::const_iterator scalar_end, + const size_t chunks, + const bool use_multiexp=false); + + +/** + * A variant of multi_exp that takes advantage of the method mixed_add (instead of the operator '+'). + */ +template +T multi_exp_with_mixed_addition(typename std::vector::const_iterator vec_start, + typename std::vector::const_iterator vec_end, + typename std::vector::const_iterator scalar_start, + typename std::vector::const_iterator scalar_end, + const size_t chunks, + const bool use_multiexp); + +/** + * A window table stores window sizes for different instance sizes for fixed-base multi-scalar multiplications. + */ +template +using window_table = std::vector >; + +/** + * Compute window size for the given number of scalars. + */ +template +size_t get_exp_window_size(const size_t num_scalars); + +/** + * Compute table of window sizes. + */ +template +window_table get_window_table(const size_t scalar_size, + const size_t window, + const T &g); + +template +T windowed_exp(const size_t scalar_size, + const size_t window, + const window_table &powers_of_g, + const FieldT &pow); + +template +std::vector batch_exp(const size_t scalar_size, + const size_t window, + const window_table &table, + const std::vector &v); + +template +std::vector batch_exp_with_coeff(const size_t scalar_size, + const size_t window, + const window_table &table, + const FieldT &coeff, + const std::vector &v); + +// defined in every curve +template +void batch_to_special_all_non_zeros(std::vector &vec); + +template +void batch_to_special(std::vector &vec); + +} // libsnark + +#include "algebra/scalar_multiplication/multiexp.tcc" + +#endif // MULTIEXP_HPP_ diff --git a/src/algebra/scalar_multiplication/multiexp.tcc b/src/algebra/scalar_multiplication/multiexp.tcc new file mode 100644 index 000000000..a6b14c4df --- /dev/null +++ b/src/algebra/scalar_multiplication/multiexp.tcc @@ -0,0 +1,590 @@ +/** @file + ***************************************************************************** + + Implementation of interfaces for multi-exponentiation routines. + + See multiexp.hpp . + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef MULTIEXP_TCC_ +#define MULTIEXP_TCC_ + +#include "algebra/fields/fp_aux.tcc" + +#include +#include +#include + +#include "common/profiling.hpp" +#include "common/utils.hpp" +#include "algebra/scalar_multiplication/wnaf.hpp" + +namespace libsnark { + +template +class ordered_exponent { +// to use std::push_heap and friends later +public: + size_t idx; + bigint r; + + ordered_exponent(const size_t idx, const bigint &r) : idx(idx), r(r) {}; + + bool operator<(const ordered_exponent &other) const + { +#if defined(__x86_64__) && defined(USE_ASM) + if (n == 3) + { + long res; + __asm__ + ("// check for overflow \n\t" + "mov $0, %[res] \n\t" + ADD_CMP(16) + ADD_CMP(8) + ADD_CMP(0) + "jmp done%= \n\t" + "subtract%=: \n\t" + "mov $1, %[res] \n\t" + "done%=: \n\t" + : [res] "=&r" (res) + : [A] "r" (other.r.data), [mod] "r" (this->r.data) + : "cc", "%rax"); + return res; + } + else if (n == 4) + { + long res; + __asm__ + ("// check for overflow \n\t" + "mov $0, %[res] \n\t" + ADD_CMP(24) + ADD_CMP(16) + ADD_CMP(8) + ADD_CMP(0) + "jmp done%= \n\t" + "subtract%=: \n\t" + "mov $1, %[res] \n\t" + "done%=: \n\t" + : [res] "=&r" (res) + : [A] "r" (other.r.data), [mod] "r" (this->r.data) + : "cc", "%rax"); + return res; + } + else if (n == 5) + { + long res; + __asm__ + ("// check for overflow \n\t" + "mov $0, %[res] \n\t" + ADD_CMP(32) + ADD_CMP(24) + ADD_CMP(16) + ADD_CMP(8) + ADD_CMP(0) + "jmp done%= \n\t" + "subtract%=: \n\t" + "mov $1, %[res] \n\t" + "done%=: \n\t" + : [res] "=&r" (res) + : [A] "r" (other.r.data), [mod] "r" (this->r.data) + : "cc", "%rax"); + return res; + } + else +#endif + { + return (mpn_cmp(this->r.data, other.r.data, n) < 0); + } + } +}; + +template +T naive_exp(typename std::vector::const_iterator vec_start, + typename std::vector::const_iterator vec_end, + typename std::vector::const_iterator scalar_start, + typename std::vector::const_iterator scalar_end) +{ + T result(T::zero()); + + typename std::vector::const_iterator vec_it; + typename std::vector::const_iterator scalar_it; + + for (vec_it = vec_start, scalar_it = scalar_start; vec_it != vec_end; ++vec_it, ++scalar_it) + { + bigint scalar_bigint = scalar_it->as_bigint(); + result = result + opt_window_wnaf_exp(*vec_it, scalar_bigint, scalar_bigint.num_bits()); + } + assert(scalar_it == scalar_end); + + return result; +} + +template +T naive_plain_exp(typename std::vector::const_iterator vec_start, + typename std::vector::const_iterator vec_end, + typename std::vector::const_iterator scalar_start, + typename std::vector::const_iterator scalar_end) +{ + T result(T::zero()); + + typename std::vector::const_iterator vec_it; + typename std::vector::const_iterator scalar_it; + + for (vec_it = vec_start, scalar_it = scalar_start; vec_it != vec_end; ++vec_it, ++scalar_it) + { + result = result + (*scalar_it) * (*vec_it); + } + assert(scalar_it == scalar_end); + + return result; +} + +/* + The multi-exponentiation algorithm below is a variant of the Bos-Coster algorithm + [Bos and Coster, "Addition chain heuristics", CRYPTO '89]. + The implementation uses suggestions from + [Bernstein, Duif, Lange, Schwabe, and Yang, "High-speed high-security signatures", CHES '11]. +*/ +template +T multi_exp_inner(typename std::vector::const_iterator vec_start, + typename std::vector::const_iterator vec_end, + typename std::vector::const_iterator scalar_start, + typename std::vector::const_iterator scalar_end) +{ + const mp_size_t n = std::remove_reference::type::num_limbs; + + if (vec_start == vec_end) + { + return T::zero(); + } + + if (vec_start + 1 == vec_end) + { + return (*scalar_start)*(*vec_start); + } + + std::vector > opt_q; + const size_t vec_len = scalar_end - scalar_start; + const size_t odd_vec_len = (vec_len % 2 == 1 ? vec_len : vec_len + 1); + opt_q.reserve(odd_vec_len); + std::vector g; + g.reserve(odd_vec_len); + + typename std::vector::const_iterator vec_it; + typename std::vector::const_iterator scalar_it; + size_t i; + for (i=0, vec_it = vec_start, scalar_it = scalar_start; vec_it != vec_end; ++vec_it, ++scalar_it, ++i) + { + g.emplace_back(*vec_it); + + opt_q.emplace_back(ordered_exponent(i, scalar_it->as_bigint())); + } + std::make_heap(opt_q.begin(),opt_q.end()); + assert(scalar_it == scalar_end); + + if (vec_len != odd_vec_len) + { + g.emplace_back(T::zero()); + opt_q.emplace_back(ordered_exponent(odd_vec_len - 1, bigint(0ul))); + } + assert(g.size() % 2 == 1); + assert(opt_q.size() == g.size()); + + T opt_result = T::zero(); + + while (true) + { + ordered_exponent &a = opt_q[0]; + ordered_exponent &b = (opt_q[1] < opt_q[2] ? opt_q[2] : opt_q[1]); + + const size_t abits = a.r.num_bits(); + + if (b.r.is_zero()) + { + // opt_result = opt_result + (a.r * g[a.idx]); + opt_result = opt_result + opt_window_wnaf_exp(g[a.idx], a.r, abits); + break; + } + + const size_t bbits = b.r.num_bits(); + const size_t limit = (abits-bbits >= 20 ? 20 : abits-bbits); + + if (bbits < 1ul< (x-y) A + y (B+A) + mpn_sub_n(a.r.data, a.r.data, b.r.data, n); + g[b.idx] = g[b.idx] + g[a.idx]; + } + + // regardless of whether a was cleared or subtracted from we push it down, then take back up + + /* heapify A down */ + size_t a_pos = 0; + while (2*a_pos + 2< odd_vec_len) + { + // this is a max-heap so to maintain a heap property we swap with the largest of the two + if (opt_q[2*a_pos+1] < opt_q[2*a_pos+2]) + { + std::swap(opt_q[a_pos], opt_q[2*a_pos+2]); + a_pos = 2*a_pos+2; + } + else + { + std::swap(opt_q[a_pos], opt_q[2*a_pos+1]); + a_pos = 2*a_pos+1; + } + } + + /* now heapify A up appropriate amount of times */ + while (a_pos > 0 && opt_q[(a_pos-1)/2] < opt_q[a_pos]) + { + std::swap(opt_q[a_pos], opt_q[(a_pos-1)/2]); + a_pos = (a_pos-1) / 2; + } + } + + return opt_result; +} + +template +T multi_exp(typename std::vector::const_iterator vec_start, + typename std::vector::const_iterator vec_end, + typename std::vector::const_iterator scalar_start, + typename std::vector::const_iterator scalar_end, + const size_t chunks, + const bool use_multiexp) +{ + const size_t total = vec_end - vec_start; + if (total < chunks) + { + return naive_exp(vec_start, vec_end, scalar_start, scalar_end); + } + + const size_t one = total/chunks; + + std::vector partial(chunks, T::zero()); + + if (use_multiexp) + { +#ifdef MULTICORE +#pragma omp parallel for +#endif + for (size_t i = 0; i < chunks; ++i) + { + partial[i] = multi_exp_inner(vec_start + i*one, + (i == chunks-1 ? vec_end : vec_start + (i+1)*one), + scalar_start + i*one, + (i == chunks-1 ? scalar_end : scalar_start + (i+1)*one)); + } + } + else + { +#ifdef MULTICORE +#pragma omp parallel for +#endif + for (size_t i = 0; i < chunks; ++i) + { + partial[i] = naive_exp(vec_start + i*one, + (i == chunks-1 ? vec_end : vec_start + (i+1)*one), + scalar_start + i*one, + (i == chunks-1 ? scalar_end : scalar_start + (i+1)*one)); + } + } + + T final = T::zero(); + + for (size_t i = 0; i < chunks; ++i) + { + final = final + partial[i]; + } + + return final; +} + +template +T multi_exp_with_mixed_addition(typename std::vector::const_iterator vec_start, + typename std::vector::const_iterator vec_end, + typename std::vector::const_iterator scalar_start, + typename std::vector::const_iterator scalar_end, + const size_t chunks, + const bool use_multiexp) +{ + assert(std::distance(vec_start, vec_end) == std::distance(scalar_start, scalar_end)); + enter_block("Process scalar vector"); + auto value_it = vec_start; + auto scalar_it = scalar_start; + + const FieldT zero = FieldT::zero(); + const FieldT one = FieldT::one(); + std::vector p; + std::vector g; + + T acc = T::zero(); + + size_t num_skip = 0; + size_t num_add = 0; + size_t num_other = 0; + + for (; scalar_it != scalar_end; ++scalar_it, ++value_it) + { + if (*scalar_it == zero) + { + // do nothing + ++num_skip; + } + else if (*scalar_it == one) + { +#ifdef USE_MIXED_ADDITION + acc = acc.mixed_add(*value_it); +#else + acc = acc + (*value_it); +#endif + ++num_add; + } + else + { + p.emplace_back(*scalar_it); + g.emplace_back(*value_it); + ++num_other; + } + } + //print_indent(); printf("* Elements of w skipped: %zu (%0.2f%%)\n", num_skip, 100.*num_skip/(num_skip+num_add+num_other)); + //print_indent(); printf("* Elements of w processed with special addition: %zu (%0.2f%%)\n", num_add, 100.*num_add/(num_skip+num_add+num_other)); + //print_indent(); printf("* Elements of w remaining: %zu (%0.2f%%)\n", num_other, 100.*num_other/(num_skip+num_add+num_other)); + + leave_block("Process scalar vector"); + + return acc + multi_exp(g.begin(), g.end(), p.begin(), p.end(), chunks, use_multiexp); +} + +template +size_t get_exp_window_size(const size_t num_scalars) +{ + if (T::fixed_base_exp_window_table.empty()) + { +#ifdef LOWMEM + return 14; +#else + return 17; +#endif + } + size_t window = 1; + for (long i = T::fixed_base_exp_window_table.size()-1; i >= 0; --i) + { +#ifdef DEBUG + if (!inhibit_profiling_info) + { + printf("%ld %zu %zu\n", i, num_scalars, T::fixed_base_exp_window_table[i]); + } +#endif + if (T::fixed_base_exp_window_table[i] != 0 && num_scalars >= T::fixed_base_exp_window_table[i]) + { + window = i+1; + break; + } + } + + if (!inhibit_profiling_info) + { + print_indent(); printf("Choosing window size %zu for %zu elements\n", window, num_scalars); + } + +#ifdef LOWMEM + window = std::min((size_t)14, window); +#endif + return window; +} + +template +window_table get_window_table(const size_t scalar_size, + const size_t window, + const T &g) +{ + const size_t in_window = 1ul< powers_of_g(outerc, std::vector(in_window, T::zero())); + + T gouter = g; + + for (size_t outer = 0; outer < outerc; ++outer) + { + T ginner = T::zero(); + size_t cur_in_window = outer == outerc-1 ? last_in_window : in_window; + for (size_t inner = 0; inner < cur_in_window; ++inner) + { + powers_of_g[outer][inner] = ginner; + ginner = ginner + gouter; + } + + for (size_t i = 0; i < window; ++i) + { + gouter = gouter + gouter; + } + } + + return powers_of_g; +} + +template +T windowed_exp(const size_t scalar_size, + const size_t window, + const window_table &powers_of_g, + const FieldT &pow) +{ + const size_t outerc = (scalar_size+window-1)/window; + const bigint pow_val = pow.as_bigint(); + + /* exp */ + T res = powers_of_g[0][0]; + + for (size_t outer = 0; outer < outerc; ++outer) + { + size_t inner = 0; + for (size_t i = 0; i < window; ++i) + { + if (pow_val.test_bit(outer*window + i)) + { + inner |= 1u << i; + } + } + + res = res + powers_of_g[outer][inner]; + } + + return res; +} + +template +std::vector batch_exp(const size_t scalar_size, + const size_t window, + const window_table &table, + const std::vector &v) +{ + if (!inhibit_profiling_info) + { + print_indent(); + } + std::vector res(v.size(), table[0][0]); + +#ifdef MULTICORE +#pragma omp parallel for +#endif + for (size_t i = 0; i < v.size(); ++i) + { + res[i] = windowed_exp(scalar_size, window, table, v[i]); + + if (!inhibit_profiling_info && (i % 10000 == 0)) + { + printf("."); + fflush(stdout); + } + } + + if (!inhibit_profiling_info) + { + printf(" DONE!\n"); + } + + return res; +} + +template +std::vector batch_exp_with_coeff(const size_t scalar_size, + const size_t window, + const window_table &table, + const FieldT &coeff, + const std::vector &v) +{ + if (!inhibit_profiling_info) + { + print_indent(); + } + std::vector res(v.size(), table[0][0]); + +#ifdef MULTICORE +#pragma omp parallel for +#endif + for (size_t i = 0; i < v.size(); ++i) + { + res[i] = windowed_exp(scalar_size, window, table, coeff * v[i]); + + if (!inhibit_profiling_info && (i % 10000 == 0)) + { + printf("."); + fflush(stdout); + } + } + + if (!inhibit_profiling_info) + { + printf(" DONE!\n"); + } + + return res; +} + +template +void batch_to_special(std::vector &vec) +{ + enter_block("Batch-convert elements to special form"); + + std::vector non_zero_vec; + for (size_t i = 0; i < vec.size(); ++i) + { + if (!vec[i].is_zero()) + { + non_zero_vec.emplace_back(vec[i]); + } + } + + batch_to_special_all_non_zeros(non_zero_vec); + auto it = non_zero_vec.begin(); + T zero_special = T::zero(); + zero_special.to_special(); + + for (size_t i = 0; i < vec.size(); ++i) + { + if (!vec[i].is_zero()) + { + vec[i] = *it; + ++it; + } + else + { + vec[i] = zero_special; + } + } + leave_block("Batch-convert elements to special form"); +} + +} // libsnark + +#endif // MULTIEXP_TCC_ diff --git a/src/algebra/scalar_multiplication/wnaf.hpp b/src/algebra/scalar_multiplication/wnaf.hpp new file mode 100644 index 000000000..a7ecd598e --- /dev/null +++ b/src/algebra/scalar_multiplication/wnaf.hpp @@ -0,0 +1,39 @@ +/** @file + ***************************************************************************** + + Declaration of interfaces for wNAF ("width-w Non-Adjacent Form") exponentiation routines. + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef WNAF_HPP_ +#define WNAF_HPP_ + +namespace libsnark { + +/** + * Find the wNAF representation of the given scalar relative to the given window size. + */ +template +std::vector find_wnaf(const size_t window_size, const bigint &scalar); + +/** + * In additive notation, use wNAF exponentiation (with the given window size) to compute scalar * base. + */ +template +T fixed_window_wnaf_exp(const size_t window_size, const T &base, const bigint &scalar); + +/** + * In additive notation, use wNAF exponentiation (with the window size determined by T) to compute scalar * base. + */ +template +T opt_window_wnaf_exp(const T &base, const bigint &scalar, const size_t scalar_bits); + +} // libsnark + +#include "algebra/scalar_multiplication/wnaf.tcc" + +#endif // WNAF_HPP_ diff --git a/src/algebra/scalar_multiplication/wnaf.tcc b/src/algebra/scalar_multiplication/wnaf.tcc new file mode 100644 index 000000000..a5e47e8e2 --- /dev/null +++ b/src/algebra/scalar_multiplication/wnaf.tcc @@ -0,0 +1,123 @@ +/** @file + ***************************************************************************** + + Implementation of interfaces for wNAF ("weighted Non-Adjacent Form") exponentiation routines. + + See wnaf.hpp . + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef WNAF_TCC_ +#define WNAF_TCC_ + +namespace libsnark { + +template +std::vector find_wnaf(const size_t window_size, const bigint &scalar) +{ + const size_t length = scalar.max_bits(); // upper bound + std::vector res(length+1); + bigint c = scalar; + long j = 0; + while (!c.is_zero()) + { + long u; + if ((c.data[0] & 1) == 1) + { + u = c.data[0] % (1u << (window_size+1)); + if (u > (1 << window_size)) + { + u = u - (1 << (window_size+1)); + } + + if (u > 0) + { + mpn_sub_1(c.data, c.data, n, u); + } + else + { + mpn_add_1(c.data, c.data, n, -u); + } + } + else + { + u = 0; + } + res[j] = u; + ++j; + + mpn_rshift(c.data, c.data, n, 1); // c = c/2 + } + + return res; +} + +template +T fixed_window_wnaf_exp(const size_t window_size, const T &base, const bigint &scalar) +{ + std::vector naf = find_wnaf(window_size, scalar); + std::vector table(1ul<<(window_size-1)); + T tmp = base; + T dbl = base.dbl(); + for (size_t i = 0; i < 1ul<<(window_size-1); ++i) + { + table[i] = tmp; + tmp = tmp + dbl; + } + + T res = T::zero(); + bool found_nonzero = false; + for (long i = naf.size()-1; i >= 0; --i) + { + if (found_nonzero) + { + res = res.dbl(); + } + + if (naf[i] != 0) + { + found_nonzero = true; + if (naf[i] > 0) + { + res = res + table[naf[i]/2]; + } + else + { + res = res - table[(-naf[i])/2]; + } + } + } + + return res; +} + +template +T opt_window_wnaf_exp(const T &base, const bigint &scalar, const size_t scalar_bits) +{ + size_t best = 0; + for (long i = T::wnaf_window_table.size() - 1; i >= 0; --i) + { + if (scalar_bits >= T::wnaf_window_table[i]) + { + best = i+1; + break; + } + } + + if (best > 0) + { + return fixed_window_wnaf_exp(best, base, scalar); + } + else + { + return scalar * base; + } +} + +} // libsnark + +#endif // WNAF_TCC_ diff --git a/src/common/assert_except.hpp b/src/common/assert_except.hpp new file mode 100644 index 000000000..781923044 --- /dev/null +++ b/src/common/assert_except.hpp @@ -0,0 +1,12 @@ +#ifndef ASSERT_except_H +#define ASSERT_except_H + +#include + +inline void assert_except(bool condition) { + if (!condition) { + throw std::runtime_error("Assertion failed."); + } +} + +#endif diff --git a/src/common/data_structures/accumulation_vector.hpp b/src/common/data_structures/accumulation_vector.hpp new file mode 100644 index 000000000..37e0c9841 --- /dev/null +++ b/src/common/data_structures/accumulation_vector.hpp @@ -0,0 +1,74 @@ +/** @file + ***************************************************************************** + + Declaration of interfaces for an accumulation vector. + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef ACCUMULATION_VECTOR_HPP_ +#define ACCUMULATION_VECTOR_HPP_ + +#include "common/data_structures/sparse_vector.hpp" + +namespace libsnark { + +template +class accumulation_vector; + +template +std::ostream& operator<<(std::ostream &out, const accumulation_vector &v); + +template +std::istream& operator>>(std::istream &in, accumulation_vector &v); + +/** + * An accumulation vector comprises an accumulation value and a sparse vector. + * The method "accumulate_chunk" allows one to accumlate portions of the sparse + * vector into the accumualation value. + */ +template +class accumulation_vector { +public: + T first; + sparse_vector rest; + + accumulation_vector() = default; + accumulation_vector(const accumulation_vector &other) = default; + accumulation_vector(accumulation_vector &&other) = default; + accumulation_vector(T &&first, sparse_vector &&rest) : first(std::move(first)), rest(std::move(rest)) {}; + accumulation_vector(T &&first, std::vector &&v) : first(std::move(first)), rest(std::move(v)) {} + accumulation_vector(std::vector &&v) : first(T::zero()), rest(std::move(v)) {}; + + accumulation_vector& operator=(const accumulation_vector &other) = default; + accumulation_vector& operator=(accumulation_vector &&other) = default; + + bool operator==(const accumulation_vector &other) const; + + bool is_fully_accumulated() const; + + size_t domain_size() const; + size_t size() const; + size_t size_in_bits() const; + + template + accumulation_vector accumulate_chunk(const typename std::vector::const_iterator &it_begin, + const typename std::vector::const_iterator &it_end, + const size_t offset) const; + +}; + +template +std::ostream& operator<<(std::ostream &out, const accumulation_vector &v); + +template +std::istream& operator>>(std::istream &in, accumulation_vector &v); + +} // libsnark + +#include "common/data_structures/accumulation_vector.tcc" + +#endif // ACCUMULATION_VECTOR_HPP_ diff --git a/src/common/data_structures/accumulation_vector.tcc b/src/common/data_structures/accumulation_vector.tcc new file mode 100644 index 000000000..9e524aba7 --- /dev/null +++ b/src/common/data_structures/accumulation_vector.tcc @@ -0,0 +1,84 @@ +/** @file + ***************************************************************************** + + Implementation of interfaces for an accumulation vector. + + See accumulation_vector.hpp . + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef ACCUMULATION_VECTOR_TCC_ +#define ACCUMULATION_VECTOR_TCC_ + +namespace libsnark { + +template +bool accumulation_vector::operator==(const accumulation_vector &other) const +{ + return (this->first == other.first && this->rest == other.rest); +} + +template +bool accumulation_vector::is_fully_accumulated() const +{ + return rest.empty(); +} + +template +size_t accumulation_vector::domain_size() const +{ + return rest.domain_size(); +} + +template +size_t accumulation_vector::size() const +{ + return rest.domain_size(); +} + +template +size_t accumulation_vector::size_in_bits() const +{ + const size_t first_size_in_bits = T::size_in_bits(); + const size_t rest_size_in_bits = rest.size_in_bits(); + return first_size_in_bits + rest_size_in_bits; +} + +template +template +accumulation_vector accumulation_vector::accumulate_chunk(const typename std::vector::const_iterator &it_begin, + const typename std::vector::const_iterator &it_end, + const size_t offset) const +{ + std::pair > acc_result = rest.template accumulate(it_begin, it_end, offset); + T new_first = first + acc_result.first; + return accumulation_vector(std::move(new_first), std::move(acc_result.second)); +} + +template +std::ostream& operator<<(std::ostream& out, const accumulation_vector &v) +{ + out << v.first << OUTPUT_NEWLINE; + out << v.rest << OUTPUT_NEWLINE; + + return out; +} + +template +std::istream& operator>>(std::istream& in, accumulation_vector &v) +{ + in >> v.first; + consume_OUTPUT_NEWLINE(in); + in >> v.rest; + consume_OUTPUT_NEWLINE(in); + + return in; +} + +} // libsnark + +#endif // ACCUMULATION_VECTOR_TCC_ diff --git a/src/common/data_structures/merkle_tree.hpp b/src/common/data_structures/merkle_tree.hpp new file mode 100644 index 000000000..6f0c851ba --- /dev/null +++ b/src/common/data_structures/merkle_tree.hpp @@ -0,0 +1,71 @@ +/** @file + ***************************************************************************** + + Declaration of interfaces for a Merkle tree. + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef MERKLE_TREE_HPP_ +#define MERKLE_TREE_HPP_ + +#include +#include +#include "common/utils.hpp" + +namespace libsnark { + +/** + * A Merkle tree is maintained as two maps: + * - a map from addresses to values, and + * - a map from addresses to hashes. + * + * The second map maintains the intermediate hashes of a Merkle tree + * built atop the values currently stored in the tree (the + * implementation admits a very efficient support for sparse + * trees). Besides offering methods to load and store values, the + * class offers methods to retrieve the root of the Merkle tree and to + * obtain the authentication paths for (the value at) a given address. + */ + +typedef bit_vector merkle_authentication_node; +typedef std::vector merkle_authentication_path; + +template +class merkle_tree { +private: + + typedef typename HashT::hash_value_type hash_value_type; + typedef typename HashT::merkle_authentication_path_type merkle_authentication_path_type; + +public: + + std::vector hash_defaults; + std::map values; + std::map hashes; + + size_t depth; + size_t value_size; + size_t digest_size; + + merkle_tree(const size_t depth, const size_t value_size); + merkle_tree(const size_t depth, const size_t value_size, const std::vector &contents_as_vector); + merkle_tree(const size_t depth, const size_t value_size, const std::map &contents); + + bit_vector get_value(const size_t address) const; + void set_value(const size_t address, const bit_vector &value); + + hash_value_type get_root() const; + merkle_authentication_path_type get_path(const size_t address) const; + + void dump() const; +}; + +} // libsnark + +#include "common/data_structures/merkle_tree.tcc" + +#endif // MERKLE_TREE_HPP_ diff --git a/src/common/data_structures/merkle_tree.tcc b/src/common/data_structures/merkle_tree.tcc new file mode 100644 index 000000000..281700b33 --- /dev/null +++ b/src/common/data_structures/merkle_tree.tcc @@ -0,0 +1,246 @@ +/** @file + ***************************************************************************** + + Implementation of interfaces for Merkle tree. + + See merkle_tree.hpp . + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef MERKLE_TREE_TCC +#define MERKLE_TREE_TCC + +#include + +#include "common/profiling.hpp" +#include "common/utils.hpp" + +namespace libsnark { + +template +typename HashT::hash_value_type two_to_one_CRH(const typename HashT::hash_value_type &l, + const typename HashT::hash_value_type &r) +{ + typename HashT::hash_value_type new_input; + new_input.insert(new_input.end(), l.begin(), l.end()); + new_input.insert(new_input.end(), r.begin(), r.end()); + + const size_t digest_size = HashT::get_digest_len(); + assert(l.size() == digest_size); + assert(r.size() == digest_size); + + return HashT::get_hash(new_input); +} + +template +merkle_tree::merkle_tree(const size_t depth, const size_t value_size) : + depth(depth), value_size(value_size) +{ + assert(depth < sizeof(size_t) * 8); + + digest_size = HashT::get_digest_len(); + assert(value_size <= digest_size); + + hash_value_type last(digest_size); + hash_defaults.reserve(depth+1); + hash_defaults.emplace_back(last); + for (size_t i = 0; i < depth; ++i) + { + last = two_to_one_CRH(last, last); + hash_defaults.emplace_back(last); + } + + std::reverse(hash_defaults.begin(), hash_defaults.end()); +} + +template +merkle_tree::merkle_tree(const size_t depth, + const size_t value_size, + const std::vector &contents_as_vector) : + merkle_tree(depth, value_size) +{ + assert(log2(contents_as_vector.size()) <= depth); + for (size_t address = 0; address < contents_as_vector.size(); ++address) + { + const size_t idx = address + (1ul< 0; --layer) + { + for (size_t idx = idx_begin; idx < idx_end; idx += 2) + { + hash_value_type l = hashes[idx]; // this is sound, because idx_begin is always a left child + hash_value_type r = (idx + 1 < idx_end ? hashes[idx+1] : hash_defaults[layer]); + + hash_value_type h = two_to_one_CRH(l, r); + hashes[(idx-1)/2] = h; + } + + idx_begin = (idx_begin-1)/2; + idx_end = (idx_end-1)/2; + } +} + +template +merkle_tree::merkle_tree(const size_t depth, + const size_t value_size, + const std::map &contents) : + merkle_tree(depth, value_size) +{ + + if (!contents.empty()) + { + assert(contents.rbegin()->first < 1ul<first; + const bit_vector value = it->second; + const size_t idx = address + (1ul< 0; --layer) + { + auto next_last_it = hashes.begin(); + + for (auto it = hashes.begin(); it != last_it; ++it) + { + const size_t idx = it->first; + const hash_value_type hash = it->second; + + if (idx % 2 == 0) + { + // this is the right child of its parent and by invariant we are missing the left child + hashes[(idx-1)/2] = two_to_one_CRH(hash_defaults[layer], hash); + } + else + { + if (std::next(it) == last_it || std::next(it)->first != idx + 1) + { + // this is the left child of its parent and is missing its right child + hashes[(idx-1)/2] = two_to_one_CRH(hash, hash_defaults[layer]); + } + else + { + // typical case: this is the left child of the parent and adjecent to it there is a right child + hashes[(idx-1)/2] = two_to_one_CRH(hash, std::next(it)->second); + ++it; + } + } + } + + last_it = next_last_it; + } + } +} + +template +bit_vector merkle_tree::get_value(const size_t address) const +{ + assert(log2(address) <= depth); + + auto it = values.find(address); + bit_vector padded_result = (it == values.end() ? bit_vector(digest_size) : it->second); + padded_result.resize(value_size); + + return padded_result; +} + +template +void merkle_tree::set_value(const size_t address, + const bit_vector &value) +{ + assert(log2(address) <= depth); + size_t idx = address + (1ul<=0; --layer) + { + idx = (idx-1)/2; + + auto it = hashes.find(2*idx+1); + hash_value_type l = (it == hashes.end() ? hash_defaults[layer+1] : it->second); + + it = hashes.find(2*idx+2); + hash_value_type r = (it == hashes.end() ? hash_defaults[layer+1] : it->second); + + hash_value_type h = two_to_one_CRH(l, r); + hashes[idx] = h; + } +} + +template +typename HashT::hash_value_type merkle_tree::get_root() const +{ + auto it = hashes.find(0); + return (it == hashes.end() ? hash_defaults[0] : it->second); +} + +template +typename HashT::merkle_authentication_path_type merkle_tree::get_path(const size_t address) const +{ + typename HashT::merkle_authentication_path_type result(depth); + assert(log2(address) <= depth); + size_t idx = address + (1ul< 0; --layer) + { + size_t sibling_idx = ((idx + 1) ^ 1) - 1; + auto it = hashes.find(sibling_idx); + if (layer == depth) + { + auto it2 = values.find(sibling_idx - ((1ul<second); + result[layer-1].resize(digest_size); + } + else + { + result[layer-1] = (it == hashes.end() ? hash_defaults[layer] : it->second); + } + + idx = (idx-1)/2; + } + + return result; +} + +template +void merkle_tree::dump() const +{ + for (size_t i = 0; i < 1ul< ", i); + const bit_vector value = (it == values.end() ? bit_vector(value_size) : it->second); + for (bool b : value) + { + printf("%d", b ? 1 : 0); + } + printf("\n"); + } + printf("\n"); +} + +} // libsnark + +#endif // MERKLE_TREE_TCC diff --git a/src/common/data_structures/sparse_vector.hpp b/src/common/data_structures/sparse_vector.hpp new file mode 100644 index 000000000..8b134f42e --- /dev/null +++ b/src/common/data_structures/sparse_vector.hpp @@ -0,0 +1,79 @@ +/** @file + ***************************************************************************** + + Declaration of interfaces for a sparse vector. + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef SPARSE_VECTOR_HPP_ +#define SPARSE_VECTOR_HPP_ + +#include + +namespace libsnark { + +template +struct sparse_vector; + +template +std::ostream& operator<<(std::ostream &out, const sparse_vector &v); + +template +std::istream& operator>>(std::istream &in, sparse_vector &v); + +/** + * A sparse vector is a list of indices along with corresponding values. + * The indices are selected from the set {0,1,...,domain_size-1}. + */ +template +struct sparse_vector { + + std::vector indices; + std::vector values; + size_t domain_size_ = 0; + + sparse_vector() = default; + sparse_vector(const sparse_vector &other) = default; + sparse_vector(sparse_vector &&other) = default; + sparse_vector(std::vector &&v); /* constructor from std::vector */ + + sparse_vector& operator=(const sparse_vector &other) = default; + sparse_vector& operator=(sparse_vector &&other) = default; + + T operator[](const size_t idx) const; + + bool operator==(const sparse_vector &other) const; + bool operator==(const std::vector &other) const; + + bool is_valid() const; + bool empty() const; + + size_t domain_size() const; // return domain_size_ + size_t size() const; // return the number of indices (representing the number of non-zero entries) + size_t size_in_bits() const; // return the number bits needed to store the sparse vector + + /* return a pair consisting of the accumulated value and the sparse vector of non-accumuated values */ + template + std::pair > accumulate(const typename std::vector::const_iterator &it_begin, + const typename std::vector::const_iterator &it_end, + const size_t offset) const; + + friend std::ostream& operator<< (std::ostream &out, const sparse_vector &v); + friend std::istream& operator>> (std::istream &in, sparse_vector &v); +}; + +template +std::ostream& operator<<(std::ostream& out, const sparse_vector &v); + +template +std::istream& operator>>(std::istream& in, sparse_vector &v); + +} // libsnark + +#include "common/data_structures/sparse_vector.tcc" + +#endif // SPARSE_VECTOR_HPP_ diff --git a/src/common/data_structures/sparse_vector.tcc b/src/common/data_structures/sparse_vector.tcc new file mode 100644 index 000000000..cfc5d7559 --- /dev/null +++ b/src/common/data_structures/sparse_vector.tcc @@ -0,0 +1,316 @@ +/** @file + ***************************************************************************** + + Implementation of interfaces for a sparse vector. + + See sparse_vector.hpp . + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef SPARSE_VECTOR_TCC_ +#define SPARSE_VECTOR_TCC_ + +#include "algebra/scalar_multiplication/multiexp.hpp" + +#include + +namespace libsnark { + +template +sparse_vector::sparse_vector(std::vector &&v) : + values(std::move(v)), domain_size_(values.size()) +{ + indices.resize(domain_size_); + std::iota(indices.begin(), indices.end(), 0); +} + +template +T sparse_vector::operator[](const size_t idx) const +{ + auto it = std::lower_bound(indices.begin(), indices.end(), idx); + return (it != indices.end() && *it == idx) ? values[it - indices.begin()] : T(); +} + +template +bool sparse_vector::operator==(const sparse_vector &other) const +{ + if (this->domain_size_ != other.domain_size_) + { + return false; + } + + size_t this_pos = 0, other_pos = 0; + while (this_pos < this->indices.size() && other_pos < other.indices.size()) + { + if (this->indices[this_pos] == other.indices[other_pos]) + { + if (this->values[this_pos] != other.values[other_pos]) + { + return false; + } + ++this_pos; + ++other_pos; + } + else if (this->indices[this_pos] < other.indices[other_pos]) + { + if (!this->values[this_pos].is_zero()) + { + return false; + } + ++this_pos; + } + else + { + if (!other.values[other_pos].is_zero()) + { + return false; + } + ++other_pos; + } + } + + /* at least one of the vectors has been exhausted, so other must be empty */ + while (this_pos < this->indices.size()) + { + if (!this->values[this_pos].is_zero()) + { + return false; + } + ++this_pos; + } + + while (other_pos < other.indices.size()) + { + if (!other.values[other_pos].is_zero()) + { + return false; + } + ++other_pos; + } + + return true; +} + +template +bool sparse_vector::operator==(const std::vector &other) const +{ + if (this->domain_size_ < other.size()) + { + return false; + } + + size_t j = 0; + for (size_t i = 0; i < other.size(); ++i) + { + if (this->indices[j] == i) + { + if (this->values[j] != other[j]) + { + return false; + } + ++j; + } + else + { + if (!other[j].is_zero()) + { + return false; + } + } + } + + return true; +} + +template +bool sparse_vector::is_valid() const +{ + if (values.size() == indices.size() && values.size() <= domain_size_) + { + return false; + } + + for (size_t i = 0; i + 1 < indices.size(); ++i) + { + if (indices[i] >= indices[i+1]) + { + return false; + } + } + + if (!indices.empty() && indices[indices.size()-1] >= domain_size_) + { + return false; + } + + return true; +} + +template +bool sparse_vector::empty() const +{ + return indices.empty(); +} + +template +size_t sparse_vector::domain_size() const +{ + return domain_size_; +} + +template +size_t sparse_vector::size() const +{ + return indices.size(); +} + +template +size_t sparse_vector::size_in_bits() const +{ + return indices.size() * (sizeof(size_t) * 8 + T::size_in_bits()); +} + +template +template +std::pair > sparse_vector::accumulate(const typename std::vector::const_iterator &it_begin, + const typename std::vector::const_iterator &it_end, + const size_t offset) const +{ + // TODO: does not really belong here. + const size_t chunks = 1; + const bool use_multiexp = true; + + T accumulated_value = T::zero(); + sparse_vector resulting_vector; + resulting_vector.domain_size_ = domain_size_; + + const size_t range_len = it_end - it_begin; + bool in_block = false; + size_t first_pos = -1, last_pos = -1; // g++ -flto emits unitialized warning, even though in_block guards for such cases. + + for (size_t i = 0; i < indices.size(); ++i) + { + const bool matching_pos = (offset <= indices[i] && indices[i] < offset + range_len); + // printf("i = %zu, pos[i] = %zu, offset = %zu, w_size = %zu\n", i, indices[i], offset, w_size); + bool copy_over; + + if (in_block) + { + if (matching_pos && last_pos == i-1) + { + // block can be extended, do it + last_pos = i; + copy_over = false; + } + else + { + // block has ended here + in_block = false; + copy_over = true; + +#ifdef DEBUG + print_indent(); printf("doing multiexp for w_%zu ... w_%zu\n", indices[first_pos], indices[last_pos]); +#endif + accumulated_value = accumulated_value + multi_exp(values.begin() + first_pos, + values.begin() + last_pos + 1, + it_begin + (indices[first_pos] - offset), + it_begin + (indices[last_pos] - offset) + 1, + chunks, use_multiexp); + } + } + else + { + if (matching_pos) + { + // block can be started + first_pos = i; + last_pos = i; + in_block = true; + copy_over = false; + } + else + { + copy_over = true; + } + } + + if (copy_over) + { + resulting_vector.indices.emplace_back(indices[i]); + resulting_vector.values.emplace_back(values[i]); + } + } + + if (in_block) + { +#ifdef DEBUG + print_indent(); printf("doing multiexp for w_%zu ... w_%zu\n", indices[first_pos], indices[last_pos]); +#endif + accumulated_value = accumulated_value + multi_exp(values.begin() + first_pos, + values.begin() + last_pos + 1, + it_begin + (indices[first_pos] - offset), + it_begin + (indices[last_pos] - offset) + 1, + chunks, use_multiexp); + } + + return std::make_pair(accumulated_value, resulting_vector); +} + +template +std::ostream& operator<<(std::ostream& out, const sparse_vector &v) +{ + out << v.domain_size_ << "\n"; + out << v.indices.size() << "\n"; + for (const size_t& i : v.indices) + { + out << i << "\n"; + } + + out << v.values.size() << "\n"; + for (const T& t : v.values) + { + out << t << OUTPUT_NEWLINE; + } + + return out; +} + +template +std::istream& operator>>(std::istream& in, sparse_vector &v) +{ + in >> v.domain_size_; + consume_newline(in); + + size_t s; + in >> s; + consume_newline(in); + v.indices.resize(s); + for (size_t i = 0; i < s; ++i) + { + in >> v.indices[i]; + consume_newline(in); + } + + v.values.clear(); + in >> s; + consume_newline(in); + v.values.reserve(s); + + for (size_t i = 0; i < s; ++i) + { + T t; + in >> t; + consume_OUTPUT_NEWLINE(in); + v.values.emplace_back(t); + } + + return in; +} + +} // libsnark + +#endif // SPARSE_VECTOR_TCC_ diff --git a/src/common/default_types/ec_pp.hpp b/src/common/default_types/ec_pp.hpp new file mode 100644 index 000000000..b08c2da88 --- /dev/null +++ b/src/common/default_types/ec_pp.hpp @@ -0,0 +1,53 @@ +/** @file + ***************************************************************************** + + This file defines default_ec_pp based on the CURVE=... make flag, which selects + which elliptic curve is used to implement group arithmetic and pairings. + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef EC_PP_HPP_ +#define EC_PP_HPP_ + +/************************ Pick the elliptic curve ****************************/ + +#ifdef CURVE_ALT_BN128 +#include "algebra/curves/alt_bn128/alt_bn128_pp.hpp" +namespace libsnark { +typedef alt_bn128_pp default_ec_pp; +} // libsnark +#endif + +#ifdef CURVE_BN128 +#include "algebra/curves/bn128/bn128_pp.hpp" +namespace libsnark { +typedef bn128_pp default_ec_pp; +} // libsnark +#endif + +#ifdef CURVE_EDWARDS +#include "algebra/curves/edwards/edwards_pp.hpp" +namespace libsnark { +typedef edwards_pp default_ec_pp; +} // libsnark +#endif + +#ifdef CURVE_MNT4 +#include "algebra/curves/mnt/mnt4/mnt4_pp.hpp" +namespace libsnark { +typedef mnt4_pp default_ec_pp; +} // libsnark +#endif + +#ifdef CURVE_MNT6 +#include "algebra/curves/mnt/mnt6/mnt6_pp.hpp" +namespace libsnark { +typedef mnt6_pp default_ec_pp; +} // libsnark +#endif + +#endif // EC_PP_HPP_ diff --git a/src/common/default_types/r1cs_ppzksnark_pp.hpp b/src/common/default_types/r1cs_ppzksnark_pp.hpp new file mode 100644 index 000000000..c819b4a85 --- /dev/null +++ b/src/common/default_types/r1cs_ppzksnark_pp.hpp @@ -0,0 +1,22 @@ +/** @file + ***************************************************************************** + + This file defines default_r1cs_ppzksnark_pp based on the elliptic curve + choice selected in ec_pp.hpp. + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef R1CS_PPZKSNARK_PP_HPP_ +#define R1CS_PPZKSNARK_PP_HPP_ + +#include "common/default_types/ec_pp.hpp" + +namespace libsnark { +typedef default_ec_pp default_r1cs_ppzksnark_pp; +} // libsnark + +#endif // R1CS_PPZKSNARK_PP_HPP_ diff --git a/src/common/profiling.cpp b/src/common/profiling.cpp new file mode 100644 index 000000000..d227203a0 --- /dev/null +++ b/src/common/profiling.cpp @@ -0,0 +1,379 @@ +/** @file + ***************************************************************************** + + Implementation of functions for profiling code blocks. + + See profiling.hpp . + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#include "common/profiling.hpp" +#include +#include +#include +#include +#include +#include +#include +#include "common/default_types/ec_pp.hpp" +#include "common/utils.hpp" + +#ifndef NO_PROCPS +#include +#endif + +namespace libsnark { + +long long get_nsec_time() +{ + auto timepoint = std::chrono::high_resolution_clock::now(); + return std::chrono::duration_cast(timepoint.time_since_epoch()).count(); +} + +/* Return total CPU time consumsed by all threads of the process, in nanoseconds. */ +long long get_nsec_cpu_time() +{ + ::timespec ts; + if ( ::clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts) ) + throw ::std::runtime_error("clock_gettime(CLOCK_PROCESS_CPUTIME_ID) failed"); + // If we expected this to work, don't silently ignore failures, because that would hide the problem and incur an unnecessarily system-call overhead. So if we ever observe this exception, we should probably add a suitable #ifdef . + //TODO: clock_gettime(CLOCK_PROCESS_CPUTIME_ID) is not supported by native Windows. What about Cygwin? Should we #ifdef on CLOCK_PROCESS_CPUTIME_ID or on __linux__? + return ts.tv_sec * 1000000000ll + ts.tv_nsec; +} + +long long start_time, last_time; +long long start_cpu_time, last_cpu_time; + +void start_profiling() +{ + printf("Reset time counters for profiling\n"); + + last_time = start_time = get_nsec_time(); + last_cpu_time = start_cpu_time = get_nsec_cpu_time(); +} + +std::map invocation_counts; +std::map enter_times; +std::map last_times; +std::map cumulative_times; +//TODO: Instead of analogous maps for time and cpu_time, use a single struct-valued map +std::map enter_cpu_times; +std::map last_cpu_times; +std::map, long long> op_counts; +std::map, long long> cumulative_op_counts; // ((msg, data_point), value) + // TODO: Convert op_counts and cumulative_op_counts from pair to structs +size_t indentation = 0; + +std::vector block_names; + +std::list > op_data_points = { +#ifdef PROFILE_OP_COUNTS + std::make_pair("Fradd", &Fr::add_cnt), + std::make_pair("Frsub", &Fr::sub_cnt), + std::make_pair("Frmul", &Fr::mul_cnt), + std::make_pair("Frinv", &Fr::inv_cnt), + std::make_pair("Fqadd", &Fq::add_cnt), + std::make_pair("Fqsub", &Fq::sub_cnt), + std::make_pair("Fqmul", &Fq::mul_cnt), + std::make_pair("Fqinv", &Fq::inv_cnt), + std::make_pair("G1add", &G1::add_cnt), + std::make_pair("G1dbl", &G1::dbl_cnt), + std::make_pair("G2add", &G2::add_cnt), + std::make_pair("G2dbl", &G2::dbl_cnt) +#endif +}; + +bool inhibit_profiling_info = false; +bool inhibit_profiling_counters = false; + +void clear_profiling_counters() +{ + invocation_counts.clear(); + last_times.clear(); + last_cpu_times.clear(); + cumulative_times.clear(); +} + +void print_cumulative_time_entry(const std::string &key, const long long factor) +{ + const double total_ms = (cumulative_times.at(key) * 1e-6); + const size_t cnt = invocation_counts.at(key); + const double avg_ms = total_ms / cnt; + printf(" %-45s: %12.5fms = %lld * %0.5fms (%zu invocations, %0.5fms = %lld * %0.5fms per invocation)\n", key.c_str(), total_ms, factor, total_ms/factor, cnt, avg_ms, factor, avg_ms/factor); +} + +void print_cumulative_times(const long long factor) +{ + printf("Dumping times:\n"); + for (auto& kv : cumulative_times) + { + print_cumulative_time_entry(kv.first, factor); + } +} + +void print_cumulative_op_counts(const bool only_fq) +{ +#ifdef PROFILE_OP_COUNTS + printf("Dumping operation counts:\n"); + for (auto& msg : invocation_counts) + { + printf(" %-45s: ", msg.first.c_str()); + bool first = true; + for (auto& data_point : op_data_points) + { + if (only_fq && data_point.first.compare(0, 2, "Fq") != 0) + { + continue; + } + + if (!first) + { + printf(", "); + } + printf("%-5s = %7.0f (%3zu)", + data_point.first.c_str(), + 1. * cumulative_op_counts[std::make_pair(msg.first, data_point.first)] / msg.second, + msg.second); + first = false; + } + printf("\n"); + } +#else + UNUSED(only_fq); +#endif +} + +void print_op_profiling(const std::string &msg) +{ +#ifdef PROFILE_OP_COUNTS + printf("\n"); + print_indent(); + + printf("(opcounts) = ("); + bool first = true; + for (std::pair p : op_data_points) + { + if (!first) + { + printf(", "); + } + + printf("%s=%lld", p.first.c_str(), *(p.second)-op_counts[std::make_pair(msg, p.first)]); + first = false; + } + printf(")"); +#else + UNUSED(msg); +#endif +} + +static void print_times_from_last_and_start(long long now, long long last, + long long cpu_now, long long cpu_last) +{ + long long time_from_start = now - start_time; + long long time_from_last = now - last; + + long long cpu_time_from_start = cpu_now - start_cpu_time; + long long cpu_time_from_last = cpu_now - cpu_last; + + if (time_from_last != 0) { + double parallelism_from_last = 1.0 * cpu_time_from_last / time_from_last; + printf("[%0.4fs x%0.2f]", time_from_last * 1e-9, parallelism_from_last); + } else { + printf("[ ]"); + } + if (time_from_start != 0) { + double parallelism_from_start = 1.0 * cpu_time_from_start / time_from_start; + printf("\t(%0.4fs x%0.2f from start)", time_from_start * 1e-9, parallelism_from_start); + } +} + +void print_time(const char* msg) +{ + if (inhibit_profiling_info) + { + return; + } + + long long now = get_nsec_time(); + long long cpu_now = get_nsec_cpu_time(); + + printf("%-35s\t", msg); + print_times_from_last_and_start(now, last_time, cpu_now, last_cpu_time); +#ifdef PROFILE_OP_COUNTS + print_op_profiling(msg); +#endif + printf("\n"); + + fflush(stdout); + last_time = now; + last_cpu_time = cpu_now; +} + +void print_header(const char *msg) +{ + printf("\n================================================================================\n"); + printf("%s\n", msg); + printf("================================================================================\n\n"); +} + +void print_indent() +{ + for (size_t i = 0; i < indentation; ++i) + { + printf(" "); + } +} + +void op_profiling_enter(const std::string &msg) +{ + for (std::pair p : op_data_points) + { + op_counts[std::make_pair(msg, p.first)] = *(p.second); + } +} + +void enter_block(const std::string &msg, const bool indent) +{ + if (inhibit_profiling_counters) + { + return; + } + + block_names.emplace_back(msg); + long long t = get_nsec_time(); + enter_times[msg] = t; + long long cpu_t = get_nsec_cpu_time(); + enter_cpu_times[msg] = cpu_t; + + if (inhibit_profiling_info) + { + return; + } + +#ifdef MULTICORE +#pragma omp critical +#endif + { + op_profiling_enter(msg); + + print_indent(); + printf("(enter) %-35s\t", msg.c_str()); + print_times_from_last_and_start(t, t, cpu_t, cpu_t); + printf("\n"); + fflush(stdout); + + if (indent) + { + ++indentation; + } + } +} + +void leave_block(const std::string &msg, const bool indent) +{ + if (inhibit_profiling_counters) + { + return; + } + +#ifndef MULTICORE + assert(*(--block_names.end()) == msg); +#endif + block_names.pop_back(); + + ++invocation_counts[msg]; + + long long t = get_nsec_time(); + last_times[msg] = (t - enter_times[msg]); + cumulative_times[msg] += (t - enter_times[msg]); + + long long cpu_t = get_nsec_cpu_time(); + last_cpu_times[msg] = (cpu_t - enter_cpu_times[msg]); + +#ifdef PROFILE_OP_COUNTS + for (std::pair p : op_data_points) + { + cumulative_op_counts[std::make_pair(msg, p.first)] += *(p.second)-op_counts[std::make_pair(msg, p.first)]; + } +#endif + + if (inhibit_profiling_info) + { + return; + } + +#ifdef MULTICORE +#pragma omp critical +#endif + { + if (indent) + { + --indentation; + } + + print_indent(); + printf("(leave) %-35s\t", msg.c_str()); + print_times_from_last_and_start(t, enter_times[msg], cpu_t, enter_cpu_times[msg]); + print_op_profiling(msg); + printf("\n"); + fflush(stdout); + } +} + +void print_mem(const std::string &s) +{ +#ifndef NO_PROCPS + struct proc_t usage; + look_up_our_self(&usage); + if (s.empty()) + { + printf("* Peak vsize (physical memory+swap) in mebibytes: %lu\n", usage.vsize >> 20); + } + else + { + printf("* Peak vsize (physical memory+swap) in mebibytes (%s): %lu\n", s.c_str(), usage.vsize >> 20); + } +#else + printf("* Memory profiling not supported in NO_PROCPS mode\n"); +#endif +} + +void print_compilation_info() +{ +#ifdef __GNUC__ + printf("g++ version: %s\n", __VERSION__); + //printf("Compiled on %s %s\n", __DATE__, __TIME__); +#endif +#ifdef STATIC + printf("STATIC: yes\n"); +#else + printf("STATIC: no\n"); +#endif +#ifdef MULTICORE + printf("MULTICORE: yes\n"); +#else + printf("MULTICORE: no\n"); +#endif +#ifdef DEBUG + printf("DEBUG: yes\n"); +#else + printf("DEBUG: no\n"); +#endif +#ifdef PROFILE_OP_COUNTS + printf("PROFILE_OP_COUNTS: yes\n"); +#else + printf("PROFILE_OP_COUNTS: no\n"); +#endif +#ifdef _GLIBCXX_DEBUG + printf("_GLIBCXX_DEBUG: yes\n"); +#else + printf("_GLIBCXX_DEBUG: no\n"); +#endif +} + +} // libsnark diff --git a/src/common/profiling.hpp b/src/common/profiling.hpp new file mode 100644 index 000000000..9619117f4 --- /dev/null +++ b/src/common/profiling.hpp @@ -0,0 +1,51 @@ +/** @file + ***************************************************************************** + + Declaration of functions for profiling code blocks. + + Reports time, operation counts, memory usage, and others. + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef PROFILING_HPP_ +#define PROFILING_HPP_ + +#include +#include +#include +#include + +namespace libsnark { + +void start_profiling(); +long long get_nsec_time(); +void print_time(const char* msg); +void print_header(const char* msg); + +void print_indent(); + +extern bool inhibit_profiling_info; +extern bool inhibit_profiling_counters; +extern std::map invocation_counts; +extern std::map last_times; +extern std::map cumulative_times; + +void clear_profiling_counters(); + +void print_cumulative_time_entry(const std::string &key, const long long factor=1); +void print_cumulative_times(const long long factor=1); +void print_cumulative_op_counts(const bool only_fq=false); + +void enter_block(const std::string &msg, const bool indent=true); +void leave_block(const std::string &msg, const bool indent=true); + +void print_mem(const std::string &s = ""); +void print_compilation_info(); + +} // libsnark + +#endif // PROFILING_HPP_ diff --git a/src/common/serialization.hpp b/src/common/serialization.hpp new file mode 100644 index 000000000..c931c65b2 --- /dev/null +++ b/src/common/serialization.hpp @@ -0,0 +1,104 @@ +/** @file + ***************************************************************************** + + Declaration of serialization routines and constants. + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef SERIALIZATION_HPP_ +#define SERIALIZATION_HPP_ + +#include +#include +#include +#include +#include + +namespace libsnark { + +/* + * @todo + * The serialization is fragile. Shoud be rewritten using a standard, portable-format + * library like boost::serialize. + * + * However, for now the following conventions are used within the code. + * + * All algebraic objects support either binary or decimal output using + * the standard C++ stream operators (operator<<, operator>>). + * + * The binary mode is activated by defining a BINARY_OUTPUT + * preprocessor macro (e.g. g++ -DBINARY_OUTPUT ...). + * + * Binary output assumes that the stream is to be binary read at its + * current position so any white space should be consumed beforehand. + * + * Consecutive algebraic objects are separated by OUTPUT_NEWLINE and + * within themselves (e.g. X and Y coordinates for field elements) with + * OUTPUT_SEPARATOR (as defined below). + * + * Therefore to dump two integers, two Fp elements and another integer + * one would: + * + * out << 3 << "\n"; + * out << 4 << "\n"; + * out << FieldT(56) << OUTPUT_NEWLINE; + * out << FieldT(78) << OUTPUT_NEWLINE; + * out << 9 << "\n"; + * + * Then reading back it its reader's responsibility (!) to consume "\n" + * after 4, but Fp::operator<< will correctly consume OUTPUT_NEWLINE. + * + * The reader should also consume "\n" after 9, so that another field + * element can be properly chained. This is especially important for + * binary output. + * + * The binary serialization of algebraic objects is currently *not* + * portable between machines of different word sizes. + */ + +#ifdef BINARY_OUTPUT +#define OUTPUT_NEWLINE "" +#define OUTPUT_SEPARATOR "" +#else +#define OUTPUT_NEWLINE "\n" +#define OUTPUT_SEPARATOR " " +#endif + +inline void consume_newline(std::istream &in); +inline void consume_OUTPUT_NEWLINE(std::istream &in); +inline void consume_OUTPUT_SEPARATOR(std::istream &in); + +inline void output_bool(std::ostream &out, const bool b); + +inline void output_bool_vector(std::ostream &out, const std::vector &v); + +template +T reserialize(const T &obj); + +template +std::ostream& operator<<(std::ostream& out, const std::vector &v); + +template +std::istream& operator>>(std::ostream& out, std::vector &v); + +template +std::ostream& operator<<(std::ostream& out, const std::map &m); + +template +std::istream& operator>>(std::istream& in, std::map &m); + +template +std::ostream& operator<<(std::ostream& out, const std::set &s); + +template +std::istream& operator>>(std::istream& in, std::set &s); + +} // libsnark + +#include "common/serialization.tcc" + +#endif // SERIALIZATION_HPP_ diff --git a/src/common/serialization.tcc b/src/common/serialization.tcc new file mode 100644 index 000000000..398f97850 --- /dev/null +++ b/src/common/serialization.tcc @@ -0,0 +1,180 @@ +/** @file + ***************************************************************************** + + Implementation of serialization routines. + + See serialization.hpp . + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef SERIALIZATION_TCC_ +#define SERIALIZATION_TCC_ + +#include +#include +#include "common/utils.hpp" + +namespace libsnark { + +inline void consume_newline(std::istream &in) +{ + char c; + in.read(&c, 1); +} + +inline void consume_OUTPUT_NEWLINE(std::istream &in) +{ +#ifdef BINARY_OUTPUT + // nothing to consume + UNUSED(in); +#else + char c; + in.read(&c, 1); +#endif +} + +inline void consume_OUTPUT_SEPARATOR(std::istream &in) +{ +#ifdef BINARY_OUTPUT + // nothing to consume + UNUSED(in); +#else + char c; + in.read(&c, 1); +#endif +} + +inline void output_bool(std::ostream &out, const bool b) +{ + out << (b ? 1 : 0) << "\n"; +} + +inline void output_bool_vector(std::ostream &out, const std::vector &v) +{ + out << v.size() << "\n"; + for (const bool b : v) + { + output_bool(out, b); + } +} + +template +T reserialize(const T &obj) +{ + std::stringstream ss; + ss << obj; + T tmp; + ss >> tmp; + assert(obj == tmp); + return tmp; +} + +template +std::ostream& operator<<(std::ostream& out, const std::vector &v) +{ + static_assert(!std::is_same::value, "this does not work for std::vector"); + out << v.size() << "\n"; + for (const T& t : v) + { + out << t << OUTPUT_NEWLINE; + } + + return out; +} + +template +std::istream& operator>>(std::istream& in, std::vector &v) +{ + static_assert(!std::is_same::value, "this does not work for std::vector"); + size_t size; + in >> size; + consume_newline(in); + + v.resize(0); + for (size_t i = 0; i < size; ++i) + { + T elt; + in >> elt; + consume_OUTPUT_NEWLINE(in); + v.push_back(elt); + } + + return in; +} + +template +std::ostream& operator<<(std::ostream& out, const std::map &m) +{ + out << m.size() << "\n"; + + for (auto &it : m) + { + out << it.first << "\n"; + out << it.second << "\n"; + } + + return out; +} + +template +std::istream& operator>>(std::istream& in, std::map &m) +{ + m.clear(); + size_t size; + in >> size; + consume_newline(in); + + for (size_t i = 0; i < size; ++i) + { + T1 k; + T2 v; + in >> k; + consume_newline(in); + in >> v; + consume_newline(in); + m[k] = v; + } + + return in; +} + +template +std::ostream& operator<<(std::ostream& out, const std::set &s) +{ + out << s.size() << "\n"; + + for (auto &el : s) + { + out << el << "\n"; + } + + return out; +} + + +template +std::istream& operator>>(std::istream& in, std::set &s) +{ + s.clear(); + size_t size; + in >> size; + consume_newline(in); + + for (size_t i = 0; i < size; ++i) + { + T el; + in >> el; + consume_newline(in); + s.insert(el); + } + + return in; +} + +} + +#endif // SERIALIZATION_TCC_ diff --git a/src/common/template_utils.hpp b/src/common/template_utils.hpp new file mode 100644 index 000000000..8dbfd261d --- /dev/null +++ b/src/common/template_utils.hpp @@ -0,0 +1,26 @@ +/** @file + ***************************************************************************** + + Declaration of functions for supporting the use of templates. + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef TEMPLATE_UTILS_HPP_ +#define TEMPLATE_UTILS_HPP_ + +namespace libsnark { + +/* A commonly used SFINAE helper type */ +template +struct void_type +{ + typedef void type; +}; + +} // libsnark + +#endif // TEMPLATE_UTILS_HPP_ diff --git a/src/common/utils.cpp b/src/common/utils.cpp new file mode 100644 index 000000000..dd114fdf0 --- /dev/null +++ b/src/common/utils.cpp @@ -0,0 +1,102 @@ +/** @file + ***************************************************************************** + Implementation of misc math and serialization utility functions + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#include +#include +#include +#include +#include "common/utils.hpp" + +namespace libsnark { + +size_t log2(size_t n) +/* returns ceil(log2(n)), so 1ul< 1) + { + n >>= 1; + r++; + } + + return r; +} + +size_t bitreverse(size_t n, const size_t l) +{ + size_t r = 0; + for (size_t k = 0; k < l; ++k) + { + r = (r << 1) | (n & 1); + n >>= 1; + } + return r; +} + +bit_vector int_list_to_bits(const std::initializer_list &l, const size_t wordsize) +{ + bit_vector res(wordsize*l.size()); + for (size_t i = 0; i < l.size(); ++i) + { + for (size_t j = 0; j < wordsize; ++j) + { + res[i*wordsize + j] = (*(l.begin()+i) & (1ul<<(wordsize-1-j))); + } + } + return res; +} + +long long div_ceil(long long x, long long y) +{ + return (x + (y-1)) / y; +} + +bool is_little_endian() +{ + uint64_t a = 0x12345678; + unsigned char *c = (unsigned char*)(&a); + return (*c = 0x78); +} + +std::string FORMAT(const std::string &prefix, const char* format, ...) +{ + const static size_t MAX_FMT = 256; + char buf[MAX_FMT]; + va_list args; + va_start(args, format); + vsnprintf(buf, MAX_FMT, format, args); + va_end(args); + + return prefix + std::string(buf); +} + +void serialize_bit_vector(std::ostream &out, const bit_vector &v) +{ + out << v.size() << "\n"; + for (size_t i = 0; i < v.size(); ++i) + { + out << v[i] << "\n"; + } +} + +void deserialize_bit_vector(std::istream &in, bit_vector &v) +{ + size_t size; + in >> size; + v.resize(size); + for (size_t i = 0; i < size; ++i) + { + bool b; + in >> b; + v[i] = b; + } +} +} // libsnark diff --git a/src/common/utils.hpp b/src/common/utils.hpp new file mode 100644 index 000000000..d7d9e8947 --- /dev/null +++ b/src/common/utils.hpp @@ -0,0 +1,57 @@ +/** @file + ***************************************************************************** + Declaration of misc math and serialization utility functions + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef UTILS_HPP_ +#define UTILS_HPP_ + +#include +#include +#include +#include +#include + +namespace libsnark { + +typedef std::vector bit_vector; + +/// returns ceil(log2(n)), so 1ul< &l, const size_t wordsize); +long long div_ceil(long long x, long long y); + +bool is_little_endian(); + +std::string FORMAT(const std::string &prefix, const char* format, ...); + +/* A variadic template to suppress unused argument warnings */ +template +void UNUSED(Types&&...) {} + +#ifdef DEBUG +#define FMT FORMAT +#else +#define FMT(...) (UNUSED(__VA_ARGS__), "") +#endif + +void serialize_bit_vector(std::ostream &out, const bit_vector &v); +void deserialize_bit_vector(std::istream &in, bit_vector &v); + +template +size_t size_in_bits(const std::vector &v); + +#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof(arr[0])) + +} // libsnark + +#include "common/utils.tcc" /* note that utils has a templatized part (utils.tcc) and non-templatized part (utils.cpp) */ +#endif // UTILS_HPP_ diff --git a/src/common/utils.tcc b/src/common/utils.tcc new file mode 100644 index 000000000..f97178f8c --- /dev/null +++ b/src/common/utils.tcc @@ -0,0 +1,23 @@ +/** @file + ***************************************************************************** + Implementation of templatized utility functions + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef UTILS_TCC_ +#define UTILS_TCC_ + +namespace libsnark { + +template +size_t size_in_bits(const std::vector &v) +{ + return v.size() * T::size_in_bits(); +} + +} // libsnark + +#endif // UTILS_TCC_ diff --git a/src/gadgetlib1/constraint_profiling.cpp b/src/gadgetlib1/constraint_profiling.cpp new file mode 100644 index 000000000..bc17e63bc --- /dev/null +++ b/src/gadgetlib1/constraint_profiling.cpp @@ -0,0 +1,48 @@ +/** @file + ***************************************************************************** + + Implementation of interfaces for profiling constraints. + + See constraint_profiling.hpp . + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#include "gadgetlib1/constraint_profiling.hpp" +#include "common/profiling.hpp" + +namespace libsnark { + +size_t constraint_profiling_indent = 0; +std::vector constraint_profiling_table; + +size_t PRINT_CONSTRAINT_PROFILING() +{ + size_t accounted = 0; + print_indent(); + printf("Constraint profiling:\n"); + for (constraint_profiling_entry &ent : constraint_profiling_table) + { + if (ent.indent == 0) + { + accounted += ent.count; + } + + print_indent(); + for (size_t i = 0; i < ent.indent; ++i) + { + printf(" "); + } + printf("* Number of constraints in [%s]: %zu\n", ent.annotation.c_str(), ent.count); + } + + constraint_profiling_table.clear(); + constraint_profiling_indent = 0; + + return accounted; +} + +} diff --git a/src/gadgetlib1/constraint_profiling.hpp b/src/gadgetlib1/constraint_profiling.hpp new file mode 100644 index 000000000..df8a55de1 --- /dev/null +++ b/src/gadgetlib1/constraint_profiling.hpp @@ -0,0 +1,42 @@ +/** @file + ***************************************************************************** + + Declaration of interfaces for profiling constraints. + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef CONSTRAINT_PROFILING_HPP_ +#define CONSTRAINT_PROFILING_HPP_ + +#include +#include +#include +#include + +namespace libsnark { + +extern size_t constraint_profiling_indent; + +struct constraint_profiling_entry { + size_t indent; + std::string annotation; + size_t count; +}; + +extern std::vector constraint_profiling_table; + +#define PROFILE_CONSTRAINTS(pb, annotation) \ + for (size_t _num_constraints_before = pb.num_constraints(), _iter = (++constraint_profiling_indent, 0), _cp_pos = constraint_profiling_table.size(); \ + _iter == 0; \ + constraint_profiling_table.insert(constraint_profiling_table.begin() + _cp_pos, constraint_profiling_entry{--constraint_profiling_indent, annotation, pb.num_constraints() - _num_constraints_before}), \ + _iter = 1) + +size_t PRINT_CONSTRAINT_PROFILING(); // returns # of top level constraints + +} // libsnark + +#endif // CONSTRAINT_PROFILING_HPP_ diff --git a/src/gadgetlib1/examples/simple_example.hpp b/src/gadgetlib1/examples/simple_example.hpp new file mode 100644 index 000000000..faa3a9605 --- /dev/null +++ b/src/gadgetlib1/examples/simple_example.hpp @@ -0,0 +1,23 @@ +/** @file + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef SIMPLE_EXAMPLE_HPP_ +#define SIMPLE_EXAMPLE_HPP_ + +#include "examples/r1cs_examples.hpp" + +namespace libsnark { + +template +r1cs_example gen_r1cs_example_from_protoboard(const size_t num_constraints, + const size_t num_inputs); + +} // libsnark + +#include "gadgetlib1/examples/simple_example.tcc" + +#endif // SIMPLE_EXAMPLE_HPP_ diff --git a/src/gadgetlib1/examples/simple_example.tcc b/src/gadgetlib1/examples/simple_example.tcc new file mode 100644 index 000000000..9d500b5c7 --- /dev/null +++ b/src/gadgetlib1/examples/simple_example.tcc @@ -0,0 +1,54 @@ +/** @file + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef SIMPLE_EXAMPLE_TCC_ +#define SIMPLE_EXAMPLE_TCC_ + +#include +#include "gadgetlib1/gadgets/basic_gadgets.hpp" + +namespace libsnark { + +/* NOTE: all examples here actually generate one constraint less to account for soundness constraint in QAP */ + +template +r1cs_example gen_r1cs_example_from_protoboard(const size_t num_constraints, + const size_t num_inputs) +{ + const size_t new_num_constraints = num_constraints - 1; + + /* construct dummy example: inner products of two vectors */ + protoboard pb; + pb_variable_array A; + pb_variable_array B; + pb_variable res; + + // the variables on the protoboard are (ONE (constant 1 term), res, A[0], ..., A[num_constraints-1], B[0], ..., B[num_constraints-1]) + res.allocate(pb, "res"); + A.allocate(pb, new_num_constraints, "A"); + B.allocate(pb, new_num_constraints, "B"); + + inner_product_gadget compute_inner_product(pb, A, B, res, "compute_inner_product"); + compute_inner_product.generate_r1cs_constraints(); + + /* fill in random example */ + for (size_t i = 0; i < new_num_constraints; ++i) + { + pb.val(A[i]) = FieldT::random_element(); + pb.val(B[i]) = FieldT::random_element(); + } + + compute_inner_product.generate_r1cs_witness(); + + pb.constraint_system.num_inputs = num_inputs; + const r1cs_variable_assignment va = pb.values; + const r1cs_variable_assignment input(va.begin(), va.begin() + num_inputs); + return r1cs_example(pb.constraint_system, input, va, num_inputs); +} + +} // libsnark +#endif // R1CS_EXAMPLES_TCC_ diff --git a/src/gadgetlib1/gadget.hpp b/src/gadgetlib1/gadget.hpp new file mode 100644 index 000000000..dbeaa9d4b --- /dev/null +++ b/src/gadgetlib1/gadget.hpp @@ -0,0 +1,27 @@ +/** @file + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef GADGET_HPP_ +#define GADGET_HPP_ + +#include "gadgetlib1/protoboard.hpp" + +namespace libsnark { + +template +class gadget { +protected: + protoboard &pb; + const std::string annotation_prefix; +public: + gadget(protoboard &pb, const std::string &annotation_prefix=""); +}; + +} // libsnark +#include "gadgetlib1/gadget.tcc" + +#endif // GADGET_HPP_ diff --git a/src/gadgetlib1/gadget.tcc b/src/gadgetlib1/gadget.tcc new file mode 100644 index 000000000..120229bbe --- /dev/null +++ b/src/gadgetlib1/gadget.tcc @@ -0,0 +1,23 @@ +/** @file + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef GADGET_TCC_ +#define GADGET_TCC_ + +namespace libsnark { + +template +gadget::gadget(protoboard &pb, const std::string &annotation_prefix) : + pb(pb), annotation_prefix(annotation_prefix) +{ +#ifdef DEBUG + assert(annotation_prefix != ""); +#endif +} + +} // libsnark +#endif // GADGET_TCC_ diff --git a/src/gadgetlib1/gadgets/basic_gadgets.hpp b/src/gadgetlib1/gadgets/basic_gadgets.hpp new file mode 100644 index 000000000..08e596bee --- /dev/null +++ b/src/gadgetlib1/gadgets/basic_gadgets.hpp @@ -0,0 +1,351 @@ +/** @file + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef BASIC_GADGETS_HPP_ +#define BASIC_GADGETS_HPP_ + +#include +#include + +#include "gadgetlib1/gadget.hpp" + +namespace libsnark { + +/* forces lc to take value 0 or 1 by adding constraint lc * (1-lc) = 0 */ +template +void generate_boolean_r1cs_constraint(protoboard &pb, const pb_linear_combination &lc, const std::string &annotation_prefix=""); + +template +void generate_r1cs_equals_const_constraint(protoboard &pb, const pb_linear_combination &lc, const FieldT& c, const std::string &annotation_prefix=""); + +template +class packing_gadget : public gadget { +private: + /* no internal variables */ +public: + const pb_linear_combination_array bits; + const pb_linear_combination packed; + + packing_gadget(protoboard &pb, + const pb_linear_combination_array &bits, + const pb_linear_combination &packed, + const std::string &annotation_prefix="") : + gadget(pb, annotation_prefix), bits(bits), packed(packed) {} + + void generate_r1cs_constraints(const bool enforce_bitness); + /* adds constraint result = \sum bits[i] * 2^i */ + + void generate_r1cs_witness_from_packed(); + void generate_r1cs_witness_from_bits(); +}; + +template +class multipacking_gadget : public gadget { +private: + std::vector > packers; +public: + const pb_linear_combination_array bits; + const pb_linear_combination_array packed_vars; + + const size_t chunk_size; + const size_t num_chunks; + // const size_t last_chunk_size; + + multipacking_gadget(protoboard &pb, + const pb_linear_combination_array &bits, + const pb_linear_combination_array &packed_vars, + const size_t chunk_size, + const std::string &annotation_prefix=""); + void generate_r1cs_constraints(const bool enforce_bitness); + void generate_r1cs_witness_from_packed(); + void generate_r1cs_witness_from_bits(); +}; + +template +class field_vector_copy_gadget : public gadget { +public: + const pb_variable_array source; + const pb_variable_array target; + const pb_linear_combination do_copy; + + field_vector_copy_gadget(protoboard &pb, + const pb_variable_array &source, + const pb_variable_array &target, + const pb_linear_combination &do_copy, + const std::string &annotation_prefix=""); + void generate_r1cs_constraints(); + void generate_r1cs_witness(); +}; + +template +class bit_vector_copy_gadget : public gadget { +public: + const pb_variable_array source_bits; + const pb_variable_array target_bits; + const pb_linear_combination do_copy; + + pb_variable_array packed_source; + pb_variable_array packed_target; + + std::shared_ptr > pack_source; + std::shared_ptr > pack_target; + std::shared_ptr > copier; + + const size_t chunk_size; + const size_t num_chunks; + + bit_vector_copy_gadget(protoboard &pb, + const pb_variable_array &source_bits, + const pb_variable_array &target_bits, + const pb_linear_combination &do_copy, + const size_t chunk_size, + const std::string &annotation_prefix=""); + void generate_r1cs_constraints(const bool enforce_source_bitness, const bool enforce_target_bitness); + void generate_r1cs_witness(); +}; + +template +class dual_variable_gadget : public gadget { +private: + std::shared_ptr > consistency_check; +public: + pb_variable packed; + pb_variable_array bits; + + dual_variable_gadget(protoboard &pb, + const size_t width, + const std::string &annotation_prefix="") : + gadget(pb, annotation_prefix) + { + packed.allocate(pb, FMT(this->annotation_prefix, " packed")); + bits.allocate(pb, width, FMT(this->annotation_prefix, " bits")); + consistency_check.reset(new packing_gadget(pb, + bits, + packed, + FMT(this->annotation_prefix, " consistency_check"))); + } + + dual_variable_gadget(protoboard &pb, + const pb_variable_array &bits, + const std::string &annotation_prefix="") : + gadget(pb, annotation_prefix), bits(bits) + { + packed.allocate(pb, FMT(this->annotation_prefix, " packed")); + consistency_check.reset(new packing_gadget(pb, + bits, + packed, + FMT(this->annotation_prefix, " consistency_check"))); + } + + dual_variable_gadget(protoboard &pb, + const pb_variable &packed, + const size_t width, + const std::string &annotation_prefix="") : + gadget(pb, annotation_prefix), packed(packed) + { + bits.allocate(pb, width, FMT(this->annotation_prefix, " bits")); + consistency_check.reset(new packing_gadget(pb, + bits, + packed, + FMT(this->annotation_prefix, " consistency_check"))); + } + + void generate_r1cs_constraints(const bool enforce_bitness); + void generate_r1cs_witness_from_packed(); + void generate_r1cs_witness_from_bits(); +}; + +/* + the gadgets below are Fp specific: + I * X = R + (1-R) * X = 0 + + if X = 0 then R = 0 + if X != 0 then R = 1 and I = X^{-1} +*/ + +template +class disjunction_gadget : public gadget { +private: + pb_variable inv; +public: + const pb_variable_array inputs; + const pb_variable output; + + disjunction_gadget(protoboard& pb, + const pb_variable_array &inputs, + const pb_variable &output, + const std::string &annotation_prefix="") : + gadget(pb, annotation_prefix), inputs(inputs), output(output) + { + assert(inputs.size() >= 1); + inv.allocate(pb, FMT(this->annotation_prefix, " inv")); + } + + void generate_r1cs_constraints(); + void generate_r1cs_witness(); +}; + +template +void test_disjunction_gadget(const size_t n); + +template +class conjunction_gadget : public gadget { +private: + pb_variable inv; +public: + const pb_variable_array inputs; + const pb_variable output; + + conjunction_gadget(protoboard& pb, + const pb_variable_array &inputs, + const pb_variable &output, + const std::string &annotation_prefix="") : + gadget(pb, annotation_prefix), inputs(inputs), output(output) + { + assert(inputs.size() >= 1); + inv.allocate(pb, FMT(this->annotation_prefix, " inv")); + } + + void generate_r1cs_constraints(); + void generate_r1cs_witness(); +}; + +template +void test_conjunction_gadget(const size_t n); + +template +class comparison_gadget : public gadget { +private: + pb_variable_array alpha; + pb_variable alpha_packed; + std::shared_ptr > pack_alpha; + + std::shared_ptr > all_zeros_test; + pb_variable not_all_zeros; +public: + const size_t n; + const pb_linear_combination A; + const pb_linear_combination B; + const pb_variable less; + const pb_variable less_or_eq; + + comparison_gadget(protoboard& pb, + const size_t n, + const pb_linear_combination &A, + const pb_linear_combination &B, + const pb_variable &less, + const pb_variable &less_or_eq, + const std::string &annotation_prefix="") : + gadget(pb, annotation_prefix), n(n), A(A), B(B), less(less), less_or_eq(less_or_eq) + { + alpha.allocate(pb, n, FMT(this->annotation_prefix, " alpha")); + alpha.emplace_back(less_or_eq); // alpha[n] is less_or_eq + + alpha_packed.allocate(pb, FMT(this->annotation_prefix, " alpha_packed")); + not_all_zeros.allocate(pb, FMT(this->annotation_prefix, " not_all_zeros")); + + pack_alpha.reset(new packing_gadget(pb, alpha, alpha_packed, + FMT(this->annotation_prefix, " pack_alpha"))); + + all_zeros_test.reset(new disjunction_gadget(pb, + pb_variable_array(alpha.begin(), alpha.begin() + n), + not_all_zeros, + FMT(this->annotation_prefix, " all_zeros_test"))); + }; + + void generate_r1cs_constraints(); + void generate_r1cs_witness(); +}; + +template +void test_comparison_gadget(const size_t n); + +template +class inner_product_gadget : public gadget { +private: + /* S_i = \sum_{k=0}^{i+1} A[i] * B[i] */ + pb_variable_array S; +public: + const pb_linear_combination_array A; + const pb_linear_combination_array B; + const pb_variable result; + + inner_product_gadget(protoboard& pb, + const pb_linear_combination_array &A, + const pb_linear_combination_array &B, + const pb_variable &result, + const std::string &annotation_prefix="") : + gadget(pb, annotation_prefix), A(A), B(B), result(result) + { + assert(A.size() >= 1); + assert(A.size() == B.size()); + + S.allocate(pb, A.size()-1, FMT(this->annotation_prefix, " S")); + } + + void generate_r1cs_constraints(); + void generate_r1cs_witness(); +}; + +template +void test_inner_product_gadget(const size_t n); + +template +class loose_multiplexing_gadget : public gadget { +/* + this implements loose multiplexer: + index not in bounds -> success_flag = 0 + index in bounds && success_flag = 1 -> result is correct + however if index is in bounds we can also set success_flag to 0 (and then result will be forced to be 0) +*/ +public: + pb_variable_array alpha; +private: + std::shared_ptr > compute_result; +public: + const pb_linear_combination_array arr; + const pb_variable index; + const pb_variable result; + const pb_variable success_flag; + + loose_multiplexing_gadget(protoboard& pb, + const pb_linear_combination_array &arr, + const pb_variable &index, + const pb_variable &result, + const pb_variable &success_flag, + const std::string &annotation_prefix="") : + gadget(pb, annotation_prefix), arr(arr), index(index), result(result), success_flag(success_flag) + { + alpha.allocate(pb, arr.size(), FMT(this->annotation_prefix, " alpha")); + compute_result.reset(new inner_product_gadget(pb, alpha, arr, result, FMT(this->annotation_prefix, " compute_result"))); + }; + + void generate_r1cs_constraints(); + void generate_r1cs_witness(); +}; + +template +void test_loose_multiplexing_gadget(const size_t n); + +template +void create_linear_combination_constraints(protoboard &pb, + const std::vector &base, + const std::vector > &v, + const VarT &target, + const std::string &annotation_prefix); + +template +void create_linear_combination_witness(protoboard &pb, + const std::vector &base, + const std::vector > &v, + const VarT &target); + +} // libsnark +#include "gadgetlib1/gadgets/basic_gadgets.tcc" + +#endif // BASIC_GADGETS_HPP_ diff --git a/src/gadgetlib1/gadgets/basic_gadgets.tcc b/src/gadgetlib1/gadgets/basic_gadgets.tcc new file mode 100644 index 000000000..213b1906f --- /dev/null +++ b/src/gadgetlib1/gadgets/basic_gadgets.tcc @@ -0,0 +1,705 @@ +/** @file + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef BASIC_GADGETS_TCC_ +#define BASIC_GADGETS_TCC_ + +#include "common/profiling.hpp" +#include "common/utils.hpp" + +namespace libsnark { + +template +void generate_boolean_r1cs_constraint(protoboard &pb, const pb_linear_combination &lc, const std::string &annotation_prefix) +/* forces lc to take value 0 or 1 by adding constraint lc * (1-lc) = 0 */ +{ + pb.add_r1cs_constraint(r1cs_constraint(lc, 1-lc, 0), + FMT(annotation_prefix, " boolean_r1cs_constraint")); +} + +template +void generate_r1cs_equals_const_constraint(protoboard &pb, const pb_linear_combination &lc, const FieldT& c, const std::string &annotation_prefix) +{ + pb.add_r1cs_constraint(r1cs_constraint(1, lc, c), + FMT(annotation_prefix, " constness_constraint")); +} + +template +void packing_gadget::generate_r1cs_constraints(const bool enforce_bitness) +/* adds constraint result = \sum bits[i] * 2^i */ +{ + this->pb.add_r1cs_constraint(r1cs_constraint(1, pb_packing_sum(bits), packed), FMT(this->annotation_prefix, " packing_constraint")); + + if (enforce_bitness) + { + for (size_t i = 0; i < bits.size(); ++i) + { + generate_boolean_r1cs_constraint(this->pb, bits[i], FMT(this->annotation_prefix, " bitness_%zu", i)); + } + } +} + +template +void packing_gadget::generate_r1cs_witness_from_packed() +{ + packed.evaluate(this->pb); + assert(this->pb.lc_val(packed).as_bigint().num_bits() <= bits.size()); + bits.fill_with_bits_of_field_element(this->pb, this->pb.lc_val(packed)); +} + +template +void packing_gadget::generate_r1cs_witness_from_bits() +{ + bits.evaluate(this->pb); + this->pb.lc_val(packed) = bits.get_field_element_from_bits(this->pb); +} + +template +multipacking_gadget::multipacking_gadget(protoboard &pb, + const pb_linear_combination_array &bits, + const pb_linear_combination_array &packed_vars, + const size_t chunk_size, + const std::string &annotation_prefix) : + gadget(pb, annotation_prefix), bits(bits), packed_vars(packed_vars), + chunk_size(chunk_size), + num_chunks(div_ceil(bits.size(), chunk_size)) + // last_chunk_size(bits.size() - (num_chunks-1) * chunk_size) +{ + assert(packed_vars.size() == num_chunks); + for (size_t i = 0; i < num_chunks; ++i) + { + packers.emplace_back(packing_gadget(this->pb, pb_linear_combination_array(bits.begin() + i * chunk_size, + bits.begin() + std::min((i+1) * chunk_size, bits.size())), + packed_vars[i], FMT(this->annotation_prefix, " packers_%zu", i))); + } +} + +template +void multipacking_gadget::generate_r1cs_constraints(const bool enforce_bitness) +{ + for (size_t i = 0; i < num_chunks; ++i) + { + packers[i].generate_r1cs_constraints(enforce_bitness); + } +} + +template +void multipacking_gadget::generate_r1cs_witness_from_packed() +{ + for (size_t i = 0; i < num_chunks; ++i) + { + packers[i].generate_r1cs_witness_from_packed(); + } +} + +template +void multipacking_gadget::generate_r1cs_witness_from_bits() +{ + for (size_t i = 0; i < num_chunks; ++i) + { + packers[i].generate_r1cs_witness_from_bits(); + } +} + +template +size_t multipacking_num_chunks(const size_t num_bits) +{ + return div_ceil(num_bits, FieldT::capacity()); +} + +template +field_vector_copy_gadget::field_vector_copy_gadget(protoboard &pb, + const pb_variable_array &source, + const pb_variable_array &target, + const pb_linear_combination &do_copy, + const std::string &annotation_prefix) : +gadget(pb, annotation_prefix), source(source), target(target), do_copy(do_copy) +{ + assert(source.size() == target.size()); +} + +template +void field_vector_copy_gadget::generate_r1cs_constraints() +{ + for (size_t i = 0; i < source.size(); ++i) + { + this->pb.add_r1cs_constraint(r1cs_constraint(do_copy, source[i] - target[i], 0), + FMT(this->annotation_prefix, " copying_check_%zu", i)); + } +} + +template +void field_vector_copy_gadget::generate_r1cs_witness() +{ + do_copy.evaluate(this->pb); + assert(this->pb.lc_val(do_copy) == FieldT::one() || this->pb.lc_val(do_copy) == FieldT::zero()); + if (this->pb.lc_val(do_copy) != FieldT::zero()) + { + for (size_t i = 0; i < source.size(); ++i) + { + this->pb.val(target[i]) = this->pb.val(source[i]); + } + } +} + +template +bit_vector_copy_gadget::bit_vector_copy_gadget(protoboard &pb, + const pb_variable_array &source_bits, + const pb_variable_array &target_bits, + const pb_linear_combination &do_copy, + const size_t chunk_size, + const std::string &annotation_prefix) : + gadget(pb, annotation_prefix), source_bits(source_bits), target_bits(target_bits), do_copy(do_copy), + chunk_size(chunk_size), num_chunks(div_ceil(source_bits.size(), chunk_size)) +{ + assert(source_bits.size() == target_bits.size()); + + packed_source.allocate(pb, num_chunks, FMT(annotation_prefix, " packed_source")); + pack_source.reset(new multipacking_gadget(pb, source_bits, packed_source, chunk_size, FMT(annotation_prefix, " pack_source"))); + + packed_target.allocate(pb, num_chunks, FMT(annotation_prefix, " packed_target")); + pack_target.reset(new multipacking_gadget(pb, target_bits, packed_target, chunk_size, FMT(annotation_prefix, " pack_target"))); + + copier.reset(new field_vector_copy_gadget(pb, packed_source, packed_target, do_copy, FMT(annotation_prefix, " copier"))); +} + +template +void bit_vector_copy_gadget::generate_r1cs_constraints(const bool enforce_source_bitness, const bool enforce_target_bitness) +{ + pack_source->generate_r1cs_constraints(enforce_source_bitness); + pack_target->generate_r1cs_constraints(enforce_target_bitness); + + copier->generate_r1cs_constraints(); +} + +template +void bit_vector_copy_gadget::generate_r1cs_witness() +{ + do_copy.evaluate(this->pb); + assert(this->pb.lc_val(do_copy) == FieldT::zero() || this->pb.lc_val(do_copy) == FieldT::one()); + if (this->pb.lc_val(do_copy) == FieldT::one()) + { + for (size_t i = 0; i < source_bits.size(); ++i) + { + this->pb.val(target_bits[i]) = this->pb.val(source_bits[i]); + } + } + + pack_source->generate_r1cs_witness_from_bits(); + pack_target->generate_r1cs_witness_from_bits(); +} + +template +void dual_variable_gadget::generate_r1cs_constraints(const bool enforce_bitness) +{ + consistency_check->generate_r1cs_constraints(enforce_bitness); +} + +template +void dual_variable_gadget::generate_r1cs_witness_from_packed() +{ + consistency_check->generate_r1cs_witness_from_packed(); +} + +template +void dual_variable_gadget::generate_r1cs_witness_from_bits() +{ + consistency_check->generate_r1cs_witness_from_bits(); +} + +template +void disjunction_gadget::generate_r1cs_constraints() +{ + /* inv * sum = output */ + linear_combination a1, b1, c1; + a1.add_term(inv); + for (size_t i = 0; i < inputs.size(); ++i) + { + b1.add_term(inputs[i]); + } + c1.add_term(output); + + this->pb.add_r1cs_constraint(r1cs_constraint(a1, b1, c1), FMT(this->annotation_prefix, " inv*sum=output")); + + /* (1-output) * sum = 0 */ + linear_combination a2, b2, c2; + a2.add_term(ONE); + a2.add_term(output, -1); + for (size_t i = 0; i < inputs.size(); ++i) + { + b2.add_term(inputs[i]); + } + c2.add_term(ONE, 0); + + this->pb.add_r1cs_constraint(r1cs_constraint(a2, b2, c2), FMT(this->annotation_prefix, " (1-output)*sum=0")); +} + +template +void disjunction_gadget::generate_r1cs_witness() +{ + FieldT sum = FieldT::zero(); + + for (size_t i = 0; i < inputs.size(); ++i) + { + sum += this->pb.val(inputs[i]); + } + + if (sum.is_zero()) + { + this->pb.val(inv) = FieldT::zero(); + this->pb.val(output) = FieldT::zero(); + } + else + { + this->pb.val(inv) = sum.inverse(); + this->pb.val(output) = FieldT::one(); + } +} + +template +void test_disjunction_gadget(const size_t n) +{ + printf("testing disjunction_gadget on all %zu bit strings\n", n); + + protoboard pb; + pb_variable_array inputs; + inputs.allocate(pb, n, "inputs"); + + pb_variable output; + output.allocate(pb, "output"); + + disjunction_gadget d(pb, inputs, output, "d"); + d.generate_r1cs_constraints(); + + for (size_t w = 0; w < 1ul< +void conjunction_gadget::generate_r1cs_constraints() +{ + /* inv * (n-sum) = 1-output */ + linear_combination a1, b1, c1; + a1.add_term(inv); + b1.add_term(ONE, inputs.size()); + for (size_t i = 0; i < inputs.size(); ++i) + { + b1.add_term(inputs[i], -1); + } + c1.add_term(ONE); + c1.add_term(output, -1); + + this->pb.add_r1cs_constraint(r1cs_constraint(a1, b1, c1), FMT(this->annotation_prefix, " inv*(n-sum)=(1-output)")); + + /* output * (n-sum) = 0 */ + linear_combination a2, b2, c2; + a2.add_term(output); + b2.add_term(ONE, inputs.size()); + for (size_t i = 0; i < inputs.size(); ++i) + { + b2.add_term(inputs[i], -1); + } + c2.add_term(ONE, 0); + + this->pb.add_r1cs_constraint(r1cs_constraint(a2, b2, c2), FMT(this->annotation_prefix, " output*(n-sum)=0")); +} + +template +void conjunction_gadget::generate_r1cs_witness() +{ + FieldT sum = FieldT(inputs.size()); + + for (size_t i = 0; i < inputs.size(); ++i) + { + sum -= this->pb.val(inputs[i]); + } + + if (sum.is_zero()) + { + this->pb.val(inv) = FieldT::zero(); + this->pb.val(output) = FieldT::one(); + } + else + { + this->pb.val(inv) = sum.inverse(); + this->pb.val(output) = FieldT::zero(); + } +} + +template +void test_conjunction_gadget(const size_t n) +{ + printf("testing conjunction_gadget on all %zu bit strings\n", n); + + protoboard pb; + pb_variable_array inputs; + inputs.allocate(pb, n, "inputs"); + + pb_variable output; + output.allocate(pb, "output"); + + conjunction_gadget c(pb, inputs, output, "c"); + c.generate_r1cs_constraints(); + + for (size_t w = 0; w < 1ul< +void comparison_gadget::generate_r1cs_constraints() +{ + /* + packed(alpha) = 2^n + B - A + + not_all_zeros = \bigvee_{i=0}^{n-1} alpha_i + + if B - A > 0, then 2^n + B - A > 2^n, + so alpha_n = 1 and not_all_zeros = 1 + if B - A = 0, then 2^n + B - A = 2^n, + so alpha_n = 1 and not_all_zeros = 0 + if B - A < 0, then 2^n + B - A \in {0, 1, \ldots, 2^n-1}, + so alpha_n = 0 + + therefore alpha_n = less_or_eq and alpha_n * not_all_zeros = less + */ + + /* not_all_zeros to be Boolean, alpha_i are Boolean by packing gadget */ + generate_boolean_r1cs_constraint(this->pb, not_all_zeros, + FMT(this->annotation_prefix, " not_all_zeros")); + + /* constraints for packed(alpha) = 2^n + B - A */ + pack_alpha->generate_r1cs_constraints(true); + this->pb.add_r1cs_constraint(r1cs_constraint(1, (FieldT(2)^n) + B - A, alpha_packed), FMT(this->annotation_prefix, " main_constraint")); + + /* compute result */ + all_zeros_test->generate_r1cs_constraints(); + this->pb.add_r1cs_constraint(r1cs_constraint(less_or_eq, not_all_zeros, less), + FMT(this->annotation_prefix, " less")); +} + +template +void comparison_gadget::generate_r1cs_witness() +{ + A.evaluate(this->pb); + B.evaluate(this->pb); + + /* unpack 2^n + B - A into alpha_packed */ + this->pb.val(alpha_packed) = (FieldT(2)^n) + this->pb.lc_val(B) - this->pb.lc_val(A); + pack_alpha->generate_r1cs_witness_from_packed(); + + /* compute result */ + all_zeros_test->generate_r1cs_witness(); + this->pb.val(less) = this->pb.val(less_or_eq) * this->pb.val(not_all_zeros); +} + +template +void test_comparison_gadget(const size_t n) +{ + printf("testing comparison_gadget on all %zu bit inputs\n", n); + + protoboard pb; + + pb_variable A, B, less, less_or_eq; + A.allocate(pb, "A"); + B.allocate(pb, "B"); + less.allocate(pb, "less"); + less_or_eq.allocate(pb, "less_or_eq"); + + comparison_gadget cmp(pb, n, A, B, less, less_or_eq, "cmp"); + cmp.generate_r1cs_constraints(); + + for (size_t a = 0; a < 1ul< +void inner_product_gadget::generate_r1cs_constraints() +{ + /* + S_i = \sum_{k=0}^{i+1} A[i] * B[i] + S[0] = A[0] * B[0] + S[i+1] - S[i] = A[i] * B[i] + */ + for (size_t i = 0; i < A.size(); ++i) + { + this->pb.add_r1cs_constraint( + r1cs_constraint(A[i], B[i], + (i == A.size()-1 ? result : S[i]) + (i == 0 ? 0 * ONE : -S[i-1])), + FMT(this->annotation_prefix, " S_%zu", i)); + } +} + +template +void inner_product_gadget::generate_r1cs_witness() +{ + FieldT total = FieldT::zero(); + for (size_t i = 0; i < A.size(); ++i) + { + A[i].evaluate(this->pb); + B[i].evaluate(this->pb); + + total += this->pb.lc_val(A[i]) * this->pb.lc_val(B[i]); + this->pb.val(i == A.size()-1 ? result : S[i]) = total; + } +} + +template +void test_inner_product_gadget(const size_t n) +{ + printf("testing inner_product_gadget on all %zu bit strings\n", n); + + protoboard pb; + pb_variable_array A; + A.allocate(pb, n, "A"); + pb_variable_array B; + B.allocate(pb, n, "B"); + + pb_variable result; + result.allocate(pb, "result"); + + inner_product_gadget g(pb, A, B, result, "g"); + g.generate_r1cs_constraints(); + + for (size_t i = 0; i < 1ul< +void loose_multiplexing_gadget::generate_r1cs_constraints() +{ + /* \alpha_i (index - i) = 0 */ + for (size_t i = 0; i < arr.size(); ++i) + { + this->pb.add_r1cs_constraint( + r1cs_constraint(alpha[i], index - i, 0), + FMT(this->annotation_prefix, " alpha_%zu", i)); + } + + /* 1 * (\sum \alpha_i) = success_flag */ + linear_combination a, b, c; + a.add_term(ONE); + for (size_t i = 0; i < arr.size(); ++i) + { + b.add_term(alpha[i]); + } + c.add_term(success_flag); + this->pb.add_r1cs_constraint(r1cs_constraint(a, b, c), FMT(this->annotation_prefix, " main_constraint")); + + /* now success_flag is constrained to either 0 (if index is out of + range) or \alpha_i. constrain it and \alpha_i to zero */ + generate_boolean_r1cs_constraint(this->pb, success_flag, FMT(this->annotation_prefix, " success_flag")); + + /* compute result */ + compute_result->generate_r1cs_constraints(); +} + +template +void loose_multiplexing_gadget::generate_r1cs_witness() +{ + /* assumes that idx can be fit in ulong; true for our purposes for now */ + const bigint valint = this->pb.val(index).as_bigint(); + unsigned long idx = valint.as_ulong(); + const bigint arrsize(arr.size()); + + if (idx >= arr.size() || mpn_cmp(valint.data, arrsize.data, FieldT::num_limbs) >= 0) + { + for (size_t i = 0; i < arr.size(); ++i) + { + this->pb.val(alpha[i]) = FieldT::zero(); + } + + this->pb.val(success_flag) = FieldT::zero(); + } + else + { + for (size_t i = 0; i < arr.size(); ++i) + { + this->pb.val(alpha[i]) = (i == idx ? FieldT::one() : FieldT::zero()); + } + + this->pb.val(success_flag) = FieldT::one(); + } + + compute_result->generate_r1cs_witness(); +} + +template +void test_loose_multiplexing_gadget(const size_t n) +{ + printf("testing loose_multiplexing_gadget on 2**%zu pb_variable array inputs\n", n); + protoboard pb; + + pb_variable_array arr; + arr.allocate(pb, 1ul< index, result, success_flag; + index.allocate(pb, "index"); + result.allocate(pb, "result"); + success_flag.allocate(pb, "success_flag"); + + loose_multiplexing_gadget g(pb, arr, index, result, success_flag, "g"); + g.generate_r1cs_constraints(); + + for (size_t i = 0; i < 1ul< +void create_linear_combination_constraints(protoboard &pb, + const std::vector &base, + const std::vector > &v, + const VarT &target, + const std::string &annotation_prefix) +{ + for (size_t i = 0; i < base.size(); ++i) + { + linear_combination a, b, c; + + a.add_term(ONE); + b.add_term(ONE, base[i]); + + for (auto &p : v) + { + b.add_term(p.first.all_vars[i], p.second); + } + + c.add_term(target.all_vars[i]); + + pb.add_r1cs_constraint(r1cs_constraint(a, b, c), FMT(annotation_prefix, " linear_combination_%zu", i)); + } +} + +template +void create_linear_combination_witness(protoboard &pb, + const std::vector &base, + const std::vector > &v, + const VarT &target) +{ + for (size_t i = 0; i < base.size(); ++i) + { + pb.val(target.all_vars[i]) = base[i]; + + for (auto &p : v) + { + pb.val(target.all_vars[i]) += p.second * pb.val(p.first.all_vars[i]); + } + } +} + +} // libsnark +#endif // BASIC_GADGETS_TCC_ diff --git a/src/gadgetlib1/gadgets/gadget_from_r1cs.hpp b/src/gadgetlib1/gadgets/gadget_from_r1cs.hpp new file mode 100644 index 000000000..e4b8a2acf --- /dev/null +++ b/src/gadgetlib1/gadgets/gadget_from_r1cs.hpp @@ -0,0 +1,45 @@ +/** @file + ***************************************************************************** + + Declaration of interfaces for a gadget that can be created from an R1CS constraint system. + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef GADGET_FROM_R1CS_HPP_ +#define GADGET_FROM_R1CS_HPP_ + +#include + +#include "gadgetlib1/gadget.hpp" + +namespace libsnark { + +template +class gadget_from_r1cs : public gadget { + +private: + const std::vector > vars; + const r1cs_constraint_system cs; + std::map cs_to_vars; + +public: + + gadget_from_r1cs(protoboard &pb, + const std::vector > &vars, + const r1cs_constraint_system &cs, + const std::string &annotation_prefix); + + void generate_r1cs_constraints(); + void generate_r1cs_witness(const r1cs_primary_input &primary_input, + const r1cs_auxiliary_input &auxiliary_input); +}; + +} // libsnark + +#include "gadgetlib1/gadgets/gadget_from_r1cs.tcc" + +#endif // GADGET_FROM_R1CS_HPP_ diff --git a/src/gadgetlib1/gadgets/gadget_from_r1cs.tcc b/src/gadgetlib1/gadgets/gadget_from_r1cs.tcc new file mode 100644 index 000000000..bc59b4587 --- /dev/null +++ b/src/gadgetlib1/gadgets/gadget_from_r1cs.tcc @@ -0,0 +1,123 @@ +/** @file + ***************************************************************************** + + Implementation of interfaces for a gadget that can be created from an R1CS constraint system. + + See gadget_from_r1cs.hpp . + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef GADGET_FROM_R1CS_TCC_ +#define GADGET_FROM_R1CS_TCC_ + +namespace libsnark { + +template +gadget_from_r1cs::gadget_from_r1cs(protoboard &pb, + const std::vector > &vars, + const r1cs_constraint_system &cs, + const std::string &annotation_prefix) : + gadget(pb, annotation_prefix), + vars(vars), + cs(cs) +{ + cs_to_vars[0] = 0; /* constant term maps to constant term */ + + size_t cs_var_idx = 1; + for (auto va : vars) + { +#ifdef DEBUG + printf("gadget_from_r1cs: translating a block of variables with length %zu\n", va.size()); +#endif + for (auto v : va) + { + cs_to_vars[cs_var_idx] = v.index; + +#ifdef DEBUG + if (v.index != 0) + { + // handle annotations, except for re-annotating constant term + const std::map::const_iterator it = cs.variable_annotations.find(cs_var_idx); + + std::string annotation = FMT(annotation_prefix, " variable_%zu", cs_var_idx); + if (it != cs.variable_annotations.end()) + { + annotation = annotation_prefix + " " + it->second; + } + + pb.augment_variable_annotation(v, annotation); + } +#endif + ++cs_var_idx; + } + } + +#ifdef DEBUG + printf("gadget_from_r1cs: sum of all block lengths: %zu\n", cs_var_idx-1); + printf("gadget_from_r1cs: cs.num_variables(): %zu\n", cs.num_variables()); +#endif + + assert(cs_var_idx - 1 == cs.num_variables()); +} + +template +void gadget_from_r1cs::generate_r1cs_constraints() +{ + for (size_t i = 0; i < cs.num_constraints(); ++i) + { + const r1cs_constraint &constr = cs.constraints[i]; + r1cs_constraint translated_constr; + + for (const linear_term &t: constr.a.terms) + { + translated_constr.a.terms.emplace_back(linear_term(pb_variable(cs_to_vars[t.index]), t.coeff)); + } + + for (const linear_term &t: constr.b.terms) + { + translated_constr.b.terms.emplace_back(linear_term(pb_variable(cs_to_vars[t.index]), t.coeff)); + } + + for (const linear_term &t: constr.c.terms) + { + translated_constr.c.terms.emplace_back(linear_term(pb_variable(cs_to_vars[t.index]), t.coeff)); + } + + std::string annotation = FMT(this->annotation_prefix, " constraint_%zu", i); + +#ifdef DEBUG + auto it = cs.constraint_annotations.find(i); + if (it != cs.constraint_annotations.end()) + { + annotation = this->annotation_prefix + " " + it->second; + } +#endif + this->pb.add_r1cs_constraint(translated_constr, annotation); + } +} + +template +void gadget_from_r1cs::generate_r1cs_witness(const r1cs_primary_input &primary_input, + const r1cs_auxiliary_input &auxiliary_input) +{ + assert(cs.num_inputs() == primary_input.size()); + assert(cs.num_variables() == primary_input.size() + auxiliary_input.size()); + + for (size_t i = 0; i < primary_input.size(); ++i) + { + this->pb.val(pb_variable(cs_to_vars[i+1])) = primary_input[i]; + } + + for (size_t i = 0; i < auxiliary_input.size(); ++i) + { + this->pb.val(pb_variable(cs_to_vars[primary_input.size()+i+1])) = auxiliary_input[i]; + } +} + +} // libsnark + +#endif // GADGET_FROM_R1CS_TCC_ diff --git a/src/gadgetlib1/gadgets/hashes/digest_selector_gadget.hpp b/src/gadgetlib1/gadgets/hashes/digest_selector_gadget.hpp new file mode 100644 index 000000000..a7598b9be --- /dev/null +++ b/src/gadgetlib1/gadgets/hashes/digest_selector_gadget.hpp @@ -0,0 +1,42 @@ +/** + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ +#ifndef DIGEST_SELECTOR_GADGET_HPP_ +#define DIGEST_SELECTOR_GADGET_HPP_ + +#include + +#include "gadgetlib1/gadgets/basic_gadgets.hpp" +#include "gadgetlib1/gadgets/hashes/hash_io.hpp" + +namespace libsnark { + +template +class digest_selector_gadget : public gadget { +public: + size_t digest_size; + digest_variable input; + pb_linear_combination is_right; + digest_variable left; + digest_variable right; + + digest_selector_gadget(protoboard &pb, + const size_t digest_size, + const digest_variable &input, + const pb_linear_combination &is_right, + const digest_variable &left, + const digest_variable &right, + const std::string &annotation_prefix); + + void generate_r1cs_constraints(); + void generate_r1cs_witness(); +}; + +} // libsnark + +#include "gadgetlib1/gadgets/hashes/digest_selector_gadget.tcc" + +#endif // DIGEST_SELECTOR_GADGET_HPP_ diff --git a/src/gadgetlib1/gadgets/hashes/digest_selector_gadget.tcc b/src/gadgetlib1/gadgets/hashes/digest_selector_gadget.tcc new file mode 100644 index 000000000..422ee170a --- /dev/null +++ b/src/gadgetlib1/gadgets/hashes/digest_selector_gadget.tcc @@ -0,0 +1,62 @@ +/** + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ +#ifndef DIGEST_SELECTOR_GADGET_TCC_ +#define DIGEST_SELECTOR_GADGET_TCC_ + +namespace libsnark { + +template +digest_selector_gadget::digest_selector_gadget(protoboard &pb, + const size_t digest_size, + const digest_variable &input, + const pb_linear_combination &is_right, + const digest_variable &left, + const digest_variable &right, + const std::string &annotation_prefix) : +gadget(pb, annotation_prefix), digest_size(digest_size), input(input), is_right(is_right), left(left), right(right) +{ +} + +template +void digest_selector_gadget::generate_r1cs_constraints() +{ + for (size_t i = 0; i < digest_size; ++i) + { + /* + input = is_right * right + (1-is_right) * left + input - left = is_right(right - left) + */ + this->pb.add_r1cs_constraint(r1cs_constraint(is_right, right.bits[i] - left.bits[i], input.bits[i] - left.bits[i]), + FMT(this->annotation_prefix, " propagate_%zu", i)); + } +} + +template +void digest_selector_gadget::generate_r1cs_witness() +{ + is_right.evaluate(this->pb); + + assert(this->pb.lc_val(is_right) == FieldT::one() || this->pb.lc_val(is_right) == FieldT::zero()); + if (this->pb.lc_val(is_right) == FieldT::one()) + { + for (size_t i = 0; i < digest_size; ++i) + { + this->pb.val(right.bits[i]) = this->pb.val(input.bits[i]); + } + } + else + { + for (size_t i = 0; i < digest_size; ++i) + { + this->pb.val(left.bits[i]) = this->pb.val(input.bits[i]); + } + } +} + +} // libsnark + +#endif // DIGEST_SELECTOR_GADGET_TCC_ diff --git a/src/gadgetlib1/gadgets/hashes/hash_io.hpp b/src/gadgetlib1/gadgets/hashes/hash_io.hpp new file mode 100644 index 000000000..80ca19c61 --- /dev/null +++ b/src/gadgetlib1/gadgets/hashes/hash_io.hpp @@ -0,0 +1,63 @@ +/** + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ +#ifndef HASH_IO_HPP_ +#define HASH_IO_HPP_ +#include +#include +#include "gadgetlib1/gadgets/basic_gadgets.hpp" + +namespace libsnark { + +template +class digest_variable : public gadget { +public: + size_t digest_size; + pb_variable_array bits; + + digest_variable(protoboard &pb, + const size_t digest_size, + const std::string &annotation_prefix); + + digest_variable(protoboard &pb, + const size_t digest_size, + const pb_variable_array &partial_bits, + const pb_variable &padding, + const std::string &annotation_prefix); + + void generate_r1cs_constraints(); + void generate_r1cs_witness(const bit_vector& contents); + bit_vector get_digest() const; +}; + +template +class block_variable : public gadget { +public: + size_t block_size; + pb_variable_array bits; + + block_variable(protoboard &pb, + const size_t block_size, + const std::string &annotation_prefix); + + block_variable(protoboard &pb, + const std::vector > &parts, + const std::string &annotation_prefix); + + block_variable(protoboard &pb, + const digest_variable &left, + const digest_variable &right, + const std::string &annotation_prefix); + + void generate_r1cs_constraints(); + void generate_r1cs_witness(const bit_vector& contents); + bit_vector get_block() const; +}; + +} // libsnark +#include "gadgetlib1/gadgets/hashes/hash_io.tcc" + +#endif // HASH_IO_HPP_ diff --git a/src/gadgetlib1/gadgets/hashes/hash_io.tcc b/src/gadgetlib1/gadgets/hashes/hash_io.tcc new file mode 100644 index 000000000..b122d8f98 --- /dev/null +++ b/src/gadgetlib1/gadgets/hashes/hash_io.tcc @@ -0,0 +1,105 @@ +/** + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ +#ifndef HASH_IO_TCC_ +#define HASH_IO_TCC_ + +namespace libsnark { + +template +digest_variable::digest_variable(protoboard &pb, + const size_t digest_size, + const std::string &annotation_prefix) : + gadget(pb, annotation_prefix), digest_size(digest_size) +{ + bits.allocate(pb, digest_size, FMT(this->annotation_prefix, " bits")); +} + +template +digest_variable::digest_variable(protoboard &pb, + const size_t digest_size, + const pb_variable_array &partial_bits, + const pb_variable &padding, + const std::string &annotation_prefix) : + gadget(pb, annotation_prefix), digest_size(digest_size) +{ + assert(bits.size() <= digest_size); + bits = partial_bits; + while (bits.size() != digest_size) + { + bits.emplace_back(padding); + } +} + +template +void digest_variable::generate_r1cs_constraints() +{ + for (size_t i = 0; i < digest_size; ++i) + { + generate_boolean_r1cs_constraint(this->pb, bits[i], FMT(this->annotation_prefix, " bits_%zu", i)); + } +} + +template +void digest_variable::generate_r1cs_witness(const bit_vector& contents) +{ + bits.fill_with_bits(this->pb, contents); +} + +template +bit_vector digest_variable::get_digest() const +{ + return bits.get_bits(this->pb); +} + +template +block_variable::block_variable(protoboard &pb, + const size_t block_size, + const std::string &annotation_prefix) : + gadget(pb, annotation_prefix), block_size(block_size) +{ + bits.allocate(pb, block_size, FMT(this->annotation_prefix, " bits")); +} + +template +block_variable::block_variable(protoboard &pb, + const std::vector > &parts, + const std::string &annotation_prefix) : + gadget(pb, annotation_prefix) +{ + for (auto &part : parts) + { + bits.insert(bits.end(), part.begin(), part.end()); + } +} + +template +block_variable::block_variable(protoboard &pb, + const digest_variable &left, + const digest_variable &right, + const std::string &annotation_prefix) : + gadget(pb, annotation_prefix) +{ + assert(left.bits.size() == right.bits.size()); + block_size = 2 * left.bits.size(); + bits.insert(bits.end(), left.bits.begin(), left.bits.end()); + bits.insert(bits.end(), right.bits.begin(), right.bits.end()); +} + +template +void block_variable::generate_r1cs_witness(const bit_vector& contents) +{ + bits.fill_with_bits(this->pb, contents); +} + +template +bit_vector block_variable::get_block() const +{ + return bits.get_bits(this->pb); +} + +} // libsnark +#endif // HASH_IO_TCC_ diff --git a/src/gadgetlib1/gadgets/hashes/sha256/sha256_aux.hpp b/src/gadgetlib1/gadgets/hashes/sha256/sha256_aux.hpp new file mode 100644 index 000000000..e0c7a7e0b --- /dev/null +++ b/src/gadgetlib1/gadgets/hashes/sha256/sha256_aux.hpp @@ -0,0 +1,160 @@ +/** @file + ***************************************************************************** + + Declaration of interfaces for auxiliary gadgets for the SHA256 gadget. + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef SHA256_AUX_HPP_ +#define SHA256_AUX_HPP_ + +#include "gadgetlib1/gadgets/basic_gadgets.hpp" + +namespace libsnark { + +template +class lastbits_gadget : public gadget { +public: + pb_variable X; + size_t X_bits; + pb_variable result; + pb_linear_combination_array result_bits; + + pb_linear_combination_array full_bits; + std::shared_ptr > unpack_bits; + std::shared_ptr > pack_result; + + lastbits_gadget(protoboard &pb, + const pb_variable &X, + const size_t X_bits, + const pb_variable &result, + const pb_linear_combination_array &result_bits, + const std::string &annotation_prefix); + + void generate_r1cs_constraints(); + void generate_r1cs_witness(); +}; + +template +class XOR3_gadget : public gadget { +private: + pb_variable tmp; +public: + pb_linear_combination A; + pb_linear_combination B; + pb_linear_combination C; + bool assume_C_is_zero; + pb_linear_combination out; + + XOR3_gadget(protoboard &pb, + const pb_linear_combination &A, + const pb_linear_combination &B, + const pb_linear_combination &C, + const bool assume_C_is_zero, + const pb_linear_combination &out, + const std::string &annotation_prefix); + + void generate_r1cs_constraints(); + void generate_r1cs_witness(); +}; + +/* Page 10 of http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf */ +template +class small_sigma_gadget : public gadget { +private: + pb_variable_array W; + pb_variable result; +public: + pb_variable_array result_bits; + std::vector > > compute_bits; + std::shared_ptr > pack_result; + + small_sigma_gadget(protoboard &pb, + const pb_variable_array &W, + const pb_variable &result, + const size_t rot1, + const size_t rot2, + const size_t shift, + const std::string &annotation_prefix); + + void generate_r1cs_constraints(); + void generate_r1cs_witness(); +}; + +/* Page 10 of http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf */ +template +class big_sigma_gadget : public gadget { +private: + pb_linear_combination_array W; + pb_variable result; +public: + pb_variable_array result_bits; + std::vector > > compute_bits; + std::shared_ptr > pack_result; + + big_sigma_gadget(protoboard &pb, + const pb_linear_combination_array &W, + const pb_variable &result, + const size_t rot1, + const size_t rot2, + const size_t rot3, + const std::string &annotation_prefix); + + void generate_r1cs_constraints(); + void generate_r1cs_witness(); +}; + +/* Page 10 of http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf */ +template +class choice_gadget : public gadget { +private: + pb_variable_array result_bits; +public: + pb_linear_combination_array X; + pb_linear_combination_array Y; + pb_linear_combination_array Z; + pb_variable result; + std::shared_ptr > pack_result; + + choice_gadget(protoboard &pb, + const pb_linear_combination_array &X, + const pb_linear_combination_array &Y, + const pb_linear_combination_array &Z, + const pb_variable &result, const std::string &annotation_prefix); + + void generate_r1cs_constraints(); + void generate_r1cs_witness(); +}; + +/* Page 10 of http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf */ +template +class majority_gadget : public gadget { +private: + pb_variable_array result_bits; + std::shared_ptr > pack_result; +public: + pb_linear_combination_array X; + pb_linear_combination_array Y; + pb_linear_combination_array Z; + pb_variable result; + + majority_gadget(protoboard &pb, + const pb_linear_combination_array &X, + const pb_linear_combination_array &Y, + const pb_linear_combination_array &Z, + const pb_variable &result, + const std::string &annotation_prefix); + + void generate_r1cs_constraints(); + void generate_r1cs_witness(); +}; + +} // libsnark + +#include "gadgetlib1/gadgets/hashes/sha256/sha256_aux.tcc" + +#endif // SHA256_AUX_HPP_ diff --git a/src/gadgetlib1/gadgets/hashes/sha256/sha256_aux.tcc b/src/gadgetlib1/gadgets/hashes/sha256/sha256_aux.tcc new file mode 100644 index 000000000..8ab67be5f --- /dev/null +++ b/src/gadgetlib1/gadgets/hashes/sha256/sha256_aux.tcc @@ -0,0 +1,297 @@ +/** @file + ***************************************************************************** + + Implementation of interfaces for auxiliary gadgets for the SHA256 gadget. + + See sha256_aux.hpp . + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef SHA256_AUX_TCC_ +#define SHA256_AUX_TCC_ + +namespace libsnark { + +template +lastbits_gadget::lastbits_gadget(protoboard &pb, + const pb_variable &X, + const size_t X_bits, + const pb_variable &result, + const pb_linear_combination_array &result_bits, + const std::string &annotation_prefix) : + gadget(pb, annotation_prefix), + X(X), + X_bits(X_bits), + result(result), + result_bits(result_bits) +{ + full_bits = result_bits; + for (size_t i = result_bits.size(); i < X_bits; ++i) + { + pb_variable full_bits_overflow; + full_bits_overflow.allocate(pb, FMT(this->annotation_prefix, " full_bits_%zu", i)); + full_bits.emplace_back(full_bits_overflow); + } + + unpack_bits.reset(new packing_gadget(pb, full_bits, X, FMT(this->annotation_prefix, " unpack_bits"))); + pack_result.reset(new packing_gadget(pb, result_bits, result, FMT(this->annotation_prefix, " pack_result"))); +} + +template +void lastbits_gadget::generate_r1cs_constraints() +{ + unpack_bits->generate_r1cs_constraints(true); + pack_result->generate_r1cs_constraints(false); +} + +template +void lastbits_gadget::generate_r1cs_witness() +{ + unpack_bits->generate_r1cs_witness_from_packed(); + pack_result->generate_r1cs_witness_from_bits(); +} + +template +XOR3_gadget::XOR3_gadget(protoboard &pb, + const pb_linear_combination &A, + const pb_linear_combination &B, + const pb_linear_combination &C, + const bool assume_C_is_zero, + const pb_linear_combination &out, + const std::string &annotation_prefix) : + gadget(pb, annotation_prefix), + A(A), + B(B), + C(C), + assume_C_is_zero(assume_C_is_zero), + out(out) +{ + if (!assume_C_is_zero) + { + tmp.allocate(pb, FMT(this->annotation_prefix, " tmp")); + } +} + +template +void XOR3_gadget::generate_r1cs_constraints() +{ + /* + tmp = A + B - 2AB i.e. tmp = A xor B + out = tmp + C - 2tmp C i.e. out = tmp xor C + */ + if (assume_C_is_zero) + { + this->pb.add_r1cs_constraint(r1cs_constraint(2*A, B, A + B - out), FMT(this->annotation_prefix, " implicit_tmp_equals_out")); + } + else + { + this->pb.add_r1cs_constraint(r1cs_constraint(2*A, B, A + B - tmp), FMT(this->annotation_prefix, " tmp")); + this->pb.add_r1cs_constraint(r1cs_constraint(2 * tmp, C, tmp + C - out), FMT(this->annotation_prefix, " out")); + } +} + +template +void XOR3_gadget::generate_r1cs_witness() +{ + if (assume_C_is_zero) + { + this->pb.lc_val(out) = this->pb.lc_val(A) + this->pb.lc_val(B) - FieldT(2) * this->pb.lc_val(A) * this->pb.lc_val(B); + } + else + { + this->pb.val(tmp) = this->pb.lc_val(A) + this->pb.lc_val(B) - FieldT(2) * this->pb.lc_val(A) * this->pb.lc_val(B); + this->pb.lc_val(out) = this->pb.val(tmp) + this->pb.lc_val(C) - FieldT(2) * this->pb.val(tmp) * this->pb.lc_val(C); + } +} + +#define SHA256_GADGET_ROTR(A, i, k) A[((i)+(k)) % 32] + +/* Page 10 of http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf */ +template +small_sigma_gadget::small_sigma_gadget(protoboard &pb, + const pb_variable_array &W, + const pb_variable &result, + const size_t rot1, + const size_t rot2, + const size_t shift, + const std::string &annotation_prefix) : + gadget(pb, annotation_prefix), + W(W), + result(result) +{ + result_bits.allocate(pb, 32, FMT(this->annotation_prefix, " result_bits")); + compute_bits.resize(32); + for (size_t i = 0; i < 32; ++i) + { + compute_bits[i].reset(new XOR3_gadget(pb, SHA256_GADGET_ROTR(W, i, rot1), SHA256_GADGET_ROTR(W, i, rot2), + (i + shift < 32 ? W[i+shift] : ONE), + (i + shift >= 32), result_bits[i], + FMT(this->annotation_prefix, " compute_bits_%zu", i))); + } + pack_result.reset(new packing_gadget(pb, result_bits, result, FMT(this->annotation_prefix, " pack_result"))); +} + +template +void small_sigma_gadget::generate_r1cs_constraints() +{ + for (size_t i = 0; i < 32; ++i) + { + compute_bits[i]->generate_r1cs_constraints(); + } + + pack_result->generate_r1cs_constraints(false); +} + +template +void small_sigma_gadget::generate_r1cs_witness() +{ + for (size_t i = 0; i < 32; ++i) + { + compute_bits[i]->generate_r1cs_witness(); + } + + pack_result->generate_r1cs_witness_from_bits(); +} + +template +big_sigma_gadget::big_sigma_gadget(protoboard &pb, + const pb_linear_combination_array &W, + const pb_variable &result, + const size_t rot1, + const size_t rot2, + const size_t rot3, + const std::string &annotation_prefix) : + gadget(pb, annotation_prefix), + W(W), + result(result) +{ + result_bits.allocate(pb, 32, FMT(this->annotation_prefix, " result_bits")); + compute_bits.resize(32); + for (size_t i = 0; i < 32; ++i) + { + compute_bits[i].reset(new XOR3_gadget(pb, SHA256_GADGET_ROTR(W, i, rot1), SHA256_GADGET_ROTR(W, i, rot2), SHA256_GADGET_ROTR(W, i, rot3), false, result_bits[i], + FMT(this->annotation_prefix, " compute_bits_%zu", i))); + } + + pack_result.reset(new packing_gadget(pb, result_bits, result, FMT(this->annotation_prefix, " pack_result"))); +} + +template +void big_sigma_gadget::generate_r1cs_constraints() +{ + for (size_t i = 0; i < 32; ++i) + { + compute_bits[i]->generate_r1cs_constraints(); + } + + pack_result->generate_r1cs_constraints(false); +} + +template +void big_sigma_gadget::generate_r1cs_witness() +{ + for (size_t i = 0; i < 32; ++i) + { + compute_bits[i]->generate_r1cs_witness(); + } + + pack_result->generate_r1cs_witness_from_bits(); +} + +/* Page 10 of http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf */ +template +choice_gadget::choice_gadget(protoboard &pb, + const pb_linear_combination_array &X, + const pb_linear_combination_array &Y, + const pb_linear_combination_array &Z, + const pb_variable &result, const std::string &annotation_prefix) : + gadget(pb, annotation_prefix), + X(X), + Y(Y), + Z(Z), + result(result) +{ + result_bits.allocate(pb, 32, FMT(this->annotation_prefix, " result_bits")); + pack_result.reset(new packing_gadget(pb, result_bits, result, FMT(this->annotation_prefix, " result"))); +} + +template +void choice_gadget::generate_r1cs_constraints() +{ + for (size_t i = 0; i < 32; ++i) + { + /* + result = x * y + (1-x) * z + result - z = x * (y - z) + */ + this->pb.add_r1cs_constraint(r1cs_constraint(X[i], Y[i] - Z[i], result_bits[i] - Z[i]), FMT(this->annotation_prefix, " result_bits_%zu", i)); + } + pack_result->generate_r1cs_constraints(false); +} + +template +void choice_gadget::generate_r1cs_witness() +{ + for (size_t i = 0; i < 32; ++i) + { + this->pb.val(result_bits[i]) = this->pb.lc_val(X[i]) * this->pb.lc_val(Y[i]) + (FieldT::one() - this->pb.lc_val(X[i])) * this->pb.lc_val(Z[i]); + } + pack_result->generate_r1cs_witness_from_bits(); +} + +/* Page 10 of http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf */ +template +majority_gadget::majority_gadget(protoboard &pb, + const pb_linear_combination_array &X, + const pb_linear_combination_array &Y, + const pb_linear_combination_array &Z, + const pb_variable &result, + const std::string &annotation_prefix) : + gadget(pb, annotation_prefix), + X(X), + Y(Y), + Z(Z), + result(result) +{ + result_bits.allocate(pb, 32, FMT(this->annotation_prefix, " result_bits")); + pack_result.reset(new packing_gadget(pb, result_bits, result, FMT(this->annotation_prefix, " result"))); +} + +template +void majority_gadget::generate_r1cs_constraints() +{ + for (size_t i = 0; i < 32; ++i) + { + /* + 2*result + aux = x + y + z + x, y, z, aux -- bits + aux = x + y + z - 2*result + */ + generate_boolean_r1cs_constraint(this->pb, result_bits[i], FMT(this->annotation_prefix, " result_%zu", i)); + this->pb.add_r1cs_constraint(r1cs_constraint(X[i] + Y[i] + Z[i] - 2 * result_bits[i], + 1 - (X[i] + Y[i] + Z[i] - 2 * result_bits[i]), + 0), + FMT(this->annotation_prefix, " result_bits_%zu", i)); + } + pack_result->generate_r1cs_constraints(false); +} + +template +void majority_gadget::generate_r1cs_witness() +{ + for (size_t i = 0; i < 32; ++i) + { + const long v = (this->pb.lc_val(X[i]) + this->pb.lc_val(Y[i]) + this->pb.lc_val(Z[i])).as_ulong(); + this->pb.val(result_bits[i]) = FieldT(v / 2); + } + + pack_result->generate_r1cs_witness_from_bits(); +} + +} // libsnark + +#endif // SHA256_AUX_TCC_ diff --git a/src/gadgetlib1/gadgets/hashes/sha256/sha256_components.hpp b/src/gadgetlib1/gadgets/hashes/sha256/sha256_components.hpp new file mode 100644 index 000000000..c2f31e3af --- /dev/null +++ b/src/gadgetlib1/gadgets/hashes/sha256/sha256_components.hpp @@ -0,0 +1,108 @@ +/** @file + ***************************************************************************** + + Declaration of interfaces for gadgets for the SHA256 message schedule and round function. + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef SHA256_COMPONENTS_HPP_ +#define SHA256_COMPONENTS_HPP_ + +#include "gadgetlib1/gadgets/basic_gadgets.hpp" +#include "gadgetlib1/gadgets/hashes/hash_io.hpp" +#include "gadgetlib1/gadgets/hashes/sha256/sha256_aux.hpp" + +namespace libsnark { + +const size_t SHA256_digest_size = 256; +const size_t SHA256_block_size = 512; + +template +pb_linear_combination_array SHA256_default_IV(protoboard &pb); + +template +class sha256_message_schedule_gadget : public gadget { +public: + std::vector > W_bits; + std::vector > > pack_W; + + std::vector > sigma0; + std::vector > sigma1; + std::vector > > compute_sigma0; + std::vector > > compute_sigma1; + std::vector > unreduced_W; + std::vector > > mod_reduce_W; +public: + pb_variable_array M; + pb_variable_array packed_W; + sha256_message_schedule_gadget(protoboard &pb, + const pb_variable_array &M, + const pb_variable_array &packed_W, + const std::string &annotation_prefix); + void generate_r1cs_constraints(); + void generate_r1cs_witness(); +}; + +template +class sha256_round_function_gadget : public gadget { +public: + pb_variable sigma0; + pb_variable sigma1; + std::shared_ptr > compute_sigma0; + std::shared_ptr > compute_sigma1; + pb_variable choice; + pb_variable majority; + std::shared_ptr > compute_choice; + std::shared_ptr > compute_majority; + pb_variable packed_d; + std::shared_ptr > pack_d; + pb_variable packed_h; + std::shared_ptr > pack_h; + pb_variable unreduced_new_a; + pb_variable unreduced_new_e; + std::shared_ptr > mod_reduce_new_a; + std::shared_ptr > mod_reduce_new_e; + pb_variable packed_new_a; + pb_variable packed_new_e; +public: + pb_linear_combination_array a; + pb_linear_combination_array b; + pb_linear_combination_array c; + pb_linear_combination_array d; + pb_linear_combination_array e; + pb_linear_combination_array f; + pb_linear_combination_array g; + pb_linear_combination_array h; + pb_variable W; + long K; + pb_linear_combination_array new_a; + pb_linear_combination_array new_e; + + sha256_round_function_gadget(protoboard &pb, + const pb_linear_combination_array &a, + const pb_linear_combination_array &b, + const pb_linear_combination_array &c, + const pb_linear_combination_array &d, + const pb_linear_combination_array &e, + const pb_linear_combination_array &f, + const pb_linear_combination_array &g, + const pb_linear_combination_array &h, + const pb_variable &W, + const long &K, + const pb_linear_combination_array &new_a, + const pb_linear_combination_array &new_e, + const std::string &annotation_prefix); + + void generate_r1cs_constraints(); + void generate_r1cs_witness(); +}; + +} // libsnark + +#include "gadgetlib1/gadgets/hashes/sha256/sha256_components.tcc" + +#endif // SHA256_COMPONENTS_HPP_ diff --git a/src/gadgetlib1/gadgets/hashes/sha256/sha256_components.tcc b/src/gadgetlib1/gadgets/hashes/sha256/sha256_components.tcc new file mode 100644 index 000000000..e8f233a54 --- /dev/null +++ b/src/gadgetlib1/gadgets/hashes/sha256/sha256_components.tcc @@ -0,0 +1,250 @@ +/** @file + ***************************************************************************** + + Implementation of interfaces for gadgets for the SHA256 message schedule and round function. + + See sha256_components.hpp . + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef SHA256_COMPONENTS_TCC_ +#define SHA256_COMPONENTS_TCC_ + +namespace libsnark { + +const unsigned long SHA256_K[64] = { + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 +}; + +const unsigned long SHA256_H[8] = { + 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 +}; + +template +pb_linear_combination_array SHA256_default_IV(protoboard &pb) +{ + pb_linear_combination_array result; + result.reserve(SHA256_digest_size); + + for (size_t i = 0; i < SHA256_digest_size; ++i) + { + int iv_val = (SHA256_H[i / 32] >> (31-(i % 32))) & 1; + + pb_linear_combination iv_element; + iv_element.assign(pb, iv_val * ONE); + iv_element.evaluate(pb); + + result.emplace_back(iv_element); + } + + return result; +} + +template +sha256_message_schedule_gadget::sha256_message_schedule_gadget(protoboard &pb, + const pb_variable_array &M, + const pb_variable_array &packed_W, + const std::string &annotation_prefix) : + gadget(pb, annotation_prefix), + M(M), + packed_W(packed_W) +{ + W_bits.resize(64); + + pack_W.resize(16); + for (size_t i = 0; i < 16; ++i) + { + W_bits[i] = pb_variable_array(M.rbegin() + (15-i) * 32, M.rbegin() + (16-i) * 32); + pack_W[i].reset(new packing_gadget(pb, W_bits[i], packed_W[i], FMT(this->annotation_prefix, " pack_W_%zu", i))); + } + + /* NB: some of those will be un-allocated */ + sigma0.resize(64); + sigma1.resize(64); + compute_sigma0.resize(64); + compute_sigma1.resize(64); + unreduced_W.resize(64); + mod_reduce_W.resize(64); + + for (size_t i = 16; i < 64; ++i) + { + /* allocate result variables for sigma0/sigma1 invocations */ + sigma0[i].allocate(pb, FMT(this->annotation_prefix, " sigma0_%zu", i)); + sigma1[i].allocate(pb, FMT(this->annotation_prefix, " sigma1_%zu", i)); + + /* compute sigma0/sigma1 */ + compute_sigma0[i].reset(new small_sigma_gadget(pb, W_bits[i-15], sigma0[i], 7, 18, 3, FMT(this->annotation_prefix, " compute_sigma0_%zu", i))); + compute_sigma1[i].reset(new small_sigma_gadget(pb, W_bits[i-2], sigma1[i], 17, 19, 10, FMT(this->annotation_prefix, " compute_sigma1_%zu", i))); + + /* unreduced_W = sigma0(W_{i-15}) + sigma1(W_{i-2}) + W_{i-7} + W_{i-16} before modulo 2^32 */ + unreduced_W[i].allocate(pb, FMT(this->annotation_prefix, "unreduced_W_%zu", i)); + + /* allocate the bit representation of packed_W[i] */ + W_bits[i].allocate(pb, 32, FMT(this->annotation_prefix, " W_bits_%zu", i)); + + /* and finally reduce this into packed and bit representations */ + mod_reduce_W[i].reset(new lastbits_gadget(pb, unreduced_W[i], 32+2, packed_W[i], W_bits[i], FMT(this->annotation_prefix, " mod_reduce_W_%zu", i))); + } +} + +template +void sha256_message_schedule_gadget::generate_r1cs_constraints() +{ + for (size_t i = 0; i < 16; ++i) + { + pack_W[i]->generate_r1cs_constraints(false); // do not enforce bitness here; caller be aware. + } + + for (size_t i = 16; i < 64; ++i) + { + compute_sigma0[i]->generate_r1cs_constraints(); + compute_sigma1[i]->generate_r1cs_constraints(); + + this->pb.add_r1cs_constraint(r1cs_constraint(1, + sigma0[i] + sigma1[i] + packed_W[i-16] + packed_W[i-7], + unreduced_W[i]), + FMT(this->annotation_prefix, " unreduced_W_%zu", i)); + + mod_reduce_W[i]->generate_r1cs_constraints(); + } +} + +template +void sha256_message_schedule_gadget::generate_r1cs_witness() +{ + for (size_t i = 0; i < 16; ++i) + { + pack_W[i]->generate_r1cs_witness_from_bits(); + } + + for (size_t i = 16; i < 64; ++i) + { + compute_sigma0[i]->generate_r1cs_witness(); + compute_sigma1[i]->generate_r1cs_witness(); + + this->pb.val(unreduced_W[i]) = this->pb.val(sigma0[i]) + this->pb.val(sigma1[i]) + this->pb.val(packed_W[i-16]) + this->pb.val(packed_W[i-7]); + mod_reduce_W[i]->generate_r1cs_witness(); + } +} + +template +sha256_round_function_gadget::sha256_round_function_gadget(protoboard &pb, + const pb_linear_combination_array &a, + const pb_linear_combination_array &b, + const pb_linear_combination_array &c, + const pb_linear_combination_array &d, + const pb_linear_combination_array &e, + const pb_linear_combination_array &f, + const pb_linear_combination_array &g, + const pb_linear_combination_array &h, + const pb_variable &W, + const long &K, + const pb_linear_combination_array &new_a, + const pb_linear_combination_array &new_e, + const std::string &annotation_prefix) : + gadget(pb, annotation_prefix), + a(a), + b(b), + c(c), + d(d), + e(e), + f(f), + g(g), + h(h), + W(W), + K(K), + new_a(new_a), + new_e(new_e) +{ + /* compute sigma0 and sigma1 */ + sigma0.allocate(pb, FMT(this->annotation_prefix, " sigma0")); + sigma1.allocate(pb, FMT(this->annotation_prefix, " sigma1")); + compute_sigma0.reset(new big_sigma_gadget(pb, a, sigma0, 2, 13, 22, FMT(this->annotation_prefix, " compute_sigma0"))); + compute_sigma1.reset(new big_sigma_gadget(pb, e, sigma1, 6, 11, 25, FMT(this->annotation_prefix, " compute_sigma1"))); + + /* compute choice */ + choice.allocate(pb, FMT(this->annotation_prefix, " choice")); + compute_choice.reset(new choice_gadget(pb, e, f, g, choice, FMT(this->annotation_prefix, " compute_choice"))); + + /* compute majority */ + majority.allocate(pb, FMT(this->annotation_prefix, " majority")); + compute_majority.reset(new majority_gadget(pb, a, b, c, majority, FMT(this->annotation_prefix, " compute_majority"))); + + /* pack d */ + packed_d.allocate(pb, FMT(this->annotation_prefix, " packed_d")); + pack_d.reset(new packing_gadget(pb, d, packed_d, FMT(this->annotation_prefix, " pack_d"))); + + /* pack h */ + packed_h.allocate(pb, FMT(this->annotation_prefix, " packed_h")); + pack_h.reset(new packing_gadget(pb, h, packed_h, FMT(this->annotation_prefix, " pack_h"))); + + /* compute the actual results for the round */ + unreduced_new_a.allocate(pb, FMT(this->annotation_prefix, " unreduced_new_a")); + unreduced_new_e.allocate(pb, FMT(this->annotation_prefix, " unreduced_new_e")); + + packed_new_a.allocate(pb, FMT(this->annotation_prefix, " packed_new_a")); + packed_new_e.allocate(pb, FMT(this->annotation_prefix, " packed_new_e")); + + mod_reduce_new_a.reset(new lastbits_gadget(pb, unreduced_new_a, 32+3, packed_new_a, new_a, FMT(this->annotation_prefix, " mod_reduce_new_a"))); + mod_reduce_new_e.reset(new lastbits_gadget(pb, unreduced_new_e, 32+3, packed_new_e, new_e, FMT(this->annotation_prefix, " mod_reduce_new_e"))); +} + +template +void sha256_round_function_gadget::generate_r1cs_constraints() +{ + compute_sigma0->generate_r1cs_constraints(); + compute_sigma1->generate_r1cs_constraints(); + + compute_choice->generate_r1cs_constraints(); + compute_majority->generate_r1cs_constraints(); + + pack_d->generate_r1cs_constraints(false); + pack_h->generate_r1cs_constraints(false); + + this->pb.add_r1cs_constraint(r1cs_constraint(1, + packed_h + sigma1 + choice + K + W + sigma0 + majority, + unreduced_new_a), + FMT(this->annotation_prefix, " unreduced_new_a")); + + this->pb.add_r1cs_constraint(r1cs_constraint(1, + packed_d + packed_h + sigma1 + choice + K + W, + unreduced_new_e), + FMT(this->annotation_prefix, " unreduced_new_e")); + + mod_reduce_new_a->generate_r1cs_constraints(); + mod_reduce_new_e->generate_r1cs_constraints(); +} + +template +void sha256_round_function_gadget::generate_r1cs_witness() +{ + compute_sigma0->generate_r1cs_witness(); + compute_sigma1->generate_r1cs_witness(); + + compute_choice->generate_r1cs_witness(); + compute_majority->generate_r1cs_witness(); + + pack_d->generate_r1cs_witness_from_bits(); + pack_h->generate_r1cs_witness_from_bits(); + + this->pb.val(unreduced_new_a) = this->pb.val(packed_h) + this->pb.val(sigma1) + this->pb.val(choice) + FieldT(K) + this->pb.val(W) + this->pb.val(sigma0) + this->pb.val(majority); + this->pb.val(unreduced_new_e) = this->pb.val(packed_d) + this->pb.val(packed_h) + this->pb.val(sigma1) + this->pb.val(choice) + FieldT(K) + this->pb.val(W); + + mod_reduce_new_a->generate_r1cs_witness(); + mod_reduce_new_e->generate_r1cs_witness(); +} + +} // libsnark + +#endif // SHA256_COMPONENTS_TCC_ diff --git a/src/gadgetlib1/gadgets/hashes/sha256/sha256_gadget.hpp b/src/gadgetlib1/gadgets/hashes/sha256/sha256_gadget.hpp new file mode 100644 index 000000000..8cb6365c8 --- /dev/null +++ b/src/gadgetlib1/gadgets/hashes/sha256/sha256_gadget.hpp @@ -0,0 +1,98 @@ +/** @file + ***************************************************************************** + + Declaration of interfaces for top-level SHA256 gadgets. + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef SHA256_GADGET_HPP_ +#define SHA256_GADGET_HPP_ + +#include "common/data_structures/merkle_tree.hpp" +#include "gadgetlib1/gadgets/basic_gadgets.hpp" +#include "gadgetlib1/gadgets/hashes/hash_io.hpp" +#include "gadgetlib1/gadgets/hashes/sha256/sha256_components.hpp" + +namespace libsnark { + +/** + * Gadget for the SHA256 compression function. + */ +template +class sha256_compression_function_gadget : public gadget { +public: + std::vector > round_a; + std::vector > round_b; + std::vector > round_c; + std::vector > round_d; + std::vector > round_e; + std::vector > round_f; + std::vector > round_g; + std::vector > round_h; + + pb_variable_array packed_W; + std::shared_ptr > message_schedule; + std::vector > round_functions; + + pb_variable_array unreduced_output; + pb_variable_array reduced_output; + std::vector > reduce_output; +public: + pb_linear_combination_array prev_output; + pb_variable_array new_block; + digest_variable output; + + sha256_compression_function_gadget(protoboard &pb, + const pb_linear_combination_array &prev_output, + const pb_variable_array &new_block, + const digest_variable &output, + const std::string &annotation_prefix); + void generate_r1cs_constraints(); + void generate_r1cs_witness(); +}; + +/** + * Gadget for the SHA256 compression function, viewed as a 2-to-1 hash + * function, and using the same initialization vector as in SHA256 + * specification. Thus, any collision for + * sha256_two_to_one_hash_gadget trivially extends to a collision for + * full SHA256 (by appending the same padding). + */ +template +class sha256_two_to_one_hash_gadget : public gadget { +public: + typedef bit_vector hash_value_type; + typedef merkle_authentication_path merkle_authentication_path_type; + + std::shared_ptr > f; + + sha256_two_to_one_hash_gadget(protoboard &pb, + const digest_variable &left, + const digest_variable &right, + const digest_variable &output, + const std::string &annotation_prefix); + sha256_two_to_one_hash_gadget(protoboard &pb, + const size_t block_length, + const block_variable &input_block, + const digest_variable &output, + const std::string &annotation_prefix); + + void generate_r1cs_constraints(const bool ensure_output_bitness=true); // TODO: ignored for now + void generate_r1cs_witness(); + + static size_t get_block_len(); + static size_t get_digest_len(); + static bit_vector get_hash(const bit_vector &input); + + static size_t expected_constraints(const bool ensure_output_bitness=true); // TODO: ignored for now +}; + +} // libsnark + +#include "gadgetlib1/gadgets/hashes/sha256/sha256_gadget.tcc" + +#endif // SHA256_GADGET_HPP_ diff --git a/src/gadgetlib1/gadgets/hashes/sha256/sha256_gadget.tcc b/src/gadgetlib1/gadgets/hashes/sha256/sha256_gadget.tcc new file mode 100644 index 000000000..fc7ac982a --- /dev/null +++ b/src/gadgetlib1/gadgets/hashes/sha256/sha256_gadget.tcc @@ -0,0 +1,230 @@ +/** @file + ***************************************************************************** + + Implementation of interfaces for top-level SHA256 gadgets. + + See sha256_gadget.hpp . + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef SHA256_GADGET_TCC_ +#define SHA256_GADGET_TCC_ + +namespace libsnark { + +template +sha256_compression_function_gadget::sha256_compression_function_gadget(protoboard &pb, + const pb_linear_combination_array &prev_output, + const pb_variable_array &new_block, + const digest_variable &output, + const std::string &annotation_prefix) : + gadget(pb, annotation_prefix), + prev_output(prev_output), + new_block(new_block), + output(output) +{ + /* message schedule and inputs for it */ + packed_W.allocate(pb, 64, FMT(this->annotation_prefix, " packed_W")); + message_schedule.reset(new sha256_message_schedule_gadget(pb, new_block, packed_W, FMT(this->annotation_prefix, " message_schedule"))); + + /* initalize */ + round_a.push_back(pb_linear_combination_array(prev_output.rbegin() + 7*32, prev_output.rbegin() + 8*32)); + round_b.push_back(pb_linear_combination_array(prev_output.rbegin() + 6*32, prev_output.rbegin() + 7*32)); + round_c.push_back(pb_linear_combination_array(prev_output.rbegin() + 5*32, prev_output.rbegin() + 6*32)); + round_d.push_back(pb_linear_combination_array(prev_output.rbegin() + 4*32, prev_output.rbegin() + 5*32)); + round_e.push_back(pb_linear_combination_array(prev_output.rbegin() + 3*32, prev_output.rbegin() + 4*32)); + round_f.push_back(pb_linear_combination_array(prev_output.rbegin() + 2*32, prev_output.rbegin() + 3*32)); + round_g.push_back(pb_linear_combination_array(prev_output.rbegin() + 1*32, prev_output.rbegin() + 2*32)); + round_h.push_back(pb_linear_combination_array(prev_output.rbegin() + 0*32, prev_output.rbegin() + 1*32)); + + /* do the rounds */ + for (size_t i = 0; i < 64; ++i) + { + round_h.push_back(round_g[i]); + round_g.push_back(round_f[i]); + round_f.push_back(round_e[i]); + round_d.push_back(round_c[i]); + round_c.push_back(round_b[i]); + round_b.push_back(round_a[i]); + + pb_variable_array new_round_a_variables; + new_round_a_variables.allocate(pb, 32, FMT(this->annotation_prefix, " new_round_a_variables_%zu", i+1)); + round_a.emplace_back(new_round_a_variables); + + pb_variable_array new_round_e_variables; + new_round_e_variables.allocate(pb, 32, FMT(this->annotation_prefix, " new_round_e_variables_%zu", i+1)); + round_e.emplace_back(new_round_e_variables); + + round_functions.push_back(sha256_round_function_gadget(pb, + round_a[i], round_b[i], round_c[i], round_d[i], + round_e[i], round_f[i], round_g[i], round_h[i], + packed_W[i], SHA256_K[i], round_a[i+1], round_e[i+1], + FMT(this->annotation_prefix, " round_functions_%zu", i))); + } + + /* finalize */ + unreduced_output.allocate(pb, 8, FMT(this->annotation_prefix, " unreduced_output")); + reduced_output.allocate(pb, 8, FMT(this->annotation_prefix, " reduced_output")); + for (size_t i = 0; i < 8; ++i) + { + reduce_output.push_back(lastbits_gadget(pb, + unreduced_output[i], + 32+1, + reduced_output[i], + pb_variable_array(output.bits.rbegin() + (7-i) * 32, output.bits.rbegin() + (8-i) * 32), + FMT(this->annotation_prefix, " reduce_output_%zu", i))); + } +} + +template +void sha256_compression_function_gadget::generate_r1cs_constraints() +{ + message_schedule->generate_r1cs_constraints(); + for (size_t i = 0; i < 64; ++i) + { + round_functions[i].generate_r1cs_constraints(); + } + + for (size_t i = 0; i < 4; ++i) + { + this->pb.add_r1cs_constraint(r1cs_constraint(1, + round_functions[3-i].packed_d + round_functions[63-i].packed_new_a, + unreduced_output[i]), + FMT(this->annotation_prefix, " unreduced_output_%zu", i)); + + this->pb.add_r1cs_constraint(r1cs_constraint(1, + round_functions[3-i].packed_h + round_functions[63-i].packed_new_e, + unreduced_output[4+i]), + FMT(this->annotation_prefix, " unreduced_output_%zu", 4+i)); + } + + for (size_t i = 0; i < 8; ++i) + { + reduce_output[i].generate_r1cs_constraints(); + } +} + +template +void sha256_compression_function_gadget::generate_r1cs_witness() +{ + message_schedule->generate_r1cs_witness(); + +#ifdef DEBUG + printf("Input:\n"); + for (size_t j = 0; j < 16; ++j) + { + printf("%lx ", this->pb.val(packed_W[j]).as_ulong()); + } + printf("\n"); +#endif + + for (size_t i = 0; i < 64; ++i) + { + round_functions[i].generate_r1cs_witness(); + } + + for (size_t i = 0; i < 4; ++i) + { + this->pb.val(unreduced_output[i]) = this->pb.val(round_functions[3-i].packed_d) + this->pb.val(round_functions[63-i].packed_new_a); + this->pb.val(unreduced_output[4+i]) = this->pb.val(round_functions[3-i].packed_h) + this->pb.val(round_functions[63-i].packed_new_e); + } + + for (size_t i = 0; i < 8; ++i) + { + reduce_output[i].generate_r1cs_witness(); + } + +#ifdef DEBUG + printf("Output:\n"); + for (size_t j = 0; j < 8; ++j) + { + printf("%lx ", this->pb.val(reduced_output[j]).as_ulong()); + } + printf("\n"); +#endif +} + +template +sha256_two_to_one_hash_gadget::sha256_two_to_one_hash_gadget(protoboard &pb, + const digest_variable &left, + const digest_variable &right, + const digest_variable &output, + const std::string &annotation_prefix) : + gadget(pb, annotation_prefix) +{ + /* concatenate block = left || right */ + pb_variable_array block; + block.insert(block.end(), left.bits.begin(), left.bits.end()); + block.insert(block.end(), right.bits.begin(), right.bits.end()); + + /* compute the hash itself */ + f.reset(new sha256_compression_function_gadget(pb, SHA256_default_IV(pb), block, output, FMT(this->annotation_prefix, " f"))); +} + +template +sha256_two_to_one_hash_gadget::sha256_two_to_one_hash_gadget(protoboard &pb, + const size_t block_length, + const block_variable &input_block, + const digest_variable &output, + const std::string &annotation_prefix) : + gadget(pb, annotation_prefix) +{ + assert(block_length == SHA256_block_size); + assert(input_block.bits.size() == block_length); + f.reset(new sha256_compression_function_gadget(pb, SHA256_default_IV(pb), input_block.bits, output, FMT(this->annotation_prefix, " f"))); +} + +template +void sha256_two_to_one_hash_gadget::generate_r1cs_constraints(const bool ensure_output_bitness) +{ + UNUSED(ensure_output_bitness); + f->generate_r1cs_constraints(); +} + +template +void sha256_two_to_one_hash_gadget::generate_r1cs_witness() +{ + f->generate_r1cs_witness(); +} + +template +size_t sha256_two_to_one_hash_gadget::get_block_len() +{ + return SHA256_block_size; +} + +template +size_t sha256_two_to_one_hash_gadget::get_digest_len() +{ + return SHA256_digest_size; +} + +template +bit_vector sha256_two_to_one_hash_gadget::get_hash(const bit_vector &input) +{ + protoboard pb; + + block_variable input_variable(pb, SHA256_block_size, "input"); + digest_variable output_variable(pb, SHA256_digest_size, "output"); + sha256_two_to_one_hash_gadget f(pb, SHA256_block_size, input_variable, output_variable, "f"); + + input_variable.generate_r1cs_witness(input); + f.generate_r1cs_witness(); + + return output_variable.get_digest(); +} + +template +size_t sha256_two_to_one_hash_gadget::expected_constraints(const bool ensure_output_bitness) +{ + UNUSED(ensure_output_bitness); + return 27280; /* hardcoded for now */ +} + +} // libsnark + +#endif // SHA256_GADGET_TCC_ diff --git a/src/gadgetlib1/gadgets/hashes/sha256/tests/generate_sha256_gadget_tests.py b/src/gadgetlib1/gadgets/hashes/sha256/tests/generate_sha256_gadget_tests.py new file mode 100644 index 000000000..452317ffb --- /dev/null +++ b/src/gadgetlib1/gadgets/hashes/sha256/tests/generate_sha256_gadget_tests.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python +## +# @author This file is part of libsnark, developed by SCIPR Lab +# and contributors (see AUTHORS). +# @copyright MIT license (see LICENSE file) + +import random +import pypy_sha256 # PyPy's implementation of SHA256 compression function; see copyright and authorship notice within. + +BLOCK_LEN = 512 +BLOCK_BYTES = BLOCK_LEN // 8 +HASH_LEN = 256 +HASH_BYTES = HASH_LEN // 8 + +def gen_random_bytes(n): + return [random.randint(0, 255) for i in xrange(n)] + +def words_to_bytes(arr): + return sum(([x >> 24, (x >> 16) & 0xff, (x >> 8) & 0xff, x & 0xff] for x in arr), []) + +def bytes_to_words(arr): + l = len(arr) + assert l % 4 == 0 + return [(arr[i*4 + 3] << 24) + (arr[i*4+2] << 16) + (arr[i*4+1] << 8) + arr[i*4] for i in xrange(l//4)] + +def cpp_val(s, log_radix=32): + if log_radix == 8: + hexfmt = '0x%02x' + elif log_radix == 32: + hexfmt = '0x%08x' + s = bytes_to_words(s) + else: + raise + return 'int_list_to_bits({%s}, %d)' % (', '.join(hexfmt % x for x in s), log_radix) + +def H_bytes(x): + assert len(x) == BLOCK_BYTES + state = pypy_sha256.sha_init() + state['data'] = words_to_bytes(bytes_to_words(x)) + pypy_sha256.sha_transform(state) + return words_to_bytes(bytes_to_words(words_to_bytes(state['digest']))) + +def generate_sha256_gadget_tests(): + left = gen_random_bytes(HASH_BYTES) + right = gen_random_bytes(HASH_BYTES) + hash = H_bytes(left + right) + + print "const bit_vector left_bv = %s;" % cpp_val(left) + print "const bit_vector right_bv = %s;" % cpp_val(right) + print "const bit_vector hash_bv = %s;" % cpp_val(hash) + +if __name__ == '__main__': + random.seed(0) # for reproducibility + generate_sha256_gadget_tests() + diff --git a/src/gadgetlib1/gadgets/hashes/sha256/tests/pypy_sha256.py b/src/gadgetlib1/gadgets/hashes/sha256/tests/pypy_sha256.py new file mode 100644 index 000000000..496989c11 --- /dev/null +++ b/src/gadgetlib1/gadgets/hashes/sha256/tests/pypy_sha256.py @@ -0,0 +1,263 @@ +#!/usr/bin/env python +# +# SHA256 compression function implementation below is a verbatim copy of PyPy's implementation from +# https://bitbucket.org/pypy/pypy/raw/f1f064b3faf1e012f7a9a9ab08f18074637ebe8a/lib_pypy/_sha256.py . +# +# It is licensed under the MIT license and copyright PyPy Copyright holders 2003-2015 +# See https://bitbucket.org/pypy/pypy/src/tip/LICENSE for the full copyright notice. +# + +SHA_BLOCKSIZE = 64 +SHA_DIGESTSIZE = 32 + + +def new_shaobject(): + return { + 'digest': [0]*8, + 'count_lo': 0, + 'count_hi': 0, + 'data': [0]* SHA_BLOCKSIZE, + 'local': 0, + 'digestsize': 0 + } + +ROR = lambda x, y: (((x & 0xffffffff) >> (y & 31)) | (x << (32 - (y & 31)))) & 0xffffffff +Ch = lambda x, y, z: (z ^ (x & (y ^ z))) +Maj = lambda x, y, z: (((x | y) & z) | (x & y)) +S = lambda x, n: ROR(x, n) +R = lambda x, n: (x & 0xffffffff) >> n +Sigma0 = lambda x: (S(x, 2) ^ S(x, 13) ^ S(x, 22)) +Sigma1 = lambda x: (S(x, 6) ^ S(x, 11) ^ S(x, 25)) +Gamma0 = lambda x: (S(x, 7) ^ S(x, 18) ^ R(x, 3)) +Gamma1 = lambda x: (S(x, 17) ^ S(x, 19) ^ R(x, 10)) + +def sha_transform(sha_info): + W = [] + + d = sha_info['data'] + for i in range(0,16): + W.append( (d[4*i]<<24) + (d[4*i+1]<<16) + (d[4*i+2]<<8) + d[4*i+3]) + + for i in range(16,64): + W.append( (Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16]) & 0xffffffff ) + + ss = sha_info['digest'][:] + + def RND(a,b,c,d,e,f,g,h,i,ki): + t0 = h + Sigma1(e) + Ch(e, f, g) + ki + W[i]; + t1 = Sigma0(a) + Maj(a, b, c); + d += t0; + h = t0 + t1; + return d & 0xffffffff, h & 0xffffffff + + ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],0,0x428a2f98); + ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],1,0x71374491); + ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],2,0xb5c0fbcf); + ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],3,0xe9b5dba5); + ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],4,0x3956c25b); + ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],5,0x59f111f1); + ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],6,0x923f82a4); + ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],7,0xab1c5ed5); + ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],8,0xd807aa98); + ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],9,0x12835b01); + ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],10,0x243185be); + ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],11,0x550c7dc3); + ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],12,0x72be5d74); + ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],13,0x80deb1fe); + ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],14,0x9bdc06a7); + ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],15,0xc19bf174); + ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],16,0xe49b69c1); + ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],17,0xefbe4786); + ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],18,0x0fc19dc6); + ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],19,0x240ca1cc); + ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],20,0x2de92c6f); + ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],21,0x4a7484aa); + ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],22,0x5cb0a9dc); + ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],23,0x76f988da); + ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],24,0x983e5152); + ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],25,0xa831c66d); + ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],26,0xb00327c8); + ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],27,0xbf597fc7); + ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],28,0xc6e00bf3); + ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],29,0xd5a79147); + ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],30,0x06ca6351); + ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],31,0x14292967); + ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],32,0x27b70a85); + ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],33,0x2e1b2138); + ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],34,0x4d2c6dfc); + ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],35,0x53380d13); + ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],36,0x650a7354); + ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],37,0x766a0abb); + ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],38,0x81c2c92e); + ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],39,0x92722c85); + ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],40,0xa2bfe8a1); + ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],41,0xa81a664b); + ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],42,0xc24b8b70); + ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],43,0xc76c51a3); + ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],44,0xd192e819); + ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],45,0xd6990624); + ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],46,0xf40e3585); + ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],47,0x106aa070); + ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],48,0x19a4c116); + ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],49,0x1e376c08); + ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],50,0x2748774c); + ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],51,0x34b0bcb5); + ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],52,0x391c0cb3); + ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],53,0x4ed8aa4a); + ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],54,0x5b9cca4f); + ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],55,0x682e6ff3); + ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],56,0x748f82ee); + ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],57,0x78a5636f); + ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],58,0x84c87814); + ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],59,0x8cc70208); + ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],60,0x90befffa); + ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],61,0xa4506ceb); + ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],62,0xbef9a3f7); + ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],63,0xc67178f2); + + dig = [] + for i, x in enumerate(sha_info['digest']): + dig.append( (x + ss[i]) & 0xffffffff ) + sha_info['digest'] = dig + +def sha_init(): + sha_info = new_shaobject() + sha_info['digest'] = [0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19] + sha_info['count_lo'] = 0 + sha_info['count_hi'] = 0 + sha_info['local'] = 0 + sha_info['digestsize'] = 32 + return sha_info + +def sha224_init(): + sha_info = new_shaobject() + sha_info['digest'] = [0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4] + sha_info['count_lo'] = 0 + sha_info['count_hi'] = 0 + sha_info['local'] = 0 + sha_info['digestsize'] = 28 + return sha_info + +def sha_update(sha_info, buffer): + if isinstance(buffer, str): + raise TypeError("Unicode strings must be encoded before hashing") + count = len(buffer) + buffer_idx = 0 + clo = (sha_info['count_lo'] + (count << 3)) & 0xffffffff + if clo < sha_info['count_lo']: + sha_info['count_hi'] += 1 + sha_info['count_lo'] = clo + + sha_info['count_hi'] += (count >> 29) + + if sha_info['local']: + i = SHA_BLOCKSIZE - sha_info['local'] + if i > count: + i = count + + # copy buffer + sha_info['data'][sha_info['local']:sha_info['local']+i] = buffer[buffer_idx:buffer_idx+i] + + count -= i + buffer_idx += i + + sha_info['local'] += i + if sha_info['local'] == SHA_BLOCKSIZE: + sha_transform(sha_info) + sha_info['local'] = 0 + else: + return + + while count >= SHA_BLOCKSIZE: + # copy buffer + sha_info['data'] = list(buffer[buffer_idx:buffer_idx + SHA_BLOCKSIZE]) + count -= SHA_BLOCKSIZE + buffer_idx += SHA_BLOCKSIZE + sha_transform(sha_info) + + + # copy buffer + pos = sha_info['local'] + sha_info['data'][pos:pos+count] = buffer[buffer_idx:buffer_idx + count] + sha_info['local'] = count + +def sha_final(sha_info): + lo_bit_count = sha_info['count_lo'] + hi_bit_count = sha_info['count_hi'] + count = (lo_bit_count >> 3) & 0x3f + sha_info['data'][count] = 0x80; + count += 1 + if count > SHA_BLOCKSIZE - 8: + # zero the bytes in data after the count + sha_info['data'] = sha_info['data'][:count] + ([0] * (SHA_BLOCKSIZE - count)) + sha_transform(sha_info) + # zero bytes in data + sha_info['data'] = [0] * SHA_BLOCKSIZE + else: + sha_info['data'] = sha_info['data'][:count] + ([0] * (SHA_BLOCKSIZE - count)) + + sha_info['data'][56] = (hi_bit_count >> 24) & 0xff + sha_info['data'][57] = (hi_bit_count >> 16) & 0xff + sha_info['data'][58] = (hi_bit_count >> 8) & 0xff + sha_info['data'][59] = (hi_bit_count >> 0) & 0xff + sha_info['data'][60] = (lo_bit_count >> 24) & 0xff + sha_info['data'][61] = (lo_bit_count >> 16) & 0xff + sha_info['data'][62] = (lo_bit_count >> 8) & 0xff + sha_info['data'][63] = (lo_bit_count >> 0) & 0xff + + sha_transform(sha_info) + + dig = [] + for i in sha_info['digest']: + dig.extend([ ((i>>24) & 0xff), ((i>>16) & 0xff), ((i>>8) & 0xff), (i & 0xff) ]) + return ''.join([chr(i) for i in dig]) + +class sha256(object): + digest_size = digestsize = SHA_DIGESTSIZE + block_size = SHA_BLOCKSIZE + + def __init__(self, s=None): + self._sha = sha_init() + if s: + sha_update(self._sha, s) + + def update(self, s): + sha_update(self._sha, s) + + def digest(self): + return sha_final(self._sha.copy())[:self._sha['digestsize']] + + def hexdigest(self): + return ''.join(['%.2x' % ord(i) for i in self.digest()]) + + def copy(self): + new = sha256.__new__(sha256) + new._sha = self._sha.copy() + return new + +class sha224(sha256): + digest_size = digestsize = 28 + + def __init__(self, s=None): + self._sha = sha224_init() + if s: + sha_update(self._sha, s) + + def copy(self): + new = sha224.__new__(sha224) + new._sha = self._sha.copy() + return new + +def test(): + a_str = "just a test string" + + assert 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855' == sha256().hexdigest() + assert 'd7b553c6f09ac85d142415f857c5310f3bbbe7cdd787cce4b985acedd585266f' == sha256(a_str).hexdigest() + assert '8113ebf33c97daa9998762aacafe750c7cefc2b2f173c90c59663a57fe626f21' == sha256(a_str*7).hexdigest() + + s = sha256(a_str) + s.update(a_str) + assert '03d9963e05a094593190b6fc794cb1a3e1ac7d7883f0b5855268afeccc70d461' == s.hexdigest() + +if __name__ == "__main__": + test() diff --git a/src/gadgetlib1/gadgets/hashes/sha256/tests/test_sha256_gadget.cpp b/src/gadgetlib1/gadgets/hashes/sha256/tests/test_sha256_gadget.cpp new file mode 100644 index 000000000..471928f6a --- /dev/null +++ b/src/gadgetlib1/gadgets/hashes/sha256/tests/test_sha256_gadget.cpp @@ -0,0 +1,46 @@ +/** @file + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#include "common/default_types/ec_pp.hpp" +#include "common/utils.hpp" +#include "common/profiling.hpp" +#include "gadgetlib1/gadgets/hashes/sha256/sha256_gadget.hpp" + +using namespace libsnark; + +template +void test_two_to_one() +{ + protoboard pb; + + digest_variable left(pb, SHA256_digest_size, "left"); + digest_variable right(pb, SHA256_digest_size, "right"); + digest_variable output(pb, SHA256_digest_size, "output"); + + sha256_two_to_one_hash_gadget f(pb, left, right, output, "f"); + f.generate_r1cs_constraints(); + printf("Number of constraints for sha256_two_to_one_hash_gadget: %zu\n", pb.num_constraints()); + + const bit_vector left_bv = int_list_to_bits({0x426bc2d8, 0x4dc86782, 0x81e8957a, 0x409ec148, 0xe6cffbe8, 0xafe6ba4f, 0x9c6f1978, 0xdd7af7e9}, 32); + const bit_vector right_bv = int_list_to_bits({0x038cce42, 0xabd366b8, 0x3ede7e00, 0x9130de53, 0x72cdf73d, 0xee825114, 0x8cb48d1b, 0x9af68ad0}, 32); + const bit_vector hash_bv = int_list_to_bits({0xeffd0b7f, 0x1ccba116, 0x2ee816f7, 0x31c62b48, 0x59305141, 0x990e5c0a, 0xce40d33d, 0x0b1167d1}, 32); + + left.generate_r1cs_witness(left_bv); + right.generate_r1cs_witness(right_bv); + + f.generate_r1cs_witness(); + output.generate_r1cs_witness(hash_bv); + + assert(pb.is_satisfied()); +} + +int main(void) +{ + start_profiling(); + default_ec_pp::init_public_params(); + test_two_to_one >(); +} diff --git a/src/gadgetlib1/gadgets/merkle_tree/merkle_authentication_path_variable.hpp b/src/gadgetlib1/gadgets/merkle_tree/merkle_authentication_path_variable.hpp new file mode 100644 index 000000000..0efa7cf4d --- /dev/null +++ b/src/gadgetlib1/gadgets/merkle_tree/merkle_authentication_path_variable.hpp @@ -0,0 +1,38 @@ +/** + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef MERKLE_AUTHENTICATION_PATH_VARIABLE_HPP_ +#define MERKLE_AUTHENTICATION_PATH_VARIABLE_HPP_ + +#include "common/data_structures/merkle_tree.hpp" +#include "gadgetlib1/gadget.hpp" +#include "gadgetlib1/gadgets/hashes/hash_io.hpp" + +namespace libsnark { + +template +class merkle_authentication_path_variable : public gadget { +public: + + const size_t tree_depth; + std::vector > left_digests; + std::vector > right_digests; + + merkle_authentication_path_variable(protoboard &pb, + const size_t tree_depth, + const std::string &annotation_prefix); + + void generate_r1cs_constraints(); + void generate_r1cs_witness(const size_t address, const merkle_authentication_path &path); + merkle_authentication_path get_authentication_path(const size_t address) const; +}; + +} // libsnark + +#include "gadgetlib1/gadgets/merkle_tree/merkle_authentication_path_variable.tcc" + +#endif // MERKLE_AUTHENTICATION_PATH_VARIABLE_HPP diff --git a/src/gadgetlib1/gadgets/merkle_tree/merkle_authentication_path_variable.tcc b/src/gadgetlib1/gadgets/merkle_tree/merkle_authentication_path_variable.tcc new file mode 100644 index 000000000..d773051ab --- /dev/null +++ b/src/gadgetlib1/gadgets/merkle_tree/merkle_authentication_path_variable.tcc @@ -0,0 +1,76 @@ +/** + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef MERKLE_AUTHENTICATION_PATH_VARIABLE_TCC_ +#define MERKLE_AUTHENTICATION_PATH_VARIABLE_TCC_ + +namespace libsnark { + +template +merkle_authentication_path_variable::merkle_authentication_path_variable(protoboard &pb, + const size_t tree_depth, + const std::string &annotation_prefix) : + gadget(pb, annotation_prefix), + tree_depth(tree_depth) +{ + for (size_t i = 0; i < tree_depth; ++i) + { + left_digests.emplace_back(digest_variable(pb, HashT::get_digest_len(), FMT(annotation_prefix, " left_digests_%zu", i))); + right_digests.emplace_back(digest_variable(pb, HashT::get_digest_len(), FMT(annotation_prefix, " right_digests_%zu", i))); + } +} + +template +void merkle_authentication_path_variable::generate_r1cs_constraints() +{ + for (size_t i = 0; i < tree_depth; ++i) + { + left_digests[i].generate_r1cs_constraints(); + right_digests[i].generate_r1cs_constraints(); + } +} + +template +void merkle_authentication_path_variable::generate_r1cs_witness(const size_t address, const merkle_authentication_path &path) +{ + assert(path.size() == tree_depth); + + for (size_t i = 0; i < tree_depth; ++i) + { + if (address & (1ul << (tree_depth-1-i))) + { + left_digests[i].generate_r1cs_witness(path[i]); + } + else + { + right_digests[i].generate_r1cs_witness(path[i]); + } + } +} + +template +merkle_authentication_path merkle_authentication_path_variable::get_authentication_path(const size_t address) const +{ + merkle_authentication_path result; + for (size_t i = 0; i < tree_depth; ++i) + { + if (address & (1ul << (tree_depth-1-i))) + { + result.emplace_back(left_digests[i].get_digest()); + } + else + { + result.emplace_back(right_digests[i].get_digest()); + } + } + + return result; +} + +} // libsnark + +#endif // MERKLE_AUTHENTICATION_PATH_VARIABLE_TCC diff --git a/src/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_read_gadget.hpp b/src/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_read_gadget.hpp new file mode 100644 index 000000000..b1e3a4f05 --- /dev/null +++ b/src/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_read_gadget.hpp @@ -0,0 +1,73 @@ +/** @file + ***************************************************************************** + + Declaration of interfaces for the Merkle tree check read gadget. + + The gadget checks the following: given a root R, address A, value V, and + authentication path P, check that P is a valid authentication path for the + value V as the A-th leaf in a Merkle tree with root R. + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef MERKLE_TREE_CHECK_READ_GADGET_HPP_ +#define MERKLE_TREE_CHECK_READ_GADGET_HPP_ + +#include "common/data_structures/merkle_tree.hpp" +#include "gadgetlib1/gadget.hpp" +#include "gadgetlib1/gadgets/hashes/hash_io.hpp" +#include "gadgetlib1/gadgets/hashes/digest_selector_gadget.hpp" +#include "gadgetlib1/gadgets/merkle_tree/merkle_authentication_path_variable.hpp" + +namespace libsnark { + +template +class merkle_tree_check_read_gadget : public gadget { +private: + + std::vector hashers; + std::vector > hasher_inputs; + std::vector > propagators; + std::vector > internal_output; + + std::shared_ptr > computed_root; + std::shared_ptr > check_root; + +public: + + const size_t digest_size; + const size_t tree_depth; + pb_linear_combination_array address_bits; + digest_variable leaf; + digest_variable root; + merkle_authentication_path_variable path; + pb_linear_combination read_successful; + + merkle_tree_check_read_gadget(protoboard &pb, + const size_t tree_depth, + const pb_linear_combination_array &address_bits, + const digest_variable &leaf_digest, + const digest_variable &root_digest, + const merkle_authentication_path_variable &path, + const pb_linear_combination &read_successful, + const std::string &annotation_prefix); + + void generate_r1cs_constraints(); + void generate_r1cs_witness(); + + static size_t root_size_in_bits(); + /* for debugging purposes */ + static size_t expected_constraints(const size_t tree_depth); +}; + +template +void test_merkle_tree_check_read_gadget(); + +} // libsnark + +#include "gadgetlib1/gadgets/merkle_tree/merkle_tree_check_read_gadget.tcc" + +#endif // MERKLE_TREE_CHECK_READ_GADGET_HPP_ diff --git a/src/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_read_gadget.tcc b/src/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_read_gadget.tcc new file mode 100644 index 000000000..6002a5886 --- /dev/null +++ b/src/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_read_gadget.tcc @@ -0,0 +1,196 @@ +/** @file + ***************************************************************************** + + Implementation of interfaces for the Merkle tree check read. + + See merkle_tree_check_read_gadget.hpp . + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef MERKLE_TREE_CHECK_READ_GADGET_TCC_ +#define MERKLE_TREE_CHECK_READ_GADGET_TCC_ + +namespace libsnark { + +template +merkle_tree_check_read_gadget::merkle_tree_check_read_gadget(protoboard &pb, + const size_t tree_depth, + const pb_linear_combination_array &address_bits, + const digest_variable &leaf, + const digest_variable &root, + const merkle_authentication_path_variable &path, + const pb_linear_combination &read_successful, + const std::string &annotation_prefix) : + gadget(pb, annotation_prefix), + digest_size(HashT::get_digest_len()), + tree_depth(tree_depth), + address_bits(address_bits), + leaf(leaf), + root(root), + path(path), + read_successful(read_successful) +{ + /* + The tricky part here is ordering. For Merkle tree + authentication paths, path[0] corresponds to one layer below + the root (and path[tree_depth-1] corresponds to the layer + containing the leaf), while address_bits has the reverse order: + address_bits[0] is LSB, and corresponds to layer containing the + leaf, and address_bits[tree_depth-1] is MSB, and corresponds to + the subtree directly under the root. + */ + assert(tree_depth > 0); + assert(tree_depth == address_bits.size()); + + for (size_t i = 0; i < tree_depth-1; ++i) + { + internal_output.emplace_back(digest_variable(pb, digest_size, FMT(this->annotation_prefix, " internal_output_%zu", i))); + } + + computed_root.reset(new digest_variable(pb, digest_size, FMT(this->annotation_prefix, " computed_root"))); + + for (size_t i = 0; i < tree_depth; ++i) + { + block_variable inp(pb, path.left_digests[i], path.right_digests[i], FMT(this->annotation_prefix, " inp_%zu", i)); + hasher_inputs.emplace_back(inp); + hashers.emplace_back(HashT(pb, 2*digest_size, inp, (i == 0 ? *computed_root : internal_output[i-1]), + FMT(this->annotation_prefix, " load_hashers_%zu", i))); + } + + for (size_t i = 0; i < tree_depth; ++i) + { + /* + The propagators take a computed hash value (or leaf in the + base case) and propagate it one layer up, either in the left + or the right slot of authentication_path_variable. + */ + propagators.emplace_back(digest_selector_gadget(pb, digest_size, i < tree_depth - 1 ? internal_output[i] : leaf, + address_bits[tree_depth-1-i], path.left_digests[i], path.right_digests[i], + FMT(this->annotation_prefix, " digest_selector_%zu", i))); + } + + check_root.reset(new bit_vector_copy_gadget(pb, computed_root->bits, root.bits, read_successful, FieldT::capacity(), FMT(annotation_prefix, " check_root"))); +} + +template +void merkle_tree_check_read_gadget::generate_r1cs_constraints() +{ + /* ensure correct hash computations */ + for (size_t i = 0; i < tree_depth; ++i) + { + // Note that we check root outside and have enforced booleanity of path.left_digests/path.right_digests outside in path.generate_r1cs_constraints + hashers[i].generate_r1cs_constraints(false); + } + + /* ensure consistency of path.left_digests/path.right_digests with internal_output */ + for (size_t i = 0; i < tree_depth; ++i) + { + propagators[i].generate_r1cs_constraints(); + } + + check_root->generate_r1cs_constraints(false, false); +} + +template +void merkle_tree_check_read_gadget::generate_r1cs_witness() +{ + /* do the hash computations bottom-up */ + for (int i = tree_depth-1; i >= 0; --i) + { + /* propagate previous input */ + propagators[i].generate_r1cs_witness(); + + /* compute hash */ + hashers[i].generate_r1cs_witness(); + } + + check_root->generate_r1cs_witness(); +} + +template +size_t merkle_tree_check_read_gadget::root_size_in_bits() +{ + return HashT::get_digest_len(); +} + +template +size_t merkle_tree_check_read_gadget::expected_constraints(const size_t tree_depth) +{ + /* NB: this includes path constraints */ + const size_t hasher_constraints = tree_depth * HashT::expected_constraints(false); + const size_t propagator_constraints = tree_depth * HashT::get_digest_len(); + const size_t authentication_path_constraints = 2 * tree_depth * HashT::get_digest_len(); + const size_t check_root_constraints = 3 * div_ceil(HashT::get_digest_len(), FieldT::capacity()); + + return hasher_constraints + propagator_constraints + authentication_path_constraints + check_root_constraints; +} + +template +void test_merkle_tree_check_read_gadget() +{ + /* prepare test */ + const size_t digest_len = HashT::get_digest_len(); + const size_t tree_depth = 16; + std::vector path(tree_depth); + + bit_vector prev_hash(digest_len); + std::generate(prev_hash.begin(), prev_hash.end(), [&]() { return std::rand() % 2; }); + bit_vector leaf = prev_hash; + + bit_vector address_bits; + + size_t address = 0; + for (long level = tree_depth-1; level >= 0; --level) + { + const bool computed_is_right = (std::rand() % 2); + address |= (computed_is_right ? 1ul << (tree_depth-1-level) : 0); + address_bits.push_back(computed_is_right); + bit_vector other(digest_len); + std::generate(other.begin(), other.end(), [&]() { return std::rand() % 2; }); + + bit_vector block = prev_hash; + block.insert(computed_is_right ? block.begin() : block.end(), other.begin(), other.end()); + bit_vector h = HashT::get_hash(block); + + path[level] = other; + + prev_hash = h; + } + bit_vector root = prev_hash; + + /* execute test */ + protoboard pb; + pb_variable_array address_bits_va; + address_bits_va.allocate(pb, tree_depth, "address_bits"); + digest_variable leaf_digest(pb, digest_len, "input_block"); + digest_variable root_digest(pb, digest_len, "output_digest"); + merkle_authentication_path_variable path_var(pb, tree_depth, "path_var"); + merkle_tree_check_read_gadget ml(pb, tree_depth, address_bits_va, leaf_digest, root_digest, path_var, ONE, "ml"); + + path_var.generate_r1cs_constraints(); + ml.generate_r1cs_constraints(); + + address_bits_va.fill_with_bits(pb, address_bits); + assert(address_bits_va.get_field_element_from_bits(pb).as_ulong() == address); + leaf_digest.generate_r1cs_witness(leaf); + path_var.generate_r1cs_witness(address, path); + ml.generate_r1cs_witness(); + + /* make sure that read checker didn't accidentally overwrite anything */ + address_bits_va.fill_with_bits(pb, address_bits); + leaf_digest.generate_r1cs_witness(leaf); + root_digest.generate_r1cs_witness(root); + assert(pb.is_satisfied()); + + const size_t num_constraints = pb.num_constraints(); + const size_t expected_constraints = merkle_tree_check_read_gadget::expected_constraints(tree_depth); + assert(num_constraints == expected_constraints); +} + +} // libsnark + +#endif // MERKLE_TREE_CHECK_READ_GADGET_TCC_ diff --git a/src/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_update_gadget.hpp b/src/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_update_gadget.hpp new file mode 100644 index 000000000..2d6840d61 --- /dev/null +++ b/src/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_update_gadget.hpp @@ -0,0 +1,91 @@ +/** @file + ***************************************************************************** + + Declaration of interfaces for the Merkle tree check read gadget. + + The gadget checks the following: given two roots R1 and R2, address A, two + values V1 and V2, and authentication path P, check that + - P is a valid authentication path for the value V1 as the A-th leaf in a Merkle tree with root R1, and + - P is a valid authentication path for the value V2 as the A-th leaf in a Merkle tree with root R2. + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef MERKLE_TREE_CHECK_UPDATE_GADGET_HPP_ +#define MERKLE_TREE_CHECK_UPDATE_GADGET_HPP_ + +#include "common/data_structures/merkle_tree.hpp" +#include "gadgetlib1/gadget.hpp" +#include "gadgetlib1/gadgets/hashes/crh_gadget.hpp" +#include "gadgetlib1/gadgets/hashes/hash_io.hpp" +#include "gadgetlib1/gadgets/hashes/digest_selector_gadget.hpp" +#include "gadgetlib1/gadgets/merkle_tree/merkle_authentication_path_variable.hpp" + +namespace libsnark { + +template +class merkle_tree_check_update_gadget : public gadget { +private: + + std::vector prev_hashers; + std::vector > prev_hasher_inputs; + std::vector > prev_propagators; + std::vector > prev_internal_output; + + std::vector next_hashers; + std::vector > next_hasher_inputs; + std::vector > next_propagators; + std::vector > next_internal_output; + + std::shared_ptr > computed_next_root; + std::shared_ptr > check_next_root; + +public: + + const size_t digest_size; + const size_t tree_depth; + + pb_variable_array address_bits; + digest_variable prev_leaf_digest; + digest_variable prev_root_digest; + merkle_authentication_path_variable prev_path; + digest_variable next_leaf_digest; + digest_variable next_root_digest; + merkle_authentication_path_variable next_path; + pb_linear_combination update_successful; + + /* Note that while it is necessary to generate R1CS constraints + for prev_path, it is not necessary to do so for next_path. See + comment in the implementation of generate_r1cs_constraints() */ + + merkle_tree_check_update_gadget(protoboard &pb, + const size_t tree_depth, + const pb_variable_array &address_bits, + const digest_variable &prev_leaf_digest, + const digest_variable &prev_root_digest, + const merkle_authentication_path_variable &prev_path, + const digest_variable &next_leaf_digest, + const digest_variable &next_root_digest, + const merkle_authentication_path_variable &next_path, + const pb_linear_combination &update_successful, + const std::string &annotation_prefix); + + void generate_r1cs_constraints(); + void generate_r1cs_witness(); + + static size_t root_size_in_bits(); + /* for debugging purposes */ + static size_t expected_constraints(const size_t tree_depth); +}; + +template +void test_merkle_tree_check_update_gadget(); + +} // libsnark + +#include "gadgetlib1/gadgets/merkle_tree/merkle_tree_check_update_gadget.tcc" + +#endif // MERKLE_TREE_CHECK_UPDATE_GADGET_HPP_ diff --git a/src/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_update_gadget.tcc b/src/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_update_gadget.tcc new file mode 100644 index 000000000..1ac08edbb --- /dev/null +++ b/src/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_update_gadget.tcc @@ -0,0 +1,265 @@ +/** @file + ***************************************************************************** + + Implementation of interfaces for the Merkle tree check update gadget. + + See merkle_tree_check_update_gadget.hpp . + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef MERKLE_TREE_CHECK_UPDATE_GADGET_TCC_ +#define MERKLE_TREE_CHECK_UPDATE_GADGET_TCC_ + +namespace libsnark { + +template +merkle_tree_check_update_gadget::merkle_tree_check_update_gadget(protoboard &pb, + const size_t tree_depth, + const pb_variable_array &address_bits, + const digest_variable &prev_leaf_digest, + const digest_variable &prev_root_digest, + const merkle_authentication_path_variable &prev_path, + const digest_variable &next_leaf_digest, + const digest_variable &next_root_digest, + const merkle_authentication_path_variable &next_path, + const pb_linear_combination &update_successful, + const std::string &annotation_prefix) : + gadget(pb, annotation_prefix), + digest_size(HashT::get_digest_len()), + tree_depth(tree_depth), + address_bits(address_bits), + prev_leaf_digest(prev_leaf_digest), + prev_root_digest(prev_root_digest), + prev_path(prev_path), + next_leaf_digest(next_leaf_digest), + next_root_digest(next_root_digest), + next_path(next_path), + update_successful(update_successful) +{ + assert(tree_depth > 0); + assert(tree_depth == address_bits.size()); + + for (size_t i = 0; i < tree_depth-1; ++i) + { + prev_internal_output.emplace_back(digest_variable(pb, digest_size, FMT(this->annotation_prefix, " prev_internal_output_%zu", i))); + next_internal_output.emplace_back(digest_variable(pb, digest_size, FMT(this->annotation_prefix, " next_internal_output_%zu", i))); + } + + computed_next_root.reset(new digest_variable(pb, digest_size, FMT(this->annotation_prefix, " computed_root"))); + + for (size_t i = 0; i < tree_depth; ++i) + { + block_variable prev_inp(pb, prev_path.left_digests[i], prev_path.right_digests[i], FMT(this->annotation_prefix, " prev_inp_%zu", i)); + prev_hasher_inputs.emplace_back(prev_inp); + prev_hashers.emplace_back(HashT(pb, 2*digest_size, prev_inp, (i == 0 ? prev_root_digest : prev_internal_output[i-1]), + FMT(this->annotation_prefix, " prev_hashers_%zu", i))); + + block_variable next_inp(pb, next_path.left_digests[i], next_path.right_digests[i], FMT(this->annotation_prefix, " next_inp_%zu", i)); + next_hasher_inputs.emplace_back(next_inp); + next_hashers.emplace_back(HashT(pb, 2*digest_size, next_inp, (i == 0 ? *computed_next_root : next_internal_output[i-1]), + FMT(this->annotation_prefix, " next_hashers_%zu", i))); + } + + for (size_t i = 0; i < tree_depth; ++i) + { + prev_propagators.emplace_back(digest_selector_gadget(pb, digest_size, i < tree_depth -1 ? prev_internal_output[i] : prev_leaf_digest, + address_bits[tree_depth-1-i], prev_path.left_digests[i], prev_path.right_digests[i], + FMT(this->annotation_prefix, " prev_propagators_%zu", i))); + next_propagators.emplace_back(digest_selector_gadget(pb, digest_size, i < tree_depth -1 ? next_internal_output[i] : next_leaf_digest, + address_bits[tree_depth-1-i], next_path.left_digests[i], next_path.right_digests[i], + FMT(this->annotation_prefix, " next_propagators_%zu", i))); + } + + check_next_root.reset(new bit_vector_copy_gadget(pb, computed_next_root->bits, next_root_digest.bits, update_successful, FieldT::capacity(), FMT(annotation_prefix, " check_next_root"))); +} + +template +void merkle_tree_check_update_gadget::generate_r1cs_constraints() +{ + /* ensure correct hash computations */ + for (size_t i = 0; i < tree_depth; ++i) + { + prev_hashers[i].generate_r1cs_constraints(false); // we check root outside and prev_left/prev_right above + next_hashers[i].generate_r1cs_constraints(true); // however we must check right side hashes + } + + /* ensure consistency of internal_left/internal_right with internal_output */ + for (size_t i = 0; i < tree_depth; ++i) + { + prev_propagators[i].generate_r1cs_constraints(); + next_propagators[i].generate_r1cs_constraints(); + } + + /* ensure that prev auxiliary input and next auxiliary input match */ + for (size_t i = 0; i < tree_depth; ++i) + { + for (size_t j = 0; j < digest_size; ++j) + { + /* + addr * (prev_left - next_left) + (1 - addr) * (prev_right - next_right) = 0 + addr * (prev_left - next_left - prev_right + next_right) = next_right - prev_right + */ + this->pb.add_r1cs_constraint(r1cs_constraint(address_bits[tree_depth-1-i], + prev_path.left_digests[i].bits[j] - next_path.left_digests[i].bits[j] - prev_path.right_digests[i].bits[j] + next_path.right_digests[i].bits[j], + next_path.right_digests[i].bits[j] - prev_path.right_digests[i].bits[j]), + FMT(this->annotation_prefix, " aux_check_%zu_%zu", i, j)); + } + } + + /* Note that while it is necessary to generate R1CS constraints + for prev_path, it is not necessary to do so for next_path. + + This holds, because { next_path.left_inputs[i], + next_path.right_inputs[i] } is a pair { hash_output, + auxiliary_input }. The bitness for hash_output is enforced + above by next_hashers[i].generate_r1cs_constraints. + + Because auxiliary input is the same for prev_path and next_path + (enforced above), we have that auxiliary_input part is also + constrained to be boolean, because prev_path is *all* + constrained to be all boolean. */ + + check_next_root->generate_r1cs_constraints(false, false); +} + +template +void merkle_tree_check_update_gadget::generate_r1cs_witness() +{ + /* do the hash computations bottom-up */ + for (int i = tree_depth-1; i >= 0; --i) + { + /* ensure consistency of prev_path and next_path */ + if (this->pb.val(address_bits[tree_depth-1-i]) == FieldT::one()) + { + next_path.left_digests[i].generate_r1cs_witness(prev_path.left_digests[i].get_digest()); + } + else + { + next_path.right_digests[i].generate_r1cs_witness(prev_path.right_digests[i].get_digest()); + } + + /* propagate previous input */ + prev_propagators[i].generate_r1cs_witness(); + next_propagators[i].generate_r1cs_witness(); + + /* compute hash */ + prev_hashers[i].generate_r1cs_witness(); + next_hashers[i].generate_r1cs_witness(); + } + + check_next_root->generate_r1cs_witness(); +} + +template +size_t merkle_tree_check_update_gadget::root_size_in_bits() +{ + return HashT::get_digest_len(); +} + +template +size_t merkle_tree_check_update_gadget::expected_constraints(const size_t tree_depth) +{ + /* NB: this includes path constraints */ + const size_t prev_hasher_constraints = tree_depth * HashT::expected_constraints(false); + const size_t next_hasher_constraints = tree_depth * HashT::expected_constraints(true); + const size_t prev_authentication_path_constraints = 2 * tree_depth * HashT::get_digest_len(); + const size_t prev_propagator_constraints = tree_depth * HashT::get_digest_len(); + const size_t next_propagator_constraints = tree_depth * HashT::get_digest_len(); + const size_t check_next_root_constraints = 3 * div_ceil(HashT::get_digest_len(), FieldT::capacity()); + const size_t aux_equality_constraints = tree_depth * HashT::get_digest_len(); + + return (prev_hasher_constraints + next_hasher_constraints + prev_authentication_path_constraints + + prev_propagator_constraints + next_propagator_constraints + check_next_root_constraints + + aux_equality_constraints); +} + +template +void test_merkle_tree_check_update_gadget() +{ + /* prepare test */ + const size_t digest_len = HashT::get_digest_len(); + + const size_t tree_depth = 16; + std::vector prev_path(tree_depth); + + bit_vector prev_load_hash(digest_len); + std::generate(prev_load_hash.begin(), prev_load_hash.end(), [&]() { return std::rand() % 2; }); + bit_vector prev_store_hash(digest_len); + std::generate(prev_store_hash.begin(), prev_store_hash.end(), [&]() { return std::rand() % 2; }); + + bit_vector loaded_leaf = prev_load_hash; + bit_vector stored_leaf = prev_store_hash; + + bit_vector address_bits; + + size_t address = 0; + for (long level = tree_depth-1; level >= 0; --level) + { + const bool computed_is_right = (std::rand() % 2); + address |= (computed_is_right ? 1ul << (tree_depth-1-level) : 0); + address_bits.push_back(computed_is_right); + bit_vector other(digest_len); + std::generate(other.begin(), other.end(), [&]() { return std::rand() % 2; }); + + bit_vector load_block = prev_load_hash; + load_block.insert(computed_is_right ? load_block.begin() : load_block.end(), other.begin(), other.end()); + bit_vector store_block = prev_store_hash; + store_block.insert(computed_is_right ? store_block.begin() : store_block.end(), other.begin(), other.end()); + + bit_vector load_h = HashT::get_hash(load_block); + bit_vector store_h = HashT::get_hash(store_block); + + prev_path[level] = other; + + prev_load_hash = load_h; + prev_store_hash = store_h; + } + + bit_vector load_root = prev_load_hash; + bit_vector store_root = prev_store_hash; + + /* execute the test */ + protoboard pb; + pb_variable_array address_bits_va; + address_bits_va.allocate(pb, tree_depth, "address_bits"); + digest_variable prev_leaf_digest(pb, digest_len, "prev_leaf_digest"); + digest_variable prev_root_digest(pb, digest_len, "prev_root_digest"); + merkle_authentication_path_variable prev_path_var(pb, tree_depth, "prev_path_var"); + digest_variable next_leaf_digest(pb, digest_len, "next_leaf_digest"); + digest_variable next_root_digest(pb, digest_len, "next_root_digest"); + merkle_authentication_path_variable next_path_var(pb, tree_depth, "next_path_var"); + merkle_tree_check_update_gadget mls(pb, tree_depth, address_bits_va, + prev_leaf_digest, prev_root_digest, prev_path_var, + next_leaf_digest, next_root_digest, next_path_var, ONE, "mls"); + + prev_path_var.generate_r1cs_constraints(); + mls.generate_r1cs_constraints(); + + address_bits_va.fill_with_bits(pb, address_bits); + assert(address_bits_va.get_field_element_from_bits(pb).as_ulong() == address); + prev_leaf_digest.generate_r1cs_witness(loaded_leaf); + prev_path_var.generate_r1cs_witness(address, prev_path); + next_leaf_digest.generate_r1cs_witness(stored_leaf); + address_bits_va.fill_with_bits(pb, address_bits); + mls.generate_r1cs_witness(); + + /* make sure that update check will check for the right things */ + prev_leaf_digest.generate_r1cs_witness(loaded_leaf); + next_leaf_digest.generate_r1cs_witness(stored_leaf); + prev_root_digest.generate_r1cs_witness(load_root); + next_root_digest.generate_r1cs_witness(store_root); + address_bits_va.fill_with_bits(pb, address_bits); + assert(pb.is_satisfied()); + + const size_t num_constraints = pb.num_constraints(); + const size_t expected_constraints = merkle_tree_check_update_gadget::expected_constraints(tree_depth); + assert(num_constraints == expected_constraints); +} + +} // libsnark + +#endif // MERKLE_TREE_CHECK_UPDATE_GADGET_TCC_ diff --git a/src/gadgetlib1/gadgets/merkle_tree/tests/test_merkle_tree_gadgets.cpp b/src/gadgetlib1/gadgets/merkle_tree/tests/test_merkle_tree_gadgets.cpp new file mode 100644 index 000000000..8d52c579b --- /dev/null +++ b/src/gadgetlib1/gadgets/merkle_tree/tests/test_merkle_tree_gadgets.cpp @@ -0,0 +1,48 @@ +/** + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifdef CURVE_BN128 +#include "algebra/curves/bn128/bn128_pp.hpp" +#endif +#include "algebra/curves/edwards/edwards_pp.hpp" +#include "algebra/curves/mnt/mnt4/mnt4_pp.hpp" +#include "algebra/curves/mnt/mnt6/mnt6_pp.hpp" +#include "gadgetlib1/gadgets/merkle_tree/merkle_tree_check_read_gadget.hpp" +#include "gadgetlib1/gadgets/merkle_tree/merkle_tree_check_update_gadget.hpp" +#include "gadgetlib1/gadgets/hashes/sha256/sha256_gadget.hpp" + +using namespace libsnark; + +template +void test_all_merkle_tree_gadgets() +{ + typedef Fr FieldT; + test_merkle_tree_check_read_gadget >(); + test_merkle_tree_check_read_gadget >(); + + test_merkle_tree_check_update_gadget >(); + test_merkle_tree_check_update_gadget >(); +} + +int main(void) +{ + start_profiling(); + +#ifdef CURVE_BN128 // BN128 has fancy dependencies so it may be disabled + bn128_pp::init_public_params(); + test_all_merkle_tree_gadgets(); +#endif + + edwards_pp::init_public_params(); + test_all_merkle_tree_gadgets(); + + mnt4_pp::init_public_params(); + test_all_merkle_tree_gadgets(); + + mnt6_pp::init_public_params(); + test_all_merkle_tree_gadgets(); +} diff --git a/src/gadgetlib1/pb_variable.hpp b/src/gadgetlib1/pb_variable.hpp new file mode 100644 index 000000000..fdf64d014 --- /dev/null +++ b/src/gadgetlib1/pb_variable.hpp @@ -0,0 +1,144 @@ +/** @file + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef PB_VARIABLE_HPP_ +#define PB_VARIABLE_HPP_ + +#include +#include +#include +#include "common/utils.hpp" +#include "relations/variable.hpp" + +namespace libsnark { + +typedef size_t lc_index_t; + +template +class protoboard; + +template +class pb_variable : public variable { +public: + pb_variable(const var_index_t index = 0) : variable(index) {}; + + void allocate(protoboard &pb, const std::string &annotation=""); +}; + +template +class pb_variable_array : private std::vector > +{ + typedef std::vector > contents; +public: + using typename contents::iterator; + using typename contents::const_iterator; + using typename contents::reverse_iterator; + using typename contents::const_reverse_iterator; + + using contents::begin; + using contents::end; + using contents::rbegin; + using contents::rend; + using contents::emplace_back; + using contents::insert; + using contents::reserve; + using contents::size; + using contents::empty; + using contents::operator[]; + using contents::resize; + + pb_variable_array() : contents() {}; + pb_variable_array(size_t count, const pb_variable &value) : contents(count, value) {}; + pb_variable_array(typename contents::const_iterator first, typename contents::const_iterator last) : contents(first, last) {}; + pb_variable_array(typename contents::const_reverse_iterator first, typename contents::const_reverse_iterator last) : contents(first, last) {}; + void allocate(protoboard &pb, const size_t n, const std::string &annotation_prefix=""); + + void fill_with_field_elements(protoboard &pb, const std::vector& vals) const; + void fill_with_bits(protoboard &pb, const bit_vector& bits) const; + void fill_with_bits_of_ulong(protoboard &pb, const unsigned long i) const; + void fill_with_bits_of_field_element(protoboard &pb, const FieldT &r) const; + + std::vector get_vals(const protoboard &pb) const; + bit_vector get_bits(const protoboard &pb) const; + + FieldT get_field_element_from_bits(const protoboard &pb) const; +}; + +/* index 0 corresponds to the constant term (used in legacy code) */ +#define ONE pb_variable(0) + +template +class pb_linear_combination : public linear_combination { +public: + bool is_variable; + lc_index_t index; + + pb_linear_combination(); + pb_linear_combination(const pb_variable &var); + + void assign(protoboard &pb, const linear_combination &lc); + void evaluate(protoboard &pb) const; + + bool is_constant() const; + FieldT constant_term() const; +}; + +template +class pb_linear_combination_array : private std::vector > +{ + typedef std::vector > contents; +public: + using typename contents::iterator; + using typename contents::const_iterator; + using typename contents::reverse_iterator; + using typename contents::const_reverse_iterator; + + using contents::begin; + using contents::end; + using contents::rbegin; + using contents::rend; + using contents::emplace_back; + using contents::insert; + using contents::reserve; + using contents::size; + using contents::empty; + using contents::operator[]; + using contents::resize; + + pb_linear_combination_array() : contents() {}; + pb_linear_combination_array(const pb_variable_array &arr) { for (auto &v : arr) this->emplace_back(pb_linear_combination(v)); }; + pb_linear_combination_array(size_t count) : contents(count) {}; + pb_linear_combination_array(size_t count, const pb_linear_combination &value) : contents(count, value) {}; + pb_linear_combination_array(typename contents::const_iterator first, typename contents::const_iterator last) : contents(first, last) {}; + pb_linear_combination_array(typename contents::const_reverse_iterator first, typename contents::const_reverse_iterator last) : contents(first, last) {}; + + void evaluate(protoboard &pb) const; + + void fill_with_field_elements(protoboard &pb, const std::vector& vals) const; + void fill_with_bits(protoboard &pb, const bit_vector& bits) const; + void fill_with_bits_of_ulong(protoboard &pb, const unsigned long i) const; + void fill_with_bits_of_field_element(protoboard &pb, const FieldT &r) const; + + std::vector get_vals(const protoboard &pb) const; + bit_vector get_bits(const protoboard &pb) const; + + FieldT get_field_element_from_bits(const protoboard &pb) const; +}; + +template +linear_combination pb_sum(const pb_linear_combination_array &v); + +template +linear_combination pb_packing_sum(const pb_linear_combination_array &v); + +template +linear_combination pb_coeff_sum(const pb_linear_combination_array &v, const std::vector &coeffs); + +} // libsnark +#include "gadgetlib1/pb_variable.tcc" + +#endif // PB_VARIABLE_HPP_ diff --git a/src/gadgetlib1/pb_variable.tcc b/src/gadgetlib1/pb_variable.tcc new file mode 100644 index 000000000..b36b3f8d7 --- /dev/null +++ b/src/gadgetlib1/pb_variable.tcc @@ -0,0 +1,330 @@ +/** @file + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef PB_VARIABLE_TCC_ +#define PB_VARIABLE_TCC_ +#include +#include "gadgetlib1/protoboard.hpp" +#include "common/utils.hpp" + +namespace libsnark { + +template +void pb_variable::allocate(protoboard &pb, const std::string &annotation) +{ + this->index = pb.allocate_var_index(annotation); +} + +/* allocates pb_variable array in MSB->LSB order */ +template +void pb_variable_array::allocate(protoboard &pb, const size_t n, const std::string &annotation_prefix) +{ +#ifdef DEBUG + assert(annotation_prefix != ""); +#endif + (*this).resize(n); + + for (size_t i = 0; i < n; ++i) + { + (*this)[i].allocate(pb, FMT(annotation_prefix, "_%zu", i)); + } +} + +template +void pb_variable_array::fill_with_field_elements(protoboard &pb, const std::vector& vals) const +{ + assert(this->size() == vals.size()); + for (size_t i = 0; i < vals.size(); ++i) + { + pb.val((*this)[i]) = vals[i]; + } +} + +template +void pb_variable_array::fill_with_bits(protoboard &pb, const bit_vector& bits) const +{ + assert(this->size() == bits.size()); + for (size_t i = 0; i < bits.size(); ++i) + { + pb.val((*this)[i]) = (bits[i] ? FieldT::one() : FieldT::zero()); + } +} + +template +void pb_variable_array::fill_with_bits_of_field_element(protoboard &pb, const FieldT &r) const +{ + const bigint rint = r.as_bigint(); + for (size_t i = 0; i < this->size(); ++i) + { + pb.val((*this)[i]) = rint.test_bit(i) ? FieldT::one() : FieldT::zero(); + } +} + +template +void pb_variable_array::fill_with_bits_of_ulong(protoboard &pb, const unsigned long i) const +{ + this->fill_with_bits_of_field_element(pb, FieldT(i, true)); +} + +template +std::vector pb_variable_array::get_vals(const protoboard &pb) const +{ + std::vector result(this->size()); + for (size_t i = 0; i < this->size(); ++i) + { + result[i] = pb.val((*this)[i]); + } + return result; +} + +template +bit_vector pb_variable_array::get_bits(const protoboard &pb) const +{ + bit_vector result; + for (size_t i = 0; i < this->size(); ++i) + { + const FieldT v = pb.val((*this)[i]); + assert(v == FieldT::zero() || v == FieldT::one()); + result.push_back(v == FieldT::one()); + } + return result; +} + +template +FieldT pb_variable_array::get_field_element_from_bits(const protoboard &pb) const +{ + FieldT result = FieldT::zero(); + + for (size_t i = 0; i < this->size(); ++i) + { + /* push in the new bit */ + const FieldT v = pb.val((*this)[this->size()-1-i]); + assert(v == FieldT::zero() || v == FieldT::one()); + result += result + v; + } + + return result; +} + +template +pb_linear_combination::pb_linear_combination() +{ + this->is_variable = false; + this->index = 0; +} + +template +pb_linear_combination::pb_linear_combination(const pb_variable &var) +{ + this->is_variable = true; + this->index = var.index; + this->terms.emplace_back(linear_term(var)); +} + +template +void pb_linear_combination::assign(protoboard &pb, const linear_combination &lc) +{ + assert(this->is_variable == false); + this->index = pb.allocate_lc_index(); + this->terms = lc.terms; +} + +template +void pb_linear_combination::evaluate(protoboard &pb) const +{ + if (this->is_variable) + { + return; // do nothing + } + + FieldT sum = 0; + for (auto term : this->terms) + { + sum += term.coeff * pb.val(pb_variable(term.index)); + } + + pb.lc_val(*this) = sum; +} + +template +bool pb_linear_combination::is_constant() const +{ + if (is_variable) + { + return (index == 0); + } + else + { + for (auto term : this->terms) + { + if (term.index != 0) + { + return false; + } + } + + return true; + } +} + +template +FieldT pb_linear_combination::constant_term() const +{ + if (is_variable) + { + return (index == 0 ? FieldT::one() : FieldT::zero()); + } + else + { + FieldT result = FieldT::zero(); + for (auto term : this->terms) + { + if (term.index == 0) + { + result += term.coeff; + } + } + return result; + } +} + +template +void pb_linear_combination_array::evaluate(protoboard &pb) const +{ + for (size_t i = 0; i < this->size(); ++i) + { + (*this)[i].evaluate(pb); + } +} + +template +void pb_linear_combination_array::fill_with_field_elements(protoboard &pb, const std::vector& vals) const +{ + assert(this->size() == vals.size()); + for (size_t i = 0; i < vals.size(); ++i) + { + pb.lc_val((*this)[i]) = vals[i]; + } +} + +template +void pb_linear_combination_array::fill_with_bits(protoboard &pb, const bit_vector& bits) const +{ + assert(this->size() == bits.size()); + for (size_t i = 0; i < bits.size(); ++i) + { + pb.lc_val((*this)[i]) = (bits[i] ? FieldT::one() : FieldT::zero()); + } +} + +template +void pb_linear_combination_array::fill_with_bits_of_field_element(protoboard &pb, const FieldT &r) const +{ + const bigint rint = r.as_bigint(); + for (size_t i = 0; i < this->size(); ++i) + { + pb.lc_val((*this)[i]) = rint.test_bit(i) ? FieldT::one() : FieldT::zero(); + } +} + +template +void pb_linear_combination_array::fill_with_bits_of_ulong(protoboard &pb, const unsigned long i) const +{ + this->fill_with_bits_of_field_element(pb, FieldT(i)); +} + +template +std::vector pb_linear_combination_array::get_vals(const protoboard &pb) const +{ + std::vector result(this->size()); + for (size_t i = 0; i < this->size(); ++i) + { + result[i] = pb.lc_val((*this)[i]); + } + return result; +} + +template +bit_vector pb_linear_combination_array::get_bits(const protoboard &pb) const +{ + bit_vector result; + for (size_t i = 0; i < this->size(); ++i) + { + const FieldT v = pb.lc_val((*this)[i]); + assert(v == FieldT::zero() || v == FieldT::one()); + result.push_back(v == FieldT::one()); + } + return result; +} + +template +FieldT pb_linear_combination_array::get_field_element_from_bits(const protoboard &pb) const +{ + FieldT result = FieldT::zero(); + + for (size_t i = 0; i < this->size(); ++i) + { + /* push in the new bit */ + const FieldT v = pb.lc_val((*this)[this->size()-1-i]); + assert(v == FieldT::zero() || v == FieldT::one()); + result += result + v; + } + + return result; +} + +template +linear_combination pb_sum(const pb_linear_combination_array &v) +{ + linear_combination result; + for (auto &term : v) + { + result = result + term; + } + + return result; +} + +template +linear_combination pb_packing_sum(const pb_linear_combination_array &v) +{ + FieldT twoi = FieldT::one(); // will hold 2^i entering each iteration + std::vector > all_terms; + for (auto &lc : v) + { + for (auto &term : lc.terms) + { + all_terms.emplace_back(twoi * term); + } + twoi += twoi; + } + + return linear_combination(all_terms); +} + +template +linear_combination pb_coeff_sum(const pb_linear_combination_array &v, const std::vector &coeffs) +{ + assert(v.size() == coeffs.size()); + std::vector > all_terms; + + auto coeff_it = coeffs.begin(); + for (auto &lc : v) + { + for (auto &term : lc.terms) + { + all_terms.emplace_back((*coeff_it) * term); + } + ++coeff_it; + } + + return linear_combination(all_terms); +} + + +} // libsnark +#endif // PB_VARIABLE_TCC diff --git a/src/gadgetlib1/protoboard.hpp b/src/gadgetlib1/protoboard.hpp new file mode 100644 index 000000000..a910a6df9 --- /dev/null +++ b/src/gadgetlib1/protoboard.hpp @@ -0,0 +1,75 @@ +/** @file + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef PROTOBOARD_HPP_ +#define PROTOBOARD_HPP_ + +#include +#include +#include +#include +#include +#include "gadgetlib1/pb_variable.hpp" +#include "relations/constraint_satisfaction_problems/r1cs/r1cs.hpp" +#include "common/utils.hpp" + +namespace libsnark { + +template +class r1cs_constraint; + +template +class r1cs_constraint_system; + +template +class protoboard { +private: + FieldT constant_term; /* only here, because pb.val() needs to be able to return reference to the constant 1 term */ + r1cs_variable_assignment values; /* values[0] will hold the value of the first allocated variable of the protoboard, *NOT* constant 1 */ + var_index_t next_free_var; + lc_index_t next_free_lc; + std::vector lc_values; +public: + r1cs_constraint_system constraint_system; + + protoboard(); + + void clear_values(); + + FieldT& val(const pb_variable &var); + FieldT val(const pb_variable &var) const; + + FieldT& lc_val(const pb_linear_combination &lc); + FieldT lc_val(const pb_linear_combination &lc) const; + + void add_r1cs_constraint(const r1cs_constraint &constr, const std::string &annotation=""); + void augment_variable_annotation(const pb_variable &v, const std::string &postfix); + bool is_satisfied() const; + void dump_variables() const; + + size_t num_constraints() const; + size_t num_inputs() const; + size_t num_variables() const; + + void set_input_sizes(const size_t primary_input_size); + + r1cs_variable_assignment full_variable_assignment() const; + r1cs_primary_input primary_input() const; + r1cs_auxiliary_input auxiliary_input() const; + r1cs_constraint_system get_constraint_system() const; + + friend class pb_variable; + friend class pb_linear_combination; + +private: + var_index_t allocate_var_index(const std::string &annotation=""); + lc_index_t allocate_lc_index(); +}; + +} // libsnark +#include "gadgetlib1/protoboard.tcc" +#endif // PROTOBOARD_HPP_ diff --git a/src/gadgetlib1/protoboard.tcc b/src/gadgetlib1/protoboard.tcc new file mode 100644 index 000000000..882af28e6 --- /dev/null +++ b/src/gadgetlib1/protoboard.tcc @@ -0,0 +1,189 @@ +/** @file + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef PROTOBOARD_TCC_ +#define PROTOBOARD_TCC_ + +#include +#include +#include "common/profiling.hpp" + +namespace libsnark { + +template +protoboard::protoboard() +{ + constant_term = FieldT::one(); + +#ifdef DEBUG + constraint_system.variable_annotations[0] = "ONE"; +#endif + + next_free_var = 1; /* to account for constant 1 term */ + next_free_lc = 0; +} + +template +void protoboard::clear_values() +{ + std::fill(values.begin(), values.end(), FieldT::zero()); +} + +template +var_index_t protoboard::allocate_var_index(const std::string &annotation) +{ +#ifdef DEBUG + assert(annotation != ""); + constraint_system.variable_annotations[next_free_var] = annotation; +#else + UNUSED(annotation); +#endif + ++constraint_system.auxiliary_input_size; + values.emplace_back(FieldT::zero()); + return next_free_var++; +} + +template +lc_index_t protoboard::allocate_lc_index() +{ + lc_values.emplace_back(FieldT::zero()); + return next_free_lc++; +} + +template +FieldT& protoboard::val(const pb_variable &var) +{ + assert(var.index <= values.size()); + return (var.index == 0 ? constant_term : values[var.index-1]); +} + +template +FieldT protoboard::val(const pb_variable &var) const +{ + assert(var.index <= values.size()); + return (var.index == 0 ? constant_term : values[var.index-1]); +} + +template +FieldT& protoboard::lc_val(const pb_linear_combination &lc) +{ + if (lc.is_variable) + { + return this->val(pb_variable(lc.index)); + } + else + { + assert(lc.index < lc_values.size()); + return lc_values[lc.index]; + } +} + +template +FieldT protoboard::lc_val(const pb_linear_combination &lc) const +{ + if (lc.is_variable) + { + return this->val(pb_variable(lc.index)); + } + else + { + assert(lc.index < lc_values.size()); + return lc_values[lc.index]; + } +} + +template +void protoboard::add_r1cs_constraint(const r1cs_constraint &constr, const std::string &annotation) +{ +#ifdef DEBUG + assert(annotation != ""); + constraint_system.constraint_annotations[constraint_system.constraints.size()] = annotation; +#else + UNUSED(annotation); +#endif + constraint_system.constraints.emplace_back(constr); +} + +template +void protoboard::augment_variable_annotation(const pb_variable &v, const std::string &postfix) +{ +#ifdef DEBUG + auto it = constraint_system.variable_annotations.find(v.index); + constraint_system.variable_annotations[v.index] = (it == constraint_system.variable_annotations.end() ? "" : it->second + " ") + postfix; +#endif +} + +template +bool protoboard::is_satisfied() const +{ + return constraint_system.is_satisfied(primary_input(), auxiliary_input()); +} + +template +void protoboard::dump_variables() const +{ +#ifdef DEBUG + for (size_t i = 0; i < constraint_system.num_variables; ++i) + { + printf("%-40s --> ", constraint_system.variable_annotations[i].c_str()); + values[i].as_bigint().print_hex(); + } +#endif +} + +template +size_t protoboard::num_constraints() const +{ + return constraint_system.num_constraints(); +} + +template +size_t protoboard::num_inputs() const +{ + return constraint_system.num_inputs(); +} + +template +size_t protoboard::num_variables() const +{ + return next_free_var - 1; +} + +template +void protoboard::set_input_sizes(const size_t primary_input_size) +{ + assert(primary_input_size <= num_variables()); + constraint_system.primary_input_size = primary_input_size; + constraint_system.auxiliary_input_size = num_variables() - primary_input_size; +} + +template +r1cs_variable_assignment protoboard::full_variable_assignment() const +{ + return values; +} + +template +r1cs_primary_input protoboard::primary_input() const +{ + return r1cs_primary_input(values.begin(), values.begin() + num_inputs()); +} + +template +r1cs_auxiliary_input protoboard::auxiliary_input() const +{ + return r1cs_primary_input(values.begin() + num_inputs(), values.end()); +} + +template +r1cs_constraint_system protoboard::get_constraint_system() const +{ + return constraint_system; +} + +} // libsnark +#endif // PROTOBOARD_TCC_ diff --git a/src/reductions/r1cs_to_qap/r1cs_to_qap.hpp b/src/reductions/r1cs_to_qap/r1cs_to_qap.hpp new file mode 100644 index 000000000..b3cde710c --- /dev/null +++ b/src/reductions/r1cs_to_qap/r1cs_to_qap.hpp @@ -0,0 +1,70 @@ +/** @file + ***************************************************************************** + + Declaration of interfaces for a R1CS-to-QAP reduction, that is, constructing + a QAP ("Quadratic Arithmetic Program") from a R1CS ("Rank-1 Constraint System"). + + QAPs are defined in \[GGPR13], and construced for R1CS also in \[GGPR13]. + + The implementation of the reduction follows, extends, and optimizes + the efficient approach described in Appendix E of \[BCGTV13]. + + References: + + \[BCGTV13] + "SNARKs for C: Verifying Program Executions Succinctly and in Zero Knowledge", + Eli Ben-Sasson, Alessandro Chiesa, Daniel Genkin, Eran Tromer, Madars Virza, + CRYPTO 2013, + + + \[GGPR13]: + "Quadratic span programs and succinct NIZKs without PCPs", + Rosario Gennaro, Craig Gentry, Bryan Parno, Mariana Raykova, + EUROCRYPT 2013, + + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef R1CS_TO_QAP_HPP_ +#define R1CS_TO_QAP_HPP_ + +#include "relations/arithmetic_programs/qap/qap.hpp" +#include "relations/constraint_satisfaction_problems/r1cs/r1cs.hpp" + +namespace libsnark { + +/** + * Instance map for the R1CS-to-QAP reduction. + */ +template +qap_instance r1cs_to_qap_instance_map(const r1cs_constraint_system &cs); + +/** + * Instance map for the R1CS-to-QAP reduction followed by evaluation of the resulting QAP instance. + */ +template +qap_instance_evaluation r1cs_to_qap_instance_map_with_evaluation(const r1cs_constraint_system &cs, + const FieldT &t); + +/** + * Witness map for the R1CS-to-QAP reduction. + * + * The witness map takes zero knowledge into account when d1,d2,d3 are random. + */ +template +qap_witness r1cs_to_qap_witness_map(const r1cs_constraint_system &cs, + const r1cs_primary_input &primary_input, + const r1cs_auxiliary_input &auxiliary_input, + const FieldT &d1, + const FieldT &d2, + const FieldT &d3); + +} // libsnark + +#include "reductions/r1cs_to_qap/r1cs_to_qap.tcc" + +#endif // R1CS_TO_QAP_HPP_ diff --git a/src/reductions/r1cs_to_qap/r1cs_to_qap.tcc b/src/reductions/r1cs_to_qap/r1cs_to_qap.tcc new file mode 100644 index 000000000..3d0bee273 --- /dev/null +++ b/src/reductions/r1cs_to_qap/r1cs_to_qap.tcc @@ -0,0 +1,338 @@ +/** @file + ***************************************************************************** + + Implementation of interfaces for a R1CS-to-QAP reduction. + + See r1cs_to_qap.hpp . + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef R1CS_TO_QAP_TCC_ +#define R1CS_TO_QAP_TCC_ + +#include "common/profiling.hpp" +#include "common/utils.hpp" +#include "algebra/evaluation_domain/evaluation_domain.hpp" + +namespace libsnark { + +/** + * Instance map for the R1CS-to-QAP reduction. + * + * Namely, given a R1CS constraint system cs, construct a QAP instance for which: + * A := (A_0(z),A_1(z),...,A_m(z)) + * B := (B_0(z),B_1(z),...,B_m(z)) + * C := (C_0(z),C_1(z),...,C_m(z)) + * where + * m = number of variables of the QAP + * and + * each A_i,B_i,C_i is expressed in the Lagrange basis. + */ +template +qap_instance r1cs_to_qap_instance_map(const r1cs_constraint_system &cs) +{ + enter_block("Call to r1cs_to_qap_instance_map"); + + const std::shared_ptr > domain = get_evaluation_domain(cs.num_constraints() + cs.num_inputs() + 1); + + std::vector > A_in_Lagrange_basis(cs.num_variables()+1); + std::vector > B_in_Lagrange_basis(cs.num_variables()+1); + std::vector > C_in_Lagrange_basis(cs.num_variables()+1); + + enter_block("Compute polynomials A, B, C in Lagrange basis"); + /** + * add and process the constraints + * input_i * 0 = 0 + * to ensure soundness of input consistency + */ + for (size_t i = 0; i <= cs.num_inputs(); ++i) + { + A_in_Lagrange_basis[i][cs.num_constraints() + i] = FieldT::one(); + } + /* process all other constraints */ + for (size_t i = 0; i < cs.num_constraints(); ++i) + { + for (size_t j = 0; j < cs.constraints[i].a.terms.size(); ++j) + { + A_in_Lagrange_basis[cs.constraints[i].a.terms[j].index][i] += + cs.constraints[i].a.terms[j].coeff; + } + + for (size_t j = 0; j < cs.constraints[i].b.terms.size(); ++j) + { + B_in_Lagrange_basis[cs.constraints[i].b.terms[j].index][i] += + cs.constraints[i].b.terms[j].coeff; + } + + for (size_t j = 0; j < cs.constraints[i].c.terms.size(); ++j) + { + C_in_Lagrange_basis[cs.constraints[i].c.terms[j].index][i] += + cs.constraints[i].c.terms[j].coeff; + } + } + leave_block("Compute polynomials A, B, C in Lagrange basis"); + + leave_block("Call to r1cs_to_qap_instance_map"); + + return qap_instance(domain, + cs.num_variables(), + domain->m, + cs.num_inputs(), + std::move(A_in_Lagrange_basis), + std::move(B_in_Lagrange_basis), + std::move(C_in_Lagrange_basis)); +} + +/** + * Instance map for the R1CS-to-QAP reduction followed by evaluation of the resulting QAP instance. + * + * Namely, given a R1CS constraint system cs and a field element t, construct + * a QAP instance (evaluated at t) for which: + * At := (A_0(t),A_1(t),...,A_m(t)) + * Bt := (B_0(t),B_1(t),...,B_m(t)) + * Ct := (C_0(t),C_1(t),...,C_m(t)) + * Ht := (1,t,t^2,...,t^n) + * Zt := Z(t) = "vanishing polynomial of a certain set S, evaluated at t" + * where + * m = number of variables of the QAP + * n = degree of the QAP + */ +template +qap_instance_evaluation r1cs_to_qap_instance_map_with_evaluation(const r1cs_constraint_system &cs, + const FieldT &t) +{ + enter_block("Call to r1cs_to_qap_instance_map_with_evaluation"); + + const std::shared_ptr > domain = get_evaluation_domain(cs.num_constraints() + cs.num_inputs() + 1); + + std::vector At, Bt, Ct, Ht; + + At.resize(cs.num_variables()+1, FieldT::zero()); + Bt.resize(cs.num_variables()+1, FieldT::zero()); + Ct.resize(cs.num_variables()+1, FieldT::zero()); + Ht.reserve(domain->m+1); + + const FieldT Zt = domain->compute_Z(t); + + enter_block("Compute evaluations of A, B, C, H at t"); + const std::vector u = domain->lagrange_coeffs(t); + /** + * add and process the constraints + * input_i * 0 = 0 + * to ensure soundness of input consistency + */ + for (size_t i = 0; i <= cs.num_inputs(); ++i) + { + At[i] = u[cs.num_constraints() + i]; + } + /* process all other constraints */ + for (size_t i = 0; i < cs.num_constraints(); ++i) + { + for (size_t j = 0; j < cs.constraints[i].a.terms.size(); ++j) + { + At[cs.constraints[i].a.terms[j].index] += + u[i]*cs.constraints[i].a.terms[j].coeff; + } + + for (size_t j = 0; j < cs.constraints[i].b.terms.size(); ++j) + { + Bt[cs.constraints[i].b.terms[j].index] += + u[i]*cs.constraints[i].b.terms[j].coeff; + } + + for (size_t j = 0; j < cs.constraints[i].c.terms.size(); ++j) + { + Ct[cs.constraints[i].c.terms[j].index] += + u[i]*cs.constraints[i].c.terms[j].coeff; + } + } + + FieldT ti = FieldT::one(); + for (size_t i = 0; i < domain->m+1; ++i) + { + Ht.emplace_back(ti); + ti *= t; + } + leave_block("Compute evaluations of A, B, C, H at t"); + + leave_block("Call to r1cs_to_qap_instance_map_with_evaluation"); + + return qap_instance_evaluation(domain, + cs.num_variables(), + domain->m, + cs.num_inputs(), + t, + std::move(At), + std::move(Bt), + std::move(Ct), + std::move(Ht), + Zt); +} + +/** + * Witness map for the R1CS-to-QAP reduction. + * + * The witness map takes zero knowledge into account when d1,d2,d3 are random. + * + * More precisely, compute the coefficients + * h_0,h_1,...,h_n + * of the polynomial + * H(z) := (A(z)*B(z)-C(z))/Z(z) + * where + * A(z) := A_0(z) + \sum_{k=1}^{m} w_k A_k(z) + d1 * Z(z) + * B(z) := B_0(z) + \sum_{k=1}^{m} w_k B_k(z) + d2 * Z(z) + * C(z) := C_0(z) + \sum_{k=1}^{m} w_k C_k(z) + d3 * Z(z) + * Z(z) := "vanishing polynomial of set S" + * and + * m = number of variables of the QAP + * n = degree of the QAP + * + * This is done as follows: + * (1) compute evaluations of A,B,C on S = {sigma_1,...,sigma_n} + * (2) compute coefficients of A,B,C + * (3) compute evaluations of A,B,C on T = "coset of S" + * (4) compute evaluation of H on T + * (5) compute coefficients of H + * (6) patch H to account for d1,d2,d3 (i.e., add coefficients of the polynomial (A d2 + B d1 - d3) + d1*d2*Z ) + * + * The code below is not as simple as the above high-level description due to + * some reshuffling to save space. + */ +template +qap_witness r1cs_to_qap_witness_map(const r1cs_constraint_system &cs, + const r1cs_primary_input &primary_input, + const r1cs_auxiliary_input &auxiliary_input, + const FieldT &d1, + const FieldT &d2, + const FieldT &d3) +{ + enter_block("Call to r1cs_to_qap_witness_map"); + + /* sanity check */ + assert(cs.is_satisfied(primary_input, auxiliary_input)); + + const std::shared_ptr > domain = get_evaluation_domain(cs.num_constraints() + cs.num_inputs() + 1); + + r1cs_variable_assignment full_variable_assignment = primary_input; + full_variable_assignment.insert(full_variable_assignment.end(), auxiliary_input.begin(), auxiliary_input.end()); + + enter_block("Compute evaluation of polynomials A, B on set S"); + std::vector aA(domain->m, FieldT::zero()), aB(domain->m, FieldT::zero()); + + /* account for the additional constraints input_i * 0 = 0 */ + for (size_t i = 0; i <= cs.num_inputs(); ++i) + { + aA[i+cs.num_constraints()] = (i > 0 ? full_variable_assignment[i-1] : FieldT::one()); + } + /* account for all other constraints */ + for (size_t i = 0; i < cs.num_constraints(); ++i) + { + aA[i] += cs.constraints[i].a.evaluate(full_variable_assignment); + aB[i] += cs.constraints[i].b.evaluate(full_variable_assignment); + } + leave_block("Compute evaluation of polynomials A, B on set S"); + + enter_block("Compute coefficients of polynomial A"); + domain->iFFT(aA); + leave_block("Compute coefficients of polynomial A"); + + enter_block("Compute coefficients of polynomial B"); + domain->iFFT(aB); + leave_block("Compute coefficients of polynomial B"); + + enter_block("Compute ZK-patch"); + std::vector coefficients_for_H(domain->m+1, FieldT::zero()); +#ifdef MULTICORE +#pragma omp parallel for +#endif + /* add coefficients of the polynomial (d2*A + d1*B - d3) + d1*d2*Z */ + for (size_t i = 0; i < domain->m; ++i) + { + coefficients_for_H[i] = d2*aA[i] + d1*aB[i]; + } + coefficients_for_H[0] -= d3; + domain->add_poly_Z(d1*d2, coefficients_for_H); + leave_block("Compute ZK-patch"); + + enter_block("Compute evaluation of polynomial A on set T"); + domain->cosetFFT(aA, FieldT::multiplicative_generator); + leave_block("Compute evaluation of polynomial A on set T"); + + enter_block("Compute evaluation of polynomial B on set T"); + domain->cosetFFT(aB, FieldT::multiplicative_generator); + leave_block("Compute evaluation of polynomial B on set T"); + + enter_block("Compute evaluation of polynomial H on set T"); + std::vector &H_tmp = aA; // can overwrite aA because it is not used later +#ifdef MULTICORE +#pragma omp parallel for +#endif + for (size_t i = 0; i < domain->m; ++i) + { + H_tmp[i] = aA[i]*aB[i]; + } + std::vector().swap(aB); // destroy aB + + enter_block("Compute evaluation of polynomial C on set S"); + std::vector aC(domain->m, FieldT::zero()); + for (size_t i = 0; i < cs.num_constraints(); ++i) + { + aC[i] += cs.constraints[i].c.evaluate(full_variable_assignment); + } + leave_block("Compute evaluation of polynomial C on set S"); + + enter_block("Compute coefficients of polynomial C"); + domain->iFFT(aC); + leave_block("Compute coefficients of polynomial C"); + + enter_block("Compute evaluation of polynomial C on set T"); + domain->cosetFFT(aC, FieldT::multiplicative_generator); + leave_block("Compute evaluation of polynomial C on set T"); + +#ifdef MULTICORE +#pragma omp parallel for +#endif + for (size_t i = 0; i < domain->m; ++i) + { + H_tmp[i] = (H_tmp[i]-aC[i]); + } + + enter_block("Divide by Z on set T"); + domain->divide_by_Z_on_coset(H_tmp); + leave_block("Divide by Z on set T"); + + leave_block("Compute evaluation of polynomial H on set T"); + + enter_block("Compute coefficients of polynomial H"); + domain->icosetFFT(H_tmp, FieldT::multiplicative_generator); + leave_block("Compute coefficients of polynomial H"); + + enter_block("Compute sum of H and ZK-patch"); +#ifdef MULTICORE +#pragma omp parallel for +#endif + for (size_t i = 0; i < domain->m; ++i) + { + coefficients_for_H[i] += H_tmp[i]; + } + leave_block("Compute sum of H and ZK-patch"); + + leave_block("Call to r1cs_to_qap_witness_map"); + + return qap_witness(cs.num_variables(), + domain->m, + cs.num_inputs(), + d1, + d2, + d3, + full_variable_assignment, + std::move(coefficients_for_H)); +} + +} // libsnark + +#endif // R1CS_TO_QAP_TCC_ diff --git a/src/relations/arithmetic_programs/qap/qap.hpp b/src/relations/arithmetic_programs/qap/qap.hpp new file mode 100644 index 000000000..4991d203b --- /dev/null +++ b/src/relations/arithmetic_programs/qap/qap.hpp @@ -0,0 +1,193 @@ +/** @file + ***************************************************************************** + + Declaration of interfaces for a QAP ("Quadratic Arithmetic Program"). + + QAPs are defined in \[GGPR13]. + + References: + + \[GGPR13]: + "Quadratic span programs and succinct NIZKs without PCPs", + Rosario Gennaro, Craig Gentry, Bryan Parno, Mariana Raykova, + EUROCRYPT 2013, + + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef QAP_HPP_ +#define QAP_HPP_ + +#include "algebra/evaluation_domain/evaluation_domain.hpp" + +namespace libsnark { + +/* forward declaration */ +template +class qap_witness; + +/** + * A QAP instance. + * + * Specifically, the datastructure stores: + * - a choice of domain (corresponding to a certain subset of the field); + * - the number of variables, the degree, and the number of inputs; and + * - coefficients of the A,B,C polynomials in the Lagrange basis. + * + * There is no need to store the Z polynomial because it is uniquely + * determined by the domain (as Z is its vanishing polynomial). + */ +template +class qap_instance { +private: + size_t num_variables_; + size_t degree_; + size_t num_inputs_; + +public: + std::shared_ptr > domain; + + std::vector > A_in_Lagrange_basis; + std::vector > B_in_Lagrange_basis; + std::vector > C_in_Lagrange_basis; + + qap_instance(const std::shared_ptr > &domain, + const size_t num_variables, + const size_t degree, + const size_t num_inputs, + const std::vector > &A_in_Lagrange_basis, + const std::vector > &B_in_Lagrange_basis, + const std::vector > &C_in_Lagrange_basis); + + qap_instance(const std::shared_ptr > &domain, + const size_t num_variables, + const size_t degree, + const size_t num_inputs, + std::vector > &&A_in_Lagrange_basis, + std::vector > &&B_in_Lagrange_basis, + std::vector > &&C_in_Lagrange_basis); + + qap_instance(const qap_instance &other) = default; + qap_instance(qap_instance &&other) = default; + qap_instance& operator=(const qap_instance &other) = default; + qap_instance& operator=(qap_instance &&other) = default; + + size_t num_variables() const; + size_t degree() const; + size_t num_inputs() const; + + bool is_satisfied(const qap_witness &witness) const; +}; + +/** + * A QAP instance evaluation is a QAP instance that is evaluated at a field element t. + * + * Specifically, the datastructure stores: + * - a choice of domain (corresponding to a certain subset of the field); + * - the number of variables, the degree, and the number of inputs; + * - a field element t; + * - evaluations of the A,B,C (and Z) polynomials at t; + * - evaluations of all monomials of t; + * - counts about how many of the above evaluations are in fact non-zero. + */ +template +class qap_instance_evaluation { +private: + size_t num_variables_; + size_t degree_; + size_t num_inputs_; +public: + std::shared_ptr > domain; + + FieldT t; + + std::vector At, Bt, Ct, Ht; + + FieldT Zt; + + qap_instance_evaluation(const std::shared_ptr > &domain, + const size_t num_variables, + const size_t degree, + const size_t num_inputs, + const FieldT &t, + const std::vector &At, + const std::vector &Bt, + const std::vector &Ct, + const std::vector &Ht, + const FieldT &Zt); + qap_instance_evaluation(const std::shared_ptr > &domain, + const size_t num_variables, + const size_t degree, + const size_t num_inputs, + const FieldT &t, + std::vector &&At, + std::vector &&Bt, + std::vector &&Ct, + std::vector &&Ht, + const FieldT &Zt); + + qap_instance_evaluation(const qap_instance_evaluation &other) = default; + qap_instance_evaluation(qap_instance_evaluation &&other) = default; + qap_instance_evaluation& operator=(const qap_instance_evaluation &other) = default; + qap_instance_evaluation& operator=(qap_instance_evaluation &&other) = default; + + size_t num_variables() const; + size_t degree() const; + size_t num_inputs() const; + + bool is_satisfied(const qap_witness &witness) const; +}; + +/** + * A QAP witness. + */ +template +class qap_witness { +private: + size_t num_variables_; + size_t degree_; + size_t num_inputs_; + +public: + FieldT d1, d2, d3; + + std::vector coefficients_for_ABCs; + std::vector coefficients_for_H; + + qap_witness(const size_t num_variables, + const size_t degree, + const size_t num_inputs, + const FieldT &d1, + const FieldT &d2, + const FieldT &d3, + const std::vector &coefficients_for_ABCs, + const std::vector &coefficients_for_H); + + qap_witness(const size_t num_variables, + const size_t degree, + const size_t num_inputs, + const FieldT &d1, + const FieldT &d2, + const FieldT &d3, + const std::vector &coefficients_for_ABCs, + std::vector &&coefficients_for_H); + + qap_witness(const qap_witness &other) = default; + qap_witness(qap_witness &&other) = default; + qap_witness& operator=(const qap_witness &other) = default; + qap_witness& operator=(qap_witness &&other) = default; + + size_t num_variables() const; + size_t degree() const; + size_t num_inputs() const; +}; + +} // libsnark + +#include "relations/arithmetic_programs/qap/qap.tcc" + +#endif // QAP_HPP_ diff --git a/src/relations/arithmetic_programs/qap/qap.tcc b/src/relations/arithmetic_programs/qap/qap.tcc new file mode 100644 index 000000000..a4a3c96a2 --- /dev/null +++ b/src/relations/arithmetic_programs/qap/qap.tcc @@ -0,0 +1,324 @@ +/** @file +***************************************************************************** + +Implementation of interfaces for a QAP ("Quadratic Arithmetic Program"). + +See qap.hpp . + +***************************************************************************** +* @author This file is part of libsnark, developed by SCIPR Lab +* and contributors (see AUTHORS). +* @copyright MIT license (see LICENSE file) +*****************************************************************************/ + +#ifndef QAP_TCC_ +#define QAP_TCC_ + +#include "common/profiling.hpp" +#include "common/utils.hpp" +#include "algebra/evaluation_domain/evaluation_domain.hpp" +#include "algebra/scalar_multiplication/multiexp.hpp" + +namespace libsnark { + +template +qap_instance::qap_instance(const std::shared_ptr > &domain, + const size_t num_variables, + const size_t degree, + const size_t num_inputs, + const std::vector > &A_in_Lagrange_basis, + const std::vector > &B_in_Lagrange_basis, + const std::vector > &C_in_Lagrange_basis) : + num_variables_(num_variables), + degree_(degree), + num_inputs_(num_inputs), + domain(domain), + A_in_Lagrange_basis(A_in_Lagrange_basis), + B_in_Lagrange_basis(B_in_Lagrange_basis), + C_in_Lagrange_basis(C_in_Lagrange_basis) +{ +} + +template +qap_instance::qap_instance(const std::shared_ptr > &domain, + const size_t num_variables, + const size_t degree, + const size_t num_inputs, + std::vector > &&A_in_Lagrange_basis, + std::vector > &&B_in_Lagrange_basis, + std::vector > &&C_in_Lagrange_basis) : + num_variables_(num_variables), + degree_(degree), + num_inputs_(num_inputs), + domain(domain), + A_in_Lagrange_basis(std::move(A_in_Lagrange_basis)), + B_in_Lagrange_basis(std::move(B_in_Lagrange_basis)), + C_in_Lagrange_basis(std::move(C_in_Lagrange_basis)) +{ +} + +template +size_t qap_instance::num_variables() const +{ + return num_variables_; +} + +template +size_t qap_instance::degree() const +{ + return degree_; +} + +template +size_t qap_instance::num_inputs() const +{ + return num_inputs_; +} + +template +bool qap_instance::is_satisfied(const qap_witness &witness) const +{ + const FieldT t = FieldT::random_element(); + + std::vector At(this->num_variables()+1, FieldT::zero()); + std::vector Bt(this->num_variables()+1, FieldT::zero()); + std::vector Ct(this->num_variables()+1, FieldT::zero()); + std::vector Ht(this->degree()+1); + + const FieldT Zt = this->domain->compute_Z(t); + + const std::vector u = this->domain->lagrange_coeffs(t); + + for (size_t i = 0; i < this->num_variables()+1; ++i) + { + for (auto &el : A_in_Lagrange_basis[i]) + { + At[i] += u[el.first] * el.second; + } + + for (auto &el : B_in_Lagrange_basis[i]) + { + Bt[i] += u[el.first] * el.second; + } + + for (auto &el : C_in_Lagrange_basis[i]) + { + Ct[i] += u[el.first] * el.second; + } + } + + FieldT ti = FieldT::one(); + for (size_t i = 0; i < this->degree()+1; ++i) + { + Ht[i] = ti; + ti *= t; + } + + const qap_instance_evaluation eval_qap_inst(this->domain, + this->num_variables(), + this->degree(), + this->num_inputs(), + t, + std::move(At), + std::move(Bt), + std::move(Ct), + std::move(Ht), + Zt); + return eval_qap_inst.is_satisfied(witness); +} + +template +qap_instance_evaluation::qap_instance_evaluation(const std::shared_ptr > &domain, + const size_t num_variables, + const size_t degree, + const size_t num_inputs, + const FieldT &t, + const std::vector &At, + const std::vector &Bt, + const std::vector &Ct, + const std::vector &Ht, + const FieldT &Zt) : + num_variables_(num_variables), + degree_(degree), + num_inputs_(num_inputs), + domain(domain), + t(t), + At(At), + Bt(Bt), + Ct(Ct), + Ht(Ht), + Zt(Zt) +{ +} + +template +qap_instance_evaluation::qap_instance_evaluation(const std::shared_ptr > &domain, + const size_t num_variables, + const size_t degree, + const size_t num_inputs, + const FieldT &t, + std::vector &&At, + std::vector &&Bt, + std::vector &&Ct, + std::vector &&Ht, + const FieldT &Zt) : + num_variables_(num_variables), + degree_(degree), + num_inputs_(num_inputs), + domain(domain), + t(t), + At(std::move(At)), + Bt(std::move(Bt)), + Ct(std::move(Ct)), + Ht(std::move(Ht)), + Zt(Zt) +{ +} + +template +size_t qap_instance_evaluation::num_variables() const +{ + return num_variables_; +} + +template +size_t qap_instance_evaluation::degree() const +{ + return degree_; +} + +template +size_t qap_instance_evaluation::num_inputs() const +{ + return num_inputs_; +} + +template +bool qap_instance_evaluation::is_satisfied(const qap_witness &witness) const +{ + + if (this->num_variables() != witness.num_variables()) + { + return false; + } + + if (this->degree() != witness.degree()) + { + return false; + } + + if (this->num_inputs() != witness.num_inputs()) + { + return false; + } + + if (this->num_variables() != witness.coefficients_for_ABCs.size()) + { + return false; + } + + if (this->degree()+1 != witness.coefficients_for_H.size()) + { + return false; + } + + if (this->At.size() != this->num_variables()+1 || this->Bt.size() != this->num_variables()+1 || this->Ct.size() != this->num_variables()+1) + { + return false; + } + + if (this->Ht.size() != this->degree()+1) + { + return false; + } + + if (this->Zt != this->domain->compute_Z(this->t)) + { + return false; + } + + FieldT ans_A = this->At[0] + witness.d1*this->Zt; + FieldT ans_B = this->Bt[0] + witness.d2*this->Zt; + FieldT ans_C = this->Ct[0] + witness.d3*this->Zt; + FieldT ans_H = FieldT::zero(); + + ans_A = ans_A + naive_plain_exp(this->At.begin()+1, this->At.begin()+1+this->num_variables(), + witness.coefficients_for_ABCs.begin(), witness.coefficients_for_ABCs.begin()+this->num_variables()); + ans_B = ans_B + naive_plain_exp(this->Bt.begin()+1, this->Bt.begin()+1+this->num_variables(), + witness.coefficients_for_ABCs.begin(), witness.coefficients_for_ABCs.begin()+this->num_variables()); + ans_C = ans_C + naive_plain_exp(this->Ct.begin()+1, this->Ct.begin()+1+this->num_variables(), + witness.coefficients_for_ABCs.begin(), witness.coefficients_for_ABCs.begin()+this->num_variables()); + ans_H = ans_H + naive_plain_exp(this->Ht.begin(), this->Ht.begin()+this->degree()+1, + witness.coefficients_for_H.begin(), witness.coefficients_for_H.begin()+this->degree()+1); + + if (ans_A * ans_B - ans_C != ans_H * this->Zt) + { + return false; + } + + return true; +} + +template +qap_witness::qap_witness(const size_t num_variables, + const size_t degree, + const size_t num_inputs, + const FieldT &d1, + const FieldT &d2, + const FieldT &d3, + const std::vector &coefficients_for_ABCs, + const std::vector &coefficients_for_H) : + num_variables_(num_variables), + degree_(degree), + num_inputs_(num_inputs), + d1(d1), + d2(d2), + d3(d3), + coefficients_for_ABCs(coefficients_for_ABCs), + coefficients_for_H(coefficients_for_H) +{ +} + +template +qap_witness::qap_witness(const size_t num_variables, + const size_t degree, + const size_t num_inputs, + const FieldT &d1, + const FieldT &d2, + const FieldT &d3, + const std::vector &coefficients_for_ABCs, + std::vector &&coefficients_for_H) : + num_variables_(num_variables), + degree_(degree), + num_inputs_(num_inputs), + d1(d1), + d2(d2), + d3(d3), + coefficients_for_ABCs(coefficients_for_ABCs), + coefficients_for_H(std::move(coefficients_for_H)) +{ +} + + +template +size_t qap_witness::num_variables() const +{ + return num_variables_; +} + +template +size_t qap_witness::degree() const +{ + return degree_; +} + +template +size_t qap_witness::num_inputs() const +{ + return num_inputs_; +} + + +} // libsnark + +#endif // QAP_TCC_ diff --git a/src/relations/arithmetic_programs/qap/tests/test_qap.cpp b/src/relations/arithmetic_programs/qap/tests/test_qap.cpp new file mode 100644 index 000000000..d8aaddaa7 --- /dev/null +++ b/src/relations/arithmetic_programs/qap/tests/test_qap.cpp @@ -0,0 +1,115 @@ +/** + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ +#include +#include +#include +#include +#include + +#include "algebra/curves/mnt/mnt6/mnt6_pp.hpp" +#include "algebra/fields/field_utils.hpp" +#include "common/profiling.hpp" +#include "common/utils.hpp" +#include "reductions/r1cs_to_qap/r1cs_to_qap.hpp" +#include "relations/constraint_satisfaction_problems/r1cs/examples/r1cs_examples.hpp" + +using namespace libsnark; + +template +void test_qap(const size_t qap_degree, const size_t num_inputs, const bool binary_input) +{ + /* + We construct an instance where the QAP degree is qap_degree. + So we generate an instance of R1CS where the number of constraints qap_degree - num_inputs - 1. + See the transformation from R1CS to QAP for why this is the case. + So we need that qap_degree >= num_inputs + 1. + */ + assert(num_inputs + 1 <= qap_degree); + enter_block("Call to test_qap"); + + const size_t num_constraints = qap_degree - num_inputs - 1; + + print_indent(); printf("* QAP degree: %zu\n", qap_degree); + print_indent(); printf("* Number of inputs: %zu\n", num_inputs); + print_indent(); printf("* Number of R1CS constraints: %zu\n", num_constraints); + print_indent(); printf("* Input type: %s\n", binary_input ? "binary" : "field"); + + enter_block("Generate constraint system and assignment"); + r1cs_example example; + if (binary_input) + { + example = generate_r1cs_example_with_binary_input(num_constraints, num_inputs); + } + else + { + example = generate_r1cs_example_with_field_input(num_constraints, num_inputs); + } + leave_block("Generate constraint system and assignment"); + + enter_block("Check satisfiability of constraint system"); + assert(example.constraint_system.is_satisfied(example.primary_input, example.auxiliary_input)); + leave_block("Check satisfiability of constraint system"); + + const FieldT t = FieldT::random_element(), + d1 = FieldT::random_element(), + d2 = FieldT::random_element(), + d3 = FieldT::random_element(); + + enter_block("Compute QAP instance 1"); + qap_instance qap_inst_1 = r1cs_to_qap_instance_map(example.constraint_system); + leave_block("Compute QAP instance 1"); + + enter_block("Compute QAP instance 2"); + qap_instance_evaluation qap_inst_2 = r1cs_to_qap_instance_map_with_evaluation(example.constraint_system, t); + leave_block("Compute QAP instance 2"); + + enter_block("Compute QAP witness"); + qap_witness qap_wit = r1cs_to_qap_witness_map(example.constraint_system, example.primary_input, example.auxiliary_input, d1, d2, d3); + leave_block("Compute QAP witness"); + + enter_block("Check satisfiability of QAP instance 1"); + assert(qap_inst_1.is_satisfied(qap_wit)); + leave_block("Check satisfiability of QAP instance 1"); + + enter_block("Check satisfiability of QAP instance 2"); + assert(qap_inst_2.is_satisfied(qap_wit)); + leave_block("Check satisfiability of QAP instance 2"); + + leave_block("Call to test_qap"); +} + +int main() +{ + start_profiling(); + + mnt6_pp::init_public_params(); + + const size_t num_inputs = 10; + + const size_t basic_domain_size = 1ul< >(basic_domain_size, num_inputs, true); + test_qap >(step_domain_size, num_inputs, true); + test_qap >(extended_domain_size, num_inputs, true); + test_qap >(extended_domain_size_special, num_inputs, true); + + leave_block("Test QAP with binary input"); + + enter_block("Test QAP with field input"); + + test_qap >(basic_domain_size, num_inputs, false); + test_qap >(step_domain_size, num_inputs, false); + test_qap >(extended_domain_size, num_inputs, false); + test_qap >(extended_domain_size_special, num_inputs, false); + + leave_block("Test QAP with field input"); +} diff --git a/src/relations/constraint_satisfaction_problems/r1cs/examples/r1cs_examples.hpp b/src/relations/constraint_satisfaction_problems/r1cs/examples/r1cs_examples.hpp new file mode 100644 index 000000000..47003e959 --- /dev/null +++ b/src/relations/constraint_satisfaction_problems/r1cs/examples/r1cs_examples.hpp @@ -0,0 +1,73 @@ +/** @file + ***************************************************************************** + + Declaration of interfaces for a R1CS example, as well as functions to sample + R1CS examples with prescribed parameters (according to some distribution). + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef R1CS_EXAMPLES_HPP_ +#define R1CS_EXAMPLES_HPP_ + +#include "relations/constraint_satisfaction_problems/r1cs/r1cs.hpp" + +namespace libsnark { + +/** + * A R1CS example comprises a R1CS constraint system, R1CS input, and R1CS witness. + */ +template +struct r1cs_example { + r1cs_constraint_system constraint_system; + r1cs_primary_input primary_input; + r1cs_auxiliary_input auxiliary_input; + + r1cs_example() = default; + r1cs_example(const r1cs_example &other) = default; + r1cs_example(const r1cs_constraint_system &constraint_system, + const r1cs_primary_input &primary_input, + const r1cs_auxiliary_input &auxiliary_input) : + constraint_system(constraint_system), + primary_input(primary_input), + auxiliary_input(auxiliary_input) + {}; + r1cs_example(r1cs_constraint_system &&constraint_system, + r1cs_primary_input &&primary_input, + r1cs_auxiliary_input &&auxiliary_input) : + constraint_system(std::move(constraint_system)), + primary_input(std::move(primary_input)), + auxiliary_input(std::move(auxiliary_input)) + {}; +}; + +/** + * Generate a R1CS example such that: + * - the number of constraints of the R1CS constraint system is num_constraints; + * - the number of variables of the R1CS constraint system is (approximately) num_constraints; + * - the number of inputs of the R1CS constraint system is num_inputs; + * - the R1CS input consists of ``full'' field elements (typically require the whole log|Field| bits to represent). + */ +template +r1cs_example generate_r1cs_example_with_field_input(const size_t num_constraints, + const size_t num_inputs); + +/** + * Generate a R1CS example such that: + * - the number of constraints of the R1CS constraint system is num_constraints; + * - the number of variables of the R1CS constraint system is (approximately) num_constraints; + * - the number of inputs of the R1CS constraint system is num_inputs; + * - the R1CS input consists of binary values (as opposed to ``full'' field elements). + */ +template +r1cs_example generate_r1cs_example_with_binary_input(const size_t num_constraints, + const size_t num_inputs); + +} // libsnark + +#include "relations/constraint_satisfaction_problems/r1cs/examples/r1cs_examples.tcc" + +#endif // R1CS_EXAMPLES_HPP_ diff --git a/src/relations/constraint_satisfaction_problems/r1cs/examples/r1cs_examples.tcc b/src/relations/constraint_satisfaction_problems/r1cs/examples/r1cs_examples.tcc new file mode 100644 index 000000000..defa07721 --- /dev/null +++ b/src/relations/constraint_satisfaction_problems/r1cs/examples/r1cs_examples.tcc @@ -0,0 +1,164 @@ +/** @file + ***************************************************************************** + + Implementation of functions to sample R1CS examples with prescribed parameters + (according to some distribution). + + See r1cs_examples.hpp . + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef R1CS_EXAMPLES_TCC_ +#define R1CS_EXAMPLES_TCC_ + +#include + +#include "common/utils.hpp" + +namespace libsnark { + +template +r1cs_example generate_r1cs_example_with_field_input(const size_t num_constraints, + const size_t num_inputs) +{ + enter_block("Call to generate_r1cs_example_with_field_input"); + + assert(num_inputs <= num_constraints + 2); + + r1cs_constraint_system cs; + cs.primary_input_size = num_inputs; + cs.auxiliary_input_size = 2 + num_constraints - num_inputs; // TODO: explain this + + r1cs_variable_assignment full_variable_assignment; + FieldT a = FieldT::random_element(); + FieldT b = FieldT::random_element(); + full_variable_assignment.push_back(a); + full_variable_assignment.push_back(b); + + for (size_t i = 0; i < num_constraints-1; ++i) + { + linear_combination A, B, C; + + if (i % 2) + { + // a * b = c + A.add_term(i+1, 1); + B.add_term(i+2, 1); + C.add_term(i+3, 1); + FieldT tmp = a*b; + full_variable_assignment.push_back(tmp); + a = b; b = tmp; + } + else + { + // a + b = c + B.add_term(0, 1); + A.add_term(i+1, 1); + A.add_term(i+2, 1); + C.add_term(i+3, 1); + FieldT tmp = a+b; + full_variable_assignment.push_back(tmp); + a = b; b = tmp; + } + + cs.add_constraint(r1cs_constraint(A, B, C)); + } + + linear_combination A, B, C; + FieldT fin = FieldT::zero(); + for (size_t i = 1; i < cs.num_variables(); ++i) + { + A.add_term(i, 1); + B.add_term(i, 1); + fin = fin + full_variable_assignment[i-1]; + } + C.add_term(cs.num_variables(), 1); + cs.add_constraint(r1cs_constraint(A, B, C)); + full_variable_assignment.push_back(fin.squared()); + + /* split variable assignment */ + r1cs_primary_input primary_input(full_variable_assignment.begin(), full_variable_assignment.begin() + num_inputs); + r1cs_primary_input auxiliary_input(full_variable_assignment.begin() + num_inputs, full_variable_assignment.end()); + + /* sanity checks */ + assert(cs.num_variables() == full_variable_assignment.size()); + assert(cs.num_variables() >= num_inputs); + assert(cs.num_inputs() == num_inputs); + assert(cs.num_constraints() == num_constraints); + assert(cs.is_satisfied(primary_input, auxiliary_input)); + + leave_block("Call to generate_r1cs_example_with_field_input"); + + return r1cs_example(std::move(cs), std::move(primary_input), std::move(auxiliary_input)); +} + +template +r1cs_example generate_r1cs_example_with_binary_input(const size_t num_constraints, + const size_t num_inputs) +{ + enter_block("Call to generate_r1cs_example_with_binary_input"); + + assert(num_inputs >= 1); + + r1cs_constraint_system cs; + cs.primary_input_size = num_inputs; + cs.auxiliary_input_size = num_constraints; /* we will add one auxiliary variable per constraint */ + + r1cs_variable_assignment full_variable_assignment; + for (size_t i = 0; i < num_inputs; ++i) + { + full_variable_assignment.push_back(FieldT(std::rand() % 2)); + } + + size_t lastvar = num_inputs-1; + for (size_t i = 0; i < num_constraints; ++i) + { + ++lastvar; + const size_t u = (i == 0 ? std::rand() % num_inputs : std::rand() % i); + const size_t v = (i == 0 ? std::rand() % num_inputs : std::rand() % i); + + /* chose two random bits and XOR them together: + res = u + v - 2 * u * v + 2 * u * v = u + v - res + */ + linear_combination A, B, C; + A.add_term(u+1, 2); + B.add_term(v+1, 1); + if (u == v) + { + C.add_term(u+1, 2); + } + else + { + C.add_term(u+1, 1); + C.add_term(v+1, 1); + } + C.add_term(lastvar+1, -FieldT::one()); + + cs.add_constraint(r1cs_constraint(A, B, C)); + full_variable_assignment.push_back(full_variable_assignment[u] + full_variable_assignment[v] - full_variable_assignment[u] * full_variable_assignment[v] - full_variable_assignment[u] * full_variable_assignment[v]); + } + + /* split variable assignment */ + r1cs_primary_input primary_input(full_variable_assignment.begin(), full_variable_assignment.begin() + num_inputs); + r1cs_primary_input auxiliary_input(full_variable_assignment.begin() + num_inputs, full_variable_assignment.end()); + + /* sanity checks */ + assert(cs.num_variables() == full_variable_assignment.size()); + assert(cs.num_variables() >= num_inputs); + assert(cs.num_inputs() == num_inputs); + assert(cs.num_constraints() == num_constraints); + assert(cs.is_satisfied(primary_input, auxiliary_input)); + + leave_block("Call to generate_r1cs_example_with_binary_input"); + + return r1cs_example(std::move(cs), std::move(primary_input), std::move(auxiliary_input)); +} + +} // libsnark + +#endif // R1CS_EXAMPLES_TCC diff --git a/src/relations/constraint_satisfaction_problems/r1cs/r1cs.hpp b/src/relations/constraint_satisfaction_problems/r1cs/r1cs.hpp new file mode 100644 index 000000000..ca3acb3a9 --- /dev/null +++ b/src/relations/constraint_satisfaction_problems/r1cs/r1cs.hpp @@ -0,0 +1,153 @@ +/** @file + ***************************************************************************** + + Declaration of interfaces for: + - a R1CS constraint, + - a R1CS variable assignment, and + - a R1CS constraint system. + + Above, R1CS stands for "Rank-1 Constraint System". + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef R1CS_HPP_ +#define R1CS_HPP_ + +#include +#include +#include +#include +#include + +#include "relations/variable.hpp" + +namespace libsnark { + +/************************* R1CS constraint ***********************************/ + +template +class r1cs_constraint; + +template +std::ostream& operator<<(std::ostream &out, const r1cs_constraint &c); + +template +std::istream& operator>>(std::istream &in, r1cs_constraint &c); + +/** + * A R1CS constraint is a formal expression of the form + * + * < A , X > * < B , X > = < C , X > , + * + * where X = (x_0,x_1,...,x_m) is a vector of formal variables and A,B,C each + * consist of 1+m elements in . + * + * A R1CS constraint is used to construct a R1CS constraint system (see below). + */ +template +class r1cs_constraint { +public: + + linear_combination a, b, c; + + r1cs_constraint() {}; + r1cs_constraint(const linear_combination &a, + const linear_combination &b, + const linear_combination &c); + + r1cs_constraint(const std::initializer_list > &A, + const std::initializer_list > &B, + const std::initializer_list > &C); + + bool operator==(const r1cs_constraint &other) const; + + friend std::ostream& operator<< (std::ostream &out, const r1cs_constraint &c); + friend std::istream& operator>> (std::istream &in, r1cs_constraint &c); +}; + +/************************* R1CS variable assignment **************************/ + +/** + * A R1CS variable assignment is a vector of elements that represents + * a candidate solution to a R1CS constraint system (see below). + */ + +/* TODO: specify that it does *NOT* include the constant 1 */ +template +using r1cs_primary_input = std::vector; + +template +using r1cs_auxiliary_input = std::vector; + +template +using r1cs_variable_assignment = std::vector; /* note the changed name! (TODO: remove this comment after primary_input transition is complete) */ + +/************************* R1CS constraint system ****************************/ + +template +class r1cs_constraint_system; + +template +std::ostream& operator<<(std::ostream &out, const r1cs_constraint_system &cs); + +template +std::istream& operator>>(std::istream &in, r1cs_constraint_system &cs); + +/** + * A system of R1CS constraints looks like + * + * { < A_k , X > * < B_k , X > = < C_k , X > }_{k=1}^{n} . + * + * In other words, the system is satisfied if and only if there exist a + * USCS variable assignment for which each R1CS constraint is satisfied. + * + * NOTE: + * The 0-th variable (i.e., "x_{0}") always represents the constant 1. + * Thus, the 0-th variable is not included in num_variables. + */ +template +class r1cs_constraint_system { +public: + size_t primary_input_size; + size_t auxiliary_input_size; + + std::vector > constraints; + + r1cs_constraint_system() : primary_input_size(0), auxiliary_input_size(0) {} + + size_t num_inputs() const; + size_t num_variables() const; + size_t num_constraints() const; + +#ifdef DEBUG + std::map constraint_annotations; + std::map variable_annotations; +#endif + + bool is_valid() const; + bool is_satisfied(const r1cs_primary_input &primary_input, + const r1cs_auxiliary_input &auxiliary_input) const; + + void add_constraint(const r1cs_constraint &c); + void add_constraint(const r1cs_constraint &c, const std::string &annotation); + + void swap_AB_if_beneficial(); + + bool operator==(const r1cs_constraint_system &other) const; + + friend std::ostream& operator<< (std::ostream &out, const r1cs_constraint_system &cs); + friend std::istream& operator>> (std::istream &in, r1cs_constraint_system &cs); + + void report_linear_constraint_statistics() const; +}; + + +} // libsnark + +#include "relations/constraint_satisfaction_problems/r1cs/r1cs.tcc" + +#endif // R1CS_HPP_ diff --git a/src/relations/constraint_satisfaction_problems/r1cs/r1cs.tcc b/src/relations/constraint_satisfaction_problems/r1cs/r1cs.tcc new file mode 100644 index 000000000..0faa56a87 --- /dev/null +++ b/src/relations/constraint_satisfaction_problems/r1cs/r1cs.tcc @@ -0,0 +1,310 @@ +/** @file + ***************************************************************************** + + Declaration of interfaces for: + - a R1CS constraint, + - a R1CS variable assignment, and + - a R1CS constraint system. + + See r1cs.hpp . + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef R1CS_TCC_ +#define R1CS_TCC_ + +#include +#include +#include +#include "common/utils.hpp" +#include "common/profiling.hpp" +#include "algebra/fields/bigint.hpp" + +namespace libsnark { + +template +r1cs_constraint::r1cs_constraint(const linear_combination &a, + const linear_combination &b, + const linear_combination &c) : + a(a), b(b), c(c) +{ +} + +template +r1cs_constraint::r1cs_constraint(const std::initializer_list > &A, + const std::initializer_list > &B, + const std::initializer_list > &C) +{ + for (auto lc_A : A) + { + a.terms.insert(a.terms.end(), lc_A.terms.begin(), lc_A.terms.end()); + } + for (auto lc_B : B) + { + b.terms.insert(b.terms.end(), lc_B.terms.begin(), lc_B.terms.end()); + } + for (auto lc_C : C) + { + c.terms.insert(c.terms.end(), lc_C.terms.begin(), lc_C.terms.end()); + } +} + +template +bool r1cs_constraint::operator==(const r1cs_constraint &other) const +{ + return (this->a == other.a && + this->b == other.b && + this->c == other.c); +} + +template +std::ostream& operator<<(std::ostream &out, const r1cs_constraint &c) +{ + out << c.a; + out << c.b; + out << c.c; + + return out; +} + +template +std::istream& operator>>(std::istream &in, r1cs_constraint &c) +{ + in >> c.a; + in >> c.b; + in >> c.c; + + return in; +} + +template +size_t r1cs_constraint_system::num_inputs() const +{ + return primary_input_size; +} + +template +size_t r1cs_constraint_system::num_variables() const +{ + return primary_input_size + auxiliary_input_size; +} + + +template +size_t r1cs_constraint_system::num_constraints() const +{ + return constraints.size(); +} + +template +bool r1cs_constraint_system::is_valid() const +{ + if (this->num_inputs() > this->num_variables()) return false; + + for (size_t c = 0; c < constraints.size(); ++c) + { + if (!(constraints[c].a.is_valid(this->num_variables()) && + constraints[c].b.is_valid(this->num_variables()) && + constraints[c].c.is_valid(this->num_variables()))) + { + return false; + } + } + + return true; +} + +template +void dump_r1cs_constraint(const r1cs_constraint &constraint, + const r1cs_variable_assignment &full_variable_assignment, + const std::map &variable_annotations) +{ + printf("terms for a:\n"); constraint.a.print_with_assignment(full_variable_assignment, variable_annotations); + printf("terms for b:\n"); constraint.b.print_with_assignment(full_variable_assignment, variable_annotations); + printf("terms for c:\n"); constraint.c.print_with_assignment(full_variable_assignment, variable_annotations); +} + +template +bool r1cs_constraint_system::is_satisfied(const r1cs_primary_input &primary_input, + const r1cs_auxiliary_input &auxiliary_input) const +{ + assert(primary_input.size() == num_inputs()); + assert(primary_input.size() + auxiliary_input.size() == num_variables()); + + r1cs_variable_assignment full_variable_assignment = primary_input; + full_variable_assignment.insert(full_variable_assignment.end(), auxiliary_input.begin(), auxiliary_input.end()); + + for (size_t c = 0; c < constraints.size(); ++c) + { + const FieldT ares = constraints[c].a.evaluate(full_variable_assignment); + const FieldT bres = constraints[c].b.evaluate(full_variable_assignment); + const FieldT cres = constraints[c].c.evaluate(full_variable_assignment); + + if (!(ares*bres == cres)) + { +#ifdef DEBUG + auto it = constraint_annotations.find(c); + printf("constraint %zu (%s) unsatisfied\n", c, (it == constraint_annotations.end() ? "no annotation" : it->second.c_str())); + printf(" = "); ares.print(); + printf(" = "); bres.print(); + printf(" = "); cres.print(); + printf("constraint was:\n"); + dump_r1cs_constraint(constraints[c], full_variable_assignment, variable_annotations); +#endif // DEBUG + return false; + } + } + + return true; +} + +template +void r1cs_constraint_system::add_constraint(const r1cs_constraint &c) +{ + constraints.emplace_back(c); +} + +template +void r1cs_constraint_system::add_constraint(const r1cs_constraint &c, const std::string &annotation) +{ +#ifdef DEBUG + constraint_annotations[constraints.size()] = annotation; +#endif + constraints.emplace_back(c); +} + +template +void r1cs_constraint_system::swap_AB_if_beneficial() +{ + enter_block("Call to r1cs_constraint_system::swap_AB_if_beneficial"); + + enter_block("Estimate densities"); + bit_vector touched_by_A(this->num_variables() + 1, false), touched_by_B(this->num_variables() + 1, false); + + for (size_t i = 0; i < this->constraints.size(); ++i) + { + for (size_t j = 0; j < this->constraints[i].a.terms.size(); ++j) + { + touched_by_A[this->constraints[i].a.terms[j].index] = true; + } + + for (size_t j = 0; j < this->constraints[i].b.terms.size(); ++j) + { + touched_by_B[this->constraints[i].b.terms[j].index] = true; + } + } + + size_t non_zero_A_count = 0, non_zero_B_count = 0; + for (size_t i = 0; i < this->num_variables() + 1; ++i) + { + non_zero_A_count += touched_by_A[i] ? 1 : 0; + non_zero_B_count += touched_by_B[i] ? 1 : 0; + } + + if (!inhibit_profiling_info) + { + print_indent(); printf("* Non-zero A-count (estimate): %zu\n", non_zero_A_count); + print_indent(); printf("* Non-zero B-count (estimate): %zu\n", non_zero_B_count); + } + leave_block("Estimate densities"); + + if (non_zero_B_count > non_zero_A_count) + { + enter_block("Perform the swap"); + for (size_t i = 0; i < this->constraints.size(); ++i) + { + std::swap(this->constraints[i].a, this->constraints[i].b); + } + leave_block("Perform the swap"); + } + else + { + print_indent(); printf("Swap is not beneficial, not performing\n"); + } + + leave_block("Call to r1cs_constraint_system::swap_AB_if_beneficial"); +} + +template +bool r1cs_constraint_system::operator==(const r1cs_constraint_system &other) const +{ + return (this->constraints == other.constraints && + this->primary_input_size == other.primary_input_size && + this->auxiliary_input_size == other.auxiliary_input_size); +} + +template +std::ostream& operator<<(std::ostream &out, const r1cs_constraint_system &cs) +{ + out << cs.primary_input_size << "\n"; + out << cs.auxiliary_input_size << "\n"; + + out << cs.num_constraints() << "\n"; + for (const r1cs_constraint& c : cs.constraints) + { + out << c; + } + + return out; +} + +template +std::istream& operator>>(std::istream &in, r1cs_constraint_system &cs) +{ + in >> cs.primary_input_size; + in >> cs.auxiliary_input_size; + + cs.constraints.clear(); + + size_t s; + in >> s; + + char b; + in.read(&b, 1); + + cs.constraints.reserve(s); + + for (size_t i = 0; i < s; ++i) + { + r1cs_constraint c; + in >> c; + cs.constraints.emplace_back(c); + } + + return in; +} + +template +void r1cs_constraint_system::report_linear_constraint_statistics() const +{ +#ifdef DEBUG + for (size_t i = 0; i < constraints.size(); ++i) + { + auto &constr = constraints[i]; + bool a_is_const = true; + for (auto &t : constr.a.terms) + { + a_is_const = a_is_const && (t.index == 0); + } + + bool b_is_const = true; + for (auto &t : constr.b.terms) + { + b_is_const = b_is_const && (t.index == 0); + } + + if (a_is_const || b_is_const) + { + auto it = constraint_annotations.find(i); + printf("%s\n", (it == constraint_annotations.end() ? FORMAT("", "constraint_%zu", i) : it->second).c_str()); + } + } +#endif +} + +} // libsnark +#endif // R1CS_TCC_ diff --git a/src/relations/variable.hpp b/src/relations/variable.hpp new file mode 100644 index 000000000..a9a1449b8 --- /dev/null +++ b/src/relations/variable.hpp @@ -0,0 +1,213 @@ +/** @file + ***************************************************************************** + + Declaration of interfaces for: + - a variable (i.e., x_i), + - a linear term (i.e., a_i * x_i), and + - a linear combination (i.e., sum_i a_i * x_i). + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef VARIABLE_HPP_ +#define VARIABLE_HPP_ + +#include +#include +#include +#include + +namespace libsnark { + +/** + * Mnemonic typedefs. + */ +typedef size_t var_index_t; +typedef long integer_coeff_t; + +/** + * Forward declaration. + */ +template +class linear_term; + +/** + * Forward declaration. + */ +template +class linear_combination; + +/********************************* Variable **********************************/ + +/** + * A variable represents a formal expresison of the form "x_{index}". + */ +template +class variable { +public: + + var_index_t index; + + variable(const var_index_t index = 0) : index(index) {}; + + linear_term operator*(const integer_coeff_t int_coeff) const; + linear_term operator*(const FieldT &field_coeff) const; + + linear_combination operator+(const linear_combination &other) const; + linear_combination operator-(const linear_combination &other) const; + + linear_term operator-() const; + + bool operator==(const variable &other) const; +}; + +template +linear_term operator*(const integer_coeff_t int_coeff, const variable &var); + +template +linear_term operator*(const FieldT &field_coeff, const variable &var); + +template +linear_combination operator+(const integer_coeff_t int_coeff, const variable &var); + +template +linear_combination operator+(const FieldT &field_coeff, const variable &var); + +template +linear_combination operator-(const integer_coeff_t int_coeff, const variable &var); + +template +linear_combination operator-(const FieldT &field_coeff, const variable &var); + + +/****************************** Linear term **********************************/ + +/** + * A linear term represents a formal expression of the form "coeff * x_{index}". + */ +template +class linear_term { +public: + + var_index_t index = 0; + FieldT coeff; + + linear_term() {}; + linear_term(const variable &var); + linear_term(const variable &var, const integer_coeff_t int_coeff); + linear_term(const variable &var, const FieldT &field_coeff); + + linear_term operator*(const integer_coeff_t int_coeff) const; + linear_term operator*(const FieldT &field_coeff) const; + + linear_combination operator+(const linear_combination &other) const; + linear_combination operator-(const linear_combination &other) const; + + linear_term operator-() const; + + bool operator==(const linear_term &other) const; +}; + +template +linear_term operator*(const integer_coeff_t int_coeff, const linear_term <); + +template +linear_term operator*(const FieldT &field_coeff, const linear_term <); + +template +linear_combination operator+(const integer_coeff_t int_coeff, const linear_term <); + +template +linear_combination operator+(const FieldT &field_coeff, const linear_term <); + +template +linear_combination operator-(const integer_coeff_t int_coeff, const linear_term <); + +template +linear_combination operator-(const FieldT &field_coeff, const linear_term <); + + +/***************************** Linear combination ****************************/ + +template +class linear_combination; + +template +std::ostream& operator<<(std::ostream &out, const linear_combination &lc); + +template +std::istream& operator>>(std::istream &in, linear_combination &lc); + +/** + * A linear combination represents a formal expression of the form "sum_i coeff_i * x_{index_i}". + */ +template +class linear_combination { +public: + + std::vector > terms; + + linear_combination() {}; + linear_combination(const integer_coeff_t int_coeff); + linear_combination(const FieldT &field_coeff); + linear_combination(const variable &var); + linear_combination(const linear_term <); + linear_combination(const std::vector > &all_terms); + + /* for supporting range-based for loops over linear_combination */ + typename std::vector >::const_iterator begin() const; + typename std::vector >::const_iterator end() const; + + void add_term(const variable &var); + void add_term(const variable &var, const integer_coeff_t int_coeff); + void add_term(const variable &var, const FieldT &field_coeff); + + void add_term(const linear_term <); + + FieldT evaluate(const std::vector &assignment) const; + + linear_combination operator*(const integer_coeff_t int_coeff) const; + linear_combination operator*(const FieldT &field_coeff) const; + + linear_combination operator+(const linear_combination &other) const; + + linear_combination operator-(const linear_combination &other) const; + linear_combination operator-() const; + + bool operator==(const linear_combination &other) const; + + bool is_valid(const size_t num_variables) const; + + void print(const std::map &variable_annotations = std::map()) const; + void print_with_assignment(const std::vector &full_assignment, const std::map &variable_annotations = std::map()) const; + + friend std::ostream& operator<< (std::ostream &out, const linear_combination &lc); + friend std::istream& operator>> (std::istream &in, linear_combination &lc); +}; + +template +linear_combination operator*(const integer_coeff_t int_coeff, const linear_combination &lc); + +template +linear_combination operator*(const FieldT &field_coeff, const linear_combination &lc); + +template +linear_combination operator+(const integer_coeff_t int_coeff, const linear_combination &lc); + +template +linear_combination operator+(const FieldT &field_coeff, const linear_combination &lc); + +template +linear_combination operator-(const integer_coeff_t int_coeff, const linear_combination &lc); + +template +linear_combination operator-(const FieldT &field_coeff, const linear_combination &lc); + +} // libsnark + +#include "relations/variable.tcc" + +#endif // VARIABLE_HPP_ diff --git a/src/relations/variable.tcc b/src/relations/variable.tcc new file mode 100644 index 000000000..4c4cab97f --- /dev/null +++ b/src/relations/variable.tcc @@ -0,0 +1,512 @@ +/** @file + ***************************************************************************** + + Implementation of interfaces for: + - a variable (i.e., x_i), + - a linear term (i.e., a_i * x_i), and + - a linear combination (i.e., sum_i a_i * x_i). + + See variabe.hpp . + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef VARIABLE_TCC_ +#define VARIABLE_TCC_ + +#include +#include + +#include "algebra/fields/bigint.hpp" + +namespace libsnark { + +template +linear_term variable::operator*(const integer_coeff_t int_coeff) const +{ + return linear_term(*this, int_coeff); +} + +template +linear_term variable::operator*(const FieldT &field_coeff) const +{ + return linear_term(*this, field_coeff); +} + +template +linear_combination variable::operator+(const linear_combination &other) const +{ + linear_combination result; + + result.add_term(*this); + result.terms.insert(result.terms.begin(), other.terms.begin(), other.terms.end()); + + return result; +} + +template +linear_combination variable::operator-(const linear_combination &other) const +{ + return (*this) + (-other); +} + +template +linear_term variable::operator-() const +{ + return linear_term(*this, -FieldT::one()); +} + +template +bool variable::operator==(const variable &other) const +{ + return (this->index == other.index); +} + +template +linear_term operator*(const integer_coeff_t int_coeff, const variable &var) +{ + return linear_term(var, int_coeff); +} + +template +linear_term operator*(const FieldT &field_coeff, const variable &var) +{ + return linear_term(var, field_coeff); +} + +template +linear_combination operator+(const integer_coeff_t int_coeff, const variable &var) +{ + return linear_combination(int_coeff) + var; +} + +template +linear_combination operator+(const FieldT &field_coeff, const variable &var) +{ + return linear_combination(field_coeff) + var; +} + +template +linear_combination operator-(const integer_coeff_t int_coeff, const variable &var) +{ + return linear_combination(int_coeff) - var; +} + +template +linear_combination operator-(const FieldT &field_coeff, const variable &var) +{ + return linear_combination(field_coeff) - var; +} + +template +linear_term::linear_term(const variable &var) : + index(var.index), coeff(FieldT::one()) +{ +} + +template +linear_term::linear_term(const variable &var, const integer_coeff_t int_coeff) : + index(var.index), coeff(FieldT(int_coeff)) +{ +} + +template +linear_term::linear_term(const variable &var, const FieldT &coeff) : + index(var.index), coeff(coeff) +{ +} + +template +linear_term linear_term::operator*(const integer_coeff_t int_coeff) const +{ + return (this->operator*(FieldT(int_coeff))); +} + +template +linear_term linear_term::operator*(const FieldT &field_coeff) const +{ + return linear_term(this->index, field_coeff * this->coeff); +} + +template +linear_combination operator+(const integer_coeff_t int_coeff, const linear_term <) +{ + return linear_combination(int_coeff) + lt; +} + +template +linear_combination operator+(const FieldT &field_coeff, const linear_term <) +{ + return linear_combination(field_coeff) + lt; +} + +template +linear_combination operator-(const integer_coeff_t int_coeff, const linear_term <) +{ + return linear_combination(int_coeff) - lt; +} + +template +linear_combination operator-(const FieldT &field_coeff, const linear_term <) +{ + return linear_combination(field_coeff) - lt; +} + +template +linear_combination linear_term::operator+(const linear_combination &other) const +{ + return linear_combination(*this) + other; +} + +template +linear_combination linear_term::operator-(const linear_combination &other) const +{ + return (*this) + (-other); +} + +template +linear_term linear_term::operator-() const +{ + return linear_term(this->index, -this->coeff); +} + +template +bool linear_term::operator==(const linear_term &other) const +{ + return (this->index == other.index && + this->coeff == other.coeff); +} + +template +linear_term operator*(const integer_coeff_t int_coeff, const linear_term <) +{ + return FieldT(int_coeff) * lt; +} + +template +linear_term operator*(const FieldT &field_coeff, const linear_term <) +{ + return linear_term(lt.index, field_coeff * lt.coeff); +} + +template +linear_combination::linear_combination(const integer_coeff_t int_coeff) +{ + this->add_term(linear_term(0, int_coeff)); +} + +template +linear_combination::linear_combination(const FieldT &field_coeff) +{ + this->add_term(linear_term(0, field_coeff)); +} + +template +linear_combination::linear_combination(const variable &var) +{ + this->add_term(var); +} + +template +linear_combination::linear_combination(const linear_term <) +{ + this->add_term(lt); +} + +template +typename std::vector >::const_iterator linear_combination::begin() const +{ + return terms.begin(); +} + +template +typename std::vector >::const_iterator linear_combination::end() const +{ + return terms.end(); +} + +template +void linear_combination::add_term(const variable &var) +{ + this->terms.emplace_back(linear_term(var.index, FieldT::one())); +} + +template +void linear_combination::add_term(const variable &var, const integer_coeff_t int_coeff) +{ + this->terms.emplace_back(linear_term(var.index, int_coeff)); +} + +template +void linear_combination::add_term(const variable &var, const FieldT &coeff) +{ + this->terms.emplace_back(linear_term(var.index, coeff)); +} + +template +void linear_combination::add_term(const linear_term &other) +{ + this->terms.emplace_back(other); +} + +template +linear_combination linear_combination::operator*(const integer_coeff_t int_coeff) const +{ + return (*this) * FieldT(int_coeff); +} + +template +FieldT linear_combination::evaluate(const std::vector &assignment) const +{ + FieldT acc = FieldT::zero(); + for (auto < : terms) + { + acc += (lt.index == 0 ? FieldT::one() : assignment[lt.index-1]) * lt.coeff; + } + return acc; +} + +template +linear_combination linear_combination::operator*(const FieldT &field_coeff) const +{ + linear_combination result; + result.terms.reserve(this->terms.size()); + for (const linear_term < : this->terms) + { + result.terms.emplace_back(lt * field_coeff); + } + return result; +} + +template +linear_combination linear_combination::operator+(const linear_combination &other) const +{ + linear_combination result; + + auto it1 = this->terms.begin(); + auto it2 = other.terms.begin(); + + /* invariant: it1 and it2 always point to unprocessed items in the corresponding linear combinations */ + while (it1 != this->terms.end() && it2 != other.terms.end()) + { + if (it1->index < it2->index) + { + result.terms.emplace_back(*it1); + ++it1; + } + else if (it1->index > it2->index) + { + result.terms.emplace_back(*it2); + ++it2; + } + else + { + /* it1->index == it2->index */ + result.terms.emplace_back(linear_term(variable(it1->index), it1->coeff + it2->coeff)); + ++it1; + ++it2; + } + } + + if (it1 != this->terms.end()) + { + result.terms.insert(result.terms.end(), it1, this->terms.end()); + } + else + { + result.terms.insert(result.terms.end(), it2, other.terms.end()); + } + + return result; +} + +template +linear_combination linear_combination::operator-(const linear_combination &other) const +{ + return (*this) + (-other); +} + +template +linear_combination linear_combination::operator-() const +{ + return (*this) * (-FieldT::one()); +} + +template +bool linear_combination::operator==(const linear_combination &other) const +{ + return (this->terms == other.terms); +} + +template +bool linear_combination::is_valid(const size_t num_variables) const +{ + /* check that all terms in linear combination are sorted */ + for (size_t i = 1; i < terms.size(); ++i) + { + if (terms[i-1].index >= terms[i].index) + { + return false; + } + } + + /* check that the variables are in proper range. as the variables + are sorted, it suffices to check the last term */ + if ((--terms.end())->index >= num_variables) + { + return false; + } + + return true; +} + +template +void linear_combination::print(const std::map &variable_annotations) const +{ + for (auto < : terms) + { + if (lt.index == 0) + { + printf(" 1 * "); + lt.coeff.print(); + } + else + { + auto it = variable_annotations.find(lt.index); + printf(" x_%zu (%s) * ", lt.index, (it == variable_annotations.end() ? "no annotation" : it->second.c_str())); + lt.coeff.print(); + } + } +} + +template +void linear_combination::print_with_assignment(const std::vector &full_assignment, const std::map &variable_annotations) const +{ + for (auto < : terms) + { + if (lt.index == 0) + { + printf(" 1 * "); + lt.coeff.print(); + } + else + { + printf(" x_%zu * ", lt.index); + lt.coeff.print(); + + auto it = variable_annotations.find(lt.index); + printf(" where x_%zu (%s) was assigned value ", lt.index, + (it == variable_annotations.end() ? "no annotation" : it->second.c_str())); + full_assignment[lt.index-1].print(); + printf(" i.e. negative of "); + (-full_assignment[lt.index-1]).print(); + } + } +} + +template +std::ostream& operator<<(std::ostream &out, const linear_combination &lc) +{ + out << lc.terms.size() << "\n"; + for (const linear_term& lt : lc.terms) + { + out << lt.index << "\n"; + out << lt.coeff << OUTPUT_NEWLINE; + } + + return out; +} + +template +std::istream& operator>>(std::istream &in, linear_combination &lc) +{ + lc.terms.clear(); + + size_t s; + in >> s; + + consume_newline(in); + + lc.terms.reserve(s); + + for (size_t i = 0; i < s; ++i) + { + linear_term lt; + in >> lt.index; + consume_newline(in); + in >> lt.coeff; + consume_OUTPUT_NEWLINE(in); + lc.terms.emplace_back(lt); + } + + return in; +} + +template +linear_combination operator*(const integer_coeff_t int_coeff, const linear_combination &lc) +{ + return lc * int_coeff; +} + +template +linear_combination operator*(const FieldT &field_coeff, const linear_combination &lc) +{ + return lc * field_coeff; +} + +template +linear_combination operator+(const integer_coeff_t int_coeff, const linear_combination &lc) +{ + return linear_combination(int_coeff) + lc; +} + +template +linear_combination operator+(const FieldT &field_coeff, const linear_combination &lc) +{ + return linear_combination(field_coeff) + lc; +} + +template +linear_combination operator-(const integer_coeff_t int_coeff, const linear_combination &lc) +{ + return linear_combination(int_coeff) - lc; +} + +template +linear_combination operator-(const FieldT &field_coeff, const linear_combination &lc) +{ + return linear_combination(field_coeff) - lc; +} + +template +linear_combination::linear_combination(const std::vector > &all_terms) +{ + if (all_terms.empty()) + { + return; + } + + terms = all_terms; + std::sort(terms.begin(), terms.end(), [](linear_term a, linear_term b) { return a.index < b.index; }); + + auto result_it = terms.begin(); + for (auto it = ++terms.begin(); it != terms.end(); ++it) + { + if (it->index == result_it->index) + { + result_it->coeff += it->coeff; + } + else + { + *(++result_it) = *it; + } + } + terms.resize((result_it - terms.begin()) + 1); +} + +} // libsnark + +#endif // VARIABLE_TCC diff --git a/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/examples/run_r1cs_ppzksnark.hpp b/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/examples/run_r1cs_ppzksnark.hpp new file mode 100644 index 000000000..fcd28abf3 --- /dev/null +++ b/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/examples/run_r1cs_ppzksnark.hpp @@ -0,0 +1,35 @@ +/** @file + ***************************************************************************** + + Declaration of functionality that runs the R1CS ppzkSNARK for + a given R1CS example. + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef RUN_R1CS_PPZKSNARK_HPP_ +#define RUN_R1CS_PPZKSNARK_HPP_ + +#include "relations/constraint_satisfaction_problems/r1cs/examples/r1cs_examples.hpp" + +namespace libsnark { + +/** + * Runs the ppzkSNARK (generator, prover, and verifier) for a given + * R1CS example (specified by a constraint system, input, and witness). + * + * Optionally, also test the serialization routines for keys and proofs. + * (This takes additional time.) + */ +template +bool run_r1cs_ppzksnark(const r1cs_example > &example, + const bool test_serialization); + +} // libsnark + +#include "zk_proof_systems/ppzksnark/r1cs_ppzksnark/examples/run_r1cs_ppzksnark.tcc" + +#endif // RUN_R1CS_PPZKSNARK_HPP_ diff --git a/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/examples/run_r1cs_ppzksnark.tcc b/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/examples/run_r1cs_ppzksnark.tcc new file mode 100644 index 000000000..9bc875869 --- /dev/null +++ b/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/examples/run_r1cs_ppzksnark.tcc @@ -0,0 +1,114 @@ +/** @file + ***************************************************************************** + + Implementation of functionality that runs the R1CS ppzkSNARK for + a given R1CS example. + + See run_r1cs_ppzksnark.hpp . + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef RUN_R1CS_PPZKSNARK_TCC_ +#define RUN_R1CS_PPZKSNARK_TCC_ + +#include "zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.hpp" + +#include +#include + +#include "common/profiling.hpp" + +namespace libsnark { + +template +typename std::enable_if::type +test_affine_verifier(const r1cs_ppzksnark_verification_key &vk, + const r1cs_ppzksnark_primary_input &primary_input, + const r1cs_ppzksnark_proof &proof, + const bool expected_answer) +{ + print_header("R1CS ppzkSNARK Affine Verifier"); + const bool answer = r1cs_ppzksnark_affine_verifier_weak_IC(vk, primary_input, proof); + assert(answer == expected_answer); +} + +template +typename std::enable_if::type +test_affine_verifier(const r1cs_ppzksnark_verification_key &vk, + const r1cs_ppzksnark_primary_input &primary_input, + const r1cs_ppzksnark_proof &proof, + const bool expected_answer) +{ + UNUSED(vk, primary_input, proof, expected_answer); + print_header("R1CS ppzkSNARK Affine Verifier"); + printf("Affine verifier is not supported; not testing anything.\n"); +} + +/** + * The code below provides an example of all stages of running a R1CS ppzkSNARK. + * + * Of course, in a real-life scenario, we would have three distinct entities, + * mangled into one in the demonstration below. The three entities are as follows. + * (1) The "generator", which runs the ppzkSNARK generator on input a given + * constraint system CS to create a proving and a verification key for CS. + * (2) The "prover", which runs the ppzkSNARK prover on input the proving key, + * a primary input for CS, and an auxiliary input for CS. + * (3) The "verifier", which runs the ppzkSNARK verifier on input the verification key, + * a primary input for CS, and a proof. + */ +template +bool run_r1cs_ppzksnark(const r1cs_example > &example, + const bool test_serialization) +{ + enter_block("Call to run_r1cs_ppzksnark"); + + print_header("R1CS ppzkSNARK Generator"); + r1cs_ppzksnark_keypair keypair = r1cs_ppzksnark_generator(example.constraint_system); + printf("\n"); print_indent(); print_mem("after generator"); + + print_header("Preprocess verification key"); + r1cs_ppzksnark_processed_verification_key pvk = r1cs_ppzksnark_verifier_process_vk(keypair.vk); + + if (test_serialization) + { + enter_block("Test serialization of keys"); + keypair.pk = reserialize >(keypair.pk); + keypair.vk = reserialize >(keypair.vk); + pvk = reserialize >(pvk); + leave_block("Test serialization of keys"); + } + + print_header("R1CS ppzkSNARK Prover"); + r1cs_ppzksnark_proof proof = r1cs_ppzksnark_prover(keypair.pk, example.primary_input, example.auxiliary_input); + printf("\n"); print_indent(); print_mem("after prover"); + + if (test_serialization) + { + enter_block("Test serialization of proof"); + proof = reserialize >(proof); + leave_block("Test serialization of proof"); + } + + print_header("R1CS ppzkSNARK Verifier"); + const bool ans = r1cs_ppzksnark_verifier_strong_IC(keypair.vk, example.primary_input, proof); + printf("\n"); print_indent(); print_mem("after verifier"); + printf("* The verification result is: %s\n", (ans ? "PASS" : "FAIL")); + + print_header("R1CS ppzkSNARK Online Verifier"); + const bool ans2 = r1cs_ppzksnark_online_verifier_strong_IC(pvk, example.primary_input, proof); + assert(ans == ans2); + + test_affine_verifier(keypair.vk, example.primary_input, proof, ans); + + leave_block("Call to run_r1cs_ppzksnark"); + + return ans; +} + +} // libsnark + +#endif // RUN_R1CS_PPZKSNARK_TCC_ diff --git a/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/profiling/profile_r1cs_ppzksnark.cpp b/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/profiling/profile_r1cs_ppzksnark.cpp new file mode 100644 index 000000000..5c5415028 --- /dev/null +++ b/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/profiling/profile_r1cs_ppzksnark.cpp @@ -0,0 +1,71 @@ +/** @file + ***************************************************************************** + Profiling program that exercises the ppzkSNARK (first generator, then prover, + then verifier) on a synthetic R1CS instance. + + The command + + $ src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/profiling/profile_r1cs_ppzksnark 1000 10 Fr + + exercises the ppzkSNARK (first generator, then prover, then verifier) on an R1CS instance with 1000 equations and an input consisting of 10 field elements. + + (If you get the error `zmInit ERR:can't protect`, see the discussion [above](#elliptic-curve-choices).) + + The command + + $ src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/profiling/profile_r1cs_ppzksnark 1000 10 bytes + + does the same but now the input consists of 10 bytes. + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ +#include +#include + +#include "common/default_types/r1cs_ppzksnark_pp.hpp" +#include "common/profiling.hpp" +#include "common/utils.hpp" +#include "relations/constraint_satisfaction_problems/r1cs/examples/r1cs_examples.hpp" +#include "zk_proof_systems/ppzksnark/r1cs_ppzksnark/examples/run_r1cs_ppzksnark.hpp" + +using namespace libsnark; + +int main(int argc, const char * argv[]) +{ + default_r1cs_ppzksnark_pp::init_public_params(); + start_profiling(); + + if (argc == 2 && strcmp(argv[1], "-v") == 0) + { + print_compilation_info(); + return 0; + } + + if (argc != 3 && argc != 4) + { + printf("usage: %s num_constraints input_size [Fr|bytes]\n", argv[0]); + return 1; + } + const int num_constraints = atoi(argv[1]); + int input_size = atoi(argv[2]); + if (argc == 4) + { + assert(strcmp(argv[3], "Fr") == 0 || strcmp(argv[3], "bytes") == 0); + if (strcmp(argv[3], "bytes") == 0) + { + input_size = div_ceil(8 * input_size, Fr::capacity()); + } + } + + enter_block("Generate R1CS example"); + r1cs_example > example = generate_r1cs_example_with_field_input >(num_constraints, input_size); + leave_block("Generate R1CS example"); + + print_header("(enter) Profile R1CS ppzkSNARK"); + const bool test_serialization = true; + run_r1cs_ppzksnark(example, test_serialization); + print_header("(leave) Profile R1CS ppzkSNARK"); +} diff --git a/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.hpp b/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.hpp new file mode 100644 index 000000000..a068b09fd --- /dev/null +++ b/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.hpp @@ -0,0 +1,479 @@ +/** @file + ***************************************************************************** + + Declaration of interfaces for a ppzkSNARK for R1CS. + + This includes: + - class for proving key + - class for verification key + - class for processed verification key + - class for key pair (proving key & verification key) + - class for proof + - generator algorithm + - prover algorithm + - verifier algorithm (with strong or weak input consistency) + - online verifier algorithm (with strong or weak input consistency) + + The implementation instantiates (a modification of) the protocol of \[PGHR13], + by following extending, and optimizing the approach described in \[BCTV14]. + + + Acronyms: + + - R1CS = "Rank-1 Constraint Systems" + - ppzkSNARK = "PreProcessing Zero-Knowledge Succinct Non-interactive ARgument of Knowledge" + + References: + + \[BCTV14]: + "Succinct Non-Interactive Zero Knowledge for a von Neumann Architecture", + Eli Ben-Sasson, Alessandro Chiesa, Eran Tromer, Madars Virza, + USENIX Security 2014, + + + \[PGHR13]: + "Pinocchio: Nearly practical verifiable computation", + Bryan Parno, Craig Gentry, Jon Howell, Mariana Raykova, + IEEE S&P 2013, + + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef R1CS_PPZKSNARK_HPP_ +#define R1CS_PPZKSNARK_HPP_ + +#include + +#include "algebra/curves/public_params.hpp" +#include "common/data_structures/accumulation_vector.hpp" +#include "algebra/knowledge_commitment/knowledge_commitment.hpp" +#include "relations/constraint_satisfaction_problems/r1cs/r1cs.hpp" +#include "zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark_params.hpp" + +namespace libsnark { + +/******************************** Proving key ********************************/ + +template +class r1cs_ppzksnark_proving_key; + +template +std::ostream& operator<<(std::ostream &out, const r1cs_ppzksnark_proving_key &pk); + +template +std::istream& operator>>(std::istream &in, r1cs_ppzksnark_proving_key &pk); + +/** + * A proving key for the R1CS ppzkSNARK. + */ +template +class r1cs_ppzksnark_proving_key { +public: + knowledge_commitment_vector, G1 > A_query; + knowledge_commitment_vector, G1 > B_query; + knowledge_commitment_vector, G1 > C_query; + G1_vector H_query; + G1_vector K_query; + + r1cs_ppzksnark_proving_key() {}; + r1cs_ppzksnark_proving_key& operator=(const r1cs_ppzksnark_proving_key &other) = default; + r1cs_ppzksnark_proving_key(const r1cs_ppzksnark_proving_key &other) = default; + r1cs_ppzksnark_proving_key(r1cs_ppzksnark_proving_key &&other) = default; + r1cs_ppzksnark_proving_key(knowledge_commitment_vector, G1 > &&A_query, + knowledge_commitment_vector, G1 > &&B_query, + knowledge_commitment_vector, G1 > &&C_query, + G1_vector &&H_query, + G1_vector &&K_query) : + A_query(std::move(A_query)), + B_query(std::move(B_query)), + C_query(std::move(C_query)), + H_query(std::move(H_query)), + K_query(std::move(K_query)) + {}; + + size_t G1_size() const + { + return 2*(A_query.domain_size() + C_query.domain_size()) + B_query.domain_size() + H_query.size() + K_query.size(); + } + + size_t G2_size() const + { + return B_query.domain_size(); + } + + size_t G1_sparse_size() const + { + return 2*(A_query.size() + C_query.size()) + B_query.size() + H_query.size() + K_query.size(); + } + + size_t G2_sparse_size() const + { + return B_query.size(); + } + + size_t size_in_bits() const + { + return A_query.size_in_bits() + B_query.size_in_bits() + C_query.size_in_bits() + libsnark::size_in_bits(H_query) + libsnark::size_in_bits(K_query); + } + + void print_size() const + { + print_indent(); printf("* G1 elements in PK: %zu\n", this->G1_size()); + print_indent(); printf("* Non-zero G1 elements in PK: %zu\n", this->G1_sparse_size()); + print_indent(); printf("* G2 elements in PK: %zu\n", this->G2_size()); + print_indent(); printf("* Non-zero G2 elements in PK: %zu\n", this->G2_sparse_size()); + print_indent(); printf("* PK size in bits: %zu\n", this->size_in_bits()); + } + + bool operator==(const r1cs_ppzksnark_proving_key &other) const; + friend std::ostream& operator<< (std::ostream &out, const r1cs_ppzksnark_proving_key &pk); + friend std::istream& operator>> (std::istream &in, r1cs_ppzksnark_proving_key &pk); +}; + + +/******************************* Verification key ****************************/ + +template +class r1cs_ppzksnark_verification_key; + +template +std::ostream& operator<<(std::ostream &out, const r1cs_ppzksnark_verification_key &vk); + +template +std::istream& operator>>(std::istream &in, r1cs_ppzksnark_verification_key &vk); + +/** + * A verification key for the R1CS ppzkSNARK. + */ +template +class r1cs_ppzksnark_verification_key { +public: + G2 alphaA_g2; + G1 alphaB_g1; + G2 alphaC_g2; + G2 gamma_g2; + G1 gamma_beta_g1; + G2 gamma_beta_g2; + G2 rC_Z_g2; + + accumulation_vector > encoded_IC_query; + + r1cs_ppzksnark_verification_key() = default; + r1cs_ppzksnark_verification_key(const G2 &alphaA_g2, + const G1 &alphaB_g1, + const G2 &alphaC_g2, + const G2 &gamma_g2, + const G1 &gamma_beta_g1, + const G2 &gamma_beta_g2, + const G2 &rC_Z_g2, + const accumulation_vector > &eIC) : + alphaA_g2(alphaA_g2), + alphaB_g1(alphaB_g1), + alphaC_g2(alphaC_g2), + gamma_g2(gamma_g2), + gamma_beta_g1(gamma_beta_g1), + gamma_beta_g2(gamma_beta_g2), + rC_Z_g2(rC_Z_g2), + encoded_IC_query(eIC) + {}; + + size_t G1_size() const + { + return 2 + encoded_IC_query.size(); + } + + size_t G2_size() const + { + return 5; + } + + size_t size_in_bits() const + { + return (2 * G1::size_in_bits() + encoded_IC_query.size_in_bits() + 5 * G2::size_in_bits()); + } + + void print_size() const + { + print_indent(); printf("* G1 elements in VK: %zu\n", this->G1_size()); + print_indent(); printf("* G2 elements in VK: %zu\n", this->G2_size()); + print_indent(); printf("* VK size in bits: %zu\n", this->size_in_bits()); + } + + bool operator==(const r1cs_ppzksnark_verification_key &other) const; + friend std::ostream& operator<< (std::ostream &out, const r1cs_ppzksnark_verification_key &vk); + friend std::istream& operator>> (std::istream &in, r1cs_ppzksnark_verification_key &vk); + + static r1cs_ppzksnark_verification_key dummy_verification_key(const size_t input_size); +}; + + +/************************ Processed verification key *************************/ + +template +class r1cs_ppzksnark_processed_verification_key; + +template +std::ostream& operator<<(std::ostream &out, const r1cs_ppzksnark_processed_verification_key &pvk); + +template +std::istream& operator>>(std::istream &in, r1cs_ppzksnark_processed_verification_key &pvk); + +/** + * A processed verification key for the R1CS ppzkSNARK. + * + * Compared to a (non-processed) verification key, a processed verification key + * contains a small constant amount of additional pre-computed information that + * enables a faster verification time. + */ +template +class r1cs_ppzksnark_processed_verification_key { +public: + G2_precomp pp_G2_one_precomp; + G2_precomp vk_alphaA_g2_precomp; + G1_precomp vk_alphaB_g1_precomp; + G2_precomp vk_alphaC_g2_precomp; + G2_precomp vk_rC_Z_g2_precomp; + G2_precomp vk_gamma_g2_precomp; + G1_precomp vk_gamma_beta_g1_precomp; + G2_precomp vk_gamma_beta_g2_precomp; + + accumulation_vector > encoded_IC_query; + + bool operator==(const r1cs_ppzksnark_processed_verification_key &other) const; + friend std::ostream& operator<< (std::ostream &out, const r1cs_ppzksnark_processed_verification_key &pvk); + friend std::istream& operator>> (std::istream &in, r1cs_ppzksnark_processed_verification_key &pvk); +}; + + +/********************************** Key pair *********************************/ + +/** + * A key pair for the R1CS ppzkSNARK, which consists of a proving key and a verification key. + */ +template +class r1cs_ppzksnark_keypair { +public: + r1cs_ppzksnark_proving_key pk; + r1cs_ppzksnark_verification_key vk; + + r1cs_ppzksnark_keypair() = default; + r1cs_ppzksnark_keypair(const r1cs_ppzksnark_keypair &other) = default; + r1cs_ppzksnark_keypair(r1cs_ppzksnark_proving_key &&pk, + r1cs_ppzksnark_verification_key &&vk) : + pk(std::move(pk)), + vk(std::move(vk)) + {} + + r1cs_ppzksnark_keypair(r1cs_ppzksnark_keypair &&other) = default; +}; + + +/*********************************** Proof ***********************************/ + +template +class r1cs_ppzksnark_proof; + +template +std::ostream& operator<<(std::ostream &out, const r1cs_ppzksnark_proof &proof); + +template +std::istream& operator>>(std::istream &in, r1cs_ppzksnark_proof &proof); + +/** + * A proof for the R1CS ppzkSNARK. + * + * While the proof has a structure, externally one merely opaquely produces, + * seralizes/deserializes, and verifies proofs. We only expose some information + * about the structure for statistics purposes. + */ +template +class r1cs_ppzksnark_proof { +public: + knowledge_commitment, G1 > g_A; + knowledge_commitment, G1 > g_B; + knowledge_commitment, G1 > g_C; + G1 g_H; + G1 g_K; + + r1cs_ppzksnark_proof() + { + // invalid proof with valid curve points + this->g_A.g = G1 ::one(); + this->g_A.h = G1::one(); + this->g_B.g = G2 ::one(); + this->g_B.h = G1::one(); + this->g_C.g = G1 ::one(); + this->g_C.h = G1::one(); + this->g_H = G1::one(); + this->g_K = G1::one(); + } + r1cs_ppzksnark_proof(knowledge_commitment, G1 > &&g_A, + knowledge_commitment, G1 > &&g_B, + knowledge_commitment, G1 > &&g_C, + G1 &&g_H, + G1 &&g_K) : + g_A(std::move(g_A)), + g_B(std::move(g_B)), + g_C(std::move(g_C)), + g_H(std::move(g_H)), + g_K(std::move(g_K)) + {}; + + size_t G1_size() const + { + return 7; + } + + size_t G2_size() const + { + return 1; + } + + size_t size_in_bits() const + { + return G1_size() * G1::size_in_bits() + G2_size() * G2::size_in_bits(); + } + + void print_size() const + { + print_indent(); printf("* G1 elements in proof: %zu\n", this->G1_size()); + print_indent(); printf("* G2 elements in proof: %zu\n", this->G2_size()); + print_indent(); printf("* Proof size in bits: %zu\n", this->size_in_bits()); + } + + bool is_well_formed() const + { + return (g_A.g.is_well_formed() && g_A.h.is_well_formed() && + g_B.g.is_well_formed() && g_B.h.is_well_formed() && + g_C.g.is_well_formed() && g_C.h.is_well_formed() && + g_H.is_well_formed() && + g_K.is_well_formed()); + } + + bool operator==(const r1cs_ppzksnark_proof &other) const; + friend std::ostream& operator<< (std::ostream &out, const r1cs_ppzksnark_proof &proof); + friend std::istream& operator>> (std::istream &in, r1cs_ppzksnark_proof &proof); +}; + + +/***************************** Main algorithms *******************************/ + +/** + * A generator algorithm for the R1CS ppzkSNARK. + * + * Given a R1CS constraint system CS, this algorithm produces proving and verification keys for CS. + */ +template +r1cs_ppzksnark_keypair r1cs_ppzksnark_generator(const r1cs_ppzksnark_constraint_system &cs); + +template +r1cs_ppzksnark_keypair r1cs_ppzksnark_generator( + const r1cs_ppzksnark_constraint_system &cs, + const Fr& t, + const Fr& alphaA, + const Fr& alphaB, + const Fr& alphaC, + const Fr& rA, + const Fr& rB, + const Fr& beta, + const Fr& gamma +); + +/** + * A prover algorithm for the R1CS ppzkSNARK. + * + * Given a R1CS primary input X and a R1CS auxiliary input Y, this algorithm + * produces a proof (of knowledge) that attests to the following statement: + * ``there exists Y such that CS(X,Y)=0''. + * Above, CS is the R1CS constraint system that was given as input to the generator algorithm. + */ +template +r1cs_ppzksnark_proof r1cs_ppzksnark_prover(const r1cs_ppzksnark_proving_key &pk, + const r1cs_ppzksnark_primary_input &primary_input, + const r1cs_ppzksnark_auxiliary_input &auxiliary_input); + +/* + Below are four variants of verifier algorithm for the R1CS ppzkSNARK. + + These are the four cases that arise from the following two choices: + + (1) The verifier accepts a (non-processed) verification key or, instead, a processed verification key. + In the latter case, we call the algorithm an "online verifier". + + (2) The verifier checks for "weak" input consistency or, instead, "strong" input consistency. + Strong input consistency requires that |primary_input| = CS.num_inputs, whereas + weak input consistency requires that |primary_input| <= CS.num_inputs (and + the primary input is implicitly padded with zeros up to length CS.num_inputs). + */ + +/** + * A verifier algorithm for the R1CS ppzkSNARK that: + * (1) accepts a non-processed verification key, and + * (2) has weak input consistency. + */ +template +bool r1cs_ppzksnark_verifier_weak_IC(const r1cs_ppzksnark_verification_key &vk, + const r1cs_ppzksnark_primary_input &primary_input, + const r1cs_ppzksnark_proof &proof); + +/** + * A verifier algorithm for the R1CS ppzkSNARK that: + * (1) accepts a non-processed verification key, and + * (2) has strong input consistency. + */ +template +bool r1cs_ppzksnark_verifier_strong_IC(const r1cs_ppzksnark_verification_key &vk, + const r1cs_ppzksnark_primary_input &primary_input, + const r1cs_ppzksnark_proof &proof); + +/** + * Convert a (non-processed) verification key into a processed verification key. + */ +template +r1cs_ppzksnark_processed_verification_key r1cs_ppzksnark_verifier_process_vk(const r1cs_ppzksnark_verification_key &vk); + +/** + * A verifier algorithm for the R1CS ppzkSNARK that: + * (1) accepts a processed verification key, and + * (2) has weak input consistency. + */ +template +bool r1cs_ppzksnark_online_verifier_weak_IC(const r1cs_ppzksnark_processed_verification_key &pvk, + const r1cs_ppzksnark_primary_input &input, + const r1cs_ppzksnark_proof &proof); + +/** + * A verifier algorithm for the R1CS ppzkSNARK that: + * (1) accepts a processed verification key, and + * (2) has strong input consistency. + */ +template +bool r1cs_ppzksnark_online_verifier_strong_IC(const r1cs_ppzksnark_processed_verification_key &pvk, + const r1cs_ppzksnark_primary_input &primary_input, + const r1cs_ppzksnark_proof &proof); + +/****************************** Miscellaneous ********************************/ + +/** + * For debugging purposes (of r1cs_ppzksnark_r1cs_ppzksnark_verifier_gadget): + * + * A verifier algorithm for the R1CS ppzkSNARK that: + * (1) accepts a non-processed verification key, + * (2) has weak input consistency, and + * (3) uses affine coordinates for elliptic-curve computations. + */ +template +bool r1cs_ppzksnark_affine_verifier_weak_IC(const r1cs_ppzksnark_verification_key &vk, + const r1cs_ppzksnark_primary_input &primary_input, + const r1cs_ppzksnark_proof &proof); + + +} // libsnark + +#include "zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.tcc" + +#endif // R1CS_PPZKSNARK_HPP_ diff --git a/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.tcc b/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.tcc new file mode 100644 index 000000000..aeb2bbb85 --- /dev/null +++ b/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.tcc @@ -0,0 +1,762 @@ +/** @file +***************************************************************************** + +Implementation of interfaces for a ppzkSNARK for R1CS. + +See r1cs_ppzksnark.hpp . + +***************************************************************************** +* @author This file is part of libsnark, developed by SCIPR Lab +* and contributors (see AUTHORS). +* @copyright MIT license (see LICENSE file) +*****************************************************************************/ + +#ifndef R1CS_PPZKSNARK_TCC_ +#define R1CS_PPZKSNARK_TCC_ + +#include +#include +#include +#include +#include + +#include "common/profiling.hpp" +#include "common/utils.hpp" +#include "algebra/scalar_multiplication/multiexp.hpp" +#include "algebra/scalar_multiplication/kc_multiexp.hpp" +#include "reductions/r1cs_to_qap/r1cs_to_qap.hpp" + +namespace libsnark { + +template +bool r1cs_ppzksnark_proving_key::operator==(const r1cs_ppzksnark_proving_key &other) const +{ + return (this->A_query == other.A_query && + this->B_query == other.B_query && + this->C_query == other.C_query && + this->H_query == other.H_query && + this->K_query == other.K_query); +} + +template +std::ostream& operator<<(std::ostream &out, const r1cs_ppzksnark_proving_key &pk) +{ + out << pk.A_query; + out << pk.B_query; + out << pk.C_query; + out << pk.H_query; + out << pk.K_query; + + return out; +} + +template +std::istream& operator>>(std::istream &in, r1cs_ppzksnark_proving_key &pk) +{ + in >> pk.A_query; + in >> pk.B_query; + in >> pk.C_query; + in >> pk.H_query; + in >> pk.K_query; + + return in; +} + +template +bool r1cs_ppzksnark_verification_key::operator==(const r1cs_ppzksnark_verification_key &other) const +{ + return (this->alphaA_g2 == other.alphaA_g2 && + this->alphaB_g1 == other.alphaB_g1 && + this->alphaC_g2 == other.alphaC_g2 && + this->gamma_g2 == other.gamma_g2 && + this->gamma_beta_g1 == other.gamma_beta_g1 && + this->gamma_beta_g2 == other.gamma_beta_g2 && + this->rC_Z_g2 == other.rC_Z_g2 && + this->encoded_IC_query == other.encoded_IC_query); +} + +template +std::ostream& operator<<(std::ostream &out, const r1cs_ppzksnark_verification_key &vk) +{ + out << vk.alphaA_g2 << OUTPUT_NEWLINE; + out << vk.alphaB_g1 << OUTPUT_NEWLINE; + out << vk.alphaC_g2 << OUTPUT_NEWLINE; + out << vk.gamma_g2 << OUTPUT_NEWLINE; + out << vk.gamma_beta_g1 << OUTPUT_NEWLINE; + out << vk.gamma_beta_g2 << OUTPUT_NEWLINE; + out << vk.rC_Z_g2 << OUTPUT_NEWLINE; + out << vk.encoded_IC_query << OUTPUT_NEWLINE; + + return out; +} + +template +std::istream& operator>>(std::istream &in, r1cs_ppzksnark_verification_key &vk) +{ + in >> vk.alphaA_g2; + consume_OUTPUT_NEWLINE(in); + in >> vk.alphaB_g1; + consume_OUTPUT_NEWLINE(in); + in >> vk.alphaC_g2; + consume_OUTPUT_NEWLINE(in); + in >> vk.gamma_g2; + consume_OUTPUT_NEWLINE(in); + in >> vk.gamma_beta_g1; + consume_OUTPUT_NEWLINE(in); + in >> vk.gamma_beta_g2; + consume_OUTPUT_NEWLINE(in); + in >> vk.rC_Z_g2; + consume_OUTPUT_NEWLINE(in); + in >> vk.encoded_IC_query; + consume_OUTPUT_NEWLINE(in); + + return in; +} + +template +bool r1cs_ppzksnark_processed_verification_key::operator==(const r1cs_ppzksnark_processed_verification_key &other) const +{ + return (this->pp_G2_one_precomp == other.pp_G2_one_precomp && + this->vk_alphaA_g2_precomp == other.vk_alphaA_g2_precomp && + this->vk_alphaB_g1_precomp == other.vk_alphaB_g1_precomp && + this->vk_alphaC_g2_precomp == other.vk_alphaC_g2_precomp && + this->vk_rC_Z_g2_precomp == other.vk_rC_Z_g2_precomp && + this->vk_gamma_g2_precomp == other.vk_gamma_g2_precomp && + this->vk_gamma_beta_g1_precomp == other.vk_gamma_beta_g1_precomp && + this->vk_gamma_beta_g2_precomp == other.vk_gamma_beta_g2_precomp && + this->encoded_IC_query == other.encoded_IC_query); +} + +template +std::ostream& operator<<(std::ostream &out, const r1cs_ppzksnark_processed_verification_key &pvk) +{ + out << pvk.pp_G2_one_precomp << OUTPUT_NEWLINE; + out << pvk.vk_alphaA_g2_precomp << OUTPUT_NEWLINE; + out << pvk.vk_alphaB_g1_precomp << OUTPUT_NEWLINE; + out << pvk.vk_alphaC_g2_precomp << OUTPUT_NEWLINE; + out << pvk.vk_rC_Z_g2_precomp << OUTPUT_NEWLINE; + out << pvk.vk_gamma_g2_precomp << OUTPUT_NEWLINE; + out << pvk.vk_gamma_beta_g1_precomp << OUTPUT_NEWLINE; + out << pvk.vk_gamma_beta_g2_precomp << OUTPUT_NEWLINE; + out << pvk.encoded_IC_query << OUTPUT_NEWLINE; + + return out; +} + +template +std::istream& operator>>(std::istream &in, r1cs_ppzksnark_processed_verification_key &pvk) +{ + in >> pvk.pp_G2_one_precomp; + consume_OUTPUT_NEWLINE(in); + in >> pvk.vk_alphaA_g2_precomp; + consume_OUTPUT_NEWLINE(in); + in >> pvk.vk_alphaB_g1_precomp; + consume_OUTPUT_NEWLINE(in); + in >> pvk.vk_alphaC_g2_precomp; + consume_OUTPUT_NEWLINE(in); + in >> pvk.vk_rC_Z_g2_precomp; + consume_OUTPUT_NEWLINE(in); + in >> pvk.vk_gamma_g2_precomp; + consume_OUTPUT_NEWLINE(in); + in >> pvk.vk_gamma_beta_g1_precomp; + consume_OUTPUT_NEWLINE(in); + in >> pvk.vk_gamma_beta_g2_precomp; + consume_OUTPUT_NEWLINE(in); + in >> pvk.encoded_IC_query; + consume_OUTPUT_NEWLINE(in); + + return in; +} + +template +bool r1cs_ppzksnark_proof::operator==(const r1cs_ppzksnark_proof &other) const +{ + return (this->g_A == other.g_A && + this->g_B == other.g_B && + this->g_C == other.g_C && + this->g_H == other.g_H && + this->g_K == other.g_K); +} + +template +std::ostream& operator<<(std::ostream &out, const r1cs_ppzksnark_proof &proof) +{ + out << proof.g_A << OUTPUT_NEWLINE; + out << proof.g_B << OUTPUT_NEWLINE; + out << proof.g_C << OUTPUT_NEWLINE; + out << proof.g_H << OUTPUT_NEWLINE; + out << proof.g_K << OUTPUT_NEWLINE; + + return out; +} + +template +std::istream& operator>>(std::istream &in, r1cs_ppzksnark_proof &proof) +{ + in >> proof.g_A; + consume_OUTPUT_NEWLINE(in); + in >> proof.g_B; + consume_OUTPUT_NEWLINE(in); + in >> proof.g_C; + consume_OUTPUT_NEWLINE(in); + in >> proof.g_H; + consume_OUTPUT_NEWLINE(in); + in >> proof.g_K; + consume_OUTPUT_NEWLINE(in); + + return in; +} + +template +r1cs_ppzksnark_verification_key r1cs_ppzksnark_verification_key::dummy_verification_key(const size_t input_size) +{ + r1cs_ppzksnark_verification_key result; + result.alphaA_g2 = Fr::random_element() * G2::one(); + result.alphaB_g1 = Fr::random_element() * G1::one(); + result.alphaC_g2 = Fr::random_element() * G2::one(); + result.gamma_g2 = Fr::random_element() * G2::one(); + result.gamma_beta_g1 = Fr::random_element() * G1::one(); + result.gamma_beta_g2 = Fr::random_element() * G2::one(); + result.rC_Z_g2 = Fr::random_element() * G2::one(); + + G1 base = Fr::random_element() * G1::one(); + G1_vector v; + for (size_t i = 0; i < input_size; ++i) + { + v.emplace_back(Fr::random_element() * G1::one()); + } + + result.encoded_IC_query = accumulation_vector >(std::move(base), std::move(v)); + + return result; +} + +template +r1cs_ppzksnark_keypair r1cs_ppzksnark_generator(const r1cs_ppzksnark_constraint_system &cs) +{ + /* draw random element at which the QAP is evaluated */ + const Fr t = Fr::random_element(); + + const Fr alphaA = Fr::random_element(), + alphaB = Fr::random_element(), + alphaC = Fr::random_element(), + rA = Fr::random_element(), + rB = Fr::random_element(), + beta = Fr::random_element(), + gamma = Fr::random_element(); + + return r1cs_ppzksnark_generator(cs, t, alphaA, alphaB, alphaC, rA, rB, beta, gamma); +} + +template +r1cs_ppzksnark_keypair r1cs_ppzksnark_generator( + const r1cs_ppzksnark_constraint_system &cs, + const Fr& t, + const Fr& alphaA, + const Fr& alphaB, + const Fr& alphaC, + const Fr& rA, + const Fr& rB, + const Fr& beta, + const Fr& gamma +) +{ + enter_block("Call to r1cs_ppzksnark_generator"); + + /* make the B_query "lighter" if possible */ + r1cs_ppzksnark_constraint_system cs_copy(cs); + cs_copy.swap_AB_if_beneficial(); + + qap_instance_evaluation > qap_inst = r1cs_to_qap_instance_map_with_evaluation(cs_copy, t); + + print_indent(); printf("* QAP number of variables: %zu\n", qap_inst.num_variables()); + print_indent(); printf("* QAP pre degree: %zu\n", cs_copy.constraints.size()); + print_indent(); printf("* QAP degree: %zu\n", qap_inst.degree()); + print_indent(); printf("* QAP number of input variables: %zu\n", qap_inst.num_inputs()); + + enter_block("Compute query densities"); + size_t non_zero_At = 0, non_zero_Bt = 0, non_zero_Ct = 0, non_zero_Ht = 0; + for (size_t i = 0; i < qap_inst.num_variables()+1; ++i) + { + if (!qap_inst.At[i].is_zero()) + { + ++non_zero_At; + } + if (!qap_inst.Bt[i].is_zero()) + { + ++non_zero_Bt; + } + if (!qap_inst.Ct[i].is_zero()) + { + ++non_zero_Ct; + } + } + for (size_t i = 0; i < qap_inst.degree()+1; ++i) + { + if (!qap_inst.Ht[i].is_zero()) + { + ++non_zero_Ht; + } + } + leave_block("Compute query densities"); + + Fr_vector At = std::move(qap_inst.At); // qap_inst.At is now in unspecified state, but we do not use it later + Fr_vector Bt = std::move(qap_inst.Bt); // qap_inst.Bt is now in unspecified state, but we do not use it later + Fr_vector Ct = std::move(qap_inst.Ct); // qap_inst.Ct is now in unspecified state, but we do not use it later + Fr_vector Ht = std::move(qap_inst.Ht); // qap_inst.Ht is now in unspecified state, but we do not use it later + + /* append Zt to At,Bt,Ct with */ + At.emplace_back(qap_inst.Zt); + Bt.emplace_back(qap_inst.Zt); + Ct.emplace_back(qap_inst.Zt); + + const Fr rC = rA * rB; + + // consrtuct the same-coefficient-check query (must happen before zeroing out the prefix of At) + Fr_vector Kt; + Kt.reserve(qap_inst.num_variables()+4); + for (size_t i = 0; i < qap_inst.num_variables()+1; ++i) + { + Kt.emplace_back( beta * (rA * At[i] + rB * Bt[i] + rC * Ct[i] ) ); + } + Kt.emplace_back(beta * rA * qap_inst.Zt); + Kt.emplace_back(beta * rB * qap_inst.Zt); + Kt.emplace_back(beta * rC * qap_inst.Zt); + + /* zero out prefix of At and stick it into IC coefficients */ + Fr_vector IC_coefficients; + IC_coefficients.reserve(qap_inst.num_inputs() + 1); + for (size_t i = 0; i < qap_inst.num_inputs() + 1; ++i) + { + IC_coefficients.emplace_back(At[i]); + assert(!IC_coefficients[i].is_zero()); + At[i] = Fr::zero(); + } + + const size_t g1_exp_count = 2*(non_zero_At - qap_inst.num_inputs() + non_zero_Ct) + non_zero_Bt + non_zero_Ht + Kt.size(); + const size_t g2_exp_count = non_zero_Bt; + + size_t g1_window = get_exp_window_size >(g1_exp_count); + size_t g2_window = get_exp_window_size >(g2_exp_count); + print_indent(); printf("* G1 window: %zu\n", g1_window); + print_indent(); printf("* G2 window: %zu\n", g2_window); + +#ifdef MULTICORE + const size_t chunks = omp_get_max_threads(); // to override, set OMP_NUM_THREADS env var or call omp_set_num_threads() +#else + const size_t chunks = 1; +#endif + + enter_block("Generating G1 multiexp table"); + window_table > g1_table = get_window_table(Fr::size_in_bits(), g1_window, G1::one()); + leave_block("Generating G1 multiexp table"); + + enter_block("Generating G2 multiexp table"); + window_table > g2_table = get_window_table(Fr::size_in_bits(), g2_window, G2::one()); + leave_block("Generating G2 multiexp table"); + + enter_block("Generate R1CS proving key"); + + enter_block("Generate knowledge commitments"); + enter_block("Compute the A-query", false); + knowledge_commitment_vector, G1 > A_query = kc_batch_exp(Fr::size_in_bits(), g1_window, g1_window, g1_table, g1_table, rA, rA*alphaA, At, chunks); + leave_block("Compute the A-query", false); + + enter_block("Compute the B-query", false); + knowledge_commitment_vector, G1 > B_query = kc_batch_exp(Fr::size_in_bits(), g2_window, g1_window, g2_table, g1_table, rB, rB*alphaB, Bt, chunks); + leave_block("Compute the B-query", false); + + enter_block("Compute the C-query", false); + knowledge_commitment_vector, G1 > C_query = kc_batch_exp(Fr::size_in_bits(), g1_window, g1_window, g1_table, g1_table, rC, rC*alphaC, Ct, chunks); + leave_block("Compute the C-query", false); + + enter_block("Compute the H-query", false); + G1_vector H_query = batch_exp(Fr::size_in_bits(), g1_window, g1_table, Ht); + leave_block("Compute the H-query", false); + + enter_block("Compute the K-query", false); + G1_vector K_query = batch_exp(Fr::size_in_bits(), g1_window, g1_table, Kt); +#ifdef USE_MIXED_ADDITION + batch_to_special >(K_query); +#endif + leave_block("Compute the K-query", false); + + leave_block("Generate knowledge commitments"); + + leave_block("Generate R1CS proving key"); + + enter_block("Generate R1CS verification key"); + G2 alphaA_g2 = alphaA * G2::one(); + G1 alphaB_g1 = alphaB * G1::one(); + G2 alphaC_g2 = alphaC * G2::one(); + G2 gamma_g2 = gamma * G2::one(); + G1 gamma_beta_g1 = (gamma * beta) * G1::one(); + G2 gamma_beta_g2 = (gamma * beta) * G2::one(); + G2 rC_Z_g2 = (rC * qap_inst.Zt) * G2::one(); + + enter_block("Encode IC query for R1CS verification key"); + G1 encoded_IC_base = (rA * IC_coefficients[0]) * G1::one(); + Fr_vector multiplied_IC_coefficients; + multiplied_IC_coefficients.reserve(qap_inst.num_inputs()); + for (size_t i = 1; i < qap_inst.num_inputs() + 1; ++i) + { + multiplied_IC_coefficients.emplace_back(rA * IC_coefficients[i]); + } + G1_vector encoded_IC_values = batch_exp(Fr::size_in_bits(), g1_window, g1_table, multiplied_IC_coefficients); + + leave_block("Encode IC query for R1CS verification key"); + leave_block("Generate R1CS verification key"); + + leave_block("Call to r1cs_ppzksnark_generator"); + + accumulation_vector > encoded_IC_query(std::move(encoded_IC_base), std::move(encoded_IC_values)); + + r1cs_ppzksnark_verification_key vk = r1cs_ppzksnark_verification_key(alphaA_g2, + alphaB_g1, + alphaC_g2, + gamma_g2, + gamma_beta_g1, + gamma_beta_g2, + rC_Z_g2, + encoded_IC_query); + r1cs_ppzksnark_proving_key pk = r1cs_ppzksnark_proving_key(std::move(A_query), + std::move(B_query), + std::move(C_query), + std::move(H_query), + std::move(K_query)); + + pk.print_size(); + vk.print_size(); + + return r1cs_ppzksnark_keypair(std::move(pk), std::move(vk)); +} + +template +r1cs_ppzksnark_proof r1cs_ppzksnark_prover(const r1cs_ppzksnark_proving_key &pk, + const r1cs_ppzksnark_primary_input &primary_input, + const r1cs_ppzksnark_auxiliary_input &auxiliary_input, + const r1cs_ppzksnark_constraint_system &constraint_system) +{ + enter_block("Call to r1cs_ppzksnark_prover"); + +#ifdef DEBUG + assert(constraint_system.is_satisfied(primary_input, auxiliary_input)); +#endif + + const Fr d1 = Fr::random_element(), + d2 = Fr::random_element(), + d3 = Fr::random_element(); + + enter_block("Compute the polynomial H"); + const qap_witness > qap_wit = r1cs_to_qap_witness_map(constraint_system, primary_input, auxiliary_input, d1, d2, d3); + leave_block("Compute the polynomial H"); + +#ifdef DEBUG + const Fr t = Fr::random_element(); + qap_instance_evaluation > qap_inst = r1cs_to_qap_instance_map_with_evaluation(constraint_system, t); + assert(qap_inst.is_satisfied(qap_wit)); +#endif + + knowledge_commitment, G1 > g_A = pk.A_query[0] + qap_wit.d1*pk.A_query[qap_wit.num_variables()+1]; + knowledge_commitment, G1 > g_B = pk.B_query[0] + qap_wit.d2*pk.B_query[qap_wit.num_variables()+1]; + knowledge_commitment, G1 > g_C = pk.C_query[0] + qap_wit.d3*pk.C_query[qap_wit.num_variables()+1]; + + G1 g_H = G1::zero(); + G1 g_K = (pk.K_query[0] + + qap_wit.d1*pk.K_query[qap_wit.num_variables()+1] + + qap_wit.d2*pk.K_query[qap_wit.num_variables()+2] + + qap_wit.d3*pk.K_query[qap_wit.num_variables()+3]); + +#ifdef DEBUG + for (size_t i = 0; i < qap_wit.num_inputs() + 1; ++i) + { + assert(pk.A_query[i].g == G1::zero()); + } + assert(pk.A_query.domain_size() == qap_wit.num_variables()+2); + assert(pk.B_query.domain_size() == qap_wit.num_variables()+2); + assert(pk.C_query.domain_size() == qap_wit.num_variables()+2); + assert(pk.H_query.size() == qap_wit.degree()+1); + assert(pk.K_query.size() == qap_wit.num_variables()+4); +#endif + +#ifdef MULTICORE + const size_t chunks = omp_get_max_threads(); // to override, set OMP_NUM_THREADS env var or call omp_set_num_threads() +#else + const size_t chunks = 1; +#endif + + enter_block("Compute the proof"); + + enter_block("Compute answer to A-query", false); + g_A = g_A + kc_multi_exp_with_mixed_addition, G1, Fr >(pk.A_query, + 1, 1+qap_wit.num_variables(), + qap_wit.coefficients_for_ABCs.begin(), qap_wit.coefficients_for_ABCs.begin()+qap_wit.num_variables(), + chunks, true); + leave_block("Compute answer to A-query", false); + + enter_block("Compute answer to B-query", false); + g_B = g_B + kc_multi_exp_with_mixed_addition, G1, Fr >(pk.B_query, + 1, 1+qap_wit.num_variables(), + qap_wit.coefficients_for_ABCs.begin(), qap_wit.coefficients_for_ABCs.begin()+qap_wit.num_variables(), + chunks, true); + leave_block("Compute answer to B-query", false); + + enter_block("Compute answer to C-query", false); + g_C = g_C + kc_multi_exp_with_mixed_addition, G1, Fr >(pk.C_query, + 1, 1+qap_wit.num_variables(), + qap_wit.coefficients_for_ABCs.begin(), qap_wit.coefficients_for_ABCs.begin()+qap_wit.num_variables(), + chunks, true); + leave_block("Compute answer to C-query", false); + + enter_block("Compute answer to H-query", false); + g_H = g_H + multi_exp, Fr >(pk.H_query.begin(), pk.H_query.begin()+qap_wit.degree()+1, + qap_wit.coefficients_for_H.begin(), qap_wit.coefficients_for_H.begin()+qap_wit.degree()+1, + chunks, true); + leave_block("Compute answer to H-query", false); + + enter_block("Compute answer to K-query", false); + g_K = g_K + multi_exp_with_mixed_addition, Fr >(pk.K_query.begin()+1, pk.K_query.begin()+1+qap_wit.num_variables(), + qap_wit.coefficients_for_ABCs.begin(), qap_wit.coefficients_for_ABCs.begin()+qap_wit.num_variables(), + chunks, true); + leave_block("Compute answer to K-query", false); + + leave_block("Compute the proof"); + + leave_block("Call to r1cs_ppzksnark_prover"); + + r1cs_ppzksnark_proof proof = r1cs_ppzksnark_proof(std::move(g_A), std::move(g_B), std::move(g_C), std::move(g_H), std::move(g_K)); + //proof.print_size(); + + return proof; +} + +template +r1cs_ppzksnark_processed_verification_key r1cs_ppzksnark_verifier_process_vk(const r1cs_ppzksnark_verification_key &vk) +{ + enter_block("Call to r1cs_ppzksnark_verifier_process_vk"); + + r1cs_ppzksnark_processed_verification_key pvk; + pvk.pp_G2_one_precomp = ppT::precompute_G2(G2::one()); + pvk.vk_alphaA_g2_precomp = ppT::precompute_G2(vk.alphaA_g2); + pvk.vk_alphaB_g1_precomp = ppT::precompute_G1(vk.alphaB_g1); + pvk.vk_alphaC_g2_precomp = ppT::precompute_G2(vk.alphaC_g2); + pvk.vk_rC_Z_g2_precomp = ppT::precompute_G2(vk.rC_Z_g2); + pvk.vk_gamma_g2_precomp = ppT::precompute_G2(vk.gamma_g2); + pvk.vk_gamma_beta_g1_precomp = ppT::precompute_G1(vk.gamma_beta_g1); + pvk.vk_gamma_beta_g2_precomp = ppT::precompute_G2(vk.gamma_beta_g2); + + pvk.encoded_IC_query = vk.encoded_IC_query; + + leave_block("Call to r1cs_ppzksnark_verifier_process_vk"); + + return pvk; +} + +template +bool r1cs_ppzksnark_online_verifier_weak_IC(const r1cs_ppzksnark_processed_verification_key &pvk, + const r1cs_ppzksnark_primary_input &primary_input, + const r1cs_ppzksnark_proof &proof) +{ + assert(pvk.encoded_IC_query.domain_size() >= primary_input.size()); + + const accumulation_vector > accumulated_IC = pvk.encoded_IC_query.template accumulate_chunk >(primary_input.begin(), primary_input.end(), 0); + const G1 &acc = accumulated_IC.first; + + if (!proof.is_well_formed()) + { + return false; + } + + G1_precomp proof_g_A_g_precomp = ppT::precompute_G1(proof.g_A.g); + G1_precomp proof_g_A_h_precomp = ppT::precompute_G1(proof.g_A.h); + Fqk kc_A_1 = ppT::miller_loop(proof_g_A_g_precomp, pvk.vk_alphaA_g2_precomp); + Fqk kc_A_2 = ppT::miller_loop(proof_g_A_h_precomp, pvk.pp_G2_one_precomp); + GT kc_A = ppT::final_exponentiation(kc_A_1 * kc_A_2.unitary_inverse()); + if (kc_A != GT::one()) + { + return false; + } + + G2_precomp proof_g_B_g_precomp = ppT::precompute_G2(proof.g_B.g); + G1_precomp proof_g_B_h_precomp = ppT::precompute_G1(proof.g_B.h); + Fqk kc_B_1 = ppT::miller_loop(pvk.vk_alphaB_g1_precomp, proof_g_B_g_precomp); + Fqk kc_B_2 = ppT::miller_loop(proof_g_B_h_precomp, pvk.pp_G2_one_precomp); + GT kc_B = ppT::final_exponentiation(kc_B_1 * kc_B_2.unitary_inverse()); + if (kc_B != GT::one()) + { + return false; + } + + G1_precomp proof_g_C_g_precomp = ppT::precompute_G1(proof.g_C.g); + G1_precomp proof_g_C_h_precomp = ppT::precompute_G1(proof.g_C.h); + Fqk kc_C_1 = ppT::miller_loop(proof_g_C_g_precomp, pvk.vk_alphaC_g2_precomp); + Fqk kc_C_2 = ppT::miller_loop(proof_g_C_h_precomp, pvk.pp_G2_one_precomp); + GT kc_C = ppT::final_exponentiation(kc_C_1 * kc_C_2.unitary_inverse()); + if (kc_C != GT::one()) + { + return false; + } + + // check that g^((A+acc)*B)=g^(H*\Prod(t-\sigma)+C) + // equivalently, via pairings, that e(g^(A+acc), g^B) = e(g^H, g^Z) + e(g^C, g^1) + G1_precomp proof_g_A_g_acc_precomp = ppT::precompute_G1(proof.g_A.g + acc); + G1_precomp proof_g_H_precomp = ppT::precompute_G1(proof.g_H); + Fqk QAP_1 = ppT::miller_loop(proof_g_A_g_acc_precomp, proof_g_B_g_precomp); + Fqk QAP_23 = ppT::double_miller_loop(proof_g_H_precomp, pvk.vk_rC_Z_g2_precomp, proof_g_C_g_precomp, pvk.pp_G2_one_precomp); + GT QAP = ppT::final_exponentiation(QAP_1 * QAP_23.unitary_inverse()); + if (QAP != GT::one()) + { + return false; + } + + G1_precomp proof_g_K_precomp = ppT::precompute_G1(proof.g_K); + G1_precomp proof_g_A_g_acc_C_precomp = ppT::precompute_G1((proof.g_A.g + acc) + proof.g_C.g); + Fqk K_1 = ppT::miller_loop(proof_g_K_precomp, pvk.vk_gamma_g2_precomp); + Fqk K_23 = ppT::double_miller_loop(proof_g_A_g_acc_C_precomp, pvk.vk_gamma_beta_g2_precomp, pvk.vk_gamma_beta_g1_precomp, proof_g_B_g_precomp); + GT K = ppT::final_exponentiation(K_1 * K_23.unitary_inverse()); + if (K != GT::one()) + { + return false; + } + + return true; +} + +template +bool r1cs_ppzksnark_verifier_weak_IC(const r1cs_ppzksnark_verification_key &vk, + const r1cs_ppzksnark_primary_input &primary_input, + const r1cs_ppzksnark_proof &proof) +{ + enter_block("Call to r1cs_ppzksnark_verifier_weak_IC"); + r1cs_ppzksnark_processed_verification_key pvk = r1cs_ppzksnark_verifier_process_vk(vk); + bool result = r1cs_ppzksnark_online_verifier_weak_IC(pvk, primary_input, proof); + leave_block("Call to r1cs_ppzksnark_verifier_weak_IC"); + return result; +} + +template +bool r1cs_ppzksnark_online_verifier_strong_IC(const r1cs_ppzksnark_processed_verification_key &pvk, + const r1cs_ppzksnark_primary_input &primary_input, + const r1cs_ppzksnark_proof &proof) +{ + bool result = true; + enter_block("Call to r1cs_ppzksnark_online_verifier_strong_IC"); + + if (pvk.encoded_IC_query.domain_size() != primary_input.size()) + { + print_indent(); printf("Input length differs from expected (got %zu, expected %zu).\n", primary_input.size(), pvk.encoded_IC_query.domain_size()); + result = false; + } + else + { + result = r1cs_ppzksnark_online_verifier_weak_IC(pvk, primary_input, proof); + } + + leave_block("Call to r1cs_ppzksnark_online_verifier_strong_IC"); + return result; +} + +template +bool r1cs_ppzksnark_verifier_strong_IC(const r1cs_ppzksnark_verification_key &vk, + const r1cs_ppzksnark_primary_input &primary_input, + const r1cs_ppzksnark_proof &proof) +{ + enter_block("Call to r1cs_ppzksnark_verifier_strong_IC"); + r1cs_ppzksnark_processed_verification_key pvk = r1cs_ppzksnark_verifier_process_vk(vk); + bool result = r1cs_ppzksnark_online_verifier_strong_IC(pvk, primary_input, proof); + leave_block("Call to r1cs_ppzksnark_verifier_strong_IC"); + return result; +} + +template +bool r1cs_ppzksnark_affine_verifier_weak_IC(const r1cs_ppzksnark_verification_key &vk, + const r1cs_ppzksnark_primary_input &primary_input, + const r1cs_ppzksnark_proof &proof) +{ + enter_block("Call to r1cs_ppzksnark_affine_verifier_weak_IC"); + assert(vk.encoded_IC_query.domain_size() >= primary_input.size()); + + affine_ate_G2_precomp pvk_pp_G2_one_precomp = ppT::affine_ate_precompute_G2(G2::one()); + affine_ate_G2_precomp pvk_vk_alphaA_g2_precomp = ppT::affine_ate_precompute_G2(vk.alphaA_g2); + affine_ate_G1_precomp pvk_vk_alphaB_g1_precomp = ppT::affine_ate_precompute_G1(vk.alphaB_g1); + affine_ate_G2_precomp pvk_vk_alphaC_g2_precomp = ppT::affine_ate_precompute_G2(vk.alphaC_g2); + affine_ate_G2_precomp pvk_vk_rC_Z_g2_precomp = ppT::affine_ate_precompute_G2(vk.rC_Z_g2); + affine_ate_G2_precomp pvk_vk_gamma_g2_precomp = ppT::affine_ate_precompute_G2(vk.gamma_g2); + affine_ate_G1_precomp pvk_vk_gamma_beta_g1_precomp = ppT::affine_ate_precompute_G1(vk.gamma_beta_g1); + affine_ate_G2_precomp pvk_vk_gamma_beta_g2_precomp = ppT::affine_ate_precompute_G2(vk.gamma_beta_g2); + + enter_block("Compute input-dependent part of A"); + const accumulation_vector > accumulated_IC = vk.encoded_IC_query.template accumulate_chunk >(primary_input.begin(), primary_input.end(), 0); + assert(accumulated_IC.is_fully_accumulated()); + const G1 &acc = accumulated_IC.first; + leave_block("Compute input-dependent part of A"); + + bool result = true; + enter_block("Check knowledge commitment for A is valid"); + affine_ate_G1_precomp proof_g_A_g_precomp = ppT::affine_ate_precompute_G1(proof.g_A.g); + affine_ate_G1_precomp proof_g_A_h_precomp = ppT::affine_ate_precompute_G1(proof.g_A.h); + Fqk kc_A_miller = ppT::affine_ate_e_over_e_miller_loop(proof_g_A_g_precomp, pvk_vk_alphaA_g2_precomp, proof_g_A_h_precomp, pvk_pp_G2_one_precomp); + GT kc_A = ppT::final_exponentiation(kc_A_miller); + + if (kc_A != GT::one()) + { + print_indent(); printf("Knowledge commitment for A query incorrect.\n"); + result = false; + } + leave_block("Check knowledge commitment for A is valid"); + + enter_block("Check knowledge commitment for B is valid"); + affine_ate_G2_precomp proof_g_B_g_precomp = ppT::affine_ate_precompute_G2(proof.g_B.g); + affine_ate_G1_precomp proof_g_B_h_precomp = ppT::affine_ate_precompute_G1(proof.g_B.h); + Fqk kc_B_miller = ppT::affine_ate_e_over_e_miller_loop(pvk_vk_alphaB_g1_precomp, proof_g_B_g_precomp, proof_g_B_h_precomp, pvk_pp_G2_one_precomp); + GT kc_B = ppT::final_exponentiation(kc_B_miller); + if (kc_B != GT::one()) + { + print_indent(); printf("Knowledge commitment for B query incorrect.\n"); + result = false; + } + leave_block("Check knowledge commitment for B is valid"); + + enter_block("Check knowledge commitment for C is valid"); + affine_ate_G1_precomp proof_g_C_g_precomp = ppT::affine_ate_precompute_G1(proof.g_C.g); + affine_ate_G1_precomp proof_g_C_h_precomp = ppT::affine_ate_precompute_G1(proof.g_C.h); + Fqk kc_C_miller = ppT::affine_ate_e_over_e_miller_loop(proof_g_C_g_precomp, pvk_vk_alphaC_g2_precomp, proof_g_C_h_precomp, pvk_pp_G2_one_precomp); + GT kc_C = ppT::final_exponentiation(kc_C_miller); + if (kc_C != GT::one()) + { + print_indent(); printf("Knowledge commitment for C query incorrect.\n"); + result = false; + } + leave_block("Check knowledge commitment for C is valid"); + + enter_block("Check QAP divisibility"); + affine_ate_G1_precomp proof_g_A_g_acc_precomp = ppT::affine_ate_precompute_G1(proof.g_A.g + acc); + affine_ate_G1_precomp proof_g_H_precomp = ppT::affine_ate_precompute_G1(proof.g_H); + Fqk QAP_miller = ppT::affine_ate_e_times_e_over_e_miller_loop(proof_g_H_precomp, pvk_vk_rC_Z_g2_precomp, proof_g_C_g_precomp, pvk_pp_G2_one_precomp, proof_g_A_g_acc_precomp, proof_g_B_g_precomp); + GT QAP = ppT::final_exponentiation(QAP_miller); + if (QAP != GT::one()) + { + print_indent(); printf("QAP divisibility check failed.\n"); + result = false; + } + leave_block("Check QAP divisibility"); + + enter_block("Check same coefficients were used"); + affine_ate_G1_precomp proof_g_K_precomp = ppT::affine_ate_precompute_G1(proof.g_K); + affine_ate_G1_precomp proof_g_A_g_acc_C_precomp = ppT::affine_ate_precompute_G1((proof.g_A.g + acc) + proof.g_C.g); + Fqk K_miller = ppT::affine_ate_e_times_e_over_e_miller_loop(proof_g_A_g_acc_C_precomp, pvk_vk_gamma_beta_g2_precomp, pvk_vk_gamma_beta_g1_precomp, proof_g_B_g_precomp, proof_g_K_precomp, pvk_vk_gamma_g2_precomp); + GT K = ppT::final_exponentiation(K_miller); + if (K != GT::one()) + { + print_indent(); printf("Same-coefficient check failed.\n"); + result = false; + } + leave_block("Check same coefficients were used"); + + leave_block("Call to r1cs_ppzksnark_affine_verifier_weak_IC"); + + return result; +} + +} // libsnark +#endif // R1CS_PPZKSNARK_TCC_ diff --git a/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark_params.hpp b/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark_params.hpp new file mode 100644 index 000000000..4054b8e3b --- /dev/null +++ b/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark_params.hpp @@ -0,0 +1,34 @@ +/** @file + ***************************************************************************** + + Declaration of public-parameter selector for the R1CS ppzkSNARK. + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ + +#ifndef R1CS_PPZKSNARK_PARAMS_HPP_ +#define R1CS_PPZKSNARK_PARAMS_HPP_ + +#include "relations/constraint_satisfaction_problems/r1cs/r1cs.hpp" + +namespace libsnark { + +/** + * Below are various template aliases (used for convenience). + */ + +template +using r1cs_ppzksnark_constraint_system = r1cs_constraint_system >; + +template +using r1cs_ppzksnark_primary_input = r1cs_primary_input >; + +template +using r1cs_ppzksnark_auxiliary_input = r1cs_auxiliary_input >; + +} // libsnark + +#endif // R1CS_PPZKSNARK_PARAMS_HPP_ diff --git a/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/tests/test_r1cs_ppzksnark.cpp b/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/tests/test_r1cs_ppzksnark.cpp new file mode 100644 index 000000000..6f8b575f2 --- /dev/null +++ b/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/tests/test_r1cs_ppzksnark.cpp @@ -0,0 +1,42 @@ +/** @file + ***************************************************************************** + Test program that exercises the ppzkSNARK (first generator, then + prover, then verifier) on a synthetic R1CS instance. + + ***************************************************************************** + * @author This file is part of libsnark, developed by SCIPR Lab + * and contributors (see AUTHORS). + * @copyright MIT license (see LICENSE file) + *****************************************************************************/ +#include +#include + +#include "common/default_types/r1cs_ppzksnark_pp.hpp" +#include "common/profiling.hpp" +#include "common/utils.hpp" +#include "relations/constraint_satisfaction_problems/r1cs/examples/r1cs_examples.hpp" +#include "zk_proof_systems/ppzksnark/r1cs_ppzksnark/examples/run_r1cs_ppzksnark.hpp" + +using namespace libsnark; + +template +void test_r1cs_ppzksnark(size_t num_constraints, + size_t input_size) +{ + print_header("(enter) Test R1CS ppzkSNARK"); + + const bool test_serialization = true; + r1cs_example > example = generate_r1cs_example_with_binary_input >(num_constraints, input_size); + const bool bit = run_r1cs_ppzksnark(example, test_serialization); + assert(bit); + + print_header("(leave) Test R1CS ppzkSNARK"); +} + +int main() +{ + default_r1cs_ppzksnark_pp::init_public_params(); + start_profiling(); + + test_r1cs_ppzksnark(1000, 100); +} From 26a8f68ea8a021c1fa096fd4528b6b98e89a2e62 Mon Sep 17 00:00:00 2001 From: Sean Bowe Date: Mon, 10 Apr 2017 14:25:04 -0600 Subject: [PATCH 0174/1062] Remove libsnark from depends system and integrate it into build system. --- configure.ac | 20 ++------------------ depends/packages/libsnark.mk | 17 ----------------- depends/packages/packages.mk | 2 +- src/Makefile.am | 16 +++++++++++++--- src/Makefile.gtest.include | 2 +- src/Makefile.test.include | 2 +- src/Makefile.zcash.include | 3 +++ 7 files changed, 21 insertions(+), 41 deletions(-) delete mode 100644 depends/packages/libsnark.mk diff --git a/configure.ac b/configure.ac index 129ddcde5..80e5e577e 100644 --- a/configure.ac +++ b/configure.ac @@ -757,28 +757,12 @@ AC_CHECK_LIB([gmp],[[__gmpn_sub_n]],GMP_LIBS=-lgmp, [AC_MSG_ERROR(libgmp missing AC_CHECK_HEADER([gmpxx.h],,AC_MSG_ERROR(libgmpxx headers missing)) AC_CHECK_LIB([gmpxx],[main],GMPXX_LIBS=-lgmpxx, [AC_MSG_ERROR(libgmpxx missing)]) -# libsnark header layout is broken unless cpp's -I is passed with the -# libsnark directory, so for now we use this hideous workaround: -echo 'Hunting for libsnark include directory...' -[LIBSNARK_INCDIR="$(echo "$CPPFLAGS" | sed 's,^.*-I\([^ ]*/include\).*$,\1/libsnark,')"] -if test -d "$LIBSNARK_INCDIR"; then - echo "Found libsnark include directory: $LIBSNARK_INCDIR" -else - AC_MSG_ERROR(libsnark include directory not found) -fi - -CPPFLAGS="-I$LIBSNARK_INCDIR $CPPFLAGS" - -# Now check for libsnark compilability using traditional autoconf tests: -AC_CHECK_HEADER([libsnark/gadgetlib1/gadget.hpp],,AC_MSG_ERROR(libsnark headers missing)) -AC_CHECK_LIB([snark],[main],LIBSNARK_LIBS=-lsnark, [AC_MSG_ERROR(libsnark missing)], [-lgmpxx]) - RUST_LIBS="" if test x$enable_rust != xno; then RUST_LIBS="-lrustzcash" fi -LIBZCASH_LIBS="-lsnark -lgmp -lgmpxx -lboost_system-mt -lcrypto -lsodium -fopenmp $RUST_LIBS" +LIBZCASH_LIBS="-lgmp -lgmpxx -lboost_system-mt -lcrypto -lsodium -fopenmp $RUST_LIBS" CXXFLAGS_TEMP="$CXXFLAGS" LIBS_TEMP="$LIBS" @@ -944,7 +928,7 @@ unset PKG_CONFIG_LIBDIR PKG_CONFIG_LIBDIR="$PKGCONFIG_LIBDIR_TEMP" ac_configure_args="${ac_configure_args} --disable-shared --with-pic --with-bignum=no --enable-module-recovery" -AC_CONFIG_SUBDIRS([src/secp256k1 src/univalue]) +AC_CONFIG_SUBDIRS([src/secp256k1 src/snark src/univalue]) AC_OUTPUT diff --git a/depends/packages/libsnark.mk b/depends/packages/libsnark.mk deleted file mode 100644 index 4a7d86bbb..000000000 --- a/depends/packages/libsnark.mk +++ /dev/null @@ -1,17 +0,0 @@ -package=libsnark -$(package)_version=0.1 -$(package)_download_path=https://github.com/zcash/$(package)/archive/ -$(package)_file_name=$(package)-$($(package)_git_commit).tar.gz -$(package)_download_file=$($(package)_git_commit).tar.gz -$(package)_sha256_hash=dad153fe46e2e1f33557a195cbe7d69aed8b19ed9befc08ddcb8c6d3c025941f -$(package)_git_commit=9ada3f84ab484c57b2247c2f41091fd6a0916573 - -$(package)_dependencies=libgmp libsodium - -define $(package)_build_cmds - CXXFLAGS="-fPIC -DBINARY_OUTPUT -DNO_PT_COMPRESSION=1" $(MAKE) lib DEPINST=$(host_prefix) CURVE=ALT_BN128 MULTICORE=1 NO_PROCPS=1 NO_GTEST=1 NO_DOCS=1 STATIC=1 NO_SUPERCOP=1 FEATUREFLAGS=-DMONTGOMERY_OUTPUT OPTFLAGS="-O2 -march=x86-64" -endef - -define $(package)_stage_cmds - $(MAKE) install STATIC=1 DEPINST=$(host_prefix) PREFIX=$($(package)_staging_dir)$(host_prefix) CURVE=ALT_BN128 NO_SUPERCOP=1 -endef diff --git a/depends/packages/packages.mk b/depends/packages/packages.mk index 91873bf9f..0b7905e4f 100644 --- a/depends/packages/packages.mk +++ b/depends/packages/packages.mk @@ -1,6 +1,6 @@ rust_packages := rust librustzcash proton_packages := proton -zcash_packages := libsnark libgmp libsodium +zcash_packages := libgmp libsodium packages := boost openssl libevent zeromq $(zcash_packages) googletest googlemock native_packages := native_ccache diff --git a/src/Makefile.am b/src/Makefile.am index 4f4b28764..1d87506fb 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,4 +1,4 @@ -DIST_SUBDIRS = secp256k1 univalue +DIST_SUBDIRS = secp256k1 snark univalue AM_LDFLAGS = $(PTHREAD_CFLAGS) $(LIBTOOL_LDFLAGS) @@ -21,6 +21,8 @@ BITCOIN_CONFIG_INCLUDES=-I$(builddir)/config BITCOIN_INCLUDES=-I$(builddir) -I$(builddir)/obj $(BOOST_CPPFLAGS) $(LEVELDB_CPPFLAGS) $(CRYPTO_CFLAGS) $(SSL_CFLAGS) BITCOIN_INCLUDES += -I$(srcdir)/secp256k1/include +BITCOIN_INCLUDES += -I$(srcdir)/snark/build/include +BITCOIN_INCLUDES += -I$(srcdir)/snark/build/include/libsnark BITCOIN_INCLUDES += -I$(srcdir)/univalue/include LIBBITCOIN_SERVER=libbitcoin_server.a @@ -30,12 +32,18 @@ LIBBITCOIN_CLI=libbitcoin_cli.a LIBBITCOIN_UTIL=libbitcoin_util.a LIBBITCOIN_CRYPTO=crypto/libbitcoin_crypto.a LIBSECP256K1=secp256k1/libsecp256k1.la +LIBSNARK=snark/build/lib/libsnark.a LIBUNIVALUE=univalue/libunivalue.la LIBZCASH=libzcash.a -$(LIBSECP256K1): $(wildcard secp256k1/src/*) $(wildcard secp256k1/include/*) +# libsnark is added as a dependency here solely to ensure it is built early, so +# that its header files are collated for use in later build steps. +$(LIBSECP256K1): $(LIBSNARK) $(wildcard secp256k1/src/*) $(wildcard secp256k1/include/*) $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C $(@D) $(@F) +$(LIBSNARK): $(wildcard snark/src/*) + CXXFLAGS="-fPIC -DBINARY_OUTPUT -DNO_PT_COMPRESSION=1" $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C snark/ install PREFIX=$(srcdir)/build DEPINST=$(prefix) CURVE=ALT_BN128 MULTICORE=1 NO_PROCPS=1 NO_GTEST=1 NO_DOCS=1 STATIC=1 NO_SUPERCOP=1 FEATUREFLAGS=-DMONTGOMERY_OUTPUT OPTFLAGS="-O2 -march=x86-64" + $(LIBUNIVALUE): $(wildcard univalue/lib/*) $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C univalue/ @@ -394,6 +402,7 @@ zcashd_LDADD = \ $(LIBBITCOIN_UTIL) \ $(LIBBITCOIN_CRYPTO) \ $(LIBZCASH) \ + $(LIBSNARK) \ $(LIBLEVELDB) \ $(LIBMEMENV) \ $(LIBSECP256K1) @@ -413,7 +422,6 @@ zcashd_LDADD += \ $(CRYPTO_LIBS) \ $(EVENT_PTHREADS_LIBS) \ $(EVENT_LIBS) \ - $(LIBZCASH) \ $(LIBBITCOIN_CRYPTO) \ $(LIBZCASH_LIBS) @@ -439,6 +447,7 @@ zcash_cli_LDADD = \ $(CRYPTO_LIBS) \ $(EVENT_LIBS) \ $(LIBZCASH) \ + $(LIBSNARK) \ $(LIBBITCOIN_CRYPTO) \ $(LIBZCASH_LIBS) # @@ -459,6 +468,7 @@ zcash_tx_LDADD = \ $(LIBBITCOIN_UTIL) \ $(LIBSECP256K1) \ $(LIBZCASH) \ + $(LIBSNARK) \ $(LIBBITCOIN_CRYPTO) \ $(LIBZCASH_LIBS) diff --git a/src/Makefile.gtest.include b/src/Makefile.gtest.include index 9e1e590de..d92feaa20 100644 --- a/src/Makefile.gtest.include +++ b/src/Makefile.gtest.include @@ -55,7 +55,7 @@ if ENABLE_WALLET zcash_gtest_LDADD += $(LIBBITCOIN_WALLET) endif -zcash_gtest_LDADD += $(LIBZCASH_CONSENSUS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(LIBZCASH) $(LIBZCASH_LIBS) +zcash_gtest_LDADD += $(LIBZCASH_CONSENSUS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(LIBZCASH) $(LIBSNARK) $(LIBZCASH_LIBS) if ENABLE_PROTON zcash_gtest_LDADD += $(LIBBITCOIN_PROTON) $(PROTON_LIBS) diff --git a/src/Makefile.test.include b/src/Makefile.test.include index f5d4d10b7..4b85dd502 100644 --- a/src/Makefile.test.include +++ b/src/Makefile.test.include @@ -106,7 +106,7 @@ if ENABLE_WALLET test_test_bitcoin_LDADD += $(LIBBITCOIN_WALLET) endif -test_test_bitcoin_LDADD += $(LIBZCASH_CONSENSUS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(LIBZCASH) $(LIBZCASH_LIBS) +test_test_bitcoin_LDADD += $(LIBZCASH_CONSENSUS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(LIBZCASH) $(LIBSNARK) $(LIBZCASH_LIBS) test_test_bitcoin_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) -static if ENABLE_ZMQ diff --git a/src/Makefile.zcash.include b/src/Makefile.zcash.include index 7325fdcff..e5752cb2f 100644 --- a/src/Makefile.zcash.include +++ b/src/Makefile.zcash.include @@ -7,15 +7,18 @@ zcash_GenerateParams_SOURCES = zcash/GenerateParams.cpp zcash_GenerateParams_LDADD = \ $(BOOST_LIBS) \ $(LIBZCASH) \ + $(LIBSNARK) \ $(LIBBITCOIN_UTIL) \ $(LIBBITCOIN_CRYPTO) \ $(LIBZCASH_LIBS) # tool for profiling the creation of joinsplits zcash_CreateJoinSplit_SOURCES = zcash/CreateJoinSplit.cpp +zcash_CreateJoinSplit_CPPFLAGS = $(BITCOIN_INCLUDES) zcash_CreateJoinSplit_LDADD = \ $(LIBBITCOIN_COMMON) \ $(LIBZCASH) \ + $(LIBSNARK) \ $(LIBBITCOIN_UTIL) \ $(LIBBITCOIN_CRYPTO) \ $(BOOST_LIBS) \ From 24d98cece02321bee53c7db35846e9981684d8ec Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 2 Aug 2017 15:49:48 +0100 Subject: [PATCH 0175/1062] Add libsnark compile flag to not copy DEPINST to PREFIX This is useful for Zcash, where DEPINST is its depends folder, not libsnark's internal dependency folder. --- src/Makefile.am | 2 +- src/snark/Makefile | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Makefile.am b/src/Makefile.am index 1d87506fb..ab3c7bc4c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -42,7 +42,7 @@ $(LIBSECP256K1): $(LIBSNARK) $(wildcard secp256k1/src/*) $(wildcard secp256k1/in $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C $(@D) $(@F) $(LIBSNARK): $(wildcard snark/src/*) - CXXFLAGS="-fPIC -DBINARY_OUTPUT -DNO_PT_COMPRESSION=1" $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C snark/ install PREFIX=$(srcdir)/build DEPINST=$(prefix) CURVE=ALT_BN128 MULTICORE=1 NO_PROCPS=1 NO_GTEST=1 NO_DOCS=1 STATIC=1 NO_SUPERCOP=1 FEATUREFLAGS=-DMONTGOMERY_OUTPUT OPTFLAGS="-O2 -march=x86-64" + CXXFLAGS="-fPIC -DBINARY_OUTPUT -DNO_PT_COMPRESSION=1" $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C snark/ install PREFIX=$(srcdir)/build DEPINST=$(prefix) CURVE=ALT_BN128 MULTICORE=1 NO_PROCPS=1 NO_GTEST=1 NO_DOCS=1 STATIC=1 NO_SUPERCOP=1 FEATUREFLAGS=-DMONTGOMERY_OUTPUT NO_COPY_DEPINST=1 OPTFLAGS="-O2 -march=x86-64" $(LIBUNIVALUE): $(wildcard univalue/lib/*) $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C univalue/ diff --git a/src/snark/Makefile b/src/snark/Makefile index 13e54da68..fe565a906 100644 --- a/src/snark/Makefile +++ b/src/snark/Makefile @@ -253,8 +253,10 @@ $(HEADERS_DEST): $(PREFIX)/include/libsnark/%: src/% install: $(INSTALL_LIBS) $(HEADERS_DEST) $(DEPINST_EXISTS) mkdir -p $(PREFIX)/lib cp -v $(INSTALL_LIBS) $(PREFIX)/lib/ +ifneq ($(NO_COPY_DEPINST),1) cp -rv $(DEPINST)/include $(PREFIX) endif +endif doxy: doxygen doxygen.conf From 30cc2b846edfcc5f699afc3ca5cc0c0a5c755171 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 3 Aug 2017 14:36:08 +0100 Subject: [PATCH 0176/1062] Variable overrides for Arch Linux Part of #2550 --- contrib/ci-workers/templates/buildbot-worker.service.j2 | 6 +++--- contrib/ci-workers/unix.yml | 6 ++++++ contrib/ci-workers/vars/Archlinux.yml | 7 +++++++ contrib/ci-workers/vars/default.yml | 3 +++ 4 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 contrib/ci-workers/vars/Archlinux.yml diff --git a/contrib/ci-workers/templates/buildbot-worker.service.j2 b/contrib/ci-workers/templates/buildbot-worker.service.j2 index 1fee26aa3..ffe497bcf 100644 --- a/contrib/ci-workers/templates/buildbot-worker.service.j2 +++ b/contrib/ci-workers/templates/buildbot-worker.service.j2 @@ -7,9 +7,9 @@ After=network.target Type=forking PIDFile=/home/{{ buildbot_worker_user }}/{{ buildbot_worker_name }}/twistd.pid WorkingDirectory=/home/{{ buildbot_worker_user }} -ExecStart=/usr/local/bin/buildbot-worker start {{ buildbot_worker_name }} -ExecReload=/usr/local/bin/buildbot-worker restart {{ buildbot_worker_name }} -ExecStop=/usr/local/bin/buildbot-worker stop {{ buildbot_worker_name }} +ExecStart={{ pip_bin_dir }}/buildbot-worker start {{ buildbot_worker_name }} +ExecReload={{ pip_bin_dir }}/buildbot-worker restart {{ buildbot_worker_name }} +ExecStop={{ pip_bin_dir }}/buildbot-worker stop {{ buildbot_worker_name }} Restart=always User={{ buildbot_worker_user }} diff --git a/contrib/ci-workers/unix.yml b/contrib/ci-workers/unix.yml index ad78f7914..763d8fe45 100644 --- a/contrib/ci-workers/unix.yml +++ b/contrib/ci-workers/unix.yml @@ -67,6 +67,12 @@ package_deps: "{{ buildbot_deps + fetch_deps + conf_deps + build_deps + link_deps + dist_deps }}" python_modules: "{{ buildbot_modules + rpc_test_modules }}" + - name: Update rolling release [Arch Linux] + pacman: + update_cache: yes + upgrade: yes + when: ansible_distribution == 'Archlinux' + - name: Install required packages package: name: "{{ item }}" diff --git a/contrib/ci-workers/vars/Archlinux.yml b/contrib/ci-workers/vars/Archlinux.yml new file mode 100644 index 000000000..ac4a44e5b --- /dev/null +++ b/contrib/ci-workers/vars/Archlinux.yml @@ -0,0 +1,7 @@ +--- +buildbot_deps: + - python2-pip +build_deps: + - multilib/gcc + - make +pip_bin_dir: /usr/bin diff --git a/contrib/ci-workers/vars/default.yml b/contrib/ci-workers/vars/default.yml index 13a04e7b4..67da0e51d 100644 --- a/contrib/ci-workers/vars/default.yml +++ b/contrib/ci-workers/vars/default.yml @@ -39,3 +39,6 @@ buildbot_modules: rpc_test_modules: - pyblake2 - pyzmq + +# Environment variables +pip_bin_dir: /usr/local/bin From 091b2116a0268c511dc20335658e7b2f5db11846 Mon Sep 17 00:00:00 2001 From: Ross Nicoll Date: Sat, 1 Aug 2015 20:15:23 +0100 Subject: [PATCH 0177/1062] Rationalize currency unit to "BTC" Previously various user-facing strings have used inconsistent currency units "BTC", "btc" and "bitcoins". This adds a single constant and uses it for each reference to the currency unit. Also adds a description of the unit for --maxtxfee, and adds the missing "amount" field description to the (deprecated) move RPC command. --- src/amount.cpp | 4 ++- src/amount.h | 2 ++ src/init.cpp | 16 ++++++------ src/rpcblockchain.cpp | 7 ++++-- src/rpcmisc.cpp | 4 +-- src/rpcnet.cpp | 2 +- src/rpcrawtransaction.cpp | 6 ++--- src/wallet/rpcwallet.cpp | 51 ++++++++++++++++++++------------------- 8 files changed, 51 insertions(+), 41 deletions(-) diff --git a/src/amount.cpp b/src/amount.cpp index 0a394c96f..b46918198 100644 --- a/src/amount.cpp +++ b/src/amount.cpp @@ -7,6 +7,8 @@ #include "tinyformat.h" +const std::string CURRENCY_UNIT = "BTC"; + CFeeRate::CFeeRate(const CAmount& nFeePaid, size_t nSize) { if (nSize > 0) @@ -27,5 +29,5 @@ CAmount CFeeRate::GetFee(size_t nSize) const std::string CFeeRate::ToString() const { - return strprintf("%d.%08d BTC/kB", nSatoshisPerK / COIN, nSatoshisPerK % COIN); + return strprintf("%d.%08d %s/kB", nSatoshisPerK / COIN, nSatoshisPerK % COIN, CURRENCY_UNIT); } diff --git a/src/amount.h b/src/amount.h index 7dc62edac..90e6b5aa8 100644 --- a/src/amount.h +++ b/src/amount.h @@ -16,6 +16,8 @@ typedef int64_t CAmount; static const CAmount COIN = 100000000; static const CAmount CENT = 1000000; +extern const std::string CURRENCY_UNIT; + /** No amount larger than this (in satoshi) is valid. * * Note that this constant is *not* the total money supply, which in Bitcoin diff --git a/src/init.cpp b/src/init.cpp index cb91a1c1d..84f64dc07 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -402,16 +402,17 @@ std::string HelpMessage(HelpMessageMode mode) strUsage += HelpMessageOpt("-disablewallet", _("Do not load the wallet and disable wallet RPC calls")); strUsage += HelpMessageOpt("-keypool=", strprintf(_("Set key pool size to (default: %u)"), 100)); if (showDebug) - strUsage += HelpMessageOpt("-mintxfee=", strprintf("Fees (in BTC/Kb) smaller than this are considered zero fee for transaction creation (default: %s)", - FormatMoney(CWallet::minTxFee.GetFeePerK()))); - strUsage += HelpMessageOpt("-paytxfee=", strprintf(_("Fee (in BTC/kB) to add to transactions you send (default: %s)"), FormatMoney(payTxFee.GetFeePerK()))); - strUsage += HelpMessageOpt("-rescan", _("Rescan the blockchain for missing wallet transactions") + " " + _("on startup")); + strUsage += HelpMessageOpt("-mintxfee=", strprintf("Fees (in %s/kB) smaller than this are considered zero fee for transaction creation (default: %s)", + CURRENCY_UNIT, FormatMoney(CWallet::minTxFee.GetFeePerK()))); + strUsage += HelpMessageOpt("-paytxfee=", strprintf(_("Fee (in %s/kB) to add to transactions you send (default: %s)"), + CURRENCY_UNIT, FormatMoney(payTxFee.GetFeePerK()))); + strUsage += HelpMessageOpt("-rescan", _("Rescan the block chain for missing wallet transactions") + " " + _("on startup")); strUsage += HelpMessageOpt("-salvagewallet", _("Attempt to recover private keys from a corrupt wallet.dat") + " " + _("on startup")); strUsage += HelpMessageOpt("-sendfreetransactions", strprintf(_("Send transactions as zero-fee transactions if possible (default: %u)"), 0)); strUsage += HelpMessageOpt("-spendzeroconfchange", strprintf(_("Spend unconfirmed change when sending transactions (default: %u)"), 1)); strUsage += HelpMessageOpt("-txconfirmtarget=", strprintf(_("If paytxfee is not set, include enough fee so transactions begin confirmation on average within n blocks (default: %u)"), DEFAULT_TX_CONFIRM_TARGET)); - strUsage += HelpMessageOpt("-maxtxfee=", strprintf(_("Maximum total fees to use in a single wallet transaction; setting this too low may abort large transactions (default: %s)"), - FormatMoney(maxTxFee))); + strUsage += HelpMessageOpt("-maxtxfee=", strprintf(_("Maximum total fees (in %s) to use in a single wallet transaction; setting this too low may abort large transactions (default: %s)"), + CURRENCY_UNIT, FormatMoney(maxTxFee))); strUsage += HelpMessageOpt("-upgradewallet", _("Upgrade wallet to latest format") + " " + _("on startup")); strUsage += HelpMessageOpt("-wallet=", _("Specify wallet file (within data directory)") + " " + strprintf(_("(default: %s)"), "wallet.dat")); strUsage += HelpMessageOpt("-walletbroadcast", _("Make the wallet broadcast transactions") + " " + strprintf(_("(default: %u)"), true)); @@ -462,7 +463,8 @@ std::string HelpMessage(HelpMessageMode mode) strUsage += HelpMessageOpt("-relaypriority", strprintf("Require high priority for relaying free or low-fee transactions (default: %u)", 0)); strUsage += HelpMessageOpt("-maxsigcachesize=", strprintf("Limit size of signature cache to entries (default: %u)", 50000)); } - strUsage += HelpMessageOpt("-minrelaytxfee=", strprintf(_("Fees (in BTC/Kb) smaller than this are considered zero fee for relaying (default: %s)"), FormatMoney(::minRelayTxFee.GetFeePerK()))); + strUsage += HelpMessageOpt("-minrelaytxfee=", strprintf(_("Fees (in %s/kB) smaller than this are considered zero fee for relaying (default: %s)"), + CURRENCY_UNIT, FormatMoney(::minRelayTxFee.GetFeePerK()))); strUsage += HelpMessageOpt("-printtoconsole", _("Send trace/debug info to console instead of debug.log file")); if (showDebug) { diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 939430be2..6d8c911e3 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -3,6 +3,9 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. +#include "amount.h" +#include "chain.h" +#include "chainparams.h" #include "checkpoints.h" #include "consensus/validation.h" #include "main.h" @@ -260,7 +263,7 @@ UniValue getrawmempool(const UniValue& params, bool fHelp) "{ (json object)\n" " \"transactionid\" : { (json object)\n" " \"size\" : n, (numeric) transaction size in bytes\n" - " \"fee\" : n, (numeric) transaction fee in bitcoins\n" + " \"fee\" : n, (numeric) transaction fee in " + CURRENCY_UNIT + "\n" " \"time\" : n, (numeric) local time transaction entered pool in seconds since 1 Jan 1970 GMT\n" " \"height\" : n, (numeric) block height when transaction entered pool\n" " \"startingpriority\" : n, (numeric) priority when transaction entered pool\n" @@ -510,7 +513,7 @@ UniValue gettxout(const UniValue& params, bool fHelp) "{\n" " \"bestblock\" : \"hash\", (string) the block hash\n" " \"confirmations\" : n, (numeric) The number of confirmations\n" - " \"value\" : x.xxx, (numeric) The transaction value in btc\n" + " \"value\" : x.xxx, (numeric) The transaction value in " + CURRENCY_UNIT + "\n" " \"scriptPubKey\" : { (json object)\n" " \"asm\" : \"code\", (string) \n" " \"hex\" : \"hex\", (string) \n" diff --git a/src/rpcmisc.cpp b/src/rpcmisc.cpp index c12e0ccfa..9980ce1ed 100644 --- a/src/rpcmisc.cpp +++ b/src/rpcmisc.cpp @@ -61,8 +61,8 @@ UniValue getinfo(const UniValue& params, bool fHelp) " \"keypoololdest\": xxxxxx, (numeric) the timestamp (seconds since GMT epoch) of the oldest pre-generated key in the key pool\n" " \"keypoolsize\": xxxx, (numeric) how many new keys are pre-generated\n" " \"unlocked_until\": ttt, (numeric) the timestamp in seconds since epoch (midnight Jan 1 1970 GMT) that the wallet is unlocked for transfers, or 0 if the wallet is locked\n" - " \"paytxfee\": x.xxxx, (numeric) the transaction fee set in btc/kb\n" - " \"relayfee\": x.xxxx, (numeric) minimum relay fee for non-free transactions in btc/kb\n" + " \"paytxfee\": x.xxxx, (numeric) the transaction fee set in " + CURRENCY_UNIT + "/kB\n" + " \"relayfee\": x.xxxx, (numeric) minimum relay fee for non-free transactions in " + CURRENCY_UNIT + "/kB\n" " \"errors\": \"...\" (string) any error messages\n" "}\n" "\nExamples:\n" diff --git a/src/rpcnet.cpp b/src/rpcnet.cpp index b68897d16..71152a2e2 100644 --- a/src/rpcnet.cpp +++ b/src/rpcnet.cpp @@ -421,7 +421,7 @@ UniValue getnetworkinfo(const UniValue& params, bool fHelp) " }\n" " ,...\n" " ],\n" - " \"relayfee\": x.xxxxxxxx, (numeric) minimum relay fee for non-free transactions in btc/kb\n" + " \"relayfee\": x.xxxxxxxx, (numeric) minimum relay fee for non-free transactions in " + CURRENCY_UNIT + "/kB\n" " \"localaddresses\": [ (array) list of local addresses\n" " {\n" " \"address\": \"xxxx\", (string) network address\n" diff --git a/src/rpcrawtransaction.cpp b/src/rpcrawtransaction.cpp index 02fb66802..d8bd60bd4 100644 --- a/src/rpcrawtransaction.cpp +++ b/src/rpcrawtransaction.cpp @@ -204,7 +204,7 @@ UniValue getrawtransaction(const UniValue& params, bool fHelp) " ],\n" " \"vout\" : [ (array of json objects)\n" " {\n" - " \"value\" : x.xxx, (numeric) The value in btc\n" + " \"value\" : x.xxx, (numeric) The value in " + CURRENCY_UNIT + "\n" " \"n\" : n, (numeric) index\n" " \"scriptPubKey\" : { (json object)\n" " \"asm\" : \"asm\", (string) the asm\n" @@ -417,7 +417,7 @@ UniValue createrawtransaction(const UniValue& params, bool fHelp) " ]\n" "2. \"addresses\" (string, required) a json object with addresses as keys and amounts as values\n" " {\n" - " \"address\": x.xxx (numeric, required) The key is the bitcoin address, the value is the btc amount\n" + " \"address\": x.xxx (numeric, required) The key is the bitcoin address, the value is the " + CURRENCY_UNIT + " amount\n" " ,...\n" " }\n" @@ -504,7 +504,7 @@ UniValue decoderawtransaction(const UniValue& params, bool fHelp) " ],\n" " \"vout\" : [ (array of json objects)\n" " {\n" - " \"value\" : x.xxx, (numeric) The value in btc\n" + " \"value\" : x.xxx, (numeric) The value in " + CURRENCY_UNIT + "\n" " \"n\" : n, (numeric) index\n" " \"scriptPubKey\" : { (json object)\n" " \"asm\" : \"asm\", (string) the asm\n" diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 112e05d89..289235803 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -408,7 +408,7 @@ UniValue sendtoaddress(const UniValue& params, bool fHelp) + HelpRequiringPassphrase() + "\nArguments:\n" "1. \"zcashaddress\" (string, required) The zcash address to send to.\n" - "2. \"amount\" (numeric, required) The amount in btc to send. eg 0.1\n" + "2. \"amount\" (numeric, required) The amount in " + CURRENCY_UNIT + " to send. eg 0.1\n" "3. \"comment\" (string, optional) A comment used to store what the transaction is for. \n" " This is not part of the transaction, just kept in your wallet.\n" "4. \"comment-to\" (string, optional) A comment to store the name of the person or organization \n" @@ -470,7 +470,7 @@ UniValue listaddressgroupings(const UniValue& params, bool fHelp) " [\n" " [\n" " \"zcashaddress\", (string) The zcash address\n" - " amount, (numeric) The amount in btc\n" + " amount, (numeric) The amount in " + CURRENCY_UNIT + "\n" " \"account\" (string, optional) The account (DEPRECATED)\n" " ]\n" " ,...\n" @@ -574,7 +574,7 @@ UniValue getreceivedbyaddress(const UniValue& params, bool fHelp) "1. \"zcashaddress\" (string, required) The zcash address for transactions.\n" "2. minconf (numeric, optional, default=1) Only include transactions confirmed at least this many times.\n" "\nResult:\n" - "amount (numeric) The total amount in btc received at this address.\n" + "amount (numeric) The total amount in " + CURRENCY_UNIT + " received at this address.\n" "\nExamples:\n" "\nThe amount from transactions with at least 1 confirmation\n" + HelpExampleCli("getreceivedbyaddress", "\"t14oHp2v54vfmdgQ3v3SNuQga8JKHTNi2a1\"") + @@ -632,7 +632,7 @@ UniValue getreceivedbyaccount(const UniValue& params, bool fHelp) "1. \"account\" (string, required) MUST be set to the empty string \"\" to represent the default account. Passing any other string will result in an error.\n" "2. minconf (numeric, optional, default=1) Only include transactions confirmed at least this many times.\n" "\nResult:\n" - "amount (numeric) The total amount in btc received for this account.\n" + "amount (numeric) The total amount in " + CURRENCY_UNIT + " received for this account.\n" "\nExamples:\n" "\nAmount received by the default account with at least 1 confirmation\n" + HelpExampleCli("getreceivedbyaccount", "\"\"") + @@ -722,7 +722,7 @@ UniValue getbalance(const UniValue& params, bool fHelp) "2. minconf (numeric, optional, default=1) Only include transactions confirmed at least this many times.\n" "3. includeWatchonly (bool, optional, default=false) Also include balance in watchonly addresses (see 'importaddress')\n" "\nResult:\n" - "amount (numeric) The total amount in btc received for this account.\n" + "amount (numeric) The total amount in " + CURRENCY_UNIT + " received for this account.\n" "\nExamples:\n" "\nThe total amount in the wallet\n" + HelpExampleCli("getbalance", "") + @@ -808,14 +808,15 @@ UniValue movecmd(const UniValue& params, bool fHelp) "\nArguments:\n" "1. \"fromaccount\" (string, required) MUST be set to the empty string \"\" to represent the default account. Passing any other string will result in an error.\n" "2. \"toaccount\" (string, required) MUST be set to the empty string \"\" to represent the default account. Passing any other string will result in an error.\n" - "3. minconf (numeric, optional, default=1) Only use funds with at least this many confirmations.\n" - "4. \"comment\" (string, optional) An optional comment, stored in the wallet only.\n" + "3. amount (numeric) Quantity of " + CURRENCY_UNIT + " to move between accounts.\n" + "4. minconf (numeric, optional, default=1) Only use funds with at least this many confirmations.\n" + "5. \"comment\" (string, optional) An optional comment, stored in the wallet only.\n" "\nResult:\n" "true|false (boolean) true if successful.\n" "\nExamples:\n" - "\nMove 0.01 btc from the default account to the account named tabby\n" + "\nMove 0.01 " + CURRENCY_UNIT + " from the default account to the account named tabby\n" + HelpExampleCli("move", "\"\" \"tabby\" 0.01") + - "\nMove 0.01 btc timotei to akiko with a comment and funds have 6 confirmations\n" + "\nMove 0.01 " + CURRENCY_UNIT + " timotei to akiko with a comment and funds have 6 confirmations\n" + HelpExampleCli("move", "\"timotei\" \"akiko\" 0.01 6 \"happy birthday!\"") + "\nAs a json rpc call\n" + HelpExampleRpc("move", "\"timotei\", \"akiko\", 0.01, 6, \"happy birthday!\"") @@ -882,7 +883,7 @@ UniValue sendfrom(const UniValue& params, bool fHelp) "\nArguments:\n" "1. \"fromaccount\" (string, required) MUST be set to the empty string \"\" to represent the default account. Passing any other string will result in an error.\n" "2. \"tozcashaddress\" (string, required) The zcash address to send funds to.\n" - "3. amount (numeric, required) The amount in btc. (transaction fee is added on top).\n" + "3. amount (numeric, required) The amount in " + CURRENCY_UNIT + " (transaction fee is added on top).\n" "4. minconf (numeric, optional, default=1) Only use funds with at least this many confirmations.\n" "5. \"comment\" (string, optional) A comment used to store what the transaction is for. \n" " This is not part of the transaction, just kept in your wallet.\n" @@ -892,7 +893,7 @@ UniValue sendfrom(const UniValue& params, bool fHelp) "\nResult:\n" "\"transactionid\" (string) The transaction id.\n" "\nExamples:\n" - "\nSend 0.01 btc from the default account to the address, must have at least 1 confirmation\n" + "\nSend 0.01 " + CURRENCY_UNIT + " from the default account to the address, must have at least 1 confirmation\n" + HelpExampleCli("sendfrom", "\"\" \"t1M72Sfpbz1BPpXFHz9m3CdqATR44Jvaydd\" 0.01") + "\nSend 0.01 from the tabby account to the given address, funds must have at least 6 confirmations\n" + HelpExampleCli("sendfrom", "\"tabby\" \"t1M72Sfpbz1BPpXFHz9m3CdqATR44Jvaydd\" 0.01 6 \"donation\" \"seans outpost\"") + @@ -947,7 +948,7 @@ UniValue sendmany(const UniValue& params, bool fHelp) "1. \"fromaccount\" (string, required) MUST be set to the empty string \"\" to represent the default account. Passing any other string will result in an error.\n" "2. \"amounts\" (string, required) A json object with addresses and amounts\n" " {\n" - " \"address\":amount (numeric) The zcash address is the key, the numeric amount in btc is the value\n" + " \"address\":amount (numeric) The zcash address is the key, the numeric amount in " + CURRENCY_UNIT + " is the value\n" " ,...\n" " }\n" "3. minconf (numeric, optional, default=1) Only use the balance confirmed at least this many times.\n" @@ -1248,7 +1249,7 @@ UniValue listreceivedbyaddress(const UniValue& params, bool fHelp) " \"involvesWatchonly\" : true, (bool) Only returned if imported addresses were involved in transaction\n" " \"address\" : \"receivingaddress\", (string) The receiving address\n" " \"account\" : \"accountname\", (string) DEPRECATED. The account of the receiving address. The default account is \"\".\n" - " \"amount\" : x.xxx, (numeric) The total amount in btc received by the address\n" + " \"amount\" : x.xxx, (numeric) The total amount in " + CURRENCY_UNIT + " received by the address\n" " \"confirmations\" : n (numeric) The number of confirmations of the most recent transaction included\n" " }\n" " ,...\n" @@ -1422,11 +1423,11 @@ UniValue listtransactions(const UniValue& params, bool fHelp) " transaction between accounts, and not associated with an address,\n" " transaction id or block. 'send' and 'receive' transactions are \n" " associated with an address, transaction id and block details\n" - " \"amount\": x.xxx, (numeric) The amount in btc. This is negative for the 'send' category, and for the\n" + " \"amount\": x.xxx, (numeric) The amount in " + CURRENCY_UNIT + ". This is negative for the 'send' category, and for the\n" " 'move' category for moves outbound. It is positive for the 'receive' category,\n" " and for the 'move' category for inbound funds.\n" " \"vout\" : n, (numeric) the vout value\n" - " \"fee\": x.xxx, (numeric) The amount of the fee in btc. This is negative and only available for the \n" + " \"fee\": x.xxx, (numeric) The amount of the fee in " + CURRENCY_UNIT + ". This is negative and only available for the \n" " 'send' category of transactions.\n" " \"confirmations\": n, (numeric) The number of confirmations for the transaction. Available for 'send' and \n" " 'receive' category of transactions.\n" @@ -1618,10 +1619,10 @@ UniValue listsinceblock(const UniValue& params, bool fHelp) " \"account\":\"accountname\", (string) DEPRECATED. The account name associated with the transaction. Will be \"\" for the default account.\n" " \"address\":\"zcashaddress\", (string) The zcash address of the transaction. Not present for move transactions (category = move).\n" " \"category\":\"send|receive\", (string) The transaction category. 'send' has negative amounts, 'receive' has positive amounts.\n" - " \"amount\": x.xxx, (numeric) The amount in btc. This is negative for the 'send' category, and for the 'move' category for moves \n" + " \"amount\": x.xxx, (numeric) The amount in " + CURRENCY_UNIT + ". This is negative for the 'send' category, and for the 'move' category for moves \n" " outbound. It is positive for the 'receive' category, and for the 'move' category for inbound funds.\n" " \"vout\" : n, (numeric) the vout value\n" - " \"fee\": x.xxx, (numeric) The amount of the fee in btc. This is negative and only available for the 'send' category of transactions.\n" + " \"fee\": x.xxx, (numeric) The amount of the fee in " + CURRENCY_UNIT + ". This is negative and only available for the 'send' category of transactions.\n" " \"confirmations\": n, (numeric) The number of confirmations for the transaction. Available for 'send' and 'receive' category of transactions.\n" " \"blockhash\": \"hashvalue\", (string) The block hash containing the transaction. Available for 'send' and 'receive' category of transactions.\n" " \"blockindex\": n, (numeric) The block index containing the transaction. Available for 'send' and 'receive' category of transactions.\n" @@ -1704,7 +1705,7 @@ UniValue gettransaction(const UniValue& params, bool fHelp) "2. \"includeWatchonly\" (bool, optional, default=false) Whether to include watchonly addresses in balance calculation and details[]\n" "\nResult:\n" "{\n" - " \"amount\" : x.xxx, (numeric) The transaction amount in btc\n" + " \"amount\" : x.xxx, (numeric) The transaction amount in " + CURRENCY_UNIT + "\n" " \"confirmations\" : n, (numeric) The number of confirmations\n" " \"blockhash\" : \"hash\", (string) The block hash\n" " \"blockindex\" : xx, (numeric) The block index\n" @@ -1717,7 +1718,7 @@ UniValue gettransaction(const UniValue& params, bool fHelp) " \"account\" : \"accountname\", (string) DEPRECATED. The account name involved in the transaction, can be \"\" for the default account.\n" " \"address\" : \"zcashaddress\", (string) The zcash address involved in the transaction\n" " \"category\" : \"send|receive\", (string) The category, either 'send' or 'receive'\n" - " \"amount\" : x.xxx (numeric) The amount in btc\n" + " \"amount\" : x.xxx (numeric) The amount in " + CURRENCY_UNIT + "\n" " \"vout\" : n, (numeric) the vout value\n" " }\n" " ,...\n" @@ -2224,7 +2225,7 @@ UniValue settxfee(const UniValue& params, bool fHelp) "settxfee amount\n" "\nSet the transaction fee per kB.\n" "\nArguments:\n" - "1. amount (numeric, required) The transaction fee in BTC/kB rounded to the nearest 0.00000001\n" + "1. amount (numeric, required) The transaction fee in " + CURRENCY_UNIT + "/kB rounded to the nearest 0.00000001\n" "\nResult\n" "true|false (boolean) Returns true if successful\n" "\nExamples:\n" @@ -2253,14 +2254,14 @@ UniValue getwalletinfo(const UniValue& params, bool fHelp) "\nResult:\n" "{\n" " \"walletversion\": xxxxx, (numeric) the wallet version\n" - " \"balance\": xxxxxxx, (numeric) the total confirmed zcash balance of the wallet\n" - " \"unconfirmed_balance\": xxx, (numeric) the total unconfirmed zcash balance of the wallet\n" - " \"immature_balance\": xxxxxx, (numeric) the total immature balance of the wallet\n" + " \"balance\": xxxxxxx, (numeric) the total confirmed balance of the wallet in " + CURRENCY_UNIT + "\n" + " \"unconfirmed_balance\": xxx, (numeric) the total unconfirmed balance of the wallet in " + CURRENCY_UNIT + "\n" + " \"immature_balance\": xxxxxx, (numeric) the total immature balance of the wallet in " + CURRENCY_UNIT + "\n" " \"txcount\": xxxxxxx, (numeric) the total number of transactions in the wallet\n" " \"keypoololdest\": xxxxxx, (numeric) the timestamp (seconds since GMT epoch) of the oldest pre-generated key in the key pool\n" " \"keypoolsize\": xxxx, (numeric) how many new keys are pre-generated\n" " \"unlocked_until\": ttt, (numeric) the timestamp in seconds since epoch (midnight Jan 1 1970 GMT) that the wallet is unlocked for transfers, or 0 if the wallet is locked\n" - " \"paytxfee\": x.xxxx, (numeric) the transaction fee configuration, set in ZEC/KB\n" + " \"paytxfee\": x.xxxx, (numeric) the transaction fee configuration, set in " + CURRENCY_UNIT + "/kB\n" "}\n" "\nExamples:\n" + HelpExampleCli("getwalletinfo", "") @@ -2338,7 +2339,7 @@ UniValue listunspent(const UniValue& params, bool fHelp) " \"address\" : \"address\", (string) the zcash address\n" " \"account\" : \"account\", (string) DEPRECATED. The associated account, or \"\" for the default account\n" " \"scriptPubKey\" : \"key\", (string) the script key\n" - " \"amount\" : x.xxx, (numeric) the transaction amount in btc\n" + " \"amount\" : x.xxx, (numeric) the transaction amount in " + CURRENCY_UNIT + "\n" " \"confirmations\" : n (numeric) The number of confirmations\n" " }\n" " ,...\n" From 6dec2d03552b438905a0ef90949cef8ccc2c7643 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 3 Aug 2017 18:49:04 +0100 Subject: [PATCH 0178/1062] Rationalize currency unit to "ZEC" --- src/amount.cpp | 2 +- src/rpcmining.cpp | 4 ++-- src/rpcrawtransaction.cpp | 8 ++++---- src/wallet/rpcwallet.cpp | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/amount.cpp b/src/amount.cpp index b46918198..f658c4a28 100644 --- a/src/amount.cpp +++ b/src/amount.cpp @@ -7,7 +7,7 @@ #include "tinyformat.h" -const std::string CURRENCY_UNIT = "BTC"; +const std::string CURRENCY_UNIT = "ZEC"; CFeeRate::CFeeRate(const CAmount& nFeePaid, size_t nSize) { diff --git a/src/rpcmining.cpp b/src/rpcmining.cpp index e4273e42b..83ba5715d 100644 --- a/src/rpcmining.cpp +++ b/src/rpcmining.cpp @@ -883,8 +883,8 @@ UniValue getblocksubsidy(const UniValue& params, bool fHelp) "1. height (numeric, optional) The block height. If not provided, defaults to the current height of the chain.\n" "\nResult:\n" "{\n" - " \"miner\" : x.xxx (numeric) The mining reward amount in ZEC.\n" - " \"founders\" : x.xxx (numeric) The founders reward amount in ZEC.\n" + " \"miner\" : x.xxx (numeric) The mining reward amount in " + CURRENCY_UNIT + ".\n" + " \"founders\" : x.xxx (numeric) The founders reward amount in " + CURRENCY_UNIT + ".\n" "}\n" "\nExamples:\n" + HelpExampleCli("getblocksubsidy", "1000") diff --git a/src/rpcrawtransaction.cpp b/src/rpcrawtransaction.cpp index d8bd60bd4..83cb8e877 100644 --- a/src/rpcrawtransaction.cpp +++ b/src/rpcrawtransaction.cpp @@ -221,8 +221,8 @@ UniValue getrawtransaction(const UniValue& params, bool fHelp) " ],\n" " \"vjoinsplit\" : [ (array of json objects, only for version >= 2)\n" " {\n" - " \"vpub_old\" : x.xxx, (numeric) public input value in ZEC\n" - " \"vpub_new\" : x.xxx, (numeric) public output value in ZEC\n" + " \"vpub_old\" : x.xxx, (numeric) public input value in " + CURRENCY_UNIT + "\n" + " \"vpub_new\" : x.xxx, (numeric) public output value in " + CURRENCY_UNIT + "\n" " \"anchor\" : \"hex\", (string) the anchor\n" " \"nullifiers\" : [ (json array of string)\n" " \"hex\" (string) input note nullifier\n" @@ -521,8 +521,8 @@ UniValue decoderawtransaction(const UniValue& params, bool fHelp) " ],\n" " \"vjoinsplit\" : [ (array of json objects, only for version >= 2)\n" " {\n" - " \"vpub_old\" : x.xxx, (numeric) public input value in ZEC\n" - " \"vpub_new\" : x.xxx, (numeric) public output value in ZEC\n" + " \"vpub_old\" : x.xxx, (numeric) public input value in " + CURRENCY_UNIT + "\n" + " \"vpub_new\" : x.xxx, (numeric) public output value in " + CURRENCY_UNIT + "\n" " \"anchor\" : \"hex\", (string) the anchor\n" " \"nullifiers\" : [ (json array of string)\n" " \"hex\" (string) input note nullifier\n" diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 289235803..880a2f439 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -3101,7 +3101,7 @@ UniValue z_getbalance(const UniValue& params, bool fHelp) "1. \"address\" (string) The selected address. It may be a transparent or private address.\n" "2. minconf (numeric, optional, default=1) Only include transactions confirmed at least this many times.\n" "\nResult:\n" - "amount (numeric) The total amount in ZEC received for this address.\n" + "amount (numeric) The total amount in " + CURRENCY_UNIT + " received for this address.\n" "\nExamples:\n" "\nThe total amount received by address \"myaddress\"\n" + HelpExampleCli("z_getbalance", "\"myaddress\"") + @@ -3326,7 +3326,7 @@ UniValue z_sendmany(const UniValue& params, bool fHelp) "2. \"amounts\" (array, required) An array of json objects representing the amounts to send.\n" " [{\n" " \"address\":address (string, required) The address is a taddr or zaddr\n" - " \"amount\":amount (numeric, required) The numeric amount in ZEC is the value\n" + " \"amount\":amount (numeric, required) The numeric amount in " + CURRENCY_UNIT + " is the value\n" " \"memo\":memo (string, optional) If the address is a zaddr, raw data represented in hexadecimal string format\n" " }, ... ]\n" "3. minconf (numeric, optional, default=1) Only use funds confirmed at least this many times.\n" From 2e839df328b86edf7d0a1b8800a34f8612281543 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 8 Aug 2017 00:19:23 +0100 Subject: [PATCH 0179/1062] ci-workers: Fail if Python is not version 2.7 Ansible works with Python 2.6 and 2.7, but Buildbot requires 2.7. Both have at least preliminary Python 3 support, but until our RPC tests are migrated to Python 3, we need to use Python 2 for testing, and so this requirement stands. --- contrib/ci-workers/unix.yml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/contrib/ci-workers/unix.yml b/contrib/ci-workers/unix.yml index 763d8fe45..ac53ae412 100644 --- a/contrib/ci-workers/unix.yml +++ b/contrib/ci-workers/unix.yml @@ -19,7 +19,7 @@ prompt: "Buildbot worker password (provided by ZECC)" pre_tasks: - - name: Install Python 2 for Ansible and Buildbot + - name: Install Python 2.7 for Ansible and Buildbot raw: test -e /usr/bin/python || test -e /usr/bin/python2 || test -e /usr/bin/python2.7 || test -e /usr/local/bin/python2.7 || (test -e /usr/bin/apt && apt -qqy update && apt install -qqy python) || (test -e /usr/bin/dnf && dnf install -qqy python2) || (test -e /usr/sbin/pkg && pkg install -qqy python2) register: output changed_when: @@ -34,7 +34,7 @@ - name: Fail if configured Python is unavailable fail: - msg: Python is not accessible at {{ ansible_python_interpreter }} on this host! Please set the inventory variable 'ansible_python_interpreter' to the location of the Python 2 binary. + msg: "Python is not accessible at {{ ansible_python_interpreter }} on this host! Please set the inventory variable 'ansible_python_interpreter' to the location of the Python 2.7 binary." when: ansible_python_interpreter is defined and python_check.rc == 1 - name: Check if Python is in the default location @@ -45,12 +45,17 @@ - name: Fail if default Python is unavailable fail: - msg: Python is not accessible at /usr/bin/python on this host! Please set the inventory variable 'ansible_python_interpreter' to the location of the Python 2 binary. + msg: Python is not accessible at /usr/bin/python on this host! Please set the inventory variable 'ansible_python_interpreter' to the location of the Python 2.7 binary. when: ansible_python_interpreter is undefined and python_check.rc == 1 - name: Gathering Facts setup: + - name: Fail if Python is the wrong version + fail: + msg: "The Python binary at {{ ansible_python.executable }} is version {{ ansible_python_version }}! Please set the inventory variable 'ansible_python_interpreter' to the location of the Python 2.7 binary." + when: ansible_python.version.major != 2 or ansible_python.version.minor != 7 + tasks: - name: Get dependencies for distribution include_vars: "{{ item }}" From bac53a2c1d2fdb32a72fafeea8c53c0c4022152f Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 9 Aug 2017 23:41:48 +0200 Subject: [PATCH 0180/1062] ci-workers: Variable overrides and process tweaks for CentOS 7 Part of #2510 --- contrib/ci-workers/tasks/install-pip.yml | 8 ++++++++ contrib/ci-workers/unix.yml | 4 ++++ contrib/ci-workers/vars/CentOS.yml | 13 +++++++++++++ 3 files changed, 25 insertions(+) create mode 100644 contrib/ci-workers/tasks/install-pip.yml create mode 100644 contrib/ci-workers/vars/CentOS.yml diff --git a/contrib/ci-workers/tasks/install-pip.yml b/contrib/ci-workers/tasks/install-pip.yml new file mode 100644 index 000000000..8beff50ef --- /dev/null +++ b/contrib/ci-workers/tasks/install-pip.yml @@ -0,0 +1,8 @@ +--- +- name: Fetch pip installer + get_url: + url: https://bootstrap.pypa.io/get-pip.py + dest: /tmp/get-pip.py + +- name: Install pip + command: "{{ ansible_python.executable }} /tmp/get-pip.py" diff --git a/contrib/ci-workers/unix.yml b/contrib/ci-workers/unix.yml index ac53ae412..6e6cc49c4 100644 --- a/contrib/ci-workers/unix.yml +++ b/contrib/ci-workers/unix.yml @@ -84,6 +84,10 @@ state: present with_items: "{{ package_deps }}" + - name: Install pip [CentOS] + include: tasks/install-pip.yml + when: ansible_distribution == 'CentOS' + - name: Install required Python modules pip: name: "{{ item }}" diff --git a/contrib/ci-workers/vars/CentOS.yml b/contrib/ci-workers/vars/CentOS.yml new file mode 100644 index 000000000..7e09b0717 --- /dev/null +++ b/contrib/ci-workers/vars/CentOS.yml @@ -0,0 +1,13 @@ +--- +buildbot_deps: [] # Empty to remove python-pip +build_deps: + - bzip2 + - gcc + - gcc-c++ + - make + - patch +dist_deps: + - pkgconfig # Required until b556beda264308e040f8d88aca4f2f386a0183d9 is pulled in + - python-devel + - redhat-rpm-config +pip_bin_dir: /usr/bin From 251ab9b3d77f086aa15a9757c558c774791ee267 Mon Sep 17 00:00:00 2001 From: Ariel Date: Sun, 13 Aug 2017 18:22:14 +0200 Subject: [PATCH 0181/1062] add examples to z_getoperationresult --- doc/payment-api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/payment-api.md b/doc/payment-api.md index 72eef3644..6812cf6b4 100644 --- a/doc/payment-api.md +++ b/doc/payment-api.md @@ -100,7 +100,7 @@ It is currently not possible to cancel operations. Command | Parameters | Description --- | --- | --- -z_getoperationresult
| [operationids] | Return OperationStatus JSON objects for all completed operations the node is currently aware of, and then remove the operation from memory.

Operationids is an optional array to filter which operations you want to receive status objects for.

Output is a list of operation status objects, where the status is either "failed", "cancelled" or "success".
[
{“operationid”: “opid-11ee…”,
“status”: “cancelled”},
{“operationid”: “opid-9876”, “status”: ”failed”},
{“operationid”: “opid-0e0e”,
“status”:”success”,
“execution_time”:”25”,
“result”: {“txid”:”af3887654…”,...}
},
] +z_getoperationresult
| [operationids] | Return OperationStatus JSON objects for all completed operations the node is currently aware of, and then remove the operation from memory.

Operationids is an optional array to filter which operations you want to receive status objects for.

Output is a list of operation status objects, where the status is either "failed", "cancelled" or "success".
[
{“operationid”: “opid-11ee…”,
“status”: “cancelled”},
{“operationid”: “opid-9876”, “status”: ”failed”},
{“operationid”: “opid-0e0e”,
“status”:”success”,
“execution_time”:”25”,
“result”: {“txid”:”af3887654…”,...}
},
]

Examples:
zcash-cli z_getoperationresult '["opid-8120fa20-5ee7-4587-957b-f2579c2d882b"]'
zcash-cli z_getoperationresult z_getoperationstatus
| [operationids] | Return OperationStatus JSON objects for all operations the node is currently aware of.

Operationids is an optional array to filter which operations you want to receive status objects for.

Output is a list of operation status objects.
[
{“operationid”: “opid-12ee…”,
“status”: “queued”},
{“operationid”: “opd-098a…”, “status”: ”executing”},
{“operationid”: “opid-9876”, “status”: ”failed”}
]

When the operation succeeds, the status object will also include the result.

{“operationid”: “opid-0e0e”,
“status”:”success”,
“execution_time”:”25”,
“result”: {“txid”:”af3887654…”,...}
} z_listoperationids
| [state] | Return a list of operationids for all operations which the node is currently aware of.

State is an optional string parameter to filter the operations you want listed by their state. Acceptable parameter values are ‘queued’, ‘executing’, ‘success’, ‘failed’, ‘cancelled’.

[“opid-0e0e…”, “opid-1af4…”, … ] From 2fd43c599f85d9c56928ac53599a1faff61040b3 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 15 Aug 2017 09:52:36 +0100 Subject: [PATCH 0182/1062] make-release.py: Versioning changes for 1.0.11. --- README.md | 2 +- configure.ac | 2 +- contrib/gitian-descriptors/gitian-linux.yml | 2 +- src/clientversion.h | 2 +- src/deprecation.h | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index ca448c7c7..818fd4380 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Zcash 1.0.11-rc1 +Zcash 1.0.11 ============= What is Zcash? diff --git a/configure.ac b/configure.ac index 129ddcde5..a94e0dbd7 100644 --- a/configure.ac +++ b/configure.ac @@ -3,7 +3,7 @@ AC_PREREQ([2.60]) define(_CLIENT_VERSION_MAJOR, 1) define(_CLIENT_VERSION_MINOR, 0) define(_CLIENT_VERSION_REVISION, 11) -define(_CLIENT_VERSION_BUILD, 25) +define(_CLIENT_VERSION_BUILD, 50) define(_ZC_BUILD_VAL, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, m4_incr(_CLIENT_VERSION_BUILD), m4_eval(_CLIENT_VERSION_BUILD < 50), 1, m4_eval(_CLIENT_VERSION_BUILD - 24), m4_eval(_CLIENT_VERSION_BUILD == 50), 1, , m4_eval(_CLIENT_VERSION_BUILD - 50))) define(_CLIENT_VERSION_SUFFIX, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, _CLIENT_VERSION_REVISION-beta$1, m4_eval(_CLIENT_VERSION_BUILD < 50), 1, _CLIENT_VERSION_REVISION-rc$1, m4_eval(_CLIENT_VERSION_BUILD == 50), 1, _CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION-$1))) define(_CLIENT_VERSION_IS_RELEASE, true) diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml index 9851ba791..892de5287 100644 --- a/contrib/gitian-descriptors/gitian-linux.yml +++ b/contrib/gitian-descriptors/gitian-linux.yml @@ -1,5 +1,5 @@ --- -name: "zcash-1.0.11-rc1" +name: "zcash-1.0.11" enable_cache: true distro: "debian" suites: diff --git a/src/clientversion.h b/src/clientversion.h index 483264a15..61813106f 100644 --- a/src/clientversion.h +++ b/src/clientversion.h @@ -18,7 +18,7 @@ #define CLIENT_VERSION_MAJOR 1 #define CLIENT_VERSION_MINOR 0 #define CLIENT_VERSION_REVISION 11 -#define CLIENT_VERSION_BUILD 25 +#define CLIENT_VERSION_BUILD 50 //! Set to true for release, false for prerelease or test build #define CLIENT_VERSION_IS_RELEASE true diff --git a/src/deprecation.h b/src/deprecation.h index 685b21f3e..881e66196 100644 --- a/src/deprecation.h +++ b/src/deprecation.h @@ -6,7 +6,7 @@ #define ZCASH_DEPRECATION_H // Deprecation policy is 4th third-Tuesday after a release -static const int APPROX_RELEASE_HEIGHT = 159000; +static const int APPROX_RELEASE_HEIGHT = 167200; static const int WEEKS_UNTIL_DEPRECATION = 18; static const int DEPRECATION_HEIGHT = APPROX_RELEASE_HEIGHT + (WEEKS_UNTIL_DEPRECATION * 7 * 24 * 24); From d8e7bdd6cd116892d555ac4d0503b6f10bd8984e Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 15 Aug 2017 10:06:08 +0100 Subject: [PATCH 0183/1062] make-release.py: Updated manpages for 1.0.11. --- doc/man/zcash-cli.1 | 6 +++--- doc/man/zcash-tx.1 | 6 +++--- doc/man/zcashd.1 | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/doc/man/zcash-cli.1 b/doc/man/zcash-cli.1 index 3f08ec685..398f8feea 100644 --- a/doc/man/zcash-cli.1 +++ b/doc/man/zcash-cli.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASH-CLI "1" "August 2017" "zcash-cli v1.0.11-rc1" "User Commands" +.TH ZCASH-CLI "1" "August 2017" "zcash-cli v1.0.11" "User Commands" .SH NAME -zcash-cli \- manual page for zcash-cli v1.0.11-rc1 +zcash-cli \- manual page for zcash-cli v1.0.11 .SH DESCRIPTION -Zcash RPC client version v1.0.11\-rc1 +Zcash RPC client version v1.0.11 .PP In order to ensure you are adequately protecting your privacy when using Zcash, please see . diff --git a/doc/man/zcash-tx.1 b/doc/man/zcash-tx.1 index 425ec47e0..f40e4a345 100644 --- a/doc/man/zcash-tx.1 +++ b/doc/man/zcash-tx.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASH-TX "1" "August 2017" "zcash-tx v1.0.11-rc1" "User Commands" +.TH ZCASH-TX "1" "August 2017" "zcash-tx v1.0.11" "User Commands" .SH NAME -zcash-tx \- manual page for zcash-tx v1.0.11-rc1 +zcash-tx \- manual page for zcash-tx v1.0.11 .SH DESCRIPTION -Zcash zcash\-tx utility version v1.0.11\-rc1 +Zcash zcash\-tx utility version v1.0.11 .SS "Usage:" .TP zcash\-tx [options] [commands] diff --git a/doc/man/zcashd.1 b/doc/man/zcashd.1 index 10c8905a6..df1a35b14 100644 --- a/doc/man/zcashd.1 +++ b/doc/man/zcashd.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASHD "1" "August 2017" "zcashd v1.0.11-rc1" "User Commands" +.TH ZCASHD "1" "August 2017" "zcashd v1.0.11" "User Commands" .SH NAME -zcashd \- manual page for zcashd v1.0.11-rc1 +zcashd \- manual page for zcashd v1.0.11 .SH DESCRIPTION -Zcash Daemon version v1.0.11\-rc1 +Zcash Daemon version v1.0.11 .PP In order to ensure you are adequately protecting your privacy when using Zcash, please see . @@ -54,7 +54,7 @@ Specify data directory \fB\-disabledeprecation=\fR .IP Disable block\-height node deprecation and automatic shutdown (example: -\fB\-disabledeprecation\fR=\fI\,1\/\fR.0.11\-rc1) +\fB\-disabledeprecation\fR=\fI\,1\/\fR.0.11) .HP \fB\-exportdir=\fR .IP From 71629a3c0be09a5f94331291a00a19478dd0bbc4 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 15 Aug 2017 10:06:25 +0100 Subject: [PATCH 0184/1062] make-release.py: Updated release notes and changelog for 1.0.11. --- contrib/debian/changelog | 6 ++++++ doc/authors.md | 2 +- doc/release-notes/release-notes-1.0.11.md | 7 +++++++ 3 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 doc/release-notes/release-notes-1.0.11.md diff --git a/contrib/debian/changelog b/contrib/debian/changelog index 96675ed7b..1da00f690 100644 --- a/contrib/debian/changelog +++ b/contrib/debian/changelog @@ -1,3 +1,9 @@ +zcash (1.0.11) stable; urgency=medium + + * 1.0.11 release. + + -- Zcash Company Tue, 15 Aug 2017 10:06:25 +0100 + zcash (1.0.11~rc1) stable; urgency=medium * 1.0.11-rc1 release. diff --git a/doc/authors.md b/doc/authors.md index 9c62b43d0..8d3010dc6 100644 --- a/doc/authors.md +++ b/doc/authors.md @@ -1,7 +1,7 @@ Zcash Contributors ================== -Jack Grigg (443) +Jack Grigg (445) Simon Liu (269) Sean Bowe (188) Daira Hopwood (102) diff --git a/doc/release-notes/release-notes-1.0.11.md b/doc/release-notes/release-notes-1.0.11.md new file mode 100644 index 000000000..7a36c0be6 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.11.md @@ -0,0 +1,7 @@ +Changelog +========= + +Jack Grigg (2): + make-release.py: Versioning changes for 1.0.11. + make-release.py: Updated manpages for 1.0.11. + From d9d33a4b7853b9a57d8caa8b19a9d54c65e39b42 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 15 Aug 2017 13:45:06 +0100 Subject: [PATCH 0185/1062] Add build progress to the release script if progressbar module is available Install progressbar2 in your Python path to see the build progress. --- zcutil/make-release.py | 52 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/zcutil/make-release.py b/zcutil/make-release.py index 514d5883f..930970a3a 100755 --- a/zcutil/make-release.py +++ b/zcutil/make-release.py @@ -177,8 +177,27 @@ def patch_release_height(releaseheight): @phase('Building...') def build(): + base_dir = os.getcwd() + depends_dir = os.path.join(base_dir, 'depends') + src_dir = os.path.join(base_dir, 'src') nproc = sh_out('nproc').strip() - sh_log('./zcutil/build.sh', '-j', nproc) + sh_progress([ + 'Staging boost...', + 'Staging libevent...', + 'Staging zeromq...', + 'Staging libgmp...', + 'Staging libsodium...', + "Leaving directory '%s'" % depends_dir, + 'config.status: creating libzcashconsensus.pc', + "Entering directory '%s'" % src_dir, + 'httpserver.cpp', + 'torcontrol.cpp', + 'gtest/test_tautology.cpp', + 'gtest/test_metrics.cpp', + 'test/equihash_tests.cpp', + 'test/util_tests.cpp', + "Leaving directory '%s'" % src_dir, + ], './zcutil/build.sh', '-j', nproc) @phase('Generating manpages.') @@ -330,6 +349,37 @@ def sh_log(*args): raise SystemExit('Nonzero exit status: {!r}'.format(status)) +def sh_progress(markers, *args): + try: + import progressbar + except: + sh_log(*args) + return + + PIPE = subprocess.PIPE + try: + p = subprocess.Popen(args, stdout=PIPE, stderr=PIPE, stdin=None) + except OSError: + logging.error('Error launching %r...', args) + raise + + pbar = progressbar.ProgressBar(max_value=len(markers)) + marker = 0 + pbar.update(marker) + logging.debug('Run (log PID %r): %r', p.pid, args) + for line in p.stdout: + logging.debug('> %s', line.rstrip()) + for idx, val in enumerate(markers[marker:]): + if val in line: + marker += idx + 1 + pbar.update(marker) + break + pbar.finish() + status = p.wait() + if status != 0: + raise SystemExit('Nonzero exit status: {!r}'.format(status)) + + class Version (object): '''A release version.''' From d6252a9473c0ffea402c352c6a54fddf39974140 Mon Sep 17 00:00:00 2001 From: Jason Davies Date: Mon, 7 Aug 2017 20:15:57 +0100 Subject: [PATCH 0186/1062] Fix deprecation policy comment. Thanks to @daira for spotting this and suggesting the correct policy. --- src/deprecation.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/deprecation.h b/src/deprecation.h index 881e66196..78e15380e 100644 --- a/src/deprecation.h +++ b/src/deprecation.h @@ -5,7 +5,9 @@ #ifndef ZCASH_DEPRECATION_H #define ZCASH_DEPRECATION_H -// Deprecation policy is 4th third-Tuesday after a release +// Deprecation policy: +// * Shut down 18 weeks' worth of blocks after the estimated release block height. +// * A warning is shown during the 2 weeks' worth of blocks prior to shut down. static const int APPROX_RELEASE_HEIGHT = 167200; static const int WEEKS_UNTIL_DEPRECATION = 18; static const int DEPRECATION_HEIGHT = APPROX_RELEASE_HEIGHT + (WEEKS_UNTIL_DEPRECATION * 7 * 24 * 24); From 869c9f91c462bafc0678f0c745d54d4a4cce0cd9 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 30 Aug 2017 13:02:50 +0100 Subject: [PATCH 0187/1062] Add hotfix support to release script --- zcutil/make-release.py | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/zcutil/make-release.py b/zcutil/make-release.py index 514d5883f..470fd09ec 100755 --- a/zcutil/make-release.py +++ b/zcutil/make-release.py @@ -27,6 +27,7 @@ def main(args=sys.argv[1:]): opts.RELEASE_VERSION, opts.RELEASE_PREV, opts.RELEASE_HEIGHT, + opts.HOTFIX, ) except SystemExit as e: logging.error(str(e)) @@ -44,6 +45,12 @@ def parse_args(args): type=str, help='Path to repository root.', ) + p.add_argument( + '--hotfix', + action='store_true', + dest='HOTFIX', + help='Use if this is a hotfix release from a non-master branch.', + ) p.add_argument( 'RELEASE_VERSION', type=Version.parse_arg, @@ -63,9 +70,9 @@ def parse_args(args): # Top-level flow: -def main_logged(release, releaseprev, releaseheight): +def main_logged(release, releaseprev, releaseheight, hotfix): verify_releaseprev_tag(releaseprev) - initialize_git(release) + initialize_git(release, hotfix) patch_version_in_files(release, releaseprev) patch_release_height(releaseheight) commit('Versioning changes for {}.'.format(release.novtext)) @@ -124,16 +131,20 @@ def verify_releaseprev_tag(releaseprev): @phase('Initializing git.') -def initialize_git(release): +def initialize_git(release, hotfix): junk = sh_out('git', 'status', '--porcelain') if junk.strip(): raise SystemExit('There are uncommitted changes:\n' + junk) branch = sh_out('git', 'rev-parse', '--abbrev-ref', 'HEAD').strip() - if branch != 'master': + if hotfix: + expected = 'hotfix-' + release.vtext + else: + expected = 'master' + if branch != expected: raise SystemExit( - "Expected branch 'master', found branch {!r}".format( - branch, + "Expected branch {!r}, found branch {!r}".format( + expected, branch, ), ) From df3005f9555bc808dc85102a6c612473fd601057 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 30 Aug 2017 14:19:09 +0100 Subject: [PATCH 0188/1062] Document the hotfix release process --- doc/hotfix-process.md | 57 ++++++++++++++++++++++++++++++++++++++++++ doc/release-process.md | 7 ++++++ 2 files changed, 64 insertions(+) create mode 100644 doc/hotfix-process.md diff --git a/doc/hotfix-process.md b/doc/hotfix-process.md new file mode 100644 index 000000000..9328b1f9d --- /dev/null +++ b/doc/hotfix-process.md @@ -0,0 +1,57 @@ +Hotfix Release Process +====================== + +In the commands below, and are prefixed with a v, ie. +v1.0.11 (not 1.0.11). + +## Create a hotfix branch + +Create a hotfix branch from the previous release tag, and push it to the main +repository: + + $ git branch hotfix- + $ git push 'git@github.com:zcash/zcash' hotfix- + +## Merge hotfix PRs + +Developer should create hotfix PRs based on the hotfix branch. Each PR should be +reviewed as normal, and then the following process should be used to merge: + +- A CI merge build is manually run, by force-triggering the pr-merge builder + with the following fields set: + + - Repository: https://github.com//zcash + - must be in the set of "safe" users as-specified in the CI + config. + - Branch: name of the hotfix PR branch (not the hotfix release branch). + +- A link to the build and its result is manually added to the PR as a comment. + +- If the build was successful, the PR is merged via the GitHub button. + +## Release process + +The majority of this process is identical to the standard release process. +However, there are a few notable differences: + +- When running the release script, use the `--hotfix` flag: + + $ ./zcutil/make-release.py --hotfix + +- To review the automated changes in git: + + $ git log hotfix-..HEAD + +- After the standard review process, use the hotfix merge process outlined above + instead of the regular merge process. + +- When making the tag, check out the hotfix branch instead of master. + +## Post-release + +Once the hotfix release has been created, a new PR should be opened for merging +the hotfix release branch into master. This may require fixing merge conflicts +(e.g. changing the version number in the hotfix branch to match master, if +master is ahead). Such conflicts **MUST** be addressed with additional commits +to the hotfix branch; specifically, the branch **MUST NOT** be rebased on +master. diff --git a/doc/release-process.md b/doc/release-process.md index d6090dfcd..bc19c5eb1 100644 --- a/doc/release-process.md +++ b/doc/release-process.md @@ -2,6 +2,8 @@ Release Process ==================== Meta: There should always be a single release engineer to disambiguate responsibility. +If this is a hotfix release, please see `./hotfix-process.md` before proceeding. + ## Pre-release ### Github Milestone @@ -40,6 +42,11 @@ whole engineering team. ## Release process +In the commands below, and are prefixed with a v, ie. +v1.0.9 (not 1.0.9). + +### Create the release branch + Run the release script, which will verify you are on the latest clean checkout of master, create a branch, then commit standard automated changes to that branch locally: From 24bfc7c6c6ba05153536b5345e7b0f35e19deb6c Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 31 Aug 2017 02:05:07 +0100 Subject: [PATCH 0189/1062] Enforce sequential hotfix versioning --- doc/hotfix-process.md | 6 ++++++ zcutil/make-release.py | 21 +++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/doc/hotfix-process.md b/doc/hotfix-process.md index 9328b1f9d..15c88bbba 100644 --- a/doc/hotfix-process.md +++ b/doc/hotfix-process.md @@ -1,6 +1,12 @@ Hotfix Release Process ====================== +Hotfix releases are versioned by incrementing the build number of the latest +release. For example: + + First hotfix: v1.0.11 -> v1.0.11-1 + Second hotfix: v1.0.11-1 -> v1.0.11-2 + In the commands below, and are prefixed with a v, ie. v1.0.11 (not 1.0.11). diff --git a/zcutil/make-release.py b/zcutil/make-release.py index 470fd09ec..991fde051 100755 --- a/zcutil/make-release.py +++ b/zcutil/make-release.py @@ -72,6 +72,7 @@ def parse_args(args): # Top-level flow: def main_logged(release, releaseprev, releaseheight, hotfix): verify_releaseprev_tag(releaseprev) + verify_version(release, releaseprev, hotfix) initialize_git(release, hotfix) patch_version_in_files(release, releaseprev) patch_release_height(releaseheight) @@ -130,6 +131,26 @@ def verify_releaseprev_tag(releaseprev): ) +@phase('Checking version.') +def verify_version(release, releaseprev, hotfix): + if not hotfix: + return + + expected = Version( + releaseprev.major, + releaseprev.minor, + releaseprev.patch, + releaseprev.betarc, + releaseprev.hotfix + 1 if releaseprev.hotfix else 1, + ) + if release != expected: + raise SystemExit( + "Expected {!r}, given {!r}".format( + expected, release, + ), + ) + + @phase('Initializing git.') def initialize_git(release, hotfix): junk = sh_out('git', 'status', '--porcelain') From a76174b76b80baed21390e39796fb800fed52ae9 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 17 Aug 2017 10:31:47 +0100 Subject: [PATCH 0190/1062] Benchmark time to call sendtoaddress with many UTXOs --- qa/zcash/create_wallet_200k_utxos.py | 62 +++++++++++++++++++++ qa/zcash/performance-measurements.sh | 82 +++++++++++++++++++++++++--- src/wallet/rpcwallet.cpp | 6 ++ src/zcbenchmarks.cpp | 15 +++++ src/zcbenchmarks.h | 1 + 5 files changed, 157 insertions(+), 9 deletions(-) create mode 100755 qa/zcash/create_wallet_200k_utxos.py diff --git a/qa/zcash/create_wallet_200k_utxos.py b/qa/zcash/create_wallet_200k_utxos.py new file mode 100755 index 000000000..870a4a90b --- /dev/null +++ b/qa/zcash/create_wallet_200k_utxos.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python2 +# Copyright (c) 2017 The Zcash developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +# +# Create a large wallet +# +# To use: +# - Copy to qa/rpc-tests/wallet_large.py +# - Add wallet_large.py to RPC tests list +# - ./qa/pull-tester/rpc-tests.sh wallet_large --noshutdown +# - Archive the resulting /tmp/test###### directory +# + +from test_framework.test_framework import BitcoinTestFramework +from test_framework.util import ( + assert_equal, + connect_nodes_bi, + initialize_chain_clean, + start_nodes, +) + +from decimal import Decimal + + +class LargeWalletTest(BitcoinTestFramework): + + def setup_chain(self): + print("Initializing test directory "+self.options.tmpdir) + initialize_chain_clean(self.options.tmpdir, 2) + + def setup_network(self): + self.nodes = start_nodes(2, self.options.tmpdir) + connect_nodes_bi(self.nodes, 0, 1) + self.is_network_split = False + self.sync_all() + + def run_test(self): + self.nodes[1].generate(103) + self.sync_all() + + inputs = [] + for i in range(200000): + taddr = self.nodes[0].getnewaddress() + inputs.append(self.nodes[1].sendtoaddress(taddr, Decimal("0.001"))) + if i % 1000 == 0: + self.nodes[1].generate(1) + self.sync_all() + + assert_equal(set(self.nodes[1].getrawmempool()), set(inputs)) + print(self.nodes[1].getmempoolinfo()) + self.nodes[1].generate(1) + print(self.nodes[1].getmempoolinfo()) + self.sync_all() + print('Node 0: %d transactions, %d UTXOs' % + (len(self.nodes[0].listtransactions()), len(self.nodes[0].listunspent()))) + print('Node 1: %d transactions, %d UTXOs' % + (len(self.nodes[1].listtransactions()), len(self.nodes[1].listunspent()))) + +if __name__ == '__main__': + LargeWalletTest().main() diff --git a/qa/zcash/performance-measurements.sh b/qa/zcash/performance-measurements.sh index e1eb242be..d6cc504d1 100755 --- a/qa/zcash/performance-measurements.sh +++ b/qa/zcash/performance-measurements.sh @@ -28,10 +28,52 @@ function zcashd_generate { zcash_rpc generate 101 > /dev/null } +function extract_benchmark_datadir { + if [ -f "$1.tar.xz" ]; then + # Check the hash of the archive: + "$SHA256CMD" $SHA256ARGS -c < Date: Wed, 6 Sep 2017 19:52:35 +0100 Subject: [PATCH 0191/1062] Fix bug in benchmark data generation script --- qa/zcash/create_wallet_200k_utxos.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/qa/zcash/create_wallet_200k_utxos.py b/qa/zcash/create_wallet_200k_utxos.py index 870a4a90b..c4ac3e2e4 100755 --- a/qa/zcash/create_wallet_200k_utxos.py +++ b/qa/zcash/create_wallet_200k_utxos.py @@ -48,15 +48,13 @@ class LargeWalletTest(BitcoinTestFramework): self.nodes[1].generate(1) self.sync_all() - assert_equal(set(self.nodes[1].getrawmempool()), set(inputs)) - print(self.nodes[1].getmempoolinfo()) self.nodes[1].generate(1) - print(self.nodes[1].getmempoolinfo()) self.sync_all() print('Node 0: %d transactions, %d UTXOs' % (len(self.nodes[0].listtransactions()), len(self.nodes[0].listunspent()))) print('Node 1: %d transactions, %d UTXOs' % (len(self.nodes[1].listtransactions()), len(self.nodes[1].listunspent()))) + assert_equal(len(self.nodes[0].listunspent()), len(inputs)) if __name__ == '__main__': LargeWalletTest().main() From e719bf75d4a0858b2e435eae9e6d2ccc7faf7780 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Mon, 11 Sep 2017 21:53:35 +0100 Subject: [PATCH 0192/1062] Adjust instructions for UTXO dataset creation --nocleanup is sufficient to leave the data directories behind. --noshutdown is only useful if you want to inspect the nodes afterwards, and you'd need to manually shut down both nodes before copying the data directories. --- qa/zcash/create_wallet_200k_utxos.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qa/zcash/create_wallet_200k_utxos.py b/qa/zcash/create_wallet_200k_utxos.py index c4ac3e2e4..d4a1d9d48 100755 --- a/qa/zcash/create_wallet_200k_utxos.py +++ b/qa/zcash/create_wallet_200k_utxos.py @@ -9,7 +9,7 @@ # To use: # - Copy to qa/rpc-tests/wallet_large.py # - Add wallet_large.py to RPC tests list -# - ./qa/pull-tester/rpc-tests.sh wallet_large --noshutdown +# - ./qa/pull-tester/rpc-tests.sh wallet_large --nocleanup # - Archive the resulting /tmp/test###### directory # From 99b7cfb3a2231c21abb1219ea255f39da0798e08 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 12 Sep 2017 12:05:02 +0100 Subject: [PATCH 0193/1062] Add GitHub release notes to release process Closes #2262. --- doc/release-process.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/doc/release-process.md b/doc/release-process.md index d6090dfcd..969f5a296 100644 --- a/doc/release-process.md +++ b/doc/release-process.md @@ -91,6 +91,22 @@ signed. **CAUTION:** Remember the `v` at the beginning here: - If all is well, the DevOps engineer will build the Debian packages and update the [apt.z.cash package repository](https://apt.z.cash). +## Add release notes to GitHub + +- Go to the [GitHub tags page](https://github.com/zcash/zcash/tags). +- Click "Add release notes" beside the tag for this release. +- Copy the release blog post into the release description, and edit to suit + publication on GitHub. See previous release notes for examples. +- Click "Publish release" if publishing the release blog post now, or + "Save draft" to store the notes internally (and then return later to publish + once the blog post is up). + +Note that some GitHub releases are marked as "Verified", and others as +"Unverified". This is related to the GPG signature on the release tag - in +particular, GitHub needs the corresponding public key to be uploaded to a +corresponding GitHub account. If this release is marked as "Unverified", click +the marking to see what GitHub wants to be done. + ## Post Release Task List ### Deploy testnet @@ -106,6 +122,6 @@ Then, verify that nodes can connect to the testnet server, and update the guide ### Update the 1.0 User Guide -### Publish the release announcement (blog, zcash-dev, slack) +### Publish the release announcement (blog, github, zcash-dev, slack) ## Celebrate From de3e1434618d7a22c38ab0b8a6158744c96c7579 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 15 Sep 2017 10:51:21 +0100 Subject: [PATCH 0194/1062] Clarify branching and force-building operations in hotfix process --- doc/hotfix-process.md | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/doc/hotfix-process.md b/doc/hotfix-process.md index 15c88bbba..e6ce8a7a2 100644 --- a/doc/hotfix-process.md +++ b/doc/hotfix-process.md @@ -18,13 +18,24 @@ repository: $ git branch hotfix- $ git push 'git@github.com:zcash/zcash' hotfix- +## Implement hotfix changes + +Hotfix changes are implemented the same way as regular changes (developers work +in separate branches per change, and push the branches to their own repositories), +except that the branches are based on the hotfix branch instead of master: + + $ git checkout hotfix- + $ git checkout -b + ## Merge hotfix PRs -Developer should create hotfix PRs based on the hotfix branch. Each PR should be -reviewed as normal, and then the following process should be used to merge: +Hotfix PRs are created like regular PRs, except using the hotfix branch as the +base instead of master. Each PR should be reviewed as normal, and then the +following process should be used to merge: -- A CI merge build is manually run, by force-triggering the pr-merge builder - with the following fields set: +- A CI merge build is manually run by logging into the CI server, going to the + pr-merge builder, clicking the "force" button, and entering the following + values: - Repository: https://github.com//zcash - must be in the set of "safe" users as-specified in the CI From d29b6b042f42045f259c9613c4a3b34abd7bbe41 Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Mon, 18 Sep 2017 14:56:37 +0900 Subject: [PATCH 0195/1062] key_import_export rpc-test: verify that UTXO view co-evolves for nodes sharing a key. --- qa/pull-tester/rpc-tests.sh | 1 + qa/rpc-tests/key_import_export.py | 111 ++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100755 qa/rpc-tests/key_import_export.py diff --git a/qa/pull-tester/rpc-tests.sh b/qa/pull-tester/rpc-tests.sh index bd3357642..1483ead83 100755 --- a/qa/pull-tester/rpc-tests.sh +++ b/qa/pull-tester/rpc-tests.sh @@ -34,6 +34,7 @@ testScripts=( 'fundrawtransaction.py' 'signrawtransactions.py' 'walletbackup.py' + 'key_import_export.py' 'nodehandling.py' 'reindex.py' 'decodescript.py' diff --git a/qa/rpc-tests/key_import_export.py b/qa/rpc-tests/key_import_export.py new file mode 100755 index 000000000..a80babd5f --- /dev/null +++ b/qa/rpc-tests/key_import_export.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python2 +# Copyright (c) 2017 The Zcash developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +from time import sleep +from decimal import Decimal +from test_framework.test_framework import BitcoinTestFramework +from test_framework.util import assert_equal, assert_greater_than, sync_blocks + +import logging + +logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.INFO) + + +class KeyImportExportTest (BitcoinTestFramework): + + def run_test(self): + [alice, bob, charlie, miner] = self.nodes + + def wait_until_miner_sees(txid): + attempts = 123 + delay = 0.5 + + for _ in range(attempts): + try: + miner.getrawtransaction(txid) + except Exception: + logging.debug( + 'txid %r not yet seen by miner; sleep %r', + txid, + delay, + ) + sleep(delay) + else: + return + + raise Exception( + 'miner failed to see txid {!r} after {!r} attempts...'.format( + txid, + attempts, + ), + ) + + def alice_to_bob(amount): + txid = alice.sendtoaddress(addr, Decimal(amount)) + wait_until_miner_sees(txid) + miner.generate(1) + sync_blocks(self.nodes) + + def verify_utxos(node, amounts): + utxos = node.listunspent(1, 10**9, [addr]) + + def cmp_confirmations_high_to_low(a, b): + return cmp(b["confirmations"], a["confirmations"]) + + utxos.sort(cmp_confirmations_high_to_low) + + try: + assert_equal(amounts, [utxo["amount"] for utxo in utxos]) + except AssertionError: + logging.error( + 'Expected amounts: %r; utxos: %r', + amounts, utxos) + raise + + # The first address already mutated by the startup process, ignore it: + # BUG: Why is this necessary? + bob.getnewaddress() + + # Now get a pristine address for receiving transfers: + addr = bob.getnewaddress() + verify_utxos(bob, []) + + # the amounts of each txn embodied which generates a single UTXO: + amounts = map(Decimal, ['2.3', '3.7', '0.1', '0.5', '1.0', '0.19']) + + # Internal test consistency assertion: + assert_greater_than( + alice.getbalance(), + reduce(Decimal.__add__, amounts)) + + logging.info("Sending pre-export txns...") + for amount in amounts[0:2]: + alice_to_bob(amount) + + logging.info("Exporting privkey from bob...") + privkey = bob.dumpprivkey(addr) + + logging.info("Sending post-export txns...") + for amount in amounts[2:4]: + alice_to_bob(amount) + + verify_utxos(bob, amounts[:4]) + + logging.info("Importing privkey into charlie...") + charlie.importprivkey(privkey, '', True) + + # importprivkey should have rescanned, so this should pass: + verify_utxos(charlie, amounts[:4]) + + logging.info("Sending post-import txns...") + for amount in amounts[4:]: + alice_to_bob(amount) + + verify_utxos(bob, amounts) + verify_utxos(charlie, amounts) + + +if __name__ == '__main__': + KeyImportExportTest().main() From 63cdea423354c9bf769a5eb51c5c3b9f5905e8a4 Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Mon, 18 Sep 2017 15:19:24 +0900 Subject: [PATCH 0196/1062] Add a new rpc-test-specified requirement: `importprivkey` outputs the associated address. (Test fails.) --- qa/rpc-tests/key_import_export.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/qa/rpc-tests/key_import_export.py b/qa/rpc-tests/key_import_export.py index a80babd5f..00129914a 100755 --- a/qa/rpc-tests/key_import_export.py +++ b/qa/rpc-tests/key_import_export.py @@ -94,7 +94,8 @@ class KeyImportExportTest (BitcoinTestFramework): verify_utxos(bob, amounts[:4]) logging.info("Importing privkey into charlie...") - charlie.importprivkey(privkey, '', True) + ipkaddr = charlie.importprivkey(privkey, '', True) + assert_equal(addr, ipkaddr) # importprivkey should have rescanned, so this should pass: verify_utxos(charlie, amounts[:4]) From d187317083fedbac06c12decfa6a99655c200f86 Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Mon, 18 Sep 2017 15:24:30 +0900 Subject: [PATCH 0197/1062] [tests pass] Output address on new key import. --- src/wallet/rpcdump.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wallet/rpcdump.cpp b/src/wallet/rpcdump.cpp index 936532837..578c0e1fe 100644 --- a/src/wallet/rpcdump.cpp +++ b/src/wallet/rpcdump.cpp @@ -144,7 +144,7 @@ UniValue importprivkey(const UniValue& params, bool fHelp) } } - return NullUniValue; + return CBitcoinAddress(vchAddress).ToString(); } UniValue importaddress(const UniValue& params, bool fHelp) From 3e92c028ce5cfe5cfbdb9ac067e2055020aeebca Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Mon, 18 Sep 2017 15:27:22 +0900 Subject: [PATCH 0198/1062] Add a new requirement that `importprivkey` API is idempotent. --- qa/rpc-tests/key_import_export.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/qa/rpc-tests/key_import_export.py b/qa/rpc-tests/key_import_export.py index 00129914a..debade1a3 100755 --- a/qa/rpc-tests/key_import_export.py +++ b/qa/rpc-tests/key_import_export.py @@ -97,6 +97,10 @@ class KeyImportExportTest (BitcoinTestFramework): ipkaddr = charlie.importprivkey(privkey, '', True) assert_equal(addr, ipkaddr) + # Verify idempotent behavior: + ipkaddr2 = charlie.importprivkey(privkey, '', True) + assert_equal(addr, ipkaddr2) + # importprivkey should have rescanned, so this should pass: verify_utxos(charlie, amounts[:4]) From de422c066b70e6f54994c123b56d1bb3bdcc2733 Mon Sep 17 00:00:00 2001 From: Nathan Wilcox Date: Mon, 18 Sep 2017 15:29:10 +0900 Subject: [PATCH 0199/1062] [tests pass] Ensure `importprivkey` outputs the address in case key is already imported. --- src/wallet/rpcdump.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/wallet/rpcdump.cpp b/src/wallet/rpcdump.cpp index 578c0e1fe..fe5b83e8d 100644 --- a/src/wallet/rpcdump.cpp +++ b/src/wallet/rpcdump.cpp @@ -128,8 +128,9 @@ UniValue importprivkey(const UniValue& params, bool fHelp) pwalletMain->SetAddressBook(vchAddress, strLabel, "receive"); // Don't throw error in case a key is already there - if (pwalletMain->HaveKey(vchAddress)) - return NullUniValue; + if (pwalletMain->HaveKey(vchAddress)) { + return CBitcoinAddress(vchAddress).ToString(); + } pwalletMain->mapKeyMetadata[vchAddress].nCreateTime = 1; From 200ef169506cb6bebb6772075669db508649f5ac Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Mon, 18 Sep 2017 08:34:34 +0100 Subject: [PATCH 0200/1062] Update user guide translations as part of release process Part of #2596. --- doc/release-process.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/release-process.md b/doc/release-process.md index 969f5a296..c79314e22 100644 --- a/doc/release-process.md +++ b/doc/release-process.md @@ -122,6 +122,10 @@ Then, verify that nodes can connect to the testnet server, and update the guide ### Update the 1.0 User Guide +This also means updating [the translations](https://github.com/zcash/zcash-docs). +Coordinate with the translation team for now. Suggestions for improving this +part of the process should be added to #2596. + ### Publish the release announcement (blog, github, zcash-dev, slack) ## Celebrate From fd5724eca7edae6a67b7c096653ba5e996874ea8 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Mon, 18 Sep 2017 10:45:03 +0100 Subject: [PATCH 0201/1062] make-release.py: Send stderr to stdout --- zcutil/make-release.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/zcutil/make-release.py b/zcutil/make-release.py index 930970a3a..3e9741aab 100755 --- a/zcutil/make-release.py +++ b/zcutil/make-release.py @@ -335,8 +335,9 @@ def sh_out(*args): def sh_log(*args): PIPE = subprocess.PIPE + STDOUT = subprocess.STDOUT try: - p = subprocess.Popen(args, stdout=PIPE, stderr=PIPE, stdin=None) + p = subprocess.Popen(args, stdout=PIPE, stderr=STDOUT, stdin=None) except OSError: logging.error('Error launching %r...', args) raise @@ -357,8 +358,9 @@ def sh_progress(markers, *args): return PIPE = subprocess.PIPE + STDOUT = subprocess.STDOUT try: - p = subprocess.Popen(args, stdout=PIPE, stderr=PIPE, stdin=None) + p = subprocess.Popen(args, stdout=PIPE, stderr=STDOUT, stdin=None) except OSError: logging.error('Error launching %r...', args) raise From 2e8aefdce16edaff8cd8cdaa2975bbc31f9007b9 Mon Sep 17 00:00:00 2001 From: Ariel Gabizon Date: Mon, 18 Sep 2017 21:54:53 +0200 Subject: [PATCH 0202/1062] add load-wallet benchmark --- qa/zcash/performance-measurements.sh | 7 +++-- src/wallet/rpcwallet.cpp | 5 ++++ src/zcbenchmarks.cpp | 45 ++++++++++++++++++++++++++++ src/zcbenchmarks.h | 1 + 4 files changed, 56 insertions(+), 2 deletions(-) diff --git a/qa/zcash/performance-measurements.sh b/qa/zcash/performance-measurements.sh index d6cc504d1..08d2ab9a5 100755 --- a/qa/zcash/performance-measurements.sh +++ b/qa/zcash/performance-measurements.sh @@ -56,7 +56,7 @@ function use_200k_benchmark { function zcashd_start { case "$1" in - sendtoaddress) + sendtoaddress|loadwallet) case "$2" in 200k-recv) use_200k_benchmark 0 @@ -86,7 +86,7 @@ function zcashd_stop { function zcashd_massif_start { case "$1" in - sendtoaddress) + sendtoaddress|loadwallet) case "$2" in 200k-recv) use_200k_benchmark 0 @@ -203,6 +203,9 @@ case "$1" in sendtoaddress) zcash_rpc zcbenchmark sendtoaddress 10 "${@:4}" ;; + loadwallet) + zcash_rpc zcbenchmark loadwallet 10 + ;; *) zcashd_stop echo "Bad arguments." diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 995b6b99c..f156f1983 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -2602,6 +2602,11 @@ UniValue zc_benchmark(const UniValue& params, bool fHelp) } auto amount = AmountFromValue(params[2]); sample_times.push_back(benchmark_sendtoaddress(amount)); + } else if (benchmarktype == "loadwallet") { + if (Params().NetworkIDString() != "regtest") { + throw JSONRPCError(RPC_TYPE_ERROR, "Benchmark must be run in regtest mode"); + } + sample_times.push_back(benchmark_loadwallet()); } else { throw JSONRPCError(RPC_TYPE_ERROR, "Invalid benchmarktype"); } diff --git a/src/zcbenchmarks.cpp b/src/zcbenchmarks.cpp index e366d8aa4..5c20a67e3 100644 --- a/src/zcbenchmarks.cpp +++ b/src/zcbenchmarks.cpp @@ -31,6 +31,39 @@ #include "zcash/IncrementalMerkleTree.hpp" using namespace libzcash; +// This method is based on Shutdown from init.cpp +void pre_wallet_load() +{ + LogPrintf("%s: In progress...\n", __func__); + if (ShutdownRequested()) + throw new std::runtime_error("The node is shutting down"); + + if (pwalletMain) + pwalletMain->Flush(false); +#ifdef ENABLE_MINING + GenerateBitcoins(false, NULL, 0); +#endif + UnregisterNodeSignals(GetNodeSignals()); + if (pwalletMain) + pwalletMain->Flush(true); + + UnregisterValidationInterface(pwalletMain); + delete pwalletMain; + pwalletMain = NULL; + bitdb.Reset(); + RegisterNodeSignals(GetNodeSignals()); + LogPrintf("%s: done\n", __func__); +} + +void post_wallet_load(){ + RegisterValidationInterface(pwalletMain); +#ifdef ENABLE_MINING + // Generate coins in the background + if (pwalletMain || !GetArg("-mineraddress", "").empty()) + GenerateBitcoins(GetBoolArg("-gen", false), pwalletMain, GetArg("-genproclimit", 1)); +#endif +} + void timer_start(timeval &tv_start) { @@ -420,3 +453,15 @@ double benchmark_sendtoaddress(CAmount amount) return timer_stop(tv_start); } +double benchmark_loadwallet() +{ + pre_wallet_load(); + struct timeval tv_start; + bool fFirstRunRet=true; + timer_start(tv_start); + pwalletMain = new CWallet("wallet.dat"); + DBErrors nLoadWalletRet = pwalletMain->LoadWallet(fFirstRunRet); + auto res = timer_stop(tv_start); + post_wallet_load(); + return res; +} diff --git a/src/zcbenchmarks.h b/src/zcbenchmarks.h index e1d3bbab2..a2672daa0 100644 --- a/src/zcbenchmarks.h +++ b/src/zcbenchmarks.h @@ -17,5 +17,6 @@ extern double benchmark_try_decrypt_notes(size_t nAddrs); extern double benchmark_increment_note_witnesses(size_t nTxs); extern double benchmark_connectblock_slow(); extern double benchmark_sendtoaddress(CAmount amount); +extern double benchmark_loadwallet(); #endif From 53e1e64d44140d995f585de10b353a962f4303ea Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 19 Sep 2017 22:32:59 +0100 Subject: [PATCH 0203/1062] List dependencies for release script in release process doc --- doc/release-process.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/doc/release-process.md b/doc/release-process.md index d6090dfcd..59954cec6 100644 --- a/doc/release-process.md +++ b/doc/release-process.md @@ -38,6 +38,16 @@ process. If these were not anticipated correctly, this could block the release, so if you suspect this is necessary, double check with the whole engineering team. +## Release dependencies + +The release script has the following dependencies: + +- `help2man` +- `debchange` (part of the devscripts Debian package) + +You can optionally install the `progressbar2` Python module with pip to have a +progress bar displayed during the build process. + ## Release process Run the release script, which will verify you are on the latest clean From b17e1b408023bb1f1050112152f1ec8d8795ad90 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 19 Sep 2017 19:05:35 -0700 Subject: [PATCH 0204/1062] Closes #2583. Exclude watch-only utxos from z_sendmany coin selection. --- qa/rpc-tests/wallet_protectcoinbase.py | 27 +++++++++++++++++++++-- src/wallet/asyncrpcoperation_sendmany.cpp | 4 ++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/qa/rpc-tests/wallet_protectcoinbase.py b/qa/rpc-tests/wallet_protectcoinbase.py index 6dd023c55..bebe8b9b5 100755 --- a/qa/rpc-tests/wallet_protectcoinbase.py +++ b/qa/rpc-tests/wallet_protectcoinbase.py @@ -7,7 +7,7 @@ from test_framework.test_framework import BitcoinTestFramework from test_framework.authproxy import JSONRPCException from test_framework.util import assert_equal, initialize_chain_clean, \ - start_nodes, connect_nodes_bi + start_nodes, connect_nodes_bi, stop_node import sys import time @@ -21,10 +21,11 @@ class WalletProtectCoinbaseTest (BitcoinTestFramework): # Start nodes with -regtestprotectcoinbase to set fCoinbaseMustBeProtected to true. def setup_network(self, split=False): - self.nodes = start_nodes(3, self.options.tmpdir, extra_args=[['-regtestprotectcoinbase', '-debug=zrpcunsafe']] * 3 ) + self.nodes = start_nodes(4, self.options.tmpdir, extra_args=[['-regtestprotectcoinbase', '-debug=zrpcunsafe']] * 4 ) connect_nodes_bi(self.nodes,0,1) connect_nodes_bi(self.nodes,1,2) connect_nodes_bi(self.nodes,0,2) + connect_nodes_bi(self.nodes,0,3) self.is_network_split=False self.sync_all() @@ -72,6 +73,7 @@ class WalletProtectCoinbaseTest (BitcoinTestFramework): assert_equal(self.nodes[0].getbalance(), 40) assert_equal(self.nodes[1].getbalance(), 10) assert_equal(self.nodes[2].getbalance(), 0) + assert_equal(self.nodes[3].getbalance(), 0) # Send will fail because we are enforcing the consensus rule that # coinbase utxos can only be sent to a zaddr. @@ -86,6 +88,27 @@ class WalletProtectCoinbaseTest (BitcoinTestFramework): mytaddr = self.nodes[0].getnewaddress() myzaddr = self.nodes[0].z_getnewaddress() + # Node 3 will test that watch only address utxos are not selected + self.nodes[3].importaddress(mytaddr) + recipients= [{"address":myzaddr, "amount": Decimal('1')}] + myopid = self.nodes[3].z_sendmany(mytaddr, recipients) + errorString="" + status = None + opids = [myopid] + timeout = 10 + for x in xrange(1, timeout): + results = self.nodes[3].z_getoperationresult(opids) + if len(results)==0: + time.sleep(1) + else: + status = results[0]["status"] + errorString = results[0]["error"]["message"] + break + assert_equal("failed", status) + assert_equal("no UTXOs found for taddr from address" in errorString, True) + stop_node(self.nodes[3], 3) + self.nodes.pop() + # This send will fail because our wallet does not allow any change when protecting a coinbase utxo, # as it's currently not possible to specify a change address in z_sendmany. recipients = [] diff --git a/src/wallet/asyncrpcoperation_sendmany.cpp b/src/wallet/asyncrpcoperation_sendmany.cpp index 3d2675a92..89b43c7b3 100644 --- a/src/wallet/asyncrpcoperation_sendmany.cpp +++ b/src/wallet/asyncrpcoperation_sendmany.cpp @@ -803,6 +803,10 @@ bool AsyncRPCOperation_sendmany::find_utxos(bool fAcceptCoinbase=false) { pwalletMain->AvailableCoins(vecOutputs, false, NULL, true, fAcceptCoinbase); BOOST_FOREACH(const COutput& out, vecOutputs) { + if (!out.fSpendable) { + continue; + } + if (out.nDepth < mindepth_) { continue; } From 5a0721f0fe5f236cdc716f5b05e0dd88a1a233a6 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 19 Sep 2017 20:37:02 -0700 Subject: [PATCH 0205/1062] Set up a clean chain. Delete redundant method wait_until_miner_sees() via use of sync_all(). --- qa/rpc-tests/key_import_export.py | 51 +++++++++++++------------------ 1 file changed, 21 insertions(+), 30 deletions(-) diff --git a/qa/rpc-tests/key_import_export.py b/qa/rpc-tests/key_import_export.py index debade1a3..6b46c189e 100755 --- a/qa/rpc-tests/key_import_export.py +++ b/qa/rpc-tests/key_import_export.py @@ -6,7 +6,7 @@ from time import sleep from decimal import Decimal from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import assert_equal, assert_greater_than, sync_blocks +from test_framework.util import assert_equal, assert_greater_than, sync_blocks, start_nodes, initialize_chain_clean, connect_nodes_bi import logging @@ -15,38 +15,27 @@ logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.INFO) class KeyImportExportTest (BitcoinTestFramework): + def setup_chain(self): + print("Initializing test directory "+self.options.tmpdir) + initialize_chain_clean(self.options.tmpdir, 4) + + def setup_network(self, split=False): + self.nodes = start_nodes(4, self.options.tmpdir ) + connect_nodes_bi(self.nodes,0,1) + connect_nodes_bi(self.nodes,1,2) + connect_nodes_bi(self.nodes,0,2) + connect_nodes_bi(self.nodes,0,3) + self.is_network_split=False + self.sync_all() + def run_test(self): [alice, bob, charlie, miner] = self.nodes - def wait_until_miner_sees(txid): - attempts = 123 - delay = 0.5 - - for _ in range(attempts): - try: - miner.getrawtransaction(txid) - except Exception: - logging.debug( - 'txid %r not yet seen by miner; sleep %r', - txid, - delay, - ) - sleep(delay) - else: - return - - raise Exception( - 'miner failed to see txid {!r} after {!r} attempts...'.format( - txid, - attempts, - ), - ) - def alice_to_bob(amount): txid = alice.sendtoaddress(addr, Decimal(amount)) - wait_until_miner_sees(txid) + self.sync_all() miner.generate(1) - sync_blocks(self.nodes) + self.sync_all() def verify_utxos(node, amounts): utxos = node.listunspent(1, 10**9, [addr]) @@ -64,9 +53,11 @@ class KeyImportExportTest (BitcoinTestFramework): amounts, utxos) raise - # The first address already mutated by the startup process, ignore it: - # BUG: Why is this necessary? - bob.getnewaddress() + # Seed Alice with some funds + alice.generate(10) + self.sync_all() + miner.generate(100) + self.sync_all() # Now get a pristine address for receiving transfers: addr = bob.getnewaddress() From 3ccbbe31a43d753ad38d4903858d2d9fc7d2a7f0 Mon Sep 17 00:00:00 2001 From: kpcyrd Date: Sun, 27 Aug 2017 23:46:24 +0200 Subject: [PATCH 0206/1062] Fetch params from ipfs if possible Disable ipfs with ZC_DISABLE_IPFS= --- zcutil/fetch-params.sh | 84 +++++++++++++++++++++++++++++++++++------- 1 file changed, 70 insertions(+), 14 deletions(-) diff --git a/zcutil/fetch-params.sh b/zcutil/fetch-params.sh index 8bb31fc35..179e6ae9d 100755 --- a/zcutil/fetch-params.sh +++ b/zcutil/fetch-params.sh @@ -6,27 +6,83 @@ PARAMS_DIR="$HOME/.zcash-params" SPROUT_PKEY_NAME='sprout-proving.key' SPROUT_VKEY_NAME='sprout-verifying.key' -SPROUT_PKEY_URL="https://z.cash/downloads/$SPROUT_PKEY_NAME" -SPROUT_VKEY_URL="https://z.cash/downloads/$SPROUT_VKEY_NAME" +SPROUT_URL="https://z.cash/downloads" +SPROUT_IPFS="/ipfs/QmZKKx7Xup7LiAtFRhYsE1M7waXcv9ir9eCECyXAFGxhEo" SHA256CMD="$(command -v sha256sum || echo shasum)" SHA256ARGS="$(command -v sha256sum >/dev/null || echo '-a 256')" +WGETCMD="$(command -v wget || echo '')" +IPFSCMD="$(command -v ipfs || echo '')" + +# fetch methods can be disabled with ZC_DISABLE_SOMETHING=1 +ZC_DISABLE_WGET="${ZC_DISABLE_WGET:-}" +ZC_DISABLE_IPFS="${ZC_DISABLE_IPFS:-}" + +function fetch_wget { + if [ -z "$WGETCMD" ] || ! [ -z "$ZC_DISABLE_WGET" ]; then + return 1 + fi + + local filename="$1" + local dlname="$2" + + cat <&2 <&2 + exit 1 fi fi } @@ -100,8 +156,8 @@ EOF cd "$PARAMS_DIR" - fetch_params "$SPROUT_PKEY_URL" "$PARAMS_DIR/$SPROUT_PKEY_NAME" "8bc20a7f013b2b58970cddd2e7ea028975c88ae7ceb9259a5344a16bc2c0eef7" - fetch_params "$SPROUT_VKEY_URL" "$PARAMS_DIR/$SPROUT_VKEY_NAME" "4bd498dae0aacfd8e98dc306338d017d9c08dd0918ead18172bd0aec2fc5df82" + fetch_params "$SPROUT_PKEY_NAME" "$PARAMS_DIR/$SPROUT_PKEY_NAME" "8bc20a7f013b2b58970cddd2e7ea028975c88ae7ceb9259a5344a16bc2c0eef7" + fetch_params "$SPROUT_VKEY_NAME" "$PARAMS_DIR/$SPROUT_VKEY_NAME" "4bd498dae0aacfd8e98dc306338d017d9c08dd0918ead18172bd0aec2fc5df82" } main From 076e177dd9ac7be6d2e8d23cfdf96a5e1d0a7a6f Mon Sep 17 00:00:00 2001 From: kpcyrd Date: Thu, 21 Sep 2017 03:25:48 +0200 Subject: [PATCH 0207/1062] Prefer wget over ipfs --- zcutil/fetch-params.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zcutil/fetch-params.sh b/zcutil/fetch-params.sh index 179e6ae9d..10bade7cb 100755 --- a/zcutil/fetch-params.sh +++ b/zcutil/fetch-params.sh @@ -77,7 +77,7 @@ function fetch_params { if ! [ -f "$output" ] then - for method in ipfs wget failure; do + for method in wget ipfs failure; do if "fetch_$method" "$filename" "$dlname"; then echo "Download successful!" break From 109fed51ff496a3aeaead6b869793e85d7373483 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 21 Sep 2017 22:21:44 +0100 Subject: [PATCH 0208/1062] Additional test cases for importprivkey RPC test --- qa/rpc-tests/key_import_export.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/qa/rpc-tests/key_import_export.py b/qa/rpc-tests/key_import_export.py index 6b46c189e..3f075bc76 100755 --- a/qa/rpc-tests/key_import_export.py +++ b/qa/rpc-tests/key_import_export.py @@ -62,6 +62,7 @@ class KeyImportExportTest (BitcoinTestFramework): # Now get a pristine address for receiving transfers: addr = bob.getnewaddress() verify_utxos(bob, []) + verify_utxos(charlie, []) # the amounts of each txn embodied which generates a single UTXO: amounts = map(Decimal, ['2.3', '3.7', '0.1', '0.5', '1.0', '0.19']) @@ -83,16 +84,20 @@ class KeyImportExportTest (BitcoinTestFramework): alice_to_bob(amount) verify_utxos(bob, amounts[:4]) + verify_utxos(charlie, []) logging.info("Importing privkey into charlie...") ipkaddr = charlie.importprivkey(privkey, '', True) assert_equal(addr, ipkaddr) + # importprivkey should have rescanned, so this should pass: + verify_utxos(charlie, amounts[:4]) + # Verify idempotent behavior: ipkaddr2 = charlie.importprivkey(privkey, '', True) assert_equal(addr, ipkaddr2) - # importprivkey should have rescanned, so this should pass: + # amounts should be unchanged verify_utxos(charlie, amounts[:4]) logging.info("Sending post-import txns...") From 06c19063bba9251f6eb90cb9d6021b0be699bb1b Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 15 Sep 2017 12:59:27 -0700 Subject: [PATCH 0209/1062] Implement RPC shield_coinbase #2448. --- doc/payment-api.md | 3 +- qa/pull-tester/rpc-tests.sh | 1 + qa/rpc-tests/wallet_shieldcoinbase.py | 190 ++++++++ src/Makefile.am | 2 + src/main.cpp | 1 + src/rpcclient.cpp | 3 +- src/rpcserver.cpp | 3 +- src/rpcserver.h | 1 + src/test/rpc_wallet_tests.cpp | 307 ++++++++---- .../asyncrpcoperation_shieldcoinbase.cpp | 441 ++++++++++++++++++ src/wallet/asyncrpcoperation_shieldcoinbase.h | 122 +++++ src/wallet/rpcwallet.cpp | 177 +++++++ 12 files changed, 1161 insertions(+), 90 deletions(-) create mode 100755 qa/rpc-tests/wallet_shieldcoinbase.py create mode 100644 src/wallet/asyncrpcoperation_shieldcoinbase.cpp create mode 100644 src/wallet/asyncrpcoperation_shieldcoinbase.h diff --git a/doc/payment-api.md b/doc/payment-api.md index 72eef3644..f156ee482 100644 --- a/doc/payment-api.md +++ b/doc/payment-api.md @@ -32,7 +32,7 @@ RPC calls by category: * Addresses : z_getnewaddress, z_listaddresses, z_validateaddress * Keys : z_exportkey, z_importkey, z_exportwallet, z_importwallet * Operation: z_getoperationresult, z_getoperationstatus, z_listoperationids -* Payment : z_listreceivedbyaddress, z_sendmany +* Payment : z_listreceivedbyaddress, z_sendmany, z_shieldcoinbase RPC parameter conventions: @@ -72,6 +72,7 @@ Command | Parameters | Description --- | --- | --- z_listreceivedbyaddress
| zaddr [minconf=1] | Return a list of amounts received by a zaddr belonging to the node’s wallet.

Optionally set the minimum number of confirmations which a received amount must have in order to be included in the result. Use 0 to count unconfirmed transactions.

Output:
[{
“txid”: “4a0f…”,
“amount”: 0.54,
“memo”:”F0FF…”,}, {...}, {...}
] z_sendmany
| fromaddress amounts [minconf=1] [fee=0.0001] | _This is an Asynchronous RPC call_

Send funds from an address to multiple outputs. The address can be either a taddr or a zaddr.

Amounts is a list containing key/value pairs corresponding to the addresses and amount to pay. Each output address can be in taddr or zaddr format.

When sending to a zaddr, you also have the option of attaching a memo in hexadecimal format.

**NOTE:**When sending coinbase funds to a zaddr, the node's wallet does not allow any change. Put another way, spending a partial amount of a coinbase utxo is not allowed. This is not a consensus rule but a local wallet rule due to the current implementation of z_sendmany. In future, this rule may be removed.

Example of Outputs parameter:
[{“address”:”t123…”, “amount”:0.005},
,{“address”:”z010…”,”amount”:0.03, “memo”:”f508af…”}]

Optionally set the minimum number of confirmations which a private or transparent transaction must have in order to be used as an input. When sending from a zaddr, minconf must be greater than zero.

Optionally set a transaction fee, which by default is 0.0001 ZEC.

Any transparent change will be sent to a new transparent address. Any private change will be sent back to the zaddr being used as the source of funds.

Returns an operationid. You use the operationid value with z_getoperationstatus and z_getoperationresult to obtain the result of sending funds, which if successful, will be a txid. +z_shieldcoinbase
| fromaddress toaddress [fee=0.0001] | _This is an Asynchronous RPC call_

Shield transparent coinbase funds by sending to a shielded z address. Utxos selected for shielding will be locked. If there is an error, they are unlocked. The RPC call `listlockunspent` can be used to return a list of locked utxos. The number of coinbase utxos selected for shielding is limited by both the -mempooltxinputlimit=xxx option and a consensus rule defining a maximum transaction size of 100000 bytes.

The from address is a taddr or "*" for all taddrs belonging to the wallet. The to address is a zaddr. The default fee is 0.0001.

Returns an object containing an operationid which can be used with z_getoperationstatus and z_getoperationresult, along with key-value pairs regarding how many utxos are being shielded in this trasaction and what remains to be shielded. ### Operations diff --git a/qa/pull-tester/rpc-tests.sh b/qa/pull-tester/rpc-tests.sh index bd3357642..eeff40730 100755 --- a/qa/pull-tester/rpc-tests.sh +++ b/qa/pull-tester/rpc-tests.sh @@ -14,6 +14,7 @@ testScripts=( 'prioritisetransaction.py' 'wallet_treestate.py' 'wallet_protectcoinbase.py' + 'wallet_shieldcoinbase.py' 'wallet.py' 'wallet_nullifiers.py' 'wallet_1941.py' diff --git a/qa/rpc-tests/wallet_shieldcoinbase.py b/qa/rpc-tests/wallet_shieldcoinbase.py new file mode 100755 index 000000000..7d2d63e62 --- /dev/null +++ b/qa/rpc-tests/wallet_shieldcoinbase.py @@ -0,0 +1,190 @@ +#!/usr/bin/env python2 +# Copyright (c) 2017 The Zcash developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +from test_framework.test_framework import BitcoinTestFramework +from test_framework.authproxy import JSONRPCException +from test_framework.util import assert_equal, initialize_chain_clean, \ + start_node, connect_nodes_bi, sync_blocks + +import sys +import time +from decimal import Decimal + +class WalletShieldCoinbaseTest (BitcoinTestFramework): + + def setup_chain(self): + print("Initializing test directory "+self.options.tmpdir) + initialize_chain_clean(self.options.tmpdir, 4) + + def setup_network(self, split=False): + args = ['-regtestprotectcoinbase', '-debug=zrpcunsafe'] + self.nodes = [] + self.nodes.append(start_node(0, self.options.tmpdir, args)) + self.nodes.append(start_node(1, self.options.tmpdir, args)) + args2 = ['-regtestprotectcoinbase', '-debug=zrpcunsafe', "-mempooltxinputlimit=7"] + self.nodes.append(start_node(2, self.options.tmpdir, args2)) + connect_nodes_bi(self.nodes,0,1) + connect_nodes_bi(self.nodes,1,2) + connect_nodes_bi(self.nodes,0,2) + self.is_network_split=False + self.sync_all() + + # Returns txid if operation was a success or None + def wait_and_assert_operationid_status(self, nodeid, myopid, in_status='success', in_errormsg=None): + print('waiting for async operation {}'.format(myopid)) + opids = [] + opids.append(myopid) + timeout = 300 + status = None + errormsg = None + txid = None + for x in xrange(1, timeout): + results = self.nodes[nodeid].z_getoperationresult(opids) + if len(results)==0: + time.sleep(1) + else: + status = results[0]["status"] + if status == "failed": + errormsg = results[0]['error']['message'] + elif status == "success": + txid = results[0]['result']['txid'] + break + print('...returned status: {}'.format(status)) + assert_equal(in_status, status) + if errormsg is not None: + assert(in_errormsg is not None) + assert_equal(in_errormsg in errormsg, True) + print('...returned error: {}'.format(errormsg)) + return txid + + def run_test (self): + print "Mining blocks..." + + self.nodes[0].generate(1) + do_not_shield_taddr = self.nodes[0].getnewaddress() + + self.nodes[0].generate(4) + walletinfo = self.nodes[0].getwalletinfo() + assert_equal(walletinfo['immature_balance'], 50) + assert_equal(walletinfo['balance'], 0) + self.sync_all() + self.nodes[2].generate(1) + self.nodes[2].getnewaddress() + self.nodes[2].generate(1) + self.nodes[2].getnewaddress() + self.nodes[2].generate(1) + self.sync_all() + self.nodes[1].generate(101) + self.sync_all() + assert_equal(self.nodes[0].getbalance(), 50) + assert_equal(self.nodes[1].getbalance(), 10) + assert_equal(self.nodes[2].getbalance(), 30) + + # Prepare to send taddr->zaddr + mytaddr = self.nodes[0].getnewaddress() + myzaddr = self.nodes[0].z_getnewaddress() + + # Shielding will fail when trying to spend from watch-only address + self.nodes[2].importaddress(mytaddr) + try: + self.nodes[2].z_shieldcoinbase(mytaddr, myzaddr) + except JSONRPCException,e: + errorString = e.error['message'] + assert_equal("Could not find any coinbase funds to shield" in errorString, True) + + # Shielding will fail because fee is negative + try: + self.nodes[0].z_shieldcoinbase("*", myzaddr, -1) + except JSONRPCException,e: + errorString = e.error['message'] + assert_equal("Amount out of range" in errorString, True) + + # Shielding will fail because fee is larger than MAX_MONEY + try: + self.nodes[0].z_shieldcoinbase("*", myzaddr, Decimal('21000000.00000001')) + except JSONRPCException,e: + errorString = e.error['message'] + assert_equal("Amount out of range" in errorString, True) + + # Shielding will fail because fee is larger than sum of utxos + try: + self.nodes[0].z_shieldcoinbase("*", myzaddr, 999) + except JSONRPCException,e: + errorString = e.error['message'] + assert_equal("Insufficient coinbase funds" in errorString, True) + + # Shield coinbase utxos from node 0 of value 40, standard fee of 0.00010000 + result = self.nodes[0].z_shieldcoinbase(mytaddr, myzaddr) + mytxid = self.wait_and_assert_operationid_status(0, result['opid']) + self.sync_all() + self.nodes[1].generate(1) + self.sync_all() + + # Confirm balances and that do_not_shield_taddr containing funds of 10 was left alone + assert_equal(self.nodes[0].getbalance(), 10) + assert_equal(self.nodes[0].z_getbalance(do_not_shield_taddr), Decimal('10.0')) + assert_equal(self.nodes[0].z_getbalance(myzaddr), Decimal('39.99990000')) + assert_equal(self.nodes[1].getbalance(), 20) + assert_equal(self.nodes[2].getbalance(), 30) + + # Shield coinbase utxos from any node 2 taddr, and set fee to 0 + result = self.nodes[2].z_shieldcoinbase("*", myzaddr, 0) + mytxid = self.wait_and_assert_operationid_status(2, result['opid']) + self.sync_all() + self.nodes[1].generate(1) + self.sync_all() + + assert_equal(self.nodes[0].getbalance(), 10) + assert_equal(self.nodes[0].z_getbalance(myzaddr), Decimal('69.99990000')) + assert_equal(self.nodes[1].getbalance(), 30) + assert_equal(self.nodes[2].getbalance(), 0) + + # Generate 800 coinbase utxos on node 0, and 20 coinbase utxos on node 2 + self.nodes[0].generate(800) + self.sync_all() + self.nodes[2].generate(20) + self.sync_all() + self.nodes[1].generate(100) + self.sync_all() + mytaddr = self.nodes[0].getnewaddress() + + # Shielding the 800 utxos will occur over two transactions, since max tx size is 100,000 bytes. + # We don't verify shieldingValue as utxos are not selected in any specific order, so value can change on each test run. + result = self.nodes[0].z_shieldcoinbase(mytaddr, myzaddr, 0) + assert_equal(result["shieldingUTXOs"], Decimal('662')) + assert_equal(result["remainingUTXOs"], Decimal('138')) + remainingValue = result["remainingValue"] + opid1 = result['opid'] + + # Verify that utxos are locked (not available for selection) by queuing up another shielding operation + result = self.nodes[0].z_shieldcoinbase(mytaddr, myzaddr) + assert_equal(result["shieldingValue"], Decimal(remainingValue)) + assert_equal(result["shieldingUTXOs"], Decimal('138')) + assert_equal(result["remainingValue"], Decimal('0')) + assert_equal(result["remainingUTXOs"], Decimal('0')) + opid2 = result['opid'] + + # wait for both aysnc operations to complete + self.wait_and_assert_operationid_status(0, opid1) + self.wait_and_assert_operationid_status(0, opid2) + + # sync_all() invokes sync_mempool() but node 2's mempool limit will cause tx1 and tx2 to be rejected. + # So instead, we sync on blocks, and after a new block is generated, all nodes will have an empty mempool. + sync_blocks(self.nodes) + self.nodes[1].generate(1) + self.sync_all() + + # Verify maximum number of utxos which node 2 can shield is limited by option -mempooltxinputlimit + mytaddr = self.nodes[2].getnewaddress() + result = self.nodes[2].z_shieldcoinbase(mytaddr, myzaddr, 0) + assert_equal(result["shieldingUTXOs"], Decimal('7')) + assert_equal(result["remainingUTXOs"], Decimal('13')) + mytxid = self.wait_and_assert_operationid_status(2, result['opid']) + self.sync_all() + self.nodes[1].generate(1) + self.sync_all() + +if __name__ == '__main__': + WalletShieldCoinbaseTest().main() diff --git a/src/Makefile.am b/src/Makefile.am index 4f4b28764..49da7b8da 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -185,6 +185,7 @@ BITCOIN_CORE_H = \ validationinterface.h \ version.h \ wallet/asyncrpcoperation_sendmany.h \ + wallet/asyncrpcoperation_shieldcoinbase.h \ wallet/crypter.h \ wallet/db.h \ wallet/wallet.h \ @@ -271,6 +272,7 @@ libbitcoin_wallet_a_SOURCES = \ zcbenchmarks.cpp \ zcbenchmarks.h \ wallet/asyncrpcoperation_sendmany.cpp \ + wallet/asyncrpcoperation_shieldcoinbase.cpp \ wallet/crypter.cpp \ wallet/db.cpp \ wallet/rpcdump.cpp \ diff --git a/src/main.cpp b/src/main.cpp index f6170ab60..a8ec07403 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -28,6 +28,7 @@ #include "utilmoneystr.h" #include "validationinterface.h" #include "wallet/asyncrpcoperation_sendmany.h" +#include "wallet/asyncrpcoperation_shieldcoinbase.h" #include diff --git a/src/rpcclient.cpp b/src/rpcclient.cpp index 07adf65fc..376b2b3d5 100644 --- a/src/rpcclient.cpp +++ b/src/rpcclient.cpp @@ -103,12 +103,13 @@ static const CRPCConvertParam vRPCConvertParams[] = { "zcbenchmark", 1 }, { "zcbenchmark", 2 }, { "getblocksubsidy", 0}, - { "z_listreceivedbyaddress", 1}, + { "z_listreceivedbyaddress", 1}, { "z_getbalance", 1}, { "z_gettotalbalance", 0}, { "z_sendmany", 1}, { "z_sendmany", 2}, { "z_sendmany", 3}, + { "z_shieldcoinbase", 2}, { "z_getoperationstatus", 0}, { "z_getoperationresult", 0}, { "z_importkey", 2 }, diff --git a/src/rpcserver.cpp b/src/rpcserver.cpp index c2c76a1e2..08a556bb1 100644 --- a/src/rpcserver.cpp +++ b/src/rpcserver.cpp @@ -386,6 +386,7 @@ static const CRPCCommand vRPCCommands[] = { "wallet", "z_getbalance", &z_getbalance, false }, { "wallet", "z_gettotalbalance", &z_gettotalbalance, false }, { "wallet", "z_sendmany", &z_sendmany, false }, + { "wallet", "z_shieldcoinbase", &z_shieldcoinbase, false }, { "wallet", "z_getoperationstatus", &z_getoperationstatus, true }, { "wallet", "z_getoperationresult", &z_getoperationresult, true }, { "wallet", "z_listoperationids", &z_listoperationids, true }, @@ -426,7 +427,7 @@ bool StartRPC() // Launch one async rpc worker. The ability to launch multiple workers is not recommended at present and thus the option is disabled. getAsyncRPCQueue()->addWorker(); -/* +/* int n = GetArg("-rpcasyncthreads", 1); if (n<1) { LogPrintf("ERROR: Invalid value %d for -rpcasyncthreads. Must be at least 1.\n", n); diff --git a/src/rpcserver.h b/src/rpcserver.h index 1124801c2..4da515426 100644 --- a/src/rpcserver.h +++ b/src/rpcserver.h @@ -287,6 +287,7 @@ extern UniValue z_listreceivedbyaddress(const UniValue& params, bool fHelp); // extern UniValue z_getbalance(const UniValue& params, bool fHelp); // in rpcwallet.cpp extern UniValue z_gettotalbalance(const UniValue& params, bool fHelp); // in rpcwallet.cpp extern UniValue z_sendmany(const UniValue& params, bool fHelp); // in rpcwallet.cpp +extern UniValue z_shieldcoinbase(const UniValue& params, bool fHelp); // in rpcwallet.cpp extern UniValue z_getoperationstatus(const UniValue& params, bool fHelp); // in rpcwallet.cpp extern UniValue z_getoperationresult(const UniValue& params, bool fHelp); // in rpcwallet.cpp extern UniValue z_listoperationids(const UniValue& params, bool fHelp); // in rpcwallet.cpp diff --git a/src/test/rpc_wallet_tests.cpp b/src/test/rpc_wallet_tests.cpp index 42cbf109f..8233097de 100644 --- a/src/test/rpc_wallet_tests.cpp +++ b/src/test/rpc_wallet_tests.cpp @@ -17,6 +17,8 @@ #include "asyncrpcqueue.h" #include "asyncrpcoperation.h" #include "wallet/asyncrpcoperation_sendmany.h" +#include "wallet/asyncrpcoperation_shieldcoinbase.h" + #include "rpcprotocol.h" #include "init.h" @@ -289,20 +291,20 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_getbalance) LOCK(pwalletMain->cs_wallet); - + BOOST_CHECK_THROW(CallRPC("z_getbalance too many args"), runtime_error); BOOST_CHECK_THROW(CallRPC("z_getbalance invalidaddress"), runtime_error); BOOST_CHECK_NO_THROW(CallRPC("z_getbalance tmC6YZnCUhm19dEXxh3Jb7srdBJxDawaCab")); BOOST_CHECK_THROW(CallRPC("z_getbalance tmC6YZnCUhm19dEXxh3Jb7srdBJxDawaCab -1"), runtime_error); BOOST_CHECK_NO_THROW(CallRPC("z_getbalance tmC6YZnCUhm19dEXxh3Jb7srdBJxDawaCab 0")); BOOST_CHECK_THROW(CallRPC("z_getbalance tnRZ8bPq2pff3xBWhTJhNkVUkm2uhzksDeW5PvEa7aFKGT9Qi3YgTALZfjaY4jU3HLVKBtHdSXxoPoLA3naMPcHBcY88FcF 1"), runtime_error); - - + + BOOST_CHECK_THROW(CallRPC("z_gettotalbalance too manyargs"), runtime_error); BOOST_CHECK_THROW(CallRPC("z_gettotalbalance -1"), runtime_error); BOOST_CHECK_NO_THROW(CallRPC("z_gettotalbalance 0")); - - + + BOOST_CHECK_THROW(CallRPC("z_listreceivedbyaddress too many args"), runtime_error); // negative minconf not allowed BOOST_CHECK_THROW(CallRPC("z_listreceivedbyaddress tmC6YZnCUhm19dEXxh3Jb7srdBJxDawaCab -1"), runtime_error); @@ -374,7 +376,7 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_z_exportwallet) CZCPaymentAddress paymentAddress = pwalletMain->GenerateNewZKey(); pwalletMain->GetPaymentAddresses(addrs); BOOST_CHECK(addrs.size()==1); - + // Set up paths boost::filesystem::path tmppath = boost::filesystem::temp_directory_path(); boost::filesystem::path tmpfilename = boost::filesystem::unique_path("%%%%%%%%"); @@ -402,10 +404,10 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_z_exportwallet) std::string s1 = paymentAddress.ToString(); std::string s2 = CZCSpendingKey(key).ToString(); - + // There's no way to really delete a private key so we will read in the // exported wallet file and search for the spending key and payment address. - + EnsureWalletIsUnlocked(); ifstream file; @@ -434,7 +436,7 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_z_exportwallet) BOOST_AUTO_TEST_CASE(rpc_wallet_z_importwallet) { LOCK2(cs_main, pwalletMain->cs_wallet); - + // error if no args BOOST_CHECK_THROW(CallRPC("z_importwallet"), runtime_error); @@ -446,7 +448,7 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_z_importwallet) auto testPaymentAddress = testSpendingKey.address(); std::string testAddr = CZCPaymentAddress(testPaymentAddress).ToString(); std::string testKey = CZCSpendingKey(testSpendingKey).ToString(); - + // create test data using the random key std::string format_str = "# Wallet dump created by Zcash v0.11.2.0.z8-9155cc6-dirty (2016-08-11 11:37:00 -0700)\n" "# * Created on 2016-08-12T21:55:36Z\n" @@ -458,10 +460,10 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_z_importwallet) "%s 2016-08-12T21:55:36Z # zaddr=%s\n" "\n" "\n# End of dump"; - + boost::format formatobject(format_str); std::string testWalletDump = (formatobject % testKey % testAddr).str(); - + // write test data to file boost::filesystem::path temp = boost::filesystem::temp_directory_path() / boost::filesystem::unique_path(); @@ -474,19 +476,19 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_z_importwallet) std::set addrs; pwalletMain->GetPaymentAddresses(addrs); BOOST_CHECK(addrs.size()==0); - + // import test data from file into wallet BOOST_CHECK_NO_THROW(CallRPC(string("z_importwallet ") + path)); - + // wallet should now have one zkey pwalletMain->GetPaymentAddresses(addrs); BOOST_CHECK(addrs.size()==1); - + // check that we have the spending key for the address CZCPaymentAddress address(testAddr); auto addr = address.Get(); BOOST_CHECK(pwalletMain->HaveSpendingKey(addr)); - + // Verify the spending key is the same as the test data libzcash::SpendingKey k; BOOST_CHECK(pwalletMain->GetSpendingKey(addr, k)); @@ -504,10 +506,10 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_z_importexport) UniValue retValue; int n1 = 1000; // number of times to import/export int n2 = 1000; // number of addresses to create and list - + // error if no args - BOOST_CHECK_THROW(CallRPC("z_importkey"), runtime_error); - BOOST_CHECK_THROW(CallRPC("z_exportkey"), runtime_error); + BOOST_CHECK_THROW(CallRPC("z_importkey"), runtime_error); + BOOST_CHECK_THROW(CallRPC("z_exportkey"), runtime_error); // error if too many args BOOST_CHECK_THROW(CallRPC("z_importkey way too many args"), runtime_error); @@ -548,7 +550,7 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_z_importexport) for (UniValue element : arr.getValues()) { myaddrs.insert(element.get_str()); } - + // Make new addresses for the set for (int i=0; iGenerateNewZKey()).ToString()); @@ -558,19 +560,19 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_z_importexport) int numAddrs = myaddrs.size(); BOOST_CHECK(numAddrs == n1+n2); pwalletMain->GetPaymentAddresses(addrs); - BOOST_CHECK(addrs.size()==numAddrs); - + BOOST_CHECK(addrs.size()==numAddrs); + // Ask wallet to list addresses BOOST_CHECK_NO_THROW(retValue = CallRPC("z_listaddresses")); arr = retValue.get_array(); BOOST_CHECK(arr.size() == numAddrs); - + // Create a set from them std::unordered_set listaddrs; for (UniValue element : arr.getValues()) { listaddrs.insert(element.get_str()); } - + // Verify the two sets of addresses are the same BOOST_CHECK(listaddrs.size() == numAddrs); BOOST_CHECK(myaddrs == listaddrs); @@ -623,19 +625,19 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_async_operations) BOOST_CHECK(ids.size()==0); std::shared_ptr op1 = std::make_shared(); - q->addOperation(op1); + q->addOperation(op1); BOOST_CHECK(q->getOperationCount() == 1); - + OperationStatus status = op1->getState(); BOOST_CHECK(status == OperationStatus::READY); - + AsyncRPCOperationId id1 = op1->getId(); int64_t creationTime1 = op1->getCreationTime(); - + q->addWorker(); BOOST_CHECK(q->getNumberOfWorkers() == 1); - - // an AsyncRPCOperation doesn't do anything so will finish immediately + + // an AsyncRPCOperation doesn't do anything so will finish immediately std::this_thread::sleep_for(std::chrono::seconds(1)); BOOST_CHECK(q->getOperationCount() == 0); @@ -649,7 +651,7 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_async_operations) BOOST_CHECK_EQUAL(op1->getResult().isNull(), false); BOOST_CHECK_EQUAL(op1->getStateAsString(), "success"); BOOST_CHECK_NE(op1->getStateAsString(), "executing"); - + // Create a second operation which just sleeps std::shared_ptr op2(new MockSleepOperation(2500)); AsyncRPCOperationId id2 = op2->getId(); @@ -683,8 +685,8 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_async_operations) BOOST_CHECK_EQUAL(op2->isSuccess(), true); BOOST_CHECK_EQUAL(op2->isCancelled(), false); BOOST_CHECK_EQUAL(op3->isCancelled(), true); - - + + v = q->getAllOperationIds(); std::copy( v.begin(), v.end(), std::inserter( opids, opids.end() ) ); BOOST_CHECK(opids.size() == 3); @@ -702,7 +704,7 @@ class CountOperation : public AsyncRPCOperation { public: CountOperation() {} virtual ~CountOperation() {} - virtual void main() { + virtual void main() { set_state(OperationStatus::EXECUTING); gCounter++; std::this_thread::sleep_for(std::chrono::milliseconds(1000)); @@ -714,7 +716,7 @@ public: BOOST_AUTO_TEST_CASE(rpc_wallet_async_operations_parallel_wait) { gCounter = 0; - + std::shared_ptr q = std::make_shared(); q->addWorker(); q->addWorker(); @@ -739,7 +741,7 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_async_operations_parallel_wait) BOOST_AUTO_TEST_CASE(rpc_wallet_async_operations_parallel_cancel) { gCounter = 0; - + std::shared_ptr q = std::make_shared(); q->addWorker(); q->addWorker(); @@ -755,7 +757,7 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_async_operations_parallel_cancel) q->closeAndWait(); int numSuccess = 0; - int numCancelled = 0; + int numCancelled = 0; for (auto & id : ids) { std::shared_ptr ptr = q->popOperationForId(id); if (ptr->isCancelled()) { @@ -764,7 +766,7 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_async_operations_parallel_cancel) numSuccess++; } } - + BOOST_CHECK_EQUAL(numOperations, numSuccess+numCancelled); BOOST_CHECK_EQUAL(gCounter.load(), numSuccess); BOOST_CHECK(q->getOperationCount() == 0); @@ -790,19 +792,19 @@ BOOST_AUTO_TEST_CASE(rpc_z_getoperations) BOOST_CHECK_NO_THROW(CallRPC("z_getoperationresult [\"opid-1234\"]")); BOOST_CHECK_THROW(CallRPC("z_getoperationresult [] toomanyargs"), runtime_error); BOOST_CHECK_THROW(CallRPC("z_getoperationresult not_an_array"), runtime_error); - + std::shared_ptr op1 = std::make_shared(); q->addOperation(op1); std::shared_ptr op2 = std::make_shared(); q->addOperation(op2); - + BOOST_CHECK(q->getOperationCount() == 2); BOOST_CHECK(q->getNumberOfWorkers() == 0); q->addWorker(); BOOST_CHECK(q->getNumberOfWorkers() == 1); std::this_thread::sleep_for(std::chrono::milliseconds(1000)); BOOST_CHECK(q->getOperationCount() == 0); - + // Check if too many args BOOST_CHECK_THROW(CallRPC("z_listoperationids toomany args"), runtime_error); @@ -817,28 +819,28 @@ BOOST_AUTO_TEST_CASE(rpc_z_getoperations) // idempotent BOOST_CHECK_NO_THROW(retValue = CallRPC("z_getoperationstatus")); array = retValue.get_array(); - BOOST_CHECK(array.size() == 2); - + BOOST_CHECK(array.size() == 2); + for (UniValue v : array.getValues()) { UniValue obj = v.get_obj(); UniValue id = find_value(obj, "id"); - + UniValue result; // removes result from internal storage BOOST_CHECK_NO_THROW(result = CallRPC("z_getoperationresult [\"" + id.get_str() + "\"]")); UniValue resultArray = result.get_array(); BOOST_CHECK(resultArray.size() == 1); - + UniValue resultObj = resultArray[0].get_obj(); UniValue resultId = find_value(resultObj, "id"); BOOST_CHECK_EQUAL(id.get_str(), resultId.get_str()); - - // verify the operation has been removed + + // verify the operation has been removed BOOST_CHECK_NO_THROW(result = CallRPC("z_getoperationresult [\"" + id.get_str() + "\"]")); resultArray = result.get_array(); BOOST_CHECK(resultArray.size() == 0); } - + // operations removed BOOST_CHECK_NO_THROW(retValue = CallRPC("z_getoperationstatus")); array = retValue.get_array(); @@ -905,8 +907,8 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_parameters) std::string zaddr1 = pa.ToString(); BOOST_CHECK_THROW(CallRPC(string("z_sendmany tmRr6yJonqGK23UVhrKuyvTpF8qxQQjKigJ ") + "[{\"address\":\"" + zaddr1 + "\", \"amount\":123.456}]"), runtime_error); - - // Test constructor of AsyncRPCOperation_sendmany + + // Test constructor of AsyncRPCOperation_sendmany try { std::shared_ptr operation(new AsyncRPCOperation_sendmany("",{}, {}, -1)); } catch (const UniValue& objError) { @@ -959,13 +961,13 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_internals) LOCK(pwalletMain->cs_wallet); UniValue retValue; - + // add keys manually BOOST_CHECK_NO_THROW(retValue = CallRPC("getnewaddress")); std::string taddr1 = retValue.get_str(); CZCPaymentAddress pa = pwalletMain->GenerateNewZKey(); std::string zaddr1 = pa.ToString(); - + // there are no utxos to spend { std::vector recipients = { SendManyRecipient(zaddr1,100.0, "DEADBEEF") }; @@ -986,7 +988,7 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_internals) BOOST_CHECK(find_error(objError, "Minconf cannot be zero when sending from zaddr")); } } - + // there are no unspent notes to spend { @@ -1004,7 +1006,7 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_internals) std::shared_ptr operation( new AsyncRPCOperation_sendmany(zaddr1, recipients, {}, 1) ); std::shared_ptr ptr = std::dynamic_pointer_cast (operation); TEST_FRIEND_AsyncRPCOperation_sendmany proxy(ptr); - + std::string memo = "DEADBEEF"; boost::array array = proxy.get_memo_from_hex_string(memo); BOOST_CHECK_EQUAL(array[0], 0xDE); @@ -1014,28 +1016,28 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_internals) for (int i=4; i v (2 * (ZC_MEMO_SIZE+1)); std::fill(v.begin(),v.end(), 'A'); std::string bigmemo(v.begin(), v.end()); - + try { proxy.get_memo_from_hex_string(bigmemo); } catch (const UniValue& objError) { BOOST_CHECK( find_error(objError, "too big")); } - + // invalid hexadecimal string std::fill(v.begin(),v.end(), '@'); // not a hex character std::string badmemo(v.begin(), v.end()); - + try { proxy.get_memo_from_hex_string(badmemo); } catch (const UniValue& objError) { BOOST_CHECK( find_error(objError, "hexadecimal format")); } - + // odd length hexadecimal string std::fill(v.begin(),v.end(), 'A'); v.resize(v.size() - 1); @@ -1047,25 +1049,25 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_internals) BOOST_CHECK( find_error(objError, "hexadecimal format")); } } - - + + // add_taddr_change_output_to_tx() will append a vout to a raw transaction { std::vector recipients = { SendManyRecipient(zaddr1,100.0, "DEADBEEF") }; std::shared_ptr operation( new AsyncRPCOperation_sendmany(zaddr1, recipients, {}, 1) ); std::shared_ptr ptr = std::dynamic_pointer_cast (operation); TEST_FRIEND_AsyncRPCOperation_sendmany proxy(ptr); - + CTransaction tx = proxy.getTx(); BOOST_CHECK(tx.vout.size() == 0); - + CAmount amount = 123.456; proxy.add_taddr_change_output_to_tx(amount); tx = proxy.getTx(); BOOST_CHECK(tx.vout.size() == 1); CTxOut out = tx.vout[0]; BOOST_CHECK_EQUAL(out.nValue, amount); - + amount = 1.111; proxy.add_taddr_change_output_to_tx(amount); tx = proxy.getTx(); @@ -1073,7 +1075,7 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_internals) out = tx.vout[1]; BOOST_CHECK_EQUAL(out.nValue, amount); } - + // add_taddr_outputs_to_tx() will append many vouts to a raw transaction { std::vector recipients = { @@ -1084,33 +1086,33 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_internals) std::shared_ptr operation( new AsyncRPCOperation_sendmany(zaddr1, recipients, {}, 1) ); std::shared_ptr ptr = std::dynamic_pointer_cast (operation); TEST_FRIEND_AsyncRPCOperation_sendmany proxy(ptr); - + proxy.add_taddr_outputs_to_tx(); - + CTransaction tx = proxy.getTx(); BOOST_CHECK(tx.vout.size() == 3); BOOST_CHECK_EQUAL(tx.vout[0].nValue, CAmount(1.23)); BOOST_CHECK_EQUAL(tx.vout[1].nValue, CAmount(4.56)); BOOST_CHECK_EQUAL(tx.vout[2].nValue, CAmount(7.89)); } - + // Raw joinsplit is a zaddr->zaddr { std::string raw = "020000000000000000000100000000000000001027000000000000183a0d4c46c369078705e39bcfebee59a978dbd210ce8de3efc9555a03fbabfd3cea16693d730c63850d7e48ccde79854c19adcb7e9dcd7b7d18805ee09083f6b16e1860729d2d4a90e2f2acd009cf78b5eb0f4a6ee4bdb64b1262d7ce9eb910c460b02022991e968d0c50ee44908e4ccccbc591d0053bcca154dd6d6fc400a29fa686af4682339832ccea362a62aeb9df0d5aa74f86a1e75ac0f48a8ccc41e0a940643c6c33e1d09223b0a46eaf47a1bb4407cfc12b1dcf83a29c0cef51e45c7876ca5b9e5bae86d92976eb3ef68f29cd29386a8be8451b50f82bf9da10c04651868655194da8f6ed3d241bb5b5ff93a3e2bbe44644544d88bcde5cc35978032ee92699c7a61fcbb395e7583f47e698c4d53ede54f956629400bf510fb5e22d03158cc10bdcaaf29e418ef18eb6480dd9c8b9e2a377809f9f32a556ef872febd0021d4ad013aa9f0b7255e98e408d302abefd33a71180b720271835b487ab309e160b06dfe51932120fb84a7ede16b20c53599a11071592109e10260f265ee60d48c62bfe24074020e9b586ce9e9356e68f2ad1a9538258234afe4b83a209f178f45202270eaeaeecaf2ce3100b2c5a714f75f35777a9ebff5ebf47059d2bbf6f3726190216468f2b152673b766225b093f3a2f827c86d6b48b42117fec1d0ac38dd7af700308dcfb02eba821612b16a2c164c47715b9b0c93900893b1aba2ea03765c94d87022db5be06ab338d1912e0936dfe87586d0a8ee49144a6cd2e306abdcb652faa3e0222739deb23154d778b50de75069a4a2cce1208cd1ced3cb4744c9888ce1c2fcd2e66dc31e62d3aa9e423d7275882525e9981f92e84ac85975b8660739407efbe1e34c2249420fde7e17db3096d5b22e83d051d01f0e6e7690dca7d168db338aadf0897fedac10de310db2b1bff762d322935dddbb60c2efb8b15d231fa17b84630371cb275c209f0c4c7d0c68b150ea5cd514122215e3f7fcfb351d69514788d67c2f3c8922581946e3a04bdf1f07f15696ca76eb95b10698bf1188fd882945c57657515889d042a6fc45d38cbc943540c4f0f6d1c45a1574c81f3e42d1eb8702328b729909adee8a5cfed7c79d54627d1fd389af941d878376f7927b9830ca659bf9ab18c5ca5192d52d02723008728d03701b8ab3e1c4a3109409ec0b13df334c7deec3523eeef4c97b5603e643de3a647b873f4c1b47fbfc6586ba66724f112e51fc93839648005043620aa3ce458e246d77977b19c53d98e3e812de006afc1a79744df236582943631d04cc02941ac4be500e4ed9fb9e3e7cc187b1c4050fad1d9d09d5fd70d5d01d615b439d8c0015d2eb10398bcdbf8c4b2bd559dbe4c288a186aed3f86f608da4d582e120c4a896e015e2241900d1daeccd05db968852677c71d752bec46de9962174b46f980e8cc603654daf8b98a3ee92dac066033954164a89568b70b1780c2ce2410b2f816dbeddb2cd463e0c8f21a52cf6427d9647a6fd4bafa8fb4cd4d47ac057b0160bee86c6b2fb8adce214c2bcdda277512200adf0eaa5d2114a2c077b009836a68ec254bfe56f51d147b9afe2ddd9cb917c0c2de19d81b7b8fd9f4574f51fa1207630dc13976f4d7587c962f761af267de71f3909a576e6bedaf6311633910d291ac292c467cc8331ef577aef7646a5d949322fa0367a49f20597a13def53136ee31610395e3e48d291fd8f58504374031fe9dcfba5e06086ebcf01a9106f6a4d6e16e19e4c5bb893f7da79419c94eca31a384be6fa1747284dee0fc3bbc8b1b860172c10b29c1594bb8c747d7fe05827358ff2160f49050001625ffe2e880bd7fc26cd0ffd89750745379a8e862816e08a5a2008043921ab6a4976064ac18f7ee37b6628bc0127d8d5ebd3548e41d8881a082d86f20b32e33094f15a0e6ea6074b08c6cd28142de94713451640a55985051f5577eb54572699d838cb34a79c8939e981c0c277d06a6e2ce69ccb74f8a691ff08f81d8b99e6a86223d29a2b7c8e7b041aba44ea678ae654277f7e91cbfa79158b989164a3d549d9f4feb0cc43169699c13e321fe3f4b94258c75d198ff9184269cd6986c55409e07528c93f64942c6c283ce3917b4bf4c3be2fe3173c8c38cccb35f1fbda0ca88b35a599c0678cb22aa8eabea8249dbd2e4f849fffe69803d299e435ebcd7df95854003d8eda17a74d98b4be0e62d45d7fe48c06a6f464a14f8e0570077cc631279092802a89823f031eef5e1028a6d6fdbd502869a731ee7d28b4d6c71b419462a30d31442d3ee444ffbcbd16d558c9000c97e949c2b1f9d6f6d8db7b9131ebd963620d3fc8595278d6f8fdf49084325373196d53e64142fa5a23eccd6ef908c4d80b8b3e6cc334b7f7012103a3682e4678e9b518163d262a39a2c1a69bf88514c52b7ccd7cc8dc80e71f7c2ec0701cff982573eb0c2c4daeb47fa0b586f4451c10d1da2e5d182b03dd067a5e971b3a6138ca6667aaf853d2ac03b80a1d5870905f2cfb6c78ec3c3719c02f973d638a0f973424a2b0f2b0023f136d60092fe15fba4bc180b9176bd0ff576e053f1af6939fe9ca256203ffaeb3e569f09774d2a6cbf91873e56651f4d6ff77e0b5374b0a1a201d7e523604e0247644544cc571d48c458a4f96f45580b"; UniValue obj(UniValue::VOBJ); obj.push_back(Pair("rawtxn", raw)); - + // we have the spending key for the dummy recipient zaddr1 std::vector recipients = { SendManyRecipient(zaddr1, 0.0005, "ABCD") }; - + std::shared_ptr operation( new AsyncRPCOperation_sendmany(zaddr1, {}, recipients, 1) ); std::shared_ptr ptr = std::dynamic_pointer_cast (operation); TEST_FRIEND_AsyncRPCOperation_sendmany proxy(ptr); - + // Enable test mode so tx is not sent static_cast(operation.get())->testmode = true; - + // Pretend that the operation completed successfully proxy.set_state(OperationStatus::SUCCESS); @@ -1122,21 +1124,21 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_internals) std::string hex = find_value(resultObj, "hex").get_str(); BOOST_CHECK_EQUAL(hex, raw); } - - + + // Test the perform_joinsplit methods. { // Dummy input so the operation object can be instantiated. std::vector recipients = { SendManyRecipient(zaddr1, 0.0005, "ABCD") }; - + std::shared_ptr operation( new AsyncRPCOperation_sendmany(zaddr1, {}, recipients, 1) ); std::shared_ptr ptr = std::dynamic_pointer_cast (operation); - TEST_FRIEND_AsyncRPCOperation_sendmany proxy(ptr); + TEST_FRIEND_AsyncRPCOperation_sendmany proxy(ptr); // Enable test mode so tx is not sent and proofs are not generated static_cast(operation.get())->testmode = true; - - AsyncJoinSplitInfo info; + + AsyncJoinSplitInfo info; std::vector> witnesses; uint256 anchor; try { @@ -1158,7 +1160,7 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_internals) } catch (const std::runtime_error & e) { BOOST_CHECK( string(e.what()).find("number of notes")!= string::npos); } - + info.notes.clear(); info.vjsin.push_back(JSInput()); info.vjsin.push_back(JSInput()); @@ -1168,7 +1170,7 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_internals) } catch (const std::runtime_error & e) { BOOST_CHECK( string(e.what()).find("unsupported joinsplit input")!= string::npos); } - + info.vjsin.clear(); try { proxy.perform_joinsplit(info); @@ -1176,7 +1178,7 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_internals) BOOST_CHECK( string(e.what()).find("JoinSplit verifying key not loaded")!= string::npos); } } - + } @@ -1214,29 +1216,160 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_encrypted_wallet_zkeys) boost::filesystem::current_path(GetArg("-datadir","/tmp/thisshouldnothappen")); BOOST_CHECK(pwalletMain->EncryptWallet(strWalletPass)); - + // Verify we can still list the keys imported BOOST_CHECK_NO_THROW(retValue = CallRPC("z_listaddresses")); arr = retValue.get_array(); BOOST_CHECK(arr.size() == n); - + // Try to add a new key, but we can't as the wallet is locked BOOST_CHECK_THROW(CallRPC("z_getnewaddress"), runtime_error); - + // We can't call RPC walletpassphrase as that invokes RPCRunLater which breaks tests. // So we manually unlock. BOOST_CHECK(pwalletMain->Unlock(strWalletPass)); - + // Now add a key BOOST_CHECK_NO_THROW(CallRPC("z_getnewaddress")); - + // Verify the key has been added BOOST_CHECK_NO_THROW(retValue = CallRPC("z_listaddresses")); arr = retValue.get_array(); - BOOST_CHECK(arr.size() == n+1); + BOOST_CHECK(arr.size() == n+1); // We can't simulate over RPC the wallet closing and being reloaded // but there are tests for this in gtest. } + + +BOOST_AUTO_TEST_CASE(rpc_z_shieldcoinbase_parameters) +{ + SelectParams(CBaseChainParams::TESTNET); + + LOCK(pwalletMain->cs_wallet); + + BOOST_CHECK_THROW(CallRPC("z_shieldcoinbase"), runtime_error); + BOOST_CHECK_THROW(CallRPC("z_shieldcoinbase toofewargs"), runtime_error); + BOOST_CHECK_THROW(CallRPC("z_shieldcoinbase too many args here"), runtime_error); + + // bad from address + BOOST_CHECK_THROW(CallRPC("z_shieldcoinbase " + "INVALIDtmRr6yJonqGK23UVhrKuyvTpF8qxQQjKigJ tnpoQJVnYBZZqkFadj2bJJLThNCxbADGB5gSGeYTAGGrT5tejsxY9Zc1BtY8nnHmZkB"), runtime_error); + + // bad from address + BOOST_CHECK_THROW(CallRPC("z_shieldcoinbase " + "** tnpoQJVnYBZZqkFadj2bJJLThNCxbADGB5gSGeYTAGGrT5tejsxY9Zc1BtY8nnHmZkB"), runtime_error); + + // bad to address + BOOST_CHECK_THROW(CallRPC("z_shieldcoinbase " + "tmRr6yJonqGK23UVhrKuyvTpF8qxQQjKigJ INVALIDtnpoQJVnYBZZqkFadj2bJJLThNCxbADGB5gSGeYTAGGrT5tejsxY9Zc1BtY8nnHmZkB"), runtime_error); + + // invalid fee amount, cannot be negative + BOOST_CHECK_THROW(CallRPC("z_shieldcoinbase " + "tmRr6yJonqGK23UVhrKuyvTpF8qxQQjKigJ " + "tnpoQJVnYBZZqkFadj2bJJLThNCxbADGB5gSGeYTAGGrT5tejsxY9Zc1BtY8nnHmZkB " + "-0.0001" + ), runtime_error); + + // invalid fee amount, bigger than MAX_MONEY + BOOST_CHECK_THROW(CallRPC("z_shieldcoinbase " + "tmRr6yJonqGK23UVhrKuyvTpF8qxQQjKigJ " + "tnpoQJVnYBZZqkFadj2bJJLThNCxbADGB5gSGeYTAGGrT5tejsxY9Zc1BtY8nnHmZkB " + "21000001" + ), runtime_error); + + // Test constructor of AsyncRPCOperation_sendmany + std::string testnetzaddr = "ztjiDe569DPNbyTE6TSdJTaSDhoXEHLGvYoUnBU1wfVNU52TEyT6berYtySkd21njAeEoh8fFJUT42kua9r8EnhBaEKqCpP"; + std::string mainnetzaddr = "zcMuhvq8sEkHALuSU2i4NbNQxshSAYrpCExec45ZjtivYPbuiFPwk6WHy4SvsbeZ4siy1WheuRGjtaJmoD1J8bFqNXhsG6U"; + + try { + std::shared_ptr operation(new AsyncRPCOperation_shieldcoinbase({}, testnetzaddr, -1 )); + } catch (const UniValue& objError) { + BOOST_CHECK( find_error(objError, "Fee is out of range")); + } + + try { + std::shared_ptr operation(new AsyncRPCOperation_shieldcoinbase({}, testnetzaddr, 1)); + } catch (const UniValue& objError) { + BOOST_CHECK( find_error(objError, "Empty inputs")); + } + + // Testnet payment addresses begin with 'zt'. This test detects an incorrect prefix. + try { + std::vector inputs = { ShieldCoinbaseUTXO{uint256(),0,0} }; + std::shared_ptr operation( new AsyncRPCOperation_shieldcoinbase(inputs, mainnetzaddr, 1) ); + } catch (const UniValue& objError) { + BOOST_CHECK( find_error(objError, "payment address is for wrong network type")); + } + +} + + + +BOOST_AUTO_TEST_CASE(rpc_z_shieldcoinbase_internals) +{ + SelectParams(CBaseChainParams::TESTNET); + + LOCK(pwalletMain->cs_wallet); + + UniValue retValue; + + // Test that option -mempooltxinputlimit is respected. + mapArgs["-mempooltxinputlimit"] = "1"; + + // Add keys manually + CZCPaymentAddress pa = pwalletMain->GenerateNewZKey(); + std::string zaddr = pa.ToString(); + + // Supply 2 inputs when mempool limit is 1 + { + std::vector inputs = { ShieldCoinbaseUTXO{uint256(),0,0}, ShieldCoinbaseUTXO{uint256(),0,0} }; + std::shared_ptr operation( new AsyncRPCOperation_shieldcoinbase(inputs, zaddr) ); + operation->main(); + BOOST_CHECK(operation->isFailed()); + std::string msg = operation->getErrorMessage(); + BOOST_CHECK( msg.find("Number of inputs 2 is greater than mempooltxinputlimit of 1") != string::npos); + } + + // Insufficient funds + { + std::vector inputs = { ShieldCoinbaseUTXO{uint256(),0,0} }; + std::shared_ptr operation( new AsyncRPCOperation_shieldcoinbase(inputs, zaddr) ); + operation->main(); + BOOST_CHECK(operation->isFailed()); + std::string msg = operation->getErrorMessage(); + BOOST_CHECK( msg.find("Insufficient coinbase funds") != string::npos); + } + + // Test the perform_joinsplit methods. + { + // Dummy input so the operation object can be instantiated. + std::vector inputs = { ShieldCoinbaseUTXO{uint256(),0,100000} }; + std::shared_ptr operation( new AsyncRPCOperation_shieldcoinbase(inputs, zaddr) ); + std::shared_ptr ptr = std::dynamic_pointer_cast (operation); + TEST_FRIEND_AsyncRPCOperation_shieldcoinbase proxy(ptr); + static_cast(operation.get())->testmode = true; + + ShieldCoinbaseJSInfo info; + info.vjsin.push_back(JSInput()); + info.vjsin.push_back(JSInput()); + info.vjsin.push_back(JSInput()); + try { + proxy.perform_joinsplit(info); + } catch (const std::runtime_error & e) { + BOOST_CHECK( string(e.what()).find("unsupported joinsplit input")!= string::npos); + } + + info.vjsin.clear(); + try { + proxy.perform_joinsplit(info); + } catch (const std::runtime_error & e) { + BOOST_CHECK( string(e.what()).find("JoinSplit verifying key not loaded")!= string::npos); + } + } + +} + + BOOST_AUTO_TEST_SUITE_END() diff --git a/src/wallet/asyncrpcoperation_shieldcoinbase.cpp b/src/wallet/asyncrpcoperation_shieldcoinbase.cpp new file mode 100644 index 000000000..8c8de21e6 --- /dev/null +++ b/src/wallet/asyncrpcoperation_shieldcoinbase.cpp @@ -0,0 +1,441 @@ +// Copyright (c) 2017 The Zcash developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "asyncrpcqueue.h" +#include "amount.h" +#include "core_io.h" +#include "init.h" +#include "main.h" +#include "net.h" +#include "netbase.h" +#include "rpcserver.h" +#include "timedata.h" +#include "util.h" +#include "utilmoneystr.h" +#include "wallet.h" +#include "walletdb.h" +#include "script/interpreter.h" +#include "utiltime.h" +#include "rpcprotocol.h" +#include "zcash/IncrementalMerkleTree.hpp" +#include "sodium.h" +#include "miner.h" + +#include +#include +#include +#include + +#include "asyncrpcoperation_shieldcoinbase.h" + +using namespace libzcash; + +static int find_output(UniValue obj, int n) { + UniValue outputMapValue = find_value(obj, "outputmap"); + if (!outputMapValue.isArray()) { + throw JSONRPCError(RPC_WALLET_ERROR, "Missing outputmap for JoinSplit operation"); + } + + UniValue outputMap = outputMapValue.get_array(); + assert(outputMap.size() == ZC_NUM_JS_OUTPUTS); + for (size_t i = 0; i < outputMap.size(); i++) { + if (outputMap[i].get_int() == n) { + return i; + } + } + + throw std::logic_error("n is not present in outputmap"); +} + +AsyncRPCOperation_shieldcoinbase::AsyncRPCOperation_shieldcoinbase( + std::vector inputs, + std::string toAddress, + CAmount fee, + UniValue contextInfo) : + inputs_(inputs), fee_(fee), contextinfo_(contextInfo) +{ + if (fee < 0 || fee > MAX_MONEY) { + throw JSONRPCError(RPC_INVALID_PARAMETER, "Fee is out of range"); + } + + if (inputs.size() == 0) { + throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, "Empty inputs"); + } + + // Check the destination address is valid for this network i.e. not testnet being used on mainnet + CZCPaymentAddress address(toAddress); + try { + tozaddr_ = address.Get(); + } catch (const std::runtime_error& e) { + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, string("runtime error: ") + e.what()); + } + + // Log the context info + if (LogAcceptCategory("zrpcunsafe")) { + LogPrint("zrpcunsafe", "%s: z_shieldcoinbase initialized (context=%s)\n", getId(), contextInfo.write()); + } else { + LogPrint("zrpc", "%s: z_shieldcoinbase initialized\n", getId()); + } + + // Lock UTXOs + lock_utxos(); +} + +AsyncRPCOperation_shieldcoinbase::~AsyncRPCOperation_shieldcoinbase() { +} + +void AsyncRPCOperation_shieldcoinbase::main() { + if (isCancelled()) { + unlock_utxos(); // clean up + return; + } + + set_state(OperationStatus::EXECUTING); + start_execution_clock(); + + bool success = false; + +#ifdef ENABLE_MINING + #ifdef ENABLE_WALLET + GenerateBitcoins(false, NULL, 0); + #else + GenerateBitcoins(false, 0); + #endif +#endif + + try { + success = main_impl(); + } catch (const UniValue& objError) { + int code = find_value(objError, "code").get_int(); + std::string message = find_value(objError, "message").get_str(); + set_error_code(code); + set_error_message(message); + } catch (const runtime_error& e) { + set_error_code(-1); + set_error_message("runtime error: " + string(e.what())); + } catch (const logic_error& e) { + set_error_code(-1); + set_error_message("logic error: " + string(e.what())); + } catch (const exception& e) { + set_error_code(-1); + set_error_message("general exception: " + string(e.what())); + } catch (...) { + set_error_code(-2); + set_error_message("unknown error"); + } + +#ifdef ENABLE_MINING + #ifdef ENABLE_WALLET + GenerateBitcoins(GetBoolArg("-gen",false), pwalletMain, GetArg("-genproclimit", 1)); + #else + GenerateBitcoins(GetBoolArg("-gen",false), GetArg("-genproclimit", 1)); + #endif +#endif + + stop_execution_clock(); + + if (success) { + set_state(OperationStatus::SUCCESS); + } else { + set_state(OperationStatus::FAILED); + } + + std::string s = strprintf("%s: z_shieldcoinbase finished (status=%s", getId(), getStateAsString()); + if (success) { + s += strprintf(", txid=%s)\n", tx_.GetHash().ToString()); + } else { + s += strprintf(", error=%s)\n", getErrorMessage()); + } + LogPrintf("%s",s); + + unlock_utxos(); // clean up +} + + +bool AsyncRPCOperation_shieldcoinbase::main_impl() { + + CAmount minersFee = fee_; + + size_t numInputs = inputs_.size(); + + // Check mempooltxinputlimit to avoid creating a transaction which the local mempool rejects + size_t limit = (size_t)GetArg("-mempooltxinputlimit", 0); + if (limit>0 && numInputs > limit) { + throw JSONRPCError(RPC_WALLET_ERROR, + strprintf("Number of inputs %d is greater than mempooltxinputlimit of %d", + numInputs, limit)); + } + + CAmount targetAmount = 0; + for (ShieldCoinbaseUTXO & utxo : inputs_) { + targetAmount += utxo.amount; + } + + if (targetAmount <= minersFee) { + throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, + strprintf("Insufficient coinbase funds, have %s and miners fee is %s", + FormatMoney(targetAmount), FormatMoney(minersFee))); + } + + CAmount sendAmount = targetAmount - minersFee; + LogPrint("zrpc", "%s: spending %s to shield %s with fee %s\n", + getId(), FormatMoney(targetAmount), FormatMoney(sendAmount), FormatMoney(minersFee)); + + // update the transaction with these inputs + CMutableTransaction rawTx(tx_); + for (ShieldCoinbaseUTXO & t : inputs_) { + CTxIn in(COutPoint(t.txid, t.vout)); + rawTx.vin.push_back(in); + } + tx_ = CTransaction(rawTx); + + // Prepare raw transaction to handle JoinSplits + CMutableTransaction mtx(tx_); + mtx.nVersion = 2; + crypto_sign_keypair(joinSplitPubKey_.begin(), joinSplitPrivKey_); + mtx.joinSplitPubKey = joinSplitPubKey_; + tx_ = CTransaction(mtx); + + // Create joinsplit + UniValue obj(UniValue::VOBJ); + ShieldCoinbaseJSInfo info; + info.vpub_old = sendAmount; + info.vpub_new = 0; + JSOutput jso = JSOutput(tozaddr_, sendAmount); + info.vjsout.push_back(jso); + obj = perform_joinsplit(info); + + sign_send_raw_transaction(obj); + return true; +} + + +/** + * Sign and send a raw transaction. + * Raw transaction as hex string should be in object field "rawtxn" + */ +void AsyncRPCOperation_shieldcoinbase::sign_send_raw_transaction(UniValue obj) +{ + // Sign the raw transaction + UniValue rawtxnValue = find_value(obj, "rawtxn"); + if (rawtxnValue.isNull()) { + throw JSONRPCError(RPC_WALLET_ERROR, "Missing hex data for raw transaction"); + } + std::string rawtxn = rawtxnValue.get_str(); + + UniValue params = UniValue(UniValue::VARR); + params.push_back(rawtxn); + UniValue signResultValue = signrawtransaction(params, false); + UniValue signResultObject = signResultValue.get_obj(); + UniValue completeValue = find_value(signResultObject, "complete"); + bool complete = completeValue.get_bool(); + if (!complete) { + // TODO: #1366 Maybe get "errors" and print array vErrors into a string + throw JSONRPCError(RPC_WALLET_ENCRYPTION_FAILED, "Failed to sign transaction"); + } + + UniValue hexValue = find_value(signResultObject, "hex"); + if (hexValue.isNull()) { + throw JSONRPCError(RPC_WALLET_ERROR, "Missing hex data for signed transaction"); + } + std::string signedtxn = hexValue.get_str(); + + // Send the signed transaction + if (!testmode) { + params.clear(); + params.setArray(); + params.push_back(signedtxn); + UniValue sendResultValue = sendrawtransaction(params, false); + if (sendResultValue.isNull()) { + throw JSONRPCError(RPC_WALLET_ERROR, "Send raw transaction did not return an error or a txid."); + } + + std::string txid = sendResultValue.get_str(); + + UniValue o(UniValue::VOBJ); + o.push_back(Pair("txid", txid)); + set_result(o); + } else { + // Test mode does not send the transaction to the network. + + CDataStream stream(ParseHex(signedtxn), SER_NETWORK, PROTOCOL_VERSION); + CTransaction tx; + stream >> tx; + + UniValue o(UniValue::VOBJ); + o.push_back(Pair("test", 1)); + o.push_back(Pair("txid", tx.GetHash().ToString())); + o.push_back(Pair("hex", signedtxn)); + set_result(o); + } + + // Keep the signed transaction so we can hash to the same txid + CDataStream stream(ParseHex(signedtxn), SER_NETWORK, PROTOCOL_VERSION); + CTransaction tx; + stream >> tx; + tx_ = tx; +} + + +UniValue AsyncRPCOperation_shieldcoinbase::perform_joinsplit(ShieldCoinbaseJSInfo & info) { + uint256 anchor = pcoinsTip->GetBestAnchor(); + if (anchor.IsNull()) { + throw std::runtime_error("anchor is null"); + } + + // Make sure there are two inputs and two outputs + while (info.vjsin.size() < ZC_NUM_JS_INPUTS) { + info.vjsin.push_back(JSInput()); + } + + while (info.vjsout.size() < ZC_NUM_JS_OUTPUTS) { + info.vjsout.push_back(JSOutput()); + } + + if (info.vjsout.size() != ZC_NUM_JS_INPUTS || info.vjsin.size() != ZC_NUM_JS_OUTPUTS) { + throw runtime_error("unsupported joinsplit input/output counts"); + } + + CMutableTransaction mtx(tx_); + + LogPrint("zrpcunsafe", "%s: creating joinsplit at index %d (vpub_old=%s, vpub_new=%s, in[0]=%s, in[1]=%s, out[0]=%s, out[1]=%s)\n", + getId(), + tx_.vjoinsplit.size(), + FormatMoney(info.vpub_old), FormatMoney(info.vpub_new), + FormatMoney(info.vjsin[0].note.value), FormatMoney(info.vjsin[1].note.value), + FormatMoney(info.vjsout[0].value), FormatMoney(info.vjsout[1].value) + ); + + // Generate the proof, this can take over a minute. + boost::array inputs + {info.vjsin[0], info.vjsin[1]}; + boost::array outputs + {info.vjsout[0], info.vjsout[1]}; + boost::array inputMap; + boost::array outputMap; + JSDescription jsdesc = JSDescription::Randomized( + *pzcashParams, + joinSplitPubKey_, + anchor, + inputs, + outputs, + inputMap, + outputMap, + info.vpub_old, + info.vpub_new, + !this->testmode); + + { + auto verifier = libzcash::ProofVerifier::Strict(); + if (!(jsdesc.Verify(*pzcashParams, verifier, joinSplitPubKey_))) { + throw std::runtime_error("error verifying joinsplit"); + } + } + + mtx.vjoinsplit.push_back(jsdesc); + + // Empty output script. + CScript scriptCode; + CTransaction signTx(mtx); + uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL); + + // Add the signature + if (!(crypto_sign_detached(&mtx.joinSplitSig[0], NULL, + dataToBeSigned.begin(), 32, + joinSplitPrivKey_ + ) == 0)) + { + throw std::runtime_error("crypto_sign_detached failed"); + } + + // Sanity check + if (!(crypto_sign_verify_detached(&mtx.joinSplitSig[0], + dataToBeSigned.begin(), 32, + mtx.joinSplitPubKey.begin() + ) == 0)) + { + throw std::runtime_error("crypto_sign_verify_detached failed"); + } + + CTransaction rawTx(mtx); + tx_ = rawTx; + + CDataStream ss(SER_NETWORK, PROTOCOL_VERSION); + ss << rawTx; + + std::string encryptedNote1; + std::string encryptedNote2; + { + CDataStream ss2(SER_NETWORK, PROTOCOL_VERSION); + ss2 << ((unsigned char) 0x00); + ss2 << jsdesc.ephemeralKey; + ss2 << jsdesc.ciphertexts[0]; + ss2 << jsdesc.h_sig(*pzcashParams, joinSplitPubKey_); + + encryptedNote1 = HexStr(ss2.begin(), ss2.end()); + } + { + CDataStream ss2(SER_NETWORK, PROTOCOL_VERSION); + ss2 << ((unsigned char) 0x01); + ss2 << jsdesc.ephemeralKey; + ss2 << jsdesc.ciphertexts[1]; + ss2 << jsdesc.h_sig(*pzcashParams, joinSplitPubKey_); + + encryptedNote2 = HexStr(ss2.begin(), ss2.end()); + } + + UniValue arrInputMap(UniValue::VARR); + UniValue arrOutputMap(UniValue::VARR); + for (size_t i = 0; i < ZC_NUM_JS_INPUTS; i++) { + arrInputMap.push_back(inputMap[i]); + } + for (size_t i = 0; i < ZC_NUM_JS_OUTPUTS; i++) { + arrOutputMap.push_back(outputMap[i]); + } + + UniValue obj(UniValue::VOBJ); + obj.push_back(Pair("encryptednote1", encryptedNote1)); + obj.push_back(Pair("encryptednote2", encryptedNote2)); + obj.push_back(Pair("rawtxn", HexStr(ss.begin(), ss.end()))); + obj.push_back(Pair("inputmap", arrInputMap)); + obj.push_back(Pair("outputmap", arrOutputMap)); + return obj; +} + +/** + * Override getStatus() to append the operation's context object to the default status object. + */ +UniValue AsyncRPCOperation_shieldcoinbase::getStatus() const { + UniValue v = AsyncRPCOperation::getStatus(); + if (contextinfo_.isNull()) { + return v; + } + + UniValue obj = v.get_obj(); + obj.push_back(Pair("method", "z_shieldcoinbase")); + obj.push_back(Pair("params", contextinfo_ )); + return obj; +} + +/** + * Lock input utxos + */ + void AsyncRPCOperation_shieldcoinbase::lock_utxos() { + LOCK2(cs_main, pwalletMain->cs_wallet); + for (auto utxo : inputs_) { + COutPoint outpt(utxo.txid, utxo.vout); + pwalletMain->LockCoin(outpt); + } +} + +/** + * Unlock input utxos + */ +void AsyncRPCOperation_shieldcoinbase::unlock_utxos() { + LOCK2(cs_main, pwalletMain->cs_wallet); + for (auto utxo : inputs_) { + COutPoint outpt(utxo.txid, utxo.vout); + pwalletMain->UnlockCoin(outpt); + } +} diff --git a/src/wallet/asyncrpcoperation_shieldcoinbase.h b/src/wallet/asyncrpcoperation_shieldcoinbase.h new file mode 100644 index 000000000..981b2fbe9 --- /dev/null +++ b/src/wallet/asyncrpcoperation_shieldcoinbase.h @@ -0,0 +1,122 @@ +// Copyright (c) 2017 The Zcash developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef ASYNCRPCOPERATION_SHIELDCOINBASE_H +#define ASYNCRPCOPERATION_SHIELDCOINBASE_H + +#include "asyncrpcoperation.h" +#include "amount.h" +#include "base58.h" +#include "primitives/transaction.h" +#include "zcash/JoinSplit.hpp" +#include "zcash/Address.hpp" +#include "wallet.h" + +#include +#include + +#include + +// Default transaction fee if caller does not specify one. +#define SHIELD_COINBASE_DEFAULT_MINERS_FEE 10000 + +using namespace libzcash; + +struct ShieldCoinbaseUTXO { + uint256 txid; + int vout; + CAmount amount; +}; + +// Package of info which is passed to perform_joinsplit methods. +struct ShieldCoinbaseJSInfo +{ + std::vector vjsin; + std::vector vjsout; + CAmount vpub_old = 0; + CAmount vpub_new = 0; +}; + +class AsyncRPCOperation_shieldcoinbase : public AsyncRPCOperation { +public: + AsyncRPCOperation_shieldcoinbase(std::vector inputs, std::string toAddress, CAmount fee = SHIELD_COINBASE_DEFAULT_MINERS_FEE, UniValue contextInfo = NullUniValue); + virtual ~AsyncRPCOperation_shieldcoinbase(); + + // We don't want to be copied or moved around + AsyncRPCOperation_shieldcoinbase(AsyncRPCOperation_shieldcoinbase const&) = delete; // Copy construct + AsyncRPCOperation_shieldcoinbase(AsyncRPCOperation_shieldcoinbase&&) = delete; // Move construct + AsyncRPCOperation_shieldcoinbase& operator=(AsyncRPCOperation_shieldcoinbase const&) = delete; // Copy assign + AsyncRPCOperation_shieldcoinbase& operator=(AsyncRPCOperation_shieldcoinbase &&) = delete; // Move assign + + virtual void main(); + + virtual UniValue getStatus() const; + + bool testmode = false; // Set to true to disable sending txs and generating proofs + +private: + friend class TEST_FRIEND_AsyncRPCOperation_shieldcoinbase; // class for unit testing + + UniValue contextinfo_; // optional data to include in return value from getStatus() + + CAmount fee_; + PaymentAddress tozaddr_; + + uint256 joinSplitPubKey_; + unsigned char joinSplitPrivKey_[crypto_sign_SECRETKEYBYTES]; + + std::vector inputs_; + + CTransaction tx_; + + bool main_impl(); + + // JoinSplit without any input notes to spend + UniValue perform_joinsplit(ShieldCoinbaseJSInfo &); + + void sign_send_raw_transaction(UniValue obj); // throws exception if there was an error + + void lock_utxos(); + + void unlock_utxos(); +}; + + +// To test private methods, a friend class can act as a proxy +class TEST_FRIEND_AsyncRPCOperation_shieldcoinbase { +public: + std::shared_ptr delegate; + + TEST_FRIEND_AsyncRPCOperation_shieldcoinbase(std::shared_ptr ptr) : delegate(ptr) {} + + CTransaction getTx() { + return delegate->tx_; + } + + void setTx(CTransaction tx) { + delegate->tx_ = tx; + } + + // Delegated methods + + bool main_impl() { + return delegate->main_impl(); + } + + UniValue perform_joinsplit(ShieldCoinbaseJSInfo &info) { + return delegate->perform_joinsplit(info); + } + + void sign_send_raw_transaction(UniValue obj) { + delegate->sign_send_raw_transaction(obj); + } + + void set_state(OperationStatus state) { + delegate->state_.store(state); + } +}; + + +#endif /* ASYNCRPCOPERATION_SHIELDCOINBASE_H */ + diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 112e05d89..4526b665c 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -24,6 +24,7 @@ #include "asyncrpcoperation.h" #include "asyncrpcqueue.h" #include "wallet/asyncrpcoperation_sendmany.h" +#include "wallet/asyncrpcoperation_shieldcoinbase.h" #include "sodium.h" @@ -3494,6 +3495,182 @@ UniValue z_sendmany(const UniValue& params, bool fHelp) } +/** +When estimating the number of coinbase utxos we can shield in a single transaction: +1. Joinsplit description is 1802 bytes. +2. Transaction overhead ~ 100 bytes +3. Spending a typical P2PKH is >=148 bytes, as defined in CTXIN_SPEND_DUST_SIZE. +4. Spending a multi-sig P2SH address can vary greatly: + https://github.com/bitcoin/bitcoin/blob/c3ad56f4e0b587d8d763af03d743fdfc2d180c9b/src/main.cpp#L517 + In real-world coinbase utxos, we consider a 3-of-3 multisig, where the size is roughly: + (3*(33+1))+3 = 105 byte redeem script + 105 + 1 + 3*(73+1) = 328 bytes of scriptSig, rounded up to 400 based on testnet experiments. +*/ +#define CTXIN_SPEND_P2SH_SIZE 400 + +UniValue z_shieldcoinbase(const UniValue& params, bool fHelp) +{ + if (!EnsureWalletIsAvailable(fHelp)) + return NullUniValue; + + if (fHelp || params.size() < 2 || params.size() > 3) + throw runtime_error( + "z_shieldcoinbase \"fromaddress\" \"tozaddress\" ( fee )\n" + "\nShield transparent coinbase funds by sending to a shielded zaddr. This is an asynchronous operation and utxos" + "\nselected for shielding will be locked. If there is an error, they are unlocked. The RPC call `listlockunspent`" + "\ncan be used to return a list of locked utxos. The number of coinbase utxos selected for shielding is limited by" + "\nboth the -mempooltxinputlimit=xxx option and a consensus rule defining a maximum transaction size of " + + strprintf("%d bytes.", MAX_TX_SIZE) + + HelpRequiringPassphrase() + "\n" + "\nArguments:\n" + "1. \"fromaddress\" (string, required) The address is a taddr or \"*\" for all taddrs belonging to the wallet.\n" + "2. \"toaddress\" (string, required) The address is a zaddr.\n" + "3. fee (numeric, optional, default=" + + strprintf("%s", FormatMoney(SHIELD_COINBASE_DEFAULT_MINERS_FEE)) + ") The fee amount to attach to this transaction.\n" + "\nResult:\n" + "{\n" + " \"operationid\": xxx (string) An operationid to pass to z_getoperationstatus to get the result of the operation.\n" + " \"shieldedUTXOs\": xxx (numeric) Number of coinbase utxos being shielded.\n" + " \"shieldedValue\": xxx (numeric) Value of coinbase utxos being shielded.\n" + " \"remainingUTXOs\": xxx (numeric) Number of coinbase utxos still available for shielding.\n" + " \"remainingValue\": xxx (numeric) Value of coinbase utxos still available for shielding.\n" + "}\n" + ); + + LOCK2(cs_main, pwalletMain->cs_wallet); + + // Validate the from address + auto fromaddress = params[0].get_str(); + bool isFromWildcard = fromaddress == "*"; + CBitcoinAddress taddr; + if (!isFromWildcard) { + taddr = CBitcoinAddress(fromaddress); + if (!taddr.IsValid()) { + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid from address, should be a taddr or \"*\"."); + } + } + + // Validate the destination address + auto destaddress = params[1].get_str(); + try { + CZCPaymentAddress pa(destaddress); + libzcash::PaymentAddress zaddr = pa.Get(); + } catch (const std::runtime_error&) { + throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid parameter, unknown address format: ") + destaddress ); + } + + // Convert fee from currency format to zatoshis + CAmount nFee = SHIELD_COINBASE_DEFAULT_MINERS_FEE; + if (params.size() > 2) { + if (params[2].get_real() == 0.0) { + nFee = 0; + } else { + nFee = AmountFromValue( params[2] ); + } + } + + // Prepare to get coinbase utxos + std::vector inputs; + CAmount shieldedValue = 0; + CAmount remainingValue = 0; + size_t estimatedTxSize = 2000; // 1802 joinsplit description + tx overhead + wiggle room + size_t utxoCounter = 0; + bool maxedOutFlag = false; + size_t mempoolLimit = (size_t)GetArg("-mempooltxinputlimit", 0); + + // Set of addresses to filter utxos by + set setAddress = {}; + if (!isFromWildcard) { + setAddress.insert(taddr); + } + + // Get available utxos + vector vecOutputs; + pwalletMain->AvailableCoins(vecOutputs, true, NULL, false, true); + + // Find unspent coinbase utxos and update estimated size + BOOST_FOREACH(const COutput& out, vecOutputs) { + if (!out.fSpendable) { + continue; + } + + CTxDestination address; + if (!ExtractDestination(out.tx->vout[out.i].scriptPubKey, address)) { + continue; + } + // If taddr is not wildcard "*", filter utxos + if (setAddress.size()>0 && !setAddress.count(address)) { + continue; + } + + if (!out.tx->IsCoinBase()) { + continue; + } + + utxoCounter++; + CAmount nValue = out.tx->vout[out.i].nValue; + + if (!maxedOutFlag) { + CBitcoinAddress ba(address); + size_t increase = (ba.IsScript()) ? CTXIN_SPEND_P2SH_SIZE : CTXIN_SPEND_DUST_SIZE; + if (estimatedTxSize + increase >= MAX_TX_SIZE || + (mempoolLimit > 0 && utxoCounter > mempoolLimit)) + { + maxedOutFlag = true; + } else { + estimatedTxSize += increase; + ShieldCoinbaseUTXO utxo = {out.tx->GetHash(), out.i, nValue}; + inputs.push_back(utxo); + shieldedValue += nValue; + } + } + + if (maxedOutFlag) { + remainingValue += nValue; + } + } + + size_t numUtxos = inputs.size(); + + if (numUtxos == 0) { + throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, "Could not find any coinbase funds to shield."); + } + + if (shieldedValue < nFee) { + throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, + strprintf("Insufficient coinbase funds, have %s, which is less than miners fee %s", + FormatMoney(shieldedValue), FormatMoney(nFee))); + } + + // Check that the user specified fee is sane (if too high, it can result in error -25 absurd fee) + CAmount netAmount = shieldedValue - nFee; + if (nFee > netAmount) { + throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Fee %s is greater than the net amount to be shielded %s", FormatMoney(nFee), FormatMoney(netAmount))); + } + + // Keep record of parameters in context object + UniValue contextInfo(UniValue::VOBJ); + contextInfo.push_back(Pair("fromaddress", params[0])); + contextInfo.push_back(Pair("toaddress", params[1])); + contextInfo.push_back(Pair("fee", ValueFromAmount(nFee))); + + // Create operation and add to global queue + std::shared_ptr q = getAsyncRPCQueue(); + std::shared_ptr operation( new AsyncRPCOperation_shieldcoinbase(inputs, destaddress, nFee, contextInfo) ); + q->addOperation(operation); + AsyncRPCOperationId operationId = operation->getId(); + + // Return continuation information + UniValue o(UniValue::VOBJ); + o.push_back(Pair("remainingUTXOs", utxoCounter - numUtxos)); + o.push_back(Pair("remainingValue", ValueFromAmount(remainingValue))); + o.push_back(Pair("shieldingUTXOs", numUtxos)); + o.push_back(Pair("shieldingValue", ValueFromAmount(shieldedValue))); + o.push_back(Pair("opid", operationId)); + return o; +} + + UniValue z_listoperationids(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) From 39cb7df90911c030b077e68be953e01ebd89d13f Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Sat, 23 Sep 2017 10:42:23 +0100 Subject: [PATCH 0210/1062] make-release.py: Versioning changes for 1.0.12-rc1. --- README.md | 2 +- configure.ac | 4 ++-- contrib/gitian-descriptors/gitian-linux.yml | 2 +- src/clientversion.h | 4 ++-- src/deprecation.h | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 818fd4380..78e02233a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Zcash 1.0.11 +Zcash 1.0.12-rc1 ============= What is Zcash? diff --git a/configure.ac b/configure.ac index a94e0dbd7..5831cb63f 100644 --- a/configure.ac +++ b/configure.ac @@ -2,8 +2,8 @@ dnl require autoconf 2.60 (AS_ECHO/AS_ECHO_N) AC_PREREQ([2.60]) define(_CLIENT_VERSION_MAJOR, 1) define(_CLIENT_VERSION_MINOR, 0) -define(_CLIENT_VERSION_REVISION, 11) -define(_CLIENT_VERSION_BUILD, 50) +define(_CLIENT_VERSION_REVISION, 12) +define(_CLIENT_VERSION_BUILD, 25) define(_ZC_BUILD_VAL, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, m4_incr(_CLIENT_VERSION_BUILD), m4_eval(_CLIENT_VERSION_BUILD < 50), 1, m4_eval(_CLIENT_VERSION_BUILD - 24), m4_eval(_CLIENT_VERSION_BUILD == 50), 1, , m4_eval(_CLIENT_VERSION_BUILD - 50))) define(_CLIENT_VERSION_SUFFIX, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, _CLIENT_VERSION_REVISION-beta$1, m4_eval(_CLIENT_VERSION_BUILD < 50), 1, _CLIENT_VERSION_REVISION-rc$1, m4_eval(_CLIENT_VERSION_BUILD == 50), 1, _CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION-$1))) define(_CLIENT_VERSION_IS_RELEASE, true) diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml index 892de5287..c53211d0f 100644 --- a/contrib/gitian-descriptors/gitian-linux.yml +++ b/contrib/gitian-descriptors/gitian-linux.yml @@ -1,5 +1,5 @@ --- -name: "zcash-1.0.11" +name: "zcash-1.0.12-rc1" enable_cache: true distro: "debian" suites: diff --git a/src/clientversion.h b/src/clientversion.h index 61813106f..98ab18336 100644 --- a/src/clientversion.h +++ b/src/clientversion.h @@ -17,8 +17,8 @@ //! These need to be macros, as clientversion.cpp's and bitcoin*-res.rc's voodoo requires it #define CLIENT_VERSION_MAJOR 1 #define CLIENT_VERSION_MINOR 0 -#define CLIENT_VERSION_REVISION 11 -#define CLIENT_VERSION_BUILD 50 +#define CLIENT_VERSION_REVISION 12 +#define CLIENT_VERSION_BUILD 25 //! Set to true for release, false for prerelease or test build #define CLIENT_VERSION_IS_RELEASE true diff --git a/src/deprecation.h b/src/deprecation.h index 78e15380e..19c63bdf2 100644 --- a/src/deprecation.h +++ b/src/deprecation.h @@ -8,7 +8,7 @@ // Deprecation policy: // * Shut down 18 weeks' worth of blocks after the estimated release block height. // * A warning is shown during the 2 weeks' worth of blocks prior to shut down. -static const int APPROX_RELEASE_HEIGHT = 167200; +static const int APPROX_RELEASE_HEIGHT = 189600; static const int WEEKS_UNTIL_DEPRECATION = 18; static const int DEPRECATION_HEIGHT = APPROX_RELEASE_HEIGHT + (WEEKS_UNTIL_DEPRECATION * 7 * 24 * 24); From 94183b63600c8959c56ce4cba642bc3d620b1c42 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Sat, 23 Sep 2017 10:50:00 +0100 Subject: [PATCH 0211/1062] make-release.py: Updated manpages for 1.0.12-rc1. --- doc/man/zcash-cli.1 | 6 +++--- doc/man/zcash-tx.1 | 6 +++--- doc/man/zcashd.1 | 18 +++++++++--------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/doc/man/zcash-cli.1 b/doc/man/zcash-cli.1 index 398f8feea..e8f42c702 100644 --- a/doc/man/zcash-cli.1 +++ b/doc/man/zcash-cli.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASH-CLI "1" "August 2017" "zcash-cli v1.0.11" "User Commands" +.TH ZCASH-CLI "1" "September 2017" "zcash-cli v1.0.12-rc1" "User Commands" .SH NAME -zcash-cli \- manual page for zcash-cli v1.0.11 +zcash-cli \- manual page for zcash-cli v1.0.12-rc1 .SH DESCRIPTION -Zcash RPC client version v1.0.11 +Zcash RPC client version v1.0.12\-rc1 .PP In order to ensure you are adequately protecting your privacy when using Zcash, please see . diff --git a/doc/man/zcash-tx.1 b/doc/man/zcash-tx.1 index f40e4a345..9f1832090 100644 --- a/doc/man/zcash-tx.1 +++ b/doc/man/zcash-tx.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASH-TX "1" "August 2017" "zcash-tx v1.0.11" "User Commands" +.TH ZCASH-TX "1" "September 2017" "zcash-tx v1.0.12-rc1" "User Commands" .SH NAME -zcash-tx \- manual page for zcash-tx v1.0.11 +zcash-tx \- manual page for zcash-tx v1.0.12-rc1 .SH DESCRIPTION -Zcash zcash\-tx utility version v1.0.11 +Zcash zcash\-tx utility version v1.0.12\-rc1 .SS "Usage:" .TP zcash\-tx [options] [commands] diff --git a/doc/man/zcashd.1 b/doc/man/zcashd.1 index df1a35b14..f34c45066 100644 --- a/doc/man/zcashd.1 +++ b/doc/man/zcashd.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASHD "1" "August 2017" "zcashd v1.0.11" "User Commands" +.TH ZCASHD "1" "September 2017" "zcashd v1.0.12-rc1" "User Commands" .SH NAME -zcashd \- manual page for zcashd v1.0.11 +zcashd \- manual page for zcashd v1.0.12-rc1 .SH DESCRIPTION -Zcash Daemon version v1.0.11 +Zcash Daemon version v1.0.12\-rc1 .PP In order to ensure you are adequately protecting your privacy when using Zcash, please see . @@ -54,7 +54,7 @@ Specify data directory \fB\-disabledeprecation=\fR .IP Disable block\-height node deprecation and automatic shutdown (example: -\fB\-disabledeprecation\fR=\fI\,1\/\fR.0.11) +\fB\-disabledeprecation\fR=\fI\,1\/\fR.0.12\-rc1) .HP \fB\-exportdir=\fR .IP @@ -241,11 +241,11 @@ Set key pool size to (default: 100) .HP \fB\-paytxfee=\fR .IP -Fee (in BTC/kB) to add to transactions you send (default: 0.00) +Fee (in ZEC/kB) to add to transactions you send (default: 0.00) .HP \fB\-rescan\fR .IP -Rescan the blockchain for missing wallet transactions on startup +Rescan the block chain for missing wallet transactions on startup .HP \fB\-salvagewallet\fR .IP @@ -266,8 +266,8 @@ confirmation on average within n blocks (default: 2) .HP \fB\-maxtxfee=\fR .IP -Maximum total fees to use in a single wallet transaction; setting this -too low may abort large transactions (default: 0.10) +Maximum total fees (in ZEC) to use in a single wallet transaction; +setting this too low may abort large transactions (default: 0.10) .HP \fB\-upgradewallet\fR .IP @@ -339,7 +339,7 @@ Prepend debug output with timestamp (default: 1) .HP \fB\-minrelaytxfee=\fR .IP -Fees (in BTC/Kb) smaller than this are considered zero fee for relaying +Fees (in ZEC/kB) smaller than this are considered zero fee for relaying (default: 0.000001) .HP \fB\-printtoconsole\fR From 29a2ee49587d9c088d59dfcc0bf69c1cb3ec704a Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Sat, 23 Sep 2017 10:51:36 +0100 Subject: [PATCH 0212/1062] make-release.py: Updated release notes and changelog for 1.0.12-rc1. --- contrib/debian/changelog | 6 ++ doc/authors.md | 13 +++-- doc/release-notes/release-notes-1.0.12-rc1.md | 57 +++++++++++++++++++ 3 files changed, 72 insertions(+), 4 deletions(-) create mode 100644 doc/release-notes/release-notes-1.0.12-rc1.md diff --git a/contrib/debian/changelog b/contrib/debian/changelog index 1da00f690..9837f656f 100644 --- a/contrib/debian/changelog +++ b/contrib/debian/changelog @@ -1,3 +1,9 @@ +zcash (1.0.12~rc1) stable; urgency=medium + + * 1.0.12-rc1 release. + + -- Zcash Company Sat, 23 Sep 2017 10:51:36 +0100 + zcash (1.0.11) stable; urgency=medium * 1.0.11 release. diff --git a/doc/authors.md b/doc/authors.md index 8d3010dc6..93a30c1c2 100644 --- a/doc/authors.md +++ b/doc/authors.md @@ -1,13 +1,13 @@ Zcash Contributors ================== -Jack Grigg (445) -Simon Liu (269) +Jack Grigg (465) +Simon Liu (272) Sean Bowe (188) Daira Hopwood (102) Taylor Hornby (65) Wladimir J. van der Laan (61) -Nathan Wilcox (51) +Nathan Wilcox (56) Jay Graber (49) Jonas Schnelli (48) Kevin Gallagher (38) @@ -30,9 +30,11 @@ Daniel Cousens (4) lpescher (3) kozyilmaz (3) Pavel Janík (3) +Ariel Gabizon (3) Alfie John (3) str4d (2) paveljanik (2) +kpcyrd (2) aniemerg (2) Scott (2) Robert C. Seacord (2) @@ -42,7 +44,7 @@ Joe Turgeon (2) Jack Gavigan (2) ITH4Coinomia (2) Gavin Andresen (2) -Ariel Gabizon (2) +Bjorn Hjortsberg (2) Amgad Abdelhafez (2) zathras-crypto (1) unsystemizer (1) @@ -59,6 +61,7 @@ ayleph (1) Tom Ritter (1) Stephen (1) S. Matthew English (1) +Ross Nicoll (1) Pavel Vasin (1) Paul Georgiou (1) Paragon Initiative Enterprises, LLC (1) @@ -71,6 +74,7 @@ Lars-Magnus Skog (1) Kevin Pan (1) Jorge Timón (1) Jeffrey Walton (1) +Jason Davies (1) Ian Kelling (1) Gaurav Rana (1) Forrest Voight (1) @@ -86,6 +90,7 @@ Bryan Stitt (1) Boris Hajduk (1) Bob McElrath (1) Bitcoin Error Log (1) +Ariel (1) Allan Niemerg (1) Alex van der Peet (1) Alex (1) diff --git a/doc/release-notes/release-notes-1.0.12-rc1.md b/doc/release-notes/release-notes-1.0.12-rc1.md new file mode 100644 index 000000000..27d36b7e7 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.12-rc1.md @@ -0,0 +1,57 @@ +Changelog +========= + +Ariel (1): + add examples to z_getoperationresult + +Ariel Gabizon (1): + add load-wallet benchmark + +Bjorn Hjortsberg (2): + Do not warn on built in declaration mismatch + Remove deprecated exception specification + +Jack Grigg (20): + ci-workers: Enable pipelining, and use root to set admin and host details + Variable overrides for Arch Linux + Rationalize currency unit to "ZEC" + ci-workers: Fail if Python is not version 2.7 + ci-workers: Variable overrides and process tweaks for CentOS 7 + Add build progress to the release script if progressbar module is available + Add hotfix support to release script + Document the hotfix release process + Enforce sequential hotfix versioning + Benchmark time to call sendtoaddress with many UTXOs + Fix bug in benchmark data generation script + Adjust instructions for UTXO dataset creation + Add GitHub release notes to release process + Clarify branching and force-building operations in hotfix process + Update user guide translations as part of release process + make-release.py: Send stderr to stdout + List dependencies for release script in release process doc + Additional test cases for importprivkey RPC test + make-release.py: Versioning changes for 1.0.12-rc1. + make-release.py: Updated manpages for 1.0.12-rc1. + +Jason Davies (1): + Fix deprecation policy comment. + +Nathan Wilcox (5): + key_import_export rpc-test: verify that UTXO view co-evolves for nodes sharing a key. + Add a new rpc-test-specified requirement: `importprivkey` outputs the associated address. (Test fails.) + [tests pass] Output address on new key import. + Add a new requirement that `importprivkey` API is idempotent. + [tests pass] Ensure `importprivkey` outputs the address in case key is already imported. + +Ross Nicoll (1): + Rationalize currency unit to "BTC" + +Simon Liu (3): + Closes #2583. Exclude watch-only utxos from z_sendmany coin selection. + Set up a clean chain. Delete redundant method wait_until_miner_sees() via use of sync_all(). + Implement RPC shield_coinbase #2448. + +kpcyrd (2): + Fetch params from ipfs if possible + Prefer wget over ipfs + From b85008e78603209ec01222362ede57ee253591a8 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 26 Sep 2017 10:13:03 -0700 Subject: [PATCH 0213/1062] Update which lock to synchronize on when calling GetBestAnchor(). --- src/wallet/asyncrpcoperation_sendmany.cpp | 2 +- src/wallet/asyncrpcoperation_shieldcoinbase.cpp | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/wallet/asyncrpcoperation_sendmany.cpp b/src/wallet/asyncrpcoperation_sendmany.cpp index 89b43c7b3..b4e831d57 100644 --- a/src/wallet/asyncrpcoperation_sendmany.cpp +++ b/src/wallet/asyncrpcoperation_sendmany.cpp @@ -878,7 +878,7 @@ UniValue AsyncRPCOperation_sendmany::perform_joinsplit(AsyncJoinSplitInfo & info std::vector> witnesses; uint256 anchor; { - LOCK2(cs_main, pwalletMain->cs_wallet); + LOCK(cs_main); anchor = pcoinsTip->GetBestAnchor(); // As there are no inputs, ask the wallet for the best anchor } return perform_joinsplit(info, witnesses, anchor); diff --git a/src/wallet/asyncrpcoperation_shieldcoinbase.cpp b/src/wallet/asyncrpcoperation_shieldcoinbase.cpp index 8c8de21e6..20d659cc2 100644 --- a/src/wallet/asyncrpcoperation_shieldcoinbase.cpp +++ b/src/wallet/asyncrpcoperation_shieldcoinbase.cpp @@ -279,7 +279,12 @@ void AsyncRPCOperation_shieldcoinbase::sign_send_raw_transaction(UniValue obj) UniValue AsyncRPCOperation_shieldcoinbase::perform_joinsplit(ShieldCoinbaseJSInfo & info) { - uint256 anchor = pcoinsTip->GetBestAnchor(); + uint256 anchor; + { + LOCK(cs_main); + anchor = pcoinsTip->GetBestAnchor(); + } + if (anchor.IsNull()) { throw std::runtime_error("anchor is null"); } From f897e075c2f9afb048f1b1f4847883f04e041cdb Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 27 Sep 2017 17:24:19 +0100 Subject: [PATCH 0214/1062] Fix pyflakes warnings in RPC tests --- qa/rpc-tests/key_import_export.py | 5 ++--- qa/rpc-tests/wallet_shieldcoinbase.py | 7 +++---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/qa/rpc-tests/key_import_export.py b/qa/rpc-tests/key_import_export.py index 3f075bc76..87b2daa2b 100755 --- a/qa/rpc-tests/key_import_export.py +++ b/qa/rpc-tests/key_import_export.py @@ -3,10 +3,9 @@ # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. -from time import sleep from decimal import Decimal from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import assert_equal, assert_greater_than, sync_blocks, start_nodes, initialize_chain_clean, connect_nodes_bi +from test_framework.util import assert_equal, assert_greater_than, start_nodes, initialize_chain_clean, connect_nodes_bi import logging @@ -32,7 +31,7 @@ class KeyImportExportTest (BitcoinTestFramework): [alice, bob, charlie, miner] = self.nodes def alice_to_bob(amount): - txid = alice.sendtoaddress(addr, Decimal(amount)) + alice.sendtoaddress(addr, Decimal(amount)) self.sync_all() miner.generate(1) self.sync_all() diff --git a/qa/rpc-tests/wallet_shieldcoinbase.py b/qa/rpc-tests/wallet_shieldcoinbase.py index 7d2d63e62..d0e4bb122 100755 --- a/qa/rpc-tests/wallet_shieldcoinbase.py +++ b/qa/rpc-tests/wallet_shieldcoinbase.py @@ -8,7 +8,6 @@ from test_framework.authproxy import JSONRPCException from test_framework.util import assert_equal, initialize_chain_clean, \ start_node, connect_nodes_bi, sync_blocks -import sys import time from decimal import Decimal @@ -117,7 +116,7 @@ class WalletShieldCoinbaseTest (BitcoinTestFramework): # Shield coinbase utxos from node 0 of value 40, standard fee of 0.00010000 result = self.nodes[0].z_shieldcoinbase(mytaddr, myzaddr) - mytxid = self.wait_and_assert_operationid_status(0, result['opid']) + self.wait_and_assert_operationid_status(0, result['opid']) self.sync_all() self.nodes[1].generate(1) self.sync_all() @@ -131,7 +130,7 @@ class WalletShieldCoinbaseTest (BitcoinTestFramework): # Shield coinbase utxos from any node 2 taddr, and set fee to 0 result = self.nodes[2].z_shieldcoinbase("*", myzaddr, 0) - mytxid = self.wait_and_assert_operationid_status(2, result['opid']) + self.wait_and_assert_operationid_status(2, result['opid']) self.sync_all() self.nodes[1].generate(1) self.sync_all() @@ -181,7 +180,7 @@ class WalletShieldCoinbaseTest (BitcoinTestFramework): result = self.nodes[2].z_shieldcoinbase(mytaddr, myzaddr, 0) assert_equal(result["shieldingUTXOs"], Decimal('7')) assert_equal(result["remainingUTXOs"], Decimal('13')) - mytxid = self.wait_and_assert_operationid_status(2, result['opid']) + self.wait_and_assert_operationid_status(2, result['opid']) self.sync_all() self.nodes[1].generate(1) self.sync_all() From 5023af7bd5fc8c147e6fd111b610bd8922e91131 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 27 Sep 2017 10:27:50 -0700 Subject: [PATCH 0215/1062] Closes #2637. Make z_shieldcoinbase an experimental feature where it can be enabled with: zcashd -experimentalfeatures -zshieldcoinbase. --- qa/rpc-tests/wallet_shieldcoinbase.py | 4 ++-- src/init.cpp | 2 ++ src/wallet/rpcwallet.cpp | 11 +++++++++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/qa/rpc-tests/wallet_shieldcoinbase.py b/qa/rpc-tests/wallet_shieldcoinbase.py index 7d2d63e62..e4990cd9f 100755 --- a/qa/rpc-tests/wallet_shieldcoinbase.py +++ b/qa/rpc-tests/wallet_shieldcoinbase.py @@ -19,11 +19,11 @@ class WalletShieldCoinbaseTest (BitcoinTestFramework): initialize_chain_clean(self.options.tmpdir, 4) def setup_network(self, split=False): - args = ['-regtestprotectcoinbase', '-debug=zrpcunsafe'] + args = ['-regtestprotectcoinbase', '-debug=zrpcunsafe', '-experimentalfeatures', '-zshieldcoinbase'] self.nodes = [] self.nodes.append(start_node(0, self.options.tmpdir, args)) self.nodes.append(start_node(1, self.options.tmpdir, args)) - args2 = ['-regtestprotectcoinbase', '-debug=zrpcunsafe', "-mempooltxinputlimit=7"] + args2 = ['-regtestprotectcoinbase', '-debug=zrpcunsafe', '-experimentalfeatures', '-zshieldcoinbase', "-mempooltxinputlimit=7"] self.nodes.append(start_node(2, self.options.tmpdir, args2)) connect_nodes_bi(self.nodes,0,1) connect_nodes_bi(self.nodes,1,2) diff --git a/src/init.cpp b/src/init.cpp index 84f64dc07..3797e806d 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -790,6 +790,8 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) if (!fExperimentalMode) { if (mapArgs.count("-developerencryptwallet")) { return InitError(_("Wallet encryption requires -experimentalfeatures.")); + } else if (mapArgs.count("-zshieldcoinbase")) { + return InitError(_("RPC call z_shieldcoinbase requires -experimentalfeatures.")); } } diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 38bf7a274..55669f74f 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -3525,9 +3525,16 @@ UniValue z_shieldcoinbase(const UniValue& params, bool fHelp) if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; + bool fEnableShieldCoinbase = fExperimentalMode && GetBoolArg("-zshieldcoinbase", false); + std::string strDisabledMsg = ""; + if (!fEnableShieldCoinbase) { + strDisabledMsg = "\nWARNING: z_shieldcoinbase is DISABLED but can be enabled as an experimental feature.\n"; + } + if (fHelp || params.size() < 2 || params.size() > 3) throw runtime_error( "z_shieldcoinbase \"fromaddress\" \"tozaddress\" ( fee )\n" + + strDisabledMsg + "\nShield transparent coinbase funds by sending to a shielded zaddr. This is an asynchronous operation and utxos" "\nselected for shielding will be locked. If there is an error, they are unlocked. The RPC call `listlockunspent`" "\ncan be used to return a list of locked utxos. The number of coinbase utxos selected for shielding is limited by" @@ -3549,6 +3556,10 @@ UniValue z_shieldcoinbase(const UniValue& params, bool fHelp) "}\n" ); + if (!fEnableShieldCoinbase) { + throw JSONRPCError(RPC_WALLET_ERROR, "Error: z_shieldcoinbase is disabled."); + } + LOCK2(cs_main, pwalletMain->cs_wallet); // Validate the from address From 72b4f0b3e60c4f3606a99bf0340d9979778da376 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 27 Sep 2017 19:41:54 +0100 Subject: [PATCH 0216/1062] Individualise performance-measurements.sh errors for debugging --- qa/zcash/performance-measurements.sh | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/qa/zcash/performance-measurements.sh b/qa/zcash/performance-measurements.sh index 08d2ab9a5..8fcb39282 100755 --- a/qa/zcash/performance-measurements.sh +++ b/qa/zcash/performance-measurements.sh @@ -65,7 +65,7 @@ function zcashd_start { use_200k_benchmark 1 ;; *) - echo "Bad arguments." + echo "Bad arguments to zcashd_start." exit 1 esac ;; @@ -95,7 +95,7 @@ function zcashd_massif_start { use_200k_benchmark 1 ;; *) - echo "Bad arguments." + echo "Bad arguments to zcashd_massif_start." exit 1 esac ;; @@ -208,7 +208,7 @@ case "$1" in ;; *) zcashd_stop - echo "Bad arguments." + echo "Bad arguments to time." exit 1 esac zcashd_stop @@ -249,7 +249,7 @@ case "$1" in ;; *) zcashd_massif_stop - echo "Bad arguments." + echo "Bad arguments to memory." exit 1 esac zcashd_massif_stop @@ -288,7 +288,7 @@ case "$1" in ;; *) zcashd_valgrind_stop - echo "Bad arguments." + echo "Bad arguments to valgrind." exit 1 esac zcashd_valgrind_stop @@ -309,12 +309,12 @@ case "$1" in rm -f valgrind.out ;; *) - echo "Bad arguments." + echo "Bad arguments to valgrind-tests." exit 1 esac ;; *) - echo "Bad arguments." + echo "Invalid benchmark type." exit 1 esac From 091c089d0331266159b856fd16d0a1b7e58f59e2 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 27 Sep 2017 19:42:39 +0100 Subject: [PATCH 0217/1062] Fix incorrect failure in memory benchmark --- qa/zcash/performance-measurements.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/qa/zcash/performance-measurements.sh b/qa/zcash/performance-measurements.sh index 8fcb39282..60f92dd1d 100755 --- a/qa/zcash/performance-measurements.sh +++ b/qa/zcash/performance-measurements.sh @@ -247,6 +247,9 @@ case "$1" in sendtoaddress) zcash_rpc zcbenchmark sendtoaddress 1 "${@:4}" ;; + loadwallet) + # The initial load is sufficient for measurement + ;; *) zcashd_massif_stop echo "Bad arguments to memory." From 0f49863acb353fb6e082eda64970710fa66b88e5 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 28 Sep 2017 01:17:05 +0100 Subject: [PATCH 0218/1062] make-release.py: Versioning changes for 1.0.12. --- README.md | 2 +- configure.ac | 2 +- contrib/gitian-descriptors/gitian-linux.yml | 2 +- src/clientversion.h | 2 +- src/deprecation.h | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 78e02233a..769d08e77 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Zcash 1.0.12-rc1 +Zcash 1.0.12 ============= What is Zcash? diff --git a/configure.ac b/configure.ac index 5831cb63f..9fa37ab28 100644 --- a/configure.ac +++ b/configure.ac @@ -3,7 +3,7 @@ AC_PREREQ([2.60]) define(_CLIENT_VERSION_MAJOR, 1) define(_CLIENT_VERSION_MINOR, 0) define(_CLIENT_VERSION_REVISION, 12) -define(_CLIENT_VERSION_BUILD, 25) +define(_CLIENT_VERSION_BUILD, 50) define(_ZC_BUILD_VAL, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, m4_incr(_CLIENT_VERSION_BUILD), m4_eval(_CLIENT_VERSION_BUILD < 50), 1, m4_eval(_CLIENT_VERSION_BUILD - 24), m4_eval(_CLIENT_VERSION_BUILD == 50), 1, , m4_eval(_CLIENT_VERSION_BUILD - 50))) define(_CLIENT_VERSION_SUFFIX, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, _CLIENT_VERSION_REVISION-beta$1, m4_eval(_CLIENT_VERSION_BUILD < 50), 1, _CLIENT_VERSION_REVISION-rc$1, m4_eval(_CLIENT_VERSION_BUILD == 50), 1, _CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION-$1))) define(_CLIENT_VERSION_IS_RELEASE, true) diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml index c53211d0f..74573b757 100644 --- a/contrib/gitian-descriptors/gitian-linux.yml +++ b/contrib/gitian-descriptors/gitian-linux.yml @@ -1,5 +1,5 @@ --- -name: "zcash-1.0.12-rc1" +name: "zcash-1.0.12" enable_cache: true distro: "debian" suites: diff --git a/src/clientversion.h b/src/clientversion.h index 98ab18336..b7eab7ae5 100644 --- a/src/clientversion.h +++ b/src/clientversion.h @@ -18,7 +18,7 @@ #define CLIENT_VERSION_MAJOR 1 #define CLIENT_VERSION_MINOR 0 #define CLIENT_VERSION_REVISION 12 -#define CLIENT_VERSION_BUILD 25 +#define CLIENT_VERSION_BUILD 50 //! Set to true for release, false for prerelease or test build #define CLIENT_VERSION_IS_RELEASE true diff --git a/src/deprecation.h b/src/deprecation.h index 19c63bdf2..9d5111c1f 100644 --- a/src/deprecation.h +++ b/src/deprecation.h @@ -8,7 +8,7 @@ // Deprecation policy: // * Shut down 18 weeks' worth of blocks after the estimated release block height. // * A warning is shown during the 2 weeks' worth of blocks prior to shut down. -static const int APPROX_RELEASE_HEIGHT = 189600; +static const int APPROX_RELEASE_HEIGHT = 192200; static const int WEEKS_UNTIL_DEPRECATION = 18; static const int DEPRECATION_HEIGHT = APPROX_RELEASE_HEIGHT + (WEEKS_UNTIL_DEPRECATION * 7 * 24 * 24); From eb6d25e7ab13dd80d5ec94d6bddebfc530739444 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 28 Sep 2017 01:24:59 +0100 Subject: [PATCH 0219/1062] make-release.py: Updated manpages for 1.0.12. --- doc/man/zcash-cli.1 | 6 +++--- doc/man/zcash-tx.1 | 6 +++--- doc/man/zcashd.1 | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/doc/man/zcash-cli.1 b/doc/man/zcash-cli.1 index e8f42c702..582316d28 100644 --- a/doc/man/zcash-cli.1 +++ b/doc/man/zcash-cli.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASH-CLI "1" "September 2017" "zcash-cli v1.0.12-rc1" "User Commands" +.TH ZCASH-CLI "1" "September 2017" "zcash-cli v1.0.12" "User Commands" .SH NAME -zcash-cli \- manual page for zcash-cli v1.0.12-rc1 +zcash-cli \- manual page for zcash-cli v1.0.12 .SH DESCRIPTION -Zcash RPC client version v1.0.12\-rc1 +Zcash RPC client version v1.0.12 .PP In order to ensure you are adequately protecting your privacy when using Zcash, please see . diff --git a/doc/man/zcash-tx.1 b/doc/man/zcash-tx.1 index 9f1832090..3a502969a 100644 --- a/doc/man/zcash-tx.1 +++ b/doc/man/zcash-tx.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASH-TX "1" "September 2017" "zcash-tx v1.0.12-rc1" "User Commands" +.TH ZCASH-TX "1" "September 2017" "zcash-tx v1.0.12" "User Commands" .SH NAME -zcash-tx \- manual page for zcash-tx v1.0.12-rc1 +zcash-tx \- manual page for zcash-tx v1.0.12 .SH DESCRIPTION -Zcash zcash\-tx utility version v1.0.12\-rc1 +Zcash zcash\-tx utility version v1.0.12 .SS "Usage:" .TP zcash\-tx [options] [commands] diff --git a/doc/man/zcashd.1 b/doc/man/zcashd.1 index f34c45066..70c6e57f1 100644 --- a/doc/man/zcashd.1 +++ b/doc/man/zcashd.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASHD "1" "September 2017" "zcashd v1.0.12-rc1" "User Commands" +.TH ZCASHD "1" "September 2017" "zcashd v1.0.12" "User Commands" .SH NAME -zcashd \- manual page for zcashd v1.0.12-rc1 +zcashd \- manual page for zcashd v1.0.12 .SH DESCRIPTION -Zcash Daemon version v1.0.12\-rc1 +Zcash Daemon version v1.0.12 .PP In order to ensure you are adequately protecting your privacy when using Zcash, please see . @@ -54,7 +54,7 @@ Specify data directory \fB\-disabledeprecation=\fR .IP Disable block\-height node deprecation and automatic shutdown (example: -\fB\-disabledeprecation\fR=\fI\,1\/\fR.0.12\-rc1) +\fB\-disabledeprecation\fR=\fI\,1\/\fR.0.12) .HP \fB\-exportdir=\fR .IP From 898876673045fc2f7f2f4616171085f4a718c54f Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 28 Sep 2017 01:26:44 +0100 Subject: [PATCH 0220/1062] make-release.py: Updated release notes and changelog for 1.0.12. --- contrib/debian/changelog | 6 ++++++ doc/authors.md | 4 ++-- doc/release-notes/release-notes-1.0.12.md | 14 ++++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 doc/release-notes/release-notes-1.0.12.md diff --git a/contrib/debian/changelog b/contrib/debian/changelog index 9837f656f..131627614 100644 --- a/contrib/debian/changelog +++ b/contrib/debian/changelog @@ -1,3 +1,9 @@ +zcash (1.0.12) stable; urgency=medium + + * 1.0.12 release. + + -- Zcash Company Thu, 28 Sep 2017 01:26:44 +0100 + zcash (1.0.12~rc1) stable; urgency=medium * 1.0.12-rc1 release. diff --git a/doc/authors.md b/doc/authors.md index 93a30c1c2..ce6dc0e9f 100644 --- a/doc/authors.md +++ b/doc/authors.md @@ -1,8 +1,8 @@ Zcash Contributors ================== -Jack Grigg (465) -Simon Liu (272) +Jack Grigg (470) +Simon Liu (274) Sean Bowe (188) Daira Hopwood (102) Taylor Hornby (65) diff --git a/doc/release-notes/release-notes-1.0.12.md b/doc/release-notes/release-notes-1.0.12.md new file mode 100644 index 000000000..ca9190268 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.12.md @@ -0,0 +1,14 @@ +Changelog +========= + +Jack Grigg (5): + Fix pyflakes warnings in RPC tests + Individualise performance-measurements.sh errors for debugging + Fix incorrect failure in memory benchmark + make-release.py: Versioning changes for 1.0.12. + make-release.py: Updated manpages for 1.0.12. + +Simon Liu (2): + Update which lock to synchronize on when calling GetBestAnchor(). + Closes #2637. Make z_shieldcoinbase an experimental feature where it can be enabled with: zcashd -experimentalfeatures -zshieldcoinbase. + From 2c016e06c723df8b01e9739d450cdb8a8a58a669 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Mon, 2 Oct 2017 21:37:13 +0100 Subject: [PATCH 0221/1062] Add Ansible playbook for grind workers --- contrib/ci-workers/grind.yml | 27 +++++++++++++++++++++++++++ contrib/ci-workers/vars/default.yml | 5 +++++ 2 files changed, 32 insertions(+) create mode 100644 contrib/ci-workers/grind.yml diff --git a/contrib/ci-workers/grind.yml b/contrib/ci-workers/grind.yml new file mode 100644 index 000000000..ef7e5758e --- /dev/null +++ b/contrib/ci-workers/grind.yml @@ -0,0 +1,27 @@ +--- +# Configure a Buildbot worker +- include: unix.yml + +- name: Install grind-specific worker dependencies + hosts: zcash-ci-worker-unix + become: true + + vars_files: + - vars/default.yml + + tasks: + - name: Get dependencies for distribution + include_vars: "{{ item }}" + with_first_found: + - files: + - "vars/{{ ansible_distribution }}-{{ ansible_distribution_version }}.yml" + - "vars/{{ ansible_distribution }}-{{ ansible_distribution_major_version | int }}.yml" + - "vars/{{ ansible_distribution }}.yml" + - "vars/{{ ansible_os_family }}.yml" + skip: true + + - name: Install required packages + package: + name: "{{ item }}" + state: present + with_items: "{{ grind_deps }}" diff --git a/contrib/ci-workers/vars/default.yml b/contrib/ci-workers/vars/default.yml index 67da0e51d..38c5afc8e 100644 --- a/contrib/ci-workers/vars/default.yml +++ b/contrib/ci-workers/vars/default.yml @@ -29,6 +29,11 @@ link_deps: # Additional distribution-specific dependencies dist_deps: [] +# Additional grind-specific dependencies +grind_deps: + - lcov + - valgrind + # Python modules required for a Zcash Buildbot worker buildbot_modules: - pip # Needs to be updated first so Buildbot installs From 243b6a9d4b54485ca4ff056fc35b77767e8ba06e Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 3 Oct 2017 17:35:32 +0100 Subject: [PATCH 0222/1062] Add connections in BIP65 and BIP66 tests to the test manager Fixes a bug in the tests causing them to silently pass instead of correctly reporting other errors. Introduced in 4a785b0a5ba9689e0a76f202c34e0d310a7487d7 during the test rewrites. --- qa/rpc-tests/bip65-cltv-p2p.py | 2 +- qa/rpc-tests/bipdersig-p2p.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/qa/rpc-tests/bip65-cltv-p2p.py b/qa/rpc-tests/bip65-cltv-p2p.py index 6f31c7663..8fef45afe 100755 --- a/qa/rpc-tests/bip65-cltv-p2p.py +++ b/qa/rpc-tests/bip65-cltv-p2p.py @@ -38,7 +38,7 @@ class BIP65Test(ComparisonTestFramework): def run_test(self): test = TestManager(self, self.options.tmpdir) - # Don't call test.add_all_connections because there is only one node. + test.add_all_connections(self.nodes) NetworkThread().start() # Start up network handling in another thread test.run() diff --git a/qa/rpc-tests/bipdersig-p2p.py b/qa/rpc-tests/bipdersig-p2p.py index 9604cdbdd..523a694bf 100755 --- a/qa/rpc-tests/bipdersig-p2p.py +++ b/qa/rpc-tests/bipdersig-p2p.py @@ -37,7 +37,7 @@ class BIP66Test(ComparisonTestFramework): def run_test(self): test = TestManager(self, self.options.tmpdir) - # Don't call test.add_all_connections because there is only one node. + test.add_all_connections(self.nodes) NetworkThread().start() # Start up network handling in another thread test.run() From 99dd50c30c7596f60afe1773a90d3ecda47b766b Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 4 Oct 2017 12:48:50 +0100 Subject: [PATCH 0223/1062] Add benchmark for listunspent Closes #2645. --- qa/zcash/performance-measurements.sh | 10 ++++++++-- src/wallet/rpcwallet.cpp | 2 ++ src/zcbenchmarks.cpp | 9 +++++++++ src/zcbenchmarks.h | 1 + 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/qa/zcash/performance-measurements.sh b/qa/zcash/performance-measurements.sh index 60f92dd1d..ac6d06e86 100755 --- a/qa/zcash/performance-measurements.sh +++ b/qa/zcash/performance-measurements.sh @@ -56,7 +56,7 @@ function use_200k_benchmark { function zcashd_start { case "$1" in - sendtoaddress|loadwallet) + sendtoaddress|loadwallet|listunspent) case "$2" in 200k-recv) use_200k_benchmark 0 @@ -86,7 +86,7 @@ function zcashd_stop { function zcashd_massif_start { case "$1" in - sendtoaddress|loadwallet) + sendtoaddress|loadwallet|listunspent) case "$2" in 200k-recv) use_200k_benchmark 0 @@ -206,6 +206,9 @@ case "$1" in loadwallet) zcash_rpc zcbenchmark loadwallet 10 ;; + listunspent) + zcash_rpc zcbenchmark listunspent 10 + ;; *) zcashd_stop echo "Bad arguments to time." @@ -250,6 +253,9 @@ case "$1" in loadwallet) # The initial load is sufficient for measurement ;; + listunspent) + zcash_rpc zcbenchmark listunspent 1 + ;; *) zcashd_massif_stop echo "Bad arguments to memory." diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 55669f74f..332f96b21 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -2609,6 +2609,8 @@ UniValue zc_benchmark(const UniValue& params, bool fHelp) throw JSONRPCError(RPC_TYPE_ERROR, "Benchmark must be run in regtest mode"); } sample_times.push_back(benchmark_loadwallet()); + } else if (benchmarktype == "listunspent") { + sample_times.push_back(benchmark_listunspent()); } else { throw JSONRPCError(RPC_TYPE_ERROR, "Invalid benchmarktype"); } diff --git a/src/zcbenchmarks.cpp b/src/zcbenchmarks.cpp index 5c20a67e3..1cb880ea1 100644 --- a/src/zcbenchmarks.cpp +++ b/src/zcbenchmarks.cpp @@ -465,3 +465,12 @@ double benchmark_loadwallet() post_wallet_load(); return res; } + +double benchmark_listunspent() +{ + UniValue params(UniValue::VARR); + struct timeval tv_start; + timer_start(tv_start); + auto unspent = listunspent(params, false); + return timer_stop(tv_start); +} diff --git a/src/zcbenchmarks.h b/src/zcbenchmarks.h index a2672daa0..ac87d0326 100644 --- a/src/zcbenchmarks.h +++ b/src/zcbenchmarks.h @@ -18,5 +18,6 @@ extern double benchmark_increment_note_witnesses(size_t nTxs); extern double benchmark_connectblock_slow(); extern double benchmark_sendtoaddress(CAmount amount); extern double benchmark_loadwallet(); +extern double benchmark_listunspent(); #endif From d2c1e4a807480dfc9c8f10cb27dd219e165f7307 Mon Sep 17 00:00:00 2001 From: Bruno Arueira Date: Thu, 3 Nov 2016 17:01:16 -0200 Subject: [PATCH 0224/1062] Removes out bitcoin mention in favor for zcash Bitcoin Core => Zcash bitcoin address => Zcash address bitcoinaddress => zcashaddress Closes #1756 --- src/init.cpp | 8 ++++++-- src/key.cpp | 2 +- src/rpcblockchain.cpp | 8 ++++---- src/rpcmisc.cpp | 18 +++++++++--------- src/rpcnet.cpp | 2 +- src/rpcrawtransaction.cpp | 4 ++-- src/wallet/rpcwallet.cpp | 32 ++++++++++++++++---------------- 7 files changed, 39 insertions(+), 35 deletions(-) diff --git a/src/init.cpp b/src/init.cpp index 3797e806d..add8bde53 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -419,6 +419,10 @@ std::string HelpMessage(HelpMessageMode mode) strUsage += HelpMessageOpt("-walletnotify=", _("Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)")); strUsage += HelpMessageOpt("-zapwallettxes=", _("Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup") + " " + _("(1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)")); +<<<<<<< HEAD +======= + +>>>>>>> Removes out bitcoin mention in favor for zcash #endif #if ENABLE_ZMQ @@ -1487,10 +1491,10 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) InitWarning(msg); } else if (nLoadWalletRet == DB_TOO_NEW) - strErrors << _("Error loading wallet.dat: Wallet requires newer version of Bitcoin Core") << "\n"; + strErrors << _("Error loading wallet.dat: Wallet requires newer version of Zcash") << "\n"; else if (nLoadWalletRet == DB_NEED_REWRITE) { - strErrors << _("Wallet needed to be rewritten: restart Bitcoin Core to complete") << "\n"; + strErrors << _("Wallet needed to be rewritten: restart Zcash to complete") << "\n"; LogPrintf("%s", strErrors.str()); return InitError(strErrors.str()); } diff --git a/src/key.cpp b/src/key.cpp index a43131613..4cf693a97 100644 --- a/src/key.cpp +++ b/src/key.cpp @@ -221,7 +221,7 @@ bool CKey::VerifyPubKey(const CPubKey& pubkey) const { return false; } unsigned char rnd[8]; - std::string str = "Bitcoin key verification\n"; + std::string str = "Zcash key verification\n"; GetRandBytes(rnd, sizeof(rnd)); uint256 hash; CHash256().Write((unsigned char*)str.data(), str.size()).Write(rnd, sizeof(rnd)).Finalize(hash.begin()); diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 6d8c911e3..bc3869db7 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -519,13 +519,13 @@ UniValue gettxout(const UniValue& params, bool fHelp) " \"hex\" : \"hex\", (string) \n" " \"reqSigs\" : n, (numeric) Number of required signatures\n" " \"type\" : \"pubkeyhash\", (string) The type, eg pubkeyhash\n" - " \"addresses\" : [ (array of string) array of bitcoin addresses\n" - " \"bitcoinaddress\" (string) bitcoin address\n" + " \"addresses\" : [ (array of string) array of zcash addresses\n" + " \"zcashaddress\" (string) zcash address\n" " ,...\n" " ]\n" " },\n" - " \"version\" : n, (numeric) The version\n" - " \"coinbase\" : true|false (boolean) Coinbase or not\n" + " \"version\" : n, (numeric) The version\n" + " \"coinbase\" : true|false (boolean) Coinbase or not\n" "}\n" "\nExamples:\n" diff --git a/src/rpcmisc.cpp b/src/rpcmisc.cpp index 9980ce1ed..ba5feb0b8 100644 --- a/src/rpcmisc.cpp +++ b/src/rpcmisc.cpp @@ -51,7 +51,7 @@ UniValue getinfo(const UniValue& params, bool fHelp) " \"version\": xxxxx, (numeric) the server version\n" " \"protocolversion\": xxxxx, (numeric) the protocol version\n" " \"walletversion\": xxxxx, (numeric) the wallet version\n" - " \"balance\": xxxxxxx, (numeric) the total bitcoin balance of the wallet\n" + " \"balance\": xxxxxxx, (numeric) the total zcash balance of the wallet\n" " \"blocks\": xxxxxx, (numeric) the current number of blocks processed in the server\n" " \"timeoffset\": xxxxx, (numeric) the time offset\n" " \"connections\": xxxxx, (numeric) the number of connections\n" @@ -152,14 +152,14 @@ UniValue validateaddress(const UniValue& params, bool fHelp) { if (fHelp || params.size() != 1) throw runtime_error( - "validateaddress \"bitcoinaddress\"\n" - "\nReturn information about the given bitcoin address.\n" + "validateaddress \"zcashaddress\"\n" + "\nReturn information about the given zcash address.\n" "\nArguments:\n" - "1. \"bitcoinaddress\" (string, required) The bitcoin address to validate\n" + "1. \"zcashaddress\" (string, required) The zcash address to validate\n" "\nResult:\n" "{\n" " \"isvalid\" : true|false, (boolean) If the address is valid or not. If not, this is the only property returned.\n" - " \"address\" : \"bitcoinaddress\", (string) The bitcoin address validated\n" + " \"address\" : \"zcashaddress\", (string) The zcash address validated\n" " \"scriptPubKey\" : \"hex\", (string) The hex encoded scriptPubKey generated by the address\n" " \"ismine\" : true|false, (boolean) If the address is yours or not\n" " \"isscript\" : true|false, (boolean) If the key is a script\n" @@ -342,9 +342,9 @@ UniValue createmultisig(const UniValue& params, bool fHelp) "\nArguments:\n" "1. nrequired (numeric, required) The number of required signatures out of the n keys or addresses.\n" - "2. \"keys\" (string, required) A json array of keys which are bitcoin addresses or hex-encoded public keys\n" + "2. \"keys\" (string, required) A json array of keys which are zcash addresses or hex-encoded public keys\n" " [\n" - " \"key\" (string) bitcoin address or hex-encoded public key\n" + " \"key\" (string) zcash address or hex-encoded public key\n" " ,...\n" " ]\n" @@ -379,10 +379,10 @@ UniValue verifymessage(const UniValue& params, bool fHelp) { if (fHelp || params.size() != 3) throw runtime_error( - "verifymessage \"bitcoinaddress\" \"signature\" \"message\"\n" + "verifymessage \"zcashaddress\" \"signature\" \"message\"\n" "\nVerify a signed message\n" "\nArguments:\n" - "1. \"bitcoinaddress\" (string, required) The bitcoin address to use for the signature.\n" + "1. \"zcashaddress\" (string, required) The zcash address to use for the signature.\n" "2. \"signature\" (string, required) The signature provided by the signer in base 64 encoding (see signmessage).\n" "3. \"message\" (string, required) The message that was signed.\n" "\nResult:\n" diff --git a/src/rpcnet.cpp b/src/rpcnet.cpp index 71152a2e2..3370aae37 100644 --- a/src/rpcnet.cpp +++ b/src/rpcnet.cpp @@ -255,7 +255,7 @@ UniValue getaddednodeinfo(const UniValue& params, bool fHelp) " \"connected\" : true|false, (boolean) If connected\n" " \"addresses\" : [\n" " {\n" - " \"address\" : \"192.168.0.201:8233\", (string) The bitcoin server host and port\n" + " \"address\" : \"192.168.0.201:8233\", (string) The zcash server host and port\n" " \"connected\" : \"outbound\" (string) connection, inbound or outbound\n" " }\n" " ,...\n" diff --git a/src/rpcrawtransaction.cpp b/src/rpcrawtransaction.cpp index 83cb8e877..4183a67ac 100644 --- a/src/rpcrawtransaction.cpp +++ b/src/rpcrawtransaction.cpp @@ -212,7 +212,7 @@ UniValue getrawtransaction(const UniValue& params, bool fHelp) " \"reqSigs\" : n, (numeric) The required sigs\n" " \"type\" : \"pubkeyhash\", (string) The type, eg 'pubkeyhash'\n" " \"addresses\" : [ (json array of string)\n" - " \"bitcoinaddress\" (string) bitcoin address\n" + " \"zcashaddress\" (string) zcash address\n" " ,...\n" " ]\n" " }\n" @@ -582,7 +582,7 @@ UniValue decodescript(const UniValue& params, bool fHelp) " \"type\":\"type\", (string) The output type\n" " \"reqSigs\": n, (numeric) The required signatures\n" " \"addresses\": [ (json array of string)\n" - " \"address\" (string) bitcoin address\n" + " \"address\" (string) zcash address\n" " ,...\n" " ],\n" " \"p2sh\",\"address\" (string) script address\n" diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 55669f74f..5ce5470e8 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -119,7 +119,7 @@ UniValue getnewaddress(const UniValue& params, bool fHelp) "\nArguments:\n" "1. \"account\" (string, optional) DEPRECATED. If provided, it MUST be set to the empty string \"\" to represent the default account. Passing any other string will result in an error.\n" "\nResult:\n" - "\"zcashaddress\" (string) The new zcash address\n" + "\"zcashaddress\" (string) The new Zcash address\n" "\nExamples:\n" + HelpExampleCli("getnewaddress", "") + HelpExampleRpc("getnewaddress", "") @@ -196,7 +196,7 @@ UniValue getaccountaddress(const UniValue& params, bool fHelp) "\nArguments:\n" "1. \"account\" (string, required) MUST be set to the empty string \"\" to represent the default account. Passing any other string will result in an error.\n" "\nResult:\n" - "\"zcashaddress\" (string) The account zcash address\n" + "\"zcashaddress\" (string) The account Zcash address\n" "\nExamples:\n" + HelpExampleCli("getaccountaddress", "") + HelpExampleCli("getaccountaddress", "\"\"") @@ -261,7 +261,7 @@ UniValue setaccount(const UniValue& params, bool fHelp) "setaccount \"zcashaddress\" \"account\"\n" "\nDEPRECATED. Sets the account associated with the given address.\n" "\nArguments:\n" - "1. \"zcashaddress\" (string, required) The zcash address to be associated with an account.\n" + "1. \"zcashaddress\" (string, required) The Zcash address to be associated with an account.\n" "2. \"account\" (string, required) MUST be set to the empty string \"\" to represent the default account. Passing any other string will result in an error.\n" "\nExamples:\n" + HelpExampleCli("setaccount", "\"t14oHp2v54vfmdgQ3v3SNuQga8JKHTNi2a1\" \"tabby\"") @@ -307,7 +307,7 @@ UniValue getaccount(const UniValue& params, bool fHelp) "getaccount \"zcashaddress\"\n" "\nDEPRECATED. Returns the account associated with the given address.\n" "\nArguments:\n" - "1. \"zcashaddress\" (string, required) The zcash address for account lookup.\n" + "1. \"zcashaddress\" (string, required) The Zcash address for account lookup.\n" "\nResult:\n" "\"accountname\" (string) the account address\n" "\nExamples:\n" @@ -342,7 +342,7 @@ UniValue getaddressesbyaccount(const UniValue& params, bool fHelp) "1. \"account\" (string, required) MUST be set to the empty string \"\" to represent the default account. Passing any other string will result in an error.\n" "\nResult:\n" "[ (json array of string)\n" - " \"zcashaddress\" (string) a zcash address associated with the given account\n" + " \"zcashaddress\" (string) a Zcash address associated with the given account\n" " ,...\n" "]\n" "\nExamples:\n" @@ -517,7 +517,7 @@ UniValue signmessage(const UniValue& params, bool fHelp) "\nSign a message with the private key of an address" + HelpRequiringPassphrase() + "\n" "\nArguments:\n" - "1. \"zcashaddress\" (string, required) The zcash address to use for the private key.\n" + "1. \"zcashaddress\" (string, required) The Zcash address to use for the private key.\n" "2. \"message\" (string, required) The message to create a signature of.\n" "\nResult:\n" "\"signature\" (string) The signature of the message encoded in base 64\n" @@ -572,7 +572,7 @@ UniValue getreceivedbyaddress(const UniValue& params, bool fHelp) "getreceivedbyaddress \"zcashaddress\" ( minconf )\n" "\nReturns the total amount received by the given zcashaddress in transactions with at least minconf confirmations.\n" "\nArguments:\n" - "1. \"zcashaddress\" (string, required) The zcash address for transactions.\n" + "1. \"zcashaddress\" (string, required) The Zcash address for transactions.\n" "2. minconf (numeric, optional, default=1) Only include transactions confirmed at least this many times.\n" "\nResult:\n" "amount (numeric) The total amount in " + CURRENCY_UNIT + " received at this address.\n" @@ -878,7 +878,7 @@ UniValue sendfrom(const UniValue& params, bool fHelp) if (fHelp || params.size() < 3 || params.size() > 6) throw runtime_error( "sendfrom \"fromaccount\" \"tozcashaddress\" amount ( minconf \"comment\" \"comment-to\" )\n" - "\nDEPRECATED (use sendtoaddress). Sent an amount from an account to a zcash address.\n" + "\nDEPRECATED (use sendtoaddress). Sent an amount from an account to a Zcash address.\n" "The amount is a real and is rounded to the nearest 0.00000001." + HelpRequiringPassphrase() + "\n" "\nArguments:\n" @@ -1063,15 +1063,15 @@ UniValue addmultisigaddress(const UniValue& params, bool fHelp) "\nArguments:\n" "1. nrequired (numeric, required) The number of required signatures out of the n keys or addresses.\n" - "2. \"keysobject\" (string, required) A json array of zcash addresses or hex-encoded public keys\n" + "2. \"keysobject\" (string, required) A json array of Zcash addresses or hex-encoded public keys\n" " [\n" - " \"address\" (string) zcash address or hex-encoded public key\n" + " \"address\" (string) Zcash address or hex-encoded public key\n" " ...,\n" " ]\n" "3. \"account\" (string, optional) DEPRECATED. If provided, MUST be set to the empty string \"\" to represent the default account. Passing any other string will result in an error.\n" "\nResult:\n" - "\"zcashaddress\" (string) A zcash address associated with the keys.\n" + "\"zcashaddress\" (string) A Zcash address associated with the keys.\n" "\nExamples:\n" "\nAdd a multisig address from 2 addresses\n" @@ -1418,7 +1418,7 @@ UniValue listtransactions(const UniValue& params, bool fHelp) " {\n" " \"account\":\"accountname\", (string) DEPRECATED. The account name associated with the transaction. \n" " It will be \"\" for the default account.\n" - " \"address\":\"zcashaddress\", (string) The zcash address of the transaction. Not present for \n" + " \"address\":\"zcashaddress\", (string) The Zcash address of the transaction. Not present for \n" " move transactions (category = move).\n" " \"category\":\"send|receive|move\", (string) The transaction category. 'move' is a local (off blockchain)\n" " transaction between accounts, and not associated with an address,\n" @@ -1618,7 +1618,7 @@ UniValue listsinceblock(const UniValue& params, bool fHelp) "{\n" " \"transactions\": [\n" " \"account\":\"accountname\", (string) DEPRECATED. The account name associated with the transaction. Will be \"\" for the default account.\n" - " \"address\":\"zcashaddress\", (string) The zcash address of the transaction. Not present for move transactions (category = move).\n" + " \"address\":\"zcashaddress\", (string) The Zcash address of the transaction. Not present for move transactions (category = move).\n" " \"category\":\"send|receive\", (string) The transaction category. 'send' has negative amounts, 'receive' has positive amounts.\n" " \"amount\": x.xxx, (numeric) The amount in " + CURRENCY_UNIT + ". This is negative for the 'send' category, and for the 'move' category for moves \n" " outbound. It is positive for the 'receive' category, and for the 'move' category for inbound funds.\n" @@ -1717,7 +1717,7 @@ UniValue gettransaction(const UniValue& params, bool fHelp) " \"details\" : [\n" " {\n" " \"account\" : \"accountname\", (string) DEPRECATED. The account name involved in the transaction, can be \"\" for the default account.\n" - " \"address\" : \"zcashaddress\", (string) The zcash address involved in the transaction\n" + " \"address\" : \"zcashaddress\", (string) The Zcash address involved in the transaction\n" " \"category\" : \"send|receive\", (string) The category, either 'send' or 'receive'\n" " \"amount\" : x.xxx (numeric) The amount in " + CURRENCY_UNIT + "\n" " \"vout\" : n, (numeric) the vout value\n" @@ -2326,9 +2326,9 @@ UniValue listunspent(const UniValue& params, bool fHelp) "\nArguments:\n" "1. minconf (numeric, optional, default=1) The minimum confirmations to filter\n" "2. maxconf (numeric, optional, default=9999999) The maximum confirmations to filter\n" - "3. \"addresses\" (string) A json array of zcash addresses to filter\n" + "3. \"addresses\" (string) A json array of Zcash addresses to filter\n" " [\n" - " \"address\" (string) zcash address\n" + " \"address\" (string) Zcash address\n" " ,...\n" " ]\n" "\nResult\n" From c16528495c4c18dcd1fc5f1e0697b3f825435ed4 Mon Sep 17 00:00:00 2001 From: Jay Graber Date: Thu, 23 Mar 2017 15:29:56 -0700 Subject: [PATCH 0225/1062] s/zcash/Zcash --- src/init.cpp | 4 ---- src/rpcblockchain.cpp | 4 ++-- src/rpcmisc.cpp | 14 +++++++------- src/rpcnet.cpp | 2 +- src/rpcrawtransaction.cpp | 4 ++-- src/wallet/rpcwallet.cpp | 12 ++++++------ 6 files changed, 18 insertions(+), 22 deletions(-) diff --git a/src/init.cpp b/src/init.cpp index add8bde53..bb57f257d 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -419,10 +419,6 @@ std::string HelpMessage(HelpMessageMode mode) strUsage += HelpMessageOpt("-walletnotify=", _("Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)")); strUsage += HelpMessageOpt("-zapwallettxes=", _("Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup") + " " + _("(1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)")); -<<<<<<< HEAD -======= - ->>>>>>> Removes out bitcoin mention in favor for zcash #endif #if ENABLE_ZMQ diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index bc3869db7..cbc7109dd 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -519,8 +519,8 @@ UniValue gettxout(const UniValue& params, bool fHelp) " \"hex\" : \"hex\", (string) \n" " \"reqSigs\" : n, (numeric) Number of required signatures\n" " \"type\" : \"pubkeyhash\", (string) The type, eg pubkeyhash\n" - " \"addresses\" : [ (array of string) array of zcash addresses\n" - " \"zcashaddress\" (string) zcash address\n" + " \"addresses\" : [ (array of string) array of Zcash addresses\n" + " \"zcashaddress\" (string) Zcash address\n" " ,...\n" " ]\n" " },\n" diff --git a/src/rpcmisc.cpp b/src/rpcmisc.cpp index ba5feb0b8..b2bc1aefe 100644 --- a/src/rpcmisc.cpp +++ b/src/rpcmisc.cpp @@ -51,7 +51,7 @@ UniValue getinfo(const UniValue& params, bool fHelp) " \"version\": xxxxx, (numeric) the server version\n" " \"protocolversion\": xxxxx, (numeric) the protocol version\n" " \"walletversion\": xxxxx, (numeric) the wallet version\n" - " \"balance\": xxxxxxx, (numeric) the total zcash balance of the wallet\n" + " \"balance\": xxxxxxx, (numeric) the total Zcash balance of the wallet\n" " \"blocks\": xxxxxx, (numeric) the current number of blocks processed in the server\n" " \"timeoffset\": xxxxx, (numeric) the time offset\n" " \"connections\": xxxxx, (numeric) the number of connections\n" @@ -153,13 +153,13 @@ UniValue validateaddress(const UniValue& params, bool fHelp) if (fHelp || params.size() != 1) throw runtime_error( "validateaddress \"zcashaddress\"\n" - "\nReturn information about the given zcash address.\n" + "\nReturn information about the given Zcash address.\n" "\nArguments:\n" - "1. \"zcashaddress\" (string, required) The zcash address to validate\n" + "1. \"zcashaddress\" (string, required) The Zcash address to validate\n" "\nResult:\n" "{\n" " \"isvalid\" : true|false, (boolean) If the address is valid or not. If not, this is the only property returned.\n" - " \"address\" : \"zcashaddress\", (string) The zcash address validated\n" + " \"address\" : \"zcashaddress\", (string) The Zcash address validated\n" " \"scriptPubKey\" : \"hex\", (string) The hex encoded scriptPubKey generated by the address\n" " \"ismine\" : true|false, (boolean) If the address is yours or not\n" " \"isscript\" : true|false, (boolean) If the key is a script\n" @@ -342,9 +342,9 @@ UniValue createmultisig(const UniValue& params, bool fHelp) "\nArguments:\n" "1. nrequired (numeric, required) The number of required signatures out of the n keys or addresses.\n" - "2. \"keys\" (string, required) A json array of keys which are zcash addresses or hex-encoded public keys\n" + "2. \"keys\" (string, required) A json array of keys which are Zcash addresses or hex-encoded public keys\n" " [\n" - " \"key\" (string) zcash address or hex-encoded public key\n" + " \"key\" (string) Zcash address or hex-encoded public key\n" " ,...\n" " ]\n" @@ -382,7 +382,7 @@ UniValue verifymessage(const UniValue& params, bool fHelp) "verifymessage \"zcashaddress\" \"signature\" \"message\"\n" "\nVerify a signed message\n" "\nArguments:\n" - "1. \"zcashaddress\" (string, required) The zcash address to use for the signature.\n" + "1. \"zcashaddress\" (string, required) The Zcash address to use for the signature.\n" "2. \"signature\" (string, required) The signature provided by the signer in base 64 encoding (see signmessage).\n" "3. \"message\" (string, required) The message that was signed.\n" "\nResult:\n" diff --git a/src/rpcnet.cpp b/src/rpcnet.cpp index 3370aae37..dc46c786e 100644 --- a/src/rpcnet.cpp +++ b/src/rpcnet.cpp @@ -255,7 +255,7 @@ UniValue getaddednodeinfo(const UniValue& params, bool fHelp) " \"connected\" : true|false, (boolean) If connected\n" " \"addresses\" : [\n" " {\n" - " \"address\" : \"192.168.0.201:8233\", (string) The zcash server host and port\n" + " \"address\" : \"192.168.0.201:8233\", (string) The Zcash server host and port\n" " \"connected\" : \"outbound\" (string) connection, inbound or outbound\n" " }\n" " ,...\n" diff --git a/src/rpcrawtransaction.cpp b/src/rpcrawtransaction.cpp index 4183a67ac..aa329f4e9 100644 --- a/src/rpcrawtransaction.cpp +++ b/src/rpcrawtransaction.cpp @@ -212,7 +212,7 @@ UniValue getrawtransaction(const UniValue& params, bool fHelp) " \"reqSigs\" : n, (numeric) The required sigs\n" " \"type\" : \"pubkeyhash\", (string) The type, eg 'pubkeyhash'\n" " \"addresses\" : [ (json array of string)\n" - " \"zcashaddress\" (string) zcash address\n" + " \"zcashaddress\" (string) Zcash address\n" " ,...\n" " ]\n" " }\n" @@ -582,7 +582,7 @@ UniValue decodescript(const UniValue& params, bool fHelp) " \"type\":\"type\", (string) The output type\n" " \"reqSigs\": n, (numeric) The required signatures\n" " \"addresses\": [ (json array of string)\n" - " \"address\" (string) zcash address\n" + " \"address\" (string) Zcash address\n" " ,...\n" " ],\n" " \"p2sh\",\"address\" (string) script address\n" diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 5ce5470e8..385e71978 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -416,7 +416,7 @@ UniValue sendtoaddress(const UniValue& params, bool fHelp) " to which you're sending the transaction. This is not part of the \n" " transaction, just kept in your wallet.\n" "5. subtractfeefromamount (boolean, optional, default=false) The fee will be deducted from the amount being sent.\n" - " The recipient will receive less zcash than you enter in the amount field.\n" + " The recipient will receive less Zcash than you enter in the amount field.\n" "\nResult:\n" "\"transactionid\" (string) The transaction id.\n" "\nExamples:\n" @@ -570,7 +570,7 @@ UniValue getreceivedbyaddress(const UniValue& params, bool fHelp) if (fHelp || params.size() < 1 || params.size() > 2) throw runtime_error( "getreceivedbyaddress \"zcashaddress\" ( minconf )\n" - "\nReturns the total amount received by the given zcashaddress in transactions with at least minconf confirmations.\n" + "\nReturns the total amount received by the given Zcash address in transactions with at least minconf confirmations.\n" "\nArguments:\n" "1. \"zcashaddress\" (string, required) The Zcash address for transactions.\n" "2. minconf (numeric, optional, default=1) Only include transactions confirmed at least this many times.\n" @@ -956,7 +956,7 @@ UniValue sendmany(const UniValue& params, bool fHelp) "4. \"comment\" (string, optional) A comment\n" "5. subtractfeefromamount (string, optional) A json array with addresses.\n" " The fee will be equally deducted from the amount of each selected address.\n" - " Those recipients will receive less zcashs than you enter in their corresponding amount field.\n" + " Those recipients will receive less Zcash than you enter in their corresponding amount field.\n" " If no addresses are specified here, the sender pays the fee.\n" " [\n" " \"address\" (string) Subtract fee from this address\n" @@ -1877,7 +1877,7 @@ UniValue walletpassphrase(const UniValue& params, bool fHelp) throw runtime_error( "walletpassphrase \"passphrase\" timeout\n" "\nStores the wallet decryption key in memory for 'timeout' seconds.\n" - "This is needed prior to performing transactions related to private keys such as sending zcash\n" + "This is needed prior to performing transactions related to private keys such as sending Zcash\n" "\nArguments:\n" "1. \"passphrase\" (string, required) The wallet passphrase\n" "2. timeout (numeric, required) The time to keep the decryption key in seconds.\n" @@ -2042,7 +2042,7 @@ UniValue encryptwallet(const UniValue& params, bool fHelp) "\nExamples:\n" "\nEncrypt you wallet\n" + HelpExampleCli("encryptwallet", "\"my pass phrase\"") + - "\nNow set the passphrase to use the wallet, such as for signing or sending zcash\n" + "\nNow set the passphrase to use the wallet, such as for signing or sending Zcash\n" + HelpExampleCli("walletpassphrase", "\"my pass phrase\"") + "\nNow we can so something like sign\n" + HelpExampleCli("signmessage", "\"zcashaddress\" \"test message\"") + @@ -2093,7 +2093,7 @@ UniValue lockunspent(const UniValue& params, bool fHelp) "lockunspent unlock [{\"txid\":\"txid\",\"vout\":n},...]\n" "\nUpdates list of temporarily unspendable outputs.\n" "Temporarily lock (unlock=false) or unlock (unlock=true) specified transaction outputs.\n" - "A locked transaction output will not be chosen by automatic coin selection, when spending zcash.\n" + "A locked transaction output will not be chosen by automatic coin selection, when spending Zcash.\n" "Locks are stored in memory only. Nodes start with zero locked outputs, and the locked output list\n" "is always cleared (by virtue of process exit) when a node stops or fails.\n" "Also see the listunspent call\n" From 6de850120f440fa1dd913df91797578123cb8b49 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 3 Oct 2017 17:48:00 -0700 Subject: [PATCH 0226/1062] Replace 'bitcoin address' with 'zcash address'. --- src/rpcrawtransaction.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/rpcrawtransaction.cpp b/src/rpcrawtransaction.cpp index aa329f4e9..bd9b866c2 100644 --- a/src/rpcrawtransaction.cpp +++ b/src/rpcrawtransaction.cpp @@ -417,7 +417,7 @@ UniValue createrawtransaction(const UniValue& params, bool fHelp) " ]\n" "2. \"addresses\" (string, required) a json object with addresses as keys and amounts as values\n" " {\n" - " \"address\": x.xxx (numeric, required) The key is the bitcoin address, the value is the " + CURRENCY_UNIT + " amount\n" + " \"address\": x.xxx (numeric, required) The key is the zcash address, the value is the " + CURRENCY_UNIT + " amount\n" " ,...\n" " }\n" @@ -459,7 +459,7 @@ UniValue createrawtransaction(const UniValue& params, bool fHelp) BOOST_FOREACH(const string& name_, addrList) { CBitcoinAddress address(name_); if (!address.IsValid()) - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, string("Invalid Bitcoin address: ")+name_); + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, string("Invalid Zcash address: ")+name_); if (setAddress.count(address)) throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid parameter, duplicated address: ")+name_); @@ -512,7 +512,7 @@ UniValue decoderawtransaction(const UniValue& params, bool fHelp) " \"reqSigs\" : n, (numeric) The required sigs\n" " \"type\" : \"pubkeyhash\", (string) The type, eg 'pubkeyhash'\n" " \"addresses\" : [ (json array of string)\n" - " \"t12tvKAXCxZjSmdNbao16dKXC8tRWfcF5oc\" (string) bitcoin address\n" + " \"t12tvKAXCxZjSmdNbao16dKXC8tRWfcF5oc\" (string) zcash address\n" " ,...\n" " ]\n" " }\n" From 13ca1e8011c8794d2b05861d3b0c9dc284965c1b Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 13 Jul 2017 14:23:33 -0500 Subject: [PATCH 0227/1062] [Test] MiniNode: Implement JSDescription parsing --- qa/rpc-tests/test_framework/mininode.py | 148 ++++++++++++++++++++++++ 1 file changed, 148 insertions(+) diff --git a/qa/rpc-tests/test_framework/mininode.py b/qa/rpc-tests/test_framework/mininode.py index c39637073..7006e68e4 100755 --- a/qa/rpc-tests/test_framework/mininode.py +++ b/qa/rpc-tests/test_framework/mininode.py @@ -307,6 +307,154 @@ class CBlockLocator(object): % (self.nVersion, repr(self.vHave)) +G1_PREFIX_MASK = 0x02 +G2_PREFIX_MASK = 0x0a + +class ZCProof(object): + def __init__(self): + self.g_A = None + self.g_A_prime = None + self.g_B = None + self.g_B_prime = None + self.g_C = None + self.g_C_prime = None + self.g_K = None + self.g_H = None + + def deserialize(self, f): + def deser_g1(self, f): + leadingByte = struct.unpack(" Date: Thu, 13 Jul 2017 14:24:16 -0500 Subject: [PATCH 0228/1062] [Test] MiniNode: Implement v2 CTransaction parsing --- qa/rpc-tests/test_framework/mininode.py | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/qa/rpc-tests/test_framework/mininode.py b/qa/rpc-tests/test_framework/mininode.py index 7006e68e4..7ebf685e2 100755 --- a/qa/rpc-tests/test_framework/mininode.py +++ b/qa/rpc-tests/test_framework/mininode.py @@ -530,6 +530,9 @@ class CTransaction(object): self.vin = [] self.vout = [] self.nLockTime = 0 + self.vjoinsplit = [] + self.joinSplitPubKey = None + self.joinSplitSig = None self.sha256 = None self.hash = None else: @@ -537,6 +540,9 @@ class CTransaction(object): self.vin = copy.deepcopy(tx.vin) self.vout = copy.deepcopy(tx.vout) self.nLockTime = tx.nLockTime + self.vjoinsplit = copy.deepcopy(tx.vjoinsplit) + self.joinSplitPubKey = tx.joinSplitPubKey + self.joinSplitSig = tx.joinSplitSig self.sha256 = None self.hash = None @@ -545,6 +551,11 @@ class CTransaction(object): self.vin = deser_vector(f, CTxIn) self.vout = deser_vector(f, CTxOut) self.nLockTime = struct.unpack("= 2: + self.vjoinsplit = deser_vector(f, JSDescription) + if len(self.vjoinsplit) > 0: + self.joinSplitPubKey = deser_uint256(f) + self.joinSplitSig = f.read(64) self.sha256 = None self.hash = None @@ -554,6 +565,11 @@ class CTransaction(object): r += ser_vector(self.vin) r += ser_vector(self.vout) r += struct.pack("= 2: + r += ser_vector(self.vjoinsplit) + if len(self.vjoinsplit) > 0: + r += ser_uint256(self.joinSplitPubKey) + r += self.joinSplitSig return r def rehash(self): @@ -573,8 +589,15 @@ class CTransaction(object): return True def __repr__(self): - return "CTransaction(nVersion=%i vin=%s vout=%s nLockTime=%i)" \ + r = "CTransaction(nVersion=%i vin=%s vout=%s nLockTime=%i" \ % (self.nVersion, repr(self.vin), repr(self.vout), self.nLockTime) + if self.nVersion >= 2: + r += " vjoinsplit=%s" % repr(self.vjoinsplit) + if len(self.vjoinsplit) > 0: + r += " joinSplitPubKey=%064x joinSplitSig=%064x" \ + (self.joinSplitPubKey, self.joinSplitSig) + r += ")" + return r class CBlockHeader(object): From 31bc3d25818c60f0cb3b6e8a8ecdfa28d367fd58 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 13 Jul 2017 14:25:10 -0500 Subject: [PATCH 0229/1062] [Test] MiniNode: Implement Zcash block parsing --- qa/rpc-tests/test_framework/mininode.py | 59 +++++++++++++++++++++---- 1 file changed, 50 insertions(+), 9 deletions(-) diff --git a/qa/rpc-tests/test_framework/mininode.py b/qa/rpc-tests/test_framework/mininode.py index 7ebf685e2..e35503bfb 100755 --- a/qa/rpc-tests/test_framework/mininode.py +++ b/qa/rpc-tests/test_framework/mininode.py @@ -234,6 +234,36 @@ def ser_int_vector(l): return r +def deser_char_vector(f): + nit = struct.unpack(" Date: Thu, 13 Jul 2017 14:25:31 -0500 Subject: [PATCH 0230/1062] [Test] MiniNode: Update protocol version and network magics --- qa/rpc-tests/test_framework/mininode.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/qa/rpc-tests/test_framework/mininode.py b/qa/rpc-tests/test_framework/mininode.py index e35503bfb..c418d3f63 100755 --- a/qa/rpc-tests/test_framework/mininode.py +++ b/qa/rpc-tests/test_framework/mininode.py @@ -32,7 +32,7 @@ import logging import copy BIP0031_VERSION = 60000 -MY_VERSION = 60001 # past bip-31 for ping/pong +MY_VERSION = 170002 # past bip-31 for ping/pong MY_SUBVERSION = "/python-mininode-tester:0.0.1/" MAX_INV_SZ = 50000 @@ -1294,9 +1294,9 @@ class NodeConn(asyncore.dispatcher): "mempool": msg_mempool } MAGIC_BYTES = { - "mainnet": "\xf9\xbe\xb4\xd9", # mainnet - "testnet3": "\x0b\x11\x09\x07", # testnet3 - "regtest": "\xfa\xbf\xb5\xda" # regtest + "mainnet": "\x24\xe9\x27\x64", # mainnet + "testnet3": "\xfa\x1a\xf9\xbf", # testnet3 + "regtest": "\xaa\xe8\x3f\x5f" # regtest } def __init__(self, dstaddr, dstport, rpc, callback, net="regtest"): From e68c3ec1887d340927ba573ef8dc625d1a4a7d9e Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 13 Jul 2017 17:04:53 -0500 Subject: [PATCH 0231/1062] [Test] MiniNode: Use Zcash PoW Equihash solver code extracted from https://github.com/str4d/zcash-pow RPC tests now require pyblake2 to be installed --- qa/rpc-tests/test_framework/blocktools.py | 7 +- qa/rpc-tests/test_framework/equihash.py | 293 ++++++++++++++++++++++ qa/rpc-tests/test_framework/mininode.py | 37 ++- 3 files changed, 330 insertions(+), 7 deletions(-) create mode 100755 qa/rpc-tests/test_framework/equihash.py diff --git a/qa/rpc-tests/test_framework/blocktools.py b/qa/rpc-tests/test_framework/blocktools.py index 0f8147253..cffa109cf 100644 --- a/qa/rpc-tests/test_framework/blocktools.py +++ b/qa/rpc-tests/test_framework/blocktools.py @@ -7,7 +7,7 @@ from mininode import CBlock, CTransaction, CTxIn, CTxOut, COutPoint, ser_string # Create a block (with regtest difficulty) -def create_block(hashprev, coinbase, nTime=None): +def create_block(hashprev, coinbase, nTime=None, nBits=None): block = CBlock() if nTime is None: import time @@ -15,7 +15,10 @@ def create_block(hashprev, coinbase, nTime=None): else: block.nTime = nTime block.hashPrevBlock = hashprev - block.nBits = 0x207fffff # Will break after a difficulty adjustment... + if nBits is None: + block.nBits = 0x200f0f0f # Will break after a difficulty adjustment... + else: + block.nBits = nBits block.vtx.append(coinbase) block.hashMerkleRoot = block.calc_merkle_root() block.calc_sha256() diff --git a/qa/rpc-tests/test_framework/equihash.py b/qa/rpc-tests/test_framework/equihash.py new file mode 100755 index 000000000..e40451978 --- /dev/null +++ b/qa/rpc-tests/test_framework/equihash.py @@ -0,0 +1,293 @@ +from operator import itemgetter +import struct + +DEBUG = False +VERBOSE = False + + +word_size = 32 +word_mask = (1<= 8 and word_size >= 7+bit_len + bit_len_mask = (1<= bit_len: + acc_bits -= bit_len + for x in xrange(byte_pad, out_width): + out[j+x] = ( + # Big-endian + acc_value >> (acc_bits+(8*(out_width-x-1))) + ) & ( + # Apply bit_len_mask across byte boundaries + (bit_len_mask >> (8*(out_width-x-1))) & 0xFF + ) + j += out_width + + return out + +def compress_array(inp, out_len, bit_len, byte_pad=0): + assert bit_len >= 8 and word_size >= 7+bit_len + + in_width = (bit_len+7)/8 + byte_pad + assert out_len == bit_len*len(inp)/(8*in_width) + out = bytearray(out_len) + + bit_len_mask = (1 << bit_len) - 1 + + # The acc_bits least-significant bits of acc_value represent a bit sequence + # in big-endian order. + acc_bits = 0; + acc_value = 0; + + j = 0 + for i in xrange(out_len): + # When we have fewer than 8 bits left in the accumulator, read the next + # input element. + if acc_bits < 8: + acc_value = ((acc_value << bit_len) & word_mask) | inp[j] + for x in xrange(byte_pad, in_width): + acc_value = acc_value | ( + ( + # Apply bit_len_mask across byte boundaries + inp[j+x] & ((bit_len_mask >> (8*(in_width-x-1))) & 0xFF) + ) << (8*(in_width-x-1))); # Big-endian + j += in_width + acc_bits += bit_len + + acc_bits -= 8 + out[i] = (acc_value >> acc_bits) & 0xFF + + return out + +def get_indices_from_minimal(minimal, bit_len): + eh_index_size = 4 + assert (bit_len+7)/8 <= eh_index_size + len_indices = 8*eh_index_size*len(minimal)/bit_len + byte_pad = eh_index_size - (bit_len+7)/8 + expanded = expand_array(minimal, len_indices, bit_len, byte_pad) + return [struct.unpack('>I', expanded[i:i+4])[0] for i in range(0, len_indices, eh_index_size)] + +def get_minimal_from_indices(indices, bit_len): + eh_index_size = 4 + assert (bit_len+7)/8 <= eh_index_size + len_indices = len(indices)*eh_index_size + min_len = bit_len*len_indices/(8*eh_index_size) + byte_pad = eh_index_size - (bit_len+7)/8 + byte_indices = bytearray(''.join([struct.pack('>I', i) for i in indices])) + return compress_array(byte_indices, min_len, bit_len, byte_pad) + + +def hash_nonce(digest, nonce): + for i in range(8): + digest.update(struct.pack('> (32*i))) + +def hash_xi(digest, xi): + digest.update(struct.pack(' 0: + # 2b) Find next set of unordered pairs with collisions on first n/(k+1) bits + j = 1 + while j < len(X): + if not has_collision(X[-1][0], X[-1-j][0], i, collision_length): + break + j += 1 + + # 2c) Store tuples (X_i ^ X_j, (i, j)) on the table + for l in range(0, j-1): + for m in range(l+1, j): + # Check that there are no duplicate indices in tuples i and j + if distinct_indices(X[-1-l][1], X[-1-m][1]): + if X[-1-l][1][0] < X[-1-m][1][0]: + concat = X[-1-l][1] + X[-1-m][1] + else: + concat = X[-1-m][1] + X[-1-l][1] + Xc.append((xor(X[-1-l][0], X[-1-m][0]), concat)) + + # 2d) Drop this set + while j > 0: + X.pop(-1) + j -= 1 + # 2e) Replace previous list with new list + X = Xc + + # k+1) Find a collision on last 2n(k+1) bits + if DEBUG: + print 'Final round:' + print '- Sorting list' + X.sort(key=itemgetter(0)) + if DEBUG and VERBOSE: + for Xi in X[-32:]: + print '%s %s' % (print_hash(Xi[0]), Xi[1]) + if DEBUG: print '- Finding collisions' + solns = [] + while len(X) > 0: + j = 1 + while j < len(X): + if not (has_collision(X[-1][0], X[-1-j][0], k, collision_length) and + has_collision(X[-1][0], X[-1-j][0], k+1, collision_length)): + break + j += 1 + + for l in range(0, j-1): + for m in range(l+1, j): + res = xor(X[-1-l][0], X[-1-m][0]) + if count_zeroes(res) == 8*hash_length and distinct_indices(X[-1-l][1], X[-1-m][1]): + if DEBUG and VERBOSE: + print 'Found solution:' + print '- %s %s' % (print_hash(X[-1-l][0]), X[-1-l][1]) + print '- %s %s' % (print_hash(X[-1-m][0]), X[-1-m][1]) + if X[-1-l][1][0] < X[-1-m][1][0]: + solns.append(list(X[-1-l][1] + X[-1-m][1])) + else: + solns.append(list(X[-1-m][1] + X[-1-l][1])) + + # 2d) Drop this set + while j > 0: + X.pop(-1) + j -= 1 + return [get_minimal_from_indices(soln, collision_length+1) for soln in solns] + +def gbp_validate(digest, minimal, n, k): + validate_params(n, k) + collision_length = n/(k+1) + hash_length = (k+1)*((collision_length+7)//8) + indices_per_hash_output = 512/n + solution_width = (1 << k)*(collision_length+1)//8 + + if len(minimal) != solution_width: + print 'Invalid solution length: %d (expected %d)' % \ + (len(minimal), solution_width) + return False + + X = [] + for i in get_indices_from_minimal(minimal, collision_length+1): + r = i % indices_per_hash_output + # X_i = H(I||V||x_i) + curr_digest = digest.copy() + hash_xi(curr_digest, i/indices_per_hash_output) + tmp_hash = curr_digest.digest() + X.append(( + expand_array(bytearray(tmp_hash[r*n/8:(r+1)*n/8]), + hash_length, collision_length), + (i,) + )) + + for r in range(1, k+1): + Xc = [] + for i in range(0, len(X), 2): + if not has_collision(X[i][0], X[i+1][0], r, collision_length): + print 'Invalid solution: invalid collision length between StepRows' + return False + if X[i+1][1][0] < X[i][1][0]: + print 'Invalid solution: Index tree incorrectly ordered' + return False + if not distinct_indices(X[i][1], X[i+1][1]): + print 'Invalid solution: duplicate indices' + return False + Xc.append((xor(X[i][0], X[i+1][0]), X[i][1] + X[i+1][1])) + X = Xc + + if len(X) != 1: + print 'Invalid solution: incorrect length after end of rounds: %d' % len(X) + return False + + if count_zeroes(X[0][0]) != 8*hash_length: + print 'Invalid solution: incorrect number of zeroes: %d' % count_zeroes(X[0][0]) + return False + + return True + +def zcash_person(n, k): + return b'ZcashPoW' + struct.pack('= n): + raise ValueError('n must be larger than k') + if (((n/(k+1))+1) >= 32): + raise ValueError('Parameters must satisfy n/(k+1)+1 < 32') diff --git a/qa/rpc-tests/test_framework/mininode.py b/qa/rpc-tests/test_framework/mininode.py index c418d3f63..c74d3f931 100755 --- a/qa/rpc-tests/test_framework/mininode.py +++ b/qa/rpc-tests/test_framework/mininode.py @@ -30,6 +30,14 @@ from threading import RLock from threading import Thread import logging import copy +from pyblake2 import blake2b + +from .equihash import ( + gbp_basic, + gbp_validate, + hash_nonce, + zcash_person, +) BIP0031_VERSION = 60000 MY_VERSION = 170002 # past bip-31 for ping/pong @@ -736,7 +744,13 @@ class CBlock(CBlockHeader): hashes = newhashes return uint256_from_str(hashes[0]) - def is_valid(self): + def is_valid(self, n=48, k=5): + # H(I||... + digest = blake2b(digest_size=(512/n)*n/8, person=zcash_person(n, k)) + digest.update(super(CBlock, self).serialize()[:108]) + hash_nonce(digest, self.nNonce) + if not gbp_validate(self.nSolution, digest, n, k): + return False self.calc_sha256() target = uint256_from_compact(self.nBits) if self.sha256 > target: @@ -748,12 +762,25 @@ class CBlock(CBlockHeader): return False return True - def solve(self): - self.calc_sha256() + def solve(self, n=48, k=5): target = uint256_from_compact(self.nBits) - while self.sha256 > target: + # H(I||... + digest = blake2b(digest_size=(512/n)*n/8, person=zcash_person(n, k)) + digest.update(super(CBlock, self).serialize()[:108]) + self.nNonce = 0 + while True: + # H(I||V||... + curr_digest = digest.copy() + hash_nonce(curr_digest, self.nNonce) + # (x_1, x_2, ...) = A(I, V, n, k) + solns = gbp_basic(curr_digest, n, k) + for soln in solns: + assert(gbp_validate(curr_digest, soln, n, k)) + self.nSolution = soln + self.rehash() + if self.sha256 <= target: + return self.nNonce += 1 - self.rehash() def __repr__(self): return "CBlock(nVersion=%i hashPrevBlock=%064x hashMerkleRoot=%064x hashReserved=%064x nTime=%s nBits=%08x nNonce=%064x nSolution=%s vtx=%s)" \ From 643235859afb01fdc874f8e09ca1855b55fb8a97 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 4 Oct 2017 00:25:06 +0100 Subject: [PATCH 0232/1062] [Test] MiniNode: Fix coinbase creation CScriptNum is only used for heights > 16. --- qa/rpc-tests/test_framework/blocktools.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/qa/rpc-tests/test_framework/blocktools.py b/qa/rpc-tests/test_framework/blocktools.py index cffa109cf..ca566e4bc 100644 --- a/qa/rpc-tests/test_framework/blocktools.py +++ b/qa/rpc-tests/test_framework/blocktools.py @@ -4,7 +4,8 @@ # file COPYING or http://www.opensource.org/licenses/mit-license.php. # -from mininode import CBlock, CTransaction, CTxIn, CTxOut, COutPoint, ser_string +from mininode import CBlock, CTransaction, CTxIn, CTxOut, COutPoint +from script import CScript, OP_0 # Create a block (with regtest difficulty) def create_block(hashprev, coinbase, nTime=None, nBits=None): @@ -45,7 +46,7 @@ def create_coinbase(heightAdjust = 0): global counter coinbase = CTransaction() coinbase.vin.append(CTxIn(COutPoint(0, 0xffffffff), - ser_string(serialize_script_num(counter+heightAdjust)), 0xffffffff)) + CScript([counter+heightAdjust, OP_0]), 0xffffffff)) counter += 1 coinbaseoutput = CTxOut() coinbaseoutput.nValue = 50*100000000 From 7596a4922d8e1b43cdc03ddaabcad538375f3ab3 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 4 Oct 2017 00:28:40 +0100 Subject: [PATCH 0233/1062] [Test] MiniNode: Coerce OP_PUSHDATA bytearrays to bytes If a bytearray is passed in as part of an iterable, the CScript constructor fails because b''.join() cannot be used to join a bytearray to a bytes or str in Python 2. --- qa/rpc-tests/test_framework/script.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qa/rpc-tests/test_framework/script.py b/qa/rpc-tests/test_framework/script.py index ab7f4ec74..55a7f8e51 100644 --- a/qa/rpc-tests/test_framework/script.py +++ b/qa/rpc-tests/test_framework/script.py @@ -666,7 +666,7 @@ class CScript(bytes): else: other = CScriptOp.encode_op_pushdata(bignum.bn2vch(other)) elif isinstance(other, (bytes, bytearray)): - other = CScriptOp.encode_op_pushdata(other) + other = bytes(CScriptOp.encode_op_pushdata(other)) return other def __add__(self, other): From c10c40779d9b73359ee61f85ec5f1bb88acac61d Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 4 Oct 2017 00:34:32 +0100 Subject: [PATCH 0234/1062] [Test] MiniNode: Implement Zcash coinbase --- qa/rpc-tests/test_framework/blocktools.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/qa/rpc-tests/test_framework/blocktools.py b/qa/rpc-tests/test_framework/blocktools.py index ca566e4bc..1fe2a5dda 100644 --- a/qa/rpc-tests/test_framework/blocktools.py +++ b/qa/rpc-tests/test_framework/blocktools.py @@ -5,7 +5,7 @@ # from mininode import CBlock, CTransaction, CTxIn, CTxOut, COutPoint -from script import CScript, OP_0 +from script import CScript, OP_0, OP_EQUAL, OP_HASH160 # Create a block (with regtest difficulty) def create_block(hashprev, coinbase, nTime=None, nBits=None): @@ -49,11 +49,21 @@ def create_coinbase(heightAdjust = 0): CScript([counter+heightAdjust, OP_0]), 0xffffffff)) counter += 1 coinbaseoutput = CTxOut() - coinbaseoutput.nValue = 50*100000000 + coinbaseoutput.nValue = int(12.5*100000000) halvings = int((counter+heightAdjust)/150) # regtest coinbaseoutput.nValue >>= halvings coinbaseoutput.scriptPubKey = "" coinbase.vout = [ coinbaseoutput ] + if halvings == 0: # regtest + froutput = CTxOut() + froutput.nValue = coinbaseoutput.nValue / 5 + # regtest + fraddr = bytearray([0x67, 0x08, 0xe6, 0x67, 0x0d, 0xb0, 0xb9, 0x50, + 0xda, 0xc6, 0x80, 0x31, 0x02, 0x5c, 0xc5, 0xb6, + 0x32, 0x13, 0xa4, 0x91]) + froutput.scriptPubKey = CScript([OP_HASH160, fraddr, OP_EQUAL]) + coinbaseoutput.nValue -= froutput.nValue + coinbase.vout = [ coinbaseoutput, froutput ] coinbase.calc_sha256() return coinbase From 5455ca0d0e9b39d6844133edfc01107031f2c594 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 4 Oct 2017 01:21:09 +0100 Subject: [PATCH 0235/1062] Fix BIP65 and BIP66 tests Blocks were being created that didn't satisfy the regtest consensus rules. --- qa/rpc-tests/bip65-cltv-p2p.py | 10 +++++++--- qa/rpc-tests/bipdersig-p2p.py | 11 +++++++---- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/qa/rpc-tests/bip65-cltv-p2p.py b/qa/rpc-tests/bip65-cltv-p2p.py index 8fef45afe..cfd2df01e 100755 --- a/qa/rpc-tests/bip65-cltv-p2p.py +++ b/qa/rpc-tests/bip65-cltv-p2p.py @@ -12,7 +12,6 @@ from test_framework.comptool import TestInstance, TestManager from test_framework.script import CScript, OP_1NEGATE, OP_NOP2, OP_DROP from binascii import unhexlify import cStringIO -import time ''' @@ -64,9 +63,9 @@ class BIP65Test(ComparisonTestFramework): def get_tests(self): self.coinbase_blocks = self.nodes[0].generate(1) + self.nodes[0].generate(100) self.tip = int ("0x" + self.nodes[0].getbestblockhash() + "L", 0) self.nodeaddress = self.nodes[0].getnewaddress() - self.block_time = time.time() + 1 '''Check that the rules are enforced.''' for valid in (True, False): @@ -77,7 +76,12 @@ class BIP65Test(ComparisonTestFramework): self.invalidate_transaction(spendtx) spendtx.rehash() - block = create_block(self.tip, create_coinbase(1), self.block_time) + gbt = self.nodes[0].getblocktemplate() + self.block_time = gbt["mintime"] + 1 + self.block_bits = int("0x" + gbt["bits"], 0) + + block = create_block(self.tip, create_coinbase(101), + self.block_time, self.block_bits) block.nVersion = 4 block.vtx.append(spendtx) block.hashMerkleRoot = block.calc_merkle_root() diff --git a/qa/rpc-tests/bipdersig-p2p.py b/qa/rpc-tests/bipdersig-p2p.py index 523a694bf..f254843f1 100755 --- a/qa/rpc-tests/bipdersig-p2p.py +++ b/qa/rpc-tests/bipdersig-p2p.py @@ -12,7 +12,6 @@ from test_framework.comptool import TestInstance, TestManager from test_framework.script import CScript from binascii import unhexlify import cStringIO -import time ''' @@ -71,9 +70,9 @@ class BIP66Test(ComparisonTestFramework): def get_tests(self): self.coinbase_blocks = self.nodes[0].generate(1) + self.nodes[0].generate(100) self.tip = int ("0x" + self.nodes[0].getbestblockhash() + "L", 0) self.nodeaddress = self.nodes[0].getnewaddress() - self.block_time = time.time() + 1 '''Check that the rules are enforced.''' for valid in (True, False): @@ -84,13 +83,17 @@ class BIP66Test(ComparisonTestFramework): self.invalidate_transaction(spendtx) spendtx.rehash() - block = create_block(self.tip, create_coinbase(1), self.block_time) + gbt = self.nodes[0].getblocktemplate() + self.block_time = gbt["mintime"] + 1 + self.block_bits = int("0x" + gbt["bits"], 0) + + block = create_block(self.tip, create_coinbase(101), + self.block_time, self.block_bits) block.nVersion = 4 block.vtx.append(spendtx) block.hashMerkleRoot = block.calc_merkle_root() block.rehash() block.solve() - self.block_time += 1 self.tip = block.sha256 yield TestInstance([[block, valid]]) From f8ef223ce381a9f59b1f4b085d360abad6cb9499 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 5 Oct 2017 15:13:28 +0100 Subject: [PATCH 0236/1062] Un-indent RPC test output in test runner The indentation caused the test stdout to be buffered and only printed at the end of the test, which makes it harder to diagnose hanging tests. --- qa/pull-tester/rpc-tests.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qa/pull-tester/rpc-tests.sh b/qa/pull-tester/rpc-tests.sh index ed2bfca0a..5631f894f 100755 --- a/qa/pull-tester/rpc-tests.sh +++ b/qa/pull-tester/rpc-tests.sh @@ -85,7 +85,7 @@ function runTestScript echo -e "=== Running testscript ${testName} ===" - if eval "$@" | sed 's/^/ /' + if eval "$@" then successCount=$(expr $successCount + 1) echo "--- Success: ${testName} ---" From b30900a54bdaed5a5fbe7d5ea1cc072a405b762d Mon Sep 17 00:00:00 2001 From: Jason Davies Date: Fri, 21 Jul 2017 09:18:09 +0100 Subject: [PATCH 0237/1062] Replace "bitcoin" with "Zcash". --- src/crypto/common.h | 2 +- src/httpserver.cpp | 4 ++-- src/net.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/crypto/common.h b/src/crypto/common.h index 5d5027ada..ad4c6dd5e 100644 --- a/src/crypto/common.h +++ b/src/crypto/common.h @@ -16,7 +16,7 @@ #include "compat/endian.h" #if defined(NDEBUG) -# error "Bitcoin cannot be compiled without assertions." +# error "Zcash cannot be compiled without assertions." #endif uint16_t static inline ReadLE16(const unsigned char* ptr) diff --git a/src/httpserver.cpp b/src/httpserver.cpp index 4215a0f26..9c033e415 100644 --- a/src/httpserver.cpp +++ b/src/httpserver.cpp @@ -267,7 +267,7 @@ static void http_request_cb(struct evhttp_request* req, void* arg) /** Event dispatcher thread */ static void ThreadHTTP(struct event_base* base, struct evhttp* http) { - RenameThread("bitcoin-http"); + RenameThread("zcash-http"); LogPrint("http", "Entering http event loop\n"); event_base_dispatch(base); // Event loop will be interrupted by InterruptHTTPServer() @@ -316,7 +316,7 @@ static bool HTTPBindAddresses(struct evhttp* http) /** Simple wrapper to set thread name and run work queue */ static void HTTPWorkQueueRun(WorkQueue* queue) { - RenameThread("bitcoin-httpworker"); + RenameThread("zcash-httpworker"); queue->Run(); } diff --git a/src/net.cpp b/src/net.cpp index 7a40d97d6..05f427707 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -1636,7 +1636,7 @@ bool BindListenPort(const CService &addrBind, string& strError, bool fWhiteliste { int nErr = WSAGetLastError(); if (nErr == WSAEADDRINUSE) - strError = strprintf(_("Unable to bind to %s on this computer. Bitcoin Core is probably already running."), addrBind.ToString()); + strError = strprintf(_("Unable to bind to %s on this computer. Zcash is probably already running."), addrBind.ToString()); else strError = strprintf(_("Unable to bind to %s on this computer (bind returned error %s)"), addrBind.ToString(), NetworkErrorString(nErr)); LogPrintf("%s\n", strError); From aadf3aa15961fac06ca95f50f8034a20535ed002 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 6 Oct 2017 00:21:05 +0100 Subject: [PATCH 0238/1062] Replace full-test-suite.sh with a new test suite driver script This will be the canonical location for the entire Zcash merge test suite. --- qa/zcash/full-test-suite.sh | 47 -------------------- qa/zcash/full_test_suite.py | 87 +++++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+), 47 deletions(-) delete mode 100755 qa/zcash/full-test-suite.sh create mode 100755 qa/zcash/full_test_suite.py diff --git a/qa/zcash/full-test-suite.sh b/qa/zcash/full-test-suite.sh deleted file mode 100755 index 7860b105a..000000000 --- a/qa/zcash/full-test-suite.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/bash -# -# Execute all of the automated tests related to Zcash. -# - -set -eu - -SUITE_EXIT_STATUS=0 -REPOROOT="$(readlink -f "$(dirname "$0")"/../../)" - -function run_test_phase -{ - echo "===== BEGIN: $*" - set +e - eval "$@" - if [ $? -eq 0 ] - then - echo "===== PASSED: $*" - else - echo "===== FAILED: $*" - SUITE_EXIT_STATUS=1 - fi - set -e -} - -cd "${REPOROOT}" - -# Test phases: -run_test_phase "${REPOROOT}/qa/zcash/check-security-hardening.sh" -run_test_phase "${REPOROOT}/qa/zcash/ensure-no-dot-so-in-depends.py" - -# If make check fails, show test-suite.log as part of our run_test_phase -# output (and fail the phase with false): -run_test_phase make check '||' \ - '{' \ - echo '=== ./src/test-suite.log ===' ';' \ - cat './src/test-suite.log' ';' \ - false ';' \ - '}' - -exit $SUITE_EXIT_STATUS - - - - - - diff --git a/qa/zcash/full_test_suite.py b/qa/zcash/full_test_suite.py new file mode 100755 index 000000000..f383d64e1 --- /dev/null +++ b/qa/zcash/full_test_suite.py @@ -0,0 +1,87 @@ +#!/usr/bin/env python2 +# +# Execute all of the automated tests related to Zcash. +# + +import argparse +import os +import subprocess +import sys + +REPOROOT = os.path.dirname( + os.path.dirname( + os.path.dirname( + os.path.abspath(__file__) + ) + ) +) + +def repofile(filename): + return os.path.join(REPOROOT, filename) + + +# +# Tests +# + +STAGES = [ + 'btest', + 'gtest', + 'sec-hard', + 'no-dot-so', + 'secp256k1', + 'univalue', + 'rpc', +] + +STAGE_COMMANDS = { + 'btest': [repofile('src/test/test_bitcoin'), '-p'], + 'gtest': [repofile('src/zcash-gtest')], + 'sec-hard': [repofile('qa/zcash/check-security-hardening.sh')], + 'no-dot-so': [repofile('qa/zcash/ensure-no-dot-so-in-depends.py')], + 'secp256k1': ['make', '-C', repofile('src/secp256k1'), 'check'], + 'univalue': ['make', '-C', repofile('src/univalue'), 'check'], + 'rpc': [repofile('qa/pull-tester/rpc-tests.sh')], +} + + +# +# Test driver +# + +def run_stage(stage): + print('Running stage %s' % stage) + print('=' * (len(stage) + 14)) + print + + ret = subprocess.call(STAGE_COMMANDS[stage]) + + print + print('-' * (len(stage) + 15)) + print('Finished stage %s' % stage) + print + + return ret == 0 + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('stage', nargs='*', default=STAGES, + help='One of %s'%STAGES) + args = parser.parse_args() + + # Check validity of stages + for s in args.stage: + if s not in STAGES: + print("Invalid stage '%s' (choose from %s)" % (s, STAGES)) + sys.exit(1) + + # Run the stages + passed = True + for s in args.stage: + passed &= run_stage(s) + + if not passed: + sys.exit(1) + +if __name__ == '__main__': + main() From 105b2b6248a982ed6cab5d141cf2672d09442d5b Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 6 Oct 2017 00:39:05 +0100 Subject: [PATCH 0239/1062] Move ensure-no-dot-so-in-depends.py into full_test_suite.py --- qa/zcash/ensure-no-dot-so-in-depends.py | 41 ---------------------- qa/zcash/full_test_suite.py | 45 +++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 44 deletions(-) delete mode 100755 qa/zcash/ensure-no-dot-so-in-depends.py diff --git a/qa/zcash/ensure-no-dot-so-in-depends.py b/qa/zcash/ensure-no-dot-so-in-depends.py deleted file mode 100755 index beb4b9ec0..000000000 --- a/qa/zcash/ensure-no-dot-so-in-depends.py +++ /dev/null @@ -1,41 +0,0 @@ -#! /usr/bin/env python2 - -import sys -import os - -def main(): - this_script = os.path.abspath(sys.argv[0]) - basedir = os.path.dirname(this_script) - arch_dir = os.path.join( - basedir, - '..', - '..', - 'depends', - 'x86_64-unknown-linux-gnu', - ) - - exit_code = 0 - - if os.path.isdir(arch_dir): - lib_dir = os.path.join(arch_dir, 'lib') - libraries = os.listdir(lib_dir) - - for lib in libraries: - if lib.find(".so") != -1: - print lib - exit_code = 1 - else: - exit_code = 2 - print "arch-specific build dir not present: {}".format(arch_dir) - print "Did you build the ./depends tree?" - print "Are you on a currently unsupported architecture?" - - if exit_code == 0: - print "PASS." - else: - print "FAIL." - - sys.exit(exit_code) - -if __name__ == '__main__': - main() diff --git a/qa/zcash/full_test_suite.py b/qa/zcash/full_test_suite.py index f383d64e1..d2eca6a42 100755 --- a/qa/zcash/full_test_suite.py +++ b/qa/zcash/full_test_suite.py @@ -20,6 +20,41 @@ def repofile(filename): return os.path.join(REPOROOT, filename) +# +# Custom test runners +# + +def ensure_no_dot_so_in_depends(): + arch_dir = os.path.join( + REPOROOT, + 'depends', + 'x86_64-unknown-linux-gnu', + ) + + exit_code = 0 + + if os.path.isdir(arch_dir): + lib_dir = os.path.join(arch_dir, 'lib') + libraries = os.listdir(lib_dir) + + for lib in libraries: + if lib.find(".so") != -1: + print lib + exit_code = 1 + else: + exit_code = 2 + print "arch-specific build dir not present: {}".format(arch_dir) + print "Did you build the ./depends tree?" + print "Are you on a currently unsupported architecture?" + + if exit_code == 0: + print "PASS." + else: + print "FAIL." + + return exit_code == 0 + + # # Tests # @@ -38,7 +73,7 @@ STAGE_COMMANDS = { 'btest': [repofile('src/test/test_bitcoin'), '-p'], 'gtest': [repofile('src/zcash-gtest')], 'sec-hard': [repofile('qa/zcash/check-security-hardening.sh')], - 'no-dot-so': [repofile('qa/zcash/ensure-no-dot-so-in-depends.py')], + 'no-dot-so': ensure_no_dot_so_in_depends, 'secp256k1': ['make', '-C', repofile('src/secp256k1'), 'check'], 'univalue': ['make', '-C', repofile('src/univalue'), 'check'], 'rpc': [repofile('qa/pull-tester/rpc-tests.sh')], @@ -54,14 +89,18 @@ def run_stage(stage): print('=' * (len(stage) + 14)) print - ret = subprocess.call(STAGE_COMMANDS[stage]) + cmd = STAGE_COMMANDS[stage] + if type(cmd) == type([]): + ret = subprocess.call(cmd) == 0 + else: + ret = cmd() print print('-' * (len(stage) + 15)) print('Finished stage %s' % stage) print - return ret == 0 + return ret def main(): parser = argparse.ArgumentParser() From c6af0aa45342a609c884f27446496b750f10a38f Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 6 Oct 2017 01:33:00 +0100 Subject: [PATCH 0240/1062] Move check-security-hardening.sh into full_test_suite.py --- qa/zcash/check-security-hardening.sh | 46 ---------------------- qa/zcash/full_test_suite.py | 58 +++++++++++++++++++++++++++- 2 files changed, 57 insertions(+), 47 deletions(-) delete mode 100755 qa/zcash/check-security-hardening.sh diff --git a/qa/zcash/check-security-hardening.sh b/qa/zcash/check-security-hardening.sh deleted file mode 100755 index 94a87fea3..000000000 --- a/qa/zcash/check-security-hardening.sh +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/bash - -set -e - -REPOROOT="$(readlink -f "$(dirname "$0")"/../../)" - -function test_rpath_runpath { - if "${REPOROOT}/qa/zcash/checksec.sh" --file "$1" | grep -q "No RPATH.*No RUNPATH"; then - echo PASS: "$1" has no RPATH or RUNPATH. - return 0 - else - echo FAIL: "$1" has an RPATH or a RUNPATH. - "${REPOROOT}/qa/zcash/checksec.sh" --file "$1" - return 1 - fi -} - -function test_fortify_source { - if { "${REPOROOT}/qa/zcash/checksec.sh" --fortify-file "$1" | grep -q "FORTIFY_SOURCE support available.*Yes"; } && - { "${REPOROOT}/qa/zcash/checksec.sh" --fortify-file "$1" | grep -q "Binary compiled with FORTIFY_SOURCE support.*Yes"; }; then - echo PASS: "$1" has FORTIFY_SOURCE. - return 0 - else - echo FAIL: "$1" is missing FORTIFY_SOURCE. - return 1 - fi -} - -# PIE, RELRO, Canary, and NX are tested by make check-security. -make -C "$REPOROOT/src" check-security - -test_rpath_runpath "${REPOROOT}/src/zcashd" -test_rpath_runpath "${REPOROOT}/src/zcash-cli" -test_rpath_runpath "${REPOROOT}/src/zcash-gtest" -test_rpath_runpath "${REPOROOT}/src/zcash-tx" -test_rpath_runpath "${REPOROOT}/src/test/test_bitcoin" -test_rpath_runpath "${REPOROOT}/src/zcash/GenerateParams" - -# NOTE: checksec.sh does not reliably determine whether FORTIFY_SOURCE is -# enabled for the entire binary. See issue #915. -test_fortify_source "${REPOROOT}/src/zcashd" -test_fortify_source "${REPOROOT}/src/zcash-cli" -test_fortify_source "${REPOROOT}/src/zcash-gtest" -test_fortify_source "${REPOROOT}/src/zcash-tx" -test_fortify_source "${REPOROOT}/src/test/test_bitcoin" -test_fortify_source "${REPOROOT}/src/zcash/GenerateParams" diff --git a/qa/zcash/full_test_suite.py b/qa/zcash/full_test_suite.py index d2eca6a42..6e890c49a 100755 --- a/qa/zcash/full_test_suite.py +++ b/qa/zcash/full_test_suite.py @@ -5,6 +5,7 @@ import argparse import os +import re import subprocess import sys @@ -24,6 +25,61 @@ def repofile(filename): # Custom test runners # +RE_RPATH_RUNPATH = re.compile('No RPATH.*No RUNPATH') +RE_FORTIFY_AVAILABLE = re.compile('FORTIFY_SOURCE support available.*Yes') +RE_FORTIFY_USED = re.compile('Binary compiled with FORTIFY_SOURCE support.*Yes') + +def test_rpath_runpath(filename): + output = subprocess.check_output( + [repofile('qa/zcash/checksec.sh'), '--file', repofile(filename)] + ) + if RE_RPATH_RUNPATH.search(output): + print('PASS: %s has no RPATH or RUNPATH.' % filename) + return True + else: + print('FAIL: %s has an RPATH or a RUNPATH.' % filename) + print(output) + return False + +def test_fortify_source(filename): + proc = subprocess.Popen( + [repofile('qa/zcash/checksec.sh'), '--fortify-file', repofile(filename)], + stdout=subprocess.PIPE, + ) + line1 = proc.stdout.readline() + line2 = proc.stdout.readline() + proc.terminate() + if RE_FORTIFY_AVAILABLE.search(line1) and RE_FORTIFY_USED.search(line2): + print('PASS: %s has FORTIFY_SOURCE.' % filename) + return True + else: + print('FAIL: %s is missing FORTIFY_SOURCE.' % filename) + return False + +def check_security_hardening(): + ret = True + + # PIE, RELRO, Canary, and NX are tested by make check-security. + ret &= subprocess.call(['make', '-C', repofile('src'), 'check-security']) == 0 + + ret &= test_rpath_runpath('src/zcashd') + ret &= test_rpath_runpath('src/zcash-cli') + ret &= test_rpath_runpath('src/zcash-gtest') + ret &= test_rpath_runpath('src/zcash-tx') + ret &= test_rpath_runpath('src/test/test_bitcoin') + ret &= test_rpath_runpath('src/zcash/GenerateParams') + + # NOTE: checksec.sh does not reliably determine whether FORTIFY_SOURCE + # is enabled for the entire binary. See issue #915. + ret &= test_fortify_source('src/zcashd') + ret &= test_fortify_source('src/zcash-cli') + ret &= test_fortify_source('src/zcash-gtest') + ret &= test_fortify_source('src/zcash-tx') + ret &= test_fortify_source('src/test/test_bitcoin') + ret &= test_fortify_source('src/zcash/GenerateParams') + + return ret + def ensure_no_dot_so_in_depends(): arch_dir = os.path.join( REPOROOT, @@ -72,7 +128,7 @@ STAGES = [ STAGE_COMMANDS = { 'btest': [repofile('src/test/test_bitcoin'), '-p'], 'gtest': [repofile('src/zcash-gtest')], - 'sec-hard': [repofile('qa/zcash/check-security-hardening.sh')], + 'sec-hard': check_security_hardening, 'no-dot-so': ensure_no_dot_so_in_depends, 'secp256k1': ['make', '-C', repofile('src/secp256k1'), 'check'], 'univalue': ['make', '-C', repofile('src/univalue'), 'check'], From 94790c5d8f5710e775e3a217a9129059f8c930d8 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Mon, 9 Oct 2017 22:18:28 +0100 Subject: [PATCH 0241/1062] Add memory benchmark for validatelargetx --- qa/zcash/performance-measurements.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/qa/zcash/performance-measurements.sh b/qa/zcash/performance-measurements.sh index 60f92dd1d..4931d5519 100755 --- a/qa/zcash/performance-measurements.sh +++ b/qa/zcash/performance-measurements.sh @@ -234,6 +234,9 @@ case "$1" in verifyequihash) zcash_rpc zcbenchmark verifyequihash 1 ;; + validatelargetx) + zcash_rpc zcbenchmark validatelargetx 1 + ;; trydecryptnotes) zcash_rpc zcbenchmark trydecryptnotes 1 "${@:3}" ;; From 054ae606455ddfded7af5a8d75151497dfa7d382 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 10 Oct 2017 15:58:35 +0100 Subject: [PATCH 0242/1062] Migrate libsnark test code to Google Test --- .../algebra/curves/tests/test_bilinearity.cpp | 22 ++--- .../src/algebra/curves/tests/test_groups.cpp | 76 +++++++++-------- .../src/algebra/fields/tests/test_bigint.cpp | 84 ++++++++----------- .../src/algebra/fields/tests/test_fields.cpp | 64 +++++++------- .../sha256/tests/test_sha256_gadget.cpp | 6 +- .../tests/test_merkle_tree_gadgets.cpp | 4 +- .../qap/tests/test_qap.cpp | 12 +-- .../tests/test_r1cs_ppzksnark.cpp | 6 +- 8 files changed, 139 insertions(+), 135 deletions(-) diff --git a/src/snark/src/algebra/curves/tests/test_bilinearity.cpp b/src/snark/src/algebra/curves/tests/test_bilinearity.cpp index 295745281..529bec337 100644 --- a/src/snark/src/algebra/curves/tests/test_bilinearity.cpp +++ b/src/snark/src/algebra/curves/tests/test_bilinearity.cpp @@ -13,6 +13,8 @@ #include "algebra/curves/mnt/mnt4/mnt4_pp.hpp" #include "algebra/curves/mnt/mnt6/mnt6_pp.hpp" +#include + using namespace libsnark; template @@ -46,11 +48,11 @@ void pairing_test() ans1.print(); ans2.print(); ans3.print(); - assert(ans1 == ans2); - assert(ans2 == ans3); + EXPECT_EQ(ans1, ans2); + EXPECT_EQ(ans2, ans3); - assert(ans1 != GT_one); - assert((ans1^Fr::field_char()) == GT_one); + EXPECT_NE(ans1, GT_one); + EXPECT_EQ((ans1^Fr::field_char()), GT_one); printf("\n\n"); } @@ -70,7 +72,7 @@ void double_miller_loop_test() const Fqk ans_1 = ppT::miller_loop(prec_P1, prec_Q1); const Fqk ans_2 = ppT::miller_loop(prec_P2, prec_Q2); const Fqk ans_12 = ppT::double_miller_loop(prec_P1, prec_Q1, prec_P2, prec_Q2); - assert(ans_1 * ans_2 == ans_12); + EXPECT_EQ(ans_1 * ans_2, ans_12); } template @@ -99,15 +101,15 @@ void affine_pairing_test() ans1.print(); ans2.print(); ans3.print(); - assert(ans1 == ans2); - assert(ans2 == ans3); + EXPECT_EQ(ans1, ans2); + EXPECT_EQ(ans2, ans3); - assert(ans1 != GT_one); - assert((ans1^Fr::field_char()) == GT_one); + EXPECT_NE(ans1, GT_one); + EXPECT_EQ((ans1^Fr::field_char()), GT_one); printf("\n\n"); } -int main(void) +TEST(algebra, bilinearity) { start_profiling(); edwards_pp::init_public_params(); diff --git a/src/snark/src/algebra/curves/tests/test_groups.cpp b/src/snark/src/algebra/curves/tests/test_groups.cpp index 725e490d7..087ee3d52 100644 --- a/src/snark/src/algebra/curves/tests/test_groups.cpp +++ b/src/snark/src/algebra/curves/tests/test_groups.cpp @@ -14,6 +14,8 @@ #include "algebra/curves/alt_bn128/alt_bn128_pp.hpp" #include +#include + using namespace libsnark; template @@ -25,31 +27,31 @@ void test_mixed_add() el = GroupT::zero(); el.to_special(); result = base.mixed_add(el); - assert(result == base + el); + EXPECT_EQ(result, base + el); base = GroupT::zero(); el = GroupT::random_element(); el.to_special(); result = base.mixed_add(el); - assert(result == base + el); + EXPECT_EQ(result, base + el); base = GroupT::random_element(); el = GroupT::zero(); el.to_special(); result = base.mixed_add(el); - assert(result == base + el); + EXPECT_EQ(result, base + el); base = GroupT::random_element(); el = GroupT::random_element(); el.to_special(); result = base.mixed_add(el); - assert(result == base + el); + EXPECT_EQ(result, base + el); base = GroupT::random_element(); el = base; el.to_special(); result = base.mixed_add(el); - assert(result == base.dbl()); + EXPECT_EQ(result, base.dbl()); } template @@ -60,53 +62,53 @@ void test_group() bigint<1> randsum = bigint<1>("121160274"); GroupT zero = GroupT::zero(); - assert(zero == zero); + EXPECT_EQ(zero, zero); GroupT one = GroupT::one(); - assert(one == one); + EXPECT_EQ(one, one); GroupT two = bigint<1>(2l) * GroupT::one(); - assert(two == two); + EXPECT_EQ(two, two); GroupT five = bigint<1>(5l) * GroupT::one(); GroupT three = bigint<1>(3l) * GroupT::one(); GroupT four = bigint<1>(4l) * GroupT::one(); - assert(two+five == three+four); + EXPECT_EQ(two+five, three+four); GroupT a = GroupT::random_element(); GroupT b = GroupT::random_element(); - assert(one != zero); - assert(a != zero); - assert(a != one); + EXPECT_NE(one, zero); + EXPECT_NE(a, zero); + EXPECT_NE(a, one); - assert(b != zero); - assert(b != one); + EXPECT_NE(b, zero); + EXPECT_NE(b, one); - assert(a.dbl() == a + a); - assert(b.dbl() == b + b); - assert(one.add(two) == three); - assert(two.add(one) == three); - assert(a + b == b + a); - assert(a - a == zero); - assert(a - b == a + (-b)); - assert(a - b == (-b) + a); + EXPECT_EQ(a.dbl(), a + a); + EXPECT_EQ(b.dbl(), b + b); + EXPECT_EQ(one.add(two), three); + EXPECT_EQ(two.add(one), three); + EXPECT_EQ(a + b, b + a); + EXPECT_EQ(a - a, zero); + EXPECT_EQ(a - b, a + (-b)); + EXPECT_EQ(a - b, (-b) + a); // handle special cases - assert(zero + (-a) == -a); - assert(zero - a == -a); - assert(a - zero == a); - assert(a + zero == a); - assert(zero + a == a); + EXPECT_EQ(zero + (-a), -a); + EXPECT_EQ(zero - a, -a); + EXPECT_EQ(a - zero, a); + EXPECT_EQ(a + zero, a); + EXPECT_EQ(zero + a, a); - assert((a + b).dbl() == (a + b) + (b + a)); - assert(bigint<1>("2") * (a + b) == (a + b) + (b + a)); + EXPECT_EQ((a + b).dbl(), (a + b) + (b + a)); + EXPECT_EQ(bigint<1>("2") * (a + b), (a + b) + (b + a)); - assert((rand1 * a) + (rand2 * a) == (randsum * a)); + EXPECT_EQ((rand1 * a) + (rand2 * a), (randsum * a)); - assert(GroupT::order() * a == zero); - assert(GroupT::order() * one == zero); - assert((GroupT::order() * a) - a != zero); - assert((GroupT::order() * one) - one != zero); + EXPECT_EQ(GroupT::order() * a, zero); + EXPECT_EQ(GroupT::order() * one, zero); + EXPECT_NE((GroupT::order() * a) - a, zero); + EXPECT_NE((GroupT::order() * one) - one, zero); test_mixed_add(); } @@ -115,7 +117,7 @@ template void test_mul_by_q() { GroupT a = GroupT::random_element(); - assert((GroupT::base_field_char()*a) == a.mul_by_q()); + EXPECT_EQ((GroupT::base_field_char()*a), a.mul_by_q()); } template @@ -129,13 +131,13 @@ void test_output() ss << g; GroupT gg; ss >> gg; - assert(g == gg); + EXPECT_EQ(g, gg); /* use a random point in next iteration */ g = GroupT::random_element(); } } -int main(void) +TEST(algebra, groups) { edwards_pp::init_public_params(); test_group >(); diff --git a/src/snark/src/algebra/fields/tests/test_bigint.cpp b/src/snark/src/algebra/fields/tests/test_bigint.cpp index b66aae0a3..d2da59e73 100644 --- a/src/snark/src/algebra/fields/tests/test_bigint.cpp +++ b/src/snark/src/algebra/fields/tests/test_bigint.cpp @@ -7,9 +7,11 @@ #include "algebra/fields/bigint.hpp" +#include + using namespace libsnark; -void test_bigint() +TEST(algebra, bigint) { static_assert(ULONG_MAX == 0xFFFFFFFFFFFFFFFFul, "unsigned long not 64-bit"); static_assert(GMP_NUMB_BITS == 64, "GMP limb not 64-bit"); @@ -24,84 +26,72 @@ void test_bigint() bigint<1> b1 = bigint<1>(b1_decimal); bigint<2> b2 = bigint<2>(b2_decimal); - assert(b0.as_ulong() == 0ul); - assert(b0.is_zero()); - assert(b1.as_ulong() == 76749407ul); - assert(!(b1.is_zero())); - assert(b2.as_ulong() == 15747124762497195938ul); - assert(!(b2.is_zero())); - assert(b0 != b1); - assert(!(b0 == b1)); + EXPECT_EQ(b0.as_ulong(), 0ul); + EXPECT_TRUE(b0.is_zero()); + EXPECT_EQ(b1.as_ulong(), 76749407ul); + EXPECT_FALSE(b1.is_zero()); + EXPECT_EQ(b2.as_ulong(), 15747124762497195938ul); + EXPECT_FALSE(b2.is_zero()); + EXPECT_NE(b0, b1); + EXPECT_FALSE(b0 == b1); - assert(b2.max_bits() == 128); - assert(b2.num_bits() == 99); + EXPECT_EQ(b2.max_bits(), 128); + EXPECT_EQ(b2.num_bits(), 99); for (size_t i = 0; i < 128; i++) { - assert(b2.test_bit(i) == (b2_binary[127-i] == '1')); + EXPECT_EQ(b2.test_bit(i), (b2_binary[127-i] == '1')); } bigint<3> b3 = b2 * b1; - assert(b3 == bigint<3>(b3_decimal)); - assert(!(b3.is_zero())); + EXPECT_EQ(b3, bigint<3>(b3_decimal)); + EXPECT_FALSE(b3.is_zero()); bigint<3> b3a { b3 }; - assert(b3a == bigint<3>(b3_decimal)); - assert(b3a == b3); - assert(!(b3a.is_zero())); + EXPECT_EQ(b3a, bigint<3>(b3_decimal)); + EXPECT_EQ(b3a, b3); + EXPECT_FALSE(b3a.is_zero()); mpz_t m3; mpz_init(m3); b3.to_mpz(m3); bigint<3> b3b { m3 }; - assert(b3b == b3); + EXPECT_EQ(b3b, b3); bigint<2> quotient; bigint<2> remainder; bigint<3>::div_qr(quotient, remainder, b3, b2); - assert(quotient.num_bits() < GMP_NUMB_BITS); - assert(quotient.as_ulong() == b1.as_ulong()); + EXPECT_LT(quotient.num_bits(), GMP_NUMB_BITS); + EXPECT_EQ(quotient.as_ulong(), b1.as_ulong()); bigint<1> b1inc = bigint<1>("76749408"); bigint<1> b1a = quotient.shorten(b1inc, "test"); - assert(b1a == b1); - assert(remainder.is_zero()); + EXPECT_EQ(b1a, b1); + EXPECT_TRUE(remainder.is_zero()); remainder.limit(b2, "test"); - try { - (void)(quotient.shorten(b1, "test")); - assert(false); - } catch (std::domain_error) {} - try { - remainder.limit(remainder, "test"); - assert(false); - } catch (std::domain_error) {} + EXPECT_THROW((void)(quotient.shorten(b1, "test")), std::domain_error); + EXPECT_THROW(remainder.limit(remainder, "test"), std::domain_error); bigint<1> br = bigint<1>("42"); b3 += br; - assert(b3 != b3a); - assert(b3 > b3a); - assert(!(b3a > b3)); + EXPECT_NE(b3, b3a); + EXPECT_GT(b3, b3a); + EXPECT_FALSE(b3a > b3); bigint<3>::div_qr(quotient, remainder, b3, b2); - assert(quotient.num_bits() < GMP_NUMB_BITS); - assert(quotient.as_ulong() == b1.as_ulong()); - assert(remainder.num_bits() < GMP_NUMB_BITS); - assert(remainder.as_ulong() == 42); + EXPECT_LT(quotient.num_bits(), GMP_NUMB_BITS); + EXPECT_EQ(quotient.as_ulong(), b1.as_ulong()); + EXPECT_LT(remainder.num_bits(), GMP_NUMB_BITS); + EXPECT_EQ(remainder.as_ulong(), 42); b3a.clear(); - assert(b3a.is_zero()); - assert(b3a.num_bits() == 0); - assert(!(b3.is_zero())); + EXPECT_TRUE(b3a.is_zero()); + EXPECT_EQ(b3a.num_bits(), 0); + EXPECT_FALSE(b3.is_zero()); bigint<4> bx = bigint<4>().randomize(); bigint<4> by = bigint<4>().randomize(); - assert(!(bx == by)); + EXPECT_FALSE(bx == by); // TODO: test serialization } -int main(void) -{ - test_bigint(); - return 0; -} - diff --git a/src/snark/src/algebra/fields/tests/test_fields.cpp b/src/snark/src/algebra/fields/tests/test_fields.cpp index a05f601e6..f4fc3319a 100644 --- a/src/snark/src/algebra/fields/tests/test_fields.cpp +++ b/src/snark/src/algebra/fields/tests/test_fields.cpp @@ -15,6 +15,8 @@ #include "algebra/fields/fp6_3over2.hpp" #include "algebra/fields/fp12_2over3over2.hpp" +#include + using namespace libsnark; template @@ -29,25 +31,25 @@ void test_field() FieldT a = FieldT::random_element(); FieldT a_ser; a_ser = reserialize(a); - assert(a_ser == a); + EXPECT_EQ(a_ser, a); FieldT b = FieldT::random_element(); FieldT c = FieldT::random_element(); FieldT d = FieldT::random_element(); - assert(a != zero); - assert(a != one); + EXPECT_NE(a, zero); + EXPECT_NE(a, one); - assert(a * a == a.squared()); - assert((a + b).squared() == a.squared() + a*b + b*a + b.squared()); - assert((a + b)*(c + d) == a*c + a*d + b*c + b*d); - assert(a - b == a + (-b)); - assert(a - b == (-b) + a); + EXPECT_EQ(a * a, a.squared()); + EXPECT_EQ((a + b).squared(), a.squared() + a*b + b*a + b.squared()); + EXPECT_EQ((a + b)*(c + d), a*c + a*d + b*c + b*d); + EXPECT_EQ(a - b, a + (-b)); + EXPECT_EQ(a - b, (-b) + a); - assert((a ^ rand1) * (a ^ rand2) == (a^randsum)); + EXPECT_EQ((a ^ rand1) * (a ^ rand2), (a^randsum)); - assert(a * a.inverse() == one); - assert((a + b) * c.inverse() == a * c.inverse() + (b.inverse() * c).inverse()); + EXPECT_EQ(a * a.inverse(), one); + EXPECT_EQ((a + b) * c.inverse(), a * c.inverse() + (b.inverse() * c).inverse()); } @@ -58,7 +60,7 @@ void test_sqrt() { FieldT a = FieldT::random_element(); FieldT asq = a.squared(); - assert(asq.sqrt() == a || asq.sqrt() == -a); + EXPECT_TRUE(asq.sqrt() == a || asq.sqrt() == -a); } } @@ -66,21 +68,21 @@ template void test_two_squarings() { FieldT a = FieldT::random_element(); - assert(a.squared() == a * a); - assert(a.squared() == a.squared_complex()); - assert(a.squared() == a.squared_karatsuba()); + EXPECT_EQ(a.squared(), a * a); + EXPECT_EQ(a.squared(), a.squared_complex()); + EXPECT_EQ(a.squared(), a.squared_karatsuba()); } template void test_Frobenius() { FieldT a = FieldT::random_element(); - assert(a.Frobenius_map(0) == a); + EXPECT_EQ(a.Frobenius_map(0), a); FieldT a_q = a ^ FieldT::base_field_char(); for (size_t power = 1; power < 10; ++power) { const FieldT a_qi = a.Frobenius_map(power); - assert(a_qi == a_q); + EXPECT_EQ(a_qi, a_q); a_q = a_q ^ FieldT::base_field_char(); } @@ -89,10 +91,10 @@ void test_Frobenius() template void test_unitary_inverse() { - assert(FieldT::extension_degree() % 2 == 0); + EXPECT_EQ(FieldT::extension_degree() % 2, 0); FieldT a = FieldT::random_element(); FieldT aqcubed_minus1 = a.Frobenius_map(FieldT::extension_degree()/2) * a.inverse(); - assert(aqcubed_minus1.inverse() == aqcubed_minus1.unitary_inverse()); + EXPECT_EQ(aqcubed_minus1.inverse(), aqcubed_minus1.unitary_inverse()); } template @@ -102,36 +104,36 @@ template<> void test_cyclotomic_squaring >() { typedef Fqk FieldT; - assert(FieldT::extension_degree() % 2 == 0); + EXPECT_EQ(FieldT::extension_degree() % 2, 0); FieldT a = FieldT::random_element(); FieldT a_unitary = a.Frobenius_map(FieldT::extension_degree()/2) * a.inverse(); // beta = a^((q^(k/2)-1)*(q+1)) FieldT beta = a_unitary.Frobenius_map(1) * a_unitary; - assert(beta.cyclotomic_squared() == beta.squared()); + EXPECT_EQ(beta.cyclotomic_squared(), beta.squared()); } template<> void test_cyclotomic_squaring >() { typedef Fqk FieldT; - assert(FieldT::extension_degree() % 2 == 0); + EXPECT_EQ(FieldT::extension_degree() % 2, 0); FieldT a = FieldT::random_element(); FieldT a_unitary = a.Frobenius_map(FieldT::extension_degree()/2) * a.inverse(); // beta = a^(q^(k/2)-1) FieldT beta = a_unitary; - assert(beta.cyclotomic_squared() == beta.squared()); + EXPECT_EQ(beta.cyclotomic_squared(), beta.squared()); } template<> void test_cyclotomic_squaring >() { typedef Fqk FieldT; - assert(FieldT::extension_degree() % 2 == 0); + EXPECT_EQ(FieldT::extension_degree() % 2, 0); FieldT a = FieldT::random_element(); FieldT a_unitary = a.Frobenius_map(FieldT::extension_degree()/2) * a.inverse(); // beta = a^((q^(k/2)-1)*(q+1)) FieldT beta = a_unitary.Frobenius_map(1) * a_unitary; - assert(beta.cyclotomic_squared() == beta.squared()); + EXPECT_EQ(beta.cyclotomic_squared(), beta.squared()); } template @@ -197,16 +199,16 @@ void test_Fp4_tom_cook() c2 = - (FieldT(5)*(FieldT(4).inverse()))* v0 + (FieldT(2)*(FieldT(3).inverse()))*(v1 + v2) - FieldT(24).inverse()*(v3 + v4) + FieldT(4)*v6 + beta*v6; c3 = FieldT(12).inverse() * (FieldT(5)*v0 - FieldT(7)*v1) - FieldT(24).inverse()*(v2 - FieldT(7)*v3 + v4 + v5) + FieldT(15)*v6; - assert(res == correct_res); + EXPECT_EQ(res, correct_res); // {v0, v3, v4, v5} const FieldT u = (FieldT::one() - beta).inverse(); - assert(v0 == u * c0 + beta * u * c2 - beta * u * FieldT(2).inverse() * v1 - beta * u * FieldT(2).inverse() * v2 + beta * v6); - assert(v3 == - FieldT(15) * u * c0 - FieldT(30) * u * c1 - FieldT(3) * (FieldT(4) + beta) * u * c2 - FieldT(6) * (FieldT(4) + beta) * u * c3 + (FieldT(24) - FieldT(3) * beta * FieldT(2).inverse()) * u * v1 + (-FieldT(8) + beta * FieldT(2).inverse()) * u * v2 + EXPECT_EQ(v0, u * c0 + beta * u * c2 - beta * u * FieldT(2).inverse() * v1 - beta * u * FieldT(2).inverse() * v2 + beta * v6); + EXPECT_EQ(v3, - FieldT(15) * u * c0 - FieldT(30) * u * c1 - FieldT(3) * (FieldT(4) + beta) * u * c2 - FieldT(6) * (FieldT(4) + beta) * u * c3 + (FieldT(24) - FieldT(3) * beta * FieldT(2).inverse()) * u * v1 + (-FieldT(8) + beta * FieldT(2).inverse()) * u * v2 - FieldT(3) * (-FieldT(16) + beta) * v6); - assert(v4 == - FieldT(15) * u * c0 + FieldT(30) * u * c1 - FieldT(3) * (FieldT(4) + beta) * u * c2 + FieldT(6) * (FieldT(4) + beta) * u * c3 + (FieldT(24) - FieldT(3) * beta * FieldT(2).inverse()) * u * v2 + (-FieldT(8) + beta * FieldT(2).inverse()) * u * v1 + EXPECT_EQ(v4, - FieldT(15) * u * c0 + FieldT(30) * u * c1 - FieldT(3) * (FieldT(4) + beta) * u * c2 + FieldT(6) * (FieldT(4) + beta) * u * c3 + (FieldT(24) - FieldT(3) * beta * FieldT(2).inverse()) * u * v2 + (-FieldT(8) + beta * FieldT(2).inverse()) * u * v1 - FieldT(3) * (-FieldT(16) + beta) * v6); - assert(v5 == - FieldT(80) * u * c0 - FieldT(240) * u * c1 - FieldT(8) * (FieldT(9) + beta) * u * c2 - FieldT(24) * (FieldT(9) + beta) * u * c3 - FieldT(2) * (-FieldT(81) + beta) * u * v1 + (-FieldT(81) + beta) * u * v2 + EXPECT_EQ(v5, - FieldT(80) * u * c0 - FieldT(240) * u * c1 - FieldT(8) * (FieldT(9) + beta) * u * c2 - FieldT(24) * (FieldT(9) + beta) * u * c3 - FieldT(2) * (-FieldT(81) + beta) * u * v1 + (-FieldT(81) + beta) * u * v2 - FieldT(8) * (-FieldT(81) + beta) * v6); // c0 + beta c2 - (beta v1)/2 - (beta v2)/ 2 - (-1 + beta) beta v6, @@ -216,7 +218,7 @@ void test_Fp4_tom_cook() } } -int main(void) +TEST(algebra, fields) { edwards_pp::init_public_params(); test_all_fields(); diff --git a/src/snark/src/gadgetlib1/gadgets/hashes/sha256/tests/test_sha256_gadget.cpp b/src/snark/src/gadgetlib1/gadgets/hashes/sha256/tests/test_sha256_gadget.cpp index 471928f6a..0bfaf3a12 100644 --- a/src/snark/src/gadgetlib1/gadgets/hashes/sha256/tests/test_sha256_gadget.cpp +++ b/src/snark/src/gadgetlib1/gadgets/hashes/sha256/tests/test_sha256_gadget.cpp @@ -10,6 +10,8 @@ #include "common/profiling.hpp" #include "gadgetlib1/gadgets/hashes/sha256/sha256_gadget.hpp" +#include + using namespace libsnark; template @@ -35,10 +37,10 @@ void test_two_to_one() f.generate_r1cs_witness(); output.generate_r1cs_witness(hash_bv); - assert(pb.is_satisfied()); + EXPECT_TRUE(pb.is_satisfied()); } -int main(void) +TEST(gadgetlib1, sha256) { start_profiling(); default_ec_pp::init_public_params(); diff --git a/src/snark/src/gadgetlib1/gadgets/merkle_tree/tests/test_merkle_tree_gadgets.cpp b/src/snark/src/gadgetlib1/gadgets/merkle_tree/tests/test_merkle_tree_gadgets.cpp index 8d52c579b..955a05440 100644 --- a/src/snark/src/gadgetlib1/gadgets/merkle_tree/tests/test_merkle_tree_gadgets.cpp +++ b/src/snark/src/gadgetlib1/gadgets/merkle_tree/tests/test_merkle_tree_gadgets.cpp @@ -15,6 +15,8 @@ #include "gadgetlib1/gadgets/merkle_tree/merkle_tree_check_update_gadget.hpp" #include "gadgetlib1/gadgets/hashes/sha256/sha256_gadget.hpp" +#include + using namespace libsnark; template @@ -28,7 +30,7 @@ void test_all_merkle_tree_gadgets() test_merkle_tree_check_update_gadget >(); } -int main(void) +TEST(gadgetlib1, merkle_tree) { start_profiling(); diff --git a/src/snark/src/relations/arithmetic_programs/qap/tests/test_qap.cpp b/src/snark/src/relations/arithmetic_programs/qap/tests/test_qap.cpp index d8aaddaa7..d77662926 100644 --- a/src/snark/src/relations/arithmetic_programs/qap/tests/test_qap.cpp +++ b/src/snark/src/relations/arithmetic_programs/qap/tests/test_qap.cpp @@ -17,6 +17,8 @@ #include "reductions/r1cs_to_qap/r1cs_to_qap.hpp" #include "relations/constraint_satisfaction_problems/r1cs/examples/r1cs_examples.hpp" +#include + using namespace libsnark; template @@ -28,7 +30,7 @@ void test_qap(const size_t qap_degree, const size_t num_inputs, const bool binar See the transformation from R1CS to QAP for why this is the case. So we need that qap_degree >= num_inputs + 1. */ - assert(num_inputs + 1 <= qap_degree); + ASSERT_LE(num_inputs + 1, qap_degree); enter_block("Call to test_qap"); const size_t num_constraints = qap_degree - num_inputs - 1; @@ -51,7 +53,7 @@ void test_qap(const size_t qap_degree, const size_t num_inputs, const bool binar leave_block("Generate constraint system and assignment"); enter_block("Check satisfiability of constraint system"); - assert(example.constraint_system.is_satisfied(example.primary_input, example.auxiliary_input)); + EXPECT_TRUE(example.constraint_system.is_satisfied(example.primary_input, example.auxiliary_input)); leave_block("Check satisfiability of constraint system"); const FieldT t = FieldT::random_element(), @@ -72,17 +74,17 @@ void test_qap(const size_t qap_degree, const size_t num_inputs, const bool binar leave_block("Compute QAP witness"); enter_block("Check satisfiability of QAP instance 1"); - assert(qap_inst_1.is_satisfied(qap_wit)); + EXPECT_TRUE(qap_inst_1.is_satisfied(qap_wit)); leave_block("Check satisfiability of QAP instance 1"); enter_block("Check satisfiability of QAP instance 2"); - assert(qap_inst_2.is_satisfied(qap_wit)); + EXPECT_TRUE(qap_inst_2.is_satisfied(qap_wit)); leave_block("Check satisfiability of QAP instance 2"); leave_block("Call to test_qap"); } -int main() +TEST(relations, qap) { start_profiling(); diff --git a/src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/tests/test_r1cs_ppzksnark.cpp b/src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/tests/test_r1cs_ppzksnark.cpp index 6f8b575f2..36b573549 100644 --- a/src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/tests/test_r1cs_ppzksnark.cpp +++ b/src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/tests/test_r1cs_ppzksnark.cpp @@ -17,6 +17,8 @@ #include "relations/constraint_satisfaction_problems/r1cs/examples/r1cs_examples.hpp" #include "zk_proof_systems/ppzksnark/r1cs_ppzksnark/examples/run_r1cs_ppzksnark.hpp" +#include + using namespace libsnark; template @@ -28,12 +30,12 @@ void test_r1cs_ppzksnark(size_t num_constraints, const bool test_serialization = true; r1cs_example > example = generate_r1cs_example_with_binary_input >(num_constraints, input_size); const bool bit = run_r1cs_ppzksnark(example, test_serialization); - assert(bit); + EXPECT_TRUE(bit); print_header("(leave) Test R1CS ppzkSNARK"); } -int main() +TEST(zk_proof_systems, r1cs_ppzksnark) { default_r1cs_ppzksnark_pp::init_public_params(); start_profiling(); From df3083fe4e90cd7f1d501f37c813cb37f2ff8687 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 11 Oct 2017 14:56:25 +0100 Subject: [PATCH 0243/1062] Remove test code corresponding to removed code --- .../algebra/curves/tests/test_bilinearity.cpp | 17 ------ .../src/algebra/curves/tests/test_groups.cpp | 24 -------- .../src/algebra/fields/tests/test_fields.cpp | 56 ------------------- .../merkle_tree_check_update_gadget.hpp | 1 - .../tests/test_merkle_tree_gadgets.cpp | 14 ----- .../qap/tests/test_qap.cpp | 18 ------ 6 files changed, 130 deletions(-) diff --git a/src/snark/src/algebra/curves/tests/test_bilinearity.cpp b/src/snark/src/algebra/curves/tests/test_bilinearity.cpp index 529bec337..fe6593bae 100644 --- a/src/snark/src/algebra/curves/tests/test_bilinearity.cpp +++ b/src/snark/src/algebra/curves/tests/test_bilinearity.cpp @@ -5,13 +5,10 @@ * @copyright MIT license (see LICENSE file) *****************************************************************************/ #include "common/profiling.hpp" -#include "algebra/curves/edwards/edwards_pp.hpp" #ifdef CURVE_BN128 #include "algebra/curves/bn128/bn128_pp.hpp" #endif #include "algebra/curves/alt_bn128/alt_bn128_pp.hpp" -#include "algebra/curves/mnt/mnt4/mnt4_pp.hpp" -#include "algebra/curves/mnt/mnt6/mnt6_pp.hpp" #include @@ -112,20 +109,6 @@ void affine_pairing_test() TEST(algebra, bilinearity) { start_profiling(); - edwards_pp::init_public_params(); - pairing_test(); - double_miller_loop_test(); - - mnt6_pp::init_public_params(); - pairing_test(); - double_miller_loop_test(); - affine_pairing_test(); - - mnt4_pp::init_public_params(); - pairing_test(); - double_miller_loop_test(); - affine_pairing_test(); - alt_bn128_pp::init_public_params(); pairing_test(); double_miller_loop_test(); diff --git a/src/snark/src/algebra/curves/tests/test_groups.cpp b/src/snark/src/algebra/curves/tests/test_groups.cpp index 087ee3d52..7bb7c31cc 100644 --- a/src/snark/src/algebra/curves/tests/test_groups.cpp +++ b/src/snark/src/algebra/curves/tests/test_groups.cpp @@ -5,9 +5,6 @@ * @copyright MIT license (see LICENSE file) *****************************************************************************/ #include "common/profiling.hpp" -#include "algebra/curves/edwards/edwards_pp.hpp" -#include "algebra/curves/mnt/mnt4/mnt4_pp.hpp" -#include "algebra/curves/mnt/mnt6/mnt6_pp.hpp" #ifdef CURVE_BN128 #include "algebra/curves/bn128/bn128_pp.hpp" #endif @@ -139,27 +136,6 @@ void test_output() TEST(algebra, groups) { - edwards_pp::init_public_params(); - test_group >(); - test_output >(); - test_group >(); - test_output >(); - test_mul_by_q >(); - - mnt4_pp::init_public_params(); - test_group >(); - test_output >(); - test_group >(); - test_output >(); - test_mul_by_q >(); - - mnt6_pp::init_public_params(); - test_group >(); - test_output >(); - test_group >(); - test_output >(); - test_mul_by_q >(); - alt_bn128_pp::init_public_params(); test_group >(); test_output >(); diff --git a/src/snark/src/algebra/fields/tests/test_fields.cpp b/src/snark/src/algebra/fields/tests/test_fields.cpp index f4fc3319a..969800d8b 100644 --- a/src/snark/src/algebra/fields/tests/test_fields.cpp +++ b/src/snark/src/algebra/fields/tests/test_fields.cpp @@ -5,9 +5,6 @@ * @copyright MIT license (see LICENSE file) *****************************************************************************/ #include "common/profiling.hpp" -#include "algebra/curves/edwards/edwards_pp.hpp" -#include "algebra/curves/mnt/mnt4/mnt4_pp.hpp" -#include "algebra/curves/mnt/mnt6/mnt6_pp.hpp" #ifdef CURVE_BN128 #include "algebra/curves/bn128/bn128_pp.hpp" #endif @@ -97,45 +94,6 @@ void test_unitary_inverse() EXPECT_EQ(aqcubed_minus1.inverse(), aqcubed_minus1.unitary_inverse()); } -template -void test_cyclotomic_squaring(); - -template<> -void test_cyclotomic_squaring >() -{ - typedef Fqk FieldT; - EXPECT_EQ(FieldT::extension_degree() % 2, 0); - FieldT a = FieldT::random_element(); - FieldT a_unitary = a.Frobenius_map(FieldT::extension_degree()/2) * a.inverse(); - // beta = a^((q^(k/2)-1)*(q+1)) - FieldT beta = a_unitary.Frobenius_map(1) * a_unitary; - EXPECT_EQ(beta.cyclotomic_squared(), beta.squared()); -} - -template<> -void test_cyclotomic_squaring >() -{ - typedef Fqk FieldT; - EXPECT_EQ(FieldT::extension_degree() % 2, 0); - FieldT a = FieldT::random_element(); - FieldT a_unitary = a.Frobenius_map(FieldT::extension_degree()/2) * a.inverse(); - // beta = a^(q^(k/2)-1) - FieldT beta = a_unitary; - EXPECT_EQ(beta.cyclotomic_squared(), beta.squared()); -} - -template<> -void test_cyclotomic_squaring >() -{ - typedef Fqk FieldT; - EXPECT_EQ(FieldT::extension_degree() % 2, 0); - FieldT a = FieldT::random_element(); - FieldT a_unitary = a.Frobenius_map(FieldT::extension_degree()/2) * a.inverse(); - // beta = a^((q^(k/2)-1)*(q+1)) - FieldT beta = a_unitary.Frobenius_map(1) * a_unitary; - EXPECT_EQ(beta.cyclotomic_squared(), beta.squared()); -} - template void test_all_fields() { @@ -220,20 +178,6 @@ void test_Fp4_tom_cook() TEST(algebra, fields) { - edwards_pp::init_public_params(); - test_all_fields(); - test_cyclotomic_squaring >(); - - mnt4_pp::init_public_params(); - test_all_fields(); - test_Fp4_tom_cook(); - test_two_squarings >(); - test_cyclotomic_squaring >(); - - mnt6_pp::init_public_params(); - test_all_fields(); - test_cyclotomic_squaring >(); - alt_bn128_pp::init_public_params(); test_field(); test_Frobenius(); diff --git a/src/snark/src/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_update_gadget.hpp b/src/snark/src/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_update_gadget.hpp index 2d6840d61..6ec0ca11f 100644 --- a/src/snark/src/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_update_gadget.hpp +++ b/src/snark/src/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_update_gadget.hpp @@ -19,7 +19,6 @@ #include "common/data_structures/merkle_tree.hpp" #include "gadgetlib1/gadget.hpp" -#include "gadgetlib1/gadgets/hashes/crh_gadget.hpp" #include "gadgetlib1/gadgets/hashes/hash_io.hpp" #include "gadgetlib1/gadgets/hashes/digest_selector_gadget.hpp" #include "gadgetlib1/gadgets/merkle_tree/merkle_authentication_path_variable.hpp" diff --git a/src/snark/src/gadgetlib1/gadgets/merkle_tree/tests/test_merkle_tree_gadgets.cpp b/src/snark/src/gadgetlib1/gadgets/merkle_tree/tests/test_merkle_tree_gadgets.cpp index 955a05440..5f454687f 100644 --- a/src/snark/src/gadgetlib1/gadgets/merkle_tree/tests/test_merkle_tree_gadgets.cpp +++ b/src/snark/src/gadgetlib1/gadgets/merkle_tree/tests/test_merkle_tree_gadgets.cpp @@ -8,9 +8,6 @@ #ifdef CURVE_BN128 #include "algebra/curves/bn128/bn128_pp.hpp" #endif -#include "algebra/curves/edwards/edwards_pp.hpp" -#include "algebra/curves/mnt/mnt4/mnt4_pp.hpp" -#include "algebra/curves/mnt/mnt6/mnt6_pp.hpp" #include "gadgetlib1/gadgets/merkle_tree/merkle_tree_check_read_gadget.hpp" #include "gadgetlib1/gadgets/merkle_tree/merkle_tree_check_update_gadget.hpp" #include "gadgetlib1/gadgets/hashes/sha256/sha256_gadget.hpp" @@ -23,10 +20,8 @@ template void test_all_merkle_tree_gadgets() { typedef Fr FieldT; - test_merkle_tree_check_read_gadget >(); test_merkle_tree_check_read_gadget >(); - test_merkle_tree_check_update_gadget >(); test_merkle_tree_check_update_gadget >(); } @@ -38,13 +33,4 @@ TEST(gadgetlib1, merkle_tree) bn128_pp::init_public_params(); test_all_merkle_tree_gadgets(); #endif - - edwards_pp::init_public_params(); - test_all_merkle_tree_gadgets(); - - mnt4_pp::init_public_params(); - test_all_merkle_tree_gadgets(); - - mnt6_pp::init_public_params(); - test_all_merkle_tree_gadgets(); } diff --git a/src/snark/src/relations/arithmetic_programs/qap/tests/test_qap.cpp b/src/snark/src/relations/arithmetic_programs/qap/tests/test_qap.cpp index d77662926..2cfa4fc92 100644 --- a/src/snark/src/relations/arithmetic_programs/qap/tests/test_qap.cpp +++ b/src/snark/src/relations/arithmetic_programs/qap/tests/test_qap.cpp @@ -10,7 +10,6 @@ #include #include -#include "algebra/curves/mnt/mnt6/mnt6_pp.hpp" #include "algebra/fields/field_utils.hpp" #include "common/profiling.hpp" #include "common/utils.hpp" @@ -88,30 +87,13 @@ TEST(relations, qap) { start_profiling(); - mnt6_pp::init_public_params(); - const size_t num_inputs = 10; - const size_t basic_domain_size = 1ul< >(basic_domain_size, num_inputs, true); - test_qap >(step_domain_size, num_inputs, true); - test_qap >(extended_domain_size, num_inputs, true); - test_qap >(extended_domain_size_special, num_inputs, true); - leave_block("Test QAP with binary input"); enter_block("Test QAP with field input"); - test_qap >(basic_domain_size, num_inputs, false); - test_qap >(step_domain_size, num_inputs, false); - test_qap >(extended_domain_size, num_inputs, false); - test_qap >(extended_domain_size_special, num_inputs, false); - leave_block("Test QAP with field input"); } From 4699d0eb36e2049f692ead9f44c5886ba87a007c Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 11 Oct 2017 15:18:01 +0100 Subject: [PATCH 0244/1062] Add alt_bn128 to QAP and Merkle tree gadget tests --- .../gadgets/merkle_tree/tests/test_merkle_tree_gadgets.cpp | 4 ++++ .../src/relations/arithmetic_programs/qap/tests/test_qap.cpp | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/src/snark/src/gadgetlib1/gadgets/merkle_tree/tests/test_merkle_tree_gadgets.cpp b/src/snark/src/gadgetlib1/gadgets/merkle_tree/tests/test_merkle_tree_gadgets.cpp index 5f454687f..27b52f9ec 100644 --- a/src/snark/src/gadgetlib1/gadgets/merkle_tree/tests/test_merkle_tree_gadgets.cpp +++ b/src/snark/src/gadgetlib1/gadgets/merkle_tree/tests/test_merkle_tree_gadgets.cpp @@ -5,6 +5,7 @@ * @copyright MIT license (see LICENSE file) *****************************************************************************/ +#include "algebra/curves/alt_bn128/alt_bn128_pp.hpp" #ifdef CURVE_BN128 #include "algebra/curves/bn128/bn128_pp.hpp" #endif @@ -29,6 +30,9 @@ TEST(gadgetlib1, merkle_tree) { start_profiling(); + alt_bn128_pp::init_public_params(); + test_all_merkle_tree_gadgets(); + #ifdef CURVE_BN128 // BN128 has fancy dependencies so it may be disabled bn128_pp::init_public_params(); test_all_merkle_tree_gadgets(); diff --git a/src/snark/src/relations/arithmetic_programs/qap/tests/test_qap.cpp b/src/snark/src/relations/arithmetic_programs/qap/tests/test_qap.cpp index 2cfa4fc92..e20f589c9 100644 --- a/src/snark/src/relations/arithmetic_programs/qap/tests/test_qap.cpp +++ b/src/snark/src/relations/arithmetic_programs/qap/tests/test_qap.cpp @@ -10,6 +10,7 @@ #include #include +#include "algebra/curves/alt_bn128/alt_bn128_pp.hpp" #include "algebra/fields/field_utils.hpp" #include "common/profiling.hpp" #include "common/utils.hpp" @@ -91,9 +92,13 @@ TEST(relations, qap) enter_block("Test QAP with binary input"); + test_qap >(1ul << 21, num_inputs, true); + leave_block("Test QAP with binary input"); enter_block("Test QAP with field input"); + test_qap >(1ul << 21, num_inputs, false); + leave_block("Test QAP with field input"); } From 638e742f3f32f8a65e8133f597d2813acad8ab93 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 11 Oct 2017 15:19:33 +0100 Subject: [PATCH 0245/1062] Update libsnark LDLIBS -lsodium is necessary as we altered libsnark to use libsodium's RNG. --- src/snark/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/snark/Makefile b/src/snark/Makefile index fe565a906..f069d1b0c 100644 --- a/src/snark/Makefile +++ b/src/snark/Makefile @@ -19,7 +19,7 @@ DEPINST = depinst CXXFLAGS += -I$(DEPINST)/include -Isrc LDFLAGS += -L$(DEPINST)/lib -Wl,-rpath,$(DEPINST)/lib -LDLIBS += -lgmpxx -lgmp -lboost_program_options +LDLIBS += -lgmpxx -lgmp -lboost_program_options-mt -lsodium # OpenSSL and its dependencies (needed explicitly for static builds): LDLIBS += -lcrypto -ldl -lz # List of .a files to include within libsnark.a and libsnark.so: From 19f6668c27d1838999b1be7dc280a6788d535884 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 11 Oct 2017 15:21:44 +0100 Subject: [PATCH 0246/1062] Add "make check" to libsnark that runs the Google Tests --- src/snark/Makefile | 46 ++++++++++++++++++++++++---------------- src/snark/src/gtests.cpp | 12 +++++++++++ 2 files changed, 40 insertions(+), 18 deletions(-) create mode 100644 src/snark/src/gtests.cpp diff --git a/src/snark/Makefile b/src/snark/Makefile index f069d1b0c..427f4f4ce 100644 --- a/src/snark/Makefile +++ b/src/snark/Makefile @@ -70,20 +70,14 @@ endif # FIXME: most of these are broken due to removed code. DISABLED_EXECUTABLES = \ - src/algebra/curves/tests/test_bilinearity \ - src/algebra/curves/tests/test_groups \ - src/algebra/fields/tests/test_fields \ src/common/routing_algorithms/profiling/profile_routing_algorithms \ src/common/routing_algorithms/tests/test_routing_algorithms \ src/gadgetlib1/gadgets/cpu_checkers/fooram/examples/test_fooram \ src/gadgetlib1/gadgets/hashes/knapsack/tests/test_knapsack_gadget \ - src/gadgetlib1/gadgets/hashes/sha256/tests/test_sha256_gadget \ - src/gadgetlib1/gadgets/merkle_tree/tests/test_merkle_tree_gadgets \ src/gadgetlib1/gadgets/routing/profiling/profile_routing_gadgets \ src/gadgetlib1/gadgets/set_commitment/tests/test_set_commitment_gadget \ src/gadgetlib1/gadgets/verifiers/tests/test_r1cs_ppzksnark_verifier_gadget \ src/reductions/ram_to_r1cs/examples/demo_arithmetization \ - src/relations/arithmetic_programs/qap/tests/test_qap \ src/relations/arithmetic_programs/ssp/tests/test_ssp \ src/zk_proof_systems/pcd/r1cs_pcd/r1cs_mp_ppzkpcd/profiling/profile_r1cs_mp_ppzkpcd \ src/zk_proof_systems/pcd/r1cs_pcd/r1cs_mp_ppzkpcd/tests/test_r1cs_mp_ppzkpcd \ @@ -94,7 +88,6 @@ DISABLED_EXECUTABLES = \ src/zk_proof_systems/ppzksnark/r1cs_gg_ppzksnark/profiling/profile_r1cs_gg_ppzksnark \ src/zk_proof_systems/ppzksnark/r1cs_gg_ppzksnark/tests/test_r1cs_gg_ppzksnark \ src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/profiling/profile_r1cs_ppzksnark \ - src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/tests/test_r1cs_ppzksnark \ src/zk_proof_systems/ppzksnark/ram_ppzksnark/examples/demo_ram_ppzksnark \ src/zk_proof_systems/ppzksnark/ram_ppzksnark/examples/demo_ram_ppzksnark_generator \ src/zk_proof_systems/ppzksnark/ram_ppzksnark/examples/demo_ram_ppzksnark_prover \ @@ -108,16 +101,26 @@ DISABLED_EXECUTABLES = \ src/zk_proof_systems/zksnark/ram_zksnark/profiling/profile_ram_zksnark \ src/zk_proof_systems/zksnark/ram_zksnark/tests/test_ram_zksnark -EXECUTABLES = \ - src/algebra/fields/tests/test_bigint +EXECUTABLES = -EXECUTABLES_WITH_GTEST = \ - src/gadgetlib2/examples/tutorial \ - src/gadgetlib2/tests/gadgetlib2_test +EXECUTABLES_WITH_GTEST = EXECUTABLES_WITH_SUPERCOP = \ src/zk_proof_systems/ppzkadsnark/r1cs_ppzkadsnark/examples/demo_r1cs_ppzkadsnark +GTEST_TESTS = src/gtests + +GTEST_SRCS = \ + src/algebra/curves/tests/test_bilinearity.cpp \ + src/algebra/curves/tests/test_groups.cpp \ + src/algebra/fields/tests/test_bigint.cpp \ + src/algebra/fields/tests/test_fields.cpp \ + src/gadgetlib1/gadgets/hashes/sha256/tests/test_sha256_gadget.cpp \ + src/gadgetlib1/gadgets/merkle_tree/tests/test_merkle_tree_gadgets.cpp \ + src/relations/arithmetic_programs/qap/tests/test_qap.cpp \ + src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/tests/test_r1cs_ppzksnark.cpp \ + src/gtests.cpp + DOCS = README.html LIBSNARK_A = libsnark.a @@ -168,9 +171,10 @@ endif LIB_OBJS =$(patsubst %.cpp,%.o,$(LIB_SRCS)) EXEC_OBJS =$(patsubst %,%.o,$(EXECUTABLES) $(EXECUTABLES_WITH_GTEST) $(EXECUTABLES_WITH_SUPERCOP)) +GTEST_OBJS =$(patsubst %.cpp,%.o,$(GTEST_SRCS)) all: \ - $(if $(NO_GTEST),,$(EXECUTABLES_WITH_GTEST)) \ + $(if $(NO_GTEST),,$(EXECUTABLES_WITH_GTEST) $(GTEST_TESTS)) \ $(if $(NO_SUPERCOP),,$(EXECUTABLES_WITH_SUPERCOP)) \ $(EXECUTABLES) \ $(if $(NO_DOCS),,doc) @@ -183,9 +187,9 @@ $(DEPINST_EXISTS): touch $@ # In order to detect changes to #include dependencies. -MMD below generates a .d file for each .o file. Include the .d file. --include $(patsubst %.o,%.d, $(LIB_OBJS) $(EXEC_OBJS) ) +-include $(patsubst %.o,%.d, $(LIB_OBJS) $(GTEST_OBJS) $(EXEC_OBJS) ) -$(LIB_OBJS) $(EXEC_OBJS): %.o: %.cpp +$(LIB_OBJS) $(if $(NO_GTEST),,$(GTEST_OBJS)) $(EXEC_OBJS): %.o: %.cpp $(CXX) -o $@ $< -c -MMD $(CXXFLAGS) LIBGTEST_A = $(DEPINST)/lib/libgtest.a @@ -225,6 +229,9 @@ $(EXECUTABLES_WITH_GTEST): %: %.o $(LIBSNARK_A) $(if $(COMPILE_GTEST),$(LIBGTEST $(EXECUTABLES_WITH_SUPERCOP): %: %.o $(LIBSNARK_A) $(DEPINST_EXISTS) $(CXX) -o $@ $@.o $(LIBSNARK_A) $(CXXFLAGS) $(LDFLAGS) $(SUPERCOP_LDLIBS) $(LDLIBS) +$(GTEST_TESTS): %: $(GTEST_OBJS) $(LIBSNARK_A) $(if $(COMPILE_GTEST),$(LIBGTEST_A)) $(DEPINST_EXISTS) + $(CXX) -o $@ $(GTEST_OBJS) $(LIBSNARK_A) $(CXXFLAGS) $(LDFLAGS) $(GTEST_LDLIBS) $(LDLIBS) + ifeq ($(STATIC),1) LIB_FILE = $(LIBSNARK_A) @@ -258,16 +265,19 @@ ifneq ($(NO_COPY_DEPINST),1) endif endif +check: $(GTEST_TESTS) + $(GTEST_TESTS) + doxy: doxygen doxygen.conf # Clean generated files, except locally-compiled dependencies clean: $(RM) \ - $(LIB_OBJS) $(EXEC_OBJS) \ - $(EXECUTABLES) $(EXECUTABLES_WITH_GTEST) $(EXECUTABLES_WITH_SUPERCOP) \ + $(LIB_OBJS) $(GTEST_OBJS) $(EXEC_OBJS) \ + $(EXECUTABLES) $(EXECUTABLES_WITH_GTEST) $(EXECUTABLES_WITH_SUPERCOP) $(GTEST_TESTS) \ $(DOCS) \ - ${patsubst %.o,%.d,${LIB_OBJS} ${EXEC_OBJS}} \ + ${patsubst %.o,%.d,${LIB_OBJS} ${GTEST_OBJS} ${EXEC_OBJS}} \ libsnark.so $(LIBSNARK_A) \ $(RM) -fr doxygen/ \ $(RM) $(LIBGTEST_A) $(DEPINST)/lib/gtest-all.o diff --git a/src/snark/src/gtests.cpp b/src/snark/src/gtests.cpp new file mode 100644 index 000000000..74c66bdad --- /dev/null +++ b/src/snark/src/gtests.cpp @@ -0,0 +1,12 @@ +#include + +#include "common/profiling.hpp" + +int main(int argc, char **argv) { + libsnark::inhibit_profiling_info = true; + libsnark::inhibit_profiling_counters = true; + + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} + From 82e839e4ff52e78a208b762f158dfcec5a20b058 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 11 Oct 2017 15:22:24 +0100 Subject: [PATCH 0247/1062] Add "make libsnark-tests" that runs libsnark's "make check" --- src/Makefile.am | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Makefile.am b/src/Makefile.am index ab3c7bc4c..3cbe02672 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -41,8 +41,14 @@ LIBZCASH=libzcash.a $(LIBSECP256K1): $(LIBSNARK) $(wildcard secp256k1/src/*) $(wildcard secp256k1/include/*) $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C $(@D) $(@F) +LIBSNARK_CXXFLAGS = -fPIC -DBINARY_OUTPUT -DNO_PT_COMPRESSION=1 +LIBSNARK_CONFIG_FLAGS = CURVE=ALT_BN128 MULTICORE=1 NO_PROCPS=1 NO_DOCS=1 STATIC=1 NO_SUPERCOP=1 FEATUREFLAGS=-DMONTGOMERY_OUTPUT NO_COPY_DEPINST=1 + $(LIBSNARK): $(wildcard snark/src/*) - CXXFLAGS="-fPIC -DBINARY_OUTPUT -DNO_PT_COMPRESSION=1" $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C snark/ install PREFIX=$(srcdir)/build DEPINST=$(prefix) CURVE=ALT_BN128 MULTICORE=1 NO_PROCPS=1 NO_GTEST=1 NO_DOCS=1 STATIC=1 NO_SUPERCOP=1 FEATUREFLAGS=-DMONTGOMERY_OUTPUT NO_COPY_DEPINST=1 OPTFLAGS="-O2 -march=x86-64" + $(AM_V_at) CXXFLAGS="$(LIBSNARK_CXXFLAGS)" $(MAKE) $(AM_MAKEFLAGS) -C snark/ install PREFIX=$(srcdir)/build DEPINST=$(prefix) $(LIBSNARK_CONFIG_FLAGS) OPTFLAGS="-O2 -march=x86-64" + +libsnark-tests: $(wildcard snark/src/*) + $(AM_V_at) CXXFLAGS="$(LIBSNARK_CXXFLAGS)" $(MAKE) $(AM_MAKEFLAGS) -C snark/ check PREFIX=$(srcdir)/build DEPINST=$(prefix) $(LIBSNARK_CONFIG_FLAGS) OPTFLAGS="-O2 -march=x86-64" $(LIBUNIVALUE): $(wildcard univalue/lib/*) $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C univalue/ From 8598c20d40e2b1f3fa466620457a2ae333e6c2a8 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 11 Oct 2017 15:31:42 +0100 Subject: [PATCH 0248/1062] Changes to get test_r1cs_ppzksnark passing --- .../r1cs_ppzksnark/examples/run_r1cs_ppzksnark.tcc | 2 +- .../ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.hpp | 3 ++- .../ppzksnark/r1cs_ppzksnark/tests/test_r1cs_ppzksnark.cpp | 6 +++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/examples/run_r1cs_ppzksnark.tcc b/src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/examples/run_r1cs_ppzksnark.tcc index 9bc875869..00af6fe25 100644 --- a/src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/examples/run_r1cs_ppzksnark.tcc +++ b/src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/examples/run_r1cs_ppzksnark.tcc @@ -83,7 +83,7 @@ bool run_r1cs_ppzksnark(const r1cs_example > &example, } print_header("R1CS ppzkSNARK Prover"); - r1cs_ppzksnark_proof proof = r1cs_ppzksnark_prover(keypair.pk, example.primary_input, example.auxiliary_input); + r1cs_ppzksnark_proof proof = r1cs_ppzksnark_prover(keypair.pk, example.primary_input, example.auxiliary_input, example.constraint_system); printf("\n"); print_indent(); print_mem("after prover"); if (test_serialization) diff --git a/src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.hpp b/src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.hpp index a068b09fd..36f6c1499 100644 --- a/src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.hpp +++ b/src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.hpp @@ -394,7 +394,8 @@ r1cs_ppzksnark_keypair r1cs_ppzksnark_generator( template r1cs_ppzksnark_proof r1cs_ppzksnark_prover(const r1cs_ppzksnark_proving_key &pk, const r1cs_ppzksnark_primary_input &primary_input, - const r1cs_ppzksnark_auxiliary_input &auxiliary_input); + const r1cs_ppzksnark_auxiliary_input &auxiliary_input, + const r1cs_ppzksnark_constraint_system &constraint_system); /* Below are four variants of verifier algorithm for the R1CS ppzkSNARK. diff --git a/src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/tests/test_r1cs_ppzksnark.cpp b/src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/tests/test_r1cs_ppzksnark.cpp index 36b573549..6c6e51857 100644 --- a/src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/tests/test_r1cs_ppzksnark.cpp +++ b/src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/tests/test_r1cs_ppzksnark.cpp @@ -11,7 +11,7 @@ #include #include -#include "common/default_types/r1cs_ppzksnark_pp.hpp" +#include "algebra/curves/alt_bn128/alt_bn128_pp.hpp" #include "common/profiling.hpp" #include "common/utils.hpp" #include "relations/constraint_satisfaction_problems/r1cs/examples/r1cs_examples.hpp" @@ -29,6 +29,7 @@ void test_r1cs_ppzksnark(size_t num_constraints, const bool test_serialization = true; r1cs_example > example = generate_r1cs_example_with_binary_input >(num_constraints, input_size); + example.constraint_system.swap_AB_if_beneficial(); const bool bit = run_r1cs_ppzksnark(example, test_serialization); EXPECT_TRUE(bit); @@ -37,8 +38,7 @@ void test_r1cs_ppzksnark(size_t num_constraints, TEST(zk_proof_systems, r1cs_ppzksnark) { - default_r1cs_ppzksnark_pp::init_public_params(); start_profiling(); - test_r1cs_ppzksnark(1000, 100); + test_r1cs_ppzksnark(1000, 20); } From 147fffb7ec757612a0e32e3479f662415f67d87f Mon Sep 17 00:00:00 2001 From: "Jonathan \"Duke\" Leto" Date: Mon, 16 Oct 2017 08:39:59 -0700 Subject: [PATCH 0249/1062] Fix bug where performance-measurements.sh fails hards when given no args Better than "$1: unbound variable", we ran into this when testing this script in the Hush repo, so we are pushing this fix upstream. --- qa/zcash/performance-measurements.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/qa/zcash/performance-measurements.sh b/qa/zcash/performance-measurements.sh index 68de22892..fd7b30ffa 100755 --- a/qa/zcash/performance-measurements.sh +++ b/qa/zcash/performance-measurements.sh @@ -154,6 +154,13 @@ EOF xzcat block-107134.tar.xz | tar x -C "$DATADIR/regtest" } + +if [ $# -lt 2 ] +then + echo "$0 : two arguments are required!" + exit 1 +fi + # Precomputation case "$1" in *) From 88fbdc48688f6d3f3bfaa5ae46a54e08e3571e83 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Mon, 16 Oct 2017 16:15:10 -0400 Subject: [PATCH 0250/1062] Add bitcoin-util-test.py to full_test_suite.py Not moved, because upstream makes improvements to this script, and the need to set environment variables makes it simpler to just use the given script. --- qa/zcash/full_test_suite.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/qa/zcash/full_test_suite.py b/qa/zcash/full_test_suite.py index 6e890c49a..ecdd3a39a 100755 --- a/qa/zcash/full_test_suite.py +++ b/qa/zcash/full_test_suite.py @@ -110,6 +110,13 @@ def ensure_no_dot_so_in_depends(): return exit_code == 0 +def util_test(): + return subprocess.call( + [repofile('src/test/bitcoin-util-test.py')], + cwd=repofile('src'), + env={'PYTHONPATH': repofile('src/test'), 'srcdir': repofile('src')} + ) == 0 + # # Tests @@ -120,6 +127,7 @@ STAGES = [ 'gtest', 'sec-hard', 'no-dot-so', + 'util-test', 'secp256k1', 'univalue', 'rpc', @@ -130,6 +138,7 @@ STAGE_COMMANDS = { 'gtest': [repofile('src/zcash-gtest')], 'sec-hard': check_security_hardening, 'no-dot-so': ensure_no_dot_so_in_depends, + 'util-test': util_test, 'secp256k1': ['make', '-C', repofile('src/secp256k1'), 'check'], 'univalue': ['make', '-C', repofile('src/univalue'), 'check'], 'rpc': [repofile('qa/pull-tester/rpc-tests.sh')], From 6e98511cf1498d7fa445d95a74bd09a60ff95a30 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Mon, 16 Oct 2017 16:16:14 -0400 Subject: [PATCH 0251/1062] Add stdout notice if any stage fails --- qa/zcash/full_test_suite.py | 1 + 1 file changed, 1 insertion(+) diff --git a/qa/zcash/full_test_suite.py b/qa/zcash/full_test_suite.py index ecdd3a39a..e01845635 100755 --- a/qa/zcash/full_test_suite.py +++ b/qa/zcash/full_test_suite.py @@ -185,6 +185,7 @@ def main(): passed &= run_stage(s) if not passed: + print("!!! One or more test stages failed !!!") sys.exit(1) if __name__ == '__main__': From e2283742db4f6a87cb981439152fa9633087c774 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 17 Oct 2017 19:03:41 -0700 Subject: [PATCH 0252/1062] Add libsnark to "make clean" --- src/Makefile.am | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Makefile.am b/src/Makefile.am index 3cbe02672..5bf092561 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -545,6 +545,7 @@ EXTRA_DIST = leveldb clean-local: -$(MAKE) -C leveldb clean -$(MAKE) -C secp256k1 clean + -$(MAKE) -C snark clean rm -f leveldb/*/*.gcno leveldb/helpers/memenv/*.gcno -rm -f config.h From 99ca5e1a226304ea9f838123f96232b6f3f579ea Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 17 Oct 2017 19:04:02 -0700 Subject: [PATCH 0253/1062] Ensure that libsnark is built first, so its headers are available --- src/Makefile.am | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index 5bf092561..7cab29fda 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -36,11 +36,15 @@ LIBSNARK=snark/build/lib/libsnark.a LIBUNIVALUE=univalue/libunivalue.la LIBZCASH=libzcash.a -# libsnark is added as a dependency here solely to ensure it is built early, so -# that its header files are collated for use in later build steps. -$(LIBSECP256K1): $(LIBSNARK) $(wildcard secp256k1/src/*) $(wildcard secp256k1/include/*) +$(LIBSECP256K1): $(wildcard secp256k1/src/*) $(wildcard secp256k1/include/*) $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C $(@D) $(@F) +# A phony target is included here to ensure libsnark is built first, so that its +# header files are collated for use in later build steps. +# See https://stackoverflow.com/a/10726725 +-include collate-libsnark +collate-libsnark: $(LIBSNARK) + LIBSNARK_CXXFLAGS = -fPIC -DBINARY_OUTPUT -DNO_PT_COMPRESSION=1 LIBSNARK_CONFIG_FLAGS = CURVE=ALT_BN128 MULTICORE=1 NO_PROCPS=1 NO_DOCS=1 STATIC=1 NO_SUPERCOP=1 FEATUREFLAGS=-DMONTGOMERY_OUTPUT NO_COPY_DEPINST=1 @@ -103,7 +107,7 @@ LIBZCASH_H = \ zcash/util.h \ zcash/Zcash.h -.PHONY: FORCE check-symbols check-security +.PHONY: FORCE collate-libsnark check-symbols check-security # bitcoin core # BITCOIN_CORE_H = \ addrman.h \ From d43b32bbfe867988563c2b47359359272b87698a Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 17 Oct 2017 20:33:28 -0700 Subject: [PATCH 0254/1062] Remove OpenSSL libraries from libsnark LDLIBS Unnecessary in the Zcash libsnark fork. --- src/snark/Makefile | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/snark/Makefile b/src/snark/Makefile index 427f4f4ce..cceffb989 100644 --- a/src/snark/Makefile +++ b/src/snark/Makefile @@ -20,8 +20,6 @@ DEPINST = depinst CXXFLAGS += -I$(DEPINST)/include -Isrc LDFLAGS += -L$(DEPINST)/lib -Wl,-rpath,$(DEPINST)/lib LDLIBS += -lgmpxx -lgmp -lboost_program_options-mt -lsodium -# OpenSSL and its dependencies (needed explicitly for static builds): -LDLIBS += -lcrypto -ldl -lz # List of .a files to include within libsnark.a and libsnark.so: AR_LIBS = # List of library files to install: From 91dd425b4ab5f67b0107115fbe62531bb4846a08 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 18 Oct 2017 00:55:52 -0700 Subject: [PATCH 0255/1062] Add libsnark tests to full_test_suite.py --- qa/zcash/full_test_suite.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/qa/zcash/full_test_suite.py b/qa/zcash/full_test_suite.py index e01845635..0bfc8a119 100755 --- a/qa/zcash/full_test_suite.py +++ b/qa/zcash/full_test_suite.py @@ -129,6 +129,7 @@ STAGES = [ 'no-dot-so', 'util-test', 'secp256k1', + 'libsnark', 'univalue', 'rpc', ] @@ -140,6 +141,7 @@ STAGE_COMMANDS = { 'no-dot-so': ensure_no_dot_so_in_depends, 'util-test': util_test, 'secp256k1': ['make', '-C', repofile('src/secp256k1'), 'check'], + 'libsnark': ['make', '-C', repofile('src'), 'libsnark-tests'], 'univalue': ['make', '-C', repofile('src/univalue'), 'check'], 'rpc': [repofile('qa/pull-tester/rpc-tests.sh')], } From 692bf7a6df56da50f78efc6e77bbaafab0fcbc95 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 18 Oct 2017 00:56:32 -0700 Subject: [PATCH 0256/1062] Add --list-stages argument to full_test_suite.py --- qa/zcash/full_test_suite.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/qa/zcash/full_test_suite.py b/qa/zcash/full_test_suite.py index 0bfc8a119..d8a076420 100755 --- a/qa/zcash/full_test_suite.py +++ b/qa/zcash/full_test_suite.py @@ -171,10 +171,17 @@ def run_stage(stage): def main(): parser = argparse.ArgumentParser() + parser.add_argument('--list-stages', dest='list', action='store_true') parser.add_argument('stage', nargs='*', default=STAGES, help='One of %s'%STAGES) args = parser.parse_args() + # Check for list + if args.list: + for s in STAGES: + print(s) + sys.exit(0) + # Check validity of stages for s in args.stage: if s not in STAGES: From 07f83521f7f4dc21e895d3a2a60a1a40aa0ce2bb Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Thu, 19 Oct 2017 14:08:32 -0700 Subject: [PATCH 0257/1062] basic integration of cryptoconditions --- .gitmodules | 4 +++ configure.ac | 2 +- src/Makefile.am | 16 +++++++++--- src/cJSON.h | 1 + src/cryptoconditions | 1 + src/komodo_structs.h | 5 ++++ src/script/interpreter.cpp | 52 ++++++++++++++++++++++++++++++++++++++ src/script/interpreter.h | 7 +++++ src/script/script.cpp | 3 +++ src/script/script.h | 3 ++- src/script/script_error.h | 5 +++- 11 files changed, 92 insertions(+), 7 deletions(-) create mode 100644 .gitmodules create mode 160000 src/cryptoconditions diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..44ceb9030 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "cryptoconditions"] + path = src/cryptoconditions + url = https://github.com/libscott/libcryptoconditions + branch = komodo-integration diff --git a/configure.ac b/configure.ac index c471bab89..9f8f1900f 100644 --- a/configure.ac +++ b/configure.ac @@ -996,7 +996,7 @@ unset PKG_CONFIG_LIBDIR PKG_CONFIG_LIBDIR="$PKGCONFIG_LIBDIR_TEMP" ac_configure_args="${ac_configure_args} --disable-shared --with-pic --with-bignum=no" -AC_CONFIG_SUBDIRS([src/secp256k1 src/univalue]) +AC_CONFIG_SUBDIRS([src/secp256k1 src/univalue src/cryptoconditions]) AC_OUTPUT diff --git a/src/Makefile.am b/src/Makefile.am index 72805281a..8907fa54a 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,4 +1,4 @@ -DIST_SUBDIRS = secp256k1 univalue +DIST_SUBDIRS = secp256k1 univalue cryptoconditions AM_LDFLAGS = $(PTHREAD_CFLAGS) $(LIBTOOL_LDFLAGS) @@ -21,6 +21,7 @@ BITCOIN_CONFIG_INCLUDES=-I$(builddir)/config BITCOIN_INCLUDES=-I$(builddir) -I$(builddir)/obj $(BOOST_CPPFLAGS) $(LEVELDB_CPPFLAGS) $(CRYPTO_CFLAGS) $(SSL_CFLAGS) BITCOIN_INCLUDES += -I$(srcdir)/secp256k1/include +BITCOIN_INCLUDES += -I$(srcdir)/cryptoconditions/include -I$(srcdir)/cryptoconditions/src/asn BITCOIN_INCLUDES += -I$(srcdir)/univalue/include if TARGET_WINDOWS @@ -38,6 +39,7 @@ LIBBITCOIN_CLI=libbitcoin_cli.a LIBBITCOIN_UTIL=libbitcoin_util.a LIBBITCOIN_CRYPTO=crypto/libbitcoin_crypto.a LIBSECP256K1=secp256k1/libsecp256k1.la +LIBCRYPTOCONDITIONS=cryptoconditions/libcryptoconditions.la LIBUNIVALUE=univalue/libunivalue.la LIBZCASH=libzcash.a -lcurl @@ -47,6 +49,9 @@ $(LIBSECP256K1): $(wildcard secp256k1/src/*) $(wildcard secp256k1/include/*) $(LIBUNIVALUE): $(wildcard univalue/lib/*) $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C univalue/ +$(LIBCRYPTOCONDITIONS): $(wildcard cryptoconditions/src/*) $(wildcard cryptoconditions/include/*) + $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C $(@D) $(@F) + # Make is not made aware of per-object dependencies to avoid limiting building parallelization # But to build the less dependent modules first, we manually select their order here: EXTRA_LIBRARIES = \ @@ -389,7 +394,8 @@ komodod_LDADD = \ $(LIBZCASH) \ $(LIBLEVELDB) \ $(LIBMEMENV) \ - $(LIBSECP256K1) + $(LIBSECP256K1) \ + $(LIBCRYPTOCONDITIONS) if ENABLE_ZMQ komodod_LDADD += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS) @@ -450,7 +456,8 @@ komodo_tx_LDADD = \ $(LIBSECP256K1) \ $(LIBZCASH) \ $(LIBBITCOIN_CRYPTO) \ - $(LIBZCASH_LIBS) + $(LIBZCASH_LIBS) \ + $(LIBCRYPTOCONDITIONS) komodo_tx_LDADD += $(BOOST_LIBS) $(CRYPTO_LIBS) # @@ -507,7 +514,8 @@ endif libzcashconsensus_la_LDFLAGS = -no-undefined $(RELDFLAGS) libzcashconsensus_la_LIBADD = $(CRYPTO_LIBS) -libzcashconsensus_la_CPPFLAGS = $(CRYPTO_CFLAGS) -I$(builddir)/obj -DBUILD_BITCOIN_INTERNAL +libzcashconsensus_la_CPPFLAGS = $(CRYPTO_CFLAGS) -I$(builddir)/obj -DBUILD_BITCOIN_INTERNAL \ + -I$(builddir)/cryptoconditions/src/asn endif # diff --git a/src/cJSON.h b/src/cJSON.h index d3076aa53..2ee786358 100755 --- a/src/cJSON.h +++ b/src/cJSON.h @@ -30,6 +30,7 @@ #include #include #include +#include "komodo_structs.h" //#include "../crypto777/OS_portable.h" diff --git a/src/cryptoconditions b/src/cryptoconditions new file mode 160000 index 000000000..7bd65d43a --- /dev/null +++ b/src/cryptoconditions @@ -0,0 +1 @@ +Subproject commit 7bd65d43af4e95ea6d8edf6c3dc5f340e39770cd diff --git a/src/komodo_structs.h b/src/komodo_structs.h index a35e7e008..fa8b3c2f1 100644 --- a/src/komodo_structs.h +++ b/src/komodo_structs.h @@ -22,6 +22,9 @@ #define PACKED __attribute__((packed)) #endif*/ +#ifndef KOMODO_STRUCTS_H +#define KOMODO_STRUCTS_H + #define GENESIS_NBITS 0x1f00ffff #define KOMODO_MINRATIFY ((height < 90000) ? 7 : 11) #define KOMODO_MAXBLOCKS 5000000 @@ -88,3 +91,5 @@ struct komodo_state struct komodo_event **Komodo_events; int32_t Komodo_numevents; uint32_t RTbufs[64][3]; uint64_t RTmask; }; + +#endif /* KOMODO_STRUCTS_H */ diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 6c17eab70..f65581068 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -13,6 +13,8 @@ #include "pubkey.h" #include "script/script.h" #include "uint256.h" +#include "cryptoconditions/include/cryptoconditions.h" + using namespace std; @@ -934,6 +936,51 @@ bool EvalScript(vector >& stack, const CScript& script, un } break; + case OP_CHECKCRYPTOCONDITION: + case OP_CHECKCRYPTOCONDITIONVERIFY: + { + // (fulfillment condition -- bool) + + if (stack.size() < 2) + return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); + + valtype& vchFulfillment = stacktop(-2); + valtype& vchCondition = stacktop(-1); + + // Hard limit fulfillment size + if (vchFulfillment.size() > 1024 * 10) { + return set_error(serror, SCRIPT_ERR_CRYPTOCONDITION_INVALID_FULFILLMENT); + } + + CC *cond = (CC*) calloc(1, sizeof(CC)); + char *fulfillmentBin = (char*) vchFulfillment.data(); + int rc = cc_readFulfillmentBinary(cond, fulfillmentBin, vchFulfillment.size()); + if (rc != 0) { + return set_error(serror, SCRIPT_ERR_CRYPTOCONDITION_INVALID_FULFILLMENT); + } + + char *condBin = (char*) &vchCondition[0]; + // TODO: Should nHashType be hardcoded? + // Other types use the last byte of the signature + char *msg = (char*) checker.GetMessage(script, SIGHASH_ALL).begin(); +; + bool fSuccess = cc_verify(cond, msg, 32, condBin, vchCondition.size()); + + popstack(stack); + popstack(stack); + + stack.push_back(fSuccess ? vchTrue : vchFalse); + + if (opcode == OP_CHECKCRYPTOCONDITIONVERIFY) + { + if (fSuccess) + popstack(stack); + else + return set_error(serror, SCRIPT_ERR_CRYPTOCONDITION_VERIFY); + } + } + break; + default: return set_error(serror, SCRIPT_ERR_BAD_OPCODE); } @@ -1147,6 +1194,11 @@ bool TransactionSignatureChecker::CheckLockTime(const CScriptNum& nLockTime) con return true; } +uint256 TransactionSignatureChecker::GetMessage(const CScript& scriptCode, int nHashType) const +{ + return SignatureHash(scriptCode, *txTo, nIn, nHashType); +} + bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* serror) { diff --git a/src/script/interpreter.h b/src/script/interpreter.h index b94916fac..fad2d9a91 100644 --- a/src/script/interpreter.h +++ b/src/script/interpreter.h @@ -102,6 +102,12 @@ public: return false; } + virtual uint256 GetMessage(const CScript& scriptCode, int nHashType) const + { + uint256 blob; + return blob; + } + virtual ~BaseSignatureChecker() {} }; @@ -118,6 +124,7 @@ public: TransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn) : txTo(txToIn), nIn(nInIn) {} bool CheckSig(const std::vector& scriptSig, const std::vector& vchPubKey, const CScript& scriptCode) const; bool CheckLockTime(const CScriptNum& nLockTime) const; + uint256 GetMessage(const CScript& scriptCode, int nHashType) const; }; class MutableTransactionSignatureChecker : public TransactionSignatureChecker diff --git a/src/script/script.cpp b/src/script/script.cpp index fd3392473..3cb3f855d 100644 --- a/src/script/script.cpp +++ b/src/script/script.cpp @@ -138,6 +138,9 @@ const char* GetOpName(opcodetype opcode) case OP_CHECKSIGVERIFY : return "OP_CHECKSIGVERIFY"; case OP_CHECKMULTISIG : return "OP_CHECKMULTISIG"; case OP_CHECKMULTISIGVERIFY : return "OP_CHECKMULTISIGVERIFY"; + case OP_CHECKCRYPTOCONDITION : return "OP_CHECKCRYPTOCONDITION"; + case OP_CHECKCRYPTOCONDITIONVERIFY + : return "OP_CHECKCRYPTOCONDITIONVERIFY"; // expanson case OP_NOP1 : return "OP_NOP1"; diff --git a/src/script/script.h b/src/script/script.h index e0e89185f..584fefac1 100644 --- a/src/script/script.h +++ b/src/script/script.h @@ -154,6 +154,8 @@ enum opcodetype OP_CHECKSIGVERIFY = 0xad, OP_CHECKMULTISIG = 0xae, OP_CHECKMULTISIGVERIFY = 0xaf, + OP_CHECKCRYPTOCONDITION = 0xcc, + OP_CHECKCRYPTOCONDITIONVERIFY = 0xcd, // expansion OP_NOP1 = 0xb0, @@ -168,7 +170,6 @@ enum opcodetype OP_NOP9 = 0xb8, OP_NOP10 = 0xb9, - // template matching params OP_SMALLDATA = 0xf9, OP_SMALLINTEGER = 0xfa, diff --git a/src/script/script_error.h b/src/script/script_error.h index bb10b8a29..e84268977 100644 --- a/src/script/script_error.h +++ b/src/script/script_error.h @@ -52,7 +52,10 @@ typedef enum ScriptError_t /* softfork safeness */ SCRIPT_ERR_DISCOURAGE_UPGRADABLE_NOPS, - SCRIPT_ERR_ERROR_COUNT + SCRIPT_ERR_ERROR_COUNT, + + SCRIPT_ERR_CRYPTOCONDITION_VERIFY, + SCRIPT_ERR_CRYPTOCONDITION_INVALID_FULFILLMENT } ScriptError; #define SCRIPT_ERR_LAST SCRIPT_ERR_ERROR_COUNT From 2b67565e51f0df0c6d6473292de76af169f1c217 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Fri, 20 Oct 2017 23:44:45 -0700 Subject: [PATCH 0258/1062] update cryptoconditions module ref --- .gitmodules | 2 +- src/cryptoconditions | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitmodules b/.gitmodules index 44ceb9030..0c640d62c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "cryptoconditions"] path = src/cryptoconditions - url = https://github.com/libscott/libcryptoconditions + url = git@github.com:libscott/libcryptoconditions.git branch = komodo-integration diff --git a/src/cryptoconditions b/src/cryptoconditions index 7bd65d43a..a59c22dcf 160000 --- a/src/cryptoconditions +++ b/src/cryptoconditions @@ -1 +1 @@ -Subproject commit 7bd65d43af4e95ea6d8edf6c3dc5f340e39770cd +Subproject commit a59c22dcf9a67be5f11f88ff89bbd9cb40fd22c0 From 1a9543d0646ebe20edccdb40dfdeabc5ae980b7c Mon Sep 17 00:00:00 2001 From: Sean Bowe Date: Fri, 7 Apr 2017 10:24:53 -0600 Subject: [PATCH 0259/1062] Remove crusty old "loadVerifyingKey"/"loadProvingKey" APIs and associated invariants. --- src/gtest/main.cpp | 7 +++ src/gtest/test_joinsplit.cpp | 52 +++++---------- src/gtest/utils.cpp | 4 -- src/init.cpp | 6 +- src/primitives/transaction.cpp | 3 - src/test/test_bitcoin.cpp | 28 ++++++--- src/test/test_bitcoin.h | 6 ++ src/test/transaction_tests.cpp | 20 +++--- src/wallet/rpcwallet.cpp | 6 -- src/zcash/CreateJoinSplit.cpp | 8 +-- src/zcash/GenerateParams.cpp | 8 +-- src/zcash/JoinSplit.cpp | 111 +++++++++------------------------ src/zcash/JoinSplit.hpp | 17 ++--- src/zcbenchmarks.cpp | 6 +- 14 files changed, 102 insertions(+), 180 deletions(-) diff --git a/src/gtest/main.cpp b/src/gtest/main.cpp index d1ffa628a..a0a2e0042 100644 --- a/src/gtest/main.cpp +++ b/src/gtest/main.cpp @@ -4,6 +4,8 @@ #include "libsnark/common/default_types/r1cs_ppzksnark_pp.hpp" #include "libsnark/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.hpp" +#include "zcash/JoinSplit.hpp" +#include "util.h" struct ECCryptoClosure { @@ -12,11 +14,16 @@ struct ECCryptoClosure ECCryptoClosure instance_of_eccryptoclosure; +ZCJoinSplit* params; + int main(int argc, char **argv) { assert(init_and_check_sodium() != -1); libsnark::default_r1cs_ppzksnark_pp::init_public_params(); libsnark::inhibit_profiling_info = true; libsnark::inhibit_profiling_counters = true; + boost::filesystem::path pk_path = ZC_GetParamsDir() / "sprout-proving.key"; + boost::filesystem::path vk_path = ZC_GetParamsDir() / "sprout-verifying.key"; + params = ZCJoinSplit::Prepared(vk_path.string(), pk_path.string()); testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); diff --git a/src/gtest/test_joinsplit.cpp b/src/gtest/test_joinsplit.cpp index 17ac7ecb2..986592e89 100644 --- a/src/gtest/test_joinsplit.cpp +++ b/src/gtest/test_joinsplit.cpp @@ -5,6 +5,7 @@ #include #include "zcash/prf.h" +#include "util.h" #include "zcash/JoinSplit.hpp" #include "zcash/Note.hpp" @@ -13,6 +14,8 @@ using namespace libzcash; +extern ZCJoinSplit* params; + void test_full_api(ZCJoinSplit* js) { // Create verification context. @@ -219,8 +222,6 @@ void invokeAPIFailure( TEST(joinsplit, h_sig) { - auto js = ZCJoinSplit::Unopened(); - /* // by Taylor Hornby @@ -284,7 +285,7 @@ for test_input in TEST_VECTORS: }; BOOST_FOREACH(std::vector& v, tests) { - auto expected = js->h_sig( + auto expected = ZCJoinSplit::h_sig( uint256S(v[0]), {uint256S(v[1]), uint256S(v[2])}, uint256S(v[3]) @@ -292,8 +293,6 @@ for test_input in TEST_VECTORS: EXPECT_EQ(expected, uint256S(v[4])); } - - delete js; } void increment_note_witnesses( @@ -311,8 +310,6 @@ void increment_note_witnesses( TEST(joinsplit, full_api_test) { - auto js = ZCJoinSplit::Generate(); - { std::vector witnesses; ZCIncrementalMerkleTree tree; @@ -331,7 +328,7 @@ TEST(joinsplit, full_api_test) increment_note_witnesses(note5.cm(), witnesses, tree); // Should work - invokeAPI(js, + invokeAPI(params, { JSInput(), JSInput() @@ -345,7 +342,7 @@ TEST(joinsplit, full_api_test) tree.root()); // lhs > MAX_MONEY - invokeAPIFailure(js, + invokeAPIFailure(params, { JSInput(), JSInput() @@ -360,7 +357,7 @@ TEST(joinsplit, full_api_test) "nonsensical vpub_old value"); // rhs > MAX_MONEY - invokeAPIFailure(js, + invokeAPIFailure(params, { JSInput(), JSInput() @@ -375,7 +372,7 @@ TEST(joinsplit, full_api_test) "nonsensical vpub_new value"); // input witness for the wrong element - invokeAPIFailure(js, + invokeAPIFailure(params, { JSInput(witnesses[0], note1, sk), JSInput() @@ -391,7 +388,7 @@ TEST(joinsplit, full_api_test) // input witness doesn't match up with // real root - invokeAPIFailure(js, + invokeAPIFailure(params, { JSInput(witnesses[1], note1, sk), JSInput() @@ -406,7 +403,7 @@ TEST(joinsplit, full_api_test) "joinsplit not anchored to the correct root"); // input is in the tree now! this should work - invokeAPI(js, + invokeAPI(params, { JSInput(witnesses[1], note1, sk), JSInput() @@ -420,7 +417,7 @@ TEST(joinsplit, full_api_test) tree.root()); // Wrong secret key - invokeAPIFailure(js, + invokeAPIFailure(params, { JSInput(witnesses[1], note1, SpendingKey::random()), JSInput() @@ -435,7 +432,7 @@ TEST(joinsplit, full_api_test) "input note not authorized to spend with given key"); // Absurd input value - invokeAPIFailure(js, + invokeAPIFailure(params, { JSInput(witnesses[3], note3, sk), JSInput() @@ -450,7 +447,7 @@ TEST(joinsplit, full_api_test) "nonsensical input note value"); // Absurd total input value - invokeAPIFailure(js, + invokeAPIFailure(params, { JSInput(witnesses[4], note4, sk), JSInput(witnesses[5], note5, sk) @@ -465,7 +462,7 @@ TEST(joinsplit, full_api_test) "nonsensical left hand size of joinsplit balance"); // Absurd output value - invokeAPIFailure(js, + invokeAPIFailure(params, { JSInput(), JSInput() @@ -480,7 +477,7 @@ TEST(joinsplit, full_api_test) "nonsensical output value"); // Absurd total output value - invokeAPIFailure(js, + invokeAPIFailure(params, { JSInput(), JSInput() @@ -495,7 +492,7 @@ TEST(joinsplit, full_api_test) "nonsensical right hand side of joinsplit balance"); // Absurd total output value - invokeAPIFailure(js, + invokeAPIFailure(params, { JSInput(), JSInput() @@ -510,22 +507,7 @@ TEST(joinsplit, full_api_test) "invalid joinsplit balance"); } - test_full_api(js); - - js->saveProvingKey("./zcashTest.pk"); - js->saveVerifyingKey("./zcashTest.vk"); - - delete js; - - js = ZCJoinSplit::Unopened(); - - js->setProvingKeyPath("./zcashTest.pk"); - js->loadProvingKey(); - js->loadVerifyingKey("./zcashTest.vk"); - - test_full_api(js); - - delete js; + test_full_api(params); } TEST(joinsplit, note_plaintexts) diff --git a/src/gtest/utils.cpp b/src/gtest/utils.cpp index cf025162c..527e613e2 100644 --- a/src/gtest/utils.cpp +++ b/src/gtest/utils.cpp @@ -1,7 +1,3 @@ -#include "zcash/JoinSplit.hpp" - -ZCJoinSplit* params = ZCJoinSplit::Unopened(); - int GenZero(int n) { return 0; diff --git a/src/init.cpp b/src/init.cpp index bb57f257d..0ed2e5665 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -688,18 +688,14 @@ static void ZC_LoadParams() return; } - pzcashParams = ZCJoinSplit::Unopened(); - LogPrintf("Loading verifying key from %s\n", vk_path.string().c_str()); gettimeofday(&tv_start, 0); - pzcashParams->loadVerifyingKey(vk_path.string()); + pzcashParams = ZCJoinSplit::Prepared(vk_path.string(), pk_path.string()); gettimeofday(&tv_end, 0); elapsed = float(tv_end.tv_sec-tv_start.tv_sec) + (tv_end.tv_usec-tv_start.tv_usec)/float(1000000); LogPrintf("Loaded verifying key in %fs seconds.\n", elapsed); - - pzcashParams->setProvingKeyPath(pk_path.string()); } bool AppInitServers(boost::thread_group& threadGroup) diff --git a/src/primitives/transaction.cpp b/src/primitives/transaction.cpp index f6236a2f8..6aa7949b2 100644 --- a/src/primitives/transaction.cpp +++ b/src/primitives/transaction.cpp @@ -20,9 +20,6 @@ JSDescription::JSDescription(ZCJoinSplit& params, { boost::array notes; - if (computeProof) { - params.loadProvingKey(); - } proof = params.prove( inputs, outputs, diff --git a/src/test/test_bitcoin.cpp b/src/test/test_bitcoin.cpp index 5c701c5cc..0a39f2944 100644 --- a/src/test/test_bitcoin.cpp +++ b/src/test/test_bitcoin.cpp @@ -30,20 +30,30 @@ ZCJoinSplit *pzcashParams; extern bool fPrintToConsole; extern void noui_connect(); +JoinSplitTestingSetup::JoinSplitTestingSetup() +{ + boost::filesystem::path pk_path = ZC_GetParamsDir() / "sprout-proving.key"; + boost::filesystem::path vk_path = ZC_GetParamsDir() / "sprout-verifying.key"; + pzcashParams = ZCJoinSplit::Prepared(vk_path.string(), pk_path.string()); +} + +JoinSplitTestingSetup::~JoinSplitTestingSetup() +{ + delete pzcashParams; +} + BasicTestingSetup::BasicTestingSetup() { - assert(init_and_check_sodium() != -1); - ECC_Start(); - pzcashParams = ZCJoinSplit::Unopened(); - SetupEnvironment(); - fPrintToDebugLog = false; // don't want to write to debug.log file - fCheckBlockIndex = true; - SelectParams(CBaseChainParams::MAIN); + assert(init_and_check_sodium() != -1); + ECC_Start(); + SetupEnvironment(); + fPrintToDebugLog = false; // don't want to write to debug.log file + fCheckBlockIndex = true; + SelectParams(CBaseChainParams::MAIN); } BasicTestingSetup::~BasicTestingSetup() { - ECC_Stop(); - delete pzcashParams; + ECC_Stop(); } TestingSetup::TestingSetup() diff --git a/src/test/test_bitcoin.h b/src/test/test_bitcoin.h index 205e5b5c4..d30f19b22 100644 --- a/src/test/test_bitcoin.h +++ b/src/test/test_bitcoin.h @@ -30,4 +30,10 @@ struct TestingSetup: public BasicTestingSetup { ~TestingSetup(); }; +// Setup w.r.t. zk-SNARK API +struct JoinSplitTestingSetup: public BasicTestingSetup { + JoinSplitTestingSetup(); + ~JoinSplitTestingSetup(); +}; + #endif diff --git a/src/test/transaction_tests.cpp b/src/test/transaction_tests.cpp index 3fa691a94..6b207f643 100644 --- a/src/test/transaction_tests.cpp +++ b/src/test/transaction_tests.cpp @@ -6,6 +6,7 @@ #include "data/tx_valid.json.h" #include "test/test_bitcoin.h" +#include "init.h" #include "clientversion.h" #include "consensus/validation.h" #include "core_io.h" @@ -85,7 +86,7 @@ string FormatScriptFlags(unsigned int flags) return ret.substr(0, ret.size() - 1); } -BOOST_FIXTURE_TEST_SUITE(transaction_tests, BasicTestingSetup) +BOOST_FIXTURE_TEST_SUITE(transaction_tests, JoinSplitTestingSetup) BOOST_AUTO_TEST_CASE(tx_valid) { @@ -326,9 +327,6 @@ BOOST_AUTO_TEST_CASE(test_basic_joinsplit_verification) // Also, it's generally libzcash's job to ensure the // integrity of the scheme through its own tests. - // construct the r1cs keypair - auto p = ZCJoinSplit::Generate(); - // construct a merkle tree ZCIncrementalMerkleTree merkleTree; @@ -362,8 +360,8 @@ BOOST_AUTO_TEST_CASE(test_basic_joinsplit_verification) auto verifier = libzcash::ProofVerifier::Strict(); { - JSDescription jsdesc(*p, pubKeyHash, rt, inputs, outputs, 0, 0); - BOOST_CHECK(jsdesc.Verify(*p, verifier, pubKeyHash)); + JSDescription jsdesc(*pzcashParams, pubKeyHash, rt, inputs, outputs, 0, 0); + BOOST_CHECK(jsdesc.Verify(*pzcashParams, verifier, pubKeyHash)); CDataStream ss(SER_DISK, CLIENT_VERSION); ss << jsdesc; @@ -372,20 +370,20 @@ BOOST_AUTO_TEST_CASE(test_basic_joinsplit_verification) ss >> jsdesc_deserialized; BOOST_CHECK(jsdesc_deserialized == jsdesc); - BOOST_CHECK(jsdesc_deserialized.Verify(*p, verifier, pubKeyHash)); + BOOST_CHECK(jsdesc_deserialized.Verify(*pzcashParams, verifier, pubKeyHash)); } { // Ensure that the balance equation is working. - BOOST_CHECK_THROW(JSDescription(*p, pubKeyHash, rt, inputs, outputs, 10, 0), std::invalid_argument); - BOOST_CHECK_THROW(JSDescription(*p, pubKeyHash, rt, inputs, outputs, 0, 10), std::invalid_argument); + BOOST_CHECK_THROW(JSDescription(*pzcashParams, pubKeyHash, rt, inputs, outputs, 10, 0), std::invalid_argument); + BOOST_CHECK_THROW(JSDescription(*pzcashParams, pubKeyHash, rt, inputs, outputs, 0, 10), std::invalid_argument); } { // Ensure that it won't verify if the root is changed. - auto test = JSDescription(*p, pubKeyHash, rt, inputs, outputs, 0, 0); + auto test = JSDescription(*pzcashParams, pubKeyHash, rt, inputs, outputs, 0, 0); test.anchor = GetRandHash(); - BOOST_CHECK(!test.Verify(*p, verifier, pubKeyHash)); + BOOST_CHECK(!test.Verify(*pzcashParams, verifier, pubKeyHash)); } } diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index bac5dc871..79b4f6de4 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -2543,12 +2543,6 @@ UniValue zc_benchmark(const UniValue& params, bool fHelp) std::vector sample_times; - if (benchmarktype == "createjoinsplit") { - /* Load the proving now key so that it doesn't happen as part of the - * first joinsplit. */ - pzcashParams->loadProvingKey(); - } - JSDescription samplejoinsplit; if (benchmarktype == "verifyjoinsplit") { diff --git a/src/zcash/CreateJoinSplit.cpp b/src/zcash/CreateJoinSplit.cpp index ea2d59c9e..7253e9568 100644 --- a/src/zcash/CreateJoinSplit.cpp +++ b/src/zcash/CreateJoinSplit.cpp @@ -13,10 +13,8 @@ int main(int argc, char **argv) { libsnark::start_profiling(); - auto p = ZCJoinSplit::Unopened(); - p->loadVerifyingKey((ZC_GetParamsDir() / "sprout-verifying.key").string()); - p->setProvingKeyPath((ZC_GetParamsDir() / "sprout-proving.key").string()); - p->loadProvingKey(); + auto p = ZCJoinSplit::Prepared((ZC_GetParamsDir() / "sprout-verifying.key").string(), + (ZC_GetParamsDir() / "sprout-proving.key").string()); // construct a proof. @@ -32,4 +30,6 @@ int main(int argc, char **argv) 0, 0); } + + delete p; // not that it matters } diff --git a/src/zcash/GenerateParams.cpp b/src/zcash/GenerateParams.cpp index eadfe7b18..8ca2d7814 100644 --- a/src/zcash/GenerateParams.cpp +++ b/src/zcash/GenerateParams.cpp @@ -18,13 +18,7 @@ int main(int argc, char **argv) std::string vkFile = argv[2]; std::string r1csFile = argv[3]; - auto p = ZCJoinSplit::Generate(); - - p->saveProvingKey(pkFile); - p->saveVerifyingKey(vkFile); - p->saveR1CS(r1csFile); - - delete p; + ZCJoinSplit::Generate(r1csFile, vkFile, pkFile); return 0; } diff --git a/src/zcash/JoinSplit.cpp b/src/zcash/JoinSplit.cpp index 590700cd9..c7b468f89 100644 --- a/src/zcash/JoinSplit.cpp +++ b/src/zcash/JoinSplit.cpp @@ -28,7 +28,7 @@ CCriticalSection cs_ParamsIO; CCriticalSection cs_LoadKeys; template -void saveToFile(std::string path, T& obj) { +void saveToFile(const std::string path, T& obj) { LOCK(cs_ParamsIO); std::stringstream ss; @@ -42,7 +42,7 @@ void saveToFile(std::string path, T& obj) { } template -void loadFromFile(std::string path, boost::optional& objIn) { +void loadFromFile(const std::string path, T& objIn) { LOCK(cs_ParamsIO); std::stringstream ss; @@ -69,77 +69,33 @@ public: typedef default_r1cs_ppzksnark_pp ppzksnark_ppT; typedef Fr FieldT; - boost::optional> pk; - boost::optional> vk; - boost::optional> vk_precomp; - boost::optional pkPath; + r1cs_ppzksnark_verification_key vk; + r1cs_ppzksnark_processed_verification_key vk_precomp; + std::string pkPath; - JoinSplitCircuit() {} + JoinSplitCircuit(const std::string vkPath, const std::string pkPath) : pkPath(pkPath) { + loadFromFile(vkPath, vk); + vk_precomp = r1cs_ppzksnark_verifier_process_vk(vk); + } ~JoinSplitCircuit() {} - void setProvingKeyPath(std::string path) { - pkPath = path; - } - - void loadProvingKey() { - LOCK(cs_LoadKeys); - - if (!pk) { - if (!pkPath) { - throw std::runtime_error("proving key path unknown"); - } - loadFromFile(*pkPath, pk); - } - } - - void saveProvingKey(std::string path) { - if (pk) { - saveToFile(path, *pk); - } else { - throw std::runtime_error("cannot save proving key; key doesn't exist"); - } - } - void loadVerifyingKey(std::string path) { - LOCK(cs_LoadKeys); - - loadFromFile(path, vk); - - processVerifyingKey(); - } - void processVerifyingKey() { - vk_precomp = r1cs_ppzksnark_verifier_process_vk(*vk); - } - void saveVerifyingKey(std::string path) { - if (vk) { - saveToFile(path, *vk); - } else { - throw std::runtime_error("cannot save verifying key; key doesn't exist"); - } - } - void saveR1CS(std::string path) { - auto r1cs = generate_r1cs(); - - saveToFile(path, r1cs); - } - - r1cs_constraint_system generate_r1cs() { + static void generate(const std::string r1csPath, + const std::string vkPath, + const std::string pkPath) + { protoboard pb; joinsplit_gadget g(pb); g.generate_r1cs_constraints(); - return pb.get_constraint_system(); - } + auto r1cs = pb.get_constraint_system(); - void generate() { - LOCK(cs_LoadKeys); + saveToFile(r1csPath, r1cs); - const r1cs_constraint_system constraint_system = generate_r1cs(); - r1cs_ppzksnark_keypair keypair = r1cs_ppzksnark_generator(constraint_system); + r1cs_ppzksnark_keypair keypair = r1cs_ppzksnark_generator(r1cs); - pk = keypair.pk; - vk = keypair.vk; - processVerifyingKey(); + saveToFile(vkPath, keypair.vk); + saveToFile(pkPath, keypair.pk); } bool verify( @@ -154,10 +110,6 @@ public: uint64_t vpub_new, const uint256& rt ) { - if (!vk || !vk_precomp) { - throw std::runtime_error("JoinSplit verifying key not loaded"); - } - try { auto r1cs_proof = proof.to_libsnark_proof>(); @@ -174,8 +126,8 @@ public: ); return verifier.check( - *vk, - *vk_precomp, + vk, + vk_precomp, witness, r1cs_proof ); @@ -200,10 +152,6 @@ public: const uint256& rt, bool computeProof ) { - if (computeProof && !pk) { - throw std::runtime_error("JoinSplit proving key not loaded"); - } - if (vpub_old > MAX_MONEY) { throw std::invalid_argument("nonsensical vpub_old value"); } @@ -345,8 +293,11 @@ public: // estimate that it doesn't matter if we check every time. pb.constraint_system.swap_AB_if_beneficial(); + r1cs_ppzksnark_proving_key pk; + loadFromFile(pkPath, pk); + return ZCProof(r1cs_ppzksnark_prover( - *pk, + pk, primary_input, aux_input, pb.constraint_system @@ -355,20 +306,20 @@ public: }; template -JoinSplit* JoinSplit::Generate() +void JoinSplit::Generate(const std::string r1csPath, + const std::string vkPath, + const std::string pkPath) { initialize_curve_params(); - auto js = new JoinSplitCircuit(); - js->generate(); - - return js; + JoinSplitCircuit::generate(r1csPath, vkPath, pkPath); } template -JoinSplit* JoinSplit::Unopened() +JoinSplit* JoinSplit::Prepared(const std::string vkPath, + const std::string pkPath) { initialize_curve_params(); - return new JoinSplitCircuit(); + return new JoinSplitCircuit(vkPath, pkPath); } template diff --git a/src/zcash/JoinSplit.hpp b/src/zcash/JoinSplit.hpp index a8c08d21b..2d9921ac8 100644 --- a/src/zcash/JoinSplit.hpp +++ b/src/zcash/JoinSplit.hpp @@ -48,22 +48,17 @@ class JoinSplit { public: virtual ~JoinSplit() {} - static JoinSplit* Generate(); - static JoinSplit* Unopened(); + static void Generate(const std::string r1csPath, + const std::string vkPath, + const std::string pkPath); + static JoinSplit* Prepared(const std::string vkPath, + const std::string pkPath); + static uint256 h_sig(const uint256& randomSeed, const boost::array& nullifiers, const uint256& pubKeyHash ); - // TODO: #789 - virtual void setProvingKeyPath(std::string) = 0; - virtual void loadProvingKey() = 0; - - virtual void saveProvingKey(std::string path) = 0; - virtual void loadVerifyingKey(std::string path) = 0; - virtual void saveVerifyingKey(std::string path) = 0; - virtual void saveR1CS(std::string path) = 0; - virtual ZCProof prove( const boost::array& inputs, const boost::array& outputs, diff --git a/src/zcbenchmarks.cpp b/src/zcbenchmarks.cpp index 1cb880ea1..bb51cdd6c 100644 --- a/src/zcbenchmarks.cpp +++ b/src/zcbenchmarks.cpp @@ -97,11 +97,7 @@ double benchmark_parameter_loading() struct timeval tv_start; timer_start(tv_start); - auto newParams = ZCJoinSplit::Unopened(); - - newParams->loadVerifyingKey(vk_path.string()); - newParams->setProvingKeyPath(pk_path.string()); - newParams->loadProvingKey(); + auto newParams = ZCJoinSplit::Prepared(vk_path.string(), pk_path.string()); double ret = timer_stop(tv_start); From a032ddea1f0ab6ed403499b7ea1febfcd1e6d2e9 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Sat, 21 Oct 2017 17:54:17 -0700 Subject: [PATCH 0260/1062] configure.ac must not include cryptoconditions in AC_CONFIG_SUBDIRS because that disables shared linking. cryptoconditions must not include config.h because that includes conflicting variables. --- configure.ac | 2 +- src/Makefile.am | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 9f8f1900f..c471bab89 100644 --- a/configure.ac +++ b/configure.ac @@ -996,7 +996,7 @@ unset PKG_CONFIG_LIBDIR PKG_CONFIG_LIBDIR="$PKGCONFIG_LIBDIR_TEMP" ac_configure_args="${ac_configure_args} --disable-shared --with-pic --with-bignum=no" -AC_CONFIG_SUBDIRS([src/secp256k1 src/univalue src/cryptoconditions]) +AC_CONFIG_SUBDIRS([src/secp256k1 src/univalue]) AC_OUTPUT diff --git a/src/Makefile.am b/src/Makefile.am index 8907fa54a..815d75d4c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -515,7 +515,8 @@ endif libzcashconsensus_la_LDFLAGS = -no-undefined $(RELDFLAGS) libzcashconsensus_la_LIBADD = $(CRYPTO_LIBS) libzcashconsensus_la_CPPFLAGS = $(CRYPTO_CFLAGS) -I$(builddir)/obj -DBUILD_BITCOIN_INTERNAL \ - -I$(builddir)/cryptoconditions/src/asn + -I$(builddir)/cryptoconditions/src/asn \ + -I$(builddir)/cryptoconditions/src endif # From 342611f9325e6074ddbe00f53adc0b6e3d40d4e7 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Sat, 21 Oct 2017 23:23:57 -0700 Subject: [PATCH 0261/1062] add rpccryptoconditions --- src/Makefile.am | 1 + src/rpcclient.cpp | 6 +- src/rpccryptoconditions.cpp | 925 ++++++++++++++++++++++++++++++++++++ src/rpcserver.cpp | 2 + src/rpcserver.h | 3 + 5 files changed, 936 insertions(+), 1 deletion(-) create mode 100644 src/rpccryptoconditions.cpp diff --git a/src/Makefile.am b/src/Makefile.am index 815d75d4c..919c6fc89 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -238,6 +238,7 @@ libbitcoin_server_a_SOURCES = \ rpcmisc.cpp \ rpcnet.cpp \ rpcrawtransaction.cpp \ + rpccryptoconditions.cpp \ rpcserver.cpp \ script/sigcache.cpp \ timedata.cpp \ diff --git a/src/rpcclient.cpp b/src/rpcclient.cpp index da8fdc4b6..2378e3ca0 100644 --- a/src/rpcclient.cpp +++ b/src/rpcclient.cpp @@ -75,8 +75,12 @@ static const CRPCConvertParam vRPCConvertParams[] = { "getrawtransaction", 1 }, { "createrawtransaction", 0 }, { "createrawtransaction", 1 }, + { "createrawtransactioncc", 0 }, + { "createrawtransactioncc", 1 }, { "signrawtransaction", 1 }, { "signrawtransaction", 2 }, + { "signrawtransactioncc", 1 }, + { "signrawtransactioncc", 2 }, { "sendrawtransaction", 1 }, { "fundrawtransaction", 1 }, { "gettxout", 1 }, @@ -156,7 +160,7 @@ UniValue ParseNonRFCJSONValue(const std::string& strVal) UniValue jVal; if (!jVal.read(std::string("[")+strVal+std::string("]")) || !jVal.isArray() || jVal.size()!=1) - throw runtime_error(string("Error parsing JSON:")+strVal); + throw runtime_error(string("Error JSON:")+strVal); return jVal[0]; } diff --git a/src/rpccryptoconditions.cpp b/src/rpccryptoconditions.cpp new file mode 100644 index 000000000..946667aae --- /dev/null +++ b/src/rpccryptoconditions.cpp @@ -0,0 +1,925 @@ +// Copyright (c) 2010 Satoshi Nakamoto +// Copyright (c) 2009-2015 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "base58.h" +#include "consensus/validation.h" +#include "core_io.h" +#include "init.h" +#include "keystore.h" +#include "main.h" +#include "merkleblock.h" +#include "net.h" +#include "primitives/transaction.h" +#include "rpcserver.h" +#include "script/script.h" +#include "script/script_error.h" +#include "script/sign.h" +#include "script/standard.h" +#include "uint256.h" +#include "cryptoconditions/include/cryptoconditions.h" +#ifdef ENABLE_WALLET +#include "wallet/wallet.h" +#endif + +#include + +#include + +#include + +using namespace std; + +void ScriptPubKeyToJSON(const CScript& scriptPubKey, UniValue& out, bool fIncludeHex); + + +UniValue TxJoinSplitToJSONcc(const CTransaction& tx) { + UniValue vjoinsplit(UniValue::VARR); + for (unsigned int i = 0; i < tx.vjoinsplit.size(); i++) { + const JSDescription& jsdescription = tx.vjoinsplit[i]; + UniValue joinsplit(UniValue::VOBJ); + + joinsplit.push_back(Pair("vpub_old", ValueFromAmount(jsdescription.vpub_old))); + joinsplit.push_back(Pair("vpub_new", ValueFromAmount(jsdescription.vpub_new))); + + joinsplit.push_back(Pair("anchor", jsdescription.anchor.GetHex())); + + { + UniValue nullifiers(UniValue::VARR); + BOOST_FOREACH(const uint256 nf, jsdescription.nullifiers) { + nullifiers.push_back(nf.GetHex()); + } + joinsplit.push_back(Pair("nullifiers", nullifiers)); + } + + { + UniValue commitments(UniValue::VARR); + BOOST_FOREACH(const uint256 commitment, jsdescription.commitments) { + commitments.push_back(commitment.GetHex()); + } + joinsplit.push_back(Pair("commitments", commitments)); + } + + joinsplit.push_back(Pair("onetimePubKey", jsdescription.ephemeralKey.GetHex())); + joinsplit.push_back(Pair("randomSeed", jsdescription.randomSeed.GetHex())); + + { + UniValue macs(UniValue::VARR); + BOOST_FOREACH(const uint256 mac, jsdescription.macs) { + macs.push_back(mac.GetHex()); + } + joinsplit.push_back(Pair("macs", macs)); + } + + CDataStream ssProof(SER_NETWORK, PROTOCOL_VERSION); + ssProof << jsdescription.proof; + joinsplit.push_back(Pair("proof", HexStr(ssProof.begin(), ssProof.end()))); + + { + UniValue ciphertexts(UniValue::VARR); + for (const ZCNoteEncryption::Ciphertext ct : jsdescription.ciphertexts) { + ciphertexts.push_back(HexStr(ct.begin(), ct.end())); + } + joinsplit.push_back(Pair("ciphertexts", ciphertexts)); + } + + vjoinsplit.push_back(joinsplit); + } + return vjoinsplit; +} + +uint64_t komodo_interest(int32_t txheight,uint64_t nValue,uint32_t nLockTime,uint32_t tiptime); + +void TxToJSON(const CTransaction& tx, const uint256 hashBlock, UniValue& entry); + + +UniValue getrawtransactioncc(const UniValue& params, bool fHelp) +{ + if (fHelp || params.size() < 1 || params.size() > 2) + throw runtime_error( + "getrawtransaction \"txid\" ( verbose )\n" + "\nNOTE: By default this function only works sometimes. This is when the tx is in the mempool\n" + "or there is an unspent output in the utxo for this transaction. To make it always work,\n" + "you need to maintain a transaction index, using the -txindex command line option.\n" + "\nReturn the raw transaction data.\n" + "\nIf verbose=0, returns a string that is serialized, hex-encoded data for 'txid'.\n" + "If verbose is non-zero, returns an Object with information about 'txid'.\n" + + "\nArguments:\n" + "1. \"txid\" (string, required) The transaction id\n" + "2. verbose (numeric, optional, default=0) If 0, return a string, other return a json object\n" + + "\nResult (if verbose is not set or set to 0):\n" + "\"data\" (string) The serialized, hex-encoded data for 'txid'\n" + + "\nResult (if verbose > 0):\n" + "{\n" + " \"hex\" : \"data\", (string) The serialized, hex-encoded data for 'txid'\n" + " \"txid\" : \"id\", (string) The transaction id (same as provided)\n" + " \"version\" : n, (numeric) The version\n" + " \"locktime\" : ttt, (numeric) The lock time\n" + " \"vin\" : [ (array of json objects)\n" + " {\n" + " \"txid\": \"id\", (string) The transaction id\n" + " \"vout\": n, (numeric) \n" + " \"scriptSig\": { (json object) The script\n" + " \"asm\": \"asm\", (string) asm\n" + " \"hex\": \"hex\" (string) hex\n" + " },\n" + " \"sequence\": n (numeric) The script sequence number\n" + " }\n" + " ,...\n" + " ],\n" + " \"vout\" : [ (array of json objects)\n" + " {\n" + " \"value\" : x.xxx, (numeric) The value in btc\n" + " \"n\" : n, (numeric) index\n" + " \"scriptPubKey\" : { (json object)\n" + " \"asm\" : \"asm\", (string) the asm\n" + " \"hex\" : \"hex\", (string) the hex\n" + " \"reqSigs\" : n, (numeric) The required sigs\n" + " \"type\" : \"pubkeyhash\", (string) The type, eg 'pubkeyhash'\n" + " \"addresses\" : [ (json array of string)\n" + " \"bitcoinaddress\" (string) bitcoin address\n" + " ,...\n" + " ]\n" + " }\n" + " }\n" + " ,...\n" + " ],\n" + " \"vjoinsplit\" : [ (array of json objects, only for version >= 2)\n" + " {\n" + " \"vpub_old\" : x.xxx, (numeric) public input value in ZEC\n" + " \"vpub_new\" : x.xxx, (numeric) public output value in ZEC\n" + " \"anchor\" : \"hex\", (string) the anchor\n" + " \"nullifiers\" : [ (json array of string)\n" + " \"hex\" (string) input note nullifier\n" + " ,...\n" + " ],\n" + " \"commitments\" : [ (json array of string)\n" + " \"hex\" (string) output note commitment\n" + " ,...\n" + " ],\n" + " \"onetimePubKey\" : \"hex\", (string) the onetime public key used to encrypt the ciphertexts\n" + " \"randomSeed\" : \"hex\", (string) the random seed\n" + " \"macs\" : [ (json array of string)\n" + " \"hex\" (string) input note MAC\n" + " ,...\n" + " ],\n" + " \"proof\" : \"hex\", (string) the zero-knowledge proof\n" + " \"ciphertexts\" : [ (json array of string)\n" + " \"hex\" (string) output note ciphertext\n" + " ,...\n" + " ]\n" + " }\n" + " ,...\n" + " ],\n" + " \"blockhash\" : \"hash\", (string) the block hash\n" + " \"confirmations\" : n, (numeric) The confirmations\n" + " \"time\" : ttt, (numeric) The transaction time in seconds since epoch (Jan 1 1970 GMT)\n" + " \"blocktime\" : ttt (numeric) The block time in seconds since epoch (Jan 1 1970 GMT)\n" + "}\n" + + "\nExamples:\n" + + HelpExampleCli("getrawtransaction", "\"mytxid\"") + + HelpExampleCli("getrawtransaction", "\"mytxid\" 1") + + HelpExampleRpc("getrawtransaction", "\"mytxid\", 1") + ); + + LOCK(cs_main); + + uint256 hash = ParseHashV(params[0], "parameter 1"); + + bool fVerbose = false; + if (params.size() > 1) + fVerbose = (params[1].get_int() != 0); + + CTransaction tx; + uint256 hashBlock; + if (!GetTransaction(hash, tx, hashBlock, true)) + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "No information available about transaction"); + + string strHex = EncodeHexTx(tx); + + if (!fVerbose) + return strHex; + + UniValue result(UniValue::VOBJ); + result.push_back(Pair("hex", strHex)); + TxToJSON(tx, hashBlock, result); + return result; +} + +int32_t gettxout_scriptPubKeycc(uint8_t *scriptPubKey,int32_t maxsize,uint256 txid,int32_t n) +{ + int32_t i,m; uint8_t *ptr; + LOCK(cs_main); + /*CCoins coins; + for (iter=0; iter<2; iter++) + { + if ( iter == 0 ) + { + LOCK(mempool.cs); + CCoinsViewMemPool view(pcoinsTip,mempool); + if ( view.GetCoins(txid,coins) == 0 ) + { + //fprintf(stderr,"cant get view\n"); + continue; + } + mempool.pruneSpent(txid, coins); // TODO: this should be done by the CCoinsViewMemPool + } + else if ( pcoinsTip->GetCoins(txid,coins) == 0 ) + { + //fprintf(stderr,"cant get pcoinsTip->GetCoins\n"); + continue; + } + if ( n < 0 || (unsigned int)n >= coins.vout.size() || coins.vout[n].IsNull() ) + { + fprintf(stderr,"iter.%d n.%d vs voutsize.%d\n",iter,n,(int32_t)coins.vout.size()); + continue; + } + ptr = (uint8_t *)coins.vout[n].scriptPubKey.data(); + m = coins.vout[n].scriptPubKey.size(); + for (i=0; i setTxids; + uint256 oneTxid; + UniValue txids = params[0].get_array(); + for (size_t idx = 0; idx < txids.size(); idx++) { + const UniValue& txid = txids[idx]; + if (txid.get_str().length() != 64 || !IsHex(txid.get_str())) + throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid txid ")+txid.get_str()); + uint256 hash(uint256S(txid.get_str())); + if (setTxids.count(hash)) + throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid parameter, duplicated txid: ")+txid.get_str()); + setTxids.insert(hash); + oneTxid = hash; + } + + LOCK(cs_main); + + CBlockIndex* pblockindex = NULL; + + uint256 hashBlock; + if (params.size() > 1) + { + hashBlock = uint256S(params[1].get_str()); + if (!mapBlockIndex.count(hashBlock)) + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found"); + pblockindex = mapBlockIndex[hashBlock]; + } else { + CCoins coins; + if (pcoinsTip->GetCoins(oneTxid, coins) && coins.nHeight > 0 && coins.nHeight <= chainActive.Height()) + pblockindex = chainActive[coins.nHeight]; + } + + if (pblockindex == NULL) + { + CTransaction tx; + if (!GetTransaction(oneTxid, tx, hashBlock, false) || hashBlock.IsNull()) + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Transaction not yet in block"); + if (!mapBlockIndex.count(hashBlock)) + throw JSONRPCError(RPC_INTERNAL_ERROR, "Transaction index corrupt"); + pblockindex = mapBlockIndex[hashBlock]; + } + + CBlock block; + if(!ReadBlockFromDisk(block, pblockindex)) + throw JSONRPCError(RPC_INTERNAL_ERROR, "Can't read block from disk"); + + unsigned int ntxFound = 0; + BOOST_FOREACH(const CTransaction&tx, block.vtx) + if (setTxids.count(tx.GetHash())) + ntxFound++; + if (ntxFound != setTxids.size()) + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "(Not all) transactions not found in specified block"); + + CDataStream ssMB(SER_NETWORK, PROTOCOL_VERSION); + CMerkleBlock mb(block, setTxids); + ssMB << mb; + std::string strHex = HexStr(ssMB.begin(), ssMB.end()); + return strHex; +} + +UniValue verifytxoutproofcc(const UniValue& params, bool fHelp) +{ + if (fHelp || params.size() != 1) + throw runtime_error( + "verifytxoutproof \"proof\"\n" + "\nVerifies that a proof points to a transaction in a block, returning the transaction it commits to\n" + "and throwing an RPC error if the block is not in our best chain\n" + "\nArguments:\n" + "1. \"proof\" (string, required) The hex-encoded proof generated by gettxoutproof\n" + "\nResult:\n" + "[\"txid\"] (array, strings) The txid(s) which the proof commits to, or empty array if the proof is invalid\n" + ); + + CDataStream ssMB(ParseHexV(params[0], "proof"), SER_NETWORK, PROTOCOL_VERSION); + CMerkleBlock merkleBlock; + ssMB >> merkleBlock; + + UniValue res(UniValue::VARR); + + vector vMatch; + if (merkleBlock.txn.ExtractMatches(vMatch) != merkleBlock.header.hashMerkleRoot) + return res; + + LOCK(cs_main); + + if (!mapBlockIndex.count(merkleBlock.header.GetHash()) || !chainActive.Contains(mapBlockIndex[merkleBlock.header.GetHash()])) + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found in chain"); + + BOOST_FOREACH(const uint256& hash, vMatch) + res.push_back(hash.GetHex()); + return res; +} + +UniValue createrawtransactioncc(const UniValue& params, bool fHelp) +{ + if (fHelp || params.size() != 2) + throw runtime_error( + "createrawtransaction [{\"txid\":\"id\",\"vout\":n},...] {\"address\":amount,...}\n" + "\nCreate a transaction spending the given inputs and sending to the given addresses.\n" + "Returns hex-encoded raw transaction.\n" + "Note that the transaction's inputs are not signed, and\n" + "it is not stored in the wallet or transmitted to the network.\n" + + "\nArguments:\n" + "1. \"transactions\" (string, required) A json array of json objects\n" + " [\n" + " {\n" + " \"txid\":\"id\", (string, required) The transaction id\n" + " \"vout\":n (numeric, required) The output number\n" + " }\n" + " ,...\n" + " ]\n" + "2. \"addresses\" (string, required) a json object with addresses as keys and amounts as values\n" + " {\n" + " \"address\": x.xxx (numeric, required) The key is the bitcoin address, the value is the btc amount\n" + " ,...\n" + " }\n" + + "\nResult:\n" + "\"transaction\" (string) hex string of the transaction\n" + + "\nExamples\n" + + HelpExampleCli("createrawtransactioncc", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\" \"{\\\"address\\\":0.01}\"") + + HelpExampleRpc("createrawtransactioncc", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\", \"{\\\"address\\\":0.01}\"") + ); + + LOCK(cs_main); + RPCTypeCheck(params, boost::assign::list_of(UniValue::VARR)(UniValue::VARR)); + + UniValue inputs = params[0].get_array(); + UniValue outputs = params[1].get_array(); + + CMutableTransaction rawTx; + + for (size_t idx = 0; idx < inputs.size(); idx++) { + const UniValue& input = inputs[idx]; + const UniValue& o = input.get_obj(); + + uint256 txid = ParseHashO(o, "txid"); + + const UniValue& vout_v = find_value(o, "vout"); + if (!vout_v.isNum()) + throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, missing vout key"); + int nOutput = vout_v.get_int(); + if (nOutput < 0) + throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, vout must be positive"); + + CTxIn in(COutPoint(txid, nOutput)); + rawTx.vin.push_back(in); + } + + for (size_t idx = 0; idx < outputs.size(); idx++) { + const UniValue& output = outputs[idx].get_obj(); + + const UniValue& condition = find_value(output, "condition"); + std::string encoded = condition.write(); + fprintf(stderr, "%s\n", encoded.c_str()); + char *err = new char[1000]; + CC *cond = cc_conditionFromJSONString(encoded.c_str(), err); + if (NULL == cond) + throw JSONRPCError(RPC_INVALID_PARAMETER, err); + char *condBin = new char[1000]; + size_t binLength = cc_conditionBinary(cond, condBin); + std::vector condVec(condBin, condBin + binLength); + + CScript redeemScript; + redeemScript << ToByteVector(condVec) << OP_CHECKCRYPTOCONDITIONVERIFY; + CAmount nAmount = AmountFromValue(find_value(output, "amount")); + + CTxOut out(nAmount, redeemScript); + rawTx.vout.push_back(out); + } + + /* + set setAddress; + vector addrList = sendTo.getKeys(); + BOOST_FOREACH(const string& name_, addrList) { + CBitcoinAddress address(name_); + if (!address.IsValid()) + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, string("Invalid Bitcoin address: ")+name_); + + if (setAddress.count(address)) + throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid parameter, duplicated address: ")+name_); + setAddress.insert(address); + + CScript scriptPubKey = GetScriptForDestination(address.Get()); + CAmount nAmount = AmountFromValue(sendTo[name_]); + + CTxOut out(nAmount, scriptPubKey); + rawTx.vout.push_back(out); + } + */ + + return EncodeHexTx(rawTx); +} + +UniValue decoderawtransactioncc(const UniValue& params, bool fHelp) +{ + if (fHelp || params.size() != 1) + throw runtime_error( + "decoderawtransaction \"hexstring\"\n" + "\nReturn a JSON object representing the serialized, hex-encoded transaction.\n" + + "\nArguments:\n" + "1. \"hex\" (string, required) The transaction hex string\n" + + "\nResult:\n" + "{\n" + " \"txid\" : \"id\", (string) The transaction id\n" + " \"version\" : n, (numeric) The version\n" + " \"locktime\" : ttt, (numeric) The lock time\n" + " \"vin\" : [ (array of json objects)\n" + " {\n" + " \"txid\": \"id\", (string) The transaction id\n" + " \"vout\": n, (numeric) The output number\n" + " \"scriptSig\": { (json object) The script\n" + " \"asm\": \"asm\", (string) asm\n" + " \"hex\": \"hex\" (string) hex\n" + " },\n" + " \"sequence\": n (numeric) The script sequence number\n" + " }\n" + " ,...\n" + " ],\n" + " \"vout\" : [ (array of json objects)\n" + " {\n" + " \"value\" : x.xxx, (numeric) The value in btc\n" + " \"n\" : n, (numeric) index\n" + " \"scriptPubKey\" : { (json object)\n" + " \"asm\" : \"asm\", (string) the asm\n" + " \"hex\" : \"hex\", (string) the hex\n" + " \"reqSigs\" : n, (numeric) The required sigs\n" + " \"type\" : \"pubkeyhash\", (string) The type, eg 'pubkeyhash'\n" + " \"addresses\" : [ (json array of string)\n" + " \"12tvKAXCxZjSmdNbao16dKXC8tRWfcF5oc\" (string) bitcoin address\n" + " ,...\n" + " ]\n" + " }\n" + " }\n" + " ,...\n" + " ],\n" + " \"vjoinsplit\" : [ (array of json objects, only for version >= 2)\n" + " {\n" + " \"vpub_old\" : x.xxx, (numeric) public input value in ZEC\n" + " \"vpub_new\" : x.xxx, (numeric) public output value in ZEC\n" + " \"anchor\" : \"hex\", (string) the anchor\n" + " \"nullifiers\" : [ (json array of string)\n" + " \"hex\" (string) input note nullifier\n" + " ,...\n" + " ],\n" + " \"commitments\" : [ (json array of string)\n" + " \"hex\" (string) output note commitment\n" + " ,...\n" + " ],\n" + " \"onetimePubKey\" : \"hex\", (string) the onetime public key used to encrypt the ciphertexts\n" + " \"randomSeed\" : \"hex\", (string) the random seed\n" + " \"macs\" : [ (json array of string)\n" + " \"hex\" (string) input note MAC\n" + " ,...\n" + " ],\n" + " \"proof\" : \"hex\", (string) the zero-knowledge proof\n" + " \"ciphertexts\" : [ (json array of string)\n" + " \"hex\" (string) output note ciphertext\n" + " ,...\n" + " ]\n" + " }\n" + " ,...\n" + " ],\n" + "}\n" + + "\nExamples:\n" + + HelpExampleCli("decoderawtransaction", "\"hexstring\"") + + HelpExampleRpc("decoderawtransaction", "\"hexstring\"") + ); + + LOCK(cs_main); + RPCTypeCheck(params, boost::assign::list_of(UniValue::VSTR)); + + CTransaction tx; + + if (!DecodeHexTx(tx, params[0].get_str())) + throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed"); + + UniValue result(UniValue::VOBJ); + TxToJSON(tx, uint256(), result); + + return result; +} + +UniValue decodescriptcc(const UniValue& params, bool fHelp) +{ + if (fHelp || params.size() != 1) + throw runtime_error( + "decodescript \"hex\"\n" + "\nDecode a hex-encoded script.\n" + "\nArguments:\n" + "1. \"hex\" (string) the hex encoded script\n" + "\nResult:\n" + "{\n" + " \"asm\":\"asm\", (string) Script public key\n" + " \"hex\":\"hex\", (string) hex encoded public key\n" + " \"type\":\"type\", (string) The output type\n" + " \"reqSigs\": n, (numeric) The required signatures\n" + " \"addresses\": [ (json array of string)\n" + " \"address\" (string) bitcoin address\n" + " ,...\n" + " ],\n" + " \"p2sh\",\"address\" (string) script address\n" + "}\n" + "\nExamples:\n" + + HelpExampleCli("decodescript", "\"hexstring\"") + + HelpExampleRpc("decodescript", "\"hexstring\"") + ); + + LOCK(cs_main); + RPCTypeCheck(params, boost::assign::list_of(UniValue::VSTR)); + + UniValue r(UniValue::VOBJ); + CScript script; + if (params[0].get_str().size() > 0){ + vector scriptData(ParseHexV(params[0], "argument")); + script = CScript(scriptData.begin(), scriptData.end()); + } else { + // Empty scripts are valid + } + ScriptPubKeyToJSON(script, r, false); + + r.push_back(Pair("p2sh", CBitcoinAddress(CScriptID(script)).ToString())); + return r; +} + +/** Pushes a JSON object for script verification or signing errors to vErrorsRet. */ +static void TxInErrorToJSON(const CTxIn& txin, UniValue& vErrorsRet, const std::string& strMessage) {} + + +UniValue signrawtransactioncc(const UniValue& params, bool fHelp) +{ + if (fHelp || params.size() < 1 || params.size() > 4) + throw runtime_error( + "signrawtransactioncc \"hexstring\" ( [{\"txid\":\"id\",\"vout\":n,\"scriptPubKey\":\"hex\",\"redeemScript\":\"hex\"},...] [\"privatekey1\",...] sighashtype )\n" + "\nSign cryptocondition inputs for raw transaction (serialized, hex-encoded).\n" + "The second optional argument (may be null) is an array of previous transaction outputs that\n" + "this transaction depends on but may not yet be in the block chain.\n" + "The third optional argument (may be null) is an array of base58-encoded private\n" + "keys that, if given, will be the only keys used to sign the transaction.\n" +#ifdef ENABLE_WALLET + + HelpRequiringPassphrase() + "\n" +#endif + + "\nArguments:\n" + "1. \"hexstring\" (string, required) The transaction hex string\n" + /* "2. \"prevtxs\" (string, optional) An json array of previous dependent transaction outputs\n" + " [ (json array of json objects, or 'null' if none provided)\n" + " {\n" + " \"txid\":\"id\", (string, required) The transaction id\n" + " \"vout\":n, (numeric, required) The output number\n" + " \"scriptPubKey\": \"hex\", (string, required) script key\n" + " \"redeemScript\": \"hex\" (string, required for P2SH) redeem script\n" + " }\n" + " ,...\n" + " ]\n" */ + "3. \"privatekeys\" (string, optional) A json array of base58-encoded private keys for signing\n" + " [ (json array of strings, or 'null' if none provided)\n" + " \"privatekey\" (string) private key in base58-encoding\n" + " ,...\n" + " ]\n" + /* "4. \"sighashtype\" (string, optional, default=ALL) The signature hash type. Must be one of\n" + " \"ALL\"\n" + " \"NONE\"\n" + " \"SINGLE\"\n" + " \"ALL|ANYONECANPAY\"\n" + " \"NONE|ANYONECANPAY\"\n" + " \"SINGLE|ANYONECANPAY\"\n" */ + + "\nResult:\n" + "{\n" + " \"hex\" : \"value\", (string) The hex-encoded raw transaction with signature(s)\n" + " \"complete\" : true|false, (boolean) If the transaction has a complete set of signatures\n" + " \"errors\" : [ (json array of objects) Script verification errors (if there are any)\n" + " {\n" + " \"txid\" : \"hash\", (string) The hash of the referenced, previous transaction\n" + " \"vout\" : n, (numeric) The index of the output to spent and used as input\n" + " \"scriptSig\" : \"hex\", (string) The hex-encoded signature script\n" + " \"sequence\" : n, (numeric) Script sequence number\n" + " \"error\" : \"text\" (string) Verification or signing error related to the input\n" + " }\n" + " ,...\n" + " ]\n" + "}\n" + + "\nExamples:\n" + + HelpExampleCli("signrawtransactioncc", "\"myhex\"") + + HelpExampleRpc("signrawtransactioncc", "\"myhex\"") + ); + +#ifdef ENABLE_WALLET + LOCK2(cs_main, pwalletMain ? &pwalletMain->cs_wallet : NULL); +#else + LOCK(cs_main); +#endif + RPCTypeCheck(params, boost::assign::list_of(UniValue::VSTR)(UniValue::VARR)(UniValue::VARR)(UniValue::VSTR), true); + + vector txData(ParseHexV(params[0], "argument 1")); + CDataStream ssData(txData, SER_NETWORK, PROTOCOL_VERSION); + vector txVariants; + while (!ssData.empty()) { + //try { + CMutableTransaction tx; + ssData >> tx; + txVariants.push_back(tx); + //} + //catch (const std::exception&) { + //throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed"); + //} + } + + if (txVariants.empty()) + throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "Missing transaction"); + + // mergedTx will end up with all the signatures; it + // starts as a clone of the rawtx: + CMutableTransaction mergedTx(txVariants[0]); + + // Fetch previous transactions (inputs): + CCoinsView viewDummy; + CCoinsViewCache view(&viewDummy); + { + LOCK(mempool.cs); + CCoinsViewCache &viewChain = *pcoinsTip; + CCoinsViewMemPool viewMempool(&viewChain, mempool); + view.SetBackend(viewMempool); // temporarily switch cache backend to db+mempool view + + BOOST_FOREACH(const CTxIn& txin, mergedTx.vin) { + const uint256& prevHash = txin.prevout.hash; + CCoins coins; + view.AccessCoins(prevHash); // this is certainly allowed to fail + } + + view.SetBackend(viewDummy); // switch back to avoid locking mempool for too long + } + + bool fGivenKeys = false; + CBasicKeyStore tempKeystore; + if (params.size() > 2 && !params[2].isNull()) { + fGivenKeys = true; + UniValue keys = params[2].get_array(); + for (size_t idx = 0; idx < keys.size(); idx++) { + UniValue k = keys[idx]; + CBitcoinSecret vchSecret; + bool fGood = vchSecret.SetString(k.get_str()); + if (!fGood) + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid private key"); + CKey key = vchSecret.GetKey(); + if (!key.IsValid()) + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Private key outside allowed range"); + tempKeystore.AddKey(key); + } + } +#ifdef ENABLE_WALLET + else if (pwalletMain) + EnsureWalletIsUnlocked(); +#endif + + // Add previous txouts given in the RPC call: + /* + if (params.size() > 1 && !params[1].isNull()) { + UniValue prevTxs = params[1].get_array(); + for (size_t idx = 0; idx < prevTxs.size(); idx++) { + const UniValue& p = prevTxs[idx]; + if (!p.isObject()) + throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "expected object with {\"txid'\",\"vout\",\"scriptPubKey\"}"); + + UniValue prevOut = p.get_obj(); + + RPCTypeCheckObj(prevOut, boost::assign::map_list_of("txid", UniValue::VSTR)("vout", UniValue::VNUM)("scriptPubKey", UniValue::VSTR)); + + uint256 txid = ParseHashO(prevOut, "txid"); + + int nOut = find_value(prevOut, "vout").get_int(); + if (nOut < 0) + throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "vout must be positive"); + + vector pkData(ParseHexO(prevOut, "scriptPubKey")); + CScript scriptPubKey(pkData.begin(), pkData.end()); + + { + CCoinsModifier coins = view.ModifyCoins(txid); + if (coins->IsAvailable(nOut) && coins->vout[nOut].scriptPubKey != scriptPubKey) { + string err("Previous output scriptPubKey mismatch:\n"); + err = err + coins->vout[nOut].scriptPubKey.ToString() + "\nvs:\n"+ + scriptPubKey.ToString(); + throw JSONRPCError(RPC_DESERIALIZATION_ERROR, err); + } + if ((unsigned int)nOut >= coins->vout.size()) + coins->vout.resize(nOut+1); + coins->vout[nOut].scriptPubKey = scriptPubKey; + coins->vout[nOut].nValue = 0; // we don't know the actual output value + } + + // if redeemScript given and not using the local wallet (private keys + // given), add redeemScript to the tempKeystore so it can be signed: + if (fGivenKeys && scriptPubKey.IsPayToScriptHash()) { + RPCTypeCheckObj(prevOut, boost::assign::map_list_of("txid", UniValue::VSTR)("vout", UniValue::VNUM)("scriptPubKey", UniValue::VSTR)("redeemScript",UniValue::VSTR)); + UniValue v = find_value(prevOut, "redeemScript"); + if (!v.isNull()) { + vector rsData(ParseHexV(v, "redeemScript")); + CScript redeemScript(rsData.begin(), rsData.end()); + tempKeystore.AddCScript(redeemScript); + } + } + } + } + */ + +#ifdef ENABLE_WALLET + const CKeyStore& keystore = ((fGivenKeys || !pwalletMain) ? tempKeystore : *pwalletMain); +#else + const CKeyStore& keystore = tempKeystore; +#endif + + int nHashType = SIGHASH_ALL; + /* + if (params.size() > 3 && !params[3].isNull()) { + static map mapSigHashValues = + boost::assign::map_list_of + (string("ALL"), int(SIGHASH_ALL)) + (string("ALL|ANYONECANPAY"), int(SIGHASH_ALL|SIGHASH_ANYONECANPAY)) + (string("NONE"), int(SIGHASH_NONE)) + (string("NONE|ANYONECANPAY"), int(SIGHASH_NONE|SIGHASH_ANYONECANPAY)) + (string("SINGLE"), int(SIGHASH_SINGLE)) + (string("SINGLE|ANYONECANPAY"), int(SIGHASH_SINGLE|SIGHASH_ANYONECANPAY)) + ; + string strHashType = params[3].get_str(); + if (mapSigHashValues.count(strHashType)) + nHashType = mapSigHashValues[strHashType]; + else + throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid sighash param"); + } + */ + + bool fHashSingle = ((nHashType & ~SIGHASH_ANYONECANPAY) == SIGHASH_SINGLE); + + // Script verification errors + UniValue vErrors(UniValue::VARR); + + // Sign what we can: + for (unsigned int i = 0; i < mergedTx.vin.size(); i++) { + CTxIn& txin = mergedTx.vin[i]; + const CCoins* coins = view.AccessCoins(txin.prevout.hash); + if (coins == NULL || !coins->IsAvailable(txin.prevout.n)) { + TxInErrorToJSON(txin, vErrors, "Input not found or already spent"); + continue; + } + const CScript& prevPubKey = coins->vout[txin.prevout.n].scriptPubKey; + + txin.scriptSig.clear(); + // Only sign SIGHASH_SINGLE if there's a corresponding output: + if (!fHashSingle || (i < mergedTx.vout.size())) + SignSignature(keystore, prevPubKey, mergedTx, i, nHashType); + + // ... and merge in other signatures: + BOOST_FOREACH(const CMutableTransaction& txv, txVariants) { + txin.scriptSig = CombineSignatures(prevPubKey, mergedTx, i, txin.scriptSig, txv.vin[i].scriptSig); + } + ScriptError serror = SCRIPT_ERR_OK; + if (!VerifyScript(txin.scriptSig, prevPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, MutableTransactionSignatureChecker(&mergedTx, i), &serror)) { + TxInErrorToJSON(txin, vErrors, ScriptErrorString(serror)); + } + } + bool fComplete = vErrors.empty(); + + UniValue result(UniValue::VOBJ); + result.push_back(Pair("hex", EncodeHexTx(mergedTx))); + result.push_back(Pair("complete", fComplete)); + if (!vErrors.empty()) { + result.push_back(Pair("errors", vErrors)); + } + + return result; +} + +UniValue sendrawtransactioncc(const UniValue& params, bool fHelp) +{ + if (fHelp || params.size() < 1 || params.size() > 2) + throw runtime_error( + "sendrawtransaction \"hexstring\" ( allowhighfees )\n" + "\nSubmits raw transaction (serialized, hex-encoded) to local node and network.\n" + "\nAlso see createrawtransaction and signrawtransaction calls.\n" + "\nArguments:\n" + "1. \"hexstring\" (string, required) The hex string of the raw transaction)\n" + "2. allowhighfees (boolean, optional, default=false) Allow high fees\n" + "\nResult:\n" + "\"hex\" (string) The transaction hash in hex\n" + "\nExamples:\n" + "\nCreate a transaction\n" + + HelpExampleCli("createrawtransaction", "\"[{\\\"txid\\\" : \\\"mytxid\\\",\\\"vout\\\":0}]\" \"{\\\"myaddress\\\":0.01}\"") + + "Sign the transaction, and get back the hex\n" + + HelpExampleCli("signrawtransaction", "\"myhex\"") + + "\nSend the transaction (signed hex)\n" + + HelpExampleCli("sendrawtransaction", "\"signedhex\"") + + "\nAs a json rpc call\n" + + HelpExampleRpc("sendrawtransaction", "\"signedhex\"") + ); + + LOCK(cs_main); + RPCTypeCheck(params, boost::assign::list_of(UniValue::VSTR)(UniValue::VBOOL)); + + // parse hex string from parameter + CTransaction tx; + if (!DecodeHexTx(tx, params[0].get_str())) + throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed"); + uint256 hashTx = tx.GetHash(); + + bool fOverrideFees = false; + if (params.size() > 1) + fOverrideFees = params[1].get_bool(); + + CCoinsViewCache &view = *pcoinsTip; + const CCoins* existingCoins = view.AccessCoins(hashTx); + bool fHaveMempool = mempool.exists(hashTx); + bool fHaveChain = existingCoins && existingCoins->nHeight < 1000000000; + if (!fHaveMempool && !fHaveChain) { + // push to local node and sync with wallets + CValidationState state; + bool fMissingInputs; + if (!AcceptToMemoryPool(mempool, state, tx, false, &fMissingInputs, !fOverrideFees)) { + if (state.IsInvalid()) { + throw JSONRPCError(RPC_TRANSACTION_REJECTED, strprintf("%i: %s", state.GetRejectCode(), state.GetRejectReason())); + } else { + if (fMissingInputs) { + throw JSONRPCError(RPC_TRANSACTION_ERROR, "Missing inputs"); + } + throw JSONRPCError(RPC_TRANSACTION_ERROR, state.GetRejectReason()); + } + } + } else if (fHaveChain) { + throw JSONRPCError(RPC_TRANSACTION_ALREADY_IN_CHAIN, "transaction already in block chain"); + } + RelayTransaction(tx); + + return hashTx.GetHex(); +} diff --git a/src/rpcserver.cpp b/src/rpcserver.cpp index 518ba4693..06c08a3be 100644 --- a/src/rpcserver.cpp +++ b/src/rpcserver.cpp @@ -325,6 +325,8 @@ static const CRPCCommand vRPCCommands[] = { "rawtransactions", "getrawtransaction", &getrawtransaction, true }, { "rawtransactions", "sendrawtransaction", &sendrawtransaction, false }, { "rawtransactions", "signrawtransaction", &signrawtransaction, false }, /* uses wallet if enabled */ + { "rawtransactions", "createrawtransactioncc", &createrawtransactioncc, true }, + { "rawtransactions", "signrawtransactioncc", &signrawtransactioncc, false }, /* uses wallet if enabled */ #ifdef ENABLE_WALLET { "rawtransactions", "fundrawtransaction", &fundrawtransaction, false }, #endif diff --git a/src/rpcserver.h b/src/rpcserver.h index ecf7b0573..611abd05f 100644 --- a/src/rpcserver.h +++ b/src/rpcserver.h @@ -262,6 +262,9 @@ extern UniValue sendrawtransaction(const UniValue& params, bool fHelp); extern UniValue gettxoutproof(const UniValue& params, bool fHelp); extern UniValue verifytxoutproof(const UniValue& params, bool fHelp); +extern UniValue createrawtransactioncc(const UniValue& params, bool fHelp); // in rpccryptocondition.cpp +extern UniValue signrawtransactioncc(const UniValue& params, bool fHelp); + extern UniValue getblockcount(const UniValue& params, bool fHelp); // in rpcblockchain.cpp extern UniValue getbestblockhash(const UniValue& params, bool fHelp); extern UniValue getdifficulty(const UniValue& params, bool fHelp); From 8fa1b4be0e9c60ef3f6f877e44a32ae20b7b91e4 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Sun, 22 Oct 2017 21:57:07 -0700 Subject: [PATCH 0262/1062] upgrade cJSON and move cJSON extensions to different module --- src/bitcoin-cli.cpp | 2 +- src/cJSON.c | 3577 +++++++++++++++++++++++++++++++------------ src/cJSON.h | 458 +++--- src/komodo.h | 2 +- src/komodo_cJSON.c | 559 +++++++ src/komodo_cJSON.h | 128 ++ src/komodo_jumblr.h | 18 +- src/komodo_notary.h | 2 + 8 files changed, 3516 insertions(+), 1230 deletions(-) mode change 100755 => 100644 src/cJSON.c mode change 100755 => 100644 src/cJSON.h create mode 100755 src/komodo_cJSON.c create mode 100755 src/komodo_cJSON.h diff --git a/src/bitcoin-cli.cpp b/src/bitcoin-cli.cpp index bb9aeb580..cac650a00 100644 --- a/src/bitcoin-cli.cpp +++ b/src/bitcoin-cli.cpp @@ -72,7 +72,7 @@ public: #include "komodo_globals.h" #include "komodo_utils.h" -#include "cJSON.c" +#include "komodo_cJSON.c" #include "komodo_notary.h" void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotaries,uint8_t notaryid,uint256 txhash,uint64_t voutmask,uint8_t numvouts,uint32_t *pvals,uint8_t numpvals,int32_t KMDheight,uint32_t KMDtimestamp,uint64_t opretvalue,uint8_t *opretbuf,uint16_t opretlen,uint16_t vout) diff --git a/src/cJSON.c b/src/cJSON.c old mode 100755 new mode 100644 index 82b78a403..5b58f2ffc --- a/src/cJSON.c +++ b/src/cJSON.c @@ -1,1136 +1,2699 @@ - /* - Copyright (c) 2009 Dave Gamble - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - */ + Copyright (c) 2009-2017 Dave Gamble and cJSON contributors + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ /* cJSON */ /* JSON parser in C. */ + +#ifdef __GNUC__ +#pragma GCC visibility push(default) +#endif + +#include +#include #include +#include +#include +#include +#include +#include + +#ifdef __GNUC__ +#pragma GCC visibility pop +#endif #include "cJSON.h" -#ifndef DBL_EPSILON -#define DBL_EPSILON 2.2204460492503131E-16 +/* define our own boolean type */ +#define true ((cJSON_bool)1) +#define false ((cJSON_bool)0) + +typedef struct { + const unsigned char *json; + size_t position; +} cJSON_error; +static cJSON_error global_error = { NULL, 0 }; + +CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void) +{ + return (const char*) (global_error.json + global_error.position); +} + +/* This is a safeguard to prevent copy-pasters from using incompatible C and header files */ +#if (CJSON_VERSION_MAJOR != 1) || (CJSON_VERSION_MINOR != 5) || (CJSON_VERSION_PATCH != 9) + #error cJSON.h and cJSON.c have different versions. Make sure that both have the same. #endif -static const char *ep; - -long stripquotes(char *str) +CJSON_PUBLIC(const char*) cJSON_Version(void) { - long len,offset; - if ( str == 0 ) - return(0); - len = strlen(str); - if ( str[0] == '"' && str[len-1] == '"' ) - str[len-1] = 0, offset = 1; - else offset = 0; - return(offset); + static char version[15]; + sprintf(version, "%i.%i.%i", CJSON_VERSION_MAJOR, CJSON_VERSION_MINOR, CJSON_VERSION_PATCH); + + return version; } -const char *cJSON_GetErrorPtr(void) {return ep;} - -static int32_t cJSON_strcasecmp(const char *s1,const char *s2) +/* Case insensitive string comparison, doesn't consider two NULL pointers equal though */ +static int case_insensitive_strcmp(const unsigned char *string1, const unsigned char *string2) { - if (!s1) return (s1==s2)?0:1;if (!s2) return 1; - for(; tolower((int32_t)(*s1)) == tolower((int32_t)(*s2)); ++s1, ++s2) if(*s1 == 0) return 0; - return tolower((int32_t)(*(const unsigned char *)s1)) - tolower((int32_t)(*(const unsigned char *)s2)); + if ((string1 == NULL) || (string2 == NULL)) + { + return 1; + } + + if (string1 == string2) + { + return 0; + } + + for(; tolower(*string1) == tolower(*string2); (void)string1++, string2++) + { + if (*string1 == '\0') + { + return 0; + } + } + + return tolower(*string1) - tolower(*string2); } -static void *(*cJSON_malloc)(size_t sz) = malloc; -static void (*cJSON_free)(void *ptr) = free; - -static char* cJSON_strdup(const char* str) +typedef struct internal_hooks { - size_t len; - char* copy; - - len = strlen(str) + 1; - if (!(copy = (char*)cJSON_malloc(len+1))) return 0; - memcpy(copy,str,len); + void *(*allocate)(size_t size); + void (*deallocate)(void *pointer); + void *(*reallocate)(void *pointer, size_t size); +} internal_hooks; + +static internal_hooks global_hooks = { malloc, free, realloc }; + +static unsigned char* cJSON_strdup(const unsigned char* string, const internal_hooks * const hooks) +{ + size_t length = 0; + unsigned char *copy = NULL; + + if (string == NULL) + { + return NULL; + } + + length = strlen((const char*)string) + sizeof(""); + if (!(copy = (unsigned char*)hooks->allocate(length))) + { + return NULL; + } + memcpy(copy, string, length); + return copy; } -void cJSON_InitHooks(cJSON_Hooks* hooks) +CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks) { - if (!hooks) { /* Reset hooks */ - cJSON_malloc = malloc; - cJSON_free = free; + if (hooks == NULL) + { + /* Reset hooks */ + global_hooks.allocate = malloc; + global_hooks.deallocate = free; + global_hooks.reallocate = realloc; return; } - - cJSON_malloc = (hooks->malloc_fn)?hooks->malloc_fn:malloc; - cJSON_free = (hooks->free_fn)?hooks->free_fn:free; + + global_hooks.allocate = malloc; + if (hooks->malloc_fn != NULL) + { + global_hooks.allocate = hooks->malloc_fn; + } + + global_hooks.deallocate = free; + if (hooks->free_fn != NULL) + { + global_hooks.deallocate = hooks->free_fn; + } + + /* use realloc only if both free and malloc are used */ + global_hooks.reallocate = NULL; + if ((global_hooks.allocate == malloc) && (global_hooks.deallocate == free)) + { + global_hooks.reallocate = realloc; + } } /* Internal constructor. */ -static cJSON *cJSON_New_Item(void) +static cJSON *cJSON_New_Item(const internal_hooks * const hooks) { - cJSON* node = (cJSON*)cJSON_malloc(sizeof(cJSON)); - if (node) memset(node,0,sizeof(cJSON)); - return node; + cJSON* node = (cJSON*)hooks->allocate(sizeof(cJSON)); + if (node) + { + memset(node, '\0', sizeof(cJSON)); + } + + return node; } /* Delete a cJSON structure. */ -void cJSON_Delete(cJSON *c) +CJSON_PUBLIC(void) cJSON_Delete(cJSON *item) { - cJSON *next; - while (c) - { - next=c->next; - if (!(c->type&cJSON_IsReference) && c->child) cJSON_Delete(c->child); - if (!(c->type&cJSON_IsReference) && c->valuestring) cJSON_free(c->valuestring); - if (c->string) cJSON_free(c->string); - cJSON_free(c); - c=next; - } + cJSON *next = NULL; + while (item != NULL) + { + next = item->next; + if (!(item->type & cJSON_IsReference) && (item->child != NULL)) + { + cJSON_Delete(item->child); + } + if (!(item->type & cJSON_IsReference) && (item->valuestring != NULL)) + { + global_hooks.deallocate(item->valuestring); + } + if (!(item->type & cJSON_StringIsConst) && (item->string != NULL)) + { + global_hooks.deallocate(item->string); + } + global_hooks.deallocate(item); + item = next; + } } -/* Parse the input text to generate a number, and populate the result into item. */ -static const char *parse_number(cJSON *item,const char *num) +/* get the decimal point character of the current locale */ +static unsigned char get_decimal_point(void) { - double n=0,sign=1,scale=0;int32_t subscale=0,signsubscale=1; - - if (*num=='-') sign=-1,num++; /* Has sign? */ - if (*num=='0') num++; /* is zero */ - if (*num>='1' && *num<='9') do n=(n*10.0)+(*num++ -'0'); while (*num>='0' && *num<='9'); /* Number? */ - if (*num=='.' && num[1]>='0' && num[1]<='9') {num++; do n=(n*10.0)+(*num++ -'0'),scale--; while (*num>='0' && *num<='9');} /* Fractional part? */ - if (*num=='e' || *num=='E') /* Exponent? */ - { num++;if (*num=='+') num++; else if (*num=='-') signsubscale=-1,num++; /* With sign? */ - while (*num>='0' && *num<='9') subscale=(subscale*10)+(*num++ - '0'); /* Number? */ - } - - n=sign*n*pow(10.0,(scale+subscale*signsubscale)); /* number = +/- number.fraction * 10^+/- exponent */ - - item->valuedouble=n; - item->valueint=(int64_t)n; - item->type=cJSON_Number; - return num; + struct lconv *lconv = localeconv(); + return (unsigned char) lconv->decimal_point[0]; +} + +typedef struct +{ + const unsigned char *content; + size_t length; + size_t offset; + size_t depth; /* How deeply nested (in arrays/objects) is the input at the current offset. */ + internal_hooks hooks; +} parse_buffer; + +/* check if the given size is left to read in a given parse buffer (starting with 1) */ +#define can_read(buffer, size) ((buffer != NULL) && (((buffer)->offset + size) <= (buffer)->length)) +#define cannot_read(buffer, size) (!can_read(buffer, size)) +/* check if the buffer can be accessed at the given index (starting with 0) */ +#define can_access_at_index(buffer, index) ((buffer != NULL) && (((buffer)->offset + index) < (buffer)->length)) +#define cannot_access_at_index(buffer, index) (!can_access_at_index(buffer, index)) +/* get a pointer to the buffer at the position */ +#define buffer_at_offset(buffer) ((buffer)->content + (buffer)->offset) + +/* Parse the input text to generate a number, and populate the result into item. */ +static cJSON_bool parse_number(cJSON * const item, parse_buffer * const input_buffer) +{ + double number = 0; + unsigned char *after_end = NULL; + unsigned char number_c_string[64]; + unsigned char decimal_point = get_decimal_point(); + size_t i = 0; + + if ((input_buffer == NULL) || (input_buffer->content == NULL)) + { + return false; + } + + /* copy the number into a temporary buffer and replace '.' with the decimal point + * of the current locale (for strtod) + * This also takes care of '\0' not necessarily being available for marking the end of the input */ + for (i = 0; (i < (sizeof(number_c_string) - 1)) && can_access_at_index(input_buffer, i); i++) + { + switch (buffer_at_offset(input_buffer)[i]) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '+': + case '-': + case 'e': + case 'E': + number_c_string[i] = buffer_at_offset(input_buffer)[i]; + break; + + case '.': + number_c_string[i] = decimal_point; + break; + + default: + goto loop_end; + } + } +loop_end: + number_c_string[i] = '\0'; + + number = strtod((const char*)number_c_string, (char**)&after_end); + if (number_c_string == after_end) + { + return false; /* parse_error */ + } + + item->valuedouble = number; + + /* use saturation in case of overflow */ + if (number >= INT_MAX) + { + item->valueint = INT_MAX; + } + else if (number <= INT_MIN) + { + item->valueint = INT_MIN; + } + else + { + item->valueint = (int)number; + } + + item->type = cJSON_Number; + + input_buffer->offset += (size_t)(after_end - number_c_string); + return true; +} + +/* don't ask me, but the original cJSON_SetNumberValue returns an integer or double */ +CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number) +{ + if (number >= INT_MAX) + { + object->valueint = INT_MAX; + } + else if (number <= INT_MIN) + { + object->valueint = INT_MIN; + } + else + { + object->valueint = (int)number; + } + + return object->valuedouble = number; +} + +typedef struct +{ + unsigned char *buffer; + size_t length; + size_t offset; + size_t depth; /* current nesting depth (for formatted printing) */ + cJSON_bool noalloc; + cJSON_bool format; /* is this print a formatted print */ + internal_hooks hooks; +} printbuffer; + +/* realloc printbuffer if necessary to have at least "needed" bytes more */ +static unsigned char* ensure(printbuffer * const p, size_t needed) +{ + unsigned char *newbuffer = NULL; + size_t newsize = 0; + + if ((p == NULL) || (p->buffer == NULL)) + { + return NULL; + } + + if ((p->length > 0) && (p->offset >= p->length)) + { + /* make sure that offset is valid */ + return NULL; + } + + if (needed > INT_MAX) + { + /* sizes bigger than INT_MAX are currently not supported */ + return NULL; + } + + needed += p->offset + 1; + if (needed <= p->length) + { + return p->buffer + p->offset; + } + + if (p->noalloc) { + return NULL; + } + + /* calculate new buffer size */ + if (needed > (INT_MAX / 2)) + { + /* overflow of int, use INT_MAX if possible */ + if (needed <= INT_MAX) + { + newsize = INT_MAX; + } + else + { + return NULL; + } + } + else + { + newsize = needed * 2; + } + + if (p->hooks.reallocate != NULL) + { + /* reallocate with realloc if available */ + newbuffer = (unsigned char*)p->hooks.reallocate(p->buffer, newsize); + if (newbuffer == NULL) + { + p->hooks.deallocate(p->buffer); + p->length = 0; + p->buffer = NULL; + + return NULL; + } + } + else + { + /* otherwise reallocate manually */ + newbuffer = (unsigned char*)p->hooks.allocate(newsize); + if (!newbuffer) + { + p->hooks.deallocate(p->buffer); + p->length = 0; + p->buffer = NULL; + + return NULL; + } + if (newbuffer) + { + memcpy(newbuffer, p->buffer, p->offset + 1); + } + p->hooks.deallocate(p->buffer); + } + p->length = newsize; + p->buffer = newbuffer; + + return newbuffer + p->offset; +} + +/* calculate the new length of the string in a printbuffer and update the offset */ +static void update_offset(printbuffer * const buffer) +{ + const unsigned char *buffer_pointer = NULL; + if ((buffer == NULL) || (buffer->buffer == NULL)) + { + return; + } + buffer_pointer = buffer->buffer + buffer->offset; + + buffer->offset += strlen((const char*)buffer_pointer); } /* Render the number nicely from the given item into a string. */ -static char *print_number(cJSON *item) +static cJSON_bool print_number(const cJSON * const item, printbuffer * const output_buffer) { - char *str; - double d = item->valuedouble; - if ( fabs(((double)item->valueint) - d) <= DBL_EPSILON && d >= (1. - DBL_EPSILON) && d < (1LL << 62) )//d <= INT_MAX && d >= INT_MIN ) - { - str = (char *)cJSON_malloc(24); /* 2^64+1 can be represented in 21 chars + sign. */ - if ( str != 0 ) - sprintf(str,"%lld",(long long)item->valueint); - } - else - { - str = (char *)cJSON_malloc(66); /* This is a nice tradeoff. */ - if ( str != 0 ) - { - if ( fabs(floor(d) - d) <= DBL_EPSILON && fabs(d) < 1.0e60 ) - sprintf(str,"%.0f",d); - //else if (fabs(d)<1.0e-6 || fabs(d)>1.0e9) sprintf(str,"%e",d); - else - sprintf(str,"%.8f",d); - } - } - return str; -} + unsigned char *output_pointer = NULL; + double d = item->valuedouble; + int length = 0; + size_t i = 0; + unsigned char number_buffer[26]; /* temporary buffer to print the number into */ + unsigned char decimal_point = get_decimal_point(); + double test; -static unsigned parse_hex4(const char *str) -{ - unsigned h=0; - if (*str>='0' && *str<='9') h+=(*str)-'0'; else if (*str>='A' && *str<='F') h+=10+(*str)-'A'; else if (*str>='a' && *str<='f') h+=10+(*str)-'a'; else return 0; - h=h<<4;str++; - if (*str>='0' && *str<='9') h+=(*str)-'0'; else if (*str>='A' && *str<='F') h+=10+(*str)-'A'; else if (*str>='a' && *str<='f') h+=10+(*str)-'a'; else return 0; - h=h<<4;str++; - if (*str>='0' && *str<='9') h+=(*str)-'0'; else if (*str>='A' && *str<='F') h+=10+(*str)-'A'; else if (*str>='a' && *str<='f') h+=10+(*str)-'a'; else return 0; - h=h<<4;str++; - if (*str>='0' && *str<='9') h+=(*str)-'0'; else if (*str>='A' && *str<='F') h+=10+(*str)-'A'; else if (*str>='a' && *str<='f') h+=10+(*str)-'a'; else return 0; - return h; -} + if (output_buffer == NULL) + { + return false; + } -/* Parse the input text into an unescaped cstring, and populate item. */ -static const unsigned char firstByteMark[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; -static const char *parse_string(cJSON *item,const char *str) -{ - const char *ptr=str+1;char *ptr2;char *out;int32_t len=0;unsigned uc,uc2; - if (*str!='\"') {ep=str;return 0;} /* not a string! */ - - while (*ptr!='\"' && *ptr && ++len) if (*ptr++ == '\\') ptr++; // Skip escaped quotes - - out=(char*)cJSON_malloc(len+2); /* This is how long we need for the string, roughly. */ - if (!out) return 0; - - ptr=str+1;ptr2=out; - while (*ptr!='\"' && *ptr) - { - if (*ptr!='\\') + /* This checks for NaN and Infinity */ + if ((d * 0) != 0) + { + length = sprintf((char*)number_buffer, "null"); + } + else + { + /* Try 15 decimal places of precision to avoid nonsignificant nonzero digits */ + length = sprintf((char*)number_buffer, "%1.15g", d); + + /* Check whether the original double can be recovered */ + if ((sscanf((char*)number_buffer, "%lg", &test) != 1) || ((double)test != d)) { - if ( *ptr == '%' && is_hexstr((char *)&ptr[1],2) && isprint(_decode_hex((char *)&ptr[1])) != 0 ) - *ptr2++ = _decode_hex((char *)&ptr[1]), ptr += 3; - else *ptr2++ = *ptr++; + /* If not, print with 17 decimal places of precision */ + length = sprintf((char*)number_buffer, "%1.17g", d); } - else - { - ptr++; - switch (*ptr) - { - case 'b': *ptr2++='\b'; break; - case 'f': *ptr2++='\f'; break; - case 'n': *ptr2++='\n'; break; - case 'r': *ptr2++='\r'; break; - case 't': *ptr2++='\t'; break; - case 'u': // transcode utf16 to utf8 - uc=parse_hex4(ptr+1);ptr+=4; // get the unicode char - - if ((uc>=0xDC00 && uc<=0xDFFF) || uc==0) break; // check for invalid - - if (uc>=0xD800 && uc<=0xDBFF) // UTF16 surrogate pairs - { - if (ptr[1]!='\\' || ptr[2]!='u') break; // missing second-half of surrogate. - uc2=parse_hex4(ptr+3);ptr+=6; - if (uc2<0xDC00 || uc2>0xDFFF) break; // invalid second-half of surrogate - uc=0x10000 + (((uc&0x3FF)<<10) | (uc2&0x3FF)); - } - - len=4;if (uc<0x80) len=1;else if (uc<0x800) len=2;else if (uc<0x10000) len=3; ptr2+=len; - - switch (len) { - case 4: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6; - case 3: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6; - case 2: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6; - case 1: *--ptr2 =(uc | firstByteMark[len]); - } - ptr2+=len; - break; - default: *ptr2++=*ptr; break; - } - ptr++; - } - } - *ptr2=0; - if (*ptr=='\"') ptr++; - item->valuestring=out; - item->type=cJSON_String; - return ptr; + } + + /* sprintf failed or buffer overrun occured */ + if ((length < 0) || (length > (int)(sizeof(number_buffer) - 1))) + { + return false; + } + + /* reserve appropriate space in the output */ + output_pointer = ensure(output_buffer, (size_t)length); + if (output_pointer == NULL) + { + return false; + } + + /* copy the printed number to the output and replace locale + * dependent decimal point with '.' */ + for (i = 0; i < ((size_t)length); i++) + { + if (number_buffer[i] == decimal_point) + { + output_pointer[i] = '.'; + continue; + } + + output_pointer[i] = number_buffer[i]; + } + output_pointer[i] = '\0'; + + output_buffer->offset += (size_t)length; + + return true; +} + +/* parse 4 digit hexadecimal number */ +static unsigned parse_hex4(const unsigned char * const input) +{ + unsigned int h = 0; + size_t i = 0; + + for (i = 0; i < 4; i++) + { + /* parse digit */ + if ((input[i] >= '0') && (input[i] <= '9')) + { + h += (unsigned int) input[i] - '0'; + } + else if ((input[i] >= 'A') && (input[i] <= 'F')) + { + h += (unsigned int) 10 + input[i] - 'A'; + } + else if ((input[i] >= 'a') && (input[i] <= 'f')) + { + h += (unsigned int) 10 + input[i] - 'a'; + } + else /* invalid */ + { + return 0; + } + + if (i < 3) + { + /* shift left to make place for the next nibble */ + h = h << 4; + } + } + + return h; +} + +/* converts a UTF-16 literal to UTF-8 + * A literal can be one or two sequences of the form \uXXXX */ +static unsigned char utf16_literal_to_utf8(const unsigned char * const input_pointer, const unsigned char * const input_end, unsigned char **output_pointer) +{ + long unsigned int codepoint = 0; + unsigned int first_code = 0; + const unsigned char *first_sequence = input_pointer; + unsigned char utf8_length = 0; + unsigned char utf8_position = 0; + unsigned char sequence_length = 0; + unsigned char first_byte_mark = 0; + + if ((input_end - first_sequence) < 6) + { + /* input ends unexpectedly */ + goto fail; + } + + /* get the first utf16 sequence */ + first_code = parse_hex4(first_sequence + 2); + + /* check that the code is valid */ + if (((first_code >= 0xDC00) && (first_code <= 0xDFFF))) + { + goto fail; + } + + /* UTF16 surrogate pair */ + if ((first_code >= 0xD800) && (first_code <= 0xDBFF)) + { + const unsigned char *second_sequence = first_sequence + 6; + unsigned int second_code = 0; + sequence_length = 12; /* \uXXXX\uXXXX */ + + if ((input_end - second_sequence) < 6) + { + /* input ends unexpectedly */ + goto fail; + } + + if ((second_sequence[0] != '\\') || (second_sequence[1] != 'u')) + { + /* missing second half of the surrogate pair */ + goto fail; + } + + /* get the second utf16 sequence */ + second_code = parse_hex4(second_sequence + 2); + /* check that the code is valid */ + if ((second_code < 0xDC00) || (second_code > 0xDFFF)) + { + /* invalid second half of the surrogate pair */ + goto fail; + } + + + /* calculate the unicode codepoint from the surrogate pair */ + codepoint = 0x10000 + (((first_code & 0x3FF) << 10) | (second_code & 0x3FF)); + } + else + { + sequence_length = 6; /* \uXXXX */ + codepoint = first_code; + } + + /* encode as UTF-8 + * takes at maximum 4 bytes to encode: + * 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ + if (codepoint < 0x80) + { + /* normal ascii, encoding 0xxxxxxx */ + utf8_length = 1; + } + else if (codepoint < 0x800) + { + /* two bytes, encoding 110xxxxx 10xxxxxx */ + utf8_length = 2; + first_byte_mark = 0xC0; /* 11000000 */ + } + else if (codepoint < 0x10000) + { + /* three bytes, encoding 1110xxxx 10xxxxxx 10xxxxxx */ + utf8_length = 3; + first_byte_mark = 0xE0; /* 11100000 */ + } + else if (codepoint <= 0x10FFFF) + { + /* four bytes, encoding 1110xxxx 10xxxxxx 10xxxxxx 10xxxxxx */ + utf8_length = 4; + first_byte_mark = 0xF0; /* 11110000 */ + } + else + { + /* invalid unicode codepoint */ + goto fail; + } + + /* encode as utf8 */ + for (utf8_position = (unsigned char)(utf8_length - 1); utf8_position > 0; utf8_position--) + { + /* 10xxxxxx */ + (*output_pointer)[utf8_position] = (unsigned char)((codepoint | 0x80) & 0xBF); + codepoint >>= 6; + } + /* encode first byte */ + if (utf8_length > 1) + { + (*output_pointer)[0] = (unsigned char)((codepoint | first_byte_mark) & 0xFF); + } + else + { + (*output_pointer)[0] = (unsigned char)(codepoint & 0x7F); + } + + *output_pointer += utf8_length; + + return sequence_length; + +fail: + return 0; +} + +/* Parse the input text into an unescaped cinput, and populate item. */ +static cJSON_bool parse_string(cJSON * const item, parse_buffer * const input_buffer) +{ + const unsigned char *input_pointer = buffer_at_offset(input_buffer) + 1; + const unsigned char *input_end = buffer_at_offset(input_buffer) + 1; + unsigned char *output_pointer = NULL; + unsigned char *output = NULL; + + /* not a string */ + if (buffer_at_offset(input_buffer)[0] != '\"') + { + goto fail; + } + + { + /* calculate approximate size of the output (overestimate) */ + size_t allocation_length = 0; + size_t skipped_bytes = 0; + while (((size_t)(input_end - input_buffer->content) < input_buffer->length) && (*input_end != '\"')) + { + /* is escape sequence */ + if (input_end[0] == '\\') + { + if ((size_t)(input_end + 1 - input_buffer->content) >= input_buffer->length) + { + /* prevent buffer overflow when last input character is a backslash */ + goto fail; + } + skipped_bytes++; + input_end++; + } + input_end++; + } + if (((size_t)(input_end - input_buffer->content) >= input_buffer->length) || (*input_end != '\"')) + { + goto fail; /* string ended unexpectedly */ + } + + /* This is at most how much we need for the output */ + allocation_length = (size_t) (input_end - buffer_at_offset(input_buffer)) - skipped_bytes; + output = (unsigned char*)input_buffer->hooks.allocate(allocation_length + sizeof("")); + if (output == NULL) + { + goto fail; /* allocation failure */ + } + } + + output_pointer = output; + /* loop through the string literal */ + while (input_pointer < input_end) + { + if (*input_pointer != '\\') + { + *output_pointer++ = *input_pointer++; + } + /* escape sequence */ + else + { + unsigned char sequence_length = 2; + if ((input_end - input_pointer) < 1) + { + goto fail; + } + + switch (input_pointer[1]) + { + case 'b': + *output_pointer++ = '\b'; + break; + case 'f': + *output_pointer++ = '\f'; + break; + case 'n': + *output_pointer++ = '\n'; + break; + case 'r': + *output_pointer++ = '\r'; + break; + case 't': + *output_pointer++ = '\t'; + break; + case '\"': + case '\\': + case '/': + *output_pointer++ = input_pointer[1]; + break; + + /* UTF-16 literal */ + case 'u': + sequence_length = utf16_literal_to_utf8(input_pointer, input_end, &output_pointer); + if (sequence_length == 0) + { + /* failed to convert UTF16-literal to UTF-8 */ + goto fail; + } + break; + + default: + goto fail; + } + input_pointer += sequence_length; + } + } + + /* zero terminate the output */ + *output_pointer = '\0'; + + item->type = cJSON_String; + item->valuestring = (char*)output; + + input_buffer->offset = (size_t) (input_end - input_buffer->content); + input_buffer->offset++; + + return true; + +fail: + if (output != NULL) + { + input_buffer->hooks.deallocate(output); + } + + if (input_pointer != NULL) + { + input_buffer->offset = (size_t)(input_pointer - input_buffer->content); + } + + return false; } /* Render the cstring provided to an escaped version that can be printed. */ -static char *print_string_ptr(const char *str) +static cJSON_bool print_string_ptr(const unsigned char * const input, printbuffer * const output_buffer) { - const char *ptr;char *ptr2,*out;int32_t len=0;unsigned char token; - - if (!str) return cJSON_strdup(""); - ptr=str;while ((token=*ptr) && ++len) {if (strchr("\"\\\b\f\n\r\t",token)) len++; else if (token<32) len+=5;ptr++;} - - out=(char*)cJSON_malloc(len+3+1); - if (!out) return 0; - - ptr2=out;ptr=str; - *ptr2++='\"'; - while (*ptr) - { - if ((unsigned char)*ptr>31 && *ptr!='\"' && *ptr!='\\') *ptr2++=*ptr++; - else - { - *ptr2++='\\'; - switch (token=*ptr++) - { - case '\\': *ptr2++='\\'; break; - case '\"': *ptr2++='\"'; break; - case '\b': *ptr2++='b'; break; - case '\f': *ptr2++='f'; break; - case '\n': *ptr2++='n'; break; - case '\r': *ptr2++='r'; break; - case '\t': *ptr2++='t'; break; - default: sprintf(ptr2,"u%04x",token);ptr2+=5; break; /* escape and print */ - } - } - } - *ptr2++='\"';*ptr2++=0; - return out; + const unsigned char *input_pointer = NULL; + unsigned char *output = NULL; + unsigned char *output_pointer = NULL; + size_t output_length = 0; + /* numbers of additional characters needed for escaping */ + size_t escape_characters = 0; + + if (output_buffer == NULL) + { + return false; + } + + /* empty string */ + if (input == NULL) + { + output = ensure(output_buffer, sizeof("\"\"")); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "\"\""); + + return true; + } + + /* set "flag" to 1 if something needs to be escaped */ + for (input_pointer = input; *input_pointer; input_pointer++) + { + switch (*input_pointer) + { + case '\"': + case '\\': + case '\b': + case '\f': + case '\n': + case '\r': + case '\t': + /* one character escape sequence */ + escape_characters++; + break; + default: + if (*input_pointer < 32) + { + /* UTF-16 escape sequence uXXXX */ + escape_characters += 5; + } + break; + } + } + output_length = (size_t)(input_pointer - input) + escape_characters; + + output = ensure(output_buffer, output_length + sizeof("\"\"")); + if (output == NULL) + { + return false; + } + + /* no characters have to be escaped */ + if (escape_characters == 0) + { + output[0] = '\"'; + memcpy(output + 1, input, output_length); + output[output_length + 1] = '\"'; + output[output_length + 2] = '\0'; + + return true; + } + + output[0] = '\"'; + output_pointer = output + 1; + /* copy the string */ + for (input_pointer = input; *input_pointer != '\0'; (void)input_pointer++, output_pointer++) + { + if ((*input_pointer > 31) && (*input_pointer != '\"') && (*input_pointer != '\\')) + { + /* normal character, copy */ + *output_pointer = *input_pointer; + } + else + { + /* character needs to be escaped */ + *output_pointer++ = '\\'; + switch (*input_pointer) + { + case '\\': + *output_pointer = '\\'; + break; + case '\"': + *output_pointer = '\"'; + break; + case '\b': + *output_pointer = 'b'; + break; + case '\f': + *output_pointer = 'f'; + break; + case '\n': + *output_pointer = 'n'; + break; + case '\r': + *output_pointer = 'r'; + break; + case '\t': + *output_pointer = 't'; + break; + default: + /* escape and print as unicode codepoint */ + sprintf((char*)output_pointer, "u%04x", *input_pointer); + output_pointer += 4; + break; + } + } + } + output[output_length + 1] = '\"'; + output[output_length + 2] = '\0'; + + return true; +} + +/* Invoke print_string_ptr (which is useful) on an item. */ +static cJSON_bool print_string(const cJSON * const item, printbuffer * const p) +{ + return print_string_ptr((unsigned char*)item->valuestring, p); } -/* Invote print_string_ptr (which is useful) on an item. */ -static char *print_string(cJSON *item) {return print_string_ptr(item->valuestring);} /* Predeclare these prototypes. */ -static const char *parse_value(cJSON *item,const char *value); -static char *print_value(cJSON *item,int32_t depth,int32_t fmt); -static const char *parse_array(cJSON *item,const char *value); -static char *print_array(cJSON *item,int32_t depth,int32_t fmt); -static const char *parse_object(cJSON *item,const char *value); -static char *print_object(cJSON *item,int32_t depth,int32_t fmt); +static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer); +static cJSON_bool print_value(const cJSON * const item, printbuffer * const output_buffer); +static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer); +static cJSON_bool print_array(const cJSON * const item, printbuffer * const output_buffer); +static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer); +static cJSON_bool print_object(const cJSON * const item, printbuffer * const output_buffer); /* Utility to jump whitespace and cr/lf */ -static const char *skip(const char *in) {while (in && *in && (unsigned char)*in<=32) in++; return in;} +static parse_buffer *buffer_skip_whitespace(parse_buffer * const buffer) +{ + if ((buffer == NULL) || (buffer->content == NULL)) + { + return NULL; + } + + while (can_access_at_index(buffer, 0) && (buffer_at_offset(buffer)[0] <= 32)) + { + buffer->offset++; + } + + if (buffer->offset == buffer->length) + { + buffer->offset--; + } + + return buffer; +} /* Parse an object - create a new root, and populate. */ -cJSON *cJSON_ParseWithOpts(const char *value,const char **return_parse_end,int32_t require_null_terminated) +CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated) { - const char *end=0; - cJSON *c=cJSON_New_Item(); - ep=0; - if (!c) return 0; /* memory fail */ - - end=parse_value(c,skip(value)); - if (!end) {cJSON_Delete(c);return 0;} /* parse failure. ep is set. */ - - /* if we require null-terminated JSON without appended garbage, skip and then check for a null terminator */ - if (require_null_terminated) {end=skip(end);if (*end) {cJSON_Delete(c);ep=end;return 0;}} - if (return_parse_end) *return_parse_end=end; - return c; + parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } }; + cJSON *item = NULL; + + /* reset error position */ + global_error.json = NULL; + global_error.position = 0; + + if (value == NULL) + { + goto fail; + } + + buffer.content = (const unsigned char*)value; + buffer.length = strlen((const char*)value) + sizeof(""); + buffer.offset = 0; + buffer.hooks = global_hooks; + + item = cJSON_New_Item(&global_hooks); + if (item == NULL) /* memory fail */ + { + goto fail; + } + + if (!parse_value(item, buffer_skip_whitespace(&buffer))) + { + /* parse failure. ep is set. */ + goto fail; + } + + /* if we require null-terminated JSON without appended garbage, skip and then check for a null terminator */ + if (require_null_terminated) + { + buffer_skip_whitespace(&buffer); + if ((buffer.offset >= buffer.length) || buffer_at_offset(&buffer)[0] != '\0') + { + goto fail; + } + } + if (return_parse_end) + { + *return_parse_end = (const char*)buffer_at_offset(&buffer); + } + + return item; + +fail: + if (item != NULL) + { + cJSON_Delete(item); + } + + if (value != NULL) + { + cJSON_error local_error; + local_error.json = (const unsigned char*)value; + local_error.position = 0; + + if (buffer.offset < buffer.length) + { + local_error.position = buffer.offset; + } + else if (buffer.length > 0) + { + local_error.position = buffer.length - 1; + } + + if (return_parse_end != NULL) + { + *return_parse_end = (const char*)local_error.json + local_error.position; + } + + global_error = local_error; + } + + return NULL; } + /* Default options for cJSON_Parse */ -cJSON *cJSON_Parse(const char *value) +CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value) { - return(cJSON_ParseWithOpts(value,0,0)); + return cJSON_ParseWithOpts(value, 0, 0); +} + +#define cjson_min(a, b) ((a < b) ? a : b) + +static unsigned char *print(const cJSON * const item, cJSON_bool format, const internal_hooks * const hooks) +{ + printbuffer buffer[1]; + unsigned char *printed = NULL; + + memset(buffer, 0, sizeof(buffer)); + + /* create buffer */ + buffer->buffer = (unsigned char*) hooks->allocate(256); + buffer->format = format; + buffer->hooks = *hooks; + if (buffer->buffer == NULL) + { + goto fail; + } + + /* print the value */ + if (!print_value(item, buffer)) + { + goto fail; + } + update_offset(buffer); + + /* check if reallocate is available */ + if (hooks->reallocate != NULL) + { + printed = (unsigned char*) hooks->reallocate(buffer->buffer, buffer->length); + buffer->buffer = NULL; + if (printed == NULL) { + goto fail; + } + } + else /* otherwise copy the JSON over to a new buffer */ + { + printed = (unsigned char*) hooks->allocate(buffer->offset + 1); + if (printed == NULL) + { + goto fail; + } + memcpy(printed, buffer->buffer, cjson_min(buffer->length, buffer->offset + 1)); + printed[buffer->offset] = '\0'; /* just to be sure */ + + /* free the buffer */ + hooks->deallocate(buffer->buffer); + } + + return printed; + +fail: + if (buffer->buffer != NULL) + { + hooks->deallocate(buffer->buffer); + } + + if (printed != NULL) + { + hooks->deallocate(printed); + } + + return NULL; } /* Render a cJSON item/entity/structure to text. */ -char *cJSON_Print(cJSON *item) +CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item) { - return(print_value(item,0,1)); + return (char*)print(item, true, &global_hooks); +} + +CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item) +{ + return (char*)print(item, false, &global_hooks); +} + +CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt) +{ + printbuffer p = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } }; + + if (prebuffer < 0) + { + return NULL; + } + + p.buffer = (unsigned char*)global_hooks.allocate((size_t)prebuffer); + if (!p.buffer) + { + return NULL; + } + + p.length = (size_t)prebuffer; + p.offset = 0; + p.noalloc = false; + p.format = fmt; + p.hooks = global_hooks; + + if (!print_value(item, &p)) + { + global_hooks.deallocate(p.buffer); + return NULL; + } + + return (char*)p.buffer; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buf, const int len, const cJSON_bool fmt) +{ + printbuffer p = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } }; + + if ((len < 0) || (buf == NULL)) + { + return false; + } + + p.buffer = (unsigned char*)buf; + p.length = (size_t)len; + p.offset = 0; + p.noalloc = true; + p.format = fmt; + p.hooks = global_hooks; + + return print_value(item, &p); } -char *cJSON_PrintUnformatted(cJSON *item) {return print_value(item,0,0);} /* Parser core - when encountering text, process appropriately. */ -static const char *parse_value(cJSON *item,const char *value) +static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer) { - if (!value) return 0; /* Fail on null. */ - if (!strncmp(value,"null",4)) { item->type=cJSON_NULL; return value+4; } - if (!strncmp(value,"false",5)) { item->type=cJSON_False; return value+5; } - if (!strncmp(value,"true",4)) { item->type=cJSON_True; item->valueint=1; return value+4; } - if (*value=='\"') { return parse_string(item,value); } - if (*value=='-' || (*value>='0' && *value<='9')) { return parse_number(item,value); } - if (*value=='[') { return parse_array(item,value); } - if (*value=='{') { return parse_object(item,value); } - - ep=value;return 0; /* failure. */ + if ((input_buffer == NULL) || (input_buffer->content == NULL)) + { + return false; /* no input */ + } + + /* parse the different types of values */ + /* null */ + if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "null", 4) == 0)) + { + item->type = cJSON_NULL; + input_buffer->offset += 4; + return true; + } + /* false */ + if (can_read(input_buffer, 5) && (strncmp((const char*)buffer_at_offset(input_buffer), "false", 5) == 0)) + { + item->type = cJSON_False; + input_buffer->offset += 5; + return true; + } + /* true */ + if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "true", 4) == 0)) + { + item->type = cJSON_True; + item->valueint = 1; + input_buffer->offset += 4; + return true; + } + /* string */ + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '\"')) + { + return parse_string(item, input_buffer); + } + /* number */ + if (can_access_at_index(input_buffer, 0) && ((buffer_at_offset(input_buffer)[0] == '-') || ((buffer_at_offset(input_buffer)[0] >= '0') && (buffer_at_offset(input_buffer)[0] <= '9')))) + { + return parse_number(item, input_buffer); + } + /* array */ + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '[')) + { + return parse_array(item, input_buffer); + } + /* object */ + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '{')) + { + return parse_object(item, input_buffer); + } + + + return false; } /* Render a value to text. */ -static char *print_value(cJSON *item,int32_t depth,int32_t fmt) +static cJSON_bool print_value(const cJSON * const item, printbuffer * const output_buffer) { - char *out=0; - if (!item) return 0; - switch ((item->type)&255) - { - case cJSON_NULL: out=cJSON_strdup("null"); break; - case cJSON_False: out=cJSON_strdup("false");break; - case cJSON_True: out=cJSON_strdup("true"); break; - case cJSON_Number: out=print_number(item);break; - case cJSON_String: out=print_string(item);break; - case cJSON_Array: out=print_array(item,depth,fmt);break; - case cJSON_Object: out=print_object(item,depth,fmt);break; - } - return out; + unsigned char *output = NULL; + + if ((item == NULL) || (output_buffer == NULL)) + { + return false; + } + + switch ((item->type) & 0xFF) + { + case cJSON_NULL: + output = ensure(output_buffer, 5); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "null"); + return true; + + case cJSON_False: + output = ensure(output_buffer, 6); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "false"); + return true; + + case cJSON_True: + output = ensure(output_buffer, 5); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "true"); + return true; + + case cJSON_Number: + return print_number(item, output_buffer); + + case cJSON_Raw: + { + size_t raw_length = 0; + if (item->valuestring == NULL) + { + if (!output_buffer->noalloc) + { + output_buffer->hooks.deallocate(output_buffer->buffer); + } + return false; + } + + raw_length = strlen(item->valuestring) + sizeof(""); + output = ensure(output_buffer, raw_length); + if (output == NULL) + { + return false; + } + memcpy(output, item->valuestring, raw_length); + return true; + } + + case cJSON_String: + return print_string(item, output_buffer); + + case cJSON_Array: + return print_array(item, output_buffer); + + case cJSON_Object: + return print_object(item, output_buffer); + + default: + return false; + } } /* Build an array from input text. */ -static const char *parse_array(cJSON *item,const char *value) +static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer) { - cJSON *child; - if (*value!='[') {ep=value;return 0;} /* not an array! */ - - item->type=cJSON_Array; - value=skip(value+1); - if (*value==']') return value+1; /* empty array. */ - - item->child=child=cJSON_New_Item(); - if (!item->child) return 0; /* memory fail */ - value=skip(parse_value(child,skip(value))); /* skip any spacing, get the value. */ - if (!value) return 0; - - while (*value==',') - { - cJSON *new_item; - if (!(new_item=cJSON_New_Item())) return 0; /* memory fail */ - child->next=new_item;new_item->prev=child;child=new_item; - value=skip(parse_value(child,skip(value+1))); - if (!value) return 0; /* memory fail */ - } - - if (*value==']') return value+1; /* end of array */ - ep=value;return 0; /* malformed. */ + cJSON *head = NULL; /* head of the linked list */ + cJSON *current_item = NULL; + + if (input_buffer->depth >= CJSON_NESTING_LIMIT) + { + return false; /* to deeply nested */ + } + input_buffer->depth++; + + if (buffer_at_offset(input_buffer)[0] != '[') + { + /* not an array */ + goto fail; + } + + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ']')) + { + /* empty array */ + goto success; + } + + /* check if we skipped to the end of the buffer */ + if (cannot_access_at_index(input_buffer, 0)) + { + input_buffer->offset--; + goto fail; + } + + /* step back to character in front of the first element */ + input_buffer->offset--; + /* loop through the comma separated array elements */ + do + { + /* allocate next item */ + cJSON *new_item = cJSON_New_Item(&(input_buffer->hooks)); + if (new_item == NULL) + { + goto fail; /* allocation failure */ + } + + /* attach next item to list */ + if (head == NULL) + { + /* start the linked list */ + current_item = head = new_item; + } + else + { + /* add to the end and advance */ + current_item->next = new_item; + new_item->prev = current_item; + current_item = new_item; + } + + /* parse next value */ + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (!parse_value(current_item, input_buffer)) + { + goto fail; /* failed to parse value */ + } + buffer_skip_whitespace(input_buffer); + } + while (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ',')); + + if (cannot_access_at_index(input_buffer, 0) || buffer_at_offset(input_buffer)[0] != ']') + { + goto fail; /* expected end of array */ + } + +success: + input_buffer->depth--; + + item->type = cJSON_Array; + item->child = head; + + input_buffer->offset++; + + return true; + +fail: + if (head != NULL) + { + cJSON_Delete(head); + } + + return false; } /* Render an array to text */ -static char *print_array(cJSON *item,int32_t depth,int32_t fmt) +static cJSON_bool print_array(const cJSON * const item, printbuffer * const output_buffer) { - char **entries; - char *out=0,*ptr,*ret;int32_t len=5; - cJSON *child=item->child; - int32_t numentries=0,i=0,fail=0; - - /* How many entries in the array? */ - while (child) numentries++,child=child->next; - /* Explicitly handle numentries==0 */ - if (!numentries) - { - out=(char*)cJSON_malloc(3+1); - if (out) strcpy(out,"[]"); - return out; - } - /* Allocate an array to hold the values for each */ - entries=(char**)cJSON_malloc((1+numentries)*sizeof(char*)); - if (!entries) return 0; - memset(entries,0,numentries*sizeof(char*)); - /* Retrieve all the results: */ - child=item->child; - while (child && !fail) - { - ret=print_value(child,depth+1,fmt); - entries[i++]=ret; - if (ret) len+=strlen(ret)+2+(fmt?1:0); else fail=1; - child=child->next; - } - - /* If we didn't fail, try to malloc the output string */ - if (!fail) out=(char*)cJSON_malloc(len+1); - /* If that fails, we fail. */ - if (!out) fail=1; - - /* Handle failure. */ - if (fail) - { - for (i=0;ichild; + + if (output_buffer == NULL) + { + return false; + } + + /* Compose the output array. */ + /* opening square bracket */ + output_pointer = ensure(output_buffer, 1); + if (output_pointer == NULL) + { + return false; + } + + *output_pointer = '['; + output_buffer->offset++; + output_buffer->depth++; + + while (current_element != NULL) + { + if (!print_value(current_element, output_buffer)) + { + return false; + } + update_offset(output_buffer); + if (current_element->next) + { + length = (size_t) (output_buffer->format ? 2 : 1); + output_pointer = ensure(output_buffer, length + 1); + if (output_pointer == NULL) + { + return false; + } + *output_pointer++ = ','; + if(output_buffer->format) + { + *output_pointer++ = ' '; + } + *output_pointer = '\0'; + output_buffer->offset += length; + } + current_element = current_element->next; + } + + output_pointer = ensure(output_buffer, 2); + if (output_pointer == NULL) + { + return false; + } + *output_pointer++ = ']'; + *output_pointer = '\0'; + output_buffer->depth--; + + return true; } /* Build an object from the text. */ -static const char *parse_object(cJSON *item,const char *value) +static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer) { - cJSON *child; - if (*value!='{') {ep=value;return 0;} /* not an object! */ - - item->type=cJSON_Object; - value=skip(value+1); - if (*value=='}') return value+1; /* empty array. */ - - item->child=child=cJSON_New_Item(); - if (!item->child) return 0; - value=skip(parse_string(child,skip(value))); - if (!value) return 0; - child->string=child->valuestring;child->valuestring=0; - if (*value!=':') {ep=value;return 0;} /* fail! */ - value=skip(parse_value(child,skip(value+1))); /* skip any spacing, get the value. */ - if (!value) return 0; - - while (*value==',') - { - cJSON *new_item; - if (!(new_item=cJSON_New_Item())) return 0; /* memory fail */ - child->next=new_item;new_item->prev=child;child=new_item; - value=skip(parse_string(child,skip(value+1))); - if (!value) return 0; - child->string=child->valuestring;child->valuestring=0; - if (*value!=':') {ep=value;return 0;} /* fail! */ - value=skip(parse_value(child,skip(value+1))); /* skip any spacing, get the value. */ - if (!value) return 0; - } - - if (*value=='}') return value+1; /* end of array */ - ep=value;return 0; /* malformed. */ + cJSON *head = NULL; /* linked list head */ + cJSON *current_item = NULL; + + if (input_buffer->depth >= CJSON_NESTING_LIMIT) + { + return false; /* to deeply nested */ + } + input_buffer->depth++; + + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '{')) + { + goto fail; /* not an object */ + } + + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '}')) + { + goto success; /* empty object */ + } + + /* check if we skipped to the end of the buffer */ + if (cannot_access_at_index(input_buffer, 0)) + { + input_buffer->offset--; + goto fail; + } + + /* step back to character in front of the first element */ + input_buffer->offset--; + /* loop through the comma separated array elements */ + do + { + /* allocate next item */ + cJSON *new_item = cJSON_New_Item(&(input_buffer->hooks)); + if (new_item == NULL) + { + goto fail; /* allocation failure */ + } + + /* attach next item to list */ + if (head == NULL) + { + /* start the linked list */ + current_item = head = new_item; + } + else + { + /* add to the end and advance */ + current_item->next = new_item; + new_item->prev = current_item; + current_item = new_item; + } + + /* parse the name of the child */ + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (!parse_string(current_item, input_buffer)) + { + goto fail; /* faile to parse name */ + } + buffer_skip_whitespace(input_buffer); + + /* swap valuestring and string, because we parsed the name */ + current_item->string = current_item->valuestring; + current_item->valuestring = NULL; + + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != ':')) + { + goto fail; /* invalid object */ + } + + /* parse the value */ + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (!parse_value(current_item, input_buffer)) + { + goto fail; /* failed to parse value */ + } + buffer_skip_whitespace(input_buffer); + } + while (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ',')); + + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '}')) + { + goto fail; /* expected end of object */ + } + +success: + input_buffer->depth--; + + item->type = cJSON_Object; + item->child = head; + + input_buffer->offset++; + return true; + +fail: + if (head != NULL) + { + cJSON_Delete(head); + } + + return false; } /* Render an object to text. */ -static char *print_object(cJSON *item,int32_t depth,int32_t fmt) +static cJSON_bool print_object(const cJSON * const item, printbuffer * const output_buffer) { - char **entries=0,**names=0; - char *out=0,*ptr,*ret,*str;int32_t len=7,i=0,j; - cJSON *child=item->child,*firstchild; - int32_t numentries=0,fail=0; - // Count the number of entries - firstchild = child; - while ( child ) + unsigned char *output_pointer = NULL; + size_t length = 0; + cJSON *current_item = item->child; + + if (output_buffer == NULL) { - numentries++; - child = child->next; - if ( child == firstchild ) + return false; + } + + /* Compose the output: */ + length = (size_t) (output_buffer->format ? 2 : 1); /* fmt: {\n */ + output_pointer = ensure(output_buffer, length + 1); + if (output_pointer == NULL) + { + return false; + } + + *output_pointer++ = '{'; + output_buffer->depth++; + if (output_buffer->format) + { + *output_pointer++ = '\n'; + } + output_buffer->offset += length; + + while (current_item) + { + if (output_buffer->format) { - printf("cJSON infinite loop detected\n"); - break; + size_t i; + output_pointer = ensure(output_buffer, output_buffer->depth); + if (output_pointer == NULL) + { + return false; + } + for (i = 0; i < output_buffer->depth; i++) + { + *output_pointer++ = '\t'; + } + output_buffer->offset += output_buffer->depth; + } + + /* print key */ + if (!print_string_ptr((unsigned char*)current_item->string, output_buffer)) + { + return false; + } + update_offset(output_buffer); + + length = (size_t) (output_buffer->format ? 2 : 1); + output_pointer = ensure(output_buffer, length); + if (output_pointer == NULL) + { + return false; + } + *output_pointer++ = ':'; + if (output_buffer->format) + { + *output_pointer++ = '\t'; + } + output_buffer->offset += length; + + /* print value */ + if (!print_value(current_item, output_buffer)) + { + return false; + } + update_offset(output_buffer); + + /* print comma if not last */ + length = (size_t) ((output_buffer->format ? 1 : 0) + (current_item->next ? 1 : 0)); + output_pointer = ensure(output_buffer, length + 1); + if (output_pointer == NULL) + { + return false; + } + if (current_item->next) + { + *output_pointer++ = ','; + } + + if (output_buffer->format) + { + *output_pointer++ = '\n'; + } + *output_pointer = '\0'; + output_buffer->offset += length; + + current_item = current_item->next; + } + + output_pointer = ensure(output_buffer, output_buffer->format ? (output_buffer->depth + 1) : 2); + if (output_pointer == NULL) + { + return false; + } + if (output_buffer->format) + { + size_t i; + for (i = 0; i < (output_buffer->depth - 1); i++) + { + *output_pointer++ = '\t'; } } - /* Explicitly handle empty object case */ - if (!numentries) - { - out=(char*)cJSON_malloc(fmt?depth+4+1:3+1); - if (!out) return 0; - ptr=out;*ptr++='{'; - if (fmt) {*ptr++='\n';for (i=0;ichild;depth++;if (fmt) len+=depth; - while ( child ) - { - names[i]=str=print_string_ptr(child->string); - entries[i++]=ret=print_value(child,depth,fmt); - if (str && ret) len+=strlen(ret)+strlen(str)+2+(fmt?2+depth:0); else fail=1; - child=child->next; - if ( child == firstchild ) - break; - } - - /* Try to allocate the output string */ - if (!fail) out=(char*)cJSON_malloc(len+1); - if (!out) fail=1; - - /* Handle failure */ - if (fail) - { - for (i=0;idepth--; + + return true; } /* Get Array size/item / object item. */ -int32_t cJSON_GetArraySize(cJSON *array) {cJSON *c; if ( array == 0 ) return(0); c=array->child;int32_t i=0;while(c)i++,c=c->next;return i;} -cJSON *cJSON_GetArrayItem(cJSON *array,int32_t item) {cJSON *c=array->child; while (c && item>0) item--,c=c->next; return c;} -cJSON *cJSON_GetObjectItem(cJSON *object,const char *string) {cJSON *c=object->child; while (c && cJSON_strcasecmp(c->string,string)) c=c->next; return c;} +CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array) +{ + cJSON *child = NULL; + size_t size = 0; + + if (array == NULL) + { + return 0; + } + + child = array->child; + + while(child != NULL) + { + size++; + child = child->next; + } + + /* FIXME: Can overflow here. Cannot be fixed without breaking the API */ + + return (int)size; +} + +static cJSON* get_array_item(const cJSON *array, size_t index) +{ + cJSON *current_child = NULL; + + if (array == NULL) + { + return NULL; + } + + current_child = array->child; + while ((current_child != NULL) && (index > 0)) + { + index--; + current_child = current_child->next; + } + + return current_child; +} + +CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index) +{ + if (index < 0) + { + return NULL; + } + + return get_array_item(array, (size_t)index); +} + +static cJSON *get_object_item(const cJSON * const object, const char * const name, const cJSON_bool case_sensitive) +{ + cJSON *current_element = NULL; + + if ((object == NULL) || (name == NULL)) + { + return NULL; + } + + current_element = object->child; + if (case_sensitive) + { + while ((current_element != NULL) && (strcmp(name, current_element->string) != 0)) + { + current_element = current_element->next; + } + } + else + { + while ((current_element != NULL) && (case_insensitive_strcmp((const unsigned char*)name, (const unsigned char*)(current_element->string)) != 0)) + { + current_element = current_element->next; + } + } + + return current_element; +} + +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string) +{ + return get_object_item(object, string, false); +} + +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string) +{ + return get_object_item(object, string, true); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string) +{ + return cJSON_GetObjectItem(object, string) ? 1 : 0; +} /* Utility for array list handling. */ -static void suffix_object(cJSON *prev,cJSON *item) {prev->next=item;item->prev=prev;} +static void suffix_object(cJSON *prev, cJSON *item) +{ + prev->next = item; + item->prev = prev; +} + /* Utility for handling references. */ -static cJSON *create_reference(cJSON *item) {cJSON *ref=cJSON_New_Item();if (!ref) return 0;memcpy(ref,item,sizeof(cJSON));ref->string=0;ref->type|=cJSON_IsReference;ref->next=ref->prev=0;return ref;} +static cJSON *create_reference(const cJSON *item, const internal_hooks * const hooks) +{ + cJSON *reference = NULL; + if (item == NULL) + { + return NULL; + } + + reference = cJSON_New_Item(hooks); + if (reference == NULL) + { + return NULL; + } + + memcpy(reference, item, sizeof(cJSON)); + reference->string = NULL; + reference->type |= cJSON_IsReference; + reference->next = reference->prev = NULL; + return reference; +} /* Add item to array/object. */ -void cJSON_AddItemToArray(cJSON *array, cJSON *item) {cJSON *c=array->child;if (!item) return; if (!c) {array->child=item;} else {while (c && c->next) c=c->next; suffix_object(c,item);}} -void cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item) {if (!item) return; if (item->string) cJSON_free(item->string);item->string=cJSON_strdup(string);cJSON_AddItemToArray(object,item);} -void cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item) {cJSON_AddItemToArray(array,create_reference(item));} -void cJSON_AddItemReferenceToObject(cJSON *object,const char *string,cJSON *item) {cJSON_AddItemToObject(object,string,create_reference(item));} +CJSON_PUBLIC(void) cJSON_AddItemToArray(cJSON *array, cJSON *item) +{ + cJSON *child = NULL; -cJSON *cJSON_DetachItemFromArray(cJSON *array,int32_t which) {cJSON *c=array->child;while (c && which>0) c=c->next,which--;if (!c) return 0; - if (c->prev) c->prev->next=c->next;if (c->next) c->next->prev=c->prev;if (c==array->child) array->child=c->next;c->prev=c->next=0;return c;} -void cJSON_DeleteItemFromArray(cJSON *array,int32_t which) {cJSON_Delete(cJSON_DetachItemFromArray(array,which));} -cJSON *cJSON_DetachItemFromObject(cJSON *object,const char *string) {int32_t i=0;cJSON *c=object->child;while (c && cJSON_strcasecmp(c->string,string)) i++,c=c->next;if (c) return cJSON_DetachItemFromArray(object,i);return 0;} -void cJSON_DeleteItemFromObject(cJSON *object,const char *string) {cJSON_Delete(cJSON_DetachItemFromObject(object,string));} + if ((item == NULL) || (array == NULL)) + { + return; + } + + child = array->child; + + if (child == NULL) + { + /* list is empty, start new one */ + array->child = item; + } + else + { + /* append to the end */ + while (child->next) + { + child = child->next; + } + suffix_object(child, item); + } +} + +CJSON_PUBLIC(void) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item) +{ + if (item == NULL) + { + return; + } + + /* call cJSON_AddItemToObjectCS for code reuse */ + cJSON_AddItemToObjectCS(object, (char*)cJSON_strdup((const unsigned char*)string, &global_hooks), item); + /* remove cJSON_StringIsConst flag */ + item->type &= ~cJSON_StringIsConst; +} + +#if defined (__clang__) || ((__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))) + #pragma GCC diagnostic push +#endif +#ifdef __GNUC__ +#pragma GCC diagnostic ignored "-Wcast-qual" +#endif + +/* Add an item to an object with constant string as key */ +CJSON_PUBLIC(void) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item) +{ + if ((item == NULL) || (string == NULL)) + { + return; + } + if (!(item->type & cJSON_StringIsConst) && item->string) + { + global_hooks.deallocate(item->string); + } + item->string = (char*)string; + item->type |= cJSON_StringIsConst; + cJSON_AddItemToArray(object, item); +} +#if defined (__clang__) || ((__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))) + #pragma GCC diagnostic pop +#endif + +CJSON_PUBLIC(void) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item) +{ + if (array == NULL) + { + return; + } + + cJSON_AddItemToArray(array, create_reference(item, &global_hooks)); +} + +CJSON_PUBLIC(void) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item) +{ + if ((object == NULL) || (string == NULL)) + { + return; + } + + cJSON_AddItemToObject(object, string, create_reference(item, &global_hooks)); +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item) +{ + if ((parent == NULL) || (item == NULL)) + { + return NULL; + } + + if (item->prev != NULL) + { + /* not the first element */ + item->prev->next = item->next; + } + if (item->next != NULL) + { + /* not the last element */ + item->next->prev = item->prev; + } + + if (item == parent->child) + { + /* first element */ + parent->child = item->next; + } + /* make sure the detached item doesn't point anywhere anymore */ + item->prev = NULL; + item->next = NULL; + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which) +{ + if (which < 0) + { + return NULL; + } + + return cJSON_DetachItemViaPointer(array, get_array_item(array, (size_t)which)); +} + +CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which) +{ + cJSON_Delete(cJSON_DetachItemFromArray(array, which)); +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string) +{ + cJSON *to_detach = cJSON_GetObjectItem(object, string); + + return cJSON_DetachItemViaPointer(object, to_detach); +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string) +{ + cJSON *to_detach = cJSON_GetObjectItemCaseSensitive(object, string); + + return cJSON_DetachItemViaPointer(object, to_detach); +} + +CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string) +{ + cJSON_Delete(cJSON_DetachItemFromObject(object, string)); +} + +CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string) +{ + cJSON_Delete(cJSON_DetachItemFromObjectCaseSensitive(object, string)); +} /* Replace array/object items with new ones. */ -void cJSON_ReplaceItemInArray(cJSON *array,int32_t which,cJSON *newitem) {cJSON *c=array->child;while (c && which>0) c=c->next,which--;if (!c) return; - newitem->next=c->next;newitem->prev=c->prev;if (newitem->next) newitem->next->prev=newitem; - if (c==array->child) array->child=newitem; else newitem->prev->next=newitem;c->next=c->prev=0;cJSON_Delete(c);} -void cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem){int32_t i=0;cJSON *c=object->child;while(c && cJSON_strcasecmp(c->string,string))i++,c=c->next;if(c){newitem->string=cJSON_strdup(string);cJSON_ReplaceItemInArray(object,i,newitem);}} +CJSON_PUBLIC(void) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem) +{ + cJSON *after_inserted = NULL; + + if (which < 0) + { + return; + } + + after_inserted = get_array_item(array, (size_t)which); + if (after_inserted == NULL) + { + cJSON_AddItemToArray(array, newitem); + return; + } + + newitem->next = after_inserted; + newitem->prev = after_inserted->prev; + after_inserted->prev = newitem; + if (after_inserted == array->child) + { + array->child = newitem; + } + else + { + newitem->prev->next = newitem; + } +} + +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement) +{ + if ((parent == NULL) || (replacement == NULL) || (item == NULL)) + { + return false; + } + + if (replacement == item) + { + return true; + } + + replacement->next = item->next; + replacement->prev = item->prev; + + if (replacement->next != NULL) + { + replacement->next->prev = replacement; + } + if (replacement->prev != NULL) + { + replacement->prev->next = replacement; + } + if (parent->child == item) + { + parent->child = replacement; + } + + item->next = NULL; + item->prev = NULL; + cJSON_Delete(item); + + return true; +} + +CJSON_PUBLIC(void) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem) +{ + if (which < 0) + { + return; + } + + cJSON_ReplaceItemViaPointer(array, get_array_item(array, (size_t)which), newitem); +} + +static cJSON_bool replace_item_in_object(cJSON *object, const char *string, cJSON *replacement, cJSON_bool case_sensitive) +{ + if ((replacement == NULL) || (string == NULL)) + { + return false; + } + + /* replace the name in the replacement */ + if (!(replacement->type & cJSON_StringIsConst) && (replacement->string != NULL)) + { + cJSON_free(replacement->string); + } + replacement->string = (char*)cJSON_strdup((const unsigned char*)string, &global_hooks); + replacement->type &= ~cJSON_StringIsConst; + + cJSON_ReplaceItemViaPointer(object, get_object_item(object, string, case_sensitive), replacement); + + return true; +} + +CJSON_PUBLIC(void) cJSON_ReplaceItemInObject(cJSON *object, const char *string, cJSON *newitem) +{ + replace_item_in_object(object, string, newitem, false); +} + +CJSON_PUBLIC(void) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object, const char *string, cJSON *newitem) +{ + replace_item_in_object(object, string, newitem, true); +} /* Create basic types: */ -cJSON *cJSON_CreateNull(void) {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_NULL;return item;} -cJSON *cJSON_CreateTrue(void) {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_True;return item;} -cJSON *cJSON_CreateFalse(void) {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_False;return item;} -cJSON *cJSON_CreateBool(int32_t b) {cJSON *item=cJSON_New_Item();if(item)item->type=b?cJSON_True:cJSON_False;return item;} -cJSON *cJSON_CreateNumber(double num) {cJSON *item=cJSON_New_Item();if(item){item->type=cJSON_Number;item->valuedouble=num;item->valueint=(int64_t)num;}return item;} -cJSON *cJSON_CreateString(const char *string) {cJSON *item=cJSON_New_Item();if(item){item->type=cJSON_String;item->valuestring=cJSON_strdup(string);}return item;} -cJSON *cJSON_CreateArray(void) {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_Array;return item;} -cJSON *cJSON_CreateObject(void) {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_Object;return item;} +CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_NULL; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_True; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_False; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool b) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = b ? cJSON_True : cJSON_False; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_Number; + item->valuedouble = num; + + /* use saturation in case of overflow */ + if (num >= INT_MAX) + { + item->valueint = INT_MAX; + } + else if (num <= INT_MIN) + { + item->valueint = INT_MIN; + } + else + { + item->valueint = (int)num; + } + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_String; + item->valuestring = (char*)cJSON_strdup((const unsigned char*)string, &global_hooks); + if(!item->valuestring) + { + cJSON_Delete(item); + return NULL; + } + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_Raw; + item->valuestring = (char*)cJSON_strdup((const unsigned char*)raw, &global_hooks); + if(!item->valuestring) + { + cJSON_Delete(item); + return NULL; + } + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type=cJSON_Array; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if (item) + { + item->type = cJSON_Object; + } + + return item; +} /* Create Arrays: */ -cJSON *cJSON_CreateIntArray(int64_t *numbers,int32_t count) {int32_t i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && ichild=n;else suffix_object(p,n);p=n;}return a;} -cJSON *cJSON_CreateFloatArray(float *numbers,int32_t count) {int32_t i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && ichild=n;else suffix_object(p,n);p=n;}return a;} -cJSON *cJSON_CreateDoubleArray(double *numbers,int32_t count) {int32_t i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && ichild=n;else suffix_object(p,n);p=n;}return a;} -cJSON *cJSON_CreateStringArray(char **strings,int32_t count) {int32_t i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && ichild=n;else suffix_object(p,n);p=n;}return a;} +CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count) +{ + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; + + if ((count < 0) || (numbers == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + for(i = 0; a && (i < (size_t)count); i++) + { + n = cJSON_CreateNumber(numbers[i]); + if (!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else + { + suffix_object(p, n); + } + p = n; + } + + return a; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count) +{ + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; + + if ((count < 0) || (numbers == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + + for(i = 0; a && (i < (size_t)count); i++) + { + n = cJSON_CreateNumber((double)numbers[i]); + if(!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else + { + suffix_object(p, n); + } + p = n; + } + + return a; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count) +{ + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; + + if ((count < 0) || (numbers == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + + for(i = 0;a && (i < (size_t)count); i++) + { + n = cJSON_CreateNumber(numbers[i]); + if(!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else + { + suffix_object(p, n); + } + p = n; + } + + return a; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char **strings, int count) +{ + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; + + if ((count < 0) || (strings == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + + for (i = 0; a && (i < (size_t)count); i++) + { + n = cJSON_CreateString(strings[i]); + if(!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else + { + suffix_object(p,n); + } + p = n; + } + + return a; +} /* Duplication */ -cJSON *cJSON_Duplicate(cJSON *item,int32_t recurse) +CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse) { - cJSON *newitem,*cptr,*nptr=0,*newchild; - /* Bail on bad ptr */ - if (!item) return 0; - /* Create new item */ - newitem=cJSON_New_Item(); - if (!newitem) return 0; - /* Copy over all vars */ - newitem->type=item->type&(~cJSON_IsReference),newitem->valueint=item->valueint,newitem->valuedouble=item->valuedouble; - if (item->valuestring) {newitem->valuestring=cJSON_strdup(item->valuestring); if (!newitem->valuestring) {cJSON_Delete(newitem);return 0;}} - if (item->string) {newitem->string=cJSON_strdup(item->string); if (!newitem->string) {cJSON_Delete(newitem);return 0;}} - /* If non-recursive, then we're done! */ - if (!recurse) return newitem; - /* Walk the ->next chain for the child. */ - cptr=item->child; - while (cptr) - { - newchild=cJSON_Duplicate(cptr,1); /* Duplicate (with recurse) each item in the ->next chain */ - if (!newchild) {cJSON_Delete(newitem);return 0;} - if (nptr) {nptr->next=newchild,newchild->prev=nptr;nptr=newchild;} /* If newitem->child already set, then crosswire ->prev and ->next and move on */ - else {newitem->child=newchild;nptr=newchild;} /* Set newitem->child and move to it */ - cptr=cptr->next; - } - return newitem; -} + cJSON *newitem = NULL; + cJSON *child = NULL; + cJSON *next = NULL; + cJSON *newchild = NULL; -void cJSON_Minify(char *json) -{ - char *into=json; - while (*json) - { - if (*json==' ') json++; - else if (*json=='\t') json++; // Whitespace characters. - else if (*json=='\r') json++; - else if (*json=='\n') json++; - else if (*json=='/' && json[1]=='/') while (*json && *json!='\n') json++; // double-slash comments, to end of line. - else if (*json=='/' && json[1]=='*') {while (*json && !(*json=='*' && json[1]=='/')) json++;json+=2;} // multiline comments. - else if (*json=='\"'){*into++=*json++;while (*json && *json!='\"'){if (*json=='\\') *into++=*json++;*into++=*json++;}*into++=*json++;} // string literals, which are \" sensitive. - else *into++=*json++; // All other characters. - } - *into=0; // and null-terminate. -} - -// the following written by jl777 -/****************************************************************************** - * Copyright © 2014-2017 The SuperNET Developers. * - * * - * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * - * the top-level directory of this distribution for the individual copyright * - * holder information and the developer policies on copyright and licensing. * - * * - * Unless otherwise agreed in a custom licensing agreement, no part of the * - * SuperNET software, including this file may be copied, modified, propagated * - * or distributed except according to the terms contained in the LICENSE file * - * * - * Removal or modification of this copyright notice is prohibited. * - * * - ******************************************************************************/ - -void copy_cJSON(struct destbuf *dest,cJSON *obj) -{ - char *str; - int i; - long offset; - dest->buf[0] = 0; - if ( obj != 0 ) + /* Bail on bad ptr */ + if (!item) { - str = cJSON_Print(obj); - if ( str != 0 ) + goto fail; + } + /* Create new item */ + newitem = cJSON_New_Item(&global_hooks); + if (!newitem) + { + goto fail; + } + /* Copy over all vars */ + newitem->type = item->type & (~cJSON_IsReference); + newitem->valueint = item->valueint; + newitem->valuedouble = item->valuedouble; + if (item->valuestring) + { + newitem->valuestring = (char*)cJSON_strdup((unsigned char*)item->valuestring, &global_hooks); + if (!newitem->valuestring) { - offset = stripquotes(str); - //strcpy(dest,str+offset); - for (i=0; ibuf[i]= str[offset+i]) == 0 ) - break; - dest->buf[i] = 0; - free(str); + goto fail; } } -} - -void copy_cJSON2(char *dest,int32_t maxlen,cJSON *obj) -{ - struct destbuf tmp; - maxlen--; - dest[0] = 0; - if ( maxlen > sizeof(tmp.buf) ) - maxlen = sizeof(tmp.buf); - copy_cJSON(&tmp,obj); - if ( strlen(tmp.buf) < maxlen ) - strcpy(dest,tmp.buf); - else dest[0] = 0; -} - -int64_t _get_cJSON_int(cJSON *json) -{ - struct destbuf tmp; - if ( json != 0 ) + if (item->string) { - copy_cJSON(&tmp,json); - if ( tmp.buf[0] != 0 ) - return(calc_nxt64bits(tmp.buf)); - } - return(0); -} - -int64_t get_cJSON_int(cJSON *json,char *field) -{ - cJSON *numjson; - if ( json != 0 ) - { - numjson = cJSON_GetObjectItem(json,field); - if ( numjson != 0 ) - return(_get_cJSON_int(numjson)); - } - return(0); -} - -int64_t conv_floatstr(char *numstr) -{ - double val,corr; - val = atof(numstr); - corr = (val < 0.) ? -0.50000000001 : 0.50000000001; - return((int64_t)(val * SATOSHIDEN + corr)); -} - -int64_t _conv_cJSON_float(cJSON *json) -{ - int64_t conv_floatstr(char *); - struct destbuf tmp; - if ( json != 0 ) - { - copy_cJSON(&tmp,json); - return(conv_floatstr(tmp.buf)); - } - return(0); -} - -int64_t conv_cJSON_float(cJSON *json,char *field) -{ - if ( json != 0 ) - return(_conv_cJSON_float(cJSON_GetObjectItem(json,field))); - return(0); -} - -int32_t extract_cJSON_str(char *dest,int32_t max,cJSON *json,char *field) -{ - int32_t safecopy(char *dest,char *src,long len); - char *str; - cJSON *obj; - int32_t len; - long offset; - dest[0] = 0; - obj = cJSON_GetObjectItem(json,field); - if ( obj != 0 ) - { - str = cJSON_Print(obj); - offset = stripquotes(str); - len = safecopy(dest,str+offset,max); - free(str); - return(len); - } - return(0); -} - -cJSON *gen_list_json(char **list) -{ - cJSON *array,*item; - array = cJSON_CreateArray(); - while ( list != 0 && *list != 0 && *list[0] != 0 ) - { - item = cJSON_CreateString(*list++); - cJSON_AddItemToArray(array,item); - } - return(array); -} - -uint64_t get_API_nxt64bits(cJSON *obj) -{ - uint64_t nxt64bits = 0; - struct destbuf tmp; - if ( obj != 0 ) - { - if ( is_cJSON_Number(obj) != 0 ) - return((uint64_t)obj->valuedouble); - copy_cJSON(&tmp,obj); - nxt64bits = calc_nxt64bits(tmp.buf); - } - return(nxt64bits); -} -uint64_t j64bits(cJSON *json,char *field) { if ( field == 0 ) return(get_API_nxt64bits(json)); return(get_API_nxt64bits(cJSON_GetObjectItem(json,field))); } -uint64_t j64bitsi(cJSON *json,int32_t i) { return(get_API_nxt64bits(cJSON_GetArrayItem(json,i))); } - -uint64_t get_satoshi_obj(cJSON *json,char *field) -{ - int32_t i,n; - uint64_t prev,satoshis,mult = 1; - struct destbuf numstr,checkstr; - cJSON *numjson; - numjson = cJSON_GetObjectItem(json,field); - copy_cJSON(&numstr,numjson); - satoshis = prev = 0; mult = 1; n = (int32_t)strlen(numstr.buf); - for (i=n-1; i>=0; i--,mult*=10) - { - satoshis += (mult * (numstr.buf[i] - '0')); - if ( satoshis < prev ) - printf("get_satoshi_obj numstr.(%s) i.%d prev.%llu vs satoshis.%llu\n",numstr.buf,i,(unsigned long long)prev,(unsigned long long)satoshis); - prev = satoshis; - } - sprintf(checkstr.buf,"%llu",(long long)satoshis); - if ( strcmp(checkstr.buf,numstr.buf) != 0 ) - { - printf("SATOSHI GREMLIN?? numstr.(%s) -> %.8f -> (%s)\n",numstr.buf,dstr(satoshis),checkstr.buf); - } - return(satoshis); -} - -void add_satoshis_json(cJSON *json,char *field,uint64_t satoshis) -{ - cJSON *obj; - char numstr[64]; - sprintf(numstr,"%lld",(long long)satoshis); - obj = cJSON_CreateString(numstr); - cJSON_AddItemToObject(json,field,obj); - if ( satoshis != get_satoshi_obj(json,field) ) - printf("error adding satoshi obj %ld -> %ld\n",(unsigned long)satoshis,(unsigned long)get_satoshi_obj(json,field)); -} - -char *cJSON_str(cJSON *json) -{ - if ( json != 0 && is_cJSON_String(json) != 0 ) - return(json->valuestring); - return(0); -} - -void jadd(cJSON *json,char *field,cJSON *item) { if ( json != 0 )cJSON_AddItemToObject(json,field,item); } -void jaddstr(cJSON *json,char *field,char *str) { if ( json != 0 && str != 0 ) cJSON_AddItemToObject(json,field,cJSON_CreateString(str)); } -void jaddnum(cJSON *json,char *field,double num) { if ( json != 0 )cJSON_AddItemToObject(json,field,cJSON_CreateNumber(num)); } -void jadd64bits(cJSON *json,char *field,uint64_t nxt64bits) { char numstr[64]; sprintf(numstr,"%llu",(long long)nxt64bits), jaddstr(json,field,numstr); } -void jaddi(cJSON *json,cJSON *item) { if ( json != 0 ) cJSON_AddItemToArray(json,item); } -void jaddistr(cJSON *json,char *str) { if ( json != 0 ) cJSON_AddItemToArray(json,cJSON_CreateString(str)); } -void jaddinum(cJSON *json,double num) { if ( json != 0 ) cJSON_AddItemToArray(json,cJSON_CreateNumber(num)); } -void jaddi64bits(cJSON *json,uint64_t nxt64bits) { char numstr[64]; sprintf(numstr,"%llu",(long long)nxt64bits), jaddistr(json,numstr); } -char *jstr(cJSON *json,char *field) { if ( json == 0 ) return(0); if ( field == 0 ) return(cJSON_str(json)); return(cJSON_str(cJSON_GetObjectItem(json,field))); } - -char *jstri(cJSON *json,int32_t i) { return(cJSON_str(cJSON_GetArrayItem(json,i))); } -char *jprint(cJSON *json,int32_t freeflag) -{ - char *str; - /*static portable_mutex_t mutex; static int32_t initflag; - if ( initflag == 0 ) - { - portable_mutex_init(&mutex); - initflag = 1; - }*/ - if ( json == 0 ) - return(clonestr((char *)"{}")); - //portable_mutex_lock(&mutex); - //usleep(5000); - str = cJSON_Print(json), _stripwhite(str,' '); - if ( freeflag != 0 ) - free_json(json); - //portable_mutex_unlock(&mutex); - return(str); -} - -bits256 get_API_bits256(cJSON *obj) -{ - bits256 hash; char *str; - memset(hash.bytes,0,sizeof(hash)); - if ( obj != 0 ) - { - if ( is_cJSON_String(obj) != 0 && (str= obj->valuestring) != 0 && strlen(str) == 64 ) - decode_hex(hash.bytes,sizeof(hash),str); - } - return(hash); -} -bits256 jbits256(cJSON *json,char *field) { if ( field == 0 ) return(get_API_bits256(json)); return(get_API_bits256(cJSON_GetObjectItem(json,field))); } -bits256 jbits256i(cJSON *json,int32_t i) { return(get_API_bits256(cJSON_GetArrayItem(json,i))); } -void jaddbits256(cJSON *json,char *field,bits256 hash) { char str[65]; bits256_str(str,hash), jaddstr(json,field,str); } -void jaddibits256(cJSON *json,bits256 hash) { char str[65]; bits256_str(str,hash), jaddistr(json,str); } - -char *get_cJSON_fieldname(cJSON *obj) -{ - if ( obj != 0 ) - { - if ( obj->child != 0 && obj->child->string != 0 ) - return(obj->child->string); - else if ( obj->string != 0 ) - return(obj->string); - } - return((char *)""); -} - -int32_t jnum(cJSON *obj,char *field) -{ - char *str; int32_t polarity = 1; - if ( field != 0 ) - obj = jobj(obj,field); - if ( obj != 0 ) - { - if ( is_cJSON_Number(obj) != 0 ) - return(obj->valuedouble); - else if ( is_cJSON_String(obj) != 0 && (str= jstr(obj,0)) != 0 ) + newitem->string = (item->type&cJSON_StringIsConst) ? item->string : (char*)cJSON_strdup((unsigned char*)item->string, &global_hooks); + if (!newitem->string) { - if ( str[0] == '-' ) - polarity = -1, str++; - return(polarity * (int32_t)calc_nxt64bits(str)); + goto fail; } } - return(0); -} - -void ensure_jsonitem(cJSON *json,char *field,char *value) -{ - cJSON *obj = cJSON_GetObjectItem(json,field); - if ( obj == 0 ) - cJSON_AddItemToObject(json,field,cJSON_CreateString(value)); - else cJSON_ReplaceItemInObject(json,field,cJSON_CreateString(value)); -} - -int32_t in_jsonarray(cJSON *array,char *value) -{ - int32_t i,n; - struct destbuf remote; - if ( array != 0 && is_cJSON_Array(array) != 0 ) + /* If non-recursive, then we're done! */ + if (!recurse) { - n = cJSON_GetArraySize(array); - for (i=0; inext chain for the child. */ + child = item->child; + while (child != NULL) + { + newchild = cJSON_Duplicate(child, true); /* Duplicate (with recurse) each item in the ->next chain */ + if (!newchild) { - if ( array == 0 || n == 0 ) - break; - copy_cJSON(&remote,cJSON_GetArrayItem(array,i)); - if ( strcmp(remote.buf,value) == 0 ) - return(1); + goto fail; } - } - return(0); -} - -int32_t myatoi(char *str,int32_t range) -{ - long x; char *ptr; - x = strtol(str,&ptr,10); - if ( range != 0 && x >= range ) - x = (range - 1); - return((int32_t)x); -} - -int32_t get_API_int(cJSON *obj,int32_t val) -{ - struct destbuf buf; - if ( obj != 0 ) - { - if ( is_cJSON_Number(obj) != 0 ) - return((int32_t)obj->valuedouble); - copy_cJSON(&buf,obj); - val = myatoi(buf.buf,0); - if ( val < 0 ) - val = 0; - } - return(val); -} -int32_t jint(cJSON *json,char *field) { if ( json == 0 ) return(0); if ( field == 0 ) return(get_API_int(json,0)); return(get_API_int(cJSON_GetObjectItem(json,field),0)); } -int32_t jinti(cJSON *json,int32_t i) { if ( json == 0 ) return(0); return(get_API_int(cJSON_GetArrayItem(json,i),0)); } - -uint32_t get_API_uint(cJSON *obj,uint32_t val) -{ - struct destbuf buf; - if ( obj != 0 ) - { - if ( is_cJSON_Number(obj) != 0 ) - return((uint32_t)obj->valuedouble); - copy_cJSON(&buf,obj); - val = myatoi(buf.buf,0); - } - return(val); -} -uint32_t juint(cJSON *json,char *field) { if ( json == 0 ) return(0); if ( field == 0 ) return(get_API_uint(json,0)); return(get_API_uint(cJSON_GetObjectItem(json,field),0)); } -uint32_t juinti(cJSON *json,int32_t i) { if ( json == 0 ) return(0); return(get_API_uint(cJSON_GetArrayItem(json,i),0)); } - -double get_API_float(cJSON *obj) -{ - double val = 0.; - struct destbuf buf; - if ( obj != 0 ) - { - if ( is_cJSON_Number(obj) != 0 ) - return(obj->valuedouble); - copy_cJSON(&buf,obj); - val = atof(buf.buf); - } - return(val); -} - -double jdouble(cJSON *json,char *field) -{ - if ( json != 0 ) - { - if ( field == 0 ) - return(get_API_float(json)); - else return(get_API_float(cJSON_GetObjectItem(json,field))); - } else return(0.); -} - -double jdoublei(cJSON *json,int32_t i) -{ - if ( json != 0 ) - return(get_API_float(cJSON_GetArrayItem(json,i))); - else return(0.); -} - -cJSON *jobj(cJSON *json,char *field) { if ( json != 0 ) return(cJSON_GetObjectItem(json,field)); return(0); } - -void jdelete(cJSON *json,char *field) -{ - if ( jobj(json,field) != 0 ) - cJSON_DeleteItemFromObject(json,field); -} - -cJSON *jduplicate(cJSON *json) { return(cJSON_Duplicate(json,1)); } - -cJSON *jitem(cJSON *array,int32_t i) { if ( array != 0 && is_cJSON_Array(array) != 0 && cJSON_GetArraySize(array) > i ) return(cJSON_GetArrayItem(array,i)); return(0); } -cJSON *jarray(int32_t *nump,cJSON *json,char *field) -{ - cJSON *array; - if ( json != 0 ) - { - if ( field == 0 ) - array = json; - else array = cJSON_GetObjectItem(json,field); - if ( array != 0 && is_cJSON_Array(array) != 0 && (*nump= cJSON_GetArraySize(array)) > 0 ) - return(array); - } - *nump = 0; - return(0); -} - -int32_t expand_nxt64bits(char *NXTaddr,uint64_t nxt64bits) -{ - int32_t i,n; - uint64_t modval; - char rev[64]; - for (i=0; nxt64bits!=0; i++) - { - modval = nxt64bits % 10; - rev[i] = (char)(modval + '0'); - nxt64bits /= 10; - } - n = i; - for (i=0; i= 22 ) - { - printf("calc_nxt64bits: illegal NXTaddr.(%s) too long\n",NXTaddr); - return(0); - } - else if ( strcmp(NXTaddr,"0") == 0 || strcmp(NXTaddr,"false") == 0 ) - { - // printf("zero address?\n"); getchar(); - return(0); - } - if ( NXTaddr[0] == '-' ) - polarity = -1, NXTaddr++, n--; - mult = 1; - lastval = 0; - for (i=n-1; i>=0; i--,mult*=10) - { - c = NXTaddr[i]; - if ( c < '0' || c > '9' ) + if (next != NULL) { - printf("calc_nxt64bits: illegal char.(%c %d) in (%s).%d\n",c,c,NXTaddr,(int32_t)i); -#ifdef __APPLE__ - //while ( 1 ) + /* If newitem->child already set, then crosswire ->prev and ->next and move on */ + next->next = newchild; + newchild->prev = next; + next = newchild; + } + else + { + /* Set newitem->child and move to it */ + newitem->child = newchild; + next = newchild; + } + child = child->next; + } + + return newitem; + +fail: + if (newitem != NULL) + { + cJSON_Delete(newitem); + } + + return NULL; +} + +CJSON_PUBLIC(void) cJSON_Minify(char *json) +{ + unsigned char *into = (unsigned char*)json; + + if (json == NULL) + { + return; + } + + while (*json) + { + if (*json == ' ') + { + json++; + } + else if (*json == '\t') + { + /* Whitespace characters. */ + json++; + } + else if (*json == '\r') + { + json++; + } + else if (*json=='\n') + { + json++; + } + else if ((*json == '/') && (json[1] == '/')) + { + /* double-slash comments, to end of line. */ + while (*json && (*json != '\n')) { - //sleep(60); - printf("calc_nxt64bits: illegal char.(%c %d) in (%s).%d\n",c,c,NXTaddr,(int32_t)i); + json++; } -#endif - return(0); } - nxt64bits += mult * (c - '0'); - if ( nxt64bits < lastval ) - printf("calc_nxt64bits: warning: 64bit overflow %llx < %llx\n",(long long)nxt64bits,(long long)lastval); - lastval = nxt64bits; + else if ((*json == '/') && (json[1] == '*')) + { + /* multiline comments. */ + while (*json && !((*json == '*') && (json[1] == '/'))) + { + json++; + } + json += 2; + } + else if (*json == '\"') + { + /* string literals, which are \" sensitive. */ + *into++ = (unsigned char)*json++; + while (*json && (*json != '\"')) + { + if (*json == '\\') + { + *into++ = (unsigned char)*json++; + } + *into++ = (unsigned char)*json++; + } + *into++ = (unsigned char)*json++; + } + else + { + /* All other characters. */ + *into++ = (unsigned char)*json++; + } } - while ( *NXTaddr == '0' && *NXTaddr != 0 ) - NXTaddr++; - if ( cmp_nxt64bits(NXTaddr,nxt64bits) != 0 ) - printf("error calculating nxt64bits: %s -> %llx -> %s\n",NXTaddr,(long long)nxt64bits,nxt64str(nxt64bits)); - if ( polarity < 0 ) - return(-(int64_t)nxt64bits); - return(nxt64bits); + + /* and null-terminate. */ + *into = '\0'; } -cJSON *addrs_jsonarray(uint64_t *addrs,int32_t num) +CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item) { - int32_t j; cJSON *array; - array = cJSON_CreateArray(); - for (j=0; jtype & 0xFF) == cJSON_Invalid; } -void free_json(cJSON *json) { if ( json != 0 ) cJSON_Delete(json); } +CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_False; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xff) == cJSON_True; +} + + +CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & (cJSON_True | cJSON_False)) != 0; +} +CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_NULL; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Number; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_String; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Array; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Object; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Raw; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive) +{ + if ((a == NULL) || (b == NULL) || ((a->type & 0xFF) != (b->type & 0xFF)) || cJSON_IsInvalid(a)) + { + return false; + } + + /* check if type is valid */ + switch (a->type & 0xFF) + { + case cJSON_False: + case cJSON_True: + case cJSON_NULL: + case cJSON_Number: + case cJSON_String: + case cJSON_Raw: + case cJSON_Array: + case cJSON_Object: + break; + + default: + return false; + } + + /* identical objects are equal */ + if (a == b) + { + return true; + } + + switch (a->type & 0xFF) + { + /* in these cases and equal type is enough */ + case cJSON_False: + case cJSON_True: + case cJSON_NULL: + return true; + + case cJSON_Number: + if (a->valuedouble == b->valuedouble) + { + return true; + } + return false; + + case cJSON_String: + case cJSON_Raw: + if ((a->valuestring == NULL) || (b->valuestring == NULL)) + { + return false; + } + if (strcmp(a->valuestring, b->valuestring) == 0) + { + return true; + } + + return false; + + case cJSON_Array: + { + cJSON *a_element = a->child; + cJSON *b_element = b->child; + + for (; (a_element != NULL) && (b_element != NULL);) + { + if (!cJSON_Compare(a_element, b_element, case_sensitive)) + { + return false; + } + + a_element = a_element->next; + b_element = b_element->next; + } + + /* one of the arrays is longer than the other */ + if (a_element != b_element) { + return false; + } + + return true; + } + + case cJSON_Object: + { + cJSON *a_element = NULL; + cJSON *b_element = NULL; + cJSON_ArrayForEach(a_element, a) + { + /* TODO This has O(n^2) runtime, which is horrible! */ + b_element = get_object_item(b, a_element->string, case_sensitive); + if (b_element == NULL) + { + return false; + } + + if (!cJSON_Compare(a_element, b_element, case_sensitive)) + { + return false; + } + } + + /* doing this twice, once on a and b to prevent true comparison if a subset of b + * TODO: Do this the proper way, this is just a fix for now */ + cJSON_ArrayForEach(b_element, b) + { + a_element = get_object_item(a, b_element->string, case_sensitive); + if (a_element == NULL) + { + return false; + } + + if (!cJSON_Compare(b_element, a_element, case_sensitive)) + { + return false; + } + } + + return true; + } + + default: + return false; + } +} + +CJSON_PUBLIC(void *) cJSON_malloc(size_t size) +{ + return global_hooks.allocate(size); +} + +CJSON_PUBLIC(void) cJSON_free(void *object) +{ + global_hooks.deallocate(object); +} diff --git a/src/cJSON.h b/src/cJSON.h old mode 100755 new mode 100644 index 2ee786358..1e388137e --- a/src/cJSON.h +++ b/src/cJSON.h @@ -1,230 +1,260 @@ /* - Copyright (c) 2009 Dave Gamble - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - */ + Copyright (c) 2009-2017 Dave Gamble and cJSON contributors + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ #ifndef cJSON__h #define cJSON__h -#include -#include -#include -#include -#include -#include -#include -#include "komodo_structs.h" - -//#include "../crypto777/OS_portable.h" - -#define MAX_JSON_FIELD 4096 // on the big side - #ifdef __cplusplus extern "C" { #endif - - /* cJSON Types: */ -#define cJSON_False 0 -#define cJSON_True 1 -#define cJSON_NULL 2 -#define cJSON_Number 3 -#define cJSON_String 4 -#define cJSON_Array 5 -#define cJSON_Object 6 - -#define is_cJSON_Null(json) ((json) != 0 && ((json)->type & 0xff) == cJSON_NULL) -#define is_cJSON_Array(json) ((json) != 0 && ((json)->type & 0xff) == cJSON_Array) -#define is_cJSON_String(json) ((json) != 0 && ((json)->type & 0xff) == cJSON_String) -#define is_cJSON_Number(json) ((json) != 0 && ((json)->type & 0xff) == cJSON_Number) -#define is_cJSON_Object(json) ((json) != 0 && ((json)->type & 0xff) == cJSON_Object) -#define is_cJSON_True(json) ((json) != 0 && ((json)->type & 0xff) == cJSON_True) -#define is_cJSON_False(json) ((json) != 0 && ((json)->type & 0xff) == cJSON_False) - + +/* project version */ +#define CJSON_VERSION_MAJOR 1 +#define CJSON_VERSION_MINOR 5 +#define CJSON_VERSION_PATCH 9 + +#include + +/* cJSON Types: */ +#define cJSON_Invalid (0) +#define cJSON_False (1 << 0) +#define cJSON_True (1 << 1) +#define cJSON_NULL (1 << 2) +#define cJSON_Number (1 << 3) +#define cJSON_String (1 << 4) +#define cJSON_Array (1 << 5) +#define cJSON_Object (1 << 6) +#define cJSON_Raw (1 << 7) /* raw json */ + #define cJSON_IsReference 256 - - /* The cJSON structure: */ - typedef struct cJSON { - struct cJSON *next,*prev; /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */ - struct cJSON *child; /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */ - - int32_t type; /* The type of the item, as above. */ - - char *valuestring; /* The item's string, if type==cJSON_String */ - int64_t valueint; /* The item's number, if type==cJSON_Number */ - double valuedouble; /* The item's number, if type==cJSON_Number */ - - char *string; /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */ - } cJSON; - - typedef struct cJSON_Hooks { - void *(*malloc_fn)(size_t sz); - void (*free_fn)(void *ptr); - } cJSON_Hooks; - - /* Supply malloc, realloc and free functions to cJSON */ - extern void cJSON_InitHooks(cJSON_Hooks* hooks); - - - /* Supply a block of JSON, and this returns a cJSON object you can interrogate. Call cJSON_Delete when finished. */ - extern cJSON *cJSON_Parse(const char *value); - /* Render a cJSON entity to text for transfer/storage. Free the char* when finished. */ - extern char *cJSON_Print(cJSON *item); - /* Render a cJSON entity to text for transfer/storage without any formatting. Free the char* when finished. */ - extern char *cJSON_PrintUnformatted(cJSON *item); - /* Delete a cJSON entity and all subentities. */ - extern void cJSON_Delete(cJSON *c); - - /* Returns the number of items in an array (or object). */ - extern int cJSON_GetArraySize(cJSON *array); - /* Retrieve item number "item" from array "array". Returns NULL if unsuccessful. */ - extern cJSON *cJSON_GetArrayItem(cJSON *array,int32_t item); - /* Get item "string" from object. Case insensitive. */ - extern cJSON *cJSON_GetObjectItem(cJSON *object,const char *string); - - /* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */ - extern const char *cJSON_GetErrorPtr(void); - - /* These calls create a cJSON item of the appropriate type. */ - extern cJSON *cJSON_CreateNull(void); - extern cJSON *cJSON_CreateTrue(void); - extern cJSON *cJSON_CreateFalse(void); - extern cJSON *cJSON_CreateBool(int32_t b); - extern cJSON *cJSON_CreateNumber(double num); - extern cJSON *cJSON_CreateString(const char *string); - extern cJSON *cJSON_CreateArray(void); - extern cJSON *cJSON_CreateObject(void); - - /* These utilities create an Array of count items. */ - extern cJSON *cJSON_CreateIntArray(int64_t *numbers,int32_t count); - extern cJSON *cJSON_CreateFloatArray(float *numbers,int32_t count); - extern cJSON *cJSON_CreateDoubleArray(double *numbers,int32_t count); - extern cJSON *cJSON_CreateStringArray(char **strings,int32_t count); - - /* Append item to the specified array/object. */ - extern void cJSON_AddItemToArray(cJSON *array, cJSON *item); - extern void cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item); - /* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but don't want to corrupt your existing cJSON. */ - extern void cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item); - extern void cJSON_AddItemReferenceToObject(cJSON *object,const char *string,cJSON *item); - - /* Remove/Detatch items from Arrays/Objects. */ - extern cJSON *cJSON_DetachItemFromArray(cJSON *array,int32_t which); - extern void cJSON_DeleteItemFromArray(cJSON *array,int32_t which); - extern cJSON *cJSON_DetachItemFromObject(cJSON *object,const char *string); - extern void cJSON_DeleteItemFromObject(cJSON *object,const char *string); - - /* Update array items. */ - extern void cJSON_ReplaceItemInArray(cJSON *array,int32_t which,cJSON *newitem); - extern void cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem); - - /* Duplicate a cJSON item */ - extern cJSON *cJSON_Duplicate(cJSON *item,int32_t recurse); - /* Duplicate will create a new, identical cJSON item to the one you pass, in new memory that will - need to be released. With recurse!=0, it will duplicate any children connected to the item. - The item->next and ->prev pointers are always zero on return from Duplicate. */ - - /* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */ - extern cJSON *cJSON_ParseWithOpts(const char *value,const char **return_parse_end,int32_t require_null_terminated); - - extern void cJSON_Minify(char *json); - - /* Macros for creating things quickly. */ -#define cJSON_AddNullToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateNull()) -#define cJSON_AddTrueToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateTrue()) -#define cJSON_AddFalseToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateFalse()) -#define cJSON_AddBoolToObject(object,name,b) cJSON_AddItemToObject(object, name, cJSON_CreateBool(b)) -#define cJSON_AddNumberToObject(object,name,n) cJSON_AddItemToObject(object, name, cJSON_CreateNumber(n)) -#define cJSON_AddStringToObject(object,name,s) cJSON_AddItemToObject(object, name, cJSON_CreateString(s)) - - struct destbuf { char buf[MAX_JSON_FIELD]; }; - - /* When assigning an integer value, it needs to be propagated to valuedouble too. */ -#define cJSON_SetIntValue(object,val) ((object)?(object)->valueint=(object)->valuedouble=(val):(val)) -#define jfieldstr get_cJSON_fieldname - - char *cJSON_str(cJSON *json); - char *jstr(cJSON *json,char *field); - char *jprint(cJSON *json,int32_t freeflag); - int32_t jint(cJSON *json,char *field); - uint32_t juint(cJSON *json,char *field); - char *jstri(cJSON *json,int32_t i); - int32_t jinti(cJSON *json,int32_t i); - uint32_t juinti(cJSON *json,int32_t i); - uint64_t j64bitsi(cJSON *json,int32_t i); - double jdoublei(cJSON *json,int32_t i); - double jdouble(cJSON *json,char *field); - cJSON *jobj(cJSON *json,char *field); - cJSON *jarray(int32_t *nump,cJSON *json,char *field); - cJSON *jitem(cJSON *array,int32_t i); - uint64_t j64bits(cJSON *json,char *field); - void jadd(cJSON *json,char *field,cJSON *item); - void jaddstr(cJSON *json,char *field,char *str); - void jaddnum(cJSON *json,char *field,double num); - void jadd64bits(cJSON *json,char *field,uint64_t nxt64bits); - void jaddi(cJSON *json,cJSON *item); - void jaddistr(cJSON *json,char *str); - void jaddinum(cJSON *json,double num); - void jaddi64bits(cJSON *json,uint64_t nxt64bits); - void jdelete(cJSON *object,char *string); - cJSON *jduplicate(cJSON *json); - int32_t jnum(cJSON *obj,char *field); - - bits256 jbits256(cJSON *json,char *field); - bits256 jbits256i(cJSON *json,int32_t i); - void jaddbits256(cJSON *json,char *field,bits256 hash); - void jaddibits256(cJSON *json,bits256 hash); - void copy_cJSON(struct destbuf *dest,cJSON *obj); - void copy_cJSON2(char *dest,int32_t maxlen,cJSON *obj); - cJSON *gen_list_json(char **list); - int32_t extract_cJSON_str(char *dest,int32_t max,cJSON *json,char *field); +#define cJSON_StringIsConst 512 - void free_json(cJSON *json); - int64_t _conv_cJSON_float(cJSON *json); - int64_t conv_cJSON_float(cJSON *json,char *field); - int64_t get_cJSON_int(cJSON *json,char *field); - void add_satoshis_json(cJSON *json,char *field,uint64_t satoshis); - uint64_t get_satoshi_obj(cJSON *json,char *field); - - int32_t get_API_int(cJSON *obj,int32_t val); - uint32_t get_API_uint(cJSON *obj,uint32_t val); - uint64_t get_API_nxt64bits(cJSON *obj); - double get_API_float(cJSON *obj); - char *get_cJSON_fieldname(cJSON *obj); - void ensure_jsonitem(cJSON *json,char *field,char *value); - int32_t in_jsonarray(cJSON *array,char *value); - char *bitcoind_RPC(char **retstrp,char *debugstr,char *url,char *userpass,char *command,char *params); - uint64_t calc_nxt64bits(const char *str); - int32_t expand_nxt64bits(char *str,uint64_t nxt64bits); - char *nxt64str(uint64_t nxt64bits); - char *nxt64str2(uint64_t nxt64bits); - cJSON *addrs_jsonarray(uint64_t *addrs,int32_t num); - int32_t myatoi(char *str,int32_t range); +/* The cJSON structure: */ +typedef struct cJSON +{ + /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */ + struct cJSON *next; + struct cJSON *prev; + /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */ + struct cJSON *child; - char *stringifyM(char *str); -#define replace_backslashquotes unstringify - char *unstringify(char *str); -#define jtrue cJSON_CreateTrue -#define jfalse cJSON_CreateFalse + /* The type of the item, as above. */ + int type; -#define jfieldname get_cJSON_fieldname + /* The item's string, if type==cJSON_String and type == cJSON_Raw */ + char *valuestring; + /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */ + int valueint; + /* The item's number, if type==cJSON_Number */ + double valuedouble; + + /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */ + char *string; +} cJSON; + +typedef struct cJSON_Hooks +{ + void *(*malloc_fn)(size_t sz); + void (*free_fn)(void *ptr); +} cJSON_Hooks; + +typedef int cJSON_bool; + +#if !defined(__WINDOWS__) && (defined(WIN32) || defined(WIN64) || defined(_MSC_VER) || defined(_WIN32)) +#define __WINDOWS__ +#endif +#ifdef __WINDOWS__ + +/* When compiling for windows, we specify a specific calling convention to avoid issues where we are being called from a project with a different default calling convention. For windows you have 2 define options: + +CJSON_HIDE_SYMBOLS - Define this in the case where you don't want to ever dllexport symbols +CJSON_EXPORT_SYMBOLS - Define this on library build when you want to dllexport symbols (default) +CJSON_IMPORT_SYMBOLS - Define this if you want to dllimport symbol + +For *nix builds that support visibility attribute, you can define similar behavior by + +setting default visibility to hidden by adding +-fvisibility=hidden (for gcc) +or +-xldscope=hidden (for sun cc) +to CFLAGS + +then using the CJSON_API_VISIBILITY flag to "export" the same symbols the way CJSON_EXPORT_SYMBOLS does + +*/ + +/* export symbols by default, this is necessary for copy pasting the C and header file */ +#if !defined(CJSON_HIDE_SYMBOLS) && !defined(CJSON_IMPORT_SYMBOLS) && !defined(CJSON_EXPORT_SYMBOLS) +#define CJSON_EXPORT_SYMBOLS +#endif + +#if defined(CJSON_HIDE_SYMBOLS) +#define CJSON_PUBLIC(type) type __stdcall +#elif defined(CJSON_EXPORT_SYMBOLS) +#define CJSON_PUBLIC(type) __declspec(dllexport) type __stdcall +#elif defined(CJSON_IMPORT_SYMBOLS) +#define CJSON_PUBLIC(type) __declspec(dllimport) type __stdcall +#endif +#else /* !WIN32 */ +#if (defined(__GNUC__) || defined(__SUNPRO_CC) || defined (__SUNPRO_C)) && defined(CJSON_API_VISIBILITY) +#define CJSON_PUBLIC(type) __attribute__((visibility("default"))) type +#else +#define CJSON_PUBLIC(type) type +#endif +#endif + +/* Limits how deeply nested arrays/objects can be before cJSON rejects to parse them. + * This is to prevent stack overflows. */ +#ifndef CJSON_NESTING_LIMIT +#define CJSON_NESTING_LIMIT 1000 +#endif + +/* returns the version of cJSON as a string */ +CJSON_PUBLIC(const char*) cJSON_Version(void); + +/* Supply malloc, realloc and free functions to cJSON */ +CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks); + +/* Memory Management: the caller is always responsible to free the results from all variants of cJSON_Parse (with cJSON_Delete) and cJSON_Print (with stdlib free, cJSON_Hooks.free_fn, or cJSON_free as appropriate). The exception is cJSON_PrintPreallocated, where the caller has full responsibility of the buffer. */ +/* Supply a block of JSON, and this returns a cJSON object you can interrogate. */ +CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value); +/* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */ +/* If you supply a ptr in return_parse_end and parsing fails, then return_parse_end will contain a pointer to the error so will match cJSON_GetErrorPtr(). */ +CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated); + +/* Render a cJSON entity to text for transfer/storage. */ +CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item); +/* Render a cJSON entity to text for transfer/storage without any formatting. */ +CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item); +/* Render a cJSON entity to text using a buffered strategy. prebuffer is a guess at the final size. guessing well reduces reallocation. fmt=0 gives unformatted, =1 gives formatted */ +CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt); +/* Render a cJSON entity to text using a buffer already allocated in memory with given length. Returns 1 on success and 0 on failure. */ +/* NOTE: cJSON is not always 100% accurate in estimating how much memory it will use, so to be safe allocate 5 bytes more than you actually need */ +CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buffer, const int length, const cJSON_bool format); +/* Delete a cJSON entity and all subentities. */ +CJSON_PUBLIC(void) cJSON_Delete(cJSON *c); + +/* Returns the number of items in an array (or object). */ +CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array); +/* Retrieve item number "item" from array "array". Returns NULL if unsuccessful. */ +CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index); +/* Get item "string" from object. Case insensitive. */ +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string); +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string); +CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string); +/* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */ +CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void); + +/* These functions check the type of an item */ +CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item); + +/* These calls create a cJSON item of the appropriate type. */ +CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool boolean); +CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num); +CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string); +/* raw json */ +CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw); +CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void); + +/* These utilities create an Array of count items. */ +CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count); +CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count); +CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count); +CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char **strings, int count); + +/* Append item to the specified array/object. */ +CJSON_PUBLIC(void) cJSON_AddItemToArray(cJSON *array, cJSON *item); +CJSON_PUBLIC(void) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item); +/* Use this when string is definitely const (i.e. a literal, or as good as), and will definitely survive the cJSON object. + * WARNING: When this function was used, make sure to always check that (item->type & cJSON_StringIsConst) is zero before + * writing to `item->string` */ +CJSON_PUBLIC(void) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item); +/* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but don't want to corrupt your existing cJSON. */ +CJSON_PUBLIC(void) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item); +CJSON_PUBLIC(void) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item); + +/* Remove/Detatch items from Arrays/Objects. */ +CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item); +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which); +CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which); +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string); +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string); +CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string); +CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string); + +/* Update array items. */ +CJSON_PUBLIC(void) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem); /* Shifts pre-existing items to the right. */ +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement); +CJSON_PUBLIC(void) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem); +CJSON_PUBLIC(void) cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem); +CJSON_PUBLIC(void) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object,const char *string,cJSON *newitem); + +/* Duplicate a cJSON item */ +CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse); +/* Duplicate will create a new, identical cJSON item to the one you pass, in new memory that will +need to be released. With recurse!=0, it will duplicate any children connected to the item. +The item->next and ->prev pointers are always zero on return from Duplicate. */ +/* Recursively compare two cJSON items for equality. If either a or b is NULL or invalid, they will be considered unequal. + * case_sensitive determines if object keys are treated case sensitive (1) or case insensitive (0) */ +CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive); + + +CJSON_PUBLIC(void) cJSON_Minify(char *json); + +/* Macros for creating things quickly. */ +#define cJSON_AddNullToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateNull()) +#define cJSON_AddTrueToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateTrue()) +#define cJSON_AddFalseToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateFalse()) +#define cJSON_AddBoolToObject(object,name,b) cJSON_AddItemToObject(object, name, cJSON_CreateBool(b)) +#define cJSON_AddNumberToObject(object,name,n) cJSON_AddItemToObject(object, name, cJSON_CreateNumber(n)) +#define cJSON_AddStringToObject(object,name,s) cJSON_AddItemToObject(object, name, cJSON_CreateString(s)) +#define cJSON_AddRawToObject(object,name,s) cJSON_AddItemToObject(object, name, cJSON_CreateRaw(s)) + +/* When assigning an integer value, it needs to be propagated to valuedouble too. */ +#define cJSON_SetIntValue(object, number) ((object) ? (object)->valueint = (object)->valuedouble = (number) : (number)) +/* helper for the cJSON_SetNumberValue macro */ +CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number); +#define cJSON_SetNumberValue(object, number) ((object != NULL) ? cJSON_SetNumberHelper(object, (double)number) : (number)) + +/* Macro for iterating over an array or object */ +#define cJSON_ArrayForEach(element, array) for(element = (array != NULL) ? (array)->child : NULL; element != NULL; element = element->next) + +/* malloc/free objects using the malloc/free functions that have been set with cJSON_InitHooks */ +CJSON_PUBLIC(void *) cJSON_malloc(size_t size); +CJSON_PUBLIC(void) cJSON_free(void *object); #ifdef __cplusplus } diff --git a/src/komodo.h b/src/komodo.h index e1e40448d..010f1b3b6 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -42,7 +42,7 @@ void komodo_connectblock(CBlockIndex *pindex,CBlock& block); #include "komodo_utils.h" #include "komodo_curve25519.h" -#include "cJSON.c" +#include "komodo_cJSON.c" #include "komodo_bitcoind.h" #include "komodo_interest.h" #include "komodo_pax.h" diff --git a/src/komodo_cJSON.c b/src/komodo_cJSON.c new file mode 100755 index 000000000..ca2c6517c --- /dev/null +++ b/src/komodo_cJSON.c @@ -0,0 +1,559 @@ + +/* + Copyright (c) 2009 Dave Gamble + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + */ + +/* cJSON */ +/* JSON parser in C. */ +#include + +#include "cJSON.h" +#include "komodo_cJSON.h" +#include "cJSON.c" + +#ifndef DBL_EPSILON +#define DBL_EPSILON 2.2204460492503131E-16 +#endif + +static const char *ep; + +long stripquotes(char *str) +{ + long len,offset; + if ( str == 0 ) + return(0); + len = strlen(str); + if ( str[0] == '"' && str[len-1] == '"' ) + str[len-1] = 0, offset = 1; + else offset = 0; + return(offset); +} + +static int32_t cJSON_strcasecmp(const char *s1,const char *s2) +{ + if (!s1) return (s1==s2)?0:1;if (!s2) return 1; + for(; tolower((int32_t)(*s1)) == tolower((int32_t)(*s2)); ++s1, ++s2) if(*s1 == 0) return 0; + return tolower((int32_t)(*(const unsigned char *)s1)) - tolower((int32_t)(*(const unsigned char *)s2)); +} + +// the following written by jl777 +/****************************************************************************** + * Copyright © 2014-2017 The SuperNET Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * SuperNET software, including this file may be copied, modified, propagated * + * or distributed except according to the terms contained in the LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +void copy_cJSON(struct destbuf *dest,cJSON *obj) +{ + char *str; + int i; + long offset; + dest->buf[0] = 0; + if ( obj != 0 ) + { + str = cJSON_Print(obj); + if ( str != 0 ) + { + offset = stripquotes(str); + //strcpy(dest,str+offset); + for (i=0; ibuf[i]= str[offset+i]) == 0 ) + break; + dest->buf[i] = 0; + free(str); + } + } +} + +void copy_cJSON2(char *dest,int32_t maxlen,cJSON *obj) +{ + struct destbuf tmp; + maxlen--; + dest[0] = 0; + if ( maxlen > sizeof(tmp.buf) ) + maxlen = sizeof(tmp.buf); + copy_cJSON(&tmp,obj); + if ( strlen(tmp.buf) < maxlen ) + strcpy(dest,tmp.buf); + else dest[0] = 0; +} + +int64_t _get_cJSON_int(cJSON *json) +{ + struct destbuf tmp; + if ( json != 0 ) + { + copy_cJSON(&tmp,json); + if ( tmp.buf[0] != 0 ) + return(calc_nxt64bits(tmp.buf)); + } + return(0); +} + +int64_t get_cJSON_int(cJSON *json,char *field) +{ + cJSON *numjson; + if ( json != 0 ) + { + numjson = cJSON_GetObjectItem(json,field); + if ( numjson != 0 ) + return(_get_cJSON_int(numjson)); + } + return(0); +} + +int64_t conv_floatstr(char *numstr) +{ + double val,corr; + val = atof(numstr); + corr = (val < 0.) ? -0.50000000001 : 0.50000000001; + return((int64_t)(val * SATOSHIDEN + corr)); +} + +int64_t _conv_cJSON_float(cJSON *json) +{ + int64_t conv_floatstr(char *); + struct destbuf tmp; + if ( json != 0 ) + { + copy_cJSON(&tmp,json); + return(conv_floatstr(tmp.buf)); + } + return(0); +} + +int64_t conv_cJSON_float(cJSON *json,char *field) +{ + if ( json != 0 ) + return(_conv_cJSON_float(cJSON_GetObjectItem(json,field))); + return(0); +} + +int32_t extract_cJSON_str(char *dest,int32_t max,cJSON *json,char *field) +{ + int32_t safecopy(char *dest,char *src,long len); + char *str; + cJSON *obj; + int32_t len; + long offset; + dest[0] = 0; + obj = cJSON_GetObjectItem(json,field); + if ( obj != 0 ) + { + str = cJSON_Print(obj); + offset = stripquotes(str); + len = safecopy(dest,str+offset,max); + free(str); + return(len); + } + return(0); +} + +cJSON *gen_list_json(char **list) +{ + cJSON *array,*item; + array = cJSON_CreateArray(); + while ( list != 0 && *list != 0 && *list[0] != 0 ) + { + item = cJSON_CreateString(*list++); + cJSON_AddItemToArray(array,item); + } + return(array); +} + +uint64_t get_API_nxt64bits(cJSON *obj) +{ + uint64_t nxt64bits = 0; + struct destbuf tmp; + if ( obj != 0 ) + { + if ( cJSON_IsNumber(obj) != 0 ) + return((uint64_t)obj->valuedouble); + copy_cJSON(&tmp,obj); + nxt64bits = calc_nxt64bits(tmp.buf); + } + return(nxt64bits); +} +uint64_t j64bits(cJSON *json,char *field) { if ( field == 0 ) return(get_API_nxt64bits(json)); return(get_API_nxt64bits(cJSON_GetObjectItem(json,field))); } +uint64_t j64bitsi(cJSON *json,int32_t i) { return(get_API_nxt64bits(cJSON_GetArrayItem(json,i))); } + +uint64_t get_satoshi_obj(cJSON *json,char *field) +{ + int32_t i,n; + uint64_t prev,satoshis,mult = 1; + struct destbuf numstr,checkstr; + cJSON *numjson; + numjson = cJSON_GetObjectItem(json,field); + copy_cJSON(&numstr,numjson); + satoshis = prev = 0; mult = 1; n = (int32_t)strlen(numstr.buf); + for (i=n-1; i>=0; i--,mult*=10) + { + satoshis += (mult * (numstr.buf[i] - '0')); + if ( satoshis < prev ) + printf("get_satoshi_obj numstr.(%s) i.%d prev.%llu vs satoshis.%llu\n",numstr.buf,i,(unsigned long long)prev,(unsigned long long)satoshis); + prev = satoshis; + } + sprintf(checkstr.buf,"%llu",(long long)satoshis); + if ( strcmp(checkstr.buf,numstr.buf) != 0 ) + { + printf("SATOSHI GREMLIN?? numstr.(%s) -> %.8f -> (%s)\n",numstr.buf,dstr(satoshis),checkstr.buf); + } + return(satoshis); +} + +void add_satoshis_json(cJSON *json,char *field,uint64_t satoshis) +{ + cJSON *obj; + char numstr[64]; + sprintf(numstr,"%lld",(long long)satoshis); + obj = cJSON_CreateString(numstr); + cJSON_AddItemToObject(json,field,obj); + if ( satoshis != get_satoshi_obj(json,field) ) + printf("error adding satoshi obj %ld -> %ld\n",(unsigned long)satoshis,(unsigned long)get_satoshi_obj(json,field)); +} + +char *cJSON_str(cJSON *json) +{ + if ( json != 0 && cJSON_IsString(json) != 0 ) + return(json->valuestring); + return(0); +} + +void jadd(cJSON *json,char *field,cJSON *item) { if ( json != 0 )cJSON_AddItemToObject(json,field,item); } +void jaddstr(cJSON *json,char *field,char *str) { if ( json != 0 && str != 0 ) cJSON_AddItemToObject(json,field,cJSON_CreateString(str)); } +void jaddnum(cJSON *json,char *field,double num) { if ( json != 0 )cJSON_AddItemToObject(json,field,cJSON_CreateNumber(num)); } +void jadd64bits(cJSON *json,char *field,uint64_t nxt64bits) { char numstr[64]; sprintf(numstr,"%llu",(long long)nxt64bits), jaddstr(json,field,numstr); } +void jaddi(cJSON *json,cJSON *item) { if ( json != 0 ) cJSON_AddItemToArray(json,item); } +void jaddistr(cJSON *json,char *str) { if ( json != 0 ) cJSON_AddItemToArray(json,cJSON_CreateString(str)); } +void jaddinum(cJSON *json,double num) { if ( json != 0 ) cJSON_AddItemToArray(json,cJSON_CreateNumber(num)); } +void jaddi64bits(cJSON *json,uint64_t nxt64bits) { char numstr[64]; sprintf(numstr,"%llu",(long long)nxt64bits), jaddistr(json,numstr); } +char *jstr(cJSON *json,char *field) { if ( json == 0 ) return(0); if ( field == 0 ) return(cJSON_str(json)); return(cJSON_str(cJSON_GetObjectItem(json,field))); } + +char *jstri(cJSON *json,int32_t i) { return(cJSON_str(cJSON_GetArrayItem(json,i))); } +char *jprint(cJSON *json,int32_t freeflag) +{ + char *str; + /*static portable_mutex_t mutex; static int32_t initflag; + if ( initflag == 0 ) + { + portable_mutex_init(&mutex); + initflag = 1; + }*/ + if ( json == 0 ) + return(clonestr((char *)"{}")); + //portable_mutex_lock(&mutex); + //usleep(5000); + str = cJSON_Print(json), _stripwhite(str,' '); + if ( freeflag != 0 ) + free_json(json); + //portable_mutex_unlock(&mutex); + return(str); +} + +bits256 get_API_bits256(cJSON *obj) +{ + bits256 hash; char *str; + memset(hash.bytes,0,sizeof(hash)); + if ( obj != 0 ) + { + if ( cJSON_IsString(obj) != 0 && (str= obj->valuestring) != 0 && strlen(str) == 64 ) + decode_hex(hash.bytes,sizeof(hash),str); + } + return(hash); +} +bits256 jbits256(cJSON *json,char *field) { if ( field == 0 ) return(get_API_bits256(json)); return(get_API_bits256(cJSON_GetObjectItem(json,field))); } +bits256 jbits256i(cJSON *json,int32_t i) { return(get_API_bits256(cJSON_GetArrayItem(json,i))); } +void jaddbits256(cJSON *json,char *field,bits256 hash) { char str[65]; bits256_str(str,hash), jaddstr(json,field,str); } +void jaddibits256(cJSON *json,bits256 hash) { char str[65]; bits256_str(str,hash), jaddistr(json,str); } + +char *get_cJSON_fieldname(cJSON *obj) +{ + if ( obj != 0 ) + { + if ( obj->child != 0 && obj->child->string != 0 ) + return(obj->child->string); + else if ( obj->string != 0 ) + return(obj->string); + } + return((char *)""); +} + +int32_t jnum(cJSON *obj,char *field) +{ + char *str; int32_t polarity = 1; + if ( field != 0 ) + obj = jobj(obj,field); + if ( obj != 0 ) + { + if ( cJSON_IsNumber(obj) != 0 ) + return(obj->valuedouble); + else if ( cJSON_IsString(obj) != 0 && (str= jstr(obj,0)) != 0 ) + { + if ( str[0] == '-' ) + polarity = -1, str++; + return(polarity * (int32_t)calc_nxt64bits(str)); + } + } + return(0); +} + +void ensure_jsonitem(cJSON *json,char *field,char *value) +{ + cJSON *obj = cJSON_GetObjectItem(json,field); + if ( obj == 0 ) + cJSON_AddItemToObject(json,field,cJSON_CreateString(value)); + else cJSON_ReplaceItemInObject(json,field,cJSON_CreateString(value)); +} + +int32_t in_jsonarray(cJSON *array,char *value) +{ + int32_t i,n; + struct destbuf remote; + if ( array != 0 && cJSON_IsArray(array) != 0 ) + { + n = cJSON_GetArraySize(array); + for (i=0; i= range ) + x = (range - 1); + return((int32_t)x); +} + +int32_t get_API_int(cJSON *obj,int32_t val) +{ + struct destbuf buf; + if ( obj != 0 ) + { + if ( cJSON_IsNumber(obj) != 0 ) + return((int32_t)obj->valuedouble); + copy_cJSON(&buf,obj); + val = myatoi(buf.buf,0); + if ( val < 0 ) + val = 0; + } + return(val); +} + +int32_t jint(cJSON *json,char *field) { if ( json == 0 ) return(0); if ( field == 0 ) return(get_API_int(json,0)); return(get_API_int(cJSON_GetObjectItem(json,field),0)); } +int32_t jinti(cJSON *json,int32_t i) { if ( json == 0 ) return(0); return(get_API_int(cJSON_GetArrayItem(json,i),0)); } + +uint32_t get_API_uint(cJSON *obj,uint32_t val) +{ + struct destbuf buf; + if ( obj != 0 ) + { + if ( cJSON_IsNumber(obj) != 0 ) + return((uint32_t)obj->valuedouble); + copy_cJSON(&buf,obj); + val = myatoi(buf.buf,0); + } + return(val); +} +uint32_t juint(cJSON *json,char *field) { if ( json == 0 ) return(0); if ( field == 0 ) return(get_API_uint(json,0)); return(get_API_uint(cJSON_GetObjectItem(json,field),0)); } +uint32_t juinti(cJSON *json,int32_t i) { if ( json == 0 ) return(0); return(get_API_uint(cJSON_GetArrayItem(json,i),0)); } + +double get_API_float(cJSON *obj) +{ + double val = 0.; + struct destbuf buf; + if ( obj != 0 ) + { + if ( cJSON_IsNumber(obj) != 0 ) + return(obj->valuedouble); + copy_cJSON(&buf,obj); + val = atof(buf.buf); + } + return(val); +} + +double jdouble(cJSON *json,char *field) +{ + if ( json != 0 ) + { + if ( field == 0 ) + return(get_API_float(json)); + else return(get_API_float(cJSON_GetObjectItem(json,field))); + } else return(0.); +} + +double jdoublei(cJSON *json,int32_t i) +{ + if ( json != 0 ) + return(get_API_float(cJSON_GetArrayItem(json,i))); + else return(0.); +} + +cJSON *jobj(cJSON *json,char *field) { if ( json != 0 ) return(cJSON_GetObjectItem(json,field)); return(0); } + +void jdelete(cJSON *json,char *field) +{ + if ( jobj(json,field) != 0 ) + cJSON_DeleteItemFromObject(json,field); +} + +cJSON *jduplicate(cJSON *json) { return(cJSON_Duplicate(json,1)); } + +cJSON *jitem(cJSON *array,int32_t i) { if ( array != 0 && cJSON_IsArray(array) != 0 && cJSON_GetArraySize(array) > i ) return(cJSON_GetArrayItem(array,i)); return(0); } +cJSON *jarray(int32_t *nump,cJSON *json,char *field) +{ + cJSON *array; + if ( json != 0 ) + { + if ( field == 0 ) + array = json; + else array = cJSON_GetObjectItem(json,field); + if ( array != 0 && cJSON_IsArray(array) != 0 && (*nump= cJSON_GetArraySize(array)) > 0 ) + return(array); + } + *nump = 0; + return(0); +} + +int32_t expand_nxt64bits(char *NXTaddr,uint64_t nxt64bits) +{ + int32_t i,n; + uint64_t modval; + char rev[64]; + for (i=0; nxt64bits!=0; i++) + { + modval = nxt64bits % 10; + rev[i] = (char)(modval + '0'); + nxt64bits /= 10; + } + n = i; + for (i=0; i= 22 ) + { + printf("calc_nxt64bits: illegal NXTaddr.(%s) too long\n",NXTaddr); + return(0); + } + else if ( strcmp(NXTaddr,"0") == 0 || strcmp(NXTaddr,"false") == 0 ) + { + // printf("zero address?\n"); getchar(); + return(0); + } + if ( NXTaddr[0] == '-' ) + polarity = -1, NXTaddr++, n--; + mult = 1; + lastval = 0; + for (i=n-1; i>=0; i--,mult*=10) + { + c = NXTaddr[i]; + if ( c < '0' || c > '9' ) + { + printf("calc_nxt64bits: illegal char.(%c %d) in (%s).%d\n",c,c,NXTaddr,(int32_t)i); +#ifdef __APPLE__ + //while ( 1 ) + { + //sleep(60); + printf("calc_nxt64bits: illegal char.(%c %d) in (%s).%d\n",c,c,NXTaddr,(int32_t)i); + } +#endif + return(0); + } + nxt64bits += mult * (c - '0'); + if ( nxt64bits < lastval ) + printf("calc_nxt64bits: warning: 64bit overflow %llx < %llx\n",(long long)nxt64bits,(long long)lastval); + lastval = nxt64bits; + } + while ( *NXTaddr == '0' && *NXTaddr != 0 ) + NXTaddr++; + if ( cmp_nxt64bits(NXTaddr,nxt64bits) != 0 ) + printf("error calculating nxt64bits: %s -> %llx -> %s\n",NXTaddr,(long long)nxt64bits,nxt64str(nxt64bits)); + if ( polarity < 0 ) + return(-(int64_t)nxt64bits); + return(nxt64bits); +} + +cJSON *addrs_jsonarray(uint64_t *addrs,int32_t num) +{ + int32_t j; cJSON *array; + array = cJSON_CreateArray(); + for (j=0; j +#include +#include +#include +#include +#include +#include +#include "komodo_structs.h" + +#include "cJSON.h" + +//#include "../crypto777/OS_portable.h" + +#define MAX_JSON_FIELD 4096 // on the big side + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Macros for creating things quickly. */ +#define cJSON_AddNullToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateNull()) +#define cJSON_AddTrueToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateTrue()) +#define cJSON_AddFalseToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateFalse()) +#define cJSON_AddBoolToObject(object,name,b) cJSON_AddItemToObject(object, name, cJSON_CreateBool(b)) +#define cJSON_AddNumberToObject(object,name,n) cJSON_AddItemToObject(object, name, cJSON_CreateNumber(n)) +#define cJSON_AddStringToObject(object,name,s) cJSON_AddItemToObject(object, name, cJSON_CreateString(s)) + + struct destbuf { char buf[MAX_JSON_FIELD]; }; + +#define jfieldstr get_cJSON_fieldname + + char *cJSON_str(cJSON *json); + char *jstr(cJSON *json,char *field); + char *jprint(cJSON *json,int32_t freeflag); + int32_t jint(cJSON *json,char *field); + uint32_t juint(cJSON *json,char *field); + char *jstri(cJSON *json,int32_t i); + int32_t jinti(cJSON *json,int32_t i); + uint32_t juinti(cJSON *json,int32_t i); + uint64_t j64bitsi(cJSON *json,int32_t i); + double jdoublei(cJSON *json,int32_t i); + double jdouble(cJSON *json,char *field); + cJSON *jobj(cJSON *json,char *field); + cJSON *jarray(int32_t *nump,cJSON *json,char *field); + cJSON *jitem(cJSON *array,int32_t i); + uint64_t j64bits(cJSON *json,char *field); + void jadd(cJSON *json,char *field,cJSON *item); + void jaddstr(cJSON *json,char *field,char *str); + void jaddnum(cJSON *json,char *field,double num); + void jadd64bits(cJSON *json,char *field,uint64_t nxt64bits); + void jaddi(cJSON *json,cJSON *item); + void jaddistr(cJSON *json,char *str); + void jaddinum(cJSON *json,double num); + void jaddi64bits(cJSON *json,uint64_t nxt64bits); + void jdelete(cJSON *object,char *string); + cJSON *jduplicate(cJSON *json); + int32_t jnum(cJSON *obj,char *field); + + bits256 jbits256(cJSON *json,char *field); + bits256 jbits256i(cJSON *json,int32_t i); + void jaddbits256(cJSON *json,char *field,bits256 hash); + void jaddibits256(cJSON *json,bits256 hash); + void copy_cJSON(struct destbuf *dest,cJSON *obj); + void copy_cJSON2(char *dest,int32_t maxlen,cJSON *obj); + cJSON *gen_list_json(char **list); + int32_t extract_cJSON_str(char *dest,int32_t max,cJSON *json,char *field); + + void free_json(cJSON *json); + int64_t _conv_cJSON_float(cJSON *json); + int64_t conv_cJSON_float(cJSON *json,char *field); + int64_t get_cJSON_int(cJSON *json,char *field); + void add_satoshis_json(cJSON *json,char *field,uint64_t satoshis); + uint64_t get_satoshi_obj(cJSON *json,char *field); + + int32_t get_API_int(cJSON *obj,int32_t val); + uint32_t get_API_uint(cJSON *obj,uint32_t val); + uint64_t get_API_nxt64bits(cJSON *obj); + double get_API_float(cJSON *obj); + char *get_cJSON_fieldname(cJSON *obj); + void ensure_jsonitem(cJSON *json,char *field,char *value); + int32_t in_jsonarray(cJSON *array,char *value); + char *bitcoind_RPC(char **retstrp,char *debugstr,char *url,char *userpass,char *command,char *params); + uint64_t calc_nxt64bits(const char *str); + int32_t expand_nxt64bits(char *str,uint64_t nxt64bits); + char *nxt64str(uint64_t nxt64bits); + char *nxt64str2(uint64_t nxt64bits); + cJSON *addrs_jsonarray(uint64_t *addrs,int32_t num); + int32_t myatoi(char *str,int32_t range); + + char *stringifyM(char *str); +#define replace_backslashquotes unstringify + char *unstringify(char *str); +#define jtrue cJSON_CreateTrue +#define jfalse cJSON_CreateFalse + +#define jfieldname get_cJSON_fieldname + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index f0bfecc9c..baafc6dbe 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -141,7 +141,7 @@ int32_t Jumblr_depositaddradd(char *depositaddr) // external { if ( (retjson= cJSON_Parse(retstr)) != 0 ) { - if ( (ismine= jobj(retjson,(char *)"ismine")) != 0 && is_cJSON_True(ismine) != 0 ) + if ( (ismine= jobj(retjson,(char *)"ismine")) != 0 && cJSON_IsTrue(ismine) != 0 ) { retval = 0; safecopy(Jumblr_deposit,depositaddr,sizeof(Jumblr_deposit)); @@ -149,7 +149,7 @@ int32_t Jumblr_depositaddradd(char *depositaddr) // external else { retval = JUMBLR_ERROR_NOTINWALLET; - printf("%s not in wallet: ismine.%p %d %s\n",depositaddr,ismine,is_cJSON_True(ismine),jprint(retjson,0)); + printf("%s not in wallet: ismine.%p %d %s\n",depositaddr,ismine,cJSON_IsTrue(ismine),jprint(retjson,0)); } free_json(retjson); } @@ -366,7 +366,7 @@ int64_t jumblr_balance(char *addr) //printf("jumblr.[%s].(%s)\n","KMD",retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { - if ( (n= cJSON_GetArraySize(retjson)) > 0 && is_cJSON_Array(retjson) != 0 ) + if ( (n= cJSON_GetArraySize(retjson)) > 0 && cJSON_IsArray(retjson) != 0 ) for (i=0; i 0 && is_cJSON_Array(array) != 0 ) + if ( (n= cJSON_GetArraySize(array)) > 0 && cJSON_IsArray(array) != 0 ) { //printf("%s -> n%d\n",retstr,n); for (i=0; i 0 && is_cJSON_Array(array) != 0 ) + if ( (n= cJSON_GetArraySize(array)) > 0 && cJSON_IsArray(array) != 0 ) { for (i=0; i Date: Sun, 22 Oct 2017 23:27:44 -0700 Subject: [PATCH 0263/1062] function to create a cryptocondition from a Univalue --- configure.ac | 2 +- src/rpccryptoconditions.cpp | 21 +++++++++++++-------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/configure.ac b/configure.ac index c471bab89..9f8f1900f 100644 --- a/configure.ac +++ b/configure.ac @@ -996,7 +996,7 @@ unset PKG_CONFIG_LIBDIR PKG_CONFIG_LIBDIR="$PKGCONFIG_LIBDIR_TEMP" ac_configure_args="${ac_configure_args} --disable-shared --with-pic --with-bignum=no" -AC_CONFIG_SUBDIRS([src/secp256k1 src/univalue]) +AC_CONFIG_SUBDIRS([src/secp256k1 src/univalue src/cryptoconditions]) AC_OUTPUT diff --git a/src/rpccryptoconditions.cpp b/src/rpccryptoconditions.cpp index 946667aae..e297ed4e4 100644 --- a/src/rpccryptoconditions.cpp +++ b/src/rpccryptoconditions.cpp @@ -375,6 +375,14 @@ UniValue verifytxoutproofcc(const UniValue& params, bool fHelp) return res; } +CC *ConditionFromValue(const UniValue& condition) { + std::string encoded = condition.write(); + char *err = new char[1000]; + CC *cond = cc_conditionFromJSONString(encoded.c_str(), err); + if (NULL == cond) + throw JSONRPCError(RPC_INVALID_PARAMETER, err); +} + UniValue createrawtransactioncc(const UniValue& params, bool fHelp) { if (fHelp || params.size() != 2) @@ -409,7 +417,7 @@ UniValue createrawtransactioncc(const UniValue& params, bool fHelp) ); LOCK(cs_main); - RPCTypeCheck(params, boost::assign::list_of(UniValue::VARR)(UniValue::VARR)); + //RPCTypeCheck(params, boost::assign::list_of(UniValue::VARR)(UniValue::VARR)); UniValue inputs = params[0].get_array(); UniValue outputs = params[1].get_array(); @@ -429,6 +437,9 @@ UniValue createrawtransactioncc(const UniValue& params, bool fHelp) if (nOutput < 0) throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, vout must be positive"); + CC *cond = ConditionFromValue(find_value(output, "condition")); + char *ffillBin = new char[1024*1024]; + CTxIn in(COutPoint(txid, nOutput)); rawTx.vin.push_back(in); } @@ -436,13 +447,7 @@ UniValue createrawtransactioncc(const UniValue& params, bool fHelp) for (size_t idx = 0; idx < outputs.size(); idx++) { const UniValue& output = outputs[idx].get_obj(); - const UniValue& condition = find_value(output, "condition"); - std::string encoded = condition.write(); - fprintf(stderr, "%s\n", encoded.c_str()); - char *err = new char[1000]; - CC *cond = cc_conditionFromJSONString(encoded.c_str(), err); - if (NULL == cond) - throw JSONRPCError(RPC_INVALID_PARAMETER, err); + CC *cond = ConditionFromValue(find_value(output, "condition")); char *condBin = new char[1000]; size_t binLength = cc_conditionBinary(cond, condBin); std::vector condVec(condBin, condBin + binLength); From d3c8109b410e3538c6d85c13c01b8c7df8142980 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Barbosa?= Date: Tue, 8 Aug 2017 13:30:04 +0100 Subject: [PATCH 0264/1062] Improve shutdown process Zcash: cherry-picked from commit 793667af1c31835e0eefcdd283930bb89cfeda8f --- src/httpserver.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/httpserver.cpp b/src/httpserver.cpp index e2a6af6ad..a1f27fc0d 100644 --- a/src/httpserver.cpp +++ b/src/httpserver.cpp @@ -479,6 +479,8 @@ void StopHTTPServer() } if (eventBase) { LogPrint("http", "Waiting for HTTP event thread to exit\n"); + // Exit the event loop as soon as there are no active events. + event_base_loopexit(eventBase, nullptr); // Give event loop a few seconds to exit (to send back last RPC responses), then break it // Before this was solved with event_base_loopexit, but that didn't work as expected in // at least libevent 2.0.21 and always introduced a delay. In libevent From a20b975a524c3a40c9c1b66e9b73fb14e32d189f Mon Sep 17 00:00:00 2001 From: Duke Leto Date: Tue, 24 Oct 2017 14:50:26 -0700 Subject: [PATCH 0265/1062] Update performance-measurements.sh Fix error message, as per @daira --- qa/zcash/performance-measurements.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qa/zcash/performance-measurements.sh b/qa/zcash/performance-measurements.sh index fd7b30ffa..76f41c0ab 100755 --- a/qa/zcash/performance-measurements.sh +++ b/qa/zcash/performance-measurements.sh @@ -157,7 +157,7 @@ EOF if [ $# -lt 2 ] then - echo "$0 : two arguments are required!" + echo "$0 : At least two arguments are required!" exit 1 fi From c2d3bafeaa19c7a4913adac3255ed780a50ffe11 Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 26 Oct 2017 11:29:36 -0700 Subject: [PATCH 0266/1062] Closes #2639. z_shieldcoinbase is now supported, no longer experimental. This reverts commit 5023af7bd5fc8c147e6fd111b610bd8922e91131. --- qa/rpc-tests/wallet_shieldcoinbase.py | 4 ++-- src/init.cpp | 2 -- src/wallet/rpcwallet.cpp | 11 ----------- 3 files changed, 2 insertions(+), 15 deletions(-) diff --git a/qa/rpc-tests/wallet_shieldcoinbase.py b/qa/rpc-tests/wallet_shieldcoinbase.py index 599663390..d0e4bb122 100755 --- a/qa/rpc-tests/wallet_shieldcoinbase.py +++ b/qa/rpc-tests/wallet_shieldcoinbase.py @@ -18,11 +18,11 @@ class WalletShieldCoinbaseTest (BitcoinTestFramework): initialize_chain_clean(self.options.tmpdir, 4) def setup_network(self, split=False): - args = ['-regtestprotectcoinbase', '-debug=zrpcunsafe', '-experimentalfeatures', '-zshieldcoinbase'] + args = ['-regtestprotectcoinbase', '-debug=zrpcunsafe'] self.nodes = [] self.nodes.append(start_node(0, self.options.tmpdir, args)) self.nodes.append(start_node(1, self.options.tmpdir, args)) - args2 = ['-regtestprotectcoinbase', '-debug=zrpcunsafe', '-experimentalfeatures', '-zshieldcoinbase', "-mempooltxinputlimit=7"] + args2 = ['-regtestprotectcoinbase', '-debug=zrpcunsafe', "-mempooltxinputlimit=7"] self.nodes.append(start_node(2, self.options.tmpdir, args2)) connect_nodes_bi(self.nodes,0,1) connect_nodes_bi(self.nodes,1,2) diff --git a/src/init.cpp b/src/init.cpp index 6f87917a0..59a59524d 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -790,8 +790,6 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) if (!fExperimentalMode) { if (mapArgs.count("-developerencryptwallet")) { return InitError(_("Wallet encryption requires -experimentalfeatures.")); - } else if (mapArgs.count("-zshieldcoinbase")) { - return InitError(_("RPC call z_shieldcoinbase requires -experimentalfeatures.")); } } diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index bac5dc871..6738ec5d8 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -3527,16 +3527,9 @@ UniValue z_shieldcoinbase(const UniValue& params, bool fHelp) if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - bool fEnableShieldCoinbase = fExperimentalMode && GetBoolArg("-zshieldcoinbase", false); - std::string strDisabledMsg = ""; - if (!fEnableShieldCoinbase) { - strDisabledMsg = "\nWARNING: z_shieldcoinbase is DISABLED but can be enabled as an experimental feature.\n"; - } - if (fHelp || params.size() < 2 || params.size() > 3) throw runtime_error( "z_shieldcoinbase \"fromaddress\" \"tozaddress\" ( fee )\n" - + strDisabledMsg + "\nShield transparent coinbase funds by sending to a shielded zaddr. This is an asynchronous operation and utxos" "\nselected for shielding will be locked. If there is an error, they are unlocked. The RPC call `listlockunspent`" "\ncan be used to return a list of locked utxos. The number of coinbase utxos selected for shielding is limited by" @@ -3558,10 +3551,6 @@ UniValue z_shieldcoinbase(const UniValue& params, bool fHelp) "}\n" ); - if (!fEnableShieldCoinbase) { - throw JSONRPCError(RPC_WALLET_ERROR, "Error: z_shieldcoinbase is disabled."); - } - LOCK2(cs_main, pwalletMain->cs_wallet); // Validate the from address From cf72e8e06eb009f91dac39c30bd1aef9d52785d6 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 30 Oct 2017 11:58:37 -0700 Subject: [PATCH 0267/1062] Closes #2263 fixing broken pipe error. --- qa/rpc-tests/wallet_protectcoinbase.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/qa/rpc-tests/wallet_protectcoinbase.py b/qa/rpc-tests/wallet_protectcoinbase.py index bebe8b9b5..e407f0914 100755 --- a/qa/rpc-tests/wallet_protectcoinbase.py +++ b/qa/rpc-tests/wallet_protectcoinbase.py @@ -11,6 +11,7 @@ from test_framework.util import assert_equal, initialize_chain_clean, \ import sys import time +import timeit from decimal import Decimal class WalletProtectCoinbaseTest (BitcoinTestFramework): @@ -244,9 +245,22 @@ class WalletProtectCoinbaseTest (BitcoinTestFramework): amount_per_recipient = Decimal('0.00000546') # dust threshold # Note that regtest chainparams does not require standard tx, so setting the amount to be # less than the dust threshold, e.g. 0.00000001 will not result in mempool rejection. + start_time = timeit.default_timer() for i in xrange(0,num_t_recipients): newtaddr = self.nodes[2].getnewaddress() recipients.append({"address":newtaddr, "amount":amount_per_recipient}) + elapsed = timeit.default_timer() - start_time + print("...invoked getnewaddress() {} times in {} seconds".format(num_t_recipients, elapsed)) + + # Issue #2263 Workaround START + # HTTP connection to node 0 may fall into a state, during the few minutes it takes to process + # loop above to create new addresses, that when z_sendmany is called with a large amount of + # rpc data in recipients, the connection fails with a 'broken pipe' error. Making a RPC call + # to node 0 before calling z_sendmany appears to fix this issue, perhaps putting the HTTP + # connection into a good state to handle a large amount of data in recipients. + self.nodes[0].getinfo() + # Issue #2263 Workaround END + myopid = self.nodes[0].z_sendmany(myzaddr, recipients) try: self.wait_and_assert_operationid_status(myopid) From 35e12d992acf15123dcfa16f2e5fba39bb87e4ce Mon Sep 17 00:00:00 2001 From: kozyilmaz Date: Tue, 31 Oct 2017 15:14:21 +0300 Subject: [PATCH 0268/1062] empty spaces in PATH variable cause build failure --- depends/funcs.mk | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/depends/funcs.mk b/depends/funcs.mk index e1aeb026a..df305a74a 100644 --- a/depends/funcs.mk +++ b/depends/funcs.mk @@ -129,9 +129,9 @@ $(1)_config_env+=$($(1)_config_env_$(host_arch)_$(host_os)) $($(1)_config_env_$( $(1)_config_env+=PKG_CONFIG_LIBDIR=$($($(1)_type)_prefix)/lib/pkgconfig $(1)_config_env+=PKG_CONFIG_PATH=$($($(1)_type)_prefix)/share/pkgconfig -$(1)_config_env+=PATH=$(build_prefix)/bin:$(PATH) -$(1)_build_env+=PATH=$(build_prefix)/bin:$(PATH) -$(1)_stage_env+=PATH=$(build_prefix)/bin:$(PATH) +$(1)_config_env+=PATH="$(build_prefix)/bin:$(PATH)" +$(1)_build_env+=PATH="$(build_prefix)/bin:$(PATH)" +$(1)_stage_env+=PATH="$(build_prefix)/bin:$(PATH)" $(1)_autoconf=./configure --host=$($($(1)_type)_host) --disable-dependency-tracking --prefix=$($($(1)_type)_prefix) $$($(1)_config_opts) CC="$$($(1)_cc)" CXX="$$($(1)_cxx)" ifneq ($($(1)_nm),) From abf4af12dfaf81dafe206e7ecf3b22b7dff9241a Mon Sep 17 00:00:00 2001 From: Sean Bowe Date: Tue, 25 Apr 2017 09:41:03 -0600 Subject: [PATCH 0269/1062] Refactor proof generation function. --- .../r1cs_ppzksnark/r1cs_ppzksnark.tcc | 134 ++++++++++++------ 1 file changed, 94 insertions(+), 40 deletions(-) diff --git a/src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.tcc b/src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.tcc index aeb2bbb85..697395931 100644 --- a/src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.tcc +++ b/src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.tcc @@ -431,6 +431,92 @@ r1cs_ppzksnark_keypair r1cs_ppzksnark_generator( return r1cs_ppzksnark_keypair(std::move(pk), std::move(vk)); } +template +knowledge_commitment r1cs_compute_proof_kc(const qap_witness > &qap_wit, + const knowledge_commitment_vector &kcv, + const Fr &zk_shift) +{ + knowledge_commitment returnval = kcv[0] + (zk_shift * kcv[qap_wit.num_variables()+1]); + +#ifdef DEBUG + assert(kcv.domain_size() == qap_wit.num_variables()+2); +#endif + +#ifdef MULTICORE + const size_t chunks = omp_get_max_threads(); // to override, set OMP_NUM_THREADS env var or call omp_set_num_threads() +#else + const size_t chunks = 1; +#endif + + returnval = returnval + kc_multi_exp_with_mixed_addition >( + kcv, + 1, + 1 + qap_wit.num_variables(), + qap_wit.coefficients_for_ABCs.begin(), + qap_wit.coefficients_for_ABCs.begin()+qap_wit.num_variables(), + chunks, + true + ); + + return returnval; +} + + + +template +G1 r1cs_compute_proof_K(const qap_witness> &qap_wit, const G1_vector &K_query, const G1 &zk_shift) +{ +#ifdef DEBUG + assert(K_query.size() == qap_wit.num_variables()+4); +#endif + +#ifdef MULTICORE + const size_t chunks = omp_get_max_threads(); // to override, set OMP_NUM_THREADS env var or call omp_set_num_threads() +#else + const size_t chunks = 1; +#endif + + G1 g_K = K_query[0] + zk_shift; + g_K = g_K + multi_exp_with_mixed_addition, Fr >( + K_query.begin()+1, + K_query.begin()+1+qap_wit.num_variables(), + qap_wit.coefficients_for_ABCs.begin(), + qap_wit.coefficients_for_ABCs.begin()+qap_wit.num_variables(), + chunks, + true + ); + + return g_K; +} + + +template +G1 r1cs_compute_proof_H(const qap_witness > &qap_wit, const G1_vector &H_query) +{ + G1 g_H = G1::zero(); + +#ifdef DEBUG + assert(H_query.size() == qap_wit.degree()+1); +#endif + +#ifdef MULTICORE + const size_t chunks = omp_get_max_threads(); // to override, set OMP_NUM_THREADS env var or call omp_set_num_threads() +#else + const size_t chunks = 1; +#endif + + g_H = g_H + multi_exp, Fr >( + H_query.begin(), + H_query.begin()+qap_wit.degree()+1, + qap_wit.coefficients_for_H.begin(), + qap_wit.coefficients_for_H.begin()+qap_wit.degree()+1, + chunks, + true + ); + + return g_H; +} + template r1cs_ppzksnark_proof r1cs_ppzksnark_prover(const r1cs_ppzksnark_proving_key &pk, const r1cs_ppzksnark_primary_input &primary_input, @@ -457,67 +543,36 @@ r1cs_ppzksnark_proof r1cs_ppzksnark_prover(const r1cs_ppzksnark_proving_key assert(qap_inst.is_satisfied(qap_wit)); #endif - knowledge_commitment, G1 > g_A = pk.A_query[0] + qap_wit.d1*pk.A_query[qap_wit.num_variables()+1]; - knowledge_commitment, G1 > g_B = pk.B_query[0] + qap_wit.d2*pk.B_query[qap_wit.num_variables()+1]; - knowledge_commitment, G1 > g_C = pk.C_query[0] + qap_wit.d3*pk.C_query[qap_wit.num_variables()+1]; - - G1 g_H = G1::zero(); - G1 g_K = (pk.K_query[0] + - qap_wit.d1*pk.K_query[qap_wit.num_variables()+1] + - qap_wit.d2*pk.K_query[qap_wit.num_variables()+2] + - qap_wit.d3*pk.K_query[qap_wit.num_variables()+3]); - #ifdef DEBUG for (size_t i = 0; i < qap_wit.num_inputs() + 1; ++i) { assert(pk.A_query[i].g == G1::zero()); } - assert(pk.A_query.domain_size() == qap_wit.num_variables()+2); - assert(pk.B_query.domain_size() == qap_wit.num_variables()+2); - assert(pk.C_query.domain_size() == qap_wit.num_variables()+2); - assert(pk.H_query.size() == qap_wit.degree()+1); - assert(pk.K_query.size() == qap_wit.num_variables()+4); -#endif - -#ifdef MULTICORE - const size_t chunks = omp_get_max_threads(); // to override, set OMP_NUM_THREADS env var or call omp_set_num_threads() -#else - const size_t chunks = 1; #endif enter_block("Compute the proof"); enter_block("Compute answer to A-query", false); - g_A = g_A + kc_multi_exp_with_mixed_addition, G1, Fr >(pk.A_query, - 1, 1+qap_wit.num_variables(), - qap_wit.coefficients_for_ABCs.begin(), qap_wit.coefficients_for_ABCs.begin()+qap_wit.num_variables(), - chunks, true); + auto g_A = r1cs_compute_proof_kc, G1 >(qap_wit, pk.A_query, qap_wit.d1); leave_block("Compute answer to A-query", false); enter_block("Compute answer to B-query", false); - g_B = g_B + kc_multi_exp_with_mixed_addition, G1, Fr >(pk.B_query, - 1, 1+qap_wit.num_variables(), - qap_wit.coefficients_for_ABCs.begin(), qap_wit.coefficients_for_ABCs.begin()+qap_wit.num_variables(), - chunks, true); + auto g_B = r1cs_compute_proof_kc, G1 >(qap_wit, pk.B_query, qap_wit.d2); leave_block("Compute answer to B-query", false); enter_block("Compute answer to C-query", false); - g_C = g_C + kc_multi_exp_with_mixed_addition, G1, Fr >(pk.C_query, - 1, 1+qap_wit.num_variables(), - qap_wit.coefficients_for_ABCs.begin(), qap_wit.coefficients_for_ABCs.begin()+qap_wit.num_variables(), - chunks, true); + auto g_C = r1cs_compute_proof_kc, G1 >(qap_wit, pk.C_query, qap_wit.d3); leave_block("Compute answer to C-query", false); enter_block("Compute answer to H-query", false); - g_H = g_H + multi_exp, Fr >(pk.H_query.begin(), pk.H_query.begin()+qap_wit.degree()+1, - qap_wit.coefficients_for_H.begin(), qap_wit.coefficients_for_H.begin()+qap_wit.degree()+1, - chunks, true); + auto g_H = r1cs_compute_proof_H(qap_wit, pk.H_query); leave_block("Compute answer to H-query", false); enter_block("Compute answer to K-query", false); - g_K = g_K + multi_exp_with_mixed_addition, Fr >(pk.K_query.begin()+1, pk.K_query.begin()+1+qap_wit.num_variables(), - qap_wit.coefficients_for_ABCs.begin(), qap_wit.coefficients_for_ABCs.begin()+qap_wit.num_variables(), - chunks, true); + G1 zk_shift = qap_wit.d1*pk.K_query[qap_wit.num_variables()+1] + + qap_wit.d2*pk.K_query[qap_wit.num_variables()+2] + + qap_wit.d3*pk.K_query[qap_wit.num_variables()+3]; + G1 g_K = r1cs_compute_proof_K(qap_wit, pk.K_query, zk_shift); leave_block("Compute answer to K-query", false); leave_block("Compute the proof"); @@ -525,7 +580,6 @@ r1cs_ppzksnark_proof r1cs_ppzksnark_prover(const r1cs_ppzksnark_proving_key leave_block("Call to r1cs_ppzksnark_prover"); r1cs_ppzksnark_proof proof = r1cs_ppzksnark_proof(std::move(g_A), std::move(g_B), std::move(g_C), std::move(g_H), std::move(g_K)); - //proof.print_size(); return proof; } From c8a7f74753300842f0211339633aee007b3d3349 Mon Sep 17 00:00:00 2001 From: Sean Bowe Date: Tue, 25 Apr 2017 09:51:07 -0600 Subject: [PATCH 0270/1062] Add streaming prover. --- .../r1cs_ppzksnark/r1cs_ppzksnark.hpp | 6 ++ .../r1cs_ppzksnark/r1cs_ppzksnark.tcc | 70 +++++++++++++++++++ 2 files changed, 76 insertions(+) diff --git a/src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.hpp b/src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.hpp index 36f6c1499..96bc36504 100644 --- a/src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.hpp +++ b/src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.hpp @@ -397,6 +397,12 @@ r1cs_ppzksnark_proof r1cs_ppzksnark_prover(const r1cs_ppzksnark_proving_key const r1cs_ppzksnark_auxiliary_input &auxiliary_input, const r1cs_ppzksnark_constraint_system &constraint_system); +template +r1cs_ppzksnark_proof r1cs_ppzksnark_prover_streaming(std::ifstream &proving_key_file, + const r1cs_ppzksnark_primary_input &primary_input, + const r1cs_ppzksnark_auxiliary_input &auxiliary_input, + const r1cs_ppzksnark_constraint_system &constraint_system); + /* Below are four variants of verifier algorithm for the R1CS ppzkSNARK. diff --git a/src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.tcc b/src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.tcc index 697395931..84db9fc1a 100644 --- a/src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.tcc +++ b/src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.tcc @@ -584,6 +584,76 @@ r1cs_ppzksnark_proof r1cs_ppzksnark_prover(const r1cs_ppzksnark_proving_key return proof; } +template +r1cs_ppzksnark_proof r1cs_ppzksnark_prover_streaming(std::ifstream &proving_key_file, + const r1cs_ppzksnark_primary_input &primary_input, + const r1cs_ppzksnark_auxiliary_input &auxiliary_input, + const r1cs_ppzksnark_constraint_system &constraint_system) +{ + enter_block("Call to r1cs_ppzksnark_prover_streaming"); + + const Fr d1 = Fr::random_element(), + d2 = Fr::random_element(), + d3 = Fr::random_element(); + + enter_block("Compute the polynomial H"); + const qap_witness > qap_wit = r1cs_to_qap_witness_map(constraint_system, primary_input, auxiliary_input, d1, d2, d3); + leave_block("Compute the polynomial H"); + + enter_block("Compute the proof"); + + r1cs_ppzksnark_proof proof; + + enter_block("Compute answer to A-query", false); + { + knowledge_commitment_vector, G1 > A_query; + proving_key_file >> A_query; + proof.g_A = r1cs_compute_proof_kc, G1 >(qap_wit, A_query, qap_wit.d1); + } + leave_block("Compute answer to A-query", false); + + enter_block("Compute answer to B-query", false); + { + knowledge_commitment_vector, G1 > B_query; + proving_key_file >> B_query; + proof.g_B = r1cs_compute_proof_kc, G1 >(qap_wit, B_query, qap_wit.d2); + } + leave_block("Compute answer to B-query", false); + + enter_block("Compute answer to C-query", false); + { + knowledge_commitment_vector, G1 > C_query; + proving_key_file >> C_query; + proof.g_C = r1cs_compute_proof_kc, G1 >(qap_wit, C_query, qap_wit.d3); + } + leave_block("Compute answer to C-query", false); + + enter_block("Compute answer to H-query", false); + { + G1_vector H_query; + proving_key_file >> H_query; + proof.g_H = r1cs_compute_proof_H(qap_wit, H_query); + } + leave_block("Compute answer to H-query", false); + + enter_block("Compute answer to K-query", false); + { + G1_vector K_query; + proving_key_file >> K_query; + G1 zk_shift = qap_wit.d1*K_query[qap_wit.num_variables()+1] + + qap_wit.d2*K_query[qap_wit.num_variables()+2] + + qap_wit.d3*K_query[qap_wit.num_variables()+3]; + proof.g_K = r1cs_compute_proof_K(qap_wit, K_query, zk_shift); + } + leave_block("Compute answer to K-query", false); + + leave_block("Compute the proof"); + + leave_block("Call to r1cs_ppzksnark_prover_streaming"); + + return proof; +} + template r1cs_ppzksnark_processed_verification_key r1cs_ppzksnark_verifier_process_vk(const r1cs_ppzksnark_verification_key &vk) { From 394f41853bfe51c980176fd93ab20e9330a785e5 Mon Sep 17 00:00:00 2001 From: Sean Bowe Date: Tue, 25 Apr 2017 09:57:40 -0600 Subject: [PATCH 0271/1062] Integrate low memory prover. --- src/zcash/JoinSplit.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/zcash/JoinSplit.cpp b/src/zcash/JoinSplit.cpp index c7b468f89..409d3c89b 100644 --- a/src/zcash/JoinSplit.cpp +++ b/src/zcash/JoinSplit.cpp @@ -293,11 +293,14 @@ public: // estimate that it doesn't matter if we check every time. pb.constraint_system.swap_AB_if_beneficial(); - r1cs_ppzksnark_proving_key pk; - loadFromFile(pkPath, pk); + std::ifstream fh(pkPath, std::ios::binary); - return ZCProof(r1cs_ppzksnark_prover( - pk, + if(!fh.is_open()) { + throw std::runtime_error((boost::format("could not load param file at %s") % pkPath).str()); + } + + return ZCProof(r1cs_ppzksnark_prover_streaming( + fh, primary_input, aux_input, pb.constraint_system From 4305a56221dbf97c0f8ef4870370995f70b5f1d7 Mon Sep 17 00:00:00 2001 From: Ariel Gabizon Date: Tue, 24 Oct 2017 13:27:59 +0300 Subject: [PATCH 0272/1062] boost::format -> tinyformat --- src/zcash/JoinSplit.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/zcash/JoinSplit.cpp b/src/zcash/JoinSplit.cpp index 409d3c89b..d71dbd0ee 100644 --- a/src/zcash/JoinSplit.cpp +++ b/src/zcash/JoinSplit.cpp @@ -14,7 +14,7 @@ #include "libsnark/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.hpp" #include "libsnark/gadgetlib1/gadgets/hashes/sha256/sha256_gadget.hpp" #include "libsnark/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_read_gadget.hpp" - +#include "tinyformat.h" #include "sync.h" #include "amount.h" @@ -49,7 +49,7 @@ void loadFromFile(const std::string path, T& objIn) { std::ifstream fh(path, std::ios::binary); if(!fh.is_open()) { - throw std::runtime_error((boost::format("could not load param file at %s") % path).str()); + throw std::runtime_error(strprintf("could not load param file at %s", path)); } ss << fh.rdbuf(); @@ -296,7 +296,7 @@ public: std::ifstream fh(pkPath, std::ios::binary); if(!fh.is_open()) { - throw std::runtime_error((boost::format("could not load param file at %s") % pkPath).str()); + throw std::runtime_error(strprintf("could not load param file at %s", pkPath)); } return ZCProof(r1cs_ppzksnark_prover_streaming( From 1051242926d6a972af6815c8ff79d05db6799c98 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 31 Oct 2017 20:31:40 -0700 Subject: [PATCH 0273/1062] Closes #2576. Update link to security info on z.cash website. --- README.md | 4 ++-- src/util.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 769d08e77..3d7501482 100644 --- a/README.md +++ b/README.md @@ -18,8 +18,8 @@ blockchain has reached a significant size. Security Warnings ----------------- -See important security warnings in -[doc/security-warnings.md](doc/security-warnings.md). +See important security warnings on the +[Security Information page](https://z.cash/support/security/). **Zcash is experimental and a work-in-progress.** Use at your own risk. diff --git a/src/util.cpp b/src/util.cpp index 6ecb9af7c..cc8632c6a 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -892,7 +892,7 @@ std::string PrivacyInfo() { return "\n" + FormatParagraph(strprintf(_("In order to ensure you are adequately protecting your privacy when using Zcash, please see <%s>."), - "https://z.cash/support/security/index.html")) + "\n"; + "https://z.cash/support/security/")) + "\n"; } std::string LicenseInfo() From c5dabd2b66af89a7418658b82fbb12c2dcbf5257 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 1 Nov 2017 10:40:24 -0700 Subject: [PATCH 0274/1062] Closes #2639. Adds optional limit parameter with a default value of 50. The new parameter is to satisfy the principle of least astonishment by providing a sensible default for the maximum number of transparent inputs to shield. If users do not configure -mempooltxinputlimit it is possible for them to create transactions with hundreds of inputs which suffer from mining delay, due to the current state of the network where some miners have configured -mempooltxinputlimit as a way to deal with the problem of quadratic hashing. --- doc/payment-api.md | 2 +- qa/rpc-tests/wallet_shieldcoinbase.py | 40 +++++++++++++++++++++++++-- src/rpcclient.cpp | 1 + src/test/rpc_wallet_tests.cpp | 9 +++++- src/wallet/rpcwallet.cpp | 23 +++++++++++---- 5 files changed, 65 insertions(+), 10 deletions(-) diff --git a/doc/payment-api.md b/doc/payment-api.md index 803a0dc97..1582255bb 100644 --- a/doc/payment-api.md +++ b/doc/payment-api.md @@ -72,7 +72,7 @@ Command | Parameters | Description --- | --- | --- z_listreceivedbyaddress
| zaddr [minconf=1] | Return a list of amounts received by a zaddr belonging to the node’s wallet.

Optionally set the minimum number of confirmations which a received amount must have in order to be included in the result. Use 0 to count unconfirmed transactions.

Output:
[{
“txid”: “4a0f…”,
“amount”: 0.54,
“memo”:”F0FF…”,}, {...}, {...}
] z_sendmany
| fromaddress amounts [minconf=1] [fee=0.0001] | _This is an Asynchronous RPC call_

Send funds from an address to multiple outputs. The address can be either a taddr or a zaddr.

Amounts is a list containing key/value pairs corresponding to the addresses and amount to pay. Each output address can be in taddr or zaddr format.

When sending to a zaddr, you also have the option of attaching a memo in hexadecimal format.

**NOTE:**When sending coinbase funds to a zaddr, the node's wallet does not allow any change. Put another way, spending a partial amount of a coinbase utxo is not allowed. This is not a consensus rule but a local wallet rule due to the current implementation of z_sendmany. In future, this rule may be removed.

Example of Outputs parameter:
[{“address”:”t123…”, “amount”:0.005},
,{“address”:”z010…”,”amount”:0.03, “memo”:”f508af…”}]

Optionally set the minimum number of confirmations which a private or transparent transaction must have in order to be used as an input. When sending from a zaddr, minconf must be greater than zero.

Optionally set a transaction fee, which by default is 0.0001 ZEC.

Any transparent change will be sent to a new transparent address. Any private change will be sent back to the zaddr being used as the source of funds.

Returns an operationid. You use the operationid value with z_getoperationstatus and z_getoperationresult to obtain the result of sending funds, which if successful, will be a txid. -z_shieldcoinbase
| fromaddress toaddress [fee=0.0001] | _This is an Asynchronous RPC call_

Shield transparent coinbase funds by sending to a shielded z address. Utxos selected for shielding will be locked. If there is an error, they are unlocked. The RPC call `listlockunspent` can be used to return a list of locked utxos. The number of coinbase utxos selected for shielding is limited by both the -mempooltxinputlimit=xxx option and a consensus rule defining a maximum transaction size of 100000 bytes.

The from address is a taddr or "*" for all taddrs belonging to the wallet. The to address is a zaddr. The default fee is 0.0001.

Returns an object containing an operationid which can be used with z_getoperationstatus and z_getoperationresult, along with key-value pairs regarding how many utxos are being shielded in this trasaction and what remains to be shielded. +z_shieldcoinbase
| fromaddress toaddress [fee=0.0001] [limit=50] | _This is an Asynchronous RPC call_

Shield transparent coinbase funds by sending to a shielded z address. Utxos selected for shielding will be locked. If there is an error, they are unlocked. The RPC call `listlockunspent` can be used to return a list of locked utxos.

The number of coinbase utxos selected for shielding can be set with the limit parameter, which has a default value of 50. If the parameter is set to 0, the number of utxos selected is limited by the `-mempooltxinputlimit` option. Any limit is constrained by a consensus rule defining a maximum transaction size of 100000 bytes.

The from address is a taddr or "*" for all taddrs belonging to the wallet. The to address is a zaddr. The default fee is 0.0001.

Returns an object containing an operationid which can be used with z_getoperationstatus and z_getoperationresult, along with key-value pairs regarding how many utxos are being shielded in this trasaction and what remains to be shielded. ### Operations diff --git a/qa/rpc-tests/wallet_shieldcoinbase.py b/qa/rpc-tests/wallet_shieldcoinbase.py index d0e4bb122..d1698d945 100755 --- a/qa/rpc-tests/wallet_shieldcoinbase.py +++ b/qa/rpc-tests/wallet_shieldcoinbase.py @@ -114,6 +114,20 @@ class WalletShieldCoinbaseTest (BitcoinTestFramework): errorString = e.error['message'] assert_equal("Insufficient coinbase funds" in errorString, True) + # Shielding will fail because limit parameter must be at least 0 + try: + self.nodes[0].z_shieldcoinbase("*", myzaddr, Decimal('0.001'), -1) + except JSONRPCException,e: + errorString = e.error['message'] + assert_equal("Limit on maximum number of utxos cannot be negative" in errorString, True) + + # Shielding will fail because limit parameter is absurdly large + try: + self.nodes[0].z_shieldcoinbase("*", myzaddr, Decimal('0.001'), 99999999999999) + except JSONRPCException,e: + errorString = e.error['message'] + assert_equal("JSON integer out of range" in errorString, True) + # Shield coinbase utxos from node 0 of value 40, standard fee of 0.00010000 result = self.nodes[0].z_shieldcoinbase(mytaddr, myzaddr) self.wait_and_assert_operationid_status(0, result['opid']) @@ -151,14 +165,15 @@ class WalletShieldCoinbaseTest (BitcoinTestFramework): # Shielding the 800 utxos will occur over two transactions, since max tx size is 100,000 bytes. # We don't verify shieldingValue as utxos are not selected in any specific order, so value can change on each test run. - result = self.nodes[0].z_shieldcoinbase(mytaddr, myzaddr, 0) + # We set an unrealistically high limit parameter of 99999, to verify that max tx size will constrain the number of utxos. + result = self.nodes[0].z_shieldcoinbase(mytaddr, myzaddr, 0, 99999) assert_equal(result["shieldingUTXOs"], Decimal('662')) assert_equal(result["remainingUTXOs"], Decimal('138')) remainingValue = result["remainingValue"] opid1 = result['opid'] # Verify that utxos are locked (not available for selection) by queuing up another shielding operation - result = self.nodes[0].z_shieldcoinbase(mytaddr, myzaddr) + result = self.nodes[0].z_shieldcoinbase(mytaddr, myzaddr, 0, 0) assert_equal(result["shieldingValue"], Decimal(remainingValue)) assert_equal(result["shieldingUTXOs"], Decimal('138')) assert_equal(result["remainingValue"], Decimal('0')) @@ -176,8 +191,9 @@ class WalletShieldCoinbaseTest (BitcoinTestFramework): self.sync_all() # Verify maximum number of utxos which node 2 can shield is limited by option -mempooltxinputlimit + # This option is used when the limit parameter is set to 0. mytaddr = self.nodes[2].getnewaddress() - result = self.nodes[2].z_shieldcoinbase(mytaddr, myzaddr, 0) + result = self.nodes[2].z_shieldcoinbase(mytaddr, myzaddr, Decimal('0.0001'), 0) assert_equal(result["shieldingUTXOs"], Decimal('7')) assert_equal(result["remainingUTXOs"], Decimal('13')) self.wait_and_assert_operationid_status(2, result['opid']) @@ -185,5 +201,23 @@ class WalletShieldCoinbaseTest (BitcoinTestFramework): self.nodes[1].generate(1) self.sync_all() + # Verify maximum number of utxos which node 0 can shield is set by default limit parameter of 50 + self.nodes[0].generate(200) + self.sync_all() + mytaddr = self.nodes[0].getnewaddress() + result = self.nodes[0].z_shieldcoinbase(mytaddr, myzaddr, Decimal('0.0001')) + assert_equal(result["shieldingUTXOs"], Decimal('50')) + assert_equal(result["remainingUTXOs"], Decimal('50')) + self.wait_and_assert_operationid_status(0, result['opid']) + + # Verify maximum number of utxos which node 0 can shield can be set by the limit parameter + result = self.nodes[0].z_shieldcoinbase(mytaddr, myzaddr, Decimal('0.0001'), 33) + assert_equal(result["shieldingUTXOs"], Decimal('33')) + assert_equal(result["remainingUTXOs"], Decimal('17')) + self.wait_and_assert_operationid_status(0, result['opid']) + sync_blocks(self.nodes) # don't sync on mempool as node 2 will reject thix tx due to its mempooltxinputlimit + self.nodes[1].generate(1) + self.sync_all() + if __name__ == '__main__': WalletShieldCoinbaseTest().main() diff --git a/src/rpcclient.cpp b/src/rpcclient.cpp index 376b2b3d5..2c5bd122f 100644 --- a/src/rpcclient.cpp +++ b/src/rpcclient.cpp @@ -110,6 +110,7 @@ static const CRPCConvertParam vRPCConvertParams[] = { "z_sendmany", 2}, { "z_sendmany", 3}, { "z_shieldcoinbase", 2}, + { "z_shieldcoinbase", 3}, { "z_getoperationstatus", 0}, { "z_getoperationresult", 0}, { "z_importkey", 2 }, diff --git a/src/test/rpc_wallet_tests.cpp b/src/test/rpc_wallet_tests.cpp index 8233097de..6017333b4 100644 --- a/src/test/rpc_wallet_tests.cpp +++ b/src/test/rpc_wallet_tests.cpp @@ -1251,7 +1251,7 @@ BOOST_AUTO_TEST_CASE(rpc_z_shieldcoinbase_parameters) BOOST_CHECK_THROW(CallRPC("z_shieldcoinbase"), runtime_error); BOOST_CHECK_THROW(CallRPC("z_shieldcoinbase toofewargs"), runtime_error); - BOOST_CHECK_THROW(CallRPC("z_shieldcoinbase too many args here"), runtime_error); + BOOST_CHECK_THROW(CallRPC("z_shieldcoinbase too many args shown here"), runtime_error); // bad from address BOOST_CHECK_THROW(CallRPC("z_shieldcoinbase " @@ -1279,6 +1279,13 @@ BOOST_AUTO_TEST_CASE(rpc_z_shieldcoinbase_parameters) "21000001" ), runtime_error); + // invalid limit, must be at least 0 + BOOST_CHECK_THROW(CallRPC("z_shieldcoinbase " + "tmRr6yJonqGK23UVhrKuyvTpF8qxQQjKigJ " + "tnpoQJVnYBZZqkFadj2bJJLThNCxbADGB5gSGeYTAGGrT5tejsxY9Zc1BtY8nnHmZkB " + "100 -1" + ), runtime_error); + // Test constructor of AsyncRPCOperation_sendmany std::string testnetzaddr = "ztjiDe569DPNbyTE6TSdJTaSDhoXEHLGvYoUnBU1wfVNU52TEyT6berYtySkd21njAeEoh8fFJUT42kua9r8EnhBaEKqCpP"; std::string mainnetzaddr = "zcMuhvq8sEkHALuSU2i4NbNQxshSAYrpCExec45ZjtivYPbuiFPwk6WHy4SvsbeZ4siy1WheuRGjtaJmoD1J8bFqNXhsG6U"; diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 6738ec5d8..843af53bd 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -3522,18 +3522,21 @@ When estimating the number of coinbase utxos we can shield in a single transacti */ #define CTXIN_SPEND_P2SH_SIZE 400 +#define SHIELD_COINBASE_DEFAULT_LIMIT 50 + UniValue z_shieldcoinbase(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - if (fHelp || params.size() < 2 || params.size() > 3) + if (fHelp || params.size() < 2 || params.size() > 4) throw runtime_error( - "z_shieldcoinbase \"fromaddress\" \"tozaddress\" ( fee )\n" + "z_shieldcoinbase \"fromaddress\" \"tozaddress\" ( fee ) ( limit )\n" "\nShield transparent coinbase funds by sending to a shielded zaddr. This is an asynchronous operation and utxos" "\nselected for shielding will be locked. If there is an error, they are unlocked. The RPC call `listlockunspent`" - "\ncan be used to return a list of locked utxos. The number of coinbase utxos selected for shielding is limited by" - "\nboth the -mempooltxinputlimit=xxx option and a consensus rule defining a maximum transaction size of " + "\ncan be used to return a list of locked utxos. The number of coinbase utxos selected for shielding can be limited" + "\nby the caller. If the limit parameter is set to zero, the -mempooltxinputlimit option will determine the number" + "\nof uxtos. Any limit is constrained by the consensus rule defining a maximum transaction size of " + strprintf("%d bytes.", MAX_TX_SIZE) + HelpRequiringPassphrase() + "\n" "\nArguments:\n" @@ -3541,6 +3544,8 @@ UniValue z_shieldcoinbase(const UniValue& params, bool fHelp) "2. \"toaddress\" (string, required) The address is a zaddr.\n" "3. fee (numeric, optional, default=" + strprintf("%s", FormatMoney(SHIELD_COINBASE_DEFAULT_MINERS_FEE)) + ") The fee amount to attach to this transaction.\n" + "4. limit (numeric, optional, default=" + + strprintf("%d", SHIELD_COINBASE_DEFAULT_LIMIT) + ") Limit on the maximum number of utxos to shield. Set to 0 to use node option -mempooltxinputlimit.\n" "\nResult:\n" "{\n" " \"operationid\": xxx (string) An operationid to pass to z_getoperationstatus to get the result of the operation.\n" @@ -3583,6 +3588,14 @@ UniValue z_shieldcoinbase(const UniValue& params, bool fHelp) } } + int nLimit = SHIELD_COINBASE_DEFAULT_LIMIT; + if (params.size() > 3) { + nLimit = params[3].get_int(); + if (nLimit < 0) { + throw JSONRPCError(RPC_INVALID_PARAMETER, "Limit on maximum number of utxos cannot be negative"); + } + } + // Prepare to get coinbase utxos std::vector inputs; CAmount shieldedValue = 0; @@ -3590,7 +3603,7 @@ UniValue z_shieldcoinbase(const UniValue& params, bool fHelp) size_t estimatedTxSize = 2000; // 1802 joinsplit description + tx overhead + wiggle room size_t utxoCounter = 0; bool maxedOutFlag = false; - size_t mempoolLimit = (size_t)GetArg("-mempooltxinputlimit", 0); + size_t mempoolLimit = (nLimit != 0) ? nLimit : (size_t)GetArg("-mempooltxinputlimit", 0); // Set of addresses to filter utxos by set setAddress = {}; From 337bca8125d89a0b9195a8787164e8b59435b5cf Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 3 Nov 2017 00:39:23 -0700 Subject: [PATCH 0275/1062] Fix an issue where qa test wallet_shieldcoinbase could hang. The mempool was not synced so a block could be generated and not clear out the mempool. This would then cause subsequent code which expected the mempool of all nodes to be empty to hang. --- qa/rpc-tests/wallet_shieldcoinbase.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/qa/rpc-tests/wallet_shieldcoinbase.py b/qa/rpc-tests/wallet_shieldcoinbase.py index d1698d945..693326c8a 100755 --- a/qa/rpc-tests/wallet_shieldcoinbase.py +++ b/qa/rpc-tests/wallet_shieldcoinbase.py @@ -6,7 +6,7 @@ from test_framework.test_framework import BitcoinTestFramework from test_framework.authproxy import JSONRPCException from test_framework.util import assert_equal, initialize_chain_clean, \ - start_node, connect_nodes_bi, sync_blocks + start_node, connect_nodes_bi, sync_blocks, sync_mempools import time from decimal import Decimal @@ -185,8 +185,10 @@ class WalletShieldCoinbaseTest (BitcoinTestFramework): self.wait_and_assert_operationid_status(0, opid2) # sync_all() invokes sync_mempool() but node 2's mempool limit will cause tx1 and tx2 to be rejected. - # So instead, we sync on blocks, and after a new block is generated, all nodes will have an empty mempool. - sync_blocks(self.nodes) + # So instead, we sync on blocks and mempool for node 0 and node 1, and after a new block is generated + # which mines tx1 and tx2, all nodes will have an empty mempool which can then be synced. + sync_blocks(self.nodes[:2]) + sync_mempools(self.nodes[:2]) self.nodes[1].generate(1) self.sync_all() @@ -215,7 +217,9 @@ class WalletShieldCoinbaseTest (BitcoinTestFramework): assert_equal(result["shieldingUTXOs"], Decimal('33')) assert_equal(result["remainingUTXOs"], Decimal('17')) self.wait_and_assert_operationid_status(0, result['opid']) - sync_blocks(self.nodes) # don't sync on mempool as node 2 will reject thix tx due to its mempooltxinputlimit + # Don't sync node 2 which rejects the tx due to its mempooltxinputlimit + sync_blocks(self.nodes[:2]) + sync_mempools(self.nodes[:2]) self.nodes[1].generate(1) self.sync_all() From bef1b5ce1b5f6aabfad3a52c9244aad800d1a171 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Sun, 5 Nov 2017 12:02:21 -0500 Subject: [PATCH 0276/1062] Fix NPE in rpc_wallet_tests --- src/test/rpc_wallet_tests.cpp | 4 ++-- src/test/test_bitcoin.h | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/test/rpc_wallet_tests.cpp b/src/test/rpc_wallet_tests.cpp index 8233097de..01e529208 100644 --- a/src/test/rpc_wallet_tests.cpp +++ b/src/test/rpc_wallet_tests.cpp @@ -1175,7 +1175,7 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_internals) try { proxy.perform_joinsplit(info); } catch (const std::runtime_error & e) { - BOOST_CHECK( string(e.what()).find("JoinSplit verifying key not loaded")!= string::npos); + BOOST_CHECK( string(e.what()).find("error verifying joinsplit")!= string::npos); } } @@ -1365,7 +1365,7 @@ BOOST_AUTO_TEST_CASE(rpc_z_shieldcoinbase_internals) try { proxy.perform_joinsplit(info); } catch (const std::runtime_error & e) { - BOOST_CHECK( string(e.what()).find("JoinSplit verifying key not loaded")!= string::npos); + BOOST_CHECK( string(e.what()).find("error verifying joinsplit")!= string::npos); } } diff --git a/src/test/test_bitcoin.h b/src/test/test_bitcoin.h index d30f19b22..d1c426373 100644 --- a/src/test/test_bitcoin.h +++ b/src/test/test_bitcoin.h @@ -17,11 +17,17 @@ struct BasicTestingSetup { ~BasicTestingSetup(); }; +// Setup w.r.t. zk-SNARK API +struct JoinSplitTestingSetup: public BasicTestingSetup { + JoinSplitTestingSetup(); + ~JoinSplitTestingSetup(); +}; + /** Testing setup that configures a complete environment. * Included are data directory, coins database, script check threads * and wallet (if enabled) setup. */ -struct TestingSetup: public BasicTestingSetup { +struct TestingSetup: public JoinSplitTestingSetup { CCoinsViewDB *pcoinsdbview; boost::filesystem::path pathTemp; boost::thread_group threadGroup; @@ -30,10 +36,4 @@ struct TestingSetup: public BasicTestingSetup { ~TestingSetup(); }; -// Setup w.r.t. zk-SNARK API -struct JoinSplitTestingSetup: public BasicTestingSetup { - JoinSplitTestingSetup(); - ~JoinSplitTestingSetup(); -}; - #endif From 45232b19619a9df52af318289accc6b8ad4930e5 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 14 Nov 2017 13:29:05 -0800 Subject: [PATCH 0277/1062] Add payment disclosure as experimental feature. --- qa/pull-tester/rpc-tests.sh | 1 + qa/rpc-tests/paymentdisclosure.py | 233 ++++++++++++++ src/Makefile.am | 7 + src/Makefile.gtest.include | 1 + src/gtest/test_foundersreward.cpp | 2 + src/gtest/test_paymentdisclosure.cpp | 210 ++++++++++++ src/gtest/test_transaction.cpp | 4 +- src/init.cpp | 3 + src/paymentdisclosure.cpp | 63 ++++ src/paymentdisclosure.h | 145 +++++++++ src/paymentdisclosuredb.cpp | 93 ++++++ src/paymentdisclosuredb.h | 42 +++ src/primitives/transaction.cpp | 15 +- src/primitives/transaction.h | 4 +- src/rpcclient.cpp | 2 + src/rpcserver.cpp | 6 +- src/rpcserver.h | 2 + src/wallet/asyncrpcoperation_sendmany.cpp | 50 ++- src/wallet/asyncrpcoperation_sendmany.h | 5 + .../asyncrpcoperation_shieldcoinbase.cpp | 49 ++- src/wallet/asyncrpcoperation_shieldcoinbase.h | 7 + src/wallet/gtest/test_wallet_zkeys.cpp | 2 + src/wallet/rpcdisclosure.cpp | 299 ++++++++++++++++++ src/zcash/JoinSplit.cpp | 9 +- src/zcash/JoinSplit.hpp | 6 +- src/zcash/NoteEncryption.cpp | 48 +++ src/zcash/NoteEncryption.hpp | 30 ++ 27 files changed, 1324 insertions(+), 14 deletions(-) create mode 100755 qa/rpc-tests/paymentdisclosure.py create mode 100644 src/gtest/test_paymentdisclosure.cpp create mode 100644 src/paymentdisclosure.cpp create mode 100644 src/paymentdisclosure.h create mode 100644 src/paymentdisclosuredb.cpp create mode 100644 src/paymentdisclosuredb.h create mode 100644 src/wallet/rpcdisclosure.cpp diff --git a/qa/pull-tester/rpc-tests.sh b/qa/pull-tester/rpc-tests.sh index 5631f894f..a09edaf03 100755 --- a/qa/pull-tester/rpc-tests.sh +++ b/qa/pull-tester/rpc-tests.sh @@ -11,6 +11,7 @@ export BITCOIND=${REAL_BITCOIND} #Run the tests testScripts=( + 'paymentdisclosure.py' 'prioritisetransaction.py' 'wallet_treestate.py' 'wallet_protectcoinbase.py' diff --git a/qa/rpc-tests/paymentdisclosure.py b/qa/rpc-tests/paymentdisclosure.py new file mode 100755 index 000000000..60d6f188f --- /dev/null +++ b/qa/rpc-tests/paymentdisclosure.py @@ -0,0 +1,233 @@ +#!/usr/bin/env python2 +# Copyright (c) 2017 The Zcash developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +from test_framework.test_framework import BitcoinTestFramework +from test_framework.authproxy import JSONRPCException +from test_framework.util import assert_equal, initialize_chain_clean, \ + start_node, connect_nodes_bi + +import time +from decimal import Decimal + +class PaymentDisclosureTest (BitcoinTestFramework): + + def setup_chain(self): + print("Initializing test directory "+self.options.tmpdir) + initialize_chain_clean(self.options.tmpdir, 4) + + def setup_network(self, split=False): + args = ['-debug=zrpcunsafe,paymentdisclosure', '-experimentalfeatures', '-paymentdisclosure', '-txindex=1'] + self.nodes = [] + self.nodes.append(start_node(0, self.options.tmpdir, args)) + self.nodes.append(start_node(1, self.options.tmpdir, args)) + # node 2 does not enable payment disclosure + args2 = ['-debug=zrpcunsafe', '-experimentalfeatures', '-txindex=1'] + self.nodes.append(start_node(2, self.options.tmpdir, args2)) + connect_nodes_bi(self.nodes,0,1) + connect_nodes_bi(self.nodes,1,2) + connect_nodes_bi(self.nodes,0,2) + self.is_network_split=False + self.sync_all() + + # Returns txid if operation was a success or None + def wait_and_assert_operationid_status(self, nodeid, myopid, in_status='success', in_errormsg=None): + print('waiting for async operation {}'.format(myopid)) + opids = [] + opids.append(myopid) + timeout = 300 + status = None + errormsg = None + txid = None + for x in xrange(1, timeout): + results = self.nodes[nodeid].z_getoperationresult(opids) + if len(results)==0: + time.sleep(1) + else: + status = results[0]["status"] + if status == "failed": + errormsg = results[0]['error']['message'] + elif status == "success": + txid = results[0]['result']['txid'] + break + print('...returned status: {}'.format(status)) + assert_equal(in_status, status) + if errormsg is not None: + assert(in_errormsg is not None) + assert(in_errormsg in errormsg) + print('...returned error: {}'.format(errormsg)) + return txid + + def run_test (self): + print "Mining blocks..." + + self.nodes[0].generate(4) + walletinfo = self.nodes[0].getwalletinfo() + assert_equal(walletinfo['immature_balance'], 40) + assert_equal(walletinfo['balance'], 0) + self.sync_all() + self.nodes[2].generate(3) + self.sync_all() + self.nodes[1].generate(101) + self.sync_all() + assert_equal(self.nodes[0].getbalance(), 40) + assert_equal(self.nodes[1].getbalance(), 10) + assert_equal(self.nodes[2].getbalance(), 30) + + mytaddr = self.nodes[0].getnewaddress() + myzaddr = self.nodes[0].z_getnewaddress() + + # Check that Node 2 has payment disclosure disabled. + try: + self.nodes[2].z_getpaymentdisclosure("invalidtxid", 0, 0) + assert(False) + except JSONRPCException as e: + errorString = e.error['message'] + assert("payment disclosure is disabled" in errorString) + + # Check that Node 0 returns an error for an unknown txid + try: + self.nodes[0].z_getpaymentdisclosure("invalidtxid", 0, 0) + assert(False) + except JSONRPCException as e: + errorString = e.error['message'] + assert("No information available about transaction" in errorString) + + # Shield coinbase utxos from node 0 of value 40, standard fee of 0.00010000 + recipients = [{"address":myzaddr, "amount":Decimal('40.0')-Decimal('0.0001')}] + myopid = self.nodes[0].z_sendmany(mytaddr, recipients) + txid = self.wait_and_assert_operationid_status(0, myopid) + + # Check the tx has joinsplits + assert( len(self.nodes[0].getrawtransaction("" + txid, 1)["vjoinsplit"]) > 0 ) + + # Sync mempools + self.sync_all() + + # Confirm that you can't create a payment disclosure for an unconfirmed tx + try: + self.nodes[0].z_getpaymentdisclosure(txid, 0, 0) + assert(False) + except JSONRPCException as e: + errorString = e.error['message'] + assert("Transaction has not been confirmed yet" in errorString) + + try: + self.nodes[1].z_getpaymentdisclosure(txid, 0, 0) + assert(False) + except JSONRPCException as e: + errorString = e.error['message'] + assert("Transaction has not been confirmed yet" in errorString) + + # Mine tx + self.nodes[0].generate(1) + self.sync_all() + + # Confirm that Node 1 cannot create a payment disclosure for a transaction which does not impact its wallet + try: + self.nodes[1].z_getpaymentdisclosure(txid, 0, 0) + assert(False) + except JSONRPCException as e: + errorString = e.error['message'] + assert("Transaction does not belong to the wallet" in errorString) + + # Check that an invalid joinsplit index is rejected + try: + self.nodes[0].z_getpaymentdisclosure(txid, 1, 0) + assert(False) + except JSONRPCException as e: + errorString = e.error['message'] + assert("Invalid js_index" in errorString) + + try: + self.nodes[0].z_getpaymentdisclosure(txid, -1, 0) + assert(False) + except JSONRPCException as e: + errorString = e.error['message'] + assert("Invalid js_index" in errorString) + + # Check that an invalid output index is rejected + try: + self.nodes[0].z_getpaymentdisclosure(txid, 0, 2) + assert(False) + except JSONRPCException as e: + errorString = e.error['message'] + assert("Invalid output_index" in errorString) + + try: + self.nodes[0].z_getpaymentdisclosure(txid, 0, -1) + assert(False) + except JSONRPCException as e: + errorString = e.error['message'] + assert("Invalid output_index" in errorString) + + # Ask Node 0 to create and validate a payment disclosure for output 0 + message = "Here is proof of my payment!" + pd = self.nodes[0].z_getpaymentdisclosure(txid, 0, 0, message) + result = self.nodes[0].z_validatepaymentdisclosure(pd) + assert(result["valid"]) + output_value_sum = Decimal(result["value"]) + + # Ask Node 1 to confirm the payment disclosure is valid + result = self.nodes[1].z_validatepaymentdisclosure(pd) + assert(result["valid"]) + assert_equal(result["message"], message) + assert_equal(result["value"], output_value_sum) + + # Check that total value of output index 0 and index 1 should equal shielding amount of 40 less standard fee. + pd = self.nodes[0].z_getpaymentdisclosure(txid, 0, 1) + result = self.nodes[0].z_validatepaymentdisclosure(pd) + output_value_sum += Decimal(result["value"]) + assert_equal(output_value_sum, Decimal('39.99990000')) + + # Create a z->z transaction, sending shielded funds from node 0 to node 1 + node1zaddr = self.nodes[1].z_getnewaddress() + recipients = [{"address":node1zaddr, "amount":Decimal('1')}] + myopid = self.nodes[0].z_sendmany(myzaddr, recipients) + txid = self.wait_and_assert_operationid_status(0, myopid) + self.sync_all() + self.nodes[0].generate(1) + self.sync_all() + + # Confirm that Node 0 can create a valid payment disclosure + pd = self.nodes[0].z_getpaymentdisclosure(txid, 0, 0, "a message of your choice") + result = self.nodes[0].z_validatepaymentdisclosure(pd) + assert(result["valid"]) + + # Confirm that Node 1, even as recipient of shielded funds, cannot create a payment disclosure + # as the transaction was created by Node 0 and Node 1's payment disclosure database does not + # contain the necessary data to do so, where the data would only have been available on Node 0 + # when executing z_shieldcoinbase. + try: + self.nodes[1].z_getpaymentdisclosure(txid, 0, 0) + assert(False) + except JSONRPCException as e: + errorString = e.error['message'] + assert("Could not find payment disclosure info for the given joinsplit output" in errorString) + + # Payment disclosures cannot be created for transparent transactions. + txid = self.nodes[2].sendtoaddress(mytaddr, 1.0) + self.sync_all() + + # No matter the type of transaction, if it has not been confirmed, it is ignored. + try: + self.nodes[0].z_getpaymentdisclosure(txid, 0, 0) + assert(False) + except JSONRPCException as e: + errorString = e.error['message'] + assert("Transaction has not been confirmed yet" in errorString) + + self.nodes[0].generate(1) + self.sync_all() + + # Confirm that a payment disclosure can only be generated for a shielded transaction. + try: + self.nodes[0].z_getpaymentdisclosure(txid, 0, 0) + assert(False) + except JSONRPCException as e: + errorString = e.error['message'] + assert("Transaction is not a shielded transaction" in errorString) + +if __name__ == '__main__': + PaymentDisclosureTest().main() diff --git a/src/Makefile.am b/src/Makefile.am index 4a7554c07..5b80b724f 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -160,6 +160,8 @@ BITCOIN_CORE_H = \ net.h \ netbase.h \ noui.h \ + paymentdisclosure.h \ + paymentdisclosuredb.h \ policy/fees.h \ pow.h \ primitives/block.h \ @@ -244,6 +246,8 @@ libbitcoin_server_a_SOURCES = \ miner.cpp \ net.cpp \ noui.cpp \ + paymentdisclosure.cpp \ + paymentdisclosuredb.cpp \ policy/fees.cpp \ pow.cpp \ rest.cpp \ @@ -293,6 +297,9 @@ libbitcoin_wallet_a_SOURCES = \ wallet/asyncrpcoperation_shieldcoinbase.cpp \ wallet/crypter.cpp \ wallet/db.cpp \ + paymentdisclosure.cpp \ + paymentdisclosuredb.cpp \ + wallet/rpcdisclosure.cpp \ wallet/rpcdump.cpp \ wallet/rpcwallet.cpp \ wallet/wallet.cpp \ diff --git a/src/Makefile.gtest.include b/src/Makefile.gtest.include index d92feaa20..02152f936 100644 --- a/src/Makefile.gtest.include +++ b/src/Makefile.gtest.include @@ -38,6 +38,7 @@ zcash_gtest_SOURCES += \ gtest/test_txid.cpp \ gtest/test_libzcash_utils.cpp \ gtest/test_proofs.cpp \ + gtest/test_paymentdisclosure.cpp \ gtest/test_checkblock.cpp if ENABLE_WALLET zcash_gtest_SOURCES += \ diff --git a/src/gtest/test_foundersreward.cpp b/src/gtest/test_foundersreward.cpp index 9016cde54..b5e8acc18 100644 --- a/src/gtest/test_foundersreward.cpp +++ b/src/gtest/test_foundersreward.cpp @@ -80,6 +80,8 @@ TEST(founders_reward_test, create_testnet_2of3multisig) { std::cout << s << std::endl; pWallet->Flush(true); + + ECC_Stop(); } #endif diff --git a/src/gtest/test_paymentdisclosure.cpp b/src/gtest/test_paymentdisclosure.cpp new file mode 100644 index 000000000..e87c89297 --- /dev/null +++ b/src/gtest/test_paymentdisclosure.cpp @@ -0,0 +1,210 @@ +#include + +#include "main.h" +#include "utilmoneystr.h" +#include "chainparams.h" +#include "utilstrencodings.h" +#include "zcash/Address.hpp" +#include "wallet/wallet.h" +#include "amount.h" +#include +#include +#include +#include +#include +#include +#include "util.h" + +#include "paymentdisclosure.h" +#include "paymentdisclosuredb.h" + +#include "sodium.h" + +#include +#include +#include + +using namespace std; + +/* + To run tests: + ./zcash-gtest --gtest_filter="paymentdisclosure.*" + + Note: As an experimental feature, writing your own tests may require option flags to be set. + mapArgs["-experimentalfeatures"] = true; + mapArgs["-paymentdisclosure"] = true; +*/ + +#define NUM_TRIES 10000 + +#define DUMP_DATABASE_TO_STDOUT false + +static boost::uuids::random_generator uuidgen; + +static uint256 random_uint256() +{ + uint256 ret; + randombytes_buf(ret.begin(), 32); + return ret; +} + +// Subclass of PaymentDisclosureDB to add debugging methods +class PaymentDisclosureDBTest : public PaymentDisclosureDB { +public: + PaymentDisclosureDBTest(const boost::filesystem::path& dbPath) : PaymentDisclosureDB(dbPath) {} + + void DebugDumpAllStdout() { + ASSERT_NE(db, nullptr); + std::lock_guard guard(lock_); + + // Iterate over each item in the database and print them + leveldb::Iterator* it = db->NewIterator(leveldb::ReadOptions()); + + for (it->SeekToFirst(); it->Valid(); it->Next()) { + cout << it->key().ToString() << " : "; + // << it->value().ToString() << endl; + try { + std::string strValue = it->value().ToString(); + PaymentDisclosureInfo info; + CDataStream ssValue(strValue.data(), strValue.data() + strValue.size(), SER_DISK, CLIENT_VERSION); + ssValue >> info; + cout << info.ToString() << std::endl; + } catch (const std::exception& e) { + cout << e.what() << std::endl; + } + } + + if (false == it->status().ok()) { + cerr << "An error was found iterating over the database" << endl; + cerr << it->status().ToString() << endl; + } + + delete it; + } +}; + + + +// This test creates random payment disclosure blobs and checks that they can be +// 1. inserted and retrieved from a database +// 2. serialized and deserialized without corruption +TEST(paymentdisclosure, mainnet) { + ECC_Start(); + SelectParams(CBaseChainParams::MAIN); + + boost::filesystem::path pathTemp = boost::filesystem::temp_directory_path() / boost::filesystem::unique_path(); + boost::filesystem::create_directories(pathTemp); + mapArgs["-datadir"] = pathTemp.string(); + + std::cout << "Test payment disclosure database created in folder: " << pathTemp.native() << std::endl; + + PaymentDisclosureDBTest mydb(pathTemp); + + for (int i=0; i vch(&buffer[0], &buffer[0] + 32); + uint256 joinSplitPrivKey = uint256(vch); + + // Create payment disclosure key and info data to store in test database + size_t js = random_uint256().GetCheapHash() % std::numeric_limits::max(); + uint8_t n = random_uint256().GetCheapHash() % std::numeric_limits::max(); + PaymentDisclosureKey key { random_uint256(), js, n}; + PaymentDisclosureInfo info; + info.esk = random_uint256(); + info.joinSplitPrivKey = joinSplitPrivKey; + info.zaddr = libzcash::SpendingKey::random().address(); + ASSERT_TRUE(mydb.Put(key, info)); + + // Retrieve info from test database into new local variable and test it matches + PaymentDisclosureInfo info2; + ASSERT_TRUE(mydb.Get(key, info2)); + ASSERT_EQ(info, info2); + + // Modify this local variable and confirm it no longer matches + info2.esk = random_uint256(); + info2.joinSplitPrivKey = random_uint256(); + info2.zaddr = libzcash::SpendingKey::random().address(); + ASSERT_NE(info, info2); + + // Using the payment info object, let's create a dummy payload + PaymentDisclosurePayload payload; + payload.version = PAYMENT_DISCLOSURE_VERSION_EXPERIMENTAL; + payload.esk = info.esk; + payload.txid = key.hash; + payload.js = key.js; + payload.n = key.n; + payload.message = "random-" + boost::uuids::to_string(uuidgen()); // random message + payload.zaddr = info.zaddr; + + // Serialize and hash the payload to generate a signature + uint256 dataToBeSigned = SerializeHash(payload, SER_GETHASH, 0); + + // Compute the payload signature + unsigned char payloadSig[64]; + if (!(crypto_sign_detached(&payloadSig[0], NULL, + dataToBeSigned.begin(), 32, + &buffer[0] // buffer containing both private and public key required + ) == 0)) + { + throw std::runtime_error("crypto_sign_detached failed"); + } + + // Sanity check + if (!(crypto_sign_verify_detached(&payloadSig[0], + dataToBeSigned.begin(), 32, + joinSplitPubKey.begin() + ) == 0)) + { + throw std::runtime_error("crypto_sign_verify_detached failed"); + } + + // Convert signature buffer to boost array + boost::array arrayPayloadSig; + memcpy(arrayPayloadSig.data(), &payloadSig[0], 64); + + // Payment disclosure blob to pass around + PaymentDisclosure pd = {payload, arrayPayloadSig}; + + // Test payment disclosure constructors + PaymentDisclosure pd2(payload, arrayPayloadSig); + ASSERT_EQ(pd, pd2); + PaymentDisclosure pd3(joinSplitPubKey, key, info, payload.message); + ASSERT_EQ(pd, pd3); + + // Verify serialization and deserialization works + CDataStream ss(SER_NETWORK, PROTOCOL_VERSION); + ss << pd; + std::string ssHexString = HexStr(ss.begin(), ss.end()); + + PaymentDisclosure pdTmp; + CDataStream ssTmp(ParseHex(ssHexString), SER_NETWORK, PROTOCOL_VERSION); + ssTmp >> pdTmp; + ASSERT_EQ(pd, pdTmp); + + CDataStream ss2(SER_NETWORK, PROTOCOL_VERSION); + ss2 << pdTmp; + std::string ss2HexString = HexStr(ss2.begin(), ss2.end()); + ASSERT_EQ(ssHexString, ss2HexString); + + // Verify marker + ASSERT_EQ(pd.payload.marker, PAYMENT_DISCLOSURE_PAYLOAD_MAGIC_BYTES); + ASSERT_EQ(pdTmp.payload.marker, PAYMENT_DISCLOSURE_PAYLOAD_MAGIC_BYTES); + ASSERT_EQ(0, ssHexString.find("706462ff")); // Little endian encoding of PAYMENT_DISCLOSURE_PAYLOAD_MAGIC_BYTES value + + // Sanity check + PaymentDisclosure pdDummy; + ASSERT_NE(pd, pdDummy); + } + +#if DUMP_DATABASE_TO_STDOUT == true + mydb.DebugDumpAllStdout(); +#endif + + ECC_Stop(); +} diff --git a/src/gtest/test_transaction.cpp b/src/gtest/test_transaction.cpp index a339f7652..fb68fd35c 100644 --- a/src/gtest/test_transaction.cpp +++ b/src/gtest/test_transaction.cpp @@ -62,7 +62,7 @@ TEST(Transaction, JSDescriptionRandomized) { *params, pubKeyHash, rt, inputs, outputs, inputMap, outputMap, - 0, 0, false, GenZero); + 0, 0, false, nullptr, GenZero); boost::array expectedInputMap {1, 0}; boost::array expectedOutputMap {1, 0}; @@ -75,7 +75,7 @@ TEST(Transaction, JSDescriptionRandomized) { *params, pubKeyHash, rt, inputs, outputs, inputMap, outputMap, - 0, 0, false, GenMax); + 0, 0, false, nullptr, GenMax); boost::array expectedInputMap {0, 1}; boost::array expectedOutputMap {0, 1}; diff --git a/src/init.cpp b/src/init.cpp index 59a59524d..fe3a61f5a 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -791,6 +791,9 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) if (mapArgs.count("-developerencryptwallet")) { return InitError(_("Wallet encryption requires -experimentalfeatures.")); } + else if (mapArgs.count("-paymentdisclosure")) { + return InitError(_("Payment disclosure requires -experimentalfeatures.")); + } } // Set this early so that parameter interactions go to console diff --git a/src/paymentdisclosure.cpp b/src/paymentdisclosure.cpp new file mode 100644 index 000000000..a33b1c604 --- /dev/null +++ b/src/paymentdisclosure.cpp @@ -0,0 +1,63 @@ +// Copyright (c) 2017 The Zcash developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "paymentdisclosure.h" +#include "util.h" + +std::string PaymentDisclosureInfo::ToString() const { + return strprintf("PaymentDisclosureInfo(version=%d, esk=%s, joinSplitPrivKey=, address=%s)", + version, esk.ToString(), CZCPaymentAddress(zaddr).ToString()); +} + +std::string PaymentDisclosure::ToString() const { + std::string s = HexStr(payloadSig.begin(), payloadSig.end()); + return strprintf("PaymentDisclosure(payload=%s, payloadSig=%s)", payload.ToString(), s); +} + +std::string PaymentDisclosurePayload::ToString() const { + return strprintf("PaymentDisclosurePayload(version=%d, esk=%s, txid=%s, js=%d, n=%d, address=%s, message=%s)", + version, esk.ToString(), txid.ToString(), js, n, CZCPaymentAddress(zaddr).ToString(), message); +} + +PaymentDisclosure::PaymentDisclosure(const uint256 &joinSplitPubKey, const PaymentDisclosureKey &key, const PaymentDisclosureInfo &info, const std::string &message) +{ + // Populate payload member variable + payload.version = info.version; // experimental = 0, production = 1 etc. + payload.esk = info.esk; + payload.txid = key.hash; + payload.js = key.js; + payload.n = key.n; + payload.zaddr = info.zaddr; + payload.message = message; + + // Serialize and hash the payload to generate a signature + uint256 dataToBeSigned = SerializeHash(payload, SER_GETHASH, 0); + + LogPrint("paymentdisclosure", "Payment Disclosure: signing raw payload = %s\n", dataToBeSigned.ToString()); + + // Prepare buffer to store ed25519 key pair in libsodium-compatible format + unsigned char bufferKeyPair[64]; + memcpy(&bufferKeyPair[0], info.joinSplitPrivKey.begin(), 32); + memcpy(&bufferKeyPair[32], joinSplitPubKey.begin(), 32); + + // Compute payload signature member variable + if (!(crypto_sign_detached(payloadSig.data(), NULL, + dataToBeSigned.begin(), 32, + &bufferKeyPair[0] + ) == 0)) + { + throw std::runtime_error("crypto_sign_detached failed"); + } + + // Sanity check + if (!(crypto_sign_verify_detached(payloadSig.data(), + dataToBeSigned.begin(), 32, + joinSplitPubKey.begin()) == 0)) + { + throw std::runtime_error("crypto_sign_verify_detached failed"); + } + + std::string sigString = HexStr(payloadSig.data(), payloadSig.data() + payloadSig.size()); + LogPrint("paymentdisclosure", "Payment Disclosure: signature = %s\n", sigString); +} diff --git a/src/paymentdisclosure.h b/src/paymentdisclosure.h new file mode 100644 index 000000000..b4f56eb45 --- /dev/null +++ b/src/paymentdisclosure.h @@ -0,0 +1,145 @@ +// Copyright (c) 2017 The Zcash developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef ZCASH_PAYMENTDISCLOSURE_H +#define ZCASH_PAYMENTDISCLOSURE_H + +#include "uint256.h" +#include "clientversion.h" +#include "serialize.h" +#include "streams.h" +#include "version.h" + +// For JSOutPoint +#include "wallet/wallet.h" + +#include +#include + + +// Ensure that the two different protocol messages, payment disclosure blobs and transactions, +// which are signed with the same key, joinSplitPrivKey, have disjoint encodings such that an +// encoding from one context will be rejected in the other. We know that the set of valid +// transaction versions is currently ({1..INT32_MAX}) so we will use a negative value for +// payment disclosure of -10328976 which in hex is 0xFF626470. Serialization is in little endian +// format, so a payment disclosure hex string begins 706462FF, which in ISO-8859-1 is "pdbÿ". +#define PAYMENT_DISCLOSURE_PAYLOAD_MAGIC_BYTES -10328976 + +#define PAYMENT_DISCLOSURE_VERSION_EXPERIMENTAL 0 + +typedef JSOutPoint PaymentDisclosureKey; + +struct PaymentDisclosureInfo { + uint8_t version; // 0 = experimental, 1 = first production version, etc. + uint256 esk; // zcash/NoteEncryption.cpp + uint256 joinSplitPrivKey; // primitives/transaction.h + // ed25519 - not tied to implementation e.g. libsodium, see ed25519 rfc + + libzcash::PaymentAddress zaddr; + + PaymentDisclosureInfo() : version(PAYMENT_DISCLOSURE_VERSION_EXPERIMENTAL) { + } + + PaymentDisclosureInfo(uint8_t v, uint256 esk, uint256 key, libzcash::PaymentAddress zaddr) : version(v), esk(esk), joinSplitPrivKey(key), zaddr(zaddr) { } + + ADD_SERIALIZE_METHODS; + + template + inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { + READWRITE(version); + READWRITE(esk); + READWRITE(joinSplitPrivKey); + READWRITE(zaddr); + } + + std::string ToString() const; + + friend bool operator==(const PaymentDisclosureInfo& a, const PaymentDisclosureInfo& b) { + return (a.version == b.version && a.esk == b.esk && a.joinSplitPrivKey == b.joinSplitPrivKey && a.zaddr == b.zaddr); + } + + friend bool operator!=(const PaymentDisclosureInfo& a, const PaymentDisclosureInfo& b) { + return !(a == b); + } + +}; + + +struct PaymentDisclosurePayload { + int32_t marker = PAYMENT_DISCLOSURE_PAYLOAD_MAGIC_BYTES; // to be disjoint from transaction encoding + uint8_t version; // 0 = experimental, 1 = first production version, etc. + uint256 esk; // zcash/NoteEncryption.cpp + uint256 txid; // primitives/transaction.h + size_t js; // Index into CTransaction.vjoinsplit + uint8_t n; // Index into JSDescription fields of length ZC_NUM_JS_OUTPUTS + libzcash::PaymentAddress zaddr; // zcash/Address.hpp + std::string message; // parameter to RPC call + + ADD_SERIALIZE_METHODS; + + template + inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { + READWRITE(marker); + READWRITE(version); + READWRITE(esk); + READWRITE(txid); + READWRITE(js); + READWRITE(n); + READWRITE(zaddr); + READWRITE(message); + } + + std::string ToString() const; + + friend bool operator==(const PaymentDisclosurePayload& a, const PaymentDisclosurePayload& b) { + return ( + a.version == b.version && + a.esk == b.esk && + a.txid == b.txid && + a.js == b.js && + a.n == b.n && + a.zaddr == b.zaddr && + a.message == b.message + ); + } + + friend bool operator!=(const PaymentDisclosurePayload& a, const PaymentDisclosurePayload& b) { + return !(a == b); + } +}; + +struct PaymentDisclosure { + PaymentDisclosurePayload payload; + boost::array payloadSig; + // We use boost array because serialize doesn't like char buffer, otherwise we could do: unsigned char payloadSig[64]; + + PaymentDisclosure() {}; + PaymentDisclosure(const PaymentDisclosurePayload payload, const boost::array sig) : payload(payload), payloadSig(sig) {}; + PaymentDisclosure(const uint256& joinSplitPubKey, const PaymentDisclosureKey& key, const PaymentDisclosureInfo& info, const std::string& message); + + ADD_SERIALIZE_METHODS; + + template + inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { + READWRITE(payload); + READWRITE(payloadSig); + } + + std::string ToString() const; + + friend bool operator==(const PaymentDisclosure& a, const PaymentDisclosure& b) { + return (a.payload == b.payload && a.payloadSig == b.payloadSig); + } + + friend bool operator!=(const PaymentDisclosure& a, const PaymentDisclosure& b) { + return !(a == b); + } +}; + + + +typedef std::pair PaymentDisclosureKeyInfo; + + +#endif // ZCASH_PAYMENTDISCLOSURE_H diff --git a/src/paymentdisclosuredb.cpp b/src/paymentdisclosuredb.cpp new file mode 100644 index 000000000..ef32f2845 --- /dev/null +++ b/src/paymentdisclosuredb.cpp @@ -0,0 +1,93 @@ +// Copyright (c) 2017 The Zcash developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "paymentdisclosuredb.h" + +#include "util.h" +#include "leveldbwrapper.h" + +#include + +using namespace std; + +static boost::filesystem::path emptyPath; + +/** + * Static method to return the shared/default payment disclosure database. + */ +shared_ptr PaymentDisclosureDB::sharedInstance() { + // Thread-safe in C++11 and gcc 4.3 + static shared_ptr ptr = std::make_shared(); + return ptr; +} + +// C++11 delegated constructor +PaymentDisclosureDB::PaymentDisclosureDB() : PaymentDisclosureDB(emptyPath) { +} + +PaymentDisclosureDB::PaymentDisclosureDB(const boost::filesystem::path& dbPath) { + boost::filesystem::path path(dbPath); + if (path.empty()) { + path = GetDataDir() / "paymentdisclosure"; + LogPrintf("PaymentDisclosure: using default path for database: %s\n", path.string()); + } else { + LogPrintf("PaymentDisclosure: using custom path for database: %s\n", path.string()); + } + + TryCreateDirectory(path); + options.create_if_missing = true; + leveldb::Status status = leveldb::DB::Open(options, path.string(), &db); + HandleError(status); // throws exception + LogPrintf("PaymentDisclosure: Opened LevelDB successfully\n"); +} + +PaymentDisclosureDB::~PaymentDisclosureDB() { + if (db != nullptr) { + delete db; + } +} + +bool PaymentDisclosureDB::Put(const PaymentDisclosureKey& key, const PaymentDisclosureInfo& info) +{ + if (db == nullptr) { + return false; + } + + std::lock_guard guard(lock_); + + CDataStream ssValue(SER_DISK, CLIENT_VERSION); + ssValue.reserve(ssValue.GetSerializeSize(info)); + ssValue << info; + leveldb::Slice slice(&ssValue[0], ssValue.size()); + + leveldb::Status status = db->Put(writeOptions, key.ToString(), slice); + HandleError(status); + return true; +} + +bool PaymentDisclosureDB::Get(const PaymentDisclosureKey& key, PaymentDisclosureInfo& info) +{ + if (db == nullptr) { + return false; + } + + std::lock_guard guard(lock_); + + std::string strValue; + leveldb::Status status = db->Get(readOptions, key.ToString(), &strValue); + if (!status.ok()) { + if (status.IsNotFound()) + return false; + LogPrintf("PaymentDisclosure: LevelDB read failure: %s\n", status.ToString()); + HandleError(status); + } + + try { + CDataStream ssValue(strValue.data(), strValue.data() + strValue.size(), SER_DISK, CLIENT_VERSION); + ssValue >> info; + } catch (const std::exception&) { + return false; + } + return true; +} diff --git a/src/paymentdisclosuredb.h b/src/paymentdisclosuredb.h new file mode 100644 index 000000000..9352cac8f --- /dev/null +++ b/src/paymentdisclosuredb.h @@ -0,0 +1,42 @@ +// Copyright (c) 2017 The Zcash developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef ZCASH_PAYMENTDISCLOSUREDB_H +#define ZCASH_PAYMENTDISCLOSUREDB_H + +#include "paymentdisclosure.h" + +#include +#include +#include +#include +#include + +#include + +#include + + +class PaymentDisclosureDB +{ +protected: + leveldb::DB* db = nullptr; + leveldb::Options options; + leveldb::ReadOptions readOptions; + leveldb::WriteOptions writeOptions; + mutable std::mutex lock_; + +public: + static std::shared_ptr sharedInstance(); + + PaymentDisclosureDB(); + PaymentDisclosureDB(const boost::filesystem::path& dbPath); + ~PaymentDisclosureDB(); + + bool Put(const PaymentDisclosureKey& key, const PaymentDisclosureInfo& info); + bool Get(const PaymentDisclosureKey& key, PaymentDisclosureInfo& info); +}; + + +#endif // ZCASH_PAYMENTDISCLOSUREDB_H diff --git a/src/primitives/transaction.cpp b/src/primitives/transaction.cpp index f6236a2f8..cdd299967 100644 --- a/src/primitives/transaction.cpp +++ b/src/primitives/transaction.cpp @@ -16,7 +16,9 @@ JSDescription::JSDescription(ZCJoinSplit& params, const boost::array& outputs, CAmount vpub_old, CAmount vpub_new, - bool computeProof) : vpub_old(vpub_old), vpub_new(vpub_new), anchor(anchor) + bool computeProof, + uint256 *esk // payment disclosure + ) : vpub_old(vpub_old), vpub_new(vpub_new), anchor(anchor) { boost::array notes; @@ -37,7 +39,8 @@ JSDescription::JSDescription(ZCJoinSplit& params, vpub_old, vpub_new, anchor, - computeProof + computeProof, + esk // payment disclosure ); } @@ -52,7 +55,9 @@ JSDescription JSDescription::Randomized( CAmount vpub_old, CAmount vpub_new, bool computeProof, - std::function gen) + uint256 *esk, // payment disclosure + std::function gen + ) { // Randomize the order of the inputs and outputs inputMap = {0, 1}; @@ -65,7 +70,9 @@ JSDescription JSDescription::Randomized( return JSDescription( params, pubKeyHash, anchor, inputs, outputs, - vpub_old, vpub_new, computeProof); + vpub_old, vpub_new, computeProof, + esk // payment disclosure + ); } bool JSDescription::Verify( diff --git a/src/primitives/transaction.h b/src/primitives/transaction.h index 111237cb7..f9723e399 100644 --- a/src/primitives/transaction.h +++ b/src/primitives/transaction.h @@ -77,7 +77,8 @@ public: const boost::array& outputs, CAmount vpub_old, CAmount vpub_new, - bool computeProof = true // Set to false in some tests + bool computeProof = true, // Set to false in some tests + uint256 *esk = nullptr // payment disclosure ); static JSDescription Randomized( @@ -91,6 +92,7 @@ public: CAmount vpub_old, CAmount vpub_new, bool computeProof = true, // Set to false in some tests + uint256 *esk = nullptr, // payment disclosure std::function gen = GetRandInt ); diff --git a/src/rpcclient.cpp b/src/rpcclient.cpp index 2c5bd122f..c02c51991 100644 --- a/src/rpcclient.cpp +++ b/src/rpcclient.cpp @@ -114,6 +114,8 @@ static const CRPCConvertParam vRPCConvertParams[] = { "z_getoperationstatus", 0}, { "z_getoperationresult", 0}, { "z_importkey", 2 }, + { "z_getpaymentdisclosure", 1}, + { "z_getpaymentdisclosure", 2} }; class CRPCConvertTable diff --git a/src/rpcserver.cpp b/src/rpcserver.cpp index 0bd8fb1b8..7a3880902 100644 --- a/src/rpcserver.cpp +++ b/src/rpcserver.cpp @@ -396,7 +396,11 @@ static const CRPCCommand vRPCCommands[] = { "wallet", "z_exportkey", &z_exportkey, true }, { "wallet", "z_importkey", &z_importkey, true }, { "wallet", "z_exportwallet", &z_exportwallet, true }, - { "wallet", "z_importwallet", &z_importwallet, true } + { "wallet", "z_importwallet", &z_importwallet, true }, + + // TODO: rearrange into another category + { "disclosure", "z_getpaymentdisclosure", &z_getpaymentdisclosure, true }, + { "disclosure", "z_validatepaymentdisclosure", &z_validatepaymentdisclosure, true } #endif // ENABLE_WALLET }; diff --git a/src/rpcserver.h b/src/rpcserver.h index 4da515426..321568748 100644 --- a/src/rpcserver.h +++ b/src/rpcserver.h @@ -292,6 +292,8 @@ extern UniValue z_getoperationstatus(const UniValue& params, bool fHelp); // in extern UniValue z_getoperationresult(const UniValue& params, bool fHelp); // in rpcwallet.cpp extern UniValue z_listoperationids(const UniValue& params, bool fHelp); // in rpcwallet.cpp extern UniValue z_validateaddress(const UniValue& params, bool fHelp); // in rpcmisc.cpp +extern UniValue z_getpaymentdisclosure(const UniValue& params, bool fHelp); // in rpcdisclosure.cpp +extern UniValue z_validatepaymentdisclosure(const UniValue ¶ms, bool fHelp); // in rpcdisclosure.cpp bool StartRPC(); void InterruptRPC(); diff --git a/src/wallet/asyncrpcoperation_sendmany.cpp b/src/wallet/asyncrpcoperation_sendmany.cpp index b4e831d57..539d5d7d6 100644 --- a/src/wallet/asyncrpcoperation_sendmany.cpp +++ b/src/wallet/asyncrpcoperation_sendmany.cpp @@ -28,6 +28,8 @@ #include #include +#include "paymentdisclosuredb.h" + using namespace libzcash; int find_output(UniValue obj, int n) { @@ -103,6 +105,10 @@ AsyncRPCOperation_sendmany::AsyncRPCOperation_sendmany( } else { LogPrint("zrpc", "%s: z_sendmany initialized\n", getId()); } + + + // Enable payment disclosure if requested + paymentDisclosureMode = fExperimentalMode && GetBoolArg("-paymentdisclosure", false); } AsyncRPCOperation_sendmany::~AsyncRPCOperation_sendmany() { @@ -169,6 +175,21 @@ void AsyncRPCOperation_sendmany::main() { s += strprintf(", error=%s)\n", getErrorMessage()); } LogPrintf("%s",s); + + // !!! Payment disclosure START + if (success && paymentDisclosureMode && paymentDisclosureData_.size()>0) { + uint256 txidhash = tx_.GetHash(); + std::shared_ptr db = PaymentDisclosureDB::sharedInstance(); + for (PaymentDisclosureKeyInfo p : paymentDisclosureData_) { + p.first.hash = txidhash; + if (!db->Put(p.first, p.second)) { + LogPrint("paymentdisclosure", "%s: Payment Disclosure: Error writing entry to database for key %s\n", getId(), p.first.ToString()); + } else { + LogPrint("paymentdisclosure", "%s: Payment Disclosure: Successfully added entry to database for key %s\n", getId(), p.first.ToString()); + } + } + } + // !!! Payment disclosure END } // Notes: @@ -945,6 +966,9 @@ UniValue AsyncRPCOperation_sendmany::perform_joinsplit( {info.vjsout[0], info.vjsout[1]}; boost::array inputMap; boost::array outputMap; + + uint256 esk; // payment disclosure - secret + JSDescription jsdesc = JSDescription::Randomized( *pzcashParams, joinSplitPubKey_, @@ -955,8 +979,8 @@ UniValue AsyncRPCOperation_sendmany::perform_joinsplit( outputMap, info.vpub_old, info.vpub_new, - !this->testmode); - + !this->testmode, + &esk); // parameter expects pointer to esk, so pass in address { auto verifier = libzcash::ProofVerifier::Strict(); if (!(jsdesc.Verify(*pzcashParams, verifier, joinSplitPubKey_))) { @@ -1025,6 +1049,28 @@ UniValue AsyncRPCOperation_sendmany::perform_joinsplit( arrOutputMap.push_back(outputMap[i]); } + + // !!! Payment disclosure START + unsigned char buffer[32] = {0}; + memcpy(&buffer[0], &joinSplitPrivKey_[0], 32); // private key in first half of 64 byte buffer + std::vector vch(&buffer[0], &buffer[0] + 32); + uint256 joinSplitPrivKey = uint256(vch); + size_t js_index = tx_.vjoinsplit.size() - 1; + uint256 placeholder; + for (int i = 0; i < ZC_NUM_JS_OUTPUTS; i++) { + uint8_t mapped_index = outputMap[i]; + // placeholder for txid will be filled in later when tx has been finalized and signed. + PaymentDisclosureKey pdKey = {placeholder, js_index, mapped_index}; + JSOutput output = outputs[mapped_index]; + libzcash::PaymentAddress zaddr = output.addr; // randomized output + PaymentDisclosureInfo pdInfo = {PAYMENT_DISCLOSURE_VERSION_EXPERIMENTAL, esk, joinSplitPrivKey, zaddr}; + paymentDisclosureData_.push_back(PaymentDisclosureKeyInfo(pdKey, pdInfo)); + + CZCPaymentAddress address(zaddr); + LogPrint("paymentdisclosure", "%s: Payment Disclosure: js=%d, n=%d, zaddr=%s\n", getId(), js_index, int(mapped_index), address.ToString()); + } + // !!! Payment disclosure END + UniValue obj(UniValue::VOBJ); obj.push_back(Pair("encryptednote1", encryptedNote1)); obj.push_back(Pair("encryptednote2", encryptedNote2)); diff --git a/src/wallet/asyncrpcoperation_sendmany.h b/src/wallet/asyncrpcoperation_sendmany.h index 6fac61160..69bdbe315 100644 --- a/src/wallet/asyncrpcoperation_sendmany.h +++ b/src/wallet/asyncrpcoperation_sendmany.h @@ -12,6 +12,7 @@ #include "zcash/JoinSplit.hpp" #include "zcash/Address.hpp" #include "wallet.h" +#include "paymentdisclosure.h" #include #include @@ -65,6 +66,8 @@ public: bool testmode = false; // Set to true to disable sending txs and generating proofs + bool paymentDisclosureMode = false; // Set to true to save esk for encrypted notes in payment disclosure database. + private: friend class TEST_FRIEND_AsyncRPCOperation_sendmany; // class for unit testing @@ -113,6 +116,8 @@ private: void sign_send_raw_transaction(UniValue obj); // throws exception if there was an error + // payment disclosure! + std::vector paymentDisclosureData_; }; diff --git a/src/wallet/asyncrpcoperation_shieldcoinbase.cpp b/src/wallet/asyncrpcoperation_shieldcoinbase.cpp index 20d659cc2..a845c6085 100644 --- a/src/wallet/asyncrpcoperation_shieldcoinbase.cpp +++ b/src/wallet/asyncrpcoperation_shieldcoinbase.cpp @@ -29,6 +29,9 @@ #include "asyncrpcoperation_shieldcoinbase.h" +#include "paymentdisclosure.h" +#include "paymentdisclosuredb.h" + using namespace libzcash; static int find_output(UniValue obj, int n) { @@ -80,6 +83,9 @@ AsyncRPCOperation_shieldcoinbase::AsyncRPCOperation_shieldcoinbase( // Lock UTXOs lock_utxos(); + + // Enable payment disclosure if requested + paymentDisclosureMode = fExperimentalMode && GetBoolArg("-paymentdisclosure", false); } AsyncRPCOperation_shieldcoinbase::~AsyncRPCOperation_shieldcoinbase() { @@ -150,6 +156,21 @@ void AsyncRPCOperation_shieldcoinbase::main() { LogPrintf("%s",s); unlock_utxos(); // clean up + + // !!! Payment disclosure START + if (success && paymentDisclosureMode && paymentDisclosureData_.size()>0) { + uint256 txidhash = tx_.GetHash(); + std::shared_ptr db = PaymentDisclosureDB::sharedInstance(); + for (PaymentDisclosureKeyInfo p : paymentDisclosureData_) { + p.first.hash = txidhash; + if (!db->Put(p.first, p.second)) { + LogPrint("paymentdisclosure", "%s: Payment Disclosure: Error writing entry to database for key %s\n", getId(), p.first.ToString()); + } else { + LogPrint("paymentdisclosure", "%s: Payment Disclosure: Successfully added entry to database for key %s\n", getId(), p.first.ToString()); + } + } + } + // !!! Payment disclosure END } @@ -319,6 +340,9 @@ UniValue AsyncRPCOperation_shieldcoinbase::perform_joinsplit(ShieldCoinbaseJSInf {info.vjsout[0], info.vjsout[1]}; boost::array inputMap; boost::array outputMap; + + uint256 esk; // payment disclosure - secret + JSDescription jsdesc = JSDescription::Randomized( *pzcashParams, joinSplitPubKey_, @@ -329,8 +353,8 @@ UniValue AsyncRPCOperation_shieldcoinbase::perform_joinsplit(ShieldCoinbaseJSInf outputMap, info.vpub_old, info.vpub_new, - !this->testmode); - + !this->testmode, + &esk); // parameter expects pointer to esk, so pass in address { auto verifier = libzcash::ProofVerifier::Strict(); if (!(jsdesc.Verify(*pzcashParams, verifier, joinSplitPubKey_))) { @@ -399,6 +423,27 @@ UniValue AsyncRPCOperation_shieldcoinbase::perform_joinsplit(ShieldCoinbaseJSInf arrOutputMap.push_back(outputMap[i]); } + // !!! Payment disclosure START + unsigned char buffer[32] = {0}; + memcpy(&buffer[0], &joinSplitPrivKey_[0], 32); // private key in first half of 64 byte buffer + std::vector vch(&buffer[0], &buffer[0] + 32); + uint256 joinSplitPrivKey = uint256(vch); + size_t js_index = tx_.vjoinsplit.size() - 1; + uint256 placeholder; + for (int i = 0; i < ZC_NUM_JS_OUTPUTS; i++) { + uint8_t mapped_index = outputMap[i]; + // placeholder for txid will be filled in later when tx has been finalized and signed. + PaymentDisclosureKey pdKey = {placeholder, js_index, mapped_index}; + JSOutput output = outputs[mapped_index]; + libzcash::PaymentAddress zaddr = output.addr; // randomized output + PaymentDisclosureInfo pdInfo = {PAYMENT_DISCLOSURE_VERSION_EXPERIMENTAL, esk, joinSplitPrivKey, zaddr}; + paymentDisclosureData_.push_back(PaymentDisclosureKeyInfo(pdKey, pdInfo)); + + CZCPaymentAddress address(zaddr); + LogPrint("paymentdisclosure", "%s: Payment Disclosure: js=%d, n=%d, zaddr=%s\n", getId(), js_index, int(mapped_index), address.ToString()); + } + // !!! Payment disclosure END + UniValue obj(UniValue::VOBJ); obj.push_back(Pair("encryptednote1", encryptedNote1)); obj.push_back(Pair("encryptednote2", encryptedNote2)); diff --git a/src/wallet/asyncrpcoperation_shieldcoinbase.h b/src/wallet/asyncrpcoperation_shieldcoinbase.h index 981b2fbe9..379aa5bd7 100644 --- a/src/wallet/asyncrpcoperation_shieldcoinbase.h +++ b/src/wallet/asyncrpcoperation_shieldcoinbase.h @@ -18,6 +18,8 @@ #include +#include "paymentdisclosure.h" + // Default transaction fee if caller does not specify one. #define SHIELD_COINBASE_DEFAULT_MINERS_FEE 10000 @@ -55,6 +57,8 @@ public: bool testmode = false; // Set to true to disable sending txs and generating proofs + bool paymentDisclosureMode = false; // Set to true to save esk for encrypted notes in payment disclosure database. + private: friend class TEST_FRIEND_AsyncRPCOperation_shieldcoinbase; // class for unit testing @@ -80,6 +84,9 @@ private: void lock_utxos(); void unlock_utxos(); + + // payment disclosure! + std::vector paymentDisclosureData_; }; diff --git a/src/wallet/gtest/test_wallet_zkeys.cpp b/src/wallet/gtest/test_wallet_zkeys.cpp index c7912ae7a..554a4ee97 100644 --- a/src/wallet/gtest/test_wallet_zkeys.cpp +++ b/src/wallet/gtest/test_wallet_zkeys.cpp @@ -214,5 +214,7 @@ TEST(wallet_zkeys_tests, write_cryptedzkey_direct_to_db) { wallet2.GetSpendingKey(paymentAddress2.Get(), keyOut); ASSERT_EQ(paymentAddress2.Get(), keyOut.address()); + + ECC_Stop(); } diff --git a/src/wallet/rpcdisclosure.cpp b/src/wallet/rpcdisclosure.cpp new file mode 100644 index 000000000..c1c8cb87c --- /dev/null +++ b/src/wallet/rpcdisclosure.cpp @@ -0,0 +1,299 @@ +// Copyright (c) 2017 The Zcash developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "base58.h" +#include "rpcserver.h" +#include "init.h" +#include "main.h" +#include "script/script.h" +#include "script/standard.h" +#include "sync.h" +#include "util.h" +#include "utiltime.h" +#include "wallet.h" + +#include +#include + +#include +#include + +#include + +#include "paymentdisclosure.h" +#include "paymentdisclosuredb.h" + +#include "zcash/Note.hpp" +#include "zcash/NoteEncryption.hpp" + +using namespace std; +using namespace libzcash; + +// Function declaration for function implemented in wallet/rpcwallet.cpp +bool EnsureWalletIsAvailable(bool avoidException); + +/** + * RPC call to generate a payment disclosure + */ +UniValue z_getpaymentdisclosure(const UniValue& params, bool fHelp) +{ + if (!EnsureWalletIsAvailable(fHelp)) + return NullUniValue; + + auto fEnablePaymentDisclosure = fExperimentalMode && GetBoolArg("-paymentdisclosure", false); + string strPaymentDisclosureDisabledMsg = ""; + if (!fEnablePaymentDisclosure) { + strPaymentDisclosureDisabledMsg = "\nWARNING: Payment disclosure is currently DISABLED. This call always fails.\n"; + } + + if (fHelp || params.size() < 3 || params.size() > 4 ) + throw runtime_error( + "z_getpaymentdisclosure \"txid\" \"js_index\" \"output_index\" (\"message\") \n" + "\nGenerate a payment disclosure for a given joinsplit output.\n" + "\nEXPERIMENTAL FEATURE\n" + + strPaymentDisclosureDisabledMsg + + "\nArguments:\n" + "1. \"txid\" (string, required) \n" + "2. \"js_index\" (string, required) \n" + "3. \"output_index\" (string, required) \n" + "4. \"message\" (string, optional) \n" + "\nResult:\n" + "\"paymentblob\" (string) Hex string of payment blob\n" + "\nExamples:\n" + + HelpExampleCli("z_getpaymentdisclosure", "96f12882450429324d5f3b48630e3168220e49ab7b0f066e5c2935a6b88bb0f2 0 0 \"refund\"") + + HelpExampleRpc("z_getpaymentdisclosure", "\"96f12882450429324d5f3b48630e3168220e49ab7b0f066e5c2935a6b88bb0f2\", 0, 0, \"refund\"") + ); + + if (!fEnablePaymentDisclosure) { + throw JSONRPCError(RPC_WALLET_ERROR, "Error: payment disclosure is disabled."); + } + + LOCK2(cs_main, pwalletMain->cs_wallet); + + EnsureWalletIsUnlocked(); + + // Check wallet knows about txid + string txid = params[0].get_str(); + uint256 hash; + hash.SetHex(txid); + + CTransaction tx; + uint256 hashBlock; + + // Check txid has been seen + if (!GetTransaction(hash, tx, hashBlock, true)) { + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "No information available about transaction"); + } + + // Check tx has been confirmed + if (hashBlock.IsNull()) { + throw JSONRPCError(RPC_MISC_ERROR, "Transaction has not been confirmed yet"); + } + + // Check is mine + if (!pwalletMain->mapWallet.count(hash)) { + throw JSONRPCError(RPC_MISC_ERROR, "Transaction does not belong to the wallet"); + } + const CWalletTx& wtx = pwalletMain->mapWallet[hash]; + + // Check if shielded tx + if (wtx.vjoinsplit.empty()) { + throw JSONRPCError(RPC_MISC_ERROR, "Transaction is not a shielded transaction"); + } + + // Check js_index + int js_index = params[1].get_int(); + if (js_index < 0 || js_index >= wtx.vjoinsplit.size()) { + throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid js_index"); + } + + // Check output_index + int output_index = params[2].get_int(); + if (output_index < 0 || output_index >= ZC_NUM_JS_OUTPUTS) { + throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid output_index"); + } + + // Get message if it exists + string msg; + if (params.size() == 4) { + msg = params[3].get_str(); + } + + // Create PaymentDisclosureKey + PaymentDisclosureKey key = {hash, (size_t)js_index, (uint8_t)output_index }; + + // TODO: In future, perhaps init the DB in init.cpp + shared_ptr db = PaymentDisclosureDB::sharedInstance(); + PaymentDisclosureInfo info; + if (!db->Get(key, info)) { + throw JSONRPCError(RPC_DATABASE_ERROR, "Could not find payment disclosure info for the given joinsplit output"); + } + + PaymentDisclosure pd( wtx.joinSplitPubKey, key, info, msg ); + CDataStream ss(SER_NETWORK, PROTOCOL_VERSION); + ss << pd; + string strHex = HexStr(ss.begin(), ss.end()); + return strHex; +} + + + +/** + * RPC call to validate a payment disclosure data blob. + */ +UniValue z_validatepaymentdisclosure(const UniValue& params, bool fHelp) +{ + if (!EnsureWalletIsAvailable(fHelp)) + return NullUniValue; + + auto fEnablePaymentDisclosure = fExperimentalMode && GetBoolArg("-paymentdisclosure", false); + string strPaymentDisclosureDisabledMsg = ""; + if (!fEnablePaymentDisclosure) { + strPaymentDisclosureDisabledMsg = "\nWARNING: Payment disclosure is curretly DISABLED. This call always fails.\n"; + } + + if (fHelp || params.size() != 1) + throw runtime_error( + "z_validatepaymentdisclosure \"paymentdisclosure\"\n" + "\nValidates a payment disclosure.\n" + "\nEXPERIMENTAL FEATURE\n" + + strPaymentDisclosureDisabledMsg + + "\nArguments:\n" + "1. \"paymentdisclosure\" (string, required) Hex data string\n" + "\nExamples:\n" + + HelpExampleCli("z_validatepaymentdisclosure", "\"hexblob\"") + + HelpExampleRpc("z_validatepaymentdisclosure", "\"hexblob\"") + ); + + if (!fEnablePaymentDisclosure) { + throw JSONRPCError(RPC_WALLET_ERROR, "Error: payment disclosure is disabled."); + } + + LOCK2(cs_main, pwalletMain->cs_wallet); + + EnsureWalletIsUnlocked(); + + string hexInput = params[0].get_str(); + if (!IsHex(hexInput)) + { + throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, expected payment disclosure data in hexadecimal format."); + } + + // Unserialize the payment disclosure data into an object + PaymentDisclosure pd; + CDataStream ss(ParseHex(hexInput), SER_NETWORK, PROTOCOL_VERSION); + try { + ss >> pd; + // too much data is ignored, but if not enough data, exception of type ios_base::failure is thrown, + // CBaseDataStream::read(): end of data: iostream error + } catch (const std::exception &e) { + throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, payment disclosure data is malformed."); + } + + if (pd.payload.marker != PAYMENT_DISCLOSURE_PAYLOAD_MAGIC_BYTES) { + throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, payment disclosure marker not found."); + } + + if (pd.payload.version != PAYMENT_DISCLOSURE_VERSION_EXPERIMENTAL) { + throw JSONRPCError(RPC_INVALID_PARAMETER, "Payment disclosure version is unsupported."); + } + + uint256 hash = pd.payload.txid; + CTransaction tx; + uint256 hashBlock; + // Check if we have seen the transaction + if (!GetTransaction(hash, tx, hashBlock, true)) { + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "No information available about transaction"); + } + + // Check if the transaction has been confirmed + if (hashBlock.IsNull()) { + throw JSONRPCError(RPC_MISC_ERROR, "Transaction has not been confirmed yet"); + } + + // Check if shielded tx + if (tx.vjoinsplit.empty()) { + throw JSONRPCError(RPC_MISC_ERROR, "Transaction is not a shielded transaction"); + } + + UniValue errs(UniValue::VARR); + UniValue o(UniValue::VOBJ); + o.push_back(Pair("txid", pd.payload.txid.ToString())); + + // Check js_index + if (pd.payload.js >= tx.vjoinsplit.size()) { + errs.push_back("Payment disclosure refers to an invalid joinsplit index"); + } + o.push_back(Pair("jsIndex", pd.payload.js)); + + if (pd.payload.n < 0 || pd.payload.n >= ZC_NUM_JS_OUTPUTS) { + errs.push_back("Payment disclosure refers to an invalid output index"); + } + o.push_back(Pair("outputIndex", pd.payload.n)); + o.push_back(Pair("version", pd.payload.version)); + o.push_back(Pair("onetimePrivKey", pd.payload.esk.ToString())); + o.push_back(Pair("message", pd.payload.message)); + o.push_back(Pair("joinSplitPubKey", tx.joinSplitPubKey.ToString())); + + // Verify the payment disclosure was signed using the same key as the transaction i.e. the joinSplitPrivKey. + uint256 dataToBeSigned = SerializeHash(pd.payload, SER_GETHASH, 0); + bool sigVerified = (crypto_sign_verify_detached(pd.payloadSig.data(), + dataToBeSigned.begin(), 32, + tx.joinSplitPubKey.begin()) == 0); + o.push_back(Pair("signatureVerified", sigVerified)); + if (!sigVerified) { + errs.push_back("Payment disclosure signature does not match transaction signature"); + } + + // Check the payment address is valid + PaymentAddress zaddr = pd.payload.zaddr; + CZCPaymentAddress address; + if (!address.Set(zaddr)) { + errs.push_back("Payment disclosure refers to an invalid payment address"); + } else { + o.push_back(Pair("paymentAddress", address.ToString())); + + try { + // Decrypt the note to get value and memo field + JSDescription jsdesc = tx.vjoinsplit[pd.payload.js]; + uint256 h_sig = jsdesc.h_sig(*pzcashParams, tx.joinSplitPubKey); + + ZCPaymentDisclosureNoteDecryption decrypter; + + ZCNoteEncryption::Ciphertext ciphertext = jsdesc.ciphertexts[pd.payload.n]; + + uint256 pk_enc = zaddr.pk_enc; + auto plaintext = decrypter.decryptWithEsk(ciphertext, pk_enc, pd.payload.esk, h_sig, pd.payload.n); + + CDataStream ssPlain(SER_NETWORK, PROTOCOL_VERSION); + ssPlain << plaintext; + NotePlaintext npt; + ssPlain >> npt; + + string memoHexString = HexStr(npt.memo.data(), npt.memo.data() + npt.memo.size()); + o.push_back(Pair("memo", memoHexString)); + o.push_back(Pair("value", ValueFromAmount(npt.value))); + + // Check the blockchain commitment matches decrypted note commitment + uint256 cm_blockchain = jsdesc.commitments[pd.payload.n]; + Note note = npt.note(zaddr); + uint256 cm_decrypted = note.cm(); + bool cm_match = (cm_decrypted == cm_blockchain); + o.push_back(Pair("commitmentMatch", cm_match)); + if (!cm_match) { + errs.push_back("Commitment derived from payment disclosure does not match blockchain commitment"); + } + } catch (const std::exception &e) { + errs.push_back(string("Error while decrypting payment disclosure note: ") + string(e.what()) ); + } + } + + bool isValid = errs.empty(); + o.push_back(Pair("valid", isValid)); + if (!isValid) { + o.push_back(Pair("errors", errs)); + } + + return o; +} diff --git a/src/zcash/JoinSplit.cpp b/src/zcash/JoinSplit.cpp index 590700cd9..9a7fe69db 100644 --- a/src/zcash/JoinSplit.cpp +++ b/src/zcash/JoinSplit.cpp @@ -198,7 +198,8 @@ public: uint64_t vpub_old, uint64_t vpub_new, const uint256& rt, - bool computeProof + bool computeProof, + uint256 *out_esk // Payment disclosure ) { if (computeProof && !pk) { throw std::runtime_error("JoinSplit proving key not loaded"); @@ -303,6 +304,12 @@ public: } out_ephemeralKey = encryptor.get_epk(); + + // !!! Payment disclosure START + if (out_esk != nullptr) { + *out_esk = encryptor.get_esk(); + } + // !!! Payment disclosure END } // Authenticate h_sig with each of the input diff --git a/src/zcash/JoinSplit.hpp b/src/zcash/JoinSplit.hpp index a8c08d21b..c6c256129 100644 --- a/src/zcash/JoinSplit.hpp +++ b/src/zcash/JoinSplit.hpp @@ -78,7 +78,11 @@ public: uint64_t vpub_old, uint64_t vpub_new, const uint256& rt, - bool computeProof = true + bool computeProof = true, + // For paymentdisclosure, we need to retrieve the esk. + // Reference as non-const parameter with default value leads to compile error. + // So use pointer for simplicity. + uint256 *out_esk = nullptr ) = 0; virtual bool verify( diff --git a/src/zcash/NoteEncryption.cpp b/src/zcash/NoteEncryption.cpp index a5ea2da15..9ae0ba5c3 100644 --- a/src/zcash/NoteEncryption.cpp +++ b/src/zcash/NoteEncryption.cpp @@ -135,6 +135,52 @@ typename NoteDecryption::Plaintext NoteDecryption::decrypt return plaintext; } +// +// Payment disclosure - decrypt with esk +// +template +typename PaymentDisclosureNoteDecryption::Plaintext PaymentDisclosureNoteDecryption::decryptWithEsk + (const PaymentDisclosureNoteDecryption::Ciphertext &ciphertext, + const uint256 &pk_enc, + const uint256 &esk, + const uint256 &hSig, + unsigned char nonce + ) const +{ + uint256 dhsecret; + + if (crypto_scalarmult(dhsecret.begin(), esk.begin(), pk_enc.begin()) != 0) { + throw std::logic_error("Could not create DH secret"); + } + + // Regenerate keypair + uint256 epk = NoteEncryption::generate_pubkey(esk); + + unsigned char K[NOTEENCRYPTION_CIPHER_KEYSIZE]; + KDF(K, dhsecret, epk, pk_enc, hSig, nonce); + + // The nonce is zero because we never reuse keys + unsigned char cipher_nonce[crypto_aead_chacha20poly1305_IETF_NPUBBYTES] = {}; + + PaymentDisclosureNoteDecryption::Plaintext plaintext; + + // Message length is always NOTEENCRYPTION_AUTH_BYTES less than + // the ciphertext length. + if (crypto_aead_chacha20poly1305_ietf_decrypt(plaintext.begin(), NULL, + NULL, + ciphertext.begin(), PaymentDisclosureNoteDecryption::CLEN, + NULL, + 0, + cipher_nonce, K) != 0) { + throw note_decryption_failed(); + } + + return plaintext; +} + + + + template uint256 NoteEncryption::generate_privkey(const uint252 &a_sk) { @@ -176,4 +222,6 @@ uint252 random_uint252() template class NoteEncryption; template class NoteDecryption; +template class PaymentDisclosureNoteDecryption; + } diff --git a/src/zcash/NoteEncryption.hpp b/src/zcash/NoteEncryption.hpp index 11346ebc1..321d7dead 100644 --- a/src/zcash/NoteEncryption.hpp +++ b/src/zcash/NoteEncryption.hpp @@ -31,6 +31,11 @@ public: NoteEncryption(uint256 hSig); + // Gets the ephemeral secret key + uint256 get_esk() { + return esk; + } + // Gets the ephemeral public key uint256 get_epk() { return epk; @@ -87,9 +92,34 @@ public: note_decryption_failed() : std::runtime_error("Could not decrypt message") { } }; + + +// Subclass PaymentDisclosureNoteDecryption provides a method to decrypt a note with esk. +template +class PaymentDisclosureNoteDecryption : public NoteDecryption { +protected: +public: + enum { CLEN=MLEN+NOTEENCRYPTION_AUTH_BYTES }; + typedef boost::array Ciphertext; + typedef boost::array Plaintext; + + PaymentDisclosureNoteDecryption() : NoteDecryption() {} + PaymentDisclosureNoteDecryption(uint256 sk_enc) : NoteDecryption(sk_enc) {} + + Plaintext decryptWithEsk( + const Ciphertext &ciphertext, + const uint256 &pk_enc, + const uint256 &esk, + const uint256 &hSig, + unsigned char nonce + ) const; +}; + } typedef libzcash::NoteEncryption ZCNoteEncryption; typedef libzcash::NoteDecryption ZCNoteDecryption; +typedef libzcash::PaymentDisclosureNoteDecryption ZCPaymentDisclosureNoteDecryption; + #endif /* ZC_NOTE_ENCRYPTION_H_ */ From c5b04132bd5f97b17d5f03d56ecaeeee45e976eb Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 14 Nov 2017 23:53:45 +0000 Subject: [PATCH 0278/1062] make-release.py: Versioning changes for 1.0.13-rc1. --- README.md | 2 +- configure.ac | 4 ++-- contrib/gitian-descriptors/gitian-linux.yml | 2 +- src/clientversion.h | 4 ++-- src/deprecation.h | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 3d7501482..88774bb0d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Zcash 1.0.12 +Zcash 1.0.13-rc1 ============= What is Zcash? diff --git a/configure.ac b/configure.ac index f032e18d1..8cafa452d 100644 --- a/configure.ac +++ b/configure.ac @@ -2,8 +2,8 @@ dnl require autoconf 2.60 (AS_ECHO/AS_ECHO_N) AC_PREREQ([2.60]) define(_CLIENT_VERSION_MAJOR, 1) define(_CLIENT_VERSION_MINOR, 0) -define(_CLIENT_VERSION_REVISION, 12) -define(_CLIENT_VERSION_BUILD, 50) +define(_CLIENT_VERSION_REVISION, 13) +define(_CLIENT_VERSION_BUILD, 25) define(_ZC_BUILD_VAL, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, m4_incr(_CLIENT_VERSION_BUILD), m4_eval(_CLIENT_VERSION_BUILD < 50), 1, m4_eval(_CLIENT_VERSION_BUILD - 24), m4_eval(_CLIENT_VERSION_BUILD == 50), 1, , m4_eval(_CLIENT_VERSION_BUILD - 50))) define(_CLIENT_VERSION_SUFFIX, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, _CLIENT_VERSION_REVISION-beta$1, m4_eval(_CLIENT_VERSION_BUILD < 50), 1, _CLIENT_VERSION_REVISION-rc$1, m4_eval(_CLIENT_VERSION_BUILD == 50), 1, _CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION-$1))) define(_CLIENT_VERSION_IS_RELEASE, true) diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml index 74573b757..d558f0b75 100644 --- a/contrib/gitian-descriptors/gitian-linux.yml +++ b/contrib/gitian-descriptors/gitian-linux.yml @@ -1,5 +1,5 @@ --- -name: "zcash-1.0.12" +name: "zcash-1.0.13-rc1" enable_cache: true distro: "debian" suites: diff --git a/src/clientversion.h b/src/clientversion.h index b7eab7ae5..5ed4e142a 100644 --- a/src/clientversion.h +++ b/src/clientversion.h @@ -17,8 +17,8 @@ //! These need to be macros, as clientversion.cpp's and bitcoin*-res.rc's voodoo requires it #define CLIENT_VERSION_MAJOR 1 #define CLIENT_VERSION_MINOR 0 -#define CLIENT_VERSION_REVISION 12 -#define CLIENT_VERSION_BUILD 50 +#define CLIENT_VERSION_REVISION 13 +#define CLIENT_VERSION_BUILD 25 //! Set to true for release, false for prerelease or test build #define CLIENT_VERSION_IS_RELEASE true diff --git a/src/deprecation.h b/src/deprecation.h index 9d5111c1f..3b0dc5a40 100644 --- a/src/deprecation.h +++ b/src/deprecation.h @@ -8,7 +8,7 @@ // Deprecation policy: // * Shut down 18 weeks' worth of blocks after the estimated release block height. // * A warning is shown during the 2 weeks' worth of blocks prior to shut down. -static const int APPROX_RELEASE_HEIGHT = 192200; +static const int APPROX_RELEASE_HEIGHT = 219700; static const int WEEKS_UNTIL_DEPRECATION = 18; static const int DEPRECATION_HEIGHT = APPROX_RELEASE_HEIGHT + (WEEKS_UNTIL_DEPRECATION * 7 * 24 * 24); From 563f13cd931fbcc1bea688869e6eb9d35cfd520c Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 15 Nov 2017 00:02:07 +0000 Subject: [PATCH 0279/1062] make-release.py: Updated manpages for 1.0.13-rc1. --- doc/man/zcash-cli.1 | 10 +++++----- doc/man/zcash-tx.1 | 8 ++++---- doc/man/zcashd.1 | 12 ++++++------ 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/doc/man/zcash-cli.1 b/doc/man/zcash-cli.1 index 582316d28..184c07d07 100644 --- a/doc/man/zcash-cli.1 +++ b/doc/man/zcash-cli.1 @@ -1,12 +1,12 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASH-CLI "1" "September 2017" "zcash-cli v1.0.12" "User Commands" +.TH ZCASH-CLI "1" "November 2017" "zcash-cli v1.0.13-rc1" "User Commands" .SH NAME -zcash-cli \- manual page for zcash-cli v1.0.12 +zcash-cli \- manual page for zcash-cli v1.0.13-rc1 .SH DESCRIPTION -Zcash RPC client version v1.0.12 +Zcash RPC client version v1.0.13\-rc1 .PP In order to ensure you are adequately protecting your privacy when using Zcash, -please see . +please see . .SS "Usage:" .TP zcash\-cli [options] [params] @@ -68,7 +68,7 @@ Timeout in seconds during HTTP requests, or 0 for no timeout. (default: .SH COPYRIGHT In order to ensure you are adequately protecting your privacy when using Zcash, -please see . +please see . Copyright (C) 2009-2017 The Bitcoin Core Developers Copyright (C) 2015-2017 The Zcash Developers diff --git a/doc/man/zcash-tx.1 b/doc/man/zcash-tx.1 index 3a502969a..ecdfcc54d 100644 --- a/doc/man/zcash-tx.1 +++ b/doc/man/zcash-tx.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASH-TX "1" "September 2017" "zcash-tx v1.0.12" "User Commands" +.TH ZCASH-TX "1" "November 2017" "zcash-tx v1.0.13-rc1" "User Commands" .SH NAME -zcash-tx \- manual page for zcash-tx v1.0.12 +zcash-tx \- manual page for zcash-tx v1.0.13-rc1 .SH DESCRIPTION -Zcash zcash\-tx utility version v1.0.12 +Zcash zcash\-tx utility version v1.0.13\-rc1 .SS "Usage:" .TP zcash\-tx [options] [commands] @@ -86,7 +86,7 @@ Set register NAME to given JSON\-STRING .SH COPYRIGHT In order to ensure you are adequately protecting your privacy when using Zcash, -please see . +please see . Copyright (C) 2009-2017 The Bitcoin Core Developers Copyright (C) 2015-2017 The Zcash Developers diff --git a/doc/man/zcashd.1 b/doc/man/zcashd.1 index 70c6e57f1..73fb71760 100644 --- a/doc/man/zcashd.1 +++ b/doc/man/zcashd.1 @@ -1,12 +1,12 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASHD "1" "September 2017" "zcashd v1.0.12" "User Commands" +.TH ZCASHD "1" "November 2017" "zcashd v1.0.13-rc1" "User Commands" .SH NAME -zcashd \- manual page for zcashd v1.0.12 +zcashd \- manual page for zcashd v1.0.13-rc1 .SH DESCRIPTION -Zcash Daemon version v1.0.12 +Zcash Daemon version v1.0.13\-rc1 .PP In order to ensure you are adequately protecting your privacy when using Zcash, -please see . +please see . .SS "Usage:" .TP zcashd [options] @@ -54,7 +54,7 @@ Specify data directory \fB\-disabledeprecation=\fR .IP Disable block\-height node deprecation and automatic shutdown (example: -\fB\-disabledeprecation\fR=\fI\,1\/\fR.0.12) +\fB\-disabledeprecation\fR=\fI\,1\/\fR.0.13\-rc1) .HP \fB\-exportdir=\fR .IP @@ -462,7 +462,7 @@ console, 600 otherwise) .SH COPYRIGHT In order to ensure you are adequately protecting your privacy when using Zcash, -please see . +please see . Copyright (C) 2009-2017 The Bitcoin Core Developers Copyright (C) 2015-2017 The Zcash Developers From cbd823ae5947b7f36e241284d99e97ce36dcdd6f Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 15 Nov 2017 00:02:21 +0000 Subject: [PATCH 0280/1062] make-release.py: Updated release notes and changelog for 1.0.13-rc1. --- contrib/debian/changelog | 6 ++ doc/authors.md | 21 +++-- doc/release-notes/release-notes-1.0.13-rc1.md | 87 +++++++++++++++++++ 3 files changed, 105 insertions(+), 9 deletions(-) create mode 100644 doc/release-notes/release-notes-1.0.13-rc1.md diff --git a/contrib/debian/changelog b/contrib/debian/changelog index 131627614..f5e93234b 100644 --- a/contrib/debian/changelog +++ b/contrib/debian/changelog @@ -1,3 +1,9 @@ +zcash (1.0.13~rc1) stable; urgency=medium + + * 1.0.13-rc1 release. + + -- Zcash Company Wed, 15 Nov 2017 00:02:21 +0000 + zcash (1.0.12) stable; urgency=medium * 1.0.12 release. diff --git a/doc/authors.md b/doc/authors.md index ce6dc0e9f..b57e6e8ad 100644 --- a/doc/authors.md +++ b/doc/authors.md @@ -1,18 +1,18 @@ Zcash Contributors ================== -Jack Grigg (470) -Simon Liu (274) -Sean Bowe (188) +Jack Grigg (506) +Simon Liu (281) +Sean Bowe (193) Daira Hopwood (102) +Wladimir J. van der Laan (65) Taylor Hornby (65) -Wladimir J. van der Laan (61) Nathan Wilcox (56) -Jay Graber (49) +Jay Graber (50) Jonas Schnelli (48) Kevin Gallagher (38) Pieter Wuille (16) -Cory Fields (15) +Cory Fields (16) nomnombtc (9) Paige Peterson (9) fanquake (5) @@ -27,10 +27,11 @@ Karl-Johan Alm (4) Jeff Garzik (4) David Mercer (4) Daniel Cousens (4) +Ariel Gabizon (4) lpescher (3) kozyilmaz (3) Pavel Janík (3) -Ariel Gabizon (3) +João Barbosa (3) Alfie John (3) str4d (2) paveljanik (2) @@ -39,8 +40,8 @@ aniemerg (2) Scott (2) Robert C. Seacord (2) Luke Dashjr (2) -João Barbosa (2) Joe Turgeon (2) +Jason Davies (2) Jack Gavigan (2) ITH4Coinomia (2) Gavin Andresen (2) @@ -73,20 +74,22 @@ Leo Arias (1) Lars-Magnus Skog (1) Kevin Pan (1) Jorge Timón (1) +Jonathan "Duke" Leto (1) Jeffrey Walton (1) -Jason Davies (1) Ian Kelling (1) Gaurav Rana (1) Forrest Voight (1) Florian Schmaus (1) Ethan Heilman (1) Eran Tromer (1) +Duke Leto (1) Daniel Kraft (1) Christian von Roques (1) Chirag Davé (1) Casey Rodarmor (1) Cameron Boehmer (1) Bryan Stitt (1) +Bruno Arueira (1) Boris Hajduk (1) Bob McElrath (1) Bitcoin Error Log (1) diff --git a/doc/release-notes/release-notes-1.0.13-rc1.md b/doc/release-notes/release-notes-1.0.13-rc1.md new file mode 100644 index 000000000..0f6056470 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.13-rc1.md @@ -0,0 +1,87 @@ +Changelog +========= + +Ariel Gabizon (1): + boost::format -> tinyformat + +Bruno Arueira (1): + Removes out bitcoin mention in favor for zcash + +Cory Fields (1): + httpserver: explicitly detach worker threads + +Duke Leto (1): + Update performance-measurements.sh + +Jack Grigg (36): + Squashed 'src/snark/' content from commit 9ada3f8 + Add libsnark compile flag to not copy DEPINST to PREFIX + Add Ansible playbook for grind workers + Add connections in BIP65 and BIP66 tests to the test manager + Add benchmark for listunspent + [Test] MiniNode: Implement JSDescription parsing + [Test] MiniNode: Implement v2 CTransaction parsing + [Test] MiniNode: Implement Zcash block parsing + [Test] MiniNode: Update protocol version and network magics + [Test] MiniNode: Use Zcash PoW + [Test] MiniNode: Fix coinbase creation + [Test] MiniNode: Coerce OP_PUSHDATA bytearrays to bytes + [Test] MiniNode: Implement Zcash coinbase + Fix BIP65 and BIP66 tests + Un-indent RPC test output in test runner + Replace full-test-suite.sh with a new test suite driver script + Move ensure-no-dot-so-in-depends.py into full_test_suite.py + Move check-security-hardening.sh into full_test_suite.py + Add memory benchmark for validatelargetx + Migrate libsnark test code to Google Test + Remove test code corresponding to removed code + Add alt_bn128 to QAP and Merkle tree gadget tests + Update libsnark LDLIBS + Add "make check" to libsnark that runs the Google Tests + Add "make libsnark-tests" that runs libsnark's "make check" + Changes to get test_r1cs_ppzksnark passing + Add bitcoin-util-test.py to full_test_suite.py + Add stdout notice if any stage fails + Add libsnark to "make clean" + Ensure that libsnark is built first, so its headers are available + Remove OpenSSL libraries from libsnark LDLIBS + Add libsnark tests to full_test_suite.py + Add --list-stages argument to full_test_suite.py + Fix NPE in rpc_wallet_tests + make-release.py: Versioning changes for 1.0.13-rc1. + make-release.py: Updated manpages for 1.0.13-rc1. + +Jason Davies (1): + Replace "bitcoin" with "Zcash". + +Jay Graber (1): + s/zcash/Zcash + +Jonathan "Duke" Leto (1): + Fix bug where performance-measurements.sh fails hards when given no args + +João Barbosa (1): + Improve shutdown process + +Sean Bowe (5): + Remove libsnark from depends system and integrate it into build system. + Remove crusty old "loadVerifyingKey"/"loadProvingKey" APIs and associated invariants. + Refactor proof generation function. + Add streaming prover. + Integrate low memory prover. + +Simon Liu (7): + Replace 'bitcoin address' with 'zcash address'. + Closes #2639. z_shieldcoinbase is now supported, no longer experimental. + Closes #2263 fixing broken pipe error. + Closes #2576. Update link to security info on z.cash website. + Closes #2639. Adds optional limit parameter with a default value of 50. + Fix an issue where qa test wallet_shieldcoinbase could hang. + Add payment disclosure as experimental feature. + +Wladimir J. van der Laan (4): + Make HTTP server shutdown more graceful + http: Wait for worker threads to exit + http: Force-exit event loop after predefined time + http: speed up shutdown + From 66a9fd8b72103aa4ad907faf8c277f4c5b970f52 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 15 Nov 2017 00:37:02 +0000 Subject: [PATCH 0281/1062] Change auto-senescence cycle to 16 weeks Closes #2686 --- doc/release-notes/release-notes-1.0.13-rc1.md | 1 + src/deprecation.h | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/release-notes/release-notes-1.0.13-rc1.md b/doc/release-notes/release-notes-1.0.13-rc1.md index 0f6056470..90e2306ad 100644 --- a/doc/release-notes/release-notes-1.0.13-rc1.md +++ b/doc/release-notes/release-notes-1.0.13-rc1.md @@ -50,6 +50,7 @@ Jack Grigg (36): Fix NPE in rpc_wallet_tests make-release.py: Versioning changes for 1.0.13-rc1. make-release.py: Updated manpages for 1.0.13-rc1. + Change auto-senescence cycle to 16 weeks Jason Davies (1): Replace "bitcoin" with "Zcash". diff --git a/src/deprecation.h b/src/deprecation.h index 3b0dc5a40..7ef715539 100644 --- a/src/deprecation.h +++ b/src/deprecation.h @@ -6,10 +6,10 @@ #define ZCASH_DEPRECATION_H // Deprecation policy: -// * Shut down 18 weeks' worth of blocks after the estimated release block height. +// * Shut down 16 weeks' worth of blocks after the estimated release block height. // * A warning is shown during the 2 weeks' worth of blocks prior to shut down. static const int APPROX_RELEASE_HEIGHT = 219700; -static const int WEEKS_UNTIL_DEPRECATION = 18; +static const int WEEKS_UNTIL_DEPRECATION = 16; static const int DEPRECATION_HEIGHT = APPROX_RELEASE_HEIGHT + (WEEKS_UNTIL_DEPRECATION * 7 * 24 * 24); // Number of blocks before deprecation to warn users From 83bef3fcbe13414b3b3d8a25bf3c2e65af9fea43 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 15 Nov 2017 10:14:19 +0000 Subject: [PATCH 0282/1062] Move libsnark from DIST_SUBDIRS into EXTRA_DIST --- src/Makefile.am | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index 5b80b724f..e9f10232c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,4 +1,4 @@ -DIST_SUBDIRS = secp256k1 snark univalue +DIST_SUBDIRS = secp256k1 univalue AM_LDFLAGS = $(PTHREAD_CFLAGS) $(LIBTOOL_LDFLAGS) @@ -553,7 +553,7 @@ CLEANFILES = leveldb/libleveldb.a leveldb/libmemenv.a *.gcda *.gcno */*.gcno wal DISTCLEANFILES = obj/build.h -EXTRA_DIST = leveldb +EXTRA_DIST = leveldb snark clean-local: -$(MAKE) -C leveldb clean From 8f23c734e6484a9ee37e857c5225202a581d2123 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 15 Nov 2017 14:39:57 +0000 Subject: [PATCH 0283/1062] Pass correct dependencies path to libsnark from both Gitian and build.sh --- configure.ac | 10 +++++++++- src/Makefile.am | 4 ++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index 8cafa452d..8c30efcfe 100644 --- a/configure.ac +++ b/configure.ac @@ -762,6 +762,14 @@ if test x$enable_rust != xno; then RUST_LIBS="-lrustzcash" fi +# Gitian uses a config.site that sets depends_prefix, and then sets --prefix=/ +# build.sh just uses --prefix +if test x$depends_prefix != x; then + LIBSNARK_DEPINST="$depends_prefix" +else + LIBSNARK_DEPINST="$prefix" +fi + LIBZCASH_LIBS="-lgmp -lgmpxx -lboost_system-mt -lcrypto -lsodium -fopenmp $RUST_LIBS" CXXFLAGS_TEMP="$CXXFLAGS" @@ -897,7 +905,7 @@ AC_SUBST(TESTDEFS) AC_SUBST(LEVELDB_TARGET_FLAGS) AC_SUBST(GMP_LIBS) AC_SUBST(GMPXX_LIBS) -AC_SUBST(LIBSNARK_LIBS) +AC_SUBST(LIBSNARK_DEPINST) AC_SUBST(LIBZCASH_LIBS) AC_SUBST(PROTON_LIBS) AC_CONFIG_FILES([Makefile src/Makefile doc/man/Makefile share/setup.nsi src/test/buildenv.py]) diff --git a/src/Makefile.am b/src/Makefile.am index e9f10232c..ea745a1f7 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -49,10 +49,10 @@ LIBSNARK_CXXFLAGS = -fPIC -DBINARY_OUTPUT -DNO_PT_COMPRESSION=1 LIBSNARK_CONFIG_FLAGS = CURVE=ALT_BN128 MULTICORE=1 NO_PROCPS=1 NO_DOCS=1 STATIC=1 NO_SUPERCOP=1 FEATUREFLAGS=-DMONTGOMERY_OUTPUT NO_COPY_DEPINST=1 $(LIBSNARK): $(wildcard snark/src/*) - $(AM_V_at) CXXFLAGS="$(LIBSNARK_CXXFLAGS)" $(MAKE) $(AM_MAKEFLAGS) -C snark/ install PREFIX=$(srcdir)/build DEPINST=$(prefix) $(LIBSNARK_CONFIG_FLAGS) OPTFLAGS="-O2 -march=x86-64" + $(AM_V_at) CXXFLAGS="$(LIBSNARK_CXXFLAGS)" $(MAKE) $(AM_MAKEFLAGS) -C snark/ install PREFIX=$(srcdir)/build DEPINST="$(LIBSNARK_DEPINST)" $(LIBSNARK_CONFIG_FLAGS) OPTFLAGS="-O2 -march=x86-64" libsnark-tests: $(wildcard snark/src/*) - $(AM_V_at) CXXFLAGS="$(LIBSNARK_CXXFLAGS)" $(MAKE) $(AM_MAKEFLAGS) -C snark/ check PREFIX=$(srcdir)/build DEPINST=$(prefix) $(LIBSNARK_CONFIG_FLAGS) OPTFLAGS="-O2 -march=x86-64" + $(AM_V_at) CXXFLAGS="$(LIBSNARK_CXXFLAGS)" $(MAKE) $(AM_MAKEFLAGS) -C snark/ check PREFIX=$(srcdir)/build DEPINST="$(LIBSNARK_DEPINST)" $(LIBSNARK_CONFIG_FLAGS) OPTFLAGS="-O2 -march=x86-64" $(LIBUNIVALUE): $(wildcard univalue/lib/*) $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C univalue/ From fee88353885147111bcca69c817a5339abd76109 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 15 Nov 2017 16:49:10 +0000 Subject: [PATCH 0284/1062] Mark libsnark includes as library includes --- src/gtest/main.cpp | 6 +++--- src/gtest/test_circuit.cpp | 9 +++++---- src/gtest/test_merkletree.cpp | 8 ++++---- src/gtest/test_proofs.cpp | 7 +++---- src/init.cpp | 2 +- src/zcash/CreateJoinSplit.cpp | 3 ++- src/zcash/JoinSplit.cpp | 8 ++++---- src/zcash/Proof.cpp | 10 +++++----- 8 files changed, 27 insertions(+), 26 deletions(-) diff --git a/src/gtest/main.cpp b/src/gtest/main.cpp index a0a2e0042..0b6e1ad08 100644 --- a/src/gtest/main.cpp +++ b/src/gtest/main.cpp @@ -1,12 +1,12 @@ #include "gtest/gtest.h" #include "crypto/common.h" #include "pubkey.h" - -#include "libsnark/common/default_types/r1cs_ppzksnark_pp.hpp" -#include "libsnark/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.hpp" #include "zcash/JoinSplit.hpp" #include "util.h" +#include +#include + struct ECCryptoClosure { ECCVerifyHandle handle; diff --git a/src/gtest/test_circuit.cpp b/src/gtest/test_circuit.cpp index f8a0416a7..2cc9dbcbb 100644 --- a/src/gtest/test_circuit.cpp +++ b/src/gtest/test_circuit.cpp @@ -7,10 +7,11 @@ #include #include -#include "libsnark/common/default_types/r1cs_ppzksnark_pp.hpp" -#include "libsnark/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.hpp" -#include "libsnark/gadgetlib1/gadgets/hashes/sha256/sha256_gadget.hpp" -#include "libsnark/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_read_gadget.hpp" +#include +#include +#include +#include + #include "zcash/IncrementalMerkleTree.hpp" using namespace libsnark; diff --git a/src/gtest/test_merkletree.cpp b/src/gtest/test_merkletree.cpp index 6bac9ab3c..d603b0aa6 100644 --- a/src/gtest/test_merkletree.cpp +++ b/src/gtest/test_merkletree.cpp @@ -19,10 +19,10 @@ #include "zcash/IncrementalMerkleTree.hpp" #include "zcash/util.h" -#include "libsnark/common/default_types/r1cs_ppzksnark_pp.hpp" -#include "libsnark/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.hpp" -#include "libsnark/gadgetlib1/gadgets/hashes/sha256/sha256_gadget.hpp" -#include "libsnark/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_read_gadget.hpp" +#include +#include +#include +#include #include diff --git a/src/gtest/test_proofs.cpp b/src/gtest/test_proofs.cpp index cf097d716..e33b1cc0c 100644 --- a/src/gtest/test_proofs.cpp +++ b/src/gtest/test_proofs.cpp @@ -3,10 +3,9 @@ #include -#include "libsnark/common/default_types/r1cs_ppzksnark_pp.hpp" -#include "libsnark/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.hpp" -#include "zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.hpp" -#include "relations/constraint_satisfaction_problems/r1cs/examples/r1cs_examples.hpp" +#include +#include +#include using namespace libzcash; diff --git a/src/init.cpp b/src/init.cpp index fe7f17009..7df31ab1b 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -53,7 +53,7 @@ #include #include -#include "libsnark/common/profiling.hpp" +#include #if ENABLE_ZMQ #include "zmq/zmqnotificationinterface.h" diff --git a/src/zcash/CreateJoinSplit.cpp b/src/zcash/CreateJoinSplit.cpp index 7253e9568..bcf9a218e 100644 --- a/src/zcash/CreateJoinSplit.cpp +++ b/src/zcash/CreateJoinSplit.cpp @@ -5,7 +5,8 @@ #include "../util.h" #include "primitives/transaction.h" #include "zcash/JoinSplit.hpp" -#include "libsnark/common/profiling.hpp" + +#include using namespace libzcash; diff --git a/src/zcash/JoinSplit.cpp b/src/zcash/JoinSplit.cpp index ab2059238..2685569d3 100644 --- a/src/zcash/JoinSplit.cpp +++ b/src/zcash/JoinSplit.cpp @@ -10,10 +10,10 @@ #include #include #include -#include "libsnark/common/default_types/r1cs_ppzksnark_pp.hpp" -#include "libsnark/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.hpp" -#include "libsnark/gadgetlib1/gadgets/hashes/sha256/sha256_gadget.hpp" -#include "libsnark/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_read_gadget.hpp" +#include +#include +#include +#include #include "tinyformat.h" #include "sync.h" #include "amount.h" diff --git a/src/zcash/Proof.cpp b/src/zcash/Proof.cpp index 1b2199407..e7264e684 100644 --- a/src/zcash/Proof.cpp +++ b/src/zcash/Proof.cpp @@ -1,11 +1,11 @@ #include "Proof.hpp" -#include -#include - #include "crypto/common.h" -#include "libsnark/common/default_types/r1cs_ppzksnark_pp.hpp" -#include "libsnark/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.hpp" + +#include +#include +#include +#include using namespace libsnark; From 051698a05c852793316810d3538fb4a84906d547 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 16 Nov 2017 22:37:38 +0000 Subject: [PATCH 0285/1062] Add the tar-pax option to automake This enables the tarball generated by "make dist" to contain file names longer than 99 characters. --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 8c30efcfe..8d18fb2a9 100644 --- a/configure.ac +++ b/configure.ac @@ -24,7 +24,7 @@ dnl faketime breaks configure and is only needed for make. Disable it here. unset FAKETIME dnl Automake init set-up and checks -AM_INIT_AUTOMAKE([no-define subdir-objects foreign]) +AM_INIT_AUTOMAKE([no-define subdir-objects foreign tar-pax]) dnl faketime messes with timestamps and causes configure to be re-run. dnl --disable-maintainer-mode can be used to bypass this. From ba1dbb3040cf678f9aee612fbfc23a336d5dbe6e Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 16 Nov 2017 22:29:37 -0800 Subject: [PATCH 0286/1062] RPC dumpwallet and z_exportwallet updated to no longer allow overwriting an existing file. --- qa/rpc-tests/walletbackup.py | 9 +++++++++ src/wallet/rpcdump.cpp | 8 ++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/qa/rpc-tests/walletbackup.py b/qa/rpc-tests/walletbackup.py index 37c1db9a5..78128ad49 100755 --- a/qa/rpc-tests/walletbackup.py +++ b/qa/rpc-tests/walletbackup.py @@ -34,6 +34,7 @@ and confirm again balances are correct. """ from test_framework.test_framework import BitcoinTestFramework +from test_framework.authproxy import JSONRPCException from test_framework.util import assert_equal, initialize_chain_clean, \ start_nodes, start_node, connect_nodes, stop_node, \ sync_blocks, sync_mempools @@ -141,6 +142,14 @@ class WalletBackupTest(BitcoinTestFramework): self.nodes[2].backupwallet("walletbak") self.nodes[2].dumpwallet("walletdump") + # Verify dumpwallet cannot overwrite an existing file + try: + self.nodes[2].dumpwallet("walletdump") + assert(False) + except JSONRPCException as e: + errorString = e.error['message'] + assert("Cannot overwrite existing file" in errorString) + logging.info("More transactions") for i in range(5): self.do_one_round() diff --git a/src/wallet/rpcdump.cpp b/src/wallet/rpcdump.cpp index fe5b83e8d..a02dfcb31 100644 --- a/src/wallet/rpcdump.cpp +++ b/src/wallet/rpcdump.cpp @@ -428,7 +428,7 @@ UniValue z_exportwallet(const UniValue& params, bool fHelp) if (fHelp || params.size() != 1) throw runtime_error( "z_exportwallet \"filename\"\n" - "\nExports all wallet keys, for taddr and zaddr, in a human-readable format.\n" + "\nExports all wallet keys, for taddr and zaddr, in a human-readable format. Overwriting an existing file is not permitted.\n" "\nArguments:\n" "1. \"filename\" (string, required) The filename, saved in folder set by zcashd -exportdir option\n" "\nResult:\n" @@ -449,7 +449,7 @@ UniValue dumpwallet(const UniValue& params, bool fHelp) if (fHelp || params.size() != 1) throw runtime_error( "dumpwallet \"filename\"\n" - "\nDumps taddr wallet keys in a human-readable format.\n" + "\nDumps taddr wallet keys in a human-readable format. Overwriting an existing file is not permitted.\n" "\nArguments:\n" "1. \"filename\" (string, required) The filename, saved in folder set by zcashd -exportdir option\n" "\nResult:\n" @@ -484,6 +484,10 @@ UniValue dumpwallet_impl(const UniValue& params, bool fHelp, bool fDumpZKeys) } boost::filesystem::path exportfilepath = exportdir / clean; + if (boost::filesystem::exists(exportfilepath)) { + throw JSONRPCError(RPC_INVALID_PARAMETER, "Cannot overwrite existing file " + exportfilepath.string()); + } + ofstream file; file.open(exportfilepath.string().c_str()); if (!file.is_open()) From e70c8d2ea31c0d55b46c411c28eb9a03c665b824 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 17 Nov 2017 17:49:28 +0000 Subject: [PATCH 0287/1062] make-release.py: Versioning changes for 1.0.13-rc2. --- README.md | 2 +- configure.ac | 2 +- contrib/gitian-descriptors/gitian-linux.yml | 2 +- src/clientversion.h | 2 +- src/deprecation.h | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 88774bb0d..42e3f77f6 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Zcash 1.0.13-rc1 +Zcash 1.0.13-rc2 ============= What is Zcash? diff --git a/configure.ac b/configure.ac index 8d18fb2a9..ce3303da4 100644 --- a/configure.ac +++ b/configure.ac @@ -3,7 +3,7 @@ AC_PREREQ([2.60]) define(_CLIENT_VERSION_MAJOR, 1) define(_CLIENT_VERSION_MINOR, 0) define(_CLIENT_VERSION_REVISION, 13) -define(_CLIENT_VERSION_BUILD, 25) +define(_CLIENT_VERSION_BUILD, 26) define(_ZC_BUILD_VAL, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, m4_incr(_CLIENT_VERSION_BUILD), m4_eval(_CLIENT_VERSION_BUILD < 50), 1, m4_eval(_CLIENT_VERSION_BUILD - 24), m4_eval(_CLIENT_VERSION_BUILD == 50), 1, , m4_eval(_CLIENT_VERSION_BUILD - 50))) define(_CLIENT_VERSION_SUFFIX, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, _CLIENT_VERSION_REVISION-beta$1, m4_eval(_CLIENT_VERSION_BUILD < 50), 1, _CLIENT_VERSION_REVISION-rc$1, m4_eval(_CLIENT_VERSION_BUILD == 50), 1, _CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION-$1))) define(_CLIENT_VERSION_IS_RELEASE, true) diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml index d558f0b75..e78daa268 100644 --- a/contrib/gitian-descriptors/gitian-linux.yml +++ b/contrib/gitian-descriptors/gitian-linux.yml @@ -1,5 +1,5 @@ --- -name: "zcash-1.0.13-rc1" +name: "zcash-1.0.13-rc2" enable_cache: true distro: "debian" suites: diff --git a/src/clientversion.h b/src/clientversion.h index 5ed4e142a..cd9919938 100644 --- a/src/clientversion.h +++ b/src/clientversion.h @@ -18,7 +18,7 @@ #define CLIENT_VERSION_MAJOR 1 #define CLIENT_VERSION_MINOR 0 #define CLIENT_VERSION_REVISION 13 -#define CLIENT_VERSION_BUILD 25 +#define CLIENT_VERSION_BUILD 26 //! Set to true for release, false for prerelease or test build #define CLIENT_VERSION_IS_RELEASE true diff --git a/src/deprecation.h b/src/deprecation.h index 7ef715539..530de67b9 100644 --- a/src/deprecation.h +++ b/src/deprecation.h @@ -8,7 +8,7 @@ // Deprecation policy: // * Shut down 16 weeks' worth of blocks after the estimated release block height. // * A warning is shown during the 2 weeks' worth of blocks prior to shut down. -static const int APPROX_RELEASE_HEIGHT = 219700; +static const int APPROX_RELEASE_HEIGHT = 221270; static const int WEEKS_UNTIL_DEPRECATION = 16; static const int DEPRECATION_HEIGHT = APPROX_RELEASE_HEIGHT + (WEEKS_UNTIL_DEPRECATION * 7 * 24 * 24); From 562b55bec1a01b520064973ffa2ce65dfa89fcc0 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 17 Nov 2017 18:00:32 +0000 Subject: [PATCH 0288/1062] make-release.py: Updated manpages for 1.0.13-rc2. --- doc/man/zcash-cli.1 | 6 +++--- doc/man/zcash-tx.1 | 6 +++--- doc/man/zcashd.1 | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/doc/man/zcash-cli.1 b/doc/man/zcash-cli.1 index 184c07d07..4d6081d3f 100644 --- a/doc/man/zcash-cli.1 +++ b/doc/man/zcash-cli.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASH-CLI "1" "November 2017" "zcash-cli v1.0.13-rc1" "User Commands" +.TH ZCASH-CLI "1" "November 2017" "zcash-cli v1.0.13-rc2" "User Commands" .SH NAME -zcash-cli \- manual page for zcash-cli v1.0.13-rc1 +zcash-cli \- manual page for zcash-cli v1.0.13-rc2 .SH DESCRIPTION -Zcash RPC client version v1.0.13\-rc1 +Zcash RPC client version v1.0.13\-rc2 .PP In order to ensure you are adequately protecting your privacy when using Zcash, please see . diff --git a/doc/man/zcash-tx.1 b/doc/man/zcash-tx.1 index ecdfcc54d..4baa0cd59 100644 --- a/doc/man/zcash-tx.1 +++ b/doc/man/zcash-tx.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASH-TX "1" "November 2017" "zcash-tx v1.0.13-rc1" "User Commands" +.TH ZCASH-TX "1" "November 2017" "zcash-tx v1.0.13-rc2" "User Commands" .SH NAME -zcash-tx \- manual page for zcash-tx v1.0.13-rc1 +zcash-tx \- manual page for zcash-tx v1.0.13-rc2 .SH DESCRIPTION -Zcash zcash\-tx utility version v1.0.13\-rc1 +Zcash zcash\-tx utility version v1.0.13\-rc2 .SS "Usage:" .TP zcash\-tx [options] [commands] diff --git a/doc/man/zcashd.1 b/doc/man/zcashd.1 index 73fb71760..d39345c68 100644 --- a/doc/man/zcashd.1 +++ b/doc/man/zcashd.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASHD "1" "November 2017" "zcashd v1.0.13-rc1" "User Commands" +.TH ZCASHD "1" "November 2017" "zcashd v1.0.13-rc2" "User Commands" .SH NAME -zcashd \- manual page for zcashd v1.0.13-rc1 +zcashd \- manual page for zcashd v1.0.13-rc2 .SH DESCRIPTION -Zcash Daemon version v1.0.13\-rc1 +Zcash Daemon version v1.0.13\-rc2 .PP In order to ensure you are adequately protecting your privacy when using Zcash, please see . @@ -54,7 +54,7 @@ Specify data directory \fB\-disabledeprecation=\fR .IP Disable block\-height node deprecation and automatic shutdown (example: -\fB\-disabledeprecation\fR=\fI\,1\/\fR.0.13\-rc1) +\fB\-disabledeprecation\fR=\fI\,1\/\fR.0.13\-rc2) .HP \fB\-exportdir=\fR .IP From 48ea914cd0ab31de322223a36ea6c07b108655e6 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 17 Nov 2017 18:01:08 +0000 Subject: [PATCH 0289/1062] make-release.py: Updated release notes and changelog for 1.0.13-rc2. --- contrib/debian/changelog | 6 ++++++ doc/authors.md | 2 +- doc/release-notes/release-notes-1.0.13-rc2.md | 11 +++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 doc/release-notes/release-notes-1.0.13-rc2.md diff --git a/contrib/debian/changelog b/contrib/debian/changelog index f5e93234b..835748fcb 100644 --- a/contrib/debian/changelog +++ b/contrib/debian/changelog @@ -1,3 +1,9 @@ +zcash (1.0.13~rc2) stable; urgency=medium + + * 1.0.13-rc2 release. + + -- Zcash Company Fri, 17 Nov 2017 18:01:08 +0000 + zcash (1.0.13~rc1) stable; urgency=medium * 1.0.13-rc1 release. diff --git a/doc/authors.md b/doc/authors.md index b57e6e8ad..2dbe9f661 100644 --- a/doc/authors.md +++ b/doc/authors.md @@ -1,7 +1,7 @@ Zcash Contributors ================== -Jack Grigg (506) +Jack Grigg (512) Simon Liu (281) Sean Bowe (193) Daira Hopwood (102) diff --git a/doc/release-notes/release-notes-1.0.13-rc2.md b/doc/release-notes/release-notes-1.0.13-rc2.md new file mode 100644 index 000000000..0b60ffc9a --- /dev/null +++ b/doc/release-notes/release-notes-1.0.13-rc2.md @@ -0,0 +1,11 @@ +Changelog +========= + +Jack Grigg (6): + Move libsnark from DIST_SUBDIRS into EXTRA_DIST + Pass correct dependencies path to libsnark from both Gitian and build.sh + Mark libsnark includes as library includes + Add the tar-pax option to automake + make-release.py: Versioning changes for 1.0.13-rc2. + make-release.py: Updated manpages for 1.0.13-rc2. + From 337a99a219690057d1a4da4bb15a0ac6db2ffc53 Mon Sep 17 00:00:00 2001 From: Jay Graber Date: Mon, 13 Nov 2017 14:44:11 -0800 Subject: [PATCH 0290/1062] Add cli and rpc examples for z_sendmany --- src/rpcmisc.cpp | 3 ++- src/wallet/rpcwallet.cpp | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/rpcmisc.cpp b/src/rpcmisc.cpp index b2bc1aefe..96dbb756a 100644 --- a/src/rpcmisc.cpp +++ b/src/rpcmisc.cpp @@ -224,7 +224,8 @@ UniValue z_validateaddress(const UniValue& params, bool fHelp) "}\n" "\nExamples:\n" - + HelpExampleCli("validateaddress", "\"zcWsmqT4X2V4jgxbgiCzyrAfRT1vi1F4sn7M5Pkh66izzw8Uk7LBGAH3DtcSMJeUb2pi3W4SQF8LMKkU2cUuVP68yAGcomL\"") + + HelpExampleCli("z_validateaddress", "\"zcWsmqT4X2V4jgxbgiCzyrAfRT1vi1F4sn7M5Pkh66izzw8Uk7LBGAH3DtcSMJeUb2pi3W4SQF8LMKkU2cUuVP68yAGcomL\"") + + HelpExampleRpc("z_validateaddress", "\"zcWsmqT4X2V4jgxbgiCzyrAfRT1vi1F4sn7M5Pkh66izzw8Uk7LBGAH3DtcSMJeUb2pi3W4SQF8LMKkU2cUuVP68yAGcomL\"") ); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 034147f42..b9240a800 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -3053,6 +3053,9 @@ UniValue z_listreceivedbyaddress(const UniValue& params, bool fHelp) " \"amount\": xxxxx, (numeric) the amount of value in the note\n" " \"memo\": xxxxx, (string) hexademical string representation of memo field\n" "}\n" + "\nExamples:\n" + + HelpExampleCli("z_listreceivedbyaddress", "\"ztfaW34Gj9FrnGUEf833ywDVL62NWXBM81u6EQnM6VR45eYnXhwztecW1SjxA7JrmAXKJhxhj3vDNEpVCQoSvVoSpmbhtjf\"") + + HelpExampleRpc("z_listreceivedbyaddress", "\"ztfaW34Gj9FrnGUEf833ywDVL62NWXBM81u6EQnM6VR45eYnXhwztecW1SjxA7JrmAXKJhxhj3vDNEpVCQoSvVoSpmbhtjf\"") ); LOCK2(cs_main, pwalletMain->cs_wallet); @@ -3222,6 +3225,9 @@ UniValue z_getoperationresult(const UniValue& params, bool fHelp) "1. \"operationid\" (array, optional) A list of operation ids we are interested in. If not provided, examine all operations known to the node.\n" "\nResult:\n" "\" [object, ...]\" (array) A list of JSON objects\n" + "\nExamples:\n" + + HelpExampleCli("z_getoperationresult", "'[\"operationid\", ... ]'") + + HelpExampleRpc("z_getoperationresult", "'[\"operationid\", ... ]'") ); // This call will remove finished operations @@ -3242,6 +3248,9 @@ UniValue z_getoperationstatus(const UniValue& params, bool fHelp) "1. \"operationid\" (array, optional) A list of operation ids we are interested in. If not provided, examine all operations known to the node.\n" "\nResult:\n" "\" [object, ...]\" (array) A list of JSON objects\n" + "\nExamples:\n" + + HelpExampleCli("z_getoperationstatus", "'[\"operationid\", ... ]'") + + HelpExampleRpc("z_getoperationstatus", "'[\"operationid\", ... ]'") ); // This call is idempotent so we don't want to remove finished operations @@ -3342,6 +3351,9 @@ UniValue z_sendmany(const UniValue& params, bool fHelp) + strprintf("%s", FormatMoney(ASYNC_RPC_OPERATION_DEFAULT_MINERS_FEE)) + ") The fee amount to attach to this transaction.\n" "\nResult:\n" "\"operationid\" (string) An operationid to pass to z_getoperationstatus to get the result of the operation.\n" + "\nExamples:\n" + + HelpExampleCli("z_sendmany", "\"t1M72Sfpbz1BPpXFHz9m3CdqATR44Jvaydd\" '[{\"address\": \"ztfaW34Gj9FrnGUEf833ywDVL62NWXBM81u6EQnM6VR45eYnXhwztecW1SjxA7JrmAXKJhxhj3vDNEpVCQoSvVoSpmbhtjf\" ,\"amount\": 5.0}]'") + + HelpExampleRpc("z_sendmany", "\"t1M72Sfpbz1BPpXFHz9m3CdqATR44Jvaydd\", [{\"address\": \"ztfaW34Gj9FrnGUEf833ywDVL62NWXBM81u6EQnM6VR45eYnXhwztecW1SjxA7JrmAXKJhxhj3vDNEpVCQoSvVoSpmbhtjf\" ,\"amount\": 5.0}]") ); LOCK2(cs_main, pwalletMain->cs_wallet); @@ -3548,6 +3560,9 @@ UniValue z_shieldcoinbase(const UniValue& params, bool fHelp) " \"remainingUTXOs\": xxx (numeric) Number of coinbase utxos still available for shielding.\n" " \"remainingValue\": xxx (numeric) Value of coinbase utxos still available for shielding.\n" "}\n" + "\nExamples:\n" + + HelpExampleCli("z_shieldcoinbase", "\"t1M72Sfpbz1BPpXFHz9m3CdqATR44Jvaydd\" \"ztfaW34Gj9FrnGUEf833ywDVL62NWXBM81u6EQnM6VR45eYnXhwztecW1SjxA7JrmAXKJhxhj3vDNEpVCQoSvVoSpmbhtjf\"") + + HelpExampleRpc("z_shieldcoinbase", "\"t1M72Sfpbz1BPpXFHz9m3CdqATR44Jvaydd\", \"ztfaW34Gj9FrnGUEf833ywDVL62NWXBM81u6EQnM6VR45eYnXhwztecW1SjxA7JrmAXKJhxhj3vDNEpVCQoSvVoSpmbhtjf\"") ); LOCK2(cs_main, pwalletMain->cs_wallet); From 24902602f2f695a85dd364836b041ce5ec0a2565 Mon Sep 17 00:00:00 2001 From: syd Date: Sun, 19 Nov 2017 14:08:17 -0500 Subject: [PATCH 0291/1062] Upgrade googletest to 1.8.0 --- depends/packages/googlemock.mk | 20 -------------------- depends/packages/googletest.mk | 13 ++++++++----- depends/packages/packages.mk | 2 +- 3 files changed, 9 insertions(+), 26 deletions(-) delete mode 100644 depends/packages/googlemock.mk diff --git a/depends/packages/googlemock.mk b/depends/packages/googlemock.mk deleted file mode 100644 index 229dc3587..000000000 --- a/depends/packages/googlemock.mk +++ /dev/null @@ -1,20 +0,0 @@ -# url=https://github.com/google/googlemock/archive/release-1.7.0.tar.gz - -package=googlemock -$(package)_version=1.7.0 -$(package)_dependencies=googletest - -$(package)_download_path=https://github.com/google/$(package)/archive/ -$(package)_file_name=$(package)-$($(package)_version).tar.gz -$(package)_download_file=release-$($(package)_version).tar.gz -$(package)_sha256_hash=3f20b6acb37e5a98e8c4518165711e3e35d47deb6cdb5a4dd4566563b5efd232 - -define $(package)_build_cmds - $(MAKE) -C make GTEST_DIR='$(host_prefix)' CXXFLAGS='-fPIC' gmock-all.o -endef - - -define $(package)_stage_cmds - install -D ./make/gmock-all.o $($(package)_staging_dir)$(host_prefix)/lib/libgmock.a && \ - cp -a ./include $($(package)_staging_dir)$(host_prefix)/include -endef diff --git a/depends/packages/googletest.mk b/depends/packages/googletest.mk index 5133e64a1..94880efdb 100644 --- a/depends/packages/googletest.mk +++ b/depends/packages/googletest.mk @@ -1,15 +1,18 @@ package=googletest -$(package)_version=1.7.0 +$(package)_version=1.8.0 $(package)_download_path=https://github.com/google/$(package)/archive/ $(package)_file_name=$(package)-$($(package)_version).tar.gz $(package)_download_file=release-$($(package)_version).tar.gz -$(package)_sha256_hash=f73a6546fdf9fce9ff93a5015e0333a8af3062a152a9ad6bcb772c96687016cc +$(package)_sha256_hash=58a6f4277ca2bc8565222b3bbd58a177609e9c488e8a72649359ba51450db7d8 define $(package)_build_cmds - $(MAKE) -C make CXXFLAGS=-fPIC gtest.a + $(MAKE) -C googlemock/make CXXFLAGS=-fPIC gmock.a && \ + $(MAKE) -C googletest/make CXXFLAGS=-fPIC gtest.a endef define $(package)_stage_cmds - install -D ./make/gtest.a $($(package)_staging_dir)$(host_prefix)/lib/libgtest.a && \ - cp -a ./include $($(package)_staging_dir)$(host_prefix)/include + install -D ./googlemock/make/gmock.a $($(package)_staging_dir)$(host_prefix)/lib/libgmock.a && \ + install -D ./googletest/make/gtest.a $($(package)_staging_dir)$(host_prefix)/lib/libgtest.a && \ + cp -a ./googlemock/include $($(package)_staging_dir)$(host_prefix)/ && \ + cp -a ./googletest/include $($(package)_staging_dir)$(host_prefix)/ endef diff --git a/depends/packages/packages.mk b/depends/packages/packages.mk index 0b7905e4f..296323c8c 100644 --- a/depends/packages/packages.mk +++ b/depends/packages/packages.mk @@ -1,7 +1,7 @@ rust_packages := rust librustzcash proton_packages := proton zcash_packages := libgmp libsodium -packages := boost openssl libevent zeromq $(zcash_packages) googletest googlemock +packages := boost openssl libevent zeromq $(zcash_packages) googletest native_packages := native_ccache wallet_packages=bdb From 2d342736dcfd002966512788a419e6dabe899c61 Mon Sep 17 00:00:00 2001 From: syd Date: Mon, 20 Nov 2017 00:48:12 -0500 Subject: [PATCH 0292/1062] Get the sec-hard tests to run correctly. This fixes the way arguments were passed to security-check, and also a typo in how BIND_NOW was being searched for in a list. Also fix how symbol-check is invoked although that script isn't currently used. --- contrib/devtools/security-check.py | 2 +- src/Makefile.am | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/contrib/devtools/security-check.py b/contrib/devtools/security-check.py index 301fea85c..84e7fceea 100755 --- a/contrib/devtools/security-check.py +++ b/contrib/devtools/security-check.py @@ -94,7 +94,7 @@ def check_ELF_RELRO(executable): raise IOError('Error opening file') for line in stdout.split(b'\n'): tokens = line.split() - if len(tokens)>1 and tokens[1] == b'(BIND_NOW)' or (len(tokens)>2 and tokens[1] == b'(FLAGS)' and b'BIND_NOW' in tokens[2]): + if len(tokens)>1 and tokens[1] == b'(BIND_NOW)' or (len(tokens)>2 and tokens[1] == b'(FLAGS)' and b'BIND_NOW' in tokens[2:]): have_bindnow = True return have_gnu_relro and have_bindnow diff --git a/src/Makefile.am b/src/Makefile.am index ea745a1f7..1c741d055 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -573,13 +573,13 @@ clean-local: check-symbols: $(bin_PROGRAMS) if GLIBC_BACK_COMPAT @echo "Checking glibc back compat of [$(bin_PROGRAMS)]..." - $(AM_V_at) READELF=$(READELF) CPPFILT=$(CPPFILT) $(top_srcdir)/contrib/devtools/symbol-check.py < $(bin_PROGRAMS) + $(AM_V_at) READELF=$(READELF) CPPFILT=$(CPPFILT) $(top_srcdir)/contrib/devtools/symbol-check.py $(bin_PROGRAMS) endif check-security: $(bin_PROGRAMS) if HARDEN @echo "Checking binary security of [$(bin_PROGRAMS)]..." - $(AM_V_at) READELF=$(READELF) OBJDUMP=$(OBJDUMP) $(top_srcdir)/contrib/devtools/security-check.py < $(bin_PROGRAMS) + $(AM_V_at) READELF=$(READELF) OBJDUMP=$(OBJDUMP) $(top_srcdir)/contrib/devtools/security-check.py $(bin_PROGRAMS) endif %.pb.cc %.pb.h: %.proto From 0523d21d22aedf28842e7553a0f614cd9c7b5e24 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Mon, 20 Nov 2017 12:23:45 +0000 Subject: [PATCH 0293/1062] make-release.py: Versioning changes for 1.0.13. --- README.md | 2 +- configure.ac | 2 +- contrib/gitian-descriptors/gitian-linux.yml | 2 +- src/clientversion.h | 2 +- src/deprecation.h | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 42e3f77f6..2efce727a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Zcash 1.0.13-rc2 +Zcash 1.0.13 ============= What is Zcash? diff --git a/configure.ac b/configure.ac index ce3303da4..3eca0a24d 100644 --- a/configure.ac +++ b/configure.ac @@ -3,7 +3,7 @@ AC_PREREQ([2.60]) define(_CLIENT_VERSION_MAJOR, 1) define(_CLIENT_VERSION_MINOR, 0) define(_CLIENT_VERSION_REVISION, 13) -define(_CLIENT_VERSION_BUILD, 26) +define(_CLIENT_VERSION_BUILD, 50) define(_ZC_BUILD_VAL, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, m4_incr(_CLIENT_VERSION_BUILD), m4_eval(_CLIENT_VERSION_BUILD < 50), 1, m4_eval(_CLIENT_VERSION_BUILD - 24), m4_eval(_CLIENT_VERSION_BUILD == 50), 1, , m4_eval(_CLIENT_VERSION_BUILD - 50))) define(_CLIENT_VERSION_SUFFIX, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, _CLIENT_VERSION_REVISION-beta$1, m4_eval(_CLIENT_VERSION_BUILD < 50), 1, _CLIENT_VERSION_REVISION-rc$1, m4_eval(_CLIENT_VERSION_BUILD == 50), 1, _CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION-$1))) define(_CLIENT_VERSION_IS_RELEASE, true) diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml index e78daa268..3096a7f0d 100644 --- a/contrib/gitian-descriptors/gitian-linux.yml +++ b/contrib/gitian-descriptors/gitian-linux.yml @@ -1,5 +1,5 @@ --- -name: "zcash-1.0.13-rc2" +name: "zcash-1.0.13" enable_cache: true distro: "debian" suites: diff --git a/src/clientversion.h b/src/clientversion.h index cd9919938..f1081d553 100644 --- a/src/clientversion.h +++ b/src/clientversion.h @@ -18,7 +18,7 @@ #define CLIENT_VERSION_MAJOR 1 #define CLIENT_VERSION_MINOR 0 #define CLIENT_VERSION_REVISION 13 -#define CLIENT_VERSION_BUILD 26 +#define CLIENT_VERSION_BUILD 50 //! Set to true for release, false for prerelease or test build #define CLIENT_VERSION_IS_RELEASE true diff --git a/src/deprecation.h b/src/deprecation.h index 530de67b9..434a81f36 100644 --- a/src/deprecation.h +++ b/src/deprecation.h @@ -8,7 +8,7 @@ // Deprecation policy: // * Shut down 16 weeks' worth of blocks after the estimated release block height. // * A warning is shown during the 2 weeks' worth of blocks prior to shut down. -static const int APPROX_RELEASE_HEIGHT = 221270; +static const int APPROX_RELEASE_HEIGHT = 222900; static const int WEEKS_UNTIL_DEPRECATION = 16; static const int DEPRECATION_HEIGHT = APPROX_RELEASE_HEIGHT + (WEEKS_UNTIL_DEPRECATION * 7 * 24 * 24); From 404de74fc6203d9963cc4c833342ba10baebb597 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Mon, 20 Nov 2017 12:31:33 +0000 Subject: [PATCH 0294/1062] make-release.py: Updated manpages for 1.0.13. --- doc/man/zcash-cli.1 | 6 +++--- doc/man/zcash-tx.1 | 6 +++--- doc/man/zcashd.1 | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/doc/man/zcash-cli.1 b/doc/man/zcash-cli.1 index 4d6081d3f..a77b67ffc 100644 --- a/doc/man/zcash-cli.1 +++ b/doc/man/zcash-cli.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASH-CLI "1" "November 2017" "zcash-cli v1.0.13-rc2" "User Commands" +.TH ZCASH-CLI "1" "November 2017" "zcash-cli v1.0.13" "User Commands" .SH NAME -zcash-cli \- manual page for zcash-cli v1.0.13-rc2 +zcash-cli \- manual page for zcash-cli v1.0.13 .SH DESCRIPTION -Zcash RPC client version v1.0.13\-rc2 +Zcash RPC client version v1.0.13 .PP In order to ensure you are adequately protecting your privacy when using Zcash, please see . diff --git a/doc/man/zcash-tx.1 b/doc/man/zcash-tx.1 index 4baa0cd59..fb54abf11 100644 --- a/doc/man/zcash-tx.1 +++ b/doc/man/zcash-tx.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASH-TX "1" "November 2017" "zcash-tx v1.0.13-rc2" "User Commands" +.TH ZCASH-TX "1" "November 2017" "zcash-tx v1.0.13" "User Commands" .SH NAME -zcash-tx \- manual page for zcash-tx v1.0.13-rc2 +zcash-tx \- manual page for zcash-tx v1.0.13 .SH DESCRIPTION -Zcash zcash\-tx utility version v1.0.13\-rc2 +Zcash zcash\-tx utility version v1.0.13 .SS "Usage:" .TP zcash\-tx [options] [commands] diff --git a/doc/man/zcashd.1 b/doc/man/zcashd.1 index d39345c68..e6ea1b8dc 100644 --- a/doc/man/zcashd.1 +++ b/doc/man/zcashd.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASHD "1" "November 2017" "zcashd v1.0.13-rc2" "User Commands" +.TH ZCASHD "1" "November 2017" "zcashd v1.0.13" "User Commands" .SH NAME -zcashd \- manual page for zcashd v1.0.13-rc2 +zcashd \- manual page for zcashd v1.0.13 .SH DESCRIPTION -Zcash Daemon version v1.0.13\-rc2 +Zcash Daemon version v1.0.13 .PP In order to ensure you are adequately protecting your privacy when using Zcash, please see . @@ -54,7 +54,7 @@ Specify data directory \fB\-disabledeprecation=\fR .IP Disable block\-height node deprecation and automatic shutdown (example: -\fB\-disabledeprecation\fR=\fI\,1\/\fR.0.13\-rc2) +\fB\-disabledeprecation\fR=\fI\,1\/\fR.0.13) .HP \fB\-exportdir=\fR .IP From 4b9eb663bff9e2487ca22e48b06a1a7b88ef6f54 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Mon, 20 Nov 2017 12:31:53 +0000 Subject: [PATCH 0295/1062] make-release.py: Updated release notes and changelog for 1.0.13. --- contrib/debian/changelog | 6 ++++++ doc/authors.md | 2 +- doc/release-notes/release-notes-1.0.13.md | 7 +++++++ 3 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 doc/release-notes/release-notes-1.0.13.md diff --git a/contrib/debian/changelog b/contrib/debian/changelog index 835748fcb..71e8b0b58 100644 --- a/contrib/debian/changelog +++ b/contrib/debian/changelog @@ -1,3 +1,9 @@ +zcash (1.0.13) stable; urgency=medium + + * 1.0.13 release. + + -- Zcash Company Mon, 20 Nov 2017 12:31:53 +0000 + zcash (1.0.13~rc2) stable; urgency=medium * 1.0.13-rc2 release. diff --git a/doc/authors.md b/doc/authors.md index 2dbe9f661..7094aff8b 100644 --- a/doc/authors.md +++ b/doc/authors.md @@ -1,7 +1,7 @@ Zcash Contributors ================== -Jack Grigg (512) +Jack Grigg (514) Simon Liu (281) Sean Bowe (193) Daira Hopwood (102) diff --git a/doc/release-notes/release-notes-1.0.13.md b/doc/release-notes/release-notes-1.0.13.md new file mode 100644 index 000000000..d65521687 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.13.md @@ -0,0 +1,7 @@ +Changelog +========= + +Jack Grigg (2): + make-release.py: Versioning changes for 1.0.13. + make-release.py: Updated manpages for 1.0.13. + From f4f064bb1f87047139e701bf11de108de03884aa Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 17 Nov 2017 11:43:46 -0800 Subject: [PATCH 0296/1062] Add documentation for shielding coinbase utxos. --- doc/shield-coinbase.md | 101 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 doc/shield-coinbase.md diff --git a/doc/shield-coinbase.md b/doc/shield-coinbase.md new file mode 100644 index 000000000..515ce95b7 --- /dev/null +++ b/doc/shield-coinbase.md @@ -0,0 +1,101 @@ +# Shielding Coinbase UTXOs + +**Summary** + +Use z_shieldcoinbase RPC call to shield coinbase UTXOs. + +**Who should read this document** + +Miners, Mining pools, Online wallets + +## Background + +The current Zcash protocol includes a consensus rule that coinbase rewards must be sent to a shielded address. + +## User Experience Challenges + +A user can use the z_sendmany RPC call to shield coinbase funds, but the call was not designed for sweeping up many utxos, and offered a suboptimal user experience. + +If customers send mining pool payouts to their online wallet, the service provider must sort through UTXOs to correctly determine the non-coinbase UTXO funds that can be withdrawn or transferred by customers to another transparent address. + +## Solution + +The z_shieldcoinbase call makes it easy to sweep up coinbase rewards from multiple coinbase utxos across multiple coinbase reward addresses. + + z_shieldcoinbase fromaddress toaddress (fee) (limit) + +Where the default fee is 0.0010000 ZEC and the default limit on the maximum number of UTXOs to shield is 50. + +## Examples + +Sweep up coinbase utxos from a transparent address you use for mining: + + zcash-cli z_shieldcoinbase tMyMiningAddress zMyPrivateAddress + +Sweep up coinbase utxos from multiple transparent addresses to a shielded address: + + zcash-cli z_shieldcoinbase "*" zMyPrivateAddress + +Sweep up with a fee of 1.23 ZEC: + + zcash-cli z_shieldcoinbase tMyMiningAddress zMyPrivateAddress 1.23 + +Sweep up with a fee of 0.1 ZEC and set limit on the maximum number of utxos to shield at 25: + + zcash-cli z_shieldcoinbase "*" zMyPrivateAddress 0.1 25 + +### Asynchronous Call + +The `z_shieldcoinbase` RPC call is an asynchronous call, so you can queue up multiple operations. + +When you invoke + + zcash-cli z_shieldcoinbase tMyMiningAddress zMyPrivateAddress + +JSON will be returned immediately, with the following data fields populated: + +- operationid: a temporary id to use with `z_getoperationstatus` and `z_getoperationresult` to get the status and result of the operation. +- shieldedUTXOs: number of coinbase utxos being shielded +- shieldedValue: value of coinbase utxos being shielded. +- remainingUTXOs: number of coinbase utxos still available for shielding. +- remainingValue: value of coinbase utxos still available for shielding + +### Locking UTXOs + +The `z_shieldcoinbase` call will lock any selected UTXOs. This prevents the selected UTXOs which are already queued up from being selected for any other send operation. If the `z_shieldcoinbase` call fails, any locked UTXOs are unlocked. + +You can use the RPC call `lockunspent` to see which UTXOs have been locked. You can also use this call to unlock any UTXOs in the event of an unexpected system failure which leaves UTXOs in a locked state. + +### Limits, Performance and Transaction Confirmation + +The number of coinbase utxos selected for shielding can be adjusted by setting the limit parameter. The default value is 50. + +If the limit parameter is set to zero, the zcashd `mempooltxinputlimit` option will be used instead, where the default value for `mempooltxinputlimit` is zero, which means no limit. + +Any limit is constrained by a hard limit due to the consensus rule defining a maximum transaction size of 100,000 bytes. + +In general, the more utxos that are selected, the longer it takes for the transaction to be verified. Due to the quadratic hashing problem, some miners use the `mempooltxinputlimit` option to reject transactions with a large number of UTXO inputs. + +Currently, as of November 2017, there is no commonly agreed upon limit, but as a rule of thumb (a form of emergent consensus) if a transaction has less than 100 UTXO inputs, the transaction will be mined promptly by the majority of mining pools, but if it has many more UTXO inputs, such as 500, it might take several days to be mined by a miner who has higher or no limits. + +### Anatomy of a z_shieldcoinbase transaction + +The transaction created is a shielded transaction. It consists of a single joinsplit, which consumes coinbase UTXOs as input, and deposits value at a shielded address, minus any fee. + +The number of coinbase UTXOs is determined by a user configured limit. + +If no limit is set (in the case when limit parameter and `mempooltxinputlimit` options are set to zero) the behaviour of z_shieldcoinbase is to consume as many utxos as possible, with `z_shieldcoinbase` constructing a transaction up to the size limit of 100,000 bytes. + +As a result, the maximum number of inputs that can be selected is: + +- P2PKH coinbase utxos ~ 662 +- 2-of-3 multisig P2SH coinbase utxos ~ 244. + +Here is an example of using `z_shieldcoinbase` on testnet to shield multi-sig coinbase utxos. + +- Block 141042 is almost ~2 MB in size (the maximum size for a block) and contains 1 coinbase reward transaction and 20 transactions, each indivually created by a call to z_shieldcoinbase. + - https://explorer.testnet.z.cash/block/0050552a78e97c89f666713c8448d49ad1d7263274422272696187dedf6c0d03 +- Drilling down into a transaction, you can see there is one joinsplit, with 244 inputs (vin) and 0 outputs (vout). + - https://explorer.testnet.z.cash/tx/cf4f3da2e434f68b6e361303403344e22a9ff9a8fda9abc180d9520d0ca6527d + + From 43f5d52123746e1da8166930ca898bcd04b4a103 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 20 Nov 2017 16:55:10 -0800 Subject: [PATCH 0297/1062] Add documentation for payment disclosure. --- doc/payment-disclosure.md | 107 ++++++++++++++++++++++++++++++++++++++ doc/shield-coinbase.md | 34 ++++++------ 2 files changed, 124 insertions(+), 17 deletions(-) create mode 100644 doc/payment-disclosure.md diff --git a/doc/payment-disclosure.md b/doc/payment-disclosure.md new file mode 100644 index 000000000..d0aa68a96 --- /dev/null +++ b/doc/payment-disclosure.md @@ -0,0 +1,107 @@ +# Payment Disclosure (Experimental Feature) + +**Summary** + +Use RPC calls `z_getpaymentdisclosure` and `z_validatepaymentdisclosure` to reveal details of a shielded payment. + +**Who should read this document** + +Frequent users of shielded transactions, payment processors, exchanges, block explorer + +### Experimental Feature + +This is an experimental feature. Enable it by launching `zcashd` with flags: + + zcashd -experimentalfeatures -paymentdisclosure -debug=paymentdisclosure -txindex=1 + +These flags can also be set as options in `zcash.conf`. + +All nodes that generate or validate payment disclosures must run with `txindex=1` enabled. + +### Background + +Payment Disclosure is an implementation of the work-in-progress Payment Disclosure ZIP [1]. + +The ZIP describes a method of proving that a payment was sent to a shielded address. In the typical case, this means enabling a sender to present a proof that they transferred funds to a recipient's shielded address. + +[1] https://github.com/zcash/zips/pull/119 + +### Example Use Case + +Alice the customer sends 10 ZEC to Bob the merchant at the shielded address shown on their website. However, Bob is not sure if he received the funds. + +Alice's node is running with payment disclosure enabled, so Alice generates a payment disclosure and provides it to Bob, who verifies the payment was made. + +If Bob is a bad merchant, Alice can present the payment disclosure to a third party to validate that payment was indeed made. + +### Solution + +A payment disclosure can be generated for any output of a JoinSplit using the RPC call: + + z_getpaymentdisclosure txid js_index output_index (message) + +An optional message can be supplied. This could be used for a refund address or some other reference, as currently it is not common practice to (ahead of time) include a refund address in the memo field when making a payment. + +To validate a payment disclosure, the following RPC call can be used: + + z_validatepaymentdisclosure hexdata + +### Example + +Generate a payment disclosure for the first joinsplit, second output (index starts from zero): + + zcash-cli z_getpaymentdisclosure 79189528d611e811a1c7bb0358dd31343033d14b4c1e998d7c4799c40f8b652b 0 1 "Hello" + +This returns a payment disclosure in the form of a hex string: + + 706462ff000a3722aafa8190cdf9710bfad6da2af6d3a74262c1fc96ad47df814b0cd5641c2b658b0fc499477c8d991e4c4bd133303431dd5803bbc7a111e811d6289518790000000000000000017e861adb829d8cb1cbcf6330b8c2e25fb0d08041a67a857815a136f0227f8a5342bce5b3c0d894e2983000eb594702d3c1580817d0374e15078528e56bb6f80c0548656c6c6f59a7085395c9e706d82afe3157c54ad4ae5bf144fcc774a8d9c921c58471402019c156ec5641e2173c4fb6467df5f28530dc4636fa71f4d0e48fc5c560fac500 + +To validate the payment disclosure: + + zcash-cli z_validatepaymentdisclosure HEXDATA + +This returns data related to the payment and the payment disclosure: + + { + "txid": "79189528d611e811a1c7bb0358dd31343033d14b4c1e998d7c4799c40f8b652b", + "jsIndex": 0, + "outputIndex": 1, + "version": 0, + "onetimePrivKey": "1c64d50c4b81df47ad96fcc16242a7d3f62adad6fa0b71f9cd9081faaa22370a", + "message": "Hello", + "joinSplitPubKey": "d1c465d16166b602992479acfac18e87dc18065f6cefde6a002e70bc371b9faf", + "signatureVerified": true, + "paymentAddress": "ztaZJXy8iX8nrk2ytXKDBoTWqPkhQcj6E2ifARnD3wfkFwsxXs5SoX7NGmrjkzSiSKn8VtLHTJae48vX5NakvmDhtGNY5eb", + "memo": "f600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "value": 12.49900000, + "commitmentMatch": true, + "valid": true + } + +The `signatureVerified` field confirms that the payment disclosure was generated and signed with the joinSplitPrivKey, which should only be known by the node generating and sending the transaction 7918...652b in question. + +### Where is the data stored? + +For all nodes, payment disclosure does not touch `wallet.dat` in any way. + +For nodes that only validate payment disclosures, no data is stored locally. + +For nodes that generate payment disclosures, a LevelDB database is created in the node's datadir. For most users, this would be in the folder: + + $HOME/.zcash/paymentdisclosure + +If you decide you don't want to use payment disclosure, it is safe to shut down your node and delete the database folder. + +### Security Properties + +Please consult the work-in-progress ZIP for details about the protocol, security properties and caveats. + +### Reminder + +Feedback is most welcome! + +This is an experimental feature so there are no guarantees that the protocol, database format, RPC interface etc. will remain the same in the future. + +### Notes + +Currently there is no user friendly way to help senders identify which joinsplit output index maps to a given payment they made. It is possible to construct this from `debug.log`. Ideas and feedback are most welcome on how to improve the user experience. diff --git a/doc/shield-coinbase.md b/doc/shield-coinbase.md index 515ce95b7..d3986fec7 100644 --- a/doc/shield-coinbase.md +++ b/doc/shield-coinbase.md @@ -2,7 +2,7 @@ **Summary** -Use z_shieldcoinbase RPC call to shield coinbase UTXOs. +Use `z_shieldcoinbase` RPC call to shield coinbase UTXOs. **Who should read this document** @@ -14,25 +14,25 @@ The current Zcash protocol includes a consensus rule that coinbase rewards must ## User Experience Challenges -A user can use the z_sendmany RPC call to shield coinbase funds, but the call was not designed for sweeping up many utxos, and offered a suboptimal user experience. +A user can use the z_sendmany RPC call to shield coinbase funds, but the call was not designed for sweeping up many UTXOs, and offered a suboptimal user experience. If customers send mining pool payouts to their online wallet, the service provider must sort through UTXOs to correctly determine the non-coinbase UTXO funds that can be withdrawn or transferred by customers to another transparent address. ## Solution -The z_shieldcoinbase call makes it easy to sweep up coinbase rewards from multiple coinbase utxos across multiple coinbase reward addresses. +The z_shieldcoinbase call makes it easy to sweep up coinbase rewards from multiple coinbase UTXOs across multiple coinbase reward addresses. z_shieldcoinbase fromaddress toaddress (fee) (limit) -Where the default fee is 0.0010000 ZEC and the default limit on the maximum number of UTXOs to shield is 50. +The default fee is 0.0010000 ZEC and the default limit on the maximum number of UTXOs to shield is 50. ## Examples -Sweep up coinbase utxos from a transparent address you use for mining: +Sweep up coinbase UTXOs from a transparent address you use for mining: zcash-cli z_shieldcoinbase tMyMiningAddress zMyPrivateAddress -Sweep up coinbase utxos from multiple transparent addresses to a shielded address: +Sweep up coinbase UTXOs from multiple transparent addresses to a shielded address: zcash-cli z_shieldcoinbase "*" zMyPrivateAddress @@ -40,7 +40,7 @@ Sweep up with a fee of 1.23 ZEC: zcash-cli z_shieldcoinbase tMyMiningAddress zMyPrivateAddress 1.23 -Sweep up with a fee of 0.1 ZEC and set limit on the maximum number of utxos to shield at 25: +Sweep up with a fee of 0.1 ZEC and set limit on the maximum number of UTXOs to shield at 25: zcash-cli z_shieldcoinbase "*" zMyPrivateAddress 0.1 25 @@ -55,10 +55,10 @@ When you invoke JSON will be returned immediately, with the following data fields populated: - operationid: a temporary id to use with `z_getoperationstatus` and `z_getoperationresult` to get the status and result of the operation. -- shieldedUTXOs: number of coinbase utxos being shielded -- shieldedValue: value of coinbase utxos being shielded. -- remainingUTXOs: number of coinbase utxos still available for shielding. -- remainingValue: value of coinbase utxos still available for shielding +- shieldedUTXOs: number of coinbase UTXOs being shielded +- shieldedValue: value of coinbase UTXOs being shielded. +- remainingUTXOs: number of coinbase UTXOs still available for shielding. +- remainingValue: value of coinbase UTXOs still available for shielding ### Locking UTXOs @@ -68,13 +68,13 @@ You can use the RPC call `lockunspent` to see which UTXOs have been locked. You ### Limits, Performance and Transaction Confirmation -The number of coinbase utxos selected for shielding can be adjusted by setting the limit parameter. The default value is 50. +The number of coinbase UTXOs selected for shielding can be adjusted by setting the limit parameter. The default value is 50. If the limit parameter is set to zero, the zcashd `mempooltxinputlimit` option will be used instead, where the default value for `mempooltxinputlimit` is zero, which means no limit. Any limit is constrained by a hard limit due to the consensus rule defining a maximum transaction size of 100,000 bytes. -In general, the more utxos that are selected, the longer it takes for the transaction to be verified. Due to the quadratic hashing problem, some miners use the `mempooltxinputlimit` option to reject transactions with a large number of UTXO inputs. +In general, the more UTXOs that are selected, the longer it takes for the transaction to be verified. Due to the quadratic hashing problem, some miners use the `mempooltxinputlimit` option to reject transactions with a large number of UTXO inputs. Currently, as of November 2017, there is no commonly agreed upon limit, but as a rule of thumb (a form of emergent consensus) if a transaction has less than 100 UTXO inputs, the transaction will be mined promptly by the majority of mining pools, but if it has many more UTXO inputs, such as 500, it might take several days to be mined by a miner who has higher or no limits. @@ -84,14 +84,14 @@ The transaction created is a shielded transaction. It consists of a single join The number of coinbase UTXOs is determined by a user configured limit. -If no limit is set (in the case when limit parameter and `mempooltxinputlimit` options are set to zero) the behaviour of z_shieldcoinbase is to consume as many utxos as possible, with `z_shieldcoinbase` constructing a transaction up to the size limit of 100,000 bytes. +If no limit is set (in the case when limit parameter and `mempooltxinputlimit` options are set to zero) the behaviour of z_shieldcoinbase is to consume as many UTXOs as possible, with `z_shieldcoinbase` constructing a transaction up to the size limit of 100,000 bytes. As a result, the maximum number of inputs that can be selected is: -- P2PKH coinbase utxos ~ 662 -- 2-of-3 multisig P2SH coinbase utxos ~ 244. +- P2PKH coinbase UTXOs ~ 662 +- 2-of-3 multisig P2SH coinbase UTXOs ~ 244. -Here is an example of using `z_shieldcoinbase` on testnet to shield multi-sig coinbase utxos. +Here is an example of using `z_shieldcoinbase` on testnet to shield multi-sig coinbase UTXOs. - Block 141042 is almost ~2 MB in size (the maximum size for a block) and contains 1 coinbase reward transaction and 20 transactions, each indivually created by a call to z_shieldcoinbase. - https://explorer.testnet.z.cash/block/0050552a78e97c89f666713c8448d49ad1d7263274422272696187dedf6c0d03 From 159aa37fc0139d298e5f54fc332fc500825dc5f9 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 22 Nov 2017 00:02:52 -0800 Subject: [PATCH 0298/1062] Closes #2759. Fixes broken pipe error with QA test wallet.py. --- qa/rpc-tests/wallet.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/qa/rpc-tests/wallet.py b/qa/rpc-tests/wallet.py index 9b91c803d..12dfac0e4 100755 --- a/qa/rpc-tests/wallet.py +++ b/qa/rpc-tests/wallet.py @@ -271,6 +271,16 @@ class WalletTest (BitcoinTestFramework): for i in xrange(0,num_t_recipients): newtaddr = self.nodes[2].getnewaddress() recipients.append({"address":newtaddr, "amount":amount_per_recipient}) + + # Issue #2759 Workaround START + # HTTP connection to node 0 may fall into a state, during the few minutes it takes to process + # loop above to create new addresses, that when z_sendmany is called with a large amount of + # rpc data in recipients, the connection fails with a 'broken pipe' error. Making a RPC call + # to node 0 before calling z_sendmany appears to fix this issue, perhaps putting the HTTP + # connection into a good state to handle a large amount of data in recipients. + self.nodes[0].getinfo() + # Issue #2759 Workaround END + try: self.nodes[0].z_sendmany(myzaddr, recipients) except JSONRPCException,e: @@ -288,6 +298,11 @@ class WalletTest (BitcoinTestFramework): for i in xrange(0,num_z_recipients): newzaddr = self.nodes[2].z_getnewaddress() recipients.append({"address":newzaddr, "amount":amount_per_recipient}) + + # Issue #2759 Workaround START + self.nodes[0].getinfo() + # Issue #2759 Workaround END + try: self.nodes[0].z_sendmany(myzaddr, recipients) except JSONRPCException,e: From 0c177bc585ca96029a606249c6bd09e6e6f8c6c2 Mon Sep 17 00:00:00 2001 From: syd Date: Wed, 22 Nov 2017 23:16:51 -0500 Subject: [PATCH 0299/1062] Update libsodium from 1.0.11 to 1.0.15 --- depends/packages/libsodium.mk | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/depends/packages/libsodium.mk b/depends/packages/libsodium.mk index d7717bbfc..8135e83d6 100644 --- a/depends/packages/libsodium.mk +++ b/depends/packages/libsodium.mk @@ -1,8 +1,8 @@ package=libsodium -$(package)_version=1.0.11 +$(package)_version=1.0.15 $(package)_download_path=https://download.libsodium.org/libsodium/releases/ -$(package)_file_name=libsodium-1.0.11.tar.gz -$(package)_sha256_hash=a14549db3c49f6ae2170cbbf4664bd48ace50681045e8dbea7c8d9fb96f9c765 +$(package)_file_name=$(package)-$($(package)_version).tar.gz +$(package)_sha256_hash=fb6a9e879a2f674592e4328c5d9f79f082405ee4bb05cb6e679b90afe9e178f4 $(package)_dependencies= $(package)_config_opts= From c72a4732cc16a33790ea1d071ed5635803af9f6a Mon Sep 17 00:00:00 2001 From: syd Date: Thu, 23 Nov 2017 00:05:21 -0500 Subject: [PATCH 0300/1062] Remove Boost conditional compilation. Boost is currently at version 106200 in the depends subsystem so it is safe to remove code the refers to earlier versions. This closes #2445 --- src/scheduler.cpp | 16 +--------------- src/util.cpp | 4 ---- src/wallet/walletdb.cpp | 4 ---- 3 files changed, 1 insertion(+), 23 deletions(-) diff --git a/src/scheduler.cpp b/src/scheduler.cpp index 184ddc28a..8729f2a5a 100644 --- a/src/scheduler.cpp +++ b/src/scheduler.cpp @@ -20,13 +20,6 @@ CScheduler::~CScheduler() } -#if BOOST_VERSION < 105000 -static boost::system_time toPosixTime(const boost::chrono::system_clock::time_point& t) -{ - return boost::posix_time::from_time_t(boost::chrono::system_clock::to_time_t(t)); -} -#endif - void CScheduler::serviceQueue() { boost::unique_lock lock(newTaskMutex); @@ -45,20 +38,13 @@ void CScheduler::serviceQueue() // Wait until either there is a new task, or until // the time of the first item on the queue: -// wait_until needs boost 1.50 or later; older versions have timed_wait: -#if BOOST_VERSION < 105000 - while (!shouldStop() && !taskQueue.empty() && - newTaskScheduled.timed_wait(lock, toPosixTime(taskQueue.begin()->first))) { - // Keep waiting until timeout - } -#else // Some boost versions have a conflicting overload of wait_until that returns void. // Explicitly use a template here to avoid hitting that overload. while (!shouldStop() && !taskQueue.empty() && newTaskScheduled.wait_until<>(lock, taskQueue.begin()->first) != boost::cv_status::timeout) { // Keep waiting until timeout } -#endif + // If there are multiple threads, the queue can empty while we're waiting (another // thread may service the task we were waiting on). if (shouldStop() || taskQueue.empty()) diff --git a/src/util.cpp b/src/util.cpp index cc8632c6a..19c400631 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -911,10 +911,6 @@ std::string LicenseInfo() int GetNumCores() { -#if BOOST_VERSION >= 105600 return boost::thread::physical_concurrency(); -#else // Must fall back to hardware_concurrency, which unfortunately counts virtual cores - return boost::thread::hardware_concurrency(); -#endif } diff --git a/src/wallet/walletdb.cpp b/src/wallet/walletdb.cpp index ec6c55ee3..f25224336 100644 --- a/src/wallet/walletdb.cpp +++ b/src/wallet/walletdb.cpp @@ -968,11 +968,7 @@ bool BackupWallet(const CWallet& wallet, const string& strDest) pathDest /= wallet.strWalletFile; try { -#if BOOST_VERSION >= 104000 boost::filesystem::copy_file(pathSrc, pathDest, boost::filesystem::copy_option::overwrite_if_exists); -#else - boost::filesystem::copy_file(pathSrc, pathDest); -#endif LogPrintf("copied wallet.dat to %s\n", pathDest.string()); return true; } catch (const boost::filesystem::filesystem_error& e) { From 6df5f51b7ca545c16d000f68bc7dedca6ca9daa7 Mon Sep 17 00:00:00 2001 From: syd Date: Thu, 23 Nov 2017 11:58:25 -0500 Subject: [PATCH 0301/1062] Update to address @daira comments wrt fixing configure.ac Since we're enforcing Boost >= 1.62, we no longer need HAVE_WORKING_BOOST_SLEEP_FOR. --- configure.ac | 76 +----------------------------------- src/test/scheduler_tests.cpp | 7 ---- src/utiltime.cpp | 13 ------ 3 files changed, 2 insertions(+), 94 deletions(-) diff --git a/configure.ac b/configure.ac index 3eca0a24d..b61acf468 100644 --- a/configure.ac +++ b/configure.ac @@ -554,33 +554,14 @@ fi if test x$use_boost = xyes; then dnl Check for boost libs -AX_BOOST_BASE +dnl We need Boost >= 1.62 to fix a potential security bug (https://github.com/zcash/zcash/issues/1241) +AX_BOOST_BASE([1.62]) AX_BOOST_SYSTEM AX_BOOST_FILESYSTEM AX_BOOST_PROGRAM_OPTIONS AX_BOOST_THREAD AX_BOOST_CHRONO - -if test x$use_reduce_exports = xyes; then - AC_MSG_CHECKING([for working boost reduced exports]) - TEMP_CPPFLAGS="$CPPFLAGS" - CPPFLAGS="$BOOST_CPPFLAGS $CPPFLAGS" - AC_PREPROC_IFELSE([AC_LANG_PROGRAM([[ - @%:@include - ]], [[ - #if BOOST_VERSION >= 104900 - // Everything is okay - #else - # error Boost version is too old - #endif - ]])],[ - AC_MSG_RESULT(yes) - ],[ - AC_MSG_ERROR([boost versions < 1.49 are known to be broken with reduced exports. Use --disable-reduce-exports.]) - ]) - CPPFLAGS="$TEMP_CPPFLAGS" -fi fi if test x$use_reduce_exports = xyes; then @@ -621,60 +602,7 @@ if test x$use_tests = xyes; then fi if test x$use_boost = xyes; then - BOOST_LIBS="$BOOST_LDFLAGS $BOOST_SYSTEM_LIB $BOOST_FILESYSTEM_LIB $BOOST_PROGRAM_OPTIONS_LIB $BOOST_THREAD_LIB $BOOST_CHRONO_LIB" - -dnl Boost >= 1.50 uses sleep_for rather than the now-deprecated sleep, however -dnl it was broken from 1.50 to 1.52 when backed by nanosleep. Use sleep_for if -dnl a working version is available, else fall back to sleep. sleep was removed -dnl after 1.56. -dnl If neither is available, abort. -TEMP_LIBS="$LIBS" -LIBS="$BOOST_LIBS $LIBS" -TEMP_CPPFLAGS="$CPPFLAGS" -CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" -AC_LINK_IFELSE([AC_LANG_PROGRAM([[ - #include - #include - ]],[[ - #if BOOST_VERSION >= 105000 && (!defined(BOOST_HAS_NANOSLEEP) || BOOST_VERSION >= 105200) - boost::this_thread::sleep_for(boost::chrono::milliseconds(0)); - #else - choke me - #endif - ]])], - [boost_sleep=yes; - AC_DEFINE(HAVE_WORKING_BOOST_SLEEP_FOR, 1, [Define this symbol if boost sleep_for works])], - [boost_sleep=no]) -LIBS="$TEMP_LIBS" -CPPFLAGS="$TEMP_CPPFLAGS" - -if test x$boost_sleep != xyes; then -TEMP_LIBS="$LIBS" -LIBS="$BOOST_LIBS $LIBS" -TEMP_CPPFLAGS="$CPPFLAGS" -CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" -AC_LINK_IFELSE([AC_LANG_PROGRAM([[ - #include - #include - #include - ]],[[ - #if BOOST_VERSION <= 105600 - boost::this_thread::sleep(boost::posix_time::milliseconds(0)); - #else - choke me - #endif - ]])], - [boost_sleep=yes; AC_DEFINE(HAVE_WORKING_BOOST_SLEEP, 1, [Define this symbol if boost sleep works])], - [boost_sleep=no]) -LIBS="$TEMP_LIBS" -CPPFLAGS="$TEMP_CPPFLAGS" -fi - -if test x$boost_sleep != xyes; then - AC_MSG_ERROR(No working boost sleep implementation found.) -fi - fi if test x$use_pkgconfig = xyes; then diff --git a/src/test/scheduler_tests.cpp b/src/test/scheduler_tests.cpp index cb1a427db..d6c93ef3b 100644 --- a/src/test/scheduler_tests.cpp +++ b/src/test/scheduler_tests.cpp @@ -30,14 +30,7 @@ static void microTask(CScheduler& s, boost::mutex& mutex, int& counter, int delt static void MicroSleep(uint64_t n) { -#if defined(HAVE_WORKING_BOOST_SLEEP_FOR) boost::this_thread::sleep_for(boost::chrono::microseconds(n)); -#elif defined(HAVE_WORKING_BOOST_SLEEP) - boost::this_thread::sleep(boost::posix_time::microseconds(n)); -#else - //should never get here - #error missing boost sleep implementation -#endif } BOOST_AUTO_TEST_CASE(manythreads) diff --git a/src/utiltime.cpp b/src/utiltime.cpp index a7cdeb114..f1a408a31 100644 --- a/src/utiltime.cpp +++ b/src/utiltime.cpp @@ -43,20 +43,7 @@ int64_t GetTimeMicros() void MilliSleep(int64_t n) { - -/** - * Boost's sleep_for was uninterruptable when backed by nanosleep from 1.50 - * until fixed in 1.52. Use the deprecated sleep method for the broken case. - * See: https://svn.boost.org/trac/boost/ticket/7238 - */ -#if defined(HAVE_WORKING_BOOST_SLEEP_FOR) boost::this_thread::sleep_for(boost::chrono::milliseconds(n)); -#elif defined(HAVE_WORKING_BOOST_SLEEP) - boost::this_thread::sleep(boost::posix_time::milliseconds(n)); -#else -//should never get here -#error missing boost sleep implementation -#endif } std::string DateTimeStrFormat(const char* pszFormat, int64_t nTime) From dffc025d38bb12b655bfde53de6dd237840c7d8e Mon Sep 17 00:00:00 2001 From: syd Date: Thu, 23 Nov 2017 12:20:50 -0500 Subject: [PATCH 0302/1062] Get rid of consensus.fPowAllowMinDifficultyBlocks. This closes #1380 --- src/chainparams.cpp | 2 -- src/consensus/params.h | 1 - src/miner.cpp | 9 --------- 3 files changed, 12 deletions(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 16c5e9d24..034eee6b2 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -49,7 +49,6 @@ public: consensus.nPowMaxAdjustDown = 32; // 32% adjustment down consensus.nPowMaxAdjustUp = 16; // 16% adjustment up consensus.nPowTargetSpacing = 2.5 * 60; - consensus.fPowAllowMinDifficultyBlocks = false; /** * The message start string should be awesome! ⓩ❤ */ @@ -211,7 +210,6 @@ public: consensus.nMajorityWindow = 400; consensus.powLimit = uint256S("07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); assert(maxUint/UintToArith256(consensus.powLimit) >= consensus.nPowAveragingWindow); - consensus.fPowAllowMinDifficultyBlocks = true; pchMessageStart[0] = 0xfa; pchMessageStart[1] = 0x1a; pchMessageStart[2] = 0xf9; diff --git a/src/consensus/params.h b/src/consensus/params.h index d3e6462b8..c74e66d5f 100644 --- a/src/consensus/params.h +++ b/src/consensus/params.h @@ -41,7 +41,6 @@ struct Params { int nMajorityWindow; /** Proof of work parameters */ uint256 powLimit; - bool fPowAllowMinDifficultyBlocks; int64_t nPowAveragingWindow; int64_t nPowMaxAdjustDown; int64_t nPowMaxAdjustUp; diff --git a/src/miner.cpp b/src/miner.cpp index 3434a0d7c..327228f3f 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -100,10 +100,6 @@ public: void UpdateTime(CBlockHeader* pblock, const Consensus::Params& consensusParams, const CBlockIndex* pindexPrev) { pblock->nTime = std::max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime()); - - // Updating time can change work required on testnet: - if (consensusParams.fPowAllowMinDifficultyBlocks) - pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, consensusParams); } CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) @@ -714,11 +710,6 @@ void static BitcoinMiner() // Update nNonce and nTime pblock->nNonce = ArithToUint256(UintToArith256(pblock->nNonce) + 1); UpdateTime(pblock, chainparams.GetConsensus(), pindexPrev); - if (chainparams.GetConsensus().fPowAllowMinDifficultyBlocks) - { - // Changing pblock->nTime can change work required on testnet: - hashTarget.SetCompact(pblock->nBits); - } } } } From 7c591c6d2f6466f1adda6f85122098db327ad32e Mon Sep 17 00:00:00 2001 From: syd Date: Sat, 25 Nov 2017 10:58:37 -0500 Subject: [PATCH 0303/1062] Don't compile libgtest.a when building libsnark. Previously libsnark would try to build libgtest if /usr/src/gtest exists on the build machine. This caused issues because the version of libgtest in /usr/src isn't necessarily the same as the one that the rest of zcash's gtests were built with. --- src/Makefile.am | 2 +- src/snark/Makefile | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index ea745a1f7..48b60911a 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -46,7 +46,7 @@ $(LIBSECP256K1): $(wildcard secp256k1/src/*) $(wildcard secp256k1/include/*) collate-libsnark: $(LIBSNARK) LIBSNARK_CXXFLAGS = -fPIC -DBINARY_OUTPUT -DNO_PT_COMPRESSION=1 -LIBSNARK_CONFIG_FLAGS = CURVE=ALT_BN128 MULTICORE=1 NO_PROCPS=1 NO_DOCS=1 STATIC=1 NO_SUPERCOP=1 FEATUREFLAGS=-DMONTGOMERY_OUTPUT NO_COPY_DEPINST=1 +LIBSNARK_CONFIG_FLAGS = CURVE=ALT_BN128 MULTICORE=1 NO_PROCPS=1 NO_DOCS=1 STATIC=1 NO_SUPERCOP=1 FEATUREFLAGS=-DMONTGOMERY_OUTPUT NO_COPY_DEPINST=1 NO_COMPILE_LIBGTEST=1 $(LIBSNARK): $(wildcard snark/src/*) $(AM_V_at) CXXFLAGS="$(LIBSNARK_CXXFLAGS)" $(MAKE) $(AM_MAKEFLAGS) -C snark/ install PREFIX=$(srcdir)/build DEPINST="$(LIBSNARK_DEPINST)" $(LIBSNARK_CONFIG_FLAGS) OPTFLAGS="-O2 -march=x86-64" diff --git a/src/snark/Makefile b/src/snark/Makefile index cceffb989..32b8609f2 100644 --- a/src/snark/Makefile +++ b/src/snark/Makefile @@ -27,13 +27,13 @@ INSTALL_LIBS = $(LIB_FILE) # Sentinel file to check existence of this directory (since directories don't work as a Make dependency): DEPINST_EXISTS = $(DEPINST)/.exists - -COMPILE_GTEST := ifneq ($(NO_GTEST),1) - GTESTDIR=/usr/src/gtest -# Compile GTest from sourcecode if we can (e.g., Ubuntu). Otherwise use precompiled one (e.g., Fedora). -# See https://code.google.com/p/googletest/wiki/FAQ#Why_is_it_not_recommended_to_install_a_pre-compiled_copy_of_Goog . - COMPILE_GTEST :=$(shell test -d $(GTESTDIR) && echo -n 1) + # Compile GTest from sourcecode if we can (e.g., Ubuntu). Otherwise use precompiled one (e.g., Fedora). + # See https://github.com/google/googletest/blob/master/googletest/docs/FAQ.md#why-is-it-not-recommended-to-install-a-pre-compiled-copy-of-google-test-for-example-into-usrlocal + ifneq ($(NO_COMPILE_LIBGTEST),1) + GTESTDIR=/usr/src/gtest + COMPILE_LIBGTEST = $(shell test -d $(GTESTDIR) && echo -n 1) + endif GTEST_LDLIBS += -lgtest -lpthread endif @@ -221,13 +221,13 @@ src/gadgetlib2/tests/gadgetlib2_test: \ $(EXECUTABLES): %: %.o $(LIBSNARK_A) $(DEPINST_EXISTS) $(CXX) -o $@ $@.o $(LIBSNARK_A) $(CXXFLAGS) $(LDFLAGS) $(LDLIBS) -$(EXECUTABLES_WITH_GTEST): %: %.o $(LIBSNARK_A) $(if $(COMPILE_GTEST),$(LIBGTEST_A)) $(DEPINST_EXISTS) +$(EXECUTABLES_WITH_GTEST): %: %.o $(LIBSNARK_A) $(if $(COMPILE_LIBGTEST),$(LIBGTEST_A)) $(DEPINST_EXISTS) $(CXX) -o $@ $@.o $(LIBSNARK_A) $(CXXFLAGS) $(LDFLAGS) $(GTEST_LDLIBS) $(LDLIBS) $(EXECUTABLES_WITH_SUPERCOP): %: %.o $(LIBSNARK_A) $(DEPINST_EXISTS) $(CXX) -o $@ $@.o $(LIBSNARK_A) $(CXXFLAGS) $(LDFLAGS) $(SUPERCOP_LDLIBS) $(LDLIBS) -$(GTEST_TESTS): %: $(GTEST_OBJS) $(LIBSNARK_A) $(if $(COMPILE_GTEST),$(LIBGTEST_A)) $(DEPINST_EXISTS) +$(GTEST_TESTS): %: $(GTEST_OBJS) $(LIBSNARK_A) $(if $(COMPILE_LIBGTEST),$(LIBGTEST_A)) $(DEPINST_EXISTS) $(CXX) -o $@ $(GTEST_OBJS) $(LIBSNARK_A) $(CXXFLAGS) $(LDFLAGS) $(GTEST_LDLIBS) $(LDLIBS) From a10c2f46a59229461c9c8c3c8257a986d68d05dd Mon Sep 17 00:00:00 2001 From: syd Date: Sat, 25 Nov 2017 11:05:01 -0500 Subject: [PATCH 0304/1062] Add gtests to .gitignore --- src/snark/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/src/snark/.gitignore b/src/snark/.gitignore index f6fb450a2..bb48e1aba 100644 --- a/src/snark/.gitignore +++ b/src/snark/.gitignore @@ -6,6 +6,7 @@ depinst/ depsrc/ README.html doxygen/ +src/gtests src/gadgetlib2/examples/tutorial src/gadgetlib2/tests/gadgetlib2_test From 5163fd9d07d4eec886e02d8169a07d4d80d9a2f0 Mon Sep 17 00:00:00 2001 From: syd Date: Sat, 25 Nov 2017 15:08:01 -0500 Subject: [PATCH 0305/1062] Get rid of fp3 from libsnark, it is not used. This is for #1544 --- src/snark/src/algebra/fields/fp3.hpp | 122 ------------- src/snark/src/algebra/fields/fp3.tcc | 259 --------------------------- 2 files changed, 381 deletions(-) delete mode 100644 src/snark/src/algebra/fields/fp3.hpp delete mode 100644 src/snark/src/algebra/fields/fp3.tcc diff --git a/src/snark/src/algebra/fields/fp3.hpp b/src/snark/src/algebra/fields/fp3.hpp deleted file mode 100644 index 53b178a27..000000000 --- a/src/snark/src/algebra/fields/fp3.hpp +++ /dev/null @@ -1,122 +0,0 @@ -/** @file - ***************************************************************************** - Declaration of arithmetic in the finite field F[p^3]. - ***************************************************************************** - * @author This file is part of libsnark, developed by SCIPR Lab - * and contributors (see AUTHORS). - * @copyright MIT license (see LICENSE file) - *****************************************************************************/ - -#ifndef FP3_HPP_ -#define FP3_HPP_ -#include "algebra/fields/fp.hpp" -#include - -namespace libsnark { - -template& modulus> -class Fp3_model; - -template& modulus> -std::ostream& operator<<(std::ostream &, const Fp3_model &); - -template& modulus> -std::istream& operator>>(std::istream &, Fp3_model &); - -/** - * Arithmetic in the field F[p^3]. - * - * Let p := modulus. This interface provides arithmetic for the extension field - * Fp3 = Fp[U]/(U^3-non_residue), where non_residue is in Fp. - * - * ASSUMPTION: p = 1 (mod 6) - */ -template& modulus> -class Fp3_model { -public: - typedef Fp_model my_Fp; - - static bigint<3*n> euler; // (modulus^3-1)/2 - static size_t s; // modulus^3 = 2^s * t + 1 - static bigint<3*n> t; // with t odd - static bigint<3*n> t_minus_1_over_2; // (t-1)/2 - static my_Fp non_residue; // X^6-non_residue irreducible over Fp; used for constructing Fp3 = Fp[X] / (X^3 - non_residue) - static Fp3_model nqr; // a quadratic nonresidue in Fp3 - static Fp3_model nqr_to_t; // nqr^t - static my_Fp Frobenius_coeffs_c1[3]; // non_residue^((modulus^i-1)/3) for i=0,1,2 - static my_Fp Frobenius_coeffs_c2[3]; // non_residue^((2*modulus^i-2)/3) for i=0,1,2 - - my_Fp c0, c1, c2; - Fp3_model() {}; - Fp3_model(const my_Fp& c0, const my_Fp& c1, const my_Fp& c2) : c0(c0), c1(c1), c2(c2) {}; - - void clear() { c0.clear(); c1.clear(); c2.clear(); } - void print() const { printf("c0/c1/c2:\n"); c0.print(); c1.print(); c2.print(); } - - static Fp3_model zero(); - static Fp3_model one(); - static Fp3_model random_element(); - - bool is_zero() const { return c0.is_zero() && c1.is_zero() && c2.is_zero(); } - bool operator==(const Fp3_model &other) const; - bool operator!=(const Fp3_model &other) const; - - Fp3_model operator+(const Fp3_model &other) const; - Fp3_model operator-(const Fp3_model &other) const; - Fp3_model operator*(const Fp3_model &other) const; - Fp3_model operator-() const; - Fp3_model squared() const; - Fp3_model inverse() const; - Fp3_model Frobenius_map(unsigned long power) const; - Fp3_model sqrt() const; // HAS TO BE A SQUARE (else does not terminate) - - template - Fp3_model operator^(const bigint &other) const; - - static size_t size_in_bits() { return 3*my_Fp::size_in_bits(); } - static bigint base_field_char() { return modulus; } - - friend std::ostream& operator<< (std::ostream &out, const Fp3_model &el); - friend std::istream& operator>> (std::istream &in, Fp3_model &el); -}; - -template& modulus> -std::ostream& operator<<(std::ostream& out, const std::vector > &v); - -template& modulus> -std::istream& operator>>(std::istream& in, std::vector > &v); - -template& modulus> -Fp3_model operator*(const Fp_model &lhs, const Fp3_model &rhs); - -template& modulus> -bigint<3*n> Fp3_model::euler; - -template& modulus> -size_t Fp3_model::s; - -template& modulus> -bigint<3*n> Fp3_model::t; - -template& modulus> -bigint<3*n> Fp3_model::t_minus_1_over_2; - -template& modulus> -Fp_model Fp3_model::non_residue; - -template& modulus> -Fp3_model Fp3_model::nqr; - -template& modulus> -Fp3_model Fp3_model::nqr_to_t; - -template& modulus> -Fp_model Fp3_model::Frobenius_coeffs_c1[3]; - -template& modulus> -Fp_model Fp3_model::Frobenius_coeffs_c2[3]; - -} // libsnark -#include "algebra/fields/fp3.tcc" - -#endif // FP3_HPP_ diff --git a/src/snark/src/algebra/fields/fp3.tcc b/src/snark/src/algebra/fields/fp3.tcc deleted file mode 100644 index 590a2a987..000000000 --- a/src/snark/src/algebra/fields/fp3.tcc +++ /dev/null @@ -1,259 +0,0 @@ -/** @file - ***************************************************************************** - Implementation of arithmetic in the finite field F[p^3]. - ***************************************************************************** - * @author This file is part of libsnark, developed by SCIPR Lab - * and contributors (see AUTHORS). - * @copyright MIT license (see LICENSE file) - *****************************************************************************/ - -#ifndef FP3_TCC_ -#define FP3_TCC_ - -#include "algebra/fields/field_utils.hpp" - -namespace libsnark { - -template& modulus> -Fp3_model Fp3_model::zero() -{ - return Fp3_model(my_Fp::zero(), my_Fp::zero(), my_Fp::zero()); -} - -template& modulus> -Fp3_model Fp3_model::one() -{ - return Fp3_model(my_Fp::one(), my_Fp::zero(), my_Fp::zero()); -} - -template& modulus> -Fp3_model Fp3_model::random_element() -{ - Fp3_model r; - r.c0 = my_Fp::random_element(); - r.c1 = my_Fp::random_element(); - r.c2 = my_Fp::random_element(); - - return r; -} - -template& modulus> -bool Fp3_model::operator==(const Fp3_model &other) const -{ - return (this->c0 == other.c0 && this->c1 == other.c1 && this->c2 == other.c2); -} - -template& modulus> -bool Fp3_model::operator!=(const Fp3_model &other) const -{ - return !(operator==(other)); -} - -template& modulus> -Fp3_model Fp3_model::operator+(const Fp3_model &other) const -{ - return Fp3_model(this->c0 + other.c0, - this->c1 + other.c1, - this->c2 + other.c2); -} - -template& modulus> -Fp3_model Fp3_model::operator-(const Fp3_model &other) const -{ - return Fp3_model(this->c0 - other.c0, - this->c1 - other.c1, - this->c2 - other.c2); -} - -template& modulus> -Fp3_model operator*(const Fp_model &lhs, const Fp3_model &rhs) -{ - return Fp3_model(lhs*rhs.c0, - lhs*rhs.c1, - lhs*rhs.c2); -} - -template& modulus> -Fp3_model Fp3_model::operator*(const Fp3_model &other) const -{ - /* Devegili OhEig Scott Dahab --- Multiplication and Squaring on Pairing-Friendly Fields.pdf; Section 4 (Karatsuba) */ - const my_Fp - &A = other.c0, &B = other.c1, &C = other.c2, - &a = this->c0, &b = this->c1, &c = this->c2; - const my_Fp aA = a*A; - const my_Fp bB = b*B; - const my_Fp cC = c*C; - - return Fp3_model(aA + non_residue*((b+c)*(B+C)-bB-cC), - (a+b)*(A+B)-aA-bB+non_residue*cC, - (a+c)*(A+C)-aA+bB-cC); -} - -template& modulus> -Fp3_model Fp3_model::operator-() const -{ - return Fp3_model(-this->c0, - -this->c1, - -this->c2); -} - -template& modulus> -Fp3_model Fp3_model::squared() const -{ - /* Devegili OhEig Scott Dahab --- Multiplication and Squaring on Pairing-Friendly Fields.pdf; Section 4 (CH-SQR2) */ - const my_Fp - &a = this->c0, &b = this->c1, &c = this->c2; - const my_Fp s0 = a.squared(); - const my_Fp ab = a*b; - const my_Fp s1 = ab + ab; - const my_Fp s2 = (a - b + c).squared(); - const my_Fp bc = b*c; - const my_Fp s3 = bc + bc; - const my_Fp s4 = c.squared(); - - return Fp3_model(s0 + non_residue * s3, - s1 + non_residue * s4, - s1 + s2 + s3 - s0 - s4); -} - -template& modulus> -Fp3_model Fp3_model::inverse() const -{ - const my_Fp - &a = this->c0, &b = this->c1, &c = this->c2; - - /* From "High-Speed Software Implementation of the Optimal Ate Pairing over Barreto-Naehrig Curves"; Algorithm 17 */ - const my_Fp t0 = a.squared(); - const my_Fp t1 = b.squared(); - const my_Fp t2 = c.squared(); - const my_Fp t3 = a*b; - const my_Fp t4 = a*c; - const my_Fp t5 = b*c; - const my_Fp c0 = t0 - non_residue * t5; - const my_Fp c1 = non_residue * t2 - t3; - const my_Fp c2 = t1 - t4; // typo in paper referenced above. should be "-" as per Scott, but is "*" - const my_Fp t6 = (a * c0 + non_residue * (c * c1 + b * c2)).inverse(); - return Fp3_model(t6 * c0, t6 * c1, t6 * c2); -} - -template& modulus> -Fp3_model Fp3_model::Frobenius_map(unsigned long power) const -{ - return Fp3_model(c0, - Frobenius_coeffs_c1[power % 3] * c1, - Frobenius_coeffs_c2[power % 3] * c2); -} - -template& modulus> -Fp3_model Fp3_model::sqrt() const -{ - Fp3_model one = Fp3_model::one(); - - size_t v = Fp3_model::s; - Fp3_model z = Fp3_model::nqr_to_t; - Fp3_model w = (*this)^Fp3_model::t_minus_1_over_2; - Fp3_model x = (*this) * w; - Fp3_model b = x * w; // b = (*this)^t - -#if DEBUG - // check if square with euler's criterion - Fp3_model check = b; - for (size_t i = 0; i < v-1; ++i) - { - check = check.squared(); - } - if (check != one) - { - assert(0); - } -#endif - - // compute square root with Tonelli--Shanks - // (does not terminate if not a square!) - - while (b != one) - { - size_t m = 0; - Fp3_model b2m = b; - while (b2m != one) - { - /* invariant: b2m = b^(2^m) after entering this loop */ - b2m = b2m.squared(); - m += 1; - } - - int j = v-m-1; - w = z; - while (j > 0) - { - w = w.squared(); - --j; - } // w = z^2^(v-m-1) - - z = w.squared(); - b = b * z; - x = x * w; - v = m; - } - - return x; -} - -template& modulus> -template -Fp3_model Fp3_model::operator^(const bigint &pow) const -{ - return power >(*this, pow); -} - -template& modulus> -std::ostream& operator<<(std::ostream &out, const Fp3_model &el) -{ - out << el.c0 << OUTPUT_SEPARATOR << el.c1 << OUTPUT_SEPARATOR << el.c2; - return out; -} - -template& modulus> -std::istream& operator>>(std::istream &in, Fp3_model &el) -{ - in >> el.c0 >> el.c1 >> el.c2; - return in; -} - -template& modulus> -std::ostream& operator<<(std::ostream& out, const std::vector > &v) -{ - out << v.size() << "\n"; - for (const Fp3_model& t : v) - { - out << t << OUTPUT_NEWLINE; - } - - return out; -} - -template& modulus> -std::istream& operator>>(std::istream& in, std::vector > &v) -{ - v.clear(); - - size_t s; - in >> s; - - char b; - in.read(&b, 1); - - v.reserve(s); - - for (size_t i = 0; i < s; ++i) - { - Fp3_model el; - in >> el; - v.emplace_back(el); - } - - return in; -} - -} // libsnark -#endif // FP3_TCC_ From d52dcf5d0ce3c16a79c7f49fef72d17c9df38a8f Mon Sep 17 00:00:00 2001 From: syd Date: Mon, 27 Nov 2017 11:08:34 -0500 Subject: [PATCH 0306/1062] InitGoogleMock instead of InitGoogleTest per CR --- src/gtest/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gtest/main.cpp b/src/gtest/main.cpp index 0b6e1ad08..d2ae0b23d 100644 --- a/src/gtest/main.cpp +++ b/src/gtest/main.cpp @@ -1,4 +1,4 @@ -#include "gtest/gtest.h" +#include "gmock/gmock.h" #include "crypto/common.h" #include "pubkey.h" #include "zcash/JoinSplit.hpp" @@ -25,6 +25,6 @@ int main(int argc, char **argv) { boost::filesystem::path vk_path = ZC_GetParamsDir() / "sprout-verifying.key"; params = ZCJoinSplit::Prepared(vk_path.string(), pk_path.string()); - testing::InitGoogleTest(&argc, argv); + testing::InitGoogleMock(&argc, argv); return RUN_ALL_TESTS(); } From 9eb8089e984a4cc83bd93011c84281f49687bc86 Mon Sep 17 00:00:00 2001 From: Jay Graber Date: Mon, 27 Nov 2017 20:06:36 -0800 Subject: [PATCH 0307/1062] Fix cli help result for z_shieldcoinbase --- src/wallet/rpcwallet.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index b9240a800..60d48fb41 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -3554,11 +3554,11 @@ UniValue z_shieldcoinbase(const UniValue& params, bool fHelp) + strprintf("%d", SHIELD_COINBASE_DEFAULT_LIMIT) + ") Limit on the maximum number of utxos to shield. Set to 0 to use node option -mempooltxinputlimit.\n" "\nResult:\n" "{\n" - " \"operationid\": xxx (string) An operationid to pass to z_getoperationstatus to get the result of the operation.\n" - " \"shieldedUTXOs\": xxx (numeric) Number of coinbase utxos being shielded.\n" - " \"shieldedValue\": xxx (numeric) Value of coinbase utxos being shielded.\n" " \"remainingUTXOs\": xxx (numeric) Number of coinbase utxos still available for shielding.\n" " \"remainingValue\": xxx (numeric) Value of coinbase utxos still available for shielding.\n" + " \"shieldingUTXOs\": xxx (numeric) Number of coinbase utxos being shielded.\n" + " \"shieldingValue\": xxx (numeric) Value of coinbase utxos being shielded.\n" + " \"opid\": xxx (string) An operationid to pass to z_getoperationstatus to get the result of the operation.\n" "}\n" "\nExamples:\n" + HelpExampleCli("z_shieldcoinbase", "\"t1M72Sfpbz1BPpXFHz9m3CdqATR44Jvaydd\" \"ztfaW34Gj9FrnGUEf833ywDVL62NWXBM81u6EQnM6VR45eYnXhwztecW1SjxA7JrmAXKJhxhj3vDNEpVCQoSvVoSpmbhtjf\"") From cde23ac085af43a3d28eb7b146f861041fe7ec12 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 28 Nov 2017 16:42:12 +0000 Subject: [PATCH 0308/1062] Squashed 'src/secp256k1/' changes from 84973d3..6ad5cdb MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 6ad5cdb Merge #479: Get rid of reserved _t in type names d1dc9df Get rid of reserved _t in type names 0b70241 Merge #474: Fix header guards using reserved identifiers ab1f89f Merge #478: Fixed multiple typos 8c7ea22 Fixed multiple typos abe2d3e Fix header guards using reserved identifiers f532bdc Merge #459: Add pubkey prefix constants to include/secp256k1.h cac7c55 Merge #470: Fix wnaf_const documentation 768514b Fix wnaf_const documentation with respect to return value and number of words set b8c26a3 Merge #458: Fix typo in API documentation 817fb20 Merge #440: Fix typos 12230f9 Merge #468: Remove redundant conditional expression 2e1ccdc Remove redundant conditional expression bc61b91 add pubkey prefix constants to include/secp256k1.h b0452e6 Fix typo in API documentation 4c0f32e Fix typo: "Agressive" → "Aggressive" 73aca83 Fix typo: "exectured" → "executed" git-subtree-dir: src/secp256k1 git-subtree-split: 6ad5cdb42a1a8257289a0423d644dcbdeab0f83c --- contrib/lax_der_parsing.h | 10 ++--- contrib/lax_der_privatekey_parsing.h | 10 ++--- include/secp256k1.h | 23 +++++++---- include/secp256k1_ecdh.h | 16 +++---- include/secp256k1_recovery.h | 16 +++---- sage/group_prover.sage | 4 +- src/asm/field_10x26_arm.s | 4 +- src/basic-config.h | 9 ++-- src/bench.h | 6 +-- src/bench_ecdh.c | 8 ++-- src/bench_internal.c | 62 ++++++++++++++-------------- src/bench_recover.c | 8 ++-- src/bench_sign.c | 12 +++--- src/ecdsa.h | 6 +-- src/ecdsa_impl.h | 8 ++-- src/eckey.h | 6 +-- src/eckey_impl.h | 17 ++++---- src/ecmult.h | 6 +-- src/ecmult_const.h | 6 +-- src/ecmult_const_impl.h | 13 +++--- src/ecmult_gen.h | 6 +-- src/ecmult_gen_impl.h | 8 ++-- src/ecmult_impl.h | 6 +-- src/field.h | 6 +-- src/field_10x26.h | 7 ++-- src/field_10x26_impl.h | 6 +-- src/field_5x52.h | 6 +-- src/field_5x52_asm_impl.h | 6 +-- src/field_5x52_impl.h | 6 +-- src/field_5x52_int128_impl.h | 6 +-- src/field_impl.h | 6 +-- src/group.h | 6 +-- src/group_impl.h | 6 +-- src/hash.h | 32 +++++++------- src/hash_impl.h | 32 +++++++------- src/modules/ecdh/main_impl.h | 8 ++-- src/modules/ecdh/tests_impl.h | 8 ++-- src/modules/recovery/main_impl.h | 6 +-- src/modules/recovery/tests_impl.h | 6 +-- src/num.h | 6 +-- src/num_gmp.h | 6 +-- src/num_gmp_impl.h | 6 +-- src/num_impl.h | 6 +-- src/scalar.h | 6 +-- src/scalar_4x64.h | 6 +-- src/scalar_4x64_impl.h | 6 +-- src/scalar_8x32.h | 6 +-- src/scalar_8x32_impl.h | 6 +-- src/scalar_impl.h | 6 +-- src/scalar_low.h | 6 +-- src/scalar_low_impl.h | 6 +-- src/secp256k1.c | 2 +- src/testrand.h | 6 +-- src/testrand_impl.h | 8 ++-- src/tests.c | 6 +-- src/util.h | 6 +-- 56 files changed, 266 insertions(+), 257 deletions(-) diff --git a/contrib/lax_der_parsing.h b/contrib/lax_der_parsing.h index 6d27871a7..7eaf63bf6 100644 --- a/contrib/lax_der_parsing.h +++ b/contrib/lax_der_parsing.h @@ -48,14 +48,14 @@ * 8.3.1. */ -#ifndef _SECP256K1_CONTRIB_LAX_DER_PARSING_H_ -#define _SECP256K1_CONTRIB_LAX_DER_PARSING_H_ +#ifndef SECP256K1_CONTRIB_LAX_DER_PARSING_H +#define SECP256K1_CONTRIB_LAX_DER_PARSING_H #include -# ifdef __cplusplus +#ifdef __cplusplus extern "C" { -# endif +#endif /** Parse a signature in "lax DER" format * @@ -88,4 +88,4 @@ int ecdsa_signature_parse_der_lax( } #endif -#endif +#endif /* SECP256K1_CONTRIB_LAX_DER_PARSING_H */ diff --git a/contrib/lax_der_privatekey_parsing.h b/contrib/lax_der_privatekey_parsing.h index 2fd088f8a..fece261fb 100644 --- a/contrib/lax_der_privatekey_parsing.h +++ b/contrib/lax_der_privatekey_parsing.h @@ -25,14 +25,14 @@ * library are sufficient. */ -#ifndef _SECP256K1_CONTRIB_BER_PRIVATEKEY_H_ -#define _SECP256K1_CONTRIB_BER_PRIVATEKEY_H_ +#ifndef SECP256K1_CONTRIB_BER_PRIVATEKEY_H +#define SECP256K1_CONTRIB_BER_PRIVATEKEY_H #include -# ifdef __cplusplus +#ifdef __cplusplus extern "C" { -# endif +#endif /** Export a private key in DER format. * @@ -87,4 +87,4 @@ SECP256K1_WARN_UNUSED_RESULT int ec_privkey_import_der( } #endif -#endif +#endif /* SECP256K1_CONTRIB_BER_PRIVATEKEY_H */ diff --git a/include/secp256k1.h b/include/secp256k1.h index fc4c5cefb..3e9c098d1 100644 --- a/include/secp256k1.h +++ b/include/secp256k1.h @@ -1,9 +1,9 @@ -#ifndef _SECP256K1_ -# define _SECP256K1_ +#ifndef SECP256K1_H +#define SECP256K1_H -# ifdef __cplusplus +#ifdef __cplusplus extern "C" { -# endif +#endif #include @@ -61,7 +61,7 @@ typedef struct { * however guaranteed to be 64 bytes in size, and can be safely copied/moved. * If you need to convert to a format suitable for storage, transmission, or * comparison, use the secp256k1_ecdsa_signature_serialize_* and - * secp256k1_ecdsa_signature_serialize_* functions. + * secp256k1_ecdsa_signature_parse_* functions. */ typedef struct { unsigned char data[64]; @@ -159,6 +159,13 @@ typedef int (*secp256k1_nonce_function)( #define SECP256K1_EC_COMPRESSED (SECP256K1_FLAGS_TYPE_COMPRESSION | SECP256K1_FLAGS_BIT_COMPRESSION) #define SECP256K1_EC_UNCOMPRESSED (SECP256K1_FLAGS_TYPE_COMPRESSION) +/** Prefix byte used to tag various encoded curvepoints for specific purposes */ +#define SECP256K1_TAG_PUBKEY_EVEN 0x02 +#define SECP256K1_TAG_PUBKEY_ODD 0x03 +#define SECP256K1_TAG_PUBKEY_UNCOMPRESSED 0x04 +#define SECP256K1_TAG_PUBKEY_HYBRID_EVEN 0x06 +#define SECP256K1_TAG_PUBKEY_HYBRID_ODD 0x07 + /** Create a secp256k1 context object. * * Returns: a newly created context object. @@ -607,8 +614,8 @@ SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_combine( size_t n ) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); -# ifdef __cplusplus +#ifdef __cplusplus } -# endif - #endif + +#endif /* SECP256K1_H */ diff --git a/include/secp256k1_ecdh.h b/include/secp256k1_ecdh.h index 4b84d7a96..88492dc1a 100644 --- a/include/secp256k1_ecdh.h +++ b/include/secp256k1_ecdh.h @@ -1,11 +1,11 @@ -#ifndef _SECP256K1_ECDH_ -# define _SECP256K1_ECDH_ +#ifndef SECP256K1_ECDH_H +#define SECP256K1_ECDH_H -# include "secp256k1.h" +#include "secp256k1.h" -# ifdef __cplusplus +#ifdef __cplusplus extern "C" { -# endif +#endif /** Compute an EC Diffie-Hellman secret in constant time * Returns: 1: exponentiation was successful @@ -24,8 +24,8 @@ SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdh( const unsigned char *privkey ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); -# ifdef __cplusplus +#ifdef __cplusplus } -# endif - #endif + +#endif /* SECP256K1_ECDH_H */ diff --git a/include/secp256k1_recovery.h b/include/secp256k1_recovery.h index 055379725..cf6c5ed7f 100644 --- a/include/secp256k1_recovery.h +++ b/include/secp256k1_recovery.h @@ -1,11 +1,11 @@ -#ifndef _SECP256K1_RECOVERY_ -# define _SECP256K1_RECOVERY_ +#ifndef SECP256K1_RECOVERY_H +#define SECP256K1_RECOVERY_H -# include "secp256k1.h" +#include "secp256k1.h" -# ifdef __cplusplus +#ifdef __cplusplus extern "C" { -# endif +#endif /** Opaque data structured that holds a parsed ECDSA signature, * supporting pubkey recovery. @@ -103,8 +103,8 @@ SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_recover( const unsigned char *msg32 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); -# ifdef __cplusplus +#ifdef __cplusplus } -# endif - #endif + +#endif /* SECP256K1_RECOVERY_H */ diff --git a/sage/group_prover.sage b/sage/group_prover.sage index ab580c5b2..8521f0799 100644 --- a/sage/group_prover.sage +++ b/sage/group_prover.sage @@ -3,7 +3,7 @@ # to independently set assumptions on input or intermediary variables. # # The general approach is: -# * A constraint is a tuple of two sets of of symbolic expressions: +# * A constraint is a tuple of two sets of symbolic expressions: # the first of which are required to evaluate to zero, the second of which # are required to evaluate to nonzero. # - A constraint is said to be conflicting if any of its nonzero expressions @@ -17,7 +17,7 @@ # - A constraint describing the requirements of the law, called "require" # * Implementations are transliterated into functions that operate as well on # algebraic input points, and are called once per combination of branches -# exectured. Each execution returns: +# executed. Each execution returns: # - A constraint describing the assumptions this implementation requires # (such as Z1=1), called "assumeFormula" # - A constraint describing the assumptions this specific branch requires, diff --git a/src/asm/field_10x26_arm.s b/src/asm/field_10x26_arm.s index 5df561f2f..5a9cc3ffc 100644 --- a/src/asm/field_10x26_arm.s +++ b/src/asm/field_10x26_arm.s @@ -11,7 +11,7 @@ Note: - To avoid unnecessary loads and make use of available registers, two 'passes' have every time been interleaved, with the odd passes accumulating c' and d' - which will be added to c and d respectively in the the even passes + which will be added to c and d respectively in the even passes */ @@ -23,7 +23,7 @@ Note: .eabi_attribute 10, 0 @ Tag_FP_arch = none .eabi_attribute 24, 1 @ Tag_ABI_align_needed = 8-byte .eabi_attribute 25, 1 @ Tag_ABI_align_preserved = 8-byte, except leaf SP - .eabi_attribute 30, 2 @ Tag_ABI_optimization_goals = Agressive Speed + .eabi_attribute 30, 2 @ Tag_ABI_optimization_goals = Aggressive Speed .eabi_attribute 34, 1 @ Tag_CPU_unaligned_access = v6 .text diff --git a/src/basic-config.h b/src/basic-config.h index c4c16eb7c..fc588061c 100644 --- a/src/basic-config.h +++ b/src/basic-config.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_BASIC_CONFIG_ -#define _SECP256K1_BASIC_CONFIG_ +#ifndef SECP256K1_BASIC_CONFIG_H +#define SECP256K1_BASIC_CONFIG_H #ifdef USE_BASIC_CONFIG @@ -28,5 +28,6 @@ #define USE_FIELD_10X26 1 #define USE_SCALAR_8X32 1 -#endif // USE_BASIC_CONFIG -#endif // _SECP256K1_BASIC_CONFIG_ +#endif /* USE_BASIC_CONFIG */ + +#endif /* SECP256K1_BASIC_CONFIG_H */ diff --git a/src/bench.h b/src/bench.h index d67f08a42..d5ebe0130 100644 --- a/src/bench.h +++ b/src/bench.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_BENCH_H_ -#define _SECP256K1_BENCH_H_ +#ifndef SECP256K1_BENCH_H +#define SECP256K1_BENCH_H #include #include @@ -63,4 +63,4 @@ void run_benchmark(char *name, void (*benchmark)(void*), void (*setup)(void*), v printf("us\n"); } -#endif +#endif /* SECP256K1_BENCH_H */ diff --git a/src/bench_ecdh.c b/src/bench_ecdh.c index cde5e2dbb..2de5126d6 100644 --- a/src/bench_ecdh.c +++ b/src/bench_ecdh.c @@ -15,11 +15,11 @@ typedef struct { secp256k1_context *ctx; secp256k1_pubkey point; unsigned char scalar[32]; -} bench_ecdh_t; +} bench_ecdh; static void bench_ecdh_setup(void* arg) { int i; - bench_ecdh_t *data = (bench_ecdh_t*)arg; + bench_ecdh *data = (bench_ecdh*)arg; const unsigned char point[] = { 0x03, 0x54, 0x94, 0xc1, 0x5d, 0x32, 0x09, 0x97, 0x06, @@ -39,7 +39,7 @@ static void bench_ecdh_setup(void* arg) { static void bench_ecdh(void* arg) { int i; unsigned char res[32]; - bench_ecdh_t *data = (bench_ecdh_t*)arg; + bench_ecdh *data = (bench_ecdh*)arg; for (i = 0; i < 20000; i++) { CHECK(secp256k1_ecdh(data->ctx, res, &data->point, data->scalar) == 1); @@ -47,7 +47,7 @@ static void bench_ecdh(void* arg) { } int main(void) { - bench_ecdh_t data; + bench_ecdh data; run_benchmark("ecdh", bench_ecdh, bench_ecdh_setup, NULL, &data, 10, 20000); return 0; diff --git a/src/bench_internal.c b/src/bench_internal.c index 0809f77bd..9b30c50d0 100644 --- a/src/bench_internal.c +++ b/src/bench_internal.c @@ -25,10 +25,10 @@ typedef struct { secp256k1_gej gej_x, gej_y; unsigned char data[64]; int wnaf[256]; -} bench_inv_t; +} bench_inv; void bench_setup(void* arg) { - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; static const unsigned char init_x[32] = { 0x02, 0x03, 0x05, 0x07, 0x0b, 0x0d, 0x11, 0x13, @@ -58,7 +58,7 @@ void bench_setup(void* arg) { void bench_scalar_add(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 2000000; i++) { secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); @@ -67,7 +67,7 @@ void bench_scalar_add(void* arg) { void bench_scalar_negate(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 2000000; i++) { secp256k1_scalar_negate(&data->scalar_x, &data->scalar_x); @@ -76,7 +76,7 @@ void bench_scalar_negate(void* arg) { void bench_scalar_sqr(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 200000; i++) { secp256k1_scalar_sqr(&data->scalar_x, &data->scalar_x); @@ -85,7 +85,7 @@ void bench_scalar_sqr(void* arg) { void bench_scalar_mul(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 200000; i++) { secp256k1_scalar_mul(&data->scalar_x, &data->scalar_x, &data->scalar_y); @@ -95,7 +95,7 @@ void bench_scalar_mul(void* arg) { #ifdef USE_ENDOMORPHISM void bench_scalar_split(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 20000; i++) { secp256k1_scalar l, r; @@ -107,7 +107,7 @@ void bench_scalar_split(void* arg) { void bench_scalar_inverse(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 2000; i++) { secp256k1_scalar_inverse(&data->scalar_x, &data->scalar_x); @@ -117,7 +117,7 @@ void bench_scalar_inverse(void* arg) { void bench_scalar_inverse_var(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 2000; i++) { secp256k1_scalar_inverse_var(&data->scalar_x, &data->scalar_x); @@ -127,7 +127,7 @@ void bench_scalar_inverse_var(void* arg) { void bench_field_normalize(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 2000000; i++) { secp256k1_fe_normalize(&data->fe_x); @@ -136,7 +136,7 @@ void bench_field_normalize(void* arg) { void bench_field_normalize_weak(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 2000000; i++) { secp256k1_fe_normalize_weak(&data->fe_x); @@ -145,7 +145,7 @@ void bench_field_normalize_weak(void* arg) { void bench_field_mul(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 200000; i++) { secp256k1_fe_mul(&data->fe_x, &data->fe_x, &data->fe_y); @@ -154,7 +154,7 @@ void bench_field_mul(void* arg) { void bench_field_sqr(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 200000; i++) { secp256k1_fe_sqr(&data->fe_x, &data->fe_x); @@ -163,7 +163,7 @@ void bench_field_sqr(void* arg) { void bench_field_inverse(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 20000; i++) { secp256k1_fe_inv(&data->fe_x, &data->fe_x); @@ -173,7 +173,7 @@ void bench_field_inverse(void* arg) { void bench_field_inverse_var(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 20000; i++) { secp256k1_fe_inv_var(&data->fe_x, &data->fe_x); @@ -183,7 +183,7 @@ void bench_field_inverse_var(void* arg) { void bench_field_sqrt(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 20000; i++) { secp256k1_fe_sqrt(&data->fe_x, &data->fe_x); @@ -193,7 +193,7 @@ void bench_field_sqrt(void* arg) { void bench_group_double_var(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 200000; i++) { secp256k1_gej_double_var(&data->gej_x, &data->gej_x, NULL); @@ -202,7 +202,7 @@ void bench_group_double_var(void* arg) { void bench_group_add_var(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 200000; i++) { secp256k1_gej_add_var(&data->gej_x, &data->gej_x, &data->gej_y, NULL); @@ -211,7 +211,7 @@ void bench_group_add_var(void* arg) { void bench_group_add_affine(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 200000; i++) { secp256k1_gej_add_ge(&data->gej_x, &data->gej_x, &data->ge_y); @@ -220,7 +220,7 @@ void bench_group_add_affine(void* arg) { void bench_group_add_affine_var(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 200000; i++) { secp256k1_gej_add_ge_var(&data->gej_x, &data->gej_x, &data->ge_y, NULL); @@ -229,7 +229,7 @@ void bench_group_add_affine_var(void* arg) { void bench_group_jacobi_var(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 20000; i++) { secp256k1_gej_has_quad_y_var(&data->gej_x); @@ -238,7 +238,7 @@ void bench_group_jacobi_var(void* arg) { void bench_ecmult_wnaf(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 20000; i++) { secp256k1_ecmult_wnaf(data->wnaf, 256, &data->scalar_x, WINDOW_A); @@ -248,7 +248,7 @@ void bench_ecmult_wnaf(void* arg) { void bench_wnaf_const(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 20000; i++) { secp256k1_wnaf_const(data->wnaf, data->scalar_x, WINDOW_A); @@ -259,8 +259,8 @@ void bench_wnaf_const(void* arg) { void bench_sha256(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; - secp256k1_sha256_t sha; + bench_inv *data = (bench_inv*)arg; + secp256k1_sha256 sha; for (i = 0; i < 20000; i++) { secp256k1_sha256_initialize(&sha); @@ -271,8 +271,8 @@ void bench_sha256(void* arg) { void bench_hmac_sha256(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; - secp256k1_hmac_sha256_t hmac; + bench_inv *data = (bench_inv*)arg; + secp256k1_hmac_sha256 hmac; for (i = 0; i < 20000; i++) { secp256k1_hmac_sha256_initialize(&hmac, data->data, 32); @@ -283,8 +283,8 @@ void bench_hmac_sha256(void* arg) { void bench_rfc6979_hmac_sha256(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; - secp256k1_rfc6979_hmac_sha256_t rng; + bench_inv *data = (bench_inv*)arg; + secp256k1_rfc6979_hmac_sha256 rng; for (i = 0; i < 20000; i++) { secp256k1_rfc6979_hmac_sha256_initialize(&rng, data->data, 64); @@ -311,7 +311,7 @@ void bench_context_sign(void* arg) { #ifndef USE_NUM_NONE void bench_num_jacobi(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; secp256k1_num nx, norder; secp256k1_scalar_get_num(&nx, &data->scalar_x); @@ -340,7 +340,7 @@ int have_flag(int argc, char** argv, char *flag) { } int main(int argc, char **argv) { - bench_inv_t data; + bench_inv data; if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "add")) run_benchmark("scalar_add", bench_scalar_add, bench_setup, NULL, &data, 10, 2000000); if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "negate")) run_benchmark("scalar_negate", bench_scalar_negate, bench_setup, NULL, &data, 10, 2000000); if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "sqr")) run_benchmark("scalar_sqr", bench_scalar_sqr, bench_setup, NULL, &data, 10, 200000); diff --git a/src/bench_recover.c b/src/bench_recover.c index 6489378cc..506fc1880 100644 --- a/src/bench_recover.c +++ b/src/bench_recover.c @@ -13,11 +13,11 @@ typedef struct { secp256k1_context *ctx; unsigned char msg[32]; unsigned char sig[64]; -} bench_recover_t; +} bench_recover; void bench_recover(void* arg) { int i; - bench_recover_t *data = (bench_recover_t*)arg; + bench_recover *data = (bench_recover*)arg; secp256k1_pubkey pubkey; unsigned char pubkeyc[33]; @@ -38,7 +38,7 @@ void bench_recover(void* arg) { void bench_recover_setup(void* arg) { int i; - bench_recover_t *data = (bench_recover_t*)arg; + bench_recover *data = (bench_recover*)arg; for (i = 0; i < 32; i++) { data->msg[i] = 1 + i; @@ -49,7 +49,7 @@ void bench_recover_setup(void* arg) { } int main(void) { - bench_recover_t data; + bench_recover data; data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY); diff --git a/src/bench_sign.c b/src/bench_sign.c index ed7224d75..544b43963 100644 --- a/src/bench_sign.c +++ b/src/bench_sign.c @@ -12,11 +12,11 @@ typedef struct { secp256k1_context* ctx; unsigned char msg[32]; unsigned char key[32]; -} bench_sign_t; +} bench_sign; static void bench_sign_setup(void* arg) { int i; - bench_sign_t *data = (bench_sign_t*)arg; + bench_sign *data = (bench_sign*)arg; for (i = 0; i < 32; i++) { data->msg[i] = i + 1; @@ -26,9 +26,9 @@ static void bench_sign_setup(void* arg) { } } -static void bench_sign(void* arg) { +static void bench_sign_run(void* arg) { int i; - bench_sign_t *data = (bench_sign_t*)arg; + bench_sign *data = (bench_sign*)arg; unsigned char sig[74]; for (i = 0; i < 20000; i++) { @@ -45,11 +45,11 @@ static void bench_sign(void* arg) { } int main(void) { - bench_sign_t data; + bench_sign data; data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN); - run_benchmark("ecdsa_sign", bench_sign, bench_sign_setup, NULL, &data, 10, 20000); + run_benchmark("ecdsa_sign", bench_sign_run, bench_sign_setup, NULL, &data, 10, 20000); secp256k1_context_destroy(data.ctx); return 0; diff --git a/src/ecdsa.h b/src/ecdsa.h index 54ae101b9..80590c7cc 100644 --- a/src/ecdsa.h +++ b/src/ecdsa.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_ECDSA_ -#define _SECP256K1_ECDSA_ +#ifndef SECP256K1_ECDSA_H +#define SECP256K1_ECDSA_H #include @@ -18,4 +18,4 @@ static int secp256k1_ecdsa_sig_serialize(unsigned char *sig, size_t *size, const static int secp256k1_ecdsa_sig_verify(const secp256k1_ecmult_context *ctx, const secp256k1_scalar* r, const secp256k1_scalar* s, const secp256k1_ge *pubkey, const secp256k1_scalar *message); static int secp256k1_ecdsa_sig_sign(const secp256k1_ecmult_gen_context *ctx, secp256k1_scalar* r, secp256k1_scalar* s, const secp256k1_scalar *seckey, const secp256k1_scalar *message, const secp256k1_scalar *nonce, int *recid); -#endif +#endif /* SECP256K1_ECDSA_H */ diff --git a/src/ecdsa_impl.h b/src/ecdsa_impl.h index 453bb1188..c3400042d 100644 --- a/src/ecdsa_impl.h +++ b/src/ecdsa_impl.h @@ -5,8 +5,8 @@ **********************************************************************/ -#ifndef _SECP256K1_ECDSA_IMPL_H_ -#define _SECP256K1_ECDSA_IMPL_H_ +#ifndef SECP256K1_ECDSA_IMPL_H +#define SECP256K1_ECDSA_IMPL_H #include "scalar.h" #include "field.h" @@ -81,8 +81,6 @@ static int secp256k1_der_read_len(const unsigned char **sigp, const unsigned cha return -1; } while (lenleft > 0) { - if ((ret >> ((sizeof(size_t) - 1) * 8)) != 0) { - } ret = (ret << 8) | **sigp; if (ret + lenleft > (size_t)(sigend - *sigp)) { /* Result exceeds the length of the passed array. */ @@ -312,4 +310,4 @@ static int secp256k1_ecdsa_sig_sign(const secp256k1_ecmult_gen_context *ctx, sec return 1; } -#endif +#endif /* SECP256K1_ECDSA_IMPL_H */ diff --git a/src/eckey.h b/src/eckey.h index 42739a3be..b621f1e6c 100644 --- a/src/eckey.h +++ b/src/eckey.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_ECKEY_ -#define _SECP256K1_ECKEY_ +#ifndef SECP256K1_ECKEY_H +#define SECP256K1_ECKEY_H #include @@ -22,4 +22,4 @@ static int secp256k1_eckey_pubkey_tweak_add(const secp256k1_ecmult_context *ctx, static int secp256k1_eckey_privkey_tweak_mul(secp256k1_scalar *key, const secp256k1_scalar *tweak); static int secp256k1_eckey_pubkey_tweak_mul(const secp256k1_ecmult_context *ctx, secp256k1_ge *key, const secp256k1_scalar *tweak); -#endif +#endif /* SECP256K1_ECKEY_H */ diff --git a/src/eckey_impl.h b/src/eckey_impl.h index ce38071ac..1ab9a68ec 100644 --- a/src/eckey_impl.h +++ b/src/eckey_impl.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_ECKEY_IMPL_H_ -#define _SECP256K1_ECKEY_IMPL_H_ +#ifndef SECP256K1_ECKEY_IMPL_H +#define SECP256K1_ECKEY_IMPL_H #include "eckey.h" @@ -15,16 +15,17 @@ #include "ecmult_gen.h" static int secp256k1_eckey_pubkey_parse(secp256k1_ge *elem, const unsigned char *pub, size_t size) { - if (size == 33 && (pub[0] == 0x02 || pub[0] == 0x03)) { + if (size == 33 && (pub[0] == SECP256K1_TAG_PUBKEY_EVEN || pub[0] == SECP256K1_TAG_PUBKEY_ODD)) { secp256k1_fe x; - return secp256k1_fe_set_b32(&x, pub+1) && secp256k1_ge_set_xo_var(elem, &x, pub[0] == 0x03); + return secp256k1_fe_set_b32(&x, pub+1) && secp256k1_ge_set_xo_var(elem, &x, pub[0] == SECP256K1_TAG_PUBKEY_ODD); } else if (size == 65 && (pub[0] == 0x04 || pub[0] == 0x06 || pub[0] == 0x07)) { secp256k1_fe x, y; if (!secp256k1_fe_set_b32(&x, pub+1) || !secp256k1_fe_set_b32(&y, pub+33)) { return 0; } secp256k1_ge_set_xy(elem, &x, &y); - if ((pub[0] == 0x06 || pub[0] == 0x07) && secp256k1_fe_is_odd(&y) != (pub[0] == 0x07)) { + if ((pub[0] == SECP256K1_TAG_PUBKEY_HYBRID_EVEN || pub[0] == SECP256K1_TAG_PUBKEY_HYBRID_ODD) && + secp256k1_fe_is_odd(&y) != (pub[0] == SECP256K1_TAG_PUBKEY_HYBRID_ODD)) { return 0; } return secp256k1_ge_is_valid_var(elem); @@ -42,10 +43,10 @@ static int secp256k1_eckey_pubkey_serialize(secp256k1_ge *elem, unsigned char *p secp256k1_fe_get_b32(&pub[1], &elem->x); if (compressed) { *size = 33; - pub[0] = 0x02 | (secp256k1_fe_is_odd(&elem->y) ? 0x01 : 0x00); + pub[0] = secp256k1_fe_is_odd(&elem->y) ? SECP256K1_TAG_PUBKEY_ODD : SECP256K1_TAG_PUBKEY_EVEN; } else { *size = 65; - pub[0] = 0x04; + pub[0] = SECP256K1_TAG_PUBKEY_UNCOMPRESSED; secp256k1_fe_get_b32(&pub[33], &elem->y); } return 1; @@ -96,4 +97,4 @@ static int secp256k1_eckey_pubkey_tweak_mul(const secp256k1_ecmult_context *ctx, return 1; } -#endif +#endif /* SECP256K1_ECKEY_IMPL_H */ diff --git a/src/ecmult.h b/src/ecmult.h index 20484134f..6d44aba60 100644 --- a/src/ecmult.h +++ b/src/ecmult.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_ECMULT_ -#define _SECP256K1_ECMULT_ +#ifndef SECP256K1_ECMULT_H +#define SECP256K1_ECMULT_H #include "num.h" #include "group.h" @@ -28,4 +28,4 @@ static int secp256k1_ecmult_context_is_built(const secp256k1_ecmult_context *ctx /** Double multiply: R = na*A + ng*G */ static void secp256k1_ecmult(const secp256k1_ecmult_context *ctx, secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_scalar *na, const secp256k1_scalar *ng); -#endif +#endif /* SECP256K1_ECMULT_H */ diff --git a/src/ecmult_const.h b/src/ecmult_const.h index 2b0097655..72bf7d758 100644 --- a/src/ecmult_const.h +++ b/src/ecmult_const.h @@ -4,12 +4,12 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_ECMULT_CONST_ -#define _SECP256K1_ECMULT_CONST_ +#ifndef SECP256K1_ECMULT_CONST_H +#define SECP256K1_ECMULT_CONST_H #include "scalar.h" #include "group.h" static void secp256k1_ecmult_const(secp256k1_gej *r, const secp256k1_ge *a, const secp256k1_scalar *q); -#endif +#endif /* SECP256K1_ECMULT_CONST_H */ diff --git a/src/ecmult_const_impl.h b/src/ecmult_const_impl.h index 0db314c48..7d7a172b7 100644 --- a/src/ecmult_const_impl.h +++ b/src/ecmult_const_impl.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_ECMULT_CONST_IMPL_ -#define _SECP256K1_ECMULT_CONST_IMPL_ +#ifndef SECP256K1_ECMULT_CONST_IMPL_H +#define SECP256K1_ECMULT_CONST_IMPL_H #include "scalar.h" #include "group.h" @@ -42,11 +42,12 @@ } while(0) -/** Convert a number to WNAF notation. The number becomes represented by sum(2^{wi} * wnaf[i], i=0..return_val) - * with the following guarantees: +/** Convert a number to WNAF notation. + * The number becomes represented by sum(2^{wi} * wnaf[i], i=0..WNAF_SIZE(w)+1) - return_val. + * It has the following guarantees: * - each wnaf[i] an odd integer between -(1 << w) and (1 << w) * - each wnaf[i] is nonzero - * - the number of words set is returned; this is always (WNAF_BITS + w - 1) / w + * - the number of words set is always WNAF_SIZE(w) + 1 * * Adapted from `The Width-w NAF Method Provides Small Memory and Fast Elliptic Scalar * Multiplications Secure against Side Channel Attacks`, Okeya and Tagaki. M. Joye (Ed.) @@ -236,4 +237,4 @@ static void secp256k1_ecmult_const(secp256k1_gej *r, const secp256k1_ge *a, cons } } -#endif +#endif /* SECP256K1_ECMULT_CONST_IMPL_H */ diff --git a/src/ecmult_gen.h b/src/ecmult_gen.h index eb2cc9ead..7564b7015 100644 --- a/src/ecmult_gen.h +++ b/src/ecmult_gen.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_ECMULT_GEN_ -#define _SECP256K1_ECMULT_GEN_ +#ifndef SECP256K1_ECMULT_GEN_H +#define SECP256K1_ECMULT_GEN_H #include "scalar.h" #include "group.h" @@ -40,4 +40,4 @@ static void secp256k1_ecmult_gen(const secp256k1_ecmult_gen_context* ctx, secp25 static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context *ctx, const unsigned char *seed32); -#endif +#endif /* SECP256K1_ECMULT_GEN_H */ diff --git a/src/ecmult_gen_impl.h b/src/ecmult_gen_impl.h index 35f254607..714f02e94 100644 --- a/src/ecmult_gen_impl.h +++ b/src/ecmult_gen_impl.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_ECMULT_GEN_IMPL_H_ -#define _SECP256K1_ECMULT_GEN_IMPL_H_ +#ifndef SECP256K1_ECMULT_GEN_IMPL_H +#define SECP256K1_ECMULT_GEN_IMPL_H #include "scalar.h" #include "group.h" @@ -161,7 +161,7 @@ static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context *ctx, const secp256k1_gej gb; secp256k1_fe s; unsigned char nonce32[32]; - secp256k1_rfc6979_hmac_sha256_t rng; + secp256k1_rfc6979_hmac_sha256 rng; int retry; unsigned char keydata[64] = {0}; if (seed32 == NULL) { @@ -207,4 +207,4 @@ static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context *ctx, const secp256k1_gej_clear(&gb); } -#endif +#endif /* SECP256K1_ECMULT_GEN_IMPL_H */ diff --git a/src/ecmult_impl.h b/src/ecmult_impl.h index 4e40104ad..93d3794cb 100644 --- a/src/ecmult_impl.h +++ b/src/ecmult_impl.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_ECMULT_IMPL_H_ -#define _SECP256K1_ECMULT_IMPL_H_ +#ifndef SECP256K1_ECMULT_IMPL_H +#define SECP256K1_ECMULT_IMPL_H #include @@ -403,4 +403,4 @@ static void secp256k1_ecmult(const secp256k1_ecmult_context *ctx, secp256k1_gej } } -#endif +#endif /* SECP256K1_ECMULT_IMPL_H */ diff --git a/src/field.h b/src/field.h index bbb1ee866..bb6692ad5 100644 --- a/src/field.h +++ b/src/field.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_FIELD_ -#define _SECP256K1_FIELD_ +#ifndef SECP256K1_FIELD_H +#define SECP256K1_FIELD_H /** Field element module. * @@ -129,4 +129,4 @@ static void secp256k1_fe_storage_cmov(secp256k1_fe_storage *r, const secp256k1_f /** If flag is true, set *r equal to *a; otherwise leave it. Constant-time. */ static void secp256k1_fe_cmov(secp256k1_fe *r, const secp256k1_fe *a, int flag); -#endif +#endif /* SECP256K1_FIELD_H */ diff --git a/src/field_10x26.h b/src/field_10x26.h index 61ee1e096..727c5267f 100644 --- a/src/field_10x26.h +++ b/src/field_10x26.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_FIELD_REPR_ -#define _SECP256K1_FIELD_REPR_ +#ifndef SECP256K1_FIELD_REPR_H +#define SECP256K1_FIELD_REPR_H #include @@ -44,4 +44,5 @@ typedef struct { #define SECP256K1_FE_STORAGE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{ (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7) }} #define SECP256K1_FE_STORAGE_CONST_GET(d) d.n[7], d.n[6], d.n[5], d.n[4],d.n[3], d.n[2], d.n[1], d.n[0] -#endif + +#endif /* SECP256K1_FIELD_REPR_H */ diff --git a/src/field_10x26_impl.h b/src/field_10x26_impl.h index 234c13a64..94f8132fc 100644 --- a/src/field_10x26_impl.h +++ b/src/field_10x26_impl.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_FIELD_REPR_IMPL_H_ -#define _SECP256K1_FIELD_REPR_IMPL_H_ +#ifndef SECP256K1_FIELD_REPR_IMPL_H +#define SECP256K1_FIELD_REPR_IMPL_H #include "util.h" #include "num.h" @@ -1158,4 +1158,4 @@ static SECP256K1_INLINE void secp256k1_fe_from_storage(secp256k1_fe *r, const se #endif } -#endif +#endif /* SECP256K1_FIELD_REPR_IMPL_H */ diff --git a/src/field_5x52.h b/src/field_5x52.h index 8e69a560d..bccd8feb4 100644 --- a/src/field_5x52.h +++ b/src/field_5x52.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_FIELD_REPR_ -#define _SECP256K1_FIELD_REPR_ +#ifndef SECP256K1_FIELD_REPR_H +#define SECP256K1_FIELD_REPR_H #include @@ -44,4 +44,4 @@ typedef struct { (d6) | (((uint64_t)(d7)) << 32) \ }} -#endif +#endif /* SECP256K1_FIELD_REPR_H */ diff --git a/src/field_5x52_asm_impl.h b/src/field_5x52_asm_impl.h index 98cc004bf..1fc3171f6 100644 --- a/src/field_5x52_asm_impl.h +++ b/src/field_5x52_asm_impl.h @@ -11,8 +11,8 @@ * - December 2014, Pieter Wuille: converted from YASM to GCC inline assembly */ -#ifndef _SECP256K1_FIELD_INNER5X52_IMPL_H_ -#define _SECP256K1_FIELD_INNER5X52_IMPL_H_ +#ifndef SECP256K1_FIELD_INNER5X52_IMPL_H +#define SECP256K1_FIELD_INNER5X52_IMPL_H SECP256K1_INLINE static void secp256k1_fe_mul_inner(uint64_t *r, const uint64_t *a, const uint64_t * SECP256K1_RESTRICT b) { /** @@ -499,4 +499,4 @@ __asm__ __volatile__( ); } -#endif +#endif /* SECP256K1_FIELD_INNER5X52_IMPL_H */ diff --git a/src/field_5x52_impl.h b/src/field_5x52_impl.h index 8e8b286ba..957c61b01 100644 --- a/src/field_5x52_impl.h +++ b/src/field_5x52_impl.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_FIELD_REPR_IMPL_H_ -#define _SECP256K1_FIELD_REPR_IMPL_H_ +#ifndef SECP256K1_FIELD_REPR_IMPL_H +#define SECP256K1_FIELD_REPR_IMPL_H #if defined HAVE_CONFIG_H #include "libsecp256k1-config.h" @@ -493,4 +493,4 @@ static SECP256K1_INLINE void secp256k1_fe_from_storage(secp256k1_fe *r, const se #endif } -#endif +#endif /* SECP256K1_FIELD_REPR_IMPL_H */ diff --git a/src/field_5x52_int128_impl.h b/src/field_5x52_int128_impl.h index 0bf22bdd3..95a0d1791 100644 --- a/src/field_5x52_int128_impl.h +++ b/src/field_5x52_int128_impl.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_FIELD_INNER5X52_IMPL_H_ -#define _SECP256K1_FIELD_INNER5X52_IMPL_H_ +#ifndef SECP256K1_FIELD_INNER5X52_IMPL_H +#define SECP256K1_FIELD_INNER5X52_IMPL_H #include @@ -274,4 +274,4 @@ SECP256K1_INLINE static void secp256k1_fe_sqr_inner(uint64_t *r, const uint64_t /* [r4 r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ } -#endif +#endif /* SECP256K1_FIELD_INNER5X52_IMPL_H */ diff --git a/src/field_impl.h b/src/field_impl.h index 5127b279b..20428648a 100644 --- a/src/field_impl.h +++ b/src/field_impl.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_FIELD_IMPL_H_ -#define _SECP256K1_FIELD_IMPL_H_ +#ifndef SECP256K1_FIELD_IMPL_H +#define SECP256K1_FIELD_IMPL_H #if defined HAVE_CONFIG_H #include "libsecp256k1-config.h" @@ -312,4 +312,4 @@ static int secp256k1_fe_is_quad_var(const secp256k1_fe *a) { #endif } -#endif +#endif /* SECP256K1_FIELD_IMPL_H */ diff --git a/src/group.h b/src/group.h index 4957b248f..ea1302deb 100644 --- a/src/group.h +++ b/src/group.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_GROUP_ -#define _SECP256K1_GROUP_ +#ifndef SECP256K1_GROUP_H +#define SECP256K1_GROUP_H #include "num.h" #include "field.h" @@ -141,4 +141,4 @@ static void secp256k1_ge_storage_cmov(secp256k1_ge_storage *r, const secp256k1_g /** Rescale a jacobian point by b which must be non-zero. Constant-time. */ static void secp256k1_gej_rescale(secp256k1_gej *r, const secp256k1_fe *b); -#endif +#endif /* SECP256K1_GROUP_H */ diff --git a/src/group_impl.h b/src/group_impl.h index 7d723532f..b31b6c12e 100644 --- a/src/group_impl.h +++ b/src/group_impl.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_GROUP_IMPL_H_ -#define _SECP256K1_GROUP_IMPL_H_ +#ifndef SECP256K1_GROUP_IMPL_H +#define SECP256K1_GROUP_IMPL_H #include "num.h" #include "field.h" @@ -697,4 +697,4 @@ static int secp256k1_gej_has_quad_y_var(const secp256k1_gej *a) { return secp256k1_fe_is_quad_var(&yz); } -#endif +#endif /* SECP256K1_GROUP_IMPL_H */ diff --git a/src/hash.h b/src/hash.h index fca98cab9..de26e4b89 100644 --- a/src/hash.h +++ b/src/hash.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_HASH_ -#define _SECP256K1_HASH_ +#ifndef SECP256K1_HASH_H +#define SECP256K1_HASH_H #include #include @@ -14,28 +14,28 @@ typedef struct { uint32_t s[8]; uint32_t buf[16]; /* In big endian */ size_t bytes; -} secp256k1_sha256_t; +} secp256k1_sha256; -static void secp256k1_sha256_initialize(secp256k1_sha256_t *hash); -static void secp256k1_sha256_write(secp256k1_sha256_t *hash, const unsigned char *data, size_t size); -static void secp256k1_sha256_finalize(secp256k1_sha256_t *hash, unsigned char *out32); +static void secp256k1_sha256_initialize(secp256k1_sha256 *hash); +static void secp256k1_sha256_write(secp256k1_sha256 *hash, const unsigned char *data, size_t size); +static void secp256k1_sha256_finalize(secp256k1_sha256 *hash, unsigned char *out32); typedef struct { - secp256k1_sha256_t inner, outer; -} secp256k1_hmac_sha256_t; + secp256k1_sha256 inner, outer; +} secp256k1_hmac_sha256; -static void secp256k1_hmac_sha256_initialize(secp256k1_hmac_sha256_t *hash, const unsigned char *key, size_t size); -static void secp256k1_hmac_sha256_write(secp256k1_hmac_sha256_t *hash, const unsigned char *data, size_t size); -static void secp256k1_hmac_sha256_finalize(secp256k1_hmac_sha256_t *hash, unsigned char *out32); +static void secp256k1_hmac_sha256_initialize(secp256k1_hmac_sha256 *hash, const unsigned char *key, size_t size); +static void secp256k1_hmac_sha256_write(secp256k1_hmac_sha256 *hash, const unsigned char *data, size_t size); +static void secp256k1_hmac_sha256_finalize(secp256k1_hmac_sha256 *hash, unsigned char *out32); typedef struct { unsigned char v[32]; unsigned char k[32]; int retry; -} secp256k1_rfc6979_hmac_sha256_t; +} secp256k1_rfc6979_hmac_sha256; -static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha256_t *rng, const unsigned char *key, size_t keylen); -static void secp256k1_rfc6979_hmac_sha256_generate(secp256k1_rfc6979_hmac_sha256_t *rng, unsigned char *out, size_t outlen); -static void secp256k1_rfc6979_hmac_sha256_finalize(secp256k1_rfc6979_hmac_sha256_t *rng); +static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha256 *rng, const unsigned char *key, size_t keylen); +static void secp256k1_rfc6979_hmac_sha256_generate(secp256k1_rfc6979_hmac_sha256 *rng, unsigned char *out, size_t outlen); +static void secp256k1_rfc6979_hmac_sha256_finalize(secp256k1_rfc6979_hmac_sha256 *rng); -#endif +#endif /* SECP256K1_HASH_H */ diff --git a/src/hash_impl.h b/src/hash_impl.h index b47e65f83..c06db9e33 100644 --- a/src/hash_impl.h +++ b/src/hash_impl.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_HASH_IMPL_H_ -#define _SECP256K1_HASH_IMPL_H_ +#ifndef SECP256K1_HASH_IMPL_H +#define SECP256K1_HASH_IMPL_H #include "hash.h" @@ -33,7 +33,7 @@ #define BE32(p) ((((p) & 0xFF) << 24) | (((p) & 0xFF00) << 8) | (((p) & 0xFF0000) >> 8) | (((p) & 0xFF000000) >> 24)) #endif -static void secp256k1_sha256_initialize(secp256k1_sha256_t *hash) { +static void secp256k1_sha256_initialize(secp256k1_sha256 *hash) { hash->s[0] = 0x6a09e667ul; hash->s[1] = 0xbb67ae85ul; hash->s[2] = 0x3c6ef372ul; @@ -128,7 +128,7 @@ static void secp256k1_sha256_transform(uint32_t* s, const uint32_t* chunk) { s[7] += h; } -static void secp256k1_sha256_write(secp256k1_sha256_t *hash, const unsigned char *data, size_t len) { +static void secp256k1_sha256_write(secp256k1_sha256 *hash, const unsigned char *data, size_t len) { size_t bufsize = hash->bytes & 0x3F; hash->bytes += len; while (bufsize + len >= 64) { @@ -145,7 +145,7 @@ static void secp256k1_sha256_write(secp256k1_sha256_t *hash, const unsigned char } } -static void secp256k1_sha256_finalize(secp256k1_sha256_t *hash, unsigned char *out32) { +static void secp256k1_sha256_finalize(secp256k1_sha256 *hash, unsigned char *out32) { static const unsigned char pad[64] = {0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; uint32_t sizedesc[2]; uint32_t out[8]; @@ -161,14 +161,14 @@ static void secp256k1_sha256_finalize(secp256k1_sha256_t *hash, unsigned char *o memcpy(out32, (const unsigned char*)out, 32); } -static void secp256k1_hmac_sha256_initialize(secp256k1_hmac_sha256_t *hash, const unsigned char *key, size_t keylen) { +static void secp256k1_hmac_sha256_initialize(secp256k1_hmac_sha256 *hash, const unsigned char *key, size_t keylen) { int n; unsigned char rkey[64]; if (keylen <= 64) { memcpy(rkey, key, keylen); memset(rkey + keylen, 0, 64 - keylen); } else { - secp256k1_sha256_t sha256; + secp256k1_sha256 sha256; secp256k1_sha256_initialize(&sha256); secp256k1_sha256_write(&sha256, key, keylen); secp256k1_sha256_finalize(&sha256, rkey); @@ -189,11 +189,11 @@ static void secp256k1_hmac_sha256_initialize(secp256k1_hmac_sha256_t *hash, cons memset(rkey, 0, 64); } -static void secp256k1_hmac_sha256_write(secp256k1_hmac_sha256_t *hash, const unsigned char *data, size_t size) { +static void secp256k1_hmac_sha256_write(secp256k1_hmac_sha256 *hash, const unsigned char *data, size_t size) { secp256k1_sha256_write(&hash->inner, data, size); } -static void secp256k1_hmac_sha256_finalize(secp256k1_hmac_sha256_t *hash, unsigned char *out32) { +static void secp256k1_hmac_sha256_finalize(secp256k1_hmac_sha256 *hash, unsigned char *out32) { unsigned char temp[32]; secp256k1_sha256_finalize(&hash->inner, temp); secp256k1_sha256_write(&hash->outer, temp, 32); @@ -202,8 +202,8 @@ static void secp256k1_hmac_sha256_finalize(secp256k1_hmac_sha256_t *hash, unsign } -static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha256_t *rng, const unsigned char *key, size_t keylen) { - secp256k1_hmac_sha256_t hmac; +static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha256 *rng, const unsigned char *key, size_t keylen) { + secp256k1_hmac_sha256 hmac; static const unsigned char zero[1] = {0x00}; static const unsigned char one[1] = {0x01}; @@ -232,11 +232,11 @@ static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha2 rng->retry = 0; } -static void secp256k1_rfc6979_hmac_sha256_generate(secp256k1_rfc6979_hmac_sha256_t *rng, unsigned char *out, size_t outlen) { +static void secp256k1_rfc6979_hmac_sha256_generate(secp256k1_rfc6979_hmac_sha256 *rng, unsigned char *out, size_t outlen) { /* RFC6979 3.2.h. */ static const unsigned char zero[1] = {0x00}; if (rng->retry) { - secp256k1_hmac_sha256_t hmac; + secp256k1_hmac_sha256 hmac; secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); secp256k1_hmac_sha256_write(&hmac, rng->v, 32); secp256k1_hmac_sha256_write(&hmac, zero, 1); @@ -247,7 +247,7 @@ static void secp256k1_rfc6979_hmac_sha256_generate(secp256k1_rfc6979_hmac_sha256 } while (outlen > 0) { - secp256k1_hmac_sha256_t hmac; + secp256k1_hmac_sha256 hmac; int now = outlen; secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); secp256k1_hmac_sha256_write(&hmac, rng->v, 32); @@ -263,7 +263,7 @@ static void secp256k1_rfc6979_hmac_sha256_generate(secp256k1_rfc6979_hmac_sha256 rng->retry = 1; } -static void secp256k1_rfc6979_hmac_sha256_finalize(secp256k1_rfc6979_hmac_sha256_t *rng) { +static void secp256k1_rfc6979_hmac_sha256_finalize(secp256k1_rfc6979_hmac_sha256 *rng) { memset(rng->k, 0, 32); memset(rng->v, 0, 32); rng->retry = 0; @@ -278,4 +278,4 @@ static void secp256k1_rfc6979_hmac_sha256_finalize(secp256k1_rfc6979_hmac_sha256 #undef Maj #undef Ch -#endif +#endif /* SECP256K1_HASH_IMPL_H */ diff --git a/src/modules/ecdh/main_impl.h b/src/modules/ecdh/main_impl.h index 9e30fb73d..bd8739eeb 100644 --- a/src/modules/ecdh/main_impl.h +++ b/src/modules/ecdh/main_impl.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_MODULE_ECDH_MAIN_ -#define _SECP256K1_MODULE_ECDH_MAIN_ +#ifndef SECP256K1_MODULE_ECDH_MAIN_H +#define SECP256K1_MODULE_ECDH_MAIN_H #include "include/secp256k1_ecdh.h" #include "ecmult_const_impl.h" @@ -28,7 +28,7 @@ int secp256k1_ecdh(const secp256k1_context* ctx, unsigned char *result, const se } else { unsigned char x[32]; unsigned char y[1]; - secp256k1_sha256_t sha; + secp256k1_sha256 sha; secp256k1_ecmult_const(&res, &pt, &s); secp256k1_ge_set_gej(&pt, &res); @@ -51,4 +51,4 @@ int secp256k1_ecdh(const secp256k1_context* ctx, unsigned char *result, const se return ret; } -#endif +#endif /* SECP256K1_MODULE_ECDH_MAIN_H */ diff --git a/src/modules/ecdh/tests_impl.h b/src/modules/ecdh/tests_impl.h index 85a5d0a9a..0c53f8ee0 100644 --- a/src/modules/ecdh/tests_impl.h +++ b/src/modules/ecdh/tests_impl.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_MODULE_ECDH_TESTS_ -#define _SECP256K1_MODULE_ECDH_TESTS_ +#ifndef SECP256K1_MODULE_ECDH_TESTS_H +#define SECP256K1_MODULE_ECDH_TESTS_H void test_ecdh_api(void) { /* Setup context that just counts errors */ @@ -44,7 +44,7 @@ void test_ecdh_generator_basepoint(void) { s_one[31] = 1; /* Check against pubkey creation when the basepoint is the generator */ for (i = 0; i < 100; ++i) { - secp256k1_sha256_t sha; + secp256k1_sha256 sha; unsigned char s_b32[32]; unsigned char output_ecdh[32]; unsigned char output_ser[32]; @@ -102,4 +102,4 @@ void run_ecdh_tests(void) { test_bad_scalar(); } -#endif +#endif /* SECP256K1_MODULE_ECDH_TESTS_H */ diff --git a/src/modules/recovery/main_impl.h b/src/modules/recovery/main_impl.h index c6fbe2398..2f6691c5a 100755 --- a/src/modules/recovery/main_impl.h +++ b/src/modules/recovery/main_impl.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_MODULE_RECOVERY_MAIN_ -#define _SECP256K1_MODULE_RECOVERY_MAIN_ +#ifndef SECP256K1_MODULE_RECOVERY_MAIN_H +#define SECP256K1_MODULE_RECOVERY_MAIN_H #include "include/secp256k1_recovery.h" @@ -190,4 +190,4 @@ int secp256k1_ecdsa_recover(const secp256k1_context* ctx, secp256k1_pubkey *pubk } } -#endif +#endif /* SECP256K1_MODULE_RECOVERY_MAIN_H */ diff --git a/src/modules/recovery/tests_impl.h b/src/modules/recovery/tests_impl.h index 765c7dd81..5c9bbe861 100644 --- a/src/modules/recovery/tests_impl.h +++ b/src/modules/recovery/tests_impl.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_MODULE_RECOVERY_TESTS_ -#define _SECP256K1_MODULE_RECOVERY_TESTS_ +#ifndef SECP256K1_MODULE_RECOVERY_TESTS_H +#define SECP256K1_MODULE_RECOVERY_TESTS_H static int recovery_test_nonce_function(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter) { (void) msg32; @@ -390,4 +390,4 @@ void run_recovery_tests(void) { test_ecdsa_recovery_edge_cases(); } -#endif +#endif /* SECP256K1_MODULE_RECOVERY_TESTS_H */ diff --git a/src/num.h b/src/num.h index 7bb9c5be8..49f2dd791 100644 --- a/src/num.h +++ b/src/num.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_NUM_ -#define _SECP256K1_NUM_ +#ifndef SECP256K1_NUM_H +#define SECP256K1_NUM_H #ifndef USE_NUM_NONE @@ -71,4 +71,4 @@ static void secp256k1_num_negate(secp256k1_num *r); #endif -#endif +#endif /* SECP256K1_NUM_H */ diff --git a/src/num_gmp.h b/src/num_gmp.h index 7dd813088..3619844bd 100644 --- a/src/num_gmp.h +++ b/src/num_gmp.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_NUM_REPR_ -#define _SECP256K1_NUM_REPR_ +#ifndef SECP256K1_NUM_REPR_H +#define SECP256K1_NUM_REPR_H #include @@ -17,4 +17,4 @@ typedef struct { int limbs; } secp256k1_num; -#endif +#endif /* SECP256K1_NUM_REPR_H */ diff --git a/src/num_gmp_impl.h b/src/num_gmp_impl.h index 3a46495ee..0ae2a8ba0 100644 --- a/src/num_gmp_impl.h +++ b/src/num_gmp_impl.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_NUM_REPR_IMPL_H_ -#define _SECP256K1_NUM_REPR_IMPL_H_ +#ifndef SECP256K1_NUM_REPR_IMPL_H +#define SECP256K1_NUM_REPR_IMPL_H #include #include @@ -285,4 +285,4 @@ static void secp256k1_num_negate(secp256k1_num *r) { r->neg ^= 1; } -#endif +#endif /* SECP256K1_NUM_REPR_IMPL_H */ diff --git a/src/num_impl.h b/src/num_impl.h index 0b0e3a072..c45193b03 100644 --- a/src/num_impl.h +++ b/src/num_impl.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_NUM_IMPL_H_ -#define _SECP256K1_NUM_IMPL_H_ +#ifndef SECP256K1_NUM_IMPL_H +#define SECP256K1_NUM_IMPL_H #if defined HAVE_CONFIG_H #include "libsecp256k1-config.h" @@ -21,4 +21,4 @@ #error "Please select num implementation" #endif -#endif +#endif /* SECP256K1_NUM_IMPL_H */ diff --git a/src/scalar.h b/src/scalar.h index 27e9d8375..59304cb66 100644 --- a/src/scalar.h +++ b/src/scalar.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_SCALAR_ -#define _SECP256K1_SCALAR_ +#ifndef SECP256K1_SCALAR_H +#define SECP256K1_SCALAR_H #include "num.h" @@ -103,4 +103,4 @@ static void secp256k1_scalar_split_lambda(secp256k1_scalar *r1, secp256k1_scalar /** Multiply a and b (without taking the modulus!), divide by 2**shift, and round to the nearest integer. Shift must be at least 256. */ static void secp256k1_scalar_mul_shift_var(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b, unsigned int shift); -#endif +#endif /* SECP256K1_SCALAR_H */ diff --git a/src/scalar_4x64.h b/src/scalar_4x64.h index cff406038..19c7495d1 100644 --- a/src/scalar_4x64.h +++ b/src/scalar_4x64.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_SCALAR_REPR_ -#define _SECP256K1_SCALAR_REPR_ +#ifndef SECP256K1_SCALAR_REPR_H +#define SECP256K1_SCALAR_REPR_H #include @@ -16,4 +16,4 @@ typedef struct { #define SECP256K1_SCALAR_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{((uint64_t)(d1)) << 32 | (d0), ((uint64_t)(d3)) << 32 | (d2), ((uint64_t)(d5)) << 32 | (d4), ((uint64_t)(d7)) << 32 | (d6)}} -#endif +#endif /* SECP256K1_SCALAR_REPR_H */ diff --git a/src/scalar_4x64_impl.h b/src/scalar_4x64_impl.h index 56e7bd82a..db1ebf94b 100644 --- a/src/scalar_4x64_impl.h +++ b/src/scalar_4x64_impl.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_SCALAR_REPR_IMPL_H_ -#define _SECP256K1_SCALAR_REPR_IMPL_H_ +#ifndef SECP256K1_SCALAR_REPR_IMPL_H +#define SECP256K1_SCALAR_REPR_IMPL_H /* Limbs of the secp256k1 order. */ #define SECP256K1_N_0 ((uint64_t)0xBFD25E8CD0364141ULL) @@ -946,4 +946,4 @@ SECP256K1_INLINE static void secp256k1_scalar_mul_shift_var(secp256k1_scalar *r, secp256k1_scalar_cadd_bit(r, 0, (l[(shift - 1) >> 6] >> ((shift - 1) & 0x3f)) & 1); } -#endif +#endif /* SECP256K1_SCALAR_REPR_IMPL_H */ diff --git a/src/scalar_8x32.h b/src/scalar_8x32.h index 1319664f6..2c9a348e2 100644 --- a/src/scalar_8x32.h +++ b/src/scalar_8x32.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_SCALAR_REPR_ -#define _SECP256K1_SCALAR_REPR_ +#ifndef SECP256K1_SCALAR_REPR_H +#define SECP256K1_SCALAR_REPR_H #include @@ -16,4 +16,4 @@ typedef struct { #define SECP256K1_SCALAR_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{(d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7)}} -#endif +#endif /* SECP256K1_SCALAR_REPR_H */ diff --git a/src/scalar_8x32_impl.h b/src/scalar_8x32_impl.h index aae4f35c0..4f9ed61fe 100644 --- a/src/scalar_8x32_impl.h +++ b/src/scalar_8x32_impl.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_SCALAR_REPR_IMPL_H_ -#define _SECP256K1_SCALAR_REPR_IMPL_H_ +#ifndef SECP256K1_SCALAR_REPR_IMPL_H +#define SECP256K1_SCALAR_REPR_IMPL_H /* Limbs of the secp256k1 order. */ #define SECP256K1_N_0 ((uint32_t)0xD0364141UL) @@ -718,4 +718,4 @@ SECP256K1_INLINE static void secp256k1_scalar_mul_shift_var(secp256k1_scalar *r, secp256k1_scalar_cadd_bit(r, 0, (l[(shift - 1) >> 5] >> ((shift - 1) & 0x1f)) & 1); } -#endif +#endif /* SECP256K1_SCALAR_REPR_IMPL_H */ diff --git a/src/scalar_impl.h b/src/scalar_impl.h index 2690d8655..fa790570f 100644 --- a/src/scalar_impl.h +++ b/src/scalar_impl.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_SCALAR_IMPL_H_ -#define _SECP256K1_SCALAR_IMPL_H_ +#ifndef SECP256K1_SCALAR_IMPL_H +#define SECP256K1_SCALAR_IMPL_H #include "group.h" #include "scalar.h" @@ -330,4 +330,4 @@ static void secp256k1_scalar_split_lambda(secp256k1_scalar *r1, secp256k1_scalar #endif #endif -#endif +#endif /* SECP256K1_SCALAR_IMPL_H */ diff --git a/src/scalar_low.h b/src/scalar_low.h index 5574c44c7..5836febc5 100644 --- a/src/scalar_low.h +++ b/src/scalar_low.h @@ -4,12 +4,12 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_SCALAR_REPR_ -#define _SECP256K1_SCALAR_REPR_ +#ifndef SECP256K1_SCALAR_REPR_H +#define SECP256K1_SCALAR_REPR_H #include /** A scalar modulo the group order of the secp256k1 curve. */ typedef uint32_t secp256k1_scalar; -#endif +#endif /* SECP256K1_SCALAR_REPR_H */ diff --git a/src/scalar_low_impl.h b/src/scalar_low_impl.h index 4f94441f4..c80e70c5a 100644 --- a/src/scalar_low_impl.h +++ b/src/scalar_low_impl.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_SCALAR_REPR_IMPL_H_ -#define _SECP256K1_SCALAR_REPR_IMPL_H_ +#ifndef SECP256K1_SCALAR_REPR_IMPL_H +#define SECP256K1_SCALAR_REPR_IMPL_H #include "scalar.h" @@ -111,4 +111,4 @@ SECP256K1_INLINE static int secp256k1_scalar_eq(const secp256k1_scalar *a, const return *a == *b; } -#endif +#endif /* SECP256K1_SCALAR_REPR_IMPL_H */ diff --git a/src/secp256k1.c b/src/secp256k1.c index 4f8c01655..cecb1550b 100644 --- a/src/secp256k1.c +++ b/src/secp256k1.c @@ -310,7 +310,7 @@ int secp256k1_ecdsa_verify(const secp256k1_context* ctx, const secp256k1_ecdsa_s static int nonce_function_rfc6979(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter) { unsigned char keydata[112]; int keylen = 64; - secp256k1_rfc6979_hmac_sha256_t rng; + secp256k1_rfc6979_hmac_sha256 rng; unsigned int i; /* We feed a byte array to the PRNG as input, consisting of: * - the private key (32 bytes) and message (32 bytes), see RFC 6979 3.2d. diff --git a/src/testrand.h b/src/testrand.h index f8efa93c7..f1f9be077 100644 --- a/src/testrand.h +++ b/src/testrand.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_TESTRAND_H_ -#define _SECP256K1_TESTRAND_H_ +#ifndef SECP256K1_TESTRAND_H +#define SECP256K1_TESTRAND_H #if defined HAVE_CONFIG_H #include "libsecp256k1-config.h" @@ -35,4 +35,4 @@ static void secp256k1_rand256_test(unsigned char *b32); /** Generate pseudorandom bytes with long sequences of zero and one bits. */ static void secp256k1_rand_bytes_test(unsigned char *bytes, size_t len); -#endif +#endif /* SECP256K1_TESTRAND_H */ diff --git a/src/testrand_impl.h b/src/testrand_impl.h index 15c7b9f12..30a91e529 100644 --- a/src/testrand_impl.h +++ b/src/testrand_impl.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_TESTRAND_IMPL_H_ -#define _SECP256K1_TESTRAND_IMPL_H_ +#ifndef SECP256K1_TESTRAND_IMPL_H +#define SECP256K1_TESTRAND_IMPL_H #include #include @@ -13,7 +13,7 @@ #include "testrand.h" #include "hash.h" -static secp256k1_rfc6979_hmac_sha256_t secp256k1_test_rng; +static secp256k1_rfc6979_hmac_sha256 secp256k1_test_rng; static uint32_t secp256k1_test_rng_precomputed[8]; static int secp256k1_test_rng_precomputed_used = 8; static uint64_t secp256k1_test_rng_integer; @@ -107,4 +107,4 @@ static void secp256k1_rand256_test(unsigned char *b32) { secp256k1_rand_bytes_test(b32, 32); } -#endif +#endif /* SECP256K1_TESTRAND_IMPL_H */ diff --git a/src/tests.c b/src/tests.c index 3d9bd5ebb..f307b99d5 100644 --- a/src/tests.c +++ b/src/tests.c @@ -270,7 +270,7 @@ void run_sha256_tests(void) { int i; for (i = 0; i < 8; i++) { unsigned char out[32]; - secp256k1_sha256_t hasher; + secp256k1_sha256 hasher; secp256k1_sha256_initialize(&hasher); secp256k1_sha256_write(&hasher, (const unsigned char*)(inputs[i]), strlen(inputs[i])); secp256k1_sha256_finalize(&hasher, out); @@ -313,7 +313,7 @@ void run_hmac_sha256_tests(void) { }; int i; for (i = 0; i < 6; i++) { - secp256k1_hmac_sha256_t hasher; + secp256k1_hmac_sha256 hasher; unsigned char out[32]; secp256k1_hmac_sha256_initialize(&hasher, (const unsigned char*)(keys[i]), strlen(keys[i])); secp256k1_hmac_sha256_write(&hasher, (const unsigned char*)(inputs[i]), strlen(inputs[i])); @@ -345,7 +345,7 @@ void run_rfc6979_hmac_sha256_tests(void) { {0x75, 0x97, 0x88, 0x7c, 0xbd, 0x76, 0x32, 0x1f, 0x32, 0xe3, 0x04, 0x40, 0x67, 0x9a, 0x22, 0xcf, 0x7f, 0x8d, 0x9d, 0x2e, 0xac, 0x39, 0x0e, 0x58, 0x1f, 0xea, 0x09, 0x1c, 0xe2, 0x02, 0xba, 0x94} }; - secp256k1_rfc6979_hmac_sha256_t rng; + secp256k1_rfc6979_hmac_sha256 rng; unsigned char out[32]; int i; diff --git a/src/util.h b/src/util.h index 4092a86c9..b0441d8e3 100644 --- a/src/util.h +++ b/src/util.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_UTIL_H_ -#define _SECP256K1_UTIL_H_ +#ifndef SECP256K1_UTIL_H +#define SECP256K1_UTIL_H #if defined HAVE_CONFIG_H #include "libsecp256k1-config.h" @@ -110,4 +110,4 @@ static SECP256K1_INLINE void *checked_malloc(const secp256k1_callback* cb, size_ SECP256K1_GNUC_EXT typedef unsigned __int128 uint128_t; #endif -#endif +#endif /* SECP256K1_UTIL_H */ From 4e4aa5b6ec5ba34de77c837362b589003e007a00 Mon Sep 17 00:00:00 2001 From: syd Date: Thu, 23 Nov 2017 14:20:20 -0500 Subject: [PATCH 0309/1062] Get rid of underscore prefixes for include guards. This is because they may conflict with reserved names. Also took this opportunity to make the guards in the zcash subdir a bit more uniform by having them all conform to ZC_<...>_H_ This closes #1272 --- src/univalue/include/univalue.h | 6 +++--- src/zcash/Address.hpp | 6 +++--- src/zcash/IncrementalMerkleTree.hpp | 7 +++---- src/zcash/JoinSplit.hpp | 6 +++--- src/zcash/Note.hpp | 6 +++--- src/zcash/Proof.hpp | 6 +++--- src/zcash/Zcash.h | 6 +++--- src/zcash/prf.h | 6 +++--- src/zcash/util.h | 6 +++--- 9 files changed, 27 insertions(+), 28 deletions(-) diff --git a/src/univalue/include/univalue.h b/src/univalue/include/univalue.h index 07314bc5c..dfc84f921 100644 --- a/src/univalue/include/univalue.h +++ b/src/univalue/include/univalue.h @@ -3,8 +3,8 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef __UNIVALUE_H__ -#define __UNIVALUE_H__ +#ifndef UNIVALUE_H__ +#define UNIVALUE_H__ #include @@ -293,4 +293,4 @@ extern const UniValue NullUniValue; const UniValue& find_value( const UniValue& obj, const std::string& name); -#endif // __UNIVALUE_H__ +#endif // UNIVALUE_H__ diff --git a/src/zcash/Address.hpp b/src/zcash/Address.hpp index efae2af22..9bf22663d 100644 --- a/src/zcash/Address.hpp +++ b/src/zcash/Address.hpp @@ -1,5 +1,5 @@ -#ifndef _ZCADDRESS_H_ -#define _ZCADDRESS_H_ +#ifndef ZC_ADDRESS_H_ +#define ZC_ADDRESS_H_ #include "uint256.h" #include "uint252.h" @@ -58,4 +58,4 @@ public: } -#endif // _ZCADDRESS_H_ +#endif // ZC_ADDRESS_H_ diff --git a/src/zcash/IncrementalMerkleTree.hpp b/src/zcash/IncrementalMerkleTree.hpp index 67b356318..151a395c1 100644 --- a/src/zcash/IncrementalMerkleTree.hpp +++ b/src/zcash/IncrementalMerkleTree.hpp @@ -1,5 +1,5 @@ -#ifndef ZCINCREMENTALMERKLETREE_H_ -#define ZCINCREMENTALMERKLETREE_H_ +#ifndef ZC_INCREMENTALMERKLETREE_H_ +#define ZC_INCREMENTALMERKLETREE_H_ #include #include @@ -202,5 +202,4 @@ typedef libzcash::IncrementalMerkleTree ZCIncrementalWitness; typedef libzcash::IncrementalWitness ZCTestingIncrementalWitness; -#endif /* ZCINCREMENTALMERKLETREE_H_ */ - +#endif /* ZC_INCREMENTALMERKLETREE_H_ */ diff --git a/src/zcash/JoinSplit.hpp b/src/zcash/JoinSplit.hpp index b7ed454fd..6a2d4e1f2 100644 --- a/src/zcash/JoinSplit.hpp +++ b/src/zcash/JoinSplit.hpp @@ -1,5 +1,5 @@ -#ifndef _ZCJOINSPLIT_H_ -#define _ZCJOINSPLIT_H_ +#ifndef ZC_JOINSPLIT_H_ +#define ZC_JOINSPLIT_H_ #include "Zcash.h" #include "Proof.hpp" @@ -102,4 +102,4 @@ protected: typedef libzcash::JoinSplit ZCJoinSplit; -#endif // _ZCJOINSPLIT_H_ +#endif // ZC_JOINSPLIT_H_ diff --git a/src/zcash/Note.hpp b/src/zcash/Note.hpp index 460e68f9d..faacd2720 100644 --- a/src/zcash/Note.hpp +++ b/src/zcash/Note.hpp @@ -1,5 +1,5 @@ -#ifndef _ZCNOTE_H_ -#define _ZCNOTE_H_ +#ifndef ZC_NOTE_H_ +#define ZC_NOTE_H_ #include "uint256.h" #include "Zcash.h" @@ -68,4 +68,4 @@ public: } -#endif // _ZCNOTE_H_ \ No newline at end of file +#endif // ZC_NOTE_H_ diff --git a/src/zcash/Proof.hpp b/src/zcash/Proof.hpp index 3b6b5e568..5f05aa2c5 100644 --- a/src/zcash/Proof.hpp +++ b/src/zcash/Proof.hpp @@ -1,5 +1,5 @@ -#ifndef _ZCPROOF_H_ -#define _ZCPROOF_H_ +#ifndef ZC_PROOF_H_ +#define ZC_PROOF_H_ #include "serialize.h" #include "uint256.h" @@ -274,4 +274,4 @@ public: } -#endif // _ZCPROOF_H_ +#endif // ZC_PROOF_H_ diff --git a/src/zcash/Zcash.h b/src/zcash/Zcash.h index c2dfe548b..9e6684475 100644 --- a/src/zcash/Zcash.h +++ b/src/zcash/Zcash.h @@ -1,5 +1,5 @@ -#ifndef _ZCCONSTANTS_H_ -#define _ZCCONSTANTS_H_ +#ifndef ZC_ZCASH_H_ +#define ZC_ZCASH_H_ #define ZC_NUM_JS_INPUTS 2 #define ZC_NUM_JS_OUTPUTS 2 @@ -14,4 +14,4 @@ #define ZC_NOTEPLAINTEXT_SIZE (ZC_NOTEPLAINTEXT_LEADING + ZC_V_SIZE + ZC_RHO_SIZE + ZC_R_SIZE + ZC_MEMO_SIZE) -#endif // _ZCCONSTANTS_H_ +#endif // ZC_ZCASH_H_ diff --git a/src/zcash/prf.h b/src/zcash/prf.h index c6cb45384..dec934f4a 100644 --- a/src/zcash/prf.h +++ b/src/zcash/prf.h @@ -3,8 +3,8 @@ Zcash uses SHA256Compress as a PRF for various components within the zkSNARK circuit. */ -#ifndef _PRF_H_ -#define _PRF_H_ +#ifndef ZC_PRF_H_ +#define ZC_PRF_H_ #include "uint256.h" #include "uint252.h" @@ -15,4 +15,4 @@ uint256 PRF_nf(const uint252& a_sk, const uint256& rho); uint256 PRF_pk(const uint252& a_sk, size_t i0, const uint256& h_sig); uint256 PRF_rho(const uint252& phi, size_t i0, const uint256& h_sig); -#endif // _PRF_H_ +#endif // ZC_PRF_H_ diff --git a/src/zcash/util.h b/src/zcash/util.h index bbfeac1c3..10886e3ca 100644 --- a/src/zcash/util.h +++ b/src/zcash/util.h @@ -1,5 +1,5 @@ -#ifndef __ZCASH_UTIL_H -#define __ZCASH_UTIL_H +#ifndef ZC_UTIL_H_ +#define ZC_UTIL_H_ #include #include @@ -8,4 +8,4 @@ std::vector convertIntToVectorLE(const uint64_t val_int); std::vector convertBytesVectorToVector(const std::vector& bytes); uint64_t convertVectorToInt(const std::vector& v); -#endif // __ZCASH_UTIL_H +#endif // ZC_UTIL_H_ From e619c219441191d6d2c47a5f89463fd83e66809d Mon Sep 17 00:00:00 2001 From: syd Date: Thu, 23 Nov 2017 16:00:05 -0500 Subject: [PATCH 0310/1062] Rename bash completion files so that they refer to zcash and not bitcoin. This closes #2167 --- ...sh-completion => zcash-cli.bash-completion} | 16 ++++++++-------- ...ash-completion => zcash-tx.bash-completion} | 18 +++++++++--------- ....bash-completion => zcashd.bash-completion} | 6 +++--- zcutil/build-debian-package.sh | 4 ++-- 4 files changed, 22 insertions(+), 22 deletions(-) rename contrib/{bitcoin-cli.bash-completion => zcash-cli.bash-completion} (92%) rename contrib/{bitcoin-tx.bash-completion => zcash-tx.bash-completion} (74%) rename contrib/{bitcoind.bash-completion => zcashd.bash-completion} (91%) diff --git a/contrib/bitcoin-cli.bash-completion b/contrib/zcash-cli.bash-completion similarity index 92% rename from contrib/bitcoin-cli.bash-completion rename to contrib/zcash-cli.bash-completion index f2a44d232..79b57a063 100644 --- a/contrib/bitcoin-cli.bash-completion +++ b/contrib/zcash-cli.bash-completion @@ -1,9 +1,9 @@ -# bash programmable completion for bitcoin-cli(1) +# bash programmable completion for zcash-cli(1) # Copyright (c) 2012-2016 The Bitcoin Core developers # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. -# call $bitcoin-cli for RPC +# call $zcash-cli for RPC _zcash_rpc() { # determine already specified args necessary for RPC local rpcargs=() @@ -14,7 +14,7 @@ _zcash_rpc() { ;; esac done - $bitcoin_cli "${rpcargs[@]}" "$@" + $zcash_cli "${rpcargs[@]}" "$@" } # Add wallet accounts to COMPREPLY @@ -28,11 +28,11 @@ _zcash_accounts() { _zcash_cli() { local cur prev words=() cword - local bitcoin_cli + local zcash_cli - # save and use original argument to invoke bitcoin-cli for -help, help and RPC - # as bitcoin-cli might not be in $PATH - bitcoin_cli="$1" + # save and use original argument to invoke zcash-cli for -help, help and RPC + # as zcash-cli might not be in $PATH + zcash_cli="$1" COMPREPLY=() _get_comp_words_by_ref -n = cur prev words cword @@ -127,7 +127,7 @@ _zcash_cli() { # only parse -help if senseful if [[ -z "$cur" || "$cur" =~ ^- ]]; then - helpopts=$($bitcoin_cli -help 2>&1 | awk '$1 ~ /^-/ { sub(/=.*/, "="); print $1 }' ) + helpopts=$($zcash_cli -help 2>&1 | awk '$1 ~ /^-/ { sub(/=.*/, "="); print $1 }' ) fi # only parse help if senseful diff --git a/contrib/bitcoin-tx.bash-completion b/contrib/zcash-tx.bash-completion similarity index 74% rename from contrib/bitcoin-tx.bash-completion rename to contrib/zcash-tx.bash-completion index 0206eba74..e808f93cb 100644 --- a/contrib/bitcoin-tx.bash-completion +++ b/contrib/zcash-tx.bash-completion @@ -1,15 +1,15 @@ -# bash programmable completion for bitcoin-tx(1) +# bash programmable completion for zcash-tx(1) # Copyright (c) 2016 The Bitcoin Core developers # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. -_bitcoin_tx() { +_zcash_tx() { local cur prev words=() cword - local bitcoin_tx + local zcash_tx - # save and use original argument to invoke bitcoin-tx for -help + # save and use original argument to invoke zcash-tx for -help # it might not be in $PATH - bitcoin_tx="$1" + zcash_tx="$1" COMPREPLY=() _get_comp_words_by_ref -n =: cur prev words cword @@ -27,15 +27,15 @@ _bitcoin_tx() { if [[ "$cword" == 1 || ( "$prev" != "-create" && "$prev" == -* ) ]]; then # only options (or an uncompletable hex-string) allowed - # parse bitcoin-tx -help for options + # parse zcash-tx -help for options local helpopts - helpopts=$($bitcoin_tx -help | sed -e '/^ -/ p' -e d ) + helpopts=$($zcash_tx -help | sed -e '/^ -/ p' -e d ) COMPREPLY=( $( compgen -W "$helpopts" -- "$cur" ) ) else # only commands are allowed # parse -help for commands local helpcmds - helpcmds=$($bitcoin_tx -help | sed -e '1,/Commands:/d' -e 's/=.*/=/' -e '/^ [a-z]/ p' -e d ) + helpcmds=$($zcash_tx -help | sed -e '1,/Commands:/d' -e 's/=.*/=/' -e '/^ [a-z]/ p' -e d ) COMPREPLY=( $( compgen -W "$helpcmds" -- "$cur" ) ) fi @@ -46,7 +46,7 @@ _bitcoin_tx() { return 0 } && -complete -F _bitcoin_tx zcash-tx +complete -F _zcash_tx zcash-tx # Local variables: # mode: shell-script diff --git a/contrib/bitcoind.bash-completion b/contrib/zcashd.bash-completion similarity index 91% rename from contrib/bitcoind.bash-completion rename to contrib/zcashd.bash-completion index 104365024..3a2f091bd 100644 --- a/contrib/bitcoind.bash-completion +++ b/contrib/zcashd.bash-completion @@ -6,11 +6,11 @@ _zcashd() { local cur prev words=() cword - local bitcoind + local zcashd # save and use original argument to invoke zcashd for -help # it might not be in $PATH - bitcoind="$1" + zcashd="$1" COMPREPLY=() _get_comp_words_by_ref -n = cur prev words cword @@ -34,7 +34,7 @@ _zcashd() { # only parse -help if senseful if [[ -z "$cur" || "$cur" =~ ^- ]]; then local helpopts - helpopts=$($bitcoind -help 2>&1 | awk '$1 ~ /^-/ { sub(/=.*/, "="); print $1 }' ) + helpopts=$($zcashd -help 2>&1 | awk '$1 ~ /^-/ { sub(/=.*/, "="); print $1 }' ) COMPREPLY=( $( compgen -W "$helpopts" -- "$cur" ) ) fi diff --git a/zcutil/build-debian-package.sh b/zcutil/build-debian-package.sh index 694b74929..870530083 100755 --- a/zcutil/build-debian-package.sh +++ b/zcutil/build-debian-package.sh @@ -51,8 +51,8 @@ cp $SRC_DOC/man/zcashd.1 $DEB_MAN cp $SRC_DOC/man/zcash-cli.1 $DEB_MAN cp $SRC_DOC/man/zcash-fetch-params.1 $DEB_MAN # Copy bash completion files -cp $SRC_PATH/contrib/bitcoind.bash-completion $DEB_CMP/zcashd -cp $SRC_PATH/contrib/bitcoin-cli.bash-completion $DEB_CMP/zcash-cli +cp $SRC_PATH/contrib/zcashd.bash-completion $DEB_CMP/zcashd +cp $SRC_PATH/contrib/zcash-cli.bash-completion $DEB_CMP/zcash-cli # Gzip files gzip --best -n $DEB_DOC/changelog gzip --best -n $DEB_DOC/changelog.Debian From 7fa05b29b6cd06a5914a16234f7c8315255b09fc Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Sun, 29 Oct 2017 13:10:09 +1300 Subject: [PATCH 0311/1062] Use g-prefixed coreutils commands if they are available If they are present on the system, it means that the non-prefixed ones are not necessarily the versions we want, while the prefixed ones are highly likely to be the ones from GNU Coreutils. --- zcutil/build.sh | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/zcutil/build.sh b/zcutil/build.sh index 5e6b318f5..570ad3abb 100755 --- a/zcutil/build.sh +++ b/zcutil/build.sh @@ -2,6 +2,21 @@ set -eu -o pipefail +function cmd_pref() { + if type -p "$2" > /dev/null; then + eval "$1=$2" + else + eval "$1=$3" + fi +} + +# If a g-prefixed version of the command exists, use it preferentially. +function gprefix() { + cmd_pref "$1" "g$2" "$2" +} + +gprefix READLINK readlink + # Allow user overrides to $MAKE. Typical usage for users who need it: # MAKE=gmake ./zcutil/build.sh -j$(nproc) if [[ -z "${MAKE-}" ]]; then @@ -58,7 +73,7 @@ EOF fi set -x -cd "$(dirname "$(readlink -f "$0")")/.." +cd "$(dirname "$("$READLINK" -f "$0")")/.." # If --enable-lcov is the first argument, enable lcov coverage support: LCOV_ARG='' From e4cd34126063beb5dfa7b01909f8ea8b204e1d86 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Mon, 30 Oct 2017 01:22:55 +1300 Subject: [PATCH 0312/1062] Replace hard-coded defaults for HOST and BUILD with config.guess --- zcutil/build.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/zcutil/build.sh b/zcutil/build.sh index 570ad3abb..f665088ac 100755 --- a/zcutil/build.sh +++ b/zcutil/build.sh @@ -16,6 +16,7 @@ function gprefix() { } gprefix READLINK readlink +cd "$(dirname "$("$READLINK" -f "$0")")/.." # Allow user overrides to $MAKE. Typical usage for users who need it: # MAKE=gmake ./zcutil/build.sh -j$(nproc) @@ -26,10 +27,10 @@ fi # Allow overrides to $BUILD and $HOST for porters. Most users will not need it. # BUILD=i686-pc-linux-gnu ./zcutil/build.sh if [[ -z "${BUILD-}" ]]; then - BUILD=x86_64-unknown-linux-gnu + BUILD="$(./depends/config.guess)" fi if [[ -z "${HOST-}" ]]; then - HOST=x86_64-unknown-linux-gnu + HOST="$BUILD" fi # Allow override to $CC and $CXX for porters. Most users will not need it. @@ -73,7 +74,6 @@ EOF fi set -x -cd "$(dirname "$("$READLINK" -f "$0")")/.." # If --enable-lcov is the first argument, enable lcov coverage support: LCOV_ARG='' From 124e9389af07a19f3dc63147706be318c3ba8d84 Mon Sep 17 00:00:00 2001 From: MarcoFalke Date: Mon, 30 Nov 2015 13:23:00 +0100 Subject: [PATCH 0313/1062] Fix url in .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b2cc7b02b..aba6702a5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,7 @@ # - A travis bug causes caches to trample eachother when using the same # compiler key (which we don't use anyway). This is worked around for now by # replacing the "compilers" with a build name prefixed by the no-op ":" -# command. See: https://github.com/travis-ci/casher/issues/6 +# command. See: https://github.com/travis-ci/travis-ci/issues/4393 os: linux language: cpp From 4165af1b739a15bad046ab037acbb1eb6bcf14cb Mon Sep 17 00:00:00 2001 From: Cory Fields Date: Tue, 5 Jan 2016 16:10:13 -0500 Subject: [PATCH 0314/1062] c++11: don't throw from the reverselock destructor noexcept is default for destructors as of c++11. By throwing in reverselock's destructor if it's lock has been tampered with, the likely result is std::terminate being called. Indeed that happened before this change. Once reverselock has taken another lock (its ctor didn't throw), it makes no sense to try to grab or lock the parent lock. That is be broken/undefined behavior depending on the parent lock's implementation, but it shouldn't cause the reverselock to fail to re-lock when destroyed. To avoid those problems, simply swap the parent lock's contents with a dummy for the duration of the lock. That will ensure that any undefined behavior is caught at the call-site rather than the reverse lock's destruction. Barring a failed mutex unlock which would be indicative of a larger problem, the destructor should now never throw. --- src/reverselock.h | 7 +++++-- src/test/reverselock_tests.cpp | 16 ++++++---------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/reverselock.h b/src/reverselock.h index db5c626c9..fac1ccb79 100644 --- a/src/reverselock.h +++ b/src/reverselock.h @@ -15,10 +15,12 @@ public: explicit reverse_lock(Lock& lock) : lock(lock) { lock.unlock(); + lock.swap(templock); } - ~reverse_lock() noexcept(false) { - lock.lock(); + ~reverse_lock() { + templock.lock(); + templock.swap(lock); } private: @@ -26,6 +28,7 @@ private: reverse_lock& operator=(reverse_lock const&); Lock& lock; + Lock templock; }; #endif // BITCOIN_REVERSELOCK_H diff --git a/src/test/reverselock_tests.cpp b/src/test/reverselock_tests.cpp index e7e627ae0..8bdff9700 100644 --- a/src/test/reverselock_tests.cpp +++ b/src/test/reverselock_tests.cpp @@ -42,22 +42,18 @@ BOOST_AUTO_TEST_CASE(reverselock_errors) BOOST_CHECK(failed); BOOST_CHECK(!lock.owns_lock()); - // Make sure trying to lock a lock after it has been reverse locked fails - failed = false; - bool locked = false; + // Locking the original lock after it has been taken by a reverse lock + // makes no sense. Ensure that the original lock no longer owns the lock + // after giving it to a reverse one. lock.lock(); BOOST_CHECK(lock.owns_lock()); - - try { + { reverse_lock > rlock(lock); - lock.lock(); - locked = true; - } catch(...) { - failed = true; + BOOST_CHECK(!lock.owns_lock()); } - BOOST_CHECK(locked && failed); + BOOST_CHECK(failed); BOOST_CHECK(lock.owns_lock()); } From 4bfe8a744bd8b23b770b1562e8188c9b18859f3b Mon Sep 17 00:00:00 2001 From: Cory Fields Date: Tue, 5 Jan 2016 16:25:42 -0500 Subject: [PATCH 0315/1062] c++11: CAccountingEntry must be defined before use in a list c++11ism. This fixes builds against libc++. --- src/wallet/wallet.h | 164 +++++++++++++++++++++----------------------- 1 file changed, 80 insertions(+), 84 deletions(-) diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index e73d05cc9..2b481d87a 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -60,7 +60,6 @@ static const unsigned int MAX_FREE_TRANSACTION_CREATE_SIZE = 1000; // unless there is some exceptional network disruption. static const unsigned int WITNESS_CACHE_SIZE = COINBASE_MATURITY; -class CAccountingEntry; class CBlockIndex; class CCoinControl; class COutput; @@ -570,6 +569,86 @@ public: } }; +/** + * Internal transfers. + * Database key is acentry. + */ +class CAccountingEntry +{ +public: + std::string strAccount; + CAmount nCreditDebit; + int64_t nTime; + std::string strOtherAccount; + std::string strComment; + mapValue_t mapValue; + int64_t nOrderPos; //! position in ordered transaction list + uint64_t nEntryNo; + + CAccountingEntry() + { + SetNull(); + } + + void SetNull() + { + nCreditDebit = 0; + nTime = 0; + strAccount.clear(); + strOtherAccount.clear(); + strComment.clear(); + nOrderPos = -1; + nEntryNo = 0; + } + + ADD_SERIALIZE_METHODS; + + template + inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { + if (!(nType & SER_GETHASH)) + READWRITE(nVersion); + //! Note: strAccount is serialized as part of the key, not here. + READWRITE(nCreditDebit); + READWRITE(nTime); + READWRITE(LIMITED_STRING(strOtherAccount, 65536)); + + if (!ser_action.ForRead()) + { + WriteOrderPos(nOrderPos, mapValue); + + if (!(mapValue.empty() && _ssExtra.empty())) + { + CDataStream ss(nType, nVersion); + ss.insert(ss.begin(), '\0'); + ss << mapValue; + ss.insert(ss.end(), _ssExtra.begin(), _ssExtra.end()); + strComment.append(ss.str()); + } + } + + READWRITE(LIMITED_STRING(strComment, 65536)); + + size_t nSepPos = strComment.find("\0", 0, 1); + if (ser_action.ForRead()) + { + mapValue.clear(); + if (std::string::npos != nSepPos) + { + CDataStream ss(std::vector(strComment.begin() + nSepPos + 1, strComment.end()), nType, nVersion); + ss >> mapValue; + _ssExtra = std::vector(ss.begin(), ss.end()); + } + ReadOrderPos(nOrderPos, mapValue); + } + if (std::string::npos != nSepPos) + strComment.erase(nSepPos); + + mapValue.erase("n"); + } + +private: + std::vector _ssExtra; +}; /** @@ -1094,87 +1173,4 @@ public: } }; - - -/** - * Internal transfers. - * Database key is acentry. - */ -class CAccountingEntry -{ -public: - std::string strAccount; - CAmount nCreditDebit; - int64_t nTime; - std::string strOtherAccount; - std::string strComment; - mapValue_t mapValue; - int64_t nOrderPos; //! position in ordered transaction list - uint64_t nEntryNo; - - CAccountingEntry() - { - SetNull(); - } - - void SetNull() - { - nCreditDebit = 0; - nTime = 0; - strAccount.clear(); - strOtherAccount.clear(); - strComment.clear(); - nOrderPos = -1; - nEntryNo = 0; - } - - ADD_SERIALIZE_METHODS; - - template - inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { - if (!(nType & SER_GETHASH)) - READWRITE(nVersion); - //! Note: strAccount is serialized as part of the key, not here. - READWRITE(nCreditDebit); - READWRITE(nTime); - READWRITE(LIMITED_STRING(strOtherAccount, 65536)); - - if (!ser_action.ForRead()) - { - WriteOrderPos(nOrderPos, mapValue); - - if (!(mapValue.empty() && _ssExtra.empty())) - { - CDataStream ss(nType, nVersion); - ss.insert(ss.begin(), '\0'); - ss << mapValue; - ss.insert(ss.end(), _ssExtra.begin(), _ssExtra.end()); - strComment.append(ss.str()); - } - } - - READWRITE(LIMITED_STRING(strComment, 65536)); - - size_t nSepPos = strComment.find("\0", 0, 1); - if (ser_action.ForRead()) - { - mapValue.clear(); - if (std::string::npos != nSepPos) - { - CDataStream ss(std::vector(strComment.begin() + nSepPos + 1, strComment.end()), nType, nVersion); - ss >> mapValue; - _ssExtra = std::vector(ss.begin(), ss.end()); - } - ReadOrderPos(nOrderPos, mapValue); - } - if (std::string::npos != nSepPos) - strComment.erase(nSepPos); - - mapValue.erase("n"); - } - -private: - std::vector _ssExtra; -}; - #endif // BITCOIN_WALLET_WALLET_H From 1f623c64b6dd636895ebebb726c8aaab3ebeafc3 Mon Sep 17 00:00:00 2001 From: Cory Fields Date: Tue, 5 Jan 2016 16:27:42 -0500 Subject: [PATCH 0316/1062] c++11: fix libbdb build against libc++ in c++11 mode atomic_init clashes with --- depends/packages/bdb.mk | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/depends/packages/bdb.mk b/depends/packages/bdb.mk index df5df6bde..d0e9949f1 100644 --- a/depends/packages/bdb.mk +++ b/depends/packages/bdb.mk @@ -11,6 +11,11 @@ $(package)_config_opts_mingw32=--enable-mingw $(package)_config_opts_linux=--with-pic endef +define $(package)_preprocess_cmds + sed -i.old 's/__atomic_compare_exchange\\(/__atomic_compare_exchange_db(/' src/dbinc/atomic.h && \ + sed -i.old 's/atomic_init/atomic_init_db/' src/dbinc/atomic.h src/mp/mp_region.c src/mp/mp_mvcc.c src/mp/mp_fget.c src/mutex/mut_method.c src/mutex/mut_tas.c +endef + define $(package)_config_cmds ../dist/$($(package)_autoconf) endef From bd03cfebec5d0e00747cf53dd678211e867a0a44 Mon Sep 17 00:00:00 2001 From: Luke Dashjr Date: Tue, 9 Feb 2016 03:29:23 +0000 Subject: [PATCH 0317/1062] depends: Use curl for fetching on Linux Currently Travis's wget fails fetching qrencode: Fetching qrencode... ERROR: no certificate subject alternative name matches requested host name `fukuchi.org'. To connect to fukuchi.org insecurely, use `--no-check-certificate'. OpenSSL: error:14077438:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert internal error Unable to establish SSL connection. make: *** [/home/travis/build/luke-jr/bitcoin/depends/sources/download-stamps/.stamp_fetched-qrencode-qrencode-3.4.4.tar.bz2.hash] Error 4 --- depends/builders/linux.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/depends/builders/linux.mk b/depends/builders/linux.mk index 98d0e9de3..75055e77e 100644 --- a/depends/builders/linux.mk +++ b/depends/builders/linux.mk @@ -1,2 +1,2 @@ build_linux_SHA256SUM = sha256sum -build_linux_DOWNLOAD = wget --timeout=$(DOWNLOAD_CONNECT_TIMEOUT) --tries=$(DOWNLOAD_RETRIES) -nv -O +build_linux_DOWNLOAD = curl --connect-timeout $(DOWNLOAD_CONNECT_TIMEOUT) --retry $(DOWNLOAD_RETRIES) -L -o From bdd12c9b3c48f05cf1c85dcc0f127a7b795d3fcf Mon Sep 17 00:00:00 2001 From: Luke Dashjr Date: Tue, 9 Feb 2016 05:53:39 +0000 Subject: [PATCH 0318/1062] Travis: Use curl rather than wget for Mac SDK --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index aba6702a5..acf7f44ae 100644 --- a/.travis.yml +++ b/.travis.yml @@ -51,7 +51,7 @@ install: before_script: - unset CC; unset CXX - mkdir -p depends/SDKs depends/sdk-sources - - if [ -n "$OSX_SDK" -a ! -f depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz ]; then wget $SDK_URL/MacOSX${OSX_SDK}.sdk.tar.gz -O depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz; fi + - if [ -n "$OSX_SDK" -a ! -f depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz ]; then curl $SDK_URL/MacOSX${OSX_SDK}.sdk.tar.gz -o depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz; fi - if [ -n "$OSX_SDK" -a -f depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz ]; then tar -C depends/SDKs -xf depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz; fi - make $MAKEJOBS -C depends HOST=$HOST $DEP_OPTS script: From a8982ac97d9af178c9cd7b577e19ce99949d009b Mon Sep 17 00:00:00 2001 From: Luke Dashjr Date: Tue, 9 Feb 2016 22:15:25 +0000 Subject: [PATCH 0319/1062] Bugfix: depends/Travis: Use --location (follow redirects) and --fail [on HTTP error response] with curl --- .travis.yml | 2 +- depends/builders/darwin.mk | 2 +- depends/builders/linux.mk | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index acf7f44ae..07bfba32e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -51,7 +51,7 @@ install: before_script: - unset CC; unset CXX - mkdir -p depends/SDKs depends/sdk-sources - - if [ -n "$OSX_SDK" -a ! -f depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz ]; then curl $SDK_URL/MacOSX${OSX_SDK}.sdk.tar.gz -o depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz; fi + - if [ -n "$OSX_SDK" -a ! -f depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz ]; then curl --location --fail $SDK_URL/MacOSX${OSX_SDK}.sdk.tar.gz -o depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz; fi - if [ -n "$OSX_SDK" -a -f depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz ]; then tar -C depends/SDKs -xf depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz; fi - make $MAKEJOBS -C depends HOST=$HOST $DEP_OPTS script: diff --git a/depends/builders/darwin.mk b/depends/builders/darwin.mk index b366460e6..cedbddc57 100644 --- a/depends/builders/darwin.mk +++ b/depends/builders/darwin.mk @@ -7,7 +7,7 @@ build_darwin_OTOOL: = $(shell xcrun -f otool) build_darwin_NM: = $(shell xcrun -f nm) build_darwin_INSTALL_NAME_TOOL:=$(shell xcrun -f install_name_tool) build_darwin_SHA256SUM = shasum -a 256 -build_darwin_DOWNLOAD = curl --connect-timeout $(DOWNLOAD_CONNECT_TIMEOUT) --retry $(DOWNLOAD_RETRIES) -L -o +build_darwin_DOWNLOAD = curl --location --fail --connect-timeout $(DOWNLOAD_CONNECT_TIMEOUT) --retry $(DOWNLOAD_RETRIES) -L -o #darwin host on darwin builder. overrides darwin host preferences. darwin_CC=$(shell xcrun -f clang) -mmacosx-version-min=$(OSX_MIN_VERSION) diff --git a/depends/builders/linux.mk b/depends/builders/linux.mk index 75055e77e..d6a304e4b 100644 --- a/depends/builders/linux.mk +++ b/depends/builders/linux.mk @@ -1,2 +1,2 @@ build_linux_SHA256SUM = sha256sum -build_linux_DOWNLOAD = curl --connect-timeout $(DOWNLOAD_CONNECT_TIMEOUT) --retry $(DOWNLOAD_RETRIES) -L -o +build_linux_DOWNLOAD = curl --location --fail --connect-timeout $(DOWNLOAD_CONNECT_TIMEOUT) --retry $(DOWNLOAD_RETRIES) -L -o From 7ab7005fbc042b8160a6007a5eec20c1479b1b93 Mon Sep 17 00:00:00 2001 From: Luke Dashjr Date: Tue, 9 Feb 2016 22:17:09 +0000 Subject: [PATCH 0320/1062] Travis: Use Blue Box VMs for IPv6 loopback support --- .travis.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.travis.yml b/.travis.yml index 07bfba32e..ecb31ef0f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,12 @@ # compiler key (which we don't use anyway). This is worked around for now by # replacing the "compilers" with a build name prefixed by the no-op ":" # command. See: https://github.com/travis-ci/travis-ci/issues/4393 +# - sudo/dist/group are set so as to get Blue Box VMs, necessary for [loopback] +# IPv6 support + +sudo: required +dist: precise +group: legacy os: linux language: cpp From b0a7ddb0b1a1bbb1064faada00fc7c4d39b0847b Mon Sep 17 00:00:00 2001 From: MarcoFalke Date: Fri, 26 Feb 2016 09:59:39 +0100 Subject: [PATCH 0321/1062] [depends] builders: No need to set -L and --location for curl --- depends/builders/darwin.mk | 2 +- depends/builders/linux.mk | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/depends/builders/darwin.mk b/depends/builders/darwin.mk index cedbddc57..200d6ed22 100644 --- a/depends/builders/darwin.mk +++ b/depends/builders/darwin.mk @@ -7,7 +7,7 @@ build_darwin_OTOOL: = $(shell xcrun -f otool) build_darwin_NM: = $(shell xcrun -f nm) build_darwin_INSTALL_NAME_TOOL:=$(shell xcrun -f install_name_tool) build_darwin_SHA256SUM = shasum -a 256 -build_darwin_DOWNLOAD = curl --location --fail --connect-timeout $(DOWNLOAD_CONNECT_TIMEOUT) --retry $(DOWNLOAD_RETRIES) -L -o +build_darwin_DOWNLOAD = curl --location --fail --connect-timeout $(DOWNLOAD_CONNECT_TIMEOUT) --retry $(DOWNLOAD_RETRIES) -o #darwin host on darwin builder. overrides darwin host preferences. darwin_CC=$(shell xcrun -f clang) -mmacosx-version-min=$(OSX_MIN_VERSION) diff --git a/depends/builders/linux.mk b/depends/builders/linux.mk index d6a304e4b..b03f42401 100644 --- a/depends/builders/linux.mk +++ b/depends/builders/linux.mk @@ -1,2 +1,2 @@ build_linux_SHA256SUM = sha256sum -build_linux_DOWNLOAD = curl --location --fail --connect-timeout $(DOWNLOAD_CONNECT_TIMEOUT) --retry $(DOWNLOAD_RETRIES) -L -o +build_linux_DOWNLOAD = curl --location --fail --connect-timeout $(DOWNLOAD_CONNECT_TIMEOUT) --retry $(DOWNLOAD_RETRIES) -o From b08a1f7836563c005927b06d521eec85f3cc9605 Mon Sep 17 00:00:00 2001 From: fanquake Date: Sat, 19 Mar 2016 15:24:00 +0800 Subject: [PATCH 0322/1062] [build-aux] Update Boost & check macros to latest serials --- build-aux/m4/ax_boost_base.m4 | 20 +- build-aux/m4/ax_boost_program_options.m4 | 7 +- build-aux/m4/ax_boost_system.m4 | 5 +- build-aux/m4/ax_check_compile_flag.m4 | 12 +- build-aux/m4/ax_check_link_flag.m4 | 13 +- build-aux/m4/ax_check_preproc_flag.m4 | 12 +- build-aux/m4/ax_gcc_func_attribute.m4 | 8 +- build-aux/m4/ax_pthread.m4 | 505 +++++++++++++++-------- 8 files changed, 379 insertions(+), 203 deletions(-) diff --git a/build-aux/m4/ax_boost_base.m4 b/build-aux/m4/ax_boost_base.m4 index 3f24d5ddc..45d948933 100644 --- a/build-aux/m4/ax_boost_base.m4 +++ b/build-aux/m4/ax_boost_base.m4 @@ -33,7 +33,7 @@ # and this notice are preserved. This file is offered as-is, without any # warranty. -#serial 23 +#serial 26 AC_DEFUN([AX_BOOST_BASE], [ @@ -95,8 +95,8 @@ if test "x$want_boost" = "xyes"; then x86_64) libsubdirs="lib64 libx32 lib lib64" ;; - ppc64|s390x|sparc64|aarch64) - libsubdirs="lib64 lib lib64" + ppc64|s390x|sparc64|aarch64|ppc64le) + libsubdirs="lib64 lib lib64 ppc64le" ;; esac @@ -170,7 +170,7 @@ if test "x$want_boost" = "xyes"; then AC_MSG_RESULT(yes) succeeded=yes found_system=yes - ],[: + ],[ ]) AC_LANG_POP([C++]) @@ -179,6 +179,10 @@ if test "x$want_boost" = "xyes"; then dnl if we found no boost with system layout we search for boost libraries dnl built and installed without the --layout=system option or for a staged(not installed) version if test "x$succeeded" != "xyes"; then + CPPFLAGS="$CPPFLAGS_SAVED" + LDFLAGS="$LDFLAGS_SAVED" + BOOST_CPPFLAGS= + BOOST_LDFLAGS= _version=0 if test "$ac_boost_path" != ""; then if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then @@ -191,6 +195,12 @@ if test "x$want_boost" = "xyes"; then VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` BOOST_CPPFLAGS="-I$ac_boost_path/include/boost-$VERSION_UNDERSCORE" done + dnl if nothing found search for layout used in Windows distributions + if test -z "$BOOST_CPPFLAGS"; then + if test -d "$ac_boost_path/boost" && test -r "$ac_boost_path/boost"; then + BOOST_CPPFLAGS="-I$ac_boost_path" + fi + fi fi else if test "$cross_compiling" != yes; then @@ -253,7 +263,7 @@ if test "x$want_boost" = "xyes"; then AC_MSG_RESULT(yes) succeeded=yes found_system=yes - ],[: + ],[ ]) AC_LANG_POP([C++]) fi diff --git a/build-aux/m4/ax_boost_program_options.m4 b/build-aux/m4/ax_boost_program_options.m4 index f59144185..2bdb59371 100644 --- a/build-aux/m4/ax_boost_program_options.m4 +++ b/build-aux/m4/ax_boost_program_options.m4 @@ -29,7 +29,7 @@ # and this notice are preserved. This file is offered as-is, without any # warranty. -#serial 22 +#serial 24 AC_DEFUN([AX_BOOST_PROGRAM_OPTIONS], [ @@ -63,9 +63,9 @@ AC_DEFUN([AX_BOOST_PROGRAM_OPTIONS], AC_CACHE_CHECK([whether the Boost::Program_Options library is available], ax_cv_boost_program_options, [AC_LANG_PUSH(C++) - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include ]], - [[boost::program_options::options_description generic("Generic options"); + [[boost::program_options::error err("Error message"); return 0;]])], ax_cv_boost_program_options=yes, ax_cv_boost_program_options=no) AC_LANG_POP([C++]) @@ -74,7 +74,6 @@ AC_DEFUN([AX_BOOST_PROGRAM_OPTIONS], AC_DEFINE(HAVE_BOOST_PROGRAM_OPTIONS,,[define if the Boost::PROGRAM_OPTIONS library is available]) BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'` if test "x$ax_boost_user_program_options_lib" = "x"; then - ax_lib= for libextension in `ls $BOOSTLIBDIR/libboost_program_options*.so* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^lib\(boost_program_options.*\)\.so.*$;\1;'` `ls $BOOSTLIBDIR/libboost_program_options*.dylib* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^lib\(boost_program_options.*\)\.dylib.*$;\1;'` `ls $BOOSTLIBDIR/libboost_program_options*.a* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^lib\(boost_program_options.*\)\.a.*$;\1;'` ; do ax_lib=${libextension} AC_CHECK_LIB($ax_lib, exit, diff --git a/build-aux/m4/ax_boost_system.m4 b/build-aux/m4/ax_boost_system.m4 index 9c78280fc..1c05450cb 100644 --- a/build-aux/m4/ax_boost_system.m4 +++ b/build-aux/m4/ax_boost_system.m4 @@ -31,7 +31,7 @@ # and this notice are preserved. This file is offered as-is, without any # warranty. -#serial 17 +#serial 18 AC_DEFUN([AX_BOOST_SYSTEM], [ @@ -68,9 +68,10 @@ AC_DEFUN([AX_BOOST_SYSTEM], ax_cv_boost_system, [AC_LANG_PUSH([C++]) CXXFLAGS_SAVE=$CXXFLAGS + CXXFLAGS= AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include ]], - [[boost::system::system_category]])], + [[boost::system::error_category *a = 0;]])], ax_cv_boost_system=yes, ax_cv_boost_system=no) CXXFLAGS=$CXXFLAGS_SAVE AC_LANG_POP([C++]) diff --git a/build-aux/m4/ax_check_compile_flag.m4 b/build-aux/m4/ax_check_compile_flag.m4 index c3a8d695a..ca3639715 100644 --- a/build-aux/m4/ax_check_compile_flag.m4 +++ b/build-aux/m4/ax_check_compile_flag.m4 @@ -4,7 +4,7 @@ # # SYNOPSIS # -# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS]) +# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) # # DESCRIPTION # @@ -19,6 +19,8 @@ # the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to # force the compiler to issue an error when a bad flag is given. # +# INPUT gives an alternative input source to AC_COMPILE_IFELSE. +# # NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this # macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG. # @@ -53,19 +55,19 @@ # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. -#serial 2 +#serial 4 AC_DEFUN([AX_CHECK_COMPILE_FLAG], -[AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX +[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [ ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1" - AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], + AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], [AS_VAR_SET(CACHEVAR,[yes])], [AS_VAR_SET(CACHEVAR,[no])]) _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags]) -AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes], +AS_VAR_IF(CACHEVAR,yes, [m4_default([$2], :)], [m4_default([$3], :)]) AS_VAR_POPDEF([CACHEVAR])dnl diff --git a/build-aux/m4/ax_check_link_flag.m4 b/build-aux/m4/ax_check_link_flag.m4 index e2d0d363e..eb01a6ce1 100644 --- a/build-aux/m4/ax_check_link_flag.m4 +++ b/build-aux/m4/ax_check_link_flag.m4 @@ -4,7 +4,7 @@ # # SYNOPSIS # -# AX_CHECK_LINK_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS]) +# AX_CHECK_LINK_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) # # DESCRIPTION # @@ -19,6 +19,8 @@ # EXTRA-FLAGS FLAG". This can for example be used to force the linker to # issue an error when a bad flag is given. # +# INPUT gives an alternative input source to AC_LINK_IFELSE. +# # NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this # macro in sync with AX_CHECK_{PREPROC,COMPILE}_FLAG. # @@ -53,18 +55,19 @@ # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. -#serial 2 +#serial 4 AC_DEFUN([AX_CHECK_LINK_FLAG], -[AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_ldflags_$4_$1])dnl +[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF +AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_ldflags_$4_$1])dnl AC_CACHE_CHECK([whether the linker accepts $1], CACHEVAR, [ ax_check_save_flags=$LDFLAGS LDFLAGS="$LDFLAGS $4 $1" - AC_LINK_IFELSE([AC_LANG_PROGRAM()], + AC_LINK_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], [AS_VAR_SET(CACHEVAR,[yes])], [AS_VAR_SET(CACHEVAR,[no])]) LDFLAGS=$ax_check_save_flags]) -AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes], +AS_VAR_IF(CACHEVAR,yes, [m4_default([$2], :)], [m4_default([$3], :)]) AS_VAR_POPDEF([CACHEVAR])dnl diff --git a/build-aux/m4/ax_check_preproc_flag.m4 b/build-aux/m4/ax_check_preproc_flag.m4 index b1cfef6b8..ca1d5ee2b 100644 --- a/build-aux/m4/ax_check_preproc_flag.m4 +++ b/build-aux/m4/ax_check_preproc_flag.m4 @@ -4,7 +4,7 @@ # # SYNOPSIS # -# AX_CHECK_PREPROC_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS]) +# AX_CHECK_PREPROC_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) # # DESCRIPTION # @@ -19,6 +19,8 @@ # "CPPFLAGS EXTRA-FLAGS FLAG". This can for example be used to force the # preprocessor to issue an error when a bad flag is given. # +# INPUT gives an alternative input source to AC_PREPROC_IFELSE. +# # NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this # macro in sync with AX_CHECK_{COMPILE,LINK}_FLAG. # @@ -53,19 +55,19 @@ # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. -#serial 2 +#serial 4 AC_DEFUN([AX_CHECK_PREPROC_FLAG], -[AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX +[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]cppflags_$4_$1])dnl AC_CACHE_CHECK([whether _AC_LANG preprocessor accepts $1], CACHEVAR, [ ax_check_save_flags=$CPPFLAGS CPPFLAGS="$CPPFLAGS $4 $1" - AC_PREPROC_IFELSE([AC_LANG_PROGRAM()], + AC_PREPROC_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], [AS_VAR_SET(CACHEVAR,[yes])], [AS_VAR_SET(CACHEVAR,[no])]) CPPFLAGS=$ax_check_save_flags]) -AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes], +AS_VAR_IF(CACHEVAR,yes, [m4_default([$2], :)], [m4_default([$3], :)]) AS_VAR_POPDEF([CACHEVAR])dnl diff --git a/build-aux/m4/ax_gcc_func_attribute.m4 b/build-aux/m4/ax_gcc_func_attribute.m4 index 275ca63a2..c788ca9bd 100644 --- a/build-aux/m4/ax_gcc_func_attribute.m4 +++ b/build-aux/m4/ax_gcc_func_attribute.m4 @@ -31,6 +31,7 @@ # cold # const # constructor +# constructor_priority for constructor attribute with priority # deprecated # destructor # dllexport @@ -73,7 +74,7 @@ # and this notice are preserved. This file is offered as-is, without any # warranty. -#serial 2 +#serial 3 AC_DEFUN([AX_GCC_FUNC_ATTRIBUTE], [ AS_VAR_PUSHDEF([ac_var], [ax_cv_have_func_attribute_$1]) @@ -103,6 +104,9 @@ AC_DEFUN([AX_GCC_FUNC_ATTRIBUTE], [ [const], [ int foo( void ) __attribute__(($1)); ], + [constructor_priority], [ + int foo( void ) __attribute__((__constructor__(65535/2))); + ], [constructor], [ int foo( void ) __attribute__(($1)); ], @@ -180,6 +184,8 @@ AC_DEFUN([AX_GCC_FUNC_ATTRIBUTE], [ [visibility], [ int foo_def( void ) __attribute__(($1("default"))); int foo_hid( void ) __attribute__(($1("hidden"))); + int foo_int( void ) __attribute__(($1("internal"))); + int foo_pro( void ) __attribute__(($1("protected"))); ], [warning], [ int foo( void ) __attribute__(($1(""))); diff --git a/build-aux/m4/ax_pthread.m4 b/build-aux/m4/ax_pthread.m4 index d383ad5c6..d218d1af7 100644 --- a/build-aux/m4/ax_pthread.m4 +++ b/build-aux/m4/ax_pthread.m4 @@ -19,10 +19,10 @@ # is necessary on AIX to use the special cc_r compiler alias.) # # NOTE: You are assumed to not only compile your program with these flags, -# but also link it with them as well. e.g. you should link with +# but also to link with them as well. For example, you might link with # $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS # -# If you are only building threads programs, you may wish to use these +# If you are only building threaded programs, you may wish to use these # variables in your default LIBS, CFLAGS, and CC: # # LIBS="$PTHREAD_LIBS $LIBS" @@ -30,8 +30,8 @@ # CC="$PTHREAD_CC" # # In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant -# has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name -# (e.g. PTHREAD_CREATE_UNDETACHED on AIX). +# has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to +# that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). # # Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the # PTHREAD_PRIO_INHERIT symbol is defined when compiling with @@ -82,35 +82,40 @@ # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. -#serial 21 +#serial 22 AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD]) AC_DEFUN([AX_PTHREAD], [ AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([AC_PROG_CC]) +AC_REQUIRE([AC_PROG_SED]) AC_LANG_PUSH([C]) ax_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h -# requires special compiler flags (e.g. on True64 or Sequent). +# requires special compiler flags (e.g. on Tru64 or Sequent). # It gets checked for in the link test anyway. # First of all, check if the user has set any of the PTHREAD_LIBS, # etcetera environment variables, and if threads linking works using # them: -if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - save_LIBS="$LIBS" - LIBS="$PTHREAD_LIBS $LIBS" - AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) - AC_TRY_LINK_FUNC([pthread_join], [ax_pthread_ok=yes]) - AC_MSG_RESULT([$ax_pthread_ok]) - if test x"$ax_pthread_ok" = xno; then - PTHREAD_LIBS="" - PTHREAD_CFLAGS="" - fi - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" +if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then + ax_pthread_save_CC="$CC" + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + AS_IF([test "x$PTHREAD_CC" != "x"], [CC="$PTHREAD_CC"]) + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + AC_MSG_CHECKING([for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS]) + AC_LINK_IFELSE([AC_LANG_CALL([], [pthread_join])], [ax_pthread_ok=yes]) + AC_MSG_RESULT([$ax_pthread_ok]) + if test "x$ax_pthread_ok" = "xno"; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + CC="$ax_pthread_save_CC" + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" fi # We must check for the threads library under a number of different @@ -123,7 +128,7 @@ fi # which indicates that we try without any flags at all, and "pthread-config" # which is a program returning the flags for the Pth emulation library. -ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" +ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: @@ -132,186 +137,334 @@ ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mt # none: in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) -# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) -# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) -# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) -# -pthreads: Solaris/gcc -# -mthreads: Mingw32/gcc, Lynx/gcc +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64 +# (Note: HP C rejects this with "bad form for `-t' option") +# -pthreads: Solaris/gcc (Note: HP C also rejects) # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it -# doesn't hurt to check since this sometimes defines pthreads too; -# also defines -D_REENTRANT) -# ... -mt is also the pthreads flag for HP/aCC +# doesn't hurt to check since this sometimes defines pthreads and +# -D_REENTRANT too), HP C (must be checked before -lpthread, which +# is present but should not be used directly; and before -mthreads, +# because the compiler interprets this as "-mt" + "-hreads") +# -mthreads: Mingw32/gcc, Lynx/gcc # pthread: Linux, etcetera # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) -case ${host_os} in - solaris*) +case $host_os in - # On Solaris (at least, for some versions), libc contains stubbed - # (non-functional) versions of the pthreads routines, so link-based - # tests will erroneously succeed. (We need to link with -pthreads/-mt/ - # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather - # a function called by this macro, so we could check for that, but - # who knows whether they'll stub that too in a future libc.) So, - # we'll just look for -pthreads and -lpthread first: + freebsd*) - ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags" - ;; + # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) + # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) - darwin*) - ax_pthread_flags="-pthread $ax_pthread_flags" - ;; + ax_pthread_flags="-kthread lthread $ax_pthread_flags" + ;; + + hpux*) + + # From the cc(1) man page: "[-mt] Sets various -D flags to enable + # multi-threading and also sets -lpthread." + + ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags" + ;; + + openedition*) + + # IBM z/OS requires a feature-test macro to be defined in order to + # enable POSIX threads at all, so give the user a hint if this is + # not set. (We don't define these ourselves, as they can affect + # other portions of the system API in unpredictable ways.) + + AC_EGREP_CPP([AX_PTHREAD_ZOS_MISSING], + [ +# if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS) + AX_PTHREAD_ZOS_MISSING +# endif + ], + [AC_MSG_WARN([IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support.])]) + ;; + + solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (N.B.: The stubs are missing + # pthread_cleanup_push, or rather a function called by this macro, + # so we could check for that, but who knows whether they'll stub + # that too in a future libc.) So we'll check first for the + # standard Solaris way of linking pthreads (-mt -lpthread). + + ax_pthread_flags="-mt,pthread pthread $ax_pthread_flags" + ;; esac -# Clang doesn't consider unrecognized options an error unless we specify -# -Werror. We throw in some extra Clang-specific options to ensure that -# this doesn't happen for GCC, which also accepts -Werror. +# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) -AC_MSG_CHECKING([if compiler needs -Werror to reject unknown flags]) -save_CFLAGS="$CFLAGS" -ax_pthread_extra_flags="-Werror" -CFLAGS="$CFLAGS $ax_pthread_extra_flags -Wunknown-warning-option -Wsizeof-array-argument" -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([int foo(void);],[foo()])], - [AC_MSG_RESULT([yes])], - [ax_pthread_extra_flags= - AC_MSG_RESULT([no])]) -CFLAGS="$save_CFLAGS" +AS_IF([test "x$GCC" = "xyes"], + [ax_pthread_flags="-pthread -pthreads $ax_pthread_flags"]) -if test x"$ax_pthread_ok" = xno; then -for flag in $ax_pthread_flags; do +# The presence of a feature test macro requesting re-entrant function +# definitions is, on some systems, a strong hint that pthreads support is +# correctly enabled - case $flag in - none) - AC_MSG_CHECKING([whether pthreads work without any flags]) - ;; +case $host_os in + darwin* | hpux* | linux* | osf* | solaris*) + ax_pthread_check_macro="_REENTRANT" + ;; - -*) - AC_MSG_CHECKING([whether pthreads work with $flag]) - PTHREAD_CFLAGS="$flag" - ;; + aix* | freebsd*) + ax_pthread_check_macro="_THREAD_SAFE" + ;; - pthread-config) - AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no]) - if test x"$ax_pthread_config" = xno; then continue; fi - PTHREAD_CFLAGS="`pthread-config --cflags`" - PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" - ;; + *) + ax_pthread_check_macro="--" + ;; +esac +AS_IF([test "x$ax_pthread_check_macro" = "x--"], + [ax_pthread_check_cond=0], + [ax_pthread_check_cond="!defined($ax_pthread_check_macro)"]) - *) - AC_MSG_CHECKING([for the pthreads library -l$flag]) - PTHREAD_LIBS="-l$flag" - ;; - esac +# Are we compiling with Clang? - save_LIBS="$LIBS" - save_CFLAGS="$CFLAGS" - LIBS="$PTHREAD_LIBS $LIBS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS $ax_pthread_extra_flags" +AC_CACHE_CHECK([whether $CC is Clang], + [ax_cv_PTHREAD_CLANG], + [ax_cv_PTHREAD_CLANG=no + # Note that Autoconf sets GCC=yes for Clang as well as GCC + if test "x$GCC" = "xyes"; then + AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG], + [/* Note: Clang 2.7 lacks __clang_[a-z]+__ */ +# if defined(__clang__) && defined(__llvm__) + AX_PTHREAD_CC_IS_CLANG +# endif + ], + [ax_cv_PTHREAD_CLANG=yes]) + fi + ]) +ax_pthread_clang="$ax_cv_PTHREAD_CLANG" - # Check for various functions. We must include pthread.h, - # since some functions may be macros. (On the Sequent, we - # need a special flag -Kthread to make this header compile.) - # We check for pthread_join because it is in -lpthread on IRIX - # while pthread_create is in libc. We check for pthread_attr_init - # due to DEC craziness with -lpthreads. We check for - # pthread_cleanup_push because it is one of the few pthread - # functions on Solaris that doesn't have a non-functional libc stub. - # We try pthread_create on general principles. - AC_LINK_IFELSE([AC_LANG_PROGRAM([#include - static void routine(void *a) { a = 0; } - static void *start_routine(void *a) { return a; }], - [pthread_t th; pthread_attr_t attr; - pthread_create(&th, 0, start_routine, 0); - pthread_join(th, 0); - pthread_attr_init(&attr); - pthread_cleanup_push(routine, 0); - pthread_cleanup_pop(0) /* ; */])], - [ax_pthread_ok=yes], - []) +ax_pthread_clang_warning=no - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" +# Clang needs special handling, because older versions handle the -pthread +# option in a rather... idiosyncratic way - AC_MSG_RESULT([$ax_pthread_ok]) - if test "x$ax_pthread_ok" = xyes; then - break; - fi +if test "x$ax_pthread_clang" = "xyes"; then - PTHREAD_LIBS="" - PTHREAD_CFLAGS="" + # Clang takes -pthread; it has never supported any other flag + + # (Note 1: This will need to be revisited if a system that Clang + # supports has POSIX threads in a separate library. This tends not + # to be the way of modern systems, but it's conceivable.) + + # (Note 2: On some systems, notably Darwin, -pthread is not needed + # to get POSIX threads support; the API is always present and + # active. We could reasonably leave PTHREAD_CFLAGS empty. But + # -pthread does define _REENTRANT, and while the Darwin headers + # ignore this macro, third-party headers might not.) + + PTHREAD_CFLAGS="-pthread" + PTHREAD_LIBS= + + ax_pthread_ok=yes + + # However, older versions of Clang make a point of warning the user + # that, in an invocation where only linking and no compilation is + # taking place, the -pthread option has no effect ("argument unused + # during compilation"). They expect -pthread to be passed in only + # when source code is being compiled. + # + # Problem is, this is at odds with the way Automake and most other + # C build frameworks function, which is that the same flags used in + # compilation (CFLAGS) are also used in linking. Many systems + # supported by AX_PTHREAD require exactly this for POSIX threads + # support, and in fact it is often not straightforward to specify a + # flag that is used only in the compilation phase and not in + # linking. Such a scenario is extremely rare in practice. + # + # Even though use of the -pthread flag in linking would only print + # a warning, this can be a nuisance for well-run software projects + # that build with -Werror. So if the active version of Clang has + # this misfeature, we search for an option to squash it. + + AC_CACHE_CHECK([whether Clang needs flag to prevent "argument unused" warning when linking with -pthread], + [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG], + [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown + # Create an alternate version of $ac_link that compiles and + # links in two steps (.c -> .o, .o -> exe) instead of one + # (.c -> exe), because the warning occurs only in the second + # step + ax_pthread_save_ac_link="$ac_link" + ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g' + ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"` + ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" + ax_pthread_save_CFLAGS="$CFLAGS" + for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do + AS_IF([test "x$ax_pthread_try" = "xunknown"], [break]) + CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" + ac_link="$ax_pthread_save_ac_link" + AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], + [ac_link="$ax_pthread_2step_ac_link" + AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], + [break]) + ]) + done + ac_link="$ax_pthread_save_ac_link" + CFLAGS="$ax_pthread_save_CFLAGS" + AS_IF([test "x$ax_pthread_try" = "x"], [ax_pthread_try=no]) + ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" + ]) + + case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in + no | unknown) ;; + *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;; + esac + +fi # $ax_pthread_clang = yes + +if test "x$ax_pthread_ok" = "xno"; then +for ax_pthread_try_flag in $ax_pthread_flags; do + + case $ax_pthread_try_flag in + none) + AC_MSG_CHECKING([whether pthreads work without any flags]) + ;; + + -mt,pthread) + AC_MSG_CHECKING([whether pthreads work with -mt -lpthread]) + PTHREAD_CFLAGS="-mt" + PTHREAD_LIBS="-lpthread" + ;; + + -*) + AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag]) + PTHREAD_CFLAGS="$ax_pthread_try_flag" + ;; + + pthread-config) + AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no]) + AS_IF([test "x$ax_pthread_config" = "xno"], [continue]) + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag]) + PTHREAD_LIBS="-l$ax_pthread_try_flag" + ;; + esac + + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + + AC_LINK_IFELSE([AC_LANG_PROGRAM([#include +# if $ax_pthread_check_cond +# error "$ax_pthread_check_macro must be defined" +# endif + static void routine(void *a) { a = 0; } + static void *start_routine(void *a) { return a; }], + [pthread_t th; pthread_attr_t attr; + pthread_create(&th, 0, start_routine, 0); + pthread_join(th, 0); + pthread_attr_init(&attr); + pthread_cleanup_push(routine, 0); + pthread_cleanup_pop(0) /* ; */])], + [ax_pthread_ok=yes], + []) + + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" + + AC_MSG_RESULT([$ax_pthread_ok]) + AS_IF([test "x$ax_pthread_ok" = "xyes"], [break]) + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" done fi # Various other checks: -if test "x$ax_pthread_ok" = xyes; then - save_LIBS="$LIBS" - LIBS="$PTHREAD_LIBS $LIBS" - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +if test "x$ax_pthread_ok" = "xyes"; then + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" - # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. - AC_MSG_CHECKING([for joinable pthread attribute]) - attr_name=unknown - for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do - AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], - [int attr = $attr; return attr /* ; */])], - [attr_name=$attr; break], - []) - done - AC_MSG_RESULT([$attr_name]) - if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then - AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE], [$attr_name], - [Define to necessary symbol if this constant - uses a non-standard name on your system.]) - fi + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + AC_CACHE_CHECK([for joinable pthread attribute], + [ax_cv_PTHREAD_JOINABLE_ATTR], + [ax_cv_PTHREAD_JOINABLE_ATTR=unknown + for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], + [int attr = $ax_pthread_attr; return attr /* ; */])], + [ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break], + []) + done + ]) + AS_IF([test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \ + test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \ + test "x$ax_pthread_joinable_attr_defined" != "xyes"], + [AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE], + [$ax_cv_PTHREAD_JOINABLE_ATTR], + [Define to necessary symbol if this constant + uses a non-standard name on your system.]) + ax_pthread_joinable_attr_defined=yes + ]) - AC_MSG_CHECKING([if more special flags are required for pthreads]) - flag=no - case ${host_os} in - aix* | freebsd* | darwin*) flag="-D_THREAD_SAFE";; - osf* | hpux*) flag="-D_REENTRANT";; - solaris*) - if test "$GCC" = "yes"; then - flag="-D_REENTRANT" - else - # TODO: What about Clang on Solaris? - flag="-mt -D_REENTRANT" - fi - ;; - esac - AC_MSG_RESULT([$flag]) - if test "x$flag" != xno; then - PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" - fi + AC_CACHE_CHECK([whether more special flags are required for pthreads], + [ax_cv_PTHREAD_SPECIAL_FLAGS], + [ax_cv_PTHREAD_SPECIAL_FLAGS=no + case $host_os in + solaris*) + ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS" + ;; + esac + ]) + AS_IF([test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \ + test "x$ax_pthread_special_flags_added" != "xyes"], + [PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS" + ax_pthread_special_flags_added=yes]) - AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT], - [ax_cv_PTHREAD_PRIO_INHERIT], [ - AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], - [[int i = PTHREAD_PRIO_INHERIT;]])], - [ax_cv_PTHREAD_PRIO_INHERIT=yes], - [ax_cv_PTHREAD_PRIO_INHERIT=no]) - ]) - AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes"], - [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.])]) + AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT], + [ax_cv_PTHREAD_PRIO_INHERIT], + [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[int i = PTHREAD_PRIO_INHERIT;]])], + [ax_cv_PTHREAD_PRIO_INHERIT=yes], + [ax_cv_PTHREAD_PRIO_INHERIT=no]) + ]) + AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \ + test "x$ax_pthread_prio_inherit_defined" != "xyes"], + [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.]) + ax_pthread_prio_inherit_defined=yes + ]) - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" - # More AIX lossage: compile with *_r variant - if test "x$GCC" != xyes; then - case $host_os in - aix*) - AS_CASE(["x/$CC"], - [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6], - [#handle absolute path differently from PATH based program lookup - AS_CASE(["x$CC"], - [x/*], - [AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])], - [AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])]) - ;; - esac - fi + # More AIX lossage: compile with *_r variant + if test "x$GCC" != "xyes"; then + case $host_os in + aix*) + AS_CASE(["x/$CC"], + [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6], + [#handle absolute path differently from PATH based program lookup + AS_CASE(["x$CC"], + [x/*], + [AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])], + [AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])]) + ;; + esac + fi fi test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" @@ -321,12 +474,12 @@ AC_SUBST([PTHREAD_CFLAGS]) AC_SUBST([PTHREAD_CC]) # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: -if test x"$ax_pthread_ok" = xyes; then - ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1]) - : +if test "x$ax_pthread_ok" = "xyes"; then + ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1]) + : else - ax_pthread_ok=no - $2 + ax_pthread_ok=no + $2 fi AC_LANG_POP ])dnl AX_PTHREAD From 4ba172369df69a8818cd805d037c6b334aabc4d1 Mon Sep 17 00:00:00 2001 From: "Wladimir J. van der Laan" Date: Thu, 3 Dec 2015 14:44:57 +0100 Subject: [PATCH 0323/1062] build: Enable C++11 build, require C++11 compiler Implements #6211. --- build-aux/m4/ax_cxx_compile_stdcxx.m4 | 558 ++++++++++++++++++++++++++ configure.ac | 2 + 2 files changed, 560 insertions(+) create mode 100644 build-aux/m4/ax_cxx_compile_stdcxx.m4 diff --git a/build-aux/m4/ax_cxx_compile_stdcxx.m4 b/build-aux/m4/ax_cxx_compile_stdcxx.m4 new file mode 100644 index 000000000..079e17d2a --- /dev/null +++ b/build-aux/m4/ax_cxx_compile_stdcxx.m4 @@ -0,0 +1,558 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional]) +# +# DESCRIPTION +# +# Check for baseline language coverage in the compiler for the specified +# version of the C++ standard. If necessary, add switches to CXXFLAGS to +# enable support. VERSION may be '11' (for the C++11 standard) or '14' +# (for the C++14 standard). +# +# The second argument, if specified, indicates whether you insist on an +# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. +# -std=c++11). If neither is specified, you get whatever works, with +# preference for an extended mode. +# +# The third argument, if specified 'mandatory' or if left unspecified, +# indicates that baseline support for the specified C++ standard is +# required and that the macro should error out if no mode with that +# support is found. If specified 'optional', then configuration proceeds +# regardless, after defining HAVE_CXX${VERSION} if and only if a +# supporting mode is found. +# +# LICENSE +# +# Copyright (c) 2008 Benjamin Kosnik +# Copyright (c) 2012 Zack Weinberg +# Copyright (c) 2013 Roy Stogner +# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov +# Copyright (c) 2015 Paul Norman +# Copyright (c) 2015 Moritz Klammler +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 1 + +dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro +dnl (serial version number 13). + +AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl + m4_if([$1], [11], [], + [$1], [14], [], + [$1], [17], [m4_fatal([support for C++17 not yet implemented in AX_CXX_COMPILE_STDCXX])], + [m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl + m4_if([$2], [], [], + [$2], [ext], [], + [$2], [noext], [], + [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl + m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true], + [$3], [mandatory], [ax_cxx_compile_cxx$1_required=true], + [$3], [optional], [ax_cxx_compile_cxx$1_required=false], + [m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])]) + AC_LANG_PUSH([C++])dnl + ac_success=no + AC_CACHE_CHECK(whether $CXX supports C++$1 features by default, + ax_cv_cxx_compile_cxx$1, + [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], + [ax_cv_cxx_compile_cxx$1=yes], + [ax_cv_cxx_compile_cxx$1=no])]) + if test x$ax_cv_cxx_compile_cxx$1 = xyes; then + ac_success=yes + fi + + m4_if([$2], [noext], [], [dnl + if test x$ac_success = xno; then + for switch in -std=gnu++$1 -std=gnu++0x; do + cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) + AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, + $cachevar, + [ac_save_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS $switch" + AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], + [eval $cachevar=yes], + [eval $cachevar=no]) + CXXFLAGS="$ac_save_CXXFLAGS"]) + if eval test x\$$cachevar = xyes; then + CXXFLAGS="$CXXFLAGS $switch" + ac_success=yes + break + fi + done + fi]) + + m4_if([$2], [ext], [], [dnl + if test x$ac_success = xno; then + dnl HP's aCC needs +std=c++11 according to: + dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf + dnl Cray's crayCC needs "-h std=c++11" + for switch in -std=c++$1 -std=c++0x +std=c++$1 "-h std=c++$1"; do + cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) + AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, + $cachevar, + [ac_save_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS $switch" + AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], + [eval $cachevar=yes], + [eval $cachevar=no]) + CXXFLAGS="$ac_save_CXXFLAGS"]) + if eval test x\$$cachevar = xyes; then + CXXFLAGS="$CXXFLAGS $switch" + ac_success=yes + break + fi + done + fi]) + AC_LANG_POP([C++]) + if test x$ax_cxx_compile_cxx$1_required = xtrue; then + if test x$ac_success = xno; then + AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.]) + fi + else + if test x$ac_success = xno; then + HAVE_CXX$1=0 + AC_MSG_NOTICE([No compiler with C++$1 support was found]) + else + HAVE_CXX$1=1 + AC_DEFINE(HAVE_CXX$1,1, + [define if the compiler supports basic C++$1 syntax]) + fi + + AC_SUBST(HAVE_CXX$1) + fi +]) + + +dnl Test body for checking C++11 support + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11], + _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 +) + + +dnl Test body for checking C++14 support + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14], + _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 +) + + +dnl Tests for new features in C++11 + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[ + +// If the compiler admits that it is not ready for C++11, why torture it? +// Hopefully, this will speed up the test. + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif __cplusplus < 201103L + +#error "This is not a C++11 compiler" + +#else + +namespace cxx11 +{ + + namespace test_static_assert + { + + template + struct check + { + static_assert(sizeof(int) <= sizeof(T), "not big enough"); + }; + + } + + namespace test_final_override + { + + struct Base + { + virtual void f() {} + }; + + struct Derived : public Base + { + virtual void f() override {} + }; + + } + + namespace test_double_right_angle_brackets + { + + template < typename T > + struct check {}; + + typedef check single_type; + typedef check> double_type; + typedef check>> triple_type; + typedef check>>> quadruple_type; + + } + + namespace test_decltype + { + + int + f() + { + int a = 1; + decltype(a) b = 2; + return a + b; + } + + } + + namespace test_type_deduction + { + + template < typename T1, typename T2 > + struct is_same + { + static const bool value = false; + }; + + template < typename T > + struct is_same + { + static const bool value = true; + }; + + template < typename T1, typename T2 > + auto + add(T1 a1, T2 a2) -> decltype(a1 + a2) + { + return a1 + a2; + } + + int + test(const int c, volatile int v) + { + static_assert(is_same::value == true, ""); + static_assert(is_same::value == false, ""); + static_assert(is_same::value == false, ""); + auto ac = c; + auto av = v; + auto sumi = ac + av + 'x'; + auto sumf = ac + av + 1.0; + static_assert(is_same::value == true, ""); + static_assert(is_same::value == true, ""); + static_assert(is_same::value == true, ""); + static_assert(is_same::value == false, ""); + static_assert(is_same::value == true, ""); + return (sumf > 0.0) ? sumi : add(c, v); + } + + } + + namespace test_noexcept + { + + int f() { return 0; } + int g() noexcept { return 0; } + + static_assert(noexcept(f()) == false, ""); + static_assert(noexcept(g()) == true, ""); + + } + + namespace test_constexpr + { + + template < typename CharT > + unsigned long constexpr + strlen_c_r(const CharT *const s, const unsigned long acc) noexcept + { + return *s ? strlen_c_r(s + 1, acc + 1) : acc; + } + + template < typename CharT > + unsigned long constexpr + strlen_c(const CharT *const s) noexcept + { + return strlen_c_r(s, 0UL); + } + + static_assert(strlen_c("") == 0UL, ""); + static_assert(strlen_c("1") == 1UL, ""); + static_assert(strlen_c("example") == 7UL, ""); + static_assert(strlen_c("another\0example") == 7UL, ""); + + } + + namespace test_rvalue_references + { + + template < int N > + struct answer + { + static constexpr int value = N; + }; + + answer<1> f(int&) { return answer<1>(); } + answer<2> f(const int&) { return answer<2>(); } + answer<3> f(int&&) { return answer<3>(); } + + void + test() + { + int i = 0; + const int c = 0; + static_assert(decltype(f(i))::value == 1, ""); + static_assert(decltype(f(c))::value == 2, ""); + static_assert(decltype(f(0))::value == 3, ""); + } + + } + + namespace test_uniform_initialization + { + + struct test + { + static const int zero {}; + static const int one {1}; + }; + + static_assert(test::zero == 0, ""); + static_assert(test::one == 1, ""); + + } + + namespace test_lambdas + { + + void + test1() + { + auto lambda1 = [](){}; + auto lambda2 = lambda1; + lambda1(); + lambda2(); + } + + int + test2() + { + auto a = [](int i, int j){ return i + j; }(1, 2); + auto b = []() -> int { return '0'; }(); + auto c = [=](){ return a + b; }(); + auto d = [&](){ return c; }(); + auto e = [a, &b](int x) mutable { + const auto identity = [](int y){ return y; }; + for (auto i = 0; i < a; ++i) + a += b--; + return x + identity(a + b); + }(0); + return a + b + c + d + e; + } + + int + test3() + { + const auto nullary = [](){ return 0; }; + const auto unary = [](int x){ return x; }; + using nullary_t = decltype(nullary); + using unary_t = decltype(unary); + const auto higher1st = [](nullary_t f){ return f(); }; + const auto higher2nd = [unary](nullary_t f1){ + return [unary, f1](unary_t f2){ return f2(unary(f1())); }; + }; + return higher1st(nullary) + higher2nd(nullary)(unary); + } + + } + + namespace test_variadic_templates + { + + template + struct sum; + + template + struct sum + { + static constexpr auto value = N0 + sum::value; + }; + + template <> + struct sum<> + { + static constexpr auto value = 0; + }; + + static_assert(sum<>::value == 0, ""); + static_assert(sum<1>::value == 1, ""); + static_assert(sum<23>::value == 23, ""); + static_assert(sum<1, 2>::value == 3, ""); + static_assert(sum<5, 5, 11>::value == 21, ""); + static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); + + } + + // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae + // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function + // because of this. + namespace test_template_alias_sfinae + { + + struct foo {}; + + template + using member = typename T::member_type; + + template + void func(...) {} + + template + void func(member*) {} + + void test(); + + void test() { func(0); } + + } + +} // namespace cxx11 + +#endif // __cplusplus >= 201103L + +]]) + + +dnl Tests for new features in C++14 + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[ + +// If the compiler admits that it is not ready for C++14, why torture it? +// Hopefully, this will speed up the test. + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif __cplusplus < 201402L + +#error "This is not a C++14 compiler" + +#else + +namespace cxx14 +{ + + namespace test_polymorphic_lambdas + { + + int + test() + { + const auto lambda = [](auto&&... args){ + const auto istiny = [](auto x){ + return (sizeof(x) == 1UL) ? 1 : 0; + }; + const int aretiny[] = { istiny(args)... }; + return aretiny[0]; + }; + return lambda(1, 1L, 1.0f, '1'); + } + + } + + namespace test_binary_literals + { + + constexpr auto ivii = 0b0000000000101010; + static_assert(ivii == 42, "wrong value"); + + } + + namespace test_generalized_constexpr + { + + template < typename CharT > + constexpr unsigned long + strlen_c(const CharT *const s) noexcept + { + auto length = 0UL; + for (auto p = s; *p; ++p) + ++length; + return length; + } + + static_assert(strlen_c("") == 0UL, ""); + static_assert(strlen_c("x") == 1UL, ""); + static_assert(strlen_c("test") == 4UL, ""); + static_assert(strlen_c("another\0test") == 7UL, ""); + + } + + namespace test_lambda_init_capture + { + + int + test() + { + auto x = 0; + const auto lambda1 = [a = x](int b){ return a + b; }; + const auto lambda2 = [a = lambda1(x)](){ return a; }; + return lambda2(); + } + + } + + namespace test_digit_seperators + { + + constexpr auto ten_million = 100'000'000; + static_assert(ten_million == 100000000, ""); + + } + + namespace test_return_type_deduction + { + + auto f(int& x) { return x; } + decltype(auto) g(int& x) { return x; } + + template < typename T1, typename T2 > + struct is_same + { + static constexpr auto value = false; + }; + + template < typename T > + struct is_same + { + static constexpr auto value = true; + }; + + int + test() + { + auto x = 0; + static_assert(is_same::value, ""); + static_assert(is_same::value, ""); + return x; + } + + } + +} // namespace cxx14 + +#endif // __cplusplus >= 201402L + +]]) diff --git a/configure.ac b/configure.ac index b61acf468..18e97b88e 100644 --- a/configure.ac +++ b/configure.ac @@ -54,6 +54,8 @@ case $host in lt_cv_deplibs_check_method="pass_all" ;; esac +dnl Require C++11 compiler (no GNU extensions) +AX_CXX_COMPILE_STDCXX([11], [noext], [mandatory]) dnl Libtool init checks. LT_INIT([pic-only]) From 038a858d2ffc4949a8ff548d48777dd34c4a4c73 Mon Sep 17 00:00:00 2001 From: Cory Fields Date: Thu, 21 Apr 2016 16:23:40 -0400 Subject: [PATCH 0324/1062] depends: use c++11 --- depends/hosts/darwin.mk | 2 +- depends/packages/bdb.mk | 1 + depends/packages/boost.mk | 2 +- depends/packages/zeromq.mk | 1 + 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/depends/hosts/darwin.mk b/depends/hosts/darwin.mk index 2958dc50c..dbe6d0079 100644 --- a/depends/hosts/darwin.mk +++ b/depends/hosts/darwin.mk @@ -3,7 +3,7 @@ OSX_SDK_VERSION=10.9 OSX_SDK=$(SDK_PATH)/MacOSX$(OSX_SDK_VERSION).sdk LD64_VERSION=241.9 darwin_CC=clang -target $(host) -mmacosx-version-min=$(OSX_MIN_VERSION) --sysroot $(OSX_SDK) -mlinker-version=$(LD64_VERSION) -darwin_CXX=clang++ -target $(host) -mmacosx-version-min=$(OSX_MIN_VERSION) --sysroot $(OSX_SDK) -mlinker-version=$(LD64_VERSION) +darwin_CXX=clang++ -target $(host) -mmacosx-version-min=$(OSX_MIN_VERSION) --sysroot $(OSX_SDK) -mlinker-version=$(LD64_VERSION) -stdlib=libc++ darwin_CFLAGS=-pipe darwin_CXXFLAGS=$(darwin_CFLAGS) diff --git a/depends/packages/bdb.mk b/depends/packages/bdb.mk index d0e9949f1..1134e94d0 100644 --- a/depends/packages/bdb.mk +++ b/depends/packages/bdb.mk @@ -9,6 +9,7 @@ define $(package)_set_vars $(package)_config_opts=--disable-shared --enable-cxx --disable-replication $(package)_config_opts_mingw32=--enable-mingw $(package)_config_opts_linux=--with-pic +$(package)_cxxflags=-std=c++11 endef define $(package)_preprocess_cmds diff --git a/depends/packages/boost.mk b/depends/packages/boost.mk index 7303821be..0c545c4d5 100644 --- a/depends/packages/boost.mk +++ b/depends/packages/boost.mk @@ -21,7 +21,7 @@ $(package)_archiver_$(host_os)=$($(package)_ar) $(package)_toolset_darwin=darwin $(package)_archiver_darwin=$($(package)_libtool) $(package)_config_libraries=chrono,filesystem,program_options,system,thread,test -$(package)_cxxflags=-fvisibility=hidden +$(package)_cxxflags=-std=c++11 -fvisibility=hidden $(package)_cxxflags_linux=-fPIC endef diff --git a/depends/packages/zeromq.mk b/depends/packages/zeromq.mk index 4b335c54c..3cca06dae 100644 --- a/depends/packages/zeromq.mk +++ b/depends/packages/zeromq.mk @@ -7,6 +7,7 @@ $(package)_sha256_hash=27d1e82a099228ee85a7ddb2260f40830212402c605a4a10b5e5498a7 define $(package)_set_vars $(package)_config_opts=--without-documentation --disable-shared --disable-curve $(package)_config_opts_linux=--with-pic + $(package)_cxxflags=-std=c++11 endef define $(package)_config_cmds From a65be830411e164acdad3ad6c3cbc81379d86f43 Mon Sep 17 00:00:00 2001 From: "Wladimir J. van der Laan" Date: Thu, 28 Apr 2016 10:18:06 +0200 Subject: [PATCH 0325/1062] build: update ax_cxx_compile_stdcxx to serial 4 --- build-aux/m4/ax_cxx_compile_stdcxx.m4 | 50 +++++++++++++++------------ 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/build-aux/m4/ax_cxx_compile_stdcxx.m4 b/build-aux/m4/ax_cxx_compile_stdcxx.m4 index 079e17d2a..2c18e49c5 100644 --- a/build-aux/m4/ax_cxx_compile_stdcxx.m4 +++ b/build-aux/m4/ax_cxx_compile_stdcxx.m4 @@ -9,9 +9,9 @@ # DESCRIPTION # # Check for baseline language coverage in the compiler for the specified -# version of the C++ standard. If necessary, add switches to CXXFLAGS to -# enable support. VERSION may be '11' (for the C++11 standard) or '14' -# (for the C++14 standard). +# version of the C++ standard. If necessary, add switches to CXX and +# CXXCPP to enable support. VERSION may be '11' (for the C++11 standard) +# or '14' (for the C++14 standard). # # The second argument, if specified, indicates whether you insist on an # extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. @@ -39,7 +39,7 @@ # and this notice are preserved. This file is offered as-is, without any # warranty. -#serial 1 +#serial 4 dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro dnl (serial version number 13). @@ -74,14 +74,17 @@ AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, $cachevar, - [ac_save_CXXFLAGS="$CXXFLAGS" - CXXFLAGS="$CXXFLAGS $switch" + [ac_save_CXX="$CXX" + CXX="$CXX $switch" AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], [eval $cachevar=yes], [eval $cachevar=no]) - CXXFLAGS="$ac_save_CXXFLAGS"]) + CXX="$ac_save_CXX"]) if eval test x\$$cachevar = xyes; then - CXXFLAGS="$CXXFLAGS $switch" + CXX="$CXX $switch" + if test -n "$CXXCPP" ; then + CXXCPP="$CXXCPP $switch" + fi ac_success=yes break fi @@ -97,14 +100,17 @@ AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, $cachevar, - [ac_save_CXXFLAGS="$CXXFLAGS" - CXXFLAGS="$CXXFLAGS $switch" + [ac_save_CXX="$CXX" + CXX="$CXX $switch" AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], [eval $cachevar=yes], [eval $cachevar=no]) - CXXFLAGS="$ac_save_CXXFLAGS"]) + CXX="$ac_save_CXX"]) if eval test x\$$cachevar = xyes; then - CXXFLAGS="$CXXFLAGS $switch" + CXX="$CXX $switch" + if test -n "$CXXCPP" ; then + CXXCPP="$CXXCPP $switch" + fi ac_success=yes break fi @@ -115,18 +121,16 @@ AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl if test x$ac_success = xno; then AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.]) fi - else - if test x$ac_success = xno; then - HAVE_CXX$1=0 - AC_MSG_NOTICE([No compiler with C++$1 support was found]) - else - HAVE_CXX$1=1 - AC_DEFINE(HAVE_CXX$1,1, - [define if the compiler supports basic C++$1 syntax]) - fi - - AC_SUBST(HAVE_CXX$1) fi + if test x$ac_success = xno; then + HAVE_CXX$1=0 + AC_MSG_NOTICE([No compiler with C++$1 support was found]) + else + HAVE_CXX$1=1 + AC_DEFINE(HAVE_CXX$1,1, + [define if the compiler supports basic C++$1 syntax]) + fi + AC_SUBST(HAVE_CXX$1) ]) From 377092a15248020eb6cf9fb9da8ad885029a5551 Mon Sep 17 00:00:00 2001 From: fanquake Date: Wed, 4 May 2016 19:03:59 +0800 Subject: [PATCH 0326/1062] [depends] Add -stdlib=libc++ to darwin CXX flags --- depends/builders/darwin.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/depends/builders/darwin.mk b/depends/builders/darwin.mk index 200d6ed22..27f550ab0 100644 --- a/depends/builders/darwin.mk +++ b/depends/builders/darwin.mk @@ -11,7 +11,7 @@ build_darwin_DOWNLOAD = curl --location --fail --connect-timeout $(DOWNLOAD_CONN #darwin host on darwin builder. overrides darwin host preferences. darwin_CC=$(shell xcrun -f clang) -mmacosx-version-min=$(OSX_MIN_VERSION) -darwin_CXX:=$(shell xcrun -f clang++) -mmacosx-version-min=$(OSX_MIN_VERSION) +darwin_CXX:=$(shell xcrun -f clang++) -mmacosx-version-min=$(OSX_MIN_VERSION) -stdlib=libc++ darwin_AR:=$(shell xcrun -f ar) darwin_RANLIB:=$(shell xcrun -f ranlib) darwin_STRIP:=$(shell xcrun -f strip) From 68ce87eddce21b7ada3533b817437ea7e56a4170 Mon Sep 17 00:00:00 2001 From: Cory Fields Date: Thu, 9 Jun 2016 12:30:38 -0400 Subject: [PATCH 0327/1062] depends: bump OSX toolchain clang: 3.7.1 cctools: 877.8 ld64: 253.9 --- depends/hosts/darwin.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/depends/hosts/darwin.mk b/depends/hosts/darwin.mk index dbe6d0079..985649619 100644 --- a/depends/hosts/darwin.mk +++ b/depends/hosts/darwin.mk @@ -1,7 +1,7 @@ OSX_MIN_VERSION=10.7 -OSX_SDK_VERSION=10.9 +OSX_SDK_VERSION=10.11 OSX_SDK=$(SDK_PATH)/MacOSX$(OSX_SDK_VERSION).sdk -LD64_VERSION=241.9 +LD64_VERSION=253.9 darwin_CC=clang -target $(host) -mmacosx-version-min=$(OSX_MIN_VERSION) --sysroot $(OSX_SDK) -mlinker-version=$(LD64_VERSION) darwin_CXX=clang++ -target $(host) -mmacosx-version-min=$(OSX_MIN_VERSION) --sysroot $(OSX_SDK) -mlinker-version=$(LD64_VERSION) -stdlib=libc++ From e2e7ca30543bb1f35fa1d1ce17d28af21563464c Mon Sep 17 00:00:00 2001 From: fanquake Date: Wed, 9 Nov 2016 18:55:04 +0800 Subject: [PATCH 0328/1062] [depends] Set OSX_MIN_VERSION to 10.8 --- depends/hosts/darwin.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/depends/hosts/darwin.mk b/depends/hosts/darwin.mk index 985649619..4e58bec74 100644 --- a/depends/hosts/darwin.mk +++ b/depends/hosts/darwin.mk @@ -1,4 +1,4 @@ -OSX_MIN_VERSION=10.7 +OSX_MIN_VERSION=10.8 OSX_SDK_VERSION=10.11 OSX_SDK=$(SDK_PATH)/MacOSX$(OSX_SDK_VERSION).sdk LD64_VERSION=253.9 From c16188cc6d0d6f77992d3132991c3ebcfd4c1613 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Sun, 29 Oct 2017 16:30:09 +1300 Subject: [PATCH 0329/1062] Remove manual -std=c++11 flag This is handled by autoconf now. --- configure.ac | 3 --- 1 file changed, 3 deletions(-) diff --git a/configure.ac b/configure.ac index 18e97b88e..9fcaafae6 100644 --- a/configure.ac +++ b/configure.ac @@ -40,9 +40,6 @@ else CXXFLAGS_overridden=no fi -# Zcash requries C++11 compatibility; set it early: -CXXFLAGS="-std=c++11 $CXXFLAGS" - AC_PROG_CXX m4_ifdef([AC_PROG_OBJCXX],[AC_PROG_OBJCXX]) From 9635679cbafb82d86b08e87fb2c63dd002d4a096 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Sun, 29 Oct 2017 14:24:27 +1300 Subject: [PATCH 0330/1062] Replace "install -D" with "mkdir -p && install" --- depends/packages/googletest.mk | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/depends/packages/googletest.mk b/depends/packages/googletest.mk index 94880efdb..b10ce89eb 100644 --- a/depends/packages/googletest.mk +++ b/depends/packages/googletest.mk @@ -11,8 +11,9 @@ define $(package)_build_cmds endef define $(package)_stage_cmds - install -D ./googlemock/make/gmock.a $($(package)_staging_dir)$(host_prefix)/lib/libgmock.a && \ - install -D ./googletest/make/gtest.a $($(package)_staging_dir)$(host_prefix)/lib/libgtest.a && \ + mkdir -p $($(package)_staging_dir)$(host_prefix)/lib && \ + install ./googlemock/make/gmock.a $($(package)_staging_dir)$(host_prefix)/lib/libgmock.a && \ + install ./googletest/make/gtest.a $($(package)_staging_dir)$(host_prefix)/lib/libgtest.a && \ cp -a ./googlemock/include $($(package)_staging_dir)$(host_prefix)/ && \ cp -a ./googletest/include $($(package)_staging_dir)$(host_prefix)/ endef From daad2c273657233735a100e5011fcc2fd1a88b75 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Sun, 29 Oct 2017 21:21:18 +1300 Subject: [PATCH 0331/1062] Check if OpenMP is available before using it --- build-aux/m4/ax_openmp.m4 | 123 ++++++++++++++++++++++++++++++++++++++ configure.ac | 11 +++- src/Makefile.am | 5 +- 3 files changed, 137 insertions(+), 2 deletions(-) create mode 100644 build-aux/m4/ax_openmp.m4 diff --git a/build-aux/m4/ax_openmp.m4 b/build-aux/m4/ax_openmp.m4 new file mode 100644 index 000000000..866e1d664 --- /dev/null +++ b/build-aux/m4/ax_openmp.m4 @@ -0,0 +1,123 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_openmp.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_OPENMP([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +# +# DESCRIPTION +# +# This macro tries to find out how to compile programs that use OpenMP a +# standard API and set of compiler directives for parallel programming +# (see http://www-unix.mcs/) +# +# On success, it sets the OPENMP_CFLAGS/OPENMP_CXXFLAGS/OPENMP_F77FLAGS +# output variable to the flag (e.g. -omp) used both to compile *and* link +# OpenMP programs in the current language. +# +# NOTE: You are assumed to not only compile your program with these flags, +# but also link it with them as well. +# +# If you want to compile everything with OpenMP, you should set: +# +# CFLAGS="$CFLAGS $OPENMP_CFLAGS" +# #OR# CXXFLAGS="$CXXFLAGS $OPENMP_CXXFLAGS" +# #OR# FFLAGS="$FFLAGS $OPENMP_FFLAGS" +# +# (depending on the selected language). +# +# The user can override the default choice by setting the corresponding +# environment variable (e.g. OPENMP_CFLAGS). +# +# ACTION-IF-FOUND is a list of shell commands to run if an OpenMP flag is +# found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it is +# not found. If ACTION-IF-FOUND is not specified, the default action will +# define HAVE_OPENMP. +# +# LICENSE +# +# Copyright (c) 2008 Steven G. Johnson +# Copyright (c) 2015 John W. Peterson +# Copyright (c) 2016 Nick R. Papior +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 13 + +AC_DEFUN([AX_OPENMP], [ +AC_PREREQ([2.69]) dnl for _AC_LANG_PREFIX + +AC_CACHE_CHECK([for OpenMP flag of _AC_LANG compiler], ax_cv_[]_AC_LANG_ABBREV[]_openmp, [save[]_AC_LANG_PREFIX[]FLAGS=$[]_AC_LANG_PREFIX[]FLAGS +ax_cv_[]_AC_LANG_ABBREV[]_openmp=unknown +# Flags to try: -fopenmp (gcc), -mp (SGI & PGI), +# -qopenmp (icc>=15), -openmp (icc), +# -xopenmp (Sun), -omp (Tru64), +# -qsmp=omp (AIX), +# none +ax_openmp_flags="-fopenmp -openmp -qopenmp -mp -xopenmp -omp -qsmp=omp none" +if test "x$OPENMP_[]_AC_LANG_PREFIX[]FLAGS" != x; then + ax_openmp_flags="$OPENMP_[]_AC_LANG_PREFIX[]FLAGS $ax_openmp_flags" +fi +for ax_openmp_flag in $ax_openmp_flags; do + case $ax_openmp_flag in + none) []_AC_LANG_PREFIX[]FLAGS=$save[]_AC_LANG_PREFIX[] ;; + *) []_AC_LANG_PREFIX[]FLAGS="$save[]_AC_LANG_PREFIX[]FLAGS $ax_openmp_flag" ;; + esac + AC_LINK_IFELSE([AC_LANG_SOURCE([[ +@%:@include + +static void +parallel_fill(int * data, int n) +{ + int i; +@%:@pragma omp parallel for + for (i = 0; i < n; ++i) + data[i] = i; +} + +int +main() +{ + int arr[100000]; + omp_set_num_threads(2); + parallel_fill(arr, 100000); + return 0; +} +]])],[ax_cv_[]_AC_LANG_ABBREV[]_openmp=$ax_openmp_flag; break],[]) +done +[]_AC_LANG_PREFIX[]FLAGS=$save[]_AC_LANG_PREFIX[]FLAGS +]) +if test "x$ax_cv_[]_AC_LANG_ABBREV[]_openmp" = "xunknown"; then + m4_default([$2],:) +else + if test "x$ax_cv_[]_AC_LANG_ABBREV[]_openmp" != "xnone"; then + OPENMP_[]_AC_LANG_PREFIX[]FLAGS=$ax_cv_[]_AC_LANG_ABBREV[]_openmp + fi + m4_default([$1], [AC_DEFINE(HAVE_OPENMP,1,[Define if OpenMP is enabled])]) +fi +])dnl AX_OPENMP diff --git a/configure.ac b/configure.ac index 9fcaafae6..75a7aeba8 100644 --- a/configure.ac +++ b/configure.ac @@ -689,6 +689,15 @@ if test x$enable_rust != xno; then RUST_LIBS="-lrustzcash" fi +dnl Check for OpenMP support +AX_OPENMP( + [AC_DEFINE(HAVE_OPENMP, 1, [Define if OpenMP is enabled]) + AM_CONDITIONAL([HAVE_OPENMP], [true]) + CXXFLAGS="$CXXFLAGS $OPENMP_CXXFLAGS"], + [AC_MSG_WARN([OpenMP not supported, disabling multithreading]) + AC_DEFINE(HAVE_OPENMP, 0, [Define if OpenMP is enabled]) + AM_CONDITIONAL([HAVE_OPENMP], [false])]) + # Gitian uses a config.site that sets depends_prefix, and then sets --prefix=/ # build.sh just uses --prefix if test x$depends_prefix != x; then @@ -697,7 +706,7 @@ else LIBSNARK_DEPINST="$prefix" fi -LIBZCASH_LIBS="-lgmp -lgmpxx -lboost_system-mt -lcrypto -lsodium -fopenmp $RUST_LIBS" +LIBZCASH_LIBS="-lgmp -lgmpxx -lboost_system-mt -lcrypto -lsodium $RUST_LIBS" CXXFLAGS_TEMP="$CXXFLAGS" LIBS_TEMP="$LIBS" diff --git a/src/Makefile.am b/src/Makefile.am index 71b89b96d..797fdcfe9 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -46,7 +46,10 @@ $(LIBSECP256K1): $(wildcard secp256k1/src/*) $(wildcard secp256k1/include/*) collate-libsnark: $(LIBSNARK) LIBSNARK_CXXFLAGS = -fPIC -DBINARY_OUTPUT -DNO_PT_COMPRESSION=1 -LIBSNARK_CONFIG_FLAGS = CURVE=ALT_BN128 MULTICORE=1 NO_PROCPS=1 NO_DOCS=1 STATIC=1 NO_SUPERCOP=1 FEATUREFLAGS=-DMONTGOMERY_OUTPUT NO_COPY_DEPINST=1 NO_COMPILE_LIBGTEST=1 +LIBSNARK_CONFIG_FLAGS = CURVE=ALT_BN128 NO_PROCPS=1 NO_DOCS=1 STATIC=1 NO_SUPERCOP=1 FEATUREFLAGS=-DMONTGOMERY_OUTPUT NO_COPY_DEPINST=1 NO_COMPILE_LIBGTEST=1 +if HAVE_OPENMP +LIBSNARK_CONFIG_FLAGS += MULTICORE=1 +endif $(LIBSNARK): $(wildcard snark/src/*) $(AM_V_at) CXXFLAGS="$(LIBSNARK_CXXFLAGS)" $(MAKE) $(AM_MAKEFLAGS) -C snark/ install PREFIX=$(srcdir)/build DEPINST="$(LIBSNARK_DEPINST)" $(LIBSNARK_CONFIG_FLAGS) OPTFLAGS="-O2 -march=x86-64" From d3096198c87de283d0ee1f8ce2ab10657fd7991d Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Sun, 29 Oct 2017 22:34:08 +1300 Subject: [PATCH 0332/1062] [libsnark] Use POSIX-compliant ar arguments --- src/snark/Makefile | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/snark/Makefile b/src/snark/Makefile index 32b8609f2..1583facf7 100644 --- a/src/snark/Makefile +++ b/src/snark/Makefile @@ -198,13 +198,8 @@ $(LIBGTEST_A): $(GTESTDIR)/src/gtest-all.cc $(DEPINST_EXISTS) # libsnark.a will contains all of our relevant object files, and we also mash in the .a files of relevant dependencies built by ./prepare-depends.sh $(LIBSNARK_A): $(LIB_OBJS) $(AR_LIBS) - ( \ - echo "create $(LIBSNARK_A)"; \ - echo "addmod $(LIB_OBJS)"; \ - if [ -n "$(AR_LIBS)" ]; then for AR_LIB in $(AR_LIBS); do echo addlib $$AR_LIB; done; fi; \ - echo "save"; \ - echo "end"; \ - ) | $(AR) -M + $(AR) q $(LIBSNARK_A) $(LIB_OBJS) + if [ -n "$(AR_LIBS)" ]; then mkdir -p tmp-ar; cd tmp-ar; for AR_LIB in $(AR_LIBS); do $(AR) x $$AR_LIB; done; $(AR) qc $(LIBSNARK_A) tmp-ar/*; cd ..; rm -r tmp-ar; fi; $(AR) s $(LIBSNARK_A) libsnark.so: $(LIBSNARK_A) $(DEPINST_EXISTS) From c6b39fbbd62e5f9ea58f6934a38c64a0cbfbb608 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Sun, 29 Oct 2017 22:41:43 +1300 Subject: [PATCH 0333/1062] Include endian-ness compatibility layer in Equihash implementation --- src/crypto/equihash.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/crypto/equihash.cpp b/src/crypto/equihash.cpp index d22244aa9..d98389861 100644 --- a/src/crypto/equihash.cpp +++ b/src/crypto/equihash.cpp @@ -16,6 +16,7 @@ #include "config/bitcoin-config.h" #endif +#include "compat/endian.h" #include "crypto/equihash.h" #include "util.h" From c459de2f0331f1bfaab812a4555018095dc0e0a4 Mon Sep 17 00:00:00 2001 From: Cory Fields Date: Mon, 9 Nov 2015 20:50:25 -0500 Subject: [PATCH 0334/1062] build: Split hardening/fPIE options out This allows for fPIE to be used selectively. --- configure.ac | 18 +++++++++++------ src/Makefile.am | 41 ++++++++++++++++++++++++++------------- src/Makefile.test.include | 3 ++- 3 files changed, 41 insertions(+), 21 deletions(-) diff --git a/configure.ac b/configure.ac index 75a7aeba8..4fc9c6ce1 100644 --- a/configure.ac +++ b/configure.ac @@ -323,6 +323,7 @@ case $host in AX_CHECK_LINK_FLAG([[-Wl,-headerpad_max_install_names]], [LDFLAGS="$LDFLAGS -Wl,-headerpad_max_install_names"]) CPPFLAGS="$CPPFLAGS -DMAC_OSX" + OBJCXXFLAGS="$CXXFLAGS" ;; *linux*) TARGET_OS=linux @@ -423,6 +424,11 @@ else AC_SEARCH_LIBS([clock_gettime],[rt]) fi +if test x$TARGET_OS != xwindows; then + # All windows code is PIC, forcing it on just adds useless compile warnings + AX_CHECK_COMPILE_FLAG([-fPIC],[PIC_FLAGS="-fPIC"]) +fi + if test x$use_hardening != xno; then AX_CHECK_COMPILE_FLAG([-Wformat],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -Wformat"],[AC_MSG_ERROR(Cannot enable -Wformat)]) AX_CHECK_COMPILE_FLAG([-Wformat-security],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -Wformat-security"],[AC_MSG_ERROR(Cannot enable -Wformat-security)],[-Wformat]) @@ -441,7 +447,7 @@ if test x$use_hardening != xno; then if test x$TARGET_OS != xwindows; then # All windows code is PIC, forcing it on just adds useless compile warnings - AX_CHECK_COMPILE_FLAG([-fPIE],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -fPIE"],[AC_MSG_ERROR(Cannot enable -fPIE)]) + AX_CHECK_COMPILE_FLAG([-fPIE],[PIE_FLAGS="-fPIE"],[AC_MSG_ERROR(Cannot enable -fPIE)]) AX_CHECK_LINK_FLAG([[-pie]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -pie"],[AC_MSG_ERROR(Cannot enable -pie)]) else # These are only available on Windows. @@ -454,11 +460,6 @@ if test x$use_hardening != xno; then AC_CHECK_LIB([ssp], [main],, AC_MSG_ERROR(lib missing)) ;; esac - - CXXFLAGS="$CXXFLAGS $HARDENED_CXXFLAGS" - CPPFLAGS="$CPPFLAGS $HARDENED_CPPFLAGS" - LDFLAGS="$LDFLAGS $HARDENED_LDFLAGS" - OBJCXXFLAGS="$CXXFLAGS" fi dnl this flag screws up non-darwin gcc even when the check fails. special-case it. @@ -835,6 +836,11 @@ AC_SUBST(CLIENT_VERSION_IS_RELEASE, _CLIENT_VERSION_IS_RELEASE) AC_SUBST(COPYRIGHT_YEAR, _COPYRIGHT_YEAR) AC_SUBST(RELDFLAGS) +AC_SUBST(HARDENED_CXXFLAGS) +AC_SUBST(HARDENED_CPPFLAGS) +AC_SUBST(HARDENED_LDFLAGS) +AC_SUBST(PIC_FLAGS) +AC_SUBST(PIE_FLAGS) AC_SUBST(LIBTOOL_APP_LDFLAGS) AC_SUBST(BOOST_LIBS) AC_SUBST(TESTDEFS) diff --git a/src/Makefile.am b/src/Makefile.am index 797fdcfe9..d9f2adbda 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,6 +1,8 @@ DIST_SUBDIRS = secp256k1 univalue -AM_LDFLAGS = $(PTHREAD_CFLAGS) $(LIBTOOL_LDFLAGS) +AM_LDFLAGS = $(PTHREAD_CFLAGS) $(LIBTOOL_LDFLAGS) $(HARDENED_LDFLAGS) +AM_CXXFLAGS = $(HARDENED_CXXFLAGS) +AM_CPPFLAGS = $(HARDENED_CPPFLAGS) if EMBEDDED_LEVELDB LEVELDB_CPPFLAGS += -I$(srcdir)/leveldb/include @@ -14,7 +16,7 @@ $(LIBLEVELDB): $(LIBMEMENV) $(LIBLEVELDB) $(LIBMEMENV): @echo "Building LevelDB ..." && $(MAKE) -C $(@D) $(@F) CXX="$(CXX)" \ CC="$(CC)" PLATFORM=$(TARGET_OS) AR="$(AR)" $(LEVELDB_TARGET_FLAGS) \ - OPT="$(CXXFLAGS) $(CPPFLAGS) -D__STDC_LIMIT_MACROS" + OPT="$(AM_CXXFLAGS) $(PIE_FLAGS) $(CXXFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) -D__STDC_LIMIT_MACROS" endif BITCOIN_CONFIG_INCLUDES=-I$(builddir)/config @@ -227,7 +229,8 @@ obj/build.h: FORCE libbitcoin_util_a-clientversion.$(OBJEXT): obj/build.h # server: zcashd -libbitcoin_server_a_CPPFLAGS = $(BITCOIN_INCLUDES) $(EVENT_CFLAGS) $(EVENT_PTHREADS_CFLAGS) +libbitcoin_server_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(EVENT_CFLAGS) $(EVENT_PTHREADS_CFLAGS) +libbitcoin_server_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) libbitcoin_server_a_SOURCES = \ sendalert.cpp \ addrman.cpp \ @@ -273,6 +276,7 @@ if ENABLE_ZMQ LIBBITCOIN_ZMQ=libbitcoin_zmq.a libbitcoin_zmq_a_CPPFLAGS = $(BITCOIN_INCLUDES) $(ZMQ_CFLAGS) +libbitcoin_zmq_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) libbitcoin_zmq_a_SOURCES = \ zmq/zmqabstractnotifier.cpp \ zmq/zmqnotificationinterface.cpp \ @@ -290,7 +294,8 @@ libbitcoin_proton_a_SOURCES = \ endif # wallet: zcashd, but only linked when wallet enabled -libbitcoin_wallet_a_CPPFLAGS = $(BITCOIN_INCLUDES) +libbitcoin_wallet_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) +libbitcoin_wallet_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) libbitcoin_wallet_a_SOURCES = \ utiltest.cpp \ utiltest.h \ @@ -312,7 +317,8 @@ libbitcoin_wallet_a_SOURCES = \ $(LIBZCASH_H) # crypto primitives library -crypto_libbitcoin_crypto_a_CPPFLAGS = $(BITCOIN_CONFIG_INCLUDES) +crypto_libbitcoin_crypto_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_CONFIG_INCLUDES) +crypto_libbitcoin_crypto_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) crypto_libbitcoin_crypto_a_SOURCES = \ crypto/common.h \ crypto/equihash.cpp \ @@ -344,7 +350,8 @@ crypto_libbitcoin_crypto_a_SOURCES += \ endif # common: shared between zcashd and non-server tools -libbitcoin_common_a_CPPFLAGS = $(BITCOIN_INCLUDES) +libbitcoin_common_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) +libbitcoin_common_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) libbitcoin_common_a_SOURCES = \ amount.cpp \ arith_uint256.cpp \ @@ -374,7 +381,8 @@ libbitcoin_common_a_SOURCES = \ # util: shared between all executables. # This library *must* be included to make sure that the glibc # backward-compatibility objects and their sanity checks are linked. -libbitcoin_util_a_CPPFLAGS = $(BITCOIN_INCLUDES) +libbitcoin_util_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) +libbitcoin_util_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) libbitcoin_util_a_SOURCES = \ support/pagelocker.cpp \ chainparamsbase.cpp \ @@ -399,7 +407,8 @@ libbitcoin_util_a_SOURCES += compat/glibc_compat.cpp endif # cli: zcash-cli -libbitcoin_cli_a_CPPFLAGS = $(BITCOIN_INCLUDES) +libbitcoin_cli_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) +libbitcoin_cli_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) libbitcoin_cli_a_SOURCES = \ rpcclient.cpp \ $(BITCOIN_CORE_H) \ @@ -410,7 +419,8 @@ nodist_libbitcoin_util_a_SOURCES = $(srcdir)/obj/build.h # bitcoind binary # zcashd_SOURCES = bitcoind.cpp -zcashd_CPPFLAGS = $(BITCOIN_INCLUDES) +zcashd_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) +zcashd_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) zcashd_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) if TARGET_WINDOWS @@ -453,7 +463,8 @@ endif # bitcoin-cli binary # zcash_cli_SOURCES = bitcoin-cli.cpp -zcash_cli_CPPFLAGS = $(BITCOIN_INCLUDES) $(EVENT_CFLAGS) +zcash_cli_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(EVENT_CFLAGS) +zcash_cli_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) zcash_cli_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) if TARGET_WINDOWS @@ -476,7 +487,8 @@ zcash_cli_LDADD = \ # zcash-tx binary # zcash_tx_SOURCES = bitcoin-tx.cpp -zcash_tx_CPPFLAGS = $(BITCOIN_INCLUDES) +zcash_tx_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) +zcash_tx_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) zcash_tx_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) if TARGET_WINDOWS @@ -545,9 +557,10 @@ if GLIBC_BACK_COMPAT libzcashconsensus_la_SOURCES += compat/glibc_compat.cpp endif -libzcashconsensus_la_LDFLAGS = -no-undefined $(RELDFLAGS) +libzcashconsensus_la_LDFLAGS = $(AM_LDFLAGS) -no-undefined $(RELDFLAGS) libzcashconsensus_la_LIBADD = $(LIBSECP256K1) -libzcashconsensus_la_CPPFLAGS = -I$(builddir)/obj -I$(srcdir)/secp256k1/include -DBUILD_BITCOIN_INTERNAL +libzcashconsensus_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(builddir)/obj -I$(srcdir)/secp256k1/include -DBUILD_BITCOIN_INTERNAL +libzcashconsensus_la_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) endif # @@ -571,7 +584,7 @@ clean-local: .mm.o: $(AM_V_CXX) $(OBJCXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o $@ $< + $(CPPFLAGS) $(AM_CXXFLAGS) $(AM_CXXFLAGS) $(PIE_FLAGS) $(CXXFLAGS) -c -o $@ $< check-symbols: $(bin_PROGRAMS) if GLIBC_BACK_COMPAT diff --git a/src/Makefile.test.include b/src/Makefile.test.include index 4b85dd502..582ecb577 100644 --- a/src/Makefile.test.include +++ b/src/Makefile.test.include @@ -99,9 +99,10 @@ BITCOIN_TESTS += \ endif test_test_bitcoin_SOURCES = $(BITCOIN_TESTS) $(JSON_TEST_FILES) $(RAW_TEST_FILES) -test_test_bitcoin_CPPFLAGS = -fopenmp $(BITCOIN_INCLUDES) -I$(builddir)/test/ $(TESTDEFS) $(EVENT_CFLAGS) +test_test_bitcoin_CPPFLAGS = $(AM_CPPFLAGS) -fopenmp $(BITCOIN_INCLUDES) -I$(builddir)/test/ $(TESTDEFS) $(EVENT_CFLAGS) test_test_bitcoin_LDADD = $(LIBBITCOIN_SERVER) $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CRYPTO) $(LIBUNIVALUE) $(LIBLEVELDB) $(LIBMEMENV) \ $(BOOST_LIBS) $(BOOST_UNIT_TEST_FRAMEWORK_LIB) $(LIBSECP256K1) $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) +test_test_bitcoin_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) if ENABLE_WALLET test_test_bitcoin_LDADD += $(LIBBITCOIN_WALLET) endif From ad96d74afe5c5e53644cf87a8e3f7caf893816c6 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 30 Nov 2017 14:21:11 +0000 Subject: [PATCH 0335/1062] build: Split hardening/fPIE options out in Zcash-specific binaries --- src/Makefile.am | 1 + src/Makefile.gtest.include | 3 ++- src/Makefile.zcash.include | 5 ++++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index d9f2adbda..36f353802 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -287,6 +287,7 @@ if ENABLE_PROTON LIBBITCOIN_PROTON=libbitcoin_proton.a libbitcoin_proton_a_CPPFLAGS = $(BITCOIN_INCLUDES) +libbitcoin_proton_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) libbitcoin_proton_a_SOURCES = \ amqp/amqpabstractnotifier.cpp \ amqp/amqpnotificationinterface.cpp \ diff --git a/src/Makefile.gtest.include b/src/Makefile.gtest.include index 02152f936..522bfa84a 100644 --- a/src/Makefile.gtest.include +++ b/src/Makefile.gtest.include @@ -45,7 +45,8 @@ zcash_gtest_SOURCES += \ wallet/gtest/test_wallet.cpp endif -zcash_gtest_CPPFLAGS = -DMULTICORE -fopenmp -DBINARY_OUTPUT -DCURVE_ALT_BN128 -DSTATIC $(BITCOIN_INCLUDES) +zcash_gtest_CPPFLAGS = $(AM_CPPFLAGS) -DMULTICORE -fopenmp -DBINARY_OUTPUT -DCURVE_ALT_BN128 -DSTATIC $(BITCOIN_INCLUDES) +zcash_gtest_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) zcash_gtest_LDADD = -lgtest -lgmock $(LIBBITCOIN_SERVER) $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CRYPTO) $(LIBUNIVALUE) $(LIBLEVELDB) $(LIBMEMENV) \ $(BOOST_LIBS) $(BOOST_UNIT_TEST_FRAMEWORK_LIB) $(LIBSECP256K1) diff --git a/src/Makefile.zcash.include b/src/Makefile.zcash.include index e5752cb2f..177931c88 100644 --- a/src/Makefile.zcash.include +++ b/src/Makefile.zcash.include @@ -4,6 +4,8 @@ noinst_PROGRAMS += \ # tool for generating our public parameters zcash_GenerateParams_SOURCES = zcash/GenerateParams.cpp +zcash_GenerateParams_CPPFLAGS = $(AM_CPPFLAGS) +zcash_GenerateParams_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) zcash_GenerateParams_LDADD = \ $(BOOST_LIBS) \ $(LIBZCASH) \ @@ -14,7 +16,8 @@ zcash_GenerateParams_LDADD = \ # tool for profiling the creation of joinsplits zcash_CreateJoinSplit_SOURCES = zcash/CreateJoinSplit.cpp -zcash_CreateJoinSplit_CPPFLAGS = $(BITCOIN_INCLUDES) +zcash_CreateJoinSplit_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) +zcash_CreateJoinSplit_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) zcash_CreateJoinSplit_LDADD = \ $(LIBBITCOIN_COMMON) \ $(LIBZCASH) \ From 0b2a64f48405904147c786a86e9b7b20fb0e9bc1 Mon Sep 17 00:00:00 2001 From: daniel Date: Thu, 19 Nov 2015 13:28:22 +0800 Subject: [PATCH 0336/1062] add powerpc build support for openssl lib --- depends/packages/openssl.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/depends/packages/openssl.mk b/depends/packages/openssl.mk index fe19c6734..f80cd6d25 100644 --- a/depends/packages/openssl.mk +++ b/depends/packages/openssl.mk @@ -85,6 +85,7 @@ $(package)_config_opts_arm_linux=linux-generic32 $(package)_config_opts_aarch64_linux=linux-generic64 $(package)_config_opts_mipsel_linux=linux-generic32 $(package)_config_opts_mips_linux=linux-generic32 +$(package)_config_opts_powerpc_linux=linux-generic32 $(package)_config_opts_x86_64_darwin=darwin64-x86_64-cc $(package)_config_opts_x86_64_mingw32=mingw64 $(package)_config_opts_i686_mingw32=mingw From c5d645e22f5efcf85acacc80647a1ae70bad95ac Mon Sep 17 00:00:00 2001 From: Cory Fields Date: Fri, 1 Apr 2016 12:19:28 -0400 Subject: [PATCH 0337/1062] build: define base filenames for use elsewhere in the buildsystem Unfortunately, the target namees defined at the Makefile.am level can't be used for *.in substitution. So these new defines will have to stay synced up with those targets. Using the new variables for the deploy targets in the main Makefile.am will ensure that they stay in sync, otherwise build tests will fail. --- Makefile.am | 4 ++-- configure.ac | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Makefile.am b/Makefile.am index e3142b52a..e515395c5 100644 --- a/Makefile.am +++ b/Makefile.am @@ -12,8 +12,8 @@ pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libzcashconsensus.pc endif -BITCOIND_BIN=$(top_builddir)/src/zcashd$(EXEEXT) -BITCOIN_CLI_BIN=$(top_builddir)/src/zcash-cli$(EXEEXT) +BITCOIND_BIN=$(top_builddir)/src/$(BITCOIN_DAEMON_NAME)$(EXEEXT) +BITCOIN_CLI_BIN=$(top_builddir)/src/$(BITCOIN_CLI_NAME)$(EXEEXT) BITCOIN_WIN_INSTALLER=$(PACKAGE)-$(PACKAGE_VERSION)-win$(WINDOWS_BITS)-setup$(EXEEXT) ##OSX_APP=Bitcoin-Qt.app diff --git a/configure.ac b/configure.ac index 4fc9c6ce1..bdcac43bc 100644 --- a/configure.ac +++ b/configure.ac @@ -14,6 +14,10 @@ AC_CONFIG_HEADERS([src/config/bitcoin-config.h]) AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_MACRO_DIR([build-aux/m4]) +BITCOIN_DAEMON_NAME=zcashd +BITCOIN_CLI_NAME=zcash-cli +BITCOIN_TX_NAME=zcash-tx + AC_CANONICAL_HOST AH_TOP([#ifndef BITCOIN_CONFIG_H]) @@ -834,6 +838,9 @@ AC_SUBST(CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION) AC_SUBST(CLIENT_VERSION_BUILD, _CLIENT_VERSION_BUILD) AC_SUBST(CLIENT_VERSION_IS_RELEASE, _CLIENT_VERSION_IS_RELEASE) AC_SUBST(COPYRIGHT_YEAR, _COPYRIGHT_YEAR) +AC_SUBST(BITCOIN_DAEMON_NAME) +AC_SUBST(BITCOIN_CLI_NAME) +AC_SUBST(BITCOIN_TX_NAME) AC_SUBST(RELDFLAGS) AC_SUBST(HARDENED_CXXFLAGS) From 341ab7453295ca387a5e2aaf75f7e5240e8bff96 Mon Sep 17 00:00:00 2001 From: Cory Fields Date: Wed, 9 Mar 2016 16:45:58 -0500 Subject: [PATCH 0338/1062] build: quiet annoying warnings without adding new ones Disabling warnings can be tricky, because doing so can cause a different compiler to create new warnings about unsupported disable flags. Also, some warnings don't surface until they're paired with another warning (gcc). For example, adding "-Wno-foo" won't cause any trouble, but if there's a legitimate warning emitted, the "unknown option -Wno-foo" will show up as well. Work around this in 2 ways: 1. When checking to see if -Wno-foo is supported, check for "-Wfoo" instead. 2. Enable -Werror while checking 1. If "-Werror -Wfoo" compiles, "-Wno-foo" is almost guaranteed to be supported. -Werror itself is also checked. If that fails to compile by itself, it likely means that the user added a flag that adds a warning. In that case, -Werror won't be used while checking, and the build may be extra noisy. The user would need to fix the bad input flag. Also, silence 2 more additional warnings that can show up post-c++11. --- configure.ac | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/configure.ac b/configure.ac index bdcac43bc..20b42d6e2 100644 --- a/configure.ac +++ b/configure.ac @@ -169,6 +169,9 @@ AC_ARG_ENABLE([debug], [enable_debug=$enableval], [enable_debug=no]) +AC_LANG_PUSH([C++]) +AX_CHECK_COMPILE_FLAG([-Werror],[CXXFLAG_WERROR="-Werror"],[CXXFLAG_WERROR=""]) + if test "x$enable_debug" = xyes; then CPPFLAGS="$CPPFLAGS -DDEBUG -DDEBUG_LOCKORDER" if test "x$GCC" = xyes; then @@ -180,11 +183,19 @@ if test "x$enable_debug" = xyes; then fi fi -## TODO: Remove these hard-coded paths and flags. They are here for the sake of -## compatibility with the legacy buildsystem. -## if test "x$CXXFLAGS_overridden" = "xno"; then - CXXFLAGS="$CXXFLAGS -Wall -Wextra -Wformat -Wformat-security -Wno-unused-parameter -Wno-self-assign" + AX_CHECK_COMPILE_FLAG([-Wall],[CXXFLAGS="$CXXFLAGS -Wall"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wextra],[CXXFLAGS="$CXXFLAGS -Wextra"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wformat],[CXXFLAGS="$CXXFLAGS -Wformat"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wformat-security],[CXXFLAGS="$CXXFLAGS -Wformat-security"],,[[$CXXFLAG_WERROR]]) + + ## Some compilers (gcc) ignore unknown -Wno-* options, but warn about all + ## unknown options if any other warning is produced. Test the -Wfoo case, and + ## set the -Wno-foo case if it works. + AX_CHECK_COMPILE_FLAG([-Wunused-parameter],[CXXFLAGS="$CXXFLAGS -Wno-unused-parameter"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wself-assign],[CXXFLAGS="$CXXFLAGS -Wno-self-assign"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wunused-local-typedef],[CXXFLAGS="$CXXFLAGS -Wno-unused-local-typedef"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wdeprecated-register],[CXXFLAGS="$CXXFLAGS -Wno-deprecated-register"],,[[$CXXFLAG_WERROR]]) fi CPPFLAGS="$CPPFLAGS -DHAVE_BUILD_INFO -D__STDC_FORMAT_MACROS" @@ -206,8 +217,6 @@ AC_ARG_WITH([daemon], [build_bitcoind=$withval], [build_bitcoind=yes]) -AC_LANG_PUSH([C++]) - use_pkgconfig=yes case $host in *mingw*) From d70027148db87e287c6cdeb00fce631af6fb8c6c Mon Sep 17 00:00:00 2001 From: Cory Fields Date: Thu, 7 Jul 2016 13:47:54 -0400 Subject: [PATCH 0339/1062] build: fix Windows builds without pkg-config - guard PKG_PROG_PKG_CONFIG with an m4_ifdef. If not building for windows, require it - add nops as necessary in case the ifdef reduces the if/then to nothing - AC_SUBST some missing _LIBS. These were split out over time, but not all were properly substituted. They continued to work if pkg-config is installed because it does the AC_SUBST itself --- configure.ac | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/configure.ac b/configure.ac index 20b42d6e2..f2f34c19d 100644 --- a/configure.ac +++ b/configure.ac @@ -75,9 +75,6 @@ AC_PATH_PROG(HEXDUMP,hexdump) AC_PATH_TOOL(READELF,readelf) AC_PATH_TOOL(CPPFILT,c++filt) -dnl pkg-config check. -PKG_PROG_PKG_CONFIG - # Enable wallet AC_ARG_ENABLE([wallet], [AS_HELP_STRING([--enable-wallet], @@ -345,6 +342,16 @@ case $host in ;; esac +if test x$use_pkgconfig = xyes; then + m4_ifndef([PKG_PROG_PKG_CONFIG], [AC_MSG_ERROR(PKG_PROG_PKG_CONFIG macro not found. Please install pkg-config and re-run autogen.sh.)]) + m4_ifdef([PKG_PROG_PKG_CONFIG], [ + PKG_PROG_PKG_CONFIG + if test x"$PKG_CONFIG" = "x"; then + AC_MSG_ERROR(pkg-config not found.) + fi + ]) +fi + if test x$use_comparison_tool != xno; then if test x$JAVA = x; then AC_MSG_ERROR("comparison tool set but java not found") @@ -619,12 +626,7 @@ BOOST_LIBS="$BOOST_LDFLAGS $BOOST_SYSTEM_LIB $BOOST_FILESYSTEM_LIB $BOOST_PROGRA fi if test x$use_pkgconfig = xyes; then - - if test x"$PKG_CONFIG" = "x"; then - AC_MSG_ERROR(pkg-config not found.) - fi - - : #NOP + : dnl m4_ifdef( [PKG_CHECK_MODULES], [ @@ -861,6 +863,11 @@ AC_SUBST(LIBTOOL_APP_LDFLAGS) AC_SUBST(BOOST_LIBS) AC_SUBST(TESTDEFS) AC_SUBST(LEVELDB_TARGET_FLAGS) +AC_SUBST(CRYPTO_LIBS) +AC_SUBST(SSL_LIBS) +AC_SUBST(EVENT_LIBS) +AC_SUBST(EVENT_PTHREADS_LIBS) +AC_SUBST(ZMQ_LIBS) AC_SUBST(GMP_LIBS) AC_SUBST(GMPXX_LIBS) AC_SUBST(LIBSNARK_DEPINST) From 57ab896ba43af71b6d968fb2c2c4d2bcf65f8945 Mon Sep 17 00:00:00 2001 From: "Wladimir J. van der Laan" Date: Sat, 13 Aug 2016 16:03:44 +0200 Subject: [PATCH 0340/1062] test: Remove java comparison tool --- Makefile.am | 33 ++++----------------------------- configure.ac | 35 ----------------------------------- depends/config.site.in | 4 ---- 3 files changed, 4 insertions(+), 68 deletions(-) diff --git a/Makefile.am b/Makefile.am index e515395c5..9157365b6 100644 --- a/Makefile.am +++ b/Makefile.am @@ -41,9 +41,9 @@ WINDOWS_PACKAGING = $(top_srcdir)/share/pixmaps/bitcoin.ico \ ## $(top_srcdir)/contrib/macdeploy/detached-sig-apply.sh \ ## $(top_srcdir)/contrib/macdeploy/detached-sig-create.sh -COVERAGE_INFO = baseline_filtered_combined.info baseline.info block_test.info \ +COVERAGE_INFO = baseline_filtered_combined.info baseline.info \ leveldb_baseline.info test_bitcoin_filtered.info total_coverage.info \ - baseline_filtered.info block_test_filtered.info \ + baseline_filtered.info \ leveldb_baseline_filtered.info test_bitcoin_coverage.info test_bitcoin.info \ zcash-gtest.info zcash-gtest_filtered.info zcash-gtest_coverage.info @@ -215,33 +215,14 @@ zcash-gtest_filtered.info: zcash-gtest.info "$(abs_builddir)/src/wallet/test/*" \ -o $@ -block_test.info: test_bitcoin_filtered.info - $(MKDIR_P) qa/tmp - -@TIMEOUT=15 qa/pull-tester/run-bitcoind-for-test.sh $(JAVA) -jar $(JAVA_COMPARISON_TOOL) qa/tmp/compTool 0 - $(LCOV) -c -d $(abs_builddir)/src --t BitcoinJBlockTest -o $@ - $(LCOV) -z -d $(abs_builddir)/src - $(LCOV) -z -d $(abs_builddir)/src/leveldb - -block_test_filtered.info: block_test.info - $(LCOV) -r $< "/usr/include/*" \ - "$(abs_builddir)/depends/x86_64-unknown-linux-gnu/include/*.h" \ - "$(abs_builddir)/depends/x86_64-unknown-linux-gnu/include/boost/*" \ - "$(abs_builddir)/depends/x86_64-unknown-linux-gnu/include/gmock/*" \ - "$(abs_builddir)/depends/x86_64-unknown-linux-gnu/include/gtest/*" \ - "$(abs_builddir)/src/gtest/*" \ - "$(abs_builddir)/src/test/*" \ - "$(abs_builddir)/src/wallet/gtest/*" \ - "$(abs_builddir)/src/wallet/test/*" \ - -o $@ - test_bitcoin_coverage.info: baseline_filtered_combined.info test_bitcoin_filtered.info $(LCOV) -a baseline_filtered.info -a leveldb_baseline_filtered.info -a test_bitcoin_filtered.info -o $@ zcash-gtest_coverage.info: baseline_filtered_combined.info zcash-gtest_filtered.info $(LCOV) -a baseline_filtered.info -a leveldb_baseline_filtered.info -a zcash-gtest_filtered.info -o $@ -total_coverage.info: baseline_filtered_combined.info test_bitcoin_filtered.info zcash-gtest_filtered.info block_test_filtered.info - $(LCOV) -a baseline_filtered.info -a leveldb_baseline_filtered.info -a test_bitcoin_filtered.info -a zcash-gtest_filtered.info -a block_test_filtered.info -o $@ | $(GREP) "\%" | $(AWK) '{ print substr($$3,2,50) "/" $$5 }' > coverage_percent.txt +total_coverage.info: baseline_filtered_combined.info test_bitcoin_filtered.info zcash-gtest_filtered.info + $(LCOV) -a baseline_filtered.info -a leveldb_baseline_filtered.info -a test_bitcoin_filtered.info -a zcash-gtest_filtered.info -o $@ | $(GREP) "\%" | $(AWK) '{ print substr($$3,2,50) "/" $$5 }' > coverage_percent.txt test_bitcoin.coverage/.dirstamp: test_bitcoin_coverage.info $(GENHTML) -s $< -o $(@D) @@ -261,12 +242,6 @@ cov: test_bitcoin.coverage/.dirstamp cov-zcash total.coverage/.dirstamp endif -if USE_COMPARISON_TOOL -check-local: - $(MKDIR_P) qa/tmp - @qa/pull-tester/run-bitcoind-for-test.sh $(JAVA) -jar $(JAVA_COMPARISON_TOOL) qa/tmp/compTool $(COMPARISON_TOOL_REORG_TESTS) 2>&1 -endif - dist_bin_SCRIPTS = zcutil/fetch-params.sh dist_noinst_SCRIPTS = autogen.sh zcutil/build-debian-package.sh zcutil/build.sh diff --git a/configure.ac b/configure.ac index f2f34c19d..a7274eec2 100644 --- a/configure.ac +++ b/configure.ac @@ -66,7 +66,6 @@ AC_PATH_TOOL(RANLIB, ranlib) AC_PATH_TOOL(STRIP, strip) AC_PATH_TOOL(GCOV, gcov) AC_PATH_PROG(LCOV, lcov) -AC_PATH_PROG(JAVA, java) AC_PATH_PROG(GENHTML, genhtml) AC_PATH_PROG([GIT], [git]) AC_PATH_PROG(CCACHE,ccache) @@ -105,16 +104,6 @@ AC_ARG_ENABLE(tests, [use_tests=$enableval], [use_tests=yes]) -AC_ARG_WITH([comparison-tool], - AS_HELP_STRING([--with-comparison-tool],[path to java comparison tool (requires --enable-tests)]), - [use_comparison_tool=$withval], - [use_comparison_tool=no]) - -AC_ARG_ENABLE([comparison-tool-reorg-tests], - AS_HELP_STRING([--enable-comparison-tool-reorg-tests],[enable expensive reorg tests in the comparison tool (default no)]), - [use_comparison_tool_reorg_tests=$enableval], - [use_comparison_tool_reorg_tests=no]) - AC_ARG_ENABLE([hardening], [AS_HELP_STRING([--enable-hardening], [attempt to harden the resulting executables (default is yes)])], @@ -352,22 +341,6 @@ if test x$use_pkgconfig = xyes; then ]) fi -if test x$use_comparison_tool != xno; then - if test x$JAVA = x; then - AC_MSG_ERROR("comparison tool set but java not found") - fi - AC_SUBST(JAVA_COMPARISON_TOOL, $use_comparison_tool) -fi - -if test x$use_comparison_tool_reorg_tests != xno; then - if test x$use_comparison_tool = x; then - AC_MSG_ERROR("comparison tool reorg tests but comparison tool was not specified") - fi - AC_SUBST(COMPARISON_TOOL_REORG_TESTS, 1) -else - AC_SUBST(COMPARISON_TOOL_REORG_TESTS, 0) -fi - if test x$use_lcov = xyes; then if test x$LCOV = x; then AC_MSG_ERROR("lcov testing requested but lcov not found") @@ -375,15 +348,9 @@ if test x$use_lcov = xyes; then if test x$GCOV = x; then AC_MSG_ERROR("lcov testing requested but gcov not found") fi - if test x$JAVA = x; then - AC_MSG_ERROR("lcov testing requested but java not found") - fi if test x$GENHTML = x; then AC_MSG_ERROR("lcov testing requested but genhtml not found") fi - if test x$use_comparison_tool = x; then - AC_MSG_ERROR("lcov testing requested but comparison tool was not specified") - fi LCOV="$LCOV --gcov-tool=$GCOV --rc lcov_branch_coverage=1" GENHTML="$GENHTML --branch-coverage" AX_CHECK_COMPILE_FLAG([--coverage],[CXXFLAGS="$CXXFLAGS --coverage"], @@ -832,8 +799,6 @@ AM_CONDITIONAL([ENABLE_MINING],[test x$enable_mining = xyes]) AM_CONDITIONAL([ENABLE_RUST],[test x$enable_rust = xyes]) AM_CONDITIONAL([ENABLE_TESTS],[test x$BUILD_TEST = xyes]) AM_CONDITIONAL([USE_LCOV],[test x$use_lcov = xyes]) -AM_CONDITIONAL([USE_COMPARISON_TOOL],[test x$use_comparison_tool != xno]) -AM_CONDITIONAL([USE_COMPARISON_TOOL_REORG_TESTS],[test x$use_comparison_tool_reorg_test != xno]) AM_CONDITIONAL([GLIBC_BACK_COMPAT],[test x$use_glibc_compat = xyes]) AM_CONDITIONAL([HARDEN],[test x$use_hardening = xyes]) diff --git a/depends/config.site.in b/depends/config.site.in index 103486332..8cdbcd2e4 100644 --- a/depends/config.site.in +++ b/depends/config.site.in @@ -7,10 +7,6 @@ ac_tool_prefix=${host_alias}- if test -z $with_boost; then with_boost=$depends_prefix fi -# Disable comparison utility (#592) -#if test -z $with_comparison_tool; then -# with_comparison_tool=$depends_prefix/native/share/BitcoindComparisonTool_jar/BitcoindComparisonTool.jar -#fi if test -z $enable_wallet && test -n "@no_wallet@"; then From 15472b7d84dbdd8916982bd88d6032e49c10f5f6 Mon Sep 17 00:00:00 2001 From: "Wladimir J. van der Laan" Date: Tue, 16 Aug 2016 11:16:21 +0200 Subject: [PATCH 0341/1062] build: Remove check for `openssl/ec.h` We don't use any elliptic curves from OpenSSL anymore, nor include this header anywhere but optionally in the tests of secp256k1 (which has its own autoconf setup). Reported by sinetek on IRC. --- configure.ac | 8 -------- 1 file changed, 8 deletions(-) diff --git a/configure.ac b/configure.ac index a7274eec2..840b8721e 100644 --- a/configure.ac +++ b/configure.ac @@ -691,14 +691,6 @@ fi LIBZCASH_LIBS="-lgmp -lgmpxx -lboost_system-mt -lcrypto -lsodium $RUST_LIBS" -CXXFLAGS_TEMP="$CXXFLAGS" -LIBS_TEMP="$LIBS" -CXXFLAGS="$CXXFLAGS $SSL_CFLAGS $CRYPTO_CFLAGS" -LIBS="$LIBS $SSL_LIBS $CRYPTO_LIBS $GMP_LIBS $GMPXX_LIBS" -AC_CHECK_HEADER([openssl/ec.h],, AC_MSG_ERROR(OpenSSL ec header missing),) -CXXFLAGS="$CXXFLAGS_TEMP" -LIBS="$LIBS_TEMP" - AC_MSG_CHECKING([whether to build bitcoind]) AM_CONDITIONAL([BUILD_BITCOIND], [test x$build_bitcoind = xyes]) AC_MSG_RESULT($build_bitcoind) From d812d95a8f9fa8e2670ea34d03a4f417fac14bca Mon Sep 17 00:00:00 2001 From: Anthony Towns Date: Tue, 23 Aug 2016 16:55:15 +1000 Subject: [PATCH 0342/1062] Add configure check for -latomic --- build-aux/m4/l_atomic.m4 | 40 ++++++++++++++++++++++++++++++++++++++++ configure.ac | 3 +++ 2 files changed, 43 insertions(+) create mode 100644 build-aux/m4/l_atomic.m4 diff --git a/build-aux/m4/l_atomic.m4 b/build-aux/m4/l_atomic.m4 new file mode 100644 index 000000000..906724b64 --- /dev/null +++ b/build-aux/m4/l_atomic.m4 @@ -0,0 +1,40 @@ +# Some versions of gcc/libstdc++ require linking with -latomic if +# using the C++ atomic library. +# +# Sourced from http://bugs.debian.org/797228 + +m4_define([_CHECK_ATOMIC_testbody], [[ + #include + #include + + int main() { + std::atomic a{}; + + int64_t v = 5; + int64_t r = a.fetch_add(v); + return static_cast(r); + } +]]) + +AC_DEFUN([CHECK_ATOMIC], [ + + AC_LANG_PUSH(C++) + + AC_MSG_CHECKING([whether std::atomic can be used without link library]) + + AC_LINK_IFELSE([AC_LANG_SOURCE([_CHECK_ATOMIC_testbody])],[ + AC_MSG_RESULT([yes]) + ],[ + AC_MSG_RESULT([no]) + LIBS="$LIBS -latomic" + AC_MSG_CHECKING([whether std::atomic needs -latomic]) + AC_LINK_IFELSE([AC_LANG_SOURCE([_CHECK_ATOMIC_testbody])],[ + AC_MSG_RESULT([yes]) + ],[ + AC_MSG_RESULT([no]) + AC_MSG_FAILURE([cannot figure our how to use std::atomic]) + ]) + ]) + + AC_LANG_POP +]) diff --git a/configure.ac b/configure.ac index 840b8721e..ad0731a80 100644 --- a/configure.ac +++ b/configure.ac @@ -57,6 +57,9 @@ case $host in esac dnl Require C++11 compiler (no GNU extensions) AX_CXX_COMPILE_STDCXX([11], [noext], [mandatory]) +dnl Check if -latomic is required for +CHECK_ATOMIC + dnl Libtool init checks. LT_INIT([pic-only]) From 41b28420d29d58079d24f989a41aa61218f31f38 Mon Sep 17 00:00:00 2001 From: "Wladimir J. van der Laan" Date: Thu, 23 Jun 2016 16:52:12 +0200 Subject: [PATCH 0343/1062] devtools: Check for high-entropy ASLR in 64-bit PE executables check_PE_PIE only checked for DYNAMIC_BASE, this is not enough for (secure) ASLR on 64-bit. --- contrib/devtools/security-check.py | 48 +++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/contrib/devtools/security-check.py b/contrib/devtools/security-check.py index 84e7fceea..bee8f3cc1 100755 --- a/contrib/devtools/security-check.py +++ b/contrib/devtools/security-check.py @@ -12,6 +12,7 @@ import os READELF_CMD = os.getenv('READELF', '/usr/bin/readelf') OBJDUMP_CMD = os.getenv('OBJDUMP', '/usr/bin/objdump') +NONFATAL = {'HIGH_ENTROPY_VA'} # checks which are non-fatal for now but only generate a warning def check_ELF_PIE(executable): ''' @@ -114,26 +115,50 @@ def check_ELF_Canary(executable): def get_PE_dll_characteristics(executable): ''' - Get PE DllCharacteristics bits + Get PE DllCharacteristics bits. + Returns a tuple (arch,bits) where arch is 'i386:x86-64' or 'i386' + and bits is the DllCharacteristics value. ''' p = subprocess.Popen([OBJDUMP_CMD, '-x', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) (stdout, stderr) = p.communicate() if p.returncode: raise IOError('Error opening file') + arch = '' + bits = 0 for line in stdout.split('\n'): tokens = line.split() + if len(tokens)>=2 and tokens[0] == 'architecture:': + arch = tokens[1].rstrip(',') if len(tokens)>=2 and tokens[0] == 'DllCharacteristics': - return int(tokens[1],16) - return 0 + bits = int(tokens[1],16) + return (arch,bits) +IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA = 0x0020 +IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE = 0x0040 +IMAGE_DLL_CHARACTERISTICS_NX_COMPAT = 0x0100 -def check_PE_PIE(executable): +def check_PE_DYNAMIC_BASE(executable): '''PIE: DllCharacteristics bit 0x40 signifies dynamicbase (ASLR)''' - return bool(get_PE_dll_characteristics(executable) & 0x40) + (arch,bits) = get_PE_dll_characteristics(executable) + reqbits = IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE + return (bits & reqbits) == reqbits + +# On 64 bit, must support high-entropy 64-bit address space layout randomization in addition to DYNAMIC_BASE +# to have secure ASLR. +def check_PE_HIGH_ENTROPY_VA(executable): + '''PIE: DllCharacteristics bit 0x20 signifies high-entropy ASLR''' + (arch,bits) = get_PE_dll_characteristics(executable) + if arch == 'i386:x86-64': + reqbits = IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA + else: # Unnecessary on 32-bit + assert(arch == 'i386') + reqbits = 0 + return (bits & reqbits) == reqbits def check_PE_NX(executable): '''NX: DllCharacteristics bit 0x100 signifies nxcompat (DEP)''' - return bool(get_PE_dll_characteristics(executable) & 0x100) + (arch,bits) = get_PE_dll_characteristics(executable) + return (bits & IMAGE_DLL_CHARACTERISTICS_NX_COMPAT) == IMAGE_DLL_CHARACTERISTICS_NX_COMPAT CHECKS = { 'ELF': [ @@ -143,7 +168,8 @@ CHECKS = { ('Canary', check_ELF_Canary) ], 'PE': [ - ('PIE', check_PE_PIE), + ('DYNAMIC_BASE', check_PE_DYNAMIC_BASE), + ('HIGH_ENTROPY_VA', check_PE_HIGH_ENTROPY_VA), ('NX', check_PE_NX) ] } @@ -168,12 +194,18 @@ if __name__ == '__main__': continue failed = [] + warning = [] for (name, func) in CHECKS[etype]: if not func(filename): - failed.append(name) + if name in NONFATAL: + warning.append(name) + else: + failed.append(name) if failed: print('%s: failed %s' % (filename, ' '.join(failed))) retval = 1 + if warning: + print('%s: warning %s' % (filename, ' '.join(warning))) except IOError: print('%s: cannot open' % filename) retval = 1 From 8a932154c56214e37b8e8b7ccf755b19316c2f84 Mon Sep 17 00:00:00 2001 From: "Wladimir J. van der Laan" Date: Thu, 23 Jun 2016 16:54:28 +0200 Subject: [PATCH 0344/1062] build: supply `-Wl,--high-entropy-va` This should enable high-entropy ASLR on 64-bit targets, for better mitigation of exploits. --- configure.ac | 1 + 1 file changed, 1 insertion(+) diff --git a/configure.ac b/configure.ac index ad0731a80..3f96fac12 100644 --- a/configure.ac +++ b/configure.ac @@ -443,6 +443,7 @@ if test x$use_hardening != xno; then # These are only available on Windows. AX_CHECK_LINK_FLAG([[-Wl,--dynamicbase]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--dynamicbase"],[AC_MSG_ERROR(Cannot enable --dynamicbase)]) AX_CHECK_LINK_FLAG([[-Wl,--nxcompat]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--nxcompat"],[AC_MSG_ERROR(Cannot enable --nxcompat)]) + AX_CHECK_LINK_FLAG([[-Wl,--high-entropy-va]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--high-entropy-va"],[AC_MSG_ERROR(Cannot enable ASLR)]) fi case $host in From 0bcd85bee8a4f9e24e9538695f2d3605dccfc2b9 Mon Sep 17 00:00:00 2001 From: Jonas Schnelli Date: Mon, 14 Nov 2016 10:55:56 +0100 Subject: [PATCH 0345/1062] Add compile and link options echo to configure --- configure.ac | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/configure.ac b/configure.ac index 3f96fac12..af471225c 100644 --- a/configure.ac +++ b/configure.ac @@ -876,3 +876,21 @@ case $host in chmod 755 libtool ;; esac + +echo +echo "Options used to compile and link:" +echo " with wallet = $enable_wallet" +echo " with zmq = $use_zmq" +echo " with test = $use_tests" +echo " debug enabled = $enable_debug" +echo +echo " target os = $TARGET_OS" +echo " build os = $BUILD_OS" +echo +echo " CC = $CC" +echo " CFLAGS = $CFLAGS" +echo " CPPFLAGS = $CPPFLAGS" +echo " CXX = $CXX" +echo " CXXFLAGS = $CXXFLAGS" +echo " LDFLAGS = $LDFLAGS" +echo From 943f19fec74a8ce3ee8f511397f6d8e0adb0a649 Mon Sep 17 00:00:00 2001 From: Cory Fields Date: Wed, 22 Feb 2017 13:33:22 -0500 Subject: [PATCH 0346/1062] build: force a c++ standard to be specified Newer compilers may switch to newer standards by default. For example, gcc6 uses std=gnu++14 by default. --- build-aux/m4/ax_cxx_compile_stdcxx.m4 | 8 +++++++- configure.ac | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/build-aux/m4/ax_cxx_compile_stdcxx.m4 b/build-aux/m4/ax_cxx_compile_stdcxx.m4 index 2c18e49c5..f147cee3b 100644 --- a/build-aux/m4/ax_cxx_compile_stdcxx.m4 +++ b/build-aux/m4/ax_cxx_compile_stdcxx.m4 @@ -57,8 +57,14 @@ AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl [$3], [mandatory], [ax_cxx_compile_cxx$1_required=true], [$3], [optional], [ax_cxx_compile_cxx$1_required=false], [m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])]) + m4_if([$4], [], [ax_cxx_compile_cxx$1_try_default=true], + [$4], [default], [ax_cxx_compile_cxx$1_try_default=true], + [$4], [nodefault], [ax_cxx_compile_cxx$1_try_default=false], + [m4_fatal([invalid fourth argument `$4' to AX_CXX_COMPILE_STDCXX])]) AC_LANG_PUSH([C++])dnl ac_success=no + + m4_if([$4], [nodefault], [], [dnl AC_CACHE_CHECK(whether $CXX supports C++$1 features by default, ax_cv_cxx_compile_cxx$1, [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], @@ -66,7 +72,7 @@ AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl [ax_cv_cxx_compile_cxx$1=no])]) if test x$ax_cv_cxx_compile_cxx$1 = xyes; then ac_success=yes - fi + fi]) m4_if([$2], [noext], [], [dnl if test x$ac_success = xno; then diff --git a/configure.ac b/configure.ac index af471225c..c4c139b6d 100644 --- a/configure.ac +++ b/configure.ac @@ -56,7 +56,7 @@ case $host in ;; esac dnl Require C++11 compiler (no GNU extensions) -AX_CXX_COMPILE_STDCXX([11], [noext], [mandatory]) +AX_CXX_COMPILE_STDCXX([11], [noext], [mandatory], [nodefault]) dnl Check if -latomic is required for CHECK_ATOMIC From d35ebc7b55cd512e9f4530d8e837e9083528a158 Mon Sep 17 00:00:00 2001 From: Cory Fields Date: Tue, 21 Feb 2017 11:56:07 -0500 Subject: [PATCH 0347/1062] build: warn about variable length arrays --- configure.ac | 1 + 1 file changed, 1 insertion(+) diff --git a/configure.ac b/configure.ac index c4c139b6d..cd7ee65f3 100644 --- a/configure.ac +++ b/configure.ac @@ -176,6 +176,7 @@ if test "x$CXXFLAGS_overridden" = "xno"; then AX_CHECK_COMPILE_FLAG([-Wall],[CXXFLAGS="$CXXFLAGS -Wall"],,[[$CXXFLAG_WERROR]]) AX_CHECK_COMPILE_FLAG([-Wextra],[CXXFLAGS="$CXXFLAGS -Wextra"],,[[$CXXFLAG_WERROR]]) AX_CHECK_COMPILE_FLAG([-Wformat],[CXXFLAGS="$CXXFLAGS -Wformat"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wvla],[CXXFLAGS="$CXXFLAGS -Wvla"],,[[$CXXFLAG_WERROR]]) AX_CHECK_COMPILE_FLAG([-Wformat-security],[CXXFLAGS="$CXXFLAGS -Wformat-security"],,[[$CXXFLAG_WERROR]]) ## Some compilers (gcc) ignore unknown -Wno-* options, but warn about all From 5dd887fdf7632272ea3808f234af3b8cbdfb603f Mon Sep 17 00:00:00 2001 From: Cory Fields Date: Tue, 21 Feb 2017 11:56:26 -0500 Subject: [PATCH 0348/1062] build: add --enable-werror option This turns some compiler warnings into errors. Useful for c-i. --- configure.ac | 17 +++++++++++++++++ src/Makefile.am | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index cd7ee65f3..eb102fec8 100644 --- a/configure.ac +++ b/configure.ac @@ -158,6 +158,13 @@ AC_ARG_ENABLE([debug], [enable_debug=$enableval], [enable_debug=no]) +# Turn warnings into errors +AC_ARG_ENABLE([werror], + [AS_HELP_STRING([--enable-werror], + [Treat certain compiler warnings as errors (default is no)])], + [enable_werror=$enableval], + [enable_werror=no]) + AC_LANG_PUSH([C++]) AX_CHECK_COMPILE_FLAG([-Werror],[CXXFLAG_WERROR="-Werror"],[CXXFLAG_WERROR=""]) @@ -172,6 +179,14 @@ if test "x$enable_debug" = xyes; then fi fi +ERROR_CXXFLAGS= +if test "x$enable_werror" = "xyes"; then + if test "x$CXXFLAG_WERROR" = "x"; then + AC_MSG_ERROR("enable-werror set but -Werror is not usable") + fi + AX_CHECK_COMPILE_FLAG([-Werror=vla],[ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror=vla"],,[[$CXXFLAG_WERROR]]) +fi + if test "x$CXXFLAGS_overridden" = "xno"; then AX_CHECK_COMPILE_FLAG([-Wall],[CXXFLAGS="$CXXFLAGS -Wall"],,[[$CXXFLAG_WERROR]]) AX_CHECK_COMPILE_FLAG([-Wextra],[CXXFLAGS="$CXXFLAGS -Wextra"],,[[$CXXFLAG_WERROR]]) @@ -816,6 +831,7 @@ AC_SUBST(BITCOIN_CLI_NAME) AC_SUBST(BITCOIN_TX_NAME) AC_SUBST(RELDFLAGS) +AC_SUBST(ERROR_CXXFLAGS) AC_SUBST(HARDENED_CXXFLAGS) AC_SUBST(HARDENED_CPPFLAGS) AC_SUBST(HARDENED_LDFLAGS) @@ -884,6 +900,7 @@ echo " with wallet = $enable_wallet" echo " with zmq = $use_zmq" echo " with test = $use_tests" echo " debug enabled = $enable_debug" +echo " werror = $enable_werror" echo echo " target os = $TARGET_OS" echo " build os = $BUILD_OS" diff --git a/src/Makefile.am b/src/Makefile.am index 36f353802..4d76176f3 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,7 +1,7 @@ DIST_SUBDIRS = secp256k1 univalue AM_LDFLAGS = $(PTHREAD_CFLAGS) $(LIBTOOL_LDFLAGS) $(HARDENED_LDFLAGS) -AM_CXXFLAGS = $(HARDENED_CXXFLAGS) +AM_CXXFLAGS = $(HARDENED_CXXFLAGS) $(ERROR_CXXFLAGS) AM_CPPFLAGS = $(HARDENED_CPPFLAGS) if EMBEDDED_LEVELDB From bc9fff113080f5913c63d6eecb3c66a6c7307159 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Nyffenegger?= Date: Fri, 7 Jul 2017 16:54:11 +0200 Subject: [PATCH 0349/1062] Use AC_ARG_VAR to set ARFLAGS. The user can set ARFLAGS in the ./configure step with ./configure ARFLAGS=... If he chooses not to do so, ARFLAGS will be set to cr. --- configure.ac | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/configure.ac b/configure.ac index eb102fec8..3497befbd 100644 --- a/configure.ac +++ b/configure.ac @@ -18,6 +18,12 @@ BITCOIN_DAEMON_NAME=zcashd BITCOIN_CLI_NAME=zcash-cli BITCOIN_TX_NAME=zcash-tx +dnl Unless the user specified ARFLAGS, force it to be cr +AC_ARG_VAR(ARFLAGS, [Flags for the archiver, defaults to if not set]) +if test "x${ARFLAGS+set}" != "xset"; then + ARFLAGS="cr" +fi + AC_CANONICAL_HOST AH_TOP([#ifndef BITCOIN_CONFIG_H]) @@ -911,4 +917,5 @@ echo " CPPFLAGS = $CPPFLAGS" echo " CXX = $CXX" echo " CXXFLAGS = $CXXFLAGS" echo " LDFLAGS = $LDFLAGS" +echo " ARFLAGS = $ARFLAGS" echo From c1fcdd01dde4495d3181ac963ea589e902f39137 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 30 Nov 2017 22:51:15 +0000 Subject: [PATCH 0350/1062] Change --enable-werror to apply to all warnings, use it in build.sh --- configure.ac | 4 ++-- zcutil/build.sh | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index 3497befbd..3b525f94e 100644 --- a/configure.ac +++ b/configure.ac @@ -167,7 +167,7 @@ AC_ARG_ENABLE([debug], # Turn warnings into errors AC_ARG_ENABLE([werror], [AS_HELP_STRING([--enable-werror], - [Treat certain compiler warnings as errors (default is no)])], + [Treat all compiler warnings as errors (default is no)])], [enable_werror=$enableval], [enable_werror=no]) @@ -190,7 +190,7 @@ if test "x$enable_werror" = "xyes"; then if test "x$CXXFLAG_WERROR" = "x"; then AC_MSG_ERROR("enable-werror set but -Werror is not usable") fi - AX_CHECK_COMPILE_FLAG([-Werror=vla],[ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror=vla"],,[[$CXXFLAG_WERROR]]) + ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror" fi if test "x$CXXFLAGS_overridden" = "xno"; then diff --git a/zcutil/build.sh b/zcutil/build.sh index f665088ac..119802d71 100755 --- a/zcutil/build.sh +++ b/zcutil/build.sh @@ -132,5 +132,5 @@ ld -v HOST="$HOST" BUILD="$BUILD" NO_RUST="$RUST_ARG" NO_PROTON="$PROTON_ARG" "$MAKE" "$@" -C ./depends/ V=1 ./autogen.sh -CC="$CC" CXX="$CXX" ./configure --prefix="${PREFIX}" --host="$HOST" --build="$BUILD" "$RUST_ARG" "$HARDENING_ARG" "$LCOV_ARG" "$TEST_ARG" "$MINING_ARG" "$PROTON_ARG" "$LIBS_ARG" CXXFLAGS='-fwrapv -fno-strict-aliasing -Wno-builtin-declaration-mismatch -Werror -g' +CC="$CC" CXX="$CXX" ./configure --prefix="${PREFIX}" --host="$HOST" --build="$BUILD" "$RUST_ARG" "$HARDENING_ARG" "$LCOV_ARG" "$TEST_ARG" "$MINING_ARG" "$PROTON_ARG" "$LIBS_ARG" --enable-werror CXXFLAGS='-fwrapv -fno-strict-aliasing -Wno-builtin-declaration-mismatch -g' "$MAKE" "$@" V=1 From 704337b2b8fef44a14928c907065a4d5319d8669 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 30 Nov 2017 23:00:43 +0000 Subject: [PATCH 0351/1062] Move Zcash flags into configure.ac --- configure.ac | 5 +++++ zcutil/build.sh | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 3b525f94e..27c000c2c 100644 --- a/configure.ac +++ b/configure.ac @@ -715,6 +715,11 @@ else LIBSNARK_DEPINST="$prefix" fi +# Additional Zcash flags +AX_CHECK_COMPILE_FLAG([-fwrapv],[CXXFLAGS="$CXXFLAGS -fwrapv"]) +AX_CHECK_COMPILE_FLAG([-fno-strict-aliasing],[CXXFLAGS="$CXXFLAGS -fno-strict-aliasing"]) +AX_CHECK_COMPILE_FLAG([-Wno-builtin-declaration-mismatch],[CXXFLAGS="$CXXFLAGS -Wno-builtin-declaration-mismatch"],,[[$CXXFLAG_WERROR]]) + LIBZCASH_LIBS="-lgmp -lgmpxx -lboost_system-mt -lcrypto -lsodium $RUST_LIBS" AC_MSG_CHECKING([whether to build bitcoind]) diff --git a/zcutil/build.sh b/zcutil/build.sh index 119802d71..17f023991 100755 --- a/zcutil/build.sh +++ b/zcutil/build.sh @@ -132,5 +132,5 @@ ld -v HOST="$HOST" BUILD="$BUILD" NO_RUST="$RUST_ARG" NO_PROTON="$PROTON_ARG" "$MAKE" "$@" -C ./depends/ V=1 ./autogen.sh -CC="$CC" CXX="$CXX" ./configure --prefix="${PREFIX}" --host="$HOST" --build="$BUILD" "$RUST_ARG" "$HARDENING_ARG" "$LCOV_ARG" "$TEST_ARG" "$MINING_ARG" "$PROTON_ARG" "$LIBS_ARG" --enable-werror CXXFLAGS='-fwrapv -fno-strict-aliasing -Wno-builtin-declaration-mismatch -g' +CC="$CC" CXX="$CXX" ./configure --prefix="${PREFIX}" --host="$HOST" --build="$BUILD" "$RUST_ARG" "$HARDENING_ARG" "$LCOV_ARG" "$TEST_ARG" "$MINING_ARG" "$PROTON_ARG" "$LIBS_ARG" --enable-werror CXXFLAGS='-g' "$MAKE" "$@" V=1 From 642a1caf93af62fd6b3e8271f547f1cc3fd42a74 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 23 Feb 2017 18:27:41 +0000 Subject: [PATCH 0352/1062] ViewingKey -> ReceivingKey per zcash/zips#117 --- src/gtest/test_joinsplit.cpp | 2 +- src/gtest/test_keystore.cpp | 12 ++++++------ src/keystore.cpp | 2 +- src/utiltest.cpp | 2 +- src/wallet/asyncrpcoperation_sendmany.cpp | 2 +- src/wallet/crypter.cpp | 8 ++++---- src/wallet/crypter.h | 2 +- src/wallet/gtest/test_wallet.cpp | 2 +- src/wallet/rpcwallet.cpp | 12 ++++++------ src/wallet/wallet.cpp | 12 ++++++------ src/wallet/wallet.h | 4 ++-- src/wallet/walletdb.cpp | 12 ++++++------ src/wallet/walletdb.h | 2 +- src/zcash/Address.cpp | 8 ++++---- src/zcash/Address.hpp | 6 +++--- 15 files changed, 44 insertions(+), 44 deletions(-) diff --git a/src/gtest/test_joinsplit.cpp b/src/gtest/test_joinsplit.cpp index 986592e89..979d0d518 100644 --- a/src/gtest/test_joinsplit.cpp +++ b/src/gtest/test_joinsplit.cpp @@ -89,7 +89,7 @@ void test_full_api(ZCJoinSplit* js) // Recipient should decrypt // Now the recipient should spend the money again auto h_sig = js->h_sig(randomSeed, nullifiers, pubKeyHash); - ZCNoteDecryption decryptor(recipient_key.viewing_key()); + ZCNoteDecryption decryptor(recipient_key.receiving_key()); auto note_pt = NotePlaintext::decrypt( decryptor, diff --git a/src/gtest/test_keystore.cpp b/src/gtest/test_keystore.cpp index e94aea53e..23cc45aae 100644 --- a/src/gtest/test_keystore.cpp +++ b/src/gtest/test_keystore.cpp @@ -43,7 +43,7 @@ TEST(keystore_tests, store_and_retrieve_note_decryptor) { keyStore.AddSpendingKey(sk); EXPECT_TRUE(keyStore.GetNoteDecryptor(addr, decOut)); - EXPECT_EQ(ZCNoteDecryption(sk.viewing_key()), decOut); + EXPECT_EQ(ZCNoteDecryption(sk.receiving_key()), decOut); } #ifdef ENABLE_WALLET @@ -72,13 +72,13 @@ TEST(keystore_tests, store_and_retrieve_spending_key_in_encrypted_store) { ASSERT_TRUE(keyStore.GetSpendingKey(addr, keyOut)); ASSERT_EQ(sk, keyOut); EXPECT_TRUE(keyStore.GetNoteDecryptor(addr, decOut)); - EXPECT_EQ(ZCNoteDecryption(sk.viewing_key()), decOut); + EXPECT_EQ(ZCNoteDecryption(sk.receiving_key()), decOut); ASSERT_TRUE(keyStore.EncryptKeys(vMasterKey)); ASSERT_TRUE(keyStore.HaveSpendingKey(addr)); ASSERT_FALSE(keyStore.GetSpendingKey(addr, keyOut)); EXPECT_TRUE(keyStore.GetNoteDecryptor(addr, decOut)); - EXPECT_EQ(ZCNoteDecryption(sk.viewing_key()), decOut); + EXPECT_EQ(ZCNoteDecryption(sk.receiving_key()), decOut); // Unlocking with a random key should fail uint256 r2 {GetRandHash()}; @@ -109,19 +109,19 @@ TEST(keystore_tests, store_and_retrieve_spending_key_in_encrypted_store) { ASSERT_TRUE(keyStore.GetSpendingKey(addr2, keyOut)); ASSERT_EQ(sk2, keyOut); EXPECT_TRUE(keyStore.GetNoteDecryptor(addr2, decOut)); - EXPECT_EQ(ZCNoteDecryption(sk2.viewing_key()), decOut); + EXPECT_EQ(ZCNoteDecryption(sk2.receiving_key()), decOut); ASSERT_TRUE(keyStore.Lock()); ASSERT_TRUE(keyStore.HaveSpendingKey(addr2)); ASSERT_FALSE(keyStore.GetSpendingKey(addr2, keyOut)); EXPECT_TRUE(keyStore.GetNoteDecryptor(addr2, decOut)); - EXPECT_EQ(ZCNoteDecryption(sk2.viewing_key()), decOut); + EXPECT_EQ(ZCNoteDecryption(sk2.receiving_key()), decOut); ASSERT_TRUE(keyStore.Unlock(vMasterKey)); ASSERT_TRUE(keyStore.GetSpendingKey(addr2, keyOut)); ASSERT_EQ(sk2, keyOut); EXPECT_TRUE(keyStore.GetNoteDecryptor(addr2, decOut)); - EXPECT_EQ(ZCNoteDecryption(sk2.viewing_key()), decOut); + EXPECT_EQ(ZCNoteDecryption(sk2.receiving_key()), decOut); keyStore.GetPaymentAddresses(addrs); ASSERT_EQ(2, addrs.size()); diff --git a/src/keystore.cpp b/src/keystore.cpp index f32ba0c32..3c32ab583 100644 --- a/src/keystore.cpp +++ b/src/keystore.cpp @@ -89,6 +89,6 @@ bool CBasicKeyStore::AddSpendingKey(const libzcash::SpendingKey &sk) LOCK(cs_SpendingKeyStore); auto address = sk.address(); mapSpendingKeys[address] = sk; - mapNoteDecryptors.insert(std::make_pair(address, ZCNoteDecryption(sk.viewing_key()))); + mapNoteDecryptors.insert(std::make_pair(address, ZCNoteDecryption(sk.receiving_key()))); return true; } diff --git a/src/utiltest.cpp b/src/utiltest.cpp index 5cebc1a5d..e91a796e3 100644 --- a/src/utiltest.cpp +++ b/src/utiltest.cpp @@ -63,7 +63,7 @@ CWalletTx GetValidReceive(ZCJoinSplit& params, libzcash::Note GetNote(ZCJoinSplit& params, const libzcash::SpendingKey& sk, const CTransaction& tx, size_t js, size_t n) { - ZCNoteDecryption decryptor {sk.viewing_key()}; + ZCNoteDecryption decryptor {sk.receiving_key()}; auto hSig = tx.vjoinsplit[js].h_sig(params, tx.joinSplitPubKey); auto note_pt = libzcash::NotePlaintext::decrypt( decryptor, diff --git a/src/wallet/asyncrpcoperation_sendmany.cpp b/src/wallet/asyncrpcoperation_sendmany.cpp index 539d5d7d6..59cd3a8fb 100644 --- a/src/wallet/asyncrpcoperation_sendmany.cpp +++ b/src/wallet/asyncrpcoperation_sendmany.cpp @@ -555,7 +555,7 @@ bool AsyncRPCOperation_sendmany::main_impl() { intermediates.insert(std::make_pair(tree.root(), tree)); // chained js are interstitial (found in between block boundaries) // Decrypt the change note's ciphertext to retrieve some data we need - ZCNoteDecryption decryptor(spendingkey_.viewing_key()); + ZCNoteDecryption decryptor(spendingkey_.receiving_key()); auto hSig = prevJoinSplit.h_sig(*pzcashParams, tx_.joinSplitPubKey); try { NotePlaintext plaintext = NotePlaintext::decrypt( diff --git a/src/wallet/crypter.cpp b/src/wallet/crypter.cpp index 69fe55ebd..69a2649b1 100644 --- a/src/wallet/crypter.cpp +++ b/src/wallet/crypter.cpp @@ -316,14 +316,14 @@ bool CCryptoKeyStore::AddSpendingKey(const libzcash::SpendingKey &sk) if (!EncryptSecret(vMasterKey, vchSecret, address.GetHash(), vchCryptedSecret)) return false; - if (!AddCryptedSpendingKey(address, sk.viewing_key(), vchCryptedSecret)) + if (!AddCryptedSpendingKey(address, sk.receiving_key(), vchCryptedSecret)) return false; } return true; } bool CCryptoKeyStore::AddCryptedSpendingKey(const libzcash::PaymentAddress &address, - const libzcash::ViewingKey &vk, + const libzcash::ReceivingKey &rk, const std::vector &vchCryptedSecret) { { @@ -332,7 +332,7 @@ bool CCryptoKeyStore::AddCryptedSpendingKey(const libzcash::PaymentAddress &addr return false; mapCryptedSpendingKeys[address] = vchCryptedSecret; - mapNoteDecryptors.insert(std::make_pair(address, ZCNoteDecryption(vk))); + mapNoteDecryptors.insert(std::make_pair(address, ZCNoteDecryption(rk))); } return true; } @@ -384,7 +384,7 @@ bool CCryptoKeyStore::EncryptKeys(CKeyingMaterial& vMasterKeyIn) std::vector vchCryptedSecret; if (!EncryptSecret(vMasterKeyIn, vchSecret, address.GetHash(), vchCryptedSecret)) return false; - if (!AddCryptedSpendingKey(address, sk.viewing_key(), vchCryptedSecret)) + if (!AddCryptedSpendingKey(address, sk.receiving_key(), vchCryptedSecret)) return false; } mapSpendingKeys.clear(); diff --git a/src/wallet/crypter.h b/src/wallet/crypter.h index d09cfa846..bcee188cf 100644 --- a/src/wallet/crypter.h +++ b/src/wallet/crypter.h @@ -201,7 +201,7 @@ public: } } virtual bool AddCryptedSpendingKey(const libzcash::PaymentAddress &address, - const libzcash::ViewingKey &vk, + const libzcash::ReceivingKey &rk, const std::vector &vchCryptedSecret); bool AddSpendingKey(const libzcash::SpendingKey &sk); bool HaveSpendingKey(const libzcash::PaymentAddress &address) const diff --git a/src/wallet/gtest/test_wallet.cpp b/src/wallet/gtest/test_wallet.cpp index 9bcc5f533..b39275f67 100644 --- a/src/wallet/gtest/test_wallet.cpp +++ b/src/wallet/gtest/test_wallet.cpp @@ -328,7 +328,7 @@ TEST(wallet_tests, GetNoteNullifier) { auto sk = libzcash::SpendingKey::random(); auto address = sk.address(); - auto dec = ZCNoteDecryption(sk.viewing_key()); + auto dec = ZCNoteDecryption(sk.receiving_key()); auto wtx = GetValidReceive(sk, 10, true); auto note = GetNote(sk, wtx, 0, 1); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 034147f42..d2c558c96 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -2667,7 +2667,7 @@ UniValue zc_raw_receive(const UniValue& params, bool fHelp) } } - ZCNoteDecryption decryptor(k.viewing_key()); + ZCNoteDecryption decryptor(k.receiving_key()); NotePlaintext npt = NotePlaintext::decrypt( decryptor, @@ -2908,20 +2908,20 @@ UniValue zc_raw_keygen(const UniValue& params, bool fHelp) auto k = SpendingKey::random(); auto addr = k.address(); - auto viewing_key = k.viewing_key(); + auto receiving_key = k.receiving_key(); - CDataStream viewing(SER_NETWORK, PROTOCOL_VERSION); + CDataStream receiving(SER_NETWORK, PROTOCOL_VERSION); - viewing << viewing_key; + receiving << receiving_key; CZCPaymentAddress pubaddr(addr); CZCSpendingKey spendingkey(k); - std::string viewing_hex = HexStr(viewing.begin(), viewing.end()); + std::string receiving_hex = HexStr(receiving.begin(), receiving.end()); UniValue result(UniValue::VOBJ); result.push_back(Pair("zcaddress", pubaddr.ToString())); result.push_back(Pair("zcsecretkey", spendingkey.ToString())); - result.push_back(Pair("zcviewingkey", viewing_hex)); + result.push_back(Pair("zcviewingkey", receiving_hex)); return result; } diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index a61c1e2f7..677fec319 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -190,10 +190,10 @@ bool CWallet::AddCryptedKey(const CPubKey &vchPubKey, bool CWallet::AddCryptedSpendingKey(const libzcash::PaymentAddress &address, - const libzcash::ViewingKey &vk, + const libzcash::ReceivingKey &rk, const std::vector &vchCryptedSecret) { - if (!CCryptoKeyStore::AddCryptedSpendingKey(address, vk, vchCryptedSecret)) + if (!CCryptoKeyStore::AddCryptedSpendingKey(address, rk, vchCryptedSecret)) return false; if (!fFileBacked) return true; @@ -201,12 +201,12 @@ bool CWallet::AddCryptedSpendingKey(const libzcash::PaymentAddress &address, LOCK(cs_wallet); if (pwalletdbEncryption) { return pwalletdbEncryption->WriteCryptedZKey(address, - vk, + rk, vchCryptedSecret, mapZKeyMetadata[address]); } else { return CWalletDB(strWalletFile).WriteCryptedZKey(address, - vk, + rk, vchCryptedSecret, mapZKeyMetadata[address]); } @@ -236,9 +236,9 @@ bool CWallet::LoadCryptedKey(const CPubKey &vchPubKey, const std::vector &vchCryptedSecret) +bool CWallet::LoadCryptedZKey(const libzcash::PaymentAddress &addr, const libzcash::ReceivingKey &rk, const std::vector &vchCryptedSecret) { - return CCryptoKeyStore::AddCryptedSpendingKey(addr, vk, vchCryptedSecret); + return CCryptoKeyStore::AddCryptedSpendingKey(addr, rk, vchCryptedSecret); } bool CWallet::LoadZKey(const libzcash::SpendingKey &key) diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index 2b481d87a..57a71a431 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -950,9 +950,9 @@ public: //! Load spending key metadata (used by LoadWallet) bool LoadZKeyMetadata(const libzcash::PaymentAddress &addr, const CKeyMetadata &meta); //! Adds an encrypted spending key to the store, without saving it to disk (used by LoadWallet) - bool LoadCryptedZKey(const libzcash::PaymentAddress &addr, const libzcash::ViewingKey &vk, const std::vector &vchCryptedSecret); + bool LoadCryptedZKey(const libzcash::PaymentAddress &addr, const libzcash::ReceivingKey &rk, const std::vector &vchCryptedSecret); //! Adds an encrypted spending key to the store, and saves it to disk (virtual method, declared in crypter.h) - bool AddCryptedSpendingKey(const libzcash::PaymentAddress &address, const libzcash::ViewingKey &vk, const std::vector &vchCryptedSecret); + bool AddCryptedSpendingKey(const libzcash::PaymentAddress &address, const libzcash::ReceivingKey &rk, const std::vector &vchCryptedSecret); /** * Increment the next transaction order id diff --git a/src/wallet/walletdb.cpp b/src/wallet/walletdb.cpp index f25224336..c79a15e30 100644 --- a/src/wallet/walletdb.cpp +++ b/src/wallet/walletdb.cpp @@ -106,7 +106,7 @@ bool CWalletDB::WriteCryptedKey(const CPubKey& vchPubKey, } bool CWalletDB::WriteCryptedZKey(const libzcash::PaymentAddress & addr, - const libzcash::ViewingKey &vk, + const libzcash::ReceivingKey &rk, const std::vector& vchCryptedSecret, const CKeyMetadata &keyMeta) { @@ -116,7 +116,7 @@ bool CWalletDB::WriteCryptedZKey(const libzcash::PaymentAddress & addr, if (!Write(std::make_pair(std::string("zkeymeta"), addr), keyMeta)) return false; - if (!Write(std::make_pair(std::string("czkey"), addr), std::make_pair(vk, vchCryptedSecret), false)) + if (!Write(std::make_pair(std::string("czkey"), addr), std::make_pair(rk, vchCryptedSecret), false)) return false; if (fEraseUnencryptedKey) { @@ -585,14 +585,14 @@ ReadKeyValue(CWallet* pwallet, CDataStream& ssKey, CDataStream& ssValue, libzcash::PaymentAddress addr; ssKey >> addr; // Deserialization of a pair is just one item after another - uint256 vkValue; - ssValue >> vkValue; - libzcash::ViewingKey vk(vkValue); + uint256 rkValue; + ssValue >> rkValue; + libzcash::ReceivingKey rk(rkValue); vector vchCryptedSecret; ssValue >> vchCryptedSecret; wss.nCKeys++; - if (!pwallet->LoadCryptedZKey(addr, vk, vchCryptedSecret)) + if (!pwallet->LoadCryptedZKey(addr, rk, vchCryptedSecret)) { strErr = "Error reading wallet database: LoadCryptedZKey failed"; return false; diff --git a/src/wallet/walletdb.h b/src/wallet/walletdb.h index f9f71e00c..b901f539c 100644 --- a/src/wallet/walletdb.h +++ b/src/wallet/walletdb.h @@ -136,7 +136,7 @@ public: /// Write spending key to wallet database, where key is payment address and value is spending key. bool WriteZKey(const libzcash::PaymentAddress& addr, const libzcash::SpendingKey& key, const CKeyMetadata &keyMeta); bool WriteCryptedZKey(const libzcash::PaymentAddress & addr, - const libzcash::ViewingKey & vk, + const libzcash::ReceivingKey & rk, const std::vector& vchCryptedSecret, const CKeyMetadata &keyMeta); diff --git a/src/zcash/Address.cpp b/src/zcash/Address.cpp index 3849b2ffc..75324de4f 100644 --- a/src/zcash/Address.cpp +++ b/src/zcash/Address.cpp @@ -12,12 +12,12 @@ uint256 PaymentAddress::GetHash() const { return Hash(ss.begin(), ss.end()); } -uint256 ViewingKey::pk_enc() { +uint256 ReceivingKey::pk_enc() { return ZCNoteEncryption::generate_pubkey(*this); } -ViewingKey SpendingKey::viewing_key() const { - return ViewingKey(ZCNoteEncryption::generate_privkey(*this)); +ReceivingKey SpendingKey::receiving_key() const { + return ReceivingKey(ZCNoteEncryption::generate_privkey(*this)); } SpendingKey SpendingKey::random() { @@ -25,7 +25,7 @@ SpendingKey SpendingKey::random() { } PaymentAddress SpendingKey::address() const { - return PaymentAddress(PRF_addr_a_pk(*this), viewing_key().pk_enc()); + return PaymentAddress(PRF_addr_a_pk(*this), receiving_key().pk_enc()); } } diff --git a/src/zcash/Address.hpp b/src/zcash/Address.hpp index 9bf22663d..e76973cb6 100644 --- a/src/zcash/Address.hpp +++ b/src/zcash/Address.hpp @@ -38,9 +38,9 @@ public: } }; -class ViewingKey : public uint256 { +class ReceivingKey : public uint256 { public: - ViewingKey(uint256 sk_enc) : uint256(sk_enc) { } + ReceivingKey(uint256 sk_enc) : uint256(sk_enc) { } uint256 pk_enc(); }; @@ -52,7 +52,7 @@ public: static SpendingKey random(); - ViewingKey viewing_key() const; + ReceivingKey receiving_key() const; PaymentAddress address() const; }; From aa666c967341336c1bfb233135c7c9858863168c Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 24 Feb 2017 03:01:00 +0000 Subject: [PATCH 0353/1062] Implement viewing key storage in the keystore --- src/gtest/test_keystore.cpp | 44 +++++++++++++++++++++++++++++++++++++ src/keystore.cpp | 34 ++++++++++++++++++++++++++++ src/keystore.h | 13 +++++++++++ src/zcash/Address.cpp | 12 ++++++++-- src/zcash/Address.hpp | 31 +++++++++++++++++++++++++- 5 files changed, 131 insertions(+), 3 deletions(-) diff --git a/src/gtest/test_keystore.cpp b/src/gtest/test_keystore.cpp index 23cc45aae..903a48839 100644 --- a/src/gtest/test_keystore.cpp +++ b/src/gtest/test_keystore.cpp @@ -46,6 +46,50 @@ TEST(keystore_tests, store_and_retrieve_note_decryptor) { EXPECT_EQ(ZCNoteDecryption(sk.receiving_key()), decOut); } +TEST(keystore_tests, StoreAndRetrieveViewingKey) { + CBasicKeyStore keyStore; + libzcash::ViewingKey vkOut; + libzcash::SpendingKey skOut; + ZCNoteDecryption decOut; + + auto sk = libzcash::SpendingKey::random(); + auto vk = sk.viewing_key(); + auto addr = sk.address(); + + // Sanity-check: we can't get a viewing key we haven't added + EXPECT_FALSE(keyStore.HaveViewingKey(addr)); + EXPECT_FALSE(keyStore.GetViewingKey(addr, vkOut)); + + // and we shouldn't have a spending key or decryptor either + EXPECT_FALSE(keyStore.HaveSpendingKey(addr)); + EXPECT_FALSE(keyStore.GetSpendingKey(addr, skOut)); + EXPECT_FALSE(keyStore.GetNoteDecryptor(addr, decOut)); + + keyStore.AddViewingKey(vk); + EXPECT_TRUE(keyStore.HaveViewingKey(addr)); + EXPECT_TRUE(keyStore.GetViewingKey(addr, vkOut)); + EXPECT_EQ(vk, vkOut); + + // We should still not have the spending key... + EXPECT_FALSE(keyStore.HaveSpendingKey(addr)); + EXPECT_FALSE(keyStore.GetSpendingKey(addr, skOut)); + + // ... but we should have a decryptor + EXPECT_TRUE(keyStore.GetNoteDecryptor(addr, decOut)); + EXPECT_EQ(ZCNoteDecryption(sk.receiving_key()), decOut); + + keyStore.RemoveViewingKey(vk); + EXPECT_FALSE(keyStore.HaveViewingKey(addr)); + EXPECT_FALSE(keyStore.GetViewingKey(addr, vkOut)); + EXPECT_FALSE(keyStore.HaveSpendingKey(addr)); + EXPECT_FALSE(keyStore.GetSpendingKey(addr, skOut)); + + // We still have a decryptor because those are cached in memory + // (and also we only remove viewing keys when adding a spending key) + EXPECT_TRUE(keyStore.GetNoteDecryptor(addr, decOut)); + EXPECT_EQ(ZCNoteDecryption(sk.receiving_key()), decOut); +} + #ifdef ENABLE_WALLET class TestCCryptoKeyStore : public CCryptoKeyStore { diff --git a/src/keystore.cpp b/src/keystore.cpp index 3c32ab583..323fe710c 100644 --- a/src/keystore.cpp +++ b/src/keystore.cpp @@ -92,3 +92,37 @@ bool CBasicKeyStore::AddSpendingKey(const libzcash::SpendingKey &sk) mapNoteDecryptors.insert(std::make_pair(address, ZCNoteDecryption(sk.receiving_key()))); return true; } + +bool CBasicKeyStore::AddViewingKey(const libzcash::ViewingKey &vk) +{ + LOCK(cs_SpendingKeyStore); + auto address = vk.address(); + mapViewingKeys[address] = vk; + mapNoteDecryptors.insert(std::make_pair(address, ZCNoteDecryption(vk.sk_enc))); + return true; +} + +bool CBasicKeyStore::RemoveViewingKey(const libzcash::ViewingKey &vk) +{ + LOCK(cs_SpendingKeyStore); + mapViewingKeys.erase(vk.address()); + return true; +} + +bool CBasicKeyStore::HaveViewingKey(const libzcash::PaymentAddress &address) const +{ + LOCK(cs_SpendingKeyStore); + return mapViewingKeys.count(address) > 0; +} + +bool CBasicKeyStore::GetViewingKey(const libzcash::PaymentAddress &address, + libzcash::ViewingKey &vkOut) const +{ + LOCK(cs_SpendingKeyStore); + ViewingKeyMap::const_iterator mi = mapViewingKeys.find(address); + if (mi != mapViewingKeys.end()) { + vkOut = mi->second; + return true; + } + return false; +} diff --git a/src/keystore.h b/src/keystore.h index 84595cfb0..0b548920b 100644 --- a/src/keystore.h +++ b/src/keystore.h @@ -55,12 +55,19 @@ public: virtual bool HaveSpendingKey(const libzcash::PaymentAddress &address) const =0; virtual bool GetSpendingKey(const libzcash::PaymentAddress &address, libzcash::SpendingKey& skOut) const =0; virtual void GetPaymentAddresses(std::set &setAddress) const =0; + + //! Support for viewing keys + virtual bool AddViewingKey(const libzcash::ViewingKey &vk) =0; + virtual bool RemoveViewingKey(const libzcash::ViewingKey &vk) =0; + virtual bool HaveViewingKey(const libzcash::PaymentAddress &address) const =0; + virtual bool GetViewingKey(const libzcash::PaymentAddress &address, libzcash::ViewingKey& vkOut) const =0; }; typedef std::map KeyMap; typedef std::map ScriptMap; typedef std::set WatchOnlySet; typedef std::map SpendingKeyMap; +typedef std::map ViewingKeyMap; typedef std::map NoteDecryptorMap; /** Basic key store, that keeps keys in an address->secret map */ @@ -71,6 +78,7 @@ protected: ScriptMap mapScripts; WatchOnlySet setWatchOnly; SpendingKeyMap mapSpendingKeys; + ViewingKeyMap mapViewingKeys; NoteDecryptorMap mapNoteDecryptors; public: @@ -168,6 +176,11 @@ public: } } } + + virtual bool AddViewingKey(const libzcash::ViewingKey &vk); + virtual bool RemoveViewingKey(const libzcash::ViewingKey &vk); + virtual bool HaveViewingKey(const libzcash::PaymentAddress &address) const; + virtual bool GetViewingKey(const libzcash::PaymentAddress &address, libzcash::ViewingKey& vkOut) const; }; typedef std::vector > CKeyingMaterial; diff --git a/src/zcash/Address.cpp b/src/zcash/Address.cpp index 75324de4f..baefeae4e 100644 --- a/src/zcash/Address.cpp +++ b/src/zcash/Address.cpp @@ -12,20 +12,28 @@ uint256 PaymentAddress::GetHash() const { return Hash(ss.begin(), ss.end()); } -uint256 ReceivingKey::pk_enc() { +uint256 ReceivingKey::pk_enc() const { return ZCNoteEncryption::generate_pubkey(*this); } +PaymentAddress ViewingKey::address() const { + return PaymentAddress(a_pk, sk_enc.pk_enc()); +} + ReceivingKey SpendingKey::receiving_key() const { return ReceivingKey(ZCNoteEncryption::generate_privkey(*this)); } +ViewingKey SpendingKey::viewing_key() const { + return ViewingKey(PRF_addr_a_pk(*this), receiving_key()); +} + SpendingKey SpendingKey::random() { return SpendingKey(random_uint252()); } PaymentAddress SpendingKey::address() const { - return PaymentAddress(PRF_addr_a_pk(*this), receiving_key().pk_enc()); + return viewing_key().address(); } } diff --git a/src/zcash/Address.hpp b/src/zcash/Address.hpp index e76973cb6..4287fee4f 100644 --- a/src/zcash/Address.hpp +++ b/src/zcash/Address.hpp @@ -40,9 +40,37 @@ public: class ReceivingKey : public uint256 { public: + ReceivingKey() { } ReceivingKey(uint256 sk_enc) : uint256(sk_enc) { } - uint256 pk_enc(); + uint256 pk_enc() const; +}; + +class ViewingKey { +public: + uint256 a_pk; + ReceivingKey sk_enc; + + ViewingKey() : a_pk(), sk_enc() { } + ViewingKey(uint256 a_pk, ReceivingKey sk_enc) : a_pk(a_pk), sk_enc(sk_enc) { } + + ADD_SERIALIZE_METHODS; + + template + inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { + READWRITE(a_pk); + READWRITE(sk_enc); + } + + PaymentAddress address() const; + + friend inline bool operator==(const ViewingKey& a, const ViewingKey& b) { + return a.a_pk == b.a_pk && a.sk_enc == b.sk_enc; + } + friend inline bool operator<(const ViewingKey& a, const ViewingKey& b) { + return (a.a_pk < b.a_pk || + (a.a_pk == b.a_pk && a.sk_enc < b.sk_enc)); + } }; class SpendingKey : public uint252 { @@ -53,6 +81,7 @@ public: static SpendingKey random(); ReceivingKey receiving_key() const; + ViewingKey viewing_key() const; PaymentAddress address() const; }; From 13933e4c1344c84e55071e5a6517e484710aa8d4 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 1 Mar 2017 11:09:41 -0800 Subject: [PATCH 0354/1062] Factor out common logic from CZCPaymentAddress and CZCSpendingKey --- src/base58.cpp | 65 +++++++++++++++++++------------------------------- src/base58.h | 27 ++++++++++++++------- 2 files changed, 44 insertions(+), 48 deletions(-) diff --git a/src/base58.cpp b/src/base58.cpp index 12e2496da..2fd2475fe 100644 --- a/src/base58.cpp +++ b/src/base58.cpp @@ -323,67 +323,52 @@ bool CBitcoinSecret::SetString(const std::string& strSecret) return SetString(strSecret.c_str()); } -bool CZCPaymentAddress::Set(const libzcash::PaymentAddress& addr) +template +bool CZCEncoding::Set(const DATA_TYPE& addr) { CDataStream ss(SER_NETWORK, PROTOCOL_VERSION); ss << addr; std::vector addrSerialized(ss.begin(), ss.end()); - assert(addrSerialized.size() == libzcash::SerializedPaymentAddressSize); - SetData(Params().Base58Prefix(CChainParams::ZCPAYMENT_ADDRRESS), &addrSerialized[0], libzcash::SerializedPaymentAddressSize); + assert(addrSerialized.size() == SER_SIZE); + SetData(Params().Base58Prefix(PREFIX), &addrSerialized[0], SER_SIZE); return true; } -libzcash::PaymentAddress CZCPaymentAddress::Get() const +template +DATA_TYPE CZCEncoding::Get() const { - if (vchData.size() != libzcash::SerializedPaymentAddressSize) { + if (vchData.size() != SER_SIZE) { throw std::runtime_error( - "payment address is invalid" + PrependName(" is invalid") ); } - if (vchVersion != Params().Base58Prefix(CChainParams::ZCPAYMENT_ADDRRESS)) { + if (vchVersion != Params().Base58Prefix(PREFIX)) { throw std::runtime_error( - "payment address is for wrong network type" + PrependName(" is for wrong network type") ); } std::vector serialized(vchData.begin(), vchData.end()); CDataStream ss(serialized, SER_NETWORK, PROTOCOL_VERSION); - libzcash::PaymentAddress ret; + DATA_TYPE ret; ss >> ret; return ret; } -bool CZCSpendingKey::Set(const libzcash::SpendingKey& addr) -{ - CDataStream ss(SER_NETWORK, PROTOCOL_VERSION); - ss << addr; - std::vector addrSerialized(ss.begin(), ss.end()); - assert(addrSerialized.size() == libzcash::SerializedSpendingKeySize); - SetData(Params().Base58Prefix(CChainParams::ZCSPENDING_KEY), &addrSerialized[0], libzcash::SerializedSpendingKeySize); - return true; -} - -libzcash::SpendingKey CZCSpendingKey::Get() const -{ - if (vchData.size() != libzcash::SerializedSpendingKeySize) { - throw std::runtime_error( - "spending key is invalid" - ); - } - - if (vchVersion != Params().Base58Prefix(CChainParams::ZCSPENDING_KEY)) { - throw std::runtime_error( - "spending key is for wrong network type" - ); - } - - std::vector serialized(vchData.begin(), vchData.end()); - - CDataStream ss(serialized, SER_NETWORK, PROTOCOL_VERSION); - libzcash::SpendingKey ret; - ss >> ret; - return ret; -} +// Explicit instantiations for libzcash::PaymentAddress +template bool CZCEncoding::Set(const libzcash::PaymentAddress& addr); +template libzcash::PaymentAddress CZCEncoding::Get() const; +// Explicit instantiations for libzcash::SpendingKey +template bool CZCEncoding::Set(const libzcash::SpendingKey& sk); +template libzcash::SpendingKey CZCEncoding::Get() const; diff --git a/src/base58.h b/src/base58.h index 88efadbd6..c239e0e99 100644 --- a/src/base58.h +++ b/src/base58.h @@ -96,26 +96,37 @@ public: bool operator> (const CBase58Data& b58) const { return CompareTo(b58) > 0; } }; -class CZCPaymentAddress : public CBase58Data { +template +class CZCEncoding : public CBase58Data { +protected: + virtual std::string PrependName(const std::string& s) const = 0; + +public: + bool Set(const DATA_TYPE& addr); + + DATA_TYPE Get() const; +}; + +class CZCPaymentAddress : public CZCEncoding { +protected: + std::string PrependName(const std::string& s) const { return "payment address" + s; } + public: - bool Set(const libzcash::PaymentAddress& addr); CZCPaymentAddress() {} CZCPaymentAddress(const std::string& strAddress) { SetString(strAddress.c_str(), 2); } CZCPaymentAddress(const libzcash::PaymentAddress& addr) { Set(addr); } - - libzcash::PaymentAddress Get() const; }; -class CZCSpendingKey : public CBase58Data { +class CZCSpendingKey : public CZCEncoding { +protected: + std::string PrependName(const std::string& s) const { return "spending key" + s; } + public: - bool Set(const libzcash::SpendingKey& addr); CZCSpendingKey() {} CZCSpendingKey(const std::string& strAddress) { SetString(strAddress.c_str(), 2); } CZCSpendingKey(const libzcash::SpendingKey& addr) { Set(addr); } - - libzcash::SpendingKey Get() const; }; /** base58-encoded Bitcoin addresses. From 61345ae70320f2242e83181c799eb044e6af3461 Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 7 Dec 2017 10:11:43 -0800 Subject: [PATCH 0355/1062] Closes #2746. Payment disclosure blobs now use 'zpd:' prefix. --- qa/rpc-tests/paymentdisclosure.py | 11 +++++++++++ src/gtest/test_paymentdisclosure.cpp | 4 +++- src/paymentdisclosure.h | 2 ++ src/wallet/rpcdisclosure.cpp | 18 ++++++++++++------ 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/qa/rpc-tests/paymentdisclosure.py b/qa/rpc-tests/paymentdisclosure.py index 60d6f188f..bc873897a 100755 --- a/qa/rpc-tests/paymentdisclosure.py +++ b/qa/rpc-tests/paymentdisclosure.py @@ -175,6 +175,17 @@ class PaymentDisclosureTest (BitcoinTestFramework): assert_equal(result["message"], message) assert_equal(result["value"], output_value_sum) + # Confirm that payment disclosure begins with prefix zpd: + assert(pd.startswith("zpd:")) + + # Confirm that payment disclosure without prefix zpd: fails validation + try: + self.nodes[1].z_validatepaymentdisclosure(pd[4:]) + assert(False) + except JSONRPCException as e: + errorString = e.error['message'] + assert("payment disclosure prefix not found" in errorString) + # Check that total value of output index 0 and index 1 should equal shielding amount of 40 less standard fee. pd = self.nodes[0].z_getpaymentdisclosure(txid, 0, 1) result = self.nodes[0].z_validatepaymentdisclosure(pd) diff --git a/src/gtest/test_paymentdisclosure.cpp b/src/gtest/test_paymentdisclosure.cpp index e87c89297..ddab3c7e6 100644 --- a/src/gtest/test_paymentdisclosure.cpp +++ b/src/gtest/test_paymentdisclosure.cpp @@ -87,7 +87,9 @@ public: // This test creates random payment disclosure blobs and checks that they can be // 1. inserted and retrieved from a database -// 2. serialized and deserialized without corruption +// 2. serialized and deserialized without corruption +// Note that the zpd: prefix is not part of the payment disclosure blob itself. It is only +// used as convention to improve the user experience when sharing payment disclosure blobs. TEST(paymentdisclosure, mainnet) { ECC_Start(); SelectParams(CBaseChainParams::MAIN); diff --git a/src/paymentdisclosure.h b/src/paymentdisclosure.h index b4f56eb45..e6a995ab4 100644 --- a/src/paymentdisclosure.h +++ b/src/paymentdisclosure.h @@ -28,6 +28,8 @@ #define PAYMENT_DISCLOSURE_VERSION_EXPERIMENTAL 0 +#define PAYMENT_DISCLOSURE_BLOB_STRING_PREFIX "zpd:" + typedef JSOutPoint PaymentDisclosureKey; struct PaymentDisclosureInfo { diff --git a/src/wallet/rpcdisclosure.cpp b/src/wallet/rpcdisclosure.cpp index c1c8cb87c..539cf4b2a 100644 --- a/src/wallet/rpcdisclosure.cpp +++ b/src/wallet/rpcdisclosure.cpp @@ -59,7 +59,7 @@ UniValue z_getpaymentdisclosure(const UniValue& params, bool fHelp) "3. \"output_index\" (string, required) \n" "4. \"message\" (string, optional) \n" "\nResult:\n" - "\"paymentblob\" (string) Hex string of payment blob\n" + "\"paymentdisclosure\" (string) Hex data string, with \"zpd:\" prefix.\n" "\nExamples:\n" + HelpExampleCli("z_getpaymentdisclosure", "96f12882450429324d5f3b48630e3168220e49ab7b0f066e5c2935a6b88bb0f2 0 0 \"refund\"") + HelpExampleRpc("z_getpaymentdisclosure", "\"96f12882450429324d5f3b48630e3168220e49ab7b0f066e5c2935a6b88bb0f2\", 0, 0, \"refund\"") @@ -134,7 +134,7 @@ UniValue z_getpaymentdisclosure(const UniValue& params, bool fHelp) CDataStream ss(SER_NETWORK, PROTOCOL_VERSION); ss << pd; string strHex = HexStr(ss.begin(), ss.end()); - return strHex; + return PAYMENT_DISCLOSURE_BLOB_STRING_PREFIX + strHex; } @@ -160,10 +160,10 @@ UniValue z_validatepaymentdisclosure(const UniValue& params, bool fHelp) "\nEXPERIMENTAL FEATURE\n" + strPaymentDisclosureDisabledMsg + "\nArguments:\n" - "1. \"paymentdisclosure\" (string, required) Hex data string\n" + "1. \"paymentdisclosure\" (string, required) Hex data string, with \"zpd:\" prefix.\n" "\nExamples:\n" - + HelpExampleCli("z_validatepaymentdisclosure", "\"hexblob\"") - + HelpExampleRpc("z_validatepaymentdisclosure", "\"hexblob\"") + + HelpExampleCli("z_validatepaymentdisclosure", "\"zpd:706462ff004c561a0447ba2ec51184e6c204...\"") + + HelpExampleRpc("z_validatepaymentdisclosure", "\"zpd:706462ff004c561a0447ba2ec51184e6c204...\"") ); if (!fEnablePaymentDisclosure) { @@ -174,7 +174,13 @@ UniValue z_validatepaymentdisclosure(const UniValue& params, bool fHelp) EnsureWalletIsUnlocked(); - string hexInput = params[0].get_str(); + // Verify the payment disclosure input begins with "zpd:" prefix. + string strInput = params[0].get_str(); + size_t pos = strInput.find(PAYMENT_DISCLOSURE_BLOB_STRING_PREFIX); + if (pos != 0) { + throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, payment disclosure prefix not found."); + } + string hexInput = strInput.substr(strlen(PAYMENT_DISCLOSURE_BLOB_STRING_PREFIX)); if (!IsHex(hexInput)) { throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, expected payment disclosure data in hexadecimal format."); From ad6a36ad02de357db6fb44605774ebabb4d4806f Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 9 Nov 2017 22:09:54 +0000 Subject: [PATCH 0356/1062] Track net value entering and exiting the Sprout circuit Delta values will be stored for new blocks; old blocks can be filled in by re-indexing. The net value currently in the Sprout circuit is only calculated when delta values for all previous blocks are present. --- src/chain.h | 21 +++++++++ src/gtest/test_validation.cpp | 86 +++++++++++++++++++++++++++++++++++ src/main.cpp | 25 ++++++++++ src/txdb.cpp | 1 + 4 files changed, 133 insertions(+) diff --git a/src/chain.h b/src/chain.h index b7e8a9176..5e5258339 100644 --- a/src/chain.h +++ b/src/chain.h @@ -16,6 +16,8 @@ #include +static const int SPROUT_VALUE_VERSION = 1001400; + struct CDiskBlockPos { int nFile; @@ -144,6 +146,15 @@ public: //! (memory only) The anchor for the tree state up to the end of this block uint256 hashAnchorEnd; + //! Change in value held by the Sprout circuit over this block. + //! Will be boost::none for older blocks on old nodes until a reindex has taken place. + boost::optional nSproutValue; + + //! (memory only) Total value held by the Sprout circuit up to and including this block. + //! Will be boost::none for on old nodes until a reindex has taken place. + //! Will be boost::none if nChainTx is zero. + boost::optional nChainSproutValue; + //! block header int nVersion; uint256 hashMerkleRoot; @@ -172,6 +183,8 @@ public: hashAnchor = uint256(); hashAnchorEnd = uint256(); nSequenceId = 0; + nSproutValue = boost::none; + nChainSproutValue = boost::none; nVersion = 0; hashMerkleRoot = uint256(); @@ -339,6 +352,14 @@ public: READWRITE(nBits); READWRITE(nNonce); READWRITE(nSolution); + + // Only read/write nSproutValue if the client version used to create + // this index was storing them. + // TODO: See if we can get away with not serializing the boost::optional + // one-byte header, without requiring users to reindex on upgrade. + if (nType & SER_DISK && nVersion >= SPROUT_VALUE_VERSION) { + READWRITE(nSproutValue); + } } uint256 GetBlockHash() const diff --git a/src/gtest/test_validation.cpp b/src/gtest/test_validation.cpp index 21ed20d84..6f603eaec 100644 --- a/src/gtest/test_validation.cpp +++ b/src/gtest/test_validation.cpp @@ -2,6 +2,18 @@ #include "consensus/validation.h" #include "main.h" +#include "utiltest.h" + +extern ZCJoinSplit* params; + +extern bool ReceivedBlockTransactions(const CBlock &block, CValidationState& state, CBlockIndex *pindexNew, const CDiskBlockPos& pos); + +void ExpectOptionalAmount(CAmount expected, boost::optional actual) { + EXPECT_TRUE((bool)actual); + if (actual) { + EXPECT_EQ(expected, *actual); + } +} // Fake an empty view class FakeCoinsViewDB : public CCoinsView { @@ -61,3 +73,77 @@ TEST(Validation, ContextualCheckInputsPassesWithCoinbase) { CValidationState state; EXPECT_TRUE(ContextualCheckInputs(tx, state, view, false, 0, false, Params(CBaseChainParams::MAIN).GetConsensus())); } + +TEST(Validation, ReceivedBlockTransactions) { + auto sk = libzcash::SpendingKey::random(); + + // Create a fake genesis block + CBlock block1; + block1.vtx.push_back(GetValidReceive(*params, sk, 5, true)); + block1.hashMerkleRoot = block1.BuildMerkleTree(); + CBlockIndex fakeIndex1 {block1}; + + // Create a fake child block + CBlock block2; + block2.hashPrevBlock = block1.GetHash(); + block2.vtx.push_back(GetValidReceive(*params, sk, 10, true)); + block2.hashMerkleRoot = block2.BuildMerkleTree(); + CBlockIndex fakeIndex2 {block2}; + fakeIndex2.pprev = &fakeIndex1; + + CDiskBlockPos pos1; + CDiskBlockPos pos2; + + // Set initial state of indices + ASSERT_TRUE(fakeIndex1.RaiseValidity(BLOCK_VALID_TREE)); + ASSERT_TRUE(fakeIndex2.RaiseValidity(BLOCK_VALID_TREE)); + EXPECT_TRUE(fakeIndex1.IsValid(BLOCK_VALID_TREE)); + EXPECT_TRUE(fakeIndex2.IsValid(BLOCK_VALID_TREE)); + EXPECT_FALSE(fakeIndex1.IsValid(BLOCK_VALID_TRANSACTIONS)); + EXPECT_FALSE(fakeIndex2.IsValid(BLOCK_VALID_TRANSACTIONS)); + + // Sprout pool values should not be set + EXPECT_FALSE((bool)fakeIndex1.nSproutValue); + EXPECT_FALSE((bool)fakeIndex1.nChainSproutValue); + EXPECT_FALSE((bool)fakeIndex2.nSproutValue); + EXPECT_FALSE((bool)fakeIndex2.nChainSproutValue); + + // Mark the second block's transactions as received first + CValidationState state; + EXPECT_TRUE(ReceivedBlockTransactions(block2, state, &fakeIndex2, pos2)); + EXPECT_FALSE(fakeIndex1.IsValid(BLOCK_VALID_TRANSACTIONS)); + EXPECT_TRUE(fakeIndex2.IsValid(BLOCK_VALID_TRANSACTIONS)); + + // Sprout pool value delta should now be set for the second block, + // but not any chain totals + EXPECT_FALSE((bool)fakeIndex1.nSproutValue); + EXPECT_FALSE((bool)fakeIndex1.nChainSproutValue); + { + SCOPED_TRACE("ExpectOptionalAmount call"); + ExpectOptionalAmount(20, fakeIndex2.nSproutValue); + } + EXPECT_FALSE((bool)fakeIndex2.nChainSproutValue); + + // Now mark the first block's transactions as received + EXPECT_TRUE(ReceivedBlockTransactions(block1, state, &fakeIndex1, pos1)); + EXPECT_TRUE(fakeIndex1.IsValid(BLOCK_VALID_TRANSACTIONS)); + EXPECT_TRUE(fakeIndex2.IsValid(BLOCK_VALID_TRANSACTIONS)); + + // Sprout pool values should now be set for both blocks + { + SCOPED_TRACE("ExpectOptionalAmount call"); + ExpectOptionalAmount(10, fakeIndex1.nSproutValue); + } + { + SCOPED_TRACE("ExpectOptionalAmount call"); + ExpectOptionalAmount(10, fakeIndex1.nChainSproutValue); + } + { + SCOPED_TRACE("ExpectOptionalAmount call"); + ExpectOptionalAmount(20, fakeIndex2.nSproutValue); + } + { + SCOPED_TRACE("ExpectOptionalAmount call"); + ExpectOptionalAmount(30, fakeIndex2.nChainSproutValue); + } +} diff --git a/src/main.cpp b/src/main.cpp index a8ec07403..d8e47caac 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2835,6 +2835,15 @@ bool ReceivedBlockTransactions(const CBlock &block, CValidationState& state, CBl { pindexNew->nTx = block.vtx.size(); pindexNew->nChainTx = 0; + CAmount sproutValue = 0; + for (auto tx : block.vtx) { + for (auto js : tx.vjoinsplit) { + sproutValue += js.vpub_old; + sproutValue -= js.vpub_new; + } + } + pindexNew->nSproutValue = sproutValue; + pindexNew->nChainSproutValue = boost::none; pindexNew->nFile = pos.nFile; pindexNew->nDataPos = pos.nPos; pindexNew->nUndoPos = 0; @@ -2852,6 +2861,15 @@ bool ReceivedBlockTransactions(const CBlock &block, CValidationState& state, CBl CBlockIndex *pindex = queue.front(); queue.pop_front(); pindex->nChainTx = (pindex->pprev ? pindex->pprev->nChainTx : 0) + pindex->nTx; + if (pindex->pprev) { + if (pindex->pprev->nChainSproutValue && pindex->nSproutValue) { + pindex->nChainSproutValue = *pindex->pprev->nChainSproutValue + *pindex->nSproutValue; + } else { + pindex->nChainSproutValue = boost::none; + } + } else { + pindex->nChainSproutValue = pindex->nSproutValue; + } { LOCK(cs_nBlockSequenceId); pindex->nSequenceId = nBlockSequenceId++; @@ -3522,12 +3540,19 @@ bool static LoadBlockIndexDB() if (pindex->pprev) { if (pindex->pprev->nChainTx) { pindex->nChainTx = pindex->pprev->nChainTx + pindex->nTx; + if (pindex->pprev->nChainSproutValue && pindex->nSproutValue) { + pindex->nChainSproutValue = *pindex->pprev->nChainSproutValue + *pindex->nSproutValue; + } else { + pindex->nChainSproutValue = boost::none; + } } else { pindex->nChainTx = 0; + pindex->nChainSproutValue = boost::none; mapBlocksUnlinked.insert(std::make_pair(pindex->pprev, pindex)); } } else { pindex->nChainTx = pindex->nTx; + pindex->nChainSproutValue = pindex->nSproutValue; } } if (pindex->IsValid(BLOCK_VALID_TRANSACTIONS) && (pindex->nChainTx || pindex->pprev == NULL)) diff --git a/src/txdb.cpp b/src/txdb.cpp index 004b0be2c..e1e29d9ac 100644 --- a/src/txdb.cpp +++ b/src/txdb.cpp @@ -310,6 +310,7 @@ bool CBlockTreeDB::LoadBlockIndexGuts() pindexNew->nSolution = diskindex.nSolution; pindexNew->nStatus = diskindex.nStatus; pindexNew->nTx = diskindex.nTx; + pindexNew->nSproutValue = diskindex.nSproutValue; if (!CheckProofOfWork(pindexNew->GetBlockHash(), pindexNew->nBits, Params().GetConsensus())) return error("LoadBlockIndex(): CheckProofOfWork failed: %s", pindexNew->ToString()); From e319633435e3cd8c1726ebd3d6245200ae3f17c5 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 14 Dec 2017 15:18:08 +0000 Subject: [PATCH 0357/1062] Add Sprout value pool to getblock and getblockchaininfo --- qa/rpc-tests/wallet_protectcoinbase.py | 34 ++++++++++++++++++++++++-- src/rpcblockchain.cpp | 29 +++++++++++++++++++++- 2 files changed, 60 insertions(+), 3 deletions(-) diff --git a/qa/rpc-tests/wallet_protectcoinbase.py b/qa/rpc-tests/wallet_protectcoinbase.py index e407f0914..5423dcd64 100755 --- a/qa/rpc-tests/wallet_protectcoinbase.py +++ b/qa/rpc-tests/wallet_protectcoinbase.py @@ -14,6 +14,16 @@ import time import timeit from decimal import Decimal +def check_value_pool(node, name, total): + value_pools = node.getblockchaininfo()['valuePools'] + found = False + for pool in value_pools: + if pool['id'] == name: + found = True + assert_equal(pool['monitored'], True) + assert_equal(pool['chainValue'], total) + assert(found) + class WalletProtectCoinbaseTest (BitcoinTestFramework): def setup_chain(self): @@ -76,6 +86,11 @@ class WalletProtectCoinbaseTest (BitcoinTestFramework): assert_equal(self.nodes[2].getbalance(), 0) assert_equal(self.nodes[3].getbalance(), 0) + check_value_pool(self.nodes[0], 'sprout', 0) + check_value_pool(self.nodes[1], 'sprout', 0) + check_value_pool(self.nodes[2], 'sprout', 0) + check_value_pool(self.nodes[3], 'sprout', 0) + # Send will fail because we are enforcing the consensus rule that # coinbase utxos can only be sent to a zaddr. errorString = "" @@ -141,8 +156,9 @@ class WalletProtectCoinbaseTest (BitcoinTestFramework): assert_equal("wallet does not allow any change" in errorString, True) # This send will succeed. We send two coinbase utxos totalling 20.0 less a fee of 0.00010000, with no change. + shieldvalue = Decimal('20.0') - Decimal('0.0001') recipients = [] - recipients.append({"address":myzaddr, "amount": Decimal('20.0') - Decimal('0.0001')}) + recipients.append({"address":myzaddr, "amount": shieldvalue}) myopid = self.nodes[0].z_sendmany(mytaddr, recipients) mytxid = self.wait_and_assert_operationid_status(myopid) self.sync_all() @@ -169,6 +185,10 @@ class WalletProtectCoinbaseTest (BitcoinTestFramework): assert_equal(Decimal(resp["private"]), Decimal('19.9999')) assert_equal(Decimal(resp["total"]), Decimal('39.9999')) + # The Sprout value pool should reflect the send + sproutvalue = shieldvalue + check_value_pool(self.nodes[0], 'sprout', sproutvalue) + # A custom fee of 0 is okay. Here the node will send the note value back to itself. recipients = [] recipients.append({"address":myzaddr, "amount": Decimal('19.9999')}) @@ -182,9 +202,13 @@ class WalletProtectCoinbaseTest (BitcoinTestFramework): assert_equal(Decimal(resp["private"]), Decimal('19.9999')) assert_equal(Decimal(resp["total"]), Decimal('39.9999')) + # The Sprout value pool should be unchanged + check_value_pool(self.nodes[0], 'sprout', sproutvalue) + # convert note to transparent funds + unshieldvalue = Decimal('10.0') recipients = [] - recipients.append({"address":mytaddr, "amount":Decimal('10.0')}) + recipients.append({"address":mytaddr, "amount": unshieldvalue}) myopid = self.nodes[0].z_sendmany(myzaddr, recipients) mytxid = self.wait_and_assert_operationid_status(myopid) assert(mytxid is not None) @@ -198,10 +222,12 @@ class WalletProtectCoinbaseTest (BitcoinTestFramework): self.sync_all() # check balances + sproutvalue -= unshieldvalue + Decimal('0.0001') resp = self.nodes[0].z_gettotalbalance() assert_equal(Decimal(resp["transparent"]), Decimal('30.0')) assert_equal(Decimal(resp["private"]), Decimal('9.9998')) assert_equal(Decimal(resp["total"]), Decimal('39.9998')) + check_value_pool(self.nodes[0], 'sprout', sproutvalue) # z_sendmany will return an error if there is transparent change output considered dust. # UTXO selection in z_sendmany sorts in ascending order, so smallest utxos are consumed first. @@ -277,7 +303,9 @@ class WalletProtectCoinbaseTest (BitcoinTestFramework): # check balance node2balance = amount_per_recipient * num_t_recipients + sproutvalue -= node2balance + Decimal('0.0001') assert_equal(self.nodes[2].getbalance(), node2balance) + check_value_pool(self.nodes[0], 'sprout', sproutvalue) # Send will fail because fee is negative try: @@ -336,6 +364,8 @@ class WalletProtectCoinbaseTest (BitcoinTestFramework): assert_equal(Decimal(resp["private"]), send_amount) resp = self.nodes[0].z_getbalance(myzaddr) assert_equal(Decimal(resp), zbalance - custom_fee - send_amount) + sproutvalue -= custom_fee + check_value_pool(self.nodes[0], 'sprout', sproutvalue) if __name__ == '__main__': WalletProtectCoinbaseTest().main() diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index cbc7109dd..363872ede 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -77,6 +77,25 @@ double GetNetworkDifficulty(const CBlockIndex* blockindex) return GetDifficultyINTERNAL(blockindex, true); } +static UniValue ValuePoolDesc( + const std::string &name, + const boost::optional chainValue, + const boost::optional valueDelta) +{ + UniValue rv(UniValue::VOBJ); + rv.push_back(Pair("id", name)); + rv.push_back(Pair("monitored", (bool)chainValue)); + if (chainValue) { + rv.push_back(Pair("chainValue", ValueFromAmount(*chainValue))); + rv.push_back(Pair("chainValueZat", *chainValue)); + } + if (valueDelta) { + rv.push_back(Pair("valueDelta", ValueFromAmount(*valueDelta))); + rv.push_back(Pair("valueDeltaZat", *valueDelta)); + } + return rv; +} + UniValue blockheaderToJSON(const CBlockIndex* blockindex) { UniValue result(UniValue::VOBJ); @@ -138,6 +157,10 @@ UniValue blockToJSON(const CBlock& block, const CBlockIndex* blockindex, bool tx result.push_back(Pair("chainwork", blockindex->nChainWork.GetHex())); result.push_back(Pair("anchor", blockindex->hashAnchorEnd.GetHex())); + UniValue valuePools(UniValue::VARR); + valuePools.push_back(ValuePoolDesc("sprout", blockindex->nChainSproutValue, blockindex->nSproutValue)); + result.push_back(Pair("valuePools", valuePools)); + if (blockindex->pprev) result.push_back(Pair("previousblockhash", blockindex->pprev->GetBlockHash().GetHex())); CBlockIndex *pnext = chainActive.Next(blockindex); @@ -688,8 +711,12 @@ UniValue getblockchaininfo(const UniValue& params, bool fHelp) pcoinsTip->GetAnchorAt(pcoinsTip->GetBestAnchor(), tree); obj.push_back(Pair("commitments", tree.size())); - const Consensus::Params& consensusParams = Params().GetConsensus(); CBlockIndex* tip = chainActive.Tip(); + UniValue valuePools(UniValue::VARR); + valuePools.push_back(ValuePoolDesc("sprout", tip->nChainSproutValue, boost::none)); + obj.push_back(Pair("valuePools", valuePools)); + + const Consensus::Params& consensusParams = Params().GetConsensus(); UniValue softforks(UniValue::VARR); softforks.push_back(SoftForkDesc("bip34", 2, tip, consensusParams)); softforks.push_back(SoftForkDesc("bip66", 3, tip, consensusParams)); From d66bf190cb0796c2551f2fcb00943fb7eeb539ee Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 15 Dec 2017 10:02:54 +0000 Subject: [PATCH 0358/1062] Apply -fstack-protector-all to libsnark --- src/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Makefile.am b/src/Makefile.am index 797fdcfe9..437fc6828 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -45,7 +45,7 @@ $(LIBSECP256K1): $(wildcard secp256k1/src/*) $(wildcard secp256k1/include/*) -include collate-libsnark collate-libsnark: $(LIBSNARK) -LIBSNARK_CXXFLAGS = -fPIC -DBINARY_OUTPUT -DNO_PT_COMPRESSION=1 +LIBSNARK_CXXFLAGS = -fPIC -DBINARY_OUTPUT -DNO_PT_COMPRESSION=1 -fstack-protector-all LIBSNARK_CONFIG_FLAGS = CURVE=ALT_BN128 NO_PROCPS=1 NO_DOCS=1 STATIC=1 NO_SUPERCOP=1 FEATUREFLAGS=-DMONTGOMERY_OUTPUT NO_COPY_DEPINST=1 NO_COMPILE_LIBGTEST=1 if HAVE_OPENMP LIBSNARK_CONFIG_FLAGS += MULTICORE=1 From 4a617475ecc5d5a5821920de4f49871bd9ba99d4 Mon Sep 17 00:00:00 2001 From: syd Date: Mon, 20 Nov 2017 19:26:34 -0500 Subject: [PATCH 0359/1062] Fix libsnark test failure. The shorten() method was copying too much into the destination buffer, overflowing it and affecting neighboring data. --- src/snark/src/algebra/fields/bigint.tcc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/snark/src/algebra/fields/bigint.tcc b/src/snark/src/algebra/fields/bigint.tcc index f81addf45..c1777ad46 100644 --- a/src/snark/src/algebra/fields/bigint.tcc +++ b/src/snark/src/algebra/fields/bigint.tcc @@ -201,7 +201,7 @@ inline bigint bigint::shorten(const bigint& q, const char *msg) const } } bigint res; - mpn_copyi(res.data, data, n); + mpn_copyi(res.data, data, m); res.limit(q, msg); return res; } From 0100c79405d29239f0495c94fce921b9978bdddb Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 15 Dec 2017 13:03:33 +0000 Subject: [PATCH 0360/1062] Add Rust and Proton to configure options printout --- configure.ac | 2 ++ 1 file changed, 2 insertions(+) diff --git a/configure.ac b/configure.ac index 27c000c2c..b44b486a3 100644 --- a/configure.ac +++ b/configure.ac @@ -908,6 +908,8 @@ esac echo echo "Options used to compile and link:" echo " with wallet = $enable_wallet" +echo " with rust = $enable_rust" +echo " with proton = $use_proton" echo " with zmq = $use_zmq" echo " with test = $use_tests" echo " debug enabled = $enable_debug" From 73b220cb0f747016ab83bcee2252cd880f0b3227 Mon Sep 17 00:00:00 2001 From: Jay Graber Date: Mon, 27 Nov 2017 19:55:38 -0800 Subject: [PATCH 0361/1062] Add rpc test that exercises z_importkey --- qa/pull-tester/rpc-tests.sh | 1 + qa/rpc-tests/zkey_import_export.py | 192 +++++++++++++++++++++++++++++ 2 files changed, 193 insertions(+) create mode 100755 qa/rpc-tests/zkey_import_export.py diff --git a/qa/pull-tester/rpc-tests.sh b/qa/pull-tester/rpc-tests.sh index a09edaf03..dfbd78f9a 100755 --- a/qa/pull-tester/rpc-tests.sh +++ b/qa/pull-tester/rpc-tests.sh @@ -43,6 +43,7 @@ testScripts=( 'disablewallet.py' 'zcjoinsplit.py' 'zcjoinsplitdoublespend.py' + 'zkey_import_export.py' 'getblocktemplate.py' 'bip65-cltv-p2p.py' 'bipdersig-p2p.py' diff --git a/qa/rpc-tests/zkey_import_export.py b/qa/rpc-tests/zkey_import_export.py new file mode 100755 index 000000000..e9cd94253 --- /dev/null +++ b/qa/rpc-tests/zkey_import_export.py @@ -0,0 +1,192 @@ +#!/usr/bin/env python2 +# Copyright (c) 2017 The Zcash developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +from decimal import Decimal +from test_framework.test_framework import BitcoinTestFramework +from test_framework.util import assert_equal, assert_greater_than, start_nodes, initialize_chain_clean, connect_nodes_bi + +import logging +import time +import math + +logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.INFO) + + +class ZkeyImportExportTest (BitcoinTestFramework): + + def setup_chain(self): + print("Initializing test directory "+self.options.tmpdir) + initialize_chain_clean(self.options.tmpdir, 5) + + def setup_network(self, split=False): + self.nodes = start_nodes(5, self.options.tmpdir ) + connect_nodes_bi(self.nodes,0,1) + connect_nodes_bi(self.nodes,1,2) + connect_nodes_bi(self.nodes,0,2) + connect_nodes_bi(self.nodes,0,3) + connect_nodes_bi(self.nodes,0,4) + self.is_network_split=False + self.sync_all() + + # TODO: Refactor in z_addr test_framework file + # Returns txid if operation was a success or None + def wait_and_assert_operationid_status(self, node, myopid, in_status='success', in_errormsg=None): + print('waiting for async operation {}'.format(myopid)) + opids = [] + opids.append(myopid) + timeout = 300 + status = None + errormsg = None + txid = None + for x in xrange(1, timeout): + results = node.z_getoperationresult(opids) + if len(results)==0: + time.sleep(1) + else: + print("Results", results[0]) + status = results[0]["status"] + if status == "failed": + errormsg = results[0]['error']['message'] + elif status == "success": + txid = results[0]['result']['txid'] + break + print('...returned status: {}'.format(status)) + assert_equal(in_status, status) + if errormsg is not None: + assert(in_errormsg is not None) + assert_equal(in_errormsg in errormsg, True) + print('...returned error: {}'.format(errormsg)) + return txid + + def run_test(self): + [alice, bob, charlie, david, miner] = self.nodes + + def z_send(from_node, from_addr, to_addr, amount): + opid = from_node.z_sendmany(from_addr, [{"address": to_addr, "amount": Decimal(amount)}]) + txid = self.wait_and_assert_operationid_status(from_node, opid) + self.sync_all() + miner.generate(1) + self.sync_all() + + def z_getbalance(node, zaddr): + bal = node.z_getbalance(zaddr) + # Ignore fees for sake of comparison + round_balance = math.ceil(bal*100)/100 + return round_balance + + def verify_utxos(node, amts, zaddr): + amts.sort(reverse=True) + txs = node.z_listreceivedbyaddress(zaddr) + + def cmp_confirmations_high_to_low(a, b): + return cmp(b["amount"], a["amount"]) + + txs.sort(cmp_confirmations_high_to_low) + print("Sorted txs", txs) + print("amts", amts) + + try: + assert_equal(amts, [tx["amount"] for tx in txs]) + except AssertionError: + logging.error( + 'Expected amounts: %r; txs: %r', + amts, txs) + raise + + def get_private_balance(node): + balance = node.z_gettotalbalance() + return balance['private'] + + def find_imported_key(node, import_zaddr): + zaddrs = node.z_listaddresses() + assert(import_zaddr in zaddrs) + return import_zaddr + + # Seed Alice with some funds + alice.generate(10) + self.sync_all() + miner.generate(100) + self.sync_all() + # Shield Alice's coinbase funds to her zaddr + alice_zaddr = alice.z_getnewaddress() + res = alice.z_shieldcoinbase("*", alice_zaddr) + txid = self.wait_and_assert_operationid_status(alice, res['opid']) + miner.generate(6) + self.sync_all() + # List funds + funds = alice.z_listreceivedbyaddress(alice_zaddr) + # print("Alice's funds after shield", funds) + + # Now get a pristine z-address for receiving transfers: + bob_zaddr = bob.z_getnewaddress() + verify_utxos(bob, [], bob_zaddr) + # TODO: Verify that charlie doesn't have funds in addr + # verify_utxos(charlie, []) + + # the amounts of each txn embodied which generates a single UTXO: + amounts = map(Decimal, ['2.3', '3.7', '0.1', '0.5', '1.0', '0.19']) + + # Internal test consistency assertion: + assert_greater_than( + get_private_balance(alice), + reduce(Decimal.__add__, amounts)) + + logging.info("Sending pre-export txns...") + for amount in amounts[0:2]: + z_send(alice, alice_zaddr, bob_zaddr, amount) + + logging.info("Exporting privkey from bob...") + privkey = bob.z_exportkey(bob_zaddr) + + logging.info("Sending post-export txns...") + for amount in amounts[2:4]: + z_send(alice, alice_zaddr, bob_zaddr, amount) + + print("Bob amounts:", amounts[:4]) + verify_utxos(bob, amounts[:4], bob_zaddr) + # verify_utxos(charlie, []) + + logging.info("Importing privkey into charlie...") + # z_importkey rescan defaults to "whenkeyisnew", so should rescan here + charlie.z_importkey(privkey) + ipk_zaddr = find_imported_key(charlie, bob_zaddr) + + # z_importkey should have rescanned for new key, so this should pass: + verify_utxos(charlie, amounts[:4], ipk_zaddr) + + # Verify idempotent behavior: + charlie.z_importkey(privkey) + ipk_zaddr2 = find_imported_key(charlie, bob_zaddr) + + # amounts should be unchanged + verify_utxos(charlie, amounts[:4], ipk_zaddr2) + + logging.info("Sending post-import txns...") + for amount in amounts[4:]: + z_send(alice, alice_zaddr, bob_zaddr, amount) + + verify_utxos(bob, amounts, bob_zaddr) + verify_utxos(charlie, amounts, ipk_zaddr) + verify_utxos(charlie, amounts, ipk_zaddr2) + + # Try to reproduce zombie balance reported in #1936 + # At generated zaddr, receive ZEC, and send ZEC back out. bob -> alice + for amount in amounts[:2]: + print("Sending amount from bob to alice: ", amount) + z_send(bob, bob_zaddr, alice_zaddr, amount) + + balance = float(sum(amounts) - sum(amounts[:2])) + assert_equal(z_getbalance(bob, bob_zaddr), balance) + + # z_import onto new node "david" (blockchain rescan, default or True?) + david.z_importkey(privkey) + d_ipk_zaddr = find_imported_key(david, bob_zaddr) + + # Check if amt bob spent is deducted for charlie and david + assert_equal(z_getbalance(charlie, ipk_zaddr), balance) + assert_equal(z_getbalance(david, d_ipk_zaddr), balance) + +if __name__ == '__main__': + ZkeyImportExportTest().main() From 9d0c70e9e7bec8fc90a533b6f8838807424be9f7 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 15 Dec 2017 18:36:05 +0000 Subject: [PATCH 0362/1062] Clarify operator precedence in serialization of nSproutValue --- src/chain.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chain.h b/src/chain.h index 5e5258339..9d858a609 100644 --- a/src/chain.h +++ b/src/chain.h @@ -357,7 +357,7 @@ public: // this index was storing them. // TODO: See if we can get away with not serializing the boost::optional // one-byte header, without requiring users to reindex on upgrade. - if (nType & SER_DISK && nVersion >= SPROUT_VALUE_VERSION) { + if ((nType & SER_DISK) && (nVersion >= SPROUT_VALUE_VERSION)) { READWRITE(nSproutValue); } } From e365ca1c53d996960dce64b75193fe7b809c86fb Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Sat, 16 Dec 2017 10:01:26 +0000 Subject: [PATCH 0363/1062] Remove nSproutValue TODO from CDiskBlockIndex Block indices are flushed to disk when they are marked as dirty, and this happens via enough distinct pathways that it would be sufficiently complex to update nSproutValue via all of them. Thus it is necessary to be able to serialize "no value" for writes by upgraded clients. --- src/chain.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/chain.h b/src/chain.h index 9d858a609..a3b1b7ae9 100644 --- a/src/chain.h +++ b/src/chain.h @@ -355,8 +355,6 @@ public: // Only read/write nSproutValue if the client version used to create // this index was storing them. - // TODO: See if we can get away with not serializing the boost::optional - // one-byte header, without requiring users to reindex on upgrade. if ((nType & SER_DISK) && (nVersion >= SPROUT_VALUE_VERSION)) { READWRITE(nSproutValue); } From 8993edfb778832823e825769a116e002cb3aa4bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Per=20Gr=C3=B6n?= Date: Wed, 13 Dec 2017 07:38:46 +0000 Subject: [PATCH 0364/1062] Deduplicate test utility method wait_and_assert_operationid_status Strictly speaking this is not a true deduplication; the test output will be slightly different (due to inconsistent print statements) but I think this is close enough. --- qa/rpc-tests/mempool_tx_input_limit.py | 33 ++---------------- qa/rpc-tests/paymentdisclosure.py | 35 ++------------------ qa/rpc-tests/prioritisetransaction.py | 28 ---------------- qa/rpc-tests/test_framework/util.py | 28 ++++++++++++++++ qa/rpc-tests/wallet_1941.py | 29 ++-------------- qa/rpc-tests/wallet_protectcoinbase.py | 18 +++++----- qa/rpc-tests/wallet_shieldcoinbase.py | 46 +++++--------------------- qa/rpc-tests/wallet_treestate.py | 36 ++++---------------- 8 files changed, 60 insertions(+), 193 deletions(-) diff --git a/qa/rpc-tests/mempool_tx_input_limit.py b/qa/rpc-tests/mempool_tx_input_limit.py index 538122671..c48d73be0 100755 --- a/qa/rpc-tests/mempool_tx_input_limit.py +++ b/qa/rpc-tests/mempool_tx_input_limit.py @@ -6,7 +6,7 @@ from test_framework.test_framework import BitcoinTestFramework from test_framework.authproxy import JSONRPCException from test_framework.util import assert_equal, initialize_chain_clean, \ - start_node, connect_nodes + start_node, connect_nodes, wait_and_assert_operationid_status import time from decimal import Decimal @@ -33,34 +33,7 @@ class MempoolTxInputLimitTest(BitcoinTestFramework): recipients = [] recipients.append({"address": to_addr, "amount": amount}) myopid = self.nodes[0].z_sendmany(from_addr, recipients) - return self.wait_and_assert_operationid_status(myopid) - - def wait_and_assert_operationid_status(self, myopid, in_status='success', in_errormsg=None): - print('waiting for async operation {}'.format(myopid)) - opids = [] - opids.append(myopid) - timeout = 300 - status = None - errormsg = None - txid = None - for x in xrange(1, timeout): - results = self.nodes[0].z_getoperationresult(opids) - if len(results)==0: - time.sleep(1) - else: - status = results[0]["status"] - if status == "failed": - errormsg = results[0]['error']['message'] - elif status == "success": - txid = results[0]['result']['txid'] - break - print('...returned status: {}'.format(status)) - assert_equal(in_status, status) - if errormsg is not None: - assert(in_errormsg is not None) - assert_equal(in_errormsg in errormsg, True) - print('...returned error: {}'.format(errormsg)) - return txid + return wait_and_assert_operationid_status(self.nodes[0], myopid) def run_test(self): self.nodes[0].generate(100) @@ -126,7 +99,7 @@ class MempoolTxInputLimitTest(BitcoinTestFramework): recipients.append({"address":self.nodes[1].getnewaddress(), "amount": spend_taddr_amount - spend_taddr_output - spend_taddr_output}) myopid = self.nodes[0].z_sendmany(node0_zaddr, recipients) - self.wait_and_assert_operationid_status(myopid) + wait_and_assert_operationid_status(self.nodes[0], myopid) self.nodes[1].generate(1) self.sync_all() diff --git a/qa/rpc-tests/paymentdisclosure.py b/qa/rpc-tests/paymentdisclosure.py index 60d6f188f..30f0f93d5 100755 --- a/qa/rpc-tests/paymentdisclosure.py +++ b/qa/rpc-tests/paymentdisclosure.py @@ -6,9 +6,8 @@ from test_framework.test_framework import BitcoinTestFramework from test_framework.authproxy import JSONRPCException from test_framework.util import assert_equal, initialize_chain_clean, \ - start_node, connect_nodes_bi + start_node, connect_nodes_bi, wait_and_assert_operationid_status -import time from decimal import Decimal class PaymentDisclosureTest (BitcoinTestFramework): @@ -31,34 +30,6 @@ class PaymentDisclosureTest (BitcoinTestFramework): self.is_network_split=False self.sync_all() - # Returns txid if operation was a success or None - def wait_and_assert_operationid_status(self, nodeid, myopid, in_status='success', in_errormsg=None): - print('waiting for async operation {}'.format(myopid)) - opids = [] - opids.append(myopid) - timeout = 300 - status = None - errormsg = None - txid = None - for x in xrange(1, timeout): - results = self.nodes[nodeid].z_getoperationresult(opids) - if len(results)==0: - time.sleep(1) - else: - status = results[0]["status"] - if status == "failed": - errormsg = results[0]['error']['message'] - elif status == "success": - txid = results[0]['result']['txid'] - break - print('...returned status: {}'.format(status)) - assert_equal(in_status, status) - if errormsg is not None: - assert(in_errormsg is not None) - assert(in_errormsg in errormsg) - print('...returned error: {}'.format(errormsg)) - return txid - def run_test (self): print "Mining blocks..." @@ -97,7 +68,7 @@ class PaymentDisclosureTest (BitcoinTestFramework): # Shield coinbase utxos from node 0 of value 40, standard fee of 0.00010000 recipients = [{"address":myzaddr, "amount":Decimal('40.0')-Decimal('0.0001')}] myopid = self.nodes[0].z_sendmany(mytaddr, recipients) - txid = self.wait_and_assert_operationid_status(0, myopid) + txid = wait_and_assert_operationid_status(self.nodes[0], myopid) # Check the tx has joinsplits assert( len(self.nodes[0].getrawtransaction("" + txid, 1)["vjoinsplit"]) > 0 ) @@ -185,7 +156,7 @@ class PaymentDisclosureTest (BitcoinTestFramework): node1zaddr = self.nodes[1].z_getnewaddress() recipients = [{"address":node1zaddr, "amount":Decimal('1')}] myopid = self.nodes[0].z_sendmany(myzaddr, recipients) - txid = self.wait_and_assert_operationid_status(0, myopid) + txid = wait_and_assert_operationid_status(self.nodes[0], myopid) self.sync_all() self.nodes[0].generate(1) self.sync_all() diff --git a/qa/rpc-tests/prioritisetransaction.py b/qa/rpc-tests/prioritisetransaction.py index 9eeb72e8c..134b9b160 100755 --- a/qa/rpc-tests/prioritisetransaction.py +++ b/qa/rpc-tests/prioritisetransaction.py @@ -26,34 +26,6 @@ class PrioritiseTransactionTest (BitcoinTestFramework): self.is_network_split=False self.sync_all() - # Returns txid if operation was a success or None - def wait_and_assert_operationid_status(self, myopid, in_status='success', in_errormsg=None): - print('waiting for async operation {}'.format(myopid)) - opids = [] - opids.append(myopid) - timeout = 300 - status = None - errormsg = None - txid = None - for x in xrange(1, timeout): - results = self.nodes[0].z_getoperationresult(opids) - if len(results)==0: - time.sleep(1) - else: - status = results[0]["status"] - if status == "failed": - errormsg = results[0]['error']['message'] - elif status == "success": - txid = results[0]['result']['txid'] - break - print('...returned status: {}'.format(status)) - assert_equal(in_status, status) - if errormsg is not None: - assert(in_errormsg is not None) - assert_equal(in_errormsg in errormsg, True) - print('...returned error: {}'.format(errormsg)) - return txid - def run_test (self): # tx priority is calculated: priority = sum(input_value_in_base_units * input_age)/size_in_bytes diff --git a/qa/rpc-tests/test_framework/util.py b/qa/rpc-tests/test_framework/util.py index 8ac09f472..92e1b3996 100644 --- a/qa/rpc-tests/test_framework/util.py +++ b/qa/rpc-tests/test_framework/util.py @@ -368,3 +368,31 @@ def assert_raises(exc, fun, *args, **kwds): raise AssertionError("Unexpected exception raised: "+type(e).__name__) else: raise AssertionError("No exception raised") + +# Returns txid if operation was a success or None +def wait_and_assert_operationid_status(node, myopid, in_status='success', in_errormsg=None): + print('waiting for async operation {}'.format(myopid)) + opids = [] + opids.append(myopid) + timeout = 300 + status = None + errormsg = None + txid = None + for x in xrange(1, timeout): + results = node.z_getoperationresult(opids) + if len(results)==0: + time.sleep(1) + else: + status = results[0]["status"] + if status == "failed": + errormsg = results[0]['error']['message'] + elif status == "success": + txid = results[0]['result']['txid'] + break + print('...returned status: {}'.format(status)) + assert_equal(in_status, status) + if errormsg is not None: + assert(in_errormsg is not None) + assert_equal(in_errormsg in errormsg, True) + print('...returned error: {}'.format(errormsg)) + return txid diff --git a/qa/rpc-tests/wallet_1941.py b/qa/rpc-tests/wallet_1941.py index d6f024020..d70b514fc 100755 --- a/qa/rpc-tests/wallet_1941.py +++ b/qa/rpc-tests/wallet_1941.py @@ -8,9 +8,8 @@ from test_framework.test_framework import BitcoinTestFramework from test_framework.util import assert_equal, initialize_chain_clean, \ initialize_datadir, start_nodes, start_node, connect_nodes_bi, \ - bitcoind_processes + bitcoind_processes, wait_and_assert_operationid_status -import time from decimal import Decimal starttime = 1388534400 @@ -41,30 +40,6 @@ class Wallet1941RegressionTest (BitcoinTestFramework): connect_nodes_bi(self.nodes, 0, 1) self.sync_all() - def wait_and_assert_operationid_status(self, myopid, in_status='success', in_errormsg=None): - print('waiting for async operation {}'.format(myopid)) - opids = [] - opids.append(myopid) - timeout = 300 - status = None - errormsg = None - for x in xrange(1, timeout): - results = self.nodes[0].z_getoperationresult(opids) - if len(results)==0: - time.sleep(1) - else: - status = results[0]["status"] - if status == "failed": - errormsg = results[0]['error']['message'] - break - print('...returned status: {}'.format(status)) - print('...error msg: {}'.format(errormsg)) - assert_equal(in_status, status) - if errormsg is not None: - assert(in_errormsg is not None) - assert_equal(in_errormsg in errormsg, True) - print('...returned error: {}'.format(errormsg)) - def run_test (self): print "Mining blocks..." @@ -78,7 +53,7 @@ class Wallet1941RegressionTest (BitcoinTestFramework): recipients = [] recipients.append({"address":myzaddr, "amount":Decimal('10.0') - Decimal('0.0001')}) myopid = self.nodes[0].z_sendmany(mytaddr, recipients) - self.wait_and_assert_operationid_status(myopid) + wait_and_assert_operationid_status(self.nodes[0], myopid) self.nodes[0].generate(1) # Ensure the block times of the latest blocks exceed the variability diff --git a/qa/rpc-tests/wallet_protectcoinbase.py b/qa/rpc-tests/wallet_protectcoinbase.py index e407f0914..90f9653ba 100755 --- a/qa/rpc-tests/wallet_protectcoinbase.py +++ b/qa/rpc-tests/wallet_protectcoinbase.py @@ -7,7 +7,7 @@ from test_framework.test_framework import BitcoinTestFramework from test_framework.authproxy import JSONRPCException from test_framework.util import assert_equal, initialize_chain_clean, \ - start_nodes, connect_nodes_bi, stop_node + start_nodes, connect_nodes_bi, stop_node, wait_and_assert_operationid_status import sys import time @@ -144,7 +144,7 @@ class WalletProtectCoinbaseTest (BitcoinTestFramework): recipients = [] recipients.append({"address":myzaddr, "amount": Decimal('20.0') - Decimal('0.0001')}) myopid = self.nodes[0].z_sendmany(mytaddr, recipients) - mytxid = self.wait_and_assert_operationid_status(myopid) + mytxid = wait_and_assert_operationid_status(self.nodes[0], myopid) self.sync_all() self.nodes[1].generate(1) self.sync_all() @@ -173,7 +173,7 @@ class WalletProtectCoinbaseTest (BitcoinTestFramework): recipients = [] recipients.append({"address":myzaddr, "amount": Decimal('19.9999')}) myopid = self.nodes[0].z_sendmany(myzaddr, recipients, 1, Decimal('0.0')) - mytxid = self.wait_and_assert_operationid_status(myopid) + mytxid = wait_and_assert_operationid_status(self.nodes[0], myopid) self.sync_all() self.nodes[1].generate(1) self.sync_all() @@ -186,7 +186,7 @@ class WalletProtectCoinbaseTest (BitcoinTestFramework): recipients = [] recipients.append({"address":mytaddr, "amount":Decimal('10.0')}) myopid = self.nodes[0].z_sendmany(myzaddr, recipients) - mytxid = self.wait_and_assert_operationid_status(myopid) + mytxid = wait_and_assert_operationid_status(self.nodes[0], myopid) assert(mytxid is not None) self.sync_all() @@ -210,7 +210,7 @@ class WalletProtectCoinbaseTest (BitcoinTestFramework): amount = Decimal('10.0') - Decimal('0.00010000') - Decimal('0.00000001') # this leaves change at 1 zatoshi less than dust threshold recipients.append({"address":self.nodes[0].getnewaddress(), "amount":amount }) myopid = self.nodes[0].z_sendmany(mytaddr, recipients) - self.wait_and_assert_operationid_status(myopid, "failed", "Insufficient transparent funds, have 10.00, need 0.00000053 more to avoid creating invalid change output 0.00000001 (dust threshold is 0.00000054)") + wait_and_assert_operationid_status(self.nodes[0], myopid, "failed", "Insufficient transparent funds, have 10.00, need 0.00000053 more to avoid creating invalid change output 0.00000001 (dust threshold is 0.00000054)") # Send will fail because send amount is too big, even when including coinbase utxos errorString = "" @@ -224,9 +224,9 @@ class WalletProtectCoinbaseTest (BitcoinTestFramework): recipients = [] recipients.append({"address":self.nodes[1].getnewaddress(), "amount":Decimal('10000.0')}) myopid = self.nodes[0].z_sendmany(mytaddr, recipients) - self.wait_and_assert_operationid_status(myopid, "failed", "Insufficient transparent funds, have 10.00, need 10000.0001") + wait_and_assert_operationid_status(self.nodes[0], myopid, "failed", "Insufficient transparent funds, have 10.00, need 10000.0001") myopid = self.nodes[0].z_sendmany(myzaddr, recipients) - self.wait_and_assert_operationid_status(myopid, "failed", "Insufficient protected funds, have 9.9998, need 10000.0001") + wait_and_assert_operationid_status(self.nodes[0], myopid, "failed", "Insufficient protected funds, have 9.9998, need 10000.0001") # Send will fail because of insufficient funds unless sender uses coinbase utxos try: @@ -263,7 +263,7 @@ class WalletProtectCoinbaseTest (BitcoinTestFramework): myopid = self.nodes[0].z_sendmany(myzaddr, recipients) try: - self.wait_and_assert_operationid_status(myopid) + wait_and_assert_operationid_status(self.nodes[0], myopid) except JSONRPCException as e: print("JSONRPC error: "+e.error['message']) assert(False) @@ -326,7 +326,7 @@ class WalletProtectCoinbaseTest (BitcoinTestFramework): newzaddr = self.nodes[2].z_getnewaddress() recipients.append({"address":newzaddr, "amount":amount_per_recipient}) myopid = self.nodes[0].z_sendmany(myzaddr, recipients, minconf, custom_fee) - self.wait_and_assert_operationid_status(myopid) + wait_and_assert_operationid_status(self.nodes[0], myopid) self.sync_all() self.nodes[1].generate(1) self.sync_all() diff --git a/qa/rpc-tests/wallet_shieldcoinbase.py b/qa/rpc-tests/wallet_shieldcoinbase.py index 693326c8a..b77fedcf0 100755 --- a/qa/rpc-tests/wallet_shieldcoinbase.py +++ b/qa/rpc-tests/wallet_shieldcoinbase.py @@ -6,9 +6,9 @@ from test_framework.test_framework import BitcoinTestFramework from test_framework.authproxy import JSONRPCException from test_framework.util import assert_equal, initialize_chain_clean, \ - start_node, connect_nodes_bi, sync_blocks, sync_mempools + start_node, connect_nodes_bi, sync_blocks, sync_mempools, \ + wait_and_assert_operationid_status -import time from decimal import Decimal class WalletShieldCoinbaseTest (BitcoinTestFramework): @@ -30,34 +30,6 @@ class WalletShieldCoinbaseTest (BitcoinTestFramework): self.is_network_split=False self.sync_all() - # Returns txid if operation was a success or None - def wait_and_assert_operationid_status(self, nodeid, myopid, in_status='success', in_errormsg=None): - print('waiting for async operation {}'.format(myopid)) - opids = [] - opids.append(myopid) - timeout = 300 - status = None - errormsg = None - txid = None - for x in xrange(1, timeout): - results = self.nodes[nodeid].z_getoperationresult(opids) - if len(results)==0: - time.sleep(1) - else: - status = results[0]["status"] - if status == "failed": - errormsg = results[0]['error']['message'] - elif status == "success": - txid = results[0]['result']['txid'] - break - print('...returned status: {}'.format(status)) - assert_equal(in_status, status) - if errormsg is not None: - assert(in_errormsg is not None) - assert_equal(in_errormsg in errormsg, True) - print('...returned error: {}'.format(errormsg)) - return txid - def run_test (self): print "Mining blocks..." @@ -130,7 +102,7 @@ class WalletShieldCoinbaseTest (BitcoinTestFramework): # Shield coinbase utxos from node 0 of value 40, standard fee of 0.00010000 result = self.nodes[0].z_shieldcoinbase(mytaddr, myzaddr) - self.wait_and_assert_operationid_status(0, result['opid']) + wait_and_assert_operationid_status(self.nodes[0], result['opid']) self.sync_all() self.nodes[1].generate(1) self.sync_all() @@ -144,7 +116,7 @@ class WalletShieldCoinbaseTest (BitcoinTestFramework): # Shield coinbase utxos from any node 2 taddr, and set fee to 0 result = self.nodes[2].z_shieldcoinbase("*", myzaddr, 0) - self.wait_and_assert_operationid_status(2, result['opid']) + wait_and_assert_operationid_status(self.nodes[2], result['opid']) self.sync_all() self.nodes[1].generate(1) self.sync_all() @@ -181,8 +153,8 @@ class WalletShieldCoinbaseTest (BitcoinTestFramework): opid2 = result['opid'] # wait for both aysnc operations to complete - self.wait_and_assert_operationid_status(0, opid1) - self.wait_and_assert_operationid_status(0, opid2) + wait_and_assert_operationid_status(self.nodes[0], opid1) + wait_and_assert_operationid_status(self.nodes[0], opid2) # sync_all() invokes sync_mempool() but node 2's mempool limit will cause tx1 and tx2 to be rejected. # So instead, we sync on blocks and mempool for node 0 and node 1, and after a new block is generated @@ -198,7 +170,7 @@ class WalletShieldCoinbaseTest (BitcoinTestFramework): result = self.nodes[2].z_shieldcoinbase(mytaddr, myzaddr, Decimal('0.0001'), 0) assert_equal(result["shieldingUTXOs"], Decimal('7')) assert_equal(result["remainingUTXOs"], Decimal('13')) - self.wait_and_assert_operationid_status(2, result['opid']) + wait_and_assert_operationid_status(self.nodes[2], result['opid']) self.sync_all() self.nodes[1].generate(1) self.sync_all() @@ -210,13 +182,13 @@ class WalletShieldCoinbaseTest (BitcoinTestFramework): result = self.nodes[0].z_shieldcoinbase(mytaddr, myzaddr, Decimal('0.0001')) assert_equal(result["shieldingUTXOs"], Decimal('50')) assert_equal(result["remainingUTXOs"], Decimal('50')) - self.wait_and_assert_operationid_status(0, result['opid']) + wait_and_assert_operationid_status(self.nodes[0], result['opid']) # Verify maximum number of utxos which node 0 can shield can be set by the limit parameter result = self.nodes[0].z_shieldcoinbase(mytaddr, myzaddr, Decimal('0.0001'), 33) assert_equal(result["shieldingUTXOs"], Decimal('33')) assert_equal(result["remainingUTXOs"], Decimal('17')) - self.wait_and_assert_operationid_status(0, result['opid']) + wait_and_assert_operationid_status(self.nodes[0], result['opid']) # Don't sync node 2 which rejects the tx due to its mempooltxinputlimit sync_blocks(self.nodes[:2]) sync_mempools(self.nodes[:2]) diff --git a/qa/rpc-tests/wallet_treestate.py b/qa/rpc-tests/wallet_treestate.py index c7fe9bf25..b3edcd7c5 100755 --- a/qa/rpc-tests/wallet_treestate.py +++ b/qa/rpc-tests/wallet_treestate.py @@ -6,7 +6,7 @@ from test_framework.test_framework import BitcoinTestFramework from test_framework.util import assert_equal, initialize_chain_clean, \ - start_nodes, connect_nodes_bi + start_nodes, connect_nodes_bi, wait_and_assert_operationid_status import time from decimal import Decimal @@ -26,30 +26,6 @@ class WalletTreeStateTest (BitcoinTestFramework): self.is_network_split=False self.sync_all() - def wait_and_assert_operationid_status(self, myopid, in_status='success', in_errormsg=None): - print('waiting for async operation {}'.format(myopid)) - opids = [] - opids.append(myopid) - timeout = 300 - status = None - errormsg = None - for x in xrange(1, timeout): - results = self.nodes[0].z_getoperationresult(opids) - if len(results)==0: - time.sleep(1) - else: - status = results[0]["status"] - if status == "failed": - errormsg = results[0]['error']['message'] - break - print('...returned status: {}'.format(status)) - print('...error msg: {}'.format(errormsg)) - assert_equal(in_status, status) - if errormsg is not None: - assert(in_errormsg is not None) - assert_equal(in_errormsg in errormsg, True) - print('...returned error: {}'.format(errormsg)) - def run_test (self): print "Mining blocks..." @@ -65,17 +41,17 @@ class WalletTreeStateTest (BitcoinTestFramework): recipients = [] recipients.append({"address":myzaddr, "amount":Decimal('10.0') - Decimal('0.0001')}) myopid = self.nodes[0].z_sendmany(mytaddr, recipients) - self.wait_and_assert_operationid_status(myopid) + wait_and_assert_operationid_status(self.nodes[0], myopid) self.sync_all() self.nodes[1].generate(1) self.sync_all() myopid = self.nodes[0].z_sendmany(mytaddr, recipients) - self.wait_and_assert_operationid_status(myopid) + wait_and_assert_operationid_status(self.nodes[0], myopid) self.sync_all() self.nodes[1].generate(1) self.sync_all() myopid = self.nodes[0].z_sendmany(mytaddr, recipients) - self.wait_and_assert_operationid_status(myopid) + wait_and_assert_operationid_status(self.nodes[0], myopid) self.sync_all() self.nodes[1].generate(1) self.sync_all() @@ -92,7 +68,7 @@ class WalletTreeStateTest (BitcoinTestFramework): recipients = [] recipients.append({"address":self.nodes[2].z_getnewaddress(), "amount":Decimal('10.0') - Decimal('0.0001')}) myopid = self.nodes[0].z_sendmany(mytaddr, recipients) - self.wait_and_assert_operationid_status(myopid) + wait_and_assert_operationid_status(self.nodes[0], myopid) # Tx 2 will consume all three notes, which must take at least two joinsplits. This is regardless of # the z_sendmany implementation because there are only two inputs per joinsplit. @@ -115,7 +91,7 @@ class WalletTreeStateTest (BitcoinTestFramework): self.sync_all() # Wait for Tx 2 to be created - self.wait_and_assert_operationid_status(myopid) + wait_and_assert_operationid_status(self.nodes[0], myopid) # Note that a bug existed in v1.0.0-1.0.3 where Tx 2 creation would fail with an error: # "Witness for spendable note does not have same anchor as change input" From d4ab94a6d945515ee58fcf869641d2bc530dc9d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Per=20Gr=C3=B6n?= Date: Wed, 13 Dec 2017 07:42:10 +0000 Subject: [PATCH 0365/1062] Print result of RPC call in test only when PYTHON_DEBUG is set --- qa/rpc-tests/test_framework/util.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/qa/rpc-tests/test_framework/util.py b/qa/rpc-tests/test_framework/util.py index 92e1b3996..20267521f 100644 --- a/qa/rpc-tests/test_framework/util.py +++ b/qa/rpc-tests/test_framework/util.py @@ -389,10 +389,12 @@ def wait_and_assert_operationid_status(node, myopid, in_status='success', in_err elif status == "success": txid = results[0]['result']['txid'] break - print('...returned status: {}'.format(status)) assert_equal(in_status, status) if errormsg is not None: assert(in_errormsg is not None) assert_equal(in_errormsg in errormsg, True) - print('...returned error: {}'.format(errormsg)) + if os.getenv("PYTHON_DEBUG", ""): + print('...returned status: {}'.format(status)) + if errormsg is not None: + print('...returned error: {}'.format(errormsg)) return txid From a55c186a74aff36a4be6803770d6f07ec8534ec6 Mon Sep 17 00:00:00 2001 From: syd Date: Fri, 24 Nov 2017 13:54:17 -0500 Subject: [PATCH 0366/1062] Fix libsnark dependency build. This changes libsnark to build in-place, instead of copying first to a build directory. Previously, modifications made to the original sources wouldn't get rebuilt without a 'make clean' because users would be pointing to the copies. This closes #2689. --- src/Makefile.am | 16 +-- src/snark/.gitignore | 83 +++++------ src/snark/Makefile | 134 +++++++++--------- .../algebra/curves/alt_bn128/alt_bn128_g1.cpp | 0 .../algebra/curves/alt_bn128/alt_bn128_g1.hpp | 0 .../algebra/curves/alt_bn128/alt_bn128_g2.cpp | 0 .../algebra/curves/alt_bn128/alt_bn128_g2.hpp | 0 .../curves/alt_bn128/alt_bn128_init.cpp | 0 .../curves/alt_bn128/alt_bn128_init.hpp | 0 .../curves/alt_bn128/alt_bn128_pairing.cpp | 0 .../curves/alt_bn128/alt_bn128_pairing.hpp | 0 .../algebra/curves/alt_bn128/alt_bn128_pp.cpp | 0 .../algebra/curves/alt_bn128/alt_bn128_pp.hpp | 0 .../algebra/curves/curve_utils.hpp | 0 .../algebra/curves/curve_utils.tcc | 0 .../algebra/curves/public_params.hpp | 0 .../algebra/curves/tests/test_bilinearity.cpp | 0 .../algebra/curves/tests/test_groups.cpp | 0 .../domains/basic_radix2_domain.hpp | 0 .../domains/basic_radix2_domain.tcc | 0 .../domains/basic_radix2_domain_aux.hpp | 0 .../domains/basic_radix2_domain_aux.tcc | 0 .../evaluation_domain/evaluation_domain.hpp | 0 .../evaluation_domain/evaluation_domain.tcc | 0 .../algebra/exponentiation/exponentiation.hpp | 0 .../algebra/exponentiation/exponentiation.tcc | 0 .../algebra/fields/bigint.hpp | 0 .../algebra/fields/bigint.tcc | 0 .../algebra/fields/field_utils.hpp | 0 .../algebra/fields/field_utils.tcc | 0 .../{src => libsnark}/algebra/fields/fp.hpp | 0 .../{src => libsnark}/algebra/fields/fp.tcc | 0 .../algebra/fields/fp12_2over3over2.hpp | 0 .../algebra/fields/fp12_2over3over2.tcc | 0 .../{src => libsnark}/algebra/fields/fp2.hpp | 0 .../{src => libsnark}/algebra/fields/fp2.tcc | 0 .../algebra/fields/fp6_3over2.hpp | 0 .../algebra/fields/fp6_3over2.tcc | 0 .../algebra/fields/fp_aux.tcc | 0 .../algebra/fields/tests/test_bigint.cpp | 0 .../algebra/fields/tests/test_fields.cpp | 0 .../knowledge_commitment.hpp | 0 .../knowledge_commitment.tcc | 0 .../scalar_multiplication/kc_multiexp.hpp | 0 .../scalar_multiplication/kc_multiexp.tcc | 0 .../scalar_multiplication/multiexp.hpp | 0 .../scalar_multiplication/multiexp.tcc | 0 .../algebra/scalar_multiplication/wnaf.hpp | 0 .../algebra/scalar_multiplication/wnaf.tcc | 0 .../common/assert_except.hpp | 0 .../data_structures/accumulation_vector.hpp | 0 .../data_structures/accumulation_vector.tcc | 0 .../common/data_structures/merkle_tree.hpp | 0 .../common/data_structures/merkle_tree.tcc | 0 .../common/data_structures/sparse_vector.hpp | 0 .../common/data_structures/sparse_vector.tcc | 0 .../common/default_types/ec_pp.hpp | 0 .../default_types/r1cs_ppzksnark_pp.hpp | 0 .../{src => libsnark}/common/profiling.cpp | 0 .../{src => libsnark}/common/profiling.hpp | 0 .../common/serialization.hpp | 0 .../common/serialization.tcc | 0 .../common/template_utils.hpp | 0 src/snark/{src => libsnark}/common/utils.cpp | 0 src/snark/{src => libsnark}/common/utils.hpp | 0 src/snark/{src => libsnark}/common/utils.tcc | 0 .../gadgetlib1/constraint_profiling.cpp | 0 .../gadgetlib1/constraint_profiling.hpp | 0 .../gadgetlib1/examples/simple_example.hpp | 0 .../gadgetlib1/examples/simple_example.tcc | 0 .../{src => libsnark}/gadgetlib1/gadget.hpp | 0 .../{src => libsnark}/gadgetlib1/gadget.tcc | 0 .../gadgetlib1/gadgets/basic_gadgets.hpp | 0 .../gadgetlib1/gadgets/basic_gadgets.tcc | 0 .../gadgetlib1/gadgets/gadget_from_r1cs.hpp | 0 .../gadgetlib1/gadgets/gadget_from_r1cs.tcc | 0 .../gadgets/hashes/digest_selector_gadget.hpp | 0 .../gadgets/hashes/digest_selector_gadget.tcc | 0 .../gadgetlib1/gadgets/hashes/hash_io.hpp | 0 .../gadgetlib1/gadgets/hashes/hash_io.tcc | 0 .../gadgets/hashes/sha256/sha256_aux.hpp | 0 .../gadgets/hashes/sha256/sha256_aux.tcc | 0 .../hashes/sha256/sha256_components.hpp | 0 .../hashes/sha256/sha256_components.tcc | 0 .../gadgets/hashes/sha256/sha256_gadget.hpp | 0 .../gadgets/hashes/sha256/sha256_gadget.tcc | 0 .../tests/generate_sha256_gadget_tests.py | 0 .../hashes/sha256/tests/pypy_sha256.py | 0 .../sha256/tests/test_sha256_gadget.cpp | 0 .../merkle_authentication_path_variable.hpp | 0 .../merkle_authentication_path_variable.tcc | 0 .../merkle_tree_check_read_gadget.hpp | 0 .../merkle_tree_check_read_gadget.tcc | 0 .../merkle_tree_check_update_gadget.hpp | 0 .../merkle_tree_check_update_gadget.tcc | 0 .../tests/test_merkle_tree_gadgets.cpp | 0 .../gadgetlib1/pb_variable.hpp | 0 .../gadgetlib1/pb_variable.tcc | 0 .../gadgetlib1/protoboard.hpp | 0 .../gadgetlib1/protoboard.tcc | 0 src/snark/{src => libsnark}/gtests.cpp | 0 .../reductions/r1cs_to_qap/r1cs_to_qap.hpp | 0 .../reductions/r1cs_to_qap/r1cs_to_qap.tcc | 0 .../relations/arithmetic_programs/qap/qap.hpp | 0 .../relations/arithmetic_programs/qap/qap.tcc | 0 .../qap/tests/test_qap.cpp | 0 .../r1cs/examples/r1cs_examples.hpp | 0 .../r1cs/examples/r1cs_examples.tcc | 0 .../r1cs/r1cs.hpp | 0 .../r1cs/r1cs.tcc | 0 .../{src => libsnark}/relations/variable.hpp | 0 .../{src => libsnark}/relations/variable.tcc | 0 .../examples/run_r1cs_ppzksnark.hpp | 0 .../examples/run_r1cs_ppzksnark.tcc | 0 .../profiling/profile_r1cs_ppzksnark.cpp | 0 .../r1cs_ppzksnark/r1cs_ppzksnark.hpp | 0 .../r1cs_ppzksnark/r1cs_ppzksnark.tcc | 0 .../r1cs_ppzksnark/r1cs_ppzksnark_params.hpp | 0 .../tests/test_r1cs_ppzksnark.cpp | 0 119 files changed, 114 insertions(+), 119 deletions(-) rename src/snark/{src => libsnark}/algebra/curves/alt_bn128/alt_bn128_g1.cpp (100%) rename src/snark/{src => libsnark}/algebra/curves/alt_bn128/alt_bn128_g1.hpp (100%) rename src/snark/{src => libsnark}/algebra/curves/alt_bn128/alt_bn128_g2.cpp (100%) rename src/snark/{src => libsnark}/algebra/curves/alt_bn128/alt_bn128_g2.hpp (100%) rename src/snark/{src => libsnark}/algebra/curves/alt_bn128/alt_bn128_init.cpp (100%) rename src/snark/{src => libsnark}/algebra/curves/alt_bn128/alt_bn128_init.hpp (100%) rename src/snark/{src => libsnark}/algebra/curves/alt_bn128/alt_bn128_pairing.cpp (100%) rename src/snark/{src => libsnark}/algebra/curves/alt_bn128/alt_bn128_pairing.hpp (100%) rename src/snark/{src => libsnark}/algebra/curves/alt_bn128/alt_bn128_pp.cpp (100%) rename src/snark/{src => libsnark}/algebra/curves/alt_bn128/alt_bn128_pp.hpp (100%) rename src/snark/{src => libsnark}/algebra/curves/curve_utils.hpp (100%) rename src/snark/{src => libsnark}/algebra/curves/curve_utils.tcc (100%) rename src/snark/{src => libsnark}/algebra/curves/public_params.hpp (100%) rename src/snark/{src => libsnark}/algebra/curves/tests/test_bilinearity.cpp (100%) rename src/snark/{src => libsnark}/algebra/curves/tests/test_groups.cpp (100%) rename src/snark/{src => libsnark}/algebra/evaluation_domain/domains/basic_radix2_domain.hpp (100%) rename src/snark/{src => libsnark}/algebra/evaluation_domain/domains/basic_radix2_domain.tcc (100%) rename src/snark/{src => libsnark}/algebra/evaluation_domain/domains/basic_radix2_domain_aux.hpp (100%) rename src/snark/{src => libsnark}/algebra/evaluation_domain/domains/basic_radix2_domain_aux.tcc (100%) rename src/snark/{src => libsnark}/algebra/evaluation_domain/evaluation_domain.hpp (100%) rename src/snark/{src => libsnark}/algebra/evaluation_domain/evaluation_domain.tcc (100%) rename src/snark/{src => libsnark}/algebra/exponentiation/exponentiation.hpp (100%) rename src/snark/{src => libsnark}/algebra/exponentiation/exponentiation.tcc (100%) rename src/snark/{src => libsnark}/algebra/fields/bigint.hpp (100%) rename src/snark/{src => libsnark}/algebra/fields/bigint.tcc (100%) rename src/snark/{src => libsnark}/algebra/fields/field_utils.hpp (100%) rename src/snark/{src => libsnark}/algebra/fields/field_utils.tcc (100%) rename src/snark/{src => libsnark}/algebra/fields/fp.hpp (100%) rename src/snark/{src => libsnark}/algebra/fields/fp.tcc (100%) rename src/snark/{src => libsnark}/algebra/fields/fp12_2over3over2.hpp (100%) rename src/snark/{src => libsnark}/algebra/fields/fp12_2over3over2.tcc (100%) rename src/snark/{src => libsnark}/algebra/fields/fp2.hpp (100%) rename src/snark/{src => libsnark}/algebra/fields/fp2.tcc (100%) rename src/snark/{src => libsnark}/algebra/fields/fp6_3over2.hpp (100%) rename src/snark/{src => libsnark}/algebra/fields/fp6_3over2.tcc (100%) rename src/snark/{src => libsnark}/algebra/fields/fp_aux.tcc (100%) rename src/snark/{src => libsnark}/algebra/fields/tests/test_bigint.cpp (100%) rename src/snark/{src => libsnark}/algebra/fields/tests/test_fields.cpp (100%) rename src/snark/{src => libsnark}/algebra/knowledge_commitment/knowledge_commitment.hpp (100%) rename src/snark/{src => libsnark}/algebra/knowledge_commitment/knowledge_commitment.tcc (100%) rename src/snark/{src => libsnark}/algebra/scalar_multiplication/kc_multiexp.hpp (100%) rename src/snark/{src => libsnark}/algebra/scalar_multiplication/kc_multiexp.tcc (100%) rename src/snark/{src => libsnark}/algebra/scalar_multiplication/multiexp.hpp (100%) rename src/snark/{src => libsnark}/algebra/scalar_multiplication/multiexp.tcc (100%) rename src/snark/{src => libsnark}/algebra/scalar_multiplication/wnaf.hpp (100%) rename src/snark/{src => libsnark}/algebra/scalar_multiplication/wnaf.tcc (100%) rename src/snark/{src => libsnark}/common/assert_except.hpp (100%) rename src/snark/{src => libsnark}/common/data_structures/accumulation_vector.hpp (100%) rename src/snark/{src => libsnark}/common/data_structures/accumulation_vector.tcc (100%) rename src/snark/{src => libsnark}/common/data_structures/merkle_tree.hpp (100%) rename src/snark/{src => libsnark}/common/data_structures/merkle_tree.tcc (100%) rename src/snark/{src => libsnark}/common/data_structures/sparse_vector.hpp (100%) rename src/snark/{src => libsnark}/common/data_structures/sparse_vector.tcc (100%) rename src/snark/{src => libsnark}/common/default_types/ec_pp.hpp (100%) rename src/snark/{src => libsnark}/common/default_types/r1cs_ppzksnark_pp.hpp (100%) rename src/snark/{src => libsnark}/common/profiling.cpp (100%) rename src/snark/{src => libsnark}/common/profiling.hpp (100%) rename src/snark/{src => libsnark}/common/serialization.hpp (100%) rename src/snark/{src => libsnark}/common/serialization.tcc (100%) rename src/snark/{src => libsnark}/common/template_utils.hpp (100%) rename src/snark/{src => libsnark}/common/utils.cpp (100%) rename src/snark/{src => libsnark}/common/utils.hpp (100%) rename src/snark/{src => libsnark}/common/utils.tcc (100%) rename src/snark/{src => libsnark}/gadgetlib1/constraint_profiling.cpp (100%) rename src/snark/{src => libsnark}/gadgetlib1/constraint_profiling.hpp (100%) rename src/snark/{src => libsnark}/gadgetlib1/examples/simple_example.hpp (100%) rename src/snark/{src => libsnark}/gadgetlib1/examples/simple_example.tcc (100%) rename src/snark/{src => libsnark}/gadgetlib1/gadget.hpp (100%) rename src/snark/{src => libsnark}/gadgetlib1/gadget.tcc (100%) rename src/snark/{src => libsnark}/gadgetlib1/gadgets/basic_gadgets.hpp (100%) rename src/snark/{src => libsnark}/gadgetlib1/gadgets/basic_gadgets.tcc (100%) rename src/snark/{src => libsnark}/gadgetlib1/gadgets/gadget_from_r1cs.hpp (100%) rename src/snark/{src => libsnark}/gadgetlib1/gadgets/gadget_from_r1cs.tcc (100%) rename src/snark/{src => libsnark}/gadgetlib1/gadgets/hashes/digest_selector_gadget.hpp (100%) rename src/snark/{src => libsnark}/gadgetlib1/gadgets/hashes/digest_selector_gadget.tcc (100%) rename src/snark/{src => libsnark}/gadgetlib1/gadgets/hashes/hash_io.hpp (100%) rename src/snark/{src => libsnark}/gadgetlib1/gadgets/hashes/hash_io.tcc (100%) rename src/snark/{src => libsnark}/gadgetlib1/gadgets/hashes/sha256/sha256_aux.hpp (100%) rename src/snark/{src => libsnark}/gadgetlib1/gadgets/hashes/sha256/sha256_aux.tcc (100%) rename src/snark/{src => libsnark}/gadgetlib1/gadgets/hashes/sha256/sha256_components.hpp (100%) rename src/snark/{src => libsnark}/gadgetlib1/gadgets/hashes/sha256/sha256_components.tcc (100%) rename src/snark/{src => libsnark}/gadgetlib1/gadgets/hashes/sha256/sha256_gadget.hpp (100%) rename src/snark/{src => libsnark}/gadgetlib1/gadgets/hashes/sha256/sha256_gadget.tcc (100%) rename src/snark/{src => libsnark}/gadgetlib1/gadgets/hashes/sha256/tests/generate_sha256_gadget_tests.py (100%) rename src/snark/{src => libsnark}/gadgetlib1/gadgets/hashes/sha256/tests/pypy_sha256.py (100%) rename src/snark/{src => libsnark}/gadgetlib1/gadgets/hashes/sha256/tests/test_sha256_gadget.cpp (100%) rename src/snark/{src => libsnark}/gadgetlib1/gadgets/merkle_tree/merkle_authentication_path_variable.hpp (100%) rename src/snark/{src => libsnark}/gadgetlib1/gadgets/merkle_tree/merkle_authentication_path_variable.tcc (100%) rename src/snark/{src => libsnark}/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_read_gadget.hpp (100%) rename src/snark/{src => libsnark}/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_read_gadget.tcc (100%) rename src/snark/{src => libsnark}/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_update_gadget.hpp (100%) rename src/snark/{src => libsnark}/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_update_gadget.tcc (100%) rename src/snark/{src => libsnark}/gadgetlib1/gadgets/merkle_tree/tests/test_merkle_tree_gadgets.cpp (100%) rename src/snark/{src => libsnark}/gadgetlib1/pb_variable.hpp (100%) rename src/snark/{src => libsnark}/gadgetlib1/pb_variable.tcc (100%) rename src/snark/{src => libsnark}/gadgetlib1/protoboard.hpp (100%) rename src/snark/{src => libsnark}/gadgetlib1/protoboard.tcc (100%) rename src/snark/{src => libsnark}/gtests.cpp (100%) rename src/snark/{src => libsnark}/reductions/r1cs_to_qap/r1cs_to_qap.hpp (100%) rename src/snark/{src => libsnark}/reductions/r1cs_to_qap/r1cs_to_qap.tcc (100%) rename src/snark/{src => libsnark}/relations/arithmetic_programs/qap/qap.hpp (100%) rename src/snark/{src => libsnark}/relations/arithmetic_programs/qap/qap.tcc (100%) rename src/snark/{src => libsnark}/relations/arithmetic_programs/qap/tests/test_qap.cpp (100%) rename src/snark/{src => libsnark}/relations/constraint_satisfaction_problems/r1cs/examples/r1cs_examples.hpp (100%) rename src/snark/{src => libsnark}/relations/constraint_satisfaction_problems/r1cs/examples/r1cs_examples.tcc (100%) rename src/snark/{src => libsnark}/relations/constraint_satisfaction_problems/r1cs/r1cs.hpp (100%) rename src/snark/{src => libsnark}/relations/constraint_satisfaction_problems/r1cs/r1cs.tcc (100%) rename src/snark/{src => libsnark}/relations/variable.hpp (100%) rename src/snark/{src => libsnark}/relations/variable.tcc (100%) rename src/snark/{src => libsnark}/zk_proof_systems/ppzksnark/r1cs_ppzksnark/examples/run_r1cs_ppzksnark.hpp (100%) rename src/snark/{src => libsnark}/zk_proof_systems/ppzksnark/r1cs_ppzksnark/examples/run_r1cs_ppzksnark.tcc (100%) rename src/snark/{src => libsnark}/zk_proof_systems/ppzksnark/r1cs_ppzksnark/profiling/profile_r1cs_ppzksnark.cpp (100%) rename src/snark/{src => libsnark}/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.hpp (100%) rename src/snark/{src => libsnark}/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.tcc (100%) rename src/snark/{src => libsnark}/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark_params.hpp (100%) rename src/snark/{src => libsnark}/zk_proof_systems/ppzksnark/r1cs_ppzksnark/tests/test_r1cs_ppzksnark.cpp (100%) diff --git a/src/Makefile.am b/src/Makefile.am index 25038c1ee..44b4d8281 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -23,8 +23,8 @@ BITCOIN_CONFIG_INCLUDES=-I$(builddir)/config BITCOIN_INCLUDES=-I$(builddir) -I$(builddir)/obj $(BOOST_CPPFLAGS) $(LEVELDB_CPPFLAGS) $(CRYPTO_CFLAGS) $(SSL_CFLAGS) BITCOIN_INCLUDES += -I$(srcdir)/secp256k1/include -BITCOIN_INCLUDES += -I$(srcdir)/snark/build/include -BITCOIN_INCLUDES += -I$(srcdir)/snark/build/include/libsnark +BITCOIN_INCLUDES += -I$(srcdir)/snark +BITCOIN_INCLUDES += -I$(srcdir)/snark/libsnark BITCOIN_INCLUDES += -I$(srcdir)/univalue/include LIBBITCOIN_SERVER=libbitcoin_server.a @@ -34,19 +34,13 @@ LIBBITCOIN_CLI=libbitcoin_cli.a LIBBITCOIN_UTIL=libbitcoin_util.a LIBBITCOIN_CRYPTO=crypto/libbitcoin_crypto.a LIBSECP256K1=secp256k1/libsecp256k1.la -LIBSNARK=snark/build/lib/libsnark.a +LIBSNARK=snark/libsnark.a LIBUNIVALUE=univalue/libunivalue.la LIBZCASH=libzcash.a $(LIBSECP256K1): $(wildcard secp256k1/src/*) $(wildcard secp256k1/include/*) $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C $(@D) $(@F) -# A phony target is included here to ensure libsnark is built first, so that its -# header files are collated for use in later build steps. -# See https://stackoverflow.com/a/10726725 --include collate-libsnark -collate-libsnark: $(LIBSNARK) - LIBSNARK_CXXFLAGS = -fPIC -DBINARY_OUTPUT -DNO_PT_COMPRESSION=1 -fstack-protector-all LIBSNARK_CONFIG_FLAGS = CURVE=ALT_BN128 NO_PROCPS=1 NO_DOCS=1 STATIC=1 NO_SUPERCOP=1 FEATUREFLAGS=-DMONTGOMERY_OUTPUT NO_COPY_DEPINST=1 NO_COMPILE_LIBGTEST=1 if HAVE_OPENMP @@ -54,10 +48,10 @@ LIBSNARK_CONFIG_FLAGS += MULTICORE=1 endif $(LIBSNARK): $(wildcard snark/src/*) - $(AM_V_at) CXXFLAGS="$(LIBSNARK_CXXFLAGS)" $(MAKE) $(AM_MAKEFLAGS) -C snark/ install PREFIX=$(srcdir)/build DEPINST="$(LIBSNARK_DEPINST)" $(LIBSNARK_CONFIG_FLAGS) OPTFLAGS="-O2 -march=x86-64" + $(AM_V_at) CXXFLAGS="$(LIBSNARK_CXXFLAGS)" $(MAKE) $(AM_MAKEFLAGS) -C snark/ DEPINST="$(LIBSNARK_DEPINST)" $(LIBSNARK_CONFIG_FLAGS) OPTFLAGS="-O2 -march=x86-64" libsnark-tests: $(wildcard snark/src/*) - $(AM_V_at) CXXFLAGS="$(LIBSNARK_CXXFLAGS)" $(MAKE) $(AM_MAKEFLAGS) -C snark/ check PREFIX=$(srcdir)/build DEPINST="$(LIBSNARK_DEPINST)" $(LIBSNARK_CONFIG_FLAGS) OPTFLAGS="-O2 -march=x86-64" + $(AM_V_at) CXXFLAGS="$(LIBSNARK_CXXFLAGS)" $(MAKE) $(AM_MAKEFLAGS) -C snark/ check DEPINST="$(LIBSNARK_DEPINST)" $(LIBSNARK_CONFIG_FLAGS) OPTFLAGS="-O2 -march=x86-64" $(LIBUNIVALUE): $(wildcard univalue/lib/*) $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C univalue/ diff --git a/src/snark/.gitignore b/src/snark/.gitignore index bb48e1aba..ea2a20f44 100644 --- a/src/snark/.gitignore +++ b/src/snark/.gitignore @@ -2,49 +2,50 @@ *.a *.so *.d +libsnark/gtests depinst/ depsrc/ README.html doxygen/ -src/gtests -src/gadgetlib2/examples/tutorial -src/gadgetlib2/tests/gadgetlib2_test +libsnark/gtests +libsnark/gadgetlib2/examples/tutorial +libsnark/gadgetlib2/tests/gadgetlib2_test -src/algebra/curves/tests/test_bilinearity -src/algebra/curves/tests/test_groups -src/algebra/fields/tests/test_fields -src/common/routing_algorithms/profiling/profile_routing_algorithms -src/common/routing_algorithms/tests/test_routing_algorithms -src/gadgetlib1/gadgets/cpu_checkers/fooram/examples/test_fooram -src/gadgetlib1/gadgets/hashes/knapsack/tests/test_knapsack_gadget -src/gadgetlib1/gadgets/hashes/sha256/tests/test_sha256_gadget -src/gadgetlib1/gadgets/merkle_tree/tests/test_merkle_tree_gadgets -src/gadgetlib1/gadgets/routing/profiling/profile_routing_gadgets -src/gadgetlib1/gadgets/set_commitment/tests/test_set_commitment_gadget -src/gadgetlib1/gadgets/verifiers/tests/test_r1cs_ppzksnark_verifier_gadget -src/reductions/ram_to_r1cs/examples/demo_arithmetization -src/relations/arithmetic_programs/qap/tests/test_qap -src/relations/arithmetic_programs/ssp/tests/test_ssp -src/zk_proof_systems/pcd/r1cs_pcd/r1cs_mp_ppzkpcd/profiling/profile_r1cs_mp_ppzkpcd -src/zk_proof_systems/pcd/r1cs_pcd/r1cs_mp_ppzkpcd/tests/test_r1cs_mp_ppzkpcd -src/zk_proof_systems/pcd/r1cs_pcd/r1cs_sp_ppzkpcd/profiling/profile_r1cs_sp_ppzkpcd -src/zk_proof_systems/pcd/r1cs_pcd/r1cs_sp_ppzkpcd/tests/test_r1cs_sp_ppzkpcd -src/zk_proof_systems/ppzkadsnark/r1cs_ppzkadsnark/examples/demo_r1cs_ppzkadsnark -src/zk_proof_systems/ppzksnark/bacs_ppzksnark/profiling/profile_bacs_ppzksnark -src/zk_proof_systems/ppzksnark/bacs_ppzksnark/tests/test_bacs_ppzksnark -src/zk_proof_systems/ppzksnark/r1cs_gg_ppzksnark/profiling/profile_r1cs_gg_ppzksnark -src/zk_proof_systems/ppzksnark/r1cs_gg_ppzksnark/tests/test_r1cs_gg_ppzksnark -src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/profiling/profile_r1cs_ppzksnark -src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/tests/test_r1cs_ppzksnark -src/zk_proof_systems/ppzksnark/ram_ppzksnark/examples/demo_ram_ppzksnark -src/zk_proof_systems/ppzksnark/ram_ppzksnark/examples/demo_ram_ppzksnark_generator -src/zk_proof_systems/ppzksnark/ram_ppzksnark/examples/demo_ram_ppzksnark_prover -src/zk_proof_systems/ppzksnark/ram_ppzksnark/examples/demo_ram_ppzksnark_verifier -src/zk_proof_systems/ppzksnark/ram_ppzksnark/profiling/profile_ram_ppzksnark -src/zk_proof_systems/ppzksnark/ram_ppzksnark/tests/test_ram_ppzksnark -src/zk_proof_systems/ppzksnark/tbcs_ppzksnark/profiling/profile_tbcs_ppzksnark -src/zk_proof_systems/ppzksnark/tbcs_ppzksnark/tests/test_tbcs_ppzksnark -src/zk_proof_systems/ppzksnark/uscs_ppzksnark/profiling/profile_uscs_ppzksnark -src/zk_proof_systems/ppzksnark/uscs_ppzksnark/tests/test_uscs_ppzksnark -src/zk_proof_systems/zksnark/ram_zksnark/profiling/profile_ram_zksnark -src/zk_proof_systems/zksnark/ram_zksnark/tests/test_ram_zksnark +libsnark/algebra/curves/tests/test_bilinearity +libsnark/algebra/curves/tests/test_groups +libsnark/algebra/fields/tests/test_fields +libsnark/common/routing_algorithms/profiling/profile_routing_algorithms +libsnark/common/routing_algorithms/tests/test_routing_algorithms +libsnark/gadgetlib1/gadgets/cpu_checkers/fooram/examples/test_fooram +libsnark/gadgetlib1/gadgets/hashes/knapsack/tests/test_knapsack_gadget +libsnark/gadgetlib1/gadgets/hashes/sha256/tests/test_sha256_gadget +libsnark/gadgetlib1/gadgets/merkle_tree/tests/test_merkle_tree_gadgets +libsnark/gadgetlib1/gadgets/routing/profiling/profile_routing_gadgets +libsnark/gadgetlib1/gadgets/set_commitment/tests/test_set_commitment_gadget +libsnark/gadgetlib1/gadgets/verifiers/tests/test_r1cs_ppzksnark_verifier_gadget +libsnark/reductions/ram_to_r1cs/examples/demo_arithmetization +libsnark/relations/arithmetic_programs/qap/tests/test_qap +libsnark/relations/arithmetic_programs/ssp/tests/test_ssp +libsnark/zk_proof_systems/pcd/r1cs_pcd/r1cs_mp_ppzkpcd/profiling/profile_r1cs_mp_ppzkpcd +libsnark/zk_proof_systems/pcd/r1cs_pcd/r1cs_mp_ppzkpcd/tests/test_r1cs_mp_ppzkpcd +libsnark/zk_proof_systems/pcd/r1cs_pcd/r1cs_sp_ppzkpcd/profiling/profile_r1cs_sp_ppzkpcd +libsnark/zk_proof_systems/pcd/r1cs_pcd/r1cs_sp_ppzkpcd/tests/test_r1cs_sp_ppzkpcd +libsnark/zk_proof_systems/ppzkadsnark/r1cs_ppzkadsnark/examples/demo_r1cs_ppzkadsnark +libsnark/zk_proof_systems/ppzksnark/bacs_ppzksnark/profiling/profile_bacs_ppzksnark +libsnark/zk_proof_systems/ppzksnark/bacs_ppzksnark/tests/test_bacs_ppzksnark +libsnark/zk_proof_systems/ppzksnark/r1cs_gg_ppzksnark/profiling/profile_r1cs_gg_ppzksnark +libsnark/zk_proof_systems/ppzksnark/r1cs_gg_ppzksnark/tests/test_r1cs_gg_ppzksnark +libsnark/zk_proof_systems/ppzksnark/r1cs_ppzksnark/profiling/profile_r1cs_ppzksnark +libsnark/zk_proof_systems/ppzksnark/r1cs_ppzksnark/tests/test_r1cs_ppzksnark +libsnark/zk_proof_systems/ppzksnark/ram_ppzksnark/examples/demo_ram_ppzksnark +libsnark/zk_proof_systems/ppzksnark/ram_ppzksnark/examples/demo_ram_ppzksnark_generator +libsnark/zk_proof_systems/ppzksnark/ram_ppzksnark/examples/demo_ram_ppzksnark_prover +libsnark/zk_proof_systems/ppzksnark/ram_ppzksnark/examples/demo_ram_ppzksnark_verifier +libsnark/zk_proof_systems/ppzksnark/ram_ppzksnark/profiling/profile_ram_ppzksnark +libsnark/zk_proof_systems/ppzksnark/ram_ppzksnark/tests/test_ram_ppzksnark +libsnark/zk_proof_systems/ppzksnark/tbcs_ppzksnark/profiling/profile_tbcs_ppzksnark +libsnark/zk_proof_systems/ppzksnark/tbcs_ppzksnark/tests/test_tbcs_ppzksnark +libsnark/zk_proof_systems/ppzksnark/uscs_ppzksnark/profiling/profile_uscs_ppzksnark +libsnark/zk_proof_systems/ppzksnark/uscs_ppzksnark/tests/test_uscs_ppzksnark +libsnark/zk_proof_systems/zksnark/ram_zksnark/profiling/profile_ram_zksnark +libsnark/zk_proof_systems/zksnark/ram_zksnark/tests/test_ram_zksnark diff --git a/src/snark/Makefile b/src/snark/Makefile index 1583facf7..b865f992f 100644 --- a/src/snark/Makefile +++ b/src/snark/Makefile @@ -17,7 +17,7 @@ CXXFLAGS += -std=c++11 -Wall -Wextra -Wno-unused-parameter -Wno-comment -Wfatal- DEPSRC = depsrc DEPINST = depinst -CXXFLAGS += -I$(DEPINST)/include -Isrc +CXXFLAGS += -I$(DEPINST)/include -Ilibsnark LDFLAGS += -L$(DEPINST)/lib -Wl,-rpath,$(DEPINST)/lib LDLIBS += -lgmpxx -lgmp -lboost_program_options-mt -lsodium # List of .a files to include within libsnark.a and libsnark.so: @@ -44,23 +44,23 @@ ifneq ($(NO_SUPERCOP),1) endif LIB_SRCS = \ - src/algebra/curves/alt_bn128/alt_bn128_g1.cpp \ - src/algebra/curves/alt_bn128/alt_bn128_g2.cpp \ - src/algebra/curves/alt_bn128/alt_bn128_init.cpp \ - src/algebra/curves/alt_bn128/alt_bn128_pairing.cpp \ - src/algebra/curves/alt_bn128/alt_bn128_pp.cpp \ - src/common/profiling.cpp \ - src/common/utils.cpp \ - src/gadgetlib1/constraint_profiling.cpp \ + libsnark/algebra/curves/alt_bn128/alt_bn128_g1.cpp \ + libsnark/algebra/curves/alt_bn128/alt_bn128_g2.cpp \ + libsnark/algebra/curves/alt_bn128/alt_bn128_init.cpp \ + libsnark/algebra/curves/alt_bn128/alt_bn128_pairing.cpp \ + libsnark/algebra/curves/alt_bn128/alt_bn128_pp.cpp \ + libsnark/common/profiling.cpp \ + libsnark/common/utils.cpp \ + libsnark/gadgetlib1/constraint_profiling.cpp \ ifeq ($(CURVE),BN128) LIB_SRCS += \ - src/algebra/curves/bn128/bn128_g1.cpp \ - src/algebra/curves/bn128/bn128_g2.cpp \ - src/algebra/curves/bn128/bn128_gt.cpp \ - src/algebra/curves/bn128/bn128_init.cpp \ - src/algebra/curves/bn128/bn128_pairing.cpp \ - src/algebra/curves/bn128/bn128_pp.cpp + libsnark/algebra/curves/bn128/bn128_g1.cpp \ + libsnark/algebra/curves/bn128/bn128_g2.cpp \ + libsnark/algebra/curves/bn128/bn128_gt.cpp \ + libsnark/algebra/curves/bn128/bn128_init.cpp \ + libsnark/algebra/curves/bn128/bn128_pairing.cpp \ + libsnark/algebra/curves/bn128/bn128_pp.cpp CXXFLAGS += -DBN_SUPPORT_SNARK AR_LIBS += $(DEPINST)/lib/libzm.a @@ -68,56 +68,56 @@ endif # FIXME: most of these are broken due to removed code. DISABLED_EXECUTABLES = \ - src/common/routing_algorithms/profiling/profile_routing_algorithms \ - src/common/routing_algorithms/tests/test_routing_algorithms \ - src/gadgetlib1/gadgets/cpu_checkers/fooram/examples/test_fooram \ - src/gadgetlib1/gadgets/hashes/knapsack/tests/test_knapsack_gadget \ - src/gadgetlib1/gadgets/routing/profiling/profile_routing_gadgets \ - src/gadgetlib1/gadgets/set_commitment/tests/test_set_commitment_gadget \ - src/gadgetlib1/gadgets/verifiers/tests/test_r1cs_ppzksnark_verifier_gadget \ - src/reductions/ram_to_r1cs/examples/demo_arithmetization \ - src/relations/arithmetic_programs/ssp/tests/test_ssp \ - src/zk_proof_systems/pcd/r1cs_pcd/r1cs_mp_ppzkpcd/profiling/profile_r1cs_mp_ppzkpcd \ - src/zk_proof_systems/pcd/r1cs_pcd/r1cs_mp_ppzkpcd/tests/test_r1cs_mp_ppzkpcd \ - src/zk_proof_systems/pcd/r1cs_pcd/r1cs_sp_ppzkpcd/profiling/profile_r1cs_sp_ppzkpcd \ - src/zk_proof_systems/pcd/r1cs_pcd/r1cs_sp_ppzkpcd/tests/test_r1cs_sp_ppzkpcd \ - src/zk_proof_systems/ppzksnark/bacs_ppzksnark/profiling/profile_bacs_ppzksnark \ - src/zk_proof_systems/ppzksnark/bacs_ppzksnark/tests/test_bacs_ppzksnark \ - src/zk_proof_systems/ppzksnark/r1cs_gg_ppzksnark/profiling/profile_r1cs_gg_ppzksnark \ - src/zk_proof_systems/ppzksnark/r1cs_gg_ppzksnark/tests/test_r1cs_gg_ppzksnark \ - src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/profiling/profile_r1cs_ppzksnark \ - src/zk_proof_systems/ppzksnark/ram_ppzksnark/examples/demo_ram_ppzksnark \ - src/zk_proof_systems/ppzksnark/ram_ppzksnark/examples/demo_ram_ppzksnark_generator \ - src/zk_proof_systems/ppzksnark/ram_ppzksnark/examples/demo_ram_ppzksnark_prover \ - src/zk_proof_systems/ppzksnark/ram_ppzksnark/examples/demo_ram_ppzksnark_verifier \ - src/zk_proof_systems/ppzksnark/ram_ppzksnark/profiling/profile_ram_ppzksnark \ - src/zk_proof_systems/ppzksnark/ram_ppzksnark/tests/test_ram_ppzksnark \ - src/zk_proof_systems/ppzksnark/tbcs_ppzksnark/profiling/profile_tbcs_ppzksnark \ - src/zk_proof_systems/ppzksnark/tbcs_ppzksnark/tests/test_tbcs_ppzksnark \ - src/zk_proof_systems/ppzksnark/uscs_ppzksnark/profiling/profile_uscs_ppzksnark \ - src/zk_proof_systems/ppzksnark/uscs_ppzksnark/tests/test_uscs_ppzksnark \ - src/zk_proof_systems/zksnark/ram_zksnark/profiling/profile_ram_zksnark \ - src/zk_proof_systems/zksnark/ram_zksnark/tests/test_ram_zksnark + libsnark/common/routing_algorithms/profiling/profile_routing_algorithms \ + libsnark/common/routing_algorithms/tests/test_routing_algorithms \ + libsnark/gadgetlib1/gadgets/cpu_checkers/fooram/examples/test_fooram \ + libsnark/gadgetlib1/gadgets/hashes/knapsack/tests/test_knapsack_gadget \ + libsnark/gadgetlib1/gadgets/routing/profiling/profile_routing_gadgets \ + libsnark/gadgetlib1/gadgets/set_commitment/tests/test_set_commitment_gadget \ + libsnark/gadgetlib1/gadgets/verifiers/tests/test_r1cs_ppzksnark_verifier_gadget \ + libsnark/reductions/ram_to_r1cs/examples/demo_arithmetization \ + libsnark/relations/arithmetic_programs/ssp/tests/test_ssp \ + libsnark/zk_proof_systems/pcd/r1cs_pcd/r1cs_mp_ppzkpcd/profiling/profile_r1cs_mp_ppzkpcd \ + libsnark/zk_proof_systems/pcd/r1cs_pcd/r1cs_mp_ppzkpcd/tests/test_r1cs_mp_ppzkpcd \ + libsnark/zk_proof_systems/pcd/r1cs_pcd/r1cs_sp_ppzkpcd/profiling/profile_r1cs_sp_ppzkpcd \ + libsnark/zk_proof_systems/pcd/r1cs_pcd/r1cs_sp_ppzkpcd/tests/test_r1cs_sp_ppzkpcd \ + libsnark/zk_proof_systems/ppzksnark/bacs_ppzksnark/profiling/profile_bacs_ppzksnark \ + libsnark/zk_proof_systems/ppzksnark/bacs_ppzksnark/tests/test_bacs_ppzksnark \ + libsnark/zk_proof_systems/ppzksnark/r1cs_gg_ppzksnark/profiling/profile_r1cs_gg_ppzksnark \ + libsnark/zk_proof_systems/ppzksnark/r1cs_gg_ppzksnark/tests/test_r1cs_gg_ppzksnark \ + libsnark/zk_proof_systems/ppzksnark/r1cs_ppzksnark/profiling/profile_r1cs_ppzksnark \ + libsnark/zk_proof_systems/ppzksnark/ram_ppzksnark/examples/demo_ram_ppzksnark \ + libsnark/zk_proof_systems/ppzksnark/ram_ppzksnark/examples/demo_ram_ppzksnark_generator \ + libsnark/zk_proof_systems/ppzksnark/ram_ppzksnark/examples/demo_ram_ppzksnark_prover \ + libsnark/zk_proof_systems/ppzksnark/ram_ppzksnark/examples/demo_ram_ppzksnark_verifier \ + libsnark/zk_proof_systems/ppzksnark/ram_ppzksnark/profiling/profile_ram_ppzksnark \ + libsnark/zk_proof_systems/ppzksnark/ram_ppzksnark/tests/test_ram_ppzksnark \ + libsnark/zk_proof_systems/ppzksnark/tbcs_ppzksnark/profiling/profile_tbcs_ppzksnark \ + libsnark/zk_proof_systems/ppzksnark/tbcs_ppzksnark/tests/test_tbcs_ppzksnark \ + libsnark/zk_proof_systems/ppzksnark/uscs_ppzksnark/profiling/profile_uscs_ppzksnark \ + libsnark/zk_proof_systems/ppzksnark/uscs_ppzksnark/tests/test_uscs_ppzksnark \ + libsnark/zk_proof_systems/zksnark/ram_zksnark/profiling/profile_ram_zksnark \ + libsnark/zk_proof_systems/zksnark/ram_zksnark/tests/test_ram_zksnark EXECUTABLES = EXECUTABLES_WITH_GTEST = EXECUTABLES_WITH_SUPERCOP = \ - src/zk_proof_systems/ppzkadsnark/r1cs_ppzkadsnark/examples/demo_r1cs_ppzkadsnark + libsnark/zk_proof_systems/ppzkadsnark/r1cs_ppzkadsnark/examples/demo_r1cs_ppzkadsnark -GTEST_TESTS = src/gtests +GTEST_TESTS = libsnark/gtests GTEST_SRCS = \ - src/algebra/curves/tests/test_bilinearity.cpp \ - src/algebra/curves/tests/test_groups.cpp \ - src/algebra/fields/tests/test_bigint.cpp \ - src/algebra/fields/tests/test_fields.cpp \ - src/gadgetlib1/gadgets/hashes/sha256/tests/test_sha256_gadget.cpp \ - src/gadgetlib1/gadgets/merkle_tree/tests/test_merkle_tree_gadgets.cpp \ - src/relations/arithmetic_programs/qap/tests/test_qap.cpp \ - src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/tests/test_r1cs_ppzksnark.cpp \ - src/gtests.cpp + libsnark/algebra/curves/tests/test_bilinearity.cpp \ + libsnark/algebra/curves/tests/test_groups.cpp \ + libsnark/algebra/fields/tests/test_bigint.cpp \ + libsnark/algebra/fields/tests/test_fields.cpp \ + libsnark/gadgetlib1/gadgets/hashes/sha256/tests/test_sha256_gadget.cpp \ + libsnark/gadgetlib1/gadgets/merkle_tree/tests/test_merkle_tree_gadgets.cpp \ + libsnark/relations/arithmetic_programs/qap/tests/test_qap.cpp \ + libsnark/zk_proof_systems/ppzksnark/r1cs_ppzksnark/tests/test_r1cs_ppzksnark.cpp \ + libsnark/gtests.cpp DOCS = README.html @@ -192,7 +192,7 @@ $(LIB_OBJS) $(if $(NO_GTEST),,$(GTEST_OBJS)) $(EXEC_OBJS): %.o: %.cpp LIBGTEST_A = $(DEPINST)/lib/libgtest.a -$(LIBGTEST_A): $(GTESTDIR)/src/gtest-all.cc $(DEPINST_EXISTS) +$(LIBGTEST_A): $(GTESTDIR)/libsnark/gtest-all.cc $(DEPINST_EXISTS) $(CXX) -o $(DEPINST)/lib/gtest-all.o -I $(GTESTDIR) -c -isystem $(GTESTDIR)/include $< $(CXXFLAGS) $(AR) -rv $(LIBGTEST_A) $(DEPINST)/lib/gtest-all.o @@ -205,13 +205,13 @@ $(LIBSNARK_A): $(LIB_OBJS) $(AR_LIBS) libsnark.so: $(LIBSNARK_A) $(DEPINST_EXISTS) $(CXX) -o $@ --shared -Wl,--whole-archive $(LIBSNARK_A) $(CXXFLAGS) $(LDFLAGS) -Wl,--no-whole-archive $(LDLIBS) -src/gadgetlib2/tests/gadgetlib2_test: \ - src/gadgetlib2/tests/adapters_UTEST.cpp \ - src/gadgetlib2/tests/constraint_UTEST.cpp \ - src/gadgetlib2/tests/gadget_UTEST.cpp \ - src/gadgetlib2/tests/integration_UTEST.cpp \ - src/gadgetlib2/tests/protoboard_UTEST.cpp \ - src/gadgetlib2/tests/variable_UTEST.cpp +libsnark/gadgetlib2/tests/gadgetlib2_test: \ + libsnark/gadgetlib2/tests/adapters_UTEST.cpp \ + libsnark/gadgetlib2/tests/constraint_UTEST.cpp \ + libsnark/gadgetlib2/tests/gadget_UTEST.cpp \ + libsnark/gadgetlib2/tests/integration_UTEST.cpp \ + libsnark/gadgetlib2/tests/protoboard_UTEST.cpp \ + libsnark/gadgetlib2/tests/variable_UTEST.cpp $(EXECUTABLES): %: %.o $(LIBSNARK_A) $(DEPINST_EXISTS) $(CXX) -o $@ $@.o $(LIBSNARK_A) $(CXXFLAGS) $(LDFLAGS) $(LDLIBS) @@ -243,10 +243,10 @@ ifeq ($(PREFIX),) install: $(error Please provide PREFIX. E.g. make install PREFIX=/usr) else -HEADERS_SRC=$(shell find src -name '*.hpp' -o -name '*.tcc') -HEADERS_DEST=$(patsubst src/%,$(PREFIX)/include/libsnark/%,$(HEADERS_SRC)) +HEADERS_SRC=$(shell find libsnark -name '*.hpp' -o -name '*.tcc') +HEADERS_DEST=$(patsubst libsnark/%,$(PREFIX)/include/libsnark/%,$(HEADERS_SRC)) -$(HEADERS_DEST): $(PREFIX)/include/libsnark/%: src/% +$(HEADERS_DEST): $(PREFIX)/include/libsnark/%: libsnark/% mkdir -p $(shell dirname $@) cp $< $@ diff --git a/src/snark/src/algebra/curves/alt_bn128/alt_bn128_g1.cpp b/src/snark/libsnark/algebra/curves/alt_bn128/alt_bn128_g1.cpp similarity index 100% rename from src/snark/src/algebra/curves/alt_bn128/alt_bn128_g1.cpp rename to src/snark/libsnark/algebra/curves/alt_bn128/alt_bn128_g1.cpp diff --git a/src/snark/src/algebra/curves/alt_bn128/alt_bn128_g1.hpp b/src/snark/libsnark/algebra/curves/alt_bn128/alt_bn128_g1.hpp similarity index 100% rename from src/snark/src/algebra/curves/alt_bn128/alt_bn128_g1.hpp rename to src/snark/libsnark/algebra/curves/alt_bn128/alt_bn128_g1.hpp diff --git a/src/snark/src/algebra/curves/alt_bn128/alt_bn128_g2.cpp b/src/snark/libsnark/algebra/curves/alt_bn128/alt_bn128_g2.cpp similarity index 100% rename from src/snark/src/algebra/curves/alt_bn128/alt_bn128_g2.cpp rename to src/snark/libsnark/algebra/curves/alt_bn128/alt_bn128_g2.cpp diff --git a/src/snark/src/algebra/curves/alt_bn128/alt_bn128_g2.hpp b/src/snark/libsnark/algebra/curves/alt_bn128/alt_bn128_g2.hpp similarity index 100% rename from src/snark/src/algebra/curves/alt_bn128/alt_bn128_g2.hpp rename to src/snark/libsnark/algebra/curves/alt_bn128/alt_bn128_g2.hpp diff --git a/src/snark/src/algebra/curves/alt_bn128/alt_bn128_init.cpp b/src/snark/libsnark/algebra/curves/alt_bn128/alt_bn128_init.cpp similarity index 100% rename from src/snark/src/algebra/curves/alt_bn128/alt_bn128_init.cpp rename to src/snark/libsnark/algebra/curves/alt_bn128/alt_bn128_init.cpp diff --git a/src/snark/src/algebra/curves/alt_bn128/alt_bn128_init.hpp b/src/snark/libsnark/algebra/curves/alt_bn128/alt_bn128_init.hpp similarity index 100% rename from src/snark/src/algebra/curves/alt_bn128/alt_bn128_init.hpp rename to src/snark/libsnark/algebra/curves/alt_bn128/alt_bn128_init.hpp diff --git a/src/snark/src/algebra/curves/alt_bn128/alt_bn128_pairing.cpp b/src/snark/libsnark/algebra/curves/alt_bn128/alt_bn128_pairing.cpp similarity index 100% rename from src/snark/src/algebra/curves/alt_bn128/alt_bn128_pairing.cpp rename to src/snark/libsnark/algebra/curves/alt_bn128/alt_bn128_pairing.cpp diff --git a/src/snark/src/algebra/curves/alt_bn128/alt_bn128_pairing.hpp b/src/snark/libsnark/algebra/curves/alt_bn128/alt_bn128_pairing.hpp similarity index 100% rename from src/snark/src/algebra/curves/alt_bn128/alt_bn128_pairing.hpp rename to src/snark/libsnark/algebra/curves/alt_bn128/alt_bn128_pairing.hpp diff --git a/src/snark/src/algebra/curves/alt_bn128/alt_bn128_pp.cpp b/src/snark/libsnark/algebra/curves/alt_bn128/alt_bn128_pp.cpp similarity index 100% rename from src/snark/src/algebra/curves/alt_bn128/alt_bn128_pp.cpp rename to src/snark/libsnark/algebra/curves/alt_bn128/alt_bn128_pp.cpp diff --git a/src/snark/src/algebra/curves/alt_bn128/alt_bn128_pp.hpp b/src/snark/libsnark/algebra/curves/alt_bn128/alt_bn128_pp.hpp similarity index 100% rename from src/snark/src/algebra/curves/alt_bn128/alt_bn128_pp.hpp rename to src/snark/libsnark/algebra/curves/alt_bn128/alt_bn128_pp.hpp diff --git a/src/snark/src/algebra/curves/curve_utils.hpp b/src/snark/libsnark/algebra/curves/curve_utils.hpp similarity index 100% rename from src/snark/src/algebra/curves/curve_utils.hpp rename to src/snark/libsnark/algebra/curves/curve_utils.hpp diff --git a/src/snark/src/algebra/curves/curve_utils.tcc b/src/snark/libsnark/algebra/curves/curve_utils.tcc similarity index 100% rename from src/snark/src/algebra/curves/curve_utils.tcc rename to src/snark/libsnark/algebra/curves/curve_utils.tcc diff --git a/src/snark/src/algebra/curves/public_params.hpp b/src/snark/libsnark/algebra/curves/public_params.hpp similarity index 100% rename from src/snark/src/algebra/curves/public_params.hpp rename to src/snark/libsnark/algebra/curves/public_params.hpp diff --git a/src/snark/src/algebra/curves/tests/test_bilinearity.cpp b/src/snark/libsnark/algebra/curves/tests/test_bilinearity.cpp similarity index 100% rename from src/snark/src/algebra/curves/tests/test_bilinearity.cpp rename to src/snark/libsnark/algebra/curves/tests/test_bilinearity.cpp diff --git a/src/snark/src/algebra/curves/tests/test_groups.cpp b/src/snark/libsnark/algebra/curves/tests/test_groups.cpp similarity index 100% rename from src/snark/src/algebra/curves/tests/test_groups.cpp rename to src/snark/libsnark/algebra/curves/tests/test_groups.cpp diff --git a/src/snark/src/algebra/evaluation_domain/domains/basic_radix2_domain.hpp b/src/snark/libsnark/algebra/evaluation_domain/domains/basic_radix2_domain.hpp similarity index 100% rename from src/snark/src/algebra/evaluation_domain/domains/basic_radix2_domain.hpp rename to src/snark/libsnark/algebra/evaluation_domain/domains/basic_radix2_domain.hpp diff --git a/src/snark/src/algebra/evaluation_domain/domains/basic_radix2_domain.tcc b/src/snark/libsnark/algebra/evaluation_domain/domains/basic_radix2_domain.tcc similarity index 100% rename from src/snark/src/algebra/evaluation_domain/domains/basic_radix2_domain.tcc rename to src/snark/libsnark/algebra/evaluation_domain/domains/basic_radix2_domain.tcc diff --git a/src/snark/src/algebra/evaluation_domain/domains/basic_radix2_domain_aux.hpp b/src/snark/libsnark/algebra/evaluation_domain/domains/basic_radix2_domain_aux.hpp similarity index 100% rename from src/snark/src/algebra/evaluation_domain/domains/basic_radix2_domain_aux.hpp rename to src/snark/libsnark/algebra/evaluation_domain/domains/basic_radix2_domain_aux.hpp diff --git a/src/snark/src/algebra/evaluation_domain/domains/basic_radix2_domain_aux.tcc b/src/snark/libsnark/algebra/evaluation_domain/domains/basic_radix2_domain_aux.tcc similarity index 100% rename from src/snark/src/algebra/evaluation_domain/domains/basic_radix2_domain_aux.tcc rename to src/snark/libsnark/algebra/evaluation_domain/domains/basic_radix2_domain_aux.tcc diff --git a/src/snark/src/algebra/evaluation_domain/evaluation_domain.hpp b/src/snark/libsnark/algebra/evaluation_domain/evaluation_domain.hpp similarity index 100% rename from src/snark/src/algebra/evaluation_domain/evaluation_domain.hpp rename to src/snark/libsnark/algebra/evaluation_domain/evaluation_domain.hpp diff --git a/src/snark/src/algebra/evaluation_domain/evaluation_domain.tcc b/src/snark/libsnark/algebra/evaluation_domain/evaluation_domain.tcc similarity index 100% rename from src/snark/src/algebra/evaluation_domain/evaluation_domain.tcc rename to src/snark/libsnark/algebra/evaluation_domain/evaluation_domain.tcc diff --git a/src/snark/src/algebra/exponentiation/exponentiation.hpp b/src/snark/libsnark/algebra/exponentiation/exponentiation.hpp similarity index 100% rename from src/snark/src/algebra/exponentiation/exponentiation.hpp rename to src/snark/libsnark/algebra/exponentiation/exponentiation.hpp diff --git a/src/snark/src/algebra/exponentiation/exponentiation.tcc b/src/snark/libsnark/algebra/exponentiation/exponentiation.tcc similarity index 100% rename from src/snark/src/algebra/exponentiation/exponentiation.tcc rename to src/snark/libsnark/algebra/exponentiation/exponentiation.tcc diff --git a/src/snark/src/algebra/fields/bigint.hpp b/src/snark/libsnark/algebra/fields/bigint.hpp similarity index 100% rename from src/snark/src/algebra/fields/bigint.hpp rename to src/snark/libsnark/algebra/fields/bigint.hpp diff --git a/src/snark/src/algebra/fields/bigint.tcc b/src/snark/libsnark/algebra/fields/bigint.tcc similarity index 100% rename from src/snark/src/algebra/fields/bigint.tcc rename to src/snark/libsnark/algebra/fields/bigint.tcc diff --git a/src/snark/src/algebra/fields/field_utils.hpp b/src/snark/libsnark/algebra/fields/field_utils.hpp similarity index 100% rename from src/snark/src/algebra/fields/field_utils.hpp rename to src/snark/libsnark/algebra/fields/field_utils.hpp diff --git a/src/snark/src/algebra/fields/field_utils.tcc b/src/snark/libsnark/algebra/fields/field_utils.tcc similarity index 100% rename from src/snark/src/algebra/fields/field_utils.tcc rename to src/snark/libsnark/algebra/fields/field_utils.tcc diff --git a/src/snark/src/algebra/fields/fp.hpp b/src/snark/libsnark/algebra/fields/fp.hpp similarity index 100% rename from src/snark/src/algebra/fields/fp.hpp rename to src/snark/libsnark/algebra/fields/fp.hpp diff --git a/src/snark/src/algebra/fields/fp.tcc b/src/snark/libsnark/algebra/fields/fp.tcc similarity index 100% rename from src/snark/src/algebra/fields/fp.tcc rename to src/snark/libsnark/algebra/fields/fp.tcc diff --git a/src/snark/src/algebra/fields/fp12_2over3over2.hpp b/src/snark/libsnark/algebra/fields/fp12_2over3over2.hpp similarity index 100% rename from src/snark/src/algebra/fields/fp12_2over3over2.hpp rename to src/snark/libsnark/algebra/fields/fp12_2over3over2.hpp diff --git a/src/snark/src/algebra/fields/fp12_2over3over2.tcc b/src/snark/libsnark/algebra/fields/fp12_2over3over2.tcc similarity index 100% rename from src/snark/src/algebra/fields/fp12_2over3over2.tcc rename to src/snark/libsnark/algebra/fields/fp12_2over3over2.tcc diff --git a/src/snark/src/algebra/fields/fp2.hpp b/src/snark/libsnark/algebra/fields/fp2.hpp similarity index 100% rename from src/snark/src/algebra/fields/fp2.hpp rename to src/snark/libsnark/algebra/fields/fp2.hpp diff --git a/src/snark/src/algebra/fields/fp2.tcc b/src/snark/libsnark/algebra/fields/fp2.tcc similarity index 100% rename from src/snark/src/algebra/fields/fp2.tcc rename to src/snark/libsnark/algebra/fields/fp2.tcc diff --git a/src/snark/src/algebra/fields/fp6_3over2.hpp b/src/snark/libsnark/algebra/fields/fp6_3over2.hpp similarity index 100% rename from src/snark/src/algebra/fields/fp6_3over2.hpp rename to src/snark/libsnark/algebra/fields/fp6_3over2.hpp diff --git a/src/snark/src/algebra/fields/fp6_3over2.tcc b/src/snark/libsnark/algebra/fields/fp6_3over2.tcc similarity index 100% rename from src/snark/src/algebra/fields/fp6_3over2.tcc rename to src/snark/libsnark/algebra/fields/fp6_3over2.tcc diff --git a/src/snark/src/algebra/fields/fp_aux.tcc b/src/snark/libsnark/algebra/fields/fp_aux.tcc similarity index 100% rename from src/snark/src/algebra/fields/fp_aux.tcc rename to src/snark/libsnark/algebra/fields/fp_aux.tcc diff --git a/src/snark/src/algebra/fields/tests/test_bigint.cpp b/src/snark/libsnark/algebra/fields/tests/test_bigint.cpp similarity index 100% rename from src/snark/src/algebra/fields/tests/test_bigint.cpp rename to src/snark/libsnark/algebra/fields/tests/test_bigint.cpp diff --git a/src/snark/src/algebra/fields/tests/test_fields.cpp b/src/snark/libsnark/algebra/fields/tests/test_fields.cpp similarity index 100% rename from src/snark/src/algebra/fields/tests/test_fields.cpp rename to src/snark/libsnark/algebra/fields/tests/test_fields.cpp diff --git a/src/snark/src/algebra/knowledge_commitment/knowledge_commitment.hpp b/src/snark/libsnark/algebra/knowledge_commitment/knowledge_commitment.hpp similarity index 100% rename from src/snark/src/algebra/knowledge_commitment/knowledge_commitment.hpp rename to src/snark/libsnark/algebra/knowledge_commitment/knowledge_commitment.hpp diff --git a/src/snark/src/algebra/knowledge_commitment/knowledge_commitment.tcc b/src/snark/libsnark/algebra/knowledge_commitment/knowledge_commitment.tcc similarity index 100% rename from src/snark/src/algebra/knowledge_commitment/knowledge_commitment.tcc rename to src/snark/libsnark/algebra/knowledge_commitment/knowledge_commitment.tcc diff --git a/src/snark/src/algebra/scalar_multiplication/kc_multiexp.hpp b/src/snark/libsnark/algebra/scalar_multiplication/kc_multiexp.hpp similarity index 100% rename from src/snark/src/algebra/scalar_multiplication/kc_multiexp.hpp rename to src/snark/libsnark/algebra/scalar_multiplication/kc_multiexp.hpp diff --git a/src/snark/src/algebra/scalar_multiplication/kc_multiexp.tcc b/src/snark/libsnark/algebra/scalar_multiplication/kc_multiexp.tcc similarity index 100% rename from src/snark/src/algebra/scalar_multiplication/kc_multiexp.tcc rename to src/snark/libsnark/algebra/scalar_multiplication/kc_multiexp.tcc diff --git a/src/snark/src/algebra/scalar_multiplication/multiexp.hpp b/src/snark/libsnark/algebra/scalar_multiplication/multiexp.hpp similarity index 100% rename from src/snark/src/algebra/scalar_multiplication/multiexp.hpp rename to src/snark/libsnark/algebra/scalar_multiplication/multiexp.hpp diff --git a/src/snark/src/algebra/scalar_multiplication/multiexp.tcc b/src/snark/libsnark/algebra/scalar_multiplication/multiexp.tcc similarity index 100% rename from src/snark/src/algebra/scalar_multiplication/multiexp.tcc rename to src/snark/libsnark/algebra/scalar_multiplication/multiexp.tcc diff --git a/src/snark/src/algebra/scalar_multiplication/wnaf.hpp b/src/snark/libsnark/algebra/scalar_multiplication/wnaf.hpp similarity index 100% rename from src/snark/src/algebra/scalar_multiplication/wnaf.hpp rename to src/snark/libsnark/algebra/scalar_multiplication/wnaf.hpp diff --git a/src/snark/src/algebra/scalar_multiplication/wnaf.tcc b/src/snark/libsnark/algebra/scalar_multiplication/wnaf.tcc similarity index 100% rename from src/snark/src/algebra/scalar_multiplication/wnaf.tcc rename to src/snark/libsnark/algebra/scalar_multiplication/wnaf.tcc diff --git a/src/snark/src/common/assert_except.hpp b/src/snark/libsnark/common/assert_except.hpp similarity index 100% rename from src/snark/src/common/assert_except.hpp rename to src/snark/libsnark/common/assert_except.hpp diff --git a/src/snark/src/common/data_structures/accumulation_vector.hpp b/src/snark/libsnark/common/data_structures/accumulation_vector.hpp similarity index 100% rename from src/snark/src/common/data_structures/accumulation_vector.hpp rename to src/snark/libsnark/common/data_structures/accumulation_vector.hpp diff --git a/src/snark/src/common/data_structures/accumulation_vector.tcc b/src/snark/libsnark/common/data_structures/accumulation_vector.tcc similarity index 100% rename from src/snark/src/common/data_structures/accumulation_vector.tcc rename to src/snark/libsnark/common/data_structures/accumulation_vector.tcc diff --git a/src/snark/src/common/data_structures/merkle_tree.hpp b/src/snark/libsnark/common/data_structures/merkle_tree.hpp similarity index 100% rename from src/snark/src/common/data_structures/merkle_tree.hpp rename to src/snark/libsnark/common/data_structures/merkle_tree.hpp diff --git a/src/snark/src/common/data_structures/merkle_tree.tcc b/src/snark/libsnark/common/data_structures/merkle_tree.tcc similarity index 100% rename from src/snark/src/common/data_structures/merkle_tree.tcc rename to src/snark/libsnark/common/data_structures/merkle_tree.tcc diff --git a/src/snark/src/common/data_structures/sparse_vector.hpp b/src/snark/libsnark/common/data_structures/sparse_vector.hpp similarity index 100% rename from src/snark/src/common/data_structures/sparse_vector.hpp rename to src/snark/libsnark/common/data_structures/sparse_vector.hpp diff --git a/src/snark/src/common/data_structures/sparse_vector.tcc b/src/snark/libsnark/common/data_structures/sparse_vector.tcc similarity index 100% rename from src/snark/src/common/data_structures/sparse_vector.tcc rename to src/snark/libsnark/common/data_structures/sparse_vector.tcc diff --git a/src/snark/src/common/default_types/ec_pp.hpp b/src/snark/libsnark/common/default_types/ec_pp.hpp similarity index 100% rename from src/snark/src/common/default_types/ec_pp.hpp rename to src/snark/libsnark/common/default_types/ec_pp.hpp diff --git a/src/snark/src/common/default_types/r1cs_ppzksnark_pp.hpp b/src/snark/libsnark/common/default_types/r1cs_ppzksnark_pp.hpp similarity index 100% rename from src/snark/src/common/default_types/r1cs_ppzksnark_pp.hpp rename to src/snark/libsnark/common/default_types/r1cs_ppzksnark_pp.hpp diff --git a/src/snark/src/common/profiling.cpp b/src/snark/libsnark/common/profiling.cpp similarity index 100% rename from src/snark/src/common/profiling.cpp rename to src/snark/libsnark/common/profiling.cpp diff --git a/src/snark/src/common/profiling.hpp b/src/snark/libsnark/common/profiling.hpp similarity index 100% rename from src/snark/src/common/profiling.hpp rename to src/snark/libsnark/common/profiling.hpp diff --git a/src/snark/src/common/serialization.hpp b/src/snark/libsnark/common/serialization.hpp similarity index 100% rename from src/snark/src/common/serialization.hpp rename to src/snark/libsnark/common/serialization.hpp diff --git a/src/snark/src/common/serialization.tcc b/src/snark/libsnark/common/serialization.tcc similarity index 100% rename from src/snark/src/common/serialization.tcc rename to src/snark/libsnark/common/serialization.tcc diff --git a/src/snark/src/common/template_utils.hpp b/src/snark/libsnark/common/template_utils.hpp similarity index 100% rename from src/snark/src/common/template_utils.hpp rename to src/snark/libsnark/common/template_utils.hpp diff --git a/src/snark/src/common/utils.cpp b/src/snark/libsnark/common/utils.cpp similarity index 100% rename from src/snark/src/common/utils.cpp rename to src/snark/libsnark/common/utils.cpp diff --git a/src/snark/src/common/utils.hpp b/src/snark/libsnark/common/utils.hpp similarity index 100% rename from src/snark/src/common/utils.hpp rename to src/snark/libsnark/common/utils.hpp diff --git a/src/snark/src/common/utils.tcc b/src/snark/libsnark/common/utils.tcc similarity index 100% rename from src/snark/src/common/utils.tcc rename to src/snark/libsnark/common/utils.tcc diff --git a/src/snark/src/gadgetlib1/constraint_profiling.cpp b/src/snark/libsnark/gadgetlib1/constraint_profiling.cpp similarity index 100% rename from src/snark/src/gadgetlib1/constraint_profiling.cpp rename to src/snark/libsnark/gadgetlib1/constraint_profiling.cpp diff --git a/src/snark/src/gadgetlib1/constraint_profiling.hpp b/src/snark/libsnark/gadgetlib1/constraint_profiling.hpp similarity index 100% rename from src/snark/src/gadgetlib1/constraint_profiling.hpp rename to src/snark/libsnark/gadgetlib1/constraint_profiling.hpp diff --git a/src/snark/src/gadgetlib1/examples/simple_example.hpp b/src/snark/libsnark/gadgetlib1/examples/simple_example.hpp similarity index 100% rename from src/snark/src/gadgetlib1/examples/simple_example.hpp rename to src/snark/libsnark/gadgetlib1/examples/simple_example.hpp diff --git a/src/snark/src/gadgetlib1/examples/simple_example.tcc b/src/snark/libsnark/gadgetlib1/examples/simple_example.tcc similarity index 100% rename from src/snark/src/gadgetlib1/examples/simple_example.tcc rename to src/snark/libsnark/gadgetlib1/examples/simple_example.tcc diff --git a/src/snark/src/gadgetlib1/gadget.hpp b/src/snark/libsnark/gadgetlib1/gadget.hpp similarity index 100% rename from src/snark/src/gadgetlib1/gadget.hpp rename to src/snark/libsnark/gadgetlib1/gadget.hpp diff --git a/src/snark/src/gadgetlib1/gadget.tcc b/src/snark/libsnark/gadgetlib1/gadget.tcc similarity index 100% rename from src/snark/src/gadgetlib1/gadget.tcc rename to src/snark/libsnark/gadgetlib1/gadget.tcc diff --git a/src/snark/src/gadgetlib1/gadgets/basic_gadgets.hpp b/src/snark/libsnark/gadgetlib1/gadgets/basic_gadgets.hpp similarity index 100% rename from src/snark/src/gadgetlib1/gadgets/basic_gadgets.hpp rename to src/snark/libsnark/gadgetlib1/gadgets/basic_gadgets.hpp diff --git a/src/snark/src/gadgetlib1/gadgets/basic_gadgets.tcc b/src/snark/libsnark/gadgetlib1/gadgets/basic_gadgets.tcc similarity index 100% rename from src/snark/src/gadgetlib1/gadgets/basic_gadgets.tcc rename to src/snark/libsnark/gadgetlib1/gadgets/basic_gadgets.tcc diff --git a/src/snark/src/gadgetlib1/gadgets/gadget_from_r1cs.hpp b/src/snark/libsnark/gadgetlib1/gadgets/gadget_from_r1cs.hpp similarity index 100% rename from src/snark/src/gadgetlib1/gadgets/gadget_from_r1cs.hpp rename to src/snark/libsnark/gadgetlib1/gadgets/gadget_from_r1cs.hpp diff --git a/src/snark/src/gadgetlib1/gadgets/gadget_from_r1cs.tcc b/src/snark/libsnark/gadgetlib1/gadgets/gadget_from_r1cs.tcc similarity index 100% rename from src/snark/src/gadgetlib1/gadgets/gadget_from_r1cs.tcc rename to src/snark/libsnark/gadgetlib1/gadgets/gadget_from_r1cs.tcc diff --git a/src/snark/src/gadgetlib1/gadgets/hashes/digest_selector_gadget.hpp b/src/snark/libsnark/gadgetlib1/gadgets/hashes/digest_selector_gadget.hpp similarity index 100% rename from src/snark/src/gadgetlib1/gadgets/hashes/digest_selector_gadget.hpp rename to src/snark/libsnark/gadgetlib1/gadgets/hashes/digest_selector_gadget.hpp diff --git a/src/snark/src/gadgetlib1/gadgets/hashes/digest_selector_gadget.tcc b/src/snark/libsnark/gadgetlib1/gadgets/hashes/digest_selector_gadget.tcc similarity index 100% rename from src/snark/src/gadgetlib1/gadgets/hashes/digest_selector_gadget.tcc rename to src/snark/libsnark/gadgetlib1/gadgets/hashes/digest_selector_gadget.tcc diff --git a/src/snark/src/gadgetlib1/gadgets/hashes/hash_io.hpp b/src/snark/libsnark/gadgetlib1/gadgets/hashes/hash_io.hpp similarity index 100% rename from src/snark/src/gadgetlib1/gadgets/hashes/hash_io.hpp rename to src/snark/libsnark/gadgetlib1/gadgets/hashes/hash_io.hpp diff --git a/src/snark/src/gadgetlib1/gadgets/hashes/hash_io.tcc b/src/snark/libsnark/gadgetlib1/gadgets/hashes/hash_io.tcc similarity index 100% rename from src/snark/src/gadgetlib1/gadgets/hashes/hash_io.tcc rename to src/snark/libsnark/gadgetlib1/gadgets/hashes/hash_io.tcc diff --git a/src/snark/src/gadgetlib1/gadgets/hashes/sha256/sha256_aux.hpp b/src/snark/libsnark/gadgetlib1/gadgets/hashes/sha256/sha256_aux.hpp similarity index 100% rename from src/snark/src/gadgetlib1/gadgets/hashes/sha256/sha256_aux.hpp rename to src/snark/libsnark/gadgetlib1/gadgets/hashes/sha256/sha256_aux.hpp diff --git a/src/snark/src/gadgetlib1/gadgets/hashes/sha256/sha256_aux.tcc b/src/snark/libsnark/gadgetlib1/gadgets/hashes/sha256/sha256_aux.tcc similarity index 100% rename from src/snark/src/gadgetlib1/gadgets/hashes/sha256/sha256_aux.tcc rename to src/snark/libsnark/gadgetlib1/gadgets/hashes/sha256/sha256_aux.tcc diff --git a/src/snark/src/gadgetlib1/gadgets/hashes/sha256/sha256_components.hpp b/src/snark/libsnark/gadgetlib1/gadgets/hashes/sha256/sha256_components.hpp similarity index 100% rename from src/snark/src/gadgetlib1/gadgets/hashes/sha256/sha256_components.hpp rename to src/snark/libsnark/gadgetlib1/gadgets/hashes/sha256/sha256_components.hpp diff --git a/src/snark/src/gadgetlib1/gadgets/hashes/sha256/sha256_components.tcc b/src/snark/libsnark/gadgetlib1/gadgets/hashes/sha256/sha256_components.tcc similarity index 100% rename from src/snark/src/gadgetlib1/gadgets/hashes/sha256/sha256_components.tcc rename to src/snark/libsnark/gadgetlib1/gadgets/hashes/sha256/sha256_components.tcc diff --git a/src/snark/src/gadgetlib1/gadgets/hashes/sha256/sha256_gadget.hpp b/src/snark/libsnark/gadgetlib1/gadgets/hashes/sha256/sha256_gadget.hpp similarity index 100% rename from src/snark/src/gadgetlib1/gadgets/hashes/sha256/sha256_gadget.hpp rename to src/snark/libsnark/gadgetlib1/gadgets/hashes/sha256/sha256_gadget.hpp diff --git a/src/snark/src/gadgetlib1/gadgets/hashes/sha256/sha256_gadget.tcc b/src/snark/libsnark/gadgetlib1/gadgets/hashes/sha256/sha256_gadget.tcc similarity index 100% rename from src/snark/src/gadgetlib1/gadgets/hashes/sha256/sha256_gadget.tcc rename to src/snark/libsnark/gadgetlib1/gadgets/hashes/sha256/sha256_gadget.tcc diff --git a/src/snark/src/gadgetlib1/gadgets/hashes/sha256/tests/generate_sha256_gadget_tests.py b/src/snark/libsnark/gadgetlib1/gadgets/hashes/sha256/tests/generate_sha256_gadget_tests.py similarity index 100% rename from src/snark/src/gadgetlib1/gadgets/hashes/sha256/tests/generate_sha256_gadget_tests.py rename to src/snark/libsnark/gadgetlib1/gadgets/hashes/sha256/tests/generate_sha256_gadget_tests.py diff --git a/src/snark/src/gadgetlib1/gadgets/hashes/sha256/tests/pypy_sha256.py b/src/snark/libsnark/gadgetlib1/gadgets/hashes/sha256/tests/pypy_sha256.py similarity index 100% rename from src/snark/src/gadgetlib1/gadgets/hashes/sha256/tests/pypy_sha256.py rename to src/snark/libsnark/gadgetlib1/gadgets/hashes/sha256/tests/pypy_sha256.py diff --git a/src/snark/src/gadgetlib1/gadgets/hashes/sha256/tests/test_sha256_gadget.cpp b/src/snark/libsnark/gadgetlib1/gadgets/hashes/sha256/tests/test_sha256_gadget.cpp similarity index 100% rename from src/snark/src/gadgetlib1/gadgets/hashes/sha256/tests/test_sha256_gadget.cpp rename to src/snark/libsnark/gadgetlib1/gadgets/hashes/sha256/tests/test_sha256_gadget.cpp diff --git a/src/snark/src/gadgetlib1/gadgets/merkle_tree/merkle_authentication_path_variable.hpp b/src/snark/libsnark/gadgetlib1/gadgets/merkle_tree/merkle_authentication_path_variable.hpp similarity index 100% rename from src/snark/src/gadgetlib1/gadgets/merkle_tree/merkle_authentication_path_variable.hpp rename to src/snark/libsnark/gadgetlib1/gadgets/merkle_tree/merkle_authentication_path_variable.hpp diff --git a/src/snark/src/gadgetlib1/gadgets/merkle_tree/merkle_authentication_path_variable.tcc b/src/snark/libsnark/gadgetlib1/gadgets/merkle_tree/merkle_authentication_path_variable.tcc similarity index 100% rename from src/snark/src/gadgetlib1/gadgets/merkle_tree/merkle_authentication_path_variable.tcc rename to src/snark/libsnark/gadgetlib1/gadgets/merkle_tree/merkle_authentication_path_variable.tcc diff --git a/src/snark/src/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_read_gadget.hpp b/src/snark/libsnark/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_read_gadget.hpp similarity index 100% rename from src/snark/src/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_read_gadget.hpp rename to src/snark/libsnark/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_read_gadget.hpp diff --git a/src/snark/src/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_read_gadget.tcc b/src/snark/libsnark/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_read_gadget.tcc similarity index 100% rename from src/snark/src/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_read_gadget.tcc rename to src/snark/libsnark/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_read_gadget.tcc diff --git a/src/snark/src/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_update_gadget.hpp b/src/snark/libsnark/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_update_gadget.hpp similarity index 100% rename from src/snark/src/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_update_gadget.hpp rename to src/snark/libsnark/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_update_gadget.hpp diff --git a/src/snark/src/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_update_gadget.tcc b/src/snark/libsnark/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_update_gadget.tcc similarity index 100% rename from src/snark/src/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_update_gadget.tcc rename to src/snark/libsnark/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_update_gadget.tcc diff --git a/src/snark/src/gadgetlib1/gadgets/merkle_tree/tests/test_merkle_tree_gadgets.cpp b/src/snark/libsnark/gadgetlib1/gadgets/merkle_tree/tests/test_merkle_tree_gadgets.cpp similarity index 100% rename from src/snark/src/gadgetlib1/gadgets/merkle_tree/tests/test_merkle_tree_gadgets.cpp rename to src/snark/libsnark/gadgetlib1/gadgets/merkle_tree/tests/test_merkle_tree_gadgets.cpp diff --git a/src/snark/src/gadgetlib1/pb_variable.hpp b/src/snark/libsnark/gadgetlib1/pb_variable.hpp similarity index 100% rename from src/snark/src/gadgetlib1/pb_variable.hpp rename to src/snark/libsnark/gadgetlib1/pb_variable.hpp diff --git a/src/snark/src/gadgetlib1/pb_variable.tcc b/src/snark/libsnark/gadgetlib1/pb_variable.tcc similarity index 100% rename from src/snark/src/gadgetlib1/pb_variable.tcc rename to src/snark/libsnark/gadgetlib1/pb_variable.tcc diff --git a/src/snark/src/gadgetlib1/protoboard.hpp b/src/snark/libsnark/gadgetlib1/protoboard.hpp similarity index 100% rename from src/snark/src/gadgetlib1/protoboard.hpp rename to src/snark/libsnark/gadgetlib1/protoboard.hpp diff --git a/src/snark/src/gadgetlib1/protoboard.tcc b/src/snark/libsnark/gadgetlib1/protoboard.tcc similarity index 100% rename from src/snark/src/gadgetlib1/protoboard.tcc rename to src/snark/libsnark/gadgetlib1/protoboard.tcc diff --git a/src/snark/src/gtests.cpp b/src/snark/libsnark/gtests.cpp similarity index 100% rename from src/snark/src/gtests.cpp rename to src/snark/libsnark/gtests.cpp diff --git a/src/snark/src/reductions/r1cs_to_qap/r1cs_to_qap.hpp b/src/snark/libsnark/reductions/r1cs_to_qap/r1cs_to_qap.hpp similarity index 100% rename from src/snark/src/reductions/r1cs_to_qap/r1cs_to_qap.hpp rename to src/snark/libsnark/reductions/r1cs_to_qap/r1cs_to_qap.hpp diff --git a/src/snark/src/reductions/r1cs_to_qap/r1cs_to_qap.tcc b/src/snark/libsnark/reductions/r1cs_to_qap/r1cs_to_qap.tcc similarity index 100% rename from src/snark/src/reductions/r1cs_to_qap/r1cs_to_qap.tcc rename to src/snark/libsnark/reductions/r1cs_to_qap/r1cs_to_qap.tcc diff --git a/src/snark/src/relations/arithmetic_programs/qap/qap.hpp b/src/snark/libsnark/relations/arithmetic_programs/qap/qap.hpp similarity index 100% rename from src/snark/src/relations/arithmetic_programs/qap/qap.hpp rename to src/snark/libsnark/relations/arithmetic_programs/qap/qap.hpp diff --git a/src/snark/src/relations/arithmetic_programs/qap/qap.tcc b/src/snark/libsnark/relations/arithmetic_programs/qap/qap.tcc similarity index 100% rename from src/snark/src/relations/arithmetic_programs/qap/qap.tcc rename to src/snark/libsnark/relations/arithmetic_programs/qap/qap.tcc diff --git a/src/snark/src/relations/arithmetic_programs/qap/tests/test_qap.cpp b/src/snark/libsnark/relations/arithmetic_programs/qap/tests/test_qap.cpp similarity index 100% rename from src/snark/src/relations/arithmetic_programs/qap/tests/test_qap.cpp rename to src/snark/libsnark/relations/arithmetic_programs/qap/tests/test_qap.cpp diff --git a/src/snark/src/relations/constraint_satisfaction_problems/r1cs/examples/r1cs_examples.hpp b/src/snark/libsnark/relations/constraint_satisfaction_problems/r1cs/examples/r1cs_examples.hpp similarity index 100% rename from src/snark/src/relations/constraint_satisfaction_problems/r1cs/examples/r1cs_examples.hpp rename to src/snark/libsnark/relations/constraint_satisfaction_problems/r1cs/examples/r1cs_examples.hpp diff --git a/src/snark/src/relations/constraint_satisfaction_problems/r1cs/examples/r1cs_examples.tcc b/src/snark/libsnark/relations/constraint_satisfaction_problems/r1cs/examples/r1cs_examples.tcc similarity index 100% rename from src/snark/src/relations/constraint_satisfaction_problems/r1cs/examples/r1cs_examples.tcc rename to src/snark/libsnark/relations/constraint_satisfaction_problems/r1cs/examples/r1cs_examples.tcc diff --git a/src/snark/src/relations/constraint_satisfaction_problems/r1cs/r1cs.hpp b/src/snark/libsnark/relations/constraint_satisfaction_problems/r1cs/r1cs.hpp similarity index 100% rename from src/snark/src/relations/constraint_satisfaction_problems/r1cs/r1cs.hpp rename to src/snark/libsnark/relations/constraint_satisfaction_problems/r1cs/r1cs.hpp diff --git a/src/snark/src/relations/constraint_satisfaction_problems/r1cs/r1cs.tcc b/src/snark/libsnark/relations/constraint_satisfaction_problems/r1cs/r1cs.tcc similarity index 100% rename from src/snark/src/relations/constraint_satisfaction_problems/r1cs/r1cs.tcc rename to src/snark/libsnark/relations/constraint_satisfaction_problems/r1cs/r1cs.tcc diff --git a/src/snark/src/relations/variable.hpp b/src/snark/libsnark/relations/variable.hpp similarity index 100% rename from src/snark/src/relations/variable.hpp rename to src/snark/libsnark/relations/variable.hpp diff --git a/src/snark/src/relations/variable.tcc b/src/snark/libsnark/relations/variable.tcc similarity index 100% rename from src/snark/src/relations/variable.tcc rename to src/snark/libsnark/relations/variable.tcc diff --git a/src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/examples/run_r1cs_ppzksnark.hpp b/src/snark/libsnark/zk_proof_systems/ppzksnark/r1cs_ppzksnark/examples/run_r1cs_ppzksnark.hpp similarity index 100% rename from src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/examples/run_r1cs_ppzksnark.hpp rename to src/snark/libsnark/zk_proof_systems/ppzksnark/r1cs_ppzksnark/examples/run_r1cs_ppzksnark.hpp diff --git a/src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/examples/run_r1cs_ppzksnark.tcc b/src/snark/libsnark/zk_proof_systems/ppzksnark/r1cs_ppzksnark/examples/run_r1cs_ppzksnark.tcc similarity index 100% rename from src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/examples/run_r1cs_ppzksnark.tcc rename to src/snark/libsnark/zk_proof_systems/ppzksnark/r1cs_ppzksnark/examples/run_r1cs_ppzksnark.tcc diff --git a/src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/profiling/profile_r1cs_ppzksnark.cpp b/src/snark/libsnark/zk_proof_systems/ppzksnark/r1cs_ppzksnark/profiling/profile_r1cs_ppzksnark.cpp similarity index 100% rename from src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/profiling/profile_r1cs_ppzksnark.cpp rename to src/snark/libsnark/zk_proof_systems/ppzksnark/r1cs_ppzksnark/profiling/profile_r1cs_ppzksnark.cpp diff --git a/src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.hpp b/src/snark/libsnark/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.hpp similarity index 100% rename from src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.hpp rename to src/snark/libsnark/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.hpp diff --git a/src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.tcc b/src/snark/libsnark/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.tcc similarity index 100% rename from src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.tcc rename to src/snark/libsnark/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.tcc diff --git a/src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark_params.hpp b/src/snark/libsnark/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark_params.hpp similarity index 100% rename from src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark_params.hpp rename to src/snark/libsnark/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark_params.hpp diff --git a/src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/tests/test_r1cs_ppzksnark.cpp b/src/snark/libsnark/zk_proof_systems/ppzksnark/r1cs_ppzksnark/tests/test_r1cs_ppzksnark.cpp similarity index 100% rename from src/snark/src/zk_proof_systems/ppzksnark/r1cs_ppzksnark/tests/test_r1cs_ppzksnark.cpp rename to src/snark/libsnark/zk_proof_systems/ppzksnark/r1cs_ppzksnark/tests/test_r1cs_ppzksnark.cpp From 49cf707d2ced72698cd44c6f4f3f64072c2fc308 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 1 Mar 2017 11:20:42 -0800 Subject: [PATCH 0367/1062] Add Base58 encoding of viewing keys --- src/base58.cpp | 8 ++++++++ src/base58.h | 11 +++++++++++ src/chainparams.cpp | 4 ++++ src/chainparams.h | 1 + src/zcash/Address.hpp | 1 + 5 files changed, 25 insertions(+) diff --git a/src/base58.cpp b/src/base58.cpp index 2fd2475fe..09977ea35 100644 --- a/src/base58.cpp +++ b/src/base58.cpp @@ -365,6 +365,14 @@ template libzcash::PaymentAddress CZCEncoding::Get() const; +// Explicit instantiations for libzcash::ViewingKey +template bool CZCEncoding::Set(const libzcash::ViewingKey& vk); +template libzcash::ViewingKey CZCEncoding::Get() const; + // Explicit instantiations for libzcash::SpendingKey template bool CZCEncoding { +protected: + std::string PrependName(const std::string& s) const { return "viewing key" + s; } + +public: + CZCViewingKey() {} + + CZCViewingKey(const std::string& strViewingKey) { SetString(strViewingKey.c_str(), 3); } + CZCViewingKey(const libzcash::ViewingKey& vk) { Set(vk); } +}; + class CZCSpendingKey : public CZCEncoding { protected: std::string PrependName(const std::string& s) const { return "spending key" + s; } diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 034eee6b2..23544f488 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -110,6 +110,8 @@ public: base58Prefixes[EXT_SECRET_KEY] = {0x04,0x88,0xAD,0xE4}; // guarantees the first 2 characters, when base58 encoded, are "zc" base58Prefixes[ZCPAYMENT_ADDRRESS] = {0x16,0x9A}; + // guarantees the first 4 characters, when base58 encoded, are "ZiVK" + base58Prefixes[ZCVIEWING_KEY] = {0xA8,0xAB,0xD3}; // guarantees the first 2 characters, when base58 encoded, are "SK" base58Prefixes[ZCSPENDING_KEY] = {0xAB,0x36}; @@ -241,6 +243,8 @@ public: base58Prefixes[EXT_SECRET_KEY] = {0x04,0x35,0x83,0x94}; // guarantees the first 2 characters, when base58 encoded, are "zt" base58Prefixes[ZCPAYMENT_ADDRRESS] = {0x16,0xB6}; + // guarantees the first 4 characters, when base58 encoded, are "ZiVt" + base58Prefixes[ZCVIEWING_KEY] = {0xA8,0xAC,0x0C}; // guarantees the first 2 characters, when base58 encoded, are "ST" base58Prefixes[ZCSPENDING_KEY] = {0xAC,0x08}; diff --git a/src/chainparams.h b/src/chainparams.h index a1de7b493..0de8d01b5 100644 --- a/src/chainparams.h +++ b/src/chainparams.h @@ -44,6 +44,7 @@ public: ZCPAYMENT_ADDRRESS, ZCSPENDING_KEY, + ZCVIEWING_KEY, MAX_BASE58_TYPES }; diff --git a/src/zcash/Address.hpp b/src/zcash/Address.hpp index 4287fee4f..2dbe10a60 100644 --- a/src/zcash/Address.hpp +++ b/src/zcash/Address.hpp @@ -8,6 +8,7 @@ namespace libzcash { const size_t SerializedPaymentAddressSize = 64; +const size_t SerializedViewingKeySize = 64; const size_t SerializedSpendingKeySize = 32; class PaymentAddress { From 167cd333741c234f7fee87f82aa678af653463af Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 1 Mar 2017 16:10:34 -0800 Subject: [PATCH 0368/1062] Implement viewing key storage in the wallet --- src/wallet/gtest/test_wallet_zkeys.cpp | 91 ++++++++++++++++++++++++++ src/wallet/wallet.cpp | 31 +++++++++ src/wallet/wallet.h | 6 ++ src/wallet/walletdb.cpp | 26 ++++++++ src/wallet/walletdb.h | 3 + 5 files changed, 157 insertions(+) diff --git a/src/wallet/gtest/test_wallet_zkeys.cpp b/src/wallet/gtest/test_wallet_zkeys.cpp index 554a4ee97..b40479e87 100644 --- a/src/wallet/gtest/test_wallet_zkeys.cpp +++ b/src/wallet/gtest/test_wallet_zkeys.cpp @@ -66,6 +66,53 @@ TEST(wallet_zkeys_tests, store_and_load_zkeys) { ASSERT_EQ(m.nCreateTime, now); } +/** + * This test covers methods on CWallet + * AddViewingKey() + * RemoveViewingKey() + * LoadViewingKey() + */ +TEST(wallet_zkeys_tests, StoreAndLoadViewingKeys) { + SelectParams(CBaseChainParams::MAIN); + + CWallet wallet; + + // wallet should be empty + std::set addrs; + wallet.GetPaymentAddresses(addrs); + ASSERT_EQ(0, addrs.size()); + + // manually add new viewing key to wallet + auto sk = libzcash::SpendingKey::random(); + auto vk = sk.viewing_key(); + ASSERT_TRUE(wallet.AddViewingKey(vk)); + + // verify wallet did add it + auto addr = sk.address(); + ASSERT_TRUE(wallet.HaveViewingKey(addr)); + // and that we don't have the corresponding spending key + ASSERT_FALSE(wallet.HaveSpendingKey(addr)); + + // verify viewing key stored correctly + libzcash::ViewingKey vkOut; + wallet.GetViewingKey(addr, vkOut); + ASSERT_EQ(vk, vkOut); + + // Load a second viewing key into the wallet + auto sk2 = libzcash::SpendingKey::random(); + ASSERT_TRUE(wallet.LoadViewingKey(sk2.viewing_key())); + + // verify wallet did add it + auto addr2 = sk2.address(); + ASSERT_TRUE(wallet.HaveViewingKey(addr2)); + ASSERT_FALSE(wallet.HaveSpendingKey(addr2)); + + // Remove the first viewing key + ASSERT_TRUE(wallet.RemoveViewingKey(vk)); + ASSERT_FALSE(wallet.HaveViewingKey(addr)); + ASSERT_TRUE(wallet.HaveViewingKey(addr2)); +} + /** * This test covers methods on CWalletDB * WriteZKey() @@ -138,6 +185,50 @@ TEST(wallet_zkeys_tests, write_zkey_direct_to_db) { ASSERT_EQ(m.nCreateTime, now); } +/** + * This test covers methods on CWalletDB + * WriteViewingKey() + */ +TEST(wallet_zkeys_tests, WriteViewingKeyDirectToDB) { + SelectParams(CBaseChainParams::TESTNET); + + // Get temporary and unique path for file. + // Note: / operator to append paths + boost::filesystem::path pathTemp = boost::filesystem::temp_directory_path() / boost::filesystem::unique_path(); + boost::filesystem::create_directories(pathTemp); + mapArgs["-datadir"] = pathTemp.string(); + + bool fFirstRun; + CWallet wallet("wallet-vkey.dat"); + ASSERT_EQ(DB_LOAD_OK, wallet.LoadWallet(fFirstRun)); + + // No default CPubKey set + ASSERT_TRUE(fFirstRun); + + // create random viewing key and add it to database directly, bypassing wallet + auto sk = libzcash::SpendingKey::random(); + auto vk = sk.viewing_key(); + auto addr = sk.address(); + int64_t now = GetTime(); + CKeyMetadata meta(now); + CWalletDB db("wallet-vkey.dat"); + db.WriteViewingKey(vk); + + // wallet should not be aware of viewing key + ASSERT_FALSE(wallet.HaveViewingKey(addr)); + + // load the wallet again + ASSERT_EQ(DB_LOAD_OK, wallet.LoadWallet(fFirstRun)); + + // wallet can now see the viewing key + ASSERT_TRUE(wallet.HaveViewingKey(addr)); + + // check key is the same + libzcash::ViewingKey vkOut; + wallet.GetViewingKey(addr, vkOut); + ASSERT_EQ(vk, vkOut); +} + /** diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 677fec319..9e7bba003 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -107,6 +107,10 @@ bool CWallet::AddZKey(const libzcash::SpendingKey &key) if (!CCryptoKeyStore::AddSpendingKey(key)) return false; + // check if we need to remove from viewing keys + if (HaveViewingKey(addr)) + RemoveViewingKey(key.viewing_key()); + if (!fFileBacked) return true; @@ -246,6 +250,33 @@ bool CWallet::LoadZKey(const libzcash::SpendingKey &key) return CCryptoKeyStore::AddSpendingKey(key); } +bool CWallet::AddViewingKey(const libzcash::ViewingKey &vk) +{ + if (!CCryptoKeyStore::AddViewingKey(vk)) + return false; + nTimeFirstKey = 1; // No birthday information for viewing keys. + if (!fFileBacked) + return true; + return CWalletDB(strWalletFile).WriteViewingKey(vk); +} + +bool CWallet::RemoveViewingKey(const libzcash::ViewingKey &vk) +{ + AssertLockHeld(cs_wallet); + if (!CCryptoKeyStore::RemoveViewingKey(vk)) + return false; + if (fFileBacked) + if (!CWalletDB(strWalletFile).EraseViewingKey(vk)) + return false; + + return true; +} + +bool CWallet::LoadViewingKey(const libzcash::ViewingKey &vk) +{ + return CCryptoKeyStore::AddViewingKey(vk); +} + bool CWallet::AddCScript(const CScript& redeemScript) { if (!CCryptoKeyStore::AddCScript(redeemScript)) diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index 57a71a431..878a23a5d 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -954,6 +954,12 @@ public: //! Adds an encrypted spending key to the store, and saves it to disk (virtual method, declared in crypter.h) bool AddCryptedSpendingKey(const libzcash::PaymentAddress &address, const libzcash::ReceivingKey &rk, const std::vector &vchCryptedSecret); + //! Adds a viewing key to the store, and saves it to disk. + bool AddViewingKey(const libzcash::ViewingKey &vk); + bool RemoveViewingKey(const libzcash::ViewingKey &vk); + //! Adds a viewing key to the store, without saving it to disk (used by LoadWallet) + bool LoadViewingKey(const libzcash::ViewingKey &dest); + /** * Increment the next transaction order id * @return next transaction order id diff --git a/src/wallet/walletdb.cpp b/src/wallet/walletdb.cpp index c79a15e30..4bf191380 100644 --- a/src/wallet/walletdb.cpp +++ b/src/wallet/walletdb.cpp @@ -142,6 +142,18 @@ bool CWalletDB::WriteZKey(const libzcash::PaymentAddress& addr, const libzcash:: return Write(std::make_pair(std::string("zkey"), addr), key, false); } +bool CWalletDB::WriteViewingKey(const libzcash::ViewingKey &vk) +{ + nWalletDBUpdated++; + return Write(std::make_pair(std::string("vkey"), vk), '1'); +} + +bool CWalletDB::EraseViewingKey(const libzcash::ViewingKey &vk) +{ + nWalletDBUpdated++; + return Erase(std::make_pair(std::string("vkey"), vk)); +} + bool CWalletDB::WriteCScript(const uint160& hash, const CScript& redeemScript) { nWalletDBUpdated++; @@ -471,6 +483,19 @@ ReadKeyValue(CWallet* pwallet, CDataStream& ssKey, CDataStream& ssValue, // so set the wallet birthday to the beginning of time. pwallet->nTimeFirstKey = 1; } + else if (strType == "vkey") + { + libzcash::ViewingKey vk; + ssKey >> vk; + char fYes; + ssValue >> fYes; + if (fYes == '1') + pwallet->LoadViewingKey(vk); + + // Viewing keys have no birthday information for now, + // so set the wallet birthday to the beginning of time. + pwallet->nTimeFirstKey = 1; + } else if (strType == "zkey") { libzcash::PaymentAddress addr; @@ -694,6 +719,7 @@ static bool IsKeyType(string strType) { return (strType== "key" || strType == "wkey" || strType == "zkey" || strType == "czkey" || + strType == "vkey" || strType == "mkey" || strType == "ckey"); } diff --git a/src/wallet/walletdb.h b/src/wallet/walletdb.h index b901f539c..e455ad953 100644 --- a/src/wallet/walletdb.h +++ b/src/wallet/walletdb.h @@ -140,6 +140,9 @@ public: const std::vector& vchCryptedSecret, const CKeyMetadata &keyMeta); + bool WriteViewingKey(const libzcash::ViewingKey &vk); + bool EraseViewingKey(const libzcash::ViewingKey &vk); + private: CWalletDB(const CWalletDB&); void operator=(const CWalletDB&); From e85b33a52e8c568cb1026862fd7a4a7c78c1a1c9 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 8 Mar 2017 16:13:39 +1300 Subject: [PATCH 0369/1062] Add RPC methods for exporting/importing viewing keys --- contrib/zcash-cli.bash-completion | 6 +- src/rpcclient.cpp | 1 + src/rpcserver.cpp | 2 + src/rpcserver.h | 2 + src/wallet/rpcdump.cpp | 125 ++++++++++++++++++++++++++++++ 5 files changed, 135 insertions(+), 1 deletion(-) diff --git a/contrib/zcash-cli.bash-completion b/contrib/zcash-cli.bash-completion index 79b57a063..37fa1d116 100644 --- a/contrib/zcash-cli.bash-completion +++ b/contrib/zcash-cli.bash-completion @@ -82,10 +82,14 @@ _zcash_cli() { COMPREPLY=( $( compgen -W "add remove" -- "$cur" ) ) return 0 ;; - fundrawtransaction|getblock|getblockheader|getmempoolancestors|getmempooldescendants|getrawtransaction|gettransaction|listaccounts|listreceivedbyaccount|listreceivedbyaddress|sendrawtransaction|z_importkey) + fundrawtransaction|getblock|getblockheader|getmempoolancestors|getmempooldescendants|getrawtransaction|gettransaction|listaccounts|listreceivedbyaccount|listreceivedbyaddress|sendrawtransaction) COMPREPLY=( $( compgen -W "true false" -- "$cur" ) ) return 0 ;; + z_importkey|z_importviewingkey) + COMPREPLY=( $( compgen -W "yes no whenkeyisnew" -- "$cur" ) ) + return 0 + ;; move|setaccount) _zcash_accounts return 0 diff --git a/src/rpcclient.cpp b/src/rpcclient.cpp index c02c51991..7ac5db926 100644 --- a/src/rpcclient.cpp +++ b/src/rpcclient.cpp @@ -114,6 +114,7 @@ static const CRPCConvertParam vRPCConvertParams[] = { "z_getoperationstatus", 0}, { "z_getoperationresult", 0}, { "z_importkey", 2 }, + { "z_importviewingkey", 2 }, { "z_getpaymentdisclosure", 1}, { "z_getpaymentdisclosure", 2} }; diff --git a/src/rpcserver.cpp b/src/rpcserver.cpp index 7a3880902..4859a5ee3 100644 --- a/src/rpcserver.cpp +++ b/src/rpcserver.cpp @@ -395,6 +395,8 @@ static const CRPCCommand vRPCCommands[] = { "wallet", "z_listaddresses", &z_listaddresses, true }, { "wallet", "z_exportkey", &z_exportkey, true }, { "wallet", "z_importkey", &z_importkey, true }, + { "wallet", "z_exportviewingkey", &z_exportviewingkey, true }, + { "wallet", "z_importviewingkey", &z_importviewingkey, true }, { "wallet", "z_exportwallet", &z_exportwallet, true }, { "wallet", "z_importwallet", &z_importwallet, true }, diff --git a/src/rpcserver.h b/src/rpcserver.h index 321568748..5359f46dd 100644 --- a/src/rpcserver.h +++ b/src/rpcserver.h @@ -279,6 +279,8 @@ extern UniValue getblocksubsidy(const UniValue& params, bool fHelp); extern UniValue z_exportkey(const UniValue& params, bool fHelp); // in rpcdump.cpp extern UniValue z_importkey(const UniValue& params, bool fHelp); // in rpcdump.cpp +extern UniValue z_exportviewingkey(const UniValue& params, bool fHelp); // in rpcdump.cpp +extern UniValue z_importviewingkey(const UniValue& params, bool fHelp); // in rpcdump.cpp extern UniValue z_getnewaddress(const UniValue& params, bool fHelp); // in rpcwallet.cpp extern UniValue z_listaddresses(const UniValue& params, bool fHelp); // in rpcwallet.cpp extern UniValue z_exportwallet(const UniValue& params, bool fHelp); // in rpcdump.cpp diff --git a/src/wallet/rpcdump.cpp b/src/wallet/rpcdump.cpp index fe5b83e8d..76a20d66b 100644 --- a/src/wallet/rpcdump.cpp +++ b/src/wallet/rpcdump.cpp @@ -644,6 +644,91 @@ UniValue z_importkey(const UniValue& params, bool fHelp) return NullUniValue; } +UniValue z_importviewingkey(const UniValue& params, bool fHelp) +{ + if (!EnsureWalletIsAvailable(fHelp)) + return NullUniValue; + + if (fHelp || params.size() < 1 || params.size() > 2) + throw runtime_error( + "z_importviewingkey \"vkey\" ( rescan startHeight )\n" + "\nAdds a viewing key (as returned by z_exportviewingkey) to your wallet.\n" + "\nArguments:\n" + "1. \"vkey\" (string, required) The viewing key (see z_exportviewingkey)\n" + "2. rescan (string, optional, default=\"whenkeyisnew\") Rescan the wallet for transactions - can be \"yes\", \"no\" or \"whenkeyisnew\"\n" + "3. startHeight (numeric, optional, default=0) Block height to start rescan from\n" + "\nNote: This call can take minutes to complete if rescan is true.\n" + "\nExamples:\n" + "\nImport a viewing key\n" + + HelpExampleCli("z_importviewingkey", "\"vkey\"") + + "\nImport the viewing key without rescan\n" + + HelpExampleCli("z_importviewingkey", "\"vkey\", no") + + "\nImport the viewing key with partial rescan\n" + + HelpExampleCli("z_importviewingkey", "\"vkey\" whenkeyisnew 30000") + + "\nRe-import the viewing key with longer partial rescan\n" + + HelpExampleCli("z_importviewingkey", "\"vkey\" yes 20000") + + "\nAs a JSON-RPC call\n" + + HelpExampleRpc("z_importviewingkey", "\"vkey\", \"no\"") + ); + + LOCK2(cs_main, pwalletMain->cs_wallet); + + EnsureWalletIsUnlocked(); + + // Whether to perform rescan after import + bool fRescan = true; + bool fIgnoreExistingKey = true; + if (params.size() > 1) { + auto rescan = params[1].get_str(); + if (rescan.compare("whenkeyisnew") != 0) { + fIgnoreExistingKey = false; + if (rescan.compare("no") == 0) { + fRescan = false; + } else if (rescan.compare("yes") != 0) { + throw JSONRPCError( + RPC_INVALID_PARAMETER, + "rescan must be \"yes\", \"no\" or \"whenkeyisnew\""); + } + } + } + + // Height to rescan from + int nRescanHeight = 0; + if (params.size() > 2) + nRescanHeight = params[2].get_int(); + if (nRescanHeight < 0 || nRescanHeight > chainActive.Height()) { + throw JSONRPCError(RPC_INVALID_PARAMETER, "Block height out of range"); + } + + string strVKey = params[0].get_str(); + CZCViewingKey viewingkey(strVKey); + auto vkey = viewingkey.Get(); + auto addr = vkey.address(); + + { + if (pwalletMain->HaveSpendingKey(addr)) + throw JSONRPCError(RPC_WALLET_ERROR, "The wallet already contains the private key for this viewing key"); + + // Don't throw error in case a viewing key is already there + if (pwalletMain->HaveViewingKey(addr)) { + if (fIgnoreExistingKey) { + return NullUniValue; + } + } else { + pwalletMain->MarkDirty(); + + if (!pwalletMain->AddViewingKey(vkey)) + throw JSONRPCError(RPC_WALLET_ERROR, "Error adding viewing key to wallet"); + } + + // We want to scan for transactions and notes + if (fRescan) { + pwalletMain->ScanForWalletTransactions(chainActive[nRescanHeight], true); + } + } + + return NullUniValue; +} UniValue z_exportkey(const UniValue& params, bool fHelp) { @@ -682,3 +767,43 @@ UniValue z_exportkey(const UniValue& params, bool fHelp) return spendingkey.ToString(); } +UniValue z_exportviewingkey(const UniValue& params, bool fHelp) +{ + if (!EnsureWalletIsAvailable(fHelp)) + return NullUniValue; + + if (fHelp || params.size() != 1) + throw runtime_error( + "z_exportviewingkey \"zaddr\"\n" + "\nReveals the viewing key corresponding to 'zaddr'.\n" + "Then the z_importviewingkey can be used with this output\n" + "\nArguments:\n" + "1. \"zaddr\" (string, required) The zaddr for the viewing key\n" + "\nResult:\n" + "\"vkey\" (string) The viewing key\n" + "\nExamples:\n" + + HelpExampleCli("z_exportviewingkey", "\"myaddress\"") + + HelpExampleRpc("z_exportviewingkey", "\"myaddress\"") + ); + + LOCK2(cs_main, pwalletMain->cs_wallet); + + EnsureWalletIsUnlocked(); + + string strAddress = params[0].get_str(); + + CZCPaymentAddress address(strAddress); + auto addr = address.Get(); + + libzcash::ViewingKey vk; + if (!pwalletMain->GetViewingKey(addr, vk)) { + libzcash::SpendingKey k; + if (!pwalletMain->GetSpendingKey(addr, k)) { + throw JSONRPCError(RPC_WALLET_ERROR, "Wallet does not hold private key or viewing key for this zaddr"); + } + vk = k.viewing_key(); + } + + CZCViewingKey viewingkey(vk); + return viewingkey.ToString(); +} From 9a2b8ae57fdae7d05bd52e6424b5b1ccf19c45c4 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 8 Mar 2017 16:31:59 +1300 Subject: [PATCH 0370/1062] Update wallet logic to account for viewing keys The wallet code previously assumed that an unlocked wallet would always have a spending key associated with a note decryptor. Viewing keys break this assumption. --- src/wallet/wallet.cpp | 35 ++++++++++++++++++++++------------- src/wallet/wallet.h | 6 +++++- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 9e7bba003..b2300c2b4 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -977,7 +977,8 @@ void CWallet::MarkDirty() } /** - * Ensure that every note in the wallet has a cached nullifier. + * Ensure that every note in the wallet (for which we possess a spending key) + * has a cached nullifier. */ bool CWallet::UpdateNullifierNoteMap() { @@ -991,16 +992,17 @@ bool CWallet::UpdateNullifierNoteMap() for (std::pair& wtxItem : mapWallet) { for (mapNoteData_t::value_type& item : wtxItem.second.mapNoteData) { if (!item.second.nullifier) { - auto i = item.first.js; - GetNoteDecryptor(item.second.address, dec); - auto hSig = wtxItem.second.vjoinsplit[i].h_sig( - *pzcashParams, wtxItem.second.joinSplitPubKey); - item.second.nullifier = GetNoteNullifier( - wtxItem.second.vjoinsplit[i], - item.second.address, - dec, - hSig, - item.first.n); + if (GetNoteDecryptor(item.second.address, dec)) { + auto i = item.first.js; + auto hSig = wtxItem.second.vjoinsplit[i].h_sig( + *pzcashParams, wtxItem.second.joinSplitPubKey); + item.second.nullifier = GetNoteNullifier( + wtxItem.second.vjoinsplit[i], + item.second.address, + dec, + hSig, + item.first.n); + } } } UpdateNullifierNoteMapWithTx(wtxItem.second); @@ -1262,7 +1264,9 @@ boost::optional CWallet::GetNoteNullifier(const JSDescription& jsdesc, hSig, (unsigned char) n); auto note = note_pt.note(address); - // SpendingKeys are only available if the wallet is unlocked + // SpendingKeys are only available if: + // - We have them (this isn't a viewing key) + // - The wallet is unlocked libzcash::SpendingKey key; if (GetSpendingKey(address, key)) { ret = note.nullifier(key); @@ -3639,7 +3643,7 @@ bool CMerkleTx::AcceptToMemoryPool(bool fLimitFree, bool fRejectAbsurdFee) * Find notes in the wallet filtered by payment address, min depth and ability to spend. * These notes are decrypted and added to the output parameter vector, outEntries. */ -void CWallet::GetFilteredNotes(std::vector & outEntries, std::string address, int minDepth, bool ignoreSpent) +void CWallet::GetFilteredNotes(std::vector & outEntries, std::string address, int minDepth, bool ignoreSpent, bool ignoreUnspendable) { bool fFilterAddress = false; libzcash::PaymentAddress filterPaymentAddress; @@ -3677,6 +3681,11 @@ void CWallet::GetFilteredNotes(std::vector & outEntries, st continue; } + // skip notes which cannot be spent + if (ignoreUnspendable && !HaveSpendingKey(pa)) { + continue; + } + int i = jsop.js; // Index into CTransaction.vjoinsplit int j = jsop.n; // Index into JSDescription.ciphertexts diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index 878a23a5d..eaaf6bbdf 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -1121,7 +1121,11 @@ public: void SetBroadcastTransactions(bool broadcast) { fBroadcastTransactions = broadcast; } /* Find notes filtered by payment address, min depth, ability to spend */ - void GetFilteredNotes(std::vector & outEntries, std::string address, int minDepth=1, bool ignoreSpent=true); + void GetFilteredNotes(std::vector & outEntries, + std::string address, + int minDepth=1, + bool ignoreSpent=true, + bool ignoreUnspendable=true); }; From 44e37656bf182fb04de051bd2f748bc6fdd897fc Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 21 Apr 2017 00:59:54 +1200 Subject: [PATCH 0371/1062] Add watch-only support to Zcash RPC methods Balance totals do not include spends linked to viewing key addresses, as nullifiers cannot be calculated and therefore spends cannot be detected. --- qa/rpc-tests/wallet_nullifiers.py | 45 ++++++++++++++++++++++++++ src/gtest/test_keystore.cpp | 13 ++++++++ src/keystore.h | 6 ++++ src/rpcclient.cpp | 3 ++ src/wallet/rpcwallet.cpp | 52 +++++++++++++++++++++---------- 5 files changed, 102 insertions(+), 17 deletions(-) diff --git a/qa/rpc-tests/wallet_nullifiers.py b/qa/rpc-tests/wallet_nullifiers.py index b7e94b6a6..743af7c92 100755 --- a/qa/rpc-tests/wallet_nullifiers.py +++ b/qa/rpc-tests/wallet_nullifiers.py @@ -170,5 +170,50 @@ class WalletNullifiersTest (BitcoinTestFramework): assert_equal(self.nodes[1].z_getbalance(myzaddr), zaddrremaining2) assert_equal(self.nodes[2].z_getbalance(myzaddr), zaddrremaining2) + # Test viewing keys + + node3mined = Decimal('250.0') + assert_equal({k: Decimal(v) for k, v in self.nodes[3].z_gettotalbalance().items()}, { + 'transparent': node3mined, + 'private': zsendmany2notevalue, + 'total': node3mined + zsendmany2notevalue, + }) + + # add node 1 address and node 2 viewing key to node 3 + myzvkey = self.nodes[2].z_exportviewingkey(myzaddr) + self.nodes[3].importaddress(mytaddr1) + self.nodes[3].z_importviewingkey(myzvkey) + + # Check the address has been imported + assert_equal(myzaddr in self.nodes[3].z_listaddresses(), False) + assert_equal(myzaddr in self.nodes[3].z_listaddresses(True), True) + + # Node 3 should see the same received notes as node 2 + assert_equal( + self.nodes[2].z_listreceivedbyaddress(myzaddr), + self.nodes[3].z_listreceivedbyaddress(myzaddr)) + + # Node 3's balances should be unchanged without explicitly requesting + # to include watch-only balances + assert_equal({k: Decimal(v) for k, v in self.nodes[3].z_gettotalbalance().items()}, { + 'transparent': node3mined, + 'private': zsendmany2notevalue, + 'total': node3mined + zsendmany2notevalue, + }) + + # Wallet can't cache nullifiers for notes received by addresses it only has a + # viewing key for, and therefore can't detect spends. So it sees a balance + # corresponding to the sum of all notes the address received. + # TODO: Fix this during the Sapling upgrade (via #2277) + assert_equal({k: Decimal(v) for k, v in self.nodes[3].z_gettotalbalance(1, True).items()}, { + 'transparent': node3mined + Decimal('1.0'), + 'private': zsendmany2notevalue + zsendmanynotevalue + zaddrremaining + zaddrremaining2, + 'total': node3mined + Decimal('1.0') + zsendmany2notevalue + zsendmanynotevalue + zaddrremaining + zaddrremaining2, + }) + + # Check individual balances reflect the above + assert_equal(self.nodes[3].z_getbalance(mytaddr1), Decimal('1.0')) + assert_equal(self.nodes[3].z_getbalance(myzaddr), zsendmanynotevalue + zaddrremaining + zaddrremaining2) + if __name__ == '__main__': WalletNullifiersTest().main () diff --git a/src/gtest/test_keystore.cpp b/src/gtest/test_keystore.cpp index 903a48839..76b57cd9f 100644 --- a/src/gtest/test_keystore.cpp +++ b/src/gtest/test_keystore.cpp @@ -65,6 +65,11 @@ TEST(keystore_tests, StoreAndRetrieveViewingKey) { EXPECT_FALSE(keyStore.GetSpendingKey(addr, skOut)); EXPECT_FALSE(keyStore.GetNoteDecryptor(addr, decOut)); + // and we can't find it in our list of addresses + std::set addresses; + keyStore.GetPaymentAddresses(addresses); + EXPECT_FALSE(addresses.count(addr)); + keyStore.AddViewingKey(vk); EXPECT_TRUE(keyStore.HaveViewingKey(addr)); EXPECT_TRUE(keyStore.GetViewingKey(addr, vkOut)); @@ -78,11 +83,19 @@ TEST(keystore_tests, StoreAndRetrieveViewingKey) { EXPECT_TRUE(keyStore.GetNoteDecryptor(addr, decOut)); EXPECT_EQ(ZCNoteDecryption(sk.receiving_key()), decOut); + // ... and we should find it in our list of addresses + addresses.clear(); + keyStore.GetPaymentAddresses(addresses); + EXPECT_TRUE(addresses.count(addr)); + keyStore.RemoveViewingKey(vk); EXPECT_FALSE(keyStore.HaveViewingKey(addr)); EXPECT_FALSE(keyStore.GetViewingKey(addr, vkOut)); EXPECT_FALSE(keyStore.HaveSpendingKey(addr)); EXPECT_FALSE(keyStore.GetSpendingKey(addr, skOut)); + addresses.clear(); + keyStore.GetPaymentAddresses(addresses); + EXPECT_FALSE(addresses.count(addr)); // We still have a decryptor because those are cached in memory // (and also we only remove viewing keys when adding a spending key) diff --git a/src/keystore.h b/src/keystore.h index 0b548920b..b1ad32a42 100644 --- a/src/keystore.h +++ b/src/keystore.h @@ -174,6 +174,12 @@ public: setAddress.insert((*mi).first); mi++; } + ViewingKeyMap::const_iterator mvi = mapViewingKeys.begin(); + while (mvi != mapViewingKeys.end()) + { + setAddress.insert((*mvi).first); + mvi++; + } } } diff --git a/src/rpcclient.cpp b/src/rpcclient.cpp index 7ac5db926..def32500d 100644 --- a/src/rpcclient.cpp +++ b/src/rpcclient.cpp @@ -103,9 +103,12 @@ static const CRPCConvertParam vRPCConvertParams[] = { "zcbenchmark", 1 }, { "zcbenchmark", 2 }, { "getblocksubsidy", 0}, + { "z_listaddresses", 0}, { "z_listreceivedbyaddress", 1}, { "z_getbalance", 1}, { "z_gettotalbalance", 0}, + { "z_gettotalbalance", 1}, + { "z_gettotalbalance", 2}, { "z_sendmany", 1}, { "z_sendmany", 2}, { "z_sendmany", 3}, diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index d2c558c96..4e0a798ac 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -2960,9 +2960,10 @@ UniValue z_listaddresses(const UniValue& params, bool fHelp) if (fHelp || params.size() > 1) throw runtime_error( - "z_listaddresses\n" + "z_listaddresses ( includeWatchonly )\n" "\nReturns the list of zaddr belonging to the wallet.\n" "\nArguments:\n" + "1. includeWatchonly (bool, optional, default=false) Also include watchonly addresses (see 'z_importviewingkey')\n" "\nResult:\n" "[ (json array of string)\n" " \"zaddr\" (string) a zaddr belonging to the wallet\n" @@ -2975,16 +2976,23 @@ UniValue z_listaddresses(const UniValue& params, bool fHelp) LOCK2(cs_main, pwalletMain->cs_wallet); + bool fIncludeWatchonly = false; + if (params.size() > 0) { + fIncludeWatchonly = params[0].get_bool(); + } + UniValue ret(UniValue::VARR); std::set addresses; pwalletMain->GetPaymentAddresses(addresses); for (auto addr : addresses ) { - ret.push_back(CZCPaymentAddress(addr).ToString()); + if (fIncludeWatchonly || pwalletMain->HaveSpendingKey(addr)) { + ret.push_back(CZCPaymentAddress(addr).ToString()); + } } return ret; } -CAmount getBalanceTaddr(std::string transparentAddress, int minDepth=1) { +CAmount getBalanceTaddr(std::string transparentAddress, int minDepth=1, bool ignoreUnspendable=true) { set setAddress; vector vecOutputs; CAmount balance = 0; @@ -3006,6 +3014,10 @@ CAmount getBalanceTaddr(std::string transparentAddress, int minDepth=1) { continue; } + if (ignoreUnspendable && !out.fSpendable) { + continue; + } + if (setAddress.size()) { CTxDestination address; if (!ExtractDestination(out.tx->vout[out.i].scriptPubKey, address)) { @@ -3023,11 +3035,11 @@ CAmount getBalanceTaddr(std::string transparentAddress, int minDepth=1) { return balance; } -CAmount getBalanceZaddr(std::string address, int minDepth = 1) { +CAmount getBalanceZaddr(std::string address, int minDepth = 1, bool ignoreUnspendable=true) { CAmount balance = 0; std::vector entries; LOCK2(cs_main, pwalletMain->cs_wallet); - pwalletMain->GetFilteredNotes(entries, address, minDepth); + pwalletMain->GetFilteredNotes(entries, address, minDepth, true, ignoreUnspendable); for (auto & entry : entries) { balance += CAmount(entry.plaintext.value); } @@ -3076,14 +3088,14 @@ UniValue z_listreceivedbyaddress(const UniValue& params, bool fHelp) throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid zaddr."); } - if (!pwalletMain->HaveSpendingKey(zaddr)) { - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "From address does not belong to this node, zaddr spending key not found."); + if (!(pwalletMain->HaveSpendingKey(zaddr) || pwalletMain->HaveViewingKey(zaddr))) { + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "From address does not belong to this node, zaddr spending key or viewing key not found."); } UniValue result(UniValue::VARR); std::vector entries; - pwalletMain->GetFilteredNotes(entries, fromaddress, nMinDepth, false); + pwalletMain->GetFilteredNotes(entries, fromaddress, nMinDepth, false, false); for (CNotePlaintextEntry & entry : entries) { UniValue obj(UniValue::VOBJ); obj.push_back(Pair("txid",entry.jsop.hash.ToString())); @@ -3142,16 +3154,16 @@ UniValue z_getbalance(const UniValue& params, bool fHelp) } catch (const std::runtime_error&) { throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid from address, should be a taddr or zaddr."); } - if (!pwalletMain->HaveSpendingKey(zaddr)) { - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "From address does not belong to this node, zaddr spending key not found."); + if (!(pwalletMain->HaveSpendingKey(zaddr) || pwalletMain->HaveViewingKey(zaddr))) { + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "From address does not belong to this node, zaddr spending key or viewing key not found."); } } CAmount nBalance = 0; if (fromTaddr) { - nBalance = getBalanceTaddr(fromaddress, nMinDepth); + nBalance = getBalanceTaddr(fromaddress, nMinDepth, false); } else { - nBalance = getBalanceZaddr(fromaddress, nMinDepth); + nBalance = getBalanceZaddr(fromaddress, nMinDepth, false); } return ValueFromAmount(nBalance); @@ -3163,12 +3175,13 @@ UniValue z_gettotalbalance(const UniValue& params, bool fHelp) if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - if (fHelp || params.size() > 1) + if (fHelp || params.size() > 2) throw runtime_error( - "z_gettotalbalance ( minconf )\n" + "z_gettotalbalance ( minconf includeWatchonly )\n" "\nReturn the total value of funds stored in the node’s wallet.\n" "\nArguments:\n" "1. minconf (numeric, optional, default=1) Only include private and transparent transactions confirmed at least this many times.\n" + "2. includeWatchonly (bool, optional, default=false) Also include balance in watchonly addresses (see 'importaddress' and 'z_importviewingkey')\n" "\nResult:\n" "{\n" " \"transparent\": xxxxx, (numeric) the total balance of transparent funds\n" @@ -3187,19 +3200,24 @@ UniValue z_gettotalbalance(const UniValue& params, bool fHelp) LOCK2(cs_main, pwalletMain->cs_wallet); int nMinDepth = 1; - if (params.size() == 1) { + if (params.size() > 0) { nMinDepth = params[0].get_int(); } if (nMinDepth < 0) { throw JSONRPCError(RPC_INVALID_PARAMETER, "Minimum number of confirmations cannot be less than 0"); } + bool fIncludeWatchonly = false; + if (params.size() > 1) { + fIncludeWatchonly = params[1].get_bool(); + } + // getbalance and "getbalance * 1 true" should return the same number // but they don't because wtx.GetAmounts() does not handle tx where there are no outputs // pwalletMain->GetBalance() does not accept min depth parameter // so we use our own method to get balance of utxos. - CAmount nBalance = getBalanceTaddr("", nMinDepth); - CAmount nPrivateBalance = getBalanceZaddr("", nMinDepth); + CAmount nBalance = getBalanceTaddr("", nMinDepth, !fIncludeWatchonly); + CAmount nPrivateBalance = getBalanceZaddr("", nMinDepth, !fIncludeWatchonly); CAmount nTotalBalance = nBalance + nPrivateBalance; UniValue result(UniValue::VOBJ); result.push_back(Pair("transparent", FormatMoney(nBalance))); From 7b8d4f87ec9c9d1988debf124739fbb95da55b8d Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Mon, 18 Dec 2017 16:09:43 +0000 Subject: [PATCH 0372/1062] Modify zcrawkeygen RPC method to set "zcviewingkey" to the viewing key The "zcviewingkey" field has never been documented before, and the method itself is deprecated; this just ensures it is consistent with the rest of the RPC. --- src/wallet/rpcwallet.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 4e0a798ac..696c71c71 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -2902,26 +2902,23 @@ UniValue zc_raw_keygen(const UniValue& params, bool fHelp) "Output: {\n" " \"zcaddress\": zcaddr,\n" " \"zcsecretkey\": zcsecretkey,\n" + " \"zcviewingkey\": zcviewingkey,\n" "}\n" ); } auto k = SpendingKey::random(); auto addr = k.address(); - auto receiving_key = k.receiving_key(); - - CDataStream receiving(SER_NETWORK, PROTOCOL_VERSION); - - receiving << receiving_key; + auto viewing_key = k.viewing_key(); CZCPaymentAddress pubaddr(addr); CZCSpendingKey spendingkey(k); - std::string receiving_hex = HexStr(receiving.begin(), receiving.end()); + CZCViewingKey viewingkey(viewing_key); UniValue result(UniValue::VOBJ); result.push_back(Pair("zcaddress", pubaddr.ToString())); result.push_back(Pair("zcsecretkey", spendingkey.ToString())); - result.push_back(Pair("zcviewingkey", receiving_hex)); + result.push_back(Pair("zcviewingkey", viewingkey.ToString())); return result; } From bec223514819c931f2d6a8abe87611567846d141 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 20 Dec 2017 11:18:59 +0000 Subject: [PATCH 0373/1062] Cleanup: Add braces for clarity --- src/wallet/rpcdump.cpp | 9 ++++++--- src/wallet/wallet.cpp | 15 ++++++++++----- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/wallet/rpcdump.cpp b/src/wallet/rpcdump.cpp index 76a20d66b..52169fe67 100644 --- a/src/wallet/rpcdump.cpp +++ b/src/wallet/rpcdump.cpp @@ -694,8 +694,9 @@ UniValue z_importviewingkey(const UniValue& params, bool fHelp) // Height to rescan from int nRescanHeight = 0; - if (params.size() > 2) + if (params.size() > 2) { nRescanHeight = params[2].get_int(); + } if (nRescanHeight < 0 || nRescanHeight > chainActive.Height()) { throw JSONRPCError(RPC_INVALID_PARAMETER, "Block height out of range"); } @@ -706,8 +707,9 @@ UniValue z_importviewingkey(const UniValue& params, bool fHelp) auto addr = vkey.address(); { - if (pwalletMain->HaveSpendingKey(addr)) + if (pwalletMain->HaveSpendingKey(addr)) { throw JSONRPCError(RPC_WALLET_ERROR, "The wallet already contains the private key for this viewing key"); + } // Don't throw error in case a viewing key is already there if (pwalletMain->HaveViewingKey(addr)) { @@ -717,8 +719,9 @@ UniValue z_importviewingkey(const UniValue& params, bool fHelp) } else { pwalletMain->MarkDirty(); - if (!pwalletMain->AddViewingKey(vkey)) + if (!pwalletMain->AddViewingKey(vkey)) { throw JSONRPCError(RPC_WALLET_ERROR, "Error adding viewing key to wallet"); + } } // We want to scan for transactions and notes diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index b2300c2b4..06dae5e83 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -252,22 +252,27 @@ bool CWallet::LoadZKey(const libzcash::SpendingKey &key) bool CWallet::AddViewingKey(const libzcash::ViewingKey &vk) { - if (!CCryptoKeyStore::AddViewingKey(vk)) + if (!CCryptoKeyStore::AddViewingKey(vk)) { return false; + } nTimeFirstKey = 1; // No birthday information for viewing keys. - if (!fFileBacked) + if (!fFileBacked) { return true; + } return CWalletDB(strWalletFile).WriteViewingKey(vk); } bool CWallet::RemoveViewingKey(const libzcash::ViewingKey &vk) { AssertLockHeld(cs_wallet); - if (!CCryptoKeyStore::RemoveViewingKey(vk)) + if (!CCryptoKeyStore::RemoveViewingKey(vk)) { return false; - if (fFileBacked) - if (!CWalletDB(strWalletFile).EraseViewingKey(vk)) + } + if (fFileBacked) { + if (!CWalletDB(strWalletFile).EraseViewingKey(vk)) { return false; + } + } return true; } From 2bbfe6c4e829655ca48dec0349b7e72134b97e17 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 20 Dec 2017 11:24:51 +0000 Subject: [PATCH 0374/1062] Add cautions to z_getbalance and z_gettotalbalance help text about viewing keys --- src/wallet/rpcwallet.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 696c71c71..829c5c711 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -3114,6 +3114,8 @@ UniValue z_getbalance(const UniValue& params, bool fHelp) throw runtime_error( "z_getbalance \"address\" ( minconf )\n" "\nReturns the balance of a taddr or zaddr belonging to the node’s wallet.\n" + "\nCAUTION: If address is a watch-only zaddr, the returned balance may be larger than the actual balance," + "\nbecause spends cannot be detected with incoming viewing keys.\n" "\nArguments:\n" "1. \"address\" (string) The selected address. It may be a transparent or private address.\n" "2. minconf (numeric, optional, default=1) Only include transactions confirmed at least this many times.\n" @@ -3176,6 +3178,8 @@ UniValue z_gettotalbalance(const UniValue& params, bool fHelp) throw runtime_error( "z_gettotalbalance ( minconf includeWatchonly )\n" "\nReturn the total value of funds stored in the node’s wallet.\n" + "\nCAUTION: If the wallet contains watch-only zaddrs, the returned private balance may be larger than the actual balance," + "\nbecause spends cannot be detected with incoming viewing keys.\n" "\nArguments:\n" "1. minconf (numeric, optional, default=1) Only include private and transparent transactions confirmed at least this many times.\n" "2. includeWatchonly (bool, optional, default=false) Also include balance in watchonly addresses (see 'importaddress' and 'z_importviewingkey')\n" From c4c7c6630befb30386c00e4bb35d529ca35f72bb Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 4 Oct 2017 14:41:40 +0100 Subject: [PATCH 0375/1062] Scope the ECDSA constant sizes to CPubKey / CKey classes --- src/key.cpp | 25 +++++++++++-------------- src/key.h | 24 ++++++++++++++---------- src/pubkey.cpp | 4 ++-- src/pubkey.h | 31 ++++++++++++++++--------------- 4 files changed, 43 insertions(+), 41 deletions(-) diff --git a/src/key.cpp b/src/key.cpp index 4cf693a97..c93f8d15d 100644 --- a/src/key.cpp +++ b/src/key.cpp @@ -85,16 +85,13 @@ static int ec_privkey_import_der(const secp256k1_context* ctx, unsigned char *ou * . The optional parameters and publicKey fields are * included. * - * privkey must point to an output buffer of length at least PRIVATE_KEY_SIZE bytes. + * privkey must point to an output buffer of length at least CKey::PRIVATE_KEY_SIZE bytes. * privkeylen must initially be set to the size of the privkey buffer. Upon return it * will be set to the number of bytes used in the buffer. * key32 must point to a 32-byte raw private key. */ static int ec_privkey_export_der(const secp256k1_context *ctx, unsigned char *privkey, size_t *privkeylen, const unsigned char *key32, int compressed) { - assert(*privkeylen >= PRIVATE_KEY_SIZE); - static_assert( - PRIVATE_KEY_SIZE >= COMPRESSED_PRIVATE_KEY_SIZE, - "COMPRESSED_PRIVATE_KEY_SIZE is larger than PRIVATE_KEY_SIZE"); + assert(*privkeylen >= CKey::PRIVATE_KEY_SIZE); secp256k1_pubkey pubkey; size_t pubkeylen = 0; if (!secp256k1_ec_pubkey_create(ctx, &pubkey, key32)) { @@ -120,11 +117,11 @@ static int ec_privkey_export_der(const secp256k1_context *ctx, unsigned char *pr memcpy(ptr, begin, sizeof(begin)); ptr += sizeof(begin); memcpy(ptr, key32, 32); ptr += 32; memcpy(ptr, middle, sizeof(middle)); ptr += sizeof(middle); - pubkeylen = COMPRESSED_PUBLIC_KEY_SIZE; + pubkeylen = CPubKey::COMPRESSED_PUBLIC_KEY_SIZE; secp256k1_ec_pubkey_serialize(ctx, ptr, &pubkeylen, &pubkey, SECP256K1_EC_COMPRESSED); ptr += pubkeylen; *privkeylen = ptr - privkey; - assert(*privkeylen == COMPRESSED_PRIVATE_KEY_SIZE); + assert(*privkeylen == CKey::COMPRESSED_PRIVATE_KEY_SIZE); } else { static const unsigned char begin[] = { 0x30,0x82,0x01,0x13,0x02,0x01,0x01,0x04,0x20 @@ -146,11 +143,11 @@ static int ec_privkey_export_der(const secp256k1_context *ctx, unsigned char *pr memcpy(ptr, begin, sizeof(begin)); ptr += sizeof(begin); memcpy(ptr, key32, 32); ptr += 32; memcpy(ptr, middle, sizeof(middle)); ptr += sizeof(middle); - pubkeylen = PUBLIC_KEY_SIZE; + pubkeylen = CPubKey::PUBLIC_KEY_SIZE; secp256k1_ec_pubkey_serialize(ctx, ptr, &pubkeylen, &pubkey, SECP256K1_EC_UNCOMPRESSED); ptr += pubkeylen; *privkeylen = ptr - privkey; - assert(*privkeylen == PRIVATE_KEY_SIZE); + assert(*privkeylen == CKey::PRIVATE_KEY_SIZE); } return 1; } @@ -191,7 +188,7 @@ CPrivKey CKey::GetPrivKey() const { CPubKey CKey::GetPubKey() const { assert(fValid); secp256k1_pubkey pubkey; - size_t clen = PUBLIC_KEY_SIZE; + size_t clen = CPubKey::PUBLIC_KEY_SIZE; CPubKey result; int ret = secp256k1_ec_pubkey_create(secp256k1_context_sign, &pubkey, begin()); assert(ret); @@ -204,8 +201,8 @@ CPubKey CKey::GetPubKey() const { bool CKey::Sign(const uint256 &hash, std::vector& vchSig, uint32_t test_case) const { if (!fValid) return false; - vchSig.resize(SIGNATURE_SIZE); - size_t nSigLen = SIGNATURE_SIZE; + vchSig.resize(CPubKey::SIGNATURE_SIZE); + size_t nSigLen = CPubKey::SIGNATURE_SIZE; unsigned char extra_entropy[32] = {0}; WriteLE32(extra_entropy, test_case); secp256k1_ecdsa_signature sig; @@ -233,7 +230,7 @@ bool CKey::VerifyPubKey(const CPubKey& pubkey) const { bool CKey::SignCompact(const uint256 &hash, std::vector& vchSig) const { if (!fValid) return false; - vchSig.resize(COMPACT_SIGNATURE_SIZE); + vchSig.resize(CPubKey::COMPACT_SIGNATURE_SIZE); int rec = -1; secp256k1_ecdsa_recoverable_signature sig; int ret = secp256k1_ecdsa_sign_recoverable(secp256k1_context_sign, &sig, hash.begin(), begin(), secp256k1_nonce_function_rfc6979, NULL); @@ -264,7 +261,7 @@ bool CKey::Derive(CKey& keyChild, ChainCode &ccChild, unsigned int nChild, const LockObject(out); if ((nChild >> 31) == 0) { CPubKey pubkey = GetPubKey(); - assert(pubkey.size() == COMPRESSED_PUBLIC_KEY_SIZE); + assert(pubkey.size() == CPubKey::COMPRESSED_PUBLIC_KEY_SIZE); BIP32Hash(cc, nChild, *pubkey.begin(), pubkey.begin()+1, out); } else { assert(size() == 32); diff --git a/src/key.h b/src/key.h index 292769098..c2b75935c 100644 --- a/src/key.h +++ b/src/key.h @@ -16,16 +16,6 @@ #include -/** - * secp256k1: - */ -const unsigned int PRIVATE_KEY_SIZE = 279; -const unsigned int COMPRESSED_PRIVATE_KEY_SIZE = 214; -/** - * see www.keylength.com - * script supports up to 75 for single byte push - */ - /** * secure_allocator is defined in allocators.h * CPrivKey is a serialized private key, with all parameters included @@ -36,6 +26,20 @@ typedef std::vector > CPrivKey; /** An encapsulated private key. */ class CKey { +public: + /** + * secp256k1: + */ + static const unsigned int PRIVATE_KEY_SIZE = 279; + static const unsigned int COMPRESSED_PRIVATE_KEY_SIZE = 214; + /** + * see www.keylength.com + * script supports up to 75 for single byte push + */ + static_assert( + PRIVATE_KEY_SIZE >= COMPRESSED_PRIVATE_KEY_SIZE, + "COMPRESSED_PRIVATE_KEY_SIZE is larger than PRIVATE_KEY_SIZE"); + private: //! Whether this private key is valid. We check for correctness when modifying the key //! data, so fValid should always correspond to the actual state. diff --git a/src/pubkey.cpp b/src/pubkey.cpp index 6e50a1334..0b87bb526 100644 --- a/src/pubkey.cpp +++ b/src/pubkey.cpp @@ -104,8 +104,8 @@ void CExtPubKey::Encode(unsigned char code[74]) const { code[5] = (nChild >> 24) & 0xFF; code[6] = (nChild >> 16) & 0xFF; code[7] = (nChild >> 8) & 0xFF; code[8] = (nChild >> 0) & 0xFF; memcpy(code+9, chaincode.begin(), 32); - assert(pubkey.size() == COMPRESSED_PUBLIC_KEY_SIZE); - memcpy(code+41, pubkey.begin(), COMPRESSED_PUBLIC_KEY_SIZE); + assert(pubkey.size() == CPubKey::COMPRESSED_PUBLIC_KEY_SIZE); + memcpy(code+41, pubkey.begin(), CPubKey::COMPRESSED_PUBLIC_KEY_SIZE); } void CExtPubKey::Decode(const unsigned char code[74]) { diff --git a/src/pubkey.h b/src/pubkey.h index fcfa019cf..237237e05 100644 --- a/src/pubkey.h +++ b/src/pubkey.h @@ -14,18 +14,6 @@ #include #include -/** - * secp256k1: - */ -const unsigned int PUBLIC_KEY_SIZE = 65; -const unsigned int COMPRESSED_PUBLIC_KEY_SIZE = 33; -const unsigned int SIGNATURE_SIZE = 72; -const unsigned int COMPACT_SIGNATURE_SIZE = 65; -/** - * see www.keylength.com - * script supports up to 75 for single byte push - */ - /** A reference to a CKey: the Hash160 of its serialized public key */ class CKeyID : public uint160 { @@ -39,6 +27,22 @@ typedef uint256 ChainCode; /** An encapsulated public key. */ class CPubKey { +public: + /** + * secp256k1: + */ + static const unsigned int PUBLIC_KEY_SIZE = 65; + static const unsigned int COMPRESSED_PUBLIC_KEY_SIZE = 33; + static const unsigned int SIGNATURE_SIZE = 72; + static const unsigned int COMPACT_SIGNATURE_SIZE = 65; + /** + * see www.keylength.com + * script supports up to 75 for single byte push + */ + static_assert( + PUBLIC_KEY_SIZE >= COMPRESSED_PUBLIC_KEY_SIZE, + "COMPRESSED_PUBLIC_KEY_SIZE is larger than PUBLIC_KEY_SIZE"); + private: /** @@ -46,9 +50,6 @@ private: * Its length can very cheaply be computed from the first byte. */ unsigned char vch[PUBLIC_KEY_SIZE]; - static_assert( - PUBLIC_KEY_SIZE >= COMPRESSED_PUBLIC_KEY_SIZE, - "COMPRESSED_PUBLIC_KEY_SIZE is larger than PUBLIC_KEY_SIZE"); //! Compute the length of a pubkey with a given first byte. unsigned int static GetLen(unsigned char chHeader) From 5221220c6ceed705c3cb3d2d2d9b2eb13a6ac253 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 20 Dec 2017 18:14:40 +0000 Subject: [PATCH 0376/1062] Add release notes for incoming viewing keys --- doc/release-notes.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/doc/release-notes.md b/doc/release-notes.md index a29094b51..21c31787b 100644 --- a/doc/release-notes.md +++ b/doc/release-notes.md @@ -4,3 +4,31 @@ release-notes at release time) Notable changes =============== +Incoming viewing keys +--------------------- + +Support for incoming viewing keys, as described in +[the Zcash protocol spec](https://github.com/zcash/zips/blob/master/protocol/protocol.pdf), +has been added to the wallet. + +Use the `z_exportviewingkey` RPC method to obtain the incoming viewing key for a +z-address in a node's wallet. For Sprout z-addresses, these always begin with +"ZiVK" (or "ZiVt" for testnet z-addresses). Use `z_importviewingkey` to import +these into another node. + +A node that possesses an incoming viewing key for a z-address can view all past +transactions received by that address, as well as all future transactions sent +to it, by using `z_listreceivedbyaddress`. They cannot spend any funds from the +address. This is similar to the behaviour of "watch-only" t-addresses. + +`z_gettotalbalance` now has an additional boolean parameter for including the +balance of "watch-only" addresses (both transparent and shielded), which is set +to `false` by default. `z_getbalance` has also been updated to work with +watch-only addresses. + +- **Caution:** for z-addresses, these balances will **not** be accurate if any + funds have been sent from the address. This is because incoming viewing keys + cannot detect spends, and so the "balance" is just the sum of all received + notes, including ones that have been spent. Some future use-cases for incoming + viewing keys will include synchronization data to keep their balances accurate + (e.g. [#2542](https://github.com/zcash/zcash/issues/2542)). From 2b38d11eda1977e9d3d75a0f32666744ae79f07b Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 20 Dec 2017 23:39:39 +0000 Subject: [PATCH 0377/1062] Create release notes starting from the previous non-beta non-RC release --- zcutil/make-release.py | 55 +++++++++++++++++++++++++++++++++++------ zcutil/release-notes.py | 32 +++++++++++++++--------- 2 files changed, 69 insertions(+), 18 deletions(-) diff --git a/zcutil/make-release.py b/zcutil/make-release.py index 7d505c279..c19544312 100755 --- a/zcutil/make-release.py +++ b/zcutil/make-release.py @@ -26,6 +26,7 @@ def main(args=sys.argv[1:]): main_logged( opts.RELEASE_VERSION, opts.RELEASE_PREV, + opts.RELEASE_FROM, opts.RELEASE_HEIGHT, opts.HOTFIX, ) @@ -61,6 +62,11 @@ def parse_args(args): type=Version.parse_arg, help='The previously released version.', ) + p.add_argument( + 'RELEASE_FROM', + type=Version.parse_arg, + help='The previously released non-beta non-RC version. May be the same as RELEASE_PREV.', + ) p.add_argument( 'RELEASE_HEIGHT', type=int, @@ -70,8 +76,8 @@ def parse_args(args): # Top-level flow: -def main_logged(release, releaseprev, releaseheight, hotfix): - verify_releaseprev_tag(releaseprev) +def main_logged(release, releaseprev, releasefrom, releaseheight, hotfix): + verify_tags(releaseprev, releasefrom) verify_version(release, releaseprev, hotfix) initialize_git(release, hotfix) patch_version_in_files(release, releaseprev) @@ -82,7 +88,7 @@ def main_logged(release, releaseprev, releaseheight, hotfix): gen_manpages() commit('Updated manpages for {}.'.format(release.novtext)) - gen_release_notes(release) + gen_release_notes(release, releasefrom) update_debian_changelog(release) commit( 'Updated release notes and changelog for {}.'.format( @@ -101,8 +107,8 @@ def phase(message): return deco -@phase('Checking RELEASE_PREV tag.') -def verify_releaseprev_tag(releaseprev): +@phase('Checking tags.') +def verify_tags(releaseprev, releasefrom): candidates = [] # Any tag beginning with a 'v' followed by [1-9] must be a version @@ -130,6 +136,31 @@ def verify_releaseprev_tag(releaseprev): ), ) + candidates.reverse() + prev_tags = [] + for candidate in candidates: + if releasefrom == candidate: + break + else: + prev_tags.append(candidate) + else: + raise SystemExit( + '{} does not appear in `git tag --list`' + .format( + releasefrom.vtext, + ), + ) + + for tag in prev_tags: + if not tag.betarc: + raise SystemExit( + '{} appears to be a more recent non-beta non-RC release than {}' + .format( + tag.vtext, + releasefrom.vtext, + ), + ) + @phase('Checking version.') def verify_version(release, releaseprev, hotfix): @@ -238,8 +269,18 @@ def gen_manpages(): @phase('Generating release notes.') -def gen_release_notes(release): - sh_log('python', './zcutil/release-notes.py', '--version', release.novtext) +def gen_release_notes(release, releasefrom): + release_notes = [ + 'python', + './zcutil/release-notes.py', + '--version', + release.novtext, + '--prev', + releasefrom.vtext, + ] + if not release.betarc: + release_notes.append('--clear') + sh_log(*release_notes) sh_log( 'git', 'add', diff --git a/zcutil/release-notes.py b/zcutil/release-notes.py index 24adff0d0..b09c8774e 100755 --- a/zcutil/release-notes.py +++ b/zcutil/release-notes.py @@ -83,11 +83,14 @@ def document_authors(): f.write("{0} ({1})\n".format(n, c)) ## Writes release note to ./doc/release-notes based on git shortlog when current version number is specified -def generate_release_note(version, filename): +def generate_release_note(version, filename, prev, clear): print "Automatically generating release notes for {0} from git shortlog. Should review {1} for accuracy.".format(version, filename) - # fetches latest tags, so that latest_tag will be correct - subprocess.Popen(['git fetch -t'], shell=True, stdout=subprocess.PIPE).communicate()[0] - latest_tag = subprocess.Popen(['git describe --abbrev=0'], shell=True, stdout=subprocess.PIPE).communicate()[0].strip() + if prev: + latest_tag = prev + else: + # fetches latest tags, so that latest_tag will be correct + subprocess.Popen(['git fetch -t'], shell=True, stdout=subprocess.PIPE).communicate()[0] + latest_tag = subprocess.Popen(['git describe --abbrev=0'], shell=True, stdout=subprocess.PIPE).communicate()[0].strip() print "Previous release tag: ", latest_tag notes = subprocess.Popen(['git shortlog --no-merges {0}..HEAD'.format(latest_tag)], shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE).communicate()[0] lines = notes.split('\n') @@ -105,25 +108,32 @@ def generate_release_note(version, filename): f.writelines(notable_changes) f.writelines(RELEASE_NOTES_CHANGELOG_HEADING) f.writelines('\n'.join(lines)) - # Clear temporary release notes file - with open(temp_release_note, 'w') as f: - f.writelines(TEMP_RELEASE_NOTES_HEADER) + if clear: + # Clear temporary release notes file + with open(temp_release_note, 'w') as f: + f.writelines(TEMP_RELEASE_NOTES_HEADER) -def main(version, filename): +def main(version, filename, prev, clear): if version != None: - generate_release_note(version, filename) + generate_release_note(version, filename, prev, clear) document_authors() if __name__ == "__main__": parser = argparse.ArgumentParser() - parser.add_argument('--version') + parser.add_argument('--version', help='Upcoming version, without leading v') + parser.add_argument('--prev', help='Previous version, with leading v') + parser.add_argument('--clear', help='Wipe doc/release-notes.md', action='store_true') args = parser.parse_args() root_dir = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) doc_dir = os.path.join(root_dir, 'doc') version = None filename = None + prev = None + clear = False if args.version: version = args.version filename = 'release-notes-{0}.md'.format(version) - main(version, filename) + prev = args.prev + clear = args.clear + main(version, filename, prev, clear) From d436db662c4c22b20392d102029b9e1a666f49af Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 20 Dec 2017 23:41:08 +0000 Subject: [PATCH 0378/1062] release-notes.py: Remove unnecessary parameter --- zcutil/release-notes.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/zcutil/release-notes.py b/zcutil/release-notes.py index b09c8774e..3413aacaf 100755 --- a/zcutil/release-notes.py +++ b/zcutil/release-notes.py @@ -83,7 +83,8 @@ def document_authors(): f.write("{0} ({1})\n".format(n, c)) ## Writes release note to ./doc/release-notes based on git shortlog when current version number is specified -def generate_release_note(version, filename, prev, clear): +def generate_release_note(version, prev, clear): + filename = 'release-notes-{0}.md'.format(version) print "Automatically generating release notes for {0} from git shortlog. Should review {1} for accuracy.".format(version, filename) if prev: latest_tag = prev @@ -103,7 +104,7 @@ def generate_release_note(version, filename, prev, clear): notable_changes = notable_changes[3:] + ['\n'] else: notable_changes = [] - release_note = os.path.join(doc_dir, 'release-notes', 'release-notes-{0}.md'.format(version)) + release_note = os.path.join(doc_dir, 'release-notes', filename) with open(release_note, 'w') as f: f.writelines(notable_changes) f.writelines(RELEASE_NOTES_CHANGELOG_HEADING) @@ -113,9 +114,9 @@ def generate_release_note(version, filename, prev, clear): with open(temp_release_note, 'w') as f: f.writelines(TEMP_RELEASE_NOTES_HEADER) -def main(version, filename, prev, clear): +def main(version, prev, clear): if version != None: - generate_release_note(version, filename, prev, clear) + generate_release_note(version, prev, clear) document_authors() if __name__ == "__main__": @@ -128,12 +129,10 @@ if __name__ == "__main__": root_dir = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) doc_dir = os.path.join(root_dir, 'doc') version = None - filename = None prev = None clear = False if args.version: version = args.version - filename = 'release-notes-{0}.md'.format(version) prev = args.prev clear = args.clear - main(version, filename, prev, clear) + main(version, prev, clear) From fd08c5024729239c3d7bcb61dbbd595cd2b66d19 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 21 Dec 2017 00:24:43 +0000 Subject: [PATCH 0379/1062] Regenerate previous release notes to conform to new format Pre-1.0.0 release notes are excluded, as they were operating under a different RC timeline, and make more sense separated. --- doc/release-notes/release-notes-1.0.11.md | 42 ++++++++- doc/release-notes/release-notes-1.0.12.md | 55 ++++++++++- doc/release-notes/release-notes-1.0.13-rc1.md | 2 +- doc/release-notes/release-notes-1.0.13-rc2.md | 86 ++++++++++++++++- doc/release-notes/release-notes-1.0.13.md | 93 ++++++++++++++++++- 5 files changed, 272 insertions(+), 6 deletions(-) diff --git a/doc/release-notes/release-notes-1.0.11.md b/doc/release-notes/release-notes-1.0.11.md index 7a36c0be6..d5a12a222 100644 --- a/doc/release-notes/release-notes-1.0.11.md +++ b/doc/release-notes/release-notes-1.0.11.md @@ -1,7 +1,47 @@ Changelog ========= -Jack Grigg (2): +Ariel Gabizon (3): + make-release.py: Versioning changes for 1.0.11-rc1. + make-release.py: Updated manpages for 1.0.11-rc1. + make-release.py: Updated release notes and changelog for 1.0.11-rc1. + +Daira Hopwood (7): + Clean up imports to be pyflakes-checkable. fixes #2450 + For unused variables reported by pyflakes, either remove the variable, suppress the warning, or fix a bug (if the wrong variable was used). refs #2450 + Cosmetics (trailing whitespace, comment conventions, etc.) + Alert 1004 (version 1.0.10 only) + Remove UPnP support. fixes #2500 + Change wording in Security Warnings section of README.md. + Document our criteria for adding CI workers. closes #2499 + +Jack Grigg (17): + Pull in temporary release notes during the release process + Ansible playbook for installing Zcash dependencies and Buildbot worker + Variable overrides for Debian, Ubuntu and Fedora + Variable overrides for FreeBSD + Simplify Python installation, inform user if they need to manually configure + Add test for issue #2444 + Add Buildbot worker setup to Ansible playbook + Add steps for setting up a latent worker on Amazon EC2 + Add pyblake2 to required Python modules + Remove Buildbot version from host file + Add a separate Buildbot host info template for EC2 + Add pyflakes to required Python modules + Add block download progress to metrics UI + Correct and extend EstimateNetHeightInner tests + Improve network height estimation make-release.py: Versioning changes for 1.0.11. make-release.py: Updated manpages for 1.0.11. +Simon Liu (3): + Closes #2446 by adding generated field to listunspent. + Fixes #2519. When sending from a zaddr, minconf cannot be zero. + Fixes #2480. Null entry in map was dereferenced leading to a segfault. + +Wladimir J. van der Laan (1): + rpc: Add WWW-Authenticate header to 401 response + +practicalswift (1): + Net: Fix resource leak in ReadBinaryFile(...) + diff --git a/doc/release-notes/release-notes-1.0.12.md b/doc/release-notes/release-notes-1.0.12.md index ca9190268..6aa6cd651 100644 --- a/doc/release-notes/release-notes-1.0.12.md +++ b/doc/release-notes/release-notes-1.0.12.md @@ -1,14 +1,65 @@ Changelog ========= -Jack Grigg (5): +Ariel (1): + add examples to z_getoperationresult + +Ariel Gabizon (1): + add load-wallet benchmark + +Bjorn Hjortsberg (2): + Do not warn on built in declaration mismatch + Remove deprecated exception specification + +Jack Grigg (26): + ci-workers: Enable pipelining, and use root to set admin and host details + Variable overrides for Arch Linux + Rationalize currency unit to "ZEC" + ci-workers: Fail if Python is not version 2.7 + ci-workers: Variable overrides and process tweaks for CentOS 7 + Add build progress to the release script if progressbar module is available + Add hotfix support to release script + Document the hotfix release process + Enforce sequential hotfix versioning + Benchmark time to call sendtoaddress with many UTXOs + Fix bug in benchmark data generation script + Adjust instructions for UTXO dataset creation + Add GitHub release notes to release process + Clarify branching and force-building operations in hotfix process + Update user guide translations as part of release process + make-release.py: Send stderr to stdout + List dependencies for release script in release process doc + Additional test cases for importprivkey RPC test + make-release.py: Versioning changes for 1.0.12-rc1. + make-release.py: Updated manpages for 1.0.12-rc1. + make-release.py: Updated release notes and changelog for 1.0.12-rc1. Fix pyflakes warnings in RPC tests Individualise performance-measurements.sh errors for debugging Fix incorrect failure in memory benchmark make-release.py: Versioning changes for 1.0.12. make-release.py: Updated manpages for 1.0.12. -Simon Liu (2): +Jason Davies (1): + Fix deprecation policy comment. + +Nathan Wilcox (5): + key_import_export rpc-test: verify that UTXO view co-evolves for nodes sharing a key. + Add a new rpc-test-specified requirement: `importprivkey` outputs the associated address. (Test fails.) + [tests pass] Output address on new key import. + Add a new requirement that `importprivkey` API is idempotent. + [tests pass] Ensure `importprivkey` outputs the address in case key is already imported. + +Ross Nicoll (1): + Rationalize currency unit to "BTC" + +Simon Liu (5): + Closes #2583. Exclude watch-only utxos from z_sendmany coin selection. + Set up a clean chain. Delete redundant method wait_until_miner_sees() via use of sync_all(). + Implement RPC shield_coinbase #2448. Update which lock to synchronize on when calling GetBestAnchor(). Closes #2637. Make z_shieldcoinbase an experimental feature where it can be enabled with: zcashd -experimentalfeatures -zshieldcoinbase. +kpcyrd (2): + Fetch params from ipfs if possible + Prefer wget over ipfs + diff --git a/doc/release-notes/release-notes-1.0.13-rc1.md b/doc/release-notes/release-notes-1.0.13-rc1.md index 90e2306ad..4d8a37a7c 100644 --- a/doc/release-notes/release-notes-1.0.13-rc1.md +++ b/doc/release-notes/release-notes-1.0.13-rc1.md @@ -13,7 +13,7 @@ Cory Fields (1): Duke Leto (1): Update performance-measurements.sh -Jack Grigg (36): +Jack Grigg (37): Squashed 'src/snark/' content from commit 9ada3f8 Add libsnark compile flag to not copy DEPINST to PREFIX Add Ansible playbook for grind workers diff --git a/doc/release-notes/release-notes-1.0.13-rc2.md b/doc/release-notes/release-notes-1.0.13-rc2.md index 0b60ffc9a..6ade7d922 100644 --- a/doc/release-notes/release-notes-1.0.13-rc2.md +++ b/doc/release-notes/release-notes-1.0.13-rc2.md @@ -1,7 +1,57 @@ Changelog ========= -Jack Grigg (6): +Ariel Gabizon (1): + boost::format -> tinyformat + +Bruno Arueira (1): + Removes out bitcoin mention in favor for zcash + +Cory Fields (1): + httpserver: explicitly detach worker threads + +Duke Leto (1): + Update performance-measurements.sh + +Jack Grigg (44): + Squashed 'src/snark/' content from commit 9ada3f8 + Add libsnark compile flag to not copy DEPINST to PREFIX + Add Ansible playbook for grind workers + Add connections in BIP65 and BIP66 tests to the test manager + Add benchmark for listunspent + [Test] MiniNode: Implement JSDescription parsing + [Test] MiniNode: Implement v2 CTransaction parsing + [Test] MiniNode: Implement Zcash block parsing + [Test] MiniNode: Update protocol version and network magics + [Test] MiniNode: Use Zcash PoW + [Test] MiniNode: Fix coinbase creation + [Test] MiniNode: Coerce OP_PUSHDATA bytearrays to bytes + [Test] MiniNode: Implement Zcash coinbase + Fix BIP65 and BIP66 tests + Un-indent RPC test output in test runner + Replace full-test-suite.sh with a new test suite driver script + Move ensure-no-dot-so-in-depends.py into full_test_suite.py + Move check-security-hardening.sh into full_test_suite.py + Add memory benchmark for validatelargetx + Migrate libsnark test code to Google Test + Remove test code corresponding to removed code + Add alt_bn128 to QAP and Merkle tree gadget tests + Update libsnark LDLIBS + Add "make check" to libsnark that runs the Google Tests + Add "make libsnark-tests" that runs libsnark's "make check" + Changes to get test_r1cs_ppzksnark passing + Add bitcoin-util-test.py to full_test_suite.py + Add stdout notice if any stage fails + Add libsnark to "make clean" + Ensure that libsnark is built first, so its headers are available + Remove OpenSSL libraries from libsnark LDLIBS + Add libsnark tests to full_test_suite.py + Add --list-stages argument to full_test_suite.py + Fix NPE in rpc_wallet_tests + make-release.py: Versioning changes for 1.0.13-rc1. + make-release.py: Updated manpages for 1.0.13-rc1. + make-release.py: Updated release notes and changelog for 1.0.13-rc1. + Change auto-senescence cycle to 16 weeks Move libsnark from DIST_SUBDIRS into EXTRA_DIST Pass correct dependencies path to libsnark from both Gitian and build.sh Mark libsnark includes as library includes @@ -9,3 +59,37 @@ Jack Grigg (6): make-release.py: Versioning changes for 1.0.13-rc2. make-release.py: Updated manpages for 1.0.13-rc2. +Jason Davies (1): + Replace "bitcoin" with "Zcash". + +Jay Graber (1): + s/zcash/Zcash + +Jonathan "Duke" Leto (1): + Fix bug where performance-measurements.sh fails hards when given no args + +João Barbosa (1): + Improve shutdown process + +Sean Bowe (5): + Remove libsnark from depends system and integrate it into build system. + Remove crusty old "loadVerifyingKey"/"loadProvingKey" APIs and associated invariants. + Refactor proof generation function. + Add streaming prover. + Integrate low memory prover. + +Simon Liu (7): + Replace 'bitcoin address' with 'zcash address'. + Closes #2639. z_shieldcoinbase is now supported, no longer experimental. + Closes #2263 fixing broken pipe error. + Closes #2576. Update link to security info on z.cash website. + Closes #2639. Adds optional limit parameter with a default value of 50. + Fix an issue where qa test wallet_shieldcoinbase could hang. + Add payment disclosure as experimental feature. + +Wladimir J. van der Laan (4): + Make HTTP server shutdown more graceful + http: Wait for worker threads to exit + http: Force-exit event loop after predefined time + http: speed up shutdown + diff --git a/doc/release-notes/release-notes-1.0.13.md b/doc/release-notes/release-notes-1.0.13.md index d65521687..3a1a950a9 100644 --- a/doc/release-notes/release-notes-1.0.13.md +++ b/doc/release-notes/release-notes-1.0.13.md @@ -1,7 +1,98 @@ Changelog ========= -Jack Grigg (2): +Ariel Gabizon (1): + boost::format -> tinyformat + +Bruno Arueira (1): + Removes out bitcoin mention in favor for zcash + +Cory Fields (1): + httpserver: explicitly detach worker threads + +Duke Leto (1): + Update performance-measurements.sh + +Jack Grigg (47): + Squashed 'src/snark/' content from commit 9ada3f8 + Add libsnark compile flag to not copy DEPINST to PREFIX + Add Ansible playbook for grind workers + Add connections in BIP65 and BIP66 tests to the test manager + Add benchmark for listunspent + [Test] MiniNode: Implement JSDescription parsing + [Test] MiniNode: Implement v2 CTransaction parsing + [Test] MiniNode: Implement Zcash block parsing + [Test] MiniNode: Update protocol version and network magics + [Test] MiniNode: Use Zcash PoW + [Test] MiniNode: Fix coinbase creation + [Test] MiniNode: Coerce OP_PUSHDATA bytearrays to bytes + [Test] MiniNode: Implement Zcash coinbase + Fix BIP65 and BIP66 tests + Un-indent RPC test output in test runner + Replace full-test-suite.sh with a new test suite driver script + Move ensure-no-dot-so-in-depends.py into full_test_suite.py + Move check-security-hardening.sh into full_test_suite.py + Add memory benchmark for validatelargetx + Migrate libsnark test code to Google Test + Remove test code corresponding to removed code + Add alt_bn128 to QAP and Merkle tree gadget tests + Update libsnark LDLIBS + Add "make check" to libsnark that runs the Google Tests + Add "make libsnark-tests" that runs libsnark's "make check" + Changes to get test_r1cs_ppzksnark passing + Add bitcoin-util-test.py to full_test_suite.py + Add stdout notice if any stage fails + Add libsnark to "make clean" + Ensure that libsnark is built first, so its headers are available + Remove OpenSSL libraries from libsnark LDLIBS + Add libsnark tests to full_test_suite.py + Add --list-stages argument to full_test_suite.py + Fix NPE in rpc_wallet_tests + make-release.py: Versioning changes for 1.0.13-rc1. + make-release.py: Updated manpages for 1.0.13-rc1. + make-release.py: Updated release notes and changelog for 1.0.13-rc1. + Change auto-senescence cycle to 16 weeks + Move libsnark from DIST_SUBDIRS into EXTRA_DIST + Pass correct dependencies path to libsnark from both Gitian and build.sh + Mark libsnark includes as library includes + Add the tar-pax option to automake + make-release.py: Versioning changes for 1.0.13-rc2. + make-release.py: Updated manpages for 1.0.13-rc2. + make-release.py: Updated release notes and changelog for 1.0.13-rc2. make-release.py: Versioning changes for 1.0.13. make-release.py: Updated manpages for 1.0.13. +Jason Davies (1): + Replace "bitcoin" with "Zcash". + +Jay Graber (1): + s/zcash/Zcash + +Jonathan "Duke" Leto (1): + Fix bug where performance-measurements.sh fails hards when given no args + +João Barbosa (1): + Improve shutdown process + +Sean Bowe (5): + Remove libsnark from depends system and integrate it into build system. + Remove crusty old "loadVerifyingKey"/"loadProvingKey" APIs and associated invariants. + Refactor proof generation function. + Add streaming prover. + Integrate low memory prover. + +Simon Liu (7): + Replace 'bitcoin address' with 'zcash address'. + Closes #2639. z_shieldcoinbase is now supported, no longer experimental. + Closes #2263 fixing broken pipe error. + Closes #2576. Update link to security info on z.cash website. + Closes #2639. Adds optional limit parameter with a default value of 50. + Fix an issue where qa test wallet_shieldcoinbase could hang. + Add payment disclosure as experimental feature. + +Wladimir J. van der Laan (4): + Make HTTP server shutdown more graceful + http: Wait for worker threads to exit + http: Force-exit event loop after predefined time + http: speed up shutdown + From 5d8ab776f09475b0108f0a05c3e1bf2a1da69d1f Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 21 Dec 2017 00:25:29 +0000 Subject: [PATCH 0380/1062] Exclude beta and RC release notes from author tallies (except for pre-1.0.0, per previous commit) --- doc/authors.md | 4 ++-- zcutil/release-notes.py | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/doc/authors.md b/doc/authors.md index 7094aff8b..a6dedffbc 100644 --- a/doc/authors.md +++ b/doc/authors.md @@ -1,7 +1,7 @@ Zcash Contributors ================== -Jack Grigg (514) +Jack Grigg (518) Simon Liu (281) Sean Bowe (193) Daira Hopwood (102) @@ -19,6 +19,7 @@ fanquake (5) MarcoFalke (5) Johnathan Corgan (5) Gregory Maxwell (5) +Ariel Gabizon (5) Philip Kaufmann (4) Peter Todd (4) Patrick Strateman (4) @@ -27,7 +28,6 @@ Karl-Johan Alm (4) Jeff Garzik (4) David Mercer (4) Daniel Cousens (4) -Ariel Gabizon (4) lpescher (3) kozyilmaz (3) Pavel Janík (3) diff --git a/zcutil/release-notes.py b/zcutil/release-notes.py index 3413aacaf..01f658f07 100755 --- a/zcutil/release-notes.py +++ b/zcutil/release-notes.py @@ -70,6 +70,10 @@ def document_authors(): f.write('Zcash Contributors\n==================\n\n') total_contrib = {} for notes in os.listdir(os.path.join(doc_dir, 'release-notes')): + # Commits are duplicated across beta, RC and final release notes, + # except for the pre-launch release notes. + if ('-beta' in notes or '-rc' in notes) and '1.0.0-' not in notes: + continue authors = authors_in_release_notes(notes) for author in authors: commits = int(authors[author]) From bf69507cb579f88c36c80d29379c050fb28aaad6 Mon Sep 17 00:00:00 2001 From: kozyilmaz Date: Thu, 21 Dec 2017 12:35:16 +0300 Subject: [PATCH 0381/1062] Fix test/gtest bugs caught by latest macOS clang --- src/gtest/test_deprecation.cpp | 2 +- src/test/rpc_wallet_tests.cpp | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/gtest/test_deprecation.cpp b/src/gtest/test_deprecation.cpp index 72d98cf91..c44b810f1 100644 --- a/src/gtest/test_deprecation.cpp +++ b/src/gtest/test_deprecation.cpp @@ -24,7 +24,7 @@ static bool ThreadSafeMessageBox(MockUIInterface *mock, const std::string& caption, unsigned int style) { - mock->ThreadSafeMessageBox(message, caption, style); + return mock->ThreadSafeMessageBox(message, caption, style); } class DeprecationTest : public ::testing::Test { diff --git a/src/test/rpc_wallet_tests.cpp b/src/test/rpc_wallet_tests.cpp index e444eb2a5..9f8734648 100644 --- a/src/test/rpc_wallet_tests.cpp +++ b/src/test/rpc_wallet_tests.cpp @@ -46,6 +46,13 @@ bool find_error(const UniValue& objError, const std::string& expected) { return find_value(objError, "message").get_str().find(expected) != string::npos; } +static UniValue ValueFromString(const std::string &str) +{ + UniValue value; + BOOST_CHECK(value.setNumStr(str)); + return value; +} + BOOST_FIXTURE_TEST_SUITE(rpc_wallet_tests, TestingSetup) BOOST_AUTO_TEST_CASE(rpc_addmultisig) @@ -1061,14 +1068,14 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_internals) CTransaction tx = proxy.getTx(); BOOST_CHECK(tx.vout.size() == 0); - CAmount amount = 123.456; + CAmount amount = AmountFromValue(ValueFromString("123.456")); proxy.add_taddr_change_output_to_tx(amount); tx = proxy.getTx(); BOOST_CHECK(tx.vout.size() == 1); CTxOut out = tx.vout[0]; BOOST_CHECK_EQUAL(out.nValue, amount); - amount = 1.111; + amount = AmountFromValue(ValueFromString("1.111")); proxy.add_taddr_change_output_to_tx(amount); tx = proxy.getTx(); BOOST_CHECK(tx.vout.size() == 2); From 5d9cf8ae2362c5f67197783692cf32eb3351f53e Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 21 Dec 2017 18:19:42 +0000 Subject: [PATCH 0382/1062] Fix pyflakes warnings in zkey_import_export RPC test --- qa/rpc-tests/zkey_import_export.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/qa/rpc-tests/zkey_import_export.py b/qa/rpc-tests/zkey_import_export.py index e9cd94253..f6d7af765 100755 --- a/qa/rpc-tests/zkey_import_export.py +++ b/qa/rpc-tests/zkey_import_export.py @@ -65,7 +65,7 @@ class ZkeyImportExportTest (BitcoinTestFramework): def z_send(from_node, from_addr, to_addr, amount): opid = from_node.z_sendmany(from_addr, [{"address": to_addr, "amount": Decimal(amount)}]) - txid = self.wait_and_assert_operationid_status(from_node, opid) + self.wait_and_assert_operationid_status(from_node, opid) self.sync_all() miner.generate(1) self.sync_all() @@ -112,12 +112,9 @@ class ZkeyImportExportTest (BitcoinTestFramework): # Shield Alice's coinbase funds to her zaddr alice_zaddr = alice.z_getnewaddress() res = alice.z_shieldcoinbase("*", alice_zaddr) - txid = self.wait_and_assert_operationid_status(alice, res['opid']) + self.wait_and_assert_operationid_status(alice, res['opid']) miner.generate(6) self.sync_all() - # List funds - funds = alice.z_listreceivedbyaddress(alice_zaddr) - # print("Alice's funds after shield", funds) # Now get a pristine z-address for receiving transfers: bob_zaddr = bob.z_getnewaddress() From 275f21ad4bd278d80873160c08e3fc4af40aad91 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 22 Dec 2017 09:59:01 +0000 Subject: [PATCH 0383/1062] make-release.py: Versioning changes for 1.0.14-rc1. --- README.md | 2 +- configure.ac | 4 ++-- contrib/gitian-descriptors/gitian-linux.yml | 2 +- src/clientversion.h | 4 ++-- src/deprecation.h | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 2efce727a..28e50f21a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Zcash 1.0.13 +Zcash 1.0.14-rc1 ============= What is Zcash? diff --git a/configure.ac b/configure.ac index b44b486a3..11a729fb8 100644 --- a/configure.ac +++ b/configure.ac @@ -2,8 +2,8 @@ dnl require autoconf 2.60 (AS_ECHO/AS_ECHO_N) AC_PREREQ([2.60]) define(_CLIENT_VERSION_MAJOR, 1) define(_CLIENT_VERSION_MINOR, 0) -define(_CLIENT_VERSION_REVISION, 13) -define(_CLIENT_VERSION_BUILD, 50) +define(_CLIENT_VERSION_REVISION, 14) +define(_CLIENT_VERSION_BUILD, 25) define(_ZC_BUILD_VAL, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, m4_incr(_CLIENT_VERSION_BUILD), m4_eval(_CLIENT_VERSION_BUILD < 50), 1, m4_eval(_CLIENT_VERSION_BUILD - 24), m4_eval(_CLIENT_VERSION_BUILD == 50), 1, , m4_eval(_CLIENT_VERSION_BUILD - 50))) define(_CLIENT_VERSION_SUFFIX, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, _CLIENT_VERSION_REVISION-beta$1, m4_eval(_CLIENT_VERSION_BUILD < 50), 1, _CLIENT_VERSION_REVISION-rc$1, m4_eval(_CLIENT_VERSION_BUILD == 50), 1, _CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION-$1))) define(_CLIENT_VERSION_IS_RELEASE, true) diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml index 3096a7f0d..52de67b0a 100644 --- a/contrib/gitian-descriptors/gitian-linux.yml +++ b/contrib/gitian-descriptors/gitian-linux.yml @@ -1,5 +1,5 @@ --- -name: "zcash-1.0.13" +name: "zcash-1.0.14-rc1" enable_cache: true distro: "debian" suites: diff --git a/src/clientversion.h b/src/clientversion.h index f1081d553..6be622218 100644 --- a/src/clientversion.h +++ b/src/clientversion.h @@ -17,8 +17,8 @@ //! These need to be macros, as clientversion.cpp's and bitcoin*-res.rc's voodoo requires it #define CLIENT_VERSION_MAJOR 1 #define CLIENT_VERSION_MINOR 0 -#define CLIENT_VERSION_REVISION 13 -#define CLIENT_VERSION_BUILD 50 +#define CLIENT_VERSION_REVISION 14 +#define CLIENT_VERSION_BUILD 25 //! Set to true for release, false for prerelease or test build #define CLIENT_VERSION_IS_RELEASE true diff --git a/src/deprecation.h b/src/deprecation.h index 434a81f36..0272c26fe 100644 --- a/src/deprecation.h +++ b/src/deprecation.h @@ -8,7 +8,7 @@ // Deprecation policy: // * Shut down 16 weeks' worth of blocks after the estimated release block height. // * A warning is shown during the 2 weeks' worth of blocks prior to shut down. -static const int APPROX_RELEASE_HEIGHT = 222900; +static const int APPROX_RELEASE_HEIGHT = 241200; static const int WEEKS_UNTIL_DEPRECATION = 16; static const int DEPRECATION_HEIGHT = APPROX_RELEASE_HEIGHT + (WEEKS_UNTIL_DEPRECATION * 7 * 24 * 24); From f059d520383a8a75398851788f62dd1ecf3ff017 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 22 Dec 2017 10:12:30 +0000 Subject: [PATCH 0384/1062] make-release.py: Updated manpages for 1.0.14-rc1. --- doc/man/zcash-cli.1 | 6 +++--- doc/man/zcash-tx.1 | 6 +++--- doc/man/zcashd.1 | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/doc/man/zcash-cli.1 b/doc/man/zcash-cli.1 index a77b67ffc..aecbadd33 100644 --- a/doc/man/zcash-cli.1 +++ b/doc/man/zcash-cli.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASH-CLI "1" "November 2017" "zcash-cli v1.0.13" "User Commands" +.TH ZCASH-CLI "1" "December 2017" "zcash-cli v1.0.14-rc1" "User Commands" .SH NAME -zcash-cli \- manual page for zcash-cli v1.0.13 +zcash-cli \- manual page for zcash-cli v1.0.14-rc1 .SH DESCRIPTION -Zcash RPC client version v1.0.13 +Zcash RPC client version v1.0.14\-rc1 .PP In order to ensure you are adequately protecting your privacy when using Zcash, please see . diff --git a/doc/man/zcash-tx.1 b/doc/man/zcash-tx.1 index fb54abf11..37a7c6bad 100644 --- a/doc/man/zcash-tx.1 +++ b/doc/man/zcash-tx.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASH-TX "1" "November 2017" "zcash-tx v1.0.13" "User Commands" +.TH ZCASH-TX "1" "December 2017" "zcash-tx v1.0.14-rc1" "User Commands" .SH NAME -zcash-tx \- manual page for zcash-tx v1.0.13 +zcash-tx \- manual page for zcash-tx v1.0.14-rc1 .SH DESCRIPTION -Zcash zcash\-tx utility version v1.0.13 +Zcash zcash\-tx utility version v1.0.14\-rc1 .SS "Usage:" .TP zcash\-tx [options] [commands] diff --git a/doc/man/zcashd.1 b/doc/man/zcashd.1 index e6ea1b8dc..6bf56c315 100644 --- a/doc/man/zcashd.1 +++ b/doc/man/zcashd.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASHD "1" "November 2017" "zcashd v1.0.13" "User Commands" +.TH ZCASHD "1" "December 2017" "zcashd v1.0.14-rc1" "User Commands" .SH NAME -zcashd \- manual page for zcashd v1.0.13 +zcashd \- manual page for zcashd v1.0.14-rc1 .SH DESCRIPTION -Zcash Daemon version v1.0.13 +Zcash Daemon version v1.0.14\-rc1 .PP In order to ensure you are adequately protecting your privacy when using Zcash, please see . @@ -54,7 +54,7 @@ Specify data directory \fB\-disabledeprecation=\fR .IP Disable block\-height node deprecation and automatic shutdown (example: -\fB\-disabledeprecation\fR=\fI\,1\/\fR.0.13) +\fB\-disabledeprecation\fR=\fI\,1\/\fR.0.14\-rc1) .HP \fB\-exportdir=\fR .IP From ea6ec713ea2183da159eb1c011b9fa17437b4370 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 22 Dec 2017 10:12:41 +0000 Subject: [PATCH 0385/1062] make-release.py: Updated release notes and changelog for 1.0.14-rc1. --- contrib/debian/changelog | 6 + doc/release-notes/release-notes-1.0.14-rc1.md | 156 ++++++++++++++++++ 2 files changed, 162 insertions(+) create mode 100644 doc/release-notes/release-notes-1.0.14-rc1.md diff --git a/contrib/debian/changelog b/contrib/debian/changelog index 71e8b0b58..66e6a3a42 100644 --- a/contrib/debian/changelog +++ b/contrib/debian/changelog @@ -1,3 +1,9 @@ +zcash (1.0.14~rc1) stable; urgency=medium + + * 1.0.14-rc1 release. + + -- Zcash Company Fri, 22 Dec 2017 10:12:41 +0000 + zcash (1.0.13) stable; urgency=medium * 1.0.13 release. diff --git a/doc/release-notes/release-notes-1.0.14-rc1.md b/doc/release-notes/release-notes-1.0.14-rc1.md new file mode 100644 index 000000000..1654bf483 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.14-rc1.md @@ -0,0 +1,156 @@ +Notable changes +=============== + +Incoming viewing keys +--------------------- + +Support for incoming viewing keys, as described in +[the Zcash protocol spec](https://github.com/zcash/zips/blob/master/protocol/protocol.pdf), +has been added to the wallet. + +Use the `z_exportviewingkey` RPC method to obtain the incoming viewing key for a +z-address in a node's wallet. For Sprout z-addresses, these always begin with +"ZiVK" (or "ZiVt" for testnet z-addresses). Use `z_importviewingkey` to import +these into another node. + +A node that possesses an incoming viewing key for a z-address can view all past +transactions received by that address, as well as all future transactions sent +to it, by using `z_listreceivedbyaddress`. They cannot spend any funds from the +address. This is similar to the behaviour of "watch-only" t-addresses. + +`z_gettotalbalance` now has an additional boolean parameter for including the +balance of "watch-only" addresses (both transparent and shielded), which is set +to `false` by default. `z_getbalance` has also been updated to work with +watch-only addresses. + +- **Caution:** for z-addresses, these balances will **not** be accurate if any + funds have been sent from the address. This is because incoming viewing keys + cannot detect spends, and so the "balance" is just the sum of all received + notes, including ones that have been spent. Some future use-cases for incoming + viewing keys will include synchronization data to keep their balances accurate + (e.g. [#2542](https://github.com/zcash/zcash/issues/2542)). + +Changelog +========= + +Anthony Towns (1): + Add configure check for -latomic + +Cory Fields (12): + c++11: don't throw from the reverselock destructor + c++11: CAccountingEntry must be defined before use in a list + c++11: fix libbdb build against libc++ in c++11 mode + depends: use c++11 + depends: bump OSX toolchain + build: Split hardening/fPIE options out + build: define base filenames for use elsewhere in the buildsystem + build: quiet annoying warnings without adding new ones + build: fix Windows builds without pkg-config + build: force a c++ standard to be specified + build: warn about variable length arrays + build: add --enable-werror option + +Jack Grigg (36): + Squashed 'src/secp256k1/' changes from 84973d3..6ad5cdb + Use g-prefixed coreutils commands if they are available + Replace hard-coded defaults for HOST and BUILD with config.guess + Remove manual -std=c++11 flag + Replace "install -D" with "mkdir -p && install" + Check if OpenMP is available before using it + [libsnark] Use POSIX-compliant ar arguments + Include endian-ness compatibility layer in Equihash implementation + build: Split hardening/fPIE options out in Zcash-specific binaries + Change --enable-werror to apply to all warnings, use it in build.sh + Move Zcash flags into configure.ac + ViewingKey -> ReceivingKey per zcash/zips#117 + Implement viewing key storage in the keystore + Factor out common logic from CZCPaymentAddress and CZCSpendingKey + Track net value entering and exiting the Sprout circuit + Add Sprout value pool to getblock and getblockchaininfo + Apply -fstack-protector-all to libsnark + Add Rust and Proton to configure options printout + Clarify operator precedence in serialization of nSproutValue + Remove nSproutValue TODO from CDiskBlockIndex + Add Base58 encoding of viewing keys + Implement viewing key storage in the wallet + Add RPC methods for exporting/importing viewing keys + Update wallet logic to account for viewing keys + Add watch-only support to Zcash RPC methods + Modify zcrawkeygen RPC method to set "zcviewingkey" to the viewing key + Cleanup: Add braces for clarity + Add cautions to z_getbalance and z_gettotalbalance help text about viewing keys + Add release notes for incoming viewing keys + Create release notes starting from the previous non-beta non-RC release + release-notes.py: Remove unnecessary parameter + Regenerate previous release notes to conform to new format + Exclude beta and RC release notes from author tallies + Fix pyflakes warnings in zkey_import_export RPC test + make-release.py: Versioning changes for 1.0.14-rc1. + make-release.py: Updated manpages for 1.0.14-rc1. + +Jay Graber (3): + Add cli and rpc examples for z_sendmany + Fix cli help result for z_shieldcoinbase + Add rpc test that exercises z_importkey + +Jonas Schnelli (1): + Add compile and link options echo to configure + +Luke Dashjr (4): + depends: Use curl for fetching on Linux + Travis: Use curl rather than wget for Mac SDK + Bugfix: depends/Travis: Use --location (follow redirects) and --fail [on HTTP error response] with curl + Travis: Use Blue Box VMs for IPv6 loopback support + +MarcoFalke (2): + Fix url in .travis.yml + [depends] builders: No need to set -L and --location for curl + +Per Grön (2): + Deduplicate test utility method wait_and_assert_operationid_status + Print result of RPC call in test only when PYTHON_DEBUG is set + +René Nyffenegger (1): + Use AC_ARG_VAR to set ARFLAGS. + +Simon Liu (5): + RPC dumpwallet and z_exportwallet updated to no longer allow overwriting an existing file. + Add documentation for shielding coinbase utxos. + Add documentation for payment disclosure. + Closes #2759. Fixes broken pipe error with QA test wallet.py. + Closes #2746. Payment disclosure blobs now use 'zpd:' prefix. + +Wladimir J. van der Laan (6): + build: Enable C++11 build, require C++11 compiler + build: update ax_cxx_compile_stdcxx to serial 4 + test: Remove java comparison tool + build: Remove check for `openssl/ec.h` + devtools: Check for high-entropy ASLR in 64-bit PE executables + build: supply `-Wl,--high-entropy-va` + +daniel (1): + add powerpc build support for openssl lib + +fanquake (3): + [build-aux] Update Boost & check macros to latest serials + [depends] Add -stdlib=libc++ to darwin CXX flags + [depends] Set OSX_MIN_VERSION to 10.8 + +kozyilmaz (1): + empty spaces in PATH variable cause build failure + +syd (13): + Upgrade googletest to 1.8.0 + Get the sec-hard tests to run correctly. + Update libsodium from 1.0.11 to 1.0.15 + Remove Boost conditional compilation. + Update to address @daira comments wrt fixing configure.ac + Get rid of consensus.fPowAllowMinDifficultyBlocks. + Don't compile libgtest.a when building libsnark. + Add gtests to .gitignore + Get rid of fp3 from libsnark, it is not used. + InitGoogleMock instead of InitGoogleTest per CR + Get rid of underscore prefixes for include guards. + Rename bash completion files so that they refer to zcash and not bitcoin. + Fix libsnark test failure. + From 5cbf238b96059382227eaa2145a47f85eb39d65c Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 22 Dec 2017 10:13:40 +0000 Subject: [PATCH 0386/1062] Update release process --- doc/release-process.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/doc/release-process.md b/doc/release-process.md index bcbab4946..93a8e8362 100644 --- a/doc/release-process.md +++ b/doc/release-process.md @@ -61,11 +61,12 @@ Run the release script, which will verify you are on the latest clean checkout of master, create a branch, then commit standard automated changes to that branch locally: - $ ./zcutil/make-release.py + $ ./zcutil/make-release.py -Example: +Examples: - $ ./zcutil/make-release.py v1.0.9 v1.0.8-1 120000 + $ ./zcutil/make-release.py v1.0.9 v1.0.8-1 v1.0.8-1 120000 + $ ./zcutil/make-release.py v1.0.13 v1.0.13-rc1 v1.0.12 222900 ### Create, Review, and Merge the release branch pull request From 2941e075a3eb2fb551f96daeff45f0327714933e Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 2 Jan 2018 16:41:41 +0100 Subject: [PATCH 0387/1062] Enable Bash completion for -exportdir --- contrib/zcashd.bash-completion | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/zcashd.bash-completion b/contrib/zcashd.bash-completion index 3a2f091bd..65f07cd80 100644 --- a/contrib/zcashd.bash-completion +++ b/contrib/zcashd.bash-completion @@ -21,7 +21,7 @@ _zcashd() { _filedir return 0 ;; - -datadir=*) + -datadir=*|-exportdir=*) cur="${cur#*=}" _filedir -d return 0 From 9d2974ed5b4e32d7a3787e10642ee80910f8a5e7 Mon Sep 17 00:00:00 2001 From: Jay Graber Date: Wed, 27 Dec 2017 12:58:42 -0800 Subject: [PATCH 0388/1062] Add getdeprecationinfo rpc call to return current version and deprecation block height. --- src/rpcnet.cpp | 28 ++++++++++++++++++++++++++++ src/rpcserver.cpp | 1 + src/rpcserver.h | 1 + 3 files changed, 30 insertions(+) diff --git a/src/rpcnet.cpp b/src/rpcnet.cpp index dc46c786e..03d96f8b2 100644 --- a/src/rpcnet.cpp +++ b/src/rpcnet.cpp @@ -13,6 +13,7 @@ #include "timedata.h" #include "util.h" #include "version.h" +#include "deprecation.h" #include @@ -398,6 +399,33 @@ static UniValue GetNetworksInfo() return networks; } +UniValue getdeprecationinfo(const UniValue& params, bool fHelp) +{ + if (fHelp || params.size() != 0) + throw runtime_error( + "getdeprecationinfo\n" + "Returns an object containing current version and deprecation block height.\n" + "\nResult:\n" + "{\n" + " \"version\": xxxxx, (numeric) the server version\n" + " \"subversion\": \"/MagicBean:x.y.z[-v]/\", (string) the server subversion string\n" + " \"deprecationheight\": xxxxx, (numeric) the block height at which this version will deprecate and shut down (unless -disabledeprecation is set)\n" + "}\n" + "\nExamples:\n" + + HelpExampleCli("getdeprecationinfo", "") + + HelpExampleRpc("getdeprecationinfo", "") + ); + + + UniValue obj(UniValue::VOBJ); + obj.push_back(Pair("version", CLIENT_VERSION)); + obj.push_back(Pair("subversion", + FormatSubVersion(CLIENT_NAME, CLIENT_VERSION, std::vector()))); + obj.push_back(Pair("deprecationheight", DEPRECATION_HEIGHT)); + + return obj; +} + UniValue getnetworkinfo(const UniValue& params, bool fHelp) { if (fHelp || params.size() != 0) diff --git a/src/rpcserver.cpp b/src/rpcserver.cpp index 7a3880902..b531b2883 100644 --- a/src/rpcserver.cpp +++ b/src/rpcserver.cpp @@ -265,6 +265,7 @@ static const CRPCCommand vRPCCommands[] = /* P2P networking */ { "network", "getnetworkinfo", &getnetworkinfo, true }, + { "network", "getdeprecationinfo", &getdeprecationinfo, true }, { "network", "addnode", &addnode, true }, { "network", "disconnectnode", &disconnectnode, true }, { "network", "getaddednodeinfo", &getaddednodeinfo, true }, diff --git a/src/rpcserver.h b/src/rpcserver.h index 321568748..178befd38 100644 --- a/src/rpcserver.h +++ b/src/rpcserver.h @@ -238,6 +238,7 @@ extern UniValue getinfo(const UniValue& params, bool fHelp); extern UniValue getwalletinfo(const UniValue& params, bool fHelp); extern UniValue getblockchaininfo(const UniValue& params, bool fHelp); extern UniValue getnetworkinfo(const UniValue& params, bool fHelp); +extern UniValue getdeprecationinfo(const UniValue& params, bool fHelp); extern UniValue setmocktime(const UniValue& params, bool fHelp); extern UniValue resendwallettransactions(const UniValue& params, bool fHelp); extern UniValue zc_benchmark(const UniValue& params, bool fHelp); From 44e5b42751383cb710da31649a1331613df9c03d Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 3 Jan 2018 23:41:53 +0100 Subject: [PATCH 0389/1062] Check chainValueZat when checking value pool monitoring --- qa/rpc-tests/wallet_protectcoinbase.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/qa/rpc-tests/wallet_protectcoinbase.py b/qa/rpc-tests/wallet_protectcoinbase.py index 25b1e794a..b32da1dd1 100755 --- a/qa/rpc-tests/wallet_protectcoinbase.py +++ b/qa/rpc-tests/wallet_protectcoinbase.py @@ -6,6 +6,7 @@ from test_framework.test_framework import BitcoinTestFramework from test_framework.authproxy import JSONRPCException +from test_framework.mininode import COIN from test_framework.util import assert_equal, initialize_chain_clean, \ start_nodes, connect_nodes_bi, stop_node, wait_and_assert_operationid_status @@ -22,6 +23,7 @@ def check_value_pool(node, name, total): found = True assert_equal(pool['monitored'], True) assert_equal(pool['chainValue'], total) + assert_equal(pool['chainValueZat'], total * COIN) assert(found) class WalletProtectCoinbaseTest (BitcoinTestFramework): From 2091cf23ae5569be2174a7ff5c23c56a4a8415f8 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 3 Jan 2018 23:44:51 +0100 Subject: [PATCH 0390/1062] make-release.py: Versioning changes for 1.0.14. --- README.md | 2 +- configure.ac | 2 +- contrib/gitian-descriptors/gitian-linux.yml | 2 +- src/clientversion.h | 2 +- src/deprecation.h | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 28e50f21a..3b8f56c2c 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Zcash 1.0.14-rc1 +Zcash 1.0.14 ============= What is Zcash? diff --git a/configure.ac b/configure.ac index 11a729fb8..df8d3fdbe 100644 --- a/configure.ac +++ b/configure.ac @@ -3,7 +3,7 @@ AC_PREREQ([2.60]) define(_CLIENT_VERSION_MAJOR, 1) define(_CLIENT_VERSION_MINOR, 0) define(_CLIENT_VERSION_REVISION, 14) -define(_CLIENT_VERSION_BUILD, 25) +define(_CLIENT_VERSION_BUILD, 50) define(_ZC_BUILD_VAL, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, m4_incr(_CLIENT_VERSION_BUILD), m4_eval(_CLIENT_VERSION_BUILD < 50), 1, m4_eval(_CLIENT_VERSION_BUILD - 24), m4_eval(_CLIENT_VERSION_BUILD == 50), 1, , m4_eval(_CLIENT_VERSION_BUILD - 50))) define(_CLIENT_VERSION_SUFFIX, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, _CLIENT_VERSION_REVISION-beta$1, m4_eval(_CLIENT_VERSION_BUILD < 50), 1, _CLIENT_VERSION_REVISION-rc$1, m4_eval(_CLIENT_VERSION_BUILD == 50), 1, _CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION-$1))) define(_CLIENT_VERSION_IS_RELEASE, true) diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml index 52de67b0a..558d386e1 100644 --- a/contrib/gitian-descriptors/gitian-linux.yml +++ b/contrib/gitian-descriptors/gitian-linux.yml @@ -1,5 +1,5 @@ --- -name: "zcash-1.0.14-rc1" +name: "zcash-1.0.14" enable_cache: true distro: "debian" suites: diff --git a/src/clientversion.h b/src/clientversion.h index 6be622218..6873c1a39 100644 --- a/src/clientversion.h +++ b/src/clientversion.h @@ -18,7 +18,7 @@ #define CLIENT_VERSION_MAJOR 1 #define CLIENT_VERSION_MINOR 0 #define CLIENT_VERSION_REVISION 14 -#define CLIENT_VERSION_BUILD 25 +#define CLIENT_VERSION_BUILD 50 //! Set to true for release, false for prerelease or test build #define CLIENT_VERSION_IS_RELEASE true diff --git a/src/deprecation.h b/src/deprecation.h index 0272c26fe..eb9899c1b 100644 --- a/src/deprecation.h +++ b/src/deprecation.h @@ -8,7 +8,7 @@ // Deprecation policy: // * Shut down 16 weeks' worth of blocks after the estimated release block height. // * A warning is shown during the 2 weeks' worth of blocks prior to shut down. -static const int APPROX_RELEASE_HEIGHT = 241200; +static const int APPROX_RELEASE_HEIGHT = 249000; static const int WEEKS_UNTIL_DEPRECATION = 16; static const int DEPRECATION_HEIGHT = APPROX_RELEASE_HEIGHT + (WEEKS_UNTIL_DEPRECATION * 7 * 24 * 24); From d3c1949cf1caa83c4341235cb09b9969b51092a4 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 3 Jan 2018 23:54:00 +0100 Subject: [PATCH 0391/1062] make-release.py: Updated manpages for 1.0.14. --- doc/man/zcash-cli.1 | 6 +++--- doc/man/zcash-tx.1 | 6 +++--- doc/man/zcashd.1 | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/doc/man/zcash-cli.1 b/doc/man/zcash-cli.1 index aecbadd33..52af9437f 100644 --- a/doc/man/zcash-cli.1 +++ b/doc/man/zcash-cli.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASH-CLI "1" "December 2017" "zcash-cli v1.0.14-rc1" "User Commands" +.TH ZCASH-CLI "1" "January 2018" "zcash-cli v1.0.14" "User Commands" .SH NAME -zcash-cli \- manual page for zcash-cli v1.0.14-rc1 +zcash-cli \- manual page for zcash-cli v1.0.14 .SH DESCRIPTION -Zcash RPC client version v1.0.14\-rc1 +Zcash RPC client version v1.0.14 .PP In order to ensure you are adequately protecting your privacy when using Zcash, please see . diff --git a/doc/man/zcash-tx.1 b/doc/man/zcash-tx.1 index 37a7c6bad..a065ca04a 100644 --- a/doc/man/zcash-tx.1 +++ b/doc/man/zcash-tx.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASH-TX "1" "December 2017" "zcash-tx v1.0.14-rc1" "User Commands" +.TH ZCASH-TX "1" "January 2018" "zcash-tx v1.0.14" "User Commands" .SH NAME -zcash-tx \- manual page for zcash-tx v1.0.14-rc1 +zcash-tx \- manual page for zcash-tx v1.0.14 .SH DESCRIPTION -Zcash zcash\-tx utility version v1.0.14\-rc1 +Zcash zcash\-tx utility version v1.0.14 .SS "Usage:" .TP zcash\-tx [options] [commands] diff --git a/doc/man/zcashd.1 b/doc/man/zcashd.1 index 6bf56c315..91917eece 100644 --- a/doc/man/zcashd.1 +++ b/doc/man/zcashd.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASHD "1" "December 2017" "zcashd v1.0.14-rc1" "User Commands" +.TH ZCASHD "1" "January 2018" "zcashd v1.0.14" "User Commands" .SH NAME -zcashd \- manual page for zcashd v1.0.14-rc1 +zcashd \- manual page for zcashd v1.0.14 .SH DESCRIPTION -Zcash Daemon version v1.0.14\-rc1 +Zcash Daemon version v1.0.14 .PP In order to ensure you are adequately protecting your privacy when using Zcash, please see . @@ -54,7 +54,7 @@ Specify data directory \fB\-disabledeprecation=\fR .IP Disable block\-height node deprecation and automatic shutdown (example: -\fB\-disabledeprecation\fR=\fI\,1\/\fR.0.14\-rc1) +\fB\-disabledeprecation\fR=\fI\,1\/\fR.0.14) .HP \fB\-exportdir=\fR .IP From 6bfa0fb79dc9988e10e30fc98bb8f6b8e740b7a7 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 3 Jan 2018 23:54:16 +0100 Subject: [PATCH 0392/1062] make-release.py: Updated release notes and changelog for 1.0.14. --- contrib/debian/changelog | 6 + doc/authors.md | 25 ++-- doc/release-notes.md | 28 ---- doc/release-notes/release-notes-1.0.14.md | 160 ++++++++++++++++++++++ 4 files changed, 181 insertions(+), 38 deletions(-) create mode 100644 doc/release-notes/release-notes-1.0.14.md diff --git a/contrib/debian/changelog b/contrib/debian/changelog index 66e6a3a42..606b33b90 100644 --- a/contrib/debian/changelog +++ b/contrib/debian/changelog @@ -1,3 +1,9 @@ +zcash (1.0.14) stable; urgency=medium + + * 1.0.14 release. + + -- Zcash Company Wed, 03 Jan 2018 23:54:16 +0100 + zcash (1.0.14~rc1) stable; urgency=medium * 1.0.14-rc1 release. diff --git a/doc/authors.md b/doc/authors.md index a6dedffbc..e576a5e2c 100644 --- a/doc/authors.md +++ b/doc/authors.md @@ -1,25 +1,28 @@ Zcash Contributors ================== -Jack Grigg (518) -Simon Liu (281) +Jack Grigg (558) +Simon Liu (286) Sean Bowe (193) Daira Hopwood (102) -Wladimir J. van der Laan (65) +Wladimir J. van der Laan (71) Taylor Hornby (65) Nathan Wilcox (56) -Jay Graber (50) -Jonas Schnelli (48) +Jay Graber (53) +Jonas Schnelli (49) Kevin Gallagher (38) +Cory Fields (28) Pieter Wuille (16) -Cory Fields (16) +syd (13) nomnombtc (9) Paige Peterson (9) -fanquake (5) -MarcoFalke (5) +fanquake (8) +MarcoFalke (7) +Luke Dashjr (6) Johnathan Corgan (5) Gregory Maxwell (5) Ariel Gabizon (5) +kozyilmaz (4) Philip Kaufmann (4) Peter Todd (4) Patrick Strateman (4) @@ -29,7 +32,6 @@ Jeff Garzik (4) David Mercer (4) Daniel Cousens (4) lpescher (3) -kozyilmaz (3) Pavel Janík (3) João Barbosa (3) Alfie John (3) @@ -39,7 +41,7 @@ kpcyrd (2) aniemerg (2) Scott (2) Robert C. Seacord (2) -Luke Dashjr (2) +Per Grön (2) Joe Turgeon (2) Jason Davies (2) Jack Gavigan (2) @@ -57,12 +59,14 @@ isle2983 (1) instagibbs (1) emilrus (1) dexX7 (1) +daniel (1) calebogden (1) ayleph (1) Tom Ritter (1) Stephen (1) S. Matthew English (1) Ross Nicoll (1) +René Nyffenegger (1) Pavel Vasin (1) Paul Georgiou (1) Paragon Initiative Enterprises, LLC (1) @@ -94,6 +98,7 @@ Boris Hajduk (1) Bob McElrath (1) Bitcoin Error Log (1) Ariel (1) +Anthony Towns (1) Allan Niemerg (1) Alex van der Peet (1) Alex (1) diff --git a/doc/release-notes.md b/doc/release-notes.md index 21c31787b..a29094b51 100644 --- a/doc/release-notes.md +++ b/doc/release-notes.md @@ -4,31 +4,3 @@ release-notes at release time) Notable changes =============== -Incoming viewing keys ---------------------- - -Support for incoming viewing keys, as described in -[the Zcash protocol spec](https://github.com/zcash/zips/blob/master/protocol/protocol.pdf), -has been added to the wallet. - -Use the `z_exportviewingkey` RPC method to obtain the incoming viewing key for a -z-address in a node's wallet. For Sprout z-addresses, these always begin with -"ZiVK" (or "ZiVt" for testnet z-addresses). Use `z_importviewingkey` to import -these into another node. - -A node that possesses an incoming viewing key for a z-address can view all past -transactions received by that address, as well as all future transactions sent -to it, by using `z_listreceivedbyaddress`. They cannot spend any funds from the -address. This is similar to the behaviour of "watch-only" t-addresses. - -`z_gettotalbalance` now has an additional boolean parameter for including the -balance of "watch-only" addresses (both transparent and shielded), which is set -to `false` by default. `z_getbalance` has also been updated to work with -watch-only addresses. - -- **Caution:** for z-addresses, these balances will **not** be accurate if any - funds have been sent from the address. This is because incoming viewing keys - cannot detect spends, and so the "balance" is just the sum of all received - notes, including ones that have been spent. Some future use-cases for incoming - viewing keys will include synchronization data to keep their balances accurate - (e.g. [#2542](https://github.com/zcash/zcash/issues/2542)). diff --git a/doc/release-notes/release-notes-1.0.14.md b/doc/release-notes/release-notes-1.0.14.md new file mode 100644 index 000000000..4b9cd0810 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.14.md @@ -0,0 +1,160 @@ +Notable changes +=============== + +Incoming viewing keys +--------------------- + +Support for incoming viewing keys, as described in +[the Zcash protocol spec](https://github.com/zcash/zips/blob/master/protocol/protocol.pdf), +has been added to the wallet. + +Use the `z_exportviewingkey` RPC method to obtain the incoming viewing key for a +z-address in a node's wallet. For Sprout z-addresses, these always begin with +"ZiVK" (or "ZiVt" for testnet z-addresses). Use `z_importviewingkey` to import +these into another node. + +A node that possesses an incoming viewing key for a z-address can view all past +transactions received by that address, as well as all future transactions sent +to it, by using `z_listreceivedbyaddress`. They cannot spend any funds from the +address. This is similar to the behaviour of "watch-only" t-addresses. + +`z_gettotalbalance` now has an additional boolean parameter for including the +balance of "watch-only" addresses (both transparent and shielded), which is set +to `false` by default. `z_getbalance` has also been updated to work with +watch-only addresses. + +- **Caution:** for z-addresses, these balances will **not** be accurate if any + funds have been sent from the address. This is because incoming viewing keys + cannot detect spends, and so the "balance" is just the sum of all received + notes, including ones that have been spent. Some future use-cases for incoming + viewing keys will include synchronization data to keep their balances accurate + (e.g. [#2542](https://github.com/zcash/zcash/issues/2542)). + +Changelog +========= + +Anthony Towns (1): + Add configure check for -latomic + +Cory Fields (12): + c++11: don't throw from the reverselock destructor + c++11: CAccountingEntry must be defined before use in a list + c++11: fix libbdb build against libc++ in c++11 mode + depends: use c++11 + depends: bump OSX toolchain + build: Split hardening/fPIE options out + build: define base filenames for use elsewhere in the buildsystem + build: quiet annoying warnings without adding new ones + build: fix Windows builds without pkg-config + build: force a c++ standard to be specified + build: warn about variable length arrays + build: add --enable-werror option + +Jack Grigg (40): + Squashed 'src/secp256k1/' changes from 84973d3..6ad5cdb + Use g-prefixed coreutils commands if they are available + Replace hard-coded defaults for HOST and BUILD with config.guess + Remove manual -std=c++11 flag + Replace "install -D" with "mkdir -p && install" + Check if OpenMP is available before using it + [libsnark] Use POSIX-compliant ar arguments + Include endian-ness compatibility layer in Equihash implementation + build: Split hardening/fPIE options out in Zcash-specific binaries + Change --enable-werror to apply to all warnings, use it in build.sh + Move Zcash flags into configure.ac + ViewingKey -> ReceivingKey per zcash/zips#117 + Implement viewing key storage in the keystore + Factor out common logic from CZCPaymentAddress and CZCSpendingKey + Track net value entering and exiting the Sprout circuit + Add Sprout value pool to getblock and getblockchaininfo + Apply -fstack-protector-all to libsnark + Add Rust and Proton to configure options printout + Clarify operator precedence in serialization of nSproutValue + Remove nSproutValue TODO from CDiskBlockIndex + Add Base58 encoding of viewing keys + Implement viewing key storage in the wallet + Add RPC methods for exporting/importing viewing keys + Update wallet logic to account for viewing keys + Add watch-only support to Zcash RPC methods + Modify zcrawkeygen RPC method to set "zcviewingkey" to the viewing key + Cleanup: Add braces for clarity + Add cautions to z_getbalance and z_gettotalbalance help text about viewing keys + Add release notes for incoming viewing keys + Create release notes starting from the previous non-beta non-RC release + release-notes.py: Remove unnecessary parameter + Regenerate previous release notes to conform to new format + Exclude beta and RC release notes from author tallies + Fix pyflakes warnings in zkey_import_export RPC test + make-release.py: Versioning changes for 1.0.14-rc1. + make-release.py: Updated manpages for 1.0.14-rc1. + make-release.py: Updated release notes and changelog for 1.0.14-rc1. + Update release process + make-release.py: Versioning changes for 1.0.14. + make-release.py: Updated manpages for 1.0.14. + +Jay Graber (3): + Add cli and rpc examples for z_sendmany + Fix cli help result for z_shieldcoinbase + Add rpc test that exercises z_importkey + +Jonas Schnelli (1): + Add compile and link options echo to configure + +Luke Dashjr (4): + depends: Use curl for fetching on Linux + Travis: Use curl rather than wget for Mac SDK + Bugfix: depends/Travis: Use --location (follow redirects) and --fail [on HTTP error response] with curl + Travis: Use Blue Box VMs for IPv6 loopback support + +MarcoFalke (2): + Fix url in .travis.yml + [depends] builders: No need to set -L and --location for curl + +Per Grön (2): + Deduplicate test utility method wait_and_assert_operationid_status + Print result of RPC call in test only when PYTHON_DEBUG is set + +René Nyffenegger (1): + Use AC_ARG_VAR to set ARFLAGS. + +Simon Liu (5): + RPC dumpwallet and z_exportwallet updated to no longer allow overwriting an existing file. + Add documentation for shielding coinbase utxos. + Add documentation for payment disclosure. + Closes #2759. Fixes broken pipe error with QA test wallet.py. + Closes #2746. Payment disclosure blobs now use 'zpd:' prefix. + +Wladimir J. van der Laan (6): + build: Enable C++11 build, require C++11 compiler + build: update ax_cxx_compile_stdcxx to serial 4 + test: Remove java comparison tool + build: Remove check for `openssl/ec.h` + devtools: Check for high-entropy ASLR in 64-bit PE executables + build: supply `-Wl,--high-entropy-va` + +daniel (1): + add powerpc build support for openssl lib + +fanquake (3): + [build-aux] Update Boost & check macros to latest serials + [depends] Add -stdlib=libc++ to darwin CXX flags + [depends] Set OSX_MIN_VERSION to 10.8 + +kozyilmaz (1): + empty spaces in PATH variable cause build failure + +syd (13): + Upgrade googletest to 1.8.0 + Get the sec-hard tests to run correctly. + Update libsodium from 1.0.11 to 1.0.15 + Remove Boost conditional compilation. + Update to address @daira comments wrt fixing configure.ac + Get rid of consensus.fPowAllowMinDifficultyBlocks. + Don't compile libgtest.a when building libsnark. + Add gtests to .gitignore + Get rid of fp3 from libsnark, it is not used. + InitGoogleMock instead of InitGoogleTest per CR + Get rid of underscore prefixes for include guards. + Rename bash completion files so that they refer to zcash and not bitcoin. + Fix libsnark test failure. + From b6a990def08c9f08cec6d09922a6140570a4a5ff Mon Sep 17 00:00:00 2001 From: syd Date: Fri, 24 Nov 2017 12:09:27 -0500 Subject: [PATCH 0393/1062] Remove OSX and Windows files from Makefile + share directory. These are stale holdovers from bitcoin. This closes #2169. --- Makefile.am | 100 +--- configure.ac | 2 +- share/certs/BitcoinFoundation_Apple_Cert.pem | 37 -- share/certs/BitcoinFoundation_Comodo_Cert.pem | 37 -- share/certs/PrivateKeyNotes.md | 46 -- share/pixmaps/addressbook16.bmp | Bin 1334 -> 0 bytes share/pixmaps/addressbook16mask.bmp | Bin 126 -> 0 bytes share/pixmaps/addressbook20.bmp | Bin 1478 -> 0 bytes share/pixmaps/addressbook20mask.bmp | Bin 142 -> 0 bytes share/pixmaps/bitcoin-bc.ico | Bin 22486 -> 0 bytes share/pixmaps/bitcoin.ico | Bin 68756 -> 0 bytes share/pixmaps/bitcoin128.png | Bin 10639 -> 0 bytes share/pixmaps/bitcoin128.xpm | 384 --------------- share/pixmaps/bitcoin16.png | Bin 827 -> 0 bytes share/pixmaps/bitcoin16.xpm | 181 ------- share/pixmaps/bitcoin256.png | Bin 28182 -> 0 bytes share/pixmaps/bitcoin256.xpm | 465 ------------------ share/pixmaps/bitcoin32.png | Bin 1982 -> 0 bytes share/pixmaps/bitcoin32.xpm | 140 ------ share/pixmaps/bitcoin64.png | Bin 4592 -> 0 bytes share/pixmaps/bitcoin64.xpm | 242 --------- share/pixmaps/check.ico | Bin 766 -> 0 bytes share/pixmaps/favicon.ico | Bin 1150 -> 0 bytes share/pixmaps/nsis-header.bmp | Bin 25818 -> 0 bytes share/pixmaps/nsis-wizard.bmp | Bin 154542 -> 0 bytes share/pixmaps/send16.bmp | Bin 1334 -> 0 bytes share/pixmaps/send16mask.bmp | Bin 126 -> 0 bytes share/pixmaps/send16masknoshadow.bmp | Bin 126 -> 0 bytes share/pixmaps/send20.bmp | Bin 1478 -> 0 bytes share/pixmaps/send20mask.bmp | Bin 142 -> 0 bytes share/setup.nsi.in | 179 ------- share/ui.rc | 15 - src/obj-test/.gitignore | 2 - 33 files changed, 2 insertions(+), 1828 deletions(-) delete mode 100644 share/certs/BitcoinFoundation_Apple_Cert.pem delete mode 100644 share/certs/BitcoinFoundation_Comodo_Cert.pem delete mode 100644 share/certs/PrivateKeyNotes.md delete mode 100644 share/pixmaps/addressbook16.bmp delete mode 100644 share/pixmaps/addressbook16mask.bmp delete mode 100644 share/pixmaps/addressbook20.bmp delete mode 100644 share/pixmaps/addressbook20mask.bmp delete mode 100644 share/pixmaps/bitcoin-bc.ico delete mode 100644 share/pixmaps/bitcoin.ico delete mode 100644 share/pixmaps/bitcoin128.png delete mode 100644 share/pixmaps/bitcoin128.xpm delete mode 100644 share/pixmaps/bitcoin16.png delete mode 100644 share/pixmaps/bitcoin16.xpm delete mode 100644 share/pixmaps/bitcoin256.png delete mode 100644 share/pixmaps/bitcoin256.xpm delete mode 100644 share/pixmaps/bitcoin32.png delete mode 100644 share/pixmaps/bitcoin32.xpm delete mode 100644 share/pixmaps/bitcoin64.png delete mode 100644 share/pixmaps/bitcoin64.xpm delete mode 100644 share/pixmaps/check.ico delete mode 100644 share/pixmaps/favicon.ico delete mode 100644 share/pixmaps/nsis-header.bmp delete mode 100644 share/pixmaps/nsis-wizard.bmp delete mode 100644 share/pixmaps/send16.bmp delete mode 100644 share/pixmaps/send16mask.bmp delete mode 100644 share/pixmaps/send16masknoshadow.bmp delete mode 100644 share/pixmaps/send20.bmp delete mode 100644 share/pixmaps/send20mask.bmp delete mode 100644 share/setup.nsi.in delete mode 100644 share/ui.rc delete mode 100644 src/obj-test/.gitignore diff --git a/Makefile.am b/Makefile.am index 9157365b6..a160fe5f4 100644 --- a/Makefile.am +++ b/Makefile.am @@ -14,33 +14,12 @@ endif BITCOIND_BIN=$(top_builddir)/src/$(BITCOIN_DAEMON_NAME)$(EXEEXT) BITCOIN_CLI_BIN=$(top_builddir)/src/$(BITCOIN_CLI_NAME)$(EXEEXT) -BITCOIN_WIN_INSTALLER=$(PACKAGE)-$(PACKAGE_VERSION)-win$(WINDOWS_BITS)-setup$(EXEEXT) - -##OSX_APP=Bitcoin-Qt.app -##OSX_DMG=Bitcoin-Core.dmg -##OSX_BACKGROUND_IMAGE=background.tiff -##OSX_DEPLOY_SCRIPT=$(top_srcdir)/contrib/macdeploy/macdeployqtplus -##OSX_FANCY_PLIST=$(top_srcdir)/contrib/macdeploy/fancy.plist -##OSX_BASE_LPROJ_DIR=$(top_srcdir)/contrib/macdeploy/Base.lproj/InfoPlist.strings -##OSX_INSTALLER_ICONS=$(top_srcdir)/src/qt/res/icons/bitcoin.icns -##OSX_PLIST=$(top_srcdir)/share/qt/Info.plist #not installed -##OSX_QT_TRANSLATIONS = da,de,es,hu,ru,uk,zh_CN,zh_TW DIST_DOCS = $(wildcard doc/*.md) $(wildcard doc/release-notes/*.md) BIN_CHECKS=$(top_srcdir)/contrib/devtools/symbol-check.py \ $(top_srcdir)/contrib/devtools/security-check.py -WINDOWS_PACKAGING = $(top_srcdir)/share/pixmaps/bitcoin.ico \ - $(top_srcdir)/share/pixmaps/nsis-header.bmp \ - $(top_srcdir)/share/pixmaps/nsis-wizard.bmp - -##OSX_PACKAGING = $(OSX_DEPLOY_SCRIPT) $(OSX_FANCY_PLIST) $(OSX_INSTALLER_ICONS) $(OSX_BASE_LPROJ_DIR) \ -## $(top_srcdir)/contrib/macdeploy/$(OSX_BACKGROUND_IMAGE) \ -## $(top_srcdir)/contrib/macdeploy/DS_Store \ -## $(top_srcdir)/contrib/macdeploy/detached-sig-apply.sh \ -## $(top_srcdir)/contrib/macdeploy/detached-sig-create.sh - COVERAGE_INFO = baseline_filtered_combined.info baseline.info \ leveldb_baseline.info test_bitcoin_filtered.info total_coverage.info \ baseline_filtered.info \ @@ -60,84 +39,9 @@ distcheck-hook: distcleancheck: @: -$(BITCOIN_WIN_INSTALLER): all-recursive - $(MKDIR_P) $(top_builddir)/release - STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $(BITCOIND_BIN) $(top_builddir)/release - STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $(BITCOIN_CLI_BIN) $(top_builddir)/release - @test -f $(MAKENSIS) && $(MAKENSIS) -V2 $(top_builddir)/share/setup.nsi || \ - echo error: could not build $@ - @echo built $@ - $(if $(findstring src/,$(MAKECMDGOALS)),$(MAKECMDGOALS), none): FORCE $(MAKE) -C src $(patsubst src/%,%,$@) -##$(OSX_APP)/Contents/PkgInfo: -## $(MKDIR_P) $(@D) -## @echo "APPL????" > $@ -## -##$(OSX_APP)/Contents/Resources/empty.lproj: -## $(MKDIR_P) $(@D) -## @touch $@ -## -##$(OSX_APP)/Contents/Info.plist: $(OSX_PLIST) -## $(MKDIR_P) $(@D) -## $(INSTALL_DATA) $< $@ -## -##$(OSX_APP)/Contents/Resources/bitcoin.icns: $(OSX_INSTALLER_ICONS) -## $(MKDIR_P) $(@D) -## $(INSTALL_DATA) $< $@ -## -##$(OSX_APP)/Contents/MacOS/Bitcoin-Qt: $(BITCOIN_QT_BIN) -## $(MKDIR_P) $(@D) -## STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $< $@ -## -##$(OSX_APP)/Contents/Resources/Base.lproj/InfoPlist.strings: $(OSX_BASE_LPROJ_DIR) -## $(MKDIR_P) $(@D) -## $(INSTALL_DATA) $< $@ -## -##OSX_APP_BUILT=$(OSX_APP)/Contents/PkgInfo $(OSX_APP)/Contents/Resources/empty.lproj \ -## $(OSX_APP)/Contents/Resources/bitcoin.icns $(OSX_APP)/Contents/Info.plist \ -## $(OSX_APP)/Contents/MacOS/Bitcoin-Qt $(OSX_APP)/Contents/Resources/Base.lproj/InfoPlist.strings -## -##if BUILD_DARWIN -##$(OSX_DMG): $(OSX_APP_BUILT) $(OSX_PACKAGING) -## $(OSX_DEPLOY_SCRIPT) $(OSX_APP) -add-qt-tr $(OSX_QT_TRANSLATIONS) -translations-dir=$(QT_TRANSLATION_DIR) -dmg -fancy $(OSX_FANCY_PLIST) -verbose 2 -## -##deploydir: $(OSX_DMG) -##else -##APP_DIST_DIR=$(top_builddir)/dist -##APP_DIST_EXTRAS=$(APP_DIST_DIR)/.background/$(OSX_BACKGROUND_IMAGE) $(APP_DIST_DIR)/.DS_Store $(APP_DIST_DIR)/Applications -## -##$(APP_DIST_DIR)/Applications: -## @rm -f $@ -## @cd $(@D); $(LN_S) /Applications $(@F) -## -##$(APP_DIST_EXTRAS): $(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/Bitcoin-Qt -## -##$(OSX_DMG): $(APP_DIST_EXTRAS) -## $(GENISOIMAGE) -no-cache-inodes -D -l -probe -V "Bitcoin-Core" -no-pad -r -apple -o $@ dist -## -##$(APP_DIST_DIR)/.background/$(OSX_BACKGROUND_IMAGE): contrib/macdeploy/$(OSX_BACKGROUND_IMAGE) -## $(MKDIR_P) $(@D) -## $(INSTALL) $< $@ -##$(APP_DIST_DIR)/.DS_Store: contrib/macdeploy/DS_Store -## $(INSTALL) $< $@ -## -##$(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/Bitcoin-Qt: $(OSX_APP_BUILT) $(OSX_PACKAGING) -## INSTALLNAMETOOL=$(INSTALLNAMETOOL) OTOOL=$(OTOOL) STRIP=$(STRIP) $(OSX_DEPLOY_SCRIPT) $(OSX_APP) -translations-dir=$(QT_TRANSLATION_DIR) -add-qt-tr $(OSX_QT_TRANSLATIONS) -verbose 2 -## -##deploydir: $(APP_DIST_EXTRAS) -##endif -## -##if TARGET_DARWIN -##appbundle: $(OSX_APP_BUILT) -##deploy: $(OSX_DMG) -##endif - -if TARGET_WINDOWS -deploy: $(BITCOIN_WIN_INSTALLER) -endif - $(BITCOIND_BIN): FORCE $(MAKE) -C src $(@F) @@ -250,11 +154,9 @@ EXTRA_DIST = $(top_srcdir)/share/genbuild.sh qa/pull-tester/rpc-tests.sh qa/pull install-exec-hook: mv $(DESTDIR)$(bindir)/fetch-params.sh $(DESTDIR)$(bindir)/zcash-fetch-params -CLEANFILES = $(OSX_DMG) $(BITCOIN_WIN_INSTALLER) - .INTERMEDIATE: $(COVERAGE_INFO) DISTCHECK_CONFIGURE_FLAGS = --enable-man clean-local: - rm -rf test_bitcoin.coverage/ zcash-gtest.coverage/ total.coverage/ $(OSX_APP) + rm -rf test_bitcoin.coverage/ zcash-gtest.coverage/ total.coverage/ diff --git a/configure.ac b/configure.ac index df8d3fdbe..f9c0f1246 100644 --- a/configure.ac +++ b/configure.ac @@ -862,7 +862,7 @@ AC_SUBST(GMPXX_LIBS) AC_SUBST(LIBSNARK_DEPINST) AC_SUBST(LIBZCASH_LIBS) AC_SUBST(PROTON_LIBS) -AC_CONFIG_FILES([Makefile src/Makefile doc/man/Makefile share/setup.nsi src/test/buildenv.py]) +AC_CONFIG_FILES([Makefile src/Makefile doc/man/Makefile src/test/buildenv.py]) AC_CONFIG_FILES([qa/pull-tester/run-bitcoind-for-test.sh],[chmod +x qa/pull-tester/run-bitcoind-for-test.sh]) AC_CONFIG_FILES([qa/pull-tester/tests-config.sh],[chmod +x qa/pull-tester/tests-config.sh]) diff --git a/share/certs/BitcoinFoundation_Apple_Cert.pem b/share/certs/BitcoinFoundation_Apple_Cert.pem deleted file mode 100644 index beb0d7073..000000000 --- a/share/certs/BitcoinFoundation_Apple_Cert.pem +++ /dev/null @@ -1,37 +0,0 @@ -Bag Attributes - friendlyName: Developer ID Application: BITCOIN FOUNDATION, INC., THE - localKeyID: 6B 9C 6C A8 A5 73 70 70 E2 57 A3 49 D8 62 FB 97 C7 A5 5D 5E -subject=/UID=PBV4GLS9J4/CN=Developer ID Application: BITCOIN FOUNDATION, INC., THE/OU=PBV4GLS9J4/O=BITCOIN FOUNDATION, INC., THE/C=US -issuer=/CN=Developer ID Certification Authority/OU=Apple Certification Authority/O=Apple Inc./C=US ------BEGIN CERTIFICATE----- -MIIFhzCCBG+gAwIBAgIIJ0r1rumyfZAwDQYJKoZIhvcNAQELBQAweTEtMCsGA1UE -AwwkRGV2ZWxvcGVyIElEIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSYwJAYDVQQL -DB1BcHBsZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTETMBEGA1UECgwKQXBwbGUg -SW5jLjELMAkGA1UEBhMCVVMwHhcNMTMwMTEwMjIzOTAxWhcNMTgwMTExMjIzOTAx -WjCBqDEaMBgGCgmSJomT8ixkAQEMClBCVjRHTFM5SjQxQDA+BgNVBAMMN0RldmVs -b3BlciBJRCBBcHBsaWNhdGlvbjogQklUQ09JTiBGT1VOREFUSU9OLCBJTkMuLCBU -SEUxEzARBgNVBAsMClBCVjRHTFM5SjQxJjAkBgNVBAoMHUJJVENPSU4gRk9VTkRB -VElPTiwgSU5DLiwgVEhFMQswCQYDVQQGEwJVUzCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBALTd5zURuZVoJviusr119aktXksenb9IN9vq6kBbq38vxEk7 -9wkKMES2XfBRh0HxcEizGzhMNy5OCXuTLMaNMihYdfwYSoBoR2foEU+6kjPUnyJ4 -dQBFLJZJr5/QeQmALmYHEgZ6lwXFD2lU8t92340zeJ4y5LZw5pcEHtH9IummYDut -OGCkCGXDcjL+5nHhNScJiXHhswM+62o6XXsQiP6EWbM1CsgrGTNLtaa0U/UvVDwE -79YKklSC5Bog2LD0jBcTuveI66mFzqu++L9X9u+ZArtebwCl7BPNQ+uboYy5uV2d -zf8lpNNZLfXCFjoLe9bLICKfZ7ub9V5aC8+GhckCAwEAAaOCAeEwggHdMD4GCCsG -AQUFBwEBBDIwMDAuBggrBgEFBQcwAYYiaHR0cDovL29jc3AuYXBwbGUuY29tL29j -c3AtZGV2aWQwMTAdBgNVHQ4EFgQUa5xsqKVzcHDiV6NJ2GL7l8elXV4wDAYDVR0T -AQH/BAIwADAfBgNVHSMEGDAWgBRXF+2iz9x8mKEQ4Py+hy0s8uMXVDCCAQ4GA1Ud -IASCAQUwggEBMIH+BgkqhkiG92NkBQEwgfAwKAYIKwYBBQUHAgEWHGh0dHA6Ly93 -d3cuYXBwbGUuY29tL2FwcGxlY2EwgcMGCCsGAQUFBwICMIG2DIGzUmVsaWFuY2Ug -b24gdGhpcyBjZXJ0aWZpY2F0ZSBieSBhbnkgcGFydHkgYXNzdW1lcyBhY2NlcHRh -bmNlIG9mIHRoZSB0aGVuIGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNv -bmRpdGlvbnMgb2YgdXNlLCBjZXJ0aWZpY2F0ZSBwb2xpY3kgYW5kIGNlcnRpZmlj -YXRpb24gcHJhY3RpY2Ugc3RhdGVtZW50cy4wDgYDVR0PAQH/BAQDAgeAMBYGA1Ud -JQEB/wQMMAoGCCsGAQUFBwMDMBMGCiqGSIb3Y2QGAQ0BAf8EAgUAMA0GCSqGSIb3 -DQEBCwUAA4IBAQAfJ0BjID/1dS2aEeVyhAzPzCBjG8vm0gDf+/qfwRn3+yWeL9vS -nMdbilwM48IyQWTagjGGcojbsAd/vE4N7NhQyHInoCllNoeor1I5xx+blTaGRBK+ -dDhJbbdlGCjsLnH/BczGZi5fyEJds9lUIrp1hJidRcUKO76qb/9gc6qNZpl1vH5k -lDUuJYt7YhAs+L6rTXDyqcK9maeQr0gaOPsRRAQLLwiQCorPeMTUNsbVMdMwZYJs -R+PxiAnk+nyi7rfiFvPoASAYUuI6OzYL/Fa6QU4/gYyPgic944QYVkaQBnc0vEP1 -nXq6LGKwgVGcqJnkr/E2kui5gJoV5C3qll3e ------END CERTIFICATE----- diff --git a/share/certs/BitcoinFoundation_Comodo_Cert.pem b/share/certs/BitcoinFoundation_Comodo_Cert.pem deleted file mode 100644 index dc752d455..000000000 --- a/share/certs/BitcoinFoundation_Comodo_Cert.pem +++ /dev/null @@ -1,37 +0,0 @@ -Bag Attributes - friendlyName: The Bitcoin Foundation, Inc.'s COMODO CA Limited ID - localKeyID: 8C 94 64 E3 B5 B0 41 89 5B 89 B0 57 CC 74 B9 44 E5 B2 92 66 -subject=/C=US/postalCode=98104-1444/ST=WA/L=Seattle/street=Suite 300/street=71 Columbia St/O=The Bitcoin Foundation, Inc./CN=The Bitcoin Foundation, Inc. -issuer=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO Code Signing CA 2 ------BEGIN CERTIFICATE----- -MIIFeDCCBGCgAwIBAgIRAJVYMd+waOER7lUqtiz3M2IwDQYJKoZIhvcNAQEFBQAw -ezELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxITAfBgNV -BAMTGENPTU9ETyBDb2RlIFNpZ25pbmcgQ0EgMjAeFw0xMzAxMTYwMDAwMDBaFw0x -NDAxMTYyMzU5NTlaMIG8MQswCQYDVQQGEwJVUzETMBEGA1UEEQwKOTgxMDQtMTQ0 -NDELMAkGA1UECAwCV0ExEDAOBgNVBAcMB1NlYXR0bGUxEjAQBgNVBAkMCVN1aXRl -IDMwMDEXMBUGA1UECQwONzEgQ29sdW1iaWEgU3QxJTAjBgNVBAoMHFRoZSBCaXRj -b2luIEZvdW5kYXRpb24sIEluYy4xJTAjBgNVBAMMHFRoZSBCaXRjb2luIEZvdW5k -YXRpb24sIEluYy4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQChUwLD -u/hu5aFZ/n11B27awONaaDrmHm0pamiWHb01yL4JmTBtaLCrSftF8RhCscQ8jpI0 -UG1Cchmay0e3zH5o5XRs0H9C3x+SM5ozms0TWDmAYiB8aQEghsGovDk0D2nyTQeK -Q0xqyCh0m8ZPOnMnYrakHEmF6WvhLdJvI6Od4KIwbKxgN17cPFIfLVsZ7GrzmmbU -Gdi4wSQCHy5rxzvBxho8Qq/SfBl93uOMUrqOHjOUAPhNuTJG3t/MdhU8Zp24s29M -abHtYkT9W86hMjIiI8RTAR+WHKVglx9SB0cjDabXN8SZ3gME0+H++LyzlySHT8sI -ykepojZ7UBRgp9w3AgMBAAGjggGzMIIBrzAfBgNVHSMEGDAWgBQexbEsfYfaAmh8 -JbwMB4Q/ts/e8TAdBgNVHQ4EFgQUfPf+ZyDWl/4LH0Y5BuJTelkRd/EwDgYDVR0P -AQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUHAwMwEQYJ -YIZIAYb4QgEBBAQDAgQQMEYGA1UdIAQ/MD0wOwYMKwYBBAGyMQECAQMCMCswKQYI -KwYBBQUHAgEWHWh0dHBzOi8vc2VjdXJlLmNvbW9kby5uZXQvQ1BTMEEGA1UdHwQ6 -MDgwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0NPTU9ET0NvZGVTaWdu -aW5nQ0EyLmNybDByBggrBgEFBQcBAQRmMGQwPAYIKwYBBQUHMAKGMGh0dHA6Ly9j -cnQuY29tb2RvY2EuY29tL0NPTU9ET0NvZGVTaWduaW5nQ0EyLmNydDAkBggrBgEF -BQcwAYYYaHR0cDovL29jc3AuY29tb2RvY2EuY29tMCgGA1UdEQQhMB+BHWxpbmRz -YXlAYml0Y29pbmZvdW5kYXRpb24ub3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAqibjo -D4HG5XSIIMCmYE5RgQBSEAJfI+EZERk1G9F83ZUWr0yNRZCw4O+RaM7xQhvJhEoD -G2kpk/q2bNOc71/VyZ6SrE1JRVUON41/Flhz4M6cP0BclTicXvh+efVwqZhIz+ws -UxF2hvC/1Xx6rqI7NYAlOYXk2MSUq3HREo+gWUPKM8em4MZZV/7XCH4QbsfxOl1J -xS6EOQmV8hfUN4KRXI5WfGUmedBxq7dM0RSJOSQl8fq2f+JjRLfjQwQucy7LDY+y -pRTsL2TdQV/DuDuI3s0NHRGznQNddoX5jqpXhSQFAAdgrhN1gGkWaaTPzr9IF2TG -qgr6PEp9tIYC+MbM ------END CERTIFICATE----- diff --git a/share/certs/PrivateKeyNotes.md b/share/certs/PrivateKeyNotes.md deleted file mode 100644 index da299d168..000000000 --- a/share/certs/PrivateKeyNotes.md +++ /dev/null @@ -1,46 +0,0 @@ -Code-signing private key notes -== - -The private keys for these certificates were generated on Gavin's main work machine, -following the certificate authoritys' recommendations for generating certificate -signing requests. - -For OSX, the private key was generated by Keychain.app on Gavin's main work machine. -The key and certificate is in a separate, passphrase-protected keychain file that is -unlocked to sign the Bitcoin-Qt.app bundle. - -For Windows, the private key was generated by Firefox running on Gavin's main work machine. -The key and certificate were exported into a separate, passphrase-protected PKCS#12 file, and -then deleted from Firefox's keystore. The exported file is used to sign the Windows setup.exe. - -Threat analysis --- - -Gavin is a single point of failure. He could be coerced to divulge the secret signing keys, -allowing somebody to distribute a Bitcoin-Qt.app or bitcoin-qt-setup.exe with a valid -signature but containing a malicious binary. - -Or the machine Gavin uses to sign the binaries could be compromised, either remotely or -by breaking in to his office, allowing the attacker to get the private key files and then -install a keylogger to get the passphrase that protects them. - -Threat Mitigation --- - -"Air gapping" the machine used to do the signing will not work, because the signing -process needs to access a timestamp server over the network. And it would not -prevent the "rubber hose cryptography" threat (coercing Gavin to sign a bad binary -or divulge the private keys). - -Windows binaries are reproducibly 'gitian-built', and the setup.exe file created -by the NSIS installer system is a 7zip archive, so you could check to make sure -that the bitcoin-qt.exe file inside the installer had not been tampered with. -However, an attacker could modify the installer's code, so when the setup.exe -was run it compromised users' systems. A volunteer to write an auditing tool -that checks the setup.exe for tampering, and checks the files in it against -the list of gitian signatures, is needed. - -The long-term solution is something like the 'gitian downloader' system, which -uses signatures from multiple developers to determine whether or not a binary -should be trusted. However, that just pushes the problem to "how will -non-technical users securely get the gitian downloader code to start?" diff --git a/share/pixmaps/addressbook16.bmp b/share/pixmaps/addressbook16.bmp deleted file mode 100644 index c5576910b1b6b95c23ed7c53adec399a944e610a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1334 zcmZ9MKWrOS9LK*+iDcA*T|jP9K#EfVb%3_kxoL?Sz~+CTKo0?umkcM}a-)X~w`8y~ zWwata$wP;F^b*OVM^AaW@iN6rqzqX?CP!j;d|n(O=-qwq_kQ2^d%y4Zy_2r_Y;|6j z*XnE1Jw~M~TvK5-acvg<`*zOBxvAXL<4n`D6HQM%GM!B(AlC_)PJEuJ;Aq!F>#NkLovPNIJ5$BCNMjXNzRgQ_+*rp!g; zA@kIOH0r69ChE4y+o3w`mbys@n%a#*r9QS=N;g8a!={p`qHa`Dn3U9Rt|@8O6xBjv zRneM91uViXss*BIg-Ct1pujo>E&wqwzyhb34*>)GZGZ*v0ek=-zz6UFd;rgan8}zy z9K*-(2F}14I0I)qN3Dgo@D|R(;UVVyV|>JTi1A?2a=ck4gU;+G$Cp8$Dx%MwXb<4< zWDqq77(5xY4U>i@25o~j0eEeA^bPt3eWn2Qp2vg1gW((~M&aj7mEptAkqMyg_a@XPLPt?d zkC;5hhr8_UYhqQ@*XHJ?wzjskv$LbUy*(Wq9B6-kUx$Z>IyySi@$s=vPfvAzey)p) z3;p%C)5{kxw7tE}>9ScKn#}@lhQO)#%Jtps`s3Lw7VG>=O7B&F`?+#Qdc9t(-w6Nw z{nu~qFaPlTdHBKC%zr1p5Vd?$#kAAwEFRk42>mO|ReC~Q-`SIO_!hG=g_r>}+ss?m65uRi?;YjfP( diff --git a/share/pixmaps/addressbook16mask.bmp b/share/pixmaps/addressbook16mask.bmp deleted file mode 100644 index d3a478d1ad1d4800008fda5be5d583f3d0423480..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126 tcmZ?rtz&=yJ0PV2!~#&v$iN7eZ~&8-#Q*>Q!Giz)F))yd?S4Sa0{}e{AL0N2 diff --git a/share/pixmaps/addressbook20.bmp b/share/pixmaps/addressbook20.bmp deleted file mode 100644 index 2b33b228aaec9ef51fb3dd46b3eab98f3d61d7df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1478 zcma)+J!~6g9LAp(Xj4#-1LY%>FBd2^1%kPdf|c^&f`Ee-Fy_la3iQe$IKDk(@RGsG z9usXbe`4esg7wT_5VJWhTCq&7#TB`8C#7sMrJhB7@1L`@i5T{jfVq~s9}w4E! zw_*2z22GFXsne(_Y6L`^Q&Ln9)UH?6LQUklMn%-9Rn@6^>eWhWRy~zaBdDkql+^G% zxmCM%<*{$qXH@q}s-X&AKx|alBhM=mUG_yagLz^>b>!A&$jizrda9N1+@k8GJjy9> z3#t{1s-n7^Q?J+hqv|Z8#9m33I+p%fx*CFV4wui69xl=fgy&0 zHi&!}3=9Sa0|TuQJ`4s11A_s;Fh8c5q0o@z)5B-)!(r0iHpf?1ZLO}ZYHe*z8yg$i z+}zam_O`aRwzRXequt$I?d|Ppe}7*G2M0PlJk-Dc8U1tPhSt~DIbB|sAI&C#J4GgAUy7(iLxq5=0b7wD>|14iTJ13pEig)jYa`|ijuj|Xd{$44U-+JXM>s@~B ze0F~B8Rz8vXU<$GJsqUpEY+uS&Pl@Tw=exP@s8g$^ZbVs@0%yToOqAF{OrTj+PqKh z`{=0l_^GM)#Y3On@@AKo&)K~1UcWZ2U08f)$$4~Pap8&8SARLm(^2hh-qP}ew)Tg& zy<4?!7M$E7wco$@8{Qk2Q|5D5QkK+v>=D;`4}9?ACI0Kqe*VH!_CVjizOwS^rPG<` PK3-Y5_U;`Xahmo&>vaK4 diff --git a/share/pixmaps/addressbook20mask.bmp b/share/pixmaps/addressbook20mask.bmp deleted file mode 100644 index 56ce6125dbb83abfac437bbbcdb611f45ee57cff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142 zcmZ?r?PGudJ0PV2#3E44$iN7e2mq2o+z`wJ7J(4||Nn>c{{KI~KrXi54>yJZ01nMB AR{#J2 diff --git a/share/pixmaps/bitcoin-bc.ico b/share/pixmaps/bitcoin-bc.ico deleted file mode 100644 index 88cc240e2d4f77fa66730593a890a17aab86cbdc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22486 zcmd^n2UJ$qw(d$aJ)W3)(oQs8V{9>M?7b#-Q4nlcKv3zucMy=GbP%NXBE9z}y*KGa z#ohsd`M$LggT~yGoO|yZZ;ZDcleNp*d(GA6n(O=KFJmvUSJ}jg4C(7k`W42GGR7uP z9=Q&Dov~8fn>Fjn^*g^c8%%%sON_Qk(O^G{}h_>Sq9qxo_DEn_o&Vr&Y&iAM~d z70N-vmcPXRJ~_sm&(!u{s~r>B2A_Pk(JPD1Gx2A$b=9F{8)EX+kJ+)3 zN05h1Jf(+yZy3mC83!=Q+?!0Hc8DF!yTR6n)v<-%#cYj#DU->%%=ByfnR-nhTYWx@ zy|qV^eXs7!q%YoPiZuiHb`4wLp2z07-eHD$ZOo_h5p%A;!JHd!v9<1LY;V{_=FxnYdA8hR(#iEqx0~1;`xy4R zh%#GlAHiI264Nfa#!L!3SlG2;ChD2QPQ;Wj|L%U~)^wX~^hjqLeR7#-WDV13ddxOO z)UelgtFdjq8O-%AG4^74OzsQsmE15=WEz?Y|V;WhPm~wg}Q%gsi*ZUt+3N57=?&c_OWqY36k?&75|oUwD;ilP+t8X#unp?~neH?skfTa!$v%nko*&H)p_8R(ahj%j5D!RgKItQ5( z+S21H-fOwbj>ML*k7TXcTcT?03wb;Ct%fW6MBbi#EN#v{*r&sYXmnQmf10MGrln^* zt$TD#Y+QUoVp6hjCm=8=I3zSIJR&mc0>9zv=I(LM)9bvqkFTFUV^-FuZEWrA&zyB| zbaHlKOjl3ez|hFp#MI2(;*{lTc?CtK4Qiq);%aK5np)aAl7|i-*>H4&l-e;F+2bcp z%Iy@{wR^(`(LHM75_|XUKX7o(+I8#IHg5P;ZPVs0TeofBF>n4a3-IcarTDXA<*L``dE9u|SbhvnBD(z=QN}pPOGNryFe2CsM0m#YLE7FS>RU#{ z?d)X8atOEQ{LqJuetL|tvrq5+FQ2^h(o1aI+Y{NVpMT5Vm^zQW_469`_TsJVt<@6j z^$myFtD9ulD_c&m@mu8}@@(8Th2LenA{z%8FNhKwzXP&UnT;1wg{ZOdyVOTyw+0&z zc?I$+~+|&Hz03fp7FUhDsSU_f|xp+ut$SU5Z7Y=kkDom_UW;I>^EQ&4;rzF zhfUc#M=aPoQdaC8X=^s|m^FJ>#)iFj+@5_Pcb0u9@5nwqbxv)=_UD)Ta z5nrgfvB_%g>>CXaHbu*W{iuD8&CvB^v-P~#9E0<0uAw)ZYwU~l%uiU;=3-r&V-mn- znFO*KCP8evNidsk7RqK=gtHl^BG^pJNI_;7QEa|-BwJ(?$(BHt*+#OZb{E(Z ztPzXO#Iaw_CbIbsDQuoo8k_Hwjx>YKb`KvAd5Zn z+2V8gY>8(9q>wH1y2zHFzsOd47qT_p1#F#n9@}_6hy9B6a+7y9+XC6J2h=hL@+Z&M0_60tXpj@^$I1iG~_JtI%gQ0~?G7JJ6FBwtH_Jxg|cG`xcCil}D0B5RpQR6W~up@Hq@65Ysl$22j~*k;)6Rwka<#>A65*xnSZJ*i#n zKw1|&i1bKWCp((n!K71L*|C&nc0A=0JDGfm$)_|i#neWooYutDGMllMv@)%nHl~~3 z$@B`knEu5cW>kEI8JF}j)AH-gtnwx^t-QsIDsMA=h;GGgrdfWQsg>ShiY2$0T+uCd z0{(*R#XFF@Os42QlPP|{WZ{RLgkK_$^;4muk11C6F{SDOrd%_~lxqi>YVBjDRyWAh zA)1YYO#9Lh(`^}I`mIA)D~FhI`yexKf6Oe~2bgtRAG2$H$n0AlFo%}=%(?YGb8COV z+&dmHkFH0|tq1GG zlyJPRuF2cd(%Q`{Df7ye+{}1yOC@P((~63y?K2inm~b-qQcIboi=(s4InOg*xw+?T zy^@o?ERTj)RA|k^2aYzhwfoxl_xJbp_4g%txn}hVr(R~26`>oaET5p((b4R~pDQHw z_dnd9hNnrEmWf_^wYAkEGnPqscXk!|p22e)XZ(?W*x#RJT@vGC;ZxGwATxXUf$*;G zq7X;^$P@3|;^bURaZHH6e`#xj_S~6rF?a73#=7Hn@5BCw&OD=CTy%J7P-t0mgW=pC z55(TPmmlMS+v(T(bL9DR+mNWpsOSr&%?8ObC$jF+O zM%B5?#oX`Sy&UJlpX1L%u^avUxd+_Lm2CW5S{skdS~fxH&YfF94tVaEgZB@6pcT?j z+vg#Tp=PpP89nbIXjMCE7P}fjbQ8zU6PRYHJS6BqCqc-7ne88}^ zr7=`TM_WfnQ$yE0BqlRAx8>fwd!5pAM~3ks|Aw|pk!Je(I$Byl1_cx$$)dgnBE{`%lhD`+=jF<_8Med#)!P6 z4>tnBxcu3nKaxktoAKn`HhhPF58s`{zdy_!7=1V@x8dO6;C{+1$N|VxKjlqaj2?f- zPkDJ9d+Cd5?B!oJvzIqYv6r{Vv6taTa2fF>xDNrp0rCobhgadtzlyyI_Yt_fDyqp| z5z}U`U|;ZxxGsA|LjS3}iu2bb^w^scx@-dcgm)#h*!z36*@y7c|9L=(~bPuOhZ5Rlc5irXW+$t(Lcu)K^7aFV@r%Y*)rqvY?+BSTW;#hR+#y* zmFE6z)u{ls#yXg-wGCtI&R$^ao#NO!=Xkc(If1Qlif60N#QAf(;|$`JQWU!U^6T)uo+e{Z06}WNIaWmo4{t1Psk)Pp<2m*g(?x;_~{Sw!lr@qPJb9rnjWSM6^TkciBR$%Y8%BP5}@hxI& zeG1un-$J$#vdK4}ZSl=z+x&9bPQM%`=9kU(_~)=af%$AV_JO;DOPEMVIolOh$##cV zGg0^#d$2c_h^k@xF4Qoo*lH#dkG*I@H9Hnx!w$#SGx7KqwkNI?zD7HIjSeP})W!Cv za37fwSJhX zH4HQL#v!KJG{m$aI?Y2&4}J&tJ&aoinMEu7j+TCA+4h)Obv$M^U4zWNdx+WhV6O^s zxH8Nfdxx15_PoyUFI*t55O??%=dKR2^OpyhPj?^lg>T}A)E^Q6A0_z8pnw%{yxT6V;Rhd2`C;k{9zK8T z=PA=?%$hZ8=Jc;V|Kx*-@Bi@p^JlIX%$>7jrHs0fshOF$%!);`zWn69i61|cW9-G| zMN6biBQh_ww6wIgwzf6ISsz_E{nI~vW5g>7rZ8-|7+Uq<$xp36Ob zJoCWgq2b}dUW)~j{-D#2)h6|gt?g~Ct<4!p@v-rVNog6q1Kh#F;k@|y7j~>NsjjW6 zYie%Diio%nn~iBN-C@BLR}-mqhq6^6Vfu$Gcq#L z(=+<|yD#^&xh|SCapJe5b@*+iLJnN8?3}X>t`T9eiSZXAViFS*<6|yFML1_R)YWBX z8qfK3;>6MXYmNo;{GsNj&$>dJq~!SM=nE0f4rkBW+1l8gFDWUym~(vk2ctc=bA>z4 z9%5>K+QB6vIw2`JIVmwF!qvgX#>7ZpSKFhosHn($2{alhV2z+nj+wdjX$R+s_#{E| zq=e{*2v=J}ZB<1@kAi}NLjBnvjTEqJ<#~L)#CDJPo;?;;ryZT6lQS9`GSU+x9IQ&6`-qNgsTH#8(Wo9*8(CMJ4#!Tc5a z1^IdT+A}}kO|)s1TX{uwt;ioojW&DEoA%(^778j z|8(L9RZ?ADmu-Id8eHy?<4&rWla*!f=;ec?m9_=>`30*d^BNyjuc@uA^R*ty z?<9Hy+3r~F-gBL2zwT^tD(*(Ilz!30i-r0#cqgy1MfN(k(4C%Dv#PAPc-5qd@9&Uq>g?`r$cfl1D1< zmzOvHKJtIOUAhkWn@00H?M6lKB+PZ@`LA!Z@%Q!h3k>x4_OC80DS|%VY?jLE>h5k1 zdGdYBS*gf)N7Rz%zjMgc>pVVw-p4Drx~w>l*LS=W9RKe2P{$GdpR~V~2(QNjOG!I7 zHydMYS;psV?XJ zHGaILct>|nPo{&Ukl%8v$#{*P_=-X&Q-(#`Ox7xN|+) z{1Wo}LVZ3VB_*&2Y;UmMv+u~^qifc!Tfb!KDtS#kGYbm~D<@}XM~gjX*&TH?l{z!u z`-tb?Dt)27wYkw-M_%sa3E?;?udbzMdO9K@DLy(pB0Ma+yR*F}c=@D>-|_t8k4QAu z*HsnSXliJvsj6zIDJdvu>FAoAjYw{|+T2)IRn^_y*-@)I>qFu5~^zmz8#CYxZ6d!2g*P|)NlKJ&$DqzpJem><}Ii7D!DqQ0FucrD!#wXu-{`bwgch7ZG2Yv@Myc?b>W3&JRKf+j10nUev2P` zpE?mTnZGam1-3pGPsjZi9qNAB@6OXZcYKP5Yx?(E?zcXbw;TNI*r_X@9WsoZA!oiF zpZ?PwuBdC=3DJOzTi}ie+!290B5+3p?ufu05x67zhnRZWI!%{Po-ccy{RJ1<%r*i? zMc}9i92J41B5+g$j*7rh5jZLWM@6siQf{2DVf)X~Z>+P6R0JFI6wji zNZ%pS}m)lfZitcuxZFN#H%{RS~rTvGBq!@T>%$mB6zK z`MD0fd~mJ8HP-=rD}iq%@T~;CmB6>sYoh88xA~+Og5xD{yabL{$PbQJNWt?8DR^E2 z&r9HW2|O=>=OysG1dgM8&6x{U;Fk&fGJ#(f@{g7eewn~8KXVTpGl63!aLgD>Y8Dz{ zxj#xKRu6&OCUDyXZkxbu6S!>xw@u)-3EVb;+a_?^1a6zaZPPyvnf5JKKm8RS1Iuh8 z-NC05_;doFPTk9wu7z;}E$duF%%>YG2X#joJTT8D)66{iAE zh?obzGqy~A&N;g_Zl|~{gS?2Z8+(uE;gW%OZo}emJ2M%w95QNW^ts{rZyb7l=^v~$ zbeH@}*3xIvF^kG~_v_yV)-?!TtpAgP`rTh1HO!c$U}>@2(sQ{U(KGG%pBBs8RN5kpoc8l2IzDTksahL#N{&N3T$KhL(;m~Mw@*y z=rh={*Y+9^FhZIjs@k;8%ys48(ZMsl_4UK&lU(MQ2MsHyl~d@gM|2+LICK#?qD*eT z-L4XOUL*3pPUHs(z+4ZxO%#5Q$i4jz?ex#04^G>rzg@bA$iC$f**D!M$L4z|>j4E^9iZs@!xY~~lr%t; zf;6#zm@KL~=sP_x8ZV|zz)goSKJ5N09V{YqCakgvFIwP~LRz(t$f#+EPQeD-b>dr% z4`Iu$l2Upbsb{v6US1EG759>P$u+VnyG3@DcL{MQl=N_rvWAJ$An}jUPCd71rdh!6 zIvg?l({|Ws7alRkHjd;=?vhINL(-^uL^`#7u;J|_ozg;b86BjS(@7fH?WC63f;Ft0 z%*$b)%Wsi+*@|c#o<@9ku^yJvTK5#%h&jIFd^YXH`Y#n-NlK~k0WMx9o4UJXQ-2?0>^A9K zyh^eumq-lntoO>Kd3JI1!>MSRaw?vd`c}}9f=AG!k0i5h)5pqgf_->fRJDcMDA<>m zSK36ji^MjOTEh@&H4c(&-WA&HnNE_yxwJnZlMV)E(_x$+4a+C#@B-T7lS;>;OX+m& zZIpkL4qz?Z<()>yv97A8)sjY99UY4*qTgH-VVlBfchXgq|B#MB7GnJZCm^)JY$eO3 zdSThWOfwB76|6xz%|u46!z30}O`?8TPuEwz?gH}^Wb|Aq0riS1M!V#}KWKmYZ1g$L z&(DuU7Sk&45|SzICz&Gn2MJyD59!lF`5*7sF+b#;tg*;7jr7}4HbkfHA?*q)C-Csk zl)u?Aiqw;uOfiL7V-uNe*N5XjT_(38|!YUKeR|Kn2Mc-68ebVN$LfrWuwoG)_dF-r1wxz1cY~ zM+1g4ohMzNCf0Qtr!3HI-3xZjU4gc_%-+aL_Ff3$s>vJaX9@F>Uxu; za<0hNhhjs&za?LR2Mi!0Rtx2!%ROum zGO3+(Ao%yPczNfV@1m}QLU{q*{d6!WOBkE{*{JOH#h6WLrXx9*Nj$lWcEv%W+iA~* zb~=`IgEUZoMU=nvT)torU)iqkc>UR!Vrlrm&hRxo9$*aAKOnixDOZ<60k z-mvxj{B(IYEw>8%L-{+;r;>PV10954C6V4kl9|19IO7_0x=JSsZj(kG3FR;G$fa?j zTHMdRwb?l~;b3wNxuWjpu+Eq_J)o0m-E=Ud@M*nxnH$eU(5U~+uU#5$()u&u&*YKB zT-X*+L$sC&SKrfn_ElHu7xN(60bBK}UjZ#X6HnXy z3utFlJ*hYLlNRQ;QvEP}XA(l=cB;|`d$rC>c_)i6JR3tU*k8F}9e2jMaU{BtB>a9a zi`VyHKnB^M-T65eSNQJJ3#6|4c6ZuT-x~IJgd;hCJoogjkf`O3RUc_p6~zBa(NkEZTD%db3DyG zlSs>5Qs_WPKAmg1_f(Iuc~8Vwl3ZaA>BE1}hX1lVsgd3~VnMHMSA3-I7xOM(1AcXg zjuwNxbVd0t@M~~D$3K^3V@gR0_D3nDnxtdPXjgDPNyJu>4R06BZB4Yn44Vr=-+#1E%X4)7(F)04 zKIc^Euu;QZvPK&jqn{)*uF?X&*Ko?BxsI9ivttI$br?x!pG~EooiZ?wa%d&io82MB zq@0004E9R4_=YLg1?}oPq*{549BvPgGauKzLxW%|4`%|KG4)iKV0S)0sB1E|Y<{j6kw5uov*24>FjkdnhDf^w zw_a!>g{sG-jJcwMIV)Gy zM_Z$tX_-$c>YPt=p~FwE&;ji*-!+p~d*#udh+2}*>=t|hWB6^xmj=lU{cYAWOgk@> z(?l5?dQ(*WlK5$#KVTeVbvfaea`;E%;K5%*Y6yHN${r*+v{G?%0 z$6BUy6zu{e|LQn1%2Cw8OJ^{dP90 zXqsW*@NC;eS_xhF_}G)&O-J&t(b4=Xv-!bd67lP!(S{y2AA7}-3887yX|aLu!K|8@pG9~f2oiE z0~P*PUZFMtT+jo)y9`+8B;dL4v;h%?jLQIYpg$t)?;KCwc`4(?u{*ph02Kf@aB!Sr z7UTfrDNgZ>WyFL3!6P^??+poC?=`a(tqi`EF^igd(xT@5eL6Q^+o?M6>Q1G{Z|_#S zKl!jh>yIbQ(`U(_Ijb%iFB{*Q_-1@O$Tw$=x>&nbQPd z9TR131>3^y%R8`dZ%bJTHg>$Yo?z$4?Nkx`{8zRq4$e4fk-NpjO$yZYzm4VkJG%W> zd3`c#KRMtUZSbv%Q~L+<4#ShQ&eL~Bf$+b9-@tEJ=aWO50t;vh+0kqJjYsN&eJkHLP7qVOv0U@4o;$FD|Elc&&NIK_`VW)>Q*FQ3^mz1@ zwl~eR2&G?rvPl}gy&l$hOROta@MkyH&eGg zW6yQwcoM`Jevu2r9e&q2_$Z!`^BhxxFBS-&-1}NT*7YV@0w48XYVN}L;+PWe3y$eb zJ#OmvKhYP#)zxqBcaIO8X%sL#&pM1WGb{-tM@64*u%- zu{ap?4uT&a48J1`dzuLNUQv+nTZ6!E8t5m>Po4Y+}Z?E2A;CI91 z5C13__;ncCJL1lWzR}o=#XbUth59FQTn!S3Yv11c*i&TC=c=wWo@0zVM&<>^Q^x^Y zzrSrcU6PBxSZ5P7CPw&zY=|c?RLz}f=jZrr4&)A$`{qtd=J48$HH54acj z5BRO>z&*9<`r*G1lIf+#qzJrED!G}CL-&*L@l}AqX@Ead&*C^}E8({Xz#p%Z6>u=i z%G+dJbr14@Y=EO#SKKD6(pz*E`;m}az)3J4yfHsKF#g=oudYZBC)Cm;*xKjf`(74^G}e(EBnv<~oot#l&c5*Yz!wY&r@ z0{a3Z@HqzXv-RO~ulLHQkK`SJDF`^TV3&S1blLo8Rj`V?ID589(7+Go5rjBP;5GLl zBeE#Z)7Dn(mFZ;Ttz7pZ4bUu4`ar#1bSlJtDzr8aaj4(R+33< zri0i+?F9}i5mrNDz+!iWR0Bt?q^DFJp{Nz!q3 z*ppon#*Q}pWrO1DWLyfY8rZoZFmzpTvFhj>1@w_L_}YEIfklGLX=^|k{f52YTI{=4 z0MlLOQAkVN3rQrdlQ^cUPyxITqJZ;*X;*2owl8eb2)@hfFztl7^7HyTW>joOtnu(X zK5l?TaJ~7s;T$pNYPSGy-s+!EI|BMS+c; zD1I!|@x2pg1kQx(|BjgY<*_(9ughNd_}p)ef`Bn~kur2v#ynH2c>rwf5s3h&Uw00e zgliJ5cS)kn?y0o%d=~9NUmQeTIDRdcR1f~Sm5fWS(rMUA`$o)F;MlxArWH3yyYLFh zrMJ+*m}>L^a3s9H%qfxPSYM!N7VwSCF9^8y%rluJo_U*&7LH)s$559;S$F75y?_yW z1pRp(W-FYM80~}L!iHJXjRMj3DWqCA2pJ&t`hL=Rf_blo|26+q2u;^LN7FQ2X}Y#M z;dj#Xv%z_qZ|p;h%=~G&We}}96G`}e7AdFI)2XT(;DR0qVpQ5oG6^-b)iafroDQX> zkPVK}wAnR|5Eo8!@&0607y1ks{MQB{wCsEt_HcayN5HZ1W8mMHfXn~KF`K9J;Io5z zNu&B7_e-(--Z%std9$zw)xcg`2ll|Ac?cM5IW4t|1~&CTz~ub89w8koeZqa;&PU`_ zf1Tuj)&J%kO>&7n>#`nj5*hS^ zc@*u!GxPTC$= zjQ$OLq5g_-CA0gjrb1Y zP>Q=~I@)p-@O{M!@Jr>7=_EJ?xw1jb5)v~7s?#Q~!aF8R~;mki9LZxw6>4E*_aGzQ-Ko$?v7Ecrb~V>A!1?{9qUd!*9t zNRGo6(+XGYd%$VQCDqa5vuW4^m4dI}YbI=IC2T3|>5k|Y`cT37sU7-wzjnfjfHd7H zW}$QtzKbEpC?T9LF=%)MJ9i1TzMOus2!3Jv9}UT+8JfSxmpg(w`+sFLUqNbXMf*-s~mK>wT-oqaI4qdE4 zGI;-BOats)nMg;o|Dl00t$_V}QTuZ}xs2+~Q+}PzS_IPGxLT4axQex@ha|wo?27M#{{R6mwHv&YSX3MB!#!dA0P|K7^dF*cjYH{` zC%(k1+Y|@H-4haig#M--56BUFBv7>;1En0JZ3R0G`pTA!mw-$KAQT;~iupYeH!RL70(PxV-g6LPzZ19Ke z@V7b;=Qbky&{q4=7m~o5_oiGXY54HE;49QHe>uM=3oLq)uHV!7`|$zo6gj_CmFbwj z$8%fA1^9p)>fnL#@6tO+idk1lD)tgB2fy^9@y~hZuNCabIKSl&q9xXW)@Q3-q z>mV7FLkrO7V&N6EKM6KEzJa#DPOtajc-KYR9fi2Y_%^IvcS#p(Dd#7Z>V|>&U!%`8 z5ibIcl-tiqhYW1B!m`%Sg8pI`O34}Xmvd#DFZ8$pjs$%wiP(=NmJu)1f1hs}eJo{$ zz2G0$C>ii>->A8eeRc02>gLsYkLDP7(c;q)v>tx#N~~Q!TZR#0Md(;8_jR*q2jWaL zn+He_Ybob9RWJ{BU_BK$MsVz0|LJlTVtLga@BLyK@^}T-6V7$ILU*n|=Nt7AAG06( zq(vBCFKYio;JO!^`e6JIJfkC@13SIaXgYA0wT^Kw^dInl;?O3iXqs#6O-o@2M{WlTk*uq(;zjgb) z5w7%!{&wyCv>*G7rGL`?Tu&}z$38!IsJlT^fz!=Dn?wr{Z?(-cg}B{$KHup3W4~bm z{qcV_Ag-a846%-KZk5+Tt7VX;T7=VU2TX*v$Jo!|y7NQYCs}Ep)@4=X?&W=9sQSENS5x_p`_9J6b1x zkJ~0y#NKWNH*OA0$q+b%7WCJKUvMbD3uFIx-(jYlxzvdEj73~*`qu)Cp`|YI;OmEk zIpB)%55$2$*WX^vSi!Dppe#=xA70tCVDTj^`WVolcd!Coqy zemavZ=)VdvMq8kdh+jVK0@l0hd>To@Z#o`bBKSe_i4}Adb43I`=sNdg+7ghDxT@=9 zhcRG^^0m?aXkYZ+%}13*(A}-(}^_GI^n6zut}ilTx=6)Hu5cS$-O&!xp=FGDQ8Cv9+K&RRV5f2Gp6t-6fwo3ur;D%tt>7ow5fS=_u z-*qHjm&fe>0^XQ&#&f~j{^XcOa~#vb=jPH<&m39?{WtpMA%3kK@od0)5L@N|+}Z_m z%dwqflKo`b0z1>#hd7!C{-E z3-wv#k&QZJ(Kf{D9ZF~vur9US%VYvP(WVx0YVfg6VV`f*)CWJakK7+Z_s1Bwz;vD9 z$DD@#M+!RW3mu=)HFtQvvdw|fHh(^K&nfwIsb%QR@4?L;Ex3W$60CjDpQn6Jd>nDg zybg=O!{Yy8pnQLm#NJ}RBK%KE&+9$*S|u<| ze1>u0@Ql-OBwYjy3qFSy`auWd3BNN&oXP-+Cc`HJX2$EV_*|h7f3N`h&wm<&kSo-M zk15_yYp|w@M%L0X_y?+az4(nl56L4I;Rxav<OY`IzDDZjJSSg=ac_ z!0|)GXTn!&Q9mF4{#afA?EHXRoD+UOPqXY2(SLUZzexq$I9~&~sG&YGrT1wAV$PQ# z25;&4Vj+G(h@lW-81fKDfj9n=kX-#&gTnpl(K2Smk{61<6U)u*O}E1kQrhc zEMQ}JteQE*tY?Te1{Kh!YKW%;pYi5yl^gp``%n8beV@PYQe6Csm~(X86mW90?UU$8 z9{kX<0mM1LCxRcM%;yC6sc zUBAM=IhfEwI`C_35dUw{jP(^*lUn5?;A8{vHHS$L>(mDDe*e<+6vq6Uu$7{g-t(W= z@!wrvC@y{zbx4|uI`DXhy=lF`G9F?c0}p^bI#GqV3DiRi{*@xel^o(GB=c_5_QXzF z8`(%JvHx2YTup1ks%i6uONblmq2m|tV9y9$fiG*L?wW|bP^m(@z^^>X<18-TMI2`a zeX0)J930F9QT0xdQ=Xj0{*R8hxW?D^d&K$i`S6`d82yHLK_1f~g|eg&Um*vqTMaf= z5%u7Gq70iQ5510|eo~n0QoxUS9LPv4$VeQ94A&LUi_{=8^OP z@P+Z>di1%Ze!8(w{C^n}^H(ZGz@;&#l@?e8_i=1`_F2U3Vvlr)$ELuh$|8p51cZ+z zRm=-b_=;+D=##3q3TZkt?9b`)pg9F`<yCJw&;P1Ue>WfR z3yZis@of%~b(~NAT0fA!2d1|W_J31&1M%1(>5KOTUHM*BliOYJWjx+Xs_-uM=hZE|Lg8;G{Zhh~Sq4AA{Gji# zFZ~+wm0>XI6d}y{pAcs`8@@32d%wngj@^8Lx%su4>%dl9~*%q9BLQP0F=1;3Qj*71cR z7Z8W=e^bZ*m&*c!%rG8=AEHj;DT0+=<7u1lvrhh)M-}~NzgHbM^7_-?hraaW8mT@$ z%SKZaAY3Emw|Rm8Td6+(@MyVX(hPoojJ|FB8Vw<&@BIFITr>}3lm6cCSCL(KL64`z IOZolyKiCZ4$N&HU diff --git a/share/pixmaps/bitcoin.ico b/share/pixmaps/bitcoin.ico deleted file mode 100644 index f5480f41616a81cc3b65d0625f4f5e6f01a2f861..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68756 zcmeFYby$?o|2KLsEXztR-LRyf(j~nJC<+LOgmiaFH%kc;5+W&~q*6+Eh?K$00M9UI2^#FP@oVB03N`< z1Oni|d>{ZY-T?pv;x7&dI3EGPbp!zL@%{U|kR1TndV&Aw!+}B=0QBtx06F=;cr63~ z+&~}zhAIE6Zw&^32T%~eiE#nPFvcvV9OLvaVX*%q5GMDRF~s=c9AHU41K5*JfP2Y@ z09W!cz>#taaHnGOnDjx~3Ba6m4zQ+N0PHE}09WccrtBQx{&)`Xr5|DV7!de)3490Rg>7l1+mh6}F%`7bxXvoDu`a?vHARD1)dmfQg9Uk(7xq9Z`7_z+P0dIIQ` z9svd=2f(Y6V?e*`7|<-e01UsK02<$J0E3E4;8poGU{11zy)20xq?OfJgli;9PqG z_|)$MehvFTK+_=*-m(J(Hy;4ut$RS!k3Ap;!ymhMF!=)@y8Qrn_wxXV{CNVzbsPeT zo%=vS*D;XPeE_8P8~~ZU2f){XO`v#a56B%j0P+Tpfzsi9pm^*Is2tk|DkqMCrl|v< zY5Evwo;?A&XLf+r>3yJU{t!Sd?gGP$JHW5SL!j^XA<+B#7#RF>1Pra70h6l-!1Vet zu(q=UEN>qHi(4na^3E}^wRZ@t?VkbL2S>op!3nT=a1QJqp9A~HXTaIn8E|oW44^Oe zfva;&dUXn*Z%=^J^9$hO{2aKxI0tTTFMzA-YfO6k?|}LLzyCiG0W=!@|7JU$GvZ=n z2$%8s|Cv=WY=ZwHZ1Mk10*8QrkdW|S2~2|XzY0iUPz+A_-y|gen}jq5#Yj+5{WbDG zY)Jo4fq!8_I$ABQ|FS`dnK=JLxPMg$AsY5{t{#8&|6>F9Kd{2T>I8aWaILVXPgR6) z|0D39R{Wz*fCo|tvv$FR6dh(w`)^bJHK6s^Iv$0VwFd_CcK!RUM@WT{ASBTG>w)Jl zPC)C9DG!hq;9)UBqh09esQyau{KaYUFfcB`Loquv^0BZ8he8V%Y(tn?T~CoSs$G};M{QUB}zpAcYhOl0X< zIe7k74H=6^iJq7OvwJ?|J08MW1WhMo(@j0fJ9rv1+|c9Z}`6v{HJ|7e?x)kJ9TuLnZ9-zc3+z z!awSm2x0^0km72p8MNfmV_a_ix<^3I3yvNmTz8z?8zt zX)(Qz!3hae{wEHoVn*j*CwO=e0!mEfFhBk~jFH6D;U9^=HN|9z|C{o^*{A;wqklXT zKK|ceOo0v$EiPst(DLa0pP~N`%l?M+A6mr4bUx_sjDWrd0GV?DVEW6Lr3UdLrVsvd zD`v3$U*W&9fBCQO|FHAd=3m?Y`1tGVKlE1Z`4d7sT08&%2%jp-V|x7Gg$eZU*wc3@ zw8SKLoE2ZW0sv9_Uj}tK6`BJ89C#`(`_k*H zs7Sx2(hTAu`Yz3d-S2y6;w2=yxX3DnChAvS?}`R4n&DbJw-NU}Jgr zI7&=UFZ>q8JofmR(s9d% zV>dUx>0xMx4);$*>R~vv3Xx3-4Mh^jf}yfVIF~Fe4jK0)S1Vy~BXKZNBhAKr<*n97 z6()%hF^`4c8)jLzon&23zKiDg7LSeAYlzwOb#X&1a@`4yy$he^ojr9(t}Bu@wf{!h zbabL^;MK1{cj`n_Vk9(8;2~@~X-ND%htbp(5Fpdt4%>07uc>(F&KLlOV{0!1k>C(>2FVB9Xz1I6!ozUk7v9kPCmfMX295Gq0 zfoH=oq&wfbL>#Bv)CWJ81k}~~<`O?sahsWM; zje`uMy0hhsmh-iRq3pOeOP@2*PXy3Q>dZZNT^3CD4}bZkx1jVneBd<{em!&&S_S1-SMUFD)EizcUI3$!4dqV1dBG5Ihob z0Wa%%_7+$BdrddhAy$r8-({}HZ#YvHZb~m-UJ#788Q;MSiKx5D2Ssd69n0Gfuk)B1 zmm2lT77mK%($i7&4vTLd$7PnKNP^0#yI*u{>rQLrr+i#~R_zMPm6Zi#&4s`up~wj2 zHzM#~XI|woPSPF%x6=!OJ3UT~XboaX5DsvyfrF%FSzH_p!y?xcg^3a z*>Nwbbo%mh2H8n^_|_q9ZU*A%1$8$mEcsNoJZmg5~=+C;o<3p(ao}d zY#TA8Nhrh}t^;5U&k9lfX&_(%LAxM!C#p?A-(~aE7jJ8CQEhfHHD1n z!VuH-xgc-D#aHgKY4J$CEye2lHVcrv@9IY=?|ki}=uJJOii&NxDG@}L5V{#b!XPHX zdV3(~nR#g>a~keBi%myxEGkMedycg@ySx7kV_e`Q;au8=2^1lHwVUqLY=QiCXsd!0g zM=-(#_p=M*faQ=UqhzMvl4gth)dHi~)JAqONilYtq%{LTUdLQ7so3@5wCX<3B;Waj z40_IKx{BXVj^RKgmm9u=OgOEtEMxf%d1A{luIYN5nn%G2kNDzod@yp}%XFKwciq#n z;A=~Z2(~?H&5)K{V;Zg_0;DCflx`vdOKXkW2k!>#PB}F?yY9r0RMo(3?suxrY*qWe z)qlHp6F;J_i!9iN_xa z@Us6;L$nb#Z0_Qd-h$uI>U3aCVUs3*fJE|nPkovZi;2H?K(;e@Ro+|zyylw)=S0E_ znF-TWrCeSF9M@-|H<>(1X>tak$6fA}nIi~i9xSBlrYqfo={2fpZ8h1j#%kXx?Q?}^ z#=#m(@Ov<=gRSVWkwnY2a6tB8=Gz0)FvjoMhl$h z2K02|s$Csr`43d_)>)3Aq96CfC|U*O5w2oiZ(S6Af4Anw>x@$Mj+KuEvM=JdBK6pR|J zFV1LC+}+HRMVTPIKo~PV?R!tgc=S=KQ^Ssvnh1XFW3?)#wvl(41AyAf?+Mon;T!L+ zt8 z>E`eM^2UL~5zD{t6GD=X_wJ(jpM1hhf$`GLSS|i5sDPVx;Mg8C0o7kXwA`=c;MCv2 zdw_kCHeR%aN;hhBx{|s571L5k2>rMyUyLuiL{_mm-n55=tSJNlfG<@BG zD&E`G{<2yV)M8oqMj!PsC1>WVv)yFtX4i}D+O=aQ7w1LNmS4L@5W!ZKPuJKc;0PGG zh*k4}^yVlUA6rf&*Bytl3eQ% zRF#=X%+yY6$HLb9DtNZ{{OUtKD47lnRCL0Pg1m|;ZccWY(4D-psbEK#y5|1iD-~5- zV1MeWblT|ZL{#5@D7MAxY>zl{JWtUwb=0Wl1e7Rsb(D%a>o`l^4$R7GZ9krWh?E|H zzI?GuhnfAMgP%IFnJ%w4n7n815;2BiA*pYjmkPp+7VU8XrlW>?fj6#u0YfFId5Qg7 zc&bg|MpNqSxJ*%&0aLg8?8Y+VfYkd{`gD8g3dA?^U*7)A`K@@8ccnDoSaF3NM!rH< z8|eWzGg*&65!U|xsfrJKm<~cp*w02Zi@Q{zZ)F-!)_5o3fqjZMl^=?(*TgTzPUbJ} zRR-Y+BB0tQxM1}GZt1awj5|8A0H9{?T3Y?U*G=HE30vlfX-~m~$Qr(=5%zoq#Uri< z%1*98d0l2*A0-D`f1dZhv-C<$lF)q4{RtB?Ap|9AVMQb*m+NA~D`U0BUn4-eKn7Yj z^KmL}bx9DpLk|16DI#6*ha0{2M9msYpYGvSMo8Q2t8scwv8(8uy>LUfp>d6@b5%4S zNtIEs7cIH!mz(ne?^P=ew;vY{D?{PZnpuLiMZ37q>%}P_A>rhnI%lg2Wa!@|1HWKg zgz8@jb?kha>=BLAWAByLl|+)p`E)2+G#^pd|NfG=htu$NG~dB>Oc zx`CsAS61@9(k-2h_3Nu?|>uCZ7-XBt^|;wr60t11k*7_7QFvU5_c zvmjK=^$b0B-e^10GTr`anSH%^d{4W$%uPht^mz|@!&7n(N7P9AlK^fq`xQc4cd%f#Ju(Y3{v$>6zNnT@ zlA2yx&&e{mXDZsVPd%QvpYhk2SjN)8E5D-HtBXLBx=2{qS&J>6dYqo+#rW-MDb{y* z4@1s*X7a+foiDL|zt5$LG*WK|bs}EQXc& zte*A|2i{H^9Mzd}59{Ipw?F3$d^Z7F^g)o`ZEv350a4y*mR;YTfS6>01nTajcXB-V ziYEw)_eP|^^^It>Q%DFbxIld32cHBD!NI;lnTU?NfkLKf1-0Ir`wBmao?+t?gJnEu&Z;*)ON62LaCH@ ztXf(8(jc{Vv)XqHGSa$lnkc=#Kx5~{A2`*oq?N=5ZZBl|ATuQITVjph1I|Zp#gUy< z3$7zYr3(hWdvyh;t`Kaq$H_rcbpKQp;!sX2T$SbLGr-TR|#xL1&fX~{p!WBcmJe* zud@&y@7gNYvMm99gU%Gi#7tNTh|jnPPHa!uTr)&}eoVESnkG*JjMKx4DS*X3ql9Z2 z=Rc*~dzWqaXwSF-5zfqjG}MvA@C;e5nV@uX=e6JK=cJ#~72STq5~AZe9n7B+JO$K= zAQ#sG@W@GjgExF%n;{VH1L2%$8?6lPTk-)aY^=$A5L!USC$VZXR~DIjUMkg}9QgZo z*N91);z)SS?gg0+{#?OUtLPEm?Dkc{`gME_1Avrb71fh3TB)R2I6G11zjN{RLztn zH%{_RhEK>TUSvkV^W>8(6i2{9-q58!+0lH)R<$i=0#71lX!|34;Fq!5E8^R*czy?DPQxfp*0fh{)OhCkNeI+@Q@h9AasPSI2KHj7gH8QjMawB> z&pAudtg$mDb0lOM;MlSiiyC-hvY=f!-{-1T|6J@i@g|GyjyP2_4;y#M=YV!Qu*Vh0B2#_!)yB08cR|&L)uv--|xC5R;Tu6!6zZU zP5U2>9K7@2W-oDIDGRMslr~vk%Se0AY_wmz6|VX)Y3l_2oY%5)?z>gQJ9RS~g?kIw zG)y+So?Lwme92Yio@U7sn>!Z07X?BBM#ZdvT2hd0dp6;fTG1E*aC~X4MjaCioT#4! zNS#Tm^<}9e9c!YVH-tGRusmlUCWvE8G_L;EiVgWZ$r&n7451rNdIw&{8X@06>s{i`OZDMDss;-s|c4OnA z@U&hTn(U7Gt6=+eNn>aH&zu5Gr66Y&L^`eswQ1#%TC-HrAM9=`LMYbjnwT%2qF$SB zDe*DbKfX_4T_s^%V>!6vL2~yM2x`C7IWN(=8~$i!aVKQXlYQPOBpX3$dq;Q-y-uhn z9b_uXOa*S_*1Z#{^*giv`!40YFmS@k2bX#Vo;7U?iGV3U5nS87ZDXh?y z8VQHvBs#Qg*tSp7gM$&j1CuN|sj`)W0Absld2xa}2sI+WzL`!fzed@t&#{FjBWB_g zLo?CI!27~}#z#UYupb(pthO?5;SS6&QWJ6(0+vt{Wa~;G`D;*EKd%~6M&^_~UbJ_U z^veNVD0TL7YkQ0Tq5;+Itba@B5AyvBK&ukxJ|V#K=BVa)T>7kZt=UaO(4ReF;8pXd z@SIKYXpLWgGKm4o_;we3J2&T5)Jpzki7=FlIYhktKnVs8I=J16ZO%lGX9W$Iz#U`@ zf9bdnEhMmU+G5E`3|R}2cN6S{Oja_{7=|W7=Qi3~Q^R4I&BVVqeAS$o9&_(}HY{T% zcmzGA6&a(*O?xiAS|dJ+HmLWg;_@_wka!T>ExR(3@gA}=yl5cyXS4uxK4`0zB|#RS z-ANpkzN~!c>b9KnmCIJ{wr^@)+zDap`bE+n!j4itv^aoy_`5-brzGyv z1Y|zr6QLWvYMG0ghy;z!MC9Oi;4&cbsJy!XDi(6o%-Xqc_x6A$K6KjR;m>~DpG?~e z0}}yi_FT8i(Ovw?ew+@#o*_iKsyIyx4Tx5 zTe}5&!Doq_)&hnc&L7r3VBsmOANeGkn^nJy{n?bagSaUbI--$l-o;$7!CNG4XL=8Q z^X2J{3=#`m$)*3GS%+Dd3s_{GEWZjoPm-F!+*B9dRAN8VMM~GN*9sR6dm|l~KC756{ z&dis)>+{uXE2?04tFs@t`vtt_>_h_FZO+>lNFkK>YSHmumoQXnbmH7oB3ayIIPcdh zrJq4+j$>(I0bU``zM>n98qgu#^0jSC!Wa~@EEn3( z8hg<)2tKx?H`aXu!n=IfFVG#t(7Kp}GlRw+Ax6prD_KjE+|gPrBjg*C>`+_6_GRh2 zId4@4&pz;{2@-!j?0XPfA~i)9UH(AfZiUCgi0`XU)3Hc8w|Z32`y*6yp;&;HB*MDR z3Ut2yeg5~^Y_CX+QBA{vo}#6!&DFNrjqg)(DOE$0_oSd#q-NF4WCgqzW!9C9a;}@w z@&$VelNpa9M1FjG11BJPLxM$u01xET*U9e3`*woC!D5FIM2=XR=blg}geHx^Ha|L|7b4du0KuX`XM3>C~qUb3Qefx}EVi z-}l$AVtVr$ilFq2vu~lD>by_l)I|A;nkCUez9O6?vze)_M*@~vN38Bi2{H{0QbWSz zp^xCOAkEAdHy7LS;{ZA9Q0M(7U~uHti3yTGbV%@g=EPmR*_dgQ;yX^g9}&-sXF^tt z78Q~f93o`t-Uu}=f^Iraw#ae-RhjMnzDm~H9+B9Q{5$pQM8-*GK{NRrHXBlu-jNEeoHJCE79TfHI6 zVl|tIs^gI`i6RLd@Ne7SLHA9tYRmRYn|^new1iYgpAI1&&rMDCq{ONBozCv;iT zm$ZqXRziy1``lE3^M;f6t<2Sc)q((ZzBYUV%cZ37_J<(#{lnJeaD%;v6`X7AsqEbl zR5-O53Jb{@X%EB=C#BKCstt00PZEU6(vkbi4AAHEG1JF#FdHgn=%+ZCYy{hLxTleW z2zrqgsYDO{;YO>z1yu~iOUVFOKNukr5cR*2$rnXJ$OpY@PBI`8)bgp!tCh_GD;~gu z@%DUkw zr5U<+azk)nC+rowB6cup^^Be@`P9|FjGYAmhH`d95se1ox5jW*A_@4S_y=goFna~* z6RNp`+qEXH&%0m?1GwIbSYQ_6UMB9d7Y1u%x*V>0V#)ZfV)2n_y&{GtTFW*)#lir< z!IKq&pn#`P_{Bi1?eAN6xqtmw9A&%;`%LItyqJEE45?vus_tw1?j!`MJDhI8W$pkL zs`e#0MPn;?y$<^+;wjkELHlGlI1Bs9E!aMrGkHsxVjPbI#3IkCh`RbUbJo1t5O~uT zD|e8;1p{B|U#y6L2#!SUWc|_O)2hs={S1Lc7FVu%fkbZ?%svtELp*PAcaz3nSRx)G z?d^GKpAQmP!HED_SRX#@*mEeCBRIb3S=+;A9E83DaWD|0u>i4nI^>Z9ET6W(6;qjK zyzcxcRKK^7mvAF+u*TB69)dSB-f0Z@j9!($*RgCRe(zCdKS@qm9x9@fxDx z@Cx#cR;|JP=T6AzTkFS%3S$={hl9=FW@vcXuky=hRjx|Fnrff8_ z3EfY!0mU%tUczLbswlA?bZ(wRm=xB$=YZLFWg*53onJZ!`cf-unwgp$ED>;d6>~Bp z^aua4Fb0}h`=Ov-3oPd`8G1U*2``6|8*suD#k+H}gtlktdrqEec&d!CKySfnBBTg_ zr`G2#&IH`zor)~=F5$1=1!{*Ewhz!_XOdejxB@hviyN?p7up9uR7)oxQXte; zgv?f63nGZ`-#ip#F=vCt8tEoProGk|Y#k%&V-(DQ_(Wtq|!HLn-SytAC9WEN&E6F7nYTu?meotL?R z*5Zn{=Gb$)G2v&~i#3pMebG|AU!0A^Xd{Vs;zZHW6iD`tb^D6-6Ef@7K9pzQ>x`i0 zyoP)Z3ft=!iVGS{cEF+_QCe`2{|6%F=hw8%;LSNRSdZK9V%M;gj_^MFoW`u9DdeMk zs_%eD>IIoIEAD;a(5j~_P&K*g--0rpzm;0nYM5@x@m%ZobX#3)fX=JHi-DjTMD@!? zbh%<6vDq2y^267Fuw|+r@j{D+8$ZB&dY%u15b8Q|Qf$%6b8iz*;govOG;#S~)N{l% z>Uyn&b6%eWep$w*B!uj4W3`l(MtS?EblrOPI`v6{pG{{fJ5w_uDVE=#iA)fH`zTEw zwPxZBt|VULF%q^7i;R;}7Y>mFwX4_bcR|;zi9~Sh@R`7ZSXizFmbXjsBZYb3mOhiHmD;C;* z9@p?ox-!}B+?72LdchSJk-zfb&w!NsRj`=9$IXjw?wNwH+O5mE4TS(H(WhSNki8q| z@RnKMA zDBEc4NI=O9_SSWmZQv-**6=l;Ti|y3faJj*RN^iP4wgFiBWij2&LiA5cCq7^&)Uv^ zy7S!-;Gv>cAbir0EV;n~u40ONmB@4=p+M5s2@^YzebH)ORW=hX($eqNBWt?B(Dz_| z%}C%ns@r9w#XLRgsolO4aUb1rnQ;J0znSLe4_C4__HUdi(#hsYmsx?emf6u`${iCL zM9Tu$=E2!Fst@caqS)!XkrKHTg(lG~nK%Y5bDo6)btH1w2<%Xm}9xeASS zaLHR!3?H7kXa<(vQgz@Llyc_M=hbPvT#XgLE+?|pz~w(*Zeek7loR;Y{-XE7vjx=p zM9Jd%g_sFux5?B~z4zF2gix{FWboKT%~SV+CU|f|AgZGO4$lO`?waRGK?7U^>ur@B zi>KD^ywKoH2=B+sd)H1BhMI(kSo^cF`IrT-olIhIxkPp@+H@3MPR_HCBj#LnHm%4(f?+7BWQ|JSF|!h@KqP#`7VM-vP?E+3eHD zb3SvivsDC`bH@!c;?kL-oNhnx|@=0b7HtaSqyF~=1F zN5VcCA=Z#3;ZHW2K&#>VMvWY)bE;qWmKRT`V&-mpW(Fi9%kO++gXu()#kuBI9qvuz zhtC6>UsaeWg-*1?hMS8iynAy1*QX%ilwT;c)|QULv#|_9}@vk|ozBQYbQR z*PkN4MusY;>lTC^>yM{Snlo=F!`*h zFtBjA^q}|INSr2|-)JZMSNwXXXsvEgAt7e@fHfC0f%TqPwvQ1TD+rERihxj(5o$Up zEg6MYTDA`r3LToKXS&QdwpCEy<|Fe{D`NVcYBg&>mrh5Bn*untW#0jc1CP6SeEXA_ zeVSjO*IaJJG7J-jKWe;)BIKbX8^*;&RUDNJ6mBM==1Bh zdzJE?(^Upgu1&O?8;KHyRcfMC{cob;yvh zwstEEyD=xp_fKSY)Oi==zOH*8&FUK?Ay3wHnNqw4a{QW|!IW)m`Uy}~U67({Q0mB= zge0?Mxr<)8@-_y4y7y_{3EMpj;-3Z)e5%UNrgA-Wbp!_WUxP07$^rr7R7i93Ted61 zke(rb>V_jx#A`bBrnd+guA}T$WU5OP(upBcu5r->^0_!8sdH(X9~X?ABl~?HPH_qMiu0U)}Wll#oiG(zCecN03^QV}j>4mb$TDFN7 z((lX&q|TGA8803LkH1!vd@J-JLNG{(RY_@I;a+`jygx`mb6K3+m*v7cpsUMibvD2oz&xSWndbA~?0P>(uCkebL>6#YgL_r@!CSd`) z=>eNe7el><6&6rbxb{t%sckra^jhFM$yMdlgL5HcsPp*NgpAey`9s8ybD-fcp?pKNQqO@fCI2`vp)iq`Z@Qy5C@(Xh&A^8`zwm?k3`=&h6)>KjEZJB#750mzpj-cj)*-5kQf#axyyUAszJJqhhZwhw7@)4(lVb(E*?*;}L z!6(dHDy_7zT0$q!scR&FbT9FD#C|Td<@tT32+fdKiKqf06rm2gN9Tb-rnabFT20A6 z$RBC&liBc1w;iQ2S_brjr!qsh6g%|6=O0o0pxRNveE~J*ivdbu`=_eu} z|I3Re?h}J=u8j}k1;r~y#*S(VFzbH37gPN;j;0E8O3i?gf2cwJ0rvUfH>f-(o#ZDV zLu$clJ8%bE#~L2jdv24)g1I(iPT1vla@6|bQDIxvq+GnYiNGPW;{lF&aG@(fh{l<* z*X9gjT2`BYg@Vv-#vhWrriu9W4v8%yQN8=J{4B%Od4QY1 zOgjP`kvl2P?>u1?u+t}dY!bF;DvGm`BLjwQ&y6>d$k!cvZpwZextB7T7HO8P^`Ke3 zrC(pl%5u`~r%(u08e+HP4WOw&CZ15cTiDm;2`a*wALk9N; zewEa$$vG}(L9m`R6rv=*BAz-8b+q*z-#?sMRo+?4`jT817tLI6#piNdF?qX)%kQ_G z6+e)PC>W8gnNgtcvdnLr(=nG0Ql33s%YQQutNr{h8YapQ-DiY2Hx}4{R13wFn?3Q{ zBvR}+3!2XZ>Ji2L4`(5!HyT%RcwJtlG}Z+bP{e54{!n1Y{@b#}zUt)crj=KDslgo& ztX6M<=8yyk78g6mSu=^;la@k&t9Xr`yuezBF(5^YuCf|IEA+0h~w1 zrU*%@F$oB7;b;6Y;9Qaa6n!=S4gL8s8;bRp8qrP3pfa@h=thLrn=OyK80)=duC%e~ z#R&nBysF#&?GG+}4^cJ&8zW(B!nz}Eq>E&}GKuob(WityATFfaHPUltr(+VmOXovd z5i5pzTQuDm5;oRW#EjowDS0fug0Vk8n`f8$s7r*Qy}SNSMfD zKKG$5SsT$c4fXnQsZ)HV1;HBC5*kvh6Sdv*jEU_@VhKuP^?SXh%E$zW^T^5{(MPLx zvqh$8rF32|Q>ydl56A1SlR1C9#zB2?uz$D;vQm7aL3;hscmBl&c6i(Gmgio(ngSMa zg8VM9dkYe*!SW0)Zn4^zyrK6N21f!2!j3f@M%;&1lW;^D89qZ3UL3wjL_M)Yz&^j; z)SL91@P%8&vc5ADUP;NHmx8Rx?YhBnF%R|l8g{~sr#kqx-9K7a&g&;bb(K- zj-ZIaPb6g88!7OeSdJ;l1Q59F=)*+fa?Br zde8Oeo9W?)tmBTKuVY$3m?wsMyMA}e$GO;^ng+F+QVL%nS{t=W_#?;PQ6UpV@b8FH zt=`}%y??Fp=*qGg?`4LLHz^hr>&NQvMcVUzB+ihjGH`nb0JEyRW>-ALylpVHddK@+ z&orTy3DBl`+oa$ibVqtr722KLxWx6P*b#Mh@L0q8NU-;>?5?Xw2C~sUS!&r_Zu|PZn}|Q9 zRpZ87_i4SeVX;!yPF@h0{NjzxCNFjSQCAPKKA8z2e`72d{5X9{_gol>qv^*CEJg+c zNUyE?ypuyvo0@X;+JUjJmTFXBQ_6elocGvd9i6CC?2;76-YSS4`NQGqqRt~fc5dcx zBj?A)rJGdIrKz>XLd_9RgVK=X%;iH-Nhr)i`ZsYj+Nlo^LJd2*{%!Rm5}jVOUs8gt zp}$i@sKpOa^E5$uDOfzPpR81}LS4*o{Mh$jh>Gri$rRyGzTn}=lKOW3@RdJl5P~(= zz{!7V{7CH-1gzk`e5y1C{Gc)teqEJ%n~s`B54%oSB6r9JQ3!m>@^UJKtPi7JR%L6e zg^Ne&uiZ1lf)Tg6eM2ir%Gn1%pAU9}eHR#Z;d>^}FjYQ{j$ONX0?CaOpM+Z=dn$Fl znT^N(c-Gf)Cj!FfwLTJeu>H9JY;YKa7@v$NZYEJSGI20SS9%sUi{b|3W zq94j4WWoeT7`b#y;O^m2Y*aLg#wmXC%@S}6P7lZ9g#Vck4XGJ@!E!YdOelrt!nHF7 z1AGx{{ccrYr6np0@~D_dNgq2tLI^#y`+DFA^U{Gp_a&$Gd80)+x}nfBv%BGOnh!at zkw)7?oc77J9*F@jBT|@%>;b{&0>{1dJJ~G;aK$$spagDw7H;{_Igy%-Jh{8b2yC#} zL@^5vQ2p*ra{KSDj>HO>OFRcP4U{Lu^Rg_`FS<-(B9#W7ze*R#yh4VjU7`Q3!>Lt)^kT1xpXdozG5S&FRM^>b%PyCZ^ul6y_O7m5zM~tu;0dXI3$lEj zyliIQS0G2YI+AAcUkmoOrM0}MStMPJ-d<4QV<`yR!xZgu5TnSc02Oj>PBEbqR|{p- z%<75nH~S(&EZc`9Z|K^ji@y=Kng#%}g1PwJ;E29teOR{)h1sJFZZ;V!|A3fmQ_dNS zqZx4UnIqh`{zi?(TsNh`>SIu&vIYN#N&KwuBYb1Tu;`=~!tn$mx&HS1N zg1Q7}AMMme5I;++Qhx040xXEZ09(WK$iC#p-#=KeaWmILQ<%qNds9?43`9L$+HG5cj?}iX+}%f^^oCEg~pF`Uy|=d21^(Z^&1( z2}7zb&eTqzh!{QcULoF71>Uf?TWj!=w%%cZM}PXlvqLO10yo^U=M*08{`AbaCfmOqH?9zM@9-V}cC+=zoStpE26y z53oyI8Ke-&#&Z4*AKOR<@5=L5U=!_Vpp?N@(tnqW* z7i^0^zfBr_>O#HmzPwj-6P7FBDE+A!-vR{+{(9x5g5|*^Z5nO4_+0P@!8WOe>)YRo zv@+DKxg>WKNfoEqmX)9HHA(h0Eo;N& zZUa~PjttGv9`c|9y=m(Am0iX#LN`LAjaf1g5`<1;T* zy>sJ`=vTf-H#6-LkA2d#XJhM37?cW?*WytZcp`cEIrf12iScV?wm6HoX=tYDX0|IM z%^qyy#OxvI1nuPPg6_g&9h2s$Z!3*s`V}M!yi=zx>Pg@@H$6p&Co{Da3bS|RwG5J#}L5p}bd0KIbW>C#1m2^ekY8dI|Nq3o%mML03!`_ubn-5FzYuB`e@9Ys+qQuBi?6d^@A zQ#voqxA^k&9xbx2;P!T&PQ>93j!0q64CX$DOvvTMw{NM2&zkjT&$^X;{F05=pT)lE zBbJY?&Tqec2%UeVWEuSRyFAi-d#QN}-LW%zf~|3ewKI}kiT@PL;#>V$a?k-fW}|SF zairXo1poO(zCbwY_*xIN|nRK$6iCge=R-8pUuZYhuwsAdJb%6xN!!DJ{1{a3&VcjmuF^$dS4JI&l8fG zG>3mG^8UVA?lg1CJ3whk*bo_#gP-K%`0~7S_%MNymCC-bzQb zBWAXCFH%nQ68#Y?nNlnqkZ0`3pO@?xnEbu#&$pUo^GP5 z&ExN*HUWVW83@}O^f_awdXv*>OM^E=osfDC!e4u*C#fjjoTk2_i#eZ|`C|Zq$rfku z!0S+Q)@*XwY#$*Qm}C^L_$Z}c?vN@Nfy0~kD)Ip~X9VWZ!#n%4C=%su1y(D+vzW(G z>`X@mHj!`N8_9jAQUH~9{4ur355aSYZh0Q$rr zWTbfH0DWbgimZ2=X(6LBu$}_}sPCZmw1%-hYLOteKi0pjsJmMA>dzjKdhl&RVEwfsj771&07M$$6 z_kRGoKt;d7zvrZd?h0(wjCzF8{xZKy4s!b#(|3+r5~RaiDd%H7y+h0k&cVYm1voHR zOwOc4o~K+ZM~g9K6+j{>Q-LyLdr|jHlP!k$wHg3ilfYdhL`0B{2ISy4XyQT@Jt!qo zB2d}|NJ3@^WxnU+jNQ`g+aq8U%dr z_3QO2aH3{jU$V+}*W>%%?As5!pEJMSTQEry1ns9V_|(@xK>)-FGrwFdz|@+Tt{Y-$ zkU}4`SB=@e07v4x8{MwF0ss&Y1vHEWGQOt8ngFPWV!S^QfEDBj(B7HK53m>qI__QP z*R~!jgPR5UHMSWjtg8z%Pz?f0lgR5(m>w=z>0${|CP>Ei_SOFPUB~y;4}!oODd_v? zYxp-Wp928bGI-iT+rsbXzR)yD62x(gIF7ON(8qx+kN+n=SeSG+g8(If&_<#*1uX96 zyzMf-7ZCJ0X7;TR7zhA?(8756OaQlF5e77vFD;wzy%tXT!C0!ZPYcl5wHrqtD`uzs zp;)hxHXdU(aLi!wNDF;vITo1&F|!R?#dNQ?%@t$+kN4mH*Q8Zg&V;^&H2k=V@p}P) z@8jm{MZP+5=GU(?)1QqeK8I-bka7fP`Fjb}jqL7r9d+sshQUjmDxl0pE-|hw)?y<{&zHgVRn7ry+-Z4lvL zu`(0@b*Dn}rbPpQ5DUA};>cw{{hMnA`ka2STtm?OXG=n@5fo}VzaQB3MpQT?7$%VI zD|E_K_jRt7+WsE}4ejV#{Qq3c>y|wqrtP(Xhnu%wvHjfB&(;3X6JN&oQ=f;B8D!F8 zfj_RKFSN7LIc~S-AizyH^Gr=i#W}d(ix@ijbs&pD zX&WL-)N|F0ZXN<9orYmk)BCOOwy58W{fz{b=H1PBFUQE&MMuoM#j zv@!qy7{>8FSf&*ed)O5o0QFPHcyndXD%`n`K6bPX06vYxY(ygXz4WDyCP8@wAW5X- z7x#3W&AWRX30k%PzU#TK0tDA@uw3Me@N*r0jj0E)<*CmiY#mkaAxv68mS~u@m2yk+ z0v6+$F~b7$=!div09XMN0Pv~+QT2Gd)<}tdJwB|z=D8spityW z4R^4+nt{$jRu80;!RY1!QPfjdV?*l+`G2kjlrX`q!19nRdnV^iO96mvIU7|?4%5SMn8lQZFF-LO zlf_KpGoa8?!e?F>&i2%SnFIyElplEEY9eG=ie$sZ*8Kls?0-`>1Art+AZDIG^T{uv zDF7fqQs0Q~z&3R2TM^ecBd$-Fy$7lSc-#*M4^I8k3W9hV(Y=2Lw2lJNAgDF~WGO)T zn}-3@gYGd$52p*h-ye{W9ZhmqEp|7ZgV@b#zw>ZJcQT%)K*9_jZl5vdVF4Z}B#0RSFg*PTh*F3&12U=J1SA4LN>J8C7`HIkI*P&I z9*7`9+}MmxV>>zn=cC)$22mTZV*7P`KL-OJ5G+O;aQzbLt{0%S;W9+`{wbQLz6BXY zsD+UMZqwI32b=)|ofq~wZYnyAZ)p~0_z>e^N8*cOXxJcBYM}#4{YL{yR!HuGZm>`Q z(1jC8Br6^8U_V?()#K?U`&<;b;9=ZiuHL66>hdbu%BCGTSdgnBKuL`()%*V~ZT{a4 zo-xk9q=S0shHM3ozrvDd;x$LP5>YY?d4Q$ zs;j{n(oxZ?q_pGlC&5hs1_aDh;MXZ~Gz=%cpUIE>QZm56y~{F7k!;w9AYVzh6#L(& z0YvR%K+;h)vVxFwou&Gwgh@uBzJmlJZDXkOEeuWHg)ADz%*YjJ5AQ=Vu-WYFqd%Hq zH3;aoxaxfs@iy!0qbM?MiqF3pXBwL@e&2@x>L9E&RPc%6!=mpCo@D~SE1*R2#kD(E zg6B-Ebvtt>F71suK^ia0S_$0p`wR*MBt( zVg9TPQpuuyGRgZO1SmzAb}`odBF0XA6|LcmF+F}QIzv0H_5S+9!;a_E9zLheXC_>V zw_Jl$wO_!-d)^BqU5Hu(!eUeu%f1Qr6SlxWr)jlbqq8%38G|!Lz%!f2wZ#g}(W$3x zcJzm7NC0VuHY;%1O#lLbPAn%^Dj2Y`CUa>4JiC!fN)p=P-t3$q4hCT7d>V+(=K&^W zI!H;7qK0hrqLTf;*x(-*1RAZ!p@2wBFV67}cv-k z5HY4J5}iCOA7fJ8OTv7}zQ#JvbDR4S?0$AGpd!Bs9buPdSqxbp1}$;_zsl8fX^dw3 zab=5ARvryK5?nz@$hXWS*x!DklfXU zRpdq|YKNoVPOM(9qh7BA8}{MMB|ia~b|H}!4-i_((fy|)`K<1A%{ceBT_bZbu{0vV z#typ|701Q5qjhoWr}m!@xppj1v(gs?1oH&|azCAfCSkoHccqClr6=9f2V6bW466U@ zbA@d=M<42Z9O11YW0xaILZ%6l(TkVO{;$VRL8M9>6h!$}=vIYcJw|iLw>MXbBJT{< zJgFRpGFHHl#TY&IIc$0G4?&ZUs$GWT7)g?NBM|2zSK@0Ra6us1bS+vtZiei(a)+Dx zl!LpA*MJrFHwu3TV{!`&^mCx%l-Wf}xc3r;$?p_XW(k(q6MPmC4bN_qVM*nwrS z|D}|ux1RvXSlv&n$kb~blyJR}+DwZv{URlhB?=6P5OtrzmIr?y^%J+76?<9}s9KNE zi{_&ZOz!%AP;&y5#ULhqg;2~%tRIE`FFXuL><9P#=wxAYvS8VCf{7><<+nrF8i6m} zcWz;%pUjcd=@Y0{O?%QpOaSW!hfc;v7jW$|lcUB9rytm9{z9z6%d0Z+N3JDc(du4( zJ4fG>Vjd}K$i^=6hT$%Rs@BgpTaPJ8F0%?Z6VsY>8LW@A-@s@ud9wuT0|jO|5ac`Y zZg}J`P(Sr;3jh{s3TT=O1Zs^Y&g}XDb#JcgTgB(bU1h%tza%#06|sPt!L=em!X70A z7bZ}s1uno?_nA*`^d|Kf1>O00=NN1xpEoVW2S5Pu>2IBRLP}~cAqc4tRK<){X~cNC zko0_ZK+WH~{pcK9T7a9+CslzgjY0L1zS;jJCtw<**?BC#rFtg(WhNH$v$`7J7`W3= zI}x>MkoQn-E@(%g(A#l|5E~AD1kvexN&v7BQ$SM{2WfUs1gA2M%)? z{{UD2VSjt{cDEcV<*`La@eDpHg%EY10rkjSzG$>@RQv;VutA(Dq zaH(U(=(14riT6Y99m$!#SbEE}2brmm;~>DqeIG*BK5cvfS(YtG`g8KFT;w1yv-w5{ z8ME4eF&?+qUE7;y6n0VxBzRfHk?{+lcy3-3z?2F5*v+>{9wGoqDo&i3&hjOa3kQLP zI05yyf`3598J=)$rPZejbzILmd;7uIv_?5BG)G_{X#!19*Akf(9UCj6D2TW=+Ck`~aMMfkIjv zXpLW`77a=D(h|YyB)}s(9TndN1mR(NV?Vj7y09;`Mh!DZj44pQ*7_#5{P~lXaovo# z`tN3$lNPE0n0o`DZbDDk4PPyCwE)lg{M$${HXyAiUt=5V|K#w!2Mowbx9Xwd|78$C zj_vcVuv<_|tLFdPkEw?6uyD?F+L7s)0EN@f$b07h@U+QF%U=ygDsDj32GBTl7chI& zG6Ck=U$7UsT7U+DthpKK&~~*+2wC$uIp{JVD>1ptjMg35$4PU*pwK*QkP)SH_dc#x zvhaSs?-~HVr+NBQ?d-5hUTpy2MBc-)^ahi7nlFmYAo%OU2(aHS?9&Xa zGK)-V{y%}N4MU9X^1dl&-Yx4f|KDhH`=2vJ-Y(O8mzhltK)0LhNm7&7dKEmC`#}Ui z)mZ(0c@M&4hG2SXx>0b8L1i4F)L4s|D~4XKnL9_lDQ> zsC51rF57FWvq>X6%3Uo;=nrt`-|su^B~} zSG*URfUW5`4Ry5xji4kU!Vuw^`xZ3=P({Azz#s?^*Cv3l2E9Ru@nx{7Ot5yB>dhJ7 ziVG-?3#H#?Xn}l_6x}PLtP$AP&Y=w~kjxa|WcDE7KCu340DPF6&utI2?!gitZvUu9 zJ=nA$k^WsUhFtc|W4bdr_M?gdmL(3W-n%1W^PLsP{CanMAiei)`z42+sR% zYXx0D?f+)`@j?PavqG`w0TJ_S@o`}^6^AkG9zqG^-5C~r0|1m|fasd{2=<%t`7zZ; z^Ci!P=2o` z5||%Yya`}5fMZkXcXo``v35LxD8RLpP;Bhvng(QDr20^jK$fP+L>zv!kh^`D5)>>SRg!T|l6ET!eL!3i#Fis(PB%JMi!KLZtg z;xar>Ba+CH4zkU=mgQZCZa;+Wr<4ysc8dC#N9_SDIO%R%i^9v-dNl*yx5e1eJ3|** zK%UoxEps5z<+#Vye5@yH51mfFg+c>xof-3@#cBZhX7Wq-&wlfo^B4VQqGci_$*oO2 z_;a(o|AjiHnL+RICW(-AW|3^V0l~;l3jnkR0N4P)Ni%^P{Iiq|K;2Js_7N0QbgZGe zW&Bmw`9LO?&;0jFJf1dp9w~v0fNcB#!X-F5=iByxQU!jdCG(Kx%wN$9jwq%um^f^9vy%gqmNl=Q$>|?pwsR6(S zJZoGK|D7MZUVWWb^7gYr^?A_q!diuDuHqe?ufMcRo^-FbsNg{L-Jj5J;uJoTbGcMH!AOXnf zHr>8)2)8bU{t{C*Ztkv8w?M^8?79nohr^kZl#W2%9(gfRYc4f|=8}gLwaIOS|E^(yi*n z8m_~yU+S+kwAyV*gb)Gd5dm^-{6hLOy{bqfejXOUlD98mr&%!pMd{^!(DuK;XYOu&8LI#QTz4_v z#~=RFC%*H4eb>nGNYIvrR$%!_gMhBOXD~8AAgDo|cH4;ez6wEoa9)hR+~h8gjiLzg z{?{SheiPD@4+5v}M=<#yqRvSKB1ISm2t$ED1PFvMVdz2_3juHkr$-a=F_n}ADS;$S z5O+Grq9Jr|cq^ju-B!HAQhXjoHOkDNWf>anBWkZg0*XB;Tu^h{ku$F&t@UBS)NXu) zPP1O|lHZOqyRYB!c#9IaR{buna)W~i`TT#1N8bJE6OX|^1F#?vSgHnKfZ+73{PO0J z;QQt`2f7MWzBkVwJc_V=0)fa7fDj5o5C#Z>5F$_;S}H(bL)&$vA(xp_4dP5@$Wry{ zZixu#=IfAM@&?pKwptF-#YQ`Fs#5=@lo&ew?OgO`g;vr_b17*!y}%CUJr4G@#OCe` zFd^@>V^OvP5k+20(Dwp{9GVEoB;mx2{0jPD{{u^SF92*UAba#g{N>Ff1K+oH0)jYk z#f1$>?JQ#EfFyx5o<(=d^N}?+0zhf-0kAXzGkefSCtnrueFXULD2k9}HDvV*k&W+$ zloDMjfte>DW{*P59zihsB*OM#gq@QRGD9FF1Z4iA0|pyo z9@t@X3_%Wv&BzwUU`IB18C#pRj5M0j%$?=lzFl3v_eXVgS5;Tv8A)?TcSiR+r)RpW ztJmA#Z>wKb0bW7gKZBgcj5prS&)-56;HQ|+3w}W_OAEOjTMzHATZ*>nyzdslG9j*d_APCrd zG*sq)9Q-)3901_t1b}XSM4!KF{H|xOub^Ws0KhQyGr}Nt6^J5`SH|SIe+&>M-C8;4 z$%mXbsb@O{f_@HN0O$cnTTlrhAj<0@2BbiUgg_W^u*OlKJ_@ff3>J)mP41WX9*lv7 z;{Xv@!~rmf>Hw(N2P!RvSh5zVt^$^AgjecC$;xn?OW)r`e6>_+56kRF0*w3zr&|L< zJIhZX+gztQPbE!!Ks>cOX?(PfGp?6hY=-j8lUn!a*cb1PWc$Ck{wHJiz-<8>H%``Lve2OdAcn#B*n!i8fL|=45*@=ihrf_`g7$qb)M`{=L#;(uZ9`( z8^b8p9+9L>hQdpZ)c(cMeoYW$>zNvz;)(Lwh_v4BP$zA+wYf943A;?@HSxV=RmOn zUO5YmzVoF(sGf_Ud}c-yy7B^C#Bd1*TOiB?onY!%S8u^QlFvkb+hS4c_PyKBr|QjR z>aQ&XmLA;>gwv1&Q{4`;=6@>E&7OgJQjbwL&wX$boUCd&^>aJ>*yXLctC|1!%#V(J z4|7C*U^bZt`NuH;KBN#S0Vo6LIr_;>w=XHP|8}A`)P6861i;KPFaVxRX!1PS(S-S6 zUO^t<6@Wq&yl*Xn>Uspd>kwAgg7>U8(tYhQ?D7_ub#St95!oicYu$CcEdXro-i|Cs zo%oz{gkhLWKh~TY!cM)|k5tS)x20Eo?gN3m1` zaRylw#e-Tf5R=hycts#;q7aOsF#2m$3%y`|31QDF1WPucS>1qUbuD<$s*FHz`O9|i zz~i+9TyVJw`uUAVZejZ8o!8~M%vGz0EAXdG|1bSLQgN-JEU(*xTv@2fz>u1Q7wm#$N;{IG>^6Tz{xFm|2UI_b<-2Z_ zWa16e{6|W7`CF-T#ZmmYEKL<4>sZsI&rbA}=jZGD93*$T0LRBwB7h4Zj6i??&7<#r zY^Yg-)cPE$061aHX$$~BbmPy)hd=ZuXWrFcX3y(fArRYPOk1~hr9Z5ek;MQ&$iChp zlr!Ui#V$huh?)?*jzUmFq4qeI_$8pwgRtiuH2XH9*}n;*e?7w9GXa?7bZP%Q)7&mQ z*?{7yMl15GW#yA!lO3O;2oPaXpRshFM}6?m^k>WuZO z#FVrgSCTL~Eq-{%1Cyi3S^y`7lMw*wi88GLzuFtz{QRd>o_Df0*IwwPj<=1ZptRhW zZ$4gECa3(!qBu!A1mMY;a##T*IKTrG8sjLAJ&J0f1o#z%r2+7@mm*qsnK3+=ad$aE zI~VcIPs<1mE`!g4@k|w(Fn^ z0#_5ATG!F3f*>#1M<+k4595qIUy<)xnf{diQfW@U^5M-6ItqDBeQq*4_|z)c$jG_t zWXP|MjtFRS9DVKQ4&H^V_CL7`;KaHE>(JkxE(G|&@#yO(dG2|H^#hWzjt_IufnPmsVgUf)U%R(<3*fN8Its3v(>{t!J+eM7Wgx`l zkF`#gaEgeK9gRv$5mndZ5>qFKkq9$2nly<8L4Zc1A)CiEL10hG)hXm}MS4Bhr^p{R zCb4SQ=ixO*CHYm`e@y0drY52< zeideO-$|wa>X-``0B{I_tG|78&zqjV?7sdodlp%ibjKkv<8qRN^u7b?mB&>nemFAf zA~xq?R3-uhZz5W;1;nxqFuJL(lOzm7M2!h7-T4uOg?=>qHX-O)i)PPih+@AneRi=} z1QDT7kUwo+PX0^*M%O*HDx1yuZ2_PbB?OcJ5YtDodheIuj}HPQK+Op-O2_}VXDK#& z?#1_rl(+H4P2rs!(89F0&qzcN+W-I`Y)M2xRI191Y~DFh#2E+z!iZ1{#Ey?`9odIi zv0@I%56oQ*K>atYfS(Q4KXJu{y|;8S_jS@{%d~yTYFd`G8z=5Tc2be#n_=q1Cxin} zYncS(%7DYflc1?1D6pd_)*eT%R|YFo5cHgbpt>HsZ#{V58UV}Wy=dpOTNq}O5Twwm z{lDc~wa#g$A?H~D{^VYqz55Gb_2JlUnv~>^UnD_qrlSlIRbr3!wCTUtKS+Nu%GR-u zOAk&1d@kWIhe(2d0@yy-_$2b%{yWA30OU1>m7T{*hUlmM}CB* zLwACOQy@MKgmtJHhD_~jcHBvR6~huR>zhRm-sJ8h%|dK({2W4Q|9VKf{^|>dcED}^ z&k5#I000gv;K2jIbc54LSPFB)k zTNd`ZeqI;(Ip-)(3}X4v_fQ%i1Vv2{ugm5>k=&IG6tajCl&wze({I)eQV;=oByHUp|7)J0S;F{Jyp_! z#2h_X8T?6mavTd_T3kRiRS_7XC`7n?3%p`^#sM>QvQSt@aq!t_;;jPf4Tse6Z0Qvp9P=`f$;Ie z;it}DUHtow<^C*?en`6U$r7^1TM5~j6$BJSh$4Y#`9)6h>lT2moeR?kv>tFGm7?)A z2!IfTNHFmJO(<%b+=k1#U`KbNa`b*Qd(J_#xE#DRfY7S~ekqgwtKVxY0pRlaS#S)c z`a$$g?ZT4ropKgoJ`E-a6xBgIh$HwKX-U25v`m@%+7-=pO)!wNJm)xPENK3qv_BVw zUBlsZ$aePWSPKBiS^An^mV)|kW3tEM*c}R1vRr#8T|zHQL@Z; zB*Op##7c;kJ_SWbo_%sgs|ipDfu5;7G9boSlKm!cD~&-!Q3&!1i26662)DWJYJv;H z5K9hkM{(#Ll>CxRT=Gf~g$ly*N<@Ain!Rh}Bq_bC5P3cFD=bt&ei>kDRw&i2mV-5G z@F;>O0+goqqsYfltRF59wb3eh62hH2LR7UFGWD1H?}@}z%Rwm>&4BP@$(ab#e;NG zRG0OI0EM6Ua@}A+LRyDaFdO3M)|o#L$((;K2#+6W zUJKLoZ;SsAw8sTd|8*e{{`U{;xv6&D=67_y6`(^C0vf?H^A0kze(E5o&ys=jCc@=U zo0b2sYiaO0N|U=l@Bj*-8^Y;j2|`3@4s4mRdC~UAz3Cx%jgh$DLL(+x{2Yu)ivXVV z%Nda5jtLPri)q$U?5h*=V#y>Y+z=v)1w-6t0!o9YL{?++nOfZ}aSMr@`YlO4n>zCg z-S>a~N1nV1()_o{Kd0IsXpaQ|m;!)9b~_Fq9co^)}! zX%+;MrsF7X|BueNaMu36S}#uRi^so@(i5j4000CMaiNxW=B%q+q;!8`-jn`%Re;kp`_12CCgI>HGw#W?@6*hrz1WL8XWAeuXY$!I8 z_8dg%qCF!~`c90X9g*>ZSX?h9JSDD+{ti|D3WCbrH{T_+>zP7`^xLw21FKF4Lbdw` zTnxYPV^7|UY=8f@Xn&wR0zg5x0+JSiA3xf74|VQuVIre_Tpysm&)k;ZFd+&#M4=DV zzb-Rd&P)XDnS3H{_ZI+}c?gm!0)hwNOV$D9{#@aru3e<<<8*D|(Fub{&O{YP!1lq$dofSGze2kN zfNcdN!N8Yaci=~p&FEK#Fz-m@+#Iv^*$m%)Q8l?n5L?Oa~Z1ZBCb&<@kS3eA|F(NC7$T+Xt3ecV{c|`errXIc0;AD)y&l2IG z4z~&JBDU6{$0|?$8CpN{Ls-wzc^_OvgeE6U2IBr#f9}u^kZt;F>&>@&I$tFK5;p(< zzu~8~za{e%=y2rSsmmJB%1F(lC(t}29W6btQ;fZoruSPT;F=nZ5rKq&KmpOxjm{Z) zT>igW%2RtlydiB+^{p9XOrIm8c}ckdNXil`fGpw?w03(-z_=``#O2VB(~dQ&yYDTn z)45-nH2r1p?@M>r-VKc-Xj8ktjdr^LYBAh^_kHu|IB zBJAJnFu_|drO92gD{PJlEC>)Hg7C|r{tdJ8|Mhz)PdoqG$Y5U8AipmMg6|E`j7^npI~GR`?FlY^2x z`h524^oq>93Eq1yP+2x>|6dBA5S7|v09f4NCVPHE^OHbE7{t%clyFf(AU-w~3Gx`0 zM{spL>;29A8|c;qa_V#@1OZJ>2ss6>{ru4Xh8g*v(=NZQFdr^}BEOLyd|-^%?|!`g z?uF$FD75;>Ol|FhBRun2($upCzEFc-xJLMino}s(1|bO=IWI>fAVdUy#?y}9|DPU$ z7mNZVK$?I_*R^NS$jN{t8&S1JWc+!U#81wxt*1?emc?OQlPp1$^E2fB7M%$q8TAh% z;J!VLcR#p4m_WAKZ(fAJd{_Vqb}S&g;u8n{qgEH&JKhyw`iGod&9eeL2Kc24`lbhQ z*3qr#8UGEaK9Y>)qek>eCce-FL23GcY@a8<^#9X^gn%H1XxRn1LwF~5lkxv|$B91z zOwEO0YhlvqZCV1^q0tEG1e>}5u?Ve>a+>niwv+f|-s=L=`U*TY{m1LkJ%4=N!8;(e zzp?=4WVGMeqFsqVI`m&f7Xlst|DCrEzwPsXdDbrh1`i#YA*errp7m#B1gh;$sNXTdB>k~82q3S4?A@gF@E3~X9WU4xZ z!2&}h$M{DW5w5;{zEG#0GJ{=g8aETfbeVgP7J^OMFUq~cuwgb8Pn2R zI~K{;>fAI62yx0RKoCGU0fbYi)Q_S(`d>hy0#@ijqq+f&>IO`e*PvNgiGWI|G!G%8 z4H=;KOBB2bUfl#y?8|6)UHjYp{-cPaQhO8v3=H}6>#6JNC3=8Q-AzV=XGlySV+eNZ zm~_Iv>^>z(SkC?h1l8u>&z%04NaBSbzul;QsG?aNo@b zKDOcVrM=$oGO*6H0t}{WTHpS!TLCf?UYf^TfY1bE9)#zEc_AR05Y0(c>PJx-y&ua8 zJ)mMA>OE`GGre2t%_Km_jC&y>M4Y3s^l1jc)l}wyBtC%5033z-5WMDy6eB{V7@Ndb z8lSXl0*a3sv6D^r)Z0eT&*3JuB(-iuI4yvM14aIT6Kaj<7ngi=|4qn``p+BYGX|hb zHX|SiAbjO#4!$vp5OjR2K<-bZX(~qrf@TH_4&qH9tb>JhP}BhNIw+`trVgQJcn44) z21Jl0kZNZqg6I2~9(abcb-}f${iVrWpfJw=CpnyU>dU9skdLD$@u;7U91GwI{F&>T z^^n)xM>8C|K%qtbn}7Y~Bd-V0gsJ`KE%2vfJ_P_^{+dZoK>*>7U5)Xd4%Xi)NVacx zrVw!56q&`z&!-V8Q$el8go>hg0L;2f{1Jf+&_!WOv^*eJ?x+0-6z_83Eg$sJ~^~ z!_&ubicNoolbIa!L}45FYMXua=M#J0@VupKdduu-GKxLlw>BFv&FW`Xxwg$@gPGi; z?_=@69(p-T1{^UB2ul6_=y~V_@n5^w)Qz7>)u_0~`f#6f=WvDj^Xz1Dtj6 z>p(aGMjW6B%yKWXMogY5ZkzYkIg)*b1E0U%${kpsAd)@(0!}zG!T;@&kM930r1ozj z+wMQ_I8_u=U$X}(go*%40LlO=hp*lE{c4$Q^gC4usByTGpq%!fY5(JRfEq5`5DJR; zNbA5MDAHr}_=CP*PE5+YlAON0P)5+Z7D06#f+d>}RL(}|FG)ri_Ja{@8vJKaIGObS zC+)nd6+pTyYTTVH!87Z5md>n>%d4}nq5S?vNSF%5p7Z{0_ay)t00OuLz`Q^FsjvWa zxaiGBr^NSPyruej84v7GA)qV)wVnt7d)p#3lt9pqmrn^m$qY*v*wJ%>w7*HDi{Jo- z0I$Pu452*v1gfL=p?_pMdZ(X2p?(-#2rQX;6unb}a*Tl_z!=|glFi35mo!&M6M%4& z|1>7PLPS#YhY^Vnes}aG_w5NrA<3@?|4wO;<5W^hS8YCIi$r1xeCy4tFMHurt2g)_ zlauXsoDi_heXYzOy((u;;gC)yqG|h#*{{1DuzY9D_f9G>IbFHu$#o*YF9L;%6c#)H zg;QYhG}~$Rp8RV>^Ic|nUfQlRaFgdg*z1c6kpKctXoLbk8=QW_mDdm5iB$7G#h|SKry76DZ}12NV&<19pFS{pXff{YwkJv;;Z}Ho@Z}vVD2ABVA|lI%V7iJ%v}d z0%Byk&!)t8_Rur9O-Wo)kMcQ+HPgm=f(jRCsZe&1}97f;?ebgxBCj@ zlix8M^891I^8j4X)rT>95abJMzV61ME5iumQ9Sr%XG3X4we2w5N!6qz&aSr8BP=2% zx&7Lrb*Le$JROh&N%vfx{K-+y0G>JzwCf>T$B{vpHEK_}lA9OknSMb?$KG`F;VWVK z`>p{#Px*`K)EIyQ0bqki!sZ!O?(~`N!YOYwwt3N~aSyf&#}|Pw3^FQ zpUGEO!o)7utK_%`rvViC8=>svv-P2=*S!0-qYofI*{5U34|KKw$l%}Zo813Do>Cb+ zccAzZ#^O*~#|Qyi0L1^Du>h^i3JU7wGM>m1f+dpSk4Z@cYCG=EI~yPv54^`C!!XdALkeWxVPe>PZ10)PR)|NHsGuFEg#9a`B} zxU?gMfGq%kOp5?>2n3d_$F6~8{_Ezu9wUh3eMo(SJc5%&VVmIAdgA{(UT(|byG|b{ z@&}x7|GvgMUv}N0e@CkM^G5gWD0Hd-U^(jmfSb109(ma_tF<$#h39vs5U_7QHRUt? z0(2`t&k<0&RY?-;)9i^1fvp&Tu}>W{TQ|UgWK4qDR9?K$HGjYf4;={JbHyhP-Uc(p zw{0`}&Luik004&FoZWZBUA3Jrdq#EojB4TH&JhB3FfhmTcg6x@eVfRNG$6<{tv{p2 zPyV?g_c`T8F*$a3HNJvP{)Z0+S6}+^1Gm7P<=0UWe-}Dg0L+LR?y5cT(x+F)R`eBK z0CZAdFze4J>^Anxb=kK__x)L7ukt!PdDj`aI=EK~siXfOAsyK4_$azW4D)ys;P zGjxIwFg3hcrf-`!$+TX9$}IpK(SAVF&@L+=cLVvZfWA+=&CdRQ=LLGV-Y_C;AFRLW zWuHED2NpQ_frTvq4BWC~;<4wPSK7IDdFhV;u+9+zc8h@eW5ouT!y2HZO#o@8A4AqW z2eMjS7Z7X)f#K5l%w6|1gCIGeM?((h#eeXdslRwl+SIq8$qy_d0RVt*yKi#e>ZRVc z3sx7e@EGe+`t;NYg4tRDiuR7+AncKK^s~>#8psn0j(uH?pFz^AFC;X=Xy{AZYk&H- zuMXdbY?9A{BtNit1VF-otq)C)OfnhJ7T0rJh2-CY`c~%! zD%jWLKqC|wo#NlQ@albUL)xRyPVZf?CBjG16yn5eT zkap>{hx6*_EWg=cF}MIZ_Obkb{f}#RUvfcZ@2aJR7eh<1onLDpFCgf$0#g4!MUKV? z99lo8UT#?zKGxSZI00`J0>1mvBbOc zf>p)e^E@^%|8W638EB^1fR^+#Yd=4yUf0xbiL@&((2)NA&TGFv`l@%`Hu6hkNAF!! z?uS?Q7hhTMfPz0?tpv6J(8{2X2!wQ;z*%MR zwY-C?S&Uq z_OIwKTnw-RV>A!efSm)NmAe9hdE{-`3(vL|Ty?qtdf=+1ZDI{cUKzhm@%m|EW^Kd{Ki4=f%Rz=qB+eXvn|{(&NZ(mn58 z^EaDUmEYxio>%kH{qjtsy9E3Lp|IoG8{N#~7w@g19vw*JeuW3T_4uMGbLWmtTL=;WvI{>zF=Z=S)dGi~dEQ4imwqBcRCz!blw2GaTOV`yV~E{nhiP~5V*)cfhzuDJ5N73Ehgsd!s_FBJr{b`Ru;An1OJZm1s2 zksxp(iO(Z}=|Jp!Vz~L0KmF{`H);(Lz$ASujepu}eH~o^ki~2Tfsspa`jwcvMB#&hFAu zAOu1{5E4>IPe_1-B$OZ^O$9`ys(e^K8)5@QiULZLo(6>8JJOpViuA5@q?4X(ugT7T z-nl!=rV{+z=tJ+)r_WAB#H}#VgW8k=2Y=Kvmk2;(^-ueA^0!DaS=G-5+aO4}N zxKNABnbpbrr-lR!-9N3~=H>rB_m=-eS;Cj!b*TBm@|FqT`b<#YPg|Mw&YV##JV!NC zY|$L8a)2!Wpy1 z=$M1EjWVie3U(TFValAZu02z;XZPAi8~5%sXVBSMKFi0;>Q@g`Y#F-CD{qW4QJL9( z^ze`R9_)5z&xb3{z5ee04`q9n4|UxmUtF|#;2pzplHVO}c#g`iOUj z{W+!G*ms6b*6BR=*E=j9__A`}UrT4SaA}t_c}BN8)7HH2lQ!J1w#(99wO5Ypw7uG@ ztFP2<{7K6-uYEX4)zbGzn zpSHg0s2dya#xEMZ;R?MN?OMaQo^S0vX-M-b8leBW{>PpAIxQG*(!X|YURv_LyLlg; zsy6bu#5Wh^4e?&K=+YYnLz)n^(kHh0cCppF;OoEQ-urIqf|1`PM$TU|J*V*X1gEHnhkDPGI@2k-7hCAO}lIb#T;^f!9yFDU%+o6xTUJo$KyYzJm zdudzF@Vq+vrbg_^Tv~}g9aT&=W=KY(!orySPIPqZ{8Fcl&kg=Ah^`aq97m_j$%p>Z z@toBB|KI-oCX@NHe)HS$FTegA)k9xmbCb?vj{i1S&3tEM<=`25b}af()U4;uX+iSy zwE6V3`U9`4dilF3+#C3NbpLvc_jiB%>7S$}TnW!q;}e~D7Butz_QD??-G+}=)N0^Y zwSF@f(h=PGr*L%aqh&-0sIpmoH#*%RVkl4g((zgfAOdi`dm zDrz?hB0X_-jq3HkCJ)d_=fK2ja@RTy>h_*633zjvE`e`gnvsD9Pmc};<~K7}Q|HAo z6Xh-*UIa(gzstkNecmO!hrFs+fQxgpcF+4vxO~Nt-;R6(&OwAfPC*C9-~Y}v0Z z_NcyV^QTJ#w-$ZmplzeiAB{U`0NjJ=1n(mV@8;=77PU}n@fmc$Z%>;Jf(C%qEq1_D zu?KF^edN&h25&E0@hHAK$~|!7yeHhF3HO$ZjI0H*CRU#Hh;P&UsJ#cjP_r1@5tnO)Q4axFsgmW3`?Q+n&cduh5lG2kJ-Y)8n?V z2V@gRRc#RD^0;%GO!$+EJt>C9ro zcja?=h_uNAw~;~~9Og{)Tbc14@A03bGSS@F$tC3ZC-M(m$*+TdLG$}%$9^li=6X+Z z51H<_wty`9z5*6JfGuVSXjv0H#X}y4c^?4&k70(7{1TT%VV#u z*K^%~U1+_;NH)Sq^pIr2kq%EfSNP4!(^RS5Fvu;sccuLT#Bp8&=B7R=@4>_7^R?{C z?M%*Rtyaq>9V}oSSDIL-buH@S*+@J9y-&R`@za4)Qya#;XJ?8qB3k__| zi40~knfST$qLRI{P0xP(O~r0yYgkcH5kG}3Kx;Oe`H5#>ACyWZJ9Ryiy|G!#`xJBL zB!%T zuEBfAB;e}2g68!dO19{D9y|3{4pXVsT+Rh9jxA^c8vr|q6W90-_c$K-3|TmIDT~t- zz7(G;Y;9J#`G`O4%YCEt?t=#+*n5(%ew~dLhm~*&ShEI*&JuVV@Dq1 z8sF!ub!`3VY&LOUHhXJR0qeO&%U)Qcr_;c?uF|uYS1Z}d|6WV~D*K+d(vmp|_*4`;{kfjj67y$_qGXIoC+=ez@dp|jw> zBM#u(;NdqjJ4^0T+rzEZ zYo%;}8~M96nnZ><(n~y7vJIp@9b+7f*&^M*TBU1QJozwfml@f|Kjm^;;D|r`zJXw9O+dOZ+tGrd%_*I2tI6Uf&+YkjCNh2CYzAM zZI{3U^ZTz?a@e4s%=~=)Ckq=$*N$}f_YOU~pPk3&1MwVa$Z2;ZhdsZ_#AyKhF&6j_ zpAoS&=e^BGD#?3}f3lvr1SNKNqa0pI9U$DR)_Z>F`;Wq(^PXf2HU_lDn4mp$5%LJ0 zfIrVI*R#WyGq?^2JRrmOGRXFAH?cRiTG*R(zOmKJUMCu${r(pXyK!IQy`$W~o?N<> z$@;9*vCf1)`iBl6cChoF;HZfA9DlNbwG-cew`NSgQZb=xV7qEwJ-!-V7SF|ZmE}GB zT<|IFw@hxg9dUsT7k)-Sf_a-XjxKEGU3v!5;$uyZ$aSWZqZpYMRTqrU)|!E^WX^=uT`%$LY6 z+IcVZo^a=SZ{xj~_sX?lz`x7q-;j?}3V-Luk<}VhfWIT}5#NH|pu5QFKo_Bt;63=% zeT|9rS*s~!1ArrN1z*t$zYpIF{2l3qd*J)*IG@dWtuu1lBJ{o(?<>%IJ1;r@UzCZz zTVQ*_|EuBU>3>DMhaNiez8m5G!djZo*BaQ7D;cHca^MGh4qp#30pj3{tQ<}&=m%&6 zS_m1ywML_1>rUlx`4T?RWAQ$f=0V{9{AXXegm*8+|60v^RBh1ZllRKPza;PZe8+h& z<+V8PN$%~uC){5mU#9nZ6I=LuaT@@fz|(WL3)sRVS#0dyT=xD?DmHMVmSP+Y`($e# z+xtf*r;U&UJOep_e?4HMj@x|9H$v}4JXo&Y19uz#wL5%3_OE{_`&TQhv!ZrHmlx27 zU0!U@3EpEI*jOIl!sgT5BY6LuP45Nofj|725j%_f0l)?PU2;-oxBIV??T0@AUjTkU z@3mU?2jzw!BjNxp5I6jAAfL}Q;63;Nca^}BcWn|L z0)N&Kf5Cgl__oEuhq+wLcS7%BpP>7oK@XAv=)fyw*Z}Zf_yL&z;ScmD{NWeE2kJ#~ zv+Q_wDIW+iz`~bL@CC^k>sVH9ekmUiwsP3^d`a&ecn=;` z2LES2+q1jcGeKp>KfvEDAijE&K4V9tFPwt+JjNs4hkt=s2ebzrpo4-A@Izq>?D9Y~ z03AA!JPg}b+y(%D__Onm<#TyQ9Edn*&=wP$b6CmlXXSC;<31c{VKYu&&tNf&^pc-z zS~Vgmfx5{`F|lOHs=|rZsd5&j=b|48#+~=s+}p|0C!CKLGL| z=m5KbI3ST|(2Zh&Z1Qu&oCcgA+rQDf%s<#^U{ilpv27RfC?Ar;Z5(t3IOD`K(EDq5 zvRH4*4>;<*h;b^zd*s5MeOk7zl`y!J?E~*|xQ9P4t5VC$J!0CmV)-vY2k066OW0d6 z7r+lHP6ugTaHK<CTew4p2 zGyg4QLFj~#2l&Jy9)y4J#`=7=`eYWnd`HR&3f=-gaR6_85BY{Y0KXv@kcCOVC|Lr@ zO&nhnDW2P?FvcMs+3~hr`_ENts<=1sCD|`E?+Lse+ZxXVx&*wHl2(ykaXJWjAe{hA z&X9+Y!f#u02}xRMe>3I5?^t84&%VElVCihr~q%ESqwo;H}8_UZfa) z_3;e0>1?iD->==z=W}I;6-GAgKo+0lL9=r=vw1E7dcbB@46%%f>N|>>#=KW*^&F~i>;Zg+p;{qCI$%pZ_k?>fKev)F0anUqPjL26c&znL(4$UFA9+=`y7i-HT)$Et z&Sic7kPZeGNHhqUXOQ#)z60R_-+|!7t{_ zi1`M#?xeIf2>n<~aV_i|>LWHD{fnKxdY>))^)BnXI+xF_PsIBay~)`>{yD0jE*0yQ z#IvH$H5vxF_`Ndv8_>QYe9QU`G_cdbW+R2~Fk*WK<$iLwjo5zTFP_Io9<$9N70q`# z{#oe#lkncN$H@QQ0>z5*uOX2 zXB`&hv+#M++NPuL@FelA7`M^8%afY|{r-HknMV*$t71e5bHUJHtR1O4v ziphh6ULd{_K9oJaCA$Hcc@*8zr|$^Dy{2dVS}}beYpxSGKB}$L>SYD_hV>$btzH2= z7Wh1ATZ#@g8!6}@^d7k5-txx5Z$2NaT3)qwL(f_<{r(Z$1#RlJeS_>ly;=dUju{o5 zuCG*GTzPPd?@Q7_#F=OzYt85s_m*sf)AXi>y~d1E)bgt3(f*yMD)R#8lC4*}!E#rh zC>PJL_8ntq-?;pD^+DiNk`5Kcx41WS+KnsjA&H$Rr{z*7@#)yQlDJm%*(0)B)oL~C zdIb%d^gXS8Y5SL4}mmpTcr|D!gp zEc`0_omZPda`%u9)vHpj#WSQ$Jkero)R+T%V$;<*nA046c;F{a$PDxy^Iwbk>g=#l zKksh(>bNl;f$?!wYd_;&GpuuU&-QQqN9lNm#DuUy`<+u862FMz8cuQWd^{a|{@dK*5hdx)WW`EC5hTlid^-_9QxhtD#`(BMH^Yn9ruyc-%xw7fg&P_#5U4tLSs;vb!= zm)9P2;)mj&YHvyXS1+#>aEeyoAzFc_XayYvUF_{R3`BH0h?WR{3oX%=cT5c79TMGn z2gC>dAT@SA(T$vMG*Wwf&uo0<*Y-bnPegM%2h%Cu6EQA;KKz4+*BkR>O{d(I2QFdq zkPS=``jd2qtY?bA#Y~RhyxyGmUu6S*#@~{K?qrI@ELQ0`xI-qBT&0e;tD^|STxRmXrJ73P z?)dDJTn8>!%Uhi@+sE_h`clLwEy`k?M*QRBx|Xr#qnJNc!vP(xu2sl z`pwL_+H~^GRgFg;9^&!*=ZypmEl*kG%@*hXqx^`V|BjVd$oLoy-d-BrbkdD<|2YNu zd{04|*&2{$W&vp?oYsI;Qz7}iwv(>$9siBrV+DS+ZlCA#{j~+OuP+LCwACJ)E+dlBseG27uGILS}7kk48~Fca+M`u6w@_gLs8oFsf{ z9m?c0@k)B#p5qz=){qUkPtA|_n{!r{ppxXg@yOo?5xsM4;|e&e!pFA9)fMCwO5g^3 zz?&k_g5E=r_3W1i1^|bITqgIOe)@08llQoNvayWIOBLFCG21RD68$)x5hozeAo9nE zBkXvT&xew+7y7agU916A3*$5X&l!Y5m0>h?lTo{#2#3b>|3X0rI%@b%y|bRnN~#Hb z2i@)C3)=G<3W|f!BDQl}&jXH*&s1;?K41*i^oJYtZ#$i80DwlHZxOKI<0Fr{FOHRc zD$!lxJN525E-$G@taWgji}4+4k2M_BKSj}rcrJ9liTGf$$92H7l6cSbdGszFLu>F?`NS36UI^_Pv{wC-M z_*My-B7HEEUCPVw8aSs3aA-2-WVvz_aZs|8zCS)lt4MAh(%#Hkr>ofA%v^$(_GcU` zU?B@EZ1%4?^x4erW~*4@GCd2LZ($+x&4e%Py_xx^nmI3^=bR1|>jvqwiP4-r5Aa7E zDDJc1I~>jCS@^v7>}R{9$%Ywi@E6lpL3=LuG&brng3=7^r}Kc{LUl*^EMlRB{cDqw zS&Xz7*JNa~epj&x2UINmcmZ2{qJZkKu-{6mxd|fvab8egcAHDMh;eK!pSNj_GdBEi zV>Dp(pQ|i2M@OHO^uup@hM+y>{*rz1oHx&dlMFe!@1YPRvb zlCKq0840r%nrNe#f&UJkFsq4KjT(0BdM@j}N=JM#as7vG@Elaxaz(Ik9;5;Os1wC? zIUq^HWy-7XkI#}{kW~@wVMCgxm^r;VE!VO4=>MZ^Jg*`csU8FX7a0lGLOM$y_!iaA zQU$b`_7djO+A!A6C7TOgl!FKNt!VDgqFOiZ^Z8D?Vb_E3T@pSt?+v!myiD3dZUR#c z?AyKBTvi_BC|RLVOAtBK;{xm=6Vq$e>`qobJ4^eW0O$Se0{%UI#=$Wx)Uk2)e~ z_sz(LJik=QGBPsQmHP$kT85HfqWU-qe3nz7W`i~x*ozyA*lU|DR7YxIuh7|JeG%cH zWw*144|EjS9=J+@~{4wiz-D96kg}e?N_0LlM zw}t9nsNV5`?Oq%FSMKGr=T{o2p3=-~W%wQd!U22$51;Vb>pzkjX0i6lYV({ZT$RB7C1=# zTG&w1Rf|ExVZ$G#M#s`mYS^X=O7`d70;(mV->hU`0lQ6ZZe(fLpp6>VW_cm+2X(oq z*+xAjr@h0RCedENMmA{7$svG0YzI@s+29W@1AZ>|1UqDquV2_`pFm@w{+HLouOaW$zT5=zPu;BK}q@}(6=>1Mg!9qIm_iHFnyUmK~e@ z)aV<$nTGVJQ^4$edDw`Z+>h{gcXAC&RbK}DMEfG}4}A&Ri@ImAF9`B4@BsaLuOS_P zk09tu^T4D-Dh8Ob4;1rQ`;~9VL$Q zz}hnfti!58E<61;8QFAt$499a31(b(_(js;sHqnR+w`UoaRshnd%{R2VUIx{#ORPEz9+%9F9UY873tsfLx=-t z@1YI0%NZIr`H+V1$^0vm<}Qn#eh2h8EG#2CmknB9KryJ9_ighN%A&mlKk2j2x97S4 z7QS7A8SuAB&*d`I>b)6_sD>d+=zy5J1Rj_JI6nvnfd}AjzQ{s&npiT;uYjM+HChlBlpZ%vlu=~%zq4gOF zpB71(X^oQ0c&$xtc7cFB(An{9fnE708_t73fd&IPj zhwbKh-auQdD_|FGv@L#bm6AChJn&B`o%aEMIUY0~^xHStz&6plx9(94zxix7o3M|3 znw9x%Kl$~LoBfx`wov^3{ubJIWz;j1LC@a(Nkcj%*~`*CS}EH@c}0T7M*GO0AIiOe zTeR)wUgt8^e&ibO=JPZee$re}Di#1wfCqR1*@{muU@hmX2p2tlmSW=X_rn&M*}WVU z#V-cdahZm{XM-^3zSuz;n_;3(KdyfFEtl3CXs$PP#iIm|!6scuut>?BcVKDc}NIg}g|s z1r*nxxXV(1%V0fLD2di2FBJD6CyM-{UGC`_(NBrig1nypv^zfnrsg&qkLyPr2_MXq zg;UP7JLOJeQ!>_JZYLZ{+Dm(TY2F|oS@;R%*c|v@X29NT zMh4H{z9Qw49|d-?-#gCunaf$CPt_WP!+OjyHa?W84<&JdUVzq+L4J~r1kK^w!*&X} zFY#Ov`HvRJV$jS7>uObz^5@OQ?XOVgivjNNp>y&tvUtKhj@A<5=H8kKc_p2;VhkF$ zSd3f(4m&US+(EnmtpPLo06yRkcx8JIeObt6TVWG|f4n)9z^L*XjU7Ds;1j_v(CE4T zoUF4+(uX!vPYsNougQjf5-&h2#A=Vk128(y9S;66o-L$)iXbl`shaGN@uzsMIl;i> z(F@Q0E!YJPgMK&5y8Nc*x$Cwc&TiZ~`CfYDe7%|DK{l4=3E%;qK(@-ohv<#9vLd1} z?j^XT+7)`?RiEcPqgV$+pjl7#U|fRr~P>O zu#H4Nk}JYR!p91n_$kpBG`9av@@<9ugr#ZnB4^)AkNA88&&#%_z7r1rvuoMC_Gx6@ zZ$4bVZZl*;qxc`szeRKQ>Zp0DtKsu>#!%WD1bGLH;^g~<=IIO(smd$O=Vq>oo_u~t z#K7^~7XxkDUop$uY?bn``20^FJ@*^rT^~I3!7*N3RJ3cGVd=r~6Mya8dg|E$vD5w- z5;N_>kk~0_`^S#|wNuO|^MfKo!-~}pB;IE7_B*5)@Sldctp2+$%#^)!iYeMDi{nz( zz2dtz`ApvFC{wga&3x)IF2;D0Hs;IKvMwvs^6q<>ygRJ{c00lpU2z^_isyGSd50xx zdGlc_pDN5$fJDVdDB$v@K!e)CTh-g6)i^nwL3_{1DG)7LWLLC4WSFUy%9EU&ih$?= zCnu?F$;ru#&u=<8Y0*YHIc1`)|FAua&m=*jU5wAPldEK#i0{dxe_HKg^jF3>0uIrZ zgje7p@Zxy3e~7oBgP;rOx{j&W zZ&pKk&^~VTVJ7#RdC&g2Sf`cz5VEGg{(PfPcScez(PXOSIEDSuyq1V^&d59S8Y23R z>Wog&+WO>1pKK!ub#m$oKVx;iy^l%`>*PJ*4_Wvo3!j&1+%VrCGd9r}JkJ3iOj-*; zEKT(#I4QP~PWlb=T$0w}JMI3)h9CbFiZMgi85B*%Rj%g5d)zTu0@*P<=QHu@XVe$1 znes8MRGV+1`KOTPd8>nu<>+fk{sOOiAs>CN+CXdHpQ5igniHCgK3uNs;GSpxy+zhv zn#bk7Q|~PxUjlfcPn>+tgO3Vd59{_Nd_4gNTJHA|-1MA*)`)M-r|#u_sqY4FuPGOX zgaQd~qTM`+#t&ly;0r$!xe2VH@Ysy#F8t*(=wX9{YBuOu-zm4}0mpb7ZE@{*1g(%_ zFj~(ZhWm++#rDtwSB!-^hFDtLobhV`&riaaNB*h|-}fOs(x@+5UjRQbX5g~o@t)6j zS2({(m%>TTbT-`W{vO8mrRNtM&0}Y7<+Hd&TFL_}*}Xi9_X#HWsEEmN;$HaL5)SrO zT4zmC>qu9_0fYD0b9TLGZqsklt+lqX?QtdOiuj~yvXP}8#Tu86b)omb&p1r^Ldv^+ zwMWA~-=$$=_N&?8%^H#m1CKMyh{2>h;dCB*IYpfmyq0W)_qemoDF;pC@*EY1A7jIB z^iIZUWFOG_KJqv}U)Qm753qKQOb)WGSZAcXPLYxAzoMjfuFxKC$9P201Njcp%_buc zbNkTrhwG?ktpa-ZP0#$^Ha5o{WBaDi+6&QoD&>3kUDdJ-C5_1!YAB~f>ma#GExVej zB|hkQ{*LE;365lXKOSOR)P_J;xQr5CC}!gLQQg%zZ~*;8@7!9ar@Lr5L~2gmWEjYpizKLw+ImSl7dQaoW*3?g#Wf-$E1ewv3&)tz}bw)3Kkg zX_-R`n%6X;FB{zfgUFXFpLuIB{1y8VlB_xg*`!*ABJc~e z$9e>4h`yzFctQqLy#5H|{Cri-*T-Moh7jy-305~weAwM;c)}>dR z)iMk59)~3Hc>gDjO=}v9PAFN2r5e6=fpwkI^AOqgWSxc9dAa@dopx99b8NL^5y^Q} z)5+~W_cs7L`T!5TDc`r2-bIc12l$`83q7!~`6o0ad$0?7_USGi&mUvG6R?-Uo%*IZ zZVi|odE}u_+v3OT9FDjtry?BJI)%)F7MKgVQ@#|o5bq6+qxw3Np6u?Q2G)8Z@x!EK z+x}GYJU94O0(UNVguBk?n`2=Zzv%>N&c`*5=(Unh&|=Qr&+sheMT+?!z{Q8=!Ny5c zyGnT#_!CF3<+1a(@>t7sJ=L1!ve!3Ab&AMimB5|%5pl z=c5MF27}!X;W=u5v(GJg2&XwSuk;(n9*o=pCcN`nn z@!#x}1(T0BiF`%CfVD!BN5}%^WIG(_8~A}IkQdl?)L=qRZFUy-Le{CaiQt);!Trz9 z)OXWQca-aY0)`HA&d6G1OE9*Yb#qu)8r2Tb7{~?M-~c=v7W54`fG>?}B{+D!J#t!j zCMZ>B44(EE_xWOIT{Ljwi3-QY_&5@iFUw+g74rBaVf=y6sN|fDl*{9FT0DDIiGACzK=r;#>{1LUaP!T-sQl-Y0AdvpHp*;&;Qas=kKmM1<=(+bN zho>q}g{EmWw2z-;oP0fg>RE8ARuh`6JQ+Uw!Q_ZB2f2Qum#9sDZ{I`PCAspJ#~;ef zJ5`+IZNFIBF!qNNF)gQ@@7RLQmfs(575nMphA%nBpY%-g1-W(~*AcHLxo(q|EpN4- zRe4rde*E23Ztf1o z;7laka2}+!lW~+%DC@*;iMIO|+nz%o=<62siM}z0HBm7ZV`A(eCnqOQI?;+e#mvXp zp&yb|APc6`cl;l&ev@z3$BAov7c}?r_U%L`XS)Uba5+9;R`yhi8GrVho^_i3x9DkH z2h7Z#>NoLHe8`;aa^D9@DDZ>U9A(XuvizG)y19$=yUcab$%5wE1IyJw8{~YC6dY0=x>A98WMZTsX`HcqH1N6<;9;lY%O!Ji74gwz0 z1}7_Jp>uQms0RIvlm|CZ-riuP_cd8NEZ1A#-lDeByhW#h;(O{d#X$LTI*}_!pGjGM z;VBQ{44jki=KJIQwR~K<4|b>p%?10f6tK@ICcBm;`Jx@^-R4;1!@L4`ZG9FsopO6^ z=-gbM_oetl<~QwbynnJ@&FvfYhun6XrFwSgrk3rwre~Qd6T6gcWY=9lb)WcNEWi4boE^ApkdbdB`(?mWU=wqeWYagu@yEL1AuYSPn+|!^1Xc9W# zV1>Wij{fJIwSlG(8+H`_G!PVx4i;q z+^gS=`U7miL^qm`tneG3r}yj5B0tq+DP$Qc1I4a{?`<73(>vqVUXcF(0Q?)01FZMh z`n%&5JoUOu(2NKBAh(ojvC{wDvZAgBKKREwbxdWjumd;r{C%wNZP&A0jfwr4X<+TB z-UoaG9H14|_3rci;i^kevRX#EItjV}*`>LX-_5 z3u=>)2ea!)5&5-i!jkj3JVWO~Q`EA^lsx~C6!jVZR0FL$L8qi#26W{^lE=?>s#vep z6fe`B8sGp~B|Ho1|7x6xPR;X+NK==x3sGqW9YRx7XK){fm0+;RB*hN~_YT>wJbI**RT1kJ8J_|bsF>uSs<8szoZ9zeUIvxH9^zwu8W(W zJOFUOm z+iJd2);e7&i=BDZwdLG<^;^ujSHIPatFEmVsARDV9@?goeH1E`PDYv1>6X){{2b?0 z+X?5R4soA&4t=06%vX5YhfXnXCGt!TeNo2IWb{Q@;9?#3sqk~d4>#4Kny+B*ap!{@ zez4J9JQBE2qiFJV>Gj>9<DH*ouSH{ZzeHOPIK+2S+6 zi^q!=;6t{51)gpC<8l?8 zqF!l>$1TWT^O{Vuv51*LiyWXc9zEGF*^AOoPMAo+1UilQS@7(H_`Al+W)bL z>d0aL5&v(vphn#Tk3kUgAU4EYj%NdGx#qB>ya{BF5GPnrui`%4Xnl2^+B$@Mj;6;w;*~oF~c8aw#TlvR#tj@TA-c*k?ocaT-H@n^Fu0oD6voe;ncZ2JMXfXy%nGeiK{YcKl}J({frOs)#kXDx0--1hDteKiXU)HN?}>%zQwb!E{_xL1x*jpS;M4(kV$?74LZA| znV-Ke7?Y!u^B*pBkA1`tgb>qaD+hvXQPUL;;yP24o>W_uQka(DDTt3Dxn4J9xQUev zmH}WgSf$hi;8+My{5gt8jszgdtjg@js{$Z1hzoR+dWr((`P3xaav) z000aG!|}JnAOhet-OcGbcR1%rMto(0Pb!U7tvtyxybxLjYOVlqEF8{1YY_uN03-%+ z0VpaESp}2078eZJ|83EH@p61_@O1OrF#ymVfv|o*2qFLyVwhrd3!dVk^*hGE6t3J8b*Y}|Mk z8t)mnR#u(8%Uic2#;PQtC7BvQfRGM+rEi)DapXY)P+}O~P(YIh-%V-vs&5Pr0Dy); zFxC%(5W#8pFya`=uWlY|40Kod^}eH2?<}BNYZld7_H8b=Is1_VtF?uL_xZUso9bPK zG|*n|A8IOTs^QVhmD|#w~gl$Z9cjiRXgZ=Z^Yu2y zS^zlqe}N4IA&UmP3K!lq6=q-fd(5<_LgH&pD-n(3(Q*L%yT){%=JFjCh2FZQkk zI?D2DAOHTpe-*&B1!N0Z*!N8k6brafimg%wfvU9n*Q(XJwSu*-h$6@y0z|ezP>>K- z1q28Ps_c6p07+&h`!d-lSnvNn=lkyI&3E4LW->D|UPcvAuIQPv|}t*9O<~yi=zq=D$ zWeb}|?OQZzowIo8*S;nF5%=mT)eC_qfVT|5ceTOqjz`G?%KXs+W`USJx98qAKmTbf zTs!+3UiI$^e&aENT6QR0I`oWhaX);xdQimSM-k&0cqi2}-AnL4?tw@A%>KQ_0{D9l z0|7fhOb05M*Dd)seQs`#YsgOUZwLO9_q6F;v~)B2Z>;Mb=)&j=jQDIEi)bYP)+UeiP2{`6A`c1!E+FRiF!3Fb>A=cH>W5d6y13_oILx zBj}#Nm&zVMf%;?G8>!w2K0Xf~@iY8RY5_QaEDij%{dvS)Sr*3J$Z;9A$m3g0!zVO{g@T<=@b4;SG_tKLbvx6(OI>pD}>%rH8? z={-t5yoXYgV#$^GB4sTerdC;JDw(GMjCBAHThf>Cnc&nm3&25G5DF~-3!WB`!Vs4J zQODJ|#< zB+ey80#xYqVHzpB0{{_7K8?emat z*&QhI{HVDm)#_5;hjlXHSqE}0$wV6ZM~j>hXEku?!|N3k?YH81nS4?$JY-( z{6OX9YX>bGo>H?f{KcY z=%4@mC*cc^2m!8h$H}+yUK{)Y1PAcO-b(4Gz9u~X(xpoTgR|u3=F+)SN65Eg@V|;f zu`(^R>H@wXX9R2@I1RN(5t2_01MVNLMZU{i)&8WB%=1LH(gt z_C7I&;4g|i|lWz%FjyDx##H@`!f%STfF+%8l&w*!?#x1(~E>tiL#B2KBQuV;Ps zgfspl6ktWG_&<$&aRaF`?hdL{j!+ugn=&>{pzQ2yXoMWA&t1B<%M3Q&n^yyE%pBdnCKW6)PT%sGF@&6;urWZ|6lbnfH;z*XzY%mD#9NfH@)63J*OM|& z?7;It`&Ht<`}_&2T=gqL2&i1~3(El(-=X6FH%J$&=mmW5N&Z&pg}a~^suqWwjiLo` zg3x6Id<}DFwLc9^>Ov60!>-%;MxQ^Sw_p2GuX)8Ie(D-E#k0f7v;Gyr$_MzoG64>N z#p-rC1SmV#eU6H~1^7LlUj@*D11m@kswjg445kWI&nSq0pxXGK`K@|>+?^1L)w2NC z1;o%uNCY9SWpo5>c_sW0zy=tFy4>5eXwg7VMQrx~fY-!%C-6eq%l0hdfBIKTAl#Um z<(JkW;3zOWpI0+G007QEwt;d#8&7#l?jrA^LFA3;LD?H#M!Kkv|6jfdu?Pp?60uPW z_za_CfjU9{>~^Vw1+EI&>fiNd@2Byh0bKA>I$iZn&fi(e9>tx)`8_Em`2@g$m;=ZF zl2@reU-%n12-w0Z312uxu0xwCbH{YbIk~+`xZwB?Rw!RP7J?D10Vgn(i1EHdS{#A{ zl+RTx@N)PQpcMg`rQ-2$%(P z^M5F-zn2|QP6g9zu*jTF8u#l zSt`poxIu~0m#8qdAC)dtdT5c=GIq9$oh(pc*ijUyrA>|6s<65lm;t+BiN6NFSG!ky zOK!sl@H584^eJ717I>HwcmX~Hm))#^1E3ZGI>z%#){R$TAsck=2MhQgF2DrHFi=!N zs_5SQ26-3sqOt{D;Rp^vDBH!M85)rol+2C#VRZi+Ish|Z7cB92{m~ElzKe@&7{P)$ zfwzo-hXoCI7^-)-6N)&cs(6!iau;GXz%tQ2z(kyf;olD0H?sj84SE5YLE7;>l(qT^ zDv9Zg`2jl=^mL|$A+HWX4DNp;@-1Kn?1Cl!niR(NKZRbuX#~qBQ@YEJTI*`|03N0R zo?|VH1sH1acIg&7i;GoU&N%u7Xc}N%b|phJ78iLbFE<@0$AN}2o{t^N5J#o z2w((c2(F!TsANG8R3G8M>;NJZRLux{At(-IO^-SW%mOYCGyQ)sCgL`zT+3teMxDxD zHfvzITplLHongf<<`oZf0B@~$RPIoORI%lG zD)?%)5|at!IrA+*ghK#Ob_RAPBO~B-!3OEyCD>_m?M%z*sgm|bvKfzu#8O*^=W zN@LXZSlHc>7Iq1Fqo_=UfrD>Ey%%s8;I3cxyj%A&{Z~!vs-t?Cc5{Vu;+7RXOsx3+ z8mhnDqIzWj-Ur}eDkrauA4(;Q29SHl3_0wf`H~GC7nN^*nkqm0jdFkom5roJYhb^n zOKTsd%5~$Ybn8nTDF7GugVsqPIk_AuwDHH>4tM&QX99|z!JcPhZ`RUdBwU#Xfhu%ab{ zFzf-Ks!s!DL+8wX1@c(Bq`<$FFj5(Se+b~Ke?Me7gmMl%mVEIdc~0#`ClTyYBPW0k zNl#Cwk`?#i&?rrbI5gEkUZh2HqAKt0+9(Pb0?XRQ|3+IUb{z+>0K8ND!E;3!m%%sY z^3@AGj`1SS$8nr@03Q$F?^bq?VuPXNjk}Lr7gNmfp9eY)d`gvxqX9MpuWXcM_#O@c zX87y@bPAP?P+?&Q{+26*#u78wDC3(rb31C}pEz_}+Gak(NFH6Ra9eU>eVblg2DVGEMr~BiL8K3qi7gbbz31 z0qB5ZZ%57qhPBcGT>Z{MKng%+0d|7EV&yaNNawKPE#Q5K z@yi)_7=VY};{bmc0eqB!i{kF4^h29#9{ zYZk5^gHo`OY4F9Z1x8 zWbW@^0fd4+!U?eY2MTrXjPV-aKNY}(k}<{e$uRQ9|H{Ake<*=2t^b_@oPi&!z8{B2 zWflvt7N~>+*jm8%$#5!M^)O{-cxvPTcn-pncisQlpIz=Q*0Df`pbEm`IZ^b^gH3M* zmcZ110XU)aIK+RG;*=FYc(OqYaGuXjAY%UDs&xN}X2rv7QC7Kn1eGnni?Y|h;8*-F z*z*wsjz<_A0*_i2U@cG%^3r- zT^uA9C{Yfu_qFiXfTdsUVcztSJhgkYd9R;2EtEx|%dh|sWh&#?&(uH6b^r@}#AASe zNzrmq{BV{3e{PKbEXwj!KOd{R67e4n0N^(~hR14IpmNPagnT}4<%5*rx@c@R@qPom zC-;dY43OaSI_3v^UcNXK6Znpz(m9dH1Y&BF3BUnvN}t&yp<+Q7KMzrsd-R+v(1Um0 zY6KxzV35rBSp!sM0Wbg@05N&>Z^-+}16XBPZN}UjA)>&2nzEB-sIc)D2s$cWJ&H=# zjHZgUW5}mKue37(q=-JX^2=8Jn!L+LP}a)P7 z0hE5Ff{~Q+e$*OZ2~7P?0W)UzNJ16MpTik^U;$?+h^-k5APle|WES91U}*p=3^4td ztsG7{>z+5of7!VM3xL9{(eX2fDE+{CN>7?kp3nb5S&4sE!=aB+{;DyQ`{^T;y=pvp z*8i2#)&9T?cdB3IV6Fs~CyqmE3n$l%kvn!5i$;;pxtE|etznf4rcR06QJYi{_2ZxC z&g*p?-ss=aEOPp%lS~UmBM5>}l!93cp!Dn10uB~{127AeEWexFN#^+PY}m-ram*Cr z?;-4vvU$?Zllww4j50hf{2b4b4Iv}=a7L{DtncFS8Q=is0aDEru}@S7YZC_G02v=e zo&c79^#phZpm<@gEc5)IpMucA0#^6WnGwiPAO)dhfe}=^{2od_vc(wxYdSg(rvT7w z_+E~a*A#s84ARaVfp8>W{9rJf9R>#AvsSm4K%6(!IY^ztNXniO=?0dyae$_!u|13M z;{HwmW5_{<0)24^ETG8U#$(`4Ezk|7VF4C|Jm)7_Kng;;{=amPivM$Kl>g)RMczUx zNIgnft_$eZkfS)nEWl}@WC2bKEf&xfhl-aDHpYLc z$a5|nrSG>rPrmK1kazEN$~m}-GEVJ*=!4M13dZx`3=U>6J3!I-eJB%SzXBKvhL8mY zfb%j7NG)Jy0q5wL|BWJuz`#O4@q%vIfo}d3p+K3`0%jJF8G+OSKE(#!xOz9ev&S2d6s-TUZujlvnlJyMr;j(Gw?j1a0K&Sfs70fd3MgA(zu~i z0cQnM!C?gp_?EL4;7}m70GvR>0s&M9u~8&*dZfp15y)v^L3G#TfDdhy_tL`p;hblsW#(`u|rmx#DL%ZhX9|eXbm0>vNR9FPbt=??aft;HWY0XMF)D z!25CSTTZ3R*$EH^zyd=ZS^!SKEYMHK0-EBG|BWIzfNN^xVgJ)WE(Fc$l7trvlm&bu zEo2rj7Kb!ifQv(z|MR2&4{?V2KiB@*391^Gfnl4Tpu#=V$&+#jufc3kqaqWW&Hddf zD#!Nm_@Lmyx?ey>``Yf;pJ6V#{z2vLcG zQr^~oU{oDqP+1igaHfUklSY^YI4xu?05gn*B~Oa@tTv@!Jo(16Q#vhR2MCfD(9{LG zX@*9)I3)G~*en2N@Gc#y;{O>rnq}z!uT`L;(>F%403Idqq6s8N!yZ)nA(77tFp5KN z0;Qc#Cf~~Y6bsl>Ob7*FuoW6Dz{MfX2&5K>6?FkW+r?-HAAU1@HaCO(J`3Q`+wETu z_{?7p1Iz;2>YywRIT}SGBf#n@Tild3UjJf|_fAqS+C&=hd)@ez${pAY}Wi zQICUu{0H7B2&EG^M#p=zX^KO4Qt`q*|{<-BCzXw8iBy8&F z=C=js;AhqX`r?q(0yuuv8`F&n=JzJ={O(k;pgWb@TfxiK>cKy#31@{|_c`Jhy;e=LCL~1m4~q^q>vCH4N(e zR5`%P5tNaB!RP=E@rgDzfR@06%|t2)w3cJxvpViY zS1D*=fVBY3(JsdH5zYX-aBL4^C}@PYZFJUc$32OajonIrPEa*R@k;?_Mg84iJ1pySP+QR&MMdKAf>e z7uq=g=Q>H*+b2_wN*fDTsFnQ5{Z#hJugJGb8CE#}7r-;&LL*NPEVSNn1cay7L#(yaUwKt}~;n}$}A}j7_cWndhAZEq(rQ^qsV=o;-04`!c zgBx6*XAJ>Wj{lcMrCW6pU8laLv;!L`{p*#KzH=_6?U=2cBp%z$$$kDLO2CGOke>eW zI*9*B{jlmaz&pTas+Yja;t%4z4tN>=VVwU*(6_I(o)nA&A`m+oP8;3q_Tb+CPuvT@ z_F&wfCnxb4%G@=BJjcEyPil&GaKkJD&GUbJC?uQ$|2F^wQ^4?VJ}A=P!zWpM!odo+ zz6POZ0A8$mJ=ODy*V8=%ugU-4xc}yUd_+u84v8w5)BbdMbf{Rs>Jnn3Bra5C+(4>W zbw3q;{t{*Hi6+m{t;!+JvO@qMTxjRnzqK9;h2j5#$wMNIz-v}N917#+DE(To9>6`$i<(O$!)d?^?y}R4~t&&bc>Mz0&ZXdm>eC`4~>*A=t9|_jCHnz0WtumqJzt* zeA6E(Z|_{nJhF+hQ%{q(P@L`KC@%RK^BH(PDb&g;4z9D}{?c3VUge6HDILt2%j@ah zJn*3vf6M;R>_K1!%tCTpeBtbPdS6ZikSkc`S6 za&XM!!EpZ{d4z10a8a0@PWj2ZC{s0?JgzjXW&jK4;xGck_n>)ewPXL_vF((*dnQ$& zoQ#+cePU4dd`A?fdYA;>2)<$UZ~9A%r}%~uA-!dccXpJkZnOX{oNO0&M@<~@A3#e$ zxdEeq{v4q5jv}g1!xsf{!^oAMTIC2CPTBH~B%t(b?KWONp1dmcEKrj?Sk*au=i~l> zFv|HV8uuq4?-#F7`Pwm<_$8d44pzbtr&i#}l+IAS3*_2i^?Rm9xPVPa?<~$Nu;b;H ze++>G$e95vK5B+W%I0;T?3JT*@!wjdyFLQ_^B6gmEgnFb>z>!%FBs3y-|?Q^p6y@t z=sF(X<`OP%>_lNl-ZR(fijA7Eki(uan!x<dTUS~@riD2NpzJTMd`Vwn-hw6Jh?TT0)*P8e1Cw2~EYF9Uqp#fgsrK_kS@Zhix;9-FXJagVp3m$7SoNpXir?-xEO$pyz zS6Top0A?uscmSoOr0|9fF8Wxzb5+WR)eq{%_*MDRfmFEkZgQnv6!Bl&|L?n%)_B%p zW3xunrQ?14)wO3~!K3=>s(xoCg?&-iw~pnyK!YJ2u8k_48&z2rn(CmKAG90*-xtT- zMJfBYQ0n=!Q0t&}7`lj*oits6k167R-9aRC?X%kZ|3cB{efcIyE|2|`vP_K5*f9w7%^mw)zKD%diCvc6tI zX~&Z2)bS(a-SAA6qi2g2^rZA%(OSKL_+Pqa6wl$qOamEG+4Fd|M%lMDEBhc(|F#!f zyb$`^$D0M=&s7StGq@}uridM(06;J(01M&`6}Ym5QP`GUW#F=8QGYsp{17q*Xap|u zSR>nK4j^3E;2VG!^?H~&r3)SSO#LbEwb_YlA9~?u4h0Q+wfC+YIhU? zJUbVMkdycEQyRea<#b9rvW?vKIRK!3gbVjK@reC$AVZwrTSeLb3;b&8^}e9ey;=2V zeH2mB>6WY8;M$w1zivXob*rAbh~3Dj-iDka9)pndF7uyj3Eum z+_#ug4sN5I&nH0m3E*MQF)Y&vmYl>1z2W-i&WNDpPc$2eYi_3gx(fwRpf??UqxB?q zg3z#l0-^fDsM!HTO4mp3wFA`ybl#wWe`|_3g6^fVk1@ArLut@ii2GkpY&8kj8rQt; zsoz{C{`rOX+a#DpVen5Hk?msB;H3q)vrDJ1-qlTvH;X=0`%b;Aiy%288-?gRiumk~%UpwH#aGxjiJv!?FBhvHA45`Oll|8rGyTw7dYj{Ei52^!ts zy+M2B1a3G%@P|e^Xar$*W7$@x?0Ln*%tf5K2jBH!ci5!ceJ`0J??jOyF4L*_>jXE{3v#_nR) z0_+4*3+RhDyy|622Ma*ihgk5XO$k3WqI-jO^&fn*6Ey1D;_5Khhi$$MmJ`4Mw8bG! z*|tKAT5Bh6%~W5o+|Pjd#m*-^!7t9`0CyXkiIlI@OrB$C})D|g4rmtKzFYC`jFC@<2|ki zDtvnn`7a!(D< zj(@VrD7(UU4X)Ld1ir3pd_6J*RovLhY!CnoSfN1DeLY_BvY!viKlM)QjSuu}&>ppY zLwWa#a)SS{V_cKne``50Z)RkPUu+NqbBvCeN3iOR(8H?tObajk@}=gl*p%N8*W}6r z-y9Oq%f8`-yRYwgW>V`7-r2Z7ZQ%%h*9G)Noccxg>hs~`4m$o;>ovc>y>Sv$=6OjkHKR-F_z{)3^JcQ2*p;!M`eciGF;vb40 zO?SN1{6+VNZO#}N0btkT6%XKX#||9V(&p5b7jAjZPVXAyvtIG5K7e!)lz2TZ*3Ork zzm)bt*pWgNGqoC_p5^i!kGF$Zv%fFK3nk9yDKv+;38dPU$mx)&oq5B z`Q6r=)oS`)utGgr?NIfo;zeOx>(a@$TW?(bRMW8#x%Owc2A}CabYDA1z^ZACxH<8c zH}w5_LW@bMAA}u3$@E8b1_m999^=`F?}zsMt;M8QhuzTIj`5B0-v0x9a5X{$TRAtG z{m4y2zM0VC{gg>zdoUykhbWrOp`vZjg&Z6WfFm5CYNr}prDxu4y=U*M&EKCj`sShb zYQNrok5`8##{b6=Br7zuFZj>K^=sH+?bA&k-Tzw4848qLNV0A;pVTGqpX_Im0-LRzZUTZl^Wh;-3AK0jqz0&a>8p_pPx4{3$ z8NdwJ+MTl-Y*3oMb^i_h);`l@-0r_NfBnGUTSlLJyH$d6j-3}KhaGoMZIhibExagW zT12t3QqR}pT6xb-Gm-+C{5XSLw~ pej)rYYF3P7<+E&70{{R3gFPh}fDY_Dl&}B*002ovPDHLkV1i#)Y(4-0 diff --git a/share/pixmaps/bitcoin128.xpm b/share/pixmaps/bitcoin128.xpm deleted file mode 100644 index d8e41e9ea..000000000 --- a/share/pixmaps/bitcoin128.xpm +++ /dev/null @@ -1,384 +0,0 @@ -/* XPM */ -static char *bitcoin___[] = { -/* columns rows colors chars-per-pixel */ -"128 128 250 2", -" c #845415", -". c #895616", -"X c #84581E", -"o c #8D5C18", -"O c #925A15", -"+ c #925E1C", -"@ c #98621C", -"# c #9E711C", -"$ c #A36E1A", -"% c #A96F1B", -"& c #A6711C", -"* c #AC741C", -"= c #B2741E", -"- c #B37C1E", -"; c #BB7C1E", -": c #835B21", -"> c #8F6125", -", c #956727", -"< c #916B2E", -"1 c #996B2C", -"2 c #B47B23", -"3 c #BD7C20", -"4 c #A17330", -"5 c #AB7D3B", -"6 c #C17F20", -"7 c #B9831F", -"8 c #BB842B", -"9 c #BD8533", -"0 c #B68F3D", -"q c #BE8C3B", -"w c #C4801F", -"e c #FE8C03", -"r c #F38A0F", -"t c #FD8E0A", -"y c #FF910C", -"u c #F78F13", -"i c #F98F10", -"p c #F79016", -"a c #FE9314", -"s c #F6931E", -"d c #FD961B", -"f c #FE991E", -"g c #C58421", -"h c #CD8621", -"j c #C78B21", -"k c #CC8B23", -"l c #C2852B", -"z c #C08B2D", -"x c #D28722", -"c c #D38B25", -"v c #DB8E22", -"b c #D28E2C", -"n c #D49323", -"m c #DC9224", -"M c #DC9B25", -"N c #D4922D", -"B c #DF972A", -"V c #DF982E", -"C c #C18D33", -"Z c #C58E38", -"A c #CB9332", -"S c #C2933C", -"D c #CD9339", -"F c #CC9938", -"G c #D19733", -"H c #DA9230", -"J c #D59935", -"K c #DC9C33", -"L c #DC9E3B", -"P c #E49124", -"I c #EA9426", -"U c #E09D26", -"Y c #EC972B", -"T c #F79625", -"R c #F99524", -"E c #F69A26", -"W c #F89825", -"Q c #F2972B", -"! c #F59A2C", -"~ c #F89B2B", -"^ c #E79D33", -"/ c #EF9D31", -"( c #E19F3A", -") c #EF9D3A", -"_ c #F49C33", -"` c #F99E32", -"' c #F49F39", -"] c #D6A13E", -"[ c #DAA33B", -"{ c #E3A127", -"} c #E7A328", -"| c #EDA32C", -" . c #EDA829", -".. c #FFA325", -"X. c #FFAB25", -"o. c #F3A42B", -"O. c #FFA429", -"+. c #F4A929", -"@. c #FFAC2A", -"#. c #FFB227", -"$. c #FFB32C", -"%. c #FFBA2D", -"&. c #EEA830", -"*. c #F7A334", -"=. c #FAA036", -"-. c #FCAB34", -";. c #F4A13C", -":. c #F9A33B", -">. c #F4A83B", -",. c #FFA83F", -"<. c #FDB432", -"1. c #FFBB33", -"2. c #FFB73A", -"3. c #FDB93E", -"4. c #FFC12F", -"5. c #FFC432", -"6. c #FFC338", -"7. c #D2A043", -"8. c #D8A140", -"9. c #EEA144", -"0. c #E2A840", -"q. c #EDA34B", -"w. c #F4A444", -"e. c #F9A642", -"r. c #FBA945", -"t. c #F3A64B", -"y. c #F4A84E", -"u. c #FBAB4B", -"i. c #EEB041", -"p. c #FABA44", -"a. c #ECA653", -"s. c #EEAC5D", -"d. c #F3AA53", -"f. c #FAAE53", -"g. c #F2AD5A", -"h. c #FBB056", -"j. c #F6B15E", -"k. c #FBB25B", -"l. c #DDAF79", -"z. c #E3A962", -"x. c #EBAE63", -"c. c #E4AC68", -"v. c #EAAF69", -"b. c #EEB065", -"n. c #E7B06C", -"m. c #EEB36B", -"M. c #F5B263", -"N. c #FBB461", -"B. c #E6B274", -"V. c #ECB574", -"C. c #E7B57B", -"Z. c #EAB77C", -"A. c #ECB97C", -"S. c #F2B770", -"D. c #F0BB7A", -"F. c #DBB485", -"G. c #DFB888", -"H. c #E4B984", -"J. c #EDBD82", -"K. c #E5BC8B", -"L. c #EABE8A", -"P. c #F0BE82", -"I. c #E0BF96", -"U. c #EDC089", -"Y. c #F0C28B", -"T. c #E5C194", -"R. c #E9C191", -"E. c #E4C39C", -"W. c #EBC699", -"Q. c #EBC99F", -"!. c #DFC3A0", -"~. c #DDCAAF", -"^. c #CFC7BD", -"/. c #D2CBB6", -"(. c #DBC8B1", -"). c #DBCDBB", -"_. c #E2C6A4", -"`. c #E6C8A5", -"'. c #EACBA5", -"]. c #E1C7A8", -"[. c #E3CBAD", -"{. c #EACCAA", -"}. c #EED1AC", -"|. c #E1CDB3", -" X c #E3CFB8", -".X c #E6D1B6", -"XX c #EBD2B3", -"oX c #E3D1BB", -"OX c #EAD6BB", -"+X c #EBD8BF", -"@X c #D3CDC2", -"#X c #D8CDC2", -"$X c #D0CECA", -"%X c #DDD3C4", -"&X c #D3D2CC", -"*X c #DDD5CB", -"=X c #CCD3D5", -"-X c #C9D7DF", -";X c #D2D4D6", -":X c #DEDAD4", -">X c #DDDCDB", -",X c #E2D4C2", -".N b b b b N >.( C > HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX4 L _ *.@.<.$.X.X...X.X.X.X.X.X...X.@.$.<.@.*./ G , HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX< L -.@.$.X...R R R T T T T W W W W W W T T T T R R W ..X.$.@.*.J HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXD -.%.X.W R T T W W W W W W W W W W W W W W W W W W W W W W T T R W X.%.+.A HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXS -.$.X.R T T W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W T T R X.$.-.C HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXF <.@.f R T W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W T R W #.<.A HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX[ <.X.f T W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W T R X.$.K HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX0.$...R T W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W E W W W W W W W T R ..%.G HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXS 1...R T W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W E ~ ~ E W W W W W W W W W T R X.1.A HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX3.X.d T W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ E W W W W W W W W W W T R @.2.HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX7.5.f T W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ~ E W W W W W W W W W W W W T W %.z HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX3.X.s T W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W T R $.<.HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX1...R W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ E E W W W W W W W W W W W W W R ..1.HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX0 5.f T W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W T W 5.8 HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX8.$.s W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ` ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W T R %.N HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXi.#.R W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ` ` ` ` ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W R $.&.HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXp.X.R W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ` ` ` ` ` ~ ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W R @.<.HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXp.X.R W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ` ` ` ` ` ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W R @.<.HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXi.X.R W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W E ~ E ~ W R ~ ~ ~ ~ ~ ~ ` ` ` ` ` ` ` ` ` ` ~ ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W R @.| HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX] #.R W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ! s e t d ~ ` ` ` ` ` ` =.=.=.` ` ` ` ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W W R %.N HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXq %.R W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W E W E ~ ~ ~ ~ y l.=XI.x.) p a =.` ` =.=.=.=.=.=.` ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W W R %.2 HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX5 5.d W W W W W W W W W W W W W W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ~ ~ ~ t (.jXVXNXuX@XF.W ` =.:.` W =.:.=.=.` ` ` ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W W T R 5.HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX1.f T W W W W W W W W W W W W W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ~ ~ ~ R Q eXDXSXSXDXgX#Xa ` =.=.;.q.W a a R ` ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W W T W %.HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX3...T W W W W W W W W W W W W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ~ ~ ~ ~ ` a a.NXSXGXGXAXNXV.a :.:.f c.tX*XE.n.9.R ~ ` ` ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W W W T @.@.HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXD #.R W W W W W W W W W W W W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ` t H.VXSXGXGXDXmXy.f :.:.a I.hXBXCXNXiX^.' W ` ~ ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W W W R %.g HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX5.d W W W W W W W W W W W W W W W W W W W W W W W W W E ~ W ~ ~ ~ ~ ~ ~ ~ ~ ~ ` ` ` i |.CXGXGXGXCX3X~ ` :.:.R %XCXSXGXAXNX>XW ~ ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W W W R 5.HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX2.W T W W W W W W W W W W W W W W W W W W W W W W W W ~ ~ ~ s t e a W ~ ` ` ` ` ` ` W ! eXFXGXGXSXVX[.d :.:.~ w.uXFXGXGXSXVXW.a ` ` ` ` ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W W W T ..@.HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHX9 $.R W W W W W W W W W W W W W W W W W W W W W W E W ~ ~ ~ y F./.B.9.T t t a ~ =.` =.a a.hXDXGXGXSXNXA.d :.e.R v.NXSXGXGXSXNXm.a =.` ` ` ~ ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W W W R %.= HXHXHXHXHXHXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHX6.d W W W W W W W W W W W W W W W W W W W W W W E ~ ~ ~ ~ W i &XjXNXfX:X].B.q.T t a d e K.VXSXGXGXDXaXd.W e.e.d E.VXSXGXGXDXvXw.W =.` ` ` ` ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W W W W W %.HXHXHXHXHXHXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHXHXHXHXK X.T W W W W W W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ~ a ) uXDXSXFXFXCXNXfX:X_.B.q.r .XFXGXGXGXCX3X=.=.e.,.~ %XCXGXGXGXCX1XW ` =.` ` ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W W W T $.m HXHXHXHXHXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHXHXHXHX5.R W W W W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ~ ~ ~ t x.NXSXGXGXGXSXSXDXFXCXNXmX8XcXSXGXGXGXCXW.e :.e.=.t.uXFXGXGXSXVXE.d :.=.=.` ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W W W W R %.HXHXHXHXHXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHXHXHX^ X.T W W W W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ~ ~ ~ ` t T.VXSXGXGXGXGXGXGXGXSXSXFXGXGXGXGXGXGXFX}.9.' W e v.VXSXGXGXSXNXm.d :.=.=.=.` ` ` ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W W W W T @.P HXHXHXHXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHXHXHX1.R W W W W W W W W W W W W W W W W E E ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ s ;XNXAXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXSXFXNX>X|.V.XXFXGXGXGXFXbXy.~ :.:.=.=.` ` ` ` ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W W W W R %.HXHXHXHXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHXHXH X.T W W W W W W W W W W W W W W E E ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ` ` R ' $XsXNXVXFXSXSXGXGXGXGXGXGXGXGXGXGXGXGXGXGXSXFXCXCXFXSXGXGXGXCXOXa :.:.:.=.=.=.` ` ` ~ ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W W W T $.c HXHXHXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHXHX1.R W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ` ` ` ` ` ` ~ t.V.`.5XVXFXSXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXFXXFXGXGXGXGXGXGXGXSXCX{.e.P.'.2XvXNXBXDXSXGXGXGXGXGXGXGXGXGXSXDXjX~.y W =.` ` ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W W W W @.HXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHX: 1.R W W W W E ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ` ` ` ` ` ` =.=.=.=.=.:.:.:.:.:.:.:.:.e.e.e.~ s.fXDXGXGXGXGXGXGXGXSXNXD.f =.=.,.M.L.oXaXVXDXSXGXGXGXGXGXGXGXGXGXAXVX(.t ~ ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W W R %. HXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXl #.T W W W E ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ` ` ` ` ` ` =.=.=.=.:.:.:.:.:.:.:.:.:.e.e.e.e.r.W H.NXSXGXGXGXGXGXGXGXDXzXg.r.f.f.f.r.=.=.g.`.fXBXAXGXGXGXGXGXGXGXGXGXAXjXH.t =.` ` ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W W T $.6 HXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHX~ ..W W W W E ~ ~ ~ ~ ~ ~ ~ ~ ` ` ` ` ` ` =.=.=.=.=.:.:.:.:.:.:.:.e.e.e.e.e.e.e.r.W |.CXGXGXGXGXGXGXGXGXBX1X,.f.f.f.f.h.h.f.,.~ d.3XVXAXGXGXGXGXGXGXGXGXGXDXsX' f ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W W ..~ HXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHX$.R W W W W W E ~ ~ ~ ~ ~ ` ` ` ` ` ` =.=.=.=.=.=.:.:.:.:.:.:.:.e.e.e.e.e.r.r.r.,.w.>XFXGXGXGXGXGXGXGXSXNX`.=.f.h.h.h.h.f.f.f.f.=.~ ,XVXSXGXGXGXGXGXGXGXGXSXVXT.y ` ` ` ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W W R $.HXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXX %.T W W W W W E ~ ~ ~ ~ ~ ` ` ` ` =.=.=.=.=.:.:.:.:.:.:.:.:.e.e.e.e.e.e.r.r.r.u.=.x.fXDXGXGXGXGXGXGXGXSXmXA.,.h.h.h.k.k.h.f.f.f.f.:.~ 5XFXGXGXGXGXGXGXGXGXGXCX:XW ~ ` ` ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W W T $.. HXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHX8 $.T W W W W W W E ~ ~ ~ ~ ~ ` ` ` =.=.=.:.:.:.:.:.:.:.:.e.e.e.e.e.r.r.r.r.r.u.u.~ K.NXSXGXGXGXGXGXGXGXDXzXj.r.k.k.k.k.k.h.f.f.f.f.f.W V.VXSXGXGXGXGXGXGXGXGXDXuXw.f ` ` ` ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W T $.3 HXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXY ..W W W W W W W E ~ ~ ~ ~ ~ ~ ` ` ` =.=.=.:.:.:.:.:.e.e.e.e.e.e.r.r.r.r.u.u.u.u.~ |.CXGXGXGXGXGXGXGXGXBX2Xr.f.k.k.k.k.k.k.h.f.f.f.f.,.d.bXFXGXGXGXGXGXGXGXGXDXfXd.d =.` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W O.P HXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXO.W W W W W W W W W ~ ~ ~ ~ ~ ~ ` ` ` ` =.=.:.:.:.:.e.e.e.e.r.r.r.r.r.r.u.u.u.u.r.w.>XFXGXGXGXGXGXGXGXSXNX'.,.k.k.k.k.k.k.k.h.h.f.f.f.e.y.kXFXGXGXGXGXGXGXGXGXDXfXg.d =.` ` ` ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W W O.HXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHX$.R W W W W W W W W E ~ ~ ~ ~ ~ ` ` ` ` =.=.=.:.:.:.:.e.e.r.r.r.r.u.u.u.u.u.u.f.=.b.fXDXGXGXGXGXGXGXGXSXmXJ.r.k.k.k.k.k.k.k.h.h.f.f.f.:.s.mXFXGXGXGXGXGXGXGXGXDXpXy.R =.` ` ` ~ ~ ~ ~ ~ E E W W W W W W W W W W W W W W W W W $.HXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHX1.R W W W W W W W W W ~ ~ ~ ~ ~ ~ ` ` ` =.=.=.:.:.:.:.e.e.e.r.r.u.u.u.u.u.u.u.f.=.K.NXSXGXGXGXGXGXGXGXFXxXM.u.k.k.k.k.k.k.k.k.h.f.f.k.~ K.VXSXGXGXGXGXGXGXGXGXCX5X=.~ =.=.` ` ` ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W $.HXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHX+ $.T W W W W W W W W W W ~ ~ ~ ~ ~ ~ ` ` ` =.=.=.:.:.:.:.e.e.e.r.r.u.u.u.u.f.f.f.=.|.CXGXGXGXGXGXGXGXGXFXXFXGXGXGXGXGXGXGXGXFX9XA.b.u.r.r.u.u.h.h.h.u.r.O.w.:XCXSXGXGXGXGXGXGXGXGXSXhXL.a :.=.=.=.` ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W T $.* HXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXV X.T W W W W W W W W W W E ~ ~ ~ ~ ~ ~ ` ` ` =.=.=.:.:.:.:.e.e.e.r.r.u.u.u.u.f.,.b.fXFXGXGXGXGXGXGXGXGXSXFXVXpX*X[.R.V.M.g.d.d.g.b.T.pXCXSXGXGXGXGXGXGXGXGXGXDXpXe.~ :.:.=.=.` ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W T $.; HXHXHXHXHXHXHX", -"HXHXHXHXHXHXHX| O.T W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ` ` ` ` =.=.:.:.:.:.:.e.e.r.r.u.u.u.u.f.=.K.NXSXGXGXGXGXGXGXGXGXGXGXSXFXFXBXNXmXuX>X3X3XyXmXVXFXSXGXGXGXGXGXGXGXGXGXAXhXE.d :.:.:.=.=.` ` ` ` ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W T @.h HXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXc @.T W W W W W W W W W W W E ~ ~ ~ ~ ~ ~ ` ` ` ` =.:.:.:.:.:.e.e.e.r.r.u.u.u.u.=.|.BXGXGXGXGXGXGXGXGXGXGXGXGXGXGXSXSXSXFXFXFXFXFXSXSXGXGXGXGXGXGXGXGXGXGXAXNX>X~ =.e.:.:.:.=.` ` ` ` ~ ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W @.h HXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXk @.T W W W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ` ` ` =.=.:.:.:.:.e.e.e.r.r.r.u.u.r.w.>XFXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXSXZXNXeXe.~ e.:.:.:.:.=.=.=.` ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W W @.h HXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXc @.T W W W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ` ` ` =.=.=.:.:.:.:.e.e.e.r.r.u.u.=.x.fXFXGXGXGXGXGXGXGXGXGXFXFXSXSXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXFXCXfXoX:.~ r.e.:.:.:.:.:.=.` ` ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W W @.h HXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXc @.T W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ` ` ` ` =.=.:.:.:.:.:.e.e.r.r.r.u.~ K.NXSXGXGXGXGXGXGXGXSXZX6XkXmXNXBXDXAXSXGXGXGXGXGXGXGXGXGXGXGXGXGXGX0X'.S.~ =.u.e.e.e.:.:.:.:.=.=.` ` ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W @.h HXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXk @.T W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ` ` ` ` =.=.:.:.:.:.e.e.e.r.r.u.~ |.CXGXGXGXGXGXGXGXGXFX4X,.k.D.Q.,XkXmXNXDXSXSXGXGXGXGXGXGXGXGXGXGXGXXFXGXGXGXGXGXGXGXSXVX{.,.f.u.r.u.N.J.{.5XNXBXAXSXGXGXGXGXGXGXGXGXGXFXMXH.W r.u.r.e.e.e.:.:.:.:.=.=.` ` ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W W W T @.h HXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXo.O.T W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ~ ` ` ` =.=.=.:.:.:.:.e.e.e.r.O.s.fXFXGXGXGXGXGXGXGXSXmXJ.r.N.N.N.N.h.r.r.f.J.1XhXBXAXGXGXGXGXGXGXGXGXSXDXjX!.W e.u.r.e.e.e.:.:.:.:.=.=.` ` ` ` ~ ~ ~ ~ ~ E W W W W W W W W W W T @.g HXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXB X.T W W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ` ` ` =.=.:.:.:.:.:.e.e.r.W H.NXSXGXGXGXGXGXGXGXDXuXM.u.k.k.N.N.N.N.N.h.,.e.D.>XNXSXGXGXGXGXGXGXGXGXSXZXjXE.W r.r.e.e.e.:.:.:.:.=.=.=.` ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W W T $.- HXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXl @.T W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ` ` ` =.=.=.:.:.:.:.e.e.r.W |.CXGXGXGXGXGXGXGXGXBX2Xr.h.k.k.k.k.k.k.k.k.k.h.,.,.|.NXZXGXGXGXGXGXGXGXGXGXZXgXV.~ u.e.e.e.:.:.:.:.:.=.=.` ` ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W T $.% HXHXHXHXHXHXHX", -"HXHXHXHXHXHXHX@ $.T W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ~ ` ` ` ` =.=.:.:.:.:.e.:.' >XFXGXGXGXGXGXGXGXSXNX{.,.k.k.k.k.k.k.k.k.k.k.k.k.u.~ `.NXSXGXGXGXGXGXGXGXGXSXCX>X=.e.r.r.e.e.:.:.:.:.:.=.=.` ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W T $.. HXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHX%.R W W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ` ` ` ` =.=.:.:.:.:.e.~ s.fXFXGXGXGXGXGXGXGXSXNXJ.,.k.k.k.k.k.k.k.k.k.k.h.h.k.u.O.2XCXGXGXGXGXGXGXGXGXGXAXhXV.~ u.r.e.e.e.:.:.:.:.=.=.=.` ` ` ~ ~ ~ ~ ~ W W W W W W W W W W $.HXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHX$.R W W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ~ ` ` ` ` ~ :.:.:.:.e.f Z.VXSXGXGXGXGXGXGXGXDXzXM.r.k.k.k.k.k.k.k.h.h.h.h.f.f.k.=.V.NXSXGXGXGXGXGXGXGXGXSXVX`.W r.e.e.e.e.:.:.:.:.=.=.=.` ` ` ~ ~ ~ ~ ~ ~ E W W W W W W W W $.HXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXO.W W W W W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ` ` =.~ Q a a W =.=.t XCXGXGXGXGXGXGXGXGXBX2Xr.f.k.k.k.k.k.k.h.h.h.h.f.f.f.f.r.y.kXFXGXGXGXGXGXGXGXGXGXBX,X~ :.e.e.e.:.:.:.:.:.:.=.=.` ` ` ` ~ ~ ~ ~ ~ E W W W W W W W ~ ..HXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXI O.W W W W W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ` a z.-X_.B.q.! u C.NXSXGXGXGXGXGXGXGXSXNX'.=.h.h.k.k.k.h.h.f.f.f.f.f.f.f.f.r.w.5XFXGXGXGXGXGXGXGXGXGXCX2X=.:.e.:.:.:.:.:.:.:.:.=.=.=.` ` ` ` ~ ~ ~ ~ ~ E W W W W W W O.P HXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXk @.T W W W W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ~ t ).jXVXNXaX2X1XBXDXSXGXGXGXGXGXGXGXSXmXA.:.h.h.h.h.h.f.f.f.f.f.f.f.f.f.f.,.d.vXFXGXGXGXGXGXGXGXGXGXCX1X` =.:.:.:.:.:.:.=.=.=.=.=.=.` ` ` ` ~ ~ ~ ~ ~ ~ W W W W W T $.; HXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXo %.T W W W W W W W W W W W W W W W W W W W W ~ ~ ~ ` y q.fXZXSXSXFXFXFXSXSXGXGXGXGXGXGXGXGXFXxXj.r.f.h.h.h.f.f.f.f.f.f.f.f.u.u.f.W B.NXSXGXGXGXGXGXGXGXGXSXBXoXW :.:.:.:.:.:.=.=.=.=.=.` ` ` ` ` ` ~ ~ ~ ~ ~ ~ W W W W W W %. HXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHX$.R W W W W W W W W W W W W W W W W W W W E ~ ~ ~ ` e !.CXSXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXFX+Xd ,.f.h.h.h.f.f.f.f.f.f.u.u.u.f.,.T :XFXGXGXGXGXGXGXGXGXGXSXNXE.f :.:.:.:.:.=.=.=.=.` ` ` ` ` ` ~ ~ ~ ~ ~ ~ ~ ~ ~ W W W W R $.HXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHX~ ..W W W W W W W W W W W W W W W W W W W W E ~ ~ a _ aXFXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXFX7XV.s.:.=.:.,.u.f.f.f.f.u.u.u.r.~ s ~.VXSXGXGXGXGXGXGXGXGXGXAXhXV.d :.:.=.=.=.=.=.` ` ` ` ` ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ W W W W O.E HXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXg $.T W W W W W W W W W W W W W W W W W W W E ~ ~ e G.hXAXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXSXFXVXpX*X_.Z.x.t.:.` ~ ~ ~ ~ ~ ' x.*XVXSXGXGXGXGXGXGXGXGXGXGXDXuXw.W :.=.=.=.=.` ` ` ` ` ` ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ W W W W W W T $.; HXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHX %.R W W W W W W W W W W W W W W W W W W W W ~ d T qXgXBXFXSXSXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXSXFXFXBXNXaX>X,X[._.T.T.E.|.:XNXCXSXGXGXGXGXGXGXGXGXGXGXSXVX Xd =.=.=.=.` ` ` ` ` ` ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ E W W W W W W R %.HXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHX@.W W W W W W W W W W W W W W W W W W W W W ~ R ` s.H.oXkXNXNXCXFXSXSXGXGXGXGXGXGXGXGXGXGXGXGXGXGXSXSXDXFXCXCXBXVXVXBXCXFXSXSXGXGXGXGXGXGXGXGXGXGXGXAXhXm.a :.` =.` ` ` ` ` ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ W W W W W W W W W W @.HXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXx @.T W W W W W W W W W W W W W W W W W W W W ~ ~ y t a _ g.L.oXkXhXVXCXFXSXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXSXGXSXSXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXSXBX:Xf ~ ` ` ` ` ` ` ` ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ E W W W W W W W W W T $.h HXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHX%.R W W W W W W W W W W W W W W W W W W W W W ~ ~ ~ ~ d a t a ' s.R.oXnXDXSXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXZXhXg.y =.` ` ` ` ` ~ ~ ~ ~ ~ ~ ~ ~ ~ E ~ E W W W W W W W W W W R %.HXHXHXHXHXHXHXHXHXHXHX", -"HXHXHXHXHXHXHXHXHXHXHXO.~ W W W W W W W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ` ` ~ W a a d ! WS?bT0)&MN}OM(^1gC=*lV+*LH2vB+d8tUfTdg-8|gabI-Zl-{C(JfZdyK z&s;x0SeXA{urz;ppmhEHLxtYm$qZlvg8z{OQZwU+hZa6Oezp0@ao_v+u<=R8}g$#+@>f(FK`68bJeSXi+HLRuK9n7>rzb7pMbT z00L+$PaG@eJM^e=R|tHMz-zL;<5^5HOR_c_#ofC|<65wJNqAxZJ2%IHbqT1clRX11 zv$uu`JgOZ>S?f84_4EkpiD4SKmn?y{Oe-&9cUq5rHj+C6D0ysOI(?+O?M+O8z#!x8 zB>g|JyAI)G4`9b)$el;2?>K=r28>2X$-o{pHt<+7Ehk^uGn`3sf+&Po3K9>agvJW0 zn8qU8emRR%pQHZdNrH#=f-xWjok{uJ#h14a%Z_-|PuNiSb%+9t4$;mwqV(fL!e({n zi|E87#N9h6CxNirz-R!~9yfgw9SEWjV+=ZQace6yWg2NaIDdT$kqhZO%3Z=X4X_if zpV3BR49L~m`cFCv!`Aa6mwHDpVgD(VQrLH|5x;#Et8s^B=RvfH!)B1Q2|~iy?XRDLLddigC(rhGQzJ?+xIGK&zz@eZ%6&{1(sg{zmD&FEYE zSALjlo_nDu`8+66wcn`Sp3#9{mAWm9v-~AawM@J*hjA+ep-&hZuHACa{W#aGY=Ja; zCRfa7>`_Yqv1F(dS>1?r`RQgkrM)UdK4GNs0>iE4;6h(vP`+_GSIl+VZzv_O zl>*Z`L}5s%4Sr~tUk)bv&n|4CeBYQpe=R%odoee?GTH4{FL#^DrM+hHVzMGoL@6pn)r*oxm#<~hUyPOBk`ESaOW0VijX~X~k002ovPDHLk FV1j&ih5rBm diff --git a/share/pixmaps/bitcoin16.xpm b/share/pixmaps/bitcoin16.xpm deleted file mode 100644 index 40a0624ac..000000000 --- a/share/pixmaps/bitcoin16.xpm +++ /dev/null @@ -1,181 +0,0 @@ -/* XPM */ -static char *bitcoin__[] = { -/* columns rows colors chars-per-pixel */ -"16 16 159 2", -" c #CA7C1E", -". c #CB7D1E", -"X c #D1811E", -"o c #D0801F", -"O c #D1801F", -"+ c #D3821F", -"@ c #D7831F", -"# c #EE8D18", -"$ c #F4931F", -"% c #D78625", -"& c #D88520", -"* c #D98521", -"= c #D98620", -"- c #D78B2D", -"; c #DF8D2A", -": c #DF8F2F", -"> c #DF943B", -", c #D8913C", -"< c #D8923E", -"1 c #DF953E", -"2 c #E28B23", -"3 c #E38B23", -"4 c #EA9023", -"5 c #EB9023", -"6 c #ED9122", -"7 c #ED9123", -"8 c #EE9123", -"9 c #EE9223", -"0 c #F39421", -"q c #F19423", -"w c #F39523", -"e c #F79521", -"r c #F59422", -"t c #F49623", -"y c #F69622", -"u c #F79623", -"i c #F09324", -"p c #F19424", -"a c #F19525", -"s c #F49624", -"d c #F59625", -"f c #F49725", -"g c #F79624", -"h c #F79724", -"j c #F69725", -"k c #F79725", -"l c #F69726", -"z c #F79726", -"x c #F89621", -"c c #F89722", -"v c #F89723", -"b c #F89724", -"n c #F89824", -"m c #F89825", -"M c #F99825", -"N c #F89925", -"B c #F89926", -"V c #F89927", -"C c #F99927", -"Z c #F0972E", -"A c #F7992A", -"S c #F79A2B", -"D c #F79B2C", -"F c #F69A2D", -"G c #F79D2F", -"H c #F89929", -"J c #F89A28", -"K c #F89A29", -"L c #F99A29", -"P c #F99B29", -"I c #F89A2A", -"U c #F89A2B", -"Y c #F99B2B", -"T c #F89B2C", -"R c #F89C2C", -"E c #F99C2D", -"W c #F99C2E", -"Q c #F89D2E", -"! c #F99D2F", -"~ c #E29335", -"^ c #E49639", -"/ c #E2983F", -"( c #F79F35", -") c #F99E31", -"_ c #F89E32", -"` c #F99E32", -"' c #F9A033", -"] c #F9A035", -"[ c #F9A135", -"{ c #F9A036", -"} c #F9A136", -"| c #F9A137", -" . c #F3A03F", -".. c #F7A43F", -"X. c #F8A139", -"o. c #F9A23A", -"O. c #FAA33B", -"+. c #FAA43E", -"@. c #FAA43F", -"#. c #EF9F41", -"$. c #EEA244", -"%. c #ECA34B", -"&. c #F8A440", -"*. c #F9A541", -"=. c #F9A644", -"-. c #F9A947", -";. c #F0A349", -":. c #F5A648", -">. c #F1A74E", -",. c #F7AA4F", -"<. c #E4A458", -"1. c #E4A55B", -"2. c #E8A95E", -"3. c #F2A950", -"4. c #F4AA52", -"5. c #FBAF55", -"6. c #E4A860", -"7. c #EAAC63", -"8. c #EBAF68", -"9. c #F2AF61", -"0. c #EBB16C", -"q. c #F6B568", -"w. c #E3AF71", -"e. c #EBBE89", -"r. c #E0BC93", -"t. c #E3C199", -"y. c #E6C59D", -"u. c #EAC89E", -"i. c #E7C8A2", -"p. c #EACBA6", -"a. c #EBCFAF", -"s. c #F1CCA0", -"d. c #E7CEB1", -"f. c #ECD1B0", -"g. c #E5D2BB", -"h. c #E8D2B8", -"j. c #DFDFDF", -"k. c #E7D5C1", -"l. c #E7D7C4", -"z. c #E5D7C7", -"x. c #E7DACB", -"c. c #EADAC8", -"v. c #E9DCCC", -"b. c #EDDFCE", -"n. c #E5DDD3", -"m. c #E4DFD9", -"M. c #ECE0D1", -"N. c #E4E1DD", -"B. c #EDE3D8", -"V. c #EAE4DD", -"C. c #ECE5DC", -"Z. c #E2E2E2", -"A. c #E5E2E0", -"S. c #E4E4E4", -"D. c #E7E7E7", -"F. c #EAEAE9", -"G. c gray92", -"H. c #EEEEEE", -"J. c None", -/* pixels */ -"J.J.J.J.J.J.J.1 > J.J.J.J.J.J.J.", -"J.J.J.J.J./ ..| ' ( ~ J.J.J.J.J.", -"J.J.J.< *.{ V $ r U W _ - J.J.J.", -"J.J., o.J 0 # <.w.$.F N H % J.J.", -"J.J.o.T e 1.r.k.x.t.S z B u J.J.", -"J.^ [ Y ! #.z.H.M.n.0.d n m 2 J.", -"J.X.) | =. .h.B.5.f.j.;.v B d J.", -": Q M ` &.>.A.V.p.c.l.4.E n d = ", -"; I b A Z 2.D.s.u.F.a.-.} C w & ", -"J.l g y 6.m.G.q.3.b.Z.,.] D 8 J.", -"J.3 k c %.d.C.v.N.S.y.@.L a * J.", -"J.J.j z x 8.i.g.e.9.+.W t 6 J.J.", -"J.J.+ s h G :.7.O.R B s 7 . J.J.", -"J.J.J.O i f P L K d p 5 J.J.J.", -"J.J.J.J.J.@ 9 q i 4 + J.J.J.J.J.", -"J.J.J.J.J.J.J.X o J.J.J.J.J.J.J." -}; diff --git a/share/pixmaps/bitcoin256.png b/share/pixmaps/bitcoin256.png deleted file mode 100644 index 1d42116ef1199d86749d17f1740121a659262f4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28182 zcmafZ^;^{6^Y&|(T3EV4V(FHUHyul-v>-?~0s_*#lv2`2vxuM|-Q6IegoK2Yba%(@ z*U$40Jm;5lewb^nIdkTknS1UNqobulfJci5004oSs-hkMfc_mp00jHrX8N|o9spdI z)D-0m{LBx`oZVl{P?$R-2MIu69j10n&>k85#1-@+x`f6#tL9SNq}0pgM8&(rP1&H# zL}~A)QD4`fOu~C4zLEJwjR}dtx5$hlm|J{GQqo4}n2qRlZXWNPbfDHTFg!Xc^Nca@ z_`ow%aHXlU;rH@&c!==-XW`NMy(~Z$V#o_h-JuE2LpT^rI}$=w6rhOjJs9h_1SNh% zM0z_duPbSZS_B*&K@*W*b@R)v2(=(vq3w?}UcAE4Bdd`Xyd!OHH!Sds4Wk6| zrc{(($DAm$&JV00GlTbjaeUYbwD#xs)J!B5`IbY_$9M6g#}gF9!P<;uX@*wxZ?~sw zy92j&BswzGd#TjBZmQW)@gPf{c;a^y<#h~4nt{#5f}0g9x*2AVRhJEAZf5mgUXV-0 zT$rbEa?*i^J}X<{A=stEN^!M3L5(Nxo_$YXT)r;~=_tpQCKD5}@>A&Xl&`(7q?TR{ zf%}0Hw-nF%pyYQ^@!j%E^6!A3%(`&0Ntr*>nHRIu2cAY1C6yL}`@5l`&o?rZ{}cPv z-4BN%*gGXA$%cztJpL5hyferb+KIP%RM+Cy=q|b(c;Ok*N*c`ii z6jL|9NjY$ZP12$~kr&cSV+rl9k4Uq!`2KR48C!$0s@xx4IVroM~#U;Our zvSzl_7?s-bcb?}$6KSRo*E*Lh@tU26m|z_lAm)yhh6qYpX1i*z9K2p$(2}xBqi3?p z*MSl#eVy8cf#6vkb|hk&02joJ_jA4qN>vs>wxTY`xW8W_&CRjXMZ_@r9FgE7`&X`= z?9#9X`s7y9!U9!m;&>6;o<-xSNVl%G)}yMreAMeaR_r&5vE5Eme*aU)(kZb3#v{G zVst;pzLoaXlUOK2aK?qP0;jpGMsWG0&EHLbu6uuU1=){!GFDYNV*)Da3`2(sAU?nZ zNFR{)46P^by65SVK3^btEO&mMzel9S&Dxn0JACNfZ^TRf6h_F|3NhTl!-txx9?YBW z^S5uEe%m&5ed9>F!J#@Je~4WV6kt-ERxCE(#f)UJ+#7cZ_v+_}4*2xE>}K|!MYYtCi-sTM6%9Kd^F z07~Mh0o|kDk8oI7@tj>WDicj5R((?t=Y>}dO+u1zj=K$HBwC2A&!M*XcGz9rbI$AU zTWhOimgCOatf67&5OWW$AALRI+~l!k!??cd41SIWx!Oo9gi9pL3GM(7cn*uVOAfX+ zE`@%Nan!kXgLB6&q~ERfuHQHH!rLTPMJ32Y6+e+5#T2WpA%gtv!PldZMTzO?MaH<) z<~RF1v9rVb{RjcMr@AG%;BDzw?SAe0Zu2Y40qsgj--+|3PrG97*$9U#P%{_(9(}DkM{JJEG|Jo21d9MQc67zX=k6;a^s6UAWz&NeJh)!6dCbyb|29w?sg+Y9nKF@1BNA_@5f;5-nU40HS7I z>vL6jXoS99&!*k|iI|;_i+E{^C3`Dhh|BZbD#zVOd)iInhq zc8{4S<486kPvqQVE(GbrufX28K#!fzXdR=7dGLDSo_7kwYmX2_iFPO?#Zp3 z!58VmvOdqgwDx1YK&xF~2nTVc&Dbw|HlZzm{p@M7c>cwq1+f7moppE5+ht>9mS8Zd zm8eu~u0;umi+qT=KFZM(_b^yf8`|PU%K$3%H^QecC<4+slUy^R5Jo zoV2r#fX(bW|$(fUaFqxliM;(GyF(aP<*vR8ZakA|f z9l!pkiSHK6P+G$EJ1)kF7RfE!*}jxTP1W7Ue9mwUj7HKN8TPy@1%rNyW!lS_3Dw@D z!4?D|CFoRt*CP1G8%ftUGe7c-F{{s$ky_Wmmvi;|35SWEe-?twzd%zgf}=T5cTW#l zGVpxf>S|L`q{Rl4^oHAB^@&CTmT%PCA&Ll za8SYJVW}oe;Iq~UCBPU0lzbCB60>_V6Ng7~f_K{wqvXAvX_T$84jI_wAQWWSiA_c_ z2WTc#4bATgBz)tHt`K|`fDY}N!J)wM7h{fzP;`G91HzSKpa&5~{Vo6HNY*m$Q~iWv zspE=Y9#bgR3l4?Tt$lm^aU|<|N5gWU(#CMBo4sYW7}r&-(kLVJbz5(Q*hRlAF*Zcc z6xUUj!}#wssN2w7hnAQhocqIqd!a`Qh`6nNj{14dxLD2F$XWBLjy5x73?DrrAvaN+;FsOo_s_!=38D5{Vj;h$K^omoDJH>Y|E*1#vWRDb2s$-VLi)L^z$@ZGT1bvU;I82(Y#RG&nroNK{GfO!4|7-r53 zAt6pgPfTucd9KWv^Thx&82^xi?U{-a3i+IN0ew6FIfLenr?KAe_j1V1Yz98P(J+zo=@nBC%M(okVKm<$IEWO9Ma>J4e9|z9Xn$h%tP~ z;#__c+A%t9>rTr=40Lf0Be!>@4ScXRJ~y{0N#sS^?z-Qg(p0)@%jtTQ`nS8YeE<;y zjIviaTg#W0?7mpxmdrSRYI~|R5K4>SqK3UT(55PbE>035=4r`;#ZTygm*qo^)k@St z{pHo_N_o!nJkSuOi7qj;ehoSF>2BAl37_vggg!|&m8DC6@v!~DZI??%Wor>5(o0`j zIH8#?Ma2Tz=o;aqmo}a}aUFajMPxb)TCOIj?xZabe)1{sE!l;t8-_h~FP7@Ycppl` zI%#FI;6@T$f8?j*(0y*H-*G#H+f*59AO>nxdI?jK`&=Cxl6KACabG@C6A|yfCKF1M z%!uX4y`cK*R`y$kD6B+=L+dzdKz7grCcP#kaECvR3nvUCBZgpx3H}CSG@D^-U9)^@ zaS;}a37Kd*Vp;tO#=MP_(>Y?rga>f^?tp<1amlD+oS6aT1^%KGN-7R4nhUxwg;5p#kx7I5OWpuJC2hiMpH#F6DzoDNiuX}>y?Bd?9u_xsaxveJ3IS86=l1ZKPP zf7HhU`U)G4Q5S(eAyALN(yYO#<>5i{fpXh3=%%5s_#=%?Y#?WHScBlf30R<>OaC?H z@?$Yu_eBARP2S)~?$t=5?hUwtz>czOF3obHkw_OoTo12Fj9l50T-(eJNI|p_9}?9~ z;J@=B%=(toZx9)Vg{2O{6et*(eY0}G2T%}TioB(it4?mW_;D3@wbF5j!jt%Omj6iQ zMI>t$^OvNKmDRsJ@<8f8_U)@@?~QAqFc?LCUPM+}=?C?Fn!%~(zl8p7 z3hx%SY^wa4^XAc_zn3zXJ+n|%iHflz(>uip|{FkzE27s+AytXY1UE??!vXNWrHy&QW6pA44+nu#MMpWafH z7+}0>Dm1AmG%Wip)j?%H_@O#uIcn#Q|Fi!?2(S5-pfKffn6fv=0&YNB&lfJ$hd-kD zyoCdqt(W_QJ*QZzDvmn652`_bLQw-tZXlhHuoLYe@WlP?WB+MX*1iwX<9_b7DF5p3 zCGPR`>+-o|qi}GKhaEKzex-aO#fn_ib6i^?U~bSnluII*O}^rmnrKw#RRkGLk%*j0 z7UuWH%OD(a$h1z?tg%kka+Kwunio+p;82N@GM70MZ?C`Zt4>#=R?j3XDIR)P`T;vL zo_q^@f~(Vtxy2N60pBgV-+J8#26{i#g2UwmAG=VWG`g%@B#WB8|DJ|4y$Wo<+sh^- z$H!}3ANL3%?*ZD!2wVGm3CA(|Jl}3-;Ejh1KM&NCJV(QS+7#QQa4Dz2^2MU{ioXL% zxELU4)#Xvo4mf+th^0K?1V(5a-!H+(LXg6~6L6eQFGVZ>lJ8eQpBwpxP{93(OW* zpAf?!$|>m&Z_jC9kSz4}+RmPy)DKve6l-3rP+_+Um6>Y3lDI3#iU6hpMCU3;nAVY) zvz`1`brp9mcaD=Ls2is(bCVT(><^3fDkI zc?A(klKsb}NJSm3TzgXZ93Vaqp3P9yqX+uuzH%@-ZDWjJM=LalNhOZ2c+KBzD8B;r zDEnSK9#q_Sf}iklp;xbuXVZ;zgPfM1xv_VDX%VxVUE!g(?FXM^LqW`(Vz^xTTh-YA zBDKrnwxXd#gaK#h?1(=T`ksocXhv{i$H(yCfRhF9+j-4$5FI8ILFYqBVKjd^+H&)e zpO~AN8E)O_zx|Q_G7%471}jNFNImqnMYJoho|I8(5>(E4On>sSlcDVW+a;10P*^OV zNgm{|BtlCvF5Q=eBkPQY7*}T8&HW?5)47JP*dwJ~u4IB7UqicPqGzelAX_j{+Wn@_ zP%RP7v5rHMR#v`&|5RS_^F)1|$@;H{VA~fer5HkdVD4oOVw;nwQaCPI`prApyUiuh zY8e;BaGh%NTnnw^4%EcY{uh$pEa0SJDOcS&C=`9DQ{G2k6bVS=sL*&moa$)@PSs&6 zM%*(ud9u%rN`fYb*b=%px}wU~TsWA9Vh|*vo)Ayt*0b~j$#^~yS~fy&zjRStg;j2R z0F6t7-u87?uR>`xoJ(mgPS@SX$3c=X!09r{zaLc@oZRIQkJ231A3F_raF|6cA4wy_ z3BFzNpzjmSJ*sMSV^XdVU+!o*PO|P$iuBZjo32e$o+I0n~t5u69VB% z6ff=l5!_~v+Jpwy&y`(4XmV&cE+6e0oA#0gtfn0ht6VJMXssQVh^gG%jxH0I<5JZVV$oy9WEvHsLeF0F^SJ|?}c}-&d?Fb;*}Trnx2ek zQ9{iAXm_EZbuyY!5yTzV|T>4n0Hs7B8!JH&1^%jDtg z1DS;-ZFN3Pcuzne3cZoPE=mwJTwG0(L>Rm4#)`B(jk>tlhFVF^K9gPF@Np!x_X@Mw zAcRD^Q_^F|`=it`v!dKbmmHA~wAq743O3jGHDW$A*-jJ{od4>oQrnU;xso&wQ=W8g z)M_MF0S~7}CU4<%0HuHsYCODHRhbekTfo(&&Og^$Qjd(-6}fp&f$$y+3Fo9s$%}a~ zOOyK8y{Zc$dq-WtJ{xqu%`Y)FQe_OHV#b2lHmsa>uppxj!&AlpF;skE`@?`UXlIty zNTgD`^Eq$IZXX?42CfhmeDyOP#O7JaPYaOej?bLv()-`9I^SK@tjIgB96G+~WH_7@ zCgld{--}~caed>S8S{isa!uF&paax1*3dSAV~OamX1KYNJthYV&3Yb5AL%w^2{Uz; zODH0r5E;zjaY7wd3-p1|5&np71)}!bF;XRc+s_|z=lR9kn`qvTMddlYHkd#>v#7BJ zb$4r7j8OQ`CyyJm3furay6<9I80;YYofJI{U4)Al1emf{Z6ycI`JsaExGOTP_W7ku;a z)2*H`%m-J8ncS&g3T%F%2kz~*hX@Us3sD7GO9z8`0zA;@^C&V#{7Jt^7vD#oM=z}^ zGpa8o^$^zQ6X&;Vq0e2zi#ln9YhP$2Sy?HW;1UZjbnETxtQ+Z&hjdK`6I_g}e4cu< z)fw3wH>Y=Gp!lW-@o@{PX9{u3)gQHhJT0&?i{v4A`;9TRs%VCsI; z&9N;s87&$LDM}u^9bpDCUm(YoUMB6vm;|^QI2>~IJrummK~Dz`oN zl^r~)>sGbDOpZ~lpA)1;jYcxz;9#rD@ZXhr-Lq&!}4 z<7ixk9#AHJ(@EEZx(1Ab@t4Rf6!-t7T*hXyik4Kz7mbBv1FFy2oS%-sKW|c%=($N@ zGXsk9phrVm8nzbo9kG~eweH{Et^xyMJgZ-WNy6m50AUxX<7~cANaK$Pso6l6#zv*U zT=~LEq-<;{f0XCdhdA)YLzjVqudVj6lp5)C0|CpwiFlBsb{O8M&WaTsg!}=&;jf^9 zs9C)G>~n$lvX}ussKOZifu7Sg-BJQ7xJsvmiP$?*13EO7y;NL&Ad>?DX+#<2yL4ys z?N!THARLh_i^<6doJ8ZS0O4Lmqc;wcWZ7YzeWzJX z+;l}-(D4jdDCRQs>GxPnebbbq<};RJb`1_2`}(2< z;Q^(7!K~TN`6KRybebjH6n7`z*4=xS%^>NeK3}9|Df5WK*>z(!H>K^saE%YVoa5#Mx+TI8{A;kB z!0NLf*Cl@k7Cb{ie}Zs5rhoF#)3`uYLWz{#I3wcc=QTH8Fwvp*TsSreR~qX`;m=2C!=q zPenBA*s6WI{ObDH|3^=*5VD>O>#&} zH03g85|&;LWAfIvQ+&ar5O-YS=a9R5>X1!2%wJ_YAK9(?tQe8o=ON&*v={f(FDLiN z4-TyQ&pAjE59B9ZBeMB>lq=X=38`hh_rBw4)iS`x2v2ivk4nmkSOH)&snNUi;_z5z zK?(!0q1ht`AmH8MiK90mE8t>AHuO*~_?v(uOE6&H zafp{S=I3@2Lw!G#;HhI>kr!P`75m~n}b%n2DxNZ-3by0m?UPmu4!MKvMJ%FK`=og_O{(a*D^RyeCw+%yVA^K zDMO@Wk>P}3)4|m{So|nBa5-kcC42%UIiXCT+ZNW(t~$H}e*;)+Qg~uqr0-t_n_#^ABi zjT%BlclQ#4$VWtWgRy7gn*zLK*!UQT8bZ=>tZf_k$ z7QvRAUFYwj=3}^*@pCW`=+9iGP3qbm_J(ww!;8A#Q;l_lgO-<6l*dT~l>fVYRDZK- z%z_PGy&w}J_vSKs;Q=VTckfmY0{O6O(lo5Je4|)`NHfs4(BCP z#5Xi188xQrsk5w%XPpaeD@X>AzRa*2^xC9{m5HGZur3epUYA>dF=8ApV?UbyuT+ks`|ry?#kDP$S)oD+eN zCoq7O7&@z7brO9g3dI)u)^TFRT_$jADu%1HTTKc~I&Q9B5kCWbG^37FLJ%{Phyo;G zH_>vlt51=p(NA2Q7*@kb+0zY|0iFH>tx#j>@E-FKfp9~{1RDjpd!`k++fue9xgOKp4N)m3GJR+SxWrG(G@YN5&GfcLVrhCyX`;`2anfe zNuJ$}GaJ^IHOZV*4|p2=o&L{4UX)I0(us+p;mIVwWqb-OEhgjs$A~U1uPoeBz~oce zQF};0BeD)NB7_nM-uV)h$uVegKpDHnKa1Hf&5zDW z|4(|a``Fvu<(f$1IoaGuqF%h|zLM%;c^LalM87<3Lw`zy3)Nk9D5)lV8DtVUW@;(5{2fhXUM9@w_| zQsl9)JH4qlEn~=i^KygU8&V5H$YFDWFMI&tEG;lVlP_H*upK3T8V}i}`MWzF%N~m!_L5ht!-{1U%P6}BPPvpMahJt_G;i!Mkao-z~ zR#pEj4QP-=GxHHmt>4EFiVCa_hlPPCzehAVe0>Cm6=)C3_5>!5KTkB+Rj(a;z)?N% zNEEL+zG*KU|KQo?P($+`f0rvLw+KyYeZ;W(_vYmN1)W*a?}*v#RnN8lZ}wUJ^3%$zV3V)1|w_4 zen^m)C01pW17VIRr1~8$@MFkfkvG91@F-RdjJKAn^Si+&Z?G%9sr7UI;?euxZ`zPe z;&h8vK(Qv)(7sE}m)VOKR9jul0hEjeQ#pzYd^F9@dyuD1sZWf>*&i_VJ}vz^oW8>c zu>5AsEF!UA3^){cjw$6ZGj{yf_=<9^T;gI-t6TjXw^L3pTPncD1~%LSG-B*Ej;Uib z=o8u8@j_hu4|u4@^gfPDaq!RtZ~okV_332+=HDUv+|~#E4luX+JYR`7^y;hKz9B-4 zUVxSuMj-Qc{lYt&#a)3DI8T=LY#`Gh6Tnl{Ue4@d$m3LmA*N0G6VQQy_qR&N6R-CEsr;kW$5v(or(lf- z$utobE{n6#$G4w+&AjiS(hdGwC5-d;mQ_e_!ar>FB45&yn}r6}qGx6N#|nQZS5nzO z5K0({`Q7r{o62LO!PNrB2Q=!>^2dzNL;NxrDz!($+^E1elgJp zxhtR|xm}2%2_C&+#;jG$1Zj%#{=>GVpp+PlMQ?|h2Mev8Qjt(j$Lv5ipQMj5^=bIy z&Dvz5%Y07OYo+MO(!s8n=G$-em_^!_Gq5DJm-GW!OUK8?!iwQq+}k08b+V$CNk0+l znPcd&`>kvL2VmbBwCFzEAH(3LNdZ_2>J68=r+o~gBOFDn)?Qz%(W2Jf)^MravMVJ= z=t7)O`{P5N(W;SkJ{xYYn2Uy#-OQ$mP*vJHPUwkZ+O`RnSC)n7u#5EQ1W83eG9-d{ zW)?+Rx6(!AbYA?z1cYh@f81J3gmDt}!A_@BPhy+ohE_!h?ZBFm>w$Z-E(olGL{v6C zA3ex8bdyn>4W~X2Ss$TK-xpUd2I4q9c@#n&rR7HUw(8`nlz!rDsi*8eR*l05E90?@ z0wcGX*JsjL3l^rcPtcm2y9Em&?>d4$QAIp0KBP7^cYI#jz8=G*)ccqSHtKnO^Znld?d-{}COVCssjA7Z&1 z=pyte-p{S!dNc>TOzGUy-7peYVj`8nj<3_Ak8)W>_Z^Q@ON| z$YkZg>=4%OEQ%N0P4T1qX5lyDp`gS!YSoxZ0}fLQVQKne$=M^%`Si%_|8_O3qYoV{ z0}KdWzX6LQBfs77aJZ3J^6Ahj-`ufKk1=DaD_Z_%00+zYdWmYfg0V|EF-e0#xb9IF z`GlV~xHuT2-+jWKNoou|+Zu%iP!rpC@FGqsGPLQjlULCUOm<TXL|hib>mme--}0J)e!~)z zr^Dr(5xkfVm0NJVD(kDk12;+#yvm|{-n-!^C^+C`cZ`O=0=^gB)F>zzRUoknI6zs4 zQ|T-P(^U@vnBCe0(RAcVWxswH-3I;*k>URJo`US{#k)cX>sO24=Waz5mhrsY+yLnG zT669m$)#q8FI-!#{2(h|e7;Cp_~j|>CvZ`Ojkm4Q-!{N7M5z2S<-IyT`gs>;ckOSu zR6D)uFv#swSV`exK6YW@pMJPK4mKc?7?lADHVtL$c9a&wJUd45oCmX1061W45vhA@ z2!p_JM@0z1H3TCUBG{I3}hbIZxj;n9su0{R+>zGlA=M!di~c^ zA~|w~QkKEDPypM7x!wd+u zXW~9s7ATah&7}n8@!(ymh9`@obO5Cy(d!%85$7N1oJ5curxY)9%3r54*W7g2(|s?* z5F(s(!VDA9$=!vi6iERTiA1vD%nP+$5PW|e?N-Fq1Pm}-Zs%S(Y=bfzz5vP^V2PU0 zAh$8}xPvmt>18nnctzd%gK!DUrvD`WGxsDds?4b;4isX9|Uu+2OY3kS?p%4O7NzJ}&&gUm1C=3MVSKldN(k3`$)xibdfuH6+9zmx60O zlk_&#f{v@UyiBC zZ7in7&q!SCzE#%VT_E_ue*sGy`>f_cDGt>!CD_O zgUfPsSf@~`+k5ZEGutG#VVJ~_Q{8Z8PU@78VWjrt-k1RdAY{I?(P}O_RZghWcjf`9 zbahi@zl;|4Xf-J*@d7U?LG>cSLf&(MS}bh5?$s$rzd31%i>G4ntA_Kcx^Y!rXND~p znujn_6H`}W|C!|>n@}yyh;R+TDX@50Tp6eHvSmhn&O%#1{|u5yq7L~k4Q26_36*s3 zG%ChaOq)d~9;H2WxnaO-Z)EXJZ?vnTFLj_!M9*oV#_sG^D0b(Mu$ zquiP)?#|3o)o|TnU%kwl{&#6a*dRT9S_)d*$So z;8p!1bx=%!h@PSG1Sab6Z(06?7DxJR6v~{0E;*ZjFb7W#bqsC}X+%+x2>&9@^9?cI z_WTPxk0IuuToP0EJ-)9kq{juaE?mFMvEAR#Cs;5+4GG`|7aqj1#^FUi1XsEkbxeH< zJZ#T={Q^6lriYH+gW9*}etwy-B>hM4+~I?ZT;^IEEH}h?IOT9D_Ey1X{hVr_2wg(t zzf$jMWU)gAG)Qa-yE{)qX;`X|w_Wgia?Y555j9pET_pz7)Q>q3y?B73uJVUbK z#vEd;V;f+|w&BC`nO)_E?<}hyRQV0w!c;18Fse>n+mHC6MPX-H%)-JxKYrElmFMh# zgm^hx`4LuIZ|^@LnAk;VYOz`WXA?zrUz=#{2ZZ^{;7%ba7<=zvs^5B<W>DryN_f>?KH4U=nVaaQerLF&nmPBOjD!K8tF*))Q+G&^O!G(djuJ#8J>)dBI6{kNvqn6vi2>_sDf}ijvCv~zrN-}< z_9wyM|7g=)9a-&!KVw$-;2e$_JE`n=Eks+#ajFLZzdn%tn;*nlD|&=$Ny>kok^lTl zu1#Y{(=_~uf)VEmZTq`72ZR_!zc@ze-KMhk?3Ar|SB%Q3H+*HN-5|o1uq6LlVvlv= z@HrTS9r?GGW|Prelw;MMEt531(Zp)t{1s@=jxWXu63@m?Li&VIe)h_Tjaj0oN=lGQ=9`=1m zPWYSTFI9ENxjIrDN5$z>LzfA4ZpRtQiDfVP!j2~9);)byqEPD1`NyoYXMg}&*5Zfq z=0o{Iw3f}zW!LDdp09>R0WDjx5z`?(ov^ylQJ0sjmPM35&t@<8{y`dCn@59?JW@Xj z{Vrw9cbMxz;KJG@_(C8n1?-U4KqI1SU!YhN{(N{VMrb{-ULZ@wQ1p$)*jCl-e#h-Y z`tA}ZpDFYpnB(A+WI*>s%bC6-qd1Sz1Kz@W*$_jSu&ZAy@a?&!=)@p8F~29h^lr-D zZ(m(K4H5N3|0|Ak4lB;_7{059~Z#=DeI*^6tV1gRq&~>HYJ}5 zm~2N$I8b%>Ue~QX8%30>oggR#?^UwDN2^?2B%<#JU4}gtX<^l>I!VmO-p8J~7U2uG z-*2I9GUIe}7t_ZWK3r&|YL*<=>!#?vAo!DHo_C-2+zqs!1lz!2*wZ>e@vUH!nzuv zK~TpEi=!Y4yjlp1TpTc#7!Rqdoe~$@>U3`50R>h(K!aU+VV@9w1c;5so=X!>nUcGAXg)Nlx3HbS+d{-qgtA^z-fb5&a{{*$b zH_Q?R64At5g63^O34*hLx$q7XVoo(P*>y7_aT4mu6U{k?j?K}f{CAfMbllT8_5~}7^j3UfK5L}B=9-d}DZfVIMC zN?&Yb|2o5XSBZJ>pAnFd_N=^1h03eU`!AwAoZ$H;r3tFcG%Mzb42bsiOxCPU0;FH>v~c|(swlafApAUO!9Z95_k-lcPg&qh8iU{_$bzHzHSxo|$_fHppt=V2g52EUbtnOO|b)G^N$HDvW)YxjN;hRsm>M-Bs zbLQCDzwodpPzR}M9Y9DNQx8Iym`aF%zmi=-&Z_pumqZ~x0)&tn9)C42Qm%7N|&F$*@TA?}LyYtNE6LJ@u1VQi& zFGSr5mL4}Bc5QWg6&mp~MHGh)Kj%t83c_lGKGXT0;bf)2KrrzPY8MIr*HILaLsVl7 z`}dNb1L_sdE?WGGDM&RrTV&{)d$Ke|h7{QBJkE49pj+_xE;YOzwGwb2iWrlnR4((j zx8fX@ox>GkxsK^3ZYQmFCcWQ(yUpClAM)g0OExlVUIotcHGmuJTp@$DzzOYI#xmb& zZCal+V~qIk#hfrU*X_N_jf1wGWxaXW8cjY`f#SJXozC3A$*b5@kWd^1Fk>O>hDyY| z>S1S)fKK%2C5f=ih4>K#7#4hor`=*qdbua8YEt;z8Cs#A*kB8y$D4-0kQU>)@lRZF zdAUF4<#O){e^;_-^2#Q5eCM?{p& zbgPQvsdQWihwS^|TQ`=3>>f2SKep~n;Ga2X^o(IYti@iwv#~CjW=EBaI`d2Ylw^K? z7>31y)!O~;sWHpTU1YKV(Rw&lilvF3!EKFR=0{l{QHxpnzl~L z2L+G{;Zu#^htQW-p?t>w>JRh5u2OhjI58Mw?fCte+NS{A4N~G*MZ3KQ;Cq?yt^?~?W0dL{gA|2N>OFTr4+N zWwAaSV$NeK1_cHFg{~4mGij;5SRgC1N#Y;YTzxy2ukHErFti}o!d>JrkD--FdbC&=4zdsE~_f<^!=UR zm;a5&=ebA4IH``$i*9?|5|RG|?vc?&k1OKo5x--s*g+2|d-|ZG>Zbv8I;yREcyyY- z5`LuBtPe$$@IESX0#0}?rnuy!hn+Y+XV|d)YQJEBH^2_H>kXtd#dRsHG5n+6SZYb` z8Mj{dXb(kGc0Kf^Llq2x6n@l9+y{H>T`5cDa-AUvPJx&zlHBEP6WFQ4n<PNtoKy%N%FfQTh*>J$~_KW&(teBMWCT)am8Ida}}nd2gDT#l=;d z0ifYJ0l5-zYm!*ZF_Yrs{1y@;(G5t9Kqn=YIw*-k5PSorI^Ysa9siIW7EVeYSfS!iH05}@rl;*+@A0-x` ze|3^OKa6x5iiRQtMH#56!aV=ql`3%C4+-0UVDbOxRPL;Fy@#n9-t<&D{X#T^H%$#9 znUTxybAZcWs^h3%dI@Nq4<>-j5Zq|0FjE3{Y!9-@>j9U9AuWN8v9@ml+Q}>39ud17k=2QPT(p# z8_Oo9ovGUaat!!k01UA;$^1+ohhPD6y=qXFB^%i))(Gd{K+J%GRW7&O5diKQBmzk- zbABZ~GE(>_rGY3ZeFKer&=la}<^dcTWWL@$L1rBsk*E$9z@qMbHceo+-HdW=%!7aM z_Wyig{{!S0Fc~clwmSogfn#Pt4t#BfqGSgY6ogq*aLca_pi)ry1B7!hsqO^IRlkP9 zmk}5MtH*$3H8KZ4=JP9=g*os;_zz?xBQWbPNZNP^aK#=SIs?!qXg+ z@F)O`w1ESBNmTYZ0+K94J0>*UI9ikF>k%)NC1A$X#252!P#fwx9jEd#s24AnpIL=uFsw`J^P6;Kf%=08-klYb=T>2k{J98&ZdXK?9#% zQ*GMwVB!^+;xz}p0}tbB18ATQ8YRBQnu!{bPOL-(lm?^grvF5U9cCYVVo8Pohi?J| zCD2ZARR7|mST4+WwgOl(eK&wVOA@%!7?J}&gZj1|FxTG$d*{DI{O(Vneeb8xy6fMg zdGJGMPQL}Mtd3TcpxInSC$+E#ej0f9$Hk;v76G{0{Qvf;eBFXTp^7blfl*-|)+5gC zAa;DF_ho%WIFln#sSN8dtb-{{s!Zm9WjlN@0rcOZI60kMBW1(xQvLvbN%A#^qg<2s z_uqjDh*O*>aJW$upt1pkF=@v3$n;q0?|26gxzSJp#$55>fiNe)1Z7NJ+doa(hz|Tb zsuSDU2rRz~jUNEb+z99Hg(ZTGmr-iZ!>m#Ku^E)7Z)EXn-2u4q_&?GX-^oq*U4Ge! zD2b97gmtay)04>8JJ|7kK)F7k5ofw0G?aQELUqt8zniE}O-aA!3@84Ec)h{8SdU@P zUAY60u+pZN1^9=b3CJ11d?Wku$VCE3S&)M~g%_NU?*eR=!I~PVin!21&#rN@C{_X}Y0kfQS)iR`w6 zOvw#N5%>wgC{-D&V`hn7w$1JlzfWZbQn5&9U#Jm~bqHFcQhD9q0cdb~DSHlp3o=X- zK!V?&pLnhHLx4uQjksR6uQUxY!OluMEu=f&hSJmx9>~fhU8WG^)Lak#L5u(sGS)hg zgVb{12B3SPKyg9A`32H}u9*a?W6(Lk5@2UU!P6iBFQh~n;1Wqr$q7I+fiP=?0wMM+ z*tIY(WK=<)CP+|ezl;d#;Xg;fqt7>=zm^PudN~3=_VD==iN!hg_Q)~;y{N}fpqHiq zm~*fMB!_-cOwbi0w)LsGEOvc0;FrOT4E5HjoOU`T3rzuZzs4Y>@Av^sVCBwf8pE18 z+^)OT@!%V${ZbiJvt_{9d{GNmLhS4^r$PRHBcJ8<6QF#FL-@78NZYGOZhAk;V^hkQ@WD<#u14no7`Ed}PruU` zp{$A|gxAGqg54t&0!bDXimRAmDJL6*L!Bj{IsjK=dI5kfFt}+x004GjHG8hB+2o%a zZCao^yU2V0J4kN(B>`r(yYW1Ak+M3Zx&L0qR$c}=OQ1CNJ1~*xRj8ykO9cq@Pxg@} zK@NULzB^D>+W~v?MlJT_kX440zTI+L>>%fBPQ>~?9gIFZL-K!6lJJ&NTtXmcRQ zOQArF7q%|Kj91b&+!1;4m{Y(%WCb7@z%wVJr$J^k!A|QOHVQsZFim3E>NM>BzpwA) zQZ_I>cjLM7h*!{#BDC6VM3*IwJ4jNC%mPk^!h%9jLtcG-0iwt$bA%{r`DCZ~p5H{Z zJ}$zYI`}u9|4`{Hpp-1C$0?H8i63$fMiStyv@7eWz^iE+B4%2j3MZAD2!4# zq}l%lkH6f0au5ojyb<;p#4C{UBhRlc{o4C?{fiQ45+ilUL<>o=MZeg~4h??ycN2BhW5t_>cykl75@InN55V_kl7B_fpI6@~pA5v&7} zG)1S~Mpm9c{LYV|vg@|O@!2cu@oK;?Mu*o|Ucva{GdZqO-T5o0JB!_#51r=J9gNN! zWwbn$&lBnAdeNRE{@A*Syi!=#V}0>f@-+97N^dy}+A)8Oc4rh1T0YhSnQ?0jo3bMAPgr>=+(*1ZQ6qY%{ zV$(g<&;B1$B9QI}IJuZSxo2wpLm?q()X;Bak}u`!CO;QNKS>Mmb?=3(?<&T5GXcO@ zK&}M(IlBgG0)W5vptH6LTe}5z<|Yr4*g2p%2h%!#S!PjcokKY~>-+s1XHhZ^hAc|e zI!qS(F8y!5dfL|L}?rK z)mK3VfX$RSjjGQ_t%fuJqw|J6L9!#Y7&}k=%-0o`W%!ytj24vVrkq+#3;J(`=DLOo zzy*PQ;K`LIf9mEjfM~Q?fKik|o&`u`L8UsH2R;B06=kiSdgj2^Z2Vy=1O}p@0KgoM z&N(Udo8fkJ6@qon@BF5-2t=1q>MX#-%P`He9;E&{UGcy$9#{r$atEk71*&a_+jbC` z+y~6uic)O?H6HO0;2$*b3mI#?0;H`_{w(OfZU%VB$#5MT9vkLI0>-d{DgGQm1+Tsi zje4r@h20-;1ozqREPr1xfNQ1zIC7}?B42oF`Qm-QxckM)nz?&~(Jz+`UpH9-+Wj`P z#@~Q34*r6Q3P)dlz7`6BDWUvt`|B{nUp-%q`o$ICNd*?valI8n){*B~Y$bF=m%=!~9o}Oy7od>K4Sb z-zx$?uP)0(h;IW5L5#+_LKeUjORfY8KnvR3cTMlu!+1di0gY8)eYBu6+*a{ z3gJpw0DD$e3rYc?uk+`n!ja!y03U#2^AAo5Y+rl|NZUEUtV;ih&4Yx901$}ZtCR{+%yutDCoCln;YK2}l;;TyXBB zO(2ULB9Dn-Ndkgmm)q_4xIL5-867goA10bXh!0MC=;;EUzW_ zHO5hh@_JyDzYwweQ_{k=g(pD90BNi{`~skZa}N;r66*j(5~KR$X=Pozk1GwBzM$9W z{|~f?GL^i&UDFnq{F3tkH8$Kjxg+frmY*(ge^tC}I{4nsR zX^I{5kAXVN#qQ5B6)`EP+t zC653&i6&OwT#&p1^kI#Z1Sma+pY&Z{O$bs<0J*SU`cL=&&85EtkSX5((NF-N`|irZ zCw^hilhbu`uQ4O;3*cav6pcdThS0;^!I1IFz~l@81w*h2oHrTP6v9z#E7yR^IMVSO zkWAf*WcrP8(>EiX*du7P0HjXM``PNl2Jx`L&wyXZb!WZ=WbK@pr3gwa%y~4zxfibe zK}z{|xPkqjU;yFR6dwS3MFXBa6@THqw~gJ4 zkv;;bxl)k%0R+SE$th>hAvVm_M+qnyz*Imk1F{&E&I+o_uVJ!M1IlAa*Ai(Cz7O`M zp9y*WIw+XPLsuj^$T5=Ox7G^qCrN_Ii%+9=@wqNNw-ImXN-T*-%z)OXM{7wu;gU3J zulfcC27H$JX9-xtl?qLL|djfP^WiBzD<%&hIKd~HyMz& zyL2^cgKXq8*r;_LnEfuYi^qBm(9}|3dx67W=Tf|{h4@BMv_u~UeiJQV=gI$_C&G7% z)L#&YftZ-n&o77x%|_{GAVjk3a6dt|Ak!yDT{W;Q0ZE3%5C75JlXCYDz~3wdK#CH` z=2q-iuvHFO877S!Fk4c#)n?8oFMObeO}rw=vIHHBBi?tf1gQkSKlj)b**NZ87>I;I z87<(e4!`1e#c}NC4DNmPe}Zh%Wmj3u0LQEL94OFs$aZDLC0kd(9S#O|6RyLWJ{{_6 z4@czb|G7r?Fn~<+{%?{3(ER`avM)W;__KhEQ5DkG6dR8OEi{392G6oWJE`a~SlbRe zd7}nQJrvfux22YsR382Hmp6Z?)ofKumD7yN0Pf!PoTTd?=3 zn2*4x0~uw^nQF`Pz6x@8=Za`>hm8Gy`I+Vy0c2wL-+Tt3D}j%Hb@5~)rXP*I62Q9W z3Ie^DA%$g`UMljrU6#Pk+zB#e%`qn&VxI0t4NSfGyV&;9?_=!rqc96EB5f`piXx^6 z&6(_A%@@{t))Pc0YC<`(upH{te8fSCK`_%oI>e z02Tb!T2-8L8xm`+3j8!p8Jk%X(>Q_sNA5>u<@K)Fl&<<6ohSeuI*{2Q6j9EbpN(+* zF;MF*)QzYC<^u-qxVb-n$N)>VcYqyW8cxkD0LRQA-}W<*o^fglubMNL}OBH zd`{sdcJ%j1R|r9dvinCV9slJ&KKBEK{$tY_fE39BUYd;$(-!gt$W~#b_iB|<02pZ> z2H<5WTx}XOb(5A3TmV#<0JW9Zx}W7z(3;qeR|rTVP}=gn0o}?;Wapkk=FrCnz`!pZ zj9iNKUO?7fv*&UVyL}WzUdl_ac;L^R`6|#^0mZA`=!we;st+UM`b^RC-zo0_H`EwI z(19$Lk_?T1{0FmND{#aVK#&n-09*;AN9WT|6SnjbfG&0tIdzBtF_YeTkG_N5 zbyqL&7w4XKd8IuYyx^hR68jA2ZAOD^`i;874(Q1)uqL5Iq5I%Bnm0ULV1t_nHuc&+fbENfm#UA19iN0vg;5tCN#G&2%k+|c0r{I?DQ?D z0)2c7oceFO48rR9@1s_(fZiW2ZaRi^CY10#;YJ>#3*cI3I^N#``P5JKyA8TQ4vorN@A3kk96(rECx&g zyb9{8vp}hg39>+CqRT!^8Ssk2sf8T z7G8W!_yPJf)$9j+dC#T@g%c}DVPm?D&j3t!y}6J5FT;SyBGj74K_~%~7NFpB=luN^$&Ndf@S^SmD7DX{ z)VY|~Epz~)@HsChlwch(zxTDhufnM(ZsU@so1VE}d|1jDN zK=%dsAM;cH_0&U4pT6~9*DIyHTf!G0V}5`!oOK$;3Pdg%750Cr20L^6mD~UAQ{Mg$ zv2eqxlN}ZIe+{(#jeWw4k^$5jM|1F7J+qCp`gwv8ZMDUHvg2+5A&dy!X~5SUc(k6P zt`Wk#9`}zkx9|^t@5~nh_!ZlKXkozN`vTH$zt;J+;EdgBDZ;eQ=8$0X;cS}0Ri;4G zH;DOpn#ahwAn5GdL&1^WwallK>uxubjMv9_1EX?Mf2YN_lL8} z96=6F2`DF~pdFdRq#ymu_$=+m9m)LnTGyK$t%5+TV5&DcHnOMi6k>oWAm zf8`cp0MZO78XsmB$JZgNm~uJ4Y{MON`)l&OE$`S;NG z8XpA$Mzpy9mNEf?a5LaH{_o<^`G$RX3$Or%Wvbp~vFh{xO%>_%Awj|Wi1+@(r78t> zp1E7Navd~%OCS4RDxLc3>$&Z3wFViI)>G)BYs9o160Nxmufh}c5=wclmXoiKGv^F! zM8PkUep2g4egB`|e&pg&zWakwvaO~7BxE=XNZ<2`GygGj)OK4&3D6ZZg`~i2vlJNH ziFj6oluVfge7;C(qw?fav-NPAUUX zU?KtNIWq_bfgHFArOdW(OfE4KqNPqVJ*}rT=?x~SC1&l&9`>=qL0m`*8Otp_-@8V+^U-=0ry2y%SL@`Y+ zwf1Z`K2HetKa<@4Cj&e4CJ+8Av;R-zi9Zeou6I#P=$$W^fNYIMA>1eP?QWQBtum{s;{Hb4E)f1@IRH=WOg~*&bFa7zxl~tO!t_0i&jA zhuOq3cH%A5LVnP?i5wrCPfp%5nVeShBI#EpEbFe;yLfdg=KA`kq! zmlPvqYTWkrrU3;%*u(>->%zl2Ze>8grtv^!9#0Xl9t-&1q6NRAQ<9R6?*>l{y^pK@ zgp^JS;NKjiF&j1|@}OZ5rO>MaI5$)8Mj_BD%dQO6lo5g^5y3KQ$o8l&B}J$hC4E{p z5F)h@Vk$NWpoh+Zt*pG9WKO))tGeK2&U5>4ktVs(3H#$&pNCC66xm6E2!G(dQ{_JD z^WNe!sQRl9eb{^-Aw&h<9})gaECO&0Mgbe@CwX018~(JpCSa_=e0=0FmihX zq}((d#TMuc4GF19_HB1 z0pR0XdnnRtQRLt^sAYt#-zPot)y_;C68e{N1mK?v+%!47qB&)JR`7a&Ks*$4ydPbl zU=@|)S@W^sZnbedGc&Z`T_`IjWr9Ekgr<=GjWfteP0PvAiLFFWH+xR*amaw3|L>dH zY5!feCcshj+?JQb@C;e1C+wk+*@Tt)i5d5&?uha>EV$DI! z28^yBnNjJ!0@VY$z6P37&wIz~3SeBd=l7xjXxZsIY0^7cLr#n?BR{U2NzT|gp7h&2 znH&>XK+0OS5Ur#601^=7I4M(;`}2RnX}5*rwrq*e1K_TqV0K9ZR!V%DcuL3X!@OTo z&4!D|21dHz$NT+zLcI2B<9% z8urR8s)?56MujIfljFimNWVRAlQVX_NKUJtMox+@&4&KRr?$9dIskmTqtBf>g!kR& zy%#^aYa0%HtfW^mW>6dannBG8%My1upKm|_0Q{v+0RBTn)%VsVBdd3b51J+^j{X1? zEJ%wm9G;Ocx?vk>2$nyyR6)0ghG?Q~YQ{1~2x*%Tnyo5BbP+kzN)`GwFU{%=)YM^% zF8c~>-oXy*AfvJ=I(QTEM+pghc)efMnNhN?HuK=rHOWRB{P>X19z+2CRe|5X6J6C1 z*QOX|VTyvT5{8O|zD+KI$F@O45l2YC5$T|U&qPHzD=1RSh@RUaAh!`Jwb>+L=uSxw zRsp;>>wu`iCmr%r@=FTz_<#>ef(iYt;nQNPx*qzMegpssfSJn7%9$p{MPn5s0a~bP zAcZdhkRm`4;Ok&U9txN|aKc(Tg>`&qQ6@F)G$C7AP%YCO=L43RxYEA=AQTg*`#yX2 zXlZ+V*yk^6lq568SC@?ozTt%a$e6F57y;l!07yXTKeB#AMy0#$NT47ELHwLLyoF$Q zD*`V5JVSlF?haprt+*5@_JUL1%Wv}q0wXeGAM49Uyge%Jl{)xs(N8mXpF5`E0rnXN z;75Sp;|KtsBn&D8>b0SOeS2>|pMpoj}VuxymV_o0h1;Q|cX;8K$Oo_)B= zjG|-D{DIF5pVCvR;-0_auV}Pw#0O2of#9e6@Al^r03-pG+0t!d{N1(f!N+Co%I0t)IHkkG4qak&j|!603pah9lQ|-5CQ}^B&VJYekBL~ z>V48f_r2e=9)$i#pFbx6#L&_pGxf%*$dWCM@<`n%G!mdbFM}nb5Nz0*@%*qpXU>=~ z3Qy<>)O`(B2;BBuAJ6W8h5?ox0gLnybHUF-|II=9$y=vHmm#RCZhS|3H8J$@#yaTIjnw=*@ zaNPKeePBTO7dZG~&M&F9+P}V58ZmToWPUe*pA$eQ(*foBH^U27??~UH8N}3$BTWJn z8ygT;NW)-_DFWAPhV9d-ucIA(Pf!*iN&Nx0Q~|w=mU)iTr4{!LI`mD&=HIX{HOJDgW#7nW+n;5 zwWJxnlxPZK}^aE$dWP^=>>z;5OI5&>wdGVO@Es>JK9V|7kqj z>*uTdvPKi%)=3XvS{Zyc=k?{HDf4jx@EMl+IMI{bG5}35Iz22%4+`c<1 zPgD(RDu+E9U?4`6dRUfo3~%X$i#ZO0y|~vGm8{oSc1D!3=RY49v2csnlqdG7FyAjO z@N)w2A2jMJyYj$SLT^o3-8LjHYHPETT@GspA?UOB+bkrY9v<9wMvvmTen#Ez^_N>h z-(c%7&nze8hu|+hrJoZ3G>WYtgV8|6!o<$AM>X8NEhIlDYi6271NvcHNP=UU!hxUg zO{x&PMo3|--^DkZu zj#AzR0#F;cXI9I)v!89aZBw22R9e+TvPKTAJ|MU^h=Sjh zQQI8&nl19BWqr?vy_peK+4ru;K56|A06sI_Z)z_mfF2PI;M#y?(r>DwbALWIcy(<| znwVCMc=lZQp=c?l=;Yml4EH(kwf(?1Ez_g5G5MwbqZ+RN!_?Rk5bon^x?Cfi0D4|D zz|6piAf7hT178WhHSC?ppxP#BQd-g57!kN);h|^|pk3UT&pm$H27c4tCS|-eEOyY9 z6T>qA=)tt!p6&HH0pOJaBWIeINVuU+NemnxuKM%L*r2`5a+Rp+&8&@7>2fm>9O%*6 zzI`t4Wz_v1KT_AMyn4;+;X#953r~$EjkHH;Pd`|NpA!I&2z0Dkuxf|YdfB+pr0c8? z-S&`F(Jtyc>?5Rv9P}h2!O!D!&^vW}nE^j1?jxky-sm)eo(%6(5SHwe>6{W#->Y&>4@y+omDcKZ#fPY9j`Zxh_A~5oa0E&gTyc1h=&a(}7&i;4%je%Bq zW{0dtGpZXE9E4WDb9>$O_PH=W)R>T`e^i~k{@mvScMqS@w44zz(#5A8PT+F_;AKMt zrUm&#@Z{Y1=3l-Ps=VO&z!g>*>anJzy2@@rCB*J2z{r3r`8MctU3;owwx+a|8~0`Y zdge0?gMRgLXxuaNG&Ki1fmw6>V3ZUlDlVcT-{u^Sr%M4524edWCG zQaAr(RKt}QzYu)d`q@8yYjvs~fF1%KdV7O+@Noht$kT>MdZ44#1N$mD_Vm2?W-I)C z_rkHkM;ReZ`?_uL#(m=BfmV4|OG>RyX0%9JaY%vWHrCjAw5&Pg;1GmM5;jqE-VD<* z*ON12AXn_X-37X3X_=6;;(%R?#yhm?a6x<8(doU1Xf&eeCL^U_OUkI< z7FKq@yrjKO(W&8*A!^j)o{(ibu%u7~ z2j;jS!EV=1G5tXSD1&lBNz|R@eXHErjz2Ewzu0G)^I1Y)C;)|!3nJ`?@J~zNo`+`* z1CIhw2<0Bm?K`ubi=aLWI|8o&7&<~hw0AR4>@dfGzZ!THfMUoySq`zF!?zs|9RL6T f0000006yvh=@N>-iWIgH00000NkvXXu0mjfDKlcp diff --git a/share/pixmaps/bitcoin256.xpm b/share/pixmaps/bitcoin256.xpm deleted file mode 100644 index 87bb35cda..000000000 --- a/share/pixmaps/bitcoin256.xpm +++ /dev/null @@ -1,465 +0,0 @@ -/* XPM */ -static char *bitcoin___[] = { -/* columns rows colors chars-per-pixel */ -"256 256 203 2", -" c #BE741B", -". c #C1761B", -"X c #C6791C", -"o c #CC7C1D", -"O c #D07F1D", -"+ c #C67B21", -"@ c #CC7E21", -"# c #D4821E", -"$ c #D9841F", -"% c #ED8E1D", -"& c #EF911F", -"* c #CF8022", -"= c #D48323", -"- c #DB8621", -"; c #DD8922", -": c #D58729", -"> c #D6882B", -", c #DE8C2A", -"< c #CE8C3C", -"1 c #D28934", -"2 c #D98E32", -"3 c #D28E3C", -"4 c #DF9132", -"5 c #D6903E", -"6 c #DD933B", -"7 c #E58C22", -"8 c #E98F23", -"9 c #E38F2B", -"0 c #E88F28", -"q c #ED9124", -"w c #E6922D", -"e c #EB942B", -"r c #EF982F", -"t c #F59624", -"y c #F89723", -"u c #F79826", -"i c #F89825", -"p c #F1972A", -"a c #F59A2C", -"s c #F89B2B", -"d c #E59534", -"f c #EA9632", -"g c #EE9933", -"h c #E3963B", -"j c #E6993D", -"k c #EC9C3B", -"l c #F49C33", -"z c #F99E32", -"x c #F29E3A", -"c c #F7A037", -"v c #F9A036", -"b c #F5A13C", -"n c #F9A33B", -"m c #CE9147", -"M c #D29245", -"N c #DC9641", -"B c #DD9846", -"V c #D2954B", -"C c #DC9A4B", -"Z c #E59C44", -"A c #EA9E43", -"S c #E39E4B", -"D c #E89F49", -"F c #F09F40", -"G c #EDA145", -"H c #E6A14D", -"J c #EBA34B", -"K c #F4A443", -"L c #F9A642", -"P c #F7A847", -"I c #FAA846", -"U c #F3A64A", -"Y c #F8A748", -"T c #F5A94D", -"R c #FAAA4B", -"E c #E6A454", -"W c #EBA552", -"Q c #EDA856", -"! c #E4A55B", -"~ c #E8A75B", -"^ c #E7A95E", -"/ c #EBA95B", -"( c #F0A751", -") c #F4AB53", -"_ c #FAAE53", -"` c #F4AE5A", -"' c #F8AF59", -"] c #FAB057", -"[ c #F6B15E", -"{ c #FAB25B", -"} c #DFAD6F", -"| c #DCAE77", -" . c #DFB27D", -".. c #E5AA64", -"X. c #E8AB61", -"o. c #E5AE6C", -"O. c #E6B06F", -"+. c #ECB16C", -"@. c #F5B365", -"#. c #FBB562", -"$. c #FBB867", -"%. c #F5B66B", -"&. c #FAB768", -"*. c #F4B86F", -"=. c #FBB96A", -"-. c #E1AE71", -";. c #E5B174", -":. c #EBB573", -">. c #EFB977", -",. c #E5B47A", -"<. c #EEBA7B", -"1. c #F3B770", -"2. c #F3B974", -"3. c #FBBC72", -"4. c #F3BC7B", -"5. c #F8BF7A", -"6. c #FAC079", -"7. c #DCB382", -"8. c #DFBB8F", -"9. c #DABB96", -"0. c #DBBD99", -"q. c #E2B682", -"w. c #E4B985", -"e. c #ECBD84", -"r. c #E3BB8B", -"t. c #EABF8C", -"y. c #F1BE83", -"u. c #E2BE92", -"i. c #D3BDA2", -"p. c #DEC09C", -"a. c #EEC28D", -"s. c #F4C286", -"d. c #F8C282", -"f. c #F3C48B", -"g. c #E7C297", -"h. c #ECC393", -"j. c #E2C29D", -"k. c #EAC69B", -"l. c #ECC89F", -"z. c #F1C694", -"x. c #F2C897", -"c. c #F1CA9B", -"v. c #DBC2A3", -"b. c #D6C2AB", -"n. c #DDC7AD", -"m. c #DEC9AF", -"M. c #D3C4B3", -"N. c #DDCAB3", -"B. c #D2C7B9", -"V. c #D6C9BA", -"C. c #DDCEBB", -"Z. c #DFD0BE", -"A. c #E2C5A2", -"S. c #E8C7A0", -"D. c #E6C9A5", -"F. c #EBCBA4", -"G. c #E2C7A8", -"H. c #E3CAAC", -"J. c #EBCDA9", -"K. c #EFD2AF", -"L. c #F3D1A7", -"P. c #F1D1A9", -"I. c #E4CEB3", -"U. c #E8CFB1", -"Y. c #E1CFBA", -"T. c #E6D0B6", -"R. c #E9D1B4", -"E. c #E4D2BC", -"W. c #EAD4BA", -"Q. c #F4D5B0", -"!. c #F4D9B9", -"~. c #CDCDCD", -"^. c #D5CCC3", -"/. c #D4CFCA", -"(. c #DED2C3", -"). c #D3D1CE", -"_. c #DED6CC", -"`. c #D5D5D5", -"'. c #DBD7D1", -"]. c #DEDAD4", -"[. c #DDDDDC", -"{. c #E3D5C3", -"}. c #E9D7C1", -"|. c #EBD9C4", -" X c #E1D6CA", -".X c #E3D9CD", -"XX c #EADDCD", -"oX c #E1DBD4", -"OX c #E8DFD4", -"+X c #E1DEDB", -"@X c #EDE3D7", -"#X c #E3E1DE", -"$X c #E8E3DC", -"%X c #F6E5D2", -"&X c #F4EBDF", -"*X c #E4E4E4", -"=X c #ECE7E2", -"-X c #EDE9E4", -";X c #ECECEC", -":X c #F0EBE7", -">X c #F4F4F4", -",X c #FEFEFE", -"X>X>X>X;X;X*X[.`.r.n n z v v v v c x l p l x x c c v v v v z z z z z z s s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i u i u X>X>X>X>X>X;X*X[.`.@.n n v v v v v c g E | S k f r l l l z z z z z z z z z s s s s s s s s s s s u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i u i e X>X,X,X,X,X>X>X;X*X_.R n v v v v v v x e 0.`.`.V.p.;.H f e e p l l z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i u y , X>X,X,X,X,X>X>X;X*XI.L n v v v v n n x g V.`.[.[.[.[.[.(.p.;.S f r l z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i u u y X,X,X,X,X,X>X>X;X*Xa.n n v v v n n n l A `.[.*X*X-X-X*X*X*X[.`.V.9.K z z z z z s s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i u i u X,X,X,X,X,X>X>X-X[.%.n n n n n n n b p o.[.*X;X;X;X>X;X;X*X*X[.`.~.T z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i u y 0 X>X,X,X,X,X,X>X;X*XoXR L n n n n n n b g u.*X-X;X>X>X>X>X>X;X*X*X[.N.L n z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i u y X>X,X,X,X,X>X>X;X*XI.L L n n n n n n b g C.*X;X>X>X,X,X,X>X>X;X*X[.g.L n z z z z z z s s s s s s s s s s s u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i u i u X,X,X,X,X,X>X>X;X*Xh.L L n n n n n n l G [.*X;X>X,X,X,X,X>X>X;X*X[.2.n n z z z z z z s s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i u y w X,X,X,X,X,X>X>X-X[.%.L n n n n n n b l o.*X;X>X>X,X,X,X,X,X>X;X*X]._ n v z z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i y X>X,X,X,X,X,X>X;X*XoXR L n n n n n n b g j.*X;X>X>X,X,X,X,X,X>X;X*XE.I n v z z z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i u y t X>X,X,X,X,X>X>X;X*XT.I L n n n n n n b k Z.*X;X>X,X,X,X,X,X>X>X;X*Xl.L n v v z z z z z z z s s s s s s s s s s s u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i u y ; X,X,X,X,X,X>X>X;X*Xh.L L n n n n L L x G [.*X;X>X,X,X,X,X,X>X>X;X*X4.n n v v v z z z z z z s s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i u i u X>X,X,X,X,X,X>X>X-X[.%.L L n n n L L L l ;.*X;X>X>X,X,X,X,X,X>X;X*X[._ L n v v v z z z z z z z s s s s s s s s s s s u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i u y q X>X>X>X;X;X;X;X*X*X*X*X].N.q.! d e e r p q ,.-X;X>X>X,X,X,X,X,X>X;X*XoX_ I L n L L L L K g j.*X;X>X>X,X,X,X,X,X>X;X*XE.Y L n v v v z z z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t X>X>X>X>X>X>X>X>X;X;X;X;X*X*X*X*X_.I.r.o.Z w D.;X>X>X,X,X,X,X,X,X>X;X*XW.R I L L L L L L K k Y.*X;X>X,X,X,X,X,X>X>X;X*Xl.L L n v v v v v z z z z z z s s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i u y q X>X,X,X,X,X,X,X>X>X>X>X>X>X;X;X;X;X*X*X*X*X$X}.=X>X>X>X,X,X,X,X,X,X>X;X*Xx.I I L L L L L L x J [.*X;X>X,X,X,X,X,X>X>X;X*X4.L n n v v v v v z z z z z z s s s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t X,X,X,X,X,X,X,X,X,X,X,X>X>X>X>X>X>X;X;X;X;X;X>X>X>X>X,X,X,X,X,X,X,X>X>X;X&.L L L L L L L L x ;.*X;X>X>X,X,X,X,X,X>X;X*X[.' L n n n v v v v z z z z z z z s s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i u y t X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X>X>X>X>X>X>X>X,X,X,X,X,X,X,X,X,X>X>X@Xb l x x K L L L L k j.*X;X>X>X,X,X,X,X,X>X;X*XE.R L n n n n v v v v z z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X:XW.g.;.H k k k b F k {.;X>X>X,X,X,X,X,X>X>X;X*XS.I L n n n n v v v v v z z z z z z s s s s s s s s s s s u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i y t X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X;X*X+XE.j.,.~ j A =X;X>X>X,X,X,X,X,X>X>X;X*X4.I L n n n n v v v v v z z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X;X;X*X*X*X*XXX}.;X>X>X,X,X,X,X,X,X>X>X;X#X{ I n n n n n n v v v v z z z z z z z s s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i y t X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X>X;X;X;X;X;X>X>X>X,X,X,X,X,X,X,X>X>X;X|.R I n n n n n n v v v v v z z z z z z z s s s s s s s s s s s u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X>X>X>X>X>X>X,X,X,X,X,X,X,X,X>X>X;XF.L L n n n n n n n v v v v z z z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i y q X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X,X,X,X,X,X,X,X,X,X,X,X>X>X;X@.a x b b n n n n n v v v v z z z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X|.e.G g l c b n n n n v v v v z z z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t 0 X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X-X+XG...k g l b n n n v v v v z z z z z z z s s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i y t X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X;X*X*X(.w.A g l c c v v v v v z z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t = X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X;X-X*X*X'.u.A r l x c v v v z z z z z z z s s s s s s s s s s s u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t q X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X>X;X;X*X*X].u.k r l c v v v z z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X>X;X;X*X*X_.q.g p l z v z z z z z z z s s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t 7 X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X>X>X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X>X;X;X*X[.C.W p l c v z z z z z z z s s s s s s s s s s s u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i y t X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X>X;X;X;X;X>X>X>X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X>X;X*X*X[.w.r a l z z z z z z z s s s s s s s s s s s u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X-X-X-X*X*X-X;X;X;X;X>X>X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X;X;X*X[.H.g a z z z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t 0 X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;Xf.3.x.R..X+X*X*X*X*X;X;X;X>X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X;X*X*X(.k p z z z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i y t X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*X$.{ { { $.3.f.F.{.[.*X*X*X;X;X;X>X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X-X*X_.W p z z z z z z z s s s s s s s s s s s u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t @ X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X-X|.{ ] _ ] { { { { $.3.h.R..X*X*X*X;X;X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X-X*X'.k p z z z z z z s s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t 0 X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*XJ._ ] _ _ _ _ ] { { { #.$.$.f.T.oX*X*X;X;X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X-X*X_.l a z z z z z z s s s s s s s s s s s u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t t X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*Xs._ _ _ _ _ _ _ _ _ ] { { { { { =.l..X*X*X;X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*X*XH.t z z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X*X+X&.] _ _ _ _ _ _ _ _ _ _ _ _ ] { { { #.k.oX*X-X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*X[.:.t z z z z z z s s s s s s s s s s s u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t ; X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X*X{.{ { _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ] _ { J.*X*X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*X'.l s z z z z z z s s s s s s s s s s s u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t q X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*XF.{ { _ _ _ _ _ _ _ _ ] _ _ _ _ _ _ _ _ _ _ _ y.oX*X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X*X[.t.u z z z z z z s s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t t X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*Xs.{ ] _ _ _ _ _ ] ] ] ] ] _ _ _ _ _ _ _ _ _ _ _ ' .X*X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*X'.z z z z z z z z s s s s s s s s s s s u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X*X].&.{ ] _ _ _ ] ] ] ] ] ] ] _ _ _ _ _ _ _ _ _ _ _ R R oX*X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X*X[.:.u z z z z z z s s s s s s s s s s s u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t ; X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X*X{.#.{ _ _ _ _ ] ] ] ] ] ] ] ] _ _ _ _ _ _ _ _ _ _ _ I @.*X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*XD.s z z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t q X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*XF.{ { _ ' ] ] ] ] ] { { { ] ] ] _ _ _ _ _ _ _ _ R R _ n k.*X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*X_.n z z z z z z z s s s s s s s s s s s u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t t X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*Xs.{ { ] ] ] ] { { { { { { ] ] ] _ _ _ _ _ _ _ _ R R R I T +X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X*X[.T z z z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X*X[.=.{ { ] ] ] { { { { { { { ] ] ] _ _ _ _ _ _ _ _ _ R R R K D.*X;X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X*X[.%.z z z z z z z z s s s s s s s s s s s u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t = X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X*X{.#.{ ] ] { { { { { { { { { { ] ] ] _ _ _ _ _ _ _ _ R R R K e.*X;X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X-X[.<.v v z z z z z z z s s s s s s s s s s s s u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t 7 X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*XJ.{ { { { { { { { { { { { { { { ] ] ] _ _ _ _ _ _ _ _ R R K +.*X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*X<.n v v z z z z z z s s s s s s s s s s s s u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t q X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*Xs.#.{ { { { { { { { { { { { { { ] ] ] ] _ _ _ _ _ _ _ _ R U / *X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*Xe.n n v v z z z z z z s s s s s s s s s s s u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t t X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X*X[.=.#.{ { { { { { { { { { { { { { ] ] ] ' _ _ _ _ _ _ _ _ R K +.*X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*X<.n n v v z z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i u t X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X*X{.$.#.{ { { { { { { { { { { { { { { ] ] ] ] _ _ _ _ _ _ _ T K ,.*X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X-X[.>.n n v z z z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t @ X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*XJ.#.#.{ { { { { { { { { { { { { { { ] ] ] ] _ _ _ _ _ _ _ T G j.*X;X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X*X[.%.n n v v z z z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t = X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*Xf.#.{ { { { { { { { { { { { { { { { { ] ] ] _ _ _ _ _ _ _ T J X-X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X*X]._ L n v v v z z z z z z z s s s s s s s s s s s u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t ; X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X#X3.#.{ { { { { { { { { { { { { { { { { { ] ] ] _ _ _ _ _ ) G ..*X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*X{.R L n v v v v z z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t 7 X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X|.=.#.{ { { { { { { { { { { { { { { { { { { ] ] ' _ _ _ _ T k E.*X;X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*XH.L L n v v v v z z z z z z z s s s s s s s s s s s u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t q X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;Xc.] { { { { { { { { #.{ { { { { { { { { { { ] ] ] _ _ _ ( A w.*X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X-X[.a.L n n v v v v v z z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t q X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;Xx.( Q ( ) ` [ [ { #.#.#.{ { { { { { { { { { { ] ] _ ) T D o.*X;X;X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X*X[.[ L n n n v v v v z z z z z z z s s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i u q X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;XOXI.u.O./ Q Q ` ` [ [ [ { { { { { { { { { ] ' ) ( J H r.*X-X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*XE.R I n n n v v v v v z z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i u q X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X;X;X*X*X_.H.r.;.X./ Q Q ) ) ` ` ` ` ` ) ) ( J H W ,.{.*X;X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X*X[.y.I L n n n n v v v v z z z z z z z s s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i u t X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X;X;X;X*X*X*X*X].(.H.u.q.;.^ ^ ~ ~ E E ~ o.r.G. X*X*X;X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*X_._ Y L n n n n n v v v z z z z z z z s s s s s s s s s s s s u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i u t @ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X>X;X;X;X;X*X*X*X*X*X*X[.]..X X XoX+X*X*X*X-X;X;X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*X[.f.R I n n n n n n v v v v z z z z z z z s s s s s s s s s s s u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t = X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X>X>X>X;X;X;X;X;X;X-X-X*X*X*X-X;X;X;X;X>X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X;X*X X_ R L n n n n n n v v v v z z z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t = X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X>X>X>X>X>X>X>X>X;X;X;X>X>X>X>X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*X[.%.R I L n n n n n n n v v v v z z z z z z z s s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i t - X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X>X>X>X>X>X>X>X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X;X*X[.k.R R L n n n n n n n n v v v v v z z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i t ; X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X;X;X*X[.l.] _ I L L n n n n n n n n v v v v v z z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i t ; X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X;X-X*X[.l.{ _ Y L L L n n n n n n n n v v v v v v z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i t ; X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X;X*X*X].h.{ _ R L L L L L n n n n n n n n v v v v v z z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i t ; X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X>X>X>X>X>X>X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X;X*X[.T.3.{ ] R I L L L L L n n n n n n n n n v v v z z z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i t ; X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X;X;X;X;X;X;X;X;X>X>X>X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X;X*XW.s.#.{ _ R I I L L L L L L n n n n n n n n v v v v z z z z z z z z s s s s s s s s s s s u u u u u i i i i i i i i i i i i i i i i i i i i i i i i t ; X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X-XQ.|.OX*X*X*X*X*X;X;X;X>X>X>X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X&X!.L.d.#.{ ] R R I I I L L L L L L n n n n n n n n n v v v v z z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i i t ; X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;XXX3.3.3.s.c.R..X[.*X*X*X-X;X;X;X>X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X%X{ L R _ _ R R R I I I I L L L L L L n n n n n n n n v v v v v z z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i i t ; X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X-XK.&.=.=.&.=.3.3.d.c.R..X[.*X*X*X;X;X;X>X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;XJ.J K Y R R Y I I I I L L L L L L n n n n n n n n n v v v v z z z z z z z s s s s s s s s s s s s u u u i i i i i i i i i i i i i i i i i i i i i i i i t ; X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*Xf.$.#.#.#.#.&.&.=.=.3.3.f.F.}.+X*X*X*X;X;X>X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X;XOX:.K U R R I I I I I L L L L L L n n n n n n n n v v v v z z z z z z z s s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i i i i t ; X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X-X+X3.$.#.{ { #.#.#.#.$.$.&.=.=.3.6.c.W.+X*X*X;X;X>X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*X*Xj.K K R R I I I I I L L L L L n n n n n n n n v v v v v v z z z z z z s s s s s s s s s s s s u u u i i i i i i i i i i i i i i i i i i i i i i u t = X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X*X{.&.#.{ { { { #.#.#.#.#.#.#.#.$.$.=.=.5.J..X*X*X;X;X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*X*XH.K K R R I I I I L L L L L L n n n n n n n n v v v v v z z z z z z z s s s s s s s s s s s u u u u u i i i i i i i i i i i i i i i i i i i i u t = X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*XJ.#.#.{ { { { #.#.#.#.#.#.#.#.{ #.#.$.$.$.=.z.{.*X*X;X;X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X;X*X*XC.U K R I I I I I L L L L L L n n n n n n n n v v v v v z z z z z z s s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i i u q * s u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i u u u u s s s s s s s s s s s z z z z z z z v v v v v n n n n n n n n L L L L L L I I K A Z.*X;X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*Xf.#.#.{ { { { { #.#.#.#.{ { { { { { { #.#.#.#.$.z.{.*X*X;X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*X*XC.b K Y I I I I L L L L L L n n n n n n n n n v v v v z z z z z z z s s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i u q + X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X*X[.3.#.{ { { { { { #.#.#.{ { { { { { { { { { { #.#.#.$.F.+X*X;X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*X[.H.b P I I I I I L L L L L n n n n n n n n n v v v v v z z z z z z s s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i t q X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X*X{.$.#.{ { { { { { { { { { { { { { { { { { { { { { { #.{ 2.{.*X;X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*X[.e.b Y I I I I L L L L L L n n n n n n n n v v v v z z z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i i t q X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*XJ.#.#.{ { { { { { { { { { { { { { { { { { { { { { { { { { { U.*X;X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*X].T L Y I I I I L L L L L L n n n n n n n n v v v v v z z z z z z s s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i i t q X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*Xf.#.{ { { { { { { { { { { { { { { { { { { { { { { { { ] { { _ R.*X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X-X*XD.L R I I I I L L L L L L n n n n n n n n v v v v v z z z z z z z s s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i t q X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X*X[.=.#.{ { { { { { { { { { { { { { { { { { { { { { ] ] ] ] ] { ' R T.*X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*X[.` L I I I I I L L L L L L n n n n n n n n v v v v v z z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i t 8 X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X*X{.$.#.{ { { { { { { { { { { { { { { { { { { { ] ] ] ] ] ] ] _ ] _ R oX*X;X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X-X[.g.n I Y I I I I L L L L L n n n n n n n n n v v v v z z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i i i i t 7 X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*XJ.{ { { { { { { { { { { { { { { { { { { { { ] ] ] ] ] _ _ _ _ _ ] Y <.*X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*X(.I I I I I I L L L L L L L n n n n n n n n v v v v v z z z z z z z s s s s s s s s s s s u u u u u i i i i i i i i i i i i i i u t ; X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*Xf.{ { { { { { { { { { { { { { { { { { { ] ] ] ] ] ] _ _ _ _ _ _ _ _ T .X-X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X*X[.[ L I I I L L L L L L L L n n n n n n n n n v v v v z z z z z z z s s s s s s s s s s s u u u u u i i i i i i i i i i i i i i u q = X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X*X[.=.{ { ] { { { { { { { { { { { { { { ] ] ] ] ] ] _ _ _ _ _ _ _ _ _ _ P g.*X;X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X-X[.e.n I L L L L L L L L L L n n n n n n n n n v v v v v z z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i i t q X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X*X{.#.{ ] ] { { { { { { { { { { { ] ] ] ] ] ] ] ] _ _ _ _ _ _ _ _ _ _ _ Y +.*X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*Xg.L I L L L L L L L L L n n n n n n n n n n n v v v v z z z z z z z s s s s s s s s s s s s u u u u i i i i i i i i i i i i i t q X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*XJ.{ { ] ] ] { { { { { { { { { ] ] ] ] ] ' _ _ _ _ _ _ _ _ _ _ _ _ _ _ T Q #X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*XD.I I L L L L L L L n n n n n n n n n n n n n v v v v v z z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i i i t q X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*Xf.{ { ] ] ] ] { { { { { { { ] ] ] ] ] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Y W +X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*XI.I I L L L L L n n n n n n n n n n n n n n n v v v v v v z z z z z z z s s s s s s s s s s u u u u u i i i i i i i i i i i i t 7 X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X*X[.=.{ ] ] ] ] ] { { { { { ] ] ] ] ] ' _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ R R T W +X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*XE.I L L L L n n n n n n n n n n n n n n v v v v v v v v v z z z z z z z s s s s s s s s s s s u u u u i i i i i i i i i i i u q ; X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X*X{.#.{ _ _ ] ] ] ] { ] ] ] ] ] ] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ R R R R K X.*X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*XE.I L n n n n n n n n n n n n n n n n v v v v v v v v v z z z z z z z z s s s s s s s s s s s s u u u i i i i i i i i i i i t q @ X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*XJ.{ { _ _ _ ] ] ] ] ] ] ] ] ' _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ R R R R R x q.*X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*XD.R L n n n n n n n n n n n n n n n v v v v v v v v v z z z z z z z z z z s s s s s s s s s s s s u u u u i i i i i i i i i t q X>X>X>X>X>X>X>X>X>X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*Xs.{ ] _ _ _ ] ] ] ] ] ] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ R R R R R R R T k G.*X;X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*XS.I L n n n n n n n n n n n n n v v v v v v v v v z z z z z z z z z z z z s s s s s s s s s s s s u u u u i i i i i i i i i t q X>X>X,X,X>X>X>X>X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X#X&.{ _ _ _ _ _ ] ] ] ] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ R R R R R R R R K A oX;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*Xh.L L n n n n n n n n n n v v v v v v v v v z z z z z z z z z z z z z s s s s s s s s s s s s s s s u u u i i i i i i i i i t 7 X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X|.{ ] _ _ _ _ _ ] ] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ R R R R R R R R R U k u.*X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X-X[.2.L L n n n n n n n n n v v v v v v v v z z z z z z z z z z z z z s s s s s s s s s s s s s s s s s u u u u i i i i i i i u q = X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;Xc.R _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ R R R R R R R R R R T k D +X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X*X[.' L n n n n n n n n v v v v v v v z v v z z z z z z z z z z z s s s s s s s s s s s s s s s s s s s u u u u i i i i i i i t q X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;Xf.K G G U ) ) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ R R R R R R R R R R R U A j {.*X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*X{.R L n n n n n n v v v v v v v v v z z z z z z z z z z z z s s s s s s s s s s s s s s s s s s s s s s u u u u i i i i i i t q X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X-XXXH.w.X.J J J T ) ) ) _ _ _ _ _ _ _ _ R R R R R R R R R R R Y K k D Y.*X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*XJ.L L n n n n v v v v v v v v z z z z z z z z z z z z z s z s s s s s s s s s s s s s s s s s s s s u u u u u u u i i i i u t 7 X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X;X-X*X#X(.A.q...H J J U U T T T T R R R R R R R R R Y Y U K k A ;..X*X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X-X[.4.L n n n v v v v v v v v z z z z z z z z z z z z z z s s s s s s s s s s s s s s s s s s s s u u u u u u u u u i i i i i t q * X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X;X;X;X*X*X*X[.(.H.u.,.^ J D G A J K K U U U U K k k k A E w.Y.*X*X;X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X*X]._ L n v v v v v v v v v v z z z z z z z z z z z s s s s s s s s s s s s s s s s s s s s s s u u u u u u u u u i i i i i i t q X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X>X>X;X;X;X-X*X*X*X*X[._.N.A.u.;.;...E E E E ..;.q.j.I.+X*X*X;X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*XH.I L n v v v v v v v v z z z z z z z z z z z z s s s s s s s s s s s s s s s s s s s s s u u u u u u u u i i i i i i i i i t 8 X>X>X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X>X>X>X;X;X;X;X-X*X*X*X*X*X*X*X+X+X+X+X*X*X*X*X*X;X;X;X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X*X[.1.L n v v v v v v z z z z z z z z z z z z s s s s s s s s s s s s s s s s s s s s s s u u u u u u u u u i i i i i i i i i u q ; X>X>X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X>X>X>X>X>X;X;X;X;X;X;X;X;X;X;X;X;X;X;X;X;X>X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*X XR L n v v v v v z z z z z z z z z z z z s s s s s s s s s s s s s s s s s s s s s u u u u u u u u i i i i i i i i i i i i t q X>X>X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X>X>X>X>X>X>X>X>X>X>X>X>X>X>X>X>X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X-X[.a.L n v v v z z z z z z z z z z z z z z s s s s s s s s s s s s s s s s s s s s u u u u u u u u u i i i i i i i i i i i i i t 8 X>X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X>X>X>X>X>X>X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*X]._ L n v z z z z z z z z z z z z z z s s s s s s s s s s s s s s s s s s s s s u u u u u u u i i i i i i i i i i i i i i i u q ; X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X;X*X[.a.L n v z z z z z z z z z z z z s s s s s s s s s s s s s s s s s s s s s s s u u u u u u u i i i i i i i i i i i i i i i i t q X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*X_.R L n z z z z z z z z z z z z s s s s s s s s s s s s s s s s s s s s s s u u u u u u u i i i i i i i i i i i i i i i i i i t 8 X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*X[.2.L n z z z z z z z z z z z s s s s s s s s s s s s s s s s s s s s u s u u u u u u u u i i i i i i i i i i i i i i i i i i t q = X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X*X[.D.L L v z z z z z z z z z z s s s s s s s s s s s s s s s s s s s s u u u u u u u u u i i i i i i i i i i i i i i i i i i i i t q X>X,X,X,X,X,X,X,X,X>X>X>X>X>X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X-X*X XR L n z z z z z z z z s s s s s s s s s s s s s s s s s s s s s s u u u u u u u i i i i i i i i i i i i i i i i i i i i i i u q 7 X>X,X,X,X,X,X,X,X>X>X>X>X;X;X>X>X>X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X;X-X*X'._ I n z z z z z z z s s s s s s s s s s s s s s s s s s s s s s u u u u u u i u u i i i i i i i i i i i i i i i i i i i i i i t q o X>X,X,X,X,X,X,X>X>X>X=X;X-X-X-X;X;X;X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X;X-X*X].%.L L z z z z z z s s s s s s s s s s s s s s s s s s s s s s u u u u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i t 8 X>X,X,X,X,X,X>X>X;X=X=.5.c.W.oX*X*X-X;X>X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X>X;X*X*X_.%.I L z z z z z z s s s s s s s s s s s s s s s s s s s s u u u u u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i t q - X>X,X,X,X,X,X>X>X;X|._ _ _ { #.4.l.}.$X;X>X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X>X>X;X;X*X[.E.{ I L v z z z z s s s s s s s s s s s s s s s s s s s s u u u u u u u u i u i i i i i i i i i i i i i i i i i i i i i i i i i i i t 8 X,X,X,X,X,X>X>X;X*XF.R R R R _ _ { { { 4.-X>X>X,X,X,X,X,X,X,X,X,X>X>X>X>X>X>X>X>X>X>X>X,X,X,X,X,X,X,X,X,X,X,X>X>X>X>X>X>X>X;X;X*X*X[.k._ I n z z z s s s s s s s s s s s s s s s s s s s s s s s u u u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t q 7 X,X,X,X,X,X>X>X;X*X4.R I I I I R R R b U -X>X>X,X,X,X,X,X,X,X,X>X>X>X>X>X;X>X>X>X>X>X>X>X>X>X>X>X>X>X>X>X>X>X>X>X>X;X;X;X-X*X*X[.T.*.R L n z z z s s s s s s s s s s s s s s s s s s s s s u u u u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t q X>X,X,X,X,X,X>X;X*X+X] R I L I I I I P x t.;X>X>X,X,X,X,X,X,X,X>X>X;X;X;X;X-X-X-X;X;X;X;X;X;X;X;X;X;X;X;X;X;X;X;X;X;X*X*X*X[.].U.4.R I L v z z z s s s s s s s s s s s s s s s s s s s s u u u u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i u q 7 X>X,X,X,X,X>X>X;X*XE.R Y L L I I I I K k I.-X;X>X,X,X,X,X,X,X>X>X;X|.f.J.W..X[.[.*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X[._.I.h.#.R L L n z z z s s s s s s s s s s s s s s s s s s s s u u u u u u u u i u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t q . X,X,X,X,X,X>X>X;X*Xl.I I L L L I I P K A oX-X>X>X,X,X,X,X,X>X>X;X;Xs.R _ _ { #.4.y.S.l.T.{.{. XoXoXoXoX].oX{.{.E.k.a.2.{ _ I L n v z z s s s s s s s s s s s s s s s s s s s s s s u u u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i u q 7 X,X,X,X,X,X>X>X;X[.2.I I L L L L I L x ^ *X;X>X>X,X,X,X,X,X>X>X;X*X#.I I I I Y I R I _ R _ ] { { [ { { { { ] _ R R I I L n n v z z z s s s s s s s s s s s s s s s s s s s s u u u u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t q . X>X,X,X,X,X,X>X;X*X]._ Y L L L L L I L k r.*X;X>X>X,X,X,X,X,X>X;X-X.XR L n n n n n n L L L L L L L n L n n n L n n n c v z z z z s s s s s s s s s s s s s s s s s s s s s u u u u u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i u q 7 X>X,X,X,X,X>X>X;X*XT.R I L L L L L L K k H.*X;X>X>X,X,X,X,X>X>X;X*XJ.L L n n n n n v v v v v v v v v z z z z z z z z z z z z z s s s s s s s s s s s s s s s s s s s s u u u u u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t 8 X,X,X,X,X,X>X>X;X*Xk.I I n L L L L L b k ].*X;X>X,X,X,X,X,X>X>X;X*Xy.L n n n n v v v v v v v v v z z z z z z z z z z z z z s s s s s s s s s s s s s s s s s s s s u u u u u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t q 7 X,X,X,X,X,X>X>X-X[.2.L L n L L L L L l ^ [.-X>X>X,X,X,X,X,X>X;X*X[.[ L n n n v v v v v v v z z v z z z z z z z z z z z z s s s s s s s s s s s s s s s s s s s u u u u u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t 8 X,X,X,X,X,X>X;X*X]._ L L n L L L L K g r.*X;X>X>X,X,X,X,X,X>X;X*X{.R L n v v v v v v v z z z z z z z z z z z z z z z s s s s s s s s s s s s s s s s s s s s u u u u u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t q - X,X,X,X,X>X>X;X*XE.I L n n n L L L b g H.*X;X>X>X,X,X,X,X>X>X;X*XF.L L v v v v v v v z z z z z z z z z z z z z s s s s s s s s s s s s s s s s s s s s s u u u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i u q 8 X>X>X,X>X>X>X;X*Xk.L L n n n n L L x k _.*X;X>X,X,X,X,X,X>X>X;X*Xy.n n v v v v v v z z z z z z z z z z z z z s s s s s s s s s s s s s s s s s s s s s u u u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t q # X>X>X>X>X;X*X[.2.L L n n n n n b l ~ [.-X>X>X,X,X,X,X,X>X;X*X[.' L n v v v z z z z z z z z z z z z z s s s s s s s s s s s s s s s s s s s s s s s u u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t q 7 X>X,X,X,X,X,X>X;X*X{.I n c v v z z z z z z z z z z z z z s s s s s s s s s s s s s s s s s s s s s u u u u u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t 8 X>X,X,X,X,X>X>X;X*XF.L n v z z z z z z z z z z z z z z s s s s s s s s s s s s s s s s s s s s u u u u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t q - X>X,X,X,X,X>X>X;X*X4.n n z z z z z z z z z z z z s s s s s s s s s s s s s s s s s s s s s s u u u u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t q 7 .L n n n n n n b l E [.*X;X>X>X,X,X,X>X>X;X*X[.' n v z z z z z z z z z z z s s s s s s s s s s s s s s s s s s s s s u u u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t 8 X>X>X>X>X>X;X*X{.I n z z z z z z z z z z s s s s s s s s s s s s s s s s s s s s s u u u u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t q - X>X>X;X;X*X[.S.n n z z z z z z z z s s s s s s s s s s s s s s s s s s s s s u u u u u u u u i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i t q 7 DFwwRRLxO5D^qBpo)srZrqw~HrcK2Zgw|)(Kf9~Oj=Njwbec} zR7V||ff)y8u!2>r+PDhcMq6vEm9?;nQb0tY!#p3%FpqohU{3%4%Vq95xE9i+CSOLm zIOlxlobUVp`!fLJF81dhR=;31nbogYP2nZ~eX{)Qo{4^q^>Y5S_>f5J{qq` zOyFgp}@~nmY|BQ#o-M}YtX>}zzc>~7c<6`}Ch;<7fnCC#Ko(Z8Ujg>|& zHTzjQgnhFanOtyk1A7ZTu6!;%U$$q`1PBoL&sp8qx?@SXaG*FQTJj;7W+{LQF#jZQ z(U=KwUlt>h0U~3{;>yInc`s)Z|1SQW<02q~-``_cZWZemv95CN2plzN5UEUMpJ@;o zn8=i&GR=$=BqEI1^_@8u{+)LsaVOdD>(wu<6YCZ-@a(bR)NvXDm1%I8mcdh7jF4$A z!lrCQSP9121gwzApt|vXrbSj_(%lIBvSs_i^~`JX^R|we=i$l}MD!_)Ljeo8Z2+`pJ)PwY6jR|Q+$ zAJKoP1fIQ_@ECGox7*=vIe>_T5$Ns3jkeDq*3P3WC@Ls+MD;3cSoP2>j-?P##_it0 zs)fy><R3*84yYqb9>o2N z=rdfq0DjkZL?Gz3!`Ja|xca`06LAdOfTOVl5k8hQy0@u7HnhL3+QTt9Hg$jO)vQ8~ zF~41)F`7ldHCR>)L6I{Of7NPW%(Tb2rAKn)Z*@&M4&AoWSJE+jBQWYv)VUJ+FP)Bsm{NkpW8$D}wCt$n$33(rhMBuql1NYGv;BHt0`-%1NyX~Za%jH7w z#7nG+`P59J3SqqlSGT4bX-#u4`n1`N|2y|03m~ztp}o%JUkb5)1p*CE!Zp}OT@nG0 z2TrGxK8J^gAqWD3?(g6{UjwP}4 zoJU{c{*wZ}-b)BvFu-x`47^@1fyZJo_-|Zg zpd!;G$iEOTS%s)M7hzU`>TK9Ptsw7Nw@m(hh@E^Mu~RQVXkH6f*LfaHdOp~42*QCP zh+Mh40;a-TS%q}U!f>S;SGJ~Bk6JLfZHxN#XjQs2cIRgzpwGg((vWkm8{yAu;9nfkrCI%PC^ez_&*&eO;cko5~J(A!l= z1J4GrH)kVo;$;e)zwAa6l>W@~F^JL7k}bLvJ|WO1zjdm*`4KBJWXa$+E9FrwetnYIZ2G8uGCB;rmBB*q%8MFDk z4E$`_^iq!TgIBW7carN8Nhm9N4iO=ltp#*wB}knJPQL&5tt6{*B^$@3^xD=WD_a<3 zhq9vOgUU?Fj$gILbgjrvowshDp*87N Q{{R3007*qoM6N<$f>S`#1ONa4 diff --git a/share/pixmaps/bitcoin32.xpm b/share/pixmaps/bitcoin32.xpm deleted file mode 100644 index bffedd4c6..000000000 --- a/share/pixmaps/bitcoin32.xpm +++ /dev/null @@ -1,140 +0,0 @@ -/* XPM */ -static char *bitcoin__[] = { -/* columns rows colors chars-per-pixel */ -"32 32 102 2", -" c #CC7D1D", -". c #D5831F", -"X c #D48221", -"o c #D98621", -"O c #DC8820", -"+ c #DC8D2C", -"@ c #D98F36", -"# c #D68F39", -"$ c #DD943E", -"% c #E28B23", -"& c #E98F24", -"* c #E18F2D", -"= c #ED9124", -"- c #EC942A", -"; c #F59624", -": c #F89724", -"> c #F79827", -", c #F89825", -"< c #F0962B", -"1 c #F59A2D", -"2 c #F99B2B", -"3 c #EC9732", -"4 c #EC9A37", -"5 c #E2963B", -"6 c #E6983A", -"7 c #EC9C3B", -"8 c #F69D33", -"9 c #F99E32", -"0 c #F49E3A", -"q c #F9A036", -"w c #F6A13C", -"e c #F9A33B", -"r c #D79341", -"t c #DC9641", -"y c #E39A43", -"u c #EA9D42", -"i c #EFA041", -"p c #EDA34B", -"a c #F5A443", -"s c #F9A643", -"d c #FAA846", -"f c #F2A64C", -"g c #F9AA4B", -"h c #E5A251", -"j c #ECA756", -"k c #EBA758", -"l c #FAAF57", -"z c #FBB057", -"x c #FBB25B", -"c c #DFB179", -"v c #E4AA65", -"b c #EBAE64", -"n c #E9AF69", -"m c #FBB665", -"M c #F1B46A", -"N c #F8B96D", -"B c #E5B071", -"V c #EBB777", -"C c #EEB877", -"Z c #E7B478", -"A c #EBB97D", -"S c #F0B671", -"D c #F2B871", -"F c #EFBC80", -"G c #E6BD8D", -"H c #EDBF88", -"J c #E6BF90", -"K c #F1C187", -"L c #F1C288", -"P c #E5C093", -"I c #EEC493", -"U c #E1C19B", -"Y c #E9C69C", -"T c #ECC89D", -"R c #F1C897", -"E c #DFC5A4", -"W c #DBCBB8", -"Q c #E2C7A7", -"! c #EBCBA6", -"~ c #E6CBAB", -"^ c #E9D2B7", -"/ c #E5D1B9", -"( c #EBD6BD", -") c #EFD9BE", -"_ c #DDD0C2", -"` c #DCD7D2", -"' c #DEDEDE", -"] c #ECDAC5", -"[ c #EDDECB", -"{ c #E9E0D5", -"} c #E7E0D9", -"| c #E9E2DB", -" . c #EFE8DF", -".. c #E5E5E5", -"X. c #EBE7E2", -"o. c #EFEAE6", -"O. c #ECECEC", -"+. c #F2ECE6", -"@. c #F1F0EE", -"#. c #F4F4F4", -"$. c #FBFBFB", -"%. c None", -/* pixels */ -"%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.", -"%.%.%.%.%.%.%.%.%.%.%.%.%.%.t 5 5 $ %.%.%.%.%.%.%.%.%.%.%.%.%.%.", -"%.%.%.%.%.%.%.%.%.%.%.r u w q 9 9 9 8 4 # %.%.%.%.%.%.%.%.%.%.%.", -"%.%.%.%.%.%.%.%.%.y s e 9 2 , , , : > 2 9 q 5 %.%.%.%.%.%.%.%.%.", -"%.%.%.%.%.%.%.%.s q 2 , , , , : , > 2 2 > > 2 9 %.%.%.%.%.%.%.%.", -"%.%.%.%.%.%.t e 1 , , , , : : ; > 2 9 9 2 , , > 2 + %.%.%.%.%.%.", -"%.%.%.%.%.$ e 2 , , , , , , ; u u 8 1 1 2 > , , > > + %.%.%.%.%.", -"%.%.%.%.%.e 2 , , : > ; ; > < ` ` 0 c n 1 2 , , , > , %.%.%.%.%.", -"%.%.%.%.e 1 , , , , ; h v - 3 ..! w ' _ 9 2 > , , , > : %.%.%.%.", -"%.%.%.6 q , : , > 2 > W ..| [ #.H V ..D 9 9 2 , , , , , % %.%.%.", -"%.%.%.e 2 , > 2 2 2 9 b ! #.$.$.#.#.#.Y i 1 2 > , , , > ; %.%.%.", -"%.%.@ q > 2 2 2 9 q e q 0 o.$.+.) { #.#.| b 2 2 , , , , : X %.%.", -"%.%.4 9 2 2 9 q e e s w b O.#.( m x I @.$...f > > , , , : & %.%.", -"%.%.8 > 2 2 9 e s d g a P #.#.L x l a [ $.#.A 2 2 , : , , ; %.%.", -"%.+ 1 , , 2 2 q e d g f / $.#.T n k Z o.$.O.M 9 2 > , , , ; X %.", -"%.* 2 , , , 2 9 q e s f X.$.#.O.O.O.#.$.+.Y g e 9 2 , , , ; o %.", -"%.* 2 , , , 2 2 q e w n O.$.[ R ( O.$.$.[ d s e 9 2 2 , , ; o %.", -"%.+ 2 , , , > 2 8 8 1 G #.#.T m m N ] #.#.~ s e e 9 2 > : ; X %.", -"%.%.> , , , , 2 < v B [ $.O.m z z s b #.$...g e e q 9 2 ; = %.%.", -"%.%.= : , , , : 7 ' O.#.$.@.C j p u ~ #.$.} g q 9 9 2 2 ; % %.%.", -"%.%.o , , , , : 0 G ^ .$.#.O.X.{ X.#.$.#.Y e 9 2 2 > , ; %.%.", -"%.%.%., : , , , 2 2 2 M O.) ] #.#.#.#.O./ d 9 2 > , , ; = %.%.%.", -"%.%.%.& ; , , , , 2 ; Q ..g F O.K A H S s 9 2 > , : , ; o %.%.%.", -"%.%.%.%.; ; , , , , 2 E _ d ' ..d q q 9 2 > , : , , ; = %.%.%.%.", -"%.%.%.%.%.; : , , , 2 q d g U J e 2 2 > , , , , , ; = %.%.%.%.%.", -"%.%.%.%.%.o ; : , , , 2 9 q 9 q 9 > , : , , , , ; = . %.%.%.%.%.", -"%.%.%.%.%.%.. ; ; , , > 2 2 2 > , , , , , , , ; = %.%.%.%.%.%.", -"%.%.%.%.%.%.%.%.= ; : > 2 2 , , : , , , , ; ; & %.%.%.%.%.%.%.%.", -"%.%.%.%.%.%.%.%.%.. = ; > : , , , , ; ; = = X %.%.%.%.%.%.%.%.%.", -"%.%.%.%.%.%.%.%.%.%.%. % = ; ; ; ; & O %.%.%.%.%.%.%.%.%.%.%.", -"%.%.%.%.%.%.%.%.%.%.%.%.%.%. X X %.%.%.%.%.%.%.%.%.%.%.%.%.%.", -"%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%." -}; diff --git a/share/pixmaps/bitcoin64.png b/share/pixmaps/bitcoin64.png deleted file mode 100644 index 08c676ae4afe56ca8baf2a517ef3b598e82a79f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4592 zcmV z-FyH4y?^@U_+qw6lJ^0o%&)@EOf7F!9Rk8D{ z*Ty8)rNtCAq(|@7W=2;CYe2@^|$5*`Veq zKY-SE^Z$$(cP26BqlWe4_jcsQYNh zMmIL3MU7UHqN*{?w!0d(j{K0!}B!#R7pj#AmxolaG_w$7z);P z{%F3pw=}f$0DONSNUCA@`7zLv8BujQVNBej=ez>MZ~UZK!MXg<$Fqk7*Q^_tZ7CdY z6emqlT^~T8zL%x@(dXI7iI$wv#+u|Y*{f#xgoxjy-~N%Kem~lyXOm)ASPI9Pq})*$ zxhD~TU(bN2`y=SVXhYbE4zFbff+c%|>1;yyO7Yu#4!wSisQ2Ff?&zoWs_|!}ys>y< zcLq4ppMXo4GHC1oKj-)2Yx;E~&g^(QXga6GJ$F;&`kYRTiK84x@xo~J0Juzdih2fv zM~6xnZF(-3FVSQ|AH~7Fik>?0{2!WJ@>SsNP77P+bl`Jc$ z`*|f6u-Q|mA@RxGtPA)4Adzp(7+2OUbb&nr-id%ssXkyy_JmHPF;bm@hfqpMsu5HI znFZt|Wfrid)9cW%Cb0C5GJ(aVPhDzMk(4`{#HU9QM>D1Rf-ZXk)a_UZTGb>lrUyZ1 zRv0%(2s|g8nj&&WCbJ;J1q;{-LNIGr1{AO++;b;NUGI~t#w=ml_W(H2og!*n(;u$w zPlTqXCTMPMhAWjjz=}~fWepQe59qVTf?<6ySVT$93S}0!&;mIf$O+%X`MpoQLJv#i z{rU4l#$yXhW$wE*G5+Eafd{av2eJi$A;k~W$G3qbNno{Fq4D%SkP0H8J!1sa94P_y zm2*&Ekqu3o=Ln%?77Qh!bj1QPeoxjsk7&g3&po03qaCWqtJtTzU(Pt<##DdkSnCVz zDFK4=oa;dZs6BlcXs=eojT<+>WHLd^=c|bFZ8q1W`ow&R%qOxKstbe$WD;8 zz?~rIlYDChhVPpS51svF^hzmbB<0p^fvJ)xDu{jt7Dnf4B)n4)dERj!~wFYHF%L{rOtZ zRqck(&Q7>~{W`SPeFL_FXcEH4&y&GyHbYle7ieovg0yKeNV(ynBCrF3sARI@yOj#& zRNt<-(ZBKiu2rFTP2#8=^u7!56me2$?%pU;7A$es$`c4Qf~1I|5ioQJQ5>UBX3*Av z_TXC3Y+nG))fM73a!%9HT#)i3Xd0x7pbE9KfE>-NbZu!qa3S71OJH(4`g39)_p;`W zvEg8&C~y+DuCl-dp#^j84ua-wuS4U}LTIWz1xBNh9C7nucZ$VgA(o&his#4ytp^jp zoE3_O`lGU!#Sm_ehPrHyWb+4Oim&a3QI8CAR|_6Ey)rxwy{@3_gKq-v*u91E3_l8~ zI})VASg>uF0Idg>gQ0_R8{9a^SsiV9Xsjv+^|rUbkTDD_nIUp2WDpD7PKC}?Z#cf# zCr)5U!B&;j{lnZjeSzK26|?Mb3MAM`gy znt&P%2Kt-R#s0cr1c_q9sXd_2oeUNfKyHqh1#UQiO}ECUT3~b47u=_MJs^^DKO?}N z;|{|LM?5o#=@?2;A$sP9Q{*XU^CD2#BEeP|1J=AKXv?1p&6;{g2T-oJTsjJ!W%EH_ zfx>udCp0x&rc`iD7kf%*>n}swhG(gbMu!s%+%JoMU_usTyfPq?SCbTv2hV&wY&o{0 zOnHvDOm(>~tEhGDE>pP-TtqxS5~&{zHm1KNHv%*}--eEk4sbX~?VBnKz_#T%=-T!? zbnToC(yl*4^PyyDY1Wa091dcG`pQ|bWZ}7G1lhHK&e0tfSkM7qFZTXOU{s|4D>3~Z zQ>TW1W~V>pe1<%%$W$MJCL%tPfD_$C#0%`e$D>UI+s3EBlp6)=!#N~$4hK=YW8Wg^ z+WsQi3*EML2G}-F2V?01XhkOwV`L_f6PwGIh=>vc<-UNN;IbOjt@Pgi@|eE;l+xh7 zUH=<6u_Gf~YekwdbvO-(1swfhg6?P>aiTf{FA~5fAn-|G+cX(%Di{hTL*x0wju9nb zO_&n4(!U_^KSI}zmxTj}3AU{>!HTJ)JHClZro%x_Y&=?k?2{{kn=LXmMJb6g*FAFDC}vlA_MfBo`>cp z9gCYxXYIKI(6xImQhyfOzoQdgLI?a2?GIoomV%f(6sy{4%d1rLOSdhNR%Vieqm&m%~hv3c=j;*jW%k0!XQ_QKZ5Ya)M#Q)6jU~ zh?AltFnSIv0kK2h(hN=NIxLk}>3>WSr=CId3fgaW(D!57F$;z}E}fx?ChhhPs97<#A%esLD{4aP#+jJ^S|>0Fkn)*l0&)o3 zEghwAX@bVDx060dm}cU)#Of3eO2kN+1ym6f9ZH)vdH^+ ztOZ;K$59oqgprkqH{`fob07`n=^ z1nye^mII5RM7gh{O!sxoUX?e32 zsAwJ_7T`h(v=vNo%6|b&cm5CpenqstT>odGy@d86b%N&7{{Vecqto~-1XEkN0V6L; z?j#|&oC;%{SfDg68&iDXo5h1xE0w`tRes?2SCxV-}W;iW} zX|~TN<#z7>^SS}=B;eEvV*|up;PYU`QmU&ga%zG^YG|&UCV@qUu>+#zMH5~+b6zwd zL4;1s|BkgjaPS?^`2y>$TjBrmnADN#ufsRHWP#iw2Z3>|H#C&I4z=e`K*Ql&P?sZ> zubyH0%lRzU0XshX0D-^2;HmS&$j^i>9Exmcru=cB{UX^(I|P$-I1$=PPz-tYVDM;E z5gf{5u+yMqM*3@4`)Equ`0WIxR=C&PsJ@S@SNrX^uJd8AuC<^OS_CUlNmr&1J?-& zG#alxgo{eRDGkyv#42z2=q{m{Yu?4Ty4k!I4EqTQU#o&sJbf*NVI+CUBGEwA6(R z5p|yyOm){TQKe9y+zlG+81+pW0?MCrN}u-9zj5iKy+Z=ddj`BvGn5A-Vbm2;pgIvl zTe1(N&FU8+FuGh4(RJx~?r9jD*`r4|{D%c6)( zK@>%)_0Vd2MDfuA9qp}x-cI^(o3tVDTJ=>hZ=WNm&q^PJCIh$941neU+|k-G`bXX! z=z39ldqNFM#(22q2~m zISSuLY`{nH9MN7=eGCj+=McllxqRga*LpIhy21!d3n8|bM)mRfE?Z>1FUNbSEbco% z9+WUTVn3lhJq$E;=S2!o&bJ&)L<&cPDK8pYutXww0@-?M3$#?EfcAJXXit}e78@mP zRT*fHZ?Mz*XMqpz$*iHjQ*)5o+^dzPniX;Mfdfyr21ZW$pRjfBnK9l z)BHe}{|rSCX-tA=-0^3y<%Fa9&!hkC`+^cSKiEFYt4TQRkrl@BqDQFQ<7Y7Nbfvl9 zx%F*Xa28W0O;1@_whBmzpyU-g$j+B^+R8KI#5EJ5D? zyK)N0+erc_n_R~!&spF&;@o_>jyiXKr2NO;9k@bZ`QF>(tw}z07B^YI-65ree#>0Y ze3=amm#d(@ax+LcAsSSpq5j-q`+5LqzY@KD1n>BS3h)d(kbw_XPvHZ$ioCUWIyEp>?A_~5?50IhtyT+7`#+ZJIX5w^>}Vp# z6(jDN`ib7KZq{S50z;24kvXx*W3l*Bcl3aFlH`q)OtkD_yni4p63km>fv$Whm^aU0 zWe>WkmZP}_uBiHY1Yhya6N_2+dfkzWq%JP^EMh0PIW9YtMHTHJIkc|4*UwjiQ7!Kg zaCyZCQx>Y0cofPPN!`KAl^ECs33^Yv6a|X}DioAp+uj}^+{P_<(<;&!L zhzlia;yp{*39hw3W&s%s9GA4gjsn+%>x_x^4Blgx(uIc@!E`Tsgs?wSZVa zkGz-1pef=#iaHA(<^0LT1M}p_--U~%zgjf#Los41_X)%T9!(Lrh`Mu0>k;L}?>Da@ z!HbhGmcEOZ%a^>~?|1bpz0Mg^=!6tlK;x+s@SaEA2d=~qsw$ZG*fjZa`5)Ki zJ3@727>XPLH+=oRN7j;O9}SjonfZy`G_`Q*BZH6peZbPXk3Fk|G7D#z-0UQ|hbLVz z;O8*fl;c==st&(1Anvb|`uaQGH1(6eZ7yrhzm7Y)aKQ2lAA0Q3BzSAkAvc6@8PG6Y z&@p8AH$6wAt9VbtN-xd1r5<~}#Ls5T{uig)=6-fJPQDt|r~lSB`c2;d-~HeG>b)n{ zocv&55jHG)FD@TcQN3(X#kn}oy{8s?6ya-$`~KGdtxw;0e9FAYKK+028z+Ccb@mtg a<@g7UP5S@EeV0D~0000 c #FD8E0C", -", c #FF910E", -"< c #F98F14", -"1 c #F79117", -"2 c #FD9314", -"3 c #FC951B", -"4 c #FE9A1D", -"5 c #CA8E22", -"6 c #CC8E2A", -"7 c #D48D23", -"8 c #C39223", -"9 c #CE9925", -"0 c #D19C25", -"q c #D19329", -"w c #D5992B", -"e c #DD9D33", -"r c #D69F3C", -"t c #E29425", -"y c #E79925", -"u c #EA9926", -"i c #E69A2C", -"p c #F79625", -"a c #F99524", -"s c #F79825", -"d c #F89825", -"f c #F3962A", -"g c #F69B2C", -"h c #F89B2B", -"j c #E19F30", -"k c #EE9B34", -"l c #F49D33", -"z c #F99E32", -"x c #F39F3B", -"c c #DFA731", -"v c #D7A43D", -"b c #DCA63C", -"n c #EEA328", -"m c #FFA225", -"M c #FFAB26", -"N c #F3A529", -"B c #FEA429", -"V c #F4AB2A", -"C c #FFAC2A", -"Z c #FFB325", -"A c #FFB42C", -"S c #FFBB2D", -"D c #E3A335", -"F c #E5A438", -"G c #EDA03D", -"H c #F7A037", -"J c #FAA135", -"K c #F3AB31", -"L c #FEAB31", -"P c #F4A13C", -"I c #F9A33B", -"U c #FDB432", -"Y c #FFBF37", -"T c #FFC12F", -"R c #FFC230", -"E c #FFC03E", -"W c #DFAF41", -"Q c #ECA34D", -"! c #EDA84E", -"~ c #F2A343", -"^ c #FAA642", -"/ c #FAA846", -"( c #F1A74C", -") c #F6A94F", -"_ c #FAAA4A", -"` c #E7A451", -"' c #ECA754", -"] c #EFAA56", -"[ c #ECAC5B", -"{ c #F3AA52", -"} c #FCAE52", -"| c #FBB056", -" . c #FBB25C", -".. c #E7AB61", -"X. c #ECB067", -"o. c #E7B36D", -"O. c #EBB36C", -"+. c #F2B163", -"@. c #FCB460", -"#. c #F0B56B", -"$. c #E3B274", -"%. c #EDB672", -"&. c #EDB877", -"*. c #E2B57C", -"=. c #ECB97B", -"-. c #E4BA83", -";. c #EBBD83", -":. c #E7BF8D", -">. c #EBBD88", -",. c #E9C08C", -"<. c #E7C496", -"1. c #EBC393", -"2. c #EBC997", -"3. c #E7C49A", -"4. c #E9C69A", -"5. c #E3CA9D", -"6. c #E9C89E", -"7. c #DCC9AE", -"8. c #DDCBB2", -"9. c #E3C7A2", -"0. c #E5CAA3", -"q. c #E9CBA3", -"w. c #E5CEAB", -"e. c #E8CEAA", -"r. c #E4D4AC", -"t. c #EBD2AF", -"y. c #E7CFB2", -"u. c #E1D4B4", -"i. c #E8D5B6", -"p. c #E5D7BB", -"a. c #E9D6BB", -"s. c #E5D8B9", -"d. c #EAD8BE", -"f. c #F0D6B4", -"g. c #DFDFC6", -"h. c #E3D6C1", -"j. c #E9D7C0", -"k. c #E6DAC5", -"l. c #EBDCC7", -"z. c #E5DCCA", -"x. c #EADEC9", -"c. c #E8DFD0", -"v. c #D7E2D9", -"b. c #E3E0C9", -"n. c #EEE2CB", -"m. c #E6E1D4", -"M. c #E9E2D3", -"N. c #E4E4DC", -"B. c #E9E5DE", -"V. c #F4EDDE", -"C. c #DFE8E6", -"Z. c #DEEEE8", -"A. c #DFF2F3", -"S. c #DDFFFF", -"D. c #E1E6E0", -"F. c #E8E6E2", -"G. c #E8E9E5", -"H. c #E5EFEC", -"J. c #E8E9EA", -"K. c #EAF3EE", -"L. c #F3F3EB", -"P. c #E7EDF2", -"I. c #E8EEF3", -"U. c #E7F4F7", -"Y. c #E9F0F7", -"T. c #EBF5FD", -"R. c #E4FEFF", -"E. c #ECFCFF", -"W. c #F4F5F4", -"Q. c #F4FFFF", -"!. c #FEFFFF", -"~. c None", -/* pixels */ -"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.F L h C C A A A A C C h L e ~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.D N C m d d a a p a a p a a d m m C N j ~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.- K M m a p s d d d d d d d d d d d d s p d m M V % ~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.Y M d a d d d d d d d d d d d d d d d d h h d s a d M U ~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.E m 4 a d d d d d d d d d d d d d d d d d d h h h d d d a d M U ~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.C 4 a d d d d d d d d d d d d d d d d d h h h h h h d d d d d a m C ~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.~.~.~.~.~.~.W S a p d d d d d d d d d d d d d d d d h h h h g g h h h d d d d d p a S c ~.~.~.~.~.~.~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.~.~.~.~.~.v M a s d d d d d d d d d d d d d d d h h h h h g z z g h h d d d d d d s a C w ~.~.~.~.~.~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.~.~.~.~.r Z a d d d d d d d d d d d d d d d g 4 : 2 h z z z z z h h h h d d d d d d d a S q ~.~.~.~.~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.~.~.~.b Z a d d d d d d d d d d d d d d h h 4 x $.l a z H h h H z h h h d d d d d d d d a A w ~.~.~.~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.~.~.~.T a s d d d d d d d d d d d d h h h g : $.R.T.7.a B x f > a H h h d d d d d d d d s a R ~.~.~.~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.~.~.U a s d d d d d d d d d d d d h h h h z : e.!.!.p.2 3 8.D.5.' a h h h d d d d d d d d p d A ~.~.~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.~.U M p d d d d d d d d d d h h 1 : : 2 h h p B.!.Q.%., l J.!.R.-.> z h h h d d d d d d d d p C N ~.~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.~.S a d d d d d d d d d d h d 3 7.r.O.G p ; k E.!.T.( , [ E.!.T.~ 4 z h h h d d d d d d d d d a S ~.~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.V d s d d d d d d d d h h h 2 l E.!.Q.T.m.:.q.!.!.l.: : -.Q.!.c.a z z z g h h d d d d d d d d s m A ~.~.~.~.~.~.~.", -"~.~.~.~.~.~.@ S a d d d d d d d h h h h z : *.R.!.!.!.!.Q.!.!.!.V.,.Q d.!.Q.1.2 I z z h h h d d d d d d d d d a S X ~.~.~.~.~.~.", -"~.~.~.~.~.~.U d s d d d d d h h h h h g z a [ 5.M.Q.!.!.!.!.!.!.!.Q.E.!.!.Q.&.; 3 J H z h h h d d d d d d d d s h C ~.~.~.~.~.~.", -"~.~.~.~.~.~.S a d d d d h h h h h h z z z I d > < %.W.!.!.!.!.!.!.!.!.!.!.!.W.s.[ > 4 H g h h d d d d d d d d d a S ~.~.~.~.~.~.", -"~.~.~.~.~.i M p d d d h h h h g z z z z J H I I J > x.!.!.!.!.Q.T.E.Q.!.!.!.!.!.E.u.f 2 H h h h d d d d d d d d p C 7 ~.~.~.~.~.", -"~.~.~.~.~.C a d h h h h h g g z z z J J I I I I J P J.!.!.!.!.d.P =.e.G.E.!.!.!.!.Q.Z.f 2 z h h d d d d d d d d d d A ~.~.~.~.~.", -"~.~.~.~.~.A a h h h h h g z z z J H I I I I ^ / d X.E.!.!.!.Q.1.4 I J I ;.U.!.!.!.!.!.N.1 h g h h d d d d d d d d a S ~.~.~.~.~.", -"~.~.~.~.6 C p d h h h z z J J J I I I I ^ ^ ^ _ a 3.Q.!.!.!.E.#.I . ._ 3 ] K.!.!.!.!.E.O., z h h h d d d d d d d p A + ~.~.~.~.", -"~.~.~.~.i B d d h h h g z J I I I I ^ ^ ^ / / _ h k.!.!.!.!.J.) } . .| .3 6.Q.!.!.!.Q.q.> z g h h d d d d d d d d B t ~.~.~.~.", -"~.~.~.~.B d d d d h h h z z J I I ^ / / / _ _ ^ ( I.!.!.!.Q.d.I . . .| .d 1.Q.!.!.!.Q.q.2 z h h h d d d d d d d d d B ~.~.~.~.", -"~.~.~.~.C a d d d d h h g z J H I ^ ^ / _ _ } J %.E.!.!.!.Q.;.4 _ } | } J f m.!.!.!.!.Q.;.2 J z g h h d d d d d d d a A ~.~.~.~.", -"~.~.~.~.C a d d d d h h h z z J I I ^ ^ / _ } z 6.Q.!.!.!.!.n.<.&.+.{ ) ] h.Q.!.!.!.!.R.~ d H z z h h h d d d d d d a A ~.~.~.~.", -"~.~.~.~.A a d d d d d h h g z z H I I ^ / _ _ z k.!.!.!.!.!.!.Q.E.I.F.F.T.Q.!.!.!.!.E.9.2 I J z z h h h d d d d d d d A ~.~.~.~.", -"~.~.~.~.S a d d d d d h h h z z J I I ^ ^ / I ( P.!.!.!.!.Q.Q.!.!.!.!.!.!.!.!.!.!.E.w.d J I I J z h h h d d d d d d d A ~.~.~.~.", -"~.~.~.~.A a d d d d d d h h h z J J I I ^ / h O.E.!.!.!.Q.f.1.z.Y.E.!.!.!.!.!.!.L.! , ^ / I I H z z h h h d d d d d d A ~.~.~.~.", -"~.~.~.~.S p d d d d d d h h h z z J I I ^ / d <.Q.!.!.!.E.+.d _ +.>.k.E.!.!.!.!.Q.s.P J _ ^ I I J z z h h h d d d d d A ~.~.~.~.", -"~.~.~.~.C a d d d d d d d h h g z z H I I ^ d k.!.!.!.!.J.{ | @.} I I O.H.!.!.!.!.Q.C.l I ^ I I H J z g h h d d d d a A ~.~.~.~.", -"~.~.~.~.B a d d d d d d d h h h h z z J I J x P.!.!.!.Q.j.I . . . . .B { K.!.!.!.!.Q.0.a / ^ I I J z z h h h d d d a A ~.~.~.~.", -"~.~.~.~.B d d d d d d d d d h h h J h f 2 ; [ E.!.!.!.Q.1.I . . .| | .d 4.Q.!.!.!.!.m.z I ^ I I I J z h h h h d d d B ~.~.~.~.", -"~.~.~.~.u B d d d d d d d d h h z , ' v.q.X.M.!.!.!.!.E.#.^ . .| } } } d >.Q.!.!.!.!.F.x J I I I J J z z h h h d d C t ~.~.~.~.", -"~.~.~.~.7 C p d d d d d d d d h h : y.Q.Q.Q.!.!.!.!.!.B.d B / _ } } } J 1 k.!.!.!.!.!.c.s J I H J J z z z h h h h s A + ~.~.~.~.", -"~.~.~.~.~.A a d d d d d d d d h > ` R.!.!.!.!.!.!.!.!.L.q.=.[ ~ z h h l 0.Q.!.!.!.!.Q.q.2 I J J z z h h h h h h h a S ~.~.~.~.~.", -"~.~.~.~.~.C d d d d d d d d d d > ..g.Y.E.Q.!.!.!.!.!.!.Q.E.T.B.k.a.d.P.Q.!.!.!.!.!.E.[ 2 J z z z g h h h h d d d d C ~.~.~.~.~.", -"~.~.~.~.~.y C p d d d d d d d d g 3 > l [ <.x.W.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.Q.z.> z z z h h h h h d d d d p C 7 ~.~.~.~.~.", -"~.~.~.~.~.~.S a d d d d d d d d d h h 3 , > ; =.Q.!.W.T.Q.!.!.!.!.!.!.!.!.!.!.!.Q.A.g 2 z h h h h h h d d d d d a S ~.~.~.~.~.~.", -"~.~.~.~.~.~.C h s d d d d d d d d d h g z H : <.!.!.t.l &.V.!.!.Q.Q.Q.Q.!.Q.Q.E.b.l > H h h h h h d d d d d d s m C ~.~.~.~.~.~.", -"~.~.~.~.~.~.X S a d d d d d d d d d h h h h p N.!.Q.=.: < c.!.Q.2.&.e.a.d.i.6.[ < 2 z h h h h d d d d d d d d a S ~.~.~.~.~.~.", -"~.~.~.~.~.~.~.A h s d d d d d d d d d h g 2 ~ E.!.E.{ 2 [ E.!.T.l : 2 1 3 2 > > h z h h h h d d d d d d d d s m A ~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.~.S a d d d d d d d d d h h : -.R.!.B.h 2 =.Q.!.M.p z z z h h z g h h h d d d d d d d d d d d a S ~.~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.~.N C p d d d d d d d d d h 3 ' 2.N.9.2 3 z.!.!.q.> J z h h h h h h d d d d d d d d d d d d p C n ~.~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.~.~.S h p d d d d d d d d d z 3 : p l J g 8.T.S.O.> z h h h h h d d d d d d d d d d d d d p h S ~.~.~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.~.~.~.S a s d d d d d d d d h h z d h I J a P o.P d g h h h d d d d d d d d d d d d d d s a S ~.~.~.~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.~.~.~.* S a s d d d d d d d d h h g z J J h 3 > d z h h h d d d d d d d d d d d d d d s a S * ~.~.~.~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.~.~.~.~.$ T a s d d d d d d d h h h z z z h g g h h d d d d d d d d d d d d d d d d s a T O ~.~.~.~.~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.~.~.~.~.~.& S a p d d d d d d h h h z g h h h h h d d d d d d d d d d d d d d d d p a S # ~.~.~.~.~.~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.~.~.~.~.~.~.8 S d p d d d d d d h h g h h h h d d d d d d d d d d d d d d d d d p h S = ~.~.~.~.~.~.~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.S A a s d d d d h h h h h d d d d d d d d d d d d d d d d d s a A S ~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.0 T m p d d d d h h h d d d d d d d d d d d d d d d d d p B S 9 ~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.V S m a p d h d d d d d d d d d d d d d d d d p a m S V ~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.o V S C d p p d d d d d d d d d d d d p p d C S N . ~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.5 C S A B d d a a d d a a a d B A S C 5 ~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.O t B A A A A A A A A B t O ~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.", -"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~." -}; diff --git a/share/pixmaps/check.ico b/share/pixmaps/check.ico deleted file mode 100644 index 0c4e6e81473d47761346fd71e171a807bda5ec58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 766 zcmdUtAritc5Ji7?>Oo=IK{2@m+>AIRcZlpMaugJUL?RfLzb&Fm5tZVcTcTu78nlc+X79T)o9yH~Bu18~wK99d`Ux|y2#0TZ_)l%(v!!U*NL^S< zm%;~9QW>8Y{WOqh07L_>g8?ux2p5ho`>mS)zJ7(U{lP|D~JDgD=JKGfP-=5QO^Sl3}KqqQA{!l0}l_@^5qPWEU2+A_-M zkIFJNQ5&sM<5z#gY|dHIub@Ri=cdEil}ciAuQ$0ji803H-dpX{_ZU*7?QVE)?mg#y zo^#LhJcqG7`t9D$=>8VF_y%Kp7-J<=G(;oWar$G7=3c%4ugrl+2xwrfsn`C7}pI=t1vbuV7AJ7ZGXTs`nOoa zdwB25*hC`n=H)*GEAKbiQz*Tmp|p*c3X^ReM&dI3tl-jcz{-2KbEHzKomXxzHyCXx z80{HUbY%47{p;#CZh7saZXE|4D$K1a_`Jay!g2EG`KU1Oe?2mvM+V_?}G7t2o;mx~;@k3LF!W?@C+Jy3s~>TN>y41^nk1pePD1 z{+`Ac14+#IV+aO=I60U>Wv7M%H!?8)64%?wqwk01zWt<;k=EYdnnAfefwKc)NRouk z=~Z-0%81A^+V`zu4|(MUH9pZ2IY(YJ~~P{g7j zqjyTiYa*MKJHTWcL@7FaaZ+fIMlg@(YY`lg?*`3szsGfpe6QmW54g*n2&WFM9;kyF)nA72hmxOK+M8TS|4+8-9@= zj^|nAnY8-C*26B+m^><`zI~09m8NxCTiwb|MTd%??uK8-3kY-=?14Z6gezu;emph#-v={7pDzk`*&1DYAyyEHXW$?l z4j(ykWbWL#{rdH5+O%oas#Pl$|7z5z(V;_!?Ck85Cr=g?6?sQEaNxi<>bGgrCNCx$ zjc(t*edy4k&6_v>s`%HqapN96dgSEfFli(bFNfR)FfBg7y z|Ni}@)evl#Wy_Wo78VK~V)W?I8ph6&RS?vRb9Bv@1bzDSY3T?t zc<^8i7(RTsZha*h5BbZPDYvN=m6?7&D>U_RVNr=B+{`0JjL_U=rl(DtCVmxtiW76a zR+rjG@6Ld9O#=oDkiqeaFU32+ph1H~QI{`Y*1alMuFM-Z zCK%(7Fk_hxf=AuAL4yW*J8NVHdg_a|br)klo%Vk#P}Do&;CDRCs#U8rcX+cED^_gT zvIVYt_Ux&f9KC$`a$$wDNCQTV8YNAaE?v@1(2P88+_>D_+}X2d4;eB9`xhhW+_|#> z*Q!-(?AWoKLO9qlW5zUV)@Zm%u=^PU%Pfq14=`e_|m+4MZOmJURLP6siEfUqy2V9MP0tcPqIS)KKH_@ z;s6bII7!D5zH8sUeRb>B)qrZ%s-YhT;8@U2#4EBp&z(D`o1jh5gG8NgB>uo8G?*E2 zZdxh~`|#mI_l9`F;BngGW^diP)w*?SJsNxG&Ye51FMCHfaYD*0#FlshndK%XvT~gZXBG5 z?u-AFO=mnUFxjfEZ|~l{bzj_sm$y>9nSH#_*R%%iPP)h1D@`N`pK|Z1J zBtznp1&jyQ7{V6}iPke`&gl2hH*cn@Cn(dbMIZ0tlqd=*uO^L~F;jqWw3&lgJUh?7Cj`QMOO752lB1JV}`%361kah`c!P5;@0hM>kH^ z;Z$&gg=pS=xg#9Wn7)1cy19&rqBjX#@iw{(0g&$!4Ml<55*8?5|nTIlkllr1p^ zRySZ*;b-&11U(<;gqNI7>G96D@t;rk@u*dnhuzHhA}So3{cYQ}8KzA5BA$f(tvf=C zMAxlbr<)ozY9wL49-Q5*VbIz(G}6&{X{qA4j#P}iFcZFze>#kDiKto>AE&u`$EsvSEMRg&!UMBOKNc1l5wY0dR)g| zy?SNljyD8A8+dG+d5-36LAu1WvJZc(pB8YiZ~(1^Ti*RC4xD@(k( z#)ua=Pw89m2IKnM|FU%4HF@5lOmu+*EWp;(WC& z5;9JYWKxV@FeXr=l;N75K7C3lO|NCgjvdmAN`h{Zq|^b-ytr2BSUN%k?&)C_2vCiJE!CCAsB4ySEuNNf`s!ITtq6S0~emSyT;&EXGH z#w;D-Rh_({h=#6Y81z{XNjR{b5zd=LLAEvHQ}oyC z1}WDDX5&%>Ab!$6DVY*m=s}>l>e#t+Cy|6(7kcB7OBDBLgbkkk;;s{L5cB5EGoxv* zNTEo#;u2-k!JBR(ttHV#jQ~h}i2`&hD|O72`tOJ7eJN_mJ(Y@JaHp8%N7wD?kZG`kaKu|}Ms@rP~^I_%&I!31pR+%3z*kXita#;rLm;o?x57l6I- zo^;2Zx}4ii-YAMYDT7C-h}p|9ePvt0n8{99CQEP(lct#CouyH;!K%$JW@;o>YVA4T z-xjBJiRh%==G2j>Gl@gDQ?Bx#8(+jaqCg$fFa>vdMkMJT5vm-9jyEn9G?-gQ_nyq! zB+eS79izFzKF!c|^uRLNHCr+GjUF7e~ znKK0d(XnGk@lIrty2(ouPRTepL$7t2E@Y~LM~x<;GGHFNbm{W^`E%(4K_ra-)JQI# z1z?g74byb@?%mBsmJ!ku-W*>P=!o0jCRG-VQ4L5|P2EV3!wI4sgLIFQ<2xkY#<&Z! zSy=%~$31#^G?zylt#XcWouHTQrBQ+&kZ@%4=FO&Vt$Tsjg&FXix+a2gc$PypAe`t~ zOqQU%BKruJ)T&i0J*lP<3yF*GuzCtF9m-T|tGOaVMlV4Oy&XL#FZRhS9}7f>IMVA+ zQl8e$hUJ($9bC}<{rkE4Wlc+$E+w7UL7L_fL6WNLA8#ChPad=YpovQ~QZ5zrfJ}tX zq_Dt^CDAN0qi)Sr5jls{fixbI;Hv;knrwi(Dnd;v43hY1q@&S*=D`I+8pbRbIn@Jr zAn;~(etfaQ{>m_{9w7}qD^1ONOmV5365D~BN#(7+5No_PDZ-Ka{A=XsP}jU=HnTf% z7t-{~1b)nz_ntj_UU{^4zawQ8zI5_BMh?TjFO9rEEyOLw{pax`canFEkHX1kN$a$k)8z3|Dz~ z{qKN9S7d{?3gVPfo34xgd7+QO(eujlsYJx^h?g*aPk;Pnz~&JTsiSgE7)jDiKGwEv zThq5(9;t%syJQm7H?79x?N{oT`CE*N|4Msj==5y9#V8py`F~C!6Ri`GXg~&A5AEFD<=Y+#CF` zv0;+sbl|t)J=GeW>Eq$0VpQhrp-H~g?_d0_K4ns8cwF(9@>_kwFRCCq!5Ya4xeVZ5 zo($Sx(mm3bWS`(*!h{J_eRxcVd`sRFbyF`RpCmfv0{AWADqtg!Kp=rY0)Yeq2?P=d rBoIg-kU$`TKmvgT0to~X2qX|lAdo;Hfj|O*1Of>J5(p$v1`_xm?S9s8 diff --git a/share/pixmaps/nsis-wizard.bmp b/share/pixmaps/nsis-wizard.bmp deleted file mode 100644 index 71255c6850b00ef1efea82fefd05ff736c90f816..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 154542 zcmeI5ca$8}mBwZN!PzAmV|($kEYU)HzzgiMm<0~3ut~<)1Y-;~HikWb@vfI-6TGaA zFYPj&Ts-}i2K z_uY5jZTAlQ*_WHyuj~2Of`5JacjK3uHTzPt^SN?f=bh24nf>pJS6W_zfFK|U2m*qD zARq_`0)l`bAP5Kof`A|(2nYg#fFK|U2m*qDARq_`0)l`bAP5Kof`A|(2nYg#fFK|U z2m*qDARq_`0)l`bAP5Kof`A|(2nYg#fFK|U2m*qDARq{2A)uS7LuzW>erwuRbLbkg z^CIJ|S^5hT^~XnR50B7p@2|G(r(WArxuUAr&p&rp{-d9L=R?D^UyjoF_?t8J4hxKd ztIR2z%{6F?qAO<&afx2>X6Aj@UwO?FO^$JmcwF?UugkWu1fK)YE9W zw6k(!AN9#G+Pib~(d*2uhb$5N5{QT2wfn5TD~#8s>URxPFYgiwa*K}ys7LT$oTSri z8jt=dq2rbFk)20VBkD}}MJ=N?i(?z*ztZ?y`>HQb(Fd(IcN`JYPYhwxO0C*sRV_9i z8>!(wMVZ0U+Sa^_@<@%=aiOttk40xIM{+YgrPnL=SncK+_YRJ?2)iEu7j;zVEM2DK z6+-&P1GW_ZaIi|>-2;`RJLx#x2LzzV4E`it9Me<7*P3{(5%Hp zlT=!l zo3p)4vojX%pB=Adf4f|l8G#ErD9=ySHysR+@p?T)IG0uXGIveBt{?(e_fYVZSpW51 zt24*HbATxA$c^*+hNz$J@J+yX9ZkJ5MK3tC)hum`l^=`|4A#ia7fn8_DO$-**sjA|9R?pS8_oocP-ed0Kf8xObrCG!08An;7BhF@Kfab{IF^cKAx12@e5 zP$7^$@3UNe-fgky?L@Jh84u|5-pfwtb5aXlnk3WbWD=cWoCpcaWDm#^M%*S=83sLF z{A9RzVhNXMPvb#u76b$VK|l}?1Ox#=KoAfF1OY)n5D)|e0YN|z5CjAPK|l}?1Ox#= zKoAfF1OY)n5D)|e0lyIVW@RLw_yt$&p7YK2%HOqD&TFTf)mk~Xt#W>QNkK^z0ye)N zC|_->oY|_L|Jl^Q2A1DVru?tHljUpe64lw*Nng_&d%V#`znc!G^xXV+o9-cNEbbJ;-E`q9{}Zsk7k5%#o@~o+ zL;Pm%aM^S)eMx6q!6wi?VSM^cUe&^D||unC#?p%~--@x1K8|yCS$gr;YMxjqX;7r_*AxgI2b| zJ>NFj-Nj^Agj}C6*;^uKvI)AV`N?-5ujj>zx`-DD41ZT-#r zHY4BaV&|GZK3eF(6dqv>OMnsrq-FU?FJP|{0wrTVWj83XqWwoi;j z-uZ#_hyWg9GeS4npC3*4TxQPPX6-zBGS}1%vyI-v%IW$8sou-YhlXniJE|Vl5hB!~ ze|6|4yHUz~xnapJi@LAPt5g`TWEuC@WP>Dl_FL(}-}8k{HxF62KlR*1gW=7RZs<}L zN&}j1vK`Or+&1)v}+)fTY=>03PC(mS(c?nVnrcc)Zv_ z9N-6rX)K&g*ktWj>=d;qzYZt}xNiGw6=uOpFxhy^r@d>-?>&PwJl@(3)~;jeXwzF@ z=zTEXU|z;h4^hy{|J7bi_Ka;7{w-N*5trWr1fTj=pXDYFMn%!>)nuOvSiFDhy4bYs zQN`G9uO>U*?B=!p-8qK6wNf-huYM@I&S1zAAp{(p~Oikuheq!KQCNlDejcN|w8iAcy!Uo8J#ktQKAHp}nT? z>^QyGQgiw4l>qVKzea?5B140dY8op$9l4+Ag>$* zj%)Jz5arS9S3COI;TQS6u9wYk`vu1A?babRr*rb_DF`gyWwA;U@c>IczfaYQ{GP(2 z%U_U%~6Jtnr<`wcl5K!uO}+q-2AICIuzMgDW~2+2%<@j1=TERH z^`?(iG^ZQU3;G^Aq}ff~eJpk>OKE65s;4P!$I@7rMFwkR*q{f7YTvC^nJ+Z2ve!oW zxuQzBzPCy#0472IJI!F7W#yj2)zUl@>Fxt>&N8B-#?Nk3&&El24G;M)$X&S8UKfM4 z`-f_Trzly;k~i+IlQK$#79m1y@@D3TUx{q6#7zDJ|1%Z(Znf5azOngWIY#*W&r{e+ zyx*Y3*3I+5;nu!trto9Pbmo0MTLPzSvD(cu9v`h=+e7__4{g?97FtnCc)6Zn1a>|` zml+=9jFAy>L<^R2Y|1TtqoT&~9O(P#^$`;7!&-XQcB{hz#xpyf6>kW`|EPt{Pq*Q+1vGw{Ce$0$@il%aOZX$ z2}+r7JDg_MNp#|+XtUo<3V#h_a7d+t>Hd>rgR|5-xAY>0M#5#ny2TzO%O0yBLV(w6~mGS+9=e1RC z?4yRh7#)_^iWB&)Duqp9LA=N^WvUnv_l%K4OK8uqwIPdkSfzvMJ|=bKxhxCio(i=UM=ATSQ@2_qmj*g{^vX4j z;b+c{0xpVTq)8_usqB9y=ywdTx1tkszN5d^XNAv8C*hjx-%bd`WE1*}8rO^sT$JC8 zKha;}dn_*WTVek9C;GqlQArbJD#{JS*_>!II-l7J;r;9}-1O_POg7yiQrGnM=RYBu zTr=fIV0$eyU!QJJoq)v!BG2&4l!TB=zIVZ!41k(-1yn(PmtDRSmdU0g>@RcKNKdy# zlWRm9Z3DlApz&1-@|$BCfau=Ajazy5;DlweDYx?K)IfCj;MFD>nX=pz(Lkjn^q<712vYo}gAed%~isyqt42vCqzZcK^2ZPi`C+6;H zFSE&Z;^EVRiH9%WlVS=JsmXOy*vDjF-X+E+8@-g7X}TYfF7IqN-$;xCXOP6&WRtEy zw&%Y3AoO>d7!(RTG21pBg%DGd&4lsVp6aT-e#Qr~<$Xk5y!UJt)b?>S*{Ig*K2lc( zMl>0lw^geID+(eO-#6oBvS}?u|6q_tS)Ob$^!J)+wOvxfr)0?JjE%UMY}!fO8?LEL z8|Y&FvfU}pi=^m8bU5;{CDAw8t$w`RbblgbX)2xI$zvn+WCTSU8ekDL*+f1Gh!L}5Uk|bFLqX+=o*Wbq%~YK) zO`e&~<~=$ln^EU1#j+^#i&6U6^%jY{Wq6^w*^88Tq8-vhG}(+aq!<&4u4aQC1x`CG zG}iAA(9O;nJazk1-yf)car`n+B>o~GlbyXtgrk+=7i?KpAV2E42|88fnJkx=VVh+(2R%R0U{yD}k%=do z4hCVeUz((o;Yo&@lP!blATx?ocCz4{0(z7$2<1gGEe*J)r+pqoVwSNyjZ)uDHUdlZ zi7YrWo&ImS!Pz=%_N7=;2=_(e#`fR7Z*SqROs;)5*}IOVCT_AmKN_tXOBaP?Go_NZ{u_@j`l;q z8SweYB=Q~KO?K!cx^DpMm~YKCSn|L#Pb9fHo$}peyN5a=cTx=G(#|S4`Eap$+E;5*nF*e9xq&{5xP^P!+r`@)?m8j#e*kswU=l3f`&$@dsOM z8C34cEy%dT0<~ZMrI-3?q0&H2*X@i?Y8un#h8hs}_kB0ny_OkY{%bvo*B5^C;U&?f zc^8$l1DZ~5{u4M^6|<86rO9~5cau$)!bP2et=WsieCI&zsO~@AQ@5Jv@T977-%WNI zY7}64D9ze+iT?!*_tq!b8xO){Q5 z*QgHCR;je+?<>kh?V7F=9Fy&Dt>!YAY(gvF?yem1yJBTzi&ZwAXy*xMykGy9nSSPT zm%(HcOe2I&blu-q;<+Y`_Q%8goUfL_WWzPP52%su?zAKWSeul|@aA<5yHd=^vv<(M*7whz2W<~4pCLgtT=27u7*~Iz+DjHAC zoW$?PkCDkn1>MkF-K+R7)KpWsrbm*K3^Sq~3zJPm_wp|4{LlQ4gk!I3H$>>b+zc;4 zTtwew)56O-tL)A3-6eA#_+OtSIpr*S%tYB_V`5k*<=pLn5|H3}>!B2ZI6%n8B&pYt zHQD4PBGH_&zU{F8Haeps{y3vjgxVRvQ8U?O4kOOj_f`k3_A}0t;Wu-^^bI#4!TI6& z3MwKdo5&SQmgEUj!l>0;V_yI+cZOx>;#XtrVhj0zB>0_hO*TdZ$wH862I;$GlZiItt3#46&&2WluL8!2{lHJRjB_fTJ$Xm9Z-PkB;EU%1nf@vI z_6v-;JFHL&-%-1gLe|ONo>_d*24S*q=%b$A$}U_Ht*+bV@AFnV;Rtc*xY0fa1y~E-hs7jXT%t*jwzvcJw=s9SI_-oH) z=0zP7curG>K2I0SdT@qAq$8lO-hMds>v1~MtIG7c3yuL+hg;9}KjkAJ23SIs5>rj@3&BY;0esKT^pQLF zkJ@-J_3{*h6Vh?RM4WTR2D4zeuBnT?P{Z=;(~ag;w$i2yOHMZ{{8xrOQ53XX)#7+t zYU+ePKT&6!04!I?VzkSldmy(_NQNj-*Z&7$z)UEv?1 zlueT_*UR^$IOt83cE%Xti&Ez^xN?8KuvXebsD6pELVIUATj3Y16yvn8`Moqe%lRn^ zVlXDDGwl9Lsa{**>ykOco3#vf$hrrxoOdFdR4ye=l+edLgEcIUr%?Py%gn@Yzsg~= z_^(7rT2`y#Mpe`xLiL6_cIAH6|NKhpdT&V6(ybwD;<5ehU@5 z!>Q(H$`%jag_!Idx=A&8b!sF6-SFrTn$yC}uQb(@$?hd4`&6mH6cS?cxAGhD$=%1& z6E|Bdm$**^ML(mZ(bXApb1u;Bk9slL)OaUYB(v-cjDDGH96Xi_hpsXIG{gAO5Us`W zGcs5pBNpe@#HQ0wS;TqvYO={!yslTV!IJ@@LM||l_`0Q;Y^J-E!>ZkAF)g~izg_Sj z>+c-sK%fSJVuo9_*n@>dMWd)2Lf+Bvo=o;rwH3D;t0DB9_dS{H48I&^^uRFW*Io-g zt93oLAlq$rp3JT{&~`7^zME`DnnYBx*>BWj7vz`HQY2nF@|*p%>}#|xTGV~+x0vi~ z^n$o9XtGP@H@k&sUA!ZFB=@2%COaEI->+?x-BuZPJeSO|zuEfPjr=K}h-A6Fl7j{%w zi4c<=JMKzoFyRqa7~OL%v+NQ;j>t!F&sc_V&$Z05BSKsW&A?=n5yT>+%a`x7?3H^{ zq)-y-DWUQ55l;x%Ci}zCOg8xsGq+isoh@8@Vy)zx%WSgYmo*o%pr5MMuj^$Wt6g%- z<%3=k@M^LfJ*zZ-Ejx!_XGagSd$!M`SiCk^?k^buuO|EWS*68x*r6y$KVz@fqMaw@ zSNJWNARj;I)ns#4DF;sw+i9o`xNx(LfN80G~<%Z}W;KpQA#g1Bb>=LDJA$!e)=;+YrsU;1W>}-CiPRRl* z8UTflP{%N!f%vmlC}u~f`A|(2nYg#fFK|U2m*qDARq_`0)l`bAP5Kof`A|(2nYg#fFR%% zfuD}hynaOPk0SyP3}qKg>Xj*a92+lfc8|bIlk{WyiCwF`ml>CLk@TAcBES)`-SW=I z;l!C+`l{}Sirg7}1a9i1PTyL1`{J&nsb^}%d?!S@e=$nidZ>|_e$;preI9+8Ez-h^ zJ1V3=yWEV-e#5&5iaw8}fPc4Iox7tEan2bAN3_(RXNrFwGrIpUP2aD0s1lP+`sB?f zrSglY3;9z-5V-kcb?o}WZdf*<#jhDB2sq^+BGM^oMm_?sP1ScFD^Z;D+5dEhb>9#X z@W>5#wmD2|U{;k+qWgDrGu3smadnT#^*4WQg|Ik2`cB8zHT4!=>M`QLRCmqpZMBCs_nK>Cos@1SKz~88DI~pp~-SX zOWHqm(uA1~k&} zwdRv!G!C^d((8))6HovMu*67Rdm08C57_5jVv@*%swieNou%V+9}s}T6Lc}X8I!bP zkJWCTac{+tPOb=@rOR|Yz81MDlIbXV>(u>^%9yOt3)|5xonLCfh)u}GXk?(I3cSQ>Nt}tGlq~BJp zUK$5?j%>`k2HN}*F=hpd^nS)cAinY z!Q6g0CH(q38VSm6Ib@Lq$6CPa)Ae7D(hz)XVxT%7oqT0CTP;5^Mtft1-gBujW1CGb z`p4hi$fZ*?|Pp#f-4*>KhsTyz2)L)or4}*t>*&_k#4^xbXB0tymR9f~^xtT@z z$46^?{H<9!9wWhC_D!IZS=sJ~LYQ7gH)G3saMH zyB~}P>RC^tqazJ22kKf^qtTH%)*+8HB(`iz!{JD6Ym}Tk7?DT0LLYf-R`9Lfu|hGN{Hh5!TD1R4whhJ=^V zS4W7?sJSvv_HRM}BgTY`h7z_r3!Cba8Q^tE($rUtjC@AJfm>U2Se|a=Q6{ASdcovs^b%O|_~O^A9J3 zo8Gy{cW=fyyV5$bWwCUxW^1*ko3u|Q!khV8bNYU6kCq$$b?M$c zXwEFX|G1o6qw%(MADT1u`ciJFjYp+xPCtD)5ti!rOE=q`nY3s1`n}Q>|Lf1qO_lCf Z2B?~wyHmPbfR5?STF&s_p4QyW^e;amw9xQ85j>RFfcv<;txRlgMp#`4+F#he?a^n U34{0`aiBa{9Y{S$UjqXJ0D?~%)Bpeg diff --git a/share/pixmaps/send16masknoshadow.bmp b/share/pixmaps/send16masknoshadow.bmp deleted file mode 100644 index faf24e0d8aa81faf80072c7807e52d749cad63c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126 zcmZ?rtz&=yJ0PV2!~#&v$iN7eZ~&8-#Q*>Q!Geqp3=E71fcOCre_&wv{{x8s0P#N{ U1}Xv5AU;qWBo9^xQV-Mz01_z}*8l(j diff --git a/share/pixmaps/send20.bmp b/share/pixmaps/send20.bmp deleted file mode 100644 index 2b90422b38467ae30a2b6a866adbf0ad3c3f97f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1478 zcmZXSKWrOi7{;GaLQNamP(c#|QaKSso$~KuQiKB~Sfms~DLR@G4onc1ZpoM-LzWCy zrW+Vekxuf^0gqWCdGvy0mVEN)Oz9FSLza-qkr-Zn=R}0i&wlRv?)Sa-KF@b{`Tn27 z8jRb|N;g@(bgCic2K=|7!F2A@wXWLMR;S-l%UasBO*O5lhBegf^^{nmZnvk{Vs*M* z)vd1NFwv^5s?+Ie*_N3*YNI7vQmfNe&1zceFR9&btA#=fRqNMS(;o#EsMUh^LuMEX z`hm(;R&W?-bCV3Ha#)dXz6w@Qv)Pnqp2A+J@_t##W}?cIic0$>h22o2HmXLWA%EXj z&T>i`iR#U|WKyYDQqT#cz7!|1>IwW%T5c>Wx1Up`g-^$q_F>7g^h631&JZt2J*nI* zs}|R!uH?1I5QkDn3gSSeMoE>pBDEzy@#Qr<`LVB3y(BO3REP`m>+sl9exSU(I()UD ze4X{Gr_uVT@~e48a>x`Fg^DObDS{W_5uDA4MHIm!cnV8lDJ+Gh8Kc(09o)ej%)xjU zk--dR4macD#A8bFIr(tUKP1JUD(39oM0*4yQ;KPdK}x0+@087yCMn)2-b^U-hU1^& zpW@FJqCVqfNXd{|mH@8e;Pen?uDkB#>=(#Rj30j=G8h?*3`Pbc1CJnjlEKJeWN>7l z4Wgb5Mg}8;k%86-P6i``k--RH_&b^z4;n=gJtFQSa@e4ERujonQ;Um>T3K1q`ue&y zHa4`qy{)aSE$!^=Xm@v4dwY92I5^PJ(UFdikM-Bzrr#ew*4o+{Zvdf^`qjovy#Co%$I+@J$@dB6B8f(^6~4>pU}%==y%-wtc z`osH^S7B4r)6+9EckZw;_raBil`&XhDx=xP?CkZot6ui($jfisni}w_EB+5zMp!mp zc<$!Ztz7BRSQc>pbPVUO41f0E-0{K-mo9vH_i9%4?^yU_=-W@Ty#E;s&wTgc|Io$i T{JW>;KP#Mn?J0D&nXUc-U3=Ry diff --git a/share/pixmaps/send20mask.bmp b/share/pixmaps/send20mask.bmp deleted file mode 100644 index f124d0da084e68cac62312e9fa8a0fbf9c7c5075..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142 zcmZ?r?PGudJ0PV2#3E44$iN7e2mq2o+z`wJ7J(4||Nm!TJix%f_yCAM0PznX{=>jv m|BrzIC" no_smgroup -no_smgroup: - Pop $R0 -SectionEnd - -# Installer functions -Function .onInit - InitPluginsDir -!if "@WINDOWS_BITS@" == "64" - ${If} ${RunningX64} - ; disable registry redirection (enable access to 64-bit portion of registry) - SetRegView 64 - ${Else} - MessageBox MB_OK|MB_ICONSTOP "Cannot install 64-bit version on a 32-bit system." - Abort - ${EndIf} -!endif -FunctionEnd - -# Uninstaller functions -Function un.onInit - ReadRegStr $INSTDIR HKCU "${REGKEY}" Path - !insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuGroup - !insertmacro SELECT_UNSECTION Main ${UNSEC0000} -FunctionEnd diff --git a/share/ui.rc b/share/ui.rc deleted file mode 100644 index 063641cba..000000000 --- a/share/ui.rc +++ /dev/null @@ -1,15 +0,0 @@ -bitcoin ICON "pixmaps/bitcoin.ico" - -#include "wx/msw/wx.rc" - -check ICON "pixmaps/check.ico" -send16 BITMAP "pixmaps/send16.bmp" -send16mask BITMAP "pixmaps/send16mask.bmp" -send16masknoshadow BITMAP "pixmaps/send16masknoshadow.bmp" -send20 BITMAP "pixmaps/send20.bmp" -send20mask BITMAP "pixmaps/send20mask.bmp" -addressbook16 BITMAP "pixmaps/addressbook16.bmp" -addressbook16mask BITMAP "pixmaps/addressbook16mask.bmp" -addressbook20 BITMAP "pixmaps/addressbook20.bmp" -addressbook20mask BITMAP "pixmaps/addressbook20mask.bmp" -favicon ICON "pixmaps/favicon.ico" diff --git a/src/obj-test/.gitignore b/src/obj-test/.gitignore deleted file mode 100644 index d6b7ef32c..000000000 --- a/src/obj-test/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore From a3e09f2117a7526785cff7406c37ba08b0f4e097 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marius=20Kj=C3=A6rstad?= Date: Mon, 8 Jan 2018 05:13:11 +0100 Subject: [PATCH 0394/1062] Changed http:// to https:// on some links Changed http:// to https:// on some links in code_of_conduct.md --- code_of_conduct.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code_of_conduct.md b/code_of_conduct.md index 959fbe4d5..acdf8537b 100644 --- a/code_of_conduct.md +++ b/code_of_conduct.md @@ -52,8 +52,8 @@ themselves available for conduct issues: This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.3.0, available at -[http://contributor-covenant.org/version/1/3/0/][version] +[https://www.contributor-covenant.org/version/1/3/0/][version] -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/3/0/ +[homepage]: https://www.contributor-covenant.org +[version]: https://www.contributor-covenant.org/version/1/3/0/ From 5befbed4bc4f074a799ec413f595eb21f6cf06c2 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 31 Mar 2017 10:25:39 -0400 Subject: [PATCH 0395/1062] Fixes #2793. Backport commit f33afd3 to increase dbcache default. --- src/txdb.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/txdb.h b/src/txdb.h index a2764b8c2..04ac8627b 100644 --- a/src/txdb.h +++ b/src/txdb.h @@ -20,8 +20,8 @@ struct CDiskTxPos; class uint256; //! -dbcache default (MiB) -static const int64_t nDefaultDbCache = 100; -//! max. -dbcache in (MiB) +static const int64_t nDefaultDbCache = 450; +//! max. -dbcache (MiB) static const int64_t nMaxDbCache = sizeof(void*) > 4 ? 16384 : 1024; //! min. -dbcache in (MiB) static const int64_t nMinDbCache = 4; From 334d591377896421e356dfbfb57c8f9022970cf3 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 17 Jan 2018 16:55:26 -0800 Subject: [PATCH 0396/1062] Add documentation about dbcache. Adapted from documentation 'Reducing bitcoind memory usage' by @laanwj https://gist.github.com/laanwj/efe29c7661ce9b6620a7 --- doc/reducing-memory-usage.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/reducing-memory-usage.md diff --git a/doc/reducing-memory-usage.md b/doc/reducing-memory-usage.md new file mode 100644 index 000000000..333ea0086 --- /dev/null +++ b/doc/reducing-memory-usage.md @@ -0,0 +1,8 @@ +In-memory caches +---------------- + +The size of some in-memory caches can be reduced. As caches trade off memory usage for performance, usually reducing these have a negative effect on performance. + +- `-dbcache=` - the UTXO database cache size, this defaults to `450` (`100` before 1.0.15). The unit is MiB (where 1 GiB = 1024 MiB). + - The minimum value for `-dbcache` is 4. + - A lower dbcache make initial sync time much longer. After the initial sync, the effect is less pronounced for most use-cases, unless fast validation of blocks is important such as for mining. From d2b77b7afa4b0015c4bffe554a76d8da5a1a93ce Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 19 Jan 2018 16:52:25 -0800 Subject: [PATCH 0397/1062] Add note about dbcache to 1.0.15 release notes. Adapted from upstream release notes here: https://github.com/bitcoin/bitcoin/blob/master/doc/release-notes/release-notes-0.14.1.md#utxo-memory-accounting --- doc/release-notes.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/release-notes.md b/doc/release-notes.md index a29094b51..7355bcfc6 100644 --- a/doc/release-notes.md +++ b/doc/release-notes.md @@ -4,3 +4,9 @@ release-notes at release time) Notable changes =============== +UTXO memory accounting +---------------------- + +The default -dbcache has been changed in this release to 450MiB. Users can set -dbcache to a higher value (e.g. to keep the UTXO set more fully cached in memory). Users on low-memory systems (such as systems with 1GB or less) should consider specifying a lower value for this parameter. + +Additional information relating to running on low-memory systems can be found here: [reducing-memory-usage.md](https://github.com/zcash/zcash/blob/master/doc/reducing-memory-usage.md). From 03a61ed87c9583ba99728c41bbad9ab3f1bfc5e5 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 19 Jan 2018 17:18:41 -0800 Subject: [PATCH 0398/1062] Remove redundant service flag NODE_GETUTXO meant for Bitcoin XT. This frees up a service bit. Zcash has never used this flag and upstream Bitcoin Core does not support this flag, although it did reserve it for compatibility with Bitcoin XT. --- src/protocol.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/protocol.h b/src/protocol.h index b5e65032a..b0208b01c 100644 --- a/src/protocol.h +++ b/src/protocol.h @@ -71,10 +71,6 @@ enum { // set by all Bitcoin Core nodes, and is unset by SPV clients or other peers that just want // network services but don't provide them. NODE_NETWORK = (1 << 0), - // NODE_GETUTXO means the node is capable of responding to the getutxo protocol request. - // Bitcoin Core does not support this but a patch set called Bitcoin XT does. - // See BIP 64 for details on how this is implemented. - NODE_GETUTXO = (1 << 1), // Bits 24-31 are reserved for temporary experiments. Just pick a bit that // isn't getting used, or one not being used much, and notify the From fe53749dc93bc0365acea9209a68b4f788d965d6 Mon Sep 17 00:00:00 2001 From: Mark Friedenbach Date: Tue, 2 Jun 2015 16:25:34 -0700 Subject: [PATCH 0399/1062] Explicitly set tx.nVersion for the genesis block and mining tests If/when CTransaction::CURRENT_VERSION is incremented, this will break CChainParams and the miner tests. This fix sets the transaction version explicitly where we depend on the hash value (genesis block, proof of work checks). --- src/chainparams.cpp | 1 + src/test/miner_tests.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 23544f488..39ad31c5f 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -75,6 +75,7 @@ public: */ const char* pszTimestamp = "Zcash0b9c4eef8b7cc417ee5001e3500984b6fea35683a7cac141a043c42064835d34"; CMutableTransaction txNew; + txNew.nVersion = 1; txNew.vin.resize(1); txNew.vout.resize(1); txNew.vin[0].scriptSig = CScript() << 520617983 << CScriptNum(4) << vector((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp)); diff --git a/src/test/miner_tests.cpp b/src/test/miner_tests.cpp index 0db80ec3e..0ef66f6c7 100644 --- a/src/test/miner_tests.cpp +++ b/src/test/miner_tests.cpp @@ -165,6 +165,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) // will be closer to the tip, and blocks will appear slower. pblock->nTime = chainActive.Tip()->GetMedianTimePast()+6*Params().GetConsensus().nPowTargetSpacing; CMutableTransaction txCoinbase(pblock->vtx[0]); + txCoinbase.nVersion = 1; txCoinbase.vin[0].scriptSig = CScript() << (chainActive.Height()+1) << OP_0; txCoinbase.vout[0].scriptPubKey = CScript(); pblock->vtx[0] = CTransaction(txCoinbase); From 90b6ee6ce5055481acc803434d37fcc50f21abd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Tim=C3=B3n?= Date: Fri, 3 Jul 2015 14:29:57 +0200 Subject: [PATCH 0400/1062] Chainparams: Introduce CreateGenesisBlock() static function --- src/chainparams.cpp | 72 +++++++++++++++++++++++++++++---------------- 1 file changed, 47 insertions(+), 25 deletions(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 39ad31c5f..8edc582a1 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -19,6 +19,52 @@ using namespace std; #include "chainparamsseeds.h" +static uint256 MAINNET_GENESIS_NONCE = uint256S("0x0000000000000000000000000000000000000000000000000000000000001257"); +static std::vector MAINNET_GENESIS_SOLUTION = ParseHex("000a889f00854b8665cd555f4656f68179d31ccadc1b1f7fb0952726313b16941da348284d67add4686121d4e3d930160c1348d8191c25f12b267a6a9c131b5031cbf8af1f79c9d513076a216ec87ed045fa966e01214ed83ca02dc1797270a454720d3206ac7d931a0a680c5c5e099057592570ca9bdf6058343958b31901fce1a15a4f38fd347750912e14004c73dfe588b903b6c03166582eeaf30529b14072a7b3079e3a684601b9b3024054201f7440b0ee9eb1a7120ff43f713735494aa27b1f8bab60d7f398bca14f6abb2adbf29b04099121438a7974b078a11635b594e9170f1086140b4173822dd697894483e1c6b4e8b8dcd5cb12ca4903bc61e108871d4d915a9093c18ac9b02b6716ce1013ca2c1174e319c1a570215bc9ab5f7564765f7be20524dc3fdf8aa356fd94d445e05ab165ad8bb4a0db096c097618c81098f91443c719416d39837af6de85015dca0de89462b1d8386758b2cf8a99e00953b308032ae44c35e05eb71842922eb69797f68813b59caf266cb6c213569ae3280505421a7e3a0a37fdf8e2ea354fc5422816655394a9454bac542a9298f176e211020d63dee6852c40de02267e2fc9d5e1ff2ad9309506f02a1a71a0501b16d0d36f70cdfd8de78116c0c506ee0b8ddfdeb561acadf31746b5a9dd32c21930884397fb1682164cb565cc14e089d66635a32618f7eb05fe05082b8a3fae620571660a6b89886eac53dec109d7cbb6930ca698a168f301a950be152da1be2b9e07516995e20baceebecb5579d7cdbc16d09f3a50cb3c7dffe33f26686d4ff3f8946ee6475e98cf7b3cf9062b6966e838f865ff3de5fb064a37a21da7bb8dfd2501a29e184f207caaba364f36f2329a77515dcb710e29ffbf73e2bbd773fab1f9a6b005567affff605c132e4e4dd69f36bd201005458cfbd2c658701eb2a700251cefd886b1e674ae816d3f719bac64be649c172ba27a4fd55947d95d53ba4cbc73de97b8af5ed4840b659370c556e7376457f51e5ebb66018849923db82c1c9a819f173cccdb8f3324b239609a300018d0fb094adf5bd7cbb3834c69e6d0b3798065c525b20f040e965e1a161af78ff7561cd874f5f1b75aa0bc77f720589e1b810f831eac5073e6dd46d00a2793f70f7427f0f798f2f53a67e615e65d356e66fe40609a958a05edb4c175bcc383ea0530e67ddbe479a898943c6e3074c6fcc252d6014de3a3d292b03f0d88d312fe221be7be7e3c59d07fa0f2f4029e364f1f355c5d01fa53770d0cd76d82bf7e60f6903bc1beb772e6fde4a70be51d9c7e03c8d6d8dfb361a234ba47c470fe630820bbd920715621b9fbedb49fcee165ead0875e6c2b1af16f50b5d6140cc981122fcbcf7c5a4e3772b3661b628e08380abc545957e59f634705b1bbde2f0b4e055a5ec5676d859be77e20962b645e051a880fddb0180b4555789e1f9344a436a84dc5579e2553f1e5fb0a599c137be36cabbed0319831fea3fddf94ddc7971e4bcf02cdc93294a9aab3e3b13e3b058235b4f4ec06ba4ceaa49d675b4ba80716f3bc6976b1fbf9c8bf1f3e3a4dc1cd83ef9cf816667fb94f1e923ff63fef072e6a19321e4812f96cb0ffa864da50ad74deb76917a336f31dce03ed5f0303aad5e6a83634f9fcc371096f8288b8f02ddded5ff1bb9d49331e4a84dbe1543164438fde9ad71dab024779dcdde0b6602b5ae0a6265c14b94edd83b37403f4b78fcd2ed555b596402c28ee81d87a909c4e8722b30c71ecdd861b05f61f8b1231795c76adba2fdefa451b283a5d527955b9f3de1b9828e7b2e74123dd47062ddcc09b05e7fa13cb2212a6fdbc65d7e852cec463ec6fd929f5b8483cf3052113b13dac91b69f49d1b7d1aec01c4a68e41ce157"); + +static CBlock CreateGenesisBlock(const char* pszTimestamp, CScript genesisOutputScript, uint32_t nTime=1477641360, uint256 nNonce=MAINNET_GENESIS_NONCE, std::vector nSolution=MAINNET_GENESIS_SOLUTION, uint32_t nBits=0x1f07ffff, int32_t nVersion=4, const CAmount& genesisReward=0) +{ + CMutableTransaction txNew; + txNew.nVersion = 1; + txNew.vin.resize(1); + txNew.vout.resize(1); + txNew.vin[0].scriptSig = CScript() << 520617983 << CScriptNum(4) << vector((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp)); + txNew.vout[0].nValue = genesisReward; + txNew.vout[0].scriptPubKey = genesisOutputScript; + + CBlock genesis; + genesis.nTime = nTime; + genesis.nBits = nBits; + genesis.nNonce = nNonce; + genesis.nSolution = nSolution; + genesis.nVersion = nVersion; + genesis.vtx.push_back(txNew); + genesis.hashPrevBlock.SetNull(); + genesis.hashMerkleRoot = genesis.BuildMerkleTree(); + return genesis; +} + +/** + * Build the genesis block. Note that the output of its generation + * transaction cannot be spent since it did not originally exist in the + * database (and is in any case of zero value). + * + * >>> from pyblake2 import blake2s + * >>> 'Zcash' + blake2s(b'The Economist 2016-10-29 Known unknown: Another crypto-currency is born. BTC#436254 0000000000000000044f321997f336d2908cf8c8d6893e88dbf067e2d949487d ETH#2521903 483039a6b6bd8bd05f0584f9a078d075e454925eb71c1f13eaff59b405a721bb DJIA close on 27 Oct 2016: 18,169.68').hexdigest() + * + * CBlock(hash=00040fe8, ver=4, hashPrevBlock=00000000000000, hashMerkleRoot=c4eaa5, nTime=1477641360, nBits=1f07ffff, nNonce=4695, vtx=1) + * CTransaction(hash=c4eaa5, ver=1, vin.size=1, vout.size=1, nLockTime=0) + * CTxIn(COutPoint(000000, -1), coinbase 04ffff071f0104455a6361736830623963346565663862376363343137656535303031653335303039383462366665613335363833613763616331343161303433633432303634383335643334) + * CTxOut(nValue=0.00000000, scriptPubKey=0x5F1DF16B2B704C8A578D0B) + * vMerkleTree: c4eaa5 + */ +static CBlock CreateGenesisBlock(uint32_t nTime=1477641360, uint256 nNonce=MAINNET_GENESIS_NONCE, std::vector nSolution=MAINNET_GENESIS_SOLUTION, uint32_t nBits=0x1f07ffff, int32_t nVersion=4, const CAmount& genesisReward=0) +{ + const char* pszTimestamp = "Zcash0b9c4eef8b7cc417ee5001e3500984b6fea35683a7cac141a043c42064835d34"; + CScript genesisOutputScript = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG; + return CreateGenesisBlock(pszTimestamp, genesisOutputScript, nTime, nNonce, nSolution, nBits, nVersion, genesisReward); +} + /** * Main network */ @@ -65,31 +111,7 @@ public: nEquihashN = N; nEquihashK = K; - /** - * Build the genesis block. Note that the output of its generation - * transaction cannot be spent since it did not originally exist in the - * database (and is in any case of zero value). - * - * >>> from pyblake2 import blake2s - * >>> 'Zcash' + blake2s(b'The Economist 2016-10-29 Known unknown: Another crypto-currency is born. BTC#436254 0000000000000000044f321997f336d2908cf8c8d6893e88dbf067e2d949487d ETH#2521903 483039a6b6bd8bd05f0584f9a078d075e454925eb71c1f13eaff59b405a721bb DJIA close on 27 Oct 2016: 18,169.68').hexdigest() - */ - const char* pszTimestamp = "Zcash0b9c4eef8b7cc417ee5001e3500984b6fea35683a7cac141a043c42064835d34"; - CMutableTransaction txNew; - txNew.nVersion = 1; - txNew.vin.resize(1); - txNew.vout.resize(1); - txNew.vin[0].scriptSig = CScript() << 520617983 << CScriptNum(4) << vector((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp)); - txNew.vout[0].nValue = 0; - txNew.vout[0].scriptPubKey = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG; - genesis.vtx.push_back(txNew); - genesis.hashPrevBlock.SetNull(); - genesis.hashMerkleRoot = genesis.BuildMerkleTree(); - genesis.nVersion = 4; - genesis.nTime = 1477641360; - genesis.nBits = 0x1f07ffff; - genesis.nNonce = uint256S("0x0000000000000000000000000000000000000000000000000000000000001257"); - genesis.nSolution = ParseHex("000a889f00854b8665cd555f4656f68179d31ccadc1b1f7fb0952726313b16941da348284d67add4686121d4e3d930160c1348d8191c25f12b267a6a9c131b5031cbf8af1f79c9d513076a216ec87ed045fa966e01214ed83ca02dc1797270a454720d3206ac7d931a0a680c5c5e099057592570ca9bdf6058343958b31901fce1a15a4f38fd347750912e14004c73dfe588b903b6c03166582eeaf30529b14072a7b3079e3a684601b9b3024054201f7440b0ee9eb1a7120ff43f713735494aa27b1f8bab60d7f398bca14f6abb2adbf29b04099121438a7974b078a11635b594e9170f1086140b4173822dd697894483e1c6b4e8b8dcd5cb12ca4903bc61e108871d4d915a9093c18ac9b02b6716ce1013ca2c1174e319c1a570215bc9ab5f7564765f7be20524dc3fdf8aa356fd94d445e05ab165ad8bb4a0db096c097618c81098f91443c719416d39837af6de85015dca0de89462b1d8386758b2cf8a99e00953b308032ae44c35e05eb71842922eb69797f68813b59caf266cb6c213569ae3280505421a7e3a0a37fdf8e2ea354fc5422816655394a9454bac542a9298f176e211020d63dee6852c40de02267e2fc9d5e1ff2ad9309506f02a1a71a0501b16d0d36f70cdfd8de78116c0c506ee0b8ddfdeb561acadf31746b5a9dd32c21930884397fb1682164cb565cc14e089d66635a32618f7eb05fe05082b8a3fae620571660a6b89886eac53dec109d7cbb6930ca698a168f301a950be152da1be2b9e07516995e20baceebecb5579d7cdbc16d09f3a50cb3c7dffe33f26686d4ff3f8946ee6475e98cf7b3cf9062b6966e838f865ff3de5fb064a37a21da7bb8dfd2501a29e184f207caaba364f36f2329a77515dcb710e29ffbf73e2bbd773fab1f9a6b005567affff605c132e4e4dd69f36bd201005458cfbd2c658701eb2a700251cefd886b1e674ae816d3f719bac64be649c172ba27a4fd55947d95d53ba4cbc73de97b8af5ed4840b659370c556e7376457f51e5ebb66018849923db82c1c9a819f173cccdb8f3324b239609a300018d0fb094adf5bd7cbb3834c69e6d0b3798065c525b20f040e965e1a161af78ff7561cd874f5f1b75aa0bc77f720589e1b810f831eac5073e6dd46d00a2793f70f7427f0f798f2f53a67e615e65d356e66fe40609a958a05edb4c175bcc383ea0530e67ddbe479a898943c6e3074c6fcc252d6014de3a3d292b03f0d88d312fe221be7be7e3c59d07fa0f2f4029e364f1f355c5d01fa53770d0cd76d82bf7e60f6903bc1beb772e6fde4a70be51d9c7e03c8d6d8dfb361a234ba47c470fe630820bbd920715621b9fbedb49fcee165ead0875e6c2b1af16f50b5d6140cc981122fcbcf7c5a4e3772b3661b628e08380abc545957e59f634705b1bbde2f0b4e055a5ec5676d859be77e20962b645e051a880fddb0180b4555789e1f9344a436a84dc5579e2553f1e5fb0a599c137be36cabbed0319831fea3fddf94ddc7971e4bcf02cdc93294a9aab3e3b13e3b058235b4f4ec06ba4ceaa49d675b4ba80716f3bc6976b1fbf9c8bf1f3e3a4dc1cd83ef9cf816667fb94f1e923ff63fef072e6a19321e4812f96cb0ffa864da50ad74deb76917a336f31dce03ed5f0303aad5e6a83634f9fcc371096f8288b8f02ddded5ff1bb9d49331e4a84dbe1543164438fde9ad71dab024779dcdde0b6602b5ae0a6265c14b94edd83b37403f4b78fcd2ed555b596402c28ee81d87a909c4e8722b30c71ecdd861b05f61f8b1231795c76adba2fdefa451b283a5d527955b9f3de1b9828e7b2e74123dd47062ddcc09b05e7fa13cb2212a6fdbc65d7e852cec463ec6fd929f5b8483cf3052113b13dac91b69f49d1b7d1aec01c4a68e41ce157"); - + genesis = CreateGenesisBlock(); consensus.hashGenesisBlock = genesis.GetHash(); assert(consensus.hashGenesisBlock == uint256S("0x00040fe8ec8471911baa1db1266ea15dd06b4a8a5c453883c000b031973dce08")); assert(genesis.hashMerkleRoot == uint256S("0xc4eaa58879081de3c24a7b117ed2b28300e7ec4c4c1dff1d3f1268b7857a4ddb")); From 54ab3b3183c04dc28eb40794c00dbd5668c3b1da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Tim=C3=B3n?= Date: Fri, 3 Jul 2015 14:30:18 +0200 Subject: [PATCH 0401/1062] Chainparams: CTestNetParams and CRegTestParams extend directly from CChainParams ...instead of CMainParams and CTestNetParams respectively Do the same for CBaseChainParams. The inheritance was only reducing readibility in this case --- src/chainparams.cpp | 46 +++++++++++++++++++++++++++++++---------- src/chainparamsbase.cpp | 5 +++-- 2 files changed, 38 insertions(+), 13 deletions(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 8edc582a1..093cd247a 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -225,29 +225,41 @@ static CMainParams mainParams; /** * Testnet (v3) */ -class CTestNetParams : public CMainParams { +class CTestNetParams : public CChainParams { public: CTestNetParams() { strNetworkID = "test"; strCurrencyUnits = "TAZ"; + consensus.fCoinbaseMustBeProtected = true; + consensus.nSubsidySlowStartInterval = 20000; + consensus.nSubsidyHalvingInterval = 840000; consensus.nMajorityEnforceBlockUpgrade = 51; consensus.nMajorityRejectBlockOutdated = 75; consensus.nMajorityWindow = 400; consensus.powLimit = uint256S("07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); + consensus.nPowAveragingWindow = 17; assert(maxUint/UintToArith256(consensus.powLimit) >= consensus.nPowAveragingWindow); + consensus.nPowMaxAdjustDown = 32; // 32% adjustment down + consensus.nPowMaxAdjustUp = 16; // 16% adjustment up + consensus.nPowTargetSpacing = 2.5 * 60; pchMessageStart[0] = 0xfa; pchMessageStart[1] = 0x1a; pchMessageStart[2] = 0xf9; pchMessageStart[3] = 0xbf; vAlertPubKey = ParseHex("044e7a1553392325c871c5ace5d6ad73501c66f4c185d6b0453cf45dec5a1322e705c672ac1a27ef7cdaf588c10effdf50ed5f95f85f2f54a5f6159fca394ed0c6"); nDefaultPort = 18233; + nMaxTipAge = 24 * 60 * 60; nPruneAfterHeight = 1000; + const size_t N = 200, K = 9; + BOOST_STATIC_ASSERT(equihash_parameters_acceptable(N, K)); + nEquihashN = N; + nEquihashK = K; - //! Modify the testnet genesis block so the timestamp is valid for a later start. - genesis.nTime = 1477648033; - genesis.nBits = 0x2007ffff; - genesis.nNonce = uint256S("0x0000000000000000000000000000000000000000000000000000000000000006"); - genesis.nSolution = ParseHex("00a6a51259c3f6732481e2d035197218b7a69504461d04335503cd69759b2d02bd2b53a9653f42cb33c608511c953673fa9da76170958115fe92157ad3bb5720d927f18e09459bf5c6072973e143e20f9bdf0584058c96b7c2234c7565f100d5eea083ba5d3dbaff9f0681799a113e7beff4a611d2b49590563109962baa149b628aae869af791f2f70bb041bd7ebfa658570917f6654a142b05e7ec0289a4f46470be7be5f693b90173eaaa6e84907170f32602204f1f4e1c04b1830116ffd0c54f0b1caa9a5698357bd8aa1f5ac8fc93b405265d824ba0e49f69dab5446653927298e6b7bdc61ee86ff31c07bde86331b4e500d42e4e50417e285502684b7966184505b885b42819a88469d1e9cf55072d7f3510f85580db689302eab377e4e11b14a91fdd0df7627efc048934f0aff8e7eb77eb17b3a95de13678004f2512293891d8baf8dde0ef69be520a58bbd6038ce899c9594cf3e30b8c3d9c7ecc832d4c19a6212747b50724e6f70f6451f78fd27b58ce43ca33b1641304a916186cfbe7dbca224f55d08530ba851e4df22baf7ab7078e9cbea46c0798b35a750f54103b0cdd08c81a6505c4932f6bfbd492a9fced31d54e98b6370d4c96600552fcf5b37780ed18c8787d03200963600db297a8f05dfa551321d17b9917edadcda51e274830749d133ad226f8bb6b94f13b4f77e67b35b71f52112ce9ba5da706ad9573584a2570a4ff25d29ab9761a06bdcf2c33638bf9baf2054825037881c14adf3816ba0cbd0fca689aad3ce16f2fe362c98f48134a9221765d939f0b49677d1c2447e56b46859f1810e2cf23e82a53e0d44f34dae932581b3b7f49eaec59af872cf9de757a964f7b33d143a36c270189508fcafe19398e4d2966948164d40556b05b7ff532f66f5d1edc41334ef742f78221dfe0c7ae2275bb3f24c89ae35f00afeea4e6ed187b866b209dc6e83b660593fce7c40e143beb07ac86c56f39e895385924667efe3a3f031938753c7764a2dbeb0a643fd359c46e614873fd0424e435fa7fac083b9a41a9d6bf7e284eee537ea7c50dd239f359941a43dc982745184bf3ee31a8dc850316aa9c6b66d6985acee814373be3458550659e1a06287c3b3b76a185c5cb93e38c1eebcf34ff072894b6430aed8d34122dafd925c46a515cca79b0269c92b301890ca6b0dc8b679cdac0f23318c105de73d7a46d16d2dad988d49c22e9963c117960bdc70ef0db6b091cf09445a516176b7f6d58ec29539166cc8a38bbff387acefffab2ea5faad0e8bb70625716ef0edf61940733c25993ea3de9f0be23d36e7cb8da10505f9dc426cd0e6e5b173ab4fff8c37e1f1fb56d1ea372013d075e0934c6919393cfc21395eea20718fad03542a4162a9ded66c814ad8320b2d7c2da3ecaf206da34c502db2096d1c46699a91dd1c432f019ad434e2c1ce507f91104f66f491fed37b225b8e0b2888c37276cfa0468fc13b8d593fd9a2675f0f5b20b8a15f8fa7558176a530d6865738ddb25d3426dab905221681cf9da0e0200eea5b2eba3ad3a5237d2a391f9074bf1779a2005cee43eec2b058511532635e0fea61664f531ac2b356f40db5c5d275a4cf5c82d468976455af4e3362cc8f71aa95e71d394aff3ead6f7101279f95bcd8a0fedce1d21cb3c9f6dd3b182fce0db5d6712981b651f29178a24119968b14783cafa713bc5f2a65205a42e4ce9dc7ba462bdb1f3e4553afc15f5f39998fdb53e7e231e3e520a46943734a007c2daa1eda9f495791657eefcac5c32833936e568d06187857ed04d7b97167ae207c5c5ae54e528c36016a984235e9c5b2f0718d7b3aa93c7822ccc772580b6599671b3c02ece8a21399abd33cfd3028790133167d0a97e7de53dc8ff"); + genesis = CreateGenesisBlock( + 1477648033, + uint256S("0x0000000000000000000000000000000000000000000000000000000000000006"), + ParseHex("00a6a51259c3f6732481e2d035197218b7a69504461d04335503cd69759b2d02bd2b53a9653f42cb33c608511c953673fa9da76170958115fe92157ad3bb5720d927f18e09459bf5c6072973e143e20f9bdf0584058c96b7c2234c7565f100d5eea083ba5d3dbaff9f0681799a113e7beff4a611d2b49590563109962baa149b628aae869af791f2f70bb041bd7ebfa658570917f6654a142b05e7ec0289a4f46470be7be5f693b90173eaaa6e84907170f32602204f1f4e1c04b1830116ffd0c54f0b1caa9a5698357bd8aa1f5ac8fc93b405265d824ba0e49f69dab5446653927298e6b7bdc61ee86ff31c07bde86331b4e500d42e4e50417e285502684b7966184505b885b42819a88469d1e9cf55072d7f3510f85580db689302eab377e4e11b14a91fdd0df7627efc048934f0aff8e7eb77eb17b3a95de13678004f2512293891d8baf8dde0ef69be520a58bbd6038ce899c9594cf3e30b8c3d9c7ecc832d4c19a6212747b50724e6f70f6451f78fd27b58ce43ca33b1641304a916186cfbe7dbca224f55d08530ba851e4df22baf7ab7078e9cbea46c0798b35a750f54103b0cdd08c81a6505c4932f6bfbd492a9fced31d54e98b6370d4c96600552fcf5b37780ed18c8787d03200963600db297a8f05dfa551321d17b9917edadcda51e274830749d133ad226f8bb6b94f13b4f77e67b35b71f52112ce9ba5da706ad9573584a2570a4ff25d29ab9761a06bdcf2c33638bf9baf2054825037881c14adf3816ba0cbd0fca689aad3ce16f2fe362c98f48134a9221765d939f0b49677d1c2447e56b46859f1810e2cf23e82a53e0d44f34dae932581b3b7f49eaec59af872cf9de757a964f7b33d143a36c270189508fcafe19398e4d2966948164d40556b05b7ff532f66f5d1edc41334ef742f78221dfe0c7ae2275bb3f24c89ae35f00afeea4e6ed187b866b209dc6e83b660593fce7c40e143beb07ac86c56f39e895385924667efe3a3f031938753c7764a2dbeb0a643fd359c46e614873fd0424e435fa7fac083b9a41a9d6bf7e284eee537ea7c50dd239f359941a43dc982745184bf3ee31a8dc850316aa9c6b66d6985acee814373be3458550659e1a06287c3b3b76a185c5cb93e38c1eebcf34ff072894b6430aed8d34122dafd925c46a515cca79b0269c92b301890ca6b0dc8b679cdac0f23318c105de73d7a46d16d2dad988d49c22e9963c117960bdc70ef0db6b091cf09445a516176b7f6d58ec29539166cc8a38bbff387acefffab2ea5faad0e8bb70625716ef0edf61940733c25993ea3de9f0be23d36e7cb8da10505f9dc426cd0e6e5b173ab4fff8c37e1f1fb56d1ea372013d075e0934c6919393cfc21395eea20718fad03542a4162a9ded66c814ad8320b2d7c2da3ecaf206da34c502db2096d1c46699a91dd1c432f019ad434e2c1ce507f91104f66f491fed37b225b8e0b2888c37276cfa0468fc13b8d593fd9a2675f0f5b20b8a15f8fa7558176a530d6865738ddb25d3426dab905221681cf9da0e0200eea5b2eba3ad3a5237d2a391f9074bf1779a2005cee43eec2b058511532635e0fea61664f531ac2b356f40db5c5d275a4cf5c82d468976455af4e3362cc8f71aa95e71d394aff3ead6f7101279f95bcd8a0fedce1d21cb3c9f6dd3b182fce0db5d6712981b651f29178a24119968b14783cafa713bc5f2a65205a42e4ce9dc7ba462bdb1f3e4553afc15f5f39998fdb53e7e231e3e520a46943734a007c2daa1eda9f495791657eefcac5c32833936e568d06187857ed04d7b97167ae207c5c5ae54e528c36016a984235e9c5b2f0718d7b3aa93c7822ccc772580b6599671b3c02ece8a21399abd33cfd3028790133167d0a97e7de53dc8ff"), + 0x2007ffff); consensus.hashGenesisBlock = genesis.GetHash(); assert(consensus.hashGenesisBlock == uint256S("0x05a60a92d99d85997cce3b87616c089f6124d7342af37106edc76126334a2c38")); @@ -312,7 +324,7 @@ static CTestNetParams testNetParams; /** * Regression test */ -class CRegTestParams : public CTestNetParams { +class CRegTestParams : public CChainParams { public: CRegTestParams() { strNetworkID = "regtest"; @@ -324,9 +336,11 @@ public: consensus.nMajorityRejectBlockOutdated = 950; consensus.nMajorityWindow = 1000; consensus.powLimit = uint256S("0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f"); + consensus.nPowAveragingWindow = 17; assert(maxUint/UintToArith256(consensus.powLimit) >= consensus.nPowAveragingWindow); consensus.nPowMaxAdjustDown = 0; // Turn off adjustment down consensus.nPowMaxAdjustUp = 0; // Turn off adjustment up + consensus.nPowTargetSpacing = 2.5 * 60; pchMessageStart[0] = 0xaa; pchMessageStart[1] = 0xe8; pchMessageStart[2] = 0x3f; @@ -336,10 +350,11 @@ public: BOOST_STATIC_ASSERT(equihash_parameters_acceptable(N, K)); nEquihashN = N; nEquihashK = K; - genesis.nTime = 1296688602; - genesis.nBits = 0x200f0f0f; - genesis.nNonce = uint256S("0x0000000000000000000000000000000000000000000000000000000000000009"); - genesis.nSolution = ParseHex("01936b7db1eb4ac39f151b8704642d0a8bda13ec547d54cd5e43ba142fc6d8877cab07b3"); + genesis = CreateGenesisBlock( + 1296688602, + uint256S("0x0000000000000000000000000000000000000000000000000000000000000009"), + ParseHex("01936b7db1eb4ac39f151b8704642d0a8bda13ec547d54cd5e43ba142fc6d8877cab07b3"), + 0x200f0f0f); consensus.hashGenesisBlock = genesis.GetHash(); nDefaultPort = 18344; assert(consensus.hashGenesisBlock == uint256S("0x029f11d80ef9765602235e1bc9727e3eb6ba20839319f761fee920d63401e327")); @@ -361,6 +376,15 @@ public: 0, 0 }; + // These prefixes are the same as the testnet prefixes + base58Prefixes[PUBKEY_ADDRESS] = {0x1D,0x25}; + base58Prefixes[SCRIPT_ADDRESS] = {0x1C,0xBA}; + base58Prefixes[SECRET_KEY] = {0xEF}; + // do not rely on these BIP32 prefixes; they are not specified and may change + base58Prefixes[EXT_PUBLIC_KEY] = {0x04,0x35,0x87,0xCF}; + base58Prefixes[EXT_SECRET_KEY] = {0x04,0x35,0x83,0x94}; + base58Prefixes[ZCPAYMENT_ADDRRESS] = {0x16,0xB6}; + base58Prefixes[ZCSPENDING_KEY] = {0xAC,0x08}; // Founders reward script expects a vector of 2-of-3 multisig addresses vFoundersRewardAddress = { "t2FwcEhFdNXuFMv1tcYwaBJtYVtMj8b1uTg" }; diff --git a/src/chainparamsbase.cpp b/src/chainparamsbase.cpp index e261e197f..31f15d15d 100644 --- a/src/chainparamsbase.cpp +++ b/src/chainparamsbase.cpp @@ -25,7 +25,7 @@ static CBaseMainParams mainParams; /** * Testnet (v3) */ -class CBaseTestNetParams : public CBaseMainParams +class CBaseTestNetParams : public CBaseChainParams { public: CBaseTestNetParams() @@ -39,11 +39,12 @@ static CBaseTestNetParams testNetParams; /* * Regression test */ -class CBaseRegTestParams : public CBaseTestNetParams +class CBaseRegTestParams : public CBaseChainParams { public: CBaseRegTestParams() { + nRPCPort = 18232; strDataDir = "regtest"; } }; From a97308c5d452a6e07c7443dd53ff601944071346 Mon Sep 17 00:00:00 2001 From: Daniel Kraft Date: Wed, 29 Jul 2015 21:13:36 +0200 Subject: [PATCH 0402/1062] Clean up chainparams some more. Clean up the code in chainparams a bit more after the recent refactorings. In particular, make sure the structure of the "RegTest" params matches the structure of the other classes. This makes the code clearer to read. Also remove redundant values of the genesis block in always-specified optional arguments and mark variable/argument as "const". --- src/chainparams.cpp | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 093cd247a..a338d9a7f 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -19,10 +19,7 @@ using namespace std; #include "chainparamsseeds.h" -static uint256 MAINNET_GENESIS_NONCE = uint256S("0x0000000000000000000000000000000000000000000000000000000000001257"); -static std::vector MAINNET_GENESIS_SOLUTION = ParseHex("000a889f00854b8665cd555f4656f68179d31ccadc1b1f7fb0952726313b16941da348284d67add4686121d4e3d930160c1348d8191c25f12b267a6a9c131b5031cbf8af1f79c9d513076a216ec87ed045fa966e01214ed83ca02dc1797270a454720d3206ac7d931a0a680c5c5e099057592570ca9bdf6058343958b31901fce1a15a4f38fd347750912e14004c73dfe588b903b6c03166582eeaf30529b14072a7b3079e3a684601b9b3024054201f7440b0ee9eb1a7120ff43f713735494aa27b1f8bab60d7f398bca14f6abb2adbf29b04099121438a7974b078a11635b594e9170f1086140b4173822dd697894483e1c6b4e8b8dcd5cb12ca4903bc61e108871d4d915a9093c18ac9b02b6716ce1013ca2c1174e319c1a570215bc9ab5f7564765f7be20524dc3fdf8aa356fd94d445e05ab165ad8bb4a0db096c097618c81098f91443c719416d39837af6de85015dca0de89462b1d8386758b2cf8a99e00953b308032ae44c35e05eb71842922eb69797f68813b59caf266cb6c213569ae3280505421a7e3a0a37fdf8e2ea354fc5422816655394a9454bac542a9298f176e211020d63dee6852c40de02267e2fc9d5e1ff2ad9309506f02a1a71a0501b16d0d36f70cdfd8de78116c0c506ee0b8ddfdeb561acadf31746b5a9dd32c21930884397fb1682164cb565cc14e089d66635a32618f7eb05fe05082b8a3fae620571660a6b89886eac53dec109d7cbb6930ca698a168f301a950be152da1be2b9e07516995e20baceebecb5579d7cdbc16d09f3a50cb3c7dffe33f26686d4ff3f8946ee6475e98cf7b3cf9062b6966e838f865ff3de5fb064a37a21da7bb8dfd2501a29e184f207caaba364f36f2329a77515dcb710e29ffbf73e2bbd773fab1f9a6b005567affff605c132e4e4dd69f36bd201005458cfbd2c658701eb2a700251cefd886b1e674ae816d3f719bac64be649c172ba27a4fd55947d95d53ba4cbc73de97b8af5ed4840b659370c556e7376457f51e5ebb66018849923db82c1c9a819f173cccdb8f3324b239609a300018d0fb094adf5bd7cbb3834c69e6d0b3798065c525b20f040e965e1a161af78ff7561cd874f5f1b75aa0bc77f720589e1b810f831eac5073e6dd46d00a2793f70f7427f0f798f2f53a67e615e65d356e66fe40609a958a05edb4c175bcc383ea0530e67ddbe479a898943c6e3074c6fcc252d6014de3a3d292b03f0d88d312fe221be7be7e3c59d07fa0f2f4029e364f1f355c5d01fa53770d0cd76d82bf7e60f6903bc1beb772e6fde4a70be51d9c7e03c8d6d8dfb361a234ba47c470fe630820bbd920715621b9fbedb49fcee165ead0875e6c2b1af16f50b5d6140cc981122fcbcf7c5a4e3772b3661b628e08380abc545957e59f634705b1bbde2f0b4e055a5ec5676d859be77e20962b645e051a880fddb0180b4555789e1f9344a436a84dc5579e2553f1e5fb0a599c137be36cabbed0319831fea3fddf94ddc7971e4bcf02cdc93294a9aab3e3b13e3b058235b4f4ec06ba4ceaa49d675b4ba80716f3bc6976b1fbf9c8bf1f3e3a4dc1cd83ef9cf816667fb94f1e923ff63fef072e6a19321e4812f96cb0ffa864da50ad74deb76917a336f31dce03ed5f0303aad5e6a83634f9fcc371096f8288b8f02ddded5ff1bb9d49331e4a84dbe1543164438fde9ad71dab024779dcdde0b6602b5ae0a6265c14b94edd83b37403f4b78fcd2ed555b596402c28ee81d87a909c4e8722b30c71ecdd861b05f61f8b1231795c76adba2fdefa451b283a5d527955b9f3de1b9828e7b2e74123dd47062ddcc09b05e7fa13cb2212a6fdbc65d7e852cec463ec6fd929f5b8483cf3052113b13dac91b69f49d1b7d1aec01c4a68e41ce157"); - -static CBlock CreateGenesisBlock(const char* pszTimestamp, CScript genesisOutputScript, uint32_t nTime=1477641360, uint256 nNonce=MAINNET_GENESIS_NONCE, std::vector nSolution=MAINNET_GENESIS_SOLUTION, uint32_t nBits=0x1f07ffff, int32_t nVersion=4, const CAmount& genesisReward=0) +static CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesisOutputScript, uint32_t nTime, const uint256& nNonce, const std::vector& nSolution, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward) { CMutableTransaction txNew; txNew.nVersion = 1; @@ -58,10 +55,10 @@ static CBlock CreateGenesisBlock(const char* pszTimestamp, CScript genesisOutput * CTxOut(nValue=0.00000000, scriptPubKey=0x5F1DF16B2B704C8A578D0B) * vMerkleTree: c4eaa5 */ -static CBlock CreateGenesisBlock(uint32_t nTime=1477641360, uint256 nNonce=MAINNET_GENESIS_NONCE, std::vector nSolution=MAINNET_GENESIS_SOLUTION, uint32_t nBits=0x1f07ffff, int32_t nVersion=4, const CAmount& genesisReward=0) +static CBlock CreateGenesisBlock(uint32_t nTime, const uint256& nNonce, const std::vector& nSolution, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward) { const char* pszTimestamp = "Zcash0b9c4eef8b7cc417ee5001e3500984b6fea35683a7cac141a043c42064835d34"; - CScript genesisOutputScript = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG; + const CScript genesisOutputScript = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG; return CreateGenesisBlock(pszTimestamp, genesisOutputScript, nTime, nNonce, nSolution, nBits, nVersion, genesisReward); } @@ -111,7 +108,11 @@ public: nEquihashN = N; nEquihashK = K; - genesis = CreateGenesisBlock(); + genesis = CreateGenesisBlock( + 1477641360, + uint256S("0x0000000000000000000000000000000000000000000000000000000000001257"), + ParseHex("000a889f00854b8665cd555f4656f68179d31ccadc1b1f7fb0952726313b16941da348284d67add4686121d4e3d930160c1348d8191c25f12b267a6a9c131b5031cbf8af1f79c9d513076a216ec87ed045fa966e01214ed83ca02dc1797270a454720d3206ac7d931a0a680c5c5e099057592570ca9bdf6058343958b31901fce1a15a4f38fd347750912e14004c73dfe588b903b6c03166582eeaf30529b14072a7b3079e3a684601b9b3024054201f7440b0ee9eb1a7120ff43f713735494aa27b1f8bab60d7f398bca14f6abb2adbf29b04099121438a7974b078a11635b594e9170f1086140b4173822dd697894483e1c6b4e8b8dcd5cb12ca4903bc61e108871d4d915a9093c18ac9b02b6716ce1013ca2c1174e319c1a570215bc9ab5f7564765f7be20524dc3fdf8aa356fd94d445e05ab165ad8bb4a0db096c097618c81098f91443c719416d39837af6de85015dca0de89462b1d8386758b2cf8a99e00953b308032ae44c35e05eb71842922eb69797f68813b59caf266cb6c213569ae3280505421a7e3a0a37fdf8e2ea354fc5422816655394a9454bac542a9298f176e211020d63dee6852c40de02267e2fc9d5e1ff2ad9309506f02a1a71a0501b16d0d36f70cdfd8de78116c0c506ee0b8ddfdeb561acadf31746b5a9dd32c21930884397fb1682164cb565cc14e089d66635a32618f7eb05fe05082b8a3fae620571660a6b89886eac53dec109d7cbb6930ca698a168f301a950be152da1be2b9e07516995e20baceebecb5579d7cdbc16d09f3a50cb3c7dffe33f26686d4ff3f8946ee6475e98cf7b3cf9062b6966e838f865ff3de5fb064a37a21da7bb8dfd2501a29e184f207caaba364f36f2329a77515dcb710e29ffbf73e2bbd773fab1f9a6b005567affff605c132e4e4dd69f36bd201005458cfbd2c658701eb2a700251cefd886b1e674ae816d3f719bac64be649c172ba27a4fd55947d95d53ba4cbc73de97b8af5ed4840b659370c556e7376457f51e5ebb66018849923db82c1c9a819f173cccdb8f3324b239609a300018d0fb094adf5bd7cbb3834c69e6d0b3798065c525b20f040e965e1a161af78ff7561cd874f5f1b75aa0bc77f720589e1b810f831eac5073e6dd46d00a2793f70f7427f0f798f2f53a67e615e65d356e66fe40609a958a05edb4c175bcc383ea0530e67ddbe479a898943c6e3074c6fcc252d6014de3a3d292b03f0d88d312fe221be7be7e3c59d07fa0f2f4029e364f1f355c5d01fa53770d0cd76d82bf7e60f6903bc1beb772e6fde4a70be51d9c7e03c8d6d8dfb361a234ba47c470fe630820bbd920715621b9fbedb49fcee165ead0875e6c2b1af16f50b5d6140cc981122fcbcf7c5a4e3772b3661b628e08380abc545957e59f634705b1bbde2f0b4e055a5ec5676d859be77e20962b645e051a880fddb0180b4555789e1f9344a436a84dc5579e2553f1e5fb0a599c137be36cabbed0319831fea3fddf94ddc7971e4bcf02cdc93294a9aab3e3b13e3b058235b4f4ec06ba4ceaa49d675b4ba80716f3bc6976b1fbf9c8bf1f3e3a4dc1cd83ef9cf816667fb94f1e923ff63fef072e6a19321e4812f96cb0ffa864da50ad74deb76917a336f31dce03ed5f0303aad5e6a83634f9fcc371096f8288b8f02ddded5ff1bb9d49331e4a84dbe1543164438fde9ad71dab024779dcdde0b6602b5ae0a6265c14b94edd83b37403f4b78fcd2ed555b596402c28ee81d87a909c4e8722b30c71ecdd861b05f61f8b1231795c76adba2fdefa451b283a5d527955b9f3de1b9828e7b2e74123dd47062ddcc09b05e7fa13cb2212a6fdbc65d7e852cec463ec6fd929f5b8483cf3052113b13dac91b69f49d1b7d1aec01c4a68e41ce157"), + 0x1f07ffff, 4, 0); consensus.hashGenesisBlock = genesis.GetHash(); assert(consensus.hashGenesisBlock == uint256S("0x00040fe8ec8471911baa1db1266ea15dd06b4a8a5c453883c000b031973dce08")); assert(genesis.hashMerkleRoot == uint256S("0xc4eaa58879081de3c24a7b117ed2b28300e7ec4c4c1dff1d3f1268b7857a4ddb")); @@ -259,9 +260,10 @@ public: 1477648033, uint256S("0x0000000000000000000000000000000000000000000000000000000000000006"), ParseHex("00a6a51259c3f6732481e2d035197218b7a69504461d04335503cd69759b2d02bd2b53a9653f42cb33c608511c953673fa9da76170958115fe92157ad3bb5720d927f18e09459bf5c6072973e143e20f9bdf0584058c96b7c2234c7565f100d5eea083ba5d3dbaff9f0681799a113e7beff4a611d2b49590563109962baa149b628aae869af791f2f70bb041bd7ebfa658570917f6654a142b05e7ec0289a4f46470be7be5f693b90173eaaa6e84907170f32602204f1f4e1c04b1830116ffd0c54f0b1caa9a5698357bd8aa1f5ac8fc93b405265d824ba0e49f69dab5446653927298e6b7bdc61ee86ff31c07bde86331b4e500d42e4e50417e285502684b7966184505b885b42819a88469d1e9cf55072d7f3510f85580db689302eab377e4e11b14a91fdd0df7627efc048934f0aff8e7eb77eb17b3a95de13678004f2512293891d8baf8dde0ef69be520a58bbd6038ce899c9594cf3e30b8c3d9c7ecc832d4c19a6212747b50724e6f70f6451f78fd27b58ce43ca33b1641304a916186cfbe7dbca224f55d08530ba851e4df22baf7ab7078e9cbea46c0798b35a750f54103b0cdd08c81a6505c4932f6bfbd492a9fced31d54e98b6370d4c96600552fcf5b37780ed18c8787d03200963600db297a8f05dfa551321d17b9917edadcda51e274830749d133ad226f8bb6b94f13b4f77e67b35b71f52112ce9ba5da706ad9573584a2570a4ff25d29ab9761a06bdcf2c33638bf9baf2054825037881c14adf3816ba0cbd0fca689aad3ce16f2fe362c98f48134a9221765d939f0b49677d1c2447e56b46859f1810e2cf23e82a53e0d44f34dae932581b3b7f49eaec59af872cf9de757a964f7b33d143a36c270189508fcafe19398e4d2966948164d40556b05b7ff532f66f5d1edc41334ef742f78221dfe0c7ae2275bb3f24c89ae35f00afeea4e6ed187b866b209dc6e83b660593fce7c40e143beb07ac86c56f39e895385924667efe3a3f031938753c7764a2dbeb0a643fd359c46e614873fd0424e435fa7fac083b9a41a9d6bf7e284eee537ea7c50dd239f359941a43dc982745184bf3ee31a8dc850316aa9c6b66d6985acee814373be3458550659e1a06287c3b3b76a185c5cb93e38c1eebcf34ff072894b6430aed8d34122dafd925c46a515cca79b0269c92b301890ca6b0dc8b679cdac0f23318c105de73d7a46d16d2dad988d49c22e9963c117960bdc70ef0db6b091cf09445a516176b7f6d58ec29539166cc8a38bbff387acefffab2ea5faad0e8bb70625716ef0edf61940733c25993ea3de9f0be23d36e7cb8da10505f9dc426cd0e6e5b173ab4fff8c37e1f1fb56d1ea372013d075e0934c6919393cfc21395eea20718fad03542a4162a9ded66c814ad8320b2d7c2da3ecaf206da34c502db2096d1c46699a91dd1c432f019ad434e2c1ce507f91104f66f491fed37b225b8e0b2888c37276cfa0468fc13b8d593fd9a2675f0f5b20b8a15f8fa7558176a530d6865738ddb25d3426dab905221681cf9da0e0200eea5b2eba3ad3a5237d2a391f9074bf1779a2005cee43eec2b058511532635e0fea61664f531ac2b356f40db5c5d275a4cf5c82d468976455af4e3362cc8f71aa95e71d394aff3ead6f7101279f95bcd8a0fedce1d21cb3c9f6dd3b182fce0db5d6712981b651f29178a24119968b14783cafa713bc5f2a65205a42e4ce9dc7ba462bdb1f3e4553afc15f5f39998fdb53e7e231e3e520a46943734a007c2daa1eda9f495791657eefcac5c32833936e568d06187857ed04d7b97167ae207c5c5ae54e528c36016a984235e9c5b2f0718d7b3aa93c7822ccc772580b6599671b3c02ece8a21399abd33cfd3028790133167d0a97e7de53dc8ff"), - 0x2007ffff); + 0x2007ffff, 4, 0); consensus.hashGenesisBlock = genesis.GetHash(); assert(consensus.hashGenesisBlock == uint256S("0x05a60a92d99d85997cce3b87616c089f6124d7342af37106edc76126334a2c38")); + assert(genesis.hashMerkleRoot == uint256S("0xc4eaa58879081de3c24a7b117ed2b28300e7ec4c4c1dff1d3f1268b7857a4ddb")); vFixedSeeds.clear(); vSeeds.clear(); @@ -341,24 +343,27 @@ public: consensus.nPowMaxAdjustDown = 0; // Turn off adjustment down consensus.nPowMaxAdjustUp = 0; // Turn off adjustment up consensus.nPowTargetSpacing = 2.5 * 60; + pchMessageStart[0] = 0xaa; pchMessageStart[1] = 0xe8; pchMessageStart[2] = 0x3f; pchMessageStart[3] = 0x5f; + nDefaultPort = 18344; nMaxTipAge = 24 * 60 * 60; + nPruneAfterHeight = 1000; const size_t N = 48, K = 5; BOOST_STATIC_ASSERT(equihash_parameters_acceptable(N, K)); nEquihashN = N; nEquihashK = K; + genesis = CreateGenesisBlock( 1296688602, uint256S("0x0000000000000000000000000000000000000000000000000000000000000009"), ParseHex("01936b7db1eb4ac39f151b8704642d0a8bda13ec547d54cd5e43ba142fc6d8877cab07b3"), - 0x200f0f0f); + 0x200f0f0f, 4, 0); consensus.hashGenesisBlock = genesis.GetHash(); - nDefaultPort = 18344; assert(consensus.hashGenesisBlock == uint256S("0x029f11d80ef9765602235e1bc9727e3eb6ba20839319f761fee920d63401e327")); - nPruneAfterHeight = 1000; + assert(genesis.hashMerkleRoot == uint256S("0xc4eaa58879081de3c24a7b117ed2b28300e7ec4c4c1dff1d3f1268b7857a4ddb")); vFixedSeeds.clear(); //! Regtest mode doesn't have any fixed seeds. vSeeds.clear(); //! Regtest mode doesn't have any DNS seeds. From 47b71cec5d76c54e2f74eb9bf6ae98b62f8af376 Mon Sep 17 00:00:00 2001 From: Cory Fields Date: Fri, 5 Jun 2015 15:36:34 -0400 Subject: [PATCH 0403/1062] chainparams: move CCheckpointData into chainparams.h This unties CChainParams from its dependency on checkpoints. Instead, now it only depends on the raw checkpoint data. --- src/chainparams.cpp | 6 +++--- src/chainparams.h | 13 ++++++++++--- src/checkpoints.h | 9 +-------- src/test/Checkpoints_tests.cpp | 2 +- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index a338d9a7f..6b2223e6d 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -147,7 +147,7 @@ public: fMineBlocksOnDemand = false; fTestnetToBeDeprecatedFieldRPC = false; - checkpointData = (Checkpoints::CCheckpointData) { + checkpointData = (CCheckpointData) { boost::assign::map_list_of (0, consensus.hashGenesisBlock) (2500, uint256S("0x00000006dc968f600be11a86cbfbf7feb61c7577f45caced2e82b6d261d19744")) @@ -293,7 +293,7 @@ public: fMineBlocksOnDemand = false; fTestnetToBeDeprecatedFieldRPC = true; - checkpointData = (Checkpoints::CCheckpointData) { + checkpointData = (CCheckpointData) { boost::assign::map_list_of (0, consensus.hashGenesisBlock) (38000, uint256S("0x001e9a2d2e2892b88e9998cf7b079b41d59dd085423a921fe8386cecc42287b8")), @@ -374,7 +374,7 @@ public: fMineBlocksOnDemand = true; fTestnetToBeDeprecatedFieldRPC = false; - checkpointData = (Checkpoints::CCheckpointData){ + checkpointData = (CCheckpointData){ boost::assign::map_list_of ( 0, uint256S("0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206")), 0, diff --git a/src/chainparams.h b/src/chainparams.h index 0de8d01b5..10e2e6d15 100644 --- a/src/chainparams.h +++ b/src/chainparams.h @@ -7,7 +7,6 @@ #define BITCOIN_CHAINPARAMS_H #include "chainparamsbase.h" -#include "checkpoints.h" #include "consensus/params.h" #include "primitives/block.h" #include "protocol.h" @@ -24,6 +23,14 @@ struct SeedSpec6 { uint16_t port; }; +typedef std::map MapCheckpoints; + +struct CCheckpointData { + MapCheckpoints mapCheckpoints; + int64_t nTimeLastCheckpoint; + int64_t nTransactionsLastCheckpoint; + double fTransactionsPerDay; +}; /** * CChainParams defines various tweakable parameters of a given instance of the @@ -75,7 +82,7 @@ public: const std::vector& DNSSeeds() const { return vSeeds; } const std::vector& Base58Prefix(Base58Type type) const { return base58Prefixes[type]; } const std::vector& FixedSeeds() const { return vFixedSeeds; } - const Checkpoints::CCheckpointData& Checkpoints() const { return checkpointData; } + const CCheckpointData& Checkpoints() const { return checkpointData; } /** Return the founder's reward address and script for a given block height */ std::string GetFoundersRewardAddressAtHeight(int height) const; CScript GetFoundersRewardScriptAtHeight(int height) const; @@ -105,7 +112,7 @@ protected: bool fRequireStandard = false; bool fMineBlocksOnDemand = false; bool fTestnetToBeDeprecatedFieldRPC = false; - Checkpoints::CCheckpointData checkpointData; + CCheckpointData checkpointData; std::vector vFoundersRewardAddress; }; diff --git a/src/checkpoints.h b/src/checkpoints.h index 001e3cc80..5fce6fa81 100644 --- a/src/checkpoints.h +++ b/src/checkpoints.h @@ -10,6 +10,7 @@ #include class CBlockIndex; +struct CCheckpointData; /** * Block-chain checkpoints are compiled-in sanity checks. @@ -17,14 +18,6 @@ class CBlockIndex; */ namespace Checkpoints { -typedef std::map MapCheckpoints; - -struct CCheckpointData { - MapCheckpoints mapCheckpoints; - int64_t nTimeLastCheckpoint; - int64_t nTransactionsLastCheckpoint; - double fTransactionsPerDay; -}; //! Return conservative estimate of total number of blocks, 0 if unknown int GetTotalBlocksEstimate(const CCheckpointData& data); diff --git a/src/test/Checkpoints_tests.cpp b/src/test/Checkpoints_tests.cpp index d15203945..32b14cb93 100644 --- a/src/test/Checkpoints_tests.cpp +++ b/src/test/Checkpoints_tests.cpp @@ -22,7 +22,7 @@ BOOST_FIXTURE_TEST_SUITE(Checkpoints_tests, BasicTestingSetup) /* BOOST_AUTO_TEST_CASE(sanity) { - const Checkpoints::CCheckpointData& checkpoints = Params(CBaseChainParams::MAIN).Checkpoints(); + const CCheckpointData& checkpoints = Params(CBaseChainParams::MAIN).Checkpoints(); BOOST_CHECK(Checkpoints::GetTotalBlocksEstimate(checkpoints) >= 134444); } */ From 91690d6e84eacac845a566c2e9c0a8800ce96e87 Mon Sep 17 00:00:00 2001 From: Cory Fields Date: Fri, 5 Jun 2015 16:01:44 -0400 Subject: [PATCH 0404/1062] chainparams: don't use std namespace --- src/chainparams.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 6b2223e6d..9afe46b87 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -15,8 +15,6 @@ #include "base58.h" -using namespace std; - #include "chainparamsseeds.h" static CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesisOutputScript, uint32_t nTime, const uint256& nNonce, const std::vector& nSolution, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward) @@ -25,7 +23,7 @@ static CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesi txNew.nVersion = 1; txNew.vin.resize(1); txNew.vout.resize(1); - txNew.vin[0].scriptSig = CScript() << 520617983 << CScriptNum(4) << vector((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp)); + txNew.vin[0].scriptSig = CScript() << 520617983 << CScriptNum(4) << std::vector((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp)); txNew.vout[0].nValue = genesisReward; txNew.vout[0].scriptPubKey = genesisOutputScript; From ff145dfe32a853bf98d9c0f32bf7074852112486 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 9 Nov 2017 17:03:07 +0000 Subject: [PATCH 0405/1062] Add missing namespace for boost::get --- src/chainparams.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 9afe46b87..1897b4b6c 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -457,7 +457,7 @@ CScript CChainParams::GetFoundersRewardScriptAtHeight(int nHeight) const { CBitcoinAddress address(GetFoundersRewardAddressAtHeight(nHeight).c_str()); assert(address.IsValid()); assert(address.IsScript()); - CScriptID scriptID = get(address.Get()); // Get() returns a boost variant + CScriptID scriptID = boost::get(address.Get()); // Get() returns a boost variant CScript script = CScript() << OP_HASH160 << ToByteVector(scriptID) << OP_EQUAL; return script; } From 40ebf08ff82684e23f87ec43cfdfdf8375fb25c5 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Mon, 22 Jan 2018 15:32:52 +0000 Subject: [PATCH 0406/1062] Add viewing key prefix to regtest parameters --- src/chainparams.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 1897b4b6c..36b71b5c7 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -387,6 +387,7 @@ public: base58Prefixes[EXT_PUBLIC_KEY] = {0x04,0x35,0x87,0xCF}; base58Prefixes[EXT_SECRET_KEY] = {0x04,0x35,0x83,0x94}; base58Prefixes[ZCPAYMENT_ADDRRESS] = {0x16,0xB6}; + base58Prefixes[ZCVIEWING_KEY] = {0xA8,0xAC,0x0C}; base58Prefixes[ZCSPENDING_KEY] = {0xAC,0x08}; // Founders reward script expects a vector of 2-of-3 multisig addresses From 9e8f1d09ca2142562030db10a5eed31376fb6a85 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Mon, 22 Jan 2018 21:08:15 +0000 Subject: [PATCH 0407/1062] zkey_import_export: Synchronize mempools before mining Resolves a race condition that caused the RPC test to intermittently fail. Closes #2892. --- qa/rpc-tests/zkey_import_export.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/qa/rpc-tests/zkey_import_export.py b/qa/rpc-tests/zkey_import_export.py index f6d7af765..243ca3909 100755 --- a/qa/rpc-tests/zkey_import_export.py +++ b/qa/rpc-tests/zkey_import_export.py @@ -113,7 +113,8 @@ class ZkeyImportExportTest (BitcoinTestFramework): alice_zaddr = alice.z_getnewaddress() res = alice.z_shieldcoinbase("*", alice_zaddr) self.wait_and_assert_operationid_status(alice, res['opid']) - miner.generate(6) + self.sync_all() + miner.generate(1) self.sync_all() # Now get a pristine z-address for receiving transfers: From 6585a02268125511b5589fe330a39c376f78d165 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Tue, 23 Jan 2018 14:05:43 -0300 Subject: [PATCH 0408/1062] cli method to create CC transaction --- qa/test_rpc_cryptoconditions.py | 47 ++++++ src/rpccryptoconditions.cpp | 246 +++++++++++--------------------- 2 files changed, 129 insertions(+), 164 deletions(-) create mode 100644 qa/test_rpc_cryptoconditions.py diff --git a/qa/test_rpc_cryptoconditions.py b/qa/test_rpc_cryptoconditions.py new file mode 100644 index 000000000..a93eab86a --- /dev/null +++ b/qa/test_rpc_cryptoconditions.py @@ -0,0 +1,47 @@ +import os +import subprocess +import json +import base64 + + +inputs = [ + { + 'txid': '9b907ef1e3c26fc71fe4a4b3580bc75264112f95050014157059c736f0202e71', + 'vout': 0, + 'fulfillment': { + 'type': 'preimage-sha-256', + 'preimage': '', + }, + } +] + +outputs = [ + { + "condition": { + 'type': 'preimage-sha-256', + 'preimage': '' + }, + "amount": 1, + } +] + +addresses = ['RQygCQA7ovCrVCHM3sSkDQjjQUg5X4SCJw'] +privkeys = ["UszeEw39HcoeRegZb74xuvngbcQ5jkwQZZVpAvBp1bvBhXD36ghX"] + + +proc = subprocess.Popen(['src/komodo-cli', 'createrawtransactioncc', json.dumps(inputs), json.dumps(outputs)], + stdout=subprocess.PIPE) + +assert not proc.wait() + +tx_hex = proc.stdout.read().strip() +tx = base64.b16decode(tx_hex, casefold=True) + +print repr(tx) + +proc = subprocess.Popen(['src/komodo-cli', 'signrawtransactioncc', tx_hex, json.dumps(privkeys)], + stdout=subprocess.PIPE) + +proc.wait() + +result = json.loads(proc.stdout.read()) diff --git a/src/rpccryptoconditions.cpp b/src/rpccryptoconditions.cpp index e297ed4e4..18d6774f0 100644 --- a/src/rpccryptoconditions.cpp +++ b/src/rpccryptoconditions.cpp @@ -375,45 +375,73 @@ UniValue verifytxoutproofcc(const UniValue& params, bool fHelp) return res; } -CC *ConditionFromValue(const UniValue& condition) { - std::string encoded = condition.write(); + +CC *ConditionFromString(std::string encoded) { char *err = new char[1000]; CC *cond = cc_conditionFromJSONString(encoded.c_str(), err); if (NULL == cond) throw JSONRPCError(RPC_INVALID_PARAMETER, err); } + +CC *ConditionFromCharVector(vector& vch) { + return ConditionFromString(std::string(vch.begin(), vch.end())); +} + + +CC *ConditionFromUnsignedInputScript(const CScript& script) +{ + opcodetype op; + CScript::const_iterator it = script.begin(); + + vector vch; + if (script.GetOp2(it, op, &vch)) { + if (vch.at(0) == '{') { + return ConditionFromCharVector(vch); + } + } + return NULL; +} + + +CC *ConditionFromValue(UniValue value) { + std::string conditionEncoded = value.write(); + // TODO: Is null? + return ConditionFromString(conditionEncoded); +} + UniValue createrawtransactioncc(const UniValue& params, bool fHelp) { if (fHelp || params.size() != 2) throw runtime_error( - "createrawtransaction [{\"txid\":\"id\",\"vout\":n},...] {\"address\":amount,...}\n" + "createrawtransactioncc [{\"txid\":\"id\",\"vout\":n,\"fulfillment\":{...}},...] {\"address\":amount,...}\n" "\nCreate a transaction spending the given inputs and sending to the given addresses.\n" "Returns hex-encoded raw transaction.\n" "Note that the transaction's inputs are not signed, and\n" "it is not stored in the wallet or transmitted to the network.\n" "\nArguments:\n" - "1. \"transactions\" (string, required) A json array of json objects\n" + "1. \"inputs\" (string, required) A json array of json objects\n" " [\n" " {\n" - " \"txid\":\"id\", (string, required) The transaction id\n" - " \"vout\":n (numeric, required) The output number\n" + " \"txid\":\"id\", (string, required) The transaction id\n" + " \"vout\":n, (numeric, required) The output number\n" + " \"fulfillment\":{...} (object, required) The JSON encoded cryptocondition fulfillment for the previous transaction's output\n" " }\n" " ,...\n" " ]\n" - "2. \"addresses\" (string, required) a json object with addresses as keys and amounts as values\n" + "2. \"outputs\" (string, required) a json array with addresses as keys and amounts as values\n" " {\n" - " \"address\": x.xxx (numeric, required) The key is the bitcoin address, the value is the btc amount\n" - " ,...\n" + " \"condition\":\"{...}\" (object, required) The JSON encoded condition\n" + " \"amount\":n, (numeric, required) The coin amount in satoshis\n" " }\n" "\nResult:\n" - "\"transaction\" (string) hex string of the transaction\n" + "\"transaction\" (string) hex string of the transaction\n" - "\nExamples\n" - + HelpExampleCli("createrawtransactioncc", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\" \"{\\\"address\\\":0.01}\"") - + HelpExampleRpc("createrawtransactioncc", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\", \"{\\\"address\\\":0.01}\"") + // "\nExamples\n" + // + HelpExampleCli("createrawtransactioncc", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\" \"{\\\"address\\\":0.01}\"") + // + HelpExampleRpc("createrawtransactioncc", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\", \"{\\\"address\\\":0.01}\"") ); LOCK(cs_main); @@ -437,49 +465,46 @@ UniValue createrawtransactioncc(const UniValue& params, bool fHelp) if (nOutput < 0) throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, vout must be positive"); - CC *cond = ConditionFromValue(find_value(output, "condition")); - char *ffillBin = new char[1024*1024]; + const UniValue& ffill_v = find_value(input, "fulfillment"); + if (!ffill_v.isObject()) { + throw JSONRPCError(RPC_INVALID_PARAMETER, "\"fulfillment\" missing or not an object"); + } + const std::string ffillEncoded = ffill_v.write(); - CTxIn in(COutPoint(txid, nOutput)); + // Validate the fulfillment + CC *cond = ConditionFromString(ffillEncoded); + if (cond == NULL) { + throw JSONRPCError(RPC_INVALID_PARAMETER, "\"fulfillment\" not a valid JSON encoded crypto condition"); + } + cc_free(cond); + + CScript inputScript; + const std::vector ffill(ffillEncoded.c_str(), ffillEncoded.c_str() + ffillEncoded.size()); + inputScript << ffill; + + CTxIn in(COutPoint(txid, nOutput), inputScript); rawTx.vin.push_back(in); } for (size_t idx = 0; idx < outputs.size(); idx++) { const UniValue& output = outputs[idx].get_obj(); + // This does not need to be fulfilled, we just want the condition binary CC *cond = ConditionFromValue(find_value(output, "condition")); + char *condBin = new char[1000]; size_t binLength = cc_conditionBinary(cond, condBin); - std::vector condVec(condBin, condBin + binLength); + const std::vector condVec(condBin, condBin + binLength); CScript redeemScript; - redeemScript << ToByteVector(condVec) << OP_CHECKCRYPTOCONDITIONVERIFY; + redeemScript << condVec << OP_CHECKCRYPTOCONDITIONVERIFY; + CAmount nAmount = AmountFromValue(find_value(output, "amount")); CTxOut out(nAmount, redeemScript); rawTx.vout.push_back(out); } - /* - set setAddress; - vector addrList = sendTo.getKeys(); - BOOST_FOREACH(const string& name_, addrList) { - CBitcoinAddress address(name_); - if (!address.IsValid()) - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, string("Invalid Bitcoin address: ")+name_); - - if (setAddress.count(address)) - throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid parameter, duplicated address: ")+name_); - setAddress.insert(address); - - CScript scriptPubKey = GetScriptForDestination(address.Get()); - CAmount nAmount = AmountFromValue(sendTo[name_]); - - CTxOut out(nAmount, scriptPubKey); - rawTx.vout.push_back(out); - } - */ - return EncodeHexTx(rawTx); } @@ -575,57 +600,15 @@ UniValue decoderawtransactioncc(const UniValue& params, bool fHelp) return result; } -UniValue decodescriptcc(const UniValue& params, bool fHelp) -{ - if (fHelp || params.size() != 1) - throw runtime_error( - "decodescript \"hex\"\n" - "\nDecode a hex-encoded script.\n" - "\nArguments:\n" - "1. \"hex\" (string) the hex encoded script\n" - "\nResult:\n" - "{\n" - " \"asm\":\"asm\", (string) Script public key\n" - " \"hex\":\"hex\", (string) hex encoded public key\n" - " \"type\":\"type\", (string) The output type\n" - " \"reqSigs\": n, (numeric) The required signatures\n" - " \"addresses\": [ (json array of string)\n" - " \"address\" (string) bitcoin address\n" - " ,...\n" - " ],\n" - " \"p2sh\",\"address\" (string) script address\n" - "}\n" - "\nExamples:\n" - + HelpExampleCli("decodescript", "\"hexstring\"") - + HelpExampleRpc("decodescript", "\"hexstring\"") - ); - - LOCK(cs_main); - RPCTypeCheck(params, boost::assign::list_of(UniValue::VSTR)); - - UniValue r(UniValue::VOBJ); - CScript script; - if (params[0].get_str().size() > 0){ - vector scriptData(ParseHexV(params[0], "argument")); - script = CScript(scriptData.begin(), scriptData.end()); - } else { - // Empty scripts are valid - } - ScriptPubKeyToJSON(script, r, false); - - r.push_back(Pair("p2sh", CBitcoinAddress(CScriptID(script)).ToString())); - return r; -} - /** Pushes a JSON object for script verification or signing errors to vErrorsRet. */ static void TxInErrorToJSON(const CTxIn& txin, UniValue& vErrorsRet, const std::string& strMessage) {} UniValue signrawtransactioncc(const UniValue& params, bool fHelp) { - if (fHelp || params.size() < 1 || params.size() > 4) + if (fHelp || params.size() < 1 || params.size() > 2) throw runtime_error( - "signrawtransactioncc \"hexstring\" ( [{\"txid\":\"id\",\"vout\":n,\"scriptPubKey\":\"hex\",\"redeemScript\":\"hex\"},...] [\"privatekey1\",...] sighashtype )\n" + "signrawtransactioncc \"hexstring\" ( [\"privatekey1\",...] sighashtype )\n" "\nSign cryptocondition inputs for raw transaction (serialized, hex-encoded).\n" "The second optional argument (may be null) is an array of previous transaction outputs that\n" "this transaction depends on but may not yet be in the block chain.\n" @@ -637,17 +620,7 @@ UniValue signrawtransactioncc(const UniValue& params, bool fHelp) "\nArguments:\n" "1. \"hexstring\" (string, required) The transaction hex string\n" - /* "2. \"prevtxs\" (string, optional) An json array of previous dependent transaction outputs\n" - " [ (json array of json objects, or 'null' if none provided)\n" - " {\n" - " \"txid\":\"id\", (string, required) The transaction id\n" - " \"vout\":n, (numeric, required) The output number\n" - " \"scriptPubKey\": \"hex\", (string, required) script key\n" - " \"redeemScript\": \"hex\" (string, required for P2SH) redeem script\n" - " }\n" - " ,...\n" - " ]\n" */ - "3. \"privatekeys\" (string, optional) A json array of base58-encoded private keys for signing\n" + "2. \"privatekeys\" (string, optional) A json array of base58-encoded private keys for signing\n" " [ (json array of strings, or 'null' if none provided)\n" " \"privatekey\" (string) private key in base58-encoding\n" " ,...\n" @@ -709,24 +682,6 @@ UniValue signrawtransactioncc(const UniValue& params, bool fHelp) // starts as a clone of the rawtx: CMutableTransaction mergedTx(txVariants[0]); - // Fetch previous transactions (inputs): - CCoinsView viewDummy; - CCoinsViewCache view(&viewDummy); - { - LOCK(mempool.cs); - CCoinsViewCache &viewChain = *pcoinsTip; - CCoinsViewMemPool viewMempool(&viewChain, mempool); - view.SetBackend(viewMempool); // temporarily switch cache backend to db+mempool view - - BOOST_FOREACH(const CTxIn& txin, mergedTx.vin) { - const uint256& prevHash = txin.prevout.hash; - CCoins coins; - view.AccessCoins(prevHash); // this is certainly allowed to fail - } - - view.SetBackend(viewDummy); // switch back to avoid locking mempool for too long - } - bool fGivenKeys = false; CBasicKeyStore tempKeystore; if (params.size() > 2 && !params[2].isNull()) { @@ -749,57 +704,6 @@ UniValue signrawtransactioncc(const UniValue& params, bool fHelp) EnsureWalletIsUnlocked(); #endif - // Add previous txouts given in the RPC call: - /* - if (params.size() > 1 && !params[1].isNull()) { - UniValue prevTxs = params[1].get_array(); - for (size_t idx = 0; idx < prevTxs.size(); idx++) { - const UniValue& p = prevTxs[idx]; - if (!p.isObject()) - throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "expected object with {\"txid'\",\"vout\",\"scriptPubKey\"}"); - - UniValue prevOut = p.get_obj(); - - RPCTypeCheckObj(prevOut, boost::assign::map_list_of("txid", UniValue::VSTR)("vout", UniValue::VNUM)("scriptPubKey", UniValue::VSTR)); - - uint256 txid = ParseHashO(prevOut, "txid"); - - int nOut = find_value(prevOut, "vout").get_int(); - if (nOut < 0) - throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "vout must be positive"); - - vector pkData(ParseHexO(prevOut, "scriptPubKey")); - CScript scriptPubKey(pkData.begin(), pkData.end()); - - { - CCoinsModifier coins = view.ModifyCoins(txid); - if (coins->IsAvailable(nOut) && coins->vout[nOut].scriptPubKey != scriptPubKey) { - string err("Previous output scriptPubKey mismatch:\n"); - err = err + coins->vout[nOut].scriptPubKey.ToString() + "\nvs:\n"+ - scriptPubKey.ToString(); - throw JSONRPCError(RPC_DESERIALIZATION_ERROR, err); - } - if ((unsigned int)nOut >= coins->vout.size()) - coins->vout.resize(nOut+1); - coins->vout[nOut].scriptPubKey = scriptPubKey; - coins->vout[nOut].nValue = 0; // we don't know the actual output value - } - - // if redeemScript given and not using the local wallet (private keys - // given), add redeemScript to the tempKeystore so it can be signed: - if (fGivenKeys && scriptPubKey.IsPayToScriptHash()) { - RPCTypeCheckObj(prevOut, boost::assign::map_list_of("txid", UniValue::VSTR)("vout", UniValue::VNUM)("scriptPubKey", UniValue::VSTR)("redeemScript",UniValue::VSTR)); - UniValue v = find_value(prevOut, "redeemScript"); - if (!v.isNull()) { - vector rsData(ParseHexV(v, "redeemScript")); - CScript redeemScript(rsData.begin(), rsData.end()); - tempKeystore.AddCScript(redeemScript); - } - } - } - } - */ - #ifdef ENABLE_WALLET const CKeyStore& keystore = ((fGivenKeys || !pwalletMain) ? tempKeystore : *pwalletMain); #else @@ -834,6 +738,18 @@ UniValue signrawtransactioncc(const UniValue& params, bool fHelp) // Sign what we can: for (unsigned int i = 0; i < mergedTx.vin.size(); i++) { CTxIn& txin = mergedTx.vin[i]; + + CC *cond; + + printf("Go\n"); + if (cond = ConditionFromUnsignedInputScript(txin.scriptSig)) { + printf("Found unsigned\n"); + continue; + } + printf("No luck\n"); + + /* + * Replace all this with detection of cryptoconditions spec and signing with each privkey const CCoins* coins = view.AccessCoins(txin.prevout.hash); if (coins == NULL || !coins->IsAvailable(txin.prevout.n)) { TxInErrorToJSON(txin, vErrors, "Input not found or already spent"); @@ -854,6 +770,7 @@ UniValue signrawtransactioncc(const UniValue& params, bool fHelp) if (!VerifyScript(txin.scriptSig, prevPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, MutableTransactionSignatureChecker(&mergedTx, i), &serror)) { TxInErrorToJSON(txin, vErrors, ScriptErrorString(serror)); } + */ } bool fComplete = vErrors.empty(); @@ -867,13 +784,14 @@ UniValue signrawtransactioncc(const UniValue& params, bool fHelp) return result; } + UniValue sendrawtransactioncc(const UniValue& params, bool fHelp) { if (fHelp || params.size() < 1 || params.size() > 2) throw runtime_error( "sendrawtransaction \"hexstring\" ( allowhighfees )\n" "\nSubmits raw transaction (serialized, hex-encoded) to local node and network.\n" - "\nAlso see createrawtransaction and signrawtransaction calls.\n" + "\nAlso see createrawtransactioncc and signrawtransactioncc calls.\n" "\nArguments:\n" "1. \"hexstring\" (string, required) The hex string of the raw transaction)\n" "2. allowhighfees (boolean, optional, default=false) Allow high fees\n" @@ -881,7 +799,7 @@ UniValue sendrawtransactioncc(const UniValue& params, bool fHelp) "\"hex\" (string) The transaction hash in hex\n" "\nExamples:\n" "\nCreate a transaction\n" - + HelpExampleCli("createrawtransaction", "\"[{\\\"txid\\\" : \\\"mytxid\\\",\\\"vout\\\":0}]\" \"{\\\"myaddress\\\":0.01}\"") + + + HelpExampleCli("createrawtransactioncc", "\"[{\\\"txid\\\" : \\\"mytxid\\\",\\\"vout\\\":0}]\" \"{\\\"myaddress\\\":0.01}\"") + "Sign the transaction, and get back the hex\n" + HelpExampleCli("signrawtransaction", "\"myhex\"") + "\nSend the transaction (signed hex)\n" From 63d3e4aab1b310b1658dafa648d50a96da6745bd Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Tue, 23 Jan 2018 14:12:43 -0300 Subject: [PATCH 0409/1062] add isFulfulled to cryptoconditions --- src/cryptoconditions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cryptoconditions b/src/cryptoconditions index a59c22dcf..6e34f2e32 160000 --- a/src/cryptoconditions +++ b/src/cryptoconditions @@ -1 +1 @@ -Subproject commit a59c22dcf9a67be5f11f88ff89bbd9cb40fd22c0 +Subproject commit 6e34f2e325516a08ea11e847f661bf6a8e524d38 From 20bfa355a0b88ce8266b9074110288f8b1cc7101 Mon Sep 17 00:00:00 2001 From: Pavel Vasin Date: Wed, 9 Mar 2016 19:29:23 +0300 Subject: [PATCH 0410/1062] remove unused NOBLKS_VERSION_{START,END} constants --- src/version.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/version.h b/src/version.h index 91a464030..b68bafc87 100644 --- a/src/version.h +++ b/src/version.h @@ -24,10 +24,6 @@ static const int MIN_PEER_PROTO_VERSION = 170002; //! if possible, avoid requesting addresses nodes older than this static const int CADDR_TIME_VERSION = 31402; -//! only request blocks from nodes outside this range of versions -static const int NOBLKS_VERSION_START = 32000; -static const int NOBLKS_VERSION_END = 32400; - //! BIP 0031, pong message, is enabled for all versions AFTER this one static const int BIP0031_VERSION = 60000; From df46562f261592d8a5ddde14dea5d208269db260 Mon Sep 17 00:00:00 2001 From: Jay Graber Date: Wed, 17 Jan 2018 01:25:58 -0800 Subject: [PATCH 0411/1062] Make applicable only on mainnet --- src/rpcnet.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/rpcnet.cpp b/src/rpcnet.cpp index 03d96f8b2..6f908516d 100644 --- a/src/rpcnet.cpp +++ b/src/rpcnet.cpp @@ -401,10 +401,11 @@ static UniValue GetNetworksInfo() UniValue getdeprecationinfo(const UniValue& params, bool fHelp) { - if (fHelp || params.size() != 0) + const CChainParams& chainparams = Params(); + if (fHelp || params.size() != 0 || chainparams.NetworkIDString() != "main") throw runtime_error( "getdeprecationinfo\n" - "Returns an object containing current version and deprecation block height.\n" + "Returns an object containing current version and deprecation block height. Applicable only on mainnet.\n" "\nResult:\n" "{\n" " \"version\": xxxxx, (numeric) the server version\n" @@ -416,9 +417,8 @@ UniValue getdeprecationinfo(const UniValue& params, bool fHelp) + HelpExampleRpc("getdeprecationinfo", "") ); - UniValue obj(UniValue::VOBJ); - obj.push_back(Pair("version", CLIENT_VERSION)); + obj.push_back(Pair("version", CLIENT_VERSION)); obj.push_back(Pair("subversion", FormatSubVersion(CLIENT_NAME, CLIENT_VERSION, std::vector()))); obj.push_back(Pair("deprecationheight", DEPRECATION_HEIGHT)); From 35d64c1fdefc3f5142b3b66ee1492903b9d28567 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 31 Jan 2018 15:31:51 +0000 Subject: [PATCH 0412/1062] Use JoinSplitTestingSetup for Boost sighash tests Symptom: When running all tests, the test suite passed. But when running the sighash tests on their own, the test suite segfaulted. Cause: The sighash tests depend on the proving parameters being accessible, but BasicTestingSetup doesn't load them. --- src/test/sighash_tests.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/sighash_tests.cpp b/src/test/sighash_tests.cpp index 989ed7428..c33eab17e 100644 --- a/src/test/sighash_tests.cpp +++ b/src/test/sighash_tests.cpp @@ -152,7 +152,7 @@ void static RandomTransaction(CMutableTransaction &tx, bool fSingle) { } } -BOOST_FIXTURE_TEST_SUITE(sighash_tests, BasicTestingSetup) +BOOST_FIXTURE_TEST_SUITE(sighash_tests, JoinSplitTestingSetup) BOOST_AUTO_TEST_CASE(sighash_test) { From 780f526bc9466c4dc51dd290f9fa5f87c5321387 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 17 Jan 2018 11:25:28 +0000 Subject: [PATCH 0413/1062] Network upgrade activation mechanism --- src/Makefile.am | 2 + src/chainparams.cpp | 8 ++++ src/consensus/params.h | 42 +++++++++++++++++ src/consensus/upgrades.cpp | 94 ++++++++++++++++++++++++++++++++++++++ src/consensus/upgrades.h | 77 +++++++++++++++++++++++++++++++ 5 files changed, 223 insertions(+) create mode 100644 src/consensus/upgrades.cpp create mode 100644 src/consensus/upgrades.h diff --git a/src/Makefile.am b/src/Makefile.am index 44b4d8281..d8ab34ea0 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -138,6 +138,7 @@ BITCOIN_CORE_H = \ compressor.h \ consensus/consensus.h \ consensus/params.h \ + consensus/upgrades.h \ consensus/validation.h \ core_io.h \ core_memusage.h \ @@ -354,6 +355,7 @@ libbitcoin_common_a_SOURCES = \ chainparams.cpp \ coins.cpp \ compressor.cpp \ + consensus/upgrades.cpp \ core_read.cpp \ core_write.cpp \ hash.cpp \ diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 36b71b5c7..fd928318d 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -90,6 +90,9 @@ public: consensus.nPowMaxAdjustDown = 32; // 32% adjustment down consensus.nPowMaxAdjustUp = 16; // 16% adjustment up consensus.nPowTargetSpacing = 2.5 * 60; + consensus.vUpgrades[Consensus::BASE_SPROUT].nActivationHeight = + Consensus::NetworkUpgrade::ALWAYS_ACTIVE; + /** * The message start string should be awesome! ⓩ❤ */ @@ -241,6 +244,9 @@ public: consensus.nPowMaxAdjustDown = 32; // 32% adjustment down consensus.nPowMaxAdjustUp = 16; // 16% adjustment up consensus.nPowTargetSpacing = 2.5 * 60; + consensus.vUpgrades[Consensus::BASE_SPROUT].nActivationHeight = + Consensus::NetworkUpgrade::ALWAYS_ACTIVE; + pchMessageStart[0] = 0xfa; pchMessageStart[1] = 0x1a; pchMessageStart[2] = 0xf9; @@ -341,6 +347,8 @@ public: consensus.nPowMaxAdjustDown = 0; // Turn off adjustment down consensus.nPowMaxAdjustUp = 0; // Turn off adjustment up consensus.nPowTargetSpacing = 2.5 * 60; + consensus.vUpgrades[Consensus::BASE_SPROUT].nActivationHeight = + Consensus::NetworkUpgrade::ALWAYS_ACTIVE; pchMessageStart[0] = 0xaa; pchMessageStart[1] = 0xe8; diff --git a/src/consensus/params.h b/src/consensus/params.h index c74e66d5f..59d725cba 100644 --- a/src/consensus/params.h +++ b/src/consensus/params.h @@ -9,6 +9,47 @@ #include "uint256.h" namespace Consensus { + +/** + * Index into Params.vUpgrades and NetworkUpgradeInfo + * + * Being array indices, these MUST be numbered consecutively. + * + * The order of these indices MUST match the order of the upgrades on-chain, as + * several functions depends on the enum being sorted. + */ +enum UpgradeIndex { + // Sprout must be first + BASE_SPROUT, + // NOTE: Also add new upgrades to NetworkUpgradeInfo in upgrades.cpp + MAX_NETWORK_UPGRADES +}; + +struct NetworkUpgrade { + /** + * Height of the first block for which the new consensus rules will be active + */ + int nActivationHeight; + + /** + * Special value for nActivationHeight indicating that the upgrade is always active. + * This is useful for testing, as it means tests don't need to deal with the activation + * process (namely, faking a chain of somewhat-arbitrary length). + * + * New blockchains that want to enable upgrade rules from the beginning can also use + * this value. However, additional care must be taken to ensure the genesis block + * satisfies the enabled rules. + */ + static constexpr int ALWAYS_ACTIVE = 0; + + /** + * Special value for nActivationHeight indicating that the upgrade will never activate. + * This is useful when adding upgrade code that has a testnet activation height, but + * should remain disabled on mainnet. + */ + static constexpr int NO_ACTIVATION_HEIGHT = -1; +}; + /** * Parameters that influence chain consensus. */ @@ -39,6 +80,7 @@ struct Params { int nMajorityEnforceBlockUpgrade; int nMajorityRejectBlockOutdated; int nMajorityWindow; + NetworkUpgrade vUpgrades[MAX_NETWORK_UPGRADES]; /** Proof of work parameters */ uint256 powLimit; int64_t nPowAveragingWindow; diff --git a/src/consensus/upgrades.cpp b/src/consensus/upgrades.cpp new file mode 100644 index 000000000..1191e02ff --- /dev/null +++ b/src/consensus/upgrades.cpp @@ -0,0 +1,94 @@ +// Copyright (c) 2018 The Zcash developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "consensus/upgrades.h" + +/** + * General information about each network upgrade. + * Ordered by Consensus::UpgradeIndex. + */ +const struct NUInfo NetworkUpgradeInfo[Consensus::MAX_NETWORK_UPGRADES] = { + { + /*.nBranchId =*/ 0, + /*.strName =*/ "Sprout", + /*.strInfo =*/ "The Zcash network at launch", + } +}; + +UpgradeState NetworkUpgradeState( + int nHeight, + const Consensus::Params& params, + Consensus::UpgradeIndex idx) +{ + assert(nHeight >= 0); + assert(idx >= Consensus::BASE_SPROUT && idx < Consensus::MAX_NETWORK_UPGRADES); + auto nActivationHeight = params.vUpgrades[idx].nActivationHeight; + + if (nActivationHeight == Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT) { + return UPGRADE_DISABLED; + } else if (nHeight >= nActivationHeight) { + // From ZIP ???: + // + // ACTIVATION_HEIGHT + // The block height at which the network upgrade rules will come into effect. + // + // For removal of ambiguity, the block at height ACTIVATION_HEIGHT - 1 is + // subject to the pre-upgrade consensus rules. + return UPGRADE_ACTIVE; + } else { + return UPGRADE_PENDING; + } +} + +bool NetworkUpgradeActive( + int nHeight, + const Consensus::Params& params, + Consensus::UpgradeIndex idx) +{ + return NetworkUpgradeState(nHeight, params, idx) == UPGRADE_ACTIVE; +} + +int CurrentEpoch(int nHeight, const Consensus::Params& params) { + for (auto idxInt = Consensus::MAX_NETWORK_UPGRADES - 1; idxInt >= Consensus::BASE_SPROUT; idxInt--) { + if (NetworkUpgradeActive(nHeight, params, Consensus::UpgradeIndex(idxInt))) { + return idxInt; + } + } +} + +uint32_t CurrentEpochBranchId(int nHeight, const Consensus::Params& params) { + return NetworkUpgradeInfo[CurrentEpoch(nHeight, params)].nBranchId; +} + +bool IsActivationHeight( + int nHeight, + const Consensus::Params& params, + Consensus::UpgradeIndex idx) +{ + assert(idx >= Consensus::BASE_SPROUT && idx < Consensus::MAX_NETWORK_UPGRADES); + + // Don't count Sprout as an activation height + if (idx == Consensus::BASE_SPROUT) { + return false; + } + + return nHeight >= 0 && nHeight == params.vUpgrades[idx].nActivationHeight; +} + +bool IsActivationHeightForAnyUpgrade( + int nHeight, + const Consensus::Params& params) +{ + if (nHeight < 0) { + return false; + } + + // Don't count Sprout as an activation height + for (int idx = Consensus::BASE_SPROUT + 1; idx < Consensus::MAX_NETWORK_UPGRADES; idx++) { + if (nHeight == params.vUpgrades[idx].nActivationHeight) + return true; + } + + return false; +} diff --git a/src/consensus/upgrades.h b/src/consensus/upgrades.h new file mode 100644 index 000000000..c62655530 --- /dev/null +++ b/src/consensus/upgrades.h @@ -0,0 +1,77 @@ +// Copyright (c) 2018 The Zcash developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef ZCASH_CONSENSUS_UPGRADES_H +#define ZCASH_CONSENSUS_UPGRADES_H + +#include "consensus/params.h" + +enum UpgradeState { + UPGRADE_DISABLED, + UPGRADE_PENDING, + UPGRADE_ACTIVE +}; + +struct NUInfo { + /** Branch ID (a random non-zero 32-bit value) */ + uint32_t nBranchId; + /** User-facing name for the upgrade */ + std::string strName; + /** User-facing information string about the upgrade */ + std::string strInfo; +}; + +extern const struct NUInfo NetworkUpgradeInfo[]; + +/** + * Checks the state of a given network upgrade based on block height. + * Caller must check that the height is >= 0 (and handle unknown heights). + */ +UpgradeState NetworkUpgradeState( + int nHeight, + const Consensus::Params& params, + Consensus::UpgradeIndex idx); + +/** + * Returns true if the given network upgrade is active as of the given block + * height. Caller must check that the height is >= 0 (and handle unknown + * heights). + */ +bool NetworkUpgradeActive( + int nHeight, + const Consensus::Params& params, + Consensus::UpgradeIndex idx); + +/** + * Returns the index of the most recent upgrade as of the given block height + * (corresponding to the current "epoch"). Consensus::BASE_SPROUT is the + * default value if no upgrades are active. Caller must check that the height + * is >= 0 (and handle unknown heights). + */ +int CurrentEpoch(int nHeight, const Consensus::Params& params); + +/** + * Returns the branch ID of the most recent upgrade as of the given block height + * (corresponding to the current "epoch"), or 0 if no upgrades are active. + * Caller must check that the height is >= 0 (and handle unknown heights). + */ +uint32_t CurrentEpochBranchId(int nHeight, const Consensus::Params& params); + +/** + * Returns true if the given block height is the activation height for the given + * upgrade. + */ +bool IsActivationHeight( + int nHeight, + const Consensus::Params& params, + Consensus::UpgradeIndex upgrade); + +/** + * Returns true if the given block height is the activation height for any upgrade. + */ +bool IsActivationHeightForAnyUpgrade( + int nHeight, + const Consensus::Params& params); + +#endif // ZCASH_CONSENSUS_UPGRADES_H From b174b7e3304116967a0af21b65109ffcf41ba76a Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 31 Jan 2018 20:11:18 +0000 Subject: [PATCH 0414/1062] Allow changing network upgrade parameters on regtest Derived from upstream commit 56c87e92110f05d7452f1e85bf755246ffc77206: Allow changing BIP9 parameters on regtest --- src/chainparams.cpp | 11 +++++++++++ src/chainparams.h | 5 +++++ src/init.cpp | 36 ++++++++++++++++++++++++++++++++++++ src/utilstrencodings.cpp | 8 ++++++++ src/utilstrencodings.h | 1 + 5 files changed, 61 insertions(+) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index fd928318d..65bc5577c 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -402,6 +402,12 @@ public: vFoundersRewardAddress = { "t2FwcEhFdNXuFMv1tcYwaBJtYVtMj8b1uTg" }; assert(vFoundersRewardAddress.size() <= consensus.GetLastFoundersRewardBlockHeight()); } + + void UpdateNetworkUpgradeParameters(Consensus::UpgradeIndex idx, int nActivationHeight) + { + assert(idx > Consensus::BASE_SPROUT && idx < Consensus::MAX_NETWORK_UPGRADES); + consensus.vUpgrades[idx].nActivationHeight = nActivationHeight; + } }; static CRegTestParams regTestParams; @@ -475,3 +481,8 @@ std::string CChainParams::GetFoundersRewardAddressAtIndex(int i) const { assert(i >= 0 && i < vFoundersRewardAddress.size()); return vFoundersRewardAddress[i]; } + +void UpdateNetworkUpgradeParameters(Consensus::UpgradeIndex idx, int nActivationHeight) +{ + regTestParams.UpdateNetworkUpgradeParameters(idx, nActivationHeight); +} diff --git a/src/chainparams.h b/src/chainparams.h index 10e2e6d15..f1d9b43c3 100644 --- a/src/chainparams.h +++ b/src/chainparams.h @@ -134,4 +134,9 @@ void SelectParams(CBaseChainParams::Network network); */ bool SelectParamsFromCommandLine(); +/** + * Allows modifying the network upgrade regtest parameters. + */ +void UpdateNetworkUpgradeParameters(Consensus::UpgradeIndex idx, int nActivationHeight); + #endif // BITCOIN_CHAINPARAMS_H diff --git a/src/init.cpp b/src/init.cpp index 7df31ab1b..52b120830 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -16,6 +16,7 @@ #endif #include "checkpoints.h" #include "compat/sanity.h" +#include "consensus/upgrades.h" #include "consensus/validation.h" #include "httpserver.h" #include "httprpc.h" @@ -44,8 +45,10 @@ #include #endif +#include #include #include +#include #include #include #include @@ -448,6 +451,7 @@ std::string HelpMessage(HelpMessageMode mode) strUsage += HelpMessageOpt("-fuzzmessagestest=", "Randomly fuzz 1 of every network messages"); strUsage += HelpMessageOpt("-flushwallet", strprintf("Run a thread to flush wallet periodically (default: %u)", 1)); strUsage += HelpMessageOpt("-stopafterblockimport", strprintf("Stop running after importing blocks from disk (default: %u)", 0)); + strUsage += HelpMessageOpt("-nuparams=hexBranchId:activationHeight", "Use given activation height for specified network upgrade (regtest-only)"); } string debugCategories = "addrman, alert, bench, coindb, db, estimatefee, http, libevent, lock, mempool, net, partitioncheck, pow, proxy, prune, " "rand, reindex, rpc, selectcoins, tor, zmq, zrpc, zrpcunsafe (implies zrpc)"; // Don't translate these @@ -1035,6 +1039,38 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) } } + if (!mapMultiArgs["-nuparams"].empty()) { + // Allow overriding network upgrade parameters for testing + if (Params().NetworkIDString() != "regtest") { + return InitError("Network upgrade parameters may only be overridden on regtest."); + } + const vector& deployments = mapMultiArgs["-nuparams"]; + for (auto i : deployments) { + std::vector vDeploymentParams; + boost::split(vDeploymentParams, i, boost::is_any_of(":")); + if (vDeploymentParams.size() != 2) { + return InitError("Network upgrade parameters malformed, expecting hexBranchId:activationHeight"); + } + int nActivationHeight; + if (!ParseInt32(vDeploymentParams[1], &nActivationHeight)) { + return InitError(strprintf("Invalid nActivationHeight (%s)", vDeploymentParams[1])); + } + bool found = false; + // Exclude Sprout from upgrades + for (auto i = Consensus::BASE_SPROUT + 1; i < Consensus::MAX_NETWORK_UPGRADES; ++i) + { + if (vDeploymentParams[0].compare(HexInt(NetworkUpgradeInfo[i].nBranchId)) == 0) { + UpdateNetworkUpgradeParameters(Consensus::UpgradeIndex(i), nActivationHeight); + found = true; + LogPrintf("Setting network upgrade activation parameters for %s to height=%d\n", vDeploymentParams[0], nActivationHeight); + break; + } + } + if (!found) { + return InitError(strprintf("Invalid network upgrade (%s)", vDeploymentParams[0])); + } + } + } // ********************************************************* Step 4: application initialization: dir lock, daemonize, pidfile, debug log diff --git a/src/utilstrencodings.cpp b/src/utilstrencodings.cpp index 054992cfb..4648eb0bb 100644 --- a/src/utilstrencodings.cpp +++ b/src/utilstrencodings.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include using namespace std; @@ -46,6 +47,13 @@ string SanitizeFilename(const string& str) return strResult; } +std::string HexInt(uint32_t val) +{ + std::stringstream ss; + ss << std::setfill('0') << std::setw(sizeof(uint32_t) * 2) << std::hex << val; + return ss.str(); +} + const signed char p_util_hexdigit[256] = { -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, diff --git a/src/utilstrencodings.h b/src/utilstrencodings.h index d6973a130..173bbefd0 100644 --- a/src/utilstrencodings.h +++ b/src/utilstrencodings.h @@ -24,6 +24,7 @@ std::string SanitizeFilename(const std::string& str); std::string SanitizeString(const std::string& str); +std::string HexInt(uint32_t val); std::vector ParseHex(const char* psz); std::vector ParseHex(const std::string& str); signed char HexDigit(char c); From f52da9113997ba9496232c54542a9a7b6f253f6e Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 17 Jan 2018 11:42:56 +0000 Subject: [PATCH 0415/1062] Test network upgrade logic Also demonstrates how to specify a network upgrade. --- src/Makefile.gtest.include | 1 + src/chainparams.cpp | 6 ++ src/consensus/params.h | 1 + src/consensus/upgrades.cpp | 5 ++ src/gtest/test_upgrades.cpp | 142 ++++++++++++++++++++++++++++++++++++ 5 files changed, 155 insertions(+) create mode 100644 src/gtest/test_upgrades.cpp diff --git a/src/Makefile.gtest.include b/src/Makefile.gtest.include index 522bfa84a..eaad8a79f 100644 --- a/src/Makefile.gtest.include +++ b/src/Makefile.gtest.include @@ -33,6 +33,7 @@ zcash_gtest_SOURCES += \ gtest/test_random.cpp \ gtest/test_rpc.cpp \ gtest/test_transaction.cpp \ + gtest/test_upgrades.cpp \ gtest/test_validation.cpp \ gtest/test_circuit.cpp \ gtest/test_txid.cpp \ diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 65bc5577c..6ce3c28f7 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -92,6 +92,8 @@ public: consensus.nPowTargetSpacing = 2.5 * 60; consensus.vUpgrades[Consensus::BASE_SPROUT].nActivationHeight = Consensus::NetworkUpgrade::ALWAYS_ACTIVE; + consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nActivationHeight = + Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT; /** * The message start string should be awesome! ⓩ❤ @@ -246,6 +248,8 @@ public: consensus.nPowTargetSpacing = 2.5 * 60; consensus.vUpgrades[Consensus::BASE_SPROUT].nActivationHeight = Consensus::NetworkUpgrade::ALWAYS_ACTIVE; + consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nActivationHeight = + Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT; pchMessageStart[0] = 0xfa; pchMessageStart[1] = 0x1a; @@ -349,6 +353,8 @@ public: consensus.nPowTargetSpacing = 2.5 * 60; consensus.vUpgrades[Consensus::BASE_SPROUT].nActivationHeight = Consensus::NetworkUpgrade::ALWAYS_ACTIVE; + consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nActivationHeight = + Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT; pchMessageStart[0] = 0xaa; pchMessageStart[1] = 0xe8; diff --git a/src/consensus/params.h b/src/consensus/params.h index 59d725cba..c427d26a7 100644 --- a/src/consensus/params.h +++ b/src/consensus/params.h @@ -21,6 +21,7 @@ namespace Consensus { enum UpgradeIndex { // Sprout must be first BASE_SPROUT, + UPGRADE_TESTDUMMY, // NOTE: Also add new upgrades to NetworkUpgradeInfo in upgrades.cpp MAX_NETWORK_UPGRADES }; diff --git a/src/consensus/upgrades.cpp b/src/consensus/upgrades.cpp index 1191e02ff..8e4b2f024 100644 --- a/src/consensus/upgrades.cpp +++ b/src/consensus/upgrades.cpp @@ -13,6 +13,11 @@ const struct NUInfo NetworkUpgradeInfo[Consensus::MAX_NETWORK_UPGRADES] = { /*.nBranchId =*/ 0, /*.strName =*/ "Sprout", /*.strInfo =*/ "The Zcash network at launch", + }, + { + /*.nBranchId =*/ 0x74736554, + /*.strName =*/ "Test dummy", + /*.strInfo =*/ "Test dummy info", } }; diff --git a/src/gtest/test_upgrades.cpp b/src/gtest/test_upgrades.cpp new file mode 100644 index 000000000..3312e0569 --- /dev/null +++ b/src/gtest/test_upgrades.cpp @@ -0,0 +1,142 @@ +#include + +#include "chainparams.h" +#include "consensus/upgrades.h" + +class UpgradesTest : public ::testing::Test { +protected: + virtual void SetUp() { + } + + virtual void TearDown() { + // Revert to default + UpdateNetworkUpgradeParameters(Consensus::UPGRADE_TESTDUMMY, Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT); + } +}; + +TEST_F(UpgradesTest, NetworkUpgradeState) { + SelectParams(CBaseChainParams::REGTEST); + const Consensus::Params& params = Params().GetConsensus(); + + // Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT + EXPECT_EQ( + NetworkUpgradeState(0, params, Consensus::UPGRADE_TESTDUMMY), + UPGRADE_DISABLED); + EXPECT_EQ( + NetworkUpgradeState(1000000, params, Consensus::UPGRADE_TESTDUMMY), + UPGRADE_DISABLED); + + UpdateNetworkUpgradeParameters(Consensus::UPGRADE_TESTDUMMY, Consensus::NetworkUpgrade::ALWAYS_ACTIVE); + + EXPECT_EQ( + NetworkUpgradeState(0, params, Consensus::UPGRADE_TESTDUMMY), + UPGRADE_ACTIVE); + EXPECT_EQ( + NetworkUpgradeState(1000000, params, Consensus::UPGRADE_TESTDUMMY), + UPGRADE_ACTIVE); + + int nActivationHeight = 100; + UpdateNetworkUpgradeParameters(Consensus::UPGRADE_TESTDUMMY, nActivationHeight); + + EXPECT_EQ( + NetworkUpgradeState(0, params, Consensus::UPGRADE_TESTDUMMY), + UPGRADE_PENDING); + EXPECT_EQ( + NetworkUpgradeState(nActivationHeight - 1, params, Consensus::UPGRADE_TESTDUMMY), + UPGRADE_PENDING); + EXPECT_EQ( + NetworkUpgradeState(nActivationHeight, params, Consensus::UPGRADE_TESTDUMMY), + UPGRADE_ACTIVE); + EXPECT_EQ( + NetworkUpgradeState(1000000, params, Consensus::UPGRADE_TESTDUMMY), + UPGRADE_ACTIVE); +} + +TEST_F(UpgradesTest, CurrentEpoch) { + SelectParams(CBaseChainParams::REGTEST); + const Consensus::Params& params = Params().GetConsensus(); + auto nBranchId = NetworkUpgradeInfo[Consensus::UPGRADE_TESTDUMMY].nBranchId; + + // Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT + EXPECT_EQ(CurrentEpoch(0, params), Consensus::BASE_SPROUT); + EXPECT_EQ(CurrentEpochBranchId(0, params), 0); + EXPECT_EQ(CurrentEpoch(1000000, params), Consensus::BASE_SPROUT); + EXPECT_EQ(CurrentEpochBranchId(1000000, params), 0); + + UpdateNetworkUpgradeParameters(Consensus::UPGRADE_TESTDUMMY, Consensus::NetworkUpgrade::ALWAYS_ACTIVE); + + EXPECT_EQ(CurrentEpoch(0, params), Consensus::UPGRADE_TESTDUMMY); + EXPECT_EQ(CurrentEpochBranchId(0, params), nBranchId); + EXPECT_EQ(CurrentEpoch(1000000, params), Consensus::UPGRADE_TESTDUMMY); + EXPECT_EQ(CurrentEpochBranchId(1000000, params), nBranchId); + + int nActivationHeight = 100; + UpdateNetworkUpgradeParameters(Consensus::UPGRADE_TESTDUMMY, nActivationHeight); + + EXPECT_EQ(CurrentEpoch(0, params), Consensus::BASE_SPROUT); + EXPECT_EQ(CurrentEpochBranchId(0, params), 0); + EXPECT_EQ(CurrentEpoch(nActivationHeight - 1, params), Consensus::BASE_SPROUT); + EXPECT_EQ(CurrentEpochBranchId(nActivationHeight - 1, params), 0); + EXPECT_EQ(CurrentEpoch(nActivationHeight, params), Consensus::UPGRADE_TESTDUMMY); + EXPECT_EQ(CurrentEpochBranchId(nActivationHeight, params), nBranchId); + EXPECT_EQ(CurrentEpoch(1000000, params), Consensus::UPGRADE_TESTDUMMY); + EXPECT_EQ(CurrentEpochBranchId(1000000, params), nBranchId); +} + +TEST_F(UpgradesTest, IsActivationHeight) { + SelectParams(CBaseChainParams::REGTEST); + const Consensus::Params& params = Params().GetConsensus(); + + // Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT + EXPECT_FALSE(IsActivationHeight(-1, params, Consensus::UPGRADE_TESTDUMMY)); + EXPECT_FALSE(IsActivationHeight(0, params, Consensus::UPGRADE_TESTDUMMY)); + EXPECT_FALSE(IsActivationHeight(1, params, Consensus::UPGRADE_TESTDUMMY)); + EXPECT_FALSE(IsActivationHeight(1000000, params, Consensus::UPGRADE_TESTDUMMY)); + + UpdateNetworkUpgradeParameters(Consensus::UPGRADE_TESTDUMMY, Consensus::NetworkUpgrade::ALWAYS_ACTIVE); + + EXPECT_FALSE(IsActivationHeight(-1, params, Consensus::UPGRADE_TESTDUMMY)); + EXPECT_TRUE(IsActivationHeight(0, params, Consensus::UPGRADE_TESTDUMMY)); + EXPECT_FALSE(IsActivationHeight(1, params, Consensus::UPGRADE_TESTDUMMY)); + EXPECT_FALSE(IsActivationHeight(1000000, params, Consensus::UPGRADE_TESTDUMMY)); + + int nActivationHeight = 100; + UpdateNetworkUpgradeParameters(Consensus::UPGRADE_TESTDUMMY, nActivationHeight); + + EXPECT_FALSE(IsActivationHeight(-1, params, Consensus::UPGRADE_TESTDUMMY)); + EXPECT_FALSE(IsActivationHeight(0, params, Consensus::UPGRADE_TESTDUMMY)); + EXPECT_FALSE(IsActivationHeight(1, params, Consensus::UPGRADE_TESTDUMMY)); + EXPECT_FALSE(IsActivationHeight(nActivationHeight - 1, params, Consensus::UPGRADE_TESTDUMMY)); + EXPECT_TRUE(IsActivationHeight(nActivationHeight, params, Consensus::UPGRADE_TESTDUMMY)); + EXPECT_FALSE(IsActivationHeight(nActivationHeight + 1, params, Consensus::UPGRADE_TESTDUMMY)); + EXPECT_FALSE(IsActivationHeight(1000000, params, Consensus::UPGRADE_TESTDUMMY)); +} + +TEST_F(UpgradesTest, IsActivationHeightForAnyUpgrade) { + SelectParams(CBaseChainParams::REGTEST); + const Consensus::Params& params = Params().GetConsensus(); + + // Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT + EXPECT_FALSE(IsActivationHeightForAnyUpgrade(-1, params)); + EXPECT_FALSE(IsActivationHeightForAnyUpgrade(0, params)); + EXPECT_FALSE(IsActivationHeightForAnyUpgrade(1, params)); + EXPECT_FALSE(IsActivationHeightForAnyUpgrade(1000000, params)); + + UpdateNetworkUpgradeParameters(Consensus::UPGRADE_TESTDUMMY, Consensus::NetworkUpgrade::ALWAYS_ACTIVE); + + EXPECT_FALSE(IsActivationHeightForAnyUpgrade(-1, params)); + EXPECT_TRUE(IsActivationHeightForAnyUpgrade(0, params)); + EXPECT_FALSE(IsActivationHeightForAnyUpgrade(1, params)); + EXPECT_FALSE(IsActivationHeightForAnyUpgrade(1000000, params)); + + int nActivationHeight = 100; + UpdateNetworkUpgradeParameters(Consensus::UPGRADE_TESTDUMMY, nActivationHeight); + + EXPECT_FALSE(IsActivationHeightForAnyUpgrade(-1, params)); + EXPECT_FALSE(IsActivationHeightForAnyUpgrade(0, params)); + EXPECT_FALSE(IsActivationHeightForAnyUpgrade(1, params)); + EXPECT_FALSE(IsActivationHeightForAnyUpgrade(nActivationHeight - 1, params)); + EXPECT_TRUE(IsActivationHeightForAnyUpgrade(nActivationHeight, params)); + EXPECT_FALSE(IsActivationHeightForAnyUpgrade(nActivationHeight + 1, params)); + EXPECT_FALSE(IsActivationHeightForAnyUpgrade(1000000, params)); +} From 89f20450c2adda8b99c3b83ca9b0774fbf4c94e3 Mon Sep 17 00:00:00 2001 From: Pieter Wuille Date: Fri, 18 Mar 2016 17:20:12 +0100 Subject: [PATCH 0416/1062] Add rewind logic to deal with post-fork software updates Includes logic for dealing with pruning by Suhas Daftuar. --- src/chain.h | 2 + src/init.cpp | 8 ++++ src/main.cpp | 124 ++++++++++++++++++++++++++++++++++++++++++++------- src/main.h | 3 ++ 4 files changed, 122 insertions(+), 15 deletions(-) diff --git a/src/chain.h b/src/chain.h index a3b1b7ae9..28f77e006 100644 --- a/src/chain.h +++ b/src/chain.h @@ -94,6 +94,8 @@ enum BlockStatus: uint32_t { BLOCK_FAILED_VALID = 32, //! stage after last reached validness failed BLOCK_FAILED_CHILD = 64, //! descends from failed block BLOCK_FAILED_MASK = BLOCK_FAILED_VALID | BLOCK_FAILED_CHILD, + + BLOCK_OPT_WITNESS = 128, //! block data in blk*.data was received with a witness-enforcing client }; /** The block chain is a tree shaped structure starting with the diff --git a/src/init.cpp b/src/init.cpp index 52b120830..e45fe1659 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -1422,6 +1422,14 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) break; } + if (!fReindex) { + uiInterface.InitMessage(_("Rewinding blocks...")); + if (!RewindBlockIndex(chainparams)) { + strLoadError = _("Unable to rewind the database to a pre-fork state. You will need to redownload the blockchain"); + break; + } + } + uiInterface.InitMessage(_("Verifying blocks...")); if (fHavePruned && GetArg("-checkblocks", 288) > MIN_BLOCKS_TO_KEEP) { LogPrintf("Prune: pruned datadir may not have more than %d blocks; -checkblocks=%d may fail\n", diff --git a/src/main.cpp b/src/main.cpp index d8e47caac..8464c9247 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -543,6 +543,9 @@ CBlockIndex* FindForkInGlobalIndex(const CChain& chain, const CBlockLocator& loc CBlockIndex* pindex = (*mi).second; if (chain.Contains(pindex)) return pindex; + if (pindex->GetAncestor(chain.Height()) == chain.Tip()) { + return chain.Tip(); + } } } return chain.Genesis(); @@ -2405,7 +2408,7 @@ void static UpdateTip(CBlockIndex *pindexNew) { } /** Disconnect chainActive's tip. */ -bool static DisconnectTip(CValidationState &state) { +bool static DisconnectTip(CValidationState &state, bool fBare = false) { CBlockIndex *pindexDelete = chainActive.Tip(); assert(pindexDelete); mempool.check(pcoinsTip); @@ -2427,21 +2430,25 @@ bool static DisconnectTip(CValidationState &state) { // Write the chain state to disk, if necessary. if (!FlushStateToDisk(state, FLUSH_STATE_IF_NEEDED)) return false; - // Resurrect mempool transactions from the disconnected block. - BOOST_FOREACH(const CTransaction &tx, block.vtx) { - // ignore validation errors in resurrected transactions - list removed; - CValidationState stateDummy; - if (tx.IsCoinBase() || !AcceptToMemoryPool(mempool, stateDummy, tx, false, NULL)) - mempool.remove(tx, removed, true); + + if (!fBare) { + // Resurrect mempool transactions from the disconnected block. + BOOST_FOREACH(const CTransaction &tx, block.vtx) { + // ignore validation errors in resurrected transactions + list removed; + CValidationState stateDummy; + if (tx.IsCoinBase() || !AcceptToMemoryPool(mempool, stateDummy, tx, false, NULL)) + mempool.remove(tx, removed, true); + } + if (anchorBeforeDisconnect != anchorAfterDisconnect) { + // The anchor may not change between block disconnects, + // in which case we don't want to evict from the mempool yet! + mempool.removeWithAnchor(anchorBeforeDisconnect); + } + mempool.removeCoinbaseSpends(pcoinsTip, pindexDelete->nHeight); + mempool.check(pcoinsTip); } - if (anchorBeforeDisconnect != anchorAfterDisconnect) { - // The anchor may not change between block disconnects, - // in which case we don't want to evict from the mempool yet! - mempool.removeWithAnchor(anchorBeforeDisconnect); - } - mempool.removeCoinbaseSpends(pcoinsTip, pindexDelete->nHeight); - mempool.check(pcoinsTip); + // Update chainActive and related variables. UpdateTip(pindexDelete->pprev); // Get the current commitment tree @@ -2848,6 +2855,9 @@ bool ReceivedBlockTransactions(const CBlock &block, CValidationState& state, CBl pindexNew->nDataPos = pos.nPos; pindexNew->nUndoPos = 0; pindexNew->nStatus |= BLOCK_HAVE_DATA; + if (IsWitnessEnabled(pindexNew->pprev, Params().GetConsensus())) { + pindexNew->nStatus |= BLOCK_OPT_WITNESS; + } pindexNew->RaiseValidity(BLOCK_VALID_TRANSACTIONS); setDirtyBlockIndex.insert(pindexNew); @@ -3738,6 +3748,90 @@ bool CVerifyDB::VerifyDB(CCoinsView *coinsview, int nCheckLevel, int nCheckDepth return true; } +bool RewindBlockIndex(const CChainParams& params) +{ + LOCK(cs_main); + + int nHeight = 1; + while (nHeight <= chainActive.Height()) { + if (IsWitnessEnabled(chainActive[nHeight - 1], params.GetConsensus()) && !(chainActive[nHeight]->nStatus & BLOCK_OPT_WITNESS)) { + break; + } + nHeight++; + } + + // nHeight is now the height of the first insufficiently-validated block, or tipheight + 1 + CValidationState state; + CBlockIndex* pindex = chainActive.Tip(); + while (chainActive.Height() >= nHeight) { + if (fPruneMode && !(chainActive.Tip()->nStatus & BLOCK_HAVE_DATA)) { + // If pruning, don't try rewinding past the HAVE_DATA point; + // since older blocks can't be served anyway, there's + // no need to walk further, and trying to DisconnectTip() + // will fail (and require a needless reindex/redownload + // of the blockchain). + break; + } + if (!DisconnectTip(state, true)) { + return error("RewindBlockIndex: unable to disconnect block at height %i", pindex->nHeight); + } + // Occasionally flush state to disk. + if (!FlushStateToDisk(state, FLUSH_STATE_PERIODIC)) + return false; + } + + // Reduce validity flag and have-data flags. + // We do this after actual disconnecting, otherwise we'll end up writing the lack of data + // to disk before writing the chainstate, resulting in a failure to continue if interrupted. + for (BlockMap::iterator it = mapBlockIndex.begin(); it != mapBlockIndex.end(); it++) { + CBlockIndex* pindexIter = it->second; + + // Note: If we encounter an insufficiently validated block that + // is on chainActive, it must be because we are a pruning node, and + // this block or some successor doesn't HAVE_DATA, so we were unable to + // rewind all the way. Blocks remaining on chainActive at this point + // must not have their validity reduced. + if (IsWitnessEnabled(pindexIter->pprev, params.GetConsensus()) && !(pindexIter->nStatus & BLOCK_OPT_WITNESS) && !chainActive.Contains(pindexIter)) { + // Reduce validity + pindexIter->nStatus = std::min(pindexIter->nStatus & BLOCK_VALID_MASK, BLOCK_VALID_TREE) | (pindexIter->nStatus & ~BLOCK_VALID_MASK); + // Remove have-data flags. + pindexIter->nStatus &= ~(BLOCK_HAVE_DATA | BLOCK_HAVE_UNDO); + // Remove storage location. + pindexIter->nFile = 0; + pindexIter->nDataPos = 0; + pindexIter->nUndoPos = 0; + // Remove various other things + pindexIter->nTx = 0; + pindexIter->nChainTx = 0; + pindexIter->nSequenceId = 0; + // Make sure it gets written. + setDirtyBlockIndex.insert(pindexIter); + // Update indexes + setBlockIndexCandidates.erase(pindexIter); + std::pair::iterator, std::multimap::iterator> ret = mapBlocksUnlinked.equal_range(pindexIter->pprev); + while (ret.first != ret.second) { + if (ret.first->second == pindexIter) { + mapBlocksUnlinked.erase(ret.first++); + } else { + ++ret.first; + } + } + } else if (pindexIter->IsValid(BLOCK_VALID_TRANSACTIONS) && pindexIter->nChainTx) { + setBlockIndexCandidates.insert(pindexIter); + } + } + + PruneBlockIndexCandidates(); + + CheckBlockIndex(); + + if (!FlushStateToDisk(state, FLUSH_STATE_ALWAYS)) { + return false; + } + + return true; +} + void UnloadBlockIndex() { LOCK(cs_main); diff --git a/src/main.h b/src/main.h index 886542db7..c8378e4e9 100644 --- a/src/main.h +++ b/src/main.h @@ -436,6 +436,9 @@ bool AcceptBlockHeader(const CBlockHeader& block, CValidationState& state, CBloc +/** When there are blocks in the active chain with missing data, rewind the chainstate and remove them from the block index */ +bool RewindBlockIndex(const CChainParams& params); + class CBlockFileInfo { public: From 9e851450abc5495db2938eadbcde869f1d981689 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Sat, 27 Jan 2018 23:37:43 +0000 Subject: [PATCH 0417/1062] Adjust rewind logic to use the network upgrade mechanism --- src/chain.h | 14 +++++++++++- src/init.cpp | 2 +- src/main.cpp | 61 ++++++++++++++++++++++++++++++++++++++++++---------- src/main.h | 6 +++++- src/txdb.cpp | 1 + 5 files changed, 70 insertions(+), 14 deletions(-) diff --git a/src/chain.h b/src/chain.h index 28f77e006..c0239d5d2 100644 --- a/src/chain.h +++ b/src/chain.h @@ -95,9 +95,13 @@ enum BlockStatus: uint32_t { BLOCK_FAILED_CHILD = 64, //! descends from failed block BLOCK_FAILED_MASK = BLOCK_FAILED_VALID | BLOCK_FAILED_CHILD, - BLOCK_OPT_WITNESS = 128, //! block data in blk*.data was received with a witness-enforcing client + BLOCK_ACTIVATES_UPGRADE = 128, //! block activates a network upgrade }; +//! Short-hand for the highest consensus validity we implement. +//! Blocks with this validity are assumed to satisfy all consensus rules. +static const BlockStatus BLOCK_VALID_CONSENSUS = BLOCK_VALID_SCRIPTS; + /** The block chain is a tree shaped structure starting with the * genesis block at the root, with each block potentially having multiple * candidates to be the next block. A blockindex may have multiple pprev pointing @@ -142,6 +146,11 @@ public: //! Verification status of this block. See enum BlockStatus unsigned int nStatus; + //! Branch ID corresponding to the consensus rules used to validate this block. + //! Only accurate if block validity is BLOCK_VALID_CONSENSUS. + //! Persisted at each activation height, memory-only for intervening blocks. + uint32_t nConsensusBranchId; + //! The anchor for the tree state up to the start of this block uint256 hashAnchor; @@ -182,6 +191,7 @@ public: nTx = 0; nChainTx = 0; nStatus = 0; + nConsensusBranchId = 0; hashAnchor = uint256(); hashAnchorEnd = uint256(); nSequenceId = 0; @@ -343,6 +353,8 @@ public: READWRITE(VARINT(nDataPos)); if (nStatus & BLOCK_HAVE_UNDO) READWRITE(VARINT(nUndoPos)); + if (nStatus & BLOCK_ACTIVATES_UPGRADE) + READWRITE(nConsensusBranchId); READWRITE(hashAnchor); // block header diff --git a/src/init.cpp b/src/init.cpp index e45fe1659..b8143d178 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -1425,7 +1425,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) if (!fReindex) { uiInterface.InitMessage(_("Rewinding blocks...")); if (!RewindBlockIndex(chainparams)) { - strLoadError = _("Unable to rewind the database to a pre-fork state. You will need to redownload the blockchain"); + strLoadError = _("Unable to rewind the database to a pre-upgrade state. You will need to redownload the blockchain"); break; } } diff --git a/src/main.cpp b/src/main.cpp index 8464c9247..9aed20d64 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,6 +13,7 @@ #include "chainparams.h" #include "checkpoints.h" #include "checkqueue.h" +#include "consensus/upgrades.h" #include "consensus/validation.h" #include "deprecation.h" #include "init.h" @@ -2222,6 +2223,17 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin pindex->nStatus |= BLOCK_HAVE_UNDO; } + // Now that all consensus rules have been validated, set nConsensusBranchId. + // Move this if BLOCK_VALID_CONSENSUS is ever altered. + static_assert(BLOCK_VALID_CONSENSUS == BLOCK_VALID_SCRIPTS, + "nConsensusBranchId must be set after all consensus rules have been validated."); + if (IsActivationHeightForAnyUpgrade(pindex->nHeight, Params().GetConsensus())) { + pindex->nStatus |= BLOCK_ACTIVATES_UPGRADE; + pindex->nConsensusBranchId = CurrentEpochBranchId(pindex->nHeight, chainparams.GetConsensus()); + } else if (pindex->pprev) { + pindex->nConsensusBranchId = pindex->pprev->nConsensusBranchId; + } + pindex->RaiseValidity(BLOCK_VALID_SCRIPTS); setDirtyBlockIndex.insert(pindex); } @@ -2855,9 +2867,6 @@ bool ReceivedBlockTransactions(const CBlock &block, CValidationState& state, CBl pindexNew->nDataPos = pos.nPos; pindexNew->nUndoPos = 0; pindexNew->nStatus |= BLOCK_HAVE_DATA; - if (IsWitnessEnabled(pindexNew->pprev, Params().GetConsensus())) { - pindexNew->nStatus |= BLOCK_OPT_WITNESS; - } pindexNew->RaiseValidity(BLOCK_VALID_TRANSACTIONS); setDirtyBlockIndex.insert(pindexNew); @@ -3565,6 +3574,13 @@ bool static LoadBlockIndexDB() pindex->nChainSproutValue = pindex->nSproutValue; } } + // Construct in-memory chain of branch IDs. + // Relies on invariant: a block that does not activate a network upgrade + // will always be valid under the same consensus rules as its parent. + // Activation blocks will have non-zero branch IDs (read from disk). + if (pindex->IsValid(BLOCK_VALID_CONSENSUS) && pindex->nConsensusBranchId == 0 && pindex->pprev) { + pindex->nConsensusBranchId = pindex->pprev->nConsensusBranchId; + } if (pindex->IsValid(BLOCK_VALID_TRANSACTIONS) && (pindex->nChainTx || pindex->pprev == NULL)) setBlockIndexCandidates.insert(pindex); if (pindex->nStatus & BLOCK_FAILED_MASK && (!pindexBestInvalid || pindex->nChainWork > pindexBestInvalid->nChainWork)) @@ -3752,9 +3768,25 @@ bool RewindBlockIndex(const CChainParams& params) { LOCK(cs_main); + // RewindBlockIndex is called after LoadBlockIndex, so at this point every block + // index will have nConsensusBranchId set based on the values previously persisted + // to disk. By definition, a non-zero nConsensusBranchId means that the block was + // fully-validated under the corresponding consensus rules. Thus we can quickly + // identify whether the current active chain matches our expected sequence of + // consensus rule changes, with two checks: + // + // - BLOCK_ACTIVATES_UPGRADE is set only on blocks that activate upgrades. + // - nConsensusBranchId for each block matches what we expect. + auto sufficientlyValidated = [¶ms](const CBlockIndex* pindex) { + auto consensus = params.GetConsensus(); + bool fFlagSet = pindex->nStatus & BLOCK_ACTIVATES_UPGRADE; + bool fFlagExpected = IsActivationHeightForAnyUpgrade(pindex->nHeight, consensus); + return fFlagSet == fFlagExpected && pindex->nConsensusBranchId == CurrentEpochBranchId(pindex->nHeight, consensus); + }; + int nHeight = 1; while (nHeight <= chainActive.Height()) { - if (IsWitnessEnabled(chainActive[nHeight - 1], params.GetConsensus()) && !(chainActive[nHeight]->nStatus & BLOCK_OPT_WITNESS)) { + if (!sufficientlyValidated(chainActive[nHeight])) { break; } nHeight++; @@ -3791,24 +3823,31 @@ bool RewindBlockIndex(const CChainParams& params) // this block or some successor doesn't HAVE_DATA, so we were unable to // rewind all the way. Blocks remaining on chainActive at this point // must not have their validity reduced. - if (IsWitnessEnabled(pindexIter->pprev, params.GetConsensus()) && !(pindexIter->nStatus & BLOCK_OPT_WITNESS) && !chainActive.Contains(pindexIter)) { + if (!sufficientlyValidated(pindexIter) && !chainActive.Contains(pindexIter)) { // Reduce validity - pindexIter->nStatus = std::min(pindexIter->nStatus & BLOCK_VALID_MASK, BLOCK_VALID_TREE) | (pindexIter->nStatus & ~BLOCK_VALID_MASK); - // Remove have-data flags. + pindexIter->nStatus = + std::min(pindexIter->nStatus & BLOCK_VALID_MASK, BLOCK_VALID_TREE) | + (pindexIter->nStatus & ~BLOCK_VALID_MASK); + // Remove have-data flags pindexIter->nStatus &= ~(BLOCK_HAVE_DATA | BLOCK_HAVE_UNDO); - // Remove storage location. + // Remove branch ID + pindexIter->nStatus &= ~BLOCK_ACTIVATES_UPGRADE; + pindexIter->nConsensusBranchId = 0; + // Remove storage location pindexIter->nFile = 0; pindexIter->nDataPos = 0; pindexIter->nUndoPos = 0; // Remove various other things pindexIter->nTx = 0; pindexIter->nChainTx = 0; + pindexIter->nSproutValue = boost::none; + pindexIter->nChainSproutValue = boost::none; pindexIter->nSequenceId = 0; - // Make sure it gets written. + // Make sure it gets written setDirtyBlockIndex.insert(pindexIter); - // Update indexes + // Update indices setBlockIndexCandidates.erase(pindexIter); - std::pair::iterator, std::multimap::iterator> ret = mapBlocksUnlinked.equal_range(pindexIter->pprev); + auto ret = mapBlocksUnlinked.equal_range(pindexIter->pprev); while (ret.first != ret.second) { if (ret.first->second == pindexIter) { mapBlocksUnlinked.erase(ret.first++); diff --git a/src/main.h b/src/main.h index c8378e4e9..03b0464eb 100644 --- a/src/main.h +++ b/src/main.h @@ -436,7 +436,11 @@ bool AcceptBlockHeader(const CBlockHeader& block, CValidationState& state, CBloc -/** When there are blocks in the active chain with missing data, rewind the chainstate and remove them from the block index */ +/** + * When there are blocks in the active chain with missing data (e.g. if the + * activation height and branch ID of a particular upgrade have been altered), + * rewind the chainstate and remove them from the block index. + */ bool RewindBlockIndex(const CChainParams& params); class CBlockFileInfo diff --git a/src/txdb.cpp b/src/txdb.cpp index e1e29d9ac..ec0234ba2 100644 --- a/src/txdb.cpp +++ b/src/txdb.cpp @@ -309,6 +309,7 @@ bool CBlockTreeDB::LoadBlockIndexGuts() pindexNew->nNonce = diskindex.nNonce; pindexNew->nSolution = diskindex.nSolution; pindexNew->nStatus = diskindex.nStatus; + pindexNew->nConsensusBranchId = diskindex.nConsensusBranchId; pindexNew->nTx = diskindex.nTx; pindexNew->nSproutValue = diskindex.nSproutValue; From 548683767c269124519617c4b747528d24e844cc Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 1 Feb 2018 00:48:26 +0000 Subject: [PATCH 0418/1062] Add Overwinter to upgrade list --- src/chainparams.cpp | 6 ++++++ src/consensus/params.h | 1 + src/consensus/upgrades.cpp | 5 +++++ 3 files changed, 12 insertions(+) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 6ce3c28f7..22d425991 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -94,6 +94,8 @@ public: Consensus::NetworkUpgrade::ALWAYS_ACTIVE; consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nActivationHeight = Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT; + consensus.vUpgrades[Consensus::UPGRADE_OVERWINTER].nActivationHeight = + Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT; /** * The message start string should be awesome! ⓩ❤ @@ -250,6 +252,8 @@ public: Consensus::NetworkUpgrade::ALWAYS_ACTIVE; consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nActivationHeight = Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT; + consensus.vUpgrades[Consensus::UPGRADE_OVERWINTER].nActivationHeight = + Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT; pchMessageStart[0] = 0xfa; pchMessageStart[1] = 0x1a; @@ -355,6 +359,8 @@ public: Consensus::NetworkUpgrade::ALWAYS_ACTIVE; consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nActivationHeight = Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT; + consensus.vUpgrades[Consensus::UPGRADE_OVERWINTER].nActivationHeight = + Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT; pchMessageStart[0] = 0xaa; pchMessageStart[1] = 0xe8; diff --git a/src/consensus/params.h b/src/consensus/params.h index c427d26a7..53f8609d5 100644 --- a/src/consensus/params.h +++ b/src/consensus/params.h @@ -22,6 +22,7 @@ enum UpgradeIndex { // Sprout must be first BASE_SPROUT, UPGRADE_TESTDUMMY, + UPGRADE_OVERWINTER, // NOTE: Also add new upgrades to NetworkUpgradeInfo in upgrades.cpp MAX_NETWORK_UPGRADES }; diff --git a/src/consensus/upgrades.cpp b/src/consensus/upgrades.cpp index 8e4b2f024..f06e7063c 100644 --- a/src/consensus/upgrades.cpp +++ b/src/consensus/upgrades.cpp @@ -18,6 +18,11 @@ const struct NUInfo NetworkUpgradeInfo[Consensus::MAX_NETWORK_UPGRADES] = { /*.nBranchId =*/ 0x74736554, /*.strName =*/ "Test dummy", /*.strInfo =*/ "Test dummy info", + }, + { + /*.nBranchId =*/ 0x5ba81b19, + /*.strName =*/ "Overwinter", + /*.strInfo =*/ "TBD", } }; From 149d69e36b525619d9ad089d501f7937f5fc064d Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 2 Feb 2018 15:13:48 +0000 Subject: [PATCH 0419/1062] Add method for fetching the next activation height after a given block height --- src/consensus/upgrades.cpp | 18 ++++++++++++++++++ src/consensus/upgrades.h | 10 ++++++++++ src/gtest/test_upgrades.cpp | 31 +++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+) diff --git a/src/consensus/upgrades.cpp b/src/consensus/upgrades.cpp index f06e7063c..42089bbb1 100644 --- a/src/consensus/upgrades.cpp +++ b/src/consensus/upgrades.cpp @@ -102,3 +102,21 @@ bool IsActivationHeightForAnyUpgrade( return false; } + +boost::optional NextActivationHeight( + int nHeight, + const Consensus::Params& params) +{ + if (nHeight < 0) { + return boost::none; + } + + // Don't count Sprout as an activation height + for (auto idx = Consensus::BASE_SPROUT + 1; idx < Consensus::MAX_NETWORK_UPGRADES; idx++) { + if (NetworkUpgradeState(nHeight, params, Consensus::UpgradeIndex(idx)) == UPGRADE_PENDING) { + return params.vUpgrades[idx].nActivationHeight; + } + } + + return boost::none; +} diff --git a/src/consensus/upgrades.h b/src/consensus/upgrades.h index c62655530..0c5462c2e 100644 --- a/src/consensus/upgrades.h +++ b/src/consensus/upgrades.h @@ -7,6 +7,8 @@ #include "consensus/params.h" +#include + enum UpgradeState { UPGRADE_DISABLED, UPGRADE_PENDING, @@ -74,4 +76,12 @@ bool IsActivationHeightForAnyUpgrade( int nHeight, const Consensus::Params& params); +/** + * Returns the activation height for the next upgrade after the given block height, + * or boost::none if there are no more known upgrades. + */ +boost::optional NextActivationHeight( + int nHeight, + const Consensus::Params& params); + #endif // ZCASH_CONSENSUS_UPGRADES_H diff --git a/src/gtest/test_upgrades.cpp b/src/gtest/test_upgrades.cpp index 3312e0569..1066a28d0 100644 --- a/src/gtest/test_upgrades.cpp +++ b/src/gtest/test_upgrades.cpp @@ -3,6 +3,8 @@ #include "chainparams.h" #include "consensus/upgrades.h" +#include + class UpgradesTest : public ::testing::Test { protected: virtual void SetUp() { @@ -140,3 +142,32 @@ TEST_F(UpgradesTest, IsActivationHeightForAnyUpgrade) { EXPECT_FALSE(IsActivationHeightForAnyUpgrade(nActivationHeight + 1, params)); EXPECT_FALSE(IsActivationHeightForAnyUpgrade(1000000, params)); } + +TEST_F(UpgradesTest, NextActivationHeight) { + SelectParams(CBaseChainParams::REGTEST); + const Consensus::Params& params = Params().GetConsensus(); + + // Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT + EXPECT_EQ(NextActivationHeight(-1, params), boost::none); + EXPECT_EQ(NextActivationHeight(0, params), boost::none); + EXPECT_EQ(NextActivationHeight(1, params), boost::none); + EXPECT_EQ(NextActivationHeight(1000000, params), boost::none); + + UpdateNetworkUpgradeParameters(Consensus::UPGRADE_TESTDUMMY, Consensus::NetworkUpgrade::ALWAYS_ACTIVE); + + EXPECT_EQ(NextActivationHeight(-1, params), boost::none); + EXPECT_EQ(NextActivationHeight(0, params), boost::none); + EXPECT_EQ(NextActivationHeight(1, params), boost::none); + EXPECT_EQ(NextActivationHeight(1000000, params), boost::none); + + int nActivationHeight = 100; + UpdateNetworkUpgradeParameters(Consensus::UPGRADE_TESTDUMMY, nActivationHeight); + + EXPECT_EQ(NextActivationHeight(-1, params), boost::none); + EXPECT_EQ(NextActivationHeight(0, params), nActivationHeight); + EXPECT_EQ(NextActivationHeight(1, params), nActivationHeight); + EXPECT_EQ(NextActivationHeight(nActivationHeight - 1, params), nActivationHeight); + EXPECT_EQ(NextActivationHeight(nActivationHeight, params), boost::none); + EXPECT_EQ(NextActivationHeight(nActivationHeight + 1, params), boost::none); + EXPECT_EQ(NextActivationHeight(1000000, params), boost::none); +} From 15fb13f629dc681a58f06d5fb1bf7f6f1fab6895 Mon Sep 17 00:00:00 2001 From: jc Date: Sun, 4 Feb 2018 20:36:25 -0500 Subject: [PATCH 0420/1062] read hashReserved from disk block index --- src/txdb.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/txdb.cpp b/src/txdb.cpp index e1e29d9ac..72ca587e8 100644 --- a/src/txdb.cpp +++ b/src/txdb.cpp @@ -304,6 +304,7 @@ bool CBlockTreeDB::LoadBlockIndexGuts() pindexNew->hashAnchor = diskindex.hashAnchor; pindexNew->nVersion = diskindex.nVersion; pindexNew->hashMerkleRoot = diskindex.hashMerkleRoot; + pindexNew->hashReserved = diskindex.hashReserved; pindexNew->nTime = diskindex.nTime; pindexNew->nBits = diskindex.nBits; pindexNew->nNonce = diskindex.nNonce; From 6e821110fdfa03f3deb051b5146142bd46d8c60e Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Tue, 6 Feb 2018 18:37:08 -0300 Subject: [PATCH 0421/1062] auxiliary cryptoconditions --- src/cryptoconditions | 2 +- src/komodo_cryptoconditions.h | 8 ++++++++ src/script/interpreter.cpp | 5 +++-- 3 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 src/komodo_cryptoconditions.h diff --git a/src/cryptoconditions b/src/cryptoconditions index 6e34f2e32..89325dc29 160000 --- a/src/cryptoconditions +++ b/src/cryptoconditions @@ -1 +1 @@ -Subproject commit 6e34f2e325516a08ea11e847f661bf6a8e524d38 +Subproject commit 89325dc29391f473da75503105a4946f2f96fb76 diff --git a/src/komodo_cryptoconditions.h b/src/komodo_cryptoconditions.h new file mode 100644 index 000000000..d5e643c91 --- /dev/null +++ b/src/komodo_cryptoconditions.h @@ -0,0 +1,8 @@ + + +/* + * Method stub for aux conditions. Unimplemented, thus fails if an aux condition is encountered. + */ +int komodoCCAux(CC *cond, void *context) { + return 0; +} diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index f65581068..94727cbca 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -14,6 +14,7 @@ #include "script/script.h" #include "uint256.h" #include "cryptoconditions/include/cryptoconditions.h" +#include "komodo_cryptoconditions.h" using namespace std; @@ -963,8 +964,8 @@ bool EvalScript(vector >& stack, const CScript& script, un // TODO: Should nHashType be hardcoded? // Other types use the last byte of the signature char *msg = (char*) checker.GetMessage(script, SIGHASH_ALL).begin(); -; - bool fSuccess = cc_verify(cond, msg, 32, condBin, vchCondition.size()); + + bool fSuccess = cc_verify(cond, msg, 32, condBin, vchCondition.size(), komodoCCAux, NULL); popstack(stack); popstack(stack); From 828940b1634f80dcfed5491dc370324f209f2aaa Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 6 Feb 2018 12:39:20 +0000 Subject: [PATCH 0422/1062] Use a boost::optional for nCachedBranchId This enables us to distinguish between it being unset vs. being set to zero. --- src/chain.h | 20 +++++++++++++++----- src/main.cpp | 32 ++++++++++++++++++++------------ src/txdb.cpp | 2 +- 3 files changed, 36 insertions(+), 18 deletions(-) diff --git a/src/chain.h b/src/chain.h index c0239d5d2..937e20bda 100644 --- a/src/chain.h +++ b/src/chain.h @@ -147,9 +147,9 @@ public: unsigned int nStatus; //! Branch ID corresponding to the consensus rules used to validate this block. - //! Only accurate if block validity is BLOCK_VALID_CONSENSUS. + //! Only cached if block validity is BLOCK_VALID_CONSENSUS. //! Persisted at each activation height, memory-only for intervening blocks. - uint32_t nConsensusBranchId; + boost::optional nCachedBranchId; //! The anchor for the tree state up to the start of this block uint256 hashAnchor; @@ -191,7 +191,7 @@ public: nTx = 0; nChainTx = 0; nStatus = 0; - nConsensusBranchId = 0; + nCachedBranchId = boost::none; hashAnchor = uint256(); hashAnchorEnd = uint256(); nSequenceId = 0; @@ -353,8 +353,18 @@ public: READWRITE(VARINT(nDataPos)); if (nStatus & BLOCK_HAVE_UNDO) READWRITE(VARINT(nUndoPos)); - if (nStatus & BLOCK_ACTIVATES_UPGRADE) - READWRITE(nConsensusBranchId); + if (nStatus & BLOCK_ACTIVATES_UPGRADE) { + if (ser_action.ForRead()) { + uint32_t branchId; + READWRITE(branchId); + nCachedBranchId = branchId; + } else { + // nCachedBranchId must always be set if BLOCK_ACTIVATES_UPGRADE is set. + assert(nCachedBranchId); + uint32_t branchId = *nCachedBranchId; + READWRITE(branchId); + } + } READWRITE(hashAnchor); // block header diff --git a/src/main.cpp b/src/main.cpp index 9aed20d64..062507d0e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2223,15 +2223,15 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin pindex->nStatus |= BLOCK_HAVE_UNDO; } - // Now that all consensus rules have been validated, set nConsensusBranchId. + // Now that all consensus rules have been validated, set nCachedBranchId. // Move this if BLOCK_VALID_CONSENSUS is ever altered. static_assert(BLOCK_VALID_CONSENSUS == BLOCK_VALID_SCRIPTS, - "nConsensusBranchId must be set after all consensus rules have been validated."); + "nCachedBranchId must be set after all consensus rules have been validated."); if (IsActivationHeightForAnyUpgrade(pindex->nHeight, Params().GetConsensus())) { pindex->nStatus |= BLOCK_ACTIVATES_UPGRADE; - pindex->nConsensusBranchId = CurrentEpochBranchId(pindex->nHeight, chainparams.GetConsensus()); + pindex->nCachedBranchId = CurrentEpochBranchId(pindex->nHeight, chainparams.GetConsensus()); } else if (pindex->pprev) { - pindex->nConsensusBranchId = pindex->pprev->nConsensusBranchId; + pindex->nCachedBranchId = pindex->pprev->nCachedBranchId; } pindex->RaiseValidity(BLOCK_VALID_SCRIPTS); @@ -3577,9 +3577,15 @@ bool static LoadBlockIndexDB() // Construct in-memory chain of branch IDs. // Relies on invariant: a block that does not activate a network upgrade // will always be valid under the same consensus rules as its parent. - // Activation blocks will have non-zero branch IDs (read from disk). - if (pindex->IsValid(BLOCK_VALID_CONSENSUS) && pindex->nConsensusBranchId == 0 && pindex->pprev) { - pindex->nConsensusBranchId = pindex->pprev->nConsensusBranchId; + // Genesis block has a branch ID of zero by definition, but has no + // validity status because it is side-loaded into a fresh chain. + // Activation blocks will have branch IDs set (read from disk). + if (pindex->pprev) { + if (pindex->IsValid(BLOCK_VALID_CONSENSUS) && !pindex->nCachedBranchId) { + pindex->nCachedBranchId = pindex->pprev->nCachedBranchId; + } + } else { + pindex->nCachedBranchId = NetworkUpgradeInfo[Consensus::BASE_SPROUT].nBranchId; } if (pindex->IsValid(BLOCK_VALID_TRANSACTIONS) && (pindex->nChainTx || pindex->pprev == NULL)) setBlockIndexCandidates.insert(pindex); @@ -3769,19 +3775,21 @@ bool RewindBlockIndex(const CChainParams& params) LOCK(cs_main); // RewindBlockIndex is called after LoadBlockIndex, so at this point every block - // index will have nConsensusBranchId set based on the values previously persisted - // to disk. By definition, a non-zero nConsensusBranchId means that the block was + // index will have nCachedBranchId set based on the values previously persisted + // to disk. By definition, a set nCachedBranchId means that the block was // fully-validated under the corresponding consensus rules. Thus we can quickly // identify whether the current active chain matches our expected sequence of // consensus rule changes, with two checks: // // - BLOCK_ACTIVATES_UPGRADE is set only on blocks that activate upgrades. - // - nConsensusBranchId for each block matches what we expect. + // - nCachedBranchId for each block matches what we expect. auto sufficientlyValidated = [¶ms](const CBlockIndex* pindex) { auto consensus = params.GetConsensus(); bool fFlagSet = pindex->nStatus & BLOCK_ACTIVATES_UPGRADE; bool fFlagExpected = IsActivationHeightForAnyUpgrade(pindex->nHeight, consensus); - return fFlagSet == fFlagExpected && pindex->nConsensusBranchId == CurrentEpochBranchId(pindex->nHeight, consensus); + return fFlagSet == fFlagExpected && + pindex->nCachedBranchId && + *pindex->nCachedBranchId == CurrentEpochBranchId(pindex->nHeight, consensus); }; int nHeight = 1; @@ -3832,7 +3840,7 @@ bool RewindBlockIndex(const CChainParams& params) pindexIter->nStatus &= ~(BLOCK_HAVE_DATA | BLOCK_HAVE_UNDO); // Remove branch ID pindexIter->nStatus &= ~BLOCK_ACTIVATES_UPGRADE; - pindexIter->nConsensusBranchId = 0; + pindexIter->nCachedBranchId = boost::none; // Remove storage location pindexIter->nFile = 0; pindexIter->nDataPos = 0; diff --git a/src/txdb.cpp b/src/txdb.cpp index ec0234ba2..1b66d70b4 100644 --- a/src/txdb.cpp +++ b/src/txdb.cpp @@ -309,7 +309,7 @@ bool CBlockTreeDB::LoadBlockIndexGuts() pindexNew->nNonce = diskindex.nNonce; pindexNew->nSolution = diskindex.nSolution; pindexNew->nStatus = diskindex.nStatus; - pindexNew->nConsensusBranchId = diskindex.nConsensusBranchId; + pindexNew->nCachedBranchId = diskindex.nCachedBranchId; pindexNew->nTx = diskindex.nTx; pindexNew->nSproutValue = diskindex.nSproutValue; From 5009136dc3ac32691d30c9c28758f9ebf8dd70e2 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 6 Feb 2018 22:49:08 +0000 Subject: [PATCH 0423/1062] Change UI/log status message for block rewinding --- src/init.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/init.cpp b/src/init.cpp index b8143d178..bd6e2e79e 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -1423,7 +1423,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) } if (!fReindex) { - uiInterface.InitMessage(_("Rewinding blocks...")); + uiInterface.InitMessage(_("Rewinding blocks if needed...")); if (!RewindBlockIndex(chainparams)) { strLoadError = _("Unable to rewind the database to a pre-upgrade state. You will need to redownload the blockchain"); break; From cad27eb77fe9e0ba8caa617c96f184423628d90c Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 6 Feb 2018 23:18:56 +0000 Subject: [PATCH 0424/1062] Update quote from ZIP 200 --- src/consensus/upgrades.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/consensus/upgrades.cpp b/src/consensus/upgrades.cpp index 42089bbb1..17606bc63 100644 --- a/src/consensus/upgrades.cpp +++ b/src/consensus/upgrades.cpp @@ -38,13 +38,15 @@ UpgradeState NetworkUpgradeState( if (nActivationHeight == Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT) { return UPGRADE_DISABLED; } else if (nHeight >= nActivationHeight) { - // From ZIP ???: + // From ZIP 200: // // ACTIVATION_HEIGHT - // The block height at which the network upgrade rules will come into effect. + // The non-zero block height at which the network upgrade rules will come + // into effect, and be enforced as part of the blockchain consensus. // // For removal of ambiguity, the block at height ACTIVATION_HEIGHT - 1 is - // subject to the pre-upgrade consensus rules. + // subject to the pre-upgrade consensus rules, and would be the last common + // block in the event of a persistent pre-upgrade branch. return UPGRADE_ACTIVE; } else { return UPGRADE_PENDING; From e328fa32b37fd192d2024ba0197e72307435e83f Mon Sep 17 00:00:00 2001 From: Ashley Holman Date: Wed, 24 Jun 2015 03:32:20 -0500 Subject: [PATCH 0425/1062] TxMemPool: Change mapTx to a boost::multi_index_container Indexes on: - Tx Hash - Fee Rate (fee-per-kb) --- src/miner.cpp | 8 ++--- src/rpcblockchain.cpp | 5 ++-- src/test/mempool_tests.cpp | 52 +++++++++++++++++++++++++++++++++ src/txmempool.cpp | 60 ++++++++++++++++++++------------------ src/txmempool.h | 42 +++++++++++++++++++++++++- 5 files changed, 131 insertions(+), 36 deletions(-) diff --git a/src/miner.cpp b/src/miner.cpp index 327228f3f..bbd83b77a 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -155,10 +155,10 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) // This vector will be sorted into a priority queue: vector vecPriority; vecPriority.reserve(mempool.mapTx.size()); - for (map::iterator mi = mempool.mapTx.begin(); + for (CTxMemPool::indexed_transaction_set::iterator mi = mempool.mapTx.begin(); mi != mempool.mapTx.end(); ++mi) { - const CTransaction& tx = mi->second.GetTx(); + const CTransaction& tx = mi->GetTx(); int64_t nLockTimeCutoff = (STANDARD_LOCKTIME_VERIFY_FLAGS & LOCKTIME_MEDIAN_TIME_PAST) ? nMedianTimePast @@ -198,7 +198,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) } mapDependers[txin.prevout.hash].push_back(porphan); porphan->setDependsOn.insert(txin.prevout.hash); - nTotalIn += mempool.mapTx[txin.prevout.hash].GetTx().vout[txin.prevout.n].nValue; + nTotalIn += mempool.mapTx.find(txin.prevout.hash)->GetTx().vout[txin.prevout.n].nValue; continue; } const CCoins* coins = view.AccessCoins(txin.prevout.hash); @@ -230,7 +230,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) porphan->feeRate = feeRate; } else - vecPriority.push_back(TxPriority(dPriority, feeRate, &mi->second.GetTx())); + vecPriority.push_back(TxPriority(dPriority, feeRate, &(mi->GetTx()))); } // Collect transactions into block diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 363872ede..bbed8cba1 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -226,10 +226,9 @@ UniValue mempoolToJSON(bool fVerbose = false) { LOCK(mempool.cs); UniValue o(UniValue::VOBJ); - BOOST_FOREACH(const PAIRTYPE(uint256, CTxMemPoolEntry)& entry, mempool.mapTx) + BOOST_FOREACH(const CTxMemPoolEntry& e, mempool.mapTx) { - const uint256& hash = entry.first; - const CTxMemPoolEntry& e = entry.second; + const uint256& hash = e.GetTx().GetHash(); UniValue info(UniValue::VOBJ); info.push_back(Pair("size", (int)e.GetTxSize())); info.push_back(Pair("fee", ValueFromAmount(e.GetFee()))); diff --git a/src/test/mempool_tests.cpp b/src/test/mempool_tests.cpp index 0996e13c4..85971f018 100644 --- a/src/test/mempool_tests.cpp +++ b/src/test/mempool_tests.cpp @@ -101,4 +101,56 @@ BOOST_AUTO_TEST_CASE(MempoolRemoveTest) removed.clear(); } +BOOST_AUTO_TEST_CASE(MempoolIndexingTest) +{ + CTxMemPool pool(CFeeRate(0)); + + /* 3rd highest fee */ + CMutableTransaction tx1 = CMutableTransaction(); + tx1.vout.resize(1); + tx1.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL; + tx1.vout[0].nValue = 10 * COIN; + pool.addUnchecked(tx1.GetHash(), CTxMemPoolEntry(tx1, 10000LL, 0, 10.0, 1, true)); + + /* highest fee */ + CMutableTransaction tx2 = CMutableTransaction(); + tx2.vout.resize(1); + tx2.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL; + tx2.vout[0].nValue = 2 * COIN; + pool.addUnchecked(tx2.GetHash(), CTxMemPoolEntry(tx2, 20000LL, 0, 9.0, 1, true)); + + /* lowest fee */ + CMutableTransaction tx3 = CMutableTransaction(); + tx3.vout.resize(1); + tx3.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL; + tx3.vout[0].nValue = 5 * COIN; + pool.addUnchecked(tx3.GetHash(), CTxMemPoolEntry(tx3, 0LL, 0, 100.0, 1, true)); + + /* 2nd highest fee */ + CMutableTransaction tx4 = CMutableTransaction(); + tx4.vout.resize(1); + tx4.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL; + tx4.vout[0].nValue = 6 * COIN; + pool.addUnchecked(tx4.GetHash(), CTxMemPoolEntry(tx4, 15000LL, 0, 1.0, 1, true)); + + /* equal fee rate to tx1, but newer */ + CMutableTransaction tx5 = CMutableTransaction(); + tx5.vout.resize(1); + tx5.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL; + tx5.vout[0].nValue = 11 * COIN; + pool.addUnchecked(tx5.GetHash(), CTxMemPoolEntry(tx5, 10000LL, 1, 10.0, 1, true)); + + // there should be 4 transactions in the mempool + BOOST_CHECK_EQUAL(pool.size(), 5); + + // Check the fee-rate index is in order, should be tx2, tx4, tx1, tx5, tx3 + CTxMemPool::indexed_transaction_set::nth_index<1>::type::iterator it = pool.mapTx.get<1>().begin(); + BOOST_CHECK_EQUAL(it++->GetTx().GetHash().ToString(), tx2.GetHash().ToString()); + BOOST_CHECK_EQUAL(it++->GetTx().GetHash().ToString(), tx4.GetHash().ToString()); + BOOST_CHECK_EQUAL(it++->GetTx().GetHash().ToString(), tx1.GetHash().ToString()); + BOOST_CHECK_EQUAL(it++->GetTx().GetHash().ToString(), tx5.GetHash().ToString()); + BOOST_CHECK_EQUAL(it++->GetTx().GetHash().ToString(), tx3.GetHash().ToString()); + BOOST_CHECK(it == pool.mapTx.get<1>().end()); +} + BOOST_AUTO_TEST_SUITE_END() diff --git a/src/txmempool.cpp b/src/txmempool.cpp index ed5653230..9de5eb364 100644 --- a/src/txmempool.cpp +++ b/src/txmempool.cpp @@ -32,6 +32,7 @@ CTxMemPoolEntry::CTxMemPoolEntry(const CTransaction& _tx, const CAmount& _nFee, nTxSize = ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION); nModSize = tx.CalculateModifiedSize(nTxSize); nUsageSize = RecursiveDynamicUsage(tx); + feeRate = CFeeRate(nFee, nTxSize); } CTxMemPoolEntry::CTxMemPoolEntry(const CTxMemPoolEntry& other) @@ -96,8 +97,8 @@ bool CTxMemPool::addUnchecked(const uint256& hash, const CTxMemPoolEntry &entry, // Used by main.cpp AcceptToMemoryPool(), which DOES do // all the appropriate checks. LOCK(cs); - mapTx[hash] = entry; - const CTransaction& tx = mapTx[hash].GetTx(); + mapTx.insert(entry); + const CTransaction& tx = mapTx.find(hash)->GetTx(); for (unsigned int i = 0; i < tx.vin.size(); i++) mapNextTx[tx.vin[i].prevout] = CInPoint(&tx, i); BOOST_FOREACH(const JSDescription &joinsplit, tx.vjoinsplit) { @@ -139,7 +140,7 @@ void CTxMemPool::remove(const CTransaction &origTx, std::list& rem txToRemove.pop_front(); if (!mapTx.count(hash)) continue; - const CTransaction& tx = mapTx[hash].GetTx(); + const CTransaction& tx = mapTx.find(hash)->GetTx(); if (fRecursive) { for (unsigned int i = 0; i < tx.vout.size(); i++) { std::map::iterator it = mapNextTx.find(COutPoint(hash, i)); @@ -157,8 +158,8 @@ void CTxMemPool::remove(const CTransaction &origTx, std::list& rem } removed.push_back(tx); - totalTxSize -= mapTx[hash].GetTxSize(); - cachedInnerUsage -= mapTx[hash].DynamicMemoryUsage(); + totalTxSize -= mapTx.find(hash)->GetTxSize(); + cachedInnerUsage -= mapTx.find(hash)->DynamicMemoryUsage(); mapTx.erase(hash); nTransactionsUpdated++; minerPolicyEstimator->removeTx(hash); @@ -171,10 +172,10 @@ void CTxMemPool::removeCoinbaseSpends(const CCoinsViewCache *pcoins, unsigned in // Remove transactions spending a coinbase which are now immature LOCK(cs); list transactionsToRemove; - for (std::map::const_iterator it = mapTx.begin(); it != mapTx.end(); it++) { - const CTransaction& tx = it->second.GetTx(); + for (indexed_transaction_set::const_iterator it = mapTx.begin(); it != mapTx.end(); it++) { + const CTransaction& tx = it->GetTx(); BOOST_FOREACH(const CTxIn& txin, tx.vin) { - std::map::const_iterator it2 = mapTx.find(txin.prevout.hash); + indexed_transaction_set::const_iterator it2 = mapTx.find(txin.prevout.hash); if (it2 != mapTx.end()) continue; const CCoins *coins = pcoins->AccessCoins(txin.prevout.hash); @@ -201,8 +202,8 @@ void CTxMemPool::removeWithAnchor(const uint256 &invalidRoot) LOCK(cs); list transactionsToRemove; - for (std::map::const_iterator it = mapTx.begin(); it != mapTx.end(); it++) { - const CTransaction& tx = it->second.GetTx(); + for (indexed_transaction_set::const_iterator it = mapTx.begin(); it != mapTx.end(); it++) { + const CTransaction& tx = it->GetTx(); BOOST_FOREACH(const JSDescription& joinsplit, tx.vjoinsplit) { if (joinsplit.anchor == invalidRoot) { transactionsToRemove.push_back(tx); @@ -258,8 +259,10 @@ void CTxMemPool::removeForBlock(const std::vector& vtx, unsigned i BOOST_FOREACH(const CTransaction& tx, vtx) { uint256 hash = tx.GetHash(); - if (mapTx.count(hash)) - entries.push_back(mapTx[hash]); + + indexed_transaction_set::iterator i = mapTx.find(hash); + if (i != mapTx.end()) + entries.push_back(*i); } BOOST_FOREACH(const CTransaction& tx, vtx) { @@ -296,17 +299,17 @@ void CTxMemPool::check(const CCoinsViewCache *pcoins) const LOCK(cs); list waitingOnDependants; - for (std::map::const_iterator it = mapTx.begin(); it != mapTx.end(); it++) { + for (indexed_transaction_set::const_iterator it = mapTx.begin(); it != mapTx.end(); it++) { unsigned int i = 0; - checkTotal += it->second.GetTxSize(); - innerUsage += it->second.DynamicMemoryUsage(); - const CTransaction& tx = it->second.GetTx(); + checkTotal += it->GetTxSize(); + innerUsage += it->DynamicMemoryUsage(); + const CTransaction& tx = it->GetTx(); bool fDependsWait = false; BOOST_FOREACH(const CTxIn &txin, tx.vin) { // Check that every mempool transaction's inputs refer to available coins, or other mempool tx's. - std::map::const_iterator it2 = mapTx.find(txin.prevout.hash); + indexed_transaction_set::const_iterator it2 = mapTx.find(txin.prevout.hash); if (it2 != mapTx.end()) { - const CTransaction& tx2 = it2->second.GetTx(); + const CTransaction& tx2 = it2->GetTx(); assert(tx2.vout.size() > txin.prevout.n && !tx2.vout[txin.prevout.n].IsNull()); fDependsWait = true; } else { @@ -344,7 +347,7 @@ void CTxMemPool::check(const CCoinsViewCache *pcoins) const intermediates.insert(std::make_pair(tree.root(), tree)); } if (fDependsWait) - waitingOnDependants.push_back(&it->second); + waitingOnDependants.push_back(&(*it)); else { CValidationState state; assert(ContextualCheckInputs(tx, state, mempoolDuplicate, false, 0, false, Params().GetConsensus(), NULL)); @@ -368,8 +371,8 @@ void CTxMemPool::check(const CCoinsViewCache *pcoins) const } for (std::map::const_iterator it = mapNextTx.begin(); it != mapNextTx.end(); it++) { uint256 hash = it->second.ptx->GetHash(); - map::const_iterator it2 = mapTx.find(hash); - const CTransaction& tx = it2->second.GetTx(); + indexed_transaction_set::const_iterator it2 = mapTx.find(hash); + const CTransaction& tx = it2->GetTx(); assert(it2 != mapTx.end()); assert(&tx == it->second.ptx); assert(tx.vin.size() > it->second.n); @@ -378,8 +381,8 @@ void CTxMemPool::check(const CCoinsViewCache *pcoins) const for (std::map::const_iterator it = mapNullifiers.begin(); it != mapNullifiers.end(); it++) { uint256 hash = it->second->GetHash(); - map::const_iterator it2 = mapTx.find(hash); - const CTransaction& tx = it2->second.GetTx(); + indexed_transaction_set::const_iterator it2 = mapTx.find(hash); + const CTransaction& tx = it2->GetTx(); assert(it2 != mapTx.end()); assert(&tx == it->second); } @@ -394,16 +397,16 @@ void CTxMemPool::queryHashes(vector& vtxid) LOCK(cs); vtxid.reserve(mapTx.size()); - for (map::iterator mi = mapTx.begin(); mi != mapTx.end(); ++mi) - vtxid.push_back((*mi).first); + for (indexed_transaction_set::iterator mi = mapTx.begin(); mi != mapTx.end(); ++mi) + vtxid.push_back(mi->GetTx().GetHash()); } bool CTxMemPool::lookup(uint256 hash, CTransaction& result) const { LOCK(cs); - map::const_iterator i = mapTx.find(hash); + indexed_transaction_set::const_iterator i = mapTx.find(hash); if (i == mapTx.end()) return false; - result = i->second.GetTx(); + result = i->GetTx(); return true; } @@ -516,5 +519,6 @@ bool CCoinsViewMemPool::HaveCoins(const uint256 &txid) const { size_t CTxMemPool::DynamicMemoryUsage() const { LOCK(cs); - return memusage::DynamicUsage(mapTx) + memusage::DynamicUsage(mapNextTx) + memusage::DynamicUsage(mapDeltas) + cachedInnerUsage; + // Estimate the overhead of mapTx to be 6 pointers + an allocation, as no exact formula for boost::multi_index_contained is implemented. + return memusage::MallocUsage(sizeof(CTxMemPoolEntry) + 6 * sizeof(void*)) * mapTx.size() + memusage::DynamicUsage(mapNextTx) + memusage::DynamicUsage(mapDeltas) + cachedInnerUsage; } diff --git a/src/txmempool.h b/src/txmempool.h index cd0f9a54b..30e4ca394 100644 --- a/src/txmempool.h +++ b/src/txmempool.h @@ -13,6 +13,10 @@ #include "primitives/transaction.h" #include "sync.h" +#undef foreach +#include "boost/multi_index_container.hpp" +#include "boost/multi_index/ordered_index.hpp" + class CAutoFile; inline double AllowFreeThreshold() @@ -41,6 +45,7 @@ private: size_t nTxSize; //! ... and avoid recomputing tx size size_t nModSize; //! ... and modified size for priority size_t nUsageSize; //! ... and total memory usage + CFeeRate feeRate; //! ... and fee per kB int64_t nTime; //! Local time when entering the mempool double dPriority; //! Priority when entering the mempool unsigned int nHeight; //! Chain height when entering the mempool @@ -55,6 +60,7 @@ public: const CTransaction& GetTx() const { return this->tx; } double GetPriority(unsigned int currentHeight) const; CAmount GetFee() const { return nFee; } + CFeeRate GetFeeRate() const { return feeRate; } size_t GetTxSize() const { return nTxSize; } int64_t GetTime() const { return nTime; } unsigned int GetHeight() const { return nHeight; } @@ -62,6 +68,27 @@ public: size_t DynamicMemoryUsage() const { return nUsageSize; } }; +// extracts a TxMemPoolEntry's transaction hash +struct mempoolentry_txid +{ + typedef uint256 result_type; + result_type operator() (const CTxMemPoolEntry &entry) const + { + return entry.GetTx().GetHash(); + } +}; + +class CompareTxMemPoolEntryByFee +{ +public: + bool operator()(const CTxMemPoolEntry& a, const CTxMemPoolEntry& b) + { + if (a.GetFeeRate() == b.GetFeeRate()) + return a.GetTime() < b.GetTime(); + return a.GetFeeRate() > b.GetFeeRate(); + } +}; + class CBlockPolicyEstimator; /** An inpoint - a combination of a transaction and an index n into its vin */ @@ -99,8 +126,21 @@ private: uint64_t cachedInnerUsage; //! sum of dynamic memory usage of all the map elements (NOT the maps themselves) public: + typedef boost::multi_index_container< + CTxMemPoolEntry, + boost::multi_index::indexed_by< + // sorted by txid + boost::multi_index::ordered_unique, + // sorted by fee rate + boost::multi_index::ordered_non_unique< + boost::multi_index::identity, + CompareTxMemPoolEntryByFee + > + > + > indexed_transaction_set; + mutable CCriticalSection cs; - std::map mapTx; + indexed_transaction_set mapTx; std::map mapNextTx; std::map mapNullifiers; std::map > mapDeltas; From 934fd197444519053ea37ecb1817192d31b3ed0b Mon Sep 17 00:00:00 2001 From: Pieter Wuille Date: Wed, 7 Oct 2015 23:34:55 +0200 Subject: [PATCH 0426/1062] Support -checkmempool=N, which runs checks on average once every N transactions --- src/init.cpp | 5 ++++- src/txmempool.cpp | 9 ++++++--- src/txmempool.h | 4 ++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/init.cpp b/src/init.cpp index bd6e2e79e..16306c011 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -914,7 +914,10 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) InitWarning(_("Warning: Unsupported argument -benchmark ignored, use -debug=bench.")); // Checkmempool and checkblockindex default to true in regtest mode - mempool.setSanityCheck(GetBoolArg("-checkmempool", chainparams.DefaultConsistencyChecks())); + int ratio = std::min(std::max(GetArg("-checkmempool", chainparams.DefaultConsistencyChecks() ? 1 : 0), 0), 1000000); + if (ratio != 0) { + mempool.setSanityCheck(1.0 / ratio); + } fCheckBlockIndex = GetBoolArg("-checkblockindex", chainparams.DefaultConsistencyChecks()); fCheckpointsEnabled = GetBoolArg("-checkpoints", true); diff --git a/src/txmempool.cpp b/src/txmempool.cpp index 9de5eb364..5f46a80a0 100644 --- a/src/txmempool.cpp +++ b/src/txmempool.cpp @@ -55,7 +55,7 @@ CTxMemPool::CTxMemPool(const CFeeRate& _minRelayFee) : // Sanity checks off by default for performance, because otherwise // accepting transactions becomes O(N^2) where N is the number // of transactions in the pool - fSanityCheck = false; + nCheckFrequency = 0; minerPolicyEstimator = new CBlockPolicyEstimator(_minRelayFee); } @@ -179,7 +179,7 @@ void CTxMemPool::removeCoinbaseSpends(const CCoinsViewCache *pcoins, unsigned in if (it2 != mapTx.end()) continue; const CCoins *coins = pcoins->AccessCoins(txin.prevout.hash); - if (fSanityCheck) assert(coins); + if (nCheckFrequency != 0) assert(coins); if (!coins || (coins->IsCoinBase() && ((signed long)nMemPoolHeight) - coins->nHeight < COINBASE_MATURITY)) { transactionsToRemove.push_back(tx); break; @@ -287,7 +287,10 @@ void CTxMemPool::clear() void CTxMemPool::check(const CCoinsViewCache *pcoins) const { - if (!fSanityCheck) + if (nCheckFrequency == 0) + return; + + if (insecure_rand() >= nCheckFrequency) return; LogPrint("mempool", "Checking mempool with %u transactions and %u inputs\n", (unsigned int)mapTx.size(), (unsigned int)mapNextTx.size()); diff --git a/src/txmempool.h b/src/txmempool.h index 30e4ca394..426abe984 100644 --- a/src/txmempool.h +++ b/src/txmempool.h @@ -118,7 +118,7 @@ public: class CTxMemPool { private: - bool fSanityCheck; //! Normally false, true if -checkmempool or -regtest + uint32_t nCheckFrequency; //! Value n means that n times in 2^32 we check. unsigned int nTransactionsUpdated; CBlockPolicyEstimator* minerPolicyEstimator; @@ -155,7 +155,7 @@ public: * check does nothing. */ void check(const CCoinsViewCache *pcoins) const; - void setSanityCheck(bool _fSanityCheck) { fSanityCheck = _fSanityCheck; } + void setSanityCheck(double dFrequency = 1.0) { nCheckFrequency = dFrequency * 4294967296.0; } bool addUnchecked(const uint256& hash, const CTxMemPoolEntry &entry, bool fCurrentEstimate = true); void remove(const CTransaction &tx, std::list& removed, bool fRecursive = false); From f41775b2c80cee6edd1738914074d67958598754 Mon Sep 17 00:00:00 2001 From: Alex Morcos Date: Sat, 14 Nov 2015 17:04:15 -0500 Subject: [PATCH 0427/1062] Implement helper class for CTxMemPoolEntry constructor This is only for unit tests. --- src/test/mempool_tests.cpp | 29 ++++++++++++++++------------- src/test/miner_tests.cpp | 28 ++++++++++++++++------------ src/test/policyestimator_tests.cpp | 7 ++++--- src/test/test_bitcoin.cpp | 7 +++++++ src/test/test_bitcoin.h | 25 +++++++++++++++++++++++++ 5 files changed, 68 insertions(+), 28 deletions(-) diff --git a/src/test/mempool_tests.cpp b/src/test/mempool_tests.cpp index 85971f018..c72ec4c36 100644 --- a/src/test/mempool_tests.cpp +++ b/src/test/mempool_tests.cpp @@ -17,6 +17,7 @@ BOOST_AUTO_TEST_CASE(MempoolRemoveTest) { // Test CTxMemPool::remove functionality + TestMemPoolEntryHelper entry; // Parent transaction with three children, // and three grand-children: CMutableTransaction txParent; @@ -60,17 +61,17 @@ BOOST_AUTO_TEST_CASE(MempoolRemoveTest) BOOST_CHECK_EQUAL(removed.size(), 0); // Just the parent: - testPool.addUnchecked(txParent.GetHash(), CTxMemPoolEntry(txParent, 0, 0, 0.0, 1)); + testPool.addUnchecked(txParent.GetHash(), entry.FromTx(txParent)); testPool.remove(txParent, removed, true); BOOST_CHECK_EQUAL(removed.size(), 1); removed.clear(); // Parent, children, grandchildren: - testPool.addUnchecked(txParent.GetHash(), CTxMemPoolEntry(txParent, 0, 0, 0.0, 1)); + testPool.addUnchecked(txParent.GetHash(), entry.FromTx(txParent)); for (int i = 0; i < 3; i++) { - testPool.addUnchecked(txChild[i].GetHash(), CTxMemPoolEntry(txChild[i], 0, 0, 0.0, 1)); - testPool.addUnchecked(txGrandChild[i].GetHash(), CTxMemPoolEntry(txGrandChild[i], 0, 0, 0.0, 1)); + testPool.addUnchecked(txChild[i].GetHash(), entry.FromTx(txChild[i])); + testPool.addUnchecked(txGrandChild[i].GetHash(), entry.FromTx(txGrandChild[i])); } // Remove Child[0], GrandChild[0] should be removed: testPool.remove(txChild[0], removed, true); @@ -90,8 +91,8 @@ BOOST_AUTO_TEST_CASE(MempoolRemoveTest) // Add children and grandchildren, but NOT the parent (simulate the parent being in a block) for (int i = 0; i < 3; i++) { - testPool.addUnchecked(txChild[i].GetHash(), CTxMemPoolEntry(txChild[i], 0, 0, 0.0, 1)); - testPool.addUnchecked(txGrandChild[i].GetHash(), CTxMemPoolEntry(txGrandChild[i], 0, 0, 0.0, 1)); + testPool.addUnchecked(txChild[i].GetHash(), entry.FromTx(txChild[i])); + testPool.addUnchecked(txGrandChild[i].GetHash(), entry.FromTx(txGrandChild[i])); } // Now remove the parent, as might happen if a block-re-org occurs but the parent cannot be // put into the mempool (maybe because it is non-standard): @@ -104,43 +105,45 @@ BOOST_AUTO_TEST_CASE(MempoolRemoveTest) BOOST_AUTO_TEST_CASE(MempoolIndexingTest) { CTxMemPool pool(CFeeRate(0)); + TestMemPoolEntryHelper entry; + entry.hadNoDependencies = true; /* 3rd highest fee */ CMutableTransaction tx1 = CMutableTransaction(); tx1.vout.resize(1); tx1.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL; tx1.vout[0].nValue = 10 * COIN; - pool.addUnchecked(tx1.GetHash(), CTxMemPoolEntry(tx1, 10000LL, 0, 10.0, 1, true)); + pool.addUnchecked(tx1.GetHash(), entry.Fee(10000LL).Priority(10.0).FromTx(tx1)); /* highest fee */ CMutableTransaction tx2 = CMutableTransaction(); tx2.vout.resize(1); tx2.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL; tx2.vout[0].nValue = 2 * COIN; - pool.addUnchecked(tx2.GetHash(), CTxMemPoolEntry(tx2, 20000LL, 0, 9.0, 1, true)); + pool.addUnchecked(tx2.GetHash(), entry.Fee(20000LL).Priority(9.0).FromTx(tx2)); /* lowest fee */ CMutableTransaction tx3 = CMutableTransaction(); tx3.vout.resize(1); tx3.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL; tx3.vout[0].nValue = 5 * COIN; - pool.addUnchecked(tx3.GetHash(), CTxMemPoolEntry(tx3, 0LL, 0, 100.0, 1, true)); + pool.addUnchecked(tx3.GetHash(), entry.Fee(0LL).Priority(100.0).FromTx(tx3)); /* 2nd highest fee */ CMutableTransaction tx4 = CMutableTransaction(); tx4.vout.resize(1); tx4.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL; tx4.vout[0].nValue = 6 * COIN; - pool.addUnchecked(tx4.GetHash(), CTxMemPoolEntry(tx4, 15000LL, 0, 1.0, 1, true)); + pool.addUnchecked(tx4.GetHash(), entry.Fee(15000LL).Priority(1.0).FromTx(tx4)); /* equal fee rate to tx1, but newer */ CMutableTransaction tx5 = CMutableTransaction(); tx5.vout.resize(1); tx5.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL; tx5.vout[0].nValue = 11 * COIN; - pool.addUnchecked(tx5.GetHash(), CTxMemPoolEntry(tx5, 10000LL, 1, 10.0, 1, true)); - - // there should be 4 transactions in the mempool + entry.nTime = 1; + entry.dPriority = 10.0; + pool.addUnchecked(tx5.GetHash(), entry.Fee(10000LL).FromTx(tx5)); BOOST_CHECK_EQUAL(pool.size(), 5); // Check the fee-rate index is in order, should be tx2, tx4, tx1, tx5, tx3 diff --git a/src/test/miner_tests.cpp b/src/test/miner_tests.cpp index 0ef66f6c7..6dc4da7c7 100644 --- a/src/test/miner_tests.cpp +++ b/src/test/miner_tests.cpp @@ -143,6 +143,10 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) CMutableTransaction tx,tx2; CScript script; uint256 hash; + TestMemPoolEntryHelper entry; + entry.nFee = 11; + entry.dPriority = 111.0; + entry.nHeight = 11; LOCK(cs_main); fCheckpointsEnabled = false; @@ -281,7 +285,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) { tx.vout[0].nValue -= 10; hash = tx.GetHash(); - mempool.addUnchecked(hash, CTxMemPoolEntry(tx, 11, GetTime(), 111.0, 11)); + mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx)); tx.vin[0].prevout.hash = hash; } BOOST_CHECK(pblocktemplate = CreateNewBlock(scriptPubKey)); @@ -301,7 +305,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) { tx.vout[0].nValue -= 350; hash = tx.GetHash(); - mempool.addUnchecked(hash, CTxMemPoolEntry(tx, 11, GetTime(), 111.0, 11)); + mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx)); tx.vin[0].prevout.hash = hash; } BOOST_CHECK(pblocktemplate = CreateNewBlock(scriptPubKey)); @@ -310,7 +314,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) // orphan in mempool hash = tx.GetHash(); - mempool.addUnchecked(hash, CTxMemPoolEntry(tx, 11, GetTime(), 111.0, 11)); + mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx)); BOOST_CHECK(pblocktemplate = CreateNewBlock(scriptPubKey)); delete pblocktemplate; mempool.clear(); @@ -320,7 +324,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) tx.vin[0].prevout.hash = txFirst[1]->GetHash(); tx.vout[0].nValue = 39000LL; hash = tx.GetHash(); - mempool.addUnchecked(hash, CTxMemPoolEntry(tx, 11, GetTime(), 111.0, 11)); + mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx)); tx.vin[0].prevout.hash = hash; tx.vin.resize(2); tx.vin[1].scriptSig = CScript() << OP_1; @@ -328,7 +332,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) tx.vin[1].prevout.n = 0; tx.vout[0].nValue = 49000LL; hash = tx.GetHash(); - mempool.addUnchecked(hash, CTxMemPoolEntry(tx, 11, GetTime(), 111.0, 11)); + mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx)); BOOST_CHECK(pblocktemplate = CreateNewBlock(scriptPubKey)); delete pblocktemplate; mempool.clear(); @@ -339,7 +343,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) tx.vin[0].scriptSig = CScript() << OP_0 << OP_1; tx.vout[0].nValue = 0; hash = tx.GetHash(); - mempool.addUnchecked(hash, CTxMemPoolEntry(tx, 11, GetTime(), 111.0, 11)); + mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx)); BOOST_CHECK(pblocktemplate = CreateNewBlock(scriptPubKey)); delete pblocktemplate; mempool.clear(); @@ -352,12 +356,12 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) script = CScript() << OP_0; tx.vout[0].scriptPubKey = GetScriptForDestination(CScriptID(script)); hash = tx.GetHash(); - mempool.addUnchecked(hash, CTxMemPoolEntry(tx, 11, GetTime(), 111.0, 11)); + mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx)); tx.vin[0].prevout.hash = hash; tx.vin[0].scriptSig = CScript() << (std::vector)script; tx.vout[0].nValue -= 10000; hash = tx.GetHash(); - mempool.addUnchecked(hash, CTxMemPoolEntry(tx, 11, GetTime(), 111.0, 11)); + mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx)); BOOST_CHECK(pblocktemplate = CreateNewBlock(scriptPubKey)); delete pblocktemplate; mempool.clear(); @@ -368,10 +372,10 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) tx.vout[0].nValue = 49000LL; tx.vout[0].scriptPubKey = CScript() << OP_1; hash = tx.GetHash(); - mempool.addUnchecked(hash, CTxMemPoolEntry(tx, 11, GetTime(), 111.0, 11)); + mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx)); tx.vout[0].scriptPubKey = CScript() << OP_2; hash = tx.GetHash(); - mempool.addUnchecked(hash, CTxMemPoolEntry(tx, 11, GetTime(), 111.0, 11)); + mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx)); BOOST_CHECK(pblocktemplate = CreateNewBlock(scriptPubKey)); delete pblocktemplate; mempool.clear(); @@ -397,7 +401,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) tx.vout[0].scriptPubKey = CScript() << OP_1; tx.nLockTime = chainActive.Tip()->nHeight+1; hash = tx.GetHash(); - mempool.addUnchecked(hash, CTxMemPoolEntry(tx, 11, GetTime(), 111.0, 11)); + mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx)); BOOST_CHECK(!CheckFinalTx(tx, LOCKTIME_MEDIAN_TIME_PAST)); // time locked @@ -411,7 +415,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) tx2.vout[0].scriptPubKey = CScript() << OP_1; tx2.nLockTime = chainActive.Tip()->GetMedianTimePast()+1; hash = tx2.GetHash(); - mempool.addUnchecked(hash, CTxMemPoolEntry(tx2, 11, GetTime(), 111.0, 11)); + mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx2)); BOOST_CHECK(!CheckFinalTx(tx2, LOCKTIME_MEDIAN_TIME_PAST)); BOOST_CHECK(pblocktemplate = CreateNewBlock(scriptPubKey)); diff --git a/src/test/policyestimator_tests.cpp b/src/test/policyestimator_tests.cpp index 3fcd39661..7b0a632cb 100644 --- a/src/test/policyestimator_tests.cpp +++ b/src/test/policyestimator_tests.cpp @@ -16,6 +16,7 @@ BOOST_FIXTURE_TEST_SUITE(policyestimator_tests, BasicTestingSetup) BOOST_AUTO_TEST_CASE(BlockPolicyEstimates) { CTxMemPool mpool(CFeeRate(1000)); + TestMemPoolEntryHelper entry; CAmount basefee(2000); double basepri = 1e6; CAmount deltaFee(100); @@ -63,7 +64,7 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates) for (int k = 0; k < 5; k++) { // add 4 fee txs for every priority tx tx.vin[0].prevout.n = 10000*blocknum+100*j+k; // make transaction unique uint256 hash = tx.GetHash(); - mpool.addUnchecked(hash, CTxMemPoolEntry(tx, feeV[k/4][j], GetTime(), priV[k/4][j], blocknum, mpool.HasNoInputsOf(tx))); + mpool.addUnchecked(hash, entry.Fee(feeV[k/4][j]).Time(GetTime()).Priority(priV[k/4][j]).Height(blocknum).FromTx(tx, &mpool)); txHashes[j].push_back(hash); } } @@ -132,7 +133,7 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates) for (int k = 0; k < 5; k++) { // add 4 fee txs for every priority tx tx.vin[0].prevout.n = 10000*blocknum+100*j+k; uint256 hash = tx.GetHash(); - mpool.addUnchecked(hash, CTxMemPoolEntry(tx, feeV[k/4][j], GetTime(), priV[k/4][j], blocknum, mpool.HasNoInputsOf(tx))); + mpool.addUnchecked(hash, entry.Fee(feeV[k/4][j]).Time(GetTime()).Priority(priV[k/4][j]).Height(blocknum).FromTx(tx, &mpool)); txHashes[j].push_back(hash); } } @@ -168,7 +169,7 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates) for (int k = 0; k < 5; k++) { // add 4 fee txs for every priority tx tx.vin[0].prevout.n = 10000*blocknum+100*j+k; uint256 hash = tx.GetHash(); - mpool.addUnchecked(hash, CTxMemPoolEntry(tx, feeV[k/4][j], GetTime(), priV[k/4][j], blocknum, mpool.HasNoInputsOf(tx))); + mpool.addUnchecked(hash, entry.Fee(feeV[k/4][j]).Time(GetTime()).Priority(priV[k/4][j]).Height(blocknum).FromTx(tx, &mpool)); CTransaction btx; if (mpool.lookup(hash, btx)) block.push_back(btx); diff --git a/src/test/test_bitcoin.cpp b/src/test/test_bitcoin.cpp index 0a39f2944..1badeba33 100644 --- a/src/test/test_bitcoin.cpp +++ b/src/test/test_bitcoin.cpp @@ -12,6 +12,7 @@ #include "main.h" #include "random.h" #include "txdb.h" +#include "txmempool.h" #include "ui_interface.h" #include "util.h" #ifdef ENABLE_WALLET @@ -102,6 +103,12 @@ TestingSetup::~TestingSetup() boost::filesystem::remove_all(pathTemp); } + +CTxMemPoolEntry TestMemPoolEntryHelper::FromTx(CMutableTransaction &tx, CTxMemPool *pool) { + return CTxMemPoolEntry(tx, nFee, nTime, dPriority, nHeight, + pool ? pool->HasNoInputsOf(tx) : hadNoDependencies); +} + void Shutdown(void* parg) { exit(0); diff --git a/src/test/test_bitcoin.h b/src/test/test_bitcoin.h index d1c426373..00aa57ef0 100644 --- a/src/test/test_bitcoin.h +++ b/src/test/test_bitcoin.h @@ -36,4 +36,29 @@ struct TestingSetup: public JoinSplitTestingSetup { ~TestingSetup(); }; +class CTxMemPoolEntry; +class CTxMemPool; + +struct TestMemPoolEntryHelper +{ + // Default values + CAmount nFee; + int64_t nTime; + double dPriority; + unsigned int nHeight; + bool hadNoDependencies; + + TestMemPoolEntryHelper() : + nFee(0), nTime(0), dPriority(0.0), nHeight(1), + hadNoDependencies(false) { } + + CTxMemPoolEntry FromTx(CMutableTransaction &tx, CTxMemPool *pool = NULL); + + // Change the default value + TestMemPoolEntryHelper &Fee(CAmount _fee) { nFee = _fee; return *this; } + TestMemPoolEntryHelper &Time(int64_t _time) { nTime = _time; return *this; } + TestMemPoolEntryHelper &Priority(double _priority) { dPriority = _priority; return *this; } + TestMemPoolEntryHelper &Height(unsigned int _height) { nHeight = _height; return *this; } + TestMemPoolEntryHelper &HadNoDependencies(bool _hnd) { hadNoDependencies = _hnd; return *this; } +}; #endif From 8683bd8d11e9af7c7ece45ea8873cd6658c65e9b Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 13 Feb 2018 21:29:42 +0200 Subject: [PATCH 0428/1062] Debugging --- src/komodo.h | 6 +- src/komodo_bitcoind.h | 6 +- src/komodo_gateway.h | 21 +++++ src/komodo_globals.h | 8 +- src/komodo_interest.h | 13 +-- src/komodo_notary.h | 186 +++++++++++++++++++++++++++++------------- src/komodo_structs.h | 3 +- src/komodo_utils.h | 76 +++++++++++++---- src/main.cpp | 37 ++++++++- src/miner.cpp | 58 +++++++++---- src/pow.cpp | 18 ++-- src/rpcmisc.cpp | 4 +- 12 files changed, 318 insertions(+), 118 deletions(-) diff --git a/src/komodo.h b/src/komodo.h index c6467d957..3b22453a4 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -473,7 +473,7 @@ void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotar } } -int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scriptbuf,int32_t scriptlen,int32_t height,uint256 txhash,int32_t i,int32_t j,uint64_t *voutmaskp,int32_t *specialtxp,int32_t *notarizedheightp,uint64_t value,int32_t notarized,uint64_t signedmask) +int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scriptbuf,int32_t scriptlen,int32_t height,uint256 txhash,int32_t i,int32_t j,uint64_t *voutmaskp,int32_t *specialtxp,int32_t *notarizedheightp,uint64_t value,int32_t notarized,uint64_t signedmask,uint32_t timestamp) { static uint256 zero; static FILE *signedfp; int32_t opretlen,nid,k,len = 0; uint256 kmdtxid,desttxid; uint8_t crypto777[33]; struct komodo_state *sp; char symbol[KOMODO_ASSETCHAIN_MAXLEN],dest[KOMODO_ASSETCHAIN_MAXLEN]; @@ -499,7 +499,7 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr *specialtxp = 1; //printf(">>>>>>>> "); } - else if ( komodo_chosennotary(&nid,height,scriptbuf + 1) >= 0 ) + else if ( komodo_chosennotary(&nid,height,scriptbuf + 1,timestamp) >= 0 ) { //printf("found notary.k%d\n",k); if ( notaryid < 64 ) @@ -741,7 +741,7 @@ void komodo_connectblock(CBlockIndex *pindex,CBlock& block) #else memcpy(scriptbuf,(uint8_t *)&block.vtx[i].vout[j].scriptPubKey[0],len); #endif - notaryid = komodo_voutupdate(&isratification,notaryid,scriptbuf,len,height,txhash,i,j,&voutmask,&specialtx,¬arizedheight,(uint64_t)block.vtx[i].vout[j].nValue,notarized,signedmask); + notaryid = komodo_voutupdate(&isratification,notaryid,scriptbuf,len,height,txhash,i,j,&voutmask,&specialtx,¬arizedheight,(uint64_t)block.vtx[i].vout[j].nValue,notarized,signedmask,(uint32_t)chainActive.Tip()->GetBlockTime()); if ( 0 && i > 0 ) { for (k=0; k= 225000 ) - komodo_chosennotary(¬aryid,height,_pubkey33); + komodo_chosennotary(¬aryid,height,_pubkey33,timestamp); if ( height >= 34000 && notaryid >= 0 ) { if ( height < 79693 ) @@ -777,7 +777,7 @@ int32_t komodo_is_special(int32_t height,uint8_t pubkey33[33]) else limit = 66; for (i=1; i 0 ) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index d655f2aa5..d814bd6bf 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -719,6 +719,27 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block) // verify above } return(0); } + if ( ASSETCHAINS_SYMBOL[0] != 0 && ASSETCHAINS_COMMISSION != 0 ) + { + total = 0; + for (i=1; i nLockTime && (minutes= (tiptime - nLockTime) / 60) >= 60 ) + if ( nLockTime >= LOCKTIME_THRESHOLD && tiptime > nLockTime && (minutes= (tiptime - nLockTime) / 60) >= 60 ) { if ( minutes > 365 * 24 * 60 ) minutes = 365 * 24 * 60; @@ -152,7 +153,7 @@ uint64_t komodo_interest(int32_t txheight,uint64_t nValue,uint32_t nLockTime,uin interest = (numerator * minutes) / ((uint64_t)365 * 24 * 60); interestnew = _komodo_interestnew(nValue,nLockTime,tiptime); if ( interest < interestnew ) - printf("path0 current interest %.8f vs new %.8f for ht.%d %.8f locktime.%u tiptime.%u\n",dstr(interest),dstr(interestnew),txheight,dstr(nValue),nLockTime,tiptime); + printf("pathA current interest %.8f vs new %.8f for ht.%d %.8f locktime.%u tiptime.%u\n",dstr(interest),dstr(interestnew),txheight,dstr(nValue),nLockTime,tiptime); } else interest = _komodo_interestnew(nValue,nLockTime,tiptime); } @@ -162,7 +163,7 @@ uint64_t komodo_interest(int32_t txheight,uint64_t nValue,uint32_t nLockTime,uin interest = (numerator / denominator) / COIN; interestnew = _komodo_interestnew(nValue,nLockTime,tiptime); if ( interest < interestnew ) - printf("path0 current interest %.8f vs new %.8f for ht.%d %.8f locktime.%u tiptime.%u\n",dstr(interest),dstr(interestnew),txheight,dstr(nValue),nLockTime,tiptime); + printf("pathB current interest %.8f vs new %.8f for ht.%d %.8f locktime.%u tiptime.%u\n",dstr(interest),dstr(interestnew),txheight,dstr(nValue),nLockTime,tiptime); } else interest = _komodo_interestnew(nValue,nLockTime,tiptime); } @@ -187,8 +188,8 @@ uint64_t komodo_interest(int32_t txheight,uint64_t nValue,uint32_t nLockTime,uin interest = ((numerator * minutes) / ((uint64_t)365 * 24 * 60)); //fprintf(stderr,"interest %llu %.8f <- numerator.%llu minutes.%d\n",(long long)interest,(double)interest/COIN,(long long)numerator,(int32_t)minutes); interestnew = _komodo_interestnew(nValue,nLockTime,tiptime); - if ( interest < interestnew )//|| (interestnew < 0.9999*interest && (interest-interestnew) > 50000) ) - printf("path1 current interest %.8f vs new %.8f for ht.%d %.8f locktime.%u tiptime.%u\n",dstr(interest),dstr(interestnew),txheight,dstr(nValue),nLockTime,tiptime); + if ( interest < interestnew ) + fprintf(stderr,"pathC current interest %.8f vs new %.8f for ht.%d %.8f locktime.%u tiptime.%u\n",dstr(interest),dstr(interestnew),txheight,dstr(nValue),nLockTime,tiptime); } else interest = _komodo_interestnew(nValue,nLockTime,tiptime); } diff --git a/src/komodo_notary.h b/src/komodo_notary.h index a306f848f..9da3b6d05 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -58,7 +58,7 @@ const char *Notaries_genesis[][2] = { "titomane_SH", "035f49d7a308dd9a209e894321f010d21b7793461b0c89d6d9231a3fe5f68d9960" }, }; -const char *Notaries_elected[][2] = +const char *Notaries_elected0[][2] = { { "0_jl777_testA", "03b7621b44118017a16043f19b30cc8a4cfe068ac4e42417bae16ba460c80f3828" }, { "0_jl777_testB", "02ebfc784a4ba768aad88d44d1045d240d47b26e248cafaf1c5169a42d7a61d344" }, @@ -126,62 +126,99 @@ const char *Notaries_elected[][2] = { "xxspot2_XX", "03d85b221ea72ebcd25373e7961f4983d12add66a92f899deaf07bab1d8b6f5573" } }; -int32_t komodo_electednotary(uint8_t *pubkey33,int32_t height) -{ - char pubkeystr[67]; int32_t i; uint8_t legacy33[33]; - for (i=0; i<33; i++) - sprintf(&pubkeystr[i*2],"%02x",pubkey33[i]); - pubkeystr[66] = 0; - //printf("%s vs\n",pubkeystr); - for (i=0; i elected %s\n",i,(char *)Notaries_elected[i][1]); - return(i); - } - } - /*if ( height < 300000 ) - { - for (i=0; i elected %s\n",i,(char *)Notaries_elected[i][1]); - return(i+64); - } - } - decode_hex(legacy33,33,(char *)"0252b6185bf8ea7efe8bbc345ddc8da87329149f30233088387abd716d4aa9e974"); - if ( memcmp(pubkey33,legacy33,33) == 0 ) - return(128); - }*/ - return(-1); -} +#define KOMODO_NOTARIES_TIMESTAMP1 1600000000 +#define KOMODO_NOTARIES_HEIGHT1 ((800000 / KOMODO_ELECTION_GAP) * KOMODO_ELECTION_GAP) -int32_t komodo_ratify_threshold(int32_t height,uint64_t signedmask) +const char *Notaries_elected1[][2] = { - int32_t htind,numnotaries,i,wt = 0; - htind = height / KOMODO_ELECTION_GAP; - numnotaries = Pubkeys[htind].numnotaries; - for (i=0; i (numnotaries >> 1) || (wt > 7 && (signedmask & 1) != 0) ) - return(1); - else return(0); -} + { "0_jl777_testA", "03b7621b44118017a16043f19b30cc8a4cfe068ac4e42417bae16ba460c80f3828" }, + { "0_jl777_testB", "02ebfc784a4ba768aad88d44d1045d240d47b26e248cafaf1c5169a42d7a61d344" }, + { "0_kolo_testA", "0287aa4b73988ba26cf6565d815786caf0d2c4af704d7883d163ee89cd9977edec" }, + { "artik_AR", "029acf1dcd9f5ff9c455f8bb717d4ae0c703e089d16cf8424619c491dff5994c90" }, + { "artik_EU", "03f54b2c24f82632e3cdebe4568ba0acf487a80f8a89779173cdb78f74514847ce" }, + { "artik_NA", "0224e31f93eff0cc30eaf0b2389fbc591085c0e122c4d11862c1729d090106c842" }, + { "artik_SH", "02bdd8840a34486f38305f311c0e2ae73e84046f6e9c3dd3571e32e58339d20937" }, + { "badass_EU", "0209d48554768dd8dada988b98aca23405057ac4b5b46838a9378b95c3e79b9b9e" }, + { "badass_NA", "02afa1a9f948e1634a29dc718d218e9d150c531cfa852843a1643a02184a63c1a7" }, + { "badass_SH", "026b49dd3923b78a592c1b475f208e23698d3f085c4c3b4906a59faf659fd9530b" }, + { "crackers_EU", "03bc819982d3c6feb801ec3b720425b017d9b6ee9a40746b84422cbbf929dc73c3" }, // 10 + { "crackers_NA", "03205049103113d48c7c7af811b4c8f194dafc43a50d5313e61a22900fc1805b45" }, + { "crackers_SH", "02be28310e6312d1dd44651fd96f6a44ccc269a321f907502aae81d246fabdb03e" }, + { "durerus_EU", "02bcbd287670bdca2c31e5d50130adb5dea1b53198f18abeec7211825f47485d57" }, + { "etszombi_AR", "031c79168d15edabf17d9ec99531ea9baa20039d0cdc14d9525863b83341b210e9" }, + { "etszombi_EU", "0281b1ad28d238a2b217e0af123ce020b79e91b9b10ad65a7917216eda6fe64bf7" }, // 15 + { "etszombi_SH", "025d7a193c0757f7437fad3431f027e7b5ed6c925b77daba52a8755d24bf682dde" }, + { "farl4web_EU", "0300ecf9121cccf14cf9423e2adb5d98ce0c4e251721fa345dec2e03abeffbab3f" }, + { "farl4web_SH", "0396bb5ed3c57aa1221d7775ae0ff751e4c7dc9be220d0917fa8bbdf670586c030" }, + { "fullmoon_AR", "0254b1d64840ce9ff6bec9dd10e33beb92af5f7cee628f999cb6bc0fea833347cc" }, + { "fullmoon_NA", "031fb362323b06e165231c887836a8faadb96eda88a79ca434e28b3520b47d235b" }, // 20 + { "fullmoon_SH", "030e12b42ec33a80e12e570b6c8274ce664565b5c3da106859e96a7208b93afd0d" }, + { "grewal_NA", "03adc0834c203d172bce814df7c7a5e13dc603105e6b0adabc942d0421aefd2132" }, + { "grewal_SH", "03212a73f5d38a675ee3cdc6e82542a96c38c3d1c79d25a1ed2e42fcf6a8be4e68" }, + { "indenodes_AR", "02ec0fa5a40f47fd4a38ea5c89e375ad0b6ddf4807c99733c9c3dc15fb978ee147" }, + { "indenodes_EU", "0221387ff95c44cb52b86552e3ec118a3c311ca65b75bf807c6c07eaeb1be8303c" }, + { "indenodes_NA", "02698c6f1c9e43b66e82dbb163e8df0e5a2f62f3a7a882ca387d82f86e0b3fa988" }, + { "indenodes_SH", "0334e6e1ec8285c4b85bd6dae67e17d67d1f20e7328efad17ce6fd24ae97cdd65e" }, + { "jeezy_EU", "023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6" }, + { "jsgalt_NA", "027b3fb6fede798cd17c30dbfb7baf9332b3f8b1c7c513f443070874c410232446" }, + { "karasugoi_NA", "02a348b03b9c1a8eac1b56f85c402b041c9bce918833f2ea16d13452309052a982" }, // 30 + { "kashifali_EU", "033777c52a0190f261c6f66bd0e2bb299d30f012dcb8bfff384103211edb8bb207" }, + { "kolo_AR", "03016d19344c45341e023b72f9fb6e6152fdcfe105f3b4f50b82a4790ff54e9dc6" }, + { "kolo_SH", "02aa24064500756d9b0959b44d5325f2391d8e95c6127e109184937152c384e185" }, + { "metaphilibert_AR", "02adad675fae12b25fdd0f57250b0caf7f795c43f346153a31fe3e72e7db1d6ac6" }, + { "movecrypto_AR", "022783d94518e4dc77cbdf1a97915b29f427d7bc15ea867900a76665d3112be6f3" }, + { "movecrypto_EU", "021ab53bc6cf2c46b8a5456759f9d608966eff87384c2b52c0ac4cc8dd51e9cc42" }, + { "movecrypto_NA", "02efb12f4d78f44b0542d1c60146738e4d5506d27ec98a469142c5c84b29de0a80" }, + { "movecrypto_SH", "031f9739a3ebd6037a967ce1582cde66e79ea9a0551c54731c59c6b80f635bc859" }, + { "muros_AR", "022d77402fd7179335da39479c829be73428b0ef33fb360a4de6890f37c2aa005e" }, + { "noashh_AR", "029d93ef78197dc93892d2a30e5a54865f41e0ca3ab7eb8e3dcbc59c8756b6e355" }, // 40 + { "noashh_EU", "02061c6278b91fd4ac5cab4401100ffa3b2d5a277e8f71db23401cc071b3665546" }, + { "noashh_NA", "033c073366152b6b01535e15dd966a3a8039169584d06e27d92a69889b720d44e1" }, + { "nxtswe_EU", "032fb104e5eaa704a38a52c126af8f67e870d70f82977e5b2f093d5c1c21ae5899" }, + { "polycryptoblog_NA", "02708dcda7c45fb54b78469673c2587bfdd126e381654819c4c23df0e00b679622" }, + { "pondsea_AR", "032e1c213787312099158f2d74a89e8240a991d162d4ce8017d8504d1d7004f735" }, + { "pondsea_EU", "0225aa6f6f19e543180b31153d9e6d55d41bc7ec2ba191fd29f19a2f973544e29d" }, + { "pondsea_NA", "031bcfdbb62268e2ff8dfffeb9ddff7fe95fca46778c77eebff9c3829dfa1bb411" }, + { "pondsea_SH", "02209073bc0943451498de57f802650311b1f12aa6deffcd893da198a544c04f36" }, + { "popcornbag_AR", "02761f106fb34fbfc5ddcc0c0aa831ed98e462a908550b280a1f7bd32c060c6fa3" }, + { "popcornbag_NA", "03c6085c7fdfff70988fda9b197371f1caf8397f1729a844790e421ee07b3a93e8" }, // 50 + { "ptytrader_NA", "0328c61467148b207400b23875234f8a825cce65b9c4c9b664f47410b8b8e3c222" }, + { "ptytrader_SH", "0250c93c492d8d5a6b565b90c22bee07c2d8701d6118c6267e99a4efd3c7748fa4" }, + { "rnr_AR", "029bdb08f931c0e98c2c4ba4ef45c8e33a34168cb2e6bf953cef335c359d77bfcd" }, + { "rnr_EU", "03f5c08dadffa0ffcafb8dd7ffc38c22887bd02702a6c9ac3440deddcf2837692b" }, + { "rnr_NA", "02e17c5f8c3c80f584ed343b8dcfa6d710dfef0889ec1e7728ce45ce559347c58c" }, + { "rnr_SH", "037536fb9bdfed10251f71543fb42679e7c52308bcd12146b2568b9a818d8b8377" }, + { "titomane_AR", "03cda6ca5c2d02db201488a54a548dbfc10533bdc275d5ea11928e8d6ab33c2185" }, + { "titomane_EU", "02e41feded94f0cc59f55f82f3c2c005d41da024e9a805b41105207ef89aa4bfbd" }, + { "titomane_SH", "035f49d7a308dd9a209e894321f010d21b7793461b0c89d6d9231a3fe5f68d9960" }, + { "vanbreuk_EU", "024f3cad7601d2399c131fd070e797d9cd8533868685ddbe515daa53c2e26004c3" }, // 60 + { "xrobesx_NA", "03f0cc6d142d14a40937f12dbd99dbd9021328f45759e26f1877f2a838876709e1" }, + { "xxspot1_XX", "02ef445a392fcaf3ad4176a5da7f43580e8056594e003eba6559a713711a27f955" }, + { "xxspot2_XX", "03d85b221ea72ebcd25373e7961f4983d12add66a92f899deaf07bab1d8b6f5573" } +}; -int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height) +int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestamp) { int32_t i,htind,n; uint64_t mask = 0; struct knotary_entry *kp,*tmp; - if ( height >= 180000 || ASSETCHAINS_SYMBOL[0] != 0 ) + if ( height >= KOMODO_NOTARIES_HARDCODED || ASSETCHAINS_SYMBOL[0] != 0 ) { - n = (int32_t)(sizeof(Notaries_elected)/sizeof(*Notaries_elected)); - for (i=0; i= KOMODO_MAXBLOCKS / KOMODO_ELECTION_GAP ) + htind = (KOMODO_MAXBLOCKS / KOMODO_ELECTION_GAP) - 1; pthread_mutex_lock(&komodo_mutex); n = Pubkeys[htind].numnotaries; HASH_ITER(hh,Pubkeys[htind].Notaries,kp,tmp) @@ -199,6 +236,38 @@ int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height) return(-1); } +int32_t komodo_electednotary(int32_t *numnotariesp,uint8_t *pubkey33,int32_t height,uint32_t timestamp) +{ + char pubkeystr[67]; int32_t i,n; uint8_t pubkeys[64][33]; + for (i=0; i<33; i++) + sprintf(&pubkeystr[i*2],"%02x",pubkey33[i]); + pubkeystr[66] = 0; + //printf("%s vs\n",pubkeystr); + n = komodo_notaries(pubkeys,height,timestamp); + *numnotariesp = n; + for (i=0; i= KOMODO_MAXBLOCKS / KOMODO_ELECTION_GAP ) + htind = (KOMODO_MAXBLOCKS / KOMODO_ELECTION_GAP) - 1; + numnotaries = Pubkeys[htind].numnotaries; + for (i=0; i (numnotaries >> 1) || (wt > 7 && (signedmask & 1) != 0) ) + return(1); + else return(0); +} + void komodo_notarysinit(int32_t origheight,uint8_t pubkeys[64][33],int32_t num) { static int32_t hwmheight; @@ -212,6 +281,8 @@ void komodo_notarysinit(int32_t origheight,uint8_t pubkeys[64][33],int32_t num) height /= KOMODO_ELECTION_GAP; height = ((height + 1) * KOMODO_ELECTION_GAP); htind = (height / KOMODO_ELECTION_GAP); + if ( htind >= KOMODO_MAXBLOCKS / KOMODO_ELECTION_GAP ) + htind = (KOMODO_MAXBLOCKS / KOMODO_ELECTION_GAP) - 1; //printf("htind.%d activation %d from %d vs %d | hwmheight.%d %s\n",htind,height,origheight,(((origheight+KOMODO_ELECTION_GAP/2)/KOMODO_ELECTION_GAP)+1)*KOMODO_ELECTION_GAP,hwmheight,ASSETCHAINS_SYMBOL); } else htind = 0; pthread_mutex_lock(&komodo_mutex); @@ -244,7 +315,7 @@ void komodo_notarysinit(int32_t origheight,uint8_t pubkeys[64][33],int32_t num) hwmheight = origheight; } -int32_t komodo_chosennotary(int32_t *notaryidp,int32_t height,uint8_t *pubkey33) +int32_t komodo_chosennotary(int32_t *notaryidp,int32_t height,uint8_t *pubkey33,uint32_t timestamp) { // -1 if not notary, 0 if notary, 1 if special notary struct knotary_entry *kp; int32_t numnotaries=0,htind,modval = -1; @@ -255,18 +326,19 @@ int32_t komodo_chosennotary(int32_t *notaryidp,int32_t height,uint8_t *pubkey33) printf("komodo_chosennotary ht.%d illegal\n",height); return(-1); } - if ( height >= 180000 ) + if ( height >= KOMODO_NOTARIES_HARDCODED || ASSETCHAINS_SYMBOL[0] != 0 ) { - if ( (*notaryidp= komodo_electednotary(pubkey33,height)) >= 0 ) + if ( (*notaryidp= komodo_electednotary(&numnotaries,pubkey33,height,timestamp)) >= 0 && numnotaries != 0 ) { - numnotaries = (int32_t)(sizeof(Notaries_elected)/sizeof(*Notaries_elected)); modval = ((height % numnotaries) == *notaryidp); return(modval); } } - if ( height >= 250000 )//300000 ) + if ( height >= 250000 ) return(-1); htind = height / KOMODO_ELECTION_GAP; + if ( htind >= KOMODO_MAXBLOCKS / KOMODO_ELECTION_GAP ) + htind = (KOMODO_MAXBLOCKS / KOMODO_ELECTION_GAP) - 1; pthread_mutex_lock(&komodo_mutex); HASH_FIND(hh,Pubkeys[htind].Notaries,pubkey33,33,kp); pthread_mutex_unlock(&komodo_mutex); @@ -405,7 +477,7 @@ void komodo_init(int32_t height) // Minerids[i] = -2; didinit = 1; } - else if ( 0 && height == KOMODO_MAINNET_START ) + /*else if ( 0 && height == KOMODO_MAINNET_START ) { n = (int32_t)(sizeof(Notaries_elected)/sizeof(*Notaries_elected)); for (k=0; k 100000000 ) + { + ASSETCHAINS_DECAY = 0; + printf("ASSETCHAINS_DECAY cant be more than 100000000\n"); + } + if ( strlen(ASSETCHAINS_OVERRIDE_PUBKEY.c_str()) == 66 && ASSETCHAINS_COMMISSION > 0 && ASSETCHAINS_COMMISSION <= 1000000 ) + decode_hex(ASSETCHAINS_OVERRIDE_PUBKEY33,33,(char *)ASSETCHAINS_OVERRIDE_PUBKEY.c_str()); + else + { + ASSETCHAINS_COMMISSION = 0; + printf("ASSETCHAINS_COMMISSION needs an ASETCHAINS_OVERRIDE_PUBKEY\n"); + } + if ( ASSETCHAINS_ENDSUBSIDY != 0 || ASSETCHAINS_REWARD != 0 || ASSETCHAINS_HALVING != 0 || ASSETCHAINS_DECAY != 0 || ASSETCHAINS_COMMISSION != 0 ) + { + printf("end.%d reward.%llu halving.%llu decay.%llu perc.%llu\n",ASSETCHAINS_ENDSUBSIDY,(long long)ASSETCHAINS_REWARD,(long long)ASSETCHAINS_HALVING,(long long)ASSETCHAINS_DECAY,(long long)ASSETCHAINS_COMMISSION); + extraptr = extrabuf; + memcpy(extraptr,ASSETCHAINS_OVERRIDE_PUBKEY33,33), extralen = 33; + extralen += iguana_rwnum(1,&extraptr[extralen],sizeof(ASSETCHAINS_ENDSUBSIDY),(void *)&ASSETCHAINS_ENDSUBSIDY); + extralen += iguana_rwnum(1,&extraptr[extralen],sizeof(ASSETCHAINS_REWARD),(void *)&ASSETCHAINS_REWARD); + extralen += iguana_rwnum(1,&extraptr[extralen],sizeof(ASSETCHAINS_HALVING),(void *)&ASSETCHAINS_HALVING); + extralen += iguana_rwnum(1,&extraptr[extralen],sizeof(ASSETCHAINS_DECAY),(void *)&ASSETCHAINS_DECAY); + extralen += iguana_rwnum(1,&extraptr[extralen],sizeof(ASSETCHAINS_COMMISSION),(void *)&ASSETCHAINS_COMMISSION); + } addn = GetArg("-seednode",""); if ( strlen(addn.c_str()) > 0 ) ASSETCHAINS_SEED = 1; @@ -1545,7 +1589,7 @@ void komodo_args(char *argv0) MAX_MONEY = komodo_maxallowed(baseid); else MAX_MONEY = (ASSETCHAINS_SUPPLY+1) * SATOSHIDEN; //printf("baseid.%d MAX_MONEY.%s %.8f\n",baseid,ASSETCHAINS_SYMBOL,(double)MAX_MONEY/SATOSHIDEN); - ASSETCHAINS_PORT = komodo_port(ASSETCHAINS_SYMBOL,ASSETCHAINS_SUPPLY,&ASSETCHAINS_MAGIC); + ASSETCHAINS_PORT = komodo_port(ASSETCHAINS_SYMBOL,ASSETCHAINS_SUPPLY,&ASSETCHAINS_MAGIC,extraptr,extralen); while ( (dirname= (char *)GetDataDir(false).string().c_str()) == 0 || dirname[0] == 0 ) { fprintf(stderr,"waiting for datadir\n"); @@ -1564,8 +1608,8 @@ void komodo_args(char *argv0) COINBASE_MATURITY = 1; LogPrintf("ASSETCHAINS_PORT %s %u\n",ASSETCHAINS_SYMBOL,ASSETCHAINS_PORT); } - ASSETCHAINS_NOTARIES = GetArg("-ac_notaries",""); - komodo_assetchain_pubkeys((char *)ASSETCHAINS_NOTARIES.c_str()); + //ASSETCHAINS_NOTARIES = GetArg("-ac_notaries",""); + //komodo_assetchain_pubkeys((char *)ASSETCHAINS_NOTARIES.c_str()); iguana_rwnum(1,magic,sizeof(ASSETCHAINS_MAGIC),(void *)&ASSETCHAINS_MAGIC); for (i=0; i<4; i++) sprintf(&magicstr[i<<1],"%02x",magic[i]); @@ -1615,7 +1659,7 @@ void komodo_args(char *argv0) break; } } - BITCOIND_PORT = GetArg("-rpcport", BaseParams().RPCPort()); + BITCOIND_PORT = GetArg("-rpcport", BaseParams().RPCPort()); //fprintf(stderr,"%s chain params initialized\n",ASSETCHAINS_SYMBOL); } diff --git a/src/main.cpp b/src/main.cpp index e06749072..0ac888c71 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1493,11 +1493,11 @@ bool ReadBlockFromDisk(CBlock& block, const CBlockIndex* pindex) //uint64_t komodo_moneysupply(int32_t height); extern char ASSETCHAINS_SYMBOL[KOMODO_ASSETCHAIN_MAXLEN]; extern uint32_t ASSETCHAINS_MAGIC; -extern uint64_t ASSETCHAINS_SUPPLY; +extern uint64_t ASSETCHAINS_ENDSUBSIDY,ASSETCHAINS_REWARD,ASSETCHAINS_HALVING,ASSETCHAINS_LINEAR,ASSETCHAINS_COMMISSION,ASSETCHAINS_SUPPLY = 10; CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams) { - CAmount nSubsidy = 3 * COIN; + int32_t numhalvings; uint64_t numerator; CAmount nSubsidy = 3 * COIN; if ( ASSETCHAINS_SYMBOL[0] == 0 ) { if ( nHeight == 1 ) @@ -1510,7 +1510,38 @@ CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams) { if ( nHeight == 1 ) return(ASSETCHAINS_SUPPLY * COIN + (ASSETCHAINS_MAGIC & 0xffffff)); - else return(10000); + else if ( ASSETCHAINS_ENDSUBSIDY == 0 || nHeight < ASSETCHAINS_ENDSUBSIDY ) + { + if ( ASSETCHAINS_REWARD == 0 ) + return(10000); + else if ( ASSETCHAINS_ENDHEIGHT != 0 && nHeight >= ASSETCHAINS_ENDHEIGHT ) + return(0); + else + { + nSubsidy = ASSETCHAINS_REWARD; + if ( ASSETCHAINS_HALVING != 0 ) + { + if ( (numhalvings= (nHeight / ASSETCHAINS_HALVING)) > 0 ) + { + if ( numhalvings >= 64 && ASSETCHAINS_DECAY == 0 ) + return(0); + if ( ASSETCHAINS_DECAY == 0 ) + nSubsidy >>= numhalvings; + else if ( ASSETCHAINS_DECAY == 100000000 && ASSETCHAINS_ENDHEIGHT != 0 ) + { + numerator = (ASSETCHAINS_ENDHEIGHT - nHeight); + nSubsidy = (nSubidy * numerator) / ASSETCHAINS_ENDHEIGHT; + } + else + { + for (i=0; i 0 ) // have pricefeed @@ -411,14 +411,14 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) txNew.vout[1].nValue = 0; //fprintf(stderr,"opretlen.%d\n",opretlen); } //else printf("null opretlen for prices\n"); - }*/ + } } else if ( komodo_is_issuer() != 0 ) { komodo_gateway_deposits(&txNew,ASSETCHAINS_SYMBOL,0); if ( txNew.vout.size() > 1 ) fprintf(stderr,"%s txNew numvouts.%d\n",ASSETCHAINS_SYMBOL,(int32_t)txNew.vout.size()); - } + }*/ pblock->vtx[0] = txNew; pblocktemplate->vTxFees[0] = -nFees; @@ -640,7 +640,7 @@ void static BitcoinMiner() unsigned int n = chainparams.EquihashN(); unsigned int k = chainparams.EquihashK(); - int32_t notaryid = -1; + uint8_t *script; uint64_t total,checktoshis; int32_t i,j,notaryid = -1; while ( (ASSETCHAIN_INIT == 0 || KOMODO_INITDONE == 0) ) //chainActive.Tip()->nHeight != 235300 && { sleep(1); @@ -648,7 +648,7 @@ void static BitcoinMiner() break; } //sleep(60); - komodo_chosennotary(¬aryid,chainActive.Tip()->nHeight,NOTARY_PUBKEY33); + komodo_chosennotary(¬aryid,chainActive.Tip()->nHeight,NOTARY_PUBKEY33,(uint32_t)chainActive.Tip()->GetBlockTime()); std::string solver; //if ( notaryid >= 0 || ASSETCHAINS_SYMBOL[0] != 0 ) @@ -741,14 +741,42 @@ void static BitcoinMiner() CBlock *pblock = &pblocktemplate->block; if ( ASSETCHAINS_SYMBOL[0] != 0 ) { - if ( pblock->vtx.size() == 1 && pblock->vtx[0].vout.size() == 1 && Mining_height > ASSETCHAINS_MINHEIGHT ) + if ( ASSETCHAINS_REWARD == 0 ) { - static uint32_t counter; - if ( counter++ < 10 ) - fprintf(stderr,"skip generating %s on-demand block, no tx avail\n",ASSETCHAINS_SYMBOL); - sleep(10); - continue; - } else fprintf(stderr,"%s vouts.%d mining.%d vs %d\n",ASSETCHAINS_SYMBOL,(int32_t)pblock->vtx[0].vout.size(),Mining_height,ASSETCHAINS_MINHEIGHT); + if ( pblock->vtx.size() == 1 && pblock->vtx[0].vout.size() == 1 && Mining_height > ASSETCHAINS_MINHEIGHT ) + { + static uint32_t counter; + if ( counter++ < 10 ) + fprintf(stderr,"skip generating %s on-demand block, no tx avail\n",ASSETCHAINS_SYMBOL); + sleep(10); + continue; + } else fprintf(stderr,"%s vouts.%d mining.%d vs %d\n",ASSETCHAINS_SYMBOL,(int32_t)pblock->vtx[0].vout.size(),Mining_height,ASSETCHAINS_MINHEIGHT); + } + else if ( ASSETCHAINS_COMMISSION != 0 ) + { + total = 0; + for (i=1; ivtx.size(); i++) + { + n = pblock->vtx[i].vout.size(); + for (j=0; jvtx[i].vout[j].nValue; + } + if ( (checktoshis = (total * ASSETCHAINS_COMMISSION) / COIN) != 0 ) + { + pblock->vtx[0].vout[1].nValue = checktoshis; + pblock->vtx[0].vout.resize(2); + pblock->vtx[0].vout[1].scriptPubKey.resize(35); + script = (uint8_t *)pblock->vtx[0].vout[1].scriptPubKey.data(); + script[0] = 33; + for (i=0; i<33; i++) + script[i+1] = ASSETCHAINS_OVERRIDE_PUBKEY33[i]; + script[34] = OP_CHECKSIG; + } + } + else + { + pblock->vtx[0].vout.resize(1); + } } IncrementExtraNonce(pblock, pindexPrev, nExtraNonce); LogPrintf("Running KomodoMiner.%s with %u transactions in block (%u bytes)\n",solver.c_str(),pblock->vtx.size(),::GetSerializeSize(*pblock,SER_NETWORK,PROTOCOL_VERSION)); diff --git a/src/pow.cpp b/src/pow.cpp index cbee3f6a6..39d4fbc42 100644 --- a/src/pow.cpp +++ b/src/pow.cpp @@ -115,13 +115,14 @@ bool CheckEquihashSolution(const CBlockHeader *pblock, const CChainParams& param return true; } -int32_t komodo_chosennotary(int32_t *notaryidp,int32_t height,uint8_t *pubkey33); -int32_t komodo_is_special(int32_t height,uint8_t pubkey33[33]); +int32_t komodo_chosennotary(int32_t *notaryidp,int32_t height,uint8_t *pubkey33,uint32_t timestamp); +int32_t komodo_is_special(int32_t height,uint8_t pubkey33[33],uint32_t timestamp); int32_t komodo_currentheight(); CBlockIndex *komodo_chainactive(int32_t height); int8_t komodo_minerid(int32_t height,uint8_t *pubkey33); void komodo_index2pubkey33(uint8_t *pubkey33,CBlockIndex *pindex,int32_t height); extern int32_t KOMODO_CHOSEN_ONE; +extern char ASSETCHAINS_SYMBOL[]; #define KOMODO_ELECTION_GAP 2000 int32_t komodo_eligiblenotary(uint8_t pubkeys[66][33],int32_t *mids,int32_t *nonzpkeysp,int32_t height); @@ -132,15 +133,16 @@ extern std::string NOTARY_PUBKEY; bool CheckProofOfWork(int32_t height,uint8_t *pubkey33,uint256 hash, unsigned int nBits, const Consensus::Params& params) { extern int32_t KOMODO_REWIND; - bool fNegative,fOverflow; int32_t i,nonzpkeys=0,nonz=0,special=0,special2=0,notaryid=-1,duplicate,flag = 0, mids[66]; + bool fNegative,fOverflow; int32_t i,nonzpkeys=0,nonz=0,special=0,special2=0,notaryid=-1,duplicate,flag = 0, mids[66]; uint32_t timestamp = 0; arith_uint256 bnTarget; CBlockIndex *pindex; uint8_t pubkeys[66][33]; - + if ( (pindex= chainActive.Tip()) != 0 ) + timestamp = (uint32_t)pindex->GetBlockTime(); bnTarget.SetCompact(nBits, &fNegative, &fOverflow); if ( height == 0 ) height = komodo_currentheight() + 1; - special = komodo_chosennotary(¬aryid,height,pubkey33); - flag = komodo_eligiblenotary(pubkeys,mids,&nonzpkeys,height); - if ( height > 34000 ) // 0 -> non-special notary + special = komodo_chosennotary(¬aryid,height,pubkey33,timestamp); + flag = komodo_eligiblenotary(pubkeys,mids,&nonzpkeys,height,timestamp); + if ( height > 34000 && ASSETCHAINS_SYMBOL[0] == 0 ) // 0 -> non-special notary { for (i=0; i<33; i++) { @@ -149,7 +151,7 @@ bool CheckProofOfWork(int32_t height,uint8_t *pubkey33,uint256 hash, unsigned in } if ( nonz == 0 ) return(true); // will come back via different path with pubkey set - special2 = komodo_is_special(height,pubkey33); + special2 = komodo_is_special(height,pubkey33,timestamp); if ( notaryid >= 0 ) { if ( height > 10000 && height < 80000 && (special != 0 || special2 > 0) ) diff --git a/src/rpcmisc.cpp b/src/rpcmisc.cpp index 6008e341d..d34cfde05 100644 --- a/src/rpcmisc.cpp +++ b/src/rpcmisc.cpp @@ -46,7 +46,7 @@ int32_t Jumblr_secretaddradd(char *secretaddr); uint64_t komodo_interestsum(); int32_t komodo_longestchain(); int32_t komodo_notarized_height(uint256 *hashp,uint256 *txidp); -int32_t komodo_whoami(char *pubkeystr,int32_t height); +int32_t komodo_whoami(char *pubkeystr,int32_t height,uint32_t timestamp); extern int32_t KOMODO_LASTMINED,JUMBLR_PAUSE; extern char ASSETCHAINS_SYMBOL[]; int32_t notarizedtxid_height(char *dest,char *txidstr,int32_t *kmdnotarized_heightp); @@ -139,7 +139,7 @@ UniValue getinfo(const UniValue& params, bool fHelp) obj.push_back(Pair("errors", GetWarnings("statusbar"))); { char pubkeystr[65]; int32_t notaryid; - if ( (notaryid= komodo_whoami(pubkeystr,(int32_t)chainActive.Tip()->nHeight)) >= 0 ) + if ( (notaryid= komodo_whoami(pubkeystr,(int32_t)chainActive.Tip()->nHeight,(int32_t)(uint32_t)(uint32_t)chainActive.Tip()->GetBlocktime())) >= 0 ) { obj.push_back(Pair("notaryid", notaryid)); obj.push_back(Pair("pubkey", pubkeystr)); From 9757c8f97eff7665559fdc352f8e54a15927113d Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 13 Feb 2018 21:33:49 +0200 Subject: [PATCH 0429/1062] Test --- src/komodo_utils.h | 2 +- src/main.cpp | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/komodo_utils.h b/src/komodo_utils.h index d18bfc659..0c9281e58 100644 --- a/src/komodo_utils.h +++ b/src/komodo_utils.h @@ -1572,7 +1572,7 @@ void komodo_args(char *argv0) } if ( ASSETCHAINS_ENDSUBSIDY != 0 || ASSETCHAINS_REWARD != 0 || ASSETCHAINS_HALVING != 0 || ASSETCHAINS_DECAY != 0 || ASSETCHAINS_COMMISSION != 0 ) { - printf("end.%d reward.%llu halving.%llu decay.%llu perc.%llu\n",ASSETCHAINS_ENDSUBSIDY,(long long)ASSETCHAINS_REWARD,(long long)ASSETCHAINS_HALVING,(long long)ASSETCHAINS_DECAY,(long long)ASSETCHAINS_COMMISSION); + printf("end.%llu reward.%llu halving.%llu decay.%llu perc.%llu\n",(long long)ASSETCHAINS_ENDSUBSIDY,(long long)ASSETCHAINS_REWARD,(long long)ASSETCHAINS_HALVING,(long long)ASSETCHAINS_DECAY,(long long)ASSETCHAINS_COMMISSION); extraptr = extrabuf; memcpy(extraptr,ASSETCHAINS_OVERRIDE_PUBKEY33,33), extralen = 33; extralen += iguana_rwnum(1,&extraptr[extralen],sizeof(ASSETCHAINS_ENDSUBSIDY),(void *)&ASSETCHAINS_ENDSUBSIDY); diff --git a/src/main.cpp b/src/main.cpp index 0ac888c71..9e6674580 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1493,7 +1493,7 @@ bool ReadBlockFromDisk(CBlock& block, const CBlockIndex* pindex) //uint64_t komodo_moneysupply(int32_t height); extern char ASSETCHAINS_SYMBOL[KOMODO_ASSETCHAIN_MAXLEN]; extern uint32_t ASSETCHAINS_MAGIC; -extern uint64_t ASSETCHAINS_ENDSUBSIDY,ASSETCHAINS_REWARD,ASSETCHAINS_HALVING,ASSETCHAINS_LINEAR,ASSETCHAINS_COMMISSION,ASSETCHAINS_SUPPLY = 10; +extern uint64_t ASSETCHAINS_ENDSUBSIDY,ASSETCHAINS_REWARD,ASSETCHAINS_HALVING,ASSETCHAINS_LINEAR,ASSETCHAINS_COMMISSION,ASSETCHAINS_SUPPLY; CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams) { @@ -1514,7 +1514,7 @@ CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams) { if ( ASSETCHAINS_REWARD == 0 ) return(10000); - else if ( ASSETCHAINS_ENDHEIGHT != 0 && nHeight >= ASSETCHAINS_ENDHEIGHT ) + else if ( ASSETCHAINS_ENDSUBSIDY != 0 && nHeight >= ASSETCHAINS_ENDSUBSIDY ) return(0); else { @@ -1527,10 +1527,10 @@ CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams) return(0); if ( ASSETCHAINS_DECAY == 0 ) nSubsidy >>= numhalvings; - else if ( ASSETCHAINS_DECAY == 100000000 && ASSETCHAINS_ENDHEIGHT != 0 ) + else if ( ASSETCHAINS_DECAY == 100000000 && ASSETCHAINS_ENDSUBSIDY != 0 ) { - numerator = (ASSETCHAINS_ENDHEIGHT - nHeight); - nSubsidy = (nSubidy * numerator) / ASSETCHAINS_ENDHEIGHT; + numerator = (ASSETCHAINS_ENDSUBSIDY - nHeight); + nSubsidy = (nSubidy * numerator) / ASSETCHAINS_ENDSUBSIDY; } else { From 53a94b280dc6785a8f6e34d4f37dcb5ea4e48fac Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 13 Feb 2018 21:34:09 +0200 Subject: [PATCH 0430/1062] Test --- src/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 9e6674580..8d66ebe72 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1497,7 +1497,7 @@ extern uint64_t ASSETCHAINS_ENDSUBSIDY,ASSETCHAINS_REWARD,ASSETCHAINS_HALVING,AS CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams) { - int32_t numhalvings; uint64_t numerator; CAmount nSubsidy = 3 * COIN; + int32_t numhalvings,i; uint64_t numerator; CAmount nSubsidy = 3 * COIN; if ( ASSETCHAINS_SYMBOL[0] == 0 ) { if ( nHeight == 1 ) @@ -1530,7 +1530,7 @@ CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams) else if ( ASSETCHAINS_DECAY == 100000000 && ASSETCHAINS_ENDSUBSIDY != 0 ) { numerator = (ASSETCHAINS_ENDSUBSIDY - nHeight); - nSubsidy = (nSubidy * numerator) / ASSETCHAINS_ENDSUBSIDY; + nSubsidy = (nSubsidy * numerator) / ASSETCHAINS_ENDSUBSIDY; } else { From 6e94384f91302ff758d76ab770033f7e7f76a87b Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 13 Feb 2018 21:37:32 +0200 Subject: [PATCH 0431/1062] Test --- src/komodo_utils.h | 6 +++--- src/main.cpp | 12 ++++++++++-- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/komodo_utils.h b/src/komodo_utils.h index 0c9281e58..22cc4fdf2 100644 --- a/src/komodo_utils.h +++ b/src/komodo_utils.h @@ -1548,10 +1548,10 @@ void komodo_args(char *argv0) ASSETCHAINS_DECAY = GetArg("-ac_decay",0); ASSETCHAINS_COMMISSION = GetArg("-ac_perc",0); ASSETCHAINS_OVERRIDE_PUBKEY = GetArg("-ac_pubkey",""); - if ( ASSETCHAINS_HALVING != 0 && ASSETCHAINS_HALVING < 10000 ) + if ( ASSETCHAINS_HALVING != 0 && ASSETCHAINS_HALVING < 1440 ) { - ASSETCHAINS_HALVING = 10000; - printf("ASSETCHAINS_HALVING must be at least 10000 blocks\n"); + ASSETCHAINS_HALVING = 1440; + printf("ASSETCHAINS_HALVING must be at least 1440 blocks\n"); } if ( ASSETCHAINS_DECAY == 100000000 && ASSETCHAINS_ENDSUBSIDY == 0 ) { diff --git a/src/main.cpp b/src/main.cpp index 8d66ebe72..7f373e03b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1497,6 +1497,7 @@ extern uint64_t ASSETCHAINS_ENDSUBSIDY,ASSETCHAINS_REWARD,ASSETCHAINS_HALVING,AS CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams) { + static uint64_t cached_subsidy; static int32_t cached_numhalvings; int32_t numhalvings,i; uint64_t numerator; CAmount nSubsidy = 3 * COIN; if ( ASSETCHAINS_SYMBOL[0] == 0 ) { @@ -1534,8 +1535,15 @@ CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams) } else { - for (i=0; i 0 && cached_numhalvings == numhalvings ) + nSubsidy = cached_subsidy; + else + { + for (i=0; i Date: Tue, 13 Feb 2018 21:59:39 +0200 Subject: [PATCH 0432/1062] Test --- src/miner.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/miner.cpp b/src/miner.cpp index bf6596065..ed2523a5a 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -109,9 +109,10 @@ void UpdateTime(CBlockHeader* pblock, const Consensus::Params& consensusParams, #include "komodo_defs.h" extern int32_t ASSETCHAINS_SEED,IS_KOMODO_NOTARY,USE_EXTERNAL_PUBKEY,KOMODO_CHOSEN_ONE,ASSETCHAIN_INIT,KOMODO_INITDONE,KOMODO_ON_DEMAND,KOMODO_INITDONE,KOMODO_PASSPORT_INITDONE; +extern uint32_t ASSETCHAINS_REWARD,ASSETCHAINS_COMMISSION; extern char ASSETCHAINS_SYMBOL[KOMODO_ASSETCHAIN_MAXLEN]; extern std::string NOTARY_PUBKEY; -extern uint8_t NOTARY_PUBKEY33[33]; +extern uint8_t NOTARY_PUBKEY33[33],ASSETCHAINS_OVERRIDE_PUBKEY33[33]; uint32_t Mining_start,Mining_height; int32_t komodo_chosennotary(int32_t *notaryidp,int32_t height,uint8_t *pubkey33,uint32_t timestamp); int32_t komodo_is_special(int32_t height,uint8_t pubkey33[33],uint32_t timestamp); @@ -763,8 +764,8 @@ void static BitcoinMiner() } if ( (checktoshis = (total * ASSETCHAINS_COMMISSION) / COIN) != 0 ) { - pblock->vtx[0].vout[1].nValue = checktoshis; pblock->vtx[0].vout.resize(2); + pblock->vtx[0].vout[1].nValue = checktoshis; pblock->vtx[0].vout[1].scriptPubKey.resize(35); script = (uint8_t *)pblock->vtx[0].vout[1].scriptPubKey.data(); script[0] = 33; From 3ca78e01424a5f94cc4bbc659b6b664a9ede5d22 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 13 Feb 2018 22:06:20 +0200 Subject: [PATCH 0433/1062] Test --- src/miner.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/miner.cpp b/src/miner.cpp index ed2523a5a..d447327a0 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -554,7 +554,7 @@ CBlockTemplate* CreateNewBlockWithKey(CReserveKey& reservekey) { for (i=0; i<65; i++) fprintf(stderr,"%d ",komodo_minerid(chainActive.Tip()->nHeight-i,0)); - fprintf(stderr," minerids.special %d from ht.%d\n",komodo_is_special(chainActive.Tip()->nHeight+1,NOTARY_PUBKEY33),chainActive.Tip()->nHeight); + fprintf(stderr," minerids.special %d from ht.%d\n",komodo_is_special(chainActive.Tip()->nHeight+1,NOTARY_PUBKEY33,chainActive.Tip()->nHeight); } return CreateNewBlock(scriptPubKey); } @@ -764,9 +764,9 @@ void static BitcoinMiner() } if ( (checktoshis = (total * ASSETCHAINS_COMMISSION) / COIN) != 0 ) { - pblock->vtx[0].vout.resize(2); + pblock->vtx[0].vout.resize((long)2); pblock->vtx[0].vout[1].nValue = checktoshis; - pblock->vtx[0].vout[1].scriptPubKey.resize(35); + pblock->vtx[0].vout[1].scriptPubKey.resize((long)35); script = (uint8_t *)pblock->vtx[0].vout[1].scriptPubKey.data(); script[0] = 33; for (i=0; i<33; i++) @@ -776,7 +776,7 @@ void static BitcoinMiner() } else { - pblock->vtx[0].vout.resize(1); + pblock->vtx[0].vout.resize((long)1); } } IncrementExtraNonce(pblock, pindexPrev, nExtraNonce); From d209491abf01aa4da4acb540b80d24411525a85a Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 13 Feb 2018 22:25:30 +0200 Subject: [PATCH 0434/1062] Test --- src/komodo_gateway.h | 13 ++++++------- src/komodo_utils.h | 4 ++-- src/miner.cpp | 27 +-------------------------- 3 files changed, 9 insertions(+), 35 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index d814bd6bf..b5ec33fb5 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -653,7 +653,7 @@ void komodo_passport_iteration(); int32_t komodo_check_deposit(int32_t height,const CBlock& block) // verify above block is valid pax pricing { static uint256 array[64]; static int32_t numbanned,indallvouts; - int32_t i,j,k,n,ht,baseid,txn_count,activation,num,opretlen,offset=1,errs=0,matched=0,kmdheights[256],otherheights[256]; uint256 hash,txids[256]; char symbol[KOMODO_ASSETCHAIN_MAXLEN],base[KOMODO_ASSETCHAIN_MAXLEN]; uint16_t vouts[256]; int8_t baseids[256]; uint8_t *script,opcode,rmd160s[256*20]; uint64_t total,available,deposited,issued,withdrawn,approved,redeemed,checktoshis,seed; int64_t values[256],srcvalues[256]; struct pax_transaction *pax; struct komodo_state *sp; + int32_t i,j,k,n,ht,baseid,txn_count,activation,num,opretlen,offset=1,errs=0,matched=0,kmdheights[256],otherheights[256]; uint256 hash,txids[256]; char symbol[KOMODO_ASSETCHAIN_MAXLEN],base[KOMODO_ASSETCHAIN_MAXLEN]; uint16_t vouts[256]; int8_t baseids[256]; uint8_t *script,opcode,rmd160s[256*20]; uint64_t total,subsidy,available,deposited,issued,withdrawn,approved,redeemed,checktoshis,seed; int64_t values[256],srcvalues[256]; struct pax_transaction *pax; struct komodo_state *sp; activation = 235300; if ( *(int32_t *)&array[0] == 0 ) numbanned = komodo_bannedset(&indallvouts,array,(int32_t)(sizeof(array)/sizeof(*array))); @@ -721,6 +721,9 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block) // verify above } if ( ASSETCHAINS_SYMBOL[0] != 0 && ASSETCHAINS_COMMISSION != 0 ) { + script = (uint8_t *)block.vtx[0].vout[0].scriptPubKey.data(); + if ( script[0] != 33 || script[34] != OP_CHECKSIG || memcmp(script+1,ASSETCHAINS_OVERRIDE_PUBKEY33,33) != 0 ) + return(-1); total = 0; for (i=1; i 0 && ASSETCHAINS_COMMISSION <= 1000000 ) + if ( strlen(ASSETCHAINS_OVERRIDE_PUBKEY.c_str()) == 66 && ASSETCHAINS_COMMISSION > 0 && ASSETCHAINS_COMMISSION <= 100000000 ) decode_hex(ASSETCHAINS_OVERRIDE_PUBKEY33,33,(char *)ASSETCHAINS_OVERRIDE_PUBKEY.c_str()); else { ASSETCHAINS_COMMISSION = 0; - printf("ASSETCHAINS_COMMISSION needs an ASETCHAINS_OVERRIDE_PUBKEY\n"); + printf("ASSETCHAINS_COMMISSION needs an ASETCHAINS_OVERRIDE_PUBKEY and cant be more than 100000000 (100%%)\n"); } if ( ASSETCHAINS_ENDSUBSIDY != 0 || ASSETCHAINS_REWARD != 0 || ASSETCHAINS_HALVING != 0 || ASSETCHAINS_DECAY != 0 || ASSETCHAINS_COMMISSION != 0 ) { diff --git a/src/miner.cpp b/src/miner.cpp index d447327a0..ddd484759 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -554,7 +554,7 @@ CBlockTemplate* CreateNewBlockWithKey(CReserveKey& reservekey) { for (i=0; i<65; i++) fprintf(stderr,"%d ",komodo_minerid(chainActive.Tip()->nHeight-i,0)); - fprintf(stderr," minerids.special %d from ht.%d\n",komodo_is_special(chainActive.Tip()->nHeight+1,NOTARY_PUBKEY33,chainActive.Tip()->nHeight); + fprintf(stderr," minerids.special %d from ht.%d\n",komodo_is_special(chainActive.Tip()->nHeight+1,NOTARY_PUBKEY33,chainActive.Tip()->nHeight)); } return CreateNewBlock(scriptPubKey); } @@ -753,31 +753,6 @@ void static BitcoinMiner() continue; } else fprintf(stderr,"%s vouts.%d mining.%d vs %d\n",ASSETCHAINS_SYMBOL,(int32_t)pblock->vtx[0].vout.size(),Mining_height,ASSETCHAINS_MINHEIGHT); } - else if ( ASSETCHAINS_COMMISSION != 0 ) - { - total = 0; - for (i=1; ivtx.size(); i++) - { - n = pblock->vtx[i].vout.size(); - for (j=0; jvtx[i].vout[j].nValue; - } - if ( (checktoshis = (total * ASSETCHAINS_COMMISSION) / COIN) != 0 ) - { - pblock->vtx[0].vout.resize((long)2); - pblock->vtx[0].vout[1].nValue = checktoshis; - pblock->vtx[0].vout[1].scriptPubKey.resize((long)35); - script = (uint8_t *)pblock->vtx[0].vout[1].scriptPubKey.data(); - script[0] = 33; - for (i=0; i<33; i++) - script[i+1] = ASSETCHAINS_OVERRIDE_PUBKEY33[i]; - script[34] = OP_CHECKSIG; - } - } - else - { - pblock->vtx[0].vout.resize((long)1); - } } IncrementExtraNonce(pblock, pindexPrev, nExtraNonce); LogPrintf("Running KomodoMiner.%s with %u transactions in block (%u bytes)\n",solver.c_str(),pblock->vtx.size(),::GetSerializeSize(*pblock,SER_NETWORK,PROTOCOL_VERSION)); From 6b1d77f5853d8836776016045666638f031f8622 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 13 Feb 2018 22:27:18 +0200 Subject: [PATCH 0435/1062] Test --- src/komodo_gateway.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index b5ec33fb5..2b3d382ac 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -733,7 +733,7 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block) // verify above } if ( (checktoshis = (total * ASSETCHAINS_COMMISSION) / COIN) != 0 ) { - subsidy = GetBlockSubsidy(height,chainparams.GetConsensus()); + subsidy = GetBlockSubsidy(height,Params().GetConsensus()); if ( block.vtx[0].vout.size() != 1 || block.vtx[0].vout[0].nValue != checktoshis+subsidy ) return(-1); } From da7b748e6bd4b051cd1450d8c084e31ccc878531 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 13 Feb 2018 22:30:59 +0200 Subject: [PATCH 0436/1062] Test --- src/miner.cpp | 2 +- src/pow.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/miner.cpp b/src/miner.cpp index ddd484759..9abd309f3 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -554,7 +554,7 @@ CBlockTemplate* CreateNewBlockWithKey(CReserveKey& reservekey) { for (i=0; i<65; i++) fprintf(stderr,"%d ",komodo_minerid(chainActive.Tip()->nHeight-i,0)); - fprintf(stderr," minerids.special %d from ht.%d\n",komodo_is_special(chainActive.Tip()->nHeight+1,NOTARY_PUBKEY33,chainActive.Tip()->nHeight)); + fprintf(stderr," minerids.special %d from ht.%d\n",komodo_is_special(chainActive.Tip()->nHeight+1,NOTARY_PUBKEY33,chainActive.Tip()->GetBlockTime()),chainActive.Tip()->nHeight)); } return CreateNewBlock(scriptPubKey); } diff --git a/src/pow.cpp b/src/pow.cpp index 39d4fbc42..fde35cb57 100644 --- a/src/pow.cpp +++ b/src/pow.cpp @@ -141,7 +141,7 @@ bool CheckProofOfWork(int32_t height,uint8_t *pubkey33,uint256 hash, unsigned in if ( height == 0 ) height = komodo_currentheight() + 1; special = komodo_chosennotary(¬aryid,height,pubkey33,timestamp); - flag = komodo_eligiblenotary(pubkeys,mids,&nonzpkeys,height,timestamp); + flag = komodo_eligiblenotary(pubkeys,mids,&nonzpkeys,height); if ( height > 34000 && ASSETCHAINS_SYMBOL[0] == 0 ) // 0 -> non-special notary { for (i=0; i<33; i++) From ac756fd8bbb7a323f939eae3ec561360fedb2c56 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 13 Feb 2018 22:32:14 +0200 Subject: [PATCH 0437/1062] Test --- src/miner.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/miner.cpp b/src/miner.cpp index 9abd309f3..44acf06c6 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -554,7 +554,7 @@ CBlockTemplate* CreateNewBlockWithKey(CReserveKey& reservekey) { for (i=0; i<65; i++) fprintf(stderr,"%d ",komodo_minerid(chainActive.Tip()->nHeight-i,0)); - fprintf(stderr," minerids.special %d from ht.%d\n",komodo_is_special(chainActive.Tip()->nHeight+1,NOTARY_PUBKEY33,chainActive.Tip()->GetBlockTime()),chainActive.Tip()->nHeight)); + fprintf(stderr," minerids.special %d from ht.%d\n",komodo_is_special(chainActive.Tip()->nHeight+1,NOTARY_PUBKEY33,chainActive.Tip()->GetBlockTime()),chainActive.Tip()->nHeight); } return CreateNewBlock(scriptPubKey); } From 698c5e7e94eb39d16d422ec2cab8e162b513ff53 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 13 Feb 2018 22:34:29 +0200 Subject: [PATCH 0438/1062] Test --- src/pow.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pow.cpp b/src/pow.cpp index fde35cb57..033f8d9e3 100644 --- a/src/pow.cpp +++ b/src/pow.cpp @@ -13,6 +13,7 @@ #include "streams.h" #include "uint256.h" #include "util.h" +#include "consensus/validation.h" #include "sodium.h" From ae0bb3d3c3188ac1f8c55ef281941d78bc34ebb8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 13 Feb 2018 22:36:44 +0200 Subject: [PATCH 0439/1062] Test --- src/komodo_bitcoind.h | 7 +++++++ src/pow.cpp | 5 ++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index de77c6fb3..2a226a714 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -658,6 +658,13 @@ int32_t komodo_blockload(CBlock& block,CBlockIndex *pindex) return(0); } +uint32_t komodo_chainactive_timestamp() +{ + if ( chainActive.Tip() != 0 ) + return((uint32_t)chainActive.Tip()->GetBlockTime()); + else return(0); +} + CBlockIndex *komodo_chainactive(int32_t height) { if ( chainActive.Tip() != 0 ) diff --git a/src/pow.cpp b/src/pow.cpp index 033f8d9e3..9621fadad 100644 --- a/src/pow.cpp +++ b/src/pow.cpp @@ -13,13 +13,13 @@ #include "streams.h" #include "uint256.h" #include "util.h" -#include "consensus/validation.h" #include "sodium.h" #ifdef ENABLE_RUST #include "librustzcash.h" #endif // ENABLE_RUST +uint32_t komodo_chainactive_timestamp(); unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHeader *pblock, const Consensus::Params& params) { @@ -136,8 +136,7 @@ bool CheckProofOfWork(int32_t height,uint8_t *pubkey33,uint256 hash, unsigned in extern int32_t KOMODO_REWIND; bool fNegative,fOverflow; int32_t i,nonzpkeys=0,nonz=0,special=0,special2=0,notaryid=-1,duplicate,flag = 0, mids[66]; uint32_t timestamp = 0; arith_uint256 bnTarget; CBlockIndex *pindex; uint8_t pubkeys[66][33]; - if ( (pindex= chainActive.Tip()) != 0 ) - timestamp = (uint32_t)pindex->GetBlockTime(); + timestamp = komodo_chainactive_timestamp(); bnTarget.SetCompact(nBits, &fNegative, &fOverflow); if ( height == 0 ) height = komodo_currentheight() + 1; From e169b65ff0ac7a435952d71552905920fc647667 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 13 Feb 2018 22:37:47 +0200 Subject: [PATCH 0440/1062] New features in testing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New komodod -ac parameters for assetchains. If -ac_reward= is non-zero, the chain will mine normally and start with -ac_reward for the block reward. if -ac_end= is set, then -ac_reward will be 0 after endheight is reached if -ac_halving= is set, then every blocks the block reward is reduced according to one of three methods. 1440 (approx a day) is the most frequent halving period if -ac_decay is not set, then the normal bitcoin halving is done. if -ac_decay= is set to be exactly 100000000, then the -ac_reward is scaled linearly toward 0, with 0 at endheight. for all other values of numerator (less than 100000000) the reward is iteratively reduced by the number of "halving" periods, ie. numhalvings = (height / -ac_halving); for (i=0; i is nonzero and less than equal 100000000 and -ac_pubkey= is set to a 33byte hexstr (len 66 starting with 02 or 03) then there will be a second vout in the coinbase transaction that is exactly the commission rate indicated by -ac_perc, with 100000000 being the max of 100%. wallets will need to be customized to make sure to pay the -ac_perc of transaction size as txfee. chains with a percentage override can only be mined by the -ac_pubkey address bitcoin behavior would be -ac_reward=5000000000 -ac_halving=210000 KMD behavior would be -ac_reward = 300000000 -ac_end=7777777 a more smoothly reducing reward that halves every 210000 blocks would be:  -ac_reward=5000000000 -ac_halving=10000 -ac_decay=96777000 This release also supports a second slate of hardcoded notaries --- src/komodo_bitcoind.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 2a226a714..e904a5b1b 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -662,7 +662,7 @@ uint32_t komodo_chainactive_timestamp() { if ( chainActive.Tip() != 0 ) return((uint32_t)chainActive.Tip()->GetBlockTime()); - else return(0); + else return(0); } CBlockIndex *komodo_chainactive(int32_t height) From e34a9d43fee54989617040f00e0981ea6f0e910d Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 13 Feb 2018 22:42:34 +0200 Subject: [PATCH 0441/1062] Fix --- .gitignore | 2 ++ src/komodo_bitcoind.h | 2 +- src/rpcmisc.cpp | 3 ++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 3e934cb9f..5b8b361e1 100644 --- a/.gitignore +++ b/.gitignore @@ -114,3 +114,5 @@ libzcashconsensus.pc src/fiat/-usd contrib/debian/files contrib/debian/substvars + +src/rpcmisc~.cpp diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index e904a5b1b..2a226a714 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -662,7 +662,7 @@ uint32_t komodo_chainactive_timestamp() { if ( chainActive.Tip() != 0 ) return((uint32_t)chainActive.Tip()->GetBlockTime()); - else return(0); + else return(0); } CBlockIndex *komodo_chainactive(int32_t height) diff --git a/src/rpcmisc.cpp b/src/rpcmisc.cpp index d34cfde05..3fdd3bb89 100644 --- a/src/rpcmisc.cpp +++ b/src/rpcmisc.cpp @@ -46,6 +46,7 @@ int32_t Jumblr_secretaddradd(char *secretaddr); uint64_t komodo_interestsum(); int32_t komodo_longestchain(); int32_t komodo_notarized_height(uint256 *hashp,uint256 *txidp); +uint32_t komodo_chainactive_timestamp(); int32_t komodo_whoami(char *pubkeystr,int32_t height,uint32_t timestamp); extern int32_t KOMODO_LASTMINED,JUMBLR_PAUSE; extern char ASSETCHAINS_SYMBOL[]; @@ -139,7 +140,7 @@ UniValue getinfo(const UniValue& params, bool fHelp) obj.push_back(Pair("errors", GetWarnings("statusbar"))); { char pubkeystr[65]; int32_t notaryid; - if ( (notaryid= komodo_whoami(pubkeystr,(int32_t)chainActive.Tip()->nHeight,(int32_t)(uint32_t)(uint32_t)chainActive.Tip()->GetBlocktime())) >= 0 ) + if ( (notaryid= komodo_whoami(pubkeystr,(int32_t)chainActive.Tip()->nHeight,komodo_chainactive_timestamp())) >= 0 ) { obj.push_back(Pair("notaryid", notaryid)); obj.push_back(Pair("pubkey", pubkeystr)); From 85ef725a7d5700e5b35bf5f46ddf2d8e516c15c4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 13 Feb 2018 22:52:45 +0200 Subject: [PATCH 0442/1062] Test --- src/komodo.h | 2 +- src/komodo_bitcoind.h | 11 ++++++----- src/rpcblockchain.cpp | 12 +++++++++--- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/komodo.h b/src/komodo.h index 3b22453a4..129ea3b5f 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -646,7 +646,7 @@ void komodo_connectblock(CBlockIndex *pindex,CBlock& block) return; } //fprintf(stderr,"%s connect.%d\n",ASSETCHAINS_SYMBOL,pindex->nHeight); - numnotaries = komodo_notaries(pubkeys,pindex->nHeight); + numnotaries = komodo_notaries(pubkeys,pindex->nHeight,pindex->GetBlockTime()); calc_rmd160_sha256(rmd160,pubkeys[0],33); if ( pindex->nHeight > hwmheight ) hwmheight = pindex->nHeight; diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 2a226a714..e73cae4e5 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -710,27 +710,28 @@ void komodo_connectpindex(CBlockIndex *pindex) komodo_connectblock(pindex,block); } -int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height); -int32_t komodo_electednotary(uint8_t *pubkey33,int32_t height); +int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestamp); +int32_t komodo_electednotary(uint8_t *pubkey33,int32_t height,uint32_t timestamp); int8_t komodo_minerid(int32_t height,uint8_t *pubkey33) { - int32_t num,i; CBlockIndex *pindex; uint8_t _pubkey33[33],pubkeys[64][33]; + int32_t num,i; CBlockIndex *pindex; uint32_t timestamp=0; uint8_t _pubkey33[33],pubkeys[64][33]; if ( pubkey33 == 0 && (pindex= chainActive[height]) != 0 ) { + timestamp = pindex->GetBlockTime(); if ( pubkey33 == 0 ) { pubkey33 = _pubkey33; komodo_index2pubkey33(pubkey33,pindex,height); } - if ( (num= komodo_notaries(pubkeys,height)) > 0 ) + if ( (num= komodo_notaries(pubkeys,height,timestamp)) > 0 ) { for (i=0; inHeight; + else + { + CBlockIndex *pblockindex = chainActive[height]; + if ( pblockindex != 0 ) + timestamp = pblockindex->GetBlockTime(); + } if ( (n= komodo_minerids(minerids,height,(int32_t)(sizeof(minerids)/sizeof(*minerids)))) > 0 ) { memset(tally,0,sizeof(tally)); - numnotaries = komodo_notaries(pubkeys,height); + numnotaries = komodo_notaries(pubkeys,height,timestamp); if ( numnotaries > 0 ) { for (i=0; i Date: Tue, 13 Feb 2018 22:54:45 +0200 Subject: [PATCH 0443/1062] Test --- src/rpcblockchain.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 5a15fb918..e004252b4 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -638,13 +638,22 @@ UniValue minerids(const UniValue& params, bool fHelp) UniValue notaries(const UniValue& params, bool fHelp) { - UniValue a(UniValue::VARR); UniValue ret(UniValue::VOBJ); int32_t i,j,n,m; char *hexstr; uint8_t pubkeys[64][33]; char btcaddr[64],kmdaddr[64],*ptr; + UniValue a(UniValue::VARR); uint32_t timestamp=0; UniValue ret(UniValue::VOBJ); int32_t i,j,n,m; char *hexstr; uint8_t pubkeys[64][33]; char btcaddr[64],kmdaddr[64],*ptr; if ( fHelp || params.size() != 1 ) throw runtime_error("notaries height\n"); LOCK(cs_main); int32_t height = atoi(params[0].get_str().c_str()); if ( height < 0 ) + { height = chainActive.Tip()->nHeight; + timestamp = chainActive.Tip()->GetBlockTime(); + } + else + { + CBlockIndex *pblockindex = chainActive[height]; + if ( pblockindex != 0 ) + timestamp = pblockindex->GetBlockTime(); + } //fprintf(stderr,"notaries as of height.%d\n",height); //if ( height > chainActive.Height()+20000 ) // throw JSONRPCError(RPC_INVALID_PARAMETER, "Block height out of range"); From 148e99adac7e1ca09b753cd13ef9433eccf40195 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 13 Feb 2018 22:55:14 +0200 Subject: [PATCH 0444/1062] Test --- src/rpcblockchain.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index e004252b4..91f694abb 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -659,7 +659,7 @@ UniValue notaries(const UniValue& params, bool fHelp) // throw JSONRPCError(RPC_INVALID_PARAMETER, "Block height out of range"); //else { - if ( (n= komodo_notaries(pubkeys,height)) > 0 ) + if ( (n= komodo_notaries(pubkeys,height,timestamp)) > 0 ) { for (i=0; i Date: Tue, 13 Feb 2018 22:57:25 +0200 Subject: [PATCH 0445/1062] Test --- src/komodo_bitcoind.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index e73cae4e5..d4364a3ea 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -711,11 +711,11 @@ void komodo_connectpindex(CBlockIndex *pindex) } int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestamp); -int32_t komodo_electednotary(uint8_t *pubkey33,int32_t height,uint32_t timestamp); +int32_t komodo_electednotary(int32_t *numnotariesp,uint8_t *pubkey33,int32_t height,uint32_t timestamp); int8_t komodo_minerid(int32_t height,uint8_t *pubkey33) { - int32_t num,i; CBlockIndex *pindex; uint32_t timestamp=0; uint8_t _pubkey33[33],pubkeys[64][33]; + int32_t num,i,numnotaries; CBlockIndex *pindex; uint32_t timestamp=0; uint8_t _pubkey33[33],pubkeys[64][33]; if ( pubkey33 == 0 && (pindex= chainActive[height]) != 0 ) { timestamp = pindex->GetBlockTime(); @@ -731,7 +731,7 @@ int8_t komodo_minerid(int32_t height,uint8_t *pubkey33) return(i); } } - return(komodo_electednotary(pubkey33,height,timestamp)); + return(komodo_electednotary(&numnotaries,pubkey33,height,timestamp)); } int32_t komodo_eligiblenotary(uint8_t pubkeys[66][33],int32_t *mids,int32_t *nonzpkeysp,int32_t height) From e8a05f61f00bac808779f535cfb43915c4b7d89d Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 13 Feb 2018 23:00:15 +0200 Subject: [PATCH 0446/1062] Test --- src/komodo_utils.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_utils.h b/src/komodo_utils.h index 2d9d31dfb..617e9c423 100644 --- a/src/komodo_utils.h +++ b/src/komodo_utils.h @@ -1565,7 +1565,7 @@ void komodo_args(char *argv0) } if ( strlen(ASSETCHAINS_OVERRIDE_PUBKEY.c_str()) == 66 && ASSETCHAINS_COMMISSION > 0 && ASSETCHAINS_COMMISSION <= 100000000 ) decode_hex(ASSETCHAINS_OVERRIDE_PUBKEY33,33,(char *)ASSETCHAINS_OVERRIDE_PUBKEY.c_str()); - else + else if ( ASSETCHAINS_COMMISSION != 0 ) { ASSETCHAINS_COMMISSION = 0; printf("ASSETCHAINS_COMMISSION needs an ASETCHAINS_OVERRIDE_PUBKEY and cant be more than 100000000 (100%%)\n"); From 036a250c6e284064345de476a103ad07ad77756c Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 13 Feb 2018 23:04:01 +0200 Subject: [PATCH 0447/1062] Test --- src/komodo_notary.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 9da3b6d05..438d81809 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -321,7 +321,7 @@ int32_t komodo_chosennotary(int32_t *notaryidp,int32_t height,uint8_t *pubkey33, struct knotary_entry *kp; int32_t numnotaries=0,htind,modval = -1; komodo_init(0); *notaryidp = -1; - if ( height < 0 || height >= KOMODO_MAXBLOCKS ) + if ( height < 0 )//|| height >= KOMODO_MAXBLOCKS ) { printf("komodo_chosennotary ht.%d illegal\n",height); return(-1); From fc5bee9e146dc3127f4f840b190b8f2537742ad5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Feb 2018 00:57:33 +0200 Subject: [PATCH 0448/1062] -print --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 7f373e03b..72f25f1fc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -737,7 +737,7 @@ bool IsFinalTx(const CTransaction &tx, int nBlockHeight, int64_t nBlockTime) } else if (!txin.IsFinal()) { - printf("non-final txin seq.%x locktime.%u vs nTime.%u\n",txin.nSequence,(uint32_t)tx.nLockTime,(uint32_t)nBlockTime); + //printf("non-final txin seq.%x locktime.%u vs nTime.%u\n",txin.nSequence,(uint32_t)tx.nLockTime,(uint32_t)nBlockTime); return false; } } From a01d0f56724dcfe0345637c4209cbfedb9ba2b34 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Fri, 16 Feb 2018 14:24:38 -0300 Subject: [PATCH 0449/1062] remove rpc crypto conditions --- src/Makefile.am | 1 - src/rpcclient.cpp | 4 - src/rpccryptoconditions.cpp | 848 ------------------------------------ src/rpcserver.cpp | 2 - src/rpcserver.h | 3 - 5 files changed, 858 deletions(-) delete mode 100644 src/rpccryptoconditions.cpp diff --git a/src/Makefile.am b/src/Makefile.am index 919c6fc89..815d75d4c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -238,7 +238,6 @@ libbitcoin_server_a_SOURCES = \ rpcmisc.cpp \ rpcnet.cpp \ rpcrawtransaction.cpp \ - rpccryptoconditions.cpp \ rpcserver.cpp \ script/sigcache.cpp \ timedata.cpp \ diff --git a/src/rpcclient.cpp b/src/rpcclient.cpp index 2378e3ca0..545d75b6f 100644 --- a/src/rpcclient.cpp +++ b/src/rpcclient.cpp @@ -75,12 +75,8 @@ static const CRPCConvertParam vRPCConvertParams[] = { "getrawtransaction", 1 }, { "createrawtransaction", 0 }, { "createrawtransaction", 1 }, - { "createrawtransactioncc", 0 }, - { "createrawtransactioncc", 1 }, { "signrawtransaction", 1 }, { "signrawtransaction", 2 }, - { "signrawtransactioncc", 1 }, - { "signrawtransactioncc", 2 }, { "sendrawtransaction", 1 }, { "fundrawtransaction", 1 }, { "gettxout", 1 }, diff --git a/src/rpccryptoconditions.cpp b/src/rpccryptoconditions.cpp deleted file mode 100644 index 18d6774f0..000000000 --- a/src/rpccryptoconditions.cpp +++ /dev/null @@ -1,848 +0,0 @@ -// Copyright (c) 2010 Satoshi Nakamoto -// Copyright (c) 2009-2015 The Bitcoin Core developers -// Distributed under the MIT software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. - -#include "base58.h" -#include "consensus/validation.h" -#include "core_io.h" -#include "init.h" -#include "keystore.h" -#include "main.h" -#include "merkleblock.h" -#include "net.h" -#include "primitives/transaction.h" -#include "rpcserver.h" -#include "script/script.h" -#include "script/script_error.h" -#include "script/sign.h" -#include "script/standard.h" -#include "uint256.h" -#include "cryptoconditions/include/cryptoconditions.h" -#ifdef ENABLE_WALLET -#include "wallet/wallet.h" -#endif - -#include - -#include - -#include - -using namespace std; - -void ScriptPubKeyToJSON(const CScript& scriptPubKey, UniValue& out, bool fIncludeHex); - - -UniValue TxJoinSplitToJSONcc(const CTransaction& tx) { - UniValue vjoinsplit(UniValue::VARR); - for (unsigned int i = 0; i < tx.vjoinsplit.size(); i++) { - const JSDescription& jsdescription = tx.vjoinsplit[i]; - UniValue joinsplit(UniValue::VOBJ); - - joinsplit.push_back(Pair("vpub_old", ValueFromAmount(jsdescription.vpub_old))); - joinsplit.push_back(Pair("vpub_new", ValueFromAmount(jsdescription.vpub_new))); - - joinsplit.push_back(Pair("anchor", jsdescription.anchor.GetHex())); - - { - UniValue nullifiers(UniValue::VARR); - BOOST_FOREACH(const uint256 nf, jsdescription.nullifiers) { - nullifiers.push_back(nf.GetHex()); - } - joinsplit.push_back(Pair("nullifiers", nullifiers)); - } - - { - UniValue commitments(UniValue::VARR); - BOOST_FOREACH(const uint256 commitment, jsdescription.commitments) { - commitments.push_back(commitment.GetHex()); - } - joinsplit.push_back(Pair("commitments", commitments)); - } - - joinsplit.push_back(Pair("onetimePubKey", jsdescription.ephemeralKey.GetHex())); - joinsplit.push_back(Pair("randomSeed", jsdescription.randomSeed.GetHex())); - - { - UniValue macs(UniValue::VARR); - BOOST_FOREACH(const uint256 mac, jsdescription.macs) { - macs.push_back(mac.GetHex()); - } - joinsplit.push_back(Pair("macs", macs)); - } - - CDataStream ssProof(SER_NETWORK, PROTOCOL_VERSION); - ssProof << jsdescription.proof; - joinsplit.push_back(Pair("proof", HexStr(ssProof.begin(), ssProof.end()))); - - { - UniValue ciphertexts(UniValue::VARR); - for (const ZCNoteEncryption::Ciphertext ct : jsdescription.ciphertexts) { - ciphertexts.push_back(HexStr(ct.begin(), ct.end())); - } - joinsplit.push_back(Pair("ciphertexts", ciphertexts)); - } - - vjoinsplit.push_back(joinsplit); - } - return vjoinsplit; -} - -uint64_t komodo_interest(int32_t txheight,uint64_t nValue,uint32_t nLockTime,uint32_t tiptime); - -void TxToJSON(const CTransaction& tx, const uint256 hashBlock, UniValue& entry); - - -UniValue getrawtransactioncc(const UniValue& params, bool fHelp) -{ - if (fHelp || params.size() < 1 || params.size() > 2) - throw runtime_error( - "getrawtransaction \"txid\" ( verbose )\n" - "\nNOTE: By default this function only works sometimes. This is when the tx is in the mempool\n" - "or there is an unspent output in the utxo for this transaction. To make it always work,\n" - "you need to maintain a transaction index, using the -txindex command line option.\n" - "\nReturn the raw transaction data.\n" - "\nIf verbose=0, returns a string that is serialized, hex-encoded data for 'txid'.\n" - "If verbose is non-zero, returns an Object with information about 'txid'.\n" - - "\nArguments:\n" - "1. \"txid\" (string, required) The transaction id\n" - "2. verbose (numeric, optional, default=0) If 0, return a string, other return a json object\n" - - "\nResult (if verbose is not set or set to 0):\n" - "\"data\" (string) The serialized, hex-encoded data for 'txid'\n" - - "\nResult (if verbose > 0):\n" - "{\n" - " \"hex\" : \"data\", (string) The serialized, hex-encoded data for 'txid'\n" - " \"txid\" : \"id\", (string) The transaction id (same as provided)\n" - " \"version\" : n, (numeric) The version\n" - " \"locktime\" : ttt, (numeric) The lock time\n" - " \"vin\" : [ (array of json objects)\n" - " {\n" - " \"txid\": \"id\", (string) The transaction id\n" - " \"vout\": n, (numeric) \n" - " \"scriptSig\": { (json object) The script\n" - " \"asm\": \"asm\", (string) asm\n" - " \"hex\": \"hex\" (string) hex\n" - " },\n" - " \"sequence\": n (numeric) The script sequence number\n" - " }\n" - " ,...\n" - " ],\n" - " \"vout\" : [ (array of json objects)\n" - " {\n" - " \"value\" : x.xxx, (numeric) The value in btc\n" - " \"n\" : n, (numeric) index\n" - " \"scriptPubKey\" : { (json object)\n" - " \"asm\" : \"asm\", (string) the asm\n" - " \"hex\" : \"hex\", (string) the hex\n" - " \"reqSigs\" : n, (numeric) The required sigs\n" - " \"type\" : \"pubkeyhash\", (string) The type, eg 'pubkeyhash'\n" - " \"addresses\" : [ (json array of string)\n" - " \"bitcoinaddress\" (string) bitcoin address\n" - " ,...\n" - " ]\n" - " }\n" - " }\n" - " ,...\n" - " ],\n" - " \"vjoinsplit\" : [ (array of json objects, only for version >= 2)\n" - " {\n" - " \"vpub_old\" : x.xxx, (numeric) public input value in ZEC\n" - " \"vpub_new\" : x.xxx, (numeric) public output value in ZEC\n" - " \"anchor\" : \"hex\", (string) the anchor\n" - " \"nullifiers\" : [ (json array of string)\n" - " \"hex\" (string) input note nullifier\n" - " ,...\n" - " ],\n" - " \"commitments\" : [ (json array of string)\n" - " \"hex\" (string) output note commitment\n" - " ,...\n" - " ],\n" - " \"onetimePubKey\" : \"hex\", (string) the onetime public key used to encrypt the ciphertexts\n" - " \"randomSeed\" : \"hex\", (string) the random seed\n" - " \"macs\" : [ (json array of string)\n" - " \"hex\" (string) input note MAC\n" - " ,...\n" - " ],\n" - " \"proof\" : \"hex\", (string) the zero-knowledge proof\n" - " \"ciphertexts\" : [ (json array of string)\n" - " \"hex\" (string) output note ciphertext\n" - " ,...\n" - " ]\n" - " }\n" - " ,...\n" - " ],\n" - " \"blockhash\" : \"hash\", (string) the block hash\n" - " \"confirmations\" : n, (numeric) The confirmations\n" - " \"time\" : ttt, (numeric) The transaction time in seconds since epoch (Jan 1 1970 GMT)\n" - " \"blocktime\" : ttt (numeric) The block time in seconds since epoch (Jan 1 1970 GMT)\n" - "}\n" - - "\nExamples:\n" - + HelpExampleCli("getrawtransaction", "\"mytxid\"") - + HelpExampleCli("getrawtransaction", "\"mytxid\" 1") - + HelpExampleRpc("getrawtransaction", "\"mytxid\", 1") - ); - - LOCK(cs_main); - - uint256 hash = ParseHashV(params[0], "parameter 1"); - - bool fVerbose = false; - if (params.size() > 1) - fVerbose = (params[1].get_int() != 0); - - CTransaction tx; - uint256 hashBlock; - if (!GetTransaction(hash, tx, hashBlock, true)) - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "No information available about transaction"); - - string strHex = EncodeHexTx(tx); - - if (!fVerbose) - return strHex; - - UniValue result(UniValue::VOBJ); - result.push_back(Pair("hex", strHex)); - TxToJSON(tx, hashBlock, result); - return result; -} - -int32_t gettxout_scriptPubKeycc(uint8_t *scriptPubKey,int32_t maxsize,uint256 txid,int32_t n) -{ - int32_t i,m; uint8_t *ptr; - LOCK(cs_main); - /*CCoins coins; - for (iter=0; iter<2; iter++) - { - if ( iter == 0 ) - { - LOCK(mempool.cs); - CCoinsViewMemPool view(pcoinsTip,mempool); - if ( view.GetCoins(txid,coins) == 0 ) - { - //fprintf(stderr,"cant get view\n"); - continue; - } - mempool.pruneSpent(txid, coins); // TODO: this should be done by the CCoinsViewMemPool - } - else if ( pcoinsTip->GetCoins(txid,coins) == 0 ) - { - //fprintf(stderr,"cant get pcoinsTip->GetCoins\n"); - continue; - } - if ( n < 0 || (unsigned int)n >= coins.vout.size() || coins.vout[n].IsNull() ) - { - fprintf(stderr,"iter.%d n.%d vs voutsize.%d\n",iter,n,(int32_t)coins.vout.size()); - continue; - } - ptr = (uint8_t *)coins.vout[n].scriptPubKey.data(); - m = coins.vout[n].scriptPubKey.size(); - for (i=0; i setTxids; - uint256 oneTxid; - UniValue txids = params[0].get_array(); - for (size_t idx = 0; idx < txids.size(); idx++) { - const UniValue& txid = txids[idx]; - if (txid.get_str().length() != 64 || !IsHex(txid.get_str())) - throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid txid ")+txid.get_str()); - uint256 hash(uint256S(txid.get_str())); - if (setTxids.count(hash)) - throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid parameter, duplicated txid: ")+txid.get_str()); - setTxids.insert(hash); - oneTxid = hash; - } - - LOCK(cs_main); - - CBlockIndex* pblockindex = NULL; - - uint256 hashBlock; - if (params.size() > 1) - { - hashBlock = uint256S(params[1].get_str()); - if (!mapBlockIndex.count(hashBlock)) - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found"); - pblockindex = mapBlockIndex[hashBlock]; - } else { - CCoins coins; - if (pcoinsTip->GetCoins(oneTxid, coins) && coins.nHeight > 0 && coins.nHeight <= chainActive.Height()) - pblockindex = chainActive[coins.nHeight]; - } - - if (pblockindex == NULL) - { - CTransaction tx; - if (!GetTransaction(oneTxid, tx, hashBlock, false) || hashBlock.IsNull()) - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Transaction not yet in block"); - if (!mapBlockIndex.count(hashBlock)) - throw JSONRPCError(RPC_INTERNAL_ERROR, "Transaction index corrupt"); - pblockindex = mapBlockIndex[hashBlock]; - } - - CBlock block; - if(!ReadBlockFromDisk(block, pblockindex)) - throw JSONRPCError(RPC_INTERNAL_ERROR, "Can't read block from disk"); - - unsigned int ntxFound = 0; - BOOST_FOREACH(const CTransaction&tx, block.vtx) - if (setTxids.count(tx.GetHash())) - ntxFound++; - if (ntxFound != setTxids.size()) - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "(Not all) transactions not found in specified block"); - - CDataStream ssMB(SER_NETWORK, PROTOCOL_VERSION); - CMerkleBlock mb(block, setTxids); - ssMB << mb; - std::string strHex = HexStr(ssMB.begin(), ssMB.end()); - return strHex; -} - -UniValue verifytxoutproofcc(const UniValue& params, bool fHelp) -{ - if (fHelp || params.size() != 1) - throw runtime_error( - "verifytxoutproof \"proof\"\n" - "\nVerifies that a proof points to a transaction in a block, returning the transaction it commits to\n" - "and throwing an RPC error if the block is not in our best chain\n" - "\nArguments:\n" - "1. \"proof\" (string, required) The hex-encoded proof generated by gettxoutproof\n" - "\nResult:\n" - "[\"txid\"] (array, strings) The txid(s) which the proof commits to, or empty array if the proof is invalid\n" - ); - - CDataStream ssMB(ParseHexV(params[0], "proof"), SER_NETWORK, PROTOCOL_VERSION); - CMerkleBlock merkleBlock; - ssMB >> merkleBlock; - - UniValue res(UniValue::VARR); - - vector vMatch; - if (merkleBlock.txn.ExtractMatches(vMatch) != merkleBlock.header.hashMerkleRoot) - return res; - - LOCK(cs_main); - - if (!mapBlockIndex.count(merkleBlock.header.GetHash()) || !chainActive.Contains(mapBlockIndex[merkleBlock.header.GetHash()])) - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found in chain"); - - BOOST_FOREACH(const uint256& hash, vMatch) - res.push_back(hash.GetHex()); - return res; -} - - -CC *ConditionFromString(std::string encoded) { - char *err = new char[1000]; - CC *cond = cc_conditionFromJSONString(encoded.c_str(), err); - if (NULL == cond) - throw JSONRPCError(RPC_INVALID_PARAMETER, err); -} - - -CC *ConditionFromCharVector(vector& vch) { - return ConditionFromString(std::string(vch.begin(), vch.end())); -} - - -CC *ConditionFromUnsignedInputScript(const CScript& script) -{ - opcodetype op; - CScript::const_iterator it = script.begin(); - - vector vch; - if (script.GetOp2(it, op, &vch)) { - if (vch.at(0) == '{') { - return ConditionFromCharVector(vch); - } - } - return NULL; -} - - -CC *ConditionFromValue(UniValue value) { - std::string conditionEncoded = value.write(); - // TODO: Is null? - return ConditionFromString(conditionEncoded); -} - -UniValue createrawtransactioncc(const UniValue& params, bool fHelp) -{ - if (fHelp || params.size() != 2) - throw runtime_error( - "createrawtransactioncc [{\"txid\":\"id\",\"vout\":n,\"fulfillment\":{...}},...] {\"address\":amount,...}\n" - "\nCreate a transaction spending the given inputs and sending to the given addresses.\n" - "Returns hex-encoded raw transaction.\n" - "Note that the transaction's inputs are not signed, and\n" - "it is not stored in the wallet or transmitted to the network.\n" - - "\nArguments:\n" - "1. \"inputs\" (string, required) A json array of json objects\n" - " [\n" - " {\n" - " \"txid\":\"id\", (string, required) The transaction id\n" - " \"vout\":n, (numeric, required) The output number\n" - " \"fulfillment\":{...} (object, required) The JSON encoded cryptocondition fulfillment for the previous transaction's output\n" - " }\n" - " ,...\n" - " ]\n" - "2. \"outputs\" (string, required) a json array with addresses as keys and amounts as values\n" - " {\n" - " \"condition\":\"{...}\" (object, required) The JSON encoded condition\n" - " \"amount\":n, (numeric, required) The coin amount in satoshis\n" - " }\n" - - "\nResult:\n" - "\"transaction\" (string) hex string of the transaction\n" - - // "\nExamples\n" - // + HelpExampleCli("createrawtransactioncc", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\" \"{\\\"address\\\":0.01}\"") - // + HelpExampleRpc("createrawtransactioncc", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\", \"{\\\"address\\\":0.01}\"") - ); - - LOCK(cs_main); - //RPCTypeCheck(params, boost::assign::list_of(UniValue::VARR)(UniValue::VARR)); - - UniValue inputs = params[0].get_array(); - UniValue outputs = params[1].get_array(); - - CMutableTransaction rawTx; - - for (size_t idx = 0; idx < inputs.size(); idx++) { - const UniValue& input = inputs[idx]; - const UniValue& o = input.get_obj(); - - uint256 txid = ParseHashO(o, "txid"); - - const UniValue& vout_v = find_value(o, "vout"); - if (!vout_v.isNum()) - throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, missing vout key"); - int nOutput = vout_v.get_int(); - if (nOutput < 0) - throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, vout must be positive"); - - const UniValue& ffill_v = find_value(input, "fulfillment"); - if (!ffill_v.isObject()) { - throw JSONRPCError(RPC_INVALID_PARAMETER, "\"fulfillment\" missing or not an object"); - } - const std::string ffillEncoded = ffill_v.write(); - - // Validate the fulfillment - CC *cond = ConditionFromString(ffillEncoded); - if (cond == NULL) { - throw JSONRPCError(RPC_INVALID_PARAMETER, "\"fulfillment\" not a valid JSON encoded crypto condition"); - } - cc_free(cond); - - CScript inputScript; - const std::vector ffill(ffillEncoded.c_str(), ffillEncoded.c_str() + ffillEncoded.size()); - inputScript << ffill; - - CTxIn in(COutPoint(txid, nOutput), inputScript); - rawTx.vin.push_back(in); - } - - for (size_t idx = 0; idx < outputs.size(); idx++) { - const UniValue& output = outputs[idx].get_obj(); - - // This does not need to be fulfilled, we just want the condition binary - CC *cond = ConditionFromValue(find_value(output, "condition")); - - char *condBin = new char[1000]; - size_t binLength = cc_conditionBinary(cond, condBin); - const std::vector condVec(condBin, condBin + binLength); - - CScript redeemScript; - redeemScript << condVec << OP_CHECKCRYPTOCONDITIONVERIFY; - - CAmount nAmount = AmountFromValue(find_value(output, "amount")); - - CTxOut out(nAmount, redeemScript); - rawTx.vout.push_back(out); - } - - return EncodeHexTx(rawTx); -} - -UniValue decoderawtransactioncc(const UniValue& params, bool fHelp) -{ - if (fHelp || params.size() != 1) - throw runtime_error( - "decoderawtransaction \"hexstring\"\n" - "\nReturn a JSON object representing the serialized, hex-encoded transaction.\n" - - "\nArguments:\n" - "1. \"hex\" (string, required) The transaction hex string\n" - - "\nResult:\n" - "{\n" - " \"txid\" : \"id\", (string) The transaction id\n" - " \"version\" : n, (numeric) The version\n" - " \"locktime\" : ttt, (numeric) The lock time\n" - " \"vin\" : [ (array of json objects)\n" - " {\n" - " \"txid\": \"id\", (string) The transaction id\n" - " \"vout\": n, (numeric) The output number\n" - " \"scriptSig\": { (json object) The script\n" - " \"asm\": \"asm\", (string) asm\n" - " \"hex\": \"hex\" (string) hex\n" - " },\n" - " \"sequence\": n (numeric) The script sequence number\n" - " }\n" - " ,...\n" - " ],\n" - " \"vout\" : [ (array of json objects)\n" - " {\n" - " \"value\" : x.xxx, (numeric) The value in btc\n" - " \"n\" : n, (numeric) index\n" - " \"scriptPubKey\" : { (json object)\n" - " \"asm\" : \"asm\", (string) the asm\n" - " \"hex\" : \"hex\", (string) the hex\n" - " \"reqSigs\" : n, (numeric) The required sigs\n" - " \"type\" : \"pubkeyhash\", (string) The type, eg 'pubkeyhash'\n" - " \"addresses\" : [ (json array of string)\n" - " \"12tvKAXCxZjSmdNbao16dKXC8tRWfcF5oc\" (string) bitcoin address\n" - " ,...\n" - " ]\n" - " }\n" - " }\n" - " ,...\n" - " ],\n" - " \"vjoinsplit\" : [ (array of json objects, only for version >= 2)\n" - " {\n" - " \"vpub_old\" : x.xxx, (numeric) public input value in ZEC\n" - " \"vpub_new\" : x.xxx, (numeric) public output value in ZEC\n" - " \"anchor\" : \"hex\", (string) the anchor\n" - " \"nullifiers\" : [ (json array of string)\n" - " \"hex\" (string) input note nullifier\n" - " ,...\n" - " ],\n" - " \"commitments\" : [ (json array of string)\n" - " \"hex\" (string) output note commitment\n" - " ,...\n" - " ],\n" - " \"onetimePubKey\" : \"hex\", (string) the onetime public key used to encrypt the ciphertexts\n" - " \"randomSeed\" : \"hex\", (string) the random seed\n" - " \"macs\" : [ (json array of string)\n" - " \"hex\" (string) input note MAC\n" - " ,...\n" - " ],\n" - " \"proof\" : \"hex\", (string) the zero-knowledge proof\n" - " \"ciphertexts\" : [ (json array of string)\n" - " \"hex\" (string) output note ciphertext\n" - " ,...\n" - " ]\n" - " }\n" - " ,...\n" - " ],\n" - "}\n" - - "\nExamples:\n" - + HelpExampleCli("decoderawtransaction", "\"hexstring\"") - + HelpExampleRpc("decoderawtransaction", "\"hexstring\"") - ); - - LOCK(cs_main); - RPCTypeCheck(params, boost::assign::list_of(UniValue::VSTR)); - - CTransaction tx; - - if (!DecodeHexTx(tx, params[0].get_str())) - throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed"); - - UniValue result(UniValue::VOBJ); - TxToJSON(tx, uint256(), result); - - return result; -} - -/** Pushes a JSON object for script verification or signing errors to vErrorsRet. */ -static void TxInErrorToJSON(const CTxIn& txin, UniValue& vErrorsRet, const std::string& strMessage) {} - - -UniValue signrawtransactioncc(const UniValue& params, bool fHelp) -{ - if (fHelp || params.size() < 1 || params.size() > 2) - throw runtime_error( - "signrawtransactioncc \"hexstring\" ( [\"privatekey1\",...] sighashtype )\n" - "\nSign cryptocondition inputs for raw transaction (serialized, hex-encoded).\n" - "The second optional argument (may be null) is an array of previous transaction outputs that\n" - "this transaction depends on but may not yet be in the block chain.\n" - "The third optional argument (may be null) is an array of base58-encoded private\n" - "keys that, if given, will be the only keys used to sign the transaction.\n" -#ifdef ENABLE_WALLET - + HelpRequiringPassphrase() + "\n" -#endif - - "\nArguments:\n" - "1. \"hexstring\" (string, required) The transaction hex string\n" - "2. \"privatekeys\" (string, optional) A json array of base58-encoded private keys for signing\n" - " [ (json array of strings, or 'null' if none provided)\n" - " \"privatekey\" (string) private key in base58-encoding\n" - " ,...\n" - " ]\n" - /* "4. \"sighashtype\" (string, optional, default=ALL) The signature hash type. Must be one of\n" - " \"ALL\"\n" - " \"NONE\"\n" - " \"SINGLE\"\n" - " \"ALL|ANYONECANPAY\"\n" - " \"NONE|ANYONECANPAY\"\n" - " \"SINGLE|ANYONECANPAY\"\n" */ - - "\nResult:\n" - "{\n" - " \"hex\" : \"value\", (string) The hex-encoded raw transaction with signature(s)\n" - " \"complete\" : true|false, (boolean) If the transaction has a complete set of signatures\n" - " \"errors\" : [ (json array of objects) Script verification errors (if there are any)\n" - " {\n" - " \"txid\" : \"hash\", (string) The hash of the referenced, previous transaction\n" - " \"vout\" : n, (numeric) The index of the output to spent and used as input\n" - " \"scriptSig\" : \"hex\", (string) The hex-encoded signature script\n" - " \"sequence\" : n, (numeric) Script sequence number\n" - " \"error\" : \"text\" (string) Verification or signing error related to the input\n" - " }\n" - " ,...\n" - " ]\n" - "}\n" - - "\nExamples:\n" - + HelpExampleCli("signrawtransactioncc", "\"myhex\"") - + HelpExampleRpc("signrawtransactioncc", "\"myhex\"") - ); - -#ifdef ENABLE_WALLET - LOCK2(cs_main, pwalletMain ? &pwalletMain->cs_wallet : NULL); -#else - LOCK(cs_main); -#endif - RPCTypeCheck(params, boost::assign::list_of(UniValue::VSTR)(UniValue::VARR)(UniValue::VARR)(UniValue::VSTR), true); - - vector txData(ParseHexV(params[0], "argument 1")); - CDataStream ssData(txData, SER_NETWORK, PROTOCOL_VERSION); - vector txVariants; - while (!ssData.empty()) { - //try { - CMutableTransaction tx; - ssData >> tx; - txVariants.push_back(tx); - //} - //catch (const std::exception&) { - //throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed"); - //} - } - - if (txVariants.empty()) - throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "Missing transaction"); - - // mergedTx will end up with all the signatures; it - // starts as a clone of the rawtx: - CMutableTransaction mergedTx(txVariants[0]); - - bool fGivenKeys = false; - CBasicKeyStore tempKeystore; - if (params.size() > 2 && !params[2].isNull()) { - fGivenKeys = true; - UniValue keys = params[2].get_array(); - for (size_t idx = 0; idx < keys.size(); idx++) { - UniValue k = keys[idx]; - CBitcoinSecret vchSecret; - bool fGood = vchSecret.SetString(k.get_str()); - if (!fGood) - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid private key"); - CKey key = vchSecret.GetKey(); - if (!key.IsValid()) - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Private key outside allowed range"); - tempKeystore.AddKey(key); - } - } -#ifdef ENABLE_WALLET - else if (pwalletMain) - EnsureWalletIsUnlocked(); -#endif - -#ifdef ENABLE_WALLET - const CKeyStore& keystore = ((fGivenKeys || !pwalletMain) ? tempKeystore : *pwalletMain); -#else - const CKeyStore& keystore = tempKeystore; -#endif - - int nHashType = SIGHASH_ALL; - /* - if (params.size() > 3 && !params[3].isNull()) { - static map mapSigHashValues = - boost::assign::map_list_of - (string("ALL"), int(SIGHASH_ALL)) - (string("ALL|ANYONECANPAY"), int(SIGHASH_ALL|SIGHASH_ANYONECANPAY)) - (string("NONE"), int(SIGHASH_NONE)) - (string("NONE|ANYONECANPAY"), int(SIGHASH_NONE|SIGHASH_ANYONECANPAY)) - (string("SINGLE"), int(SIGHASH_SINGLE)) - (string("SINGLE|ANYONECANPAY"), int(SIGHASH_SINGLE|SIGHASH_ANYONECANPAY)) - ; - string strHashType = params[3].get_str(); - if (mapSigHashValues.count(strHashType)) - nHashType = mapSigHashValues[strHashType]; - else - throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid sighash param"); - } - */ - - bool fHashSingle = ((nHashType & ~SIGHASH_ANYONECANPAY) == SIGHASH_SINGLE); - - // Script verification errors - UniValue vErrors(UniValue::VARR); - - // Sign what we can: - for (unsigned int i = 0; i < mergedTx.vin.size(); i++) { - CTxIn& txin = mergedTx.vin[i]; - - CC *cond; - - printf("Go\n"); - if (cond = ConditionFromUnsignedInputScript(txin.scriptSig)) { - printf("Found unsigned\n"); - continue; - } - printf("No luck\n"); - - /* - * Replace all this with detection of cryptoconditions spec and signing with each privkey - const CCoins* coins = view.AccessCoins(txin.prevout.hash); - if (coins == NULL || !coins->IsAvailable(txin.prevout.n)) { - TxInErrorToJSON(txin, vErrors, "Input not found or already spent"); - continue; - } - const CScript& prevPubKey = coins->vout[txin.prevout.n].scriptPubKey; - - txin.scriptSig.clear(); - // Only sign SIGHASH_SINGLE if there's a corresponding output: - if (!fHashSingle || (i < mergedTx.vout.size())) - SignSignature(keystore, prevPubKey, mergedTx, i, nHashType); - - // ... and merge in other signatures: - BOOST_FOREACH(const CMutableTransaction& txv, txVariants) { - txin.scriptSig = CombineSignatures(prevPubKey, mergedTx, i, txin.scriptSig, txv.vin[i].scriptSig); - } - ScriptError serror = SCRIPT_ERR_OK; - if (!VerifyScript(txin.scriptSig, prevPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, MutableTransactionSignatureChecker(&mergedTx, i), &serror)) { - TxInErrorToJSON(txin, vErrors, ScriptErrorString(serror)); - } - */ - } - bool fComplete = vErrors.empty(); - - UniValue result(UniValue::VOBJ); - result.push_back(Pair("hex", EncodeHexTx(mergedTx))); - result.push_back(Pair("complete", fComplete)); - if (!vErrors.empty()) { - result.push_back(Pair("errors", vErrors)); - } - - return result; -} - - -UniValue sendrawtransactioncc(const UniValue& params, bool fHelp) -{ - if (fHelp || params.size() < 1 || params.size() > 2) - throw runtime_error( - "sendrawtransaction \"hexstring\" ( allowhighfees )\n" - "\nSubmits raw transaction (serialized, hex-encoded) to local node and network.\n" - "\nAlso see createrawtransactioncc and signrawtransactioncc calls.\n" - "\nArguments:\n" - "1. \"hexstring\" (string, required) The hex string of the raw transaction)\n" - "2. allowhighfees (boolean, optional, default=false) Allow high fees\n" - "\nResult:\n" - "\"hex\" (string) The transaction hash in hex\n" - "\nExamples:\n" - "\nCreate a transaction\n" - + HelpExampleCli("createrawtransactioncc", "\"[{\\\"txid\\\" : \\\"mytxid\\\",\\\"vout\\\":0}]\" \"{\\\"myaddress\\\":0.01}\"") + - "Sign the transaction, and get back the hex\n" - + HelpExampleCli("signrawtransaction", "\"myhex\"") + - "\nSend the transaction (signed hex)\n" - + HelpExampleCli("sendrawtransaction", "\"signedhex\"") + - "\nAs a json rpc call\n" - + HelpExampleRpc("sendrawtransaction", "\"signedhex\"") - ); - - LOCK(cs_main); - RPCTypeCheck(params, boost::assign::list_of(UniValue::VSTR)(UniValue::VBOOL)); - - // parse hex string from parameter - CTransaction tx; - if (!DecodeHexTx(tx, params[0].get_str())) - throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed"); - uint256 hashTx = tx.GetHash(); - - bool fOverrideFees = false; - if (params.size() > 1) - fOverrideFees = params[1].get_bool(); - - CCoinsViewCache &view = *pcoinsTip; - const CCoins* existingCoins = view.AccessCoins(hashTx); - bool fHaveMempool = mempool.exists(hashTx); - bool fHaveChain = existingCoins && existingCoins->nHeight < 1000000000; - if (!fHaveMempool && !fHaveChain) { - // push to local node and sync with wallets - CValidationState state; - bool fMissingInputs; - if (!AcceptToMemoryPool(mempool, state, tx, false, &fMissingInputs, !fOverrideFees)) { - if (state.IsInvalid()) { - throw JSONRPCError(RPC_TRANSACTION_REJECTED, strprintf("%i: %s", state.GetRejectCode(), state.GetRejectReason())); - } else { - if (fMissingInputs) { - throw JSONRPCError(RPC_TRANSACTION_ERROR, "Missing inputs"); - } - throw JSONRPCError(RPC_TRANSACTION_ERROR, state.GetRejectReason()); - } - } - } else if (fHaveChain) { - throw JSONRPCError(RPC_TRANSACTION_ALREADY_IN_CHAIN, "transaction already in block chain"); - } - RelayTransaction(tx); - - return hashTx.GetHex(); -} diff --git a/src/rpcserver.cpp b/src/rpcserver.cpp index 06c08a3be..518ba4693 100644 --- a/src/rpcserver.cpp +++ b/src/rpcserver.cpp @@ -325,8 +325,6 @@ static const CRPCCommand vRPCCommands[] = { "rawtransactions", "getrawtransaction", &getrawtransaction, true }, { "rawtransactions", "sendrawtransaction", &sendrawtransaction, false }, { "rawtransactions", "signrawtransaction", &signrawtransaction, false }, /* uses wallet if enabled */ - { "rawtransactions", "createrawtransactioncc", &createrawtransactioncc, true }, - { "rawtransactions", "signrawtransactioncc", &signrawtransactioncc, false }, /* uses wallet if enabled */ #ifdef ENABLE_WALLET { "rawtransactions", "fundrawtransaction", &fundrawtransaction, false }, #endif diff --git a/src/rpcserver.h b/src/rpcserver.h index 611abd05f..ecf7b0573 100644 --- a/src/rpcserver.h +++ b/src/rpcserver.h @@ -262,9 +262,6 @@ extern UniValue sendrawtransaction(const UniValue& params, bool fHelp); extern UniValue gettxoutproof(const UniValue& params, bool fHelp); extern UniValue verifytxoutproof(const UniValue& params, bool fHelp); -extern UniValue createrawtransactioncc(const UniValue& params, bool fHelp); // in rpccryptocondition.cpp -extern UniValue signrawtransactioncc(const UniValue& params, bool fHelp); - extern UniValue getblockcount(const UniValue& params, bool fHelp); // in rpcblockchain.cpp extern UniValue getbestblockhash(const UniValue& params, bool fHelp); extern UniValue getdifficulty(const UniValue& params, bool fHelp); From 072099d788553021c5a80956334e32222509a0a5 Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 15 Feb 2018 22:19:36 -0800 Subject: [PATCH 0450/1062] Implementation of Overwinter transaction format ZIP 202. --- qa/pull-tester/rpc-tests.sh | 1 + qa/rpc-tests/wallet_overwintertx.py | 110 ++++++ src/bitcoin-tx.cpp | 2 +- src/chainparams.cpp | 5 + src/consensus/consensus.h | 6 +- src/gtest/test_checkblock.cpp | 156 +++++++++ src/gtest/test_checktransaction.cpp | 313 ++++++++++++++++++ src/gtest/test_mempool.cpp | 125 +++++++ src/main.cpp | 141 +++++++- src/main.h | 9 +- src/miner.cpp | 2 +- src/primitives/transaction.cpp | 50 ++- src/primitives/transaction.h | 96 +++++- src/rpcrawtransaction.cpp | 13 +- src/test/rpc_tests.cpp | 41 +++ src/test/rpc_wallet_tests.cpp | 74 +++-- src/test/sighash_tests.cpp | 2 +- src/utilstrencodings.cpp | 7 + src/utilstrencodings.h | 1 + src/wallet/asyncrpcoperation_sendmany.cpp | 5 +- src/wallet/asyncrpcoperation_sendmany.h | 2 +- .../asyncrpcoperation_shieldcoinbase.cpp | 6 +- src/wallet/asyncrpcoperation_shieldcoinbase.h | 2 +- src/wallet/rpcwallet.cpp | 19 +- src/wallet/wallet.cpp | 3 +- 25 files changed, 1125 insertions(+), 66 deletions(-) create mode 100755 qa/rpc-tests/wallet_overwintertx.py diff --git a/qa/pull-tester/rpc-tests.sh b/qa/pull-tester/rpc-tests.sh index dfbd78f9a..ec5bd2a48 100755 --- a/qa/pull-tester/rpc-tests.sh +++ b/qa/pull-tester/rpc-tests.sh @@ -17,6 +17,7 @@ testScripts=( 'wallet_protectcoinbase.py' 'wallet_shieldcoinbase.py' 'wallet.py' + 'wallet_overwintertx.py' 'wallet_nullifiers.py' 'wallet_1941.py' 'listtransactions.py' diff --git a/qa/rpc-tests/wallet_overwintertx.py b/qa/rpc-tests/wallet_overwintertx.py new file mode 100755 index 000000000..84215eb6b --- /dev/null +++ b/qa/rpc-tests/wallet_overwintertx.py @@ -0,0 +1,110 @@ +#!/usr/bin/env python2 +# Copyright (c) 2018 The Zcash developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +from test_framework.test_framework import BitcoinTestFramework +from test_framework.authproxy import JSONRPCException +from test_framework.util import assert_equal, initialize_chain_clean, \ + start_nodes, connect_nodes_bi, sync_blocks, sync_mempools, \ + wait_and_assert_operationid_status + +from decimal import Decimal + +class WalletOverwinterTxTest (BitcoinTestFramework): + + def setup_chain(self): + print("Initializing test directory "+self.options.tmpdir) + initialize_chain_clean(self.options.tmpdir, 4) + + def setup_network(self, split=False): + self.nodes = start_nodes(4, self.options.tmpdir, extra_args=[["-nuparams=5ba81b19:200", "-debug=zrpcunsafe", "-txindex"]] * 4 ) + connect_nodes_bi(self.nodes,0,1) + connect_nodes_bi(self.nodes,1,2) + connect_nodes_bi(self.nodes,0,2) + connect_nodes_bi(self.nodes,0,3) + self.is_network_split=False + self.sync_all() + + def run_test (self): + self.nodes[0].generate(100) + self.sync_all() + self.nodes[1].generate(98) + self.sync_all() + # Node 0 has reward from blocks 1 to 98 which are spendable. + + # + # Sprout + # + # Currently at block 198. The next block to be mined 199 is a Sprout block + # + taddr0 = self.nodes[0].getnewaddress() + taddr2 = self.nodes[2].getnewaddress() + zaddr2 = self.nodes[2].z_getnewaddress() + taddr3 = self.nodes[3].getnewaddress() + zaddr3 = self.nodes[3].z_getnewaddress() + + # Send taddr to taddr + tsendamount = Decimal('1.23') + txid_transparent = self.nodes[0].sendtoaddress(taddr2, tsendamount) + + # Send one coinbase utxo of value 10.0 less a fee of 0.00010000, with no change. + zsendamount = Decimal('10.0') - Decimal('0.0001') + recipients = [] + recipients.append({"address":zaddr2, "amount": zsendamount}) + myopid = self.nodes[0].z_sendmany(taddr0, recipients) + txid_shielded = wait_and_assert_operationid_status(self.nodes[0], myopid) + + self.sync_all() + self.nodes[0].generate(1) + self.sync_all() + + # Verify balance + assert_equal(self.nodes[2].getbalance(), tsendamount) + assert_equal(self.nodes[2].z_getbalance(zaddr2), zsendamount) + + # Verify transaction version is 1 or 2 (intended for Sprout) + result = self.nodes[0].getrawtransaction(txid_transparent, 1) + assert_equal(result["version"], 1) + assert_equal(result["overwintered"], False) + result = self.nodes[0].getrawtransaction(txid_shielded, 1) + assert_equal(result["version"], 2) + assert_equal(result["overwintered"], False) + + # + # Overwinter + # + # Currently at block 199. The next block to be mined 200 is an Overwinter block + # + + # Send taddr to taddr + tsendamount = Decimal('4.56') + txid_transparent = self.nodes[0].sendtoaddress(taddr3, tsendamount) + + # Send one coinbase utxo of value 20.0 less a fee of 0.00010000, with no change. + zsendamount = Decimal('20.0') - Decimal('0.0001') + recipients = [] + recipients.append({"address":zaddr3, "amount": zsendamount}) + myopid = self.nodes[0].z_sendmany(taddr0, recipients) + txid_shielded = wait_and_assert_operationid_status(self.nodes[0], myopid) + + self.sync_all() + self.nodes[0].generate(1) + self.sync_all() + + # Verify balance + assert_equal(self.nodes[3].getbalance(), tsendamount) + assert_equal(self.nodes[3].z_getbalance(zaddr3), zsendamount) + + # Verify transaction version is 3 (intended for Overwinter) + result = self.nodes[0].getrawtransaction(txid_transparent, 1) + assert_equal(result["version"], 3) + assert_equal(result["overwintered"], True) + assert_equal(result["versiongroupid"], "03c48270") + result = self.nodes[0].getrawtransaction(txid_shielded, 1) + assert_equal(result["version"], 3) + assert_equal(result["overwintered"], True) + assert_equal(result["versiongroupid"], "03c48270") + +if __name__ == '__main__': + WalletOverwinterTxTest().main() diff --git a/src/bitcoin-tx.cpp b/src/bitcoin-tx.cpp index c6c7c93ed..9e81a14ec 100644 --- a/src/bitcoin-tx.cpp +++ b/src/bitcoin-tx.cpp @@ -157,7 +157,7 @@ static void RegisterLoad(const string& strInput) static void MutateTxVersion(CMutableTransaction& tx, const string& cmdVal) { int64_t newVersion = atoi64(cmdVal); - if (newVersion < CTransaction::MIN_CURRENT_VERSION || newVersion > CTransaction::MAX_CURRENT_VERSION) + if (newVersion < CTransaction::SPROUT_MIN_CURRENT_VERSION || newVersion > CTransaction::SPROUT_MAX_CURRENT_VERSION) throw runtime_error("Invalid TX version requested"); tx.nVersion = (int) newVersion; diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 22d425991..a0c73dc37 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -19,6 +19,11 @@ static CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesisOutputScript, uint32_t nTime, const uint256& nNonce, const std::vector& nSolution, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward) { + // To create a genesis block for a new chain which is Overwintered: + // txNew.nVersion = 3 + // txNew.fOverwintered = true + // txNew.nVersionGroupId = OVERWINTER_VERSION_GROUP_ID + // txNew.nExpiryHeight = CMutableTransaction txNew; txNew.nVersion = 1; txNew.vin.resize(1); diff --git a/src/consensus/consensus.h b/src/consensus/consensus.h index d700666bc..43fd1e828 100644 --- a/src/consensus/consensus.h +++ b/src/consensus/consensus.h @@ -9,7 +9,11 @@ /** The minimum allowed block version (network rule) */ static const int32_t MIN_BLOCK_VERSION = 4; /** The minimum allowed transaction version (network rule) */ -static const int32_t MIN_TX_VERSION = 1; +static const int32_t SPROUT_MIN_TX_VERSION = 1; +/** The minimum allowed transaction version (network rule) */ +static const int32_t OVERWINTER_MIN_TX_VERSION = 3; +/** The maximum allowed transaction version (network rule) */ +static const int32_t OVERWINTER_MAX_TX_VERSION = 3; /** The maximum allowed size for a serialized block, in bytes (network rule) */ static const unsigned int MAX_BLOCK_SIZE = 2000000; /** The maximum allowed number of signature check operations in a block (network rule) */ diff --git a/src/gtest/test_checkblock.cpp b/src/gtest/test_checkblock.cpp index edd8a617d..53c0efcc7 100644 --- a/src/gtest/test_checkblock.cpp +++ b/src/gtest/test_checkblock.cpp @@ -33,6 +33,40 @@ TEST(CheckBlock, VersionTooLow) { EXPECT_FALSE(CheckBlock(block, state, verifier, false, false)); } + +// Test that a Sprout tx with negative version is still rejected +// by CheckBlock under Sprout consensus rules. +TEST(CheckBlock, BlockSproutRejectsBadVersion) { + SelectParams(CBaseChainParams::MAIN); + + CMutableTransaction mtx; + mtx.vin.resize(1); + mtx.vin[0].prevout.SetNull(); + mtx.vin[0].scriptSig = CScript() << 1 << OP_0; + mtx.vout.resize(1); + mtx.vout[0].scriptPubKey = CScript() << OP_TRUE; + mtx.vout[0].nValue = 0; + mtx.vout.push_back(CTxOut( + GetBlockSubsidy(1, Params().GetConsensus())/5, + Params().GetFoundersRewardScriptAtHeight(1))); + mtx.fOverwintered = false; + mtx.nVersion = -1; + mtx.nVersionGroupId = 0; + + CTransaction tx {mtx}; + CBlock block; + block.vtx.push_back(tx); + + MockCValidationState state; + CBlockIndex indexPrev {Params().GenesisBlock()}; + + auto verifier = libzcash::ProofVerifier::Strict(); + + EXPECT_CALL(state, DoS(100, false, REJECT_INVALID, "bad-txns-version-too-low", false)).Times(1); + EXPECT_FALSE(CheckBlock(block, state, verifier, false, false)); +} + + TEST(ContextualCheckBlock, BadCoinbaseHeight) { SelectParams(CBaseChainParams::MAIN); @@ -75,3 +109,125 @@ TEST(ContextualCheckBlock, BadCoinbaseHeight) { block.vtx[0] = tx4; EXPECT_TRUE(ContextualCheckBlock(block, state, &indexPrev)); } + +// Test that a block evaluated under Sprout rules cannot contain Overwinter transactions. +// This test assumes that mainnet Overwinter activation is at least height 2. +TEST(ContextualCheckBlock, BlockSproutRulesRejectOverwinterTx) { + SelectParams(CBaseChainParams::MAIN); + + CMutableTransaction mtx; + mtx.vin.resize(1); + mtx.vin[0].prevout.SetNull(); + mtx.vin[0].scriptSig = CScript() << 1 << OP_0; + mtx.vout.resize(1); + mtx.vout[0].scriptPubKey = CScript() << OP_TRUE; + mtx.vout[0].nValue = 0; + + mtx.fOverwintered = true; + mtx.nVersion = 3; + mtx.nVersionGroupId = OVERWINTER_VERSION_GROUP_ID; + + CTransaction tx {mtx}; + CBlock block; + block.vtx.push_back(tx); + + MockCValidationState state; + CBlockIndex indexPrev {Params().GenesisBlock()}; + + EXPECT_CALL(state, DoS(100, false, REJECT_INVALID, "tx-overwinter-not-active", false)).Times(1); + EXPECT_FALSE(ContextualCheckBlock(block, state, &indexPrev)); +} + + +// Test block evaluated under Sprout rules will accept Sprout transactions +TEST(ContextualCheckBlock, BlockSproutRulesAcceptSproutTx) { + SelectParams(CBaseChainParams::REGTEST); + UpdateNetworkUpgradeParameters(Consensus::UPGRADE_OVERWINTER, Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT); + + CMutableTransaction mtx; + mtx.vin.resize(1); + mtx.vin[0].prevout.SetNull(); + mtx.vin[0].scriptSig = CScript() << 1 << OP_0; + mtx.vout.resize(1); + mtx.vout[0].scriptPubKey = CScript() << OP_TRUE; + mtx.vout[0].nValue = 0; + mtx.vout.push_back(CTxOut( + GetBlockSubsidy(1, Params().GetConsensus())/5, + Params().GetFoundersRewardScriptAtHeight(1))); + mtx.fOverwintered = false; + mtx.nVersion = 1; + + CTransaction tx {mtx}; + CBlock block; + block.vtx.push_back(tx); + MockCValidationState state; + CBlockIndex indexPrev {Params().GenesisBlock()}; + + EXPECT_TRUE(ContextualCheckBlock(block, state, &indexPrev)); + + // Revert to default + UpdateNetworkUpgradeParameters(Consensus::UPGRADE_OVERWINTER, Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT); +} + + +// Test block evaluated under Overwinter rules will accept Overwinter transactions +TEST(ContextualCheckBlock, BlockOverwinterRulesAcceptOverwinterTx) { + SelectParams(CBaseChainParams::REGTEST); + UpdateNetworkUpgradeParameters(Consensus::UPGRADE_OVERWINTER, 1); + + CMutableTransaction mtx; + mtx.vin.resize(1); + mtx.vin[0].prevout.SetNull(); + mtx.vin[0].scriptSig = CScript() << 1 << OP_0; + mtx.vout.resize(1); + mtx.vout[0].scriptPubKey = CScript() << OP_TRUE; + mtx.vout[0].nValue = 0; + mtx.vout.push_back(CTxOut( + GetBlockSubsidy(1, Params().GetConsensus())/5, + Params().GetFoundersRewardScriptAtHeight(1))); + mtx.fOverwintered = true; + mtx.nVersion = 3; + mtx.nVersionGroupId = OVERWINTER_VERSION_GROUP_ID; + + CTransaction tx {mtx}; + CBlock block; + block.vtx.push_back(tx); + MockCValidationState state; + CBlockIndex indexPrev {Params().GenesisBlock()}; + + EXPECT_TRUE(ContextualCheckBlock(block, state, &indexPrev)); + + // Revert to default + UpdateNetworkUpgradeParameters(Consensus::UPGRADE_OVERWINTER, Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT); +} + + + +// Test block evaluated under Overwinter rules will reject Sprout transactions +TEST(ContextualCheckBlock, BlockOverwinterRulesRejectSproutTx) { + SelectParams(CBaseChainParams::REGTEST); + UpdateNetworkUpgradeParameters(Consensus::UPGRADE_OVERWINTER, 1); + + CMutableTransaction mtx; + mtx.vin.resize(1); + mtx.vin[0].prevout.SetNull(); + mtx.vin[0].scriptSig = CScript() << 1 << OP_0; + mtx.vout.resize(1); + mtx.vout[0].scriptPubKey = CScript() << OP_TRUE; + mtx.vout[0].nValue = 0; + + mtx.nVersion = 2; + + CTransaction tx {mtx}; + CBlock block; + block.vtx.push_back(tx); + + MockCValidationState state; + CBlockIndex indexPrev {Params().GenesisBlock()}; + + EXPECT_CALL(state, DoS(100, false, REJECT_INVALID, "tx-overwinter-active", false)).Times(1); + EXPECT_FALSE(ContextualCheckBlock(block, state, &indexPrev)); + + // Revert to default + UpdateNetworkUpgradeParameters(Consensus::UPGRADE_OVERWINTER, Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT); +} \ No newline at end of file diff --git a/src/gtest/test_checktransaction.cpp b/src/gtest/test_checktransaction.cpp index 305977103..704be83ef 100644 --- a/src/gtest/test_checktransaction.cpp +++ b/src/gtest/test_checktransaction.cpp @@ -391,3 +391,316 @@ TEST(checktransaction_tests, non_canonical_ed25519_signature) { EXPECT_CALL(state, DoS(100, false, REJECT_INVALID, "bad-txns-invalid-joinsplit-signature", false)).Times(1); CheckTransactionWithoutProofVerification(tx, state); } + +TEST(checktransaction_tests, OverwinterConstructors) { + CMutableTransaction mtx; + mtx.fOverwintered = true; + mtx.nVersion = 3; + mtx.nVersionGroupId = OVERWINTER_VERSION_GROUP_ID; + mtx.nExpiryHeight = 20; + + // Check constructor with overwinter fields + CTransaction tx(mtx); + EXPECT_EQ(tx.nVersion, mtx.nVersion); + EXPECT_EQ(tx.fOverwintered, mtx.fOverwintered); + EXPECT_EQ(tx.nVersionGroupId, mtx.nVersionGroupId); + EXPECT_EQ(tx.nExpiryHeight, mtx.nExpiryHeight); + + // Check constructor of mutable transaction struct + CMutableTransaction mtx2(tx); + EXPECT_EQ(mtx2.nVersion, mtx.nVersion); + EXPECT_EQ(mtx2.fOverwintered, mtx.fOverwintered); + EXPECT_EQ(mtx2.nVersionGroupId, mtx.nVersionGroupId); + EXPECT_EQ(mtx2.nExpiryHeight, mtx.nExpiryHeight); + EXPECT_TRUE(mtx2.GetHash() == mtx.GetHash()); + + // Check assignment of overwinter fields + CTransaction tx2 = tx; + EXPECT_EQ(tx2.nVersion, mtx.nVersion); + EXPECT_EQ(tx2.fOverwintered, mtx.fOverwintered); + EXPECT_EQ(tx2.nVersionGroupId, mtx.nVersionGroupId); + EXPECT_EQ(tx2.nExpiryHeight, mtx.nExpiryHeight); + EXPECT_TRUE(tx2 == tx); +} + +TEST(checktransaction_tests, OverwinterSerialization) { + CMutableTransaction mtx; + mtx.fOverwintered = true; + mtx.nVersion = 3; + mtx.nVersionGroupId = OVERWINTER_VERSION_GROUP_ID; + mtx.nExpiryHeight = 99; + + // Check round-trip serialization and deserialization from mtx to tx. + { + CDataStream ss(SER_DISK, PROTOCOL_VERSION); + ss << mtx; + CTransaction tx; + ss >> tx; + EXPECT_EQ(mtx.nVersion, tx.nVersion); + EXPECT_EQ(mtx.fOverwintered, tx.fOverwintered); + EXPECT_EQ(mtx.nVersionGroupId, tx.nVersionGroupId); + EXPECT_EQ(mtx.nExpiryHeight, tx.nExpiryHeight); + + EXPECT_EQ(mtx.GetHash(), CMutableTransaction(tx).GetHash()); + EXPECT_EQ(tx.GetHash(), CTransaction(mtx).GetHash()); + } + + // Also check mtx to mtx + { + CDataStream ss(SER_DISK, PROTOCOL_VERSION); + ss << mtx; + CMutableTransaction mtx2; + ss >> mtx2; + EXPECT_EQ(mtx.nVersion, mtx2.nVersion); + EXPECT_EQ(mtx.fOverwintered, mtx2.fOverwintered); + EXPECT_EQ(mtx.nVersionGroupId, mtx2.nVersionGroupId); + EXPECT_EQ(mtx.nExpiryHeight, mtx2.nExpiryHeight); + + EXPECT_EQ(mtx.GetHash(), mtx2.GetHash()); + } + + // Also check tx to tx + { + CTransaction tx(mtx); + CDataStream ss(SER_DISK, PROTOCOL_VERSION); + ss << tx; + CTransaction tx2; + ss >> tx2; + EXPECT_EQ(tx.nVersion, tx2.nVersion); + EXPECT_EQ(tx.fOverwintered, tx2.fOverwintered); + EXPECT_EQ(tx.nVersionGroupId, tx2.nVersionGroupId); + EXPECT_EQ(tx.nExpiryHeight, tx2.nExpiryHeight); + + EXPECT_EQ(mtx.GetHash(), CMutableTransaction(tx).GetHash()); + EXPECT_EQ(tx.GetHash(), tx2.GetHash()); + } +} + +TEST(checktransaction_tests, OverwinterDefaultValues) { + // Check default values (this will fail when defaults change; test should then be updated) + CTransaction tx; + EXPECT_EQ(tx.nVersion, 1); + EXPECT_EQ(tx.fOverwintered, false); + EXPECT_EQ(tx.nVersionGroupId, 0); + EXPECT_EQ(tx.nExpiryHeight, 0); +} + +// A valid v3 transaction with no joinsplits +TEST(checktransaction_tests, OverwinterValidTx) { + CMutableTransaction mtx = GetValidTransaction(); + mtx.vjoinsplit.resize(0); + mtx.fOverwintered = true; + mtx.nVersion = 3; + mtx.nVersionGroupId = OVERWINTER_VERSION_GROUP_ID; + mtx.nExpiryHeight = 0; + CTransaction tx(mtx); + MockCValidationState state; + EXPECT_TRUE(CheckTransactionWithoutProofVerification(tx, state)); +} + +TEST(checktransaction_tests, OverwinterExpiryHeight) { + CMutableTransaction mtx = GetValidTransaction(); + mtx.vjoinsplit.resize(0); + mtx.fOverwintered = true; + mtx.nVersion = 3; + mtx.nVersionGroupId = OVERWINTER_VERSION_GROUP_ID; + mtx.nExpiryHeight = 0; + + { + CTransaction tx(mtx); + MockCValidationState state; + EXPECT_TRUE(CheckTransactionWithoutProofVerification(tx, state)); + } + + { + mtx.nExpiryHeight = TX_EXPIRY_HEIGHT_THRESHOLD - 1; + CTransaction tx(mtx); + MockCValidationState state; + EXPECT_TRUE(CheckTransactionWithoutProofVerification(tx, state)); + } + + { + mtx.nExpiryHeight = TX_EXPIRY_HEIGHT_THRESHOLD; + CTransaction tx(mtx); + MockCValidationState state; + EXPECT_CALL(state, DoS(100, false, REJECT_INVALID, "bad-tx-expiry-height-too-high", false)).Times(1); + CheckTransactionWithoutProofVerification(tx, state); + } + + { + mtx.nExpiryHeight = std::numeric_limits::max(); + CTransaction tx(mtx); + MockCValidationState state; + EXPECT_CALL(state, DoS(100, false, REJECT_INVALID, "bad-tx-expiry-height-too-high", false)).Times(1); + CheckTransactionWithoutProofVerification(tx, state); + } +} + + +// Test that a Sprout tx with a negative version number is detected +// given the new Overwinter logic +TEST(checktransaction_tests, SproutTxVersionTooLow) { + CMutableTransaction mtx = GetValidTransaction(); + mtx.vjoinsplit.resize(0); + mtx.fOverwintered = false; + mtx.nVersion = -1; + + CTransaction tx(mtx); + MockCValidationState state; + EXPECT_CALL(state, DoS(100, false, REJECT_INVALID, "bad-txns-version-too-low", false)).Times(1); + CheckTransactionWithoutProofVerification(tx, state); +} + + + +// Subclass of CTransaction which doesn't call UpdateHash when constructing +// from a CMutableTransaction. This enables us to create a CTransaction +// with bad values which normally trigger an exception during construction. +class UNSAFE_CTransaction : public CTransaction { + public: + UNSAFE_CTransaction(const CMutableTransaction &tx) : CTransaction(tx, true) {} +}; + + +// Test bad Overwinter version number in CheckTransactionWithoutProofVerification +TEST(checktransaction_tests, OverwinterVersionNumberLow) { + CMutableTransaction mtx = GetValidTransaction(); + mtx.vjoinsplit.resize(0); + mtx.fOverwintered = true; + mtx.nVersion = OVERWINTER_MIN_TX_VERSION - 1; + mtx.nVersionGroupId = OVERWINTER_VERSION_GROUP_ID; + mtx.nExpiryHeight = 0; + + UNSAFE_CTransaction tx(mtx); + MockCValidationState state; + EXPECT_CALL(state, DoS(100, false, REJECT_INVALID, "bad-tx-overwinter-version-too-low", false)).Times(1); + CheckTransactionWithoutProofVerification(tx, state); +} + +// Test bad Overwinter version number in ContextualCheckTransaction +TEST(checktransaction_tests, OverwinterVersionNumberHigh) { + SelectParams(CBaseChainParams::REGTEST); + UpdateNetworkUpgradeParameters(Consensus::UPGRADE_OVERWINTER, Consensus::NetworkUpgrade::ALWAYS_ACTIVE); + + CMutableTransaction mtx = GetValidTransaction(); + mtx.vjoinsplit.resize(0); + mtx.fOverwintered = true; + mtx.nVersion = OVERWINTER_MAX_TX_VERSION + 1; + mtx.nVersionGroupId = OVERWINTER_VERSION_GROUP_ID; + mtx.nExpiryHeight = 0; + + UNSAFE_CTransaction tx(mtx); + MockCValidationState state; + EXPECT_CALL(state, DoS(100, false, REJECT_INVALID, "bad-tx-overwinter-version-too-high", false)).Times(1); + ContextualCheckTransaction(tx, state, 1, 100); + + // Revert to default + UpdateNetworkUpgradeParameters(Consensus::UPGRADE_OVERWINTER, Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT); +} + + +// Test bad Overwinter version group id +TEST(checktransaction_tests, OverwinterBadVersionGroupId) { + CMutableTransaction mtx = GetValidTransaction(); + mtx.vjoinsplit.resize(0); + mtx.fOverwintered = true; + mtx.nVersion = 3; + mtx.nExpiryHeight = 0; + mtx.nVersionGroupId = 0x12345678; + + UNSAFE_CTransaction tx(mtx); + MockCValidationState state; + EXPECT_CALL(state, DoS(100, false, REJECT_INVALID, "bad-tx-version-group-id", false)).Times(1); + CheckTransactionWithoutProofVerification(tx, state); +} + +// This tests an Overwinter transaction checked against Sprout +TEST(checktransaction_tests, OverwinterNotActive) { + SelectParams(CBaseChainParams::TESTNET); + + CMutableTransaction mtx = GetValidTransaction(); + mtx.fOverwintered = true; + mtx.nVersion = 3; + mtx.nVersionGroupId = OVERWINTER_VERSION_GROUP_ID; + mtx.nExpiryHeight = 0; + + CTransaction tx(mtx); + MockCValidationState state; + EXPECT_CALL(state, DoS(100, false, REJECT_INVALID, "tx-overwinter-not-active", false)).Times(1); + ContextualCheckTransaction(tx, state, 1, 100); +} + +// This tests a transaction without the fOverwintered flag set, against the Overwinter consensus rule set. +TEST(checktransaction_tests, OverwinterFlagNotSet) { + SelectParams(CBaseChainParams::REGTEST); + UpdateNetworkUpgradeParameters(Consensus::UPGRADE_OVERWINTER, Consensus::NetworkUpgrade::ALWAYS_ACTIVE); + + CMutableTransaction mtx = GetValidTransaction(); + mtx.fOverwintered = false; + mtx.nVersion = 3; + mtx.nVersionGroupId = OVERWINTER_VERSION_GROUP_ID; + mtx.nExpiryHeight = 0; + + CTransaction tx(mtx); + MockCValidationState state; + EXPECT_CALL(state, DoS(100, false, REJECT_INVALID, "tx-overwinter-flag-not-set", false)).Times(1); + ContextualCheckTransaction(tx, state, 1, 100); + + // Revert to default + UpdateNetworkUpgradeParameters(Consensus::UPGRADE_OVERWINTER, Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT); +} + + +// Overwinter (NU0) does not allow soft fork to version 4 Overwintered tx. +TEST(checktransaction_tests, OverwinterInvalidSoftForkVersion) { + CMutableTransaction mtx = GetValidTransaction(); + mtx.fOverwintered = true; + mtx.nVersion = 4; // This is not allowed + mtx.nVersionGroupId = OVERWINTER_VERSION_GROUP_ID; + mtx.nExpiryHeight = 0; + + CDataStream ss(SER_DISK, PROTOCOL_VERSION); + try { + ss << mtx; + FAIL() << "Expected std::ios_base::failure 'Unknown transaction format'"; + } + catch(std::ios_base::failure & err) { + EXPECT_THAT(err.what(), testing::HasSubstr(std::string("Unknown transaction format"))); + } + catch(...) { + FAIL() << "Expected std::ios_base::failure 'Unknown transaction format', got some other exception"; + } +} + + +// Test CreateNewContextualCMutableTransaction sets default values based on height +TEST(checktransaction_tests, OverwinteredContextualCreateTx) { + SelectParams(CBaseChainParams::REGTEST); + const Consensus::Params& consensusParams = Params().GetConsensus(); + int activationHeight = 5; + UpdateNetworkUpgradeParameters(Consensus::UPGRADE_OVERWINTER, activationHeight); + + { + CMutableTransaction mtx = CreateNewContextualCMutableTransaction( + consensusParams, activationHeight - 1); + + EXPECT_EQ(mtx.nVersion, 1); + EXPECT_EQ(mtx.fOverwintered, false); + EXPECT_EQ(mtx.nVersionGroupId, 0); + EXPECT_EQ(mtx.nExpiryHeight, 0); + } + + // Overwinter activates + { + CMutableTransaction mtx = CreateNewContextualCMutableTransaction( + consensusParams, activationHeight ); + + EXPECT_EQ(mtx.nVersion, 3); + EXPECT_EQ(mtx.fOverwintered, true); + EXPECT_EQ(mtx.nVersionGroupId, OVERWINTER_VERSION_GROUP_ID); + EXPECT_EQ(mtx.nExpiryHeight, 0); + } + + // Revert to default + UpdateNetworkUpgradeParameters(Consensus::UPGRADE_OVERWINTER, Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT); +} diff --git a/src/gtest/test_mempool.cpp b/src/gtest/test_mempool.cpp index 14b4d83b1..b9c47b211 100644 --- a/src/gtest/test_mempool.cpp +++ b/src/gtest/test_mempool.cpp @@ -1,6 +1,7 @@ #include #include +#include "consensus/upgrades.h" #include "consensus/validation.h" #include "core_io.h" #include "main.h" @@ -9,6 +10,9 @@ #include "policy/fees.h" #include "util.h" +// Implementation is in test_checktransaction.cpp +extern CMutableTransaction GetValidTransaction(); + // Fake the input of transaction 5295156213414ed77f6e538e7e8ebe14492156906b9fe995b242477818789364 // - 532639cc6bebed47c1c69ae36dd498c68a012e74ad12729adbd3dbb56f8f3f4a, 0 class FakeCoinsViewDB : public CCoinsView { @@ -92,6 +96,8 @@ TEST(Mempool, PriorityStatsDoNotCrash) { } TEST(Mempool, TxInputLimit) { + SelectParams(CBaseChainParams::TESTNET); + CTxMemPool pool(::minRelayTxFee); bool missingInputs; @@ -136,3 +142,122 @@ TEST(Mempool, TxInputLimit) { EXPECT_EQ(state4.GetRejectReason(), "bad-txns-version-too-low"); } +// Valid overwinter v3 format tx gets rejected because overwinter hasn't activated yet. +TEST(Mempool, OverwinterNotActiveYet) { + SelectParams(CBaseChainParams::REGTEST); + UpdateNetworkUpgradeParameters(Consensus::UPGRADE_OVERWINTER, Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT); + + CTxMemPool pool(::minRelayTxFee); + bool missingInputs; + CMutableTransaction mtx = GetValidTransaction(); + mtx.vjoinsplit.resize(0); // no joinsplits + mtx.fOverwintered = true; + mtx.nVersion = 3; + mtx.nVersionGroupId = OVERWINTER_VERSION_GROUP_ID; + mtx.nExpiryHeight = 0; + CValidationState state1; + + CTransaction tx1(mtx); + EXPECT_FALSE(AcceptToMemoryPool(pool, state1, tx1, false, &missingInputs)); + EXPECT_EQ(state1.GetRejectReason(), "tx-overwinter-not-active"); + + // Revert to default + UpdateNetworkUpgradeParameters(Consensus::UPGRADE_OVERWINTER, Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT); +} + + +// Sprout transaction version 3 when Overwinter is not active: +// 1. pass CheckTransaction (and CheckTransactionWithoutProofVerification) +// 2. pass ContextualCheckTransaction +// 3. fail IsStandardTx +TEST(Mempool, SproutV3TxFailsAsExpected) { + SelectParams(CBaseChainParams::TESTNET); + + CTxMemPool pool(::minRelayTxFee); + bool missingInputs; + CMutableTransaction mtx = GetValidTransaction(); + mtx.vjoinsplit.resize(0); // no joinsplits + mtx.fOverwintered = false; + mtx.nVersion = 3; + CValidationState state1; + CTransaction tx1(mtx); + + EXPECT_FALSE(AcceptToMemoryPool(pool, state1, tx1, false, &missingInputs)); + EXPECT_EQ(state1.GetRejectReason(), "version"); +} + + +// Sprout transaction version 3 when Overwinter is always active: +// 1. pass CheckTransaction (and CheckTransactionWithoutProofVerification) +// 2. fails ContextualCheckTransaction +TEST(Mempool, SproutV3TxWhenOverwinterActive) { + SelectParams(CBaseChainParams::REGTEST); + UpdateNetworkUpgradeParameters(Consensus::UPGRADE_OVERWINTER, Consensus::NetworkUpgrade::ALWAYS_ACTIVE); + + CTxMemPool pool(::minRelayTxFee); + bool missingInputs; + CMutableTransaction mtx = GetValidTransaction(); + mtx.vjoinsplit.resize(0); // no joinsplits + mtx.fOverwintered = false; + mtx.nVersion = 3; + CValidationState state1; + CTransaction tx1(mtx); + + EXPECT_FALSE(AcceptToMemoryPool(pool, state1, tx1, false, &missingInputs)); + EXPECT_EQ(state1.GetRejectReason(), "tx-overwinter-flag-not-set"); + + // Revert to default + UpdateNetworkUpgradeParameters(Consensus::UPGRADE_OVERWINTER, Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT); +} + + +// Sprout transaction with negative version, rejected by the mempool in CheckTransaction +// under Sprout consensus rules, should still be rejected under Overwinter consensus rules. +// 1. fails CheckTransaction (specifically CheckTransactionWithoutProofVerification) +TEST(Mempool, SproutNegativeVersionTxWhenOverwinterActive) { + SelectParams(CBaseChainParams::REGTEST); + UpdateNetworkUpgradeParameters(Consensus::UPGRADE_OVERWINTER, Consensus::NetworkUpgrade::ALWAYS_ACTIVE); + + CTxMemPool pool(::minRelayTxFee); + bool missingInputs; + CMutableTransaction mtx = GetValidTransaction(); + mtx.vjoinsplit.resize(0); // no joinsplits + mtx.fOverwintered = false; + + // A Sprout transaction with version -3 is created using Sprout code (as found in Zcashd <= 1.0.14). + // First four bytes of transaction, parsed as an uint32_t, has the value: 0xfffffffd + // This test simulates an Overwinter node receiving this transaction, but incorrectly deserializing the + // transaction due to a (pretend) bug of not detecting the most significant bit, which leads + // to not setting fOverwintered and not masking off the most significant bit of the header field. + // The resulting Sprout tx with nVersion -3 should be rejected by the Overwinter node's mempool. + { + mtx.nVersion = -3; + EXPECT_EQ(mtx.nVersion, static_cast(0xfffffffd)); + + CTransaction tx1(mtx); + EXPECT_EQ(tx1.nVersion, -3); + + CValidationState state1; + EXPECT_FALSE(AcceptToMemoryPool(pool, state1, tx1, false, &missingInputs)); + EXPECT_EQ(state1.GetRejectReason(), "bad-txns-version-too-low"); + } + + // A Sprout transaction with version -3 created using Overwinter code (as found in Zcashd >= 1.0.15). + // First four bytes of transaction, parsed as an uint32_t, has the value: 0x80000003 + // This test simulates the same pretend bug described above. + // The resulting Sprout tx with nVersion -2147483645 should be rejected by the Overwinter node's mempool. + { + mtx.nVersion = static_cast((1 << 31) | 3); + EXPECT_EQ(mtx.nVersion, static_cast(0x80000003)); + + CTransaction tx1(mtx); + EXPECT_EQ(tx1.nVersion, -2147483645); + + CValidationState state1; + EXPECT_FALSE(AcceptToMemoryPool(pool, state1, tx1, false, &missingInputs)); + EXPECT_EQ(state1.GetRejectReason(), "bad-txns-version-too-low"); + } + + // Revert to default + UpdateNetworkUpgradeParameters(Consensus::UPGRADE_OVERWINTER, Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT); +} diff --git a/src/main.cpp b/src/main.cpp index 062507d0e..a17cebe3d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -641,16 +641,22 @@ unsigned int LimitOrphanTxSize(unsigned int nMaxOrphans) EXCLUSIVE_LOCKS_REQUIRE } - - - - - -bool IsStandardTx(const CTransaction& tx, string& reason) +bool IsStandardTx(const CTransaction& tx, string& reason, const int nHeight) { - if (tx.nVersion > CTransaction::MAX_CURRENT_VERSION || tx.nVersion < CTransaction::MIN_CURRENT_VERSION) { - reason = "version"; - return false; + bool isOverwinter = NetworkUpgradeActive(nHeight, Params().GetConsensus(), Consensus::UPGRADE_OVERWINTER); + + if (isOverwinter) { + // Overwinter standard rules apply + if (tx.nVersion > CTransaction::OVERWINTER_MAX_CURRENT_VERSION || tx.nVersion < CTransaction::OVERWINTER_MIN_CURRENT_VERSION) { + reason = "overwinter-version"; + return false; + } + } else { + // Sprout standard rules apply + if (tx.nVersion > CTransaction::SPROUT_MAX_CURRENT_VERSION || tx.nVersion < CTransaction::SPROUT_MIN_CURRENT_VERSION) { + reason = "version"; + return false; + } } BOOST_FOREACH(const CTxIn& txin, tx.vin) @@ -840,6 +846,50 @@ unsigned int GetP2SHSigOpCount(const CTransaction& tx, const CCoinsViewCache& in return nSigOps; } +/** + * Check a transaction contextually against a set of consensus rules valid at a given block height. + * + * Notes: + * 1. AcceptToMemoryPool calls CheckTransaction and this function. + * 2. ProcessNewBlock calls AcceptBlock, which calls CheckBlock (which calls CheckTransaction) + * and ContextualCheckBlock (which calls this function). + */ +bool ContextualCheckTransaction(const CTransaction& tx, CValidationState &state, const int nHeight, const int dosLevel) +{ + bool isOverwinter = NetworkUpgradeActive(nHeight, Params().GetConsensus(), Consensus::UPGRADE_OVERWINTER); + bool isSprout = !isOverwinter; + + // If Sprout rules apply, reject transactions which are intended for Overwinter and beyond + if (isSprout && tx.fOverwintered) { + return state.DoS(dosLevel, error("ContextualCheckTransaction(): overwinter is not active yet"), + REJECT_INVALID, "tx-overwinter-not-active"); + } + + // If Overwinter rules apply: + if (isOverwinter) { + // Reject transactions with valid version but missing overwinter flag + if (tx.nVersion >= OVERWINTER_MIN_TX_VERSION && !tx.fOverwintered) { + return state.DoS(dosLevel, error("ContextualCheckTransaction(): overwinter flag must be set"), + REJECT_INVALID, "tx-overwinter-flag-not-set"); + } + + // Reject transactions with invalid version + if (tx.fOverwintered && tx.nVersion > OVERWINTER_MAX_TX_VERSION ) { + return state.DoS(100, error("CheckTransaction(): overwinter version too high"), + REJECT_INVALID, "bad-tx-overwinter-version-too-high"); + } + + // Reject transactions intended for Sprout + if (!tx.fOverwintered) { + return state.DoS(dosLevel, error("ContextualCheckTransaction: overwinter is active"), + REJECT_INVALID, "tx-overwinter-active"); + } + } + + return true; +} + + bool CheckTransaction(const CTransaction& tx, CValidationState &state, libzcash::ProofVerifier& verifier) { @@ -866,11 +916,46 @@ bool CheckTransactionWithoutProofVerification(const CTransaction& tx, CValidatio { // Basic checks that don't depend on any context - // Check transaction version - if (tx.nVersion < MIN_TX_VERSION) { + /** + * Previously: + * 1. The consensus rule below was: + * if (tx.nVersion < SPROUT_MIN_TX_VERSION) { ... } + * which checked if tx.nVersion fell within the range: + * INT32_MIN <= tx.nVersion < SPROUT_MIN_TX_VERSION + * 2. The parser allowed tx.nVersion to be negative + * + * Now: + * 1. The consensus rule checks to see if tx.Version falls within the range: + * 0 <= tx.nVersion < SPROUT_MIN_TX_VERSION + * 2. The previous consensus rule checked for negative values within the range: + * INT32_MIN <= tx.nVersion < 0 + * This is unnecessary for Overwinter transactions since the parser now + * interprets the sign bit as fOverwintered, so tx.nVersion is always >=0, + * and when Overwinter is not active ContextualCheckTransaction rejects + * transactions with fOverwintered set. When fOverwintered is set, + * this function and ContextualCheckTransaction will together check to + * ensure tx.nVersion avoids the following ranges: + * 0 <= tx.nVersion < OVERWINTER_MIN_TX_VERSION + * OVERWINTER_MAX_TX_VERSION < tx.nVersion <= INT32_MAX + */ + if (!tx.fOverwintered && tx.nVersion < SPROUT_MIN_TX_VERSION) { return state.DoS(100, error("CheckTransaction(): version too low"), REJECT_INVALID, "bad-txns-version-too-low"); } + else if (tx.fOverwintered) { + if (tx.nVersion < OVERWINTER_MIN_TX_VERSION) { + return state.DoS(100, error("CheckTransaction(): overwinter version too low"), + REJECT_INVALID, "bad-tx-overwinter-version-too-low"); + } + if (tx.nVersionGroupId != OVERWINTER_VERSION_GROUP_ID) { + return state.DoS(100, error("CheckTransaction(): unknown tx version group id"), + REJECT_INVALID, "bad-tx-version-group-id"); + } + if (tx.nExpiryHeight >= TX_EXPIRY_HEIGHT_THRESHOLD) { + return state.DoS(100, error("CheckTransaction(): expiry height is too high"), + REJECT_INVALID, "bad-tx-expiry-height-too-high"); + } + } // Transactions can contain empty `vin` and `vout` so long as // `vjoinsplit` is non-empty. @@ -1078,6 +1163,13 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa if (!CheckTransaction(tx, state, verifier)) return error("AcceptToMemoryPool: CheckTransaction failed"); + // DoS level set to 10 to be more forgiving. + // Check transaction contextually against the set of consensus rules which apply in the next block to be mined. + int nextBlockHeight = chainActive.Height() + 1; + if (!ContextualCheckTransaction(tx, state, nextBlockHeight, 10)) { + return error("AcceptToMemoryPool: ContextualCheckTransaction failed"); + } + // Coinbase is only valid in a block, not as a loose transaction if (tx.IsCoinBase()) return state.DoS(100, error("AcceptToMemoryPool: coinbase as individual tx"), @@ -1085,7 +1177,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa // Rather not work on nonstandard transactions (unless -testnet/-regtest) string reason; - if (Params().RequireStandard() && !IsStandardTx(tx, reason)) + if (Params().RequireStandard() && !IsStandardTx(tx, reason, nextBlockHeight)) return state.DoS(0, error("AcceptToMemoryPool: nonstandard transaction: %s", reason), REJECT_NONSTANDARD, reason); @@ -3133,6 +3225,12 @@ bool ContextualCheckBlock(const CBlock& block, CValidationState& state, CBlockIn // Check that all transactions are finalized BOOST_FOREACH(const CTransaction& tx, block.vtx) { + + // Check transaction contextually against consensus rules at block height + if (!ContextualCheckTransaction(tx, state, nHeight, 100)) { + return false; // Failure reason has been set in validation state object + } + int nLockTimeFlags = 0; int64_t nLockTimeCutoff = (nLockTimeFlags & LOCKTIME_MEDIAN_TIME_PAST) ? pindexPrev->GetMedianTimePast() @@ -5735,3 +5833,22 @@ public: mapOrphanTransactionsByPrev.clear(); } } instance_of_cmaincleanup; + + +// Set default values of new CMutableTransaction based on consensus rules at given height. +CMutableTransaction CreateNewContextualCMutableTransaction(const Consensus::Params& consensusParams, int nHeight) +{ + CMutableTransaction mtx; + + bool isOverwintered = NetworkUpgradeActive(nHeight, consensusParams, Consensus::UPGRADE_OVERWINTER); + if (isOverwintered) { + mtx.fOverwintered = true; + mtx.nVersionGroupId = OVERWINTER_VERSION_GROUP_ID; + mtx.nVersion = 3; + // Expiry height is not set. Only fields required for a parser to treat as a valid Overwinter V3 tx. + + // TODO: In future, when moving from Overwinter to Sapling, it will be useful + // to set the expiry height to: min(activation_height - 1, default_expiry_height) + } + return mtx; +} diff --git a/src/main.h b/src/main.h index 03b0464eb..150211d15 100644 --- a/src/main.h +++ b/src/main.h @@ -15,6 +15,7 @@ #include "chainparams.h" #include "coins.h" #include "consensus/consensus.h" +#include "consensus/upgrades.h" #include "net.h" #include "primitives/block.h" #include "primitives/transaction.h" @@ -332,6 +333,9 @@ bool ContextualCheckInputs(const CTransaction& tx, CValidationState &state, cons unsigned int flags, bool cacheStore, const Consensus::Params& consensusParams, std::vector *pvChecks = NULL); +/** Check a transaction contextually against a set of consensus rules */ +bool ContextualCheckTransaction(const CTransaction& tx, CValidationState &state, int nHeight, int dosLevel); + /** Apply the effects of this transaction on the UTXO set represented by view */ void UpdateCoins(const CTransaction& tx, CValidationState &state, CCoinsViewCache &inputs, int nHeight); @@ -342,7 +346,7 @@ bool CheckTransactionWithoutProofVerification(const CTransaction& tx, CValidatio /** Check for standard transaction types * @return True if all outputs (scriptPubKeys) use only standard transaction forms */ -bool IsStandardTx(const CTransaction& tx, std::string& reason); +bool IsStandardTx(const CTransaction& tx, std::string& reason, int nHeight = 0); /** * Check if transaction is final and can be included in a block with the @@ -534,4 +538,7 @@ namespace Consensus { bool CheckTxInputs(const CTransaction& tx, CValidationState& state, const CCoinsViewCache& inputs, int nSpendHeight, const Consensus::Params& consensusParams); } +/** Return a CMutableTransaction with contextual default values based on set of consensus rules at height */ +CMutableTransaction CreateNewContextualCMutableTransaction(const Consensus::Params& consensusParams, int nHeight); + #endif // BITCOIN_MAIN_H diff --git a/src/miner.cpp b/src/miner.cpp index 327228f3f..542cebec8 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -336,7 +336,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) LogPrintf("CreateNewBlock(): total size %u\n", nBlockSize); // Create coinbase tx - CMutableTransaction txNew; + CMutableTransaction txNew = CreateNewContextualCMutableTransaction(chainparams.GetConsensus(), nHeight); txNew.vin.resize(1); txNew.vin[0].prevout.SetNull(); txNew.vout.resize(1); diff --git a/src/primitives/transaction.cpp b/src/primitives/transaction.cpp index 4141bea45..b362d3d6e 100644 --- a/src/primitives/transaction.cpp +++ b/src/primitives/transaction.cpp @@ -146,8 +146,9 @@ std::string CTxOut::ToString() const return strprintf("CTxOut(nValue=%d.%08d, scriptPubKey=%s)", nValue / COIN, nValue % COIN, scriptPubKey.ToString().substr(0,30)); } -CMutableTransaction::CMutableTransaction() : nVersion(CTransaction::MIN_CURRENT_VERSION), nLockTime(0) {} -CMutableTransaction::CMutableTransaction(const CTransaction& tx) : nVersion(tx.nVersion), vin(tx.vin), vout(tx.vout), nLockTime(tx.nLockTime), +CMutableTransaction::CMutableTransaction() : nVersion(CTransaction::SPROUT_MIN_CURRENT_VERSION), fOverwintered(false), nVersionGroupId(0), nExpiryHeight(0), nLockTime(0) {} +CMutableTransaction::CMutableTransaction(const CTransaction& tx) : nVersion(tx.nVersion), fOverwintered(tx.fOverwintered), nVersionGroupId(tx.nVersionGroupId), nExpiryHeight(tx.nExpiryHeight), + vin(tx.vin), vout(tx.vout), nLockTime(tx.nLockTime), vjoinsplit(tx.vjoinsplit), joinSplitPubKey(tx.joinSplitPubKey), joinSplitSig(tx.joinSplitSig) { @@ -163,19 +164,34 @@ void CTransaction::UpdateHash() const *const_cast(&hash) = SerializeHash(*this); } -CTransaction::CTransaction() : nVersion(CTransaction::MIN_CURRENT_VERSION), vin(), vout(), nLockTime(0), vjoinsplit(), joinSplitPubKey(), joinSplitSig() { } +CTransaction::CTransaction() : nVersion(CTransaction::SPROUT_MIN_CURRENT_VERSION), fOverwintered(false), nVersionGroupId(0), nExpiryHeight(0), vin(), vout(), nLockTime(0), vjoinsplit(), joinSplitPubKey(), joinSplitSig() { } -CTransaction::CTransaction(const CMutableTransaction &tx) : nVersion(tx.nVersion), vin(tx.vin), vout(tx.vout), nLockTime(tx.nLockTime), vjoinsplit(tx.vjoinsplit), - joinSplitPubKey(tx.joinSplitPubKey), joinSplitSig(tx.joinSplitSig) +CTransaction::CTransaction(const CMutableTransaction &tx) : nVersion(tx.nVersion), fOverwintered(tx.fOverwintered), nVersionGroupId(tx.nVersionGroupId), nExpiryHeight(tx.nExpiryHeight), + vin(tx.vin), vout(tx.vout), nLockTime(tx.nLockTime), + vjoinsplit(tx.vjoinsplit), joinSplitPubKey(tx.joinSplitPubKey), joinSplitSig(tx.joinSplitSig) { UpdateHash(); } +// Protected constructor which only derived classes can call. +// For developer testing only. +CTransaction::CTransaction( + const CMutableTransaction &tx, + bool evilDeveloperFlag) : nVersion(tx.nVersion), fOverwintered(tx.fOverwintered), nVersionGroupId(tx.nVersionGroupId), nExpiryHeight(tx.nExpiryHeight), + vin(tx.vin), vout(tx.vout), nLockTime(tx.nLockTime), + vjoinsplit(tx.vjoinsplit), joinSplitPubKey(tx.joinSplitPubKey), joinSplitSig(tx.joinSplitSig) +{ + assert(evilDeveloperFlag); +} + CTransaction& CTransaction::operator=(const CTransaction &tx) { + *const_cast(&fOverwintered) = tx.fOverwintered; *const_cast(&nVersion) = tx.nVersion; + *const_cast(&nVersionGroupId) = tx.nVersionGroupId; *const_cast*>(&vin) = tx.vin; *const_cast*>(&vout) = tx.vout; *const_cast(&nLockTime) = tx.nLockTime; + *const_cast(&nExpiryHeight) = tx.nExpiryHeight; *const_cast*>(&vjoinsplit) = tx.vjoinsplit; *const_cast(&joinSplitPubKey) = tx.joinSplitPubKey; *const_cast(&joinSplitSig) = tx.joinSplitSig; @@ -248,12 +264,24 @@ unsigned int CTransaction::CalculateModifiedSize(unsigned int nTxSize) const std::string CTransaction::ToString() const { std::string str; - str += strprintf("CTransaction(hash=%s, ver=%d, vin.size=%u, vout.size=%u, nLockTime=%u)\n", - GetHash().ToString().substr(0,10), - nVersion, - vin.size(), - vout.size(), - nLockTime); + if (!fOverwintered) { + str += strprintf("CTransaction(hash=%s, ver=%d, vin.size=%u, vout.size=%u, nLockTime=%u)\n", + GetHash().ToString().substr(0,10), + nVersion, + vin.size(), + vout.size(), + nLockTime); + } else if (nVersion >= 3) { + str += strprintf("CTransaction(hash=%s, ver=%d, fOverwintered=%d, nVersionGroupId=%08x, vin.size=%u, vout.size=%u, nLockTime=%u, nExpiryHeight=%u)\n", + GetHash().ToString().substr(0,10), + nVersion, + fOverwintered, + nVersionGroupId, + vin.size(), + vout.size(), + nLockTime, + nExpiryHeight); + } for (unsigned int i = 0; i < vin.size(); i++) str += " " + vin[i].ToString() + "\n"; for (unsigned int i = 0; i < vout.size(); i++) diff --git a/src/primitives/transaction.h b/src/primitives/transaction.h index f9723e399..28347d6a5 100644 --- a/src/primitives/transaction.h +++ b/src/primitives/transaction.h @@ -304,6 +304,13 @@ public: std::string ToString() const; }; +// The maximum value which is valid for expiry height, used by CTransaction and CMutableTransaction +static constexpr uint32_t TX_EXPIRY_HEIGHT_THRESHOLD = 500000000; + +// Overwinter version group id +static constexpr uint32_t OVERWINTER_VERSION_GROUP_ID = 0x03C48270; +static_assert(OVERWINTER_VERSION_GROUP_ID != 0, "version group id must be non-zero as specified in ZIP 202"); + struct CMutableTransaction; /** The basic transaction that is broadcasted on the network and contained in @@ -316,14 +323,29 @@ private: const uint256 hash; void UpdateHash() const; +protected: + /** Developer testing only. Set evilDeveloperFlag to true. + * Convert a CMutableTransaction into a CTransaction without invoking UpdateHash() + */ + CTransaction(const CMutableTransaction &tx, bool evilDeveloperFlag); + public: typedef boost::array joinsplit_sig_t; - // Transactions that include a list of JoinSplits are version 2. - static const int32_t MIN_CURRENT_VERSION = 1; - static const int32_t MAX_CURRENT_VERSION = 2; + // Transactions that include a list of JoinSplits are >= version 2. + static const int32_t SPROUT_MIN_CURRENT_VERSION = 1; + static const int32_t SPROUT_MAX_CURRENT_VERSION = 2; + static const int32_t OVERWINTER_MIN_CURRENT_VERSION = 3; + static const int32_t OVERWINTER_MAX_CURRENT_VERSION = 3; - static_assert(MIN_CURRENT_VERSION >= MIN_TX_VERSION, + static_assert(SPROUT_MIN_CURRENT_VERSION >= SPROUT_MIN_TX_VERSION, + "standard rule for tx version should be consistent with network rule"); + + static_assert(OVERWINTER_MIN_CURRENT_VERSION >= OVERWINTER_MIN_TX_VERSION, + "standard rule for tx version should be consistent with network rule"); + + static_assert( (OVERWINTER_MAX_CURRENT_VERSION <= OVERWINTER_MAX_TX_VERSION && + OVERWINTER_MAX_CURRENT_VERSION >= OVERWINTER_MIN_CURRENT_VERSION), "standard rule for tx version should be consistent with network rule"); // The local variables are made const to prevent unintended modification @@ -331,10 +353,13 @@ public: // actually immutable; deserialization and assignment are implemented, // and bypass the constness. This is safe, as they update the entire // structure, including the hash. + const bool fOverwintered; const int32_t nVersion; + const uint32_t nVersionGroupId; const std::vector vin; const std::vector vout; const uint32_t nLockTime; + const uint32_t nExpiryHeight; const std::vector vjoinsplit; const uint256 joinSplitPubKey; const joinsplit_sig_t joinSplitSig = {{0}}; @@ -351,11 +376,39 @@ public: template inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { - READWRITE(*const_cast(&this->nVersion)); + if (ser_action.ForRead()) { + // When deserializing, unpack the 4 byte header to extract fOverwintered and nVersion. + uint32_t header; + READWRITE(header); + *const_cast(&fOverwintered) = header >> 31; + *const_cast(&this->nVersion) = header & 0x7FFFFFFF; + } else { + // When serializing v1 and v2, the 4 byte header is nVersion + uint32_t header = this->nVersion; + // When serializing Overwintered tx, the 4 byte header is the combination of fOverwintered and nVersion + if (fOverwintered) { + header |= 1 << 31; + } + READWRITE(header); + } nVersion = this->nVersion; + if (fOverwintered) { + READWRITE(*const_cast(&this->nVersionGroupId)); + } + + bool isOverwinterV3 = fOverwintered && + nVersionGroupId == OVERWINTER_VERSION_GROUP_ID && + nVersion == 3; + if (fOverwintered && !isOverwinterV3) { + throw std::ios_base::failure("Unknown transaction format"); + } + READWRITE(*const_cast*>(&vin)); READWRITE(*const_cast*>(&vout)); READWRITE(*const_cast(&nLockTime)); + if (isOverwinterV3) { + READWRITE(*const_cast(&nExpiryHeight)); + } if (nVersion >= 2) { READWRITE(*const_cast*>(&vjoinsplit)); if (vjoinsplit.size() > 0) { @@ -410,10 +463,13 @@ public: /** A mutable version of CTransaction. */ struct CMutableTransaction { + bool fOverwintered; int32_t nVersion; + uint32_t nVersionGroupId; std::vector vin; std::vector vout; uint32_t nLockTime; + uint32_t nExpiryHeight; std::vector vjoinsplit; uint256 joinSplitPubKey; CTransaction::joinsplit_sig_t joinSplitSig = {{0}}; @@ -425,11 +481,39 @@ struct CMutableTransaction template inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { - READWRITE(this->nVersion); + if (ser_action.ForRead()) { + // When deserializing, unpack the 4 byte header to extract fOverwintered and nVersion. + uint32_t header; + READWRITE(header); + fOverwintered = header >> 31; + this->nVersion = header & 0x7FFFFFFF; + } else { + // When serializing v1 and v2, the 4 byte header is nVersion + uint32_t header = this->nVersion; + // When serializing Overwintered tx, the 4 byte header is the combination of fOverwintered and nVersion + if (fOverwintered) { + header |= 1 << 31; + } + READWRITE(header); + } nVersion = this->nVersion; + if (fOverwintered) { + READWRITE(nVersionGroupId); + } + + bool isOverwinterV3 = fOverwintered && + nVersionGroupId == OVERWINTER_VERSION_GROUP_ID && + nVersion == 3; + if (fOverwintered && !isOverwinterV3) { + throw std::ios_base::failure("Unknown transaction format"); + } + READWRITE(vin); READWRITE(vout); READWRITE(nLockTime); + if (isOverwinterV3) { + READWRITE(nExpiryHeight); + } if (nVersion >= 2) { READWRITE(vjoinsplit); if (vjoinsplit.size() > 0) { diff --git a/src/rpcrawtransaction.cpp b/src/rpcrawtransaction.cpp index bd9b866c2..48a30fbd6 100644 --- a/src/rpcrawtransaction.cpp +++ b/src/rpcrawtransaction.cpp @@ -113,8 +113,15 @@ UniValue TxJoinSplitToJSON(const CTransaction& tx) { void TxToJSON(const CTransaction& tx, const uint256 hashBlock, UniValue& entry) { entry.push_back(Pair("txid", tx.GetHash().GetHex())); + entry.push_back(Pair("overwintered", tx.fOverwintered)); entry.push_back(Pair("version", tx.nVersion)); + if (tx.fOverwintered) { + entry.push_back(Pair("versiongroupid", HexInt(tx.nVersionGroupId))); + } entry.push_back(Pair("locktime", (int64_t)tx.nLockTime)); + if (tx.fOverwintered) { + entry.push_back(Pair("expiryheight", (int64_t)tx.nExpiryHeight)); + } UniValue vin(UniValue::VARR); BOOST_FOREACH(const CTxIn& txin, tx.vin) { UniValue in(UniValue::VOBJ); @@ -435,7 +442,8 @@ UniValue createrawtransaction(const UniValue& params, bool fHelp) UniValue inputs = params[0].get_array(); UniValue sendTo = params[1].get_obj(); - CMutableTransaction rawTx; + CMutableTransaction rawTx = CreateNewContextualCMutableTransaction( + Params().GetConsensus(), chainActive.Height() + 1); for (size_t idx = 0; idx < inputs.size(); idx++) { const UniValue& input = inputs[idx]; @@ -488,8 +496,11 @@ UniValue decoderawtransaction(const UniValue& params, bool fHelp) "\nResult:\n" "{\n" " \"txid\" : \"id\", (string) The transaction id\n" + " \"overwintered\" : bool (boolean) The Overwintered flag\n" " \"version\" : n, (numeric) The version\n" + " \"versiongroupid\": \"hex\" (string, optional) The version group id (Overwintered txs)\n" " \"locktime\" : ttt, (numeric) The lock time\n" + " \"expiryheight\" : n, (numeric, optional) Last valid block height for mining transaction (Overwintered txs)\n" " \"vin\" : [ (array of json objects)\n" " {\n" " \"txid\": \"id\", (string) The transaction id\n" diff --git a/src/test/rpc_tests.cpp b/src/test/rpc_tests.cpp index c2b29ab67..184b9d54e 100644 --- a/src/test/rpc_tests.cpp +++ b/src/test/rpc_tests.cpp @@ -7,6 +7,7 @@ #include "base58.h" #include "netbase.h" +#include "utilstrencodings.h" #include "test/test_bitcoin.h" @@ -295,4 +296,44 @@ BOOST_AUTO_TEST_CASE(rpc_ban) BOOST_CHECK_EQUAL(adr.get_str(), "2001:4d48:ac57:400:cacf:e9ff:fe1d:9c63/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"); } + +BOOST_AUTO_TEST_CASE(rpc_raw_create_overwinter_v3) +{ + SelectParams(CBaseChainParams::REGTEST); + UpdateNetworkUpgradeParameters(Consensus::UPGRADE_OVERWINTER, Consensus::NetworkUpgrade::ALWAYS_ACTIVE); + + // Sample regtest address: + // public: tmHU5HLMu3yS8eoNvbrU1NWeJaGf6jxehru + // private: cW1G4SxEm5rui2RQtBcSUZrERTVYPtyZXKbSi5MCwBqzbn5kqwbN + + UniValue r; + std::string prevout = + "[{\"txid\":\"b4cc287e58f87cdae59417329f710f3ecd75a4ee1d2872b7248f50977c8493f3\"," + "\"vout\":1}]"; + r = CallRPC(string("createrawtransaction ") + prevout + " " + + "{\"tmHU5HLMu3yS8eoNvbrU1NWeJaGf6jxehru\":11}"); + std::string rawhex = r.get_str(); + BOOST_CHECK_NO_THROW(r = CallRPC(string("decoderawtransaction ") + rawhex)); + BOOST_CHECK_EQUAL(find_value(r.get_obj(), "overwintered").get_bool(), true); + BOOST_CHECK_EQUAL(find_value(r.get_obj(), "version").get_int(), 3); + BOOST_CHECK_EQUAL(find_value(r.get_obj(), "expiryheight").get_int(), 0); + BOOST_CHECK_EQUAL( + ParseHexToUInt32(find_value(r.get_obj(), "versiongroupid").get_str()), + OVERWINTER_VERSION_GROUP_ID); + + // Sanity check we can deserialize the raw hex + // 030000807082c40301f393847c97508f24b772281deea475cd3e0f719f321794e5da7cf8587e28ccb40100000000ffffffff0100ab9041000000001976a914550dc92d3ff8d1f0cb6499fddf2fe43b745330cd88ac000000000000000000 + CDataStream ss(ParseHex(rawhex), SER_DISK, PROTOCOL_VERSION); + CTransaction tx; + ss >> tx; + CDataStream ss2(ParseHex(rawhex), SER_DISK, PROTOCOL_VERSION); + CMutableTransaction mtx; + ss2 >> mtx; + BOOST_CHECK_EQUAL(tx.GetHash().GetHex(), CTransaction(mtx).GetHash().GetHex()); + + // Revert to default + UpdateNetworkUpgradeParameters(Consensus::UPGRADE_OVERWINTER, Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT); +} + + BOOST_AUTO_TEST_SUITE_END() diff --git a/src/test/rpc_wallet_tests.cpp b/src/test/rpc_wallet_tests.cpp index e444eb2a5..3b563de54 100644 --- a/src/test/rpc_wallet_tests.cpp +++ b/src/test/rpc_wallet_tests.cpp @@ -908,28 +908,36 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_parameters) BOOST_CHECK_THROW(CallRPC(string("z_sendmany tmRr6yJonqGK23UVhrKuyvTpF8qxQQjKigJ ") + "[{\"address\":\"" + zaddr1 + "\", \"amount\":123.456}]"), runtime_error); + // Mutable tx containing contextual information we need to build tx + UniValue retValue = CallRPC("getblockcount"); + int nHeight = retValue.get_int(); + CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), nHeight + 1); + if (mtx.nVersion == 1) { + mtx.nVersion = 2; + } + // Test constructor of AsyncRPCOperation_sendmany try { - std::shared_ptr operation(new AsyncRPCOperation_sendmany("",{}, {}, -1)); + std::shared_ptr operation(new AsyncRPCOperation_sendmany(mtx, "",{}, {}, -1)); } catch (const UniValue& objError) { BOOST_CHECK( find_error(objError, "Minconf cannot be negative")); } try { - std::shared_ptr operation(new AsyncRPCOperation_sendmany("",{}, {}, 1)); + std::shared_ptr operation(new AsyncRPCOperation_sendmany(mtx, "",{}, {}, 1)); } catch (const UniValue& objError) { BOOST_CHECK( find_error(objError, "From address parameter missing")); } try { - std::shared_ptr operation( new AsyncRPCOperation_sendmany("tmRr6yJonqGK23UVhrKuyvTpF8qxQQjKigJ", {}, {}, 1) ); + std::shared_ptr operation( new AsyncRPCOperation_sendmany(mtx, "tmRr6yJonqGK23UVhrKuyvTpF8qxQQjKigJ", {}, {}, 1) ); } catch (const UniValue& objError) { BOOST_CHECK( find_error(objError, "No recipients")); } try { std::vector recipients = { SendManyRecipient("dummy",1.0, "") }; - std::shared_ptr operation( new AsyncRPCOperation_sendmany("INVALID", recipients, {}, 1) ); + std::shared_ptr operation( new AsyncRPCOperation_sendmany(mtx, "INVALID", recipients, {}, 1) ); } catch (const UniValue& objError) { BOOST_CHECK( find_error(objError, "payment address is invalid")); } @@ -937,7 +945,7 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_parameters) // Testnet payment addresses begin with 'zt'. This test detects an incorrect prefix. try { std::vector recipients = { SendManyRecipient("dummy",1.0, "") }; - std::shared_ptr operation( new AsyncRPCOperation_sendmany("zcMuhvq8sEkHALuSU2i4NbNQxshSAYrpCExec45ZjtivYPbuiFPwk6WHy4SvsbeZ4siy1WheuRGjtaJmoD1J8bFqNXhsG6U", recipients, {}, 1) ); + std::shared_ptr operation( new AsyncRPCOperation_sendmany(mtx, "zcMuhvq8sEkHALuSU2i4NbNQxshSAYrpCExec45ZjtivYPbuiFPwk6WHy4SvsbeZ4siy1WheuRGjtaJmoD1J8bFqNXhsG6U", recipients, {}, 1) ); } catch (const UniValue& objError) { BOOST_CHECK( find_error(objError, "payment address is for wrong network type")); } @@ -946,7 +954,7 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_parameters) // invokes a method on pwalletMain, which is undefined in the google test environment. try { std::vector recipients = { SendManyRecipient("dummy",1.0, "") }; - std::shared_ptr operation( new AsyncRPCOperation_sendmany("ztjiDe569DPNbyTE6TSdJTaSDhoXEHLGvYoUnBU1wfVNU52TEyT6berYtySkd21njAeEoh8fFJUT42kua9r8EnhBaEKqCpP", recipients, {}, 1) ); + std::shared_ptr operation( new AsyncRPCOperation_sendmany(mtx, "ztjiDe569DPNbyTE6TSdJTaSDhoXEHLGvYoUnBU1wfVNU52TEyT6berYtySkd21njAeEoh8fFJUT42kua9r8EnhBaEKqCpP", recipients, {}, 1) ); } catch (const UniValue& objError) { BOOST_CHECK( find_error(objError, "no spending key found for zaddr")); } @@ -962,6 +970,14 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_internals) UniValue retValue; + // Mutable tx containing contextual information we need to build tx + retValue = CallRPC("getblockcount"); + int nHeight = retValue.get_int(); + CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), nHeight + 1); + if (mtx.nVersion == 1) { + mtx.nVersion = 2; + } + // add keys manually BOOST_CHECK_NO_THROW(retValue = CallRPC("getnewaddress")); std::string taddr1 = retValue.get_str(); @@ -971,7 +987,7 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_internals) // there are no utxos to spend { std::vector recipients = { SendManyRecipient(zaddr1,100.0, "DEADBEEF") }; - std::shared_ptr operation( new AsyncRPCOperation_sendmany(taddr1, {}, recipients, 1) ); + std::shared_ptr operation( new AsyncRPCOperation_sendmany(mtx, taddr1, {}, recipients, 1) ); operation->main(); BOOST_CHECK(operation->isFailed()); std::string msg = operation->getErrorMessage(); @@ -982,7 +998,7 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_internals) { try { std::vector recipients = {SendManyRecipient(taddr1, 100.0, "DEADBEEF")}; - std::shared_ptr operation(new AsyncRPCOperation_sendmany(zaddr1, recipients, {}, 0)); + std::shared_ptr operation(new AsyncRPCOperation_sendmany(mtx, zaddr1, recipients, {}, 0)); BOOST_CHECK(false); // Fail test if an exception is not thrown } catch (const UniValue& objError) { BOOST_CHECK(find_error(objError, "Minconf cannot be zero when sending from zaddr")); @@ -993,7 +1009,7 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_internals) // there are no unspent notes to spend { std::vector recipients = { SendManyRecipient(taddr1,100.0, "DEADBEEF") }; - std::shared_ptr operation( new AsyncRPCOperation_sendmany(zaddr1, recipients, {}, 1) ); + std::shared_ptr operation( new AsyncRPCOperation_sendmany(mtx, zaddr1, recipients, {}, 1) ); operation->main(); BOOST_CHECK(operation->isFailed()); std::string msg = operation->getErrorMessage(); @@ -1003,7 +1019,7 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_internals) // get_memo_from_hex_string()) { std::vector recipients = { SendManyRecipient(zaddr1,100.0, "DEADBEEF") }; - std::shared_ptr operation( new AsyncRPCOperation_sendmany(zaddr1, recipients, {}, 1) ); + std::shared_ptr operation( new AsyncRPCOperation_sendmany(mtx, zaddr1, recipients, {}, 1) ); std::shared_ptr ptr = std::dynamic_pointer_cast (operation); TEST_FRIEND_AsyncRPCOperation_sendmany proxy(ptr); @@ -1054,7 +1070,7 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_internals) // add_taddr_change_output_to_tx() will append a vout to a raw transaction { std::vector recipients = { SendManyRecipient(zaddr1,100.0, "DEADBEEF") }; - std::shared_ptr operation( new AsyncRPCOperation_sendmany(zaddr1, recipients, {}, 1) ); + std::shared_ptr operation( new AsyncRPCOperation_sendmany(mtx, zaddr1, recipients, {}, 1) ); std::shared_ptr ptr = std::dynamic_pointer_cast (operation); TEST_FRIEND_AsyncRPCOperation_sendmany proxy(ptr); @@ -1083,7 +1099,7 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_internals) SendManyRecipient("tmUSbHz3vxnwLvRyNDXbwkZxjVyDodMJEhh",CAmount(4.56), ""), SendManyRecipient("tmYZAXYPCP56Xa5JQWWPZuK7o7bfUQW6kkd",CAmount(7.89), ""), }; - std::shared_ptr operation( new AsyncRPCOperation_sendmany(zaddr1, recipients, {}, 1) ); + std::shared_ptr operation( new AsyncRPCOperation_sendmany(mtx, zaddr1, recipients, {}, 1) ); std::shared_ptr ptr = std::dynamic_pointer_cast (operation); TEST_FRIEND_AsyncRPCOperation_sendmany proxy(ptr); @@ -1106,7 +1122,7 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_internals) // we have the spending key for the dummy recipient zaddr1 std::vector recipients = { SendManyRecipient(zaddr1, 0.0005, "ABCD") }; - std::shared_ptr operation( new AsyncRPCOperation_sendmany(zaddr1, {}, recipients, 1) ); + std::shared_ptr operation( new AsyncRPCOperation_sendmany(mtx, zaddr1, {}, recipients, 1) ); std::shared_ptr ptr = std::dynamic_pointer_cast (operation); TEST_FRIEND_AsyncRPCOperation_sendmany proxy(ptr); @@ -1131,7 +1147,7 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_internals) // Dummy input so the operation object can be instantiated. std::vector recipients = { SendManyRecipient(zaddr1, 0.0005, "ABCD") }; - std::shared_ptr operation( new AsyncRPCOperation_sendmany(zaddr1, {}, recipients, 1) ); + std::shared_ptr operation( new AsyncRPCOperation_sendmany(mtx, zaddr1, {}, recipients, 1) ); std::shared_ptr ptr = std::dynamic_pointer_cast (operation); TEST_FRIEND_AsyncRPCOperation_sendmany proxy(ptr); @@ -1286,18 +1302,26 @@ BOOST_AUTO_TEST_CASE(rpc_z_shieldcoinbase_parameters) "100 -1" ), runtime_error); + // Mutable tx containing contextual information we need to build tx + UniValue retValue = CallRPC("getblockcount"); + int nHeight = retValue.get_int(); + CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), nHeight + 1); + if (mtx.nVersion == 1) { + mtx.nVersion = 2; + } + // Test constructor of AsyncRPCOperation_sendmany std::string testnetzaddr = "ztjiDe569DPNbyTE6TSdJTaSDhoXEHLGvYoUnBU1wfVNU52TEyT6berYtySkd21njAeEoh8fFJUT42kua9r8EnhBaEKqCpP"; std::string mainnetzaddr = "zcMuhvq8sEkHALuSU2i4NbNQxshSAYrpCExec45ZjtivYPbuiFPwk6WHy4SvsbeZ4siy1WheuRGjtaJmoD1J8bFqNXhsG6U"; try { - std::shared_ptr operation(new AsyncRPCOperation_shieldcoinbase({}, testnetzaddr, -1 )); + std::shared_ptr operation(new AsyncRPCOperation_shieldcoinbase(mtx, {}, testnetzaddr, -1 )); } catch (const UniValue& objError) { BOOST_CHECK( find_error(objError, "Fee is out of range")); } try { - std::shared_ptr operation(new AsyncRPCOperation_shieldcoinbase({}, testnetzaddr, 1)); + std::shared_ptr operation(new AsyncRPCOperation_shieldcoinbase(mtx, {}, testnetzaddr, 1)); } catch (const UniValue& objError) { BOOST_CHECK( find_error(objError, "Empty inputs")); } @@ -1305,7 +1329,7 @@ BOOST_AUTO_TEST_CASE(rpc_z_shieldcoinbase_parameters) // Testnet payment addresses begin with 'zt'. This test detects an incorrect prefix. try { std::vector inputs = { ShieldCoinbaseUTXO{uint256(),0,0} }; - std::shared_ptr operation( new AsyncRPCOperation_shieldcoinbase(inputs, mainnetzaddr, 1) ); + std::shared_ptr operation( new AsyncRPCOperation_shieldcoinbase(mtx, inputs, mainnetzaddr, 1) ); } catch (const UniValue& objError) { BOOST_CHECK( find_error(objError, "payment address is for wrong network type")); } @@ -1320,8 +1344,14 @@ BOOST_AUTO_TEST_CASE(rpc_z_shieldcoinbase_internals) LOCK(pwalletMain->cs_wallet); - UniValue retValue; - + // Mutable tx containing contextual information we need to build tx + UniValue retValue = CallRPC("getblockcount"); + int nHeight = retValue.get_int(); + CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), nHeight + 1); + if (mtx.nVersion == 1) { + mtx.nVersion = 2; + } + // Test that option -mempooltxinputlimit is respected. mapArgs["-mempooltxinputlimit"] = "1"; @@ -1332,7 +1362,7 @@ BOOST_AUTO_TEST_CASE(rpc_z_shieldcoinbase_internals) // Supply 2 inputs when mempool limit is 1 { std::vector inputs = { ShieldCoinbaseUTXO{uint256(),0,0}, ShieldCoinbaseUTXO{uint256(),0,0} }; - std::shared_ptr operation( new AsyncRPCOperation_shieldcoinbase(inputs, zaddr) ); + std::shared_ptr operation( new AsyncRPCOperation_shieldcoinbase(mtx, inputs, zaddr) ); operation->main(); BOOST_CHECK(operation->isFailed()); std::string msg = operation->getErrorMessage(); @@ -1342,7 +1372,7 @@ BOOST_AUTO_TEST_CASE(rpc_z_shieldcoinbase_internals) // Insufficient funds { std::vector inputs = { ShieldCoinbaseUTXO{uint256(),0,0} }; - std::shared_ptr operation( new AsyncRPCOperation_shieldcoinbase(inputs, zaddr) ); + std::shared_ptr operation( new AsyncRPCOperation_shieldcoinbase(mtx, inputs, zaddr) ); operation->main(); BOOST_CHECK(operation->isFailed()); std::string msg = operation->getErrorMessage(); @@ -1353,7 +1383,7 @@ BOOST_AUTO_TEST_CASE(rpc_z_shieldcoinbase_internals) { // Dummy input so the operation object can be instantiated. std::vector inputs = { ShieldCoinbaseUTXO{uint256(),0,100000} }; - std::shared_ptr operation( new AsyncRPCOperation_shieldcoinbase(inputs, zaddr) ); + std::shared_ptr operation( new AsyncRPCOperation_shieldcoinbase(mtx, inputs, zaddr) ); std::shared_ptr ptr = std::dynamic_pointer_cast (operation); TEST_FRIEND_AsyncRPCOperation_shieldcoinbase proxy(ptr); static_cast(operation.get())->testmode = true; diff --git a/src/test/sighash_tests.cpp b/src/test/sighash_tests.cpp index c33eab17e..13d3dd226 100644 --- a/src/test/sighash_tests.cpp +++ b/src/test/sighash_tests.cpp @@ -234,7 +234,7 @@ BOOST_AUTO_TEST_CASE(sighash_from_data) stream >> tx; CValidationState state; - if (tx.nVersion < MIN_TX_VERSION) { + if (tx.nVersion < SPROUT_MIN_TX_VERSION) { // Transaction must be invalid BOOST_CHECK_MESSAGE(!CheckTransactionWithoutProofVerification(tx, state), strTest); BOOST_CHECK(!state.IsValid()); diff --git a/src/utilstrencodings.cpp b/src/utilstrencodings.cpp index 4648eb0bb..0a5fbb3d2 100644 --- a/src/utilstrencodings.cpp +++ b/src/utilstrencodings.cpp @@ -54,6 +54,13 @@ std::string HexInt(uint32_t val) return ss.str(); } +uint32_t ParseHexToUInt32(const std::string& str) { + std::istringstream converter(str); + uint32_t value; + converter >> std::hex >> value; + return value; +} + const signed char p_util_hexdigit[256] = { -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, diff --git a/src/utilstrencodings.h b/src/utilstrencodings.h index 173bbefd0..ccdc6a76b 100644 --- a/src/utilstrencodings.h +++ b/src/utilstrencodings.h @@ -25,6 +25,7 @@ std::string SanitizeFilename(const std::string& str); std::string SanitizeString(const std::string& str); std::string HexInt(uint32_t val); +uint32_t ParseHexToUInt32(const std::string& str); std::vector ParseHex(const char* psz); std::vector ParseHex(const std::string& str); signed char HexDigit(char c); diff --git a/src/wallet/asyncrpcoperation_sendmany.cpp b/src/wallet/asyncrpcoperation_sendmany.cpp index 59cd3a8fb..7590e468c 100644 --- a/src/wallet/asyncrpcoperation_sendmany.cpp +++ b/src/wallet/asyncrpcoperation_sendmany.cpp @@ -50,14 +50,16 @@ int find_output(UniValue obj, int n) { } AsyncRPCOperation_sendmany::AsyncRPCOperation_sendmany( + CMutableTransaction contextualTx, std::string fromAddress, std::vector tOutputs, std::vector zOutputs, int minDepth, CAmount fee, UniValue contextInfo) : - fromaddress_(fromAddress), t_outputs_(tOutputs), z_outputs_(zOutputs), mindepth_(minDepth), fee_(fee), contextinfo_(contextInfo) + tx_(contextualTx), fromaddress_(fromAddress), t_outputs_(tOutputs), z_outputs_(zOutputs), mindepth_(minDepth), fee_(fee), contextinfo_(contextInfo) { + assert(contextualTx.nVersion >= 2); // transaction format version must support vjoinsplit assert(fee_ >= 0); if (minDepth < 0) { @@ -370,7 +372,6 @@ bool AsyncRPCOperation_sendmany::main_impl() { // Prepare raw transaction to handle JoinSplits CMutableTransaction mtx(tx_); - mtx.nVersion = 2; crypto_sign_keypair(joinSplitPubKey_.begin(), joinSplitPrivKey_); mtx.joinSplitPubKey = joinSplitPubKey_; tx_ = CTransaction(mtx); diff --git a/src/wallet/asyncrpcoperation_sendmany.h b/src/wallet/asyncrpcoperation_sendmany.h index 69bdbe315..83a976af9 100644 --- a/src/wallet/asyncrpcoperation_sendmany.h +++ b/src/wallet/asyncrpcoperation_sendmany.h @@ -51,7 +51,7 @@ struct WitnessAnchorData { class AsyncRPCOperation_sendmany : public AsyncRPCOperation { public: - AsyncRPCOperation_sendmany(std::string fromAddress, std::vector tOutputs, std::vector zOutputs, int minDepth, CAmount fee = ASYNC_RPC_OPERATION_DEFAULT_MINERS_FEE, UniValue contextInfo = NullUniValue); + AsyncRPCOperation_sendmany(CMutableTransaction contextualTx, std::string fromAddress, std::vector tOutputs, std::vector zOutputs, int minDepth, CAmount fee = ASYNC_RPC_OPERATION_DEFAULT_MINERS_FEE, UniValue contextInfo = NullUniValue); virtual ~AsyncRPCOperation_sendmany(); // We don't want to be copied or moved around diff --git a/src/wallet/asyncrpcoperation_shieldcoinbase.cpp b/src/wallet/asyncrpcoperation_shieldcoinbase.cpp index a845c6085..e0d4a1861 100644 --- a/src/wallet/asyncrpcoperation_shieldcoinbase.cpp +++ b/src/wallet/asyncrpcoperation_shieldcoinbase.cpp @@ -52,12 +52,15 @@ static int find_output(UniValue obj, int n) { } AsyncRPCOperation_shieldcoinbase::AsyncRPCOperation_shieldcoinbase( + CMutableTransaction contextualTx, std::vector inputs, std::string toAddress, CAmount fee, UniValue contextInfo) : - inputs_(inputs), fee_(fee), contextinfo_(contextInfo) + tx_(contextualTx), inputs_(inputs), fee_(fee), contextinfo_(contextInfo) { + assert(contextualTx.nVersion >= 2); // transaction format version must support vjoinsplit + if (fee < 0 || fee > MAX_MONEY) { throw JSONRPCError(RPC_INVALID_PARAMETER, "Fee is out of range"); } @@ -213,7 +216,6 @@ bool AsyncRPCOperation_shieldcoinbase::main_impl() { // Prepare raw transaction to handle JoinSplits CMutableTransaction mtx(tx_); - mtx.nVersion = 2; crypto_sign_keypair(joinSplitPubKey_.begin(), joinSplitPrivKey_); mtx.joinSplitPubKey = joinSplitPubKey_; tx_ = CTransaction(mtx); diff --git a/src/wallet/asyncrpcoperation_shieldcoinbase.h b/src/wallet/asyncrpcoperation_shieldcoinbase.h index 379aa5bd7..c7faf28e8 100644 --- a/src/wallet/asyncrpcoperation_shieldcoinbase.h +++ b/src/wallet/asyncrpcoperation_shieldcoinbase.h @@ -42,7 +42,7 @@ struct ShieldCoinbaseJSInfo class AsyncRPCOperation_shieldcoinbase : public AsyncRPCOperation { public: - AsyncRPCOperation_shieldcoinbase(std::vector inputs, std::string toAddress, CAmount fee = SHIELD_COINBASE_DEFAULT_MINERS_FEE, UniValue contextInfo = NullUniValue); + AsyncRPCOperation_shieldcoinbase(CMutableTransaction contextualTx, std::vector inputs, std::string toAddress, CAmount fee = SHIELD_COINBASE_DEFAULT_MINERS_FEE, UniValue contextInfo = NullUniValue); virtual ~AsyncRPCOperation_shieldcoinbase(); // We don't want to be copied or moved around diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index eb5688f60..0d652cfcb 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -3525,9 +3525,16 @@ UniValue z_sendmany(const UniValue& params, bool fHelp) o.push_back(Pair("fee", std::stod(FormatMoney(nFee)))); UniValue contextInfo = o; + // Contextual transaction we will build on + CMutableTransaction contextualTx = CreateNewContextualCMutableTransaction( + Params().GetConsensus(), chainActive.Height() + 1); + if (contextualTx.nVersion == 1) { + contextualTx.nVersion = 2; // Tx format should support vjoinsplits + } + // Create operation and add to global queue std::shared_ptr q = getAsyncRPCQueue(); - std::shared_ptr operation( new AsyncRPCOperation_sendmany(fromaddress, taddrRecipients, zaddrRecipients, nMinDepth, nFee, contextInfo) ); + std::shared_ptr operation( new AsyncRPCOperation_sendmany(contextualTx, fromaddress, taddrRecipients, zaddrRecipients, nMinDepth, nFee, contextInfo) ); q->addOperation(operation); AsyncRPCOperationId operationId = operation->getId(); return operationId; @@ -3709,9 +3716,17 @@ UniValue z_shieldcoinbase(const UniValue& params, bool fHelp) contextInfo.push_back(Pair("toaddress", params[1])); contextInfo.push_back(Pair("fee", ValueFromAmount(nFee))); + // Contextual transaction we will build on + CMutableTransaction contextualTx = CreateNewContextualCMutableTransaction( + Params().GetConsensus(), + chainActive.Height() + 1); + if (contextualTx.nVersion == 1) { + contextualTx.nVersion = 2; // Tx format should support vjoinsplits + } + // Create operation and add to global queue std::shared_ptr q = getAsyncRPCQueue(); - std::shared_ptr operation( new AsyncRPCOperation_shieldcoinbase(inputs, destaddress, nFee, contextInfo) ); + std::shared_ptr operation( new AsyncRPCOperation_shieldcoinbase(contextualTx, inputs, destaddress, nFee, contextInfo) ); q->addOperation(operation); AsyncRPCOperationId operationId = operation->getId(); diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 06dae5e83..b89111458 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -2572,7 +2572,8 @@ bool CWallet::CreateTransaction(const vector& vecSend, CWalletTx& wt wtxNew.fTimeReceivedIsTxTime = true; wtxNew.BindWallet(this); - CMutableTransaction txNew; + CMutableTransaction txNew = CreateNewContextualCMutableTransaction( + Params().GetConsensus(), chainActive.Height() + 1); // Discourage fee sniping. // From 46d3762a90933ac3113acd24545e15be021d1bbc Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 8 Feb 2018 15:52:57 +0000 Subject: [PATCH 0451/1062] Update SignatureHash tests for transaction format changes The test uses randomly-generated transactions, some of which fell outside the actual consensus rules. --- src/test/data/sighash.json | 1000 ++++++++++++++++++------------------ src/test/sighash_tests.cpp | 36 +- 2 files changed, 532 insertions(+), 504 deletions(-) diff --git a/src/test/data/sighash.json b/src/test/data/sighash.json index f9ad10e18..8c78623cc 100644 --- a/src/test/data/sighash.json +++ b/src/test/data/sighash.json @@ -1,503 +1,503 @@ [ ["raw_transaction, script, input_index, hashType, signature_hash (result)"], - ["0a70154f042bc75aff44e8731f286a9794331cced9f21ecbe909ba6fec8b220d14f1a343fc01000000056a00005353a126ba963caa7f2b9e07d2b87ed956a8b0dc049ba8374d5bbe68f4f2b02b9808392cdbed020000000400526a637ff51cea3078081a198622115e7892ea884223443643b4b838b9fb36a40fe595bd53c3350200000002acabffffffffcc43984edd96a3fee15be35ca5da72046e3e96ab82a85c24995fb4268dfee9b3030000000763515363515300ffffffff02440eb800000000000863ababacabab6aac9dfb37040000000003acabab00000000010000000000000000e5044a0200000000762cb167f99e568df7f7ebb9015ba2ad87b2f1d92a754aef697fa8404e3c2581ed87569ac8cb7b449900acf1e5b543f814499deed9ff2aaabb251194f2f385471272712495da501135ae8d1dd13134af23071428a1d017ecaa3bccc23b8b8b03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cef45de773c6190236609b1a46b3e23a238ee1f644881a85991189d772fe460b7cf0a00cc7768096b6e3f5317b434d97a4ba969a3f90c5b374901f0355c807448a3015ca634cf338ffc2feff8e037c4e82b81249c30c74a08ab5f89537ec235818c9d7ccfd92a60d06ead38d52752db6021e0c02f7bbc7e1403c3a71fff5ff603063e4dd6b6ab831d4373bb8f7f4644855692e7d68406783860c73ba54bb870ca030c1ad82d667f5c6987732aaed4fe88e3430d072f2a8e08d483a1e8d7d22891f00a2055ac1c27678792e07b27e1f2996569530dabf9c80046d465a0ffe8f040923421ed8b38faf264e5cf75c80544bbbbce99d6796968c107cc4e09432e0173f7ee02277aaad4c0533ddb4f174656c042a6812ac4f441a9bf7ca598b3f1bce0a33363022bea6a4baa9bf55e8d44c7f9dcb210293710ae9acd81021221dbe97cc5ca54ce031bf2a0da31aa890eeb74483f08309e23bda66a36425c13550a743fc76c3d03c2030221b3475b3043581d4fcd74e1b69416c82209f63b04a21497c02601b43f1bb0020bc24a91d3b80c79646cff0658caecc76a6acaa176aa2e715a73595fa172991665c2a28f90c71d168c55ae4e1a949336376d2f23bf99bba51ea926eae2db1edd385c4ff301343921787353c4781ebda87eeca9770a132eaece42dfaf9fe8e0393bd5fd4f9ee7739e8d413507a186379e25380295d28e353792fecc20e121ea349eb7a544f8be1aa1a02996c3b191a4323e52072bb02ffc88f36bcb82cd3391f108347e4b1597fb14f871d17a94c10fda49885628e6678c2b7e77c7e773a9a0def443f3748ef2dbffbb418d64e1191678ec5516d7f016eb27b24ef8e26a9a6803ef03e253c5795c80343fe1869af0770fe2f7faefbfa0cc8c8027bc945632fb458f87de209d4d68d851420e6ce4fcc63ee754eaf89a0f6ffb0a449a4d83568e5c9196d02063575edbfb0ed4a11df8edc9b10089ea5fccbaf19c7af0cba388b61a2986263bfe976a9b8e755fbadf0e9a2c36926c7ae102666f3b94f738cf87c14e6a00ae11bf603c4394534208e1eb83c2a741864b0deed4de3acb760166feb4dfc8b8e40a19701d72ec9056650aa9a8a231d609354a28c3e1e645734388b8f62c2f40a9d9555b9b1b480f53aac83312fdf11c2f38c71656fe982b3bff986b799b282abd65768fd14035cbe61acec75b3ca23c8b8dfbc580634587fd1d8507201ef0918f41dffa3eb39235c7cced51446655923db432eaebb3a558b5b5b15d8d8fd1f506b0eb9cf154fe81cc7afc35dd9d48e7709171934e6b762e6485de27c2182a11f139fc7c1a8f635a9ad4b80a58f73d622866906cef14527534a22cd481427902f1d84ba5f4b38d793cc0085b1abf69d2acb763935d984ffd6922d43e61659a44070fc1222a97811d3b1a0463c3955104b4552d681a85896e2705dc28e981b7704fd4dff097c859450e191ca55efb5635c86f3cf6873a411fd4b8f07fc05dd932b1b14e403f422d4a7acefaa635a2f4ca1f406c839c05b17e89054f137985639aa0aa702253c769c613c63519a3e9e44e173295eb95118666633112dca7be2943636f60f4e4806d8a80268541c4b3b071b563a4b8a7cb77c417d86904e7e9046bbcc49373a9737b24000f4396d0428a46d7585bbcd067677c9d782c05d7e87b5c4ef8dc80e01e95acb6167f66f0af4c893596f0c8b4ef2e73ce8dcfa89d5f9476a56767477340c814afeee8348a3ec3a27d8b437604f47af0ba38de043666688877182d1d17c89ce78cf14d8335accebd2691f9fee2ab279be2675d8551756112c0d9cad3d0a496730d868bcf1eae9029879e58290bb751a6a540029eb72715def7cb39e53de75004040a7e6deacca212b062a43e47153360e1bab9d2d800c081e12b3eead416482e48e9d5dfb76499e14bfc79011bfa0c7107e8f67b9eb9a3f6b7db17b9650123a9a7eaa45e9af0689d9167c95f2507dbf13f3d4e771867809859ed8175169205383b1c15c1d20416314f91096674c56bea9dcdb5a97662f4730e624c1d6da58a5f1cce2e684e1a867e93125995c01720f804314a448393af530d2f2ce9eb99394fea50864f852153913f2f25d27997d10e8626407e4b6773d4872ba26303260025a5b8a09a92d4496d467dbd7accb3b7ae8b0e61e1510b0fcca2d728eef322f6c064057bb4b84fca3c9bc52291f659faf714c92a698bc7ac0d60cd6453d60e624cd88be1e8c12df00503eee1a643c02a3fbfef76b1d9f64e7b2034c391e8d57f41c8b1bac269dff9f4500549f1417b683b0c1ffee000477f0a083121302ef3fb23cdf67584b38eb49503b7b400a93e13dd7bf909d11425ce4ed20252335f12cb30067ccee4cffaae44f4ea37d2b37c7cbf988db0662899b58e0a1adcef7e6af074de8efcb394df330c", "52636a525252", 3, 1743887456, "1df6fc62e536c88c0914bc59cd253bf61755f27f7619f67a73463afe658f2f69"], - ["5f1aee89040d9e006691b6d98124825bea8956fde25e0930ada7a3074d5672ea6f25e59ae1030000000552ac52ac512151ddc5a7138896aab72e2216dcc62d140efe9c13b2a513882912d720c0aeceeaa81e210200000000b3672e14ff5aa54b8a4fb0b0793303b3ba69c169ec30a5ac24d9a1549d6ad02d2aaddfc8030000000054417a2f4464efe9b5a4f8bf14e1071c10a6762a40f9a98efe5da96f1ff85b6b4920d8b20000000008ac65ab51ab6a52526dbac29103382ffb020000000004525153ab90254e050000000008ab5252ab53ab63ab448098000000000006525263530065af338e39", "ac6a65", 0, 182861550, "ae8c39f404ab2c668e7c4f2340c5fe4c1e68bd463c5911b68b963e5ea3db1b5e"], - ["8aa10deb04f90d5e471fc5a829bd2adcd44f17439fc6b63c0669b2668e4d51ad67e50016d603000000007eb0f0ee7079ad6660227efb819c294a04d650f6dc723044a4680d20c346fc34948cc95702000000056a6a5163ac42a6917e538f417c5a35ca0aafdcd6b3d0f5a5640613ad6fe12d32787aa6f9220c70d22000000000056351516365ffffffffaf1313aaf41e05dac24290f00a2f862777830e96024107bf1c4942cea3c32398030000000600ac00ac00510a320c0e02b27fe300000000000035fa9305000000000100ebb50cdd", "6a6351ac536a53ac", 0, 1248756288, "40a5ee8d5fa08b812b9756bb95f0cab3f114533c978f8955392a13efe5820824"], - ["371f7ade02310bc501806dfbafa790004d9022295b900a937e59338d1c623089c4582a35be0100000001ab32a28425e75417726a878d55ba477c37a880dd030e81d2e66fc75ce3a821f330e63556e10200000006635100ac00acffffffff02e01536030000000000d0261a0000000000015100000000", "6a6553ac6a51", 1, -89315870, "1e19a51b20045c6a30ec4c46941b3c4055cd06435f52f7acc6e2320b1c8d60dc"], - ["21ea16d302dc64258155a19ad5b0e9d84ad43697648ebe0e85eeaaac4d8fe27d6567a5cc9803000000026551ffffffffa89a5831fc84b335db23d13d2fec9dfcdbc79b51b16c6475951e08c171ca8d200000000002526af27a71d002316f08020000000007ab6a0000ab63ab638342010000000005ac63526aab0f315df6", "006a00ac63", 1, -918284113, "2c812a691ab439532421a17c3980ed6dce697d58bdbe89799be545d03ca442ad"], - ["a4d00cf302f37150c4191465cb545b00b24a3011baa4ad1adf4c2c15cdb23a1f20ebdcd37600000000095363636aacacab6aabee4a08bca6721bc9f9636028f9062c5de108d7d3b263e17fdf8b8e268a2da6c537f12d040000000008526a5151005152ac7552652f038c8ad2030000000003510065024bf004000000000952ab5252536aacacab3127a2030000000005acac0000acd2f9a110", "5300", 1, -1377561406, "7e2803924edca56dd27896ceeb9a31771c246fb16f329c4155a0c5695ae279ea"], - ["448ec2fe0427d4262e976d6cedbce0b6295a493d0e46b9893a1e0fa0481f172ab4c176925d02000000035100ab20317ee55d536ff4638845f9f2ed101e8938a1ad04ac4c6f9e6064f28564795fa33fd9480000000004656aac53367e39fa1c0108646b6ae218e9c0d30550ed023d808a68ae28925756e229e68bb8d118a5030000000153ffffffff230331c1c94d7369e7c4f1f0d468bc46d5a60cf04476a0f0209c802feb0514b70100000000ffffffff0122b69b040000000008ac6363acac00ac63efbfd63e", "52530065ac63", 1, -1200902521, "9accb2591792b3a5517132d80e87092ab6e596b0b9d1b53e01b51bfbec1e48fd"], - ["a5dc7b5e0421c8f6fb20b183b2c8422fb7a24b85cc4ec6619c272b19223b9707c68ad2e6300100000008525300ac5200516affffffff3fb28ce660e19bf863fe7155986b6349053765ad058fbda5931ed175e7ec0f6203000000016affffffff7af9e1f0b0c24138cd1af05cc1a6cd743edbd7d2a085a42e08e5eca2944de75401000000026551243566610f5f729e148fe0aae8a39d0d9f4c26d966b3995a8b5cb9972fd989f8ce8cd3430000000008ac655200ac525365ffffffff02b58304040000000001654c67b200000000000563636aab5300000000010000000000000000964b86030000000080cb3f2cb847e1a214743d954ce55cd35e402bd0ba7e2112ba525077c68349bf101bf479c7664dc60a962c1f0d338045576ce74ef9f5223b7cdaee741469f2021daf3fa8c48a2e055f9b65836457e7aa7422bf1f709a072526feccf373bdd3dc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000183b2c4281bda92f7cc50a0bf3c53958f1f70f05a65448144ca7be98627cca7027944fd1dc2b032978847eecac2c4defcb0309d47336090378c983a120297e5660cf9e4f90b224a85745eaa0729700920fe4f813766729a9efb6f8af8cd9a1249f180c204fede8a39b4bffcf763a5d06f53d907820ea1358416a81f661f80ef2031b2c3fbd29227595e2d67e32d1285f73ede798512043f378322c228a23d6fc9e02159ceec4615d8d35eeef5fcf981032f38561beb09d19afc6e769595e49b6caeb0a08f0408f8822e11ee50b9b2b9d1c420c872406ff598a1a717b486544e6af5d902beb36c49a69b7e5ff3f902e2ce7c252085f5d183159964c7337288de61fdc13030368f671c1d6bc63a0155bd9ad3da9faefd4ea6ea8c500213bda48695eaca4c3032706feae9a9274e1fe18941a8db71d5088fcfc38dae8e99f046a3aca58de11810322dc7e08537a5de280e10da22c3a9724cd7d40b00f310ed397d4d202c7a5d355030cb2685d0bb6d4f719709cdee7f7072457b98b4395efc5c57f52821cb6a1289c021b947a7f3c7835b3aada9d1dcea8454f9744c6eb03dae1086619fcc548a40ac1581a244ce82ee4fce1ac37bacc04ff67fec0ffb9c98ba70bc082ca9b06c2a80b10b314426fdaf7ab9fa5caf1ddd8fe68cacf6a6e951a44ab84056bc3019c8b3d4967674539fbedb29b53ec28568f444473f92959ec64a7afa9449b9505be51a3f28b495c95299a18daad4492c01b803f05fbb1b0934e65ac73f7e9e3e76a91aea9c2996d68b807c9afbd1be24512f33e44cb6866344a1838375a3fcbc7e61240438eb0bd8e36863c6a0c5efd1f117aabf247ff7022aad51ea919eec0c76d9a83dea8a34505e337723addf825a398261de1e4e65766c46ab5105674e45d7cca7b65194cc037c777b2002efbd82597118e69c6e756435b40edc246d9541cc6eec1ecbb384f9798124597c818d2ed5fb0fb26e18eead130c79e36f2fafe63001e00bb4fb54ad95b45f8a142b900afaa919c2eb7d807868023f8d8fb8404eb56f2fea1b19b45b11c901088acd8fe5e1320c042f591ee8da8d3cb4494776e872c2b4ced1d6a8ee6f618723fffe2670631527c569029fb8e7ffbb2c906c513e05301662552624a23a81e6e1283625218e00d35921914864e3f8ebb80cf8ad09e124c2d679b378315d049bfb6323c28291fa873b4cf1f899aa975e4299b15e9f8977d863318e0c1ed938f46fadb59c61ee3a168f6c0ba5d24ed78b8eee01a19acc412fb7c97aab3ed7dfc0d21ab8067bd31918bf685580c19440197fba41c6a425d3b373db9689f6546ab22c017819d15020c8a03721dde165f769398657b106f533b8b7659b156a463eddd430cd53bc529ca9824f786f15b8dc7c2d9b91171383a8e393fdd2321171ef78f69572ecedc09fc20f1fb00872315d6f2a847878c6be380a88acada41785a5099275ff480951f3a165e406cc64ec623831a547c482df875e51f0855bca5f44b68fa39c52a9d7fa4540ec895573d2abae8426e65b1403a2cd6bfc445374b2d43eee0d2ff50d31f0cbdfed035b0e9e0008e5f23c572507555e382bae55ac62830ae8d61494cf9beaa000477350ff7c4b1653dae6dc706372c468737f347089496fe1e39bd0432f739d4b4040d50b9290f41b671af98e4f1784938a889773d5531e770f2cc7daea311dc048b524f91b517a8220535165ad27dcc1413ebc62b9588142c64dc8586e5b3afd5ac58d448b953e2c837c1e03609dd3a7778be3d179996d32cfd648eda38a4e2ad7c98fa696e48167804dc2a44d76d63816a3b4788000fffc61afcff2f1b85a4ec2d6570e2b5cc025539af1519c925c235fee21ec2c5b452200211a8430a176672c51bb9658d470339f8c583413fd25762cb1a40789cc2fe2210cc1699a6e329d9ad3569dc3933f48ea413bcd566a0332e8e9b0ebb4fb96bf3dcf6fc55d7d686f72e2286b472e26b008648c2d071b3b5870b74b81d504ea7c5b109ca5d6fef9726a6eb9fcb36448629b524bb23ceadb20f2753c97dd180a9801695310140716cf1799705193e8d48fc3b4cedb1a38d3d6f1da28802f49f3443a584ba3a5bca87c86717a5b06c9a65b4da8615c6312020df865838bf58ef87c096c76ec4d2aaa496e27e6abe1489407b12200c90aac6a10286122c08dd1ef8b51ddd06c2b86d0c66cbb80aba301a2e3071207598bca282d0de0d7be47d74adbac932799266c6db171033a87573a1525a0625c7f3adf4593cf43de4966bc2216c6cafae00b38416b067881f9cd8d3fc1a0f0313dbcc4ec995a5a0adf759f2b45b53e96a6a6c8cd0c3dc99f396f38a02a7e8379aec8c79f6703c403ab6af7fdf16d1f5484291b95cd07276688d273971ed9120e0ffda8092c7803bdd59610145d5c27557d4048ad6a509", "5152", 1, 1101231466, "6b451dc3e1a929fdcf80a8bc1c8417a62ddcf5b1e8e68343c0c68add5c6f0cda"], - ["359e5a4903336cb1214ef0196d97709fe39e289f022a14029d2cbe73ea40e4612574ed8305020000000665ab52acab00cfd6a2c5007ce9bfad72f5a6f1b64190c47600b3c9279fb8eb21e7dc18761b92a1c4599f0300000000ffffffffd5f05efe3e822072f6b3bc7cab03627740447d50e547dc492c1b644e9c700a820300000000ffffffff03ee183a000000000000cb3f8704000000000963006353ac6a6563ac6daeec0200000000065200abacac52eb74a657012f32cf01000000000000000000000000e347160b0201e32be95a4a900375c87a1e70a0bd7561c559ae03c26c776caa641d63fbf1cb09ded9ccf51ebd3e8aed5752a8b114dbabce322005c00c9e707e5b86efdd27b522e79fabf98fbe5a49d61f389e26fd930b1602e22797ae51cc812800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cdeab72c762f864814f7a0c8794d60bad4a89f59ba77b8157c913548dcb564fe4cc7da614ec789faed651b6238608359aec02e921875f4d68622b4f2bdd1fe183544258f85a2acfd6d7db81ef211278d810feb7ba71a87d1aad50c8de4c1d7f6a82b30e5f1976ba739c89f3f8371f1ad51731071e75fd831c8c0b23f28b4b615030cb8c1e2bb4cc84239cfa06e54ff788e7f3810ad5e41c6fd5475dcf8227f3fce021eb9ada27aacc4318f29389e8106156d43b9f4c96dd47eb86e5c5c747c5a40da0a2705ebe216ab60e080f451f901dfe4a1681f9278a716434d458e3d7ba1ca81772465a15a65674c705c7afbce0f41dd74936061a8c6dea97d633a352aaa15d572031b88909343d8b603ec65cef6c3afae7b30fcdd1d6dd55c4465b1a285df882e7202300192fc94cdcfcfe404cfd9904ac5d4f65090b841d1442d5b142f7536baa3cf02145f654e224c8a5eb7c5717d5ba18040b383e851430a42d16eda82529c9bc51d0311c832b0fb625edc84a3f1ab609b7fdb93c0d9134aa0deb7d214d6543cda7317022cf1a470c6ee79fc479344fa28ec804b8c0247e65ff9f4c6b570b2dfd00fef740929d2219e916e42a52d624f8b67fc4d661357e845b5cb747364337b60dadaf0f3bf774cd3ce36a25d02557054459a699c9d80f83b299a9ff4cb8941ba800ad4ea41c288864c173b74904789daee7dd20510b9a87fee893135963b2796b743c35afe38567f264e4b18931db612bc2c312652807dca9432e995aa49bcd6d846712dc604ec1f50731bc10d0141784e2623dbbf5b802810130893b6b22ca26dbd82b92eaea6473da05a0c110123ae2a168eb71fd4be9c550a2c5a50da6d4251334ad23256679c3a8191d0d58427715ff6acbeaf905f997a19dbb46c2de2f006d1936cecc1c1bd580ac8b4f3a89c22026e9c7a16cc775f9a60a06d6f33bf1129a073b3d929c67ebf833d81436a2d4491117155ee2f4c816461824a5bee25598985d3ea25af1671b8bd797220f916acde13a6ca8b7cc2f6b08caf9e4e2564b1b1036d45173b5328d20c4e5de1f72f84232076f0e607b132404d3120b301f0e59b6e2a5706067134b5a38d56944646474738f139801c9195c8eeafdde7d009ff14452d309a35028bdb762708f0eae985e593bc097331a307cf1ccb26420f5339d3f326b000ec8dd3be9b0c7f8f9bbcc55ce92cf437e66fe64959aba7d14a5a9acec94c8308f61fce042e111ee013c89240bb78f5654eec3e3aacff61c98f076c30e2cc191e44b0a70036e20282d1b419b6f9777bc76fe8b448b8b9936b896f490c00fad9fb712279aa102409097b9e44ba649dc10de4b7657c06593beeab316fac002b80d8a643037c1fdd6def7d5540d2b53cfd44742d03ffc421bce4f97515fb046e8b07efa2adfdc4e2af645bbb3c59d6a04f327bdfb7302042aa9046c88e953fcb70a7698a491f34bd2e7b127d3bddae35977ac6d4ff7588d44db3f0020eb9e1cd0406e8a5b6de3bb1d03ade1e2a5a3dd337c42e892444c2a0ece6b0f428b668b37a209c791523dca42e5a66f87d82ae801593036bde09b25954e160956d4c0564856a0e58ca59c8cab84a7bc4f82f6fab4a4391e0e6963a1e81103c0c597918a73b30e2aebc80b094a6d63832520a2a23879d32de39c3cf5cfde4e7f62e0bc2fc3cefaf98de2ce5f9a77e58223bbabafc35fe006b51e45269a49a20893500b375b09d7c80fba7c777ac75909c324e951e7ac9a17194e14aa2171b6f4d32aa0ec4e0e21e459765de38067bbfe124029ec5ad7ec7dd2610d4ef45361aa2ffb57da87944f40e48cd88be4bb3a5f7a885a1b381874abab13f66581ab8a0045bcc1b25f1471d31a101ac4cf537b0221173ac7481fc2344aa9913039aad53eccd537f0f8de0cb0f1bf9f1c86f90e8e9cf3a711ec978cd5404011747cb50ba4e26b87a288efd2c4f893e0a3835046a89bae6f8bb62ac56a62b8b7f71cc898a9011dd5250ad0e02e217c844af85aeb048ed847c9c8d3da7a72653f610578e92c5d85dd5233930fd80ea4ff407f0f3f426e1296c8f323a3b0643d8f25e6e2dfbabc4aa23d99d611e6be93b5f0d2a65012ce3cd487b4f6880e57195eb61f6ff90395008a545fb26ad2e76009db35d74587f8a81c6509d28481b7e73c2eb4b44c5c0a3e00dee6593ca5d4c741e123c68ba7c3eeb11e406b8b21682502b2668b2bee299bebc478ceafe9938c783d44d24d9c5e63c00143bc23ead1cd80ae4fcfd731d5ea70a2a80731398fa089553810b8362e415eef36c84dfe11976cf59bb707335ef927997dce1fb01f538607ad2d1a93a750ac2bc14984b48a6bb1750f667d8877e1cd413c63020789cc4d17f42fb26634f0555d5fb549083474d97b300e3abedb63f31fcf3c7ca304fe247b9148d016e5e59fe881d0f", "536351", 0, -715905776, "e935b698dd300074fdb13ba315666dd29447ec58d38940e7b8ba4dacd5e334ed"], - ["9519f8e001ecbc12afb8587d14dccc2cee79c27f67a3ecd2c23a3c1d9c48159f9a5e985c5a0100000006ac00ab530000ffffffff035c3c2f02000000000451ac6a53a1ab8103000000000563525363ab7517d60000000000046aab006aaba084a1", "5251ac515252", 0, 1197587702, "1e9bcab050160f24c23a6fc92c35d68c61ac8a6a79aa2601269ee0f440dd8846"], - ["9aa606a10335aaede0ae02eaac79306df74d0efba77301e7613f8dca6438b1bde35f8a7c79030000000353ac531344edc95c232498baafd493105b921d8f979726f9220e5dd106c8b984a5c1977986478e030000000565acac53531e1e579e06872bb22e300b6cc556622fb4aa93a586133c67f60ac413ac010ed2dd3e645c00000000075251ac526552abffffffff02b13fe4050000000008655100abac526a514b2ac0050000000007acabac526aac52180e0d53", "536a635253", 0, -582918023, "3c5e6ad865968e86c36681d2c4c49ff62069682f59c912aa7396e0865ef09752"], - ["bc724fbd04799ba10ce2324710633752ac95c8f7881613c10c78a457cc2aa1cf28aa6dad750000000006536a6a51acacffffffffe43a631bafd81d2947388582e8ac9704590e4780286dd9f97e984d6bb877c8b400000000086365ab6552ac52acffffffff3f53fe85f292d997605073b85f1befbe78f0adb627dafbc6fbbce4710d116b170200000009acac650000525363abffffffffcedefb69d8538d1bcc52497530c66d74119650603755b6e4ae156c39a9409d220300000004006563ab7382139704123eb30000000000003f449f01000000000751ab6aab51acab75fff1040000000006526565000063183ff60400000000036a6aacb21d6a15", "65ac6a535165650051", 1, -647041218, "f311ea4b987f1153052c4985547c69ff702390c979791a258e87e81607a9e2a5"], - ["d5d46ddf03b33dbfcc434909ab4cf4ac6bd764d80f075b934b96a18ed26426331af459ec7301000000036563abffffffff551033d067b305a41289696c2cb44b7554da3a5870e3b7d9f714320af4b7653903000000036a0052ffffffff8ebc5b0f63d3730f02b2ef3311731c91ea28f275d6c6a43baab9ec0f604a49fc0300000008ac5352ac6563ab5152bdd1a30285ab3904000000000200533d3979020000000004535351ab343fc798", "ac53", 1, 1912077243, "f70536783e81912d078d88ef9500ebe622207521d5fa3b0331810742badf05c5"], - ["7a3168da029ff840084e48d8a8619e31758fdd8996fe7a58346e6e3d44d6590d74a6a740a00300000003ab6353ffffffff6e5dfca760a2679892e1bb08a2ef327c16b168c1145a2e59c49e66c7ebfd191c0100000007635353ac6a636affffffff0413badd0100000000086a6352acabab00aca5900504000000000500ac63630000b98f0100000000096a536a65516300000063208b04000000000565ab63530000000000", "530053656a", 0, 2134166525, "cfd0515ad67f943cc5a0b303b1ac796276fe56dc6fbf0226122165b5b4f84a86"], - ["a40328bb033251069c4356d1e2aa2be7454c8a9d728ecfc4501ab6d6537e9ea4d53f4ea6b6020000000251ab5f3179c09c9615e481764917fa419b95933e41fcbd53b28cb390ab636793b65d71e1f051010000000565525352001651de4d2a8d5530492a602824ae4e5332df57478d8e153568b0eddd9b47e4fcbfe87778000000000553006351abffffffff02265320040000000000273a7703000000000351acab00000000", "636aac", 1, 1707062048, "60fef62f6cac302374a84b8532d6018c4776f5f463433ee486659e838ce03046"], - ["b837bb8a0236ca86ffdb245fcbe155ffaa5b838160e4cac9ce049b4367901cde8c525bc11a02000000025151e12d173c49a75d943f8a6a89c70e38942eab710acb8e2366b52de94ad317bfcecf77d0fc0100000008ac6a51ab00ac5353ffffffff03cb778d000000000004abac52652c71ce03000000000351636a3946b5020000000008535151006a6a5252bdac6629", "6a0053", 1, -1241762288, "fb04248b744ab15d50b45adee9912149233c36674c4d9e770047bc3c8729c403"], - ["e1a6240104a8fc66fae56dcb20d9a2fde16e7860817c214cf6d90b11c21d575f90b17f575500000000055100650065ffffffff0a3542c639ae7ddb38a065d8a33e4e1e0f09a70975114c520dc3a0f855b4df1f0300000000023d5c6e4cd5197284ea5f0177eb7937367d779c782a08351071f3e1aaf5acdc7bf8e6510100000005656500ac6affffffff4a8cf9d1b4985404c1963415e1ca0373e5e7136a580c3df39dcc5247ff772d8f030000000365ac6538b25b4a043d3ae8020000000008636563ac526a6565183da60200000000026352edf7df03000000000352ac5194f6a0020000000001510000000000", "", 0, -2143379793, "b776d4af569141006018658107b8a076d2e1efcaabf189329a5694b59a6615ff"], - ["9ea0f02e033497e89099eedb0405d1099f4128b4a80d940c803d6996211f203cc752167a0a0300000009516aac536353ab6a52ffffffff27e0c2faf88ef90fdd3c66e264800cec982664e7a10c879a76950d8e431aef9d0200000006656aac000052f2de85cb33b66e6e34450c640cbac7bb9e3e0130639670345851cd7f8e13ce15496058f6020000000153e4a36fc003bded240500000000066a526a6552657dd9f503000000000200636f5907050000000004656a5300863268340200000000000000007726c702000000005d0693996f52df1434e58b3e908eb6af24aa8f30dbd8582e5065b833108c7f1ed6788f89e34aa10a66467558b3a018f4a56f540f45a677747d3d08e1b8a59b8c139e6eae691dab788a12bd54347af4605caa23f2572b82fe0ffb557201b154e7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002906a5325863c94fd5e2601bc347fc80054defdd5f94b71cb1633c8912a0ea24c85a63a2e154d047856f48ed3627075d09bd4be96cd398515e0129456ca9bfaf2303adf534fe5100f7742315e15abe212f7a4a0c66f9f73054a6ffa88c53c0d281326e3cc33ae672c97d3566778c2a3eaa19f5fdbd6ec669236064c90ccbf1c2030da61e9c1e1f0b9018ba10c209a7acf52b67a95db41e81eb1d0a85823148cd10022573236cd539c1ea5d33ce220c18ebad1ae8d70c82c53274fa79bc2a164958c90b2afbc6ce33ce8e71236846a9abfa7661eac0322985cbb29e078dd42ec500d91d2366cc383638a99bd33f34b447c18b66487418621de0e3ba10e88d1332991996032240199b45b6a166624014c05c4d97f0f386f7933839d7292e9f29426b1fceae0305efe54aa68feeb142f7b615ba58ad29ec9baaea8019e8e5eb090b87568a4e110310e326c4c4216a72191acb21b235e8b8743a2effcd915789ba4f68dbac3dbe5602066534ab587ae8b70e46b7c5c67615a325e194d5396b875d58f7c14a6582f8cd0207d2ee2c1c03238d60344da6abda73609c347ea6e9b075ed298d26f4e9f2d57f70b1f43fdd7d0270497e6a410eddeef12c3aeea7022c090038bbfdfd9425ca92af2f749c3186af34012b1e9d1a932ad6afc3dab6d75cebd85cb7eb5f7f8f698bfd5e3a83f355c590cb3bafef03f53a522d4a5bf15eb18bd7b552e5b6271a2fca5d268f67c1e8d77feddbe6cdf28be12afe65e6c8b5f345e0b949c2b5f8d94240bb5c991f19fc7d57944d5e1890494a4c34e2bf32cb70664d23f92efe93065b03b27472fe41a131f08d837718e5db02144189fd22b784ca546eca221dfdfb874d6ea55b83d9162177f0055e6dc11471ce842e8a7daf08a42da464af989f90261e5f8224ddd8edd6ade03b42c3f83aa0f798b457b5d58322e308406b605ddb087d52bf14d6cbad20ee190beba58830f53fdff6267dadf073d92b5ba1f86441d9d049df6915dc06db870f7a1701de411791d40039956186bb658cd9a364feb7fb1829d9590225b2c33b39d9669a812e5d5c3e55e6e2622513ebf420fc381971505d1cbf833ae920ba070125c7f69548a932a9e27d1f78cd2f9d0a3e6cf671e2f5aaa4c3c0d140bc3b84095519227141955c2680388483771173d6fc5c68fa4d76864faff6862442724912a2318910632b0cb909519c488ba8cbf559f34c907be8320f633ddc0a7603ed9b020dd464fb36fbfbf943f92453aebd00a9d42d7bc5ef504a902accef2e7c91be667de0a95a4b40741f86eb93c8bd52a3fc03da633f981bc81a430f46440b3d68fdbeb9a94b6265975612ee500e4fb77b92827dc3a185b11adc2fa968ac961a6cd3d8a5fc2008c480acd339e9481e207b53e4058261ca97feaab2b4d46da6d5bba16607f2dc0d155f708baed7add0ab47f059ab91ae08cabb6fbe484d9000ed69228d9d4ca183b48e849d968b5e989a332b526ff01190044f722319a6db0e9eb0a95a01d9e26cac73f3c69c8624a8d5b8d76eb4ea56f3fec554a43e0f7a700c88b38c3c4b337cae1d96990dcfb68183be6dce974a577b4c30536b688a95237b6e4f3ea8238f20139b21150ebf765d706d682f4ebc79bbdae0aebbef616eb37598472762598c36e98e923ba958940b4d9852453f26927bd1f1677c0f41485a3476e8545b00468da71d872971572c6e4381f2c1abb3ad00ea3516a1ee2bdec8ab969260b006fe679cffa6c60565a87233dee0f7930e51567b884db0094cad733ecfb5f96d243d935389ed479db33e1ddf658338db2e00a1bd11daba571666eb9f8cbb9f747b535bc1615f10b49fc71d637dad2e37926cd8050a86cdbf8d1f373bb2b27053729ddb21377093411c6f9d3d11b4c35fc4197ef0fea907e70bd5c2e426595aa96cc8e812de2a447cf3b527e9ea5deadb0671ee76db14cb85688b43342bba0fb315b042c0eab81ac494e4187bddec4b3c82cfe3134583ab8a1d89bc3c0b4f1d86ae0e62977b8992386c36009ce6b591ed8e3e14b84d3e6801a59138ccdc5a4773f6b2f40339163abc7eca17d69057f381732ad088bfb57bdc6d349e9c835d5b96eb38e73e279af79d87039d8095a15f1804b68a78cc4ed800d7bf303db5ada2f6529bfba11402a7a03d22adca2038e84fbd48af597a3b7f5c0a917fe251dad26dba887d286c272faac129bda1f7a3b91a11047f83103209f760a65d3975833c1b19c2a514829c8adb9e88c70714254ed5dc081915264f85b19b1948dc3b67630a4c318ee5eb1c7431890500000000000000000000000098d42ab58c3e792a5d962ab420aa7c3f07157a8024bee96e308c425acd3da81e9a6c1ca722fd0ac4d5ae0b0a1726985267ce8b32f415c6f3f685f1130c46a69ff775030033f7887f875f7b998d223aae44719f31397f1a8dde5f6c2b225e2b1a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009cf397bb2cbee8f13ad61b08184060828704c0d39a6493ac7a8010e2bcc8329269692b69cc263c8d5c3e7ea8019f3482897e59d3ddd8f1594154556387f42bd253f7f3aaf94e1bf72bcc126d429104f3634208fdcbb0f0340ce697b2cca8d7e697b4553079fd3cf3116f6f697141df1add14191b4e0d06d0a34bcafde872ca8031a4ef22a3cbe8c8bc45ede6e58a1c787a0ea9ecfe441948f421ab5d56396f5480302b9b8e8fef180c557d653b7d8de85f7589ec477ac557cfe3c28151841d620c50b19384ab2929c044170c9fe72f25264696a06e0c276a19cc39b0d0eb57875dec605326ca4060ffa8b2a41329f92206085c0bd1417faf6e32702883176a8a4d0f103286b79255b8de6cc4a705f2a8636a43fa3eafa2f50702d2f26154f247d22a6300305a56719a90a9bf4f09f76019cb630f73e5b0ac4b8aa4b1812fb2bacb2332090031ddfafb8bbd3febbfe5c93798cf307f98da2f7188c688034431274d9d0b5cd600221850773a9d888ede695a8bc3116d14e9c0899a40b5036e9d615e8777ecb828e030c8ae1823101990c9904a0b741fec979402edb574e730637f5196ab6deec9617e12e4d304c0c75b17167fe66dac51fa77138d86f1c131160213b386249e55ba2424006aa28aed3d47d48b766efffb8c718d5db968cd7c03782dad8d2057e08b370a85a7a1c481da33a8f9af140a11372abe23435f8e3c6bcd61883666aa7bdb8a8076b6fb72178562e75499a1d0343e72b7c18b458eb786da1144d65cc4ea12fc15fbf5462a0abecdf9dbc9308185a03dde3efa91f02e11e1dabc1a337fa0a35d74251a45e58b75bf8a9c65c129a42f4e571be4c482e51f5a15a6070f503f2e9cd9ebd3b0ea63e422b15041253174487ebb58aa783afb80b40c010d5a952090421d12a08239108dc86335ed41273017a069bb07f64af540e1c0267347afd31993d77ea3b996db9dfe6600c322670e6701c7a25791aa2f6f8a1076e823abce13450e9a3bb5d3eaf9e9f4df9cacecbc45c3e908ec0d2c3c5d16e9dce515895390d8784fa4ad2ec62234df9d85ac3bbf462fa417f9c2760fca4870d7fb8ae35669d550291c10af02cc3305499b19771d7c8243fc9b1cd64156112d57a5102e3ce5c73d35353c36e88fa41e764bbaa0e6e3a4caf133849ee693aa9c39074fba6147d33bafb73806ea7af600315b2745dbba653bf3513b9f5ba1a082cdf3a2eb6f96b354c3d74750bab52de1a78e91d9633ff16ab43298d28c521cb5cf9d990f4f7ab7a419c04e439b7b6ad7772971eda633e85661196c27098080436ee110cec5994de6f4da45ea0a6b0b05a23f82dcffd59f595883e4a743b398a42819c2a9c41370a57ce560f592f0c7ce35fa04628653f9dcb4554696e821a9a7361e71ee526a07a44f758a68cbf45b2d21601a647f85705dcd674b52d7820234466cd3a71dd8653097727cd511f93166213439106a4471cdc0c225346d2b20759b07b9fcbb428b55c4947211821ce387eda503e329a10c37a2d212f0796f5564ef79ebea0555a597f60aa8cec1ddd6e21751afe691be79454abba6ff6dc2361fa3febef4cd9acd78e207aeb07a111b31bc0ea5f0dc2d0e4ff384249ae7baeba14ca8f621b62438673e107b3d2f26b5823098d11ed3bcfee2ab8f0500b5f0061da3b9eb25558c5e0e20249ee5f77d6768f252fb1690bb26ce5106de2d65286a693c9b69b1601b8f14388b9a27ff7b58d8f09b60a4e582e195d8cebfbd0510f72860b1464bae9c0ad75e010cf71eb3a83b6630057c7deb97fc2006c274c59863f08920c11dce7143d1bb119401905ac2ba8edb7c34754a5048381c2ff16dafa394bfe4a9c8fc1a4319f46b0f6ad2f35725f1060030cc12adf83c7e98a7d990f5fa51210e38ed658c8c53fd78f42956d4ea40a5590f30e261435d55b76720ba2b6adbe62b1a5298b04f6aa4d50623fd42d9bc0f1b5fc384d62d931e17fddcb4adfee96c1e3f0c61f1ac5eb5ec557a4aaf1c1337c929eef9b736443927ed16a913186db653c6cbb893249ff021665311e0a881b5f42d0cb0033a306506f95c0fe7825ca117ceab3f58ac64127af29f5b0fd2eae6d9dc77e552ca288858323850e4ff351316179e187b87b5e071188f92b5b4e6c2e397b08f8926418d1bdfbb90721b4273ec9e8b964a5a820573104de532cc47cacabe05180a054a1a51328604212163e904e81d8da795fefe06c0f0327badd1e63f4227c56ce4591784e2903a77649cc177835d286efa6aafcb0b21747e75908c2414e892231a6f9bf4de18e81ae22ddc70b5b7bb3c1eb362c348f28a795bd3d62b77eca7c534d977c00ed4f57f52de4c3a1399b7a9b34de1ea17fad3d6c36da97a77536d55977290ce77fb16137a39cee48b3f6feb7fae49da418177422e635025590899f2100", "", 0, -1302028225, "70ddbf7fe88db129ef81794820f1dc74d65306c0e2c1deebcf32654add29b83e"], - ["8269f5ee034788b9f5fb25c64236c653f0d1ff1ca69b6fc2c88948fe74197ddf2c8130bb8a0200000000dbbf87003a15ff1aec446f5077059a5f2448f2579d9a4d5f8fcde0d55aead739f6b0230803000000046a5153539a3df1bfd3999ee684ee68f7ddf41f3e9e4650258cd54cdc62431af51727328f334e466b030000000400ac00516af82c710413baaf020000000002ab00d339150400000000056a52ac63acb8906e00000000000852636aacac5100acd30be10500000000046aab5265b165d339", "", 2, 221466486, "b78bfbc27d5e94b20e2f4004c8911ca46f5e12710bc1da6a0c2711b39e2905e9"], - ["d2d4e72102d0d847b8d88c7b8ba4d9d0ab4bae9b17f6f2d2c5d76eb9296b43e5a83d0f5e5e0200000009536a5165516a000052e734693510fef10293f52ea7dac6ccff08cb2499b5910dde7f493f1d443773a0272723f101000000026a52135c447603cfac0602000000000163f4471f010000000004650053519a813b0500000000075352535152006ad2ad5f18031f5c30020000000000000000000000007f9a37be262109336617857c6ffd24edb63c3e2668b60642ee5537c60f6ebaee4afb6fd34a1eba4f3f970e070ea36a180aa145aebc38548fcfd2ea3374095eb8bcfc8fe5cc72f5caa185a51f9899e5e036444829f46ba005e705748701050fa2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000729be036c04c80d25bd90f5b8a8283be6909af21cc907e5beac8e01d7806d3dbf7819c7f3c11cffbdbb7237aca7a47abad6dca6a75a55bd009c98f5a0ba76fcd772ac2de6d9867eb47cec4bd6ccdabd84673f2b26f3d79a16f8945791d109da145a63e89f888f593e8dcaa0f6a065c2de50e9dcf2feeb41c6a835fc0cfcbdde0205ebace982ce85d7f9e05a17e1e107a9034b3b9817d9a581e41568c5b58040e202039705bb43faaa71afa7fc7593857fff0450bb86bb31ca39e316ac1d033974fc0b01f7b8223e74e385442335de0912a53aa279db49bf72201490fe9019ab07f45717e1702c9b08721bf85307f4da844670ae42c015d20d70b9a182c1360fa485a6022367391d8e000c5ef1bde51f2cc2c02311703481ae4d050fb394420b7ecf1def030df67041792102a31ad130179778fc60a067ca61279c1a4f041333f1c1f1bd69031d00bc365211fafd3161361604d9fdcde9f40fc5b3fb51c2b2eb41f644c19237021c258667d07ba02153179084d1e62a38f2a7962c5def866e1c2db1e4e30ff5cb030ee7d67bab4cc17435abab55761ba62c4b171bf6bed3ab338ca219f05c04a76c9380a6cfbfd8fe739377ceb1c151e590271074d3dc2e2cd9015c4ed20b5e5a5a37b244bed575b085326738900637669d7307e92c0f63143cb78ca599aacaa9a8a8be0d8f91577585ad92aa7e61ea88cd9b416f646b45e3da64a4c605ba303822f5d0549d670a7884e80b02edfd07a6df63c5a7d34cb042a14b3ed7c11194b824bfc3e5d156bdb35ca3f7287efd775f712c11a205820f728de0a495b0c90cf515d0ca7fee32fd368fefc7f5d618b85408488e98377bef966184af1414c1feac7792c8b957385d20ae551b50a948c72f13d35948ea6d7cdce9cfbf73e1f53c06a1c0954a192c79b177844cb57b8dee9474f83fec62d7af3384fe5ff982c02ad1de22407f2c500c8b677890dd760da8f4b8911d2e56465985147a2fc9f10210bc6ee353262b3922d3cd3512716e69b2a940e98054529c521ec3cdbe4fb5d2fbf1160d90eee6773b62a6c20b3b99bd7990c467624c823dfdb7444bd2a689edf798011bd7afa66290f2a4752027f3f600f995c08a810678e599dddfc72d3a78879c0e20f81bebf39a0a907fb72f14165f65aeac340696b6184a982e4a20ae6770f6b3b50131a37023ffd0888d17b1cf5ebaa5de5d83493e9d141213dc50aa1692e78e255e560a728e2158af84597be9eaa124a14fee1c3ad71076121a67fd7e1e081e4c6b4a5d36d88f8b88f6f5acd3248a5dac2d6e68abaed01830822f44e3fef5265837ce8b1efe655690ab5bca4bf6a5371c110116d0ad5d25195a48c2631425af464736f2cd10af7fa92a9a71863268dc1329bf0d5e4cdba61b02a5fb7143f2451b676dfefe68b4d1c7ef083e97b8e15e5f1284e177e4de50f0a36d31cd1ffa637f4275feee4bf65896d68bca73ddba911e5fa4855c6c418376c6d2ab1963402d34f4ef80ff67be27c6d31b2a6eef50114d72bf2a14e6dbff6627b5f25ab85059a23eb047b0148606f6886f0a93a25ec12be66650d38f697f70adc100d9a709191f582d63a94bca7e413d82c311ed7da7c97ab68b2eb9a5c710ffec33c39e6da4a1e3326e992bda69b6506df504f07a1068bdb378d8cb88157833917cfa0f29bdf30ca1550cb16478747a7ed02b6431cc57b5e235aac4dbbabf701442b80d3f2ed940da8c89e34951499b3064cc1eb729eba27a218c98570243ea105cb45fa95230964366a22de4ebe503a69774b119238fc0336f489cecf5b138f2cb6249de65415fd0fa2af08f7816f18384056b1e8899b6e400eee907b4ae40079046e0a4c2267b8bdb1eab0604fd2d9bd302939dcc3e68bb700f8dbfddcdaabd3406ff472eb3d30f82dcd63a0393f180e926b3d4fa88642854e8d6ae395baa52598603fbb34f51ea2335c25f0b8974eae0e0f8b1b8c3c008a9df904d424685d63d1ee0d5ce04b85686ecb281e3b335bf5233efddd53a13e12586f224e02956329528f4ce3cafcddfd31f3f6f1fcb73425fa10df7c749bbac828f1176a32c0141ccfb2ce2f366f82b431ab1ddd2c759173598aac384c463c534f2fc13c0eec80959171055288f45cf5cea602eb511490fbb6db1335bf386e7abbd231a0e3cd80b56f5e20f3ad494164587157a6cbace63f5fbf5d6c0280733f72ed779d518b3fc76d1c07472949fa29139cd346c689065113dedc5a0c9a782762d67b4153528f1b1d86ead6a58b44aa1891f2945a946c1735d4737f8204ce54b95050000000000000000000000002f286a5158e978c8c9dd040d6279714e6396572a5c195a7861ac5507c0dab8e5f5521cfbc777d83c6e095663e56c1e3ac72f58c45a2da0aeb5e96a2c0fa39068de4f0d9946dd72698d2dbdb8a8fc1486ab0f731f2b096057d6703458191b87e6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005dbd3131cc117dbdc66e6ef8ba9ee605c9df11a67a2303a569c6ebf3e52b5a31288a6ca7041ebddb04fb2057fae06e478be7e62a317148d4a49480974b0ec2b92c40452e0689e10bcc7d89ee81b8b4b40540d6cf29b01f7551f4a8f1388d09857601fdd2e7b753f6067ed0d93d5cc4a887d146ba770fe09b0f6369b406a823a6021d8e699d60f9d848cc54c3e8b45b717dba4690817c0c67cb5b09ecc8ef209bfe031ad489abf0bdf08356e7c5695e5cb6a0e0bab5d16c9cb2c4ba2725eda79f43c10b05d9a5019c47ea36f595cc624a35f63230b12196fbab46b75c69cc87a5d84a072e7af1d5bc501cf24fe9abed3127edf58224b9545226bbc7de7ae3e78593935b0303888eed8c724dc236598853bf150602a0745cff58753952985eb8cb23eecdb5021b08b8237309c8865e0abf39434ca68646a3372109f87e99b8e024af3ffadbfa031bbf00cc5e1e8cab636d0e88b5e9c17b5222153164d67c60a3e40b1eab1a2372020725f88da6f99d11b87350ca66069266cec1eaa45fa3f2d84a94f97803f31348021efbe3a132568b2fd8695290e8a4592e2f909b03b11986d3b1d3915dd115d278198b4590dc5f11b01cf8437ad125c7f33bf55b098b9a32c3b788a70f4ee8586e4c84333c744694b76023b6963f487066c0f57598adda22467c2f9797036e9418e89fa774798792468b2dcd22b23a9a8d9162a36c1143b778f3cdd6f67b6e8a825543486e773dde76466cc285c9a8c6e75a2367154dc9741bd7f994f272b3fd34ec66eadc32ee944751e62aa58c0fa8caf13cf4acf1e65f98ef8e1791f3bdfbef932ea2e841bd2c38727787266a68b6f90858780267e0aba8a2e9c3bd1e73be54096a93e8f3342447f0a8be6c57716b21e3e5a4e4df7496832495ea57cc2e780482000e90b6ba7d9afea51a57b77ba2cb0d901ac98d11b71c007afacbfcad7e4c9d3ed3cb9669fffb5f9e0fd2f8caabc58d60beb2ddd7dc60133b5ddf7c4c60625167241ad4d5e173bd4d13af32c993403586f776b5396a4d06b7718e0e8f9ddf1e80fe518e449ab7bd3e7812984f1f60d73fe169affdd6c0c743b899df1632b7b7e8808b1b91e6a53e1b4b7465ceb04041fe67af7074568407d5d544d300d68d916e595ed87cdef2502da2b1f7c8890d1d5abe773522873b77ac5e30024b7768b304294bd5c78db004238d4fa83015fb72f7186c274cfbb2d59c6025c12e8754175830eea4288e97a4b97a2fddd26921aca0a474273dc07e54b3fdc3b5f6d32a9b8a212afa6eac19753d1bf4b26740652303d1de66dd8a7030b934b73015f076a24e712aafac017d231948a1181b16797d81a919cf0872607835176cd948861287d608f59d179b39084482db6af96b9b0a0136f0e01d53f5b6efe79d86affeea7653af1d1f6608afdef4e80da024472c3d3cddcb4f62f13466bfd1a26666dd95ae4495f2f39bc2b61e7147449c62ce462addc304c765fc518f64dd682fd9ba93be4efeba7ecccc5dbacc9f7bef4afb4205987cc05eac9429ee8056a73cd63ca8a133cc613ce1d84deb8e07018aa3c07939f47ba990cf711cdbcb3bb477309857a04f1fae360ef86846b82c7da3e7ebe57ee23b44ab99b9bbe645af77e16f010e91c2c20982791576bf5e6cf4a431aefb8170fa19048504a2bcd5f437ce08935d3f09dc7ac1231e61ffe95c99d09c02148058c04c5c7b68ed2c6149f7dd925515ad090e6f750a049663e148ccc28c2e2391a3f780d9e25999c2d223ec88ea8a8108773d2be4055ef7e23587c1646d241f96022d40dd724df56cd20c2b947debb2e56d2dbb1f6950b889dacdb715e42e83dc307816a77751021945879e3a390c4fa571e671bbfeb8d2c4818909acca34b4a6d5544014b326cf742924191d584ec581a0f74a216200c82cb422524874094a5e1d3ef980541c378b8d4335968c170a5d734a326be56ceccb7863ab89afe5319be1f6fdcb0eb88cb097998afd174378eb63e65c28767a01263a8a520ae5b881ef3e5e3c08c42a8a93b9c9642e1444580c3ca7ba6f1cc5d2c85a78559cb3a6f99e055bc0b096220fc85539bf704adc8c017961c21d3349b9206a7ec494e64c8df658e3b5eb9b9dcc0f9aa3f816398066d0418a0e7f50f9903fb139f8d9d468928af198f7e2c224b0e95e6f5519a0120797c676e4bbf3b46fdd450fb6dccdd20ba5eb4951093bae496348d79f60a6b45af6f166c1673cee5a228e36fca50d0a19e02a9c5c1f3f9ce68e9033aae819b5867874ef3be6c9306da57f41bad2c4b366942f000000000000000080514e03000000004a2651a1c3f47d7a1c116e6d731f82da6e95c46263c675544d639909e34ed0ae8641ae1b9dd19e2853a0642ae40f7723b389a5cbd62a79e6cd19a5db98cf7b040e3ee35b651121bb2e4f22cb546a39b59aa9835285dc14b8823c949ac3f8cdf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c2cdcc587c181ad10e3530cb8bbe58804b323f0ffba1b0e79f520c6efe5d479716683b55c25b5da5b363c6b537718ea890ea941a6eeb509138e2d92c369b05e71c4ca01ebdc2f8503217fc55154263e372dda8f617b244172f33e8c32e9a0cd032d23048e4bf7e3fa6678dbcbe313e29265a9fcf4d2dcb0a703f29eaee2257d902168b91fb9e27422ec6e55ee8d2a21d1986df424a3f3a748041fa29d2fab3b1ba0200a065593331c01be9f1134ff4b9af38bbcaaa9edd8e42083613cdc07a83e8070a0bf4f484c6c217ac26f0c891363629423330375e1c02249ffcfc87967971f7db0e9e9fb45f6a9e04195d6e538f103c818bd8810e848be1d8d3d0ae5e33f4fafe03188ad7dd491b66134d1c44068a2daf69b9bb4c4c628cef85fd1ab9f3574e11c0032e2d72cfd38687be32852753a95d81b10c31139b8aa04d828f99e2074a7b6bdc03220ddde92c94ad051a16e626a4903316adcfe4ed5b2006c34ada70f356bbbffa030e640a40026e0f40c5a83f3805d1bd31797751eb5aa362107530b70c7e0849c80307740e524bb384d96035ec1e11e937643f895b639f6f382e286bd655f1df3429a3b5efe3373a12e393d592bda471d2fcb60da86e79027a91f13f5ecd0df17ebff23fdbb4ea92bcbaa8ceda642cb10849dce86799c921b90dc1dea070b58364a762d1e0d79e7edfa1e89b73986ef02185503fc0b8cacecee4852f86a952b04e5b96413202c3d7d4fe881cf192f4541b3a5e9ce41013ff8dd32bfac38fa4ac420d1704266c429ba3d09c6394de6e6dcd8ed17da1d9ec16b5f52350f2f9b4ad595d8c11d7a2397ac6c64dfc3c894550cef8922b3019553688a663b66400caffdf6d41ea99a39997c701527d9cae04dccc4174dea47da8969266d0a99f21aebaab021be02c4048780b0aea1eb7ee39b1ad11afdf92585688aa67bbcdccdd720acc84f7d470f71d3f67a4f5b522977bde350f37bace8b0c9520c38ffaf37073b279802839d4d696e79c97d60a2450223473cd6cc4db8687e84708cb8d78329954f587517f1f0aa28c49c1eab621cf8bd1c5a3c0d408090d68c0a907c4f78645d0b0ef3ece2d2e1cab0cf8e012231e89ad6adfc9fff6d1c023704129065ed0bf736c20a635e9a7ebbb354d9185cd87216683cac25fa131aff491438d9905e19aac8e48dd1c3aa6adfdd1b1226c44e2a9d08a04626ff3fab35e51187c78604fc43cb53e934cf6e5c93e45832e3017ce576081437ff62925fb6192b010ca06dbf1ba449ced3c807c79c188cc04bbee1d3ab44201838842ccee7f98b40234d85bc6ae5a7148b8b6a59c49bda7e322d077e6eb215ab87b9323ab8781167804fa72b6c05781ed536a2618f8684f87ce2f8d53412ef310a689c541bd314dc7ddad9776fffae8f165f5cc536db8925dfe3bc04285567165a1fccd8c6565b92277d6f492ab34514961576edff18df92e0a7e0f7e9167c020c219f6165440d58e9822b0381f304fc56df20c9f7361d5b4a3d074c0bfd9fa9043fc71ceed95b1e4de5f4658c71f40e89a7f23c951f3fbdb39cc9d8b3bfaf5b3a3812ea90f171ce1273d9991358bf06cc3c94077709e9ad41f8d0d60be4d8bb23f316506f75bd8d42ebeab0a69d33400b76208748a6b12a7b037d8f8bd2cda6f1d4c1c9f2dfcd26a537ccb25b66757adb223e36e2940a043f9af77173bcc13845bb783025ab4dce3784cd96b4237df551f9287e123b3dfdf12738e6e282eb2497adc5e44cf410bb6f1dc8fcb925221de8055f2851caafe7ad7727850d4d40f203b1835310228d95976d204b44e1889a7bc846e3edc67a8b45ddf651b8a69e7c25613ec593ac946c6948ba4a5cd36f10152176561e36ae06bcd115487ac225edcc6ec8d00e1343fda8347738ec9a59043f7f51b53dafe28c8e16596152916e1d3317c951991f5faed961080a147096ea196dfdfb5f5d323ff70ae3afd995027c5844f8215d946bf1be9c47e710aa7aea1bc04dd3b1d7bbb2a0bed71962cb67e94d3cc4938a97a1607cbb926fd4a2bbea29d046e8a2028fcbb644e52c148dcfdac4238d9f46881220ce2282bfa99b2c9c151054486efc98e106e0fae7d224d84d0288cdf17096b52ac968fff4b157d03dec742232fe0898353e7ace936afa1d7cd1b2ecd14ee81b24a1d959ad173b1b09ac25d007af75b2c8f8db9fb9f425e862cc5325db2687511884c2461a0be31e1b642cb83b1b8660f5adf0ec807e13e563ad9a1dcaf4214248e07990488267815ad05fc537c8b8f7f848f5ce97328f05b9906a7d85a857d88db2e2a90f071ae9d4eda49a62fc7fbc530d421ad1657df8197e32c7b1474fde0f53aa3cfeec8827e3cf35322332ef823055cdf8ef0f338347ffbf7be1185d3fb62fcba399675e23dc458b12e8b1911c351290f041e19c1db400c", "650000525153", 1, -264916277, "51db1a19b35632d7716a418ebc120e326eadb9e643bdf465b3f0277710780052"], - ["5b3e4804012b0a783fe8ff043c6ae09772a30f8b4b5b3acfc66939b2c7824f69e11a6de66800000000003b0b672d01ed1a3605000000000363525100000000010000000000000000061654050000000011c8891109be406260037aa1e9a6d7bdf65d3ffd4088f7e950ea129b46a4a6d4341e3373984055a13c4753cb9222d9abaef5ebd2cfbe1e7b42337ebe9e08e38667b9a90c2b5f89596fb39b8c28030d57cbe98507615a2a5046d33963e779fb97000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d6a1963fa8c598f7dfac54a1b403f2b13202467308c49a25eb485b91715f3f38bc12e47a79f4b2903169cabf4c7c4de6a4907c79ae23aa02903459a3e8e0f87203ed6b04b575aea0a6c7391c851a7d2b6940a718f29aed139de7cbce917f29ce0db6b140aec7936d6262137b3490a8c0ad5d8ea8271ffd8d050f0958a5bfba2022305de3aac77650aec9d0aff8738d6a74e38f266450288214146d664ed3f9d6c030e09c7746ca24a3c07ee516567a91a5885b380645d072e123dfb41b5603e9cfe0a1ca538f9978b67f8f22ad911d02b74dfcc445659a5285eed259f89a9764caa840b0755299d56bbd014d08e6919d984b949e8f7d50d4523141bca3f774be13f03032f32a7a23ed95c5b3e9b8c83f1474f6173cb8a40f6430b6dbc18e30472783f54021a7272e7ae56e50ad084c0b67f1b37b54110080be7e7f929790092cf6d579d88032ed446afd634cd98cb07893ca7805ef5de782a387b27cb1566cdb000ada22d430228ea81b3aaab56459c9982a700259c751d15619c93ead0b8b75c715705a07e53031bf681b54f13984bc9f1b4f5ca7087bff9d1bd9cb55b8cb7bcdfd5e920e03ab368f734bb26eaa784b87c2cf319392f93e3ec90c35e4bfada256c52bac1c607709a7edf702d2f0d7f6ec6c531a5efb680270565b80b65712ccad6855b2e81113d1696e8abfe88819f87fe05487784b9bed88e9da16110c6f1383c4f2e28c7ee9cbcc1a2a7e043349ba3c2c43bffcfbf3209655b131bebd28ea9d15db9d1cbb8bd09e1e07b49c3e1663bbd2e22c6d69ccdbbd7b146bcdfb4aacb88b482cf6a68b975d74da3f1fb7d30438ee255eb113c6482c72b6fcc5a3fed4aa0577b3c7c7992c33c190f8b211e835f5a3073ac540e74fcbfde4a29a69547d38f4d4e51a3f366794e89727393a5acdeb8b534c7014411efefcb5361836bb3449113ee8153ae26fd82ab15f55ae0a98a11b4c1a23954299ec58d60c344888a388a0c7f2ec56178ab6e180a668f60cb56ed42e12a51f4c8e2551e327fcf92536b937bbd15046194c71c183c9df93eb2c7ea4b67a2dda07775b8ecbe208a347251f797310074ea25a0fdcbbbd798065951d1ebc8585800345a09db3498fb4d5be6a522985589808563622180680c905f21141942752c6c9911fd5ba43ad797bb6460c0e34fcd161a7cc79344ebdc54cd5b2255f82fd136b907988662531f339e1bd9b2d9ab6508ac6b11fc6721e3bc8c8e333ae86fe77bf8a8831d620c6ea044c082c3e7251913d559fabee8f783833c7c29e79c87d4f8c49480e7402cb9076179f146e31cbe9f2442fb738ff54c4f727c3786457938b3bef9bb4079a41a845302590954d12c3d296077e617ffebae3064a5864b5efdee0618397171951691ab716a4ea7993aedb69d822235e52f895a8103f423b7b55dd397901c0bb4fbed677360ccb67ff4d78c19f874e6f84b5e399f1002716dd2e8ba71e25d179b1af2f5a4103deb921b7a0b9ccf8113787cf40988dabe038d7183949f9f4befb4619c09c08046dee1394b79cffae00ded2961f03df45b204000f670980f41452a71b761608efdba19dc08b49377c6dc7441cdcb80a9786c34fe34fa5fc0d37c9e7062d3567ba6528dddb2ee9265f013f6397e87b1c212ddb90183f83ae2bc676807c51bba053b6a0e0525c850b16a72b46a9d07df2242058a69e4d0ec5d5718ca16e2bb0f7cae1dbf6f2ba8e956a675b37bea937f392f3737784f3334b04e6c3d192b32157691fe2a7ac4b2c26db504d20b1e75c07954e03f882aaaed673cf5feb20b87e5aee663c9779cf653d8751b14038f7257c673e3353c0175562aa563ef2c78365b4d161700a1d56863887007139d8faffd60f32139647b63eec9e7149d7dae1e15d88a7702d813463d769d365a9e894290e9e1af0112aae709b027cce82c90a843c37e1c54bcaf70a215f1f488beec32cf5213159a4134968756bc2a81dafb41ca17304ce11a08c09849b35eba33f5fff8223a6cde05e4a44ed35d2178900d2c20c741b1214cd76e068b19a1a10d8a623c402c060d90bbe30a9dfa5b38cdcde0828ac49d052b9aa73fb3ed33a1f8ba64db77c3714ce69e046d54f51657309456b4245e12c3b45a815d3d8cd66f37fa65c2abc98f46547dfc5d436564cc523f270cd1b7abcfcb984bb5cc1512131baf4afaa423a672568274a6a2b3cc2e65554bb4f877cf79a0ce9a4a9ab5a113641720961ddc4b8c169e64c3bb144b13116777607d2fddf12222af218a540b9c863319f4032576e7fb2abab150367c96ae371f98a77635798b9b53b71554af87eb383eecf0a0ae210ad19f697b972c48e0aafc8d74c0d9908c21a7b41fb4d08ed622526caab70a20188fcb2034548aa122cd5d7a14679c3f1df6976f39bd56f2776210deb4031607cccfba0505", "51ac65", 0, 1682244068, "2905c9c19a7f29b2726ea27b9b2472a5c48ab5bc72f89b15cf3a3a17c1d77da3"], - ["130120f704bcce5de6e256ae6c8ad48ec6d9890684471e628f07c84cb3c664d60ed9952e880200000000d02b9de2768d81127c1ce122873340937dc8ed4ce32f616ade8fbb051afef7c8cfd1b98e0000000001510f7ddebdfa2bd28b58d366df485be29dff2947a4bc104d98ea6bfe646e6c16659a4075230100000000ffffffffb6785f8623755e89edc5c55c57731b7a8b865e8c848313b86086342813e0971b000000000751ab6a5352ac51ffffffff045911ff040000000009006353ab6a536a6a0007fcfa020000000008acacac65ac6aacacb7c7460200000000095151acab0051ac53ac5e68a0030000000009005363ab6a5151006500000000", "65635363005353", 0, -1353169174, "ae724cf2f77ddbb9e59f8a5ea087defcf7b1fc9f36fbf6e53e81b5375e363389"], - ["31fcf509025cd68ee8b66ffa013aaa9b4525994105aa6024dd525e5eab8b1716bb2201ccc2000000000163eda22798025677d6e5d509c1cc33d3c7672d1e438af76d1eeaaa68fb0f831bc0d31129ce000000000252ab86a61d9102b4b557030000000005ac65ab6a6a124688040000000004abab51650000000000", "51655351006a", 0, 107304899, "7d2ec9fa3037ecdbcbd0f42c9689d91236b91a8ecdf15ac9bc1c4472a35a26c3"], - ["fdf3048d020891e4ca3ab4f79b360f02a232ec08365159f1863b2231cc39b1b0bbbc460eac0000000007006a6a63635352ffffffff55f48dd0ca1bf75fac9b045789dc594017fa069ae095728b702cf4b93be29736000000000365ab6a9c301d0a02178525020000000007ab0053ab63ab5205a45003000000000152f5c7bcb3", "5365516352ac53", 1, -174574022, "fef0140b578f7b198cf3ed70a8df74b2a947b297877a49e742395087469a4aff"], - ["674dd34c01b9fa0e4d9a3c21e921450ae84a24f1c96eb78f14abaeab7e4ea2b6800a4e2d1103000000096a5252636363516a00867cf58e042e91490300000000045153526366464d0100000000076a005165526365bc247a0400000000016342b3fd0200000000026553ba3fdbdf0100000000000000006f032401000000006df8e41ec75fee3a33ceb86881b758a537b9a4c69612ab7005cb9b494e5b55edff7c12a44b4fa027a745e5944112e67603a470c6e6891fb8129ebcfeec38e00a9339def532b8900a484401b80a6017995715528a9d0e7f545e566d751c1cff740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000078ef8dceb6992ecd94b0d0ef2755aff4fcd8992ba3643f7c8600a05d2a843c0d838ca5185a327db5b44238e87f4a8d9c618e2435d12d95d623e506c8a960edaa59b90188b220ac41d24784c6f8b51ec5081982ab6376a6a264ad8ca6540911b459f119e8f74d507529cfc092ec2886ced813e6b25041de02b59ca127bd3f200203200414d4f21800493ca69f138e13aca30a9e0d5ccd509e56176570d5ee6651f702008650318461bf14e2cc38e6e47ce7a835f049e25209113564874f980342ecb60b174bd4f3374780e83a86f99dca5f7db6053b4ff499418c04fb4998932f3c440f061390a8af313f601e3b025916eb7e571cbcfd816e63a08b0ca54aa20e0be67e020e48f5c09528397105f23aa6f1f967f385d620d9e47e9468482bb4e1438a2a16032332851a57443bca011f2ba77ca7ca7ae39a141a57725f52cb5406a3ffaa0c6b0214a8f73b9f9ae615a2aab28c219d1a1d5b6c828224f7e30708223873290ed5fa03149d3edc4c5a89d9cc7050842c827cb84bcbcd2a88da0658c928b4abacf33efe0222511cb97567c08499a885369932a2d157836701adc68229f489c72014f5b0389d6d8843344116022888f70957bbf08c9fe653dfb58268edadda32a5c7fa57484de8b245afce23d2d054f2a7f54d4592bb48d37b3ab9bd9c912e366e2ae7f0bce02b61b68db78fac3a34702694c18bf7dcb6cf2d87b63ec4f9abe614c875014ea746f0234e50313a219e9da92e74b997bbfae5419d7997ca68f5627eebd81ecca05e064a71e9d17179bd583eba939338c6da8721b53afc48b17cce7fdc70a9694ac11d4103792f704d0738c9e0875d3a88ad85a23660be7fa333f5ebddcb3d7142e96ad5cf2dc6f53992cd90ca4a874a5f85cd5b6a58692eb0e7070bf5b717550362a0ff2e3a45d7c1f347b5db75c3b9925f1db20b02159d78321092ba0ff58300333f095aa1449ea19365a4f0ebd404f9d1c438520a495720305bd3c257e8824a1d419cd35edfa3fe1f31dae16373bd2f24dcc4a7c1f3a948a4e4bdf1d207c44c73f7ac7c2eecfd03f494ca6f10ef0e48571e5dcf816c45d9261adfc3eb5763bd79ce778986b412d1ef2d6495a0cf3a94f06e7a679ccf7261d02bbf2301759b162ca2ac1c98c347944c366d32eddc6983b79a12285e7f662fdf6b7b02bbd68bf8c0e27443012f3c488222b129692a2ec85e02ba678f19550a392c72f3878d62c4bc7c667865bbb5d62f6ebc2f4676b5cc32e797e83b915220b9d60319e4fdcaa9ea3bdd532841bf7ddcd4b079f77ef3edbf04a78553742acf8b60d1f8fec16874376425b79ec8eaaebd4cc7871d1c28c7e782ba709d957a36cf9dd7bea4f486b603bff1ecdf1fd54e12e444f2eeefda3616a23bd00627f9ad7e714f4db8c113e6e68132f74195d42dcb5930611b86b13781699e6c6d5fb749c8deb83f524cbf7e6e6e07e702595368c0b33966ad99825d85d8fd000fbaf40b242bb43531df98fbdef4b754e86cedf42a5715c74666611e0fd41dc6b6b0f253583dd086024af1615bdc181a35f759f353f33e982ac22f4af6cbeb6ba249d6c3720c9dfa603f73749a79f62acfe587543b75c53ad6c1e3921ba0ad95a24dd62df76bd91cb9b93d706223bd1613a779c2079936f4eff9db59790987dde6865d312bded8be486d727034b9076fd275c0d06419cc9bafe8b1bf548992517a03302b0c27f1f405e59fc2cdc732ee65b9bc66ff444f2e7203affe29e6b95463313a9111fbf50408f2269b37d630293f80d12a44565326bae4cedf51c5f6d1e86e90b0e2acdcf26d75473c03bd889e220d27c1317c417b3ad3b63405b72590c6951424e4453993cc313d01bc2cab908aaa0ac58e48231338f9e04fdae1085ffe1f3f354005a425086256aee28accc1f5a44808425552b19f8fcc970174691c9fd8214a583481cc75484bb92e35194cde3d9b180c0cee8125ca41d3e32640afb5f414fb8b0dd0d0b786bafbcd3e3864f6c9159413f43f2097fd251905ced01f4f27ac6e08a664ba0c9ebe9f53e80bdbe4dad4398918d3a4f35836a2a5a023c91c9580f3e7e3263d5d7eff10e266450735411ea0ea33563a6012e9524450118fa00d982919ea6a64f37bf72d9bda7feac818911be520a38a6a4da2ccff8733c8834214556d53682281438cdd1548a778e0bc697b398a4da5f7352a048521e641fb0c0635374406c2ad94954b4ec8449b089c92e979bdde178748e276c7bb43721542845e6df6ed4216637b2eeb807da68c1b51a21f4ac421015ce78f69122e018dd1308beb155f2ba393441a5ba72e595c2320741043c87bc68ea0994d336e065cd96114838d918b09a7308e7b806ca2d1caae1b4016551913b3fc6b59876a44bef569d74f8c4a280248d4241943fd3d080a5741dd236b357b96ec1b0f", "5353635351516a", 0, -1179814581, "cdd936c96410936e0176ff09047d43ad7f021191e30e25cff995b8a0c3e59d66"], - ["b33630b8042e20a4c471c2b8a200779767ed87c3b963d3ef784174e846fbfa8ed4a1f92d3a01000000086a6553abac6aabacffffffff18b00cbc134cb064360fa3367fa435ec0b4ef755b3285f367ffdb5ccaf1f35830200000007655353ab5365ab5daff9c772a06f79c94050683f875d58004964dbe5871df8d93999302de1003c7304d5e80300000009ac0000acab5253ab00ffffffffe47ff817a1915d1f66b17d74c17ad595daf56ea4d74924f63a2f1684ef217eee0200000007ac6553655300abffffffff03e4948600000000000551ab5263652982f402000000000553ab6351653d06ad03000000000852656300acab005200000000", "ac516aac51", 2, -2072248370, "9c30b43f14ae024b160f772d61761bdefe081e1613fb974948c25d200654ec21"], - ["1bb4a88d0491c2da87db48718e23a9ba5dfc1d771da725814fb45c344727f5c12fe012aaeb0300000000ffffffffe72036f23e430851817073665edb38a80cbfb9695d21f86437c5cca92334334a03000000040065ac000f50aeb307bef0476e4286a9b69f17557275dce096249306c57d3ee7e43e1cd3278132900300000000ffffffff978bd571a89c9dfe8d7d68de0b132c183aa36d219ac9e0fd19933207cb019403030000000263ab1af052cd03fd18d2000000000006516352535251060c65040000000005530051ab52594db80400000000025100844fe664", "656500", 0, -492402049, "9b9a0997b7e776a538d70113109a7e7941c2c3d851e02d6660079a8e9f03551f"], - ["c6afc94102f11d2ce065e808ae5fabd8cc781f677e76a0074c31996dadb35ca5ba7f45366c02000000025165f4cf1b580d48d3d884e9a012ba93dec2804dd173e75de41310676cd017481b5e360ad0960000000000ffffffff04199a0702000000000663636351636a028991030000000002006322cdfa020000000007acab0052ac63510e3770030000000001ac0000000002000000000000000041a362020000000066980ec769aba8bf96f4c6c60b1a9b2a8fcc60b1b577f5590e8bf3080ae3baa37be6735c54511fa952ec45ed44adf53382b06cb9d5397d03292fbb02efb6be3a4a9d7d2297bd28ccafde29d1b11d38a59dcc69435a8489fc3e3092e4cf0019aa00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000283edefb695b42ea586345abbd6796a171f433419eb6c6da3aec35d89f4dd864c9f81774714dafc7ac8fd6ea0d33e912b9488872af1758a7193c93d1a6f5444431231ccaaf95cf4f5a95a146b730fa44f1820018cf59ca4db2d5eaa7a1da4d542ee34b52ddbc547de22c131c8ca8682776e6b71fddbdcc5cb0bb939cccd80c65021d2ce73e38a78cb46a16a1155567ef85454764ee242a4eee63e0030289b31e9303297868fca02655ebca013c9198cdbd6b52085d504a2074b7234eea9cf9f9d6480b2a0a17ab76a6827c25d94b6f1db26d1949d8b20b7c46718235578c310db1760d06d167b66db203a3b260d4deb31be2ec32cdb53ab698f8482b2f9430f793c8580301a1d99585bba466e0a5354a16b76a978380f4872680d4ca30f91296c0b2a17903276791c0045aceb9e4229d7d0465135a63ab74f48b09d2e6e9115bc7ed39837203262ccfcd4fee1c4ab9a99aec37ec30e392911103f5d59ad5ec2b01621f3b901e020aa925e598f63d69fda3fec15865169ea582e80d53df599a79b310928a11cf590226063ec0af55535750212be350859c31bf23b8e748cb7befac0da4900876368de5756efaea685a8389c1c599751916cea4cd146aa2ca57f51daf1c9151de6303c5870c27f5c0189bd2ddc39e3a36702dba42f0b5ad51b6e74efc3c1a6e7dda69a7f0e121baa6eb9a5b7929f9e62b6f3e513ce1ab89b14eca64916398c2cb6ea630089275e98b544c97f8d9e92b1db4c2cf0e2ed8baff8db23e40071dcbef02138b62c1c3873f192599e7ffd25fc3534b80d1014f14089eebb4f8c943f9032f0b49c0439b57890d0bc86f88a28be3ab71451948cf3402395ae8a809a88993ef3c01b413f86d32f4bc474fda7d63db6d4baae15e173bf9565da616185ae333a1b618af3e9950726e96e248e73ed4b245a4777a6b76baa60c57f9508faa17ef7c95db9dfe4b7755c6b0a9aa7d1d7381329560b8ceb91ca3cb29927eccc45b8f133e56459ca2d997272e1b963a327d921d567b610699196e800c8b5343639e12dde4b7757abc93d319364930948db9c83825f96e64a6f0d62e104242388f3d668bc27f491a73d265ec0e256412ff4b15969bbe229936a1052ba854f4a1c85e49036885bb7c68a6f9de7a8864806a97813460a6ae3ef13950bd6de725357897fdc45b88eb4098a32de1083500e4c33866a85d52bdc661d72e1f2d589c5f3afc3c83a7444ac2540b51b7eddc93cd5c6a1cda114d0fe6686b90374b0d5a4e885c96820cff755d59f61bb129ec585427aa7b47056dbf9a47697ebff5627a01d398a56f9d37ffc0b850df14cc489547a31ca169ba33f6d6182a166ae654560ecadd97d66e6c9ef816a08038d4c803329f3954a399292bdc87dce708e02b3a37a5aa6ccc071f9a181a2c5299a6ab40cc18d1d1204de95358ed816d0c18c0fecee07c7b5b5789949a116268ec000f7a930f6c1c59b3cdeed8ca695cb7a56b4c414a0e9505f5f7ae0855550c3ae8c715ca3d4bf7b2ed06ea3076bc77fff10cd34c336f46c7f4227be71f06693c5ee8494d276b1561d048ab96e1714cff1ff54c9be37c438800c972c706d41fdb25711bd6d3862fb998ab4e37efd233fb36b4917af9a9acb38cb2d239d68cdd72b2f78469bc7364fa6539a244a7fa65ec8f7e2a6d29f97d853720ab868d75d15afb5ac7fb878ccf1896c92d74bc26f5cdfbd8e5778b19d266c0ea4e94f7ab1f5904c24fb02f407497c579edffea8d9a7646ea58b35a024b43ef065f5614762299b99df1a07c5922ae54490cf907975c0b93178667a9701688182a5d38a89be6d16586f80b67997427b77edccc8a3e2c41dd18db3584c98041651907cec1b182da71c1b26d9cc6e22a1dae7e441f693edb9267b929a3fe8e894a927ba82e475e2901a46073c6cf575c1a37bb575f81b2eb1531dfdcde6a670ab6abbf8b5f95b0e210b56ee93b10ac16d55dbf12eb9dc86d382a507da9ef08f508dc7bbecf5c3c13f89a9fa56a1cdc27dc79b484e2e1d2234e81e0b16ea4a2eede6404af0c1df59c99bc97723aae1f6f75a3d77f3090a65ad1ef8bd89b7d2ecf61c43d96a4042fa73db841cf840ac930e4ee6af722956bed97eeeebd11954cabc74ca661e082f1651a7c95dfbc8c356a300061402b78b8e44eaf39607e46af8f84843f3ced294bcc56935b6c872396a13adad7eee20f5bc394536581e41c2dc5327ffeca6a16b59bce81e573e0be21f123a7bbcf40b4579fd11efecafdb7796d2aa4e00376bea16b9db7e443f467a6fcf3f1d44745a903000000000000000000000000e77f4a692b1b612152ef089e52c48a0ea68d8fecad812b5dc17050ac7edf996b55a2c00a977296f44d87d0f572310ca5c79c66d9d096e6cee60878702d3e8d6f16eddf339e6b632b88ebcb8df144e2402068705d2a32409fb21c8791ea9d3b51000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f85fcf65aced049850b3f92871b1f951802ac707cc43502f6fd4c4b41863e39018639190926d46b8ef323e238b5029e4a54f2a77b2d7700a4de0052381c471713435cc423c599a6fdc35bf1d5fc51e73b0d11fa70ee4e8a1a9ee0d061e1c123d5938aa223e76d07e8db0cb87fcfae176f366c6c65f3f07e205f74a2c5561da8021811339698a1a60e09a5e02868eefec358f52daceb5dfe5c235142e071d3cd7703120f4fc55beaadeb4ebc7c34c6c6b8d8edaf4a76f156302fa2f545bfeec0f3520b2a165646f56cb52c7878b437b1d1a4fd3b473f709d4821cd87bc4ac3181f87af1ebc68c45af5fe9e723d827accadbc32fbcad5036f4e93c27c8646f8d9c75a8e021b8eaedadaaa4b0afe17593633dd40c3679c98c0eb3a8726aec89c7b2aafacb2032309fa6b2aae6f81cf249c33a364912c99722a23b161e3faf83b1ff2c8ae151d031b83717c475af145169b4059314f142c155f5c8eaeb5c4d954f16dbce793391b030a7df4d1cc713c7dc1f2a63626cb6b71791aba72e5bb78754fbe4058bcb81b1302174f17c4353cc4622c2b75d2e07c0af3098242140fa64a4d9d662953069d678c7778ab0806508ef710b6f03b3162f0a11b1764e117c74befe5aaad2669005b6834881ec872d31a8cd6da023d4e9f823c1c18a2ec65fb7085fe936461c3d94da4bae1c6d5c0309504b1915374adbe05adbdb04ccb2dc45ab9207f05c9fa10402f295ff0a5e86c3c8efe735a087d4eaeaa3fc929b3e7e2f6def44c90913d0c55ae5120fbbe68f5c7abb556cb8018ba8e2391e0c1c5843a2e06aafb4f6c8ad98c7aa626bd8c26b347daccbb35f78dfc08441db8f8afb6f2448ce54e48a11dd7fb39c78d06229f95b00b5770710e0ef20bb29a4761554c2346fc05d8a3521d68a99a0cd26bb3fcdeaf4dc488c5af519ea1834a9b7a47e0f7c6cc3c97fb84537a8bff0fda39db5a6613193d2813d566d1e66f72a2c51e021ab88111933ac33488e807ae9cae2ba9f01c5f1bb47bf94cf9e11cffb9d3335960d2e896d9808ae2f4295b71f4ebdbf7b6f691447d5880afd4c3806abed195aa119131b72e638e025cfcf326875664b2a7a078a5b0aa89e2c71a5433a6c446d9aae0113ef807290cd820f4759015ddd4b94c4ca6a856bd5342a33b8b1550d676a7b200d21f1c0d55540c2c2fe845ef1d5a1ad408b0865a884e61377361bf5301dfe179080d404b8dbc121070bb6f3dcdce074328a50b5dfa63ee6ae12ea3a1149a0fa7acdb31016551a9947ddcce126066302586759a15c688f54b1f7a99d9ba9414a7f591884948cab193d2f3fa56c19a5e8ff21df2b732dffa4bd0744a1c894e3f40df20bcfd24a836eb250f08e54df48a8eae54568faca8fb2592852bb8fb3ecaeac8bc5ddfae648a09fa363c544b19b4e59c2aaeaca96357f529564f44a10d68cdf971c25e0cf0541a1e9a4a31529dd0bdf4bb8eaaa4044d774a1b44cc32591ab186027349a284cb960a57187d08177c55fabec39ebf43209d1a8ff052c63320f15fb47fa758312a21424cd97456e432912e0af8533f97610b325b1a29d33c1bc1025b8b76dbd7cc14cbfb9dc2399f8256ad23c7310a09922448e79582c3ea0fe694b989cd297b49177e7c22c34e2b5c8f28e7326b47a571c80ca1bf93823c444d359c3fa792b06e12d8ec2897e63eea825e74ca24cb8a3219a6990d660b42b1dfc5c3f601a8058eabeb7e45df44cfe366f5c6a2f1508f425befa4bb8530d98514ba687260d53984ea9db684cf0c971b0b9598a82bcb6a0d1ed1db7c4bc0b0faeec3b20e91de53b54a6c56d19299ebe698042fde436fe2cb944e176d24c6b5df447d043d3335d8446cdd651d3bf98f5862822ebb3e75e16868a8ac2e284c6245fa1ef39cfc39d99f958018f91f876b137d802841d8365c175c1034dc42e2a62b7338c1c281966cf0695b36a8c4853d1b84e27b4b6f4b9ca412dc2537aac5fb26370ccead516d9cd133ada24b470cb2038164ff79ff264cbc88aa2720f478c3921c93379e1aca4c28af301567d415adc3338e6091d29d42b3c969209e03c56a2fab23ea3080a19fb079df036278ab11cf01da7feb52b6e394a5803a2dc53dce64d5e4d7102a594c78bc0b5c328e8b69e44e46a763eed0e6abdec0d7256514a036e2d9fd2cc9acc7b24b8090c9ad25e9738fc45466c3121f62790973295c9c53f7167584eda04a695d868003c3e47fd2b40f3ef75b87b8a92bc7616d1e4c82d8d384c73624a4b72c492fc7ccb5bde3b02dbeb4bddeda0b2c3fa9e0a475ef70da3c8a087ecce68ce5525f578a601be24304e7513b4a39deea80dfe8122ef9ed5b8a5ca2860ab42c1b234bc46b2662ef3dca7359419d935683280b9589cd921b2321a59c6df8b1a92b3dd110ff23a17eff6b791c4b5d79357313b3450b", "", 1, -1806082883, "136b11c237763e8a7550cbb872497f1950bd7e67db8354b838b9d697edb836da"], - ["78b5fed203eb1f5234d3db8396e396c2c0e4000909293c6aa7c12b69275826196a320f49a90100000008526aab51516a535288a7b6aff9f87f8e6c713820cbed15ee30cafbb8c1d420a24c68110c16216d567e388d190000000009ab65656a635352ab53ffffffff1fc42a64e2e7e2d7fc3207971eb479a73b8526d3475ae7c7db641bdd4cff756f000000000252abffffffff01b9b4f704000000000352acacb39edd6f", "acac6365", 1, -312222388, "8237040b585260c6142c32d32376fd81fc0c8e98c223444a098f4cf07ca106fa"], - ["8b58b786014ef8486237a1760a17a3c5959762eaf1fb5efee0e27f9c070838bba7452739e301000000095253ab51526aab636a34791ec60430357103000000000100697e92020000000000dcf39e020000000009635365516365525263af514b010000000003ab52529569d4d8", "006a6a516a5152", 0, -1006106332, "796735219f82b66fda07ab931a3bacd84ffc06418187543a67c51a0de263ff6a"], - ["2dc75244028614d2bf61b75c181150bacb4ef05fa009684b5855ff7f8a5bb7c7c1e9a0c90b0200000001abfffffffff27031029851f364a1301113378078f6a01bfadaa87c3c1765153c319abc441700000000086565ac656aab63abffffffff044cabb4020000000006acab63ab005108eb40030000000009ac650063ab515265000b7beb05000000000863ab6aabacab525359d2de050000000004ac636563000000000299da81040000000000000000000000005446f37a2401cb2b43c310725b7fa9b6b7099b6c51beae1ac35c906eaf0ac4b7b6ece7ac09c1430e92e58d379634a5612b60d578885b20bf83fec66241cc2b1e5f71557a881e8de89fbd922d74f2b99b81de137d08bd6c48ec76a07a0db1e3b700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b23925714944312662d9e0a4a7229997b9017b09ab6201bed75ab263b468bf2fab2bbe11207b7d1e48088ecb1de33e85fce4490c50e35e309cd215537e2b36e8c5bdac4fa1a048a1eaf2bb20668c60cbc93703301f038eca785aaf3abfeef8dc195ad5234d645957b8e9b90c603a9300cba24ab2a4ba9e5ad89d37a10f80cc6c031b034ff01e0c382571b91d4925d6032e72939de9adc6346da88a63b1deda9fca03057f7e442028b7f952c9248ba6a283bafc9e962388243bac150b3319521469660a1ae6f43c874da1773dca1b1eeab278f24999b3faaa4aebd6aea0859aee5dcc061b3356503df94e63790fe2c1ebe61cf58acd104d0eaf41178ad8d9f9f491d712032d90b5bdb2927f7615787fefbae94683dd2ed1a8e4674d608eb35a853fe2c10902212cb566485418767a09d9f7a1fe048abdc0ed24015d4e5339e46f621262abe202288d8a7374694edfb1b1e9ed7a4c6b9af8e38c51a545a6f018d6fa85852bb2a80313f570c79fe5c6160eba019f41add4458049248aba6e13de740d41ef47533cde02158a57ec35ce53c404ad060f467741a60db7e26f24d19034ed2b29c862112c26af96eab14a04b785b122f523cc2f1e806b3b2849bb7be6f2293f8f69df5afddd74f641531dc5470b587a7ba9ada0f747da6587428bc2c2483fbb441c6c3f32a59cbb3feaf14f34b1f718e5607f5db10eec18adab4f45f9c3fa07bc6c2fda5ed6354968c4387d74069c69899ff4397308b809b9e3a9887bc4d93d0ec633c8691e11e15f4391f817114c1175cc38958b7b28faf16709a328b2dfa452c55ac2cd7109cb1374bebd6ef220c49601ffc853fa34681f89c035dd9721bf922c5fff6310b30639e4ff1fc227cacbdbc5e8a9552da95d7f62c0deab621e1546c624e3778b57dd24dfedfa919e1e19412d38570553a830d777cfbb57f16f772f7d5e32d5762a495ab45e087b2b0e28a019551a997c9a98aebc7ee454951c3834ebc379ca53820df17b9a00a605c50d279efb77094a00012ae3df582dcf64efd8104e4b5605b12aed19c7282fc55bc22fd087bfb98db03a104bb655b2e91672c2d125f1c1c8a8099320d105c34700e2aaeece98a6b9485cb6fb8e375b9424c41184679b1d6a96bdbb2dc82424c21ce389456f60f08db44e15ca969000a832f572499c8605e8e12ef9767f236427f731b3d296beafdcebdb1a81c766bef98be9193a64f979c87221544bf8945ce09eb2796cbd80b319d8d176ecfb662aad8871eec1c2325900e96865875d569f5f38aac2a8e1127cafd51acd27840efe57f4064ee7e9f8ac65153442ccee46776f31a08733cacbfd63a01d587c040ec3927c8f9c81b822897685c3cc56b1e3c7ff16b7686140a78742966d07533f4e30be5e034cbac70ee197f5a2b57f4ecad8285359fdc0e3cfdacedbefc8bc8e92d745be9a05cdb79d04c488d2991d9275591adafadb5a88b92c22ef6c57996573749f15da60b815ff114500b3ad6cba4a785417a78ddd25df651bab79ee7950d6721bef191d3434159e583d5969bcea7567e42162610a917c221dee170fa5bdee98fb83fd7ef82533ff3be311e970983488e1855749ef9a245e3b141bfa6b8a2819c9a1374536ea89e3f178a6bb3dfd91ff0ce86245d4189d63aceb5a7f0c755fe41e9413e301c8ee86b250375b3713d935cb2b39cd6757b0e7dbff2af4548d2bc8f3a409dc8198f7e559532661eb33edb041d8e56ce90626666af9417a9570327592ee718da14d4ebe798753c7618a5fd8c9a13a19414fef7df7cb60cac532350a78bfe70c1460d7b967c55a8dbb3babd98e0060e1aa21d40961ea6863d11aae37584aff2e27dddc74814fa046bebf2e3882794fd71770146cef29d46fec4bf7cf6dfb370069734caacb1440ecaac02c364e6f06fd4b946e61ba8e97cac3b9057dbbb97cffe5c213d3dd5f418483b97bd020061bd81e938e274ca585d0550b40b49f21d2756ad94431c653ebe7c0602849d9cff71a5debb18718bbb8a0a8657398f5c6c23cd126e8d7600c0271f7971a2103c0a0db2f570b3ddb67581724b8e90c5a0ac94682e0e7680bf7daa4f84be10c4396e844c4dfae75a15d92cb4074468ed2fe88b9375f106f7d396e049d11e49c3574f514d332c807722371af2239fba379b39524d5dc070a39c3f208b52843307c1c2e9517834ed69f3af6817e19aedd3f3808471dea78ffe611658b7451ce7badd42013d5be884292a5e1360456de371778ecab798e0e3b2c53b8e65a1882df1f39c0feab09609f27a335535bb6030000000000000000000000003466672fa63b69afa70c13987de8e7263bd3690b9c02ce07e55fc7a29b56498006fe36e815365f2ff1f82afc89e764def8d114e6cc1eea5182cf875b5abc0d67f3df7a5c52917d4cc730d1bf6edf00138405d4288baf952c809ac9dc0787cc0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ef2a9739c0dd688f9e77555b90118b8c4d7eb749db0b7605f3acdcd59ef0f653e02d47ddf218c1bb7c5da9f4d3624a55a72fb99a0159246d227aa064de05cb56e2fa5a64ea3b227b7a42f721ee6e7a04b601346f3ce283cdc99e45ea06fb3cbe6adfab91d998ad9c59acf1df7a1146c5f01ee0a3e0ff7eab778fa904af7ddc160202649723d2d138ed3d6b0d6bb30c0ff7f9d573633d38f7bfb15c0afecd2d349c0206c12cd59a752a61a783f880d8256475ea3579fdc57b7c7698c58c780f2921b30a2bb44053ae8638bd841868f930b12be85b463fe4598965937e86da4d36adf5bc0606ddd9c97896b235e9263e8653d9169897b8db0abe645bfa572644188c63fc0227b8b5fedfd24c045bb21b4f8df4dd7792360e3d6e1f492e329d5ba25e489547021b010a1d1636cf64ed07966d5c35bebe80028a14e33d4f8ef65a3672996fc57c030c76aa7afb345b772286af10cf4be7879f8fd36d2fb096917f7b94fbfb8d2ec903054282f928a7525bc91dd2ebb247ddce67e3259a04b088d308e2388d7d4e91a9022b4a0e9e483aa11bf448aa61b09dc6c060e15e9c821765ba9afb5204fb15fbfdc1ea8c314ec77f972e2c0396eb42da39d9020ad67b1cc2c2391f0f698aa6ee50cd9b874553535fddee4b733e87139a92d5998d3513400e276cc0631e7b91c35624ab393f9b8561123ba3b118ebed5b9d036797ce50f702b7a4419d151877fe478e29446bd29e1ddd05c41d179b69663b4ef80689dc5141a6cb5d78ccd45e9512671f9fa0c84ef1abc49369908ffa9b582110947c118928142aecc27a35d8b0696eb564eef4d861083e196e8a15af38f31ea580937303470558a64a7792dd7427939ac868196c5f9e85ff270603500138c742300a19ddef6b8336b6b16034e8171c387ca43c8d6a46fb9cda1f81f03b2367431fb21b770028bc49a921c0084374d71314151570b3b9b6a98c6a24e4e5f9eca350b4ca804d2993fdec19d30530537e97099ed36a96a585139342c36f88f50c89841b7ef45acb4da0f28d805ddef2027a58965fb7e79511fe3abf6e41bcff360b374cff3d70b3e1528b563fd05b6dfd480e84949ff68371567cd5d6833ae06cff4ff0bed664d14ed2bc26c8ffb6380b59858638c8ff397b9242765cc98506cb499ca6e6d9fc0b00fc22df125c6d526c76d8b10f3c5a629039f50295349ada63c1121f3b81ff86f8afffc5ad945d38b1bfd4dedaf1a73db76d0888b6126839af7978896437f40d7f4227e0fdad771828c24d4ed608b7d35065c5ff28ba09baf86c235935eacdde68bc5c0b9be1377f5e525a0d98238658f4f693548ee081350db8b1c85e2fe5da244b10593caf303d93d246bfb4414e83cb5b81e015770d64e05e97b23a93fa4b6f456066955ff96b96cd1fd727206ed6cb99d66334f107afae9463a945526c21a1f53d71a960bf84f1e9b0465a1b90cbbce7ff24c3ffd26334f384cd66900cdf5957dc87a9fdcc748df318458b857230a474541e4b75ac9e018223ee4ebbae49898e1a16b1b551c042c1956b9e09cd619a6cd1fbd7a0767f989c5b88524e16f0cc913d21632219ec581cda439370dbcead1c28e03c85c36ea7f99ead600586016e2613bc0cbb17dcb3e597860d710bc197c7345462dc8027417a42d38e71391fdc25aeae188f9ba249557e6e020d32d0f7e6e6ffbb4abf17d3536bbd97a51b03b444b98280b29bd96738ff34485154f963481f62c5ac12c5a842ea9b177f94d9aeffda870d17d608f36131060ecd41d87c9a519559f2bdd7bfe8d7fbf3c0abeba28fde0cfa042a85c023c954db88df77d45a47daef9bf89eeefa74b76095c12e080d1aabb96d7915a32963d0fabc37c976f5a3687188c2c50873540b07e0c79882f17f0d7e9dce1d58a50316be0083a33e366188769506b508308dfb91fc371f319ed1a1a0b5fab4b76ff5742c8b7607885622f8f5d024a0f1dd6e8409313ac455f3159f492e5a2b4d151abac9756deb80df1ee89bcd029f146c6e37eb86488252d95bdf11f419a09a866168da76511654f079dda825043dd33da13bcd914dcc69a687c630e1e2285385a378ccf9c20cf97bc0a656c391c37e3a27cbe5260e18e49cd1316672dc2f29a2fc0cfd2e567d3577fb7f0d5dfa7bd2683390c211732ad8a55cfd20c84694eaa356a993896bfac4e4900f5d0c3d2009ed0285f36158c132821b4c4169568e8cb4306875035fb60caed41070d55bfbab6371cd74f8b2434c4f80512b962f091501b4c575eff689d87916811b18fed6c283a549b93aac815fd2460b16b7241d02f42950e9e548989d30fee2a6826bb3608f699e4ddf05ac852ec54e06909f1972db8767be636df649d8d11545498db1682f033283e13ed134b9cc09b519979f7841557216a6995a6ac45be80d937b355a02", "", 0, 708405700, "7df168846b9a42e9f2b615e6488ae9c008249d663628e738198f1826f5d50049"], - ["890cae4a046e5bc7cde2f412d50dd0b4d0eb282f72fd99c3e36c70423302efbb5f237976d800000000086a6a526a0052ac00eeef743f680a75e7908a6a0413b78e896c697e97f4161d8c7fb28f62a7d72d9c4acc14380000000000d8f313e8f854e92881e1efa1f5f43eeda2e5b4caad58047ecd244ec218a82c598bf5b86e000000000151bf3e33810e17235fe948922a5cac027cf989cdaa5d8c594a06841087974999317b5286a90100000006635165530051ffffffff013a449f010000000008ab005151ac536351c3fb867f01ff879104000000000000000000000000af952889b7a361a74351c06c466d0f383185724618af4dc3b18d7cfd1a0bf7eb8906f64407537d461085a7b65494a791922db90e65a67aed827b308bd775cd88fed5e48f123f735b64799209ecdbda731078433959191f1d1a2af7d0a1e27e8e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000769cf5565f6754f0734d6426f7e302d24f5d2a3dbe9f2ef9fd8b8fe89568aa579690ba195565ce9b08801c72d912c92b014965a38f6a27e2b33b6c896e43dd84e2d689ce8585ba580d72de8be04143569ba2f5c11c98669de1d9fc7ecf22f1299807b81af0ff8ef07c7add772b024b8f3e03d7a297699a0401f52e2683806b140215cd5327a1591deb7d82f2c042e633ce3ab56c8725c06af258cf7576bb14c1900301a87963ef710d0442441c36ee98736adefbe0e82e050bc20e196bb08023fdee0b1c40706c7173d100b959eb6f301226b521e28987d3b7e159c7bc271e75cd3fed17cfceb32622094c718b299bad58cf744e9e65cfdf65722c8cf0b0daacf755f50216596f4ff1645c55d0ced982c34ed375ce6036f0ad4f4050d58dfb8dd416e1a103232338daba77efb9fb2276a9c72199be5ad46c195339fbf2d62b8d5d215f827602029f8afdae74585798cfaee27afe6bcf3f256027a8166d0522fd59750a6356f3030778c12c0724ba990db90600d79cfda870765bbe495ef5ae3594ca595b18d73b031062c79979624891701ebf41224cfd00ae7875102b1b369778a33aef2eec79b37c103bee5af1e6b1b8cc5b735604ee2a273207e10ec5e96229905311b9aca595eabd6a1ff5e54f7a65eceda22cb1941315becffe5eb030910befce7d5e153ce9e36d05793baa8ff44b4663fe0b73e28417edf70e17f98b0aa5c377053087acdeb1571622db00c4ed448c9ef77c85e2f01e52795133e602e707a2f3e5d906143837d7366eed6fdb7b07b6445e53e5f646f3d9035e8b4fd77f94a036fc4909cfd70fc21b2ce890cdb07584d44d1b948971fe22d6d5d668cbfc38d540b15140d4af31fc9df257c9fcbda103948a93b02f0c1114ec85a2c75890779cee5f14f3242c632053908a508f2c402e57325fc8854828da4babf20f79fb4c7a744d771b8ee52dab284ad9c5a386f253ad30d9e55419b5addab154c47344c4c44ffdb22989dc9de0870af3ca566601f42c72081995f55edb2caa15ba4dfc5384210c2c0c236fa2846301b509df221c0b3e1dc5c0d580b48a6263553f7f45c60189fb134e2603940ca64d26f12e20ec7725fa8fccb1d01b487efc5a51f7b6f89947457fcce4aabf5c1daedd92108104864d845612b385a58975718c11d4814cc66133a193719e1bf804846edc525a65931b7e2cb168246b5acf75f534ead657aa5279d854392374c84e49da62dbec50caed93e185eb030b635416480b36386b307ffd885967c39b0b8c5321ae6f67ec9563708013f58eadb791b0eca56bc201f23b8a7e300e34c8eb99f3653d4f9fc41402a8a0a00209148790a463c8ba59a471933f11779ba2edc8631bd52008482f0921d4bdb7dd6b1d65a8a497ebacd32bb4f65aa7e5b16c2e6342cfaf7c8b9fedd72fe37edfbb9e60a5506d5f5b504424be9dac4341e689fb9d2d0e0b7793476c4e1cfbb3085ea7e9672f342df6b506fd1a3b6bad80951c7031a46e8bd79b09e118ea2d86aaf11a8adf87ed384a40330a3e1acb0ad4b4edeb64fa3e836fadd18d6c2ec84a95594dfff68d40510f2c992227183b2ec54e9f3a6311a212262eddcd07f24a5b3a26c301041e5bb35c34374df8d123e111a60414a9611c4651108417b72ea09eb46d609080d3ce0243c0cdd0246ef9a0a2167f3aaeb5fe957a1fd3095619a95180220f94a837a75babe75e1c47773a2c737b447819f82b83eff9e7a86222a7be28114908aab608b7fee0b6a161e3ba8e2355395d1a03f6c0805bfb450051cab7cabcceffeb87b485241be744c367cd49cbb53ebc3b000f71eaf682c431ce210277f5f62666de8a4cfb75394b1fa4d534f37565a249fde13145ccbc556dd0476cc71046652584cb51bfb6c3b19362a5b1f857c58637a77732e49f0c7df9f8ce940059b25c1589649e1149cb6898e8973847dcaa753a84a0fe74eb587cea4091cd68c5ef1d421758428c9c14d8e2472535ee0055331cf7e989bbf1d4321c8799932244b50bde2347525389166ac21df4f5360e62b7ec1b50851df4ae870f1aea007dc2fbd10c7f91376f1b2caf6f89ce478b1124a82e9c7fd773416a70d72e98751829ae10f711f156179b7ed30ad210973fa0387f8872088d9e3ed7157d7c248a3e5e21d37c4abb4621e6dab13df4013f2a99b03785897f2b1ad19d6141c1a6dbbdd467d77558c4f77268df8cf507c32a554b87a523a03750e618958c3295676fbccdc697a3dd412877f4f0281c81cc82a7daedd732dca13c631fb0891b8fea90dd9d53232d719c8b7b0b1bf007b974d5937e4d8bf1f9a265e29aea63f8f2b34d6cb231cd359a712f0e33440cef7a7985a5abe9119089eecee9b43ca57a79c0de90f4be599270cd56e83f5c5d517e1aee9b0e6f0846268af751f6793e6b8e5883a3a903a506", "5153ac65", 3, -436933761, "916016e4626e3fc00fc2ec847824e9430ab883606c993e10ca848e8ea076774f"], - ["170dfb43015c127f3c56f5323f74a3ffcd84e40aa2be12ef65258db4f21e5def908d29d83502000000026565ecceccad016c1e480300000000076a52530053ab630000000001ce148b04000000000000000000000000bff1308c0a531d294dd10117992ff627c00b92aa9b6493779b51ba1243bee64471dd35222b088ea8dc89e8cf88322a59efd05ed0839f542e9813011b91b549a14790ed12d41c18ffa061e5088e798f0c8570de78be4f2a3a8cbf6e602e6783de00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c755356c00348d323a28fe662174c49428a5632ff3780ef038feb8e5f683d1ed3eec7182058ea7a011a4d3bc667b0c51adc62927192548cc767bc954130853ccb4f76b53e283e53bf09dac21e1ceb6d577af0820b2df6ed3fd4a385cac2b52d9258e42b10f893f11664eae709b9387a0d6d605da0e68dde0dea3b4878fa8aa6e022c3e4b6beab31764232f0beabf20e79da2ff0d46196f7ff2b929a8f5cd530d75031b2089ccd425421943b66d12c25328b2171b4af749195aea82626e4c59e0159d0b07b8330882e26cbe2449cede9a4081a72052bac410ad5cbdf33c8ed1e1e448970209fd6ef091234381dd6e5db506e9f4cb8fd2622153299b22eaa5dab117bf4503186663b55679945cc5cb4ea9f765e4da7bf13510e86966a9a9ae1ea9ccd75b5c022c2768cd58513c476b2db2b39716c8ea7e19afd25234c554f3ab98c2afeecc7502196f65d42edadb0dfa35e66ffb86c5f30af3373634e2c172f7d5afcdefa7643702225a71855abb733172836c69e7338960d69f9d72be5a8f04e2ea7c2f328e123502112bcd6117ae913a48280ae7033e034f0ae78c3bee22dc34aad0a6a09140bc5ad5e2a56068367d2d86ea6900d163263d503e398d2e552ac9fbf3d4e06c32fd27695c29963bc0ab0998dc28e887882cfe8eed5d7b3c4fa7d343aabff45dfad13052c00e291582ed2ae62d80052fefa35e625b8b3bedaa8f4102749f7f6761650f4975bc3d2728ec8b0f898c0341a22b08a1b0a77077096d2062510757f01e779afdfeb331a903ba351f60407e92c4567997a2486672ab648bf07a97848d1a6e6907d5e681398a0403edb7fa290e252f5817bbd4f69585516555e0370dfa74decde7ef927d0700075f72d252ece4842af8c3cae32e0e1d9675a1f2525235bd60f3a9875856a935e47def10973489f9a4c645b85fb5d599d885675c59a1dc3af52cd3bdee92cef8f1f58640522da30bda1985dd5bab0d94a30be0270e7f36dc435f9ed5df3998598730c98b10a2f6e01088c95697a180d8d683c5aed853e7b067e46c4e36d6880b1766ff4a3fc26a22c208a39ccab3ea7aa5ba3a3e81628e42cadfd772be65dbdfa0318ead025fa26550af16331911f5ec754d68489e3e6dfe6aec88ff7f5f0f6d94e375a50a0e6e6e1d5837dbc43ba94d9a1268652433d296e07e7fa2170063359e0cf10742bd87360619d6cf0a62867968087c24075c069c2a3c459fbe7e339474178c9121a2af454b03ea76dd60e07ed475b617cd70d80bd87e3d473c68297cc3d5e854a1e6c1640ccde390436bcf9e0f63ec1f2635845fe362b5787dbc52326fa2281db6c7a3b270a84b0b39446700365b94b480d0cf82b9c0f2e24d664ef51a8f8579d35a62fb605905e619295166439422871653945b84022d1771ed5d38af8745e364c9dbf9401497c6526aa197181e9401d3989dc5de39e1f7724fa5243153b65784f7e0ddc213efc4a8217fc7333f0775478793203145c4b4ec5917070178a12381155b700a89be6576cc585ae22b2bdfdc6394b0e042e551569113dc57d664e045633acc29b2da01db62bce6ed863ee9e38c0959267c9b44d3612d165189ac8ffb7565187387ecadd9889d31ca89fd3123432cdfbf015093e717cf9ae19b7488df5a7ede8c04c3bb7362deeef268b5ba0f8ffeec52c0f1d704ebc11744a1deb493aeb870f51561393ac6d85b8e37023b78408f3b7d4708cc04c216f06f29abe0c42d81b8fe20b6ded295d73e3c6cd68f1d1a0dce60da0db8e424b5509b7d7866fde84abf04b1a070c7b4b92d808d06b6bc2b52a080cf65bb1250dc77a702b4a81bbde034d84c9637537282d2b2daaf41edce4ca6263565733778b958461de1cb95cccb4e40ce220342a4a3ce491c59902ab904d076d5e558b11342af0a35710124adef079dd3d95e660f74209e25ff37e60a4b4bd6a4815e3c60e8ac14a8b98f549a70bd305748e5b23ef2d82b253f84252fbb158864bd216c323f7a46903674b78ac515cd0899ca6ce6cffeddf0d7eed8cde56508b65c79fc999a6f51e94f9a832c8a0603ff7ab0a24cf1a9eaf1bda53ebeed64a914c7ed781f745a3499d560e8c308466949502afa3fe76d3215d7c9ba20f427c05526406bf0192b8d942eb3f382afb3adabb525c6173a95a68fd71d3ca546b77464576d6a0d5960adba221417854b8d0539f672cde6023569374326e062eb19070c702806f9bafb4d82fba4f9937d3baf4393ba3e81d195509be32c308d66fb34b444deb73c4e2d4055f6fade9c9b6f7b786c5bb6536b403d7a946f2408f748846cafa8b8192a780d93115cad27927d1c74698f3a73aa5a01a66a8d59c8192d9da8cc11f5e8d81d41f98c7c141929c12e23426b2c41216bf95daa6558264796e0c1977672baf87622c23dc360fdc78826049c0c", "ac510063526500", 0, -542983293, "3c7bac3bf3f71360e4077e75638d2609d5a02d36618b8921cb0eb6d46ae50da1"], - ["d17c7839037cb9daf1338541333b4e55560539bec17a1ffc6fa979b60316b002095aed46df000000000900ab53536a52ac526affffffff5cf799666d14c9300dd41e4c0e54314a7123234c3030041bc0c8dccaa72563f003000000060063516aac51ffffffff95cf77861d4ee92147b5ba7fa4c5434f81d74fd4332345eaba88b45f7fa7a5ff0000000005ac530053ab8be290a4039c20840000000000016a6d5233010000000003005165b59720050000000003ac51000000000000", "6a006a6553510063", 1, 2077770832, "199ed26b22f80c9f0fcdc25f9cf8e474257f62c2bdac83f716241215f92585c3"], - ["3ab0ef5d0379d3efb4163eea6eddf3a71c067d43137704e595b1e09f0b765e36a813be374b0300000001657a468ce30336b321d45474b56d3c4e90bf9f2ae588feed381038df08bc7d9bacc1dfb53e02000000095363ab536353abab6affffffff03101b82a6771daf7aaf71d1c90ae08426bba7cffa1f4464c722cdb7d30b695202000000036363acffffffff04cf560503000000000953ab6352ab6551516356da060100000000026aac17003e040000000002abacf4589c040000000008636aab63536a6a00e0cb8aed00", "5352635300", 1, -2006953550, "2f155d20402bae9e5b1989f1a2bd0442e902af1c49ed140b3a2fecb17b22c76d"], - ["46600beb02305ced6f91f281800f9edc6dea592e3e7b41578a2f2459f3ac45a8b0cd56b3ab0300000001000122f4e9010e5c1748fe612b4dfbc2d423fbfdaf84821fa8a32703ed6f61a679c7eabc220000000000ffffffff029525de04000000000565abab5352302e250500000000040053655300000000", "63", 1, -1066443531, "03f447cc707c48c1e93c4fd5dbe61b74e17fb27dffa14b76b413410c2d494f77"], - ["71556f7004c8c1c2ae7ee7c9b103244c521803fc485d276f90b2a78cd065e2a4d27e18b9880200000009abac6aab6a00ab5100ffffffff4b0f06c64e6ca14bea709372bee1b7ba51cf0fd6c2e2d512de7a64fed0e7d52f0000000005ab525165ab7b5b1349713ebcce7d2e92f224d6770697cf6bd05066fa6dd62443e3175c745286d56f480100000002abacfffffffff3cfb4bdf005766ea035bdf273afaf8d34e3b79beca4ca186c484dfc8c59ffe6020000000153ffffffff047f397e000000000007630063acabacabcd264a05000000000152b14b8d0400000000035153002a5011050000000002ac52ee0ecee70222ed79010000000000000000000000001b032551ab0b0f4e167b4fa5c3607b155ebbe6ec4c2eeebee5d30a9d22873a0bb090e8ee7014774a25ca0cd7a6f8efd9a9fbddbeccfaa52b8f332844083ecd867e70ec00beda0941f98f27ac559fe4a546fc04fce1886cf9d20583dbce1e3fab00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000356d61d05a69fc8c1c60e8d80bcef6384452c98f9e0ae98a494347e7911ac38e93ce14ba6f6abf125e03bde9c682f768a1d442a315e2f1658a90405633ff9d32f165fe2fcc22049131429b0e7fa72557bdf348ba5058a0dfa3aac8495275ba68848285e5ac686abbd38cb480b2c399d5edfc269e4e05606860d3c89c897f49f00329233085b9f4b4cd22ca4b7f2761386403ccf85dcc7043ac1ddeb7638102fa8a0211c4d2b18f8db9ba0ccb81a219635d27af8952af08b01fda2899c637b96dff1a0a185547ed9a6b03fae51bdd58f3e88fdb8bcc4796fb3e7eeaa1713bffa84e68342c2e6ccd2a640790b1d697b33d88c9f9e3c3612960e0e7daeb83d5f550cb51cb02025e52c4c89dc58ce908053909db8d1d0e7edf5e374e4a8e92dfac9766441a2e03150f21499b7ec25ce7654a09fd1df391784099cc06db064ac9ef6c0cf1780d240206a2b10e62e6d2d6124bce11cd9bcda71b9c6b7885c65f7d6397fb4d1a99d35803048689a739bacfa6e1a32989d47e47fad670ab39ac426e4bd72982d5e0042f9002096cbfa9b18b2899b3f15cced701f1deed6d2bca19ebe9059cce91049ce81935e6ec318d1ea07100019b8a2e69b5909dacfc47b42c48f19e009a5019e81b3e453b334c3d1557b2e3c05d735feff0d5595b699707870d868355c6c01940373fd6edb5be6b8072d7968ffc7c0f888b3d22297543f905e8c55f532279af41f8263d07a5be8384ef6b9b07f470a823c18d7886cdfd49e292d06ce10cd9c1c52a9ea3b5fcb34881156effdc6c14050d7d95c11ab304fc00f43a8568dd3b0e04b64080cd47b9b3e204df074468a85f96e8ca11ec0d6935cc0adc6e67edccacfa5b68c1aec1dca878b9636ea4dc1d6dc71a119960aefeeebf365346043731754c5ff348e639e94133d47321d85bcf0013ba51f36111ce3cd38deb9554cd5c7fbd53c1cb8810da70dbdb194b828bd5ff4bc080ee4a062f8a60c9d80e4ca31e764ec6e7a845a425e5c882b58b5ac63bde576c0a022b643bc1d548f7c4ea2a3afe92984fd51baf2a483d3c5766465d60c6095db838dccd588a91b33a172c4707d969072607992131de7e554c40710a6e4ffb71e88db781bbfdfe94fe9f9843e894c322fd1289d1154ca880984511bebf1f6eb9f2a77f5d818976f28395db59ae59449e4ad70b2acc5d2fd2080d6fb391014bdfb9ec27a27ccad0a1856ae42347de39f84246340367341b7d878da2bb390f263913367123abde7f10cb3f7f469e9a1bfd6d1dba6a39cb763f8cbea2801c30871c744de66c418144c7faa0abeb28a46e26e9641001abe39ee1ac34b73dd9da9ba01ed5575b3e2bf3efb687c9c76e6e2ac8d0d6ac0cadeb422d809ac2c56ef5006385c054775bb21b55e1ad03078b1a0779bc496989d4e2cd3ba71bab2476088e9292d77d99ad39d2c9dab043e743c92d1669d7aa5404df417ff13f4ac333a999226862e1225a68f6ebb004073e2ee8d99166e9ca396ae29130a5c1b7a40c37492d9789a95559a78c61c12719f7a1a41b8f7330a52ccb390c65610fefb74dea5c61638face847b4b5d8384f33311a250724d0e6755b53c4283e761bd666d04a3531f2515bffec3554d51681ddf56e959406bb63b7ee488257ed26ec59a838b38ed49ed964f1856a9ec55db6faa203928ff4737e52afdde11841c73b8f06cfa270be1dbbf0d830ad6b853bf3fc6ddfc09feb7b1352525891e416c96e948542906458cbffca99bcda57620f239c2c322d5c8a4db89e0003e951dea5f71edb08dd2450f0e6ea77d71c6e4a5cbb2d562c6514c13b357b22cb7e2ab3a7cc38a4479918e25dbb176d0bc755b2676a5d919ae4102051dcc4956cd6f643eec03659cc81246b543579c93d47f1c2a96144b3e0aba7ac759118035ebac1daccb73d69aca5b0fa783b30eb5ec85372fbb2627f8f16b82a503eace174918c02d54b2278b6e68cc1f1e76374f95441d31d468f2cdd2e8a462a2ee3747f0a32eb45571c4dab493c0035ad15702d7dbecdf139a1042e1a79e002b210993a23ce38f85e441124306bfc4a1983aef419bbbbaa1f5f45402894bb1f5c27a72775557ccf0a1c15ef184b9618003e97303e4b06f27c7a4d003f0b001286c2ed807a22dd7baaf8c94d9f624967a49033b81833209d32d2ab28a3f8d6d6b078aab496bec0ad8ec63fabca7e15e9e23a2d541e2e13ee87bf1a2a12e72c158ee2f83cdf3a8b2d5c5f506511eff3d3fe4db9a7d58ff6e581e837b5561ba44d1344125178dd6bda89c8c3712992c42c45e2a5e9d5c80400000000000000000000000008d714886b326bad60d2e9f1d492695fbf08c1307c827490394f928350610f036b7b8dcb3c1935d680889ab8bc36baa16c2154c2f6ff8e882fb6203e97bbce5d62e3f8f1c0122584e6cde421eced48fcdb97d8fb30ed7d613f305185b7468139000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e1d3ca7e170a64e5c5e484f30e427afcfb75b8349983c6a163c36859281642fdea7adf4ca9e74a68760f652c543d6d8dcc9da01974dab23800deced9a80adfcfe60d94ee828842c944ba1f0a44f3d2875143adb14d2934d1a89908135108589cd1c89595401299c6f77e9c270834112b5759acaaac00264d7cb2ddf8e95f05b03270b09d2606aa8ad98cd35e42c127966df82b8fe1b258a0d5ef4eb247c5045a0020aa186522eec9c4876e84223188506ec38bb0eb81e0e9d8ff606f3274038f3d90a23c1db5b720316fd8f828c2e5454708d1c63eae46dbab17103a9b985f5328ed62ad4d0164b4cd085dd7f645dd479f4570edb2cd0015614c009118f327312be140212d7ccfe18429da125d541133468885107f9b4f58a60b725edf0441ad3b7f28a021533353bdee06cc18666b86c63e63965ca5918de74071a30c02e9a34a39459ed0317f23255a54331f65bb4d2d7ba14c3c8e3e06170b30a63241e2fb1486c18a20103017e1469e60159d04385f44352d62d43cef5c4200d430dc9e15c5fd959d32da502147852345185c72ccf750a314f9f26a6c8279b8dbcf17109f77be896ee675ebb693324ea6d66ab06cd1e8ab7c1480b06f45beef8e642f9e4f9e57c2b7ba54804f72e89b089dc7b1a69d5127690973a8f87720e661f9bfd4fd7ba4785daf32a3be54150a06149264056650cc5d6f7eda731279ba61efa5dea91746a07d753ccb1b4588abedafc5e6b49e1869ff00883929bed686175b497d9135d9dbd75a68f83ea6d1219f8a15911fc65e2a2f816869b24a9ca049ec4129806d1bbebde8ef39f181a04af901c464067120a45d0da3556a378886ad2f2bb03d8d31b758b608a3e05f4d498d0745bf0a971a52593696e22018fb783aeac1db61dcd22f4ded591593e1d6db05c38a2a65175beeb91732c9b5611ea4c058d81e4e62e8b0fdeba2a05c7f18aa560a161f297c3e84669c579a6d4d246ec30d9f546a46f10a9bc6fdb1503e299ce3beca994bc571e74d20a551145ab2a8bc604313877d1cb9449ad6a219fd671153ae2fcc6f17e19de5252efcbb47dcfa49d05bdb2cefbc0f7701d850e22f0d6829969ffdfbbad8cb303b8334a23d01ca14d5419998046e86c063ae145c6cbe23a9011f758d70f58ad6a9ce9a6842845c0d5c324d2aa278d01fdb0dad1b6078fc6c673cf74a6a40b0cca2e61803592d2e2e93af2227901dcd4c51078fc3bd593cfdd63ed5044777e267cb0585e839051812ef0827bd1d971595caa4b28b036d15d5d94a84554d4dd5e98b2b8418bb6412f0653d432cd210ea2848b5ba6b4ea63b24cc4e1a206345e67256eb6c37dddad75849ee6436514eed560d263df2e9df68a2d2c49e09fb899b5c1d98f8e685d643d450aba37d8ae9ba4e166c338cda5ea3cb875740e03dd88cce60af9e25dc4c919cf9a9384280897169c7fbb1ffcf27610812c2d49ceab82b2bfc53b895b87d08cbed2a908cd352026f87db00a61ea6253187ddf095da6e62ce971474b070885688b96555201a58c67df8a320e3d8a543a242f183b409fcd7e71668e4609727bcef2ce22a3deedf5b6afcfa550dc4d3f4e5a28507bfdf857c58a71aca3e7073bad56f72465595190f152ccfd1b45c9b2178de37a87943aa92039cfd7f32b70581a5a29b11e7c58b06e30d6bfd00f70c7c0c8ba06787bd8cc4d71b1bb708f3b7255947ad950103759726c618e37a934515a1dc9d22df5dbebfaa5a799782e537a8f8a11e4c0acec324cc37ff385b3ccbea25a701c565e146f5218fb53c06c39632f2379d43f90990e82c2fefcac5a2f691b5a315af068118abe48cc16b7e31ce120fb8283877b2b2e3b5659bce336a40fa2285007446938c8f9ed851416b149238a7e47d738cfd2688728866a2b76459552635ad00bdcb0ec5c6381c12e4e9348b60db6f092ee6fe48e3c3206af77258a699266afd6dd4ff27b2d77ab0ed86343ac4fb435d5f02abe8388335e82064f33592c0b7d666cdb4449e0381dc736ebcf76bc60ea10dacad7a90a9293ab8e06cb83b01c3d5b3380b45fe669de2b92231fa71bec98f1242ff6c1aed5b55090fd3631d3e17b2ad37727118984966fc4ffd994be33a08958e0a9aa10dcc383595ec0b21a05e08bc2f19b0e90a43b1ccf6155591996857bfa97b7f20bca84583339de9d7847a9bd1bcd40cc275630c78b233f26eece2bea87ce7fce606c8fab5fa8c0b6845c3a422f73d86b87b6af47fbbc22444802e8de28796eea34fe298b1945c0cc725e39b17cb958d7098f99db899831b2548e6a7500396186f3d0039a32070fec46ea7967a45f1d69af453d1a7f836790a8441b557c89f2279a05a544f479ef2e7c0faf0a0a1e611327115330b4e5cd4ccf0049a8b3ecad519456cec226512b333a31e2fbbf0d085bdeecf38b7a0e", "", 2, 1953091961, "842e465a3b5eb19a3d8ff10bb73ca662f9a500b434ec30a718f6c3ff15e47b45"], - ["d67129f5011e4d72e966610932dc12c9f748f367289ba98a3984aaabc33bbe8b8ceb9fdc340000000005005163006abcc9d2ab02792cf303000000000752ab63656365529201820300000000086365006553516a634ef76555", "6a655163", 0, -429583614, "2922243e95475be2cfa1eaba00309cefe7623ceb39520afe9ccdfd0e1ef12301"], - ["ce2f5d450389f9f111fbd05f73d48c3c29f1520ef128dd1ab45d20a743ceb16cffb8fa8e9d0000000006006aac525253ffffffff1850091165d4570863ed0a286ab7b4fa0ba099da98c29f24d2ca83899f29c0000200000003536aacafbfc765fe9f9f3d46f5ecd9ef6f8f6fabb06e734e002ff36a6c263a9bbc4391ef64735c0100000002ab527b79d4c3025c9dda020000000007ac5151acabacac06b8a9000000000003ac520032bf3fab020000000000000000a8314c0400000000985882e949e548314b872da6e46f1b99f5f0d85e9df4e1568754ed0cd4e7e05e2975bf73232e3ac861e6daebeb05f566f3de94c5098bdd276cac3b8403d7f938e255a521eac3b4c6944cb055d8069233dd4cbea33b81172109c1949b88df7e3a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003da2b5535825a59af0b903a892e9bfbfedd5234f45ec0c59938088ecaf19906696160d1312ab42fb067ad15c348b9896c15c194eda2eefae0ed9b0b0495c6511cf4fdc015cd81812b51b1bb47423d9433f20374be516e0b4a07c17c404d9a9add897c9b5c668c62c1cac86755660d8499de85a7a046a382a58a4b0bcbe812cba0219583366a6691ee7b6f3cb5bc1023c8454422f8dbe0e4713a402b35769fa2a40021714ed9032de1f09302a78f8c982e2301bb34738d472a45d8c2ec583a772fd970b2a4e67669dffe124d36d3f5e7279c4f6317e94bba1e16fb768f79b164cb089e3290b60578cec5adbb9f9f0cf15a84349224b52bf4c4238e1397e577e36bde5d70329f8163395702da7ae2f21bd66ab60a91827285d1902e9329d94dcde277ad4700214fa61e2856bb526f0b73a5a88bc5aecbc5892917a4938773be93dba617bbdc1031f94e236360e8d09b84c4087364dbc2c6d93e1455843748d85f6187419364d8f0308a3b0ed02081b677cccf75dee14a48a3a744c51c669f39f0773aa362bd3d329021ca8f338758a25175f786b038f46cfa12f0c49e4beaa6ebfc59c0f90914bea3f95f6f2e9984a55a674118e5c5af962c1bb1c036aa96a5a06dcf565199e0fe1eba3abcab0fa9af1feab0a93d968c07d4965eb671a0240119c43f7023d605951934be63eff74ca2c065c76803aceb277c4f5b5bc91e0a761984fde692fa888cb57924c15d4773cc1faa30e5c9fd46cdb1b9e7622ee6a2b30fef7f6d5eba2197a62bb03f248c8fcfc6a1f1bcb5d474a580ac35b36dccbe08288324d6404ad5fa38526a886335aaf873df2efc8e5dc585667219f062ba51c37fce05bf4dca360e627b0f95d06a02ff2feaab9fa4459121b0533b174e1ae16ec364d216e7474fb3e1fd67c6c15359f4043d70043aace69a4c15f7b688d3db9b5345d0cae0470c0f7704e7c2144c5f9f3b57197bf34c3a15795a0f36cc5aa05256aaa3b162dc74d3beac284de0d804293b5d7a2413cd1eb6ab7e56276f0ca1043b2f7274dda993cd9f7f1505a6ca61e002d572f0a58bfbb7eb48f3895d42f9bc6bc8f1f6b9a9ba93278145f17666e39f74be83fc13cc29e684098ab1466636794025ffc5f1cb8bebb42c9344a26e5de664ad8e3aeafa45649d9954253681c03828d82191a92f5ae300527f76f4e481f5ffe7bdf2e2475b6622773a215a419a132db7331b144b48a4d8c94d0ced54b8a1d3a2cfab87bd799b8f95a8f912204d092aa02a538b20a69e1b7528d2377bfe72cef173cef31fd5dd7666c60c487e4cc2b4cf8412f5d93989924aa2464da54e09be6d430ef72c16b32c3b85d0893f673d910af4271d0cdf10f090ec2925b631728feea162adfc3fde558a863a98daabec535d4d018f68cfc168410dcaacfae1de4ad3652d9cb741eec3450fee95d21a9afd21db80ad448c24aa02e804d650b43cf37ddda47cc24ad9906aab4f7b91fcaa2497a88c091888fe235f8a7bc4dc3c6c47791ace6f970d1aa48007ae947885f6f3a422e1214c3aabd4f436c11a06ca318d2c5d1b067e4087784016b73eee6303cd5b1c03a4f5d5f8aa68550026b42baf7c5efa86e6799151656727efd9aae358b20622071a20dbbfab922772705e687dee7c2a41df634bfcbdc49ebdc96002685e3706819edf7f1d3a54223560d2ca0a41604fb56ca5072bfa87f7e31317b0f617cf6f793663911ae19488ea7f24b2655829620a55bd044a34121074f556025f33c04ea1151e4223ac809f685a1fa536bf7f1dd32b7f8164fbec3950ac91cf308017e5bf564b6bf18893e14df36c058b76a8078f8064c5384a82d0624e2fbc84cde54df99f446072a3938a0720914e90f18a7ffc0a62905f0ecac8c1a33502e4d234ec4825cb660055d5034528e880dddd94ab4bfe815551745ce845e4fb602735cab97f0f8190ccd4d0f68f36614823b072f9652c80c48a9017ae2639ab6d5d596f30dc8a01ffccd623feb866b99905ec73036372d18fe7071513795e7aa666ff8a8426bf00f2d1be966916212a4371e24f23842e92f74ed50c3a296540a37b0f475077ad453266e6706d68348a726c9db5cd7426e63626f55053642ea27e3ae00b62540ebca02b9144ecc51454445633f3e2db3994fcb572ba7ec4dc2f578c351c8eb67f6a4727afbaa03a907842e76081eb6abd7a33da105189e69ede561d2af7c727e62ab6f8299370b9515fa416bd4d37f911d65f97675d60c32b17acf7dd9b69b8b62adda362edb8708c4084472d7a6dcf2888faedb1321dd0000000000000000c0d3530400000000d4459434f6d84f488b8b9bc739351637530233487572e3c11ebc53a1e3805e3b9b15356ff84223c79bd32cccb47d6522c4dbb72ab80029e9e770b2ad8b944a8a6af6168f7d94600691c912e2558bd3db84caad9e2e639da3f040d45cae189bf100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7d73d8ea29becca10c1df552b79f87c22162cba0123848ab2c131f27d78e6ede1f6b7559763471c1f9894c028bb61fca085721c4bc674bc94cd9f99e4412fc76ec0321461d2b2a3b4b1a370e0ce25b3a90ec7b07bca18970c304d2735011db3c3195683858422c14291607bcfadbeb95a1864198fc98e90d0ebc1bddefc2372030e50ec82ab29d7509039ad4c63d4ec0fd73ce313b3a5303e1e84b5f01c51f796022d3eb97d9c765840d03a63f94393834de3078b54bd202d6f6879ff6f44fa8c240a1084d5ae1dd198f05daa6ed145c9bc795cdaae4df069fe93f75d37c08467349b10d349e4202ad998e7eb05eb860e7fe337087095628cbda9e23c55d91ea1d2d80215cb1ff813e585686281edbbac4e4b9c7846e769678f914ef4b72cc33aeca47e022004ddbba022629ac82e854452497a36cbd8cfac0a9520fe9597f3f0a48780190225204e5b5fab8ad2c5ca61b585bf7004a70bc3061623e470d5359f8e0a687177022a400101b14a884c0bd0a4d5656dac6618e40597661bf8f4935674a591dfdfc6031ba0cb00c93f89881ad76a6b5823de034c4d446a4a1564d620697713a7b971205c4721c775d0c0109b3e7db17cbbdb2f5b48f8ef9baf425c6919e3d51c63fe8023d6fd6cbfc774d0e8b3f87d3b14cb16a3a6a27c445b18fececeb59a8e2f9691ae5e4bdaa3abf1a1366fdd4688cf9e7b1eddcc5f9aafa2e65b7b3942f988e35a8b0d7cb09a37458d0cd49bed331338a929ad39571620fec22200f2e553be3356edf6109150ba9b6192dd041c0bce951dd854ed752fe35b16e8e842cfefa534c7f7dfff206a144ca0a06173a83ed4122f2ace62a7b7ac6ac169696d53f89c4c7d09585ba9a3f81942e445004ca0510f9e986cf28031b1d5ab1965aff7fbb5f2b16cd89feae9a53b36f9d9acdb73fea5d21497b4874a8d5c336d3717acbc6221a9caf0718e3b6095e775a5b7cb851198bf7601087683ee639211cee98f7a49db89ea5e654d1ccc6b66a11be17a1958008fcdcbaf77fd940ed82a25f40a1cb27e6e8b8dd89ef2525f71029318fdaa73f64cd0ea4966f3be320096c91cb8b90555ae1c94e7c9dea6e365536967b6394818f09189690a7ba91d60d2de0330d53bcc453c8116797751b1f3f8bb72bde0fd63157be630fb032487d9ea7fe50049d5c44c194a48b76224e44fd7295ec397f64ec44d89b8e7f7a50720de3ad09ece9f0f280f91ba92300b6cb0b49e68106d6c024463852ef248aea92f463cfe16c2f17b58c7429eeea99c810b1f8b101615135bd791b7b648f0fe6631e8fca34457f37edd9b8744cad310e196ef8c136f714c13858cd358c9dbab270189197aec5c47b20fac07b3100e9bb20466b34528f9e850fa0389dbf36b3198b82fa0128ad1530f3ac747db35e30dc574f6290df67ba6187055845dc5793b605c47b501527b2af5b5b33cec3a657dfdb2ea1020160fecc3a09921cd65d0aa0d2504ce8f2dcfd65cbb4ee34916eeee0efe07e7e9da0237aec7a9b54579f50f5d760f0a7771ed68bed6513338349c4b7eda586008de89da6921514718abcc05b823ad022d51776a2a98f3d7ad00e396a1478044d61d4b2c5cc468d1bae03068a33a17af8ace040b03280e61496ade4e59ddd71a53a69e645c279ebb0872f4a383d7c3dc68c958205542cecee8b4b8a398beb9d1941424e5c35286a50556390c618937d767d75031ccde002ba7992a6a1767f0c323dcda338d1f82019b458afc169bfb45563c7406f7d8399492fd0df18d60bf6a7d4ac7ac69e10b7654e42e470aa8490765cc44712d593c4b9726c4796bee0b06cc44b1b93f04f7036c3f8d2e4be83b8aa2ce8df6fedc207019eb2f4cc7dabea244fe5703d93fa52868e80f2d1a52eadf27db82b76a785e7b864c69fad456e74ef6060ed1c5601ed3c37f197ffaa41ed7f22fe465848f19e2b3809b275f9ea666ef9091917815f4bd2d55d34cbe6f34cc01a24e01d2e96fd536728514fea9653940ba0d762cf410c3ae06c5c4e192b7a9a407d3cb41ae2f097c6057bd5e00f525b4b93c6ebd68edd13a0a24d3803b02bdaeb3c9d3b47c213597f4aef8ebcc0970bbbf07b204859b381a20d790fbaa282caac62dc5b4bda09613f0d98ba3713017881849db45e06e4baa578927fe287fbf812a58b1d900027f89ceb8ead2d26f2c67a1ecaf0c2f62dca90921b40963fe719c7fd2f274018d9742912cc24ce02494275791cc0fd05896c3c816a893c3e7a3ed0f79dc794e8a0d904e56caec1ca101596ecd24a56a5c2d93cbe8e62db53d6b877747ecc1bdca994ffedb7b510513a9d9dcee1f5389b9516b5e9edd43e417083189828b81458ce9e8de95ffe45ce0a2ff9bc1fdcd9346053d769ead35c2a849f1825aa62e386c15bd5b71b95b6dca3d6eed11ced98b1f05", "", 0, -1886920177, "8c937d96e5a287373f87287a69b079e8ab9afc94e34d85a8ff8847a91a34e5ac"], - ["7cb331bf04430613884824b11d9de1243806a691c6f2a505ba20381a0fadcb38a0096d88740000000005abab6aab657c2121221fa0942508f8fdf0f53d92b75369ca13e15d42e4f65e8cb511b1f4b4f4e1a4a20200000001abd13667324efc03965a962d70baa4e3e1ef944d65f849c39bff635ffbe24c402d1c86787d00000000026553ffffffff59a492bd138bf90b11910968118a4eaa3769c06cbd8d8bfe4e8be95ef6d28a1100000000046553ab657f38ff2e03d2197a03000000000263ab18bfab000000000008005200ac65535100cc216e050000000006656aab51536500000000", "00", 0, 297325301, "c73d676231e173411cd852c3b12089648b09306ffdefc5348f921457b613ba30"], - ["f3f4c24a04d9626ae3bb4c4fb7aaaf64e1d338bf38dde3b2a63e71e675a2c51a0b17c40ef00000000009656a516aac52655165034da2bd38c1551b46128bf284a2a053da7d23bddeced13ae2fc37e840b0cc27f8fd0b27010000000800ac00006a656a53ffffffff10614712968671c78c48e074cd6fe8682857f6983c5a2041efe8bb900508726100000000076a51ab5253ab53a1fbe63e4ea5600929b8849c0f53992e736c8d31350a3e90b2ac7402552888cba4a7ffd3000000000165ffffffff02170b320100000000066a535263ab63e203ca020000000009526a526363535265acc40ae28c00", "0000ac65", 0, 2032497616, "a22eef3af46933ed54b8eaab67309d69950ea92bdd5acd2baca812de9de228e8"], - ["6e32a000015db2666fa653e7636a30be946d545ffd995af0fa0c2f874c6629086d84c531b80200000007526a5151abac659e7708ab02c1026d010000000004655153ab749b8a01000000000252650000000000", "525151ac630053", 0, 45710664, "05fc0eb07f39b043e997fb86b7bdb4dca927f62deb6800b1f4c8e71d34f00db2"], - ["2da8587103b0337a0e9e11907e065bf0b03da64de7ac1cf8c2fe71cd77ce5f10cf1de178310000000000ffffffff91322200a8ca284832864569ddab084bd7f0b0ec8a769b80b4d11243061b67c900000000025353925b18c1b1a372108c16211b700a7e28ad6eb46179b4b574800a3c7fd38c340db7cfe6040100000002ac6554faa2cd01f5331e0400000000075363ac656552650000000000", "ac0053ac", 2, 1186086084, "9c17e844d852e98643372cd31e64fa71e0467c1d5dd1e93981334636ebbd322e"], - ["f4f022d801c86e45c5c28c7692d3146f2aa541903d804fbcfdd4047b26ed14a492ce1f9d5203000000076a0053ac530000ffffffff03dfd912020000000000897462050000000008515352656a65656a7d80e2030000000002536a00000000", "6a00", 0, -500505332, "92b28243cb4cf738adce6bb884c9dd610bb9e0729131ef7b42390f4b035bdaec"], - ["d931ed3701f63c9907e03c63e2a74c702b62d1972bfd5d054627a31179332340c700387d34000000000951526363635352ab51ffffffff04166fb404000000000251635b9d33030000000009536351ac530065526aa2059905000000000463526500d3e42c0300000000095265ab636353ac63636bc9dd5003000000000000000005b7f90400000000d8ca0296e10eaf596eae0e6d1b7f7ca2b4a1e1dd39eb9b1556d4d5456a961706ac9de28f2fd7ee3cf5254dee322bb1ef9a2be023338d559ca50ddec0c348622db539d42cb0354d6816c83d9b09dc44c9fef4b462c5d850a2b9043e3698c2ee5e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bfc92ba13f9ecd6e7ae5e1489768e4c41e133138482ac2488f575124446f7e601b2bf41da678ec98e9a07f174795357d16b84676000f315fda694b790532ec63166885b2041d5af02cc3e372f7690359633a00c2ef7ee21f921fc350d0dba62cc0c008bd06e4ba40c8fc742da0c86e650f537a8efb6991022ecf0997ee95919e030f1dfa77139ded7e910b3e1d637036e552aac6d8fc275cd2af0d921c4cceae10032d819a90456c93799e3f17d32d7ad16376bca36f49e180be72b761289fb927d90b1c855dbf0404e837e1a5c92ec3829266a0b4a274326e94a075b06bea05ffa0820af335390dc46f11b6667c1c972ff49203b5976d894bbc17aaad1ebc0e5a8f07031a839f1b38c8462c9b24e1915e96c4b5a7e0bea21da6619bad13250669863d6502064d5b99687dccfeae720e33c98cf3e3ff2c2b7bf81eabed5d01e6ebe93684e90209d981168ddca345b7a12738983746af41a96cc8bcde6c4d343fcd298fb2bdbd0225e0af44641e265c4ea8e2d35d61c2bb15459e1c3ed6242628dac5f50d40a5320214efa8f49db05efc10e3099136403217af5ad84d4804e8a909058c20c924500538a56d0092110e01f4c57f72550f19e83e7c15a50bd77fd2edb4bcb54a493946ae5c251c03150adc23d0e5f874852242be7be18516997855a3cf09e2dafc95964af52864e3c9c0516e1a1cef4915fd30bb2ad9ef033954ea18c146d1a4da94926d94f453576ccedf95fe05ce2ead298a10885cf82bea10d24fe89071eeaed5947403b8bbe4cc78efa389ea8f30f1da4d19a18c848f1a09e6c1e41dd007636daa423881d69dcc8bb88cac9b5568dfd2367eacfa33d6da1c00721514aefdaeeee9d26dae1ef6af69f64589fadbe644c236157f247b5567517d69f6fd6508194d3020ba9812db04d888de19ca314e4ea672ac56ce59a13181ab876c72a9db4a0a36a09c5865957db05dc0ebea3feb5542e2b1bea8a9d4a92f998bb6786c645a86a2e8d17b55d54da3b14e72a8a6d5f4c0ecb5f1f22a19c47c61b4b52c47254731afe02684bdb8fa0f41e1f812d52cd4372b495ebe432f334a8827215c31f52588718b3ce30ef958d4d3ae3ac5879131396526475c972eadaf7c36d950451e1b194ce4d2491e984d4c0f1a8b41e52b4295b1ce4c2c1ea96d79c267bd9526ef3f75d724dfab6551be2c73ab8a759d73fa7270c10da955930d3af6e977aa157b1550c7791a5ee3b669fdda39d032fbdbddc4815bd4147db34e54f7199efa4b36863f6f4d4918b14c0795195930cbf1b29cc51fbad98ef22031fb9e0a6fd04f87eec5fe431d5afb408234da5e7ef5d42f5c41b5a2576605b5da9aef01aaa4c36e37fb0810d7963ca2caa80caaf3a4a4482f0c9c392ce0990cd0c875b3fa9c24d1fea4b75a77d95996834bf9900ab890fb5d2885af4afee5e497ebad3449837c2b6d735d1c8f2ebd1f3f54bf71da96df325fbb708c3f7ab509e056c1c97dfc200460874773b212c7b094647c1e0531e3e1fa58639f95c5e394ea80c546227d9ded5c6f81258dbe9492c7adca6b053eb811c239340c4d73a8558e81b69a496ef26383c53bfbb94b031719baef6e47d692e4be4ccf660ce45fc4eb31f29b228251162b2b5adf5f044207f22dc3c372a7d8d3051145dd4204322c6e76c3f87107e5efff68bcfc349b5d638152f4bea665e4d03e836f003672ccf9b7a3e9193320fed561e02df48f4b4291b2f53fa4eb986370b451b8f441006424a5b05b56beeeae69c19de870bc7c15ac3952cf8c4727996e5adfcbb3ed5fc95f01aa1057827f123b34c9aeb51d6961fd5378b7043c7272df6fbf5c0f1ca3069e5baf4f633e2a2a76f38ba6ccde3c6add647946dbad6023f70584d411eb2b4b934d44c59c36778486898966b04081b0d388b25cbb3aae46c1a00917d508487d242cfef91bb5429ca670461d2f42518a3dafd02e193ad4c5fabf682a31c026eb608945f0e455975e39472ff7a46499ad25e0d9f7875e8b7efade978ce5b01b28de60215dd9056ca1b5cc89843df1d36311af9c9a5a545ac8098c332363cb7593732366d58f445724f4caa0501b388f9bb757a16de51bb9c38d92ef0538d9d0caa72ce89e52f32f49371e73b071d93ef2e86a830e8e4552f1a7d2ad3c39dc441b257b690e152a44321c70a9050409693edd5cd520ff6551dcdfe91adf9875ca7e520d6cdad727ef7cb99adeee3645f710fb75624bb42c04554ebc71585942b6ae4c6a06fc0a50beaea7fb4cc41feb0c43286849314d0cd367f47f750b30e6999d3b00000000000000000000000000b4d8825ce8f8bd30e608ce84eb4584688b4f9267543441e292dde6a2a572516f62ff8bbd8d5115c89818e3f1defe3a851135f4163cc57c38a28cda1961c38f9a2d473c5c3f52a1367df99318db2ab077da48832b148cf6067d1ef2d5e23df023000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002cd20c116437dee968c1fd11bd952a558bb0c3fe56624c444ec196c7eb907182f25f9c4be4f1031e383443a515e8ff926ad6f47140fa8e6d66f0e2278de345f5698d5c5e83eef02cdbdfb971f8b5ba35aa3698a7dbc450bc921d49d2f77f5dae81b7397d0b7e5624804481a2351d136ac784bb4c57f41d5dbdc1b769799731a103204668a1dcd08215f8afd335f82d35ef8f732b2060300af4cc87d0c87226e1cd020079ab860588342618dddb97567eb2393bd3b2a428d11f38b8fb9f6a245e72810b0c2ca3939a66f6f9478d6ff11d74ff32663396aff463eb530ad07f0b0e708d1b2e5c27312a9b907ea0bcafd7e72a01573af2e1c2f5b524712464544b6f8659120304458c30d29ce08c030725d3ff39eb8bd9d80cac99fed0bb850c97c1880efacb0206b17cef974a3dbed9d48ac514bdd3971b713c98b23f82044eb7800bf73adf17031fef423f58363d2737b739fa44b010c5cd06f40d83f5df061f6749e4f68f77180330389079a003e57a184ab52eeaf85478047b7161b3f6381e68854f4c91b9333c03173d9f7e198e1392409bfd3ae420e2f177e4e15ecff6a52ddec3277a4218c39ecc8556a88d23a8de752cdb0a8fcb58c6609696214e95f957732f556d489f0f7be6f0773fd8bea10dc2dede9d6cf49dcf71293d19e434d0d7257e1bc6e762c611283b221409cb47eeda6322760e2ce42eceda4733941c22a176910932382b7fe5c26d8f6f7c7f56669a19814da196dd53d6cd0abc7bb8bf51e7d59f8594d980a15a20574184ac64a5b1b46527ffe78dad54c6c07468323e8df69dc53ecd0c4f4ab5ba6ae35ff6b559ee05049a04d40b9f807fe1078743796c87ff1bc1f677df88daf554e53e149af4200bb36e9202a143c03f3453264be49dfce77bd2b92e418d59fe6819310f0fb0ec91e72f17535508b28660a873720c5c75d384ae2061d32f97cdedce968d7ff2454b25f6a6a711da87d85ecc3b45f44097f5caa5d59c8573df423336afa136a52420d5d5443448b3d53a0813b44f85dff0ff23e6a81c34e8db15f641f238ff1759910b04b9aeae4076ae0af083dc09b7d9b8f4073f36b50c0b6020fffef8f6f76f9f24a8115e82fd7f407d18a8da4ca29f165762d0ee0673606e8ce116035616fc95a3df7e9a6d80f59039c95d278a80716df803b64f43ac69a9e9c1aec32b1d89e08c4f2e82226582115567f6ee655db4aec98922c0e07d592e83ace5a63d629528cc34b91ade9ac342cba121131bf3bfa3d4cacfd96ddca0e2bac721150ee6dade455a6fc99439318f3752127fece2961f97b44b35ccba742f1933790f896ecc15ae3c6b4188b406d48eb879e5d81ac26d10e009aaf452d0ae3fd77efca5194192e276dd954de9919852024cd21e80bad5aaae05549be50acb3383049d7ab8df13a2074d1101c4a70bd9183ea7f534a225a8daf012b91b19a70333fc598f922ffa7aecfb6ff8ef48c4309500b8b48fd648db335cb0c21432f175f6676af57bdb40142785ae6210cb739f4b2ac2da1f861aa7c795e756afb3cb07b2e62d97e8d864368535e96678f927bf569a173c7dc89ee19b2b4edcccb5d1966d0d7dee86292fc7c2befb17df1c1e3dc61dd87a6552e36799f077bd6e04ad09308803f4fed887209ce6c1481b3afa66c907afe17d019ae72f5a35d473488495404993fc1f3119dce6cb8136e68b57ad1fa03de2915f3f676d0fb2ed6add796dbb6433ae27e60f849892386f34bf4893dd5213513818979e97f8f69031ebde956aefc788b4570c8e9aebee90bcceebf9f266b05789ca145bc9ecb101432d72bdd7d476010d803359beb71aaf859873bc1e99d72b728a743375ea67ae493338a87a1e58e4c2d8fccf7690e092c9676b62240d45917f6731a577df948118779a200c48d9dcb46efbcd79a6fc909e9a7b7e0b7d414486ff476be92fb61a5c570ecaa8d557b226357978ee94b74da0b47d27974485384154b6e8a2a77567822c67764baa67abce8254ea83616eede86c01caa3b98d91152f38eab0d1f47df512f1bffc938aa78e6cec784042c3d8c156ce5e7b4a57e59fab7b0c486ef57f49f7d82209b2efc8e553fac9a345c173869cef6a9e24fcb96149c4e3e08c9eff85f75531a848c930bb48afda53563ba357fea4341977b5480240a64b036e97918c6a907df45552c52a2e84d6c6f4f2a875c233d878a48e839457efef7d97c329703dad08dedab9e24b2f88204802eca2041f3887b5681a0ee61e0a463255be9968ac99907be72d98b7b9a11ab84bcaf80c40cf000000000000000000dd1d0100000000921d6daa30a9b7f24b600f1c30850c6c3ebb7c66af7dd0bfb7902d4a034c3e3f2b5df8afd898a487d8a0e3246411bf6ef4ecc1652c7cfd6a9b07c6444cab8c263e80e89012e0841f215538c8bd5bd75db242e3dfac8262ba667a2c19b7d176490000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000051c3090045d1cb38b9449d94cb236ec590fdfef71a57e90c3bc6187751b15bf9d8c56c31ecf97b6fff49f2e781cc849131459df0305a6060f04510e0d5d9236bfcc4d63db84940f1ca6de03f4df8838c9a58c40f33f13d31f4ecc0f1fafcd07ff38327f2f97da82e4e052a1d526787b90bc714d94be4b9b37fbc815ce510523c031cf166a9d5531364fd3bac2bf9aa2119b88b8afa820f14421199baf8eaee144c022fde4a7aeb77ce3c4797acb6d549b4d9aa0da6bc57b71c97a50fae603ad6b67c0a2e3846dd5de629e89c9c19ddba40dedd66a4df09a9b1b0ffec1c915fd090005200fac587c765a88512a77790871d09373771fd5092b71bd855c2fa2b2fc695b6021282fb3d71a8f9d736a67777bb0ba71a76f74097c6d94c7b80e3c53134ed49be0311740d25ffdef40ede100313f2c1296bcb3aeaddae1a5a27113d66d89d3b018f0305b18cad6e7513265aa05e81105ec00fa1d37c8c1e4551acadcf12360f7fed1f022b724a77c5b228803876c7e0c52015a3510fece85a73bf743909f1774f560a83031512e3860f006e1b0d7eb9d7080b9f6948bd317af71709bf5a35a8f5a2b355f4cf0ba292507b7482325bd9f9c66a48beb0a7d95daa5c1c5c1ebda3b394fff9e4b8b429f1ca6d089b5f7cf3b4fb49043407b36a3663903061b0e2256dd2aebd7a15882cfa71a3bc027e685b4b5e06a4ab514b2c7838ec6e38892e489152ae4aa428a6bfbc20fbf0dcb0352d43758832f9107523cc7dde73f8774b423d6d297f508e2cd371394822721c4c9acd0b57a93ef894656d923a4dab14bc90c4de5bace3646c6ab8bda067377302a87d3adca2df843158143ba00837d85d3d6c654f94ea7fc37a087089e81243d040e6717d0a748629e8b951017aaecf26882ce939c762a98bf4feb03ec6a5245336f119b46fbfc8129908586432d1e56e39e29a5e062e140882c7ba45011574102234185769165fa8864d8796184127db34c762b111caf4b1c70de203f36d86ecb66f6c9a186e686ae401baefb733dbeab9b1df39d0e300415d772e6db377014f669e0cf1dee77a93b10afb5539efe20a43584535797344f3ef7061a877d92c087d4677e1a293d0a69ac00d36e8d435074aa837fdab20547b304397cabe326479750cde85e53cc56fff197c2b8a50e6e9c79d2aa150118519fc58a3248e109ef9a44e0a1e5b82304387ce75fdbbe6263fda129e0998daeff223d6ec9f85aea98b63d7cc8c13e348f2b11530cdea9ef770210026bc6f914a78874c80b854a82cb8ee5fb73532ae1b31a526b740de58b503e73750fa8156a502e3f36b1aca1266d2c7f7f9e6cd41cca82a64a1159b023e0d93d5feba2966c56a28a9d26fcf659bbc90c9595b0ca816a36a3fb1fceecdc5017fb8e48bb9d2930fbae187fe5525cef720122d76ff23f213869c04a1066494f01297470ac4d0c9bfd8cd68868d9062b4207bc2476bbc5d3fc5ea7d84ea96a0f08d21144e6edb48c16ffe3ac349377585e373b2273fc092d5c10cb3579ce2713473e2ca4926a1a0ca399b334aeb0918587f58bdb29bdede9fa4baf386d182bc9e9d9e3407a283a57be482532c4c9d801d9fa70bb3e228aadced8066cd6a919b8e7e81e7d0a49594224afad5064cd4fe200f37cfa515b22161d9cb4c25981248e26f12f9f34a3d8a12d33201adbcd05d3bb524e7ccfae05f2110af0f6ee511b097cece75d97d57db9ee9d70e9224872480add98da821531feedb013e04009f244255ea8fc2652303b4cb3f93e37e2099bdc7994292a488b139a87d788088b6251393a2e37cac392a848d8e12d2dace6854266999af1c31a3d90a1289a8327dd1e3c5e685caaaa69de8ca4a895a595fd03a60b625b36612388570408c5f760285dd68d8a66beee16d1d6c4446d1d6ff380c1a3352bfa4c6699747a5ed82c3f1f46f406bfc5f3040a28cdb77de2fa5db820516c3fd9ee36d79df57d3cd2e52265726bfde04afb0d2c037d2093ff898e09e64c89a081bd5544d1403a4d07d0354a0bc5e037957b6aa3b7a61523427479189a0939c81cf9e150a19c36cda9fcbb723f161d67fdd58593d654f1826f21e2ceb816634551bbeda18c6db44b199379ced8e28722411183df91468ce3528e54f0140e13ca44be501acfdeb0ebf440f2bf4eaf23345ec02b6fd5632a3698845ebd917738ba20631af054b7955636af000bc13e9ff9449f0a32690aa0ceb56cadca9537fb06eb521f2f19da826f1d2eb0513e5935ec1a845dd9b2d2ecd41ffe7cee6a9ba94a91183924871d7ee452dd32bc0db642a14e30cf27cbc7526843e8aa8bd5bd95a763b6e38754fa9f69bbcf6bc52f0e49cf3e091fa87bc7763221f42d141d6033e6e19eb1d0766118ca6384db95b05741c6a114816eafe545ccc94ba397419f4051e2fafd94f03", "63000052ac", 0, 1165044030, "c75654769a91e2e71df9f286619ee434ca072455aa21df4e1113aa811da19e5b"], - ["21aaacb501044db319a3fd79b449821521c34df682f629ea551c9949ef816a903abcccd10503000000005e640a3504296280000000000007ac6552525252ac458c54000000000000f8a93e0300000000065353abab6565fa67710400000000001148577b", "53", 0, 2049148901, "7cdae182725a050e0bd62041f892cabaea3beba289b3cacc14975c3af7b1f9bb"], - ["cc8a445d023282d889e1660e2423a2fa49807a1bcb891611c65a0c03662e1e1c998186743600000000096552ab5200ab650000ffffffff174d3b59ea1c2672bf07b6f35a1249c0b619866551ed6df30826376d9540927501000000046a00656affffffff04f514a70100000000056500635251c15ca2030000000001537633e20100000000026a6a1b1d9b040000000007ab00536563526a0000000003e290e50000000000000000000000000050b23db4bc4347ac2da3cd5a21bce5afa8722c8cf7eec4bf176b693cd3411de9034a6c0fa2c2ea266f7da02dc7cbe4caf94510d5eab152ee1e5866ce42607203b6070a893e52865680d5d2023ac81fc82b3030fff589ec59c8efa5f046d372e500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027d289f7814f6de231e7589473b6d260e6a13d6320c7b6fe2268b0d4de715804976c6dd6117ac234cee9fc2a695193c32456459e8c1eb0935f18c9900a25bdc1c066eb1cb755299d49a2b2887cfe68551e6d606b48c8040af31e0d69299dc8e51a985714d2a2278e95c2d47fef790542e706638c4267cafd936dea7db0d929d0221e945819cdb3e731938db2f01fd7ab763f83718ed55e2123b64b059d1decbb50308ae973455a498fdf31011846ce670dffff1c5586eea9b83ec38e61d8ba2bbdd0a23d04630fd9fd5b64af810d63cd805c9f91797b2e94e7ef4cb0bc123a2cd2a452daee9e2a75247c63569af907d6f63179f9d9a2c42ab6289227448d5fc09e7450224caa9fcfd3ebeaf861a27584b17c79352bd02d5872a954928b141a68f3ac6d20224d9edf73ba8d015590310e6302b87a64632e11c2eff6cbe92e40ba31cdad47c031a1f1b35eaf8f45caca9cbd7027f6129985fe5786deb57ff099e60a63c126da2030b22ce26e9e344478967eedd1d0835b877464724c44fb850216dd2ec8bca4948022180df03edd79f52efe37dbf270c9748a8dfed31ff1bbf4d70df50f53a91f6de8805e618f2d9664b89581ed043b7713393272a0eef47c0e67678fa74de581e828a16307e71fb91fc31625e8e49b37e1009c26e3654fbd7ec747ada63f5e4f368c46cab11cb6d73480e9dc01288d4b735b9a41857332abcc3d3e633999b63fca56ada15d1d4ef2ad8e201e0889a5dbe82c3ab146eaecaa9db6935c10d114afca58c320065150f2e7be74b73c9d3a81b1780f2b81c90b3996fd2b0dd7fadb30226326f5122de57fae5c0005a1052c04e34f390ab45fc6f83d16981cae06ce342d1baedbbc8d3cc3d620fa77023157661a2a0169e2ec7f0a224f21ec4b9230ffda8c0fc3baf2352964808a6db5adb37c5f615a34924f6bfd90098bf13a2663332b152b4e6a563fa168aac65006be072fa2001c86ddaa74dd8c87720899873187cb2052ddbd357fc15d135fe570202037ef32ba39b0e40a8c9858c0ca3b2420febc7ad70e5284627f7d6fc32fdd86bb7cf67c0155ef399a189cbbce6a83c010f8124eed06681b8ae1c6ceee0296f3ff3624b23e3aaefff79ea205d76dd49074bf649e77aac65d623fc63a9ca4c0a148b7cb0b2f54247d6aa23d6cee8031b7495248f32373305bb6a4c085955943d178c368f43ef4f1464850ef78b5aaacadd7ac5cc4f472bfbd4dafc3da16f2db9e6a27e4b4e7edbea62f7bbfe5a61515f83b7d71e7bfa35b565c7068d1d5b7ebb2c11b9433e403b3107ca3bba801bd45348275a19e3ee4803b655c7de6defde5d7d4240288121784c58ef32bee4c84d31c44a59626e3f3f82ab668cef8dfc501bac3076e86085b5d0720a3e977dd17d09fcb940155a2b6b2dd13432cd0059ee42ecebc08b1d230bf9a6138c1b61193e675a90cb6baa69703adafcfa134915aa2cf870e9609bc43e85add3b0be77f59caf9139da9d60c37bb5f71414988900fa9ab5d70edd6f2883cc5e387e2fdce6d910110c0b2e27f82a3b4daa6af72e65ad28148f0431662a829d4d9d9f09fe7760c3439334ee1b361b3847029f9f2a8e56db24170054dee2de9409d12d829a9d97d05896e39ab394d0920b4eac8980f113f11ae34334df9bf590f83832d0a2449b1994dcecaa452bfd0abc68733b5dfedeab90b6be8c30381365288f8ed4a1246e3a44a50abe6f530d1a5e6b615884715e19dff84186fb0097811e00befac87ae75a39e1bd50ad68d2d625cb04d6942c63a2694370ad857b459355321ff2b832c0c89eb11510436d734acf87f30160f42927ba40dcd8e9f0c191dcd018100743f0a8e51bb513c46583b7737d63d0d8463c6266937cec6b8517df27dcf8497078f684f5f6397d35b52a73009724b0996d014ecbfe4a47d3a2973eb6fa8c6ff52bf2465a06b1c2b5d1586a987e87386f523fa94aa843672a5698f9d6145840f1b73705c299f882bc82b230011d1181564c6b2f8d50e24f84bab1d2c7b020542bf2cf5bd3e1db9187ac091a17d9a0ea9ca7a4b29aca1d217b505169a50231532194efd0a7c66397d2ebba0314e451955b1f8a15b29ed5bd33dbd45e6bd91157665400a7205d5b7e5c845254465f2f1cc5abe6242e36f849e97f9f136da87762e12c6aafb25b9ad628bee97f3b95750d44e66219e1f5c2e941dcea960634f0f18bebff7d6e818b6845a029e40dc1fbd8a875cb20d7fd4d733d88e5195e9b921b6664eda182a0c186c45879bbadc412874f17a446d9fe13d9ae9b000000000000000050ac740500000000a6edbad91aa554cd2abea33541b923bcc2eeb295f9c9b32aacb40b147641e271e63c500a70c03213403c87426e36422334685fa2317afbaf43f975f2b8ae2a93826f152329f59ca6319107a78a18db2eb1b26d4b62add8905b93ef08dd127b6600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d573133e19b46a9a432dc02c617eed48d442994cc5cb417bbe137bdca94cce1af2dfab59cb5f30d02e402cbeea50b6142762fc8ce884ac1421170a2132946cf5f8a388528c970114be73a9de381df7207ce2524f696b4398f72b66d3ca68272d4c08bb3a9c1506b4377acae12a60ef526fc8c8ec7283c27b3aca7af6275b6476021c11240035f24e4668355e28ff11ae2b4521e4865aa4e3cf3ab56f4e8bb62e45020a5ef0874cd7465d9ca6a851f41167ed615d01d194a8508e4e120a2788f53fef0a246172ef46efbd8944d40534135e01fef85d7fcd9039ece98d62c02b6fb45bc82f4d2785735d3e3736d12be056f2fb896cde97d7c76fcac8a09bd02453808973022e97ec1f07f1a82ba9059b60866f08f90f61febfb31fb6596a91e1b76f25247c02134e3f1fa63d6dd6eb8830e04f1a1f8e921a53983ea0b2fb0614a64564c5cf4c032235f90f938505d1f324b73e18ce2aebd350ff7b1360f447a4fffcf1a4a5424d032a0cecb9c01e10376ebfdc734f1121e64065c7d14f24451aedc2b835cae94a3502006e61e73db14e1a23da86f5d6177b4f6f786e20e23f4ce6fb5f34a915c6328a52d38b7debe50a9bb69e5ae30c7e1babbb83960386c4cd47a6515e0d3691329d42bd89d99b5814725c8776524127c9ae4a0889b47404833f8d5482bb85467ae8b368245a938a984d312118daeb28e8a677ef2835393e465d87756051b5e574a67e6fef9db7e3e4f3c90c6a1f06b1de9dcb6f209726a3074517bae491592b4082c238d1a8c5092599ff700be148f92bc4970f1511c89734f44d7996e50d8ee9076c0624527e5faa5433acd76ff31ab6789a3713f160370ced86e5a20b21b545c079fcaf2a2bf15b97acc842ab58d3eb0931b431c6e643d13cb046729c1b70cfcb4d6ba06ff3a5ea8e4ba841165016da0ed501303c007c5edc775e81a7fb56d6f13387ecb2c2af05decb9c8c3e2665c342cdaacb5c069ecb9b1ea2aaed900b0e398e037d36618954d70158caf0cf734dac91fc0c72ec965eff2cda19b9be52ddc53b918169a3171267cfcc82d1fc3f8d4dfeb20ab3c771e6ec4bbe95ace0f2f3fd6510f5edf4f2745a9795a22a3923ef91e13bb9dd9777e40aa2167e00d565bf318dff12bcba19c30a27340e109e3b956c406806e81bf984c9084b1e8718f161718fdbf69c73b1e7cf79dbf9fd387950f8e858619865ab33b9f7fb59cc14ed935941238cf1c19f8ef85368ab3b354e79007d99f1465b5f06b71dc357501f8e7381459302e925ace62c5eb57b823245bc8eba68f5e1457ea8b46f1a1276a9760e24266321472cb37f941d74a7e858fc4316f87cf2a1bdbd93eda9fd66a6d752b73e2ef58624383c420484968fe24958070885cff4b112ac62cf8f6fd32ed41de7d763ecbb6845ed380b6069429a300ac74eea685d6180a0731e82e9a50d0d7fdb29bb4fc2635f1738bef5d92f72a5cd02f597218d3684e443d60a294caa62f12777c0fc0ccac373cb2330b53d4ebdba6ae070dd44de84be45aad4a7b7212e58d96ce50904537348f0cdc0bcc51b00f5f49aca0c6f8159a7846bb7ea0bbaa5c3750e32a054ed9b5de77e20797dd2c817eba140b6779e0c6e91cb0f8eaa57b12502e9161f8872b9322ffc4b3e83b4a4c42255ccd8f8a0171c7cb770c06eb2c193791496e195ee567a6b39698381dd4d03651411fb57cfc02afdb7c88968f15416a9f985e5213c52db8cb15a8b273759f2546998f88e6d53ff708f836f121d25b38b80176ddc1b514d84523b909c56ec7748e8c6321b806ed95f26453ebe51b8b81e5ee8c63188061c881c9169ce975ade435e570423a85b8d16e02affe7bc228c6b5ce5187cbe1e392036466296cef057f21513c1dece2c6636ff6316d34d51107ef1ddc06676ffbc63d77c70bcdcba1bba3c1f9ccd56168c591ca06c099b1b5324343f02c4447a5133fe6f2fe96f7d4f4bd125162f527d2ff1689d79c65add2b00aba8f7db8d242c9a67d9fce20a25967ec4e053bce7e3989b5b85c0b2e26fc9faf000feb4c0a53075ac2130efd6137a4c29cb9a9cdf8f6ff20c6aa4422450270a12035e393ae69a4575b2df32129cdb5e87278b83868e30bebc985bff5eafaefb1e7010607abe29f92ec09e91ab7d57d4bab36a58f8a648b14c3abe3e87039cacd975fbcfd8f0f5530f2f1b767c776927506263ba8a47a94aa607242d998ed14d1d91d46615ac2edc9f0800cfcb649eca68d85b8b2c7d5e326f3cad4e8968b99b816b9112cc159f8e13481f30e9004c44bc6aaed7870102000000000000000000000000b8fc3be2ee777dabd971bf977869a4559149230980cd013690010b33c109fa96f6bd9be29880c33e46cd758b37b2c56dd8efc73f4d76a7e1d5eda6050ad7050f80121a9a32bb84d27996ba0f2c998d531c590af36db75e2f7a3ee2bcc0806f5e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009b0b470d253cd82da93fb647ff36efbca50d4403b4e04d3269d310a0f0401306e69c172399eab7753ed90df4877c443cf2610ad2297028f45521de524566ce369103ddb6e1ad4cb588324a1be7eb034b02935a15922b71530e3fee9747812e6244f08b4ad2b4836ce39dfd68e24cc1719ecb0809c26b0c5280e2bfd6445739580200fbf60d1fdcb06afd5835188675b1ad4c62a0c7d56f15d9fbf20c972abeb2f80319dddd512f9902224915aa3fe7f4a4373935a26f5407e73a99492e7cad04b5710b134c2c176f7ad6d6c65a902ac5d93bfc2a1df4b36406e75b13bbc70a5643f8aa024890c9f35747c7f190a92662bb10b1a7db5b7fb47e494f75242a041d41f63b022ec0606d9f4c48e3c6baf616bd7933c8185f90c5b953c72f6c486f9a56f71b3b020bd29a2cd07486e54dbf7914b0a8a985a0a94179f29c79cfffb9211556ad4a25030b47395191df3f4cf63c94dbdeab09beda3f977af33225151f976eaf7e10367d0305f231a547823cb658aa0ad8b2af715a1d77b93f4f424b649fbf9a4daaf122b4020a4d77bd3b1876b301faebf3cc51a1945df01a4b62545f2ff14b35100fc8cba8b8fe1f8f96e3dcdd10ff391f04b9edbb21de0a5532b263743312985aa04723b8acadafa161e2410b132acff0ac8b5312ec053d8965c36c8483615235cd435765abac7bdebaaca171c4b449a91eef96d35f35173b1dc69711309d49baa0643e21d9a4e416881cfc9e1cfc5707aad4ca871f80d4ff0a96814fb4a02408e242b0e2c44fb092f44ca2f17f3d60715b763ff1356fc066f11934b3d863ef9ce735bc84d42a0b84ea5ac286faeeff7632525f18ef7c932d2a905e16cc7f44a591cc3c13db4e4b1d267ed17d14b1c4f8aaf9a951aa9793d02c2273293824e91a9e71c63a1dead9081bccf2c3805925316598460174beb34a6a17a2bdba912ae578684dc6a6646d35cc3887e66461ee8b597c360f7078bf2079e849aa2446fc0bd96544cde358896f70e95b91918ad73803d36c9998fdea87dff2f47ccc4549db99a8c38bea04c1ec279408a9e36f9d887e5dfa33ce5b06a5bfbf5e536b4d6183045f02e51bab03423690e5eb005e9de4de900b0cd46fbcc4b0f1366d1eccfff1b367800c9ebd755fc821cfda35bf715130a4c678b9ca39f0f14fd13aad08ae23784a79b97a8c8b6a040841f5e5663716295e433c6549335c16a1cd110d069e6cb13c8173412242db6964578cb4a64016e65a64c8b65afb2fe51a534d70d5d8207602c225dc84905c0008bde9549d3b0593fbe950d02f03f91386c446d823651e06f4ac6b74cb616c75342a72f9581917926443346dbdfe25cf21e3a47e118f29728da382299eb1209a6edeccaf28fe6c991d4f0bd14ee16d23e192d48253a9c260a79a68e2034c94b9c724768aecd8fd5896cb7d1b727e03e763a66c27323714796a1ae8e062b38234da619793c3b0c9c7da4c4ba20681fa5287164a110cc61907e33f0756c010dc8bbd205e399add4c8f4a70985e09228bb03854a6de8641f94499f99170ad47571629239bbea39307efa9fc4d70a58ba2ba26bd8ea8a65f5d50e3d21de967d001377222fd660641a0b0bcc543a5837b87f7d93e5ff398912518a7a4cb661f2a518a39c26820282267a8f6584ae95036a1118ee3de1061d80962940f4a22ba0fa61ae2c1636eef7520f10da1c90aca60729717949ba192a0982e9078d72dc18c8164b5f760e093346d175795f632a327bd008ddf0e7fbf272aee6e6d3a9e520d33fd70451d2f49a86344f06844c52f5f842c55bad99510ebc8297c9965628b58ca591fb924a5b85943c8063e6ebf705c0dd5c6a65ad0ad2e836b11735f11feb0a972761b6705c1a5bdd3ce6a45227e6b31e57419f4146166753de60a5f1a577b33560f02fe552fac2c7830bd8c02903b6e3291c289aa1b9e1f6d88252f8634ec075096565a5ce168ff31c22dd7e2da8f4f71f45321efe81122b7058d754fee9740f12c5a0471dabbc709f43cced934720c6db09a5cbbc93c26ab3f0d1da74815a929389765e36005905904292988624c6c732a78ea8934ae00d89fbadf9b05711f100ae8e9ebea04e078b5d3dd3962f61d2a79f8e9231045fa8243158b9afbef57f9b4c8f487d86fa4b401da4f81015755d0bf4abb3c5931968dad5e7aa4341920bcca79e2db50dfbad54f26805d56685adb5c5a1de66eece04f266b4b8e821c0d539f62471096750e9383ba8ac49431f8430dd2de4e5f5ffebab733cc7a99b746d7e6de87dd1f883db17f678861440b58464d8af7bfdf65c7c49844358c870ab78c2bad79496f8df6b146a832e6a27eee5c19e4624bba920887b6a7453a57c096cc8d014258393246ff753489cb9718d4765d0bcc7a4c5131421cc0405074d6f22057bc6ac3ed3be0225b9ee3c503", "53515153acac520000", 1, 199439291, "5bfe737c63659351deb721c1ead1c54d35cab9250e93bcf177f5cd9812f8b1b9"], - ["99237e3403a0552d2841044182f70d23feda6e7a7b7cdc03eae6ec0c10505baa94e8647c950000000000947f48d57ea00540f840ca706c824c81564056e6bfcfe1fbbf06a5a8e321fd29635ed5b9010000000853520052656a5163d8acb61feca1e17d1d8cf8d686a84680bf69f58e3e64d73362e7374f4fe3e3b3b67868bf0000000008ac636a53525151acfefa2eaf04d79425020000000001acae8b4504000000000165b519fa02000000000163a6137e00000000000665650000acacfc7c8e08030000000000000000fb8a2b00000000006da8698b77d5eab763926b230b62dc16fada94c6c277e8ce2c3e5e09b95492628aaaa902190663a755aaf5215cd7849b884c04bcf692ada0506bf84180caa48af74752e7f3dd7bbfca7322952ef968a1b00196885ada4b81c60e82d35ce41f3d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000079f6948457d8d2453fc60d2d3e19dcb53d5660ec6d5c3feb10f62e01f722bfc497c6bacd99f767f612a6da999dc5cf9028d8983d5de4ae834faea103168410267b926b8f8de82d175c6e296a5d00011184f0d3536e027108b63d895fb3c46998852418ae90b3df5852fd626e9919bb90e09e74c739e25c85b971edd99ee5eb2d021b1c2bdb2df2322fab1ac0b9ba683b8d39c285bfe2009e0b56423ff11900d815030e964323feace39a6aa78be8934fbb3ca999fdace1714e4f98c8eb7ee98efc7b0b16f6bc69b8da21a2840d0ac43e66d01a4472b7a967b58941c1ff8e739b6d15df151a2e83832a0b35545755f255a2a3628bed918bd70ffb6375e704e54390a0240202fdb2ed2e90836a6dafc08a31b77659e34c0e98ebdcf66039186b296546f239032fc9eb5d43872d22340b2a8a5c5763d6655561ff2854e4b13e71e3898ab52ecb0225cbf1378741d7a0539db47958d7d0dbd28dad35381fbfc31610b5e21ec98ea10222e8b702977589da0c42a7e928d23827e6013bf21f996aede2bcf4466d1f780a0210540119f8695a2232920d5e03d0236c535b1d0d72687a6c20a11debc33bcf5141d522b3e750b628e3cb644a458b8c8fa45b9ccd74c187d57dad4f4f3a29e67b518705d397aaa655baa05e23e1a75455d61bacf19bb5f6b95f8ba2960094700e6ddb0b84e6f67cd2b12d961d6323acf04d171263541bd87f5b9ab19687fa12aa5366ea12bd6d13efa398cad8449a9bd32f2402e30edff0b6be92775c1b1adfc819c987642038ebba7efda843a067954537b44c4fe0d82710530d80f72343aff222081f09410969962a173bb5ee1dd017676ecd818a66f943e64c4590699220ac52eebf9a48ced55d75890fbc17476967ad363d0a374d922a4c1fde1753a94ddfe41d73ce6cff2b02f1143ecd818c8ff463a37e27c0b665227213ac18216f29fab31d04333d56b82f8f0b56407b849c4350ba83406b08828cea50cc99879b81378935ea7eb8f0d709b35dcde8a94cdb929fc23e868b4cb4162197d3f2ebc98275eb91c139f11dd21ff56c7b11dfc2edeb429bf9bb3d43d740fce74aa8f673ca6637dab039e1ca47b1dfcb15d8105c1b3312a1905b0938359aa20e004dc268912ba938aae3320d9ae783ab4237c2420578d9fd852204a18e0becf430e8b14f277b76345b556d4db73da5e086b634deada4456ee6ca824bd805492362134f46cde743b245bac579b93b19e9db1f34d00b7fbc2dfd39cdd35a9953aed4bda03855bef11bd11ecf033b69921e2e463cdb9690a6a1e2a7fa7412409214d420ac6a3dfb14e0f58b856b6fcfc76160b89421b14a0edf31c5671f95fe22856ecb37ed56f9b3e7c6699e5da9e625ab6e40c7b7b36c02e2db7e430b0cdf1d8f94cf4b40e20660b5e6eeb9618af19dad72e6f7fb55dbad9bd20de7f096e41e092439152ce437fb206af238e44d10a5f188ae6a30aaab33316735b90c09f11f9c59313f7eedca6dd712f5b979553a368659feea74c656ad834f2b1cf53de6e622674d9c35c7c4c8e29aacf9f907220940e051f97cc446de6015b61dfa49ba0d2384a6082efe2912a78cb06efc44b4d03f4f140f21524e9e69ccc5d60f327ef2a59af48e32a88d993db4d7bf88e35ab136e0fa454397087494b229f02f61694d5abedf818aec478473b84d6456b48d64c9d3dc264c5fc299188fba2100b30fa92a7fc66bc63dbd0c836bca22cfab9e8f5c2117c2b916c73717fc64c7c6274010b11dd8961d9da03d9aee4710d72ddc56464b688a99109cfdc2ff0898db382375962d24e4bd03b792e7bfd24d549407ee0252c789805114e28d0f24b7728906f9ea09b31bf03c605cfe44a5019e6dbf05bed1ae14fa97d12e90d1bae19a6ad52f14bbd41bfa8ba8a02c2f2248cb21e3b754e54c6a7a52b28fa193091feafb2572ad073d5e0fd5df84a520eed19cbae4fd0205c7f8ec915aab74657fb78982bb60f0a2bde0e54ef5012ae3bbd02bbf2ad2b1d02fa7a45b2fdf767ce78cba7b1d95b857163a68f7ec270e00c736677abd55f194c842aba4cbb6a751ae99f641b74cda815249ba98c97955884774c03759bc70eda0c956a443afff7f2c97abe4f0e7d673c09bda41d5edb5afe1173e87176d423d309fd463c8b4cbce67057151fdec266a1c3f6ec5faff9eaf876b8b6a65b9a8b69ae7a1d29b65b0bd73e9c0e68898d2d9d907d35f7218db61e79efcab1885f69ce73fc7bccc91d19f31cb992fe3056253cfb47102ea38ef6dbccd61d2e7656de9cbbfc077d3db9ea11a2402000000000000000000000000b5106545c4130478b3dbc5ec9f848ba7e2210cab41eaf4d54cc9ada944546f463f2ff374eaa60f63c3de6efaa5d65e8492665406445ed42280761e6fd53d58f36dc51b8a575c2f6345a4b25a4f6bd63a28ee0099152d4cfad2488cb0f3c50e64000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a141f36cb65cddf8c5c2cb51995a369b1f9162ec8b0a5787918d5cfd26495198612631850ddd5f8eaa66b6a729c4a16f78ff13814c823ea6ca73a8f87eb065d262fc0ad7c17962400bd963586fa7802b5c37f3cfbac7512e2681cabb91fa9515a6b8db3ae4f862ee81234421f5cd849e25f597ab8982f2dfa8569f9cdfee3df03173ee6f60a0f21c6b2da7a7c679caf7b68654f34320c812e7c5d52b7f593e47d0211fc40485f96e58bff94c3238ba3a784a0f60966526a55ff8c4740fc5696a6d10b08012c2840047471aa2dec485cad7a4104320db4619f39ac3cff373dec0d4ddc2c44ec6f299e3fa0e2341f24d697d7b0a16e01e79071c26e14974bf343178b40021c352a82516328ddf581581431c8ebff6d35d05afd7b4d2c2cda0edde80d248e031a4d7df79874b146e2c5a2766a4e870a71ebb48b8ef65f238660ceb08b7234da020c7b9e173c29eee921d1c864e608111d6e937c0df67d47566918310b114946a50318022a8c8a5e818c879610bf7e086de0ab72c21bbb51d9e8d73eecf5f05ca735031b04dadc3aadf80ba04dcb3d6ffe5decf26b9e3f3c2fc41f8872b7e6f6edd5cc48abc47d07bda14f15accf263e365068dc5f4902e8734ef286e4eb1678486aa7e608205294387f7cd62f0b644eb9a58398903ec9ef5d1a039c84ac37c554c0eebee463c62331254e97a850c0af7ee4dcbe0ee1e0f84beb594d0434afc02ef7bd4ee0565ac76afa025601ab14aae1c00acc71ada53b5681fba32944b6aaf7f097eef6e61ef4ee2981117b59cc985ab97ed91f8a088f67741cfe4431a2854a9ee47c080f9d12845fcbb57fe15baa2aeb01fc750eb2ce07c18dfe76e32bb2f1ce622d4905e90aa114434325ce0cbff8e8ca57de8e65374576c114fc01d934d84180441e6c37c2d3f63fd5055409e67c9fe3d69e9e8f3184c715a925a3648039c4ef2c46271e9a512f87b77b4ad8f32df6cca9b976c390ca86542c34d67d84e2bde8662f71a98fb7d01c3a5941d94d02105badb7d708181910c98e9fd9d42aa51a081f81f45627a6915639b94813426a87a779ce73e8b5099e3c4fa6df558197d4ce34cd926c31ee7f72c3a8c55613c32fe387090c62fb3d1a09d1dda069f00c20ec08ef8a352ccf97fa5ee5a46b24484b3b200ff80378b81fd82824ce1f27dd6a5bbd42785c52e47ae4b267c44825ab1eaf9d3c954d9784630f0807cf38eefad9ebd73dee2b8774447fa94454bd2ead26d8389271b38cf5f1a145e6b0472ea8556510c5a91aa9b40611a7f9ae85a47dbf01836ba6da4f56639c0942617d8f315e6163017b1bf4e748a0a9882bd053383543c568044e6c8f8caf20e4fda13fa25828da66b7129b9124e093e6831d4a4f8b8aae611e483662dc4a1d8f36fbf3034118d9e17eab00ddfb560697269583e4667863bc7903fed6278f1513e6d37004baa90cf2e9613020dd1554b268280d1dbf4aeb3788f5867e098b06ce74e46e1466e74309d277bd5d3882d983d8ead5cdccf279710ca088579183b9ed176bc87e13a1cdbd034efd39356690cc8da73d8f254df60a02dbfc0513b99ed271f54ffbda0984a4a90156fd0b169a7d4d0696c0449c8e73e9c4719f52ca71f7305748b4804fa1e4286572dea5a9183b62eb37ac223e0096002b365675b0dfad43b7073899c80fd0921ae5865cf66566aa20f043553d58604056fd2182b1c983cbafab0549afccec86093e535f835bde3f1c2d7ca5bb4d00127c7b26d6557ff11a8182c3063257076ccd2baea2cdb1da9dc16719bcf180ecde5e9920634947c82dcb3fa4c60e7f0eb8d6c262a5e9d281ffbfb7f5be74ae524ad4add84a2fc3f4586e50937d5d4d07130784c77feb3d583faddc601ff5d013f6afead658c190c9c67631594e5d880038bbafaac85058aa2154a50ee899407249e7a9c52375901a67e8b613b388e10485a26e5586061409d66b7ff620151cdaf80262a4c1ae5ca923dcf6a782a17a3c26d1889fd0b02fa62f3f11723d863f8598a1c50adaed666a05788c8c79a0d8366cbcd08ccdee2adee46caf499e2dbdc6767c8bea4ac214b766978610935a1403dd32be85f7ce566066603e12c4c1725ffa7f09284bcf8b282c91cfafeaae86bc58cd914d3e1f170602b860ed9eeea7c2cc13cbdd4d2d0b4ec36e925cb947fa8183204178a5eddc62b348695b92f29c09d57e9cea0bf8ab956599a84103b1a3d4ed668b60179da599309d3651ccaa579b7091d04b64a1792931f515c4d9d24a586e98838af9f08b54446808da82bd3ea300000000000000000997c30400000000b475fa70d9de06cdef8be6997b04b8e9f6fd5873441feddddb19a1953c8c195e6026befb982c190e0cf16ddff01d8fa36ab7326a8958a332ce5cff59a2a2af0ad516ef14d32351db950b4afe4ccefd288a772b6e7cc4aba38eabf42102da30e6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006ab375298139c3a0b0aafdc244b6fa3c991b94ef8a9f2dac03dfb6a07f458d2683f3c7550024edfba3d8c81200e613fbd22ab7bb87838652753a53f5cc70a354ae2c37e2ba0a1b7de94067b73595760c58653aac1abc0f02629d7a4836f2bddae36f01ce17ac1c934f2a9cc92ff7a4f87ff601027410c646c70eb4d5dc082139021ba3b0c3e56c8a14cd8a1f48abe27e3015382444d1be151831ae96ed3ae9f859020e5f80ee2a24f2fe5635c63e1fbfbb753e402e538ff3c191e8984416ea687b7f0b21e7e7e2ef05ba0f20836fc860ec9697e83e99ca4b328cbf3690927506a80fe7185583f8a8c7ecaaec032c4c913c35b9492c7fb3c6d518544eb7c94a930c6f4b0312c40151706d3ec311a218f5e96d1fb921bdc30fa35b3e1d868a3539fe8a719d0305cf07e9c0ee5e2458392cdafe20c496ee71fae9400095caac1d48f4fa5a50e0022dd83cac4a92675de5472a783268edc7ff3a3106ee188510d707bf063691f236032027475e581087c69ba1bfc162516358c23b38981055acc1bea09223ea78203d03137751aaabbfea1ae03f853c72d5239f6ae33af1a8497838a4eeb556ec27a5e9a59fe8398e8660d7f8da481051f4494a49005dbb8313b67a7d5125fa87c8dc70551caeeb213d152042a023ab3e60ada42c08cbd12611611abe9e1dd1796003e53bfd1d86125996bb3bf7619a562c70beab017d8db088e1837fc7b6f7bf3d7108ec2330c3c2e71f0313b751ba7207297fdbd6ccd76d7f826d3dba9a875e8a6ff7d4e3256150c682498a205f811af03f4a47b751c7ff6f6c1024c925316cc3608bc12b2626e44d5f1b385572fb4fa06b7a73b2deb4f35c165218ead18c9b321ca5323f77fb7469320c3b58204b16afc426f79d530ac885865d0be30def533b256863ddde538e24bc78e8ef089aad20bfb0ffd219ec5ba5d92944e530cbc25034763196173379a3601bb9c1bc636b58cd0c4c75a2056456b61e9d88888bffbe5c9aedf1682e2c60718bf0ed1c80dad6dccb11e09bae25b01886717336e845d8ffafa9bf39afdf361ae851c422a60fef9d52c0ebaf34e459a5bb7ba0bace46a03435e9fd47e19c303287aa05f29727383a00440ec513fd05a4696f52d8c252cf3b1ea5dd1b6ac0fe5232367eb5d33df050ebb6d0b0ca048e5175c7fe2a6df50160317311cfc1afaa9370c27a63150ddc87f180683f85c390e2d33a31efe30d4494feae3b3095af5b85fa90450d9f37c6ef9d11c19e23e6dc3c020529c6614102f51c97eeb00c5808d773c7711e8144839ea9d22c6637c11c6dfa85a800d6d0e147cacea4b794ac9970ee135d6fe517dbb5170c7fd020bb248fea1e2f01caaccdb5968e896e5615ad53c0c3a9e9191d55dcb598d7e5d9232c05e5b46494dd834888cc0701aded8861c664950dafe1a29a8ddd78399c1b6cbacd4bb90a3c8c556145fb7b86ebd91bd0d952c58874f9fba65d08c9b362cbad561aec490a5fb9057c7cce9d084b2854fb782f41176254277da637c6db0761a3b7659634256da5d3d0668789e204866c4ac6aaf3b6fee9e11e23b4e07ced4003b05347fae0f0098f3a1f87e7963b1ffb337cb301c3476b992fcaf0cdf6426b7bd6fd937043929166943e5eba4886c9119a4c64c48cb741a759ef9a1895a48ddb1d42b3740aaf34911bb4dee4dbff70138665acb97e7872ff08635faca3eebe1bac533c17e398597e9620ccfb0a0b23e51e7a48f1109600f59a5f3361d746e8635c087a488d2efea3b7a79a529e7f638cf8b4b529c86b347d4546d0b4bcdc7cbfb845b27f12e9ccba943a030ef644f79d8eb90c8a5a840cd8a96728c128b3c97860f1a58020320e56f9ca37cffe9b3fcc6f78dea07a0711c5bfd5fc87f5bae9695d3b58ae1b583a629bb10d09da0fedda26f6c3eb272dfe0fabd15c0cdcf97f4fa409c883113f4caa6564670eea9858571f727276902f97efd57285718b4450ed3104eb6d5385315a75437eb01c60c1fb1fe111860be8165e168fb79ec7e0c6a0330e3b9369ea08748ae3b4475149f06243bf956baad78b767e66d01d70dd6b3720bb73d597e31e568cc9b3c73849c41e5b603a99219c90f64d0ce734121fc0e8cab3d140373f703a621100e699b0519d49814e67b373368ed1bbeaae331d84b007361bbd46674607e3808595c56aceaac52bd7eb3f9296e6dd5efd5b2599397dac58c3320563301c093237ce7f9588a16a227a92821a4727c4e28112538d6491deea922c11d8be430475d7aa6bee99b881da0d2716242df9d7bbad7bb7332bae21701f216608a92d1748a2b06dca8d0e02ccd1289ce17844a31957d174365ef67b6d5a0eb86af951cd4bc68fcf884eeb825e9d24545c8925a97d0dabc483fdc138d765b92a03b883494b32c3ec887cade9ba1cf899c8ef41e8db23000d", "", 0, -525426326, "05ad36f31aaa3a7c4074abc9b6a534cb7247a7d91c8552fdce625e2f81d4792f"], - ["4a7d367602e28c07a0f861c9446c93020803b159076c38c76bb71bec387eb4cab3e12576810000000003ac6a5283fac29a83a7acfd0871b7f2abe73d42f3587798e51f9150329495f4983150325e243f7003000000035263ab9c959b0a017718b5000000000002526a7e7fa713010d6f7f030000000000000000000000001a5407707795b7b9d240d5ecf456eb071486ab837e1ddb56c1d4fc5ea7fa68db0c3d11f163565244923aecb18a3b984f08a2543244931a2d5cdbea041080a83863e33d6a04f13aa7d197efe48db9912796000a1cafdb389671073530d56b4286000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008cd0553361491ff254da41b9d9541f74dd4cef3da03aa0f70fb3263864fde11640647f3c5b65bcb5f9926835245b0688e02b9a709e5ac86bcc97ee5b885ccc01f9375f8f66637174df4ae2ccd28761676f6f5c2eb034105ecf47e3783070418a68afbedfd02b7a17bed2e0a867b5f1b75a4077d476d5adadc042d10e2a623ce2031d8bddbb547fe5fb8a8065490c74a6db2892417261aa9c31fbf108aa185c5af6031e7c90929308c1a708fdc5c9df7e0c927207f41ae63bebeaffeb7b548b59155e0a10382fc0ff43dc5f9e3ead0f9c3297b4efae395e9c48864d287f75d68bfe1b7b27e3cb7594c9f0b7f43fd1dc10237c165ac46c54bba48492f2af53811b860a8c0318647ffc61b467c2fd761333e497e8a630f4db71deb5ef7ec102d1e69d5c8844021828e4e3cfca64197d7d343b1c5f4c3f3cc69ff5facf6fd7f656c4fc4db339a70323684eed5e5775102cc6348d382ea8f5e6607558b5636ff99de555613fe1f5d60322a1d1d094a7ff07db0ddd3686ccb254e6b314ba6118af3e1dd2daeeaa9804b6030abb84950719e0a9eda9557adb716fa9cd0d48d4aa6b01d179b4c9c01815c0340843910ce43ad089127ddac605e5d9e3f7e4bb8ecf0c230de66d70145f34cda9049c256e9c289cdd199e29aa835746febcb77837e46df1a4f52f48f007e839171ef0bd17447101f1cc99925d67e296331ebfa64608e67171fb8a75d50d5104477279e3c2520e494e5ebb9628ae3e5b9f205cf7f45b8a5064bd04dc96762d8d58cfade997eba15262be13bcc3dca27d4df74aba7cea3ea1fd7e3f8b7fc6127f306d9bab5652cc5fd958169ce503b4a76cb5b98341d9b27783063a682080ad010d5f3eaf6d78a236dfd44cda0149e4910c09586658ad61b364589b6337fc0cc7234aea8c2cabd47f7e00ceed1b9abe8f771b82d8987082cae967f537172466d7478c4dca8bc5068a263fb3e161d172abee86c95b96df17d9171e41165a1f5fd6b8cc7fd709cbd132bf22a262191785c55d519b119a2fe70251cb44aae95ac7cf77103d41299d2a9e314d010aa0e0411a65c047d157e9e188688a09922cd68a4ae2984938a404f766613df8f36af4a8efa419d827fba85bcea5d591cf544f40af61653d9430cbe5afd147b15c05bc2921fc354a4da435163845d5e4cf21338427998af7a122505b1f3d195abb059aac9e263711aa3933d75ece78f1642247e0b5aacb4a80fb9e7cf71be4e134ee1b20923093f05dd2410d417494d6265b4d9d747f0abfc236c324722ce47c8c147a33399aadab8b6fa16185a4f4374f1ef7be3b86f4b2b861b9eddb2b1b1c3d08c1cd53dab73fbb56e7137be929be5e91853e6cbb25c5e1903a394133388bfe40e46e3f80796d11cbad37cfd82b0ebc1119bc50ea50c51597cdd4c0e778e755723dc4d2c1f18acd24510d0fefcb821fee783a50904e84653ed0bbc21af294de79d07aa82f5a6574ce658d332b6ae3f7bd97c370cd443210c4be9b883cab50c8ca410994e4088e68056d4e6cb03e1ad9ca32eb8f6fc1f98e5d54680f02f921cc06145717a226ece59b1de73c5ba7a3ef3ac994d537392d61284c1b021350b93aa0b65bff94ed3609ddb1ddc3d29920a31d19c9836a94db293405f1850dbecef0509df95fcb6aa78dab59dab539a62feb81febda3cbe75f4842e3ad075c01c1fb339537c8062d4826d5e56ebacd5ff69e4ed7e4ae75b421b4e46a2061f62da2002fc9a18351c487e2f18dbb42b36aaf6e540572d5a106e52ea71cd225e0734f31a3c4cd45e8093b5a1cdf1da21eeecf38376ab68383267c83a6c02d4813a0792e30eebebe06004aa067a4f484a6e828a7f8311b11c39afad19adba5fdb0af30389aa9a97d3c0af24834656da6057ae931e32fa77ccab57153659b66df98d6b935c7475d4dfeb00b39147b2b09cff740dc00a37af70952d49601a7ee6f39d3c83f7426d65e05ea99da219e38ab1bf3fa8275d8a81c4d912ed0c32c0f608cd6dd7abc471f416517a363b7a144cc8478adc5098baa1f6afd5bdec9cf1afc78b5f1d8c75432b37ed0afd337a2d1ca894b787f36c00dea53a1250109e6e0a1089abbb4d483ea05b95ca8299eb316d4954337faf9e5623a8b4058f66b22b2a02e873c4c14bac76973097edbbe74573fda67c75a5590cf3f6229ff8a33624018b393e1156a5c7726ea9f337d3ce3c657c7b1e797f0598e5a39fa3b772d7c10b58a363d7fdf2ab758fb1e20f653f62ea689f7074017bd5e2e0c81290ccbd9ce8691240d8094dbbdc7265948428dcdf872a588c0a1e319a2f55d9dca25321bc37431664768cd4f64a71b4323431df64cbbc5f535556d378cb2eaa4730192aa9c7380d46b7fe1015b9a498275c99eb122ad883e5f8c5b3e5375ced48dbe1e4b25b6c891a2cd2cfc4ea3966205", "65515152", 1, -1529506216, "e1504e9d9193d0c1d9bba238498bcdeae96ef268e978743909f8bd35ec2893fb"], - ["0eb08e38013522423b6b3f55571b1107d5c111363cb90baad9c72ebdab18419bfc81222050030000000563ab5252aba2984e19012802c6050000000000094ddf6b010000000000000000bf79600300000000d24c87dbb4c4d3a97d51f1b7d414dfd2ffca31e99c3270f4a87907a500a63e713e1fd51060b27a6194d35184e41317f76da7be40fe3f589156464dd915c2d35504d51de0ea8a03858c26787c8da3c4ab374240c5fe55ff3bddb7f28c084cd727000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ea2cc770e8b74849e0bfb578789e38a5be9f1ed9dac8e1dce610de463919d5f6b1df6a01aec97d76d97fc9ecbe67295dd4d2ee47e27344b7e7485ac87b53a935cffae740618b1abadf35f1d05789485827d163d07acd790c421b3ac12b279313249880a162324c98a997f89b2cc72d9335db64e339e616b97f5918ab5b15eda02016b6e101dc14bf1dbe7c3093feb34a7842cb8fbf7b61bb8f65cf7d2bc3b4620022b004be9984fc77194d768fd8a15b52a3342fa4f02b7d1b5d8a0ceffc40f69ac0b0b3b0a8b3956cac814b4e6d5da6d9c1fcfcca13b2e23b4e69607a6957b0c08062ab6de3da010423a8f8b6eb3e2ed7ade924825bca106d00fd412aad961d9512b0312c9e52192c4c5ba5b19e23d8f7d1bad56452ddeff7ec61726e70e2909697e0c03051a26485e29a3772a794b7f8190472f82d8bb0d2f0c39bdcc40a1ce10bdca5c0226b47e1b0529f629aec725dbebd5da8a08b09db7465faaf8f8cbc321b480fc09030a0c80318af7f4d9bbfe73764af7d9ea6e0bde72dbd7cb292ebed119788d098c03278e8dc8d938cbd833a4d893fa115d757aad8ebd08a94c1d74a493738121943fe3de06b3a4894cac7db75609efeba38eb693b9393c22db2807a99b09593b00d81d755b91e482c8d94c90927bd5aae9856786a43b60a36271070d481baacf19b08296577d6dd5b13146dab13485262fec9c1f1f011066c6b2cfd15ab6ff2c6c1b21c3f01b6000a56f7295d86e977b5660a01873497e75a57edebe63c10911db5896fe5851c52bd06a9327b9bfab3e25d9c769a800bd1dfbc75e365813a22dbdeb97623de1ef43aa6262519c85c492db8a6b59a58eba50d8d3b0c2f301f13f34f922a521fd778fc476e7fad21b1f6257e5f5ec951016624608183c258e9a1619ea47e5a04412d7d0d49670298f85e536ee6ba6deff3eea2c36d5ca9ae7958bf9fef253209faa431b96a84b29bdb96d2bd8379e2a3ac88acb4c56edbbed1ff4d40abac75ca8be7ec526405140f8bfda2139dd0b072d78025bf1ab1db21d174d6763b8217381ac385f50bbbc651c3bf734b95e3a81b1051898aa3c84a862fc8be660cba796b1d8b22cd3ee8469b9fb701ff47953297ff59f362dd21c159ba90d34df3240e8aba5148ed3d311499effdd7ab07a8a5501c59edb0f62b6e588c4949956fc7e62a0851c78c6ba758281d84e9d3089c8bde0b9edfc8e67a97a4f2a32ea37647c47867cff72284d5e1184b829434163e3d64906a0028cd8aaa0333be8c0b678445b96f85617538fd612a05d9b485df38a729036c4abca5515a405022f7e8b5bed7c149852b0f5e121d4eeb9ee9bce9731b119db1e2e18c049b552153b352441acb02d1574a960f406259fe3f448a8f7d7ad8d5f8df997d1645a2df48c6f41a4375b80085e0e0c2344ef8bb1461a1e2d9bbab2c6d5479efb17a6fc97fe0887d1e84a835bd8f46889fca80334acdb50e3fa314902fd1aa90d9ca2b605eddd0d589ab04cbeead839fe9f59ca3a5c92575a0c9b7b239371655189ff7bd09bb646641f9208403e64bd0561d669daada0c7c16e119b2637ac7c9440e0aacf9e3bd0597328839c7a36ace5f7e5ff1d9c72af99e7b31e917f57f411c59586d5d399d029c21f5df935e5cd628a692f22c0b034d6e8c1777ed568c4aec4ae3597d26b727f64de1879b1b484ba971bcad071abb1ad3fc1fc1abd44b43007def991508b9174f41a82cd44073a88cb1f48d18dc04b83a1e8d66b337fc42e161a63521b7fdcd1a23faf856d959e960395955c1fb3fda9a85a00e5e2c101ef59f607d90046a5326325380c3fbf3ac6c90d799c9471263b2ccead62d3ea6422b995aef9e12fe974ff4c2a5d2e85bd19cd7a8ad621cd69b5c13d87f0d568f7acde6db59950839fafae81d80209d083143e5ed0e884da3dc782bcddf8b46bacf83c7c5ad33b50962e30baaeedd537a2956764b06c95671c04f77de9ea61d87e1ea40726605dff23a3bfe1c5e0aa9b9ad2c7d7540a8a74c52f861c005443bc094fb7727dd2d970388b3d18f1c454f158c8bf454309d5fe6a6d67a39bcdc0f1f3e339ac0d6da7abe072d6d134c3b94a470317340d27a868355130d1468baf2423b6d650073e66ab37bef561bb0e537a71c453bf94d611aec1ac127ca86ef12c4f9794de3546665d7e9da2f3512eb160001f1ae7ece8a63745706d0e84b7c625151bdaa14342feb2931b894ab889d1c81d5b80bd72244bee3e53db51fd75ffd07a1dc28b7957c8506b2c49ef489609c93408e194fcb17ec11a5362f836df25e1906ceb6e56d0e4ed64414bb7c7854a1aef05632aec7772daf1ee1fa071a347063203e5e9b7c398cc342845e58485c82f9309684d24b4b4aca1dbb8283255cbfeee3fb9d99a030e00f531ece0bd3b9d1a10e0bf9024361782da350c", "53", 0, 252808238, "a4249f889a2f796087c13a5b1b7168c1a9a40a618c240af235cf4749bbd0b7a7"], - ["a33785a303a08555452af9a20a2d3f9934d8080c6a20c8f4c583955d1c96d00e499af5b52b0100000000fce5ace4dbb4a833e93f8389bd94f4b3f645200aaef654673f5fa23e492e37c17ad58fbd0200000006ac6551630063ffffffff84ef3531de830304cdf82a40dc6adaf1a7be17a1121a6b993fafa2b4e965836e030000000951515300abacab6551d49c21da0242fb12050000000009005300ac5165ac5300e2c901010000000008515152006553006300000000", "00", 0, -39698101, "e9c3a082ae3618fc70c65bbf8214e5928e82c18899f97f4d907f13a9637a9456"], - ["137977c20198fcbce246434002f0d0d178ffde4157ca6de20d45cd7b9aa58608c80af93c4103000000006bb2a18602747f7f050000000003006a6a54cc3503000000000363526307bd2f9d", "650063", 0, -1110739385, "ecf9f8c43b878dd5544b952e62ee64307f611a6395d6b121035ab8f72add2db7"], - ["96cc616c03b30686fda9e6763c5b214f19c204088026d9c7f4526d6fa367ee5033b620110b020000000151ffffffff5dcb3c783e17d7ef49065a1fee097f56a1805dbe0385755d015acdb5122c6d2201000000025151ffffffff4412e8de019611899681bb945410b81a74cb5ba92df34082c07f393085e71ee90000000003516a52ffffffff03de0a1f0500000000045252ac0015675705000000000851516352536aac00b4f3a3030000000003655151000000000285129902000000000000000000000000dd06ab591a7a2e814ff878b2906ab0d6f84bc742c7fe66353e113d09f14a5eefc339348f5a1ad9f5d2f3e426583abbb1b9b5076211a8913e0fb9f221f3f5aa08166991d2335954fcb407c1b8763cec921b9bea40d3d33fd5831f703b46a5612f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d3358a1291f2d9498999fac39f0afa94d863411e2b7a33cee9aa9f20920acbf2b6be9a96cb960f5605105e0c0f681eae57098e289e784035a3902d72def0196bf01b12816760f13fa60a73280526a0f7fb95ad96bde211268409b45a3ac82708811202736709566fb5ec68df1d88136b31f9e3419982c837874079f1c28ad0f103213ff162a0c5332d96b02a72d0c46d1bca4e6af9578d1e497c38883a341c07ea0305d75ec0ba096193e5fbb481020e217edad57c988863a6383d84012b5d7cfd090a166e897b37c97b32d7cebc65aff425b0ead37895331c2309adf975388e0eda212e4ae9a82386afcfc3f4af3ab8717d63a76f936c1c94febe9a29bb09ba8d018c021e76dc5fa0c282f109fa18916d6d15bc03eea450851ad16a0cddd7e7a4a91e640319b0f374ea398133a247dd61a4f74e8592ffa6afe9c65f8edbb62984d19c35b2031900326f830716309eba2c0b488586168efa1c029bdf35441fb4913198bdd30e03114a3b98005b20e262b788659685e8f1bfaff5a6ed17a5cd209107a448d1158d02208964665a3c016a5d0b2f1bd91f74debcb32132a7fcc554268e209e56a41de34db790bf397c97966288c5c5405286131becc86c32483e86431e882a9f4a7cb3cf1b1f700e86067bc5a57eff47cfddb4e84d599247f64f4379446deca12ec2950079632563aaec55d0e0acdf9158e03fa8014a13f9b180ac7f59b8405c986be1688acbcc73981804811ed132a6ae84815bb3c04489477132b4107b95869e45e5297ef4ba4d2f72198489eb6428b240e2f603af5b8bce0102b3a67760676bfa5af9a1aa146f63c86cab8140d2eaaa924d068df42c83582c39803015777127e8151b77e5380a3a4d8f6a8d84092b5f2ec71dcfa0b0e39880dc825d2e3dfcd48fc8a486be4c8ee665840d13c3f99b8a4321274cf9b00bef40a3cca44f7697296c4277448c111ee5730c845f6b346f4cca20ad6047c1707803ff64630e5387b9f7bf1e31c6cfa051aa1f6682a5d7e86722abaf5a24d1dac1a6337a3109b78363e9dc3a7eb47bebee030bdd500f608841df9ba5199053846e5c2391e5e886dabb708d48134c6240862ed6a7b14698738783d0d2d22f46a67ff65a2ca84d3ac100db4dcb22db22790443ed5332feb9270c1ed0f355d96d35dadfa5d91b9fb43b73eceb619777ab32b01d6ca24c647fcdcf704bb3530c3279bec5f4343a764877c909eb193f05d3d63e4a94bfcee56f4f587670098a5a18b903af582dc91c8175305866ca6c2c2e6c6c4a47f51eddf52dd56e58aed36c4899b90433cceaf49dd29741504108dc1c8a6aa159a9854f8687f4c51e74f2eab3643d3d9d59dbb921c3dad1fac263b5bcbcea8fdb5c04b15750d8bb282e2ffb945965daead18d7b11ef852c9bbe969dd582c888ce78fe15c3f8a323747f3d703a8fb9b0ef6e3e2acbcf22ccf2603d42da9d905a3e9300887befee6dd3d9f84aaef435eee9b44122aa207bc8718edc2168c448c8582ccd8507d01ea21ae7a312a4ded5b3e8bee869c17b6196b4b0a68a1f8941b147079c9d50a8713308f63c56585096574d8891c8163c8b5110f11531640e0d668b82154fad9c579abb54c820fc3aa9f70063c506b01bc315d59c0a907f20f0008289bd85cbd4106c6c7b2a50355819fac18da5f43a0092612676eb0a8b295dafd15840f7e784845be2a3e6fcc07ae995066dfefc79402c2234b1045f118b42ed030c3a70504ee85828d9f2afa236590f498e53c98af7a05405f7a47d8fb46f642defe14d1ba6bfedbec89664969c08d9777ae7ea84bafb929b3d0803e0c5a2b2561e0fcb93dcfd761006fced31d9921482fb32b655fc78e086801ab3b3157301f4a9fb4f793864fde538bfbd21673ad7bed859ab4c7c63d2a051d4cdd0b138fa95858c07d990c6e0d6fb01cc530d0c8ba46f210f15ba55d3a7130b7a934f4fc6a313638a39d0262330ee65f0cb9f3405988302c381620f7a799143063e59df0f3047e2dd69e4b96089d309a4f5c34acb14e35b6a95f0d69971b705f5f991ee78fe781176e58c6a0879bdd50253a4febfcb9f5bf476f3cfd1c1fab1fa009f08b0cd45edb16ff13df4fdeb4b1f1a42c058893991b3f49cb86222c212c1bb56cdc958d8a79d0fd42b71174653f1fbcf849bf29d2ace9870f491fe4db63f393fe24800f9479a82da59ea10ab35c4d0cf7d4f9d4df8d716a3b3648b171199a9e6b8f7586d6aacdeadf03074336d079467b7121055e59e1cca477774a76cee77ca70e59206c171eb66a93e87ae540000000000000000e9754a04000000004bcec5c09c52b0d1d11df60e7a320ee6268d46356942da86126f255758978797819623b39c0445997d254436c83dfb02a64d625faaef1158b71c9fe125c9255910890a904b1efe435533fa03134ff032ef08cb6eb9e5b0551de20734a6b014ef0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052529859f907674aae4fa7e7c4f45132419cd3dbea1cbf3723429a35083bf8743e714f94249e39eac837a56c3ab91727c74699c16f7e2c6cc585eb0670d7d0f2c18d76152cfe13ac761c3a82a679ddbaae56210b66e7ee2e5743e34934a4e30be541fe46608e976f8e1e6772b2e04cda0d33e9330e3611b7ab3ddd1d10e2726e03217265bfe5433a4c81868b94ff1550027b9e5eecda1019ed13c2c9dad9d0770e031484ea9bad28f8819a31e1c6ec8ff8991ddfc93548d6325437d6b8d28d14ee040b1a7fc8c2e00d456ae41ec93bc80dc15936f126f6da3a7dfa22a7e6dcf05bf7d1163e2d78cdf8dc272f4b3897a743405dffa5b935933f68ef1439f89a2d8aefdf020e7ed8c086a6bd237d7e31d91d29d630f0ed3bc686f21c6bc947e855d4b98bdc022ab98c4556bd227dd0ce17489721bd958437591c981ee591e0a4a20691dc9484030d489ec1528f9a3b0a13fc4fedadead49d04a2a5bb90f9de5c3ebfa631dfd30a032db9f5010edb083c3c4973ca216d0d64d183d7874656859ce6bbdb0b4defd16c031a9004a0e0c7be61b98999e05d1e25cfb106b726151995fc463ac73911136337e8ef32eda6e768785486b1d942424d57e46f02fe9365ad35f2e76284f93b9a4e1cfd3bdafc856059d5b0f0bcde4a0d7ffc3264f02e12709614d445b409910708fb6568920e5eb3cbaf469881a3d381e5cad6d85a3763ec3eec7877e604f96622f28c43908bac0c2dd37467dfb040350f469575d455d8ba0e34b84dad44f99c20627c7c911f8bff289297d14ef40b0981df4a7b8c78ca15840be9e4dbdec8da28a73b3d05e58d61dc348d24065cbee248410ca8432832e974f4a6d096bc11bee1502ee50ade65b832032a64a49e294171d1ac667ffeaa1cc0cde497f4d4c8e940a379d4fd2473c6c29519b7979adc6c82f404cfa94b7b1be948f77cc24f020e86ecbe271e809b8d19de1ab20ab6a7b2e15d2730340eea7e0f8d5c04043de531ca6a1fa456f4227703ab38966b190db175b4afb2424a49ceae209098eb2e58cc040ad906e6ab8b1f4c5611f32101f3f9de8518cf2aa3e1a3de7e7503072361f76ea1f8a0a6bdf91ca0b0fc6d5e04b4cba06f45f40d745a02a69e282b5f469c508445902f569494d484c4ecf8620a5ce4d59582886a9bb50ec96c43d6d384a07579929a4d12d6a960ab73fb39877a895dc9e489dab651ec3e6ce6b85ca1db5c90790419205519510d4918aaf61afd99b9fa58309f9050e4a47c15fd86ddc0652546d11d8248db8c82fe4797345c1f287bcf25af9ce4ee4b7d5b2ecda03454a0e2b77d324b9e1475e1740cece6efc82f7ecd10e1e9ad0624dabca18eda76d00d62baa8e7871ab627903ab4aeabb7a27aab20f993d77588bf6b48d9a6f7cd797ac591566be547ac4b7cc9cdf1425800e68e61ad3bca13fa3e754dcca62ac52703f7775a0db7744d0d28b92e205fc4ad8f83f763a96ff01342ece226546d23826924adf13eb19ffbf2e3f5335c81568371e033085aebe095bbb9963ccd5849c767bf768272e65243657c43d9c990089c0b86644c2e18165f02c7486d3fa7358d17f769dafb869fd56a993045d61c5c56e85463ceec8e0a989e3f8a292b26513a623c68c89f7534cc3804d24aab919026de8a0c081268f859714e44a5f320a0b8b4571913913293edaf7c6ed6ea2eeabb61902078b0503f94f281ecce15d65940b83eb468c7cc25f0bbc8783b9cf4b1a1fde5a48fb5b50d6773478d8c77938cda56af63fb94059dab963c4ac5088fc946766a32f391021b71b42e8e8d9476778f24df1a6c12d69efd31f89a8787bd9f8e63e597ade815a78b07885f1cbbacbcefaab83f9f7db1978236c79c3404959bffdc12ac0947f69950c7bb2b01654627412b163323fcec82be9a51a41569b175117144b63b2a994ae3a7b66c93e8747b0e79abba1d0d9b9c304c03afb103901e1e585eae35266ba9fb36a8de2d163f7db65a09ca86856a5bfbeebd940e7b130157026fa863998723e0435e3b8b98255031361a89eab63ef4a6a26560d4d9e569c71e9328322172defc3a185d32d472bfd20de4577174e5b04d7d51e85eb687b12e66f66a3a91a355e57f5bb8082caf4a2ace9a8355e4a0f209deee07b5c786d49899a0995550cf6d164bf66bb918857b5e0114fadead8d357ae2449ad00900dca9a576b79370d2cd6320482828509430597cebd5fc6819cdfbbc278f5722b99fdae2e3772a34ac95283c793c7cdb1c11caaf880d326bfe62dcb3e5896acf90ce018c83ae9b6bca65953829204fabab7f7a3ff650a204f8098047ad97fe86d2717dc4374ec7f0c9c17b208e568a91bc44c6e92c951ba347ae4fa0671aca50cefec65ac707dc2a7d7a76c2c9d393069f9d35ac1029744499d8489ba439ecef0573738b78464601", "53", 1, 2091089239, "c279c9ffb445d262fe55b609f193c0b8db15e3c3545d9791324b769fb6e06496"], - ["bd504a0c016642b2c7121f82f0be00d1a6c0ca54d964d5f5ae8ce6f34949ff5d848c580cf00300000001acffffffff01f28e18020000000002006392c7267700", "656a65636aac", 0, 61419673, "cd93d1c352702b51d43ffeaed094d5cbb11a6651e353edac3681153c0770180a"], - ["1519b826014bdd71ca2f2c105d6cca346cd86c2fdd1a08b6d3fde9521fadd72136913cde8e020000000251ac7a2b7198025d988802000000000563005265000538bb0300000000016a000000000214f596020000000000000000000000006053ae1789765f7035b6bcd52b27743a14a4ef303c53b435ed028865ddda55d571d8f5d06015a2dabdcd3daf687669913e9cb10e4568dcb9b7ba8d9e7f251df9b453e05e2020aba16c5e030f1c0628db509ed65f6c08c8ce0ba425ff4389e5c500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000968db0e6ca1759af78105c5fe4f8efef150102c7929661e0acb6ccb4074caa77ed76b4a8193f0bb0634955b477c0af40fec5cfb6faa403ec74a2e3951b4650015357f73d195b660b39c8e1f34b1a27f8160c9e0bc0b74b37faf0e879f59674dbb36365b7607f91edec7010edfdb7c28968fda77867399e5f34e7732d7ead5412030b80ea3c9d346d7313d3b661339c3541473f7f4c05b24617a775ac45d492eb97020e7498a3f2cda1750531ab5310a692e11461468139b22793d51eb8740cad4b840b099e7ee10e0ea9ebcd3ce5911dc6270e15374aa3a3c1b4534b0a928e9e732f5b194bdc2b9f59b0fb9cdf40ba452628bc349c8083c9520bd796230a70a93d3b8a02233f4cf71d029f57e3158779140a76a114ad94330b623b64643892b54c07dd5e03253e255958ba1e9c7d529cb67cff46b8afa4ea931a62adda5ee39b2dc7aa9a880208bddcd3af9f76d7e69814fab3cf78da90ebbdd2464abcb3cc7632b57ac2d87e02007f5aecf7cd166c07347f6ef77217ae0fed66420cf0a93fb4f71996b97cf7ad03039608b6ea729b5f94013a3aa04a16c425bf2fe3e5082d0038ec210ae252055c98abd277895d8e50bf46edff89352c151a87f69523c1d86779295c376108cd8504f9882e746dad315bcd346f4673da3a614f33e1544c4a63d495ff4b1daf96e6b24d598422c0df6211628e6a54b909d8ea523a7b8b269ca6c78f24f629314358c0f26fc285d3a8b75da25283b51ae6c612a288e3b1388bed37e909c183dd8803d6e2723d24a0d9035bfdf01c059412257594006ec51efe78883e53a12711e4f82dda21eff248640d137799842c696247032fcebad8487aedb6b08af5d38f9ea66c5a1cac436f8e97d93eb49fd8bee6764f04a7e33c5325aa3483396fce0d62338887babbc8fd967e85efabf861ae5964615fdaec487c60da6d5f12d549c0abf2c5049e2cc1874c3b4bac1a9657f0bd7d5a65cc238d9169211cab4d48a0867ae9c28a0bccf48acbd797cb96b866481ac65b77e2fa951fad5da11134f8ede75d24ee237e7a5d1af7633e2a25de837e8003da59b76b1a3445c5f6f54a04a6faf6e5b7f66243990147dded7bfe29f79e360e07a6056fc53ef9ce133737c435cf28c56ce541862228a6e4b25c3ee7c6c8e9a7dc3a357e3ff6c74d53f872cc66d529fd5b3ab545ca1da23863790d586913d432cefba57e52424c3ec3ecc302b5e76efa6a41af795b54dbecebb2aa450e20c3fe646fac0d02e4ec13a25fb7eb1df7f7e770c441ff52e2550e11a82d02b9544f565ad8712e2ab7462c0891a08a00080391e1ccd5c43a63161d0d60a14576a6367e19ac6920e3ca08aa9074a3943b7513619f085c618b213619b39b9966ba132e9f91fcb537fc3d887a1ee0d0dde08dbffad2033fda42bf3f0173deb04ebfa2030757c7bac4b6863adac6eb921da855d42db4594d91a41ba5bc3d5d512baca9f08c320544231f3aeee107abf492154841dfa718d6fb29ec6fd1e26f56273cabcfc9933880954db3644c08942747fe0f10673fb58def982919454499f5fb70fd728d50cd9dc29e06d676f73af1ab542767920c64749574c4f6eab2c7bf1fe308eaa04f0c9f35226d9d8cd7203cd7b5d1b41ad08d179c324897cdb16411a1eab41fb79c73df99b5556acb759b872e26ba8d48ee4ec5610291b95414a9e2768bbd1520612924ca03d48be30ce67f8338ccd6f20a415b64972de50444ec0c85e1d2180c251742dc25c6c25dd4d85cb2ac497d5c6167f212404a1c4e4025f9db0594a33564645ea3aa10d21eac46257491154bd4481c5865b4340a0017be130d393d55f372a2a40fd2f687221cda6f1e4965021d32672e08f720863979541905b8b4e7c0010ca963f96f23f9dda5765278df5377d1cf7359ed226f70bf3a63327e5c5b1555562fcd35330428d20734645e445516b9c38c2f376ce0d1b95ffcd092dd5c7083804c4aa5f256a160b2a416d1be1a597c86424750ba18290debaa9ae3a0e44e71ac22c332148fe6f8c939e3159f9f62cdc24a3271ea11ee08e71358ccbe0032a4c9dc06da9d84f2feeb605a4530ffb6e3c9a9b89d5a662692d364a5bb7b82aa80f18120be09f5dc3a55233ce54bbf45183bb22e62a853c5d7d7830ea3958deb9805c64668772e882e169617793f6a9e1649f8f81e16a2e3ac6ae3d7c90a1e12b8e5c95262cdca07d4af123cfc0728f5fce11a2fc7fe78d0496cb81658305b709a4fccbce459a529fb4205dafe3ace1457adf3b5a183945869ff2c38759d3771e4a930919b05000000000000000000000000c2792d8238d9436a45a1e754d1f193dd6a0b618637fa7e2e0c777634a395b1fb4ae86e3fee66b618e2e81cb5f0af233685d3d788eff5649099f2137f6a90264bc8ebad997bff1f4ffa134e9c3a36d5f69ca5570ea12ed59bf4a58700502c085900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000446c8a41181f5c637311cc926a1802ebe230e0155a4c63e5a01dfddd6fa46a32b93769e52cabb0d95d8fac9097b9345d0639980a75e0e00e8ed81f207d225fdd613ec4e442cb03fdc6daedf99013636d5d57960c6e6fb6da92b9aa6c23341ceaa5e085e31f815a1ef7bbce4560b814c5e3b357b1e6f28747cd7144ee71159e6102125e6f8373b7032d92d89a4b6681dce2360551cb0c334d408899f48bc2acffba02026556e492b8b062171667ab10fb9816b0be40277b43e340d4a5d936e3df6ac40a0597bbbe52f511ffc5a5d0ae119a5c99bfcbd551f38882812a4bb23bf051013023e687d8466e63f23c0224f0098df73df1572733bd99370bbff3212d3474752a02076e9c1418d4bb3d95d4107e056a0fb2e62a2e2102d208351a4e44702115bba302158923a9cae0a2ae51c9e0f33edabb868259cbac243d280e1db2f850d104a037032299efc0cbeb8f939d2ab53dc8c7ecceb68b2c3bb0cad070993041fd40c715000324382b3f6dcd21c2ebe48c87a7a3b2e49ff997f7a30917a81e2e4739c83929ca031285afcde7fa887fe83fe60e8ca1da389e021ef6eb002eb98141b4d7d7409a5e55c5e5778068d22f817322398b7b7d36689c53ce3569de0cb65f6527678063aa2389b11d62f7d2bfd784bdb7a2e4600015068d72a3ef6ccecf7ca61c5cb44c92476ed3d32af832b940a4a570213985188c6651117df0e8eb6cc65b353d7ef34bee8d55b36f3ea316a0de868538a4891b5a9493f3ee51289dcc18e2edef1cdf0d0893c418f1b6d9b1c872531902b5312a81652b5f89019d58fb184ea85d77ecbaf13e0c16ab0845c658505f2f734bd8d83e1b2d18ac5320fbb914af608cc5d4518a8c43f2d051a5c83762843ed4370d3ff617e771b645f9fa164a696242d46fbd1f0bf79bbc272ad6637e7efa9900d05e444ea8deac9a07355234636547a358edb428519f37995c1464ef857cd1f4c053072982aebd58635d4130c1936e12a6c46230b638eb72db0a3b5b4a0a22df334ac1c0661446627959a28eb907b1c84bc8dfabc47151fba635a53b0c7b3baed9cc048874e5dd6d1cc1731214305ee3ff201c4e87207f842cd6342e76652933cd32ff5eeda0d89b7c3c8188d43519e7697d61be360ee08dbf325b41d6fe038d1adef33a65bf254b398a02f763a020c0eeb2cff12f52d74380bcc4e76b8414323770719fc15120c49ab508913781351b5d0b4edd16914353fadfb231dabf95144b91e14934b684d78a11109b75dcb79d624cbfa5993bb8a9b80e8a2752caf18fcdc8aa5c085003e577c59fcc1dab202e3537eaa5bb6c919f52ea68fbd47a343cadea666e744d138dd38d463aa0c98eb8c8246cc793249bf4669ab099981138b74a15881ee8eb2689d716ce6c42922891e837b0123770fb1871c73c5583da28bc54825d09c6deb7d9de5635ce3a51e2880b3c7bf65835d353ece6e260f687a31a25ed84a957cda659a70b45b9bfe54f764165cc1d58fab62af4a68e9fba1ffa5bdf46ecb21a2a6a10832ae355b361be948038b724e6d34354af562b2b1d816cc1ac2481effea0b7644252628c4b0bbbf4b51db0e8282bd9e2a884df9d63b2d536a1ac46c049453d29a23c5152416bea74da489fc5fd6b3398fd1eafa11f176e24a5797a10c5be32d0b7721a97946a90a5ccdb40bf65bb90cba686737afc6c2b26bb22ad2b2d7c3641dc573432c7f6d1a3c50ef73864f3515621ea88320b8a339c5c1e6ece9821508036c67203435f2b56c58c819ba8b415f1dde7b5c8bc863e35b88708288556197ba1c120019bf5b017814bba1b4c4d8daa16e54f32a2afec7a5076b5d4c7c273f08966d5dddde33592c35159199f7e430258ec8a7d581b52578cbde6f53788899aeb112112c56f051ddd448b431c62cfd53200bb0040d5fb174bc12e91cf3ebde92cc18f757155f03eed20f3fe59a37830095702ccaa85b9393ce6894bc9beb835946b67aa8d42fb01eea80b5fbc48716ee82fd0983afd08c909f80972e0a4b601c5ef93ba06cf309138d3e363b142f06d0a334e15de7784c6d21013c2fcd7fd13953ff306199fd6ac6f204225efea15bcbc9f1aacfff544eccf6d1cb1ba0699f451223cac9ec9573923eb2bf0bb1a5f4d3c0ec33e649dfa905a7327ee6a288c794f1e6a67330efe69ea324a1239be4d1d9c08a1ff81dfe45fdfaa6382d1400a8872e07b0b60b062a212ec50b7a609740ced718a9ca0dbd0e6de97959d0b3c0a274a739a50305158991c654a571f0a89f3a1a120f79f9bbed35dd980ea283aeb288da994a14fa6b96cbd463e78fddd0f6e5e513bef6723e6efe88664a38a9d9a462e97650aef215ea6a95d4e2b428829420543be04d706f8da3036b5b99dcb5fc9c34fd726707d28c094a3aa83b43b06e8f9764fe9bf527e3ccd70f500", "51ac5351516a656a", 0, 474532199, "bda7daf2e6f2b6482da6e683e1b0a94ae4d5639469f220d8a2ddd362cbb98b58"], - ["5e3982ee02680893e900a43aead0cbf38386ed44a0f67d495caddd9423c9452dae2dc49ab3000000000400abacabffffffff60c8832c879efa965f0a63eb3cd4ca0f72527b2f5d5ab622807ca419aa878dad0200000003525352c73260e4010c2a9a050000000009acac526565ab53516a517954d5", "", 0, 935203767, "0d09db1e8937557be6bb722f4e6379e0df3805e9767ae168845e3a751844ba52"], - ["630a491301befc25d945ddd7a5d98fba5089dde921627e73c7ba17249c909765ee5991b33501000000046565ac65ffffffff0194cf000400000000035252ab6525807c00", "52526a52ac6551", 0, 140865692, "4e0df8ab9c04f37b637f1343e2022775128bf3c7c115bbe292c5f2e974a7b089"], - ["72aa55be013a551bbb24f7724c0cde5ee622f497ec4d77393ace4265a6c75cce2b76b377e70100000006006aac530053ffffffff039907cf000000000001ac1660e8030000000003ab0052ea1a4e000000000002005300000000", "5151530052516aac51", 0, -369397741, "482d40c670cdaff16bd0b2c1418d165250c6a81231a714c8fb1ee831519f6557"], - ["e5912328026533874e65cdf03c746b0c60d2501358bb264949e9e19e0acb61351553c0ffa300000000036552acffffffff9c0e804e49452f2a965ef4d9bc1ecb40abc43788b3e3ed7dd73cf9eb7d5cd6900300000003656a6affffffff029fbe810500000000056351536353d7f6d705000000000300656355598622028a7edd020000000000000000000000006962fd12cdd87b01ffef0288434ac82b5f43f7bdb20fad310d8f221d00a1c1cd3195a67cf5696a735e0408f724d96d741cd4bddac1da0a70bbb4a3f638b531eee6dcb14ddbc86e622371ce57eb3a97234dd3c6b4f48bc07a4e60eb0f3d65ec4600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f29c1e168f59160cec51f44505ccd558b614d4025f3a0bc03fc2027111283cf368d19186c4ccc36e453632befb3b9041d421745cf78836728a95a14423690fedc2646949fc3afcd383ffffd8ab4834f33f012777e58d1b26063ef9388a02d3fe743191c7a9a3204e5eaa3aa2632a371f0b8f4ea9589e7812bae28cc52e890676032aade386b88ea48837d2890cd3b5ba3034d1de3b7df3f25061829a7e0225d23d0327f3cf3a9638a1d61f3f6805b930f788141963b680368b4570d5e965bce01e010a1786c6ea155cf76bee5c206127460484f2b7ab23b87e401041c65ef05b24403a21acd886ff6e9001d8654528a09bd1ded0f4d055f0f4a3e9f4043c081f85fea9032eebc1a8b8ea2b6afbfbe51d36330c6007df5f12811b29db67a2063541fda86f0329e29f09457695b0532db438bfbaffe780d286c270264a278c378ca5ff653efc0308c37450af0fb4996922b2393d2e01235bc0192106c28a8664a5d23ff9410c96031fcb0694524cf2b41774c01330bed2ad6c6d71dacd88672769403ec5c18e5939022c0d5309b3bbf9bacaca2b93124b3d9ec89c1c638dbc38008181a5a723b77868470ad2de02d56cf02bcfd4c3b8f29b48037276287fea35e7cc51215a51d7af37e60ff71e41e6bd79b94c513442549b56e8806ad46c1d0a2101482373fcd480b658dc8305a90a63a1341462003d33e70992df3f2fe61d19113d5a60c4cd3eef7149bb67ea33a4b726d579e042d2104fcabc963150724dae33de69f9af12361a33c8a778a14f0e87b40135ac78f55609c997a7b8ac9e2ca67d0e7d68250d78cd8e1068cb33c8168ac1ac3a56694af073e7e2d8887d2532783e88439d1d22e253b44951ede863a9034199135ad61e71c85f8826ff380afddf7b90286e3555396cbda2f74ff10d2c5f1fc660e508ef3d0dd6bc80bf6d99c2a67ef09511b816e6d59ed2cf4bddc3539d304fae1a002b65f078813f650e5bbfa133c5abd125d036669a4033ceed4cf560c6cf6252b529eb5a75f915398783dd62bee381586c4245db2a70853c07fc8fe422196f0520877e09af9e6b37f5f97b3b0bf8763f84579f437fb4b97508f5574e2327f1a0bb820d504df39894eacfb14aacaf5a5e2afa127a00a90935936be722779be3b4c829657ddfde852b2f44cfb37e96c003b4663cf5f5d7b78074281d48d4aff32539b5b11fd5ddb85200ed975f6cf254f134cf2b4c2d555cad59b8ab2e313928d2cbe586982eb8fb8fca7c9d8518cb905597a4b5523eab5aec606d21470100f26c4e2e39161bb448c8a167c0199a0bd9d2ba05b9e5931ca8eb7e2671758fb872757b1047f135219349239f581765cd691df27b240fdfd26bdd77f67abfd6a75dc605af4a879954d58b15b0afb4d1a68be77b87fd799367a8de2bee176065b5520fe6d249d2a96072f3b7a5b8fec1a130c85d9fa725f3127e9f97b474e1bf8cf9ee9e5197f7d058c87cb80e5f78a3c9b2423d06f38a5b92056c6d0a749090461fc8b6779150d18e8902a85d263107ebc5d05302b3f82395109797d29baac9e1a10ca408c4298d986167bc4e3953f3d106a74bcb3634f27282e1507e31e96b5a3623c620627487e943d6393ca86ff56cf7c1a4718eeca5b7f144e3771a4d81aa199b65f6817b8dce53b6f7fda47cb3327e237b13b9ea5b04d1248483a026753e1116b58d6cb7cf544815b2ea3c12486d8ea8de5eceb1ef9c735cb9bd61b71861749ea09262831603e5f36662873c1ebe069096e2bdccd91363310e7f20020b1f22b32024fda4fffb63b12c87d9340fb6a75efc8802d7a2dcc77a70fda8501a7ac972972a8f03132b14228f6ee71ba4d544a2c36c0965451625d38cf95dc8e6405df7747f821bbb30423beed8fa2c3e2732cca84e833cf43bbd33c5d9f1441750e79dfeead7c113c27f2f6118166704ede35b3b59543d2581f2c2424d5e1e837d88fbb512c370099cc3441fd8e116741971c8045503a50ebf28a3c92cf20496994295fdf1d368d9dba62131efaa34adecc0d6830823cfb2dfd25feab86ac578c7c4da4495f4f6c34432df8d63d5bfdd052e9b390d77e58ad871c8d193d3b4b7135ec99790ad41b759bf0e23c97aebd6d7eefb66806cb2bc941d5176dccbef47be62947409a1be79dd67bc6fed1fee9de8b17894008034442b1e8cbccb36d7a68e308d61ac22162d0124c41b0e22411f1fb371ce2dc29b2f3945a7b781efdd1d999bade45ec1f4fb89833a2819d404f99c4069a144f8de5036e569991360ea2ec2811bf9dc28b3c3efce000000000000000076c86601000000004d5609946832de085fa63b6275a2109a7af5d1ea4462962771d7c8094ace9a9cb6664b96fbe2c33d3a85882e8e18e5731d7633ae87a408cc8e82a05676047db4a167551108a466dcd0580785c7e70446e21005ec107b98e5f479c500be99343e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c51294a715c77f0f1183fe01856293621a27e29d37fb024e6e265f3655c8f778209156b6acd9f3914f11a01073f9059d6549860ea991b05bc9f0e30e42e241cb7ae635decda2b546ce7cfad757d9a81cac62409e59c0e32087c3bacf298dc3ad714bf07e72844431e4b489b357758a77ad1d26085e28a42cbd1ea3ddcd29427b030311823e86d20e2b94a1f50babdde98c08902766039fc9875b4ec2d72a48c624022d8ae6f214cb71876707eef8280895cdb4618f7b658b91cc8db8a0105ccec4c40a25af2a7754e19d168a1655ef22a9500943fc910d90ebaedeb7a9dfccc360ea6307bdf665d5072f235f39891f8a3f65a4c2f6872a4524041b374560b223d5dce7031761fbcadaa589657ebd6ad46998efec5e90b2a982c0f98fd87319ec914bf41b03100aede632b9b7a5cfd5dfb096d1b8fbbf7a98666d13fc73e073a4549170e4fa031cd158469e014d24b868fa89f242db4f1c4ac693f91fa02a857d8d8cea37d4ef020ec1134fa929ae0f7d2525195c89b5f8e7b6d1d49eb9ea54c65607f56042e20403281053c1c726548eaf7e395fde706447056a212635beec16eb2fc1505eb1b6c60fde930c72d0fd1b64f48a5eb59958986ed099b4d8a23f7953917f0b29d2a2a8396017bccdd8f2d9f7a79fea75abeb6cfebb58575339a34893dc0702a210bd07fdf2482204d31cef443850cb2bc557230eb0e98c0f7515073db11bbd22cef8af482582c42266dcfe1968d93f609b2f564af0ae90e64ce131dd8b3b0f4219c75f214d8bf2e3d82377d1f166c39f45dffe0e692baf6101fc02b1bb91414b8a4cb182f25141034bd37aa7d8caf8d0a226ac34044773ae0ed6b244fd94a5697d246667e2f91f1faffc25cb8b5f6a558769de18f5e84c40ea1adae1e96e86fc3e2783c7995a5e9e959a8210f6e6f99287b29ce4f06f97c602027f28fbdc69ff347477bb0cc9720e1883ae9aa024fb85c240e71470a0bfcb2cf3a2acf93cd2d012660224aff2efd6cb7ac1f94e9856d6bad74b4a19347796605255471829dfc4fab061ba349274206cf32f6118e10bbfacb41157953b1e1aa7d27bcec08145b53cf0964e8e852e90b44fefce7d9df2a9b561fbf882326481bc45aa8e581c1213839fd0fec080a7fc0281507969a16cdfb8656b7aaf1bc5b8660ec43358a3aa41cf76a9495d96d5478a2e734d281fd8be6f5170b53814010efad9a9f2f178e698dccca1fe115d21a3da12a1206c1057285ec2d888e0e84b5ba6727f109d71533bc3a4f4144658fdd1abc7411c3921e0eff063b143e00bbdac2e5eb0098e5a492c50bd66f10624444ec8864c98bbc264eecc9a97bd88dec7c1daa18bb40c438484de891390f539956aa6ef89a053f836249e7a20478426751ca7b32d24a547bcd0cbbbf58c0c4b869e04269c3517aded5acbfa3015c23475208e1f658a62b8157fe4bcbf49fc67d6de9a17cc329a1a85c330abb06d5e96a33f47a45f646b922f2ae5d5ebc70f51b67a6213bbac01736a7ecbb0c07fcff77df3809b6619a4376e22b3b92876385a61764e15ef54c18d02f9490559b2b2705748f8560da9e0c33d03cde5003f9e0eaeed7a8c571fb31160c5d51029563ceb5066833ac5e90a98bac4bf67b983d0066f279780556f519f6817300fbe1f9d493c149fb8bd1b33ad2cb75874725af15504fde0ffa3d9ab224cce88c7904257adbee2f532a642ec1527acb70f49f3683e8f7a9350456ad08d1682e66b01fe5a50c11295ae40c8bea597d7f898c9fb93d34c9faeea8de4fe029939c8e866511364f01878096c8ec7def6912fcc8ea5f67d5a384ea069ba048d47848eb8fbaf9d08cc0e570adf808ffaaf2fba24b92217985d1556573360e3e8f4ec38ee1ccd999b8a5a45dd9924ccc051c5f4b555464084b338bd500b122149268e3814c5c4043faabaac08e3aebc1ce392dea763619f0b283112f457dba86dc174858ac4645eaba699319865f19de12a5405012a5c0dc9f6aa47a619cb6627c2c9df5d6f2d00c0776cff0ca848efe6e8d924d4be504c2d3ce3d32ce14da33a940b6cc61afb76c5287ccf578c468e88ce0a0bbdf5bbe345c4748f20ddfaaa2f8bbc1bfb65ba25f548d531118043358a89957aa9f045db565037bd250eddef6f147ee6a1dc5dc4eb65debcaadc91c876b0a38bcfe810ea60b5b0cb15765d0e8d5f05dd9c26c29b408e38262d2d0069c1658e12448555bf8dc8f85de83e459100c3d5b9f074ba47f4645ded8d0fa16b07d0373f82aac996b58e4e44b761f7f9cf7a8d2d179ea0e9a2d81e37a81972209136998a91d94047de70e7d1ea2a3937c2fe556972b76edc169a0014320bd9d9e0aff193d095e31e833c648bc4b5d8c2418b1d46b2f8dacb33c6a9f3dad18612aff08bfda922bb199d081da1ccc924875eb2bb6824fa9404", "52ac0065", 1, -615482025, "61b6d166d7a925d56819cda0a5a13d910e15dd03d40e99904f2c4b0a94690cbf"], - ["188e8d4701936708624436ed22603242f473a570017a9cdfd6f8d74f5b37fc36d5065b67dc0100000007acac51ac6a0063ffffffff017fd83c0400000000076552acab0063ac608c344d0300000000000000003934870400000000151ab91ecba54234136f17de77aac2d7ce5c802e0e14c38cc51e887c3d46657ff817be5ab9410a4af39e3a7b181b1ee0671f657da1b3de37f9d28ab00cd6134a06030990df0f1b03a8dcfa3883fc1fd2e800c9100b6a72dc639c0b9e8e7d89df00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f88f22ebb3acbc49d5be1b8712268b987696f8a8c9f7d2f54aefed8959262cb2af6854f9785df8bfb67c383fe0b5dfe5d8cdb164baa11311d4831540d1e8336fbf2610f46836c965a4b14f0fb965501e7051a67accb55a5c7975dbcb7ac82561ea64641a121ce686c017522acfe7832687c7a002a1819b697f0ab5d8503cd1d302275f98ddc62a2f8393adc08bb29b06e70166501f64b05630e6348c6ac3d33f44030d32cd67497b2b2d42969a24f080dae5f9401419a209ef964d64e8cc7e07defc0a0fe5a19b9500f39d03fc0c399549617ca58ea4a3106b94adaf966c71c70a92650adc789a5a8efa9b92227557d13a134c078b4d3f1ba05450c19b9ffedfb704970320b652f21427569f2cc292cfc6979c42205bb3a3261b904b8004c843c26efd66030a8fb42a2e7c153dc8e70532a437637ebb7c9c0c07a977406b33c880ffad6d810300ff4d9bc9d51e41e2529eb864bf698a3c470e548b4b609224bfe2c62998b43f032d93ab0193ea7635daa1b7590869f7c7623c57f151bbeeaed89b85250cb0c948031386b76fc49b6edcb4506dfc42f42673290939237aa2b3e84c7da39e2abbac91f3f03c2ad92b250b3142e4e03632fd006d8a66c2c605be63229f30a8fbeaf512cb6f9966099505ed50dc7855326f32b374a2cc0dfd6b6458ace6b1c0b725f3dcdf9b4dde6168a8d532e2b3cd884845efbfab29fc542aca23553c80ea3b66d259f928c29eb9c3e0dd27138850aaeacf33bc9631a305e6b5bc92664cd17a2b0d010b019d497fae99313bdafd1494f87bc546eda123377a92723f7c641c23330032c0bcc6a2b94aaef9b2d5108a3759d7039c724137987e6b2f125768d4e8b44d6b7097065449bedf0535f5d01cb90ef46107954c4b7c3bb636f5990e7c242fc6d644209d7e82608b3b948cb3119488dffcfa458f3d887ac0c499b0908014ca89484d8077baa8f3770debc35eab90fb4228304c947232232b62d2a623ca7946d2c82981dcbb4f4a5cdeab1d40d4c2192c4a249d89d5c1e5b2de9dd6cba5cddf004533f604a4c25885e54eac6595aad3afc9559666699a14d1640219d075a426bcfda1b82ca2111a7ab31bc27162bbf28847616a45e182ad554706f70ae60476f0bae29aca9e31700165365d8140de975ef7dc544d01e1fafa057a0581b08385909af3b0af29cd9dd0a4d69d12769d8d24e62d181aeefa76e02dfa2e55af18c75896581481f4e4ef2e795c58d74613918becf2277c10ef3f174f4c9e6677a1a84a2e1ded4d1630beba95e2ed692e3a71289fca102f2a81c692a2f02424a694002d4dc811cee1911c4254f96c653963203f26012743749129b2c96cbffd238c9050d0e633a3f7050268f2809461661375eba1e6683fc6d489b23dcee685c445a08192374dcfddd365306a5580e19ee9bd17e0fc9772dc74ab3a6836c70d0c8790b2f0b268a69e3236396816bd33b6c1f9e3434e3b2f530cbdcd10f003c81d485c424286f7e25b42a1baa98e12a6c954b68325d2bf10c95a4be9505028d9029f7fd8c3e9ccc1c5aae48f47d38137349afd13df9ba1de5375a45841b7acdd66bb5e4367fe449d9e0fa547b87aa8bfda50db9eaeb06c0ca13911b2576f095572ee5318fdf9637e61fb8db8a9392c66fdd78c744472595f9ca8b8ff7d0f38f1bb716e7148975c0a1c033fda1481a23d7af490416b8c9aa34644e3dd6331d0fcce539fd68ab65903ecc61b07e64297e3e83624d4228370ba7c7f29b0bc314783bc02b64cd40cc61a9a494b92213504572a6b0c51bf91394f62fa0874bacd07c26d5584828a94fe7aeb883dfe6c8155b5ca7fcb4297ae914ffdfc0e5bd73325360247efe3811a86040a67574448c49db18f56d83290a5724bf27e4c5182cd1853386764164e0c5435cca484432a6f7d712754acbe9a60cd1bd76e72a8eb67eb13e712450a55efe180ec96962584b2ed37aefbe25de3868f58833e84195531c15cf9edd36e46b8bd38ae1d10b5f23bed08cdcc7b8bbc8207589a69723d40c507faf3525e841933b13d84e31ad6f6f8e3e96d2ac90d885c50424aef979357891a7336ee5b5099bb576baf74c7dbb3ad2272b63d2ec21854def045ac3dcc49b41b1f252c3a517887837ff2ecdf7ff45fd436fbf3f9b8a49157ccc05fb19e34eeecf49c30bfdcaf668e8e888fb6ee8c4478fc69052e396b02bed67f655975177eb93060d35bf37e70f4ff57d337855a9cc5002124db6ea20ea0ea14dee6f1d556d3ccf55921b4fb629abc85dd1a8347832fe056e3071b44afeee5cd9805000000000000000000000000aff465a53eb93bf639d36b3a33ac50daa4dfdf354f9295bf9b7cf6d7052da14d32b696b76269c8c06c2d401027060d238278cf517a4bcee4e219f49fdd222e403e0da30ab3c7240c854cdbdeb341f33463469d3a4153f5a977ef5d078043e25500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bc6652356dedcf42569a269222ad3a1aab05adf2090a0a72e8438d7c288edfb42bbefb68d10182358ede5a937ee3a205b9dcd60cb256ab00f68f37688f04fa93e117d39ad3081658951360b2bae0a559d301f43c5d6c44c90f8ceb2f8c3ce1905a595ed7798f20d51fdab2868505a65aad83ac29f6517f948641faea8346399b03225f5586a92dd872c965ae6946e9ec2f4e14ee25bb27a113e9791fe5e811a1fb030a5a4943e1c84fe17fbf00a5ac5e1d5e52fddaf22fadf686992a87760c2f902f0b1323b4772a8eb0754f85384780cab3e408d1243133f54df8d1f85fbb4ca982450cc268ce288c1d9e2422187c279f2ee21c3edda97640c47369606909505c1d6402279a050ccb5ce64e109cfa2d60888c2b25af23179b224331c0cce3a1b75012af033002f46e54b2294b582ede7ec39d7787b08c3ff84432232f569df520b65970350211e13e0563ae64a7b1ba21747f28541299304ae0cdfcbd380c0903c8c5cedcde0318c9c2b263c3041036ff6539597b41bd974b833ffcfe5ad872f9a04d9db017140307a264a75a111377573282883c6f10e88eecedf4a94cff2e7216a605d8569bfb1fad363866456721afa8ac02da874eb02a836685fcbfebe799a911e6172fba08e887c1c266c1d54d7a68643c720bd763c7c78dc34fac65a6d2ca81db5692fe9404972f4bc9790f9255e7fe6e1cdd02cc7dcef5b8f56a44f5b359539d5c9f376299458e3bb359fa22175285f5c7d740561d73fa15cdde018df32e97e6f5a284e6c2499f6999bf65b9f38e7e7e3ac40c4f8d4fc5ecadbe3467e7fad82540a2a45b609812a836a01699dc99e5ac719d358e59ca0282c83553d1e8b85c9051b930f7557f1ed692447a9868c8357faebfec355d3c336d01308d6a38f281d854709f2d862b6660a001a76d658bd174c05763947d1b050fc6e353f74d85a3fb9cdf8cb71fda45640c0a00a72f22fbabebf94e17cf969600b2ada8b3737a7834e3b56d47bc227b1445af8f0d17884cb426a9afad5334017d36d23edb2ca8f57ae0c726cecb50eeea7f35082d7078a9cd13801e453980123519330707294153e574eff2cc9d75a02fe80ef199e67eec36b458023dfb7462eaaa6bde27c7c753c67b0a2a45eee5a01b1bcb6fc0d30bde6df33bc156e25b51435b30af43a973fd87d4ba61fbf7092fdcfc30fb692d83a2f9698729a7a6c7414abb7ec6ba203f90168dc39c3a009e1bd14e50859dcf8a5ce6eb8f184f143ed4582746a710e5227968b3753466f07e161fff4e05cff4c26c8e91798f871dca37540df0fd850bf073e5c41f209dbc488919d56549555c381ff88c2166a56565fc5275ccae6f45d353dcbef2f04b72b379466085bf1a6a025ff970a5b1a3f5a7e0c2f4532a022bc26a8cfa734a32f8516d73cf7940acff61d634cc6710535318c43f0c967ebc311c16c1993834b96796be4219653bda8f875caee3d34ba1cfea2addbac6d166a06caf12f4824bd71507054742e7b485c44d22ba33f6714a302051bae7f07eaa941c79339537af0574ef65635098e723fe5db4fc808544cb24fb3b515a6bf32927d76c6342137b392d44914b67c1748bf4171278a2bdf939ce028e70b68647447b432a2ebb34d9d9f74f3cd47663d88ce832e7ed0e2b11f0f94533be13949c21d44da2dce16c27927f89634314e7564206e34303566323e5be3ad42ec7f5c5fa91baf658fa0524924ead82923651912ca307cb739e442b363330fa178b80b571e7c1482df6773038dad535247e8c20097d3c22afa3e7c09e40283dc4b8aafc45850c8829282205ae5e5fb81c7ea2000dc4a745312de0ce0b623f9fdd8accc5a9e44fdc0d82d3226e455c7c05f4eb2ddfc69f56f93fa240b430e0b95e88b81b1638c8aa7af5de83793112b7596870d733018f8b61ea5df8a7843709b20bf069f60f02d024c92b66273fe9c3224d97602c3885bc2b6fc7bb4f62b622f7959035d8f3bae84bbec04f89e146998972a5715d53a1e530ef2905319559efb5d4d3eb09b7452000219e36737e8bcf2dc60539693e5e282628667dd86bd896845c6d954892b84c959b204565ebd9c1b0f4dda34884b62c506414288394d7ef83a7b22021c90b776e7fb18f810eea5157f91c8698ba819343c959a4de27f6f3c750714209fc450dfcfda155be98dac6c1fa812e76963fffed29491ed0573b22ef5d7d9a4df2cf1c3783a47ba5236b7567986325759e256bdcf3bf841339044a5c906e12174e4fe09923a2b91251458f7d23e4fb7237950954323e23944224609eca00000000000000000000000000b33d8adbcb8dc8dd92aeb451488d8085015db2e9b856fd604e8adc1e763ac17709d012007061a5f49d9bc9be77f4caf0a4f0d7fbe73cf7cfa9118b3d7761f9f87860444cdbc098b11aad42543c696c8be520e0eecc852a409849ff3284a0f4d500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000624960d40c5efb2acd85ef331c7a1807a096b25259e2e11de5af925e3b3a6f7ba0cb36066c88d2e4cc91066a75971b85969bbccf6d288e8578342178c0c154ae1e4a4dae7e4c6d5ffe6202f0c6ef90632f4ba398b3578d7d3dc953065d8a9c632844a76e4ebab077c7351bace51362b34d1f79179620a237b27d7b00d1b6c7ea03031f8752997d5d164bdc61ffca7401f44c5d369d4ac9c7c386c0637fbd41dad70325938a1bd17a1993312a850684b083f4ef037f4f71319c098d484ac14b2a30610a10e31e3b3741155dd602876e88999de2833d64f1b660e801d86b9ed8242537a910bbab710ac8d6bb55048bddf0344c2c0221a9a2abea65273bacc4d2babf844f02169fb775497db281b05ac39687ca19dddacf909bbe3c3c7c6d8e09fc8cfb18270227100be3ac12338542b019df80cf7f3fa9a20363421986385be74becd988c7ae022f99ad9510426445013a765fd968e87ef1e37b64b9cafe98855d3a2b0f92a02f0207ea6b5ba37054a2d677fe5e6cf9ef6c5452dfe4ad57697fc5b5b63583e827bc030be0da3399bc1b1dc151a67d0b4a5f1acd74732fc9299543db6733d395c901e1ab3811a0e652cb5ab7a5e2fa9c4d6d70f5b1335fdc2945eb6caa5b5ae2ea4addf8051049cbce8613de8add016ec09e5322f7b2158476713b9bd865fb8e7fdfc08d05d9bd08ceca3698285cc5e891bd726e0785aad4be774d8a25ebcc39e1c15ff5c82155545b35fc690abd1caa3f4fb28045c9811223a1583eac081659fc6f837ba85505aa2dfd420b7ed5fa201c6d7c22caaa0961d675fb8eaa3ecab4060220f8e2dbc0c7c6ef2340fc291487c3bb2d58bf2f523a7cbd0af14d0983a78eb38e942a44fee5b5446d951f0e5a2ffad587dfc6d1b6b2feb266d3a248e6a6540f4cc8afd843b8cbe2966e345d15b56eb7261525a5629098c75fff43d9f0f70dc0d8d56a7afc6a138c49e6d68cdcdc87611dfc5f53f8028f95aaa7315efd1e8354db9185bc8b5a639d95a6f9891ae3d4049680e4e44190509936d41f723e6e6a362be72bd261776d2885ca43433fe751633f0bc2d0d5aa5e367605473df8050786b4108d7c91942da1f78ab6ebc225c8e7f84930e438afc4163dbc14c108bcccdf6575c7f888af2c3a47f1ebdc62bb4aa81e57162202f9dc2b093974c475bf3528b938d2f9202c0f65dfd09203dd0e3a32022432fa4f810fb6c9c99eb3d0805cf869063709e6fd6ae8e83cbd92a8e6b3ca129a7f89b470f9e424eea5aa48044e8688a1e72258c6561fe8a52f9a31b9dd4702c75e79599b452b3d05a3799bcfc322439bbe9179424c264c72c3b1aa32c89dfacd1415324ee32a236afe71241cdb0b37ebe5b223931cecd4a0fbd8e314dd16ebe2ecf27eaa8fd2291a45d5feb2f81c7ccfe0f15f861123d76f821ca9dc0a7ff1ddd4d7a89443546f9d073fe7f6ef217dac70afb4ad3be6276d1d6e7c2c83d9399cd1ce648f793bafa441dca15ca43223e987c0d60d2fa4021b709dd5fa56a2872e5ed7f7a83485f65b15bfce9ccd7a346abd751b35877c073b795fc03236d8e640d24317a86779e8b73063ec96d4083d26b46eebef3a4c57e956da376c0d735a27abd7e8351db89622659e2b9042f03d2d166764b54c8684b7a045cd7bce91d8a5a3e61e88c6e67d80855c1cd223adaf9187399bc702b8c7c920c668541fcefa50d79ed653d1edceb4737f2e282b23610f3b9c0ea7e79e09a5d95f66b6f38b8e007c1393ca99a1f070af098e6b3d5bcd84a29468a2486ca5483480569d21301f31a888de3bbeeb7f10800038f7549f6ba72bf96673bcda30972b9497b1010a10f6dca8cdf6b8c811c19ad8f45bd368b560d25979d98035c93e15a1a1137b4c3e5f76e3a8389b4715543eb02babac248ad06cb8280546171957fcaf0db8901abe3e6980e301a521d7637aba207db89a296e890e70640adee46f46d56b158f3e8535960940cac7e21b35e8499cfb76540f235a3630cde995872efbf900b32004ddefd691e7679313a20e7b12023db18a8b8aa6d4375247a701baa88ddf3679fd2dd60e44f776b593116bd63f8471c586426c1d52591042d201c7e8003963ed43e0666da26fe1081aaf0b3b1c03307922f02b65b43d3304e178ee1b6d27caa8a0b9a2dcfe03b34e78dcc75c2077274a61eab66d4146690271846dcf488d69b786e6113c48b8a40552111e2e479dd659d2387cd4d226a13bf586169c310095ff12d9eaeb02dd312942a02b0376603fd9146f756ed90d36524aa23f2086d8805a4ae1747c3da122a800c0cf5d0121287b3c505e50adeadcca2b2bb3f14c88dd6e94133fb459d3edb1153ffec9c688c03dbc81d90a8833b7fcc881ef35d3f362122e00b868dda13df93b1cfdabb0f17e2f1a33d81b448a8d681d02affdbcf4baf31bdd7001", "ac51", 0, -473689001, "e07f78466f491716bb0577ad7fa5f66e028075cb86a335ca2f0e94c4674b60e7"], - ["e2a4d5f203d41e717ccc7e8c36379cb40bffa61bfff86493ab134097798659e681d49334d90300000004636a6300ffffffff00b40f2f6c4ab39690275e09e89d8bc8a45ea7c36884b7df2b4f3483893e0b220200000006ac635165630065b7372662bfffdf3c06c1ffb8fdd048c81dfc2a3daf71be51d6c5c6df34e3b4534290af0100000005655263536affffffff03e89601050000000009536a6a65ac525165ac7925a801000000000953acac6553636300ab91264904000000000800536563ac00acacab914ef0", "6a5365ac510000", 1, -472291830, "b18bb188c82e495d5cf26388e43495047eccdc0719748389a55cdd22bf99747f"], - ["73d2c91c02d05a6f306cce4c7f22088ed3af50854478971c4a233e96d64874bafd9ddd384200000000070051ac635263513ff6cfb10696bd120b95e2b8b51a8adc6f4a65179c0a98781ab82eb62d135da1200b27e60100000001658b48799602d1016b0500000000036563ac180707030000000007ac516aab6351ac000000000300000000000000002dd67304000000009486ee138a5b0a6838b5143ba863615fc431fd36d794ae4b3f623fe3b28d7d89531394ffb0c9434752757ecf9a0f258ae97f46105800351c7880537d5d90d0656868a5cfc53d2146ecfa64a56074686aedc67e0533be90902279e9cd589afe35000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e17f8301de5a85d79525c13c946fc308bd0aa93d68bb710046a828b363d386a1dad0c2cee4828449a8d8f906e8e9fc3c2f2bd1301b07253837a86812bd03c96f4422cb97ebbf526f0e542b30672c486eb4ea45a117dada374bdd0465ed319967782ce6d72461838151bea0263afaa4f284c3fe40a9eabbeb3feaf7404ba2cef03122c767f81d77c5be838454b419c91365f3f6caccc27ff1b329984ff5ba7c0ea020dac100ec74ce6a25ec0104643fcdffb9a1de77c8826df76a7b6c3440f1e43bc0b2d75113199a0cc827c8218875df55328a0d1a8099ada82b6eee4222361178c552a5c9b24ce702a9b8fd4eff914893ae3ca030aad5b130deec9abd1c70c9190a7030278deaa7bc4f0d0c6946cefa1c94b774f4ac0ae91add074f1e38004c33a2bbe0318e3cd44a0d5226be65c99f451fd8cab3a4eb3019b77b908db735f1d003cfaeb0219d29b1099b2254f298d6b177c51e4b669988280aef77441a78f34e6d0f4ea9f0214da4ceb4782515870845fda8a2f8cb9294fd442e2f7da7674ed26f8330e17e10209486d36206e44eac1dd23dc643ced06c9909cd5ef1514abe15996fce3b92d7ba545ecfc773f8e281b6624948d0833aba2c65b634fb916dfbca8b1d03d1f5bb7ef5b93d4c5d48901e8739da8ae37e7761b0d172aea21aeb76e36a015375d4286eb94844a4dfb4ec14f7d3e21e5e472e6f134538b559a3a0e676a3cc452632c61fa3e113b4ceeac11df30d7b53915a086b8265f8063959e5d2b5ae06b666507a155a3f735bcd04cd757d6d6b6c791ca2629b46cb2d444f8e117ffd6c063cd288d13cc635622500f34d0101d397636b60c4e851f2dfd5b22223659d780f3b50e54bd028e116ef61dbcd960cf8ff27f401620d77f7d394b45adc17a291458dad4b87c2cd244ae6bdbbca452efbe41d7800638090738d38d047cccc59460cd365ca88c6b61bbab8f75cf47a87917dd9d682d85bdc5c8640b42f82ec5d6bb0f763046a9a9dec410af65e3bb5be6ccfd8bd071797f9c9e58be5902855f7aef39239324d0d53b7c8934e94fa877bad0bf1c81b11322b226a76f1a9d097b2a6ee6f3b3d3b55e4f91b084d1f242c0f36d6f0b65fc5626abdefeabc9236b7dfd9e7cf6789f1a36ed275575238943db0e4b5b85764e28cd5809a4f23c6c3bae718157caa350accc02aa4c530f5227c29e3d21566e74098a9982c58f7214bc03a8aa7a8602ebdfbffc57a508f095b84e83192f5246568313596211bdeb6141c38ef7c22e8ff87e4b1e67e00a5d1757457d8f300fca35d2ee63dc93d319c43c6254b319391e0f67368f6837fbf2016e4f4df7445b92c00f549a70d800d9fe1a6fc451ccfb280aa4716b82aa741483da7c1fc7344a2207d70d304b925d396bba6470b8842db28aa55fa88abaf5ff6bff615576eee1007cee085d6773f800ff983a2a3829b08ae9798a83bbf30034563c94e71a1678b2a6b1b6f67e87898392f82efee6175ebf92c72b9c10a25ce09de150de6cd08e22168c6d98a37ba09bea863e45b3a8ead2eb28f7617c242279fa0296deaa31d58aedf53a9b81ac8f7aed0c15080c38568c668f173cced57b32b2b030b264b93c6a0b9ebba17b3b4a3c0f6412cc22b414036cd65e3da9cdd489a6a55829f32450a1f1e2e2acccbf4c060c2bdd9c8c262df9fd0e6530a689407a39e6339ea8f92e971557c4f2cded0616bdb1be985d1dc9085a4cbd7ee8672de8de59c757aa6deb83e221c741a9bf0c12e8bbe23b793064707150c42bd9ca554d744410f8691e8a879c56f18b05d8e967817da9179a65d6105eb8d4e5d2df39316740f40e436543bab79b12390c0bdaf37e82371a2cb89c9d4af28e718a169a2ff3c8d2b1e8976cc449d8958e36a0c49ee4206a34a3ede3dca7562b86d6ce9482db54243d25cccc88e601676d6a080a57806f03531e1e7714f89a6aaaa3085dd8a1e36a5d288a80261b481e1fb1f8dae7471235b16f81cb09bf6133472c44caf0b4e8980fe7723da5afa0532035120d3f946f9b87b75d75feb50b5ccc065a50fc0c0e1ac71e727769f23766e7b31f633eddad25858db6e747cc321e2d2d5ae4155919914e54efe7cdc63bd04ce437c2522895f7d9badd1e82b6c07213b82215264e128b331bb2a425964d768844120832aabb0a022363dd8f008aff3d757583137758b77d1bf62a44ad7dcf0e2e77acd552ddc2c03c9204c46ebd129468e40edc84bbcbf714febe129e29abe0b27f5287b52c6e5abbb8ca472e00fd178248e6c7de4ffd9682bee2b648099d000000000000000016eac203000000004f15928adae2cc288c5bd985260d0a0a8b72efc8af5d89aad2034a9d37241f9b9c58aa729349ab302a29c1baa77da0dbac18fa6353e97c64265eaae33291ead90bcd56bb9f58aa65d55de4998ff575d015c49dcc120f5fc264dba14bd4bba4b900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e78982ec73409808a07ec4f493691846b61d52e02800998c763c9ed74125f69ec6613124b5160d738c79055c3c9904b0260096decf47573e46d666e9b6218ea55adb69e095427a971b9147d0a94fa95380635d54e0985273f92ae09f320f693b150ba2ad1e6bd81f45462e19e3c02b65cab93a9057449676419dc9c533f6f35c031bb29681bf769f194fd3b0f0894d31e2f026f9d4b44159815f4d2db0c5a01a10030280ad9dd8d47ba1444ce50a6b651ca566a477e634c7e2fe70d0f7cd51ed3f910a25aa90939cdb1eec8cd06450173939babfc57f11a787f734d1b63bdf0c45d4230a6c025839f71a2ae7588aff280560c1d738c2acbf0f134fd45cb0b7b72c6876032ee182887ef29f59de9dffb23f43cdd833963410a7db73cb2b2c29fff984a7310327057e50a2409f9a1207ca7c39428abc6e5c47a1f5befa5b3c2aaa91ccb3abb8021b95a5bf028420bd29888dd7f45f839a68ca1fb740230f40bfeb85482827f844021bd3c9d8f4fff3405f2c1615bf1846954bfcdedcd38e80cae87700c4f340057203270e8572418f8fedaae9050caa760e403f11998b095258bbf00d04dda874d9560075a3d3e1bfede37a32fe31786cbeb4b92b96a7a020ceea044f8665d59e016588b1aca2103452d4d1160931a53e3496052bedcb00201b60e2736917e40dfb4a1502f473e595a889bfa25c858e0cdb598af7516e348075487311a6e52ea4e7d3413f5fdafa6fa2c6deef3393d25b25f786b7717c78c30f3567075179e4e8dd70cc1e92f77f25ac7a766b21fa1855a4188f1a8a9fe8a8673a7413519fdbc12ff03812dad4ec8c5e488bbd291578dd2209ea11537bd23100a5c2fe65c8b246ce21ae2d9333a2beaac06d8226cda5d60a5a4c96079d56ef8405cb3750ef3d859db1d8134639fb5e3e09cdd98190571b59b946acbeb56cce5d2b585072ecdc8cf65c7850a478c6e3dfbcbbe8cc785605d16dfe746fc1d372f6c529d105d1a494a0df2fe266fb61149c974061159d2f3e360dc184c3d73c313879ca3530c56bd7d93a6a24723484f893298922dbc051deb608db95434184a75b501367396616e8eaaacab7124c690fff60b19b36173e75b2caef8902d71fec8c8e4255449f54d4ea631ad66480fa3b53e95b1103d4d391eeef75f3237c071d32f3c7bfafba14c7a6964c01068f0ff40319901a160a4456ea8c795f5f2db08f70d143279d345fb9e9c7fe64f0c75b51e48e3fde8232d85655cc1b7777a0b5cffabc4d4ccc6227b81832c4a8df5668550f5537890096591b7023e85b0b30a320a812fef71b64e173da3a371877febe279c90ed04c2eb8e25eae1a935fe75196ea6558aab110339756ad8d56f26385c26069e8728a75d93d9d68373334d253ca2d4707dec08e4f1740501da8068aee3d74d88dfc322171ca8e2b62c97d289d523e33832e28cb7b09e2d33b84a9f8971b4fa18f7cca27b6e18af8f83e12b3c92572384a3ba3c45f392cbc45d21c8c495fe2b9eb7c485ea3a2bd1552d18cfece62a477a2666ce6e77660b31cf84a0d0a6f524220b457fc6c72519c4bf4b7ad76804ec2b3904f9e07ab8abafb549a468b54ebe77c46296275d294799f7e7213ca3d4b30f1ea356a45e95bbbaf1b5be74bc83c86ff254d4066a679a70a4d06d660f0fd7e036261f3c3191a35d67590f9fd5585fbc32fa42c3beb74af0366fba74ab4f8d2b0176e686be757d454173ab350901ce109b31e5ca9a03f63f21ec4d9198b801f66baa395a26df51cf73cf35403edd40d6fe73f338deda9ec447eb61c8d05f60d795daa6fead0c46b5d08901be07dea4c47a628cd1962a4f56323c826536e194a67d2786ba3882d7117b0c3c78bf892b80cbb26081cbb37d812aaf49efcce43158383f58c249bbe59f70ff1299334bf5d288fa06a2c05d8e0a158ce7fb2ffda13ad0610e0155112d08a096ccc0e4e7c16a98d3db3ade3e34129459f94db14c2cac437721f7a23e83da3cc407596ee36ed7b33d1638cdd31b28f583d33ecdd0f7596db12553f5b7724e0e9ff1ceb803fd6791fc41930f328b9b2cde41425fd25203356b5414efc7527b474f9f493de901ab09ef2b507e1958a129234064684cfc29440a8fb3b87cee05cb94111448ea9f4242cc98748cb9bac5b0aeaab71717d4b0d9adeece7146d2ef5852b6b0ca4b1aa34d995d0a10d2988c6b0db03c5fd7d8b4f60959b8982f66b774948c10c0e6efa5dddf80c0ad0e332c0d1c12bf7e997564ebb6765d9da52290d1bd2974d4421b4c0df2e27c43ad4a2e278c0000000000000000a01cf10200000000d6458214d86d0c95729e081ac1deb9b245bfde5c57f6b8314151ff83d22bb05f4921e7dd509e139859e9dc4c0b363733d5153c25a81c5767991993fe2bc7140de2c130d0f15afee7b02969114e811858861783b4d026ea1e5a72cf4e33f0409200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e979e7aa1e47348de1f74f0ef39e12ae2e362cb314ddd263d8d8821dba6cc2cb651d9768178277a4966f87841efecfe191b24a87c0412a6f896b8fc98a6f40dd43c71384dcff672911977c45bc9a71f17cbc6d5a71080da7604f88071e9181ad2c2d6582d96bbc5510e508dacda1dff08039970fe2773ad810cb8170bd0a2435020bfe8d506b50949bbe4200af7439f71358967b649ded4dada0f37402e8dec0850204abd91723be458e38da27260f886ee66b442ee9e496d056a761dae4efd6c4d40b19b2a5d2f4a913a8ef2ad8a9bbb74cf704bbf30cd93d37fc2a9ccc1969ad45b922cdc389811e981baf7f31082346e020520c779dd474d69e7b8f5ede7a601631030fe25d6fb31837f8c930bca8cff0707cc6a99d20fa9452dda005aaea271b83a40325f7804eae1f53079b053491dbffa69bdf61d2483ea55d0b5ac45163fe9c5e2b031d4f0aef90524cc097bff31738fdb59908cff5682a17206864c7473ffdd90d6203069cc1ea68e07a38a783d0195b6b6ec63e4adafe71d1c0d74329622905d9f413032a43defe830ebe0bd3bba1118c84bd551a8a887f879afe87a68ae6d8189bc089966d228e8ba3f4131879893e79de6ae97bee3d34e41c89ca7f8e4e9422382199c9ad67528f2d2c07ffebb1c1706b4cb7d62e7aa357de502297df184484a81b81011bf0d86863f3f17b995f37ee94fdeb6f447d54126cc6425514a70fc0d2344ea334bd172c2d1008b897b6efd0f4c3a7c9ff6557b65e7de7808f11198c0a9e855bd76c58351b484fe0c82008d7a24b63349053039e22935e9960a03a581b31705fe1661fed9e4edb5535f00887124c35a2a64ee0512f956e446feeadf9d6418fb597c826473c097f8606410462663fa2575547da5b6c54305a68951ff356f8cd6d78fbabe2c2f2246d2e42bd962273c863c2bbcf6127c5e776a8d020c185dabf85f40fc337a7a97e04b241973b301021d6f874394014f88c668e3816abfbb5d3b6d822204c7f4ea41d68c5510dd2e69542c8cbeb9f9375d2527b3461b39210c2fab5ef576d6acc254d465e4b29ff0053eb2b0290199c51e78b38d11696736610607713f05a71e7ffaf6ee97b869de92cc8e62fca1c7e3be166b1fef5995f02668ef9c33b147edbad32c7814f8341ed9130be2e8cb3bae474ee8bbded1a06d212cf122d26502968c6b628b09e0765dd89068225f3ca99a058c037102f7afe5af454f388939b9e2a69052e129e66a296f598e21b1f725002252fb6be2fe06431ca360ce97ef555ad3ffba8bfd11b46fcb4c23e67dfb0ac7b148007bf955942a265f3e636110103f7fbe210aca9d2d4fc6a428a77d6aeb8c5aa9ec071cb4dd73622ead69bf25d0eed2b46be73603c479ce3d85facaff58516faf45ea4b63f289d6c86819c1105bb079594a5ec6f5fe0359e58bc7e5698866c7d8b3740d72af7bc3fb16feeceae1587f8c92af1cc29f21e1b5f96971a2a5659a3d88743f4278c4e627cccda348a79f0d1a88595fb38d02baee8fb5b59dd635a56a0834167c27b51f054e3940700542c6308963a4ac84a7a4cec6287fd25c0e2f7886795d1202070d0925225862436ff212bdbfeb2f19c71ad0d045f3f6f2f4b5b9e00e4a82dd2ce8701500e0efb7f735f39f0a0d4983c8c5d24cdc8b7c094022ba412985690cfb6bef5f1e9c8697b4e88cd69faab84336f518fe7551f0cc50af4b0fe2121d396c0c687a2944fcf54f9ab9e1a27e652563714fd0241601522ad583f72f907c201083b4553c472ec12234c6271197a447afd8e48a7c80c547ef58268827d11ed3e798f8812adb5a51977b8191440db789ad4199d5d1837f6aa5c83dd08ef8ea5ddacf7e43420a8bbc0c36b01a208660a7bf685a33b5251370159f9b44659b863b035e404014518b09b669c67a7b428b6bfc33b468bc423fd151b2665183b550a97b67d6cc5abee057e5f3285d02a35b7bc6674be009f8851c6c083d543f2c594a6681565409c19408d4acc0a88061701f8621f66f9bb564916f2d8b73d2d43668c80c265f481523e38b5fc3207e46466626bb8d0d31079c9bdad95e251e3a6cdafbd3f6374c07dcc1ff4d2895851201d117b2785b951961a650dcb889b6555079c267f95e2fbdfae872f5ee1d9fc57b7d155be1b9e03840835b9c42486d9441ae712b76910c53d122b6b2b351201d8e290c480276a98048e0eed1f3528b54de91ad58a4263887ce85f126b2002f30bdbe0d075c09d4c384fb8b902fd695874080015a0ef06fdbee0d1018887ddb3fd59c2e5120825313933e323a1c1183f7a129d8fe83ad55e407ec1f27013fe11a8f8e348c3bd8f98485e871720d2bd68ce0592527770e3fb52c7cc82ff816752529b55dbaea43daf7848f19563e66f413070b78156b4179ed16f35de20012e39dc3ecbc4639707", "63", 1, -463206251, "3b40fb9e34acf202596e6a7f5ca6da6407bde156632b95e92d323d87e3bde71b"], - ["37593337049f3f73bbfd2d134ba232577ae99cf4b9e92407e040af46399211880d419eb0490000000007ac65ac536aac65ffffffff6f73124ad88d0475d7e839a56b273ac67df92632f6ffa4b584041a1f37d05374000000000963005165ab0065ab53842e026a383832e24ac1eb533c20f4d2a6e68950fe4c885a936069a3d18f07e60e5ae136010000000851ac535352ac63635a5fa97c756e68b563677a86d5db075503605d92566851dc05b9e6d0a8eab0c5867347050200000009635253ab6a00abab51ffffffff0464adc1010000000005635353acac3a21da0000000000060065535153525ed28a050000000007ac6a53ab5263acf0a5b30500000000065165656365ab1edd70a2020000000000000000a99d640400000000e3e07180a02f2a2100cc04def7a4b23032651f45129b460a901dc2ad29602f26ceeee7dd027efdf2d180f10639bb539004f315f8204518cd287043040641f67e1e118a8d292917152e41f4a863568fb4ecc3e8a9c827a34868d6ede8aa4a885a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b65fbbdbacad3b4856ba2b3c0e8be0de535db73cc658955e789f1e350ae3c28ff3e3866156de3dd4c32e736e1836db2f9f89fb909ca36f89809c9bf8dadc4846b4a6e2c24b0e08b6d68efd6d985390b2505bcce189d97a4fe39ebdef72910c0e6b204a5a28e1fa596758a0831a933149a63f4c9d612a2540f3eed23ec2e1977a020c183286501d6389d4d89dde71d49cc72a286a899076068cb70837f38962c5b2032fa4dbb137365409efe648aca4e0698d448ca9d336f11ca18f207811ec8c54770b2b03fbd3e4be908982a932910c70400e6ce91de3c4d0471b61c2550ac75af6270eaa137a0de5d444f73708e7dc5da53efc93f59c9c706bf31292d650de4546e4032ce1602c2f9197a721c44d17ba077f1e5fbd3eba0682759521515d3570b1ec17030af99c5d869ba6eee909b365fcfb106c1850e2e6c2c90745bfb44d522a47989b03123cfdfff31ac3815d2b8de408dead8d8a99f8fec37e3c194aeea597996c1825031b1ef34e5e07f0b37e9f90e0d44ab00c56c68627c1008a1536b15e0d674d77510210565902bbbbf4650aceca6bdc75be916a498eb6bccf13f4c8d4ba5107762c11cb30bfa981aaadac34d6dd406976e9708f46744d509185f147371ef580187b933cc49e3ccc5024bbb7523f9ca2efe560cebaef47f976a36dbcce7618a4509a07f21fdf9de57ce230bcd6014cc502701b8c4b8bb5709f36dcc0a5d290380d9815676576a5126443ffac2508b1b506419d05840e5ef9bf738d45dca4611d2561703a9a16ab6ec53bf708360b2aebc95207edbb015564934db46be8f9355b7dc77d9bc901a827e0a1a2628067388cafed772fb2143be11e9d365f9583cb5eb20c33a2ab3a08f4b6cd991a62f6be6bbb7d1aca0dc05b0e0fd3dd8cb18a1d3ba023d030aceb4db82ab144da0215e0451b2160873a0d899957c3b3949f2c847ff1cbc3eef206fecf1ccb96d68a765153354816696138b1b3c972d0311b4a255bb1fd1d833e98c34016f3c42c4ba9c567fc46a372b2e5677eb346f4ebb514adf3996ce2880ee170ac649eeee4419cab9d71e0f3f537fba7447aa2b6906f3cdc695db28d3ca3afe27864e95d7b3718935555590726a4d46ec2678a95bb6d5f05ddd424e33875e3a58ff37f8413d332acdf2c61c7cd042fa32dc2bac5b5b020cbe1258f1a46e5f14dfe44eecaf7fb2006772b8c2e95c4276e6fda4db82a819c9a6101dd392876cf1761a821e56fd40a77408ffa525f9eaa07549ad87e2d6c1594ffd1659f51a8d3500c1c947a22b5ac967218f413b634aab7494bc714201d73b454267288c07cc13ab66eda57ec8891c53b42bbed1a4925412af743df2cd21e0c0717ca17f94c41d316687d72fcea877d4a14870409f66573a76d243f0645c4828cbcc2ea31e720373dfcaf3366e4f6e422b4319e3e7abb9495053ab13a06af724321f9770e9fb037461643d8cdd44c419a41c07e53eb73546490786f09a705d1a8bbcea320860de854b89ff3e03d30d226cbbc6fc300c0783b253c2af6a2e790d616f3253bef152ff6f4ad974958c34df23544ab820d10136796bfb15ef2b5871caaaf390a7fff5d8df6f61d8ec6775f3344701e19ff380275ff5517a632da4ed7ff34e55b695492f7f0b781eb4cf5c7d8fd3ed6280d320ccaf0b68788a2ed58820cffcf30f68b6ce444401026cb6bfdb868bbbd1ea26bf10464f16410f7776a0d065cd216d033dc7773dfd27ffe08f26a89d271c804187558f19cbf5c74ef87c681092bfb1bc907144cf542db425c54e9563e9154cc2126300d1b14b79bbf63ce65b26d02745f13e6b08c6f1de9902ee9835384e099f4bbf3f891f31e730faccb77bb106686be22cb5a045391c98cd9f54160b2860fbe06ffce33e33bf5e7af66dafde6203071692062056972cf8179bb6a5700aabd6deccc09ee420cabc7fa3b85bda7d26d1a8c1e7f549044c483e24b279d43b6be780f817081d3d69d1bf73fca31c148e1e2b436deebdf56e3d39abe743c705580794bbf2bb9cfab2adc850dc188a9e02c4b4bda78c983930baa17b545f38d476890caf9eaeaad6f47f6a0a80da9d72eb98bac6fe24dfdc27592b9be09e15edaadc5943cdcec45ca8641d33647ce6e90e9a07f4f7c1628fda2adc9d7c66c34f79ab8a077fafbc0b443cb557b5938c980e4ccd021bae3991302366459d4f707d37f78e7bd452636a0aa7293b8893ac1b925f3779d6c9fe57f248231406fe0627e0e5eee3ddf62a4f8d43ea9a4acf1c6961dc9f402a4e4c92e85da4ca9f7ad31027bce5c280200000000000000000000000040c2fc84a7e302acdefa4a63bf58adf873b5c71c5f9fd14221b51b6a651c81ecd57b62a8691beecb825f72b0076a5710d036d56837b4821c13c19bcf851faae29c47c003dbc2844bc335537aa8d7cb63db727220e4b7fb8d3353196a450ce98b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008891048355b2181f300b8b1ae0ad4a1751527689561919395be55369f4711ed98400db85c219199dd8663c155858c2248494d93172274c3cd41365a768cf3cffe6150b5e0c89413b83c64c43a1c59206fdb58a0dd670378b5b0fa7ac1f116f3a5ad2af148e3e01abb90aa6159e9da0096f44be3c9ff605b3fcfc42f0a9cc98f5022465b1107194f95f4c9b1842294654033e5f850427639362d51d9e34900d8af6030ebca3426d6ecbd65ece144ea9be87eed00d77297b708aaae65bfb91af67bdd70b24c7c9921f4234fffe1ed25e33233914640742d102de0fea6c36fe69687f97b02d46eab7902a9c706b3f3b8018f2727d757db74e3b03e2a748a34097700d431d0322add47b95f1e6b6b798b194a01e57a10659d37337842185ccd3873713f69898021efd361b654f0aa8e18076bf74e94d476ed2fabe5df69c1e67a07af78977674c03109c6c6bab5ace647c5809ac3f9f22b5ac0eced14ac1a10e23c800ebc096f766020ab114147a25ae077a387c3a58b41227326ba9ce2f4b6f036e40f0cac2da3a230315db973f4fe651f1d7cdafd438fa55c0f8522769cc15677a17e15130bd194ec3fd9803f805e045221c238a18d888ee31f0cc9126852326d9e24f5061b67cd0620fa9c0ebe53243928db6efd392a33f86f1b95b525c9d69ca394f3789804ae352a5f51afb67b87169cbbc54f0495154e1fdebbcc1080c53e8f840e07c12dd13b9da547f4ec92c20f5be0cdacc9bbea4999356db43bad00cee28dad71ef636cca9f987daff5ccea86e9babae2fe5022e97c086d570a3638eeecb9219579dfb2268db3243e9917ecb412bf2e82a43d1629fed6f663f784d29a26f91890aca825f751a8c286562fe248f2c5b299d607d21002bd17789bec17afe932b1c35c896a8c930d53f71795fb768facb4f25d07630b9ac46f5605b513a60c9e69b875eb46343b05add674538b0e5f4253fb4d1e533fad3f752316fa3ac309de2f7f48e381c5c0dc6940528868a9d4b66121d51d4d1869ee3825061ea3033f1a824552b81edb797590d91422792c67725a069fcda9e88d377265da6385793488e27d630c44c762237c52a185d779df2980b69d937e93aae239710640270f6a2dedd8acb175250761fba3e458c3a21440e96838f79f1ff64b95bd7536db692a2fbf2c448a044388e91209352d89db6a7b3dd8c0bbfad578b2e33d6c9f1767861133776d88aae18e773c02369c3429f735ef26a338901749a47a3d5b14bc1c461be3fb0483fc2f5904bfd8c47185d59e7dee4dba10bb1b9e48cc1f5f73351bde3a5d0e0cf255ffb739579ff02ebe332f691c91ffe051465b7639e5e10bc75abd51b84f6a0b62a5d5e75b635adb14ddd4bc739254d551addd2999c299be48c4cf0d3c2b2024e24a40c7fc4696c85cec4ecf97a6467abdcfedcc56ad4aa03f4bca2ac0fd210698a5b33169fe1bc0abebbf6bd3299a1b467b7838cd141557d119894d0ca306212b25690d47e4b52b4d490206eff22298400bac499a8442b5704e44fd7a1b862f3fda71fb02432a3aeacb1a360cfb4805cda0982b0a864ed62d839d50867807f56ba170f91819002768e889481e955f093d78eb107c7ee1cb3f5ab967d8913082b9d6a0f99bc69511130f33c68a0c432d01e5d2399338ba7cf1af627cb72856d6c680954e0f1afe4c6e8c165bf96926dbc21b990ecfc7e0bc6d117940c9f382fc8fc2f9d6125af334e0ffa0b313232b6fae78d681c47d71bdf1c48a91c2a7cf1412c4d2f589e0827ca75b46e5d9d6492a757db59081d840392878282eafe566e56076e70c2aa3603e501be92fb3b76c84d1ff3f744b0faef1a1dce192e53bd56d3f7f1a02e62a0949758369b19eb2cf0513993d58d3baf3224d1d63aceff5dcd1039082f6f4b67d16263efe34881423e0cab2c66690faa4b8b695c90eb67db92d0161ce569b027cc768282f942dc94884da0dc40bc295574ff0cb5394552c697b3300835881724aab997672370015fc6464a1550fcda7e9e68c7e91fd77963d6cd9a96593deffa11d00b8437e69edb6818a4a0f7c27e4d2249de6530aca0f27c318691b9835e4c90a71ab661115a38f173c0ef80993a584b1d0db30dd7ab33b0e87a3b42a0db777bd07becd3265ed7c76d2a4b7e5f9fbddac2b7f74735f77df5cabb12ec7b8580dc47235f6e4138e5e96f154a6c4c41f3f0cca6399c2948339db6ae797d9f27168dfb6cb38fe70782a4833e7c7e68e827fa64c88f50d63ad8380668c72e711baf6fcd9f0cd58fdd3a5037d0138420c4dd3bd67bae1b85c1b4d7f002f57b37f60d903cc3877435b90f47e0609b31200b70f4569e12be35a348a466ec2f1003f5a6cef50e85dc52b3370fa02e8e400efb16c1247f8c4deea76599c5a69311af74f580131339ba513d670ef86aa96308", "52655352", 1, 193514695, "d2ab576e60f56cf85cda927ce1f565863ae136b314d41022209c7b3621cc5a74"], - ["6ccbe433045a7fceb9ddbf143c05186a03bfdd8cc5b460c314604fca892733128ca4f7a79003000000007254d76a6d231ccffc50447abf0351c54c7eb665915eafad0e2d1a8e28bda72dfc1546800000000009ac656aac525252ac5117b6b777332a834080b3dd85a98d880263f158d51121dfcd30e9a6eed365c142cb0145bb03000000066363536a5200ffffffff0220f7a0cc48e62ae55eee286a81e40c0599561ca806d3d8c0b1668e6507be6a030000000765acab535353ab1b8effe502d7a1a9020000000000ed5d2d050000000007ac006551ac006355707944030000000000000000beec1d0300000000e4f832e401288858a059623f487c96ec2319752b85019620db7fc99b8ddfbed372edca9be416b16b03b34eacfac455997f64a1f5efc6c6267a254b08cbaa43b04dd50c4aaffa749c537a14891a0f9f20f944eae58193e32c99e928a1befc4cd30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000092d19aa84d1efb35a46b4e1bd44c5b183240006219886a36712c601cd8aa0d652d7b1205361a9a750929cfaa23d733aa6a3e19b7020d33dddb15d3aad4ff8e06824ddc07d0fed5295d5cb0416f271e77c6237da66d1b1ac713d3fb4c896cf53e5841701d3339d18ce8539716a2929ec0354f3f28e93a3484c0d6fc4dd2d90e290303d9cbd3ddd560629d8bb9011a3e5d6b1b6868b962b9134b04c845bcf5c0d983022231822fd1f9cd702328e7d0c5ab7c286fdfd53d31b5da04afe8d70459a299310b137a4b21107478cef8a6fc0a069069d0128ff64d07fdcc42066a0b12a10ad36213afc7e26121fcf3b2e9cb42f686e190b21e409e79a923f37c47e84e29a7b7cc02071536aa0d13397d819a1f8c4c0340f8e9892a7177ffa53fde9dc8d658f22dcf021de00c0919b9ef9489b33ee1b5ebbaeba9f963f00b2075b8d561d7d25c20620e030e7561387a94b3ef5d5840a0e38dc0bfb467986916234f42293e558a6213119f0323510149cb76fd2a12cc4fba0f0d0e89bd45bd895c621250587decee2fd0db42030c8ed51aed874e674413409c0e0f363c5cf5bd3ee99b375d7830aee4eb675b729a15e5b6247986440a7a16ab76ca5371e034a2433cafb92d25b11c87a219987a049e3237f76610d3855d6e761ccce7495b2c1df8fc95626d33f08439d7091fcd12e96b31c5774890a8ecb35a4f39fb3016c0f46b4762206e6a30c5e83c671fdec2dad21c079d8be9502d466efd7e37cc7604e4f423924ed77a745f6f4a3036a4cd0558fcee6e645e6232d33156a94f22f6b2b6ce8756f67a67d83e337b64e6dd689939a240c29e5b7329d29f75c497faf07da599167c2f46b1ed6224a6afa588072e82e3a66a6ead96429e6138ea7e92c0a820fb4cca4b2ed95b2139d175d09c93229d22a77936071c298a5eb0d69e8843bdee51d733c275e1e08c3c51abc8510830a645f0419f3e05d9502fb3ef4d78486781ad21ef24c5c6e30c99c4ba4036b0294f27d6283e37acbf26dccccc83ac7a6213937e4cd05db68ef3eb372da7be5c94698b702ba7541f0c57cbd36a8dbfdacb762510f76e710e7fb125be7a646dc47e3ac03339984ea625befc2cf3704405411f2290781ed8abdfc77907d65e0816947e1b3e5856f183ea6f7fc3b573ee3ba3eaf5e077dc3acf8b47c03e1338667f77ba2a717693168b78df59420dda27d166be8b871687eab27246518a4534f850749217c9b20ef2a0008ca4bdf232a9a5a2561575a91740875c73112a31bbe0b784e81b3b97cd2b3fdf7974a80404bb928f4df08435fe56a98de493ef938b7446b0323eef737a171269b9047bdb6d58ee898203c65f89a84570bcc416b27388998a2277bdb5469917b5e0cb20891b4b7e4bd1b8902a23ca6967b188a6ed3501abd332a96dc7aa1fc073ea79dff631465ba2378f0c6492541d132632ef11af8379ac927db79109562d413bc7c90cac060a1213082a389a4d29aae6b06983584f453459860ebf0b6981161cb92c9155f8e7fd3c15602a6b32db5795645951765234fccc876a4f056514c0949e51cef0b11716a61fc213f9e4dd57c3778315677a7f6e3d38837c46242fa89c9ba2f8e7f206f5e6dff078d9c04d3da6de01139ee065aecb28569167d2b74d16dd6b11cf0faa99f20b5490612765cefd52ed75457d11d41ba9846c6007974a527b0a9ea9ef5e600bfb75ce38e203fddd6a053531d600b6f5c73fb40b83e82420c9c405f0d65f9df8b77e44be3da895b113c6f2b4052a59dc55bcbad4da05486ed9384fb3698c8d8a34ca4fdf6f7e27a6745beb045bfeba30626a16af6184d0bacde53d5a65fda8832ade85548df7b5204052778b44431ce51be878acea27ede1ff6dc24799f478ee64b7312b8231860410c3a407cd96c1581ae12233f204a96371ef1f1f59cd38fac7fd46ee75afbe649628e698e7dd4b584dc0da0f15959a63991222f064fe9884bbeb2202ba8752ed1659097d20a799021198c657c480d82b31c433a991d8aeb889f464a227817cd75a4482ade76de9580cb05bbc448ed62cf07a3bccf7313d4ccc30212133dcfdb53ef6d3fcdc0a8cb2f4d264af5a81f76178b7d08b4302085b7f3b7aab74b619ddc20989cc6d4bffa829767911a9d630f0dba4c371dffb27437db4d6913e99b89a3bb7261d171e5756813e6503bed209b70129cb5a5ba34c9d8736d8a1e668ec01972994ad9abfb1c4fd274c2ed9174cd9a906ece146b92274e91c61affa098d32d748474e249664224458a42dc87be74b7d7fa6c3fb6898f366f305000000000000000000000000b04904247249aa08c7613006d15e8bdd31ef7bfc5d28800ee6c0940895e90c208d69bed91a1c7c19a867909eb29760578bc9e35cdad86feabeb7b8578c69b3ebae5306af519a01637b69c82b5e118211293997b04e061f853ea652afa18256d200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000279f0b68d197ba0ff60e7d0b20ef52c1229cea2fd8be73bd7b26d1d008d9613718fb43399a99dbd93265df37adfb1a59090f40564475fc5b463b01608648b33a536b14c395eb4e5fd1493353229c7157e114f1f5d9420f7181d0da958dc71d199538285f7934f192017bbba8893b0830eefc15b265a20f54a536d67ff1a0adde0223db0b564c7ce074f4464323472efb9693a8e1b28e17dd941c64346ec8b35fde030a8cce16e6bda43966d92281c65fa4b849199ce58e891729634b55dac6940f5c0b0cba47b8c7d4382122e2403b5f5bba09ce91efc71333fbed4935206150a2fba62fe9af1f3882e03e19ad6d2a425e17df9478c956b8914b06a2378bb24a53d8880328411dfb2eeab2ad4e34a77657f10d9a29207326b68fc3cb34a57ddb8a7e5e420225bfaac50057a68f7e08a6f7742235313bf986bc29f816204eac5bbe297ddd7c0320fad1c4f553beaee0d551af54b13336b8bf911abe9b83dc1d235a4885c54d410304fe0596dd2b070fdfc38febbd59e83290dca749c52907916711b0d8b3b01d5803230cb9ef2888168434a49ebd4c554ba7c0579131af1044a8e181359fe55be78c533154af61268efda3b96fd6b741ebfad88844641ebd0a5b9e9ef2413701d34bafa695254f9b739819747152c7a59dae37b659cd964092cf50bc4f993134ea17b26a1ecdf08ff83e8d1b8b3fa2dfc08e7b0bd2468cdf57a7f4b1c5efc145dc2297b3bc1b232187864cf790e6988046c2afb6fcffd783a4034487a7fe96a11a8e156607f1dd557a59c1948d2555349aa7b7a625500a0e10f3fa5881ee16146bfdbee6cdb06ba265153793ebc1685c60ad7da65e6c0c8cb29ea4d0662ca84c93a60a59cc5fc60fb4d8818b06b82d65a6282c9a08b6d6fc9752aecd6db12d792c6cdb72628e16913d493926f3764ef5b4109d4807e766d88af5e66ba3dc7b8aa6c801b02d38e09ef0eb0fdce8cf5f221d8c3f1d7ad28ae0bd97b2a99a6a7703f4783c42ca104af37b720c5bb379965b86d844da0cb46fe55c38484926f79d88eeefc9f2a5c066dc333f8f5db7b1eb8e9c75f33df6ba7b56803eec88ef7d4a9f2d025433de33204edf3a97f15e7a8dd02e322567bbbd5a6142d39aa79cf41e3a88334dcf36763184325f0b74fce3b5722e7d5e26132765f1ca49685064ce9216708630df4d862dbd7225333fefc2341d5ae0ad67b1155d06c1d440a672bb6c9ee7da585bf4c182f68e4f4d0cc9beed090c692c089ed5526ba1c0a7bd0a78b21bd3c0d7464c458ba414271342fc8df70d37df26e8930e9fa6d2118b11d8e111d32c51058d7f10b5e721346e025f00f96b0a6c87825d6d36b84b2c65e84316b2f3564aa216f3e63d191a1b09521d004aefb34a74524c631a498ff5f8f98532496bceb629d1df6b7275a90e1da891e6d9da9008c388ff5e97d9794fdc50f861a78e0bd0c37d60a620b7e6606bb6715e46838534a9404c5d1683a6ab4b1afc1066c649265a8c927c3804a904308aec8b08f9deb8b82349b67d40c8e468679279a3d723ab4e8786d0a2a2394b6d64022d205202a921b295167fca48b3fe4ffa6ac756f2f3842a4e58b149509ac3d02842652b310bf85442ca2829781e0c9aab8613d4cdfe7b979592963f6a38741d69af09c174fcd4cadec7ce758ec5ccbe6dbf2d354eaecf3ea44c9c6ef3c17d92831385d8797783dee56a40fd8428debfcf8c8ee8fc00a3facc1e270aeee39a1f1cdb618b4e105656810a8cd8a8c76a277668a1c3d239e104d9845e516582df6ed6e07517cfe55f8c9283710667a313d25d590174e0b6ffa6781886c619926d816eff95639adfabf2f68b8018273b941c8b12c36ec9d8ddc9c933c6dc95f968cc0d72d4eb598ffa8ddb5a0af5db26c6039cbb8dfbde9f87d3a51a870dd32da02ee610013df99530bbeb3513a895c2667cf30ec246e3b0ea60579422bf764222db8740987b5aed1a1d60634555b105bc51f7ae54df1f8d1bdd85bfddf742b37f1fab41e0be4eda401b69443aa0b540193c479c3abc7248a01ebd4137b0236e3f94da638c8356a8eacea8adde5d3ee690b952f4a57a3db55fec4cbb84c555c354c5e2a6ee4878ea8f3b13820bcaaa2f1efb8210330c031adb7a3870ff88008418980924ec9150b810eec3f958598e9fe6a56edf02cd888db73cbda739ab2fe686853f020f95b8c4e72516c1fd30e9f30930244934081493cf41cd195eeadcd0e61bb24e90b8e92ec03bd3915aff23a50567300875e26b805ef56de0d9531a427ba6c4053ff43c3f615800000000000000004b81c302000000000b77dd84f5668c964d4fe819a774914ff883a57622754350ec19e26596beaa9847e03b0ffa0c74fb0c3ccd4924dca72ea94d45b5c8ccfc8355cd5d236e1e62630331c1947cba8e5abce447c6e5ca7e1fd0508051356bce656bd2b7f3d509255f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cb3fef8efcb862fbc9042fe6e9ae67b3cdae6ab8af8b301715ce990048e3393da46304d41a4d244c7b2d1db6561688314438768393a7bc0563334cbed2a1ed9fb14a4b9c62bea43d2954b971fbd968b4e44cfb6c9ff2066c8acfba94d81956ebfae728507d2218913c1f5569c8bf8f2a971747303b597bdd3a93f72862ad5d8802152792f2ab4955bb763934fda5f510fb3ee9f8242caecbb950efdbb2811ba5460305bbfa151adc2b7763ac5a1d32c26014d62ffaa8bd8d57b9999fd2fbf25a17a40b0e1248b20ca0aa6d978de31c94cf956012b806fcbd03f5bf8515b40173944aef1c34bc221544785badb7168f0efb3f8074516381c6e2f9bf57d061f8f1bd1d530312d03dacf77b1c8e621c6f29b0189781e03b4dbdd609cb58f50474cbf4718b510220962f167a29a8e4524c08e71fe51bf2c601cca481ff5106ba81a58b8af1dd4f030604a2856146c27511a063f1ff28132b0258f0e6b57519997af61c9c33c451b9020bf3e40c6834c865ea297613d70ba8b165f8ff679aafdc3f4a8b28743dba14490213c901d5c80dfe0f5efe1c3c5aff7ba95dd11f9887299a9d42852fa487921e9e3eff59cf17adb175647399e599c59b77c843687fa41a54feae74846d0829036ed98feb8083cf5d3161a5a09aa7787dd8c2496f33e1b12fd4fabeb769f3a940c8e3c59cf98e3ffb1881d7850b62880c127d1794e08226f7edd5179a96a8cee92d24dbc9ab4783b8a0ec29161784d1a92d13cf3c28eaf348715f5a9175a9d59faf48e20a4941a7f6b179a802bc14ec5b9b219dcf7d6d3263cac702bcb86c97a94b95b9cabbce6933081108f76b3ef53583d391efe239e910943303b18ef3c55a87677415a0bc2d103e20d805de0bd5ad97819d7b6e4fb94c8ee67cbb1c95c027780433841d344389d24a92c3b7471aee5a7c5675b788dcddf9834f9e707639e2825f080d23cf5555b8cd6e47e35a1cd832591960f941e17182a505fdbf7b50c5ec073695aac0fd132b0f05ea14acb730757ca9fdd9937a05317fc51e21d72a2721cc30f8348f65e7ae4e277d071df1a1176afec1cc0a97ad16f14ea8b38228fc9812390a6d0e254663fe4a6269f115a1c2b82b8c35414cd2a820d19820b69e455965c648f0fc3495df63e888da924c1033bbe09868b7ce3def8aca866c1ebc8296fb37a922f9f742bfca725d674c19959953a071828fac1d21c838ca963aee8fb212d59be30c4570f1f282fa109fe2144b597007fdc462134c3967c0fdc2bf5ef1fdf648da77b4acad6d692fec7111af419e90e24ff80db89fa2805dba7821aff542568fda005fd9e7c26339339cd6dc9f8a693ad31b8ef0d051335a2f00ee48a7a708a8c3093887d9b2c27645964c9a307bd05ff8a1ac66a959ed8b6459f1873d22e6e616c30262ea1eee66145352b290d16eff8be1148aef66d98e1aa1e76f5f5772964bd77b4e619d6d1079d4ac7791b206cd28a6901581b0969cefb5942c9a54558fdb93193737d9a9747c5e1b35c5193af4ef7912065972f50b1ff8560b41e98453d87ec584cb7e0c2c33c5e746589e3db546884ff21fa2ebb5cd06853fa2a7121c50a3d8fc1e7a1a36697d0e9bbf1542675b771952fd74d19fa2e9790d7c3a34f0c28e41e5ceb9fd612011f7d6fac9b4fd63f7c8b40bf8881871f52be5faf94f56934039b8ecaa0c7aab510fe98d36c9a84e4ad4e3da6d7c88b5911c288d9c54021c022b3ee94fdf713f67d0cf85d30e53851db69f0fedffa640cf9ba685d13fe6e3baa8768698462569c1a22fcb125a9fe15072c68eea7ef1a12ea4c532fef5def27dfd761b5a7cc60a2faddec044f8112dea6a10f394bbbe4e5a57942fcd0bac69995294be55268f9498c7b3458089da9e5985b9f18e7ae956af44348e0755de7ab949f53c5432aa0ef366e070f01746df9d570f30bdbcfd7aee470519a2d8e6e406a19199888d0bd408b3877e92f64d71f9762e206ce3662370e877a21c9180b2be2112756aa9e03583ba96ccb23cc282a79d713c4c943108af16b4bd2913fa9faaf0951de683b582aa1c69462b527816dc060bdf9617132a101d830988146e148289f7e98e5ff0b48a40ed06423a86330efd1d5749ca13a558b02980e1198af71dead30402568f2a9abe6ae31d2456b9927946dfaabcc8e6f05f2c6875a9c0647ee84a25ef34d98859be4f5888b59f4f7e653bde0f2d0479c157f54e897b1bae1b41e75fe14f2996d838007b454581276c0784d8202dd0792b4f6ce928e67a4cee25d009c867bc14cba60c94812fb8f3b70635765ada95583dcb3638486467d9f75e8e4b1f352f797ea93b188d370e9466ed762ee08bf9ce8b0022fd2c5e2c0c7c5ec39add17df71f94beea32b9794e339c4bd2a8ba2c051d75382dabf43bf2d6adc82719749fc5cb10fae0dc405", "53006aac6551ac", 2, 764040020, "860078a091ceb86631fe27af994b2834a2a3ae59e5b52f2ef6d03fedd325b033"], - ["27da4dff02f423c474092a53ad9f05fdb225c95f4b02b2e64c5ce4ff85467c8b9a02cea5f9010000000600650051ab65ffffffff89f0b1b24fab59be2e13a9061a549563f1f5df69ac8ec858e57b6583db18d993030000000653ac53655165ffffffff01857dd005000000000765ac00655300abc854e59b", "6351", 1, -1820082850, "d72c2054b239833edc790cbfe1fdf3a4b48368324a71db39e962cb5e7145caca"], - ["e5302daa03355eed6a57ed68518f54743b4e84e7479b8cdf444d21c52bdd440a8dfa2dc33102000000005a65ec26bf969f0ca919a357126f6402284dc17e7a16dce7afd2029a8f65e528d745d32e02000000065153ab516a519626c525a773555c4adb42abb167f4102f2e8181941b74a8e22d3413fc80f033333f1d4e02000000020053ffffffff0264d9da000000000008ab52635252006a510b9f7300000000000853ab5151006a63ab00000000", "65655365", 0, 952444113, "db309a465426d9cb23473c3b885a239172ff64e8d416f6c606c7883f53967081"], - ["22091a4a040f67f9421bf3396162711a367b44e920660f6d7fd4235433e7c9eb10102d49790300000000ffffffff9c5f2ebf6d99e19c990c40b131539cb0e0dc191ea5574be4b29152f9dd9956e5020000000965abac526353536551e2268e94dd9d8728549059f65def0ad15bb3786a78436a59c33c4e76b838971803a042490300000004ab6a63ab237d50adcb9c05c4c9d75436b9da2bef76aef5b4cfad9fb8ad8225f8ee37860a7d684ee6000000000165ffffffff0483819d0400000000016ac5a8e301000000000452525365f5329d020000000001513922ca0400000000096563ac5165005153abc3f83f70017806f70200000000000000000000000059b79cc8a9c45921a1f2cdec0fea8cad52c2854299923a09bc265a129ddd0c475cf1832f17ec7dbf827bcd45a6264545b4abc2b2e28efa779f171a42950d4e4e5b0372fe0a12094c6dcdb5832cddc64b166e2723f354afadf4e4bab7b0bb7c7e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009921ff6a4437a2f0485d4d6d29b21cb49679b22ef35062e7981584acf47f526460062db2c3bf5f33f6e14b72063e0891177d44af25eb28df31bdb8503caa71aa2fc4f22464f597a0e5346ffadbb008554703634ded71b562a1afba8c278faee6245486d98df6a1431764e6b727b54fa9c3dbc3b3f822b1ed8c1f0589edbc88f0032e02222713dc36fe593685cabc79c4dc4e723cbe185c841eb18e349446bb22a10310f96e21b50cc4112349eadfe7facc19813b98ee7ce5d655ae7f9fc9424b31580b1e5d440461c7c62516987c6e8c1917bbc1d9f3550cae9fe5a623978b0b457fef26fe6fea20a58934eed54c1444813d58dd21d5b18c1c4c6e1040c74f7579e5fd0222842cc37625a832847f2ce69756a4c806762b51f3ed0f89d4476cef71259362031b7a39b008d8b49fc660944a77d8438f6d19a7b1498c41e55d0bdd052c7d2c90031538a519e75c1e41998127bea7df9fddbd833deaa8ce1fa5834a4379b3fa04a20327d4dbe1ad6054fe2cda467bbfd0d1f8b18ddefa183ec65a15e1c65436123d71031c9b7559a2f5fac30b05818b1d83af39b5028e9294a9508a51dbd5930f714d0698b3a7366dc53abaf027dc3b88d382feb4dfe2f6323de4959f07fc9e41d3de3c2dc7e7d6de9e48dbdaa84ce7ab6efcb542145baab41eb25e4977462042d57c29cc18f098d1a7c07637670488d8872d51d64aad1b1e99c49dc57ba389f5582157158fcb2055e4196723e33f06740a3b1956ce7d27ee6298162ba66b09175f56d34c55a4a3712a96ee49bf03bfeb7326f2ef820198e15f06d03a4d082e7231a2986fbb0b1be54a95bc789224620a819afee7faeb06a046777b66195c9e670362cff1027f42bd76e278a88df5214d8023a56a6e117f38c4b53db020b04bfe0610054d771f459afbd97e4c742175ef30e98bb358d668dad08e9fb490d1f73d9ce47c1abd0ed2b6e9565ea9dab872ac1aecb28f470d74fb18746e38dfe46bbca21be272f0a50561bbf88268ff7407015c39ae8bed3768bd335c00f6097f70f7794b6bfd2b4fa0ad8401764df686de8876d25b369aa9e3db9370321d9c264bac518288c39982860890ad1cf292d82b0bb08140c400a2626702af190ad89e55088278ae48f88b060c12523b44ed3ae699cc2c871053cee023f05dd2d2696918587f61151047b88a5baa4904fe8da00767d96cc14cc3140b43e48df1b301cc96194e91f984e0a7a51667725f295389f62e256bd8b9cdfc2e75eb66b307e30868a4eedaacc4d2464f41cf9ba5995a50d0bb8c104a9744f2fc79671ae60a79cef2f99a9b9fb012846d0e21f593a1e9cd542e0ce7573b0b8316884354d4ddd8a54420bcbf732416029dcf9c81f76ca7c1e276389082f94e72b6be5fe2f4b1f1f2f57da71b98ceedfbc043d595468f1807e193e0e4f677a40f40ace34871a6d985e67f7792d812aa538c2f199431af75393b23d7b7d5eb53785c102dee8ae029443022f3774ca24df59de4406fd8da8badc40eaf7cbeb9043503e70f9ce18b4663f0a56bbe38790c846ee3ddc2329544d21361eaeaa24a6382a04077d51ccaa48ea343403b30264b5da6dd2f722216f44b2d1476bbad6149241c290644e8c854cd418c1a7b9d7e1e5e64906c40c6289b62f58527f3b4e66c78c72078b6255918d1f0c062cec41059f813ea29751ea130cec801d811144ca5529a162f26d102349ae82b6ba4f97b6cddda768ce1e31cd9cbfb901a7cc524ebf3fe8942a39e3a063553de681bc377675fd013195d6534d5c8607a7d9a4ae2c54ff86e1d543b3975b7f77e175a27f257525e48891b0202c8db7f95373fa3e9d0402f50269171045cd71871f8dcb4fd5d7cebb5b532b98d45f390f404b148b74c40ed55e51138fdde7df6f885a477eb9cd5eb098e0197a75dae137d81c5f65c4b0881f101b1f6eeb28eea957545e667e32179ba1336a4efb020d06e6e267c29a9caf4afe109fa81e5c86eb6adf11c6871a08e7246403b3d64dc2b1f2873b03e442d17bdb52a9a0bfa7f8c1fbb88a9c376cd0ec294b331462a3c34731f264629ca6562b2cb83479d586b842bfaca422b3170e5f79000b161c4cef851518b99b14302781b9bf2a08723c23ec57dfa6de0c1371f914ee31e6bede6f23cfea530c22584b8f3bdd8c930ceb123493140a58b23e6f9feab51547eb8b144deb29f1fa6c7f9037477108c9a7648e8f2dd0b95510364fabf25aa1a66c5ae1dd593afd766d47c99045f231a56208d9c5a647a5a5bee5c4f19f11fbb9a1bd19df71b9abbce69f4c3bea6571721ac0d96f6b1227b9e533cda50cf29a1bc74c837fc2d628ac50de0b9894d19f3e1703a88a32d1f714c31c57376a3a93eb3a850e64e85a1cbafe3725c4c01a86b3497549a9337fe296af24b469c95a86ddc32bc893a7dfe3bb20a", "6a63006363ac656551", 2, -1599338667, "66234f37805164833bb1c9c108421fa6f517526702a6a16b3532f9bb20c69f6d"], - ["bb56d62f02ea104eb6d7c6f14940ce125cb4f9d45d04b277237eb25408e24f63ba58b0ff7d010000000251519e66da96e3123a6b2e57986335680414a79a8c5a75e4f5800b9eca407e87da5cbbfebba10300000001abffffffff02eedc8f0200000000086a5353536565635136aa2505000000000152000000000200000000000000002928220400000000178355900605d3edc17ddee9abec0497711de8e539d530be5e1571437fb15e7bb754d33d0ddda624802dd5f26244bcc29c59bf055e700c0a15669e76bbb6f87f80f2806a8a2236cce9adf1496646c6e4aed1971f7b4679e124aca085da8ec2e400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e89dc983cabf7b9ba160945a847aabaa4c16b31ea79ee9342fa5fedf29e202b2273f33f9790c22e54f2a83cae17185f38f50dd88b4918ca369ccf22711dfcef2c102078b995578d6ed7992cdf92f84fabe7dee8852ab07197aae85fde0f3d108254d21b7c9ee8ed40e381061dc14e561360cfc47dd190e5f8cda82701623407d0315d08ad9eea9d6a1fc3aacaeeda7e0b785677c667caebb700bb8740966c9305c03052208afb22c787e33f0064fe21a548687c1a9a710231ee85c48007526607e9a0b120cc47de72419b80707cf550f404783a3ec0cbaff61894900e58b2e750e03ae0570524a556fc497e68ef6a6361b537f4ce072b4e33839fd845e2b746616471202094053c18cc2ca995f2de812eeb039dc40674304147903d60a2641c8a4d4fb4e032e234cd7ca457ac4dd1947bf66a81c0d5fca1eb0fe08e1766600c7e2cc23c430022d99c6ca9715f87da5a73077a084cd6809f69c7de81ddf341031fa35b42f71850211d73c3c11f3aee04f8916214a02fc17ed74f7cd03887d76ea775b29f47c45ad03174287b05755f253b17d1bef7c7be9e69d5ca27c3530aaaf9dafb200a2b5af2fadf04805a7dff508c790ce84acc07b195986bc045dcaa128c16ade190bdca82fe7a21996068a28710cc259812f891ddb799403fc7a37a45a3a0f00d93352a3f5f9f6d86fe94ba6d273449f68bae828c6a11847f9f20bdf3f1efd0ce2b44e660df2386f88cdc1238970b59859e533719abc989a8826dfbdeb68231379bc74f3e98096c44eb33ce65708f44534d12684d35a8a9a68a2649f3c9d1540eebbbdc844d7c2ef750b2482810c7a1798fe5e83918de7366bd624b6c5e0603de992dbe6079326ccd0006c1a3b2a24695af025522650001ea0459ef576d7a268facb9a78bb9bed10a9ae8c48773f75406ec3ae6f97dd4f3be0d8f0934ff76702ec4b41ee5e571cae2f871129f00ced361aa7918c92f279aba43bcf0160bf7aab9c35202689eb1c7d2f55f44b11ca16901920d317669ee6af4ea1d02b688a2e7c5f518e6b6cc1c62c6a6a370d27425af5a52b04683c1c06dee2f51bfdb5605b1a76cbf3f8c0c6279cbf8f06942c05b64e4e71c063d06a02b20b736275303a4f7e27c8b589bc06d0d6fbc207b12717c345872cb1e567d550d5708df751f456e934b0c5985e023c48be9f112368072bc68716c565ec5d10608127c6da01c630620a7d8f84c4df549f6b40098992b28315faa3b8935ec84d99ab1be54e08e092398b550950568c3999e99f18d4d0a820a3650c5bafecdde7e4c32bffa30335ebd43bd6b56ffec112a86353b1efe584ad16486ffc80d836f0e2d9c0fae5b5d678afd7026a7e408c4ec82b4e5eee167cf2c1689e785502c1cd8a400c6f25431b8b645d64d25c5b7622f56781b78d3292dd787dd2133e1fdf8bad12aad36c003d5e94bc555c3951f584d8fe8fad98885ec62eb534cd604a1e95d4d5b86e238c277e8ef34bbafa443e7969f7a857a656c6af6b3e009b494dca70fb108878db455359a8daa0fe3754b1306b2672028e87f7aecc3b70f0dcaaaca538e0cbf0712d9ea5300a56703bfb4c97a4ee0eabf8da22e6158fd10ca0a1f5ad6d3f902e248862a9835bfdbd6673ff5ba62f16760d1b8287495b773c36d9f57b6b2ae13fc7ddbfc5922153649c0c972eed93fd6bf36d7b76310eeae577fee9837cd4e221886731ef42c8c76dde62650794886ee000449ac57a423ad11df3f769b19298b0a310fd0a1d7caef026c5fd2334371effbda0c92d0404961a750076bedc7f1c69251212b290d50b7608ce6b70e1bab79f405d2ab2d23b647064f72edda79214fb358bfb78c45c483590904fa42b3cf656d4edb30b4103867ea714baff58140d9cef7d04d6edcc7bb2e79afd699239b47a4bb97625ba1df948627344f603bf68602faeaf6dcd71e4a14ce9355181accd8425008bdebc586ceb8049afa917db4cf9e81830aa699a4dbdcca6387cf343bc0ecf1e4e5fdc97c051e9225679e9a05805f2d7a1218cbe1ef8e297b6eaa30e05a50074337e73f6a8fd95a86a3f7f0d1d3c7d37a6f05a9db5c49cef4c6916dcc0300687015d0b5c3db64dfdcf0a03ca2f9172c71652f1d07215ffa454bd735c80ecaf7a9c147e2692b66291e40fad2bad7b9154024d973f4a99db2ca26ffba3f63e0caafe7a7d7c7b0b921ddd441a2ea9b3119abf728ceaa690cfbc911e456bddf8424d7c183044ebb13b32d6674a58452d4694d67488e80c639fc56b2b8991efdf7d883456730890e114e840df290000000000000000bf21b30400000000208397aebb773cdd6f47f06f7de3a8544b491ebb4482fa8ca5f95d85e0256088af901da8bedb34665b469b55bfad04129562dd296a46f232c126ad9961abfd8fa4e3d408d53e8b31df006ffd3fa3051b9a10cd0baf8f58fced65cb439c7008610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036a79d38a70496b1d9501f49eb15f6727a33de328b591b8d4aeaa3cb97dfd2599fe7a25f7c32ea737d0d94d88456c0804a87da85b4ba5e4f021dd404f36cb3a956f4ec87318dc2424bfa736c2f88c9b5293a742871dc832dc21c9f7fb565b0beff403d8182fe2915e929b95d54566f96c781bacf46f5206d95f3daaf0759bb4d0228d2d04bb161b3279f16be0b1ece1b665e1c40db4a5005387105fae9b93e11df0208e50afdfd56e0240b76d7a5448baa9fd57d1d848a8da90a5862980a1e7a4bfc0a2bd818e56104b4331d8ce231c869869b4f25b13d580cf1f972ca8ebac148120b164e74c894af101c3c588c6a63b7d545e79dc692eec2fa1080527bf0e3f3f2c1031a6e955c1ff98509d40deaa6be3b29324361e1c89d0a06465ed52e4d9f24339b0221369b33b403542cfd905ca36b1cb42567080ade8ab6651d6c9404545611d4d502235776c988dc08b5f1a591ad726f1f8937d86ee822ba03a96e4dc30a09e64d31022c293fc7134c648fd5894bd4ac9a78d007e26d8f849b3166887b03821a1e1dc003052ee06c4341f7710077a2902428cc47f00438f72ada5302d6a4172d267f716fa11c97418162bdfb57c57223a6117898a4a1be946393f6f681a0fa726281c5fc35c19ea725bc51b25a84604137dd8ee14fd5df075dd129a68738b640e76f1ec5f4c3cde89b42bce3eeb752e7fef13751e80bbc1a73bf1b6c9ee062ad6c1d4a7ba0a447a660e8f40a9a108a81ec22f4448785a113823e4af66ee337e9fb42fe81b2bab1cc01d68bedde140793fa8480559a85ff68953516222c7c39cc30d450f7bcdf5b22a621326e79ae63c7c36d4a22af0b936bd91f0e93a12b501468fd7fd617009d4532770c036dfa7279983cfa82c826c923dab21d6196e7e4fff527e0ffa7b6d4c26a239819445dde789ca0e6b3151f9e6794ec2692c0c90f907f13675e3f04f916bc961d533b23aa6541e08ed80e9f60cb1a057220800b38399ca1f3435caa84dd8f9761aed53367ce900f46a46bf9e88443f40a5194f93aa6a3bec2bf28be78e9e097dd0302cdf0165d89814da288cc87a4928c8ddb3edcbc28c3f4978750b6fdffbfa09b92137c6a6738db745c9a0c8d1c2685a5e601ca65b743e75e352851349c5bfcf88e056d2f64639b4b5038facee89944b1c735859767b4ec2c580a58f8a09e0a6ac73008c672533554c153a50d153f22f81c7daa58e24f80d0e2d088232b26074f5ae26d4d68852f369980759bc5f0c42bf79583f2dd15018d27d23de5662a46a3a14a0dc761a8c5582d027781a80ae332b6a0ab81402a5828d2ccd19258f498508855574d87dbeb06ab7915dcba152d4faf04ddbe4aee1eeb0f810b7c3fd02da44eaad67e99fa5e4ddd5157386246a9220cb254b13b1cfb6f3a61dc7f543dacfcb1222bb84416a7e286d84c9f8b7d5b342bd0818ab22c48e629090eebfd12dcdf3f59565f0ea39a23baa55343245295e32312f750135ba00056429b71864b25c4b88ba4aee571dc9571c1e63b1bb033c07f6f382c9e3122428752a4af3190dd165ef109fc0e4a58a8b2a677a70138b010095fe6775103d0a072dab96bef64ec0acf9845152994c0772d48e4d65bd6525c1828b85a41850a099c06a9a8970da0709d195dff39942cdb420cd5666fa814473f2fcf3068f15362aeb0173b1cac4f9915c4ca3a6fcd5e0ed1d55c53c9a848b8d4c71fdda2a12cd8c07e1a0d0d25eb5ee1beb66472650db49c451be1790c88ccf5dcdc4b42acaf75c44c2c0c3a7ac839a3b154f95248ec010c888c8366e91c90fd60920e183b00bd5bb2b32c0a6fbc82162e2396466dd30042cc6e142b701e4e521b54ce2069ceb31bfe76741bf3c86e45a930fa52badd1145fe692843ef146adfdf8d5f05eab38e95adb6d92756eacf4faa6c66c5010267809da11ddcddbd0df9a8c470fffdfcc306b89c647267561871413dc870b3ef6e98ea5fafb36cc858cb4719264f2be0c16429bc84a684ed98d05664a2a1284001d2840eb476d05ee2792955e65f6403245f6dcfddca3858d5300291b2a77617ba3100f657173403ffb87f8be1c078dd7cbd4a91adf6aec79e8ae1f12a5f06a23cab09e73052f13edf9ff9607fc596db701c944c76ad8ee0e334a41df032656a3c89a99b25d9032d7c635f52f990f8d61e26e82181803fa5bf3f1d389d9cbdf3ce5d7d9103e4fbd428db8e6665511a86d0a18b9c7d7a243f7cfb4d8039077c8fede97e80bd1ecc710ad31a45d703460c0d8f3962852760c22069eb7135624de414db1ce1b8be830baa903644595f9cf84600ce1a7026086a66e77114c822b8e3876a05c8ee0426798a3ce91ae8e0e91f3f25928dc3d8bf39d46a15a3d69ca0c10b86d3acca2bc3a7befe68580910c1b597376d915166b363c72aedaf1ed8de96b8ef0e", "", 1, -647169879, "071b4c25ce926612c9dbeafca7339980c7a95018cc520f62a383bdadbec0d5b5"], - ["d69d0dfc03609d9ad6c5a431683984ee79090b559e24e54302448cbf1074b466e9a89866370100000005006aab6363ffffffffa130aaa56174cc506166873b3f9ff9df978953217509a87eda6b3560beb9bd4b0300000000ffffffff5f50e2b6006f6c6c583fcbb4472bc7725016bf72cf4895a5c6982f3b39afb64d0200000007ab000063006351ffffffff0407997000000000000852ac5251535365514e530e0000000000045152536a1ffaa1010000000000ff8afe040000000004526aac538c71f3b5", "51ac0053", 2, -592689762, "a09d65fb9ff0cf00ff9c6f4eb2dfdcd250ec366f53a3dc7905b593cdb169c55b"], - ["a41bfe270219d8d284924a6e3755e2b817dc467cf1b5d266a69c1a3ab132bcdfc871c7f53c03000000026351ffffffff1efa4ff0d3ad8b18813670c101df103406442998cfcc8e236540a6bb39d5e17d000000000263acffffffff04f53f9c03000000000900ac5365656552636acbd81c0500000000026aaca625ff00000000000553ac526352f781e401000000000451ab5263a8d6f70303eb5f6001000000000000000000000000ad8e0a31cdfb52abd86d1c538d2b5eea29ce80751e9879952d674fae94df2e02ff14b879cfa12659aab6f6a79debfa18fc0496b7a4134705d9cd49eddf189a78de01375a0d62bd1a328f959c5515f2886511eceda68d120ea8fc8a4ce09982cf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c274334e9ae832460455df9f05ebff403884c04ea54f361101be4b92b962e3792910eb57e2a71492a6a0a140f4294aa34f3f3ddc9e92f4c92aabed534fbbd8844bc2af896433fa54bb4a55f3c9539f10448da2d218e004a4c6642ebee10c0b44c204cbe8c5f84bb8cb7d8736694eee394a9139569d2af2e642ffcad102235f450322a6a3c4ba3be17b015f76cc14c54dba25cf9e3702a39e586d0c175847341910020b9004ccd6b2cba8cf0b01c365d4f5f34111086be790ecfe81af912ef77a21a90a012fba33cad2bbe0fd3fab1ae5fb0edafdcf1d1b3e7b41c0535a9b16f268dea12171f5b6e39a3322c6f7b8fea01f347eeaa5e3bbb00e283f9d734c85d94f2e02030abe16c10d31e656b238c1036d24b963cb6e1497fc1a5f0aecfe8c71c951b8bf021be727e2304e3cef0360fbd86846316ab732d1d2ba486dc73068180c2c6de56902272f8eb70341bfb2d4469f26ba74c901610585ca172d416d14fdf47c947fb8190218ccdf5ce88ef12ec0b6eb503d2d8193ca45e9894dd6f5292c3373bd7231e1290303ac856751e90a4b1d5a8230844c9d2a14e75a4238424bd2706dcaec1a02e21f819414b7193ba38f5c19f308263d82793d37c7fc93299a4d6d0d6357dbf71ed5df441a5d7bf7062fc0fd19e36af36684fafe321c5cb067c3c08296066034c52b1425420eeb02146b5ea51f127973883c1db4e3c290902785e74c83a9697057ab86ad18868343bd844ad3c76ffe00a8de12e6145a818e55e7795ac8cf69f5499e0c0f10fa174297f95ec273335fc9ce6f8bed1a666c0af74cf081b9b6017598a94d3c74bb33f1cd0eea1595a5b86eba5d84c857c8dcea6b052448e178221bcb71c7b11b86cef213fa3462d95f059b6844cdc812a08d08e5d997590d44cddcfc8b3fbbc5c473f1aac86bbb26c98b97807534576d8dfe0b6ac4f2e0f07577ae3ccb1361f11b855da2ff3c9ddcc64c68b838eef6f968b03a1b4ab0a4a0cf42e9c459b5ae2a39d905750456b777868e61d23a50909e8e044f6e4604f58d3c5a07459d6e5bfc1406119999dea8d5e9d14e9928e4694bc75f521b5ac9e3800aca4864d75a1ebbcbd2796452449fd12868f73fcf2c338cd0702593e24a162c67cd3aa0c4bcdc18cad3feb0524be05588125b92c415cc03a4d1ef301c09a3e09e1686b3c23492cfe2b5f85edfd60369d2924526c81ed579701a8f35916abd9fed7cc8983e38adbf5cffae2eda55517e66b9c74b3ac0cf2d1b348bec562f77da728b6b4d8d2d7855cb6ec0c8251a429cf91d13ec7cab50d74585bb5cc862f2c499ab40408e55b754e05053360899b41b6c13a26206f89ab9a364ad5d0b4f2d3c221b1ffb55399a59cc217dde7ea483cba8d723433b75a9384a400adf0793076e611ca2646cce11651882bd3b3bd9826a8e8f1e55876fa8c18264d5a4a89e62b81afad2256a0a0593c11390ffdb6f571bfa09b2e687ce1706ab32deedbd4dfb68e3101b0a023aea5a399ddb5fdd5b0a9417d546c433914e5f38ee6273862bf0b57daf0a2db0f8708664cd78ea49fa6cf2fa2d97242ea674be019b2579a79273c9ade72a5c28c50fa810e3cb74a88576f02faf89320cd4f07612229840ce2952d959388f274704c42f4025b2fde8b983a18b923bdd87fe715eda25952d75d55c9e9b523f94fd70ffb933af108a3084661dc546e4425bdaf75609dd5750cbab384b0e8881a92083098db7a6dcf703862e6c87ae5b5ec5a0214f3556f9aa8c497aa31996afc3450dd8da1c0723a5121313d6e5c0312773a72770a420de756211740250851a5ff60944e3361c96c2471c808f3dcca49420711f51f8c027aaeb38777ff2ddc3ef47a54cff32eecb8e77a496f73c5b893f109fed6291c6ac00f07cdeff35a3a577874d5c4fc0fde5bcd9b96f89c69be002f8758b7aa4fd3914ecfea9b12c72dad60c8e3c9644908cfdb28409346d4c56f52d6c176a922c4d69737d4cd2d62d037b20f9c3fb1a8ac38d97a71528acfd36d2d614a14de1af7a3143b9e06f64cc3be35fb9076efe0d45f0147af83740f23cf2a5865202c096971c4874afc59235a64901226730b82b2491474806439ed5364caf62c1704b750e236c7d63ff30a0882ca949f009bec205f57c794ec338219a34f4a03471f3eb6d2d9a74515974c4f2ee489bdce459546fca18f6ac8d2b56183297fa5363e927ac8bd9adafcccb1160c58037fd48338b84b18ceb955d8d787cf2f64d5e8a9c41d7c139849ed37f8ef36392e6093511050405fbbc281b7baba7f6be0b7ce0f8ea01000000000000000000000000f17591647ed6e64526afcc482b2db15ce47bd89884d6a342aa48774f3a7a211dff99baef9514945703c291b272a688df4615d824ef6e1624109e8cd561a3c26b35ee6bb188384d9fd221a4a335ca003fe40cd9cd56e47ebdb8b6eb2b3d9c448c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f981ffd9ebc8f7cd4e764b4de70051bd7fb90e9a9c1e32cb02b66af333a2b021871652288e4659284f12b2c5fea81b553fa801f7a19a1343872ecaee34b74460b7d0028f0c142e4081ef85aeb94118ee202348da272be9dee2eedee29e436f277abe3cd0327b92f9feb8f5f0adad2d0424f7ff9d4cd1e9b4403b57c9cfdf5609032586532c8311e5acd3e8249a07dc94c0d56a798ae10bce8f53f4671ce452220d032edeaaff99f79a874f4fb43cc1ac25641c069f4138ae4ec234e8a0cc37e4cdff0a26e019e627fb7e246e1c2291a2299717ff59d612fcb74614600275e14ff377a427159200cdfa0e4a4f91084daabb6746a5e9ac8525718e5c6b2ce5c150ae7aea032b1642126aa8f744f619e9888857e8fa4b44ae04c50927ff62577713356f1f37022ba0fd5442b9a467f9818abbe13c327aedaa4c822e36aeee62d5bc0fe87b37540219f50da6675952ffe026f962e7d00e32c9dbc2446d50a4c0f429245e0f33d0a8030b9a9f1de1c1983fe0347e6119c236af02b4b232d3c1f27cea88834e8fab1cc802156badecb098106f593303b08845291c19a8767b50a58ae7e906435870a90d04e78088b993b48099c233e06477d7783f300b3d0909cc7bca2bb38e8751d13d0505761ac149231a872c09ee9eb031aea1ec84097ea9a052cd9ab5d424e1710d032c63bcd7f8548da45aa0965c9cc434d57e500dbb490d6e3b03c954dac5642fd2ea1fedd255dcd1860a3432cd1c30de3abd43905c1cbb34f2f3e20e2ccd0a4c99f62193170c1fa465b679702ef9e990efd1c915cb8343c4bc10512e36bb952bfe16b7c9d50fb807a80ebf8d2d26b0f3167a1b817b5c50e2cbae0a9cabb20ec0d4f87a6e1f4018001995efa7a59b6be4103d79f167442cc5cd51ae3cc5136c4abbed75f466b164112adda0e7cacfde0ca46b022d74259e83086efcbce0803cbbc5c10536eea9d928d1e7c455971def284deb28e95c33a10cc06d0deb96493754d9e898d618781b3ce8f5871640331e41b9aed8fe293dd4b1e2c5ba021bc5b86d479fadd45b56efe55a02a32ab09eae4c6a857b315c9fa2bd7e966ade37f6de9a0fa0c4052b63b06a7ae7557808367276b08de0f59111eaf483900a9907a1779bbe1b19b7ca342cc882f82478d00539763fd183ad64e9c1ec057216fdfd0cb0464841e8efe3b541439a6afa691076b8d00f332489f636d0e5b4fccec64dc9b65b268789e01583409eed63ac24195e8be542536807c5df7a21aca024304b38d0c33f92517976b89b8a1024d1ce69896627ca2bacdde95d8ae3c512735cb7e2f23bb23551c85b0857816f36150154301b9b9d40c4c2b864590ea40b5274b2e1ba46e68fa7bd16ce7b79636b28cb30384f2be5992148b0e375134bba7da51879d93bd119b38b1cea4e85b68c44d22e70225843afe681328e11e0953444c436b247d3d1d01859bd1329d6c02c3345d26b09060d5d421646fafeba2ab64acfdb1fe9d025b5dcef00b6de2138a9c755b4293f3ffabd7830c8a7baf8b45c4451ea55669abc40eee520333c4c5ec49517a8c93efc5f4cea858ffafd710e10982d7d1e27045fb18009c8ca272d5a09156817b0757713e7fa15c7c981be37d790f99a8986a5b936e201e872e222e566a73683febcf885a9e16021de2275f51d4112796d0ef9c3c889f055b6fef65b8aeb472a6fc2faeb9d5e7bef6e2bc8e93259d8010413455c632118e260d7a6a5ef19f471d07a7dda950de7b09b9b330c46106040d82fd4df2bab1c5e797696e810b2836fd3ac38680aff48c9573b74d1569f063b5477e675325fa5326ba3215c39c04ec11e443d74248bde0d885e19d40d69f4d0d49445f15882a7e78202ec274c1cd03be1c644a9246b0d501bef364636591b942a60e18ebe4295c594ce85defdeaa2677368722d2cf178d95ae016cb3735ca9a9b08b186353c84c2b39b5faeac1ad4740f2bc97478253b5dcebc4cb43bc8a547ec55a6efe939d70fc248f72271e09c9aedd509533e09c6248079048d48906513b5f9353eb1b2f2115e7d30112cfa204bd1613c0a979125e7ad55f87ac7e956f38292040e2f1208106740dcbb08d9553884b5de62009794fa8e972c147893f8e88f2452dcd89fa044021c5fa286026d350d526640f2979e2b34acfb274f3e1c9414b314de07c44f67b2d119756b3f2b7ca8e7a2da1d494323ea0b39e39c049037e4bf53a6eadb188005e78dfd803212a55ad686a6eddc0ac03a9343f026d7a30b6eb2cdcd7462dd9d0bb2b6054728fd5adaf4592f48809bd573020000000000000000000000006cddc22570414d42bd93f5bb7991105efe2fd5220b5abafed1b1bcba170cdb78e48ec4a926917bc0a7cf739634ea05e9b554289df8a7f54fa32f4f46a78bbac67229559f49cfbd6cd5744ceaad52896c8d2f048a4aeef6c0c8dd7d9d930fd07b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a94c0df7b31c7ebbdb564f05c35a06f8b3f9db1c4560e4419894fec32a7a50e6f8f5071f64ca238bc7da1348059b7191eb42c1eafc878a190e1122400e36251daedf46fd2484640d933542beac084ae12f88a4ff546bc8f6e05faa34fdfc91bb5d56b138d8e4a5b45f76ea8727780285cd4539d6123e61bc4ae65a632e3737e903038fe569b6714524276800636b9066fc3ed4e09ec60d292fc6c136a25325861c031fdc31707f7828055007dadabc40cfff64a4d981077fc62303464b2c01d19bd80b2c0713a01383f32515b510f04f3fbbc1491e8d0183b43df8ed7dc05434c341b00011a1393f7ed3de4f05887dcb34274a1a81d0607428283958013d33a46bed420320f3484c91bf4851d69656503d480787d3ac9396840c65a282cb3ddef466e34c021736eb7b02d9d281ae5814c7c70e8a06fb9b0302693c2d810e670eb562c54ac9021d975dc64b65aee12f1999c5fa6e493242445cce64fe0b2327314251516465590218d45532b37819ae1ea4e17f814f670f3d0edd3a7925238408e1ba3438dfc0af030d8b9fd60d4499afcaa8562391db27735c183abb2ebe3fd48d2d5cce05784c71d8ba16546f1eefe3df6a07fb28c09876420d99d0fc478d5fe6496ecdef3c935d835ad892418393bb559e8451ed075ee9b49aab8b584c109002f3c3df89f5320d1841fff612174f4cff45484d9f30d3f0bca77bde6ddee69b54ab95d0ef44d36a8fade15b589e67fef0015db0bf592e1e12ec334848bace92528b77f6910a772c938978f474cd5b158bee7467da565d7f586e109c54b3e7e41e94a47b2067abe8f69fd3f3e6f0d139439a7fc9aa33c95c7aa6d714cd3bcc426617f6453f815d12c95fd1e550f5a538063dba7e157df66d3bd6e46afe754da57f199aa1fb44f74697288962a5ee102cf9e489b192d0d25c54f8cb8d79116217ccfe267f8aad833fadcf6f70d271a5c526ace769a71ae729e721ef28d1af32ff0dcd37c261c14963102bfb45cfa34f98fe2add25cc87426dda9ec16904b405d35cd112b7a5a155348eee24b5c099304ed3ac95c9d632fb84812376784fa8e3840b697a14887c1d3042bca53dfcc913aacaca5e8c5d65f72037ee26afc23be2d5a7c3a0c72046316ca7b03ed4e130eab252560dcb63262ecc3d7334c33d6e47265317ad439ee4a20fb4050ced16e8597b1b56cd8a07f9827ebe944e05e1eabde5142e3bdd3ab63242dba0f97499efe4cf2872e07c2f15ded84aafb50b7421229d1445c424f4f552698ec74c4210a3417d6365ab4167781c68e89c88a0613a1cd52a07948db26fb07bdbef3d307ef24a66a038405ffa5a6a36b0034b387cfd848625a3061b9de6b93fab3e472484535f8e279bb1bd7de208a98ddbae3fb63edc0e1324f9cfddf99aa62040423b5d13819c93709003ffab574407049699297824600938370f081544b72dce2f457ed8e7482bf1e1ce2b92463cd10b1a4dc746883de1c3a3a409d1637342dc851a483d77047f56c8bfd977676505887887462e5ab02c2712ce4da78eb035a29864aefa0803408d2d58270d9a2c6dc265a1cdbceb43055c558a4f567de7152a47c663f999af0e7d884dbad8bc1f030cfd4bbf92d6ef985dac714c558c6071c438fac5c73802dbfee4f48c89afb2c00cbf5a1b9347b53c83f0a67823ea55c2d707829efe30cecd9ba2690ec7253c8748c313c8bb95755e02c75c44d7a50bc53188014c88d772993997895be7ce529d338239c5b1f169e566c56ded6a9cde1f7a3190a958f7f75e232bd0b6cae551052d7f89442ce167376f32115c274c7ecc596c2d578f32a057c883d2028fc07ef8f4b4f32deb37098b57fa0e734f190b2e991f63a0af6bba5bd0b3a3786d1b2b4d9b90fdab1d7599cd2f8bee621389bca95126cd72a8de6f03c2f3727158773ecad9435d9ebee787e2a597ef4d769865066ff733794bb48d8a2c117898872f86a6bf465c6d96e5fd27e058bfdd8a68ed734105423bd6e031e123483ef7dbe935c7e3eb4e1b794a88fb543b2b76972d46629a2711836c531cc7fc8081e164e9557a6f0271719b0c0f19329a8696c78eae3582498d0b62d2ee6adcb318554bcc0d33d717ae61769c91afc08ff87273bfe3b3613f51d3d879b81b1d2d36ef85963f011a85b2e1b1ab4bacf9ece1f0fea3c449652f562684edf7661a9a52710e89f63a1d30ac3dc7b2402b942eda1e335cacc8ab824ffbc54ff57253cd6592fd06bd7a640e64532ac2640f2fab04bb443db0c510d8ef11ecf00352f3858e504f684445520774996cf7e6cf486c297b1794b939a6f0f00bcfe78666c73a63ad8b4eacae60f640076fa6796bf37ef14499a595e650e28d0c943da184b470161f35b705f04717e40d3c5031620169e0babd060da126e26ce51f9619f48643fec7cf3f611b0a", "", 0, -1265752255, "d8ebfcee483977859607fa7d14add1e107f6c096c20367d71b0fb592d6af1540"], - ["9f140bce03448d96772e345909eec99f3a9f3161c03cd2fa619c91ef40ac9636c511413ac10100000006ab6500516551ffffffff488a57b25fbbaea16326811f8e14d8418e0f6004a09999077ea1f28cc5ba9e35030000000663ac63ac0063ffffffffa0102d720c343a65e8843d8dd11e6c2b50826bfe1d49fe9d5edb168ba25c6c8403000000086a5263ac00520053ffffffff02bf9b3703000000000753ac53635353538cd5970000000000086a6a53515363515200000000", "635152656a536a53", 2, -1344830367, "bce3b3ce45ccd8a880dee59e6f866d33d79a8fc388ca8e99daa8a46e637054dc"], - ["33f9ea7b020e2c567b418a24810ce108bee0b292f14c537bdf7ba72856e598593979f7d88b010000000151ffffffff13b96ca128943827a7316b3f26d059b9010ae7a1d159d9efed30ea1b0446c2d700000000066a63ab6553631f33b84803c0ae7703000000000026c1470200000000025363fa92ec0100000000066a53530052ab00000000028f40d005000000000000000000000000b1eee09ef1f34b5fcd6dbd943301615ae0bf560bd2eafebb1da8f1d5ab3c53ee324c75b238a14e86431d7b270c967556f010365ca4610dfa753ecdbae5eac2ba3a9caddf07d04284030f6651c850548ad5c05ad50d9e8636d8e1d47c4fc56116000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001189da5d85208e01f783318ed7f48effff37ec6828cc36f80f3b6f7dd66c8fa2413cd09ac5ad7a391d3a7b4f592fe01b69a362f3cf64d5b97925fc4103cc9654af57dac917ec3ee501572e3793156455835ba542b909b6c73cd7e56f6460d0363a622fc37133b1e6494a14001d0945227e2ebbe88ed307ca29e1bb22c602924802057efe94b8bb4056aa4e8fd0577209a94e5c02c82b256b52d97056406f45a4eb031a2312463dc4ac4614e8bd0af0e6f6a5573ed09f3d875bda8c5f6270eb4e48bd0a20da829c7f0b7a5b7ce90c0077878a7e7466ed616003c29fd4422f46e84be37f13d3911f5b6d1071af1bf20f931c2a40f31c3f2a03288a40f8bcb568e247b657030fa64fd40b9dd5502f0615550417ab20c018220a8d6b8018f55ad7e9df9320200229ac369c64dcd544bed6871ca00b66a0d5f7c0348fe69e257c330a20e59185c5022b95dc61566d3ce88578cc18c1c5e86553eef03e04326ca485bdffb99c03b2810317777c9770c2a0d3cb17734a60cb27c7343adde9c4773b62d22897ae565007b3022c193fd07bac542b5de75d8b1d7dbaa60f56c5a26a90a4f7f7b524c882f83c2341ebe6bf9d340c2506a42e0e82a86416926464f39538127e66c05d806917dd33bd76e1204926beb4aed50d691bdf7e9e3aa4a485484fbffb5f98cddcbf06ae622bfc8bfd9a62352ac140e7f94b7a7b4f887ecfe0d1b4422d4aeba27df0b9279bd892ac87dd4f8ff3bf4d104c8aed8188491e710a6224690540df228cc562ddea9672768c3afb3bb32e7c862aefd0c3b436868cb38f0d4e3ee325962b55e2720d48f64d4f88f11d3c93369e17412f2591eec1140c7574a7363f4e1e90ef668b642c7a660086b90bf19b58cdb964fad1023cff1dec454597f5dee0f74cd1d605ee09a116e183ab3b2aad331f5425500de827fbd8bf446668723f1a827c59091c05fcde09411a80d461b03c7d67fca668da0644cbc1e7d3c6a035108d8124a3049e3b6ade44e7a7b12475fe3f672fa219d05a7829caaa9cde92f3f67e70e8103981901bfe05ad4b187bea3533a420b83ffe670146999e760c82e2826b5a6b9a8c9e2a01d78f639dfa3a795fe875661ac949fdf7ed3de7aa4e2c31ffeb0226bf0b047fd20dc35b215c072519842024f1e02064cdfc6c8f1e98e259c4ad12fb5bd9d8f257d0604962d32d427f4a9bfb30e21181cf293c1be132ff77ae09335066f541cbc8471b019500105ddc05cfdc6db2b7c6e214ec58754fba19e367fd2da81efb3ef699bb4ce86d15ccdd81bb5c162658dcf1e1f895da21cf80b57eb0ad3a815ce4322e78493f3960c9a0b0a7f7bb5a3e5604d9db4b453a625d8d523a36ab0abf617f39b329dca32d2b0d5f3b1a6081d0064c268f6987429076a8a1745fae306be00c01c3eccb3ae32265d450cbc79df85154a7793f611c86b895df82715d23a6b30bf98ae676ef7f8fb069549936c1e985ef4a0288dc81cd5df0d7df4f0102a60315061f4d6e56435b6ea309b6d75d6a5d3a9d9b05b4799428e123b3f61363d86bc322fadc006b10eeaaca647b75d4738a2351c93acecd205c5aefa0dfc64c8ddcd277eb02cb1a86b0479f68545e07010c2d3958494a830d3ce7c04d05946664b01db1a3e0d430e6c118d18461f0fcfcee35912d1f23e983c4bbdd2ed6d0b4dec98b148798fa60f20b93f1165e1eaa9fe12639d0657eeed4d43e34fb0565d9690d400b63ed589dd91ff3bb7ab0eeec87c03362071f85d89e6ec5a7014c17ce38f111f4410fe41c88645180f7feb8f94caf71a68b3a636dbe8078d8f2c6e33d9594d2609019b9039caffbeb758e406dee3c2e7877402fb160bc033c91652eeb62b2b8273148eb430e6b299f3ef82e425a7171ae2070d6fce5e0a68d9d05ed72bcfc650c39058b66ad7d18a394c1b2aed2ddcb476e2135afd07e9cc65d554c67c770fff39c9701f160adbfa8b6bccb7d4d7ac73b0f7dfa4b02cd0954ea437386666ce058e8973c7f1be80cfa5b49d7b0e4ea811e98595446f30777d3485e5630e264c34e8c399836a10d9f86829c398818ea95efd81627508cbbbede8a981dd9a0a03664322a79a1bff94cff88b0158bf668753039f6430dcbe9fce0ac63c355824c12c288e8882e38db04e65fa27ba4f0f7e95a5f75cc13b8821bcf74f2ffbeddd9fd92d1f6b9907c1498c4291ce75f749e578a39a593954a54e3ef7d3d7a4130c1710cd3edfd659b494cceaf5ee55c4b5b222b77d48bbaa3c3f627af79e259df367e88d27ee18587cbec910261b1558375070fb23805000000000000000000000000f24ecccf22f13cdf535b9d731d933dda5696c78cc419049035808a322a0d3e333d5868ddfe2cb2b2fdc0c7875289e0ae8fb1bebed3889021aab4eebc7867b0a6eb33fe68902694f52fbcd0b866a1b7c64fe95934d60a683db9afb62e5f5ece940000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090d99a95847ee6e8ec09b8e364d280887044ce7f2d1cd126cdac73408fe096b63f3364e1accffbbb348806bafa3303287a599f79359b7035969921b1c1e44dbaaf7d4201578c10a40080d8c2555f143ce7f0afad71ba0b89afc8e631caed11f15216c1744ea04ae4d618184d5ac7a53557ca04614d5475be8e4b18fe2f4b41560326c55fa4e4ed3e59f7509634c60406c2958d66e5955a42b00adc7eba8c2f8ddd03135f3129931b0dd67dea85c08288248662fe54bf773e42fd75b432059404fa730b19d11003e877bc42ce2d643acd7340a31069b5264d56a6d1c7f0b8a9178b69671e9a32d3a830765cf3cd1d2037a4117e97372d37cd7c53a70cf1ea11c4a9e4730304e15b54c04095188c7198f35f3f11c5680a11fd7f395ef4770c1da023e0e6a702087a15b5a790308b516757c42c81f69eca511fe94276066ce967d3e8e1da9085021d50b2263f5918dcb6602b6017c35d5f254db5fdd392cb9ec93705e2c28ad62c02050c044a84c40e08c527e3fcaa5d64d9ddc8d06f596c7088881f11ebd98ac793030baa611f4fa4565ccfaa95972e64efd426ae8701fbca8687edaa65ec2fbc5d53ca4c2e6ee100567f8e3d9717d22a55ef4cedb7ec926517bff976afc8587a5ae2590442b8efc0b05dc137c671a36c08b433c17f058845deab6803676427146b170c0c6c517f22e07cf5a9a5939a1e52ffc262b7254f9749c12ed95483d09d8edecdc17ff4630462e3c8d55c9e5b6bfba0683c4047c3a05a799f3ee95afcf5d4db8e1bff32210ce1bfd4b8a0aeb976c519a34cb3c3531dccec687c94e33547b1f332035f81b2e43ae387bdb84dba076b5e5790076f8d461d909762ef91411df0835fa95007a240cc5d95181be253f99d093c7a99512c475bbfab680e21d81e4bb51e98be56c7174d7fc943a78dc46c6d058a366c6c0d5e4b9625810f58ff6a42fc4bc7fc08dbb01daf0d42ed0578316f3a9f013d0afcdd25f9f386511d727b102121780c697b61b7903708b2a60e102e8d4e8a57ae009184a01565b949f7f5bdc78c3b1f8173e6a631050d1eeed2a2b0a4eb7106524f730f02594fc8c1faf6adaae736585dbd9e478e845fb5f7f349c3ed183fa9ebac8005dc5cfb9fc3593b4f0f40f99021af5f09b6dab4555c693d4d2070cd44abd126453564459fda82394cb37792e83cb72f7d41cb4a69c525169a822a6f141f17152c532a022ce7201c5223c8c274ef6b26aa92148043985b72f36516e70ac484d119a79eaa4c71572b18be1fe5bb221089231dd088cd6009ba39c0c6f4af1a7e0dc64c15e9bd31fb62b80aa5aee76c89f7f70f688f6280ea79d3e8d58394336c69a60be61d69c0ff41d4fd43d52dd063b5510e78ea88612a6bc7add98f17537075705b1b80043239454f0caeeb6a14604bcdfe07b42d6e3eae55f721d05a9b7c3e67ed769f1da2fc5ee3a625b3dc031371e774046b2887db60fd8a0ac7722633ca31db65044296fe043065f4c73b29f646ce0573321554d5b299b102766ebceab0c0346fc6624f58b146ed68c33695922f6e034be155f6dd242bde508538be5c48a868435354cb185016a39195873dbfb929741b58253ef99d9f0e21f9808b704d2669a5692d78319d846c449612b3b549e2dc4803510ec3f9f587231b12b27a7dc7d93957d1a31c5b74eb120dadddfc6ce99bb7b969a31abc46bd14f79d320482a28280d80fd8048d956f62c1768b46880382da01ca817c19ea065c3fa0a81762cd097d4aafb4933eb9f8f40af98cb2a8b47721d404df4bc6826e5d60b59b3c04f9f79a2f5630fa58192ae9190524683f0181ea62c5c427669b6253dc004932dd6151e541ce9bb75b6f4bf627d38698bb54f8a97d7c2ea0ec3c50da44d20b3cd69faaaea837be624359444c451b2e7bd0314080b5e46d9ed2715b21beb5261cf30c4fc7e190cd0c2a278467c7b9075f5e5eecc89f5d856c33880869a6ac0b6e886fc593deae8cdaea27231c18be495d9a68bc94fc555bf2351bc83a55465364157b0febab684697a4ad6486870ce3fc4fd124bdc5e296ca5159434dbe9c4a8712ccbfbea00fef7d6a7a5d19c75c85700255a5f825743ff7b0cee3318f49508a00793cd283e7c4d32292af7197ea9a68df9480e73639fddcc73028572f6066ab19f09b8eb6714d1a90d3b1758c621a8676779bfc9524b3550d6300a31b712aa499abadc1d80d307310dc98380eacfff411186f2cc720f8cdccbe549d66f6e8a5e91d6f4e2db651ce23110e0329ff535c1d966238482c08e572b25a87a0eea4d057e55cf242c271194edede702987989b0737e48e361d486c9778bab3576995a3e0860315e4e7c076838e832bc3cc8345cff604cf0ffcb35549cfe1ca58353f6d831325680222aa75ef5a355fdd7e5de497b3dd4c50159822ca1c1b2f06", "5363ac00", 0, 1424092484, "63b3814cefd137f46e4b8abf6c24b2d3abb5a84dbc3271b440322b0333c9ba09"], - ["48ca084802a658d2daccf3d6caee4d633701d55081437e6fb709006651a5e655290275baad0100000008636a51ab536a63533099690a6cde0504b4869ee2776d8f2852ecd0ccd7ec6c05e30ee27368b9675db019cc1e02000000046a6a6500447b7eaa03f9ae0f02000000000652acac6aac510fcade010000000007ab6a6500ac53632f09800100000000086aab6a6a6a65acabbe3edc0f012bdf18010000000000000000000000005ff5e0ea6d60c5954131c208f5843422f572a9b0703de46085deac6a4b46c6b39998ac205341fb132623cb235ecd65d1a6410892dd344885b887730c23f7fd22d91f4f132664695e46b3dc2d572bd46964d5c1b1521b391f35fc51ecbba7bef500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000420aa526dc1d06fa221fe7b0c620cddc61f7d47d5e6e8378fbcd021d97c405d81ba11b92951c69289a301f8f133d3cd476c98407d9a2c989963c6b3d1446dd38af6c0ab43ee1dd1e190f4f379c528bea0aa9a90c1c632899cb58e9c0bf3069a695bf06c0704448229b90b05c52de4d33038fd7446fe992efd7c1677d202878b903291ecbec745c5a0b7f786d9ed41bc54e073bab6ab3e712bc752df89c6c1921550302e8d1d85ee2f7b9513e4f83313d933add4c49ea49d9d3ced946b91340a849a60b1e972b6ba2eebbd7cea5ef7dead72c2b52e19eed469b5a47176d5d3c757c5e900de34b979d323d19c96949f91a2eccc60e43debd106d4f6b2f21248fd40752b9022b715002aa340c22feab4404aef2e10cf70f0bb9456c27aa17cf25dc0b57c984021a3c27a747c0ddd3f6c7a941b38ecce529afd3f34708821e70e90151bd253b51030efc9abaec7c27deab60d7ced4968e1d6226753c7d181e71f9aa330fe434f51b022626647eb3c7c47bebeaae12f6c5978830802081ee85206d92ec88112d362ecb020ba6ce43a175e7ee6a550cf3962da5d608d93abd860fc86df663efc83d46f126dd1b7e51ea3e7feed6b5509eb28dd2662209548f1ae85112bb634fdd0e0e7cf5c59abcad46c71153b331d9c07e469fff976c44e97948439479821678b796ffb47b965f6ca4e1c99802f256da71d1fbbf0f902f76b1db29db556ed2317593391e6c02466f49d9f814fb268e8f0acd01d7c9c63005fe7260682d042b23b16f884691261aa500d665cc9ce7f886067b53a394e6aecb47db718c5de535f360bd644cef2bf4a818e7d43afb3a419a79ee633969d2368f7aa3a7dacbbd4dea866e6760195dff5efc1330dc66f1c15f0167bc44268c535bb72603dba90270f130ce96dd8244beadb77ad649e23ca80826745a076116a836b3112c7e6260eda935bfca6677a7310093c3aad6f9631d9cffc9c9a94deb7db33aa00f92ffe034e2650b4e1e18db19250af4155f0fafb392903143070ac174cb72ee22e22f1064539137a8cdba81ff6307b4439f37a5e3368bda46eb666bcf0930f231bd8803036459a461e70d5b4726f720d1851baed72567d8a256b9715cfea8cf0598eb0f968cf98fd254cbbbba84f187f51b404e3b7697bb91282398541d92315950a62dd43104d3560bc8aeb13f6fc96e6ab8971bef9019c07121211c8592551b12cb2e7b63fd77181a377f0a304fd0e716094c8fdbe245b3e597358f6544db02ce0560a32a541d6f20565f2c13458241c9c95a503d13f18203bbc66224947ee608778dec0491859d3ba74099b1ef35656f23382865a12b25070251ee8b08936680894646a52b86d3702eef867ad3f5b083cfdfcbcb02c98fd58c6fc33291a957df1c9a7bdf93ad4584ee6f88c4bdfd382d59852ccf911ed2822570ce801142448d732c92156a309a448227962f63145dc6b53dceebc56a0b5d47df8908d88ad59e11015e3bfe0c0e4e1bd71ac893e22904415b55e5b427ffa09316c55077cc940c8c1f98825de8912f2e89dbd44704e2353eda79b42765bae0ae6cad8182e214710b05b089ca8e2b1629c06d1864353cc6d5923bb54e798d7959175d011eb083f28e94298d02df3765fa2940e803c7e16989ad76b98c66b9a587893ec310eb9cc1180527218c90c1b10e14c4da2f462e29d24f6c55c16a8f632dab4a6049bf0f52fb5c10079be1ea825675d5af1753bb2620f336f25188fc5ee737abbc91223ce9a80cb187664b132f05d27e3b13a123c4179fb42e297fddadb0d26199bb104f2ef3887d0cd6b6c82ecd52435384de5ad5df1d920d840ff626eee8907fe0af3b94c428eee80e9d65f831a25cfedcd8d1ed4c3594e91ee4f1e55c6cbbdba6fc68b22b01ca767c26f3f873baadb7af372907b05d8fba6a0657223682b2bdf929ad58f117645c6620927a75e0b69b070ba44a3a5cc9b9a4d0fcccf497e6a43801ce48c746fefabb4fd86e68a6e8afd0ea58e376a37d3931503e7e51042028ddf81654c10b3db03af110db71381b06871cbcba75b953a24b29227337a2df0fcc11ba20854cbeb4f8889a63b471ce67e024c36d5b1e3b07a689db2f89db5b50b8d2db3782e44bca6d5b85392d7d56b1f69a64b562ee996f66c7308bf06397954f3405210412658626a370e56f2a82ab93cdc0938703dc9866649afb6a5d925b909c00e1c2512649f1f6efc39edebb4eb7692446e14ae4e170e62810fa2b5f2d5201624a13c9c12c3279a83e8dbe2acabb64fefb2d0b350b31400e383e0458f0aa9729e066678f80c5dddc938c79dbc51da937a374b528dc40e6045d2d4e20f002e0e59c924f12a9d86f0a7e5beded9fe2cde5e72dbc7cfbabfd335ea7e64535ebfcd77b0a84783088d3dedebde9fdb4ebe65eba02bc98ceb460c3bb8c06", "006a5165acac", 1, 770613875, "c21a0e5d14b6f8b8b43729fec5536be7865efc4e6c0abcd9e1c64ac134c100b8"], - ["5bcf30040182592723a0b22b11a5313dca10084003513b5fefe8431b5cc32d66be0f1ddbc40300000000ffffffff048d532d01000000000165e485b10100000000025151cf55e1040000000007006a525365acac02fe0503000000000952ac655151656a5251000000000100000000000000007c9a6b01000000004bbdf4f70c8cf49105770af47f51236d4f6e0aa56a29cda699ec21c5d8a733b97f1b4e9ae8b59ff79473f7695b937af3f7f49879705262b435f00e30f672640b813d7885d29803a766965eedf4586b94df6ddcc6bea1a5d8716ee16b1f225afa0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076e6a1f2fac13ff58821130a2d8ea11ec8736736a73e907fd6b967cd703029aa21fb1d6ad81ec4623eef32db298a62c96173a7823bc881279ce0e0953f9e48354e947df105f8cf2a048fc39bd59f04130e660d61f359ac4560ec67ec74cbf9d07ddd0e9200faa05d5beb858aa9298c02ce4a053f77edac67323e9a259d2ca7ea0310dd30be4a5f0e439f765da14f746cf34f601e528d2af482571408757df60b49031c1a42025738f7edd0a8a02640fe79070212f8ef1b70950bf6776be2b8f029ef0a041e0cacc92ec7ccfc400f633cd2daaaaffd8c276452cb70514243567536cf4806f340a9d300d72d0483fd717035c17c1a6c7f8186fa4329240cc65220db51d3022d4cbc16d92683552982c84a9047231f542c447f521cb42912d4cd7a4778f8de02057ecd4211eb0948e53665d061ac24266081b130733dfc241613de03f2d4fec003302c25a125067759acb4b78b590f47f3ecf97d4f5d21af4809dbb5ebc697ed5102004ad88c6a096c57ee39fee9c60e70d8501ff2e1335ce76d6839f336de3ecf95021dcce6d640d444019aed6903dbe9cbca74c6faf8b34b90fa10d6a5657d299b55eb585dc02773e65a987608e6d43db37c6f36d6513b48a5bbed3da556fc13ec3a3cf59184153d1c1e091680634d14f36372e51101297e42ea276d4655dc55c27b21a902402fb9f4ba29821784e4ce1c48ecfb96b6902e9d32319169491f00549a343192cfc5e14896ebc452586a1b9e4ba2655159645fe1b46ebb58deee63e572b3e1615a0d018546863bfbbccec4506c2e493c7cdfa343b2f40e6230173ece0a39f1748d5457a9894ce47d38fa2a74c44b638bbde8ff2cb615d0b4b99742e41177354c9e371c00a2e4daf3db82ef8b8cf266c0a96dc8a22770396bc42a9978fe12c17ffddba74f139abce04892e8ba444f1123f57b222f77eae6635495318c038fc97ec16096932f376c3fe60e883a95c8c270051834f29f27eacae06e1c50c589529c4166616350df063f3680c3c3abd6a631bdfa6b79d9868353579ca1b300f521ed1539a7a6709bcc36d28ef1b6268cce85f394bacdbad157ead6155ed79239c43a456aa6274b1cb07626a7a44183c62de03f500f5eaee45c5259af8bb2e15f8854eff6310f835c9e7efabcf1ea98496fa0d4a9f46aa5911c92785bde40a525fe8a884dc875f7738959de5f70d5e5ff6531552f9f3cdc94303f4c1659b361ac65bb1e4f9d65d7166c3e407fe587fe3da4110307bc2c77d37e7d438a4f560738280f8b23aebb4fbd624c04dc8f7a3c82830ab788085734ec0c233fa2a5f4f4b187d906a2ad00c2eff498fc5cf1aa4841b9f528fa40add0544cc11dcbca70e746ab7166974f49ba8f1388219591efdd13afc55a9d16d3e6216985d903a47fc97e1b92738d090ec7e0eceb419d4897b88c2054eeffc1da2971f7013fdf6a0bba6ddf0f8fedbe017030769769a08426dc6ae7abd749be15b4885a1d92372544989b7f272df25fbad7dd1cd5ea4d457d455bc0fb9fb8f89d6f91e065ea601cc7ebf331aa16086a2b4a3984dc1284c664b99181914efc6bcff6bc283718c6184a83c39b39d0bdec510a89aa1a5f865b5831b2b74dc2ca98b19f7b6d0d306db27fdbcbf28c2df3fea3477eeefa35e48d612266476a2383df6a68654c217de0d5892e7956176b790bd630a6f5ab3bebd2340c1ecad515bc6d3ad6d1745eea3bf90d666533abec3786d25ba7983b7d8f2d474cf723f18a1a25eb8a4c02a52168f3fbaa076466424db70c96e7628e8ff29022eebb20abadac90058547b447c6a4e8a33d65825b32090e082987b0dcd5c16177c9e2c763961849646787329fffdd3243577607053e5a3e0dc7b6cb9161ba0c5da57c695a833e40e897123b31ac0d8325bd4bdf3d96d2cb4380df757a9a6fa25a75795d2809c7b80004947295fb7dbd72b0a72400a196c88b52b8823f90a44b2415f1564d57444f8be42a1c5931163fbefec13948c23805118679bc45fd63eaffb311af8b641131b23f0602c5e325e284a08eeb05d376a70f83347bed8e9075a1a2877fc79287548263f7210d54a2b1b862d05dd3a4fcd2870ec928a4ee7fb7cadeae9641c2419cb85acf25043b9fa606df1d117433b24af4c33452a0b62dd26163cad735bca59c08ac6657489fa2bce5d7bcf0198d92a9bf89ce0ad3070310862c4ea8897f338b64e64af5a395adddcdf8e0623e614eeb15a598eb900fbd0c2f9cb20119c9a00ce202ad1078da1140b7d748db41fe9d81f19a5cadc33a6e94c4b01906320c5ff4ae9127f1c3c4fa8f25f09d0dc984ccb799b5116c5c1c595bf5bb4f6a903dc11f294c84f17820b864401a6feea7d270624f3be56f99b09c13bdc954d73e3c31d3bb9aa34ede85e39e194c200316536a77a73be8dac6de57f545bcce07", "00526a53", 0, -482347469, "669ca79029e7deac8f95a9be4f6215f24bd6c2f7cf8a33ac79ce6c3ec17c4a97"], - ["0bd041e00167489f05eab1b162744dd9cbadd3aebb69edeeb681d2424545eff65570c7c93e0100000003006552ffffffff032dd6ed05000000000665ac510053655d39f201000000000652ac00516a528ce57e00000000000365ac63d6218d9c", "52", 0, -1066246780, "ce44ec3d4d348e14b590089dc3b59a5218eb38f41d2e62c01eea8efacc04d2ff"], - ["aea8936604d099dd3f1ff1487d483f3f067a6772b9bfb5bf2b8a2cf3eb2b239c7136a879f40300000003ac5252ffffffff78e901714f5170212a63e9f0f7efb1798de27e54ed969f45db50e908396a1fa10000000007535363abac5163ffffffff109afe24d72fb93755b348c4f77f54fcae10a07c7091cd36fe6d612cbb3b6c2000000000096aac6351636aab006affffffff5075e32429529c3c55d270db54b8b163888dd8e85ff1b8fc2be72509cb0a93f700000000085252520052530053ffffffff0150e4bd0400000000046363acac0000000000", "6aac656365", 2, -1387400805, "91813e2c848414544928217c8be73e27c0d42d6192798c3e0d2a5e1b7968a63a"], - ["19f2bbef03f2ab5c7e28422803875cbab9ee655507c2ad8b7d4cd8b280ac3514283580529802000000025363ffffffffe027a011de891b5aeac344c9e68b6f71a9bd88fc909d4287ead5a3b0648c1a6e01000000056aac635363ffffffff58023fff53d0ec6f7ea899729e1dd2b62c63fe4bac3d6c9b412c6bde950dd09c02000000086551acac536a5163ffffffff02f4acab050000000003525263c4bbb30300000000026aab5cb815ef", "65ac", 1, 1526047431, "048d68308af49c268368b46dd7ad4d2d6c0311ff1c107f5f0ffdb3ab9c5d35cf"], - ["8b4322f901c4f6f29753820f490c636321d29d049987a2412b1786e1dd0dbb9aa78a4cd2ab01000000016a2739a0a101085cab000000000003ac5165bf020baa", "6a536300", 0, -1345134368, "4848e0e38f42840750c72fca1ba97dfd5e301f0f9f04f653f66f1f9e9b7d9a24"], - ["7264c4a701194604c8a93d624e5953c74360fffc603e9aadd8fdfdd3ab75b6079238242e4c00000000095152656a6a00536a00ffffffff03f3877302000000000069a67b04000000000200acdefb85050000000001ac4cfb3d2b", "", 0, -199685283, "e8161ba858734ce7394e9afd05549c90d2e59cb08cf145bc801082e9995fa399"], - ["8911ed3101d5e27ffcc62f3db72763f4ea54a93fed1585d849a678748728e91b746b30a95a010000000253537d3147a1042ddeaf050000000001513df9cb040000000000d8f74603000000000865ac0051ac5300ab4af6760400000000026a510000000000", "65656500630051", 0, -1133301726, "3a5f1c2ed723960f2fcd13eabe5e7392b606e173cee1efef14148cd4acecd53f"], - ["3810b839011792b445c3935ce7bb67bd5a1c28a3b790e37e65145d4bbedf43f61fa7d71560030000000151ffffffff01b8baa603000000000200000000000000", "526553", 0, 668764128, "ab1caa94a84dc308ba8d0faa648a076124ec43e220cac3d3c23c6c177958ee70"], - ["0c9f11fc01557aa1e2e99a288a48549a3035155ff8496a20e045f931080a0c3d0f47bb366002000000016affffffff04b4803e0000000000046a53536a5a066f010000000009530065515263ab53ac1e0906050000000003656a65c6767a0300000000066363acab6a5100000000", "63636a", 0, -2134010377, "200ddaace44f4fdc9a32e0634a705bea0257b163b4a05016daedbc5fb17e2bf8"], - ["fccf5ba403627d953e3e4be7df40e0499f745b49875cecb555e259d4c0322e00f179e9101f0300000004ac0065ac93d53ecacf000bc9f4d7e19f867132eb0c58116666d188f4e7d1e6612dc2a196e681d5910100000007535163ab52006a3112e9ba343a1125f9ba567b194cca4bdce1affd47f338864cef7835a03159a5a8d69a8900000000096a00006a5163516a53ffffffff033412bd01000000000765ac65ab51656324ff7f0200000000096352536300ac53ac00cf176003000000000951acab5251536a65ab88c29831", "526a53", 2, -652258674, "8e78eb139f648a5df15c0fa08bf8ac0dcb43a2332df16bef796a631a44edae8f"], - ["771f435301ce5675eada8e629334a608eec0ef48f5fc92715627ebac3cc5840f398ad6baf70100000000ffffffff02e34fc7000000000003abac5113b1f40300000000090052ab6aac6a5152650000000002845cd105000000000000000000000000aaa975961c5addb05d28d7bbd6e615ce542698066c79f901ee2b994649bf3c7cd75e8ad34a166d254f4acbac26284cd18e673ece9f7a38ac00cc04a091307e84d00b96df1b8068dc1b85661af7bd3156aa197032a973ff7ce823823be564140200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000726ab0d869a52761c97b6bc646e3523b112331f1cf8575e9a254b958a741a7284fd2edf154311f382d1b6903bf475b1fbb46def192eec4c7674b433b757bb0e6a19aa2a89ff65ddbe748ab77636040a4eb776640a2b967efaf0f450d48c97b2c253d961d7e673a3ca0edde5b9a22be36d8de9c886cb863bb7009dc1940606740022061511c0c217e1e20f138db61bc3fae18e199a9c572f1425a488314215f01b0030ca7096f8a4a1d099e695f370693a56064ce5b02d7c319f73261d1c927c6ef760b08df6fb362d72c104cd1c83562025ed04b3e749e85be343d218bf74ddba6924102bb50bef83d94234165a61062dc62727dd2050662acaca61f75012d1721a3a9022d3be4daeda2802f0c002448aaeb77ea66da724bab52e30aeb8d5df0f01967c90316629f84097d2e17b8669a9643b895d7fd1d0224b77c6399efd58e7bd4f27aca03239e6d94238a9506a8e80c31c17155cff12509fdbc6e8b9c9ae83f2c7a192db603122557d246ecc7088ac670a1cb8baa25735c7bb897e40e894dc8c54fa5f1ece2022516bc362090a7f133af6848390ae16eba8efaf459798fd19538d563c69425ad3d9e817e792ecdffebf51edce9cd798a14545b2c5f873db9e00394c32117fbf021f5820e5330053ae0e64b2ded393b28fe37838c6dd8391852535f7a2381cd0d336ce0e4f4ddc20e8534fdcbe68ca217cf778e868a93b73f0e76747ef32f85383f8371b46498c96195b178767e1b0150a6bb0d12faa7a7eef4450a12194eb241a6d2831569c03b5239cb45ff2ac9ddbd1355b34223f532f68e08bdb9e0a20bec4281a5767190afe9a99d383c067b09bbbc304047544bca59a000db302c0168cf8a132ebdc2be5cb19327cf03950937e1d8018d7d8197298c28d1e0dac3c51fe1b8312ada6e8e061b7c9b982cfb56831a8697215cb5fad60043e61f8e70f108e26f7ddd98a5b774722d5cb1e44f5eae61dbd2e0e7f7adb1410fd571e0acd5ae2845ab32329aad001d70e347c7e9e0b7d35ed69d68218f2238f7118180da1dd084a174eea1c79ae952c444df23afba5fd5b80736495478dec34d8bc1528c7c9b72c832e15087c3af21c966c462aaec3cac6f7d032354f2703b9a81955645ec07ac59911c06598fc50000da343fe13a3274c47efc898884e965b92f1b79852ac44326dc80c87b46a88b36db5babb4f2c70f9e623245c2f17f0a318f271b9c1e85200234de30d310bfb24962a420a9bc712efeadf429f1d87a2bae4ab09f3df0e728ba5666c6bccfbf999a92a31c290141b094fa6a5fce50786e93a1116dba4e3777116e0b03826153e7797121cd6aa1329b22e1a0b6a1ec1a5e975aee97132090bb337bb40b53ecef63a6719147815c0cc09cb2f3a976e257617fc86f00829ea270b8800ddcb7db97e6b03958e34f5b460b0ac75be7c120779301fcca94a358b94f9dd28cf42ce00083d6c4295ef25fa537cde8b4fc66b48dfd89fdd20d21c065b28ef074ce13bd15db8cc82aef07e71cf0236e7e4e97a0ae9f0d2115a523c5c704b30e2e18b2185dda5a9837423fab18d75dff2d53c4c9ba63fad61b908eef1d1cefffe162117ea5e015b3409ac5a9ff25508932068c451bb66a2e62957dd399e5dcd128ec3ee815cce203cfdb031944c1180cd89ec2ba475129312d83c8c6d4d71059fd55248fd78e15be85900a1dad0d98a7f02ee38dd6f23475de6792785d190cfb9a59ffae6e4556b3a3dc69a34ae004f74150a9d1e209a614a7299ef3a7d4c1750277ce366dc934c4b921adaabd894137d7d26ad1f83711af0fc454d3f469d2aac999206e7d13bb76a6ed63e3677359bbcd78c92ad24d165be0a74ec71450423614f26499ffbcd410db308182b3f96e6c44b60fba26e18ce938ddbdaab31f724e03db1ae764fecd5fd9f1302c36404007bda1c4a9b363438e1d117a0272916d9529203659e15fb22997223c5ae4e774ceaa5b2b92db7d110a32c68fac88cad74753926a6035077a71b09fee9758f7de000f9836180307ab66907f72ef233e3345dc8ace97b549597b7ebac09f947f8cde34502591500438d1e60588d977b0712f11fb5c8db15ce6c3def67f8b4c264db08c717291ba3d867d08e7ee6ec40559436383e20ac833ac0c60741bd0a6fb95204db7d3200cbb655e96f865c8b6018c7d9fb3cb5f15d2a2137857a0ef3f57b9138c6d0c9e8ac8173d6f73e430841d6223424929ff787f0e1ab5080dd8a88a36aaaba5d81433b27c2a3881a7984e52ddb85bc4f6ba5a7e96c4be3531818745dac200000000000000000db03f03000000006df559d336634c0ae7e27324b9090778d28a4a5e5489230c7564be2a9d4a2ffda8c12f64e3228e79d718b7d98fcf986488b1591509f315c10aeed0a0be502ef5afb54f83b9cbcc5390874b3c3714e147750651fc04f26cb09642b33015d4ac9900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b4ee940a9ee50535115bb897c99a3666cc69788c600241f6637058161828d4b56a6f405d865371b5c01e81a8bfa87ba5384eef19b1264db79e6553959c4fec0140d1da4eb7b5d219915b45e0f439eac709254dc84de63bcb02c51fe6a20fd6212ba1f855297cdbcfaeaf7e2c4dd3dfdaf01cd108e212e659bec27a825f1479a4020cb21693184a0e7aca448f39f4cab95895eced0f2669a23f14cd3fb2f4bb12bc032335a9d44c49603d5881b743d5db7a1a313b078f6b97ce79293c650a3576ea720a2e032430c877d466dee9880e746d0a6d85d304d0f679f6fc2b64731a22363a0f147e4dd875182334c606745fc33b707ae51dd6c1dbea239d381454defd82a6b50200b6565bc09357bfeed21fc898177d6e2bc1327499a6514acd575017e68366320314cfd3809cf7a8274beb0a266a1c249681d4cf9510af16d38d68178b7ec2bcbe0200e3376c2d1072988afba98804728464d5d63ea80ae04c8ac8f55271a6c03d12020508746abab563c637cdedfc92531e86794e5406bc85dd4a41bfa816543a78fd02054a1156591f3bcf85e140e8989aea58377b8958026a6fad0109c920a97e49933069338f3a090bbd8ac590a32ad4aaf74c8c6eac965f5dc266eb82bfae6fc4f073296dc07f82363103508a14902bd6777e8c6ba22d74862ec92b654796c7ef33214c427a9cf63cbb5880f3edcf21fc68b00e791e2187ba9cf5b02035ff0414bdadf0aa8dd37c53aa46af4e2a1d78178040c82163663b3a391e983198cdf04dbc79b48e8e0f930e2e24e4b92b8280ffb9c07e215d33797d1532ecb702e7645d267bd8961afa0315ca8a62153030c9ae069a6f0181f90569bb30603334d07d87a859b7d470286db6c6a67c3b8a91932422219299d18bb23e890a2a710a77f9ea3a17e7b276097c0d3c8f836a2bef7bdfaaf9e9a99eb8e7ca2358a83731a288bd880c3c0099d4a20659de38c24f71a1bf3b1932105db4b06944032cb3a0c7b13e2ae836802768e60c12ef5f928e8430c4439793caa1a37c6716466563ab69a34efb008a38c6f1806d831bfdf41ccd7a71cfd531090afcafcea670749e6eb7b1ee339fa831e529f376fc881b0b98eabb22ae5f0c39cce81af76d97276c7fdda5bfa46c8dfda9d0142ea0ae8aafa512a0bd765fd66b83751c4caa7c485f5d8d1b735d9b1cf8274b8aa4d92fa19dae5dd6b5cda125a8eea85caea2a400cbb037bc3460b2a498abe5b69ed3b1790f62e13e3ca885deaad8c2ad088794f80a92c91a68bbd6c7bf928f15a0a51d77235cc32b1ba24232845b523c98ab395aebc2a6a6bc32f5cf3f7174b7207dd39de6a25acf0df17b409bf598ed92891a80205f822f60b41888441e4064f54511e04eb503f44d95e3c9ff512b79c0ed80ba30b3ed66a7f9b3c7f8ddff87bac386da1ef277640c89a8f421130cc5b5d547183dfd70d1ab5ea5cf6e5a0a80580cac3cfe60b3a97fb9479f4d0d1c853b676115173e9658720d54ae2b32b848225f468dc7fb8cfa009f6af46e28b48f72c7533329faac41940cda6230cdc9316b01098b1fca04e95dda4d94445cde83eefc0fd9e5cd7f3e0c6e07bb9aad89ddf898f233d08db81c7c810966930bfb550c13c5293127a1089d8c7737d03848b613118632ab80083757124d17b3120b8ec62c9b3a1fc4cf4661d29f6588b23c14cf6ff657bfa5bd28ef1d044bcf8f9ce94fec39d78009dcad20eafa4c351c90054459a47e3e7a9f5baabd255be541c543d91b9da4af1dcfac6de50a4ef14df968be33c9b5cbccada349f6134ed55bf0214c4391922d9b66042388cd20220072fc14929a01c710498d4de3f2978a31e36a525e6619aefbbfadfdcbaedb4a2e5c14491d824775cbc271289fce3c077fb8e99edda01137908abcd3cc5c7ae266c30f2185e10eb6dcd22a32c24af9525c29e2853275792854b85a619747e26decd7357ec0b8fa60b784b86c98f2ee0f3671537377d317981ac6b6d616b548198c9c878f850e971524997329334331f9620399b82b3f0c9518871e46220358db89f8c34461bf8aecb91ac2469cb235914d9855e1d292afe0c84ceecc2ceecd856bf619de7d07bd2d2c73876ed1e6e99745b083d90031c8bc903c95419c9b5744a66638f6c380a3fb7a14efa32e12839f57b89a95391d40c6e771edb09c4833af71b24eb2a32f053fa9fe0155bae9e936da618860cf87856e71acbc288b0f612ceb6705e6e5778e693ca3d60a7842c8a30d32b94c0d7bf0deb960212f8b59a300d32c757b1793a5fed3aab5f6a539127a80732073040980c342e6c7e48acb547ed4b6770a65cc5866ce87650b7d9d61d4da38a3f8cfb0702102b4f381a33a74b779b22dd8b502236da884db9d3a756c7e0c8d90344052abe8be2372135c58a80b39cb3552d965443bde72581dde1900", "", 0, 1724503880, "783455de6f1275b80efe33de701f5d86f4f89566950ecef66a1605d432b4f2da"], - ["fe113440034ae3fa311582ed6be7f87bb39242dff04a979f519b65c36bff4fb6d714f2477f030000000453536a5166c82cc766bd97d10dd3d06232dde7025d9ed287d33749c35df825ad4c22a3e530623822010000000463ab656a6c3891435309bac9ff30a67d51b0b56ca3f8a8d1e805d9f28c65330a6b25e9ed852bee5102000000045200ababffffffff01dab4cc0500000000066a5263536a5143295e300188bfa202000000000000000000000000aa5b78f9267032fef731a7e1e53697dc21cc76c79cf3bcfafcdcc7ee08a3ec46e08c126d16108ec7ea66dab632ef2934140bbbf6efde1e21d85ff16c02d48b55c32bbc5c1666495cce591e2b12e7cc9e5ead7f258c33d51266f02955b3526a7a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d8f8c75db22c80fcbdfb1980a306d8cad450730ee4872df7b6431ae2ed6f277836f942c62757f2611a09ff0ca24d4d0f51110012e0179ba333be89733ec8244403ff69e85b870595a7236aca26245e6330f57be18f77ee35ee99e80bb7ab760d4761d22666642133e354dfc12658e5b9a25f3dfa704bf182da181e3c0b0d278030c27833eabc79b7b6bc26cfbefbc683837420f1f00dd52a7743b16098cc7fe9e03139110a492344071e9ebeaabd693ba8e91d05066f411980f2c01117185841b060a25588760c3b8e17295a68097b42a405a4307975b81d503510daae674b41ba5f82d7fc9f898ec263a40e2084664c97e8e293d0f00a696da6758b31bbd8fb482390324921cc3b44925dd5a04699191e147a53aed1b1c9f11170b37839be33212b376031f2423511819424872264a754a1cb3c9b7bc05fd4de535e82bcb1b71f8043f3c0325df5693085906ce2db08917a8870f98d85ac7969e4c70c98f022cb7f67ba38c02011a1a0ddbdfa02b9cdc944ae5566b934393632a4d564e12db424e20f30b1fe80206718d590d2cbce6c6874e517c31adcca0191130b559042125337ab61c3b2f382fde4eb216eb5c1fa1a6c79afb71a5cd848c30c648b5b5dcfa152b96f9eb1d374da5acaa779ac7fa9aae21c8b70ddd3ca81c46031579e8658778ee01a1eabcbc9bc05343c11105abb63366a7a708fa3ed6178243a2bbcd832c0d0594b4e6e97938346b2b50cf78b186d5252f96e8ec7228034bc2e639167073db4759aa9a1a1db01af2acfcb406a14c8be383debdc3d23aa21b4fc34a9fda7e6d59001f96a170f0d72764787a07875fb10357813b281a36227b81b4b4e0d5b260a810293880885e4d114f9433ccef73e9a8dec6316dc104188f8074b0c06c7021f15406cb4e41d937a6c278e86cf32dbb3a269deb4cae077b656720887eee95bb800eae6538abbfc3590d3a46f39d8b15501fcde6c1052816d77e19bf77cc8a71426e39e390fbf0d485e5412c5ec52c429ee6552d9051e076f1861b7b1214f03b59097a628b281e22e676e3c6ef513fb26747f7ed3e860a33b1c891f961fc3b36ea2f7726a9b5c44ab7e54dd655e8f6db27c2f39b7ea3dbe4b4d05473c77f2d1eef301b711995f06ad96b46f6613118893196e0068ae2bdd0a9d7851389ebef79c8e5e5d4d3fc35df8a46ea2a0f673ee458967a7f84933cf5d8047d9fcfd323bda4a43400014b369f67755078f19268107bbcaa51815ba0de53904e0cdcd2706cfc47c6b2e97e0d44f3d7b5c0499a160c8874b5ab34cd5fa025a55b8d44ccd8ab3e93d79b13012c8407aa1e9f0ce18455038019f59b4ef461279faba97b6dca8663cf963912779cb3f8d45d94291f159381b23608e0be160249b08711ad9b324fb2dc00e8df4a940a83a68d16919d2b1db7366b7081c73de093299f7a2aebc61ddc6e1c894a85f8f1af6828bae29e03dd7bb863221dfc8a86974297ad09f1aa0a35d3efaa05be313399a4e2dc8b66b531b19a53d4417300c89772fa9ce771844eab9a4ad0661ea139fcd2134e04f34ca3e76a26c2522e49fe20100e41350c7d61120a510d62002f138b461dd306ac095902f15933e8456a942e0f52abfb129b3fe3110d6ab18167c6b0905fa70ff783b5af158d0f48596b4abc2d52d4e991ab675eb642086e16c036eca4d11cb4dcc38e9d226ed13022d650c9b108dc351c925fa617dde190fc6d47f5a65c1aa020c7e8067c30e226ca0989f10a8524f752038dd60cb9f892b686f2330b3eafa7c9bdc2975872a1e7690dc14920fba105f1250dcda142c6d830dc9f6e91f9387c4fad8e123f7b54a7f6e3143b3380829e1609cb5aa8e39cae32915031e734a433d62c2c553ad8aa6b4385d015273fd605a46d819cd5842093e24b0fa19e2e7a4f4b28ea26b903bc1f10376a456cfbd5de1ebe77e7aa36d9ded9cf1c519fd3df784efc932691ba90e21740f29dfb6996bb7f18517e4f9e1855fbba86ab0bb63b0daafe68da169aec9dd0682c73acd3cc2b588f066c02bfe315144bf35f5d82c3a0769ac7eb825661d82af86465b21625c555faf87ecca4ae8ca54a5820cdcbc0cce3a4f6bd926d304de7587035fc33ded4c74aff3627601ce8af906dd19f156b4db0a9e94e3da7627abc93682bfb26fa84ff71de8d823fedbd0f5a75d1873bfe9cb538f5ad25869752d59ff5461d387f853f238083c225bf38298e6fe976b5eb40acd2c9915febe1a6a63cd3a237ddedefb1a921afa2b99b1297193505c7f01aa0e562d62d39ebff06312b5e4b0ac8f59e92188be68ef9db231c64b5e0269033c745f50febdfa7fcebcf0281d0ffd0fd4f80d999087f06b5edea1db723f3a159fa718d76d3c25fbf39d9691fd9d84a6f898026a9154e3fecb47adad78422a32d53623e29017f892557bb0e0c", "65516363516a5163", 2, -369229188, "46afa7e6cb02ed49a692b9ebebf83155b4129b1589d060853ed64fa0814d188a"], - ["b3e31548030a0bf16ca9e07cd91ca0c4320090d33b8b953f082e3b39657148c01b2b081d450000000007650000acac53ab8096a6797092af7ddb4267af210692036a85a4be737acf23191587ea45c0e8a8c18d03330100000004656a526311bfce0a3aa26732facb0deaf80d1aa5051ebd49972a605cde43786ab6b054b0d34be8440300000009ab53656a53acab6a51ffffffff02147bd8010000000009635353ab5152acac00bc1173040000000005525352636a000000000200000000000000009df9950300000000e5bbcecc49ae91f1dfc22c5e35a6be0317d54df960541a204c7c34acd3325a73db44d7f69354fb52a89a7bc810a4ed90c4434472671cdf103df6d72f700bbe0585857cae503f3954cecc23a217be3ac58da2e7408e6e8f5f4130e7b8ab4bf908000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003a702998580d9f5b52f9bba777b15d65f8bc998cf89b8558aa4d3c5056d9a2eb844e9bc396848f47f042e44d1563931569f73988f1b7b5913a501de63399b30e7670e0e5362328a44a31bd859f64135d8712794c2d73d9b1ba345090350908c00438046605e1015f0781adada445644381f7c5c439bc7cfffce8fcea68a5ebe40214212ad33e8e2b11a53f5ce0b425786a775236991280279f9ce15ff85ff516320220ca5911eec0971d3d3188dfce2287e1b7505122d7c8e7c345da5763875e466f0b25f34c727a93423bae623640bd7625415d15691a133fbedb2e7eff576e0a970b10891114126804bbbe820bb5550e2e9abc9e8bf7e28513fe7c19cec97a0989c4032db4ac6e8884422bfc36fddcd049dee2041e8af4c7d63137c4843f844f870e36020ed5065d58b5d221b862c135f2bc2d1e5ccd55698a27ac85061f403d041d70ec02130f3f2f834e3a683c6542f7dab42d375a99f0efb97b629c8e82a8e30e25c9a70224b12dbcd876e87eb9577f81acaee6a13b869814ee529e50ae934881513181360318b587ac18a99bc3fa7bf80df09b4a8dece3cf7528b2ab78f1e523c642ceffb8f95f70f2050716d5d1630d5af1aeb6e5eda4204fb25fa23be2fd638f1c23a475b0804a2ff9cfd57eace427bc2eae298d288f23245581cf8be2af02d877d66106120f18355ea15ca41685d07bbab05208248af983b85a30be407f4f38bc13b47903bd6e3970c135d54831d0ae5ca33a3cc9f1ba00468bb5918421e31077e686908534faf1f6310b64ecd3d5da0cc4c8362c76445a64acccb12fb1111f6e61deb712f40267cf3721b40e9ba39f29fd0a766b33198737919b65f89d8fda25a3c9f8d220133acd83a966b4be74bb00b34f6acf54fca5a4b8c526292c302b7b9131e2836a47e74d9511706e4df4c06fff5aeaa48681412d471c2c151f15319c40adb6cd008ace66c6cf8b9c17d41aaa05c1e9b0ed4052023259aaf66a42b24314f9ae1874c33ba41b6015461dda999f59398e1e2ec935ffe2a46bc63e25f9f2ee972f30edcf708379b15cc6dc4d30a8a19bf8794b7b82ee1b76f7cfcf44db84736834aa28e14cd545f3bebb8ef533f69deb34bf047e86a8c2a133cd38d257b1b81c3bb77194fc8fa62af5c2c018c5fcbedfe74d50a1e682834a3fbc920583eedd7a6725be557c9e9fd2cd1da9c29f487dd2ca52fcf51e09b9110cd6bd1183f3b086a5d17486de07e96f044c1e042a93412b9822005592cececb00a4261d4e254b8e378ee7b41d06215d0dfeb8dd64357cb0b29ca47d09b8676a05823832a3741c5907f1530bc70e7c09e00cf8398af82a11c3bc085d50b29d69458df2c69dcbd1afc7c3cd79855e1c021f57a4b7d1e77ea36f99c1d4892c6b732d9ab22ba7287cd93bdb73edc12c98f0b1b3ccceb45c361d158e1c4c6cfb0357db7e00864359f04f5d202637402a4a590b5ec881f9da2bd2853dae4214598fdc78a9399cc9b44772aab261eaa7585c278dde91384ca853e9bf75199cf24f4e436700e0c4a95a178c1990b9fe0e523c919f310083736dd6acc29ff92b73866d303ec4ab624a1fd06c0c9c1bc8db226fe586d13b8f66107c74b95f0da4a699d6e550101ab622ec8aaa6cd89c5daa69ebfe969c500c2f98c41901f699c5c0936d0acddcb8d39695e15f63f207d17c4acb7f1667a124817ea41b4f5b70048e78c2b158dbfafc8342e2de3a1be2bdbe37e6514312061544abec2d0c2896ce81ef8bf9075dd19d8d7a752b8e581948659d64088fccb92a2009b50fd0183bcbc0182f4f6dfcab4e041e93962f6de17125e7af4da1ca55f98a504996a711fc9027a792113e9deb07c726114dc2b475bef8b0222ae91c4d39125cb9f26697bcc9f3336accac371ac0f50afde8e259d62a430c1473a537f28b248da68c88a5dc55c946c5f3a45c60127f6e3706c784e5a40cd523cb5cc9c034059e069243a5b6598112281f481a2453aa760aad5ab78b0914493de15eb96f4911f39b295bcf3cc198ea9fda52e36727dbf780aad8b3341efa0d0e8fa7d3df3692873dab1641e5bf37105976607180bfdcc016786b74c8d2f5c0696f1f68c10573b0bcfeb01188d5494b0eada33cb40ef59587c14fab6eb4b2c458442b9cb242f7048cf6ed02e172fdff14b9ae9f08210a27d9fe42729c4238d4d555ad6ef5b2724042a5b7b79a22dc1fdcad4d096d9139a7a98b7e75e8ba88c4790243b307c3eb04f1af332ffbc395a2da6e13873e8bee4104b3bc2b41ab4f8af473f6628f22a4192967ac7ab3ba01a105000000000000000000000000a6f9a8675451aa445b35ad6278134857494503cafff9126cce1d7b2b18887b1aae336f6f5826842370908b91941484e9472f6af1d1fcb4dade6a0a784774cdbc7985a3e14a3772a5a867f9bb8953ebed942e8be6e6d2a01da429dc511e1b9aab00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f0729b72acfc2546f3c6764ab5eb09749c4da233feb491c7ad2fae83f0f2ac9ba818c7d53dd77a77c3a9446cbfe268a9fd0f6bbf6e3d728b0b7b96908adcf4fa798d777b472a63e6dad861044473dd045e2fdb98861fb70cce0800751a00077c17f6e8a58c95a8772f8338c6825e75fc11c67d325824e136d470f802fe31d1a403157810aefe12c7775ca65d5fc1ae6587bf94f69c1db5c01ec1d54f6460da8b91032168eee50f594bca1eee5f603c4764fcd3d823b7b074a5c965b4136fc72d55b80b2874bac85517246abdf767a5d29814bea92b070194ab9a2b3844ef57f5c265a81acd56ed1ef2504ab212407eb8b99677725285e772d0f340e8f057bbb4d10f4b021829be6eb8447eda4caf56da5e88786ea0114ef628ed4a985241c71e529e1e32022ccc9ba437ab84b545144fe56b804a37d8da16d66d8515cef4de4238113ca6a103052af0df8a117930c218cb5e002b3f3ead0323c1c548e17531edaeae95df9e71030eb7cb869fe88a89ec4c598a8fc133ed7f62d419a745f2eb074ddc604cdefb820215a019bee0e44560b458fb2d29142c92e95b2e0c423daf0afd7b10bba767fdc5e5113842844fd43e1d8d98bcbb7d8a2fe969fe38e5cf92008c166f495be8adcb07807dce6b2fd23111f7a78410ce7c2fb606d2e4ad4cd41c8f3192532b36bee1218ea6f877449aa0ef75ea0fa0388ccda594992cca6cc54009f88179886e4eec6da3700b592a3c3f7bd6ccd76aa6a336aa5fb3a3847193b53f63db4e0aa37e36bd4afbdd3553f61c29f489bcc3153d1c9d6d8d50e695b514ffef1d5b3b79ecde2840fd87ec314de1b92f118bdfd81e29c94327f1f977d17420eb482b8cc99818e388e1d3977931b6f9d287017177846643e19f657028ab07c78f487ea08dd1e31645522877092b2d689492a05654458aabb132587e9ff23b6c72b486c01673dc983d9ef1aa7404561bd1ef1fe55054891c558e58232721063b8e17623c00ed3421539e125e6c4fc754971d2ca6b53ce6fd798ac17ca75cdb21793e2a84a0aa60e810201f5f806a63eedfbbfd60d1f5ff1ab744d4881239e47e4e0dd6cc314d74bc36fdf383b7af7853878bf875573767f55bc28d2541e27756a8093067ce54ccd3f4a99d939f6fa1e7efc499ce0b92f5500b19c1fb04483a1970f7671a563f9c69e0f0592ea1c017c7d826286e5a23ce23c7a43bcf764dfc5f82e48894767bd66c9ed7b146f7392f98deb82d85a8ce498db5085cf9619598e91d42f1c3fcb7e5429fcbcd39337df80a9a1377c6fd6d21a9b3fc9d6765521c1b4243e5fcf75957eb322975679d000d0c85486c61dedc01939080531b57d3a5356ea5aa28d1d8be2d404dedecae819278992095d3f16dbf6f15ed958edd4b730e9672f58c0a54d5f2193cb4fa0997e291b9eb75cef05d1034602a37a9364174ee905280b93ccde76f9c876ece1ebde32eda008c22670b9a0b6190bce43e15307ee210284d17dd7b15aedf04a0dd32b9bbff73b1dda8cf066943c41af7c5f939c5bc973e44c159344e495e4223f4bc9d288d072882410b6cc0363cfa9f888a99a969fdde6f25957d4d2fef5bb1c1d28911c031942b069ee8d6d6b99b60d84d98aa7b1e1383b4391584156cc430ad278ab164ed1168dad1e22b8ee90ffdd21cbf9dfca50829d31bae997cd3494930b0d0c6c75e23bbc95557049584f76ac23261e4c01e36d3f05fb4a208936ae2113601a5e45152acc53d77248fafb36036a2041939582c2648f510d8831d3e47d3d3e39eb76e436ea03ff365138bd71168ac26d481078113f4e1efc546b6645af30e30ebaa9e35707bd39db64ea4b6069ee43525d7c5fd4d9bf07ec1830e3aa5faeaf9b1dfbb53e8e1f7a02f182d78485d60d02a545fa0c3b69cc30904fab3443b5015a101dbe7b62f26156b2de5d886c2824701d68338561689462e7340b996e27ecfe28b5a5189d46ab5e14dfe1e818f1a6ac9c50f16f478701f0085855bf8584ecfae3cd06d950814408455067c8e3d33da0253df0755e44d48ff96308bef8b1a6d833ee52b800b2a6e2dcade795d8458249edbb211c333fd8a36179f47928b73c27cab6356cd663df570697a3f2a44d6abe8699264ea88be0aa4d555ba7482a8603c9792c5aa10c244563458f91b7e8fe1516aa50f6063a9e0d2cb53932acb436c23a4a240c28c08f6c9b496e4b45c110bffab4b9297bb4912226488f727d334741cc5f46539a220bcda8b23d286c8ee0a55789b651a59c807b504560204d9a841ca564dc9d89a6af4b0e61e5aa7f7d29779fad903be3ba8bdecb3decb95b8fb76ed9878a6dac90b0c19d92a6d1365dbef47f759468091021470319ca85089497aa184a36ed79c160b6dd390e0a72b358bca5eb9a2469c287b419d760170e690469799838c82057dd96705", "6352", 1, -1980597732, "b6cd18b9f9550859ed5d3c679b348f013b98a1595831114351e5e7198576be56"], - ["e0df7f38017cbeab32f875c3b450d79af64b96f86e92722f83f71d53133a43e077ae504e490100000002ac538979f638018caa1300000000000151fe28a4c603108f7a00000000000000000000000000866a7d513dfdfd00d91c733a9901f891f90e32261f08c040d91c06cf074db8d764dbae717911c5b04e25bf5b83b7f07ca3c8a125f0caac375a736601e381fc752ec516623a4df64e9dc18ff2898b7f23c8f2bb5a5aa254726d33c886277f05a200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1077421c5d3b2ed6bef86dbb97f6a5d2b31e23ed339949434a6c5f5087f065de138e6cd8f123b8a6de08c85d032a6132dd4ccbed152f6cb1184d4b82be3026a072682400699b17aa4677f9d472d21c204e1f4ea85438eac3089197fef7c8f7aef83aa6b75931919a1d2f168e33c388fc1015c42c54f57d145fa8b4223375143022f073ca107a36bc5aeaffee298a02b791ed929fdd144f56072a3521f481446790212d23cbb81607db005a431d3ee70063d36a7ae739330cf49316499f95f84e0fa0b0bc1bebbb0fb53872485633c58afff61d53166535ec73691d355603640cf44d01548fb99e8b76b6d69bacf580087f76518c118eb8528a54e7b3d2fd21dfd9b8603035e9fd9c96a3ebee0796fc6aa71072321efd424b6b347544a840f56bebe4564020029dec1eccbbc86418b54bb1547a59ebfa2faf5949e760d90f957f7cad16650022292a49bb31e1b32c0143242a59b1820b96757f936ab9c05b75b1369cebc14d70304d92a48c1aee00556d2f45d9f66bf367c3ce47b35cd92f50360f312640b2dff030d45441971830c7db0fbbce067d8799c9799990014ca57b734f5a5a970f15212125352a946315dcab21a68c075752bded9bf45806ad8a036272d232b4f76c1bce3e4364d68ab655c3ffebe6527c59a644a4beb0f0b59917b2417d219819f1a0b3f616c388add094ad666444db215342482b6b957d9fd8e71a8100f1086ef1cd3cf1b848e6fdc0e2294c7383e91da35271a9de4b3049a113879f0552e18254af4d4a028a715d5963393e45401b26f454a82ef5a1dc31af031d17f98eb9f6788046f483cba084bc5e057e11a57fe4645cca39ac6176acdc6c575ac029c53c29d8bb361e6ddd62095baf95104c9b885a72ee66d541f374fc6f1b10803ae84e8112c761274cc150ca18665f6faf7f29ba2f27c3a1718a572bed62eb02bea2ddb8100aa972202dfa522ce06dc60294f547bc3a84094aa718761856e22a36574c37753cbd02b40f562c879685806568245f5fbf513b36ff4458647393c8e6c2cdb2da893d602648de1a5a168a81110f6f1ef43991a2b1a39149d1c58f70ab3ccdaeab26cd304bd3e19886d913d73499e3326ed79ccefefa208e10f9cede5bab65d30b15dc58d5296895cbba5b680935bf7f6f93a1edc8b3857d8760c1fd69fd4958ce98895ff4663dff97a91b25a4f9c9758fb26eb05fd194c4858a10680bb8d04f524ebd52ae8633f4d918acbc50b0e2a2ca61d822fd5ae3e64edf01ca7ffa6940c8795188a4daadf004e2b705e28f00ec07f5efe4f3ef0cde0647717fc7282d9fa6daa463073ebf7aa9b9eb69d65fa46cc0f52d5b7b7bf27f37e87c43ca512aff13adb54583652f39b6a96b3977411dd9bd71359c7100302e7065a98cc0ba631eccfbe615073fffbe8f9fd796c86326461377616c13d221c8d7fc69dde882179381900241f4f58331d6b1edf7d54d9e82ee3bee417b0dddf6c86271dd5ef8d4ab75b2a0024d34893e26947ef5be1920172a0e5e99adbd5577aed820f3440d2adf9c09e64febf594e3699b45033ef709bbe8f8b5df1970f3955a3423ca1707dbcf4056f8409ecc6e4bf292bb897dd0ac864a542394276cae44779357e18f2492be2904ecb202b4844e3688f9c08b3adf1712f561efff1df6d5ed1c56d54c97f12b8a86c75e534ff32ed1687586b086c16580d879f9b743003940c5d84ef1108ab183b14012af9471b91fc1ee39570428e621a5ca3fc98f3bbe4593bac00cc1ca2aea169b176a7ba4d5c0222b8787908315337e41ce1dea9839aee492c5efde4d697bd5876d6fb7ff91483b835b9a0f94dad71a728f392796413898747989865b2b43ee918ba9732d25f8e9781a284c61d4cbe923092f98b9289b4f0205c4a036729d2fed25e39eeeb6b13041e2d16c51518e085c96fa056768cc39df4b64f2afcd5d0143abb0b1ecd465539162c2a3a3f6b2411b2761c7fb792b957dac845cf285a865f021b600e619bb07cc3333e1b93e403ed4a019f4a3d4884a757752ba9f130f31f34a50c7cb63ee3824af3a15c0d4eabe346dece45b85f306f3d41d6a276e8ee50347f4af493525e243f0caf1a28f9be8e63451c35233f765fefa35ff88c3eeae0c3d3ee8202c1407655362d12492b62af01386ea12a122817fa2dea699a2c0b934f3e28b444e567e42c0835cf7bf91c8e4b9c14028bd519ad19617508d520c3da2ce9f7c32d778251fbee455a48003da694ef07003b697fd64af471571b358fe53ade34f0f9b69b14fcb8a8e30b1af1b1e200000000000000001b5bce0400000000e141c905ac9e54002b8c495ef2c08213fc396b3c2f2d08e0f1803931394e8dcee19818f0f646fc6ea205cd7dd821100c89307aa0a08512ce239621f6a660e0d31aa1f34728e87d4279b8fc0020ae329986a92f6f7b1a63896d7f1e9e062f502b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ad421b73a70fc37957571b9e671bdb382a77d225e5f03f04eaf1dfb445f7f8abbb47bc5a236a2b0eaa9a1b66b3bb475a019a946e6d48298f25c5180a9ed63dd70e85686aaf56a10b9f97f06f2b890557a1ff76b7cbda3922df6b9300cdb676dc06e884fc2f876c75b22bd630014eca7db7ebc09501934dfacdd6db70716ffa9f030a762acec399de33b67e5d677a98704a260cd9cb4973f01961ae4719274e45b0020e3e83b9f870dcb791ac8ccad2681e655aac524bfa8cd713db34fc49b525ea2c0b234fc735c661f29f0d46e5e87ec399f8a74d96e26c96f4c5f4bf71710eaea8d11882249d666b1a035f690eb1d72bc4f35e965fe860279727b29d1e8191e094f3030f062b048c16910cc3eeffd59fe8fffbcfcce40bf42a29d13adf932cf342f0b0022a04c3642d9e242eda204f9081a82d3010e183e399b1c09cf6c5332e0e0d1366021afa46ce8ed9dc8cb0fed99b80c09c9da6d5ce0a97b897f0ab441759a9f4b4ff031af9b13de1f73b4c59e93b1029b406d7ffd80b03c558b93f735d417d5f6d20ed030470736851fc2b257d065ed790781db6690f15f2f4c6494f1dca2d09d20354c8640fa6a6a5a6577d12597b4d422ac93671e50ff0769fc16f01a49482ebde49066390fc65f3412f7fd03fe8f9a4b63cd08c54dddaefcddd089f7463c65580e6ba5c3553c4ff9476128441544ef643370a76509adde29b91cca105f38bcd7f67251d9eee6999f7b72790d989e8ba26519de4b68df1aefeb59865b4376df0b0154a1a0ced988aa542bd236d209ed4e2cd4e23a56930137edaeb2b51ff1197c4bdaa5fbf83b818fda323f2a109e460bbe5fc6c53532f8d6671ce0c3054a02c4d9fbfe084cdea2ef3ec5ef49c687be636f2c0f59d93a30afe950e5cf416b418dce259280df7d777ed01a9a41e81156c77793c40218bec8f0e8e5cdf9523083e12c02b1bdb29747127b478e943e08c605f0e615b5e5e42f888b78e67ab8b674aebae2f366eb33069a38d6a0feccf57ab3aee11ebc0ad8cba4c3bfee0c381fcd31ee2e2e8b6c96515ac20f6359e3c2dd9c269b4324888b2d3afd5da436eb859851405fd5f99f7bbb5df5dfb736cdf029e1da54ff28746a42c90823cd146f2136faddb1c76421f9f9f3014b4a8fb8379de82694284779cbe56548f0cd70b8e30b24d4e676b4ade7731d338b2ef4550dada46ceb539358673318e213f178f6672731e3fd04a9916f1b64ac2c66947a9a89d81986359f2caa0219a9212c0bd69efe930b3a1d626a0f7c8241d1b74971df0de994a9abe20aadcaa41cdb4f89ba8c9d0f01f0be76d7b9a37f8f7ce1dbf75dc8dd1a4dff6e44c2638e04ce0a077316e72cdc7588a62fa17eed19ca2856851f467de44d5d5381798a933cd36e997bdf50ee8eb9445e12a60e94a25bb5655045f5f9f49c4d909cb5bca9b9c134421cde61b41e26ae7d78a40f4bd4253b3840dcd4a6726134293a936055299b17dd0fb5222ac15babf1b1facd7e2f2a06d1200ad5a5832c653747eec9c1e2dbd2cc010987da76167c73adaf4627b895aeec297dba41ef06acdeb7e9d9b9de9f0e0f968c8386af6e2894de71e277d1ca6058b21ed01e1ddeda759225ca17b9f861029c0c6accf911e5d0301e0df0ace792f85c17db7b2b7343ef3e7a3425a6fba6367ebc82c25ae8546faa2d166570cb8e3c0326193d426cd549332736238451eb56ccdc62670033fa79ce6f05af1cf17b2a11c6cdfd8f3fb18851d50d80b3657bbff81b0132d83b3781e67c51d75331837d124fc43d62384a37f3b2f9d6b2c773dd35d81f07d5e5a79174a5396f318816a7930a40d5383841fbaab8b66dc78fc69a31f278d0b7c4913a582c2b267a143ed095bf5b09fa918af40c071657175ccde77d43832ff6814146a635bfa68570f1235a361a02ce7d8688d22b315278d68d6a3cb83fae281c5860993ad3926e3cc54b3a33c8d04e9b3d0cdf1584d10829a6805a00840881ff0c9d744f1a41f3ce078bc3bc191b2d6904fe96ec5e8308e173f427137171ef6761c94847a6902b2c1ac58957413420ff1baab72ea513501395b10a9ee863e8efc193101b79701302ffd0afa3f9f6ea83e99a8f6fd0dd9796ea165d8ada2615c21eb6fcf90698f942947fabaa528f8c65fa26f03e9efbc9ab0e3ae050987e88d2cae8f918f1e273c687af081e702e8d680bff4a38931159a3f7ecafdc64bac38fc127b8d9740460dcc3c7d580667fb7c6e2e5a67af32604aa4de80d94560b8ca44e9c0551cf668587b6a3c5b0306fcdb5ad5c7000000000000000005345502000000000a33745f5988244a24c7ad5632bac7b47de0f6b72ae1b64c25e792aba8f53790a3ba832e831144b83f28a4f476fafc731512febb2b79f91a0f2e5f0663e2381e0f44644d0aedfed9d5e16178c48a80c0e990426ee9242f03e7a2daf28264d034000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a04ef042b441b028d18dd8960809f8bbcfd09208091f95668960185c07de270e3230cc12ed3c2b931c417f7dac245ae6c6abf935f0bf13339313b7ae2fa83abebddb48616d12e675f6c75d5b0df422cb28bcf107b63ff6862e2e2d10d9caa085cb63fe61aea8c5df7200d87390ecb153a99fda070ae363e75fbc209a7846d7f020931bc9598d2ec9e59e1a6a7c44b364a7cd7f5cce4210e71df984f84f2b32228021308172436a567f09caa43c6c2b7fcf034930fe9fb1552b1797d89b0936349020a0e1b974ffc1885b9003d51c791cf96e183f4ab5cb19fcf50b1c5336aaeef748a0d4bde532946be11497b2ae1461aa5e83df58bc9a0c4f57a24dda828225bed08020e3445e71ddecb8e363ac45da8960b60f840d5128008b2cf6eba53e45f773f400326b881be94b123012cefdc654c46c88c45fe35bc72982018e1ddfcf97ef68e6d0211809c82c410e90411380a7fb8363444534f7a05fa3f0dac8965b9a203bfa76f02205a86a6e04195565ea20c2b845b843ca027f60e75166088416ff83d472a9b7c022efb355a6c848628f0501f04a5a713f7fc9eb0706bc72976044d2b48735716536b226b4d7f5fe9c33f30bf23bf481d590bad02867604d5889b8615f112d7fe43b1d54a25399cfed7dca810054aa539de50faf29e82e09222c85b6a8e7a8eb05e64c2dc0a657441a2e4f07d8be5a337afdae3327997885b8debd4b196d39903852eec0ad304e59f371add16ffbbfd75052fce34a737c617d922213247af4b4a21cb20a0ff41ac32ba251a35e7af995c7ab8f693365e837c6d3a372c2defe89403f35fef6fad86205fc0625cab3547869056ad7473966c3ba966a44557714aa3f3b43f71a3de02a5a0dee4788855ebe225c22734ea56ffb65f5643a6361df967f9deb99eeefe1afb1866a01903cc946c6a029b7868f0e1c6f7981a80584baad2410d3329e45d33992ad467e9ff0839f92d1ae58e195bf1a6e7b458df63e1c5a46cdbb42d6f5cdaba0b5c040cb1e4670007f3f54759b1760826981f728ba836b02c9b916a1ce2b89928d430567278cc34319eb722cc7d769efd803bcb0399c39e0d72ab87484ac4b5f19fe8abb319a2b62c9c13a19f8511e5f21d0611e0e0b62fe9baf2591cd212cd1313e310fc75fa2033a086fce153af31dddedcd9ac95fa6baf0b74abfaf1e5f6c86ad8af3066c6b108d0b7b4748fc624c3307fd1dd5dbb80850416a847adaefe4672a31ad45b2c95a95be2cbab6da73a8fab13ce5864ab1c6d7fcaa15d31d6a69bd115f96b91ee35b2228427b98a4317fe192b3b725f11bddc311c2ef6ff724cffc4e48c3843bfabdcbe5bbdca1d6be617743efa152a9d24b4adfc15b5bd1505bcd09dabe37985751d123ad50019cd2e3aab9e4195b3bec8f8222dd429731a641cc790e5c09f9fa236e07ffd664611848b4a232ac16f6ddcbd41d27d3d8948167f2dc8808998d417f2bdcb066f276b418937557746fd03ad4da234b6243fe074e28f9850d3e2194acf122b3504a7950a9ce3fb2aba473681478d700829c852d898e6988d965b623f9fc4240d1e3af22eb010ab44b8abe4837b6f163fbace54965cd2ee28222ba33c5d36c2815482349b419042d0340e2bd456c83d6e39b93a9c481f38d9f6f2e92589b361589868c61c103b4c7a1437e2073464d84f9c063d124ff0b30f54ce461b9eeff2801a0648b5a7abee1703581206a5ae3ce3221c528ea721c4a7865e5bf59ab9f7a2f08a6b86ca8b79e8cc1c88a24371a94eddc8866daf4fa366b933d49ee4f0dcfbe41be8f147aca41167acc5a39c6018daf8a53052a9d3c900ed5649ba0459c31e3f0ba5a2f7b81ac50c6cd5e6fbfc8ad00e0de56dd336bb6bf5c7274d26caa9ddf74fe573f65880bd4c30b9dc6e40a1b393455b7eeace5c04a1a53c0927bd111687f0017d1ee8c991da76cdf3fca4d8606b4eccfbc2643edcd3006a1e616059c67dd84748de646ed73eba8d461feaf38246a73f0c2a59da3688f069944c716600632339876de315e0c1ce43b5fe6d47f8273f5eb04235e5c1b576fc61f7e977ab6e46e00eb32725045275f0704ad28c6af718a021f17904fdc13f59edabb7d96548fe1b6498c3c84851802486a58efc8d9a4ffad7cc405a9ac041445c9790521d23ada5d1f2d4fbee0da6fc106ec2f85a90f35530e807fcd4e56b3e93f26dca684aa06453546d94b684bf92b711848934033c9375d2f0f9ada15b748d36560623d007770233c39955756da6ca3fc7da866f44b0378c27dd675634575dced2fc44579d6515bc3c1f78889cd030ab14b48c1e12558eda92ac2044791b73f63ff09ced735cc299d1d78ef5c7611d71d1da6f0f02bf80b7d051e9388128edac3c2f28f7ce4e4419954d4eafe6626fac0b51e45caaa96b8749ad73b040e93e87720b", "6a6353ac6a52", 0, 128863541, "9d17b8ee166e4f38f2cdf2072cb72f9007e4407b4b40db53e0f41f26119050e6"], - ["3f73caa1048516a51ac43cb61efccf141e36bde3bb23fbc8848140adab2640bd358d1b116c03000000016affffffffdc0a47e8a9ac0cf76629188a28fb6b7dcfddb5d44756503df1f2f1148635b734030000000653526553ab638793c4f41fc02560475ade1fa782634a4d079d7509fa1490201b21d1dda75cb0a477c6c2010000000700516352abab52943e3c09ac0291ff4368988728ca9be4ff48ce9114b98147589a76fe47797c87e97b12bc0100000000ffffffff03038e0a0000000000085163ac6aac0052001e0f98010000000009ac51516553ac5165520651af02000000000059d8b30b", "ac6aac5252656552", 1, -1821348871, "1a923e74486b7f5bc723181d16c11390409e5d36c84fe84e4d7d919f64e603a4"], - ["ca1ff5cd024970e0b3f2003beb91a5560b5196a1644a1f8bb13dcc28292508ab94825c0155000000000765636aacabab65ffffffff1baed314a092f845ecdbe04a56a5c3ed9a3663a1388a83ddfbc1e20a8d6c416b03000000036365653fdd8492048e4ee003000000000050f766040000000001636c23f5040000000002656a9efb510100000000086a636a65516a655300000000", "0053", 0, -1881944634, "7966d2390a0a13da243c900675c0b4c93d39a0c671c3330c5f6823796d34ae27"], - ["19270bd1040a5e188346cadb8937e5d10d4aa7c30ae0da6f8b00bc035ee11aee50a1f7a909000000000453ac0052ffffffffb35db0d788f76ff4b945665faf0967ce251f9683345a90e09faf42ca0436f30002000000050063ac52005e2a1d47b43525cef005fa036e98d55e8bd0749fd263b30cc6be939c338af4200b4f4dfb000000000663636353ab65ffffffff90c479fe161bd55e30cad7b42af7c801b15d8949a83b51a8f0efafdb7eedbedd010000000751515152006351ffffffff0380ec0e00000000000852536352abacabacb5fda9000000000003ac526589720c03000000000300abac2f3c567a", "", 1, 1134438924, "477d3f629590ea43cecead36d21d737d57b9d234da296f5bd889a82acca45944"], - ["58c7fe8f04327d97d0084acd3cf89599ebd57736dca88699e6e6e4fd8b546ef61dbf5721b10000000008ac006551acac535166c110d65b24b778fdfa3312f08ce106548ab8b1d5451d0e68d661de732dddde68fa136702000000095252515351635265ab91e99ceebb7619b60f875d3397029cec3e3577ee45cdadf8a2958e47f4a17a9bb01658f101000000066353526552523891e81217bf7d7f7d009e7a1ce94a01e1e303845abbe92ebbe1b1b52dc9c5b0ce82103802000000016a4a01bfbb01f2eb13050000000006535263ac6a53643d78ef", "", 3, 1083632216, "89908b0673c687a0772784bdd701b88f984d6a2f0081beeb81eea29b64cc30ad"], - ["6f9a688f0121d26a76ebd48e458cc19722468857c0e586582a6e0a00232f6af9ca221f3306020000000452acababffffffff01b1e18705000000000765ac0053516a0000000000", "ac6563ac65", 0, 1041860068, "08eaf81ac3c9d68b2bc68481def85f9f80b59ee4ef6192f39cd139b0c65eb904"], - ["07de6e8d04533e3459ddf08070252a835dd3482c8153ea5d3184c565ed7b13905bddf1c5d80200000001524efcbf826a08d12037048c547aa3f063cf41c70a66fd0f60457f9d5b8a1fd88d6b2b77430100000008abac0065ab515251ffffffff576ae9ce06fa7b8c3e0ce7833d61286f041106c37014c9ec332a796319d7ac5001000000026552ffffffff42a1498222f999dc66a2eb0c6799a4d46e9a9f8894448413f37fcc70454afc7303000000066a6a6a526a6add1eaf010394946a0200000000096553636a656351ab636c36b603000000000252ac7fa4070300000000016ae0815e84", "655353", 1, -651918271, "89dd327bf7883045a0469af74127fb0305aeffcbd3b332b72007365d2ad51ca3"], - ["c62fc9e801405fd184205bad4379cfd51be14380865f74ffc28425fc0a6d5ce5853c10aeff0300000003abac639d7658a004bf8c0d02000000000400006a536a7018040000000001657a30b2020000000005536551ac6ae75c1e02000000000865abac63526351633682b52d", "6a", 0, -1533966398, "572d061dd55fd4ae68dff445607b76a601f150bfd8477783954a03940d1f6e1f"], - ["337b9c460249574f7bfd957cdb9d92d54cf7d7a7e0c3d75547fe5b87806684b1ce7c7733c4010000000551ab63acabffffffff6f203195836de2a6e415b6811df74fd68e55e14500cc2517c0aa7a12b1d7cf720300000000ffffffff01984ff8020000000006ab65ac536351fc20dbc100", "ac", 1, 1174314002, "b5dded3633197618f05bf1bed560e3af4112ef0c7ee8e55e022375cbb193de60"], - ["dfcad3cc01752dd9f61c10f14bdfc517442a9c7455cd4838c0d5c803061f5bcd74999ca6d30000000000ffffffff01924326010000000006ac63ac00abab3b4bcc19", "", 0, 2039059512, "0331b1358aaa707a9ee010e1bd436a0d67cd01dc5f7224a003b421022b229b83"], - ["b3647544022f27839ace0e40b03b444b91c84ba739e51d3e6a2865269de89f2949b7b5b51d0000000009ababac00ab6a5252abdca4fd972a1e679d21c1ad178fcab3c3a390cf1a4c85638e6564ee6bfd860814658ec2fc02000000056500535163ffffffff011a41280200000000060065516500512387b68b00", "63ac00525200", 1, 1409950414, "9058ae99f862a83b5f325456a3d70947287253b9af7ead16f5b04389e7dbb5f2"], - ["08080ab3017748d3b5f58657502998a921d637f1ea770bf15697b0f3da81e8d1215c2a3aa3000000000551ac515100ffffffff0399f10f03000000000965ac6a53ac6a5152ace86412050000000006636500536a6576837b030000000003acab5200000000", "0051", 0, -611008113, "1e982c7f40e9063821a1183aaa45e7bfbf9ec57d9761dbdf61689f5f863f1381"], - ["ed71727e01849d913174fbd49ab3705bdd886f13578b229c6921caa9b6d95869d49409818001000000026aac27b0872c04ae743a0000000000020051deb97400000000000865536563515300657a5fcb03000000000553656500003478c20100000000000000000000", "5265ac65ac6a", 0, 679002567, "0485ad4555486f23d3faec7148b1244d30c33e146cbff9bbb79139fecf4ab10b"], - ["16805355010799932737b72a2b9bdae6d193bc87ecbb0bedcb045e59468b4b17e59329211c0200000004ab5153512d68b00902a9eae6000000000007536552acacac522a0d71040000000007510063526300650cf0ff6b01b534b7050000000000000000000000004848cb0fe71b405abaeeb5182f0482cbbebde4d538d2c0df31fe9c269f8e3f655806154ca6916a1b09177301ded15bebb903d0bfdcb5a47d138bd105ba04f4c2aa2cdd2f56973255145b005475b2154f4d2346202e759a736b77159a07c10b0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d254d580ab94e9a59b0d81c09dd1d8f19019ff918724fd12b46d65eb576b645f8cffcc494ecdfa5141421dae8d317cee82ffe618f068d57d0a4baf1a12f1fd58391502a1e34affbbecd2289f5a4a05c425571ec7548181b2273063be3ad2ba1c23f18a093ae3f566cf7017ba2046d3cd31a95f77bb62446336a0e5b6d3fa7da40227c86d139714ab231cd38b3b43e6cbc3131c459c4c5dddbf08df6cbc79387eb0020834ef0f4b709df66b72ea5ec95d2e137da3d61f4dfccec00ada65d434e21e500a182b117641a4b8f7e3349418eea821753aec96f08ad73e28d609c3759627d4db2e2ab89f728ec2c5488aa5cdf0bd51aecd16b09e388c1fd7ff94b8efa781a4f2021cb8d49a5d5ed860aa274a19d2260a777addd4991c219120cb127d6d93ab6b4c0316be35963438281f50c79a20e8a78b5d8d276954c9677a08f535dbefa2f7337d0301050e4eb984a1f096f821711f882da1bb304c18e7e3a55f14c82c303bca5c2c022ef03c4ad281f656264392af9db0b4e8cad6ca5c32a8ea4de97f71b43475eb8e021df6c6601c2129aa95a49f816ae3a6c5703b9bcc867f3f41f214d9432f325dd2b78dbc730ed99bb2ae80e270e0f00c97e553b2894adbbf49511362c5b62e3f938303ac2cd133e866b42286ee778cf5d15fb4c15a7c9cf48b910356375ce56ed7ca62ac9bf941876189b3a4b87b715e07f56fb213797347883ba4af3c29d3cbb69c4e45edd6e9492ae8689f4701dc934e70f6b2e6669a90cca5f644563ab5b6d7fb150914d6aa39504ba8da6a3abc419f0a00a7bb293a60b1990c3bcecf324843b1d46a8e5ba10124de9056417f7f46007693737cfb03078aeb28e11bd82b6864e69f89e079e475f004547340890aac8230937ae759ea8c50a50538cf5899a38a5cd683781b40aa748b44a27ec90569e1d5e3cd6b76aa1d47ad8a8371a7f38bbf8fca76dbcf8ffb7cba9448f75ae724c3b9ae412b1cfcad322ad241257e6371790852a258c627b5ebd46424a88780003f64b30060f0ca26fe58120cc751157ddb97a7a320f479dad697b2e763448778518fc6127018027e2d7929ece21bbafcdf24675e353b5473277b9ca0d8ff4f59b85f884ade37a52dfee873b4a3e0d79a2e49bfe09aa33439d3e92e3bedd39d8e5c4ada948b1118dd65479d9490f7c30d3f0edbaacf849fb3479c5f8af5c1285a2ac613301a29039fa062680ab5cb2ebde09356c38aa80891b1e968d304a282c822e4f61e2a8436c9e826f9ecddb671331700090d7ffc7f99a72a82f2fd720271091bcf458e9d47f7460336c85f49c1338a3bff33323b28df61750f65de8ec95d17738c2c92efb8d0f5560431b0ca1e345aad0950b9222e974087b9e25377f003b688b64de1f71e9d146bce497edfa72a257f9b46f2b6a0076a83ccf1700b5e265a7e1979597f60aa2462ef26147ae040c22b38646400786d1453021b662e2957e3590174efc365c3a74fc3295275a959ca43f355ed1ec0144bc34db3f96193b9048e34c23b39e8791392fbd78b04768606e30c6213253cbf172053df5cd7f13197adb2696830af3bf8b28097c7d05ece1dfe83c334c23196ab9333ae91c569e524ee814bcd798a26d9e498c4984a68965f117c40fdc6154e08136b62faf653c2f247a25562b5a1cfdbe97d3295f040cafc63ad7834b0de8661b30abc541ddfbfb090a26ed80772079752d3226bde113379b46e4e42cb6df1788153ba41641d38a57e00cc3fb2cc4bc39a5244652be2177c57ecc967f675c5d0fb9e530f7dc115f3a0c8ddd436fd981b58687a204023a54c046cd0b736e6b9911f58a3237fea11519db1053a942bf182edc2195ce7d1bf7999c3931fa913c9fea07d59b0d76bec02ba545c4f5e79a3655813c33eeab483e2b37d81a49344c3c83fea72d75bad66d7381a1a2652d849cbf14eabd7fb30e15f822b9b5874cc6ca04506885e477de0bc5443055c683aad38593886d8d03fb36cb73b467a57e7a83747a658ef6463ee802895eae1b14241eea4e7d0b48071997679628f40af4c930ac922c46672262553c875af2535a7567350cb90618a5baef348b24b2b3e31372d313f2b0f79b058603a073f0c5f109164d30fe6b2a969582b32c6efa40b59a8b3b8bfa5c1982611c74c6faa00bb10e0d490b283e31e09708a8ad352c657c90cbe5b92e0e292567e8798811155cc5f20e089f53bb23d4020fb2bbd30b45047bf8f0a203dc5c0b29874be9568c2868ca593c51b5d6ef9527ae468f91ddc85e42d6d9c43053e4655096802462b3dffa5ba9c1ceff713551b8f4db116d3b9e6863e5fddb997e5fb8ee503583b69ad8641934d07d7c9555973621eed19c2a4c35246e27311cf38475532ee374478b626bb05f822aeea5dca0c1ed81d5414bbd9b3d8b0c5e02cd4fbe72065f50b", "525200", 0, 607907689, "ec4d92295e636458fe1217a012b5956d2ba1295318d677529315c4b729062623"], - ["db86072703859912ecaf9b5cb7e5345e0aa3460c01e46726bc9eea6b6562ea8d4d72b2e15b0100000000ffffffff5a64c671db64ff5ff1006281e39f5e62e898e4fd0f8620339f885a1b312bec6d000000000553ac655263ffffffff557ae782da530d1861ea4a5fb11f054349efff8d4552b4c9cb259a03ceda43840100000006526565536563f233c8dc03e463d50400000000056565ab53532d12100200000000075165ab5153656a0c362a02000000000500635165001f683b23010000000000000000bc40ab0000000000a15d86c7c1135a164e7f9e8e63ec31446cc36ea298b6c78fcf8544af2bf14164130d88c3d9206f5ccf08dd894896bcc3bad09303c916ca64106019567dd453b916bdbd22eab2d30b3f96d2f2e454288ce203f3d14d5477252c2163692e4414da00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c457e4c78383e56d73ad49ea38ece84eac86a64af48660c1e9f528db125fe54b0cc1e0aa166e3b899c8428027ddbc3685f79e17f52573e4a11d2b4c5a3e8a043ae3f6bf5e81ccb44a89e4160d7b3d2db799d376b00a65c5f3a6771f4ebe4ebf9dca09cda3b90483828e6d7ebe93b75a2ae4c0e4b5a19179f8ea2f68c4223bcd10229803cb626d175a7229617364683216c2b2c39e34d340ae402b478bcf68c8fa6032a3b62b166847350241e6c76a61364dc8c826228a07f506ff7f91ae0c726b2b60a03359b0ac7c3a7ab268eec95680f13fa68ad4f5825180035caa0f9881fa777011c048ad791d3c98709b192fdcd6322f3c7053f8c1656ea6289763f18c175d60c032d8b74be5b29d6b32083bd69e4c1801dffe17c85e39ae9bacd41a760cf7ce4fe0225b31c88588022ab247389c339815d4ed4a3eb8a2a0b23c2a12d7f4b156f3baa0312989d56288137e151664de563fd902dcb9b98871c4806a18e83c6abcf90757e0315888f79b02d653d02fde00c0ca1c32066226c7c27043ab16a900b4e9fde10210304a1299036c6f1c68090d3c910dc508cff1222fed5481ccd7c2a18d08ea634087f0ac4d602d7b1cfda58f5c44a0c8c1c0aec8f542429409e5a9b048c0afcb4f9f484e4d9b223bd0abcb3d129ab9df62531091cf08a1e6138e8a2c720161f3a83130660411e76502d5f1bcfe852cabb2cf1711e59c3e9dd9ac1ce984238017b9fac963e49454a7846863f5a5c924b550e6bcbb9d515ffa39ba9ef6eddb9c74208bc55fe907e0ae7951ff01f17377a580e622318a94c423a676a52f94495b4c34a867105fc19c4aa08fff63972a06819a963278a9cd8681e9c53f5985b8c77bfe9348ac2ca2addfd3cdfa41d9886a872c52d9de7943ef99f8a08dc8b2f637800ceecb7720d1e43057966acdbf5e97f3436eafbf5d11b5def466b9bba975678775f5e737bdaa7b537c019bf08d23104ead4bb6f4da4f60c1f14aeb8055fadb7872242bf2ed66290953a0077e52ec9c0531fa770598e1b8caac4056a022ebfad39b19f99e065038c0c5d33a424a8d05444a7a58486bf9198b342d2b99332dd2391faa30437ac753186766d18cae72faaa23b993610e58476909912a4c098c80bd53e7b8fec3206eaf19c473aa2c313d157dc52940d644713f8fa07b172c3943d9ad5140ff292da7387e21125dc75d4e922c2422b4eb47e21f855805def71414a871b580cb2a48e80ce4ef188628a7305becb43d862b174b820fcfddaaa370323e00d9679a0eb8c2d894dcfbebf2265584ed23ef07d572c0c66c1ae5e33abb38e949d8e0407dfa50c3efb669e63b74931c7c4b0fa3d07ed2601d4f78823b63e0a7d612b90ab4acb2e3ca58140eeb44c85c70f284043c4eda9c6a11fe9575f543802446e08d42a1a3d106b815a0def78781f0eee95e402d491bfa2022e1ceef6e9e31c6ec7d8b1b4adada3f969981ac64cb18859da69d268707167e4fb1dfaddb2157d74e8757a298157b64eb1073bb0d35326efc282268dbe2003251efe7242f4bcda097d474e45ef022a9a30823ddf7df29894f4aea4f58b0978155336c79f847d2df40e5482600c5ee6338c0c2a1615b200c4f2d1f1aa5c07effd94efabd1237e74c7c5af55620261b6eb1858a92a065a3cbee6a18effca88f213bc82d0f4b993da9bd17b4edc89535f0e138bf05e549a22b83c6c52e74110e6c5aff2324ab5e163a24a0f3af2e9072ea3d316af8b01d8ea3efdd7bc3db06ba50406816bc38d19c7fea4dcc930ebf1c5142bdd95119b70e9856f72f851122e60be9d3c8e7c534ec70fab8ea417056dfb5ff2fc4d39757ce13e5f9fc55c041a53fdbaf7b8af7cba801276f001b2d187b8a9ebdcf98628a59aa02b4beb49a90aaf36240173a3b08df83859e68bcd7d87e910c1e7781d91d891ef82118d725c300b8c92c4bc0dfa7c8aeb1cec3c1c9fb8d055997313115512e5d974f1f9e1298b49e01153bc81df6a6d8120a26bb43f0736fbfd7bf6cd13d4734f7062d70cfeeb43d7b9491ef6aeb36d5d690fbe3bc4e455493839a0403d904398ec3740c41416192cc28b163ad3eaebe2a8f9a45c6a6d9e43e20387ac7c7632337dedfbd8cd8d0df58471c4256d4c9688caa12ea0fcc11ba70cbed4dcb7259d1e775bfe2e139dab651ca1df7c6c8c6b11d4f278ebface64f63f7f240071cbd886b3902475380a0009cb054611669f2f8536a72b16c5ca0f0173e557c1e49305d4b6a2ed95cdcae1bba1035a364a63750572c5f8b3da9c865e1f25f84251cd3fdfe623af359fca62f24a1e12c3b253bf614f8c5bedf00a2ed2123bebe57e2008aca95362806dc0be8f64ac3cc20aff390df74b0b7c2603194decbf38846e2451274d1acabbddf18672cf3bffc0b4d0256b03e486c454e814e93970b878ee81731f04", "51655252526500", 0, 926312235, "65c4254a06c5f4b855d38c4b03920ace1f490b4bcefe139db103dd562a6e251c"], - ["318ce20f045c618f437e83370218f0992858df302769e8659c4bbc16da87c2d34dae3101c90100000004ab515152faa023e0c7265bacb5715713de25b00dc14b805416f8570126d083987afac19c52e18b370300000009516563535200516a008dd9cf5e5b7508fef9a1c726bcf4e61f6af7f51acf6e60ffaa8fae748a6e26db27e642ad0100000009526aabab5252536553449140aaf21eb651df525349716648bd93fa6dd7310e353fe2c060905e6afe230662c7210200000004ac51516affffffff01041be503000000000000000000033ab41f05000000000000000000000000c97acb084558b4ca90623be92f056e3293dfa0ae52d28de8f23f30e7ef229becbfc557dc11467cdef5a19e433e2bf3041fd2a956ea4a7256b706860bc02a222bc3a7f5a824ff40da0bd7fe0e878e58c186b4d303bd95655983110e809b0e6e3400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e506be44e826c4b21b26071ed8469713291009bb719edaeec2c4b0939054830aa090ea6007f54bbd819ed8ca782a2571a829c94df7a73f8c3d0ef6eaa521276082e75dd02202f736aac6d79e1a936926f1c7e17fdc7d61cb9d5a4fc8c6aa0f562287ff4fce6fd8a6bd9d7e45976392b57cec3137a0133abbb765435433695e27032257f6f0561cf6120136730a586771571218af561fb1398f9c64cf63e838f7660324fe831f0f5493693710ffb73dee82f7d38502007e999254acbded952f7856580b174a9a9c24a8e42257aca0a8098bd0e3a28ea1b0c2f684579c5c08cacac30e5405844e34db151a5ecef103379237f5a72592f3187e809b1c9f6b42b9165b1b11031f39e667cd6560ed7509571558c714c069eab0a11ac4f5dacdb110e4d23a5827032b8c9e5f665f50e28eaef22c570bcb58a9cdf5475f888fc94bed1bd87832cfa00321e9dfe1c3e8f4c4b3f8df1c1259805fe1bb4b2be156702faae9d17904617aab030f76f8504fa222a4ec81567ee2bfcc07ffb38928d9b6fa17fbd275f5ada83229020942d71db5eb26ae6ffca38ab47dcb88d6169599fe9359b91a50c49f50840df4d3dc1ea605715249d19eedeb9110e78ef5dc497657ba359c46032e2f9761d0003d45e7448e6deec27cbf62c79b8dc547280f9415af0dba24e1f1598d6cb565d4956b88065205b5b98ec7ec72e50c288efa5846888522fda2b9b7c644b39b436eda6d197d3c588d6d2e1c88b5f955480c255ba36d97277b46885e462f574c155989a8e2a34f7392cf64b346e1019e3b736fbbb6f6a28626767f29f2e8d6f4fa8cd59cf188a4eb58c2f9183e640b6daba0b0a5c638af77ce4d9f3c9ded19d8f2ac8c7c830cc5426373177b2ad83711c6507e27ebe6a433b5904f3e74ecd521b318569a9e657ca5fadf593369119e1521867175f056acf06bf5b33c92382ece60495068bde32bebd7719df32a2e666e8bf378fb9fb1b824d4ea5b8ecbfdf60aed476c3bd2639351ddc11160832c41d4999f8c14175dd2964898c15795a43efc9703e00e680fc762ec30d1ff1736f6b372dfe1d0379ca1edb2f928d6d6ba140d77bb89ee6e8d494a4e990defa1d79cd495c40a171b2eb5307832288dd4b18478afaae49ec62455f5f162f1c0836b44492c3e30c2164c6936113b340c71bb8193cb338c9b4ca4ba6ccb7adc93fd5468c1bf9bd3aaa41279aec1ff546fbe034d4a377acb83f899f13b260e33beed26a7843072b0b403b134e10a46e38d53bc2c65883714bd71060c6926c0dd8c5cf69695d55786908cd9812c956dc33711ddb7d98a84a68f087518f4a0ba941be3d181cad833c98822b80d3a70ffb53283164e417ff99f3f9fc006d6e5f549d8bcee3c67a0926a56020ac71afd795d58ed3824f59bad4f7cb9676ad2ec1f7fb6e840944ac9413c95f3b720ee432b94f2f670e96130b9ff383b7c350c799ca7d018c085edc1abb29a061a93b03af24eb50065e6c7a9732d8bf16cca7bfcd305b9bc1be1211a2b921a9a14252ec3bfcde02aceceb98d4b5985d092463402cc0667fe4bce2808daf73b25f93c9ad9b566b26f2bc8bfcb4a5f5f56734a8fe2794d495e0a580cbf125300f2a6c5a3dfe90d327d20635b18fbf37b3d226f60bb52ff915095c91f5000f99b1c98988bf747c4de62a72b68bc0b344fb12fef039d6f550ad6542c78bf7f9cf978f11bb7ca32b84d0dd94424cf4d51e0556351dc2dd168b9ef16575bf9654cc9cd49329155f02c46a89c5ddbc58b657d22a5905f0796083fd93f837e2adad2be5994930bccec145e8fdaac9ffdea98bfe29a58d59ae99e5b7a1e2816ae84d4a184212c61c9a3344163f696ad7fa23631e48b3125be3599e836ee6e74aff00def9d438f5687a0f18e9afffc08fa210d5199d83eb4c0c69cef70fd969b863b91bf9cacbc03839cad73ddc115849041bb243cd1dd3b543508eec6b3772228ac6456d4221f96ce4b04e85af96ae01a80a3a27cfeaabfa12734429d0135ba4ec8564b119f5811d0adc9a92cb64e07d6a6626790ebeb16449b746884b649324e32306c7830cbf477b6b86ed9df98022324aff207d99e22e8d831e334a62ed8be247023e6ebad1285243b3c29525532fcc90b7df3adcf15f9ce466956474ac6fd6d4c57852bda2109d13d160bd609adb67409b3e80ebcf3db106d0eeebdf5e5b221e413fa9dcf57637cbf8956b56ca7fba964bd350e01cfaf17bb53257ee9fc7a23d099036f6e140d9de4a5800f2933a506a50ff0056d06dd1ebdf2ae0cbc1903fda6f3257fe503000000000000000000000000b6d4a9f6bca27105187d482a94eacb4afb74a65dff5b7db7c41efc81845407eee3b642b4dccccbb50df4a7abb67a9a71b9417762ac8bdc28d3f464c3a015eb04d7eb63035ca4d3a877fca4cbd5c46f6be6f88625ac377f354e217f7be438e77f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066e6987598bb8898304c2115a9f36d9308a71aede20745595174b30e4636c8f938cd537268646d7b77c30852a69c0afa82bde71222ccfee6156f62ad071df096138450ca2cd1e0f76c6f45e26984a4097887a9274866ff4272a5ecf3498cb03ab4bfd84537fd450f82fe76e41aaf468d6fcf6cb122d0d8c5900837eefd98a64f03163b1faac5284897754a07b02565dfeae702b0521a071d3f21b99f72359b886e020a39701bc6c8f6f3f7f18946d3bfb94595f644f4bfc923a27123cda646aa09660b0f33c70149b34e4563ff32a9c276f4007dcc6964c096fec2bf1f4606834c7bee21cbb2231de723d76a4ce729c7d5ce0541c4741498fc81830ed2c3436d533e4f0310663778fbc3e54d9d9d97c8fb138946fa2d588affe39768d6677d5203a6c00e02251233484ef8a335b81fd9d8ddfee2c7be2cd410a8f02599dcda4a00bd23507c0205ce8d82e453015e99d451f720e3ad6ea0bb1935572703e97b17aad9487a3042031a947ffdf378dd824281e9ef30f3c2d486ae84786394759ce8e2435c06dd3b0f022325914468ecbda1b9af3975148c324d18eab6fdc606c22c8ce626553c57ed5710471c030d8eae7d66fd751aabac9d848cf4aad7e4c6d2782ea699247ac435eb45738f7d80497c2af1f02be6a06eae379b10fe8dfde4571046271adff626cd3f888947ddd3fe8ce28019951a349973568af64e607f3e7b7bddf9cb9138001d80182a6f6ae0a03c5d8675f6f90eab8e97a775fc2cc38d926350736ad21e54b2fd6bcb196149035f6801ed97b57468728bd732cc9dd9dc4e55301c91eadeeb9dcd14bcaee764e3af81f6c5a4297e210beba92b338124202bb6fb3ff57c87311a3d292f6312784224067541b38b4a24da7a3e4fbe0403cef8e956bebc8ab87b52a7f530c09492e3572b7585123a92842d825e109d2c791fb2e8280cd426956e61f740c0a4cfddad5335e9e9e7a714998adf61f0b6cbcd94d8602fcc1eb6272d3f9659c281b09e2f06968d095c7951dc7c6754fd8743c900e8cd7ece4eedfc58a0fd8da341a06d57b21694cb81cc23c0e1c58b0f7b3839a6db97a26826ea5e6fdf27fb936edc3ecfe85f9735e75ce20f8a78a6c856ea489b76946a70c4d1c5a0e8cea1595cd82cb009f6fc5258aba8f1c58ed4f793455c28b4b59acaa8fa0ea1b7b67bf0f99c4569ef2f15ba0e180b65c03145709aee45dd024c8ecb4df2d6f677e4dcb292d26273a3184650f7eee179eaf7edc7dfe629df2a5012360edfbef561363518f4e13b294b89621e512346981c39b192547106801b4195c0f903682352295c2fb0e1ee550cd90df6891d2a715f6d06a30b270e9e859fdaec7d32aa58a0368b30850d11e458f95a0698fc62e6cc9bd01b89894b3bb50640bebf1b41ee8d3419c795f93f067a9fac14994c61c79771b0bbd2cac58d27535e7d9526ba0108ff33f6b628741d935cab62fcbcf7dc91c63c50db5003357b6fee8d51dfc8cce0d5608b283eb76589a2c9d376f18a705bb7ccd90801efd6e9859ec2465898df035df8d391130e8212ead5143a9d5842f53d3fa45c6a4edc7c23eb2f8992f2756d716ef9e67142ea75e6965c33e511a36eff7557e1c4cec09354154eaa8e5bd7fa01be2a9d6e455a71eefb610b4bbae3ec342a508c3102bd370f5d08742726099ef9bf844db4538a8aef79163d2999822e27b7097b2b7ab4227850695f43fe02b53ea4ab7203983be56c81e29088eb4ddff7d7530605577093fa44d5ff74ff93e5a7c70db095bf20f437c0c6b22dfefbb59e21da44a0271d95e2371245ee358a9f1e55f3978366ccd5ac6af586a2ba0e0765029f15e3f100319ecd7d42cd0fa06ae7e5309793efdb65fac15b4c7659a0f35d41306730325b48ee9bffec944754abaa2cf25f205afd55733fd41b6179e385143460830f2a514b7184b832f426cd79dff83b0c68b28577757ca7eb508f77b0026b51fec9e7f7d81784eab9a28d3bdb7453178827238ece9a44b45145cd63223e5c9c459f16c2649affa5354c120abb77496d9eb9bd568f6879deb47ec7a30abab13b18f00b46716d9d0e11bc2d5295a70e752b7a5589a4b5f322185e6226f36aa7d73a87b67412e6e4d3d80123b1625a1783135fcf66b3cef1f52f8f7a30812843e07b441cfc9809e98c6a9cae1e08b925fca63cf71d67c23b650025b72b587394f49692822ed6af45765ace8af38ae0f1b721703bf113628968a7fa192527f7904907470c1897d0b9e4434b7f0b4bd9946b76e57f96bb510bddeb3ea8fcacfcc8625b10e00000000000000000000000000027a8580f9102b9833b08b6d65c3378b57faa3af2924e1a4ae42c063865f929addc95341225a990db25942661151e6c40f8422fd9362c3eaa3a1c386264d86303d9fabb9dacf6383910ed4f2cf19e25d44cba9891b7f660372bfd0c211fdbbccd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069621c4a2eea91b6c2b7957acdaa5ba30274eca645a2b0a027ac2a2342b232208d5f4b0090802e66ba397d8bbdd0d48d60d7ad03b68c40f05e2faafb1662e03a08f9e5a4c30de58b0b0e5e9ce56ac43a247bf5a88bc81b0767353dfb97ee94e55a9bdcb6d4209791662af80a1f60eb450ed9d1e11525fc6f5784d325f4faf1bd022644255391cb8db423d1a530c775be1e3b1b964d540a9b6215e96aecca7e2eb5031e751c77787b19cf4b5e58c188473e71984c672657751cca02bbde3b7a56c6690b1ed2952351c9e8e2d760b82d5e11b51a5b19c811d1898ef45396386dbf7ada52056d450554a65bec34503d1958521c2106ee1b8cc2001613b380ac9dc0834357032fe7da9b5b4352ea6575a32d9f868e4fe96ae294c0385ea8ddd8e2aacc14d8eb0215f3e02a642f19b6d71ec84c433e4835d8e7741c071389afeb57307c45c44b490200aeef3b29325e7bb246986655358357627a55697b79d1c78ae254ff5308bbf70309449a1224487d3c9c4d55f7755f18ce31191dacaca7b1aae20e8e3d8abdb09f032a5ce54217ba2abfc6e2ab5eba3661bfdabdb241d471b4e4bb4a539805a10d454daa6a421d653e579cb7aa7e934921e5b02a1f93818db1589263ec7fc492688d1ffe8de03d91030f340982fd9d6e9a39598f4d6daf77430aa059aec779a95c5970240a4e39a6781e87457492958811a0912920e1ca6688d169f1ed4ed97e70a0a8ff135dec707700ac782a7639bdc08239ecb240e385b2853083e72c9badfbbc4174fcfb4d022866dea38e1f647b4b2b84778a55010bd507a879d7dc47bba8322fbdc14b5cf18fe8d6ce24b3e0ab8049cf858a63ecec8c4db21ddf2edb8a559ebb903e11a37fc1c4af5d3d16fdaf4d10e022aa1987ce78aaa9def206f51a6726210748ff0fe09718822ad493b239c8440ba7b7423269d5bd7301f4bbd76d1b4068586ddeb717bfab28591ab8773642c07843dc0e12a310bb685bfe4d63e44b4cf9d9d19ca5ec57cfdb66ad65c2bbd8a7536220a28d0553c55ddd02b3bea4b505baf50f40fbaf6ee7ba143ff3f7546564fabaaa53e0c9887d27d2e8cccfc3964cc41f69da8b4555823a1443f197faa987abf67fb92b38149d5dfcf3f0e72800f984a4fa4f17808c5a82829298a0d48518ea587943827b791c22246e18a19399ce2ee1201de84aa713ffc213d35ea460e19f196fdeaa8089d64ee1d2a93cf81c57e2d768f22bfc85f9cc8417f4a80bba96f248b188a5bdcc3f0bba235649f735defe5c2e950fe15272ba43b317cf3668e8064516ed0e5ef719e43e7a218c814402abb58b1f2e9846e94d1a83e9e3cbec229ed2be9f5299f02579f426fb78f2a1b630b2fa278649f4528836a8cccac2b13af5efd5773666d5d183390cafebb57b98b2840a417872486138ca99d211801217d4ff5d089b44964a70f86e14534b9b18e1f6e704d9ee4424d745d67126bc149eb82f903a7b469215900bb26ee9c35f2d751e1935b0af18500c9e0892d1c439ea2fd7d97bf94ab0cca7ddfb9b729722e42779531915e2d19cee52b2d3c290534f048643f00cac490dfda16c93d60d883661d33b97461f338b1e21b38bb4db92f916d328750cee953d46ac95750f975965b262787ff46b66e6e0b2cf2c574ca53dd1fa59c57d1b652930fc28ad517977d79c810ed7f553b0cbeb3e20008441628131040ed11076d2dae53a4302e854da14af79b900e04d02b318904d2c6978b3e59d72f7a301c9590eb933f971a7fe02ab5fd7863cd564beb42e082bddba37be5e6fda9e5f01f7e5112049f79dd310eed0a456d6fa625f81432bd8bbdca8bc433cecf18ba7df7d23f96a06b139cb75eb68f71e3b9e89d589b87e5c9c9693a2a8d475d1622837d6f6492ec1bcac0f9e6ab0ce30831a279650fe8f5a4a1d49e9283ac2b51f81d8eedea9c62d766c3c43cfc3703d6379c0d6b86609b3bed59c22f45c1005d1a8f5e7850e29090241c70dffe861d8cd1d7cc7c1b06f76a470171e00cc109f1dd07337837b40962d4162919dd7f303a2d204f4360bb650974bfbd0fe6f171e6199779f22bb891d5e628535fcbed9800bed0f96cd9fd2a1a00be89d4bcc562305ded405394ebd608c0b3a85b365fd113a9294e8c93c33e5e205b7e8935a48c3ce52ceb79d3d939431aa0b90090b5ce6f4b856992d1077606b490e8a1f6afcca1cf81c6452c54f67533389addc2fd7d8b14d94faab67bde60ee0209633aab6e92c38f49515eee1ed2afaa06e901d359ff84b1d1beadb575446e42a26d1db955bf39c074fae092aab37d16d95e00f03d2403858daa0878e88be4b3729fdf645fe32feb03227bbf7c07470b62574262872b84d07efdfc59094a0f5710284b0dabd8b142e67a72a760afb7480c20ba2078d1350a810ab6e0bb892ad81d2ec82350d", "52006a52656363", 1, -1692392259, "c53e5005777471e5f26d8273ad5fcf42d3ac85bba732733ed01e5cf6c68953ba"], - ["efae88850299a9387d2097cd9a95061af63d04b34ba8bbd3ca3f3982602b2cb8373d6a240203000000016306a1aec02478b15dced285f5a5dded205ce045d1b90b011f153cd373b6ee4a0132f944e20100000000bbdbe83102da141d0400000000015166f904050000000007000065abacab52151e6e3a", "ac6a", 1, -66816186, "4a0e56d105f7a59c672690db5e55ff64dce529430473d72fa23e36045d5733bb"], - ["44a1886a03ea1f6563a5705907c7bf657c09531197519f40b99e3e33705053393f0bc3c7d6020000000700630063ac51abffffffff03055db53e017363fa21cb229e5fc91f13112b68c09bb0f0f2c62d28d7294730010000000263acffffffffe3bf963d3a50f8622c4eaa109f5996443ccbbf2d21ff78afd4b32983e65093d40000000005656500ac51ffffffff032a4ea1040000000001652ea2440400000000009a8e75020000000001650000000000", "", 0, -1471420573, "bf378b9d49a32cdc281ea4575d6f91a1b9070c0e0042f17471c5ae0587e20c05"], - ["5225d6ab04f3ee7b65c246f2be0288b9c1e7ea7bbc53cde36e18c53d0c4bacff1943626120020000000165b47686723a7ee21dae98875880c4afa53c11cb55945ebdc4cbcac8de23e7f21e3275effc0200000002526a1c7599ab7bb491e71d74f49926b9ff0d19d1a6a4c72e2dabed64631c3d7161e5aaec856c0200000002656a4d45d2c483e92faa4f63a7bd5702060847a7e81f70999fd517c5f1d5d72931f734b865ae0300000008525151535363ac63ffffffff0287944b00000000000665ab65abab633e7e8d000000000009006a536365656aabab00000000", "6a536a5365", 2, -2145572815, "eae16c4363d59c21e137614a667e44940461e0a157f6184adf65cba10ab9d859"], - ["91fb393301ffa03a7927df7856701f833dff8177023f236b7124f651cdc790e0a4d4fd6e6d0200000000ffffffff0460dc3004000000000452520063aa6eb5030000000001ab62827b030000000008516a53ab65ac526a4f040d040000000008636aab535152530000000000020c61a50500000000000000000000000091f4ed160b4230255258639aea1278529ca4139130c7d18a806b8cb4735887f2620a5f64dfc9637b823fd2c71a8646c072435e758bcd103eabc62e6542d3abf5fdb2876c941f56ca0b838c4226b28b78ab03e9771b07ca62b2b5485d2387a85500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000baa64f289bbde7228756f48fb85d991345c1cb0bebaffe168762dcc14511ed7f4a718c474f18d046188cd4a4724fe00aefb99945cfbee6a958dd231c8b19f58e55bad371f95fba92ebbfbf58a63405f521401b116957a0aa291c3d3aa13ec83cf65b16ce7b79291b6bb85e0316d4b9e7262cc152946dc1a80985c77212a0fa66021542c0be58194e3dec43bd76faa1f8e494be4f335bf04466d2b9248a53d6ed3d032457db19936fb3ba1989125e0b6d9844280593a6a6c3f7718bc95efe092ca8cb0a2b5582a046af37a505d69c928aa2ede842a0a664f1c8307d94532683f0681203129d19f3d9d853ab9ff124b92fd593441734d28dd82c230d032b2808c366f19a032dd6aab7dbbda18b1257329c1baaa27da107f10d325712ab16909252f20315c40303b277f3fc2745cb2e378f93233b742ceeff902cb52296f9a1d11f28fd37961e022b3040ae49527618d4d52f20160b8d5df3355e60f3a4869121284388dd5fa627032af4f0ee79f1d19d05345a8e4a5bdef3d96b52ace85b881e4900e39ac6c003b4032a00314a466b53583ddcdd71ad9b8a3f9e56a03d19032a270ecf35aa6f97402f3c79bdf9fd7aedc168b3d5ddedceb2b271277d9d78e520660d60e90aa9597b661c52f544b3522ee2e5bc750d45f8e7e63c82ed0c027c136f85f9f5cfe0be86e4cc7afd2cfdb63119757a7f748be1c89ac21efe58c78c9d78da408fc110efdb4d85af3079a5dd190d04e2945be5ccb4dba604042ecfe86602cc64e4695064abbf5e01f5c05aefa7c538190f025b5b81b804887764b51afdc49f2f771df2f7cc8b1489bf5d61e64120952c3e5191e71e9358a1362a1604c28f26d895ec3fb3d13b2c1750b243dd93dd93846c6702471a0c162806ef6cb9f9369da61b6e766b95a480aadf0c174296ee3333a11487e5109f4d0e27114f360eb4b7fb6c8baa57d45a5d232b4df9da33c8c00fee5c9c626b51aed81df3b4d2532d1d1a9cd21fe3bbfa2128580b2aad91f8e9040bd4ffa5ba9d1f08db101b69b1a4c9091bbc9ac3980c04cdc10df0e2e42d8d4ab3e18d2de1aa4c14e4a8033c12cb214b5ad83112b965c21659995f679032916ddfae80b3f01c89c06835f713a4f24e4b32a3fc688a46878510c9f108f0d290d15d75140a5fd56de77fdd158236bd91d20f79a951d2a72a1ac820d4109ca64e6c5ef6aa34273a0fe7a0f71644b51339db6c11b70f6c0c17059f49f71f2bbd1cc40e191463027476c9f592b77e4f3f0cea91cd4e088bd01b4e04030d0fc50845fe8ad9433f6590ea009d5106553f18df3b051b0c5d3cab9a7f53c3555af5948add3ac1712df92e6791def876f7f32dd4b3ba69ce7783b4be28e52dff6b650860a66846eaa16ff56d7be994e2f70cff3bba2f73c092d1fa8088a35a9bc1c9a5443480cf7a9b95b65b0f1975a3e9617dc2440908c2a9a87b4673fe629e5111c0fd8feb3d41cb8afc0970658e9bef3fceed6e9182e959e4b83d38e114f58079786282f74a9b61ccb84de208adc7c17e142f1846c0d187eb4bf5567a69c8486962831b1685e53908990253657a355d9d1c75df8b92267641dd24bb6b902d1a93a0bf0e43144cf5c3f2b691f02dfa7c738f5dc869cb08a8053cced0908247c009d8fd465a1dfd6053d22355cca83ffdac039407a79eee1fe6b31d7ecc8f400ad4b99ff8ae32721238a1d2276b4b1fe7bd307937f23828e0a2b61e20c823cefdaaabecabd3930cc2411310b5e038ed416b9c32370ca6168e36e681db94106834384cf4f0d81ca5b53ceb470cb71ec47b442a709b307acf6c0a17ea5737a7e3226103a589d19e94c44dd3e0d0e97afac367e16fe4c1a25f64c0fb221c32647086a283d4edb9864f11347a41e4e1420af372838ad79f8319bec1761468bbbb05fb7bbd55ddad1ede38dfcd7de9d1300301c2dfd8f08746b2661cc2f0c9fd429a6b48b68858c1829c7b2b3810e3982464fe205a1b5c6ff6cb8610e988323f8c8e8a4f8ebf463069706da328ba0ed02dd91051c09ee7724ebeff24642775e88584612b0dd41afb70bbcb63611f7cd1817e759e0e4d261a94a8b2f793a61203d65b4b847c5a8386bd15505b132048ea9299820953e2faa107d6d5da0b237347d5a747427ed596ad7dc1c94e45ff6383eec3ef974f79ba733f71b98b012939e7ab0b4e42eb528eb1dc8b9c196f4bc65c28f348b606faf9322a86ba9215229afa0378acd05e6ddaf365858e0f6b2b52b0a88d367fbf92190dfa511a33e3d3bfe7d19570f337e123ff67b2a97d9499fed9f7b7030000000000000000000000007bb00e7a5ad29ae56944d5c37e160f6c7d43b3f31308703926957224c62af1165f1c7d8b733ed988606829e642f2d0304f7b1194ddf813dfa3251c7c16e11543f6270155c31b08086df082da6740ec419331277e101a86045474721cbf0085a200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bdf050b062a3c664e6f474ffe7ff094dd30ff3b1ae9a0ffb01ba309b49670991d17a231658acfa5c70be9acdf3a212989aaa7f2a64cc7969dba13e89d8cc1811e18e0088d320d4b45211eacbdcbe82c6d2397db4e559900756689f75d566c2a4709d813a3afefce7b0ac44a4a12013c3108f0432d8985d6c1194e7adf1ee84e3020dd1982d091df9e20300f89672c3fe6e508ee651307b710b6adba5330f56ee55021ae627bf2697a75746f00b9e63c2b51675a44eb896ee970e4ff57f7884af04840b14c5d17372642cdc4668c469504ec78a80b2da207c41f674a8bfe4c4e5fd8dea0265b7f75a4d68d3495404dd9aa1b1db0d23792e9be824ea76836d8dce06c1940228434b3ec6e73aa99a4ca2f605fcd5ff0261056200cb187c216eb2954e89b12b032cd13401788e5692ed4ac1978290f816b46449e5627109e4b9c8ed617e993f17022765b6b29c766ccaec735c486fa7bb875166383e606de9e71323bdb8bbebe81a0307a01b111f43bab5a24d73a49cb65b9ffe33967460016e5a2b7c8c0a61f01e59031034b6c730bca82262e55ecf37a65cbe4765d6fddc804944604c6662f4801c037f9339c70ff6e51372168b22645c5cd98864a8d52ab19089d167053801a3ce5e7383aad54e77ca0011f8f6609012a240b7ca88dc2f22e2913dbb2b6e54868df565fd50c8542799cf5091dbd6f9144c05925d3115d7d92975a2dc8ce9dbc5dc1608349d59e49dc547250135230966ce207d215115fd7ab7388f9f539163c7cad988aa6fb75771b9d52bc1e97e73fb3abb1593d3ca7839ae33e3416815e4ff536eb9791830bdf72531f3fb64af76d9e614b77483b2cb22e1a32fbb06bba4b8cf00ee4d6ab3cc0ecb218260afd592adf5bc2c8ef0231947005d49ee0de6580dfb88742e6a0cc226a05b1e8aaff0f1233942e98a393d1a45910d6050d05127ee5dc9dcbc3c1f72d087e50769f0df7e5b61bdf6aaed8b0c5cbf0970b4d5671f09a15de245ec503b6a0b8525ecdf8756649cbda5d85a49df530c1161c91a0f86c1e6003f1ee487aa925bf0e4feafffa635574b5160ae4f730ab25d0a8ee924f81e154ed59bea1f466c94bf14bb37b9e4816fe7f05f5b12b45a18fa2d94ee9915850d8764eed413926c7aa694663611b662c9192a22d2bdb7ae2a9402104fd3ed957cf040d22fcd8caaf0dbdba7a2c87e7badcb66a57454006477ab2ece69bfa1562b4b3c9f9ff5db9acfd9b6c471997506223199843e280d1cbca5788c812e777b71b635f1fe8ad1b7191bb92438ecb67c66979f958c4e051cc210b20f9565d283c57050efd92a105d8d79d417bcb32195650a21d29647ffd1130efb31bbb5c9a2698c74a40456f79d834ad9c410e1bb4a106cd6c5dfcbcccfe9dd6b8811c78956376108fe8d289060ce12d1fdee45888961260cc9dc554efbc51dd7dfe44ecd529fadbaa11e4adac27334840b7792e18be2d683f88ceeb8195b376fb3f1bcb2a448a75a58ba726514259c3e5c974e7a2a2e504c20159bd23b1c361edadc2de7a7d436785154f8ff81e2e94ca33523c0d76d9b2852f596668abed77b48b58da003f6d74c1782b429ace7240068d7191b522f886e79b57c2dca787e41d431af883d9b3d9e8e301222db291f71643b2206c0c625adcbf9887ee221bc1e84ed59faa8adb603882eaa9340d9100adf56adeeacc0744d63a769a497bd3c2e91a3db21514be7a57cc5a9053d8fa67b7a2532eb6d452f9ea0d49015f76345788704626f707722060a5f5282e68e9b4c7d30a53b37b6048dc9c6e933d071d40eceab3511b4ef7bbd257ab1551c5e7da446915bc338e038b0ac2f52489695804c0117cbf627706a32b68a1d90d5cf566b069b70aa3bc53805e7ca7e7bda7bc9aacdb60101913fe56d6e33877f8cd3f6197e6bf666ab0b8a44b124603a10b0a2ac8b6aa4d11953a0ffd1084379b7d0996d0eba1a25b203be1ed5afd2fa8b18e9c39167c22889e34088de7c2d5d854005739b3e385493ef5cc61b2d89eb93d2cdedc8cee3b912b89ba7df3af9ba89ff3873cfb4ee40d432c3736a9c90628a31e2f272d5f1778267f5b3bdfa95223839f8b9b2c561289d3940834e5c0dbc190f8fbfa5177d08cf0615b78eb9e7b2b7b40b1b323019c19b24635429ed663cd8b8556cd4ae9c1a8a306b9e5c2dff348079dc7bb4663dd7122b25d9535f47c5a9dd222bfdea9a71f09e4c227a8f13932dc8344cef3dcaa0f0d571f71e3a2198db9a0bb3c9c1c5c8c5b6bbb591e53ee37acf10cfdb8c8df89bc9a73a8947b5165a982d78ec319e02c16010ce0a02aa9fbc1a19f4ca3a4d80ffc7b411450e915b4dd4f4007376bc42076abb0b5dee0eadf76bb49ad4cc9bcacf01ca995446a05bdb28db74b555b5510bf98f2b427b51dd330ba0b35b5dac7b6e01401903", "00ac5163acacac", 0, -1270584839, "1313d36eafffe046896bc685d84d85620799777588a4f8932094186c191a8ad0"], - ["14c77c7c0433358fcf0de5fd6293c5ba61c18f4e2833296b16b52d88d23d38e78b0e40430d02000000026a53a6c260280dffce3a7797a19feb89047c899ac487c99999523bdcbd7ee9c93ca3bbf938190000000003ac5253ffffffff636c6256772d3f6e0eb1bbe888276e11a3a4eeb1c0b6c3172442ee4095421a4c02000000025352e1f0a84b3eaecda488aaa8fd70769a1e8af3dbfb94216812420ac3fe0427fa79de4a0f090100000002acabffffffff02d98e28020000000001ac28ae5702000000000852516500525151530000000000", "52ac535352", 1, 1083571021, "673763abeb9d133b8da6ebc05b7eb25c80442e9f9108a956f85a3c7218692b09"], - ["620d3ddc038db171f9060e4b505b7ba54648d4f3f90280d6b815cbc08bc7d99730bad63e00030000000151ffffffff4a9b9d74a7b44a9259421cc17f449af301c1fbed02925be2447f7ac19330f4230000000009abab00516363526500ffffffff7fb91dc94f877d9ed15432cfd93f4c352721277aab76258e1805f9b1b80cf3360000000008535365525100ac534d013c6b02427e1e0000000000026a63f811ef040000000004ac00635100000000", "52", 2, 555319295, "90898463afa206339377b83203e57dba7f1357e65d376cfcdbecae770326cc44"], - ["1d8aba200271bf953d14197086ee4213cfa9a8994e4c0764ee9f6c04e2785676531544f7270100000000ffffffff0a2768fdc96e7e44aa7f4f237a2bba905fb1e83392eb1611151b6eab5baa969c03000000055351526a52e27ddb14018b498d040000000005ac530000ab0000000000", "536353ac0051", 0, -436171205, "99940597f26b79fab32648418ed103f6514e9890a4dc3a9a6fc5ae2468accfff"], - ["b88b11ee04bcbc12a34905acc5cd69255f394f8bcbd166be69dbb2d6a3eed2d27a2696413f02000000095153ac6aac5100ac52ffffffff3641e329c0b25e6d8a2345d03f86fa3945b65e52bbbc8d9e1f704dcc1a2c935b0000000002005283c075d252ffaf3802963749bd9617bd8aac83b43221c779c17c50eb437100f0151de69802000000046365635373100e0b72dea6b5755c4cc9d67d70c472180cd13fd9b0aad0b5207edded358dcb88325b0000000009006563ab6aacab6a6affffffff04d64d5e040000000005526a535152db389504000000000263acde27b3030000000009ab65515265ab6552ac3d3d490300000000096aac6351ab6a63536a00000000", "", 1, -1221938459, "09e2886873e26ca2c1d69a56423818c2901bb84e9d1ba4bcf677df0ffb14ab97"], - ["f6556a3302cac79ac24894bda9cb7c554af88da81fcb1490978e42b5cb7f92ef609d1a7fcc0200000001abffffffff0ead6cca7efd102b5a54ce3573fac6882f2f54d879646e0553cf4af7540c2be50300000000ffffffff03318d9e05000000000165036441010000000009ab6500655353656551df325f03000000000046d0828c035ac3cc04000000000000000000000000f8d914c282986930d1225347232484ed0c653d90b1bc0dc793371a49e245cfa58b9bcdb0aca5de37fb5271b882915f38c56382c788239611b1bda97f19cb8c7046cf4663337c1e5f00b7a4690de696107cb5a1fb551b5d95cd5455f7ef782e5a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007fc499e7ccd1ba73387238b89d0b0802f13e1b25e712afed726da519c0b3aa131fcd9877b683057578baf3d549e34bc318ac97220acb3b3390c102a5e6063a4d3eae802dd1fb4aa45a591d0cb8c4d637327b505ec29afb483ce19e6d4cfcbe3ca07519a1a8c2f42ed51284128d4a27a12d37b55220bfaba76f635a37c55118eb031b63d21ad1a6aea836c51a494e97761c2423f5ec29c593cfa936339e0abfc0440204adc64855042096006d590d99ee4a431175aa7f13d5e58908337a36d6167a850a0947ad6e5b20193e3d7a7050e249723b18e34cd31633e6db2f91cbbdf134eea50dc9a16c62dcf8c7e819c72c95a3426bfb3f1e12525021367b2ddfde4462eb5602097c21b44d941449df38e54ef7ee11fe0801227a21531e01acfa5f0e3eed796902296d93ab75c2b6a42735b603e11d46607c7a1b1823e9975076eda580a708ea41031cd6b71652316ebdabc56966f0d17b3fdc0ef2fe01539d5e13e33639e44953d8030c2a1e59cc118549f442decd9f83a6b2a47401df724a32e754b3b846924affcf02080bbcd88417fec72bdc14c4929ada23ee2fee8ac698d26444050e7cc12eb7b2b1e6837182f9e88f64db8b627d178a1479bdb0d1f5e4dc9c4ea8499c9f0389080abc8504bcf992056256f3bda4d564d2f2145fb152d84e07ca4e28830de45b089096921932cac39940ee9bc7a741a601f53d2878d95d21c26f567622a6de6130cfb968cfdbe72ac49702c472db342741e77fa863443e1b7cffdea9a83c8441601dcb23e0a49ee48fca4847e6ab9c2614be91d7f7e871218fbe5d94ab56cb6b93e4375c5e0a2c2d97f2212c8399ed5d253dcd5cfb9bcb33399c31157cbfb6f25a4d0cd1533d55eb2a7bbeb54fb2d37a1b68f543da91d1fbc0cd5dd4b31f01fb58aebc15f88d84ba296ffc91bce2a0235c7229a0fe602913fbe850cd505b2a0b8b0df28355337d9949dcc5bf1e99750820868e0eff8a9b2dbedd14d21848cdfd5aecd4ab2f86722cd70e9ad007103e691d04091bb0dbfb378131ff007927a205f0197be652db42868fdfe1c83619a5e41bbb773036140487e1e72c105efab2a685c51d63139cd0fd4594acd6023ff1f4b5b2d8050f0528e1596a5de863b94f5f26ed68e150c09d1c51532292ec65096f374292c2b13e354149fc00d0ca37a59393ebb8293a6df7c6fad4e8edb31ebc5e1fbf459243118382b6d0025a95669a080132f69943638333fe65af2210c07c7bce4ed65ccfed4c02dadc1bed3f2ffea7c3898a72256b64f31a802d5aab3d221e32c9abbb0db9a822ea50e9264a8546fb6c03e19dc265f036dd55b0de11a330b958d9ce4384debcf005f94d1928e6b8f240b762dd404cddef314981496acc815ebc21de0c0009ddc5253e30614af0fe461f132e4a69e656e4dca63938ec3b70d8920389ad3c96ceb8f86983d5432b1e7b4c7450311e10e4809e7b756492611cf238769ee7b5f37f9ed8d2c5fd23f87f48a1d74e76274a6b9a64e9307207fc85acbfa07ec188337e4535b01140e10e093f17d6aa4feb78f9858ce3ededaf34a89cf841a48cf9f4a03169137edf266ac0a9fa16b4ea68686a74ce006e52dd45aeb33126798aa00c0622bfa3c7d7acb5edd08bc6bab9e8632a38681e7e86991d20d09ae08e269c71ef909a50ddd246e96d36c9c858d8a8ae166dc94f4fccef69d00be1add71c996782cd4bf4a768233b16582b2b17601e458cedbcc5b260f4c4b6be83a14658880d261e44a55f1d779f5a5f34649eb92f597543f33f421368cc6a5c3e13f4daf4f1399651ca0024e25487418c9d8dc82cec9c5367d5f17d2be0abaf84e54302ddf5e42b4ae9744039a2d44a939b408087d2c0f91662869eff6e6839622a9924a4709c1e607babf45dfc64b51fbda7662b17eedb60c31e1dc1f7bf394daaba94dbccec5a5508894896792b7f877dc4d5e883d35ef64a53a3e1ae7d983404f99113de0168e4dd76be6e0f283a280047c637f3b59af3cba1317c8ec53b059c336321693e1df502d8c0fb66c2fd921d1becb7bff73e83145d08d68c7190af748602f9b9d1c232616bee27d4a5ad1c16e13ee96a6c9da064fcff74ed7e02c16baf2311214f2c52058d61a136a854d737aab2bf88e1b54c98c2879b2c2eb9df59cd99bdccba6ce8faa3b19314ec02ad90f8f469201c15560964d913786be70f40e1588011c392316c7f92114bd4b9d0831070126d9706b9021e87a513f0a60baff7dbf5f4b0377f6b7fe447f735298c400e56d3163b9b07456e1e827031b5cd188f00000000000000005f9d4104000000007b340546e53a08d9284adbffe45f52a892b3297292fecc5a1777329a99b7980539d1c4365b70d6141f14e453fd4366f1219d58a65120d68ad9df81d2f17b42ee246f3fd4022291ec76788f52715e26641174d8d242e929a5f31be3ede719725600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b66870a95a55b12c367dfebaf1b539481a813549b8c5f23ab51727e6b6ca39c6daca8a381c10ee54cd2dc94d1f0260eb2b56bdddd14ef6428aca50b9651d56ee05183edaf2d044e28e3439da882883821b8ee5273e6df72b91cf24788e7d58d12c1c037dfe89ddd665d1b0fe142f0f88a9bf0d37fafdb2aa3747687b1860931c020f83f36c240ff31aa82f48e1e3e9d82efe871302a9fb4acabac97c8a1e67b15a0209160d04e6b68a99735c461358267508b44532971481ea11ed232f5a9bb474390b2c714f32a5394bb90d83cc71dc2c4afd9db944d85d40495a2c700a9ad3e8283e0716bade902c3c8f79476b2d4a6daf0267850399472fc35b35ee41ca59264ef502025d567cd1cfd3603a25a6deb13896cedfb34d6491b918516e38944508341db30327ea082bb6e9ff9d5d49d347f6c02c346f735f2939891f8989ef18705c4ec676031d144b3978ddec1dce65bf0951a5a037041a0d9454853fcb4ac708974f681a5c02246e311195c68403daa57bc104cc92f648e7a81c4ac3a0e1b98efea5bd1bcabf031ae88c8dd188d8ea46ac273b7bddccf224c131da020e7ad06b6181aa0249875c3f9d92a7255728e35fe1b41d1aecad9c293f6f159a2d3341a9d0d45659f82b13c0f21c8eeb580c1160ef6e1c4369f464e018f81db63bb0177e75f8f1d1d347e3604693dc9adb6386efdba77d81558d0ebf45b3feabf5b450e06e833d75c9f98283d9d83889602ae4aaa5e859e7d03331303c80efbc9dc9f7623e20d3d3d0239fd4f42ef2fe266fe2f849b3539254cd02ec1681670bbdae9e907a52ebe6124f15bee779946cbfc378e35d418e46e5a4f51fdbd57b9b921ba209a584c66bf2fcfa37d7b8c5893ed204f2b4465baa8559bfaec5e94cebcde9d7b52844f21e5fb982e5adc65e0c6f900af39c13370775c995c4ec987eff486dfba964142eee31c83efde16fe755f3378e11611268b9905da1ae112f11ba7313af0f0241d13be7f1fe6d98553a45b34c24c35fb978930aa2eb45b0ee6324590cb7ef762cb4219b371cd298df0bcd08bfaee643f1a254a36050a615a8cb337fc1d1f6472a806663797b563849c3f0300a623d6d74f8ea65cfe669ef62e8214ecd66d39cf6b27c6eca6e94bc808c72784c42a2e42a6618c44f574e6c36c2e696275023cb917651e8def2f185cad670b445b82e9fd7822a19fd36dfd1e3ad32b49f825f551f74636d71c0470ecfcf04901a307dea718f29342d95d80b854c5c0d06c25073e47a44c40446c6b976c39c3f3ba067768c4414e888f6ac43dd54f43c11a1f0965c1421ff491b3ba7aa171fd700e112258ecf1c3554ed6c31b4afc0fe95c6e0fe335812afd8e07e9e9d1d0a6db87520e14733ca4d7ef570ad5e330034cd41dafe70de8e8727ddd530aefc124c4535437fa3206679873d39e5a8cf114299f0715628d0a498d111e1dc839dd5c1c12a877c0ddcffe470ecf35615a387ad775095657183b4bd331daac8ce8fd9ff84a304279ccd816d4ce8838406fe4ef1e0120d92cb179119a893f22a733e9803bd735abe80ff0aed17f9b5106ce5d05eb582775ecb41157cf6ecc48cab05eac56c0beda70ce8a24102d7a6d7fda80f3285d2b88834576494253843920046e632ad82aa7fe2933d7b4927c4a5977dc2c7289bd5fae0f3fdbfcc08f448902b5ab0c8e528a0fa0165ca5c6e718bab28c3db3d10bebb4964fdef227d2f41ba048ce6b25cfacc2b35fa11e4612989373f93514461431b14a434357a1a66967c2ef446388956014bb3d15900bea96cebfa8c4dc75763ddc73fde9c73c0fe3dff173bee412b0a8bcbf9f26c97511f4633fd8040d62f888c7464b3c8d30375d554c93e6ba25604c53d7c89013bb02210f7c95b80f987639d8b3b7bd351c2dc5eb60b3506629c259421e9b508d08a6dd60111f61097364f4b0383e0adba69c59ebf99808ad3d51a97fcc6347c919f3f529c905f2e4dc23de4e663bbb4b490f10afc5f5ba8bd173d1451c9157b51987b9982be105d12327f1729728feaa07ff93433becf42e3b89295bc13b9a61f5e16dba21d2cde0338b0fb8a1bf9b3bb81c0becbf8ace4e3a416087e70c3006b78489051c372b9d2f3c7053db2f263fe5820d71a9fa4911b54eb5c003f7356b222b48b2c0a954c1768faea3dd93a03b07e6eb89cf132de6b0e32cc3c475c6443f254ad07a01736bc13717fdd435de89b6b5e33a1fb13c74bc6f6c3c73af519f330c2f642f371a8919e0be28f77222833f1bdfeebcf49c2a82591fe2719497d6243f6452983ae010000000000000000000000009370defc1b8aa1f7c1a5c0c93f3b27cca5ed52511ba3477b735b0557fcf3fc4912d159dd2ba532347f5e43429b8083990328e012f458721cf3709a57a04a2bdbec90815f1d1794cc08ac2116ce1e69d76d6ee17a2becc9690f2f1152a2bfc09a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a29ba24818df7719462f8ae12447b86f01ba149c24d4c901bbb92660c7ed965a49e5efafdc30db6579f3fc2ef34f7661b78c78e4421357c0aa29aed2748ddee6bedfe5c5ff24e0680b44280bbafefa0768eca8fd321d4f7fcccbe5e09336131c72c31b35fa3c8d91c1c734a5aae4bfad163d7e920474df733c276a5882452a76021f648bbf4cb7fd6bc6b5c0be962a500ad0bd4cd7d654a1a75d3e7ff95d53ff2a032b1319566bc4a169c6a57bd801b0e4babb8c8f9f2e6b16f77ed87195039332270a2a2be9013d21ed64517f6296f1c390ae02133dbacaf8f979042e7bd56ea3e9151ccc49bcf8856455c843f7b6c47c274c0c1ed00c9201b24d9a1523dfb3d553d00328eeae895fd4b8eb6ac6ed77b3dbd94e7a798c8e2902b955442f0f11a8e9c6b8031c20b2ce1909f2685c03e0cd784071d5b59d60854f9bf48ba40afca0625fb354021847c4b08bd9b3b46850903b64531a2e6e564072c1cd7e92c3ea21245e2d1b89020e7f15c1eb08d0767a67ee79abd1dc1fc0e8fcd507c062bfb8cf6fddb98ea4770302849f1d9d8e1696351829abf0b03e8f8565c092b2dd69f5823b3faa907fef155c005bab0f9d702a8666d09d2af0b101fd319f83218539c72341d4b68059a0834423ec94683e1246e4aae624eee275557aa1fee01e4989278937cf20f8b1e6cfd7c5d9b555763a461a344bcf5e8239359ab6b2d55348205ea56c64f6222e6407cf4095894c375388963ab44144ff510d327fe074457d9ae9e45da65054f1381f020a38a94b97a1f83e02b13ceb08e91aa3962583207f6ad8dbe43b05ef3fe7d43fac8d41f244277cc472391e07107bd135100e16a1e03b3ebd507baf04dcb3f06c5a35549947d076e1de121c6c1a8ef2e8a63dea212263cd08045af2c536f2064c003f134d357920baffed41769f33cb1d06ac66c28d8efb3cac23984232aecbc0291160368fd5cbab08922c0b12d67bd16da0909a7a45137551748478ec2b8e747f59c8c5fa64775653a16e844a26f86f9f0dd154e9f7982c4841e102c36b1f926588171aed04876f2c725722b696dfab08eeeba44bf70204806942312838da545fefb75c6842f99141558d580228e8712b2c144444d8df7baa181d06f66f9d2180733c0c4b0b3970fcec916854f311b51f542288fb463fa7f04b5018023594887bec23ae80a76402794e6f6c530f90245121e691cea25a9e94f1e718b6807d260e99282992a41c1d13db6400ba72ec77c81729578eba2606f554225a593833793f328833229bc10397f0f9df0e79b8e420688f401cdf198d502ae1241c7ecb2e1f4326a48d731a247a3fbf931a54531a93cbb9f22033994bc989193bfd58c12d968ce21aba6a05b50c7cb8f69c1ba680076691ef86f116bbabe786bbb9a2b0fbac9124743a7e0e7279b7d1b603942751bd5e24749ac4d197753345118f7ddf760cd5d4d1693212045b8b1129b0e214f63f8f000fe976a50151e65519fec06f368fcae3bb338eab7d2dafcd3dd09116ee8eca38589eabd442df6965eb49637900f7f766f21b9f5afc1d4e9a98ec089609b3e6e97fce7ca6cfe2e61432ce68ed4748154b40cf6aa0038dc3561d3e72a9bbf7944ef9dcb3859ea73cd25977ae36da14f7d60e91af04442e3f180ad865e55bc4f917b0165505e09f02eeb137c6e4ef76a8db522c387734f29fa91f21742f6147edcf9194179f0f26b6565daeb04fc3372defbc6eb1dbe3df8ef834547d13ed1e5d110056470830fcee9635450ee1ded1c678c35f102f3de9c593f6f2eb6f14cb94bdc23f4dca970c25842c8fd17f338e87dd2674ac8f2ece7e9d8ec542b7fdb8cec6ceea08386d670e3b429ec212d15a2f66506b2882e2e021db32d136024003c774053fe5a3ed629523daaf744bb66ead26ff091baa299c1ae0d3e587ea29f3726858e3531c28d605ecd2d7aaef4310eea7594272095ed84ee77ca6f0f51708739c1de6e3641bd2c2f5ccf6e8557ee3fcb6f382f33fe7d5a09933fc8e4dbd4ea5b3c529d75f81d456c9de983832a2b9395ea177d6d864be05cbe870fe2e8cf4108e92c30b4257c992fa90fd4807f5cc90e255bede241afbe2ace56932ccbc6b0e6b460b1f83f576658057f4aa9b2f6374daf139737a35462cf9798def1349279bf87241366fdc3f16dcb4e137f13456ea8cf9f3cc7c09511423bf3843a06be4c23b17ecc4bb55f032aac3d059309aa6ca60356c4d2b5f79824729090206b839bda40eb9ec65859109e4ee5ae4fb20eab05b5d689576291d5e438e5f03b5edbc4e95bafebd934077ee88f0785f5c294910b43f0a226a9f2a05f25efecb7f9a19ea2e0b4f9a4360e757848e17cbacad94cb4ffffd36b8bda8b2573c4fe5867d877b3a461b5d321f94ff5bf27e4ae5b61a394c11cdd3083539627f040ddd8dea0b", "5352636565", 1, 243010429, "429ad3b623a4fdf5ff0a41c4d98737c9cb193f6804846e1c842639d24fbfbe5c"], - ["a252152002207934b706c5b38bb2204d91490fe3e46368590ee57777dcad0e72f074c3f32202000000095152526a5165516365ffffffff12aa3d95d6d184219935b8aae005380c490db2851fe82fdb7d0db3b978b2096b03000000020000dfbc7eaf039ff3340500000000001aee6400000000000033240301000000000853ac6a00ab525252880a79d5012d9dc401000000000000000000000000ba4cbe01878e1591722bec82604dba2eb21c4690c3b21525f1af722ad2f3126d2f7cde565cf780a333ef8955e49d5741244e9152fe2a0fe4c895a44c2c64bf3918b62e4e2726ccad039b3e2e7fe4a7b9249db9383678510515921c48ccd7a68200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f9ab3475a8cdae37033370521e537cc5eb613e7b20e3be1440422b6caa1e38a730df142ff9c92f1d18358332fd439282e3e745b2ad149b8e7bb5dbf9ed850db7d02370589242510f1fef4712750c6881f5c3c48833af5293af88d1ece85585c8fea30c3560c763a55d833cf327539aed5b8075c72753715722aff0805d2bd158020dfb055eee7cf64f57542d4cfb34933930faaffd5cc4f0caaa57adc836efc40d021e41a8849df0c893519520a06be8c8eab7f273728387d97dc9f316677615db170b20b9cb52575730390f558f883f2e8d6c206e233874fc746433bcec421fd0ba2f30474876a7f37546b4be7f42ad6c495440a3753c81d34a1df7158658b1a108bc030a3e9b3211636711de6a47fc010a82d461d376e87e457cf4cbada7db03f562ed030d3c22425278f73931ebeec82a25c68bddc0a133c67acb30fb28b1d5c6a0d86003118cea18624b9b025ba7d6439b9c4d459b86103330e1cb5a2493e0af2a214db2030fb6ca34122cc0fa48949f821124307a52cfcf63d5d5a4974bb6c3e7822fbb0702141559047a630928473c5d5f2778dc790851120a9e4dffa1f4bf142cf5d8081e80e2513d981a7a0e65ee0f8806aad52180dc1ffcc8c042f62d1c44a4280c4017f810d3539cab7ec5ed8f7ef57803ba0bb0f56f40baf98fab1e70f872d186d1e4837273d5dec9fc3e83b145ed20f5512b4c87a0065335f9e6e211256fae23e15379600fbd904dc37b646c348ee3457cd8a71c3c05c54de3a7e7563497f425a2136148e3ae229c4df65878127022d26533d6cc382c54b6640cbc122a6d9a3ec33c6bea8f108bea3ddcd0ccae6087d1838d03876953f66497c8e83c601475b10e7a04f985c4121c648ff5058802e569fc3883430f6fda4c593957ce455399e61a8f7846f418dc59cf924c063b3136f5109c6ff06e71dc59b584aadcaf8791fd74ddb117bf25fc82ce44acc28d76789bfd5d3919f6292bc23c76ec0992693697acb40312f657b3c8f0014e0580b5069075f3fd0097a2dbaf7f75fb4900a62ac1b3b19c84b1697c7545f132b9c32704ec20d7c62c18f7aba5744a7d76420c40167094ad7f838de122ed8bda673488db5dc99aca2da950e412b76b268e282a63e49d6cb76848c3b329de844d676ab0ef063ab777a8251ed22027ee825fe1a52e55ff12de98cebdb37718161be1d1455a32f7703dd84e01bf5b93ef50b2c478586156a2ce725e5010fe99a27a3b40630670e720bfc1211e7b6d3b97e0bbfee2ebb66933ffaec02a26fe9216f7b5ad174d02c3de933e767edc014e0b1213b6ae44b247a02beb9509be59704827f78e492041d9d14870e3d8a6a8c2f7f122583b28d3fb75f9b173a1b2df295747e86fd25f2eb63c6d796868e3f7442a566628f5d093bb4510c61be7caa5f6820b9162d802a2a742605d76960564478373ea7b3020ec28ba9a8b61dc026e159730c210ce2a2d27a4a04be0669a5cfac4bfdbb00e3008b35df2194bc22839db4a91ef1d1c99c90c9cd9db65c81801e072f39047d1243160fd62d56e43972a858a00881607e856bd238fa55a8682cc71c882dd9ccecc37535cd2bd2a364c0b18f2016be3085195e68406f3e954a6c60395186787c733290c9a71c08bf6c27900e38ec44be9bd3677e3ffa445bc6ddc91c03c72253c37af64be5fd6c3a355e1f544ae1a2b76009f3752d581cd575efe9f29e2747225cf97147e582976eb76600f0ffcb4c7c61237d5d4dcd312689b6c032ddcd3e7a6f9894014436cc3a1a49c55175e1683a4b886c7fa548bb47ebd4bcb146d9c949c1acc7f6c0fc7dd4c31d97d32feaba7eadf9d1a019946a714d32d34b895ca13db7c5fbc9736c030fee2762d99a066c9ae6a71269901dfc7d8af9c2ee7c1ff598108a6961dfac3ea0a9878a750eec3c44ce4d91b4ff8699c72181e3c52f949ff6b1e566195d25948f88e2329dd412067d3e1b846ccc8bda8e828fae164e6083e2da4dd959aa0fa9e16c640b44297b3315a54ca46083c0eb4a9b14bff7f97eeb607a8041ed76538d683deaee5b3c9df8ea0ad6b31e2a8663362849dcc9c7ab81540877a36dd4edc5d91e0b7ba08da41d0d717f793f5d221ffdcc6df5569b3d744ed0a63e7e633730e6ddbed936d17048376049de210516486e4d7bc7d5157b3a73cc958a3fa00108f3cbd7e99fcf55f258bdffbaa0dbdc39cf1ceafa6f6271025bd30f34723c1d805f3949c25c56fb922f6a43731c0585a1969a22ddd198b95ee1d8af4cdc8b2675731be49c395780b80e019fdc70e8565fd4a7f32246a359ddfce715b126a42d1e23a6006aee05255a421922d92b9cae9eb8a54a47b98127aad5beff7c3485db8647d7b3a53d1ef367387ae1502b894528094155d3f6af7e91d182fac8a73197f0ceaf31ba223836a7050e80f41a12c01", "ac52", 0, -1038755428, "b41c3ee80aec3990e01535eea14c0c0ef14c6c1bab95f2d6407b940497ef9c9f"], - ["033cf6c20156c448c47ab07a6fbe3322e39373daa3d853ec07b0425797a66aa02995e828fd0100000007525365ac6300acb6c9539d024bde6e020000000004536a5265315f93040000000006630051ac52538f3245f4", "0051", 0, 2032223611, "2823d7cbb65fe8a7e53f1a02474914db5f7cfaf7a9304cc676b0aa8ace80d8f6"], - ["bcfb201504cbc20e963db322f82a9b2394c776679555c9244cfd664fbf3368e8b6f247f82b0000000004ab520052ffffffff18a08dd51b2c4825563ff4154cc71db063ab601ae3f3ec38683aa37e8a07e2990100000005006aac5363ee3ab2a0e7b1c9679ef26641e3eb01ceea517ab379d33d60bbe5874e5dd6c5eb5491c001020000000853635200525300517c05c8bec8f9d596229f76c346ac37c2ee1a5d94b1321e4a55614ad6d12b4e5f6735a72201000000095163536351acac6aacffffffff02fd5849020000000009535152ab630000acabf6f63505000000000465ac0000cabb6d8a03e8849d05000000000000000000000000544138eb89f50f73c083ca71c4b3282c97d2879799e32a895bcf0c2ccf9ac3fcd640e4492174c94c1832adc6e9fc98ea2cad1360237c5407f49268cd9a57eb525bff1c02902ed27d373bf9786b39246dd7aba7ce0ba43912b9b6fd5314f501db00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000937d30fa45e8e50d5334528b93e4c196f3b659624156a02571f55707ce0d384be6d7c9875d1e8b8c0b18d88023faf6ec90a6bc4585e60c45bfd34182911cbd8fc5f47df5bcc529c0d477422d2bfaa3cde4d80c547bdad5e5804f4325555b029453f3094cfd3e169d905aedd53ef6e400f9378ed7c1f0b0b6d042557ab19385d502275f8f4dc3e75b195c751579258de3f0f3933e859eb9219d81f2b63295db82a103125b7e5535df81f86cf0a753b56def46526657fc934b91ef48d01b78dab3d31c0b2a8ec61bc2f5973c47b5778e873e3c19eaa09666c98054362024a9030b5fbd590f4b474d3b8b7e7d9daba2f80298f7cbb8b37c40cf273832e56426aeb1aab37b0321a84e6cf5844ec830a114ed3d534dc4b4049d862747bdb7c6466aedace5101d022da002378bfeb3f79ca2bb36f3138edaac8e865a1603f7e83c72195aa585bdeb03110f4d806be35aefc75eb129214faacda03281891b1cfcf417214ac8eddb9e6c02138feb666e0d15160d1302076064a3ced8663ac07d2d65cd7b32aaca614a6844032329b8c75af647de42ed5fd5bb803d39d793c5a875613d7974018a022cf08a4be334cbd92e8c80f5c824223fad93985199be1daee56dae9e78a2ac72f12a5f092793a2ac88c7475e469b9e1e26bdbc8c494df393505f5fd93ed384f10a0272fd7dc0142b472e09f18dc098d43c56cebb091943848e78c8258247589a5831546842066e28409bd2657ff5f6ec9f09e80b69b986990d04e890c0a3f8cdb4dfc408936e4cfc17fca2fe6479691feec39e325138486fa729f6f4002fb9c1c6e79bccaa01afb5ca0fdd8d2c2fdd813bc4a4109f586b52a541b474f5ad665d7bb934c58d6bba74105bc21fb84606cff398af46fae6925dc10e1d320d485f8cda602123f487b44f4174c60385c0f86f1a993d7d3d3e61726543a2a3a34c2cc46b406ab4d18abd52c71956c9b2e8856eede760b65c41e9c068a4a1ba96043420d2473ec5449fc4207fd40a3124532ec0bce8435495d581da5aa5ab9d251b22a8aae10e201c42d487339555634429c4aa360cfc2cb646dc5f90a3417f860a0b88e7bd9a6966dd8a83b24d2051182cf52b6f6d762ec9659c4d81a0b516f5b877ebf786ccd94c5eeefc55d94d5b2fcf1280b026397272b02cef74b7f15d605a8d26c4741ae83fb82442e80829a51072a7b62a7cef46ab4c0e6efe80801bafd2945cb8812e10f9ac206223bc3d094908356f318b08d7166bee05af4305a499e471cac5bab176251b26742d773b280b8dde633df55269fd5b4ba1d3be04f2592c43ad0dd9c41f871e76b5dc82848441d9733692ab4ce16fd31b00ba0f2ad0c87e417ca86c33cfc7aca9e86100489323342ecc6a3d76e1cf6989b61a5c79a5e4ee8c889ca3d93f1c9dccddaa8397d9e8d00d81a121bd432f19c6b8e3ecddf7a5fd42d9e5635f4d5d2af74b707f23a2356099ba78382e01743166d38196f04526e0794a83ab11be09a2eeae309cedd09ea6deac8f8c39efa8edb345a436c697c13f14c03bfc3ac1b451171aadde4288ca03da90c0fa6a7c513e5b426544d5bd51178afeee241b7d6beb1daf704122fed73d91502935297d981845de8d8b30754a793b1e4091fc7fad337eaefda9e5af89f6c41aa10a1cf04dfbc7299a4cbd361deb72b08967911f3b84e870ee887d312d988fb6055784293f2d240cc747924710eb6e45a182edba542a8e4214c436311b0afb7a3e9961d6ae4997f100acab5d3bfeec4fac5d5d08d91356b7d9ed081eac25cba88036357c44962a782c1a0b61d3210740a9d255dbb45c4a6d196fbaceb23f3061cae9ab3cc7cbbafecceaaf8d89f4dc250da398a6837c4ecf4ac360192b8848cc05736075bea4d824d1f45451294c6b8e6a32c251959939b8fae7baa10880c56905600270ee058b6ecd4c25d40c6d9046f65c711887ddf0728bf2da61ce710d5496b17a955de2233d3fce42c4d8dcbe073f4968c1d14549ac14c0595b67d84b6b05230fbbb5f7f690b9411eda4342a1f54bcc46fff6be45790873572cdd9b81fc9839843b65fa545e489d0a3dde4bf2b6b27d4f76914f86b7a27b48d62f89dde71ae9cc1e2de9513a2af8966a40446191b248200e30284f58f340001b5a45640200cb414b235b76f4108554a4fa0b8b64778df2c985ca0483c1e71fe5fabe2c81987ed5c2ca3751a353ad7a7bf7cce9c95913e2af9573cf63298d66db0ac55d2f2f6849a32e48a59435adf51dcd80d4489e770c6daa654b34215bea3a2ed6d161a03719cfe4c7000000000000000099b78c0500000000c4266ec9e2f9d7b8055569cf53b1099767ffe4b9621246abfc0b800e6971e72b7505ef968430d6f7fa31e6aa88347b38fcee283720e4050f4ebe9311bc55f3b09270fd9b7b9d6c637f8cbeb1dace2c9956c5112b0d32f18c4797b4a6ee1b60ed00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e9809efcafa858d09bf983ad132a689eac4e1bc51da8eeb42055b60cfa9c4697dac3ddbd9fbd641e3e280672ce5b1326f63730d6a9bcbef76a95dd3aef114ba04159d4a6e8a36040ae14557426c458c3fda0666f00f4e5895e9ab3c7cbad6529e78640a8507519304699a53e29c0c41fe5959c8bd6793f54649a9f9b27a6ea0d020d294d70314e3848a42ea4338634e68593c460fc89f3f8b6f19c27544602b95c0223f09b25a43e793bb3a4d7b2925c79cc10d553cd1b78a88f09971e74f89776600a2920f8ca596e7433ffab769097f10e8847992621130d68fd636e5af90e31764213ca69a2d93c548918881954e7794c456f6dac4c843303888bab65eb43a11d6e0315f767be76edbb5051aade7a5a2ad4983fb266f0c0962ca4ae618869d9bf2f4b031e5a5576272824a800fc2d45ba4bf9844a7937e658ecfe80d589aeb70d61ca1c0328d61ce2c1940cd29e073ac49fbf6cb0a911589898b9b35d214c0d3c9e47733d0300639a9aac3c1e800381dc8a1854c105d363884b008526e20842be92b75368ff021d6b863a2b92b946fed01c348102cc59692a8fd1957eaa1a3ab19fde850db56d0e427eec03a3c286fc8bdda71ad68b605575f83b9abbe54cf31ce6bad31c1eea1ffdcc31df258d46e257d5bc7a82a83632d99987444c27f5c90741a041a53800912731a8a67bba626cab7fac95fbf9e43ee6e35473970ce0e0146fe27d3a59235243766d4068c1b950de1e3aee1cb6c9c46660f08e34f28bad06fa7ef2cc0dc9303cfac9e2a725964d07a913478012216c5e9a29d516b48ef5bd80a9cecbaec3b2fe0cb7373e3aa959bf215bc7a7bf27039db2c2a1b7588866248b304c8f89b2110fdc7ecc7d87137403c8b4c340a31927181527e1edeecef64d2eea494d183bc4bee59c48c649de2b2970a8203148c62f26f82f57ee4027bb6be37d23cf0fbe3871e5d4053472c07455d854deb618db23b8e4eea1c5c600477d2d6809b54f4b81ecb113011183bb1b2aa59363f596a8ea33f032f57ee3725023de6c9f95eb7a1026f114de1f20000431ba5072957b549fbbeda9e88871012e1c37812beac7891026ef83dd4c7883b6fa51e90c768efeeed433216eb3cf9b2ce6a1baeb8a4730c8b61ecd4f98d7f0cca1fffcfd28c242a3d9994f0b2fe74f3734704a794a21e6e06c24a5cdef34c486fa9e0eb8b4d45708a886428f7ed1b185af8f230f51603b9dfbc91f861e215a84e4c67cf7b127751a7bebf40a361b69610382ce9707a2ccc9632177f592eb69dea2c07a16faaea165a90afe9b76e2fe81b81693d1f893fdfeedff873fb77f12c419f7369d2bf72a73399dcce0789080e71fa74b7204dad16c191a3f26732454ccf4e8c59df16570dd826239c06ea44100809b5c04d7a6efb4808e79d99e91decedb48b9a00b7fec9bbf19329ba9d284ef85be9cde7abd65221e95117aa9827721283f4c5e5eea14223bfe2b8c1308ab857e1ae8945b23a1fbc033a6ff0be7b82a652362d614965249032942a3e9477f7f98d920247b82b33c38bad9659149303ef0b88e35a8933390651ffcf4da34a3c8711300b3e59c55dfa4a950f17bce08c483e95701acb7f4a4536a0fab82c4074c9b5e4493f755d2a8bdedfd6e6f00d460ace8cbc65d61416adf48544e95401f1856e5bee7785e12cb52a5a1f46c2dc45fee91384e462da906416e540001d1fcfc0abc7de92e11015561bb88c8853be73741fd9d5ca3e848a8c8b55dad643238c951a5ed0bf759dfb90612676fd8a012e5503b9e2524f9f370bdf771e0a6dabc25d33d71b0e7e8c155b2a0fd3a0d30726f5da67863302fcff9f1053b547e299838e282cf796304152b107bd724e023ac1ff18f9088298a3e9f8de937da1dd7fdd0f7804d1c3bee5f6e0f6a0633bd17c849a3b2a185fe7d88d25f86acd4f251af1aedc9b2ceb2fc67ba7ef3aca78e850221136f05847e3b848805c52c05808056c8e4686a317c0e5dbc874bd2f5601a6f7fb9e20370b104876c53a15838a452bed77ff2518e9fcef2c93a41ff729a80c1c206f58a978ac56cb1166c58d49bbe415e73ece6e2bd2ec2b41867bee13182f630fc18c93efcf57ffe9299778142b962152e3a64a7005b12b97c89c285a7f44fe952566994373028a547640aa959411e4dff656fce82ea2935f57bed5a92f2781ac69e14393b357b63d8e77ef7e371f821c6ecad7a2510184a2d1eceb4f96ae90df0ffe35a7272943d81e43f88cf53181d9cf65322a77dd03ac9c96ed32909cb6d972160738c5eb38a29340400020000000000000000000000007d3ac7e830ee29c033f093a20f844e5f93407cf5722da60dcb858ec195560c2b4637950a1a3b398cc478d290551b7b7a0334085bf180bf1e3b5c88b3fde97b9ffb370d8f2be9ca8b72ecd556dc8af0dede19234249822a22c0ca409c5acf09a5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c11c5aaf82fbb756ab6653876d176e985ab91729b955caaf12b0f2592e42c7d3c83b754ababcb9c647e90aa8951eb83642cab539699a1590bccada3d59307a14f4cd38ae16e59d378ff447cc5cfba7b06fbfe074faa99116ec3a0414a89a963dbc9484db64f58e8d91b2aac7d7e0e9b9ff70bdd0927b2131eb6884ed579bf6602070bb2d751b808ab7f65abcde45b78d03fbb427bce73060f68d0d85e54e6ca710219e0e665ecef50f9929e15e2701e9dbf3e306b289ba555e3bf650575b8627dcf0a00a2ec37eee6d562624e25466f078a1c6ef4ba7c51f3703bd71a0a8db5602f121e3f3a94e1e93aa9d6004f2f80d66d91753f5c3bd50540036353d840b0253b0702246e5e560b3805ad2ceba58e5462ba4dbdffd21e0955ae9a6df9cfd9a1922b5e0325cea40202cc7872356325378d5bea13f40cd9a33cd02a54f9416b13d71405f903036b1b392edeaf871894416354e60416e9baf4d8c79f980a7fc01c6b060b2f4a020854a9758c455c4c6b73762e66eac1efdb2834c3c6c886f7f1f4a7026b7f874302113fe2b2eec1cb5857e030363e2d387c01fb43268aac4a356248bcf956b21ebaa9c0dd68f7f291ce55ee2d05ecd28f35d14a6d5e82ee6480cc23c659352061fa06a6a5b660a7ae29c121573eeffa092cfd5690fbfaf318609f74a3b57686612471879f7ca4ac9f32fa43c91eddb0875268920860f589b843af9317ee6327e42362f1cff1b0c5f5d9a76e8da2507152deb0aee9ae210176c1e3bc46e1a458bd97541ffe30fc3a103e7315b02016946ceb7fdd15ffcf508a7e2a431014e85261dec7b4c11a9a995b171769b6861a304d8d4b27fcea7faaeb5fb4108f5c88b8ed7540f7081fd002d6289ad3748b3546cb634e41498f5a1236d3a11196f3dcb1e5e033d560cd4503ec10bc20e8f12b586e743e16b208261e6b433cc8b124f2046bbb405ab75b27302f16f7f431c5476c9a8ceb3248e495806b685fd3c0e158028f78178834db60783d3533f54197d2bf504050039ed382f08036e0584703a560655ddf88b6649a0c1525a7754a1a19785e126217554caf85d3f64c9119b9c9c54551eecf43f0d0245cbf21eea8153ac0e1b93c2eee1733d818d299fa1431874ebc0fb50ba3599e251ea4f33fb64fb1cad68a50eb040bf13489702ca9260b9614e606e66046b090b336b8b8dd97bdb6df5d19727f3b2aaf7d2307828904cd4842f4ec79bbb1440a026eaf4440d0eb29b764f69adad4dd6f225827c5995fc59b1c5e97e2c501ac4edfcc5d3f5499d73092a0eafaf6d24786f7b4fee0701ae4165e9a243f598e418e3c6b7f69218219446995a4604851a4829c90c14a94a44244c3d7c0ddbf0703a225dd69ca153c5b6f500e3df94b05008b719bed021b1c7a94619a7116244edeef9af38661009c321b74e342daf63d346caaaade59be5409645d79ba3855bab9ba96603d03e2be3c65c188e46220724d8e50ccedcb1edeae170b272f6e73f7d3c07ec9df5dee7e35357ae23a179e38e2dca9424c973d4fc3ef42db0cbb305e0583c141b2c36de5d8dd64af52e20bdb9398fe39772fd86c67c4a6d14454677c96d318f69c49406744883eba59ab63af223dacf5310a28620d55ca8c68b649079b71925efc1546b4677d89e5bb2d8bda1e41804ad2d126f137ce9e42c123b5956dd3db67297f57e59cb4fb3d90a50ae3336eb8d650f3a47ed9d543c525ae0725b29a340759e3557a28008ef481ddd784915d8c939c8d7bf39845708f78f41e0e8dbd3a1f7148324690c37d6b20ccb12911e8d0ca26c48997698c03bc301e8d22cf2166b9d234f2597c2b32fe4f9f3e3c2f95bd014a0f0bfecbd0f915a01e978219658fd4836ef43fb00590c5f10f76ab5afb521b0059ff74843069e9a6ddfb5698806540982a2d0fc5dfb74f3d7d7eeed185e1feaae5166948ea8fb84f07d1780c910a9568ecf4ca9b9972b6c93c45231cdfe9c55127ef46fe4b4033186175c6ccc4380757a6f58364d05becf5ac5289aeeb3919e6c5c3df40f3b1ed6077889d17efd8a12d97406337d9953708757fae65d44502fd1d2ee58f2b168cf384b1e88b242c6cc3699e58323278218575b1f273523733127bf1c35629d4a2631b16780685cf566680a37ae91d6e441c58cac5576dea4e42ee4e8be8a88517b02cf10ba870c200061df9cb4476fdb6e869ce2b24bbd22ad186bf4e0995a099a791d0fb4f435f2394015deb9b3cd77b22207ac100865fe9b4295e4b6e774360269f394f3e257a5312b63d49f25bd22c2e17806f5a070b54d68a1c8cd4a075d3a0acccf94ade21b33aadc4f463b3d848b5ac3bef4e3e227c1cdd586dc4d3905571c6cee48a9d1000988ac70877ab54dfdfd818a81dd51afd7185c42200bfaea720cc5af4226f081aba456593f2dbb01ebc200f", "6300ac63", 0, 1988561694, "3920a8debbfa14008442688c9a0e861354b379b281158a65a36877f0356ea164"], - ["ee614d2b022d2eb44a11ead6c885607fcc6c6b462cba11fb422036402c3d18df5c65dc463802000000075351abac656a51ffffffff7474db96ab1123890fa7f645f5135445c373408de13f3047565e8e7fc4117f700000000004ab515352b7a6c23c02c2d4c90000000000056a525252005f970a0500000000085252ac6a6551ababb7ee11db023506ed01000000000000000000000000b505023e7512cefac652ce3c6de0ddd21523e159a976bcdd4fee046ada529e167c649437d67e614bf98ebd2f4cbf20e368de5220ce1b8d0e2ef6911d722c523dc1870ca9b52baf1118a486ed3d041e1871ee513d4f434821d26875d5c9fbf14c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e51bc38f540df82005915ae6173cbe6c229f3ad3f4b75a9c105247b26f71e1896ebe01ad900679fb161607795884a7a4d824cbdb0b50195caf569b0e54a72717da6758d0e420308ac63e93b3481befd914e36366e71760820e97752815236c2138fe487b0a65e8d8d907f49b0b777ab12e8f3f6730d2de28d76efb0128af76a0302af944e285e6826db677a966f0464fd5c4f5382ff7f36dff8e040d4b6f268ce0320a92be7dfc454438335c4e3d3ca516905b6ebd10ff991dfb4f82cbde92a3f120b14e189e449930c35b70feec174448e3b413ad0e0a13c9cbc622081f296b2f5250ef536e2f7c2a64dde153dd527c77d9e490ef390e44f7187d0cc6ab8561508980216374ca36ae0b1a3e8255af426a70fb9228100063ff81644f3462048b1724157020cbe61c6449aac81c37c9468d5f8494eb501e72b7bdd629c707f5ef46b39be0202034ff21c71b796cae7a9c47b2e1b409bcca97e56a3fab915826e7358bbcec2f9030b48d8ad632960a87266c430fe3752c3daee0a2c452e915e298dfbc36a2e3d0f022ab5f421eaab6573031bda4dc076563ea7b20c9b7fb0c3bd33451701806bb9baad8eabf26c8f043252c709cf0f937e08c9b14b8986db581148d782c49ac28eeb82e5a85bdf3138daa8f112c5126a439185d441295ca3811b567226ea9795cf9f9ad7d8ae9c43232d144b0ad451a4d5410b49f85dab53a8cbace0b08eca84263b80138b9321e7f7e317a2e5e74a448bbe7e90139b65e8acfd68ead939a4c2befd0df77bfc8a1de3c0c21fa719e2e33aa1614c36b5b0cfcf0df8e3a174c700f610f2e23c4d8d770e00ef9946e0acb9f7d73c91e42f71547299ae85c5a099ed63c606a83cea5dadc11352f4168b56a622b25a4e55952dbc703d24f49f16c852976d3b168f153a6979996282fe73832796bc460c68fb04c2ca3223ab43e1e20cb6faf8743ed48d03de103dc07698b806db37cd1067ca2d7cbafd3342e0a6505ce601d5bbf5371d1e461a974d4c727bb9a592126e1e42264fcd156de30154bbdc382224bb9a1bc76f2bb71b79fc5f3407c7d625d6347a68d575cf2548515074764452337f84d16609b8b1d2c51a028e71ad70fa2c8533c3d5258c5de7ee0a82819414213e11ffa932e73ec17af04bda8977b6af7f3707a31064367ebe99cbccf1ba409372bde830c7c15d07287fe52b6a41a83c33a148b30ba2f9b56c3c43e2f257e4f726c39b944849b6b51e195a5dec4b979049ed9b57e4c238de10a136d80990dd3527723d1a8edd19dc631c4267bb69e124f1fc6906b381b81bdf737d71434add7fdb1c6ddb3e15e39d031bf8f97dd57cc01d99f86d12fd49f30efc74f3503bf640236e833b5352d233870d59633d99ea374a6a24fc6cc10c0b84ddef13f680186c862658ff15a96cb925fac2f8483249cf9a83017bc4a8506cd4c695c88c7b514405dead55e7c367f8fe1ed8e529c528afeb9c452c6c02e1c2286eb87af5970838c055fbf12ad7cdf6fe774885c2a3c832170cd99cdc46c1c52314c51fad61eb481d15602b32071a69f55446eda781e8de4f004a99e67697df091dff54b5e75d74a5a5fcc85eb1a484f874d729e46d251a2963db4b04fd4651ed3b8489f70738692fa2519675221768a15ce42a61eb90c728c54078d92e6cb1af9edae86ffe2b4c0d0a8e52b2c190dfad052678a2ceca55a6b9e5cfce1cb2b3ae1d6844306ed0bef851499592304eafc202fd073ae08b2d0688a040fe3a0959d460efb94e420554ef77604c4ea574b2c1b8aba4ea84c75220c5abee520cf4090018d2bb398749c1c5f00e8b0c4ee7909586f4e7fb20175b50cadeca7a0b553d94caab82493bc9c20f3ec33c674cce19d2ab655147d76e5ad4ca1bd8f5289d78d5b3070cf41d3d8674da3247436b019cf31cd3c5b91574b41d8c9cbac68886c39c4d66b10b137111531e3efd54b08c21634fe1847d87cb51ff8e1265495920c6139c445e0c5f7fb2c87c068e73a98874cb2c3830efaa63871e1841e95b03862a3c75da39e79d1a58b45f96038f16b0d52f3d1dffcfa2a77ad7d031d5c3917933e0cf87133e297ff112bf56876887314d439fe7fb622fdc26a41b4fb224aa6e7d65d68704793f80ca41efdcffb2784c09e1cee276fd44778c438afc62d0b77fe4f3195870bbd112676de202dd9fbcc3d005fb8dcb198556c1645959b8988fc76a6ab9aa230d2493bc77b2533e42fd8829b2e249f242ad408bf3c498e0ab671eb1440fa2d474346fafc6c8c5c15f6edb5e1d51d1d9b8377f4ec5aea589040000000000000000000000007e248f8d79380b0ca2be1b3ae157df42fb1dd73cd8ae3cfbf880e0a6d5130173fb57cc71363c50a2ba00fa181aa17a1beb97f378fa26ff8aa4939239c8a023fc48650938ebe525ab6bafe256e03e79a3ad196b020ee0aff6ce422386e659d39b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004cd2f294355b70dc685d1b4cdd3b05087431940ee62d7912472984178b4c0e637234b90ee8601f98647a2dc6e530179d4eb3948637bc50dc677cd0c898ac9313f52e5077401208b8c0d7b90e028843966a8e77975848fa4e44a6841884fac3aa6badd4e49057a781c8929b9d2502e7f22808593d62fac74840ec91468eeef055031946c8911721633e372297d48bf39b37ecddb6d92e2c8d51d8fd4650f29b3563030ded1229f5f93412222d3f27c246e6fe1267949910fef3766a7b2df5bb80803b0a2f0c02d3712ec37d286a5946ce0143388d7df3df95b4e7bc8798aa6ecd64e82f15023f89439435f5ea23e8aa00e332887171c2da6cfa4cffa136b3719f25bf81032dc2ad0ef7078576d84ce4115d907ad662f71fd8910aa3732e09357d4e5b9e10022a53404413256cf167e1566ce5d51fa5e7a995c097649291dd7c721c68f61047020b0d6e4ed675e2a0e2ddeb8ef5265ce8f99cabb6f4b19f923ce22c6e982fdfdd020a8e13d01f1fe3bb63733dc9af82f134763083e818af6922f86f9aaaea71364202192222a7f5f32d08363d2a13e7e66db8525c97595d7b01eea1bedcafaae43b20301ccd4a992c0644a046872381257e63ddfde0444ec1eb4f5894c6de63a8c09a2e250ff37b14bb2cd2aa382e83362e7692f013ad71a7fa9982dbc6a6b2d528823d66f00b54ac7977a0939658343b57eef1dead7dbbd75640df7ca7c64e043480005248d8380c1eb6ea721959793b41639c5e4bf94d9716906a0e563a92bac68ec5c7615d9e166b18c285676a4e146799d6142683a8e41385ed3073e7ee18c69a7c5f2b08ac2a2f157adefac51548895c036dee7ea369bd1198a3494bf782271715dd202f6d8e3a61929096e21e3fd87df8fd7d6aae5151c90db4466f58111184126a7bb7070f76871f4fecf2f47b8a8f8e6d51952e2e341994c775765744c5a477c068e11eb57fe12e10d9ad50f39ecfda52f80fe420c4abe7056778022a3d3f14370916512edcacc4bc37cf87f571074cc1bb596300ef63c1791a6f82b3c2afdb66dcf228564e89c8ba5030e3d847b132d843ebed30927438fd8dc5d6313483bf35bdb7eda58f8dcfa6b0b0d432a1b0ed2fdc2a1f0cd84b877e17135fa3dfea895a484535c619fcda58370ce1a5dee8c7a6d9c0cbff5162f9dd2f523f3513a0d0ee55d47961f3e8c285635cd3f4451a5837e1c420e4c90b2dea9da54af50f561aa82faafd7aad7b0798d581a560d404ef5e292b1ebb6b4c42c0c3e9dc84486a204c9ced417e9a688b1930b1cf6fb5da22706ef5bbb6aab91bd202d5865fa7ec118659cee2c74b0a51b4d634c2b15e778ba02b39728efa422ffd58e20b826256b2584586c967dacdf9bcb70d2880ce2ad4269ff4efdb5a290da4d7eb6267a171fb03a481b149f8b07cf1d7cfea9274b439816280741deeea541378695d616d12e7088f0adc9abe718033c046ff7264784a567ef13b0f7e7a76efd9b727b902d9a778097879b14437b16477017ddf636016c262331658704ce2191e43a6ef2cb6551cff1b5c7fe75558d5eec1463447667bd49b3f9f09ddf77b00ccaa6fe013252cc624163f51f5d033f96b4ced711b20326998da8363d34ac657ecdcdaf4e8821109c535978cb34635a4272598a4432b0760620d9bb3e32e3c841ce0f57ca16fce84e228935ca12eb91712ad2338ede5a06789d47bb0e60a7d6b6404c1ac9d4d1125fa817ac2fef67f14b9367116c5484da864455c0dcaf635025fe8b5075cd0bf8e9365528d8da4ddae78410c0b9362b092931082a82d8f5d282d15123b0cc9188c5a722e52070d0789f633610d17b9bfd8ceaab5ea3d3462604bceb0ddc5a0ac8bb519501034eb01d4b724833f72d447be563696df42fd137ec23db2d6289365c7beb07faf007e94cb2e8d726a601b2158f320655b4b4c527c28f771ff95c96359aa56b4753595e70c0cfd5c2579524a8c4d3d6a4d5dc71efee714f0604ab0a4b80f0bc19a34c427c761317d0a0f0f7f4ba052f2ffb7f4a5e961f6c4480872f6842e0b57cf69ecb6d9c7dd1a1aa92f6307ac13af1eebe90ba29c1bdf719ff7964bdb1ea7de6e1d46f7b3b467d2b339194f1080e585a00a288ad5045217008feb2128764037ed736e4f22f1feca2a36e9fd4b64e2121cc95597b9b04d0dc3289cf84c7aab8fac6c7b92c55d3fd88bd7bcad9184b078b9eaf17f5496f4a92efa3c16ec5f15b7b74837dc7f3b8fd64ba19406906d39b518dda12efa967ad5325d5aae199ca8369b13805b4d9899923391563afb42e0c23b8b7050115cdcb6a324a444bc2926ebd4a65e28e5d36f17c17f0a6a5fc3409ef8f0ada4085d476c05ca71b5a077d0e1f410c6555a0c7b2246939adfc888eadb2a2af2a8cee0f007694479620c697dd5c1eb9b6405b562682589a608", "", 1, 1669333877, "4e0bca14bfab687a86c78b5201fecccd4c6c0aac072994a6daaee07eac1f784c"], - ["c5bcfa2703beb79e4a9091e469a2ecbeb8702b3e51892fa5e900a05cea488b0d65d9a451370100000006536a00006563bc3c4782a559c1c0763a4201cb328fdd4eb89265bc967d9bdb43bd2f3a6d175cf8da9a250100000009ac51656a5251ac5165ffffffffbde0364e9d09854b6caf19b4a4bc09c86ce455578b5058538245c6b40354a31700000000086a00006a6a6aab650a95855204effb17000000000002acacd54ca80300000000076a536aab0052530f9c84040000000007536553ac5352ab70f5140000000000046aab51650000000002000000000000000029425105000000006482e2630d3c1b540c65b239cc10a2a6951acb7b257fd6ff86c1c543fd86caa7a4c2c6f9f802e005e43e0a6f144a7a62687b42f40f4e569d66acdec06c34f20e1a5eb6896f5cd970a4552b5f8289472ca60613b2d0688998451b2a2ad8d02fcd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d195476790f30e986dd5cbc839af1f431afb3f6999f0492de90da90c6ab31aeeef3428262394fbc6c93f176f7fe001f830d412194f57d840edb9481bcef7607a59260225546c8c3531de5f212447a6025c755e663aa4cef6df2e29b3bb86766f4be6e4051371ceab1ecdd720556441ea23c8b030356880dc4c2e07142b1cc3b03177a4e63e9dbe7fdb5fa5293e33182606f8389eacb1659621ecdae478c4d77400223e1f5eec2ed6f2bbaf0810a24d7ab4ff7ada8d2f231fe06761dfda9a096fb680a00023bc9f2adfc1ab8d59ab1d06af0d84d2ff8f88fd936051df1aea85fa332d21d4960d2cac35e977a51c8a081592cf09951d45124d95e0c4b9d524fdf3acee10208e4296c1cc52430ea8a257f8e916150aeb1bedaae81d10ab429edae35455bf70201410f1ddb04369043b438142586375025b36c43d3dfe1ef87c920f6f867fb350207fc03c5cdcd084140fb1fd87c81a7a014576eb81d25356c6e593337d8a58c9f0302280118b8ba98032894c0ca067f95fbb0a7e746f606bd60e171931a97cd602b0322ae62c7f71f0e8f3d33cbd916cfcb15bd4565858284a304d31ddd79e9266aec5ff1567b96e48f810b8dfd90025d4a042d06422ed7f7035a79a0fc6d7ec977287dd96027973cd2858ee4266fb3ce0c16568d724c3dc86f0f00a66ff678cb5ce00c8f52136055ec0b2f3112509dcbd2f255569278e6975594e8d4620f39b4bdb16b5938c454c3540f89de85aec0343c3527354fb79830c4a561be296395ac54194f670e5a7d2bac6e9188063a9e48c54bf6bce4fd9b451c31e26452037fb383a4041713295ac899adc903de3d65570aa4e89e806f254c5930f9c79265a60636b0a2608765649cbbc03de190c81e670fc19c1422eea622191b192d584eca4ff3eec8acd844e0d165c01b6ae77c16962dadce994a7b185542eba7ee78f2bbdd8fc7137765e8f4c65e44a865ec5f6b868df8674da0d6cffb9dbcd7266b5282a9d57e8ef287310f5ebe60e6e105a349d5a982202c76f2a493b5fc823b82795fa4950720d1fb9974c7f6bf13d776cf4a6200169aa053a1118cd558491e4d4579318c762a341cab19543a6af8f0d165011c4a3ef2900f461ae9cea3c58580acb9c5464c9a7e1173d1e5b2a13004701759016d92fb2f0211faab39c6c92aa42076476a54bb4efaedf6af79492be374576660dd69898f582a790e37f90d5b0e950d0ebb7bbeac8805bf21a731ae5fa89ef207e4d581d428fd3e1256767520191130de825fecbaa25bea41fea06a614e6e9b61e67847f21d1ec2f05c637e125cab490d4bb307421c6b39f3c536dbb0e965ccc5753931ae4274b93aacab1a1456f6fe69c91021f43d1eea1eace6342bdd3e17c4410bfe53d4d41861985495b0d289ac02597c2d32dd69126a926c01b46d058e3578c6a439f1e48a411a2ee414e47fb2850289cc878c18fc18de2b1a2b72e6713d8ad91137bf30774bd7e6126887c046bd741c1d65b23f5d1f331d0162313ac72b48ec585e6b8a2045a88a355ff82fe6e08cbb6bb5a7581b46903db1b1f9780ac1f1f0213b2c955c8f030deb1a5f6c834ffef70131e41e496c8022d3e3800794dc0884393fdf0ccafb582b43099df1e4fe0657a96a33c364a32c58003a4e5360db03e94a817e51d07613bf2e4ed7c8d3c7ff5304426cc44af3f01f5f3714c5b5fa36c18ec85c78ef5bd8a8a7a5acd5cf09a209a125a1a6f26fa4ed811cc388a9a90987a388cbf83fa1f8960ea16178606c031edb4200b8badfb1d77aff0c4fd6ca4116c9617af7c70f2245026c3ee29aeded6b9e34526bbf995df34d770d65d268955b8025d7d64f3222da5c7412ad5584a745f15be53b7457dff235fa8840fe2d825e6281ea814102e5bf77c796080062418cd53a0d69be78d42588fb43cc7224eb30f58b44fcd84ae6b8ce356a9c83b2dd8137b9e8218fd8c8a265f9ebdffe87b26c69e5d36ab85c66c781c0c32ee9d276f87aa7f2914cdd7afe05cb7b587a7841c1a8e56c5e65e42ca6071f87dc0e805e7b0cfc2a331635f900b091f95fcdfe7ec2221510c48e8c66f7a1fdfcb2ab9851b90a622f77ac8587b896cfbcaa0f847e9c8a282b2465060293fd0393883d35ae55b367d11b572bbe28c80f3fd653cfe94cd05b2a4e9212f56868733868482503dea7a236c4bd8d96aff6201b03281f1aae9e01c0ac12853fd50ddd91c18e6c80b51600b3ced841516d3fd2dacd20ccbe41685a32a8f8e56333f99258c631795165a3dc34e30ce48ee7f545c75ded2de0179d5062bdd403000000000000000000000000a6c76eb135f4c881a7d8b85a75717a016af78f47c6ca451cd8635c6f997bd97a036334ba00f04679139037facab6d49e6ab2b1e7d3b186b2b0738ce16a795f2a1218e416db0b80d20abbe228546affdb41eed6e20e4e331c2ef18fff35eb2f6d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d03dbacd926f3f6650f7b6d0ff359749c4ff0611a88f3675e2ed339bce2ae60d1fad07a846c5270b525d27b08f93643291f074ec31a4c27021897a0fcf9ab3fc97c23407517fda4cde02eabfceae26753b1d36731751f30ade2e8f4fa79b74f7783242ceaac859dfbbe5951c558f42f0ff18203003d146cd3052911c53a7f8030e6a884e6a5c32d3450f681aaad19cc6a8686d310cdf7616c227289fbe84a6c1031da3befff8eb05785af83180191abb69f05d584532f7094c2e61aa562490c5f10a17328fe166ab59ef1814be56c091cc57caa8eee740c03a8f16cb74eef580b6a01a5e59768d3f5b5b162d13d8ee019048a28009ab97ec9a79e80869236db764f70200e8bc59ca0d2b233f986e2a562ff15c864f530c4df6a3bd8a96ac85a7a4913d02292527f45377cd80634769945055f44783f571d066dbd3122fb3131427a11b4b021409b570e22ee0ae745d115c4e78c7ea57ecc576b7c82317f3f08e82f30dbe18022b9ecc11498e7f051791426276c0cbf405db76ad5ffbb9997faa06b56474d27d030299550a79a49058d0b0867c8fb39eca90c8ec06ff299113bb8b659cebee2a901845030ace259fce623a4cdd181cab678ea0ef1a5fb071b687564b8802198b306c7fcc6145b358d9e6d386f4c544a90b4a63582642f5c52d89d1d492108df5f7635ca1ee22bbeb119c6fbfa5dd5d42e07a3e63e34d0c4c314922d33653657ee4936173e53f45c6a881bd0ee5eb96d5057f1addb2fd78f3c6b34729de8fbb7a40aa1e19ea3a9c6d424391cab85458f47104aca7bf1b093c1bf0e9d83c1d8acbbb21e6760e4020c4cc800655e8d26a283a429717dd5ea90a4d9e1f5c179f5e8154e8f932f5aa2a652a0cc280d4ba54889d5838dd69521a643caef1c9dba3bfb394f0fdf5861cb459a3549b5b65a6a96b92d18bd31deab247d2259f349a3d82793464d70f5caa6dcd6961f1b2c83d4b981cd2ef22966c19c534ee94160828ff15e528149371eea3668a26fc1f86c78b651f1bbb62c6d38313876bf79954313ac9316097172b3df4dc8f53fa9248783cfeacfe87aac91a6e2f64f63d5cae7023eba9fec9bd172a88a6e04d5512f6613f1e8d9f093b5881ddc7e75961b2fa73c9e3da3c7dfac0e8d18785f049a37f2ab9fcea920598b41a056bbafbf0a4d5bf32cd809729ef27934d05df9ea15675299b0fb21ca6e461ce4099f4ff1e5d4633874dbec28e13424552e691579ccc388a0cdd35f05c231cc09244afcb90e8c7ecfe73abb01a7baf1922b719ab582ea69a2a5039bbc1c513f4168bf860c8851211bf8a5d2c72080780b03121220eb09cdcc3917a1434d717bbff99f30d2b03b4661316ee0e09802b372ae2fdc1a4ff1f327adcaa7c33cad645dff526bbc01f53f9e953bd3e1d43929cf1b511b12c66adf9592d463b12e3d58c90ed514ac6301ec86ee9ff4cf9a5e87198ac61eff77757d3cc048088c6242a3233a94fcf47e6670c34108041b74e29af75b9533b26ae87db5c5c4529dbd22102da1f48237efb041f7026338d248c3b695a1227702cd941b9abe09b0a043a91c7cd2bba1b459fecb9f59cac9135403dc9c8cba965ac6f2ef61bd79d6f0f5e020d64d41adb6c4cca23b581484fd7b39ca9d695a3aa13dc341460c4ddc1f6967e53f697796174cbc25d0f146076e8c4e295e5cd5a27214dc4e7f6ba766a708518f07bdb89ab6f3fb3f3338b7f4eb276ea6238a60e62bcc8983387c112ba99031ba7062ad9c55ecda9cacf9c32a646b2657a72b3137197716cebfbe5d1c11537f5253ab48b594e651f79dd5eddb4641e8fdad71885b98840d171a9866826889837810d94187c47f43fa0eaa2e50bbd7fe25fccace97a29a8920f410cfbbb8fd2edde5ea1a0d28d418ca14aa1496172742b59a03e3c37c0612a645aa2f392aeeaa3720f8e36c7fe6414f555fac84dd71d449080058d0214573399731036a5112c3b77440a630babdbbb29814a6e207c6f689523e83bd61978cf1505f960aefbb3accd7f4b81e9d69136f5ec1d0a980f42c31e127e048ddd955b009e098158316f769e65cbb235fb01ad669bdfb51017b4094ecb828b46f21546f584820f50b95ec54bb6e8e9bd7130e40c006982546a4b96bc7702ddcd635b68dfd39dcc1cbc8487c9ec7f585fd944bd1829a332a15ca8cba520c43e2e0c981a21bef665d64be8dc63c2f0816b0610ce4fe13b0dd2c1e45643f04f838f419208dd63087bf5284387885ebae5d75b5a42f578e37530301406c08a517f0e824269e657ff478c85e7d6cbeebb7577235f2eb446a669a4a458278c14faa2b6a8954feb2c40b99f7cc1c623b6b062d1a3685a1d27d616c2985b43d7e24e2d3cd628668656a06ca0c33fde815b397565ca414f286e730fb1dc16b6e626d42afa1dd9015d8243cd890c", "acac5200", 0, -772939596, "6a86d4e2e1d4e4fc3afd29dce973170854f0004caf4d2e7f5db44cd25f512302"], - ["263890df03b63765c8b5feccede7775a02cebd40ffdd4e0882751e9b374c0ab1842fa9fa7600000000090063636a005153ac52e57118537148f1f44246f724157cdfe65385c5b60bf3b3e9d7a842c46c0563c1b9058914010000000252acffffffff5e9266f6835bd86adf4720732b5177a9fa0fd398f95203e78913c4e4c44fefc200000000025251ffffffff04f1419701000000000865ac006552520053e37cd70200000000016531f874030000000009636a516a5365ab53ab9caa3702000000000552656aac52ab8babf5", "", 2, -1413922606, "acce0285bd72f15b6e6ee23f73e8e5cfe91ea80703683dde2cb1dcabb83f8f38"], - ["88eb4eda045d62cac6e5926fa694c6e720834df880f3129c22e70b8717cd6dd1e62a765f650100000004ab525351ffffffffdc3817998a2f31c064ee03c0e939dde4c078b5fea9458dade1537c32062b14120300000009ac6a52650065ac6a0026b5b1171eba67d16df01ed47c4a83d1aba8c71248c90c839bfc1a515a6c314addce7653010000000963abac65ac65516a5164d9b577515bf485124f5039c4f6d57c74b98a03bd740ac200b6726f7856c2a20182378200000000096352636a00516a536affffffff01f821e9000000000003ab5251fec8c466", "6a5363005152", 1, -309204392, "2aa3305a9b7aa4b070fd9d94906e5fb980ae1c91df100ba3a2518f81b13b0f04"], - ["5e6292da04fb3dc6f44b57189b1c5f3d1c0c504f532449c527837e0b20147b9f07d906836b0100000007526553ac6353651ff1615d359b6b5c13282fb1c5bb42d52108d168fc3a61ee312a3e4f46fdb348a5476fec0100000001abfffffffffb112dcdd1c5463805fee65880731849275a0877751ed705d98dce7507ae077a000000000853536351525152acffffffffd5cb42ae8fba9de81791981b897dde84d84147f9bd73d55c46c843e9056ec61402000000076a6365516a6a6a6b0b86b6022532f8040000000009636352510065006a633e3fb7030000000008516aac520052536a00000000", "52ac5151536a", 0, -890669207, "c57c367c4dfef2d4236007d2ce97f455fdd8f188d18bc7285b829868e7d745e4"], - ["16be321103e110f459a9ff26cab3a01d49926dc7133a1be86c3a2c2ad2708f8c11dbed7b18020000000765ab52ac0063653c500dc73c0aec20b7541399bd79d2ce72b62c66665289835884a812d1fcae8bdb8d5bf703000000056351536565b808b00c126869a63a72148d82243b7f2b4235f15830da309682588d0a98aca5a8f583170200000009526aab00006353ab532f010ede0270aaa2020000000005535153636553bea604000000000151f3ef25b501000000000000000044bd0903000000000b8d659990a03a6820ee963160d87f5e508032ccd28bc25c85aeb6228a490b4b697f0b2ccfb10835335c5e32a0d3d8ce8b8bd7b125c53d7879443872d67b258efc93a6a8c5ca4f89d53c83ac6e14eb7ec2bbd6d3a36033cc8dc876b5c5e8ca5500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8116f95fe21eb4d845f52d6aaba514046ef81be06d4df29e925e7e5974433bca2182cb7a3834e871fa8f7bfaf2a53eebf36e18e6ab4ab4507c030e345ed9f2934e75eb796f401b561797cf98759526bf69bc99c45b1dcdde8d00fd42aca177093b2d041d154ddd9cb751a910469f3515ecbb9d9c6f8a2e6a8bccf6d0cc6c6e5020c9315fc080c02ec10e96e33b352f54687f60be2ec9974dbc022b730295d9af802109098db375456b93df2e8a5e20354c962797b852f63d7d36fd2f2ee82d3d92e0b0abe143fa6a4c480deab66aea8fd6f390e3ce0aa1cd213c4f6f04d348abeb367264fd5d3929f6401ae3f9c8af9b74d0d0af7c6db745fa5de01d533b3e002e9df03303d0606bfe92cc70f42780066558d862e67b68d9deec739e0a885accfc508b002125f682c49fa371d51c326c7c0b472c2ba49f192e773d4e0809856e97f62bc97031ced69db8be5c52eaa9446b129e7de76eeb8defd8ff5416fd97ef0104ad0ea7e0223181d014ba31a7e7fa6104c0e35194da377e9e8d829309aea0c6a62000e71790213ca8d889d22109816f5b48727a6553c948acdbbe920fb3584e9124db97abadaee969ad1ca7f5ffe77a123c27b5d429fc59a19bc183f56a2abe6308368f563b0271445c440458cc20186f4f67969e67db8a3e435f2aee695fb25fc7c5e1e9cf370944bace612af1d2363d6e95f54051be46fbe4896c8d2d00037f937a47fe06612aaf51ef7df8e40a01da36c78769297a023698249ca4ff511c2f14c80fa7b989c2419b4b0054faef24b8d6bed728acadea958a033380ab5785ff32e44f5beddc9de012253102a3543ffecfaf8c711933ca3ba23ffdf5084d68e16ff210983e3be9bae3b0626b6cc576470ed0de35ded974bfaac841f5fe497720e2660917965063547d8ef8cd90ffc94ee4cb735ec168e0cc819d6a2cac476453effdbe0b810e8c48d66adfe300c0cfa6e281fce74fdadb163b0f28338d337745bba2a96bb1c9fcd0e55284ffaaad0f745d9425796b6e62ad9f0d863c774d17d106c95129cb7bd3862f2e7c901f63bdcf4c179ba95c7ed20b467755082e4008dfb438b8f03e93a62680c42d8e3478f38a65929eb270fa0de464868dc1d2b8b62d36d81c1ab9040df0304bd8d62cd5d8bf582139985fb97a5a7bc4473e19664f09290a6a01e6e74ae538f1d9efd1c10a11823bc18b9605ac398b8d24eb49a4ca50729f97a7a38192a709d3c95d9719c373a2a30472880ff97a8931fc51929d6e2727f9dd87a0460a3462f89d97630672423d2b17c2afe665bfc6cc3a94d30407ff36f377f2db0a0229193ae20804770bb10753b230a09d44c084de022237c7dd8e63dca3bd480c22a113c00487609bccbc6cd66f7c85594859beeb6216c51c7c202f50aef3c92d1dba45347585fcba6de0e685fc821e9cc050a3b0304102fe54090b0b926cd0fa2f143731a5df8e99749c0ac8dc6282dde57d94db1dd742772aa79345a387af6ca59d1c653bd6cb45945c8fc6719a0f7548465e1c6bb98b146e7129aeada968f60b3fdff6a1476686e45495db890b61a2e8b297b29ff728c7af47037207188176a45b9e6e094a31f32af9967c0367e4317ef8975197c4d29151e2939b52eac7fb16d287f819c7cad54f711fbe5bd66932d98a227e8054cd566c4abeec747cbd4e19541e50a9e3191de031429513bf6127b0261bc021e5e0a99f2bb32f029e7f3a4a2910ea37dea0738450847f0d00dffc5de18c3b7a31d6cf798969f6c5397a15cc00f38c6ba0599ced3185ca0f6af4cd22658c891391e8b0c9db3f80a22416e65be401246cac309016407c6a4f4156d4f45e28fc07dd2191fb72a65cfd304799a08783d64a552c91dcb2293cd7814716b69dc0733627210ec3f33d77244f37748bea32d1a0737d47ef539e385eed24fc392b28ba457d99b8570131094de40f5d5f2b5464b3846d6f78f3128d777626e42c0319a64779508b66bb3040eb0fc837f7b1d87e0a2c1bccd5af6e1bef8dd9caa24a057ae45413aba3bfcdbc548162024d067dad029dd4ca2b10619ec1f8272302d724df0ad527fa4d986d59c435736f8ebddc6fd80d55a85794001a2a4624c6a33331438ed936693dc40cf7fe2293c22fb2fcad5d1812e9ed8c07c7a1cbc4ec5f9df621a13b2fcbf7ccf4ec4e071ea9f0b78525427d0597bffc9634cbec1239ff3ba00eb36ea32706cf82345c1ee805b3b6d950d514c5ec03672dcb17d5b7cd7a40a377dbc3b34cebcb859c16692e3a9cc436df8a300a87a9090bdda7bcaf821f313b752ad25d144e19bbadee2e46164450949a423fe4b0a2aace7a84c60d49b5d7f0ad18115b85618c146f47aaadbd9f091a87b6e05a0540ede37fe22e2bc91e578b1d0356aef05db5ee2553a1d978abd67a33742eda58f11135ad9a1a72be001", "63516a6300536353", 2, -1628321804, "b374c62b60aba0c9688c8b17cd9d1ca982cbf857edbe97169dc6a77245a11ee4"], - ["b234b0d6037f55b5da27f9b9d6654ef6a53ebe7e569e0e882b6bd680abc9a11c79e0d178b90300000006536a65656a6adc4b200f0b40855b9db15b3de063b1c84212ff20c75c86a0bf03002c981f6423be10b6000200000001abebde87035f5fcca345a76d7cdde9ae9657e1f063133e9069c9871d20bf8b9d3ad4fdfd7f03000000086a53516a525365510c1a858901df694a030000000000b6c269d0", "", 0, -482461306, "5b114f3090c211d738ee8b4b5b36e79001bda57c1293f363c67699150bce77f6"], - ["2d457d3f04b3baf0bf8b1cf0b0235fdfcffda11efc44fa3994c6b3f00c2beec1f89c5d92ae020000000151ffffffff1a9bde70521c18619413c1e93b15b631437bb07b72598799aa2796e3398698a50200000003ac00abe6b41c89eac0ad8c08a1eb1c879393296a9ac7f6735573b23fb6e4b04647126c84f576a10300000008ab515153acac5363eaeeecf3b749c9f8c17fa02f80366456ebd698cbe8b4c5aa00f6645d4aae61d5b0d277e8030000000463655263ffffffff04515743020000000000b7e40d030000000003abab659575500500000000076a00abac006aacb765e5000000000009006a636a656351ac6afcab1a3d013eb12e0500000000000000000000000011463c8913f254305e1066337327e30994651e4c0fe0d97360b2f0f561004f837e134a4fa00adb7008ea40ab8d2f101d67ea18863b8a84421d0bf07c07f9406b7da84334e967c55323d64fc072b937162e75618109d5606a198d96d614ab2d80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004814118024f87fe5fd1e291191ca310fc82bbb2e223f8d6d26b5dd6ab423a6f82661e5bd458a323d59f1ce1caaae2b429a5a5cda3512b44761d6ad5c448ab58a36b8b7391f7a8fac7665d4e75fc45a206461b4465af19fe5aca17cb3533f26d8bb8e7b3694fc50606b7ad1a0e2ac62eaeeb410fdacde4c2378949dafbc7a8e6e0329bb6563c71f2f90f46e480e8d3aa11c09cd26af1fded5ddd322e98ae49ea2650309e2744d433d173772bd510578b70aadd1a53177dc942800dc8f67da6055ebc40a065ba358c48da7459b63fb7dbbec4141ea3998bf619c33077a1d3dbc0e9d299311185756858caabc079d91254925db1b19249ea96c7a7dd7cd5052fb167e0f630225dc6a2920875bcce5f6dfade3264af0c8939103239bd9bc455774c66d3a47930223666df287bd609d5e2dfa9eb11af755e6ee794836a739b59b25d57445bcf1b50313065396ccb6c783ba72e20c429b7f50332bb7dd54e2637741a2e6be4d7b0d2d030dc1d432f2c5f2ecaee83ec90e3e338493d09586d217b32be19f28c46a73cb9a022fb5c3579bebd772a0199b66919f23bd992eca6237b445a9a25fd8496fa94fb4dde18ec49ef234db53b7c95db33c0c61e70bb2fb92326e1918ad755ce7452243b1967d91c656746f088a4010a572b67343573dbc89db99a0013fa57de1ff238273fb049bded637cc1011fbadbe8d28d931eee79f716e1f43bfe006c745ddea5dbe1b552c8e42df021c0d5df9120d599f60e26eceac7a17914bd947a73a39bc181acf131a7b070c03a7b52d49cc0a35083c6344ce780a1fcb8614710ca4b2cb1d7308fa69854a7350aa952e5c7dcac33115483b796dce9adb1a4069d5cc203851840bdcfa668869e572a77f9464f202fba68b9caf48150b84dab7d8542dfa2f7aa82e3fbc9b2a7199049c4eaefe824a0950565dd2e2a0a8a9a7c15457dad010e323e134c76fd8df0fd910a9960847c077bedbae59e4111a0c121642ae28011ebca23e57edf177e11524ce23ab835bf2b7281738ce4be68f2a1f243ba1cc6e807a2986a8434cd4e723a157105023b73606a5fa710e22855536dba7fe4ceb8feffa30f0f78535cb5820e00e3fbc4215a482bdf84fc90836f13bb8f247437f5a68af538048273b7606f21f9cb438dacefc6db881017b5cfcd54068177cd5e76242bb12ea06606cc13cc65136dba8500233e5c6c5dd2441867c9cfa98eec8be51e9ff88aa51ee884441458d16d88890a9131f4909350d3226c3460f129e1e816a8879d381567eacbf1b430760209050189879680dfd3a159b2b6483aae1aa14625c401e5dedd1081963d01a754ad07edeaad5c06006ef0f774d28903025b82c6272ab8caff57b32fbddb28ff9afbe33a7c75999cbaff048b4121ba8bf1b195361a5bd902f32311e0f41105d49154b4db2ffb81e57767aec34831dbd99b9551a2f794713b89a1ca7b9746c220fc5cf819b2add29fd5c88e16863d41809e64c01cd956b5bf32acc16c9f4516f4f48c17ecd14977a46d3be2869821e9814375922e006fc70b7d8dd2e7907b6eeea4b42ca30b8f729af6f88056f7ab5811402fb27113200abe6833936cc887aa029bdefdd4a636416c702c2f78376c8dfadb12edc5801e47e5989f81986e92c7f580717fb94def797e59d8b711a0a416f7a198b07879d79cf526e280a6e297fa3009c53448158c932ddadc8dfababb4561a725f8cbe2a18e5f2d7ab6b246e3078b02272c01a9a805ee49ff23ac1990bdf5e2023b1f44e5f26388c70f2fa0259a5239e8e17922c6c19d387db14c8bc33c6f4a12c8715f7a68fe5920a5c6ffffdbf9d8766b662f253d2250fc24fe79f8032258035f012272d9b6900438e7c9b76b20f3bd52bfa09aaf26641e89a710dc76fcf385d6a7b08a248cfe92f53267e0da517dbdff7ce9241ab7455f9c5c7a66a254ef7cbe031f3293c96cabb0d342f1a74845abb33a58c2d8428b67817c14ed376aeb57c422c91704417c561454d8adc45401999c8c52071f3c63c069c03a453909a7421473d1ab6622a9482f6e446db5367642df97c249ee94d9bd507579550e0a61f2034628568fd40ebf6189167d8e804ba9b0fb8b5214e9dbe37206d75f18a78e9994af9f9cb26ca7880500305c6ac0f55f3ee076986a2480b39c6153cd319ead94325e30f53f86942027005827b716c159b251492373cad8d7997bbaaa3940a0984ede2c713cab6e2b0693b34100522ae77582eeafa59d5baa6f7a3291e7e9f931bf6950933103f4e1e1787406b93e4ef9d7ddd1fd96956377b945222e2a04251765fec2bae64fafbb77a0b05d2d2f7c2b1b6c1b4cc39013aaf3cb07b4ea21903be20112df1b5fc370978ae6971b90a3235a719cfdd1034e8a2483b4dee81bbf8aa2a2ae26eecac81faee46e57f1abc3b226099fa086405", "5253ac536a", 2, -26994064, "cc32ea971f2108e4d0921426b524721f9aba2c5d1cba4acf567005995272ca89"], - ["923f05a001de0a4301f1d4b2fd4696ffcf4197c10868df2d71cd25d82ca4159b44585c34a4010000000651ab5300ab51ffffffff01292ae8050000000003ac6aac00000000", "636551656a65", 0, 1477214083, "f0df97654015ce6dde4d13f2a575430ff5319efba996b6d45c94d9eb56cf71db"], - ["8f869c93031690f2c4fbe32e4b1f0ce3b36c3455d9316be1d7875a118aa2269be3d3669e310200000003005163ffffffff918f7073726ddaf54aba7642883eff457f4e719cb08811b02bcd0f8aca8a1603030000000252656f97efd5113396d7449d3c513eddf94ff66e189444fe1a55b5d66552f1fab47bfb12d4a90000000003ab6300ffffffff01f40922040000000007536565ab5351005af2c5cd", "", 2, 1367017162, "4bf65801eba8506064124016f6aeea99098e98a4e5abc6f1f4ae914276c2ed3b"], - ["751d5a950165dddd3a1e58242ebd845d4a8bedceae2e4d9d6a3a172a86f3f0c459b992d35f0100000008ab656a5252526a00ffffffff0207b69f010000000003abac63434ae3040000000009516a630052535253535dce849c", "52", 0, 1130715713, "d5b83082169ebc6c6a2def42c3e2503e4c5e606263f13f4039cfa43a9aebf58e"], - ["d1f299df027f4519d6865344bed835af1fbe6715ff7d2d127dd92016aa458a549f5f91f1070200000007ac65ab53ababab3fd85818c92f96a6c8c700ab57588af1d5b602d31f74c8f88dd15655bbc92a6ef02d54110300000009ac5263acab5100acac9ce5430d0375d7910100000000056300ab52ac7918bf050000000007ac51ac005153651e9eda050000000000cac24d17", "ac6352ac5251", 1, 2067075260, "3a703adf7fb4d96d0e97c8f7e60e2c82d5c04e75015a688ba1ae5f485d6a0b06"], - ["5b6bdcfb047bc45060210ab15013e620c77a067ebe2f3615a290455ed9809ff55e10c894a40000000003636563e37f71ce833882fe9303bbda640fb60d9754b058555672149a96f497e5824cdae6f946cb000000000800536a5300656a51ffffffff211b2c1702ff7d8a0f133a6d100b67e5b6b3702f07a7ad1294662fb3d200b71902000000055263635263ffffffff7adc77ca5210cedf6c5511d0b6a748578eb781d64aa5fd045af35f4d4eb7112c010000000100ffffffff02000d51000000000008ac6353515200ac65e7721d000000000007ab6aac65ab535300000000", "6a", 3, -888625896, "df0226622a0b8c9e23f7ec4fd834263a9edf664db46b2e8089408b7de36d0806"], - ["5e354c320285fff7beb8258c34bd0159897491b21339fbc5c6e1325d88aaa6999c72b43743010000000453005200923704f97a14df059a05a53405b7dd21eb58e7e02d8c5082bc475be307d0c2d9c22443530200000009536a6a6a65006aac63ffffffff0293a4b60100000000096a63006563515253538d58700000000000056500005363a2f654ed022989e70300000000000000000000000049eb7754f96d89e9d4f42371699d18ae98bcd108df702415288bec5b1b670f72f00e7481173ac94542bff189c9c149e38efab666809e412436f97c026104f48ee922c99b9e86f30ea21263027b8a9ba3b06af0e39ca24995abfcef05d9401e5f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1e0e3561a794be12be4d654e99a4c78ce5d24412edc46fbf38333013c000bc4831f5640926bff3ef90bb11e29d582d165a8522aab49fda77e8a6bafe2dd658c1cf61274591f071e337f31f488269f2836055d6b68d594985abc4c67f20018500841183110ed3f9ff256c6766625473f435087cdaa2290d0fa25a06638a17e50032063205a57fed257a1211486c6792e8927d24725cab9ed5ecec058c4913162c50226425252aac7c5cc69f4a3227cb113b855496dfb60c41dcb1b6b7be08b8cbec00b122d80be037ac46c2ffa62dda1928b664ad3814f7077ea4024e3a587eb42318a1e68fba43e0342d6eee628bc5262c47ef40bb27b9abbff19b7ffa52dec0bb5a8022e113320366c596107a7e469e2ba913562bc5edbb57fd050c96df285db5fe4d603288cea501557ee450def6f71acc28429132a473c181799241def27c25988e64e0303c50eb9778079e86d1f21ab1c68e13c049401a9f5f7843c03df9eff309e4173030ff156d0a4291dea8b5bbcd002d5ef7db0b3d2cee368e5b278ccf172d3d78323032ea1663a547c18cdfdf5a1d831649e0ce1182fed32b49c48dc47555b4c945a36a40112af1b50831edb36760f2255278636bb17b6eea93a5ad6fc30c6e403ab52f47b8ee2c82f0cdba9f9be455328805e63444bc4b5208d33a87e18ec15aced5624a4945a7ee183221606526f751d6f2d9811f757d746ec7c9436efc18d0930e02376b6044762f393972a351692f00dc1e675210efc93c8b867fbac632fbe209d9b00307f13f7f9ce062c0d24208d47994a9d5fb02260c6c60bb0b0117df3fa61707f790770cef83f8933377da35cdbfa74c81365114a1cc11aaab8f9c60bf8534d7113ca2886d6a807ff566ba4b2a883edde88ad1ac6b20ec9b62556d39c551433dda9f87eb0bcc50f8daf54273f983c5c658449d99ffd7ff471e474acaeea0b71ffd08d31cd4e4ab4e5222fe1789beda3ab2760eb13f56a024726a0ce3b430da72f1f40e35054f6de7214a447c09b0f719fdc8ad79084e0a947cb381397007d515f705ddca587d56e4bb367d41dba256d40e177b86c8b4935813ee43698123c4c47b72f9a58af4cd55eab62947bd6ec8030ec8385b5691db3cd7b4504111ab4be3f41a3dc16c0d1f8792f54050a2749a1ddd24b4f9aef3abf9f3c27521b88916a8788be48fb432ed2bc23c05f87d353512d87f2bf00cc32344272db5bb51b76c45329c2f43267a1c811a4f3f9ec01323a8a033fe483b21467d04ac13be856bd0556b7cbde8454b7bbc3e2a0b837caee5044844898a946d66017bba73f04c0c3bd04542bc16ee076e1fdf68d56f522ac56d7b47111b3cfd7176d455a2d8f940a4304fb4b641ac42560ba59493780733693e8ee99229967afa941e89dc3c35d907ac6f5e1d376323d3ee5a1c3417c32df969e20a1a1b322e040ce1b94c728d4bef1660fad46e53c23b032e5cc9cd758d44fc2608a719a3defa848c43ef4353d3e9da6677500343ef3c2fc3c2ec70cedc59e6851fb878ca291d0380d6e3201292d892a2b8798351d608d0ce21eed250a8dcf8ded5dc5a31b68c0fdf5a28f5dba4d2f03a757fbbbeb3435a1a7fff1ece97682bf3ae7e51d50280181c00799bc22bb86d320a605076cd86b0c22faf8fef0fd899a30ebb01bb4e97e812be0faebabaf9a179846397964350569cd6c16d8fbce627ecdc5ad5dcf31b4dea0c00a20e74d7e6b68ca04c11509f712fcb73462ccb3763696c5699716a58147e80af762cf5f46045e2a4f07396c5122c5c665a02abe8cff1c9f73fd4ecfeda626092a9b3507eb3d143747ad703c17532f21fa758393d7e8851d9c327c9bacd883ff282d87d693afa6922bc550eb54534d08005d9c70d75dd0105bf09c41f3493661d18ed38104633749f9425b0bd9e8750702f8b375e36401987de6ebad2039ffc53fd632b4d6f526e0c59b0d6a3afcbb0b1ebea60e10aff9d381aa9a69569d02c256f75995453081004da5f75c5790d4a741878d2d7308eb9c41efee5e458bf112c5a111267815da76c6b5835cf6e37c97ce107dad926d3ade0e2616d08fc9dceda999513b6aa2b4cba8483746b2878786b4272ae35b458cf378095a5674ccb68998f0425e92c71cf47ff03979da9e132f24b673751b34f543ee036b3a85f028054cfdb0f758f60d4a4a85b7361964ee0b3ec8804c13ee624ce83c72f490758ca630a98bd60b904d324aac2a3d44b927c1294d76c4421fa0c8dd6d1f196046406d4b609f1bebe7aae67224e6b6ed15ad55dd14de50f6d10000000000000000e784b60400000000327e2f48d2f989a460aaa9bcfb4cb5eedafe65e2d3b34345fa6ae6ea44b0325c8883d31395bafe8f3ef5eeccb500cb617f5bdab9b5471a9fbae3f8f639464f90d77116f117e85b2a6492e11da444601e805f409dab7c8a52d0492c6c256da315000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001150e9b253c2e0a86afd0d73806145dde681467c2d9569ccd30a164aa034c3c77cfb612d7520c06a5c7fb7c2cb403c3bfa70c1471da53c3a9e33210678cd01a76a15ff410f17d3651af4a52c114999291e458a55b804bdf2e38b099b6614bf6ef88920ae88fd1bc2b1168e3ce9d46bc7a96d7b6f81e1334482977675f7389602022f2367ab043ece25b2393d48f417cf0af4cfc5efa8502a63ddb7bd0016f56f5d032370645e903bf26c6a25a67a3f775a8a143a1119993f8a3979fdc9421d9450f90b08ac58969fdf6c77f74be76915323e69e3b38c80134d3946843947d5c646c8fa1b711487016e961a04f8d9506dbe659e545d1608a139ca3d4e39df88468355320204f38e767796184c8b07d4c5ec76e5e59d4a3ddd12f777d1cf8497b5bf8bfeaa0310e245d60e80476a0e62c240efb969c5cc55fa8803cc914bfabc4ccda65f5b3a0219bd4ffcb3c548c1650657389643e06902ec741a571584b3a2cb25ec1e7ab716030a1400d59ffa342227b5ad12e11ce620cc5ea3d7758bca44d886a1dd5572015a020de28b533be263998c2933ab9e2be88c3133622348a588e65a0d98dff3f8989064d2ec2d2e7bdaf09224641106b9de70ab0988ed69000db2ab1c8432316bb91807fbed42f4ef3c86e70025e642de1949f38bc3dd1e4301651571a71f2d551896ea71eda2a58a636b25bcbaae8a9ee088a431d22ff75bbdc53476928e414ba67974f754e119c377b1886ebeabf22f2ad7a77dd68acc32220c61e96a142d419866c3a575785c594d8539991da7f1ce408f3e3b1b5f21ebed9eb0737cc3e7ddf9466893bc10dd8d7bd5f6c7bdb3490922d51db17b8d23f4755066fe547dd4e81dbfcf4614ccc5689968cadde59d14aa3d2f29e4d0d35cd1e310406d3fd89c9cc39883d7d47342176cd4b32e356cadaae9b5827bcf8b9e60005a4ac2796ef749849db7abd2612ef4778826915c40f10f862179f379c002107a3bf29ee0672c5ef18f8fbf60b29383a0ef3bd8db14fb04bf11515995749ac6030cace08f7bcb45d760a608dcefa4ad9b20731c369454f88f00e82a039d0e3637b167d712b4bfc77d94bafd7bc1ce7bc02dcd75c4443bf09973b2b6bd56ebdf600405c2894d4a3cdd9a2f214521c72592026e46d8e0ff3b05549fdb6ce80f13948eeef7acf9e5756d72b3a31fc2fa3f39990a2082ebaad0043b8e41779d4504f29d5d7caebbc41aa184d353fa348cbc991777ebdb1a5fd37f71674e0283ea9da3da822731eddf37361e37b8a0af0f3f6bd2cd2f43d4d425b81d885d7d5cea4df6f318cab45da3741ca20f65ea495879905922c4083999a96f686911b29fa5733dc426aedbbe750f3a51dcfa52e550af3184e898de0c3d33c37d6ca5f4418cab6a2a85c8d8aa7735ec5f0b82fbef81b29dbabe8c6a3848f691f6b9e00b2d8d9b54eec4f18c76a2228bea8f31d64a1979eef363a39a99aeb9a0a11704e37997662cf8c9f5286250724703c494e709c807e9e7c24ebb35dd5e6433d9b6747ed828de19a121db42778f458064d1bdd8a6db1543ad181332eeae8866eb16b8232b580526958f7395f0821d1a4b36c9441c67a868ecbdbd662882d2d90f33d90e179614d1bf59f420a149f2594f29c7603bf88d4e8a3e900cc3bb6a00467ca02966edadf0685d1014c4c8607a537331cf18a964d1ab6602f3ad375c84df4633b0a27a384a8b91dc48d9e77cc94f8ef6cba9d2725f61daa76942ead291c684fc54c189e8867d8f073d6cf9f74f44359aadb512c32a714afdb45f2b665ddf232764eced0d23e8fcd546aaef12e7de658e48d3da2daf73d846402ef78049c028a37603446edb1f5e4b7f6691a1582a1e9e21051a7694a1dfc0a5d561ec08c770a722caaad8e0081cfa685fae4b098df76bf1507c9faa5d4790f7ca5a238a26349cc46b59f126290ef0a94ea91f63bd09ea5b0b1d50240d86af662a755431e8ca7bcfee6799163d41a85c29fd2430759b338e8e7babf64de21d70cf536014c05728fd34d3df7494b439f5f480636fcb985194d70af51bf51be46d73dc28d3fae193a050d07b61214b5a8f4c53625d7174fcd14606c2830cf542cbf0aa252b74bffc19ee7965ee6aadd77a5117e0266acae50b6200ea79557eec9a73d4673d9e97cb755064034e2efb7f0236d54a816b5ac45e2c56ae00404f5021999721efd34b5e3adf8fce84980ba4bc838935ce5e53761b95caf7b974af4d3bdfabfdfa4329b9dabb1e09517eb1ea85c34d1ea2afb83b0cf86353fe2201159d0986ee10aefc5ea62bc6a15079a894de7f3ae25eed007ad99522b9c5dfb6e82d5f5d609dd1d02d61b8a3ef9d7b0989e8f2b9ee591e5008105203719e809cb7d9c4d5adeb70ea4bcbef263ce049150593c8731c11aa340f04c9849f7dc7cad305018d605a0205", "ac53", 1, 792228157, "2088ee52ecb8c714401aee4a3356838d30c800b96173e7f1ac28221179f1b3b6"], - ["c37a610b01c71369e871235b3435acdea25bc9901d24b190cf92f78f280716561b4dd56fe70200000009526a6a51650000ab654c19438e0137821b04000000000253530000000000", "526500520051", 0, -20672650, "0b75be294d98303b5368a9ed951ac29644ad35d8a8a9e9042ec3f88c8f679e98"], - ["5ab9e82d03e109ed8aae02ea4f6f829cd42795fb6bacf867be39bcf24c2217bc8e34a46af400000000046563ac5334e20bee58bf5c6c777711db1f5c62598b2f8ec98c9cce04c26e80ee38ba021322ddbd280300000005650051ab658d404a63eb0690b87ac41e8c4839a0cd7256791118fc07b8aea7aa3de8c45d7c7fd7b9950200000004636a00ac62207772046798c70400000000075353ab635263ab39a8360400000000020052f83cfd040000000007acab51ac5300526f12bb00000000000651abab00ac53000000000300000000000000005eee960100000000d6da2cdd09f3c7d6355eedc6e348be6794b04705b5249136972b38e40c30c290f376c7474abc89fd6d32e4caebeed792b393904d48d9d74f0db96b87f08f517f14811babf7dcbf682557c1b9bf74ab58897fc7e3553e0818b6eb6d1090f0e07200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000735e2f09d1454a1743630ce71ccc8d9a1706264030f1fa516a0a6833d9119e7a5eb34684ecef1ceb702425be86ce253fbd0e48a2200e905b87808159aad327c3830c58495d98279ba8ea2110f5dd58a91d3d71b9bc045d2949c61e74ddecce8854df505ea997f05cc855f04c578cff8addda37042c035c37927bab5396c9ec290208cf8b7177a87e9ab0869a6cb167431ffdec665111f51df1b3470393b71ec1090309583083cd17f0fb6ca2730c67ec8bb0b1aae62fe1597f562825c09b430db1220b1104881d2704ec983a1d77607f4d36ccfa81721af4e3b9442710bc0c7ccaf8203008855a70d4aaecc7b6a12455e645344483747e2203216c3fc83e3cd804b90c0229f21684587a8b92792312a66371e6141ebbf5cae4bd2d317e6eb93354a323f10205fe5ecbb9d30eda3ba7740e2fb20c1dc4bf8e8d3a1186013a35348d70eb27f8022cde0fa62c1a355080a920da4ea2114e5eba9f52b067b9a4b0abb63af4abba5a0227dcb90eb00e27bd55c0d3d35c4de60f5a664a1ae9ec4a225badc2c8860fbcaf021cea261d77efc5928504c5209c74f6df5f6fc22a3580b00e5ea8b068fc647293816917cba931efbff2326454b7cffe3b67f05d5fe3118a4f1d904b8b1394fb843be11a514af571e39120eda679f30903bf5ba7cf8c5181f42c747060e9d7db230032ca5cbf0b993d04efaf74aff8a75ba05ea982bc88682f6afe29d13f4e6e53a5fffba8e2b773e69ae21a52de0a5b00bdea7109cd1bda86b1fc3b8e821062334598ddb4040e29a902d9964c03b28a4a8a738f9d1c40d9de5df1f2b09fad148b8462486e24401f60d49333eb78e61475e426fb7c23316c203e64011796f310cea9c1c8f18ef44b05b5cce4c8eaacfed4c2604a781362b0e546745a416203a345f1b21dc0ef6a70096a570795c606084d167238d2bfb31013bc3f1d9fcfc1ffd7c470f004ad81a602e32da199d3911b3a23f65e5a2d0a25ba3c11892f19cbb6c3644b133f4eef14981263b4b6e7fbc5ff2cb81fda7e05e0c27eb08d86bd65e4f6d066c002f5d4c2d4610e59e21bc1a20872cd79d4faaf97ca82ecfb21a3bdac1424a7607f8464fd259fc3ccdc843745922b8f05e4f22dc1b55dc565395b0786a7b92f9cbcffe5d4041d25c6c9ac3d725842d35e1c542a204187d55cdbddec16618f0685e6737eb4cd701d293266db6b8375989d4c932e0259198326f8f685645f3a6b235dadde0817e17100ab90992a9cc3ae38c22cf9bcdf2aba92c46dc194c8377ba44fda0ad9175470899ec0bdb70cdaeea4e64edb0534f35437d0979a756d4eddc22aa3ad4bc583480e094356fc18951563bc1ebfea5c5c6f963a3673cff68a5c220a329481383a5f9f33a27be6c00e63f08cc348f68b83794e7bc44079a5d9a7dc5b5486211a450bb56104d19e1e68b35b10445edd162485c86e4c9780d65d9d1c37427695bb780a9d7cad553c4c2ca90594937677e5f6994f9a67a01bd8e6b415e976c09e26ec85bac494ba93cb4d44a8cf0ee2192e8f24e98bbf1bbc8ae5e4d942d8012885ea21310079542638e1e1771f7a94ebadc6fecfea62d7292988cd68ec731b909e46ec12f8d3d7b84a97149db7e23bd1c6f25b43a394542a1dacadfe9f9d3ee05aa61a9fbca0558fe9129f247dbff05633c90237b91f9882ee26de7cbea5b3147cc7c3f0c4db8e73996b48c575477e40505548d56b252353ea0cee4b06c819fd271237fcf109f338ef67d4af9a11eaa605900988b77a0192f80eb932d158fd5835fa59e01ee93c9919a33b1ab47f76e122ce84ec81860a5ae7d46bd8e50c74eb242c039a7e1df5721cbeabf224ece6a692162cd90e6cbf8e7afe8c0be8a2b206d99cca8d43f42356f9680dd7556df07149db25814b94ab45bef1ea1f362ae57bfc45b6e4e07cbf896ff2e4b2e5fe2e1f2d64db1b2764ad39e5441ebe26e32e15c99c750112af7c747f72d139a00dc0de75ac81e21534fe8c25105afc848234974bb73d03b676284067ce41323d19e518b0993dbe130cfcf980d97a0d35e747604240267871445046da838463b57a9c3326b37e31a5f019cca40049edcc0004ceed48be212f4aeed6413ca06382ed0eb7209ce109279fdb6505870fe365a4d104c627ef6901bf8db7651d268b6061ebaf1a185af87660ece3ca26b77c6d9385d6bc67e861afa95f6d473b174bcfa689cacad64ab3cede4dfdeaf8b99f38bb4e165a68d77aed810beae95561ce0cb670a769277ddbea1838e2020ecfa60ee95f3bbd48e5a9eba8d945c55861000000000000000034e6cf0400000000cca9d3d619fc8d7211d680966d87ecb9d6b9645b9ca31f6aa1b81bc1e6bafcb97cba5ea368eba9da03a72146ba6a314b1fca61d72e3f3252cfebd0593e33d76fe62ea728ec1c0b226d60ad73d9d6bb76f398c1fd90163c844d5e852820627b3300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000536a999386d867df0adae6a2b00f9f79673f107b803b39f4944ac453e249d6c2009f5d73f6bc2fff092c70d6c0305b9f950bb4662ec280e8806d5aeed1717bf1ce89a5052ce2670785954cd2fb8610c2151710787bc2a94bec81468233a7a313d461d521c321bf34e8df6e5913684420511b7a044a9c845466e795992629a029031a6d4e2c98d1e43bf520674b6973ac0c122a3e2ef7a8c414c573f56336195bd602014cadee939107aede54b3ae55ac898c1bbea23ef213e11e8efb2bfa7e902d2f0a2e2c5b7b81176432873285182500f5389fe222105752edbf5717e95f937d14b0138d1d8cd1cf8ce8c70926c1868d900ed49829260f7243cbdf3f0b95306c1d06030aee29be19a9937d4e87b7e6662be97f7eed3fbd2fcfbdf89f1e9c117c2cd4e30224cf4c3a5c8a17de38ddddd5d0e8732b9d7aa5d3aecf726f947d966e03f68f010320fadec34f37b9f30b33bd35d834b5d354b791ce106fe3d720aed62e9619f729030f311b2c5924632e6fa64790b76ae02b80eb547f77bb5f9a60a92cd394958df60200898a92142df4a447299f65cd8b572a1659f1bf4f2eb0b4dcd65696401bb2a1af31d96153fb92c80c7c77d05044b40b8e61ab0f9080816e29f3ecd2f74e7c03c1213617ebaeea3e8f4e9ee4b1477748b3d0db29a54f24bd3fcfe4cd0b291c38eebafaa38057915b0386de46a60e650925039740ea0b08de0cf669cc317033f23c9cef474f704b7880500333a066296264f4436b706c5ba22b1da680e26353447b36d1cd5540b3756c33b957f6007f00353daf7ba27dd4fd96aa346d621a66a3662faee7b2719eb02ac9f3cfb24c75be868459ddcc68fabae2c49a175eff57a04fe3558414a4e66e7dbe744f744b019e365b9cbae950345dade78d143c133b5299832d50a55a5a27f4cf45c1cf5a1eb3b2dcc4ef431fb82ef08e78b3b2ae3fa0aaa9e037ade725d8f0925ef39c3aa499c614b320df9a244b18c5ad78fc8772a2f6640654c9e0f25bbb2b48a6cfeaeba4c278995b9d82617c1fafeb706bcd067e8a689e325b5a376be97abe83ac05ecb8e3d33bc811b69811458fb29ae36cdf98514534bb8e8dc9f57158051a7188ab0f56c008918180ea80f2e6072a8aa59073317ad26e6552f5b3dffa13ceef34962301c6c20c0689e01b136ae7156d492ea02046740e3dd1181df5380170b11a94fe48694dbb97056055cab407bd8c8a43e390ff1c80bdc3fb70be1d1d41259c92bd69e9368a63eba401ac129c2b3d49f32ab1af331fad4e312f60ab45b4cb3e6e5f7380cb35ac68635d2ced20429660a7f7402c3cb67776482c03aed367c024fc9549c18f9e109d65d03adfaf795b68c4d25f5edbe69fd3a43f66a7ebc7ba85e3655253985fd8382e97fb41ad948a2c3d2237f55940a2bd5be4ef3bb3361b827e249ce454ed77d7a90a702779233185b90b6870f4e8030b90c2391dc739ce34dd81c5280c984b2acd21d151e9f2e007aa1dfed84d54bd170e580c7a72c5f0b61514845f481a15cd51266cf6a7be80ab6ae7d28fba090c82ee02b13bb9307150396a7b0d9184913459922ee102930bf142f38366bde2c982bd2907e5a044d24ccba17703cd3b0fa29ccf0c3c509a9e8f175194db5085ffa4786bc891e584b5ca73b0e6a464df858e446617a028e1360c513d2c338cad229f1711c2c66d2ca7490dd0abc8eee48e9eecfa117dda77036b122787f611f4e38f48e13b5249d309941f97792cd9c8df7a46ff9b8de7a53d7bab0f6e132decca6374614003ce0103caaa774ba2254980d2db3de670e8fa2d198d264bf907be7283713815cc9908950723391fe89fcdd8629cda4a760fa743d3861b7d22e151f6d3bbb3c625db4dd1badc1178e596fb57baa73fcb6a07366bf0dac095e1d5a782164be6b9d116cac74237b8133b6c3d878502c521aa688865704050b0df138fcb85010ebdbf686ab7933e388d017f46d36521a03e24e6ff79f5248da743fc5492444bff34b5716de01f393fe1a9bdfb98a21ff168040e00ba61a1d1d2e79f0d61164ad92b4e9ca1fad22d3f4613e5a35b13ca99c1562a991c64fb7d834a2c618ece909aea9f68f2ec4e7779896b3ea253616ad7de9e3ff840cefe3b269881acf53149d5463b219a42a58c503b478cf846e266b12a3030cddc05323a4ee96a0bd51a0f255bee9ef297dcb332f45d4836a414d25b4a7303fc5317769ba204783f9337bb0828e60082d91f59521966ad0331af7ea9dd52019131fcea28fa856584d077eec49d98b4cbb3e65a8a0ed38e0826030000000000000000000000007b617d34afef78aaf6f13ab83bde532e6f2e01dda1596cc29e21c61f0df2a50c9c3e66ea59af3a5bc19ddf108ab75dce7b7a0dac93e5070dc39c45ff798bc50d670e03fb76560933fa8cad7ae7c5c9ca9cf150b450c9513c3536a128cfdd19bd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000701aa0df7a0ba53e45a796367ac3d04460622b0977109a77dbf8bc231057f7cfef09b90104a2f48e95a651ebb4679c814f2bc29daf4febfc9652e45e03a7ab64d586b938e2482149b8be8090b462dbdc8c7191f99a960e28f3ce27b5002ba8bd9b60002fe2a29b5709a7be432c0a4b5fafde864317d5ea43443c36164eca228c032103a7df0ce0099f371129bff986150fe7d0ea4cf7f2df149a36be1bebc0079e032ce463446e37898130694485cf835bb3c644df57206e78296bf9124fdf91c8ff0a06e832bedf55d7a5a53133c0b9ee954f571f9b208f4502d1f1a8fafcc9346b1a23c1d108ee01a4f582f2eec233ff7896140635ceaea6d91c3da9b987d52615bd032c53619128c8be98e40095e227659cd7a4259dbec8881c8543b2c73b5f0ef96e0316bc118995a8e2a0ff674fa6611226390a064875784449ae03a826506e566edd0324dfc992117f810a380a37d8cf1352c0864348d357180ba14ac3e7bf4c0fc54b021cbbf423a4acf8fe0532a745e5a4ad97b8f5c0548bcaa53edb5129b84ed090cf022f8fa100a2561c2dbb7f4c208051fef612cf7c52626eac71fbd2c06a69f71be0de4c514935a1a58c65eb391f915165e242ca1864e9a6e913dc4a9b1216a7538e9c97d048fb4015e7dc0a75d5bbe42150256fb53913cf40ae79ca5dbb2ab432766197c79aa8fcbede0fee55bbeb6ae08b02e310a56ef0bb98b01ed62bf2efa20e5c7272aadc56b6fd24dcf955161abf68c885008196efa3946a75a4755f75c54d19cb2a9c60a44c29eea63c42e66717e406d43023eab2a3c785786d6086b072f5862d6fb612c94567f2f6475c14fe5ad243a71def74c23fd81a5f6838cb0225d0cc9d27bd7575f93c0d22d3563617c9209bcca2732c0ca2e8f0d785009fe98ea47a4019850e3c8bbdf8b0f80bbde8d4366a12e085a78d3ac5447b9aa754f40dfe1df24e53f4c982032a218b66574575607e1ef1c39ee10b4f44afe8b255c5a89740b2b61ac4a980ddc0e78fabe8bae29c0f7a7c24258af9e7fcdd2e0b615dbb35f455fd6fe7a4b9be2c0030b8816bde74b2a2b9073996a88bc178eff8a5fc895cb5fa1bd2992cb39f0bf5c1c5d830f867b28c04156dedb9854c3d58043b4e03d02a58a243854166581cc19bfac5a273b8f0206a437772ec39f4794e122b3a633acfa4b2a31bd901a582727d70b74979bdb8617362d7de373249c52ed98660894c0535aea871a7dc4dd1bfa248dd7c435e0a1eddd28c75f16e9aa532ed8aaf3738bdcef4b6c43c79b6168fc3953ec004ea85ad9f9b5df1c58e0c983d483c42e5764e22659048919289395328e5c59f345d53ac9e74fbfc2c8b91634b1eac9191b7777fd67fe05be960de78306638c17a9d3c5438b6e73efea5803849f9334f61fcccda31c9304d1be000226e90658b60ce00e0a9f3feece57df8909de82f3df4719919dc5ca5324c5e34378c932997eea62b6990c653b67da3dfeac72dc66587afdc76b287a99f4e5b67633f9f62db87064912b300ed25f206b0d3dc821f8b30f4e2124cf3a1fb9d0dd011fe40e38450e58a166e7235f8cdc2492973e9f7f341a09204c73d6579a1c6239cb2833f941cba615af786f7a44c6e885fa15fbdf0fc1fcb5dcfc3e4bfebffb6f7195e15d51480c9861e48e992d2b4a8cf75a2b48267078e3bd4a1380c32f64472bd20331de1f5d73a5376ede6d44d03ec4a8f73cc5279df833c930ca746f69ae4f2b88b0661becaceda229275b097872114626a0fcd75be78e1612d2963b296397d05bda98cc0336179030c65e1db466a67bf668a231c6227ade0bc4fcb1b72340db4389c3c613cbb58afc6561ded3a17f03841c099df91663c084241b272aa88d416179973317e3d8e895763752d90688bc86723433084d4eab4f9e9fd80285c11b5177e7a7565a8f1f3db4a1306224ade352364c5de7672df531a9b216bfbd7305b061ccaa3ab0b487162fb5b9eb2d4af3657d18e6d30439e708efb11a2623d748203c2e16076a785a20c89ba4bcc67b2c435414e1fc1bbc1d92d3b1e5c394ac76cb7ccb12f2199cb7ba220a9b0adcb03948ea970658c821c1141aee11063854c827dbd535fa2b8102c5d66e945f9b5f2f3dc77ed8a5b3ce86d4d846d386af2ced8f3b436deb3331c8bcd7dbf47d013fbf2938f807eed7a67dcb0dd7779dad330d4452c8e51d54feeaece2425a7b9365edc86c4103fca6d5f5a6de4ded825f348667112ef81c7c08dfa6fb3c9a5244c15d9cca7707623e0709d70793f2faa86306ded9d253ec36f4b0e969f39d52c60ba52d18160a2794c3037689ca473fa0b4cdade2974898c7956d832fb7c51f10d03f15c132d5dc2e76abe2de7281b26aa2822e0e7d63c87b160f239cc262714f5891a1771270b8eaf6bfab0e875169e9e9bc631168f68ca02", "ac00", 2, -1904449756, "93d83faaafd586410da2c51ac54ca90a1c7ba277f3c1f0a4509250bcbad02713"], - ["5bad4ad003654d36fe20e607b87fe2b69d7d84611e6e60ccc76d7bd2c9a34a0584bcaf6180000000000852516a63000065534b7a4ae34597d55b85b50f9af145d5a431e555bff1920cb5f6ad8b1ec44597aca44f9a8b02000000006021d235c2d374351ce844b59f3179e354c917eee912653eb28d2628928d90342187e5cc020000000563656563526388abb003d52a940400000000095353536353655100525a8f17050000000006abac52515365f52d360000000000066a525152510000000000", "5165ac6a6500", 2, 2064777289, "0f272e6235f73885c67c79d308002e8187b46fe353bd83f1689707a6d037f957"], - ["2246e41803f905369dac3f896e060b879aab77d8382e2071c64be74d932deeb1938d71e2920100000002ac6346bc8cc19e5da28e80b39a6eb834b895e0ba43c525464dc1a3ac4b4253acecb540ae7a4302000000046352536ad272c77452317e2f1872ed1670f116d21724c059027a17ab6a50b52a04e7f10e20279995020000000165ffffffff0300d2510400000000056a6a5152abe32e8b0000000000086551656aababab65542e5200000000000500526351533505359a03ea4ce10100000000000000000000000011618444ef61df8d4216b7067e34509e0dfed6f4230f2fb5fd65ec9813f2324996adc069d0e73a1d938403f3a90ab3cd63b0291fb6b2c6f34cfb90b67607181a6024ecfbfdf0d8e29f0d3fdb72ebb08aa7c004c4c821ccefdcea90538c967fc4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003372d3d97c9e20069c41d779d66c7efcd79656b33d18c84900eaf3875ff4bafe312710ea80caf7700953795131b9b659dc03c7de867aee1055279d9ba37c5b3909f212972267606f08731186ee9ee494625b1ec115d61e1e55080bcbbc1d10d9a492a4627804bfe2ad36b584baf2bfa1f39e2a7eb334107d6a19acb0b75570c0021d91a74893c664bc0d672a56e1a2ea4c0813ad621e5cbce875035ed96d0db5e4022bc23495b65b059da74966ac3d75342f25c7518a52236063fc6b037e04778af10a2a56bb3e87e668d392e37efa9a83415ed0a177803be60ffd114e9027d567a867254f2a0dbdc050450d05a5ccc378c741443b70a425b3a77a0e99223c07874ef003167205fe755fe642ccef9bab8899ece2b846717e6d36eafe59db98b6fe2b24530220c867a105b96fae89ba2cb066412c2d2ffc780fcce26774a696c49624a3e8c202101c2db5c1c5d77fa6b85706d5f34eb8c8c1a1821195f9ef2df3289205e1212702184a6c5a48077ee2ae2a19da751187e5b7d3df7657dafc38308ecdb5ebb7be4d0228d770238ef5516166b650d490f2dfc7400ce6395466084ac387800c0ef09223d58b7b71375bbc600247ea7d54f69babb51097d1e6f58c5b148a680ea909a1a2bda490b2cece95be03cf8eef94b8ed797254984b95ef4572bb8582e87f7a1a7120ce4cf3570fd8347355339cdcd4ca853ba2a1f32884a057bd3b08b8f5b7b16cab9477bd3a44961bc7bceb12d0512202dd9a2e0c4d55851f954c57f53358e935645be5b2d488660c0cb9fc951ca6b1c07ac6d14bb7f7f9e145688f8e77d36613b4def9477cfcfcc8bc718fbb1a8ba3e72dc20c9dac81537d6feef090ddbd6cc51761f26488eaa479396cb5858c34e87bd3fec6b6b4cefb67370777f4b64ca138ce1cbd38862dcdc8b9f78de5cb06c66a1e374d0e9fd24832bf3ecc3b52092cd0dd3508eb26276375746bc6d81424cb3e87f6ab3751027c625760c7d310a3c79ff74431fa1bb77eea49b2bcee5ac487d0933e541227997710cec7315bd84f0347a5a313aad56fb7ee99df996ff345fac3ee38932ef3611f23f4a78f833754c41b6aa4fcef2763684e7f1aba6e08a59ae7e13d6166f3e5566b2efe39d44d46396eaab6c9c3298f8278a90d3b833da249c65742a81319ae308d5f5a344b7557dc91b432b6deb7520f828834380ef8f3aa2acbabc720a179f4780cc3d8784b16fa509711f722912f1177405f10d6daf5737aebefde634200ef7cdcaa7069137404871958ce2c26d1104e09e11a8df290e636e59a81eaa0ebfbbc206185dc2d4786bcc9c8d22e85194f5ec2b8af67c961f393d5575f4ea48e851acc1c2de3d0a99f51d916bf97586a1a1c0962344b4e2814896577b44a05cf5a48111f49bca90f58aa95a788ac7b912b540bd8c36b78297872eda499ba7e6421a4b65b3482aab6c23fa5a708a12e333c7198489863f94c87ce2c7577e6e86f65dbf5753dd1682a29fa577a5376196957a387dbb4b32c27b8fc22043adfdf890353248fa2b391172770c0435ac5ffec7122bc72d1b6de1470fdc3d22f8f1f03c42242c32ddcc4ad32fabeba00faa16cfa049dbf5e97b85c21e02c6dce3c947bb0ebb5675a3e4ecd3ad205b2b3f336fb02703186e185db23ba9c8f25c82588efaef9bd0e22da7598b204ab541718dd8e96b5f8cf5a7e369737a405899ec1f23b43f3e49ed60b21029b213e9bbdb3ec1fc21e982de2d7ddc2ed9052be2345cceedc3b72baebd0d633bf24bc38964ceb5158c018dd86a47fe3dcf92d204b2a0e74c0ede0ac826739543894db7daf14f85d6f2d1e43d231d4eb34c56df2cc75db92345eee5f761531da4b397fa6f35657c1dc4624453b39d817556ea29a229ec6ed9d53b0f18bc3e941b33e6c200e3071b71b9351eb4e3f52b3ed62aa594cd3456b0f4c4eb19e6e29fa1032fd98560374aa91eedaa8ba18805fb649a8d1fa7baaa88c21398686c6b74ebfaa6f4af50e1d08c556402b52fe97d1d8ea7c4f8d96029a47159ef2abe8c18dd4084e78b69a3fe49951055709ef6df6f25d040262b9351f4c4b9adeeaf787d8817739dbacc50fae75983f8d3ece736528a2a0dd606b07274b6b3d618c2b2b25fe8a3452675646ce893350e53f59c48c9db479dbd35427e40d2d21c7964b53b416d842b515aea7a645b338d36f19c818fe91155c7c4aa82ad716d1490276e7b7fe79205fc1e0e273bab7b6a15e7ce8dee4117809aa6193fb66446b54168c54c97e4e3ac8cfdcee4ec60b99f63510c1589e405ae4bc6c18040000000000000000000000006ad3885d958335ad559ef351777bd489300b6bb1856d5f66891eb672aaba71159586ce11499bc208e8ce3d234789b8e4d8fad6e5908df819930b23486010e9db98965acf1c7060dbfcf8e3934f5f116f989c19f219887f7c94101ad1367485cf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001cc284aa8056b8fadb7ce136e7459768a3345b55b210d17b211ae15bde91954e4d282029649e0b721cd04399ca9738b99dd9061fe3b2d2257680c62c35642fee7e2c10cfc419d1ddd389e9c0d3b5c8debed701ef5268768de9f5c66972901b5a2e19b5dc78c0da103ac61be49941d06d68d5149c39c90d761bee322db932a4eb020188d1fdef5cdaa501ae6dac22cad736ee6799d93c0b49cf16eff285cc987fa6030b70991891e92fda52dc2297151cdaa8afd733626370acfc0be0fbec92d9d7070b21d3ebb5a9b9df9b46ab52fd63df626ab60762a7014b5d734ab3969ad5854d6b1749bbe5f0775f0e3ea2745d554e885288fe5f64fbbaf141ec25fd46c417debd0208b0f791c8f009743700163c7089e9b398e6e9f461094ea59f4f8338eff365930312d054b451a27576b4a571e2b7f1e483f6faec9c3bf20215cc23b00f5b86b34c032651f1965f7d57e96dd34fa34536ac2e10fd77ede917cb038197126db2421ad40224babe2e81ad1acf7e992b7375192edec678306dbb7c22167e2f2ce4862a85500203771cfdb248c6e94371f8f1ab5556497a329ebb64b5d80583db6e9d088599ef439fec7a247fa026343d98905dd2d2da0bf91be1b69690187553e7fb5855abf76f72bbc6ad03fd8ced6c1cbf895fabb935834feaf6507a12da09ee7610553cf611ebe52c1635467e4b5ce9845749be6ef38715b4defd51e0239cb2fb1a8e899c6aeb67dfdf3308d5ac8c281b5d9b6f9ac99be33a5108395b1936b3e8bbb4fd22a1eb0d5835867bbe317a1d0d505a9db4b628885df944401a66b2a459f49c4d0a3c9829a9d24721c9cdd086151e9101d421ea2df1501e10a0587390426665b45bc062bd9b2a58c805570ff70f0eff3e0714570e1a1d0de294c62f3732d3e03783911df4ded95354783843ff3aba7e2bbe2f26542be7d5dc49e1e82643b6fcea8bb701b216fc72fccb9f8c056361027c8768d87c82fedd71ca92da04c7acedf7989965db0e3f323c99d07bb33d78014297ff28cd7cec5b8dff7126bf81ba5cefd62f84ecc1ede853ac531c144722ba48afac8d27cc04fb21233fc3e99bb01bc61586eacbad898c9b94ab4e9e23f71c9deb0733edea3bbbb2df802195b7d254b5aee1311a9a8189054ca17d43e3068042b54776c2e91f7247491cf83735e757c220fa5c3e7bf5e5fa212b3b9366d3562fd49f0b4098aa94d5b7dcf58783a923c6fdf82e0632b268abbb59fb177644b902ad71415f04c6c5c18e0efc040ed86c67e0c4c48f5e385b99078d2b4e4c51d6125bc897cea531e1bad6667c5638850c930fb3681644e9c327cb72500c90ab0b0b8a39725bc38d510db2f324a47dee97611680b8f0ae7e0203ff9b7b07cbbe7611d8f4c46637e440c4bcc7f6764900798187dbf6e41a4c458d59a9a9a2e74a15670a038c7e521a2f681430cec12e502b105839a5e758247a779fc82f55af7c1eac01e2c004d772ac8721b3dd9645173b0c811e0d01acd603e5156adbae2dcd256ff64f68c9720b909fb584dacaa5848017244d5735f4b90e72abba7f0473ed2cdc6e3978f473448f81dd24aceea8711b00e6423fd50a115d42176a105af15f21b53d7d961e771b72af92d7cd6d6645a78c7610411ae1de7557b5f4143258dae8378a02297b74cdfd5dc07bd7072a29aa83e70eaad70dd163344e7ae5faae5ce112eab156d87f5bccd4d1756b5afee4990b8c8dfcbef9d51385effe3cafab89d6b1741e5a2e5977dbe9cda59a251610167fe6919936a035ea15dcb7dbfeea2123057c16fa8087bbe704772818935c0b0576c22e15b90bfcdc2b2c7811e19f36fd1fc9858a44fbdb15a02c67dc96fe41dc27a4fbe321c8d5b02920d845a5c9b86ce257831f88792030360ea32797b0e08f7a8987e0494059baf8c3a4283d3eb6a216875bfd2bed1187c29f6e315106daa6dcfbe253069bafe54906ac0b1f0689e246609203f6742118c47d1b32a88a75cefd2a4f91e34a03c3e7d5e746266638cceef9701486e3205ca0aaaa328000ca2a2a46c17ad2d0cd7e4f8f9d4e5cf1229c3eb3a9a12b0af047aea514b1c358998cf77ca522ed984463bd07cc2c567f28fdd5f4e366070a49f1284abd2041273194dc4d85df8846bd1251d09e4d952e4b80f1e771c14a4d1b143d8d54d8892e55213fe051362c10c6df4e33e575fe61687b1a7e1b79945c78b158ae4cde89acbf18a717bfe12794439a99153911aa251355f4dfabc3990b794ae5a85dc9f3d4d0d71b00a6e476fdafb891775cb5c0545044680f9805dbb33003000000000000000000000000e3ca9a40289ed769796163abff6928b0a12f4d2726b0b5cdd86d25f8334f9f98a6f940fe124d85314744eb6fc6578c301a6039816e8f9cc534ac57cae369e0238b908e204f8dbc6938cf9a09a4b27c583ef056eb2993f152f514fb8f953735a2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003bb25d16aee1b133d64bf2e1d5b67d4570b4b8a770402381595a6736159e00d539c9607c0c6619cb70db4404de68f8513e9fa6ad32daf8c7b38f6ab19297003d27ced7008b0145d306b33749726f6cd3c3c65e476e5c61d74a3f1a6299eedc71f34f72cf6e041612bea4aa9c57e04c4773c67dda819ba0bb5bb9c8304174d2c4031dfb72abb0dbe6ccd17c8343f2a79e23bd72c0fb5f78aff337e757dee0d81f0a02265982e1dd547ea7b6fbf481fc4a8a23ded8fe35d90ec7f22bec3c2b662cd0510a19c77cc2861cdb25e1873af62757acdea7e4bf097c81f0a7394b618f892fc0fd184d0756aded90834238a518d0da52ed569087fc3ba08a77af72722cb0bbb200030eceef5ff08149f1e95c01a24844213baf1a13c44f94034dced8955b47a9b1c4020dd120e001ffccb14386468b86fcf0cd7b154906368ba4f17c6163fb273e30d3032a480a07896b84860adfd80118dab28533cadc85c69dc4ede934735f4a24123303062b56e01fff7f8f52d1560ca2f4b4587a0b22d73bcd30911332ed36ca922b3b030a711eb3b802186f44fb82be5f7836169d0534a1fc16bb6fc1e2018f9a77bcf535c3c31aa070ce38ef3c8bda93db06e38218e4a9127aad33921eff88ba5d1dbc7becc6d414152e2677689130b8c421fd63c3ae3a3f952d034407dfce1d3aa82d5144c201f4388f271a3b39f68429445f24f3e194a3d6b5ea87bdfb26c8603165704f3e9322478cf80ebc1617e5359068b79db2df8218e8ed4a625611f5f84bca3594d270e9e6e125a1def7c6a1afd11f8d984d497a0e560e1548e643441c132d609b6f23346bb88193a9d3621f485af503759319669513b4534728b7a4b0ff4ab2bf7bceddecb04d5fa8edd005b03f6155c242e39076c42a96ef23cdb71488d9cab1009e546d72c7b872540b261ca38702c537a942959af8ed7a89910b610e79778e04f37d12b5a41bc0b0aed5053cd7cfa51fb53ca5a2cb33fa3d01368780654d6bb1601790289a181377906476ddc8e8ba1df1501908213d2b35a85b6a06d6ada0f14f4935f45eea762a5056f9ea9a5dbb9e4d6432e6f2c8fff264718a368d0b40081ac48f36ded848904488a94bb894cc5169688955435f74b121be3eb1b0d6651bd1602e9ce5743b1e754b8e0f986d1897f4fcccda676a8c6da7c3f357f14b6604d234e2f7dc8b6a9ec7850716484d6b5fc9aeb6037240cb3d43de684a57ecd236dba30d260d765e3023b9702c708d4d76c212e29c141b4727755b907ddd647bf5859cfd48a5ab4d493dcc95c78c1e78999df71ef012592b5a20c6bc5eb239a11726d94ebe6b4689b1e45253c8654fd1229df8572f4d1a87c598c8a20e8284150628c603e39104c73b24552151ad373e87f5743ac5db911932956ade74ed97266379bd8a9b265409547154b75e43b7a25cb5255ef1edef597a65c6db5cfb8ed1e3614e007e19d5af49116c56e6cc8d1c590f76226b29761ea72f45e1c04bd27f5df1565ac5d01b0c6d07ab132b6f82f229bb56c7b383af425a70435790114b1862b64c96a81b1d8c419e857152b07b0dcb9bb213bd82c856e4a3965dcff0f57aec4aa5c92cbb31589d948fcbf904da73566d3fbeee9e2c8440e3d53b08230de46d360d5f6d61c2723837fc27ad92b696857a9c0c053924217694375ac78855114845299b2d15397a353ddc1f4af0218f8b915c10666973ca4d2911e250684ba62dbdff12805be9a3aa5058889a81929d2a95140f18494adfdca5cdf55c75b500fcbb5354dc9c9333f3653e69bc173859223522069fd497cf0809a612b5a576b69e3106f3dc1684b54641d3cd191b8e08285df955fe39f8d8d7fd8cfd85b3b8f99b16a700a80d73637e830741cfa5d53a175a587df60eeb4ea70e39e987e1d3c6d15e00d100138d3d0ba5462192ab470404bf656444582c432df21e3c39b9a0e781ec331186929eada8dbc6adf110ac85f7a8584ea1d87be4061f0cf25a05a80a4f05290093dfd87df196969d5a2698a70b1f05be735ff0bbf53a6c5a118ea3113a496496e333ea9f1bfe8f0ef984946e4faca597fd84dd28ac42c702dc2ad3379ca8cdc9aa62f15eb8ca39a1d2fba5f3e5ab4b10435e73cf4f383b3ee3f19ab7cfecf749b75a74608c014c848f27ffec2b9a04ddc5e210c2ac7c3fe2e9010bf6b17534b02705152f3d3cd2e3a22184b1508ea459cc416c86cf0e3fda10e41ab909b8b1f8cdb2fca2c8809191c58d3b2d3e50deaf3bc8d836940eefc1590c16aecefd8cbb51e8e4c96b3ede6140a690e7887a38522f98454d5dd3280c4aac994b8594d4a91fcf712688fe2f44b6a4b2e7350ca96e063d80c48b1d0024946b0e983e93f3581348a280ef56de1bcbbc8a20656468126a0ad8afb46a39ee541191910046d3f2af959f429370e47e7ba8e700", "ac52516565535353", 1, 1829739483, "2ee08477631418580f29aad1dc5a14d564316023ed8b4461979304af4de9d854"], - ["8e87076601061e118f34f9754f608802553bf8e19681aa28294a7c38eee90711b049f784d30100000005ab63ac65acffffffff042744b50500000000015227161f0100000000075352516a6351aceaf903030000000005006a65ac635d2a59020000000002ac5100f188c20300000000000000006e61db0100000000bf9f970054537ab384a68e3a8646aa510b6b09a8907016d59bd4c7ea959bc7ab16ade410439c274c77b5cd1833f7485a30185ec35aa8eb56da38daafc973139487f3b16c73431506be67385dbaeacfc409259e9e30765c3bbeea45feaf91eeb600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dc11cc47f347be56c021bef74df2351b60afbed0bc89438372da840ec1a5c4527c794a5afa8df91e394a4fad1b8ba1612772bb6cfc6687102e0f04b0a2311b648167fbe6c027592513ee25bb6d69cd770219a1247d60e14e6ff53555c3ed2e5b87f791e29b24f06230cf345fd7b0278d3a5796a1c84e129abcc8633d857c1e5b031da2a8c40fd2dcbb21ef8833775944d35d7afa52b55945bfb3660302a0b1246d0321d2b1c5f307c8998a2f74c62ddf8cc040fa156191959119ca89f8d476f5a40e0b14089d815b450eebc52ce0e7e843419b09cd3082926304a7f50dda1e56c8739410676ff81fb7c128e7bc5e3f9c41ffce56674f91a385190395ee06ac56b831230305f0b079a037196eed9b6d251fdebcbfa682836d49930483ef1690ac69fc4181030ab67992de9c25b5aefdcd0117d8539dbe5f86185e8bee0a75ac062db43166dd0227dd8791ebc397bb3edfd0d356e2b501aff22041e2be24e7e63b6498f880c6e30325f8d6413fdb36e0d1a4a705fa5fbda20b9b6c4be831a510905ad449983d8925022c41fc54766f053bf2b77262683f44cb0201c087966223ad021f82758fade3f4667b74272610623d2dfe4ad4b2aed242424f59a9a10b634a51edf35feccbf69a5d74c2b6ccfddf93ae49772b1eec045fc998b1d447043f9a127a49863a28021763f899dfab10e8a4503279fec3793c3813eae1407234945cf7b2f094766422cecfe58a2cbc227f2dcecfaadd70c1dc63f20e61576f20cf5bed7ef29d083cfa5db1e2d762edbc1670b7bd81a97968614e355203b95855b63df90aa9669fff12c36eed7ac49bfc83818bebd6da9fed1066fc69a9b865d2d156b399aa15941172755a4a7b6bbf41ec808088274688c0b906bf7003d76198a6163973685c1e7579159dd772b399dbddeea0c1b0515a974bb2872d7f076739af21b6932710a07e7e411d9b23fcd7aff97d37c2be332e79fe4504cfed83c41a30198d4ac4f813bf91001c117aeffaea331d176a869195b8429929dcc798b993e5cd50f09318a6bda78478b2dc89ad1d46a539add7aafa7f630a4e24ca7751a8f3171f29adac75ed29f2eab1997eefbc9c4eb711026e36a4edc1e48aba00c83e8c5a9dc63b5695c00f5f00e1d67880a1cde9dbe63c81bbf1ee3119665b134c34a985b95a5b0367d85e691d58f054e21f08e215713734ed1b2ed466177d77150f84325fb487b73b923138c349157f7233629f426d6dcf5be387b4b93f7c233f056d0f64c5cd3776dea7087ed711a8e5e017f9252af98240294c32bd7d65fe9cab36d43fbb7d9bc07c0520ec4d10cfe4ae2222a3b646f8b62046a9f39cc5cae45259a43e914915f3c0df4f25b8ef7de14096aa7b4d996a841b9dfe0fbdb1c81273136132fc1d042b75bfc06da27de110567f261e4e772785d6b5561966238e269c74a9166d301bb08fe5d74234ebbeed6470ddd8d7e986c225a0ee32baa472b9142031e9d7c6671339e88838c6fc635c83170598b28af2c9aac903ac8d2be2395b30c335d9f5ed0c306d6d4900f56771970c09f867c13e8e275d459fce070ed307387b767bdba011fc2e26437d31037b0352dc30d9880168f287bb54ffadc34aebda28c5a74bd5ac5036edc4b8f3ae0e74886efa03c42b2cb5db6b2967f3abb1475b3eaa5df92d7c6ade2d7ae5f82742545234469aafc49807fc531b937603abdf367954f485c5077ed2707cfcfd7ddbb5676ef30094098f9372eb0fc5cd46eabd070481b2e00f25644c983a6099a5ad13010ba64f833b5bb86dc95de13aa217401968bdcb4af291926b3bf730ce4152a89dad437561f4c107d43df9d937e7afa1102ec4ff908c05805f277e874894a4465fe544d2a318162277c2899e70e9c3f2a6111689ed47f31e608d1e9ec1f470ab67510fec6c7cc25a36a4bbc4abc6cdc0c08e6266178f2240045ed8f9defd5fcc1612237020837ce6d57c2bfbf0408dfb471fa885cf9eb8522dc1039d9da432d52d6746c69c4e8e617e3a20bb9f5938ee96f8d2d1eb4d30e40b31a52711a95090ac5ab525fa1d49b89539479737a8600b052c9e70b86df1adfe297c820cd97903adf2305c2290a64c89f86199cb778a461716e944073b5e4ae52ab4baac9b2dbc1b80688cb4e77d5b08c74234b23c48c9f8b496f1aeb46fe4a003de4a749d1ef7826bd9116916261bc53335ed741234991a3af981a14983f47b8b27dfac5e1de81e0f801167080b24b55d922b9a7cf40efe41871b5cc11d9606577067fd917ceebd916706df622699980b8d3e367c670200000000000000000000000010202dcbcb11fb776ad54cf8622f6781e936aa86be28077889f9a02ac8c2038cf44730c8e5569ca8df25a3d3003aee5c305308e24ba0fd61da513a78b02ed2369f3a2e624f2fec3b69dbc6231fe156eba920311e94a88ac870351415540d8d0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c5c13e4e7ad49b9b785a7727de80b6bd2c881bf88d102ab5c1863b46ed0c9e147e3afa7b6c5df06a234423896b4e8a73eef1500ce8e6ab2bc89dd181ce466d0479c8959e6c418034eafa67c5f93aeac910c7c8e7ed1a76a1025478ea23acbcd014ac6f9af8974939dea3a794d2bc0653f0f7a76b363b1161940a02f293483b7a022faf05cdff5aead9963b49bb853e7d5a955a8ccbc9dbc19b8a03a3b4392b0514032375d4ac5cffa322607e5445334a522529a8229422450c9316bfa338a81ac3580b139b717891c794014aa71e8b670b3dec0c213e222c2075e9f7d04df406493d58070bfa6fe5265df78f16f75c101db1875efee5e59e4e92d676cfb7cef96614a802173299ee9ddd8e3eeb52a6d240b4d4745e35bef9ce2b33b8deafc3417c4068790205fdfe2cd6726ca1d6bb06907f1810bf729da91d2b9d78cad329a5f148e3c3620327949b823f739b3cc5956e96170383a692db6571e7dea56f76ecdb8820421c42032eb3fd96cc4efabdd6dbed817c3490bd1237d1859d84a83b3551e840b13fdc95031e996d1be6024f3a70d1a7ae9f797a0052edacfcbceef5694c1158c48a4902b3dad0270b6425243ec332df96c068eee526a841b304de512e74196e09d80586848767eac4c416174e8438bc0282d25baa8a086ff578912bf355eeeb31c57d123eb204314138e7e691d8b0cd1b5faa9f6f499058e562fc230e1244d0fd7c85c10e3ef3f4312f55c3055fd2f6145777cbf9bc25dd3b3d63f47ae5fa2cae42f59330de29d7fbbd69421ca96f90336a2a7afe086cd43349b146efef77dd6fe1fef86bca21c425af21c025d11338a94fbfbd3a3ba70243cd4903b072372e1374f3c7d8160e3089aaeec9b7a82af5f38c650801e37ae3e1292232225f5006670853e058b613dbda6ef9d3d6b4c39413b88f619a90fecaae6ddb1d54b7244e4d17bc3ba84fc1acffceca21ee4ffdad1f55796e389e3a34db63f619c2544e7c00acdf8938a5da2ae951b5ae9bee1d5bbe32492ee4cc39cdd0a69704321cb8e0b6a611dbd5d2d0214e10881d96812fd23715cba243401abb67c38df3a0399c2dc2b88d11615985f2093bb0aee13b553bca3bb0d663843301609f12a3db7eeb0c91b1068c60d666b6c78beebbff544099777437c7fe33b3295a4c902d708ed435528136b5fee6dd50e8d6f12555f11b71fcb4b80df2bd7e038dce588de5d78555c9b932f4ff80db94d95fcceee9d12c6692ed4f44bc89385be54d1db7aba1931ed774073de0e23e0767a6d59debe34f6b05185aa9f2fc5830ebed467b7a09e983ac54700f49a77ab74c0ff3fb0ce3f727ebf634d38f9efd86b30943ddb0713bb5e59c10f62a4797e850c49117dfa3457e574836676f13ac1d6b8a755bd75dc89025683e18d025c489f38bef5302eeff3637b8041c1c9a61ce34eb0d03ecef048d17b74d1073d4938233c836aacf230137354b28595f555a46bb08b377c7489d904f6d3a9efcac71339fabcb5ba995600388cc3abed4a137fbff5a8903ef1ef7f92aa8f39ed79d8711394782cf0357e8dba3d1681823a5ef158e1ce10a148ba69f870136888069999a337080e5c2fcc1135dd8fcbd397c727f5b4b80db189523bb524c107914a2e933f9131ee259b5f96a940a4f721415ee86f2b3b7fad148de2f6d2d6334c3bea29f84507ac417246aa8150d844724647b52881db456ffeb72c4012f748ea032448150c0e73380ee1783e1dce84c52eba30918ad21cccf3c954fbf94415d622feaef1d8d7a19f38afcfbfdfb0c8b61eb80df8d8edb38dd89e536c27451d03dbc9feeaa11c2ecbbc9f3e4a5a7075d39c18a0d05e3f145dfaf30ae2bb5020e35e0d99c25a29072993e981f9d34bf26c137eb75d6a783268431b5357f31027ae916e1636edb273195e3a2ef10c8b3f0ce816f1a55e9b3307811b63d0bfcc2972552a4ad19cb81deaaf389c1220ae4077fb8c06a1d69137999738d197d8834d5b395022a4c0dfe1ae90a927dd0c6c8c591ce439897a97e3743c854f887784e0d70f298cb78724d6b62a81fa6a67825635b586a1c21c96d220009b5de6b022c6efb625ebb72c8f055b96a3b89385abcdb610685ee337be00eae0785a934703b49da75987b299987e4474c503cbae49e9455ac4544745a2da8328f27209bf62009dfaf846d1173c603ec82a06974c18c7b97f65d50323a8b4f521af278b9665ae18bdf68b92063d19408e8e66f3fed37af8f2a6ba0cfd91c276ed9adec7b919d191ea0ed26922a4cc6560c9cd758677e4fd53c3727964f010000000000000000000000005e3f40355546a6667fe6e3a791df6ece1abfa60619fdc10d5b54266e98a4e5ff8d4f3f791c78023d18e021c85d6fe889096b44be369272fd3d35c497a3754cf5bbd6cfbc9417b33643786c1d914ad10bc384a108754c475346eacd5ec68c58af000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e4009c6a5c1b51bc48ad853bbecbd9cbfda060be8d27270c06b6aaf9f0d8e99bd69d731dcb0b17e517e3e18dde40a503d810defbb9ea798852067557dc5511c69c30ce3830151533d63540c03c2d8530b7079b5f3f4edc79477a7158a103e624b280966ec73ee655d655f76b379dd57f1ff081afa6f076abfe102985a6877f702134a883c3b12615de6b1b27b1b39a500b30869684b749615da9a21fcdf282ea50328f5586cd19cb118d786368d16b2e080c2627ed425b63c5fbfcf27419c94e7d30a1b8131513b8befd61f992871cb27a0acf9cedbfbcaafb346c4e30db80178a7de1565286e5e41fb1285569b9356eb830aa44711cada2a64852e1f9b2b7c0872d1032a0e4dfa742350ae60b222e1bb27cec5d63da3f428a4210cf515505907ca9d6c02274c9e96b4b843545003e2ac77d5671c305a8cb4947a29cb351582ca46363776033036d3a5173f568400ae6ea10da27c39ed7d6599fddc5fec7333db4c8de75fd70229076c77be3fe0008d303f371014a8622db6242797ef846be29c2d252edba12b02000498b29103d5c8709894195b64d840feba65f08f557cc343bed8d5891e6cad3f7beb8b208b56d6a7b082c79635b914e861fcdad2f5947f6c41ee328ddeea662a8b5dd48b5f750dc18958e12196deaca6f3d17d7254bea919880b6cc8b3ef02b12718b018803df747e254828427f341a4ddb2473c89f5b2a040ab3dc4d09e57f41d850884799c6b50d1a13c67acaca194c298bc2790873b4e8064ee50a6a636479bb9b01591b0bf4bcdb5b72204f221c687365b93043ee3b282de41a0e544f3cb750929560c0d8edb221520b9cc778e6830ae8997d4f9bf379516a343b5b9df0aa8edd1e2651890ff1022c82440739d8ab845fef08130fbe5b7dd6645483f3946de8f02af67dd2584399b7525b6f9fc07dff717b094d1147b99f40d9b11813bb0dacfeeff588aefa91e2d71337c046c2c5d5f96b7c90622144541e1034e93218ccc65d75c643359ad7797d28e14e58c93384635a4a870b6b7226bd5d5f35a11a1573d649e72fff9957496b4f08addbc7ce8b339f002e4641f5ab13809e9af37f97312c27d7ba932cf4a1f0a6ee7ae9c1de49929ca2b590dccbbb6cbdd8a558d7ef5fb7e330076ceeb33938858a18eccbd9b1fb8b7abadd6d70f163cb632e75fe927112c0c991a49e48a6908479f8c8ffa80ff7261e2e57c82acc99e6e77f27346e0e0d56127132ea63a28c76c1cc9048ffe44389aef8e01f6e768eb5fcff35d237dde8cd999c05c4ae1797c1e483ce32586ae29acf5ea7694d557114b386c89d4a9e98b4c72f6dec91ea20520717ef4d817349747a4c183544c0cf3a01c75138a7d78ad4ced38dd12c0485b080cc87c2e869e52ca44c0a3d429c8dde924f8d617175b903592321b9ae2e971f23e6b610f8ef6f7be9f8e992fd16eb8171a6016d2d42b36e8b94c2951791a48595cf767dc4281bd3042516b3d5f2f3a68918a202ef8b541f8f445e1f6e99e944b4cd0e967ef46e38a852a517ef96ad0ed503c6504b6a36006765f79498c4dba83f9f6243e59e473f8c08a2c9f8b84ee6a507e904975282f5e84a907b456bba8b3e9444eafb5d36450c8a9d9af9a723c797e2d6436f8e5b1d7ca2c4285cff988857f51a6d7208f5bcded8f69dd7bbcf8372db2ba9928bb51de3573ee94a1f5156b5125fca4b3d29ba0ed33cb9d61dae1218b564ac8dba4d7723c4d03ebcae0ece8efc263ecc474201bb4fdda6137d56818e147785658474931fd1fe0ff92b472774b8d29e8f969690834d1d15beb0da7ba8d273f77540de435d3b742a03407a24150a1410418b6cf09d44425fe44b649bff700d11ec0f10b88c00253a7f4f2c8940be33de1aa0fbfb3b5a9d523f6ac6dba86fae6ea666bdc5bf2e316b5736e1aae9226abf9f370c76e71d24c1294d40736eae8f632423b89220df2d8a3c5d1003cba39e7041b1434852725433d0421347a4edb57261f47826d061bf27e587b74bd5b9d954de83d11878c19211334e7c386481aa4b54f9517a1ffd9383491f4a8086d4dd96ac34734826a4bba6f9f570b0b5acfb944bf581d322e56596f65745aa5349a2f66d6e41f7f1f9ec0ec0fe091a9df01096535a59b83934d7c3d219a13b9eb9ccdbd5030894c98853dbdcc64cfc93bfc127dd64d0a5ade440bb03f452e50f3bb9b397b1a6e4befbbed064ef4b5e99dc80916bf224ba27b44c8207c46e23bc2ee9d2d5d9009f8ba414c47d5cee35cf66b93ee3ee4f1ed14bf274fbdda97812cd3fc9fbecaf5bd0bab84ebb59122841724502bee35b3a3ca2e16ab6a8a0b72d19f62ece15a0334493b3701866b0fc90fa1a633b0d203fa348a169a3a7775324b0d5a31c9b5736b71cf721374c5098d86f4b312c4793a76cc54efc18ac49cdae3f200f80f", "53", 0, 317509884, "f09edbf798b59e2fbef80c480e999d4c7596679f7714abfcbfad6f83480fb53c"], - ["34a6bf8502d0b9b25b5379453756e1825b16d88938cfe275219a1e72f3b57193e0eb1a398e01000000045252abac3dfcd3b3f1bf14a8e5956a505f7e2842f2b59bed0ca086d5c0b2e6a53981d2672615b8d7030000000165983db1c9023e83f10000000000066500abab6553446bf4030000000004ac6a636300000000", "5351525252630053ac", 0, 2015930870, "11e9ca597f29de337124f5a11b2d4d4796323e99ef94acfd444bd13afbc390cc"], - ["be3ba9e202ad33ed4e4e4930177e5cece431c5da3d87f262f95b9bfe84adacbd6db232c5ad0000000008ac5100516a6a0000ffffffff981887a4634abaaff6af2b9f9130b94d6c0de9cb910bdaacb16e9efeba300c0a00000000046a525253ea0a53c103e01bee00000000000253652c400c00000000000453516a00e4f3e80400000000066a005351acab24cfd602", "656a", 1, 319576615, "16a5733a4a65b251b7c2c3781777047667e8d0aa8552a85d44f053aa9b191714"], - ["86214a3802ed24ed7a512e882469eba8449aa21ea22f1d63e738827fca334eb7c93c1a4abb030000000553ab6a6a65d3e196a867fe92c099bd3de01735efdb1eb69b94a45a90d15deb7fb09fcfe14ec02456ee030000000251515de197af03cf0b940400000000007b257b01000000000200000463f6020000000004635252002a653f3202864dee04000000000000000000000000c511532eed3a6c91f164f283bed3c0f1eb1eefa0c816619ba87b33916fc79cf33795d92939d4d78bd0eadc43a46c193fe5e72527bb8231211806171c6af6b7b30ce9a320fad2a8ada64816aa14013d6e2613162ea2e8932b10d83e1f4969d97f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000807b59db0f8f4696935dfb6ca0136a60a22daa61ebc1b404dff1ab44977ff7135ebab42c1bdf4bf24ce706e8371ee7215b985f188a436c5b7167ab62aabb720b9498364b734015eba0ac7bcc033aaa1bb0032be20d6fd26c3d7cb2092311e72514874be82758db0eee94dfd0ae7dd7841436b8bd98db8919472006dc55a9b1bb0220e12b3beaf93ab79ac65e71e820a9490346a27800b75203ce82812e795668950323e9ab691c5bd954d07cac2d465b66538eaa767504a437c4c5a69e800a3e16e10b13bdcdf5a726aa7d280c4f92596f9e1f878a8b081fc52d845442d117025840580339424ccc67bbdd6365d7d6cd105774fbcdb6f201ea6a53316d088653ccdb6103164aa2592a3c241fdff966fc8ef27d828a4a6e33cf02e3eb546b99cf56ce796f022daf88bf66cbbbf5548d413cf73f88c61b7119ffbf749091a979b1bd21ef8afd021fa3ce54dc70ef5306b9ea04a6c353e489fade09a88dd491464e42e605141cd4022cc27637589a3301250deb6f5e1f1cf103edf1417f00cd9ec985e792999cd4680328e036368c692f7516ffadd69d4ef8692ef8ea6c5aa54ae6beebfb4d0e84fe444765204bea445cbc4ad32d243b927a6b69bd9b4b8aa348ca1b243ab6f0fd0a9479ae6c9a368bcb475c0efa606bf48079d1a63d5417719688154965d9c5416e703899c6abcaa45405a0152e7ca54a4579db0bc1f92624b245658c901e5c9ad490d64243b60925e3bb77fca8c9336ad7d1799899834c0cba207dab69947c6a74d60b24c0384f1843c18a7cae766bcaa7a0444e5388c0d342dc6cb6614a7321f4df18d0c1003dbdb613389b9d5f26df919b35a06aa7766651cccc93960057dbfb857b974682c33121ad392e1c4eb8a8537d8ea4bbf7c3e8d8a051c523cc1b7f123a4c48192b1ea0c3231200fb747d32d2c38e6b1d693b7effe704d74aa85f8d85e479656a146618a8294c23ae45364420cb957edee1fc7e31e1de775d2f34d02901ce5f6b763decf59039f0e945ea6ef549e818a80c5121d1d6a48cb14734b7230cbd93a82621fa84bc3e935b8fed73fe2c830f469fc2610da7b33987612cb148314c70d51e54e9a024cddf040a041f6b646475a7b1051a913e3cfa097c7ffa5fa034b22432de26f3bf9efd206f267c9835eb67af43d99408a263ed01a74f900ce756a891fc1d9b7e168deb74e97a92e5d171fa82d1a3099cf985ac9969e8703fd02d0dd96fd9e07ad6b3c538335aa3f3e9f055b7e6c74433d1403f11fd4167d3516c3eec6b14c9ccac3abd0de136114b8a1f8316ae86b609e849cce4cc0da2c482b564dea471b780dd4c6388b520b199fe50b5c2099ead88c2361b7eee4b02c040b722f7c235c027186f326255c2d5c55b29f9214c80ea61d65ef111ee974c9888664211658ba022bdfb4fa8e6d3e87af9a2269e1b41ca6a7da144562169508291ec1c3461b54b0945f03399820e144ce2520eeb1ed8be9d20f25bbfdf14c479a8a6636b91327a56e565b60916afd24c86e52a2da3b52140655a2fc660a94eabd19b1a32b547850d0a3ffdfdcdead7db2b9649fa43f596f8ef6091bd1fecf36da4e63f9f0557b042d5ee179317b50ccac7a9bd50221fb7fa64b99b916f0fc21eb53d37bfa1e6229c257de8b9164aef6f464296726cfda3666b85a4aeb64292f9591a729be7d1c26b3aa85ba6de5056498fe3a8c65e2b7232c850edf75c7dd9ce850719db2ab18585c1660a70893fa1fe6c226f35415628c5f259fd3a969fc6480051b16578cc7962c1c27e47e4e275787130ec1e3cf31114717f7e1dee7c086bdc5d1d954e19f7f6953f5ca44ecfc66bf537acadcd6e672e79a07c920328c01a807bc2276bf64ee851192928d9c3315d261306ed714e91d0d1d0ba8467253d7f414f8ce73fd1564521d07d27aba4c7981c755965c9b979d533e458d5dc08f612a627d3337a02b942e1cba8cc2f8a790054bf3d51e5c2b784c9939481e6746ed0f2c12821780b244693987c8355a02ddc5978b923f9b29ed33b99948695e345894e4f297598ca23f749737b28356751150376b71d5ac5d757160a1658f4899e910dff9c9b22c262a36263e2e713ecd5ba0eada5d228db79b959ea7c34bcf3a8d247a599a64cb6f08c7c19bddada376cb47692665f2f6810094b0d96e2c1eb3ea87e2d81ae5ad3f3d5dcda0a20150c1d2cae24187fb7a9d3d2ff1c24a701b86684114a099360643022288b1a5ed8b032314eba43fbfcd9567d72259468b03551f7963c5a29ade0b85f1fd9338b04f2b71504e896d287ae0100000000000000000000000053d1acc9dd20a0d6fac61e0726bde5e949c482913b9d88ba1f56065b759b48ea99b31a88fcc3d973adaa64987ef7c4eeb021063223a65674c79c288dff7b7c943d1f1141963ae92704d98de36a3f63376af6fb713bd12bf6b24df3fb87c53c2b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005eda13d5cc3814b03eb7c1baf0b365651474d6abf23751c5503db9c2f44f8db36103e5f73e47c3dc138c3d046aaf2752697408e52ebe05b64897eef1a94519353c85d4a0ca9ff1c45bf2cebb1261cac4bbcea73efd543c57a9ae1b7e280830382e216773e02a17f23efd177b5c95ae72fd7aab02008a0c63066a99b2776d14d80318578be6d89e3313f2549c7876185ff1f1504e8091d93659359054163a7e754e02085cb19fa3695d956fd8312baaf187eccef6c29fced77947170521bd5c78046d0b1c6bc11c818274168c036e771d574a8d9bc66f4f6a78d193d54a70084958aa0a1367d97afcb2830c726345bbf1136c0ef803994d03563acafaf6da7871b0d00002261c58d27d22c766fed761411a77c4ed87d4fa2dbfd7601caef16dc0a061f27e031ea51ff40e06e319d312b3ad7cf5825bd82bbb6fb4aa34c5f1be95b68669986b02147f6b7006a790876430155e6cfd6e09a5773366fa82016a10219ff4ac5534d402190136bbe547bdba3852b4250ef3f35fb6ecf476ced9e64118958c2a27baff65022be98ada6370f32ad59146de40680d6f33c8dd64eccb1d57b2b8d90575667d7e0d5c31cc555f5e5119a8bd8fe00ade53bcbc68b5d1bc86bd29fe8aa47c14beceb5bf807b19cad55a8f0cd42f76fed8403030224c857b0581a8046f3eb787d955dbde82939c7f93384db2c524a40bd96b52bb0ca9fac4607faa05cd72e2c7d6bd1b0ea2cab15091c6da5f3bfb768859b4c424e02612c6d39e84e5242e9dc6ccdf0a9aea367c4a2991c17db0a27d279aa93aee6e3ee194c532b1e89c13ebbe22ac590e5f38d290ec2c3a1a6cda7f9e21bc94e53c2fcbb53d9dbca535590202c8516da69cd715b0913719a1cd2ea00f50d3ebf0ebce5e51710e4a299dbc3f347182d2cc979d75e93c54b2f97f7dfe41ce71c2bb665e3d7426eb44eaa6db9edbbfd192a226b7239051d1ab44df254424a788a8f6e0646dbdd9a7a1074e814a67e867b845d02293f92aa6e3e421433c8832389ce3d431c73e177be6a87ab830f73e4716adb907227327d8ea533643c486b7ec828e7496cf88c0b896ff5033c718ce2a483148f3494d2747e9e546da67cb021c4648c67ab605368a1b34c2200f5d9c1f9e55db319e9d510a6154b3c2620a568a3b17821323d93a772d24baf72243168f6f9c2d76e79824d1293a62d9e791360d8860c4ee3c317ffeeb00f9731ceb483c3a3550786cfb8ba87582c375bba5c3d3e401225955d30d7729e7aec1057d4b34157339201fb27663d6df7b16f916ce560c5cc4e928ad96dd8a7a9d3f5cdbac35e42b9b8905fd7d5ee7a4144bb3e3f61ce3428f3fca90da2bfbd4308a6a93d000a6dce99906089a5ec7e04eb62d662c651bdf2d94213a272386abdcfb1601f15319564c9d537c507e2503980bc92940da0b8cea91e06ed92625c7e6aba94f9668aed6217a4afe4091f1f3d9f555c1cc094d838768e29cf4c9b2c2b6b0f2c27fac1ec00a6a70cffa445d8061f89d584df9d972562b879d90fb9abe93843f3e4a57273caedba2cffc8d1ad7a4b6a1dcbc6889054e21a19a32de6b7e97c2bd339fe2582af3a6ce1b079710728d034ed7a97d6c71ab118e37c2d3d2cef4ae673b52db073894cf1785dab370dc9ec22632018126d48ce33dd73762060361871497cc15ccfa5cb15f1f31cae2d5e4b0d895c9a1829a43e9ec1853740461e9da095fb598dbc922da03a4ae4663934611f428361ebcac794f03648fb90e34bbfa74707a22f17f463d0bc97afbac55ac5179caec4e44820d5893a462c17f9945e9d4ddaa7dca1ab2944be65d620e9e8852a374cade035a0f998b5120dbce1545e08278141778e070d3da328fe1f7678d8373d3bc9b91fec1d30a1cb1088ee375238dbe5c5eaaaba361818b612de9252b53e336ea37cf484106424c9e0b172d3f7562487bd3cb8bb97b662ddbb74437f3505a79f5b0838b7fb4b082589057e6a07e630c53efb609e300ea78820e8c021339c72602062da151f07561faf3efcf54de2693a2bb542f07f78658c0650e38854964d6c51af88f336b54c52f63d91ab3fab705428d20a882bfbea7b25dee6828f69d20a31b60511b8f25defa2a6a25a578c033c0d0321e5bdf86d9a873519002e9aa8db8a2ba126e03f973d099220ce8ed3ec2ebefbeade39fd591af8a049a8fcf5085db4cd21d00693d4084a297a95530de02f6089ce1f929b95067129baac467785f349317a706727063301375548b8a85ce36490c6b69e1d84d57a0241e4ab11702dcf39a714f8e3e7b3e1f9c6253a3c88951f1357f8285b9fcd4a71af7c74c5d4df8f6a51ef879fd15a3043b13c28ec580c31203be44273dc156901b695161725ebf8ff8ac9a2bc3a4aea496df21f065091e35f14582ffb975fd9c6635828d45b139d62f07", "525152535251525252", 1, 874355774, "c194cefbc952cc19d73bb72fdcc2616eee20409955737998e5a6be4218ab4b42"], - ["4b1779130379773e90a7bcedaf6166731c2dc1f7e802fab53ef2b65ee2ee01032281b8d7700000000009ac51ab6a0065635300e9e7dc924a2cdf4685fc9b80c5d86b3692e5431877af828f969b1832610b7b48ab640839020000000265acfe422382ac0e0b607fffe6ad09c178d09f4eee441360b89c476556fe721babb8b0c37aa30100000007ac6551ac5251abc3d4b4f70286cc1a040000000005ab525152539511ea00000000000465ab6aac0000000003ccd31705000000000000000000000000d9487ff77afe55fee6c556c1e9d472c01a149f04eb71de893ead88bc752757e90b11251e28ad76fa8df9870d60f9015f5a8a5df8d96a8d92f2d9369cd5b8171ad1b5436b22f081ecd5d8481446f7f26009fc845e326bab8808b6243c9ec11c1d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a428780351be73ed3050765bd5a6b0bfe46ffe57f2c9f82e39ef0d844901dfb8055321878ea2d6a7eab9cc413747aa006026f9b992198c8eed012a2f60d6176487ed271caa2e85b3d636e2c0f7180df01ab818e9b6895fd9e66857cea65fa77b1b1db2160bde856ba58dcc052277cda303d2d33f69a831b256769294f9704c8b032aacaf7ec4e214cf15d4c4f208da1f88f415e5a8866972e784d78130c7c6622d031478f7ba2c86cd74c16d5a8fddd6ee1c9b6ee618740112a1ad5aa63bffc23cfa0b0eecdd268cb559db0429a8e639f390b5c17ad0de365b855e169ae0a249594b6d0478cc2c6801ad97525256ea6b3a5344f4fd707a398e7edd6d0aaadc6839d397031a748585f414320cbd09972ed0fff8bf65e0356396682a1161d2174863e30c0f031fc57333ecd583d41309c4e21a414ad348e7295b9924fb322b5a6d14eeb830d20301c35527e81094ae9bcd4ae566a04e2fcffbe650b148e59c7b0cd092ed17aee7020c5cfe7f044178eb00cae6936143c05325d79b888d39e9599f2f2641ca8eed2802265c6c011cbaab15aafc0d13ecba67d7558379caa745d131b3959777b82a8df30c8aa798f2ba97cf5597d97e6f0251c1959284b58d157d0f4c56054cc6163759eeeee0628170c3ee95face0c794b5879246d071b06898124f00a280973fae574b6b9a19ffbc4f6546f92a1d63915955a299b523d45543e21317101979d25aaf1a4ce85f766686f7f7a0d830fbb85e0a7cb4183c673eae2b5ebc36a64e7bdae22f7810638fabc7dd42311b397d6ec8eaf08f1696dc39fab22f0f39302593221fe88802dc32fc379214538eebff1f3f5a2ae8bc4368af8facd91ec1154a82322d6b9c9bd24c24d54a39b493b8a2432d82fdf193533a80d41bdb185ad7e1734ea6419187706af5fab470fbd0c80af29bfc667aaaa5ad8928a28075771f4ce1474ce2dccbcf2866d134a3bb8ce63cc240ab13042b90a52fed31d2b17ce16d830f465293122945c22edeadf341b7e7ba3d3147bef7d110ec23e6332ce38f25f35d27ae208db400c5973ca10fe5b209a651eaead5efc82268676e88fba757cf357ec1e0825151b2e4dba49486f3124d871d27165077b6771f7e585a99910b559780e7cde8f83eed55b5c4f00dd03b4f8f6f730f719d714ed0d85acf6a7f1e3a37c194ca4bb2d88a22003fd90de7e84be7545fb66b17fd300415fdefa9128181b1b89d5c40efc817202d862e3c94e6683fe1f496e67fb9185c14ff7e15ddac69401099ce985c81752b4b61f93c3ae4c340030d7ea783ef8ac7e6dfea111d696474674b474c1d5457dd245e5ff778c8b6afd1bd460f914c5b52e1b61c980c8a04924082595edb7d701d0d1f42e0aa3951032d241b3296e0a54ac548d2a9a9680ed1c1f983f24e0283a1d8d0afe8949a35df08e90bee507dcd46ef9eb6403b0b2b5d7d5ed34fc217d220464804e7f9ef17107cca9ee0626f858c266589a6ae959d6f35d691e1309361438b5e816dad576d14eaf7d01526101b96ce549f3a514f191a89fa9b0c187589420e4239e9aee2d7dee1bf743c9475a8aedaa2d1fa386341697b5344bd4fab30da2fd907884e0f165a8cce0ad057ec692aaa882a50249266278d67723a4fdeb1f044aec6c1036b5f09e865529fe218074999ce2e6b6e5ff485cfad18dbaa3de2b298a2d9a34a7bb82af8d65236643c5a618d25735a5256c0797f83f104b2b4210eebfca239b164c4244ffa9e35bf619a6a0ee65416d3005cdf27b401902cc80df3ee8edacacb045f3371cc67b14bf66bcd815c373cc0ece2edb5ee9727ab0f6f2bb6ec100c4fdc25e3369a1f250fcc5621aa06397174f3e42209fe138c9a00d4d75a6a567891adc81a44afae2843bb383b9698cbf42fb1cd63d3b87781af773b4c778d0f5ed33628e79a9b12c972125cbd3b28eb899df7ae356ed62ea39f684ac826eff9f5caddc45707381ea25a705a012fce56df09f13816c9c7a34e1a53b559af271d071ca377b236f385144bfac6364fc8bf764ca47a4a39cce788029c7bd05b9ef40d9ea303e673005aab3c5b40148ad318a3ee1a9c230c386b86fdbe6d0ebc8eda18d4ef266c4476338f2121c128a59b4c8e9a745d76d44ab6e1db64b8c6f8c90296a2233e41017e87ef069157c4f798e65c56f1819de3b1c51d48d381667d0ad275319702e0f163da86e81dacdee69ee4c8119cdb7c475e4a59e3812d741a4aaf4da742a1a6ccd7d6e091c1385516a3c8df50a8b859739b2ccef872fe4b8802a9e425db8f64f327c28e5a60c2b01000000000000000000000000ce5f74589e08caab399398c755ea75549257b9a7cebb5a733f79a12c8a0c2bf4570740b22b7a49ef59b7c3d7e0e2643df77353f9493e53aece306cf72848626a9c0fc91fae0b2ba596c75256c96fb5450777c98e043fa9453df85d4c4af42d1800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000638cfbd2fc165bd2fb60148d24de56a6571d5ff0a52fd7ae813cdbbed07cba7d7733efb13067367b21b04af5bcb531c5e70f75b1cb7f6a753f9dfb05fef76ec0645596bda5cd0f3efeaa10f041603d40abb2c58a174a84fd82822ec0854e59bc381f5984b9a3899b6662db8b7cb062b9e750497bcf171f741e317dad0f6811f6021dde911cb1df4c62f5906f3a4d609f9d8bb795d6e534cd799620eedbedca98cc022d1404211e5f8d066500c7bf7e41061122e11878bfcd0effce5b2fdeb683ea010b236564cdf7f3004ce7fc8e40c6f54ac3f99756856e8fda69f652cc9cf46d110c1b4361803c964f9d58946fbc2913bc4c30804efdd655549fcacc40cf9d9958ff0227dffb689854ceafcab78ee7e486f3ce3bb6d0578821eb82cb1ea3e87117d67c020b901b8ca404a89e51e29ee0536cb51432bb80d43f46f8917a303491f37f3b72031c7287b239862351b5dcaf178c8eaba4c15a247ba17437eac4a7f7cc38d1d405030f8d66dfa75642567e8526dff5ef7720ad9f52e38d9ba2e57e25e3b64036f82b0205831e8d87bc8b1346b5d2070c251ecc81b0803629202131bedc9e648032573243e675b5b0853c1529fcaf71c05f752146ba35f659592bf18acdb2ea19ac9df27bc940201fdde229eeb6eefa051ba61a4a7fc7021a822b5859bded09c44acafac7895a4ed39688f5188fcc68521aeb53a94a71b6fcbdc509e565fa02bd0f6e5cdea177241dcef4f36428020380e0a5563e746ff070fbba992068fbec15d3294cad73ee77f0108af39d377e26bdf1ef0e08db8f14bd2d1a64811a47a013323bf75fb9ae78b40981960392fca5d10b6666e3d878ab439f5090ed239ac426032912d975127f5fb2fcc7e315f677ba125e2257d586108fbc61703543ea9d832f97b65de4de4f680b5f0407819ae90abcb2a2b28e16f83fc6dd8be37438391796d89c79f289ea1006c6e986b3d8af2896941864ae32220862b841df8e2bfcbea24418632e93ad7a54a4b5e128447e6d7e9eee81631f2a1258de3a1c18594ead1163ccf4058c086e4fa2e6cfb27bd3a9611514e93282747299c0c5333d0af8cbc136ca3a7802680a1c0fc662db07b0c03fee8233d20c67af2ae88795d75a16a09593bfefe58c1b198999fbb099ccc81a3b9b7704ef53710260447f6876089d7fdf0b1cb2e84e52fd57c9398d5e127286b6091ab2a47540b1ecee5a9099a629b3d320be43b202a579da775a0f8c47d65307f63193f76952d55e7ebe1aceb8510548ad9cd79db3c50b292f9576bfa5ed392fb2ceada2fda6b7d8528bdba12ca7362f1bd59a0b05e480553677aa2ef5e7dde4ee04d4dfe071e031d499746e30b9fabf37923f96a2977840c26a26eba7bf4dc11f88a8b02911aba8fee0313fab261525a486582bb74ef926a58bc39136c6807c7065c63c97e8a1127b9e552cf777da7986cc3baf5c6abfa4aa3526309bf58063ee14988ea5d910181382cca2962e4064dfa134c0cae378eaad8d10b60db8bcb4e3da957e558aad35845d033386a2586425a278b0599ad07a276e9bef7259392023f01168ab1d9d7519d0797dfb50887b869fb0011a39cefa3d401d73d8a6c0695a24680be302c2abd5e89236dfd1dc80a9fc01a040aeb78b22984a012a9015ad36cc1e201b6950fbcf369374d14416152d5d62972107cde474f8d8dd980ae1e5bc1a68a46b18d4a879f168e61810bc97e5ebe5ae4763525ab4a1612d73e7ad98a6d8db29b56c8b1e2f6c1f722739cd459afe73aa7a7576b76530d7b75f907b8e848a702c33c6b563ac191bb41538ec3f05250b0e37e270e02431184e4041c8004152d6a14bebc83e55364e1a634c4407e2c6893e51b6b5dfbd8c7bc9aa09d8ca7105c46b03f809dbc5f47b93f07b7da8c6f2fd6a1c3452bc04f664ca34edfe3bf4450dbe3db82626686171a606f81432ef81085fc4ac1a03ca0fd502f9e986973f0d159e4c0fd5216b516f5987fadb51da2c25c68c60c11a152b31019825f9e65252a117b45abd5ed3d93d826d7f54125d2ab07867f69c2854e3a32124ddee15bc5306b1f6c243b681cb37d8c999e41aa0e5da59d27a199d1a2daafa62c4d9b511e669bee748c6f6647692bbd475291719dc3f03285ba4bc65b4888d8c841dc5289ea39bd126f8a78f7efaa430e5776b73efa28c785eae2a650a99148c158dacb42fc46e379133fc4eee73df9a906446941e64dd861105e410486b35e2732b3938c1d1ff8f831b4e751d8e4034b7c4214a310c6bd2182efe18beb2705332ce1c96574da40832b604000000000000000000000000cd77635e675e51776ce6975519748096d64d553a4dd6a2eec0b2531b59b2a42e897ccde04954046c7bb7d51dd001e388d9883d467270d132123a8f439ff9f6bb7c922cfac4563677844fa25814e75eda15205bdfa39eba89ce75274a54d49fca0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042e9defbd88613c3612a30af34d8efc6b3b9086746da3917ce850fa1bfc50e47edcc2087dc5c152a2d5140108dbc5014e8350becd81799afc7961155aa76ea43324a66316dbcce7136b4ce9fef2df97ea5771f4647b2b447fa0f290cd6ef6b8750e310de2c29d986a97ccb5db12b4f27a78849e1a9dcf7aee3629267942b990203029ca20775f6d25436fd31c78e213736bd2132b3b35880377137d677aad2628103087c5d1da4526529666261c2d1f5844882e7682209f6ab6eb0192997539473310a147f536b9eb411315de9f0e3e1947c1fc19d424fb499c15ca8b5d77e474c811413f51866395745124492023aeddd1e85d33d9a63d753ccbf81fdb29a2b5774df032b7ee51481eabd98457d31887e9a3c121033f4a55c0b347eb7eb5e0562f03c3b02003d367bb570852d5377130eac51ae22d062e30c60dce8f83654534e7ab9cc1802191ebbff4274cbe658ccbad5f1f7d3b66dc0c9571338b83813daafd2b0f2b1d9022a827c0960f696290cb161318c94a4438a4926e9bbf0eb2575919fb5983f4880021c66ebb0a66a09655cdf39e5fcf39e093e89802860a5ef4c930db9d065d644e548bb6ada41dff43a800247537260246ed58cff2b16927716a190dc77fd845fa5f5f58602c3c693c98679b3f932c5d36dc7f5629d17d28bebc8ad92f762dd4555950208de06512a0579197577681eeeb78a0d72fa7670179cfefe278ce6881ea796b75e15bede4597da05a063cd47416466102ac88d153757baee330f4c1f91709a14bfeaded6c3e28b913798023d385b769942e90df5033d83e6cd8da03c46a0dd8a61b8419bfbc14fca3f281061bb021dc0ffeadf6f73cd722f6661a1e3d9c63ea22f3d32c4d3cfb2d7d7126cd7fe73bf4d6ecfe4f25439b675e18314ff40d0e2e5d1b7304fee6b65722d96fb60245824413bd8d3119f474ebca5b61c4ff88d0049db114ed170f814d509e312082e1cf73a7f447e0b80947da7cdf2964cce8817e0aab8ff903a7af48ecba038e9a996bb0da92d3a11ad3cd1f61477fe7f145007d1e64439fe64f59a2dd68ac40cc75f71cb3373398c986e3326ee1818dad79a43274dc7c1d4415b0165c204bf09d0b7fd06a267b2e265682cc87cb1f2d9c84ebec907817da925a361b89f3c3a6c81d4cef229bfcc6b077199d7da629c1972215d0dacfb355b5c499e7b8d8ebae14dd4889859a55bb01b3e335d483e577c940309c4432701209f50165ef6b551d22079a42c91a5147d15edbbb128cb2b9e0a500f503bc32dc530ad6d703b21b451999914f0a23c191eac2f967b75f16c1a31df1d50acbb65e3c122c337636d7e7f46ab5e581f6ce72409944e0fd77160d264e61b2eabf8385112fa0682097661d9043bc8988db60eaefb7a9727dc9b5276081605b0b14d00192defed1f153b7ba685b561fbc4e9c73ba428d736d40a50ea0e3d780707f15c2a714033a73b698b35506bb2a8ec10263d183040a06b3cd010259aaf42ecbd19b368fdf5e691744610a7cd2a73bc196265203d40cf0cb57df1e6d73ba8e20fb36df43c62b3e8433cc918df72212799acc8cce1464d342cdf51d528138fcfc2adca26bbd1a2f460848da24d1395ba624c547cefd5d16748a17e0d372f535c9e361e7b7baf110720d49e4550ff7d9eb3159e47809f30b565abfb08d26061d2adf64cd74f3c0e26cdb5ad540ea0d98c3742a8604a669d6b73360c051fe79451bb7c40491d44e77fbbe804de044a4fcc510ad1fadf89f9b1e68cb09fa23f64cfedfd29950b8e689298455cf6ab1a934cef9165ab019ca494b8aa2a371c4ff6eeeac9c227d7057c53c933be858df2b483f89a70d1ce5be1c60d5d4fc8968a6d4f4e62c37a867dae33c897db39826de3acab936232929753e4ef444c3f14a1674f32624e0dd970455a8cad745c2e63a076dd2bd3ef6a75de78e83307b896b77b1c59897f293dbb051746aca8ddb60e6105a280ae9c8bef1d4b37494251b4c209fdff09e3b590af727c5bbe679b665d9364d97619da56448e0cca0d7a29bbde2720023ecb1372c8722c1e59453c5e78b0408d72829eb1f1c0700a0509d440286dead5feab4a5dbacc190171769450cfb98fc8c3afb9a4f03314661bb235a8fd74cab2a9993dca5d4cd8ea116a1864e4924539904f6fd68484e2a67c212a58fd2bb4b52443a2ca9e5769b767c0f5561b4962e4adf7522c66cad338a7e576b7e47903266f5bdd87eb3fdf66b15e267b617007615a2867801976e79c65e2cd79acfa805449ff7f80f8f817a712ab64c8f99c674fd9743f4066bb02333ea24a7ddbaf637f5f6de6aaa2434bb990fbad94b6f9f047433322019864356dfdb17ce6ea710a133494674e2395d4813ee558e71f034d149e7a81c37cf9d788dc725a70df540365b3ed89422f9aee450c0506afd900", "5353", 2, -629875690, "09b872f723a94b60ea54590fc0b79fb1df5927d2f346f690bb1d397775b703a0"], - ["9a8e738f024c4f2a0ea0d9798c23731a778932b890a9c034702f44398fc47785500fa5572d0300000007006551636a5263ffffffff3272fc64982e6460565b78fab5b21be8175379d1e0c620b6d828da5b0df6f15000000000045152ac52ffffffff03d9af1f050000000001ab86039f050000000006abac65526a65eb4d9b0200000000046351656308b139ef", "acac6353ac5253", 0, 783240628, "901a14f3e80ee663834cf4ee657bf76a6bff8741303c245435aba668e3163234"], - ["2ca92b8903b596f66399b4fbc286ae984476fe859e0cd5bf38eee2348d83018a704b7fd7ff030000000665530053636affffffff168d587268f3e11119af4cfbd8f18fbf0ba118c2db8d85d945b686f5b459031000000000056352ab5300ffffffff44475b5bb3f71c15ae82e015289777c131491feb7c3960b0c67eae3a8f3f2c630300000000ffffffff011d8639050000000008655252650065ac5231716896", "656352ac", 2, 635848537, "d3b1a62d55e5abc3dad759107b31dbea0665002601f8e7411a374463c7004f57"], - ["d1613c6002503ea6ca8266ca1360d0ef5b481f624a0ab62d20c149e87ef77f9895152e29420200000007655200535265acffffffff6c8839515e5117259635abb496e3ba6e12e991d76f17f63c54bde364f38e5e9b0300000000ffffffff0315693e03000000000363ab006b862b000000000009006aab5365ac65ab5226d359010000000009006a5153abac656a000000000000", "6553acac63ac0063", 1, -603815286, "a42f1473525fb6f429924d8a3c203c140410809f2419c5f877b9b9ad021c5481"], - ["5455cb3c01432e337b6768e607c5e7e5c821034d454e9888d051b7cb7060b8426b64ec1450010000000363636affffffff01a88be8010000000003656552000000000158e1f804000000000000000000000000751475f75d70b36f157e8f65e942cc9524ccfc9190e2db56e7112d9049cd2d050c95fd0cdd4fff9c28717fd9f2b4677be36211eb2e0bf5ed39d007dabd60d1a2996537a179148027c33af3c554241adb6276a43cb64df54009275b74e81a71250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4b7420f640d7c142b469654e078391fea6e159f9e4cd1e7b497742c835d6d2ee6541e9921b3a1e3dac983e030e2428ac0c8a656d70d1bd73ca4859dce7474c67a9a9a23deee42a7c6f55f979e8fe2fd7acaef3c984c2ce2317327ebb666be81d77494c7b11c4fef923e495624cb4e99dbacb6f16054b93433bd22002ff5960320739676f7499bb28680b0a0bb4c6c3b543c056c5171550e55c40234987c9eab021d23c9103fe2d156320453d612c05bb90f0608ce325b1e7d4b64469a00f8986d0b0a476d9ab87be33fd4354bbce74bc3e26035fa989734491ee1758aca9560279c1b63a937b254158049de831878d02b18eb86d580ca106c033c9a20be924216a40317a835f491f8d823d305ba503b2de52f3d06d5f9d9c243ec82d0e3b07c308d9702267fa8afbdc1f7d44210e00aaec1775ba10c3d8dfe7e3dc3e60f201546f8127e032bf45bf81d13f298e84859dfce04d6c70a56720d40f6526a1000a54ef1a053260314c3daae1a483ba53dd41dc60e42af2a9cb80df2163cd35d0ba53b75eda1190d021d0719685bd3d8012740ca4b43d4d9b50cba7be9e36a883d0e030d110b3775566c665aba9ffb8980fc72cf00d83930ecd4e89a5663f4d901fdf493ffedaeff1991860ac9f83c13344a905acbf5f38ca74a6432573eb10f0e1e18ec4095e78873aeb06e983ecec3aa8c8a32ac826435bdd9b619d0431c5e2884ac44ffd7b9a92cd44b597d57dbcf40d0688ca19184f7d5668876ac74d17d3ed20ebfe88d7a3094306db963b468f95d920ada6965ef6694bfc8598f95bb4baab21cac2724a4ef7081da2d99130d823d034694c69d86c4e7cf435e2348579d30391a3e77ab0ce461d14fa803483d77bd4fa913ff7e489585928480e344999ed1f14e8593b05c9991a2a6e6b7ddc6fac9546ce56db5694fd842f499fff530fc263d773e82732fd51651dd0d174daf3d5d3ac67010dd3afbea04312a6a358c3b8ed840c64bdbc1a626c7ca91f826c58cef5ba13220bd7cf81de7dbf0663c4f57f55377627259dbdf641c3e3cba5845fe0d0cdafa0b81ef3e774ff837e0ab06f785f170e074760ff405a30f1295e0666d77ec8e162f5dbf1606e610d0b1e6489f7983ed1cf23c703cb9ab27eae34743b941730a534cce3f47ea9fcb78e957ad2d4e9fa40bb0343d0333fc4c6ce257004fb3554f7b3856ce547120299f7ebabcbefcaabab3e99e0dbd5485ef45a8c8c671c1a61620024e3a92b3801ebf40179fc02838f97905964be0216cd3debb2b429c26efe3929b413b4ef233dd41c0b26277444ca5e2a052698015ce5fef5a4ae48c1bc8cac2560d7e0ffe2dc4d32a81fa8c763bc8d74e64b5a04fb5c3e50a99fe9eff605173b28d36276fd12bafa2bbcb5f07df06e8c042fec67067738bec50b2fbb8855d6a87afe03dae01ead1b6a95172212c75aad6279e7114fa794e4abb580dd2e4f1238fade127348bfc3dc5a07f0e6a8e15fce7c57f8b8d6a56f284652ecff7ec103c92734576e12a3ea0150ae4300ef68643b01a46ad549fae633375dbd48472b0c7f0951b72d340627e207b8256326f81c8bd7ae99042ef7e2a4875dca1daede0d2d41a4337d1cb122dc9ecdddf9c0a25a124ac07817d223d9563fcf362373de0b04292e0e1b5e2d0d6e908604d51686c283aa14d886f39d8ab2ac0ea9b87ca805b6d48d6615e12920c3d66bfdcbd40520d8ac33111e1773f93238fece846aa2142b54114ab54ce03bb78baa7cd8d453063d644c685d108f5f6729dbb8d1f0a7fdd71b3c16f3687a87785990e0a130600aa3bc1e3587515e0110a53987484f8e0580909265abc2cb174d946c6dce5d3647a4df34a88bb3d318b96389b87a797fec4b25479eb687350304e8b27e4516ceba23dd2b256fbc0eba047ae0d0743fadfac8af71e1ce276ec3dedb979d799bed3c1157a7224fd37a0d3988a36f9d99bf2943ca0f56852558674dbd623972de50e933da9157262a6243571b13e2e571f05e6cc693f426d9c55f485a5cbfc3af30fe90669eb4923f51d63667509cbc62a811ef2e969616c451353b913a2c8d189265c56a320f3bd3fd8ef6b9d6282a755e23bede679879283e8cceca76ed0588ac69df4131eb32116f5f9b5d113a0185a7133081b7fb27693d86abe865466662b80cbf0600e43b3ea570e57c6900fbb9351d2410b91ee7402aaacfb55ee2efc6a3fe46995031e2e264646ac91fd1c6a4399e5ade4600850c80c4425166027a950b95826be0e2b7263ba63af842f7d1ceb6f5e952a11593b01ef89812e274d3f6e4307e5ab2da3aafd2f432faac3a6cf1722c8243f4df26aefeb8cd0d0b65232dd71f81c031930bccfaf8dcb2acc8aad0e1bac03e9256968c3a8d3b99e2f67e23e7b7a4b43a6f53e72a0d6da30e18caf33cfb3fd32ff330ee108", "52acac530052536552", 0, 1940604312, "e8ff3902f4734992a164fa90c5265e1398b3d331761475a65ae0e87a3263c9f4"], - ["154665a4026aa2fd146f4e8a79032d6e0454a9c82c0268ca9197b2b68ac796ea2ac56b546e010000000853ab65acac536565ffffffff44acf14606dfcb7fcd297cfe103163e3f98e9e2682871bfb60cc0952a7f171110100000001538ee733d70359dcc4010000000004ab636a008508580400000000026300055e230000000000056a00636a52e1984350", "6a", 0, 1651199864, "842e198cfb641f46a037d06831df40a409fa64af50fa4ae563e88ec964790e53"], - ["58e8d02f027ed99fdcffc2df7e96185216f95fdb98388874e61aa7cd6da183ba581b234158010000000963ab5251636a005152ffffffff47579746a4b26895843ee92a90846d79ab474fd7c3099e103179acdb4995a6130100000001ac7e85dce501d3cb110300000000002653fb75037c01440400000000000000000000000082ef75cb536bc53eebac6a5ac8d2a5a02270483727bd6612dfffcf083032cb7f0d10b0f927ae789b9975672cc8b8de06a43f68d9ed8f1027082c9084441f7eb3d6de06f487386d3936ecbdec1c9e6a7a5f42c8de77c80ff563fc493a6134718f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000423035ced872c6533bfd3694648a024f1a02cb09e64fed0cc56b6ed7643924014d7de5d4d94418c3959c08ebc16a91f2f5ff17597e85a55e86ec7d702f2e2be90d2a9e7dd8b893935a695819123f922415d5671ad77a29f425cba7ff1af219aef1469712224bb5a184c4f2c2a4b8d4f0db908762b405209e35dc0b61b992ecc10214a8ecb02598120d14c44986f004a80552ed28e773582c5e1dcd23fca25145e5030f0b026439be670fb3d76f77233df3a24abd08626993b22293de2f47a24ac8990a0cbac0bc3ff248affd7d2222ba504899da26f536541b422aa477f714cca2b3612cd6a3b7decbe5407ad80b1f85d15234c7d347aa497ddb361886e5620160c3200216d3ca2f5565cab1edaa55d64bba9567d7d2905cd41af2b376315e56f355adb6022416bf973612f9b01137c31f014c2e1155b2b86a6c252dbdf6c44e6dadc627c8032e942977d4982e4a8a24a47569538fa4855de316324009e44fbde5c3db03d013021b8906127a97f83198465f3f749cd51551495c3effe044f3688f6460ab1154640223240aae3daa867cb8cfea6d4dc63841e14e3060a49abfa46894d4ddf8d761014eadf7f6c2b899e9f4122e2cf31ca6d889e0e6247612ecde38e2b72d3b3d022db6b1d3ab800d40ad5de08f9f7c1ea1ef0c52b7c474358e5fe2e8b206834a571627da285a707697529137baf999b9e5280735659ab21ce1f9e7f6865c13a4c58a53183a8c69f50edbdf680e9c1a3ecb879a142ce907c686e88d82f83a5a46740071b4c6430fa8dcb636fd704c24952ab05b79506a9626d0172e7ae09ce01817118587265bfebbd32ceadfdd96862f774bec74e3fefcdf22296b135bb8985554c0f77d2122236da6d9f1bd95c55c498a0c1a1e1551f0481abc0f3bef2139645a6b50f952600b850c91c9413ce87bc23dec606c7f7389cb8a99d034f778c7f79b93013346cd7c93375d546a358ce73201e852f78d15460795006cb5587c93dbc45139ed414e040a7732f616fa8200fa864e953f0c6bd918231b4431a3bcb1544d8b917aee6ab7118bf34e4c6d5b6cada9ff622fa6e7508bfbb148d29d025d59a3cd2adf38b15daaf32a8f78e75241ca31a26c099ef60c464d2a04f6e7fb4af72af91c5cb19d5a43b5d84ff64f15478775e53a57655201efb684c97d31f56f8f973bc9a09d06ec5310f0c4a4b58487eef7d75d825d0b62f33929c65bff9f5c7fc682191b7b1085510cfbab0fef85fa374c4b58e8743fee62bd945243a0426a002e52e72bd6309e7b5573f2282ad3112f24bb1a377a4c6b94398f62184f1d10b341c8631122cab23c76a948a927cc953c65183a8daffe6f03189e6e0a1aad0f627c342c45dfada7819f647aac14047ec68fbf178a11d9d4a76a3a3ffe62e4fc78edc25048dca9ef8708c4d4c4235a63c94dd2ef9ac88ec51c8038f31272d2ce3fec3a223a7315191188720e4bf43fff1068401d8c68df31f45b447a645029a400f8630adb4b4d2bbe59f92657ed658e4de7650494e2040ef22e929df571263f9ad3df70a4ba64d0a0c76ebbefa90bf2639494a40e7aa96d0c0d2e9934a23bcd3a8da68eb676f208b67bba762791efebb223c63c01dd72af1cf5f3824e436d8ace97bddfd8cacb2665f38d67da411c61018c6ccf5740c659a93d1d50460c7c29f4af929e405f72461365e28f2109847d1adc3a7a7e9bd9cdf5d92d0b5b41065f8ad4a99c349b2953535563b7ee98b2247b85ee9485f5b28aa20a4eb740003f2630c659fdc2200292d7410d6ac814d0cf7057180b834ec27c3933b8cacde0ce61b17c6d84ce4b78d5bf8cdbd5aee80bd936154d596311e60f4ed546ab34e9abdd0d615705817afbc9271968ebc1cb2a97cf632285795c6140c6fededb1ebbc5fb094de81e09a4823bd670b41388133827818f8afa61abce79b5b1e2338f3d80616b7e16895b162d50ce3c66d0d6413d45043dc06c5409b039eda8272a355ee95ce8dfc73febe60370a469c11f7104e3fb5814a51f31be6d39e3e7665a976a182627e69aa8bea2176eb29b8a41add57eff802ffaa177da349b0d7d82fa312b90a2242cfa068c24c6e0a5ae847db6205c192be8258f0a183306dbd57bc1cf48fe768e8f6af085e040bddb95d1151f3f22c0c91942663980608531f6f5ee77c0f7679b1052c829aaf92d5aae7dd6a51282554dcccf63ee415a7c457a9702efd5f19f4dd1a667addda286dfe0106690a23ec7767545db3a69dac22984ffec1ff76db2ebcf99bac9c54e42608593ca3084f34b53f982bf7233bb12000000000000000000000000008e0bbd06099a4fab16867e79e6264b4a86236f3a9823c1d0bd67836e383d6757078d0966e597e893b818ea3cfe9ae2c003690d92170d942cd3f93fa05fe58124bd815c12887ce81548c2bf0871c39d004269e942575920fb85508d93c076bd6e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d15240579c4039f5050bf6885bcf6bda28c6464106d1eb8bd4f95a3a00c662223c1425faef542021179c419db04ae7670af016ba2f1a13412f3bcc33773a7336442bfa96fd3333350173cda6fe259e7e9cc86dc6b4427d912709dacbab0f149320f0d16ef51d8d16759ba5e44d36f97e8e0651f391c5524e4d7cfb8407627ca70326548059d9731d9bac1492bb5ea60d89c414116c4dbcca00e75973889e67694e030de7b56dd945dd534ea78ff63319de6cf3ee429e2c407ed1ad8f094fe163ee690b213b61c9cc192c64e4b890eb5d5a83759fda99120cbeac2e77b5cc4d3deff39910e37063a1f4854846c36a726b4e5aafc6afe413df43e235210bfc2b0210353903130155ecaf7480dd096a39c363ec8be6004d7dd443bb8751a1c4ae85ce8ef72c0226a2680997630763bf4eeb888da7718a433de7e7c18ea634ada35e7355bc2acb02176e983e237bd7600f7bb0564da426eafc99a56899ac03c2daa363a5bdc2296f0213b376171038a441ea1721c8a2baf4c7bce462c67a2c4ad7871c8ff39d976caa0318ffb5d01dd3b6f7b2c742092bd97e85662f6de2357e9a5dbece5ab1fd6ea20380bad06b94508c74f4885eab2955b86964022faee9a354487df5024842d8750d9fe068df12687f938951910c275653624ae755498b778cb17aff7796b62866c2677d02ae508b1ebe27a248039ade0523dceb08f7d3befe0f2a74b3d82487dfc2aafa2dab9388619a4552910347977e76e244989c0c5a74e20787bd2ae454a98d7fb73873110837dd58312a80e99fefab86418bb805325660f2c746dab46ad747bf3e7cacc7ec94d5776a14e27fe1b94e655fc861aa2425b4d1741098a83037272405dca44aa31a621ca80bc025aee3c7411bc2899356dca2e5e010753f97de4644b62f81049e25c849675346bd490b1def1eee5ebdbf5ef41816d643985433ada53c254ed63b99331a5b92375a693c7bfe4a2dfea1ba0161fdfe1e74f8ce699b3ded075fae4607f0426d2b8e77e0440c16ad9a2ebacd96b88a060d5a9bee294cf3537858fa00dc2675e2520a22dab46e42cde8dd67cd1cd59e2c2f2599ce5f7efbfeab4c8a01eac646d394a0fc6dcd32d197d9c5edc9accc809456178a99b0ed0cbd934e4169f702631bbe7d112c4497ae022674e632a8adca1ea6014ecaf10730cfaa7705d66c3b4dba15a45c51eb876df0701f689a01c8c870a717620574e6c23dcad2a918dbfc8964eef4c1ecefcaf13935466d5d46fc1aa4555bb83967ccbefb279327ec911c2c7f0ef42ef0290496cb92ff505058be316475bdd0a404e416028811c5f79715dab0f889f359c1d3acadc896ef7a854843d13487ad2adfc47a08e442ecb70ea603406cb2e9b70518b2283bec3f2de0b402d505b48657d028af184c79175f888ebc6e3fc9bd8b57680e394b8da7e896a66966fa93e0e12079a9f96065a30a319d67290eb6916cf0c0d0dcf9fd04108fd9d9af52496fe40e05b413e19b2d795320abd60fee3acadd4469204f64200d588a2af97adf8d926a6a594b8fc7fc91532504a57152a370e2b21c67545ea0f171f08b48cfcfabe6d8a437e0b3c4b97605550d8f9ac18c659afe3ff9cb452e94bb1ced9b8135c06d554256fbd325bac22b84e4418ee2925f9d28981928d4be8dde43176908b2cfbdaa669783ff0c49eb395220cca22376f76f5cf0590d242b977a3a806ee0a84764d1af667ac20e38970adec7ecab31ca7b6e148010a319f922a95f4c15c8500ef9cef90b0667a01e465af90182c25b27828b59ed39ca6007e69919b084537f68b4b020439ae783c58ed7a460c63923bbbf67703d8e0926377f4a332146bce96aa4118481509d8149ff27fb2ba7f7d792314cd44789192f181eda67c3c86535bfaac27f76793259c2d4b13e2375e0d5b066768fa6d0058a9030aa08eeb69795ea3da14148dd1f58554f953dfd58a40553d6a24d26601ef3d2c0e952fc1a5ce5d4e1c9e2f68d3e6f4fe058a03f1ac3a74ac176a62869456efc2ad7b73c7c2021efc6da0ce91dbd606b9b020b00f64689f03245fa4c358d113095f160d2808e37257828eb4a0810b882fe936f4c4d838bafa03c13cde05f1b14e366a7e7091862fe65abe51dbe4d61a0a17c8bd41d884ac6755fdd7826484aa23852cf800983c6a06f9480f6da40efddb7364e1db78cab53039cbc50883a91b557e97a9f137b60b5f1610868b578e317c1034e67ce03755a79f5c2957eac12954d6bdd41057db147435ed6da5f7935dc807f6f148def7586f9a80af245c16ef6000000000000000000000000007aa9695c49775d6bfbafaa1078287e25e7a81f69db13b37d8d237bd0b5ae7c2cdc0d6c9ccd7d9fc4fd075ee08d85352996fa6e50687254c2498332c9c1f9c0d2e9ff2775edcf8828eedbc9c220ad54255dbb09561d3cd4a00df1d24fd620831d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000094b672b7a2826e7782bb82ae11737de3e68ccd9d81d85640f715ab5d8584d1edceef543f7f5d0cb83eec134f3300aba8ef1a7db4354eb98bce8c6d61f449bd448310886ec5dcbd90d9106fb8fe07d60284d5872aa79bdb1c57f59874fc5a4c7924810b6c8450ebab9ffc9adccca5c7f8605386e7132cc67898be6ec43a249a52030aa4cadc4da7d51038e4c30ed661ad397fefa58a609ea2ed90c56cb356be9eb90212010b99f229abecafac18eb3f7d4604b63e3919b10faef141a10cc701ee69110b0ed2d9f8c362ddf26564d4b5451bbc539f4cb50a174d1681be92f7ea7569fda108bddc13060a84821afb604996c70da366035f628c67eaf8f4f3153e81c7204d020d96d0a40e8f8467cbc48909a118408bc869e82c4e53f6ffed76db0b7b127f45030f8971ab2cd3c871e14e74564e8c5ce1a36bf682c8d3fa121f88c1ce50a35a22031da43be0aa0c0d59d7458204497a8d5d07695222fa6b885d2d3c1b1d564ddf7d031808ed87e9df58bf11ea52ec7463dd80e46b1484e0dff58398453ea1b5cb5af0020ef3370d85a7409e6f2bce772a6c160fa4a33fa0855299e067600938e05a15fdce3e590d6e52c3873b6d100be00384fde43f0379aa7f47d8d2ad50126b12aa0f07daecb5e15c6247768e675f567ef5385d1b7fe79522febdb0cffd29e1ad75f61c5010cf6ed918683ad3438db8498d1e819a77e3f5d9865c5a5b1388499558766fd2c3cb7bc444a3397037bd5245ba0de4f72ff9aa5434a9c9d8b5f1a7e225be20d4388f5f5cb3c15c84ea4360bba04822057930b63a44e43a7f6791e1ed6d91d65e00333ff2af060567e79c3beae3e74a9980e6433d5ac8685a7507eafeaf223545e91e2243456abfa44c112a0f38faf12d7ccfca0964b141ed2dd3cd98d484ea7fe64d29648ba56235ec25461e20ab3ffaa6870fb97cc2b48e48f855af222bd53d5ef1494ffa99975e3298add50ba517436fc4c452b11e3e766f686bd24324df54361dd435b7c3a1cfd85467c728141baff0bb12200e7986f1276c37211881c2bf7bac9e30351c01402d782b739f818d800fe47c0e11272ce0c13c6bc77b21e76291342f40e7004407ffbb88c0cd5fbe3357a2ff8c8eb0d34ce50145f7eaf4226ff24b4bb050315a1561afb4fc282c69bc99f2613d91efe016537e4aaa9ee6d44ced0a4db50ef6419f2d608c7877f80e607ff3767455a82fe308d290c5de110375ee3b243ffe6cc9ecd581376c3b27c9c538c7fa8a9bd023c44ffcf9b6aeada50f7af9058f79c21561062b4e9de60f7adcf1b74c37096cf0b1fd0a7d6344a2880ff4742e3a76fd773d08e395cd46dc959f05f018860fff134247eb3012d97e90eb93b300da9d77bd597ad8f35f69b440a7f0c8451cee1e12f29df55bbdb5c24f1ae78a87baed841c222d98e64c51575330d4e6283af19ab433a91a9067657ef9c07d7f168c4afd1c300eefda59c7cdd5defc0ed5836baefe4cbc6ba63f43286fda85e1dec16d0cea555ec43d9a78262619ac62a6bb31240fb5d65bebc11f8952a97cb451466340bfcbe16e44f327dd7f813a5059835f8087568007513fe49f7d0397149fba37f67331fed6ba2e9b3cf19e3f4a31bb1ead3e5982cd12997db23a49a8aa02d06460a99feb547039f5fcab2e75342c3026b64423798f007c34421120c2a223bd164a557b101c18d0351e1c3a912fdbd5a1160c1dec1b6a0b4f3502db6a1ef2a8f8fbe2b74b0c72c1994006efcd96cd0cf68fa789881ebbf7faa251bbb461fdaeb9dbcc3ffbde0a28a6d51b804f5648527a3821d7a85c5bd5ab52f684a5a10ed4eb23231a56b1845cdfa6caa1a2c6c95964570f2207783ff7f72249a0f6dd3c5565d5d825dec8606256b8c08d9746e31b048c101a410b260d8bc8ef4aa288c5894dfbd6187e4c1d58a74652494e33d3f31d58b32023f17d7e480fb006fb4fdf852ad005f2be377b7c04e50266e9822d03e22fed97b1e727cd74944addab2fbd1d59da2fc773810d4fb3a4a69598aa024a3d4389665e20f9623313ebc05224f8fbb5f51eef82dfbed804533ba259b43a98ebe34a4123f7d562d8688aac4f2230b97e26d4d47614929d626b88a31a2da3485e178f7b235db7277098a6011bd686f959717eaf20223f0e8f3386e25b8b88cb530418e84e2aa44bb69494a738bf945d93f398312f1c91944c11da44965cb6110b355506c15cd3f3b520f5bdd716c0babbabb892dad45341cc10dcc8a36bee9ef1e939feabb1fe1aa3a33774bf2a461f77efa8dc8f47ac4ead6b59fe30df7add988f0ec4db2144b88e5a244b035b674becde69a1fe1658c6d9432e73d037e12ec178ed80aba1d8a0ba2c89c99ba27b9272ec7d6fedf76453864f6241bf5e55491469cf6c54cd64f234c6ad871376ed11766c8113301619e9b979a900", "6363ac", 0, 167502891, "455b580fd754ec18bd182b43895ace9eb4bbbe31886bf727da9eef7fbf2c391f"], - ["fa84bcf9033dba0d6d2d441513c45b0d3fca6ea783da7dac27ed64ed0c3fd822fca9bcdd620300000003005351ffffffff9c80345ae2ec420276ec507611933ecaaf670936aaf0b2b0cc1c5ca930f8a28e000000000151da7b050f66dab7317adf034ad5d711e4547d240aee8aa63e13f5a55c6234514556ffed310300000008ab655351abac5151c8b19207042b62b4040000000002acac3459bf020000000003ab52653e510c040000000008ac6a6a51515200521cd4470500000000076a5152006a63513ccac9ec", "6500acac63525353", 0, 1022872894, "3e72a051d1669777e21b5633880af32c0c3e751022c31d3fabadd238c0c2efe8"], - ["0b37f89803d14061065e2f61a881c46b898c490e1a263b5b8cddc7a52f989b7b10b3710eb80200000006ac6a516a526aa7cedcac6b91644632a63a126c105f3be0b2f5d4a96612c0504dd79071d5b3d4d4e9328a03000000026a5106913bc558c602a6c6cb527fee77c3a155c541fe08c08ac00f32f34119bf9a65a942958d01000000076552ab52516a5284eb1e18013d4f3d0100000000016500000000", "006a6a6a", 1, 855527435, "4c1f9e489fcbc71d9094f219f8cfdf043b500501053f6fbd3be7a5883a675144"], - ["b4317b62015545327b317f5503116840e6820dc6901d57b362874337b5673db0fe7457738903000000016366a01fb802903ace03000000000763526a000065008d798b040000000001acb2641b3803ebe44200000000000000000000000000e31341c5db55e321fc0e9ae595e88b233e493217716bdc93f999509dd33caa8251d92e3c2855c87e040eb4d7d47c58d8de92d69c7808ac9f648a01e6b536bfb3418dbbca307896897a5a125337fb7faaf5c96f09cd7105c89b15bc45f1af104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dc3af08b3b5ff3671a26efc8021f65734cb68dda01e1af9ff256317ae2f41abf2706172f9d7fa0f94082ab91938daa87d5f6a212ab9a8bc6630b3d7dcecf52d659e95730e40b0023f69ee942c858ab3e3d508d42d9e30fb97d935eab80d36779ff3570b8413ca26f6a34e28756c412ee4f09298bae2769b8abecee632deef8100304548ce0921161a9b63fdad2a618b8e40ac73819371f77f2db3f9aab0237c1ed0216d73ee756aac36ee4b82e09df908ddc3ce60f464862f712e897ff3a6bc8fe620b25bd87eb83c7f80b7db225441ff69b7dc191cfd1d6434aca2e93dac7a54243bf12a54eab1d6ca695cd347eaed8857b7623033f9480c107f0cb04b0938eda37d30203409b68c9b5a18967fd122f267b4ff922ced9cc638290977102bc6d49953acb022b3ff7bf0222eeddc7b2010e084eef3c0195faa128f598f614795fe6068e3a000226f291f7098c09f6ebb9af1ca09800f94d5db30c88d2adb7a94d8907468ff78c031a0c26b57401987dcf943f961125f343934a9211f3d4bc61aa02ae65a3facc0e032c5aacfe26cd372705777783995f757ac1e14d4a7e168f8d0f187d835ef883bbc09dac19030f469e8654692196bb78410a576cd29b54f1ed416773206b9ff220c77cde0deca05045cc68638c51dc04b680b7e3b9f68228bbc26d11a871a82bb5e8ab6c1946692f000577b0bf3fee74415ff6efae22fb4311ba8b344752fe440aaa4595659f9b918dd30bd0c2330d5f9daee211d66f30a5e4ea67f3f830edfb9b261b00168aff97c4d569da841fd34be20feac6e4626da0c72577a21616803042bfd0d48a6d3aae7259016849855622795778595301027b0ff24431ea37b32973e5ff3823529e0e5f74581b8609f31c2029540f835669879e68185a596bc3d5f826fe4465e9d24dd7918dcf72d23d8579fee2843504a94c8fa99e0af0762b90c8e5cca6c40ac8e2d379f1f70882158e6fbc202c791c64e19efdfeac5a913098056561c6a4bfc4a6967306191d2e19991303016c388bd3e369915206e4a95f8b484fee43bb8ac961ff26b19ebb2c391b66a9547d7a68f2ecea94e554f636d1f8bc4b8ed7a4683119dcf1729b310c247ae0cad269ed12d3e866528459a80274c208c82fb27cfb90914401cfd3e0f8a62ee345cf581e0d11cdbf42eadc5c49cfd785462acbed681b70dc73c6733fdb12ae758d6729a784b95d932fe27494bbdb476a24a0f386e656d038587dc4ae1e491d13cc855815ae096398e3e6ec138da275e31461b8f44792a10c913f955d9e2b811f21a45c3ac85c0f41d67af9c93fb42adb85dd39684b5bb63316ea46e4058e5d2f62cac8c57c67646673304fa36fc590a03e0bda71f0cb858552397f0be5c8d9805fe4e2dc90fca6dc444aa9dbe5a2cfa316c7242dacd0c1d65ceadc76fe6c70760287cc0e7f4cb39cf408ba2f021d19006adfeabe78b5e7bb14c1dabd78c12db32c077666a7649042ce3e43a8aecae9e4fa87617d68b4340ccfe9018baedb3ca31b212e4d71cbe1c0bb8b97bf6f4fa4042fb01e9f20aaba395d06d48dc09e7a629df696a7f4d224c1df17a31ac77c95568b1696270ebf8a074aa144b9000da0003bb123500b24a4e0aadcb7f617a6a94c9c4f649fa70ef52efbd0396be0a4117ff1a69473e260f9711194b4c50450b621ed37f743614f20434c55d4aa3c4ac42c00c0e58b132420b13e2c44a14bc39f407493ddcafbd26dcd50227c98b1080891bb2a831863238529093b8a5edfc3132e858ba12efe4f0a2f140c82a7391a2d36c89e7ebcd53799b970f57f4893fcb613f825aedfb3977cf674386221679aab845e986507dc26715bfc41e6608922674af56fccec89169e055fc38fbdf5e9f9f52d2f1b9932705ae43e6136c702a5a23c880c9c5ae11e06665cf32109110ccdeab85351cc57828a3cbe0d433730dba360979b4b30d72df86d7dae8127a6fffa7ceaee49ba657ca5039a694ba233505af05bf5695f3b438f874e560e11f2486930c9645af61faaf246b13a5ddeca27f1eacd2d9ed54ad8ba38b85169d8db0a75696d7be32b2de494a62da931cb5eda4ef9ac14bac7c4a89f0cfb3a492d45ee453e7c232700a6b315122fbc5a96c4e45127d232cd475100e9b8b1a3a5d9307d63677b63b3ab116e0a07dc0f5067a90332c24e9eb75b818e36811c26085f510a6971de316ac82be7a729f5ccdddd86e09c431796859bf1e2eaf3c899d8e6cb1b3f0710c69470e5f7a190ebdffb29a3d74d7421398ad09395d6715bdcc14dfeb3bb190987000000000000000007623a05000000004f19b5221ae5df56e73f100c40b29f1f1f99ef5ff317a305fed39f1e1b299e36dbe4b979ee8c879b2d3684e33e2e717225e1b0b3a1a9f8db3f15451129913e3e71d6303725ff708e03d3bb0c967c8621a2c68c97003c051aa928748b64ca398500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000887c01884471d78e40c6e9d35b74ac4b349f8fb42fa7f35bbf1b2f1ebc711d29b2714dcfdd907500510581fbd5c9755b5d5fde55907a8a77db0a1f213ed430aa18bd6405587e94b06e78e66c481fae3a9198cb57ce6448d48abe1fbbe5464a6e2ed2085df2f2843c2071c5a4a5ee779e9322bcde31a14442c5e5a2ee1fcd9cb20226bb35706e4380463862961b5bb107085506337839827ffaf7666552f2dc7a320310693d699295f1fd9431f8529f1ca40c22c8f735443ac6c38eefd202bdf0a78a0a28a33a3cfd9ae90dfbc65dbaf359b74ea0ec00e9f18697e602566ef1bf5ad93c18ed55c5bb441cab5221d6957495ff5bf290784bc5ce910dc872b16b5bcc3ed90301984b2a8dd9d57dbce58a2e88ac082da853532e4d46d2f2e41b4a5591c305c40224edf0b7d5fee3a6290954a820d006581c0bd8fef8ffb3cf510035948ac226600201d6375d627e3228d80801174048bc52f04ca3e61522b82251e95ba684fc134b022be9abeceed6fd1dde3dd78014b421ef48f7b1660d376b7d6e02f8f7eeb84b70031d0ed28bf983c0665b17f1953dfa1dbf29885880d5fef6a377b0d19c79500780651cee72c004dc802b0a1dec7335875fc7bc18f6613b7814053cea91a68151f43ef504d9f0a10553f692d15bbdf30350ab9e23469f4f62a982fec3bfe05c9267ad048d1d5b461c5df946cd558c3a5e4ea22a003df018a6e7c459f99517e899ecc0e8c06cb6af4bdb9c5bad7c81e5095b2deeaaccd7fe7394d8c026769123e9df81c5dfef22aabaacb309128f68a7bfaea975aa47b465af43d5b09047cd812243cec675e5369a4bae145ef628096b4fe480548ced43893dcaf2975b6d29c3738334e893a4db704b7eae704edd47892f984db9b8816bfef25739452b360127c66c681623e576a92ba54626e29df897aaf6e566f1c85965889cda7138055108acb81b2d1ec3e0c44326764e86760df1e1b7a06580b54dca26a00d07bd0360d49bf2ae132f3dc851b9f7f3929149c60826ee5cc51459b0d474495e6d6cfbe96788ba1e0c67edad43f4ba78c6975cb031d66546348cddc8729487baec8eaca6efd5688c047643a1637c4f86e925dba37a4d192a252ba07e2d6d4d454a6d85a3bbcf5e5757b7af3024b2ad5f525519426299e0328db26fdd554ca846c7353c0f5e03f21925344ae3d4585e682dd9a439c8891686b7f45ece4ad6c61f867c80222ee50206d776017b41118e60e592cbc6cf2e0ee497d464e044afd19cbc2c5513412a4f2508458265a7100cbd8875fc8b6f00f099969a23281172977c95a7ed6a73f89b98b2ad9a9780b7dea4596d335528ebca2681fdbf351c21d7387479a6a8f8d691dea34c4f9d90f5c7b2c089165b32f00b402b605cdd237c0230c3b49a30c20a04233d34b1fd1adafbd9090f2b060b8cf6277e4f2765040ed5037e8db735b2ae1cd2f4768a56fd55dc3237c72696fc0ee40bd8b8864088619899ab0dbc8a301cde4de93ab6fd081720b06821c2b801b54e0b3863072e85da989abe616e92a2456365a5826942ab4bbf6be64308f4ea755478f0d45926efb4588c33bc4fe439c500cfa640497d472829d0c69f876dabc69aabfb26650413a342fd55e3da6795af34648bc790be46c8e1a89392f9cfde7f27eff8d76d2fd2916d6082b71d8290dfff6975ff893a5ee24cd140dcd8ecfbe3a32fa870de8ad0d609e4d19b17eb57fe963e818251fc86ebbb9b6dc3780c3c8cc84c815cb88f371c5ac4fc1f85ea9e9a5b5e3e0e7d82e78a18de6e7e3dc3d472a324201c9c4fe7d87ae9c287fbbb6f92188d65b2badb13f6e6593b222d4a4a99fcc50f4c92c3b60909e577ed2a62006c5f09fc4fc8a56e1d39c4d0b6ccd6f5112c7a80ac7771bed5076def2210845ffff066f71be94768a1eadbf099c298ce00b07fdefef9092a8fce660f6e908bc5003bcf15e1eb8090c03e209f61e1d95ebb041f509568442099495f6049efd6f220ec102495118f7f52f15444fb8b51532ef3ba6da9c028a2cfe51835c181b586deefaf05bf54875bc36d2378678c48d886728343e618b2c5107ce9290774e7a7e429e960a375e4ec98cd06a8babfbad80bd9d810b5d07112b3f7442eccc9747a7e9b1afbae4f9c81fcf036cbfbe4d4c60d2d87e9175a23f04093f54545139bc0f8dc75c6bf6d72c74aa251ce34d5e8c38f9c960b6a2f0b98b494ca39e42a5b04e72321b841ee854023d92141b277ba51f221e9068f28c9bd40676334c4ac37ddf508ced8f8ed3e1531a068006766f022d65373e300000000000000006f6bbe0100000000f6b7bbad8ca78fac5c661b1f6865db349006ff0afd38cc92d6d1efa872ce5b96ee7a6076055e7c1d13b527ff6b8da1621d70308e3f0c762a3b8364056edd2eb407d0e1247bdea99321efd1a8f8c712eeacc7f0fc60ac2066244652bbfe72016a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064b452c55af14333d0a0944fe97426c2fd88cc62e2b48e2f831b58068acd2aa3641953c02c66aa94e11754153da6785eeb5a67cdc37a0298ae5e3ca47d93f0833e8f6e8a32d78aaf47c56905d79cf48c0791fe9752151c10f22056efe979c84bcd9e8583db5863dff37274c44f4e9d17520e9aca52e3d5cd11b34de593385b480222f142e9b81d270b2e20ed93fee91182c4abf7317d487ef317645c661a9d4c2a03152345edfb654e4e16d36193766d052c00c48960fb79c73757ff874d5f743ada0a185465c002486e55c7ffe8384bb0277e833ebe932ddb4bfe63db2258fd02889a0b802a3ddb3784bd8eb57d5f825dc277be94a3dd8636a22b01b6ae85f8a25ecc021577a71e2c19b95954edd2791cf0bb8182dd2981849ab6575351f022219e1730031e6827a4ab334a1d5963920c653adf2bc7b66b978fc082bef6b88b0ee7172aa1031a1065e86ac235f7c2ed1a5ea1f46bddc6f7935439f663bf9bdae4177cd4548a031732a67d0fe10e69b7b21707800932a4d09ec8addfaa943b2ded3e45489c8ba3030bee3ff3a1968dd310bebc04d6112a7e1617f559fde1463cd8b1b3e5b8519a82ade53efb357110675a9c20f2a51e0748c0eed7ef91b1a1e361c5eb8d73e54dc2345d8c031be8bf1758242f5379f4c63c296575a9fa9bca02e8be91408c8ddc8602f3c6d4a97073cc23b6b560b4511780ea16bbfc26918271377a300a64daaa96bfbcff9edec7b7e9095ec82a58ba3e8191731f59bca1a9ac5ddb34ab4166ef68dd7182ede74be6b0516c3993fc23d325ce87352ad2551e0dbcd5bc9feb95eded6ec9a06c7eaca9564947b8629deed9928aa52b9e628df5fe0e9545fa51e8605b7908ad2751666028d1bded1bead16e94a40fde72aed1d9815da3ea1949a82cfe84932f36d33b0cc38979c75ac494f4a667155ffb220bff76c56302b88101a41559e8e5341d6b4962f92e2853b49d1678010ea2e583c5c4dd1063f17b8eb42a65f9c1ab592ca9983a48aa6b5721c47e03b759efc5c634c3a81de17fcb396c70c074c48ac81c67219a99979d1a97fb688ce0f7fbac42585cd403e146ed8ad6fe76e5dcab4dea0404451c6641ed2e13dd316bb0114c025e3a5595e08d30d128320b2508b1f1d3ef554834bf0455bfc981ba06470b5e7402cd81ff3dbecf96a5b02e40c329a9173e5e2ec28f71b61a28396f66f076412cb789a5c7dbcc98ac9e366e94851bbeb6f55c1d0b20818e8a0925df5625726f538dc2e0a282eb2c64a1acb963d4e2b026298c80a86f6bd71f56e46f43d9268ca0489a42c9f226cf86a637ab6181ca58d534f0c049eba7a10effb95b8f8bfdb09e734a7e0460cf812d9c1d01a27c866aac4723b0ebac057957a7685150c88c7dfcbcb05ebe46561f041833c80035de989efe86eb5dc64dc88718846bf5ed0a288f972b150599d414250a894c1fe20e5bb205f88bb275b6044ba27dd804806f4065d749b6f727e1c7f990d7e69742093af69aeb1058663af7a11d5adc9a16e7f7a32a2e62706d753ffac87f66f958acde75e398b39237bef82e3d6e873c8fe8b388bd556b240ac795bc0436ec83dd3c0241bf63f95e98b7a1060f4500bb5977e6391b0504216a37c37ef78a451f36643da17cef14f04e8dd301a7cc9f4fdcaf547010d278653a236b84ad60041efc63e2ac9d96a4c46223ebc68f96cdc571f844f2a8156011c446c76c06e76dac297d3a35d1e6df625c60b018509495cd6d720bb589e5739c74e6a1248d9e366664a6e3a6c6c74e6efbe1e814f89d597767d383b7b226b38da8bd24b74c24b30e1bbfc5e1a189fcb0fe72b338da81f99a6fd97ebb5fa44c3aa487a803eb092eaa6eeb1749dc8bdaf1eabb1d65de08dbf53f2900b3f8d28ff29b580f416fb5fadd93acc23b2cef5b7946f77f9246fe2b36bcb8c3b2d2ba959617d0e210257c7d2cd8e18f49fed42e985163ad0a8fffe0653ca14b8d119a6c9fc9bb1600c8483c13c27c38713a0c732b0e46e1aea30edd869325bc8bd610b47510aeeaceb277c66d26317e5e41ab8d9227b7f89df73423cded756cdb378f881296c2254dca2d9e84d91069f0e20495150fe98ded4a7088e67086328c3e7917f7dc55461362b789f9a536cc9ca5c66873c06b4e929305da2747d0044f85c4fc8b1a23177c15260e77994099ed33a7fa56ce696c2aab22fc495ececd66950fb96642f7c1997be95ad48b082923129fc9d52f2857c938472a38336a4c6cdd51f009688c03a41015e85b7dd34c484119adebb44e505819bc3c8cd78afc88cc03c9577e8f1fffb7ed4c01f50179d10e4888cdc54c247089211d8b71bfd1b451da33789de74d4ca3b5cf8e4b39c03683a1410c251ec80e5cbaa12cfaf6457c634021b35600923c7f170b344ed1d8024214ad00d3991ca03410cd9504", "63535165", 0, -1659337291, "a50acd061e7748742314f536b9048c568f3dee6acb070aa93f1ede8cc0a9ecb6"], - ["9ebdd9e20475ed0a09b0d55c26f49fdb2cb8f84c8ccf4ec936860c9815a6f953ee704ad7370100000001acffffffff699cd83250db6064f6a1349f45cc2d3d76fec3d72372a5299338085c9b7805ae010000000563acac516affffffff3668e8fe0c43529e0758d5c593d68a9e79217aa167d16bfd5fc14906f6aec5290300000009536a6aab0065635300ffffffff89a44fe143954e9acc737a71cf479550155a18e236d88668bccc67e44fac14e700000000056aac6a536536794c9d0455cf59010000000001521cd2de050000000003536a52ffa357030000000006ac655165510020e082040000000004526a6a6a494b2528", "", 0, -1346940735, "0adf5b0dbde906ad89ca42f32f5ca630876e3af5164f4601f984e73f4b6a39e2"], - ["f47e9cb0040d7035888e38d7ce54155245b68ef3f4ae4b421101e472087bc44a75431b3e54010000000551006365acffffffff2806634f410c53e42f15d457d19429bcdf676b10680cda26d3d4d8d91f54e9cc0100000001acffffffff42d2a7c5db77d4cb686b322b83727f46a36b3eb4f3dc1b5950a7fd6e581ffb340200000009ab52636aac63ab6565ffffffff4af7bfeb86f5861d7c85b3e81ed70877ae13736f26b2af22be3e7749c48f616d00000000086365ab6a00656552a1ed2e920155a6d304000000000965536a6565ab63ab6abaa73e39", "00635265510000", 3, 1002574041, "de3f0130978084ea2dca7089ed915adabe1cbe78ab573e845e0ffe1c6680942c"], - ["bc5c8d26034c25286c11cafe3a4df1e5bbfeedff181abef88ed4fb20c78bc3da4a799191e0010000000465ab6500ffffffff1d007a3c0a11d914a81bd359d118a51fa6326b07cf642e1c3fb16418adeb01530300000008ac5253636565636ad60c021ff26dca92c26e9e93cb230fdca2602392430c4f9b2f49d04ccc28c3251679ed330000000007526a63ac6352acffffffff049b963e0200000000066a6352acac00a66fe801000000000652006563acab32d71b010000000000aa7f260500000000096a6a65535263535352c71f468b030000000000000000854eb20400000000d9e98c76e928f374e9156a43ad12de000a6b473443914a8b7235d2f140302c72249074165e70ad6726c16022281f6dce179ff6629008202de39ffc937e7f9d1f36c8a781719e500c4a9716bbe153f96c991519d6af505a8bdc5ec61bd2955b3b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009b75e05f73362234db01432c9825f2cff0000aa56701082ebe544ee2c34f8bee50ae27d8247248e65326e66594e9d3959871de523fad2dbe5dfb39df66c90b1975f0290f04905c1faf6f7039646b0b617851bd17b81b044fc8285a70e92f1bdd8015625c10b420308a8c89a59389db8a9c1c6f03ff7e100c57ae9a6c11ae484f022179adc8367bbd65bafef76d3d5435ceee581386b8dbd0175a92b963a360ca67020bbc841940c6ee8f23420fc301dc6e643c7fb40c3feee68408469ba6213c425a0b2074b5e9e9de8dad1b070e8c0c17ed18a04102e93f84b58b1db42bbbc0d710ae21497cc395868c7a22939850a1b678947f17b4a7ff3a5ad434444b68f22be42d0303c979358ed2a7af2ffde334710c6b0ab074e8d96c56461531f8305851742d080311580c2f350c24d33c408c63dcb3eaa544f88bb3d38b9d08dc879112c31583a90306a2f94497e12608f81252ea3afefe9a4ce7498e5cec32119ba9008799c579d5022173ea40dac1c84686ffe35ae6124da7e8cfddfda141c8cb8b8f65d7dcea43ca032e06556819e873d1bc6da68c6b4bdb877de237d2afd2ed02756f3cd9ed1efb30715abf158da1d84863f610561e8b5ceffd8fbaaabb71286f512a8de49affb897ad4f6743b9bc41adc1efb9c15e57a3d5dde0a77b79f15ac53290f5111f9ff80695f3345ba05f4fed7982800b30c1bebfc8556ff5613bb38e7364e348a1d2c980c5ff1c7732d3c078facbf9292801177fa161892235fe9cf8cf987610220af33c09c84eea75ed8e972524ca82dc736fd78809a71938758963047b7c56a9834fff62ff2f6dcc0c12214cfe34c5c749a0ce98ab7a94a092e106b43615151090db5a2011c4167a688d870240e47e9a63609b28ce4f923c23d6185b7958dbe699b3ab8bf89c1ccc137115cdafefd5501788c3dc1ac7f9d7f03f8fbc189beefbb60e23daa70a7670659299a188e09e3be565d7f78c2241b26bcb2cd8fc6b26f53a2713b240655e36aed5d808bf48fe1023642e0c835302f80d889955ed56446ebf6939a9294b762f3330671af959fa62ee546d5e7faa1a4d0a3a7bba37065ca44ae781d7d5f377e2d10e14d92236fb925428145f6bbfc166e43be3f2c2ab776a7f01ae0e5dfcd4c350248c7548d728a5ac90f0ab49813883ac4fa3f4540831628af19a69af46e3a1b722c7e2be1830967cde78ca8f19402fe602cb4b1dde1d0cc0c7b17d2547a7416362cbb186b7c82e3d23244f83f896fbeacd531cb0eaed3001a0752c6ca1b9ae10de32ae2c2135033b0418cc11c0289e795f2f3913e61b04d421b47da5c2bd4eaa0453a04449bf4173498820e95ab3482cea94a5601dd124954cdc577707799bab1949f7a12b04a86fcfa8f36b507f501950f12a1bd49aeebf8065e0c39099d5f1366335d743e21e634b8ba82a60607dc68e5344bda18d79bd2941b0a5173401edfc7130ffe6e5f337a5570a56b9097d50ab9cf6dc2aa1d49d459a054c265c808649e25e5ab2304d0b3d17cc490ca13f7940087fc415277024adea323576331051eba4912b17b3b055746ffee204f6e8623d7afc449e1196c33b02fd382de2beb59d5824742c33b765d1a4ae114e19574c36e498b6c3627713315edd9da0f18f104681b113af11824a9c135f40bc838f00b395d9ddf8fc7cbfcd751aa773c8301b6b4246487cad524d2154ed9d2f1f0aa0c1c3cd4c2252cabc755206cba067119179f6d7923843f065628fb23aa435436e83136b4eccff06039583fdb5622c0d620c8d685b8a5c8e99728541984388bbb202052a8d8ed054447c4cfe3029f3fdd66a03a4d9222b1c8aa7d164dfb2fedd06cb951a104f28d559e779093d14be557e9aec0db333256ed93e9502e694caf9c7e99f3b7327d7252111092698ca45ecb9d202229f342bad13fa6ccc0ba66c75855ec4964427149f2742236c7dd2438167f61abdb0aaf01dc27d291dc44d79d99ee1856830134c325da5b049fd51e8140de0eaf4771ce58b66983cf6eda62361bc34fcfb16d72cf48622b81071c3976261285b0fc9906017e34ead89ebab848afeeafc3a4ced874e2ecbff436f2e753b627617cdb263e02c536d08a598e404038addfaf38fb05c92712a259ecb3c270bfe7d1bf8f25d04faf5408b1813a957ff1dcff4c899f4b0e7c3773844f9656525e59f0bf9254e3c2e494f41ba870d3be5142f8b03102e07fe6855acd5af11841c6e5a3a50241af48bb183e1c15528d98aa82594572fb984689887e88360c34a56a177499a1a111f3ebc29fb993d0000000000000000bdaab50400000000ee71db8515537c9c57d82d6b0bddd140a8f22f11a55cc6898e32a65177ff9a02529970daae19db1dd16224dcb6da6c4413f701c9d0207a6b6c62ded800eb285208a413174ee90692292b2d5f0380863fe79f8fc9b10ebbea845835c4be0b3cce000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008742baa6972172748d18ecb9dffb0969643d2807bb5123cee4b91edbdda40f45fc5237f816a68a0ec927b234c82c8ee5fcdf95dc4468c2bb115ed247697dfbb0e0c8ba5ecccd23d0086cfa71d18c895e8d6cab692e07bf89f621926eecfbf960acfe70a773efc9cf608865a4296565a8820a9f2a7c550d4fa9ba3510bd4b3e3d031cd506fc96b615f6446c655e9eb0c07808310783c3013bfef88ff3da5a3896c5030ea1ec70d1d420b8e973970720a0f8035fc690e1df27841748df02e70676b03b0b0b2c73dea58b597ac1851c55c546bf464f4cbe2b604145d548022863c5accbe60002817074eb514e26de6f5040ac810d154e031f52fa6a9fb5cb743b1c8fc8ae022eeff8c2eac9548420b8c18e6242d74d16f42cbbebc281fecdc102f533123c94020ddf6ea5890e0f0c7e3205e6ee175853d15d72b6fc3b0ebe5d3e95c67a4d0b53021b41deb2b7bb8c173161849ee43db23b2b8411782be28ed2bd0ec8984bfb19b5032ad6ce55dc97a2a3f4ec3cd36485af2f7592cd5c6b5735688facae6955711c950306f3b4636162f36173121cff2fbd51ad3677be4c870d42a1bf6c503894cafba2fb083259b0f4a50793143d2e3e6f868d0c5c7dba05007fcdab1fac0b9443ef96eeb0d86ef67b26ac59a5b984a4ec67f4cac3bbe862c70065f0953f003d0c672487529bd24ee8b4765ffa017221fed7896770224a7e5a73d66525403e905174c4c7200a0ddd2110140daec94c42e55558b5c1c3fcf7ca20e46605faa1bf4ffc77ed576855027ad817befa9101d2c29b7825ac46d1eca7a454945e729782a69b3d945b4b89cb3eff2a1ca1796ec6fcf13b107c42019f1e1455e60c9da83702786addb59973e840ee3b6775d5ad2481ff11b7fee5288b96c87f525d42ddbe36d90f0f122a1438a25d9ddb7637cff3d07ab1863ca5096ab92c9d9edb56ae5cb13c7ccc71c2ef859d5612564464385249d7be93c4d293cfc8c0e1ebf828409d2031c60ded3f735eb92b60038b1496810dfcc81df6ab56d578630e03df843709585de231d2206ed6236682a4ea482a0315fca8150885012a7e3db0a183edcffdb07297f70603dca08320409adf6042cbdee502e4dc0b5b602f076b87f16bcd5d91140850c3b8cb5706a8558cd742bd782a8ab453be8def490f6988f015f831c7c4169ede585a290b6edea38c1460d026e86206344f4bb953937534e07fac75dadc1652d2126b6bf99c0d3013c76771bf89fb64aa3b355d7bb38fb9dc65c4091be9cc1847d2c63c871ca0ded34b8bb5c9d2c8670cfdb8363e434ac31a2f2cc7f1edf5fdfc42b153d560fa246d96fa7287967ead6435a02a5128bd8511aa848238b71f2556a19ab2823dd5ceb9c89deb6b0897bdeb1f78580ec479f0be7e1e17d1411400baf9c21536cabe2fab2ea4c50e5351ed127a4afc99c0f037a2a3a88de2a511f3b48de9db3044e2cde2883c442e597f285a43c5baa14b18166403b11ca12178459406599b44c6e1cecdfd3a5d7864295ded100cd77cf695e9654e242e11ee721db8dfd581d599c3d2face220ea18fc935081afb3a5f8d97c327e905e5eae6172ae1e199b0acc880a579b904c5d738e82571b32a7412f1f21e5bf6e4f5e4d5b8fb9529a16493a37925f4e5911348c0b6f4f2b22ceed325408d881923d8933a309900b6ebad672d156b0e5f2af5247ce741b905e27a11ccbcd4e4e335796bd81cc2b089a928695f1c71159dacfcbf7b36889176dd7b697aa9370a932ab96f07c4a8f0f0f4fd69fee52ea5b9204d2224c88d83501d92e3f7dea4fb07270d8cad5864bc0470912825ed8ece071e246780b9ed8a91a4b102b88a04215640ea3ee6ae6d6791a4c5e42b9878ef5cc39e5b05a71c5613408e135950950e269266cd0c767391f7951074a1bcdb28d3c314bd2799c4d4d8456f2c1b8cbdc5eb2bf287341f0103a096be4035060b36615b8c17c08e464da07d4334d0c63f767e8517fa1fb3ae830b143e398232f55935ea77b8488f94a7829205ae8a4472ef0e6668cadf0045a4b101bbff17358d446700b4c9cb69685f0ffb46f6876c2618e9dd120d234281863c13bbe0d3fcbfc6859b84241e761a72d6acc35f8db995a220193f0ea73aedda95387aa07e921d0d76c76f69497976f35598ec5af700f70047c3a412fa5fe765e958fd30a360bb56c61ff6c7063f539968211b6c470a2a11ca1fce3dc3ac379a565ace15296ec0d534c123f79a1b88eaa02ee34e17fed967cd8e3df3b79aa54143a52be0f37c8ea27c11f31e44bb04e7d9000000000000000070a96b02000000001789e00ac17c724881cb0935ac80fdd60da5bf6577ee4d428f54723480b84725db6fc4cd0449d741a1d6eb1dcfa24272426bf6d2c477baa08fcf7bdfcd7035ea1750730470621c2275dc8ef837d824a8a4459c4b98b36acc4eae8a99aa4bd40800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c6dd41907a9519b977ecb0d944514e1df85e7ad1354d2bffdf9589fd077047c6d63c86acc5f21fcf0557a6fd52e821a22f582477d5897724131e9c98ebefe8e1fe048c6afa2c59f874a3c4ea5684c4f2a1eb87a13225c87b8d309c9931a2ea5d8063b037952ebc2c2a3e476c4f84248d8c1f3eb14b7a6d21385846afadde0b77021c66a914e6006c441a2ad4c9d2100bb93ace301e8448fb1091b832eee94f92e30229b4d7a6b71a9b3e62487d950303df088d131dacf57e82433142131e46fefc580b124060297b1a8e4dedde7bfe55257624db945835d64453755f488b6f894e3b0612b34ea0fd9de3b452f048755ccabff9f8b55b597273f50e8045b28069651fdb03172e067863134f5ad043de7246609f230e29ee756ef028f5db1b6d8600bb465c03198f63847ad26e8849cf16640e95e54a440636eda5dea78a11df60e597cfd4490208931de7172bba75e8bfc5051bff949b3a98eb8fb7be006023ac1bc231cdab6e021c366cee84b53a6c2768e9e6ec4665ed671a19c822fffccb217d01a0ebc7829703002ad327baa3d5d686b1cb68543808bc4d6c4d6bd2d3822b1eccfe4419f6bfeeb89f4d3643370140e4d045442488be7c624ce429d227fbe0b5ca1c93ce0b7a5f55699ea5442eeff95ddd03347488499d4fb4c184ff6e862e608a11278bb37e70b3be6cf5e08d6a8f3ef16b3e40812e7c6d23633c878d85a38ed94170fe746b57cf1772a77bdb886e552134028834f315482518666dd64046053301071fc6d3123a868bf3c1b391feae951b7a94410b4d7aa3a5d34997cd920dc29e4c77bcfaea13bb77573383d9863834f26f9a46754b44c4f5b61a2206d59810369ec449597921446b7c9396ee34be7a224073b4b3f9159ad8b2bbf239c4ce70832bb79bf16c6db6dad39379093f776207f6d9277a4d90917512a04213efcb266c39b6894843e297372091a8dec939b99cb1bddf4c156190d8469191db53c2bc3fbd5380a033539f07304d42a82c8d45fe9fb9cabba3a6d769d71d669bea420d77d5c7100f130b1cff07e9c39285e8b30af0f12f8f7d6e2aae10ade8f5f038d1a9393d461ef49c43de327a48375f6037f5ea74d2a9f123cc41ca805998e84afa4ffed452b0ecbeb4fb727add7e725ad2387a726eb19509f5770a1e24d68b0d6b3f8a0b9a7e9f6e7e7b13a3a44d012d77e091abf8d0c162fa2a6fcf7474ec4a4f3a0a8d30e83ff23a586369f6432067987c000a685d777a5bde335c5277280c88da582696a6fd33f984e938ffd0e6bf63474df96a94646844ec0e6a33a088735f3a0597a1f7a69f28445fe33a75d8de628387478e9407c285601d7c6e1ab618f9a960b382e8a4ee3a138ba4196a78e3e36cf3fa9bf795b0ee8fc85dea966a32bd7dafc0df2e9f3385f3c001dd3224e41bc3882fad0a696b8929f800e78a005011d05d01a8f4586fe9d597b61047c14e5a36137da3148110b942718debbea1985e3a6607d00dcb202d003591f7c1e7452742c09af9f4af835e25e584cf5e80008a7f84737a02e281f1eb1de08b7c365af265d6bbe002bada8ea225961eea1df5c46c1844057cdbab73912c8ea8651c37ac7cb4bd47b5ead6b060bf191453ff96cfea538698faef8679c22d30500d964618d43eb5b673c99323dc93b601d3e0c0a643e8b965d918441fab6900f1e52c0b8b8a07a15abf6c35a7c42c5f7724cd204b10782e7e72d31e287bd3c13efc7a2cb279de579c134fdc88f5983b1218632ce4f69cadc3198576cc0205d1cc235e0ec222ff81cc6a454ece169c3fc2da47b00528ee735390efe949f112f8103b90bc8c33ece8f113b3eeb82b97b416441dd85577c68ce7fea69f886fbb326890da0cda686d27ee9098703776edcfb22793e180947c24a574c651071f9da09f341f86cac1548bde5fd4f84978917f2a64aef8ea685abda80a979ac2789cec81f4162a6ca86dd92ef954bcd057e940f173e05c9b4b78094d1c7ec77e72d14282895013cd5aff63f4919bc9960cbdea95342f265b1d26ffec9be87dcbc1935cc75925593c0b3ca8159cdef1ba21933d6e0bb5449ea68ccebf0114fc88f8b61a10c4f92f09541a62531a8fb2f977045fa10e24a190aedfd8584da727dd7111b3a8573811bd886f71076376e375d9234eb45f901fa20e1bf6e687c231983d7ecdde9a83b93a5f89c4db24dd6f3e1956b4050b2b39595055c0e8f5e313cf0ff8b7b98d14b031a7fcff8010a2be7b8220fca108c09646219cb9d1e22233f67c7c6704cc6854030c5e17d4686fcf5541593501a51ebb3f84fbfdbe085189115b23908eb1090ec6e2fe098618ca6e989ceea83ddab020ee68aea59901b9a9295182ef29d6b085b02f48ff3e8938864c83912680e54793f8480bc3f6b8696d99f5a4b5cee071f10cae06bcfd1b2d4c0e", "00ac5251", 2, -1325687916, "d4e400985a1f96e4d085d69188ae7ba4ef94270eb88e05c0d7b627dad95f152a"], - ["8364924002c191d9b6c340d9b499d244c51c8d7df3991056d82f2d3e8fb6eb3d0ef894bdf9000000000665ac65ab0063274b06532a7988b4cac6f3d947ad25bb364e5eb669e9553f6c0075c41b47a6f92ca4704b0100000008ab5265516a536552ffffffff012e44ea040000000004515353ac00000000020000000000000000f4665e01000000005752eba3f2655435ba29e8ec0a0df735bd219ef11090becd0a05546d2ee40f3052625de2cb4c3e7a0312a56828f4377b90575207bf19c4a51ca9929978e301b950004013df107d38d3e4a968649f834cdaa47e99835af81d34d667030e43c8110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044eff4c8b97816576e02a0acde96d02dc58507fd7a5afb846f1280e680fe76d146fef0415050901ad17561065c121f4ba63701062b28614f3653aeeafb2e712dd7c7260a49e2b5aea0e6fc0de0f4c0f953948af5ff874b21c835f0e8c91fda7926ca20a6276bba49fcfe9e1124f98335481b14096c6ca5af277616c6dcc6c50a03034b738ba95bb74dbd5bcc8a087ae4267eb192605963dbce80a2cb7636d9887f0209cc16e6292419a209f41aa27e470e322fc23f2e75d89f70177c6dde43fe90f70a29a9eb997ee02396003e6471f28ebf3e7f551e33baaf27d368aac907468827a916b716304dd8e488978ac5a821ba0cb57599065574ddebfd94326c80f5c70863031a3e3f7a51684a6acd4e346ac2385532f67640a32e1324991e33456bd02ca79102054f4eb3e5b67d6c26c3f68f85188dff77ba7f261cc5966a401484444713488d031427c9ccf20cf7aed8abd58a24aa0eb9b2085aefa480a214ec657929417f046d030b03293a5bedcb43e3f8de71bd8231f55a58792a3e420e1f488f5e68611a5b6d02189d8a0c4aade43263a89710ca7252faf718c29f0e60750e02c91ea0c7c3800f0fc3b66f486c74d88de1a1ce973ee325f91bb9daf4da05f0c93c8933c07116c0c338eaff94e188d6ebb454576db0fdbf31d2655bf9f6e5575e74dc50f65673c07e43b8c695f32357de38ba642a123c65474d9158be65d6645e19b67028d96296eea5a3f8041e4627cbdd4caf022285a3a3eca289ac8a311b120e6a6fcb8e17658ac2610341e94ce28705fcc32606fbfb5bbce7b6c5d4a3ec84b58899a9d32a83fb1a1c8f55da393e39142d5c2c4fbab8a062f996bad6f029ea6bcafed5a4f72a2253f507987e5f3547ccf91a7dec0bc5f0c72aaeeffa374164177245bb853d71848e372b4ad0a0dba1b808cf014eb87ff1e648e6622fb79249dc42732ea92a083757841772e7e966782d9bf7e72593c8610082354fed14fdc9e9ba2d74b05532729650be0ffbe8904326f8986d823571a541730c96778fc163d3e376390ebf3882613fc49b7214735ac4be521a7c8d985e4b154ea13c758421b611306438dbbb5dbd39acf449aeabc989396fd9b2314384b60bfac65fdee415790851a8117be1bd69690ef24a210b2d40bc54ff45800f44a97a4603365e00903355d0fb5fce83cde57e8573e2665550516663aaf4c93f54a0924df35398e88f8fcaaba0f1d24562666e76e53daec6156555a4adeb915383ec3f2a214c586a8fa318c3f6f116aa6de8843b35302a5fc3db45c97a6e08088f56661a9d6f924c1400b8310da9e1bd5bbd131acf0f36f329470323961898b939b16cef8127dd4177eca42414150e220dae434b1e492960cf5388b3c57969dd743f7380ac7c5d6c15ac5299015aeca72f6a096090e5a6b07e492990d0b12246f8fee9ef8989e3a746fbc7a4314ff7d80df1f2cb988d307f15518c38dd1ce44d0dca9e6068be725c22db0d4430bcf34aa1f859f1c1f5163d335114f7f85afc3ca7da596b6b3d37d7e32a69696651c91b7db46ee1a02278a0231294b5e276b9c52ef85ca675fd063e11e2046811df7a1218da87499d02fedcbd1ae6303705345db19e5de25c8d6b841e6c6a9a8962527613bc626adc81fe203239ffc75ad066cf132c07a86f1b43ec7d846e039ef142680554e795be3e8ca14322130010114cd346e09d0ed57ae4bb3db9c6fb979668bb7295a08220859f44c49cde45aa6fe0131ab3cf6284e0ba905d6f0291b400f874240c728b57957e6f5230fc9e3e0f0e0d58a44b4701205d0d42f1de846bf3ced4b89fcf5b2120caf1a12ef079052f2a59a4a964a140d7af5fc7890608e196c946d6917563167b5bdbc5fd339f74529259e8775ba0025289fd3acebe3d85e00b941abafde025172c44d373d16c2d8205727faef0e774e9c686edf09081c1878443cb115e5117b96ba4147f7814c5174f43ea72d29c32330950091ba266a64bf48d3bb6a020110c24df616b451a3b5ff580b2c81c58b827dd479cb871308103d0b1b1b38449c56f51cccb5df135b34506606d6b135a461a2fa2d1db34534390d66d296bbd3336208e09d79217922bb7073a05454bbc4e0e06b8c92a58a549b641a3c1bf1db611ecce9f2f220ae79d4089a18b91de107288ca04a5e33c9f11a66212908ef9c2f11d2e4a650f2f7ed73fcd2d66f0b4bdd86b1a927c8a74d569fa4bec9363a3c7c8f13722f74eb750230614127d3c23d125eccf341282f0bb30f451cd761d7dc489e04667daeb7438b56f775484f12866f303000000000000000000000000d82d5c3ec7803c510a36ce55d9d907cfbd81faf9189ddd707d7c52282f169c30711b6f72101108e978a102d354880a367e213af8b4fe136b0ec99ce28aa1a550057340af5b2a29a09775a2970822323347d1b7337c46b6e55d795e347e4e41e5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c30f32e1e270cf4047d9bb9905a2e84515d07d739cce97f85b6b65ee9ae31f148ce6e1c4c58f25cb21d98290ddcea3e393c94fbf5cc33105cb8a99e50b2e74f6e1f39d0c3300d0a4ed1ff82e616e249208bc33f15411e1aab030af3b138cc23df790aed23bc80d882f61a04f5f4b25c8ddc4a4027e8d0f1be71395aab0efc4d021808f76a74e2b19f216712b9b6c9c946bb14b379604317dae42261128ac54d0b021fee390bc2e3286c70e2e5b09193ea3821f5e50e6665f4739dff44c965e480810a034f161b236613e4bf6916f8dcf1661f2cb1fee2c5535db15b6d6ece2e54f10b22211a0ff4df31b578344265a2229defba5ef90737d0b69cb1d355c13451f366032735be17d3da6f3b9ac6c0b8b4f7e3f8175aff143bcef1560a5b20ede31a6c15022c7e17ed133ae9d66b62ab1f2edd6f2178870ad4c55f9d4ab90ac22d5169ecbd031bcdf26f3f7c49f0b560795495870b333d0e9777f5c5f110df5a718c5816c485032a26389b7b8f51931998e43222adaac3027f90c06825ee055ba393716dfe273803053a26c418a442dfe8f0fabe558c9bf8b7dbd132db39813f65398ba9dc34f940a87ed688cfee15762cc15c30936e35f239a943d04820e2fdb17645b013232faafc1968be47a5d071a61ad4db05978f2b4a8061e18774c66cf90d3dd142a4b1b9d5c0007fc9146de1227cbbb0ead8a1fc0fa13872886fe87cf250a395f262586cdb4d4e69c832dd83af991dc0bb3c97c7c660909811d65327f4c49a802e6351cae058f14871bae3971f814bd3461b2927130c41338a9c13eb1dc32f91697b89dc73fbda258a692e5c3097072347ce4356da28b93a1a8ab35971763646f91ed94a5f0df3868bbc314eaf731d577b20323c6eb1f3be009e0c4988149246c124fb35e06938e32341d9809dfed033a9063e9ca54b630359f7db412e1c81cfeb4c1dc585e51fc9ed14e6f385e948db70f796f6798ad6aed17e330587c3c69e1d1c7b70d3505a2446ea42634a69bbc7623ffe6a83bdb3d2d6fa66a3abe3eca4fee9845dd04611a2e44af229e8b8e9f704941ac63f14b26d499aa478dbc17ea676c1138f911456f635894242b3c5156f901612b9ecb78b2fa279ac2f750a29e74a993ba0d02e35cfbcd02292d1fffe6ce335b4c49c31e1d7773f67e62ceb2b120896a1c102b4e5d23fd414aa33ba357d05b9c27b4d4a634b051317f6f6d6515711ba67636a7efea5b0f744e96e5c778eb45ca0537b7fd385cfbb64dd0f77ddf1b1045b1d0c523cdbe375705e957ce54ee89c8e0ab0d81208ccc515246951e72ff9492dd4cfa4aece981391ab6dee37676db059f7c87ea49da9f38be9772ce3ed026449c520579232822e170b8e98dbd71fc286f9d34e51c8a2e6106064ccf2a5863ee9f13aa1a2e1a6f392c798073f7538146b4b6ed18f5b61054fdc6cf928ea744a8c47c464290c880fed4bc73ca37a9075fdeb66e512377947cbefec53eebb7772e06bc502112f4528e52f52e7695e22a2eb26b0390f5ccbc5effcb9a33c51fbfa3b23a5a4be4565908688203138f9a6c6612372d4bd015b5aa8e622d2d780f1f70ab81fc89404582a634869d9684a38a50934df952c3aa8fb592a12266bf5fea504c28c728440f8fd587e8984d872f4fad4cd674263e2e0bfd42f6642ac69ee7740fc50a6a80c8fd398e4c5054261b91ec001edcc8d2c41dfb0152cd17ec2971ca6faff0004d29fb6ef2dd4635b8612111572d7016c90d9ad30f23b0ba6b53bde4d770a7947b5f8c1a8204af7a08f2a03101ce96bc4f87415b672ee6608528a9a67d963ca2f287fb52e6938b61fa30681017aff69519d5a9bbf3388f963a1bb68b66165ea6291f25d6f5aae9e8edbb58d3c9b9f6fdc5b2b3b43b8c44fae519b8ba6fc246780ad3295af5867a1a472bddb88279b4ee7d664d00bbf367e849df3f68b6811592e0a686cb511dea34a9d140fc2cd048219c60cdef64d9d6003a6866069388fa657087282e962cdbd44fe3d1e4df6484b34cc6a8fe27e895f371388b3a617c4f1fffbe5586bc46ccfc2ca38f81b23c62a536cb6e36300871d78fc78b1ecdf66ce2a195ec39f45fd904d5a5780f36fffeb2a7e65cbd50ff9fa261edb9ceafaf55fd035ab6e248f3b408ac8abce851524d5a6ae59f46109b46047ffe15be60165763aaad5cfb435a45331a09fc09ae873f53732fb1a46e53952bbf77d839f9e4d41e88587eef887759ff903815dfdf8e7120d32ffcbad66cb1446a97bcfc63c1a7785cbadf543cd83101d0dd885021a14d1fcb2a36bad0515e166e8cedfaa4624b67aaa133f1676db9e85dc674a59878913b8b9b9363f6dc3c14afdaef801b15c8ebc3c8cda47dffc2b85a1b05cb2bbb15d02caebd9b100bb8e12b2d8480d5d4cf5f90ce14015194073055e86d94a678b09", "65ac636a006553", 1, 111584454, "ae9a1f4c33e051d22ee01be50a0fb5052d7b6f37b9210faa29eff238a0d6db3e"], - ["b6624c1601ffa40b37c26b187a5e286188219041d35d9396f6f659980f7b601f7786f4aba2020000000552abacac519b3d01290104a07e0100000000085363525252ac52530a856f5c020000000000000000be9b2a0100000000588796a289150046530d442dc20b0fbcf38328d59a54cc33274815fe0e0abdf6fb25991d054f6076f85b973f8dd0db187b7bccc298e35cd7cf1e26e3bba3273cd4b6872e89943a1c17e9666efc3f5dca740a31cd9784d731f134fb87973309030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088aac9e3adffe00f83d962f368518664309abcd6eae62eab46f1943008820de9202660da039398fabbffc693c866ff56b1e4dfff741f8644f0df435564a3ec0972d36d6e9cc1fd3ee8c6445ac713fe1ce95f6c69b4277a4e60caf499fb39077cd5d93850be1b258daba6c1d44f13638247f5e7e189c8b287fc4d322168d96414022db15787d1ee437d0b97dd936624a1505522e79ee55b19558c1985132b4e8e3e0209e524010bbb926f9ebb179bf2ec4527b04d95d3a156bd0d18e88daa1b7976220a229951ee4ca880777b81320e65f270b108b0735e207b6bc0cca8ee435bd104ec2ef7c15acdd7f54b6cc3d4b0de941aa17f9c7bb03419f844a0ab64d7cf2b2d2f02115c4ae210216b041f21680aa978df5ad59b42fe1a66d2c09a1f16fb09e7bf690308a4a34c9ce18c98278e37fff10d81e3a5df30b963d2aa35e6c2c7b8e2ef9af803046292fa7ea38dfabf0dda3b7d570642efb06e1c0ac07b89e875a375a14e15160327eb0da766f05661ead0d02d38204d4b5de3b8db122ed14a9aa3f6f651f73da2020080d7196a585bce20e8b2bd4c898c0083f5cfd9eb09d2a39d1a87f88beb49444839f5f9dc9944d90ece91940f9a01bcf906671bf9d365fdb141d42c13b0d1cf0cd35a7cb8183c876c3ff9afe3d17e6e22d408e640a544480c40c31cdfcf065d9ece11f27f6ed9977e09c5ecbfeb121295f9262ce25fc733bf80271452451c455b718e523a362271aa9da451292fcbc8d4238b1c4b7a3e00c0b0c0c4379f9776eae04b2f78347c38b4ab4a7e6a1bd40d41c6cff3bdf4bdc74899dcfa7d10d017479e7d60c5feb0e0b6b4cf2f54973e2cc9a1d6ce8a066f8140c701efb82f2fe9079ff8930e3c424a69f4bd2705ccc09cf27090a978e0e319d5c8b91f2c68f1dff268fdd37d6a94ea8f40595d363a08c0a3a627905b0cf0e8b61134685e48fa966edda8ed7f54ff0b2bbaca160eb69a13d011c77624b56f252c9518326e7cc8befaf1b539d8617cdd43be2e1ad59169fc9f64b2675c6d5701cb777fbd9a4b090012d044acbbc0337092e6f780fbe28240648a42ef000f8d497f4fe1a8ef2f14e05f162d3f7081480338afab0d387a3b7ae7beffc7c817ddd024404f248a53c2364bd2c46b7115f117266dc488f903c0f04d8323106e6d5e9b6c372a2548fca8b03257d0191fc5450f0e9271ff4ff079a502b83f590fa8000ef37d20266fadd4e541489c695cebfb79a0d9bc9818119851daf8b6a9a02e6f88fbe9480a25d4c90245dda897ece4fde86e52e8670b64e06d00d8753d414ef015f39cbd425ae8b99786348cf77dcb2a566f9b1e7e2f6c623a42642afcc151869460dffd646130a0cad96a16ffe93d5ee7c4c0c4b3192c129600048f95fd0973ce777b8cf06dfb69e515aa52ee5b7daf8c7d4f98ed071d05f4537cf9ae15b93d304357ca401139abb7be260cec3d9f47803e7479a3cdf51826754de5289a0b917865af3c76825c1c055173cbf22f4d85f4dbcf4c56b8c34808820bf51f990ea0b00eace7dd88c39e4ea865fc4b59c15b45b71676b24c2fe8fb9f39eab1c016cba32825c80a0d621360aef80390ebcb2b35cfe1acca7bf662272c7bc50a02c55eadbd905f3f574179744b41fd549268d8efb6e6848b96e966efb991cf42eb1f6f127134ce92834a74c5a727ee1525d7ed70a051fafd038833349ae33669a767690e43676060adac5f8d424b91107723ee65cd95c425d15305c8d08bb3ac44e061dc281280f9fdb65281362a77e7dbb8ecfde405e34353b16aad79695476e672396825629e8bf49728daa932f00500accd0c25ca9bed7a6b3e9e052f5be5e73aae76465e3cb4d555719b5859c75b79bfb2a88c820cfb1ff095fd7a8022656c064622e4060371654cffa87413b88c1e7f633ea1802e73cde0afeddf7fc6a9e84aa8c47388de145462880edc5e87e9d7812d9021dbd570f0a6c690b44f6b0b70a76451cda140b83b26aef88deac4042fa04110895305eb676e345b88ede86ecf892574e3670101ab7e5487385c29a587fc88c5a95e9083c9bc17aa18ba1487ca761c13a179014eae0b624eea20a325f783f34b426aa31a0da3537986703481926db0ce1993dd3fba04e33db9589a898d58393ab43980d744a03bbc6f6fd4c11e6a5c411d4f454b8259a2aa893cc054a94cd764eb03e5146af54d52ae6ce6eac77953b08100ede643b4025fabad50e16aa8ecd7e20239cc4456a5ab54bc480dc604185ebc560409f61b1820977a7f6d0f865bcf487f8a1a5e152f0da2c2e6ce16010000000000000000000000004abba0baacb8b7c49c6087e5a887027d8dbb85bbc46bfd22cade43dfcc65cba0d610756c48c9d52ab71e29098844893be4facd7517bc40ce05b2244a84e12516c7fe09517906d1571cde877502c7a7fdb38e278009918543e1876d3212b54a93000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001146af6a917891ca2c7018b9236ad169872af0203fc2ea6c66b9b5abb8bd3a0b33d971957cabb53ae689d591dcb8867a6f6348c3910f3bba59084f7088b172271588d2ad4fe8f85ae87adbaeb0d4465c4fa7db029571576a9edb9732b287e9e922e7a120049f5551bdbfa4bd34961b405ce21752b9606429dde74d4d037c798503171ca25d475960ede1afb64546c2ca529f014d3b55ba878376469d0b5d175747022b35ec345213c3af0de572aca87d3a71bc65c2fb4d8ef0cba974460b83c538ea0b2a1f805efac1a16ae7697f447c69e9a7b5d9ce60fd40ef911602cf208c967f262cd36bfd097efde9aa900645fd755a4851007ac1545af146a3dd5b5ca7e3dfe903241ca21f76fe8afe7c15e9c24842b929ed6ef4c521d42f95af0495d2787e6345030d32e33f3917628151715c782cd7ea20801999993fd7eaadc09dc9c7a7271420022e10a87e3cba1a409c7aaec9f359d7941ac30f6e9ea654b67e971f2707eb57a0021fc559af64631556df198ff4c869c361f701d2c10784dfef3ce94032ff50c474032d4c709b0990e9fe55b55ac7ef284c71df585cd8f8a3499da32ac077213d6bebcd4b6d4759b7560e3dfda34377c6606a7bcc0dc838504474f2c688cb61bf17b3597753652a591453ec6be31d0b1e22fbc86e7c746f1c25be123433322174174f375a6c622e6e959edf54cf2ab82b48bb37eccdf9ea88ba885abcd836b95f290c1df17b6eda944e340ea4b313fdb67173f52cc1bb13639e1fa282102fcade3ef78fe39baf962f3f5bdc658c6b5d48ae718a88e4a97b870f8f5a5f63818c547d93b03cbae776e4ad00b12a10580c66156a1e4fd070ebb2f4cd9f75d4bedc5384b7412aaa92df6b93445dcc57d458df8d739788d124d7008296c40c044736709faa6137c878518f6725afcf76c53e35ea78b168d6034bc57e416d0bc9749d02fa111d65fbeb182860efca14a8736be5afd343ba7a905e01d177d6a055704cdea64f21942035a318082780f5bd4ba6c54f788358fcec8c5ee42b71bc04b64bb357762a9bfffe180251f409c67845b78e5f928d5e51e1787a5f7240bfe932dc279209bc67ba2273f16e04f95b51f5373ceafb88046856c9739952a315cc170c4648c838728ff0059d46d57aa951d99fb151ee5c5ddee1c9aa4789f00b647d4c3b3dccc85d6259940f67b31b7b3ed25142528063a2bef5ccfffd3421a1e9feea148982d7ad73166b67d44150a9a35fbe419597b9e4951e913cc6869bea3667688a94a637995675fb66b393ffc95cb3e18fcf4e875da1f3009f495d9a2c9ccf7bc3cc7556d804296892abf0698360b4c6846edf7d6d9c004d0cbaba63af7365d30db859589d6c406ac8ce96985ce742f8049d5055d8eabe302ee54dec7fcfe63e83cf11f05212138c62e5165ea32a7d48cb99069ab0f547c428e1bb81222c1ec3078269aa6b807168ef873f1e25e32675819c1fc0dc4e419c5482a23f9703b7d785cf3d276bb7732254859c2d248e9efbf182fa2929a31419cbcc4cba82d453adde408c219d19b2dd0c3367c6ebffe435ccc22caf363f436eefd080fcfed054aca28f6cf1e94e53812911eb83743546e91bd70dd65ab8b3505342390577e0a34a794853b330563f6b42d22156e0b5f2645d1ed9bfb9e5f62013cfa200d4fd3fa01b5628324364c8e14cf4818142b3d08025a39c8863a199fe20175d68efa2a88c9b04e2028fb38053c4fe6ae818a38314c4aabae53ee2cfe1902ba37ceb453c66d5b22401ad4c550cb8f690820adeb8d3add5a9e4efcb70e876a8994f9c3dab4ad6263ce86ce18bc8be62dbaea3b5c8c45f4819cd2c838211a5dc85fb5663cd985acbf0a4ce3a7f891aaae8189d46838dfcced0da0e05535f47eca2ceda9b31451cd8b2ec570f82d99c33d93ea5695dddae1b264d13c25885fc5847799481bfabafb4dc01a0c7a3d53f282c2073c22d8c48a1eb00ce0ca9e1fe09e2a2fdd0359af7159e85b70ddcbfff678977cbfacae6133173ba1231f38b1c77fda68f3f1422f444779dec35d1d6ff8cd7fc62125ad4d138810c23e4204b2ff43f90ed93a3557548758930b1bcb0e1a392a15bb2b03dec454d6a3683e06afb2e01ed3bb890ec3d588c44e9dd1f08a2046e1edb4f4d78308d792669cabbb3db8b5d39f38dbabee44ca504644add7568a5e59dfac7cf9464ad90c16efd6242225b7e29347aefdcee2ea2c68ac90573f755aa7660e30a7a1b32ed3da8028d3419bb08d774a4393cede2214457595b665f0befe9cfeca2a2615e22e05b4fbacc1ff173defafb1a340bf0fa133eb7d9388037949533c3aab1b5ed114237d65efec3035f294994a7455607a5c57ae5750c05850f9c90159975a60ea92acb1cd62beb004dc083cbe06a0cc95d8757484e5673c1cff40c0cdd53ae62d9d206", "525151", 0, -813588375, "847d8d58e3289c8d346cfa5b1f9214b1e5462fc79586b985c829fa2a982b35d5"], - ["8eea8d72049e59534741a8321bfa9bd2f69a421b45ac9ed8af37e5e1716e28631c3afa1b260200000005655265ab63ffffffff765c02ee0e8e027e0d3ecc575b23653585e11a7c54214cd412441becca5aa3c20300000005526563ac65ffffffffc67b50afb5ad3675f927861cbf20764cda9dfdd9997ef1e5355e27b71da240d000000000016ad682af07043e6ad517701a6ea8a6d5ff856094e60bbf6ae64e7340b4ecb40eccfb67c68d000000000400006353ffffffff03bbbc530200000000036551ac5f5185030000000000c4a0c900000000000153a99c51e0010000000000000000a1e1820300000000b934df8968a9cfdaf14efe4cc4ffd70c1a93234d2ca92a2010245e448bad4eb1c1549eb1d25392c5f3826521fa9b8ca4064875e63ec4dbc8751bb7cb42c9e0f749253167de42946c5f956cb2a4b296c008724f8b8619a7fa2f4c93bd152b10ba0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075d70107d3ada5248c6f0be85d43d5a79e05205fb97a3ca55179972f94bb5dd98d2cc3a6c556f36ecec7dc29c00cda0b10cab3fcaa820831dc177f2b5307f7e3979d39e1e3e0952dfd0093b64b321b31ef4e6b0a3c22e3f7bbee68edf99907f03644fd42d5b8e02fa61de87c6ecce6496bbbe35022fbe31c7674c71689c1ddb50308785b344295f6c442adf5f71065fb5ac110d496c9d81208b755bf6c7400e2f90210144353fcbaf16dcac5ff8ef491757b9a9c4eb7121ad887c00fc9ae1cd7123c0b2233e019405d69739ed2f7a7c48cd933af4ed203a37125f7f2bd289f98cbb5a82edc474fe5fbcdfc6e2a26d8afc11ace1c2f45d6c9d08905b68b8cea338d3356020491864efd4c5e5cc22a48ab37e49941ecdc8660e106114ffbab7010044a715c02033520ac0d8faa3a7bce7d1837602d702e3efa25710504231efec39a502608150225726e64de2875f24dabbef59faa35944e5ef9e1568684d1d315635811095b8f021556f4fcf4e26a28cf45e0f93c6b6ee97268414bfa29f7aa1570b443faa2c51f022f900b4c4de9c473e09a72f37531dd1b0212d74e5631e7e2019750c8c3464420ea5472f4b0b97477ec536139120abe17be36c40c671c17a6b28a163d7d5e3a27f4230cf5e949b83f43a679bb483bd9280b324ae0785847ebcab6c464087f35c9b1d7ff9e5a5a283afd619f0db8ae5b983ce3f732efe2b0346be28d9276c2b94776e5159624687ca7f82f85fe4cb78ace38b68c40666fe8c0377744784226fb904c99afddec25fed2dfee076b580c9d459c7c164104ed2a810e3fcbc602360228ce08a1ce885ad533b0087c9f3d04306b5097c3a6e4915ea02254374662fe3e60ccb120c5e343328368e5c606c8d17b3463b4673ef52a9f4312fa926e68d420bf0a0b4454920047b65f0dcc7d7a2669e2c09117750000ac5cb02d107da7e3bfed0e0b4dccf05e2df7c96116b89fec935764aad376dc90ced94dadb68c8d7c80293a4faca175361be133ce66a9ced4f4dd04ac6379b5e7e46b76f0a6df05a9c6f7035bc27c431eb96194948416aabdebbf73d64ba1b0109795d4ede7853567a4d3ef150bb0ce220f6d05027977e99609aa28dced791571ad26f9dac3bfde9b968dc52ae50f2f807a1ac2a3ba365a4abbffd502ff383cc50989568df800c6c3cde192534d496198aae3ae82cbc0f370a9e1cc3162f8be205a7472ed322bc83a0516d5ed16c022b1127d48e18eba075100d74bac299016c998892ac3999b1de7fe733c846cb72969a67e53e482b4dfae41c8ece706179a806b0756bebd55e30287f24809b5d0f586399bffb3559b473a69417b95e55348d3ebc63cf6d8296bfb5147967f037a9d47b366455a684fd87d4ed070289379891c2557bdb06813d46f36bc47e67e99d86a7cd400e7719b9c6d7678f14ff9365ba6d9072e783636d9466ed9a37ea88ac5d3b7299384873468f1091792dc3cb29797e991ff5749f33781ae357e4fcd2e489eeba23f9f7b4b1d5fbd0fc7f557359d03366f60425f8875c82e914acdb6c65afb223a2889c365d3f5135abcef68270757f45d32ba88528695d04340f6d30ff168c2c230bb046918fbd0693dfb389a4ba0ec75872e4bb343d7e1b70883f02caf22019e917c55dd405558bc1cf32c90d5d9b463a9aac47fa5aeee1bbae8f137fa70b6bf33c79871fbda688e9b341a70f9a5be58cbe983eb281302a400b5c34b586b33a92497dae5b1e7b1c31a321b10461de66d1d3400bc0d6ceef7b4a5cbeb71abadc20830c1af6e6eeb9eb0469f67142b1bbb389e29df79b8b1d2f0dc002cc9942b26f5034c3313bafce0af580934c15eca30375d29c01c5267564803dbec9823c87fd518d3f485c315dfc43d2ac5674fa567d9da16b09ec500c8ef31a03d711a57b83bfecc6ed4ce8b4cd752703d88b06950a4cd7d83bd51e59d4702e507d2b7f662c4b22451f867c6a4c3a109db1b9feabcde13cf70194737a74e6974a83e36fece984ed0760b36d3a04d531f23badb9d67565ab029e2d68d015113fb4892772c72abcbd9c5f7f0679b9222aab2bd0f36b2b13490b2328efb5cdf0794cd2eed10036066e124074d7755962372fa0a6921be6b04177efef9353808c66c12d1232f99209f2aaf8f2cf37b5227bc4192a19cdb64224d6e1488f631f07a5cf4181392451083d2f6314db41759492230e2ce1c5243f352299790af3fb991afab7cc5b3a8a7d655809febaa60a6a91218bc3e43148e378a20f4df76a4c3ed5955bc79492c47ea3d8a845083b5a6902bc64d208fa5c0b791aac48f8fe4fb4a34135428d606b56e507f60acc01771cec5710d9b4ad328fa3cc9bca3fab916b062db0b71df6e146119b2ede19415757feed9322cb1650e8120b8baab0927e5ec6202c260d84a4d5b21eb34c36c9d4e07", "6a65525253", 1, -1958060010, "f35691a0c38a23dbb55f17be00e5f307b330610d1add51087ee979b58bb3b5ac"], - ["12d2440b034f63c818c24fcd55b113dd79864f13c17ea994d44906dc199d8a3462604299f10000000002ab6321e7a38c1193cf34ec2077abf72b4496ed1625f74e1e8c74f1a08fe1775107afc11a668903000000004b8816ce1584ea979330d35ace064b911117a3eb3476be1efa4b684b19f7372aa6ab1ab10000000000b0cf69d603375d670100000000016a380f89040000000005acab53ab5271f0720100000000009fc9085103502d79040000000000000000000000001102b0d1a8ade113c144c622ed5cdbb77ea1565934d8a64ac1ed82ca120916c1e18f28f6b8c507ed0f969c330a398e9eae66b7d714def8ac71e633a85ed2a736a96b22a15a0b9ae5373144f6fcb28d48237eb6435301e816c6a51a6c596e092400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b8f3f214d33998341fba65d5c8cb6672aa4aeac87208b5da66c489a3797eb0523960c6132a74602ac22d9f2f4136c15c86f14b7f15f910b9f1f0ceb2f059063fab9e33d7c96e148957d9feb99324412f0ce394f7e6b17a8caab45884811941c1b5cc88b02107e18ca0e561da8130f23feed8662ab13b726c5ebd6887d90af0c402105ddf670093bbe501962e38669b5f4d5298bb9c17c96958b2217c811a7adb72021cb94509ecac16678258b12dece67b4a1819ff543b14ef9b6d9d05b38876a0320b1413e508b84e14c2f05eefc7aaea1ba72d627221e91161293307b4bdfc8cbf85150b77e4d3d04e04ccb5c539b4991257bf32af607009103b8ea6cd8608750c580315ee3cefef4e9f9fa2d3c4d1c8954fb9bf47d6c1ad4a4453ab761f80ea05dbc70202d843596fcead7c2f403cf596aa80f97ce3d08b29ce62aaf1bace6188ee637e0326a8535ac525324dbbabf6b20823ade96af50e4e59a8ab1bd600b430d4bbdff4031845dd0485c0e069e7f9bb966e7a5bd75f786bc3dbb3be6f6838116cac49c1340323c974bdeb17de6a9f352ec1f5f9a6daaea78afc833265a2c7c051dc2fb01a95e475517d6c2564c2209ca55814b56f92f27deac6f8b065441a6506ed180a49062299469097e0b6d70676f55829c381dadb8e805991971136abf1c166fef605b62af87d2c043f6ba1847523f074fe4100f8b2ae14210030e7b6a613130732841d71300762e2c373577e211b6976ab795eb44846948d445f38ae1cc9ac9abfb7e16db668418b0b10a377d8a46e0f3bd4b60d393bf6e94bd489985f4f92d0776b8256b0c6ad59c66c5784ddd0aa0c456d530159601d8d4bc935a77dc6f83ce44dc91f2a25f35d6f2a72f64a36938d34c0523ad61f515e769c0081e0249adaf16f28cfd47642d28121e583b96c50efa3dfdd5be3d7ab9b13c3bd2b88fe8a2d9e7c061e733230b6ab43c38e04ef4cd9a816bbcb71c88ae670e5e348341a139c4628b617009093cbb866a6859a1591f8706b9132bd2074d6972f97e34c42092d9665bbe37953e0ce7d66e326092ea73b7f4dd222662c868236b55bc08e0c36a713af44765494d9fcea405893a74856e1ac2173eae49eacccac4bb56a82f9c22af680171b88f033e9770555e47c556a4067ca16a318c50f6e1fca7568cacb3eb065267b245c82e9b56029efb947a3a060649173b5f62b79c8fab211466ebdfa9af122975d5c7730f14ef2a4e42cd547dccfd7d42f42c376086d48502cbc090dae72792c92237cd595eb0ebafeb3b0860de7f9e2b4be33dd7d2a27c52ed33945362ab8f902c4fdbf19f3fcf258550e9dba2ca440c4a023b8478b8aa8863511ef0e5e58a0e86ebe3cd0cf8d866695db4380a490c4098050d0c7a34af6c2e74353bc8c7e3db399941610261af82f2ec5ce6365a8d432cbf145a4e819f25243484df800c9964279a66af35c713f7d5ffcdf7f5b11cab683e6f33b2d37299549349e748ec6c09788c001c4aaca9ee710901803773d80c0ee4e5a15d469e5bc356a63c8d5e0e188e58ab227e4d93c23da0e2734ba74f754442608714eaa366e2dfcb2a963d8a52391daf03384d088778deb20d0913a75513912cbced18705247bf95bc94d5d34d3bb4c5604b4c9a0905c95a5d20c94d101b8f6bef58141a447fe6b5898b4f204cc546f6e0363ac0bd144f520b287d379a884f0f44031e799dcc7f32da75d5c8381ffc4a44984e05b505c00bbe93519947f0f08e62fd59961b01eef40f06404ce65afdeaec8e6af6bb69cc6d5f00af919265710210482115408233822d35ac23548656f50a579f61469269010db3f0bb93d59f7d278080331a73d8d307fa0443d240b242c776eb8e067a3fc2d65a3d8e7fb67e29907c9731c051173f98ca864ea5c4980ac8e892d33d8f4824eca438f3232022dcc56419b616d58d595c8817305a6d1d62604a94c4ad9b1b920930038517244ebd8fb9e4ec89a39594eb9e81854d6a00c87f45ad6774c379dc9791abe800cd131516534c3e934fd9ab385215c3be0ddbc5d1fe599dc0d67f1458bf68e3bfd66769f1a19bf6c1ba7c7c6d3772a8db86e49b081ee904863f2305b0e8fac9199ee1951d33fe566e0ecc3f95fd05aadd1877732ec2b6aef5993fa63442accce120a0dab8abe42233dbade996b5ad8fcf61904481152bfeb6c176e04e98482dfac4852868b78f8fbc1acc50828acb6eab3953494a4d13d6822069fc0aae35ae807d7182843bdcb53387a4729a697230e4428ff76c510878fa3d8ada083685d5263b76b7fe20200000000000000000000000064c3e2d1a57f4a249517d3f63e3bbde8d7836221674ca7f804e6b95ad11a8205f943c7570d79f91935927a8901020169e2a14e77b5ccf5329ca5c0e7430ebdbdc7117573f9c7647310d179b0ab602a4c3c13c0aab3be8ccc4ccf660c5ff06b0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de9c2255d86257a3ec0e6b8a3bdc2543b05dba0bdec6ee970859cef548065ac2e3fb0837afaa667faaecbb09bdb86caffc3810f35cbc0bd6b6080768e6d793a1f1f4b7a6bad71a15d1e4ef792a550dc224707c442ac405310d5d5938df14ab954808607791187dd2995fbd47ba9cea0af80421ee25f22aea977e334b56105f660309f9d206d975bf7ec4ab625cc4adbdacb57022583aad30ba26644b7579642de30311c976d9ff8835cf301314b25cb9b318910e7d28e756723e342c423403d3a88c0b0cb087a3cced3a5d8c3b389c6e29b56d1dce22d24f2615405994d28b3244e5432032ef7eabb0fcdb6fe0c1202b9134b27ce4ae9c0c50abe2c4075168c64fc63103235972c4da78a4191cf392a43f3878becc7a751bbbe597148dbadd5b09fdf9fc021c45cd567ab38653e73d6518f79d275b398f01229337afcd99f570860bfdae4f021c36d71b6bd22cecfe4ac9f1112d7e68a287f0616d3aa450c622cc72526756e6022e9bb81e3d37342d7b0125fa40871f65c5c6754c64d46a9ccb54f742de292cf6032454879bb97415bc7085112e26211c4ba639b1af4f0e00bff4826cebe32dadf4dbabb444d80bdb466fcb7b2fb4d5af08642d0005eeeaad27803d60d8b771b93d6ee5515877733ef0c0fd9a1d42408547fb9b0803f577a73d955b061451f6a65fbcb8f01be6a57a55f788f0bb186b3f4727c7b366adb948e26e3af869cf42f3b364516d7195310fca888aec8b88d20215306064eb85b544304641b6fb1b3a3dbbdcb6a82fd6461b657ff708aac43f546669708033c1601caf07801b92cd85caf2e7e8010846a1038e35330fc14185bab513e23f6181c8615c992f32be487151250fd4c8331c0172dd68102fc03bcd9db7fb062b5c647947261a9445d1e15b6c5cf3eb4b269566ebcaa7924f071be92e048be9211d3756cb043427427456d37071fcc673ddf5614aa927cdbb14d25bc227e22250770d7a1fe3f255c289090287528b9a5d90e6f862a819ffe2b30fbb9c24d450c54062e4c11abdb3163a7f8317b41f5089100c24abab31f16607707b6f0777590d75284931fba79c1545e00c1094dd2983288bd49360685fb07b8c6f11afa77970371ccd73ec503f569b13131c1f63894581785ef2859dea25d941e3844152ecf2bc3a45dcce809206248c383d4cc502e329217d8d132f788112e38d4e8973c04d7a2dc188df142594624e0abf13f3d226ff3699633d302bf0b7fbb0bd94e15468deb8ddbbfce948d792ba5cbd2a84be5b6da55caaade4b00663666bd9afb475c68eab4cf32d57e493667e6ef9b95a681a54313f496d83be028ff5c375802108529f72c8be96639a67af001a810f49ae5723286631fec5a1b79187baacb27f1223c679cd1629bbf6907c42951f85e3982ad9cfff6ef928f0654064772f735bc7d703eb810c3a7e1240292c60928381352bd66e3bb45114e4751469c0875fa6225d373518cf1039dfd3acc2b3b35ecc53da46e1434221839ef42a1337dd9b95d51ea23b83fcbcd021e362dc39465565b74cf522f12a0bd88a2a987a78a5bc056ae15555844ce54b3010cd10f662600e5e6733471473943c8cedab4f905ed45a0903abcb27abbe00baeb8a31cddd5eef8bee67acd0201a98c17c40bc93df3151fb27bb33ba5b2cbd0cbc756159b0b2fa11cb93c256e2087502dbe431566f77f7b3ff92d6f7b3279a13b8ecc0a766150f27363a32cc1b1f747f526b331ddecfa7a57791d0caaf1af9a897db3c40979ab4c7e9da8a8563e2cab4c894b949b1e33860a56ef7a347b045f7c62fc92093118000fa280c19a73398c7360612fa776f6aa6ae929eb18e326fab848acd609c061624584b860f385c31fa63b1b8f28e62200215111532efac37bdecae760cf65386910a1e55304d5a1041f91cfdbee3e22be6f022530c1dc0d95b0b54dab432dc8140ca52b84faaafe16fd33a477264c266e99f3f01bfab16ecc7310f02e8ca9dfaee1cbd2c09461330652c2618cc0b2beeea73bf9c443c7a0ca8acee89905ae64a3fbfeeb7774858b866809d1781a21361a181cc6b2d25048e871ee82a8c0956d86cbe1b7e3c42e27e67a1501d874798260b72a477902abb16a4f76719651fcdff7979f1dfe2307e8d89641fd12c9741ef7d65b56bc7a70e7212aacd9b5875cd63acdfcad78f51389a2654bf118dda47a004781f729063ce2cc9ae2b186014f80f22cef1e1d4e4e4f25832c7a038041cb3fc1f179ae45fee1c1bb13f216bec2fb45ce20b5786b35125713b9b1e4ba401045c0000000000000000ced2f100000000006a19095d9daed068f5530705e37ae57a4a1de489cd06f17ceb0198a3c06373a455e24bc428d55d1f2bae876fd246526fbec24278537cc84fc08f04a1fc68cf2e3c92ce62dbd219bbc25b12e245330e89d996f94a47de1aeff8ee7af48200206e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ede7f40896e83c89765327ce2827e496cd3212159ccb07c7d37ceb5c48c9160558377915f0a51c40ca3bdff9b7380688b5a2dae9c6a9c2edc9ea25ec9ffe00d29d2de2d84b99b951f70629403ce7532c4b91449c62489b737783da0cc3da5e4b5bcbcea411b01d4c78ef5cf76d953c5c619ecb315222a9688a9f76ef03407943020c7da18697ac40746a4481bfe5b056414b67ff31a2d5a8a3024fde681bc566680205e96dc9ead6afdcae3f9969b52893330528fd8eebd0dfc22b6ce2d3521c07860a2cb18f103937423173144dd9c182f61d5b24b0e4acbc66d4fd52ebca53081a9b123f25acd9bf199ad3594472dff3dafa5d14ef00fa1f9a337c10e912e7a0bc31032efee4cb17e9b2d84a136e09019bc68ea50882e19df1400255c68671ab1011a8030d5054ea7e7e72dbca3c8df9ccb54310ea17724ea2801e413cfad272f16ee8dd022e75a9a2369ed45612d2245bb4857d7e5ec616767af439d0ab319a1e4af9724c0211eec32c332106f48cd82a2e784f3f59da713e2d842b06c8322af9a83878178403188e614fe8940d50d15513474fe0b6debced368b5c0457f196de7f905818c69e8b48085b3598c2be957fa493f1be52d84f0614101d1b9ab8069a647942f48eafb7f2fabf7a8516f8ff26d9f88bfe9a60884a12074379b33365433377056466c315d1341198b1657c459b75d027ae18edfc7c720108bb3717e72035f86fb50c39fd52a1b6a28d2321d5ed76647623c84f5294cf0d29fed32637e0472ae7b864afc3eea2c5d02e478256a6682f78543912990c7af33fe8af0500a7d6552bcffc6fa765b78524e9821a80e693e90deb0e503ec96854e6c105e18665d604ddd25fed7b9850da86625eef9559b6b3b4d4662c002e90da08f697d15711d995cbe841b7b9dada2f5cc8b60edcbb7e483b7ae6d4cce5885051b402e3c6e5491045c8fdfefe85c1260c6ea83b6c4aa8f9b90e38e15e919904d46ce3659153c983e4abdfc11d71ee4cac44ae4cf18d77e88ec3cc663b79b6290a7b10216ddcbf1f4bd7c44d4935b91596871f34502f26a84732e651414c19c76c910378c032970fd2dcf1f6f094486a1bfd7d33ce975859e3f8325984cf563ae541cf1b67c9769452198ebc7aa34b50582c41ff572d708c9de322f4f4b0cd5fc7f2d7aff29fad71f3ecb7490a459d9736a8c4687b9b4a92ab50d78f0dac3a6a30509a88744fc207245856a873406b881e0a70dbae0974a0ebe5de736fbdaa7bfea9f1e74110405e89344eab1ba1ed68fd92593a1c532e9cdbbba8b26d69f4ffcb03f946ec2f6d75da843c295c0b7f5c25ad6c9d5e827b9f52dca7659ef9b8fb711e85feca40a21cfa2761fa39abe326762a0ce95c41e3835895710e728c59e09bd3eb41ee5ad7eaab7795764ae0d757b26deef09bf7d21df90a50b3261c3ba20991205dbfcc92ccb384aa6f302a5edc5855573cddefc26e2a7bff7638a88650c2b1cef383b8ca60478b4651a4c47c791308dcaae1f4f7094fb5afb3bc3931a55add9c8e779391988e1b9ea4d3842300a5bd97cc6ffca62c0490fe9819f581a436716491333806c0fc910a44f06a026d3507401831952d863eb2eabcf001dd34c397f1a5a11eb6345dd7bf46f1a3f2827f1b106a5fc206a0690ab5db35ba9af79a99025f5d78b7a33afcc3c8bbcbda6d98ca09deef7d703a260b5c9e30220d62fd8d5091a57af6e2db269e62ae767125fea9357321fdc6740b5b62fdfa853bb134f8034586b88d269bd4d4b56b9d6b054caaf5d32aea5827c8dab7ddf06aca3ec267e4c29c45664c8971f15e5883a52e07c9ccedac7674a72aa562e291c6576823af9bd8092f1ab4fee921a597917d9c6ed39f97e62d0206799582f1d1390f876f744c89d959cd2f7c02bdf4f9f4295ea5b0fe214ef3fe4f27f4ddd2751229785ad84ccf5cf2c5c77c1f76a43394b162c10f02c39da7e0b41334a5cec12826d2cf8e391b8050ba609bc3696c7b1927691ffca3fcd6b7c6c42c80074bd1130e0d5d065eb15743190d55201f36ff751c8d450d7b3bd69cca56d696c1cc0433cd989b2b11b8241a7d4acf9ae83502f7298e547374e83a6a67b190903f9bd13164978ea08b045c3e489cda49c971468688cf7d479e0a0262e273c67d1239af32a0046577638059bdf6fd015f165939288696e92d52b135f06f0a54ada811bb1af094392c12d31fddc725a95559ebf5819b946970a503947b2b9a21e6c6744fe4142b8c4b5a45e76e50dbdeea1292747451f275d306e7296c1912f6bf579b2b4dfe58c2db5d3ffd6b7eee1ad5e38bf82189f6f5e0dc13d79f5ae03ebae2b497741f6bc3cd8c309cad12e9a2a1eac84cbf1f350d3ab90ae6124af71beb2cae176cceecef0f990f358ba55115c6f16dee73ca5b423bfeace5375b83f8c7a189d203", "6365", 2, -750381347, "af9f8c5599567707f27b2f6aeec73743d102621a4e0210380045c322446504f5"], - ["214e28b003af544be812464d44e22b4c8dc3d3d4b0c65efbb4fec73e41575096111d5b9f140300000006ab52ac65656affffffffd53eac49a44663d481fef714caf85b30100a519fd146b8b665aa2216257bcdcd0300000002ac00ffffffffd9cf4767ad113dac2596a58069b7a1258dbfeaa53e24af7c3ea8c4b7d056e4a3020000000453526565f505d75303e0c4a900000000000852656a655200ab52b3e63404000000000852516353ab6a53512ecbf9040000000008516a6aac0063525200000000", "ac", 2, -1283255426, "28e67ddedb91643ae4de8d46b4d80902c093ac38a94625a7846ee6bce3a24379"], - ["cd63a80803fca0fa7ca3ac8d7c80ec1a4009af3efd5f3796d12eaf70131c3d996f0db1aca90000000004ac5353acb09ac11cafb4fc220a99df884d44f1ebc3a69b364e8a9ad9e23703fd0b3ca1d093ea536e0300000009656a516552ac526353fffffffffd3190c418ad0b4a77d023da937da482d76b39a61909d3e94ec0052d558f3cd003000000036551518e48bdb302fdcae30200000000046a6500acd0fe52040000000008abacab52ac0053650000000000", "ac5352acac", 2, 696732980, "f29d9a223444116199fd6993fcb13ac8972241e1239ec100083f314021dd7382"], - ["7541bcf8042017d7bdcb49fe74f1ae00e35afbdfc3650c3a0709d6c362ed9a227a539caa2c01000000036a6351574c7a01df84a800f1c252c5d4d78c749cb862f4f71dfc74258c90405a287eff5da91f190300000009ab0053005251525152ffffffff5a8c08665b4a8f53ffbde7567fe74d837edaaafe8dc33eb35f822d176689cd440100000009abac6363ac51526a531ec30443c1ee7f324baf539a6bec33b488b259bafa176fbc3a641b7481082e60d487901903000000025300ffffffff02b5e07a00000000000763005252ab53ab57ba620200000000026a6316a1d60e", "51656553ac", 2, -1104625456, "ea5bc7822f08606f1e7424ffcf2d809bcd7bf2c26be5c0974e220af8e74cfae9"], - ["e1e836af04937d105ca23a12aa0b31de5d61b57b1172f30a591f18acde7997cf2554c2551e0000000006635251516300ffffffff9ae19b6fd7df800d68bd0d40acc76aa1aa4829a6c13826d60db53dea1e426c2a0100000008006a6a63ab52535394bc96e9f163a287acc46e6c6367f46d09e3e701b80aa3df4ae1d4e1afc19e537e4387fd0200000002ac51997f4030a370cc0a1c7a04365e931647cbaf0fb6517c4e5596a8749101da155236c89cd80300000005535365ac6a35e6f26b03a822c40000000000045263ab635f00d404000000000951ab656a52ab006565349b500300000000096a5352ac526aac526a3d81eaec", "ac00ac6a53", 3, -1056346309, "47958d5b000b153e438bd118d8197bd5573a762e5f1b16cf2a51db50c8f86b4b"], - ["6baf4cb4035df082d6fdc4087ae0ad8dba2d1d7334b9edc14ad2525e0a9f7ff3469b920e3b02000000036a65ab4c002ef79fd584210a4dbd2e4490226085b7bc1e1ae7a412d168b7ff8e429de73df4ff530100000006006a510051acffffffff9f0f5de6ff6d5ebcb56463b35296e1b96c46fead630133a3cfc66723b89b8fcd0000000005ab52ac5353ffffffff0173752a000000000004ab535152db4b6bf2", "5352", 0, 1174973847, "c422a2359177c92a63e2a1e251f5cdecd470c0811452470073c744a6db6621c3"], - ["f02b254002cd3289c08ba76c07bcaf78d94ebe15c34d5abe3c8ee3090225b4567ca66bf8b1010000000652ab00ab526a9e93a9c6722adaee59b1f41f258ebecab3f5dbdcf150fc5cb99adcb98d2f70ffa2b129b9030000000851006a6553005365ffffffff03772f510300000000056351ab52ac49808b00000000000163c9362e0500000000036a6a65aed4dd3603353fd804000000000000000000000000a8c4c7f95be6f4ec3376e150b54528483e48d9ded92f044304175109b2186e56d1c4d878850f952c9316533a16250d90f9a4db026802566a0e65afd940def6d2110ec7351445fcd693c3661a65c0e368e1d28f70a9deb8f039d172c9240b7e02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006856150647578f9963e237b6fcbb802592deb6911aca54eda13e03e2c851b1abc6ab967b6a8054b76e64973ba373566e0906c2e1a009be709d6e938c1c9418157cf2209946528972ea6dbbc5bfab2e384a15a6a91c7d6d41e9595faa20f417d0f9640df5a2a10f90d35c26230b8f3ddacd9380db46e86847c800e1e14c1cba76020a19a36c3a37b56c1d5c67db8243a5f0c96c9421e84214b613a100d1387478070320a1996ab8347c72d19908b6c831089fe21ccb03872facd53710a6555b45d0cd0a18e131d3fb7dc6e55a0e4638b172a85ca6ff2a4e461c9acb329602ab5b243ae401b9a82e8678d3e9bf52f618c62ea9ed56b806247bd89aa068b5520c07dad3c202145b65dacb748d5ed03e90eb7f96adeae0b2739bf2ee26a47abdd4a38b624b3402287eca8d7c52dec4c0ae592fc1388c6d4886ba0344f10f346101aeefa69b2eee02253cbef503ec6fe0397badd4397452b42fa58b56dac467d56d418d78b0184f83020da1e26291475dc44e4808b5e83cff69459597c6aee9bd9ce08d196c4055e6450308795f1ec16a15bd6330aa69323d1084661f5b869eb399cc5e26413a2513c1e6bfcbe114a668cac87498af7183551bdc59958845caa110f0b300699c990a1a575b8d9b45f8c64544062157a62213d289c06f8987452be2eed49254dcd1142dca1e7a0cc0f5cbb6de18cfd95bdb42f75648586e9700cb460847571aa38a4f400003367033f00b94dff3978aeaca2135c509949dabff373459183c79e57e98479f72008b724f9c5a19f47beb5787c6fef22801c8c99ebc7e68e8334a54709d7d621cc54c98b159fa664b83594ee937686b946af26c1c76caff5e8d46767b997491fb4723d111a7e16391f9c8c83d7e527f8e32978336b3f9eb00fbf73ab2d39a73bea0a7794996310ddc54a7b7f4c7b05a0d55afcaa8d640e956fcd69fca6188de6c44f314fb8db86e9486659aceb9d1f39242c9039ce400747e05f6b943c2ca00b2892c2828de1318eb344b6e529e87337f2017ab577961a94f17055682ab76e4017f0fdf381528c94df7431f271826849429702959315439b40c3ce1abf354b5120624ba1adb580ffa76a895e3748da6ca1804eb1ff3e689abd52922420a4ca7f7caee5619cb55d481fab50665fa5078c666804a02cc2f7dec1efa291799acba2bbab9b63acab07021382e8c7531e08b654d451e98ee38318cb50bfad8bcf9868eb6960fed6fc6c2d6b1ca915cd6b4df5e545ea873086d60cf6ac0b64bca6e6e4b3240054c7ef812d5272dc217b5d4aa8cb7099a5a4816d3320528d450142938bdabfde026be540b48156d1d376f8993a58793068c8945b628a282296c7f3efa76feb5f643dfa6563d5c44a7561d48ca8405cde96d1d5d1430d7d6ebc2212e5f1c2739190dd2ae3f72a15b29f0ca1566ea9b1bde8fb5bbbb270660a66a2211ed3eb26c437e7ef7a40f9c6c6cb46687b4a165def8a07fbd6bf05fd1429c3c63e5703ac4f9da315ed4faaba6b74cc3c2dc8bab0d78798389ae1c787bc57b39afc4d572796d7d64605a65633dfc56b236214d7fab67b5f481a4884430e6c07eddc7096e995d70a18d388e9ce6cb98dcea761f559031f650a26d1094cb49c12d8544961dab1b58189ccf8657f13cca57a6b49886e252f1e878b83586e8159b6e297fb7362862f914121d7b764a88b2d9e67cdd7b9f588463069f026c3e6f98bb70bf0e1058162682930465398a9dc4f3efc654f9e2cdedd457c23515a1f6d8a87a147556ef81ba732b04cc4377e8b53b23962d046a73691671354f26b91c708d110a1ba4013125394a2e7f10dd457cbf7a25280cfde15f4508fc31404961e2f0e921009d6de4963d8f0e2b38140386c30c1266944df04081d4a27016c6cd4259903011146fb3dc671e897ee27e2f51cf524f95eedb1ca939481e8d2e53eb845bcbf3463e700f8190c9c225a23fdc160553106778d59b4ec385c21466687788785981b216b5074f946e4934155d70c63a2dbd8773c475737a9302460d26d36d33695b920002356bf3e04783c6d2e2f7519735a4a55b8d90b62de8440d73cec7e2e783950272372678b07999c9ca9ce9eb658c04c5e205953d9eec7c7aa7087cd09489ad0d1545126779c480d807b9d58c0a748bd1905cb8726916a5719aa6d882521b5fc61672370a4b60aa3c432293af4e783b0d90e7601a18788b5b7106fa9f36da6bbe2bb2701704eba721ed7abcc61755ba012f9e46926ff95b79a70c58bb8c5240087a4f095ad8e00f4d23736e9dd4153952cb884800000000000000000000000000a3c0adf0aea334809857b699300464d37efb70976caf9befde18749795bcca5d35df6b0d537ab5d328b5d92e4d3ddfface2c8689c0fdb49e84bbd76eb5311f600090e4e7f12f9514d754f4326e1e2dbb96499175ffd88d7935d8237b113afe32000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a5bb1d4625c92b7a69a3373cdbe2698a3756927e0735a4317aa8518aedbc519f29ac627281415f95dcc41cbe6d04819543e447da000fdf5ce0a78505387214a33a0e07ddb4a5314255ffe8c200cbb03ec134cb2711394354fdb88d1d32b2bfbeb2c3efbda8b882c80bb790127192b1170f25992933045758e4384506108e0c80300992dc44b563ec6c523eb8c1b608aad5586b30d61f4ab50b82d718daa73dfa9032ad6cabb4d4495bdd162d1260e36b06bac43e71ff8191449c3e3951105cf4fb80a2d9fd00d2d08a8de672f89323a66e63a13d3d93007e1107b3a0e4b6d087d3e542b174cfe72cbd0fc1d5c6a802d57bebc545d0603555da51ea645d8c0b529650d021b3227d298126c36afc9d2accf3c505ee686b8ce13bd72bdc273a57f43e83c6e032a0b82403789a5d418bf911c1fe1c79f9769054c557aa8aef81c5bb9e88062380218460d1366ce7c65c84bb49dae47d0a4b38a6779bc80a6d48abcced741f622e1020ba62acbc92bfb5c1045054acef13d0ab26d90ed1792c0f4fceb7db8b52b4cc2031529215db12fda83bcd016cca996ddc3da3231f73451acadea93c106211b3de2563bdf059488039cb49daea8c51e79ea0abf2706ad762bad1462c97a3fa52e86710cb9b6f0b3b523f674d8fd158fcc291faaf753f2a63d26efa6c60fbbff9a6b8d8dd154972d972bccad9a5f14032d51dfc37e97176d55bf98fd3def175edbfc9f5492b35bd363da24c36f8dc967f9c3403896dc17a4217c022b504ff4b3d9c267abcb6a8bf807f5dc177593cf934ca1d81a5e8b7d00882bb938226c22948e67221bfe352c0e72ee78a2d857925aa5acf155da3378414393f7da7448d6fcf643ff446f0fe681ac9479554314af6977f2d258b5d57b3f63c5b44e102384c6b8918e5beaa0c21203d5f0f895288fe51dc4fcb135daefac0004ff83a06fdaa5217f9b1fb28c536a44efcd532ce385811c58c2c210a859ceea4e6b6f9f657f46231464ec1fe84c2a330e8f689771d95090eae75118d0dfc1e63ee1a5472dd8863e70d39fd175e3f35fdbc03188fc63658a605a99442f000cba0113aeb101c8d550246ad3b96926acb8df45f8a55e2b1361b26c756e28ffac3b355e760500fa896127fda3cb3b8fd99338f7525ffa4b8d55fd0b20b1c349793476a1172bc07e025c7f04b64d66c3a46d12faddbf148161ab745958f1d52b8fb45bc0f9a4cc3a1c6e31a25d493a3c696537e43ee789e363baefa9000a51c76edca55b3e741e1a3ffd9e3f9228d5e5e4955de30c98bed85ff5aabac1e7c01d38738b1bd82369cf0ad4a6234a2ba98fd1e26f0ea9fd38fdf1aad6cb30fd151cf581901dbfb85b63a3082581a9de96497f95aef1f8d915b1357707e3ca861ada0bda7dc4d356a7fc710ab4e5fbb45a2a5f03e0ea26db1e82b5ba0769656add53b6e3bdb8e9ec2fd9fb7aa12e092404024a4e8110c60d793714ea9593e25fde7e151ca531aa888cb9f1caaa6475450c2fde7a0f853bdbf8c1b3c6c869a6679fbe64a237d62cdc65f32557dc5358de6a4da3cc72b8a3b6d08d9137a001ccc76c0fbdf696f8c9aebf474a402c6ee790ba57a665b926ab9714677c917311da9ed0152c1373223c9afc4e0841753208b623f398c4de21a0e93b38c1bab83dda65e517d532509c8f93486623bb3230507755303bedc9c73e70f94ab4cdfac4e09601f44cd40b16143e9dd5ea870f47d7cf49d3ed65a60b07d4e213ad5bc0d50d9aa9f64ced5d4b14c28800f3c300212583d6a7c29bcacc3fb622b54f6b8a304b7f098781aaa0415b8bac6ede24dac93b77f15787838016f75f166c09fc7d66e1e146e2a4a077cf7c776b579097a18165d5e2c30a6b7fc392a1b0a74d6dca72bff51cc1528b8a87592917ffd5e5c3bd30ffea208c02957eff6e42ca07d371d8c6d3b8e74f2b0ffd37cd30e1a24f395db946ae2f1924acd4214d57a410f225d76ff61ecf8de7ae87ac94e55fec495786e6a49147e3461b43fc460012854a25903541aa8f1385b0255db053e6f278497356c2005df720fd7f3fcf20bdf99118bc5dc6a4cee8bbf2bb0d9e84cea99901cedd6e1f6421a914030bc51b60ab07143ef26ed8aa8611eea86a20a2fc1e45fbd277b3911e8d8a0ddcf2aad39e2e3450f6ad7f63e1925d134c446e0e3272a1c1212b257ce99428db2bf91d295632de45870f62027d23810059c490c396c339ae1b741e8bc83d87ba4400d2e1307afd2e00598d0461dfe1eb848bb1dbc36aed18649ef0da48724bc297ded41a382857dea1a3000000000000000019f9bc00000000000f5fc9186cd59b52bcb56f07bfee640553f4b406efc8965f81c1fccad358dfef1db056f0af97012f7aa793bc78a464f0e91c2398c32d2b5df19fe98aa195cc8a8d40e2deb91cc05ef2d755ca0c3f3b451beeb5e31a0321af83af6f63ad15c6900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046fa3692d1c4fa70464821fa620ab01948dedb4c913a942f3f7bb9c7cc61734cf901248352c8fe37b58c90d1e7519d3bb50ba9df194b55d83d351553f0ff040567a412e8ecc65cfc3286556e77ca1ac94a94b1c789b1c66bc0ef209adf22ef34b098a57bbf03ee9965bd4b4ee8131e3d5cf59723c560c90147d0202b362a882b03218e0f35c9511529cb27ce4b2412789645bf2e659a96c18be27ba8e4def3d10d020bdfdbade230222a121aac1732ea44227d4e5b603bbd83c7015fe0c6dfb4f6820b211409c147562bb46f5803768ce7831234e5320d8e6be3cdea30c4052a4fb30a152a1207d0837668047c27e6868ea1d3fed9a8639174ad60b243313ebc986351021227ffe9ad89f336fda4f388de15c7fa0010c197462d34640318f8a6ec4606eb032616578b106e62ee854e27e6a14bf9177f7effd10f897de4121a2e746cb25a70032dce9a7739ed16239e66e5ff552213b206a16f49f046a061493f2613bf4706da032ac5884b9c3b80f9dc04a02ccbab661f4096a5e1dae38e00640b51f6f374771c0212509ed4a098711426716c000b0fa9642aff762f29bb0c3ff72a04c1b603a9b63ab6f3e75f7cd286e867c99fab82464eb65941d0007da6888789401255cd674c03459e769a32e53a58738086d96bdefec3814c461970abf23a8bb87733f7224761cbcef7bcbdbd5d7096013e8f7c32afa13133b94c665fcc2d75073d94a42f11b3acd056e826be4aaeca50ba57105e7289f14fc87a46185814b8c8acde93cf764be798bb60a8df5eb57eea46c182deb0c73734c16920f10b611fcb6fd94a825625f256ac3783f683d9078100a17a5943f04b1fd667547b4a45da6c5b4ca91867d0732a4986efdba087c0f1018e331a7be381f382c49776391ba66a54cf291a837baa70315096e6601984de92e870a6c436506eb1cc87e1f3fa26de651a502088fb10c5617093767ac278983ef1d72091475d9a33d9f2a7e3ba39166139e1c34450844539e6076a1025e221659234644e17ec712c6983f165a7968f13216f7ea09d4096920618998a4a69b052a5197815a1758f0771039ddc5326fb79514efa938680a38b63c9659900071e0db4b0fb2584e8a806063fc064ee34a1b141a426568348a872caccc5e3619844f103948a037f60bf67ffac7c39d70ff13755c9be1aec0674396aa3873b85496008fa58da9435129b3f86f1442939ffad184e223dbad2a46caae73cafa293016ad7690582ab9ed17875cd259eab147f896bfe848fa0d699718279c9b9b0955854fc54c3a2e53f52b2b2a574fb923d726403dd869119953cb55ac09c21a2a788253847b02f16dbbdf9b6b7d36371a5b96e92bcba500594a6a87b48a142dce573819f515b30d51e702df373acf5537a6e9d1b63b9305c3eeb82a3d312369bc2b7c15080e44a45639a6e6ed2e7026cd6486c6eba04d7e62d3449bcdf2f95d8f804492b5a0b1775f7149f71dea76185cbab4d8c9a6ca8e7f29ec8302aecdedc6538df99a04483d1a12fca7a42db1db8dff6d124245781b8fd7668765381c3d65df8837af2491a6e6d2c87d1c57a9ff5a4d5a3c3fffca11f68f3d6b65dc975854fd9009d9fe98882a24a4fbe069eca0191b5539f60c9f035cfcfe88919828f7971dbcceb6bed9228602a0f07318af73a8215a0fc7119aacf994244f53a4433a82766872008ca3492e27012efcf7b45e8bfae946e610a8a5b6cd3a25a8cecea023a4a2e105bf38134b8559a0f90b1e43a5f6461c840672af1a2b1e08215324a937f618165a11b53b0f66ee9ac1168850f661debbb8f176ba5c0f2e5055016653691d10d2cec7e06285f8e9489d322f77ac49c918bff1a75371ed04a580de53da6835a880dd24777865d70296b7f6f24acba203ae368fb2210e2df8cc917fc106ec82d95066bf64ae524cf5cd0b05b6d9666decbf30e33ac14ee12e498c82dadc63567f1fc9ee299b2247396d26768b73bd11db2def7ae73263402d3358145244358d57eb3b5bff74918e0ee6f99cc3c8ba61f202ba0e8eaf1d71429573b9bc63485db27493c3db4ca298be3254be11f9a7b1f4cb9a6687957688fc8d7fb03cb084216653abff509df629a71cd7d7eaa292d59ba0490bc0a7e5e1156c712279124de5d2eff498ec4345c6a011d3a36a9d9aa4eaa0b834c6e7740e2194d42f3bf570213ae1a89554f0ed814f04ff8522fb4a435028f72b88c9839d64536754944914184bdb2227be35729d618866a13b1fdd1a0054dd9d261ba7bf99b1e23e6eff46d170364fc620f27bc6ade1c852a171dc8f4ee1b95618e358a74318a9f508d9e8037047ee5c215eeaeda15d1b1b16f867c6b46a9d6e7d0ba16c220e85167de5a6da58f2af9b2f5ea17c11a75a33d101c1d2a8103dff36a7a6532cfedde7dd52068403676b62f3c65340c", "51006a", 1, 432578750, "eea69ddb1f784b1444925271c8b54aa2fa666b010a82d16feb6c96020104b459"], - ["6c1c079b01bd30dc31df27440816f063fe02727d10dd2d29becf2969f33d5c93c3aec3b7700200000008656a5352abacac0071259570013913ee00000000000000000000", "0053516a", 0, -1869686261, "5ff87e607f414b2fe4d8813500c99df81593e0e96e5dbd9749217aa7bf9502db"], - ["4607d131011f1dbb9b145d7769b569c6bc19ba20548b402c0920b12ea5a45860c5b7439a3c01000000076352abab5151537b30d8e9017d5e4405000000000853ab5363656a5352000000000189321603000000000000000000000000a8245434fb4e22ed89dee0e8d3602f309370dc01a8f6022f7f9828c2859331590430721404b3e54f1116cbf4273be81cce0b9fdef0b2ddbfcd0aca49c78e2b4bb2af4a2934a39f33f8a7e3d08988a9bcaf722442441d61e7e05d2a0085873e1800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f826ab2d8cbec51e6e29e7023d84bcbc0c3cffedf81b7b49a5f44e9654e327f3061274eacea85014a5e5994dafa52d2ac39849e632475e00673bb99487f3a1c6fb7a71e6689f789ba056de4f580929872ed27988b6bac93af3de622d2c9647863dc908565308d7abc73124978088fc42b1414309e1740176598b0af4f5b3c58c022533fd94f597efea5283a98d72a6ec5afc07fad11c81021fc49f582f0c1d00290301b1d0613f90cf09970aad1d9933e5d6a9b2d825860f06a2c2df833b315472300b03c4c5656fe930fad0325503ad98ef8017028418c08c00ceb3083dc8a8e941d512857153d6afb289de7ec453c17c2ad8a68fdc36b41eff06b362778b11c842ae0302f7a8be2f720c6b6c3c695b0aa3d5866636e776ca4d1ab22e9c7b2b85c7280c0327ee5a8b11fc30a0790daf068c3e1775f6f0b1db7219784a0d0c05f21c7cdade0213ca2724ed7e5add37ecb2f094b159201069f4ace6973a1e78241dfbab7bdf76021dd186236c169b1de4bfbcb9b915e02e4d1e18bb1edb4de90240e72a33be848d031c602850db92ea4363170b028dc7cf9337b8528fe4975ced67a39b5a94bc2c8721203f19cd0b527b86aeb25f5f70cc35a8909477f3080a3ee59da66ecdfb62e979ed258c5b9becd7b8f8018b7e69c7c3ca83ffd24b07fd496cbe548ef22ffc81200d491bed3664dee2a54222fe38c393b4640f17523db260dadc5f100d0f899171c381cb233d340b4fd71d5b2221734466be1f908548baded264ef5ea3b473668a1da2241e0b768e4d0492e34aa967089cfba8b887bb127cf7c72665926477ed492c39a8570fd6838e5294849d19547c824c448ee5d2076e2f5df3c08a85dee86bf291fa4493c70e41520afdbfeb2f93c5c23de0f29d86771f1489ea0fc7367a11fa7abc53d381e21e170ad1cc3009c3ad7399bf46215196b39ce6820c228e49d44acff681552da1a7f820f12441bb2978cf0c1b49bf3c2828e157ca73a7303e7f89e22a4ae7f35a7dd9c78cc3d4ac23fcda4dbd514c6ad473959bc81040000077e1832d03426f3ce575ae1b786071baa818bc776cd6e2eebfa479193365e44b9de6798f6ee98c403f8678bc79307f69a00d054f6beee89d8216b3ce9c8b2a099db773c9789b5f92b0ee18e0df4551daeac9f832b8cf054fb7bad2e11ce872154e9964b8daeb7ae6e4a3bc8695a055ee0c8e5acca90a9e1fb91160449f18988d6bd69ce9dd2df97b7e08da7f99b6f60f03533360cadb26efadc7230cefbdf05644b327ec482f88cf84c8265b97457644b7533dec471017f62b53a93b562aa5e64a8e816c32573730295a84f7e60ca382efbed81bf983a133c832b23bedfa493da0927946d874278a53e3908c0636a2f07d1f22def3959878b7e1e64a0dceb7458454f43c339015b6c01943aea1b19d6d444ba1f798ce49d321968680dd2dc75c4b83fc1c75d18808421a5840aa7b93e9aa729569e7bdd290d82d50dac8cb98db8fa0a9641144b58f90c840127f9fc5175330680c39b6dea1047b8ca569e2817491c15b98988df72ddf9dc2b61c5c937f131ea6a83dd786f2a70dede77e57ea82f56802a28ec0954a5e6da1958a0235acefeccf6851dc539fae28c3aac0a08804bf33ea4ba6928a1417ff32de335174e755359755ff47099b417f673ef32ce42785573e367f650e2e64de9a6adc0d906000cc392b5629fca7fa36a2b3c83d6aea9f7657221453076b515e383c4f1a88a5af9289ba5c874835c9aead5d451a8b005ab8111af0e3e8cff86cdff78a761f63a8d144d1c7e70732dc178179a93e30eec54b7e6af162ff10ae189abd8fb121862f416e9670b70cf97636c223260f7dfc924c52663bdb67851069fe5d9a6ce2fabea1328989fb05da81deb15262523865dd271de77f4e8ef88793e68203aaec64e606e32eeb26600fbdf913c4f1579d2a2e567141ee9e8d0da1a5d62aa16c8148fd26058633ef38a7e5593bf2bf38dc8f63ff79320c13ca29423a88287db509768bc5b54b078a08b2b9a87e42aea9da9f004285ada76958312f9ba35de86d9fae3f352e6f36df3166be08383ac0f405267b00a44d44b82629c95513619d648d3573ece307b09f701e570629b6127d0e2af856f392729c3f702f9965facfd0666a9f86627e047c762f45d96f1051cd95ca1dc4348f9f2626bbd2ba2fd79f4e4b04f65ba2436639897c28fcb7c4eb5d9ef3a96614b718993840bbe4a07ba8574b991abb5c375d1470b461207c0c61ad21f6c8f6ce4068e78ea69f214fa11cf9b17636e558b0b77fa488f36d883edc01b97f0c02ffbc84d477971940248d615f10be6ce2740de21c90f39596972ea83a4e8d093b398f2c533e5db739d7d691e22d4456d4b42afe7c43f3c47abd0a9f8fe5772e88b4941185fcb9d5953ca26b2f7193f10d", "ac536a51636a65", 0, -1786274802, "10085739477362c6f2d12d690d83bef88ce842406d593fd64d5b883dade95702"], - ["73ff84f304339609758b9473a16f2a7f2387c7e8a8d69a059a34ae1911250f8b458dd99406020000000451ac51acffffffffcd468fc36635bcd26920bfe21ffa9c5465b4792109c6fe954e727f2e820732eb0200000003ab51acfe9c78c7584c444e629d6bdf880df240b3b0067bcdbe39a2327b73bf799ebb5c01e9ddbe0200000005acabacab53b3c08015547e6f5c57d95eac4929ca8bd134e5c202cd19649ab6a13524de1ea9ba1079270300000000ffffffff0171e0010100000000075251655163536a00000000", "65ac0053006a515151", 3, -981835875, "3e01b78a3a31b8db363b4b2df5cf1143f3f0905cf2f650e67388e0e9b08f11c6"], - ["f48a9d9d03ed37f1263c59233eac80682c30cba6223ea8552bc113f75b8fec8f0ea8257370000000000652635252ac638869d40da0b6bcd433d4d6d70b36c574f496789ffbfdbfdcc4c86bf94126fe628505a0a3020000000751ab5100ab0065611f87526aae7a8960aeda855ed118187f9fbf93c741c4c953c7ac4b5f551eef8f6819c0030000000852535353526a5363ffffffff04d9210b030000000000f00ff8020000000000b562fb0000000000015276441d040000000009ab535263ab525353ac01e347d3", "5353", 0, 1518285991, "a9e361394a0019e8974f2bafd0784a85df605f607d8c9ef7bb4e2737cfcce20c"], - ["ea8f36d70327f19ee777df1ce00a0f67cb80fd233d7a8e7f7946716494c83d26f3031cc44b0000000006655353656aacbe6db9dc8f934ab94897b05f2b13b6f8ebea1a2adfde4f75c83aaea58d47f968dd06ed17010000000551acab5165712215ca8ae89e770b0994d6f1ad5c76247c9250daf00d8bb34b780c2a92b505a6ef415e01000000096365656a005165530031500933024857d2000000000000ad6cc2050000000008ac006aab6aabac0000000000", "6551ac65", 1, -375164970, "e19cb5134376e9482f08f20586156ea522abf3ed4ced101fe18c4e9bd70ffa3f"], - ["61331e4304e358e96d794be8cc4e2a6f3b902b8fe12d5b35ebdfdabf3e57407a5f1ac24b0c0200000006ab53ab0051ac76ebd0d9f1ad6847135fc48597dd29f0b8b45145b98a149d949725be2df17ad46ecbca010000000001acffffffff4412bd581f448c7b517f615986619dee164234ccb4f1ce490017abe9e82846dc01000000056500006aab6e5602be92b624b957b13294c6c8639dfa283784d6f856b5bd67cd2ffb3cd2d19e1e26040000000007006a51536aab63e281637204b6dfa805000000000652ab63ab6a6ab679dc000000000004ab52656ac5f936050000000008ac5352abab525363575c54040000000007ac005151ac00630000000000", "65526300", 2, 887585537, "13e866b4bc90efd140a89a7f214372334aead7ed2c48c9997df83e85b074aa13"], - ["33f022fe0429b43b66e7e0cb97c73b6cd9a528341942fb2263c35db30e4ed0098001237ebb010000000300acab0fc5895f3b9bd91e89b64933ac8a314c906e2b7bfb484774efb9c2e57e185bb71c5c1618020000000151ffffffff49e4f68bd9a6bdc289e246d1ec59ba6e68f86087507e2f250ca587d974c7794300000000076a006a00536a51ffffffff9900d9a17c8771c82234f619759bd6559f7a54e8fa7dc1c34fe2dc56b6b5c906010000000963ab53525100ababab8cd6577803d2015504000000000852ab656a5265ac634659ae0300000000066a65ababab63fcd1c205000000000263639cf303c9", "", 2, -706112884, "a54bdc5770f71b88561917c533f8a4cd009efc601bffbda8c8951ce68ec414f8"], - ["7d0bc11503b64a5ed807183e0c692eae77b3130e3a01ba51c6556452f65113f4647aa274640200000005656a526553e64c52056f240b26c386c0ced9dd8111e5f325e6a6da724f99b8ee21ff81840c5f54bd600300000001520b74fd3255ec38a436cbe40d7e45735aa7c3486c626ba0b93f197f12c7d24b1471bbcf5c0000000009abac53ac006a51ab518f25ddca04bc55b705000000000400ac00006c7def020000000007abac006a656a6a1e37ad0000000000075352ac635100ac55761b01000000000951abac6500ac6a51638439b06902000000000000000069a8ff0100000000b8267637f0676c0dcc9b82109aeefd4c5a5067b27c5ef6bf7af6cc205e68360f6aca77919310bc354717752bbb88790be15b706830d952b6e62d7a6f5db83b5c5cf14d257964ff1b70051da2fd85985d4924d48003c084e049ef27ca83d7d5fa00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c2854f9b58f66885e0cd0287cc9cf5758ebef5cd48366b91a55493f5c9e8b17edddd63be5f50849ff67a92bbd4afa63297eafaa4ad336a30877f970a5d78d651c5fee02026fd9e035012c6d55948ae95ddd8430d8978616ba6013bae9b5a13b292967f7b06f5db169981cb7417fda6fc82fc3e1b6bb92e7647e9e06d5fdb5ec103155821a5ff43947d5377dd01a554e310a83676537ccb447ae2d30cbf44c2d06203253e9833f0ce597236df939861fd8824655c676459cfa15d9a2a47c50c9bb3fc0b135348befeff9b9b7ebcf903099ccdd493d4edb99cdedb3081ebfa1a093f17fd166be3068e325b3dc1741f9a16ecf03fb0e5b8729b1e57cf12b23cf0c3e55ba803111349490754ff1daa28892259cc8ff4d75804a2a6c340c05b4a68035b3f4124030749a0a15e7b8938ea5530ef922ff2d496060a9eb633c049722c9c04ace5f9be0210451365968e316ad320a8e90fe4d8053fc51af9b059b7b2a215ef335e98a6ac032e74fed95568c7182df7d3b7d311576a08c30c2e0726fc50f33ec8c5eb36dfae0224ee56a96daf5c19d1dca64c63232e5625ab712526da80ce34c140b073b03268bca5cbdedfcc8bdcd75f1f22147810724609b70452780f89cea6c346e400feed0851f7be8af3c4c2df8333ede0505859bcf9e718e3d4326aaca9ec2b0a1a57f2c55011510c212d98e7f17c1544378eb0d2a243b7c340c57d879b096530f52dba5380a871f88c6ce6a013beb57ae9a98700de255b95c21167ad5abc9ccecdf413dc1096a418988c876af5d1c2a417658a1d49f3f545817763ea2011381c36bf0c0b4325c24fe0b303c9bcc9d4ab56082075530ff8bc76b0ee2ecb13875699eedb44e69e604d70112dbf6fc31fca56a12f56a8c275339677d776c10c908d2ff32031ce4fd6ecb7bba53c1f142a2bd15f51885be17af7a921709cf4bcaa60d362884e862d5c015adc527e8ba3f99bde3537711e34643a6ab50e3440a67f0a40223b765c0fe39c85881398e684af8987b6855f7123d96621b41884e7af17573b5dd8810562ae1cf4bbacac5c9edddd5e0438197c79d73d48e072ca5da238457285604fdfdfda26dc6271a59f5cd3cf664b8308e98b04e23c192deb4c4b9e7224a7f28923783f94bd1783d45483e2f1b4363c60730452a4112196ca539bafa10fb3928a9ad87633377021a03bb43d59808f97cebaafebda789559b57e30e08c33de9108fbdf821fb6c562057520af55d9011ddc4ddc013cfcf6de18be9e9200094b06124bd5be679abbe4423150e3f941c0cea95f680a6344adcda63a2a168f0761b155e6fc2145f1b263f9ef4c5e89d3d8254a510ca241e53bdb72ae431a65ea69dce289ef2f090346e216b01d7da291f67972f53a015d9d8b0930b9f22e6710a1439e4d89071c55634f162abe284f995d6ed515233bef1a561e64387b26ef1f41d2c6f31e29a1ba77853a0fa624dbbf14f6533ee3e91ce37f5c43bb47424dba1267bbe80d5338ea0758cf0ecfa3087585de1d4dda0696354fa2d58ecc042fb5d04e9b585bb9c2cfca8d42eacea32a9d28c3e9de97d953ac0d0a8f7adb119f1d49536ed57eca3ad7b2813daf0e1dd0dd1ca2535e44783caf20dc024a043b6185c7e08867b6a98548e9fbb193857edfa49662aef64b43b8ac930ec78d3b29401c4828f7fdf4fb427146b3a4dcc79d1d69a108531ac0221c51c26721d7e85bb06e1e1ee48a0ad7a7f8a4dddaf4bfa71c20edf6644cdc453df105a521fd863a1d0490dec8ee8a229b7f97e334f71d71875b2a3cfd0edea4140c3f12af187ebecd29be381544e2bc081522d75649d439c155a7bd48c15576f1903f60e96d5ebe09f67bc58475c651b773c663fea11e178ec67a05fc63c00713272d9a72a21c3d28f01ebd877911937a735957e69cd7f0641417a39ea081833720fb0e9731f8f8363d0e4d6c33f57cbb96d854c6a231aab673c0a38ebaf7f559c31446e3a3adcaac291d9851aa6dfd62595948fc968df81754c8fe7e90f7358d4741813a0183a486aab39cfa1acefe0b125e9c4a2c49aa4af3dbb93e2adfbb5f5152c7961d8e6332072a6e35046fa2da3ad5ce41b40929aa3ec2b4df90d9bf5b78e6e7453cc082cb10b15615b6ccd27253bd91601cc3501478f88b75af57d69bf7e39a866e1f48f5b493c6136193de5d4d27ca529bdea34bb4d9d0c1c24dca6dfd65e2bf0d2418c7794bb6438d4298d9e5cd14e7a8a8e83aea9d103814c23d5697b7ea1993db653b3276641240a75d30ab37decd556b3466be054e98670000000000000000e2d1b60200000000e0ee6c782d9e6b5369d26cd12f0d3a74ac89f41fda7a7f6118857365aab57043a6cc42af2b2942020c1a7299b1ce92b323a42c98e4b03630a6934d8fc6ad4cbe61da6b3f821cb698a36cd505b58d5708b0adecaa38aab6b3599b789568ca62e30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060a1c617d89dd407299aaf0726b8e45568f01b15eae81980d6fcb9ea7933a21243610764d3741c73dff812e155695110689aab42e74dbfced6318ce89ac541aa45641d10e0d5e1ef062947890e9a237dc98d9ad0597637e98da21636da8c72d8bffdb31ea2a550c8c11f82f93a23f5e98be938256efee502d16c1100d885adcf0303ebb2ef45649d5538fc99019cc5c0fb4ae672fbb836f311f13fe055212e43a7020e4b6309fd7bc1e9d3ff3ab806841d883b006ab6014257cac253fea187c3e9fa0a0e6b5c6b1c0574dbb3d6e474593dd4329af1b8c890ca0a01b8450f8f16dc48e61a5d27e731523cbe6c0897497d3c01ad62070e71a3d85af2822b740439a084760312439eb975205727157df829bdd71b9aa6e390f99aa1be4a033478591b613491030aec0ae9272433d91190dcb5896eee62af3158d9271b01b016ac093251e6359f020e71cf5eb748697f7836567b521c09485fbfee49c3f4182c4ac17c20a4b47158022f7c819ef0ed17de9c38e16228989f6f45d3a318944cf5ccfd0b37540db640d50304d2a668a2732d2464ef1193e3e0866ff0fb1b4b8c53feb3f2bbfb9aac1805ec9c277fb0c1dd1872c8ed82e849cfb7a60b2b08240f8414c6d81f4409a85c56901c53b240cbbe11a2579450eabbbb5d2b84a6d40645c92d45eb479503efc9edd9245ec962751cac3fac369d1a0f257ec27fbdf179dd633b295d212eff54a019c67c14d817ea35cc7aad81baab420dbe30413b6681dbc6ea13724292c0afc84f297e03e7e266e72eaf80764534185b06fd5c31e6ccfae703191ddc9b88f8788e6923138453df2a2af6d340c440dd8de1f7de2fdd272e310e788c0cface7ecfc83250d33b998f2b75b1f99364ee27fbd7ad605b7bf0ec0d0af989543ac360e18b57013c3a8229ec6ca54f097e8b52422a1ebcbb78eac9f0a0df244082a4a641078e568e612a4bd1051112c512872a5cdd237a10e7a33f321d130247a8d4dd8364088591fe17d847dbd445fd8195c5217b96f53e3cc4281bda7067873a1e603b1e9fcc2d1b1d230f8f178ea3e8be0c58e78cc44446fbc312be55b9d9fca769b75e4f245b3727270d6522587d5865a8ae29bbdc5a756b7630f90b0c7d69795f364d3ef4347bb69a6e16a7cba611b4ba9c4455b1ff0ce6ba15d1538b21a47cb46a64452bac4960e0d8022a83ea5679ddb7d1a7b7973d1e559345beb7a0d1d32bf2ca642d0a3d3727104ac9407a6e18cf353d3bd8365c73c97b890352c3d3a041d3736b23aab347d78bfe01cc004bf4ba1d1e1cbacdfd4ad2819b6474ce2563cc189a1db65cab93b44cf191c8c385bc24d0e61295cd05f149c766e8311ebf4f449404669c704f28f364763e623aaec9ab31f4f5d5fffaee5d91aeac69830887d9ec9ce38ef26abed4fa60c68c9a0b6986c648098321a4700ae20ba179b89a4992eb884087c6e299be2a3294d0a9fe8d33a85ce8627a045396e7a11c4efd8449bd352c938bcd9539dfd7754b0e05a2a3041250806de3ef682b813aa887c4ab6610e6f2be57e58a337384c1a53f5840f2681ea53b3b21ac09fcfa2687b2cbc7a6830ab07e21d80c1c19944d0ed1127b2679ced4d1a84feb239f6e7267ed5281234c32d659de8c0cd16e7b9820b51af2fa3d49921cd687d183fd40bcad612411e9913898af2e2821664ba072235a835b060188ee90ac1d7e73b5aa27494cb0f42d9f853014cfdc4464948e4cbd2b504adcbeea2a3d4298949e643cfe336c5fac443dcab22a3e5b78e3da872de4ab49b6a33c0f5df594735b71bfd370f44d5926503cbe5c97521cf4fe3d9fa9e3ee4f31c1f6a51920bd4cad05accd8c998646da4bd069ff456f82d4b03d7400085026b36f3dd556ec1295ee501d5a2db6e6d997bf1cdcf66fafe219ad583ff86ccf8a9de753f37341f6c840c9d5ef5cec76722735ba4c5530e4ae1295e14236abb1bb3fe4bb0bdbaef39a58696c0bad9dd6943897589d71a760b275b891b63073f8ad910285e86f59f3b6db8fbc735bbe89ea308ff6c97e9d1a64418cdc0c4dd5e8100982339d171cf74d1de1fd08a2e2d17c0f77918e8023a3b9c35b01d4ebcac86efab96eedef0e0ca6019217d184df22cd066aa9080e9478e5a9e36c07feb9eea5d8ddc6db3d56b5a9d03793513eda4b3949e6fd6a4615b0555eda0c8d6160b08d3a91e3208e116aa0853552b1d85ae86df34d85e0f7be87f19b03ec60b21cb298ff430b1815d20de54aa182ecf8be8927e3abada7346b88451e4dec1b69e8a000518d1ec5d3ba8cca07ecc99811916ac6d977eae9a95865eca59436108376038b0eb387d519520b993e6356b021d446a9eb686f3f636394b46cdfecb82ceff2e43df9758c68a4b70ddb36d13be267ad8f4ac05851141ef60ca9d22de3a362fb01db0894871d814008", "536a5163acac", 2, 1668438795, "075a3200e4995286861c8da88daa90ab9bd59650ae0e5a620368d672adb21e3c"], - ["68a90293017be2f74741d5072182034f457fa173b9c9b87143e5297da21c46a5a7ca58f123020000000651535363ab00da08e4f4035b879d0300000000056a6a635300462d490100000000066353ab5253002b8dee04000000000200531fa73bce", "630053", 0, -1936509849, "5e1d2c080b706122e45c90da31408b65deeef428222ea347614c2a3e782f5f5d"], - ["dc46d3a901d63aad7c615f7e50e6670e219bb90b7d4edd1214ddfd5af4fb0cdae445c877be0000000007636aababab5251ffffffff04a3a0e6020000000004515151001dfd19040000000001005a501b030000000004516565532f929c01000000000553526a6a6500000000", "53536a536a6551", 0, 479598192, "0f9f9d62b89c96a56e1c26fdd07b694e008a0ac2c95f833df5171cea6d119258"], - ["7d382f4c02e01b0ed95dc1a387d48299ff8d55f1a49cdaa983b00191d889109e69a5ced1380000000000ffffffff9272be0beae10182cbd060181477d9dd3f1f27839111113d4c8e51f6ef9fb86301000000066a5365ac5265ffffffff0364dc9e010000000009ac51656552536aac635117c2040000000009516a51535351520051fb7ca5030000000002526500000000010000000000000000989d980300000000d211c789dc7c18f5dd5a106fc042c1d1189f1bc486c7b671c943333e0ced0d1db0a5b7a4c4be4b3e123ca54c1e1d603d2489f01b7473ab12106b0be0e1fa1c849639c829a941c03f45bce0a77c21b27f3129e3219e6070743d97351f5e05034f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb8c4eedc048595ada4f994bda71d414849253cb604150b1900f1613b839d125adb5acfe74fd30003be53913963f0ed6aea9ac8c9738986def9d9f4b7bd300689eec0105c4d899213fde8b20d46319b8b078ab55c914400039e3dc6bc847e1cd720ff0bca37deb51cbf921a533d2a06a56f4204384bfcc30a49e8084119714e020311984016ef70b15136e4fb075c9a1b5f429a40a1e04bc672f68a310a09c150032d2514a94ec1c7a551e173299b6af7b8366127a161bc8decb872c49e471b96d50b15d2b34df25f7d82fe181495437bd576ff9b54c67d29ed42d746294acd3ffe060b3ce89c1466ba35390c2e6ea38732cbc914e80e199492c3f869f733aca962ec021b2dd3e601cec86207e941bfe5ee36ba8fb8af6d99ceef77f2799d3ccce9068f0325750907b1d8da8503ecbdcc1b22779c0d7639d37dc09c1b75115c293a66811e021de377b346ff46c71112ea1a81c4b5e976b65b60c239e09e30cf8b8088890cf40328faffbef05a45d893ef9da5fcd3eb6074355a3ed057218d260184ae639829a7021ff4958ead6da2f794028ea53c4a2abf1b5234d8f90dc2512a71bf20b3cd4cc0d80330f3e1d673e01788b0f80b4ab3b6fedd27145984a0493bfb9a981452bc110471d3365229249c282d37bc86900ff6a21017f295cc1d37c2b0f1ea744e68158c22aa6e8451c35bb053d950b3747176aa811f4b74d7310bee42fe042f5eaea81654dba52a786f8f1f3c3f4f8c4c93ef8de9aab1e0c3589a28df6012ce5db65f2ac2b58de723b12998d4f2f6902cf0b2d0b70d6f61be1afa30929ec03c65cb6c1429ffd3d6040bb5e9e5122bec201a44114a122a92fb4010a07f25ea78361dfff2cf9823cabbdc3f9896225a621f348018cfe10e3601a22f89f50bc66e974f1f3d0e19dc070316bb2c0a44029c418fad7cfbe65ada98176c9d6aac11de0fdf4974105e5105bcd7bf1ed2b4c9e215bdaae702429ccf6c5f281efb2290cd19f080f2b93660a4715c7a02c8e34ea4e8dd447f800c7aef4c2d22fb7d8ee79ce4bc613a76bd5585fe8289461e51c65e59bfafc7a190fcfc7d6e15c0014bca57de9201223b1184e832c8946e73ffb89896c71f86e3e9089b7f3668fde753a32fd654c24253feb5feb52a43579a230759565b7769cc40779c04fa257f51cca8069566416da823f8cc5a9ed883e18b20f1ca77a7bb669edfe7085c72fb775879e16437b148930ba262761f068cbda3fc8f2a49a75556ccf5d4dd05a2b63ca9834d4ff5f10b0b8849cd6d3927828c4d08abfd3d07b4d1d9a949af569640be04fe966e517324b051b751c986f9b7dcbf7ff9375c1a9b8c40b07fb6ac2cad59c97b311776b67b12e606b85379f098d0d19105a5eab31df2c1ed6b87cb83909aa4229a17b7eb00478296eda5addb1d27cfa304c7f6a7ab628b98f476cc6d065e44d878cc10c86a93356a4e3fbaa797825530ea5db92a67ebd5aa0a09b7a1be7b1b76db0aff1b60e2138cc339795b2ea029e5d4002e300e3869bfb07c33801edcca975a204f065c4f1ebe9d75377affe07d7ac1966aea50f7d5b772b6224c2874e392034d27917bea64645373b5b20caae4e5bcf3504faeae8b2189488d86d534ffdc2a8097d0e3de1d08ae9b5bff400abc3a047efec772e2f99abb1906164ae7e6f1fb9e36faecfb60aa0d861d8b38db10c6e572654704f6532589e3f193491aaaab8e5fda8cb1bf2acb4bf3847e5558be6e7407ed2dfc33f32fcdaa8a6e3c0019ff8997435aeaf13cf1acd9cf8d075c9489e0f3f7f78d6153f98ad07e420d3b96ce2c12644268e556ee5b6f73785bff62ecbe79079cf7eee6326b095c336fd13e25844dd57cbadae0a5d7f98f55c20a6abb3ec74010704ee1ec68153d87ef76a70feb548280cc9237c922b4b071498cfd51d134dcea93502b37c724bad36aed3f4e828ee90ef06e8e94d9269a3bd3f256ab772286aa9a21db0f9d2fe8d443f5617285b95bfec6dc50b4fc35836ee68fd1f1dd3c3ff1ed40b5291aeb0998d5eba42da28362d567032e69b710c0ea9e064b1bf77fdf711ee1abde4bb429f82c8ad0ca7dcc1451b2531f78e0052e013a7f85d1d275351c4677c1a78292e47bb0a59a42011520c55a1f7ecab7d05bfaf25bf16c9a4da1210332e327cdbb437927b8f6153e36fd3b2923d7cc5a235ca0c98156337d392ee8b54af47c77e01eab4379394b60748eae761c932ea48214a922b0e8ca1f6550db7c624969d7153cd4401d9758d825e90881ef74b7d0ce58cb16d136b9c4528e01d2b2c5d9008eb711494de3b536571c1e298636fc5297d17b7adc525c1350267abf1ff0ad6129ab2d71bd1ba7d3c7bd6dc1356c8b04d35ff37b34af2d950f129991705847afa033e67088d0c7e6edad07b85942088faf51db7babc8f6758c7303f908", "53", 0, -27663804, "373bf6870aa59e6a6ed88d383c96c1d73b681586d9d236de535a0b009bdae012"], - ["7919a08b03b162540f3415988459119f87ff6a15e681499b6540714611977330de26b090cf0000000000f5d0ca0b3c523d267581466ff19f162185ba114f18aaaaf37c55a861a15a2a5aba3008200200000005ab6a65516372ccb82c9b4ffc1aaaae1bcb2af939eeb353920fffbf306f17f966255e2a8868c12800c100000000026553bbc29cb102a379110200000000066a00536363ac0cdb850500000000015300000000", "ac", 0, 1563405851, "cb44fe4e571c49c7c431001f5956423adb8025a5372f84ef5fb0b222d586ce34"], - ["1f54fbb40153c70a39490ff96a978134c290eba6b0429fc4bd009ae7918ed54799a135bcce03000000096a5151536a526a0065404e89ba03b5ae4403000000000751515300535200f8217704000000000863ac520052ac516a7406680300000000090053ab0052ac52636a00000000", "00536363", 0, 322938114, "a305f058143e2ec8ca7ab5347de346573cfff0c4d39efcf8b508acecfd0a20dc"], - ["35e36f5401988e113c4782d4668403b50b9547587dd526d92179e1d5f5eaf258c21ffdd79d02000000045163ac001b7fbf0b03ac2e710300000000015312a86000000000000453525100b9e6ee000000000003ac51528c56333c02b01871000000000000000000000000002ff4c6707680735e096407e68c03ff04e1be546a5c31ccd925cb7ec1fb48fcbe7bfbfc439fa693d5f8ed0c1c8a249441324573efa3c536ee5e1400adf151481939a3fe1908194288935df6bfeb705af269fd35e964a79424914b7bdb0d8b8233000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006733211d15fae2a552ddb697f5e041fcf48d8224303f3c2ff7b65c3bd57621c795c15867f044950bc8c34e2778e597a79131773346a68fdad21a92dd255c055091eee9fdb94836225780c6d3b5c666fbeb82ac6e3bc835a6ed301a7f780987556bba9265e12da877d46991771f7ee9c1dadf9eb8089475e97d58e7a55dd1beb5022626bf509b4e0b2eab012d357f6eccb912fab71bcdfa30085a01a265eee41fb80304b072f561e337dd19a78788b2383b3e8346b55ed875bba87491dcb5829bd5bd0a250dae0b9a25b90c572edd0df2f5792de5a15d247a43550656639ed60ae790390aa78a6801fd59726f1c62be05293b396368e17616c5f3b02d6ea07950f1dac30312445dfe54fc13864808e46d1478f3c4dcdf65790e46a11af89a4660312a70ea0305eca6a4d98aeb9bc9cd13a41c3864cec90426a209aa4e1f5f4fed800c3c3d02022e1a7096da95e15f83c1aade3068c003281e9de1ba3cf4e95c0ad1bc909a704b022ed176e947b5a08a6c7ca83f3761a3540dfa5c2fd8ee7dcd6e0e63d49df34b4903201d5e651d6af29256ebe1230c0cd636bcc9ebd3f6f8ad7754ba569bc98f4ebc6968969f49b00f44099d7f405bc6dfc4e9d2a69ef3bd294dc5d433bd3638c04d16bfe50d4f850937b5e3c8e23ad27ea950f58535dd23e9b070fc81b639f676c154358d4eb996a778ea7e5ddf40aede849e0ffe1e47b7c359934227def62cb6a6b6472c15492c3542ff659421b28a60d0f7c5c48b1e588f8d267877ecbec713efc6b4af35325c4a9661fb1e2ab9a8cd49a921a0b2959b4e81c36e197b1b54495317b9e1cbd7723d83d752eaf875033a2208efb56a8fc69fe437f7d90de783857e8d2f585c4b968d3e2af7c4635d8f6e448ed91fdffa3d30a0f5f61f19eb6961c6c07fef8a6fe7d8519ba31dff370d1b4fd343e298b4b2b16b279ffdc61e25bc91d8540f1d2531d4edc25d690688938093f65e7db2e308eb17d6040a5f1458088855cecd60d7d716df82bc14d6e88710890ee9ea56bced3ac99e1e67e7163b13de8809c8f17d4f76cdc075d5b6f7b693061c6daf5ae143d7055c9a0d993bb535cf21fd473f88aea038563c23db40ac7b3083b0208c0623e2f7c13050ddf7aa40e24a50d1d35aecd1bdff3bdf0ef3b48440fae359e08f8af9eaaceeec35f4c69d5dbdb174c44fe129647d869e4c19761439443079aa6aed88f02c21c6d911c26612d2b49fce435d36e4545b29a996735bf92f1c531ceb6f8f59588ccd9aac14fc77d3b158004617ffa691c550296901f9056cc9a1d6989bf9821bf7f43bb33b5d645be2db5cd91c0cb452fac17e617ed758b13f6bb664517b3f9d72e67bb7698c2aee42383fb45db011e595132bd7d90fcf8862577d874bc16300d2040874709e1c8e3469b04531f56f1532f4c82bc344a45bbfcb952ee697528b58a93962d6e5f850d29485197eb8b021c1b940373b4ded62cf341700acc46c924642585ff51c1293aa1becd0eb6fc5e5c83571985d11bea2f5573734a0d93d362f5ef1f71c873c9b06aa3c9f78e789c484a77cffabe698e1414f01a0dac13abb8a9443fb2f045827a1d7337d680a3fbcff4f065bfded06856284578e16c7dd2ddc2e7a5d0e362d27bbd09d59426633c2d0d4c1b985079d10b91d05a58092828e5d880a7c562ed89469198b11d40645d52f35a12332506e3db72c9bd734602ac56f90d8093f3ffdd0eab1e455b417416c3690da403db570e784b30488b9ce99b137ac813883a421d64571862deeab827a37b07d4d5d875638eecca2a4942057d253826e7610249141c90114c53752dbfc3dbdda9ed57d8f860bb8b758d042c07dd7939487e73270eec0e1f602beec06a2626a70005759c8c384988ad214ab7fae7032b8865afb3426658d8c6dc8b6495db391de9dd6b3485b6ed98952ea6e69fc4b0dd8e433151a56014cd5c5d53806909e178f5cc2e1a3015aec285ea3dbf252d02f8e19f9621d56a086487a607561a0f2572b5a2c63a9b41dbe73466341eb383654a1320bfa64251b0c2c5fafba026080140791ee155ac694af27d51380888d4b9c3777b2c6fd49dfe2b4dc5eb3f521a74fc5af8187a413a233c2ddbd4e8377758897d67072a8bdd56d812414ce0823ed444028c98c93cc0f62aab69e088d65e1cc3d89120fdfcde0d5d38aa2e3155505180a0ddae59e6d7a33e320420c9f4a5c260326bed0eab2ea16a31cfdab2414a621cef6902568dc6910968aff2d60449851f27d154cd2fa15929268c3690861f9ed37f3a2079b8cbe000000000000000064755c010000000082a5e4ed0e79c1ed83481f522f404a319641aeb779dd1dabec04010102552a0fe15ffafe8ddf9fe59d8c7359811dcad5c9fa9e4869b58150e0290d1dabade1c0dbabb0af584fe87ba663596c467ea2386d40845055fb44953a7d20f20c547a040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093e8d0eebffd723ae40603e23cdb84f1a1747d6b9ee4de89fb8f948a049352db4cb9fce800a11682d1e54ded46e3bd482b7291544ed8f3771df9f8779a5bee6ff3664bcb6edcec424c8773d70a4e582059cf18d86c9b83b019fd6b4b19c3ec97f8bb22eafb02a12ad7e8c34004416dd004260ceb1e44c0cb1aca811936a4ef0003109f17a115fda7c4e746ab81692b44ee1de8fdbab1a7ae4ef1dd91faac262b3f0309c90a1a5b97336e1501b730e1674ee221d4886744f257217e24f3773c5601a30b0f432345a23a6a300ef8da147ee298ef0318fefcb4c82bb6071f996752833c2d2225ea960a15b581729bc0f25ffd002f702433a7b93b30b786851964859e4a240310c93fe4eea72c2cc298b663f1f995b0554da01a2ef626ba568692a9f4ddb3e4022d0cf8af1b04f6050667280ee19e5bd66f412d83e97bb2162dc28aa8a6c617f2032760e1bbc3409bb57994b05dc25de41a0da3596564ec2fa78f6f2c9035fa93ca021e1385ced4f44a6f03aadf936ec00b4b4b1904c19de03bbd7ffa7da01e6c30d5020875cb10e337cacdbf05b9735b179ec54aab77687038a36d5ce21b20a64816afa46f4172c567a34c4c251f12b778ceab51702dca4a3ebc41247f6631503c164d2f459ca6d7aba5829f7391c197d44fe70d72a4128e644cff73df147b9c67cd310be33a7334c1232946d76a33921ed018c3093f948c0ef0a873a0fe7a3a3506d2ff39107666c873af40e17d666ad7062cd3ae3843bc3d9d8f12b4b5333bbbb3007e513ca35e1f2759bca413b5c274a7bb9cb8345bb2fdc9f6eecd937fd28e3370284fa7189f268a7478e9aa353e364dafe696aada14c2ea3e1b59ed5705bc9a67e2a66d83d0d78f02951b8c21c57f3d845842751096e0ece04491e096166672d66cebbfe1c2d38ea117d0d8c1cc71d1ee2d5fd66852c721a127f165801db752df10ee7083bbcbdeb93723b9695b1aa2a5217550c80da8efb6ce5b98b3ef12b1f1b2e08e92150ec25f8b58075a326f0016509c1fdd21b4353bd68da092d1a2ccdf845d931f7526f4f8bcc03d5c4b3b1401396bf886400a2b7cc39fadb65c552eec1da43b320575900b70fdd72d580e1d6aae276f5e4641e6d0038fd5681ee540643a6a022eea71da1f40eb084ab33ad083c1375445251d5871d9bc73c1545c0436b2bcef176aa9f9cf57f797913c4870e13aac989a20b2f51dfb32b5621b6e875a4c7ba40c6fadccf79944bd25bc87ec6a2db06926d20fc8301fa76d23fe7f1e18d154accf68e1823b7945870c8c4a82c709e0ed6b2718f3c85cc519ee9f1827def2bef7ae952b5bdb127da496e17632ede046a5b77456e0f73349ce07d28cf06951c65d873e45936ef2fb7300e5323b3fc4e92d9853b93b456fa8184e9c167700e22720814be7cdfe0995ba0331f712016388c0ddcf8bd1da60900b3b08d3e14831508965242e093f461a8b1e7e382b51d685e8f9075c50d5ce9448c12d06d016e4dca8ff4046418097ea1375718890df77f638bd9dbfc4cae0407cfdfb2058f35d14579fc49b4e695c7d5ffeeabb20d55a472c9489519be94bf9d98536f87887c16055a96d483cc72d657fdb2deb1a088c04d27407b3678c74b16cb45c012639632aeca6e61e94a826881fac1f421e3249b3e0888d0f1806649272dd55bee35fdc6ae9aea49f143169f97abb9bf55f9ef5ed009db96ac765e5b2d2ba09350c90137126249f27360474f2a4931b26a08ddd4ba98278b6f95516bc51aac5e8f4d8381be4507c9c24fd7ef9db648fba63f306392ac5880af5b1438cb716d1a805b1dcef9a0c2c9f3bad12dc62a1fbaca2f8699f5e3b5a3b4400890a54cfd7902e5977c2a4384afed777e3549fb5dcd8c7cfdc503b1d0849b9520a8a40218518c3f2acf84b653e3ebf1d176d0a4c2d0ee6792c8eaabac94dcf896010e4aba3d4b91511d0698fc2e2d04b83c752f131b63c434a761544b738ecb2c38abfb398c9e2eda8170758c00f211143b61c68b50c64bcb756277310e0c8dafa0c2001f027928a130029a4505e23d3650c87a9a3a03f52c010727b45237b089ff68a5341a3c6fc969482da4a2e62dbd0cc175df14ed10c1c540ac27dfa39a4c50e04fc320438df5a22aa91fb1d8b7132c6c3c63a06c499c3d26d8aa41285ea4701c165546fccae445c13bdd3b29e27d145363acf3dcabf66687398d325b8385d2990ea7ce5d6974befaa3af3578dc2660080bdd17fc3d33be05fb7f7dcd53f67c710381d91240301ba5aa471f98573463bab0a40e5b9c5fde35777bea1cae1843cb3129a60aac91cad98efcd37b637cf5a21bda00bae9f019e0ff2b43a7df8420a524abfd179621c85976b044d854f4c25a032f2c3408de810c0b7b0d9d1c2fe54d661ad402f5d802715b5a6925b1c8282296253c28713c20b", "636551acac", 0, -2043176623, "95bbc51bb2bd0a40a74bad3102894ad63b9fa56aef94d50bfb298883f783205d"], - ["14b505d0034729f44da95b72469c1919325d531131bb0e99689300071b2eed73c8113bc88e0000000005636a510000e91989f9dd19db5c8d12676dd08d8013ea6c606440230a499ceb051db1257b03398df5d70000000003635253ffffffff148b748b363109f789521a1a0d12e19218a364e1865fd59a9c2746649b03d4a403000000055151525163ffffffff0406d365040000000004525152002e932d0500000000026a528c0d66040000000000fb6ab204000000000071790a41", "", 1, -1884621492, "dce39e723fd59a35713bb718d815352df04253f30eb3b1792aa2d48e4bb0d5ad"], - ["6620c602032ad5a8c2b24dde6d1bc0bc4a49e263f7beb3b27ebad417b5d855c07ea6ccc7c10300000003516353ffffffff9d47c2ce3f709963f0e19cab79e26d772252c501cda33a1607bd7b7518f114be0200000006ac53abac6353c96e464eea2566d6189de6b0116665ab1ed85a89cc436f1f3f649c25a816f0fe4c73b53e03000000056352006565d7f054ee02846387020000000001658ec1cb040000000008525153ab000065520000000001541a2c05000000000000000000000000dc5bdd184b1ec3fafa2ed7520cf862f0f89b0074c312e6d2d96965e4f8c934f44517066205d5b76cabc743e5267017b53ed66f4a12a2b74ab5a43ffd782a0dddea4499cafd062e473aaa21c0e1946083791ddda22359f981bc05ab8d8ce83d54000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b4a471cb90d72ac4a419af1fc42c6581358f287f6161afff81dbf0b22fdf650af4c8fa360025fae84f8d4418159a5bd548871f6a176b27b896b72ed881322762cbc9c797420599fbe1bd1bedef5405e78e9839a279c015d0761be7cca1483f01bbca3c317a0f9d6ceb4f84ce92ae5513f04a9d5c17de0f90b194fd559c7aac902284df4dd77949f9faef3bb0a73bea227460b41595d75f00ebea36400cde16aa00327655f41e6c37b9ae8bff772c0f16c52d2014fb75639e0a2ca8f94d479d6f4a80a281d7ddcdce41e452cdebdb7a741b1d2e0b1f10f88ea19766a1afd7564085332008c3a5d2b88f25be24a97445fbc99d7f1fb0761419e7e2a791be3da0a7e14fa030949f5e4c4cd85836efa2f60477df379523e8e72124d9a242f08f80a2e2f53b70321702903ea84b9acc620c305aab8f4f184ce3344e839dce53aa9cd9e259f0ba30306b3ff6cc404cfdfac48ada13a645828e8f9a54f10a89f042901aca32809af83031e62cc5ee6d9ea08a5500c38b40aa3a56ad5a976603220ac086d604bfbd5a998031c332fd550192c9533a69906d06da8e0589b9d578f7846936e06cf49007498e5c45770d122cd21c0f471633004bd71b914a20beba940917255d357ca3f13835f81b003b73f4a66e791a915ec7b4a37f027de8ce221d45079f16cab5046f09b4caf25662526d11725fb97714cb3a306791872f4d0458580eed9beef263929c214f3eb86ce0f19969c0288ddf768271935519e1cd13a75b3e9c89b2de6d59ce2571364f5b326f05136af3b1d6c2b7b5906ab3cb57ec7005e3a719be78ed6ab0a379f764565c1d826926a28acdba2b9e9939ffef3f29c1cc8697b8a6285b40204686b7ccbb5c326c54d666890cc9f4701a57a3e33cd4fc5a582226477ca39dc3c0c4aefe953a5026a05eca65d8548a6b9e7efb7c699e2722a813d057aac25ee617c88a2628f60cc92ef23a34e4a6df3f2144ba4b6cd830d05816c924e513502542aef742caec5a81c8f343c42f527991f06239c4e37d2b29a81a8e4258538a97d1b5ad97d4bbba420605646507f705a5bc31405c724e5dc244f3498b0c44aaf8e079b8be3e4e62c49fdd2b5a2f5cd9c480f610d8f841327971cab5f0a3292d171526e9cfae9cc59b0ac9e38b9107191ca162516cdcb1cc92c357e74e56c386275008e36dc1d8598b6b6aa6121a5b39da8ab310c4dd6b32bcbc3cb65e6729f669ef32b55ff338965eaba184bc74d3c048e59ddfe2d960244a5a3f5263a4d64f072afc6398ee0dbd00ad7645636162a050eb23c7a01ea63ed6d7e81ce180ba449f58b1f8cc17c93611c10bad4538138890ddb9748cb00067643a3597f9ba946f1235978c3b686f7cb8900534eeb94de895614effb0497f4dab85143306322e6c3593bca675a1c97205b810ca955a032778c0f4f2b9cabe4c54da07d3e8d17db728a56abe921c6ca88655145a72413663c2375f0b2ab43dea81daa76747c24c4f9de6f411e4bc9560b625e08aa28cdd6e2eba342dbe0603f0d857009bf9b32e09fc886a7e80453953cfbc71b74da9b9d81e9faf0431b335b97bfba3eb9a01a7c9ceb93d64a25816db6d92925df995ceecd19e87f29bad369460b7a4f68f09eda656eaeefe8aad59394d7589749dbd18833f3c96c9f32cd3cc1b31ce86bac672441449b9c16f9853b1388d0c0ad13de28332bcb590a148bb7912696533840659ed4e97dac9cd65af7cce189c5ff686a0a3cf5d7b81171ce579a3942ebec348e1d06f30866ac96e79a39472b83038be9988a59f2aac229408cc992b4eef9a1f28f4bc2a355a77bba9df4de4a74c1b3fb4d4edec67c3350df95d6b75821606ea788de31f43bbf7511c58dd58ef09c2faaddbccdb376fdf3b407da3dbed70926cd6f77b718808f26f6d162af73b2b62f610a375e89d27d34dce0f2e3003c36e1aba360d776c9cdf6080971ddca6424c9f7ea4586931ff1bbdf2a9f9b2219412fa0248f33a33369dd8243f336cc8537b7960db9f94a57a64564d33e87b9e51a60dab7c3d42e718c327a72775a5f6cfd9efa0b607d05b9bbf3f53b5b89669611b699263ff7773900cb6ac1005ff71e85a29fc418b7b76f00f5783de94a29697740ad3708369d770475d0377669f1e865400788a3a6726e0169c349c103ded33d12e12b327d5f021091bada7b833741d0fa54c195b072d1c59d8b778a78aa6c259bee94f0cefc91e90d907a721f9fa3509a3f734e1b729a5ec85c80134c0945b0f78e85cd8d7748fa137f23a47d9569db50481e15b5ea4b862e4c078300858f79d44a2060cea09e7e3017e28aa3283234ed4d8d3021560276ba2ebe184afea98bb0d6c6da06128de4fae720e1ce7e5cf288f8a53712e7a32d9e347e4ce6c1c4b53aa8425010fbf45bdfc278a0214f5b4a2f8c31f3e561fa0d", "5100", 2, 2109038873, "8a42a93347bec043f620f773843736691648dc58121c1664c80e14c46ad681ef"], - ["bfd23ded01b04038a75c11fb19c9e570f5e0491400f2f6565657c69bf81f31e18919f297ed03000000076a005165656551ffffffff04f38ec103000000000763526a516a6365bae6ab030000000000a1bbb20300000000076300515165ac65f5384801000000000353530000000000", "5365acac525252", 0, 415677267, "fb383852c20a94f8d0f63489dada2a654454b9e7973c83850cf90609c048e41d"], - ["8b96dbae033823141dbb58b652c6f1031144802cd4499e1b7b707eaad8b31dd23792f61fa7020000000752526300515152ffffffff93548e23814b220601f05969a1f5010ef7a9f5138d63831a784ab5a24603282e02000000016affffffff9dfd37f3b352200c5e8ab1c7a421d8938c53bff2e30aa57266b926f19f7dde920000000006006551536551ffffffff0450be9b03000000000653535252ab511a576505000000000963525265525100526389d6a6050000000006ab6a5365516a9c9bc3010000000008656a52ac6552ac5300000000", "526a656a635152", 2, -987330185, "9dee181c0dace90d70af2d2ce151ad54cfd963e0792b05ab7800633b76fb6a7f"], - ["4661474c02159257ab033f526fde4f279e2ee046da0a9a039fbed896c2fc7689a1916c678901000000076300525152006ad9f3080e507e587b4d930a21fe7b96296505ef7941ba7e5af7b452f5e1bd2c7c79e651d800000000002d3fa233014f8a010000000000025352000000000241eab4010000000000000000000000001454c51a51a62db3db97f05f3588cfa73d42fbd8093721f00d6b6d772cbb206795b8d8e866f40245c7fe15a2a7684070b94feb2529eebd452a68c1b69cf6c7a3f6753869ac1e3edc721c62b6d9a54265247f06f5c0f42fef4825caf8bf339b6c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e5969b87fa98ee030b76df3080f6fb08e81349470bf6821585e0287d75bfed6572ce290ff82effe36cca8f4f5585c1c0f52dde3aaed30ccb9866d73a942c23bf3f962ab107b4637b2dc76412401f21eb1463ec3e9cc06bbd39826daa1e2a2d716fc78832852f68e9d0116c1ee5a03ea0dd1ee292e5dd074693473fe4ade83e1f02085ad6d2097dbbb9f92b3cd7d9582d421fcb1f2c5f75ed8f1ce332a58b8a630a03017e3ff909b2a0b685438c550056fff47c58dbb05ed7f89bdbd921c6e04c74660a16ed97b9bf809a998ad37d0346fe40fede82c4115904bf3c32850709c6d0b36a07c5bef747752e01d0afbed76c7c62677fcbb70035bb2664064c37b3be8af7e602111ebc5d68384885f73c2b6bb8b8c1860f7b0fafa4566cefa49486411fd6612203025df4f542f6f3b96fe15a6ae3ff297fdce71c04d2040e1313a612eff907bc03030dbd986008f73dd35a849b15c189300b36cc1cf21c03bf815b530a8655538024032ec9a3b69794a6b6d24c2c8ad088b08a11164b2a5bd497c0d00d1910940a5dc203015fbbc5bc2e21ac8eeb9d473b1ea497e7a2929f2cb7d18b140f55d85016c82467400aa84adcfa8be43b064d63a7f2e9eb9194979f42dab8ca50f7c1b0df159d02a1dd1a069b115ab55c6a6e2efbce8e715c566a1d1f4da3326e3f95d53ee033072921722d6634743ef2844a7b4c48edbd539ac91827655f345cbce5c4419e723474c5181c9e16fd8d88d01d854ce9aa2e49929b0d07e862985de0ac424f3d6afcc0a1c0612055be7cbb42acf0188b2072cfea1ad031ca35995aee2c59168a4d9fe6e64c156d46746be4c502d3af0831b87c9c304db9be2b57e3b94d287814b550ccbb4ce93bbb2446def5a111e0aa560daf11ee2d1905267cd7d37e103623a0e5297a09bb95a1c22889ad4e029753ad8c6c552b1f4773728766ce87bbcaaeb3eb1497c494ec61e49d7d5227f59dde516b89df1fdb8a523a3bf7a3b883deb3d8e41f57e74e4baab71cfbf8273e8597d1d97aaba5eaca53687d50704a89b609a24e2bc8e272d897c183407e798bdd9ed6b9ae2ae78692189872b5943ff791b260a21c7edeaa4576f2996ff836ee17d51b976482520293b5dafa7b8f656597b940fc6096d80f6b4e697ed482b9987d55d9651d258e89edc2774487a3ea795d1543edff7eb101960d00ed0401c6e86efd431091baa3c2a505062bdd2ada8d6d552fd1f1a08ced18321b3ca3b6a9bec658e7606bc1a1a5dee044efbb34fdc0c2dd68316f82164cb0f09b56ee4063f7406f2ddab2c12ef14cdf864254d7d9a647c326c256fa4302f1301bfcc030348937a187e071bc62603857e53b0379d613d2d560b83dcd9b678ba8f1fd7df136449ae71b0cf248ddee97a5bf62d00bcb580c0530d4d3d25a615c6cb86cc163180908587c9a57f85ef5412a2572c2283c356464540655da8b0b6ce581f574b1ee2f7d75f99609fa5d6e340e48c2f5199d9ec96bed474f892b3e3f436dc6fe17b68b1ccb58cc259c40b552581139d3abf45395e7d8958f9b169674697ac897ca8fa54ff4c894a5aa4151b154345c043405b26937525aaadc4ab7441b705e32996b484420ae74b08b89f05bc08a70ba8d56ca7cd19a72bf622df23c2f408507b7054bbf48bd177df0436c00d6095f5224d3b8bfe3baa4c1d1b7bbacdc14f1a0070211aafd86e27a99a77dd7dba81fbc48cbaf0a974df2245682dd3027a7587fc531aa57f4a815f95298696f3447bc105a0fa407d5b729684fd7698ebb0bd6469ceb0092affded325e2c50cd501a91c1c6bd95e5d4dc6a5bcf9ac5ff241cbb8fe85add79561ca900d89d4fedee4641f12b27d115d39c187463c78ec27c48433d5bd8e055e005b414e5e1b09f0f2f9410ef2708b5109082a05ce063d0756373bd6c7ea2a23011eb2a34811969512bc76a052b7d06b1a4ca408843aa70fe2582676fc948d79da608eb24465b1716469228772f082ad57edc6a419e723a4e86789b836400c5433829d8e648c10f67dbe384687050094f711dd284ce6b00b7853e6ea9ccfa0c825f9b7ec34cbaac1739107f0e2f19313e3d823635d637c0a4a3666a8be87b32d4993fe6a90e279e56416c3229f8827c2f56ed334893cf4a64a08785220335319fde60c93cac14981aeec7ff543bfc561a81168c203f586c601c4a1719f62a79b4c8ae9e8351535a14a619a9c170a4e5b096e37232c60e254a0f194269729328bb50bea8c6764dd94205dbeffe9568af72057e971eff130a271c618618cc09bd2b9003b50000000000000000f2808104000000001acb1811f3b81029c8b800a39922c372b44a9d992f41127552968ea00125f1c0380b2bfbeea0825b23b2fa5e09e4467e65b0066d7c0cea97a33b99b31dd5dce548aa352a026d8b05bec57312c32ef46b062211a052d75ab3dbe961f4012353ba000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003fba856ff0154b75da19fed0296a5f60d1670e92696e2a25035f8036deae80856cff0823cb1449fb1693a80f61ba9b905694a2225432d692d6de2d815b711d252f7756a11435f0714d98f84493cb0fdcd8bc84bef75d0836a1a5ea7b4a83017398b1d2180bbfd02373af3c97b4d5d30d8a8bf7a94223d0af9122a97174a94f8503232bc1c516551848f755e3ab39bedd33d187dff34e72dedba9ddaeb10257d736032ddfca43aa50e81f3897059684b0ebca2cf7758ab34c3f87eb80b39071c1c96a0a2d441b9281e740dc9a37a290cf262668c0041c73b03c6b0143ec53c39922bdb50f81459b73e7ced760520744727ff0c02a18f2094105cba319572fd3fb5931f1020b603db58c8a7e613b229f620eff888c52bc40851ba99658b948bc48300591ed031a29d3b256be79ffa3166b9553bb4299e169f39ada05bd01f0cb1bac14f50454032b5718f99cc245694c4784ccab6702419bc652e9dec969c9fc4593d2f402b5a20315ca3bd814d57746c8df11152454fb2c1e6990deb42df925b1270c8bbbfbd594021e38f1c1eddc5b15d5458885cb2a0420a47d342869d621bf197db37fb573114208659b79205151bcb6356edaa96d956b11ae58047f6e2fef86b175e1df61a2a794e44f872ef1e5182f65b5aa2cc54c4190f6225a0929c6e6ae8d1192aefbfed195054d1d1e95bbb987c1bf18a49559fb8f8c25d43c6eacacb5ae4169b2137f682bd5363c2492fd8aa0b81ac5648c851ad29bbbd70de841c8953a4371753bb9d70f03d18efabc1100796f294d8f3e9a79605336e3ad21b5a5cf451f6f8e8a97658a543fc3e70dd81a0229594e10dfafc1bc55d7c762f332f8efd1a543aad5c31bc6d43f01e194430d6138c470d15b9342cfd0363d05669fd9b9230327eff2ee8fded5d8be6415c2ffda0e34b3dc0b716050f12437ca340d6cb2fc0eb522f5effb3f15cdb53dcf4875de438c724334ee779d6f4e84dc55b9a38ca7637ccc0a757ba1dbe6ddc8e9b4d98574a58d5187b6aeeb025fcc31f566c15a51ed9cb4c13597f124ff273ba6162c7446a31a31e57a3014ff7aef415bf1c82a389d1022575352baf37d65529e53048c675a1919118e9027238c52006e65b56d43e7dc72a210852e9384de51f0bdd80701456953ae2989e3f8d2c5b13152124d4742039b672b1dacab90317f457d565aa43f1377f0208904f2f32459a2cc763147907fab3a10645b621836fd1ea2971985802da35692611ed1ce504b129c4438160c235882cda25023024615b1e3cac216cf9ab5734dbf9455e47e73a8070c28d6b2e65c1d9b563405089314f5db8c75168376d52f351aa4ff06ee84103e3a04d2513935cd3576af2adc90f80324e184522f0ea71ead49f459109a3a82956dfe11a89636d028234542c0a415654cb723c7f27f379fbb6d1a0a0bafcb114cdd2a45a75d46720d151b1b7395b2c404dcd267ceaca418a78ee1240e9241c9de6ace5b2a40be92d35c59cbcdc8d215523d42e62944441aa33a6c523f8bf97fc70247b341e995bbaa059ae3c5e5951fc6d359ec3db6e6dc46844e952619f3b0ab2a7dc25dba7c82b7c502661ef46ef88a4bb26429f6bfe4d98dca045702f7cdb9351ba4c76d5382b6cfe36d9f5cd4534159204d18c702f5d9adc1297b8a09b3ae0d4ee1bf53dba43cee153723d51a66cb72ada65a2ae5d5da33776b7948bb83023e99548dde3b1455ae3438badf5fd5d55ad04a8b8a35c241bc631911096e863b69ac5f6d402075ca3d86f71d48c488ec77273258da9700e71deef7178d8272f80c6aa1626057e549eee37a4cb2127b6b3854bf69afdd1d94e721f0ec8099756359dff12b3a2097b8a6af16471d2da51b2bf5fc0edeada2fdd118cb9633731a1a1d7432ee6e67737cd71239f1d057f47a65818e211255d4af9350409d45d12fc8d54968b30def32843e9d48a4d479feeb218c056810641cb4d62962a2fca660b37d8432156a5488a4b7bc1878b5c64201686ebcb22af19368706c43904b0927cd322b09e43af0540e2169aa323ce15a39c08de3a188855be4683bf3989cc39d1961cc93fb10890ea2c321b67d3d2d506b4a66fb226d46c368ed5eb2af543a3570d97cf15aac65b52a18ca2188c3db423823dd89577e59c02f2b5fcb887e274a1fa6d62403745ce5a9c544c8220829ea9d66ce036a3db6ac13bbc024dd58007cb2e574abdcd51aeb3ced4114fea6699368a6d4e044a85b602b9e74e692b9c28678913dd8e7fa1289e25f680371e5b5fa98547ea385ea29160dc41f58959db7bbdaa973d9335034db1d5abbbff3387fd47ee8512f86fbf4923c4097d180bfd4a54e81eb044d6380a97de62539ba07a8e12c1c1acd56060d39844ce34ae003974b069f6fc8106ba2a7bef0b2ce0843254a85bc494d8a307b739866ff09", "526353", 1, -939854848, "2b814fd86a37a51ccedc9053c0a1633c06ca4912f7937e25dacb54c838520db1"], - ["a1e293ca028c9a9837e7940a3d8173f05910e7f5fd862021e7d1bbde71f1a2afbf82c21a0700000000026553ffffffffe1380cfb378489113d3b4a093ff18a44191695f8d259d48c4670c5a607159081020000000451acac6a0bbdafae04073dd8000000000004526552ac49c49405000000000263aca6717104000000000963acac6aab006300acf2bdcb0300000000095165ab0052ab52516300000000", "65ac6a6563ac", 1, 1855726952, "99acafe8241d54ce7755466966d471574ad1330e5a8f4bc07ab13b84d3ba6c8d"], - ["51f4743e01cc89a7f7ad46b09faadcec812dc6eca2486c88f70c097e595bdd4685dcd20c9501000000095253ab5200ac536a6affffffff04678fb0040000000000ecccdc040000000007005263536a535144e51a040000000004ab52635340191204000000000300006a5b4d9dea0200000000000000000e6b430400000000cd7ae69b909f6b657000add78d09757d181371225fa62d476c411e82d676a4feda6f17e6f632445c9cf0acc153f049da32272cb3b54f74eef2837b6d8bcd0c4b242940e62437132502eac0995e641ba2f0130bf1c100d8f89ef4f5295b334d25000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006143a9cfe4e67e5331155ebbf3c96da5f6c19519cdcd2fb66b75cc97f2ffe13e6acd053712f3b6fabe4b67194925a5e1f812ea8f4f76f7426b808c080bf84e8807b65812010ce63de8fc296b5d823ad9f67b37583e662a035f2c7f5f5ae561ef0f18acc4232e55c0ad176138c19a0bb50bb14e2809da3808c93162e5baa5417903103a2c0de040073ae9e4cdea0ccfbce431f0e096f080a63aa8d4a4a80f4cbe5f020b444f32d1c47f837d3e9b71c726c42d79cf4c5b05e278a3c6d960006699a51e0b1ab0e1c6f2e61af949b2477459a6e7960055b38573a209e5dd5a793f6aef254f2ec0d30602b3aa049881c70d36baf107e34c111ba77c8c4c4f7eea3b9da641e40309e9490db578b65b17889809d2a7d21830920bf83041c5e009c0069547edcac9020f0b6b2d2ec141937c57e8d176193af4ae6f70b18637ee1595fe3377b1141b090204d1b6c0776e20944402e55e6dbff03a6c3c25c5b9c4bdb5869fd6cd69a5b91f031c6dea013b2890e61c6edcb7cda76ea83665ef63f012681739e7d6ba30787ffe03277abe04539e02f659e60b34272489230d316867dec236424fc676ed2f4f9c92d87584e2cae67118b1e326bac86575fca134f7a266a307a5ebbfa67a9d106b6a6a2f791b855e700f125c49c6585a2661d89624deb9370f6d20c690f8ce1723371b1f030fc08315fd4a008593e4a7d8c2c2cf7ff5fed259773ea9e32ea6353a7690bbea54771b1a2fc5df4fb7f1998e23cb8492c7e9b4f147a6bca1751a3760f1751bc0fd41e7aa550c17583dd621068b878574aa28d269983d068405cb4010c3e6fc89f72ed1b54f7f8516c9662577e9eee35aef24fcc5014ffaf25a8fea471bd3e6a4c9e033383a5bfbe77e941a1d6f0f3f1779de6fcd3b265a8acb4a62675b65496d5c13208e747104dbbd1c6af73b446ac5cdb35d7163262633d5049d467efe224ad783d6cbf51c154801765f9a8ce6495f36452662befd3801e1d3f9799749c5dbf3e7397c13ac57f3d6e84748495a02ba64eb64b380154787a10cad4e29ad5354399499dfd5efa542909da7f9cb860804e370948417516c979b7fa7db506f6d792915e857051619c697df43941b6f1d6693ecac81a61a80fa29ad2a0d783874fa3df0010305bd8bb9993a248dad5d29d012a226998183d17f34aca45c7ff271f2c3504b32456514801f30ef819481acea2c2ae0bcee480cc9e57f910e0d0f602a0ebff4d4499b94e9835b7ab5842fb11d40ac8f427755ff21dd2ccfd716bd941098a5c312dd898e837c790df35dbba7808f875bb3b41be555d786aa8a8cfb1e5c517d9474c477c0eec5898666b2f03c42488577dd0f409fb6ded1cf49db14434b1981f74e631d5a0770873bd0981916f5787db954777016c81815e94795dee30681472ef53063a75c80c0dca9559526cb5e424156d0bdc18ee2bdc3bdc58ed59d536fed46530eb26bfa0016aef7da6b16a08d9ff353ee43d4afb359500f018188c2fd43e0fc295f0c5b6763e6a3d174cc983341dafde20f5373fae5c4d439d5e2014714a70f8b7f3d0f40c60183a99c33c09088e6b92621eb377d988b98d633376bcd1e33aaa2c84d49ea1d4aa5f7e7c75d2440b741d9e9f299f8617a0a895c76abf8362cbe982cd45fcaac82e43618e716f94b82424688fe38137d66d6b016db6c971804dee8b9eb547a4c0f148868f2091a9c564d6051409c1463de643a9d48ec8bf535e990e8345e9765ada822d7cdd71ab2370b057ad46af9904257232c49d81fd597ea02c34bd80bd05e9150843a7baccf86b4f7d328c8e615fe777980a2fee52adea9f1453707cc8f4eaac9a5bea6a1a0279ba3a47126b7bd71449e303dae4580592db3f56ed7d93e639b0eb99194df9562849ea66409e4e4f93927bfc161cff4a9b7972b853ab1fc6f4e7777045f92ed560a37cf79c2daa4210d3756f4e84bda0e5a953e7c20457de1d1051c9c7821f420b9ac8e2a0130dffac727542ef4c3f2f6f6400cb6dd09d6549111f72c982b0b2a539bdeb800da648c9b904e9c69308ec1f731f4699a1fb1e7b68464e513af702203783ad0a658d2a3fceb9e5bf178b83a323e9e883a6941405737acdcc98acfdd7f76506ab87afd829cdd584087748096b038edc6732ba5cb99e80b560ecf8d0859b9d87c0aab2e2959c857723c5aa7a5895640e069cf30a12b8fdbf1db00f78583d430bcefef6b8166c92d96ddc6962f99b3f7e2ac7c521c698b8fc7ab64b3d05d7bc063e2b1dcc94063cdbbb1ca25f6b3b909386cdd1f7266391e0000000000000000161cc1020000000079affa3dcf9e8c4e92a80d8bfa9dbae9a4a9d58dd5476de07425ce68a36f96b50b6ecbe6f821c76eae2cd8a155c4f5140ead62e5fd4888f2b725416d2d215e67c585785bca2a17eeb86b717f6e4778974820b9722d431831ac15629ca8e258b600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de998c4488e7ef48debcce399746f1725930a66d09a2b004d64f449f0edc4a690c6dd1b944880b99b0b62adeb0e1d0561ef274c8bdc86509cd1dc4762236ca6847e471ecff9ad3a92114c86a31fae2ea5256459225f618ee7b72c42f69e1d0112fc2cb3a989248514619376b1f74339749e6eda1d4e1988595ba1ed85dbe5b3503253668d90175b15de1696fa1a0081d504e9b9d5ec180599386c6edbcb189f6b00312ab5bd82744eb649e226503f79a495fb5b1903d0946ced0868b7447dba3ccba0b17941c198d563ca61bcb3db5a3e242d9cfb667546a29dfaf170a25201653bdad2b39418bd1a6673b88539b1901f6ddbb4a2dd983a1a4a95f21f6db4998d5ba470303538a22b25a2eecc28e06f2a20cb10a42c534fc8fba5024622108b04bf7d3d6020ab1510d2fbac965a5192d156e515ea43fc349c9843de429100d5cb9bc8fb875022f914c1edf125951b5461e84f0b82edcf1c605703b11f868bfc08ad7f9419a500308f9ecc758a346b506953d63089ef170be888daf98ceff81e2ecdcabd263b0c60320a069750189c99899897831d1491776625bb7dfb494c84ccbadb4efcbd16260a68a9880a09591ce8a70f90b152d5df6904475f8c0ed2886b490319ad3a9bfba4337ae40f3cd0e96b5256f01f39df8bfc8db341f81de8bc450074c9ced9dc4c31d33861350f74210605cc5722a8fe9c296f90c1953387254220973982d5851b2dd6bd09d070a45e40258be687cc8c2365e4784cbfe10449dac7f0be3c514103f33761fbbb8d14634d7d5651def1c4922ecc496db48c5554bad34c70db8d9d4ba0aa1116a7e7c09c74e44e646bd63462faa0f6ad3de445c0a05b2370a72c41c46500260c10b9f82e7cdee3777b7b7d3ca0e97cf0385562d47adbdc7681d7465e05d2f3d4f20f47d9696900e65903682f09bdccdb5ac5dd30abb3912f9ed2d436bfaaee80c074be73ce5ad13f18894fca0087b5fdf328d8e73d939cfe1a6a29d3aa72ca19dc19d651471e4ac028ec099d0e41eabcf8e3118466f529d52ab0842f1b61d88c9598ecae71ed0fac0cf2dc271cd152957282400732ecde26faed564b8949863109d96bc5bcad2c68160fa6a348b780c37f2a9db9b5bcb086688aadfb92533cfddd50e59a6d176cc9b76091313789c56be502f42d90f4a86e4d31513177482d2a6bec33cbb2be3024d72f3d2cf9af625759dfc4225ca82d0b64ee862bf51afdde04f0b5b4c4095b8096b09aa16e83a9cc9b623c0df1ffe35e5d09ab6c1b9e242365a622ec63cbbb01e06a75746122e5346e8f16c8a1c3eda13dbeae5b168171566c2637ecd9ab67ea07e2081128686f7b3fe7cef6bb4cd2a981ad2e9f610c878523ae79aad8bfeb49ec922de3a175cfb250c529dcdfd3082aca565b5730a478d915de6a65e5563b3ce4949799b0ac38287191feb197abcb0e917c70173d7c000ed1fe8b97677c1dd059bbc5dae67ce34b4a7fdb0cd8cc2057e16df82a4d4c0a4502b51c72b34193366a429127a4b138b68abc27208cc7a05348ecea2c921f04fb0b0bb1d9b7956df6ff3b7c022ec3e1dcd8d6ce2852029065e1dc48dd9bf4c4b0e49445b7edbff3b9a74271faeeecb48ca240a9fefd320fb37d91632da573f1669a006512094850d1c009128dd4c99828250435bf87c895595d6a50966750c127266059afa4d99cd718d36c96c85bc74da3fe5bd5e0a7f0d48b450e54409c7322e33d13b1c8f27c2dc9a0f339a7f13bdde4399e58d9289451d5581a7b01b456e0a21e9ab82c2f692e026f750f2859c43bd231c570b23d5fab65ea2fb4632cb70dccb60b97a774ac38e2c001aafbca08e03ba4e659fcfbe425fb9a4ade4978e0c39f497f590d6c7a6a65597f924adf8d7a165dca6eebdf0b5e54efbea040b4b4e386018231115fc087884534f166d2ee1e847728a6bad5c78054aa98e37dd6d2ab1e3a304364a454cecf06f37355d317ed10ec35b313742c5be0098324aef12b51e2df9956768d2974c89cdefaa3caffec6454f228edf74b56675a88663429067f4308252d80e9d6d9bead603b5e46c19ab9eb5366ec962a215a48046fe1ac16557173c5592f45801bab964c7991edfb140670f0903d5f537726f3f25d4731b929944913c86663b36552ad82b05800da2972fc768795169931753f0be221f8471307e61cbbecd0770ca1d7ee39ed88bf4495a8d62894835ddd84784f5ed4b54354ca335718158fd90b206ebadf2b7769163621353f4c3df57532afcdf96a4a2facc1bedc425df0aab021a83e9745475dbd86990432a739cac5623d154439fabbfe8b8d47001075881975915311b4fb9f08b8848c37aca298c3749eda4470ee29290598a9fbe2de10fb6e31c1f77bc3c9e204916cf09cb4659961d5ed66329afa589a11b45f8b88b6d4147d8d0f43f0a", "6a6a00530053", 0, -68433880, "be5aa43ed45a36b3b55b5051427930e1cce17d17c5afb474a3de33e288148e62"], - ["772d123c028eb5803fc214874e5883d6535c70656f4c887128dd08e3444f19051f682fa4a302000000016a4ec5e8964b500b6f2095c8bb5a0b6be9b3c00e6401cad4a757cffba93ab4c3a3df5f804a03000000066aab0053ac6a47e56707031354190200000000056aabab51abbb08c302000000000153354c7204000000000763656aab6300006476699902df36ee000000000000000000000000006a3858752253cf990dd1f072ffa512a04e0238445f76960d04dee1000b35bbf559e96e0c305b4b686d5ca8b1b4935c4508817d005909fe955e27caac536011e79656df3bb9d79f5fd7310e5d4a492f5c0f5ae4723840573ebb93eac09bd5e647000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ed285c127ef4ad219b9bc56e7c4b98f980d33732b05bf4a7d891855aa3e0cb9c569f26d70a9dc1e3da7e2bc6dc7b8f4ce2e0b552afcb7b22077f244fe7d9216667bd12b6744a5618ab7d138b4027074b6722d34a2cb4504b2a1490a067bb44608884ab882731f3a5ab1e65696affbb2a467dacb4f24e6813f27d4986b8b3e490215d1b37f1d0707472c72958b0fb49a6bdd9c89cf86ffedcbedf39838b61b3d47022322e2b1ef6048952524f5e4607d98da6898bc6cf13a5d68c5dd6c2b35a34e030a23c8de0dc1fc5092907e0ec63668ce159bf30ee2cbf5eaabccda58a7f018454c16c6fb426f3d329b3842961ef4b5f2cbed33ac8209f1d178bfd0c368905a023e02253e254389cdbe780a20352164190f0272a0d264056af034f521e217467268d8020408a141005db6c726ecd7a0cd90993b1727d617f61076ab5382d80e6fc9a2640325e28215db7f3b734f9dac2ab2ae752575a863dce81b7ce5c0bcf95d47fa9b300222edbcee38f3ea62168e2bdc3496a9662a3605acfa67f590dfd31693e28d34700209fd46eda242a248564851aa23346d6dfb37f66fd02aee6b39020f6b4e1a7ccdd8f5b5d7d1eb900ca9d44999c9baa8a35c3bbb0958bb3cd301e99cdbd0e08f9a4eaaa51df7c2fac40c3ea16c1e9523756f7c6dc0944124356e4cfb277951c70df9d89d1987f4a8ab9797df96442887465b512843409ca321593cbc6008dc7f5104fb89486e9627ee4feb582099c66e41403a89f1b214feccb3c0638cdab387b31ebc8c9445442f8c1d9f46529367bc37c95a48d9ed7682e331e6bb64beaee46637a5a61fd9ec2331b4d7f2cb68971f9b2ffa4451d0753eee04d977585e630cf5e7cff5b67ba9475a564b4ced32d6808cfa4360f523f246814f1a7d8d3f0012d16216f29793df41d68636691dbf8084a0a46d04ccb5bfdfeb5f0448ed90d1d1216e3e2c138d5f3cf9f452576ac0a131f2b60ae73715fd56d302820878336dff75b30a65e7d7e7ff8108761a14190721bf0330804eee9fc4d41b830edb268bc972edcac8b1c00342afcd8a7c37dbbfc9c088951f8509a516b4990b2bdc1b0d87d556635c24a2f3d1ee60f148c1ccb917cc305c5948ee89d281b58a39b952b1af2ec4d40214d3387d41e9ceac1cc0c1265ddf0d0f05af830fda5c128df3fe754c2e7ace13d6f036593dbfc21e997ce710102dfd416d3ab5f37889679250d31ca7abcb23b96202e92c39eee8aecf9c948eef20e598c6b4bbb2206001855d870c728ae7b82915d84db18ef3000d0814d59d41c8eb384255cdc8779ab25bcb480717c87da009b33f5687ea7e2ac877ea77aa88f1df27d3a8875244dd0b45377832d6aa7812cba4945c400e263f6b8c0e72c86a1073112c862dc6da9c63a0060ec784674e47b0bc6a8316b9e7dae80b06315d1328ea38c5689c5cd112042007fe0f0ae1e20815500943f681174540dc86d2a9f0c91a59c747649cbd57ee74ad85dbd4ddfb3ec64c9986808c964537e0fb7ed58e37b91a29f93add87aeea96a86ae94279b314d63d4a9254e520b954fee41c56e7716b5b39b0e1239471d930f25d7cfdcdb5f0f27fb5ac9da5a971ae96907698eb850b82d984e337612fb015895a4a1b97ed256847a6af8e9f58331a87d41fce1a4fa8cd1f54f05f38ec1aebd592d45293b991ae0caad76f39dd4c19ec839cb807d2edd2e5ffdab73bf60aa6b6c952dabf0968ad8e03b5eeccfbe5894ab8cd568e5bf8a16cbcecb0d6f0e535d938b0615db6c4c4e7b1e3de435272262cabf5e6e07d672668d9a29e31e5d41e3ca60a47f5600c27d566ab73f799c3c3ea9d20dab160e78d70a1a6e02d8ed0683a3af5e8c7e4e12ed4c596696da7dd5d9b41c83ed44c5d1fb18c62f6b1dade67cf72e0d303e65437e30e930806ad7fdfa76cbed3ce0d7f9b2eee6ae787ac66a7b54af8e77149771edb5e21f4f041929840f882916d72b7fc90dbb46c742a9e87912f0bc54d7d2a61c4821a13366837c08eb04678459752525ee73011fb00cb534558123defe0d1aff65a41eb46e7916b055878de3fdb4c56269cec4dc3baf53c80145138fb0098aefd9ea199ed8d6165fe836a861be55fcddd111dc409ee6737888efa8e887d13f58e0982f7f1cf73b8428ed08aeee801ce402d3c8dc6f9eb7aac2c1aed33964ffd0987f49ac2315b337d696ca88c73f1ba780005d4527b88198b81fbdbe16d41877122e826256c10dfb45fd57e2e28299f1c4fa042178dd9d5930fae61d596fdd83fae6db2630cfc2e95531f1b49160e0f03f703000000000000000000000000db154ebd17ad1f21e8b74a221d9828a4294506eeb9ba9c6471183c5f115f450046bba44380df6abe11f0d89c8a42db050f4ae4f9aa256cf34248f6a5dd06ad3be281072ebe19f24ce274dafaeb888f4705db8af7e321c227e4e9b376961af2c40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000092b1c5704dcf16203b3fd4899c7d75ccaa38ee2ee32b4b095d2d50a55ddb8de49554abe9091baa0d5a96e9cea71528b9c32ba6dc28738f1dfe56a2d63a7fc6759cfaff5c84e71bbc603cbd196c5343f6884ba000a1806a87f1c263f6a8d8671b30e43ac73d32e53c269636a3c165a6cb7a33374f4f7312e1be07f28aee3d34de03086edc321a55b97580d4e560c295cd68e40ce859a5ac81b2808673ec42f24d1f030da7f38cd6d272a5c5f32cb3b9d672abcc028770b2a7966913cd98f91905a33b0a1b4a942eeeef7b008db4047768a93bfab9b76396e92f80b1d7f0253f102e9f230a0442d99afe7a3925993b26f4a47c2d4fe5f16d02317d57c2fc1b940005bd6a030f90aaf75f567d93eb499026877a552a4ae43fbc1d1de82745a4f0256cbfc8d9030983737a849fcc5370ef563e2607cc6e5cf7b26f7f9166f8a045dd193830379e032869a8b87135f61ddda2a4c4025cc2c3afd7b93fd2a2d96c880352f185f5bda9031c5e3d557dd7abbbfc3b5f3c389432af100546b203effca5f834afc0c8c208fe031fe60c6f522b809a0ee7f1b5bb7ebccb33d33619c51948cec2a8a2c729d22960767c786d98cca7a915d399e7c1923809ab7a69033fd8af171a59246c4f2375ffb9430ee1d6d11c4e17b824da60f75ebc2936260c140f2938c43ec79347751f4c193b8119cb87f9630a897885e2fedad1a7560d27bd4b1de192c76da87c1bd3d8619634a6026e6fcda282b893c71bf1722574ff4fe6a5cfabea345464a24a9c862ce5b6dde45194ec1f17582625bcc4f18610717ecd6461fccae6ce8faabf0b584320b6dd635919557b7e540ec824352b708134186c2da0fbe835fe92db9a90b609699c7d94c50f08cf03ec23dd4a49bf850139e873c87245582c64e6fe2ae0ec1091a24bfc5578b9e009ba04564bed277a5385483d5c5b303f70f455b91ba25c3d8fa1cee0a997cbe8896fbac20a5d895f0cb33a40047414e4babf20d2eada66df6625dd0cef3147cf29b9046057654e36a42c41edf0341a11739562be32f4bed8d722cfd376c84c17871eeb7d1ab59da5e3c7c2ef19eb5d5680e6d2e2646a830edc372d5d0d1fb7b51a44f4cf63603dd444af0191a61f91f69ce70ebd50fd05ad8a1f24bee3f2a3dcac613dbd1a60fa1c721eeaea2ec3bf93b3533ec357f8d0f5a0631b0585913a2a12fd48436fefd3fe2901ec8648ec1db3048d4b4458a4ef3d47ecd99a8717b8a835be85fc769594433b99702047a52d99ef34dc51eceac29c395d619aaeac451b3a3e62e7a85a2700fccbe54bb0e677f0b29299a2f01e58adad107de7c2ea2403672714fde641066b0b1c1a04bcfcb57b74262c68656211e4c3f94823d275afeb097147b17825d5b28d5215c7054d8aae7b07167bbf465e2e5ff87bc6efd6c0d16b872313f355ae7f150d04fdb08475dd6cebf7b1b6e3f41122da6c49463708e3cd3cbdc77b919a45569b63547aef63d83f46e5f2f1102bed100939c986d51a49c55d4239c8e502c3bc947861e954c171c4c032bc7a58ec33059a541ba4c29d4ae8b6843cfc90dd16318417e579a9028028811b68d3eb3c188e0553f0485eb61fe86ba2c15811afa6978fcb81b84ba81fe03f986f7ed0a6238d1823251eb8ac040b9a9a810b530e7e58eae2ecdb184f06bd7992a63fd98c8ab55ef6941f37c229c6541764c52ffc60cc5883962769fde7db50e845105ce159153dfa0ec4fb37f1013463df57e173b6bfe4509b5448f443fe0082da1262494b256e29ee314813e63cfde6dc4f77fce0e3e4fbc13ebb27a4e7d2351c5fc2d0c0b99691ef7e8caedc358c22ee4a6706c983f49675d3397774b560c6831f1631787eceada2318ec38ef4c9f3157be120bb75fc3f7dc51ea8a04930b8e5a7df970cb4757f9a4bd769df4bc005edeb09e9eb6b1b2075ff4334714f878fe1a9d94fce0dee4df71f4acdb8fee01f7c658af90568a9fc407d5b39451cf1ad64ce87ad440689d1b386e0c1f7f03ed0cccb9fb9276850a3218e8965c31265a3c94d07946d6dc5006f0b763b67cb614b8134dede62a7f98abf669d6fa05a2ae69c9a4eb834f9088c4f5365efe5ddfe1d975167cd7d3821047de84a4d218625fb9fd80800f883d04c026fd130f3df60db2ea024fc124380169db30d73d113594de1ae5bfafa20e1585e5bec465792ac42110570ec8a1a1b20f6365de69d2d54bb8f37f06c713d1f1fa1f3f2fe5648815d917203b520aacd984187ab04c8a5fe5a57e83559fb6650c91fe7d76e10c23409ce19fd5ffc7916d598559769368742e899337cd1d437af0acedf9158eb5b6490edb45ebd188f2a9b330909387710982694ead7ae8c3ec217ac16dfea016c406555ab856142e3e9874957bf085a224e8c3f9b6d75dad5e08a2db484ba9963a0e2d8bf324eea04", "6a525152", 0, 1018266003, "700ae3e226e466219e7b2ef9cf74a9748984d22ff74f5d43a7f6bceeafeb8401"], - ["7ddb00cd03b7aacc765775e4f59fa3a53347b74b9730bf7d506c5d0eb8eac2f67c62be378c010000000853ac5265ab520051ffffffffceefa11781f8b2fcbb235981913820c9a2ec140205fbdf9b3c48767629a9ae820200000003ab6aabefb3c6c020904a5906479892d56e060774d8f20cc336e02776f3fa9e4b4bb44efdb19b1f02000000002e4c123204c1fcab020000000008535163acac526a63b54bcc0100000000055251ac006a4fc8ed010000000000582fb90300000000066aab0051ac6500000000", "53", 1, -2008903590, "4c960e20c1d46375e399bd29503b6488cb2b51d0db6ab010f74a503d2a3ef729"], - ["15c4851c04437ad35a6a3c7874c5e2ec24ef79aeef911f43523a388a5c0fa29315e0496d63010000000363006318abfd7d6e7aea4f82427d6f35f25191d0bbf045ca04d0dbb2b9f5a9d270bd4408f4e0e3010000000900ab655151ab5251acffffffff0c9fe60c16f51e358ae132f119afb6eb256663feb659488a5d21e2c0139a720d00000000035251524f8ac2b5a3b34a89fd9469d2a6388e9a148fb44e942ccb4897cf897d49cc354d25c31d6702000000070000636552ab535cf6f6ac0128d9000000000000055165ab65536f1093f801456e3a01000000000000000000000000d2624d64e5881abe9ffbb32d987952c31ccf8e8d3e7a886f5222571f730fb7fec301bbbb675215e3fc123b003a78cb42cfe1e708e1fb6e90bc4afff4898035534292a1d53d6e8a2e043954260280a710fc452a58802b0fb42193bc95aa78164f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003a7b5d3e7e9fb1ddf182c44335f3ca6ade70d47ad6273a68f3f4714d85e515863de3ef7ad41b8e068fcaaafed496198b8aa86569f03b37431e1e592d752c3b85c815e4105d96a2732053d9ee8f631dd80ebc36129a2f918bdef1709b024ad0310fed1ef021a5d65c2b5275ca4337a238e6886cdd5314022250835c5c4786a2eb0318c3d6f8fad30d001c41c93f02d30de5cd6c1e7bff349a646729bfc9e1962ad7020fc6501b6c38aa187ad258e68e0d29bf51b3444b05113d4bd1d4d8e6101cac360b03c69d8b73a89fa05eb6ee921bd7acef3cf6adcb69f027adde0df6192910c0af05bbc29a8cdd67adaebb91bfd675858d5bf386c0d7fd7da8931fdd4df12101e4021ab57c973eba01e24f0207bca4f88e28031bf35193af2cc0d9142e7fdc2524ba02266d6cabd9ce4b2b6ecfc25414685cf6bf822e7ac386b005ef8eb4426e458e8b03066e941e8053bd33155a1aa6915b2d3d4dd91817772cbb6ca6b5ac3cd3c8fcff021f16da04bfaf289aa3a2fb998f5742a342153dff341e3edfdd7e95a08f20369c0309daa0265d387ce63da7d1c5d69eb248b5b8d85f69806adfda24f10b5030ec36606012ad9d8e6b557a3018a335118e17126eb978ea617412bc23632ceaf78dbd8536f23d4aadcfceaf447567ee734b1f63ef38bce0500bc5e5d46513ff85e3a170efd88eae3c0a9ef928ebd4584f400db85be8ab36b5fc17d536c8ca39d88e29c2220a2cc6ab10b82017355a6b0123e0214c97c5287c735a02837368c7c59b12e70c26b2b3fa9f6c9dde5bcf064873498c112e965985c09e4f100d8a5b4c188a0b0bc060457c93015db65ce31079e0f76a3cdd10f104b097a49419d21146e0f67798a3af51977587d2a3d41f6d1bc27cb578748cf6e72137ed6435d421125dbf8c6e5c50c689d745dfab2d3cf1fcc10f121764acffa5c44c0299a7317f90af865742647b441a330fdeb2a4b62ef27751660bcda71a8f5f24a3eb207a9e5bd6a282166b8abf232ea10ccc3116d007996077ca9ea597b38df697683e13b3e3fdef019620001cf0ae1192028c0b9d7dfac6b07660700f590d017867b3087b92db1af23dd6f4e3e677d44a5fa174422cde5fc80d1d31e4acdb5011a036ec137e08196278255a6a5c0056d4ceffe60165387abcc73bad6b778842e5baeefa2b67fd2b15a704f2387ed2838b1ab0d5bb1636ddbcab57633fcfceabfb55d5dab9d46fb86476f672a2f8998ca0ede0f1e6cc74670b4b7d77a72344b8faaf04897bbfe32bcaa30f6b7bdf5b01d70b1e5178e59e77adae610fb01c17b54108c84f61ca5483fa9f4918ed06c02850b3c7add334579a333e4491f64e2bda747fb9bc9022d785545caf29fe1087cba29146a41ab2709ec817ad112b315b135686989412598bc526b6b72c21e9a9c54f2a26a5ecb80e0d9da23f7bfa2ce1ce988853d8d852f1119ea782bd0e5856992a842f2e9719787be34a584eec5acf0b9557e80c99153a2999deffe08d9677d907476e6b93859caaf2fa430adbc4032c9491653a625ff4d7fcc40dff10d665d43351b82c2bdca8651ec89eaa2b31c3f4f662210190bdda396de77f4c5a3f642b904af23419ea4a408cb74106063d98e558816a342b97f6f42942428135ce32b604d3b285b4c94b50588b059539594c91c36f14125405fffff2bf58186155a6b1b21c01fa40b29fabfd7bb0d6a9a57dcf734ff7e15c430d01899142b4403e07d771c2d8f9487fa32f8f3c23d13c773a196f09fd29c5cd17f92f6d6ee46df2bf8b6fe061a0706dce46b41d3b9e747d7aeb7ded0f18fad8312971ddc3de5bbaf72945c31210096079149e4f1205437393ca48e3f70e511ed9349f2b17070f3207fbcf444fef8b86f0d170fcbbc21547740e9d5f5727264af9711aea9dae640c1459ae03dbc12b08f44769f79845b40a1d5dcba80807ee7287c6c4fc9cde9e157d5fb3d33917aa1eb76aaf7fbd36766f170e1735edac1122ea677c8c7f384def718f2ace4a47d5fc5e64662f6721cea3acaaf2748d91de39c75def704e70408ba9901a402b182d71c0750384b055a00616d99cfd0d052a80ca8e7aeeb3e25b3889305f0308bf4e8b0dd6cefbcd14291d84dffa17bba29a5275430aaa3178802d89c3741e79e05657d3536340186aaea7940e4d1d768686803cf895e52d6529b91e4752d07d132fb0b76a1a770f6ae2958d69258d6247bc5be00722ac47f559eb205e104a274dfe3d3f14defefb7818860d1ba02f05207f0a6a4fbda568089c1260ae7e1dc32b3a7f462c1de2ee6f4d56a49fb4f4a53f1134b9178eb6f1c1d84f674df1270689888694e458b808162166f2d411d10aa5cad54f24bbadb2310d7781257e5dc26b3b630e28951f0ed06bbf2ab653efee09f92e3d8d3f5f18e15b2ac367b6908ffcfd26ca53160b", "53636365", 2, 382546450, "2500c389fdf94c6e14cc923a814dabad91f376a7a873c3a582ddfb937b62e3d6"], - ["bb91b9b20477dbee99867eafc7abbb386bdddf91912c825f1311e0cd33beca05980c9b49cf000000000552acab00003a7c30089f984d91136e6fa9432c419f14bdd247f61e4254f271d14bab8af1e3045befc9020000000565520063acffffffffc16905ae3cd2a5ce04d7812eae0011b894454ff305aa4bb6fc01f836af56ff980200000003635251ffffffff0d180123afa9277243dbd83e04260dbf2ab3497ba8583b4521b58ca4754241630200000000fbdb89160411bb5405000000000452ab5300524cf305000000000551abac6565f4110704000000000551ac6300ac376d4d0200000000090065ab6a006a5300ac00000000", "0000000052", 3, -56704158, "25cf50fd167c1231fd14d9befd5b7a4b40deff5cd14307432e1f97bf8bcf9318"], - ["7e241b7004ddd45969be779fbdfbfc15eabba52b197d4beac4cd8eff78e0700f0ac9ac09d201000000096aac00ac5353ac6351413df6454fca70a5d3cdbd0139c3d6b0bc13da23651668aa358ebb68fbcad3bb3f542a0700000000095100006aacac005200934e410c757db808288d17385103be9cb0656e9f5dc7b79130e0f559d4824aaca27254f800000000056aacacacacffffffffbc2dabc86ecd1ead0cf22d5378e1887fe4e6849dfc3e118c7a9bde1723dc41880300000006510063655365ffffffff031525dd020000000005acacab52637f0cfd0200000000066565656a5152cef59a020000000009ab6a6a5352006a52ab21ffc2740314feb005000000000000000000000000029e8a5c965af746669a8ccbb6f3bbdd8e40ab1af9179561e3838f9f2c53ed21dac86625278efb2ba834daa4bf65e582d08f460a7d219b7e400a3312a9ea3bb74320eaa8994b5653c64962589501723bf04435da5e3b569f79cc7822e871091400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dcebc4a949ceb144bc2207f3129a5d4f653f70d3046a6679acd23f3d22083b8d220104f89e30b846e234bbfab12bc536885a127697c62809199daff840dcfafce10e14d91b7b041d9828e11d92af5fcc1707d6b3729b8742bfde7801336f8ccdfd78a76ec0c57c517eb8aa63c4eea5ff5eeeb24f8232e1acae2891084d881f2f0206ea7464776b73e57e5ef5669582cb2ecd8bd7d50294c4a6bbc28e2115f3df8f03014920783adc89037448d61f8131a9cfa40d0442fba7b1bd2bd3e9fde1dfe2d60b0ee96380ce132ed43bbf3b2dc81cf69d456b26032d2e1a1e3ed125f49bb5cf6f0c17b3ab4fff901c0efc9b88cd3472a28eb8ce90cce69ec080147f02c5e04ae90202f1b836ca39cbe1acafaac80d4ad6b33c3287c698750dc5f0bb47e1d14ea2aa02052237546eba5bd7bd93c24ee5da333f5731341f57392d176146f0a91474dc93032c750477324d7b650a5bfc6a5d96962c3674c08fccda87b7ae235618762c52c4031341f0c5f7c1186faaf87bdd2237d84db109f943a4dcc55c4c9d8c66e3ded25d0324353ee08093bcf78fc2b8929c7d61337c853cccef3def5cbc3dee5891154fbe2c9dd96a4639561a9a944bd4f4824af457f37b1d97fdf7c869e71eaff1d41d09305b2795af276b05ca3ae7974a0ac9ad82d88886468d978b44950b0e8ab006716887513287ecc8447693a3f3c71935a845e53623efddbff39e1d8d0ed3b387b6f2dbb65ea6d83d9e60200ac574417f38aac38fc1d7ac1bf87dec292a0f70397bd1284d0d1913ccc2a23438a6d86f5c558c5d443254a0905a76cc6fb393bf0415238b511e0b5bd70cbca0c6d2ee2711a23665b0e626ef9614cf2e20cc2e1201f0347085fde046d428062c5a1225966e570c449cbc70219ecd258cc1e798c712b4bdb81309bcfe52596139838d33e7cfdb42386e9e5c5b2218a8bd9eaf168437cd732a54c2eaf0878d66f790b6e7b1564777b035a4962c939e1137d62bfbef10f6ee24a3cec39437d46eb52152af986afe8ed3b2bbc463306c1fd97fdd9f897a4559bd3f98d46272276baa85ae1df9411b79b9472bc9e4db84e56f0f042c6c131af37039c01f71b3b8aa47b0789ee89d9ceecf8d183d249ee29c46b9e44743c3811885c93b23bb1454e380b58788f46431dd5032a7b14d801348c2aca81ac7f6171733841cb6e9b139025056492472577014b8a0b79378b82bd09b430088dd863c6ab71169b58f72259a42e61bdf8bc08188fe8bedab20f60f639f43ad62313e3499122689b54886425a343726cd2590a5ee62d52e6cc066c949088a84a6cce6ec440e03ad06f0949e99986d228dd3ba39455d81ef3f7172d0f457dbe92c5083d5118417d781b120aa35a7f77033938308d1a7c199fc1487a9411e5b1d9e2ff1b78471ffd853f9be8d19a0b0ca2eaffa76e94d2db2eaade5cc9f3f5480cc4fb0bd9f80023a6a9949e0bd8d242f2052c9cab05b784e73242d7ac9e88ff15430c7290bf2dcc15ac09f58f6830035e6d11b8a6531ec97ebde2eb4034e57a5f4cc3f9ef1112260494750920e1a6ff1495da21b9a47516463bf84525e104c78420825037e143638a0b2031dde026b5a92904d0c59c0cf61439e3c808992fd9c6afd1190cd4a7621807929b2c555cb0f63713a4fd1bbacfab1a9a4a210d668a92a461dd6b22d7a285c34918f837d9a5b6248ed2c4d938e456d1a8f47e1b6a9a10ecb50d67d51e4f86e5119dd18c08ec34234b60fe848dca1aa200beba03418a2a7d9e23dd5626a0ce33180562cb9a872e3ecd39cf21bec34167385826a911027d914d11a53a26b90dc18e0ac014f52091d436436fe012e2f34b0e937c04c962c80cdc1ed88b183d876e10e35e5500a3043a59fda68e5394330908dbef26515b80ae711146994df8f6b33836ba44829279ccb3ef8ae3c5199e971340302aa67a76964d6c3899fa09ab179a032b8cc4a9ce4b135d1dbde1f6380afa4f5be7f949fde638eb48f680438333eb04f8b55ea69eb575e6819adb84328d3bb3757e4e94dae3516d8b9ce457bcbbbd28265117a7a79bea82e268c651df22d7744fe76e7da14d49c1f2477652724166b3db451f52554aec1245f6dad06b5320b9af287207e4a2d503857b7c0fe62541790a3664790e1826e2fbadf0a88d7c41aef347fc96248c924e4482ecdd64b2dba3015e166d183050c79aebaf7a43add5daed42473e69d675d07f644895b63260619db4dea7003a2c12f38827b181f30628254b94b59887756de03e3f188a6e3b5db249d90df5fa7b03106ff5e308d0500000000000000000000000081ac3cb29b94dde9452e1a25caa9de17c04e9fc751d8ced86c601bbfc4ffb44570c22a6179ea7baa3bb47e7be898b5858245025e58e081d956c9c661875bddbba2abeadb4e57d93163c3567a0de7114487e146ecf262b896b998fcf0d523693a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007adc2ecca302d8f52ae021cbed6f0470bcd68c29a79e1f20642b5ffa7040448fc7e8e63cea84df67a417451d3cfb1a025aa877d47e7fba661f8cb70aa67cf1716da3f65d35fda909d2e09c018a5eda4f0094820a6c29fa1399ae50827b11aa2e142a68184b38416447aab7c8eb2048c615bf4390e390efc05bf15a95b545f66c021de4bb81034cf0b4ab292fbdcdad6444b6b7cf2278d3f07b6e2a88d0555bfa210207e675dc610b680ffb911b7be7e48c7e4bbc1596759d5f831aca4a040caaa65f0a1ac24cd7806fc9290d99553deeadcc21753555c644b63b682cc36fda5bbc5f690a2403b8c0df8835b2f8df6768ce46b90c43876fdf3871dbc51878f72cae608b02124b75b93b197e9ad8c22b637a222878fe9c85333b2fd0847cb8806d9ca86b9802167e173ce84eb215a713001a7d04743e3bef23c0fc8a5429e77daedd5ff83f99020050a8327bab6fab26b03de06f5c9f7a9c489f6b925b1060db630916f524dd2e02000654fe4791265026d045fc91cfb3a796ad27876c6d031185edc1365921d4bf022e8ad88212b92d213ffa58d6443020e55090efdf95a88b7a2657521d8c8bc50e3b6874c9bdfbaba962f85965913c7a4da9a004056f6458bd80457c1fe00918c94a307805770df8b0c503a3d65683ae0c8b8ca0d37a54ab8e26f98f76c137878879ac7179621a84354d4a950c6bb08ade766779919e2e16e11c28c71d714450c9c93d886b19ae7fad9775351a6d173af242b87c0b587def8766e82b96ce16a72ae88a2b783306a740ca6d58b9cfc1a46df6eca672cf545a4ec8dc0cb4be5bff91c3e5bf61c485e1d4241095cc74f1baaaa41cde9adf10a7957b9f27362d8f1df6430a478c65fa8a5f61ed34bad83c7028305e40e5d208d379186c6fe90fcae9d497829b5c078893ddd49619f2fb8eaaa48c1bade05fbafc050a00b678a802197e43eca6c4980b900d72da697006ff34289e79e2b771cd24488e9e74935acf4f3451b43c84f5efc35292cd5fc8eab83693d09a1bf2590b2979fee8bb006a17f1a209f4fe99ba2d953389118d262bc7fddefbc6736a8843718f362b5cb4bb733ca1fea2a56d5df376c80403995ee2b3593682c566e3084ebffa8649d68b33254faeb7d979c902b91bec3008ed3563d6b5b4ba2197d7c1f39f94a54a2b7ad34833ef0b85894472e1da3c13f5802c1321c5da69a63deca16bf0bd625f66c9a935412c6af313c9a7442e70052f260e038a0d9650567acf3cafd2a226abfaf76ba49585d8aa189c380ae3dee67d72dd43d62441b26d08f444b0a4445887a0f4c3e6360483cdfbd9a3d4cc2001c81d74ea396103ec22c7f16657d889c156c5bed4bf844b3eef6f2a843072c758f64be72e9b9c9180dae87883c79290a5d26fd271d69c1d4b133d5f39bb754b2af4741aafe09e999a7ae2c6c206ab5447b196dda8cadb9b7d2f7eb06e476d7622c8accd43be28d33a20fa77dab28bc9403cba376c6f7fcddc4bb656563bdc3bf64934935ed7d925a7725661293865f7df7bd09c7346654c2714e2468d89d4510a5a7d7cacdec445880e0c03a83917a64d6adc766f4144d1ec47e95534693e9d50b9ce302975cc6a54fbd28a026e3a355cfc3c0cb626d57ed5244fe3434b71f08d3475ed295bace0b8ce73e8f1f47ba6ae7a545d4f16c0ec289597618a096207d63b3adb68728ffc7e503c7bb785a0fc7ced68aa1d34a58ee495ba9be655b5dea6cce045a26caf2a7cec703ccd5ca170e9fb736ff4b4811c03877d90fecb44dfc7d68d5a6e989a1c0c03caeccfc80afda46a25ce6252bfc7f0827b275d7d3b45b53116c2fc9e93ff898c77323731ed0c6e2543de1473175a501e658fda7c801e6306cb5b7856845453bd43b698c217e4e2150be3e1de7335609d11c1477591c37b3b2fe80f5b41123a5500bc7f183fe96e150d04e8654b7b6fdc4e7904156d4fd12f61e54ebef5f1fbb61e58ac2c89a4f55f9f743b3337fc43dedbab699ba418346769d60b3ad9e5989d23aa92d40870ff781d0bba2c868599f1a2079f3ae2dfd761bca7fef65effc6a780d624eb25db3936c4f740bfd6d27e2ef5aa2d4a3eaa59a5c7fe24cfdcf5d8993b689445dff86db9e7a6d3cfffc363411a867ffd57adc776e42cac589932757f6d4db90f1428557437fd9697a5d0b4fefbcbb98820b242a689e5adaae10ad99e0f6dc27659b82e2ad69dd10a844bb6a34a3e32c49b9a336674725ff9385983668e6d59ea34469ac8e5c3bc33378d20042580e022a50a7b3082fbbe43e17eaded73701e02000000000000000000000000ca8a2ffa00f5098fb1f1351f3977ad2ff3dd2c2ad32785f6d829eeeadef4d936112dc2a3c6ca6cae07bd206c54b82c79c4b3ccc6193a245dd060a389198dec1f2ea6db1b475db8a9248c313d1d964f79d1d29afbc2e8eb013b4cc8fe0fe496cf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fcac7fa49fc34c7eb7275e7bac7d7c74064de784826e413ffbb6c5c045b28a992fc252dcd14f242c3dec56c16addff19e0db8d8942ac8fa70f390f44568282067a5e6269a227f61c0fd9ad185a8ea537dfbfe7949251be78bbfd92fbed9a9c0514142d8224a491afcdf3e931b8f3bdb1d02529076e96ec08dab6354def0b2080222756d600f13baccb593d57079fd241bb1bc6cee4005075da70eae357fa3be1e030ce583b1a76376d0ffc1c656b56f582af9cc7c9a75554e27fd458589fdf4be030b09ed4cc4cf97fc84517f40f735485896cd41ae89cd61a5fee3123574f835185e0dfd2ebf9a0aabf440e85493ec64666903c09461933c78137816918b6d133220022b2bb35f8dca3fa547c70a39abedd1a22977b2a4448011efbba04276e63d57280308547f72a8e4ca8ef2843c05514507e982eea7565e80991978b60d3df57392a30300e87b0d74619605f03f62743ea723a9397fd28c043fb798f541599b92a9153f0314f39027db745e3fb7063da8904a74d24e561e882e464b0dd20f990912365eee0212016bd95f7352fcf2c6e117e2742c992f07879b63e8cd5d579aecdf4d004e8306170ef47950e0394df0b4f77e16970275dfcb3f78e53f63e3315611163ed874a6dfd3ef688ab985a53d569cea26b89a62774dd8c5c52e2c2c2fbddd04b683dd30091e7c3f0560ba66de10d8780e35230c9560b32343a111dfd6c52c74fa9e70c007ba0d3d7d76960428748105aad11a5c18c376383ec7148a3e70b12cfa50a6c960c89fb7000e6f22d11083a47427c23eda5f7098b4bb041a9c7ca4ec63897270d8804ac27803fc584ad1ea535192f925dae90ecd97b21465f92dd482576492222c63bd47402a7dca1313a6aa3579a4cad1079b0000e2489e1ede1fbbf1a1294600836b60ca080d28964f0c857c8973e9625a40eef2063d2f0621b1cbc385c0aab8fb6ad780d0afd01e61b603163778fe75e15eac12d0805f9fcdfdccae2d641f3e65def4a8a9f5309d5bf10c4ab9580599a524590dfae5cc396a1556ba2835727541b083b06c6523faa3aa57528b81bbfbd0ef588cbc502123f396accce66a4a6ad86886eb9fe2cef12cf7853c668e1befb46e9514bd0205d49b6a248fac6755b51a320beef815797eb4927ca03df907eaf7b4534e3184792092ad18a1de61a99dc912ae442c19ce062688edf4d006dd03518f0cd13d8b898537ca78b2a6ef3599c166c6e49e639f2c684430a599f28edc096fdd1018c694558b2e5db12266f47c3882dcbe8712b1ee9a5d4680fbcf102dea1dbfba912a55c1da85aec6b9cdda321a293e01b7f7db858370f979e96cafd6fc4a9444b11c3b3cfeab8e30b9d8de06fb3b2b9865c1358c93c82070d29bd1dee1e13ea70300728b7bf739f82693877de75ee6893ef170cda65c88618678de985a9d15af7e2a31d2974dca46a0c6fa36c0a5579efbf2e514d9713e5c46e6635f3134f6ecd5c3bca9cc230c1caaae02e7d1536287887b546c1522d51c16f5645a6dd74a73b3b5b8fed47cb4dbbd182f1fc20a5fcd342a299779dde5c82fd2a4c33a6ad78917f2e1e9772233735cb27773568adea50b1caaee0b34327d08fa61cd5f90fc9792a1fb0fb7a827573c21fa674343b32f281c9067750479b58a80e1d878448883009b33b723a7930031bda87d680ed3c7ad49726cb0bb47e597ba358f99ac87fb4f231c8587ffe7c2a0f014aa0b7074b99bbf8dd8ccddebd3c352891515215e6c7b97e4720f98369d7371959dd23f25eb4cad950091f6f2bb1fa71041a2947d661bbf2f7024ca16c056c6f2f297f8eaadcae3fa7e2f0ba3c1211aa6476ca09f609464566784624f1a9848ec20ed32bd107eb87872c9dcf96a8778bb65649794bd795ef5dca040a46df7ad98663db173735369cd55dd9f3d6418b4598cdeafc07581db4160bea033af55b7d33231c3b8146917f8d6ac2124652dea405ec3e75cca5341d9d99b9f49ce28efda6bfc3e071a78b73a11e9a0a33cfb7e6d7e02e86dc72a104fb398ec4d6588f57138987b73d5f1727acb5d906a8eebc24bd0be39f5262ea8be0c646625b706b8be502f6543937ec816c152e260405b3deaefeac746a631f4db4e25a7ebf0216f0b4474bb16d83494f723876b2c417fc71804ca3ca2b1c7f1333322aeca4456c59738fa057855d7a2ea5ed2fec33f9c3e989f2ad5d68ab3536f9d154682e776d5c6c916da0601588fc681c37a848b126883572d15d7c4c9bfb44a9ad43951c0c01620286eb89716e75dfa3ba878f72efb2a42d376f61906bd9ef23a48353da5c611f6fb6dd885a5c8239381bacaee8afe555227fedee62cf336d42620a291e74aecc0ed4f2afca1ffc54e5c6a109a835fb7f59b5d93fa6092e2e95fdd8e11f404f8efdf76646095e1b83ef5d35f1ee80d120c", "635263515152", 2, 1521598844, "63f17a162b529a91227a7d5495fecebc3d0ab437462eb4a8bb8820797220c8af"], - ["1426f2f30135d87812317afe89df6eddfd56795680dce37192b4df7460001a5822a11903aa0300000000ffffffff02192681050000000000e1bad90500000000056aab516551b005ed06", "acacac6a65516a65", 0, 176944165, "ce3be5f02499dccd44fa367ae3ccb075c2e958351f61ad9f7cc6d86e8b2d3d21"], - ["b01ab05c038ab68e6776c73e9de8ad9cc51cf6ef93ef47fcec2098f202676d2c96b71970e7030000000700655200acabab02e25fc6add75d2b7f7c2430db84a53e5d3121d805c9a13e7037a5e42c63fecb2d6634b101000000016affffffff9bb6ff47d0b5c7b2c370ff5dcab03328a225eceb3589e1ac6aa55e506e7683320100000004516551abffffffff0492c4db000000000005655353636af49470000000000007656a520051006a82436e05000000000653ac63ac635315387f01000000000351515285beb87e00", "635353526a52ac", 1, 1746047635, "cc3c7ef736f9ccc3fc6c6a2376217e75621d68c7e5f8a5f0ae7ecd2db692a291"], - ["0baba3b00365ea480b3e62d6fb80fc9ceec16020a907f0bda1974f10d6efa2dc4f6c2a6a2302000000080065525100ac5253ffffffff59ea0f0dde3aeb915e95cedde060f3a080daa4ed45f52638527a9d6eb02523df0100000000ffffffff3ddd9d57929e43ad0bdf8dc4c110144bc9e61be071314de4390f88f8fafc7ef50000000008655100ac65510000ffffffff04cd1e5e000000000006ac6a656a526563b0e702000000000865630000ab6500512ff1a00100000000086a6a516a52acac001ae4e6010000000007656352ab53ab6500000000", "ac5153ac52535200", 2, 805302827, "3e0d21e1c255fb5827183b669946fd786aa206a66101f8e86f2ec762ea9c833d"], - ["a3f0c44d032974b876a5484ffec7a600089c32847471911008e7a2a092138300f9f701afac0300000002ac65ffffffffd7cd6252f3424b9221e1b7daf14e153301460b3ae0b6da5f2b5410b596eb919e0300000004650063abffffffff67bdbebb64d2dae02fa1837342d3c7daaa20b8bcdcdd64a0fa5117785196b19603000000085100536a5251656343ec53e1049dc23e00000000000100020ce6020000000005636352526a10a6f6040000000009ab00516363abac63abd76dd0000000000006526a005200ac0000000003000000000000000006eae60500000000c35d50a1dbf8d0ea78b3002a39164408de2c40782a41b4be06d67eef33f401a750ecbb38a349c9f3bf890fdc661deb496be431b015a0e43276a9487976403c1d4e60cf1c29001b4d53fcf110f11fd1f575aeb20388d66710bbd5548b4a230fb3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005d5c7a3686214b61536a735e3ae319f732d5756dc9330b594bd0d4ca05e852490bd79ee8dd6a02edaa642e894eb8fed920520e9d62544c8e59c15184b14794b1cfffdd9cd356f8f510c4a0d06361758932c160e2365fb7d300819bc31fc857d8bc5f2e7942c8b01d4ee869acb81cff8b5c1c03648e89655265c706bd038d1226022285ac367597d10941b3c6cc75a2204a8ccef09eabc4ed848a061595ab580d1d03176c83a1738ab7acc47cda819dea0bcda82d677505ebe0d35852fdf201db1e3e0a25c7b609efc7db6b6fb7e6d70b228ba974fb5ecd0ae1d2aff38fc0475846d34c11d2f540622258bed6180843fde407db07aea2292713df0bd155b050cf1300f2030a9f20fda0889b4aeb8ab60654be996a5de769e59a72033c40890d1c012437430206266258510d889da1cf7e37534f6281aacbec1677040061551471eaffdf80f60201c698f9fa9dd6cbfec167c60bb54f3a4ef9f02a822d68c9dcfa78a66320d53003110ea432c9c269d4f316f027d9fede1aa1da9e9e78a6bda4a7466b9b84044fab0212b5dcc0e8b1632900d334d8a91b0539a7b4b9d2415c4c30cf37417f423753a34a61116bbd2d2c505f83d725525ee5e1d9c61935329074505579d5093ae241b34bc49fc9defb02f079e184d9d9b27e53fc08dffda79bb089b8d9ebae88a068d287209e8667e4e5d5c112e9bdd2b53d00ca7bf22493e89f2023d46897f66b88a03d7bfd6cb47f4a88e2d6e3fba93c52d92158c6a736adcde1f5dc851ee1c43784309fac45771ab715f771688f7ed5baf93e1e7137f51490ba61c90b713d5e09b0db92ec02375660f06c921cb3d0bbeb67ec3f63c659f2fa278adfd874d3db7b21f800235af687e8e64890baab73c09be3891c71c12efeb1fb9cc7f2c470cf245df4db2c3eed7d8c1c4d0a8baa84916eebc21f1b27c439507d96e45f9591071737418f3b25fa2648286426fb1dd3645f7ca15c3c38170ba6ef26e4b0686c55b7b964fb02958c58abb07e895be6ac7b0d33dd208180066bbd4d4518a2a097c781578c1a6bb0f1b818312e07f4c8ffb077ce3a608c476a1b8a8945ad61bf5e76b9fe54eb09d5b701afd32eccbcc7e2fd32d744de21b8d8cbe3e34c4950df85b1a1567c170297b5f2210255d21c4a892dfb123eb565635870894781376a19e097f18069e24356eac6bd7519c3115bc72ab6e37e67f431d1796e9aec2db1a7a0db1e207804ceb204259f488c23b1c6e759d6773de99a73660828a41b8ab661c7e4dcaaf14909050c51e53e6d9264803fe1bf5dcb571cc318b6d1b8e5ab4756da60810977cb3d773407d5230c710257c390f89b53d42d3509fc23eb6889c03f09883d84b2582c364b46eee43d275c5dc2cd28fdea71b1bb9499633b9cb288cede902402cc82be41942c799517a52d061242d9cb6cd94cd472458fada2f7d7a6893d508fa90030155d9385f97d5654cdf093ddd43011e6296136cc27443002371d1a623c0c6ea471bfd72502ea4a58bca895c52a1547495ba9591f9329b1feffb89f7d7cb2bfaea47c38a27b03b888f5ac4fb3999fe1fba8e193d4dda49a94c601af0f68c7a54ccb9a3fd555b97fb7e5f8e9933363a353069bf89ce0beecdd467d00988038466f904aa50536a05a9124e3a4f2b522d8e5dbd0ae8e17a9a96ec55acdc9dbaf8d26ec19d25446fb8426737a4546c0783f074b0a5081d00e11d41b36fb456092ffebc90dfcafe530ea2b45a7cf3f3fa02a73b92bb9ef547c8f473554fb72ff3af43ca010eff18a3103aff9071e93b6f1f8d57c7fcb43a972a22e4ffc39c7524c29bcb6aba0e58693eb647098bcf5089fed1eb68256f5d6e99aa056597fff3e34211d1069990080da81b82e83a8fa65751bf62be909afe2df4a2ca1b9c7790e8c6174433b290f6ed87d242592992b14e154e1f00f70b2ee542c0b729d71f96e59f1c291f2e200d6659f484159f2375b4b8d5c0da767ebbaebbbd4480616e9128e9bf78b3cf32c4b089f1f58466b48487c6ba3fbd50db344535ff5579e543a01b85eaef12541959b0f0884569739ea0b5fe2e8969144155e74228c99c94dac086415e816bcb447b9ff90e78877470714ebfaab1b33aeb1eb0e4c219d3ae310fe05e7aa845573cf9e9789129418369ba8fb0abf93f9b1a809b3723c1f16f2dc9120e97a79c1446930afbe35ec61c78094ce08ddc6ae026e02936ae8fcecc65ed67008f1bf15f94153ac48f97f0939c74b1a4863a20f64f6f68f1b1b3761b6fe9abec5a3fe3981d7071b5b283f8496c29ade56000000000000000090f59b00000000006f912d02e809f35b6374eed8179e7107cd0db095e1221634eebcd0636f2b57b2f65936a4cfafa6b48f31d6a37eac6af49e147d51825fa541457caa9962f3c587e31872bca14d0a8354be6017725878e28392b950d90789389b8de1948374f4670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000062b5776ed34909d6e222f3b45053d6fcfea2dc32b01028e578164a11127d20fb546883c4b77a13e454ec3d6970ab9bc004ffda47446aaba8ed1fa86890d80e7baba6dd368e6afa10cd0e90e310c0905c6c6279ec938725d753d704066d542fc7af9e1c0057c0782c89da6ac1a6f869056569fc77f666e1fa343be5255389c00c0310d4277f937b1be2cc8e3a865d03ba8da36a9fdabda51b9f8e168d4a9ffd2fb403152e0499e58ca8ca7b02c323a87baceff9c28cc98402ad6d16dbccc7c31344810b2366e9695b3104e70a92ba579caef31ec084bda848198a8d2033967f9d81857e18899e00b8d154abedfeebad0d1e8b524fd26822ad55ea285495756da1942625032221f4f9587e8bb182d861781215d55d4e2bf7504e8d76fffd258a6bad39abc30312d8101f01484477f9163d8f2cec0c871f7b124cf32aec1bfdf738a9f9be8b5003114d614f04bc0695f0ab265f2433a49d939aa28eacd936b0e50db7a4d7f96c81021630e10f5bd75520625b27ea1f1410b1d62a5182846839525d0443a2128048b903219e058f22321f63e63874a332f8f411ad2a5fb75d14a03311f94041a8d1c9cbfe83fa04134b03cc5920f8a0914dca283cb9959f68c56526a7794a877d5d4438fe6c543d1a507b3fd19029fc683bf1ba61b6fde978ef18726f760368ddb454487fa4e8539ce7c6b6013657112d70a05675039310d7de249f9bb6ffadfcaee24452dc068f8b8615ee5440e625c2989892c2ea467066a6c9edfc6e0a94a66ecca3938fddc97555a23ab342f4a593ed295e1c3f71386eda66c95653b92fa780f9b7af4c5f5b189e2f9830815b045a11199a6961a39806cf71a409a7bf65b2223318cc76383a9fad0d171b21bef099b2d6aa78af24ad33e83d0cc47307abfc91a235e79161da3062977f61415ddd7b8d560f3c39c5cfa4b59f40b2b842f2d3ce7ad9532e4016293ca6d9524bf3fd04eedc02eb953aabc8224c6b7e41ce05a05683f19fb7b6cf912c3ae20e2a2d268607f43c69db9fe3ca3be731a97f558db80b973a787c9b575372bd8e42772367c72e6c587443cf22e7979f8c16ba31e27befcb2bdf3165f12fd227297805d4353de12f2fb8203cfe248718ae15a2b10e62b30c433ed9e2b88feba77fab0bc1ce548eb10326def1b6874340caa51a887e4b35e8c1937e8e9e12d3fb9c98804827927b4c0b22a801ae22c84048a2974cdabd9f886b798d34d1a2d6aef6ec4eaecff15374b936e9c42615ed6aa247f09835b891d3eea838deaced79a7a94453891c0262956842d5731edc9f1b44d5000ed5834cf3dfa7f8608f4cf897fc96361bcf3eb2b8b16f6d52ea0ee5b3a2bf7e34e58ad658f7f5967d710e8dffcb86476bec4cd9a9eb7c5d6427396d3f2274cdc4b55bd52fb22b26cdd5e8f711a8413c68a1dcd526c350b8b87427dcf8220760322ec42661ebf5be74a5d3a8cea81d351c4200b49de1ddc4dcc0437961f489b48ad9dba5ffb23330b9f5cc52a514b1fcf567a4eebc386f5fc6c112ec8d4abcf7121d20da07c047226dd0c96c07a613e11d9f000dcee6f45b59679c33c3efb21edc85e00ad0316e3666e6b47f75b16bc3066721327f707992133c692ab7ee0d75e28ff8488b22d11817d943bc8aec59333efd71dfbef3f47580b2086dc7c15cde8750d2227582f865b059c51c9b497e1dea6611fa676074d2f24eae523069e19c76408225dbd4f845a80ee408daafebdd8fdb74a9bd71f5d6895f9b30daa45492b536618b6d35ffcb3fc8dcb58451dedd04e755f7a77daf458f33fbd6895a253bab7d1adf4c34ff04cc5f288ff46e80711bb3a693411064bab61db7ce06c868728ad07828293de5bf54971cb45b14a8feee5c3e8730257a477d1b72dfcd9f19b9e1fd6910209a7dcfb27526f013c7e24d05a13db8e457dbc34f8f69b5989a59e0fed4625ad2ca396b7b17b574989b3c2831e7fcba1c8416f3d70fbd443e4ed784bae456de96894833e19fd7ebb7645d08ded5ea0b890667ca365ac0d6dc2fa077552669b73ba32d857fb31c3aaf572361de207ad288dc47890184d9d9177faa6e78b565437363148b4c24b921f0d261b51502028361899d2ef38d38348420b38d2a9a43ea10b06211b4c9ec3bfa8a850198216ff1fbb164625770a5499e10e414f0b129efd30f31852fd17f394f14572a9e16a597a03266333dcb5f6b65998ab941d5c5bee3c42f08cda26a6cd18370bcefe0a2eb88d9301f3207cd164e647f4999649a15c1e1b615978ea3d0f0ebb5e544d3165e99a98f3829e2d20200000000000000000000000034df100919f61700b17b228533e590ca9767096d169d10817a230ac12907622ca544af6b980d60d0359d611673d3f1ba9529ce89f540896140b6bcffd6d245a96a0aa99ca3eed3b76d57852190e9ddd32ed2fcc03525e7d06d5b73f57c297fe4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004b48f1deba0511c13112e53974a0c2aeb74034a25d942bc94d7f50d2f1e1976f432a12b65490fff3a549a1d6bafb49a44b3fb139b53c736a83ad044b31d66edab01304158f444a878395422fc45ffaf9f1d7eeb2f9032207ed2fa356dee646706d062c31c56dde517b9ae4c545b9a489c53d6260dbdc519e20283933777ae9090317de306b8e4fdb06d5a0f7ed16e61863346849023f930ae242ee4dd3e4ef1ec80309afbf0c6a70fdf8772c7bd5c282805cc519a6d7d02d024186d8abeb2a93bab20a11a9721b9470c0065367af9bc8421f9814035d1842bc8471842cf47d645021570a18a57ada7dde903a172649a707c391487fdc93676f24f1b339c02fd7fc5fe40221ea0deda6470a48f25c9da023033d06e571ec77bdc1622306eb96df4cf9a884022db81739af9ef821d2e45466a4e1577e398378195f0fc9d7593daf3a1db77772030b29215d6675d626075371b00d0732b6563309390cc0724b569ccd2bd54a5e54022385e9f4af202d08c361534ee20e39c215614e2dd28bbd7aaa8ce832a1691f1803129e478707f72e107a6dbdbca3b9941175d0b1d0c0687170630257bb59c080fe7983859d360627be9ff00279606c5c1e553d487ad35f6823e8838df88f72ede470db03cdbd3825b8777a94fe1c7ecaef15f8ad2c9c8e6735fb43d5f783a6b362b11388a05373bab035b02a458809ab42859756ce1af212d2081e328204971191374f121f9e668ed1d9094a6462c5d3cf864d9b1a223f9c6d696c8f0c37246d670605a7b1683494a02213c9515d80b7f78da883b1ee27e041e7c1c95a8d69fd3d0d1a9f1c603f3f454cfe8cc4cd1b1a26049c8a3ed98b418c968a4777005c7c5ec50c533951d5651bb0e412b4bc7b34adfcc7a854c041e9c2515dec8b13bd6e2ee2a5de2f4df9213aa64683c86c3e931163402856b54a5f3c560e522d466fa798d735fb80489f2ef9c6191ab54423d06b2b905b0b7e3b13af9b83265a9a23e844484059af55716f24588191376c664634e718c4b7f8ead80216243e09783907e35b7b27b7ddefeef3b10ce309896665ed0e7669069bbc5cee661ef0ee60eee9545396e5ce27b87c942c9a01d028d684bc492289af6d1f0a7252ca96731a15ffbc3f1825bc864eb37123044e3cd1bf4f91dba9583f53d5d2d3d586b45c884c35a40edc855d58331882aa11812e0420868ef86e607f1aeba180342c30d38b136b69eae915612279cc22f8e48ffd81d57c013e35dfec5b39c7a0d2730d77b4593aebb21bffaf53313b93663da7cdf12a52f586bf489df4c2e1fe2c178b035a25017f4b85c998c57849aaa2b05f5f299f1ea6693769b255eb1a433e3eeacc6374c0279dbef68ef28ba6af70f32e2d6c8bcbff7991dee116393dc4aeaffbfaac02091ff659bd24bdb129c86d3cb14ee4c263ad585b6c0b670dca0a1e3e40c560161f9571cc136d2a94e77b432f4f8e0cbb8dc1fd2cca0b26b970a56d30dfc6852d03d5472e75bd718d346fe3b30d6b85066ebc8de3b77077687f9cc81a211fd11b27095f8e0627fd6143ce1fb8c8595cc1bdbe217a2969b0c3601152dc6213c0108fb8ebdfd9dec2d8803cbe70ee78f59d7c8b9aea03b98e86f0fd630e348589f151f9e08e1151a8be249e01dcf4094fe5c5e6d81ce3b643f9a79661c1873ec81830273f37e1ab5ac2e521987385e529861ceb74bee5da581cab9215edaeb920c6515dbb048052f087794b229fe664e657af336bb948c006329bb78ef4da135d9f353cd3df1a6a02b5ff906197cc3f548bbeaecb3fc6d81744cd0a0ea096434461d8cb248677ce3c5981a4fcc3ed75ff2bd411607d099844b397776924d1c8419f7fc4307c19fc5154db427deee3c636b6ba69a71fd3e222a6a04c0e44b10ba2ad165c6c6e9171aa80e08537714ccb9b1f4af1522d0d5307e52470c828dc3eba9897ffd1b8250b9dbd4d4c69a9a1cf4e9cfc9ec606e187e6ed680724da200ceacd323d37e317bfaa0dad7809977a3e07a7adeeeca73bc70efab8f7965612b398082ab17c5b675e4453fa23f31766a1c41ba064c47b9d57a38aac4927f44493659057559acf6ae501619bd6b3a41ccdf7d5c7b6b2603b2802e85d42344531033ab7cb3935638708d960770164fa35f8c5c42191ef94a9ae70a8c63cd3c2579712590a733956f6abd357b6d05571bd2c50ff4b509996d979ec36cf21f7990798ef26c1ff2bf837114bd33137bae17300ae6880e19041ca60b0c7076ee62511b718705b9e3e15bef39da9f698e43ebeaae708196930827557fe9a708a31ba1fef54d43fa96079a4331fc36855b7c577e2db2a06681dd7fd54fbc1b945faef66956ecfa47872663795732ea5ddedb87bcab47030f2ff8972c89f8ef491f0f72f0d5237924a631bc9f9b1d16554938b88d543130f3c4f04", "5353656365526300", 1, 388989590, "de7c96f96bd2b012b875e94b591e4954b2513a5b487f239593309ad900f46f6f"], - ["b470bf9a02cdc44a4087d4fb99faeb75d218ac4da2b25fe640cefc49425f9c6c2c2d1f1720020000000352ab65ffffffff91b544692c82af03892e3676815a0452460fcf7c9377375d77124a06240044db0300000003006a52253b6ece0487cd8700000000000451535152be99e9050000000001ac61821e0200000000065251636351ab60068f0500000000096365ac5365526553ab00000000", "6a", 1, 478489352, "da1fcd43785e9af672c9b2e8ecd128b83d55473f66e198c9e79fa4d438e29576"], - ["4b7e7e0403eec4433aee67a9a35307520b0de2c41721a05c1d2106256b8db7ece933defae80200000004526aac51bcec317615dc4c0f95d9ab6c3fefdeb4600f5ec5cead6fae24fd062c281dbbfb4167dbf0000000000165ffffffff78b4d346033a26442cd919da0b08b9eafd2a5c2aedb6dd7b2b1d1bf8b236727002000000045263ac52ffffffff018c1e98050000000006acac53ab6553adf707af00", "6351536a6a51ac", 0, 1014381787, "f114f8b79dee2a96f0aa0c6a0eef2807ef19fd88c8e0143e4e726e2fe6a8d994"], - ["c6cf2266020a8416e6bd13c25af9b14969b1aa8c1b0985ff3c16048a94f1e88bf2c8f2f483000000000151ffffffffd2bb5b02045b9d87f456df1def469522085684211ff9cd7a36f950560508f6fe0300000002acac0f47dc5504472fe20400000000085363005151ab6a653400f4010000000008636365ac5365536a11b2f001000000000853526a5252ab53652e0b7f010000000006acac535165537cd79fd20200000000000000005cc3280200000000637f77774918b8bcd58803e8e22005a9cf6fa77906a340f2902850425a7d4351f1d04c4ea5747f0fddaad45b0fdbf949e3116ffda98d0bbc2ce60ecd2ebf7687f3783bcecae1932de85e994802cf8989bf6571c4631441cd43fc5588f1d5adce000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fd7f91b5fdf23ff40fd30ea55103b814b9e44a3adb3a9adefd56a811d2a18e17fb9ae15cdde51ecf25a12fb2d8c22d97e0b16891cfc8b52f26b1eabc7fd85935184d3e25bceafaf3623083606d6763dd9dd557a465fb8ecaf575307bb3b7b5468db62f8f9240b4a9255ae38da93b3c79744afe66c5533e46102fc37315afaba02214e589cadf80592b3a9004c30d7aa160ae4f23bacadff4f27e16fdfcee2564c021c6ddb35f7b11b0cb4464a02a0bd572095118c9c6eb5870a6f44c5d93d8fdd470b1f822eef97cb244b0638a3608337e0ad9ca7d9f627ca95cc1c3e01e7c9ad8f7413986667fdaac571ef0a383705becfdfb287e3740d5efd27955931143b99d8260228ec3409d2d9489faf3856cb78e8700c6d780397ad6ce65fe94b3fe386d60bbd032653b1a0e033c4e64b50ca9f50967d70d82c124d3e546a23083e538c59c595a302094656546a112c54e9462ad4930a538d5a359b5f524e68986c731e580970b859022ab4cfa78738c2a933025d0d656ee6a4d24742b9eae4cf83850ad670e1014c0b0330177b98641dc2724c9f4891c0f7b7f00d8ff497a762c2b50032e0694540d8c1cc8f9dc01536a896e0fbbffb0f8c1d997dbcd2455c806b373c5b4d229397ec11769a4a4c930859f89191df03753a53d59d9b800c53957d17ac2ecb4f8337ed1661f162b8275b9b54d0c3d787d4e015463952fdf7b649b68e7c47a8b935a815db0419237802089d305c750edd2874284f0be3f79ffe889b1e0968fab83f4fbff69478dc84108d56ba8e16e6116b6bfd574dd2ad918d88f46f143f09c27a0c192d1b92e017e72f14377ee658d55b0833895dd60c8169c083e51392bd1a4a8189361e808cda7fdeaff113ddd94ec33e238517ace52bb6655737b0f0294795256803a22246c2972c9bcec900c79e0ed34531a1d8835b5c2059f040ca19099a1b9e3f4689ccd0a225535c613c8207cf02032412d15632d17c06cc6b9adcc41e18433f2ca5e1266e2fa0cb0d6a20d8252b27a1aa51068b34fec21e62748b279dd5a300c5dfe9e6ec97c02d55e09b0020417a3d43b0fd23d2608b51b33e70206b43dd016a028fba18c79d26122fbee446bc3b924f4d1a2d4a984b918542f48de741f8f3a80a3abd875a8bf5d287ef9141be173225a0facdf2449a97e30a78ae9b6cb49d74cd19d69f0ffa10a5d5a928c0d6c0715b7f8ac04f88d4dab819db50d4b587c0a39360a8bcea36c5dc001f0f7bc787fdcb7a52f7c8a729d478690a42183932a40306b7fce3149a9704bd0bf776289c2f8b60b4816b0c542b2b919101024a5f92da9fec1bc25bfa0dc34796175c0edb4e0f188ffd3e20d68cc5bcae2508faabb3a490a529706ad967b9cf02dd479e6865b09bcf49e6ead14d8b064363be2b71d2dda851d999343028f212053fac2455821043de97f9240639e51ee6d404bfe308cbc9241ed3eb908b970b0d47921b6a9ea3c544e7e39977004ad2f663b3a4853e84df4ecf1a2e73efb775556d3721702e519f5c9326c1dbf68018d92ca6b26cd672e982a99e0b990e02e041a8c62ee7c421f060a5aa71fb116ac49ec8ecfacd476d791fdf7f32545641ab83765fb75fea5db3652d63fe64d8f95ae49275aa48055844e8178352a221a3fa90778145452bc19abe36f6f7293f9d7263238836f0dab7beca701b0efcd798c3ef49dd70e07a7e17d449b9a262caeecc4d6738fb3527037ec2961097fb1091ad2d8382b4c0fabe4a9aa87d95b27c31f1cb696e1b5ed21bf8f117928a1ba46caebe35d7dc302dbd568c4e614bfb317902dcc5d6cee2ff817dba29b8f632c6cb943873b4f6fbf75c3e445a90370aa901c7de6a3da62a55b887af6f98ba6d2f039ea5d0e7cda1761b993e2a3abbf7f6f0ddc0eefc5e49ca914019b0cae20b8e9b73902bd9647f8a33905d194c7d818d31673ed0fab398be476f6fa71517d1aae9ff8bb1b078077d3dbe54a9109915a6678b69e100fff54ff6980f4dd6e518d5b908c52b58eafa7bd22714a7f38570c5c641e009a2c5f116c94cb24cc6f66ac992fd21aef1a0ddcade3202dbbc07c785142389c17ccb21862034962800a7434f4488cb44ffa336422f288bcd62bb3aab7586ac246138e6cc1c2d9968de1dae8c3d80489fed80cd61856377703d0fb39bf6f8876e1a916fcf668ec70a5e67886c8abb1deab76985963abaf498a9e6797fc3c0b60b53b0b6f06e7ea4f0033aaa9b76133b5d518bd5c977908cca7a059cfe5da7176289eb139d338f853c237a349e55617600b4a71af7b121b5204203000000000000000000000000e5cf696d928ed228b95808fa65b3988be984b093b984ba0743ef59b5bbf02f589bebfbc40814819bc9a0615d8e0bc69a377a7b1b0940fa09f3a9b8433be4543f23d458d8dbe87dbafd6726b7d25188cb763b07d3ad9ad7ea7fd71a0b85e78b9b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8528e586bed68356c34ff05e8af80f6460082e409428c8f2c9207c323592ba6f0143ecb63aeb9709643e0e387fd0f922da5c4dce8253099ce3f1075f52ac52cb8280659c12cd2f051e760a3c11029e8d5c42af3f39bfc5534e98b69ec91c7ae7fb2e74dda6860aa9a7647f5992ab88ac225f9564a873b765266886eff3e65280229973ee4c6c89f431b027af20762d9c54a1e9101da0a8b86851c6c01bb89f46a032de466f057aa4101c0d170a6711ddd719e39de7e8e11c45105fea3993a1344ef0b13f5c45d9a4cf62c48f1da79b4bf36c0b2addc3f93be0cb027a0a2135167dc3205d2956b724d9c86b22a3968afc0a9b50a9b10c08ec216d0dc3de8c48c36228d02086ee92b0b627394e29d296d1686d1f0d96c6d1d9a17e8ac89990fee4c9d8e140304c061e86d0d1a3650ca741664e287650586d46c4a3d3167ef070240644172bc031f30cccbca8ff97dabb86cc42a13bf4be516f63649a22dac88e5749109391c0d021e7a30e8d8974945aaa58c10bfb5bdb444e1387ff51665d43e191e7ce7eee25003242db9a9abf980dc0bb6f6b7a76c620a791af9c53448618cc6be26f442e201fd2096506332854f3c595b929d2cda4c59f23c15785a81c007637f30aad500c6ffe9b43cb59d26c46e3316f503f27463e3fdfbadc138f0385154ac1deac6b611d2a695058f0a3339eaf6a007de92ff3121092747f4b47ec66240909a575954c7caed05d4242e21846a90e67af9f0b21235a41e443a2d51ae9714536835effa65ef92010fdf4fbdd4a48868a4cd7d2ef9afa1ce10e9c0836de516d640b88910a715243fbb94e5a4f46b9e3a20585d453263f043688d1d0c46341ad46cc4b457b558888d2e1cf9a5abba7794fa03566318d3e15c6b451cd63c6d4c0d47f12ba86d4fdfae12d8bbe260494ed5ad8af9b8223a84d118173924037d5d3437c47be8c1afac52cb841197960f2e5ae2987e087d1f88b6fc67c452727f0b17d91dac07b47f01c4ae7f5ed739336673c34ed28c4f554a3c608e9716e6ad7a21bd516549ab9c3ab90d2a1db253862e666406647f8421aa7d1d28f02b49f0cc703a737ab55413a9aceec8f4e2ce4dfc3ec915ffe5255b9a1d0bb03f07f12953d3be8c001c2fe687da54474d6e490c7d0ebc1c05d7d60fb4a79b3a48556bfd7af2aa5e9527ba8125f8c555f16d67fe2b5e4195629835ee3afc1b6906e29f983542e5744333882af2dc5a524c0a99e03b6e42e72cd18d70b0be554070ad937fb773b31a64297b96bbf214df82117954a9b70225f2328e99a9d2ebc621d40808ba18cd12689e1800803cb3efb6d79fd66a5b3c9fbafbb42487a0b4183af79d72380b1f93db3be9867f03fd66b68e330ccc457274dc19157de01d8b1317072c5a832a8d02474f68639ef9c50eb5d8e1bea5805f7bcf301688e420ca97b8c8882bbc6b26bdc9f541534f87cfdfad6f76abf8956437b331bc0e9c86b631c415e68c121a33a3d5c0e54a2af0d5306143af1992ab90b9e5c1b41fdd79128d477873f60da3cef2a4f6649bfa73e986359e60b762824b57048b8feb2ea272a3d79916d41a831aca2bb4ac1acd043e21d49c4e89ec15d155540a7344267aba2e4af51e134db84b8003cb8fcf79dc16ece17b7d06f72d9db6f200ef39fae7db80bc0c1a99904cbca0914a7d7353c0babe6c4d32acf2cd986302faec1943df323843b94b4efbd6daa71762606048a68fbd57d39387d96a0e252a7aa8901ba84343b6792486929a7effaf9efe79890b4309d6494dae7ef81bdc5e5d266b617af6b2b828fe6fef2fe285374fdb271639ccdfa7b83fb06997289cc186ea9b79e7919776d83c3e13a4b14498cb3eb1b007dd99c0c33cdba050c4ca93847595b01081a50fd4e1dfc59012e30815a9755be9ebad98717a54cb80cdce48441f15a3551618381d28cfdec30f6ff803ef1d0c5b4b77faaab615ab58176f65088581ae664ab1a7fe34a46f4488dc4b80774463ed9c32dab8fa9da77a3f02dacc873af6a5c15b58d8bf7e2a7e73f60f2d2c873fb94a5ed08869eff465b0f0eac1eff7f52189f25f11bb3223d6b5b5f7e9d83238048a0b2f71b32674f011e4cec9dd63573426abb6b84c1f245b2a1967abe32b380a5fa384c9fd751a16438ee978edf509a155b3cd1fbf93f3aa10bbf1716d35ea78c3dd5cde3197b6971b043e5d79d9facff902b012cbcf6817d71b873c445ee8e129beb88b06a6fa2346ee08bd2956b1abfaef6a3194dc7bf8769d768be4238201f4be52f1222c84d4d302c880711e91a9fc78c4cf306e0a8b6ed80076b57d7a23830cea2c94eb468babbda699562a4485a21c706f93dda8d4f1047c28b39714d42952473d3799e207e634e7a79ba5ef9261910d9697ad11d5a2c2543c7d5158e0840b9f25d9698835a69db5a3eb237f08", "", 1, -1362049862, "72b91ecb9bd1d56a9031b010e0a23af5d8a49f4ae7e399b67e6a9794bc587386"], - ["4462e9ec03e0a7539e52b2144ea6e3d3060d45dfc26eb8b293762cae8b004d9dc5b11907c102000000060051650063635e0f739cee38d30dff7621bdcb5f588efad654f5d017cdb5820c56514ee41adfccbaf466000000000551ac006a52ffffffff4cad5a0fdb7b5f9f7ef74b76e268f5622e0808ea9df3fb4ac87d1763b4f4aaef0000000009656a536a53006a006affffffff034ac3c605000000000765536aacab51ab43c17f0400000000016a297ff10000000000066aab5200006a6bd52fa7", "51526353", 2, -1213420752, "8622a4dc91adb87d8a7bbb05bb76bb3a564ee7fb7a87c188ad151dbfdeea12cc"], - ["ed3e3839022ce200d160483d7e017a68f7c535e326f0f4665a3bce592a6a0530fd349eda90020000000963526aac00ac535200198cd0542e39bd37725ad435c11ae41b21f110c88f1e7878d658b3027a50315a2bec76d100000000076a6a6a6aacab6affffffff0400023e04000000000351536ad84acd050000000007006563ab526500a9bd6c05000000000852636a526a6363658479bc030000000005ac6552ac520000000003943118010000000000000000000000008a18627f0db1da9640d85c34c29355b4d992aa45e0ed917a4927d36c598da5d2297a6bcf4d7da359a5f16463c02bf2de0f18f600b55509538536a4274732b9287d19be75dbf106babb8971d2524184b79685b71c5d17d5ad188d7477240f041a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004f903ffb6d9f3a6c91ba681c63eec47136fb984aaf27a03876fb0f64bcfa51aaabfc36d173536e9b5f32001ea46c881a957d24c7d0747759b5eb7ded760e58035159dc35d0eaa00bdccf896df6192516f1d2d80844c5f4957c7c94427678c229ab5a43dfed1639eb2acb5991c37385eaf392ee31155e98720055641146f6a664022bddf8fd661d434ca94998d138e041e46f69b809e99740e70976d2710e0f27310211749d1c9549e042a37f102b4b3aec78ce1a87ae4aee6dcea595fde29ec3f2df0a13fbfd26060f7630479190c69a66e69fe5141927ee9d3fa1952e625329776f3420fa183e685e6d1c077a8929b9093a9472dae8da2e972b45341079cbd7deb6b5031846a3cb79ba3bcc7ec880d838ff1848f2308554778e71f403c2724e620de472032d7beeddf4313462f077b08492c8e51e54961224b29e4e69a51213db890319320319019b268d0dc022153db8135b56a5d13e5738c9a7ae1709f7581e0c8d45a55e02204c7cf6b6fbceca04ea0e336b797f2c7ae86e73a910f1f2c07fa0cf6b89eecb02098b422ae351deb49491220ac3317dee8e635c02558b76101cad97bd4ab1c1adece00c6d7ba016456cebe4ee5a07fb920dbb4a280c17cf9c2f5b054d6a48ce2d7d990c9ec2c58d1a0ad0c76b779dcfb8de6c36de6d507d5eb2f03cfe288c0b394820cfef56908eecdc1ada017f3937d02268ec6c815860ae42b51aa04eafe6b088b70bba5bdf6d56db0c19c48a10f1187558c7dc59f2099c01c6ce5d2b354a7664d8ea0b8d3b486f8b927bc6a157d9c5cfb08d9f82c39af3d5c10f852d51d26cb13211c8312eecbfb1082dd1fa232188192c665230eda6ed27fb2489f8dd414971ff879dac94c91141a9f88922138838e0ade54f028a880d32e70479fa09c5a366541c5abc1a3f243b7161fbedebd6844761eafdde59312fc750a818c773830118f0c36267e35cb67ef617bd84c013b00ab48593cfdaf14bc508957dda1da7d322378dd89e8675b68878bcfc860e17bb9c8281bca644d30875501e9b13e2de087de74c2afc7a145e080bf41a4fab5db64555837c10ed0b1034f0c10d2de95797acef73ce6ec1b40a44ad717dce3a6fa2e3bd17281f11e73cd301805b84b6f91fa5247b4d61b89c8056be911ef6774033d2716708ea79b5a6924401328bc71ba2579905c11f44b4531f1dbceaaee168c63c27539779ceeded0ef1c3ad664a6660b69c688ed6e670c3ad24d04e11e845b8ea1bf37f8eb31f6ae5e1e25512d56ec6f3a0b5cc7ab424ed69151e41dee915142b62c6f5fae55b0de7aaa9dc6af8a09753436987ec3217f6e402aeaac7a97c062cde4fa174b2d6f62af77773b125eb7d23bdecc2b6ae9df817957dc3765c230361221e8240b2d9bc384277acf559c57ac6873d0ff7376b8755d835757ed4aacb2712bb7ab4f30a02917479205f8eca9104c5da8c08021173c3e221cb4e2b8e16d803ac96a289b2690b2a0b797c7bbbfc1b4388f7662e1c34a4ebda376fced8105c14b39d3460ce56a0850f23e189d659b3c8191e64078a8ceb75c331e4c375c81af38d7138b6ee7d64aef9053981a625e29c7740dbd0e01b57943931d69404c4ab68948ca111372b404ef05db38c10b96bcbb56482e803f1459d597ad3ce156d8d9dc326590e48847155ae0c70159b1815985b99d16280391c65ddde8da1fe3c9221622b154330751efd3ff3fa1d0417eb91781bdedba44b496b3d9cc2fa65a512f4fe7d28aaa8ca45cfe0369cd649abe4ce43aaa6afd3ba0e702ac6252eca9c7095215ca8ceef073fed7a4edd66d5eb752b55805c49b70aed9b279f21a9cba245e972cd8cdc6454dbd481ec9481d10727a6c2bbd7830e589eebc1bad331f626be53a05f7cf30adb83328f0466b66eb385548e89d2fe741df76450c03138255059e252a8342cef33799ac78f2f001427780fe5cbfb6713489cef62063707c80cd1f9c802dc16b463ddca19b389b820aa6d87ab8003ffc0c877c3b24940330d4d094ca0369f03b23d9734f4a45e9f92aed9ab964596464b748353f65960bf19f3c4cd5585d7760c2da5b5f0ce8fd6aa5bae8f17d76b5c138bdf2a39d70f2a248371e0ae5223605c131f82c3532ca2abd57286e69fcfbfc8b9485705708857b02f230a0156d0af5bc1a98cef402443026e75115cf131edc144f907172e7ceec315a328af567ac1dd70c4a4525c828dc1d0c0cbcac9dab336ff2a8c49496d12652ca2e1c18a7053f2de6b922ddcf5d4493d2cf582e3a14e64b3b92b8b4638951dcc443bf79df300000000000000000000000000cfce473bcc522f54649240a4ebce568605f95153a2e598b369020c0c285bfc619d01813b9d4e92c1b0f42c8cb0d7323f9851fd2c8621f239002a5e786a7734605e7e48be4e197d5d7c8312db61000e89fdaf4b31a3035d32152ce4d62681a95a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000094d50ee657a313fa6a8b2b6047ad5274116e1752055beabb65365ba6d513a4b7f5c266d486fa374bfe6bd9bb7082b51668858d4e46b84f4ff38a9ccca113209e96d485d3f7af795a6705237862ad7a5892b8b470f09c95998143e6387c8a098c21533a4a2672f6fefccc0af5e0c12214c4a4a5ece60446416d7bdcb27edccce0223d6156ab521342dab9e9afe89745671648704148c5eabac88a8cac5f0beb0c2021ae39dfbde19f160311e2ffc6991caff6210771ae8aa271e7e9c2f2ddc964b360a28768a97f854d925c49cd40e0ed70092b1ff222bb92497db4e555c6a137a144e1fd0bf5f2ca896d78b9232773346f87c9195c6c434da1c9344fd4bf9e182f369021e76ad05310724a4792e4b5683091cf6f7863324e02cce5c14a6c7c8b99882ef032b8b4dabef43b21c6ed17f1dd60193ef238c8ce40e2f09b7c340c778721565c7031ca1506fa5b111748f655dd89ecdad1910605e0a32bf1e66544b73a312354184022c7bba48039f008fc91341aa1f86b7e1ac39903c91fe478f8e2749ef386e23940316101736edd44426495a0524dcf6ea02c616b51365c1e1d92a3d4d2fb56d748e3857d7d1e0887965a4457cd9d3bef49fc7204945e3ed88c95d70c678744f62ec68bf425bda66a2162eba7f209c0520f5a0bd5d5708dd341fc3d0eca59e63c73e5fcc660c58303d9984305379d52ca480f64dbb25639dfb5bf004be8b6aaa520c6fac999e6784828c0f9702c7a686145f0a0be66e04d6686764c60ddb40b38cd315f3b7072bbe02f69ea97bcd2183d9bd510ad6bfd192701a110745fab53970b28cfc0735d6adf30c117bfc1166d250082d11429fbb26dcca0f0e177779e0589f7d9edbe2532249b7254454c48794e1460a9d483a862470f0ee921b0cf57b4a8e21d1c3359b4d478155417605e8f18d0f9cc96aedc5bf8973f94a3e8d30cc0ac80a6b4055e84837fa0c251df38ac1f678ecbebdd1d9e50b91eeae6f2c9b86d1293efba5644b9dcdaa280a627c29617a2447ba4a7ddaae46bbb246e7783aa7eca5bebed536431fb6d47bc66b07d9d4be24c5eadc50f8e514150c28b093b79b0e5177d83d50ce839db12eda9670355aa9021db6d8f8823c45a7c93cb7def5610bd7e81fc2ab988ff4018c979e22f60a884b514274b2053960f9b0f4570282dd714fdb4e2258b867e813a5c5de65cb3ab898db2cf655673176e20444d57af30f735abb007cf597bf8e3b128d1d619c320271fcabbbc866e345266c06312e05b78a073f75bdc4805798853b5e6c0ffdfe4d1c88f78d6441a16c0d8bf409bcea2d5926bc055aec8233c654b19ad144ed1bfa9c73ace10d45c33cb7979dbbde519e73e8b8b265ee02de76acb914c8f984efa524f23ec3baa824e2505df76d39ea0facda88376f74bdc5632426081534603280ffb692e350416f421549a8fd19197e47740adf59aeab1d6f0ef650f2aaf2cec23d169b8446dcf02ed27a11a79f2030d87910d9098ce601f75754f2d69f048dd0edb931b86965899403734c1035ae34bbddf1b223dbd5183cacf2500f46fd2d88c3b5db50f184475a06dc14d38db4ceaf8360e8d5e8802d6953c4ba9c6ff0ef06ad5c8a16b80249b7a1f3dd900f7f580f07407f456a7e8b678796a6951731d4a764547a980c8f63d7da2992d7e7af653e8f1b916090724d99f7aa03f45faabc22c2a0858a936e5b84b0da32ac33dc9d37b9006e7e03cd14c026593b2e525484a0547ad4f7585506f3b13d95c08e5d6dd8bd7313bfc5ba0d046476eab5e3698947ed1f6d22c0ba11d3dfd0fb95104e24c52e8cad727468146045a52adf6fd52c2b9bedd035a7dfe2ca5b16401fea533facf932d256d96711a70106531b768cb12841d2587a154a923c841ba0cc9d46d9d8f831ebf259d43dded3b9a52bcd69daaa157394cbe19bfa674da928c6c7a95e9f127dfd2522b59f89f8322cf4193f64475501e7dcc3c547e6a617fcb31e7daf86eebb7d2499d182bba328f04b8ec2f32c5c1c7953f03e830a472b552fa043b01a424d912a35abf94b140f514a6e3771f5f509bc4f274806d1b5f6248f23e5f101958ecefddad0e16862cf49cd280d56762e101a84bf500edf71abcbc6205fb3c13a4da47b4596db61855833f387334c3bc78de0007e085396cd470fa3bceffe37e0c73b389a4723720e67691228e142483bb1ab51c0245b98b13e71b7e8d136b39c0cd569117230e800adf2e3c25e5752d97048f68996cceed5a5404b8bd035a069cb43aaef6483d47c650bf5cb435b50c3e0ae0000000000000000159acd0400000000b056dd456589859ebfbed8562ea46f3bbcf196d2f2239c4335b74c11a5f972c694b5de666c6be61e25cbf32bc5f84accd970a533b4e6f68508509abbf84dc1a5c0f63ea2e7b9e070f2851de671675f3989d83f4de9e08456cd020bff1ebd4b35000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006ee30d22a23f69fab96f58dce0e5431d46fea6bbf7df7d37661b9b2e0a12bae7baacc79c9210f7cc69666cc1789a835096a72a878c83525826299006eb57775be122175ce74cbdbc12b3610a21a78c6f8cfb3dbf5921395fd22e88f5c9b9b43dab5f52055c5982a6db0a9ff66092cce3f54f10975353f6587034ac24237ec146020289236fd24f053a7c65895f28b3360a3264f1d1253efa8372a593748fc455cb0215110b472648fe0283f087f55c68f1155c70a14aa855a1a6fc573e1e47da54cc0b247d6055393c2e87947c2295fc05b5c7fde6d028a6d5bb7cf67841d0f98e860a08dc8120ebaad4bc8bd0884291fae288626198a1acff8f8e4e0982c579616f360216d95d2bb6180121fe924b090a428edc630e6affdb9d428345969163a62188a90315ff565e7eee4acc3cf7d834671387c96f79f7dcdfc4430a95779878f06882440308840c15ab5f3c03571925858d3542aa76cbca34579ede934b78522586322b41032602ad9ff2b38283a16e173c02132249fc6a171ed6945c1f225153e33cac89e1021a4a07875e4d55f0b4c1d42a9619f340121c474389ec61a105fd01c810e502e76d9d15e12a95ca578544329427ea2cb849ec7627d4120e95b658a846e3d26ad2f1d38b1d0a8431e7e19860de5886ee9f9b24137f4e1ca53f515d6e809a4dfd0320a4b4a5cf0f4bcfc8113b2f52fb9fb261b663ca84af6c183830c2b17d23eb748645f27e9efcdb8a301a24575378c6a4d5598ed56d91b06b1e6eccad3a14b170675fc2d17afedd334ccfc56cd8acb58d35cac8d1a0048214b4d48421fc1f954b7987261b5f2f85a291a69f7902a03fb9acd97a9c5cd628e960ea0d3d0d8413d811f517892dcc683e672866bb55a36241b736bf847af46f949814508ca7beb4f2ed3d00043d7c845e7f56d66fbdfd041dd1dd2587a4c3396c77f14c96359b26e8127163325f9bf04f4cc670377a240cfaaeca86226f7967719b231d44f48057e38c2ca914824d560da50d433a1e1e7312e87572366e46f176ca6df30ca8d8153b3ac0657beeb8c4440ffe68ea90588087271cbfcb2427fac9ce481296af3cbdaa98b3d2d511c65ca16ef450b88c0d5e23950a6aafa1ad84f5db210290819c699fd22454aca701f56407cf439278d0cc478091672bef6136fb5496de49a5dd9332cd5fff7c99cc658345abb8575fef4cdebb394c49b47f9ae85d6a30631fcce43476eec725ba14a5b8a024a52e646f4d9518493d0353d1e0f4c66ea6e7f04374bc606b090f20f05e0d92dc39c70a2e2de3ebdc653e3c2f506d6ea006232892c7466a3c79743fe021201078e656e967bcd03e398b20e3541a52bba60ee08c0c48b68a61217a281677314757f7b0437b8790bc93e3081d31823a0626fafeef703fd33254d561973a7f64714e63bf44775a4e15b23f56017d3e8d1726402f679a3b6fa08b6d6bd18cc2026ddef1d1f17484781f2e645c057fe0709043b7fb6a46040fcfea7dbe76ad949d153fd62d9c26fcd8d304d4e6764f87cc6f962877205c1275c5b2096cce9dff9589d07afacaa0266093f6f9681f891bbaeb5477168fd5784b8c8124675a5e79997b5d7f1c2172a704fff9fe7fa7fa7106d58a1a3425540946e8549caec2bdd9b0f6f921b1fd10c1365a9c6eecd4a27efcccc1056e634509a9182f3882016b4d003e8654ff3dcfd2ab87dca1c843b4560e9682aa6ba2d0aa99ac7fdb9930161cd994e9a66e11a390a5c414f3ff1454293ab42c6f5330c0f17ad1c5cdeb2496b6bf559940c1b10a6164d42439028d7216f69202a2b7b3aab303fb9a40ae8ae5de518cf3ab5347898eaaf54755909199e0361abd7a364960b8c146f78e6d7e618ad579f53279e6ef2858405cd9c68a1355e721c0171a2f43687e24330e3c5d818faaca4467a35e1eb5a9d6b6fe34933cd5a69c358800f07697fd46db214f466a74484a6461c34688c30d700d82317fffa537dbb386f8dc6498b40c9ed6a33fd972e1709dfeb62ae644a75d9a7d3be17083449bdd91af96cf172d65f3b71551a47c45f06ac7be03fe1243d60c0c57a2b4aa4aea0f3066f4850bee8f890fce9709848bb36c712c62ca1d83aeddccf9134cd5bd95e0710719221a6af290699400132ada6dd090eefba93e3ecee6576f6627006551f11fdd4d3c74154afd675766f577412ea25870dc470ac64635bd12286b71dc339cb15929b0b406b48053782dfbfa7549275695aa7b3021df74945027435311f7e4cc07a859c7a42573176ece6dcfbf80b0806329010ed0ed8a0fab0d76dd2632c8c6dab33eff3264c954c1c5f700c7a3209a874e0da931cfc2ff19bd97f062b2036d1cdc6e3e8cfaab36a81c1b2bd533965125bf51a12daa0c0420cc5472310599fd5daad5821170f1990a518ac063b6e9b5091b18ba79dc06", "ac536aac00656551", 0, -1704031587, "dea3549522cc05e4d4b1c6a274cd6c6204e3b5820ba15eb5b086c3eace4e9cd3"], - ["13a3080902ed4c698577175b8470c98a5663dabc35ba8591f7a4e0d4107b4d7d4395c752df00000000096552656551656a516a86b404550a7b2df8bb9f5b48874a1f28031b8973d415086b8b8da04b08ea1a94c7adb8ba0000000007ab65005253ac65ffffffff03aee7a005000000000965525165ac63ab6351acb5ab0100000000086aac0051acac00abf6290202000000000000000000010000000000000000499f530400000000cc925d05c139c1af551f1593edc4cd554decd9d9a0c538d562aeb3e07cd42d0ad1f5e8dfc0f8c4cf26f125577ee5f46f3713978b8d07f742185003af6d9ac2b534b5d41e69a49e013c32c89534da2f5609e14f4b27699bf515c5d8f9d93bfdd500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000978cf53bece05211814af6ee0f7a88e75ea98dfe97d46a548c02ed327b8456080d92dcd03940e848cd84120a77804564dfe80b3a5c29e8d0ce557824c73d3856dc29d61340094fd6b644e1ca2097fddbcc8381d1250c98fefe5b1547be8d7363ea651697e0ff25be66a05445472d543e71c86afbf620c81e5ae8585a66b2e7b403257ba01c58a0c498a1c02bf66b717486673d458359d953a1412ea66dd89aea950218c4e5d4ab9b34ce267f8ab1c40809332406fbf0acda1a94260a98d58df816730b1520e8cb11de9a4ba961c3fa2facd5c12a74d9c98c514a55ae91f5f7a0d419150d87a1156c4765e2e89318b7483812ff2b97ca9e9214b27d67f10fc9da399e2b032afeb469948e91cc17f59d1092e4b9dbf96e181eb9c9ff5e21e8712c1581725302265eb50f20d4052b0e4ef59a9c64c35f53315780b8110af045eeb747f80e22300309029775eb3d46a294d54ae55195bb8a68658370ffd0fe43722871b3caa95a130223745d2dd20e9f277e54ea4d6213d36624c08eadd75b365703f911147db8c1eb022b30780dd1ffcfcd227e1a4a60eba9a16a1598977da8d70c65112abef84da4372166a1cbf2598d4a8edc6c76cdd20756898617994cf7d95e39997d985f40ee7e2dbae5fd8f31a8a79d93fef02108c5da457ebc2da18a4b620f268e0a7bdd78b6d62f08808ede3c1b6006f29cc9a4fc111bfe6555c0c8c7313ed8d4d7ebeebab7d54f0e51cc3891edd45cc401e20d5e28930b4533616993830b8225171be3f5e6fc32887f4257b669331aa882f5fa6ab221eb8db6e98b80f518d4a205cf8f02f3a9c89cd2f69e852cd7d8de85dc8089d04195a9e430288b963f7bbcd4e4ede5bd31446d2cd6b0a8dea3478d5212843d1a7d8c9030a695ceb29170947e8ea111fe474b0b4148be35a4035b363792722d24d37b124747044cd050f4bc0db4a02b4023c7f51dfa507d811fe428c30b4fe42654e907b7d6b3d62d89f4d1a11e15d134e588d446878641173dd093ee39f266c2712b4df34b698a33c63b077d3017603c3fc9f837d5d754acfdf6982831e29a81701889c3ed337f67d12a7cf70c587fb5cddd2476b4a5f79b67b0d5498957b14b903408472eff941fcc249ec10181fead130623958f65939f1b3f92d1f8724be6010fc7e2c6d66cb092338fc41fd4099942eaa45babb0905111e8c91665b69bd507534f22b8e015f80b795eac032f631914cbbe9246d3e98e3824e88dee6694d43c3b03029f524d9b62a87bbded88728d2e11511d808b003522b58b73874d0214e6f528c2e100bd70ce1416507f486605cd183288e562a3a6763de413427e40638879e81efc2fefe7bbe282e0d360ff71745e0623351e84a0177130ff262c89b9f016640efc0811d2d11fb0342d1dd34b2d41ba363e021d202cbbe0d9a2d769518f08786d635ac2430bbea671ea9d2e12615ba8955368d8ea3d3ac6b3ce485ec9677a2435e910481c546dffc601941502f5c2650fbe5e821ee69f3f86c2f1cc17feaa9a15a0a9efacf8ae8273a580b7c5c3dfce88d33ddbc05ecd6f9feb424ac40acda33a8d1ca4ab0f9b476c6ce5e033ecb9b794e485c886bf8239895ad81cec006b0b716daca46c433af40f6d384fa9b13ca9349c5cf6431d6c719e5d208765b1bd9b57a5a19c1aa3d988bf1b88ff47447993fb00a987356f251151a39661cbdfce3db12ad109cd1fd2aec81bed703ce35c03360d1dd3a7c278b920ea9435be414f8ac6c5fdbcdafc2272fdc7cc9314598f0e4b6ee3926a886d7b6f48d55fc4fe8cb8cfbaa999b148440abede58ded0abee83f41a4bfb2d29f5b7e657316bd520353298f14cc86687b3a30874faa9fa9e44683d01f8e010848e3855ff5e9c9f412e2f8e4c732556204649f894da39d58f89f7bb6801c09f20769d1093b3868b5f1d1b429ade217c90caa7097d108ad70e01994c0cf094bd04494919a4a4b0f30e1a0329657a1647a71851c61e38f18ae61a66d70017b9c00302ce634cbe34b60000a8e9fc2025f2cbc1c680aaf8b139979a24c67af4a6c11afa17461b7e489ab4661a5c3546e1ac6e7c7db4cd87db7533b39c43f3c18d36d5008713aa9ccb4b22f8bc46ea7470f97c795a17ea228a8a9623306497a770d6bb42afdda9ca860acdfbd3a0ba56396851ab13b5bf4e6d8521893b0b8ce5ecd7fd3cf26601a9a4e105c8ed2a2ec97bc6c3d798fccd0f4f56b7dd6b14c1a9829148ad67c826e0fb557f17b15771d1434a026565ee23e5ed2240dbf9eb6f0f8e6063b8744cf7fab0a9948435f2e3f7f0076c6ab2b42691ba335726318c577125132ccbc481aa3854788acacf2abf52cac47768ea4c06e063c3ccf08b3526c3a2aedee68baab482ea84c7c259f3483f3df95340d8b36d03707764ed80c3249f3a84aaeb78ec8dad93c9c207", "6351ac", 0, 1194704766, "63f4499d8c52ce7c9a1fd79aedec16c277759e3b56335bfb11034afea76911b7"], - ["35bc927104167f685dce655b018ce23382d4c8c0d4e5bda2364d6cdaf31ad36feeb5f89f8f0000000003526352a2d417ba209aeebf3f1ec844cc8f9556dc1eab0aaecb547680d56361f4cb5d099569372b010000000163a5178e9286ec0f0f1c3b1e9e1c5dca6030148442ae27682f0033d45e9e7fd4a88461713b0100000000fa6419adce6eceb6fb74d590ee43d94887a4d4badd66e09f3e6fed487e7e703bad2e59020300000007525265005300abffffffff04e01e2e0100000000036551526dab760100000000050053636aac14d0a703000000000500ac536a6ad5a7340200000000016a0000000000", "635253526a", 1, 2094929526, "619ca4509f95c361f56309ca4a06e29147e49338dbdfbae9d8e6ed1755456e77"], - ["8037793e04ee98e2d5cc63ef92decc6091f0d15ce01c83a6f0bbf3f0427a0f2672c2093c380300000000ed503ec1d6c2ec97bd5f7e5e253f8a9d39c2b4c16d59012c0471dad1999674ea3349f8670000000002ababfdcac76d2dbb1abf37b4feb6c4636ed698971fb3d87bcc0dd031b9aa786f7376d98747540100000006520053650065b9b5f65b84e29621ca8e85db887a6afc887973983c0f48a9a590c36b834889d24c0e5043010000000163ffffffff034db24b0000000000055351655152bf78be01000000000951acac536a51526552b9a02e0000000000046aab6a6aba4b720502d5201405000000000000000000000000cdda55c7a13129748c7ac36097d2d3034a240629bd0dc2ba1f923c2a813550f6aa8f211a1aebb0eca3bd6e4bfc7483fd2b0473d727562ddd0e6dd2d681b23cd90c8e09391f88fbfb09a1da6b02d017fb0c32cf64d676bd0f19ba07c2983371a5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007747f160ae45b36e77b1c7e13dda1f8cdb7f2ffd7d871f2a1d5fc17edcbbef1520ca17af9a8e9520fedab341133746265ee6af4771119509469c72fb21d90ec89aeb77dbbe024d85a5a4882531e201c359301d9d04486dd4e4bbc13c6fff0984600dfe0af4c116c296b005330fd903217b3a9681223702fc44dec0beede894e7020e6d9dbbef43255a246f433614ab9da70c9af2a6133101b284757704cd846b6102050bf694993ab78a67dbcb09481aee09460586da258e99c65357566347cf174c0b0717e0104f26cff6ebfabffe7ba5c3b59f5c6dd95317bfc1694e7c73e0fb93c72431c4f42fbfd4212600aabfb63b67422190427601d812d581484bd64dbb3e3e032cdb63442718b5f4498c3914cdca10ddcf05b068d8cc505b893c45ac64afccb30314e68a809928d3d9457ef66d41576736bd9768d7814f7cfdc0010d76f1ab6ba40302cc170ab83cb76f77612cb80fed80822ce6e284e3df48fafc3193672d38df3d030f60ea11cef80fd27aca78e4f32c0ca3925085d73c63e79cdf2fcf480bfabba80316a7e0f12cd5e1564a46229cd48c0fc09cfcfd9444ef8529a866065c67f40414f0105f458efb976cb03a58973f01009c2a97c9734dcbccf28deeeae52d373087a1156874cc3b5b909b063b9154b6fb29d482334d920c25de83d8ec19cc2f3da831647b39eb172a2cf37e719181eac366c43cc6ddd2b6d7de26afcb44d78653278a5320c96547db2ee31e549e8916b4bc9be9960d8dff4c0d31c75c57667c3c4ed4018dbb974e21c0a8e94ac7486a395f50bc0c445d7c5f8e7e295a070e0dc7031baf867481a043a3d7bbac7c106a8c44f25b7078f56bb5263c8b42a1cac373dc5c717475431ec7153897bb3586e458b47bbab361997e09a4f05d2b5d4924a84dda24b9d0bf1692dd51a6f0912f0ee11a5125928a76392f4ca86a20522de03067a8f1d0fae5933d0d84a3d2356f16e3c0da02a870672bbc2bc426983935134b36998067994e432751aee9f507e7aca03d1dfacf0142677bc7df16ea3fba5e981dabbc8f81a83b8413d2aa3aaf6f7be8fd0b1672bf057f6de28f224264c037dd445da83d46cd89ad1c9fd87d54da65688d70503e7bd642b27772e8aeb4db608167ae1e06feb6f0349c5131a243ff76ebfb5cc8d75378b6e7e5ce8eecd0e03f9cc93e22992c14ece31b647bb4ea49efb8cd37afc212d6628657058ef7d5d3a4aafee2c015be2cdf46d9e13054768d247cc110e29675972a7fa2043c1c08e1c26ef76a66fb23b560f9c5e852a8e9d26d44c751c1078ffe60ff19b2f3753a51d6bd020b87a663952c307a02b578cc6eb70ceb96410c1d18e613d6932fe37f12b4487df0e28f5a633a4a22921ac5ef25f7cf41f3939c7c79d9ed8c6d94332eceb683b8e50b1aae74bf5e6b1f4a952a89fafacf8f10b9a3a4c23e810b9cba06044254b6ca16114e1c224eabcb650a26f6e11ea43cb7aa411abc8916b9281c5fdad4a52ec2d5484d3f9944544a4581e212732966bd4089cb5d32f8e636bf14faee0985b5beac8eff8f640a1874c0bcc2ad1fd61cbcd45f876f4eb074491b678d7662a7f2e15693bd3a27389c112180ccaf47dcf49306a57e89035b51098167c56db6673a946d7ac72a84792c4d4a11279b05478dbca2c94b00e111ce2607195166ba3f214b4ec816adc0654182a810a328a6e9e0a32b4cba1d486fca3261fb5d2a4c81172febb682ae3ff959e69bb6f2c8e318a9af682a60b3dc307b2ef4968b4aec1d0faf8f617aec9cb88df34bebb4b91b104cfc44ff02b4e234fb7e982a2793f93149aa265fc773a94302a6cd69b73632478319927a0a828b3411514d091a13405506def1c28b2543f6a2e4f3473b5913299a3694bc5f769a42561ed954f0b49df8a641ed33fba51c90e528bd27bdfd42b2c638b5b371bd10e203696239f95a249670c89f6fb9fee3eaadface720a6c4f79f6eabff56965eabc17dbb6203f4e2d9980124a3b60227d1b255e5693575eb1bbe1d2445d1cc99891c6e56e841d821cc17de013d9cea99535c6422cf99b8aea81ed521332bb3d10bcf0aaeb873e8bb2213b8171a0966dbc0ab89ed0e2b2d3d253fe350c911bff67e5666ba1e9e207a81f0d986c4ca2d6545051fb089c4e1903105d5285e1e264a7d047048eb6648c58e998ccec3d26e145a447422d16adbe78b14aded2cc47b8a79d85c15ffebf62d3d0344588799d2123cf15f3e997993f7329f302da91eee0b2457b30923effe5650f45a9a81b53dec8bd6b05ea490689d5e2b5397c3c5a5b040000000000000000000000006bcb5a821c9cd7b0384ed348b7eb3d5b1dfedc750c1de50146f83edea585afe46921897962ae74ac006cdf8931c2d91cdba0d5cb6cfb7ea3985673545c2b0ec04724d1b35530211e98905df96fafac655c6f504bef09d0a5d7b280b64b26ecb300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a6bbe7aa78f815f1fde921ba200f2ce11444855b980f726facb7772d9c394ea23beb97df4b7d034110afed49626baa65579ac0365f6564acbfb7eceef1a5becb41d8a795a629c6c55b050e5c883df2072658dcc537103486b5779159b81365436547149612fe73bc034d94136f729c3b522ff377d8095846b1b25470300cd19d020fb586f9251fe31948bb268ac5a2b97c088ce6e28868b5be8a40c65d95db0ce00227374043ccbbb74ed85d46bf92111e9bf00e79f0725fada43228a72c985e5a350b13ffd714657016facbac4c11e057c251afdf789ae97d7c671e5a51099df0f7450dc0eb4fdc6ac6306d107d0b7b7901fdd171908a220e537f067e9cad13eb087f0302710f0a7cb5867a240d92eb5c9c4c28414596417442aa86f68eea34f2b3b7d50303cb2e0b5580ea42627c45e1138cdb66bb11fb50b9a41b96295fae11497b458d021ff49435e5b263e4159718e8681c2cb3d6d597c8359bede90795eaf42b69b7c60227158036f13fe64df5f7b1a5fc71aed84193cadee41791f4985509ef90482aec022b332f9e21210a5e1fb088ea8ae6c7b5d33cdbd92c085b6c554da67a5d507fdace28b422b07fabadef7be93078d746063e33e2170c6bfe583873e862ed0bd3cb7d7ea3718ab45a25b718b2bc4577e5c42fdc3306e0bffc78fbd381662f527694d9f1d0445ad5bd0343c310e7af80a3b93556d85b0a8e42b6ce94ad8ae09fced3ec6f3b83caac56ac3b8bb0bd9f6ffc8bfe6a7a0dd4a9633c85405e3749ac599fe780171e1ded0f80ccf0f27f78600e17a9f3fcb48e9a426e9c0161c9a1769eb37482fcf7dd2874b2ab4eae6bfefd3a62a046f9e6fd7e38f8cd4d319fe9b99d7ff891a81791592e0fb6f6429261a9440bfb37204c86e475dcde47f135c002b3bc1109ce62e1a41e5082b9fbd598b0102737e6889b204d29afa31d0bea4a0f8caf28069c567a207230eb721993c9cf145e2566eaffe388fcfac533d98acbeb884bce8b6ca2a8468531370da6c2e3879dd3ddde89aadcf47ba562474f9ac3f03df391687844165ee854b237c6018eac607d3e7e6c85b7a04a7625cc63364bfec44cbeac0bc2abffb3a1b85621b88b6100cd4c292ecdf9f85a4c7749c14bca3a616f4107c8562dfeb372531de09c8f0b1ca4bf1b8076c3720386b06f8c9ab80d8bf108d0b38e44f412584d8316670c8ae3bd5ebf3cc14025de49da66377c277e39756b01a5b424e9a5940651aa186625a1311e2e6669c0cd387103fbd77e28be66c82a00f9363a08db6f05dc65eb57d53019e715e5cef88ecdf0a09984dd0245a0ff42e931c0134557234876c9fd234c4ae09590726350a0eafdf4108194efd36d7ecf7b34b8e04b49f930acffd574ee8a17de286d70f70f940032c837e29c08a8988bfecb716b932c651899978c88ecefb530d3a7912d7655f19b06b98f0ff581ca65cbd6049c0d1d02737a0d832e06c8be2782b10c9b914b7d198a79926d7b8685af7bdd53b41364b219b793431766e924c66116fe3e16491d7f8047eb3d19370142bc4db7ae54a6b60628165a3037ada3835937d8ca7a570ac0c4dbddcfd576324ce59bce98dd153e6a3b818645f3ef9af1dd4b5ea8aa1243dae784a0ec55fbf6dfbf874343d5e9eaba18870c113f3a9124d605584ca8765bbf30226729a0baf0bd27d62f5671f238c28c00d4688e591ed52bab98690dd09221b6fd035d2f3a25e446adafb074237dd966e926b2141bbae24d0525e896dacdaa429ed7d378030c2f0737aef0751087245129814f55be7b824aba0d4cd7c4a2add214b9f72e1e1d681aa0383041ad821c8c087c9b27f407c4d6505067f58c722704b972242c545bcaa97d4c489e440ea1d1f5e2316e28c4d7d4303cdaa3fe76cce4edc98938c1e249ffb92c164fff29668dac77918ced416b39ad02f2aff3379501636925a71b7aeec111d81cda1d756ae2eb42d3b281eeacff97963c2f0b322458a93fe24d7470e454597699f3c992e8cf047756226f1792614745701153a86ee974053e2dbb34cd68a02bd2f2c224f6739e1ee09e9730666bf030938d62affb9348b66e5bdf42743a50b52741b692a0bce3ab9228cec7a675a94e0eb2e189e870b324b04c52cd781b738f97e04b94869ff6fb1cf9e487461df836d3474971d8eb84a1f43b99f2fb81f1fbcba9f6e6235641d2bdbee313db4b1dc7e2189803e751276990ae63e20c2b9e05786d6ac9ae6e6701e5f6672fe367978088ab657c461105c07b40e094977417e5b3884f2171fc5544a625dd7157a416361791611133591dece679a896cdaf5a19f71270337b18a2b97e1207b4a915ba4e6216e1fc8d4b74886a80ebcb7cfa17fce9849e068b3e73a807e52c68e2eeca7fd720e02e934d75c3d8c6e7b063ab0389ffb5073bf767b3835f5935e23d07", "ac510053", 3, -1097935595, "ce5e4af1d6d5f548149b05c30a2f6b520758270c59517b20ef1f8a75596afe0d"], - ["325f455501afa59b34d56207bc6936c8b91dfa27746c78b748ac95053c2e4e25dec67af7610200000008acab0065006563acb2f012be016f97740500000000026a522a33bdd5030000000000000000de7c7f000000000079413817901c6f4760190513cd9528c741a417b83ecbccf7d51c6b8ed17c44ef34e192e1dd705ea104af272ade298ea752ca10bcee9c4fe424fc9e2e6c5868eadb254d7acb15b6f1fbada7e8cb0c06511d66e4df2f6a4475bc252010d824616800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b9b534db00c6fa16c159fbc224480f0b7f9ea366811c358e309fe538de911221c6e31f582e7b1434469869810f548ec92e7ac8066c669c464c8228a0c7031a036c48d9166a053e0d8903938737b7a068286b5e10b3a0ba972e4e8349cbc12fb510b2049e43b2765093a977b1b8bdfaf639a10663615a1134a8b0ee6d1d99652c02228cf8d4741b87f55d65a1fa06666c5a402b98398351666c287db34653ce20e302271d8b2f470eab8f0bf98549d31bcd556324db69aaf4af9c9a036acf7105435a0a266e3b2d70f14292b0a9b998d251d588ce58a8a2b9ba1476fd24a2f21d5cc8df063eb2e6a658e0aefee7fdd4953f8c2c544e236b61d8ca0bcce02965120342a503231f6823fe73769837e65347fb171b08c9643071851f88de95c508a7db1363dc0204baa492e2bdec14dacb66873fc058f48ba205b8ce6cfa83f4cdfeb202f0ed39031563c4daf3f9fd2b554c070241dae65235178bcb38686f9a8849ca72a1594ed3022f4e40d64509db2349f7910a2c516b2c6fb8b6846fefee23d7e2dbf442c6404e0317ccf7f36dec469df1b0caa1dbf17a44ac8b2f8ccc43225b683a407eaa7c9c62a2d0f95f54701b51f082fda924a9d36bef863001eb5196646d21870df253ec86f882410ed81356b758d52b26abeea40d0d4ae93c07e8ab060cb42444335b7f90793e7803d455c8c8b8fff130ef91f6cbc03268dc2fd19a598a0899801c44445ad5462630c555abdf8e3ba4bf6383097f73af5f1ced2ed1fa472a14c66fb49e9ac0c478c0df36e3d44eded36fdfaa8f875d57cff576e96945421dad4ac3841e9d843d7db74b2e13906677d55a83dc40aff089a77c27657930dc3582e39c933d8f6204a1af41690f702981be2edb12b89aa55551c279cc3ade224c8705093c2b14f1974dd463d79156f9d8a4ac77d3104df7833c5d72716d984ef5ae5f8790fcd154a359c3fc87605c5acbad1861ad21b84466f6b5e26433743a7955df2dffc174a4a8a15fae8ff9e3c671414c5f1dbc0a95dcb1d3b7807e2a6abb0b66dc24cdda8d038c3215425076f05f3dd2c0dc9e612038eaa6126ccc2efb8b1bd5b7fd09356b7c77ca97d46842a2389568ff49585765c9aeb15bab1bbf43dd4bb8abda9904a3ea4ccab9c680961830a427e5688fce8d0e17fc20a50fe378c0c9ea288410026a9acb51a2dacf0ac457d02ed2c7d0564962515fd379854f445c7b709ec22c8b16d5fea02460398ee3414da48fb3d12c0f3bbd6ccadd97c2729648e726cb1988e568ca340ca6547475b74885bf806e5967a8d0c5b7eae01304b2d405c48544c07a369bb4d4ab944f9a1e39e4521c0867745b58df1c39422f603af5e9d180940c64965ad772d43e8398a55d06ae421783e736fb2f2afcfbf2cd1049231ccdbed41ea570e4ea85880cc8163b9a8f90f0a260b7d94fe8091fb4e455bd9e8977dd9028f31326ba30a37eae125c1f60e1b06523ccdbe5f4ebb39246570db177a1e87e4a27b7ff11f2f6bcf8e91b0ac71969b1a6ced4e77baef7916989fe78ae0ca8aa5ada088a262dc1201c6d44363823e9ae4f2267191bef565852e4dc613fd1b0f30747ec83705732b16b126b0bd6c5d2455414dc032efed97973546a896c3c2c97bc61b6ed24593d157d42d467e612a328f7cddc7184127dc07d9fe5c109901a9317fca78a675af0c52a51915429a1a1b3f0b082f44142fb50ee24d1e152596c90670674610765bd797e1f14bdf8f9a83552a789359eec463b8fb7910fb2d8f2d33e839bd2c69f8513d288909e3d73ffa55d64ab52fd18396b4880da89ac27d6fb9edcaf7da1687508641253f1762f6397a916c4c7737fbb276d1c1716608423a477d14676e182e1d84d68463b35448d45f2026627a725e3e66d23f12a6c2f470a03feaeffba0c901687ea43a38478cd5bf2b96869aac7961b3efb1750f3e307c2ff8df3f22bbbcdc2c4563754302d24bddcd60325d750a0121c8cb09ea2701ca334b4a58052fad67d9f66b0d0bb543d1640d14a5bc1cbf14ad9cb57971111913d3db7634cf5078c0877c4278369da2e52030aafa2bdfd5af95d1b758d6d1014d59da30afb32330325eef1a9eb74406863e1aae3d83b76deb59cda3019b124aa67650dc20a40cddedee8d3572070b8be660edf4f51f021ec083b0a3cfefc9142a04410e2da74fa8613fc4ab8eb633b5170ea04d4bf4892cc05c854d859ef1636977e7bf1d3b09e8fe1dcaae139743e134b65bfe877c45457e08bd1d4854fb1339ff3d311748ed94a25a4cf161322a8f99cab192d556a040000000000000000000000003b2f4ff6a7e35e8ea2a630b034a71ccadedc74485a1a000df438d7e47356149e2689e22e5fcbdd0757ecedfc1a4daf9b41c99a48d52ad7ab55d20b28cdb0ebad2c101e9af25dedbe12b463322f25f1b6e342bc214b8002ab82216b56ca71d7c6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008014bd7fbf8e741d22c25db2c1e884e15399f7e28a6e3a02f8d1d53bd830f49f21ce413afa307d1fc8446862694fbca3360010ef4348f1eb258ab002e2f6ed88a2b0b56a606c3f2e486a38634503c9dcc3c766e8a77b3eff29326ab81e4268e4329a1a70374521f9e0e94e80585e3d6254474e8707e61ba94e64ff9af265539b032cff3b11e3f7666302bb1fd4b66b49e1c9fa03ca0dbf9268fd22a40efd9da652030b684dd0ce95e825fa826cbcacb12f63a2871634b14618bdba38676ba3d5a6a80a1a5db30b205f30ef7b82773bc18bb5b0901481809a91f2b18bf5d566d3f7fb920a7f082349bdaabb0f6f90caa9b63f9a66a161af42e255b2a6070198a3e910f0030162fb8793f3733aea3f2a0452a84d61f4a83de6ede7297b9fc6c50a792dea1802204cc606085f5a4e7ae3a9f36145f0f04f0e54021fd6ebda0093d6b48a4e8feb021d211c50e5d07577bc7358f7dc27776647d882e7152d6d05e424e082d2518558030800250b8c5b0765672e7b5409c5d401ec8c9a31ed15634b6f8255ef015707dc032d1c7d8dfd61a64410251fc6b4d4b8463659336317c97446b08d4edccb0f9546fa7202ce447bed2f1e77b7264232615cbd3de2955a044f4dd518ad27d30762c61330cd1cc3773616f239bf2415a0f6dedd10163585d1ec4eb17bdd5740eeccb3f190a4e533a093c755572c0c8447c44a374258d0461b88fbf5400770eae8a6355337fb9e3079eb7c0e4851a9408d628a6a87d503c6e6ef9bdaa6c81edf99e177e7e3b7f123a8e7799443dd067c09bdabf36b8023b0fc0104e52cf4b7289cc13e4a70df9046a662dfa8532a914f4419d430c356b4b95fc820d363d4454ae227197dcccc8063438423cc9cac54a94a05316f156360f61ec28fc72783e3416e4f6dd857199d1b037b17a7be3a6c70dfe761a68077ef2a2134a014bf6cadd061d8c65119a54103e5bdf3d7b7aede6b02a37eff136bc00022971cc394fd1a6444ff6054e4a611ac868503ba9d33fe2caffe865d3c20af2c5a8a5d3b864b6b9dcc561e189262f36191c99db53efd9af6b9ad6156f90b697d244205fe147495dc32d7b511a12a593f45742dc0cd1e6f92c767ce0b1019056ffc406fbccf40d6cc5406993e4008d1e5576a7e59c3a8840680068754571a30c9fa59b15aad6b1902b17ac4f12ec448cd4978aa9dd50b67519642426f556e3fc4cd2ddd20159280a9c539f4f174a7278a7a248382da6396b2ece28793c0b38cab7494d43ee971ff85551ef87d3100228cb7bb0e4a34c3d1cc3683654ac41e13a0ed78ec5549f167cc3e75e99e0c32b4615dbd8cc79f64a624135b21611208f9d3b4ab67945b3dbd99013e1c9639cfc984320fcb10da2a6d24820bbea6af1ff278410bbedd898af0f81342f7f2ce2cff92e373877a759366683145a76025c3ada5bb1469c1a186b524952ea1c6ac5e8f2f763a791767e909689d3d21649bb4c16d576770fd936eaa92241bc1bdbd0f7056454a979a07434e1374c74bf207319d6347c6656b867d58849a9a94ae0ec2a8ed20b9833b483e8def0aeb294bd1f382ca8dc85bff75ba4c49773b214bec82018a58ece0dff61bdea148190dc2573d62b64be373c3b7f36a61cd9fd1788477b01261c5f4903de8e8da2b3c3ba1796773f9e2ff8036991094297a0e7b664fc44617390457f2acda1ed5580c090c0db2a0f645a552fd263c29466a1b84b0395786a3ce5ce9e13824c99b7e1ad99fab7e7a5a31f24747eae7f3daf3ec0d84b25598733ea1a51f8b1e2658f0325a8da94184b839a64cc453a28886d4325271f34e94bc8bba225a76ee3d46a64db623edd204e15a6ce8306b095dfaf684ea9d2ea520e077a77e1752c5ab00fea777ca628d598bda4f02a9d439eae4ce05269b05893a073848fae57f20cad8b11042c232c24427838935055c988cc2b4ed47dc0a8d9a9dd1ce861b93beeb535a026fe04d15ac6f8ac955655f3d8bd1f051e293b6e6b31c5251ffca76a2fd2a6ae607d2f7054f96f76136cb98a115fed52e51bda7e54114b0eb98d95596b86576327ce651237bbe6e9ef2fa570d75c5cb39b5ad5f6aeada66d533c7eae90f964fb71cb04d225572b95e44b1efe1562e5613b17d6e09e316b5dee0b127ccdf6b146b47767d03a02474dab43429ecf15a393fc87b0def431d61f5ce1366e7da79df973c24bc53e51006d8cc73f43f8613c2442b01ec264ec74cfc96fb19a1f0cadda0769279b754cec6b3f918063a8b9e5ef372393572f37d80ee5f42b355bc950f8d6bae6e000000000000000003cac1050000000025031e7ca99afa09bab8e4036302f545032bf2b0112d7c8ad4b0222231e94185229e7c6999531e958aeda711f4ed84707311c2cca1c694d937097ef323f0af07412c611abbf178abf2b56186f073187570bc61e9d7345955bd681d300a40d34800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bdf254108fae82f8f56ae500f60a52b19ad4d862cc01229f9b280ecc0a588a263e993b0840256fc57dfbeafc297095d5f9beb71d847ddb824db064ef719bc4a50993b813dd492d0c03eb9ba07944f2799ef630dcbd5d427ab15765ebc76b22e44b24104d6cfcca7a30884f4a1e2aa0b2d15409ffe6559f8c5e5e90068d89be31022687a5c53b8492f81b5517484046e1626908cac5f4c6ff571285878907c77002021a425604910a417d0c0bd315d5739f56c39412a21adbc6593a834184d0ac93130a1c0831fcf22f83d8e2fe12bbf5b30dfdca4660cd325fc7240f3f97a6f3600952168a48b9e2ca4b4b2cb2f0ecff61e965bf3a7efe99ea4704ea3aab9d2588c76b03003d8df27ed4e3e125219ffc8bb54637479776bd56d45f98eff1dfc9c50b2f3b0221e73c28f0f46dd89f8fd2cca9979b4142af7cebd54a93dcf8e0e3c6d0625290022797979639041ecf9773888d733229b116fad24d70f6d714d6fb183b86bb5c9a022f85238a1885437f0c9f4e4b969a77d034b7b5b81da76b40ba188a7992fc724602302775f0d7bd63e70d9b4f18d02856e10b611840433929c0e38e02c407008f1c82744b320c466d268851b93392b88fffeaae42e3e40a039e094faac1db76a437cd136050a8cc9bc017d79fbd7f4e5df406f764059b0c8be9ccdf4410e9da30d5073ddaea386b0a8375b86049f8d8e717aace13102cd8c1c21eaae6c5f3bea72ebd5d0cfc1892d6a01d5c966e26f8483fc5cbb79c0c8fdc7849ca99c563b331c420ecb5bbdbf88003acbbd33c7d657982f77d6b57672ad735f658027b931207da8176bca3704e5edd183d4ba9770a597aec8424263097a2d6abd3d1073c473bccb1dd26330f7c3c7413f6f43daf63d74baca3c20d51f25c81fcc8bb2cdb1102df73d8ec13a049f1a063366c46fa3ecac55889e7fdf3c830fe21d314ba5cf79ad35043951b613506becb34ccd854384a976abe008fe5561eae6b081aeec8a536e642a858a320efbab8fd3b3764df12d732be2d7b9dec300571b44dc34cbcbb1691dae597f0e9f4e3c019987f3e04d41024d325d5b3eb0d7fa7aea2d0760b140e3f21dcf9b44ed21012fdb16420edb9573685681fab94d5e2792fc2f4b260693fda7ad5f054f3a6dd24eff0eff16b22b2571a1bb1eaf321fb01808937537efc7b8d3b439f84b58abde01dc69ce3da19a25f894396a0dd8dbc9865bbfd72cb52adaffb6b3b7ae4c25ebff24efb0ef9bd65ce1e407cb280ba03a29e2062b8d796bef73621aeb1c0ee7cfb77d5b1df64f3d9e7a438b8ac0cd02491e4da4abdcd990d9b0002a63d9c24c1450f85ef96d1a61faca03b0fdfebfa4fffc7d2e084c7b070c9ecf0f499fa937f6af9e54dc8f9f9612e579185e14609a6ef7376917d60bcdbe7daecebd7c175675e8c839d672b1feb7f623815af7005616576eee4392d1f31f9d3760d8b079acde637d66d858cf7c9596880e0a82c8d2351206d7f71e4ccef070ea14365a81a2888e8ad5482335770d262c8ba3c8b44fc486e5ed1a5de63802415b621b82184be24213c72992330c93a7959a93705f7f855d13d5967395ea99cf6974c8c13d60f95d1c8d5688085832e9e388ff3aebc4897275c98c8c50974167a5285459256beca0b32da4456cc15d4a16be6571f135d440709f43b03c94a5f2932d9307a5800da7fc5bc2bceb77a95c5cb8cf06847e5eed64535ccf7cc896214fba46f8fd10e3cb00955a9b40074831b5ab77b3c05f1824eb80641e3362af59b800960ffb5e5b44de302b3154d3f7d11185c2a62c83de59952b140bd73d57724f6258b781fab216b0439f983a89da4f8882f6c8c850a42e002321fce93bccd4037bbfa9e5ed538fac4ec0dd3e025ca37a9ecf231ae88434fe31163c2707b98b776f6fedc7bb3e501e450209edb31494041721bc3838079e718f9be043ada2619ce63988960b84d68734e6aa945aaa1237b9d7e037b4ae65cf1012d88cb073e307fa10b550d6a5c1c43b65026f4c02b80439a6a32d3f61325b79f72a61111a1c4f158540164050b36a5bea1ffab666cf086643220ea57c69c9600b4c75d1e30e764e9bb0314ff32feb2c253381eef1d3c554cd908218782f66c9ba53416729779e73d60e88900dc698ec386f61a537eff9d3444e1cf2422e11ba5a835e48c61bbee69213ac9b232a793bed092f5858a43af8300e47cdd4c0e58cb705529317b491171685508a3c67cf0325bf70907616377f090100478445efcd9cd795c5b07945a907d75ed84a97c66a4a257cd91649456fb8f9d04d26bb10f5de8cf45b48f8c40a741f89d99ac18a268fa3ff2727a3d9e579dce195b0238d00a82ec332250aced67c502d2b8fa72ddebe4067fe0d7cb227250d3b760836d66ce43165c126c6fc50153c254ca3e0358e23d36e1c829a10b", "", 0, 903307813, "7faca3188962cb36c245ed8ac22175264ff732d0cfa840883a0fd76f3c30489f"], - ["16168e5604f3f18f9f95944c2c7f614796cf454e347ec2413807fae3302c568c7df0644f860300000008635353000063536affffffffd1fb1f0fac0af43355c0e21ecd764966b45b116e86c159e6013781570781c45b0100000003515363ffffffff56bd2ebe1470fe7efa49774e289eb7fc8e16e7003cd2e0dc127928454c3b3e190000000001528ab954cf834925d15108feea22fc117dcba7aac68cbb8bcaab77ee50112b1cbe69a855390300000003000063179bd79d0274c23f000000000002abacff550500000000000365ac5166020687010000000000000000d0c55702000000006fa58d797cf9323c1cee9b09fd09aeacafeb894815465f0ae225ca3caf671dfeb7795945088b4b481949814e44a667782cf7c56e2420b24eeafb044d10d8e81948f915c4c6a317706ae3a49e149a257a183dfee59b205a668d8cc660ad38a11b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f447d0db0071712b4b0c0fbba0761d048949472956b9e0a69bbf3cc330d101c1f6109abc82c22ad03bec0b29c48d685c6584637368d2bab93ca9c7e5847166837683688d8dd7af5a93a061920d3b78c6a8e796f31d35e7949b5ef197de73355b601627a866a267eabb812a8412f41692e1bbd62075cb5b5289630c254c101078031a408e366c3d1f0f12293231486970808863a52032eb889d2a308916ea78f14b02112ab1b4026e6966634362cdbcbba7b3726a875add9cf68ccbc9486f7a8ff28e0b2042ab9dbb7b7497c2083f759ebc0236c7c2ee83562b0af122535f1970661fc009ff7605119db3bb1b8d7d2c151af28f42f6aa9e25d12162bdabd60e744257df0219235a7786c9c0fde28469e438b1c64e843ae876866b4c9c55a14eba4fd6f3db032238faadff841170fc09d67763bb5eca136be76aada088c102b8e2bcc327a9c402107f96a8a0bf0799b4c4790909b01c4495412d004450939a7d6334d2b9d3b2870225d6f2cc7e578473083c1d34cb9aab03f56bd791771c81fd30e7de16d7b7937602200c3790131a2a32829893baa53080c3101f3883cbc4d1bd922f99d603ad741cbf347eb32e6050f16f7898c969faf0b10229c8cf17e1dc47fefd3af0212cc3bbc89364fb21a2e951a75f75948bf4359386f23aa5bea2797034545d9bc6729ac8224ab37fc06caea3dec0221d95d9af61b69c66b9b8b04784563c85b46b531472244c867e66ba44b274161fdefd5703fde7650689be7889a830eae605dca322460a297373b3a4db53a4c7b23c7533c044cf7adab1387683be9ad9806f5d6aaa9cc4f44e66c4b905689c627021012c173a03b2703578c634c491ee6e21d2da498f0b2d62b0eba9c6184d3fc1bb75c2e2041e68511b7cbf2daa78d2c7e5d0365382de9238347cdbccc0520755e685ea10bd415d764e89df7be5b03a56c16f1c23baee2a923e67ad359d2e6eaef397145acf8dac59198bcbd5e1aebb675dcb6b72db959597bdd61a8414d1abeede9205f7b86529986a6574fe91d35d1900ed7a0bc9c32789d20bb61ba5090132bdc673bdb28cfbbc9b8213f1f7c96bd2ae2c8b4b217ea9d2f5601616b8a7651808832a32bb0a0c766c1179fce3b440a7ec7649149ecad0d4eb92444ac9b63d2d288868589656b6cea5638dc0f1e427cf512b1bc7a55f6f41b54b672ba924f622d3c894dbadca33da0439ec5240a13d5953c659e6d39f4cde70035ad19a0b291058d5750e5252a29500192bf456be9f83dde561009ad17915220c1c68eacbdf8d71be17d4beeb0f5b6a143d46ef2f1665f36bba1e9534a0df4e3847119bdeb5be0b3f1d5d0dea8358774f09579aae17e74d81f2fb5a2113b5f1fceefc027cfbc7e4e4e6b4b1623593863efac5369261361fb23c63d48e6fbc7e7919477b7ee71561d447ee2a1cd65d608c383bb45de7fe70298dc77e30fa99850dae100e4a883b77c4589455f45e6e6ada287da8d5aca850902a040cfa368e28db6420ba7bd81124e695fc334b6d665b704ad48264208ffd358d5f9d0c5bcec817c63f581d8c444a1e55721b4fd90aef943e326f56a88301b9d5b1c9b68efba26ac3e6ab9c52b6f7efe3f40f5f13548eb063a2c2cd05cae1b5d2932d8c7ce9ebccd82a0596edface486cab83a5625e362e97e13df03e0e5a7c13ee769eeaadd601aef1f4440e332642c0107dd934337693433deb41915c401eb99fa361ff8f18cac6086207797e8ef5492ee44472c72fb31e46c563cb6b57b44e4eb5818fe4aeff67d8e588360d83de5d8a45f53226a3b813323d96222eccda338f489d4e40a48aff3815f48ad96b533a89d43ecf017392bfe7f1fbac2f7c3bee788fbf43594739f4761fdd4afac507318fc0a87d948de3e8b966a4015477959264572e15c89d955c99df13bb03943c27908a2ff994f74d1bb6cc0ae3036f46ba2769ef72f79ba2d328a62a45257ec768b28c5053bc068b8327f6d253cfe1cb5d24cf216cf393535aee68b6807b3b5edb4fd81774f1ab590a91372acd1407f39840626b5fb45e758916ea19b53c62eb03472c139a76947c75e0a8b622ca72feb4b1972691dfc763cc0f3192698cabd52bdde09b8f9671a93846126305fd153f06e41d8ec0e4702188f2be3a13e529ff0e6238710ef71eef94e6ea45c062357cb3d65dbc6c78bffec437bb39a9afe75215f9e950afce606df5370a65c7c49bdb3b9f84921aef36e246b80a99ea7f83ca4c5f01af231cb06b4e5e25db5f96b61de6de62159192e45cf44df620430946557ef900a9231fc2ceddadb79e7b788865b770fc3112cece0dcc21c8bd6dc81992d596cbc45392ee95945973cbfaedfa7deea247561868f869defc20b80486494b5ca5b11598ca816959eee32fb67c7d5dc13a61984db654ef4029719a70d0677ffe79db8b0c", "00635352", 2, 1001794760, "4fc778e0da9b4b3ce1649e83df9855385b44b188627f0e28c980d19ab211b05a"], - ["2970338402093b71c16b0a23c41a448cf766380d046ff060566a35097cf7c1290e0f4715310000000005ac656351abffffffff5d23358c08924835ec3a876fabb14fadfc31f0f687f1f879ad6b7836eb4070b002000000046aab6363ffffffff04cb4c0003000000000852ac0051ab5152ac1673b8030000000006ac636a535365ed1da003000000000852ab636365635300555a970200000000086300525200abab6300000000", "6565", 1, -2075150975, "d4647527fc5dc9a6019cb37f0020554551657189a61fd84387723294970b8a5a"], - ["9ffd779002b4cfcbf880e28a60d877abd9550fc87a1b25a257b8ee92960fbee9a572c911b4030000000200abffffffff15cef9a7bcda6885de240e9120561b01d7d391307b6eaa8879636dbd8db99582000000000700655100ab53519c6b238703c810920200000000066300abac536abbe4cd0200000000036552ab1585f10100000000090000ab525163ac520000000000", "63", 0, 340739621, "ce554b552f70d3a699557cc23e36aae4463c01eb6096d97f1659393369bd07c5"], - ["ec624ef304eebbabcd8f4110e06c12baba3b09a13e6824ed3fd3e750c2154d01b88dddba14030000000653ac0051ab52ffffffffdca2010a69c6e499d0a3084b9587c17afe85b272f3b7f240a41aab4ff928caa40300000003655151ffffffff7a8bdc820666bacbbc7257049e79a425b2f2d1015a21f8e95586aabdcf671be301000000076a526aacabab51f3bc1f829ed337063ebcb09ff7894a07098d7a6e9f9e8c885421074177d514e181e219410300000001acffffffff03862ff3000000000008abac6a65ac6a5163be13d803000000000853ab0051ab536a51d31f9303000000000953635163516a5300abe6e5de7f", "65515363", 1, -259701290, "4c1c0c3452b6b1ec6008d3701b68724ad8b9621247094c31beb9d54e0ed7c252"], - ["4588794202b8043ba4a721e03bbbf9691e14698317bc37ed49459ab67d93293a7a476a557d020000000963515300ac65ab516affffffff8cf0734111c5d05d571941265f588cf9e0a8c395573e0a1cf96f5eb4ac08b9cd020000000563ab516563c9aacdcd0326548e000000000001ab0e7f97040000000008515251006a6aac00e9855303000000000463ac65630000000000", "00516365526a", 1, 1014952118, "10d26763e7f0c573fddaa0af979a6487893381e3f877e25beb6e2788210569b2"], - ["f3d8d8820122aead1599f08730bb84e4615c58e9d8d19b27d4744779de21d8848ebcf426590300000009656363006a5100006affffffff01b0b9a00500000000016a00000000", "6565", 0, 1627452599, "df9dfbe0523c14792369b8db42c62b8b51889f7cf358144f5ea192a7d28c840b"], - ["730b96f002cc3f4c89ed24cbfeecbc1cde91428ddea1d437eccb01401a1d75e26da34ea4e30200000008ac526a5353536551ffffffffda6e50d6b6bcf7b8b227fdf21e9228fe65522fe58780a356d7f65dce0561cc290000000004005352527e8a1e0f0295e6c1000000000009ab65ab53ac00ac6a6a5a7dd400000000000000000000", "535352525265516a", 1, -794700861, "a472621c06baa06f032391d1c287e1dffc355ddffeed064aff289e558b156249"], - ["602aa4d9047d93599fb919cc55cb861bdea2afa0cf0a3113d080c9e0b31a714ff233f877110100000005ab65510051ffffffff7166c368d4c5b31a34f34861be95a14de71932e9dbc229c79cbf17eb1cc5c4690200000006006a63ab5365eb19f32f09a02b7d2f776e13f77ae5a7ca7362ce39eb242382365eb198228a8a06232e8b0100000000ceaf4bd385c841b35f0eaa68c897a6fc77ae8da7fb0953cc88387bba1822a41adb6142770200000006ab006553636affffffff03314e3901000000000263ac180f380200000000046a6a5351726045030000000008650051656300ab6a00000000", "006aacac00ac", 0, -1388646795, "950ad71d30c89ea92a671cf75b8648a19301baa0585123633601ebc7a297fd60"], - ["e3f17c6003fbdb73ee4e785a840c95bdbb671dd3ee491eb733e4fed535d6c300698f1255540200000009526351abab63656a51ffffffffcbe2eb737bed4af394463993247bc9f403ad827524192c92d97078580791cf9000000000066353655363538dc6ed03fde75133bc0adb813790232650f1e03a0b2059de9342dea919b5bc3a7729c1650000000008630065526563abacffffffff01ce9bd80200000000086a6a6552ac5200abb20f4d0d00", "63516a5151635100", 2, 1131340203, "1e88ce1b19580f1d8a285df3b620945ebcb64d75dc025c25f0ddf97e14281b00"], - ["4fb51b23047d4236e833d3cf70d65c3df208f45afd36c581e3d832b4c100cab5a57b875cf0020000000965ab535200ab52abac4d3727475cd781d1ee4269d999a0a54ca1641ff57e70f6e42be284fbd2942eba18181db100000000003c6627b513f340029cab17cce9910fb485145d9e18c1da80a53163b00056bf5b5e5166a60300000002516a8f68ac934f9500d71ce1a0b55b5e4f838222326324be16f253a81af14da3c2c5ef50478003000000085200acabab52536335b88c7e032f6f4a040000000006ab53005265ab953bd7010000000005ab51635351b11d5f02000000000253ab0000000000", "", 1, 259841327, "c462ef448b54e7ff807cc0c7d4bf4eaa28b4ef03dffdfe18d864ec0379607d53"], - ["054fd8220111440577303defac7dfe3f2a44153e6eb2df8a8643e5d64c30e8e06e67928dea030000000200acffffffff03a22a790200000000076a63636365526ac2d84a0000000000000d345702000000000152e000e11b0197ea200100000000000000000000000049dd97c238725120df6ffe847d8b475b2bf83b235ca1326b052f77e9fe1f5362af98baa95c9795304432a728f450fdf29e673afa67e82b7f4c4af85717d59f247e969fcbd30a4fe5237a0110a8c178951c58dd0fe9e6d763bc3cfb01d99f135800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000206012236dc9b4157aa6af4c9dca2e2ebe6dea25497e44e9692a4b9c3aad507181352da129995dd75dde219d2d3ae883e81496ca9f850acd26a803fe01b0bbd10d74ab025c414f2de67abb48ba71c0d82d0fd2c00d2ba5e8b571266071872e5261a09ca530326da5a94c428d42fa16cf4d75b86849a1f6dcc86e30e04ad3672d03096baa8f270ce36d9974216a51ee1d5638e25e0d98e083fa7278a234fc1220e5030b3dcdab2e0ae7954868638a399e8b99f84f67ba1a48ef6977b5f8a8054baa4b0b2122f049b2a10ff1ab0a5f80fad703f68d01ca8a7b21dbe0ff90a34a10b64d12007e66db28fcfef476d264cfd81a3826ac1b032d2585a3b4e23852e7508dff9b02278b50de5aeeea5e78d090fa1b131aa558ef438c615425a9314292b07d21da1802134f99b58a9af5a2b296a76d89660e024a219ff9fe18cbc89cc040a42d6eb2d8030062e7573fa5a2aa0bdcac77d9f65b8dd06851edd834cb2b57510dfa55f8f2d70300e90d5b44fa86b18bfc742c35650a6c9e7cd41e80ba46721e18800d4c5b0843020de7d615f3448c0eec49f38fcad618e05ef3e691d3f1913f7c4fc34f4ac1f0ff20cdb8a26353a4b12915a58610995dbdf34f9c193297aa3b5a0f5b01f05cb6bf67ed5f41460c23ccda05a428404df5e48a55a24f7a54a74f78a668093caeff6dcc312c9c36ce6cff929ef98de8290994981d276ec23f91a614814c06f35faa292f527906379b0bc07e918d403dc4adb43b654387cd087406d66cedb1472e3c78803fe1618d2e73799d85143b85fba3961544c51a996cbc4391509094be6d3d141b38d15442cd2710fa5635ce07ca3149f99740bc1670e00e542ebd26d95de5b774658b1f22588ec91675ebd86bd47fb631d8669fabfbc67b7951118c538e03c50d96b26bb118697f43895f44ac00a29226aeac0c0279fd1be88432bf1a2a372c128a7c59b8f4cb3639670430e6640ec97b3b4b70e9fa981e8f985b5d93ba98e00a3a9e9aa0796e16926b9200530735ee76fd191295d6380cf778ea2243d9fc8a8b65b2f3c0d3ffd34dc64032296f15a1d61459bd518095f01a0e0c6f49fbf3e88b4a3806575bc1ed52fed382a0ab7dfbb5d98021bfafd9804dedca928d4c9db13a51127570eef4e2854f1148be70b0491883e9f451799bcf7f9c2ffcfd54fd579937aacf4a8924b039d8703398e0f94d3ea31710ce5f5495defb867b076a958e3ad42685a9bdeb83babf553b31649a40c8cef34f8296ca497ee03172ae68549b727c2d0cdf6960d57074ab507d3916c305a3e68c23ac6673019edff5551cc75596d5c94f9736476c524e3283231bdf36b3e1a2b08b494b8a87f1e31e2dd80650e5573baa8db3bc6895c8662260e73380a9b5fdf13f19900fb9e3ff5849b3d0998e62d6080598d23ae8b38d9884be12336b5167f12e5c6f3cf735aea9c2bbe5fb54327be237608b992a7828bf37dba32899108665adb4aa8864d64133d22d79077adf87a9f8a350693bfe26d68cce1ec344241797486739f5e05cd95543fefc8428d8f7b1919c8eebe9d19a8e920ab6b263a9c6f856d1331877889f6f5f479b3e34f6ebe03942592e6d4273c485370db2634b9941fc000b8664d3703bf131c8ea461dc94bc8639c9c4dde4ce040139baa2e65035be1df642f0be20b845bf333ac29d420b3beb50df165e25b3f019a44f7d6704b2b776ee9602ea24f9e475b708c0a842dbd5fe575054123d9642b903e1b562b95b127de8139e215df60ec83eba1f95a26a9f89f771a787f7cf6221a08d8fd23d566e20a2010ab6235b10d705e5e0557427dab664fc519d8d25e06d2542700906304c6f6948aa55289b1a029454e8cd3a7523a140b014d4973a0656fbceff833b6c8495a62808f1b54c18a72dc5f5bd82e7ef4288b7cdf66cb33ed12f7a3299c5bf03b10dd13b2121285df8401cf5e0df1eb3d8b4f76d3e05ce9c3f295f95bd7135c796986e6c645b04b3546249ae38fbb85c29426fa2a4cc54cd0b77a202d03babd74aa60d507078b84d0ea8eb5d85a86968953e663268627c01998bf1f7421452a88c364f976396ce5eaf520d7f7d7f1f58fe26923906668c8e0eeea24bf7e9a9339abf8bd56441d3999ef7a2b5e0babdc7a319eca64dcc197493fb047daa9d0e0f231e9f006dee4815fb15a6f4eb2b63732afa9e1cb4203e2b2d98220aeb0fd17c54af33350958561d612553a283b099329029b80162bab367eae5f97ef3353062521f294edf5f7994686faf08130a878c1f66698e1f99eaa1f89d19defd7f8217a5b7fececf8202b970c49e286c566342d0dac611f82a208a3fccd6a3b3c2c45cb402f11eb5ea5c12705d987fa4c3d2e18bb660ebf3b00589e289c080c29a249c9d7e5cedb9e50c4a02a91dd7e56a59421c35207431c78135dffd2e6ce06", "", 0, 2070529321, "f16c97aeea9638f40efed010227179bcd6befd1430a2d5f566d8db475b87259e"], - ["9815ba3b0144295ce0a97a2e8b341b49478f8486ce4dc50d24c1977a9bd4de84b245fbcba3030000000151e20505f5030eb86a0500000000075351ac6a535263172dec040000000007656a5251ac65ac15426203000000000055ab1e740288a1ed0000000000000000000000000022075df33922e4a0d6ac332eb382222b8f9cca2cca91f406d64e6f996e751882caf34eb93672baa57279930dc252f233a127b02af5934bac8eeddc9ac17c39257dbe36c7e631aec1671aa2d9795e9ede40d34bc5c769f588e7ebfddf228be3c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050ead43b1b21955c190ee223074020543005cfa16237b69f2c7d2008bf56007bf90c46b0218f3150866762750073a306c3875f156a2ac23f2b9af89cb1d95fa9603392f24136b8e7f3372c24be1bec7b26a4d0adbd25c7f4b991c8982b57eb82efa20821614d9b0165c42f01524d661c3e2ae52c249ee0d1811b7b95753c41a503275f6cdc22415e297ed98c7a6514fc96ac22ffffe76847138594426f41d317640300d5ce107e1093ee69e704e249aae9a03070e6de6dba62ea023a734d5ddbe30d0a04b351db11a1284d86ea4e886842d10717e45af633c4131b5a4029a1b7c31bde0742653e22c27c63ec2832f44d6405c450254d3e5c8aadce942bc8ac9bece7d6021ec545e3ac9d0fdce35fee9dbd83a4b02012b7dd0c11b4a87c3b92ab94deaefd021229ddd27216fe70d2f990e71348680302ceab8573bd6c08c3a731d30518b8a2022cb1ba8b3e3a8ea2f192562db1acee61c2d4ab7a26654a54fd77c4a26a7e2bcf021404e30ed0eaefe30e3e037b133c37f616eb9eff48cb044714c67b4f5b5d79130327b7a585a124f9db529e30cf17accda54a7f6493eb5bf455a64b179558592550e7a2ec04fa8847b950d8daed968fb5cb634e24182ced22d4a9e73f88eeeb2b8d9b93dc6d85b2f7ef0e5afed3500978d3c9c554d9fe16c21372fd38d98dddc2a2d9981db39715d9043e5e9cc257c878f1263b844e54f31fbc8ed448436e4804a34c63de188f26551d1c41826ccf23f76ad6a53364fd8dd9b463090ab45b1c971e8a5d097e46ade38075ec9edf81ff463e3113f12a875827abb364b08e92de2f226aa6afc6bef186593f92b6c86d06c86896dd87379b5d098a3f1115b712ba888fa99cce5d37bd11c17ad6786d9cb543991a65adf88417d1a6abf441bb33185cfb9d1a477577d203da4beae0b2f239165e6eed7f8c4c0a6fc1ba4274f99e22be26c1ba0d4377b9fae4f86434bc8ae8eb4e45258f4cd22ac8f1cac2f35d0b21fc3f4dd7de661ee8de4fce713b914ae83119e24107558582795f1410c9c6da94b77f741da0c57fa457356e54c5653607b26566a087e66a87fd0242732e8d496b4bb990190872112d7ca8c3b3995e05953438d64032315ffde74d195dde3f33efc684d11357b70b30d9815379fc2a29eec88d6313d8211d55634b1b4512d40b917eca82056f3b90a3c9a76b773a61bc962d62c83d415922e01a82acc81bc8151710910523e543af91b5fcce9730952ae25a3c199ff60a47964fdcb283414d7c748781bad7c07cce0768234743d7e80cc9e8044cf5ef78f2b0d0cbbc644a40dede16d5d370825e8c489af06a507276448f0685fe4e3dba277fb95fb55f61506590e39c4329f84b00cb30d1630777b6fd080304f6375aae081f591d42603adf7c67391c62eb8d2f5a6d8d634c4551b42bd884ae7d92aac1a7b08889a254943103ff067f8f60f5314cf07b8936d0f60f8595ad88f73e17ffa10431131e81e5ae81687873f95b54a416c253778fc3b11dcab99eec2acec7fc9f4d039662e8835def6124266c54f2cec434098ce9b08608d24d43980646c294a83d217bce444b866a5b942be465f42e17776358f8e432ea91417415e7f13a58fe688b917b5151a30eceaddbd0a28685d11ab753ca308705eeb2674aa6e6fb62219225197079ccc45a78b223a46a411946e047d0c6f7e3d2bc2503e74d1680363d9d52c47de6e7e5bd892b807cb1f93e84a50c5834524e947dde8ed6166f281a359baa10484122d3afe76c42063a48eb296e061be4ecc368959b7f863f0178cd242f4a81e48dd01d41ad76852235375774ef6aa606cd4fc5f9024a57658b8d5ad54740ee603322ea5edb546e81bd94c2baaaa08ec096af21535b52e09157160142a01136c71a9190ce0005d0b3969bff42d15a24533dadf1e510ddfac8e957a89ea449ee652e20588c8dd11bb6042e4a142d79b4a5628fa3f49b661c613069d56a9656bba77d280b8bee2e8ba5e349f370861be3f9d6d488706eb7c753972f1d6a13058faf90c4e37bb69a248ea465f707654444173a6f7a2a3c7dbe4349898ecd19b6c0b3717b6b416dd694ec9781c38e9649fa857ac163f5689c2092135190d991fa1b6cc52d716a7712767c925edb765eeffd1646832c6749bc2697cd019f64afd472c7c7bab5305669250ff6ea085655086689aad3378315b98425a58341da93d9019500c1e9651cd78f5668ddcf4dbf10ad9cffd9c39f3ef28b89ff3f4941bcd64d182b74847d0c77cc64159e518feef7582710a6b5f8c7fe038a0500000000000000003e0bab0400000000a4bcbb1db2ac10f645bf09f7eedea8fb85e7cebf9719edb6791c1b264f1351806f8d4956d8732ee81ba73d09480b402ab245c10c4bc0f396ea47c0d09e82ec9c4fc93dffae8cd4870bc22ff0d3fdbe22bff109dcf0f0b31f58ab26734039dead00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c31b5bfeab70a89e9f1a2a58992a0660d2e72e373b1cb6c3f0f6ec8077dc36f22af39526c5f3b6307d8246f9d9d6c8d80a36f40ffa5903c819f88ed3a44fb349f5b552ae2f19e294b36066db4dd95b9bbf6ae08d501426c8a984fd645ee83226c9087a9449470369fd6c26bb924a1f312e0e5a181219322d7c623bf0740e554c03234b1e29112a734ced9d078a18f79f1aeb1ddcae8f6b7cc9cdefc41f97308414032aab2aeba9576ef162968379750cb096fe5fb507dcfcc6acd8e72cea7544907f0a287cb271f0776d2393dcb1dad076c4262cb7f4789c58f497b6fb959181f027e808af5752a9e9578f5c7fe174d41cda6d4b29bc3d4edce73ca9fdfdcb9a30af91020dea01afcadb2823713553deb64f478958593e8fbb19b3cd6789482dd775f3f2020883185705d8e50707506aa9eab8071ecb55a0829f5332f6959e546c61ab0a2e0221d2daa49e3dece8298214c3419d8f6050970e6e76e4f192bf6ff7c0240ef529030b8a8d0b7a6cf9635453f47e306663c2abf62e51f9e04e8bbe7c6134f9704751030a202799583d9205055c081e9cd9376af0b1dbe5fd53cca403b00db4f19398057ce89f4f0ac016c90dd76e4792027a314514890332d26a7097f65d57b1fc295934ba676a2d634c25d5897acff070e1cb9f9d0355e63c66872ddd2f29cfa70c29a1295ed0f769cf0da02345defb206c3f56d8aca4cb45e2bb2a81d6fc6317dc5d7566988667609bcf1110600a19474c7b837a0a5b611fcb7bd4d4f448db020b938d512eb91e8b428aeb9c21bbc27c3b826c57fe7bfec9728b9c907b6f81e1c6cd37ea6463d86e80ea57af2b18605d9f9b56d9ad5dd7708ef12a3bb3773422329e470403c39ca62e6544c143d1baa7624cd481910bd40058c2ca219e72f7422a21893a726f00b817516c7150bc7975ebacffbc816c8690940b3b2179da72422b45867651a547ca4be25f43157a95cabb2b2cf5c9d13369fbd79fb8e40ac2c998cd0cc90037a43522244a449b5e366b94acbdfb314bc5295f7155db597ed59c1c1ae442aeafc1110954947759c2b4921062b1e7d84c4fb2f886240767aa3f858bf145b33998281b417cabc66b42f0fa27a4dc877ff9448257fe848905307b566b46220cdf6afac309821e063962f9f41a618d0b217fa39971d63066a45ab43f5818956603b44ebded0ee883a39a46451b6c7588593e7517848ffdca0b4b341c1857d732ab3f67004dbb30c7de8474e03c0df346f97ba5c6244f0b55a637ddec3fc22538c4d810e595b96de3ba11b2a68db889abc6655c297aedc75723116244c6deba23a57aa6c172004bea8562689578edb50308d2879762931ec43aa7984ef7f900e8663f64ba863dfde5c6aa57f0461a8e77901b1eddfbfdd12f6edb783232b1807f6d856ffa3513ef04765f44009b79d64d49ce42fe4fa7380e00704aa0832baa2808539ed6ce68e7e528cbccca6030e8c06e84c17e40c4ffa4d07b34151a9b3e9c13e3aa051827d830fdd774cdb323ed8c24138fe75c85522f600814352ac6e0b9282c0bc531b375feb94e3e6afa82f63799463d3639e57763d24561b163bdc32eff774c8794f9a4ed53426f130131aa6ccf921fa874a93569b866fbfa0e4c7942d8451ff27904883ed569cdb6070329429cfbde0a7977660b6d911004a3a830dda189bbbe703e264f19338c4e919db148e3a05403b8a803edf45199b505d50c360d34558c2c2c9dc2ae60838dffb3b9e67f03972f27082f62777035fe4e311a1b35a364beb30459f86934efdfe42c237d6343a46065fd68858eae73f060f88421cc214ce723c3419ab468ebb2524838626857a0a2f20f33876bac4c444d707da115cfe83374a3fbe421c8619826b9b6e513e3201c0f2e9e7ccecd637531a17a1db1979b3167d8a37f50da5b0f7bf5ffadd85923b6b61739ed19dc7b239e0d6dde28488016d7bfb7f8e7a8ec60ca9cb45ffe958b1d0de14d6cefc31d2298966d008bd6b8a8aa5c8db97792cfcb1d156da3d60fb03e3b49e49fd5616d262b70fa04c1f4f28b112de223d88de5af7710ae643d11d709701acbfa25405321fcebb72c8cc21f5923dfbe7cd6243afdd0f963212f955eb716e55a88708c7ac39aa98f3bbd80762a2f7751df7751e4b3ab1896ad9975c9c73e4254a66935b2602923bd4029d6a6bf1f78739992c7d8b0a8634ab50df74d42457ee996dd8c05e8a2c8ac41761350a7ce29229065d6ab60a989d3b1224099db41c14013da7c3f0bd589e8cb84438c1e77571261226c3b236e25d6fa51d4e99c873860ec13aea4ec7089aedf711b21efc1d1f58fba49057f0f6a88814b2a6c5c999efc5003554d66879c2ab2feb13128ca77fb996b162d58113deebbe02616992956da5b436ceb199c2b4121249467def4abe446cfb38592a32ceb07", "516a5252acac53", 0, -1253002160, "06a11dd91b01b190705f37634f66466ea26b18dd95ac3e515375c64aaabef459"], - ["2b5c6719040c3d261fb8f6cce1a8f216d78058d63a581b3bea34b19030d15dd74e892302d9010000000852abac53006a51acffffffff02ad7ac26fb207e1cd9161588e364f0e77154f5a9581b087f544b99b19e4309f030000000200acafce2aaff20e1f4ec89f4d7688242000abf9c4843034235edeb2565f8089a11011ccd70c00000000076a63abac6500acffffffff94bfd1d3b3ef1a7334e19b1f7b7a9d37c8f4da2c4ae881c3b9b1dd7482dd0d330300000008516aac6365ac6353ffffffff0308c3bd0500000000075353ab53630065d832d9030000000002acacd91e9503000000000351ab52b759d631030000000000000000ac69220100000000bd69db426809d6840a4469cd58757583fd0803452fab79046c96beee219c38f42e643266597bbbc2c838054beed103c400d36734c295b61348827e8805c9172efead005763ebadbc24ac1ade27c62985ca752c3e6bbe26979e0dce9b1d4ef07d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a3d6fee38affddc2c8d8f99607ed97a564c041e2c30f3ee203868ea86f4b5639b5c6ff4c62a31c931926f19fe434e844bf2d8b71a8cb16aacccfb36d440bc599809063eddde75b91b223a2fdbaabeabf6960db1743765a577a281f4c74bc186d82385f56a514c2119e523f307a11d280364e6c56a53408a8f29045d69c68d4a0321a702999605b1c810f3b750d12a82601e305b22329adc232615e0bb7eef306f020a5f10538b02841d02106508c28b9f27d58eee4ab0d2b13b4c11cc53668fe40b0a16e8e8c1c934de22c26e66aaffe74f98f8289f1c61e015321c739327c0b6d0450cf636e51bca3cc513114aab0afba049af60e2c6ddb69244959dc15f9b388203030b1105860293ff7b61563793fdec62f1d596a57bca347c92dc0576deef96284d0325a78fb1b96e898b4df7e331565ed41ae79f917e949dc0b532f32b8fa77a95a0030208b2b36ec9267d438bfb304cbc76de42e31b1283f21dfd2daf9438f73897940212ac7d3738e41e16e7bea844399aa7912d68022e18a3a8aff91db47a7b70300e0216fa509b4870e7286a67a010ada141b42e3267cd328b8c8109c9e64dd841aa94ea69dc5365c143fa53084ee32155a74b2a6bcbf4533758905949c10b23ecea30fa300d9c5fc5de42a7ca850dbc5d1ee9cab7e94eb391725e5b79549796a13ceb4abe4bdac5d3ca79ca8fbac370a41e27670f21595b5ab5fa79ada67299097240a19a8441c5345b7dc9c9b5cfe10114f38fc6cbd341273ffe208fdfddaf37914570afb052930940d4d70ff3d3947a24b36dddd57676647572a3c506542fcc8ec060fb5d4bc858fe26db921d94f51c9eaaf6ba2f270cf62819cc22823b8f4e939db77b494261fedac5a76041b9a20c427ddc09b154a13053c006714e6a782a87b36659e955c30ec82747f45a1ba082071cc3c4500f7dc4f4a74b52b017fdb6628e669186abb4a0ca9af1970d54b05eea2a5e95c2b78c38e519544ce9ad67211e189789dc57317bc8e74753ed858f295b4b4a1e164ae6307872092a88b53d00dd2552156ee8b8d2cbf6cb8ecfd8dd42e1570c578b996cf90303c1265186984f85905a8e9e76902e6a0f1d389c0d6366ec1aba2e73019c50ff6a4ff316bc9875082fcf6c1e4702eab1d9ce95e52e2223f3baeaa413d6affa098285b91683eecd9dbf38e65449867f330ac4470c392fdd8ffa23c951c769c5a8fbbd48b575bfb87b2408bf924d0352626f68be0a0a330aa4d366acd869db9a66208a08265bd4baf1007e4be5acc8039a87f52b69e8d3ff074d93500298449ec605ba28a1123b749a82e35309ca3a16679cd06055df7cb982094ab2198e19cd4f36631ff14634e4d87045a88edd1d983551d3febeb507b528163206085ecf3161e2dbb2197cf0d6829be357679c6344832f4792593676c4b5f7c815ee1b74c6affa2784f527f301a04a0b0c0a51ea9f74c9fc5ce0fbe695b3d72767a3cbcfae29f145944eb54048de68e29485d9298c7c9073669867178b136355384953abbb9d8d51d15b77cb765af51be0d6688e3d2942abbb0e2c1c91d85ef4c8f876139a12aedc18bb67607054574cc393caf42dcc36adc2850e83812b5cf2cda77d2302d5927e141480680f5b8f03facd8e4202c78472856811b4c9e02b0b2e2724e7f99eaa7211edf9ba17ff5d2ea3e157a64c1dc1c40c8c464a91ec8a663b32e5161ec155423dc67bbb3602a2dacd6237e12eeda84d4785aecb4d07611e5ccaed133d3cb43758350a8d1dc043c13c4b608898f37a8ce7eca3f31f0102596528b9db9f049c7c073f4316e99f769db91d9f9441de7d5b8b1ec785c1d8c05858e6dc3b6ce8f46564e5feb0b43130e3f65721115a111ee37a78213cc632a7973c43758542bbdfead279acc352a3aa323674c466774d19a6446d36a29ca912765991222cd02800e1b012ba7b4ef6f65163cd2f182572b65609fc579356244585e7526ca6649e347190b794dc78f336a8bae58ad0ec9bc3d6cb85cc5edb8d0e5b115584738f67837c4071c320f78a521a5d1c92228fc401cff04b3e7c93a8a566d07d926a992add5b6ea01fa06723fc4993b1b6a22297811610ff56d42bb7be060ade8da1a4c2b292529124770842c971518a46ebb39dfda523e51822e1d18e25baba3a8d5e5436f2bf1fe06c4c88262e2a1ce54867d32cb5ca63e6b00f69741d95d64076c4687be84a6017a198e328915526078ec15f326403732de205aa7fa453b3ffeabc907be55e3cd6c495f9cb388ee2d642f7d39f19052af30060e7fb03c4d4ac0e010000000000000000000000007a074e7ba3baae44f374df2ee2d03c7d4025a385bdb1f1427dacca9951d39a777ef81272a75f7867f774d58d27a2b284b70bd0099176e450ef6c1a73c5cc51710a2b3309cf7f676074724969bab811beb7b04c66f5612cb0bbfb7cada35ec64d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1f8b76133055eb1aad330bb0a87bfd64d8857bf7730080840710e06b5077cf8e5a5006996fa34635c2e7cb1ab1d4dde078f19ddd97226316f3a2bbfce68fdb48c35b97fb15579736e9b692dd196e9a14569fd5f65f9e71a44312517dfeade9e7610c0d4768538c46876c777aa0b8bcc576e204eff567a9357fe1ad97246a5ea021a348ae91c1cd2373ec150b7cc904f2ca37e6f29f93b386cbeb60eedcfe41cec030510cfeb3803087fe859451c6b68ee66d9dd4df6c9c198e14cc4e40cf4c378c50b126ea934cf801053b70c16dd4e7fae1e030e0584b432df369459fca2b4b87aab26446136753cfb479b73a509a7b11c14bc5c46d4b52b235f3dd8c72d349c3567022c9e678c45d7255d0a1c777f1fc8a47ed8c7fab87c93cef7fd3ed0530e4b489c0306fa6b297de2c4a5f0187ae95b1e7a27d31880f433420946252ba9a5e811ee2302192096dc2c61f5b0f81e0603e286523f87e59e9b9b0627bdf1253d6c06c85d7b031506530e411ea44afa43684342ebcc70a2f5e066dc903736135b6c8c612e037502131dd81b80485c59048a22037d1d9ed35354f8439930a0c33ca86059fe71732037ab7d2218827a10355a75cd3606159660b5e6c67d003e1184f18396c979d343d872d461daaf7938bca00ad85a2db697c2ffbd090eac9eba03fc8b87935b4b2cf0eae9ae9370d7d903df7c7a5a0e1382b49d192b0746bf5bdc3e7741964dfb2d6cc8fe701306c6168b7585e26fe9938e7d8620380cb78ca2f860d2a643a515dc070beb5003951fbfea8c1e457b39ed5f030fac051155b1a793cf2717466741abaf51be2170bf7e8d910f01f7769974cb959d1ebd7fa76a96676482ebb6e643330afed1edf01975912bc9a55800d76eb82f61cccc34aa6b2c39cb418c7137c48d4c9b37e3bb6bc265bb40056c5c5bb681640e0f8d52b6cf9299e819dcbda97d5910829718c8b25695c7f0705a6c8884100f695f0ae2a518c7c054c29171399db9c52f755bd2a46af939f09d4155bf8364e6f3e26e375dd9b33328d09c27e195360fcdb4baa1deb84d5cfe9bb53f4580b518da98824d43da74e5cfd1fa6a6f5e652c41f8d6c190ec4953bc9f30228b988c3aa09acc003b12fd9c240bb0d28e4169d02131132068a91b08b4042f6402be1d4acaa0bdfa113428e986dfc1dfc332a03cc2f3137bd60824e2994c887232e89b6112189022fda0969fbfa6ad19b303e9fa119d846123634249fd42818bd98962ca794faef9fae3a248fe1956a5d7b9e9eae84b853ae041be5bef75df9ac7f5274fa8cca39f3f1eddbe07d798fcbf8d51ac7c31d26e90a0cf8155a3226deb5280ef6de1bb09c2334d94583ca28e3e908b7677b369012521b76765fde828a229a64978b5c3d9e8e7abb8bfafc4439d766c17c2ed44c95eb5c3d03a9af1bc29156c77294ef242f84520b5d8cda089cd69540c9715f4c2d6aaa9084f40c24d3e554e3f0ba087a58be7ec7b82f1c593c11ea4f63f338ff5edd80e40116a4af95a8ad056b95618b49ab039bd64fbdfe376d1239db08dc3d56812db4be255a5fad9567583bf97571a8677e762a31f8060c50a55c04d22791b0605ac48bcfd8afce3e344cb2437bf92589eb07c093d94275a1da1056b90b5af8751f86c23c4c86f7e7d98cb5564b912eeffa45a5211d4d5db29f04073447fa3063603c096675ae48821805f6c4f628342676d9cf790d31e6bb57917a4146c6382801d35c25fb5e1656b3e476068e9f0232ffc6d686a0022a3a6437972e49b31d2be70fe800c408219b17d0ef19c60cf365afd2eb3897f34d218de48943c978bcb972ab69dfc67e2783c636d67f13c48ae8d4fa38143707e8be6136cf14cc9950f712773f833559b53d3722205bfdddc3ef0744cb40bdaa8a85caa3a9cd77f881e3061fcb10711904fc50efb3a6835ccb3bd24148f2039d55cef0687e6a73a2a18bcf232815b6a0bf71deb552273fc28eab3457cfa66ba60c6f106860b9192047dcce68ecfa7a3db2281ab0ee6d3bd899a6dad21b230c6afef051a6b7c0b151bd4f6445b12b43fda38fd3c06378ff28f79ded84bb59e6592c3e5e2930e461b903e8ee099b52c8bbdd05f0a3fb72a36df17946f4093b4f9c283f44111dc319a300c57f3d1a30adbad08937f36b07a860b38be90823ed5c2e07ce609093109f660813cfd6aa04b5f37017d8eb6fc9963b6ce6c5c2cd6101a226dc60da376cf527fb00e456110b2c7cc2723905811165b3a13bfae475c654a35f24a346177c38db83c9dbda1866df5a469dcac7d220000000000000000433104000000000053efed4eefb0a598846e472749f06003636a80ce324de48b839d4373a4f0e255012b69f56a6428659d243ccd4327b87f39abd5f9497aec7a67f84badd808471ecde22bdf02702ea7a7992c123e8992ce9241a1fd3aa5a735231ed9744a1516c800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ddc63bb2ed4b93c602040b4520a85e011ad727c4b6c699843a1bd686c96118dc9bc21cd1efa36ebfea40847c72d7723a0a3167606b3d771d97090030fb6dd029ff2d38e9970c1a4c7632115848d850c42eb5afe18521d484693bb098ff6f3c985481b2bf6223818dc89d9bcead6fb5db7b2161413ebf3c0a7419063ea8ef492d0223f68daab7e2d28e3f02c6090ef9eaf0fc73ec01c81646cf9360d9bd09da1222032520a200f33429a4bfb9f11583998ca3e4dd7f510747875a7eb7f02393d61d7d0b0989ba2eb80f0c8a32aa0c19e990b521c610012f3426bcb93e275ecb323d44c123d31ce1b420b42d148870feafb50b2d6143fd281e50c672653de42a90d3fc30022e8d98f0e0ebd45a3b72f0daf6c145c90950a2415edffa7d3f2346d59001d6850224b5e490eae88b9b413ec045e8023d536260804e467d5d5327c3dd1e4a81df46031b256506106584bd1361d4691f500ec9a866ee9d94e52597f05c1e10578db1ed020bf9e5c4fb1168f85099f0eeddb5dd91a1dd322972a3d3257893095a58236abe021bf55bcc2e87b2228f954af0fc50c3d67be95dcf94e1deb1f9d2c81848c269b92244a966ac21354a07bee36e124582dc413f094fa9c84d635eb20e8e98dcb7345faa736e5303048b1a9f78043f3d64712918bb28d8440c5325dfecc79d85448c5e0b997648c5edb729e1813fe06e0f073b5a5cc0ae800c164856d48fddd2fd34b8e778b116ae9cfa44477935ca411c241595aa9bec686d896d6e7e4b270ec08c236a644193146d2eadb546c856aa9a18b22ed2a421411db92dd67aaac4a762b489f9c3c9e1ac096affb529212dada0112004c6bb2002ea95dd924e3d53043606ad55df63e33f1c1783aa4c526ac133b9534b4507138084d0e729684b3ed361453d690adb7ea1e598297b5326d35a9a18c98897a07db6c17d391727df1d6a74275c909376965fb8400a3d2aa54c7bac82f8c7401c0ccf0dd36c5a5f4ed070e91e0f420717696a65156c834f28fee937ed299df5528645607114cca2338cc2acd6c759cd0b268b982824d59e0620afac162ffa94503891e792ed7a6d8fb4d6a9cd12b5a2dfde80d3af9b818df89ef09a9d75999e6208ad3c688a6bb8c4d23b19412eae58ae7bdfeecf86f026c3e637e30fc88889a253c066b00889f0287ba4e9c7c5929ddb53ac337013a7f82fd888f99c8c5986025aa38370cf23003c9ed05e9a99d0e3dddf4fd6fe99354ce38875751af10f24601f7e6639acb8f8cae41d58c69af922630c38cdc0b17765a8d9060e4d174fa2ef150319167fc243a059c288044e1e9058268578acf98ac95c0e2ad998fd2cd8b9aa45c3ff108bd4ac66ca7f74382be2badd922a2795ff28c3a27554d82a9d9e6e8b43f327760e19c93b0f5c5be4d830ee2dd7727b3f17869006ba8abc98867fdd91c19b1e883b33ccca87d625cbd873ada1ed4adbb61f562d7348c6679aa465b7cabb1ab9e1430f57d4249e24e1843714c118b3fef6609bd05eac0846382669a8d1832fd26a16cb0ff322bea38e42735e98575b7edbea053bd512605baab813e23905e19cdf07037e35c61c5d6fdeb7829630f44e1a0c51cb774bb1a45c349329f04fff348ff7c01ad8b12e6df26848c59f8a8598bce8c3806a486cdcf468291d9abc868a3266a9b0ae35b1d5c13d593fc53dd5e62db07bedc89a55901d599595170126916db2bfa7e9564fc6516c9697862aea18da9b47749f2c965d65f0db65454a7b3bf1a202e56b00c19a40723b5684667997ae403bd99c61a28256b030628104e75ab9bd0aa9a60919127d71a4644da83a1ea15f15334c6a064180da3e73d42321214b95812dfa68453759216bea2cfdb7d58dfd4975f298b5c0a2a50b5ea616f7336cd7c58a28f7e2b1c7c99bd7248c8f42e0cbc439f83fe60721a75882551b1e0539750d3c56df15ee46245b320e10e24277a975e19cf05358c759bcba7c5f3e61efda9492b6ca7c4ac69bdbd5a35e2cb11f860636cb533f34e6af203285a1c1f34f75db8c2670178b1d74383ae3e6ec26c5eedb6565969830b92b5c4bee568b6b49b92ae6b308882e02fa83489351077dee85de54e7e0660a7e58f5e38da6fc40fd973e89b557c9d2fbefd4b65abd5f7c8243e75b6c50b9b16b957866bcedc785209317a297ad3ef08d284db0d4ab8dcbbb6b652e2667fe7fba7884e7ecef3afa8cc4a15830b2f92ea5a63cbe2b090452119ccd5941dff957300973d0c1af6d04e2e39bec34bbfbfff7c08de0d78f6c48977f48110f3b847ed047d137c7a0d2a99a55b4fc7f5cceb58d4fda7ae8ca68b6f2260e811921b88321d960e6a8a1c1f33a9d4db68e0ce13b5cac05b6e526c33e45e2d62d48da80cbf7cd683d4346304f166a8b4560f1cd66bc6990877886fff782759b93f12e69792e08", "5365ac", 2, -525502696, "f3237a1b1312899033d4d41803ea786a781fbee414039f25de6806ba03a529a4"], - ["4bf9daae0312216e594c3771012d1aa3964fafbf02b8e22736ad1fd5cb5d78ca754d25c8fb0100000003ab6a53ffffffff2904229cd87f61b7147c8bff248ff32b7489710a8da50743cf800794ef7b7f8c020000000165fccd0e45e0bb272cb7caceed967f3959511aaa682891385669fc7c0c080df15206b9fe4403000000076a636300ac6552ffffffff017cbef6010000000006ab5263656aac00000000", "6a6a51515163", 1, 1899844270, "b7ee1c0fb02ef3ce7600951fa07c312aae1a2259b9dbd0d89a68a97fefd0e176"], - ["7d14241d0393e10e03c7b894a46efb7a06b4dc8f0226f90ad94c828cc194c351e90bf9bb3b030000000663630065ab00ffffffffbb4e10313914611196153207d6a9156e85472ba44d8cf62fa8a8b6fe6a06c23f01000000036553521796d2402694b6ae0f98791df13d5ba5265a2b0ed1c0a594b8b34080b435aab386f68c4a000000000253ac4b8332240263cd4c040000000005005353ab52e2b98a020000000005ab6a655251dd1826300311e65405000000000000000000000000f15d9fe5ca7fb7042c655088301c70d8cae12550a425b97fb1ccf2c95cdadb30edabd22e45641ce4f6e18c9cff4c02198720c2cb8198e0e0b98063ddfbb1eaa46c66c4835844272141441da20a5e98bf2559878ec1b970f04a5d7b8cabea6364000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000be91e565bd97f409cd9ac49ad7e05c855515faf2dbfb2fb9386729026959f4fbb995d1419a34df6ae0e90105b5e2504e63f0ac0cbb02fd1e4e4c10b5259412264ab8276a3aacee08abe21dd72dfa31f6cfb08a8c03a34485c711ab713f3b2e18a9da96b7b715f1e2a87b9b91e15458200d0c3e60830f4ff3725677de7d3044f0200e5bac08ea07e2ef1890812eaae0fac8235a890d018dc8ab124580b41d57daf020d1599f8539697d9086270ca727a086528a7262801466987b3e6b4cb105b5bcf0a1abcbf05444e99d0d33ed85eb7972d58bace201d327d3378a5213bef38b79bd91ecd11435eb94ae69bd129e064c271f426b44efa8ba7fdc3e99b303d29d2b53803156fb1de28dd2e056b0c1ffa102c1c3ce35763509fa7b8c2255408e131e13fd5032548943df06ff10424f85756f5230960b99d484c3a528ea106a83025e03269d0022527b68c58b89e3b5a84ffee3e926b4d8b39a96a868e1fe451b77ddd8e4b576e02260c9b72548d6fc2bd5e11e142fbd6519ffa9ee21657486ac02199d5df88f57e021244bea69ff539aefcb4df731c5613fdbdef545895ebb05d6c814524baeae52ba35c48995f5fe4a949b2496c7684ea2829e1bd119da71108ccb9478c502ca96315552c991b8f6dd351a27225ea26eec27dc34f7b7dee0b81a7418b5adbd64e8331021c1ede4704f824bf0c775b84ae82c52c04aee792ab9e920180a24e9e2f5b1503384e2d966f191acd045335989bd134e33fc4d11c2764e2acc3999ba5acf1db685ceb1ce526637b7cb99c3fb79580c8c35b646fa3e8b90d37b4622faf95d16514d6315b0b75fcc993224be1571f1d3d91c4086d3654a508804eac38b28797b9740a717e0eaaa3c4ce815bd97817c066f97ccf78a746f85a835b56b2fedb8c59b7d7d6a8158cf8a4986246cfe5777f5049215baab7cb06b4c20140f1f8a8a05977a508ff11f39bc57cf2fd04344c44bec4ce052dcd2ca2f84fc7fc21d11b6be6c139ea6a78f515b719f841b27bea7d875f6e6a97e4a49b9e0e933b1d57263fd9e6905e05b800ebb1e350086113a537fed611bbe0e19bc531f71da7b68e54305c93dcfe5f21658882160a3baac26ce5f1b02d65a063f4fe7e7d99bda297ca32555a0bc3f27e18488a782d5660ddade727219c189d7879817615c1652a51660e7d74a3ba8a38963aa707c47c51e736f561fc7e99a7e2392ec5fd6a311cf25e8b8bd990a71a60bd9ff8d163178f08adcc62ce67be1a5c629f595151511f36fba49e7775007ff714fdb3174e51c86b7480cd226353d00f99ca20930669b1b757a7dbd47b104cb34f24cafe61343b82040618ba6d2860dbd658a8a01ef3d3fffda6628638ddf9b25c8e19f1ddd8becde8b4d8615e2cda0a498e018591f29372b6f2ad7a8cb34cd19564622bb76b4ea65873985654c76570bb97bdb4583f2c934380bf02c33f66c171df240d520f91e6ab40e5fb6f9c4befba6bd5aa5fbd56cf2add90ad1db0ac0da9715a27a0aa97984e4bd449d85566f1237d75a3cf5089a387c37a21342059a608deb33fe1115733f0630a653619836e773175ace293dc59ba6a06072ce8e58c1ba95f7e10c7941e15be27f5d95ff03848315f51dafdf8dbe359f501a1bfc193e1cfb7d635d58ca5503d4a3cc8344486e5ddbf67ffd69b064516ff08ef5cd375c94a6ac7b9e07fbe1ce2d478c8628a2e0718a68be26c1d38fb2ce969fb3e5970b0c1633befa9dd1cb06191b407aca93179e86e31ab70f99590a8cdbf3348bf6f500273a6b8abe17cab543f89ec4bd7ae91262b0abf44f06f2ad374a5dd85cf54d3e086b178565034ef94f767b20af39eef2b223de9a1fe2296689a6d2a35d37ec6a68f964537c351a0a504cbc25ea6c1e576d16c926c100c6593e4980b48457a614d05341433c1a6c7bfb0a89fc9029c9e440f786d152d52094a19fb2d9dfd1060a3df2e340fd3fcac7a07fdbc3f3229ce9dc2e4980d04cb98fc1708bfdcfc42f7962c195248f9f59e0b2bd94a3a9fe4684c3d64bcd65fbca6ee6975a101ea7f093ee42794bbdad8b925d327ebfb8e23a1b9bc0b402b2ce7f58be79af09b73c36abad698c683122a0ac2e899c1b80adfd9c82de62e24de5b7931616c983527a2f586a622fcbcea819afbcd411dbd22f4af86046b04e788a6ba31e192cd79a843301f6a1903f0c6f166ebcdf34fd2e5d2d7f506b27c1bd273f1d83a85ecbb2ee1769fe89641277aaa75967ddfbb339b63a292f63eb5b96cb0d7bbea7978a358333219a0d8b2c3987d6a3953000000000000000000753b010000000000282dff56fa52e3dc4acf1608cce2f5424b01f804b4042ef898e4d253cc9ceab229c97bd6bfdd3a5f7491599c88d66b446540ff991f801f5510e6cf7e4a946c7afd4158cae7161347986a14e58ad5ec193c66d1a2b8f1441fd360e01a5495a07700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f66417c5bf70e7aa6469e79d29c238383b60b2c2856efc6d07d0a44bcd0edfa8c6789df398cb2ced361a97ad86688b204eb2d46fbd2daef39550e24e9091b75d7c60a9ce1678e6ad341275d366b23e3cb31ff876ace4052b509d993ddc552d7e9fecb113f061b5f8c6ce21072acb83de2e60780089b36cb5514833a89d9d1fd202167f22610b5b82a4d872dc89115a9944a052dd7a2147c8406b6385f94618aae30217bc1858e7c72e867e0e4adad14e3c75c0e503184a362090e3d795aa74c4535f0b1c3303ba2335f7c6fb248878384734011d05fe69f96ea75645dfdc5bfb15bdbf2293f4054c817eab8a1c07dae92b3bb78e88f53ab4e9a92728592e20f34fd96d022b272b01adf24f3792d1f7c415bbf429416b001aed4d8b0ca9af2fd6549c3d060210bd60ce0cb903487472cecde9cc29a94427159babbd13a19b4d7361ec111e0b021f101172eb3b6933c2066d55c5e5baa9a38793bd022565657ff8db2abd16d4e402157fcd1d0f68d12b94e09b03dc7ba5498ad9b627ad58ba5306544c1dfaf1ed490220365e3e2ffdfadc6b83fbb4d8dddc4d0bd397197106d3b03336cc7e58239728b9735a711d724ff23381927891b72e871ff3531f1a41c3fe19207fb505432dac4b3f1857f8c6d0225383c400a2fafb1671a830af8b8ebd2aa208f475f3238ff77a1dcbd6a2dd5e02fb92496ca8cb3631b369d866ede077ba8e9d64837f1454a0dfc3784acb2623826efa631195a129cca18c7cbd9ccde12232b67ca99459bca206e5498ed69083f623aeb161ae9b2d80cdf43076ae6498205ab8b5b98f165fd2c5352c6b85f2d466a05b508d267f1eb868ce9e9f6bc9878f589037d3206897b9a17c8248d1870fe20e9f492ccddbb66cb19ba148d565af0df42bb6fc65a84f91f8b34077e91c627753215529eea884030c85c9e95c9ddd3199bdef7c1ae41f9b952d382bc58fb0b01ad3e518ba2389981718d969064c9f7b1a7d6c3d4bfe580d7f74c8cdb5bc75e57361e54696ca9c74a30f1ffb06fdf60a5a440bf160f38c823e7c4959f57d36a6f7b41988ea1da8c7d3689eb8d17a2db7f0499197299596f2716ac4adaed00c11275d6d273c7d145e74dfe7636c08f9b6d492a40f7eb0c26953701534b9ee57a3c3db3ac2e8f3182112c73a9a767d326359113b277f44dbd08833085738af5cf31a1001fe241bd487d9617c369c8b0083672ec593ecc4356186f8c4ee714d8fd00abdceec5ee9fb226ac2119dfcf4061216be27640ff90cbd25be695c6775b50dce13b81f96a704e5bbfbefd8da11f5f7328e7b408ae423b82f731e75643dfa50e1f57cdacb2c1a2a8aa344b9ac7eddca1468fb4296d100fa0837d3b70e29ac67e30bf74435ab868444d5776f671df430189d81f06d5addcae4364706537ed828bf5add2ec14adf0a00ada75e45b7cf041ea3d8fd259ae2141938a3b8e9e8965530bd6cdf36d1efb9172314c9aaa90a5c68b7df2817ba6e2d3b4982e12e8acd68a5ab43cebf4a727fd7d2c5ed736b9aa96d24e18a8f2b0020ef73fe557c0608491186a5e426e06fef0a574bb38c0fb0417c42e4bb5021cd6c01fc2cb4b3fead025d1c345b7f0063715e8551c825022bebf51b8771b2ad74a3e86986d2f456deb9a93ef36751d860ae296cc511e2dfe85c925661073ec6b60fb1bf02ccb6e91a0d31ef87f36bb122e8869b335db38b6c0ca072161c5256c800e9f37f099dc37e6f662eef82e1b41d58a05ac39b4634999243c2774dd0508db85e2b824aac3d851a6785499e7009efe5eba4edf49c7fe04bd1bbc77d4a0d9edaf55c7b7401de21f4a907c582cd4938a3d70d0f9593a71259ae7c3aef4dd43fb4a7e1b5b12641cd931404561b293ef265836bf938317e2ec412cb5311d04e883b36e6852337804f03fce6bdf2b7322438052217a4a89ac4d9e69eaf99c6de22848df19d472a4a559ee34cdd4581a5ae62182e172b2c96dd1776f57d0508e0e4093ba3aff1a71b5c793844a0a8953abbd2f293c373ba5517f2be423c8a7fe406c73a6fb28e588c1ad624724455ef2d181980ab29e7015f630076ef55d68df2ee381923e0bc4e0eccbc52573bc7187ed978a05890c6d94f1affa82314802b45c67ffa952764e4510785ef83ddf79a53e12086ec7a35691aef6112afee30ebde960c8160a1e28d48a21d4f215a886e145d7baf2758f806d207fa7c5be21cf1d446018fe856d88a7da08547ee043f6091282d5968b8a5966ea067ca8c10ff22804cadd56affd1f2d90c0af9ba2eaeeea59af0f4e40000000000000000bf9abe0000000000e4b95bb3b1c757af25af9e544edb503d0f8e4e0cec8c1642bdede78f9f88f61b981ed056608b936dde696ccee684aa862edfa66cead9a80e78c7c9a2cdc8ffba11f8a46c93806b4a58a02b95c5d44bbad5f3f042d94db660fc12d345a3167c2700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b53e3722ffa874e6f321cba2b2128b32a04aa481ca8d7ad18d7d10e5b829bcfd8dd61022f154b0a8ea674914c839129d908aea63a9d474c05a8af09afaee67d3db6c6505abf8a62526baac57d325fe41a6e7680808aa52739e32f8960ddd0f1b913c0b3f010edef9d4f190fd71b4cb765bf639ddf2f3e35bc2b527ba705c07a8031b1168cce6ed4dd268c595c05a7e4a1c827b4d0d86aa2b603ccc20e250427b17022fed553fbb0bfbaf81531653b847678cfb9553b626c2c1ed9c39ceed56c5cfe20b045fef8fd6494ed7a2e86a41e03daba5013af73a7e8a64f4e15f91e14394fbc40f73aa745365eff58ebe82ee0e2331171ac20d434425c67f192641efbb016eeb03105941f0494e7ea4175ed745b3b590034e20ebb7d4b5925e75deb0bb6bf0e3b90217356f6a79694784c4417a0df6694f5258ef615dacca61f8c78453b59d1386eb031742b71f38f010f887824efd7cb2d90ddbe96e1720ce265f3022530aa3f893b002292e224c6117ee77e658d2fe8eef85cab2c5dfde0c78cf8bc643b239d12543f30314cd8e51ed2ac29818ff2c7b91c5fb098734a7ac86b3a1615a7d38d1ec212fe9f46a7a8d4e6319bb3c65ac64dd05258393551a29406c9c15c9ffc19eba16740659cb9c1cedcf034519aefd5a88167d2ec952248220304b30bce62a5c15fd7d22a06b5aa59299fb2425f42a06f7c290ab8a006e37822c05c84b542f0b48055fa8c63261b200bdd412f62ff35189cb58290b5f1d25adafc7935081a45171fa30460ff424687ae8a4db6feab0b776559efb7206d75f293d274258061d7926dc4f6a3ee7087f817d9ac88d616576421d98146cdf296ef00482370435cc19e4dc2870ffa070f02b69e9a5c0a22abee26dd2964c97def45db6a96a68a6426664d6d8a3ff14bdc433741210f7baac64397e07e1b4268c3a65d2629cfc35f1caf8368fcf97006c00274cd677252ff97267758ef9311c3e928dede0295fab8b39e00cc8a66ff9f7f251a25b3b90f77d4c4b3bb1ef0d099f0d77176a4c951897cfdc435ee73f8eda8ec9494e195468f5a29db780c74c42c8ba4bd59d0e31f089805ea6c7d769b84a21801e543106ddb9655e03bc3a18c5368f817b08607125d4b57e3c667239ae42c0c5abf961b3b6ecb126f272777cbaddbe08523b8785fdddc5531ede6254b6d631d958b3851cb5f7c92c6a992a2f841896e36556c346a010f5eb5aa32e6d5f10c5ee2157e0f4d8dd1436dbee3ae6c3a03d4d85bdc900257c490ceeb09cdff7818594f43a230b30d556a1f06c7bdd59e32efed9e3bafb1ee5d67724b05bfe58f0c20b079d15505af55957fa62d7df5351ce51d4a348bc949ca7c597faaf5f9dd21dabeae54c4cbdae380ad2fd24e1f2a9e661be7689ef34d55f561aec43eb1341671480931a8ef90999719f2adcc04dd9530be8c6149b39cd7751cedeb5443282820f8b8b78574e856b932c62f470209725b6fff609eb8ecb671fb1591991398cdd863ef0a7b056abf4ce3c05143715232a7fd1e793efb10d863832e3f2db88a016f4719c15c1d99499ecd51ff6bb1c6e20000e71d2e5a571d133de56a4c9aa86af138ce8828e7ebfa4b6481194a20dca1dd78822c6fa92c0223153d468413c8513b9a31c5c7856c63aaa04e4cb38b7deff043a0b8af91b9885c8d94cf994e62c41b55b0f85606fdc04a5e455e45748230da2c6f728c5213c3909ac37175e1da1b9ac4ddf026ebacc10a0f0990963a2163a99103b180ab401d7f1cc08f45efcd840cfe354080eb1b0d639c6cc94b1ed48c6b0e5d24a4ea3f509c66796c7271728fe3f638d8781306bf0d2a7b8c5dd38408eb3ae003097d0458c9938b52bf0cf6d54c4c0a006beb62a4f6fe2a75103d665c7796fbf2ceed26afc329bf88a697ad7624bc49a5df5d82d909a6afb2a4425e0350acba55027ed4560b813eb2d789992213d144010baef7c7b26e10832120831533613be50d18be6be2ab26fae345570a4524ff48c58c6dd18b0c11197c6a8ee113bf590b6b6b5f9f062d06f26c61827b292a973ab27b6b492f0ef46f4c9fd5805048b7deea6548dea5f82d6d4e9808a117fe524e1245327ea24b5dc487ca3514c1c1781f4b0958f5333a144a3b1fdc9e0bc07e22ae533da9d629114972b96da9341def59261d0312db1778053721698d302b7281af7f23e94f0445f5938968527a4bab524e4b92fadb39224b06cddb96cd489a3791d67c3060f9d75854afe409e0a3e6de2b29280d919d9e6c54c806ea9809796d7b2772dddb925a3a614f568dd8a4facf43733c3be541b5cf0b87aa0bf2967f92b38bd96f0dcae3456189c701260d9640af6e297e8d878d97850479a88e7ad62aecff00e2ad586718276be1d447bdbde06dfb092755ff453657960cda5c6f3318e0761f6b961cabe497705", "6551", 1, 1528788085, "cead04bbe4cfba9da21c4fe6ace13e4748f33eb45e707e5a1e656e44e211d3d5"], - ["b368de2f0283795a2488e6e246ccd210da2535c96bf56ae0c46b348bdeba068d0f408f328803000000046352525314948fa64c56a922ee4842c770d7cb7fe268b283f0b72d63899bfad5124b6f138095125b030000000700ab6a6a63ac51efd22cb3042f2851030000000008510052ab5163ab527e428903000000000151dff7d80100000000015178abd00300000000046a535300b270c4f900", "63acac51ac", 1, -95135240, "751069630daa51b3d37feb5855b631fbd835adbce2b2e301b6b364b7dc553f9c"], - ["0e23c912032ad233bc74749dec650794db5b06113d515fcd8e46fc33628ff3f1d57de939590300000004516a6352119cc15ca366193a4ccc38c2fe72fa8a9ad1ab0cf99814beec5b7aad59a042c63dfa8b0d000000000653ac636a6563a6d2da8781bb04a15d6f00e1cb9ef6fbd22e301f953944dee29b55ec93b3e1c28fc268f5020000000552abac6351a6a6562e037dd10f010000000006acab6aac00ac7b891d0500000000050063ab536586f86d0400000000086aab5253ac63536585a8777a01b03ccd04000000000000000000000000b3526b8f50a3e27f6b27f2ae16fba54196161c51c3d0ce270a782c8cd3dc83ef55379f80432ddd3e5c689e0446f30711038c1d5ba5f74092d37fec7a885b6d7a3f80d2ec66621498f65754bb1b36b2720dc2cfe7a465908da82b215bb5655f25000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bc74f98a094fa387a0111f9ddc8b1a9035073de746048059f2883fbdcf3c63d39d890f72db99867852ca3bc61d0a7df60577cc248382f2bf230fb1652a6203007a86a4f18b8891172359e048416b463289abe1469956ed1b2006c5fb40926f5920d3f1c264622c846e097bd089d7a0c013dd2e38fecce153a9abddde08d180f02257c7daeb8ee3253300ed438e6e73c8fe5dc1eb6c9d63f0eb28660a833a5a6c503113457ffc43f900a350ea32aba65ba8aff45c3484f992759866f60608d4d16670b20e2e92ddb7b2262f3e05bd661197ed7d1c9bf62c2d90bafbe7c62f39c3c695229e6f426c5ccf8cef5d29ca8541a827a1a948312bf88bef18757a52fc58a5cb20214f9528cfa9c0c44cbfe7c37da300b4e14ef926e6d80eb8ec413416ad0ad3f15031cca46d91d5d5fca39f5304d234c6fdeda51105833430e1d03bc52b9a7b07518021d89c8e7d4935cbb5d5dba2e956f0698b08b1929b058cf18c10b1091ffe637be02239f179df22c9515e60d5655d56c4b0f0e9c8d2652830afca122594d06324f740306ec787e1c47d94d9186efca90d06e19716e12f03d14d36e91b5793ee8aed30f070ffc8619654e095f90db6243166c521830b52da247b077da0bd3f27d66645e45097cfa506be44bc92c2b769feb68d56bf067e316254be11154e54062132f4ffeebf7a825b3fd98021f1312d80a1cf4598856996e5e1b32fa5cd9c38a28dc3003aee049c368cdce81ebb328bb62c1e99883618591923d8f929b7e8cd0b9c518ae4a1ddd91a11fe798223a5c39c5e500585a2961838cb525b4ad1e33fa74a14c02cd0a1427bbfce79446cea22cf1ccf4709eccf18dce07cde96f88e9141f5cc8d69c088bc641a4add34b1adecc67e2d4fb40a5d17961707b746608a24121470e464bb90a5775b5d15f99bf181e8fbb603645f57f2377ad79791eb67f2250622d4f96c56d45de3cc1e42719c07f81c35bc7d8104701daea32934d0d0d4fe1eace4e90b83268ee2d38c4ed40510ac6d5461a88bc0ed8e9aa5474f7bc29236cc41f4616ab4f586228e0eae89bc2adb0e41b5047379ea157e9a2a90e41a0ffd1e53c70019f4760975aa07d0c661bf092359c38ca9d727e5abd3d196b0ab6e866e1b206240788d0514f25fe375fc4d8a7854ccd674f2350d4d02598c7f2c056d34d921f18e0d38ca906a781771e844dd7dabcb7c5af2167e180c3787f9e13ebf7c5def02f19b23b1c719d7d6d78f35dcb1b160ceaaefdfcda93142b9efaa5cbc082fecdfba000e965e4f240e450c2215d72284b0027abf7a221da9657bba8bfa036d296316103d9842e62b01d6e80181a951b3fff5a9a662e5d1649e518f72216967bf93f74892ca984ba7ddf11c0f6907fbcde4c2e38e8fd2e4571ccd1944606e8941fc918dae9d3c0135b67075d5ac2b56881f94f7bf76d4a6cff738a491df5d6149aebddc85f12bb2b680e3007c6a501fb3f7582ed6389815495dd9255755eda2a3e1bc75bc0ad3de5dfff6744a10fd0c132474eb92dece565baa05849cc10d94e878c69998f1f31d12cd0e02c56168fe4d71d3830dc97e4c1ac6b7c7cc901b5fb091a1d5a0ef5e6e7053894f2c26f5389c3a493761e26ee07ddc7b5fec335aeeda027fa03c15f0817a4b1447744fca62b98f7d3ec9096709a33ff83b002d3ea8c00ced8a58b5db6dfc287d9d71f8dd59f74815cd1c0d60261fd7084d8e8d81acaa266f18774a68d2d01916854190ed20597b5c2364add50b8ec839574c9c6998e8a1cdb26f9bda0577d424d514f05c2a28f33bd2e02929c1ef0b4b88eb8360b45bd3d179b7e9075e6ac5ad4106289dfd0dcde5b1a25e2f50b619fe39079c3e5ca57c665b090d840bf4fcf555c6f9f2f1043ede2184748ce9d05550206185b49536db8c4d4a3be93b03612f0446e0c49385aeb788c26b270d06ab5406d86d2392915f7047677ca5cbbe8272fa00300c966b0f81b7599bf3e94b4f34323e896e86694ac40842e716c14646189c8de8db41830dc3ffffeb387b46791ad7d497f0737e8de90e7e1453158d560a06ca7183112692517464b5747802272c9fd68bfbf7fe92a406270272476fe7c1fb3a7ca57df31b93b4dec46f9cee9251fc3db389d82f94e4f426edcd3555a56078c766a232269d36a381c09658ba4e103bd9d69123a1cfd34f3bdf461479a04c1da070967dd431460e8c319527a121101f563af5da348b23352e2a66d4796d596419c7e4eab203fcbc5b57a387f53f9db792513ac59c3d2bdf70ee69101cf7d20b3890a8a2ef1fe7b627b66f98be23540d8c2352dfca9c01bebcdaedd584d274b63ff24b9d55591e7c439053b198e1c52a828b9758cc64a1fdfe202e646942ad720f6c6371857f60f0527d49e112906a7227de36aa46038920c40de01d24a1c74b16fcaf2d1d30b", "63ac5352", 2, 1302013768, "575c31c8f3e45a2d2921bc8cb11f99e1225751c4d11bb5d0ee532efdb2435cec"], - ["52dd860f049dfea4677980ab584d201164556321b73b8d7718f7b93188ebd9aeb9806719d90100000006abab635351acffffffff42f10c0b0bbe572ff550b6db6691360b5532ba7c469c631b6f4ab904caadd1c0030000000353acacffffffffb29bb232cf7893688a582c636f8df2cdb6abe5ac42ef2bf98a699a0fa029bebb01000000036a5300c07cbb036bbff20ee14ee3e168da3e7bf8bdfa9f912562d507efb0fa9baa7ac7db583c2f02000000095353520052526a6553ffffffff013d2f8300000000000252650000000000", "005163", 1, 1501550457, "2ec2bc433ca1641e1d4825da76739748b1f72ac9fd2601f73382ce641321b62e"], - ["729eb7d50332cda816be68e70d39e33cd1b45e31ab4ddc88c02996156f177afd4344248c81030000000953ac63525163635153f463dee30e55a0e38ba1a2bb4fe98403d4ff08e6cdb64a2f3a7126d4d2d82b087aabf3120100000005006563ac6513557dd287f02f761551581fb7177e72e835dbe3fd751cd7e203d532d3248286036a69270300000006515353530000ffffffff0302f458020000000001538050b103000000000951516a650000ab6a6322d264020000000000ca99fd1c", "006300006363530051", 0, -338681313, "6e51288425b657680ca63ed9823bbf52e1c01d0d7d9ab50409beb0964943cf14"], - ["580c944802cb24e10e70285f891eec869f7c747e452ccf46d85591f2a36d6d1e407af3c5d0030000000152ffffffff3ce3ec30253a9374193db045d32d027e6b389520d4cb7e9d49d53aaabd34425d0100000005ab6300ac51ffffffff026ae8d005000000000963ac636a6a63ab6a007f8e840200000000096353526aacac5200637d28910a00", "636a6a51ac0053", 1, -2052287101, "c145fdc2b12fadadab616b8996e6f7a71f3c70c2d15776df3d09267781592fea"], - ["cb2f69e103ee061481ff3b1826757f1777b3a0ec54f0f1aa5981973239ec89a45c3ed457a003000000036a0063ffffffffd8b9f9d9ac2b4334ccf44ea4e14d3c218a4d66000b7a98141a666759151b91d1000000000765ab65ab6a5353a97e95a49f81b533b7a75d3ae4518080bd332c42259020d42624a74dca6888c8d7d9335b03000000060063635253638605a6b9036a00db01000000000363536a33e8a60100000000066aab636552abb615660300000000066aabac00655300000000", "5353536565", 1, 853468471, "2100f4d6c0750a42e448db061e6c7f664bfcdca7a0d25026d642d423cb5e0581"], - ["dbbe5c97047ca2f3baa9096dd3e4f085004fb0c336041dc070e49ad9ca1a5b5911c5b721f002000000025265ffffffff8de1e2d398e875bbcda1c64fa7b2852dfbebee0925186650b8fbf23ba1efc69201000000066351ab535153ef59f8c074a066bc8d17c19ccdbcce0e9f866c938e6544175831c3ec4df67216e1e35b400000000003ac63632928f1b721a3e1ba8fbc61ec0be74a282927404fc52f89e6e09bbc0fa38a50e42f50499501000000025265bde14d75035ff2b704000000000663636563515384e37800000000000665acab6a63ab0639a9020000000002ac0000000000", "6a6a", 1, 1016383838, "7f9f3a137eadae7ca4ca352aee5c027c2260652b1e9c1c55b33acb67904b157c"], - ["c3fa3c76043928d19402b8b8599ae4b2951ce33fd09a016af373796a44baf355e1f584807d0000000005636a006a65b6138f62be0624d0358928c2e6267ab7f9ab29fdd8de810339b2aa8a1a5d6a72feb7284e0300000009ab65ac51ab6a536351ffffffff53e1520ea981923cf7b4b65a6e999b4f628c218a4534ed6110e22e3eb61270b701000000055163535300ffffffff499814d66599d08c0f7e634f590956b30fd12074941e10d34c2531a335084468010000000152ffffffff0431288a050000000002515347bbb3010000000002006a9a33e9030000000004526a63aba3fe2c0300000000002b62876002c80aa9050000000000000000000000006ba828fc06665ab5bd6b077ba2cd1256bbcdb9a3b87a2f7d7a3d9d7ae2063f68a2b8fc82041649a086edb0d3b327111790682b94d4c3fac9810911a37254f11352ecd933933516cbb67f4d55dd41d279f0cf4260ec461b9eb1b1d91f6e7286b4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001500b5c8651e6a30ea18467fb8f066d4845db6d8c425ec706e1443b003fd19388f41167999d02ec6749f02ffe5d6f2bbd2b3afb3ae39b0753955fba5d9a367e72080e0f9b8ddcb38504e39fcdcd9f3182093e527444ef88683f57dcbf5d7e0ea6392460d5ee938fc74790c8a1775a2e50a11afb5af0e54ff0abdb010a6bf3c1b02021a7cd079c38d511c13427a03c36eca7cfbd55faa65ed4d0396b6f0212ceab8022d1cf0b865a42d567fa83ce060e20d9f6ccb582bc47cf068814af9de241720120b0ebe4b0add4e9608981ab0f085f846dbc88a65745ab0cfe6dceb8210e7d3cea817688ec3cc84d310becfd7be1414cdcea01e4d9089f4439153ab4e2400287dee0224685d25ec97c360c1d4242e41965f7a253a580a15a976d9bbb81d0ea5294846032452d2e81a711d1110610cb117b9ee1bda425bc240f885bc320f7ce6080481310302c6c63262cf77430e4ae2dcb12ff6c05c882a0929c90cefc50f5969a35cc5040308ab1a0f3ff23b12f392ed5941d70c2662e32f7a5bd3cab5c0e2705bf8b107490326df7d3cf4b628a733258652182be74e1544fc9d99778f7b642b839daf94d212fa4b4c96ce47e76c135f650d1c5ec808fa1f1a455159115b92d4c011108641859ee3536532cd1b7bba67e9b7b0fb8fd5f0cd6f878031fbbf4e5721d09d819068b74c9cba91f59d24bc52eb42c35db85c9764b160ff193d8ce67789c4e3247626a523a4c2df4b846fda60d32269b5f68b6b1af779f05fcbbc5e89e2eb88907ba56532ba49e2843362b951abd7ceac11a0484c07f5c33dac23df65d8aee694e7d7de4e906ed9595924949fc49817ae85a3cc2d4ce56636582baceb3e9b2d32a9ec435295b2fb62068082740768c62e9d82429cdbfc599415b3cc515d61786f02aa5577a57a843475af3ee921a9a5b3eaa10dcbc8e65fd19bb4218392f962c41f745edfbedda425e47e49fe69e45568804001bf1ab041a2328a2c33a2f5cba2d87c9e0e9ed1d4a01e5eb585cd4112aad2f902aab86226f7ddf5ee9b5a442eb3c14806ae328e92f3fe8d111cd3f8d428a4fec6072add7ebf7e29a32eab0d51799683cf7fde102eb6d55cf52e923d1bae5d8c07c21c3098926a6daf6daf3e2d1a53ae61d3c45c0a5a837d7c4d6be64256bc9e0568adfe545e28b1588d149382f384b56e5871a490898456cc43de49677089453c65d929f2da7622d1db394e4ac08577e27106875ffbb2b40dafaaf8eb7df13c62aabd8fa57b55bf33ba84b5a19a2e086e609f590c08236e681eac98f1f43add0caad986315a47d774d7930c3feca199bfcbf74454e85a03be697b4217c02dded3504c170dc4f568795a46583d774aa6727fc6eca91b0ef4b6191ebac415f0f159c1879f9860847c3c17c2d40ea1009b5baf9276f1b5c2c01d9fc4039ba425ce2a61ba02933930859a29888e1071eee1c3029b53b512daac7185844b5122ab88577bee750af5791708c68a38375359cf5b2617c5872fb0191ada62159635bee4a990e3a8112ca12d94f390b91f87e54da1ae45e1fea954808b41d22c1677b8b3b0e99b376dbfbb882cb39967a4be3c13c8b51ca027e390c1be51cb3c476bcb907041d7c5682cdccb3fc937400470c4969446890e9ce0cd432d89e45967eec36431d5c3d6ed6604f946f80ce704136913e6ccfc104d01a21ffbddfb16913695e8ef32856a9a73aa7d4a08ba917919d861a3eadd08702d21f8f18dfdc0879ed6adeb47e26140ac7ece55862d73d3c998642ea7db77f2f05bc72d00510a11d5e4c3cc7da5c4006aa0a0af3fde1bd731c6f445e3587d6f69f205d67f1895435573b4c7ccc7e2e079c6f0f04ad6ea7ece399911f833894e5a1769c781261966cd3bd6f41d822b6de3490171bb4809c663959a053df4d50da1f5476be79cb7c11af63db5db6bae5c1a41fa912479bf8099c822dd72625a81c7c3f1f3be0beba8c0730ca441e3abafe55de36d80b31e3c23e5f9b728073286fcd0c4baa1f605cf922e5371bf504cf888986680abb8566eaf3b987206e46ff2d8aa5ed775d4756e16a95a3efedb963f3422150626fa29885556d37aed5be80336adb749fa8bae657d40e5dfdd932074d548979a8f61911b4a1019146ce953b38fd64635e3f76366937750fbaebea104303ef9c5c524d46b6af56d20434ef18ceb441aa89257aeb91efbbb7717a3d53bfa925746decec5a6aa016ded5a90e1aa1b544c735cf6ac58d4f996bad5e10e3ac1d6acd886ec249ce4ff2c304c0cee61590499ddfc2473d97ae698d2665f0cbf050000000000000000000000006ee1c940030a7aa69ea3c7e8a3bab44aebcc1652688847f47b196d6bcdbdca30b5effcc019cddc822c0cd3b1510e84ddeb86822f30040356f85be316125eb8f98518ced77e415da904b416e6021ccbe431c30cb0bd47d6a218257be227662a68000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e2bf22ac619cfafa590d2cbaaebdef4cc2be878d5e7d4e4b48b392ed9a26637501ecd10771c96765899883820950dcf0dc8087507cf6950c0183c118b4a5c77f2bb27099bddaea39a51d73662468c33c2265acbe680a946f3bc6bb7d0d8a969c9922df957820c3d8e0a8004ff3a5e7e4a2733f1ad61ffe307fa51d5b602354b020d9b17385719631b52a819115e076b8a3f6e9356172e39659b9aed70c6b35e42022b5de6e90ee3cf301d42e8885ff479c8a563eb03982139e78747c5cacb5cc61d0a09a284595c7e7489752927445519981c374a811245471a508b2d41f33e804461046f7d5287b88139d2be9dac2fa8e7f563d00201d7e967accdb557a14d0be6cc032e2eb5b132f72308ee66a929423247f0f8cf6fdaff314a4f424c2d05e9c72deb032a11ff9731461ba0fe3faf06586cf48b3f91b89160682bc5d8dec3c746a5cbcf0311f9c7a98bceb117785fa7d31601c5ef4d5b41107e4551dfd9d97293beefb2320321dd63fdd6bc970032bc5232e5d04f626ad6e7b9af237b8c35bc668366f4efe40204cc1d37d437b240e5f329d69ae6719e8bcc95e6c9b7c88ae00115a8d70d37663de5237f2e1d05911062d66e0fd88b84ae4f8d16b9474d0db3c86b2981f21d7772a3d649b3986b86967abf799ff835f1197c497c60c0f2e9e0dbf1f39f89679986599c4c0296b32822d487762dab7a4ae3fb37a2f0bff369ee27a01fb4b6f0d9c0c6d0a2f320a9d2f61a196eb701c9831432f671cd7a1d5fde5e85c007d1e0a8f7d8fce0f2f058c516c5e6bd77f0c2dea49de02239867070a544fa7aadb4ba242753776f00a6d8f29a335766d76c7ee80e9d220d9e7656bdc801abc3c7061aab432446b90b846a76051f1c870c8188b92840dcb182c191c004d6f03344ffdcf9a9a97df0891f12113f4ee2b37ed2642fd2915c7f859a713145b5e5d0508c63a88162300b0fa285b0fd52d98ce8c62edb528bf41402cb89e5a0802fd5af4a9a77419182d5a529895a7f5a3d2772e68f032ac0a6f5506fd256ac94056f2f75fd7b8e70628473eae7c3880c207e6747ba574fa7b73c8b779b216c2e7d1c8d67708c91ef50201a06bf5765f386ce30b2cb849eed20f1e8e6375230c899db3f23bfa8d1f3d4ad7ba7d085605328d2e54e249e0acb05ce92aff474ca5e4bd9c3ad42fbf56037346dd3125dab55fadaeb5918f4c83e51e1c67b58f104830f375443d40080bed7b2ab9cc106f066ee054ffcaff74d01252d3071d316ce6477aa1e3454bfcde7598fd551ce7c89744815716bcea8e59eb34cef529d936fe1edb13122bf2d2928115b1bbef5bf2705ea4fe0c1caf9feb3c7a0a9aa9671753ec8be91d74d625a15f317dfdb09fac2ba7bd76b95220ab1c8e611664060d49f1ef7e6e782a53bc2721df0799061b069b50c2d153cd7cf5f4b0150018ddbef10c77d16d3a4555d6523eda2244e2805bf7608b2328b60eec3fe61acecbf63499f93d278944591b7185e04164f3730cd76b263d035060a967d5e52576b95e6d9c1503106439a52e4404511715a0c54ddfdcd172c4c330020ea678a50d4ef5f4ef02a513347555a4ddab3c83b0c403ce03434aaf0ddf1f28d3d1e9182142e8e7de69e41f4076802e7846677f23f11247f6a5eeb7f483f36a6206a7d8d8fd65e0d1ddcb433ec0dc61d950a3594c8b365a65091111678c9827b4d1c954282bc7eaac9f861a4b69b0d8097d48fa47e4b76cdf7474203a13d155f3df50d1ff54e86b6bc6a230e602a5eb2565304bdbf30c36e9b917c32c4a0a8905ab5f691398dee0f509f39b25abf3c823cfd7443ca11cc67f07c1dffab9b71b1136944a5dd17f0448e9076f081fdee4c6194f7faa4b323cb306ca59c0718556f14563dcaf0720a777f6349f735eaada87e11788ac7eb97cfbbba744ea9d3c4a916e9d2c14a8c4b94a8657b5d96496498e75f41ef430a44e5cfb3c34a1aa52ac006b396d058b7db16b1af0f742822e7c654b7ac84cad4892719c09dc4a271c72202f8266d6795397c9013bfb9f43d44b40a4ea814b6b8fdfd23fe4b574bd6f8a53aa9f1b1668fe3e5a24a2c40168ea7b57a78f590d1d1879509b3d8cc182e83b5b9fc6307ee7b31e018d015b50214a34a37260c26bcc8d9cc4d9d5e8e42e55bd6914a7672a44ee90842932b5a97c1346499afc4003aa355bfddf713d5acfb01354eb3dd17fd5745294f65f525c846eff1bc241db78f44ffa2f3a71a68d976903bd389a52f94a8433fc0db1e3e00e926b69ed03d468888cd016ee6815601efb23cca221a745f1bc8e756c4941cec55fdfd6f4c8bae0b28b54a1f50793bd1b0d9b9a03a1e55ca4da2b5b57152954fdf50d24b7e5b326b742591085a394709f39f8b7fdc0d79b02330a21a2b8a63023aee4e8e810b007890e87852660c5eed16790f2805", "51ac005200ac65", 2, -796780269, "e5b7a021c9598970a47c9d942a5ce92a49863369c76f9c386ee16e621c1767c9"], - ["f216e61704d65e467307e8476f294cd674cf219459323c29cc9b46fa4aa062d72d5bf60793030000000200533b7846a58d38a726d44f2c358dc5e0bcfe9c3597dd26b5668192142e9bc223c240dae3cb0100000001ab25a927140b2154a15bbdf25db42d787786b20634740ace9dc34d9b8dc046dbdebe78f126000000000865ac65516353526361b71e5dfb0c20811070a8b9cbb33b1dafd94d53dabbad638937b631781676137148195f0200000005635300655348fa2ab903f5a803030000000008acab6553516300ab1a70e10200000000076a5165006a6352a853c9030000000002006328c54ed50293a53f01000000000000000000000000aed6bf4cc1bea27da7b2caff87d3d9d6f8677c778276fde626cdd38468fadaba8b262c6170161ae0b572426fbe76d2c233860a526ef589d02865940bd80fdfcbf26b3480e8c255a351457bbcf1a39bf3d706c2e563f80ecdd26c4af6da3e2d50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e42b577596a32e07ac293a0c4de4c32c4c61fdd393837deba8cd65a55a968c03724e4af3cf4151c71ca8879d483eec2b076ca0b7c2e3d266ff80e2b228c1f58b46ce87bfbcad64c7b05d367b52214508b252bed2a54eb4c68d4ac74b7087803420d4d1b958932f420b238b312696b75453fffcc45301b2fa3e55750babfed13021cab5e34459df3a78ef1d45e52569a51541a136a09cd70c144864e5698354cf80303c79f1be5609118c2c7690243df5fe381433724e532d93778bc261c4ca347280a237e8977614c955099d0eb54b91bb8d1aaa8f91f7a3ec2ecc2f1b640b913ea26170e2dc90e34facdfd62e50451231cddf72832f5cfc0333f6f7d38853be6795c0313cf638c3e884d78765713c4623735f3de32bfabb75e7e77197f43d554f3dd1c0217de7bf41d2946f384c4ee6ee1ae16ef435abaf59822f3a472d5caa96d4ae905022430f80b9c121bf53ed337bd3c4e539e165abfdb6edac06dc52555cb09fafcaa030e317f16fbd06f48be127700e46c47d6a327c3d9ec5ad616dad5da55db1486e3022b38ef64f23b4af60da245ef90bdda41447032a56dcc71479994e23d35436d29938c120f2b649cd4bce186abb690b96e3e02c711e88b6e6fca80325513a025d745da15693cb531e9ae28d4071f3f455e1a7527cd11695b30e43420c5ef2e362431b28463138ac17d910f6df493087e661216b5fd514caae249d779fccfa2ab8c5e9827dce325a1d90167fd5f119f92a5c939fcfbc43d8718e5426eb033cf5f4a1d4d8c166ede5f5db4edd625aef60f4e3c37374485d195d43ae0b909966b2c7bb7fcf88796a8f8fe8da06afb1b6b2c956eeb25b7ca6c6a4a609d15d4b9a2350b6e31ae861ba5ab3e41535258ff0401726f9a522a2afe05b636099a312a32fd997cde02f0f92ae6c1bada211d5d9f4fe90e6f07d3e15213c0bb75fb2e1aadecb84331b24680fb7f0c05a310392a947eb1c11091572f35e76edfabc491d978e3c34c3ffdcf8c1633dd7f75324bceaffc5971a9e27076a755217092c7358adb662d65624b1be99d0fad11281ffd35ac3db2539e4bbcb0a06565e80cf0da5c47ca60b8b07fdf696317555df555e0eedd88c86ec1aee8d13d2a97a679edd2dd06dba4d6170aa6f8e18564a146bd18a16a0f23a2dd69dbeb624de55af7c56565c87b07269f4c2842615a63240c20263c9a17c0d15df515fdaa7fe2e13d0329d78e75bd3db5750186445d6ca91e6703f2b190eaf7c3676973a062840fc69bf05deaef025c885398040b6781492957349bbe911729c3d371c334929aac564867e208e7690f433bb0078d85b4d37726bb2309499bab7c723db7dbd20ab491180b57c73475ebed106b5ee6cb50b17f3280b6253d09b467ff66a4a27f5d28e8a115fc42c3ceeac3d1c64ea469072f2e8c749cde284f56d7c3ef682fb2cfe574bc197366072fdf3598a41022c9772a7bf3fcdae65027738bb223eacc222976e4a96ac9184310e715aa0665860a3f97bf89b0d5473b1fececa8ce580863edcd08e1f423bcf832ab1ed1268ed005fe26e6c796db4dce9b226fe8d4adb903a7f919986946520673a896fc490a42d5a7e8c39089189f022ed49bedbc11eb33b800daeaa07a9347e013cacccdea50083cbb3d17f69d8ca9089fb5db92b53025735a4705ea1db9ea82eb1e153f8c6b85c8329d8f3caa588999913de11951c71d26249f48074cc206779883451d052f6d7bc4ed3b80cfa49d692242043e8969e576f6b438f4668a1c28cc56aacba3cdb6d48e8bf73a29817efe3f38216c0d6031d5bb4d278869cc1903d399358b4662b9c3fc9dbbfb2d8a554a4b675219ff015dac30a2e3af2d3adee91a980b37cb661a55a99a58feefb768f28fc2fa554f7a3ad1d5c0b0b76598fc4b8c4d667016b3b98ce7aee2ae2481f60a9a1deb207d922f5fa0fb2a55960becc26056fd7fc256e023c35dc7aaff9c762d49bd81d3228cd7be18329b026d019ff8d2b5340f42518b6fa6521a3d6f5b525a459fbe7c1f9c51bbc9b866126fb84eb84b88221434f29a856075072a73de27e13b29833d78b62ba58cf972cb79c82f5b2601b2c6a674d634b8e56d4309fe3a6b9dd9abe872fa53dd1592238031006046e3501a9f19775ecb3ef826acfa3d77c0249c3c78dd7f0e5b7055268b71f75b802a2b97529322d3e41e31dabfcbe84212923f6e45f6eb46e58d168f8fad893be2b975bf88afc0de01c0b70b520546363df9564abf9655b626eb8e3b68561cf76804d8a82684cf7336c3aa6345ec83a64eddf20000000000000000b8410d01000000001701cfa32c9c237c32a5f9933fa6126a59fefdef036abbbf1b85d4329be1b0edeb79dc15eb5ff70a5a7f365ed25e724cd2c20495fd01574928df651fbb00031d829e88aba4d5d076860963a39b761d0bb1a4e9342f0001131906c8fd4a52a0ab00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bc291a9603a767ed94db1eea13a0ccd816218fcf3552f7085c1df87ca8f0e3cdbab33f9ada42c74abe93aba7362c10b96444a6a95d4aa6a3a53469500275a6862d8ae4b93a79dbb1acdd589c0ac57ada45742c118da952c07ac46ee63bea1720433920cc5a9305c73b286d1d8ece0204c59f1da92b8f557db3ad37d94134d986030f99afac4ba99e123c219e4261e566b26f56af8b2156ef115f4721c8bc976b60032659fd0c280f155cd630cbc8b078d27642f791895db79145c7d8db747ff9d6730a04ae2ce8a93e1a04c6aa8bbb37afa8ab0f5adbb157932da28c3e2aae463a245829b81308d12feba1617739dccc5d4e9a2d336d3e4afcc4740a38caf2ff3a2a62031460fae20424384fc9750d716f8897a5a948e844356bd3c14743c597ed3388de0229df1a16e7d50a127573d849db033c76d356dc6ed3a35dfdda50b8b066b7ccdf032272a3c0fbe6c89f67c3c363f0a7928803307f21c8f888f0cbe2165451575dd802200862354450c5db01e60634c8781dff3692cd650142425184c3136e3656f511031f453e133334b80d68e117e7c6d3f48468e756e0973b63d3435c79028aa1457212affba6b99873b0ef6f56d7b9991397107c6e6362019ddd99a30152719073a262c663e0b5087fd4f6772d1b0329222b006b2ae34187d96522c03646f12c04f6c912372497633ee93777730405caf13d172e5216d513aef52b0551d16fdc14a4e708ef9260bc0aed26a3f30f3d46f6cc224ad20de20bbbff5a6f294c6a694ae17d72b0b0565ee4b14d4c6721a720741d1b1faaecfe58072f74a4c3bc7e2d18f7453126e973bb7eff63a6d7c85559f0d6a1ccaa4e2b29c3cf0c126da466bc48a705290fa00b56ca96845a56961a124970db49c2b7fd78df11446558fa6952c8c9e0327b4ca99f59fb47a094550700dd76b992b819ca292a6e42afecb34d239f0b83ae10f85f20adf09ca74cc8b5d37c930c32be797849c604f56f9ab308f81f001f8e7a470f643a44f2f30a350f236db528781eea72189e9eac4e68465a40e77afd2050a0be8d45c5df477398a8c3cf4e53ae046b6d37abf6cca379d64245f6c56de308d461e0b6725148c4a19fb03e3276f98b789f78e0f858c1530b8853df87a2e7df29bc14d4ddf5386a7a521284113170343ba51c74a0a8fa4525b5358a9ad15d3e9d82608d80d422a25ea9ac2af85185558054fd643404d8829b2a7bb6a46651b448da4ee0534c6b2cf8c99e475cee0c4d4e00714f94a9425b9ed2a4d70376159ad0cdaf9472f881f801b65031c448d54d1fbadb04a71471db9021898eb3ff2a01479808902b7c1330e19bfc5f07e9f2c8612470742de7657d73d0c9ff911459369db420a2b127eb1791a63045870f2c24c80401572215ec1099711405c49efa0844df2ca4125c11e1b2c55fb608c9df413fd20bfb75ec66893f71935794d6b3c16764ef7d4f5539214a8037cc4ae13e099fe85a7b6dfcda53aeda990f9a8f318fba1cb60232ade9696bade933c1bc6067c2b926b2b0602d866ff90a7a71aa22dde3e06db66935e87c7653b2a49e62f65c7199e584ee43849ef127ce8a17bce81cc294e9d6310c7e8686463e42d03489e62818eb4a93bfba71f6f1e2dd72249a6c2caafe7ebd543dedd34875ac11066c2ed40b96834c843255daf8a502536b29e6548316f5160df65c3c7df77a9bf8939f3baa111c6aef3186c1231d2f0d320766ded3f688ad26b7397270390544cb8d65c8b712f558fe74ad681e7020a37bf85486fe91a2f996f5fb1811aaefed655f1f61af569df701652756fbd25397c7e86aa4f1476181b341834712328ee7a493999ae10a4a73029b109ea42a38527511195b9c5b9ee22f725cd06cebafad81a5cb1ba3f275165b32a21192dd331684ddd87b35c5985f7c42f82123dd2b1a3ef773738817468a268ddcedfe09dc25e89ded6195ba7034512c6b432a816901de65ee40492d51aa6503788e897269179e0b661543695cea35fe814e2480abe7395161bad78190e09438fe5785476a0959b292cdb02475831edaa8da10a49aa79129b4f13e77746e9e28ead440262dadfeaf98724f02f7e0e5f16d7ec51c992678b20d8b4930564d06fb897cb2295bc8ec53926fe51032d193f6a1d0e9fb499b7fb9855cab6195dc1e570df56b6ae9ded852a563377326c8596f306c444a4c09f4eeea3d97a0fb1ff68b7ed779973b94194e0f621a5b817337fa6e297f92405c95c6bc1dc0169f98e28cc717764a9371348b34d215a455735b54972bdebdec74bc75063ad2f02e549c53daefc6c7b9c9aaf8811e4fa12ea6cc05176260807f3ed4f45c3d7ad3fcd1877f55b2971a7d460125850abcc4d2ed6bdf9e2ce6e15c10be47f9376116e8d668b6774bcb30358b0d49af968d7d0c725ea4c73ad1b1b8210c02", "65536a5153006a52", 0, 1172551030, "74eba569d5cd0a1608f8169b4a29d0a8da39341b1f0f64a2c496dfbee6300e57"], - ["931d5b050408de43cba439c12faa3ced38a819c29164087ce6822f415a15410d1721e9f3700200000007ab510065acac6533acfbcb4c6ce4ab222af7e2af45a7dca1eafe3daa9fce19fddc02dc1003232f91004ac9000000000552635200acffffffff0e5ba896a60f23586bd56cf8dfd8900af1914d74cc362824c230a38d6a9ca679020000000165b29e9a19a4c3ecce5667f53ad2841162bcf032843bc72da9dd203dd275bdbcc0950a68740300000002ab6affffffff042021e80100000000007b3b6f0500000000026aab84c90b0400000000040000acabb3ebaa010000000009636aacac6a005100530000000003af57ce03000000000000000000000000ae0a73100a2b25147eefd536f40ba0df8f84f13005308d04bed1855d81f6f1209e358590b84121019a1fb68a8664b0d45ac960be200ab2357fd2313e6208ff5d3858e454d5bede4389ed5e829f824a3920c7497868e2c46e1d592af1fc78fa4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d62f6e9fd2a447bce8653e7c4bc361d7ea82ae5f335c154a55c01ed1e4c00dfea83c23ecb3992232575eff5c89fefc0947d7d2dcdd9c0f5b548881bb8cd318ff9ec59da0128d6d855353d6133bcdf2f594789acf172e234d4487938658196d7032c032c8f6fe9b9e42bb3c24a1cefe5c34f672410537b468fe20120f81fec6e40209811dd4a9b19f73e2ed5a78d3fa8b5dde834b36774ed80fa7e100b96c268c7003161ca16f7c0a512dd04113e5677d5f40ef568d9dc21123b01010724113e261190b2f777b5c1d8d806af8ed67761fb50be7d0e81d73a8ec395bfbba2ba269a3ed8c11f69d1f8b93e761fe8b30f4e88a84f8a5d1ab39d31f02349ef68906e4d0538903016a7d3d38fe7bb70c69a922bfa329689142552f162eab4847c24dce60d28bdd022f84006cf5053fbf6968972a6bb52d6f26c04ceeac1fee7caae28b4d9e9a5a4c02053ac080cc2cfe73d143da493da2bccf2a235cb4fbee1a53acca722aef5721ec032518b6ac7bb653a95b2709d73169a783bb49493b7ccb5273c1ebaafbbf354ca7030523c301a4bd7e2bbb453605a44b18e334b8e3d16752824c882835715633b2babea3126db377418c39d6e97a79eb3a951321c02d101564d090036b3e7cad606bbbf0d20e47a8141d6e7f8e3325266d83e6d3e920babf35913bb29622ff4fd134e3d467e2d72ce62c39781a4758094ff35c1290eb35ea469baff4782cff32fa5559f9215ae6033812f3035883213f92ff0893773e1b0614e70645ff43948e542e0baca5bad99bf8cdf17f11c4073d9f4aaa40ca71e3f44929e56e5a4a4e64c070e34766039fe43305dbf30e46b7cc39c0933b28f99e68464475af9ffd37962e5c134300b8d70b0aad68b854360493490fea41866b38489764422d2d36ef5e6677bb88aba572638439fbd816a6cda1a746c5117506d821cd70f69aa84bfccb0c94e6c5a0d880dae1933580d806a9af3d1db779550a7c0345480e361d0fc5d491999924707938009d3055faafcd8b1d9d7e92befb4371c4837b87307493ad96b87ff67467297e71bbd950ba8dfcd5d35c967189079bf59438b77b8a0660b5b6675fe1154341d594a71a2fd5a9a0fef37199c457437db4ea3c39e471df0e888d42af61fd6c8109738525521ed62162d9679682c0a1ee96d8e0116e9961ae9f6645366a8c9877a03237f0711e5de6abfd0fe614d27fd0b89866d305c2847af6418937d45e30f21533a92598f94c8706b608489c2d8c35ce591030aab55e963ba770b2edea0ce68124be57119c2330eefae4f34599e99670a5db5002d7589cde10b85a61190a554fb5ac1facf6673ae35fd671dd57371a7f6ac412d79ad1fd994b339070e87ed5a53c40d25392a351525cdf4de5f95bb571eda0985743c63bf7d5471e1b506408afc925bbe28c4c183d4e5e19e677bd72c9f677f2f21de3c7c56270e92f20b8e7c95e536aa7a4b11298ffb7db290b6dfe72e9d84ddcc7a1e329eda112d4c4d691c699d373dec7dad7b872cc502a5ae24e6f27ce32c87b7491a0dea89e21ef34753006e389907dbe32183c3ae5e9c62ae954163e7513e18198fe51f4862b92b8c3950515a088318815cf68d0f0e7fd38ba15bf4e07e89c4c8c7c344844bb47d759498ed6333c084e2b523a305a4a9e60f52e4a29b497822e43ca38bef1718a482c04a2b62e76268556cd342dcb5076d92c7b5c7199bc689461f351f18518e0b614d624c3672f8fe5a7bf3bef829c833fb78fb0a7698b42f9f66d6f89a09693c1c1e12214790f2e8ed667520d7b536a670bc5ca365db06404bde3c20724a322d48856465143351f5a58ccad6807d129ff531877d0bae09153c852b9ef6094de0eb7ce4c40c46b77caef173af9aa1a49966b4fb0b4a153cc7db2cef4929b7b241a55b609f912facc9296adea2ca20c797010722dd1b7b0e55aba7b4686804433ff86f70be599b025b34259187826e965d08b14a6327a9899900e8d1ee6e4d0d9c3701ed72048dfc94495e9edfb581e172d2648450f3ca76bb2e135976d19b4ed0763c61896069e4e9c58d6530f4d729656ec1e701eb4c90936c498209b44934b02f20e41aeeb521ed8053aa5c601037172b357dce2a54b84eee334253cc0bf170dd8964065160c54ec3a51f8180dbe9f6f1b07f1cfc8a97359ee6dd305199de387c10029d4110a583afc76bc4e3ea491c4795255b2c3bbaab1f4ad20bb27571f31fed97d0655261257013c71634b7e02dd08c5cd1f4f37a3e38ed876950fbe4e31f2d2a9dbe6c742f3b8efd90a679b25c912c405000000000000000000000000193bc408e118712b2eed44a69f5a5dc531c8c764edfb344314f4c0e213965695b95da5255e7f9bfc0701decef5765e32f334b7897ee45f9385b3422ed83447d4bc841eaaae792375eb45c84d6d8cbfa6aea4ba6cd27e65fc486af56fa27da9c800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000724246e81d38abe3e042f5ecf000807aa2a671aa04a2fab468938ff1e782b14712eed261a89a9b2bd3f1afa26f8983ee42ef3e623c261f591040752682b4d1934f21f12cc3e6647f4af571cd27532ca33c677951ec0843993df002600d1c83366d53a3826c7e7fd33c465e3a8adccae90d16778e93c0ecf1f175cbcf7b966a9c030ee6c048a29e8307fdffc6db09830478a408002ea1fc95d4a66d5120fa1d0278032c77ec6a4f9ee0c4255a55824395631993c8bd871bfa899bacc347e9fdae1e9c0b058f8fa34dc1f0a160310120ee0ee7d71874b3019ad4e706cfd8e4858efb1cf6121ef4c8bdb82927f688fbd673780de0a8b1db2cc25de59f9a8c05c42a9da7ae0308bce83dd4e9cd08cf0820aa9b2f3f0bf03115efa8aa4816f19f8262229cb7540225a3dbde7e8030b607f64b879e9162c6368e2477c8bd9a36583c9d1f8f2a96a203213148e78d9ee9eca7b831438236e2697ba6cbae0228b391aa9bdecf8d764a9e020c4d19b1fde72ccb102478c7496b71e03daf52df30dceeef245972955c35e9d9020c66f9f93dc00b934bfb10c28badd77f1ced57608c403069b703d2db7d7c3f3ae5d7dbbba392acb49432feffbe2264f009c018ee5474da2d9a566b98df2c5abfe22c108b5b4ba4b6ad876b3d98b2bab6445fb5b3905fa527d486690f0bb2295b0fbc2b183b4a12ff6e3591bc5fb71add0f150e4b30d4ba253527c65aedec85fac7ac26474d4ac7b0cf239083361e6d8b04e2e0c89407f120514b034c373323b06f101ca0d61e9d5b0a6082ce68ba1fe42e4f343deaa1e274b11249efc342bccb9d3c282e7cfb7f54aaf66d7d1e546e9c18f30a20da243a3fd90b7cee8688df9e9ac60f1b647a6c7f0255a676397995156062c012e2896768665f47d161b59344bba4a60dbb827797b29a6ded9277201e40222c12a65e1d6829cb4c7b2d23c8458491e994e6cedf0a186c4829e6dbdcb321565c3318ce0cd0b24ae3924cc4e42fbbb5541d21e16e11598e9faac19f2d2c6f021ea577d52f435712a44b777997986d29fc5671d50fee1eec7e4c4c577cca811cd5220ae71006408f0b60ad135a93b789dbbf9cba3cea3f4046e6209a882105c3942f8fd2a811114db6caf011ef06aea69cf8af708d9e705a5ea8b0782f54d1a65824233c443cb0beddf16439b754c225881b59b95380187ced39baea643edd1f3d23406a4b670a55f3a8475cd0cf5f73cb5942f4ca5f688d8df13ae211cf7335cd388074c9da9bacb06dd2be075612739be2cfbfa23a387df90b1301bac8ef50c8b2220456b1d403615bbd85fd47a05ee65bc918d2373505ad3f01dcfe433bf73ff8631c993465ce233f75a8212672b487b67319aa7edf8f630b502e7074afc789077369da17d303a51cea4a99297f166ea46093f82a44402a222a4db398ce572659deda2be6cc72d3e4b29f473ed60bcf1eb283096f6fc43e3357ba96ab041a2f7a2071c2080f329fa8079fb55d669d08b4611cc7a80927fdf7432d4c1c09a0176eb2a72ac7b053542e5fff9dbb8dffad6ef6a0241a46bb6b5f1452059e76a36efc749b4c7e1a3a748beee0bce09474a42db205a9593d54bb966d8efa404356f38644e50c47272940cacfda7231c407027b0a954fd4544144cb882870b08135feea6357b9d37b77743d1fb18f9ae1ca2211c2c0da9e3616f60eb9e7c1d93653abf2a81fd3a10bb05b9dab202116c640dd9dace9d631cfc273df39f657e8ac3b340484f66e741aed3e35ffb90128ff155e6a3c45d6914138cd164b2c797176a16f1bf9c9bd19b7ffa6a866e15dbf060ab3d102ca82b519410e2dd7595ac622505a6fd59e9b6b0003c05f6fbfc114947498015c6118876fa1997545160afe14383623111c8324cb3762a314ab55d0399523bb788029b62bb4da24668e3a61ea3a1279c27a304b5950f84916133dc52e1ef5cd4a34ee418135544ffd2dff893fd4a1f7fa5e837e3cf1f12f587697205052b619b645ef7dd82d4725782e73805245b8400f0eca7422d0647f1b86bf0fb896326100b9e4bc30dbb882e7d1f1a814861d6735f3fb239952f569acf3b9a13264d951bee3b5b5d1ef448c37f0eedb07a0fa3bcc299d2239c5774cbb46a0891e27b277fb6af272f9238b2602e891b8b983858ad53d5142b726e3e71353ccd1c82c6b27774c773e903a2a93393d40c153145d21dc8e3ceff5cb3cc1a16669025777a33d9c8b986e6e42658c60531b4f2c3248794c70b41e50339daaf3a1dbe35fb84047da5ffe845e2dde760c1b66b508550000000000000000f886890100000000e80353b9eb784d8aa119847b20c4b1f23c0a177a0a84fda3401a2b61fe199aa1c026edead450f8218fb949380f7853eda4d3b44f950559d97d3798f775ea779678320253be6566c23561f326d2ef04ebe404bfd21ba930cdf0cf65c58b4df991000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000edbd8cb502695c951b40f1a346a6813cd263906b849ae5a85127579083b9d67b8e3290cf95025b805709a93e360f8206a91d6391876e2f8fc9f8ec4e83b1e63bd4915507671d4a3ab9e51e0ccf3f2e3445f2bece157d7b00d84a780ad488c3627a6d9fda774d0278260ee1da87a844e10e32377f67bf6421170caae74e4375c031b30e9c2826ce2a3cd33901fc511e461cacc2817333d949dca4e4cc7672e9cda0207d8c595a91417a4b78b6c80514a6d903c1e953b50ec8b4d40213b03c7f612430b1947b4c46b74c75ad94d63ff18a44423cc231cb725bd797e90e0b2881592fc1a222c68be31e49031291edf40f292f87639a833d7d6e9db868b4a9c4ebd242ce60211c89df481b5a5e5cd9a973bdcfd5dd41d4d943ad9c4675a90dfe6377c9af42d031aa5e3094a555c87e8ffcf073903f028b840df7413f6f3f3ceb78e4b78075b95032873cc2982d03b8f3d22f64b7e820e837b3a868c1579f63c61418706ba5b0de3022ce8a9f1d8d28891ede031128dfb2b7ef839743fa19ce4497525e120b834c6df02173d9e3c5abe12aedb636af9c618f61a23809a02da28cc2d5a9886a5f043af31d018584098e54f7ac26a8277ea44d0cd5e2289eae3dc8b95d2af6023995380213df8ab0090e7d8dd7c013fdfc9790f7adb4444315b3c0268705dc3801195ade88b4bf9eb258ebfee4f7c3f685322ec3c394bbca7fb0befddd30dd58f32d30bff2f6f2119740cfaf019577ccff979f9ec7c09b949ec1ef7238e6906de2a9074981dfdf56b709958e84b34ac2354aa68ea21574b6b4a32d18407ac244e9eedf85e82697abdffc2277c44684406499c6e5b00e053f9c47d6bef49f316cb3c96ec5629606f963789d71e6a2d0597178ac9339f37473e6d133ab0de2e5a8012dbbda90cb2dbd4a95db6b5dec9fadb4ef0295475b10807303349c85f9a4bcd098ea975acfb0e7a9c2b83fa12eb73c7aacb428cec60f90e256dc3c3e1f36710980860cd514c2099a99c667f8c4e738cac705b7614d94054ce44a035ec2b31090f5db17bd2bc0c0293f4d6c1cbd0de8d1a74982b09867b564696f5994bf45bb5b54cafc52034ef2ffe41b44fdd2c2ff7a87cdb3d76f119acbfd80bac40cd9c8620c9945c36371b373af221333b10836e81ad329f86543818bbee6ed104fc836d771c33719006abf74c3eb7f452e85bc8f866d2dc185b7df154c5cfe3d3854c40c3c0ef498a4a43bbc761b8f026a1df7353435a2d9024fd09f65b205e4e9e413015cf336c20485cd75ff3e11360e46e6a0e16578001d06188fb48a7d82792da6e1dea911893dfd1159d1e9f27017e039d608de8cc7eef0690ae1ed6e9cbcaef44e9f571c19b09be1bf2fedd3e20a3df484740ed08026b2b2aa315b57230303511671184e7e23de98d87cea42e3b8c62bf8f07ef4c5ec54ff38deedfc56388985f2ce4f4005a5ff5cb62d47f39f5f6b8d2bdf9506393ce500d1bde2941c46ca63da9691e1f50634261897375eb3a9dec25b78d47d9ab278fb0355408b78823e24d647c0d184a5eb972ba34a39975201d2f5708b2c5206c7dada38cd57938b0e5213d3e89b1525d4e9fd084fe229bf9a6ace4cf8eee86990c2b36bf7f1b3c6a49e016f8a6f7b31dfc606e3d3d6f21167b4e7e352ab7a484bcfb6db8f026689d2b05c88c3e66d124d3432779bdcfc99e03c3158d9e79d84267bcd050ec567c03984600f867f2b7468421d933a9a8d78eeef69d6784834baa6f66de04839f93c1913f84acf524c8a8631241879e2b7c79b87cd052b13f98432a3312ab6134bfda66e98fff1da7e697cf5375b4a1974f68542693e2adab4b77b63657f83dd759d4e70d822c78b72dd24f2e951cb80c3c026df36c716e4572bbf4e58e12827209a8f730980f04d560479e13a6c5af887f197dfcfab15c6aa36135a5a9a15058d76681e8560c0b12cccfc322e998b8759039dde9048b09fa898f2474e61c1a960d85784aa77df6b9525743746e22fbcab65e3fcaf2161eae56fae6b212d4aad0e426d04bdf96fdc36f14bffca7ed7bc260b41bb12f62bad51cfb9b27a87b3484fe940fac88817c61225849e625f0f196b351bb484116005e53b03cbcfc40dd8bf382a1b340f1779ba4d1ba009007c871a06477ff365a86df0622ec74d75877eacfc2c283a2e23047f6cda9f591d666e03c54ab9957b6c43e71eeeee101dc02773fa203dcba609a6973ace33b0235c4d5870b2489d4eab921e957b2e7d4630b8c21a5720cacb1e344720d9a9c050e7b4fce4820b37f9b38a1512e8aaa34f23fc12f0ebd1f1b356231ca301b7e863d7464a4cde87386bad92d6a0b995542145d41d908cd3ff6201dc5308a5c8a730bb66302edc9620ee073a683caee52ebb67446d9ead88a009f0e9576a4ce6d87090168480cdb53f8a8e9e53409", "5200636aac656365", 2, -956787194, "d9b03fe192df1b358701dbcd5ec5bb390ac63d16c87b7f5cb61791d44d7ace68"], - ["f5132c83018ceaaa7d17e35feb0973b073563a6353d9c9483f4af61bbe15180648e0ae429b01000000016ac3f5ab4c015bbc0c0200000000095351ab63005365000000000000", "6aac5265536a", 0, 1055742825, "3f902efea4b298c0ddaac3ed4d1ceccb47e991c63d3eb88c33830461b93fbbaf"], - ["aa0e5a7d037123cb16e271e11204fa1e33668b144fc86bed1b77dbd3a09c1ee856a7588c440000000007516a52abab6a51ffffffffe46fe0cd80ae316cfb6d0a85e718da2ec1483e8da759925cd15fbff224cbbb1603000000066a005265ab519de29f4d8ce7d836bf804fd9b22677211bcc5c394aeb9ba2149481cb2f6f6554e0d6c21f0100000000ffffffff02a4cfc9040000000004ac630052a3e91a01000000000451ab53ac0000000001b9e06d0100000000000000000000000071ddb17d1247af8b1a5aa8443a498c50a4c846a09e77a694a86fca9b70b311efca5f0182688a18aad51a8565547d9138de9fd8df4d642fb5d260fba28b3511551ea0a0e4214f257fd45319ed36467bff2e93ba8a7395bdf5e14e61ada4025c2d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b46930594f661ea98fe2c0fd602ab26a5d8076757706a8d30a2f2fabcef2f4e34958971911f5a5dce0f145682d71976dc76f790adf3d8cdc63b2416ad7227448f46274d696e591419323357ae47815946413ff488adcb4fa138ee19e948f2925b708ddfab265ee975c76bb4196e28e81ba3a7f43d75cad1de3b601f02b20aba0022b2fa59fcf83bb7e09171150a654c65a0e77650b953d0bcba88b9c782a31beb70330407ae9a5a1b0c1b07a765e02412816eef12d703e2b9098992a1c7e05efa3c00b20da63b5d5acf40d758baf57c804d0054bea986690c2d498867959198d3f98051d59ff2c4a3be5f87cf148d31107afa58204a85c4fe22ada9c10e60244fc49450229a9faff414bc1c844e978549eab2da1db610cb809777016df2eeafb16d45676030c1fc2f3629e8b00f96076c8f35ff2613113a52a7e76f850365032d55dccdfac022b95f7b9003c4bea064cea87de599eafad89a1b5b39a579afd48fa2c18afa43a031a5071433e0d8444c106440538543663d3a4ab6915409d20509473fe9593d4ee030ee23acb632387f4308977757f777b5bce0b7ccf53cce7e9c7f850f475fe938960837596da9c40eda2da85a4eeef7c3a0a4f5c31734a4be2a6cecb0af5052dc856d9c02d500bd0245adc5c22d25e3d8d2be09e3dcb0206e8360c9cf18f9f6b381ae4e22622ff75eac9dfdb182fad1704f45508287ff306d576e1ec93db5801b7fc585ebaa239edc2cfde99b76b18e4509f7464baae60e5a3d8efcada522a7d797380aac50901b57e7a0aa55cb2c92f72841baa72b2552d230a5219d0af0252811c218866aa68728ec521d229cd4558e580654c7e8b8072946c792d59c22cc4dc46effef480c35e306ea6813b6266cb4b43e2a2d723c90b3c5e9a92cb87bbf7ac3ff3ceeaefadb2aafb5b73ba9fae5924502cee6a0fed3634cc031df4053fb3062a862f4891fe296435a07cf3a48ab8fdd9c3c9e065bcc507a0c57a1ef522b798f47cdfa7d07ef5321b37d6f0ae4a9c52906c7e5c881e1c1f4a21af0a3f7a87dce9a1408771e0526ae3643b9d7568e3940eeed695c2336e828ad3ad71377313fbaf431c525a4dbf862537f087045dc6403a067622c42cf4caffc38de7cfc2012a9ae1da75a734f3bddba97688c0f67f269acb058482cc86adcb2f0221bcbca8d966ab9adf26a184656594b8d613c913cf8da9f021a76300bab89d910c6e3aaaba1d61c1766b3451187d752c78ede87617c37d9164286633ff9f8917d9cc1d7ddd472e4b87722c1b40c76788c21e1dcb4eb645df9c94a05681164adf58572809d8a6f4166d406e3afc8d92778b735c210d5d863c06ec8444fbb3da06787e007efa6e5d8c7d9abfb8bc3465964d72cd7ad28aaf0e6174c9f4d33290faa49f3147d98c80548b9db82d29c5231f292f4acd2e190875872023ece9d1578e5e5b444be75644ae010be4defbe125353c33d5affe8322423119a5cb33724bfea961772c2a53501d0260a41c177f87e1ffa4a1351a7f240793ce5b567354d3e54d78a41e64e157ea3aa06c0e86b0e66c9a4567b2c2cfb708c4cf5ca3ed891c08fb099fb73c6e846e68bb72488826a5436969076203675b043cd3b8409194127c7ec1f9fd52579843a9ef9b2336b638aea2177bba267324b100d321324388da888be92513d504c10ca61cedaf518081d939d3b87fee9e6b697996ffac594775821aa88c7c6e92db68f8cd5ad198e8d1f04743ac275d9b25a0680748346cafc36d1100465f3ae83ed63190001a94cce0feca6173be30732e6578c57753e7b104379b91433b752f8c109dac12488289ce7bdd1d80bc2d71add9ea5c77f08ac9c025f4227245a74d809775862b1a9ac759f40648a6807b75a93c84be9e07bf108efcf3ce4b9003d817cb684a999584238e1c5dc3ff857092122292e93256a61fa96a5691cd181e0ee106d9f655e1264f0cecfd26c246eab9fbe299a2a8eccc7c83d5f2cc7837ba1020c0baf1d87d44aabb279ea552ec2660cc887592090df6e010f784aaaaab737a66f21d85bcc2c3da17934bb05e5ce65f91cf21f07c6f10386a962df32d13126cf77dc48c4fcc727eda7586cd2fc245f9f09324631c6709ffc2e4d38402700e805fe05a3c016d2ed4ae9cb042b3407e1fa1d895cc64a1986e38521afe213179d8db8dd8b45ddaa740effe292101337086829766c1d2d4b4de8bfeeec6cf6c851097ae0b0f4ba93fe25dc9c3ead7801d22e8baf4bcaad41963da202ac7742ca5ca7d93e8fabbbfc1f1155a2f183428b25c7e6e33cd016cf1dad235cb82848e339fa49a838262b315f3d3c8786a74b4e7053e48bb7170704ca10c0d6998238ab788d85d50bbec037db506967d1afcfe4e581455f737c300e9cb30894f8c1a995d284f147a147af86a3a0fcaae45aaf1463d0d", "515353ac6300", 1, 2865390, "279250d8f887d29f299f2ea5baf28985957c5f294cb8e6dec842e735b57ea033"], - ["4d97089a02ab0ed372ec190025feb89731c0e52e74e1aff6227ddb53a108c53ebe378e2ca402000000086a6a526aac006351ffffffff4092f1af0be76c780e8358dec6d4d745e679945bba9669c7260d55a0c9c260030100000005526a6a5100ffffffff03c41e3303000000000365acaba132df050000000000ccd88c040000000004ab656a6500000000", "51acac006300", 0, -1925098182, "eb395b6a5f87e75aaf9ceda494314f305d60610da4aeb82b2fb35afa557157b2"], - ["32b5e5f101e7e90f162c2016d38b774608f568c917fccfaaddf88f0207fdca9e888785fdab0200000009abac63636a53ab5265ffffffff027349d20200000000046565516aaf1c1e020000000009516300ab6a6aacab6a0d341760", "ac526a636a51", 0, 1050565107, "d9938c3c6300f51c233e2b094d330416d0639ace5d8fc5382e73d2ce78af0a71"], - ["4ac8d6a1021c51414a92c123c75c1da57edd4a22e99d9a8fad0b55f33b652ae1d164c317070200000004ab5100530a0f32e67d37611bb244217f59de40d20ac4fcc6a53279b0889e29fe64737747c6d8532a010000000551656a00535baab3d404b9c9cf020000000004535263ab308a3f050000000006ac65ab0065ac218fc2040000000006006aab65abac16aacd0300000000066a6a5265526a00000000", "52", 1, -173005906, "78d369b9852c64abb24b5d7348b140f28135ea248da53356349d1499872e9d0b"], - ["c5a8bbfa030668d48f9645858e5adda4cc05a03d598f24f2caefcec2ab3f145696e07fae930100000000ffffffff46cc05252837d9bee8f9335a04c69b4641a5ce767608379cb246a543386b435801000000002cafee77cc2b67d631dae9ad42b2d47a57c80b0365c75249af6e34111b8c5f97c6f090c90100000003ac6a52ffffffff017a42c703000000000352ab5200000000", "52", 2, -622472365, "df6cc514ce1c44f7f302f6e15b27ccf8504c8ef6aa0e5c02f63bb95c4e2d18a7"], - ["ac2648e90208a6997bbb57dd2289bdb7482c1b7565603c18e09ccea7d82a79efb84638c2e2000000000153ffffffff711fae6be6588c24bff48b87367184cc7ef37d4b2b7b9ce19bb5e4d61288a201020000000800635351ac650052ffffffff028eef2e040000000008536a51ab51ab53ac74fcf3030000000005535253ac511236d78e", "ac5352005265650065", 1, 1223022458, "8fbe583841e6c94d2c19be54a1d813bdcd28c95a7e87f7d2a372b703e7f1cd50"], - ["fde6dd3403cf0b3ced21eeadae43508b5c30eddd5439a4996311a70c5ba016c0648dfd445e0000000002510050c4d481141e56f551fb59712ef671620173ece9631ac02c1e639307c0b40a9e7bc411d90300000002516a621814daf93c1870506872ec0cf294a03535b73cc88d385dd089037855afd0b8c29b6a0100000000096a53ab5352535151abcee4e2a2041e1700000000000000ee7228030000000004525263514ec02500000000000565ab006365d7d8bb000000000006ac6352ab5365fe71331503f2e6c8030000000000000000000000004bd7c0009fcb08248eb4ffe1d21aeaccbb95cea1dfde26fe8e469bcd2c3ccfe429b0241eb3192c5796df13066096120293b098fc562ed5b60c4fa8616e4ff1db1d6e2aa9127b8bafacde3cd3c6a3b68f4706bbbd94c6007194c264f9abb27aec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000650db20c3fb2e279cb71e3db42f9ed81c785b4bb1a7b95552392e39ce5d066b7af05db776a6aefb33f83d71dab9ff578ad05df55b4e4729569ee4ed65f8f8a24164351b764179ae3f89fd552ac6807921c8ed4728444fa4b7de8ed9b1d1f6c91aa78fb299494e7027d89c68163ec93431ac558b35485fdf01aca6b2ecf6d520c03260572c0f425c3ac0f5ddf2e565827c0c9c7de4598a25467d1521eeb13f81fac02108a7e710d17507d964231a2f059acb864b2dba29372113b54cb4ce7c88cc5a00b16484fcde4a56f06558a82b387b6069324f73cb9b2c1b46be7e5948997cf6eb72d656388b58517b83d6de0c6821b5607e83d6aaf23d8259f513c0fe1622bb80202129f3abd7ab0663f247aee86cecb49633e538c7a0d73f292df8508d0ab59c10b022ee4f993cdb2dfd0bbea7249ed14f7099fa8516ed40f22f0c522b063d1e3935b0325fdea70ec76589300680aa49891b4f0be839512ee7f7a1b04f1d1d452d385ec032fc28caad9b27c51f26ef1af38d6cfdb51c25a0122fac70617dac808d3cbd73e030c690624e87319da02e77d91fcf619cd60f56cf73b13999a50ac4c85e67f809c106278a2e09203b7a2ef70492937828fa1db01d8f1b07ce92660eeedc98fac7013dd4c4a2c6c9228dbb01331fbffd7f8f2015a3ea632ea082344445ff5ff973d75bb7b8cf999a4f2342b61289b67a13850b8923ffc85fdec34c40dbcfdb56be8cb323b0c773677b55bf300a90cb9354dc6b5f747a1a6ad4767b59d9662d1a5795b24d14ac19847f6728fe382f6d6e0daadd0322215a65301ded56efa46534546e4c0167249aea40b8d77e10968367ff69dd3a673981e8dfe5993d2efc398338d8c630776a5fdeb262a0b50f93096ccb540e6f4f187da393037c30a98aa1344e46046cfa11d8a4e9643859c4d512fc93015e71db14655520188379f56003836c9fbe151d9055a4b55959f6ce3828cb279f3d9622d7235cd46136279d2e39d93471ea8a0e53a050829eca78e356f7d945798673e60faf638f2cc8a4035f865a45c7b0d6cdb2f4edc04b050d191707586e091b8890cc91235b00f84d84cdef81cede10989cd269209fef5195ca3eb32ee4a915c5746b7ea4dde6f356a17a775ec8330736a9557c7184281a4153b8ec037ce222eb7af6917d95d22081fb743e2f62dfb83e37c3643b4133fe629349d40ad10c3a1c8ea13435a83415950fafa375fecc153e84b81719d3e3a605c4c46e87ba59582d1aa39988338281a542bb37efc2d1bf6d5a717d527696e3684a711be9ea626c48b2535d05d383c28084940d92f5adce72882b294a7fa23dca2cb1f853f671443b151add8512faeffe10d6a0516c2592a8c877302c807c222736d52b5d3df2b551bc1aa851dba67ca867f1892d084643b4acfa48622163cd25d8316a5e804db495275f4c95401bf0c9f86bbee8da28775a4c1fecc8482eb1664d6f9b654e368f31bb0e0ee57ecb2ac878122eb98047853e52f802f6abfb5858b3fb726e9ab8805e740513d7f1665ad7211db79b42947b8fe320aa8a87988535b4eaca1bcafd10104a8fb133b2de796a89d4ffe057f58ce874733792769c3174e39e7857150c53ff5d30c293bdd4ef601f0c8505bd7bc3801adbd790542ca2c81853a12f82867a24768bce00771de693f06d4dde4c7e2fc53c81fbd9a53cdead1cc520a25576d54b248bd3fcfefee384e10ac2e4778070ae21eff11619859ae1371a0f5ec32d78a46f657e877f2cd73fc29e08e64a7938756c4d22ed18407238c6e21d615fac8bbb1fb525422dc8614785b8bf4bddf8d9ea043073123ad37a972f4c41b128c57ac13f6fa94c34509605d78b1fbd8e2cced5e9efe9219f9d89bf6e4586ed6b184eab88c1ce9505ad0921df38fad8501cc1a79f6bbdfe29edd3caaf24428a61976b5ce3b82e22d330000df2eee0bf7d6d41f87b6cb018b0e70948e58d359214b7762ab7ac694da0deb7c94a37ed5db93ae57f020bc3c69d26e46dfd32f9da04f443e9c61631466a109c98e99f3367bb8bfc197fc6a4b657b4873423a235cdb5c156fe2c6411906138320ec114cc117002db45017d77071cfacd2738e2ba3745a432560c5076dd72016f6fe36f43a866325d00c3133052ece931338cf435015e9081d9cf6f0540cb6048a90cd925ff044b0f03421804514ce8b30665caf07b41897a5e1290fae5fec219016026f35fc122c924c6b91f2895be1fc18417555b2ef6fee1421d4b973b9ad4e946d86a9d3259e38c59e296f7325f4eb54cfcfd9617c26840000000000000000ffee15010000000031ad32008a6cd0b89b21d0801ccd0afe69588112f09d7c2a59c268bb59464fcbcf4ffd5d584500dd6645adf96a965dbdc7a9a355125669527c98e1f9f4c33f37620d3ef47867fd5bba163f37527a3cd14ad9859d74b71ad9d4e6571e352a49ee00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1354cad0881a4ccaf56ae491dc64f371aa845cc06ac1f9c6da10f85743a5608327aea011288cb8966e3978905fcda1e4898677fca4934eeafb3c00913794ef37b3df73bff38324ebfa5637978d5c6af78a847c7fa8d97a744d48d955d399183e55d008fb44004c8308927db01400e8dda91b93503f3051e451441c0110abb3b0226a360069e64ac40e66f925ff63f0e824dbf9b811a10ca4a3a260856a9aead92020950609669da8fbf11e5d8ac6ce42648769944ef99d5a76d301a81357e7852180b194d5016337e52c4a473e41b9511bb1e09a1550103abb69bda3c1e373b8f59611225a6986b5fdba99f956bf7a089a6dba207b9a488ea57a0a3d63a6526adcfb902109868d402b350e5bf7f071d6ffb1743caf64a8ec81d12044378b6421b4b9cf5020802c586b7f764300ae609092616c4bd9b7cc3c33b222c643fcdf6cf5bc23212030f40ad181dd4f66b41274be43937781320ef750581f2e660614788fadc36f85a021b7faae78ede3c8ccb3cb77e74fea40d2999908a468824a8082f9e9be1eeb08e03103ea2ad4d214579f5696716716cb90563fbc6faba1238b8bd0c11e27d1ab1c530107f42736b7f5c0bd99c58adbe39ee8bcaff270f49d0598455a008a7019fa31a31da138335aeac858cd9b151e2dafa1d8de37510a943834ca5818c28bb359f29904c7c57f22619936918bbade8312a46d121a5c042dfc911a4c2b75d477ca506691b4142eb93043d6ec4d69428027492f5cfb6dc8a0248b636985b4ebef8f93b2487632cdd45bf307d8d56e9b0490630f5eccb213683f2217165ec6884ce9a97ea9116abfb84dcf79d412e24ec465133a6efc1b77e6251a16526982cab2b701c112d91db4f53776fef36c29cda68fd5d6073e8d0321ed9b599a9fddf06cc6140d3debcab799436daeca6b302b5aba2ded1eda8fe21a6d7e8d92a7db1eb5ece85adf0a73ad7efea8f6a9641a6912e403dd97a9e22d1df579010f268275d30104b8925fa09a6166c19a4f72374c06097751520803b40250732758b33a8dac8b287f84fb7033be0bbc279b3fc3eeab7d2db77002bfe7d278e4a533f5cfc3330183187579813434444a248262e9cc59e22f0a1e8eb30cb8b6f7725658cddd703aac16cc9f150279239c04413ccf3fe10b48b291c6055dff824c2e46e076b7dec3fb1a1ac516a546f44b8aae19ab964138ef913b1c4cd18e0a907a80adff15b03a4410ee2d50533750c1ab279c093a9c869e2ca963e0b397c5b2dd339e67e29c2ebc4c9ce133e7cc5161d89600de6651ac44ffb264aa75f5d040d5c9c89605538006b0777a3bd42701cc5e461297dd2c9bb971427b7e45ab80b997c3185c9bbcbb100ae29275f1db4d76a5f1a42ba1a0f75e430828daf09f99888ea4db80b67ff394e278d36d51a0b3e74ffe035ea2c33a27494c4e30668bb32a9dc286e2a8a17262e841bc9978bda141063161a2795306eb9dab1b87cfdb61fa960285bb381cc1f5f371da48a45008278c626c6fad470fb124cec49e50f24c96f6dba516d060088d83af6ab83827460517d16158d3afdd52af4efa73ae0502419ccdb112fa94a5371e232ce09c949995fe7b2544e7b53984b4142770b4e9f60935327e7585cfc05ad6533a3c87cd245f211af065674143603a23362dcf8573a76e18485f0cb38f80f9d4a2032decb328ccb527fb6bbdc187ddc5d9ce0ebba0ec0c3338da2f88f709e52faf693837165542410921f184f5e81c57b921f0a5520d22fee7843587825d8dd734417f1752b4d17104baa579be70cfcec8f49fd968822fb05870787e50b8a0bd0dded3065de3cb810ef02bf4239e725a8609e6dad3c3fd10f4df7e82e74ef66d909b9af2e315bced62d32aff959c7492aaf1d5edb615f19ed8978c9ec60912dbe964dfcf35b2010558e9c1777ffc6fff9c28bd285a607bab11c1a2344d753fa0d3aac1de14d99a288422fae796cb9bbfba90e6388b76a1f2e88607e3c7aebe15cdf5ec1cc47cde6473df99d50047a74a74e26a591b747d4108831aaaf3f863392d228db88179f13b3ac8028f7d6c46d896936911849384952556b7f55e368cb0a2f0338eacbf3908124de2a3095ad31fb6151a2a3b19fa2ae86a4e2c02cee152c885ebceabd6e7a15d83fae288336c257b49faba5dbe91b0ee90c6e3646bee2de3a72f8e7c2380712137c93c9ddbdfa7967d3c760c0652a3f0493179c58d0216647650f40e025328cb8bc8ec9e4c2d8054db5573ad42bac7049940e4de6775189a66a279171d0ea41c20df87f6f46b2b715590000000000000000000000000068ecf9b4e09568e5b178d1312b1b031a0820254e147839a2acb4eeb1c9b52b6bbf13578d786b92273d5ecb84a392114f38e9bfd59fda15773f610111aa9617a3e2a634d9ae4cd988841f081a7dda7b79ceee1995ab7965e5cec32ee3197fb13c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e2ae215a006d9f695994dd0ab2a0a1705350f06f29276a7c252e123212fe038de8f70e468e3df5ef423367be5d4d97c7fd837b00357d7aef21b84eb87afe8a2995194708229bfea15707bb0415d021d29102e89dab1c84519ec8cff052c37af0e4681daf99be39e8874d41ff46b9b7e662504c8ebdfe5e2b78f227c5cb82481e02243ac641a0325daf2cc15978a90932ac51e3d3af1f41d97d10e4a8fa1fd8cda5022d255bc44af3203d255822450a759c92d62aee7f425dfd4811bfa043eab15f960a170b0e5c91f8e64ad95c788b8d4f7735b2409836ed7d0c5404ec8cb0cbacfe17029aa18136a9fd5a25d6d441ec4bdddf6898aa4bfaaaf27657ab725823a78e34021cb225abd557178bd33dd2387c9bd1492e04fd54d67bfd598557b5ba6584344303104c1bd1d45b84ffca94c29db67c85a004a25252b63dcae0a25c7d78fc2e1296020a8dcf36550a86e41df1dd8242f75213636033201eedcc8d8da07ba122d09917020ca03ce5c3dcefeabfde7d23354fc0bef148601b5f9045fbb436fd02f11c317c021ca8d0e6a6dc79733275ec0a96cf567357bc6ae4508732b85d2a384e4a1012125c70d27b87617b265a5319414d6787941c4a4d7dc7047271605746f2cee2a6a160014abb3754d209d4b023a728c4063c685b1d244adfc5a4f07737e2771b2bdb6c85ccc98f476c2c4b2859c4fe0547c19c1fbdfbb750e0f4d7c0f853ba72cac4324c59edb227c10bf96d4c1dd5cfb0be24b3416b9b3f427a5ce115c67b10a63e3c0afa884aea52f0a71a228e02030246f59f74a69272d12ea1365b3409643ca28a9f8db99d9c46cb704515cccc69ed4bb508de1b4f0743a0cbe57f8a6f0b54aa4f8ae045d4d764e21e2f13a51ecf79c9571865bef8f8c12a9e2119126b91ac3dd6e106630c2bff8ba8b8d758755de174332880537bcbad8bccc238fd869ca20338f5d5fa012fcdadf8dfbcd88a2ef4f5888cfd73c82a97a10c7ea033793b2b6be67338c74f5a9b0f6e9e4db2ea7a4fb650b6ca6035536c02e9190d85f205ea8430d3d2fc6b48361c148717dc3037218220684c60e8d1405f221f7533934bee0e122a066e4540ead8a34a953131ea08e9d207e2b98956098da7f8b0115e872da7e0f6e0c1df549fa18a78b11045b4b1e59774c71b67e9aebe082180c8019fa443d80074f3b8ba1cf2a78db506cfe2b9c9a14313d236d1000c999789c38ea07f1430dca9909e220b9fc9efc07240b756e406077a789642e77b2c1fc3c2a533e04434a75d4ea3a37556268d5fcde72df387739b0f05ee42443e463480ed3763e1d5097bbbab7b6e18bc88a9296875eeb4daa7b0b3a16c96eed3d35663997e15b970691543c9551b7fcfc3d9903c07e0ea51290d6be138b48b92543e4b4f89fcf128e167b152b1e7ad39bb2abdac3c1d1cb230c6cdff4fe66e952f24a383fc2a662efc279753aba545e4a4879dcc6fbbda2f794240fefd0b1baff8b1fee6728b55847d19b4ddb62ce5acd6fd2c6ede2002ab54028f328ed184497af1448d5e3a09c4f8e371f3eb98a3ca533b7cb33607b9d0b033aca1f6250a82e9285e9c3c501daa4b1a2127724ec53807f60464af88643dffbab50bf3c398086ccc19ca73318953cbc12611b32b3efcac13952f7c563d52ea6d7effcbe336a748bdd49779018b5b0be8f214997a7fa4e39d65e1317a8be75509cbdbbd62ec5d7afda0047eac4fc8cfa7236b01a35fee9c04778460569087b337ea19aa49cc7a01076f3d6f1ccbf74b731fc82c916220bc2526357a0004dc0534ab0b88208d53f199cfb17681f32ff180e9779b5c364cf68e8244d7403e64091ec2680924ad90cf23a131dead43ddd7383db038641f660e36a59811f5d5b4c1d25c7b16194f7ac1ca0eecf4ff4631bc9f5c4c889148f29330a2dfd0bbeff3b9da88d6814994254e7a1eebdbe2bffe4a40f9a7584a9c856a3b9982aab5de1afc20371a907526b629fc526af52fea9b17171cab295e9ac19d3f3741a9cf8837a7d8d695acdf746548eb508dfe4a21a9da805790ab557804b25e18db3b2b80ec9cb7013bacea707c5aa7a6500cc8620071aee800e0fca754d3cdc7a69e1992f3b228e491fc898a122aaf4f80eb7842248cd8c9c71d4e82c758bf7a2a61a718d8391f0243f09555200200456272d13bf10b7857dbeaf124d703975914daa66ace52c16c5590db45fcbb7d80dd3b743ee7fa329d071a99b6436d4b5f2c3eb4e776afe0e2c34978248be67249c1d0e481ebeb649a3a522f7eb2d43aa55ba696a4d19b84741828c8eeed03a9aab98de0a32f820e61097f228d9b0a37b20001adc6e57dfcf259215b10442b4ed0fe061be631e1ff6a632372e7863cc0150b335d9b5b5383a062aa6dd1af0586c2be4da4bcc5f8d89b6a1c3848b14870e0b01a90c572b907", "6352acacac6563ac65", 1, 1985332090, "42da1ecedb570d11e3a3631d197ed6ed72395345c75a8e0df4ff5d98826e39dd"], - ["c6424d5402fa820442851b9cb718852cf4d6b01f406448bbae5bb7631080e412484996cfa80300000001006a01b4dc4b83e09339712339e90c87340f4bc8070465aacfc88d19cfbbadfb7212a3640b01000000036aab654156692503ca49f20200000000026a630aac1e050000000009ab00abac636353006a8123a9050000000009515165acabab6a6a659ac8665f010000000000000000def3200000000000ac74b6e2d713345b5dba1357cedad10ef147dfc73a1c030978811b2a87f86786cf476b156c038df54aa0db175394168076016c29c09fb353e2667ccb19c690ecee5768bf6e99b93ec3fc321e126fde110ee3c9d1c70010cfeb7627b46b7954ed000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007323b93bad9047160b72ea8914dbe247dce5cd42c161dc03810494306bcdaf6d10e630c390e3750e1c345b2a9f86655d9550f62a194c41c3c64b688abb27b6abd5cc83e31b6e055b2f1e74dfc618b45c25f5c9aab7045572e6cc70d90ca5b1e3408056caf908c0fb1a026c65c5931a10496b6299eddf6db7b72fd05a5edb62480212394ba83ea4550e60fdd51835bf9466941cfa8a8c651274a900481458e98039020e13dd32cb0e8347f098c224d1b50d4bd70bfa8c8d9b2b04d7d5302fde60958a0b1227d7fd5627782ac65eb0217b06d065bc57696e6eb7aade0e60b43836a1753a066891fbc085e171d0e8dc19e89de53ef7d6a6509ab88bee70c69cd17a4611f0030d62dc9ff6dd77628281aa3dbdbb1de939addb1784761ded282a72ed5cb848ad0300b970da264be954f3d8b7917acacbb06c65d72af7633ecd48d99c26d091d95f022172f7037f3c1770fe284906bba72d600c7685f79201c33310dc6c26d49ea5f202245e85cd6adc8e3cd169d31729ea1a7c71a66ccb9ac391155d7260f951b4866003292b3e986dd4691d6a8ff78b3ea436734d7840c0175a03f2aa4547db76ab37f102acf9639161a8c54401e34dbe9227ca68f92071c743c806eb69436a7523b7b62c1b1e8a0c51fed144b0813c1756226a91bacf397fc3b76ca0354cdb3892033023cc37b0a47d995f88284013def2486498f158330c39a0a6e172617982a2c50fbda7b749eddf9859a73af255b3c1d16f4de1a16e566ee2e7231441104f5a0dbadb422cf7bd0a556ceaa5ebc0954f72796b212c0a2cbacfb6bddb0c45ad081c9937db3c8f759609a563f3eda122b0849a89ce5927bb907d553a36814a4a81c81eb78c0fc65332e1b175ddcd642db8aff3eb247e4397320fed15ecd4600b37a07e95b6ef062f83780c68b5612a31beb39924cef8cd3e0c0c63590158060b20bc731f1652963b4046059c0d54f66ccf271706661e302a8d01559c0fa824e4b3075093ae57141c502d106d49ea5dc62a6096f77cc35e220d3dff9a4e1811cbdf638af3da35df83669455709064a5b392e22c15ce117c58a7ad6e00bc959407e5b09e01936df052f362be20e07292418e4bcd39ac54fbce9f611f17d5a7a9057381788dfc201dcbb93d3bbeb48440b6c11bd7e1bee3675c7b3f88f8e2f3ad9c547beceafa9bc3f0b2354a4a946e956e06a0ef530a5b6e0c1a37ee757763547d47abfcb05201fd0403793e7ca3966497c6ef2fc64f3cea0f46a1aaf59cfe8f626fa314adf5960cf9f9b6f1a77ccb6a8a12b22bd70d56be7ed74e36a5371cdf6c8e1f844a365c5ba9f966f557e16eeb8316b6ddd571d5eb6ff83e60db3f190e760aae835c1e2ae595a707de222b70c9972f8a8b89a468fc15a2bd7baeadab2dcefce2e457b9ff9e948dead779f73a003c70f61f8f5cefce8590de726ea3daf414d851a51d91d90d40200e0b7e28d4f39a113282f3dea0e5c77f22f2d0b1943bdc6cdcc262603f6d5941901badf5f5f677d69bec3db9e619aab9a5ea96112229086b09aafc5395e4092e0c259e1832d231c6cf6cbe544bfef536b098facedfe2ba0ff8e1493204eedaba929de0b7454af2cc228d40469384b956873631d42f4c4e4e34ef763e5c05cdfe176fcb9bd9a3bdce48d2dbe3420552a2237bd005fde30624a65c7efa3ad79e101748ab0e12aef1ec3f3475285846102346ddee256411cf3c598d165e0082c82dea183dbddb63a9f1def13f29e21eb614c535fb05b02ccb15a1b088ac2540f4b50675dd3afd828474ef51bfdb4d5d6444574907ac65ca8d0de26cbba54d12c6c6e6d42b6b79772e9cd9442c2b80a5920ef3b8f0765c64a356d9b67af75f9fab5736f75b21570387de908f48b8a50e86831f823120307598a72c646cc1656c6bad481e3b871aae19038d9d77cc589cd6feb822485068e68957511887fef4a3000012c06f938163c7883e430fcffec3d2bc90b251153f62cc66732cc6e26ab57f223349530f818105e7cc7417db01e858be0768a50c99caa50778e333c36cd0efc2994533bff6554905355b38a89c960f569b6c5de66b1040de0121e17044f1f44978eb1fbad22edb2722569ab0ae6f71ed29293084d4758b9b4cb0faf7362faecc8e07cfcb767ef6cad448cdb694a20c815a22cbad41a8f5772de9e7cb0e228ae1902e539f32589c660e83d1849de8c4109b6045323038334f4ea9fc012dbc39eec324254bd2045e41c7d30ff310ae52878ed9110c0bd9d0a846572572d9b3c4568901137303e4fae6ba4db2890eb88e6fa3e460115d564174e2ba35b059da43b97b718e013410ca7d5ec5b0cc8c2fecf84b7dd55b1435381991156fc729906fc10302d853079be9835aff1d9ac72893d6c6b9fd12f5b8fd3ef3b615b13abde4bab127da829190243eaae7cf03", "5265", 1, -2013807467, "ea37f526b1296e31f83bb93bddfd8ddcd0da6d32b7e7404a103f722b00df88ee"], - ["a461d6fa03532ccedd77480e4a5676cb33b44156aad4257d6eea83a11e9ef2c2eaa7b317d7000000000551ab6552acd150a7faf60a083dae3b6b4a12df830e2a5273743f22a7d3e71639b9f1a81748ebf73bf902000000020052a70c7c5f4a7c56aba56d3babced3e31d950a670a3b098377475cf3f611341820f96c71150100000002515171c5f35704770eb7030000000009525153636351ab6a6a69762e030000000009516aab6a005251656aca016e0200000000056a6a0051512df915010000000003ac510000000000", "65516a00525163", 2, -1277086031, "3334e51e0ffc08170e348f3a92d327b1d53a16667f387c374c0454d54c1c66ff"], - ["750ebe96025479f3183c8f37cf3eeff39ca26e82622b7692fce90db6b921458915e76ca94902000000095252000065535253abffffffff0f312b40b5c2ed63640e8820ba8059c87e2db66a7037bd183e11ccc114318763010000000463ab5353a522a09003f1c05a020000000000ee5eb0050000000008005363005153536a29d6de020000000009ab516a63ab5252515100000000", "516a536a6563", 0, 1687881631, "8e1576c098e32b30f0f093023c4a1eb08642a0f96d3c6129ca6e41a65a0855e7"], - ["83d9db93029058c3b3575835c286861021bdfa188813bbbce11c4a446fdd8a25f3a1ef605c020000000600636aab6a634f15624dbcdf4f3021dd065b6b78ac493de0d3da50c0d7ea47d0512acd3ddf183ce4de300100000000ea9c05bb037cf759020000000000920d8704000000000463636a636ce68f0400000000085351510053ac005200000000", "53", 1, -1600632552, "eabe5b2d77912c095e58ec68c93a2b3a042188fbfc894cffd713e817580745f9"], - ["d2a5c86c0318cb8d489722d94cec7962c0ea611034094a59c99a60eba79f83914377d3a0470000000007ab6552ab5352abffffffffefad732ee75c2f8eb77fabab3c0f96dbc35554dcee43869897baee0f1355fc1202000000008604a48f70434b7a0d95af4671822f0ef8f703e9f7d52c60591ad9ea9e0877f332fcc790020000000551526a526abf6baf0d046f694c0300000000026a52ccfb1b010000000000e6f51c0100000000086500abab5352acace66128030000000008abac51536363526a1139d1a202d6592e05000000000000000000000000268b72ff830834d97f76c0fe96af7d1958377d74c856c5d80114b3696c498da6d4c076581f8bf4c5252befa64406611eea2f04459e94666e3ff7b1c5d7123446d3fee985123e0e2cf2db4c006bb1d879c8b7c4e3d3267feb682d9593778788b900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e21dc571b39258c67827fa2d30ff1891f73bc0b069e590fae06285c27fe3dd7c0d41de3daad4b4e2b0de95d8016b367eb2c0d6205dfdeb86e0bfc73b3fc63859a65f403802168eec53212c7fe15a061565abd4cc866d2128163bc161bec8fa098fecc809a3f8fe2ef57623af3461a86110789a56bcf4d08d8495c126308fbda7031bc86e5e8b7f1dd8f3bc87486e7d0225a07e5040156ccf06d9f01a8e3f36bafa031576abb4ca27252b8fb81adc417a55677af12b0062ce24218b98a21fd68ab8ab0b00dc06a64c76b0fd4cbc7af2e725e725a3441be8ee139eaa90b1d153adb182b50cf717d459b4be4f7ae1caa187cf8f8f7f6ca08f430b6e4fa5f1714b304f6633032a41d99d0bc3ebe0d3b22a3dc65d980b9331e049b62a27dcf63437aad557d6de032622adbdfee7e4991265d68ba634f407fdd835f263b98301e2d7bd12cdb739ba031eebfa7eace374df03a0b8f36aaecaa550ce7923c045acca0bfb6333917956b8031be0c6bab9a43b7c8dccdc1439d9b7308df4b8d69963360e1ba9a7db3a454630021214c2cd4beb774ed345a6a2358a09df6f6ef1f14800eabb939bd5807411b238024c861222944e0c02b46b55b02d95e31c48c19e1356bc6ac5fd5da986f4c828c9eb7026b1cb34d36734c6c14b49f4870ee3ab8fca04efb6400211c3e67e80d2bc5fcc623a75275036669dd84e22c5ab89122e16350eebeef0592b5e6f11ee07e9288a0069d0410deac1b6a9453e18ba4a30e2b1408025e24441319acf9e94f859ec29e416ad4f8f2d805c17c7cea78bc1b4dfe9d719acdfc9231a658e0da25cb5dd9c25d2e226fa92c40cf4d5edb2d66879420d3881fd3659fa3291a5766ab9804daa6ccee27bce29fe7477b3d0a272df473e0f6c7bd68571f14fe0780b1d8621d2ff675831f959ee4ddfd705ed584e1e6ba7833a47f9f23dbf0847acb919375cc5f290ceca05fd499c13548dd6ae973c4c00b68f0da5097e058445f08511f4e32c943d0880c5af98270258efab00889c9a0f29e73df80ce404277c4fd3c9069ef6c136cd65f1faa477b41df5d0165cde39c90d5188688d91de49543ab4134e3570f9ffcd16f1ab63186520e5d6a2cdc9a7cd1c18b5cefdc47d5ee8c9aaeeae8d7a406da1c17e16b0409035b0f099a7ceb651711ef8491373ce2c22cc2b180ba6332dda0603699477621af7bc761710f24f7fb7394dc52298c7847b9be2771f1ae6e49741ac0599b90a9a3c128fad4ff1f7059d553ec7b46e566bfddd6736fd9fd7078425f20fc6fbe7e27138cc6193d2eb82c3290ee8a9380ac54c30bd9b262e328f354337de85170889a1f7e8404d168f9328182a2aa127d1e36a00d853d8a8fa955a8f34e44dabcd701d04870f8bfaf3763af52a950763a63486457f6ca9bcef1995945702181e64a2cadf601f3f1648abf94eeab3eff752b506f81a13e868da1b97b979380ad1f09a25299b09af64e2e0b227fd44c5ff0b75a4717e910746b486702ec616412316004e0112e85b76dca8b4e875019286ee930cb51ae4694e3821acd81c61d56c2f02542057478b9204b53aac1bee0db81ddb0b620f8e1fe5a1869805a7443af4ea38804edc3674f2dbf687c28f265f99b9930723354417af21374b3c275115c8fee6b3e43a8541ad78a70386376a94c657e37e9c230146ed2bf204b7dfe53b794fcb397e06f0c221f6d42930511e9e4246e97f2c7a0e8e36c3cf8cc11771f58db257b7af66879065acaf8683b60f739c0c4151f48c1a608ba9f95d58df1d678dfa9e3f857ec09fbd7c23c6ecf809a70b2ed8398fa1df1ecbec4e167d1ba9e48f677a09f27a532649f47fb75ff2859a6b78b87730905770d8ae8af219180b7bd7c282d38a01958568f9e20884c2900560a01d0940214693b523b5899c04a8f9bf6ee693f69535fa08aa894440f085c0adfe11686284735050336af60da82324f3cc52805cefc72fd084c69c284344951ff6542f7eced4561b919fa780acdf11f621567ce5cd7d9bb0dd710a06cf044ea0986fea3fd14f6764bbcd38eb2c6ce20ba3333b4bd9c9fe60d41e567a13eb4476be3555df39527ce7deb78cb818982aae14e7e500e15bd972034961621ec0c6550d47c83dd1d0b62c4726ea1b38f1a54ac5677bb9ba3311656edf5a6f442a7c539aac6cdc59c029e109de58f39e8095b66782156763057f63cff17a6bf3d3837aa513e1375939d6b6659e8a0ef562aa6e47564c8fbfc68a1705422d5f778dfbdb7ffb81c5282de62239bbe82513273b1ea1595c03c68e45725bf52d6801000000000000000000000000ea42b8a70d852a41a8761bbacfc1a74d723206d902640c7e6735ff3913293905aedd89bb6822b79a7f5e1d7bcad9839579091e4f1fa2b6c1ad4ffeb172db94ec292faf6ad3bf041314e15082df994046ff664ff2a145fffcdcb05ac098c422d500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c62fcf62079ce0b3f2f198411f6af1c84eb1d04f686b66e769386e7d7f58c0115081b5233944e9e90a0f7fc9fc491e44ff123a80632ff95077dc6c81a466b6300459993e494d83db5f7ef44a76eaae5c8d714193289af816e377d749245be5101b007ac38894494f8dcea0502787ed0932c76bf933c96c70c4504254c8e689bf0201d6acc787c9366da0bc7d72c73314bcc7eb526367cfe0718ad0db5c7747bf19032d4d4b2dfcc89a33c231f550a64cba645f160ab523e26f5052f4b81ab45797090b04ace123ddf58aba6fbbb0ba24a938b00e006e390c0e9407a4fa62fe4b8fd3d62c510811fa074bba5d5d5c13ef3cf1d087278d28ef04eb58493d00caec5f5369021f8b492e740fd53e7cf22cab72ceca2f3d20ca0e538f26fe955896663f3f9d9002301a01a29585f3eacdc02510246a50e4c5f6bfbd567ed8311796f821fb5a1f0503216004955e3c8202ffa24028ea17326b8702b59c8221a327998d3faa283c8c39020deb9b87748b0dbb19cfd281d921a7a19a7eef768865578557d89d209edb761b0224571714bdba146bfd016af1b78985127b532f26ea234032d4a8b68bc4f76d5dffb5dffa152f99845a4e76784758861cd61a9f94c76792f39fdd45ab359664a33cce0e24bfceb26193de8580c10fecdce66cb7562c66a5fb8ca5ec71963199e1cc4b8ae8cc50b10ffeffb67813f85f39486ec4863401d8415feae95012e02cdce5503ca24d2791eaf81e7ed72df8669c82776fb13e97cd0eeb3f3126cdbb1cbed3926d32660d2c8b41eb9d9f132ab30b3b9d1fbb9e08bb2962e9623c7d27b4eab11b60f2d4f6c6da4b89dbde6fe02ce758ad6f2e4dc2fdd17152548a948fdea57329a26f91857710d796cd647f767b367b7f55937a91a88989203b20ce493cc4da665c5149240161c1e6038e463478cf286890b727a0a8d85d62d5725225d7b064dbc1a4c84e10b74409402b19e3c7c2054ccbba294bfff4a2640ac16ca2a4a813f3feb4d1d535b0de12003a984435a024acba5071e22e4758fea855400e7872fbd438579b9d29471efc0cba22a8680fc1bdc8746f4e1b5fcd278c64c938861ecfab64433ded85f99dd54028ea79c53b8e960d4827f69d80924b550af17f4996a819d7eeda3eca414fcb89142916eae38899f3c299d34956a2d234229b7867ae67c4614ea3e4bb99c319ca762d984d86f28ce8d9b5fd1c26a437c842baef5fe2ba682154db963bc3c24d0533811d5179c1b2f1105e111cf98d1578eb3ad90056a7dcf958c1b0ed7b3482fc305eb958abb797c54e52c00881fe8526c3eeeb06e2e54fb586535733de1be7db1694f8e5fae5105935b3645b079cc081aedf25a41b714ad249da5788e9b4021cf080f3eef9af9af324d65a253867fed418eb205c2e231ffa50109a0be9e361c054d25597786b47317c740fc57a5014b42505493ca998faa2f932f9632d21ed270dea44c636a64c604d058fc811edb0076d1ebdf75a18ca15e6063ae1d0b8a2c1cda6c29722b929b4f63b730141893654d0b5611ed11b386516900c1041868b9a5386156211a5858a40272c0726d76310ec507daffadf6c5c05a06dbdbdbfa46f87609302e5f5b709888014aceb1f8d279e33f89476eefc2fdf9f715b680de4859f8846b917c2fe290a0c1219648a2034d934f307a9043b4195a5d0918b7a154cb555a031a15bcc3a799290342cf3145f61b87cc407fbdf5269dc424dd4cd037e4d1b70d1dd0038500e385996afa9dbb059ae55f9c8622c9023cd1f445346ea61742b65bf71bc62e29317181a9b4e38690f8929c32e3e39b5b2c030e43cf9501c1fd7bcbd3681b8f8f7c86de5ebe549dbbaa098f620e3843ed428309d2f07e6025d60c0b38b5fd5f6675203e4ae10bbe8a42549ab14f136f9a3f20a04c607d72cceb554398e23c85535230ae9e87aabbb6c6dc929132f22a82beaa6524526c9db052fac38fd0318d8bbd9e591e78930ff070ec32ea081b142131c2bd144f3f8f24fa2799c7753944b9f8ee950a4308972f13ef0fef9182f455ad0993904064941a43f3c53ad45fb9c1c9b68bd81f3e96bcc6bf1177c6a0249da1ba979919612e9511760a6dbbdcbb488c024c81bce5fa8a8a7985bc198c4841f7d0a3cbdef848d903dbdf909e805b0816ba2a72c1ad75411cd58b927fdebd0648bcc451070435c0dc06c68a1395fa8ef6e2c022dea6c66f3d82b1977b5fcaf724c3864715023347343869ced02ca96df3e78a4a82de8bbf545a0f04cfb28a252178cfb4053503b2a79eef2b6ab235f8492379758ecbc0a3c90c90742d59e017e483d61c05811c98494bd830562c73e8dca55e0fb70a4d90ef99e74cf8f45cc4e79acd648f883bb5e70e6a3325538e75f04190cba15a8dbb45925855129b1a3b9e56d127f133a3604da8d7a4a3604", "53", 0, 1749204536, "bc4a201b4f0b7c643c61fb80adf0f54f4887c70751097b305eac5d2218fa5fa3"], - ["785a8333019dc51a6fce400cabb92ed5a02e98749fef8f8e55c0ed73b675923043b3489c91010000000800ac525353ac52ac8f4835e5046cd4b90200000000040063ac0067c8670400000000066a52acac535371019a050000000001abccdf5b040000000008acab6a656a5352009e66c9c900", "655352ac", 0, 1391260418, "afd80705814b26dc1cc896282c759cf3be490c585efc04ee0e079ec8b4ad720b"], - ["6c71e512046ec85212ac8c1871af8e5a02365cc3a43d5caea726b3de8ecd64e081d0b91da600000000086a0065510065ac53ffffffff72afbb57e6ca32c04d22f6b58339589fd10c837688c5efc26bf9768a2fc06271000000000251638b33abe4778445651032e7a7f3cd745c86c8f53e156b549d8eda290a76e17a4397a1c5fc0200000003516a65ffffffff39803b5e9ed34df487eeca63a6a9abc0cde5a288b96d8a5a382a8117a17741d102000000090000656352ab5300532103dc33017fdd07020000000006536a5351ac00bcad61330100000000000000009e7aae01000000001e315e86b332cd50716d81029e4c48a2c932ecb2d8b5a26584302d2e8ab4496bb3a2ab26960e5e09911d99c4ce5dac5075156a629ae637f1dd02f3b8407fee8247304753200d0ce3ef47ef143dd0e18ca3198a7c4116bc20872d13105c4075d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a9fa4990aeae69e92f52a206c32e80f9ba9568ddf45bdeccf3d8183df5f1d38a6a5ed824932ec42b18a23869f79fae137f69232061f89eef510f0b2b8765c8cecf69360954893349d1f8f0604cc810fbe309161fece7c34d498774b70d536b55797726a314709786c3da4a09b3a87da69a96404eb1d2e91296eaa58b7c473e80328deb064afdb201c43d69b3f6564e2640e5830ecfa8c8188ab705624e65f44460323762a4ec3edc6244c9898e5eb053c635cf7c5ba72d3006c69e3d95b952ed9380a2fd9345be1653a50d52c523e999a87e93f8ba613821ce299ba566c2024de198b23467a661dc72e4c4b3c5176a1fa01e532f3aa67322d69c95042b0fd5180befc032876633f96e6e94d2a53d1a3e4e3aaf2d48c85ab844742e7117b0f2cb14463b4032f86dc9250e19a747ecda56a8bee0750dccf751540b51cef1906bd7daad496de020ea9ba9c02fdcbbaf15b0498805f469cc5bd2ce6e8add6b068f77c5c85b4238b021575acf1fed83b6973cdcac419e0392cf84d92f0cb8ebc76ce10ff97cc1101f902294e901ae30fe0cece85ac0ebebebd798cdafdecf781772af35f1bfa1c1b3c48edc2e2c414b849be6fbbcc35a04f428a293c94bc428e5e8a325fdbc477efc8e95e747cc574e3240f34bfa71233ffe72472cb2106d691f842bc31e8761704558b2d5068129df322274888dba1cbaa7d0eff0e20b34f2bbc1f925c3090d1b74296dc77d3a0997dba873eca43ee4aadd679cf21811545a4f3d64b704f3b1e33c9f02de692b5010f5f8720950d01d46f1ecf843a976d8d303a2c5f5fcacb33176681fe58d30d53a793ed33fc278c1778a91a68b66fc9e4fb4ddd84bcceca3e26ae66bae599bb5e43fbf6595a3f8fb3cb9c90c700de0d29b6cffc885fbedee256fa2548793429aac944aa1e20e6503231733d8de265461546a23cf8a20bc8967ed83c7a5497af34087baeccf5bad4767a3f999e94553f6c8651b9888e49ab39995bfdbeb2d08743176f732c6342bd567c10506affa9c4c1518582c696711e52c60cf2c7a6eabfbd3688017ba462953f44a7face6ce05f871982536f786f7eb74509953198cbdd7efdfe571134d80b3f378afe6dfc393f0c29acb7f1cdc0e790b5ca40c9c4c04b42058adca6ac898b09924e17b19306b35216b032441d5824fc8d57f88639ceb6b5be3d117c92a4d9ed54372eb077dd42db87436ab540f005f7a65b15c6462ccc8e936551f559d4fb8ca780d67241dc395b34ac53933c114e78358ce37b191b4bc2b20c7a9c2a7387c447d9104e857c75607301b190ae212ad51d0261c9bb1a5bd50479c75ad6cea5b84102289fbc3cdffd89109d0133e907b14cc5a2c19e6620eb56e648103d671e5b000bf93cee41c1685eeb3dc342fef53de8a6e51586244950172824757f91d596c97e31286fda509154d56f9b05b18e817e957569c1b577ac678540f68189c4eaed80fb5ef288712eb12fada91e72eb9827f41ea5051acb5220740c7fcf78765213a541929f8473b6eec097259f2fe262d5bbf3123cb1685b4114185f6faa1ca9370b1ba8a9b0cf3148052c37d2f87d1014b49c4032e42694aac21488d2d15ad8fb545dde50db5c3d058c01f054cbd0934b4f033a196411ac309102f39df7e1026e7664998718e31f4222c890e2ef9549c9512af4b573eacae1c100bf8a8ddd20d7734e0c07ca35da3198bf7b6d496f885de7e5a5240dc399e4875da8798253eb5410496a77d490958c9b36ff690c528632b81c194c40db6493aadb6ecf26c7b352c446bade5cbe6f09ec103c59b0c30036c1cba285518064ae668f244dac240ac01e70bef70677a8bc06f63e0afe9c577986335452caa24101743aab6d71586b7d26c272fdfc0c82b9df5c120b3f590ca94f257a03615df480c98f90b9af1efbd63a0e99169cf884b4ea4cef9492e4db8026ab3d7de160926fe2d1410f7ada2436a37c83aefdc4ee9e60d5a40f1711e2fe62aacca0acbabd1a7d2901cc22c9dfe97df7d223a84b0c85df1c0919619aaacd159fe53002436a8fe2157145f3bc9f51bb66986cbb95280b2d017fd092484da4cf3aca47dcc0a16f532b2666d8e272e9cd97712cce063948249d59f76a48dcfffebd7e0767fb8524361d49b288a1c51641034a8747b1fce87bf5283ca0416c6f98ef3099e3b0c2db0aa2a8edbc1b93381cec8bdbc88a1558bc6847222dd18c6f0bb6af62a4b90b9ea96f0897d1afc47ae4e2a0fffc37995abeb442a55c113d291fa8eb370d9a5f46679ac2e223df79096b6256840b0764d56f8dcbbe7e91347b7abe1f5d4fc072971c63fec0197776776d859e3412359188a11c1f6c6324710f574a79a937914d1e71daf3f19ff5bdf2373d2482b1790260cdd45cce50afe069491e9dc527c82fda529430dcdc04722064068204", "51636300", 2, 1321403412, "f5bffa690843838e128b8f5ba611fa1a3391a5ff2c966b5275710eec092da6cc"], - ["665e13680298312a0555feeefc3372316536da4b6238d28ed12963551fbb06ecba622cbed8020000000040e1e6b9c9fccea6e7bcdaa9aa97526d00324744a0c427a591b69dd4f1fad31df901c0b60000000000a7fe0e1a018a73a103000000000251538fb522a5028f389305000000000000000000000000cd804e7d69634a5afb456ae15179a229355cea576505290b4aca8ce93f829409d6f59d080261d236e238e8214efa8da10e8ac4376f80a4964080d905fa1b83e55ca03540752e5a44f133e7ea14defee523afa89f974b7322acc61c93016ec96600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c53a759d9ba2632e55853f1499ab228d1bd669429c7eb403b14a834a89c2b470e4a52cb4b128a315a7a1cf580d0470b7cc36b557838202f5f3ae87c04251be1502c389036f5e9e51cf4a3d87c08a76ace209f021f88cea6f07466164d9e65295f2c41b7e544fc8f76570c69487e0eeec12573617b31eefdea4dfda6af61a18ff022a81a53cf2670d74efb2902e2b7f1e807486f7024c2c37321955ba3a9674392c031a375fe3499df25f5b20af4fdc1a004ddc8ed9bf5a7b089a1328e81d194492070b1461f4ee87a2fc18df2a617289a59f56bf01b3663adfebb66e4ecd9fa2c847f32d99e7f768e295df9cdee9611e0f393cbe7289d4b8e12c12cda9d3cc40e79ff10320bf2d4b8d334f195aebd62dbaffc0df4d36c0617f6764088a5d56e7b5fcd18b02124637b8cbeb18b23a196780a5ec2e188f845ce7834b0ca7a81b6730e9a3f8cd03053a31e0f45e967264ab4b0635d1b7c94c2b03911dd6714f0ac7a2494355c947021d2817905c1b013401a8edc40942330eea344c58d3396a6e94abe6ea046bfc2a03116d9d56d8b980652c88bf9731f761b54428901d27dc4247ca033fcf2219470bd8cd3b596f6e7e8ea46af077836cf90deabefedc12c8b9323278091760e46d04f86aa54fe77c55864cc7857b473a8861fdf4bcd99e31a5446c511a6d5a47c1a455f6de2223b0e35caab824fa45d7748c6a7c46937f5383b2d6d73a2076d25fac8940cf52265e4f93324354133d3d8de46b2b531434c92bc09d559f9a6fc512a303daa12d694ebf17b1eae49f4673ae89b8cb4725edec2a2399ebc0c602a28a484fb2c937aa7361e8fca1d788333148573a6587390a44ff34f65de6cab195315d1fa153ec6504599a1d60c8403b665cebdb9e5f71ec6eb7413ed9eed30d58ec0ce2f4ab20c591c3359a3c1f2462d7c78484481b610c3c7cffa9a8638ae00b0d4433a9b111993d1467fd96a3a1de6146fc4ac7e512c4aa61bb1ce7985df894f53be854149fe0891deb5738032f2398b5110da946a3e745933e12b5862b2fe08a3c5472a24b579802128c6a22031ab3d7c657038ffa82bec9c5c0eaf912465ebbcaa9b906f2b035133563afa2a55588cb7cb480a19a2fd73ee2d068df9f8f46c1ea10ccacf655d97a65008ab5159b03e458ec440c88895ba2c605783a2b0dc9296e94ae7c6e2d7c524a4ee37af7ee0e8c6b6f331ecf371fb346a1eec58cb96aa28cc3f644286140b43894842f2361e9c24c73edcc15717c6ebbe7df72169247266b8a4c44ce3118cfa012580d26892c23c64e6f910127be5901a508fcc8bf54aeccea32a596f6cfea5e700e381458e9dad3562dfe5056cdf0f14eeed40b5841c4ccda442a9621a260fde99b32bf4377986c0b5bed71dee6ce91d282b76c2e3476a298b5669493e25a7bc05ea922f8fbb64703d87101fa8b4a533beb6e83e865a51e351e7e29fa81957b81387962f251bad050cadae694d4ae68828dd5751d89bb00aca77af63427968cbff8a2af921cd960ccf27c0128c2a8d83aefa05e3e8db0c578c2b303a5047e5e361c33f28a085fe1a03bfc6b808f506c298a901b2e99733e4908162a068c79f27838069360984c0022eacd9f245fe3cd82110eb3156f2e4afae73b2d9f6b57a22f8ea25126e9981b18f4833c18fb1e34d894c90621715c8ac356f7d05fe541c54e191aabcced39cc5f35ef3357babbd3605c062b08dc836aa7c6bad543fa3eef4a8922c2d31ffe676fa375a5f204bf11623fb82b3c140ebe01ea1ebd2ca9f167cb14bda6fe0a8a547ed208959130bb04f7e81a1d28b505dcaad0ef181f0b64b78f5b9af2b1bda4ae17d5e1b94db680cc8461338f73c651091a32b4e5cdd36bf7c02728e7d00e53964894b97ef29309eb6e2a701bea4580c7c9a898e261de04e4db43f51d527b5dd92a98011eda8b4bffe0b6cd64c57210044d9924b82c467bcf556213b384a2573dd0a17b416ab27f201457ee709d12e6beec0386007df0afd948d8e6f7ebb8b308f4dc23f59c5198e84fb2442ec97daf7c1113226eb274dc487a11665b2b3562e262be2c65462d3f7357792d52b6a86cdd56992c63ec45c86eb293455381e5f406fef7bd4c3d6961f7acd84a9b02659ba288a408ff8ae9b0abf0d2a88102930e7f5793791f8b8e92ec562c0aa8ae7b389067a0cf2b8a58cc34c14213c617f5d27d15181a3df654bc07e68b8c81884c8f0f9f72d369b31f608bde43943e434433041c2f5724fa1c4f1af29b7f1efb15505eb77a4dd182982aa3fad145946473af9c6c3b0aaa8905000000000000000000000000b8507a9f012908f1c2896efbee3d9885a65386429e41413a3928a88f7333bd2270d8b529a0c6a9947c5f3a95c60d8c735dcc622d4bb6a11493ebd9d1fca898736f86c17937468e5678464e967b7479a39f5ced95b0b6e080f4ef6f985488e81800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8134e9382ac4c15ff1432eecba700f5473bb644a552fac62fcd8ca77584b336eb079505d148742fe5a134740f69bd229f352b096add38aca4fb83db94cf87715eb83e0f168cfe48600b2f898514e04ce9157788021d49c3b0a8f6613e5e505b35a1dd9dff53dcde1115ff1f2f5aad978eba6138a075f7d0678126e2eb79477b02007067b0bf36b49428adbcfc4ae167818d9f5b86725f73c5b4e5f28d6d3e97ff021639c5ab252e85bddef737419c4cdbc507f9be862e19aec448ac581fa1944e780b132f6327cc370ee9bf6efccb567f5e7d5312cb4be8b8d3166b2e605ad775701b1fedce0a4bdee6b04320122107408207e4af37938112d886563e184d67efb4b2030f079431cab83b5b3f7ff4076aaa873240deec73b7aff16a9b807ff5defef69f030cf29052ab9259ffddf19d1c6f63c28438cbe131b33cc53d3772de25ccf4bf2c021ec3d2c51193c1d736773d35765c255a47d233d86108f2d37ce6bb59fd7237c30206d0b5643ff5ef67e4b6523b781644b32771dca972c7df61e182a1f5230d14d4031d18eb13111bbb3e4751354623d9f565ede90cc4fa386fdf5acc42a64177551977d4e761d3b8369e4db5334847ac9c0623fcfb4a4d95e92d592ee12c2307a899727fb9c05b3199f0ad6da181e96557f0137acc7908834f9eef48cdef0040b9d43396d8dcbe3ed6e07e86a9fe6a08b924ee1e0cda10e768e5b6a84e86af0e3651ebc980dd14292465aaea13a52687987a8257ad2084bc3fba6c44fa9208c2db6e124d79a678951f49c3177ec75abe3df212b55f67aaae5ecbb11af87558c787b71c57b7703db98f1a5916a7e5484fb284f77513e6128fb686175d1c82e3e2de2e906bd68557d3ff2090cb27419ad297293740626a99e3083657399e6adc8c17e9b82ca713c63b2626db8f6f7832106170a2a72dae2ed4aa6cd1db987dad4a0dd9a7467ca3f026857095617c1e28d09a2e8618d9feda0e5feb930e64a68335efc1ee587073e37a11066230b2bc2f9b2fc7e2debe6b95e4ef3903bfa2edc9be7db16b8c59da612fed13f17633b0ebe29e36e16520e6d76678f03ec1aaff3882af456b6b3fef4901673f41c0987d8340417a793bb58ccddddee699cfecacd6ceb7d21b310ca989faaddb5e76302f8dfd961b2a557cb26c495bca15a6a1d38ae26ca29a0f552083262fff7dddc9a66e0470364ed74787f620979fab2535922262b583ee00554e14c3391fb6234693998e6a6a92a81731f44ce09edbcb9fa82f08b12281f282e69f51ab36379f693e1ef2ab5ebadec764cc6fd5f3287535a8371095861c8cf2db16b33647cb5d38730268c4aa7f9225db9d27e2432e9e2e6702e90410828ccfcc7198c9bf30af6dcdf2df37f3c01022ac79419448a7abfe6eb2b9a004f92cea0b348003545fa08d521a0d1e1a4c0512a6f123fa11e683c150de9feacac27692f9cab8a2d34146653d9b98266b331a1d1515726627fe98e19af851664fcfd1a2d05f23e7b5df9f636e1ec443fac0155b71571259a5f9a895b10af6c9c161e45ca2142c8c6f1c1792a42464c4eab015569568f04e7139af1df38938dd2c6c4066daef4141f2c7f13fc372cc94d7db8855c1995b627aca9950970163c1a283869731b616285aa9f4b1e1a88e3822add16d5e3414aef87284922ef3a15217cfea4365d2666edf25bccb5edd88ed038ba72398817dbe4c5f601ff9dbe567927b970a3f3826543602c88e60234cc7da886d7ed57a93ba20f7ceff870c5bd9858272f122bc144f5a22269b851595ac0572ad5c5eff293c7f0680858c30203578c671e1988bfd5efaf5658beeb579ea7c421826b49d1b9d23ec8c2b1ecb270ab42b7d2b981aee460d692c87bf8ac6f66e72af6523973b1c1535750ca21cc1f9dd98813c94ad53acf11a118c752e4d9946006f157087f5cb04aa778d36fc4bf8fc36382b859edaeeced7c7f12ed04bab647b6aca33bf2307a742191ea6b4d686fe02502ab92cf138ee0cb2e24e2560d3b8f8159b8d6c5a387710b4d5a4013bfba681970c5527a8032ecf0b59391a59789c7cdd146ecb04f4576a5f1096c6dd5d3ac7498b2dbdd9045c92ba2553c3c30587de7fb1a978bb0d7de62d650ef8cdc80935147844f720472356721e905e6bf29ba37569bb3d3bff6431f2bc1eb89c0b4072f066eb9759e5f4241e51247de398d09c3f3c1eb65455f01fac9eb3651b0ded2ee0aa70d3a795de3e668a448e85d72ed03b69acd622cf1dd94abc1d2d76d5404f71e58e5e59c2a23f78c19653307cb991f634391f51093adfa673fb0d1bd4da99c6273c059cee2e0472b0c6c07040c8be46b11703673591179608d4944dbc8cfc85dcfe208b3c377580e1a452828894ef52a2d76faa1d11c73a77d6901bb46662ecce4c2479caa962c7d8545daccad6ba0d", "6551ac5353", 1, 6529874, "ed8d34bed38c23551dc44b9ac45d8d06e9b638be3da34db702f3433d7c5e36c6"], - ["7c60923704f1ed3a407bf3366889aa1256015f1757c58c351b1f5047d8b97717c94a9ff222020000000965535100536553ab00ffffffffdf0abb9dd92f46363b2ff8c40eb9a42ac9cfc2526ff3246beb8212389e1137dc02000000080063ac6500ab6a5183959f3a019c18c321b6ddb231d9899e5ac7a44b8e032fdf1164a007a270f086f5f24278010000000465526a00326e5c7852f912ebcc0947e1e906955e88843a61fa14c0854d3613a7391b9f699f9ca92c0200000003abac6a2621853b01005b6705000000000953ab636500abac536a42fc2b0a0100000000000000005210aa010000000051b5dac1508d8b8ee853449477fd73d96f46faec14ac5186172b3a142a3165bd8757b6ac2deaad84e59f7a4ccc203d1dc6a917653ceeddc28c0a1f96b3e95317fc2aa5fd4c2f9ec58859c2efff063d2ee9f6f641a120052f93d27667d88c40150000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026dd6110f02216ef5e1f17aa074f48ccdba5ca2b4b0b09032a45d047efe870b03cf584350aeed8e5976b344ba365763c852d4ab6d2f01b36f0e1dfb6e5077f94099957f2059b47a05a9163255439997d42339412ff408565c144fbe06566702e2b49e6e1eb784c4307309ee4fa198b37da626b97d5b7e8f8c5b5ac63e88e9f85021a7177432b214346ec7e4a91819e01cec08cc08d024d95449dcbba7995cb84aa0302eea3906ee5a78c59b6c223ba2165a56821b92e1f123149356f69240612c13f0b1c4dde516b92e7bacc7dcc8215a85106edc1106d1cc6c1171630ffc09a5a158b1f9bdaad86722d1e06d4d575146a38b070e8645644ac3aee511b3d6a89c297f30214dc538d50b9da1d04375076cb4ae2a0f1dc0eb76e2d47129401ee6faf29ce2e0322f033963b6028f36509475125f4fbe6e62118594ec0d1a1741d82cecaf6773b0211b520eb2f072aa74c6b30d7a104577d03106705ad59a64a6ec84eaa78b7a354022358e09b0dae06a80db5537ffd51006fff196fa519489ab02e9ef3e4dc74a787021be2006712054b3db7bf0ecade45ef80919c72c7f4fc045180c8fa59796a9d5ccb5163e841594f24ffd0d8ef21fadf97c420047562c982a23df0f96ee2e3d1f07a9a4c60a0300a4595a2ddc7faa7be17831d90dcf33fa2b95ea0f612288c01cfcf542ebe2007fc245ceba9b2aeedb95ceca6aacc45d0544a47bdaf2993e82eb4eb6f3cc3fc742812232cf67abf265e377050fe8fd2c03dc768fa5ecb654518316ccb6e2690ab22a0b60b96ee34ea91e214df7604ad4077cd752b7c6fe3e91d2f6c3534cbde537ee6873a199ac1179de8e792028c391c1ddbe4933fb298c6acc6a0af9d0efed11bcbbfeac8562ce63155607d33c2f10bf2dd3555e130cd22b642e8afcf19d7ccbda8a536cc77e8dd03e8fef83a8b2c4109438b6aca246a396dd449ad3af37c227182809fa047c6e08dd6f0d72958927bfecd5a2ef1ed43fcbb94ab956fb1d84187cd7fa741190499152286660173318bf19cc3b05e24328e02a92e2a85159e4afa868a26c8892111a7a2e5ee9befa29f661274292a6870f8c93b1f37e235d6d7ef5c9c8348a27f97e073c1eebc4a1389ee26127cbf60d4873bea4a8dcb3043cdece4c56e6a0bc7b54de203109ce4549cfee4d4bf6195169d46f84e4cf1d884bb257d34bd250e28474c85cd3c7eeb36fc7d26915d7633a154861b4da5adae1fdea80b00e5327123e9b1633ac31492e5fb1fc36cdb902f164bec86cf3f0790cd03ccd9e304b4091fba6cd16e2232dc9b68816deefeabeaaed19586e52c898149bd02ce4c1c84d2e54c7e64ff8e4ed68dd3742a66d7a9f0900b1e54c6aca4a62eadd62002b2ad8317030e46ed7f0d68ff8401551b8e32260368ee0b49c5c7180b057d9fe4b381136ba350859efcc09e43073781dd67b72320349522470fd74d4409754fc25f14d1525a7aed3b05d6ccb3251c92312e8eb1e5530d94f73d96de9ba0e344c936d039061e6cb86202f1c08688622b1800f03ca899a5d6f1c0c539874c8df1d6fdca7b640dff2a19e28a84e93d9ae62c94d2b11e2224243ebb143c5f7664aa218f9cbf6a662c1f5eebdfd8dbdd8bef5a989b5e0dc0464e9d174a3340d2688e9560d5b32ddaac8ffd6e5fd50c5f09c184ca30541bafbfd57f5219ca0e8964c952711b94b8b67297ed2a8e3ffe3a24a174bc5540a871b756d78608a9065b910043a69fba68f63c22465b65d2b7b897b961879e3fdca9a964400093867022757e0f00ad16e220b0452c919c24dc7b60a7913763e88892637bff95c07e848db5bfc3c4c73416771bfdc3c94e7ea663388677e3c1a9be812023da495dc2abc9633d8e2784293c62ff83166be08b016ce8cd9f1c841f971e71f3d621ef07f07eed74045f97d646f05f56079274fb19212808fa3ad0bb7b17bd439c04c46d35e49854ce31dc29e18861bc07d189f79b642f7df77c34807642d1cf0bbdc712856242e5ff486c38297a9c32b855a4dd70f3a6562ac9e2288b79c97731113f1cdd736826ead24f0c03ee0aa8d080badec29f3cc83c54df4cd0cbf62c5b7e02af8b7e443c591f4da5cceb5f6fc5babf86e1608e93731b48bcd47ead5e70a153934e28eab7bf0beb5ec5cba676ca439fd921bdf7cbabc3f09d27661621fef4dca4fc84ffbf647152114cbe1a1bb24033257a499fa2b19e22765b5c99a478f3bc2f3fc531ff488b419656036778b2d91ed3175cd935c2e56297117540ca81c1770bdcea38ec96acbcdb32ae4c61069774399a7152f3162876d9c087f8e5a91afb8fc820c5638ec71ac9dfcae4c37bd57c30f0f1dd3964fb5547e0898d056acf9db596d8d7d20a45681b9d2f93485056f7d616a562c4e52ac81d62e8f7c867da09989d58cd2819e0d5d4b34900148006", "00", 2, 278787095, "595479af589ef54cc63e14af96f50d41f051358e067f29a2c348f58e0fe3d147"], - ["c8f86daf03cb6c51f19814577be2098519dbadd8eac3b158f12f4c06e35eb6865bb2bb0a59000000000200ac99d9189a40f7e6f356762f7c30732490ca771d2e919864a07f3ae644c26fb40d0f678b46010000000064644dea2f10c8600910fd8d229986ce85dea5dab185588c45bdee74a14d137e6330b9c1020000000365ac6352249a3f02bf46c60400000000005fa87c000000000009ab65ac51acab00530000000000", "6a6553520051", 2, 595599069, "8babd12203c4bb5fc88699d916570510937b095a98a7d64372ed4584ff28f3ed"], - ["cc3ae5cd03a9267fcb743ef444bec78a182f1a4f52c12da4cf95dc4ce01e69e09c4db3c5850300000008ac53535352ab0063ffffffffef3d19cdcb900b282453b4832b46de1ec2491a88d10cbfd1e1ab5b000c7e36c703000000075163ac6a53ab65c0d49b37a8e61cc5be3dcd60f5ce0377dc0d0009904500c91d03643181f1763b92c0387501000000066363ab00ab52ffffffff0490fe28040000000008ab5363656a5353abe9fe300500000000085165536a65515200fa74680500000000026565b8e9c0040000000002526ac88966a7", "53ac65ac63510052", 1, 1559386461, "9d87903db5856020793dc1be5b0eb458e6d16ef6ec46d9c0fb83a47c87e8305c"], - ["f0a3010303b86865f43feb5c3ad5055aeef2f33c0c4c7ba363706d6be8295ec2f4e484828a010000000351636affffffff7c735f8f3c215d1d14a02ba981de30e402f1d1ddac4f046b9a9d966614f029f1030000000951abac515265006aacffffffff0f21cec56a4594a011559b9b9ac491618e7c25c15463c3c84cbf7d6c4505e21d030000000463acac52d0d5a28d02ba13e10500000000045365ac51b49b810500000000026a638952a30e010000000000000000771d6803000000006975c99722381b64be93d59f0279f3755490d03dba4fb97862736d9e48764bf1417ee6d46012449460460bd4f808740444bbd403018a730ee407455d4ca86ac02492ae39579d07f11c4b1ea43563970f45df03f152aedba32fe1562d3c7b15390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007cd44e17513299f2ecc2079a464d83816a71c62f0f5642e430f1376a9c98a3afa5296191c15d68a0a2019847d12dce35e151a0e2c0d5d7aa55e404c697c084aff089a4d373ede3454d657cb915a278b39178a74cdb537ba803243644e8377aefff2b316e84faeb0f1f956d7809a367ff19395b22c0bf72da3bae232a3d1d668030ce36625adbf69ba488f6e60753bdd00fbbc61fa1537de6443fcfd698d6a976a020ab797ff6fc059be0bfafb6bc3712f80e9a08cee7bbfc1f969ad6d2a4d4e6b400a19c8b92c150e97b3dfa5b7a1322edeca50ab66857b4825ebaeea870f17bf72fa25eea50cdc6dd9f100b9be47f8e979999d958f096d14867bc991090013efa9a802049cae8083c1872634b7337eb89ddaf337d4ad6a4bb2ac02c95a0bda7f73ebfc032310463e0116b6fad19b6de10768dda2ba84c43a03041d6039832065bdcbffc703043eb908d95925eae74dfa5a2d69bcbb90c1fc34a553ee82e87372c94f5a9328032b2b5ba8d60dee77508b23ebba980c4869f703bef1309fde4f52f8f3dcdb450303124aacc30c15a87397f1ee3acca7c98c014913ceb7ad4d6f9da165d1a9e7e7963d0c43e6909600640490e871e9b0f4234a713278836139234752f93021aaf6441062301014f2979c4bf6aead6baa37cd462f7322ed6e333b6ebe93e74eece28276421be508c6d5007c490b575db18107c8ac49cda3d985d8ede323ce74bd0e2fd9d7e5eb1300059b6c752123ce3c809bef3ea089c9bca82c8e926944797ad7db3ad83b62c5028dbbb443d3e524286ba686383124b7851e717599eb17020c432d54c2b8dc7095edde114c6408495f342e9590132e8e2880e35eb10e575fb8624678a49b2b12b291efa38472683e2e551d8c06d0602ee573269792cfbc59d0a08553286fe870bcc1f51ee1697f451a7b7436f92da5f5d4e07649013da86ec0ff779a0e1d11dac7f72dfd7b3d1f33a89408447b98b79dd3ed678c9d8496ced7ceffb505230b605ed92978c16ad57b03d9be5361ea106792c3d6826f6d8e8b36e69ab191207a3eed2a6e2de3a5413d54e721569e0a394b51b9e0abc7b84fa66544cb7e67615bf92ecbca6ca50fc2789ad1f7878ffeca0d85f924e6073baa6f9c7ddb8f96f2a30e937d04c864a8fad3192e439f3d9edce4e9802e9ea0020867274ea576194a1d8efc29ba7b0856e0f30da12b0fbdb6ae412e72a115a8791a46da48504644978c5ecaf51d604291d45612ef705819c66e0b3fd11ce659f42aa636817565550637fcccf78ebf82d85cba17a63be2e8be7929ca25021f3e97a7af7ff613a407e45b885f96fb5d95808e179546a7ae264029516f3bc717b4d6d4358a5f5192e104b6812d880526432193644e2d9c9e40b6f371b9505b96e70a062d486714aaadb29d2abb10e4c37450abdf438ca95d188612ef7503061e906e166d4bc7f366eb791b8fe2aa9f5ecb04642a258c618cdb803ef8fbf4f89f85c886f10c2a153d09f70c3349efb604a75dd7a73fc3e5449a8089718122e972a858cd8c69e141fb29391695a06b5379ea21a05c7de8608d04ac8b1247de934eded9d4502cdba145f4306fc5501df25bae612d2b2ca1ed203437cfedeeee96f6a5fb6b724b9585b4361dc295bda3905bf7ad65d8df778338dfe6c3def5353d431a6df12a7330a0189519c59652817940033d90cbfc296da442b12d011ad9b4beb59dc974f9bcaae2352da382302408d0994565d64aead81a578dd3adb44ca1b4b58cbedaf2c2855f8c0203314c0da48afff87d2aed9dc966d4003de4b0adde327118067b826db4babf7fb7049a4c6be746cb697ba465074da69bd91ad68aa84d097a4f2d0db8fadd8a089857f185976e98b20e3c9e85804f9aaf4cdc9a87bb0c5d91cf8eb0cc926c0e8fc298b645c07fc0472c84e7ca0eee5b4576ec7835f9d78512cd00361900b9a813efda32a03a242ad8ae2b90778a4d5f7eb910295deedee5bc4409b81797d9751a24a1f549b9d2735c8460059d0d7f433e8229a63c49535002780351a415ae2b77ae0980c313f9f0be22c625a623baab69f273264b2079709b4b3e9c7daff40fb71f3c1d4c9ae4a4f129c3860b23af8071295063ef21444761515fa1f5b1e9e03c402a2a42cc56e98dfcc35fdef4bf97e530a0f6e8ef798228442bf2a5b63633ba10637c5fbd9436a5ca94b5235760343a976731567cc840fa165fd3b181d7e8068098db4bce2aab6eff27ed3cef98a6b967e7940fbaebd67d16fe83640dd06ef6869a577006dbde001ebcc474753da64619d7f0e0b4369196bc1f1e77583f312dcabff0c3967c63be646a2830185b721f83127c89761735f80d1a8ac05ab30a50a15a545c044182ff9510768c882603e4877e5045d4a854a6ccab0ae92d9c80e4477c6eb4a12dd5474198fb0cc6190f", "53006500ac0063", 2, -1000506218, "f9d258fbf9fbc4521d5a3f854e64f9bf0d6a4295360172711718c24d0eaa98e9"], - ["ed3abb9001316b8865d11773b05612e79d715eeeaea4c86446cec5ccd8947ad3a2c84751c203000000086552526a63536a51ffffffff03abb71b030000000006abac635165001552b0020000000004ab525265d5c3d80100000000046a51abab44454df5", "006aac", 0, -2059530830, "176d14038f5ecdcd58200bc5eceb1a082db6eeb2994b2fa1bc7e477affcfad53"], - ["46ffeb4001e9365eb1ef05f45f65a9c5672080b857258836dbc186749657ee4dd2ea62b5780000000004525253522daed4d401bdfd5402000000000365526585e41dda0100000000000000003d815b0000000000b365a23ec123cff9b76ced883132c502473aed28babc4a64523c2f23f7aaf121b4da223fdd057cc3aa62d4c07aea086f456b093a8726a596bad3df032170a0045be1ca558ffe35aa60b6314f9be4cfa63f0cf81b10aa589ed278f093eb93d0150000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084a5660fb132fb4813fa8c738622dea51c93e8d58cd81ddb72883141343c39c615ae602797cd52e964ecc40315c0ae85b0e94ae0b579799a6c18e8f0b0628c1f5a57b4b2c6cac5ee968d802f54e26a255fed9016e2f6656f7ca3e9598c6077d55284a5fc36507156b1c157614f0a6194ef2ce3341b5bab5eba7e185c704418f6031a8668d574420b6fcadb8e625a9f20f7b97439cee77390c0dac2386f8ee7236d0319ef1846e45d8afed7f2ba96a677302e18329a581c568265daab6ad3a7d1f74d0a2ba57a0100eeca9301dbad48a1121aed03ea15bb49aa02dd68c144970e48b87f1705879347f2f36cc503bc38d48d481990833dfef26117ed35baa7fd20e8ffbe022db1027c5aad3faed076c5531c9b645dbcd3a24a75c92f18f1222f983aed3ede02174ba91a42af82f86ca3510989abbf7879a9e44d6d7e17d79d8948d57179b1b20208e83c8db4a926412f69cc59cc419ce5113cc6709b2f59ce59475bcfa5fa3672032710bb7883ab14080e82e887e337fe471210f098c1316f2fd395ffee7125165b021823e74f3167343b6ead1097f95cd0a1897ef90c6c28a563d56bf3e09caf60e9acd0834f42503124d429d89f6337d31da32ed041ab4d07ab1117ea7e842951374416dbba4040d7d58f685e2c0e883473729d396b5bd74f7ffc67aaf7e7475d45750b5664a47cebbf5b16ed3b671cb8080bcbcf015e4b4ee62105df635ea499e444e4ca46d7f9ee85c7af2a0868360a93295062c9c7fe3f1554631b094b194b5ac03976b742cf8bddd8f1705c8476784c760f249c9163a22bae28ec86262fad9224c9325af5a736a8f65c139e24e332176e15382a454e52c92e216ee42de5421294c3b537daf3a0bf6bddef25701edc454409979489cc8b481de34f2dc87bcfc9dd6fae38f1d0e2a3cb3cce2998b5a4969a8198766c220436cfba39e82e89de1dc9c2de49cf66468f4f95de8d555fa24a31028910bc4c9a3407e89e3abe9761f6ad73972b8afe9ad0fece24a72d164e39251f6da4637fba9707ac891b7ed8e03cda16f88abeafb74a4f38032602bf2d89240dd6f9fadfd5846d26825c43914936d45fe8465c000e24debe8b8432755d7df574192918f7f4ae5e8c6bb9e670c558bc44006678c7428d1d423b53ccae6962c13559c43b13630f107d4ad838309cf1a0dc4c789a62ec43c524f4f7c07634f33671f67cb233cc4597e57684284656601cdc14755cf2dfed3faa9a57e573b3515edbd23918c5d470ccc0946b40f7ff507f383d26b8c3c2e532e1fe12adc1ad0386159b1707f0463f20a91b32d38f8f0a4402349704c4628438268a44c134a061102b26edeeee3b26a0fd4f194c6b931a4dfaf1184b83e9cd411c07f28514c2480744d0764c5af78f567691b833dfdb5031299e0b2bac752300b87a23e1870831cd6fb511450c8085bbda2fa20940ab284e41ba070ddc44d4169ad7d07e0139c6331ae9c8dd4f5b4ad787ac84787673445400b9a2ebd645a42cf2dbea82b88c47bf3b37c93cbc1e835b87242a464e45864be2a478e28437b17c76159775480e290b9fd01619d24d0cd357dfdadc1c6861988c40eadb8346a68ade7dbe812459729ddf22463be5144a19799bff76ff01f489f349f0b54b900a1e134c6cb115bef0e6f811199053452271b89a65169f561eecdafa00e75df625f88bd0b394ea1e995e18d1987124c6c93a44c0b6bdc71073a76991ba91c950567623fd8456b5ec2f435d68e8ec36517e8818f1c8710a64b65a95e8233852c4ba74f311693e10226be8c2b5bba5366b562b729f9a539c71930a1de676a8a7e466642afa67e230f684395b06214e20c049cbe55f34b57bbd45ab03411eb8fdcf4683aec744e71e55dde436eeb6ab7e51ce63febd17fb0ec3a4a406292fecd235a93f0a7bc22e4062fbeca438cb9d1cad46e6f65d28fbd9069695dfc4e244919ddff3f7ac8c283085b6f55c84b3f34b16ab834c17742ae2fcedf1ce55dbd5dabb6aece3786b0c95059d5bf146683875bb1cb320479920b3563fea86d7ac6f8101d4edd33679b27f1ce72e3792e8f7147bf8201851178201e89ece75e2cc53e773519bbe927f6151684b571aefc994d2fe36914559945d4b637510174c5687cfff3107ca230ab963dd4392b2e7a10eb7f685550f345f3ae844be51ecc8af24c824ce63ed1d5a714dd8711d0880ee0fc5135b1c1131c803efabbe1391eb9ba853c09a9c414812fed821091fcc482c209d18f9c4f8f94f9afa51b9ad8ce47a17996eb54b230955896c26f72ce50e5f8bb93649be349aa765bfda58db4163dd4335cd06a5b215fb2f2dae2319ca6ef6343892d78ca293a7930dc796cf93e6970d97c90e0125ad31633cbe39017b24ca21ead318d42187a5f43efde50eadbc432a6f201b60588041460f0d5fa20b", "530051ac", 0, -852224685, "016cbb95af8633735892055162236b783185aceadaf3fb515b2991a969db12ec"], - ["7760c4ea03450f9733d2d752f87b1ea87688902529adfda7496d5ab6febeedcc4af19b52f30200000002ac65b0a9aeb6b1ff1036747e5decc4fcd0eb9112e7ae0302c5538d82d0a8f40105177a4bf8690100000005ab63516552a1268da2ae6d8a2c9895fc0daa1f4bcb60da7406880ff3f17331a7599b9ee1a6c00148630100000007006563536a6553ffffffff04e70177050000000002636a84b8d70300000000085365510065516565ba3c8e040000000009ab6353abab0063ac5225a4c7000000000003655353115fa50d", "63636a00", 2, 388073941, "241efde580b050e7e35b13d26067bde5c6143ca692dab5690f9ce64dc45cdd50"], - ["c67c4c750343fcdd6f776ff00a1dfb7f3dc5e943b7e2fc0a18a1c212a6380acdf6c2f8ef83010000000852acac000053536a48bf476abd5e562913aca2198d9caf781a110040b179d65c008c880dad3e116bd0d61f6402000000096a0051ab52acac636a3793f5355cf8594427293af4d7ad33a7d5675a9cc44cfb3c1a00032e1c52686e34fa36380100000008ab5252516a656a6affffffff038dfbfb020000000009acac6a6552ac53ab6afa545a00000000000152e7583b030000000008acac53ac636a536a29205bad01a8b5dc04000000000000000000000000cc0bce2fe8ede95052ed924e1c142a0462481e16ee6131a1d1c27a829e4ec1eab446afe9ae716f3f0c5fd20d6079a840a3e70461e6bc52065562b1abfb7622b45367e39405ec33e169f28ebad94311fb7bd1c6eb8e04c8d31a356a5442d0f95700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000def7372281b97a6058b3a16590f4e95fa603bd2430484a97860be09997171cd4aa9d5b5eeb8c8b66de681dc70b23cdd8e953cfddedd1c5be7d9825805ed27435207e15e5d1e503217b982d264ea94fa95964c4f9bedf804bb718e0ac7f1f42201bc6dd7de939172c4310288142703215a13f5aaef130e665d0f021e98a13686102085c094eaeff2bb7fd25f6429ff6ffbc5bf08ef48c3cd77090aa57e132ba3759022ba1efeaa1fe19b2c803040b56c43f5d8b5ac78c9be3cdc6e764ddd0e99936200a2c14470fc28984bbac0fc64844d2425c2d976386f53da7621279ccb722dadef927d55e8550832d4e1f86cc1b4771536e3f134055b681640d0692cbee8d2e696b0308cc87636eb24502c8935ad30e4c747d90368cb1399d7afb4b52df65c5e7c437021f5662aff67ef22f3f5a1e0122307fb9823adc8ff990b7436696a49f0aa52077032418de48bce41e989ffd045e2cff3d957ee13668b8c8b2d6bc2fd2d45b23be3c020dc449fe0bc9db9142c09d23ed14c434df0ea4d850954787691698e22be996a8031a9a45c841657762f1a261a9cf8a9e58bbf405c9d1013b9b857b04de3aec00704ae554aaf9905e0fb28568dd8c8e6218eed2f300977e45ceb3ad40fcd3c762d1332628fc2557f1e8ae15766907d0447d04f7951b985ef399a2ff349b24a8c3c2549eae4bdc27daea74e2e7c2b885b646c9925ae4ed3a2ef4ae4a5df4ce6f6abceac59511028b23d81bffdbea3726368c84daed87f2762cea1e583fb72bf31b99d07840d622dcc376b7e5990d3462c1dad8fae60f4112c2e56b1005e6f7f2e714f32e47471a2126abbe604e45469a81b1ad19a591c25e7ea81dff5f43b201a5b030f0e00c16a5ab5f600353efaafdf833b4c9e121aed6bbe7afa3e8690b4607ec5bfc946e8e726c854d9cbf5611a84277d3ba77d41e4ca3c0dc148622338b6ba1a051c944a0250f3129c31b26a1b8aa519fe0c13dc6ea39c42269afe97e6362de05694a7f45fc7593a13a77babc14f9c093261126ea7264df367e22a0a4affa90612c2073a1c66dfaec0464a2dd02d3c91057f8864c314acff7279e992273e6ddf28b2811cf4c3c9d109510ac5fc599e80d784c967501eff22cf721e8bd20028be2708fba67acc741c798086bba94546beadd5ae2664a95ecb65a384b86a962242b1e5afe29fd09d2dab35a99c95d4226a9245fe09efc45b3f65f17827062ea5c0d174eb0ecacb7e5baacde82e1a5e110800336b57564d1fdeed769fb9cabd6ed94717380fc94eebfc710bb59afb18ed05b20c5f9005fb0c1efb5cad95cdd9a5988098b03ed76aea2fcb05fdc835c5020f99d381ed55824da0ca01c91550cd3d4d429510544e96d45407f2ff5ef74f94b82c93733ab4574e637ac6a621bc63b72dadc95f70260c31e22cbfee0cb1b4119a3a662699e5b7c8bb7b2fa8f5663b4952bcf46d2a94fdc3ad65950a79d17ce20d4d9e53d923cbbb0684156b2b9572a86a71a5729649dd1d4b822742728382e6dd92c959def266295e41c46e7be1d0aeb88f771ff159864830df2075fbb12497de623d449383f67e78dd31dd21267e57f1aadd5d1b740dc5728f4dbc0d5e0f0ffe4e83d8f77cbceb3ec3abdf0cd48baec4735dcc211fd9df802b9593f7958c3df7f085b3fbe5f05189cb5c5b9d76459a8781de0d168caacaef20a5e6a561179cf5f426461f890fda742bbea8f57e5150d1032c09c025991bfbd8294b4f66c0b3cc6fe4ab1344d837ece1587b393a52c71d659ab9720f0ea17f1fbe55042a8bb077180a9e4a86781140ece78bf1cef46b1dcb1a852b14078a91782f761dd4af6d701de61cc62a16789738761fe064cd811734d082edc9bb8eb4be5b935fa57a6cc0fc1da0fef311460085cb877b3417d216254102ed8822bd9a7894f4afdb9973cf6984bf99c7c7c2c20a90f9a3c15950d93e18d69f49b22a963b69b3ac3a7b6baf4c65d8313cefeeee0a535f5afca64ab8a7fb0339ce8371c9b62fed2da06cf14beca4e02d60def4d89f34e82ca7060176abb8cb026295d7a4dfbb1f074f55e9c64cda7d504ef0cff39b1a78444c022f996d92eb117fcab5c59d7f2a3e8c879ee1d256eea5548bf5ca246dd7639fec29d8dc22b1d8b1d8fbbfaca88166a8c0271de1b1b0ec3cc5b6d3fe22157579a8afebc34593705f69d5d0c73cf84bcab0740c3d2c21ca675adcb64b8575419167b190fd486bbd87d8d01e1f7f20ab1e17e87246bbcf9f98cec7fdf2616e264d7e94fb8a74cb22a7ddc2ae3c4a3c23106c0ee226f87b25e5927df2ec2c9df6edfebfeb18c699a7fe7f83bedf81b4c5aa2723e315f30f7c6f9cbe99e06a8f3ebf84a40ad92d3ccef17f79d02b5e850c95fd0bac754e939eeb2ccd2b9a1d084469c192e272c1dea9f8c26303c0f8fae666ce31b8b09", "ac", 1, -63997144, "00aad930114b9698ae668aeb8a7c623f4bcf0ae67a8b7d7cda6d942517115ffd"], - ["dd360ae204e8f56adc69dfe4c3ce1d2e573298e94b7c47138dcf5ed1849ca94a8fe263682e000000000863515152ab515152df057c78bb57270276cd9a6c64ea36758619d6fa8659ffa6f56f08877a55610cdeda17460100000004ac5352651cb4bd7b0d2d7fb2c597b8e325c7cc8240bb17c08e37541c91477751afb50556220c91a600000000095153ac516352636a6affffffff11fa5b2637e7da18f32806cad41bd5fd0c4d5424aaff874a91c03593044ee7e9030000000851535200ac516a6ab568d46901e18afe0300000000036a515300000000", "6a52ac65636351", 2, -840047507, "bd786974c78f019d9840a8ed947e95e2b83261af67f5c36206859cbe116845a0"], - ["088270b804e2447082287bf1b751bbf4b7d4539e3392d91ce769b1cd77fd7d86f0121295c3010000000263638071292937548f74605849363c3f22466ea15382273b4701d1d2924f78aa501691ecf65c020000000852536a51ab6363653f58564f38622a2bc25dc1dd982301af418a2d61276f99b1c83c9695a4a8021b3096ecd600000000006e18197b10f4acb757a52de07d094def4c1039399227ca4f6c6daf29e0f137c51315756a0100000002515379d61db2042b2c77040000000001abdf93c9030000000002ac6aa2a86b040000000005526a520051c0a64f03000000000852656a6565656a63ae712300", "536565536552", 1, 2086079035, "5b770f9a5e5aea286e5d3ce0c51b0a7dbb450b6dc864873d5f89d38f64ae3d46"], - ["7f72a64c03e68fd8bd2e1c79e074d9a4e07fe0b0b42ffe6ec275ea8799b1616ed15d8d7ecf0100000008656365ac6aac6563ffffffff370a68c2656bbec9f516f84538217a2936f189fab6dd726eacaae6490746c90a020000000500ababac6aa99d02c92acbeba4aad94d248c7440bc84bde7f04f471c2efcb2e11ade71f5cce7212dfb0200000001515354a9a403c251af040000000001ab427853000000000009ab536565ababac65528f189e03000000000000000000030000000000000000763cc50000000000d2a7db38046036ad5dfa68ec606a49eaf80c6c7022139828bcb26c65e96d951c4ad3710b20957e86c33d24a84433ded5be9719c3cf9b09f427ba53db0d33b7976737f876de36584ae434326ed61a595b0022fd14ba78fda7590964f1e5cb8d9300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000902c111fd203768a569df41494f3e0245e2d701e6a53f27f2ccd3cdabd05bb97296266cdba217ec3f4f0eca3b7009a0b6edf4ac8d424db0850948b4372a5a1f4aa57e6f8d039a66c0d539fc802affdbf25a92350a564733bc8477219bb9f9690e0e4304dd4947f585ce3124ec58021dbd662a8c697356cf7dbb8343326f4c1d1020d6a1f8189c68c1479d3b06b366b2757ac9cafa1f9599f6ccf6fc5caf3823bea0211d87f45747f359c3b885412a0c80d955eb3f2cddd9d05daf4980240b5ad0b7d0b2b9968c1cdcc872e79382da2c98b2e946019c8ff7dffa5d7c397a8ca0fd23df0271e3efb4003f8ac542eaa7af124e02786cd4d0e53f9aea50c0f06cd11fc3098030e33c8b4850d8b6fe9def18f101d9acad43ad1bc6c9876770722fd8bce287c390210439518a019a994857aa8fd9b4e2b09a8c6549e6fe90874c13738b02d7d279b021dc6490d125c4d2617f9765170ee5e4b06d46d0d42fe32ea752fb3b5b4dd28bf0309f4d721f0c6bc52886c5acb8d5dfd2c88b9c6de3a9a0b92d47f997364ac89cb021c6e0e0fb9ea6aaffcfce275e2acf1064cdebcc59cb5cd91003091646219a3ee44b6e45fa34b4f8e68b8871ba31c24d15e45d21f9f66aadb6f7046432fa868bda8c46f9266712d5e05b67ddd07bf42b7c3ea2fc03c31216eede8f2dcc9c52959b241c144b668104bf4aa8ce89450c25af906084d25aa63ed88da8ee52252e9685fcd1f613f88e144afbe5f5ffb12b185f7426ee4da5d44b12f25b80195f6c88862469b9a225f297964d1b56f35d7c204f7c9294fc9c11f17e7002ee42354fafe8506b1ea04a9a7ec0e3adddde7555f58661fa1fc38dfcd72413289752313ed994957b4c3b211c408699daeeeb4a680a0dd153a7453d2fcc6d1a0f9cebb24d22815137a779f6530b9d8915ab3bd12b96af012e309e5061ba4cd624367859c332746330c6758867dc5609941f82624e7eecc14d5fcb6124f023e9ce25045f69ebe04416c3d71e7eff0ddc55455d9b2d5ee4e13194baa800e538ef4a2a1666738694e2a2150a2b344604b9a5fbc99a5d29b2f2fdc2a427149c0a6580de805891be8f5912ebb717759ef25bf5684950b47a432c1ed420ccfc560c9ca1305748d48bd42f1529e28d73cbdd193de7a52d8b6296084467b8a6392591f72c4e6f2935d126aa5ce9e20cb247f2bebc681085015ad204ff6f11ff0472468a03e24b7af1bd133e7a71ed0157f9cfa0c4e2a922aecb09f054c1c6c96aa7393798b72166ebd96a3928a9fd6ce1a464dde4da6d9d163d1d6a270d2c52aeadcab7464f8d36f44e4612c06314171a119f6762b65f7228841f80093c7c7633d0824d7a97d6381f5a2dc70f595aabe79e096f6be7a80858e18672641de300ff28ca609997204ab2f397516f3bd0cee7621173ec370a3f45b34ea752694a89bc87fd5f8d696bbe0840f31dd91e2ca6e3b20c4dccc7ff6c9ad2b94bde7df72757d91ad18f23527d4353c5f13eb167324e1f9ca44c050031f6929a700b2942b1b012510cb61f6a54495093a9ca1900367a95d57230adbf02afd6ed3baac157585816face13debe91580c776a69d23782fd83c5d2b58e2cd586c9ab671734ba147d2290f6c91d13ea742bad4e977735c4d15432d30bbd85e6548c530608275dd635665262150164b62f2fcb142ef0297c1b5d24e1f989b523262ae3936bccb6e00b24b326b7efd578354198a20fa4f199445b4958fb9b68a4a071fa95e86447d7da6aeb5909172cd5c7531f563c38f8d6eb6aeab13ba94c3d7d956e3fbcce98c2bb018e72ecec248c0f73accf842d2d0da326bf22d2a7c648cba2efdedc0aef5e6c4d8c72ca6eb7a828079be80f6d5692e0eb34a330caa834601734c1f745f450da69399626939edd9dd1833d663bdf00c01ecb77ad84f82d6cc75c5aabb3c51192e6f67c861ab7d5a5c560b08d949f4d94a0bfffd9189d382e0174b6a2bf58316c43b6f9354683c1fd7895c6e429d2eaa4df4afef7b7b9a139dd094a8ffa16c549fdcd976c7308c22c43af30507bd9b7e3c1eb825e141a8c90f951c5292a94c131e70bb115054f94d8a395a6101af9b11f96d204249af89e619115ff2ac9965c9bf7c4bd438b47d75fa6b34fa46ad575f83d3fed27d104f862bc67182c062e98ea334485c9dabf575f7a64193e2f678aad02d7d85888532c0e294e7d14b8b36818fdc586905e2af22832ea968553b6db0934ac7f213a61e2e418c76a5c4ab8c5272825d0ca9c561b38df55f88a4e084c598d65c590c7121c233f34ce70000000000000000b679b3000000000054ee3bf8cc1e7fa163c850188925514df90c8ce36fabca10ab798307ad627d41b9b4936dc73b56ae2e9f7ba5fb64be01db30cd1c858814d332fd5a2d2ec41e52b85c8b57f846b377e20691e85a5a1a8709253b7e3d4026a5af55e9f09ca1037400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000289cc8d6387e4890e9b4ab2184f965461f1e4684b97a5fe033aad2d13a5d23b515a2b0a70b45a381f3c7e637bb208907abf2e0863cd6b5fbee519459c127e7ee5da0b8caaf84a7fc468ddb986c75993dbad10bd0827607fdfc86df6161aaa81258232861dea0f80b6cf3f788cac55d79a6b1267d4a2048dff42a88154d7bbc77031c4bbe0d3350b9667d5a676c433a18e9f63916914be487de113172cd4171efb7031806baf72ef9c888d79458b96a5b65e45c6cbe9e950389a7d5ff25b4f25741540b2d3a278382bfa9588d4a69daffbd8b6fe1b51babc6ab45977ccf9425ed0acb451b25293916cdf41dcc5d79a80c61043dc7d96d4b6faf330bb4b9d262303f6d0f022b4ba0cab7b4990ea4053be10e9d00079ac39df0b89dad012c2017112bbf21810313632498f20daff064453fe895fea253211b8efcca7450182359b9f26ed03a36022c0b5a6c64b31bfe18f52b39d2bb18db2781a63c59067d928d751714a71e3f53021c6e64b631b68b7e605d3eadd4398b6196f9f08909be03b8d6e6cd4edfa3393703265a3c4f516488b74c0a606d7fb227179810a0c55bf44ca68f8216ee42edd9759d60fae6081c3b107ce13d9d7922ed754ef716064130db0151e59a43c270ae0be740643f2f290fd5232c9979866ce38f7ae6b0bbe9a5e2cf8215fd35a7bae3e252bd9c49a8cfbe2d9c43bd15f4b639996e11c07ce3a07249878cd2a5342dcc689094a88c43fbc98dd2c4ae86e7833fa5f933b3440c6c48955e5bb40d11905b645b19a3a33cf7e42cb8d494b44f8da4305a9719076edef9e8410b9b52e6f814937ad5e4aac5b57f996734cf59998c1ecf5f1cc897073f76ffbb3668deee919eb5f5b7b952aa92c213ce62533028117ca2a80897e45bfe9d33b11f9e67885417a8e2a688de3645a1eb9a5266d3c36509cb01b4bcaedb5b9b8f90085a74c8f7172f0a5c3406db69672728e706fed150625f5381327e6bd6e5532b6ee6900ed5634c3fd2d7669b9cdad3644f36b55025113caf1955d666511abe7f3e1c58799511e249d9c2cac060c0979b732c4586ec38c07a6d587b4545d9a88639f887342bffb429220b09d09101b4536be08e54a1d8a7aa1d8e334a0e4c5a44fb1011b4da05d17179f513810c35fa41fef1ce6c834acbb5a508321cebe5f6d27f4f2ece3dd55b05e987c45173d3a474dd02e818a7805543c4384e0ddfaa6acc5697ca8124e06d12ee13030be5fe58f05bc872914f51a247c7f2714e1024e00f1814165dac6cd162db8b06c6a599393cd870f9d2229fa2824a86270944dac044afe229970afe6c3d73d09d697e72c7fa5393e72a22448743a5527a2f8c7e6cc1771cc6ce3b55b0303bbb48e62a6f77f870f8421c70e41a4b3ec354fd612724dffc3bdcc79a9b4f52d35f6c41ac87fdbe2db36078d193af6ac9ca9c8aed0d5aa40642d2137e89ce4ad80963d48abc40c7dbf7f156bb5c95e5d00d3496f66d10e2c2f2798422a2af43da859f443c7147d63ceb072a0bdc7721e17581069d643cddae4cafe781cd2e66d7ba27e01c74c407b2838fcad022324441418e3127c1128de0535891c626f435762221ce5c1f92b07cf3aeb07f44a886f85d88578e43da3a71832be36668bf80945e296e965263408f88cc711a096d47239aa1a4c65fee4c1968c17514b7676fe61df11062b711d1b93b5445ec44ecc426663b3ad9a9e17b105866f0fc06fbdd69ea25767a85ab57e2b70ec48dc6fa4c83f4b4955fa6f5f31aeb6ef0c8fb1832803b8f3ec3c18eb7293f6903863533cf635651a9eb737fcfd20c77b888dcc8b09f6c8e16e688a0e9a4919a356755142b96f51b0d3664fa0dfd88bfc2ce29d4b09603acb942ee1596fdbf087564641d669b59cca3724c8e57b67874befb996c10a660ae331b496ce0e0762b7dfd837dbc3b92876cf9efb34cf384bca505e71dcc5625684d04ce1d36d656f722faa27cdb32e4f16cd24c1e466823d704db4ff1ef8398e8d5f80cccb44fb2a9decc2f724423651d568df05d8de0d0cf6c20440c7d69114706ecf9c03f027aad95fceb372cb7df3037f2a0e042f366db8354d326d40d9e561e7cf6e2f9fbfdfb6dbfb7bc8f30a0d996070ba6d664aaca7d3ddb0b6dcd5a4689c6115e902d8b648c90f2dd521072fb1ecdf9d429de54b3d26d7cd79978ec4483ab6a6925469080c1551ceb476cbabee6795cb177ce70c4da6c3aa16e559d6b4b6864375969785724a100f8e18b6521bdf2483a342f88731ef7c2d9c40c317879b2873d3d325e5fe5cd5fe8d5686dfb5a02000000000000000000000000ecad6f06421e083a41438eb8084d0b37e7a5fa698ebc286819b154c2792f8e8701652ac612d0bc583221166c61a411c6348482955e77f7a8cc24a4faba8570c4ee8977b6c1213c0400c8345685d69d340755bdfbde2367cf6959377a5e07901900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a85a4a909b0f30ceb8a6c5a119663161507f19fced62b87d379759f0cbdb690ee9e60e70830c73a6ad0037b2b789dd44775eee3114793541eb98d8821d6b0e04325859ba77b55fac30971ebaa66013f5f78436119a8a17273546f6ee3bcab7dda20dec4cc53c990d396b6f7d6fffe84d24e65dc4dc5b6b834cc4477d11b23a4d0214e44d3690825687d4c6fea30204f5760bab846f672436149d3db19f1742de120218b912a0b82392122cee384d16eac481e03fb7252053454ecaca2c455d780c970a2a08eb6ad25385e34738066ed00d0a4053a81af46146ac8d7ebedbf8250bc8f00e3a3360e1e88265d0aced96161b7435dd467e1c06e8c16a4234bd2b908018f602085b3ff1e055f8aafb1173b9f93f95ed8b75dd51a512e2e245c39fe0dc2946fd0322e033a86a4c34d70b4ef90c85185bc80ea7c0576773712c1be7454553a30ceb032415a4bb1dd00d48f12992b43013199d68b60c38b6493a0159c06c4b1bbf4d0e02215842c6fbb1436f6ee7b5d452485cfc0a900ae9e77412bea9a8ed12b6adf263020a6201b379060eb46602821bd2272786cf4dcc3b59c1eadfae9cc9c54a5559af41621f839d698fa447873af03faea8d6203d6b33d8b4caad1b888721afc8d212bd0c67ca67f631ee787774fc22e5d8b51d2586e2490f6f250e3e39636cd75b2f63159b773b50327a70b298c5147c793f47f09e89e8e7b48009fd95fb9da18deb8bc2d39954dff6f8c3900c187e0f9e83a6a9ccf5cc2336ebc8a79813667573a1cdb87b5dc5393207aa7e80020e8c9496e0a70aa929c51780acde14f2ac8fd51e83aae55b25ed24aaf414d48fea191795abdf1011ac50205b01dd4f0a348bd8ed0593af4eb647c5b5512619ecd73b82b59fada178d0e12b083b3c731e6620fb4d7081f32c4ec77c7f8cb2058d765cbd7c7cc3ed4064e1da8fa82b00d73088af4b34b6ad735493a002cea4431d41424017c49bc21a7314e837195c454c1ed19d67b7fa785e57e0aa76382cd18c600f27aa7e34aa6caf8dfe001972af26e980bad619797e4380de44fc3e165fabf293a80bf92de93ddf8560f2ed572e8e34c9c76b37147a74c4b093e9b0791fa6dafb18e1fb061827574ebc4e0329d141634342f80492604c661f8b7a88ebbaf7124da733667326b72a4bc83dc850e7b5e3b8146dd9b3dc40a5a85bb9995efbc23b8087e5b1d8a6894dfa6b03f1250c3f386ee5bc29298acd18d7ccf3e50cf8bf3cff611b269a341d6b16c7dcbaa517ff866586a9ea18f06d0c288e7ec6fd5ee097e09a0d0cb5bdc17bd218da1a8a8d0a9bb56df2bf22720437ac0d1443a853d19e66c674f803a881634498c934373075944bb137afbddc770ad169003af1ab53e1780949863ffcc0bc7bf5cad2c278420c5ce34879b2e47dd200a04879ba553841349c1bbae3482c654d459cfefef9196e05d21d305ac44d52d8373cf55c6efec7c7143aadd846e7a58bc066ae918b170d0e0943c4031dafe4e968eb4c1356180847d290b454edd8b31614548b9dd679d6a867f86d2ce954bddaab9060b3ed6a13929bb1f3d19e97026f50ce8f554543daf68ee3fa2673ea01765fb92cdfb11a8a54b8882fabfa345c026f13a083e62673882b6384e17607acaa05763605112e030829e63d1fafc42e9380ec3c755d552ab9ae5d4508758a2edde5adf0b036e1d43687deb7405969952d2f8caed09564c830192f7db2e3e4bc7b9d8052a6b0eb8cf54ef85f0839a4b0b1ea9ee215c702b2346d8cd227dca38a4a4f27e3e293f0428094b495a7bd2f0d844806746840de2961ef7101cb12de7260bbd0993d0c4f5e2ef564d4fc22bbf176a718c7ea90426932ba904cc462b75f98a9936c90bd7639afbbbc14f03b2be72e6614930a72c9bd3d46188d5a1c71a57b6b91195bde54afab89294be448e2171be68d541f1f6b65889e67b4842cb29b2200da3182fabfe961aadde0bf3ba16cd5fa54a09011ddb21bf158d5be70d6ca3c9e50cd3019c90f0fd9ed92a15b1bf802d8754c7f2fbe86935e91980dbe6de8c433ee10ff882a93ff813814566da92e1ca6ec57b76a22536dd04b49de1401ce4b65992221cefea048871fb49988d45deb6bb6943f9c47dcc2d1e189cd007ba52d9378cb0e9141ab716df06912ae84d6df890fafe6392581cfe9c581bb76d5f62731b308b3a36609874b322bfd806e27d8185260a091a67c73f5bca98948b077d3cec6ee1b876aaf237bd10826cc17a76ff82ef5b8b94aaada6949b1fd861850829028e3d12aaed62f6464b1cc449753ba15e4ef4dad8195a44ef93a3ab7ef141cc0724d903f42fa407ea4386fa855b2630bc6ad898d5408af5fe6fe9bb94438b2f5e27f703df4355f1f4a7c69b1b41ec211aff789fc9c37cd23b3a4f628f13f66edb19031e83485a91675e10d", "00", 1, -1803528140, "e48796b19bbac4e6b38cd39ed7c866900842f3794071ddf1a597da64d44ea2e5"], - ["95f189830293f601ce888ea34da0f6e1052835224fc1a58eef280ae80abe38b2fef32b7e1a03000000025352457719e872c9d650d0a7ce1241c7f48586b4d4bd3f18e096c495e88812eeb6cf98640e2c0100000003656a52ffffffff037325c9040000000002abacef9c65040000000007ab006aabacab52018f2104000000000463005163e0e85e6d", "6365536a", 0, -2071810366, "16c0a7bd6381e1709e3dc88ebe989d720becae8dd58ae547144f6387ca58859b"], - ["fb73677a01231964c0bd7e4d1735c8c4f13cddd088441d3701ef527bc0b8b4bc769e6217bd0000000009656a635352516a5251180d22e703729e88020000000001abb5403b0200000000065263655163ab980f39000000000009ac636a6a006a656a00000000000200000000000000008d276f040000000022f5b722db159bd649b5544bc2385a901d7f83b3fc5747e5eef017bc7737bd1ec30d42a55902c24a28b5907e34f295c81869a8dcd0fe7ade5d06da32db1459b46995db517f7c5b2946e356c7f15fdd7a827b7529abd1c73f78df50feec88c11400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000421cae3b9a9318fd6be61421f1d0b0b720d90dd267c15fc5e99f2e2086e9ee3812d73be8252523e188ee33aee6dc1ad11227d227915a9a5610dcbf13b067023b51761aabe1355f4c078469ddd01a2644cd732ab29f552abd767afbcf46ab646ff59c585662e3654f188c18e2b5d331918b0a7551dcb9705052158236c5cd385802056575c9cf79b4108726efd79a74e18d7ddfed15f263262b253d74816a6201c9021f39f7e748095796c628f7aabee0af3ad440742bf5de3258b9679398dadcd0b30a1577fdfc354250fe96df24c0f2be1cf777e7c1137936c4c9534c3e67628f01e9153d499ae248fa115c0df47c20a466f22dc93a12567d4c51f8946a14b6ffe7610306e63786512d108489b9593caff16722a2b152d7a0e25683e49baf16a8c8ec21032e13e16bb9d7f591b2ca9fcda22205223908612b67caed5b94d591f8f3c230d10200760c6da05bdb2dcbcf7d64e7906e56a01e7cc97d2c6873f72c0fa94002002a030e8fe46d8cdb5e3656f75bc3d027ebc4ddc0fb6aedadd21f1e4bdadc2642562c022f670d1448d773976339fb09c66336661ae16f28c206b0c717e0c364aedac242b9ed865c37586925813aac8d4974b8a18df747a958265e316c2bf57c6261897f04888d23ed7d91d30dd8a8982fa5d13e481699bd0291e223e333a9df95214336a3e21292ea7e1cef975727192d1c726504c137e8fb5e53a514bd932bbd2d9171a1052f91a57c6937c24068c4edd57959a33929dbf7939666be3f97fc751de6eb23e473af354576c9e5a9c28277ec078df9f8be0128cd74a5e822816bd80555db569d28fa304528b5ef532488e46a3681e3336122f29b3ea22ca80422f5d60fbb9ea1f502c0ff77a93c9c5d096c8bd17562be53f22fb9f5071e2edb76ffd064c7c0fb9631bd5c2acf664eb31fc61a81358cfb5f4f0afd7d0aaa598761c94b54e229974435d62fd8ebeecae77eca50cc6f07189a98241f9b3d4962b22233de909e76fd43b47b57d72eb73b0222820b1d061532028d5b3e80536c002f55aea802bbe260fd2c8848cb93cddaf57017953f2a54bf33e99be0d3356f1a448d57223ec1b017a4556fbc8132fe3d879032f422e6cddfe1df3e0ff3c735fd19f17f23dfcbac06ec32563dc4198dfbf1cb731fae2e5e323606376dec2b1fca68542293d6ae2613faa336e1566485b48e49f935f21eb4f4070425cefaedef8b9a57f2b95fd145b1bca30af810d34ddd9bd7269dbbb070a4edc131e6fc8b3bacd6aba9d0ccab56d92364895e110a6f33af4c1c69fc2ca46908e6b75698cc9b13ea73a8815778fd7b0c41dc687783722f85d25e4d0cddaf87be795304847ef7a1580eec9613f210366cc007e41a70b5575e0576d3421485a8a7713b4c96b8663ce5f0d5837e2952a71c7dbece3dad54d30acd597cfd89df912c77b8b7135cf91ec0a656206dde11d598e7e47f6b42020f4b9e5f6c9cf337bbf5019946429a414a9aa025c57aa83def9daed2dd73c0b6c5456fd520e12b8791624d7d3fb685ab5a1b9b32e19d2915e5cbd1831745dab4aa498a1b9947cfd1ca5707b566e1204af78b73273b9712a1e292acf7f15b706e9fa8dc3ef2b67b038728df06c249848a78777bc9a2a7e6a7454f08f1a1cd60e6bbd7ea7a4a4b75478d3994fbef7140d2038fa7e295819a7513c0397faa01958e80ae427ac9ce3fbd91796d7afd7c8f29e061519b1e446117e722c05be4dbf0fe5f6ec5ad65939332baed73c1f883dcd1c74a1217d041ade6ef83d718b152026335a2866a4b520785e5d593d2cdb6c513839bcc35adf185c11f213e8fa6311d6715be26cfef3588d4d5c90783c83c6f1c50eff1a502d7cdbd23f6c2a4b2aa9bb2b78cd30537a05372c96f6e69dd63a3ea7283cb79df29e5947f3687e0c9fb81debd3efb7d226fcfca873fc777f7b588376d8eede8774cdc8efa8d3aa3a32eccb8535d521cfc6f516055340681c49a7fc17e3af82884fbfceee4ed3b9e7857294f638029312c403f6a037ba40335df5c44904639c5e2e7b4a21e3040bea55ccecb1b9d8ba9460c70599149ff2fb2a57efa9a615d1f7a8a64f21f91a4a2a4ceddf4e66038db4c32141262ca761d0f60aa23befff1f7341ba8738b298b94a490b4f91f0107d4ad849ad8a991130caf058bc3c983899e0c6d09c1738d76e8c974c94325ff0038039e5660ca8b6c4d675fd151edc07fde2281434c9b6d14201922110b50c724d84d364aed3ef002f9c0b46d57643387f068f803dcb5433145d1580976e3248e8998f66498c40000000000000000c85ed405000000007253ab1b99506848f337fd94841f254066d22d38cb1022a32504cae7dd8f8678519b36037d1356543fa23b75ed364c3f6600ab1b08d33c9000f49e3da0176eded209f54b48fe7b8567f57dc9dfdb0bec0ad96c7fd97edb530b2b4ef7d573edfc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033aa38d77fd2b5d9cbc82460e0cdb80f566c60814d76c387ac7ad67a4ca03b2792981ddf3d9287a273c7a248832f1bc90886d1498c80ce7ca4a2f6fd4f9cc513d365d2e1a775796a2c989caa9d31c25334acaf8c87683ebd14d7710984ef0ff1140d42680695b8ee75689cc9ad9be78cd1a6da589094e0d656378d998dc32b7d02019ed4c4a18c2b6d3d2701c552868a98c9a493e324b493b4703faf19baf687790306cf6a7de7449a61b486734fc713e2518b59562b301aed779228f19fcf2f92060b0d3d42257b8fbf89377ae635a4e20d3868045a46190d3f6b87551d63abda439022624cfd46e1e2c4a42ccb491fc70ffaf556f3ad027849f2fb925a4db0b2914a0220ec64b3871301d2891baa9dad047b2360099fb42f2ce4197d75afa42d7e1f8b031c42a7b4de3bca64ea66a3cca11e43094e908e581c4e4a21f1cf7ee6a15dc3d602252647957d0560a274e5d25ff7b24c50883ef8b052e6c662a262c3a316d614250321c8802883f7a13371c9ed99b948671558329cf97c7a0b39b3d8c387d13126520216843941c5f69b764d48fa356902ef5d672d08217dd7f153e23b9a49c926b984e035baa58f7dd2337106f17726f6e0818c6c46b66545b2b6bb3806921a4f494d8f61070e8d211a9e8e402ebd1798b43a7c3990b0a76f7c5edf6bae148b741cc7ae0f5ff2cbf281e101f753bed8828e6861483382ddaa5fe1ade6d58db8915c540ed603c39c7be85fcf985a42aedf879295de9ce56f1dc0898a05663de8e750c3d750299d48305ea8d2329325a88da195157b585f6b188047decac6788fa02f40551e0a1dc5598e624e0a096e20a0e3af5c963793f85171140821d548e57c6f98e4e18ca8f83c90158d969c3ad178b3304c8528079145911202a6d603df4f31092ccb3bbe6180127d0688e4d998fe5aaf6ea5ad11fb6eaba675915bcb3cc7554f97191891148b0d74f30ca3501dad345eb04a6777255c5cfa8394d66634299e717bf81e0b0270f3b95e0b6f444bf5f084467517d379a942ef7d92df02e4af1270b76c96396fa2206690b17b352ca9357787d7662fd008ee3113d2fe67d9d09e091ace67ee1e0ffb69ba4556b635eb8935ba30a70c32dcb82134a97d268aba5aaab03340482d38b914d8490a22dd5a57e2f8c5399f863f0e29718e26744197c452ba108acfbbe6e4d796e2320710c5acc2ed9035a8c3f0f804a3367d17ad233a0de2960d1703e1eb1600c16a0c41f35ee9b285300e709f2ab4a5efbccc53e391dd8d2e78085b44d01f443045709d56258e26a0ba7462d3d1ec581e864ab6547e3a4e50ef89732a4f69b9374d1878ba59cc2bead32b5d274843d6ad2967cbbb1743e3f49c55c38496c44005a5193ef78e1901260ba5bd315e896bae1c812bea84549e8b4a7ba0ee0e00a4b01bdf57cf2f6cacb67e92f9af26972c87493d6ade4b0b3a687f900b59effabcb83e6da051b3fac5bbc378f9146cc91853067da3f59118a805f6fd8417830f36eee3033cd95cb2ea53f76d242488f09376a022022387ef141803777195e7682fa7f0d86548099514a74199e95527156fe26067cec7df01173cfc32ccb2b5517af529b386c588aac31c02787a37236ec74a8b9964cf327cad5197a4ac38dfd1979a4a1bf8e88ca40c34d1b237920339a9249922f90e67a7f693f9436dfa438d4b2e23ae6fc89ad9d08dcc9465d3be9886286ce208d4a64ce50173a8633c56e91f9538a5271b7da986a9de609ea2c9d527bb6a7878cfb19bfaf0798e6c6e89970687de13aa12a23380f8cf3322dd56521ada908c45c8837acf3102ae720c3d19a815f1082958aa2a7d4005c49ca73f14c9346d6ae9247964736392d38ad6d352fad01942141c85d20b402d961c0fe7e9ece8373034a835c6b2fe5dd39f03ab1407da1aec5b3ca4ec05d9948a6c14b7dda98f484a21ab87ac34649608d0b85f7d09daa437392fd38c1f1a7f2bd36fb73bbcb0e5d8b7599f3a29c1ad3e9f4a7e266938e1d7c3bb53daae95dbc37596a3db8114cb09e9236daa313f91f2efd39d2c5c2e0d3d9c82f5193b2442a2e338d2425704af10513d2687bad97e678ec201781a62d76a478ba11c9a59951a8c43190a31a20dc2e05e0f10f214e23ffff4821114ba4a17531e91bbccb5c056f1adf526226bbff802f24124a31e9fcc5a3f2b87667d6997cd9ec19653d35b5511c3b53e9012b3543b381a916d8668075bc854ded3b480057881dae93024a03889b3fc6fe9db242460081c9e28d05d15b65a7de846e3b81eecc13cbe0b67a6594f9e23c9e97e1b94a0011937c90b6e8bfac2d50e093b28c26ee35d5932b3fd802936cf6d4cd0a9f9ec55896a766eaeb7a1ff09a358c29b3a235675be2106ccb3b2159827b8165c412e7bf97dbfbc0c35b2bd075a18673b6a587d0539c402", "6a6352ac5353", 0, -82554638, "e264cbc7af2aeed77741e52925b9583406bbd280b48b8f37c794833449792d02"], - ["6444e0ba01f122dcebc01a378548f5ff3612feb286831f5b7df7ed5989577b6fcafcab8933030000000753516553ac5265df5af14901fb1983050000000005536565635100000000", "6565516a6a0065656a", 0, 1013967395, "f708753ba3ff589f03bde341fdc47a34a1463d8bb3bbd24a7b4d752ac860f06b"], - ["f83342dd0111eb06331f754c74c48c9a5b3de873fc514c14e18b2926b19203b2978111816d0200000000c7d35b3203b95729040000000004656aac51d924890400000000003ccd7b0200000000026a53feb8ef2a", "52", 0, 1860359320, "c4ec322d92b3198201cbb43e7e1e142d2528b3fa8bdb5301a3d77210de22f906"], - ["fd42002604dda956fef1d0af0229229dcad217d84cf180dd18fb1dc0cc1c5cf6104f03eb2f030000000865005363636365659cf191bd8c0ac6d1f5901cee8b2dff9403ff39c5c8ea238e60be80326ca8e7a44d5a41da0100000001ab159937cd2cbc8b5fd7b627e0d4377e7e32d36c9298ff452ff15570bd40fc7f66c8dc1d0c000000000751abab6353ab63ffffffff9dbe63265c9c65e23b10e88178c2c9dfc5ad967a6d3b83a5474f910589d305df01000000025363b03fce610325090e020000000000d2e6e6000000000003656351c215ad02000000000852656a6300ab536a118e2ca402bc0f050200000000000000000000000080a07f3b988af3e367374ea12f68ae62b23da30f73798892eaf7c129da41a091bb0cc03c03853a42accdc206629e5ba63c66f6f045d3357575352e1d23fe4728fbd0b8def631c375bc1048301b3c407e5c4d4d94a0797b9ab2a9d890298063220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030aa7371ffa104f819fd501a5d3825ab39614d5bcec450c91c7d27992266d1dd48e60f2b5bce1c6199fc293bcc337f270d7f057d5d0317900cb85136ed241cabd181be70b7da56f944ecc4a779c8913d01cd80db3fd9167799119a5af10f02671aed549473f50bb09eef56efa5e32b8c42d94e066360d00f750dca491b657673022ba16dabb677e78efaabf3424b6489a5cde91226a6b82a3586c5976a32559737022a338ae7b7959ab10bc410ecd8bc13e65b8fcd28ab853bcdbbbad024ff34e8b30a047214eae7ce2e3362cfcb98f6f4a4ccd3d826957f44aab43163ff04761817850a684f42a97a19702622150572eded3468dd0a64b8bd06859794008b20ae17910210ed44e0b1e990b9b9afbb1a02a3064a28d4743b740579e96278d57a3a5bb2a8021378c6892ea292d6576c489e8084deb603cb8d70be5047c2142504f4ef230e5d0223a6e90dee2f051d4432f8332a52eccc8bf12e180e3dd29e4ae20a31165986df0300b58a571d445ad5268969857b03a222867470312fbfb3f78bec03b0fc7ba68d020fe482de6396bb2b63db9dadfa419b26d1acdb0d5079ff6996da0c512d3545e32711c4906b5dfda13fd10dc91fe6bf4434bf555e01b37761ebb11ef52cb644622ad33ab49adfee748542aa8d6e34a9c14d43f7526e0a734b1bc987a5c7b1192c661150a7cb48f47092f11396065e8e857f2e53f877d55ef7ba6ae97f91aac3802e2afac32b476e20935a0ee2e73f4413c34be60b3aac231a4e692931a2c1dfaf3c96de1284842a0bb418fa79c8d5721212983a072f942e3a8e4aa49246c5ecdfee7832f508a8cd3fefb3e529a9db9e73d8fcddeeef9cf773462fd6613de196e6e2b4f61b98ee08b52b59a54bf448ac9f4042afd2194dfbfcbe462786e852c2f411c32a7e4ad13454e273d28f83994886a48965a1750cf5fef3c5dc2565dcf2f04aee67451b2c9552ffb446853d1764269b3769646acd475bd17b79b81df9632a79eaabc1c299b1711b4aa0e9f8054b28fbd9cd63a1befe5604a0351c79abb0cfb3af58d0e5f84d08c0af7aed45e2b7bf22fdb82c98f381510be4476119306e8f6bd7493c25dbfc8adb7ea7cc7f5b89620c72548ceb2d58dfcf4b4001b5b50d8dfa777e3d055da1ed323dfb41bcaa7a9c1af1ff38f3958954cbb87b60f7c2a4834f9aebb9f2353fad7ba21b2c451b53e1536237a07348cce6c78331e66741cfdae40bf101825d340730de698516cbdced78dfb45cde15b89d3da6ccace0393e517c7bcfff802fad1ac588bc402aaf02e6184f31480dec42e70fdac455becf014c365418b33f2c776c4b88681fb16e167889b61ca3256b710b2acb864113cc8a0fc0af73cec944b6d5a01562e1cd3a59c421d8054b5209aaedab7287a4ea2b233e83cfb71014a6d8e8345bf8b9b3fb355eb3a4a2ae0bd8e350d0f28b79c96e9c3f4f688208ff724a221d7137328658a3d398d9ef2e591eddeed28eaf2c80afa59ce12a106780d3b40d0e534481e03c1d49575b2b29c5b3c9424cb9f9655925cbaa8739417e1fec647bb279684566937348e1a91d0dd6b15884018dd2108dd1e2cb4734536e56c86ab90ef79cbc7a7930028a027f5a43b08f00767bf8e5bf96ded88d30613099f7a6b8039f8b8837affc64b878f302d2e01e7bc3edadc04b3395855d50402c10f73a04db2232daa2b04b770cdaab138c1999ad4ba4cb56429f1c4c81b5d65328b463832c345a5c0c49f3ab8bd4544de21505fc1f4f4cb368b4cb0e805766441264af46d2e45378fab422efc916be317009d75a87735638c164ade7714b51812006801d8f4e8e06a6eaa7d38e8429136beb570cfd91586b7cd5c69ee9ee6edec9a76144da653d4729e32d28c38071aaad62ebfea88be295dbcd77b9d844b9f8b6a2bf82aa1f3479d5ceb468f2d9a399311453c29d397649dfc9f7627bbb0c6cef7bee3c20dbd4ba3fed36805da5f0424d8bb908c4e31f5af93cbaf20860a3d1eed4d0635261eb88c6cf1b6e5940b0e29f122893f7658da82c1e989d29430e22b4f306bf88b00723aa18dd7999bfab94d307c7f0dbf5427acf46ae14fb20721c7e8313a86083fd5880dc239a5055ea7d95f82b4a252c7c297e4f7fd56f29af5a209c0e28f9546299834cda791c0152ad6ad2178daa21d0ad10f14603646f26b814f32ebbd8bc8df12310dbc7a99d156ddb15edb60cdf9f1d8bd6769a129d9822e99b37e643889fbd32adaba74cc7010726024c97e8545303dba084143d27bcd600f216ac03bd2cf327830f4ec423cb942e00000000000000000000000000947c5ee9041afb5cb791e3df2921b4e7cf4ac0a0a849d40f2ddf7d0cb0fae9be0ae2dfe457c5c98e982aa301ae047d93e1127e2359dfd608cc9aa53dbf658bfa1e948adba4cccd02873363889f0093c896ccbbe4262d84dc513b4221632d141d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a95ef668963b501414c00fee6c900df027ee6c72e8680fc4d5d0d50754d1438d39ea515f07eecc31f36f815507161df435dc8d7dc52438ac1b099c27a99a4565c3b63798f1d590fbc8aff70184607950607254ab38b0515f256bd1e3993fec3abef4edc60aef2f7d2ba777864406e6b46a9c328798bfa3a044dcb6f291aefc0301c616d2493b9b028b6b6eccba59fd313cf25f6463b68dd34432f8ce0d4cca29030d12c56ab92c8386114b3936fd87eeacb30f078a4edc303a26a8b8cdee6056400a013471c9f9ceb83bb91d1b6cdbaf4261330dcf8f2ccfffb6de9fee16018662df086e2c6651c44700ad1f6c8458cca448ec7ed431d194d47200d604a0fb06feb9030dda8d7aa81d6cfd1e08d9724c71b0aed4988552d4ffab4749ebf1972fbce259022a4820e678f9d34ba54b0bd3d583295286c8fb7d76ec7eb85669375085d25c8803225bbae7724ddd6cd9343f016bedf0254e1694e1c4278cb577d5beba2db9a432030961bb367a0edaacc01090d34acfb468828538c20910d6b20dfb45196bc1fe990216eae1c2164a44b05a536703c3d8bee97556163df40f95e1dd6a42abb8089a10acdfc64b629f5a0812b9bac61ef70db4a1d14081e4ec2e332e620ac0fc3a0a54ca4d290ffd71bbf5125392ae16fb0f94f4f09a9d88d0432ef98cc528c77c77ce100007afd314882a0b8de95e135141c887e9471c97acc98bd7b44ed4aa2dda18c2df75ed751f4c5f51dec7286f8e39d009746559d570a9674f6c21794cc04140bdb37fee30d77a6eace1938fc0947666fbf84c02117b010df99f0e61296b4ed2ec86d6c81e38fdffbb97115e399fb366ca68b4b2f719e5e96c6f60933a5bf6aff9f5447780ce5a14d471ab62d7750108ed5403bdc499bb6537c31a4531f10bfa1af197be3fde59fe1e924cd376c512f8643c840c805f62e1857946d8097dc831a96e8adb40c8db8f54e1a03757bd051e074b1f43ee703bc5a2978a2050d7fc6f78abe240cb04d6f5220cd7bab6778abe8d606c6bdd46556dbb71166f43bd3a81bf4e2865abf8f4cad102f56c20b2248d1fbfa0c47fe935c6956101a6d523cbc0e389a715fb2463e9cbc1cc6936cf5f41815c8809d76eb3cd298b7491f542860eda711996c4bc0d1720c15f6e653abb4ee94ed4c9fd4166ff4c5a9b08e343421b2982183510cd242befb546c807e6aae93423aef3484c82be28bbfea47ed2fc7b32f9cc8e61f359c6b5015e74437dac1b7c011de7508a62e81a3c24fbfdc4f65911771c61c54f5c27f243f4d700cee016d8ca1aab22b9db1fab29eefa6025e6342725e2ba94aa2e40d8bc84d9db974c9b2ac4f314ed554c1d612b46bde4f85a81bb104232c60730e8f3646e70b29131d155500b74585b978fdc9c9ae1b951bbfd0655104a6db230bd4a85259279098b435d4c91777cd748e31504bdda69f38f0ada1620f2f10322e704d94dd33fd61101e80e9c0a137e95ad5d5552cce521001978a85cf2c0f781a476ef8a311aa54484099b34e47a37f62018fd41fc6f5b46c1b7a479c12e86ea440ec1424401db7442e0c98fba7baa5059b98d9b7dcab2dc84944d0e719ccecb1e2d5e1d61598755446de261ca3909b2145c7fc09d51a0b8c8603c3d828d19d5e78ca3e9a5127dfc0d94f06a5f2ddeb52a7e25798bd6d89c78f11e1caa3a5df8a27757a5d26a4ae6073b041cd6c9db3a7e094bdd6302310208650000712bf1dac3688c8656e336195e16e17f7b51f4a729e8e0b654416a3273dd4e1c6806b031cf77e2acf374a0e04ad7941146dc409e02839a5cff26e1a29863e27c7a55526aa16cc6893866a7d4642baec1c1d3aefba0405e831523317c2bf76f9d98712eba715159e0fc0a8768a46f1fc9caaef1184f3d512762ee120522593276f0fa062461bc41079e58b6261cfab21e766727b8075b3dea8dcace79dc3ef3676e3322691c9784024278b548bf5aa82b67146ba9cef42048ea92f4964c8f463e2780df53eec5e74cce4c72e60e6a137b37dbc49a7da493e3bc02e689b4cf3f5ebb1eb5839b0f33870ed7c94724dda5dced0e866f491850325b8ea84a7d7a0780fb2493619b5e6116c917896d5af87f0236dde936011b85541d1d107595f93ef8c1946c587323b7f985c09f2dba0f4f0ed0cc58dd9b8e50972134a1a749fe6f65d902092860d916ca0c2e6026ea3658fbef095529186a5b471f0c4a78e8b0c24705d8b0ff1965dd33ad9e0db7fb9dc45930311f29726f6aaf1b223200a6009aae084524f1cd7353badac0c15c43ea57c966acfaa440ca710f4d45207a318b9bf734425227f437652ae3733c07aab849257afd82fcaf3a50f90cec9c86f7f64ecdb9df7e95e05a1bd9faba4f4ccff3dd3cc628cad4ee07ac7a547e0e5885ab51c131d76b6bc9c5d6216b7ada9be82402", "63", 3, 1199084511, "edf9af713d143d096a702b08d9832b287f183fb4a2d90d014d60eba7f1474aa1"], - ["6463ce6e02e9d996b8fac84aea4a44af3c64ca46a2c4c5f4f05836af09380f46236abf0d2003000000026300ffffffff0849e30ed29afff540a7f504e4bf0e83cdcc32fde550d05474dea58d474d046900000000000d48dcc9042378300200000000015321a2f800000000000365ac63d7eb380500000000065251ab5100514258120000000000056a006a5151000000000300000000000000002c8e3901000000006b17a6f8eb67175d7e28215fdfad7946e921c6ee3779d67ed30934cb318d229010808385b0f7fd503371b9b7e4f526e30ac7d621c6034e5a62cda83bf8e2a2fa4adfcb593346bd72a90a48998e4b5a3d5c4b85f9dbd3578d53ca2a16d6e3a84400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000862994269f9c33efd088e6f52f6c2fbd6f304ebec24622cb389031e2f443d2ecceb1a1ccecf10bd83a9e5bb04fa608cfa0b1f2c9ad8c337f0ac5fa2498be75ebea203bdf586ad13804a9324794a0842a2d1b7022fa30d741c4b27864f7a384a531f4245a6ea0d8331a2417de612d42c155bebc6b6f4c3fee28b835cff61cfd11032494da34cf098fc0ac4945d711e0a12c16c81cb78882a7f5ffedfd0e68fd945b020d90a0f6cd365343bbab6359c7c9b170029743d84418881a0ef6336f4b49768a0a243d6c0058d6603d9f5cadf6fd348a10b5e6afd4b0265209d4f2a8f917a1ee81137c30f8943b83e43ecb04484e690222c2e8fde4f14d67ee1e6b1cd0eabc49b5032fdbd1c440a12b59b88fc9b3bc1448a6bc36aa090eb2c45d89b7040e9f94f82203279556cf4a800aa2e70a2a531feb52f6d8700093eb58130cb01d1ccad73ab277032362c9143938888833621e23f03fd3e691ccbaa95e899ee41ed0b6c34344d377020132625a577d446102fe06b7466a451cff3a86ca890b7d4fdf07e56c990f2429022c4947b4a9a32fb8ab88f2340a3d7d55b3ede79966c6ce40ecbba2b05910443d7f8a09b075ee1f4ec351b55090bd93018e5238fcb6d787db62ef167eb2f01e5ae3d68ab66568b1e929558c05a5449694cf083ffa59c52d57dc83349ac33756689b6f65cda5ab9f5fdc3b0221ddda6cf42e95f8a4abc0998f13bbe8de74f74cd08d4e57fad1d65b3ab9f719add259945d4c3be7162796db05f4f7b086a393f06778a65b8e2ef5cc7c945419cbd6013e16910f4c856bb97eeef3bf1fc18dbd36183d8b321305cee17270cd068962a4e22ef81487dfc22e87d0653bca3c2a0ef1d6f0db9d008a9fcfac0e4a062e2db95cca0cfa49fcb58dbfcf766c4719079d69792d7e5ea4580de13328fa0482759659046891b873ab469df34023079ba5b827382100736b8de5555ea9cd556ca8d2ebca48a45d6d3244e47616849d39cecdfe292fc4aacd2165ba3f62a3dd3d29adf251fa6f41195734d3fc7e76575d2e26de2a1084fde7d9a20a40891b647342ada9bad2749901850e5e224be4bc55662f407df90eabae544e7e7fca3731164426376f2c06a8a966dba8b668c5d01e6759da1d1dbc159cbf02b2a94db94b30eead2c32ec7c4f75756747f69d265dd86c743e9680f987970900c97fdb2001ea0dca2ae10b3b19c546144d3de8cd64dafe286adb7c4ce4d44259bbb100b09b2a223456d935f00b0f2beb2a356233078c5e28eb601907bbde3f22bd17dd58eb434bc7b6a2de0992d2e11a47ab803fd65f99f2b7c171c1a3f1c84b37af921ed9267d92f4242f8442aaff0909379b5287077c9bc91f214ab9c7fd7f4fa4e415a3a08253fa409559c46eaf09b7fd1a069e3e6c3f07c65a00a2d539c7f435ab1e94a994ff6829c6bba1e30fc863629faaab608a6d8b7587cf76ede132fc19221dc3487381e5086cb36467e75989b7c99f59b546f20c62ab278801f0fcfc6bbf1f9431bdbbdfc768c37703d7e654d4d114fd661a6864e943f78593b558d32ba543704ad0636203a37514da0a01076febdc9615e0c3709cd8b7de9a10cdfc5a455f66644aee1e999de094a578f037e063c2c528b23ecc8b7d9f6a81e46f1d0822f077509228ca4cf42729d404f123f194ac7180834c866eae38076599ae0c14563a32d70687bec65089f652384cc101e5ae10ff932b60c0d238034bcc0dbda4e4814f001328f6e8fa7cec0159b21870cbb6d74a07b86a00262621910ca5fa23b16edf201a15658b74dc7377aba3df38460b426078177c805f1fce884c805599b45f3c9d29e5f57f05a0db29dad53f99d513f578113097297b10cbc9a2a66d3b0cee80d94e7157629fbd319481c90e0a69833dd211d6cb47426cfd729e9f1095bf469082ff910a873e7d0f3adbb6ea875823bd5dc5c7dc1d23706f14f26bae2f332e46449c449997b04852d1b6b83c5e7794fe51ed4ef066bd8d344b507587a9d25c91eaaf5b098983c93ada9c5c3055d894d119750c7dff25ff4fc4aa33c85f4cdf9c79be3f747228a19ef13d257ab4404e44be2ee8a8fcc095951aa0b584ed600749d7a6c5efd96b4d24b7767308c41c0e9d1751ec04fc5b28830aec646d0b982c5c225e8fe705d1d5c66976f17f25adcb1e31c9cd0985eb4bc16d7e6ae19d73aeb908f803b46d7de054771d24264345306202b1e2f6b72202de734bc843db81b6d98fddfe46ed0a116e653dda5ff988b1d7796658c635ede48e223733c55cd07d7c666bb20617bcd70000000000000000c1d8060400000000b2c6c385a7ac1b3e811877fdf9b7445bacba0b0762f26b60861753cbb428d6db58ef529d1168f8542b89959da828591044213a16a21dab68fea0e2f6fb0fd76b4d05a6b3fbf1d593864441377b377aaad7263b03adb4504363e0a50f74981a1200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b26a1e2b09c03a6fcbf9754ba07e909a648c34fb78938740f006e96e2e08065ceaf7409083dbb5b6993dc2e1a7af47258bf826a23599002b4eca2557412edf7f719cea45964e6e23a7b5effe12d014795012846c599b19fb7f6608314e2e16c5b4d7ac7cce33c9785957f80e0eb3cb8460599351eee124d69f6a23816f46c7630225d325d89c2cf3ca718b5e4f48235f279c02041f4deb9d1e845b5798a657549702087cf0121e8915a2840434f8ce1ce44381d186d2437976bac45629a7d8b326ff0a2f69386ef4ce4c9d668af30f99a6b123faf0be5bb554e81dcfd3bf203a06710823f8d0646554132d866836b2a893f974db7ab00b78a35194796b2d0558c8ef7f021817ef778393dcc3be8d4d47265995b7ada64a95073eb659b657f50c6a86b01303083f1767ca1462acadccf1d1f58ee24efca5c6e2630fc47fc1ee92d76d4c99340320aed09739bb70affed825ee5dd07698961ccc961791e0dd7b50d2d3bc9ad38c022fc04201bc7df3309e87b8ed8f4e90b5553e791b8fa3c9ab49429b201d498e5702301ec466e455334d826c7edfc4db7ab8c33ab00ed9f8c8d7106db78275e0b683b81e176578da6d6a632256cb047081d00c4b35c3dffd62f044a58d91d8edbabed9fc263c4727b6ff49c21263165fe7e27e0ba42bfda1c0af4d91d2969bb01fa1cd72ea5dc37fc0c55fb632a8ba893ccba9e4062fca606c0b910934f1da70a24f0ffeb9e540eee2000608bac086b8372304e663bc924d4ec1f599b72a1307458c78ef85c0e14e69d0371110bc6a1093fbce3f8b166993058b9f2d50f384f4a13f2318f59e0c341a3ff03905b8cdf694193f792ec941e6e22e0b737e8fe08d4335bfbe5a3f4c550a3aa3a8acb78c54c17728670490b1ea7a72faa7a6168393268aaad198dabf3707db3fdb5a1e2f32886a1afae666b5a7faa67ffcb862b6f64141b384dcda7e4e778c89aebab97c849ec5f04eb6e59cae1b5ed37b803310363f3f50e0b40d4e7a94ce54c95da0fbb402975cf7a534cc36cf2c94c7a4eae2f932bfe856e036b4a6900ce55b9ae048a0b7809c7bedf5c9df474b83b2193d752600dee3877697be154a29d2a52ab5bc16595c942c59fca757b88fb0c797591048ea0beec29b5bbe23885261a0556e1c5301a32dc5bacbc6cdc7db0b6eedba4ec2ab862ae91a8d2655d99f484e790cdd3ddba55f5f41f049c0bf797ed58732d999b68f26ba52d2d3e1be7e8667506c936db25b90a9cbfc260e0120bb6266f7d465dc7648b3ad0caffa7cddb83cfc6b082a75b1284c9ad646e80a21c572cfbd98a5ed60e93736c29fac0a8b6d99fb150b2f1d0785fec0f83282b38426d90b6903172d2441e01f41127aae4610083e4c923ded35f51342252acaef99caf8f586c9861f62e9105416bd0f2747b4d1411130b8eeaa5a33ad4440667fbf0886d26b5e56aff9e04ecef7ba37d0af283eba511caaab56cf2180def5f4f12796dd348dd5f4d62dd2a685238d4712fa04efce7c8afd79b4b48d83e4828713142f83edc7f8bbd6f98ba6c14a8a9edf2db27edf99f807276cb54dc614b90f93ae4783b8c346ff17e53dff8cbd648b4b6e922b55ad73e0618cd3bbf9329db18896461baecc459452cd521fb797faf45b3f0f697373b0c6a64e1a97b4c70bed99713491edcbedc85b37e7bfeb236c30438ff49e3cd1871ef462ea11e389913c9ba4fd9f5c8e2b9299657cfeaee068ad32d83adbcec71724d99d8834c9ad47db84d595c304de25f1223233519c184ebf92f3286bb16e8b13d55946a84789643d4c456e478f5f19b241b6168c9b028a5e06c65337319d27c3771b88bd2de323d1966b176e832cea71c74c566f3cb22b5c7a4a511c0f31f4592633db52fb0e2ee65b51c43903d834c4ea7497273bce80a3861e561162a6b43787305b45d257bc9df91d0f1dad4b3ca42248424d081f76a9d3e543ccfa27c201b58242a4db6bf0720fdd5a88c9dad9d5bb491abdb1c2fdcffd2363188f29ecee10b29e96523331eb2cc330f9f70b6877ca8175995daf96396e74f7582905f036c0f10d2ab3a2bd9d5a777725aaeb5605834f9b7db7101dc290619573ac4d9c171491bc5dc791bf42ec9afd3bea0e5287124b87da542b26dc1a3c286b41dbc72a72e48197b2629da1878db13059c67cf9369704a945d740598fc5cad0ba3bd853ee03ad76c50d5ddee59b03b71ca02aa7119b37524db7c76732be5f76ce87984c91312e6d481e84ad64017c7764d3b7e68c10b2a67cd7b67df383bc3f64c13e59c10f76cb0000000000000000a4328a02000000001fe13c5c19f8629bc40bd568d81c38edc54cf042963c76f2259c31badc69a83c1ca147bf62c13d8bf896cd744184c5a0008f9502b8a07b23212aa694fe237894b6365c94673bd7c91cde5d3802a7a585c261efba18e2940388d9a95f4e09395e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005f15c05bac924950a36bdbcf6aaee63837231da5896622b1d342867685bedb20af666cb4e4fe650b1691b2de893955bb998eeab33e004b756e143116deac6db3b9fe6e3a31c521e74535c400d15419c1644a12fa671b1df2f0c3c010bbb0d3f52497980372447fdad3311db2e06eca61cd7169b0f7a38ce13e4d8fc00a90efbf031cc360246c6525962ccf039ab93a45a1c54316056e090efe6cb27817806fdc5b032bb6bf02fc786f7264c994948f095aa63da37768562f6b7c4edc245bad98bc960a19b792f0e2715a2b6ff9c5d145967deb3b3ffd6c62a848465bf132df505bb991198e6dc0b27bb71d7a3ff9623f662e90264b77504b05e25cd3d79098b90c9a90032494346bf833eeb0e78cbe131e8b1fbdae381eb76862c4e9cd48ce1c4282f5ed031dacf0958eb5524d2a7b57e5b64de98bbbe3be7425b166eb6d8b3d9324d7152403253e9d8ec80855938ca33dcb17a189d9d44c50399e5a8cc1e6ca2ec4f603f44f03073d0e4e1e9c665dc4304265bc61ef7f2b2e500e43edfbcb1ca877050d920a4f03161f2c70b9488951b624ec4d6c3b656f04d95627503e7d23858bb022771a6597bdb0663f62eb7c051b396293ab06f43689560a86d4c4b87697796436feb962ff4864023d2436a9069865fb66f79dbc2a0a5cd3ee03077fd63eeeee01d1ea7af61535b2ed322a6368f654a9bb41357397c429bb3d3b9444cd34b2d3c2a250c07ac19cc01dee5fbb76b28d871f0d6da2b6d574264f25a323cc00611c10f2e90301e92f33ac2a4d4bcc28ee8776fcff992e02e6e92f0edb27e7defa69ca8462f29af4a633fb767c3d59b53053ac743f24ab5deb3162776df65598201cc7920c8de2759bd40e80e6e579c67015fd29bede45c5501405c3d935e311eb8fb7841f7dd06bae4c89582522a3628d071769f7977686dca0b63c78700922e0e0c092d92e2dc56d7420528fe38eee4b663fa03f80d2eedb2537098d1ab9a57c1bbf8bdc8e2a10b5d1865b7a443d189f8aaa9f74a8d6fef16bb277c1c8cd063a272b509a6fc76e3c48cf68adbde03bfec75900cb3db44bc9dbd6e620c8605e3e0046b14e767066739b29f37d6b644b0345b2733e2960874ef8ce615d76cec178426960ffcd194303f4071023616a4ae45cc97033dacd23c87a8c12ee1b897e57f2add27e73448c3c6d4e571b5e89d2317beba1d1c9c5ee1ccd44ce0afb6c7915654d86048144173e40253d82fb6455c482bb6e20264c8496afb0ff7055b7bfd5e945148146553b73c640274b01f5c8bae40894c005935de9a661c9b3be353f2be49eeefcc76dd2916d0ece479fb7fe93fcb287b0b213d015a9d3673612335a4f241bdf1fa2ba8034b91b838fe5533747138bfc53e359f98ac51edf7145bce9ce50dd8ae3edd205579d55ddced275643819c0edb5a3ba939b186f790731835070d11b1fe61c368d0613b2899f8dc1db320a62739471841f9bd7ed5af5238fa7241e30f4cbcac2fb916fb57c3c5d696f6a92df0b8653146e43510d92495f9bb8a705510a6b865cc629cdb3596b90f8246ec77e8fb81bab6b5b1a7ecc376d3cfed3bf2f603543c72c874485a41d8e4b046448daf3182256f24e82a3636a0c5dae41a346808e7426d5365ee171e4511a3470e6bd7b66ba2c0c38e20bd7d17614dd336413fc427f3defa47198afcde98891376d46c44453b3682f357196ac80d93ef02e46f844a312ba05094e32b405fad857b3d35e5b1a75673cd55d40683b0382310fb067a46bd0bf5a5f5e4a8bdef26579a99ba9719fd73a362c7e3ce3397b4c2b06119330cd05e65154491d33445d8f44652bd14d643a42a924cc0366777094f29ee2c40737d760d323b9f75d391712fb71d1e4637be0c59841086d0b131f9275482424398638a71ed7d8b2a0e0fdf596a50045a507a1d56ddf909a73b27bdf4b7ded57c898e4e0667a85fb926b0b87eda2d5ae260f4d09bc2bb0c15b3237327a1f1e15da97f4af0529a102f995b7abdca3f5d1d8ff64b673c7ebc6280a7ee034b47f105c934afa52d540bd9463a65e824b3e6962f956f5c0091b9af9c054d1ff395569f2f3958ef6639cb716d247cf97f73bd74fd96abfb8f85b7197104be081c5455bb94839e990a829097e96ec95e315b24f7a915f338c974c958572f1b146a7c16322322b5ef1780cd8bf8a5bc5bdb155fa3a5bfaf3b540dc18f90e39d94c088aa0483deae8f247f10416dcb495d69e2e4ef476db4adcee99e67f9072d2eb168191942cb00f7f26a8ac8854ecddee2298cf7c4d4f468baf484246f4dcfbbd885b865b1911017a07498dda21914a3b4ff49cbfb56434d28216d7b53872619763aa6b7e600afea67850d729c759f11a828f54bb3d5aa3c9d4b452dd96b94fca6843e5f2b027922252d218cebca5ddf50adf3e82f1be1b05", "ac5151", 1, -1726989944, "080dc8a9eb240b13bbcb4b6517ca75db04b4b125acb09fe1f6b6021789f392d9"], - ["542e0b5601e10e4d571ca155db82510b56bef90f9218470115a710a3bf9b737f851983ccc20200000002ac009b3f3313027eab0d000000000001ac8905ca0300000000046a5151510000000000", "", 0, -290389119, "eb65ee9dc7f73e05bcd9724c7054046c65c7690436853e784d9ea8cb7f86f15f"], - ["7ef28558030f4816a8cf2ce28776246dcb4d2841f8ebd15e95a859655f34bc76306d14349200000000066a535200536578485d14488dd71c97cbde9f60f923d9ca7600b5f7dc361c37b0434e32593d6da4a1b39b030000000452656300dcea2a44894cacaee08bb793b9f85259b682caed4d3bcd084d7ded66bd17bc090a5b815503000000076a526a6365006affffffff03e8d8b1000000000001650791fb040000000006acac636563006ea5bf04000000000351ab520000000002bec5db0500000000000000000000000073081868e00ec06098788390e1698139c275da042cca454de1b4d0e2f3b4ebbdab8883416162dbaa50a838127dc99604a9e2718844bdbe8e9f76e763b273ab58d20a3c6dc8452d5af014cb26741eeda65c652f05a1ed3d91c378133a2506de41000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009192ed1edfcc855b669938cf7d43d81e3a3b700a3b96c44b57040f6b0d044f23f50ae1ce6fd97b0be29ed545ad9814430dbca5ce23b63143453ea99b99cd90f9e9e980a513d559ddc36c699cb1315df185ae810359473bf6aad1d1a162a4309862eeca9c65d5180ab790dd18e3dc9c02b48b3149bf972e96b007b2d331077dd00228cfae77f5844603c0082d7589def8be11293514b481f561b82491939c5befd10318bb215bfd3aeb8d5b6e687f6cdcbf88c9c53b87954f404e8762aeb4a2ef87480a28886b43fcdeb8505fef386ac02d07c2da9ba04180f5b3532f494dc9ad78aa3c2831b03ce4b2afb3070004a012cad889547853e4eb5f5a98ae24b1d714d54d43021d10c3a71ce98453323f0d79775a96368fdb11827fbd9e697c5946176a7f847c0317731cbf069632814f785b6366b357ea45c54493e3b2aeca197d36a326ac42fd022cbb4c49983ee9b9729efa7879c0ebf380b9da12a7afa70e53bc28e95b0a247903213d4281eae1c87ef489a842452567acb09dcbea7ba46d054d134387ba3be6900206adf24fcea71bb8505244d87a65a6b7202d0c28b8a6c0f5c1f2f5e41303a7850851266cf2e6caea457f4a58879076c7fe28f36e4da7c2e65cd6b7a5056fef9ce11df95828836bc8460c46dcd8a3ef3d4f0138b2502323f466b2a2323a8d1cbae9535353264fca9e34e9ee1f8a47ddcb951eb9f378c1c2033dac4f40bcfd53c08e711a0ee39ef57957167e49b83449b95babaa88b0cf64ce8d9b843aa652bf2260cdc6550d9fb93e5eaeb902a6c05f962cd19741d822f204ddd1837a4f7d01a7afaede06c9251f36cc5bdcc00e4e2c00379f89c1ed01e1f3a93e4498706d1eb99ee5c9e515d7b9f8bc4d6fedc65b8e2ffda20a86dfb8dbdfa8b1cf7803950d1fd7209c04822aa4df65822bd8b1a66d7b14830922a76ba9f957b3032d3eae14bcf3995598a48be5a315bb099eac11a34c7e0a451224591cdb8536b778ed61ed81f2933b89e8aeb54fadd0aae255511f83f2102dc0dac5eacde259f38ec7545d0af566a8441b0074f7800903ab678abe4e7819f4da413d9c5c660dcac7e4cc86f40e21ca1513def9108cc7b60a82ede9624f84b3b0bb07c4f8fd19f777cecaef7ca0941ff97f5e443f02c906cd1eafd6353426e0cff3f5925ad9e2ed54825242756660f1acf26cb05c800d9eefb9113ac5d72b6e12a98c676f227345caf33ece14b7ee682d5e92e0c5b73df78a619d8fee6da4e3bb2a96b6d81c260429ac7f56fa76c833fbc3af4473858219030d479eb84b0840f4a790b1988258430604425e1f6b12e3532b81fd7800a25f00a2941e349649c1434c16276bd57fc86a6ed7ea7c1f1d678bbebc07ffce92d9280e546a12d5f9016600a641143efbb30cd8607c2f8c442e8353866b21ad19f3356f4448d0b103bc1bf39f8826aa4d3e61615afafd0e2ae0ad390919be30315807525746e31b3f0a1bbe45bca1b84ea07179ad0fbe217a1b99adee144d7291bcde4971952a4870fa13a485817ca7f1ce14606d91ffbae20b71befbda1fc2ef313e056595c0b073c345a7b5e65cca1776882c3289db92c387576f82b448582fb686efeb9162eddf2b92e85381b91fb95ba99d11fd3ab0496dded7eea7a2e33adde399113f7ac3938b276af51559b5fe33cc9f4f17a166b3e3651a83cd811036e5310023bbd2fd96ab803ee615b510957926afd529556ed6623479daea580a852bef7f6d1ee220417895ad815aebcfea0a39ba6c3b8859857b60822610082e76dffe19e189718c4575662647eda8831b136429ad046be6f94f99b3c9763ab40b4a9876ddc44ea1daae923ae69bfb6dcd1b4e097301d60a16464368d9790b5a38c960911086a2343dfd3eaae0d61989c10bce24e992f1bcf595376a0fa0dc0699fd56511f7dff3b21c60678037346d57b3c936021fdc5b906420aec9fa9bbee98edd896a25b4f12615ff7e0a832ef74b5cdb822d01896c84010fcb99bc7c7ea8a420459254460c97793962f7883344b9b11d7377d91d5956c5cece3c6be38d44f8bf179dac1678f51bf1177fbc8d5d209980fe29381fef36b52f896cbcf0248a5690572a752bf3b4c6d3a612721278ec3a0c9c277c16287d531c73095c94ba3e5652fc01544ad04a223585485dbaf9ee018f588067f9bc15926dfbcf31dedbd353425f1f0f72717c3714e402602a6535957866463f50bcad84b10f916bb28999da557a2ffa6eb668eee2b0f8593c5ac612847e6821c71fa946768340e09c793b503a2f753af0fb7260000000000000000be90b30500000000e32e2a9783b710b8c1bfac22fafa21ead92229ebef219c6ea411655d4251bea8cd9fa786711b8d61713c88d7167a1e41ae24e4250285c7d46ac41da9ddefb12466bb1b1a2bf008b186f6492f0119e9fd1a4e4f380de456489dbf4f35c5579b950000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b81023016e864b05a03819d04198b70bba6e2dd1dcfdacae24200034cf82613f66468c5a563b2b92b4e447e74614cefe3213a68d587d2ce3bf84beb4b68c291e9e02e75ad67fb38e7a0551c527e0be4e1ab9e6d0c2e798d8ba00a0409fe7534bb6c2e006a13cb7d62f9012b25bfe34344f54926617b226f0236cf21ef39093020611622cbc8162d19e2e674195e1619441494fbcf802ef01b49050c9c20e82060222b106751799db84268a7548bf640e44c5f47c23de92618cc6805658f7524f3d0a0f3fbd7387269c7309a7ebbec0a98f1f7dd99747d72339ef8b9d1f304942341408a901641b2fa58ece65ebd80c316839b1b8307908f4d00544f9c46884a2b95c02285bd2bf2a7a3b975f5b3b8d74a2903d285f2e8ca8982444d98dd0310a73e51e0315cdfd95c23960bc472e77f1a6b62c8a8a9ee5db3f368ca452c9f67c546323fb021cd7b937bb62be123176311f08ef5422fef56be596a3f935f5d7c71ce70a45680305853fe0da697f79956a51510ee985126d1479be99798194174fa6b6193909c7030629c1de6bdf2a1e71d5cc5385d3002e9aedb77777ac4f6fe087a14dc3e277c0236e764e3d137828adc248611348e271801167434c30b2a083dcc87c143e6de3d00b27f3aae418fa0fc70bf6dbdb0c617b9c278c46f92daa329b79aeca4a2a497ca29b644d51b1a8d552036e286ab80043710cb4ed91aff667718b50b2d2a1760b826931ba4a9c09b25af19d79e62a3befd96d4ca96f8531819fba4466d1b61b3e5eb0e9441792ff7d7db57b64eaa8eb77a73e8c5527b8c28483dffbe97c14d9cdb10a63e7218f43efce2fc8f10e5cf11628f87619ae55fe464716fdefb52d3f7d65369307dbae93cb37d571a80536a9fe07d4184d44c7167cb27fe9f40503ceb0a248959c0c760dc326dc8a18124de4993ae316d6730d2240f43aea503f9780622e1bef4bdad926226f8d8abf8e4b925083d5d9a9113c960a7ac880b2035be514f42d68be4a8c442da7d2573ca7f52b122b15596ffbd123f2b0136d0e172c260466db6b54e58d5c5dc8e720c9326408d0bdd3551ccd92e454c26110b335915189d826642a0fb872de4c05c882affb3954367526cc7c5f92c53bd6ae8779dccc92b42215b6fd2a75f3eb2b42f074dce9f015fd119657bb307d47c9d7156841127b59cda59a41b9aa0c7a021e692b630094e5d5781a73fd8702e9fab49616b79cec0a87d0c317fee94e43120f02379e912d2f6446eb764b38920550d0503a9f28df3f597f33b7ebb92d988f66ef222320408ca1d54fa098093984ba5e00f46bdd806012247bec3f7f7d61f23a0c98a3c728a34ae79e09fe9d712c45fddc61b9fc66ded86d3f64aa692516c87cf7cbd90c924d75ada478b8777fa8e8d60c5ec227fdd130a92f62f7e4322a6f48d1b41411736b9e807f8da0b64a85d28968739a88c234cba392a739976fca6117cade2782c330b3724938f43f9ab7416642527dc037d21456f937811acf9a934af77daa5fda782ca4a6a72e60cc7ade7dcd8de154658afbe9e0a706648c96b33f50577df1b8106d9bc8bfc13d2a3a8dcb750d592ba52415ccbc778c99bce559494e221ea14905a9b91143c146edf22e8c0693d932947d55d8e465ce2374ada079dc0955385bf7d4f293cddcd0fb10024b52626ea64d31b33b6372d76c55690d080f876ff1db0662645435a6d987bdecf39bde6584a90f0ea61f0ebc2a2bbb5c891a0b02fd760b01989996641841c0a1653885ea15e16a13eee741527050da93f242bb474397a0ded294a1baa74609bdf8f4c97790c0f3aec9f0ecf5719263e22dea22fe90008520cf165c27d782a776d31cfbecd486433ca9c3e7acf505e1e6efb158ab796df653f6827151117a002dfc6388d928c28f883d7739a7a007f32d73e7c9fca0de3125d2816556c426198c73458eb76b5a7433a48e89d6e5751192eb1be2d4cfbec85c4fa3ebdad2ef181690117d994cab9e220e18fe288c8aa713b2e0659bd9db0a33a0efa94255bdaa7d892888b211878cdcf6597dac02bfd9fcf7a474bdde6890bfbfa1a7926ae6ac487a1eaca7ea9a916d8380aa3b1ee770c9e459c73945731d0b3741db63ec170deae322cbe26c65bc2261854a7e860345d1a5d96767bf84f7d8b3d1b50dfabc87dd47448fe681f91b958725d8c2e7719233ff04362b9c2f13a31e1588f7fa46feaab93ccdd4dc765a105ad50e574c09dc52f657903100326e1372ee08a703db22d262286c9f7f22bed25fa56fe729fa54afb1f45656d3a6c254d92c427b74c9f7fe91c757d8b71be355f871456fb59c8fa5d424b8072a998d0678946318c510cfa08ccca387a51aff5be1e23516d208618e65dfa28b8a37c9c3aa40b611ce5ff0ada5aee50356af6bf65a38369e73005665485e1183f81005", "6a636a51515251", 2, -1238398950, "433b51e68779b2a9de9047eb2e4eff77a2c9390026b6c7cb6e2971403edea6dc"], - ["564e568902c4558bf19b5bcc39584a99e63ea792933b27db00751745ded3dd2325f0a77a69020000000165ffffffffc38e69e6195ce85311996eb0fbcfbe598c79bfd9571310315a8cfacd1c37e240020000000465526a6ac4745686014ad955000000000004535352aba1ebaa88", "ac526a", 1, 1983747537, "4ee8275452e77cfee2478e0eaca526877d5ee02c5fdb4ca47c0d893e76d3b41e"], - ["f09ce524010fb52565da3c21d4ef247b662da4ac4af9ada04dd9166a2da1db07cf6f79c0ce020000000365ac52ffffffff038dd9ca01000000000253ab3acd8d0400000000035352533cd43105000000000553ac006a526aa2df67030000000000000000b405a700000000002301dc8ec30f708b1dbc94533c333df59c7ee67de17554160ada87a7c81cc18b12bec116ed4ed40b3fdffa4328bd9a335a9c144192fdee8fc71c6c4c2205d5768cb03036c6d106f545e0d58fbc446e27e21e23e53f8b9cb86badeb3296ad3932000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002da3e3c1ccca7b4436555d780b11bcc1c2329a2415d266e6a5e76dd73ac7298620205976fee47ec88f57cc7376827467455872bad4f7fa98b05e731f4624d3fa031f8a4a5bd6f879af1418d83cc1cb0470cd9b4376cec24c9dcf76f5763f5e2f7308cf9d3056ad1bbadf4c10cdf03a3b57bda1cfb019aa57e1a6d27796c72067020cac9cae53a90a1c5337407f9de718ec62052df2c50faf224f3aa7ed081412c50311b6bac2512314f5a23705387f032923352ee99c4f2113cdc22068504fbebe1e0a18d97803177f3c6e1c737eec952f1491f21c139d6e14922ac6c3f5eef2b87f600bcc1abc2891fce5a45555e4528aead595024e214a11a3b96abee6e7f09c30ac03302a6d4c1ff0c4c441276c83a582e9a86692375849fdb8c22e7b5bacc9c53c960310ffc5c944ef78f21b3cb0bbf8d80a3aea9531add3debdc91cef4eebf25272f80227f0e03ac052d35bce293a75da7a6b9c62d31bb16e8704b41fe90017e045f911022a622bf2ff5a49742439078d6bf2d1e8754b0a1d21546b38d4a753012089415b0217babfbbcfc09dd1aa8019012818d675cada7cd321fc49c258a344b03ccafc9beadfc62b3b55f23b0f04d424b06c1c8c7ff97f727ae24ae869d132a1d81663c8a4132b6fdf01179ba59632e31b7d594d8d5d45ab0bdde2baaa4de035ea438029e0d0266e5c86a89f260ad05146b1463cfa53d42624fc76cb7e45a12a452cd9c591ca2b2ed8b670187664680cfb0a4b7407743f219f8301c6c1fe43ad654b61019bdfbda7b1cd6c39b65c759c2bab8a65f691904eb80f2607a493523dc1c34ffb2245b0245372e18ea4fd9da2ffb7dcd97f4ab4d278f4ecab3878cf118e078039ee517b3a6bc85e8fd88aa064b8da3733c56984d1255235856b368ed2fc44353ea60f389459fcb46e5eda3519a3f080d8d9b7c1af1e643d9e53065744f4fe53553cc9fdf02c0c98023ad9a7d026d275dd780f9fca2bd4aa87b30f1013a103502eb26235816947f3b375f2d2dbc7ce0963f377fd6aa4ac937cb9d3ca64e0d7df6cad739081c7a14669ec1bb18eae9cabf6582385725e49b6d46c06e347f84db195e7227b5617cdacca540eeca6d17206311b0dbb6ab796aec09fa054ac51c49bfee56c5fd82f1858a144619b50c6604a521a1d5ff1392f3d6b017795f377f87fb1b579ddee9011f14f52c1868e8c0800ec141caa8389550d4525914f37d5b91e9c86e193ecb4754def1f36a53ca421da8eb22f78b38fd60300fa7ddabd0e89219ec40b77677304a4afc3d1c345669b6b4793a7a32a1ec8074c47fff97c659ca17b9dce7a65999d48a64030d07f5c6e28b09cc4275bd2612279f48fb41f0d9ff3d3b3c1f83203b5d40727633491e437df369cdd101b213b038b19a35ac51a4974e471129b207108d1e5e1987c80adecba5773d34be5e6a18c73dfcb5dcd9ff3248624d6399cc542141f0796c1881413771571665ecea78264848c1e6756fc899626f9d2a71121a751a7fe56e13bc0314e04050f36d90bef059fb943a13e252cfd1f81708db2e103ee48c5bec45fa06e3c90441cca303a8e808d9a1cbffbe0ff5429652eb01187bc0683c636a4a764e69e34c68d4724c4854d3b5e03f7f3f7e2e8e634397a26831a3664f9c7f5bfa9bb6df2c37b8868c2a680e060f272543937408525d09bef9344bde486e3287571ea69d8b0cca81d41605ed7a651bd9419abc9ccc27717616041ed76f186fe9b5f8c5b90c2b0064a8f9e88ff6f4b2adf82b9f519c0d49288bb0312e75dfa233ead8361fb7607d4c9b4d381342017dd6c1ace2cf8d13aa8561ecfb7458b640b84feab05680028ae5b12066d554885999aac901bbe222a72fec0c30218f041929685ec2463fa43d7c2919a806bd68de2afee88f8b1f7210c61ca07c6ac58e177503520e5ce0409e4c469a878884e5e84c16d91adefe9975c943fac86641572ffb13d160a80df4d9595b06060065c45fb6e05ddaf165f5f47454ed1f0a43b58528f6fcfb631284c2287fa0c296bb2104667c0748331dd90858d7ab609889e19a7a75b74b530b1450b4b362463a7843eda96f94b817be7bd7b3d73e39cca1b4a68d101dc1820395090105cc2ff56a4143b15d26cd78c3e9d9c3c130efc028b7fc8204567082d39e8fbb13504d636cd2c87470003174a8754da3359ccac2fdd7e0bd8abb9253b4d9f7c30d928806a6c465763173e700b40ef109008dbac2fdabd2972bf89c453dbdf90fa0c3e4fcec34818e2a80e9a5e3edc91702891be75741910c18ecfe9069e86000000000000000050709c030000000078a9601bc1b69420f26e20d0c7811f7656226f88f951d894cbce91952dc5dc2d1eaf2d7803591d1b1e5f6105dd20bdddbd13341425eb2d1ee017c58988978ce38f28b426efee129f1ce8839a924f595050e379aca932a185bdbc894ac178db2800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000596f022757748b241679b22ff7f2beceb578804171f7aa1010de0ba663701f9c3ab348d7b67629bf10cfad0ea2174f1c51a19e172e9e79b9f668854eb593d578aac1e86cc707aad6c1d244b577fb5868943bdded553fda72a8d42448757c21f05ebe7abf58a171450e563702f61ff6176d021dab6a24b49a7c11af15f99118e10328e2160c477434065079ef4aaabb293e216cdded92c8dd3c41da23a85ee8abb7032f584afb7d6a5dbd3729da7fdf64253a6e0093b116e50a9c41548b995a3dfe440b1d04e2981becd2797a79ef9cead7335933d135fa8ac6abb389ce5e3ecfcf78e122bee486c659e8714942a04d70f672ebe2f268d8db8f4868007e451fc674879903184186491d51488b04cbed0a3c4007efb9088b5ba29ee30b969b4ea2cf945c2e030291fb27c8542391f96d12a7ec2a2e8f6dcf014deaa4f09e37e28857a2bac0ac030b69e6cd449fabe7c6757d461f16f52a5e98c277f6bed82abc95f6066a38ff8803257238306ca51c0854af4f8a16d3c3405398d47b55f22be850c928623c40d418030777357dac57d1c285594af87043f732d465445176359e3c1ebc30584a0bb12f995fafde1fbddf341eb2a854fd07ca9d9398c546c610fae3b57b5eb2e6ceb9298ab6af14a6b58a828ac825bd81c7fa6ab09b9ac360e2496d481e84b0c1e63690ce66dd4e21e396b07f555d5b0e02dd1d849c84d460c0ec80b147b03278352e275756096a1e52808dbac3a77240b8259cb7861157e3263c6e8fe339d0894616b138d238593c75ee7d543019e21c6669548f6ddfb2511a523da46a3c81de91fe539a73293d80c0f146f2c30bb32bb4164da5cab5cd0c1e86b95adbb3666292a1647bc99fd0305b62255e00c484e3ee506f56d68ffdbe6800051b5454b813d6e53ad1949a8a55edefc5e0028cc2e823cc0afdf8456f3ec24f588d8c764bed023f081f5ccc5ba5e58ba9d60ca3ed97b9e4e3b20046f6cbcd766037a855ae94ccd0d809d8faeb272e36de845ce91f141bec99146d5240d3270aed4074c9d853fa07b0e67d86a9bdbe2979e79a379c3eeefc9777487aa47caaf92213361e7f5d39e9d43a17fcacdd8274840adef4cb74ca55d05446e1e85242ea8c9628abd059e28e96cbb32e12b1908430d4387f3508024f0eec57218c735c5428a4f2eca59f1f140816bd97fdd518c5df706aa8366dffe73d6f6d23ca93627fac8448028ed0cb5daa8e751cdf644e18cb8c6fe498ea67b5032bb22aa271055ae158b2c3449f3811e3ec597d73e9ba88149a02102b72a8e0f4e9025b8930c798ed3004687fa0967a402214b1804eb105faba46ff6d038b7d8b8d3464f8fd43460a62ca912fdfdfac787f595200094307dbd2927750fdd26fa88e2a17dedfc8ac690836a6243d4e90488e2f1531ebe00693337e4f9d079567563ae449872e6ab98920f28e67e6ecd371a25e3def9833d770e347e45b8ab616cb3ce398be53611abbdd7bb1b95da7da53c0b900b7ea6d2471d3051407f0c5121814fbcd4d6794ee08b3d9753681cb743be1fca9112e7d31a7bb140487ea705133dd66d5f8dda83b87cc8d5c57d640bb2fa563e57411628bba3e2614af0405cb67f6995963b3742ad268e4b45829101b6e82833f5edc40a4cd82bdf56b952346f6b5d756988342829a0bb9a5bad19207e3c9a6efd4c610f0b68bf20d6df6f4c3b991673f809991c334ad7c40f93722c93ca16b2758ffe032eabdc18775962d5453a948a0cedb79573544b5f4b18f61129461f106fb29a29dca52632858b167214859f7fc1d99cab6f7169519b346fc83cf228344410752e34ee4800ecbbecfa7db316a1733bb9ca1240728fa72a9b855b6641900d6879dc2b7bf2d13590b40a63bda34c2cd82ec506a474c0fcc61d68a425302f2d07c74ff09ba635569090e4419a02a47018c5eec7f990f6d6bc93ef167ccce988f4fa83a2de5a171767ec2ec72217aee22fcfc6e0417c5a3433fa27e727418da5696e0bb089b60a038bd4ec76e605ae29f6e3b4a0c71b4ce644bc855a281af5847e01b0da92f6dbe9fad7571b4c9cafe43016c107c699b60c51d852185ecd7175a7de8ccb327bb2abdcde1172a3f368a00b9981a88f4b0a503e5f8527028dbde3457d0bd3b2fce639cfded4bdd5713cb0a0daf274d01e8faabb34eea546b09efbe20a12b477193c79fa761f7e75f289d43c98cb4a84625ba1d71e84158766b30c66c6ac88af0e29bffe3dcba84be3d70bae17aa7d9bf211b9fb49ece73aab4691d854560444b026183adffd4adcaa40000000000000000656659000000000001dacee507b685648a0bfa5c9143377e68f50fc53b7b5da9467a383b02100eb12ba5da98ec2fcb72115cb8992f3061637c2b315853b8787442aa40103e970f36e1334d3a908b4687bf1b02ef25159ed2b3f9fceb771a96c3b6ae3eb2675f80bf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074f9281e26388ebd67b7fc1adc45dab0be1cfadb225a22b626f79e7195222f286a93114e9d445d86a45f630d7839e44c5e12fb50095098bd12c5eb5db813207977c69c1ce9f506b2882449ef561b8129fbda46692ba0eee65ed5142dcd972a9638fad0ff4aa8c503068b6c7313b82e12df3561a727a126da00c291046bf1a3c0022da9bd78528337bba3158de197a727847b884afb73a7c5de6b1bf91146a1a8e80223f2f7d51310d5aeeab8d184be20390e82ef208f8101a8c977cd68958aec3fd30b2b79fe514d98d2d439b1c432c6d5b31b2fa2a90f88f0e82da4d3d7f21a67c8b41abb97170147fd4ed5a51ad77e113d3771822ffa5a08c1f8be95cc02a570cdf0020d2658c7c5822e4d1a8746bf83aa4d63fdb731da9262d5faf9f2f3723ead39eb0205bffb8b39560f11dc22b4bdee459eaaf4a60314e4bc0c86918875ca3c6cc0d402174c9ea3f0e9a3df6ce57cf37825fcef57f44edced96e7942e5e1a0080280a1902004789dbd4b5abc9f457da42af0fa9e768ba0eb556cc6a81997b7cf3273270380329ed320877c77faf82f1679fde0304b2218747c9eb3c09a7972d5b680c74c8f47dbdaec057fbcb5b3766d5d0100809c89120415b86f2a33ff08435ee80f0f61e3d2b7275818729faed9e18f476eb6bbf512400863c1c41927de066e8f82435f3040994d8a0f215f83de1929d6e52e3e05eac767dcedee3a84963746ee055cb34b18ceeddcf0331b8d8ae2a0061413b3e3bf8dd4b3fa1d51655f5acf1465637f9b1328998d42657631f8dadff600b1f0ffd633abb12960466b3f76850a6fcea705a71acbef608609acd159a18e260768a568700d732665b8cdf786ba19d3f2eb9e7d94e264755adf688e7be1019d65658b97cc88f41cc084b3ad39901e4cf48eb9170f54ef14a8dfd427ee58bc92415326f264073d45ad6c16384de06ae6b87b1aeccf5223756433da267e158b3b0935df9db3ca4bcef8d259c69148cf93c25ce8cd09d431ec8c8eba51ca8581edff9194d823b5d7b765da0716ff9b61ab9d2957e5a1344b74b912a46f88a12fe80b79f5987cd83537d36a040c3908fb3a29cfef4860b94b3630037388f418fc8f9da9deccf07b80d4f0c671ab651b4283cae35d1cfcac90e225a524fc754ac5c98abfdf1f0257c213c79c08eebb75122a315994dd5493c15e9be03b6e7129d3ebf7d021d60be2f2e5dd6d11f0a7669190d35f39e8881390c0cd70b1635f255ff005f4d0fdb300a6880566a87f809c76bc8d715bd47c8ed83d91b3e257447f45cbb0b3773b40b10a460601396840ac210f5d1db7d80df5e6853c70690cbe305b47a9cfc1f0119c68cfe232e15de169aa7a652635871da67284e1e2783ccc21847e128b308355bf175a1c68d4049e365d52a19b06e21ffd329afd7549c88c3b6877e770a51d2e57c9f0372ee5ad7893e0b076a6f6a38cb56e66f2ddf2c66e33792ceae5c4de5f998c95acccba97fdc949dd18317d01161e9ec0b3ec162edc144f587835fdfcf953ef03873163077f229d22307559563ecc592b5c7e9d32b389576aec190de1256cae7932a705a9633c29de94424ba04bf140f2000da2b07d6212344910eb9fd45a507ecc90a4779a03b201a0bf333b8bdc80a4e922007ce1c679094dac31f828613d4c30b1e565dd650782fa14216946e9bec6be35083a1c3289a26ae669b27c9dd934589f227d169d7be550c2cc2bd0e63235a1a49317efa704e4b631ca34fda21043f85eb166403bee6ac6b01a8f51bc492e18d7b8bf10ed4dffd1a80928457adc9c96882baeac545009891f94f0433169bdff321f3d4af1e9c940c665b21b14210fd7215e339205197a403d79f2123c531a9f952bae70bc10b6cce8c8468454471a22417b022d4f1c3120585986784e0ea9ea7ba05ba224f61f73c0309c805031da4b50f19f6383b89ad5a64ddba00d98f46964a4754c10bcf40a86bb5f69f5abcf98f5c5a123ec494ea60b3ba2c8246212637d7556b156effe113d54d74dccc91a3ab573c64c5c4efea94b615326f64b2d8a8d99c5ac2c228cb89107671fb2d7fefe0796205e8e840021e73de6b04dec02b32489f4e6abd47947c9784ce364db9c592e8c5ccc1c48e5f2de56012a1c498968d4c3734a9ac46022f92f274fbba044417f932c7be8f1ac34eb327af743c24b92100c67b4aa5f92a27263226403e8c2bcb5a93f5d930ee5ab4912b98c96bbd76514b4b4d0e8ae42a01791674bd63e3cd0066c3703785e1be31bc09bc72b6904da5871c541a4f5eee591dc8cb87b8f2805d093a17ce7914f3c528bed447809913c8a5f6b3acf47eca867ec7024112bb88badd7090e6680251bbf56246a5d6e21e3b2274111d7a6cd97d4f6fa37459f40950ec06b5ea77a8c7db6531893b345f59fc05db07672c384478ff580e", "ac63526365", 0, 1568516646, "2397c973c5490211be7a4f81ab50cc02aaabb65eae14b749ea1664ece05eb747"], - ["00f10ccc013722ba86ce5fafc7a7ca8acf30808bc2217f5dc3be2e32c47b122b3d756a5e1b0000000007536365ab5252532939c340042f507e0300000000056a65ac006a0a28aa03000000000300ab635b60cc020000000003536a519114d7000000000008ab516365636300659cfbda60", "0065636a51", 0, 1234170252, "b12fe4d831c509670e41035a935b6e4ced174fa9713e133d811a1eda403f1ead"], - ["407b037501a54a7da2ca4c3de1b2c08f8f34a504525a931f4d1d3480486b23104bc8e5f257020000000963006a5265ac5265aba14215eb01a556b0040000000005636553636a00000000030000000000000000d2043205000000008ec924cc3296f1c3443ed9f5b67b1299d50b0710e394ed20e4589f48baf97c69386973110ac533589663e74e0eed3f2c133d3b9d27ccf270dc36f12a10a1ff96a71184888ad3c4edb083b017282e02d9615c0b0a7b72ae72f330bfa034b4cda80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098c6defe469e21c92087b182cb4868d70faefe30dfaf1d8693ab97a7aa480477784ec6fb02d3dbcda213f26d1dae517480aef7569254141bf5b590678af7bd0dd972a3c1c63c6607e99fa816aa5f6fe615a7e65389ef76e112dade76b0fc0040df85f8a97d4f45e06b43ae6ecabd9ae472d4788615eec01a2e60119c43d344a403270eaaa3fddec50954cf990342504383927fcf2fd9f0677f4cda6987fffc2719032a6f1d8450c1b161dddcd69e6bb17ae398e24a63a308e031f6fbb8d42a4278180a11ef696ca22ed0bab6193fb74e698642265d411882c2b39e69ee7e4b1f5d65b72b1e7641a9b9720a0054327e126288bfb5b84c80631b4897a8ec4f537631ab4e03202333f73832d4343cb7c536ad85ce6cf988e6f5cd3c8e9e9681baa692e63b90030cb03690c792584d4da93c5389446d4ad6af3dbd4a5e6c8ddd06d75f89842fbd022ca11a7545971547a9ae18c7718733a334a1f1aca711771276f8e60bd11256cd021e116ada2a7fe777f8743058887c7a2db81931a84aba28e653f72ec0520d81be0326abe2d48fd5cb859544253293a4fc7f128662addd50076a87b17ebe7a3182799231c5d892a47018ff5b7af5909f3dc892adfd752fa26c8dca6390b263b9be0b6d8f2fb50ac50f58f8ea736c8559e274ffdff0dc41be72ef6fa0a3ee3f68794867659e3b20b775cc738c0bba5bc9ae4d5e581d7c4e84d568acb011f628a96997a14fca5458d5baf9a50cb2ada4c3fa8cdf5a6be086813f492ba0ca6f72f95956bf2e4743b057c8520b6cfdcc491153471aff9997805a286ab0b62b8493a69bc30529d846cc2656339289770b7c7dcbbc29275b5d91f191a4559260e0d1371ff815249c9d419c9c5dfc22c63ab24f66fe31fbc3c5a70586a869b23c8178ffe9133d1dc749873b089dab1fdf327852a865d4527613981e8460660023dc38edf7409cd1bc8b947977ef50cf6bd65667097655dc5ab81ea7a3e0a00f1729417706c4e6f51079dd53ea1926327a243c812511f318004f199b9540807da1df79fc2b0fe2585be589295abda753705db84ea2889712c679ad2ce367fbe96f9b7f06665b4fb4a068495addb02a6682247b15d57fb9a5aa7cbda90fa6014408a14515bd41c1503bf0ce46624d5f3ca5ae2c05ad0048b4204c1e541d63c0f7e4efee5976f17eb188414d9bd701d054ca88133b09e4f5ba217782de41525353d447ce84be7b8ec2f4e940a7f27852377ad3b048554423274f7728c2445971acaabd61900b044d76ef48a1bc76fdad5780a66600969b17170126c3c9ff6bc940983392d34a653fbd372d3752f3ca093c1f056b9d8bf56e1631a44e32913eb68f4ecb281dcb8d56a8236854337e95e6b8dce348e6f8f5aebb6f44267ececc0e65c5c619f8f4747bd22dfa2c12485d12d55eae8d59b5b31a070c43502bd404696381a1cb4cad6d9c3c14fc38bb903423e8fd633423003d4ac7e8cf3ef3d9533e122b138f7bb3ea522ec1cd7dce12b804dc5126f7c51733fdd1136b575fd92397990d2ddd61e3b021cc9160e04cb3a2f6f36d399e568900067cd3b9cb42521a6868be930414a5b6f5230f380bc71a49ac0f0f5bb99a2af2090bfadc26a367cbda542f7f76545a737f570e7a66a97f0f61f7e7fbfa3a070ef391737e4889a97f2e5083742c187ebf0bb5cd4d764caf1bac8dc159f5672530ea6b408efb7a37698136473247b28a8d19dbced435d7480953acaebd9dc42a37d3fd5e61f3a193b237139bcb7c23a1e7b754d993f6a49ce1e46c4d3ef6b13bb177ba4f1e4b780e712926f558a6da6f92cd5798350e5cfa30b4d90bce23671f1c1d44f2f2b8dfa45b54ebeab7603c51450c5582e1fd9788d38cc32367bb4d89279c8048675862ed77c9e88e327c60cd6d93932da554528e24a619b1608bd44274e120bba2b69e8aa191cf4f48b033ffa12cb022ecc16831f73ee06bcc2baf9cb4a18acabce311005ed4806e82e534181a696b76e50f4941e81e5b2dc1b44bb9a46ceba2a085a9ec5aa2f8e696943ad70844e256d078a0fd6c2c5551a6770ea8fec48846221ed7be01103b1864f027c8a334bfafff261e06f26c50a1af0f49140372843910911d8e9a09c7dc10e0f9d4516c1448ade32b8d251e5d96db405b801d2adc6607ee6b0da1855121bf1185a5e51367af1eed1b9a776f0755e7fbfcb71fdf76816202dd18670b94df76767dda342929908e2f9fdfa9a39db87b29eeecae966fb41a20067f839a2a8eac3851004fa4def2accb6c8694dbad1143695fc9138bc600000000000000004c4e430300000000947c44d496deac05f014fffd06cf8348183bd0f9c78ce5c6ca538fdd444810679cfdba47c2dfa2bb8cccdbe3d20993cb4d128ef5754675b0aea0eb43c0a50ac228bd62e6012de4b79598f1869177580f37bbdc97131102ac7d116c72f35005e400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ac05b3c602fee4895837600b196631d6b0fd45ff04e27a05a1c0f3c302ca7bf067efc33b7665777cd35106d7b8346c91be5577d1e287ddd740e1278acc28aadcbb7edb0ef8423f481ff676412df05641c17e5b621ab08a46e0cf5c36edf7099f23236ee69df4a222877e7d49db0659b539f119a6565861f4b2601e774a468aa7020b7cbd67c20c79707f9522b72705dbdb1a2e17daf146876b4dfb4016eb1e5f0d022748bbc054576bb99a59ecbb386e8b8c7c7b6881bf8e6a01e2a4443d0b1b30520a02a9db909591f5db3426f9f490eba9d61f3f7da53c841fc62f6c8760b8e273f8220fdd6488ff6e892732fe497dd8f12d548c47b7b2fe456a5bffddfe9decd03b0208e685569b1c6ae89423c42ca7be294b46d67228561c9730819c89b3d38ac97e03025d56612bb891caaa071146080593e94b7b3c40671911ac4d922608b986180a032ae183afa7b8f9076837a3d5ab22b479bdb518f7c07bb6495a6e378b3a41b8e303194a5b84bc85f7f7b74f84d23f152731175544b22a5ce0876061ab3dc3b983730301ba21c8f9dfa12ea3c6c4e8ef598d790aae7fd448f6bc7ea2cb4580c5f0dc0a759a8c6f35b4f45e549ccbbb10e1535ac2a8828cba8c637ddb391ed759f7864e97d108bafee90b5acbb5ccbe842400933f2080ac443e4e24cbbc9d88a28d3a192184137151115ae4bea75ee7a4a246ce5c47540ca54ff91b73a5118f805ad1df2a50f9fec65430783bb0f3c107eb2421d41d3b7f8879fa237c8348e6d448c549cf0ef2f38594f387bb79d828569c27440d601e43b3736bc1b0b9b44ae5ab121aecd7e3d808b695260a175cb75ec5190902bd1e34514d37d3f3de7181d4bdbad00ad7423a5477810fe0d05e5f7616501d1689b09f288c4f76d2659cd9e034c98324193fe73934c69313acdfdafda28b795a02b206c34c98c075b089ce592a3194614af7443d39ce33f9955a848658cc8ce02d8cf03534f50e0c37237cb7c6095ec1806b5c1f1b46414c21ac7e631dea32425e290133383514d42dc2c6b6ce1ac636889d9d560254888697438e041b26b5fcb109c022b2f02ff43867f8eca6cc57a77033e38e700608beebe5cb3446df44e44d949c0a37384688938f0afad67c90b00c54b412f6d8169b4fa902dcb6967a3ee6ac51810cf9adb5ee93ef199332c9b666e9ed70dd889c8aa7c8592c9c62daf6a6665455d721520de5f75785e2ca6643fc6bf33ffaa9fafa0df03ac640b10b35979d829e0ad369a98bb85794087030f6c2c7a4757bae894f375070190b416dac0e5dfd92e14095730cebe980aa608b0f975be4f73f3cde8b84e51e9305c0eb9488a2c491abbaa4f8a871e4033ab3c8f1dbc7c1f83ed668f1ae985683eee4c14fc5a4b4bd293c676b532b7c9c1044235d8cf1354904b2646dd810ad8fb18d63c5a87938ebd6781f81e32ce57db38a777298a6b1485014d4c70581c764fde45039a0fde628b1551f98dacf5175c8ba647be7007246949c0b5c8b24ff28482620b801aa52cdbfecdfcea82bb7152ca43288e2918d530e4119157ac0a37517cd7c951082b0accfec225d00c3707f6176347cb0dd9d52a4ebfdb33ba68f61b929746bc7b586a72d7715b5c7550c109dca82ec3c3b86bacddc588f56aa629c1d7d463453a282521f8c2a2a06b4da368fe325045365c5cf05502c4f4702bdc4f7f0024df3b5e8a1c57c7f4fadbf2b7fbdf8d75e024a2c52ec1fad0809defd2545491d412969728a43fa4092d2b2bce8d87439241763ca9ddeb5096e8d93157e05f3d19cd55c0ec956463a8c8b32183a974041d7ad6a08e60d1464e84c3ad1c9809ac6999ef48c130966a5057e7304599c9e1695dcf657bc77540bb0e1f530f8f4eed6004e689cd4c5aabfacaed76c60a2b074e90805cb5046bee53013e5a15b3052b82666233a18f8e1a659741865436f36f4b2c8a608dc325c5ddf391ecabbd1bc7fb0b2636f3a06980096a2bc2456c1e2dd43f94383e04d2654db924e35ea4c534bf96d9e87693ace6683ab997aadaa62fe611a0ed8b7a1161eeb79e560872721b77b8569f01cc2afd2edc573004a8189e5cfdab8f150efd1e89e5c899d5710ac70469fae24a7b6a34bbf660e46d8ff3b36b492ce35b03819a822422cb9f996cf32ba44733e4d4a6367a0fd9279e9b1c2e5af8619968f662e5da79b4631c65dca262aa21e9684c086e048b4536d46b586654452437d164ff4c52efc3982d45a9cc591800df3b1fb8a0fcd92143e199311eac54236a3bf3b496c1f10137020cdae13dbc6a91b8004000000000000000000000000ad931bbe068cfe525dce323cb6f624dfc5a576d34c67b23ab2c489936308fb7d1eb4e29b837a382096343046a199fc996c4481d98e480352b8ae2798e983b27a7e47d01f1978b649ade08ff8f32c804217d0d25135c2b9405e58f134348be57d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c9978c95e8ec2a2852965c7dfde8868f6dcb0ae3948c605c60de93aa30b4475abfbff315cbf6934908ab224e5b3995ea6fdea2e024e4bff0da55a5f6f6a24b014378e47418468f474f39f048d5628595f3ece5b2b5d086ebaebb563c94770155b1a657cf52ba9236e4125c52c263654ca4a853e9ca88e54c36f628757d16a1680214458e4c899201ed230ce87f3ff329e67a605e25ae84352be4f4767cbf2e9a80032bd347bff92554b187e3059fa191467da126d9e51cb17617bd82e61f819f06990b2ebab0a858d70e0832cbc9fca3c42e50488cea5b1ff845f8f64bac8b15a08bbe1c6e26b08c98db7fd454b3406ccd10725acd157c893f9be9a4cf49c5faf02b12021cb076b5fad8671a7310fca4927015a954de4a083ef121a5225a35d5f5a529080222a3438ef979c93d169b00b0fd427ab70dcc2010f9a08b9117ca24821af2beb8020656f4e02d790d482a44054dcd8c7958a190039eb8bb19fa2a48a09cba3ee1c30306d50c752afe3b87f23228448041e2f79273c253b722b77205a1a1e184958dfb030e80ef44f321bde3b6c56ae9d2be585d7ed90645732b2401f3d7c0f158566bc4f4b091274def31084ef1cba001cdf66422821be316ef29206c10c2a5d5dd9391a454a7f15243a20d0c267ceda8a0e78694377c03f9567014d1abce797d3dfc7108c539696910c4fc65fdb437d2b08a0683afa56b2acc22d3d2ec54ae1d5c7ca08abad1cb865264edcd7a9d7a7e7f280df22ddb76d1ebc1ca3d5c68b0b370793bf42b90e031844f5d917602dd07b6a22c1d89f6aece065af39ff88a4c78939f174fd743da87c8b8e09e425fa6dda1eb5fcee5b0b50f336ab2100e8a027e180c5d4c605510f80dd0660956edb22d7791ffcfd637cf3337fdb7266bee9b0c70e43f67c8b0eb8af672859b6290c06937f2ea4b9164c59a5fe29139c12958c2293167c22aebe59574b0693d1905c120a8b7c08cdfb9b063ece139ac1af95c79ac7c7cf0c25a8f824990b90d93b4a078796accbccac97a5c4454a4846720437d686e7ac4b6bdd9d69ed1d117324b848f1816d712c7940dfc84a1ed309c77571844532613082e6748463245215ecef9da47303e1725023b85673ebcfd72243f5282eb3ed01f2328270ef518a7fd234818cefcf5960d216018a001432ba3ad7801e2eb70e86f1ac4169d4e618a1a9f3a25a607f3038aebff05fe367d7a567e86409f75bc4b491ab10886ddd81705f923ce0998913d02d80e1cd7f145f5c252d61c2539bdaee4bbb1333ce357d51d24a53cfea437d94317784b7cb08164f2ad0af9af9ea630807b54ab54c38dc4cbdbbd1b604c2e85f00a18a696496615ae75893cfc484f3b18b7468900e8392dca1f70fa44f500cb0491007f7b084863b6b4e68f3fbef543945663053c19a845fad5a8a7d7b8b3a5edadaabaa8e79c2d53260f4a7c6f6c09f9137e3ef3731b2b2f40709fe0a43f1470ba551e16c6337fa58605dd48430d03d2e16468407b1704e9d4f2055aa30acd5daacf6c6ea9f75206abd8ad825035e8ac37fc6bf26439d544988996a91ad40a46bf35c9659bf7401347e96821a27333c8631c51bcba000dd0ba888a7be66871ac5c7ce72b5049ed36768b69b043343099922851692173c211b6ac62ec94653ee9c5c914c08d9e4cd9c2ff206ec9fbc7b74fb419c637bdf9ad30a2bce91da56d1a7cbbcb894d3396a23857361c3c1ca74f5afe7908d7f3272bcc0223c572039368c9e51c0c96e2503154dd0eb1b520af47faeccbb478a0dbf35077ecb35d57f7a4a63d70a028c2a717cd1d90e7e8238d005b5bde3cc07b1b887b0cdf67cc9815696c3665a16b076cef1e8260fdc748ee290aa941ff54a8ce1880caa129c8123baf6ddf24450849f93b2d3e259957d3ef6ca681753db995dc125cf996ead4cd1da4b59675d8899568c7c8ccff89b08c13cac2470baf943ab70df19c7e4f27f5384409aae0ebc7b71fa0682165e0218674c4fcb87c8ea60e42505ddfae5a15dbde26a5b8255501cec32ee25fe01e639db4d7ff24ca83bd687d85ae32849cd6992aaabe7857e69e451dba91d509ea27e206a7de1d631aeccfaa88f04d4527e777a19059e744729985f4ee1ab1538aae9ad49fcaf1275cd611cc70e4272a0f97ba1961cd98cecdf94f0bf16f392e82016ea074b2349b7863f48174482486261a1b19671ea139024d42bc576a63a5d584a05551919ec6bfbde014a8cc9b4457ba13ccce4393aeadeef0db4aff71a6b2d38ce20412a392a4c9f2d0a9f7dbb415f4271be2a9c71bb7c1d34c2c243b3a87d3374d824bddf0d1282c95cb29c6b56b9387d02a0c96eb874735450ee7ebb241ca53019b55ac046e6d48c1889e94d0b2f8cb76ce661ed9b6c5283b321e5e9157bb761cdb0f286e63ee6f43f6cd6231d299b6530c", "52", 0, 1120056016, "96a8e6affe8ced96ac5c76eeb0500abe81de5d8d6aa7fb584ca27ca1862d11a1"], - ["9957d8570126b2d4845c788abe9f76099d202af0050057dba9c149e678fad3f11ba7c9b53e0000000009ab655163656a6a6563ffffffff03b9f2d5010000000007abacac526aac00c1b860040000000004006a52004191c903000000000452abacacc328955f00", "6565656a525165", 0, -666266533, "378563438a3b73498f92232c92e8d334c99cbb709049a236cc29287dc295163a"], - ["73e470bb04664e75279872c17279b6de080d1aad0e1eb7676d1096a3908d047f300106dde300000000046a6a6a52ffffffff9bdd47a3883f87b360006f9fb62219bd7dcc6d4b94f532bdbe5dd5bf6b133f920200000004ab6a53539734bd375ae620578600b745bc6f975beab43bffeeaa726c7fd6f02a741287047dbe27280200000000ffffffffed2bfe7e04da2e0a33aad81f50823094ebd804cc7fe48eb5b293601881c0247803000000090051636a65acab525215098bcb026ff47b00000000000200ab52f4630200000000060063ac0063530fda4314", "51", 1, 317459275, "65637ea11f3a75a8b64a561858a5b574cf09e3956f612c29a47a07208c04f68f"], - ["a813c34701afb5a96b8f603d651d23feda87151d1ab3069d2976997d96658e7505e15de2f0030000000365ac52ffffffff0204b4f4020000000002526595bedb030000000005ab5251655300000000030000000000000000b765df0300000000a22d51f43e58f37b248b3d12f4c37ad79d5a985da1bcf428b864e74a2c16c04739b6f3b56e458020ee48715319cbf93e4a256676d01a42278e6b22a987de1d43525fe677c84fe788b46e95afcdce49d2e8bf5dc804eefbc71059c12ec2b9d3c100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bddb050a7ffe28f80640f944c54526ce43ad7dd852647e64c24ca7a14daa705b47f89b6c61069f5ac45f4a15329d9a5ade3daea6af54257d3dc806a9e41dd879df09585e8b8e0af0ecfc214a9458e1c0e4fb4c30f88cc36dc74b6e9998709ad7633eeda3530c9718ba7d2906fbf7e83bc0a606061b1afe99adac24bc276a1887032a332fe7ee82ffda0c56e64f970d3b0a54e560b465782e303d67dbad8dd41c2a032050007ea046ed989afb9c093c39a1896c9b54ca0bb9593f140a6a8b18f1ab7c0b023b7e9d51d122ceec4eae2925a2965129e1e4723bc0a3a7fc87ae954bd543b9289b53c29c8408c89997d3dc0282341c0b9d8618f6747e6794a38bfb75371f7f031938bf4b4966d668eda88a421864c781facdad75fb5e90807854cbae17d4ea910207338586be6e533f8967b6a78d538b0bbf2ac2368df9f8b1963638a67a14e315021e6e82bff0fe29ee58a5ea7dd9a3fd9e4c38994b9dbdccf8783e65a81d2c1d6c0229dfa447fa9f22b969726f871dec6d10dd3756b801daf88764a39946e24b945f020f2faccea46935ef4dd81a74b0d915674cdf2346bbbb68d100dced97b6fe06dc228cc9bf206b791f8177238ccd910072b34142c533ba56af7de2a240ad17fe98bc824c983e07c1729344815c19dedf4e0360d1d194af550d558ec4fc4eb896a1cf57c9381b8a79fd7aacd17df802019ae566b79e8775ac7ac7a9c059aa315525377e90e2f6df95ef79ba625d50fdca02a4ffae62c432db6abe77224ba4c6531a671e82cbb03405d54f50d9f1cf841988fb340aca6f89932813304d4444c87d9de48f2ff1e09000c5ceb81a92c22490f36331b18a0eee86f3b77e7e766187928db00fa355fb524a5c4da0e9266438851bf8c6f3822a24980d4064a8568c0414ab3ed11780167dfce83856287908fcba3b51814444e84e721936c304d9afb4bf1608aca1428110cfc9849717f900d5795e48dd3903e07bf7d2b8643db90624c4a3e4443f9dee82ee55a45e4c29e98e85923672c1a57c375e35ff1870bb344b60f6908c20be7621207e47b40c80f4642011e56d684a1f9f8ec3bbd50ebeb3e704660dc93af18ad825c4439239634213366cea0eec93f98315e057582f3d3f235f1b7d63baf8dd216db06c54f3cd64c2b254a816d9a6879fa0f3a7164d40c486124e1615034b33cdce528fb080bca11c2d8d232efd4335b9b0a7277811127ae59f6800c40f997a3da2b17a879fbb791d9a78a4f357d52da5afea25133086ab394069ba19d555b71ec3fc1f67be3249d2be8860597aa685bb46f8fd5b6a8a1df779a622fbbf4b4cfc0d901625025001e5f7228ac87451937b5dd25ebdb689132453a7886e5057dab39168c44c5e96eae3d65f59675c09d82f7126f00f13e2e2f9b5d51394ef7d206f112680b4afcbd90b9117961bf8925193985925130a0619076e3fc889066b6604312c72f3c761c241f231bba1367de3b1cc95c0158ed37e10ee63cf850e0be1fec07e66ad478d515be0399513f90f36cced3bb9ad9d17614beb09a941cd2304d9f301d635cc43587180563567ffb27cd9d105f8e3b25710a2504aa9f3311c9e2b4a0d78b35f967749e1982598aff9ebd6d03f1895f818b61d511427eee8b0a73ba88c158d5c778327ba0b11fec7e9468975363b49c8440efb16685abef74ea1537b5cd539e502865a653cfc8e14f86c3c0806b2119ee40677be499b73603046bec6769c732231688e81595c634c2c7ba73c7e9a1cfb67bb1ea1d9827eda64b76612a29ab3ef53757f39f792bfbb40296917d60b8f6b2e606b9ba822018aa631e572e6e7e7d3c273746420865a736a544637b7783766b9e2936d55312a01fd7c4674ad07799e7b1d7f8317e19047ecf406f75903874b8948509cae095e872b4a81744fe9853fb5c665f36fc0c9b5866278868342cd169332499973e48e8a5ad57317014a54c717f9dab5485ae720c6b0be239e00ddfd110b8e59798b027f7b2699ecd3abc928d8ba8eb31e66cf00c87c98a33b330bae417e9d8d92823a071d3323b6ced7db4bea5a2989d27c7695c5972b05cafe2cd75a5eb69b5a782a9573a667b420d838cab531c39956d1bd7c5db4401eb40401f69504d38fcc3f59e9427d79069c6f9b25a18f2ce726c7df7bd0457449ce4c9cff9c67a5b095f47a2c766fd9c0ecf2db07ae506f3221daf0a4e3e9a62cbe694b76f96a8a5db092c47aa7efdd6eaa0ca4c90d85b88d8f695bce6690cb431aaab8c24057df583beb0a89cab683a19a0aed39cede793c66342a0000000000000000966a63040000000051855d73a6d806ebc13eac6e32bae4d7b7a99e23be0ed37b69c4d0f01cc09426cb5523b9b3b188a429cfd897b42e97678cad8f9940dd79d6904584436768b802fbc3a3dd1dad3efe331323ccba8c30fe5a2a94cd5b45709a770aacf2cc6c30c4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005678a51c3c44b2453dfc25cf71739c05aa3311fa63dfddc7e7056b447d7a32739e98c5b1377dc80d237e9a981d8b1937461d608cdf3e62fdcaf74b068d6c3053446ecb350b3f4b14d8b3e1121f0880333f478f520d34042fa9503115b333f8e3f63ba150b5e789e764d642b3fd5552bbfc1ab925c3e5274f93c4382c198b6dad020d21c36ceed4852a00ce23b25627083fb4c1facd68ee60dce1ac01c6b1073f0c0206ccfff08e3c7393ccc78967df8f3a1cb253678605be9c99b1955d9fa570a98a0b1eed64dad7c5817b51054bc9503326edc8bf77336afa178a788a4ebb81105e3119eac8aa5da834964bd23ef8f569b6c2cf2daf4dfe93e51ec82f28c386ca749b021c4c08349c26354101288e9a17640b31d7e25fc69c8e19deb865898d1cd227970320610a19585b690052b3cfa40ea04b03b24062ae52c4327c6ded4633def16d28032535bc77257a19c55727ff5cb64e5750bb71caf865e73028ecb70b10d376da1e03143311fba756ca03f670df87d313468911a204439a5a806d4a252412a3e6674d022dbbc6263e824711b48011a3a5d1a951d33d9871d7d5b68b2fa4e82500ffe815d5fb31c7c5bf45adabc4917db9e744583e61dd9f500f0ccd85c49778362e5394f8fa79caa2a5c97d0a7dc78aba6ad52a584430185524b818360fc9d05ed6ce23e6271f56e11d60d9358692aa1baed8949adaea1773de530e734f768fd20d4d61eb46aa7704a9b9250ae857ae73f4f22b144ec546208bba7f96266d08141598c834a9378920159bd411cc49c4a630c4eef8c5d46cc4d02675baffc4141bc2775a0520ed7055d8b52c2ad5e65de46096dc1aa3f586b173af57471297fbc0656a278c3fde39b487c41dc365e606255a0b23497ded20680bc1f464f02b9816413768e7af4c2db2d16eb27d9b6c2e8f5acaa6423ad2687ea8de009d19a65b6b39c2ef9f92a0c5d8f79fdceafa9426ae44e4f5f82e8306b2ff95db1b03441c6b67ffa98f6201e159c3ea7053e8c361b125b4f0ca7c530055aa1aaddf90cfc1065028a6f160d72e059d924a6e9eb00615f97c77a9beadeaa7a325a9db1c5c7b4c3978ffd62550526fac570fba3576bf931d3cd6025c6d127df70dcefe0b011221f5f1c062c1f9d7b6dcb6e617c23dec8d36d905bee8b75314ecf34b3f5e402c02cd53c85dd328fe24bb75caad4ac0076df90121366d9df6d2bb3c22de62d6cb6853169965f57716dd304cae7837694973d26b3f79201e5099a34da054f0d420dc2b106fc7ed6ce1754500537fceb673d9c7bcdd327c5499fa9616b9516a2751c32d5125c03d5f2bf9ffb408eaf705be12abec7f9bc706a43fcb437cd54ee70ac8000debef2ea8d70e6636e1a084efbfe6612e23c9191d21d2d5d1388193290641a279556695cbd8eba9d66ca0d23e9e9094769e09a93818934aa2bb635d90e4ea313c3a264ad125910553288a02808bc47408aa57a55016ba8fcf3ab32648cf2cfc3f375706729be3a93f3a5f48f1edf5e94e8d2ba29a3debe201e70208bd96b18259071fe38141c51fa5aae516f97c62b120b636d2f258744fd2f12eeb6fe0bc48216b81c794137f198fbc9adaf57498bc96f2a5b3069b5bd054cef0e1be7a40f0fa0ed26d5a4be654cc64fe3b073e4099b4cf198c6ad51ed33209d464f6e79468fc6f047f7e2e996a5574866e605a529a3859a15c9b77230f2daafbf584343f3052ae4ba2e8ff7f87e335e6c6e53e7bc8074bbd9d7105babec8536df9f0f8f7b357dc8c21dd0647ede5095795a3e2d872e594dc13a39b5ece9aaa7e6cb75f7c4c880894b99e525a13e8d606d4c0e1008b7c790ef57f956a78be7ca1a3f45f2212194f3411bba6bf6d47852c2d3377deb8178a361c611c26012eeadd72f7029a5a10caab0e9edc9ea1165d524283a8b11a0018b11f31cb271ec0e1a480423c2fa0953c25661ed3d65226f682160c1a128868b9063653fe9b829693700a7236a26905e93fa11a8cb0c8d73734758a1dbfe01eae3c92716ce512868b7eb2005206d42854743e5ebd4b1f03b7fa926b1248c7a4b2f009307b78a1bb5887d6e686a92378fd5317882f7162991c7dc6bdaae3814b4b26b49a8a330972efa25de68728c4e9ecbe09039a064c2823c2d8ce22b08326e8d1f19a8f52bdb898efb78701478dd509d91f9205ddc663bcc8e67e8e316879d621d87f42f2e8eadbe040c4da03edcbe4d9f80bb25f8673568c00849b428d15d6a8a55ea3311f86a0af232ab5857fdb9b8de938e97068399547f4c64c0fa0ef2b69d80000000000000000b217b2030000000070c738b43074546ce187ca5b001501cffc19ad2ad5979a8f3beeab47b79beecf038356f7ce22b7484c4cc4dc584a5783ccaf073bc60b1941e1e24fe4e964c1504a230c47315e79b9d5ae4b28ad27dc5ce60bbf2e8ed68c2fd4f5fa2252cdaecf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007895bae04c44e7046cf345510323df921892abe40a9bd9f359825a0010532ce8a5e9d225acee2aea419cbdb74ec3efa1d2d28039925a8a0ad96fc1a850c85ec3bd8d84ce9ba36ab236b2631574fd918d677219b987513bb9cc84be3738d7a147e2a010a133352bc8156b201192084fb6afe3f429681c2ad171044d4db32b2089020b89dc84d67eea8013a621a5a08d8703b204da86b337a70341eda09593be6ba2022a8b3d221168054e48b0fc04e1918b9b7557794182c4e383cce3e8f1187329260b148325b13075b82674e8739f7440e36207a718ca1e56360d89f9cd20d8f4b25a29f426f09c89767fea07711f7162e769e39d654763d1026beaf9617ca0f693520312e8d7ccdb418c846d72a432247bc4e05d3577c8af732c6f47c759e2e643e75a021d2ddec3f8daea0cce16adbbfe2698e6d2d4d42b3ed7bfda06b87200c420fbaf0224f4868e59b07815e33b94a5ec854b4d46729f0488225d3bafab738fc1818811022b0b852559c5e837a7ba135cd0c0cfd78ce8d5377909040e8e9eb6cd6bc4dfa803259b03517e3c0fd2647618d2d0022d83157033d7d09820bd438ec2d63a57c27c7ec6eab3b8bd36ab9bb573640ab418f3f8e9532ab37d8d47deaf11652ec529b091cea1cdc9699c40bbad2e11cff6ae6a5dbf81e12c216b31121ef31f73a9bf43653fc75582a80c5cc42f0a65992eb15380dd57c6bd54ac931ccf869878c0b0d152563e21024f8ceb4a1aef3664461eca97a533a4846ac62ad9aa6ad6bea44df47cac0b978232e52a595caa4fd617ca4ea6a32f77ff6e771839813650232395d10750641d38f47d0c84b7578d946ccfea2251bdedd9fa44bc41394a2fce81bd37cfead9c831e84ad488384f42ca1012248c920c72267339250669432398879353b17d96405c06fa6f49bd6ff06fbe142ef8d444b3bfb159a2a6cc8fe4a3f401103409aaecc9f9eeedc52917d8a22c6721bb43192b146fbc3041b5a5d2470ecc97e3e7df20bfaecaa254d8d788731742cb4ebc200f68fd41d36b23eac50254e9f33e5ca7d514a96acad35eb8e52f580c7973974a72a23c74467355e7a5dbeac60fcbf5bd3a5e73adc469067de1c2c28845227bca7bcc0b5bb0935662f3b89440159608a8ad455c6cd0c8e68334e5625bc2848fa562b08bf566b79f87f738c1d373c08bb4402c379dfe6cb025937d85e12baec8b0d89fedf79fcef14c47ffa04f97a9320f6d4267747a87fb63105724736a436e5e9e9e8c80e0b981f704fffd36906832efd63406e7f85c46855960bf10780083f20de391d1a9f098d723dd6e020c09f84c2e4494961e727beda34ace46d08f98469e67628255e37d012a8b41c7262451c1ab67c4632f98742afdb6b47155dd17f8b4d3a62be849476832e372144ea5bb15af6ba48eb0852b06c5624b4d9738bd7594ad63f67dfa71e7d0fcc905278634a03734da472e8508b16ac50df57df46f9d0b46886fc08ddb9aa7652dec757885ec4b48ef8b1b26591547381b6f22cc30dbcbef6c54b0c09f29516c9c6d810fb0b4cb2f3f07f47372d34eabfaedd5e3a03c68821d1569f6c6791a27cbfd69b728bf3716db902b3a3a872916edd4a95f84cb94415c505d5a0dfd8c652d411ee1a1c6b53e63f3f74c26870bdd46e63d37c01344de86880ca6cac33599f6302877f4fc9547e7a7df42664b9dc852f5d2c3f9cc21fb6a412fea571a7d49c34c7c51e1fa275f95a18e67449c24c0d2468b0595f724fa077d61841c9d67ad8ed0be7c27d42682632b4b721a1d9b8f1a7c845936f0a71b4f16098563f483408651f52b816c3cb14ff5cf3aaee388b428097acd1296c6ced5cac03336ed28e9bb418736fb45ce69194dd94e2b2db685dca7c727884066e7c10967d2992382b2ac9846287aef634d1603731789cfd91edc37aaff44c14d01352d978ab2113856d155c6ba592f8a71f90270962e5cdb5a333ff6f6becdb80be66316d4970c8846b06861cb3aae3ea84f5147b4173e521ce91f67a89772c55222ee45aaf3438dbdc1e955b9799aae63a80d613715f062f7b9b1c8d7ecea0289927c2998b7b1f4bd41bf171b6937f0fc1b5b6963478858bd15677b6ce0122d5c4777e3d61faaa7f622ec317229c6c69a7895846ed3fffff89224268c821ddb17a89a2f7f893a7189857574dfd5756677e0bcb39be5c73a99bef38143a13d888d3ed2c63c1f9eb7f1d7e2c76eff28df4ce3948c2fdb782a67f31b263fb82a32922ae74cde2e6518de084ccaccd56ea229aa43dab0e5f0c59bd40c4db179921aa63af8c49c7c4ed1798ab7a7433af73ee7d767581eea9817465e45540bba97b0adcde1573c13629ca3a95249bd01ea7a05d1c7095329a37d2b7276b30cb41e6211c4aa8f519c197b49c5a243a97150cbbcea2b62db2c5cbbc519211b8303", "63", 0, 871174497, "ed8b7e5bb9b41806932990b2c2351c3d163bfecacc42c634f9cc943703b86d77"], - ["5dc1bce602ff337b0dd41e91d0692bbea9a75553535622f1afde0d5287bf97195c6af7ab41020000000100db57ddfad53018ddae9754ef216e6fa8edaa36f6450fce3d45674eac08439b51c4253b0102000000056a63ab6551c0e1cea10156b6320500000000005d10af86", "5153", 0, 1602741303, "17109bd3260621922b1d8e8a96ba46c04f35f4da2fb1d41931db84dc1ddf30af"], - ["da83c45b0192ec44098cb8d436a7724fe8de8a50114b0fa28b92efedf1b5d9a70b0e96ddc10000000007535163ab65ab52faeacc1a04d8af6200000000000165f1257301000000000553ac63ababad2b64040000000003ab6aacbb79ee04000000000352526a00000000020000000000000000491a4b0400000000bd297fcdf40d2ff9d89b50a866ee61b5a416ba840cf3fa95a466fc160117fbe4ed55a04d5d2bd6e1fab8a8ad7d63d12b926a1339c29520b66906ed1d8d18e2b75c39c7d23ccd787826789171e5d3fcd8767dd7249cd9cc8d1d55b14ec6163b9500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000513628920ba7a926d496a78a711ffcece462a99dc730b6a5619d2f45fb64c3b81a81ee4a95a5909570b86798bc59366604c97d4dee7a13ad598f68186662ff65ebc7ad96cb5c49a5552850c0b840c800014e1f8759bd99becefab841d885cf2f7a4ad45c934f5b95e4da497755426c50f19494ce83f573b1655f6232af70c51e0208fbd545ddd6f35337166fc3aa12c6a090fc4b7f1c1068562423d8eadb58bb590300307510a71a23e29f8b782b239732a62644c2583bbab77bf1a66cca3010f0070b2861fd04789159a198e85c158217238a42af088d88bf5988ea8722e50fa747251026865b6406ed95f0fd24207c96f0e2b69958c87ae66e46698f7e7f0bf32ff60214e2e8fb394d80f704d66d713bdbe23896a6a334aa45b7a14ec238f91f1f6c7e0227abc039dfc4af8a8075cfc3af5513175e1cb6f159d1915be38dc7f74b0f5a4e022f662f1a087158afe29f36578a497251f90f37e20109a40b470fdb22d9e7ce96020db3d77bc75234327941b89e1ac9adce4839ce8f19d3dad78be8bebd74ed0b480326b28cccfce1ab3d451296b49abceb35937dda55b238d05ead511939a84084ba2741fc01c7e87f0a5ea869a8a0a99e1552fbebd62e136d4d48a89d9d15d75fe7318f2a647603b85e49eadbd979f1a1eff1957f592af8b830b6bd6615a0c2654699a50883145c6510499eae99299501be7beb546e9e4155547896986158096b522fbc88cda061dea11abd06a60c667eed28d4f3d907d0c3a6a94f70c3d116cfc7f1d9b39e8e1ea81ab2328ed8a0140c9821663e066330783ac0b9f5d151d62d5f9b60a7568949c789cb8130cc039426c746aa17f2084ee1444a11c1197ab38f56de69f3957b3830fc0ea1ea6583d5f0a3c0e65c0aae923d2d2712bebb349ffe33c53e371e94d0894c5ff4574e5a67b5dd73de63aee952995d86c313dbd6c654b2bbcbef9cd1131cd3221b8dd70581faf1c8ac8fada4634172573a821bacd86547f5d2615d0d12963c5b8cdc96b274cacf2fa0e9a0a6e1a04834783f7c0e48335549d96226a1b162bd46c6e9c6cf04c3cad15d6879e51c8d1e17c97f811b5de1572468ad1c14a4e959a654a2cb55cb94da2986488af7793a8c46ebafce2a15b49225de868a2e0f19f42f7fc19243a29825d920c6df910541811ca09d0d902819f94e03958808bed53b3751005b05b4de9216d88ce966e38a14a2e304d446ae414ae4d4f1dbd678cbb057c65de78ef1f8ac689abe98b1f3e9122500783005a8bc30625230d97bddb31d00998d847110dfb53b0833a1925ad6eb0b77e599505fba891995e2b2ac60f5ebb229a17dc24c6ffba2e60898b49611f90b515b07563a2097526319e37c21f26901ddeb9c395492eec4e485d5195d510cc81e6d8758e916da7a24d1604c8d6b325b1036bab09fdfc88d63dea7d32885eca8972bae597da054e03434a35298e00ee171307d87881a464340bbafb8fc2125093d5e1293b02a2585f6c12ad59e9492ced7801cfe89854c27308b9eec698101ddb76f4166a3c38ee6903fdfc1d0675515d3301c1ce3e5755d9001b0ca1939e455b1067fb5a3fbed89c26f0cf5592d4658468ed1d83305e5d396a037ceed9dc88792b3c8cc98d379d4b625008845681d00f0a6f93e85264fb0d65973f84a7e93479b7582cebc2223494a0eae482b29bc8b9ac5b471ecb994b69ff4137b278b1f3ec38416906a058ffa686772033e0f1ba807b1208b5c6cd405699ae7d553457262d1a0680cabcf6144feafacb8e575b30c9676741685b017af171d0d2b08ea3a58347f3006fe132db2723413a050f845a0fda80a1e5d7710a2f116801b0a1b91a46bb7afcb2b2b62fc00d659a35681de8d24d9cbb375ef6065170e79af3eac6c2fe2463011c9988b9f1355e82bc81a7fba3fad13d5082387061b52e184ea53d8a71f3d45cf4a12968b95a3c0895cd862ff45c3c1b380f450a62a4b49dafc304585edb70b36ff5c619b93e7f7dd7c8e9b2cabd5fddf60e9154608edf291eeb9ac45026879bbfee46f8aa4e846cebbb04a83896ed1c38004d0c354766b872ec31bcd6f20fe3bae1a4136922ffbf95f956f025d759fe585afb463c78e3c03ebd708c1d18dba0d011596680e4bc5e91a527b058b0a8ce53eafd45a69886f8292e56da0603a6fc8e71c7af2fa94c5bf21aef85ccc405ee66f2762a8d2a129bf8eceda2d32147a09d081be78a8a2828cc94c8298939efc35aacedda42e859635378227d1769b187483b9c6724462851bf3942fb98bcc7d2204e69cc26504859604000000000000000000000000d60c99cdd5613343518dc852c4d0b84d053347498d4a02629eb00e961dbb007846692f4871c4a2805b3ba857041940639298af31be2b16c16529e18182991b98596fab62e5191f8c9ad2e57508fb68b2d63b4fdd94681e178df50d2e1319cfb800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af196f8cdf210500ad20af7286d29cc11ad51c51e39d3e4b6d340b10b360a2887dbd81a867ce0e9ad6e15e3409cdecbf251416da19e8cb643fcc6ba80c0e3a0ac6298dd67b43f42eaabef609eff2c195e068cd59fd0c352e28b1b29f3c89de14c41ae3d8918110ba5efd502e12e51fdbc82ce9470c9ba26975f22dfa1f6a61da031442b239c2580f13adfee0d70f5e296441828783339c618f59f2b5803c9a0b9a0306e2b45d2070e8947dc3e53c6ebf5cbb46f13ea43645eb5a37c0a1a66303a7ff0a2888e85e55b766e45b97f474af5c938a29d04fd1370d683e3cb3058c896b09a721aa1ddb40f841115d4fe92abe26616c4ef82eb52e20d7f22f0c4a089106357b022d7abd065c8c92ba3efd9f109d64fb0f5256d18fa5588a251b4b97057d2b92710315dd34757e9906195eb9fad396acef5c18934c5a3a00e72729c583c3837c25e80321cbbd0af3ba52a8fb7947104f002b683ae4c2a58d3a94966047ac939b7acfee032b5be2067c5e5b9b396568347c041741f8d18d1a6935fea7aec808c3d2d66003031dd091e19e694dd343f84e26629ba32fa8264d82e3845c1c09a90bfbce4e94337b4295697ca9b02be6ca667e4f8884c224c18242ea779d0729e80089f82b2eac7a7e1b2f09d87b8c7ebff6bb21a6d12c1907e65743ab7cf9936c348158a658ba10d4006b0be0ee81d60f9f00486415ba87ef6199ff4b7b599dfc17b04386f5247957b8c5e757bc341c13d950c49409bfc885d1c3416e3949414707e138aff0cf58f8c31d1038fcd58fe3c33abd36c75ffcca60686861749fe9c5a772debd9feafb658189b8e025169333fe7ea3e630d4af29572bc58aa2ddd9a0ced08f4761ad0608229019d88296c7a5a2cff49d41c48fba0c91f48c35e7b6e7badc9d42a63189504ede7bda0cad84a25311d1dfa5fd806d8d69cc5d18d56e0af7589ee3140a81d8953894a177b02ad80afd0ac07a28eaad30447a094ac69569bd77ddaf79f675bfe2cd2bb80379dd1e15014406d12f0fea2a8c8aa3523d1f178345601b3279b557170c7d73ef0e8504afda34b61f9e497bbfac1c55a20c113db78a3289f8bce18b1155d1534c3a7ec3728c723148822d061a32cda38febd5fa5119efa1d4e501f7550c850783a721b6d650b42f2414bfae05eee6759c74868f6cef8b096370bf5ed1205976ecff4436a2e0f07c6e104755bc6f9aea92b261c61e68fc57fa54687591b942f7997861b25082cc1ab3841296472a82a2fdf2fb8998f382ef4d0873bccb4211f494863023faf85b0b704e2ed2aafa8e3f8ca3ac00258c59a75bd302836ac4a9bf466295553982747c477dc0ad9368beff67a7bee975ba136eba6c6461ab8a1f8cc164720f59691795456cb90136dd88e38026be7785a856950720a635abb649ae99bba35823b6e2db0c3dfddfd9cf9789ecc5609e94c86e4f9d9b7c9edf03adb29031136be34672d608f3781ba29cea52716d4ab219d2df8cd0dd23ea7fa1d62ab3ac258f57d3fc0b4e7c0c4c233276a09bed6a5259e1de242f7f775af369f64464a988e84db7338b7b16b52b443cf5cec951e6c38a56ee8da8d19f3cc27d54c56d60ec85fdbfe672a7adc0a14737603d5e32bcff5d438ab150ee7c1bba3889634b6fb217ff1fe1add8428267ec6ea785dba625e42c5be4da8e41b6c190922f13bc912d6a78b2b71279be215a4be06301c31f770a42a9af0add1e3d3b3c6696ca9a0693bea4e699cc4be930f367ac3c425c247de3fb235e5d1b05555ae919dee430bb9bdbcc95dea12568799048a508f8a27b835ff10757dd23b01e9bf76afa07aa251a7bce568cf8a7058b012c0ea6bfb4c0e6739f026830a475b0589f7a89f0c3a0590bbd062769749b007a72c66edd910b85c90f1249612e6fb3223b9e819d1303b06c040568bd5ae386fd439f05f21584969bd632410413dc528acca9c51cc9eb0fdccea39154719a73da892d9af011fc0fbbc99223df592bd15866447b245f39264d4d71034310f07fb602292d8828adcf0e4a08e2a329fc1023d754aec146572b258340b8286a1b0905fd13a7531b8c7abe0743d48efcdea40427a3e4a9c0c189bbd365cdf4d4bc90ade1bba1d9c4cf75e62fe91a23ff8bc9281953d7baabe70245f9bf7b0b7121e7a197c9eec8ec8874da375f57349b46335490beba22768626cc151b03d98a15a3bd27660665652ff908d6550c6810b6ba3f1070737cbae4fd9878ec66901621ea54fc2851a0061535acf88b43cceab4f3cfc53b78b130fc1b810d9d374e08c1e4ddbaef77147ce826d2e2f6d2fa41a42f103c9dc314d5b73739fe1d8bb3532eb0ba1ea0f4375cfd9f43f5a12de5484d299d1f7f30b6f9ed37a7932c3a71cfb5e94706de825e0abbfafac97ee1fc0cf3908aeab138f776720cb917b047a1bb84a604", "", 0, -1961460397, "060539e926e9099dd4ec5305c0feb128e24bbc752f545aaffae68bd45a5d06d9"], - ["bad8eba901bc0eb3f1baf1fb3862a6d4094a2ff543e3b369c0646a42148b8af42efd8aaae50200000006535165525253ffffffff0471e5b500000000000865ac005153636a6366c5740400000000007ee37804000000000451526563629d070500000000016afa8ec8f7", "acacac", 0, 632984595, "1035beaf256c346ebc296386ed481d64c80a25740cc9f408b8e62b6a8a33f889"], - ["0e2052e601f5490cceb69177e69d6c4742a0330287224a9d0f8b572c8e01fa8b72857a44ef0100000005acacac5265ffffffff010154d00200000000086a0051ab65006a53c89e9a19", "6552635351", 0, 1541011043, "a6a9556ba5131ab9dbb4dcb81aaf7def7cc3bb1e96304fa149342c8af35cb62a"], - ["2b92af9d048afb8c498377650832d2ad1173e10a8896994ff38d1858ceca11c1573a2fe6e50100000007ac6a006aab5265ffffffffdd67724ac13168ef2f98568f6f2a1e1d9f8c5c43467eb1ffc1c961d2efd4a8c40000000006abac5351ababc1ff34a725bf51ebfb702fb716c6b9d432cc44a2bc29c58d53ea9d27ec73fb19b99c653d0200000009656a6551ab536a6aab17322e450927876ddafe25c84a5c5e7274bf44ab40fa652ac521d8e65ee450e1e419437b03000000025163ffffffff028a095501000000000153801d040200000000016a13fcb519", "6a", 2, 909642013, "548c905d6a92f83eb47cbd46e783e6a9a11221afa203b77c59d83f1115cfaf66"], - ["0c555c11043775c30d8716886cb161bef009d1449ec9bef2526f240779ed86db07ac751589000000000300535201c893885c393e709bd6c52fcef75c1c13c84072d8231b3b02d4965d8f4bfb833c3fd0ed00000000060065655152acdd819d2b7ddb96e668d044f3bfc8710b3eafae6f9c38532aeeb61251221a85c145a96e5e000000000365acab6b22e07c8af29d79eb0410094dd83fe358a665fb69ea52e3896ca57a0a3354052de4ba4100000000009c9f747b02d396b003000000000465abac53168f650400000000025100fa3d64d4030000000000000000c99a3b0200000000d9618bbe4ef50ac728af3d263787b69326243c1b65b9e481324fa922b41f7a394044fd8807936d7c94bad4c41e8153ec351b720b74018255ba9bc126fc379f3ed10bec0ec6b78ab8d330c71d7fe71adffbaccc8f9cb7ddc6e9368d74d60eccd70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064c32e455b29db0832993755777084a60e9cfcfda7333f9acb9d6606087306ae3b7779c5ae6f889b59545365fbcd9ee047ec23930677459c911fc847e6e7d454543615e1b23b4280af86e8b1207c4e9e363e4a59283c88c0197d448fb08bc4acd6505935ee128c8268c4399850734fe0f042ecbd3b467564353624e8f61ff454020a6121ded076e2a2b2e46ccc6be7ab5d365d3d223148018050c76385965db8cb0300ef41787060914e7beab9e3557a15d5e7b89bf564d08cde2ba1110b013e0ac60a19218b773f86e7fcf577c8c5f44c5e522d467644c559dfa7bba43f63cc1cc6cf1314e802eac1248f1fc3413f3ecc72cfca31d407b33aca2871890ae6ad4deb9d021df5d48101b451ac6a9c6c10f9aa9ea6fff0e46e80fa86ce22f704fd2a8713080324c1764a859586d5122f97b12513fe694fae72804f0ed0ffdf9fddf32285731402206d1adc4e420aeeea2b314f1cedb362f588df86fbd74eb9684b5df5183929680318df61e33842761d1a69c967ea95d17bd102cd4cdc1e97820e4150c568b636bf0210d341240f10c09b68b90fea140a32fee8293a086bd8fe4f2525ac30846de1f372e129f77340b307f3c740b6efc599bdec4a973ee5c03ed03450dd0bb0d9f18a6b1ddf4842411910da8a49bf92447c771d77497ab8daf01f9a100453cd6edeb9384e241e65c41022f40d5f982b97e69daf710c9ad9900b9b316181ef1a5379527ffb4d86d6d39648d8d19f9584abcba71d97cb16b3b761794db272eb4b5715424bc71593c6f914d6b41a1a28643ac76d6eb5042f47bce688471c51da394bbb4ba5700591ca83e89bbd760c77bb9b8c53dbaf5362c189d257916af805e8f5e33153763d13f31766a85e3ac9d29dc6d329adf5e21f72d48c913fad2e2ee1b898a6853447148642f44126aec083e74f3937beec374c6309f928497255e561c305ce83074316b164779701eea5efb3480a36821157533db62ca1028393d33e3139daed91cac68217a8e9c639c9a1005ba40b7c848e102531d97ba832aeb6bf926b831a6c1e7de8e14d08b26f40fb86ad085bc6aca16c167e6d912adde0d44d82befc60b4f925b303f99a9b7b265144ea09bb539169f798d93c418ccb2fc601dd9a513550b532a052e24ddef357dd2b18db7428991288176b11a7eb249f561a2866e8a592677a9892b98faffba728c27de2215a1a9730475d74dd153208edc6bfc4e39a831e814fe3675bf795fa89091a983aefcede555fb0d3a89e571baf490415e648d37863011f1a7cca73e11bfe70ad44f9f1923af2a0dbfffd6841d4adedb58b54eafe66f703ae665ac606b69a75969e46fc41f291d88fafa754930696d7aba987da15248636df50839988f2beae734041c0127e133ac5956351205893520ec804796576edcff239aa4fb65185a182c3ce79cac85938f36dfa18650812e0158cd0b3fe997f8f6e9cb4223f3306175679ba33c6e8b8d9894760a267fc23778573acaae3ad14d1c7bc0b5122838cdb4d6c9a746f304e6bb85874607e953d83e9f3b4ac75150a3ef5ad905ba909a802226c9e94242a3db7d3fef355ef9e77144cd1d5a4bfca7e7742ba3e575d02efa7474a00b55c4b3cd176cbd3bd945e642f2322587f3199fa445da0039adee4c9864c22224d056bfd001d3573bd6375fa4e1ee4884d087887c3cad008c8e1dcf256a966de29b52d4111372e384b11d3f7324c38e22db1ab82a83b614d8784ce7933ba3e5560c1036b92af758f24083c5375020d8df709f884bb46989f6951a0179766abaaf0c3a4877234ed13b05263cb9ca2186f77f14ea4aea4c72d8c3e0fefbb81f08d2b2d7dfae1e317e2a47111bff33c947bb493060e178dbd00d9cc7e23290fe4b09bc5f6cf3d897fafdd79adaa7a8880c2e97e39a84947143647fb331357fd14f377190d853916b554899531391bb1f1ecf1aabf1fa3b71a2f41d78cf154bc3b5b7650794156b266323368d5b49db28f0360603500267a2e7100a40e499ff6b61cd5d85a03a8e3e887f913d3f309e37f3efc08cc013aa354cb18c4385d79197047676f2056f87ab7331d64b8e3849efe0bfb4590ac676a1744bd2101796a49ad4a0f6e900f84cfb48e7a1263d5a8f4d498127944604e966b424a65f7e682c633a23632b75e7eb610cb6b2048af68b1f74f40c0d708e2f1756da9699f6faf5627d4c38cac7f0528b4c6d854518056c159f85784b4d5b791ffb5d1c5cf54427a40f0810cfe24f405c6dcba0f5975106670e104a0f1b6ff6428cffa25cb2d9f8713dbb3000000000000000061060f0100000000c49c8ddc38cfe53986fd487fa5736405fb59828b5037381f64740522681465e44a8abf3c7fb18cefce9d02ef7429773b73bc898c7cdef533a1bf2539d14f5daaa1b5ce7747148b95ed860a8304656190d941d0db7cf83d7abd575450370ded3700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fb4f187af42a78125f4c5fb204ef37534d17b2f66441a4bf2be9273646ac4857d82a8efd43c78d778f5faaca01b54eba5a36d4c3844b4bc08e06a178bc37875e54114b2f18f910a2c7a57c1c515efd720d5b98ffa3d8ee4c5c6fb72351cffb4abeb2ca31a5944896c5d522d33928211c98430ef2e4ee42b9ced4c40a52e9e88d0207e21dbd6348ac17c7a15adcfa6feec9fbdfa14349ba91d2ea14e983902853b303193fb9e76ae3d9d015dc5223f0fe0fa91b5cec0503259cbe0ebedb73e373ac0d0a031f08999d957544e7caaf3339dcda8ccb4d2073ad756397ba55901aa78167502ba7fc454380c14c771273e9dba7ee26ff3081a4a935ac50830ccf394658ea03030e9c94905c05da0baf68333f9a889572dea012e5feac6de63f9d24cc1226266f020ecc5c6efd2294d9eb2bb6addacd5f0b2d699b393a8abccb639c81a03ade844b0311987cf26ac24c26d852ba3101e68de0c55645c98e44d2fa041bdc95e7e6d55b032046b532797e7aaa8d0412810afd1688b6918ad4f7532a58ee891c87d897226302284ce026423885d88c4e7e7b559a6a285b5d746be2b5a48b11e6e1a17816f2560a2f83aa54703738fb598197e29ce82e93942d83733859a7fc595e9e1ccf540b4ebf264006a489dbf2f1aca99267f4790e357349c6d2992475b016673a6c1b006f158b086b6d3d612eff30ca6f5af00a49e884e5792972bba19f0262bf859a4800d65898ed6ba2597e2f88f72f5a1f3d07dba6cd3bfc71822166a45f14133cd9b6dd1e9e853f94d5bb132ba09c6ec60b7defacf6251c1a6cd6022c431dc7bd7dbaedb732ef39b37916dd609f24dda32d21b5dfe67790537c086406966b181b2ff2aa861ccd8232c52d55e739a6b6a988fd629468a00c08811cb0b5bbf1bf3e14d72bef5af12915d1354e818d902664f60842ad808e2816a5201feb695790c1d21c2ab4dac678cad48f946e0a160faad4ae1e7fa86f2449f4086d3866a34a282d31f4dad680fe5bb088b41790e6757e0e3b4cf00117da6cb4fcd3551954a7459ca2d61b1097abaca512c33fff400ab0bbf987ad35c1bf8dd9039dc060520e3b4483b22d4722f5516f84a806f15160c88537e8aae3afcd637cc58e8882a033797452d2e0441a15fe3d2f3ac76f0f32ff63708f1e68a1869addb2344df940376fcc0b1a95c37a27583d2a84080a185c00a81ef7d726e0fbf135e8331f09484f4a9d823c50babf33beec2985a71d9006b78c60cc44761092f82c93be7e200dd48b28865f20586bf5c382bc04d1e460ad29f49825e02c9182585c2bc670e21d623a4451902ff03c06e75e9de8385174b799376f34e07cb2933053c14dda6936c9dc7d292be56e178270a3d52c988e9a6a84926d0daa1838069e26e378d03311403bcd2cc4327df86c42d71ea3c8849e2f40521e76c8e3ba22991e8ec724a62801ea0da8f542863c33734edc5b043f0deee43fb7e503841850e21e1afda0fb03f534fa664ab7bc0d967cae323e17068ff06a1c4fe2db3fe05e18c2f63fecdaf216341d6ef9e25c85b7236b63a8f142ec67405f4942f4b572eec98149416dbc5a52a20dd4828d8d1080c4193b2e68c733d28a44edc08a3ec3cdbd99e0827ec9a7ce3b769e0e879dffd8575320ac43c6fc922781918575d02580af9044d408503402a5523575e64fbace3ff418a331db7fe21ab98da44811e2a66765fa2c04c4cea9d138c4a539ca73b6f0e224eac33d9bbd35a3d3227b3435b0e08a57b9be9212380d78186a58db7b411e83b51e5f58895e4f0bdf3ec3cf71b1357d53454fa0058f87140832d35d81065b3da0a6a8ee603592be15fda1763a7b6738576aba93978042a4b6fb0f0140ec4e95fecf8d806d398c0f3e4ec841b8ee98df022b5243e634c3e07179aaec1d7ca4b9c98870ece30d126178313ebce3c1592a2ce1660295f3f84ee0414f1a66bccab470b40bcb1dcb1741d3baf9bf3d3472f7863eada3dee0c1631c2a9b1e7b745a65ce291f07b054ff8ac3e5b3f56a74dd41596fa4db99835c5f952e367b6e964bb93b8837b6d8b456b38fa89cb3020c13cf32735d19afe0e3adfb8ad79c934ee51a43b6eaf14a344fff0265122768b891fe3b76be9128dcddfacefd2538c631bb063207d36e834fd6fd7087722b38252191f9c59172839ef5c13d230514bd7d25014d0238cbee91aacbdd22edb78cf68a8961e66dfd26c13c7820434ceaaf6c57a2d7db8b43d3271ba38ab2a2a09cc9887f342c977dee0049fa2b8897a7f0872dc879e0f5939f610cc51bc30000000000000000703a560400000000b4cd80fa7e467b58ebd8a8b1184177b31f500d2cda4a6b5f90f28f2b218c0e96b2ca02d3348f942b70cae0e7cbd538f35cb97a7f11624be1b21c123395543d83d83f8f48cc650fea4da3833dc8b9cab2d4d6c72f185a49aab1e7d2714d723bb1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005979b39518ba30c4c13b8644add18ac10377a50aeca0a0a66e060b07f35442d7747bf5f0f6d0c6ca9690a37c50fb964c3c419dc6e8c5edb2224d4eb3b8e5a7382bc6353cdfaef82427d9b477712e41ad07649c1e56cc7a92654a5608b55dc13ce34d8c8363def8021c401e87bce2798cdc44cc84f58a8d22218863d7d0cc54110202b43d6fcc748374bf0cdbfa6c03b54bd24fe8823163e2e55d45c3b0265e7dc9020683a6dc6406747bde1c1ff77bd739a27236af0c57f90cc843d9a4377c841c480b0b8e86600b2e08f634a11ad3feb4b2364300f5b78cf2b283d2330be9bd08584f2e3d24dab1aa036feab67703336e7120e10f5918d882ec60e1eff8a386d04487022efa4b50a4e208a4124998510505dbd8f29eabed8c2a63b8b90af7485121a9a903103b4f1d4bfb4f3314fa8b43bc865d45ad21d20bc7e3ab94199f61eaa1b73aa0032ddef1286be8f1fcf5721a0b1536fcbc6866c41623ba5840a46ad7ef63481a57021bc9a89c3a6fd3172b9bef3878b1f81e48736b68142b853383e84e5fcc8cc7fd030da93cf23a50e2e8a4ff32cb0b1ec6a13263e20c87257f9e1eb05535a13d969e120d5072baf4f6f66e0c0e19e94fc63dce9b4653f9c7badd4c5e3f0b454f014b4302b318501f5c7056508208299715f40b31b98cc7a262c408aa1b4c6dcb4c8189d93ddd26e0306b4bce8c59789d8bd624d43952b836bc97be6dc88bd05efd714b0d199ce064e61aa33d4762b788d57127ff2d929aa4917c3d948ca5f955cca46b1b563f6e878ea1c3b83dde60762060dee8057de517b756aacbd2060ce9d5e227ed587e3d52e861c91ce6e25fc14682a9f9d63ac465286c2476e25904a3e6e46ee567583c4a95821d620d6a1db247ed9c171804facbb6c7d8ced34f5f7f29fe7aa9bb0783b237a0e6cf2fabd0b33a3229e0647ac23877232bfac1c227486eb5e8555dcd140aa8749c83dd851245c8b9efde686a820d19d58b24dad8c6cb92b31b53e3d8d3458e42b8a3a53799bb783e6f9c5cfe10a172c11125c36d0ba84f655595348f51089a09392cb6929d70b7ac4adaff62f1d6a0f0902785a08420242e05616ae428de339e78c4c6b46102831fa00b571301615996d1fe47e1bd46409046f792152bc409c3e134b531ed9903f81227b6bbe8e19110cf2787f1e69029f3b647f78e74f085cb5e1afba2beb3dc8d4ea6a352c0aa9b73e51dbed6c92241d8588032e7c3f1483dd2680a336ac95ef743c49108233cbd4954fe5aa497aa4426f94bdab9d1990c55665561f7ef8efbfbc184af4dc9b0ef3a676217117f19e0b5f6c0961912983c46c5eac07af673f324d036c3eeeecbe8e4a42c0e6d1225e994d20603959e0670898622241ef3758eb25ecc485344ca5d3fae029a39d6e0e4a0a09926f97813698564fd333eaed5f9eb6878c14bb468de53677874f986d81a9ac0f73b3dff5aa37769ff66aeea7278eb27aa5f5c1873d0280082c989a889eec582a21e3145604ad867959b000bb05759554f3f81c6af10961e0a1098247df616a87d010080e84dd5a424d2dc15778b593ce8707d8bc5e6e9244df8d7485f0431ea009dcd62a9bb9be26824d5de12bb83778d86e4e20d5c2c9ac38bd8f7f8235c6ae10c4bc532cf934568cd8deda6b85e96032cbb3bd5a6adf7039db402c30783b8cfe8c48867120e9323c19657c6af61b371a5e82b4031ef2749483accb6b5546f58470e2aabe2e1b6ed07af89dc76eedf15d467a5f3219127904b19d993046250a1b1a6d6b59a9f301b639d403969abe1f3c671856120695643a1fc46110679dd7d013afb0a2df1c290cdbad8780318151bddd048a1a2b3622af5fff5b1a9a1e1446df823e67d4e625c2a22411989866f9b14729184fe8e29bd6382554daf9822e0331dad7fb0bf5db45696bea0f0de86d7f87b965d324b27716b6bb402eb3152ee26a5195f8da741e38064e812d8d9ea3da5a3324b2b3c15f3b7e93ab3f00224e3616d31c65aae1449ab79d934b7897e77312676023686549071d24162558542202a6c933e729581f6b0d7ef447a22d6d185dc194e6c2c5cad389350539b0088a6fe9d53d63f4aa3a2768774446de7d6e6f5edf346ab65bc5385dd46b0407680c062baa157ab9962bd17299cd42e6742f2c929c1a06783a3287822020e78e0a1921eed5be2b897050dc38d7a7a0edeb95527d7cdfc56b95866fe52c14416c1a1595d72cf6c0ad9df910eb6923231b1ac2fd48e621613bbd137ca33d24ccb06eeac1fd993c231760fba44b9d46b7f704a61f51f0d72a018de4c26e1f2ba57654b4222ac62a263e649d0fed5ad5eaa875da6ff6265e89de92cbcc85f0a150e9837c7177d7b6024e8fcb062172c02511e0ac5d3923942ca6196bccce532c4eab076055b15e01a21e65501df902714aabfb808", "", 1, -813602244, "7083eece9646196e0b4f6f8db28e41d176ecbb03322f4c9f0b04a3ff89eac319"], - ["5ea4c489016714f3a65e6f273cf22e01357b0fa681aeab47414fa1744037b338ac7924022d0200000002536affffffff01a95b080200000000096a5253acab6aab6aac95fd3187", "63", 0, 1986878410, "53759258d0dc155db40aaccc7b34fe5b4f49d9fd57ba2f463ba04ef96873b019"], - ["d7f958360358ce3260c199ebba36c293fc660200577f629d6074149812495b0e994358c4fd0100000008636563526563acabec1e706f68b3d2b8de3ed03c6aa6d294dc3f02e8dca7f8c7df58d8f77020507374838cbb0200000003655352f89a0cd208c36ab6dfa02fc53f11a5576643bb28e60a08e0c5f59f18fd38fb983f9e23160100000008ac51526aac53656affffffff02ded5f800000000000552acac656ae3c93d010000000008ab65acac5163abacf6e2847600", "", 0, 1781783393, "84ff06f6522caddc6514b0844d8cb269f43c2634f6a0e3faa4dbb4594cf5c151"], - ["a72d7d1e017d68dbcf34506b073ad6ca2eaad4a629b6d975b7493b549c04510d6457bbd7b70200000003acababd8e95ba00400ca2002000000000752ab5165000051c93bed05000000000019b7ca0400000000086a6aab516a00005239e2a60200000000095253006a006a635363000000000200000000000000009c085c03000000003a4f091eb383e9aa0ab3580ea6eea5dc24f4de0015105c9f80322a1374f23125a67b2cddf10507284234d07199011529aac869d3c2a124560eea8509fc7273d1cb565ddd2d406d287dd03795ce3fa64fff1b5af2c5bf71c036e966d1fc86f062000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008aa1483da628d8e68eba1e2326b5363149371d7672c907dd5577b4885f69719562ef7f59c16131141517084f9ab75be263d929cef077244fb63c71557e08d96a7a1f8a48f016ffd838d858ee08487409d389dc1c511233852a1213bdeb8c93abfc32904998378c8aa1b2447c7213557f113d9ffe6efb64ca80a436b466ceb2500323460bc1f9550cce564fbc5135600a5f37f654ed797e61d85b8a6c919c807232032810ae34212019e50a5fe9d667685ea7b849a69137b2f8b0d806f09d19aea6ea0a19e256d5bdf94a3f1fe69710778b53338dda20d60cbd7eb92c411a35544d093e1ff4ef2e2b66c07bb05e7e48272587d1b331ab41c32f2963ae6986686027acbd0315db3710f5aca07c82027347527b3951642d3e42fd3f05bf568429af2806e12a02299553e3b3fc00de0ae51918f623386cb348622b2cafcdf4995983ce14da2d14032355ec8a9977a439174b340c929973a64a6dc93f84225fc911265d671e72342d0301b373cee741bd55f8bd1ef8faa441549b423109bf972a44be1d06c4eefa7945020c1403592f95409e5ff957dec44ae6d107db6a59f3bf9c08aa46b1ff86f4d15238a4cc5b3f7b545abf88011e7bb324d8e082100646676c0f23576ff8c476fac2970f5cd9cae2c9f5d287452cb4319e848b3e0dc643372e5daea23a91b10d83aa7ffe5ba5b326a0f0d39462e082cacad0905b34efbca28c942fb2201f278892076b1b6a60348bc8c821835f7415f393baacecbb48b261da5dc92485986a14882e5ca9fe6d75982b05337fcb192c957738d5c434a7587c634e6283151aef4d00787ae813f427d751256abb2aa16c7c866e38dda635d869b8cd4c99716d0e6a78a294771015140224cd5cfd756154a7f1c921de433a477a21356beae799b2a04299b80e02231708a71a0c90b7f7261ef78ead100a07168a1cd622df77ef3256f9d28dd4aa07998bc651485a0e54c45cdbf7cfe6b93112db02f9fd5c84668cc289bcb4b47b8056b63113470b8a71499bfa80f981f41da79e00868b4e8e04e401e185606d965ada7d6c533c8f49dbbec14ab95be859c3634e0ac13f4d2db6cd2d00d55aed9eb95c62ed27e7ccf7038eeedbdedba67e20962419d54e392d1fbc796c52722888c9cf66ddf5fc6b00808e871daef29e2357fba08e480789d0590e759a00b622f08d5387267e84c3c57e95dad2dc4dc69931bc15fb64b6e8f96ac22851dfce7dc0c7f573bd486dd3630eac00391d11f49ae7fdf59b0c0f8cf6550a866b27cef66f64751df72407b2299f10cca1bf9f846c78ec64f8ea802b24bf3d13ddd0f4070d3024d345494b914f8d58695d4b1ba88261a4a7811a7c992e9eb35b82e84be4da9519defe94fbdc66c73a9d4207752cb8ea1f6fe946469d656f7283b759f3f3d83adf11c941858d0977785111acb8570a4e8877e41e0cafe038cd6f7b89dfe62299a6328b7af50e53a7f8d43c986e5ab53dd3048fa487504fbb96129e8a3ce45a0230584e6a2a83a05e4ee38d6ee957354fcd937b9937bbb284b5f8a3677714774ec9971e29adcfa4f494e50bf7d883b8bc87e348281d1e5e5da66482603369060786acd740b3a644fc95117f9a86098462a135c5be52b96954dd93676894ac129c4b8c97c4c794d8d3c6dde2ab0322bfa551f41f13176d3e1d0691601b4de53fe2d205dbd7fe978509d918b0b9f0d7d9e7aa8c60d867501481fbe1d2baa3f0140be5413aed26c70e9b883f120ecafcc1aa7ed4cdfd7aecdca734027576623ed46a5f16d8abc8f575d3143a2e16c6803db1e8ba8bbe68688026884934bf69fd58431857542e55fed9ea9fb6d8fc8d6f9adcf0dd09f674e6e976131fbc563220f6cb0dee7cf5350844b6d2b9f361961c3159aceeede01c26bed60ff252a090067d002db499af03af3e9b76accc1542e3f09dd609e94424b37aa8d5f783fcca1ca1763719d1a71180d95089811c58d0e2448605df87ec17780e39dc92933d8a63260a694a3b213433b5838880fd7e5b39441dccb350434c12e2e5a14cc08a1a5837634fa61b980bd9065b413b22c9e044e6718ffb3f7d8c746ba57dd12d5aa8661ea20dcde200e47bed161459fed4053e7df1288cbdde736986f66cba2d2af0c872d88c6ac2352fa099c4515c15185eb6060dd4cd5711cc3e55760409cdc5f58615afa6f6e1c4a043f6d8f377048be2e8d4818ebc92568ca676120099352572175f1ce77cc3bae1982bfdc4d92ff79d9aa35f2a1806c69f425a8afe458188a7e3edeb11936aeef5aedfad2b873f7a9e03bbabc50200000000000000000000000012950f3400ed62d552683039e6f379df179d4a8fb56bb3a13c3531e751d9c4b3cb4257f8456db00c91e2bf0e851705f8bb01a74f42c6d823451662809dd6829455387197053e0aee493ae26a6678f0e7e6d132215073f5d9cb0c353113067dca00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000987bcd528e07c326be002b865eb2804727b514cb5cb3141d076d065c7a093b6dbe6395aea08301caa9243633feec82acd4b5aa5708e2a44ee2c9a68fed7671e2d85267c43fbf43029ebb2c4c10de089eeec3905526188355970e991066557cc73801e380484d2eb8312d8570f6c4807da7f771c35a866fb4cdd902010d0399840210b48b6cc8bf1e997b569a656d0c314055609f0b0cb20ce62c1f56778e9b4a60021321ec2f98473d6ee0e68a028ed759f99fe813db98b667cdf00e47d679c0dcef0b2684eda8557b63ea26ebce009ea71bb96508b625bf67a7969167bc3d10db0a7307f53c5709bd9d9406a8618a12eb51fbb7aaad86d9f5183d8282690ec490f1790322093591e37d1f059a1efc56e059ac54c31087d5937eacd4134305b00e617955022c69a876a424f352b7cc2db8c4a115ce8f41c9ea8ba41a8614c4c791cd8a54ed0322ea65fb1aafa8fdf1edda7e276c23afdde4892b189ec57d72673543fbe1320103005304dd3bd493b4e9ba08949bb231c4f5b2732e224c331874f1bebbc67cc13603043f371b5ecb48f712f7ddca4158e2e3ccd43f7050d34a7fc02bfd6671511f2c83a8114732c9a484c2b529b82b13ee5687e85708d4b4e4a8383d0f46f5f587b3108a70e198957e05bea648fd3acf3daa6e42b58827bfc2c7e6c919ffbf1edafdf1597268b16f3f9332c3816c9807add4901fdada55aad9803960c402062bac44f54bec6a97fa98cd755eee8c87c3528e25f8fae54eaec83c52770f3c2b5200b7d0abef7387ffe001e6f0f2c4e6ff9c98cd3fd457dc39b9a3bfe094749727ae9dc7f703834b1e0b5321f8d248b38452d7aa022b9d2de3f8bd2f9b0144a38d95e4ea7b5a273fb8971a2f46b9751f20bbfbccfc5a3fc530c2dd8fba50733817bc730fe83e61afc8f81ad2058538c4a7a4d7beebd0b12220ee98ae8e2a05165b328e38a80052560dd9410c353de3ba6a8f4d88e3dfb88e0d3c1eabb502b494514d46557320882271c3fe14a2f2f537b9de01b49eeb622cd16805258cba3b72691385f1126b9389c43df51cbdf7a7cbb6ffdd7821172a043ffd3a7541a24ad856ec5a22de1a7754b446239830fd58ca8be672d8cb4f45309a88ce1c422bb48941184c547918d949f4505d57e44239105ae74f205eddf4e41d2ed9e4e7318970e78541c7b41638333027e019242fe57a1cb85a6dcc8661a3b5e4d40e24e7a8d95a2611206ba63b1689aedac3490e53351fc105efc2cb57183db9b69ed310963fbd0f1169e3b606f5396bbc4eb1e7a821fc0b4c21865c9e93b8557d91a4480bb9f1a40c406d7e49526b2efc7aef71f4d5bd7032194eb4fd5d2232c171eeb65a304cb5897cc3d2dda35c1f57931773445ee7e5b9647f832c1eec30b7934e5de2103dbecb14bc31cd58f25946c3904fe56f11ef8a980fc76374905e988139ce41739f65b1317be26291f787e3926da63550132186dc997c12d8e42c5c575cf6b193d8562ee7f3f2d2251c1759b25f7fbbb4c814fe4a68de5372526c4a46a03d632bcf2ccd633bd7c7637339b774c8af5174d045b5a299a72748fc1446513014d8324c1c29b448eac36094023cafc30bc35a436acf2a6e941d80c9be18cd55cc532b2c7da79fbb52fd1f8bb94fd935210ed6bf7471f89e4b6bd1ca1b963b73099f3bb0d20e0ca571b0d6f6dc65a088cb555e8f4cbe7f1b6ec27778cc07dbd2cb38cd7fd3e6f15bc8c255a6ff3140250f9618946b5cde62eaf250120cfc74e096c504707399c96c93fb822683f1b57cac53899db4a7c00c5b36884c8f24c58b7b5062eea2e066752c3d4bf715b03cfa93da8ec1786bba2fe43fefa9c8b4c95e26b48da190beb3808062bcbab8f2e936da191184baaab34d84a2318903c78b9a432cd9512ac0796f0ebce937410331a01651a2976407d2b1661161733ad46c8338beb54e0e1fa3dea001877fb608bfedfb7107af4cc3096d8f86f86a10e94db4076b06eb0dfa1fee2228de863d9e6170fa93d626c65f18521db940a4afc4fd76c1fac543bdb95b39dbdaa8d74ea8710d25078ee431d0aa66b28b7b37f63c349bec05332f02639c952fc289f2c352e5ece2eadf2ff9d3494989e65af2147560b747621854846dce9bbfea2249f3cf41067150f0974a4461724213b00494aff114824538efdb72916bd41de188bb6f82c70a1d132ba496f651bdc980a8e662545942b0ff5f61a00daaf6e7dc1f8919825e6051ddb216829c33a93218b4626dfd5d642c30fbbacc7274d9a32a3702f8f4f46c42d9f2de5fb46334919cee98a87a70049baf4ed43fd47267bffef5830c14764ea7c347adb4e41fa61f815c95c05e9291269427186b983ae1caa852a25580f2059f139a9ba1a00774e89e8ccdf10022cf9b7f9dc028bebeee447692e49d4802b8fced18589adf0a", "51655265", 0, -525441219, "cfbe0a09eec11a0f693f276faa37f1cf8b6e7c764b1e825a7e695daec47e9666"], - ["f65015b3017dc69b6743e79bb838aef89bc7ef4ae0a26b050253f844e257830e4c3702978e0300000001abffffffff01f45f96000000000003acac5200000000", "005353535152006a53", 0, -302394150, "f1f1b20d8c6ce70d862e2e40b2778a130216ab8f4546d237fcf44641366e946f"], - ["398c7a17043b6ee9d7ec2641c492333e49aff0cca591c4f9ba82ce5d50981df5635bc19eae0200000000ffffffffed78927ab828aaace41ba45f264cbb946c4d19a7c2fc5cd69a342fdb13ddf4d00200000009ab525163acab6a5300ffffffff282c153cb9134c26fd83e5712e92f0810e2a6ea59674ebe5f29e31cece75f89b0200000006ac6a6aab6565ffffffffc65a583b29e9407779bc2b7fa4c59c2dc5cf3c51c259f2f4f7b24ec5b7c0695d0200000003ac5200ffffffff0137904a040000000007ab65656563630000000000010000000000000000cce64c0100000000368ab9891329b85b00547a9e90f619f1f6b1eb24bc4114dabf18743789017a19a8d556f55b18d786102e4c9c9d8f4a0982675d0132add9327aa295228af0ebc02235f0cb8315979f6f3e26504020ee4936800ab136c040596ff8c870ba74e23c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000890402268b5e02f469c884cc5b4488ced011ec28e8ad6926a3cf77e3d1c3e6cd8d5ff90c44b31338ba582ef376208a942375c5bf5687c0f93640588041cd99adccfd17cc63083e2b53b728c6fc6e3cb9a8be67f8ea323cf7a5aa99defa8eca66363f1c21e5ccd0607a63e991f56fa027be55f2422ec7a842a2d7e92afbfa4a490208d24fef37c53965e627ce2b031cebf47db3e1ec2fc47a7888f1572278a5d84f031cfaee7b72c3c99a34054feffdf105d79766633859b8bb171f80a4d9a29bd7630b154b6c53f9c497b19a7b474f1d705e9a23c29f074c9900c237da4a027e6548281ac8e1ca1ad388dd6c6584d6b71c05d2cd2c042858e7927335f8eccc54f4669002236d6c6515c22e5862d7187af7847fe7f07fa0a5057bbf8f5f75b57d05f4bbf703130fa40e100ebdc35786acd3f1d1c0980365fd8a8bda71bf318b40d6266a21ed0329767505ac9b9d9ee9d3433ace7c5790058926bba22366d0544adf7382bb343f0215d22823823284aba47fd34617bddf28f545241845a14d069b3475c78afb16490314971f36789b594717e5a7a8f1649c99c2369d23bb4b413ad422fb9c658d5146551280de397464163342b9256584e4cec002c5ed1fc641bd9af268b53e07911b1a44f63f7dfddf803b79dc3a319f1b5beea49b400bfdf4d7b552e735747322cc7c26cff7d64a14d29b465bf4056890cbb7c9c81464d4d82582d6d805568e132055d9143d1c068b13ca7375446cb46180d921d7b5c4f4b3c036142ad699555e46ca1c6c32b8309bdb33d531fefb59327d0a49bdad5e1f6396eee9792818c0852343870b3b386156d7087a50f11ebbbc185700c2a767f41d8a1a96ad80502cb8f7a45e8dbe7c4c5eec6ab7e746407a12ebe18735d358f2e9c55954dc2551ad141e751dbbdca86586f7e901dcbad341d3ca074f2e974aec8b634c332595e4c91f6261332decf7079e5a440cdb3e04e889e8bd0b8efe2648248e038b79bf73229c4a487ba0e07efb74f9aea35070e8cac550b6a5702e37b9335d72ab0673df8b7418d5d8e27ec9ae02b5619179d7b3080bddd88ef251abd6e34b1006e4d566ca1db304578544d8257d852edce03e3b60a6c1922930f09a868bf88fd3d444a20fa2a6d64ef7d16499acd94dac42f765a9b924534cc3d89adb09dbe82e3db435ccbb1398e2c7830536f16d8049eabb635720c27b29669a8b8072749d836a5526a9f13f53f227bf64f9236fe30cbfb9833c060a052e3bdee391d6753b219675651509a1d22484f70159a4a0756db0aa3dd69bd303c7009b69725918da4531dd021d46faefccbd34bf1611061f1763bad082d101b06ed31e4bbaccffccac2c3808adedf8d6313342e11816e8913dd1cc159baea4c701dc69b14e77dddfd149d2368d10a06057613cb7df8578afcf8f524cedd6c71959b9fb36983c01df2a06441dc8eafd4c905fa7e27831e63118e0b54ebeb8dd5dda99b59b22afe2221d27e5c606b659d116d65ca39825d8a65a417a44acad6cf9fce8a9d37e51c435087255f21b6f539cc04d8d790337e4c5702e648bb9b3204bf0b0fec16e2abd6774186bd15eb5e9bb75e6ce54d14d4ef6694ae305ed9cfdfdd03536958ccedb7c2cdfb9b698b88c43cc3665dd52ee7ad5e47651574d3cd91a7648a5ebe1830e1c22fa0711aaaf5c0466afc4afef98fb181da81bd88b3a9afcca084335cbb3242d9f4d7a1b7ea50b7c1c87cc4374175dc53c26b2d24ffd8558a8ea997f54b68c0b4f96dd55d27fc468508f4021f5cd7c1f3d9dce7e1581aea4058c50a3cabd6685ab20eb5a2c9a675a3c1f7f8bd5c799309befc898be9ac82bfb5b50bbea527481e5e590222ec335d156a6669028bdc98c1b4bb436867258cbb76001d2869f47e555303eca51c8b86ac22f6a08afda538b934745e00e6f141971c4475f840c3e935a6feae15f1ac0cb656b895e6146c35c85843bcce40f2ad6d44637cd6fb0e05e582420b046176b8d3a2f656a58bf2aab13ad109308683b8252ff9f29838fafb3fc59914bd6952526c2db233f9667b6e9d1cf1309356eea129b2aa6f856dd20e23ff741a213fe38357f842c4bdb1649444c5c6cae52ecafd3d0515a40bc25d7c4e788ddbc80919c31e7a7f7819eb2375d627e861946ad4edd5b0dc2def9b2d1991827318004dc6c47e1b25d739a78101d015aaba99cafe7530205c40562ab00ad4e5b0bc7ea2cbdb5cdb1da4e3514ed153b1fe17ac80405880980aed98b13c7beee8a0ca654817803397fb61e29bb80961b311a7bc3ab9a6a7489498e9b378947d3a56b898e743ea6bbe86cfa1457bfed40d2b0259fe106346c8151d8113cee2c653d8217fb08b17cfcc0ee478d5ce72600cb2128f931356fc7de13722381fc9356b9e7b3b74250b427bb01b8bd8cb8a79bc7acb687c81cda08", "5300ac", 3, 1173390327, "affa86ec3013bbec718a0dba9289cd7deca7f86e7248b6a7adbfa17eca735d97"], - ["fb3cd34b038db8d5f5486b48406a158fe90f385ebb36fe43b2d1ebe60d069e72adfb88b7de0300000008656563005152656a2db27e801657175d7c2780d1bb43fb99b88a80bd9e3ee580e829a715fc11777f205e28080300000009536363655200526351fffffffff4de5a3ce1aeb91ccd9840c799b57a837894f8c231bdb8e922bed6a6db23f64b00000000065252ab530063ffffffff0148ae02000000000005526aac535100000000024acb5b0100000000000000000000000062e9b57efd06e7adcdc5dca9b5d669ebbf3ad383f2dd9794b1d38d52b91a8f0e3ae4fd15b22494a043c1a326dc6d1aae103e2fe5e8e1c32899e7d3e24f0257024e0a4f9d3ced9578910ea62781616535d69de5bd83af55dbb6047b821a4eaa460000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012edbcbbd9f3e70287d7db7467c25d42f7a398d24ee97bcf0e5b79c51c7a84cf055fe123641f912788291e6549b1241e9b305cfd5fc97a256bd953229e3b627a79ffb084dddc135c5197649040838c49ad6261cd0020ff85fb4497bb6bca801879d97b5ae044c3338e26402528f5c162617f4aa1333779ef635458316d472660032aa3b4ac31bf1a9ac64924cee0d23a932d84f0fc168013db443754069df3a99e032ab3853086683261620f8128fdfe84695e44890d045d583b955c16aad3e1e5820a02e7685bdf3c95c058ee796e35ac38b26bf1b2b21bff20266145f7b3ebd0d7b71108d36b3f1691e3c755bc1fb989fbb13a5b0691e36098d94b028966afc241970208456f2e6dbdd48470ca8b5d2478967cd2f0d120ecc3ee129aa285df40f0f33b0315137d1b5c75452f60a7feb1e824cb5317229003fe9ba3bf85d5a7f598aa83b403245121107a4c06bab76b55d2e03ac9c0cca49f20b9fd3ff7b60f7ffe6c87756b02034e5bfb3407b2a1b436c899ff5432cb22d525c680b2cce874a632fd27bdc0b1031728d5eeaa7ac535a1f656c4f5a3822ecfe3c5bd4c65a35f422d20a55fe00bb85a9ed2c53a5e1db94b89440b1297985a8faa8291b0befeadb17681fe2c8c0aa387535b79491c8e51f9c19b8b66ba9f9e1c362251c4378b762c15a7f3b9df101572933d939d3baf0497e2b0b3fc1403161cdda7ebfb5fe84865f9128ed177b39a54d83071184e059de0ef19f65ffb462add38442734cbf261340c4e4008ca259a08c6333a7a562498b5a57dada72e894926a40ffbba99e8b95d91bcdce5482764f353dbb3fb8724096d4a1dc6367f95ff617eacb2ec1a520674584ae708035c25ab6dd78aee9e8d3ddc26af42582df2c6a0855f71827b41040970ec1e37e1cf516107f10fa70cb7f8c25f93e812def78bac643bef7079876e6e63701823656100b753aeaab1b1791fb336326f33ae0af46d18a5bb23d520cd93d677584df271aad8ee2361873623e2e2963e99472ab4d6394de87add71de2822efa2a232b5aa6a03739d57514598d4ceb711978a3e3f39ddca115deee210e03abb53e3e53942d887bd8baf3b152bb7dbe2913132e875c6acd5d5d9386f403ea32132ef57fea4abf2a539859b6eaff30acd352ed8ecacea8fa5c28bc133f7e99a6ad248108ac052292c788ba963abaf41a484f74c81aa8a2cfc17184cb4049f3ebdb3aa1f1af2fe27fcb48b42f1c367851ce2a4817d619f8e2a0b767abb150723b6045d8750245d4d495364a27eaa20a464ce75a0ef8631a662e8924e86b206ec1f93d58d412a8b1a6e60b0ccf0e9b88162fe7b0e53c5c9982ccefcb9ae5889f9a2f20cf0e8aa9aa9160fb21753030529615c7a04c718e3906d297dde6c3b0506889b19a00d2eb7b8c0bf24eb46ab88486c5ab6f7545e085e763cf75b62493fec611dfe3302d93b8b332c8b42f481d0fbc38db996af57fb619d2d7266bac7e007228e6d2d1e931f400c02e885a047f8765cc70f6a2f05c05a2e39a428c3058224f1addaa92a3eb5b74b84b311c124e95782ed7f51990d94b7eb4fedd7c816ec71b3822285fbd397d911f232432c2b106c451b77e03abc8b850b41de42caebf19def9bd2528ba174abbc6cafd0289a9c9112c2f541f312d67b8980ae7ce3d6cce0de61dd5b1781d9cb5e7d3e4ce67c2fd3fcfc77548cb08b32e98058789801a49f59a32b44995372ee6aaf8e8d1db1e00418fb71beb8e18d481c34c4e7d2f801a53ca119f698fb7964b86e8a5cde6c13b49afcac9bec19bed2b291639cde42b507256b68bab99cb6101cac9b8a49590c7bc51303b4bb1895647156ea2362947ee992b357ab617b755a823a2fc4d1a4dd8fd2e81c4761717969ad4c74a6a01c969e12eabef05519dfc70a64b8aeba5474b9c541ab1868dd71e62c9f45c30f5219a6411d0de0ca03ea65a91b72e755fe3d4dd3973fa6fe48b143b878f52668b39502fdc128209bc02added2682b52e9bf5e1c20353c0ed8e1098186587a394c877d5f64a47e5305da666ee4aefb387a30c3a1c9d4afb5573145a78aea8e22a611ef3e3a752944d15a89a494494f611f8e0d7f501028e333a4055423368e7178e983b72ad1936257b85685d1e21f8f24227f256aaccb2d2bf41f3a3b621849ddbc0b5b65d95e3f15efb59135c80beac4c25546473700586b8873b15d0e2940999167725c89eaf9a5146eaf6d893378e2a1468dd195a536388a42436243e6f44ace743b7f9e1ca0270db31ef0def8e3a95dcfaf23071246c07582efe0000000000000000d9e0fe030000000018f9c49112db256448a397df0c055157a0aead4515c4609e17ce6e5b881c9ebeb8247c17c4e9d56517af9a83057b93c9015bf3f02b7ee3df4228cc138d6d3d3f9fe7d8f7db55153fa5eca89a1aa5fa51a3095817e0e2fb2a6aa093d5d3eb494100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eaa44fb89fef41ea55ee82583c38302b338b0992cd7ef32c5e3107f131d9e490c996d995a48e152c06d757d572f9a87159d6c8dbd16c731bdcd0837e8a620cbf4590a022b67d05097f07c2a4fcd155baee2441e43b90c914e43071a4c5226347d22492c352d17efdcdbb95d673cf2c980eac16e56cdc2a41bc6448178f6bef060207a1334247cec9e557e7625c200aea1e88d49dcdb1c371438195ea2de3f63c550313d999111c62d0161c2722ab859b95475b71c5a85e9858cc909c72d99ab4b5ff0a17926b5825846dd414d9d32a734314e2f92df3b29ef20cc2857194e165c81fb60ee5df53e01830d389629e7296bddf1246cf77619f2a568faca11cea4013d1240311b41815d3cae9041a1869001ca09236886e44325a8329ac7d964aa5161121980226b111d5a1fab1f016b5109920bc60fdd977c1ba2970038ea21ad51129b0bab803085c358d17a2b026835d3cefe8fd7db5dd931a099fd6eee3f4ac152668a412050315745d6d6f07328bb425bd731dcb40d27097ec26b0fc498b8df9a4be283f559f0327574a248befcf9268291b386f634fb589c607ec4f235786eca43058625bece36a98848b357c8c0e485a7190bb5abe79cd918e0a20bc7951018714df227d3a376b5f0977d5beedc3243f07de065991b583ef46c5a322b62bb1a2dd2af345548b416a4aae20fbc200978817cd6ee4a715fe2fe909d528bc8e3e48185e75baeb7ecc0b50a09e7ddaa8b0ff027316f0f0a9e1dbeedb4639afe334f2025c9cfbdeda46e176ba5f63d49d6cc7b2184bbd05d94e7761c136406ba636673bfb886bb60690d352a8e49425d7979d8babf78c4dbfa4dc105518879400a913825b8a65b77ecb4a8620d154795118ffd82201734e52662ffd818973ff98865de5e6a0653f7d2b1ef333b250a6a166dc86b488413ba782e5c465de887fca598238aceca40fb2c522ce23fba46fb4b57644fd489207f11b37aa1ba24c9d01cee69534df6b5a1980c0fe46edf1d457ff8a81023c8c72a105ee501b191639a371692a92e7e820c31dd1778f90d538c58d78b79f6c38d647eec2b7468855962f614ee7f760f6f288f015ecf221f9b8b8ff0e5c6cc124c153771474c82e36129055304902a8a80a22c683f587f1c97743e1757bb9eaeea948c0a58a0a8569aaf124c0fd42e286c5d7a8a1e8095fcc9378d272b8df159f477e790592a38dedbbb8376d8f8ab56689867e822223d50ff907456a59aa127cb9df3745958eaed4f1d5a42d7b4b0b5b730b322e22519bdf3add4884f2f3a096b15bf32706c3165d6fd4b6eff60e84b23fc6b9e130d39ed24345c3ea59f83cb9331a697425a2d760a1483f3602a96ea44c21bd93a65b6f4cc7d4d0727596869868273f58c8750cf180d8451b8576a87035c860d7b43caef4249637a7b17da5207f7d6ea5db839a7e1facbc1c93bdb425a11715f7387caf4e1062230cf2631eaa24987dee0dd1d1b3988c40ee8cb1d62b4e44aec140cbc87b00b344594a3f7467705939c613050ce22b879f43356c89b0c6bd5d906333e3e1d1dc62b654c187619196a56f55543d069a38ecb50a9144c8fcc64d93161344ddc78c4c822f72f069ec8074d5e1277597fc010d5e133cc1e53991cc220de915ec53bf2937d02746642bbf91a353a90ec0a9236492bf8b521c627d2f2c9b20dd37d772e0314eb0f5c9b803b42b04bac1f8f190ba6ce451516137ccfd51c1af3a3bcc0b1df44c17f2a9e02b7dcbfd5c991d719e66bf484e9d28479be16ca2c67b28aeaf95aa6d322666a694d1f23a6bea05a4302ed367bc96170216976f2eaff74368b18283770b4888313adfdb08e7d7fa3658b0c724d56a107cc3b76ae80d98ace8d43cb48853d14b2050131f4f86e173c26e2e3a31c6c2903f86402bbe31d83d6c33b1cd9a280f787ef13899f8e80eb928956ba1ac998331e77328665cb2d34691ef7380d8ea038a7ae61b940b7f78160cdb853e21a91e70620299202bb3d1f20bbcc25d5e86bac30afd849e113f8205eb185c53b728014286c74c3fb3f7519029ecae5416d6ca673457630a8b9d5e4bcf247a9fa80cb8bc9102757efb8e1701d079e6df0095fb2ef2a74e879e1f3bd6439e343704845968ead749289700dafcbd75593b6a6ae06b8b3251cabadc68758c46cd44065463ea00e82416b1ac0261117eeaeea6b726946e58d17d5d9dce329d18d8a7f5e123238634feffa2654aa881823c9a4926d70be4fc0a91fb75a74e537098b8bd4a1f17058f3aaa364d90c13b8811a79fa18e6852fbf03b068d415f66ab0e9bd5b90aa77160257e1aa2f01ae604d123938ecfa89b7ee68f78ea7aa1b3c5aff4780f19585bbc18d2a5d3846661aa7f498bd5705b5a0f0e32a25c6db81de8f3afd48dc2822d61673861d9e4736a1702630f06f01c9d0e1c0e", "65", 0, -418714248, "591cecfafbca68740e991124da123d95f95e313da1f957c63f6540e3ab6e1a54"], - ["4833a89902352faeb4132ce88d89b3d894f20f2a92605cd136418c8ac7f0f87c7161c6e5d50000000004ac00ac52f1c7304e1c39400e7215abf70008a6aa6e7ad2d5aa5634ef6db67d057b36ffc8c801ca9e03000000066551006a6a6339aaccc30130114a0200000000030000ac895efa01", "636a5152", 1, -169617858, "d0f2e4714914fd6735301bb06b4240e8684c47bb6c170a1462167c0364995c24"], - ["c7e0db4e0130d96173e798b12f0b200eb5e9223fee3aac944f53ef7e417cb62885e847fa3c000000000700005365005200ffffffff045b89aa040000000001ab0b8dee03000000000753636300526a6aa14d3b00000000000100f4d48900000000000353516a00000000030000000000000000fe50eb0500000000c325257fc10dc9e14a15138bcafdad9b77a801dd48f62fd33a98b3965e68fa60879fcc9e5aff295a0702bea32b690b866d93a7c4386acc4f9c0cb4def6938404605a18f59c87007ca91fe74960b6b77135c94ce5b30a44baf451cabe11472dba000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005f3ef785006d864bd99722056f7091d25fcdd11a7fb744162dabbf7a9b90388c90aa7bcaf6b8c298f0f6e6c61174e7a23513248bbdb22d4f15fd92f3abc5f05e8dccc75bbd15e359f6bf12b3097cfe8bd2cea74d6266542df9338986b8b322ceb8dcd81d10c4b103c9a733ff6b0a6136fcbc84871bdf917e2be6b3fac039cbc60313af798c98a1ec0c7e9c9ef905177403d86898cc7e43cca15079a2fb426b713f030f26fb6d687eb3db4d3c5dc3686b3d0aaff32d61c8605cf7cc20406bf129205f0a1ef49d4c1713aba42ffb4dc88c845ca94f0a8c97cd2cb92700ac9b0cb244e096248929eb57f50b05dd01f63a77dd9afe054908d33a104a9a94bbc4ac6636dae70216bfe9b6fd30004f1dce37eb47cf7e771035eec0aa5e2a4f0eef5119557a7c850305854cc4e09289082bc14f69b1db86e8406ad72306649b24113eabe0ec13b019021adcf24b30310958e0db01d1964d7ae79e11163ee79dddb503455b43712848450305e2b49ac4621016ad56478f9046a4d8c162e3668ec88a0d8f15520870226e2d03156f3d8a7b0437abfdc31850c9306c010495385cf1bb6c709769d8a1620e67fddbec5ccb9aa78db04469abe5358434e05b291baa788c38f7f56ae5e28a116948f793f4dc031bae4a604d03f245f1962b5e1cfceba557c690d35fdf1d2c1007bb5511e8350c1c8822c9bf920b74564a9c51c43a0e5cc80e8b0bd248bf51b2f1551268e5ddbc44b43ab744501f55be9bb2b6e81415b441191c8f62142a06911f0a0362ebfb41d1c09532778e2d735acbeb3839691aaac63c48518dd28bc5eb04b12799c8e97fe144e263a0203d297a70dd4f1c4825258d601068fb8e74bf12e4a32920e0ef4418c1eefb9e0dbd6dff02f24257eb12ec1d8f5978cc915637599fc1565bc81c063eaee6f357b6cb471bfe31425dc01fefbd93dfaa25f517c1354537e3d4f36959853f7073090c51964a5c7a0faab24a829abbaa8879d311efdf8690acca4ef414bf9cde07ae5e9f118e9c96f112556b7cd0d1fa1c3e33d67919565c2f01fa051b22c4d323550be73ce2db8b26c20c7cce9ba3df65f8a87cdf941a2ae8f561d8903e01d2761b75dcbd7ee3f52e6445853990d18d9a77c7ce1d80055dcb3ec080c5e8784f7200a2503e290f35ef54c25596b7ef329d82e12a401f8f53a1cd323ba2b3250bc8223920185b65b48d7e0b800706f5212e6891f8e9f4c2912acfa538c51e53e9f331663353ab3755f0a17f3d9227e0d68382aa0051933a4f7ad2d3138194fa2de30bdab1de7c7db80e0fa4ac4069160e733a54169baa61eac7e34b288c3d1ecb6ee52220493c1ad0a6c14f48a960da0122b66b4c7e0a1b34e2e7b4efe25cd6c6ea9ccb7d757efad4ac1174dd2226930ab511e4390e149d2bd2593cfd69f7e017d12a972217b7d555a19b9c07becc057cdb4649ff6c490a06e59fc95ac7349446aca7f8de2a29bc4fa90cf372c2a31e1b14a06f36dab2d75a2c66bfba8ac8aa80fbb403ad340731e1e4a9b2c05bf6a1099847de84e56b5e3e1f242bb0c2dcb35d344a40765ef8f49b4e4d033bd486c006017ed390c11eb7a321f7a19bbc71439ad8cd1cab24608897174c4918732285ddbbb43bdbc6f445d5b8dcc3f6ad6086750baa75e6810aa51b61982a059e38d1e664b910e3df7308609fd3347e21ff5cf841431d74f26debecccec025574c819399a5b467bedfe4f982095bf5a8842b8cc7fe2b6da3bc60020981052bc598a6b01931199bab6c2974ed5a5801a0c034cb9199b4eeb4a2afa5ca3fe6ce42260331ce199426183cce03f276ae5229de948d115b9e918928a4b21f91390d7127bd68cd58c4b7cc5fb395b5ca9f5875a68110b88bd5cd86b80277987b43b47f9f3f34c4026329c6925f1afb03898e44194b5dd838cc12724e0607b17dca50e0b825591dc0154b90797973486513b9974f2ed156a7fb64b7f19eecd0786ff525434c3725cc56102d67dd22bd2996dcc7fe3bb3e54642f3bf02e4841dbf481453b75f2fcac72ed66fedc527091ac1ec2b21ecad048826f5384a9f6ef1e5ef110363b059f0042eb1d312a526db93782468ad3167e5b8d66e5bdcf75558bb09337c5663c23e302985d13546a412f4e7eafc7ea88192d521c4c49e989d3de94f39f0d2998c1a28a6d627f6232023a1a8b2e6a77b4e77fe4299da8a3e9e7e5912e161ffb171aadc1533e34ba6c77b5f29e1e37b1610cd4df8cdd5bbe41c6072ee0199b3047c4f06c70a2312047ebc6c6daf46521e217ee8a166f8e6a578156d6f285e700000000000000000000000000612094a44dbdfc0d7a2bf73917d6a881931a053b30f4fbd33f912ec497adb02342fa332ed9569fb9e4cef811a35b29550d78ca82fdff5f43edc5467e7624e61c3e53992ae17f604e7db622e9ed908f686889bfcb64f6f033d1b9c697b1b6809400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fc4c2ac088ba5ed3091f14782203e72f77864a5b49b84ad3a4a11a4e5d86af07df944207c2e7f6c5fd18c31e59e6dcb657e3dec5756f29a6d4846d0796fc3e0572e6a22f8874f05329ea9f92f004c0efd4914ee68fb4e3765553d4eba81d7caa126aca8a84126624d089cd31d8b70d7139deb0fcd782bcc569d06639546778870305213819538fa97e3ad501a6acddf2ecb383cd494f218d9e3c16f7026d117e75032ab6b29602c63cd817917a87fac49603b3b7a5cd9aa5e779fbfde96006a841ad0a0eaff69b1b12cd5496d3a0a6f393f34ba8fa58f9ee9e3ee4144ee3113ed71b87169458153d3cf2ab8f4970a0ab5b5d115ecda04f0857ca34930cfee1e44ad9bb030d849f05f36a84356cfd4321e0be9369481be65167f74cba25c5dd7566e5ecc402070ac916563db9d7c3f4a38aa9192982aaec37779ea3efda9d59dd9ac706a2c6022260a91a6e3696bb85b3494209765f37032e9810a7ae0bd114c7d40d7abee3560312e15911e2572b9518b3d002f613f357f0f3fa355041741da59d72082d74dbd0020c6b868a38621f9365693b3eedc460292e5b7068503a449c258fef17ac999d8d1f44a70ff09f96ec8f8d8fd4412f1d0f633b20c773fa4da9696a7e1e71c856f9a85e06bb5f9e87b39fe75a160b21e318ae0268d82628b1ebb827aa5bfd33f0f915c6ad625fe81328964a28412646c75bdf88cae238a1604f5b8972aae1c25a83d58d6bdd53ec67078f3619cc4361d8555c644a85848fac472a5eb63fb3eedb216cbbec34cb137f625fcf9cfb71b26d5e40ae8c26cade09af6a1d0d3f8c0526aac59cb62b659a9e0f70d0572f4fb0430c7e40fb0dbb739d7a4538a8c8d6d112d58b41b3d7b39dd9a28202c2679d4d516d8a133bf6caa57d7c4db0f43885a9fda6c940855fdaf27cbc42563a6f8096fcc726c0b6eae5432f25b986095750acb8e005a68e13151aa67d9ccf1099d29ad3fee2745e315ce512a09f756462e974afe11a9efc62462fdd388ab2ea9c90b02bb03ca652cf9073284c5c97e31b404a653832d82d882b29395762ac1e0e4925869ead00d7dd5ee312ee071e59fdc4c1ab15dd1989f25d8428a3747a5cbfdf07077ac4bb1c499dcc52c4b1b89656e1e4ad07a5026af7d7ad95af820f4dd3c84578ea5016230ac7ac027111ff89824d2542994125caa7cf494ba696bf7ae5df4fed2f41aad648e099c8527a2d6610513c82b0da58056a17acd16da52ee2b638b4c0645bab67aaa9b0e63787455be599164d29e53e64aeee25076985a708fc5d12504d4a8db81017a5e5ca1f8dba711d7d74bafdbaec74ea6a0e26b89fb39116d8f1303d2f1a3dc1837ec5d68d3598913473a4903677423278a62dae77cfe2564b68ac3bff81e0523e181db6c83a51b6930bec49b444a86de27b0d3237ea3d90299cb39a55ed68c1fd6b5d65a7d8da72e12ed9761e9fd780aaeb6a1f6e402811f82bf57c0b360b4771baa484129f7055a2b3a5e05eef80f3a15d8f92d5ad537c4a931c6b32353f113df2a6fd2264a89187d676d60b32b18652d613ef951699faa07be5b0108cbc3b41ab538d4b0a900be10b65386a8c8e0338d3757c95e0aa20d7320ca6f251bc4136316725cd2d0e553b797e648777d11ca8ac8547bd9b98dc6b68189cd2b86bf310dec10471a10f0ca4a3a3f90657c7bc1aebbb1f747546d83baa4f9ce1b24170fbe1caed047baf8935b569eb0617640de32033d45cd18f500f425e30f589d9da06c03c26aac7751a8f63afc1cd9fa4efd9a48bab24252b248ebce7b33b3203f4eca8ae94f032206412488d0525dbb81aec713fd83a9c71ab3b3059d9e47e75c203c14ec2b65c611c5926175fdb5cfceafed16feb98df760666c893bff2beb71442a90964685805d9d0e68bb3861ea7aabf54beabe4f04684ec49e11d15057610dce3890d47f5150b16f837ac4daab7454282adce51e8e557b9e9a5ca8f55c159693a7e52e97db2c298ae3337677baa21fb2633227272a7d4a6b7bb659ec9c0e4f1180701ef02585a1d237aaac82429cd1ee8bbd03521bf2b6118daa65a4d72fce98a4e6d2ae89ab591141d8d6541dd87c7c2557e72069c0dd144f473d2785ace846ea1f0dcc65cc1fb7be0675481fb10d8cd25787adda2513ca8691d2a25f75db67033aa5c9616e49a8f7c6f0c60517f31d3fffd4dad0be9072350b19c4dd1577ca369f9f39e4592b59850403968a46062499960d79647894b85e1e09a8ad9a843ab210549898098b602797b9557aae160bbdefce2f074028b0dca52690000000000000000cd6cc5010000000043adb713a05b301f2c1ed393d1aeb9e4e7b8ad2aa7ca00bd1ef3f056f7cf132ac78a8b6db314fdc64772ec3f3a8782595e4bcc1780614dfdb035b9f496fad9241e5ebac521cfcdce6d7af3f97e03d2b6fc69766111432797c2b555fd5a3b324d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ca8b6ec469ffe1f69b4c7df490dda03b681645c4fc7c3d3c29a0709d575b7c4ed064c5560b9b46a42f003ddeccfdc5c7a507d637c3052943ea9564acc1bf9776d7228cc53d036b272b2bee1257e47507171a4ef71530e474e99bbc7e911c77c8c881264a42c8e4bf8d53633ca94defc78c3df56800156306a778d80a8955d47e021dddc3e7fc9dce1c5cff57e92f8d9472e02d12b54e6e899bec68a47597fb3a57022132aa23a589c6a4fc60cb9c48bcf8134bc6085e06c0691d9d10e60f028014d90b08b9f91177cf686675c607a20ef5e6010313cfe365aeb4e6981821cf2ba594941c662c60edd1bee7a8d151506ec5570a43488cde56cd1d1798ba5bf0aa1469f202144ad5aa9f0d463755cc3ea19749c4f6018023644974cdbc4d96a6edcbffa86f0202128fd6371d58180ffa6de2005bd22e2cc96f4d12f37edab0093244e9af08630213787f36096747f72f56f665ec2bf14c5207bded787a93da0945d2ae12a0e1aa021132cbdb47f561fa0c920b1f2cf6343348efb2721a538f928ebfe2ad44ba481a031e909610d9c8fd704acd9455dbca9a9d54c5c1cbe738727c1d28941ac7c9c3c2395b413a9f1a9ff90b5f1bea2a780f19d79677008923a3168f6863346743cb32b7a80e28b547b16ecf7a524485c1b98618878381e5d7a8f8ebfb3f9ac375915fee4280365b8d1895bc3b4543172b312c4c04c086207ab8d4af55a2e6ec1354c83751eea6e29e7fa5e53c5dfad1347b4d5e2877d35745c7df446beee9e71c260c274066284b93fca95414efcef121bfd3e07758f7cfb39304a3bee32e95f043de0e89476a15ad37bbfe03db557ceb7ddd316ea0fe280990eca896f88e668647a23c8ad072596934f243043409d7f8ff76eb47a808d6dc4d96e47b62eb8a2c0926f412b00335180559a75455fe989f66e8b6f586abbefcf70009938af805c57c0846a150e4e7c70a40c5a474c2d8424ad93760c14c471ce479d1aca73f0bab8fb81faf0504e0e9f86a36fff97d661ba443a8a2191742380e7373389d97eb76d6599e580d697aa205665c699674b6adfe627c2d1493ece151bce065510187311d82e050a857d31b8c62e929b30f9d83017b9e2a406bc6f7a99f78866dc1b3ff0cdf883d18e0f1fa7fbcb0c9a3a0bbdfa3d48730cd61cb5bb91afd0b11bbf60ef579a3db0d03e9594e640f67cdbcf664b714e039b361514d5760a7096d341c216039dbcc8e28e58a497ad83bca3d495c60a8cec99d57a47e88cad9789216be262002af2245d04d53cc2b615064ac5c57d3b13b2979bc8ec39dea4bf9798c3819dfaef397989f11e50f8d76b92c798975c3d7eb16ca7e3235750812e04c579cca246be72ff87d6cb6d588b27280bc005994d03e0700db36514ff699fa588d3be74681996f546714d01a7fc5da1e6df8275f5f5bc929010010a7a05dab95add0ffe755b28f710c6d06ee14023257a6b6599d0a828b3e9b3dc98b634c0cf5ea5398dbafe3bed541514dfa8867db9f7ac88fbb4a2052930d3ca483380a8acb8842464b128503934f82ccc2bed49bdc09356eea52151094d21306c0108986545e35c99f7270cfaf38dba1bce76b79011f305e3cc71e50b7746697908093458cabab7719c6804d31f001468435c4f209233df30f72b4e8ad664128178a6c3fe0c9e3fb5dee618e841c01b02a86916522348085621d3cc5ec904e1ca52f35920c66957a56832cc99654cca222a2f0f40809afa95baf87bb09127ec180bfa72c12b21686b8004d204b52aa0f0871f9ef2c8c80095540adecc83c10b1eed3bfc927f77a65ab0f65e83b01f5252327805b53820d9a74ef8de95ee6dd763bc2643c216903c6678145fd76227dd9dcf6f2eff73790615a7952474b510a0b4ba8c223e0e8d76d3fc8b2c315b7628791b80b900ffe499c7b2883e7ddd2883027ba9504d569ea1f32b8e4aac33d6ccc52280b37e9d84b82e2c62bbc35a8982edc25e2259e389fa822d8053ba5e4e5abfffa92581858dbbc44dc31d7eeb42a3d3681d5ff3ff2b89d7a2888cf9ea0e60b1660290f234afbcc89fb22e1a23aa43700de41dd43eacd253ef1f00366644c991ec54124a3e73d2b2f1db75ec0e3c77fd3a50ce8f5ecec9092567ac78974410e88d5fb54104f98e99cb2a155384d22ed87748340b6f8e87456ad9ea42a163503f7a1df363733bf1d9f149fecd206d2528759f74dd12bba50e01e2df3d1ab9add569b0fd653870d8fa47faa5ca3eb592258f2d8b854d650d6c308b1923981f3e2cba6be5828621d93453175d4b2ba7f761ac75515a01995af05a6b9dcdeeb79caf224e721e5c0a6b914e1c8a3b8d25c4d4d88b0c4b76a81d15cdc1f0d7362ad9c13421bc3b90a9ad2d00fcae8c30bb569e6920ddfdf1841e5bf002c9f250dc2b8bc68fcff046a6d5d26a8f405", "6a", 0, 1898689840, "d3901dcdcca3c29910f29318864c39b2b6a5b09de414341c214ffff2ec285f23"], - ["6271506c011e74ff7a17e249207d4e91daf6c1825e0a7b018d2aa4b968636fd398300dcca70000000005655365006affffffff04bd0fc104000000000900ac65ac63536aab6311004b000000000008516a51536552656a7e4246000000000009ab53ab000063ab636ae2afb2050000000000e94596cf030000000000000000d2fe750400000000a13291c71bb1c0ab1a400d230722b8c0d8099a2c920147729ef75e54c2b82f48c838ed9eb179480e0bb4744548bbaf54a6fd52720adc91d3c5090636bd6fc1f9853de9be170a06e8fd0533300f8a5d0d354da8f6c25122843419d077e5b0e7fb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003276e09df6f95109ac57f6bbf46d9ef323032fa17cd1745c77e7b99c922e85f3288af6d53c6822790f0415f4fd6ca2c6f04c33dfa888993c1d31fb87b190034a677bf8f21beecb4f8608869a3c0900333f8580a92651bd7b9009d953154967166b04a9b3635d1b29f706a3e48126d59b5d57a0cce8ef9c3f127db87deb2e9934021a48d0e68911f9f7b7510a86a1399e8ac99df67aec46915e423fce7cb14b671603247c949a6e39c309dc46253062da43c4fe0981ed7b0b516330c2c3ca505da7c60a26ee971b92759f695a3198f57ca56473d07733f5681e1624d9cac6a61d1a933b0729b1dd1d6828f0b4acbbb7820be39aca6202b357e087776cc64074f40cb89b032f3cf19b007180b262c07065f8b3a5857fa4cffd24714b06b8fb28730d9a4c100302d31993eed17be46a7003968c114b101e1dde2bbd15597939f7b07aabeb985f0220a29a31a40ef91b42742434d1cfded026068ed7a5fd6b69110a7f490f04064c030391d2c655bbd7337399188aeaf1ef602fc4d4d314de437e6496e86b323444f50229e7902f9af808074ed57360a512565891d1dc354e1cc4259c19559f26c559cd6edb33f35146392412d25881fcf97e8d27ae704ac872aacd4db166e25bd913f1605d14492c0d80efe8e671fb14f126efcc232fd32699b6e059488201da1038bf2bcd07109260cfd11d2b78ecc3ade82e96c13594c11932d417ed7e0cc30af7970edd2e2d87a8e812d9cc3de536766ab1e2c218801ac4127ce51ef75801c9b221c6b225fb340c7d6401c5cd771bdc6d1cd58665e6235a6ee374ebb7202f60d9f1390dcec0fb841f080794591aa056a7ad9da7c2256e7699cbcdce7807e6bd8e42deab71847032a58bd056f1bcf32cc1de805282c4a9e648d12b10b531cb94b541c33449d054f5aa9502bd2853fb2f80f61cc8ad4c9ffb981021b5136c233513e40ae239d58fd96050ff9bd3cb8db80b2a12c0bc3f0d139659a63feb07487c4994f903ce6d7783cd65b2822c647f45c8945ab7086686448b4621d93ca9a2284e2f58e8aa0509bc8705c184c402fedc4be1841952dc6f717e3212de995a6d98daaefe42b3f2d0064de2d0ce53d63f80af2d5180e6b0987026eb3ad34039ddab5307d54aecc394988f1aab4cac29faf102e8085adc399ecb6af314b1e43fe2cd405342df8ae5b21553b6b419f2cdfb82d748c96fc4e347c8d3f0070f029a65b7d771e14f0c83ddfdf15606e405bb5f6addee1645ec27a56b901447006e020324ab7d6e1504af8976b4f36c9bb12c799aa3952a9809de82186115a0f1f3651db275c066ba822035b1ee3b55fcadcbd76468603a1575577d0a308ab481c4941a9d507f2d7c9015867d4d4db101e49ddc3ff5b5e502e631c30fdff983227c5db671c69c086ab63947853356d901cad6fc7c90b1a3b22988cedc869f2787af819d467e134b71c920479368fc15df430109c1eab475bfc3837701bb0eecfc5e449b130819e578f87524ec667fab2b8f84808281d1065a0233968e7e0a9fd1b4552904ab4f8aadc1455cfee17f78a3fc16ab4b9b94af9ea71d0d084ab6e2c021d5b71f49c47542ff9ea19d2ac11cd71d5609721442de6eb1ef976784c87b3ac1f9e97b3566dd85be83c859b5aeaeb2a04f9daa6f488ace09a3e5dc0dfdf81b796354e01131962e478268520c542f28f6c2854124de98502aaeabe97536e064cd668555d9fb9abb5c0a6018221e4e7792620c219bb1fac4557b7b4d568c38a2b265763f55f8d073ae47337d5270f475125eefeb24f752656c0d66d6274c044c6131861905a4e6de5b716bd6072f2b4ed6253ca604367ea39f809c15c1ec7d78799e954c57f4199b904cd7d46059e3db9aab86672f092f823f23e65038a680e013119fa1fc7b719a5a3a9742a3c61541919acad7210319627665d91e000d699b1319de42aba733468a77bb3e29bb3aa3c2199d42dbaf228650645dd23352545ebae28180c199357a34d049f468ef47d52108b2f5b53e51de8d104170d33d7333bdc024a945f2a40a0cc1b4c1b09c8db948741c750a699d0686694ca4515b3bc80a869f55ed3f15148278545a9c842e046c3ce0d23765338e9aa874ca9c954425cde2fc988ea17a950df395b44263b74e94bc776ce83a45fb5f092d79bd9dc8a612d1419b3487fb9e54c39dc7f8d6494d36fcca8ad177699c043fe6c2b292f2d85bcfea5ec59074996a0a12308ddbdf1a81d806b7b115b7f9b8a8b9a11e22027f6d9bdf13366b38a5c0b29004c4ba7d595ddeaa821daee05f0000000000000000b0dc510500000000b190f0cfccf7e6e49d2e3c93e181d17fb20b752df74af6090a29141458fa976d9691d917bae2f2c2f1018ee76b777d89945e687e64aa7a398037558a0901ea5b628531b9effbc34775b749035dd58a17758ade93ae2c13791d65ceab2604c53f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000031c8ce001c3faa3be73ef97aef44cb876ea5bad8104e5238271c5229b8fa33d658fdc43fb9a27b65fabcd316b0776338cbe5c177b246d7694947ea32f2b7ef5e76453b6e35d710c2956d00c03116b492c8deed9a89d0632cf16b145922e9551dfb269bb842cf4cdaffa01d39b8c176230b04100124171188ce191ad47951df42020819015e21e6bf1b4d32219cca8ae8c465a6309094201ede9b9a047846fa45c8030ae4bd8d03661b803cf87b3691cc3013506931755878652d0149aa6b5fcf04220b26aafaf52bdf88c5769dd320f52c27a3f5b61cdfb5939ec5e46d4268c7a526d70db76998a515e38c37f8aeb12f497c09d26b242285173f1afe5980c2dc2c09850300b5910d5824664a3a717019db7a185385410f0b19fb62600aa65d1fae7ea49b032737950916288acf4d8972107753d2c1d34a50b4967b3bd5b965a0c951c0846a02165ae3a030cec5d1efc479989f437ad46c6ed201522107eecdbeea84b77514020321692f9fa83090bf28a23fba43fc1f92fa1464cdc69a835842189ed532cd302a031724ce12409b3eaad73fc85e2f728d58a5d05c66b8179c7f85b2beb06c0a3b4d4d95dbc2ce03cc9761407feef28fad087301bc4cc3d2542f57468861f141c88e3dfe34c2ae39710f2c92bd6d0f4f46b3481a23b2202f5c1fa0519b9b297362079481ab42eb4a60e9dbd79e31efb905c015f3098256837d55a71c6ff3bd10b7b11a8ada0c24584dbdcdc5c9bd9bd9df25b5a03da5bbf500b53e54563b0f3e9c9064baa1ade2ea688ec2980790442771d1518c289df73d89aa6fffbe064fd9f8fe03bb76ca2f74a195f9cd590c9080bd8aa0fedc0266f54afe04ac746fd78f9a051d05ed96d7637cc7fe8d306e8cf41a8220a117d2120f985f0b8e6b99ba2fe7b7cae7c54ad16e2954c071b0ae922528b15e78e0a0a790b7304d5bc29ecb947a7bfa774c017da3e6757c14094251723ada8008ff607b67663842f704b33e58108ed7514c9521641f51646db809fdfdbb3ea9c55add903948cbb967a6607e1c0b8e6ab5b2b23522ea94defce4274b4423bc0300fc039e44cff871aba968a84d3bdf2f3b58e0ccc83b8cd655d8b3994af67abdf7a7016e432d1b3cf6692db7bec5cd56396caf195c5482450ef50d343883b27d023f8b0c1934c1bf0152465ac3592438510f5eea79a9e3129007c536f8b39d7dc989f721e225c8518bdf619bfa8b3d435d42d3b992280ccd527830068451874cc869f95052b8112a9413ea49a632451967c7d5239156d9d026dd7ae6126defb39c7e67979388c25141dcac57a6818b4642274c49cb432baac36547a9f5db9d0c4916465ac71c1fbe8333d0dae7116801744974804952d0a73513b92261c1e58a848a58b00a6e1f70a7d36f1d714c4739712edc91b7e840096585a01771e3a4c551181a16032c3cfa15fbb0e4de07f96987855ba910d14af8ef4a63f34ea72efd90628d3ba6d0d173924de735640cd18db5a0f1b304c6176efb708c36fb13ae6638d988bb9d631c478cb2f99c604ea4ef62b6734f8c3bf304cca9d057252ac7023d5abada1f40b695a92b38a604b47d494ca39adb8b623ef250e1506a1a92a9d96fa135369c9c4350dd843c2031287787ea385ae07e5d5df22147471fc87fa9cb2f0a0aba2ab52fb04556091b3a9dc147dd0213619d15774f2bdfe12b610d423a709b835225ba0c944e864c9cac123053eab9a6a8aefa7c0f22b733b257a748e4f945a28affd0d21d15ab29eeccb1cd4e38d997b18782f6cb35ddbe99280b52485d1d227df4345d5876bbd024524077242fd975ce61ae3f7a7f557c57775d96cb2a60a271a2cebd1577674f496a0f0fa31b4b416bedb38476ccf836c9de883745ba2adcd697a88f2ba966ab8351e42cdc056bfb7d62320f240af68b8a248abd2b4ce8ffda5b09f20446f2a36b946ef07b6be937a5b33d714f05b3702440883ce98e104f4bd236333f5d2ffff7d74a4c56a4faea7471382de9b99d66ca3075fc85fa247a2c333c8e8da2289acc119b2e2942b752be60920c8e9f4ddd6edd46a150bf20ee885ef899177f74811966c2bfceca2c04f28e3b7c74d854b1eb0f8784b7d41910499cb34c7e724c8162fc956ed446d2c3c41a93e577b9148eed42b91da353ccd98c49ac67709373eef9c692161019b8b18e10b04eae8b9e5928511551da3cb4a3c08b6e2a3377e1a371af8bf1619055bbabb3e4c7a1e245a5ba09c3187194da28e7ced19296518e179399430551692126e414ef3914dd306f29acb94345ff00000000000000009d639b0200000000c5692db1f406c09ba4a5e2b6e8c98dcf6610baa549649045dae3d6cdef0376fa0c775e74913ace2fee5d3102ca48b75d10d833035be27f955de5c7472af9bda7a0d27cbfd014946408a69da609415cb917c4122bfc2b01a00caad7eff4e4a8ca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009854f1e1c7fae5bd041c362acc9d0e3eb0d7d709caa6e4c8b9be509d024dc48ed0c7613cea2cd166afa12dddb6593638577908dd74afc2e2de61eba2cce63b2c6144d8029ffd33aba8bdabfe51882d24978a456aa7ab82eb886d93adbab505fc91348cc4fd5cd1f19f246d25f2df21fd80aa01c05b09b9589261559be16697c90312f30a2d5c3392930f02366489e36c7598a9a6459c36eb2da9c433d30d14df35032aad753c29a150112f25725866d9390571e24ad2b882bc44a60f1b23505c7d890a2d316c1ae6092df636c384173ed4b16a173b32ca9ae43506bb16a452987aaa3100367225df1464c70739978208295c9dd567e97a37277978cc89b6bed234defa0218ff5cc8d0b84f891e89e87c2a095a436efa11a7fb67045cbe6d36cf8c03d298030c16cb367767d81e663f1e1be5fbf32a7114ce92e717aa2c6eb3791452da7234022d7b9b5eb253fb4803685448f7563918b22cf98663999d54089060ee247e1675030a14ad95a540519d2b79604c7bec35357d096ebcaabee2b495d0b3ecf353464303090f96bfdb5f90a7ae4dee215b6fa967a4a31548d228b7d8c8439556832ee5c029ad05b4956027f80a8729466222c1bd1bc3fcae63c0acb03869c61b8ff792e76c0e7dcd6db9458f1d33756efbde774836aef8e5128c7239cacae2d2b804446fdafc639f03ac75da6098dc23e101d6f705cba4e29c8a30531595f91aa7c0dcc629ada76359c0a085fba5e0866045855ec0fc69450cfa403bbadac7f3ac7d0bb6bb26278576c59ecba0d6ccd338d011aeba5db5ee7b7d453853fc871cd4512ff5d76ab0285b2b3bab5c2167a7f11fc0ce883787b7be6359e6c488794c2f0489bddeb87586a17e77f28471e4a694152aa0d4576dcb3f98f4600a4e6b640fae15687170327afa98c0399ad1b7d53e8536cfd1647dbca5adb940aa4ff81084df580106220b1b37b7a8b9c42ccec0676f0070c148b686cc838c679ca724586b4e448871288469e9c90fa2cdea509db5552574421dd64de39e164a9111f71bf8adf7984c94f35dfa931327b681a2f78a91e6ac78d4b39aa21e589603b2eb39f7bb1446e20042420eb1c5ada46f1d745259c5f2d03738e09cf1e2ecda4d0a33601b19cafdec51123d585fb69c15cba7e992f2f5f588b58b47de5f7e377129c6ea9e309c09d8e967a58824794ece5fd55109a200fef86e93a2ece84738a003df2d41c9cd41b93d5b78ae2aa551bc15f209678f3de22efb856a14ee123e3fc4eb2c9eadd39b966b1770cd205f9d6ae9bbf97f92eb2397ebc4da5dfa58a830b3874d46fcbb1db1fca2be33c909059bc412a84afff0b23e8493ab7fe9996ee2cedf4a04e27d797693a5fd79d8d085704960f2711a383a3e6290cf80fd7e201f17ed86c003e58c46bc0079d858de92acb3c19a20b1fc9f5f7579347f7180755a40e6c4b4f909fa1a746de222f9021794b9cf5416b2dc45e13b85a6d303c7ec8a80a43c5df1cd25be45409958c45982baba5bbfde0feeed94c50e4e7a4243e7023b7f2e4f23442fe5ff644dc94ad69119559117dad875f11de55c56324593178d553ab90b79bdc867c85ac2cda1dd29fb0645ac29addf69a29e7331157f253ebe2219e4d072914ad82702474f8e1fc2be00762b5106b989cb82414613e265501510ae083ca42b4a33c4f1fb1750452504f2ac2f2371c0e5e3ce676b6fe4debf5f2b6966965083145728c44eacde47185f7313ce185bc6745d778b9538a3b1b1ac852cd0ddabd35cf26721acd0011b3b7323d28794367f7d20fcf69b1c3787c4ddde563d32d037bb1c3efac7a27cf664203a441dbf26c824404127db4b4360aa0f5d83a191535bf60d8ca235c92169f8457fc6588ae7bcea61bb3974463474cb2d8bacea2458080a0fe1bf5e5deda46bfdbc53b42867816cc8d3f4e43e7ec017d3c169266ba8a85f8d235c107a9983ce65fd994f251691e6052f89640688c923aa95fee44e90cb6b9b26417dc5432f58830bd8810d2b65c77a69347d7ab51d24aadd081da0104293e1a43eae9d47ba1afb293e4da2388f395762a1d5c5a84fd7aacfdd80e386401ff09d9d99406b9706b30b8b52f322ea425a393c934b799dc7c9dcaef277599ce1426c00698e3c10c9c40f9656f478bcf272e6a3fab767a4d260bfcae6fb9d4da6e9f6f1a72206fff72dd2cfa0607e0dcb45fccef2c6f81bc18e838042cb1632f9b17b4f3b7b4474b15ccef364479c5ee2ed20652c262bf9a65cc1e7da994ae27fe6306222224e98045208bfd60652e11f607024198a4875fe6a558609b0118f261ac49efa69482d5efffc25f8a9dd4e03209d87ff93388a2a08c489f7d9a522c9879a272e3e175fd903c53359af3c9c56b3726c3a540b53974e9a5fa3e577413adc3c80da03477cd3ef4c6418876015a20e", "5363", 0, 82629267, "e5c96a29c8741adf85b3580713fbe4499a14049ccc07512fef94343ae37599e9"], - ["bf8a3b0804fa894753aca690320370387b6744f47b07957cb3618ab0fe293237c0e027d454030000000263527ae8824bab8fe5ff45a2b744c4920af7b4aa6ecfedcea45b9d3c727a20f57e3834e693860100000001655a47359092aa7b0a17edd287f314e73f87b136cfdcaa525df24176b879c4464aa9f72e640200000006525165520051ffffffff1339bf2d0e822564db4e6cd7a666588d03d844d89b1e6ed1563adf031d9ff707010000000963ab52ac6aabab52ac41a571ac011d777303000000000163917deb820199d3a504000000000000000000000000333442fbad01ca6a4998ee2b643010b8b60fd5a759cffb001c33168216f1eee6585b47e2b2eca4ea8c101d795467e8424599711c98e6f3a36aae85c580d6a74a8cb6347ab09f46e85ebfb45096efaa0cb20d80d78901a795b4bb3b6131d4024f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cffab9caa58f02b71ab422108027f57bf2872e902671438345c42fa75a357ea4ba2b1f09b3a254a94fd282d53dff281bb1b7b981c63fb0c80faa1c932183f2e7077edd64e8554d5f83862f97141294a8b6924d160119ed3dafb1a48d5b2269de94c42499eda9757add067e192bc93f3f760bf39c41eb54b7d393ba432baa4fdb0203d3e65db776171ff5338b973299b9df98ddf1743b4c942884075935a2f5ce9a021ce11bdbb6f7fc8f1b9a884efbc18e8cd9521576f4f272462433066919c0b5330b1167f732a871fcf8edc35006e6953bfbe2b044016766af1aa332a22315952429048697dad471c41319e42bd542b69f7948e63082f8ec4bceee5c4a770227dfcc0302454f927ac341a79823b46494b113afb2e53f1d59d0077f49e03e5571a7cf580310f667eed011852114cbf9d829b5b1f40d71ed9f9b4927c90977142df2f1481e032ccb3af40da681114c42e9995c33975b06383b2f586088d24ebf085453716387022ec5ef05bf07a5e190b0c3fa530ec5e30bdb96bdd82ad55acd25e6d80f7e6f64030cc1496cfb3d8051e70ebee344ff571e23a84685aa51edb28a36e5c4e58efa293b7e7de09cc264a952abbc669031b6da68646ad55ead97dc0ace0d0ef9c2857bc1f1c09bef4daaab5195a2503edc4c9a1ee5d3a413dcf8d5c00e0ebc1a5374bfe3e1981b6888db803ba0996e4775727c502e649e3a466fb6c71d9799472bac0fc49a4064eb6f9c009fb121f6a937fb5e2a653743ae20a9ea78e2a7fabc92c467523414d2ec8ded07b8c72b732f541113763d6a6b25f66c023e3f03c486aae8904aab3777d1d879920edae186206c82cbe44cd3103acf3186ad029af902bdcfc0b767c4a080ddb4b477d1fda7084b72ce45e37ec53159747a14d66eb44e8a15c2610ab3a32f6b28714b25d3b7fbcc516145ae29fe6b6735ad85477eef5b3228b5571eef93e887f9ecabe65c4324ae32ff1e9d432c683389533e00383ab70bfc019e033c74f64779c4ca46d548b2b46225300af3651c51faa495999f303e4060e66d21d51df7693ed08f5be1497409cc91fde9866d9e107008f6d983293f7ce96538eb808cfb76f990ceaca99476f2f31f27e1096ad37040ad3b83d15aa1bd50c0c026593ca09b5f041870d5eda29d21fb838704a6a32be1b6e0f97237038472207c3882c4ba96792189205cbebe5182d42a84a7ee153ba0066ba4e6b695190748017032ff91f7fd4570c8ffdae02c6d36ee0a9b522a935bcb5a603986f82ad72d0eb511eb698f85a708e4b6e23c163e93df74b2e18646420ac54cef1a05c237c7a53d362c3df11fd251ac40829280fa428d35bddd211ac5e0a9d9cf7a07bfe672e6600cd49bae0f61e1b3bc13b776d7ba8ff69d46ca1ca463caec80f5b4fcb88570172a0feae3b84da0c8d3a71db129551e16f736a2223b09fc3e5b02c857e97e5579f38cdc7104132d224059f9572145b5590bb8b0082c05076f983097829a5ad903adb2ee486b1a1cd2dcc25b4b5ddc7a635f93a2d3e6a358e7f1bd02681326eebf4141322f2bdab3ded4fecbd876a39267d1e3b638b1142696c31b0e26b3b327e49791dfe70e870e32da84b9c1d99cd5a42252a0e2ed3d92c09be596f8905e71878c94c5b4504e75df732f475356e335874aed20512508c08bd22ee1c3c50dceb0799f236780ecca9686475738b45d54c0951e40397e93c55a3f05e4d73e99d4a1c5669661bb662ca648b1ca778355e0b48df65e3203b6b88f0ec4ea47f51afd2846e23bf77b0cae4ce30f7f5f110dbda3ec289c851efa2c4d3f488778ac4a9b38cb6bb4d8a5080765aea1477a0af160ea770635ff3784c7dfef6f182370474d16d8ea4ba436a60d9b3cfd79f7d00b3ac7cc056a4a8bb364f0a310a1aa2285101ca9db5c0f1dbe758ef870f0c2953e8b1b664165a5bda567499399eb289ac688397726a318cb4c46e16b6135bcaf2cd64e160841288969fac690bdf3f26ca2352581e1468ccc98f31c8afda1e47cbe3244bc239f85b6c70661bdc6035ae31bc978f1fe2575fa19c5a1d6945b86bedbc5759a4f0c7c7347ffe76a4a9bb23c110bf82b39f71e0a161da1e247b102416df614ef4919a6f5eea6e2d865d1166dce80516940011c01ef76d7037a36ef03aa71904649054d2f577aab2913f2a3d97ca3c558a4864f27f5759af0b71eb66d6d5db6b3efbe8f1655c70fdfbd784f15b29ba850f6ca30bb961e4dbf47288a784d550d8a6d63649b409caa75d1da2a765ad7e6f01b1ff3b9464f4b88389358718f5dc09a74d39a95388f500e9c42e955b5e023d121fa9e5839b2ef78aaaa9dcdfdfdb332730bfd92983313a7be753a7c0af40c4fac78c82b7b36bdb73fc5045c768582f6e2143f9aab97e809cf5177884a64e79e8e579d921a93a84cfd752382acef07", "525353005165535365", 3, -604189762, "396e8d6b6673b8135c8ac29ff2dd9cee6827defbb16cb6cec54dcb0ec32a0af6"], - ["2ef30d77049f64dfdd155f1d5ff83ecec61fff15118ce1b075ecd26780c78a490b4ee22d470000000006515152ab6353ffffffff1c50142f3b7c13dd3344ab02b7bf0328dbf891df31e53340b725496950e0f42b0300000006536a006aabacffffffffe9ec38313be666250e9628a038282c74a03b5f04b478ed28c74d2c614309e5db0000000005536a515365ffffffff168e58b35ff97e828c478d3be2ab8b16e58a3a9b9f1ec5bbe7f1b0769415f0390200000006655200abab52ffffffff015658f0050000000009ac526365636a65ab530000000000", "655263526353", 2, 1787584635, "16712d42b278b33e1115b51b44b02f0c80cae74fea95b35a7f4a4ae8a7114d29"], - ["2948947004821f488a000d39c646da1c42cbbd76544b69a0f9e7c44ecbfcd43f46864f2ae70000000008ab516500ac51ab53a6b78ba7bf8c7e2a80c2f633bfcd15b3d1cad988ab1cdd103d2c009c6b08fbcbd12ffda801000000003def159327e776adfb7fd6742a98e65bbadf8a66cb1082db611bffa173b9c5af3777a206010000000153ffffffffd64cea1b805fb34081405f1a251e558452c4964213602d8c81ef0cfa60abda7301000000015267a3571f0394db530300000000096563ab65630052ac534dafa205000000000865ac52635365636584fb74050000000001acc3169f460100000000000000009ce1e7020000000002570c9d70b63953e8bd4b581c5ce59c6313f06e0db0be5ffdf408f292e4f92cebfe7c81c0ec26d956d1e69e819f8ec74cc18bbf1e3e0a3b2c611e5c3feb40fc73e4ea9d76b929262f268d7b9df0d9f06b32b7c539c24221dfa4df9d433c11e500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000449159acb66cff3c21fc9b8babfe56024b822478f9acb6c2b7f68c42695a390b9908406572a5115e05319b34c9db51087e53b26e3a63abc0280c24259bad9da2543480cfda49dd3a1b0d2a357710991bc0cac8e901e7c735be08aa7480a561b1806acf6ee9d5a76e0a08c4f3f5307bc681bff606fc38fbe6167fd16570efdf8602166dd4aec39e89a521489f6b4f3cf7934d7cd03e299b5b71b8e60c7e31f0da7c0315d7bbb7e128fc05e8355665a6d1354a735f90e76c8528b6c97cf294e8d0a6520a277cdae56eea7919907e6d835d6bf605aa25c5041a923913cf8433626f961d260aeaa0611f56c9c7f2f0ee2abc331a63c9653e4065d77356e49f11d42495683a031cbd1d7075167f4d6836c905247c88a59b5e4b7010112159c67ead399c2dab8803250401f6b3f58489885ebeb28c6c8c27e104bc1f3672a40ae08ae4b32a13a55803133e1ce170e923232e47274fe0d4ab2c7728fd43d8cce04f71292a17831763ff03137989a654d67392bfb5329930acffcb81f96311b2c3466bb50b407569daf7a20323a0d3241ed03b0cfa97d611ddccc049c78e89ab8976a51d5c89d5762a0e6001766cba493cc05b6d50afc41b87379134ea7f9a857fb434171a895ffc58150681c21dd30c12ba7b1914a1657011d475c2a905c0ce09c8d9c863310ce041e00d68ce006a7e61a557e04a34bade65bba55d0272370c2fcd2b9aac3dca58a9fc734a92d81104d5f7b242dd24664510fcd6a12b58faf6b11761b6f9022403116c68892d621c65a4b6b5be5413bbba3b4b2ac62c3a205d044051f4f56dd083cedc06c3273b2afd42913085b1000b243277c53358d9d3fb3a94ef35751b3bda28577cfb624cca38708a29d1c4bed0805524b650e624ef49fe2b202ca20dd496824a8ba7ada0e16b1db735cd4cd48b0bbb4725cec0fda50dd033084b108d66d8ce28259c3b14564155f6d2c2db0e182db1e6a0e27d5aaafb2dd0b28b7bef2778d37109b06cc609e33ecb31601c952d4d79a27c0297913c78e4b5eac02ded3dd8bb7e99983ee069d319d1a0f58e26475c8b88b4f31c531d8d36e70b294302e322889c23ccb08426ee4a1fbc0fc9ba389ef370f8af284a214578d87adcf2de351633cf1f0d7bcc87a7baacb002bc672d9be2d970d2d018a5b42a3124795d753cc76204f06f8b249c8e167ed0de2888196243175f55b1aa4cedb2f8c2b0dda188c9650d8c616b299897fa882b6269143159c7871721b516384d95bb1d3d7cafb4acc0fb3b2509f419fffe89b2e63a81fac41a2a2d09cb43497718e2eddbcd0013a4d35c776ddbbabfdb69acb7c26342ffc3d8d1b5ca6edeab70ce11e1fc196e9c3103a87f26a3bf10ef517bc6bdd9b5ece920b7b64ddecc4be792a4182b79dc671dcf2af8c16c92416101d22a73f253a18a4667b2d02fa207db1c6d5a7472c56cecfda669d06725c6bd763279704ce92833f1c0129bee695d6db09efad962b7bba711a8db8c1db2137d90feccc6a2e1737d1e3346ff62f94de9e4e112d45743a26e171ff00ef92d7805e44138b1fd698adbaf2480573845a7110df69f16760bd870be8ef66e91b3b613367318aa28fa5effceb08180a9eefabe52b9b359df472ccaa007370c3ace9ed816a5b4ea2451ab4b1075a290aeb01f7ab753c21bdeaced13cfab7c8d557f2d0dc2af92db62e3cfb8ef2980b26c4a9c087dc6124e73097965cda4bb619ead2b3cb329175ab3cbb8d2c30a0339928f216f91bbd45b3be6444ddf1840aefad1567d3d9081bc986b4d0497e47ca05cb25b7d76e9b40ed913f87ac977cf813826bbe816dcfc7d9f31fc36833882dc1076698a8414e3e501e93201d6b151b7007e7f2b91989a64b396d7f5e871cbcb6543084c68b60a5fcae59a4d57a8b4b0a9eff01b5577a56756ad2b4297d62265a5e438477e59a4f4b72c9f02a20823dd5f87eea905d11ef4eb8b45840a388c04c49c012b69a2cacf23d7e7c985a251103e8cd8de4f4639fc9bacf92809e9535a256deda0d47b803360ec0454e498c7458afc3d63e52510b687f4169c0fe893dc40485255b3bc02b60e5b6fa0504839b84ab677bee57c43fe65b0987a9673fd66d3734365e8fbfe5a8d8bc7357511c47b3259d06adacc817fa24a2f2bca8d8d7ab646777b11a7b4b5f1d787558a5f61af0d0b3ea82a088a1ca3fc59440043cdc5d32defe8ec3735193b04d03d8bf8f1ac0a2dfb18a2b4bc2df9adabfcfcaf7591367b6464f04c417c0d0a2833c9978bd49ad047a9772da068f4d65e9916409504506188baae2259d22f8bc9ca5b4716a7314aa02c1fc82e7f53704c3f8357546c5fb088ef055a82eb0eb22ca12caa62151970ffc6fb1e6dca0dd589d6c8801ee8c9cdfb07fefb0e47e63edd85d597be2b08848ccb6c0ba6c83890cf11733820eb990d", "52ac", 2, 356458880, "581a4440aa66df8d50b7b1b9d184acc94271db485fb9b4d8f478c9d7ae8513c2"], - ["ad27122304affacfd168901af107231f7cc7c5d08517a6f732512aa49178dc6b1021dffe4a0100000007530000525263abffffffffa67c63d62fb55e2c64399e7d0bd7db6ba3d571b1e30cc6e97e2340701e57e0d9030000000700ac00ac535352a8f456b9c4c4e7a54e3afdffdc54c5e0a0b92fc8b0256b5efccfaad2264df35add70862d0000000001abffffffffa731a85912c7319c654f5508f08cbc3fc0cc6a3cb1f1882f84f4c700f68fe9c103000000086aab65515351ac006b89ae3a04466a74040000000009abab006351655151656317df000000000005ac52005151ceeccc000000000003516aab15a539050000000002ab63b115cfe1010000000000000000420be00400000000034d6101e9b89785531c01906e9ff0e910836abaad764de1393d3a36d481902ffe9b5b8031967693791a532baf56b7451a925beb4e04481291589a84421ef5c5b47f347d25d351063280fd0438b7bd3fd788008090484791cf91a2ffb64c8d80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005aae5871f61295c68560c384d84d20ebb6216b36cc0b2054d64250da548542bd0c6b6e8aad8aedcc606700e0c6cd944685d4a601c0a18e3fc018ec8f68c03f70ce317fb90c12755fba476fb4ff7d8a38c80c1d5b208d621342774dae9475b63b9ffe10329ec59cfd77da4ffe57088e1f3424a3c2ac36a836b7344fd01d88fb9f0222bed57c79bdc04afcdca64c47d3604a5f8494b6b16082f8814ee91b97f3abb50213f731821b30f9fcdb6cb8388e423e8b9d1e1c8ba0fa53a07a1110f1fdaa65b00b207fc8a3fa7e84d1b46a7a7d3adecb1442172531d374401c3fe94271266f03e202d80e9b89bcbd6c906de20430f32927db88eb2a421bac4199b37a916c62a53602074a666fdaa5d33b82f8d4ddb2cb7ea1bfaf92853361fe3957ce437687c7c39402180ee87ced11e422e5aaf4c8c2879f887fc6c66d16b6b4f23cea92bc7d164928031aa2b2f7f5293076dbea1b1ef8eda9d37e3e40c29b48322bc6447badb473532103177b6a160aad8580784710b60dc7b9f9dae73bdd9e0f921da9f42e619c7618ac022cd77ceb4879f9c61b9ca9fd32af6c03eba6ee73b00f0d68c93be90ced455dbdbda1262d10d620cd5307d1e5debe21bdf9ff3dae0f3879057877c858b312ad2a38fa9ae855ba04268428305e9f724b6c4f94f5c04716d05a310ead935d13d1a61afc2b41e818544eb1d105c7f854157e151c7a1666bd7f00de453933aa57dcb0c45255ab048085f2f31abe4697a1f0a9377513bb590779555df94d7d0c23deb468b7d1aec6ae51d8c3e63d10fc63f62236ceedc6f16165222ff0d6e343d92771bf73434e97d85b23857f9f1d01697a0c822505d02ab04b750f3aeafeba483eecdf7e2de8506baccab5c48b387533dea608732b52e9501c34258fc88b2f2d648feecda678a95b30b9f80908a2bbd9ff90131e27d50a114a12ff7d460700efb44543cd9ced178c7cbbed232571508e704251c1384b06f62fd9191e3c40f980780f2de247c426d7ce7ea4557029825c8f43bcc64fc73dbf2602dc5236cf2f40c8b8e645a83c72d2ae4078636f0cf8e2836af0964117ca40752195174a0334573690becb0b7349828f64037e8a7953b6e5e285bf2874cd7918e5682f4f48b13b3ddf0ee478cf555db5cc6426c4e365e6cc11710ec93b18b4ef8b17099735a87bd9c200a2efb2565941d574aa43bb517bbd8d0e51c09a406efa9e1d0608e7620cc3fb7ac32b098936ccbb9cbbb9a9f19d005204c51e6979e67a188c8802ddb1a4258aff84b3968092ee2a4eeea29edbf1b6c67f72834fa1e295a0655c7462b65241ef5fe925a3e285a794d55259324c17352c116432aab28bcbb3702ca9fcd758cb465129baa659d2b1241b5460f01f8c427bd8ea7b27aa8a1977ea18e9de0049913046cfb8b5a4f87e98beb4b3c4f65efe1ce198f1f40638049f9f29cddde518e2ef2909ebb36c14be127272adc3b4a36e2515a02d85989c2bbc9ff97c581c80ae00fdb0ea8d5082edea7e77f3c9f7e2b8304df130ee7cd502c77ec8712660bfae430e10c7d73e998c10cd8effa3b0bc3141179ef60661e21004f979ba64ea1ef06f71abfb67774bd836bdcd2623866245c73f0d78bf4df88477c1b74bb34bdce98f9c50efef5e5081625c175802ea7ff91c1b6a2f45960404cc0997a0748d92d9494bcd6fc72e744a98256c53679140a7612e95bdc6e2c1cac19d188ec27a3b55c33675b5468ff8240cf6d8ede002987c1c5d5076c85c295b251c214d001be1beb3a0e7dd3d952e95c3aad40d39c6578e19574b62ee656a9100a6a49eb483d6f77fda183eb7e4786403fdd7b3a245c3c4e6d9ef0863bf66c355a216cb9c74946508aa784e205e03c1523e4a0d27aa899755d314f9f683a2f731fa672bcb572cf1c7b4567b7ee5e7eb837fb329a253f30c729e8e897bdad874f86a93b548868f5407b74a33674fa5d69335995e54362fa1b7144d946346c9b05c20c3f65a6cd3bd64fc7681df698c62e57962782d94fbffd2cc4a3e65150ac368210b7d2e1447adfa47fc95e078e687c7af2fbcd1343002adc2f4773a9612be5c8d9cb3ebcf2dd18dccfe96d090f1470ca47521f6548a111aa8255b53590ceac0aece91dbe5337bd26a802f8405f08fa97f0441fe0a0dda8b08492d4006f287624508b005b168d8c06688eceb63b9239916d73c238c12a65ed42dfb4932b5b8c775dc7ee6da13194aa7de1245f553ddfd57553ea4d524460f4865c90a3f206ac0f2ab9624bb396844cdc6e8c4fd5342e039bca5e8e3d08d12f85e1fc99905818c9399c56edfee3a53cdba456ba8c3aab90f424c27c04e1d9f4d32dada28a33d30b7f7714af1422ef3583a40bb96b3f6ae169143692d3f98d0157069ee2d3215948ebe7fb37537ac91146633984dce19e645bf2cffafc9b3b17c06", "51655353", 0, -1366103095, "52e61d542410198b92525b2d4350a354ea74bdf9c40ca81a0e6a2e2a1d60afdd"], - ["f730670b02b819203e4fcbd569e1efedd9b5fd983fdd0224a7db7ea049d9af9b59e63f94760300000003ab6a00ffffffff16276ebd682469a8bfb0093fec1e87a5c0df6591c4354b2e33d57697b9f12f0901000000015259e8812c02d609c504000000000153bc77d0020000000001520000000000", "51ac52", 0, -447471684, "33c3d2a3499b8f570c0c539cd47995c05203618a007918fb32fd194c444b2f41"], - ["dc791b14012d4167265bc134c400dafbcb9eaf6d05a25271a655db96b2626ca97928131f960300000009526563516a005153ab487e4fc604a13860000000000001636628e00200000000080051ac6a5263636a841caa02000000000014975f00000000000652ac65656aab51656aad023f796305000000000000000000000000c9bda62f29cad177ef7f20f3c08986605d0d9c6f67cc143ff9a2118c8033f66d3123b1c6aef8849bb4e967fb9304a33802f25bbacf57d1e025acfe6d88ce663eeecef1d2a6477dcbaa2aa77c3972424eb306dbdba7ce3990e85fa69bd56baa9d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008fff75bf9b1418bdd840b3ddeb7519b7642963c3a32b3700e1798dcebcdef7cd127fd1485b43c00ba9348e42fc33e27126bd34598c1e1109e906fc8c59ebf496a18ecc635c1930944a6f20bd58cc06b4776c6424ab3300d6935cc06dfe6b29ecff1a998b4854948e0a6e8e7313faa7c4516cf01b8232c3a7b19f9bd5c98ae09d032599cf6a74f95885cd36867e1c81e32a7de044450e9783f80dcfa0c3ce172fe7031851084faeef624498a5498681518d51ebb11a75e27bedd306336b6ba2f28c760b01d264c29d972295c6524cd97163634b115d73d77458d7af316496bc271194e10facb86e38b586b87957c0253daeac34282a6bfe47697035abb053e523252d20030a3fe347315d01e78e978fa95037fbaa94036abfdd737031214118240245a8f40216ff3d88e67151c97a3529ebab753a82f70e683a863f32f7f6c240a0d13427e70205756057ad179adc450ff7b0b7d34c8f156d2405641694705ba1d97ec92bc079032173b1ad7ea7d7fc11bb283d61e19dde28c31e8a2ac74112db4648b46f77fa7103148622ba96b563b97ba6a4ddbf196e17dbd17a037f2edf3ad78b6ba45ee6c54736c0fee85ca5df9d72b9e1c58c5ddd89e7a25a2367872def5f7f877cefe8d8ba06d81d4afa92f1cab45857eb7c08cf5ef7600427cc68e0c7126c12f92524e375a7713efbdf4b25ed2a48fb9b87512319853e5d4d0eb04b8a5a9dae4862677c4d4dd14daf614a188ec1d36953019df830d68510d7b09f25fbe407dc37fec591779ba08894bd8da29ad430aab9ffe47f3108d2cf6e9e5548ea751716577df44a7b42911cec852327378290f147458b9a0aaf1f2234cd6ae9ebbf53008c3f3872c8458d9e3e75eed791989fd29e0d4635df40df68543a6617983a2a6d8f483ec01656c56d92a46a49557b4933fe8e1d7e4086fac35f0a1faad653f1fea7c188117a41fff0f516e955ecf2756f4cc010aa587c633c7a2b1e9fe0cb281d8ba36136660d40037d504dc63260c45e6b1de3e34330dc1527665ccf17ee8dae264a7574439cd0906a703f779c7cab11d10a177fa0ff8cdf3c170283806b5288906519d91bbf8a7926c55f39d4f3dcae0c492e8f8b5e466d94a44ac9d23d111b458b1270d3e2c6f8ec60e8f06f57d61850cd5f351a45be6cbe18a9f4715f39b1e433e6608568b584f9a7c55321ed075edcbedd9eb2756b520fbbff31bbf3532b81d1627ea97f50cf216d6bbe19c550b97b8ebfd27f334b794cc9b8d50d559dc76899facf6deb2467fb59c6daee191e5aa0f92404ad64725d7a7824739fc2a1f44e84e6f094cdfcd98f689f116d628a53ae82e8872c4565cf1f736c8f4195426bb1938ebd5562f36578fb113c3695fe52906879f661e4af7cb21a864bf2019806f7474af08aa0c1057142ab7d003b5b3978950939a3aa528656f0771a3081e5dce91a5b26e72317b5eeeaa09976edb62fa0e2e89ce91b29bfb88f931037d7c0a5864be0e067f43fe906fce3ba356ebf5f6dd023630865a17bfee140b3ff0f7350184f32520c05222d48547999ea86b96e7912273853bcb37d84bb73fa45bea4eb63d6b44d2ffa75e34733d49cb30f44a71c2ec2a3fcfd849c77385efde6c1ee87081c568968f2a95e58820f9ee9d083aa0e05566eafe389f9c7ad6b32f9f2338a86163c0738306d9224dda0a8c653947ffb1be8c638bbde192b8b176369bc236560b2c82a206587d36348667d3cc80942dfa2e34233fc70cc0f8f75867a377426498ed998e276c3eccaa43e2426860ba835f32d8d529f9f6f98ede1a1323131900a7a7c3563cb0570b27727746595b179f445c4de71dc642e5f198bb29e1d9d488e8d9e7b6f2854479544b9d7f9c1cd67a241aad066d893d90348493c9816c83217a44506abe230e28e93096d2cdc6af453ffd1daa6ba55b86fd4957c094fa6b26257acb3aa6c2c700f6e519091304b62977e2fa103e0136bc0dadafbac8b8c66c6b82b542c33a5ad77e68ad097485cc46a3ac564f84aae97584f9e419459d93564d5a198ba69332fdd5f913b75728005082772cfc6a450268cfa293fc0944187adade23b15092631fa4c8b04abe5c2a1b0e43fe4835b9c0376094551960cdb8053dac3e7439f6d3bd69b489d99db19c3e0418ddc4ed099a8acfcf810bac80e2ea281e1f6d53b063e67946230a8202a88a5fbbc9943877b6d8fc1caa8f8653a2004b9b4b3f5f6d460d20b58227e03df6e990cad6d6734a73746eef4b05926a17d6b63532ed43caea6f5b048298e0d391ee9f49bea66c1d00000000000000000890e6f0500000000d0a71932922bc6eea5bb62f8e50ab0bed9a6d6a14ccc4abe537037cf27ddfc828ec2b93ff752dc0683422d94a6723d9a23d6fbd376821e4bb253a15845670905045c61a19aadd4279ecb6777ef851abdf0cb21d1b0f16b33adf7f638ea0a1c490000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029efeb77ce9f5f0793304e97cc610c2a761795ce333031ca7e4ccbbfa07884a7a657cb6bb2331de9bf1d8b1b936aceaa3a3f57748fd927d660674bd073765ef090e8ae3b2be239b3d6c602452f460c91057f4bdff0e591aecc740a0c4e45e1c20483fe45be94b809477f619eb78711bcb582e49017cb0f97ba11cab5ebb1de07030b2624adb44f195334b3e6242316f4265cc3f96b2ce5e105a390e558e03f745a031971b9c9a66ea5031037e761e618b757012bceb32502d86479fbfcc8b501837e0a0012c01d1eb31be25a3bc696c05bf74700e4122e2da8d6ad0ce4b6f0bd04fb582977bccbd2cbb48c446b1adaad1735bc3e2aa1489693f03931fcd0198980b4ed02148f2ebeaeb19c8aedd10ba4e123a87a5e5c396300b05b0ff4c912608e3230930305633fbd820be760a37ac10a7cf69b8c3db7a9141d268a51c79cee5b7e8ef6df0317f344d658790345d6e41e765a1a1d0d13f8277663e9a4561af95abd096f623c022f90731caf6e3120b248e10e5023115654ea5038c75be9bf11c03210aa844ed4030a0a6b754a7a54ed09099ea6734354fe1ca6aeb673692bcf27bcd8f9bdc47536dfc9c02c9052e9b43f350f28b88c2ce85548d1bbd18eccc40a275f446c5c9b71d0dc79c35b6587bd19e5a65c6a16ec6cbe4388cf63809605951acb17c9dfb95692784e3151c25e60d5c093dc7c852ac0f317e96b06e7ca72f1bfded3abfef87a1f4eed4f201259f64eacf7d45c9728f1341e2e84ec7befaefd117726972128cd97b9cb7bf6e962bbf15f4bd967fe56c94fc14e88792228a325d065c49418691ec14a27e92ca50acd92985ff0f53bb45bff773f81a477877be323a22bc813c1fadfb87e86918d9fac6d3b3b97bb83e2d3f83cf13bba3c4135af36c9d4f6dea79f83873e423dbed32fd6e52f857c5fa120d0beb13f25318539785ccc7ce7f10892d6fb78140654d6831bc3971a8c04d2e14f9228cfc3a5cd313b22b993aeaceeefcfa55bbd02046b76a9f9d7b5682b7dcc3f39ac51822653317be80cc843e62d9b24f5450925df6c82f8b7d17fd92b1fc639d9986792e6275042d528e936b84fb71955513e7e0cb61444a2c7c86fcad02e5ff4506039d98e7dcfde5a30827242a9fba4b64f3a8fd5780d0d93f847d806ffd03c19d4a8fc1f5eadd80eaed9cad9ce818529559f70d4844967fd3af536f5fb31cb9c7208791a8405d9da342605079ad914704d56e339cafce0955d0bad9be9801d78adbb081a55a25f080dce1c0e85c510ec90dec8d09fa0e14873cfa6d2e71fb1325b591fdfd88ce120bf3040a501b04124a1bc38c73ad7e0a970f853ac9c71dc646cbf3f18fe0a56816a7a3fda1e460646d7f4c7a09014837e1d12c16178d2f91762108e1dab5b37d73003b217b8b55ee7cbd7bed419a7ff5a30de8bbe8e0a7164ee521fbbceb38f3671e698363a13c51bfb29e1eb16e0d5df1c0317209f83c595cd76dd7ab38d72e3975be1129c8f3f24897035079f98944643e4513d05900e2a8aa39f8b5d3cff4b1fafbdededdd56e5de30db5380f830ba57967c2240f705c141b03f6049f3e431a412b05ba70546d2c0f12f9b869f35b3d79c6ce4b9712c05f1ad91e70571fa68e7493e11d78d509ebd594f28e64d09e017dc0c63ec2c1eb10250c267eb1c3532aa84440beae35e800751d4d5d8afd72deb9d3b390aa1a7e60df0da2810732f9c1f143b3ab64582ded931fa26e0a5fc8a31cae6e1feac32b044fa8520dbf00619604e5cfd06b296590c94cf5c0cdf2075e9b7072814fb1a764a2614c44aad1611547c4d8d82a2cf8a9f560366888b54a2b81d127c88be604448e1f42c6cea5e2a836f1a554fd07a93e64e9699667a993bcf3e35e2bd1e21a2265f995cda658c1c50b19c8faa2805c339c8f754c11691dcb847875e4dd3a51f4aa7cb9ae048a474b32e845ff6f68a6f9b3e13dc7939c4e200976d11c1acde74a654b96d2d6529d54051191f4b73ba7ecc0a888cd4d7850f4fbc5eeeed8a4cc40a1127fabc9f633e917e268187b69a0348705ddf0cad14adbb754850a89ea687cb33135fcef2dc0c533da8d6d5e363ec49a669aab2142773e12215a6fb38ca9b4bd871c6d2eaf8fb0e6f1ab0ba78643aad69a9a4f35cf8922ff71a29c633148c0d1518fe14ab027d8ed04299bcf32797a9232844f85c87af8c738c4c96402828c4e9fd523e8bfb378f4c66177ca166cfe80476629b642abafe5d19bcc46b878871cac6e46bedf608c814cc5d7d37d32a864dea654bee513f8d4e395b8e46d53730aa2b551c4a209044f6b1412e09b6d58605b13ae7b3d538a969baffa6c3bd3bacf530c28447777286e7553b7b627492197ec76e4bc6900066e0c313d7c814cc290dcf89af1f0b12f769d161acb1b9fdc15585eb9a07f6b4243c3905e71b0e", "", 0, -962950417, "adeec5cb231177795300024ea6057c3cd6edc1d970efe15d86110555fbd7dd68"], - ["b8a8cac104c2f1f1202b2b9a8c5464f103abfc76ec68dcde25a70f9c97c728404aee42d40e0200000009655165abab52ac0063ffffffffeedea1c908e8d6a0984e64c64ac8c4b77acfab8a65bbf1c83dd6efb5cdd79acf02000000055151ac51517c16a1fafefd0fab05cfc43bca301bf716d2a0f6ba030b3fa6cb47ce8c95ff209f32184e02000000076500526365ac6ab7e947d19c2f94b294f5e957d61c6d6fdfa023e08c48275754044fb96f74d14127e2a8000300000005655263ab52ffffffff0339d5fb02000000000253ac53bd5c050000000000023bad010000000008acacac65536351ac00000000", "", 1, -1190876437, "912a11a1d0a91d3b9872fcaa8ef970beedc1d813f7a0ed093a31ef546bc7ecaa"], - ["f2df72a803a849704a7119015f0a221405dbbdd49d37c7f45066ff3978aa7c26a5c00b23ce000000000951ab636a5300636a65ffffffffd63a76e3bcd9a3978bf765a4494b6cef8f4e3076419b1e83a397df7c579be0c00300000003ac6a522ef12d5e1ba7ed59ae4465127d6bfdd6e908d2b83124eac8f4ef96b96292cfc2a83220f20000000002ac00d0c91506017ae9e30500000000086a5265ac515363ab00000000", "6365656a526aac5100", 0, -1406636751, "b3f3fd143dd5df417028849aaa793fd03eb93f2e12413c664fe3919efedaba04"], - ["85e7c33e01ba66f9e807d6591eb01dfad925439101263a1603bfe81fc647bd23ccb781a9380000000008ac63630051acac5368db7384023ea0c0050000000002ac53f3ff27030000000001ac0000000001eacf2405000000000000000000000000e58cbc6e6f5e83dad8fafc48df52197fae268c571ea7badb90f5c90c42bb68381469f3dcf6467bcb19b205c098c8d1a307357187e4eac4e1b46b431945866fe3850db11bcdbee76b7b4d6f7fb1c68bc47e12ce034d20c28461cd7f23a8d08bba0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077d91fe7e9b6bf1ebaf5a113981b57665bc61c857fa7b2c4f2bc41d3a3ce7eb4ae453ebdde3f30b7dbc43eb360184676e8b100c6e7f6ea6d3bd2f1e18560e220b35d45fded4336a9f659559c597e7cdb3d84d897a73a2dba5391712a0b027ed87747b2757525bbc6341f6f922666b4865d1cf38fa998f40ab940269ea2834b3e02295ff66a347eb0e34dc24c482e0dff70a4fc9ba51436a2ea4a100e5f6df277e90208b12143cf806b1328d5dea3c24b90c6dd4713e23d5a6fdfde2a994b315dd6fa0a23eb70dbe88f23c8c245808ca9b5674dfea5d089bd99e1bfed9a48ab91e6d1e40b5fe7c764e9f8c7ac8a033fa95af9851d1add3fe86240679cd227d7041969a1021d5825068e3e8fa0c5a1b38491d8b2e5cab7d57709993156a73c36f02c9765220222547d81f931e3007322cef9379a81467e2d547f5997f84672b7ff028debdbb8022886c6fa0bdfd15ecc06ebf58f45f5b23d0c6ac1b10b61f0d2d3fa036a979f21032aa0cd94963593de76b71813d1f51641f2738bbd305fe134aecd71495684d191022cfd973db29858a06a3d35b533a1c90d2724abf6328301fc439700b89ed5166ada24f5d08418f4b385b2f690b9dec0d7a3b8136b00f6c7db8edb0691bda9601705364ace2d157939755b7d42b7fc3f4604976c38ac3df588dc1d6570f05aed8c697531981015eabc559b9eeac959e40f41d3f7f5d0b2b4f06cf37a0623f6e9d6bbaecf954ccd725fcf142b17bb7fbe3c89ad69876c702b9658f00b6637ed6c704304f7c2d234c5e4ed39c4816e83f63a30f6858b2c8f20569d4f81a5d9640f332e8bb5b68796a7dc9b5cb84c86aaa4b1b50717cd5b03d89ac59ba53a637ab3c9b9bfe701d105b474744337819b73a32f30072acc579818c860d90e9c29c207c850de8ceb24a75f519d8a7a5689d09701c71bc44cc00577bfdd451b1f0aa9d4dff2bafdb1c0c9154beb55d4e7f0e5fd52894ebf758de10d5fe8b2d6bfb9dff2812a04888e805eb59a1051636d8980f1b6332b22eb4be6c508e4d5d39f1a021d47b03fd7e2062fbb7b5b615ec02174e793a4199d6a9afcb9be63a9d0c628028a07466bf7f6078828932b6c45c9acc5500350486168d93b137e936d9a4e1ba115b0a08c6023a99771a815c56f17e2fa8c885c8fe2542902939057c1f4a545e440d65b7184715cd3d6879d83affd91064d60d00bb2c3b761a77733b2befa96ba41b10065bdf7e860e1808c7499111177a64e067be32a55f5c30dbe0a8b2431fc66b741d8b5747070c4f18b8b0da38ad378f6cfd6ec1a9fae81f5e863193ffeb8539525b2ea4db09615ae19c85fb0fc9852d9c968a8845399c2831c8eab30202057138a757b8d5ea0461ad2ab18a0e69b221c2d5544259b5ac4a2ef95b86eaebce4bb5a6b94041e06b941b4124a8448cf7a44a629a600a5f3eda14f5d0d576a80f11a44a2ad28f0f44866440f19dfe1147aabc0d41a05b41cfd768965730069763f02ec6b3e92064dd622e58c72135a3773235374de227f12406cea6297236286f396436c3362edb15e3fafdb78ee669b362b7ce9f689b9744e4956cb9416fdcd72c57815a6cacb3758e8b7fcc111bbb95e40e9ae16ebbff8ed7d5e4f3911b2ca7a0e1d435d51e061102bc424875bc44611e2f3ae59e64ac0c104dba74df7fdcc2bca3335ce69019dacd35d03ea7c37bbaa9ed443406e3e3df97ccefe6bb085fce791546784a5aa1c13408ea5c390a5189f6c3bc44beae656b91537ee4dc1fec087918467176831aa9d993270f6e2a13870ecd0d564e881bb5a19f142c84481db18360c59cefd90175559e587853a4b8f32ce8f2b40ca81cd2b5ea6197f66ed13fec0b34a0beb93e1ea57715649e2d53d02c3fa150999d5462ed4a0c2c6ac41d3cb78c2257b10ab4b43b38090976dc0a8a61a5463c2d3b5b44ff184d62c368cae8305ad525f95fd1f4d46bb6102e4a0c02ab083970445334a7c559c21840322625122c431abc3870284c5184c794cb5aa09eed21656a6bd032c7bf8426b680b6f88c5bb2dd4e93d2bdbb6cb15ef533f3b7bd3a8d62b8d1ed153958abf1911a6206e6a62f0476aa3e90f1072f39f64b4fa138a3e1cfcf307740747d2b2ec29dec7031ae338c4920419bedcd3a7a7ec776e992d9255fcae841a0aa3ee3e482d439cca50e055c3a5e73e405a179beac86be3cb274bf829b253bb294321a26a7f879691de0ae72a2c2c7371c03c96c7ad111f12c8aa6a251293314ddf865aa71a83bb4c247a0efdc9d5a281a6acc8807e805f3da60d428802a6cea3df86b81af73daf372bc267b05394dac8c7a152e3fd87be62a9913c462f68f21ae9cc76c87eb1f1ffe4e88c94d5bf5e9baf547b56e00e1d2bc62ac11041a0b4c34e113248b1db16a195fb31bf0ecb9396403164f5884654ff6c750b", "6300", 0, 2087165888, "add44d4812a1693bd7b9d4247b3d817064fbca9071a028bb033ecd92e21ade87"], - ["4713e12003aeafda525f98cac4eaec4b0635b922c814f7ccb472749ad1efa0cade708f32f2030000000400ab0065ffffffff97953c7affca64a02229cc52e4062bf5e46d2bdab2983c2bdc63ac189007b0da0200000003515100d278ece696fae8a6359dab5d73b63bc49b61f5f1337e6324210edc9e7dec7fe09f71dbdf01000000080000ac52636a516affffffff023957b7050000000005656565acac6255850500000000000000000000", "00005351526365", 0, -709014167, "3c000cd6b6b9eda3cb021a81e764692dd4ce478d65b9d8ad6092492d566002f9"], - ["76719c220252cad5f4fb8ffae5a54b762ca7bc99770ca1d7ea0662482ce27e839808d6b1960200000001acffffffff09b1ce3fe90f6b25b3c70705af6efb869db932fb5d6dad7a812b7eabda5269970200000006acac655165ab9034ca7e02e22f9a020000000006ab00636a636ae8c6940000000000056a51ab63532278433a00", "6352526a0053ac", 1, -495979550, "c44945fde90de88ae3cef44bcd0a39b1427ea57535644661a8f82227907d2ee5"], - ["1f87774104fd311ad25b33100a05f1d478c78bf20ec1ab1118d9d8e60e843ab1fc98f28529030000000151ffffffffd315730e61194b4e0e91159f37540add66307c1b7abb02403d54d5daca47d3380300000007ac5353636300653b50f16a9277bc40b985d7c51cffd7c92986f988a71cd6e50576c58953313974cd412a8000000000046351516550007b35de29477e7cfd9b11573351aa7d3dd9ba776841bb8654ab3d171febc54900baf60000000007635153ab53ac53387d31df03c0d5ba00000000000952526aac00acacac635bb9bd020000000007ac0052ac63ac65b4ba92010000000003acab6a00000000014cdef405000000000000000000000000c09b5e6f2cd01019e3d0507a9e3d15a1bda4345e28ec6b2f5f704a95d2689fc54ac05bfc5cd84a5d05ee9775eaa292b2f07de0279e6865c725c59f8cf85d91906e3cda1d8de648d8b06b9c774df6a47d3d6fe16c66e9e7e651b8e49873ccc04600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000851e7b02ffd413649e59ef6d4a7ee2d7145b340b8b95e7e923b2ca4c3715bad8545b64a3eb87ef5489dcc2887615676384eb8d3a7b12ffc395f0702f1b4917d5ef9109eb0052b7ae48109f515d3b3fe5b620c992f304bfa03e1db976e954838a90ee44c384233be3a21b979dad205eed425695bfbfc539411d9571a891448a2a032e678c6c495057c837858f53bef79eeec86079eada3fcd56beba7e8419da85e8031c82183f3f08bd4fb020ef5ed2db448c51b1a513939dd6ed590d54f8a56eef9b0a14e30e0bf5fba74309687fbd71b43909012c50db2e27a7caacbfc944d135a925189dac43cb9d92c91b396893d2d1bcd85ceb160f57a67827045a7d044f616942021bb612d6cfc429fdb8e88d069530db4e73c972c07f7da379a078e6c3aa95e1800203230678ed0effcfb4c8a2ad222406124172e3b6d63204269add610f63985e16032351e5e2214385d612f4e21b94b6bf6759828542bc3fb94076dfc202aa16cd81032e01af241c401e7023cb211a57894f128e652dee45f7e435cef65d151bf1efd702259399e6f540fd8b3af8df783c850c2a725c863fb592a759d45251e576ee2db958cb7c2ce30506e36a5699693b2316c4fda5e8ff16620e37afc91e7c223f2dbed02efaa2b7cbed8fe2bbd168109b17932eb4053e88e53e382bc3154c8cb681594d4f8bf647d23b044f3fe1cb9b745fa202aee553a7e1619bc8a81bb1ec1c57615e175a433a2acf5fef795d6e2e81ffbe6fdf07cba64c1018eefc1c96139e11f36de531ea98b4ce85e6b4a43bd97efc15b2a7bbc106be84aeae61df05f4acb27293cc716c110d73adad75123314d4aad0ee4d8521ea184e02afff0e622a3986efc62fabefb4cdeb44993673e6cfe98691e697bfad78a57a804433980a149945a58a065047c432cff46c5ee9680ebce0d22c58dc9a7cb0f9ef545492064063dd8379b93752a23700d7b8609ff402d2dd840db6b92febe91ec21c2cf9a92649611fe5b5f5acbf0145e98150b51a7d3234ba0e5139132d6660933882f5bb98bd989c9aeaaa87702f22de3a86d65698d58d8c6bd7d01bfa5081e988984562080fa403164d205c2c60d7436dca585139b1e2b23e32b90ce1f877cbb30b3184495568c0c1e70bd87f836b193342450ab9eaa582f077dc791642c4c0a7140d5f068ffc7489a932b89f118568fd9531ebe59f6a83022a82bc77a79b5e69f4be815b69b01adef0b8976e9af93188ca0ac834c9a73e06200d49b4665477dcbe8815c8db995f61ae7328ac70500309f05a9e69fe8b26ea3d1ecccace6255e54b1bc658ee44be9ca3ba1062895d77be054bc844cad3100ef1fa9d66bb96f02f5e21cb6b027d40a1640e479171fa4455b27f43126d0d539bff7252aef8e3f6260f2030e31a794753e7b1fab124c2857ab67587281eca6c2dd174082554f143c6b83ac12b6036f6936dc14c7d681a1a5483cf9743e185ec704936f006c9c938aa5c4882085886d169e4bdab42d50e3829f31725916629680a1553d4d0b30e1688a24447bce5d2066f7f91a19afb954a4e8bb54db745a3b37e4664ec250ac5f5554471f18b4994d50e8fac718d1ee6de5046846e5457376bfa6a0a487e33d60947e4a27037a2c0a8c4ae3a6f6275988f084251d01f5b204a8d943991b2f6aae92b501e6dac2a4e06ae3f8e17ffbe94eb1d7a344a0e96dbf501b309bc8f17023dde9c4e585e574e79399fee9435a14e7c1e0d06e85ceac768f297d2fb5a293d0c5a61847cdc9d40addf9fc32f6381a20ee6fb9f0909111272191de84d61e53c55573b44d1bcbaf57fc777042d2e4b06595cdf312f2af964d699218c8c29421eb059460425f7db3cda5792d812202d9d02970bb34924cba2198f4701cc054919d212132bcd02709a11261dc5eedc26ac4b26988727e667020d8289ececb1fae5fca9753ad450d8ee178c4e29865afbc4d92d844bc889e36849aad76858b3be78a2457d08a5b9b6e924e7c95b2fc56974be62435ea58f2c6c8623eea8e77d647120e734f8085ae8dce371ab36d7194f93522aaa06c644d3f655209a46b359fd854780f7bd5a684048e9456313730e80ea947d629b426a5b41b688e6213df7a8b5fabe5d86f491857db7a7d31d4df3658d6a4928d6da2d2cd39aee67c57d9a3c469c6c5076315973c59820e893d3b459a785526224ddc35704567b9778e9943585935f42179a9640efbbb69b191e62fe23605b89b2d8c08bc5926cb0f158c27818b54a255d269bed0ed32970000ae9c6156678cede674206e9380b85e120b54d8051e4ce1f7d01a75cd937bb0921f8e1ee2a4b1635ce39db3e0f3a08d70f463fe92322c8d6c62ee76ad7461754f588856a7a8d2c9d44a1d064da068c256c3c1c0c76d22003bd8f738947bf86fb73a9a0e6b7334581d042309a53b803", "5365006a", 1, -683488930, "450f6957449a8d0f8fa7f4b0e53aa284246b74e9f30e3e78f4c9c8900c61f152"], - ["63bed20e04416fd75d28e3eb741be144d42ec9d551ad78efee5d637aca0a8300a57e2c295c020000000663526aac0051ffffffff2528c63802e6287670636d7b4aadab8d24f2dc31da1c05df6b95cdb0d6092a750200000009ab6365ac0051ac636a1d620ce12fc79b1f9a594b7fa5759aeb934663f20387a5419659fa24f8094c26ae88dee502000000046a6352ac0778bda0d9418bbcf6ac3edb478b55cefbefbbb95ec3782cf7c55a6a5630555f4b933642020000000151f0653ecd04d2893504000000000352ab6ad5d8c90200000000046a516a6a377274030000000001ac1a688202000000000865ab00ac52515353000000000102739403000000000000000000000000fadf89db2bcf407f9b717ec9a852c1d9a6e231309d7305c56b69f6156a77e9fb0ee5762b01c4e30b4dff842fe343d614d8c68f3a2f31e157a9f426b06c1b1696ca13a19f1c591adee00d5b0805abef6c48faac6725ce0bd203fc15bb70dbb3d800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a19bca6eca0b478ad3ef6609469a5e34b28bac3b192dbdb3d8d12ca289c438a566f043023378c0cbe143d4fb3c1b252bbd12c68ad5072e1261a7cd4d909e58dfa65cea2d8c701dc84cd019a6edce795a8c8e1a1ebd2b5f15a1425a183fcbb537cc7e66a71120befac00c2e4f2a88d1552963711f994e7f85592ae369eedbee39022e318777fac9857961fe2bc8d971b0ba10489df20e717fa99953413f3c1d6812021700167f9a9c167ce31698ae72538523da79cd6c2e0fbc4d880e6792191edb950a0ee40f4035cabfbc80b0a5bd5ab2626c9706c14b044d02b5b50976ebf4ea362f0b1dc867786985dbf29810c789e06de40dae4fa1f9318981b636c694d017b7e302002ba8044be427adef8d51fffb64b35acb0f580d687bfe8bb7ed8ff42c359fe50221dc57c0a1db143509a273d5304b544562e7a86f910740675c1a11bad6ed8696031de82e58ad330d470545e6465c6271d40f367bf7cb7645a229e3554d522b4adf022da1c4bbd133cbca07a651edca904e87059d2f0fd7339423863aff3e4a5349e80214d01865e3d7cec5504f6decb1483cdee88d93c27e58880d825e64a8e1e191279da0d7f90103aa4192a4016242833af50d1903136262ce8156cb8b0c57a09ae4c79307d8f8b6c736ce05540712daae505772db5e1883aff9ec9d58ef3b126f9bfde8cc22c97db83449d0b78f139a6ba0c6895c957451901bde7ce7110e82c82d81d32f1d63d4efc5895db87bf317d164341c319baac0279b0c9f0cad6c393eaf9fe270c5f17c3c03177e76d6415f41df81ceaa3f228fb0f58c0b547f595fd63a04e70ebdeb488c9df9b9c2dcc90c218db6f05a2bcf5e13fa83a9b3c3b421148e11a84f8594c869bbb94aec09e1635285910878757076f500c7cd9132e356c2ba0b1dd976528c2c41cec5726ba0efddb45d8d23c5e93163fd3b5a5f80ded1b8ea05c095131a8a13dfaedd9bbd37ee23a03abc44b8cca04aa3090c88c76c53c5f8e87f6fe8460294297a9c0caed5e069aa6bf375a82c2c76f79392b20441d458c333482ee09fdfe2fdfa92335fb0877ce65eb7c92e72c05731d7994d7540dcdc1e379aac871f5c4c3edf16535f62f3144b726c32d5a4f130555bd6701c44509607a1e879e68544e32004f09bfdb5c8c8ac9356b98cb8c2237b43d2cfa5b0208daeb7e570fdcb352b6f6306c468d6c4f06fc9be94e2ad2a4e1e902274d4d1d92fdb534d56ef9454400453dac47af7113fe42b88325b66a6e36832cb0e512629826e1bed20241d05dd0ab6f02f85f5522d17b34f8bd3548409b18f1b33469f8f442b067283ee5a3bba1c64d69e860f5a70988266d199ca52bdef9dd910f69ba0daa866769e766e94f30f4ea84ccedcdcd346e3a3fc92b84e6a53202fc7f243bf414c58ddd324bdadeb86bdd7e090282ed395061d0dc6804795f3859bbc9aacd0f0af4ec7060b4b688febd9065954da6831b83e6cd107848359ab82f470e478b2d45f738d6ad1248e7606ef6727362c33c711ca25f10a2e44d1b125ccb90b122b37cf0982e8d069da3dcce5601dd00f3b56461a9723f0fd6beda083f10d159f0c1ed3ce862e68009d0c9dcf193a382ccee645006758bc1f8ff0282a0f60727bc35070b158acf741d9ba6df7edc68e56ff8de5045ed6dcb4c70de4425b101c9a88a1429d81b46f5046563a518cd63314fb3f1d5987feea0c8b8ebe776417fbfb7d02c03e706a8441ac5ab20dbbb05c8ed3ef7613f87e2b3c57c593c1fd391d588a285638fc146db8dd294346ef18b0eb80aedb0c5b9211969d03af94dda5de40fef146bedf2681e85916d14c2d56d7e4f9f54e960a85ff35e9bac2b521e1c5371922f5bba9c786d078f0d62767a30aacb00c841bd9de9b72aecb4ebb8527919c38413501d6fa42741cf767b89a96d03d77b372faf86d7bbd7a960317c867a9d0cfafc3fc7995074d094b2ec4859240c74809d7f45c7331f3945cc4cae9d8eba99431193cf935e0ee96640b65f35b8fcb0cbb7d77d5f5e18bfa005a11f8cfa4d7f85669851f2c1de188a0062162a98985d55b2c61ebb5cae48960f417cf6187dcefccfd8a92e7c16e5a1e24509d7fee2e68961ca2594527a35694cf179a9ff6e67565d79cee4fe2f06695fd7736749bb603c55b16a7436f9ab7020339b71ba76c8dad5d3515a360ccb5190c5509550f3d2a0c11358ae31122b01c124f5c2abb94abe890b7995e4017027ebbf2642973263e81e66bdee616b83b19199677f643ad5f502b1676aee3a07ce09c69f65dd1346385202077ce40f6159b0b008585fc5b39298ecb135dbe41e881ba5003512adb8ee9514598009204346dca7218de9a794e9758b353ab156c9c75528aef15eea817735fe11c18525c0484c6ecb50e50256724f5cf2debcbb5b2448560675b70dea4a7a1a205", "6a6352ac00525151", 2, -88450697, "af59dbcc6d7bc923432c631b8876ba7927da6010b56d117ed91dce8cbdabbfff"], - ["295546c60360d1287e9c4c67fe0e8ff101ffc5ce5f0566ae4d8f68c6c95a7b572146cfdc300100000005ab0063526a4d7bffbed0cf8a91c00e2d99346a7ace4eafbe5259966a7a2a37d42ca93b6bce4b23e8150000000009ac510051ac65536353ffffffffafe93b13ddc5da3b5ed17b98c2fe7261a169ef5d33979040fe9f8eee3056302100000000055251acab517707a8be02d77f7d0000000000036a00007e370d0000000000045152535200000000", "", 0, 1347590081, "2064e8aaf6cb16c46dde6d7b43656fe7f98496e300c756512e1327d51f8425ce"], - ["d469e4850209ae0e1b2f1fca793f467b5356a7d543e36915d936e2099eafae4dc97125d67a01000000096352ab635263636552ffffffff8ec67f49c7ef0fda6af855bae56d87a4e203ec94c183b9ffb2b4a820d4f9a07303000000016affffffff02ef159f010000000001ab5c9a4302000000000000000000", "6aac6a63656a00", 0, 1034546221, "3281c1afd32b47a8068cbefbf7f143da472998ae25fffe1a4bed7e878f5a6876"], - ["babbc4e50354fb024837d24a3a172ef8fb4bbbe0c908a28303903d47cd378fb7d867301078020000000500516552acffffffffa1f26d1e880e5a32c86e735bb59d6926eb5e53289c7e10df58936e5dc14162b701000000046352536aad818bc117e1696e5e82b6f98a7b4167565b2517e51a411a4b0ee43297cf3e4bd36721680200000004ab65526a9271c5af01a31ed5050000000009516a636352510052ab00000000", "52530053ac65acac", 2, -692393489, "09bf3703ad560e529f15cf30e6a9ebe10f53fd51034b6d65ba0211bfb3d3f3a3"], - ["9892616e01ceb38b1b47845894e4c6962bbfab6b66a601b51db09e438016f7426cc4da0c3c0000000006650065510053ffffffff02d579130000000000065151536aab512fa6ec00000000000253519731b2c902000000000000000098e73002000000001d03263d242c299aa10c36897e197284686e6761c7a3250fe8064c63c829d8d34b332f96302a02c43571acf3ff215db278c248891a0be6b131e2ae296d4ec6103359965d1b44f7f16dd64a3479dc7529bc3e5e19daa94709e707e0a5d8e19079000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005bc918de29c7ef6e081b2683fdedb12f59bfcebaa017f7b9d725c4cb259c66c130f346234d5130cdcdd92f5039d53234ccbd4b0bbe7bb3dc17452eeb1089addd2164f1c57a9f930c402e92469bddce4ae590f1fc45fa3e2f93862f214f3ce524d627c71140c897a768408aeae47457670e09b1f5c5eb23a210ed85c9ba51e198032810f187961ff8b34067eb82b714d1b7690afbdffa0b2fb8d7335bbb1d44b7540201d469033d3c85e3b4ec7727a1181bd5e2e745e073ce87236fa6b439ff88edf40a29cf2918768d8a9c18302bc354f75c2e9a2c7027981eecd3a5012581fe3d8ba1036ee198b3dd93612551ac551e0f6906b2775f08c4108e955e231d965e7e4c090227e0926453d8ff4f4e5a2fb52a2094e3e485c847e2c710e25d8d8b23c88b0dcb0217e62195f0aae90cc76600146047e566e21476cf408b5e4cb9cd098cfb4a1a90031c2a4cb5319de7a737f7d2370bbeb7c438f9575701ee5277b2ea1f9755e6f78b0212a8aa80bded47bf2081fd68fff9a36c82263a0c3d9a3f438b840cfbd16261c403229510647176c7ad841671bcb763467391147826b732382bc6a44789c0268ad9f05680af1345d3255a0419eacff6bd332626f6a04fb5fec00dd25f3c0b2812d703ce788690d1b66ae5bd5fb5ba907721490df47808aae1b30c427e3b13cd7fc50dde833d5f7ef35552b67efff8d571e19efa21f958777997ca60da7d3a8f085be2c2963ca59f08e640ba01d28415f80b90e7b320cae84f0af96b1f6eaceb2ecbe97bda4a817b4f3a077512f783e61e95464ae690881d950ebec2308c1d3a295993bcf2168aa5c46e8d3014467a22b8063143ebbdded3e338cedcd84f7fbf8b1853bd8a4a20a70191dd432f0ed82037b41015cbb593daffc59c83c625701400c5775fabe97df6335895a754af1cd918823770ae8d585b1822064c23d2bdb9b9bbebb0e7f0c925b58de9d1b22fae8f1675d6cd6e5d76c67dcac9ff10b3fd6f37320c92953ebdda7bbf84a8e87b9b2558af2feb6ded41221150006b0b0e1e444dc6c46ec76106baa206db1b94d8b5a7fb026ffd0de19797f5d4dfea521ff0790ed83ebe7c74ed5f238189f0259d2e62d6857031b6e7d333f48a84340876979ef59e1da82a4ee28ebc7ecea5058d64cdc1958f70c3a5c0a63134f5767c384f5af795a4ddf3fb434da677831c10588c55372170ab96652cdad4292f32550882c5f1ad750f398fc4432ac11ea7e3dec403e1ddc95eaaeaec2f38a30bf221ea50a5f6c5f929507c472c81b7bba43a729bb2ca143bf619f0b61883bfb1e41277ac91247032f5157b3eee4934f21a8d102cdfede05c5f914de84868adcb94b61654537dbc7fff3156aaf36e651447302e50d2a91788c762d977970a48372a10ba27b26b0069c8744bcc0a5dd1f16ffbc1ed9384e5f5f420090b974fe7a2febd99682e58ceec438ebd37ae06f7b9de342c7834fef164063479fef2abf2c9c24cdd71934df9a297be24dfe71d5c71f67d8326afe59e06913f98369b82de32c1076493da6bf826095d926cf2b92d5392d86fc518234fa4bb855fc8fd76a6775e8d08b6ef4785c3d6b5be60cce170773a3ece25bddc0370594978f3e4ee1325c7835ea8cb094e21356978fb79e59846dcf4eec91fda8ce7439ae4321a21f0151fc5714ca11c0f878582d78e065d380f808dec316066c085a9f2e6ae1b64939ee6eecd0c68f80dd1892f8620590fe9dba4b1f4952ef5e2e96afd477febfbbf47b2a47a7a1d2075f32ccd8b27537fbb2ce52325777967e2876373264fd55496a5dc8f1b3d89ef6054273657f237a3c4f71ea015d416a90d6a1145338c5e35d5c205785f9f69a899ff81f234dd076f36a9226607e1598395a5d814c68716bb4bd78a5ce86610fee789bca6df20e9f910ad602dff695b0398117a7417fd9207d9f1aedde5437d4d84e12d3b3794e580d7525e15f1d78abc5e33078148c3201d6d7f8372f205f1008047821107de0107de9103ca452c760d5961571de6e82996f514d4581fdb542a795f4e739cdbe2b27b52bceaa2b0f53b937713dbeefc250947879269a8b55c916e3676b7ed41082795969c58dd4d33e921b66cc9bbd7983908fc7e89bd5bc0db58feb567fe232bdab8b999085cd482e3dae9ab64b6534508763bdfa8ef79152d28c366cbe8aed8b5ff9993ff0ca8ddb41fd9042b5eb2e19383b01865081d4f8f0d57991bff0db2e0cc87e9bd982f69ea71d1cfd5713ff26ab037b30e72859a9b877a649b4dc33c5dd547fda850618531e4823ac3b0fd010000000000000000000000000a64b7eb59f259748906b02676d69ed3116b2dbd6d1afb0ec79809ff43334f9df803c1c4a7dd4a5d6ea2bac9aca0566abc13f3bffcf074974755e350cdc5f48047ada8fe442d0442f1cbd27dfb0549fdecf0af356235cebed2ddce29764e780500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000245caa44317a42e2f10c816132a6891d7245e6be929cbf2ff8adcdf0a9c4c186563813e45c9bde0b41a24d48093b1fff45dd6c80b91721f564f6ff9b05b89efd221486a93ceece49269aa10fb50c4ceddbb0db1baeeb6146daebd240e9b151de8e0459e45c1ed2c08ed392c4a53764a2444950df3ac507c70a709c8a10a79a0b0314dd15eb13042f2c735186af767794ea49b88af6d100782466ca44a0fee8d5ce02020f6580539c8ee63d601f38ab68b09bd7c112ca9be20ee9fb79ba83397018390b1254ed52763d7937a1164ef090cb6f6d6253089bdc1ab2820d380efe37cf94d50c4c8d1b396e5a6aa93432573446524f3717f093d096bf18c0071dcc532e2da9020d4540ff609b4c436f8f37b7cb0c78a92ea7856334e69fc277a5bbec848b4165032461875f4dac230fb526a9f43d74c3dfbcf7874146f7b1f3656e8cf525defd80031da12e74c5683b52731113f689f1fc7e8ff18e92c15259a0123d95a95bfc924e03214f41ca0f5f642c23d8d06cbcfeb857022d620456ed9721707c5afc08ee4f6d020c61fcc4346f6f50cbf71ba24f9cfeab167da86223d0b8507259bd16cc415e51ddfff674513723289e54ce2ed1f90a586275c27179ad671eb4ca3dbe9d03c599fe91d17b882d73ddc7868408b5c3b2f53c1dee0a827d3008ed298a555d83bb64b208c052be8cd8760526a7a693b95e676726ca39cd096239ec62e39720b108718e421dcf66ecb398292e1e2cee7cf36c1086cc0d826a7300fc57805c27d7a4ce1b6573b7bb5ab2febb1ac1730207031e028ab51d17e7e2a189ea788c2dc7dec41f2157cb825235aa843019b66832030c66bf572aaf2879aaaa004296c96261f018aa4d38c41e05ac12d0ec66af54d9e6af9e86bd7f401a61a80a89453b206e5203d86a1223c291987118572b178163a553e4063f7a1787f3b163980d77b1c506d04bb3f978f63ff60fb0164f80765f2ac51583a72ffcabfb428ea29900f266a5904a206bad6391b53d042e4623ce131445a6b2972361c42011495481b76b0795614f61515e22f51bc76646c8a603b10d7fefd72f05d472aa47919927f65f28d87a6c21a010d293c29b064636a3c6a536dbaba570ba6341ccad314ed71aba31442b9f41be83429ef5c3f87be284f99e917545e9a830d3efb3b0327ac8576046f020aa0b7d8fb52ffd9739cf5ae785908b6fa55a98244784df7e204094cab4583ee6fcbc7b90bf0ed7c73881eb1ea1c805062ef795dd6a406752d0a6bc4913daf4e32e6caa648463c855a7464e6a08789d173845339c99d8006f2322f7bc0137fe85bfcd4e55e86970ecbfb02d833299fa663dcbf4307107a0ffd255618833cd780e01fe93241117c4f29cb190586a564af170314cf365f629449678cce9e2adb31b5538fce4656db064aaa4d13387cf569cdf12458ad4f081961e53da52f564a691352d1269f6ff4501e271c8a6a70850fa5a9445af1003dd461718ded4f75bb0d3cf553622845f5519f47e763d096e8cd5aa29242f38da9fc65f83725368686c6fe969a4a90642c73a47c3a02a841e6455cfa534eeadf715d60d93f0c5855bc5fd5d055b5046e9aac35fd173dbdac8c075a68634ad0f6bfe107de3d7f39f28870fd948781f5fb7c65fe1c772efbc133e438b1864177384aaf02d3b346ce1a45676a40609d3357f794d272a87929ac4fc3a551c2e315b34e23c2f7f127234078aa32e7a6234108865fd3d7741d8126c0cb933adf529b1437f94c35821289bade5a210191bbbe8cdc90e9444f6bb4710602493e9d9dccd18ee58e27d997c4665d8e9e0c344404e8b42af169a548e2b09c940467532ed177d0601972304da4388d3803d73551b4a5f84128daf12cd467270296a6128631fbc0ea5f805262586ce176f5131dc8596d46302e1b2e7da0bd89d33994ab362d2c3e21638d135fc97fd9afff0e5c183f9a32d5babd815b90a84b1124387b165f8cc660ba3e74eee35ba48f080962e6078fb91804181012173e1418fdc4401b514e7d71cbccef05fd491ca41efb0374e1610925370f1e3a3eba9a9ef518c96c472fddf7a0ab1564bcc2873bc50f05a5cb0fe1f3e75c534cb818dc05bfb6d1e6022bca849ed0e2e10fb8ecc7b41a7028370840a04ad6b1b7e4e82cf5968dd2dfa8abf55635e56c985d97b89da0c3cb43f7a4cac7e608dfed8aea49baadaf149f756e90cf2e4455010c9430636b2f4fbcc681ee2ce7fbc2f34be1d4422c672b0aeb99e42122c597937b352de6b7ab979bf0a52dc703883387b6632286a2ca594af5614efd00608179d22938e4ef5aaab801e9c6e5f5f7ca6eaaf17cdee5101f097f9f9d497fa8988236bbd01ebd9c640ed3a896d4c89ef853daeb558eb0aa50c935a9a6d108f8030ade97afd35831d0c6ce495a1624928d906affc00b00f", "6552536a63", 0, 1892728135, "6bfaeea13cfadf49012587029f1d02d79f71d521e9c3fb692b7020dbd057e880"], - ["7689ad9d029f16c29b3e263193aab8db533cdb68718995b25f0b2c76475b6e3bafaf6ca0c5010000000165ffffffff0679064e307d1bdf157152468c7f4d9e71392aa1601066f8f5ec2826f83e58670300000009656a000065ab6a516affffffff0434f1be010000000004ac6551ab3c5e3300000000000465abab6574793d0000000000055152abab53c6eeb603000000000700ac53acab6a6a00000000", "6a65530065", 1, -1047218082, "e11166347a75746b579a16ec592be7149e66893b64e89afb1bedbc09d9c7d544"], - ["e4f4601901aa28e15581a3d2096702176f61c9b2f47be0429b35364df06b2512f221a8314f0000000006630065005252fda584f1027807b7040000000004acab516563a6fc0400000000075363acac5200520000000000", "", 0, 2114858216, "112c419c700b1f6df42facc85790691a56e57ed20c41f9e1a3095f38e261fc6f"], - ["846fe45403e7d8a4535472dd3e820db507fbcf46d473db1011926a70326f33fc012d0e76440200000006ab5351510063e9aead3e202c50dc4faa484bc497d6fe094cf4276292be894189ec40c6e1c5b1e04fce17020000000851526a536500ab51ffffffff1d016303bfdbde375f0c12d6bbc8fcccd44669f6c66f44e4b2bcab1930c4248e02000000085152515353516500a9d863b9028def11050000000007510053006a63abded0690400000000000000000002ffcb1f020000000000000000000000009270d9aeea91ce99c61f2ed3078235c76e2e540adee55fb75f017908fa55858bac11cbc0ebdb84f8f1f7ce9b06ab65ea4b9fb4788d9280efbd1b76414a4890c4e072bcbb74b81e95212a385281ce8d99cee9a45857f3d92b57fe42e20b993c78000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ec3391758ea56a3ea48b9556dc1a621d085d56e13b6a6eafe50c6e62ea90a69793e78ca9063df6d8fab5b8fe2bc685dbb360ab5641e70dc6732c45907876e2c1410c6fefd141d917180a6f47094d0f64cde604e124325d43d8de1412b9f778927158bd61228d1cd90f28a4567d49ccb10a3abedae0bf9766f792c982c1f27a3031131e8bece564989792cd473632042c434fe6f394cdc7bd0fa98f407c9804aac032a442c80f93dd8e4a1daa3350086d0e2fecb6274a343f28fe24854b67acc182a0a2a81a38d5d9d0e806c1ce40216161022df29700f3f70fcc8ec9e9b7199ff75c405810a3ae051b958189aedc9a4636d4bf0299c698e1a461c634ccb482173ad940312af512454b6177189c1598b1ba2bde4fe80511473ae9867c854012cfaf4ab3b030484deb51892c33f7b32573f4a832a9fde7fbc68baed21c3f0b3cdbad536695003201f94617f43b108f65969f522cd12431b26b680e18371819499530a3ae9a03b0207107f091d3908a8938ea3eb7b23ae0e2859f22a80663c670f972d35317b6a88020b11df65c9d0413f3c2665cbc4c2facc4738ec9512d600a6aefff6ddfa6a318de3e08d407a4a2df216f0ad0b55b9aef3057e293fab46c8b5091374c1c9e5dc4802cfd162109b0d802005e3a117c0a7b7c7a65b2c96910fd9ce0b9ac2cf3622746fec09a76381978273fd52c59bde4595fcfc32b5096586669378e944ab2d5f8fe6d9d1a92565d982f532bd129a58dc205805bed06db72d44982e343537caff78e72484f6f379a020572cd391f7e2bdafe480b372eba2186ea849a296b9bec2c15d1f21cb1b0f217947a63389464b7e339cdccad24e9777611c3d8a11fb1d15fdeedb7b506bf6c3ebbc7c527549d7de56db6324f3fc333b279e49cf7a03bf82e11f543c5308699560696a8c3587ece47eae791f1b842a5a9cfd486b9fb4a4c6d1e8678b7492ca370d5750d90785d1c7138b4df7364a20c659768303720e692be4fe88d70d950f23d38120331bc2b5c6d81f228bd8e5098c5091f665f2868f654e943e8942181693b134e5b772239d2e7dc086456ff6cbd8c18fcb3c27785b45cef9eb52aaaec803cba110c0b0b73f542e64de53fc3d8410c9319674e87e0947ad4861d8a24096cea7a4e9e59c8c687396ea229fdb5d086ec8cf472d5052600fac86a37cf7ba210e63066b21a860a1e9bb6245ed51e7646c9bb9638d3a641987d89641d1914c1d55a8ee9ea0dfda5fee47cc68a3323ef04dc25d9a439fc6b6aa59f577e1b7f845ef073057c04506400b87747318b3b586c561f9ff0f9e0d2ef27788b6872715f9403926dd0ea89a52661e7ac04506bd692a574e350c74f9c0e81a498777362a14b676460286731d1c25ee135ae820106200f0c936e6ace7fea5249f0f36079a862492582ad6cb0f4124e28616b620cf5240cce4f7d1096f3c2ffbd401db388b3e8da05f5ec17f2903648d1d12c6df2ad464b41f0d3073629d7707b1e5ceb20dcd24c6de57a46f06cb45d664e7eff7e34e737944bda9f608cb9fa1dc4941c6bc4be06ecb9b214b50e7d906bc94b9befb5ff6443b80b4111b47dc4df011ba07f795686c11700baecec3d738aa9dc92903609300eaa8aff595a4dbde6c07c62e8e6f76ebe2b1251bf5b5abd8d24c11353844f7d435cb5a3b5a400efb7ae22bdaa5482f3aa8492e3f9f31c38caaff910f6693e488ee2d243a446b44a12c1da808ca84b108198307e5a1d26eff8c544018bef51de8baf6a37e6d1511befebb398d3fb50e87d9cbab880268903bda163f4ebe6532787d6cb9f5b16ee96bdc1a457d960e14fbd10195538f717c178938827d2a054fac9ad06fcc641f3dd51b7fb0cc51c6634b51bb764e7263a7b580f9058b5333576d3cfeb80b557c146f079eefbedf05c767791ce15df3e71426e16ceeb7bfcb0e1960bb73959e16a0bec2e1162e5ea28bf5ea52806e9591cb57747e30f4c3ce911ef544d930c4ba410e40f80598347e1efe61c0486e469325f4a27ae1da724dde390a4a7f1369caebf8cec717304300209c041a0a531232f959f61f4449ca48ea8d3dc31f55897270fa4e24621d5b7d8a411b859735a42cb2728adf6337de910b5d46844a0a10e75dfadf7ba69c4ca4ee7c503bcc4b8900d9f8bd69b744b5607977a5565fdfa690fbcb4c24ce208522ef0e517cd252d715b8cff6ad3d2bee69b2270a6ccf9f3647198cdfc29c2a9c4398f6b057bd51818714f8930dc078be83b3a8f5abdbcfd06ecfd41c703efd87a61e3abf35f71d9636f3f79f5600000000000000001ffa930100000000b64f67a66bcffb1c63ac0a6327e1b428f9eea8e6645d9b0acc2eb2f456da633b45ea36c52035e5b1cbda8d9971e2ac0f1168e1293e4c197c5c3983ca49004dede4fa6334c04e3e58d34f10b970ac40dafe137fb3934bc887d5028303579b2bb80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080dd3b72eede6224bbfefa4615fb3951c21ade7e728049edd9c4a47e949ee2ff19d8cad1220488ffa1211de15a42ca35c6f7cf3a9427b1ee8bf2b68506d4cd93f13683484372325084064bde1f82f8453198ab4555e2f18984f595ef145d82dd58863cef31e3ec176a3119a090d3fb76feae688dfab365c6080cf58e0890c0c502122b8eca7f7a03c96ed979d0bd7d3b57a1b635aa849df7b30647ed57af820017030726cb4fc23c1dff991c995fc8f7de98b4075ef27181e85c3b472f4dcc68bf3e0a04930b8a92b0d116f8fc61664f5259d52b8a7a3393ce5659053890c9723cf9c030295a0fdb18cef7c2f18d18cc4a27b410db639a2dfd6db323da01cf7c7c97870207b4ab144b656afb6bf1a5578c62cc33de42b8bfb4d28d318de1374cb3e23c930303330fd593e9cf7aa499a300a479169d100abf7dcbfa3466d3c082f02f077e6e032ad328df1598992103b68ddbc2cf92ab6f921bf5c70f8cb310ec56699b10aad0031f835da933bbd3f10d49659f27b4955b45efebbf7c57331de9c2338470e9c52702287fb0414847c7fb6d6aec40d626a33a52fa36d904ca02d61639c03db72f3142f0f7eebd249c7c7829792f395e91fce1d19fead1ca23adabf8c46bee535436bc72642c06438a344d8bc17d39fb400a73b17e5499a92468777c47eff62a342624668fffae4fb34991798776519abb2f6133edb1d08de1003f51d6a9e59fa0a2980b305ced2c91ac80fc6a11b3e93249894682986ee780e3647f7c294390afb46b562ae442ee15232594bc0b1f720e57a8fd25f028d4f3c5be66968b4a66d61303bc3708e2833c1cd8e4ae4b0e3231237e5d124ecc0dd6989d438c98b0414c482ba1c00e2da895e5167d00f2a6dc68ecf557bc945ae5caeb929f8eaae33189343adb74512cefe32e0e8afbfdfe67de127325cd6b0476ddd36ecc3204e8b66a5373ec43cd72fb7b5def7b77bcd1817828400b6dda4a2dd6de5cde9127197912ca8d5509713d8d4bce8a38516f49af621a4bdd37eecf6906411edb3105e81f20ee002ff22871dc4092b61c8623efce4a8bd61cd2678d1a1f28ad1f3b2eb0efe17d1c90fcb7fcf976fabe3a68cc563301d8d37b552749a018cf46dd0e674df1bca611a6f60e6a673c08c0b99c1800881f0dd59f09a8cea8e1e8fcdc7957df98294e4e2a2d177e879dbd8b32b0b8f792dbca4863324f202e2b8db6a954add0b48e2e3ef073bb1b26975f99ea9d35dbbcc0a0f05d6bf9ec98783d76f0675e9ad1d4241cb6a8189f1fc98ed5d63921a3ed58636dc6c47db66be370aa5585b7e00cc9552186feaeb36433bf8a5f34fa17972de7a2b1af7b86b4ea809b56adf7c10da88ca2b09a33c259006e68304b0043b8212a5db9a80ec41fc783096964f76afd8ccf1eff36d4f567e1583f1d374e6d43ced952eb51a93ecba2b0e778d37687e9607c60e4e7fd0dab394f6d9b64904008c4c3847d5c953bd69175100cbfa575b69231e11366f2a4430190ba809f65855422070f957d87ca29d1877a0f1ce5ff3ab24d999b01946a354d7eceba6dbfec78c86ddda721a88153fb5c2b641265f8a8692cf101f121841f61c3fa21202829867389144c0a99173e51dcf077ac42b97a981046e116cfd8f17d130c7c374effc099bdd7716d44fd2c64c46569b2171f4013b36a96ff7dda89069e6a00203db08d559facdf998c3790777fa9d6f5ee592b0316c6dc4d096078622e66c0d3772020ea220bf520732c17d0b1a8e5ff24fb6bf01f1cc1805c63fb7868c083ed74d17bcd4113876b82ab2ba377553eec003c89fcf7940e3ba7797da1b9311fc6fd3bfba1550db9b8dae11689c65aa074e41dc99f206572597b83f69a08e972898a4b50c29985528e66627d556c0b65ee4c4636488ddcca46f6fd8422689150e3d98de849b5f3c521f8132e16fc0a7eb2f06710ab2b140a0bc3736bc133695ed6b1daf504b8303f3c9ca61c6953c53c77f60723b3ce20eddd797573149b1a8eafc01ffa2d6200bfff9b7993aef0c260e1e28f0161607eaaca9676ae5ad8956fcc0035b9e08072bcd0a3dc4405958b52505e39ea2697a5b6999d0e4ac545b4ddb00800229aa966d3d9bf46e6813df3e9a77af6c342b696766de3a6ad60107b32b060febdea7e8cdaf6a548c51444aecbbe58acf2674cc8c2e367b01ffad453f65d9d173f885445e9bd54d67ca8eaa79b5b3621e525fe5b739b08d4de425d121636a5891c0f78e1f3d599898ae09a8370f1ac87bd84350635e7013047ad22b106860fbf9a88e1d3cb5e0249192b2daa5ff11e762a090cafd172bf57717e242d98a50e095ee50cfbd5bd2f2ef66297a21ecfdafef66e9bae8673ad66e2bfce58a6b407f54941ed66be7a913e56841783254b9894bae527813903b74e114f628628679034b7f6245f2d07", "ac00acac65", 1, 1641639284, "9d2a18f5a50f6816f54abcf12e64b04a0a086b3adae6b1c98b3bbc9e4b4c5447"], - ["5526363b02207539a5179f292c3c6b5b04deb0c210e76c55fbe05e38d92a29891d05e790820300000004ab006300ffffffffc99aa8fb5b415011e101e533443d030e520ef680931617c71c195e19b8a14dd50000000000ffffffff023a731702000000000100cc7c8f010000000004ab65ab510000000002000000000000000025acad0000000000c2f0ccb56d91f1d17893dc7982921ef048f05f2bcf6a5b91a5c2e42d1a351877a7f9266194ac9a461aab0f23d2137d1650dbb942c18d8b08a368dede4ef62fd8850a235b91411e030d000a60f041e98964960b1541a0be27f60b092bc3a53f35000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009736ecd469493aa81b274004f367e9cb9d0af0a475f5996d80359e5bead13b02d4ee67fe0c2241776d8d4be8a42cf897423590abb81c19f868bbff4f36efb0a28c8392d983951533fc7e64d273015896f53892fd3427149fca84b1029248912f53d07ec1193e1354a82462050f1bc3dcdf813c7a0f6f89e003dc69637141f9a502283ac7c874d38f1e90a794f99f743a0e9e073c2a7ea5714bbded7873d8685da80203c0cecc4ceffd291fb0feed6dd80f3c89a7f8c64fbec08ffeff6ae3f3fe6eda0b2874358b22f646dcf47584f1587e5819adfacf21fe0e791f8f83b8b54d22c0030dd07103201e0f9108637ca0410f6219c1016cc6aea1f050cdb9b30f4d2e53ee020fb37cd018135c47ef183d07087849de3db284dff4cf41676ce6d79b75896e68030a96aa0f9ae1105891341616edf8a977e758bbc4b970d6d18792a062dcfd6ee3030dd86f623bfcdf9683a202a635a19c21e43587b8e059922c8541e3eaa8f3d77f031b38740684cf2b05384221a93a2eb70548e311a207dc5cb73ed91b87029ab2bb020a27d97eec12c614d68198306154306210067e4f2dc55b26c1b6e98592eca4fb45d15a19b8402e9ad51e023316f1797c2eb4162789c4a91505bc1eff2dbd079933efe3544004c60ce661208336e632c3e3728b6efe467e6bbe95836820896f88c5b830c16fafac4241e9ac7075408c791442a64d4d5dde985de46c27ef3cc9e943e1fb7978b15f8a42d15e623e2be6a1c8d57f472f7292f7bf286da361aa4b0701a35c136eecb879a5de93b9c92210e7ac8e546d0a6a15e8985dff8d5051a5a15fcdd0f9f92ac72481be00de734e4825462928f81a0a520a03ece9bf22fbf5f0f118fa02f5192821810a2d5b5ae225c357dc9e6125c53dfe278dd318d7a4a9a1499782c07d7a396d9d6675f140646054b87b91bf38e45fe74f51690f273310514c7adc37b12769e65752a63b5a8c3885248f63f6f21cc375a3963efc213eb09184825c90010b652176fe0888e56be49698e65e5ae3120aa4668b65febae01d89d9a3aff26e0ffe1a68252341579144756920c248e7b4b91f3105b7ef016aef312e7009d738da266862e4ac10c8c003312aa1a9f6fa9571ef99db4d1b4ab3f61441454f85329410999fcd00bfcde0473fd8499d6f29d43e23cfb0cb40927c72ca29ed914b63d98fe3b0ec68d23262478061e6f85c540276275aef0042022251de62dd4426ce0de56d2490204a969076a3597ed5e451224b8205df17eccf51af80dbb411a29dbfd24eeeb5d27c11bfef47c3b651282ad65feff88fcd21ae46cfa046630ee85b1dd4bc79899b9e32fa2dffd009c9e87e24896e9b9ee7a3377c739e36686a496d8b4b6805758779ae61556254af4a741074332417dcc82a89b73209528e44d34108837640578641611a4323d14fd06a33db93e861a1bf88d72e50e53b719a89dc5ca036e058e2a2fe86a3ebbe8c421aedf3689d0de13efef148e821a1618d85cee02741c92ff64cef6c51010fe04e0bad10244ba4374b8c0499ad82dea48620b1a4daae78650466c424f6c56860c2235cc3e510b0e4209851c1246bc9fc453a44ef2803497cc2d1475da1b32fba7c7e25852b4f628c55004c27cb5cfc165d29def914afc0a2fe4e779a4b49d3387e73469c9d63a48f731d6cb655f60cb923aceb41f2ba9a414899f42109f3335273aedf7437fe5153da4a3d3fa9aafdbee9b263cd6ec6b77c6e95d9bf518bf3c5cdd672482083b72b7e6cd59e0f9e71f1019997a23be3c475eb146487a87998ed8186102c86dc1d72abdb3b50eac4371f86a3130848153c59bc2e5b1fa4d11c4c3a497be063167aaadfbe6b81e883765fe2f0dbd4784211de1ea7bbb7673a264e17317d2255803bc9513cbb63b846802a370e82b0313b3ba7358eb2d107697c70c990eac6e46fb77c9627b8aa4770b158b610f2a97892d8f5620c9b52dfce7e9de215845448acc8f86da8183601da4796a0b347b3942afbd01c08ab0cbce0b950a65e911ff7fdc6013a4cc06a565f89bce90a395ffe308fbde9b1760a4e26fd6a91c641f98360212c638f5f36692557d634ee86b8f6e144a2961fd74fa650553e58fbdbea376d5009f8a7b91779cd405f0a03e597f4bb44cc5896164c6c7ecdaa7969deccd47d85d0dceb358fc2aa87c871ecfbbee6a3267d0e07d8407a147e7147fad3983dec8e4bbb6cf2c95fa9fec33b7266450b03ef9a53e766ac0a0b696dbcb493226bc9b4cc28e3e3e3b07b2e32427f56d6fe02ec95f45dc9a3d519cf3e00000000000000004057a004000000006f8f0d2dd5ab8233e3deb9effa58757d69f0ec390426fa06a11de6098beee9ea912ef902827c191ca8324aaed4ec9948c76cdbd91fa1db72fee428a28ab32a20171bd13dbdd2a134785ed6e095cd53673fcb2fc5bc3f851f369f4fe7506d211b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d2ef009022d1d022a2f8dfe875499efef58ba3a039aa45b97dd973eb010cfd2f0bda6b7336e846482dd99dd2b9141aac08bcfaccfdfe12053af77522617eadb7316dc33b50a09d029cba7a2f2be2631df3926e6541102c1cf55199daecf3bfe38f975f1677cc6a2a7ade33e24b244ea3c63ec85d54935f3f196ecee691d5871e02093e0a09e91624a6077c4f6f7646b460500e8d906fae440ff2a9fad536544750021dc494f451c984306b4494fb39fcb801fc3034f630f2f4a28a3bcd082fe241760b1532bcd9a0508f98fded2a02bc0b2c8475c1efdd85a09f63288125fb6f1fa1d008fb20b56d2ad5f249075cbb2d0fea0d61635defa6490298e52d060589c4e7d0021c7bdbf03382a417b85e2d1be0e6b0fd7c4fb6cbd41cbd4659a3464740b133fe031e4181297fc899a9ab43c08bb9023e8e1057b1bdc0275dda41b020fe360942eb0222a0f03e2d97a5a1a7d4631d1a6f9456f7e08d9be1108b2b4f1e58109f6dcc93032d2c65cec6964626937896a1c1f7c15a0a036429e6cc97126c55f9550a0c6b4103024361e6bc8df921089c6631f65d1783ef621963d156be394f01df54c721bf3502d06adf8096f87134326c698b5c131ac2b87b5d80fce3bd8fcc74fcf77bee563bc75579dea6aee2fa4b25827bf14155211396cb7730e4a8dcae92980b5905899adf2a1e985d46522c33c3fcb19dd76e565b889694795fe342b325b37befa8a59c5226d212aac3f56dfee56499cb2c613a6af98a4d24aa791430606d0cd2e1f90004aa7571cae53daaa8b782c702813945581d536162b054da3b18be206ed7ffd8ff63aa38eb4a6032650aab892cba38db534e68f92f6ac44cecac1c4c00f6067cb114ff0f02b77b215446d62c2befbea645fb824ac18fdce97581f69c02050312861c09ecdf9fcf3eacb943963e19d4b10283fee919b7fc9b29f8e0191a90f2869cef0628f6af8ed5c3e3a38629bd12732a35234a14fa138181dd96dfc8a5868d4120564ef1cad8f18f6ebd308115422d4c8efa03c583880adb01bee8905e3c5d68bfe40f88c5b2c116530264b58c9c1af32691eb6dfa75aea7048b4313f529b05f5e05b80d67c544acdfa1316ef9ae51bf7bca9267803bc6d5879d0c507b583966d76ad9b3760db9e74907a203d08cfa96e9528ad036fed55ea5536479290361780821f30c0c29cb5d21715b07d15a10533f27eaaa5bbc517ab07b4b0a4abe785f5e1bb1bde454a826c626f3f0d7202b65be539b3920e5e438241f30015bb472be95d6488ee7e799942007b78e13d1d1917e255fa954b215f57524984e4accd12e354bfb0a1953b68732d7cd64d79706b378f535a25f8c2da0a21255ee4f1a6e4b6a30a55dd1fe2e9fd7a24aef9f40100cb930a62568ead6753118922aa9c127e93f333af8a7c74624ac303ceb215e76e0458e8c9facfbbf5e61614daa6aa143fa1d70d916b23407c032032490558558a20442714f2f09a79c02cb4acc9be76b312729fe12b1fd0b424175b81f5bc79ed67cff14a17d264b4d371b957ce22b246c427ed0ba5f32cac6a4d5bad7b6e201afc5e59e8a6895c28fdd1591770553d2b90515261c69ae018883922316a4dce211d794163d050c3869ebfa1b37b9b525768e5a01313f367f6c456d83995cfa23566ddcd78d110e9866b2ddeb3a0e26c7c560fa635894cba77dc422fdb636151361c723ae2ff9458bd583007e26a692175d6d522f7f52f4047579f5b2b2c970b7059d72a63c10f98c8d21f0bacc78c7cfd120af6c1748372f80bae8924430e79e4bc03ae32ac80ba0fabae9fad13afea0d587e630e7a6dd8b54a5b3f7ee6b10696b2f8e1d20e95569543dd1263d8b88e1c14e94bf8b675513c33f63a823a02ecd5e17d3df8863d61eeb37d2d21b7f7eb3afa2a49bb7d45150cc8ffbc081d20ad6f6da4be259abeae68ed3541148820af709b6f3163bcefbb4e3571caa8d13569ba751e4a0f04408a46cc6dac51544e6ef13c234ac33848e6aeb660630d540a525ed87251489698343e278daea6a4655567c33c245b6e8f2ae336859d59359fde81b77096896b7b2d3a152c0de84ad01d2d6cf0e021b28f5b7c5cd3c669f8ffe06d6aa224d5e43d7f49bf5d7306cda15cc401f554d0d2bc4733e9ef01c600542bb92e93bc3cc78ba09ece5f7d0dbe27d2dfdd8d170f5cef328f269b279c84b51f90226a0cf8118997de6a8c384c58484b36597330f38e2f69d019be136c4f8dd224b81004672a6d7bac35f62ad7c0c79dec02b2e69c6c6bfc883481150c5f4b4714dc7948569655a307328ee88597e0460ec97022ea828f9d722ffb304848e20e283a7213c1a191d15d08ccd97c8e205193215ca07d4c016bab8d6f6918b16915b8cdb4b3d0fc8202612e4787bb3272cdbcea247c16fb7f87aace742f7e409ed4e01", "63", 1, 960838316, "7f089987164ad3f5fbd9f1625ff59ff41182322e8c1f5270d38db54987ed5185"], - ["9bac7f9e030b2bbcd8cb7a5770477cc8b22267ca39e84c25bf41c765a5ef7981028d52fbd4000000000300ac00ffffffffefb24d6e766fc4738adf6b29e9da8611d5183aa8bc1c8bd233c4dff18d2488d10000000005636551536affffffff7b88da37333f75c6d25b003830f1d4985ee9fe66e68a18e2224baefa75ac818f020000000251009d1a0f4f04b04e39020000000005526551ab0044c081000000000003ab6565f2e4b300000000000963650051006365526ab375e30300000000046a51515200000000", "ac", 2, -1086449835, "9a7cb056228fd8a5c4649dce58ac942efc79961cab6834fbf4c1d17087ca311e"], - ["5358e1970428ef726cf86e705c4e163da8a74505b779f89607b1ff5220841a2766bd9b6f5b030000000152ffffffff29b333f03a03841b9e5a61c79a318c9f24978dc2fc812d075915ba63016e6c4f0100000007650052ac5151637f73db8f9f115c7b4d6954e5edc5b76e68b8e4205814a63db9efb92f657539b0ad0e4e830200000007acab52abac6500ffffffff96121f2a8ab243f94bf36cac375e5adb73f94d206d8c14db4ea1382dcfae1773020000000863ab65ac526351522742635003da1a25000000000007ac0051ac65ab63ebd74501000000000265ac1f3900040000000007525200635300ab04bb0250", "65005265", 0, 551506993, "5b2914174ec9ccc43daf416bfa1986d811c69a00c2e2ac831bea774c9090ac1f"], - ["364148b50232d66d22bb4c5bd1ff075a1c5b6858957dd028f444de125a7f75b6431dd5bfab0300000003656353ffffffffa652229ab35b609f08b0dc29ac15b600ba45c1b41ae0449b2d463bd97dc00b4d020000000451515200ffffffff02daa301050000000005ac000052ab696dfb000000000001ab00000000", "5352", 0, -1999539600, "c754a37ffd5465ab6b041f5c31941237b783f62c70ce09bd9513d6a8351b8090"], - ["148802ca01502802c7bae59f87102b3ab620636f8ad5ff45444ebd8114c11ba71acd1b9c9201000000036aac631c3bf57104d4f1f8040000000000aa86b603000000000500635200ab2527b80000000000076552ab63006a00d287d9020000000000ec2472f0", "6a5363", 0, 2111177408, "0f6a9b49933131fbf3a0c23bd9e21293af9a160d09d3ff26db1d3892e2dcede3"], - ["e48ddceb0100469ab989efe004280d671e42a12fceb7e40c4fa6c6d537f5e92afe61f55d8e030000000800acac65abac6363ffffffff045c10d503000000000352acac438ede050000000000645b8503000000000551abac6a659476c1040000000002526500000000", "5352", 0, -1542168280, "da74be9b9a2b04dfc172a01c3cb4e0d08a019f5cc722f9e6b2b018dcee8a9809"], - ["c6504740016fb606efcb4cf94898bf3829e76a1496d02794fddc4f6b3b45363432889b3cdf00000000026363969d56e10197f23e00000000000453650063f5e64e970352da55000000000000000000000000003d71e0209ab867ab1ae99403d8979e4da7092b44312ce4246500074c88e1be49c55ce0077ddf5525bcc482d9ed9b535d3396da364683f2b51d7a2e2f42d15140cfb5dc200011b31d62449e0f48a95102930f874d5fb5ef6c47226da8c63d780c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f5b934aae6a4cf6fc51c197d036dfe7935c8150f8641f89139e8c69994258cd6e9fa8c5c84a506045cc10d4bd5b79c490fe4dbf4b1b2e4a4f82a5313abc980437c10e9d2af4a8263d7980e024db244368cbf22ce38b9fa61e23248663f823ff7ebab3f9bdd701c0c3e211d480a3aaebef5ed07513f2d17d79b0fdd73b2108a9032ad7714af6cc8e5561cbb910e31840754524f4038e843d6b90e30dcb7fbac44803180bca320bfe88ac9af382bd4c43d3dbdca7dc69a83de56e1d21e19147c11c9d0a06cf297cfac0337c96386416f10a8908d3190f4654b6582ba79bd4669c8c8c5103099fa23861f4b99c342c66ece8cc58bd7523a313865f42a7efe7835166ab6e02006d3dd53710721539de0c3170cc4aa5e27462426b2622ccfaf629b08d6ce596021b228df19ce5ef9615c2de90e5284e85e9d67c5ec19d22f9a8000ff4b8cd60b20305f0e6a86cf22f2f823b9e583833f16d798e677590da0c6339ab00e042d2fd600321d5adaf0bea96ebdf75a81e98f41c5d9603ed832d13ef210922e373be56e3b7031af15eb5886cbda69745cbdc3b5e719262451391f6dbfee1ab4a5cd5d234ce1f9bd77f87416a2384a4001c5e9490e907a4de087d0a57cdb24f4e4320d88404eb06ff2e8dc9504232c108c228d9c1e43c1300778fda465842a11fff264e0b62a0e18b3d30a6e7c4e28e58c751f3c75c962946e63e1b52c08944a63cdc1a13e70c628038b0f251f959a9962d9470c1c032c980065f2aae719b086fc12f4927abec273c10d65d08562aa6727456f9a507240582fc11e041fbf7b1edcfc4f04c850d937e743882f7521ce3b912ad4785999d1ab901b00f11d9ea5ffa40ae6013fc67c910cdac4968645e05e5379998eb3be3c558a04dc8d5ea5d7d81a9040dbfac50a2f40120281f5b5d64a9a5be228e8389f8bd630d0ceafb67c3b11a391118871e5d2b9fbab5182e65959719d53d64696b4b46669ec81df24be2bfc418aa24f447997650a3a6d3a2781715d6fa445605db762ab865bf57cb10542eaddcdcb15fab27315259ae4ed97175bb9e28b2c59353b4d79ff2e33c35d4060f241223374b9c20c92b3aea0290d33577c81484b83956d7838d1938af7b5d4d97987c44fb1f7124ff36bc85634b7e4ee36d9242bc91da00134934ac40f4ea4ca4241e0bf3431f85beec3bbc612dd5948bfb5509318dce2f6430c65bb7e1f01919c3ea7b657b81cfa9d7167d2caff8a878622825bb99371c50eaafc87f492999e082afa64b51fd34c653f84c2b70722c1ae20d66da171d484e74cdad251606af9ab4a5c640363e2437b2fb5b3c8fcecffe6dac6481fb85a406620c351e6716ceb91ecf14af07951120563679f8c3bd418842738eb12a94c245100614fc7f4c4b044cdc983c8588a10d08c9f7525674a2e6253c00eac9cda450f9676b3be731f20deeeefa8792fa6b6938c036e0d283bcb965c3f2fdd30fa3a1dcae15db2d09ac56f99142f063efb765d374a4435c5b9433644410d4105bfe3742071d8f58d1d9739906f920fb817d4e65d2f85d2a6423fc693db4e456da597e3607b8960fe39623ecb67319a298adfdc51cac58726bac88995286e09abff241b888450d624fc2a098a3503920eaf85163152797a5aea0ecb824f2d01424e4ccc832a819c50b45347a6adeef44222995aa3f88e36408290929cb945071746dcb96cdb45a4532ab609054aabeb01097b17ffe1658302d7c12d3ca2dcfda6fcc92d6331c41720123481f0d8fe04ae69fb0e97b5153ac809475198a3a99ec4b7b99e099f2436ddcc596c414206748af51d60c792a37b0cc5acd6e79adf8b576952036c289e24046251f622c85fa20b22b2f25631c9fa6564348b2db192ea51ef562ba45320ad6d977f3ff3e6ea209954b2bb974b3303f36137470298246b223f5aa5c036aed4f57ac23e0a04f4acd7345f98de6cdbd74353723602f69186a505d3482b51eb2403e6a2a1d4ec606626c2b4cc2f86b044923264ef1f1548b3bae2a3ed59611eec0cfe1a8a77d5312dcebcd20a6edee208049d4d2d0dabea12bfc8ef9487bb3091edb9285c2683dbb4bdd8db21d397f94238f4909ee818fed43fd415cf0d2e3f88ef5a6e44c19c02dd7e0979e382c204bf10b2fe90a5f0a3c4a5dc1a23e42767228fa5d4d462de098421d826b4a451030954147e786940fff8344fe03e87e32deaaafb09b97ee3f1eac121aac557124ab9984b64db315a6e51b380ffb9403c834741b9d037da45195f93c7ae5f2d0454611394c8ee38ed2b89fbc6aadaf1438030000000000000000000000003a5a935336ebf09f809652d2c24ca5e9a8a1892ccce1890de760e8e474ca1e08f8399b1397fad7ee3581f4386b30431307b2db1170daab394017cbd0c2e949338d75092c1fdc6a7b457b0fe481e67e3ede9ccb419d3370d1a914886688ae7caf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e2bc005eb4038747aed27933d48c1207ac30f0603ef9c0800820de281438e39120061386f1197db87531f2472fa308da52f3c02f66fff25e7abccdd723a61c0793679e799c11713d1b185a8ab45b2df0a58a6846735ab4231f6f845e3abcbd4b0fa0cefa62837ea8e23439f9d04de6d46c79e7c0560d66f200ba4425ab7086d1032230e415b50f4012b3bccdd0ff87a62b9c742b18532f2860b9df641408d5900f02274387adfba5beb62b3e32e32a87dba1cb20ac4483a8707a223dc0d596ac52680b1c60980c9efc10a9231bfc223909c37a38b77d15036ac0d13093e96914b77bf91c07e01b1f33834844543b1821380ec210a42678b7a3b06cbf1dee2f03aac15f022aac205a0b77648911c7d8475e1834715c18249ea7a9eb9da564d7c3e3ebd460021085295d3ffb71dff34255ea4364248fcc0a05003cbce7aa0bceb0244872ac3903241fbbbf93d57b8f3ef6141a50e40ce15e26428036155a84fee5c3cdeb38f311022ebf16eb52a1ceafd1cbeaddeec868e88f3db7e6608dccb1859e24db323abe39022f50851fa756a0a75f0ba921454b9a717a4e249b9516bf6ad8173792d041ad50e5eb1b2d2cbe5525e4e1c7818be470916251a9e95202892e0351b4dd2c5dfa765c71310d8412fb9473cd939cd1c07605c53342d167c2aa49daa7c7c702e8641c7606273d5dcab10ca42253ad560ffc1e19a5cdd0388f144a65c9defc0fdaa8861f42933aeef6bef1726d7a8c171d1fc09d075356ba8064324700bfb1fd4b897d98cfbd585384c465bf690e6a5ccda7e64519c8791f96600db0428712c6e417364b7179114aac76159e49e0fe0c59365fbfde2eb8d447d302bb8947b70c9d5fe05a270175a898e88bdeca5c9192795f8e818cec7ab99cbd7f5a3785bb643105ad47b60037eb1f36c4fd29501362c29fd40e90f61879b7aa6f89bd45a84a7e0b57443370ae0cafce14bce5cf5b8c4bd9c0fd8c05a721904444cb7d6512f125369d2e3822da83a9964773a7f23cba5ecd6a63a08832e561fdb962dcf4ea7da80958751837765b2db2f43702da6f0eb43acb7e1ca678014f642f08282df0539a3bfafdd30596f5e65f3aeeba9d185f6e881c7ba2c6b5d82daaf6bfad6f844f58dd84f0b36dd231dd6972d5c5fb59c477a0a0c3298bb37bb007ffd6fbbb30202c6c401bec220fba023b5a6f0a4efa67d4672cfa30f2dfaa366b0cb159d60c919cfb527080471c03b3ad148596352b4878c3f175c3eb5316da85e2f6e39858b3495265d9fca8584bb08d698e5f3e66019f4356db609586970a3e4ff5db2411b8f687a3c5d20d78b075402bad7a1bccc3fd8c89fd3b261c8b98cdd94551ddd1a306b82197d05cfde1ef70494638fb0db768e6e5f8e974d5bda7b09a52b561c5f20a2d64b385f877abaaebe158e95cb4377bf53cd4f69339b0d5cc3d77c61d79616d55e89b85465555f4ee934055e6ad2c6e172f0b154a4c464c4072a2dc23a713b5de42a84511d956735c05dfaef5b833091500833d49f24632d651fe872ab426ce0da00ed6a633644812cdbc10de53c0c0fb89056eaad9e444c0814766b451c7c7062367a6dd440117c8a4a2edaaa2940f798cd631aa447d806d622f9ba38226ab8b826efc46fca361168c434c83f1e3e36b392e33700a0daf2636548a9fada33e8696cedce851c71ceec096f1862d296663814b39c0449cf6fe6a5edc6071066a5ba623a7de49d40eb508dda5e970ab482848dfbdd6ce32fe83df71e7d19aa4de1e941fd01bb59d62b3382121916f901a07a9ec285a601bf8ba5ca20cde8aa3b02f8dadd013a32a2fdeacec5285337c4d49f9ed3dcbaa311aea901f92ff5fa87e9b2ccc220c3bca897ebdef4ad02312bb1300e19e831f33552260d3090caf28493e6879dc1808bfb33c0b303b18d5e2fbb6c1bcb50977e53fd6cd7733696d686b565660947e1a73a85e2eb5ffb9393811e4d349f7672d05d24f086acbf651cd9976f9435b46e31bd64c5e83db61ebb9af3396a0c3e3c63f110764449203996f101a90b8e52f8f5ac8133e80e4bab964f9c8068f39b2a74e6bad5b23c431f7c4467f100808abe7541e9248b22057467902d7c3d7961437027b2a820e8f7f4399d8ba59a61f06d4b3c2063628df594cce22ef8f539068ce0fff67f6597b883c9174219875c3baceed2ae2b146251e2952a7902c655a4939b442af425b4ea370f57401db1a545e1cd761c6461d84b500599783c4b7f9331fca3a62c8c1360d855765a5a14084beef62687e14fb5c816963fde2e6ae530000000000000000e9057a0200000000df4c54642565d4e94dc6fd69c1e1fc86d09a8aa9b6a257c38b4be18fb3f65d70948826ef36b22352015912a8a1c1b6682e49f56c6afc7fdabbd2fb4e666218e3c6ea04d27616932dcfa6129601eed83a9ba7995952098e62e66adaaee1372d700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052fde838098b434a8858a335614c14127330589d3805413929a4a555634938c145fb4b190fb6b1aaa5eb465bcbb6d958023c0ff32061e66d87d31ef4bdcafdbdf6b5ec5cb0e913d4080207d862cedb4d829d94f3829598b5a4cbaf5e11f764b5f10cd37aed2b0168cefcdf64a26a115232c9486b1ce2c4f927a13752b60ee9220311becb4ebaa1e190effaffa02b24cd1299ca52d2486af9640620be27768286db0303a5dcdd1dbbd30e2846f56edeec5615672aa35b62bd055e373c7c9c0b4604ff0b2071f12924f2d9c3c70085af0037c9495ed9b51e21832e6998dbe4f0fd56c5941eb36652c7499f1d897733ae156c429fb786d87ff8f5e0a0dd025a518e6ad237020d0bd4930c827891979ded4e7a1b42b0973edc223225c9646ed780b2dbc54c8f0315d338c6d62edb42001e98b47b5e31e0276272505a6571abd168f586e451725a02076eacd727a5f5f514ae0caa1819a7a0ea0a0ae6d5b3d7d4d044ca7e3b68be19022114b46e2680aba4753ebe3af1815d6d1e5707f11f9b4e32ef0ae6413ac58a15031f2c87dd2b5f9558ce8ca6255f0a3dfca3d86322ea4ff6964cd715201bfc7e2d12808373ae732ffcb11cb9fd120ed583d43a2719f510c2a01c41f308e4a70c572454431d1b090a0f4428b9c72cb4ed9f3c71bbb786b76e3f617f98316076fda943498d879a280930c7c8fe44dcdba36287e8444300d02ad78b76fafcd993947962ba713691b84bf756b3e132a508b93b3c4a014d455e81157c1775284d9ad0c1d7498c7e864e5699b97f58eb6cb054edc911538c7cb15c6fa80c8fea37c21f597cde8779d5da0c059d1ffe2e08e815c465710177f2b395fa0f82fdecd5765ab41b1d21a9eb0749f51a7c2bd50eea16825dd3d4fb59ee12f014cfe6ea220322c588eef92090355ecc56b02a1fa3878634cbdb84aad371521bd62a2e2b038eaeaef353eb5f4501b0c9e79e7f3487fd1ba508fad784055dd90e9d91fcb8dfc23c879fab9c582e1373aa6016d83a533946624dc67539f0388c8360334bc330904de3ed7073a105c3949ed6d346f242fdc600e229f889b809c7da88a7fbb4c0e88187c90b09bd212c3619c9a5141d20f1a16bdbff6358857ca7a6b55397f867b8502af97f29bf276ad489df2349d106786f55a9be04570b4b6828f6fc7d03bf526cf29456f1326b79478305bfab078f43ad71b1fc7a14b9255f4af29327d839ce2e876300096e3e9f84346c4e99b10b33bc633530897acd4ab532164e9a3cf9d8cc4efd564be46bd0b74d1a22760d5268f6af5bac2235412f0d6ce7aca0d1ff19590b476d2a87933c8a056e85bd17b5f3d78cf023e9e08c9a796ae0573e00bf6e0d547691ad249ea12cd85fc190cba9398fd021f2ddf28e221de8ff5002654cf3ea04f4a9009e05164f47326ac3754e8441639ca4dd5dd87c83cd70277bb2255cef936559c81c48e14424132b90e77f40d03eeac0efa5f3afaffc39393468c66a432a85c771660627e44376dbf5f06b49bc7813498443c8fbd75da3d4ccc73d60284709a423c5e8a789b11cffa3b0121566c4fcda4e87501a3b82f75f02eaae5fc055b5b65b625d2c494f2b1237a1e68c6b70c0e2d513d0f1dc009cd0d214042c1ccc2c816eb561cb6e29e5dbef60351db4b4a7c6154d8310263d950d4e2a30c1df4817d2686062e4b0399abcbdbdab32f73168d010827791cae05a4db9b41f17f0512bc7fdb3f763463597022179cf203b82592b1f86357fcae7ab294fd90a63d85515258e95acc80186ec5bbfe6f5bf0177161d92cf6670bd615c011b1b77b0820855420d448a6391ff158460d0b793e87e948bd62d8682ae3b4eef51e3f7a2a8fe41c7bf0f346f2736906d993c2027ad98edb70eaec609c1ebedec22fa149cae1159bc84dd0a0dbd8f44b3cf7478575ab0cfaf7e882ed8d314ab2e7a7dedc0fdc61e39fe4c08c7287ef98e1ddc5b22806990433e5273f47ca9b48324b97f8b0d4f927c36eb8410aac6c0d49de6614ee9f85d126246a8b665149dd295240d91cd5066594dfa951856dc7c213eb92237cbc899a179ce133d3261adb9d8c15afd94223bbbcb1107c7939849fc0ba9b55fcf71b9702990ab7a2233124f389f188edb19261dc57b25aad58faec5508d018eb000892880fcc8f5546357ac6517f4add7d5c9d37e090b59a48e1e89430c3a7317a0a5bbb974efe960203cdaa798d1808e54a0a3fceaee3bb89da21312c5732d54d58d26e353eb0a7968db30b6ff4d386c2b9e8bc1b6f8d9d55e771c96123cb03c355f6e4ee8757df2d886d3f6e11f83fb95b99c3b71caf49518fd10f8e0f4c743abd6c222b152e43fe4fff0d100144abda47313c2d3bc65e1c5b4bc93815ec3e89a82fc9e8ebeb803aef3b1384d549b25cf2b937cc83cd2a7c123022836106d600dfa0b", "", 0, -1841663445, "7a170d5edd5a205d4cc689d5dfe1f6bb014c4dc81548d2af72a8e27603560344"], - ["032a494f01ab7c151fe33ad7d81c789709bfe8fd863cf01299ec1cd014d154b917b93180520200000006516a6a630052ffffffff0118574c0300000000080053ab5263630063f8f5877c020000000000000000fcdf5d000000000026bc5f42248feefb4311e3419b69662fd18223bfdae341b751b4c560443129bd6cf6b22c3f3b23a2e06782adc9f73a7c4770b2557dc848d7d62e57e60364b9647705ff6b1537baf1d2334346cb2b781bac899ec2b4b5e08ae2ef207f70c28bc7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002fa8c402aa46ab269bf22756d10b3ce60cdab6a67bbc184ea5c9a8e55da4122c94b31d19d7f77915b75ab38121fafc1bfe4e797271eff7b61fd0db9abbceed99e6dd304e571403e39308123c43fe422d599106d3280b0cf3c9cbadcbc9ff69372c6a7206048c4bbd2cabab839d362b3c7026b65308036b5de835296bd4438087020196acca6050717a726506e98a48b850f9b507cac564111a9bf2f4fa025d49b40225cfaaf82522edbc99c564a5771890acd438fda508855cc82b8e1a8c13f00bb10a2a5ea60471279eb15e0cefe8af1de6b0a6bf6792efb3aa67e50c12c196324df01ffd5a072264705496a400c633f8353db74db221373fdd14358cd07a6b8e1bae02239891623e089f4d902f3df5e39e0d7f48cc2c2cda0804db4da96fea9cfcb7710323211c11255fba1ff08ef70ea00456722a3de78cf09838c32b74c425211a66c3022e4be9b305e08e59bff8f4e069a83f54a71d9f9f171cfe254c3bff103bf163a8022340b7bd5f23b51acb046edf3c8ec35468c3ffff0b55c139a39c8af13e44a8d502167fe7cee56a94f1f8ee5638a5f77e980848e69ce63eb9101b0ecc0b43ae70dc765059f96dccf8cfc842b5399af375c7002b8aeccf9c1834d00e0057385a3ca60cca51b92ea32fac8a8a960f42cc870b60b63f41f49a66655594922a8655314fd448eb7caf4e17a64f018ea1b8fb4cba9f8228d2767d9443ba88c3d8238f4e4376fbb2c4e0c2d4b49a1029ab72f8cbfaf3d5caf3baa8091c3ee391020fbd30a7e0a6dd44088db0dd90502a7b3afe63ae118d1213bd770fc6ad972f35123da2b6b38c2af3b78720bfd3641141afa68b0e07a96919897fb79b0967ace6c5e386b1c691c1239924133d01f3ddbda81bfe9fccea9c27b6f8b9716faa0752280300f18edc5dda145aeb6e7d3ca0922fba755abb452f297b8e8ccba8c4d57c30ead6c14e83f69cbbfa013b74ed1a861ae48067751670e01739e78ccced2ecaedf6e2ca49a2f158b0ce42c454c45c772a2cf2b16fd0dfa27a9e0a5a011124f87dbdc2dea54968bff316b82d173009fadcacc93114471632eea032e65df89fed1d3d6ab8db177df1dded3c67de8fbaec971a27c7040b38fd2f479ee93175c089e6db30ee203ac6eb847d9cf72a7590258c2ea8d3fd9fd903d57ac805ed539020986a090c073f980849e940030eb392da89c2945c2d2df1730755e79c864d478fa6d25020910843a80a6ba5eb8cb1fb3bfbaedc6ed960d0dc0771f1ffcd278d760ba672fdf0db1bd46683d0c7956e9bad819fdeecb2bb3d86f3d88c0199e80ddd2e78fc1edd23be405b35c2f3f41e0f0dc98c6f4c8fc996737529d8cd103c7db864d6826ad685bbf81a7aedcd653bde576654f241787ae82b1dbb5f01b0e41ce10e78a40dcff2a6eeb8681dc80701b9b6bc7cd45e60dc5b56a952f2fc22b6aff0e7ee0a96734303e6892b5b2804b611a7fd004fec8f30bb98075c833bbf44baa8e59234410e81bdc61c9e092d59a74a810d834df8b84308cd06829fb28d395bec56b4a6ffc5c84681d6623d047251df71bf719f8d22c64e924500995c1eee22eff3db50ec4a21b4edd9e79fb8ad0f182e3eddc1da1cf958e5570bfe01d723d4215e0456e59d00e9e0603f7cef2dc85f142161233d9022195e7a8e9e632f5d5cafdf4c5ee8cbeeac927bcc5bdf7ceccfc418db50bce4f80976a7b9d0d56d701236a3c76f8d1b1f56c9c73cf9c2010ac8a8835cddb212b93db76b035fa134ab04960ef493e6c63a504ceb782234e02115dde458a029c0f6fbe35a6c54f17b2a1b1fa744b56fa7672f80050ccb20c3324bf75b46ea43ae0057cf3a38ea7141477469c3d6842727a08e420e66ddfd61d72c5775b53201428f64263350200740f83b32f45ee18b22249eb02a9ca21d05c6e48ef45d973518cd296d2aa6d1e5e49b23b182397284c869da31582dba7d6ae724ac405bf0b9d61f10dde367d9f20c562d52ec76d210ffec6dc4cf5b01ca6f1b441bff23a488dc5a778c4cdbc83b9ee6b95050307696a8f738092c9ba005baa35347c9f906a7d06e3fd57afd776a785ef2e69e914d5d2672cbf188b74841daf611413e1a8a26e4b3e1a4ea11eb992e25ae444186deb9424178d9652d9a0fbe72dc730735b1ae4422bbbd272eafc1bddef2b75a6d4a555b25d9002a9863ce1a30c6b2ecd92decb6ebd07665a889e8ebddba0b90dde0f6988ebd229e2f56a8529cd8b902984528596523eda40bc9cfd5e19bf9b944f0114566414bd1687150f6964006e1535ec0782b25d85c020000000000000000000000008bb8bdb4ab1b5cfaa19a54f0656942168c38b149d2ed6114938a94751715e0330add409d89cbed4eebe4a66ec10bdfe30f1b33381f521bcb592a6b3a176642a05c68b9f61e72ad30b4686cae2c123da77fbb31a123ca75d10fc4d592267ef581000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c80e01cc6f6003c88509e3eeb69739b3f791cec3df1c6d934c5ffc1c0474b84d50c72dcc122b410789eec2040066bd92de378c4d815fe5bb55772bebf0355aaf6f502733f0c34829c5dac11b72cc737087a85b52e9824e685e4c239288babbec41934b88398da8210907a6a22358e45080aa9745f36bab9f88e3753124ec1810227c4902e86b2d1e0decff4047997af566010ee4dae7f3482e204688c3080590f0327b24ba99dcc8fcffdd92865134a7aa47a8d99a8f851b467e78f90bd35de2a630b0323bbebefee0a6ba0c2f7bbef1818fcdb98832eaf48bc3789c93dd936b7901c218baa6f08870362b960aa034c07c084b347f2b5ae013e9f0e6899d9ebbe54e8032d519b65fe1b30759d7661eb8d7f8d9d082fcd5798125087608308398acc8f830213fe1fb091e6f363e47306823720c22629f7bed16c8c097ef093573027d2602802235157a2b12748bb299bb85ff6b6f0f509c402c07a163c4111e88f31aec1683b021cced7867dcdd63cb66ba2a3bd6ed58197ceba7f22c62c952c017036e81964a20214e05e06e69a585a6089419eaf7d52683e2bae8ba344879d0568a09f3532f5e7021ae0f9e931a220c68d5d7f6a8a4f121dae7954656a09be94a29fbe3ad71c0cda67ae70f9b5510f15f81ed6e18a770deb38f5f549fcc92aa731f42d522ea70f70842edfc686a68c03d84236564e014fa7205dbc343dd0576768704b408b875d26641c8d4b8683761f513a951528f6a583eb173424fffa4860167b370b5b23152c2b63b55e77d33692b6949d75cb5f101351ea25c23ca432bca7ff9788eafe85cfa15b5a3b7d176b3f076492ecc4b78506945b8cfe48ebd3ad092a764fbf6ba0d13375887e5b23fa9e412b7bf9b1a5fe65b8ec89d8caf6f61e2957f6644fd19c5ad75e9785faa1cf32a72ca1ab00d856bccaebee64022a61a9224e94940a2ab31203510db397d763144629e3369a1f3964d4dd1fde8b1ce04ceb6b23044677514258e6a2a30f53a323dbd7ded403cc059b895615f29551396b20abcf127110932aed675797b0234c1150151c6190d07b17f7c69d92fc310ac13382583a6cee845262094a6b292ba4443fdc16a2e5133c451cd650693cefd701199cbede8270d14689ae5ac4d50327943a58c933b5f75e39d0fdefb2f680a1131e7038d9b12130aa7cfb18bec358c097351b1eefc7a03d63e73f26795f33c13c066f2bbfca2c64511a64a489c3d84131d160ea51564f421ae48c3fa13eb16438b431da3523c6be7abd697ef582b2f175678fff221e76a1e0afc3fce3e004b8c0b657ae4eb3aa4fe171b90f1051ee64b29002246a0be39afbf6579b5085d0e792ac1d8414280d02cb960ca1ed8defd272a6c82d8bd3046706f09bdfa2fa0d2d5d78b842560bf4f7095b22b1b32d94bc2d25997c922e50784ae66ab4d287f32e867631a8ce2579c478deb494005e20e2dd6becdd0ed7720438f50fb6244adadf537be00e136561a0f36ce65cb8801910676be06b278bf752ccda3ae19515329e49e90823dedcc1b4be4b5d130f664b40adaaa8ce97b705016358b52aeca221a289c848e19f798cc54de3f981a69d6cb2ea41b22834ee34a6fee5c261e872e69b62fb0c222297cf78fd3c80d76cf5c024f06931bb4bd18910edd79595ed533a897e3ec8677641e7a7a4e63704e2b1bc39f404235c6aef9ee7fb3fa1b756c53be4b49a2ac3c82e4d1d7831aeb3e6b5b670a82a7beaf47dc65cd35a7f3b25166479cbfff60aea1222e589a1d1449ec19d97a272655651e0f58b8423d252f486637ccfab66e4db1ccf1d2ed4a4d5041f78b06890f370ed3d57a8232bc050b485cf8570f78eaa6229385cc13df2c9105227ca5825fedee8238be8151310b67d91db7f02400f501a4bc4a5fa186228037fde65363982d9ace513a41770525da7c5d6c4385e0004b662364bc5312440a2f2fe21125ebfbe6140905512bd8232ec3549fd166772fb390788e94607d93bf3f001116cac64de0008949daa981e67a657e24b73b5c1f0c10777210ab072b78e90bfd878be48fd4045ac219b6ef72ac016ba14db4479bf9d49c970aabea88fbeda70f002801284f6451fee852ce1b2d406c0db388ea448fa7ff67f41173b208237c5aa791a4f1c226671f1b387f598a45ba493cb65f672d86381aa1dc84b71573930817c1bbdfb4f32d08952afb04ab3f3490f068e4f4a5f0c071f319c906ca3dceac7d93908cb08d4c083f01a19fe809328fa4d4a30e4eb09a36052589ea109ce9a897bddd5c5653566a0d383312c8f5711d799a79032e38ba1ac578e03b3a62786f58e24798bfc43d5edf04b877d7603e297690c72a40974fdec71bc0313309d51f9f6109c4dcbc0f04018fd690c8e8e7491551f94b27b14d290bdd73ebd48a45896f64d6663b61ef78df00e", "000053", 0, 778527675, "60328390b953a2aec3361977a080191325a490521a11420bb49bf20f6f7e09b7"], - ["ea9d4b84015e476ac6d168f5bdf6ba3e1bea23bcb4f8433009cf7822ff59ecd44e51aea8f702000000045352636ac5c26a4702de0c9003000000000600656a63ab63619ec9000000000003ac655100000000", "65ac65535265ac6a", 0, -1916090835, "c4e635b1a3308524cd77ebdfb16f0232ea7c863015b9b80f578e5bc8472650cd"], - ["cc1aa1f101ece3501b2731333430c171cf329554ef5ed89d333f4bdeb8a655a22016ef2c160200000001acffffffff042f263e0400000000055100ac005113a9da020000000009ac6563ab526aac53ab2d19990100000000086a006a6500630052c7500804000000000365005100000000", "6363526365ac65", 0, -1093365599, "df8eca24d5e03174e1fab2471f8b371696d9501a624530201114d8ff83748a42"], - ["0cd4d5cc0288acaa581c03168c1dd38fe58708b5edc59490e21e4315079e3a25ea561c796f0000000007536aab6aac6a00501096b8beb09b6fc9c90b79f3dc3917d68d8d7e94e5d64a1f8424e30920d7a23796e563010000000651ac52ab516affffffff02f1b46b020000000009535251536a525151ac560921010000000003535263bb41cf51", "6a53ac53", 0, 1868094718, "06f9fec640896fd4739ddea761c9bdbe1a835ec167694db1edd02e8cf201dc2d"], - ["b03f84f103019281a3c59b8930c49a6459196c1ed600f1f3391704ec8c53d268c307a44b770200000000ffffffff060206570eda726b1fc475109288c9fc227b8cf02a797dfc4cc60eda083624c001000000026352a188563735eb3cf04fa784d6ba93245833f3d9b8fc6428c1cf61f0cc5f2c01659a9a99590300000007ac6552ab655100ffffffff031c398b010000000007510063006352008c24ef040000000006006a5365ac006bcc17010000000004516351abc8882918", "", 1, 1360849158, "768bcf818d9467a4db822835e9496a60f71cd7d2f6f0e29a79ac59014ef7dbe1"], - ["da1043600382c1b9692d16acdc9c7b3239d40ee697f1ba8cc5b4e717cf6370f66656a5d6c2010000000800525151635365acffffffff09d873d1334cee6aa222b6ae9caf30fec163a6b74d2c9d646a59e66bf278b9520100000002ab63ae54c974153ab76c594168520c37bc2949d11cf4c019d8e06b84ea5fbcf7518eafb8f9590100000004006a53acffffffff025fbf820100000000050000515200436f7305000000000165e06c32a903eaff0c030000000000000000000000004ec68ed1fa6ef0fec9fb119250f4c8857560c16035d651de01f549ba16d4684841402578d8ba1786df0027e2ab72b72ddc58b89b14a93355fb5263848c3415f21fe1bd3caa6e3859f51c1a5608b31ef92123fd63b8193147c32f8657a3a54362000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cc9e14d083d536282684a832de854bc372aca43cadde34765ea8fc2e33e93b6e5d2d11a9b502ce42bf804d7fda5cfd754acab64add39e462c346ea3857a4f56028d92a19d0a81365152280784de298c777eb0278a502e3968ebadeeff3bf66c8a41b66d0f56df029170e01b91a5e45e5578ba4824ec9e34f242816648a84850021289439267ff305dcca4e9031dd36a25fe58caec51066776db3895039c53e42f020a43cd8dc633bc201e6590a1a9b94f1180139ad437255f83fe86407dfde01f670a2427db711f22f07534f7257367813e108d0492363db315488a11202d1a54dc512e241176912ba21b9724b5e9946eca5c023b28733b3b9a9569d03579a5fa26430223c0a54d467ddbb8414401eaf64217bc60982a9ebfabf3e1552c4f1fc27dec430306b77a734498bddd1231cc05aaf78a60eec18810c8c74a07dde0962b0dc27c4d0328d9b7735364bc6ecd4b97369eb4019cac35c26d0f5863fb11b6ebbf56726256020a1741011748a09ab4483c68d70a0b7bf4fa59c39549fc6972169f8a87ae19b0032fd716d8ad5594dfe20149689f3dc8b21d03358bff4b95df9727eda64ada2744606000445d814fff91abf53c58485133cdb3c2f8ba085799bfde35341e1e3510b6ea6ac93c39eed1e8bd414b4d50723b0ddf648fee66b8b057479f7c669243f40071c4c6db6d3534ce7c925a23c73d0129cf97f23d2336959fe4c7e48f87c97ebf1545c5f957a7a83717a37b923a0c80daa413e2dd61046b099d4fdf653424a61c8bd7685c2fa3d2138a4195c9140c41ce8df81c0ec85b49506be49b628fddc26133f4b8ee29ec8e604332fba41a1dc723a1daa39dc28ff9d3a5963317709d8e5eb1907f77ef17528ac3b82925dc28f9bcf14777c87d168d336955a2d20337196e4656a4c6874eb570768d598869c6d15599a17518ffc876e63fb6e56ec5d8519715cef67c81bb6a1b67a4bc20f12a247dc12e6848f4848a7d82e4832813cd4b69bb5ade38b9e8bb0682beecd01a50a8aa44a2c3d5bffc1e6e69326f614f32b28e641076acdc34beb6a96943b5774ae3da2b6787ab9f197246991f4f1f631d62fd6c30f501689877e12e9084019631e1e27bb8847ab9aa3c5b159a72e98f050fbb869a9965986a8dd081244db7cef9f34282b30112e0a6a95ef136f2d310a2d3151cee71817521506793e9408139056a94f3c9657ac593fb55b026f458f5751677ce60527d4f47c19b7be45af84edb2f779b3b193935994720a041c3fc32e80dc5ec453206a97304ade085454f3dcd4218cdc8d8e4617793038c4e6ced4b50e2c6336b6a33c985f2717e44e39075f3b08a8f9f0a9627f81ae5731f82094a41becd2dbb1f29d03eb96e7f3935f137a2c83cf613761c89fb5b87cbeaa76c97e76228aaf09764a24bb0c995eb70c985af2a037bb0ec90f58114048c9b5d86d3438f2067c7cabb368f980ec29f2b931b53e974a375edfd83a1460ca270c373b94308676e761f441a82b5cfa13ff40ed3bc37d9807b0737863caed34aa535087afc5c63d0ec1d1151506485c51c33058c94de1e20cfeb8decbac6f6ebb17d41752b99c48e1be1bc8aa69c6aab3842b9c7896f540c7c26b03ff8a9d5fdcd59f963d4af19cf9d3405b9a49c8f1185ad2d3c6fe78fba679460aaada3f56ddc742a0701e08a7d3c6161c76d85e5f7374be28c53dccd47ca5a9f66541c8cc18e52654e5313e1f044e5a1d038d0ae9a21612ff9477f2f220c5f0f1b11be04f57111069cfccc489cc8b9e33ec8b182e531a625f68a1f670600bc8a7bf533582e420a56584d7bd4b6a950aa2fc2ec121f3a880429aae696dc0b153399d835b88e6550a6263ce6d8742047faec98b64dc7b7d6f1be0b762d0be8655e410742386b83ea8e4db1a958c4b763fcc382593ac9abe213f28e57976a855ef9822d963d042e03078f6c5eaf85208ccf6fa5705023759f6f394b5849008e4d0bd98368a738868a7a64e12132ce483d99e95caae6ca25e758d773d4dd8721c772dea9a5a37134f80b29d0100fcb44548f3a8ca5c3302f57775fe5cd7448a4c9b84dc531ba76e4942ea8a4c917b808c753686de1e3975cc874c6db4df5dd8d2c2631f9d8ee50987221702f5f835a7720852cf8085bc78ee970cd2660b61cebb660cf23e89bff547392c4c439d92c63db8272589b0cd35a261dd42e806105eeff27b991268f9466161128af5cef6f0e2c578e5bc3eb817bed5724152334dddd46c7276ffb0e11fbee88839c8b0e55bee1edc2819f1bb1cd82963fdff6c7aa38005f00000000000000000000000000a4c7ceb4995c9f8735a4e51511f68df15e3106a8f3106904334af7bb0ce649283373021425c85e64a54bd667c7bf79f14a607dee1987aee8972dd3dca4bae88f455fe698f2bb3a744c54af3d436a05231e29af5086b068f95d33f9567b5b6495000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007e96d30c16e7d1f8793209cce5a3eb6dd6e7f5123d28a4ea48bef0469c2f72c6b2f4f637211b1924ce7cd3ecd85ea47f984f4abb54e1321441a9737b5f0ed5a483e8c714d0e255eb30ceb321d06b20dd254d48c21f9e654e097278d766be081eb3550b60d6b4aaf71c38ffc29cfe07d6fe49567dd1d14074db099d720870be240305219be6b66a8b7203ef7c4e002285b30e56f920f62160ef2b587b7cc8983d480209b476433e745fd0cbddc409f95d2494966129e3b55f766b07271b964f1e40570b2112b6e672b8a84b95e0d045d121b80b96484bf1f01c239099bfbd605f9d1d890cc6a508720d14fbec3b8b7184271f6b93b7f43f9d677506ac783bd667e1968a0317ac1a03596ccc206f0fff6880c357fb4a223973f9c414b699df5e4ceb6417b702178f6d0ba27c9da6328a3f402709795b98e5815de4bf4364c5a9f4bbd473b7f80324ee1c44f879e54f157f660d6a3e77651c36b2ce1b844a58494a3be2504e7da60310b09816cbf5324e475d0636e1c7d559c37f3a0fb5f5cdf8addea5041132be0b032f07e02978472c64436bf9cd48b94afde0fe900dfd2ccac40698c7ece106b248bd792f63aa2bac08f2634f4931cae554c7f92c0e029c0c2e3b1ac6069eda2570939c15a583b484d547170cc52c91c432949ee95a381142a304a74ff2a56fe8aae7b0b0fa247f6f97585575b27695bc7d5bd0b2a979692967d4ba25a7aaf96b44de4413312723791dfef255ce8ea1da652d02147c22d169b48c44fd88d69a5246eabf2150a88cea28989a2871600e74555ac79403d34db29498108c85e33496a740d41b35928367dd140a76ac7eaf1cd86dc24317c4f0d7f44632c5b1062fc3b42ba7e7d1e74d57f871b17bef4e53ef673c1fed2f3ca2f04c345ae0193bc2ce485ec788fb067e8d9ac4f66faa1f28aa5b7d2cbf54ae9a390dfd1de571251f84aaf283cd9806f431a39c16f637b6329aa79422a7c56aa07e151746966caa517681485c24562e166b41f1c1d9e494fdc5cfa92211f8c170fb9845295a9806b54fa6ef7b4b4a237059e44ad03d1c23023b45872d9ad86fa3b0bd1f053597e15e922c5d5518eddd5f4e114d63f85c9869de49117ca840245adc9f07882e6a1e0eda56fbe5c9fc42e4d2d8f02bcb1f8920fdfb1f984a11d89c449cb9ab75ebf0184e696855a8634e28e7196ecf692e836549208324f923258359d2dd15bec75ad576251b97e2c9a83b4570d1725f91c85dbebde7cda3a016b3cce5474d900eb297ce224eb152f47b011f79eeafd44e3f60c97f0c92fa1ac5b4b1347dc00629c73f601bfbf9b3ddaec675318ea0951b881928d56c82ac7b1c04371761b2665fa50557691a0857a68e7cb410f6ce3a39813c7e726b55e92e13f914ea960071029c98dd3bc289d51294be0a31ba747bd89c603d9be40ba392e757a3a6584146f608068b673b24a5a21d4495c10e6e6fa702d2db952acee5adef84d8c8437b995e75b13b8177ba59552cac113ae15594d599f3b06da31eba2c04dfb2eb3e0017a6790ffe6055b00ea5699245b69866ed99576c0b49cd4b8d73ca6ad9c5089afd64a7c31b8f10652a8e8d52c493af6cc9b0747a859cd187535eea5f958e4efb1c6327973e15fa7b133a3fb0bdcd9f65252f3d466dd75834b0bc99e748130e6718024ee3a0ade77e7ecf3591e9de42570db5bb1616132e9b51ddca06ad42761155bdc988810922ffd27c1abc8b4aa651d022762e5439153226ad4e1de693c207ae3496b76b9de38b762c92c29f1526693ff0449b217bb5b89d5487712a4c064f1a283e9a930520520783150ff0f8fc61be10e6ba183cdc9021f92f94ba64e3a4bb27e10f771eb109fb45af24a68b308af8fad9f6251a7941bcef81676ec0834bdbfbe2feb813d2d6ff69d4037551ec7d625c9a57e866cb98ba7c887a5f2670699fcf9b30969c0047d03046e17bc065bd61cf15d4c156c40622071641696798e77d5b1cd13ddbe4e7300615c6b434db9a187d34cb0f0d7c66f5f38261493235772f0219e8705f0fd3abd53a07dd5c10810580521f12f0e92d4ba19ca70d92dfb8d1280f111fbf2b87c7fd1a385f644d96d728aed5051ecd7b9a2876dab5df7f58384b34dc97300db2452b07f7cc7011afee8f31f7702f9f3651fa53fb7a87c4223174a14d161a021516d9e6b59efa1d125643890625ffdea45c311893a30c18aa893868e65dd2acc698245894e0ea7d494822d34a508ddacd7464c4077bd292e9e01ece3ba58068175678b482fea2a6e6f8f60254ebcac2fcd10195020000000000000000000000002624cd299eea61c3d34e037615146f006c6c5611e674bc7188e84ed925e18f5f3effa8c49846d531108c3bb162d98e83c2e698f814273e3e963a1891a65b3e646de12de72c2453c2f76accb2d6e068c8c512b6fac015f0a6dc7eff4dc82d084200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000127571f610c4803b43cf2a0855cad3ef03ef7e2b14b6a72a05ce49b96498012d00ebb6032130897e6c0fb97ae45ab1eb77cd7d9ca7ca5496cf852f193fb2fb8b5ff322324efc388f7957b81342aa3743d2d6d88834165ff521176141578c7e9cd9a0a7f182645311fe611ef32bc52075176cfc994e5369fbb02ff5d3a0d67bbf022de28d0f9029188e0769aa407371c950599b934f2d1f2926930b9c89540a7473031d4bc39225b8e7abccf80922c59f0a9df7f089a309e928bef0f9f6bb56e12b1f0a18eb5c2dd8fc2d2ceb8ecdb96c69cec535d85327c7d4ec32cbfe14345558fa001385f7b79a4aa4f1888f090417e28ca6e9d8963171477cd1b0fe45870d2ef7d6020586d484a60f0bd0483284adcfe1356434edccaae871ef881933f154cc80fe7602192dd05fa0c97ea410109f9abce0159b73a48e0d07622f69c4f8e74c844d5bb4020a45a5be898d6fbb741221af6dca840568a161e6320f74b88053ddec2d08e9b4030b3c6f9b5a82127ba086aaa5c44c6b3e542626e1fcf11898c9a98302e704319a02243a47207516c30d92955373cee28cf19e17b6ffbd88b9c155d8b793ec7eb02a651726ba0d66c225c42676884df0dc7ada7ae28710d5fb9caccbcc4ba6799c7cd451726899bf1c50d6beb290a897a941139f8de65113af10cfede8dfd90858ae077e740e074b055a8c78c0f154ab5216a0c53a60253bf0193f8a960804edbf1ee03bb3eb57753b03bca1b90adff3986e6424b552b270317cfe5910d451e3f1964dca1e1a592cf2bf4ce8c85279d30afc111fd58a0875831e6a06c807881edb322b7c060e15f44e61e22c689088c3d6faa2f30475e85fa8d84923bfd7c6333140b03a8892e979247769fe7610b865a7c0460d9eb1ca9c39cfbd713c12f09922d84ac8c018c0b413005e6cb22a4703dd6ebe0e2a9c125cb11b3d92fd689a13f571f7d52c286007ab4584ea5cacdaa058e7fa5567337b4fdbc88baec3194b75180285f9056cea9d6396c07f5b9af171b11d642317f47be9a770bab1ef39d2fda5c90bba6f33539c914334fbf0370d517cf7370e7290a267cce3253f99d0d551994090d1344f548ed05cb260ad5087e517e831448f3ef7c387e11b49173e460b3668ed843bd448c1e6b5e62b63c7fd6f33f7ef97d53eb270f92a01650a54f057e9ca55549be60097f2342d1f6411fd50150cecb61512cd872db0f262c0e21d1b4a3154f194f0f753e2f4de2ebab52c8de4fa24eae7d25d2159c8cd8acba1d34376270f148ea7684a725661ccef7feef7f81c3eeb8273e91cbc32df99090da49f91469c6d44e536bd198e8ba6a116d3c489ddd52479a95ef601b5041cdb19f3ca36dc5533be524db77cce4d1b9255e8d61a95c628a4cf4f02834e68e798766aaea1c77d15b6d67c1c6aff565dcc14b78fbd9a82408bdefbcf324b8312cdf29d761106ddce55bae250d8d31ba2be1f130b6cfbf85c59e6926df5a396cc347fe499288e0655e8429ae6eced23a4d84e94057f3e7fc86ff0ae73f257e10987596b3dc85aa2d02e8caa50794161177488ecefbefc3c9d9ee4a02e68093023c95cd5b6f6e37d5e1c56dcb53802ffbba91ad9e5ff3bde931c83b748cd2f9197ebd6e2b16d695c3eae122c3d1390880945cff673864e6c03c1229670c01fb2e9fd02c4adfe2b305f665ce5ff97f0e4e745964472d69fb9456188003bda15f8a5e845846c0c9ff59be982dc36c5f5d65bf0937933c6bd2acd83c3bb07ce22b9e057a7363e605ec6ec607d317023f35c9bdd62721a5623eb9f07378f1f11c0df7986419a36a76cf5c55a9aa980f26750021446f40719f802df2ead721652a9fa73450ef45f4794f99bb783efe246057b5526445bb41c8b0c5bfd50f2bd7b16dc1916d63a6111d82135dd63ceef902d3d828799f9d6e00fc1dbe8efe52b915900ad39f089539f217799d3654351e310fb847b0dff0496ec025d9a9fabd08ed88d16b8fe5dfeebff1c97f4145e25c1fdd90292df6e80b9e27df646e7535c783d6538f93da6e38f3baac5cb9a1547361bc1c6dafa0644d9c020f8591a5c5bb846584a1b57d1f09f226974bdee3ec0d8e69194cf31a5764cddea51ec5cd07c74e678b56d9a83b577f1fe4f98bffc9d3e616d3062ad98eeb6777a829f521e5e1a5313ca5c969d7b19648db4d2b95bfc1ec352bcfbaafa6c4a6dfcd04344c5bed83c1283c2a63737cedd7a000129b0ab0f840f2a98d545410c1561687a27040dc28ed8196d1fe46b6eb2965a35f35b8ecfd9d8901262a6fe0cbee646956fb0e431875e954cb5f4e030ebb0af98653150e050eb815e15a7008e976826ba839f2aa68368dcf76619431bde2e582515ab6fdb546b0593b10963570c3b019fafc873f5bda3bef238e11649d0bc5321c732e02ed2a9d88cc89dba24523207", "6a6a63006a", 1, -1240689834, "44f062e40d540884d4e663cbc4ae54a85e810ffea42ff921493c3805ac0545ce"], - ["69dcb5ef0453ab0a5c9b34222bc3e08a62ea9c6ccab5f8876d617029d210c30a70fc28775302000000050065acacac63ba6d8c534d7a8b0f0b5923282e7057520db56a95768e43cc037064037686e09c0926db00000000085165005300650051f5cf5fdd0b34d25e65fae2cf793e3efa74e300f85f7677d67f1ac9aa845098312704230200000000016a140a083bb5f2c2b862e9dd13f83066071054f756f42eaffa63931d176d7cfc23d798fd2201000000085253abab5152ac6394b1edde015a4667030000000000e607082d", "51650063516a5100", 0, 169180113, "f9c16e31842d706da21de0df806ee6d4fb18206a3c5d33526b417add435e2fbd"], - ["55be2d630131b94b7142abfd8c2f7269178be517f0941bb0a05d141561d646ec38c57e622501000000056a63005265ffffffff021291840400000000075365ac0065525377be4f04000000000900ab520053535152ab967f4cf20300000000000000005dae6f01000000009ec063775bd36fe71da37002d123b2651a3a40396d1b3eabe214c7f2086779d7fc1456649bcff29cae3a2ea015a41c99a900023083a2fa21b6a921c03764582fce2a18acaa9465fcc5cc8bb032b87609dee086e5ab9b237b0f41cdd34c670a7100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ad2fe553ad6889cf033e84b177648f7b6ad71f94dd83a658b6745992ccf9669a5f416f5129c8f0b88683753e201923f28a8155249892f0fc20e1ee1183dad5fe84f261e70717828cb0f5ddfa1489c0cd653d2f1739bdc255acb9225fd4ef30a8f91343f5f3b4c2b5bc9e4cf2651e2e4c45acdcd5a93ddaf4abd73219dfafa5c80218aebda6097fbc311133f4e0b6f3a8cace9d95fdcd7492bde181861a5cb0d6de0326704f24d47f9b5eaf2f42e5af4d07657c5e781c193916b78bf470bd783e62fc0b2f4d4bf71b15b7bd421f110e972d35554b417afe7ba43cd86210d1399b19559511110fe6b946311e9061cb9394a74dc37d43cc705463115d3ff183ab4649a4b3032fc0c6290c6860f19641c71479f11ce9c7f095e7a73600a397d00bf4f9ee85ec020ac185e3e386de9da606381246cf2874ceb6e7386ce5874089bb4fb4ab535565021bd2f461e4c37d3953102edfd3ca7277a388d82465af35d91bef8b24c0d8d19d030dd15d284979be9da1994afe399a4112013f20eeaa1b03cd26cf740a8a9278a4030e1e53bf171ce465e05985f59052d6c3a1e3898579da611c1eb92a241ec816478d711ded2b6c2308765e07619fd33490854dff5a2e7f69b5ba8ce847dbd5089731de149f8a3488761b794135392f776d080c2303e37c96534d27c2625383c63bbc3d6113787ce0de12b1e630d605664aee6cb216f2588b75daa1cdeaa23998a71bde339f4693aaa500a9fe86d8a61c2e2c31b8ad5b1617b8a49bf12406c3e96478e783d4ff6e1f3d8a411f26f7d0ffad597d89e3d79475ed123c1bb6b00676e7e3bd592ab1c72ba8e42dc5169e2909d41bb34ba976417c6f73aef87cc620bf59ff995b93ab60bb1e31103e8fddf91893809eae20b245b7899c5c763ea8205263d45f558df836439293c0d9b1c81e075ae807908f566c761f9310af6e0266b98c55a5ae8925e1ef103c0260359656a3270846a86e19bc257d1c8f3f0f3f3a714ddbcf01b6a99d07bb27975759a9e41704e393f04c5080291ae5793aa3b687032b73f2f3c3b20fcc0e9d301171d1074536f3a8da3921521be5a1efd1d1204cc47e60a14d44ba977b8b4782ec587d1e2e911eed09ca196b9ec4e2f9a6606d59e3507e31464425d638bf335b4133af2ee5ad4c7ab45aca6a0c17d6a8520a40b633e52e527dd891b9fd7ed8e286a213c5885e1909ad56ad2945c9d22f777f6332cdd25186e18f1b24f93b006d221a5179bdfa9c3ba23df3b519bb6baa56ca08f68bcde2c6b993e87857f88f8372b086918b6899e92c3de31ce204f1266261653a738b43ba27eddb2d6161afbd75f75c1d7fdd3367ea5e4ee5500424751e94fcb25af08f33280d9772eb4e72b6ae9693faf044808ad11928bf47545c6f7faa93c052f926e1d9f386c04f12819ace596e70b41c390afa5e70f27874725c9dfb887ae49faf7cab5d29e12a9935bea1b891594c36e74d52503fb219868754ec04bfb386e01257579f043abd6bc309daafc8cd95004707de1b041b4e4a5ae9b64d6b4d09bf8f75abfae0f261aaffd6994599721c74a0594710e6c3feb1b2f70c683610fabf74a77a10107e1957808d71c8407429026bc5fe4781fba99388f5032213b22c7e3ff5abdaa9333a776cd5705c3f62f5acce4c5e12782fd8e617e51eb1d2c9c9082c5d0153e471a2779bf41fe0dc066d2fd925c2ca3581c5ed5214254eeec60cd0299f59ffbe5aeac77fd0d86df46b0c7ad2ca7f04fd3453252d102774b4eb0b75da17c7b315a7953b34b759f365f8156bc38d9b66c4ff22ce4621b776bb00636a79da8feeedb57520d06396750e03de6fc00c3cd7871fe00d161e7f0a1b197bacc8bb06a8141b35a392b1540f238e95dde4e3ef10d2f6db907c8d52b533c9e1b2c2c52714edd7254209f273972dfeaeda537d2f0535f7aa72c4eb1bb07e024469b2df6fc8fc4bc8d163f46741c74df8964f763d8c55ba536455452ded8c067e37aa3ebe0230c61412fab99cfd2c9b0a3d8c28a6a7a53d2d27322263833c60dd94e61fd13d3bbd5e98bf7287e2ecce6d71a729dad3d38d27f1f1890f2f9b1b51a52b4a6b769c4386d23923a21c389f4a1a5c98d2da008f06f20855fc5e713dcf2028582b3f39252c06bbe4157013f6f87b3c77387e66c85dd47708e98feb929700d1c32003cd91864d796173b91abb46acb51fba30a2253c5b917bdbf98319723b766e8c72c3c056d930b7113563d4c6a16056f3cfd947c2433af51bbcd90c732f54defc0698c47fe6363499ae4a7329850e9b00000000000000007765610300000000ce03067158e407b1f83ee826a83cdcc0edf1603ede3e638768d07bb0cf4cd2cfacda96aa0b769b01b6a34a95b014637bb580291e9826a10522acd20b55639357f525c9428a80d4aaf3c9de389a45859f8f241a5e782d0f3621dd127908429c8d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de04c4d679375b8e553e4491e14ade38dfc0974d57c30d3ca5e7ab29313766af9e751868be3a83a5a1b5b3b75c251540cd0bcffcd6d210bec420c9b8b620b81de4ae384666c4b8ef5213cf7475ae261e83369a5da5eb25a3462ed9d133dd49fcc7ea951b12c704ad71b77d2467dcf82a48d6688224d5b9f80d7951e9abb7965a03033afd2435b41468cc8843253ffb8ad63e791bda27806a5d3358f3585efd53a5030d7604a82ed43c24c5f855516dcd5a2113ccb36b9978bccd71f7741cc7b129e90a1a07fdaf5ea097ec138a0e4e5f069e8296a1f7bc76fe06355dcf076e68a6064e182244238523357ee5c33d6da9fead28ba9a22b77f2f0fe13674ed5f9ca588c2020df18db8a757a846d887f130063278c25cf51b75d6c56537ad712bdbe59405be021ac7d72a14b4fd9c9926fadeeae914843109de702fef3c1257739e06963f1ae103102949c24583c159b6dedc05f2fab70e2e990dc5fc7178f58b9c4b105abb92f5031e009393929b6e84d191e712e65d360a30fe6db524991c707e19a4df244f70ef031aa4e545b70ec4d84220c31f6d3c7c8d20904cab9e3a6b2549cd63ed57da49dde8925cf96214123de40d177d815b22824816bfd730432f3a85ff7034a08ed9036020e0c066a6db13cb2883d798d5ff521aeb4b40286f85aa35ca402f4ce221136d90f7c9ddbcafc3d54c52ceb0c86eb6ed28eb9a9bbe9616992c0e6421afb004387933ca34a81904e4cdada099cb602a7e6c2f3fc53a77207ab0e21fc9a4eed6681c332ba775c17e84e30c563ba768c12c12a1abdf94b52af2b0eb2e63e645acf3cdbe3a54234e201025fb1cc9da68d0ce3a9cbbdb9554de3ab914ac0ceff4d0824686a4daccd97100428dc947281d35c53e341c918a6987795cbbf5b713a0bca511d89babd1b3eee16796493d30b330766bbaa167c7dc261cb22f9221eb3ffd50caeb61ec33599995f3cf4ddb2a8f06fe1671d36931841b3f942d0d57c5b2e0c714c7f0d8ba9653e9c6a1dce722894fb48f4bd2188792f67844498d442a417c7910c8b382b9553bcfcdf89f777948073dc2765aa8742018950685ca283d9d2e380b0254602cf56fec50513570e1d5d93b095b3f89243005e8c651e3d2525d36fdc15b92bd5961cfd574f89eeb6b0b50c7e3a96220286a628992280c8bb031304ca00067cebac035d216aa5cf9e143e412225c21c707572fe1874d5af8f8412f3a17a203e6484a878eb0f2a7e8b47d3ccdb08ab1a3b551128ba92589dfe6b71026f240d23faa18e28a1f456d5a4850d8b22921ea787812dca1e6ac07ca7d943726b0b0155e93ed514969a0e8067bac78f04a72025c89c77a2fe2832f642e12b7568959ea31258032dba31ef5e18ebd6009d6cf351bf33c0f4e28855e0a4fdbe9f3f0837bc2714814e6ebe7a901659134f060fdb88c1042420e7454012f97ee2b217858d35f377e151845fd41089effebd8d2f5f6533b446d807e64e355710613d5ab4b3e746705ff1729f6738de0cafbafff3618428a42c1d11117d072733be0347ad08b1c38988b32e5a4db3cf3ab87019527b735f1985b96cc2dfe175e8e48bfdd2a95bd1e157659282cae156cc4459fc29c054d23463f4a405e01e223b96d58448b222ee913777481b8bfee8352c676043f4588311e607a0fdb2c415e76f525fdd486c9fbcdcbf3b77d25ac10f9fb37e981bddcf9e92031d69dc8f5a0426a340f316945009e84b9546908cb3762a2ce504ccaa98611fd5fdf2c2567be137ee3a159762b479528abc97d7f46c444bb102111a2aba8f3ec567e6851c0b5883429ff40ead6ed1107452e90fb0024861a32b3616cb72c6bccc1384afc44f3a3ce1a6e1db30dac1a75ad409528161cf0974ffbf187895529c58f126dd647bcf956ebff9f572392f0bf27c76b53e2f2169d103dfa8422c7b34fb0d5e7e15362bcac42155a4931b9e6a8c55a85f8675835e9f2b98e30b6830959307c6bda6dd1da973032e9df57f4eb9f2b26e5a94c8d0958189cb923c6c584918520d72de2cde2713e014f94c7b027ec67d224f7b6494276989fe42d66c8f9e444806179564eb667912447919881cae586da93b9501e8bc380f869fbbacc98d8f9cbed198596abe825c53482ff699947d62a70f0a2db346b7791b174731c1adad1d3e90c654d5385a93e44dabe71a00298d11d5cce7723d1710bc78e802b340a20cde7dcf05d8bfafe2bf169c0727960b2dd838c1bbc5ae6be6f33c386e352ea91c3f80b4896964a67ba77d4c4ca1a9d2e0814d3111c2e4594830000000000000000bd2e840000000000f04b5c14d36978eb062ff1cd0365748491e23e8a1865b94c6b64331be18ea6bdb56116b1dd6e5e4afb140037bd2a2b017de07a51efcef46ed30ae065fc8b37d468db5283cb6de49e60e2d4c62388f741bc8230fb08bbd50d061acd01937179a400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f2ad07216f4f93180a15afc1b6fa4a71401e1645f1600327c7fb8d4348c86954f449c0097e804141d3e1b31ba80f8f30f3400738fcb79f9324df4752ce34c36a38b09a0eb659a1aed13100936a2c669a68a3f35f3a87516e908807210b64e7d827c11425d997ee006b21cea3e09d68b6728aa1254b81e5c074aa3c3d3cb23c60032232c6348a384293bd2244cbbb1441f3bbf7c37c22ee7e1825e44850b2c405c2030992050825bac74891eb3176dd7407574a802ed8434cc9b909c3e0a5e22152c40a295c71b17f11483779c20bdee39729a1c2ffdd6198e0df23bd8228eefc6289e12f2448988efa31a33ab5a1e15aadfaa72ce41a51b6a97f7caa8883e6f246a5f6020cf9dbdc0bd1d6698a71b19dcc8df7988d8fef1227ee426f1f8af6e5c9bed9f9030ab773e9b95c32dee2bd5f8d744884ac4dc79c3b6940a1c327367ae40f466a6f03219b0ed7d1ea6fd8e0eadbe5e89ace092e328881366371b4e8192cda19df5bd5021ca14cae37f1a81ac57b5962fb31d302a551390dc3992ded2409fa8792a7ed53020948c2ac942e03573006b9ba346c98b17eeae1d42eebda0a59fee324ea685c0092e50cd4ca65211fce3c5869d640275e7bd8ea114ca6d23f361535fdcd05001150c6a7022929fec4232d4fbeb2286c78fcea7e376613137316037e6b6b1aa1c8a60905f670f9a8a204bb8d0117fa2efdd3b64e99995a99ad5255daaf5a6e25aeac2392e4f360bde1570419a0c6d79de7777d0c7442c1a2bebaeb335fafa8dc552228cde1e2e283d627e1a4c0e04e4b57c73cea2268dd5d44560a24bbf052ef7f1633a3714005e1e3a14d6256551fc1d758aa8d07531bbc4043aa2033bc01b5b67e9822dcad6a6eefb61447886456c1c02d1af4720668fb7286e76f079c90382534d3fc287fc10daedec21a32c236bc8e54e27c9c5ad9a667d9fc6f2389ff1b1ae5a28359469dba22e0c9661a12bb72dac1eb06e99208209c839ed7688f13fa1f9199a8b9279c294572da27c6eb71ec8429539b7de4dda4f42e7e7c43ef1997b5c1cab2b59aa73a746c703777438ab8c73b1e63c9990b2c763ac7627c07cd9798e33a906f16639922a0c35cfd763eacdc562cca7eb9d71610a0c77083ac8d5ec4d73d204452dfdc1636abe4bd3a359495a2f467f92601304da949e1728661880b2656cbabd29f7d0a79f9c7586c01fa7f7001a37603c95240ba19c07f8a1ce9af2bcd94448483033602a327adf97bc56872df5aa48c30fe05389b6b37714c8c83dfb2c440d13c8a982ee6aa5cfd13a141bc6c049d3ccdaa24fdb824e27e596700d2b2e350b02d56e97e75c4385fcc487103c4ab8aa913e83853ff9374d4c8e731eba568d51046d68704f3dbe882e2827a243379f6a9392bb04544ab75a8f66fa8f37638b1a9a2327c1c993590dda680d03f2c0aa77677b9f9b1cfcfae8ddb619ed308cf2a430d8797cbd683d1f42ec973457ccc3f1e9704ca3433a16f65900b1297fb9838c52de2c85c11bdd65341ea72c9ec3c65b0be1ad9c6f132b6d0fdfa3aadfca929c5830428ae008ea510887b3fe9a8f03ac5f21a3a3846e084b9022583919483d0a30a85250a290dcfb889f21e8d8d82d4e787d305e91029c87b51403a15a38e68785ef282a392a4d1bef09a6b5563620501b54f7454a77ca91bc66fc161846fc6edeb097ee6c855a5164774726b1cfe255625f08e1623e1ca91e25c12f25b2f9da08dd9d5629ac88ae98b57d663321ae81d3ee0d2ea809c422cf0cd0b5dc7594f67287b30af9bbbdf62d7c38970833dd9c761bb9d94e9261d39213263412890fa8d6bbbb0a63e532db6c301b3f38d5df57c2da1a657e0f5f8bb221360008a8a5d1b3f1dd4bd15a32d2a7eaaea7a18f7d0afb90683cb7ae84a1d5fc3c05f3ee6935b66da7efb8aa7e1c4088f7ca57d4612d0ad687a8ac524889cf515573f472c1ced70e55bc0c010510678abc95347487b1598bf1d1c07df1f50665d03c061a408e4c7ba38758be3a8c50b9658cfe7d4801e5688ee8b1f44e9386c9683f2f40cc1b2282a24c437a6ae6026dd13f724a3a68d42ffb8a2127ba74b1fab7cea59cffe9747dd0f944be4b285a57b724123a869a786cfdf6c17d32af099a764ed954526e8e5919cd5e379eb487b6b82674f64d8943e442ba1a18e9b89c44241a749dc767cc9f44b6c8e57a6caf6dbfcf255f0c0b130aa50d842bab44b64b5aa56559945b7f28d5c21dd4a4609970a321fc844c6ee723908c0fe3c5c7fe0f5f4ec30bf25d428d338991c8b38fb8ebea1b5cd8958dc51b7d1ee93afd2421f0d263103ad15094ca7d25706fa9442f2b8974765c42e4409458917f7024f4a6de8bfd3ff5751bb0c752673b6243ae3c13e1dc3c4f0858fe2e602c4447561a4a507b33a3df3a7fd21782c0b9219a525cabadddd0b", "ac6a", 0, -1298197879, "bdb945749e4d2091bfc08450ac38449e41e4d4275b6db0b41d12561cf9c49d8c"], - ["5aede9bf037ab9981f60acecc315bdb983dfcbbda67197db02c9ad64f43f629f6ae70c3f610300000002006395e1786fa2fe148f648042aba0c4205c22fd002af02ed5a4fe9559e2fb1c04b60c651fad00000000085352ab5151ab63520f80b5a289f5e62a89909c839a38958aaa5e8b0a0b216291d2fbfd02a391812a476c337901000000045263ac00ffffffff04b5efe501000000000752acac515253ab2e6ef8010000000008005151ac51636aab3f05a601000000000098263a03000000000952ac6300ac6363acab9bbe7300", "65", 2, -1506628071, "667dedc6b69f810fd7b6a4504aa083881480b25d4f7b247ec8b79d8338212c13"], - ["6d398dbb01eaeffa619e9f336f9f36c22777b17bd91cdecec28707141cf3b3ee56b19ce7de0300000006ac6565006353ffffffff01ede4ec00000000000000000000", "", 0, 1136078499, "ceb8da137e33912b22e543fd2a7d612f04fbbe148fd81762fc59ed7dc0a1a365"], - ["8ba8c3a904aeaee25db958c1e8cf0c2958c40d5930dc8ff626609d17fafd3a61ffd70fbbf203000000066552535165ab706d4653622c952bc1b954f5b3efd01bdc37e2e716f05e369af6c37678b2f3bfea1a916601000000055265535351cf0a94d5ce4ba512295d7339321975def47a6e77560301f18eb5ac787e5b69b3d635487902000000036a52abffffffff64e08af76c458284f6bf2d10a7bdcd7e6ced63c49409bf3e91b14e75413b62f70200000008536a5200ac00ab53ffffffff036d934f0100000000065300ac53abac0723c4040000000008ab53ab52ac65006507a5f7040000000000c6a46a24", "5151", 2, 735845796, "9584bc3d5bd175705cf4827b0ef53d09ffdd971a73d205b0aafe85783bdbe142"], - ["aab932b70250da6211953210115aae2c1067bd41897228399d83674f8cc84f6759498a40f6020000000002b052424e00da443d7ea5629e62f7de50a022991d6de059d8be6caee061006a6ab9261c020000000152ffffffff01a1a53101000000000863656a5152516500529e36d8", "6a51", 0, -1774314734, "0fe8c376968a59589ebdf18e5ef12055bca7cf00f4875a31b1ccf9755233b068"], - ["efdaa37b015a168d5d1f0ae8d3d2c2eed29b95f8ee9b2d2e16f902beed074a474df26de6620100000001ab2b95ad4b01458bd605000000000863ab526300636a008b8db0c703ce8cb602000000000000000000000000d85d40e47c2fee569cf64287417fdfe8315aee5b6975f4680703a3e660ab3d45cf441587f019f73d132f804f8c3df63f6c37a020161684a47707e01d6c3ed30a41862acc421e01c5b81846878f02bbd78e5d14a249e24e0598affdb1f61c8a310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049098cc0d4f08fe09bbd42bc52611360f2d7c6e0ccf9b2d0b79cc632bc4304a1720753e58b7cbc0b56ea37fce7f87fd90edfeb98335f85407947453fa3107900310b18309f8c3eb4eac67e3295bfd38a09ea6077a43f87cdd4793f7191ddc5aaa26fe274037d0bad037b83676f71b86c3ee3252c2130a94b399487f965dc72d203305455d882704d877b6bf00703f9cc4934adec9a29946a2d6772fb06dfee31fe030db7e2a279d6e22e246e411b69d471effe74ece73570d267d6c844764b6585f00a01a9236a4c0c464161797b41b0e339a61eafc2b76e3b300fa68fd43f5742c5992951f0fa98d70731a1c48a97207bf602f9b84919aa0d814bbef6991f32280fb10313b62939208d5acb465bb829efe5b65296bd683011b337440018d961d72d2e3d021c00c8e1f462eea02c87b6c55bc5eca9e2e8e8cbe3564829cb4361648c2d5c870215106532731abe5f548725bd02da1ea5a6f653fadce0e420e57eb3728d22505302011352d607702022996f40d1ea3993389f6f3d6e8eb58e51d93ceb3a73962b1a021cf6a81176eb51c0c44c15aaaf9bf0726da6402127f2a58bf51e3d902a871a26333addcb43094e086aaf250b51ee74b1387338e3453aa95e3d5a171a09773fd1bb2e28c6df2300e6a7e620104dd3beaabcbd5ca0bd150061b4e8ba8afbf02a49999452d72e15c555af86be894ec71a3a767e9ae21723d784fe68374cd05061dd020df1d1a4f89afaa3c1c0aebfc4d91d9a0b2b289fe714edc4e909945dad1bc56cf9caa3f71a4f94919b653af69f45516d8e88beadf901fbd81f62d932ba4a18735a4a4527858e1d4665d4bbcd3c43ea01b01b539c4e7cfcc3502c9298e6e0197773f3fc91c8e051b4406cc948834fe07677d0fbb67c0e4ed67a810402f3cff1648567b4a27a28820af6c1e3a809fe23845c14dbb8739edc753a1a698b000e386ccdba98a8e73903da9dc74bcc3b7f14e261b7d643ed85796f555d89083aadeef7a344c0604f1c320adbc255b9b0ff0beec691dc04c077b5d2ca9be6c7868020f148c9583d75ccaef761764b6ee99832f6999ad45d885b51eb3af53100ab7c4258994a1ad7828729cf7ff219812f60d73d19b11af3aa102c387eaa3e3503d385c725e98d2eca62436e9bd9455573a696cc7ab778a2b6465160df8559a10ff38ffb230e531815858826c604320c530277f39bd0eb3d1ee812c24690ed478f97596fe703e9cf2bb875e73ed72c90cb3629d21be5e0e0bceaaafb36c1fb54ce76fa8799f164a7f218f9a893faaf0c416199752db12acb1e9ec31ec2f80fb9380545530b5043b841a73327e745c512c7033ef6762df6b15c2a0dd0949e08d93954c9fa3ecdbecb45ea475882b3a3c475cdf9747cc847652a4fb49a30159660540e350b0cb1fc92e68c97839a38dbbdf015770fbf726dbc901d8f00065ff018e9a34854cc767c211d01bf5ddd165a787d0b567a19a4b42c7b78d9e88646196f0bf7a9e96488c17772b4d74964430c65c8be815572429035ae363ff8dfcc03a78311731443e234298c78778f1002103a29b81d187a7747fcb3643c419dd0903094b8a20e0582f536cbeccb6f9075509b20b8a8abc4c31b010551ae1e50f294ec9d4dc96255f86decb6078a6de5eb249277b234ca6e196916af08ec0f2b18c4c5207af8815c1a20601598ab04b3e478f1eda3d3cd23ad2d65e2a13ba695625da7d64a0defa1b3355e81b67a236e3f0f1c2248b4208668986f577330dcffcf472014168654d0166e23fa340a5260a3d1983d29bd88cc55712b507c06bca6efcbadb339eeccb075784e12865fa6f9db24e2e8f7cc83ca1798d92b80277c8b18b993f5198d3643c73bc17fbec35159e15a63f3c7298f40ec3acecb0dfff22f2e7508ca0986179b9cc369a8cea8679cb327f5b9b959ad99f1d36abc85374fb6f39de6b7a7575d0714603ae2556a8f55d62c4d92fe21604d46697fb8cf675662e9696fb4900651ca246cc8437f442a63cfa54cfb698cd2310f417bacc181eefe636cf4d3fb45a3f5b942bd9fc490e42a10e45345bbc889b7c93596ed1b68d4a3ed169b0d68786e5dc83858589cc71fe09cb243f2452aa21d4f821a9aa0118672ce059e458882ea27119f9092021db22de911f97d36d32c50e041e725fb2d73eeb4adc8de26142fc14e827e103309d3cfdafe201548fbed60c621767413ce7dcdebb58101067afb19cec1bee0d87eef049ca87cc2fa55f0130f2140a1511db4248d1cd359d1909c8abf3ae940c457f2014b7541b78be4ca2236f8f9020000000000000000000000007d8706e8037e60a44f6e79808f45c4cdd2e77d81776007505b829617d5fde2e37f000a86e38dc38d318ea90aa8ef1f30ba3d8c4ff955d416dc42ab9aad0b099d0cc23967ad0461b0e067435e3e8e386b5ca0cc97eb70df89005fc2da2cdb44780000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017aed005a6c9bc85480eaa46d87886e582d79e38c89ecb980b43c4378323de8bec96a96b97256cf57050577183dbdcdc6c39d5fc49be7a8cf0c0e689481ad4a9f9013960fb34c17f812054c9ff32820f84756c7d6694141ecf63e03e53c847f20bfcad36383903d42f5d6935a78d1186c2253f57ddfc9437331dfe67c3a1204c031c1a28f244ca269c98d4ad49c86d02b321fa79561585a654160e3ea8730fbca1021779e5253e4a73c0dbcc0c1983f43ee69dea12d2515f6dbe7d68841d7d55cef90b0630cb3b4b01cf8a5137f3fb79d19033304e2f6580339a0b12a769b642d50ce911f177dc569cc3a03a6ef01c53453a141e55b71d8daf1fedbba0cf32c5cea3d9021ebe059cf244ea844615239e53b848d135bee164c95666f3f2d603ed0aae60fe030bf72b10fcaba18fe99c96a31a160f897ac69f10c770d3959ad60ce8ae9214620323430ea640689016106d3c59cd1d31345a14c7073048280a91695ed23ce48754030b7b7f4611240c8a1ede0bc6c91b69e3bc6dbfeaa1d8f1d048111e2389aff273032fdf832713d39288598a1227a56c27521aa23c316cf886bc024ac3734ba339dbb5a7a30aa1ade57ca845767e7a68fea803aa9e5a83db5d977b3d15241d0cc9d53f612d0e89af85325cf579f1dc9330a9b33dc21de537974115c51e46fc7dc818325ece5f3ffd96a063adf2509da718a606836bbb6fcf638f5d9a3a5843effa900c6addc21e579f498d0fdd640a27425b7c19d1bb2473038cbe45e7ab5d7862a4aa785f0bc865926b7cf1aa51ee5a516f776da6224e5de48f87456d426911481716bca4444cf01a2718c85cb6532d4fc85d96a4b4bed4b698496a2fb158e9a5a767d1ef8439c7e88ee97354f17201954943231f0bd7e54ecdf19962085a0dd9207462930ce49393946c565be9cc402580dce9017ff571ed848cbee1d82568fde147f3f8f67cc9e543d526a4d65b6f356eb43ab43fef557ce5f129feeca8533febc0eea9bc950184ae1b58c71459f64c1bb04675b959467d1706cc305581695d4818de6830d8492580149065e8699be0f60274accc15721188dbadc97f4a2881cf9fbdaf92bd1bc68e33d1021dc98e05bff82324bdd3bc88ffb4e9e6c54ff3203fa0346538ddadc9e571f6cf12d3657c41f586742a3282ff8363a2ce1d767eaf9c8dbbd121305f3ae4365b9739e381daa4a8001b579959adf1de70bc7356b688361fa0ac57d2d227d2e37b5c0dbd93de8310c4862d5bb76685e55567855940a75e1b501c26853e1b6ddb7245f52d389af73cdcc51b8c113804149d13e266e6226ef4aa9dab670335892b4dd511aa4e84a9ec2c5d5ef7d734cd70c42f431f7e411a29c7d0021dbf2a0722d291c132cbfb929841c2cf65ff2a4c9e2e0cbd83999dc731620334e20f8d91a7acaad1fb6ec774f33329737a94ee8fba4c48824501f73f1877fdbc47af1a16e2fa20160bb02575238efa3bc3f3d61976db9d06350434f23f4ebd74357f7ecd3c4ca1a510e8b3593211f56850b4267615d917663bb2912eb663fda9b161d1de6af1c48e025a39bf8533d95d7078d26bf373bfccd68338e7b7407a85b2203b7572ef7a81c9bdff7b6d9be5d1c494c902c0085bd3be992e7fbd11be14fcdc29d75e4f659d7a52bdaf784d297f65bff85f4287b9281a00585473d4af7f73f79e420e54371e0b22ed8c20a39f1717e56d10a4b9eb791ec40d782526b5015adc718cd2f8349e14f4d4a5dc69ca6357b87e3c906db1154896eee80e7a42cb95c5dbddab429fb7abfd74c2e1b37f4aea346a526234569b54a7a2df70f84ba3071e359a466d61a6eb3c7d97838ac060acaa00870740cc228b513d4f4924b47aaa768a681f55ddfffe45ddded494cd183e9512e0001e061c7c96134566156737d9d0c076c5af07e42190570e2817902cface024fc1401f0fcc3eec98c7352ff4b231a0a5209ea3eb8685dfe68494fc46edc368203cedc94f3b591cd2954ef03240f7ee4df4705916a9dabc06aba86c7b1253e9bddb4ad3d036c3919745443300563596baef84a410497092de530c36a3ec06fc5820c1870a007b655156b54e5f3e714534463d2b71be1a863d62615261029234fe0aed3c383af07f5e425a59cc77c38adec36f4a6ff03480dfbdd0b1d49a46bf1f0571b8319283847940ee52998b5064002ccaa770b095cfc8f00143b569ffef273a4ec8cdb7cd63b48da77c72fdae0496e3ff0372f5340ffb33f8d24fa3d023582a91e889e9acb1a45e64348b16465c688aae156cd48d3670c3f40000000000000000a2089501000000004c49c9064bfca36d780efc4c824c1f813f5c257a2476fc10d5072ef955d9d8c32cb321cf8dcb643db958d20d1b96309810354f79dcc75d2849be3b5d4a0a78c9e8b01c2f6322423a39c274646a1139356fedbed57e5fcc37d8de604de90651d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c050c851598e12027cdd9ccba1818930734605c38626068391575dc5efbc9024608ef5e960297b1b95f55205a0ed8480f43eff3efd807a38f5041b37b1afd986e027c0693dea31a5fbe7c279f5e673082e67ae068bca2b8c97cd5ba6321148122ddf3f60c8d12a975583d3b9439739285100a87479f31d4693f42dbe54aba62c0310adc338abc60b33ad19a5959db2ea59ee650ce3ffb09a68e4425db2de7d070b020372790f31660a270641741be96d444f339725ab3d12ccead101d8943ed62f850a25260fbc1f858ccb88daa79b1b9cdf7e036ccb943d9e4fe5de10f7f6220603112514d2b5f1dd58f6e73d997d313aaaf960e62ef7237782bf5244ab2e1a6eb6f902139c02fef1989923a435aa5fb3d0be38906c3e28ac0ea8dfea69762d9db05a90021a07ff1392c0f5a9f9a5a0af0e056fc1cfdf637c013ea4080b9a29dc2cec44be0311fb5648559828fb710bf6a34568f705ee8e143b8cc891f8c85135c07f7142a8021f10b5d6e163cd97db342e7e4fedc8bf3e660ebc763fd30834667050a4336c420211da5535d309f68061a32bd2f3c13207b4f842b84e3ce2f1d7cefc4e7fbdda12fa4758f296ebd70a5550f558d3e970c47670530e8b7c51aefe98fc48597de8741489aa49218560cce2ac0d01020f274c2d1074c6140764689b05b6cbb0451201e65dd83e6101a21342ed813202d9fae6d39ca4bc6981de4b99309157c07a520876cc22df7ccd7edbd350d57498374e9f009b4e63e47acd12c825fbe53bd8cbf8313016e307efd5535c5c70b551e3d0115e133f362aa19e50f6027a62de42cd0afe0fdeb258b468d3098a849e3d690332c2b9105a1c135a28394ba3d63b83ff417762dba3a0c9ac6e56da633cc65de23d7eff3a22653112e4c3c20f5304b091266d49ef23b889702b4fb5c245fa682e436a116682af0deef501e3d9746abf5bdcdb04b1f2d4372e985cb82169fc92e4a34486e5e0ffa7d99113899494dbb191b885ab85ec5fab48207e8453bc7bfb949a58675ddf25ac2d6458b295ede58bfd2e05842334a8037c8ccfc6e9fd7d410acc04f1dcc9dbd446f1b30384e0cdf83b9bfe66e132e000251034c1c37497cad54b8e2a26b750b0da3f462a40f822a13952112242e5b09513af01c49f37c6dd63616a83ef42897e95c84ed8d552b5c10e4826c66e9da1f7c491514a6242d2ace7150ad59a82a29ba60a000fcaaa2a735271a9cb8beb1ad44a09a17f5cbe74eb3100afdd1086337dffa1a5bddbb14badd8d33909cf15c107f863ebb8b81c5e8826ac18ff035e46cd3a9aa2f183a428ae428b1a4a0d50de410953a402cd34756ee94a77b2368808a9f09b50089a9de5f59ddf8043afd9d69f6a58a6c6eedf56d9aa667ee97d10e0a0856f2b8a606091923b83818b547e77d8134b879f50da87a04f70a95ee3d7b8035f42b679b89b596d6a54affe4e1b1c55551bed2184b6836fbfc52095a68ff3619dd91d74892ba671a144c24cc152a423a7c02f0350bcf40455c0b978d77d4e6caefe43d1e9d2ea79e332774e8561053a2f6f605b29591752b995270142c084fbda343e17584caad6beb885d06643e5f54beb73316cf135788f708befa5bf4e1641ff73b016618f4435db68869d872abfe4a6308db023f5a267c5a6a0330fc6de6eb9c270939cd071da688d69324aacd3c3d5735293721485f43519e59bda5e4e94d9e07cb1b347b16ebe9defe6a829ca4dbc023de08641997f9278aa9763ec73187b5d2f03bd80e68d0778e52cfef10e5268978181cd978952cb4a2f2a49921d956ef3f3b3f0f2df9d08e77998dd7f42deb50a7b5cb4848cc01d1960e8089a8513f7c6a2044092ac9a4354c1c31aacd657cd302426bc86e342306242aec06c1b5d4308282966bd1302f70c9edfffbd9cdfb7c4c105fd488698bc253cfeae5adf041a2cc79f422881a4f248bb4a2c61221946206ec081d79854565b423b34f168e978d8a691e41fbdda9e4fb3303292c5c6be382db12600ce38588d65fbae1ced80b61b4ce699dec39f1d277239cc4768acf25956dc6a7b0fab9f7b35e0dd758f516add3e1234c50c6237692fbf02efc65608a50d88952dbba5a246d05db859c7c1afa31c487c92a252470d3653b410f4fc5715a865708366e3294bb341c0cff2cd438bebaed434ce09cbb608d0b82025e6b1690f585a736c52ea183db58c4546706379d990c71f148abfa9b00df205272132a61816887261a5ac897563b876697080056d8c64a1cedfd0bd720f949460834862d54c446ab9ec0e9ec9e73f6834cf58fd877780c72d2fc3490579e7f7347a26d7a60db37962e02c045739145e45a23b372b7ab441fc516ddc96e7639eba7423b70cefbc8ef907cf96d1a099a42f1397aac6da1c201f13fb0fffe2022d05581aeb0a04a97c40df37ad06", "525152", 0, -1654978657, "c01782158b69fe9e15b3c94646f2be62866ac8b8676c23b54bb7a9771167558e"], - ["2591496e01f779ef4946e4c6a3306a1a67c09fed6ee9be8d2bb62eaad59b5be8054dbce08100000000020063c0510c9403438e2102000000000452ab51652d0ec5030000000008630065630053656aba5b8f0100000000007f2ded250201992f0500000000000000000000000029a62c583a9206af173f0a691321d1e7ec30d751aaf091d6e6cbb0ada5ae21b515fc97f19d8e867e838bbf9148e26d231be8402aa314bb618f0003f86b1470695b43895dd5239f4dca8cab37970e93c92525e0dc2f1fe636ccfeba904ddf02aa000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007017f3d8344537c7f99d73fb8c2317a7cd5c4842980a23899090b1f944f8082354296dc6e414ef556edba7d525b7b6813f87a58f4b206a34adeda14eeca48d7395c923a5b0f217eb765c7ce1d378793ad7243f32e9435348e86e105f9fcb1c32f8c3a572a5140b39b739110f443d3bc65838fa0aeeb7494e6cd99803f43da37c03114da1b96c817f1e906d61530ae9be3b454b5f81f79520fa3e7c041bb09d5623021a40565105a74381414eb67c19aa22441fc10c14eac75a40657116492feac2760b0f0e0997114fd39d73adaa8ac8e76b6ed40ded8a17c2382626087f03cdb1a6d20a444f7b482ab9983560558694f8c5b3f2787df6c5570701330d6c504fc7b3bb031ebb64187138a69bdb58a5f05d8452e17c410cb783ca37ffd43ec417880fc107020fb031dfa9377d6a7097f6edc54d6b796cebf30097964e45467e644892deb77c0226d62b289416f1b50257c94aa652364c925d4b30543602a65f37dd8cbb59126902178c03ecc6374b9fcccce97b4300b7c3cf32a89f4a4b8cf2630fd8846ab99200021dd63ac4eacda2789b9398496503004cec37489eaac9b8bc5c96c14ebeeaf12eb3c7453aa722c2954f7691e3ca5dfd8b5f7a1bfd57193e33d8327c04ab8fcc1f3a0c9ef93acc35875a9d345b9a6bb0920a78ce71a8d4b16bed8bc45e433cd4f553b8a5e2ecde5cbe5c6d577ae88bc7d31d6f6ad6c74b9bc9aadd539535ab7d65b6adef2b49a6721211a25535fc58f65bedbc163d11f765df4b19a7f81a6403192107e81a1263587be1dc1408606afa31f961029f10c2cc2ce0afe5e3c2e6632acf71ae44fa45bc52f119990395b7696bb0e139d984d08df2fe3ef723afe42dc5a8c5d64422caec4187247d64eac8c2c8bf57b51c73f539702cf4ca77353554d94d33e44f3d54592c797c88ec01ed00c8aee5aa280d818261fdccd24af355595acaec6d89845619edae744cf16544196191af37d2847c819045967741a6db8751c8155828384ba3f7d431cce075510e54c84d63863f88fab670b4fb2d53e1eefa01cb1e35b2ee12f9afb4fa24a0c4dffd1f8de5376c302ceaa2e287d41e23a0aca21e027be38ab268a8b584b951f890623e9089908e1eae5e61f757cf5de8e26a3aeac8e22ac6a746ac3d979d82e52ebfd9f41c182099059f3953fe168687c5f08a9e3649e475bceedcd855d74a8f0b111c55410def5d9c2408441abdd4be60af6d6fe2ead622d28943f73aca642f20a72796c0794d668c10a3a751af3e5a5077df3e4f26e145a5f110137323dda00ffae2af1a5993ba88e28ad1cc7ba30ad1d442e465678e1596f1832c74025e806ea88131f5a6cda2cb3de6d13f174430e6c025f7b12c4a0a9699beed3be11f4c81ff08c2bf27e3a340424b99377f586c5bda771127c40e3f88ac8162a65085e773e132a07f5e9337984403e10158cc8cdecd11d93393f7820b345821771fa652ba3ea9f0fa6970a0206dbc704ecd8bec7fb1c9850f52d273bd322d3057cddc21d647b4cb6941e96eba83091fd1543d415cee47ef967220b0eea5d5bb8d1cff5d6b83c1a5b79c93e6eab5738f9fc26d25abd1d4c124a6bebaa6e37243356c13b17058dffafbb4df2148214294ad2a30a56cfce5dd21637dad87ae04a64fba25ad93ba35e2c008180fcaa49f7c7c6bae9c539c81b8799f019801c39ecbac86a940ce68b071748cf5fcb88b584fa178fe04594a006fc4a8382343ad4e07635fff350ec09a839a89ab93b58c3bf8fc469c9163280f2a7909d088d17f71977ae81f16ebdab65c49753a69b396ca108f072eb629ca448f746b7065cf683638ac6a522f43a436d94c523154c3c20a2c866b3b4d50e6d4b23e0a2494a4f28509bbf042383d57c9d84db5fc3dc194fbda482e9d69279efab15aaa5fad3ac308f7f6438dbf57e0ff68dbd7461c5e460978860fe04f200e2025c154dbfbdd83cb6578cf3770bab63a42f1dd918dd2bf0ba22386376801f358f76a5dba88adec3f8346c1e885981db12f8c741199d216d7beddfb83ad6343a4d75a17d1f6da9465360ba2c7882c654d2d8448b423d0487128cc6456d901218b34265ecb41bd833ac01554247cf570fcbe3542091ffe458f38613e4e1fd7a5101640c3dd8445f0793a010d022d39c2eab0dd0618f1e8d4f057f6f66f4727ced018c754224c7ab2f064390a8c66dd1c462409162171d199a93cdd35379701c477ca6df65bed55f5ac07f1f295dccddc4cd596086d12e777834e6a51346c15a3efb9290b4ff0588195ee07f465fe3bc023836c8f2b010000000000000000000000009707920df44486d8ff13900463da8b0b3bbdb1e9adf72c568eea9dd4d3b404075e11e2f7d3e68e14acec33477d2199c1510ba54f1c81bcdf020c0360dff89dede24ad641c736ac2b6ec2a1545e4c72b510b1243bff3fc00133f6ee83e72174a2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e423a8003e7c7b75af165588f6046d9c102f637526b846414007d7261c09d36ac2ea496427ee0d86ab855d47ff09250e772579bcbd8cb3f35805026203c01cf6968b81f637c6ea2aa0cc07ad4648175b2c83d7713462e61fbbc63a57c430fe8bb6ec5e6d1673b12913e56d624a7bdb5e18d5d7f58c2d7e38cf08f7cae278e90030ef6ef782ddf871de024abd67c1fb2a0b179e984267ca7c9618d4c18ec6cd30603169f3405ac159a2629f3d3dea02e6a59c176c99d0cb4fe993e19340f261fb7eb0b274e21573c63e604e654a013aa0dc4372734a30a44dd99c0fe691a56e980bbbf2a50ff0002709d9fd1942890d74e9cae2553eb10b43e62c522a18446efd319a10329825fbfd9da260aa528a980451b7ac826ce6787c41b12285b4d5371a6d169a1020d030612e076ed388b74401217670b86a3636085a649aa86423c2c832a2938a3031a11fc1e335a5fc6e85e2079ade553d9af53e3f54f401feacbefdc4fda7359d80305bfd303c73c8e2aa2c8ecfa83d9cd14305d68880fd9a5e2c847731c0ad4c7e50206e3434f16529c1821cb792227691ed7e0cd022b5337d7a7f00c62202d35db2847770db41639f16e763926f2fd5e1602f1259e65164e53f69a0ffce0b067e0875bd8d7f11ef27813122c5b70ea7d831fc7b407a2a479b1ee742ea2d48edbbd92b2307435b01244237796e0a4db8ea1b87ccae2b0d47d61e87be51e3d3b273d7c4e4d1ed7ad3b88a686cf7e1100a8822290e14fade00a61e298c5d053eb3c24fbae3d3b8d62db6ab429214780688190f5e9e0ef618d83e8887fd3460705b2c45d51b25137e16eff997265358cfcb58a4541a825109f1842fb53c7a9a0345d0fe99b9f47c3022019e97f8e8ea9001cbd20b70d0bf1f05f4e2d06d3d9d2faffda86765c27a57d0a3894df7306bfd8e4286e498f17fea0ebde2a83cae20c397f00e7dd9a18cca626b2621956e52f1ea0cdd605a873bc50fcc839793462522c14b8eceab7cea075dabf78a1b7a7344dac18966d6a00889d5f8e7f60b6b29bd2447016e1655cde20a5a8dc9226e64f6f0b27956f87a637ca9802714afa945bb90010d8d00933d7bc2ceadf76116378fb866f77c83edac32853f4d2623d027c7aca05f0db88bb103896e96e5b601e77b2eef1e8970b7f76cffc7e9ea7f09a034349780ba6cf2260e5450cee36b3b148b23fd251f5ed8e0e7bcbef3b0b07ab945944a3cfc1d2ed73e87148fa185963422ca333bcf712b1604b70b8867fe11c874cef2df4ca50fee8fb7bb8c84c506281f1d8a4a16e9e12cc3b04b6ed3382e59c01086cdf023ce3ee6c1685761b3e56c849ba339d18fdf2a5fb6ee80fe309a76d4f5642688509771047ed7093c1be8df9a3f68f56ed05adeee575a9f733e7062b9c4ff04e3eedbfa8ff0629aa685436f49869ffc384df5b6b713baeba2f79867fd9df188f7324f8804e89cfef9621537682e81f6a7d4fc4139ed1ec0297b566f724aa6826f0f1a1b061ed200cd5875169a2f0ed3ada92c7733d896f1b39df8bbb72af2bf929fab7f8bfd3b79ab84af758011bd8d145d20a1669730aed3174df6227fabd7571264438b3ac18b8b0924a577c9f36f34b83bfc3fdb029a9fdd944346b69b456b75643c89e2d2f4c4cf7fb80ce97df71047cfb0b4f2541a97e45f1ad55fd7b3399cf3fffb07d5d9330ad42ddf2e3e2ca27b5c3a89401642d6902eb95ec99b72f0d2f4a5c2200cf48d8978e8d913496f2e67b9cb26683b5169dda0d98a37c39dd4a63910b621541966a885157677a671934840bc898932f0088a56b97b61cb9cb77f483bf71df80b41e25b580509395b83b172fd87a1b01466fc92346aecf5295da16c9be087ebecf6b63667cb42c3349eaae83fe846a16a291ebe4b950c00b6b5d8dfa1f917d1e58fc57b2f692af28aba4ba5f71448a3c5fe7a7947e73ba7a111b50c2ad5d8dea3f3c70c38fe20a25800c38d77a3ff75f44f19fd900a19db6f700380ff1b7049382eade90cfbe028ab0f78edd9ae77863b261748672d10c14103b55262ff8e9dab05a41a32fb042304acaa4d1655ee3df2d34ecf8a98bd2154c946c6905e8c023e2b6303bcc76ed96ca16e55a67bb4153fc4c97aec46e9abc4ce78a9836b07120f191b43e2824c7e015884b74799249e584fbe1b2a3a2af0840c4e7a0b3e434da7103c9f47ad8b46820b81865c1f92e659e98da0d48dd0258ee013c5bbdb7b0f924625904c26c22df8da0026c926d96eee94f7a485f0f4ca7e65ea3b19caed1f2b950416d9c8b78746e99502c85879013f19812a5d1c36784e2deebdcffa8f83898c8e123e1efcf9ddea754fa1b629cdc6155e045cf3ce12eed8f53f65be1494e5f881fbe049a03761018122335f1c7d38c345098326f5cd61b7eb1b45f5ed121860561c0ea62c35487f507", "", 0, -1021158988, "fdef9e51c882dc5534aab2baa2f5d45c3c925abc9ece4f08e6146050d8eb1690"], - ["372c3ba10215ddceca14fd896f9406cf7a9c56053f56e338516601c9c7e35cc07eebb97e620200000000ffffffff30d4baf013e73e095f7cfc068290649f0f19de1bc4771998fd0632689a1559d300000000025353ffffffff03e502cb0100000000086aacabac52ac5352cdc2480400000000010070ae9f0500000000046551ab5300000000", "636300", 0, -625391440, "d3859297efe9f455a8c4b8c34446aa29f9224eb2545da90266f47f75b57fd58b"], - ["e5b92041039aafd5c53b4a554797871a6cbab3f1823d583ab32e2bf21c3b40048cafaf48b6000000000265006c547f91605555f9f31fb886a4c36b5ec443b1245b6a2d13f166ee689a7558b30b5084d20000000005abacab536ac62b6fe998bb29a3ea2e7a233e8d678c087b9ac7a8321adaa9c9d81aec2f0ea2e2503e2a0200000005655253656a3500802d0222c94a0400000000001f1ea00100000000076551ac6563656ac28d18b902ae795003000000000000000000000000ff13a0594e2280dab0e6de7f8c1611a6a2726d1b5296629e3baf10cbe6c3c40a7eafd9a32d75248ca33cd581bd15083cccfd9cefdbe2024f06f4b58c6481e24eac11d01f7670aab707efbc6137f1d2a9713590e85bd32950a8d820d18515e85b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000309c804ed1a241ae1ecabe7e249be4664aa01338ab285c9df5446936c829d7e9e435b4070f0fa130263afd1c85f15754b6ea0363a4652ddaeeda1d2005c9daafe9a59ef44c5f0bbd795e669754a1725eada891cbeb62d53e216cec837bfb83f06501a1ff7e314f99de59f01ecb0ec90e82af65733ac37e55b27203c9d1f439f10204867c061be913cda0c9c82a03fa798e045892ccaa3257b9657152c39064c7da03219ee8984be7829880dc055055d30b209bb4b83de9dc000cf07297fff583eb2a0b20d25371c906a4bae61a0a57b2104d8d140b571b4cfba3a7dfbbaa91d1756eeb183431510792716187b3b718aa168e96aadaa777d16ce4e0f58bd6a3ea3803d00309cc2d5723221ba6e81de9a0d1644e9538bd833c5ab84b29522802b1e8c068d6022dc02e2a381c54e2186770d05cd49d81cb33051f3b406c77a17fe0a79b42b8bd031c39d75b70d14e006bb9442870fee16f75243a36fdf111c5b7084c0d58962aa80316a329b20cd5d574e7cc28dbcc2a090d45ea57be3088d7116f319135422b2ed4032530c9e7920fa7d9f44f85b622cf0f6436554892286b3e86919143366f7d5638c51c6bb7f16dd686dca8a77bf32524cb1155f022e405e7e08ad7572c7ae2deb3d1b881f3ef9e471685d96cd7d5aa17a6f7617c76f92c055e0ba71fbe2062a6e1a5223da6dccb358344cd876f04aeb2e480dfce94df3c0f968b8a319ae43c54c7f34e81d6cc99779beac27257e691488a83b1879c1aa2faa625743de21ebcb8ad222b73906266b6f8d132fc870879f71878c079ef2b0a130f2b4063f93b477d945c292ebb1c6b98c1059348f2e137b1c1a3c56501b992024af9d3d1b52483b98bc20ff155ca1b38bac95a19cac2ac325331487d91560bb262406f8507bbb1d7fd90dc1173463cacf8b90d07c2c93cfaf45f69d58482e0bfe1aec5255dec2882a32f879fe0d08cf9affb10639e3030967c7d271884bcbdf299ff702fe85a8f3e1e2fa20552921b24b6dcfead078e0784dd7d28bef9427ed791f318610179fbe43e3adb159bc0c69edfde3016ad593d2d6d93239ed904770213034585dd2fb9c9db651d88204c431cbd5c3369b36825afbbd2cfda2ccde0016b53b475b9ecc2b70ef89d4f6f9878a14977cbaa74594251d97b54b038b65801b6dc207dc95f52dc843148c787c9e652cc5f9514fd0ae2fad516d93020154e3f615c0902b89aeb7f6481b1f465fb01b0e4947a20fa9bbd6be5111c5f66e3c9cde8ed96c25166a9f37452043ad771129b78785db7f11b0b0c2634d24b25bf169e45236c7f68f6cbc343147b8f8f2fde6ba8b633eb9a6a209f148599e72804bfdd128df92452faf1ae3f83ba195a9605638228cc6702e523b09d94fe3c2ad9a4dbbe15e77e88ce009334831db2cdcb50b282e485254bb9fffeeda803e09cd8d627179ed0f40ac5e5a6be692aec7b5a33f70c331e133873564d41edc1f10d598ab4024b87e101cb8e6eb5f097567b1db07cd825d2c4d0174ee625bd9e695c26ee84b50e1d4c23a9f8ca6eed73588842dd72819398ad3485d8355d37b27a9fc43282bf0ee4127f3913c9f5344aa4c5c9b0dbd32b1b1fa27cb34a45bb538e488da0ecbbb37cc4053a0b0c476052e88ee1d71cd3aae8777dfebb09006888ac4bb4b390a784c333c8d9b17a31eb1c7cac60327bebb5a893dcd1fd32fc4c88d858499c9e9cd3f1c84cc15652d05f4b8ddfb7ccfc3ba4d5b137be1fb450d9005e5367b6e89bf7c2e92f23247a3566f8f5b98fe97bd2fb466025b020bd1c19fd32725ba52bb52f8c94d1107cdab5a63b4a469a923b28cf1f5eedad7318c288186c62e956adbf247d72d7d061d13ae257e61375d9f569a2a0db862d3df1ef1ff3864ad822baf132af4386cd55c8ffa634b1f4d749c992c1c2d4c04c07ea48a2363d5f537e1f3d3f7d50cb0cc221b97aad0fe62e0de11519588ccaf4d348ac9a26175f72644fa2fc57346373a92bd1fd5cd75982752ed690fdd8946e579aafd1b83bd62bc24ac31a963d09a286a3ef31c07c0a7d4ace5279591dfec8d82d02d5135432d86e6be38996f00c1c743b6c4337bd01787984520b2f0972e88f818a0c6a2a951c781afc6d6876c37877d525ee127545e5fbb1c3f1db87b84443fa27d66b17df9181ff4e5d59c206f2dff424449cf2a5012a43c9a6eb50f29eb10ca96a0d466c4c683c88e0a16be673d043d23d6b7d71665892a2f48743138bcc38689303aad868a2d99780d5347e9ba020c517fc74b758f550dd903b6c1380fb04d17aacc756b201000000000000000000000000a1aa1baa6f0f4d3b3accd85c65fdc9d911a68438a798b10c7c17a72550087d8206f1b419c51bc6c01c90441b0845fc92dbf5ffc91020eb8fb19ba3b73ae533f53e57505805befcacd4ff2915fcdf5f24cd963b9807b8b51d30954d54c8375240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002abe8e55ed9f73a1eeab13beb058fdba6d653b4c7dd41c467cbfba9ddc9e255571f9525aebcfcbf346b613fb145ae1039bc9751e1dc7757b43a9a1a60bce0ff17669a8bd6e33fed56010cb7bc80343f42c4480448215ee45b55a311f522631f8d8076d54073d5045b65c9da06a085151c16eab4f75bd49a7338e78cfeb7f770b02084815ad0198a950a85aa49f5359d4f2be5a7b5d04457d2373ad0e2079a7288f032b9957c4dfc04126788db8a11e0bd0801e5e6abdc9ff1f60413620d0657db7f00a1c5ec0a9d16b5ba013bc97531c90a01a4844ca5105a0ab64e8ead833dc5793980c6ea4df133f513d4083ee1b991d2dd725949fd57f4b6aa4e1f89af07ad21519032618162be804fbbde3ab07bf0e6079ad6b2c3aee3365ddef8424e276ddc333f803066d1aa254848b9fe197b009110e9f287ff71d97f6670c1f04a48c6fc0106940031113bd6ae0b713d4da08c70a2eba99e470df2bc790796e0777de8b4bb9df28e2021c92d8109dc018d281a9b8e6404f74b81341ce3737fe2374ce341b569b1ae56c0310248287daa807c727bad587caf9c56f187ef3f7354d6e716b39514ec0698978c29a03b309e13f9e476cf509faa1d4d9b0267d976fb77a76c163c4700fa539c7f15b4e69f36a39cd40446e71b39d17b005b012bdb4411bb618937ea8b82e7c61bff6481ee2194933411a56ef966775f7eb493fa00c8d822c27a6029145beb3c4a13bc22728513c55764b8118671c2ef5d932a7baee687ab49eff9dae9d17f893c536fa2323afe5c5fb6b2ce266bd8c02d95f8d878dbd2b44cf0fb94119d46c4b317217e607256f8ec4a2dc853615696c878e2730c7548cc379c77c4360301799c0959e8cda85444f1264c766b8e0008818cce935361b75aa78751d1fe235778bcff796b77ba53336022ab31b12c3852685f24e6dff8ba0883e372cecd0e7570451b9ef039f23f07b441e2e03b9019d7928868e87b518d250c861fc9c0b87b4313fc82e24990c463eacf75a2d33464debcd0c71f7785094395abfa1ee12bdd9e6d266b4a64801d4174f4839119dc235ce71d4eac13f2ad6ac7a88d47ef47328b8bfa9af8b008f76a8e3c00f35071d636ad82e2b10c96aa06cd159fa97f4a951013fd7a65c538b2983f12f6af76c25bf6423a34cc0f23192ea2aa684e5dd865f1765503d6b5bddd829a2ff43889519ef58ce6e9241fc20bc2ded1815a96e084da7be8edcd22e2ad566c4935fa282ad3038f80baba4fc60811fea9d581b02e489dd800380cd1644e3f3228e358697e6f118b01310382b6a0eccf471dc355f8d2fc1206abb2745fbd432ba0607854601800a039c3c7da2ad91a05dd7096ee47b31d033aa72d5d647291ddafc9606e188e3fc4b49e3aa9cde7f53149c91ba0b0bbc03b3104a39e5756c1a480227095327d4093a236f77ba14702ae1fe1da89daca648b9484e64e7baedf75b5425ce3fa2c8d13097b3d1b1ca27113e649adc944da0ad690e794f97edd4bf319181ce3017a490d5c740348242510a46ff7b67453815bef259c37b52aa8056c0c4a4f7ac103e8cb7ecc9e2a945392b541f3813a1df73d161c10691d9d86cd07d8b8616a54bfb63a919e158e9107ef5ba4a6061552445982c3986d91b41812077d84891be618640d3531afab61b769a92c4937281e1248e87a000f8f70f558687f38ada579c344861a8c86bead638ab8bf9070c3397f04dad50176fe1562b7954b67bd740e32631b885d8f6e8c99e5aa5e0c63bd5214c0a942ca7b8b2f130f75d06abd9f4fdd82ebad186c81c57e1e7df267af906ff2dd05b1460f4ae1ada79e1acb597fa787fd44284b63d8173c677b11d75875da65c3f3ee35b0a8703072b88a34e092b3ca255b8faf94af42370870199e9415bbf92012d51ecbd8b2e7120c6dbff4a3176b7f85a3c3b16de6efabcaa2cd37da666698008fc4cdaa4f9791c9b9877c89469bb285965625a59615500758bc0d77afafd552382fd039d20888b236070307d10dda352351b94825ced5f58d48f1339b459c2b835fe5c7ffa5890b7708eeb48b279331956c4f767b54efd8023d9e47577cd7f4ee7495b3115fa77656a6f48867cdc3d2d04ff9d1bd2a9b02b1e550ddbd4c057441277dea9977291e30c8d2b43bdd148a69b6b72d1c1464b4247195c0d4d410777cde6fb3e3ed03cdbbf4a4bae7ce16ad6f619a02402bb2d6ffe1e9a979ab131b152d7d4843e42cc1169f460b7a492ad2f856c3d2555037e185125456f2fdb8bae87502c7300571480a88e3859ab04a603de2c9ea1205ee1ea5daab2359f30654bdee9b3c6b613f74cd3b4181553cb73f4841a0737a4bb8f9b28d4e1a51813d809880fe958a4bbfe0b0561986c97216eecdec45f3e8bb12077d33b3f1be0b175e282606ce4904d9962d140d269b32dd7050c", "65636a", 0, 1974178227, "0090b1b2f97a6c181953e5ff474d10cac44c7c592647bca80937113871c722ec"], - ["9ae7653d02f383d092cff961707ae4f008539a8242ec4054de6d8c2eedd7a1b298d65d78e00200000000cf31fe50400513e89d4c95b63dccf2ec131ff00e222a2480bc97b3ec82f1fef827aeb7720000000003000065ffffffff048f39cb03000000000951ac5365636a536a6a86d510010000000000f9e385020000000008ac525263006aabacb88492040000000003ac5163000000000100000000000000007d012b05000000008fae83ea692172e2c36838673efc669d94c5705b64697f2100ffee0a36db3d19819086a60f876e6de94abf3fc326ffb91389f91712ca6f181a909510f78c1144978664f6e9aafb55365de91e6ac59912bafffa9f7e8056d3cd9860bd47f740f600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a098a1be624af328e4e212f6b2c347e7f11600283e02008ee818949765d60bd749ffbf32dca121e6f8977899ca8870ed2945a0b63a7ef142751b4e6e0ed2e00ae625a53d0f2c6e0b896874765a73e89480d0147ffbf49c3d81cb3dab9b496a68f4ccaf0d5ab242f04eb55219d2a356b27c48f633dcb2252b16e43b505dc842950216e7aa43af82f0c07b524103cac64c5b3579c122618a001045ac39814a108d70021e1b415d68dbc7beda57fef2f3e5f13958ffff0dfb87bfa0bdae28d5dc5fbad20b00a8e0df526bb69aee4692231171acbbd2a07fe83ad122d5aecfd4dca63dd0282efd4a91c61be53c8ae361df75ece9e2db0b2ce98bc934a33490c59f52d7792c0224aea0ad39b54ea832ffc8b43755ee54b7745ce51a6e1a1cd83dccfe9b7c95d50315ce5c3aa94076a3d669091e8f17a32de8b27736675f7fb1ffdd52d4a28cf8ea022974b595096c3c3e1d71c95359c2dd4490a357a14e00f28bc2c852715f0ff6b9031b42ea6d6352a2859f535f7e1c760c966a7146d408e4df8847f8235b48426567031664b2e5f971141e5de5a167c45beb0f385ad6bd86a8abd35e3771edee30f536e48167a2d9ebcc5138b92c138b8c42ad30f029e20c60ec19471f2495a7a3e0df23e39bb13c213fb28ce12c7aaefdb9d5477d44f23ec11321629b8f18a6fe22ddb85642455c8500968eddb2957901170dfeda057bd925a993220846a11575396b75513079a4f0ce3291d6b135fd2edf727846e8d7a29665f0587641d6700886b31461436dc87566bea0e4b3245f9cb802259019f43400e0b80c57b9b9e8a3a3f688c02219275491c3487e8a517f5a96fb91e06b4c5cd3033f8f2b6288dded4b33dd735e1043909bde729a757e4a0366ae27e97ce066a32c399d0e8831aa0204a927b097a5e5a3589e598adc04226cd382389c6f50e9f831644e262ac90f5a0fc0b5a8ad381dc049935092adac3fe591e850bcf83c77d0cd9295d9a6df4d58a9cb5474726ffa5be89c895638d171e3ed86d9cfa337bea978f1c31cd8afd07139a2ec69decd2b22250533f42666c6f710cb1f0f2193aaee9a3467d0b06a912e16878d22a15f7049f24bfbaed3b17939a08ddc5f6926881e58113519cc08d277e8a52de283aea1d2191cb5d79a0312f76b86b64416acce4a414f129896feed05ec2da078bfb376648debf78a065f5b1b4e5849a85e4d594a61799897da1ca4443dade74ff45507474ca2a129c2aeedfdabc0c3e57bfd998c40c73268d33e7edc3baa2d78d62417922b580e9ab73649238a562a88258d1f7dcc606c7ae713a8d3ab1f1f25e7c3960eaa625c8e5ad4f997354397d4ba1c5193ae817b001615fb991667bc96c133c8b20919e27258b3b6f4b8ccf138aa756aec20da041099d985cbe8d09d231298a8278da623b72e7845d780ae5c39e2866c963b82c1bbe6dfe4740b60aea2231ee760fcb669f4c6c20493218859b478c4dcc031e2a13cf08c1fdf800ee77da5a6dfcc71e77a6aeced8da4c164cb3d1e561d829f095cab1564c6a033b62f7664877706f64cdaf5e3cc069fe718d452b9f4dfbbbd6120668da6c3994c73d7d501e5cbb1371f9979076d7f8cab4dfd0fa441b6b86a12381132c7cad0ea907ab7e603fc2626ffa8eb0d13cec932343453820211c14b91845deec991ddd052c4f7aee075a237b6261a17282da00735e7ba98269d9f090c8ebecec6b09ca28b8deae2be1a388fef96056493d8839f7e8d1cbe2d4b221bdee9ed87b215d12e828e08e3c38a70d4ee3754ffc1d98c90fa3a85da519396b12c4d35a049410ac3aaee2e1b240ec8bddaa6d2617dca488a69f8dc8dafa159f226f2408f4f85896702897f9db0c931b03342fc03690ced9629bde0969b653547b864983b29bdd2d6136c945dae9de66661a745ede4c189e09603d4f81fdd56ab3917997da8f5a9764101a1fc91aa573e8794dc61d52391ee8c0ab9e78efe214880ab5648219b755f46e4ac8e4e74d26d08ca478619cf487def0a0b60d0be4186f857042d98b2abff51fa9fbc92054bb69b3810f10f1ee2cabcc91b783b22ec0b985724b4d852c4abf762b50249770ffecb75c84025d19fad665878dfefdfefabab362c29bc94ad278c8790b48eaf9b487780257f395f0e95fc706fcfd76dd0ad8bebaeaefac253256b75af242844f50de36f999d4d2e12136340268070c0df0fd125006f08c34df9f40ef0b2bf3261809cca848aad6d8a7425cac660b41dd8dcd61425fe8b8d2104aa7a4ac3bd276ddbd89104f253b091b3dd2186ff6b6a951689cf718380eb6d33c6bbe7312b1065f3c5d424c8c46b5369d6dbf0ead5036e89b97296ee9b0d1f361c0a3a419b6da49a6fa334fbef3ba64cbbeda9643453c5f9eee5b44ae5f26bd635f6a9ec6f8025d0e89ce9c344a4600b64fb05", "", 1, 1180931806, "687bec462be15f9b68b63e325599248ba136c8aaed0682052ae3ba3ba484d01c"], - ["8b360cd5035ea33dd7505591825b8c1187e28d0b0471d8cf2c86ced75392fc10fc73ae953e00000000046552ac65ffffffff6ace879ebf9e3b4ffa24a1669b7729d1094fcc2a1c9e55cd2aeccc18ed35a726010000000352ac65ffffffff83f640fe69af18e18eadcbff5d021ed9fd577f6bce8d16c6a61a24c07cb9c8f80300000008ac65516a6a6a53aceb68b25303ca0d9502000000000552526500acc3eebd0000000000020053d1198e050000000002515200000000", "6a", 2, 6510966, "03a6f52c6f30c3a4174d00a69a3d68873bfcbf85bbf4d6cde82913d1861f6bb8"], - ["85b6c6bd0326c462ffb480400fc10122e10d97471033562cb13545151cf1352b47327dc52803000000066a00acac00632944e2f79c0a84524b37c693fa35db21b1e1c50da26b93634c9a8400d00d4268a11972490100000006525353656a6a062ed4446745bd9c642328e4cd1e6c69593da50876721e795e1f6e08f479c306e98647fe0100000005abac51ac6a007b9f6d021d87ed010000000005ab52ab5152a2ee21000000000006acac52636553059480b2", "00636a6565", 1, -1617374854, "14352697bd88ddb3cf213e8d11e36871146077d6a7d18e70a573d6a915510e30"], - ["3aca2f82025be8abfc7a26b083e945abd2f85354dd40864cafb74b9f190d3d27ec2ea90eec03000000026353e83a65df094ba7886ef61911260bf0e1fcf1b51abe904177107ad86e6195213724aae1400100000008ababab63656565abe193e2b803a1a1c205000000000665abab63ab63f0a680030000000009ab5200ab0052ab5153bc4769040000000009ac6aac5152516a536300000000", "526565656a51", 1, 886859900, "74feb3bb9f5ca1eec5eada7b163d915b7763e2813fd74c87b306df39128e45ac"], - ["3af8de1604b81bf64aaa19becacdafc83f1bce21616e422d4fe71e57021bc6d4d61caf147e0100000003ac6552ffffffff4ea19dee3486148855977b161c6d7b1ea3b86cdc0572339b52ea71aceb47e71d010000000965ab53abac6300ac522ccbf575575a6067dd9f081fcb21444879e44492572257eb86041b05677ce2b257044de5030000000900006551636565635129bf149fb201814cd135a7deca0c8579d1777cff1012e66c9795daf83241178d0d8f953c010000000665516551515358c530ff042ade3604000000000042fd700000000000025153d3d65a02000000000151ae421a040000000009ab53535353515251aced5383af02000000000000000035a9ed05000000008a9d754954f2ce82940f09d2931fa480dec084ed3d89321fcc4c0b65385dd37a6a6e1226becc83b07cf29b23cd97960f53437925236300b64881d303e2363877b6c34a42d7e2a9d2758cdea41108858f9081b78eafcc399116254b1c69c525d40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083bfa06c2ad83766e68fa47a519b6eb2ae633f9a3431d6b04695f4f832e655e06f4498241d155bf9d92a8a04fc11e1469c9a697ed68ee57c79b53c277c2fc432f50fe77464b4981c3efcfd3903588f787bba7d9d765d80da94a36efddb3aa4b90f28a8d923db4c23dc025d96cd2ec4681386a4539fc50387e3a345ea70e3b5e403018707f0994db3e5f115e3ef36f8b68860b5639458e049577d2f1206d6f46f2f032060750b10f6b456c281abb5734de953e502d8c55c8ff140a9dc1e38ab3bde350b283b9e4d561c9e94a0b71bf07fc0a2ac510bcdd370f4f938d6cd9f1cd2c30c111ce77ba708c283e1c940fd84c6a82e4d9ba372717ed98c1fd99e75e895b25ea6022269b07ee13bef3fb4a80ae6a976c6b20fe234c4554c4a91bdf4b80f9db788c203057127605b0cf4a0b8254db799bd85b7dc0a7225b6e2db78f5a5bf8aa87d35e40212c37c91e6d004205c76536221d7e2a144b5930b176aeb0db4dace15917b93bf020d3a1d7682bf5c8d90df733b83df4e41538313c6be8019625b87a91e781fe0bc02211050875a782770c483e11edf308d20fb6eee8c1f779c96cd5e279fa342dbf773a8f0a3a28f351fc3b3704911b65d7b160b3693c737cfd4f0eeacece751eb715a35eab54bbf8f86273fa3d63e1337ec68fe13f8e2bc1e8b89c4aa4c5bc5c976dcc51a6d5aec4f32f3b1ec24b25659a858b84f33dfbbcde6994cf1322c3a77cc5c3529d136a2b6156e792cb7746c8ecb24b40dee6fcf076265d7b5af774d374506a8af77e941e6fc72b4bf0ede5d4bb44cd29954371c380fdd60869c27eaa9decb626c85ba6cce8f000b3c67963b7081aa5460fb4898ff15b87ac322501900653e3c470b27c9300335d05d81cbed4b2ff9d0c6ebb15584b0badbbc76ae3a5eb0ad9362338f25a9ca4141c756034df72a404b240d32bc8fd66679cf3edcb2f8760ec26ce8e94ee4c54d069fc169c162d82f50059d1df7890cdd8d0ed8c8031f9e60ac453d0e341b8d269fc48c47ef92d4184f15f17018179a23f3b73464214bd28c73a8712914c08b4c157a6da8b810076ef8e0f9420eb6808c989dcb4b1eff0ebac89dc146f6bc298d3e05bc42ca7ab73c6b0a159674968e03e4c4047bba279a1bb3354009be544ab790d216cae361e28395f7c8bd91c683bfe6f675ef166b125ee68338d6c578c51f398a1352bee98bdd08e8621effd286dac852f668145143a851ad4bedc55061ba02b4f126a2046facabd42321070982de337b786c8a9fa071c82496ce16b70eeb54f55a1fbd3272ad6b3b974432bef4d0b31fc4b073279d2b720198a02e06cd9aa5541b730ae2ef319d59e0f35fff9b17952af447b5e4c7f24b34183d8ed19f8307920c8abbeffc932264d08cb40712e74f4580a76cbe1419927ebb504633c4224fe3cb4a26581226c5cdcc969dc6ab2faef350e765fbddb593fea29a1517f5d5f9e89eec982daede2533debd8bf1df7b481622a8aec5f069468233f5b67c757edd6812b06bafd81d40a7ac2c3e47762aff6f20ea6f2d9646a8b30713e06195ee0483286f7a64013a783967884ad1a35b84918aa1639ff20a56924d050d96f1a0c8171c2f07398b7d282474964ba90a4884b11300fccdfd5a0d5db70d93b5be8b4b54acd939cc0fff399291389e98b99368138a60149d28fe0337523d7095b74caca182a1dc0c698f3edacf277c0e2f653187e2dc5d368d214eeafb5c143815840a4d13f79c458b3fcea8023c1dfc58a4ae7112cd866d7c4418702105f7fd50f69773acc7fc59648a1a3b6c1d0254995649bc940c2c70a152f73ead7e01d7500de0fac705dc12be0b5a0285d7f1d8b2354af24bc1e197ad8f2559da41f1fc834c3e055ee28938d5b9d79e9ba88e9f5f72707e035bc3bebe24a67c7c15d9eaa5dfc4e446e3e9013dc47ee77a451182b45448ad6c813e4a87c9ec45240a423294c73e9f84af2308832dfafe8cf0cfbd8e538db15222a334b7ae2517229878c6b79153256f6da976e1685a182f5ee10b9319a9d85f94311ed31077d5038beca7d9b65ec790afaf8851ce0b8bfedcff596246012ac24ea083516322f34aaa4bcc30195e726763b5e26d58ace989e1c13382c8e87e42b976dc4903b3b0a1ba18b665e0087e878f4e20b72a015519e6096ef3b811595f7a584ba3d8467b5885f4b557b9d04d69cd4e7fc62634c64465d8bda858921bacda980137d2e80c9c266b57c2d9c1787cbc60462c4e31ecad90d18f3cc3f3f310dd4918923f29a35d9dc2fe54180ddf6ef765058be59c0d6584010000000000000000000000008ddc00f45d7eb4f360a5ec68b247c93b6e9644cb1d01fc50b65ee143bd07101d5e664c19eec1e864a317f05a950424a300d5f75dd5e88adc0ae73e94c175b15185771ea6c782286ce6ff8e05570f844e5cb3331c2cd3857ac1a1a40ccecba7c800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000906d9819253b03c08981a2f5ed41446a173d5aefc063f606fbf1548b5f5394ed9b5bc87817140c8064002170eb9dd2f1849a98021ed55b7303bf652b7760b8245da6225729209bcc6d08af7828674c5d367d152592a1f2169a510a44204962741bbd97d4f5bcce824011b58dc212a3782e94011523417f7de61c65a3288dd7ad032aa387bdb2cebad88ae8e91ca85a7875031c897c7066635edc3f1471f36c54cf0219240319ee89162a28fa5084680343c1df93548dddeb7107c9a34efdd8c5f6470b0cd5ded935bf4f18a9335a90e88281a92818dd9888432275dc021c2e38feb27c15c0a5cf4e22f75f467dccb489c769c41a78743118924fbdfe1f302208f0d4a5032a630a728af43dea94ac7e241bbb42d5beb2f0cca3cff8557fe1ee61064cab2a022b4af16cb3278a31e66e89c96a9edf03f2dbe697b5ea3d1e579f92889b6cec91032ffd26a47c3b1a07ec510680e77485a41518a62e91e665a88417c8562a63978d0314ded6c7d7f59fb6199a269e32f5e2bf42b499e737b4408d9eeb59697ea2bc390224b2dc1a2310bf2bcfa9e0a47d2a3e3db1b697ee44d30536bb44b6aaddb510243d54bb0d0f8e9d104d43148308be6669f72d8758f285bb8f01a13baa0992001b77bb5baa991fb15c2d5ed848b728d17ed60f554831049d649cb2e1b6d7d0a6e2f2e71aee47bf317f1e0397d0680e77741a219030b08da08df36953f164d087d78ffb5ea5ec7b93ef6f4d79823a3f58eb06d13d288e68c08acc6298990447559b223cf4142351e6274cc4abcb331fcfc24afdbe4a33638c4ec957a1c021a7295499d2fbd0860faf0f98986310b2bb857baad2f1c9ab69d5ad4f7a3d71b3bd9fc49a7761ba6e1faf23eb3c95ef83a072cbbcf96b0e50f24879b0d106bbfc91b2f188fe547204fa32f631d5be1b1e080123801fffc4106c571afa2ad7639b2f59d1c2de8b9a2911c007aefbabd9773e4158a4bbd77d1a24c69d3c8c9d44ec30d82794d9d2f2acbf527c0f20b54a0cf321cdee518995521e7a7cc2d9d373bc453c2f3be3f7793b941fbdaf0eaaa5aff96d8239ed1e20242a070b2bd1f290c2a5f853831d0b0b344b42b6fa05052988a7deb0eda52edc1ea288290dc05cfb50b4d9dcd7cc9682c3b9e74706ed3e016aea80564cdfbb707a76a5cc629a826e299af611e866cfba066db8762f3b52c58ce041610e4bef5b9a4a2b015d57c170742928407a0fb01211568e51c77fa3c12341c79114f6cf784e223d1005a5e2666909995029db468c9b81411ce547643fc93223f9ab4aa215f3500ba18d6d2ac561af9907e66d2097d7025055d64638fb166d9e55f3f57dbea96615989404b447c5dba4b704d3a4852cd905aa4125d6de12ab30089084887d4a78715c97204a86e31565dbab123dd5a15dd76ad22b7c73fde992da504a32a25852de3668b507a4a8b30364de227d8bb6f38a57f896b439dddd855eb1c89aacc6111281ce8ead5cd9099407a8c401b97dc13d91e5049f7ac29f50935338dda3df66ecfe06ee362f0fde8920cf39775f008b68b9301d605c35a11fd26f0114acc7f2c2cb74a76d4eca019a30cc4a4c8e3871fbff4a7f009924b8192576f87187eb7a302fd549ad077141f064a7a67f4812af4b1920e97e3df279104970592b5f7f2fc746f92dc8d1e01294a77e254f54b41545a7dc1c690669291e58667438a26060f5921823af7eb2dc9d35e2006d4ba202e2884ad439dcade7ea96d6d7ce06bf84d1d821d214635c023c2eea44520c74c06788a3b0b0a1acc9189ab9f6a8940afb1a3bf71bfe452e5a3161e3377a56a61113a24396cf410dfef16eb220e5f0a84b0cc5531d5155723c39f931f8fc82f05087fb6e5cfce2ecb709779619612a465853415c22b1a2ff07c0d08ccaa9eb2e9a371cc8ee4726331d2c744846ac535f2af7a526d9e8178743ce4f730ee9ee5a55e7fd381a58b44b78fd70f3f6dfac3da4523bf271844bd0fcf40497ebd23c91303a6f0717682361e844a05426d04443066c5c0e1696e1c73d63c56b2e5e0ab51ed1eb8598f72b477760f2564fb64ffd05696fac0acca72eb1a6d9a9f2cf3b7d54530fb6a651582b1fc0e2b474f3de7579e914293187e93f1045e22ce609d1e84afb535f50240ae71ec6741f7c88b536e1fa0af794cdd2145d23bf752cd12173362519e1a4c7f10011d67d2c4b83146e4f770b5207b7cd4f7e65b3bd8f3b608fd112a81a544c63a3cce146f0acff46551b54b27ce9d947a5c68d5d6dd0e20d17291325971f831093b2cc2a7f185e541ce8770a2c72bd689c62fb17e1a842ba5d655eda51a418aa181d6b3b37390e49678f1cf2a60a9050d0f1a7c3335d623bdb565310855e27201f43b1ac8829e7b06f704455cc7186bec1d5f4e06166336e5145fae4026e796cce9adcc9ee0d", "ac52636a", 2, 780349869, "deacf13c09dd487d97325f96db572b4d82904761147342a01c968f37d3c436e6"], - ["75c726d0022d14c59e3e668f2d75fb43bea5e125ac0cc3f436875a610fdb76b67b444c8218030000000500ac52ab63ffffffff61211151ea9e8839249471b25e25584f92de7963c5ace95bad7769a60838f71400000000030052acffffffff0429084d000000000004abab51656eed95000000000004acac6363c61b1a030000000002510041752d000000000004ac65006a00000000", "6353ac5252655365", 1, -1425864140, "9a0ee10c0eaf545b8da697765107986408ef9bcaded9ceb4e91ceea0d9c788bd"], - ["bacbc0b703de80d482c996a1cea6b9e85798da6e6879f0b7571102a82dd62173e13ce5b98c0200000000ffffffffcffe4a9f7d16f8dfe44aad3742c758c1fe8c0a6678e572b15a302408e6613d1e0100000000a2389cb4ee1931b5d4a868e47d4159fbdb379793cf58c4bd5d5ef50dbe3303aa8ceb52170000000002ab630fb922c10131284d0300000000035200ab00000000", "0052", 0, 1194006058, "3edc8e198076c84cf47c0dfd91bcc54ce75b425b3e6976d0b77ca32626840515"], - ["9748908903633a6c318997ac5fc0fbeadbba8c9883917a1d319483e32d3cf68a858f314e890100000003ab6365c92299044f6fec74a4b0409fa962d46e7110d1a3d70522076a7e48b5ca10ad6060d7cbf30300000002526afcfa059b3dac2df5b604f55b34b78f759ab467804a63463cd38b0eaf0cd7e949bae4176f010000000152ffffffff02cefa36000000000004ac6352516c976c0000000000046a52ac536d03ec27", "530051650063", 1, 1537933915, "80ff07ee25278f799946a9e4ca9b37b56bf3bc6d1b0222d9577197be4a3b64a7"], - ["05d98db603efefa517ff7d7a62164b194d6b00c5000cf079c8628d062428067d261a0f5ef60100000003656353ffffffff0c191f75ce8b3c961fc5a08592ef3bb7d68069aa1bde0a938ac96daa08f653cb010000000153be739905d56299f3c5084d37470ea0b9cf7d3808e754055ba28e5bc50907fdb51cb039d6020000000463655251a685233302a8553e050000000000014d6d050000000005006aababac00000000", "6aac6351656a6551", 2, -1084709125, "342d2432d08176182f60e15da6ffc903b137c7865c2b4dd4fdda3feb71bbd7d1"], - ["f06e13d801f99431fdddbaa1441166509e4138d9648811a9500eda786a98956a60107fcfda00000000085253005200ac53ab6613c5e6029baf9305000000000653acac53ab000c61690300000000056aab52636500000000", "525251ac", 0, -1508217707, "0471c81be230bbb98d78b497a0183803abe3d4c0fc0980667ca5e3d4bad20b46"], - ["af037f1902505a2a4a167973ab96d03b0ae562341a44d8cb641c92137ad353fe0002ad889e010000000552ab51006a91b7b3ecc6eb1d06f172ed9ee369c9de5ec312de5362edc8e9ccf517b416be6379ac34450200000003ab63512c3079ea02b590c90200000000096363636a65656aab52ce893d050000000002635376ee421200", "6565ac655263", 1, 1248727546, "330c54361d2d14326ea9c612baa1f9e6fecded397db2d59f20b95aee553290e2"], - ["bbb49e5d03f982e0fa32f4946e60f3db377a941a1ac45c1571429ca56966576bbd353ad5f10000000000ffffffffd32a7f0792039d9388b52258b73dc16c60c93aa4572753c9df240c36c31e9fb90100000003536365fe94c1e30619e25edf91a15b38ae733828b5ca3bc2778e0c96aa3010378a2464e0d6b4b200000000085300656a006a00acffffffff01e262d10000000000096a5165ab53ac6a51534097521800", "", 1, 1410944772, "c6d9687fbbf41cf2e946adb7d8bc1673a3a960956767733a300d1a992ad8bf68"], - ["cf2e43570299f19a5f9bce98cc2cc77a22bbfff6de5353a3fb8b1284ca8e7e066a31fb44f603000000036a656aa183a698d97013c0354399a2120b8dffdf8acafb48fad94a5afaaa2f51ceacad4eee5ba503000000050051656300ffffffff03d8c751020000000005ab5200ac51edc16f03000000000852636a6aabac00634b7239020000000003526552000000000300000000000000000d93b00300000000675a46a063fbe7544f1440889554deaa0ed281ed0ef61f5f35d256d8b3f78201e308a8873e7f92704076106222cb9a00f78c0d0571f6871b29b1b8cd82718ac5bb21c2a464c1f7f1d630e7aff94e4ad401156e8fe92229d45d3e91be046b97f100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000867bbd8d18980d2c7b7355b3a2f1b8ced57e25930aa11f58a3ab22d23df67b72789d13c9adbc4cd1673cd3cef15827060b3e3e173f98490a37c9384227c9ef9dd6c85ce0bea343f770dd013f279e53213221a2f36b9b1fa6709fdbe8a1707a74db4b526841d4f80f99cf9e97e35bb39356a88009d76f9af8809a2eb53ac41cbd0211706f7b5055a835c05f1f3ac8459249b0573d924fd1e0737bfa74e43ce5d1140321c70e88953501ff726c3f146a16c059b27698d951ecf5d827ae0980e0ea4d650b130ed349fa668d7852a983873358b7cab179a6e58d3348bcc445bd383ba29e092adfcef314439edb2c36706327afac821414c83b362cdadc85cf94785efe73a403279f9fdc6111c07921915698ce2061fad8e57893f098720e13ff00c5307532530202e67759d79c48ffdac5d5469f2c70bed60fc60c6f800d043c52d3bb3741427c022f7c44f1db0735a50cc17b6ba48bd81906982101c63a1830b182de56e4eab24f0214fbd81875c41d42f3eea60768404a5f1d5e56dac6ccd1d74a6822b56f358ead03203d056fffb1fb3d44358d7ce9aca780eef910aca3632f34cdfc90cc9772594b6cae24bb497cdd0eeca0e808f352dca9ead313081dc9585a36c2de9f4dac064fd3dde45c38f4fadcbcffdd4be1b41b62c5c55ac0b31fdc1b91b320ff8efa2225f7512081085db81fca7213e154d290e5df0321acb44381d9a859706c803c8602c21226b444d5b22506a7c35797e047b1748051cff732c08376fbca00a28d5a145da7036c0176e68fa82a1114c1cbc0dc2aa4e30ba1686e27356549f1ffb3ff7b447f9cfe9921cf806a8f2ff74c12ca7b93778867b6276443d53233be63f8f3a086f55fb873b30f26236fb0932aa9e04480a66271481c8a21b14dfb7bc6d24311fbe86ce6c2e87a58d111bcc485a27a3a4502a175e4b205c1e1d18d290c8f5c5faeda087829a6ae5ad2a776a8fa130c7f1c307a2aae76f99d952b416ae6c4abfed1b8033fac463334c387b25ce3cd87b25e392fe372d0fbda81e79fe857006a50b6c27fd62ad707283e462c03ebf3aa1a322024da05a426dbccb1d667a09d0295bed7c97d51d235257bfbca068d8942cc3e5348d7da456f09c6513c329de8f5a18d869b0a823d358fe56e1e9078d2d4afd97bc3c624eafd4c8d5d4f934944087926855c00633acfcdb72fcd1640f53cd4f82a0e91154db834232ade875b013b465eef7cd88603477981e21e42ccf781aa1808c3ace2095bed821921a5e8bc53cf5fef1af297a7febd52fb735d2ea31b60bd17d9773160812067a500cb8f63d153a05e82563db858cdc12d6541b85f837aaf53a61c1035a81a789b79f810351c96518fff14f0c36e4268a179c2bac4dc562cc1af6fbc0c8378b836a2ddac5cf520853f65099ad461fc203cb791af896474e6b9a0c70f773d1d1bf4304c2e094b6d7c458ae7e1f6c3a11f3ef6b5563b50e7f946e27e96e1b72c4a888c8adad03f5c585e643af4526bd45f8be515a8d0b15c2bbd21eebab7d6093fea59722072acb44f0efa9faeeb91cf101431e2977112100a3e7376dbfe4fb9ec9a41a741400446cbd883a27168c1698ae5cda69400550d5b0bd6e0d78319c20c913c7931b9c2571e0ed8f58f47da06c3b8894f51abf1f4aef2d8e5849f1b36b31d41d499f35cfed7dbbdd5894d69cfa419312379533ea15165e2229cc72d47abee19f944ffb0cff4cd4044575b41dc1efadc165cf2c2165026b50d639f534897ef8ec253284bb3f9790c3ba344c1b35015f9f2937ca616b51c4f18a989d2e8462601c7e26436cca3d3096dbf78c27be5d46c384840bb413cef273c9d84bc87141577f20c4f9efcdec65787c42d8769383543b91c4d882e795870cec989218a80216def7679088cf93b6844f9081a59c2214fcd9b7f068401412f4c5197f664f87dd60087e214507c3c0141bcb33a2e384f8b17ee350a1df091251084da2828bdec7d222bc582f30e176bc9d8fc5e278ce1ab40eea9c67f1800ec801b96cc20816533e15bf09fffb0431ff50128be4a976c47770e99201a3f9c7ece6c1e2019244e0e47ad5f22e13b3a3319bf98308c7350c95c709ea0575c149616b99e1b0f03084bea4b6c62e739d3b3072fef0dc15adb417e0bee7ec628faf2eb898f707d77bc0f750886ae8b1b02dc5f7ad1a0868ed4205ad729c9246561759ad40f7b0e660fcb5ae5036aa055d2aa9b19d39c6aacf594a31067a588626a3866ba41a508d9b35450e3024e767ed642b9281162aa2915ea09041f4d75a12c000000000000000011e70c0200000000324af9b0dd417a75c282f4842f088858da64e6118d684457df61b2d6ee472916331ae2d112ce18a8c70925447f96e9635e38863c5a9dd4c6bafd23de33892df0a961bf30864d52b592dc3641ba4fbaa789763ad2ffcd416af18681aa0def830e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d85a6c20a91ad69fa700ac3ebf5e5189f8bbe11150255f9787d4d4f9a688ad3ddef84f7b8320e833b3116509e5e29c4e5aea58e79988e12c99263db4c6bc595c4fa8d39f9dfa269ad49428ba4beb22c9e2ee3207a8b5b017a43a8abb7db2e0fb5cbbf14a6808af7caec6e31385f706129e357602717ea76df9623831c95ab9e20226b9d1fabac38e29205324016392934e642ba2452ba6626fa6c05e9af4eef0a2020a2088d8f1a757b172da156a9996a4503fe0278643fb2aa94e5e0b54b062962c0b2e83eee8ad8a3dfa787077d989b5b72909e4a03d61ab977e03b32a25bc60bf0d282a797016717735ce5d8c553c7241b9d144fd5a9e08df145e8aed9d047d3b1c020862acd25d7cb7470ba6896b5e6a4dc76c884d13941ffd6c86cda3ded54bcb150328335fd2f1ed3c09b38861eec106c56450746dbaaa46caf2b481f2ee47d4dfa1022a382ce342a699f9d8779fd9bcac97fee0da808e63c3af3b0ff4437751fd85d803287de5b7fecf5e4d4dde722195b8577600cff028cf3346c00b634e1260301e6b022e7330ca21769eabea32e645647a5af2b001a2551eae3239b0538522791690651cbec157904a423482e875cddea2d9b65ac14c49117a0ee4f7fa8d896307c26bb0fbb033a38015b56128b1ffe211e7545f38b69a44c40c3abfc195f02bc2bebf732870ad7b0e1add15f54ecf15476b7c80d342ef46d56ee8f63d1de4fc1daeacc5e913e223734dfbbe22fda356c31e9156aae3abfbc54aaccd37303f88b187f5d46b726696532a6761c55e95ed3e970836e897fc74ed3987b147ea8cc9b70cc374fb68435af4f264136b74e24a2dc5c686aab13c5cfce7d93e2d5e37e4305ef0309feb8953faa7b81aee775c45d1f7a4c080e93f7ad7572e86d5d15bfc204cbaf14c1adbf9e1af5224200037d45e78aa33407f97978a23f28f68c071b2ce536436204b0509690b158e6241d28a4b0c4091b48aa24694d3244d9ee40c9bd35e985b57aa1e684913e178a21b8ec56597c0e16c198395b95bb403226d77a815aa7a5c1ea003172c8b0e6c2dbbcf66de811e8570cd7a129e0789b65f7a671266f0b0eecb671363b13bfd9d9e2591dc76c3c0118cf129193796d17c11ba9c9aeb2043ec04b95b6beca0fbbb86ea587aced5d468c98a94de7cb7cefc16672cf12dd90b6e84941e436ed6b637b1a23f20939de03b0f6de22c5553dc72395d6f2234e487ab27d52a1b7c075534de2516ed25620e8b2792390b085eb17234367cad341a9869f61a75d32951244527d236f82d86709582919070afe462ff5bdfb4c9bd5259f6dbb0f8ffd6edbfb89351e9febc3f1a711a259fd28895962112804f18d81cef06f2ca1e81aae9b26238bb0866e8ba309a3465eb703808f8d8c855236fbfb18fbc236b68fd4e95cd752d16a8f953747c139eb7d798721f7018ef162e913f04eef807436cbcafe924ffd56ac2a61060a8fd60e902b6e27b62c3179f8f2818e3639bc91fd72ad0df1d08cf177fd598259ef6ab9216655e8f275e5c5b5a53930652f9039f7b357d162c4a8e2d6788e61d724bd234040cbe0054572b5564a4ce6e2e422123195b1207a5956f05a75bdd97a33941e4776bd1b964e5cf4c316b6375dd4db8d84499fe7a0c99420665bdb9571a263500224bc9e539e51bdea62e50a281951eaaf079721aad28ac579a6d6a7a6f00dbf97377596a776baa8cd6c742ce84df90859a88b250fa856b45ea898ca1934e9cc760c06650097786ba41940f1e383f27fd71aba0598d9fcc8ec35bbbe568fe80d9da93d348e8607286bba627d2b688ed39b825fa56479c9ef77e819ed60dd2f25085b5f1318f6293c3a683ed707966012a3443499edae329fc822cd9c8ca82e34788a6770434648e064900616ae00498da624c1bde12df7289de144692129f98292b6fb969a9f66da08067c0dcb46ee3a9bfd03244670f1c7ef1449f0d95de2daa44f98abe1f4fed43a3e02faf0b72ffdb9cd4e715f16822323914eb3958425266307cfc07f4c3def01426a22a46d5c47b288f81fb869353a4482e9893d8e1ca3fcc030c99dfbfe5395e8cf76ec691da81997c8c3712eaf0f217d7f2ea7d13957b78e56172f35c31c68253b7f4334e6a1ed2d699fd85eb78658f763237c2d8dae438dffb0ccde2a0fe4bde01b24551d7ff554ea46398701ff79829841a8276bf32e9d043dc18be3855be9403ca84a0ce7a51b851dd223893c87e0f306e51e29d9830f04a45873ddbd564261a907e0b4713afe836838adc62b5af8cf6193e7cae000000000000000051a3670200000000dd07a8becf8409c69d13cab022c4475e96650c7f33f08c56f609a0fd3d8f2840200913aa1cc8b09ded932194780f3576109da2360df1e8c3e0c2a35245ec2e7da25c6c2341dc833a62de4bc7c4a488c4e427a734467ac92f45047868278be5700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000032f06286b9d226a7be816cbbdffdf16a105147aa89846c0df1963807956795ad370963eabc9ce5a923369ee15ba3e2fb74c0d9f465aaf20b61b419ef94a4b7029fe070984610ae58ae94f400c7389ada940c465a393049d5b1539949c8aef2201c451a3c5e417683d64ecbf67db9d8d1f7ee584acee730d998bfff2d0583072e022b343f4023b19e7dc41b444b2577fd1173a2895f03d368229fd8d8f1ba5824120315995e666f162af804799310f9ddf44b5b8af7be8b8fc4ae2496a4ff82912bd60a0360caed942992b91eb7495a94154fd738f60eea3f54cf7b87557d1b61d64d9a1390472617f16852600b7c92a17553602e31e369fd380099cc4514770af7d1210222795ca6d362151f1fe088abdc7ccb56f96c40811079aaaa221c34bf4c8a95d5031e282d2986ffd33e76638747cfc90e70217a2247ed18970a5df5dfda2a69f77102197f3669036b83105aa076b5d8362a0fd2e642f90334b57277bdaa29c688964903256cdf0bf90e386e2b6cc49d8f1c40f9a340994ef763522a60c127a3780eb5ec03215a33033edf8b89d83e6cc3c667a385f65e705932f7f47ee8c7364fa9bc6f1714a0da5ec7920dad2b3b53c7b425526cc0d4a95c58c5eb884b772c9fad1532ceddd203676cb12e2b2f2c5974411920a722f83e2731d40daaf5d19a326ecc09538503a673e5f40d0b4f10b1e98971ca485590315f7909f3dd0b184d5c2e6488a1a6ba384c72b1f9bf17341da50b434803554e6424c67d2daa0255e79dece7d7d173373338b3e2a6822f3d59735949c50da2108c6cad36d4bc16030bb59c5c57bca36fefc0fb274e9952d4519db01c76199700b622784f59c27f46dbca4c5df6882c0b67ff585b9f4f06ea1b299d9e709989472763ee1bfea63f5aec800653fe3eb035ef16a0450edf9ce3246818865ddf3b509d9d661d912cf2f8a5b0c475dd2f29b1441d3e31653c624980f9b1fd6b653ea2fea597e69bc93b676260292d45e0df8713455dbeabe33e7da5159003602c434ca4f078fce9ba0304631d7a53570f27c6881e5b3746e939b280688eb5640abc822a69a20a94683162a0416267398269fdb806941af28803110f432a7f49506e647bc8756d8a97925845073ffe619837fc5a57b036db326f77a4e2b5882c42d69f16dc68a0cd3f0ce0fb952b4951e771fdcd595b09d248b4969296f821d57a99882a3c9115a4911c7312fbfc4f50928de4689ce7e5dd2d54e6917ccabb68f28e2fc0700157e20c8062e3182503a6bc9fe9e3eb5281e1ecb92313ccca95f5ae2ce077d8bc45bb1a35b2f629aecb104cf666a7cce59b8f5315e3986f2ba50d650bacf9001315dd357215c6caf0212a331b058e6acfb7bc392339006fe0a7ddc4c54200acd784fa9d208afcd614c5c62f668e717d7f36d907f7bcbea0245a19d45c8b8b17706e95e9d9aed227cfe58ff5be56f66fd52353eca571d318aaa416cc6348d8b416927dbd81c025e13f8a3ea4a776d1319f02eb848d57f9d3e96b77077b7cfe2d25e01651240068efa05aa7390795f942347f5bfc6d9aa575e6d5701b6b750517544adda94f54b92ce0c4a7638fa614fda153871004119c5439947b9206d8d4a0ef99360d9be75976ac4a9ba3d82792c6732d108efdc1c1d16198b210b45fd17e9afae48c216f6ebefc74791826c7d8bfa9fdc28b1004bdf77b1b86890fa9699468d17be030a7f7d14328f014424feabe18a4e469754e68a460b291e34f770fec2c3d86e96b93f5b7ba008327bc7c05c08e300a89c59051fb8fb121694ec846bc82dcc3bb8a86ce4b7080bcc3f9caf5854ed4249ada4ae2d4fb5c9f4185ca5e31ecf9779ecfa03f11eb6322e0e29d1bbd31026cd82ef3df7776c93d728e244248da4a12b6c088e7eba17b1b521d4213bde8655b2da5e781c865aac05a954afa1a05f49423b4a2d24fdb67f386ed23b7622bf9d2f56c9e386a9847a214a4a916492d1ab28eed1d2cfef658d22bd0efe50f6c1c7c475ad5aaeeb4c05710e5d994599fde659b7f92588daacf6d85acb3a4b9b77f33fccf529254f616a61354d1f3e51d58c738e7b87b975695f7c99fb2ed5d64cdef93e36ca5b48619695af4e7a1cc15b32c7d3478681ae8c35a0ba6f97dcaaca7c4b0c9439bdd8dda451e19a6d2f4706c00a0f1627415f3457bd8736915851f5e9758dc7867e6fec3617fd975909f20240ee3157f0ee942acdbb4dea1988f451aa2788f2c3900b1a92b5e329b838b44d0ed1b9d4376c5606f4117431e95a5cc1fffe0751089fa6f996e197002483a0bc6fc92a88afd10378066b7ced791d988e65eb324a9094aa3972220752bd98aa04b2641a8736f3ba451401f71dd2fd5d2a99fd9cc5a40390bea686af8128cf74b9a8054e1d8cb2506cef56d3e6c0391e17478a3fd10a68954eebaa0490f", "5151536a516a516a", 0, -1779429524, "3880b0bcbc241503b202cd0d42aed05bb8f1f4104056c2be34a03f87144dd140"], - ["0670a5e0012633fcfd1f4504af54b52da9c924f3f663555306827a42c585663a37eb2dc4ae0100000001ab90d762e902909f4d0400000000036565aba1ff870000000000035365533ccbd562", "536aacac51", 0, -788489278, "593b582176d2f6dd7b89988b476830b2772644343481f5be706ac14eed4cab50"], - ["0bd7783c03b04476639ab5dfa8e6db347dd88c15783d239a15975a837060d21681b6bedddc0100000003acac00ffffffff02ced335acf28d22cec71035f9c445492b457cc0078a3e4384b1a764d5eacb300200000008ac65635363ab6552ffffffff23c8da0b98a77ddc4c44b673d39491235531dbd62c585778e34ae80140a40459010000000751656a516aac52ffffffff025f2e6e050000000003ababab3cb8a40100000000085153636353ac51ac000000000235330902000000000000000000000000176ee8dfe605a21f328deeeeba66111f5132dfd79099134594ac6f64b9ddc73c86cf470a003e0ac31e4743a33f7f4aa5ffa5a3d56372ae4b4354dbb7bb45c3ace523b12f0598dcfe12dc23febad51bec0555c3acf0e8f44ae526096c2f79fd1f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e4b580210e224f730e2592ae2cdf96bcc2d48f38a4ac9cc5a22db59eee47a82529867d859a391681388fa60e5ffc4a861515bc0df0cb410739db2a08c7a978cc8232f2a382be1215756af34dd3e740f79835617c5c41b986d7b13cf3665c05dcec504a2f56ef21f2a38fec50b29d5005c3acd35db519e186d10dd0f94fad82c02301167aa67f2d687d826e1a3a0c230fd7b42dca485f9e4355404bd0a02723f51022e1727caa7ad0c9efff7b94dd2ed1bd45c9ffbe3fdce9970761e56713df4cf7b0b1ebd4b15fe4205716932274f3e2e4ff95612eef415ed92cb3067a1ee46667db511bba9b253e736f2f105672ae7459dcaca6d04271e0e33a619da95081141011c022a40b48b8a4825223df59aff63da6a5521d51f924c70d126f136988c87ac396b021b005e70f6ec190456a0d9629139c42c719b3381547c7ac3891044c848b336d2031d17f4ab542c60c9e4211088d7173cf9effadf2c663eca3cae58eb9cfbc589ad03215f1005b780bf2f2cffb72fbff0b6ec5e75ebb9e54ccba8ff5eb4cf5c30bb20022a17d79768d5c4845112f895778549149cecde057f8da964cdfa82bbac1fbb9dc0cd905b65575008d1b4b5b8ca766a6a36ac077ac968d238fc950d7f38cbb4d0239de6dc2093dea3a2921589cbcd529781a8dc56bb6571bdb23e28f8a8e29aeac2c8b7380f20a8ee36b26585923fecb941a8fe3baaa0e83dcbead907ba214ee38df6cbc3d9cd1a394de733e229e54df0a1d4e74f1e2ffef9b01bff3e8762623175b63cd23c9e1c1b3af6dbebbb3a82c902f3e041333dd4ba7fdfd62a3983a84c430a895db4dda9cc8d28ccd9dc7a6e30f8d68cd1856771c6e21744cbee7b07bf96a8c049afadc2ff29173905b2433cee36f8aa6d480fa2f44302753de13bdb602fcece5210f3f16def20b9b357fbf50062a6dcedb99eb48ba6361caee8501d34055ac96162e35fb6e0dbc454bb7d18968205f24028510d25060c6f314dd0668f574dc60c54d5640930478e8f91775af5e8499b6a8a13ba73cb0e5a3d437a7e630c00dfbefd8421f9d05d38474b18b9883f0372133270c38c9bac9a0def8266c04acb6ddb94b629299f04df61aa48d119a91fb16692b21ef3b0bd22f041a133e394800b601530aa76d8f4d8b552ac307ee666b1b5f8637942cce9f3dbc3b50a0118a58667de98c69f9ebb46015588cbca533b6110b80bc09a7e9afb2b8dc055aa11a903e88bb3c4aa563c513a5a51991423c7e0a25d624f16f022d7e5f244d995a5d4abc2948761c4dbb0dff4f55f37b07c9714db365b73e960728aeff92d053bfa15933d08c7ebe19d70c4e9021eac15a3f726acbeaaf57bc05c04b60c1c01938d8d422681b90d1bf5a9c6de986ce2806749b4eb830af4f859b7934d886355b3cdbe8d8606a6471813f2dfe70358c173d687e009539a47bfccfbdc072f8255176c5aacd962fd9d75e1808b0420d6c9ec854c06fc9ddf5811d2ec726d43fb10db9ce9f7373db22da536734dc79a0107ce257d182ae2a153895ed23b4f1cf064f07738fd1e35f59c549d156dae80fab2cddee21b41dce2aefb7fc1048578a8b9e04a196b26082e199f541a23bb1085c0dbfdc873181e3581e1eb2f690505a68b81cfbef179eba48d3aff836c34a2405375ae66de3e02e4cbe5facfd6d87322bf3146aef3632531915b677f812bc0a795bf9c9c2df1577c2f7980322bee8637a5dff7ae3c4a6258c4da8139859e731ab29510109f7ab4da010f5524e75c7959dd4f979468c5686df482da95c7825ec493e4e6c45758ce8d27a68cf9b15e43f132d60a5c85008699241895d2124001cd183daab1d45a3a1e430e000edfb4bd228781b8806c43dd0744576af86f11902596ac0fff62677214de26d86d0db3ca0efa98d90150e4ac5b73f4e5dd38433105954928c746367b2eb2acd13b86b40b37da8fe7a3d5d3453caa02aa375215877d2335a372c2099e3e4d156803bf911a1ea0f96f43683a919fa259206fa0c4ef15d95f10653c246e97711d5c19b860d5efcfef52de00f99b93adf55bc5e79bb428f5a71d3f929ad87df5e208769fde1f563a4cdcb95f4bacdbd37ad9e2d541ab810cb995c166a5ebbeca41297ed20fae37be2a6ac4071edddd4f1913cf30567c11389a39db2d165e605acae683d02b6a167f8ede0d956b6d3d5c007d9961a8031064f85c09c9d884473c5a4068eebf6c779bbce1f2cf14d8071bcbb9fc809a6515a6cbc4feeaab6dab8ace9725cef8c59d1bcc4d9b8b7b6aa38ce9ff45455a0ee402e39b02af57b202000000000000000000000000ba2cb3a465a7aa4a90514f49d5b5cf6595916892ffd20f00f2794e32652cc29677a2cce8eba14eda52662c2eb44a78d48fcc614e718ecb658658f2b36bbfddc7206b5e057ac1b3db4e4dcbf7d098a6b65d569bd9aa2a7a82d1f0b1f081da9866000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d970ed89a88f42ab0f71924ace1c755f35c7c288e728df9bd0429b0fdb73f8c46be8af6c0323f07a2ce0f7d505b51bfcc6969d66a9b11d9c4432d470aeb8445568088646d0e0fcbc8468f6f9066e96af76cc9f2683870249a6c6b8f3f1449d2c10c399d579b3d02e092af5990de82d5e6178e6e0638a5136189802e7043a4df02156ce2c279b9261927e61aee7f9575f394f9dd83e249f75d9b798f9c82e622d00327dcb5666923d2adbb4e681d8d786b0ab2bff0419b4142f4af3f24813f4564930b14dcc952aacec67843a9cad5fab8acd826464448e709af1316a13210c89a02df07e73c82d34f3dcab19fcfb0b23e62863acb6d90ce209ecbac50984f3d17e5990311260bd8b30aac83b7aed100cd271c84469c2ce6d4a7d49bfd8df19e9d6e67cb030748f54d13e6b1805652044a9e7d7cd92d61340c31dc80b95485168533077937031244b9e0242fb1ab302f0d87e33cad787af0556c34a91c6035de727d937b52f8022562ae3e15ace447fe03a0caf2ba8a9965642c69ff4860c841c4beb946f7f8710203f6f788bd0b60ae284d296c12e9dd6591dd7d739e44b371d9fd381b1283f6b1e5c1b32e74a782b82e4fc8f83280ea0c2e0de1073e31d5a0d3e6660742e931a65ae03f6b13a73ab02b25e3f141a6bdf644e3b59c527c64a515f4b39cb0119b3901a06c95d084cffc37c7c8e4363bef53411a31023eb9660afdf1eb0c3b22f6a17e08241f0f183aeef0013466834622dda84ea69fdbedde614ed516b54b96bdc7243264f6a96ff1b661dc4bd19b5c8c028571c27948edacf9b871d6f706017d80a122b39ec21ffd30e096fc3fa25f9894b36cbf068236504df17de9480eb3b0c3bee14b8578913a32ad04aece6b718d44be483aa6a62a83c4cbea4a65bfcf5e99d282e637683d1e2ee16663d13fcb976e8fb84ee63a1a52b6a35abb0feeee73dd9bbe9423afdd8a50d1d41fda8099e8c3c0adfdcb4eb65098919814acba2b365cbb311bc76d1c0f73b3c874d835981785968a3c594b66a6aa65920860d35b58257b951a392341b8e3f39112b954efc771fd36bebceeb78bd2874bb6dcc0bd53c735f40372dc8cdfe9da1b25ba19e80804a2733e1a5f925e4f16a08971ebc49e59f10d0056cf80c4db848cd122cd3768dca2f1c7c2ed5e71d5e19669823b87655a3baf0775e26057dd0fe0bfc7474b9be1a903432667a232bae233816cba6ebc59957b21e950866f8a0046af0a80ab6cb409353fd17020dec284af879b0f7c92961db178046fc2609a749634101ca405dd67104125f2946a8dc20f95e94a8e2c6a9044a0d464c96baa022d921a09fcc4875389779df99ba3632ee19f43a4d742d71d61096238c765d6945c7c92fee13e5962ad237a2a865c76e75ac45b07ec69d329dfc14bdf7705dddd0cfe3e38313ab0f2ac3f442a486a16ea620f6d8dfc7a3f79eef58c3c9c92f73d373f66cc73a5e32e3a4c5c0e93672515814d49225c0d633b7bf4676fbe5ad4e0ad03b836202c72874a5689dff0e309f07adc84764923fe0c94c66bfe7a5e4745dd2880976084954adbd77ea2d74e4d565706974e6879912d926eb496758c48e063c8b2adc9a80ed19a4bb3342f28d24a419c271b2cedc189edf82fec762c81b8e5bfc7b2e60e1465907d8f5ac03b2b1b7c89cd4e5e09d291844650f4f076e359a0e2455043c55a9c69dbdd8ecec809d87a02db24a69f8f92a597e832b88f7dccc2a0cc6e293da334a95b095eb69ef7e36b4fbea14bce9f82ba7ea1cf0dfdd446d67c95623753e5267945493756794f0a5e31de64f10b816fa34a566ed00c94760d5ed0d5bd0b7926cafde75168ab5de79fe7f636b1cd2428f8208fdc7126ef847a641a90aba0ea420353141bccbdfc4bd81b68d2960e7355a98eb3710d20b02c811c25ea8794a5234062771067d9befa54b7d56219dd314cfd450a089fd177c65f29d000defa37e1c4a7445f0f8f6bcfc2ace9c30e888ddd2508ae874ef60616ad50a4072d0c70688475b349c0ba2e464360199f8d80de93044b3f2712df0e48fab0a7c67445ef6c79d29a05d4409f917227f9ecafc5aadab485d6a85e33ee32cd9a6e0ffd73ad27684dbfa70cee64bbf51823db60226685a195386e7f9bf4cb541044069cf9cd05c4dc44d92d67a72b20e1fbb1f61859c55bd39a7b910e0cc23b79fa130b6c19127e1f79d42e59753223c5877ee4f119f7664b6b54b1440a618317599cb8d8fa09596c5dea7ebc5632c761bcc6ef5a90e8481a3a2141a83bf91d5f4de2b7b29a3ab3705e1aefe0865cec6a2898846dea10387076de9e64c59ff0c80468b31f97feadfafd225f8f55e1091984a630921f55073fdf9df5cd0dddd99821f940fcbb463fa828e1d778aef847eca34057173707b6c6278eb2937d07c200fbbf3244477205", "5365", 2, 913450060, "0c7ed87fb8931ad02e034fc0979111cc78a75335d0d5e0153c4df9748bc3f968"], - ["da3638a90413686eb1f4dd31df8f4d2225f01029c646f8779992117f42873310e7ef588565030000000151a79f1f897636da0aa20218fcda838a702bd4de2172215cde2a01eca49d6f1123df6ec35d03000000025251ffffffff38b405904f5c2bdb86acb16753ad20cd7792e063f0ba08ddf245adc267a54e5c0000000003006551ffffffff25f70dfa535a49e951392a8eaf5064bf668ff3b61b3b87814c8be7e19866b02e010000000663ab635252ab88e00214026a3a53050000000002655380491f0500000000056aac65635200000000", "ac53", 2, -965840814, "3903fe7ab41fb776aa221292fd81356c8ba9194da7ac2b35e1646a3d6b15368e"], - ["f83654e803e8616df0af37c926ec61ded73042144376ad74c99400e4b4d51fff8465c91a040100000007520065005163001610171b8d74536c5fce3d434b8a6e1c03b4a7616dc07f384da8b32e25a56257ad53a6d302000000035363516681d9af59261dbffb5de78483841195300babe0b2e7eefec57065468a53050109716d0d0000000002ab6583687d7a02cc656d0100000000086a530065006a00ac17a14201000000000652526563655200000000", "5253", 0, 1461359083, "f590bd1372ed7bd754e67ed727123bf631c58a0bde0584952cc0b23bc107135b"], - ["128048330410257a1dee50a1448a7f9cee3b9530193495ffeabf8d5c97df4801c4a77078ac03000000025365f6d2e04eed8b37c750b44d7dddb9b16a25793b79496282b4cdb46165ea3223cc4152cc880100000000014293b08fbcb0818fdb47e559bf717856d868279f5e4685c16d327944960ee7c8aa43010100000009536a655351656351acabe7a51d22b437161b4d9a2f8d3b744517e54913cca556a418b2127318b71159592ba0f803000000025252c66c26cf03f848c704000000000265633529780000000000015140e6da020000000003000000000000000261e73e02000000000000000000000000aaad652e16901fa3a93dedeae86a531926369d0912fa66e895350c0c7f605e54e5c325cb8d92afc01bd5fe3ed90eb0f7b730bd6e66db5a96b6fe7c520c36be3f0e6d22c50c4470d92915e2982d01f58516bc2ec18113ce83491d50281a6329e6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c6600504f8979bca86213dbe04aad9d991c61a3ba35148b09e0924eef49b2af47079ca0f7ba54f2aff6d125e921010122cf28aa0a84f983f26ad2a76ea7cdb363d337708925b26674546c323b952e1cc83992e594290aed5ec29ab8cb0c1fcbd864836bbf03b1ec3bbfad0073d5a0ef3f2096e1ddc861ea5a2ea298a8e6f4510317b11c7c1c2396b7fe440ce097002d5e6bfb204d0335e4264ed98fd499c2b2fa030c74d85df4b64fad5a13bee801910d245ef1dbbd201e4cb16fb9abbe22f785330b1ddb5e031b03c9253b19df7b221265648d19d02bcd97ff76a5f3b89977278592222d8be40656b2bc91a2d4cec14afc5a92eff440f087c31c06790cd7bef2f500031bdcd901340aa3d9791903f5b0c05cf6c1f14f3bc1282bc2b046d44ddc7cb8320227f058e9a7907f44548849292db144dc48ef9fba493cc39ee87a5e9139c6c2520314dbc47ef6e9f1ed072b3edd255728cf9d83ff83b62973a82755d58b26cc83fd02236b5cc149043a454ed8faf2abaa70ab60cab5ed389237808687da29a40acd97020af8a7a145435543ee659bdd3492b813123c533f49e39285c2a3fcac9a135ef08b8f483de98b85a5d256251a3170bd7ddbad015a1daa16c1f99e36ba99edb321a407e0fe7695796854fee1bf526de981b6a13e1ca16ff6784f11de862a55427637588ddfaa297a2cb57dba5c23085f56213e42af11d77f7390385db95b84cf07e7fdd7270b3f3e120b5abacde6204782d4ad8583f6f7b5338e25a2541a25334cc501c75f036d52b0c526b9bdb63789f85dc5b06c95d712f5b62e63621fbffe3e5044fc0655e2483fed5792fca197d1730ef7dd1d2f69f62430ddd9e7c3edf2752d74494ccb3bcc7bcb567e506a52a146c6e3a41ef53449019ffca1c854dfd895c6a41e98575ce40a00f5692d987e090db20696b059093f83a6a77ae536d38a5bda7c3113e7a37767474a5b53a684a0632095d698a080a8582e5067761604ab5b8732452f03a3fb9f983c120b21f02bc18c473a4414142b8e143731606615097303fbcacc1892d62d1eef55a3cd10b4e4a037f6013f1849b7f827d2a4fd7c015fed38bf71c85c4048e5a67e990cf24670ef3386fb996d241d61cc9d0d2cc0b18f25b34a6cc2451fc63a2950316984a10b741584fd7f0a4d94fbd8823e32d2a4c933574b5737d3949c83ecbb08dca1e4515a4df57d0b13ad37b640b9a0844c4d74b679822b2141ac9316387db0b5c1f81a7417e2b0522cabcb6d58f6ff0d7ba92cd58c76ec31b5f20d6bd3b04eca54b4e5541fcb566bde99ab42032da3875f42d7caebccb6c6b3cfae34c83c0856b7bffa5fe4c9b81658e2ab8d3cfbe741732df36931ea5b549a748913f61706edd506505e7e7e8277f6d9d519a5971b5c57d04912baf0331616bbb3dc3d7d270da6af69cd0959f16dfb1c78e7c8b17162653f2d07b572622cf445ae4626fea35125c89a0b1a2c4b59f8b43b62896ca0d7439b66d963f2af4eb3fd17c4bfd6cc0eab1b2ff7702446efbb9fafa19e3e5ad3a09be7210aeacfc0c6a819e4e0ee50a1b83f0f5204b316f09e869a6f76f76e17b772f8248e18f00320a560823300352426ce1d0eb94e168b3e348d71494f8c043e4288167f782785b902337ea5b47c8acccee9dd06ab295389d7907c5e17d995ac586abdd7a1aec1bd520afb793c9cf9dd297f96f72d46ba0117a6e0414440d80b6aea61d56c2a67d2c64f3b9071b89ff563cd2fdd08c5b484246ac31194e6618590c695ef7e47eca5ae1cbfeffc7ef57b32c6341a8da0839a90e5b75640ffcaba5d79570be3fa787ae782bf3bf832b03569b387ab861d693caf975bd6930558fb0334dd03e36fb63ec37d7a227878bfc792a74b8afce5e95d14262e35950252ef1d208ff5d57d96411e70c8b31111760839bfd499ea1db6dda42f2a02f953eb087b3b09550fb4a8dc3cd9e5353c8f80b8211e3cf38c4de2fa40bb4fbb6c153efeea7fdb64f521c49aa5687178dfc10b84e7c685fef3e2fc171a81546ed2f3a802fedbf5d2576c261363d0b3d0c8d797cb1cc9a975e1e3da14e17bb22e428cbfb3d5cd13dd8464e3b45d4a3220f40fcb4308bacffc8363c01023d558919f39b6ab1d4e8ef312a4ac863cd34165e8b9e3ff7a10b88e5481d434d31eab8b850b70069668ab60374dc40061ea20f8ec527152ecc821379ef8e178f0d37587ccc3b35388f40f7b6cae92576ec95b61ed7f28ca4c91a29226e17650373096e045ac49c2260fc42615be56b09859f306fbfb8f03c7f68068260a2a0000000000000000000000000033342ab98e1498eac22861dec9ebe951fe940909120d55771dd2f430e8da596dff22ee9316a4d178b3500b021a220debcdcda5d24167a0ed048714eb0c93d224854850cebf378367b7ee70a968cb9296ae5f887f85ea0c085caaedc76866907d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004b35e0eacd77a0d29c5d4c2d77284a770ff5f2467e798db0f8c67de40af40a7c59076eef715bb9eee0239eaa69818687d60d37ad3beaadced45403b692fe1e5fbe9460fa1c01cbdfba3237df03daed07968bf0e25a514b421598dee6d2535d4614981475191bcc582cd22e561054fc79ef430cd53c9c3f53d84c90e29df9c30032c6e310875b9f81c022fe855effed2a5512345ab99f4f9d8f6bd7e6fe6744dae0318c5bbfdc5624dc5d1431ab50f20e11b09051e590bb69964a1bf02b76f1b3a6a0a1904133eb832c5331ae117affd148ee33fdcb64833aff3a9afb46b18e32dbf1e1ffb542f8b8367a71721748ed1e2a9df1b7811c7d051873fa5c55bfd9901bb62032ee87438277c87dedf616970fbffbbf3fd2853df01a2a5f516e89e8741bd03af0209618b37289f766d0ad2d0cfa0514c0100967c3c672357840f090ea97e0de169022fc94aad774f17d283751256885087ec5a8b78013dce47416ed2b1d0296c335802189e37d590d213c5c75e646567d4c0cf8b81a8634523b1c3c84e71c3bb976d56020898fdbc2389e86e9d473ae87212a5745e0e47d123c51801b8279aa7eda5f7c3c1ea5a54d2067e4a55a19aff0aab0e8ed5a1645856d99456d896b571228b7ec48acae86e476b3a433b38210f3ddc09f3b0bd6351b9b7931d70d69202607a7a9127cac42647630138b7eda26e222835385d8920b984099fc44c70c57f876ede84b84662eef908558dfa960a8595db3e6d429288ab5925b99bb2dfe697beed2569a6a68b12453e554780c49d657e2a95e560869fe2ec5b522f0dfdccd68608fa8524c5009e6c524c89e94dd708809758c57ee2a753d12db1d53c76ecdbcdc39a7fad14f579610064d542e1ef64c7b7f4c54990d25e73f0b22c46afd2661b98f20d84f9c0e04d523ab23f47f4dcb9f4d25a11d109ff0b3f8cc5063f0680cbaeb223e2a6bcb0794d0d8e580158598d4df1cf143030fc0906295fab1a839f0b332e4665c548034dec99d3ea27ba98c0ce78c73d46bda0e4784c8bf1a5dec3dc0f9fce7f8e0ecc4b42fb476ca95bb79d9f2d4c593742ae34b8ea649bfa6d9c361aa32a6047eb46d4731d099ce6b343d4d3321791cd73b53b5d66d1a30c47c7eef7e0c1b4a8d5f8e02e9724f258a991176f0960fb1517028fbd3274877b70764d3c1757752dd047287f5cfb14c46cf07bb58adb3385f2ba5aed4f009aa03ae329d0bb801d1be6d03aada73b69ac20a175f813df7be043d6c7a59b8aa9f7b1fc29105ba8e7ebfc1547d7ac405a14f4d74749ef901a50efe1998895fa5e1e30ada16fe0427126b3b2531c5b1689a6df2064134b529edb780a570daa82fad042a7aee32f1870482dd542949e7df0978361198bb8a46b98a136e495834cf01144a7ae496a6541e47e79cfe02d98e8375b9707665cc7271274738591f0dab3b0834e562ef5b3ddb4c433fa7c6b3f05b06255b76a53f16735a781923579bac738ff3f51cdc4141dae22c093e0114aa69e37a235b632e144a4eca614b90e958201bc74d3df5f2eaf934d0bf09749b31b9ef3204d15ec8f8f1e9b11523277f68a4bd17fb9cae8f0ae659bd93a5708e84e0e417f19ed8721d4341940334e1d28c0030ec78add0ca9fec279894a3cfd3cafe3e62e4e3407adbaf07ad6cdd3420cc753ccdfdc05db9ea5692509e9a5cf804fd37f38f1a3f248cfc74979ee4671d659dc98473f329c32005d41861f11a949115ed83fedbea48be1ba50e1e5a330328f75ff738401158429340d6d750989b5a9f92e1cdebec236d2f54465482fc8c1c9e66a3efd53e41a34c8d4cc97ae6da13ad9d18d491adf231c7a09a1b6c6e5534075af8ed4605082ce5d167a314ef7d3351025ba400e074343313c2b63c0f4f0274fe2b344bc9b73a1b36472df190dd12e5dc7cfa6996c83fda388956269134698c02f0377b67cdc39c1b001759db968c590892023e3af969e896ac692425205a94c4499b451702a9a8d8743417cfab381a27a994da666eb0b29c739c2d93b3182e7568e04cacffb5ec168ca0ace6de66bc4ece2fd82783ace48c2abf94065fd49e218e113f27ecc86fdedf500dd8c722c1f10c1bb227003d50c04c3286d2a64432dc3230f3a57956cb7b45901fb33d785aade364cff2cc952cbdb4dda13ffd22d4073e4c733e2a1b3ecaf249a4e46a948c44d9dc89f382077603b097754ff03e237e8db5e4f49044f645268ef322c2ae0b2828fad701688b49a3173c6b33a4aee9d56e58afe2b7d597509c2101006fbdfb121386ec3da18c5c35a99165cd3911ccf365c5eb8b124ff37ec6b2fb7b5a18403fb32163f384dcd29825bea6bf093aefc5be3fd8e8e6bb8261ff0c4d5635e43c8c6e4939b9535de6c8efa74a9b1b409f7cf55b73e80e1dc81d42b32c070e44483678814792b7cab03", "51ac535352", 1, 1337258466, "8f21e9bdd1e74f426bea7890cbda23fd8d4050133e96c8d756513311527c5ab2"], - ["ebe33b240241c4711911f86dbdcfff42149a5fee383947a085a14ee30b11a8fa1bda88a40a00000000050051ab5163964755654c3e91cfe323df8b9713a5fbf706ce1c9733d284f25e9f92ce8c0f2ee8b6cb61010000000700635163ab6300ffffffff024b784c03000000000552515263001cb7650400000000008874683a02000000000000000030e6a402000000007a12d56d236224c43bd61a3a93c5372c2598dd34585272e45ce983cc6a7082717a75520de9a55b8a1ab9237bfa31694068a6b183749192fed5bc163964acdeac5b402656fdd986d237c932d241a3cb021a7befaed084d33bb39c5135cde1768d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c11058c36aa2c5e7e857d9b0c14e6da0c9a0c70ce472f9977e71089906240b3d1f1f9776b227c54d6870888cf3180a3ebcb228ed0bfddaa061c29d3b96581100420ee77b87a87f22312152c8a508946e1cf875cf03c11fc5ef66690a242031403c0463b03f4d764ac1d708a7ac650f77b393318c01bed1e43b6fa9966c1fceb20316ccb53c8b6eee54c3fad3542b8b086127e53fd31e51e8b75b49cced025d7ce80221a7be2840784c793e6631313d5843f20c752e7ea5db9a4cae1bd836c705bd290b0a35762284cc35986db70b5a80c9af34a86331d0d70ce3f2dde731c19ac7d28607b76a1878a52b012ff27b34cfeb266e18bcc6b37556298ee9d63eb94b62b6d6021021e4be741eeddf95f4b81c9fd6b5246cfe0c3f6e560b80dc17ca1ff7d90b9c0201d6a0309c4cc91f2d01d44fb486fdc85ba06ab73b299a1cd7bedaafbfa7b18003241804e2a39929b51cf13928fd625edd05db2be3f7897fa587253e67b21164960309e4c152b735b5f003fbdce49c23404ee7823ce995ecb3aac267b1d4a0918a1a03063771bab43e4829c7f42b54aba1087ce6ececf64ffe110d707d9448000d49f7f1feeabd5da6f373af2b31c6b4503b3f06c93462471976423dea86f74172272d24a271420e6d9e14a8260afcc3b6a477425c6dec27aca0ae801f57eae65d3f1353d2667dc860d02a016bfc1e564d9bdacc0d396ef651f9ee6c415bc3193e43261d00e4a87aed37448218a60355cc8c547e5b3973016ddfb7067960a7dfe156cd5f43f1d3b7fe002de8d272bd497721edcabd1cac671b1c095f3cda4aeb2013c0c914f0a5fb99afda0fb5ceadb82181806f506e674d88a872be88c77e2849d7a7a7e141004a5268ae14d3ae2b1b8a163e13df02f151ff211ff2ca723970631e5f9001a6aca5a98d0ff06f2a325319f6b9b648fd91a79cc0a785443632ce87889d16b05ce670c695e740daec591b044a677843d05a141cebf0ebb4cc80f44bcdf825d34dce8ad112970532ef56f81c95d3012ca0533e0c999b4149406dc3609a66895373120af2edf1219b255000c2c0861ddfac9ffdbeb422ba8aa42b6afedef04acde65173f99964f62df8a193615f3cda4bb56b2c62f5eb2b98ea5589ea239419ff52145ec942dc74a699e758011ab925d365dd302ff462a8a51e4fefbd7c33f2c954c2c5b6e47aad05df4fe5a8eeaea4fdef4710251d2319ae31baa540c8d577ecb87408c2b59a3974dd2c4e6981c6458ef48b2e58320831272b9419576a1b4b0a24880d3aba6b6bcc83cad5b60a1f60bd32c99a35ee339c12d603a7dccb5d135beb89d53a8c8686879a80608227721bbc4ce95eccd4794c0f4a39c6b4b2625b8df787e8614da2d2d959f8b79d0e698ef602d4b91384a173b6c275873b20823aff2673a504326da0dd96eba6c39f775ff8a703f09f2f5cfe54ce8ff47048ab1e4c766fc129e9465dff900b61a3da8efc53f24e31fc2d8f4764b2f34406cca7448a6a4894016612d9dc474e8e236f91e17aa52714ba253dd4b10d10967061d1d7c6ac1aa489a91efa62587fca5149362b612b7da2b3e5204867f4cba6df22e5f8ddb1b7e8e894a8469ee8badbf57aab7fcdfab7e10f302835b74c71159da070b92e8eadb9d60f5ca2627027b6cab1b08341389f6a95e33231e0f50ae9e4e2aeb199ba2d6f354ad9796d9ad3aba54d17e04813ca26dd0e2c27efce4dc3d5f7f900dbd502866f7c20a20dff319460742a3d1fa4cb91b743965f97ff4d150e061e0e4e93aa3292ce87133f4a2dbbe0a64c5b1f32b11c00dc3dbf4eafe9ee48ed8e38fcf2b8ce92ac2b487d824133b7c39d65fa1ebd689ee7e1058fe5075bb75152678069ce646a1ebb1e22360a9ae1ed387fab42fa7c082528c6be36bef91b60c0aa599a83d953fc64f0307b7f189554fbdcefd443d7f9971038860c881ac66bc41c0e7b4806b2ee4848cc4bf6d2801a3f68aa79765259ecc0ee6298ca40eb6674eb0f5d77ef69cc9f38c6efac3f870dbb1a60aba3b357587fd9ae9851270c5f0720e667e8f32c86e39b640c4cd5eadc4470cb95884b2a9ef82ce8df88a4576bf5e076f31299306c5ab72faacb1338e5c2d83bd8fb8e838d84638cbd000747ab5511a0802b298a3494914790237b90fc77dc3c605d49dc16142f1ac0ac9cadea6c2696e22e7b02dbfb8f07fa89f62745393b58299af22071fa4bce57d6c10f7f62030cde3e7b57ada3f67ee698334ba71a5368a76277d15b41b9af5d7f20d99503ca9562b24927b7cfb361a394cb73bf182ace6165c702000000000000000000000000617fba4152e1b65fee78317eee7cfbf67652f090b13b453bdd2b8b2c8ae7a747318a634a474f386bc402cd0867df36c3b946a0be75624fc641751674102d345f7b7243ed168e07cd7c7dd8a40ba76ed705d2319111a7e50bce081161eaa43654000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fb88335891a20c9b1bc4c74ed63d7569ac2ecc0bd94731eb28170c969d6b8f44203af47ae4a4d27b31cf72644946feb3a5cb2080e779fb942747367a22d0c7e48df37878e38415707a09301de5651e0302006ad3e6102845ea53a1c653cf5c0f044cab99043cc94835f111b258b6d835517e5ec6536b74eab64308ee450bf4e0206a5279f4c44058c91be9dbc1bfd60dee16a3c2f99aafba78b7572a0720716040223d407a3cd3c4964cad39bfa510557c012747651c449e02ec84f34c2efd6b0850a12c317532177f17c02809e2ed9d8b5dc53948e68b12a6c69cd04913cb1d0ec26145911a5f040fa6f92cb4d426c71d9c9cc10f0cb4b13d1f0ea6c3c2e1e965983021091993134b70c644c4a1edfba27c6f973c2ae1b6d786863f3281e2e9dde8e14022fa4e96868a3a138323555cb758f6dd3aa37236058d29d07f3bf5634cd85deb4020738ba78037fbf67118c6f4af728382ee9ef026eb2fdff7626efa62610f37a8103039266f802be11a92c5b45b7cde9ad50e86a58ea011bd16b3546ab2173f669ba021740dc8914bf9c06b1b8acff8d8d9b4a14b74522a68e62f17f5655b0c78238a86a5262f6dfb601ecc59f7620770bf63942fbc0e96c8b37c5f95edf89bebc75ac8db044f180d71bb81f24af69bbb89abbee8e835f2365547cf47251a0b26ab9497146c424ba851523109797c1298524f79aef928cf0faad47242c6e391f98e613d8b62e300bd0ad3f73fda654d078fe82fcb2eef0d7c5bb3846009ab431d4b039d95a891d194f06258712a44c697b4bd5e9ed6b79cfca7c3c71a5bfdfab4236cb3b2a45e2ef2bfc314cd98879a3a6bbf77b796b8f78ec27d260dcd079ca9372ccb6205af88bf8a19c62645c459768d32e4a7d871d36c7b37af18c292adf64a4815913efbc2ceab01ba208afa118e94f06daff052bb25d61e89b3206075d4740888094e34e121e05415e2df7aeb7c3ed0c37d6b71d955eb32cc1d8215df4a9bb678a4395812ad18068f3c42a375c35abb85539700d70d6d78654a2f7ff0d32000ddb40a470365137c19cad9dfc96388287b3dab3f0343d7456b029c5a9bf9a70237353cbbacebdabd3673f8c6824b13007dbc857fdb88e212753ca1760afe380a8d2a6ded20d0ef0700eab0b4d6bac00ff36a42344902cd82ed4e79379ce32410b97621df0cfb0423ded8b3116d9c93cff6a17cc9104bef7c7f2ea1448c4b8c76228eb2fff8f3970daeee4bb91e35248d4b3249c6ef55e60b1d432de449dfd940b0a4d1e8793f14c12c7669064c5919d320da4dbc25e8b3dffebd240fe974bcaff8752fc08f377218144370cf2b89764f516b2e2ec9d1a750d3fa107e05d6477ce1a3ba882ce054ee3089d850ae2988a435612aa423f37ab77e7395672c4a45054deeaafb392ec53bcccea26a23f88fd9782a7ec3d44b5222c31ffcaca5cf3a91b691b40adc728c5e8dfde77d8d4578f7493af077a4230b2a549af21059f04dae40d61e1ac30b955d1a98f8010758c893f8bb4e540d9595f588a171eee754170d2fc40ef43cb56597fb45226d3629052200392c3bf3843d16cb605e6f41d8b9e9bcb55569afa5057cf1cc4abe47c12c2217342967f8bfc53d05fa253664a9ffc48fb230e245dd5d29b51b7b3158ed983274586e99750747893f3d6a49f4462a0106124f03a97a4a6adba016f7c3b9b697c4c5351932f8b39775e6a260c57c746245f390f824fa9c7231c357701170ceb7e410b537f18ada9b47d29635b2c57b59a7debd84039e28529cdd40508a7a5d67efeac0dfb0f27a7783b24995ab29eb04a2bf5b0ef62a764d8cde0b67621e8920ab680a4194b460b8c856ca9a1e0e0cbd8fad6edcd586ba7ebfec8afb508ce10a764563c25419b06345b97abb1a03221668ffbeef1248c526bf9b384d3d0b90d63ddaedcda5351fc25ef55e4a4e46ba9f2b10d36eed68f84280ce2569b24acf4d43c4608f444eec23540815b7b39303f4f625c0412c44c8191fcad1485f1356d14912b25643329468679f870903c3f65325d9d03a8ad292f6f5d3bf49f023ae1d82f29183d2c855d16b9412b0a00e5626266edbb188d17830fca7da47c0fe977dc8785f027f025153dd584da0ecd972b99937cc207f56e61badc146226e51417f8e330a183e3eb53bf3bddac89e8f5878a001d4b333e4eaf615202bb1b82001daa9e68ea377391a788d12d149f49f0dc9e34212a369c20d179353db8f675a57a0fd9e4751ae5ca8b2d40edef297a980f641d41f9d73b9ff1af3df2fd9325b58f0c08397ac919ce240d23cd567133110a58352e3a3474d6a47eb283b96c1557d6067e20e2fe48d88412cc6f81c83f0b60a6cbbc505056c3ea45e2685eabda2117ebfa1f334cb446a791b69a038415ee867dd7c325ed7a8e858d445b13630a3f546bfa0f", "", 0, -673625490, "340c7587b869a58c65ee7d23ec2cacf2cd76b19db46251cab29c315bddf5aa4b"], - ["5478007a0315d527fa3b36b69ec00d46573f3fdf6c1dca6b2c2d134473158736d930c484ed030000000851516a525363ab53ddd8d9446cbdcf75c89584472773a42c5c700e0424ce2ab21f31cbee423474d2e0976aef0300000002006385fe1bf377f38953ce0674a4aaefeb6b0c5307e6ad27d538126475e68e690ef4f8e95a5c0200000005ac526a6aab20c6aef602d777720000000000066a6551acabab0ef861000000000005656352ab537310f21d030000000000000000f4ee0d03000000007b3f7e726506a1441ea4802a84034025ce0ffad9080e5c11f271cf396a599d5d9fa6c8d43f3d84ffcd4ea06c27098e7cd8264b5508743f8e9d85ece916ea2aba5962213b6c544efbaade9ee75c6211e36e467f159afc8e50b122778d5840352a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d0bcc884de573d8ccd303de2a0c13eee8be987934cbd81916e79f2c399647a9a23a023b02202330c77ef7a60c5ac467f6bf10c9c70a6dd237f6a2fd0fbb784158d8bca50b99509358aea6cf9e12ca71fa0738b098b648c1771080f1962b51a71bbb43cad9fe6c3826cb6bd630864d9051c589fd25ecccfde6fcbf60999dd1456022ad8371e96dc0411a5490f58bdb5488b78ac2d2305a1c175245c6539bfb3034c0224aac7ac901f5ff034e81529350eb5ab66c7b577a42cf36cab0394f01fa3e3af0b267e7428486eccb168fab3cb425d0dbd58a7c887b793f1bfaa953476f273c3cb1baefee33c238572f3643a80d3957995c51135697010d7e0dd3be1284e8ec1cb030cfd2036f82dafb6d3bf3ed4554a9f6c611ac0d5f436f1d7650a23a18d36e96f02035bf3e47cb2f229143c3d92a587e77fbe5d2d6ee60c69804765d9c4c6cb3bd202300a159db4441a95561b262e7722e4df3d25fd1b3f4beddbef15c79ed18959c50222cbbdd7a483ff185fbea1e16067e7ddc0bd4786c11629f3ccc51735d7172e4202102ce0e77b6c3f90ca163dfa7d585b39a65c8416169814e778639405b88c94bd410ee00df26bb455080cffa1a8ca9fcab0463d6969a33525bf0bb222ec9a55a2d9b13562702e0568fb2b6f41f221b57c4870c02c0d4d8d66eaedd4c758fae32d3534f5be1b157eb248b96d65d56fc01e75fc1c0d8306eccbfe3c0c306e64646e6aa876cf0ca9542fddee2eb09fe454c520a1cf84776511b4aad48e2f6717c8b544e5a30837617a992beb43a04e8379bffe5c9d32ef63b08f4b6a94f6c1dc9c815355d5123bf93a09b8fdb0625db8c89bfaf08758aaf14e8894ecbd93bb7db64d42b05fa0a16134500599001b408ea4ae40193eea6c5cfa1f157a60d1dd44ec43b1a7fab5d973c8b615a38646d5eda7baf42743ca6bcccfe23e992962f4d7183a31cce8f0baa84e67eb3521755fba9d7429aa7bfb6f7ad3e3f5f264da6dcd59ee9e11bfe60084b9001183fa7f436f550be3a914fd73d2e825b1a4d8fdeefdd23eb6b94cdf3af4bfbefca32481aa743e794bd8cda54f357c0652ffe46e32a6260df2451ec4da1ad448f157b4f684fc554938720d70cc85f1ffa1039688bc9c5ca6d298179997c9a190ad64114efa825195e0526ec5e378698edac683d1fc2cc5b222cf721862ff3fc8a69b44436f6944e6f3884a47e16546f10c7438d3538bdba398fc689351568de15e430f2630ddc4e5eab869485228e242a0804454dee90152ed568eea7ce326188803e31ae79e6335eafef24250c0ea37bf0e5593e986ec13a36cbe8cc906343c2889735dc4914743a4d7c97ed983f7b806750337b03da763676f96058c111f14a56ab9b7dac6bf4d2e2a9dd3f435564fa95f75f69f60f3b4c509b4512f98037a294971f562ae37767e02951bad6a8991b0fd76965ff3c0fef3c37a7c59b25fb3338578e79f8d611d50fb074a0da25c660cd10e3f2124258c536f9301145a8144a73d8e5863f80279d2db833461e269992023494aa75ecda48fb1c3debc158fb059d2499c9a61691ead526565e34701f2e0a5de2485954f0d4021810745d4fbfecb03daf40957389c34bae51cfb5ea2825c55f4c784cf420bfc09603e4b75c2014a9d5d9224cfde48ed48fd67246b79f069dcc12161c68c4b1d0fcee0e14d086d78ecd32e5af0b3e7617062415ccd15293cb2e9760d7ee8817b82ecc128b46d88b2c901f0e184d72406a475051d6c109555beec0b1592518c476b646ecfb77d839ab938dc1f662d942811e7f93504fc4d9663fea3745ecdf142e20be1330918bf1f70ee332bf4d56cfa798dd5e058c906b2bcdf0bcdd95e7d5b907520d85d3de0eed71386e0c154403bc3e04abf8706eb3afbd91fd84ea49f8c6c663f1d6bf9dbc711b07fd4159f59e8b3d62c41c758ec1e3bb54520fbdf49fe23109a59204ff3904e096506e07484f725b2dbbed2e8615463cd8b3841d5f99d4f1e09833e1c9fac0dc4f96673224b154a066cb16b83ad141bd6aaf749e4f1fa4db796a9054e75f3d8f65db236e1b16ca7bd825401c37f94b24d288d1e3e50fc6345c9dc28550ec4ac5b3381ff34b403d7e9bb4c88ed981a3bd7516eabb770919deae38270b623c128352fdf4205d2bc4e7c26499e454983578d500499ef296b0cdab01ffcc734f77f4641eadfe2cefbba7b865c2024c00c92cf0432af2cd15b7cb8239f5b2b1c75278a2cc3346d59e32021650d0bb1293d7d2c2a91414321ae060c15a2251fd53efd5d5ff16ea63aafc6bd4c52040000000000000000000000009486eafb3e385d0862da7308ded5722c0d4a14b6e8744f04dfd12afc7b746541e73d087d197299cff88a007aa7033003922217e3cc0e38a360bb73eaa633329cf3edd0ddc5ad133a1ab69230cceb5469a4c25b3607530c20377e1c8df274bf8400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000242a2b443b8bf5cc438de2cc760618084293fa2d3fa6af259945d222c8b090e306039eea9e494d2c65dd1591363e7d3bc053d70b707be3d28be322bd5e5d0710d461eaceae3ff45289c26d6ce4a0f4248dcbbb4c41b70f80eaed0d3832ec6d27b094b826d942ef014aaedfe14033ff24039e8e29ae39e8e819d6e939f27bfa60032a219905c28cf6dab334779fe4ec7f4a2519c0c0358771fea44d2f0c7c951e62030816b857e6891e1540966387578eff869bb5d75316a86112777a5da6277f79b30a0bbcc9e69f569b7b8059e9a1b29e580054e2269a9f78151ee93f779e4e329a771acf6c4515a3e527d03f45a10e81362021547d281ca63e3351b9b6bc541b4c920215fb21f8ee21d5f7d9372941f5f907f82546141de9d6aee5980290fdd4179918022d97b71561941b9861250e2627d6e8c7ef7f39fed8855e3e4f6644f423ffcc45030113e9b447b7ba8a8237053ab15d856842cdb94d6660a7871bab478e3d7d977503002bee8582c02b879c8a6f38b4d6be1010a5a2ea3d952543773dd7d3c6b042e2021f8576e502585bff5595a63ad38cde0367d47473dda01dcff607fec940c0465bb3623a886430001a2f4fac6974994bebe973d352727d6c2ee587f62f65d1c8bf148541759e775ff8b97c8ea01d712814da1080b4b40fe637ad459d1aba817f88119c643bd308a26bdaccdb51f24761ad6c9a8ec949d9b2b5edea4aa86f372793b9975bcc73d6492fa748bb0fa39e88ceaabdfda0db9a1a83a8458b6a911535d746e4211e55eb524bd7027bbe9b58c112358d63b03b66af10910e23e990b8982af31688372b6c7fe03b0cbe9b01fec0830d474bd10988b4db2ae52f73fd172df3b143e17f2fad969a64d7e0e4ff4992c93b722b8144386e4f688b7b3ff6fce15583a9dca604b83a790c2fb9814694fe241b96dd4b2812f3d9111496e0757ab43b515a68ae5addb55aaf5fe37f32e17d7f02e68d887df6824accfe01ab1491436cf3747828063ab220f5d61311acd8992ac5792d6be5ad5e9433c050c3dee0746cce732f344bf6677f4234488f7e544b43a21cff112e5b654f88bad95fcb55f13520bcd8feb617709300beda28e6ae4f3a298855cca30c665e95f67918a9dd34b957f26db3caa514eb81845e973f54af3a049f9fde1de19ebe95f27c0f9f202a13b9747e43a2f29a3ef87db5d83758b58bf68b29f5ee9e5450c17caba6ae8e519667f0f4c6e72c8f4e958b17282c95790ed1c87e06a1a832b3f50d4db6b49740eb1d00b3c6a8e4d56f458226305fbf09400a2d2a62d0553921f31e1193f9c7dbdd1d399f39b121a5b24b010e3ecc854ca4bd5d598c7a17d1af637e17cf253966de1cf25ff5b7b218f4883513595d7baa87847d4561211ce4a874f697943258253bd17a8eaf61c62d9f5f84472d6c81aedb07104a1fc7de22c7fe888770ff730fb19b334fb3df35399322cf018d41d5e2a28e6371e166c6d46d12375cf351a9e24930daa63fb0482fd8dcf31d9480c6a3d06fe13efe6e3d163e2b91e9e19afe8e260a112d90e559115b8f6fcc41266ff7de2e951f8ea44629c7fa13a26164e11d6010b5187883e0cdcb3b987068c92c70f5528db99d7c9f0861ef7bc036c4eb5e734bea4f45c57ccbc0f0fc53d58324aabc297782d392c0d9e962f9e54ca4b261912d2c4b9bdc985e55f6fc16d4bf9995a7255f6dbcdca7d29b62566f92d977dd7b6ec9b9122f4583c456a058273900141dbc4f546373c1bc16a5514afa4d4d56261d897dc2b4e5bc32d66cd81058fad1ef0d5f55152fc7c1b74c0644f07a9ee28032308c562f2e4f5bbdbd1fc8f90bdfe2194f97e32e6a0f3b9ad10ceaa6081d24be56c806a186b2d2887fceaf83b481e41da0024cd08fff4e75b563f9be976010afc5f5b7fd534ab8fef458eeef24b9d04b6edc66a6ab9512377b5376bf8ef1f86a2135c6cfbd3bd7bc90a6a40abdb345b2eb83a426513a45893cd0d0659809aa291b8bdc20408c4e31bb2faa32c5474924742c0de822ec6e4c634657393c181cca94b47d7cb183c4441449d924a7641a3a8839145c35c47bec80cc4f541ab0dd04dbc714c23e7a4b1130505e7198a62605ea5ef7ac0951e1ee346104ca50aa9a51a3a15a83c3ea442045df125061ea9b727a5dc7154f0c3037cde5644318ddde1a84f9e8bc1c74aa8043f91baf94de156f05ab235dcf0151c24b0f694c5615dbb00ff6031e484cf443162fe7cc6df5fb784f54b4ddb5cd576e04faaa7266af92f2506815d0228abd0e7d9aa360a2b0da5dd826f99b030000000000000000000000008b501169b91d65161ae9c60696a15b777fee6f89242eac44f620c67e86f779d7a8d6f02361b1a682ffa53e499d7d375920e06ba00d51e6c5ac2cef2a8242a499abf41fc5abd1a289668fa699d400bc26355519d5e1b1b87c90754b5857d4af76000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003bf47bebc82a4967e66cca05b3665c214bcab0bb9dda46defa86d0d4a7072d610aef3a611a6b502d4bfd047dcec543afebd068c44a119397d4373c2e0245997ac705293c7afc0eda64a6da22453169b7f226ae05d55a423485a64cc79dc13ff8bbcce3b128706f3ace9b076d979c1edd76746fae5a9bc4171b21ec4930d08895031693bc5b1e2573618e45b823195ddc4cc32192a02b96162e9bb64f7c43f9dd9c0316d3c9b21525959501437b5f766b5a310098c8d0d920c6f23ab32172554a4c110a17a3824217970696e52a147a7cd9b3d5285d57e047918e21b06f1c4f3f87bcbf014bef3b96aac6519a1f5149552ca86078e5a33e724050fb16b53330188e77ad032b67393594c5dc7450c188cae702d6ecab94a52165e657cfc93aa641224af0c302258608b80ead03d65a4fc9210c4822a810a719bbb4fa1738c79775f5b439f4640307c24e6739428dba8ec9debdc42db40c1f08394c3bf3064c830fee2cec576fb10208d1803265ad6b50f4cbf605497b1e7410cd3a9234024f6af34d2f693b162e75031faf100697fd22626bd2e4ce74f18ff640796a3570a924a0bb00e7595f82f0d76653e654d9fd86c209e7e335c492446d806a1e7c570b751fcc60d5fa82d719317e00c9c8039dce25874c4eec32b052becc831e69a5016605a32445498c13a336b330710fe7e2308de4eedac17fedf7330d674c9e3519b5080ec47056de9016a2f496e3fca876d63f87cfa696abb05217bd5272d158c3809505d8f5e781614c7e1cf0a0e9427064fa6399db0216b6f614adcfc3766213b8ed04228c71d05189ca4b2a04f0c2eff45a6093132af82161f5dc78ff2bb1453ad8a8866ac1a0ff4022c1289b852d06932223453e65bc4d7efdcae9c3ef731a2b5c93053abf2fdb8d4a40764a9b712ccdde2f4518d8f75bd160a2cc0f02856db5e068368648e85ca60572aeb98b2e67226f783cb474af9360dc5ade319489635d6751e93ce2c9b36214051a6ee8d0899fda4b3a133d8cb1acb0d5ba9ed208e317f4cafc539c18589a359fdf00466263f85b5c4a94d06e73159117ad0b9a8ecb6375459733a8b35ad19369a8122f3b126d97dda7bf88238c939f41c1c64887a481bdeb58dc9ede917ff2a386e8dc56c4a8bc3ac3b44bc2d591270ebb36d923e9a02dda25f69ada33a905c71263d6584bebbfd1219d2af0c243de8b1bad8dcf53b3bf86d63c37698d0a9ad4229318324fcc9ec573b564f2d6e60b8eeb9eb4168fb47948b1391b45ec152a0c79ef621a21aa4b679ec744c6d5aeed91c46664f54d2c781bec0b121d154ae65794bddabfb30e114f9f49429e9cd4a391665d4d74c83e71151d8011daa64ade0cf9e31fdf391d2604c0baa1279ca5bce00a0fb79823af50b92383748555bea10d0e3ecc80152b4e495351d0ed3e39471795b7778ecb4fb9b3c0f340cb139e81187bfac16f74005ed3b26bd40c2c20ffe31cd26848ce940dda89e6c9782743e41391f0cf6fe5cc23b0b4ba3bb6c1413fa1cf71404511ff137200307810a31b47c3c2147e62735c222032182caef30c27a44ab9ab23d7a46c4a181f56de46c0ce46638fece6f2573d60af0764d60b94974556f5eebbb919a2202bc287543f36a766a3a267e43a266e343ce93ae5e3420464b33deaa480cc651068984f7a51bebbb2d22302244f71a163f9b7aa9493e1c0fc80b8c305fbb874105a0010886fca31760bce319127b8003075ec2b31caa4f65fe70fa42de541a2218b66301cbeb4e404ae5fa78c1dc0d576ab3be72f3a2bdce5c435da9d1b9d14e5263c4b113daeeff4837a8ecb90a609976668497dfb75ebbd64150aa4f2313be7e503c854dc41dec2295b91f7e44f664b8cdb482d42fa21d000750c6472279cff7b3032981090185885a8e8df6d1e98656fe2f452c9dee1a9973db527a84da2c503120d6de7b7a84aaef55a89f09344cfa4e873c7691a13402a9dcddf86127ec9e5c04ecc0def9d6aee0aad38cb9f2c648fa577587738a4b6aac7549a29d6978b26de1230d85c935be8658a7fdcaf601239d45f0b22891a691f6409c321a28fa56689d4a96b5a4f9d7e0af23db5ceabb9e0e050e6b4f6dead5236a3ad43ea1c6212f053a2a6f646eee48ca06f1bf33b0395abb97892825ff210cbe557753076c615319044d68ed948b426c3feea4673f21564b8c664d65e7be785f5658b1e588d3a57ffabeaae29c59e50de87f4e6b9f6f1c187196590f23e75876008064f76de9221be6d1fbf7a1e719319769e852828241ac7601dcd0ace66591a597fdf960832bb712f003ebc5b74317a1ec899b3ec20f19c57c91015476125f51f1c88b2c47e8796fb4349617feb41188e7bbeeaf496b3c272d03cc6b1621466cbfbc14f13c2d023bbc375d9bc00766f12ac13ac7f4801ba3292b9beb503", "536a53516a53526a", 1, 168192221, "e6ad0915ab74732849e8aeafb2bb0435306f732ce4964a9ba244ae7a551a7e26"], - ["f0762879041480af8233ba928398061057cbb88f7e8ec0686a4b60856847a1885d4e75f30400000000026551ffffffffd0bf60ad0eab1245b8267ba856f1d1a56a0477d6048334b270025811d6deda2d01000000026500ffffffff09af235c4290f9cc3e4d50485ed96b4fa75c530c7c14e7c215dc2d78698b7f6e0300000000ffffffff4b5c4b26cd78ed0f55fa058d59365e28f183906cf8e1b51e41e4fe741c24cbd70300000004ab656a52ffffffff012a216a050000000005acac51ababc5fa9b4d0300000000000000000272000400000000f7f95685c7139d969a33b9a5ddb06372bc0e46e0d787f600e64fc6f1a2a94b469ed563c92470322da0267900ee1926c82998a08042b3cf757ba28246789fd97d9eccecfe75be3a6a8b1e4ca1650b76d67ed78d101526ab0762ce78e9575cceed000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006ef13446b1e5abc6c883f24fec623ea098401100a22ccaff4c195fa2329ebde55193bb7459ad3484329fea24997e54749511361bd0895ca670e71052a7eda3c1529b422ca5586f80bb927076a56388794edb941c56acec2940b566364c4666aa7131d4697df9ed3cb22def09a70cc34648d209bbc862aae65e0809831615001e03038873ea0894e931af4965df88150fef62d38dcaa3aa7d103f8d8481cde4c9460229709d65b66f140103313b8566e4aa636b3672ac133706fc6898049e36eb53c60a1177f827febeffaada10a237217315daf42c4e62285de0ec85761caa6c46d9a9189380d4758fcc3efc7b982158761c7746ad883b186134f9e20031234ec291d0030f0825ab37bc4c1c89a9f659c6a2dd310ffdd9a4276245341946422ea4db7a62022bfe058105575bed3ab6c45a232e533160167b80905339b640c9d7b7aa172a30032de51e2b8297a1c5b080f7e3648e13cd43e6f007795f5d9e802ddc0d86bdc9ec021afe5cee70a56e9926980c095f5e231a67d972afd42f92de3e82c63c4ff45112022bccec3ed5efbf6966129c15ac4630d77ed31346f4d4cb19311cedd9449500399146b19e04fe4c86249cf04f2767c2767cb6e6599ddc76288a79a940a7b42802f6347b8d1def9e0a67f2d1b10dcd37abba50d10d23fdbfaae6d444888cdf03dc12a508cafd4ffc656755c7867aefee8393abbfb7400ee177de05ee22a3c3de42d24bbb6b198ed987e813acb601fbb90d51cb3d2c1a50cab7ed38656b85cad867440df34082cbf7bd4f74ced05d48488ddaa733772e824abeacc9db8baeead6b4ddaf3572c54fa4a89c01d27c2120fa0d694edf68a884feda901db81ac4038ee661ef3f7be8870329f5f343bf927cb26424a8e16592b64b6183e9bbabeed444eb3dba693f94e06be36cefea9a95cc22eafebdf48ab8d5b2f96684aba9cea546e697668a8d322c3b939509700c0a38eb19a8729e25526cb5a0046945ed771c257059b30c2eaf00025362f2454ce5cd8c55c12128df8082961c4ed894daea849f07c1b173f0be984fd71162ffdb830bcdcc9391f73cde6352c745a2caf67edb2b7f07aca68acc914d4d17f1341a4bc36bdf5d34c898757f5d59e286a473c28bbeff3af98e0004402570df1241fe71888b1cb0df69b1a2e7775e0e26f0c9f2a235aabcbd945f4ea0adb4333194cd0bafa8ace7e73d6f38ee4ca7264149cfeda385781930cd337b290476bb68fdf25af373f8205a1f183968cce5ab3bd31fcd932ca4d7616ff4fa2860a6a34b1c16fcdba5e6de4f7758795817361cddd973616d1fa24ebda0232b39be1479d8d85b7a8f13f444c4eab0b38c7ef0e833a7f4e8fab51e55639bac7ffe84ccebe22dcd3149cd4206f4e6448b0734088c75271085ad80ca9494247d4e11bc4c7234796e690477304a8cca4c16c7b2f3a44563242d5211556e2949b10fe83bd6181885d430ea5c918c369fec99a8247c2a0080810a5bf4f6b914daa67ecf0b961fb144a031c1d7e6e15e506c6ed5e4a009e2d65604f86e3c099ac3dd9999d47648bf44eb6c83fe2bf9d72d75fa59841d8cbb6cfc3b869a04a9828c75cf1e6cac244d1cedebb75db93ebd1d93222bfecb3ed0d07c522c87ebe4ad985f422e2877bbc751a934aa1efd3619ee6c632ffe6121fa7abc33720c006732cb45bbd796b985bd36eb8e324494c35457eeeaa38e77587ad920858fc80d55ff9940e5b5df00bcdd4a046298890524fcdabd5e2d03240ac8d3c879542cf0844755e744bf8a82adec1cc7ec0f1314116f62fa868d491163d835530d7ce48d6a327b11771581e6a42409defc7659b8b934012b7c8034a11dff3f5fba66825f136986da900d52a41f2bd2a596a2cff27fe92fff2417208998d78bba2d98f148dbf5b840b98003f7bbc44b90fb2554247ac9655048e1be08c5c9e34bdb402e5246007a7c197083f6e1928e9ba4257302790ba6b65ba9634e399759d8da1270e95504caab8277a0eb8e15f1405f6700ff635420c5076025f7dad5214647ae4860af630423c717ed21ffe60db802a3e9074a0733d2481e5dc046cd2a04ed68dff4a6f58c2caa2fb73ea5981c84df4868b5e916c8b6902e2e9b0b682eb09d61957e4137ce6fc7ed2660a42564b80907dffef5015900a97d04254a791b506602c8b50e409f37098e10e9ee7d338871d5524958361dd332d07d674601028b81e8c3b1d9722bc8bacc68c569220d141bbbe17fa662ba55decb756d4bc5f22311c6c3a3ca1ec99840464358111dfc2590a1bddde5e0d5d2bf0100000000000000000000000092dd64e1a13e65ca2913bd59007b80bbfb2e22e63d426c679e532f7585cd0adcb53c5261452a3609420b2797d73100d0fc63cead14a3cfe1c0e6b612d93a213e617e55d2f6b084d435c7b5baae9568e5f7a934f488440f0792f551134bb337b300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e5c5434fee8063559198d5ad12e01b02ab882c5c5aafad542f9e1b3bc311b8cc64c2645f4ed79b1ad29832e6c838f1c053c39b9a68ec80196eb91b0762c094ad5e7555650c2ddf3ac12eb5f435d21cee9bbadfcf76456288dd150f793551cdd88f725a7168b104ad6b07558a3f6de73d872330cdd1fbf30c7989c284da95456d0313bb8c2fde6c7163dc84d65cbb369bfdbbf6e3de9427cdb707b3f4cfe2ce15ae03239b5224e6c77eb3935d1e66557b197f238532fb63cd3b2d060da59649be42d90b0ca9a97258da539b5dedb30ede947226073a503593fc49541f240803f1478cf320743f90da9521fa3d945ded44c30552c2a0e915bec5fedddf6d2fd7f690b88e030cb7e7a4f195904432bc38cc672bf59393838ca5af4650633002ac4645258779031335f7cf12f428901d7b8f5a041722fc3e8b5486b8186688121cf715ce74c6bf030cf4b00f34e4ca2d2531e3cfe9a758a3599d385b954678df79ce996d0f816eb6021aac2bc7e933d0a3406a99b609255f75dfaf88da34eb3bf639212c8c9d409db3021b5a1cdfce10c26a0912644022fdd1927156a1e76652187db6351b66fee764dd4123dbc7840c5392bc5205c519c079b62c41a63297a1cfec0ec6f47059217d0ee5349dbe4b9a418c94b0cdc265616a709a04bec0b998d53b8dc822c97e151d58ae7519d7fefedefb320123514bbc59aab95214a28ffef2df57956a8bd01e38415ff9bab47316ffd2df4bb62debc82cca2cea4cc6e1e4208968670f074acc26ac1bd025b46bc886b831dee42b8f5bfc6b6c949d91701c19d1fd31068bcb4f74b4dccba9d0b10ae97e8d5b52492d5545001f4d4280be9c96db1efdc1640226acb006cd019d113e1eaa52d56e1420f5daecbcf8090d8062f2b89a06c16b1fd9532044eed9335390c4ffc73dcd73e6a61b5f7f4edfbd2fa64708055eeeba57c49436ffe300749fcc8dc88274c4c767c6cae5487fcc9cc60497f7e172ffd53eaa81d51be2173a3da66d850fd47edc7cd855bba965de0fbd0be15ac07132af39bccfdf2614d7d5f9f42feb6b27ad44c9d1990c704636055032ee1d9ceffcfd87e05e61c976e61271d9b3eb0134dca1318ebfa3f88a75476a3b7bf44e3ded74ad6713c99a3e6aeff6c0a1e2dd51140a5898013e8eb90e27883d00ad6fad9cb0faeb0569f457dc8a173a4af1d11df5ca893f7aacec548eaef6e100d7036216050bd8f04863c477f5dafb923cade71b0e49e83cb41fa2b3cafd210287b83f079729f736574962ca1ff8865a5d0b10c4db91169660441a57d2e8affc8d11d2eec9dd2d194105641f57e984b99681b98d2f5c36ce4a341da36ae0b4a6b9753bf463da4207c2f24b4d4b5ea55a70883491498d43ddfb8998dad80fa84162aa18958be297c2f259aa2c5cf5357880934bdff5691e519e8c3b40d2b34bc0768d946819a4b7ea27f8e9243b45ea0dac3ec27626e0ae15aa7b22bd7cb8d6787ad918fe1b008587a56e5a415ab6980341600c6d373550f2102b8532b7eb5a317ba9ed743aee3b3ea5b11c29e96c7d71359fe3fa35c8a0927d7db42cbcf8f328e490a748a5ea0e7b7ee028776b6639e5f6dd1b8306dab92bf4b7d29a4f1379a64f8d9eb8ea574ad66795bf738582de4541c0bffacd9a5ea25fc4ac4e6649c2c5ffe41d5affec41ae45f78d97a85fa47d84290723187049240f14aaff3c44f6f42902b31c5e67833493dca6925439b160ebc13f73cd5b7fd941be9403a1f2f208fad45b39e0e957ee555d0741891e03b37d089cba00985154cc499daa4b458d8e9fa69124ee65dbcccab3e9ee237f9cdb4cba06069d515d10104af676a411021113bc31d4d617d1946180f2c0f76fd627b5126b9f25829597bf838110fee364a4ac981f7ed3f6ffb334806add543ebc64625890e0b27e47273677721e21b37043851d59c7b37a7293c9c3d4a2d9699a933ce39133cd503769934f319a0ecc51919e7abb61753a9644af11f8e23f0e10b77b6f002c56d1721af44a7f7519e161ecefa1c2139639bbfe953269632e861b25aa6186c2c865ea19bf3f08d0c6e1e17f99ec1584a501361661af8fac7039f8191731732f77002fbcf390e00cf63726b2786be9b0de86a332a53c13c6c34a4facc298c9989e06b95b5637d2a4fd05a57f419aec978c3dbf6ee70c3d4be6e50ccb0d6dd17c6c4762bb7c40c222e5e6dba6fe3eb22b5a5a6dbe44c5015ec0d56fc75b56e5553667215049b9a417f4e82dfd5707a0bd4f792030b66379c2511696986b926715ed846dcb89d77d4130d7020000000000000000000000003d81386369992605dc2c9302c1f385a70823cfdd9ff4ddede7e60f55bb6d1a750645941f654478327490458eb3056907330b569a14fea55fd7358fbae14ed938f45d96beb4de933000dc6c7e94cb272b34dcb193a61b27a9c1a20fd8c652dfdd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e1500680132e4936dfcf07c83ca45206831038abdcec1a8b6a30882d7a2de60281ad26822122d43a009cad7c3dcf4dec12c518f67b2c3a530c8c670e257d71e5b3ab656446433dd62474d9e328e9a5a094b4d393ac083f5101a4d00691d2c0ddad013baa96a8b44f99130e91c24009102e98bb620c21b369e7ee23c9d1c3024020650498e5cab2696a8ed14c1d78be61363d78f94aa3581e125e9b73fa56500710207d3b6bc4ead015290a07038c1bd22d407b0dc41fd0526c689b66067464dd7010a01dcebcf439de94d5d86a959355d7107ef481c5779c4dd75b33d17ab308905ca1421ea827814dbd88f05c188e5a6f33fa086c87d1f24d5c416f9d7f274750f56032f2f747969603d1bb44edd169fb620918ed56c6fc0aa620274f3a06b627578bd02043ec3b6e21c0f40bdff42ffe59e1962d32db72d5fb4a07bdeb49395311ebfbf0313ef3c079adf6f53989d49a792bec7c5ebf79a7e076637551ee1ef5b1a22bdae0300f2d58dba4caa079a43468c11c1374610c2c40142a7d7ab2d1bed3b9b33346e030bbbfc94530a9913afe26658912bfb0de275e8b912da2d714610608f7d2de776dfbd7ff9705fb3fc70ed866e2dcd04e287220e9f9ce7c048e528e59c40354865b47df164302761f7b067c0b256efafe41311aac2891cfc92bbf6e95d9e9c64cea44184cc4f8e88a3a6e90eba3d4e8f49d0e92a31b4315908c217945d4820a6887651ceba874a41d99c76ea3af724863f2b080162038bea7fac5af0156b8498af393a4ede625faae0634274dfffe3435035a8d2237d7392c18683dd8317d961380c7a827fd9520bd340583622023eb27fdebab8f89f1a0aa5ee8b4abb23643d9bfed89d1a1cafcc297868a439a1367eb1735c6a61beee0e6c8f2e35f97bb41fbe3ae60d823e2372c3912a680a9e79677d5f1fce7a7f4109450bfce6438e5afd22788f5b10e4b598e5123eae62b6edbafa8625f9d037697b9d94335aefbf47881f47bec4b3f2ddfe51911c82eb31df79b5915a7f6f1a66275f98e515d305d1f4cb27f222a692abb7e5c782e5970ca88be086d73505a3051c467d097cc21864a9070c1862ffc6bc6c3d415a3b4b7ed7b4a1ff8f75c42b1e833a6bbe5202474219c22d8696015b93ec89f091b8878cd072a7e05f87d1bbed535fdb46d913672ac8fb9d6f65e2c150252872e1d8d79077daa40367e3a2d111749df40474722202dd1c339f7207cea611425f36d90e81d9492b3e4d8e1f571dc076e736e9a2a1ce27fd09d552a06d8f2e81c6043f72e2fc1b4a2d85fbb9c98f6da6bedf167b7585e873536883adc57617718409fe24a43c21e62aaa3aec817d625df4af985259c05224c961ea490e66c0fcaf2236b0e6b397d8f0afbb5629ad9a19532fe68befe10c06de7db78f17c0c890f7975ff90bfcd76fc7b0848b9fba963396e8c38990539b38ecaabecccb74cd7731c8b009f4b833ce874f51ab5750bf7ca7607ab71f0cfd69113a985a780a2b736998413dac0d0b028d4c19ce70aefac2520d843a134e8a7acf4ad404fc6f1fe98c1c8461f291af2a570496135fb38685f4492fdf93284e786949b23fe62d5fc08d75f852161e1b219c8a09de4b8fe8685f4651f582c47e890e548a5c3b939009f9feb4294bed6373f28426221b05a6f93445c8233e943deae440ceb37a87ff45e9430c97dbfd54435d8c5ef3198b9fc55f300bc9156c64aa719c239e8ea8bbdc8bb80e178895798c2a4aa571d3dcaf0e923851eace0ad6c26181c21f92cce1d62aed61552da7b411e7fab1e88df177c397e7154e0dc5e78a0a1631293aed44071e9c005f017d448e46c97018d24edcd838a7252d37ef31b340898be408c98124bbb2ef73bb9be0795ddf205717d344bf5afe9e65e8bf03e41fe9d6e84a0d98d23364e943fb4788e6b880a9cba50964f1617ea22aa1762310cae88a49e8ba497f5ca45821668788e728348fe700d5055440b17a1370092ea802478ce1a6a86dca54185d031b9af9d8f6754fabc943aa3b1f53ca6769356fa8cdd5d590da451adb63f2355f0f6401f6a562ff16c300ca6ac3030aedcfef9d830501bdd4e77fe2a96176320d1ba9307dae8b4022123ed72d0b53867de48de835c12b2b2c4977b9a8349f5aa30b68f6d757586a389c8c3aaa4baf0e4fcf31a10ba34fe8259353195733d240cb8107f46dd78f2970171162baa30da2518ba6d7041e50a498dfbf881d22b7dea780c6b00735b5007eefa7008a6b6697d8f305b5cfd49177f403e3739faba34c042c12fa7f28b07688d886f62c72e258e360e4e690c26a86b749ef5e7b19d48489b7277f36c23fa0d2c1984f9f2ef22ef5f8a4676e90e3ce7b98bbf10a08d463815b2d138853dcd22dc2646d8c8d8d2877564533487a3634fbfe3a8667a8e0ddbf4fd4af6d3202", "526a", 2, -12162373, "ff18b2bd50f0c75ccea7e5b1dd670c4aca36cb09c195a5386c33030a3c2c3136"], - ["1fea829001f7a6e1e3ffd2bd37ecced7c8f716965c160614fec758db75498310dc47f8ee9b0100000009ac5363655300535300ffffffff02e89905050000000006ac51535365524afc7d0100000000065153525300001c8b2d54", "636aac5365535165", 0, -30289340, "b27322eddfec9985656d0733cc2704d8ca91f95a66847e714bd89b61fd78df79"], - ["bcd5a94f0223cbbaeaca4e7bcd136abc02fe6f2cc4d14f4310b7f55baab82f94ae6dbdafe10200000003516551f0af98d034792bafddb1156252df7e267a28e6a152013aca4392d56060c9b9c670c9f07103000000025265f2bf1c0304559f9402000000000865ab00abab5363656766f30400000000000bd4a201000000000163fbf06e05000000000253ab000000000200000000000000007b380d0000000000d9bdc7658885a7d261e8ef95d9561bbef309323bd3f073f9397b39c841dffdf7ae18b03201867dd70c79c27f8385a6528142a7bbf5da10a4c2a6b688b5a0d3fa9f0f16c75efcac5590075d5290085b7090dc629e20f495472acd822e51d690b100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cbc63d28964a0fa41739c114bd7be688b3099389e87951a985fe2bf3c18ead44b6e2972d54c2a8742882b6264f1c515ccb3a8b262b05f466d8d96d20aaa3e3c2afd156bc4f1b6a597d608d47c1eca3a4f8e82c3b2ed0a1855dc9220a5c5188a08a432db4e48dfe109fd7554692969797d3b54c5e3839cfe5a328cebc2d0fbbaf030bc8881639a3c3f49b93acd05f91d1911323c165127d5c00adb27edc73cca8f70300bc4f9e0815bfabb3626cd990eedda6a4020db6c57ac92025f0fdeadababe180b1f0a53623cfe66807346699ea30d1500447d77793fd33818568124b696df176c2618bbfa066003236464189fa56e73c376bf44e75ec02cc7d5b2ed2d0e9621080318ac014509f26d4a2794bf27db2ba9df6bdbc75ce7ecffc2d793ef47cb5224c70211fe8e6de811b7c6b57e32677fa901d965223a6c63b6f81d6cf4a94d28e8e5a40216c7739858243d19851e383ec7dc0d82ff6c14b9ce6a3d148ef261d27e08c2e603002ea5e1705287a8e879f4035ea472c6b4c69324f29b31deb547d173b5a7835403198a8625705d2626d1f5af905a4539efceced4341f4ae5d0debfb7d62c65e86287e35fe0bbf643e9b7bf141666d81f5c02f97f05bc3ba06810d465e94dadc1c3afa3285a2fba373a7fcb86e8b3709b230fe17fd0df4aeb0c564f3ca9f0619ce31d8ca60d57e3989d81d4990f6379ae6dc092e2602703b44a38d819ef427d3b44787fc6b239ce5fc80f8bb9aac3a6aa52a682081a621d3a49824849771c55fc15b463e864a892afa75ceb1388b81f1e941ae87135ea1059a6c99417aa667ddcf82806c83d2d89c9c3ea8c233be667e92ac1b6daa2886a31c874ab75f34f86282256047baf8281090bd1f43194e69c07555ff7bfe5246ca73429219ed8d99dbd6c3df5c0168cfb9af9cc213bd45b37171a897c6aad2cbd8a349429743e7ce1a49816d44dba1c847f071343c164cf8648e9f266e3f0259bb117338647c6f27862e44baa741ee59de68729b8c06f65efa662949266cc26fab90b714c3d3c61c5770065fe0b94ee47285ca6670c419105adce7f2d03492257d59cbf1f98ee502dceb274ad43ca8f37fd64b221e35901d24bf55db002a9093bf9a28c5ef0be2d7e8f0024a456221a0b86a0062c22eea54691f1e440e48f555f3e9b8979daeb17d2f6b75fc791e493a9664ef452759d8e87c6e24339f9b8a3d74fa8995b6aacbd0def385725946515a78ab6a53a9a9f49408f4ba24589fa42835e712d7043522537c7572e6613ea0d3e9c7a6671f40957e32cceda5e38cde42701bde4e4a1e4f7d88533d07d5592a4fbdb85725c830307007ebe5ec8579415f5c8c613a5efcc8e20d83f991a9952a9a97ecf0220de067a1e5ac382505d025d8a1304bc0e556b0683ca8204f86ec57d56a6dae13dec5f5c72bf6b4e1cb5cbc317af9d157ea57305ad7df9d2c44f0e2d1e99109e78ba39bab9234a7a1b1447718424d3c869230b5fea2202deff2d140aefd08b9b0f5cc1dbc197ea312f2533ecd29486a1c975a2a2828443687c94a7c19c702ac16f6a6d07f8ff9f62f0b8b4641b9f18b8e87f59dfaf232e305527367ee0d4b369f2fbaccfe8146c6057d4469fb81ec7064475531305f03d4b737c19ee037c0990f61c744751a2cf3c97ec73c4a71b44690d7dca9a0db461c64010a2ac6f41b71c3ee36e2f32bd6c21921ffac3e55ebcfb41f0829c99a3d97676fadc926ba84098e564cf2af7a30c775a2b1f022520b5cd60740d099c53129acb94a59fd15dde8341211ddd8f7d6b58bbb0fe2ed4f6c9cedda38d86a6b7ba1d0f736cc337e838502b2ee4115d566008193b894dc0a5e30d3aab525980b1d92451133849bc5760ed4759f90f1515c0db486abf8ad45d1b5dd4e34d621a3fbc091190599ae1c95d3019b21bbd659af35bb3617f223655ba34ebf41e8878fe1a969d0e7fa4928fa21feb28f002446f06a502e827a6360e3e53f9002f2ff8faf07d9f87a6cf2d06aaefcf36be306a911adcf8affa6bbc3e91f1bf3c3741674151ab9cc9fab26a25bb489c5f0c033ec8050834308e4329fb3ebf48479c508634f401844cdaef5e08f299946bbc4bf63b13898ff9d44551d222cfec0d52ec0ae81cef4e5eec22dbca13d5d48807d1833dbedf39e9c03e0e2c870ce3fd4128c1cb467ca8fdfdf1100b018bd18e8e4b4e4d41b857b775f89285c247f356507a0a5f6906773e8d26ba2544686a07d157d29d63489c6e5913f6e33f583f2ef911c9980a4f1b9566487350340a2e968058c834c0ecd68ee844050000000000000000000000004026676682bfd78494d5513fe415b480c9d529daa8bb73472bcc53872a6c34a6032cb2fd9a97bca9ef4006c2b030cbc6b59151c46c1240983f309a596704c2f7cbbfc39336c35fbc95261bbb7b52aa54dc26ac76cf7b3ff2ad4f22e63a9d5f63000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002aca253a9afcdbac5dc2e9bb91f0acc485fc8b25152aa7b0b09a42c790ede59a58524b6d07c0e171821e287f1c007078f671d0ec96e3bdc98759465b7d8b67cc1d4f747336d97f517b1491b0e196f804bf601fc26a2faa83c41bc85bac9704a52729205e03f8f15366cf8674cadefc9b003c885b66c994948a653fad3d66dc39020fe987f1dc302e0869e701c6ec747549ac32b9651ce51a38ad0f549d682c7b110317d23abf8bae69852b9651eae5e00507fcc53d733e51945689bc459fba13bfff0b0ce29885568f2738b8e14e6e12266f2319699c8b0155d2be1c3f83a5649b47f404e14896bf43f29165f01572b6285bb7103337a461578ed7f3b7fd77359a4720020635f074fefbbdb2cd8aa8cf8a211c0284d546932f0ce81bbfd530afb5effbdc031120b320f4148938154f4ad53f35a6989928b655efeb8b3028584c939c465f95030f200bf41da91a73f9b336e8b468f5f2e0f3c7ce63c6491104004a4250eb85c80312c28deef9163aa2d6e87e94d5588d3713ff7f042f8480ee17d686132aa86a2a03276d0461e06018b951f052bfd52da80217152de35b73835fac60c47ea306e77e14c456b8324708c81a337a5bb54a758f58d9088d057b50c02c00e185c700234df92a80964fc8b6f54f2806622237f8d16bc00dba9ba5edf91aebc808a003418ea1f34c57424db1d0e579fcb491df81c295f6c6b67397c0d99c0e991e95f3d0f26a8ee7edb45ba3e1d686dec5d572bb411f043d0edc072978a9df643b392dea62a0c3598fd8223eccc1564bef3c38bd82db43f27002a7b92c0af0912e6781d0fbe40760ae0c11b6340a52967d09b0b4a0c19a62536f76e41e17a6cab3f4abefc51ef41dd337df10298e0eed80594fc8c191f167d5a01a53a9ce9687d5dc8f11994557e978cffa07a3ec62e22ce4be99930114c1f5334fa011d2e83dab0b53fdab145a6acae1553fda4755380133e367d93a49e10eef8541f8f9fbb8df8c887ff87f4921859fa2f532fa339f8e11245cc3fdec6a2498a99fc6c43e73669ff7edcb38b404d8ee3552f82dc685b26c985c99c5d1d668b765c8c2210f6ab27b84b504d8a59a730f32f83a0a36d0bc1204dbf93da22762dd4fbfc75e6e56c2b96b8ce8b0a47cc8ddee310e40ad53d4a29451718813d20a4fc84ea84b80dc3a31adb89b247e905215bda5fb2d114213b09fde3933968fffe8a065d2ff7aab0de54cd1e2f518b3f0c0946960f1debf1e6972f1b8ba56e8bc5e765ec7a670db6f485e30bdccb3a53fbb5d0d037e9653f3b34c13181753027f94f39087b834a6cf75525f28a373f57c1df9d1624fd6da4fab3800ddebf05136f7a380f6952c8e6ed8a85ed7d9a18f19deaa872d260c0fb4669a23210aa7d34b88183c2d4e07488030185ee20ca99dccefd25868f9ff9e654d540b798ac909124f3e6b437d29be08b883a5500fa541bd8bddff13029a1189e34117956045e73261117cf02361cb855af7c7f5818c11d128943509ba501218f1a57fa590a4fdf31e93e650e2f455c50097cfa224207ce1837235234b400028b3cc7e848e17c889e099df0124473ae4d00acc027513a15954ff0b618a75f3f94572dda4eedcce4ba2e4552d0b727651ee06e087aaf1766044ccd82a39431f13af51f3dfafc341c0007f6e8666950557a1cd36d1762a438d37af45addb36fb8f851c3e3cd34ccbf21cb831da1a8124e6d81962178cccdbd3e720035293c2b2366ec0a7de334cbaeffc7b244fb50c7ca3e2d37ceeddd9144a7b295a013cbf0c1530dfd2362191b76eafc859ffc493dff0a150e9553b09a0b05df79611fab87326ea6f4f61338e941c177266f481627287933d861cc4ddca8b45d87bf702416e6f823e158dfb10bae152bc7ed1b9d6712f2cf20c46c4af4a62a739477958a0a3bb145257b6c9c768762046a6ad87e3b66187dd208e9da9aa25b5ff6656efc52708db0d0450ae0b2f1f14010be49f5a572f42b6b7de1c31c0025fe1abeb61ea7cf524c67b1dae24b6784416356f92b9b476f7031fbf8a4542c5e7807bf26310979e3b1b9149a304633160d8107598db08edf91b2295114c0e1ad92c6c6a5591fbbb40b10fd597ba5c0c55096f786e5b6a9183a78f52d6892b72803768a251b97aec7d04073fa93da6ba22630322d50af0bdc9c526646bdb485ef4473b822cded1f4c3e6d7442f342ae1f5b1508c9fde55c08bed22d4b15cc102674f5d1f7cd629e5205aa38734ab0eff553b5968630ecc5167360a590e8be2ac0f739b19445faff82b01e931be1f2c09ba87c17f4954de1df498feea6c829276748fe95268abff14c19e6ef9cc57dd960010af3c8c57674c73b8888ca4cfb40361b8cda758d3377143def8252942d4f6926566c778d71efbabdf6463a831740c0b82e083e6c23bf3c66a31a39308", "ac0052ac", 0, 107574252, "44cd030ea0b398afe12e7e709ece0e93e14045ce1dd715a9c8a19870a152edc3"], - ["82b8f44101da90f7080c7767b6238427917eb58b7d86ffd5380eae5cbe0044fe194bb816e3000000000500ab530065ffffffff022e2cb102000000000953ab65656a00ab635164d3ed0200000000056a52526351b75bf805033f2e3f01000000000000000000000000724be09c4cdb92bd4e494cc5d65120dfce62b608473dc91fd6b97fd82531cc08f30917e475ded1ea55e3a9aa1523b918d170bd9dcca7117cf112dc61f4c0c24c91186ba7ed2eb056b6aad78773ec40327058d763f92f29d96f20d0f8200e32a40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054a916d3b79c1fd63b9264c4864cf61a744239e9ce8e5cd8a8db76844e6cdb549f49b299383985803ddcb9e92bfb38679b3d579744e06d83865e058f8a8f0ac6e4468bde8a8274c441fd553c0c712da8ca8e1b0bb5ef04194d65adb2ac40281bf2076b97f4675c31790992ec5fd1203241cce6399c6f2be7638717b24d166ade031f69cdc897e543b26dbfa19c8dea80c65bf4913160285128e9ad0a6fafd14682021099785a8cd6e8ccd90c534b4500039c74bb36dbb50d24a3897269be30a362770b2c2da6baedd2f307dddbd3b321b9fc08fc50b85042c6ef1bc54c4dfd251a9c0825347a16308b554b85798a6baea5c0a5a0fbfaaab2881077953670021225b91403036a66de053cb953995cc389266c8a0bb226507543552a8d6b777315179759f3022ae345dc7fd13c881ff482e2a70f39676ee69649fdd5a6c4d11debbb48d2017a022544d415273607b6b84c209720c2c297007029971eab04589de2e50ed3adb9f20205163e138d09faa055c3a39b1a87fea1eedc84cd4b953f1744c3133ebf8a775d0304ba8e37861407f6f673f674b872a1b9202eba778035e725c917f4efab688616799cd77519b65ac863cb553ac297e1f8f701aebddc6918771add15acd328e237d6990ca0b5ad54561677e6d614f3c63307f918d0a071c83f613d58ea5a939d49891764c9013e7a8817baeb1cce3ef79f35290a9361cd47eedb905acd7ea011ae358441333f3ed5d10c8dd10d566a8d01f0f68947a54dd74e1a555000bb3e0f2db5ddd08deba47441759162c66455a24e22c59475a6861d50440185d233945b02a57413204fdf9c267fcb65ad5a94d771a893afd56c8c061e80f81e3acf00b560d87f769f67dcdc3225288cb6b605bfa93b37e8336964d402bd5982415a154176407b8e7b46f1f98e55abc4e9e0eff38ad7be4334693dd5ef96209cf91660e17be7bad5f8098da88dfb0c4045e74e094c30c8351b6d07a95f149bddd07f6b3c975155fd7ef2b627559c2dee286a7bb38cdb363522ae1cb4539d0291cab4c4be1cf6f0edcdc49f33905e1c5621cd4a81a82719e8e3e4867c5be1d932d3fe1cbfbb5d993b1d9da27b8f77227d5858dde217ef768fa0f1c05d7de314b24af7d66a319d5c8f260352ca0b58a8c0a14a136c5b99032b6994660bfaf271b3efb355c162707cd237b8f5a601eceaa493c03d9f8684bfdf04ba331225d341d86abd356cc6835a8f614a7c8dd93e5c69f1de8ba3cf04de16fabd6e5eedb9aea3236093376e75e5a1b20dc660bac661a41bfa33dc6a2e89437a15b9ba147c60122a7a1ded8d42ac38e4bb34cefd353fefacb6c911656e06e5c9e85898945cfd03542c1a537a75fd06a7ae40fd4831f6048972d745aed8c88f46393ab0e6c9da108942964b89bcc50d731bd02bd4f390ac35fe0501e89f86ca1ca79b849e611eec80cdebb67d24408e7f217e495d82981cb873bdc71187792423462b4e48858c0cf8e989eaa6df83981a744d979baa1d9b6fcb5fe4eab9386e8d65604036c64da39edee127e85be30b98ef731287f5ce955d6a234d49da6280113052ff455b1a59f0ce83a45403a4f92829fd8031f596a5347e8035ef52ebe28361c28f40948938ab9ee55f225f07c980737a0afc912e77a01a94f46babc19162e1ef3a52de94d0170a578f9f1d75b8f141a75100f07752b1f7d47a8f9828f7750e6a4bfaac9842164110a64c742f2c226715c7e51fb2e06f9729a6be160dd7d5cb9a2daa6cff94bd00e44f08d69786cce6b8cd88caac39e0c8ec629d866495662fe7b9078e3ea0bdc1a3c79fa292f5092ad0cc88101ceb5a329c068d0149d953ca4e95b340f607c5d35d86dfcc7b5a52364d6c3f6ca64f316e33eee945781cfc69effdc6f4fdb03c3babd90994c4fca93f0a07661ace346dd3ff21fdbccb726f42c85bb0fcf8690f0265c927295890637977770249c7b49b84ddacb0e51e8e83cc25145c8571bc38f817e264919e6a06e8d670668ee0dbf9200ce68cf48e2c79cad2de11fae98884484888e2be877a11b1bffeb6c03ecd0d0de2e789044e8c606f6c6a29d295da9e0a2595fd2008acc47fc66ff3e71a0bad89fa640f7692fd01cc372a10b0c1ed01cc1e80ec92c895ff03dc252f7acca5d029a1db31a5dd325a59a9a1482e91c09f43eb711832d585096b46ebf27c25fc3d1305cc77ae94f2e7935d3dcc34e4584307108d8548414bcd9c87e14f8e8bde1226042efe407c264f63828e54c72a20a1edffae22724ecb55375e76a917e8c6d86ad44c8cab53678eae040000000000000000000000000d00bb62667a002cb61cd0fde3c6dee524c7e4fd7b526856ce8342e88b45735bd5fbfc6dc9e036accca287b3fc41a16485e8460f3ea183826196bdb45f68babbce0cea5775f4dd25fbb82ced95745915b7972ffd83c2ee22235a9a8a176481b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e4b7af4ef33c819679b560eaeaa7825293859076ed47d82b6c28a7b69701fe36cafbe61c80c9480dda94cd10145985915c78e0b13a1d7a023bb426327f707eabe1ed4dc9352f0d041e02dcbff217af210ae7992a6522663dfc02067b2ae04826d573e28705a6b6a8097a77ea5beb74e8533875cf738a62c755b186ba26e979b021d6d7f56662cf581cfd2c296784ee88c2c14521acdebedb0c04a91a21219490d03115e78271b5c03d9802edc055abbbe9c744c94bd10118e04c228e0384d9f6e250a1cfda6ae6861523529e193d4e738c48731d97f92f33fb056111595c4c582e48d1c1780a39777720a6125e4a4f635bbb39f9291d704953665edc36e096ddcb2b1030f867681bfe57e6d64f139e80750e40e1c405025fe3442d754cedd2b7b9b595e0213da9b831f0ebe9d5ec7da25f057e00c9caf8fd2d75c8f50cddff84b0189ee25030aca94571336a048b91250b0f6514618cfbd2a1011673ee94cb7bc8aacdbe8f9030089be8504d09c4f6f13e95444eb9ee39fa88b03022b0b8f8855d1d70f6337fb0307c72e692bdd5a0b24c9173611acc7a8bedb6256bb8a7e040ccc452e3e228cd1e9842c797b2058bff2b656ed7d8434ea18e4bd07160b7e7f9c63111d4d6fc3aa55733e22e589125a129c04c78aad7c84d76f32d72d3ba2ac1f479b74ceba8be4384306b886359adeab9258938214bb439a6fd2a196f1cdcc737e79111acca47da60eafaa73e5777a798f66b5f52fd9161fa061735eb391290e50f7d00970df1d20d1818fc97d99f877b81f7d0419bec687c08a7b1155c93a96a1c720ba9136aba523bf61acde31d99895074f247f1168af8d9d9de55e909e1a1eff1f8fbda24a7f097dea701ba02ecb6a3629b28f15a731c62cda6d7edbe0e3b7e6b57d431eb60968a1491eb3574a3d81080bc2c315ed2d1aba04657cf590b6721c280948962cdfcd2189190648429bdc9ef31cdfb36e2b4b3981f5ddea620412abb1cc52eec1d31c5ca31e1ea2b236c6310af01ae5cfd11981ad6e3be3c45d96955acb15d7f95f4fb98d8d5b55d8da8a4d25c57a3b699637bb1edd12c36dbc73c9af72819d8ada0ebfd222b8b1bd99c1c36fc3ef994b389a5b6eadce9a83cbe48d12fd9249acff9cfce4970371cc534553c342b415ba2ca80156da9f195e1e963a007e377be989257bb7c8fb55bd6fbeb54094fcc565ae74eab4bf5880210e4286d98974ed439439a50165bb38f5d8884c7f80da209df20e6fadc927219774301490207baf9fe1bbb12bc4f00997539ef8880b808eca31a82efad8d5af990fccf05712616ecd763a46cc5795c71ba989963ffc43d60e20f07cbbcaa693ed35bf227b3c81770beac95e22bdf3bd04e723d230a3a1a763b5ec27e036d37aef61aa42470cf338810193e42ff5110093b1bc4a26cad07006757759ea3deaf1cfa064b7a5fb9e6c402b469c0408f80f51db952e22b50c52b4ab186ef76aa2e60a93da85e1aa2b9b4ad8262a32232d33f2bf1a459a72d298450746a724b0fa15fc555dafe6f58469663126f36bc7302e63b941ac33a2adc415b244ee98c0438f8e2d440f55a4b1529880677f1cb4e2a1b823d6e859daff89b0d274ab3cb7472d1143cae0b471fd1b1c5c01ab824e0594f91968de421b2c666a904e4cd676aac4d22baf503af8883b5fe6b1034f892e3032e9c20a38a03bb677b5c0ff9c5610e4163e2612076e2bca3e016b4df2f3be5e9eefd499a7ffad01fff939c56b5c6cbe7bb20e68ff1aba69c71b8ce38185f876e573546149cde481aef73ea6fe75dbb165931e21a49c2217b21146598a5c306913e7ab6cb82954adca71064828f042ec77ef3405261a376c1993278288c49fe50ffb9ebdbe0aefbeed7b52d0b2e6f442b5bc6ac65bf706daa8cd94a01da5d6dedc106eccb1ef32032bccf52bb291b7ba80b9f6f13093ed5b73057ef678aba8ef861f4203baec68e8d698aea88847efb15fd485bdcc96317cd66822aa075aae1ffda83cabf554daeefcb1f093823d7ba3866b723d18ce3b564618fc318d63c8b02fd016d2478cb1c91ec598bf22a396faad0546be55935ed1422bfbf9725bfefde535a0809b12d923f7c269bb1a7638ecd965ca205d5189752687a6d5e04de91528f673f95265a532a5133bdd585366c1c14146910cdf40044a6d80946d6739c16f96ebf59dc8f02d980962720d67ea100ee601de69f5cbad94ef3bf00d7489c202c3f050a2ec398da3ecf4ce0ab18e75ad1eda1ba2f0e14cda72e5bd8ea02b0648c90c78691715b646889b00000000000000005072870300000000fe8b82a1fb0ae1435d83e17e77105d2b2b6cbbf3a20d2e4add5c4b477b09da7e997466c0359f414fd7b462e1217f36899e82f9124f6e9000bf83a641b53a03257d28f7d650d19c024af4e6106d801f8a7295bc7ee7aac33e28cfd79424d955f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a01d7d614e4b01729430456d4d07007c9af47df247b71e18bb1646a7690ae17a1d052c13201ffaafe362fd9657996e4283393047d218187022830c79d9fe79287eaed55e7bab619981ea857947f5027e640980f818d4d8a1fa77d5af5f0d102a7704ffbe18e20aa2ce1dd8256081709efbabe7176736fd7cfe661cf89861cde0201b18cc330d4cc869320604c4800beea2ac9cc6b7bca593832118c2e2c4af465031fd8a1fa7d9d411bf2a7092441ee24f60b136a77edb972745131a48a5360e8bc0a169dc19450582a816271c87c378d05b5599fbba323aab1dd5a4796c71a55aa3614d721113d3f82e28b472a0a155c73f75c34898027cdb8e9ba150a3a9804de8f02254d11ec9e778a6c1272c4a42a02b7e6a0744504a2d0487fa75062893632bcf60318371b85cd7fa59b2e79af7efaaa26634dae94102a5209d566230c8d4e0bd6c4022a187d0e779920dc86426fb45decb58cc8a1a2ac70a1e2dd3f33175110b9c797032551189ea71f515d9f157c97e489dec9fdd1057ca7036cdca90b5303953a3aa90211d66f615bfe36a784e241bdb834b395672cc9664ce2dcd15e1b5492ef5384b2b1040af81d4e15b7b82fba6a96eb6e82e73a4a9b3154a28e1c1862919b990c10a017be6ff91177572a5b10025e47a819e051bdd7713e656b794bab7d34e254b2003897f39b23c9dd62a0469087dd324b71c016302a349e85f27ddc190dd984267717d22c2f53cb1ffac17176d5fe454c0a7fe485e2cca5f0c9d285e4ecb9cb6b7177b9e43d5d4df178f61dfd05f5da3201d05847e69965d9fbec2be34468d2fdddb52c5b2b1b4d91dd5890cbd6099a686931bae577292f37f82d455aa1341b5e6d36169a5a1283abdb00c46a120ed056c4110db1f1de8369d3f3add7cbe85f7760182723d7307604a48361e18d5b494ef9d0f939a0dfef4e8f21b145e9c30bbf829303034b40a3c18327a5794754a158c065568a909211ab4e13a64d6f1999d39448cb396d7b100edd0edb1b14cd4afaaf2fdee78b476d5b57d7ab9721b0aa454b791b990374851c5fd6d9d23eea2d545d7eb8b7356ef47d370ae753bc9ba4f9be277c4bbd84c252571343ec50fb11fe29536188055e9a3e7d996c3bd31f8603f438df2cfee4588baf79af4e9971f6a308213550f1710477ff16a7c2f9db26ccdc46568c96c201eae9f2d9d15fcf29cc8f964793bc10c2afffdf84182bb2d566e2af596ee9d149f7e351e1a875b57fce7ee780d4dbd8374052b0929e09c573968adf4d030c15023a4420b41042258c2f34e6e6a4cac97a630182861dff375e2a70a0e138fe9c03fbdd18df7ea774e85c7025343a69776968eb731f8cb2e52a9bef32a3599506076f8d5364f1162a15c5138fa14df5da541ffd6f556f967175e261e50d11ff82c2f205d5ed73a136b8c5e54774824cc93eb231de4fe0ae3d322c78ba47c48e87d3cbd0265e5a4788f41001181b3550eddbfe0f27fce664c6f6975fca9dc8fdb7c8bd312a1887be3d97ea2a8bdc8078cf12eb50c7d2814b521168861ded1703f4ebda6458f56c47ca9fb9d721e9f08153ed4431dc945540e445d281b8085b1da9cdb40c624550f596e70fbe74067d8b18436b23f26859ff0d2e38d310bb4619a4544d9e28b268d2366d98f1c282a66fd7cc680bc2a426e2a4fa1ab6f35f934238412ed7b9d46248c95e7628b3b4ce282077bf99c7fb6e3bfd7320e866c9cb37d2226a91c87ac3f84fc3b47b6cd8fff5a44231a36885770b3e4a926924f670b74aa723913aafbda305825eb86c213399f50d3371751f02296088075cbefc9110b7c07dde7ad1a6b78e622835271dc78cc3217be84fcd4a108af5871cc2b7d91bfbdbee12a254c241a9e4203a2494a11907705da9ab33cc5a78e88cdaf33eac188f8df9a45df5fec4143db19bbe77da5f9a0206d648da69307b1c56ad2a119f0245cb84e300af1adf36a3c88f5b9f03f6b8631a1585fc0e7768a6faa490961c1c4b8f1de6a296de97f52f43f7b7f2d060d1e4807a8de27dbbed473839e7aa0c8611fd2362b647a4b050acf04a13e1476af0241624ae74a997b1c49cc7a136025e9d3bf6f6cd8590ee08d99948b2dfd22709546ee679e41e7309c71c58b9e9a1be13daf56f96b837d2c2286851919cbd3944ad00960cd721daad9c25bcf43fbe749e770f8ed734d33ff34cdea1a3cb9965658a9bde4ee684a8551537f138d672e41f60e47be959d9ac20dfbb17993a491bb339f45c7573cedcc1c3c9f70084b0832ef6d7f35cacacb17ac4e2c7735219050611a4860779736135ffab2b8c0e925a28a68244081abe9abdec702d7444bf85ee430ec7c954d54085f1bfa2dd7ae64830731a650b4362076a5c28ec559ce3159403f1ec993209dedd0faa915556a84f3e6a78e87637edb1c68edbcd00", "ac656300635365", 0, 2062427382, "9fbf4d6cc85d27736a3ed295008c2bd2a0ac3526251b866e074aa4330f19fe71"], - ["897afa3202d395fc3e5777a38fed5a2ea36ab53ffb0ec25cca8f58ed23440d1791d53230fc0300000008635152ac00515253a0898f9217fa68db9b150a3ceee7ff97fdcb9264ee136e76988f22fac841d192aa1b91af0000000006ac6552acab52ffffffff02ffbcde02000000000163f3a33400000000000000000000010000000000000000d095960100000000ee41d784990f73dbaa548929269756b252e3df85d52098495fa0431525087a020a7bcddb962cd9247fa75f2dcb5d9fb633715d1c3c01ac0715114dd7ff755f71190f398b55582d49ae992dd09e93597f9e318396ad40471d0e9dc524f472408600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fc41cf1799399b0ecb79477f344f998fc4d52a955cbf91fc0d384e27f39abdde3c04bd6db0315a20f316e76116b0f55c9795036a1c9e7055e12e9e1c27d49ffbd9545c84e19a9441ccc2689ba7387e272e911fb9b9fff8cbb416b71d62922bf57746a1e00598c30cbe1028e7b21b5d749f2676f401473d8b05b1807ca4a41a95020c9e9aeebc9a3a2a63c457dbfcfcfa51bd3dee0b4d24c8625b14fbd882e95df8021f9c8913cb5a511515422949b897fcdb6c5813ddf51315e3e2c5a41c3e3c86fa0b26bc645c4b27eb1a8e3b7074a5de810fb029a7dada18a7d8c49ae4579d4064ad119278cba753bc8df82060e67a54ed7494d916b6fd6556034aa4037b02a96245031248e36f0865b0935dcc0eba7f81cf1bd6eeb75f0f517996e1f4b281a328e38b0226c69db42e07ed7fe44e0fd8f44ea07bcd0a0810f0fec9db78a0509edcd19f560205b8aadad25c1976be265c698918cf157137cf9d7c8551de21ca6301a52e7de202291e16062f93928213aaaf3215b9a9b63700eaaefa4b33dc9b25b49b19d632b8031b4ec7467a39bec293d0dacdab832d16a055cd94de5d761052224e2b900b3caa8bd363166e82de396e3b2e8f18832b591f4f4eb751daa913681b23a980ba1ee43a8baae540f97502c1f2576412c383bd7a79af4fcb0386f6fb0b47d0f04126e3801acbd30a88df65074732ffc77a07d7077134697789a0c043bd3aa7f877d1529297fc269740a5459ae0b103357bf0cb409697027e89150eb3b1d6ab61293eacabe67ecadd700fc6617219cc9df797a55d51d31b54a6c2d5955cb54f5fd28b300b3f049f95d7001f3be197a1437995986e840d0c1f4a71725ba1531a350ba5142b9049efb98fdac264de2643bc5ead18ae14507409628dadadce3c6a66457c59dad3beb3c6354161e2739929ba84f5a160740b8a16b3b3819f9d6fa26217b121b5974cd6bcee41918b2bcb1b10858856dc31182c5310cde8a4044864a636151cd435b08a3e61b49a18813f55392e03cd744cf4c67efc9f97d350b70b850c3ecbdbfd135c64049cba4ab8db8d9da72e9d5c07126b7aa4f2dfdf470d621bd94735223d41500ea8409139c9ffffee933bb15ff49c8f009b29aea83b9d86d0fb57841bd26b82866b7a6e7a4fe400487711f19fedb16aa59b346b780266767639a906d9792028a6b0cd9cf9c91be1eac6c8d99b80a611fd983f8e420acb9efed271e830dc6bdbb60d8b74c2125b73b492c694af496d38dcffbe6395fd50b208b0a4e7771aace630e6c82b156100097fc87d1a3a1fe739ef3a60ea48b1827b5de9ab8fa0464988c4398084d1ee5b426118f5cf8a7ce26034510fc905aa48794ac16bad73309391a50b3b4b66307f2f36a87a96e1a024d69b5e16a90da67023faf33e1daa3859e38a81e6cbd642d6939866f8f82a068f3ea407cf7d03376e14e3e539a30b3c155dd08e43e7e6d1ac82ca7dd5bf46f2818dde6d43a6f00576e25fd006d042481b57eb569def219d0c55c8f3e0c6ba23a9eaf5ce9a1008b06026e57a8529e56bc536d852739bf23153c5c55535e0cf7b30fcff40818a31b61bee6f7f72f390e9a2eb6a338d9d3305a88925b0766d66a707a533f1a550426a9a749c06322aeca698e861b63b68766279ade8488f8dcf87104426454cde486de2f4c33be4ac9718b41c8593148a2b127527487a919f21625eb37a41440506ae691f2e69281210f74e6d992e9e1f662a60c88b859ddb137767441eeee7245be30ee2bc12e9130b1847790d8e2c0bc7309a3ad02b365638779c283f641fbf23159f92de82b8137ac3103cba61a1841c345b06cd324c38e6b11d55f89c2e072b062adb91db35efe4bf01ee41cac22afbd2ebef77bca91a406ace35c693efc6b08ae7b8315466de6decae705a55b6c3ef03a356e57238d714e3177702cd5fe45ddf61d72229909ea6a363a3355cc10f290ba53f2f7ceb1ac71d0bc5abb0232685ab6c6a688a971be2a2a2e5b41467f8b2ccda1fd1c506dff75e31b73bcfc78997959097a148f826022147797c32db852527fd9106a7dd3a621d5d5cd7686b9d23f01b7dd750e8532ef3f21d4766602c12bd56164460e6405ff426a58e60845a0b9a7e32a53e0bdde67da3723f8804f256494e750e4ac29deb32cb2ead83fe81abff8532ee3f7c3c441aaabc4b325773cb4b4b3b59ecbf76f5f33b5a00a102250bf44cf67c492ddc0f38007183f1282ba1f812669c7481c09fa4ed7fd6444c9c8f21b1d6586b0fa999ed1463f577c2d35585e233451f6e1bc658e7cc15dabd9360a9cba3d641e6ce296a58d70770bc2db17d8d8b1394c28942b3b33c401a9e7502f2a41a24a09313d73bfef46c77e1b7a22199e29e24c41b3e789c4b0ec0cb7567e54376272fb981f4e46b3fc2249333915ded4e612ef4cee60c", "5352ac53", 0, 189443197, "c77c8f76f34597ba7339847c389f79e05c3cb6ca3d96929110a4f29a3cf43783"], - ["1391e5530159535a6a6a032194214f67bb93c70e68aa738276262cc4210556eac0be3d76d50300000003ac63abffffffff023917f9010000000008abab52ab6363ac002bbbd8010000000006ab65ac5100ac00000000020000000000000000947d4c0100000000804f4bec660523f2ee9377d5d3a9227bc5c0c3010f3b311433e1b4258d2ec37176380e6e46a26a5efe8a5dc99f42a8557dfa25903a4ced01cec005d5640758ecf5cef6d0c949177bedd9d5b8e8d52cbe55c2c09cb1d503cb938f150f6523ecb400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eda209429ede09e67f8fab9374d07fa4dde784012e61ad271d841f18e6b310af40e9a44ccbc77ebca3357bfe84fca49a9c8cd060cd8a6c5ce4743ef39859b44dcceae6613de0dbfe6e94c10626ee11345d8ec32858467913836e2b8bb5f43ef0e46e2fc1658c30815f6481ce39d57ddfa620c6b43f820dd011f5e73f6305a7d1022a39e218e417f2783d431011455957f315bfbaab18771d6d0bc7789d42d9bbe8031d84c0d497f647226f0fe6ae4d81348c1f2b2721a59b1a145019e06622a1a4610a1270c4757aff8836eac3836ad2b7e5bbb80ed796aad6cedeb1093bafceacb7810c11ea358f1ae2ae308a3722b46a72b375ebb59946343e8b1fbb6c8d7a6399ac02241e6c1b91ac88d845fb88f0012cf4596ceae0494cd630ad7c3917a777f91eae021b83b43cf79624dda5c6077618673de93d33f713d13c0ac6e7148eae2fdbd9400210f464089032184e74d48271e01ce1d809d8184222965a358ba58dd1871e94a70307ca646f770c5b96388db8196e8d58157a2411757dae462f8d742b4ac39f9ce40323184a26ef63847abad34ee84179561c3e4cee168e14a67e0dfd76c908b801db94f4d79c60119bd475371abaad7ad75fb2d512dcae6be06c71ce6c192bf41f20cd6ca2c4997786600953fff7a7893b60b8266060cded79e4f7b80c5a0f089d95c657738efeb9c4661bb02e0d2b8baf3524247f9cb6ec4e12742ef04d568e9905837e3db3e399b96d5f2c39cf472d01ea6df9aedde45153cdfc5e027e99cf49290a703f88de34a0316b457c21677adfba828a00e55d8f1defbd1fa6e602d2e8b511df7b87b928f49a5bd648559426aa044e8f1264422e5514abbacda808b99b4988b1a634d14daa154f9e99aed27111fe105dc9fbdf44ae99da0767bfd0ada9733e08fab9a64eeb8dd2f5ed8aeed9a93c2fbe3e3b6d330442c776271666154ffc21c57d3aa8af2a826d9ce5b9e7347b78db6081ca6990c6ce4cc877e15ea4f36e7833c4950e374c369e0d72f559b8e40bbb33c48fb7dff6dc71fcaf96f914a7bb90ea06a1440d63516dafebf6e53efdd82cbfcdaf11a4e0f451f5b247e6679ab61a6cb3bd5777c455428c80209db3ba770bace7fb79cb73ef68e30b20b46167be8030ad7120643d71e33b2e2059c1227c9e8518b0dcf1af56494ee2a0d11ccf5bb24ff0c0e7011060a41d10f70c0701896b74a4115e2d44488ec7799ad76be29afef12b27391fb30dfc2355ac3f91a98e093456be3fa9f4e1413b7d50448ba2e0c24471658dd3e6ce53df345ed1ed9c4d851d89faa4ec0693d024db5347bd8beac3a3f7243cad653a962c5b6c9991e0f89c5aecdaa12a045857149e927da259a8eb1949e0ad792b0899c24ef610979c2d9d927928951e3f5a491b2f648e9b49f782a2bed2441b71ea6708bb793edf2364168da195e44a883068738d075345d3d2d2846edafd8c846db226dfeb0febc15e6366c39dc6a438351ce803d12bd4478cc389e57178dac6908704604a5be6a49ef1707f762bf0d1aba2bcbb6110aeb232e2dd972e12eb7ed24d11f4e6198398c979a67208b6cee76ff24c889a7f02fab60f6b27540764adc1410ca088cd63c8483b6353faef4d6b51e37ab0a3821275154bdf2f6aaad5b6afa8d49a07f8e594954fa9f4b86fe783673e1ac03e1439c6d8feb1780b2fb21c9243c4f5130c173c3cb2c179655aabf169d441daf427aa1a191e3c889b8b8b0d470f3003471af6831a2d984ba4167f7df50c4b4c5e90cfd385748ff280a88e4336935b3676dfb38091c17e1a938ffc79bfb1151a443b9828f3050381de0337d995c1562a34168dcdcc61c9a4501c5459de34062812330884f23e1fab6c7bf42b05ac161d0659319e365e9c5363e48deded138ccda8b5c517106b6d60509b25fc17bd28c6f14aa62d52bb57dc0dd894fc92f22e6d3b3c4e047c47978c92220bdde8747473b09f0991d51fdfffb515eb3801239bd7e8b53a8d70c2fb43e1bd3c61f0f25c90304209a7fd070c1530cd7868a1b1542cb2beaeb8b4d5f6812e78a7b1ebea4d3e507d831200b5661ae87e44cda6fdbd0a1deb86abf1f915ad4fd8ed9419e95fa30fef11027205cfe982d9ec4ed8a1579e36527a1c20ae0796c8f3c0e087edfff6bd7b0e4b359bc3c7cb57f2b5b29b060096b49b97209502f7ed85c0c6f29ddfc1744ecc24030d30f959f532be9deba469afcb8278d6d81a541e02b3c3035cbf25b01fcf9100d94df47f31624483622b701bf53781ae92fbf9b70a06cf4e400c7e9ef11cab54c35400000000000000003474fe04000000001e30bb534d5e9b0c12a83ec827062f1da5576d1b62371b69d5090d0ffae837b3679ec4ed63e63013c7ad87e8e21125201df350e9eb9658ee8c94e2531ed06547b4e8222e05fa0bed13a9a151bda4708aadf0110438ccfc60b3fc6404ff26240b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c4c52724aa0baf0821422a0c7a2377dc58995a0b12f4ad6c4636d6cc255a49e971a64fbf52c881afa5e05457adaf498dbf5402181e99344fa303af6f6d75013879fd16e6c566dd5fdc773fd123fb899366341061fd3612c2301dde913495c7546a32858ad8c4e5af95ac5e822fe7b2aaa144e721c11b21b2c1ff27831b90983c0205b0c02744112ceb4fe5a9e70d22c4a96d0bc87a6c2a50ae39d81ed3afcbe4d30220fb807bd29a63fe52eed2e5c11a9c9be9db4f51e4dc966294004d75f59ad2190a165776345ab89b243aab8e89a56d24eb8933869ba1541d5a9cacf425657ec1001e163743a39e727c7d9887900b756a73546e285bbcb69219c22bf2c3cc8127990217d1a876951eb8f1bacdafe74a0e64c8dcb402c9832f20ee7ab7d3b3b59f9192030e1efee087562398f2012a6955d7450372eb06c2e23a64bfdaadcf9f67c5ff560314422e7a90568ced913df2051300d0d917d2bbf6168392b826f3ca68776a294a0320c9cba6af48c1ec86132a7acc3a3bd81f47e936165f240120d19eb40a8618f7032f4cfdf840c641b4f8ba13d20b384678e1107ea369872c5cc61ef5e939cc443f32136927af9597aa14a673d174915ec75e14ae73620432d12d9760af27b9632967213e54e0f4b4a406b18d3fd7fe9335cbaa120355a8e36748fe29d98e56f62bfc0a8757dfd0571cab549f948952481ef287b464ce5dfe02adfa6dabaf322d0e8951b8e877d6a265c6b572c5fc4a732fadf3271b79a04c32bedae84742e373d8d8536c63734d51da2fbdf2624e6ccc425e67d5c903f7df87be204a08610266b07fe27493703fe8abca77df062629a274b89d71a4164cb70abd6ce653002f92ffbefd87ae0be47f45b746408d35c2fa62d3569ece89b487ab99a42b5d0e277844fdd839df0b9f639dffd72dbe9d2cfac156b3d99b58abd70992899d624bc508eaa13f9b42b31ba6667c755e7428f67ab4d2a852174b961881b7adbae47a6cafb5393ba7da9ae8f791187f397dc7cefd1a55e4e6bd9425933a44281f882c23f994a5c494fa97918c8e50030362886e70eae0c032b61ce4f6fb129d67256c34599fbf798d1e87fb68c16b7adbcce095c372ead324af85dd093b183b7d160cd9fe93e5d93fc400a8e6a83630415672f7d82b12a8cc84cbf68f5e05fc0802c7dcd91016541293e20710bbcbf15380e641a2d9940bc7030ec6387b1ddaad64aac3d47bdaaf40bbeb0b74544932b82f01a35d89899dc247dab720b56c486cc036f8c1c67cac65494be3530cd30d2bc490c9b9b016566d7b56044b61caad1e616c86a050fa1c7e4f65bade82973031f4eb08de63209befae479c598d5ec57f542ef84d940a9508035c635a44520fbbd8d4d8264a48a88f9aa6f8a2127cc6dba5c3dac18ee8fa4ef4d2ae4b62f9b6859171412551f81f897a13f23e8791a21ec0437ed53ce8235b3d370704b197f19d6a8175ca2644aa955ce4d017fb54d4514b9ee20a7b6cabfb56c2df939efbdac872369a87e1af472c57aa2524a50196a1cb6561a36c451e37acb0e4fe1796c24f893af350b621170f83ce81fe8f63e25661d57849f0a0655dcc12deaf1a8e9e6e40996b4b4942f8b6d130d1ed0f1e3197f08faf3481aa6979ce839dd7a095f6d31eb7f68ac1ab1d84678952d192cabe5810ecb50133e2a90a631c5e680715c2c360286c4831c236ede55cc8782367feb887426ef0b852ec3d8c2cb3baa86e91bba7d8f58c313a2f40f70beeb4d8d8f464be150b49356508fac176798c3a1470edb9e762c64a92b9dfb151431b18d826c4b63a010b70c3a24dd408443d8116d7fcc8efcae8509c9379ae2f78f507bac507051332240dfcf045dd520fcc79b9af4cb13c86384e31b31282279223306e5c76f68685c2ae723bfbc0b5f9da27ed37d3d88e227da72b673c9f508a3e98dde620498ea540be6ee91a07980f898b5ce2c16d80c6b18187db220f9492f2f62f7541c287e2709951d9209b010ca1f5be87fd737b0254b56d19c218ae35146aee108fee97293a9060159672ee1b95c5f388c5ea09f36015944f62dacfb3bc92665f0712562b2c22549925903300c2f4184e7e8f5f53bf2842526b0212c5f4f9073b529b29e4b67f29c673b508777710af6982f4e35e71486880cde2efcfe41f3d3efeb91938cc92b5c4099e75096b0cb0d666b39f2b1fe6d6e3e05534eeb32138501138d1d172d423ec4e52b7f8a2f104b9270dbddc9c6d41597d57085300b0ea0f3516da7a3026e140f4e6dccae69514149a1861023564289733bc969d56e69718929d5323623c7ae8b97950066630757a320a0a67fd780fa424afc5fa4ad19673ccf8629e0e899fa96f3fae80498e36ddf53bb1e40cbc2d7e740f2ca494d7d41476558492935e9699ca4e0d25f8c29233f5a976eafc09090d", "6553ac63", 0, -1016846359, "cc30e5b1d01b5756264f78559c4252eb9abe2695c663ee02da5928822ecc2a68"], - ["0a33374a01adb1d24f422b83575818ddf34afc5b75b0170cf976f870c4705bc0df2f5812920200000004006a53acffffffff04b82c9003000000000252525eac890100000000001283e200000000000152ad6690030000000007526a65abab516a0000000001a4a8c204000000000000000000000000c35bf3894cdde5b7c1f26ea0cba11bd16dd6b0f1989a847cfc4dd204e2f218fbfcfc49fe5711475e970290c3a7c1fa90d5d26543934fcecbfe98cb033709d072c0b25a2de4d25bc6f8f34c48f87a559aa50eb09159d912503c887c566a846a5c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ebd2e729056dce034482adaef351f1298e5f2247b5e253ea77946c1e7af678abdc64f9b92a94952355938f17781f964587eed64cd126ef0583d0cee3315e237544ca57677e3acfc1a11621c3f76bb3e61c03ba15c7d0ef3f611e5570b564a37770a6749e290abdd85ad9d0c714165581ac994b5c3af83d9dd253eb5664baed1030c5e4d9aa0f8c8e4e7b48e059b60244a395716e56cba7d2c3adea90ff9ad71fe031d23a7f8e70beb8c85e10aca0da72c696490ef1030e17a640c5e3b8ff53d75ea0a179f6742360163fb63003712001ee27399cb9342547adf78ebfad9a2081cc6592e0ac07f3d7a98e4b69326b00d17dd72bf1e4c5ce2c3ec2ae28601eeb43d3806031372186a4cc1b6b9d3bfaac0b33810e4b1ec1c4f6d0736c5f44c29e9f049685903145de7406f7718b2ab3265d1cd75f244acfc10d9786091136b6882874a8c09ee0214142ae42048d3f0f43df0dc2ea7a1a405066e9b60acc46330608cb4c07cfbcb022e5d237646774f6136bf30266285fcac485c14d7057516aa9e9fe82c2e5f2927021fd61c11ad28fc871a897dcea6cad291a0d8eb33df1b6f3276669ae5edfec80c66c6c97dd13b65dede61b66679f4cd677e824aeefd653832946f26ef2f74b358ed0425ce4030cef39fd9ee800f373b96b96cc8cec57d348c5890a2ab8fcbcfcd7d94315734a0d8ad8ce8a8ca6bda00f53db7751ae575f8f682b42b85bffb02060c4315026327953d6a82edb512b2205e89c3eaa0d641529a7fde6b8d732f2cba2e51c43ee7e417bb1c38fe3badf1889e572cd1620667894ae55c5917c89a23c2280ce8ada3242593961bebc644615def7b0d298a8993c9ddef51217c136c17d6c3b78fccfb373c385db6da2fb6ec58e0f640f0feca578d2ce75c26f6eae8daa5e83b4aa416609cff2d31cb1936dd9f042c7a8ed30fe4e60e575f766025498aff67755b17d56f35fb1cd7454eafa3e91d3f6272f0f85381647c6efd388c320498b48d3bd5959124639104a8d1019475f116080dc68e5c48db463c942ad3400bb95adabca079f77d6596eae2d56d964ced53e68c6b6a31e0ae437032988ba7e1097c5ec05a717eef5a6920fefe5c8138fafe9210e0f58852a66183e40df943a5b420340386e2b1ddef11ec1b3bf9e2a46265ef64afc24d52e25dc269e8d6ca2f00cc250dd7e8f5af488fe17bfb36c6c1ec0ab90147df4fdf700217a87b3bc1557de1e8719fd712693f4a695cda6f71ad2c4927f60f383b45e65456c424db799d96190cf7aa30e1b1d4a138b00fe88ab095099ef8ec7be0127094e404f0d2d135d1d06affa24af415b6711d3fef181877e0f0c0a1812bef9f59ffa460dbea205cedc21e7c859a332cf9f49042c8b428aa02c78e33e3f4387277af6cd19afb21d3154c66c36a564fa22aae27dafaa5c55dfbc989b0652de046cd2705a143e697df4d34a4782547f1364585d11516ba0ed8066b8b09393b5b33ddfda2a607b433bd118dc541c0c5e4460e922a2c34b5f2c1b33899dc59ee5202503d0024f7005b0fcf5c9a16db2ad447ff24297866d309428e991edc6b5fb96b1990c43df35b5b75b1fd85d48dc9be956dfd32b89956b7b2142049d641392298fc24cbcf9db257c48cba13565dc9a454bf00eeea69e47149bcac097a0356dbdf5db097c7ff2d59102dd5759f1ab1306b9b2cfce950d79d7a6f99c318c55010de3df76f90303c9f019c39687b42a85cee05f1c5420e6462d2b42fdc66fe1af968bba686c1aed4ef3da23368c26d2b6a249213737304c094605f344e0708e2f580e4042b33c576eeda0ad5aa53c4a01a77441ac3bda104c18e76166be0d33f7b727578147da07112754257303577d56a2b36e2c1fcde11ed51a35bf97a3c62cde227ac5472b13f4b7c1d88ec8ea35cf46cb415c26ba99c3f34a3ebc8ffbb7caf7fa4c51fd0f600c17021688bb562e01f1b0f7549a9dc423509e08bba239e25b5b72367b50241842f84f6fb28f5a10c2ae0a0d7d8d34c81a6a7dfd1daf7fec578e2e0ffa586904522747e650e61849784af19efd28bbfd6ba35644a02d75b19cd97362b64753361e6f72dcf3f039c2c677e941905a2d8b65e4f04ad40bc65f6fee43339adfb8b208028b5a480399e1286528eddb4b7c5868eecfc7ab2e06fa573035841a888b5d0652865b8c9cd2c199353fe86ca7d2524e97482109928e48ee2409acc0dc06d64a7308f04551ee8301388cc7a84fa63b888086ea6918c4c5c2724108a39a3d585e63430152d90f7c2a8a51479625c40da5997d235335ab5689503ae9569e3a97411bf1998cb6c5d0e08086f5186b1ba59feac3e7df227a449111c14b74e4ec54045b0f687cb2afc5fcb871f162bf6797d78982b2020f9ebd1c527de487e56093dff27422f866854bdc094edc07db75b589536b4530c", "6a00", 0, -358242065, "ce5397e8003ca2d2463ac14fb73bb584209eb9de035bb1624f81d3126a5f7a9d"], - ["b49a962504b3f04efd97e9eeca1ceee42990fb65fd9a5184ec2b1561c90a031300147b08100200000004ac6a6352ffffffff2b57800bd2ac5237522c76aa02f8216df3f6bdd21e35dafb3e3a41467052578800000000016afffffffffefb0c0521ba3b80fe3b894e08ccb32fc559753205b0d6470b66c6493b50c3580100000009ab52536565ac656365a8084cb6f7a2968c04a2fce11e8974916e09cbe1d8945c91a436c412b38e44344dd31f77000000000851abab6aacabac6affffffff02c698f8020000000004656a5365625bd100000000000163f64ea8e300", "63", 2, 1869610916, "e413d82152380a2268a27da125b9e416b55dfae7192f45860b57bf865fcea7be"], - ["7f42472a03c3641435ba5f5f902ea83ede33e571135629fd4bedb189a9fb59671b618e8fa900000000076565ab5265ac6a5c327bfd33d9daa303fbc17aa306ecd9a4b908c39df985f5bc5e3b1aaba68bf42ae277ea00000000085352515152ab52518152305df97bec17bfa2ffa86cbbfddbbf6449b5574f1715e2e559283c3b737cf3130bc00000000004536a63abffffffff03100dff0300000000020065d9d76e010000000002530018c6b3000000000008636a656a6a6a510097dd7a1b00", "65ac0000525252", 2, 2128441131, "dee489bf29b679e1d4c5b8877024ecf1c161a2027801e3f0e5a01603581046ad"], - ["4ccdacb3010c3b427a449fdad295f0a5ad5eec05acc8a555ae94416586c8023440429772530000000009acac5300ac6a65abacc26f1b73040fa22203000000000253ac0b4a670300000000025151e49b78030000000009006551515251516a6a61064c05000000000000000000", "53ac6a63ac", 0, -303626256, "a01255ee198af668547b3f0b23064d70add2685a683bd079824cdc8a6bd8b021"], - ["561a8ef7049ad310c6d702a64bdd612178d4a56b2c4bb958b05380b6aaa7fc941bf19e273c0200000003ac6a52ffffffff05b6c6112511efd1252aa060ca5cf786abff153197a13631340b6983c46e3cb40300000000ffffffffdb77a62027a58a3b1a714318675a41e1fa00637fee754ebfb956cc9069d90ddb000000000700abac510000510a2ba2308adcfbcaf3ad13ac29be03909d11743a1cdc3f77200d21df2266769ff7169368020000000165ffffffff02e3b0fe010000000002ac5177410a05000000000000000000", "00526351536353", 1, -1996700804, "e1a6ba8aa03bec5636455f2d49a78ba6306e4db88c8fe4b01a78b63339574cc0"], - ["c1237cc1042410a5e9f7426a0c5e1377ed9ab75d1d9701723091fea588e3d9f9e22634da6402000000075251526a510000fa51f3ec4ef0aa67fa778c64a8bce0bc507656f9c60f30bc9265828fc015e1630de16a21030000000300ac6af5d8dd23aad3ef7147bfb76b76e94fa74e8b7138e5b9a9954d5a6debe78a10106d008bc6020000000100cd39bb81e49eceb5a08c382847648565df6d8b4d134f5bb1bfeb2e6e09cd5a4d1835dad6020000000753520051636a65ffffffff03595abd000000000008636a51ac51006a65a1b0d40500000000086a51ac525153636ad55c780500000000056363acab5100000000", "63006a", 3, -647895388, "a838d324439cac781cc8ab9036b6f38f488a78bd1b814ed8a6fcb33db7c13f28"], - ["1501236b0198f6fcc414dd4c6ed0efa6c89b0841257bb2f81f96357657999926106a706ebe030000000451536353d4b739bb0249a24104000000000751536a51656aab88ab5901000000000853ac5300000063520000000001000000000000000000fada0500000000663915591a5ff35662e95ed4070177905fb57dbe16f74b6a5cf2d1b337797342f038024d3658c85e545b65db5fc0463be5ecfce3955e55c23063470dd972797437371589ac382aeb6ed940c95518ab3cfe31595ce90f44dbe8709a958f6829990000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066ebff329536b4cd2b7d2207cd3cb512e03f5cb89b25fa0db758c2f6b55b648c50390fe3d1f910ac16abf2d5c41e8cfe104da9f81d2746b3296065a16ff1920c450e36c46f73a49140592fe19f2cbd0e5744b91dfd6d20e25d32809d6888ac713d953933093279e13db19fa1f3cfcce534a8fbbba75b7f010bb1e19ddeb36557030c6464909fa77e1efe40a86fcbe922c021f0e6d708b29ff42709c4dcc2f05c3a022f5c161158393787d7bd0d178eac90bbe02081a8dca6113e94d0d16e632b28ac0b1917416c43fe8ff15d3bd7e09613244e4f502443e4f7fa9e89682b3b4ad45f2224894cd4c37f7ed0fa8036a166cdb30a3477263fe4cee8c3f5138fb06cc127670224d905d614e35cdb383d47a732443b06ab02ec105ffd91bc548e7eb0d55d8acf02138df9981f9ddf1b23cc651fc7ad4d8cee7538b6ba637a5cd1e646ba5038393f022c3f7ee1fd4ab373660940b4bce19b4289b2c646d66441d8fea8bc93a07f855403185aca24299aa363cd9b2d2558adfd633a8008161ccfc525d5403bd08e15200a02093e683f7427ca58897d99741966a4a93ce38a33f892c447170c399c70db6d16443a32d046385c57ba49d9073384016536e60b422e6480cbd4aa8a54d1029a33112f4ac1b1bb4b66b512409ee2ed3009a732224f3510c589df717a117327a88a628ed8879d626db1320c020dc69a6999193e4bdf5993d32c5ab0698f4f63acbdc26a126c9116529ae4247e4d363006a7164f360b6c75dfc120b71163b2566baa4d9daa35074d40929590771cfc95d0a53f7cb6679e73166c8a1721c04375b292f90d7e836a42194eb50dff760263fd32fc3dd91a190abe5c273f9686cd9ee3fafad1d514db5278785ab76239ce60dddd89650ce034c2f6a1aea65e9d6adccacf02f1b3b3cf1cfd1587c670a7e985bf55b553ae1b98114f846e9d48f81dffb3178601476fc7b34e875c629ed6e8126befe3f6196cefc13f41aa5aa4f04fffdb9157e5633d4f056b67222f85ca6afac8a8d6eea448f04655b17847a1ec0eaa23fdd581f2a9780d946105782e7d5b3abea042d3084d3fdd63869c4bdd156d3788e375881d7856108742f7c84c2789df9c102844f49c1c55fb13598b2ba6c887c8cf7fcdcfc2edc2695ba5edf6b3ea9131994b9c191b573fcc6e78eaf9b77459d54e0209ccb29e865277fcf0fba3d0a120e68d6a6ce856c67d3c7ddf6dc0b7a98a72d32af688fc46b3042c17d2b6ae54d70ab20ad3f250d8f95ee0e886fd06c5d0cfa9be5ff2e3b821b4664018806ffe9d392c947ad4dbbd7dfabf90fefc3b6537a82f5e4c9cf15906f5a6bc54c78878ac4039ac087a81a5866fbcea23766a974cdaedf3c70c3cb925dd0ebfddb6cd1515c8927c9e458730c80f1d4d5ef16b1f1f9a86eef8d18bc34e0ec48e524173d80ebe3a50d664d6d8063aa937ab071792cc2c04adab63718dd3d93a09c6568c3f64db6148f618003357b578d3373132203aaae440a4673302229bdf0ea0c5a856f7cb85ad79fbcdb79df06ae81034266cb65c21502724d9961f61f875bdc984e803fa458f501e041da6630880d07fbb380a511cf418e13269346282858bf176041c378252183c910cbaee1cffc2b90c3369e00c2a5ca82417e7bc8a3236bff00c79dcb66f7bd92c486d4cd63823eaeaac8b2bbef8ac5f3e243676d77bcd7665c09ffdd29a1ae529c13aeeca426719b69c4c8ca07a5c5e9ed74005e497317336c31ada464a4f30878036208c32fd85ddc2b19d4ebead5fb049e448dcb4f3b38b367a2b0f06add70c3b0475b3b3575eae4952065f60a841b691fa6b37bb662a6dd0c9fe56fe0b6fc177b26439f9c23bf7f3cd2eb9afa80f5f9ff089132797844d0597f2efe8d316b9a6b1d00fa922b2a199b7f274da9a128c7c06df9ca87acfb28d734d617a5b9fa0437e45e2a11f60b35ef2c143edf43a29a5c27037461b119aaafa72255e242185d0f966bdd7dff3b5898eaea77bd8f69777109ef4f7f2ac7da67d6a9e5af4c477273b73b0306b641368244a4ea8ccec4a7c7d18876e5d2af7ccf7fb7e560cfc9b82f64d8077d79149d016736119b5856daef149f2b78fbd5fac180b45ea25288ba932e1e7c15428b6ac4760f20aa2096ae09ace879729b2a2f02e14644fc09643f72a25a6018fda49ab82a7734c3e2d9ff233ada6648315c0be0a8de1b80eecc7ae9a92467cd19b66c38cda28c658b12c0a972dd4e6dc3835f18df0292031a928909ecde27f55f93f598d20b8ddd9510398c369ffd164da4fe5294e091a8716aa5710ea8394ca1756d4c6771826c8887f3559b25d0932c8cb8561959bbbfdec1b7883bb92465c7d58b083f04ccc66e769369f1b2c57e18e007639e92fd5b1abb4b607b893da82342330781c51977c259438b1c2ad333335b3a1e98ce608", "5153", 0, -653046097, "60266cc5be98b13e101c62b57a3c3b699d48bf2504e84a6e1db3c1356021c5c4"], - ["eda22f6801ea227c8db6a2ffe961e88b638f7738d59af2d3825aafdcc6494f2e4b2fc7942601000000055365656565ffffffff02cca919040000000009ababab52ac6a635165cda025000000000009516a5265ab5152ab5100000000028ff0c005000000000000000000000000c803773d250e8ed48246b3717a46abf0d088ab09407502058eb700ac4706564d39650df70e74937d1eac3a6be89a90914b79bee4933d9d93c1078dc03f0f23a82f0f83e66068fadcb4262ae4e1884e1bed3673e00b2181d9f0b2d8bcb25e17a5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008993ddb139eb08051d0b26f8bc2db7002abcb880595a82081decf6c68921f4bc6a66b9fcf89e190a83c2f13e7e64b43a7ca43f93f21e2f2ab2abfc6b186384f63b2a86ffbc08b07536a947502b05210490cb95ec8ae75333a4d0e468cd05d3424902e8f95271ad359413845e84e064608b13baacd9492e48c1bfc2154c7e5c8c0304e20a365f05d7b3c10417dc5ca17804dc7383b478435e12c40c69e1aeb8345903098f31fe9a933018bfad702131e7ef798396ba1f32a59f4860720ecfd9436e7c0b2c7f63367e1aabaa1130c8c8a2df6323589236c3066d0908cce076aad57ff562285c82ad71d1e1225cabbede8b2b27a3f0c7bc35b7c8aac7109052708d180e0f0217a07deefd2f46dc7c406618ad14e9e038d76f61543aa503ee385352634eb607030413facbe5ef19d1593a40ffcbd78a2f9d39a604ed5b297ead8a43eb93b5f7fe022bc71cda959e2168e93048cb7fe2d0dd03135d0c603cc835a4a8682d8d38a32e021fa63a4b677a866e3729091a4ee2196631006907dd3335c9ef2bc955f4ffba1a030838c1333b3fc8bcf614f8b2038cdb492e41e046cafb18637812d3a32d44d71daf715765047ee6552d0a61217efc1c8b1df5f98aa5073cc7681cceb4571766a84a8e7e14b1ab6026d1de69dcfb6016328ce5e47a355bcfd089151e04c80fab00ba6ef6eb6fc83c9e5aa0941a23085f2be0635495089c8d0a49674b848497b529bba58f8a42a1a107e26872bf2d714ce5e434f8c44b5e4825f57f2b4ff0b2160d873db7c945262da0c1dbbd40a88d525aa12211e26d6df4611a2072794b5ab02969025778dfdbbc777078f225681ccad8d473a2b529bf1b5ca47a1efcdc1376c7d3e07ba522db88d89ad60b477ab4374e4ea238c85df40d16304da6fe5e11d500d75cad1939ad1e6ccfbb15dec3239290ba9f3ba4b9646be33450842b8c5fbb28758f0038133bdbcfcf143c117b4b0fad474b633b497f1be2a1020b2747b3ec87e55911dc4f1b340526b6006eb25509aaf30919c3eaadea6c3b680ce77c31c68085564b047abd546f14a2ffb865eae4c52d6f199f6b08eaeeb0a2cc0308e99e1cbbc506eec3783a030b9dc7324466326e7cb70653e930f4366c5086919ad4207dc2e40f901ab9eb50806d5a5bd0d74348d4cfccdbab19f7e29afd3c73f50c0f3247f9f1a9edcd02aba59cddac1a90d7aa046deeba90c481ea9f4d882b7086af8885bb021bbae1fca89b7eaa0f6dc17517df07d2b58931a72b771ddf783009b803127aabb396311a3d977a9ce118130df77def598805e5680c6e7d3c9258d918cf534d5c6649ccbd309cd41c53ed45549db4c27f3261cc868a4406543ef9720d06818a45f8fde026271f219ecb609c962783ba732908c88db5c307c420646110b374aa3bdf53e556dbe0cc35b5e91845f79628fc756fd6b8de8ecb66883fd8f30af65aff876ebc2385ec81a0c14768ffdc7b4356cabe1723a7b18a6c1cbb4e65c256f9f6de14f2d00d6ae4239827c862d8c49d384332b79d775b602b1ac6b618006535b1ef7ef79b2b24ddd51c40115b6713a602df2d056e44da3cf75425c3e3a400c39f4721ca39fb160167a1b3fccd8413f56e3aaaaaf36b8f49a56e87a6563499109068ca7f4ddd561dcda3a14cdc7a1cd4bdef147a2b0315bb6ece1137762194ab331896e137d6413099ae2e966a9e020c8061e933890d8c48a1ad5a84fad4437c08bf649c39c8ff091b37d8450ac04cb22284732ae83321562cba0b0340f23d15cb835e81f7f13ec22fb7b4a383aa91207f75e5abb80868408e1bb4388d8dcdf7e1e36ed85e9609841f192a7f680d4406b6c3047a01d93f4fde945dcfb16e6610b293baee156730e5d3145b056c47b12ff31d910ee1a3b166943e9d30e989fbd932817183cb0b5d780bc43ea1a2fec8e3772688fe931f58b3ba5d33e8175948e346c09a8afc7a3ebeecf8faf9b4e291f481adbb11dc718b46a5ea734df72ec5dd07a724ea0a6549726900ce2433000bd0478700be499d97d82feedc89ae764afc306b513cdfffa2c481addd02da903cef4783fef35792a4a9cdf2b6c8d51678a0441b729f6d522bc3143f0366d8188f55e67ebc8d90dc7984a6311c4356caeb6f0b2194217385186cd2ab86cde24be4fa116132747365487621287577103a67ab19ab2d515ad7f94aeb5517cdfb5d4d356ec6e3d962d2b545eba6d7ff66a72a760625b1248bf9cf29a71edde3b5e9c5d3edb1d9297931b8477a65e14bb243908c8f8da79d394fb0e45357b4ec41c482aa0000000000000000c2b0f10300000000764000efcecfc93b6761b11012d00a94b69ab083f37ba68674d0f841b484136112fd6d38c642e6beff12d1e158dc94b75d1e4241c43c550a35262598ed38cf65dddddb7f05b7275bd0c0abd71ef705589a06df2c80287b04fbc87446f66223a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013e825423e226a8a71a9e966ec02abcecb817bd930a4e41a350cce0e7e33da819744cd921121b6a5acade385f594783bc02c9f16c7d99491540634dfdee5ea334f58873b22c14bee48c8f96f3a796cfc31ba3ef1c9f9a7435fa43551aff6c0721969e549f905bf2b0d29f71119054b9bc07a28c406a8515098a2857127bb55ff0220a5c48362fa0fb4efbcad1e4ca896837708612b4714746a13c055dedd3befff02064401b08d2e9b58d4cc3ba00dcbd15eaf604bb81ca3189fb09101159954af5d0a13b86ca8180492673a430b9fc8fe08056620f9e7e38cb8a47251ca0b11722d952ed2eddee2c65cae4d8d63040a312a7b8bff4bc6644c20d5397f2c646988d34c02158890a5bb51e7eefa7aaca88f6496586f6478bba69511c31d135c62e70c4b4f022e6f560dac62859bacd984d935623979417ee879fc0e5ef1601fe097c9c80f89020f9a056b303e9b12af36b8c77301d63e173c60e8e872fed401f40105eba40a9b022a1cf403969a64a0d0006119a262fa52cf33b57ef17e078447f60f1dc7997a23021ec7c10baed9a7b67a49a9d401ef5de3022518dea8cbb91ff8ab7fe3ce70347bce764e0fca2e32977b7a39e3e034de8fbca1d1fd3c81acb8e335cb157fbe0a5531b0c755c79cc2c296208a51f2f8183af6d0c6d6c3eedc95f24a5ccf39cde0234502215ff3b19a47c2a64d479a2e8fe0b60754085671865686dd5bc67807ff850dc5207839438b0aec3f9e82ded4c11f0c37b86b647ee064274b0843e9ab8b2d151aa3fb9bc1b21895cbf2d327d175b9cd4cfb2b8aeb4acc79bc5d4ff7cd91f195f28b0f1bb36ca207e74cfb793218c8601f6878e1bca454cb27393857cd4a5c4fbf53ea09f88e52ba5de9be3c5ca84ddf16a30273fce14492dfc644940ff91ad00f1098750eb5980c6b9c73d5d26ab34393fafd559c600199af8aeb95ab133f290b87597cffb0ae33376eb1df90c6d09b16141b1289f1dfdbbe2d15a427a05cac07f931d98a8b62897a3cafb484d49269c25045951d233f5ebc4a9c439fc69c8535452e1e560fd67dd91ecd3f0431133c7c3d17317022e09935dbe22dd3ec7f5e660e67f886e65a467552d14a74d4aeca16fedebe7f7e88aa51473206979ec341b0ea4c5475ad73f153009ff1299af157c6ecfdcf9e704536c5f1e7b8dc6c9e5c6f6f79f233eece6bb82128e8e45fa7234fe221a5be192be78229569573c4d7b7226291b85f3155ffcbe92a4dc124d7a4f9fa478845bb8c17947fe12e074b284676ecce42d48c110c725cf478813b624fc937add5120e7946341e8eb0d0b895b3628e6566e7e68cc2b0bcd7211531e2535e34ee42bce43d26c7bdbaac960bee1b9f38232c9767c11bb555652295971003acb38eb6a3ff091a681aed7dcabe7cdd2347974f5bce3e9360a8fe35fd5406ea95d9d633c16469b854ea869be69ca23be0fd8846efb43c9204d996df6c3c01b67ca3989d54777a3ef0d73e37fde2f59164cceca596d7d36c1f5b589007bce1e4b23dd2e47b84351d801acf66412b35529c038fe9f35e65a8a4392aaad83dd75f820efdc5ef7bb2aea589920d59dc9a1c259c78de0a371d89f164e16ee33fe9ba303b91693140e3542b402e25b4c8027c98d8aa12e98c01345469234904af040cdc62fbfb9b279e26672bf08f84dae1e96810b52cb3c078e768fae07675d893d3c8eb412bc8c80a0786df3bb312b1c7e7f51443213d18b9c2275a311f1b581cf731498cd53a0d0719c1e43d7f9d52e4edf99c4e3b02ebd035b8ee2315982893cd45c928007ab6b2e2c0ef3625f27bd2448dcf0adf2c6320a5bd64f3aa8d2ea724322d0d75023a6691eb1d159db4494d8bab8a0cfd04aa3359dd128badf582c5b2b5e9aa24fa8aa60ed4ef6911cdbe2cb7e0591745fb92ebd655700a5d4abd06f180a747ec2ddc22b15a797e3a9d2cb796145642018c7ff59cddb6527c123573df0b8861b18da5f019707f7477bef102cca7e88a7d11624f8447050436721f79ca719e1baf2d92dabe751c3d6ba713ff8e3618a887856749ea77094a6f9adcbae82c32b481545b41898c8b838dfbcfcb494cd92616a755440b5e4bbd8cb8fa6741e1d9ac7402e34543c3cdb77ad5db528cb9f8a09bbc479bebda001f2bf7593bf023493a49b6649b00bc72cdf5a7a18ff1893d0c661de51e9b8d4ab59201352264873cb390245e8b5a1971ec664e5d06f49c6805bcb5b0c7c113b25e2fb506ed77772b7609d493e44f1363da4e851aa26814529117988aa1c682e0a6785f809bc22587c1fe508c24aa410c828fd90bceb94c14eb8e5f33d8eb354a0aa2df02f9d58969830ce12ca3ce81ceefff95cbab99a1b72d33d13de2f950577b28a20ddffbb0032e17d1dfc1041f08fa0134837ea77ea742545817b7503e41f642b721453d0a", "65526a63635365", 0, 591722917, "566fd1cf0adf04283d4a9d27bc0de05ff76ae71baf898672b6df219a85d9d74b"], - ["671d6330039b82198f810564b5fffe0714f34fc1a31cb6a24d7d8e487b5cbaa37208c1c2ec03000000006cb8565067e11731e52cf55cd7fdae0125dd70a41c685e229fade51b6a7e1b5b3461a69a03000000090000536a6565655151ffffffff5b99517bc4811347b1e6651bd4937531083f3a738a59921003f4b1b74a4292530100000006650063000052ffffffff03e1d0c104000000000600ab6a5200acda6e49000000000008ac6a53ac535352653736090300000000006bccbb6601b399c40400000000000000000000000035dfa222a5ab2b88d72a04335a07163ee95e72bcd71826fb0d2b20964c365b1f25dc616468d635aa21b0eecaf892360fdbe3237d9646d7c2798d4fff1100e6ebe4180ddb2dec97cfb9568a1bfc1040f1da10c89c004a4d57dea18bccfcbf1a17000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e6173b825b40cfa28d6fc2ee684d2f66df9dd631adac4f6e1bf849d449e24a10076fb8a77540ba6f7f2e5f2331011cd75c51aad3617547c3745be61ea3a8642c0bbc1d04e58f4e2d1e422a8ec3565d100672c4357e80eda8f66d150cc4023de07dc4c0796672ea1a9870904c10a949a11bb3a416f757755546c15071f8b40c403262d7e3f778a1450db53a33bc1c77042eb62afc5d7e22358bf2a66f11114fb720305f501bc4d1ec3aa71af4b41b55d0fdfc7b45169c8c300fff9799fe6803503ef0b23a0a2c4dd1414e52dc3e3d284faaab796c0da38a37f9b51d37e49cc7001e1f806dbc88dbb067c22b64ea314b8d999f5bd503c62a709172bd3079130804da666032defb4f74c6a13e651193ea1e1f08f8afe40076e3663a3dd273571675e0ebdaf021f8b5723739da8042da59db3a23ec03a5131fe8d545344b4ea397393bcdc1654020c8eb7ab04c1d3bbb41f4b8f4a41cfdede126e4ba48c0d666559d8dd24fdd12803152a3a800bf6ef8614def489c6131ce52e00e60cad9f552889a5a2f0e276b5890215d64e4d8f5c965f1e1effe446c53a6665b1ce5242167f6ea60ec3dc8d8aedeed988352a3f0572ab97ad72d9c912e1d9293634eddfb52906850e6e3f833f4dc334d7f1e49cc38dafb7f563e513c377ff1c5d94207de23a64a737ccd6372de38ab2376e823ffc5b6fc3c3fe70ad82c9ca85b1ace045c9fb88c98583fa361aad1ecd61792b9c1c0c64753fb1961dadbc4ebde2287bb81da0a50c56785430222f6a9af73ee03fd27becf0d5710d07b1e77298bf6b2a81f42f0d537f019aa50b400b5b66dd8f1e6836ef43f3d8adf6efd8ce145d39dc6269b6224217e1ab80f81d498b8aa830bc140bb29bfe8897337d31ac712824d7cf29f8fe0c85f664e6115f92aab0bd865bc49ccb10372fda90c3f72606c2d1597cafe8a6034edbcf245aae94eadb218279930b830b7dafec78991f537c3aac7639d97480e352483be9a2f277c11720a355893df4cddb5932f7fcedd113c510947aa57b8f8a32ce85c62f17bbdba1b6328971b8e556031dd9140db72b263f542aad4cd9227b842722d15982fada8f20ecb81b0c92be1578c7137c95a0212f912e3ed255216d73e8fc49cb1d8fd36f681f6880cce066b9a2de48a4782d30b7e10b15f6019337d8a263811c94d297dd2bffd1705b001eebcc548c5255b79f35662a961a1efde7b125346fc72e4fe73897b2c3fd2ab6842106b62a7c1be585bed00ab691a3f452ade5827f646977134da370e49ce2540d2d03f49f3f33d4368ae391005587360a3c30c2b3fa1520c020152a42824b9191bf665a960c0fc78dca99e1642e019572495f8658c7732d254358bdf0e270acef11d2f03ddaae0c1ba7766a08ee11188951116d0f3524562761ae7acc5fb696ef9b4f052bfe19b6ff7505b49f414c5fc563af99884810834e54df964a3b74f04eecd330019c55d35dded2fccbed7951baea25fdf9cc95ea9295ca603e6878a4a3d44bf056e3ded4ec3fc20735bb5b1011aaa7e7de5c4ec37d7d5f9f18a32b9669aa85e3bf44cdd356ec14ee883ada6100a800ecd82d7404e79d060b138213b78e3384e18c3b655607ccbc965b51d0cdf38465c1193f69ccfe2e2edba1d4225f30cbe5fb1ccd0496c64426a1a14863069f9da5cd57ab28d48a2ecad1195dd4b511a4b8cee54dfc5a05d0d615ff7f783a06d56e9de7696b473756838cd630d3df7ea2b2de2f727aec6e1824fc45f634062180d69cc7c9d23ecefb1925b7cb4a92da35bed64b06675973100101cad20517c9f314527042c57020ccf0a60403d5d707b64bbca0b3abb3bd9b7e62d9ab12a1933fe8f05abddb9e58a1be6982493ca32cd1513d1d78b66f4079ea5c2c30c071d47285c7617265c3dde4b27bbdf050fe948f1bba3f4d243b4c5834aab2466b07abb28821159eb3ae0b28d6e53aec5847811184bc4de55b7580584b2aefeac0ffb3d375994419a0889950fb8e322e057d585e045df194030c35305a1d8bbcaf82a0d1db0c1578fd2a7a0fcc96e0e33d085932e4f200044841aa2cc6c6ad6e6f1132940404ded6734f2aed1c9cc16143f98b639ab15a73b3281141f22a19b3594c0f745df4aade6af014a26b83135350ae0ab8cdbcdf28806064f870cf7eb2b4a7397e02c8f165db2adfcc802c0f4bd42a84f000e295dd0e5e800fb36047c774c52e556e34fc867e4b8594c0f3b6997f76cb6a5983769f1e2790322ff8034ddc5d7d8a42124b943989d1abb3ef6f8332345605a912a71f4c144de616c1ca2d2830865eff881f4b22e07007da42450e5b87263de61f085b80aec68ad17908ffd20c054b812ebc788780d78609f456599ac1551cd40b1ec6c6226adfe9a929a671e968817a25197d8d4083be229ad19bc7e4527fd62e36ef1895f406", "63", 1, 224243722, "a11612b83405de660c692a3f620464ab55b171d03387234a298b3da872cecb55"], - ["128b99fd04f933ce98b5068548c64e6eb072df506c4c181bdeda74018fb07a2198416c4bed01000000003296409e7e63687e697ac11dd485bfdfa1d4bd2426636eff05bb0eb6ed49e3064c254bb90200000005ac63ab5365ffffffffe575f688fc85b5366eb6127f1196f91fbbd41783e5059f0d72882766f605db8b0000000000ffffffff21f6f83c639ec664761acc28c7cfe87a54a5069cd6d177952ed89492b2cbcdfc0200000007515353ac5352abffffffff02e837f80200000000095251ac5100acab635390c439030000000000708512aa", "65", 1, -951791733, "e9c15dc1952625e3dd73368df47625ddfa37c5979e1b29f8f06f74b50ad514eb"], - ["dd227cb004a68ef5b081345deff7d4aff4a2ebd82642f0de68becca9bd65a008a605aef92603000000006eaab95477b5234246274586ce9cfad13b2bf13e6f366dd64f12ce57f0013110374ee21601000000007144b8c771c49660f3714e49deb88071f600e5d46ad26cede55362584b2d816aa05d60a5020000000100ffffffff7a3946743d146890609ab5540b32727861f2e9f2d8ca4a28de239b009192986c030000000400ab00523ae8626a046cb52d0400000000085300abab53abac518642dd03000000000151f44e8d020000000002ac534ce0cc040000000000bf9d1e3e", "636552", 1, -614446, "4517dd7c13047de918e173ea6d382fa9d035bdbc2a4883154379657ee2555d09"], - ["2731335f03d813cba1fb1a109072e2f21cbd55b990579aec4653bbbf9ecfe24003a7bb6094010000000265abffffffff553b90af86abc340722e37e96c0de1be80bfbc8ec18933864d26dcf66c115d1e0000000005656a6a63ab2d7c463ee99ea2d5ae75c5c559be03aaed37a060fd171e6223bb721d2d22c57f32a8ba780200000002636573b111b1010963a00500000000046a65ab6300000000030000000000000000c87c020100000000f7be13515a34f64ff9a9f77e85f64f217e904f85c2769ebae9be7fa95dc9342bc61172430ed374afe3e605631f985dca23e6b1812313592b1844729cc2e505e7e2963282776cd5766bf2eaf17471f8b220bb4b62ef1f9cd3f9219d2b252f5d8b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d165a604824826ccea94691653c7faae4e40b3c2c15a8e4ae52f77191ff906e08da7be865964b6531ccaa5c4baf7df76701c23454de3011780c7645f982a5b56fab6beb1d06edec37771e7ff034f644d37302c2539bc90dddf4381349783f25543fbf7d552f7c21ad7382952df8cd05c0f9768e848f57dd7a2ccd041adf30e90030e4653f7daa2ff160b5b70223aa2d5dbfe441b392f714a4ed66467758343e690031956ecb5b318eddfab3a75c84f4a1a8fa90faeb19f35fcddd74ed6b6492d95520b256726b2dde131a7941d1481cf319b612a72aeea92afc0dd703e40116f12873906f2bf194219caf689c708a78bdc2d51a2709c53414c94397c36a1435b8231b8020126af80bb7d4c5f3649a60f12870b9229dded123102b0ed53fbf23c9455170503057cc05d0b8f124d805faec466247e5702113614d5152e0b8d6a1dee6a5b1a00030fecd96163438d269f63197313603b529895723f4cc362dfccf4541542d670100305c7d9a6e6229055452d01617a4f6e87b9472e77316febad25f9735be09fba80030e0b3806aff9302be0a549c690e5ea318fa27ba067602fd3ad38f2db77a430154982a8ebb6ce598ead66654b1f529dfa95847f60a808aae94d9fcc36d189d4552cba69ca2b0e418706d511450d6bd1d54ebb447cf90f424a5ef197cd7aba9907330b7e79eae2936cac8a780358252dbec3bb18356c477b23a2f2183ddb53c90bea781ba9186e8347403f0e12ba210b4eb7fecf91e265c6bc9135d0b7b3f06d714950b588aa8a2affb0966b3f5d16b37f5e6b5612c4fc46d6b875974b47d185f76219ad9d4d7b1bf8db3adad49002422f4c4d745d2086af52572f6edeace8067c58915309e0f11b4870d324298d079dc81690c732212231bdc3a8d33e41240973b3697e4f4f163523ee20875ba9ae2962aa636f64e5d65f9288840e199e290260044d93d12fda28c7939625bff3c34ee4cb5aaf5ab2d6b8479dbaf52f4f83dbe1a884abfbebdedcfdc42b23b397a05c3d61ea087100eec9c8e3257c3ab6e309680a78070263c34c7d4f3c5fa7da540ba178b5c0e6077ecc7eec1106f9c9f525fda3e89b98b5da9e8483c2c3cdff3fb2e32a8d9146d6942ab00dbe08adc2cc7241def9f7fb9d62eb0a09acf0956f63ccc955a5792732cdb2e84e75a0b0b4a69b7bec919c93777ecfcbfade1c0632f79745c4c666d08b0f8819b6ddc196b6c59747cb110c4fc07066d2530b90c8f49417309145f4f96abe7125bf8e448f49b45125b8634a0aac0bf2a7ab650227088c69ce46cb77157370229b539cfd430e70b35ca8d8ed1019a787c980025bf2cbda824113f38468d8f3a31c7d4bb0d7d735067659ab84e17c635ee019d36a758a3fb4dadff801a2a3af26955e568f37562ccbf011d7d8fdbae0b9bee6c5d034edbaa171d0fab9182895ed092c91b8c9dd92af24a522d42f1ceee346d070cada76c3bbaacec99b91f63a781aac2d0afeb82910c6d1b1ddb7cabb24cb70e5a74bf56b521b1bf16b15ee25c8f61397ac8bdd377a81f90aa2f3f6e31decd813ee3c761841668ebe844b7d59ca06e14c5b7ec0a8c4008679b86345078e0e01d23e022ee3c4f90145ddeebb2b693530e42ea6a48fea82873ebdf02d430a3af8be6eb1cdbb3be94f6c6a6bead8fb05c4a85d6d6fde8b15bde55394bf10bb891603c63bd3d8c1f660f3b601292adb9b81feac56f7cfff61c8c71a65731cc21e071e1dd906a1191f7ce52c07713c3591d1cc8267793e7e9b30fed3c1fdeba71077f0ad160ce6b1d666af13317c338bc1a84d9ab27e2c60a8ac628d5f678ca0608ffb90d66cb2034aaed347c24ca7dd11696b9ad14101f1e0a75facbf30115a851a40f6588ab1a3605be32923e0ce81cb78d2711722ae45be6ef04c0b7ca0263d1b8cf8ac9c31b8525fd00316d3a8e7dc554f42b40ea6d2d951f9427f54984c3a78293d4a01adda001fc1eaa26cf17c6b88bb63b11abb5a868b17881b8067b941ed787ffd6c0913b2d1056c3a5142148666df69512508636ea2f95accff258a766f1f6a17311d601e801345fa02f9766d58bd34a5c679eb781e51021d83fb0ca440a9fb62adeea83d2910b0f38db270cdbaea4021d6748fe445beb49bdebe58edba98219bf0a893ce8fdad1a41036d6411a2745d9984e41768d50f3a1e2f6b4497708ab524eed01dc8119928b202d3160c9b0c6e7ebc51bc03efd2404b64e304c81f6175f38a066c64d225606f27ab71b4ecbc4e9bc8e8bb551568d74f8ed54a4545b16c06e50c4ff582df7ff3f020000000000000000000000002fd30532b72fc65f1dac7c0e7784ee9c15600eedf45bb2f8772fb1c0f55919fbd049ff9e80194043857e0ba55af496654ea722a0c5118af2e2699b1d217497055b644a3750556d8c79b2e8c7f36e7d6924d0ff68357c5c3452e55db62e718f7200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fc71b7f3f33a1187b5523c5b0314f250c872948669204c7512797005aabd8d709594b1eb2c16de4aedbe06aca05f7728797acfdda8246c99754b5979c3b09032c862fefb4d4f477fa7b99fdcf6330f03b0ef69da2c5dcfb7b751f2f2f0bd0ff43d0d29fcc09489291740eeb13eadc5d37df6e0136099f998a286ee3a4d4218e703288f453bd23d9d9c31c2bd6b504943ff1e6d8e2b231e164dff2b2fc3149725cb0320f650fff360a8b67a7c387198ef0cad06a71329a79c4d39f7cdd0e2fb6f54180a2af45f27b6b2123f307362deeca7c3c6132d639ee0ad387848f1345b8d37b61913b43216355c782630178191e2dadd2b96eb9d94391a3274b410d8fc6af80da9021077f012ad1558e8af87338dd459cb3175585f9840c27dee8c4d6c70e6bfa7f30214810a2f7ae852c7dc296ad9cc47460769b74ed99e7514b2f8a39a73f8cc437b032120cac40dd7a49e41e67f159cfb9f3c3c85057dcb89cdb98f3d9a6fa3320314030be989e4b71b105291f3ca1b170a3437ca5ed4f81cee6ff127296baeecfcaa0f0327be33b43987da66187523c9dc3b7681e41a4cc0763c311e8a0a6ea84ef1d72069f0a1c0d0b8d876da5d44dc49673b64c3b522243a4d03db0dc8739dbafef1c6d7448b80f160337ebca7addd3af17ef4666a981daec563278c559062b15e179ccae6dd7ad2e8591b7deffc08e968a58989515410ca64b1121b617d5ba95663739c4042813a61d1837c0ae28f570bc1f3251c52ac9c8ec5b168ac1f4b721b7bda2b2144fbf92c3ae33e06aeee1982348c471671191efaec6e6f3d46f84d5d4a87bd422455ea1294cc031a76c86dd9c1e73999388d2703f074c8a1ce93b76554cef4d0e6ceb802b0d0e7b5f223b813aa5de5c3ca8e63d7835d51eb92fe2c79a816fa16bc5a4f6704dd1cac0b874d005f4151dcd99af83ac6896e585ad18fd4263bfc6f3294731627b99bee7a327f1416a78a8c44bd83f9f92c75de37e44910d8aa7572f588f1917d626c3105544a35fd2f2cea686aca25dc88351111acb67a0a2a2c1e3606c987e0e279c436aacf9b71b2c22c16e0861a83c10984ec6773536b74e44823f3b2774fef4f546d1d7bff318f9c5d05485b930d35c90c1b4819db06a88c9256a8a1f9cb5187acd0467dbd0f1c77e2ade02f7842ab1c2d867451255cda298b4c7cbd5431222269e3ce0892ac68b6cee01306d8eb51165066343354aabae3879a315336969badf60c3e0b71299c6f0ba5185aaf40cf5d845e82b4953e81c32068841ae30cdc0b732a0a1b39f3e370b795ed4ff3d392394fde9e49eb33660451f40dfde4a3d3ce52e691d2638bdc5326196eb072070dc8ba4179a72223cf9b0553d87d64a2217798c58725f5c29c555ff7233351c7384b0486940ad8b1f6caa5d572be5a8364d6d8c8239b2b996dde645cdc0c12270246f82ffd7702bf40375a2aedd237ae3bb665cf50915a47524e655febd7017802df4cb3d7736d23196f97694e016b06c7f81dc4a630a6f298a8548fe069bceccb316d42fb4cf291443799b42f136f610ef0f19a7d60227592ebdee6d96d761369d4a166cadbeaaf718e0171be8659230ea0048e8921f73757c277d5d79c13d55a424e772ddc6ae9943004ab2dd431f0869f6b73d52e890c744edc7e2296cb2ee2518f8ebe212688fb7c855944c876c7eb81b00beb59c6573d0b8cb524b5bac198f0eba4a6fd43613f8053f85d7e8a1c445e348967fc6baba5bdbafbf7b52b02ce7f2f7dc4dee6272430716d2441f1810879d229cf6652209d771446c405576708b72ef469dc7e3b5877c4e05cbd5f3037188d5b5a2c1e872fde5f3da876f17ace6fa3884fb371de2ab25ab18ebd7846189b00353e31c193a8b04c9cf4f949e7b6b91a13727f011d016464a8419484a1c55dadbb0300402dd0e595475ac3b931c078e4879bd6ce7a24bbaa1fed8c473b36c8d421b371a35cf0fa02cb491c75cc29aab44b444fdceb354169ea0c099fc09e3dc6392361f97b42fca2bf07724de164adc8d2cf832bf354d12322a020328a895893776905f9e63d6265a386bc65bf61757c38e995c1bac156eee2734845441ce062b4e2afaea3da85fe5bd95b66d99ecfbfdcb257b34bee147e471bd1084b979c56412f848a356e362afd99c068ee431580d19ac7ec84bfd43567411143e12f49a036486d6464da8009fe6d40963c5546dbd5cc342a691429f5f57a173b89998c193b22bdfd4ee50363907492f6bfbac7bb66a0bea010e2c12c8ff51f650d028151404f88ad27062a46294bb101000000000000000000000000f2b1cd346fa6e13c7576fd4021811e69c13efd7c4162b41b5f24c57697cb59f6ba8654222edcb5af8918c0288f61bcf0975734449a814f8d91d64b85f8a65a4276049c8220a5033ed2d85565a1e674db2e1ee9885a30d0fbfe3f574f3aeb44c100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ce050dcdbb071cc0fc3a09b21e8143a0cfad526056ce03d4d1d170f336c470c69b2a15a8bc9f183e2dd9f93c6fd2bda9a9b539c0b31e80605f1b3a9dc2d9c80e6c0726fb8923989cd386e0af6b7997fa847a4ad53d0edae6d02b936085aa6e12aa123e7888cc75ea1d8541285b3821e4a2ac1d8f56b2be74e08928e465e0ee3a0318c4d76d106209e7c29af3f5822c3765d97bdf39f5451954d6f355c00cbd1e270308ee39265bfc05ffea6bda1ce13f5348c131234c6bfe018e7733f74406e7d1450a125d684b1d32906835bcc08150684c60b951d1257942513324756fb76981814108f8817b80c6a820ac93e296367797dac5ac2a465fd6ec685461546b29fb269402250a78eda38b2a3da1eb1c7b97e23b3f45feb3dc721a654899f44493d62708250226b88a93d063edd15b4dbee6e0749692ddc7640bde9662d812aa7bbef52eeb440223b037273f0f3395e6ef935c91503ace8efcdd733dcbfd4f0353c5ebd8db7ec1032a01199edf7ec2ef55bcb938ccdeb5e32db40fbfc85f5f55cdcfb9834003900f032dc8df7c91416624ba191b8493e5ee8f360064fb25becd1eb8a9626d2a42b9b6bb2bd00bf581cc3ccb70ce9af62252a59f1a6c1f8b45869eeb2b98bd10face6e918a10818285ed1eecddfe78721a91e36dad19f3c2a667649ebbfc819f4684a8f31b42bad43a8846167735efe2f3fe168b17ff27e793b27d362eabf42a389f913088be7f9bb07b017ab67afc6482636cc6f5728acced37414df410924e38fa64bff0ddedf183db4c32ea57061a1b310a8124042fe6fab8c2bccc520c9c3a59d6d92ac58a4e53062c912638fef707d1e6b28e6b5ec277794b9a375aede8841bd05acdea522731c18d379466ea40ac8ddb722021c3a9a25a962ad555d4cd6b8c1947aac0b2c1115988c8646aa647c27ed66ade29861bb75f95033554be6414e8e4baf523e41ef2774808f0f6e851e7ff9c59ab7fbc0c103653eb0ba5b07469c787e1761c61dcc973478e9d332ef506ab8dd0ba638c01d44026411502790f6a44b6f2a9d3627760853462aa8650b194da7c335bac7c82c8419d75c957102b0f618a184653dfe1847702383929941dfabc2bf23e8c4ca58ad644382edd3338e7f35187d3e8191acd8d316859c7b7fb3bd95bc9e324cdd45ae0f602d8a6fb01639c17945722777dd5fe6fbdf51684c32fe3f91e9d064fb953170431c3151618d92c1ee88e316a21799d95950bb55157c6ed62bd3458897843512cf692e72d891f85ae73a672e1fa00937d2e37c6b6c344019aee3c4a0ecd276bec1123f43e02056c7b7ee180e9e061ed9b09457f40cafdc5e6f66a4d4ae57d4b810edbbd0588cc3e4c1a60dce455cf08fbee5ab523726be1b376a947ac9c43731409544074e54681de7620866b652edf0d66741eb0a855cee07baed52b974ce687c20e8c84b8faecdac79fd133865dc1e275f97a9b06fae17073c3ff59a5f4b50a5a1e8b1770bd9b0a29aa3a8b452fc25f4687a853291d852537f1e57ab64d386122368986f575462e9580cb929d99a893e53b543d1e7af9e01c694bf48e274d71270744444720a3b37012ecd2b988c8a2e49a1d8a3bdfa52019752aa2a46f9b91924e4fd8a817501ddb04cbddd7de25c55d88c6a053656273f0909b6a2cee36da7db93cd44fb4dee2a3071c3b635a6deb357fe17b77a6d67388190333362327ae0ea588834d57d3ec49d23e41db4602d9750dab0dcd6d3d94a42309bf3e05ad0e9a968162bb9154e990081d9530a36e8fdba6310d12e12a36d3445d9476dbb6280e4b82ca9751686981e1bd83386589db846060be88ad122bbcf3c02018fcc275298ca4088b8813f12d5a02de13d3401d85dc228fb34586ba440c4ebdf69a69f6684a16c2a66a8ca4eb822f0236caa3c64a48c375c21b0675d52c6a2f149f3e590356d26ab5a4768a51e4b35f3a91a54859ceb3dedeadefa219a30520b444635aeac6b5e2c3c56b95dc7fde327b77be41934ad149448da202224e7d095a94f10b5d11cad05e78f887b11c3f1cbaedd8fae46383584052ad8eb176d638615ee8f82157488f8a608f7cb21ebf5ff47846c87478e9b5cf1144a110a784f3d0932f920a5c1a345ef4f3845714ebdca5f2b5178a76e2dab47f16245ac6aea7e22eb81cfb47d4af334e771eb1ef4a2f39d01dff646a47f6172d03db54dac2bcb28246f73f6622d843f83ddbd6525880c97a546ca12791efb386aff201cdd14311bb42b2c71333427f160dd5bad9367526765c1e2ecdbbe82f40c4eeae999bb8e604f5846ba78e9701bbee2ad771ca13dc695399c0e64a73552dbbd833ee3a3bfba3f50a62f3b6103410eacc7fa636ecb361d7a77b67be2957d2139c0ca21ee4a65bd2356239d2b82caf72081382d1398970f75c8a6e3381e6de51411503", "536a00ac6565ac0051", 0, -720254056, "3757ef29cef296203f9a815b1cd8a7a23081465d2a7444dda1e95c1b8b79cd6b"], - ["4bb49efe036700b1a8841c20d2b8aab40acb662396092800e7a3f9bce23e2779b34920ee8d010000000152ffffffffdafb01f60b3106f56009298fcc1bc9837e44855c635f51a49516529faef7fdeb01000000086552abab6aac6a5199c9385f1e528118fe6b3a00b3f4517f68cd80a52a0f53397a9c7096f1de4c0b1deeec10030000000153ffffffff022bcce201000000000763ab536365ab635092a102000000000000000000", "52", 0, 659936838, "974a66ca5e3db186eaac4c80c5ab4c908147c9cad232cf1f5b97964291f44914"], - ["87a557ec018cc7b4bea3ee1c9bdaf2df147045d4fb60fd6541e2e74542cccd99abd68b33800100000003515200ffffffff04a6c9a005000000000263ac22d86f03000000000652ac6500ab00f9b95104000000000463525353da9d730200000000016a00000000", "526a", 0, -1721199352, "566888685633185eea0daf69a229287a46fb3706cc1d734ff027ff66b3f9a81a"], - ["4e7ecee203ac7138c2def93c0dcb33e6d92d723e030dca45d6ceeddca26c58171212420d73020000000600530063516a1a12487f731af39e060f363423c5d58d880e6915c82884182807fd11db3c41375f1816de000000000651ac5200ac65ffffffff0c292af49fcd1153894a5a5d7775b640806a1817118c07cf33ce558c33f0069401000000056a63005353ffffffff039460ab05000000000465ab63657106e301000000000563515352519c80c0040000000007acac6a6365ab0000000000", "5100006a6a63", 2, -961177221, "da044153645ffeefe053ce9b3e30fbbfd5c9bd1ff0e7d56436971b90c86ac33d"], - ["5cb4ced703eeacc541c7261dd573a333791de19c1e3b5d15e5e2f1f6766d147a95a610efa80000000000ffffffff42d364e05a41dcf1926520d60a8be4771326b81fc774a9bb51b149c1a6d9979a030000000852ac65ac52ac6352ffffffffa132bcea653564e0b317ab62459bd659a882d35fb1389974b3c894f59cba2c86000000000453515300f06b3cfb0146443505000000000363acab00000000", "00006365526a51", 1, -1941457561, "a09555de29f4ab0935a3e7b3a2716687a8e33fba574ff9b5abfce6b1d3068e3c"], - ["81f028d30232190c88962f99f29e5fc2e604dfb6a4b066d5ac526657805f4ac69fc22b8f52010000000152ffffffff68cf908441f72ee5ee413b591b30516555d0762c157c7ab06fe4ed916bc4ccc10200000005635263006357b1804b034c4456030000000006ab6a53ac526af11231050000000009515100656565656a53c89c1103000000000000000000", "ac636a6a52", 1, -728757991, "d82329442a821e0d79d5f1293e3cad34e94c8a6290e8994f4fa9b0818428e1a6"], - ["83b65b6902dff28a51a2351428ef2a8a8b61cb5a0a0f5de131d26bab4388d617881af8b2c8030000000863ac6551ab516500ffffffff32c074e7e67b60f3f44ee848a4f244209c7a6f0b7963eebb01b3c4823459c9ac00000000056a526351ab7160aa1e032a51a6040000000005635252ac636c15a8030000000003abab522d448b0000000000016ad5d8312601c12ac804000000000000000000000000465a7128be77190af81b465eeafa6edcc4a210116428b4bd12d8fdb8078001233c4dcb156a8fb8313c6f979a7efb2691300195d55b023420a69a2ac93f17db954630f509eccaff4c857b3366850fe305306dc5e0f75c27e0f059478dc9d50924000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd7788844f1c440b86cfd5b26261b18faba87e5d238f13d8dd77ae4302e99781a2fe8e5fbfeb5060c725e9f584e374359f4d07a03e50c58fc11fe06d96b9232e195255680d3384194cb1f9705c78e7a10b0cd05f32a25ead51e676d97c0509a349386ca06e6fdceb42b96e8e127ae043799603777e9dd73c8959dfe3cc5d7ee031a981cc889e31538814b9412e6d060ebde1f16694e81788c1b65713af9d4664802022ff243839553641be55d45929600a7bebf2eec640724d8771895c16f4e157c0b01a1f468f42a8ad2f16826cad1bea07b6ffaf39bdb8430cc8c7cab8b36b5501d1eef7a9d13a72637c74eb5683a7e76728bb53ea32c36c96ab9c9e7c71b12d73f02281a10a795b25a65bf9c569038e017af20cd5aecb7669ea1f9f01f7b56ced574030891d11f4c11e9e4d9dda7dad37874e53c1d6bdefc64295df0202d51e30919be032c22cd7bac85f9ea5c0c96062fb2147418291a25c2a83b0858704970e602e4a00211e03703bf0a02fa0cfbd8fa7cb52923bd41e706c41b3ab0946b8bfd7c875b46032541ebae7e1ed369f5cbef41d35611b1927817d0825662abce75425ef4916a3e9e0f99f3f9c66f792d20cb9e30de2694d75180dc41bab5ba4b27492ac191f8927fc15fcf2b6ca64a7a8aab8b5f3faf1e3a62618a3f1c8209cd540ed8a7aa56cc2e1f33de92bb81976ef3d3e7d86eb7a8b6a712727fb579a1b86f8c1742deb11d9ab99e5b2f31792c9620f0707d493f662fc635f8d7a266983336c0d078f97f4632aed3b738a4b6bd3e0149bef27227ac324477c65a07e68c139597a290e92fad1e4b82855e0bb48ade19cb0e080c49c97045757f5019ab867b26d576657ab952c92e5b128b967fbc673234bf857354ac639ba137108b2b516fb0684315d28b6c7ac3c5375950491527130e9de53b6390eafb8df9b14184b05265043a0ac3d4e7febf8b6440da7d2cfb8f7f23afb4b4c61caaeb90e03f5dc756879b7612562559a4891f3d29986d84e1a280b029aee71d059bbd68986177435b86706303d2c7182b271ce23a5a07213b9c213bc8ffcd412cbbd73b6922254d0105fab83a7d8452d20b2c99fb46272f49b8e7de18fa02f7041e338b5ca5ce905d549bcb169f404d49a4d780c338eb73bab77b1f0189893b6352e148bd98ecfd97a6f0b44eaa78b1e70aa572700d79cc7ae902d8bfc202be28f2bc78e114969f73246b0174e663e4ef220af1ec3e479048dac934105069a75afa13ec5b4ab2df9cf1049f9ebe524ce4e50b8899a9aeae4ba76693e726c44c6f10db52371ffce4017885fbc317889c1fcf08402aaa651ce143639e9201567fd43ae5c5478c2259ef75612062a57dffe96a8b2f16ecac4ef5a5c731f5ccdeb42efd3d43ba46ef0a47050a8586ea366ec8fddc3cb624ceec3f67250c2c966ccf8697b5ce17f824d91d7052cabeaa7befc111facf3d6c610db5cec03878700d924a58fbbea8825f0158643e36277a5e6682f2f1d395cbf3fd43bb6440c50ae76ccfc64b9f40f5fe53afb97f4565529920b1ce535ca392a18ac6b1793cc6a493758548e86228c7e042b4db59e01c776d580736870ea5705877ac15bc3c2ef40ee7dffb687a35bff18b0a08116f3164dfd2833c2f0f5515b0d23b38203b195fe37674346811a7670533d01b215e59045379c27be55c2e98c5c4bf82f847ff528c57b49f34669121c11245e2735dcc55f128aba77590cc1cc4ef047ad8fa73f1ce0b7502dcf06e267ee34adf1c1ba5adc6684de424495f255b8438f560b02660c394a5074dbc9da381623a938e1da16d15bc015d9ff3253217c0c590f714a60ea371b5c2fb6da520a9eb8e1c50fe764b1b6ca4ca9f67c6c5b164163e1953e86051782ddb5f674eb2c6f2139fb2a535aff8d24be58ed8df38a45e39d0fc6c5a209e47f8717946fb7387b70be0f65e2425b12f665aacd545743b487cd079cd1ec87eac1ed8fec6666aac3cdde990588e500fcf8f25677557495ccc235a5d925e6cd2aef3f9d6980a485479ba7d0985ba3076465a606b6260623f6771aa2e3a9f85fa6bc03ab501dc4b91cede3529d4481fc93204afd408aa470de2c9191db6dd05529c76d33a916a500ef4b957a49182a76dc9dc19bfb7db98aa407f1d18e914525cbeaf575af6d15b1e9431eac12848213250de301940b6dd54497328e72f91ebd7bc5c4c602b0be2b99b5c00099296a74e62cf408e6ee1845c6f0f2c9441e38fd99ca6e75b674a0259360358d69b41745408a23fda9de2874c88e92e403c374a87b2ad797e534890e6025960710f3491e81d8af25aee983ec2c08c51d57d633158e3e7ac948fd1e105999023c86e780e3b95ddbb3f836eb93b522adf4184ec150863ba703e65229c0431f3257d16413f9e0410be6be4d63a7a85a58d360f05f30d4a310d", "5263535252", 0, -1835847718, "faddb4bd04d3a6c918933e017926526e7590ef2203fae2e07d607a5b3629a85d"], - ["4d6172840202bed3ccf849ae7b0ac75ca1b696dff59c52ee191066cd8da69dd699fd3d452f0300000008ab0051acac0063520edcf5d41e5a709ade8502563461427b6a4bff740ac26910f044a047b89eac93bb25427c00000000086565ab525351536affffffff016c2020020000000009acac656a52005200539ad86e35", "51acac5253", 1, 469254342, "6e730ac3e8b31ef8dc44709817dca89dec6114c38be80a744fdbabd032128464"], - ["7d51ab3c0404e46657df49c00cb939cfb57fb109c828904b855bf63a6c3a5432dbe40972eb010000000965525253ab52635352ffffffff4ada2884c23158854715057c3fc43dc4e25df4ee697616d6c40770aed59affbc0200000000542f68b8dbd510db5a20dfd559037d4228a1c53c6d3546f731d295cd66ba3d9bd792e32f000000000465535351ffffffffa1fc2229849dc96dc2a5e2133841e9c6d49b070af6151206dfa643ec3e50947f020000000200511931486d017736ee0200000000056a516a636a0000000000", "5365", 1, -1114740331, "5a2772187fd2d998e3bf36d953a0fdc2a84cbeb45e6c44b6c3fcf3ea9ff35e06"], - ["1bd9dc9f03ab3705b0ed884d18bd53ff3ad3aeb6e30f0543449491f0ef22f18f34c36dfdd903000000008e81f17d414fef0c4d306f208b2c1c294afb0309be5f8160a67b5548e9f14e0981f1c87c000000000952acab65ac6a516a53ffffffff4280d64662567c8b50bda15a2777d6617ffd0ae5a8d6eae8eb3382c016257a8101000000066a51ab6563ac89a9b70d0170e40e040000000006006a51656a6515239679", "5265636a63", 2, 1182737273, "8af6bbe9885ab99e6759f0d4178d03bebace2d297b2443c5d090a99375cfb7af"], - ["42adf5c6039d52a50d27e50f71cbaf0cca5469272e15d09e9417bae721af94765104fef4da020000000365636563f479169fdc2d0e2a421284f07f97e8ee28389a65aa31ce3517727d9a4535887b33b8310100000001abffffffff841b9c5de0c748ecb4b5737cf82d460d655a33a83a12fa828ed5c1b1abf6aa04030000000700ab63535165acffffffff011404910200000000066a0065ab515200000000", "5200515353636a526a", 1, 471122597, "dc70c64fd8c8e34e88e727dfe44325a1913e1baccc2f02c20a7f717fd50b6fe1"], - ["ec81ecff030bf08520417c4fd07e657f885b3f32a71a3b7ecec3fefd9d4060a5350d4a48660200000007006aac51005152ffffffff211fa2d830dd8d6330aa2d0f763f448e68cfbdb3e960a916ca6b03b91dc037e001000000035352653bc6212b03104ca8391689911622581729ea638a0c7b62e6112af61155cb11967e39b7280100000005515363abacffffffff0437dfb504000000000096673c0500000000007816df03000000000765ac52635100abc2bda400000000000000000000", "5300", 0, 246438760, "4614ef21963de20bb70abc89de8448031bbd31b4fc35bab759abc065fbaa1b61"], - ["a44c0344026c3441ffaffe081b245cf3d4ef2cbd63a7c25b311fcb264fcd0bd3c3adf1e9eb0000000008ac636aab53525200aae90845262dad03d2c0939ea1567f798906dccd3cd155bdb031072e1b8bdf67243a2f910300000002516affffffff03a9c0830000000000066a6a6a5153655497cb030000000008ab636300000000acf11d500100000000095153535152ac636351000000000300000000000000006bba260300000000324bbab57eed08ca11e2e7bd846ebef0c81ab0223a900d21f72d2e8147dfc6d4e1b169d6ab61981b06faeb7c50f4c0cf12c0f6acb6a33112b9c0f37fbac411780a8384cf5a45e5a89408396aa9e3a2c5567a855ef8b20c7f298732108b931d3700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b8d393e2d2e637af2f397d751f0ef5776b6595ee001a8da90045d8c6e80b4d0590f454f8607dc26f327f9e6e4f8ca965cb48cafa9f59968327ee9378cc3e0158367c3aa73fc615c7aff617bb0890901cc1830423822e85e8afad002ed9bed85277bd2bd8056f9c61eb8bd1b77700afad188fe79550335bfc58918059027ca41a022b6880222ed63fe312bb38ba6a6644dfb904733bf23d2f0e56bf694be0fd1c1c031fe0f99fcd3588059210dff5ecc862b5243e37cf83334a354e0f30fce1f2983d0b2bd18b1788838842a97ce53eb4786756d4896103760e4a3338a177efb4c17308220409c368890bc3ecb284fb1ef9112075471059e4cdaec1d5efd937d4d807c902153969e80e5b1a53a03986db99802441ec78e1e8caa29037148cafeed3beddd3021ef1a26c62a31d9f73bb9e29c6f4c6932958aef1f91a248dc46bf1fbb1e3fb5f02126d8e51b0367492b79ee850d1654cac42b4d4e5ba686241e651fe7828085fdf0328ab33982e01c5eb95d992fabde89f334f8eccb38fb0b9e34112e8128ef37e920202fb9d4d1da47b2ec70619932109db6f78d5cd3ed3583c0351f6067f128e428fd8b592300e624845bbb66e79e7f30f96fffa1e8bd7556e5e520eff793de61bc6c71308c53ede90954c6bdc7e00b36034612a2c1dba5c6280b933110c45e48e1b7fae4b2cd6b4e704b60ebf11c564c9614387368d22d5a171b8b19d5ed80019e15d90d77aaef8d23477248e2eebba74ac62e9de946678bb0aa6afb4c38f5d1fba39c9504670f874195b8b80074f53b4945231e66f13cf671e71ad4f7843cbadd3cd9673ec070cce4481518fcdf91bbe6e7f80dbe0cadb1ed1ff1099752601ccd3cbc7d047688976d81c4147f3f10febddd5add060591413a7ed977b365a3013b4ae992f1337387a53ae26ab56d6ac4f058fe969218542d441b781b8d90fda34b0fad3d3e5d6767c7654326abdacca91e88851e9cdaee0d3e9029fe95b2e6985a1c1952807a9b09e9424bc6d6c125ced8ffe8ea8f280520b1ca4c3493a809751e8b49f74d89da09b66d7ca661f0416890569e83afb4ac72ac4062deeea3ddbdfb6728b402c8d5bee75f88f186ed42fab3260d87e14d6c18c357a667ff0ff71051ad65c654f8278a8b167751026d741ffec3815e9936bc019b790d65384e192e4156871d93d2e80716600ac8b98420d700c22b800fad509ebce3145e4a0768dc30c8932c7c9938fb464f6acded64153e2336bcb0d92d4db5f8053d3f870cbf9e78e0a8b77d842fba77f7769f625958abcbca716ee8607cb4131a466ab9f7daf05ca4ffeacdf9df5fb2d1d6123128584fce6850686802aca8a81ddaefbdf79223fd935a9bb06af2b90fe236c4c39dc65e78dc88074f3fef8d1e663cf40f52bcd23d1d9222af0ccb102347feb2b8a59a97c8aeb286f3d3b3d3fb108237574ad023e229bd758e0183a29defe6af4d8732ad953d6ffbfd85b628b9c95c3b3eae0459aa94619b4b8e2a615a67a27446d8771428a8989a6115db3d4860a9226d63a264aed54505b59187a2372e9535ca17f6781c25f44f9a30d59c52f997bca2fa1a71845ef6a8335cc257582e38d488e1530d318ceeb590d565c690897523485abb90c5564503253f7dab4380e8c79214af5b179718e02c687c4762afdc84e4bf20b2f2b1749f02d232a57d611ce3da8a5a114fbbe962f931cd2f4e504be72ae65130d2b889dd805ce41ed60f67489f92f9d911c4db5ed447d2e437ed2ac8589dae7a94f3da31e1b91cf98bbcdaf6146e02541dcdbb9fececa91c5020678e93cf0c8833d36c840ce61ed7fa0ee4c5e92d917e65f391ed1f1d3af7d59557e60cb09e71e03a5c4ce1b775900eca8e010bdbd17016d6e651486ed040bbddece4850e524e2ac5f4cb42c71c7be7ca1dd908bc16f21b880c2a1cdb1cbf6947070e1e7e0da74042517d8961b87c75c75db879f7f438b99639eef845c42dec8a40bd0af6ee455b793e7d0981daced5e2eaf5cee90952028225cb692a829c5a920ddc2dc7a4728c595e0510027f68b197a4fa29189576e7934af94052fba33d0b849d167eb346f55acbf038372c4b9c93ee078dc3ee78fd6e2b2f96b46e9f8545945aa480b93829c183fa7c65afbd7bde3cdaff19bfef3b9ff44a91951a097ef0d0668c1548c042e89d62c2aab21a84e8ab0dfdc68e1ab0608a3c3ba66a64efd62ea9258662a6d4d34e7ea34c4fa9879962c40011095ba62ecaa947e8eedff6c2879998e18c47135d97a608b04fe33852af028272b6b1f14ae050000000000000000a0ef0f0300000000f4f7dcc72d18f970743346808892170483155ff1e6ae6a67a5d97910e8eac4303b521671ff212560433ab1363088c28816424249443076a94b3ba0687dde539f96f89cecc10bd7e06f2ec3ec3b71198c8989e599ff919181a86c4a58f0a02c9200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bede59e25a46627a9d5beb9e8a6572a83f7c1cdb1c193b9d182c0a6033ace3215de28b8e9bf7dfa40156f839be296f5eb3cc6e3128ea9d304e2d2861127c82e9f87055ad065ba84be36b81f0d10f50fa65339d7cd6bdda99d9053d02717fea4622ae0246383623653ee00489179e6179d9396ef41208aca4d4cd8958190070430321d2e3aef8fbbafc757ceedbdb1067bdd19c37d5f345b22cda19d1285e7fa65d02212f8b22b2c1de5d9e4c4d09273256ba368bc53c119dcdc36e25fb65778ec7720b092b2b63fdbda002a9a1d219c3cd0944cad951943257295709f15b15b70faa5e0edfd6e8962c16e05b8c9ddbfb090cfaafedbaaa8d3ab6fc85f11ae6dc4016530323ff41a46a086e3416791012ed634182e44dce606a65e63f4d62f5e083619c510326f9b0310d85aa749ece0963751f33cae15a19c3c096dc31e605771487aeb9e00307976ecc2f023940373920204f80134e8b475ee9e668e2dc2a8f8eb5f435b83b02290978ea3ce7c609c80b89de68f8931f7fe4e812e797c822647eec62607707f00315d740da55f4a28e8f17bee736c2b0936c414db32e7abb6eedc2acd74f658ef572a80079f66342d0b81d89d16075b01c3c7f03b351cf5d193b079a6e76dceb40e63ebed706ac5b265a1bfa8ca8c7816a05646795e9e6f3a490b0b4919b15f1585443bb9eca4efac0917b0f2fa7e9fcc052e2ec802360d92476af448a2bfe17ef77ec080c65bd92dda95b18cda55a99aa7558817c6bd5800f4ba9ce4a8857a7ac48ed259793ed4aeddceb949c16923c537b05c7111fa8ccdb56be7c27b0bc2e0e21abd4f861025d569815e9670fadda882d09c37a14fffb8c21710550995a62fde76b06f4fd8b3d2a2789f2d2f0a3d435635a5bc061082294df901576980012a0ab04cc46db7e66aae8a0efb0496ffcb0fb9ebc60426de669e3bae7d0987b8608e825755621e686ea1ebe26f769497c20406d6e280284bccc9b098501afec2d912d9e38d8966738f4fc542f5a51415a7f38d486a62f6429eece0fb5d88ca7a6d11bdafc42556d06c316378223d52d2975df3102610763e4000d0bef3b0eaa227690bb6726a2785402ec2771886f78a462f2004db996ea3287847bcf2763750d34b8ff894891c5f3633c0ceac05ec319c11a99fb5b83f04a9c2e9fc4d9a5d496c30e95daed0f2d1e24b6d257a8e9aca957342885ccb1009f923d1bfdaa4c4dab1b4a70b045eec95bc21b1efc516746b6cf65b408d2757138cd7c296039f27b5b59d6964eeecfc998a6bf692d1f95818f87daa472af62b1963157622fa1655589979d1d92a5d0540355f4b78887d22b3363ab7a29f10c8f0681472f9b50cac4c786c23d3541af04c4cc86e816e124f115ad360d650cbab6e036287a4bbb45e64b1abf51dc44a5d6398ae9685b1d63815f9ca2817e2d8191afdc4d005a87c56c5d9fda4ebed80a9cbaf5ce048f9395467f90b1a51c26d38199766b3de29aac6a085eee30e2fdec47f9827c56c1bf8e5e968dce40680618d2f123f306b30344dbde9310bf0635a6e2768e00f6c4f5f11294588e85c5e6621a92f5eb449511fe288e1c7cacb72dd4766e3903458015f8f6228954c23dae2da53e1a5ae48d60ab705c358e27d7707221875b2ebd81541e4fe376622051f368c7a561db842021815a5f443b6c0aec01350481f75b7b23d85b74e0acf234e024c5032041666091a0eb9a8dbb87ffe9fef1a6c9fd8f9808536c8ea3e18bab5f361dfc655fc3bad97d9606af876f817e2e8bbdec8acb174d6996d61a17d5b3b70ec3f0ab077eb42e6b96aa68d4ce4598c9977ca24d8c40c7f1f3b32f6b0c6a885063fcb64af999b1b9dca758fda4595a5a2543de14a743be8df6c8fad46c479f84ca18d01f352a228983ad5ef96744145bbb178d2cbf459f1172274493954cecab38197962c4af24fb93d5a0af4e005fd507c4c8ccb47c950daf245b0f41d3bca38946fd9061046b3b47027bf2f248f5210a4dea5f910a600f0c87c4a21046c2177cd037542979b9741574b4f28dda1004c897cc80a78994317d59b1fb1dd7fa0ab1f73d4505a6d1af9527d910fa1c599017d3b6894d0ed6ca6505f91b9c6fd86802cb6cd2da4eba531f0aabed267a26be1508262b67977a766eedbb6ac0fecef35e6fb14d62f7e25bf99cfb6755a9675e4bcb5c11b6928a68f241acb4842aaf5108db874b15ce932f9575972664fd9e872c6c5e4e7a444dd3644a9814beb42f3fcde8c47ee09363bcada61aa89c9f58b51c71374dfecabde27dc1b69d8d208c4604000000000000000000000000184ecb82c5c24d87b6ba0b59e4b13178f53cf6e6b60e924c51410e72da78715cac675fba516ca207aea71eea8084d5cc9e22fe222e4c7ce246dac90714b149ba86ee370e27be2fdd02157869ff75d0a11f1b3247073a490cc9233a32bee0f993000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a9e33f41bef190b94446e96d35a9e6807d07f52b7ca606a4e21a2a379fe8529dbb6f897ee0c65f5b25b74219813be5b2408315d164fec0a7992b4b1c95bcf3827f461f3a7022146abde4d5e51cc7793fc4db45505e3e7b1bec88bd081385806b8faa06ecc9fd8202f67f93410883a229d5ab3f1537d3d4c168cc09d278875a5020c3cf8bf939439fc55ec1d70a18cc1b3881aaa340a33377318891f5ccf2a1ed403065e0c582db8d949c0ef6ba7bef45732786cd0d1928342917e9a73ec5ad23c470b1cd77395cd57cf4406bbb282acc57aa16457fdf8b294e06e1679f7d218a123e326e661d040168f15ee868e5a9840a6f2ea65e038d9c84b1ddc0375181b870c65031a987faffc59f1421653363c3d31e9aab6d3ef7cb0331d6342db8c598665b544031127dc523801efce7b322f7bb73cd4e3d36ba4ff45d47ad459fdd5f8724b9913020ec151a89be917c55b0b680d5d6032f2c76a047165df729bb6cb7369454b23f10219cbd3a05ad36dada98039c5e6b39791559375940ecb69eae23577bd1f8c129b021235ddff6660ab5a538d5e8650d40a88950de8330f9c3848a93eda7589fc2de318c79adea4bcdd83a610a1777cabfaa96c5dfceceab313d0ffdd45c91e9ec4260950acb22f2359f87d4393fdb7a6d449c8a1b548602f80305ffdcb45cbf79cd6b5fa73f78d6cf3a455ff072b4c4163f998b90bc4bb20a02848f2d1ea74809264c7eedd59bc8aa5a2cd04619f9e1fab7c3d6920c09cba91569ab1ba122ad65c9e9aad1d406d7fe32a7093af91cf9a95cd64889965b05f404a1ad7b724f588d878c36de1babcbe111d0dec31cf36d3b959869dcb85d82906b1b7e46382d1c85dc2d9c6f35e96ec6edf36924a71e5f2ccb57945c646f4c76856b1fae0878332a66dabff1447248480281347c89837216a3400bd9ddcc95f03494ddc66517fc5f439bb9320119b96258f40393d19b7d8294e5566a9a6afe1dada837b3da32d7c31395f6a10a331929ad801b48c2763462f9ffafcbc12ade324981573c4a47c1d18b240ff171b4431b5c8ca82aaef4d8b6709a368d5a3aa3a5e0d4d3fc8371cea74c20d227a7f9a72dadd4fcc359bb87024e3257f2d4067ca08b84d3f601d4559d2ea35f4fc0e1defe8b5a0dfe2dbb6be903f82521a5dc94584552832e67ef04b5514d9354e1f6bb0b891c4c52344dd35616031d4359da60fc930c7f137cc8df411ac5439d7d2b9a69dc9f092f215b7d84ac377fb23f0d34825e988ad236f53b29c09a4cc3cb0d6d22de39a4720fc4c595ab8780934ab3a5c4fc8b07db996281c11e8fb4b7b61075fd520d1b00ae5a7aa3a6d31c2664dd9d72a75348fe5422d5e24fb30d1a7cc7e9431f6db6c17a91e64747012a2ec340b20da7486855ee0d1f477b53ba6a92a101d5a0b75a3fbbb6450736e849dc40d9f07c1c49bee90855d0c0c3d1f4a3fd36cae03ea99bf720219935a330bf65f7265ce01c8b3f946bea454b4ebe580c1285dd1edf9bd5dfedd570d61514f3d99e05447b37444e90abf615dac664c9b565b97d50ba019e279ab7d775452daf1bba04f5549b10b7922b45e73cc39e5d4967a1d04195a0ba2f06bd5a6956e47eff0ea5e583824f8e63769ccdeecb17446eeb7ab136e6c98ee69b2f46dfcfcd37772298f181a9766abf919ba942c05aa2699da4c19d0014f93202c8a51f7338d5686f3739faf79fca0d584f0f39c87c0b1356d616df357d6e356fa07d33ab0ff51cf447fd4605cf157718d88a34a1c5231bb51de8f554fcca0605b8637e0e30283b27319ab3a194ce3182586c1037d5896d257d0872a314d7e56a34e203037954811094aea7aba04cf12b7fdfd67ee6c8fe0021d7b56afb4234efcb4f3951c410c84fc674b0d8589378bbf71a84dc572feb42319069fb93076c519a77f38468a9332d57c62251edda1d8813c526c06b8cf7f752a42738033740bcb8a53aeba1d4a6ed215557797eba357c981454915fc30325df67537b7429735b9ad749104a942f559a00dd2eef1bcf4088666077a78863b7ae9a8c7221d02189f81b5c684c6212400229432bc473e177c4a8f5d1ec710893a5305b6eea7cd5e3ad39703419d561daa55f5471970d6570727f2fa2b1c1545974986c246db3257007f12e66ba2f8d5c5c9626e6a36cf40d06dff6ebe069ace3c76e8f1c7ea89c0c3cee944748dae97c3405d071d7f2c2b6e0764966acf06a1450bd4f496752a5553e6c2fdbb450def3e31c1b648b7555809e66443273d0c9098c937a06ede63c81d4abeaf8ce53723ea98ae25fc878928a093f846d434d74d6ec3e732fa6770ea5119d6638a420ca14e3748eeef987a5c3e2b8abfb0471efb82ec964b3b498eeb7a0c1ef02436bde3535b66d570ed85395ad5defedb4cb73626fd1a1b7197110485df315d833b05", "", 1, -253004569, "b9792a61bc77b537792b3a5b59dbd1050556eb42fe4faa42399a32365026783a"], - ["a61ddaec0452307ce7bc47fac5f36bad25ac9410c16fd8ab2a9a936f368005e013b5d36fd90200000009655263006aab006552ffffffff278dd8fdb92f72423a1326278137298607ca8f4dea1193c75c0d620e51a7ca60020000000152f464e668c757d18dfed275b3fb19e6a725352006ade9ae60b4ca9f319ede2e5cf6bce3bc0200000000ffffffff304271c8189575bd49fedc5d1044fbd5046163b8322853fb891ef00e28724c4b0100000006acab52ac00ac51087d79024ab3630400000000076a52ac52abab53a3a96c010000000003ab6a0000000000", "51635363656a", 0, -477329926, "40bc4dbe0a8c8709157c33d09c9d06f8c41300b2afda5e516c631e8cbba074d0"], - ["84c78bb6040f31bcbbedd16e22bf9e1a11032654fc923151b501e99b713804cac000aa335c01000000075353ab006351abffffffff866475c4c109aa93697d0755df4820cd631a1489634893da3941eecca3feab40000000000265009200f193da4274a58026a78e28467f735951a3bfbb01bad79e91c323acf81a74e3cd29d6000000000600535353636a63bf2f1b48e956f61bc2d95522ec6c2a0e982c3d1d671245c1b53171f2a566709c585b560200000008ac63656a53006aacfdd54efb02edac16050000000005ab530065abe0ac270300000000056a65ab53521d6f5030", "00536365", 3, -2079048284, "cb8943842968398b86a36681e48058e9df41f6a216beed5b95ec2df9e7bc6d74"], - ["72736894018e424ea797e461de40294b30ec5302c72bfd931cd2e12b43e9ea684e1bf9eef302000000036300abffffffff02b29ec701000000000800ac51516a53656aab2cf903000000000465ab536a2e56904b", "6553ac635151", 0, -732131452, "85b36358deeb0d96c6c17c21627b6b1a6b61f065ab595607e66333a810680008"], - ["d24ef04801fc0c0214bbadb9cde4bfab39a7e1240c52ecd9eaf1e5fc7c60ff7a60f6230bca0300000003656a535698f227049b2005050000000008acab0053ab51516aff2626020000000002ac510b0768020000000006636a536a6500d26e040300000000036a656500000000020000000000000000c31cbd04000000002135aa48c1975a25e34edc1224a4339c01fa1b798de7eed24bb144c10e75d722dc2163b45baf73dd77ed12dcb778b649834c84eeb941d05a0dd7110e53b8bd033322126feaa306f14d772466503a70854b594f9797cd529e8a472ea72149356200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c28a133e6eb52e40e6bda336591210b1750a4ba7e9b7197edc298d12fa69524781a0f6673c550deab8aa6d39ba6eb8da99d215079e1589e85591b527b32aa17ac2db2c5e96835da5f6cbaee3f4fbba99a22fe772a69239f9b1faefe0c18271b6b68d738eb78efbfc023107439dc3bdd2f01cfdcd0c535aac097c401a6b37d2ea032cd063ef904abea9d1b9dfed2358219febb309fa80c2610645ae7458db109fd80217e9f9123fa803c6ec2956a211b6a867cc097f8b08fbea1a891f6e888883a5d70a2103f5fee0f7d98ddf739481a4127eba777168c3ec4a460261705d784a20792c077c51d1314b2df81171a4636c1af7dc6dd1bf1daa0be8dc8ce87dd71f9df20e032f8bd3451d5c293acc6cb0e8a9ee66555234318250221062311e70950bff8f82022c0f96f8439465962e3a5aa8e87fde380fbc07acdcde1cd26fc754a19050ab52030178724381937acb6f8dac03f7dabe096d31146ee9fbe75f0fd4cfb82a765d7203087e3a3fef9920a79ba530007098aa3d7398f152060a5e865fe2886d0ce12a2c0218fc07553ac4cdae6aa81aff3097ea85cbcdd4d922514ccd50f3be70cd68bb89b7cd0b389f5b77aa837411a2cf26a5481653045417d6c892f06076d4a40b6835e7f8e9df70d1dcbda182511148d2094dfd62cbeb8090494cdfcc9b9f4846a65d1bc3e72521d04f33af17b2a98aeac1a369569c26c9140c6ae526ada577b8861038f2557d440d61b4276207cc593f66f45111f2a5f4a194362f4ecd4e015257f5d6934810422463e7237101a5ea0d4d1dde8f51c13a798344a133fb72dda03634a83a319107cff70e92a0ce205764fec982832a9d1e08c6548b18763585388faea7aa5fc2e3dd91d82c14db270b593cf327e58a656e6da44af93d3c9ed3dacec6ff1a601c2fedbed9938fec1419b8b04300c591c893bb0a592c6194752fe79dc0abe97d07d96bb8ffaf72474ff532e1b9520bdf5ec60f3d91bf7da1661b7df7377be9beccff63ef214e8d52652401ba703f3ee5a4425889a7e9bc473744ee209ead12d8d65a873c4ae6949ed331a542b4d81e4e2572c292b2deda2e495e60dabfa440f1ba33a782067c6cdf372934d24767628feec4dce5bbd1a84d4d4f2cb6cd6bd8c01655bf09ac065f7c94ca84c285894e7aba924b422eed357f1347041ffcfaec496743fe61e12bceffa17b6fc5818f5d2594bb2be5e93f4aed1afab828dc6623a15965f1329f49840c247ad1b5a7247800dc14d923b8b694c354049b610a7380459e682a7ed936561f6613843e5deeec4a627e555a533a932d832fe136558be57c4dd8c5b313b8c05eeef087292302536614ced4481f57c7d55c8cb44e1ae629df76164c678c6fa62bc499c72957c5176b8ac4c5212016b6b4c5d84141b30def1b554d51b0d3a10eee980e91542f190dda43aeb05cae4ae87f800ee3c78951ec0fb1fbf502cdb2c21bf6f51eac4d096fa7dc9a8081cb94f0ab7a71c2169b4c9de82063ef9369c81269d44b8491ff4c577bbb47db47efe1a1e21e1f99a275d59e005d729a25849623b960ef26f291777bcbfd9dd1fa3c6f4fe881ccc6698dc54c4a63f6e5f4f9dc68e7369c03fc3f211db2fdda17ccdcffb714a9e6d1071dd602f9ea9975d7a81403b6340bae5ca2ef70c689110419ac33d571c84c8e3f69087e37c1cd7769c2ccdb4700e57df07e7615d2299a452734e753a6435d0049049bdc81f6096848d89e3eff329384b02fb78e90afa59aa046e60a8c77e75e963656e484cbf0b1a60d15987f84c38b286796af0a3dbec806eb4134974c54a7beda49756d041e3d233888769e247c674d0885a56deedcb4c8266903f1c61c7a0d885019d2fc855db6d6042bc89af78d4de2b08bb055a6054a5c9ea71a49e7a588a1be873eff0d2a3a8af15d29492e0ce81c9cf4f0f2fa4cddcaa361d0ee3098e131f60b8174630c112487d39699fd236a47744850f6edb6bfbc6e804ae3dba02893d377097ed6ea2fd7b6ff844e5aae3eed658b9da1a69ce8189ad083bd40ff5881f48f528ce1d9eb236922be4837b612a01838907d03e6ddd48e0e23c5363c8e10dad10ab79c0432834b288ee1bf9a05f7f8f0a253dfad33f2d61694868e452ff10a92069474021608b1eabf53c1efbba8870d27be59aca0228b313aac81350be8925a637953aea898a01effb1410c4aba05e305de31c325e090e014b655d0d3dcdfda5bfc2daa0781a53662ca74b60651284dc909b0edfef629078c34f96b76d611ceaf9260596394aabaa0f53c5c5d43e55029a74200000000000000000000000000a0704d44fa33d462d5b221848e8557ad251d1b2b0dbfc6249b5480ceccd05a508f2da60d5d366f24774ec25e306f0e7db776e4b7dc41939fdaae42a2b30229e5280af298c682334cdbeea3a84641af33982e52c8c5c99b8f118af4a755272eda0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060ebcc76330a4410295265c537bdce025b0eeff1cf248b167863de34cf83f401d95bce4181c4689252a0a364ecb80506d560ec1a75dbd4283f99f06c9043b463af9dfc35268729da571a61e9da4dc96ebd2a1d0271df7ef96a84047d5716a08638c42ab7781d28010bbf603457498c3f77c0a61ac96eaef21b93b469fdb7c436021be9a37bca61efa934a8196a0f8eec1de88afb0c4e3507be021130d0ea6f70e1022e0ccb66ac8fccba3885754b703c8c201df3c4721581ed377f9893dd18c839bc0a2dbdbeb146f4b66a00433f464173195ab4afefc18c3cbfcf2bf61fa38880f9db2a8d6b416ef90e3a6305f52849d9857520e8086d175793748eda8a6ea1eb566a02130dff87b6aea228239f91aaadc69076d05ec49dbdaa8d73b302babf655fa1fa0225977ddbfb48af8615a73ea631da8342429ce8d26397bb6bd81d59283640f1ed030d17225464450dd363b852031ca84b4d3da61775312c1d45ccc078278529e69002295748610380998c1203e1f7a8285363f4be967e07a1b94e6ea05eb85064726b031f0534efa16c26ae557c511aed9be77bdeef4dc36cd6db864ab4695f069870b06f9a4ab756b213cf088e9da937b082a7d3fe90af7b2be87465fef2f106ec9b8ed822b4b978de7afde737df4c101fea7365a7a8b00b92cbbbb03e466423cff3a2fa15aa8523b1a3c30b3651f7e38de3462320e134ea932c7cf990852d4514804d182bd047df7965322a1cd3a9c7a50cbd7a581fbd87d28e8e0090b64d0957037d95cc2e29c4bc696b87ee05b4a6eccf73c6526723bc39960ccbb5165fa40fa7bcef20822485c16b2c5811f02ce5a86376dc10fcee4f08db5ee6ce16ba86d0d5990d1bcfa98b8e51bb1444c77bbf83a5ed429822fc61e1289fc85a814597256626a4bc10d4baa21c9f893873a728a23697d6afa474944881ad51da38cf1a7d334486bd7864433b9b9d4a6aafbe8cbcde2f3f0a3cbb1c3ebb388b0613ac57516a468e943652082b2f1c884c08d4db838bf3bae086719287017c9ab5f01e25e8274bb86329f81cd0a4a965f8a1d1b76b1378366a02c1fd4b3b8ac02dcc114dd82ad2c6e7b2fa543a29488d3ef10845e7f04791ffd5a7b2adc2e340ccf8feb6afc0b76aa945a8d775f70aec7dbc23165ad4e1cfb585279f895a9ed8351592d3d65b531eaf8d502140ae1f13059d57b89dfe4860fab7f8843c167a56b14e8d318ca0d27c79dd5d274069f69305053fd58458c020c9521359a5e70cf0877a577d8e74f708b567c9c6ae26007b0e6df62cc3b862f009acbabc93e4b06721dad39b50ce119050a6528941667e080c1643138ae1c44ee88025f5ad1cd82cfe3cb041b0f8ca0e45208b1407fbb1f008d83e8d89dd6755806da7e144539cd83d69cf73a8aa00c5e04e5072b997f1cdd8e850d4acb28b28a1062e5664d2ddbec8618011b8eb5415883e58aed18a1c0f6b272f4d73dda6ea4c8240b24561ef661344c1d3e9049875cbf8688dee4188f6379fb5bdfe4c8f4308ad1f2de3b716ae6f7fcb1252b23ded44c9df712ae1b818307cbd883e580d5c9838882504c29510c2d1bf341db037927ae2dbe16a3812fe45f67078871b55b4e7eac09cdd761fcd2f308c8551542ad04b7db9ea386eb1148c00e9a12697b4e9015d7025dbc1653fd55ac71c9495fa09dcf1ca208e13655f1b73b43d4cb8da9314041dedb70a9252d1b51982bf8d271efefbca2bb78baca250aa925260cebcad6724402eea7b5902304db9857898b473e4ab80c0f233cfa28af3ae66a082426bbff86da24d04daf7d2897f3261ef0aa69b50923cf32c490952865ba564be70158f5c87ee9bf43c197bdac9b28bd5c6c0743616fbfff7352d525eb253668aaaff20e45cc0a83bc32c0f3654fe4994677147d6ff431f7fcb279d9ec6afb873ddb8556e5612f80fdbbdd97174f09bdf8931838b7faa99e42c240c831193d31a4e36e29070129dc98ec3cd45529845e3cb0426eeb4ad4d07bc3e74e74fc6813142caa20f059ed6030d82be6d3d111aa8463a2165875f5e6a6b35a1541afb2aceaea9bdfdb58259d1d14ca068e3ededc6a0d5b425214da6ceb99d240ed49e2e54ae913cad4e8f7915198ca032086101a3ad424340b9f15038f9865af10e600c9359999db0e1731fe82726fb320eaea658adb5ba808b4c6bf5fed917dd68a845bf5d31571a337fe0e84e1efaf425d15059a19557741d886e7c937379a8c9c6ff8dd68197810a706997cb24d5c24bbd8b54adae58e50cd1601d71b3b462b1bfaa3324da867f16f37b3bdb0db17304a9a40073419eed474f41bbeddc761f016ded91aa4c92511d8d6190cf7999d9c353322e709f7bc33f7a5dce45c8e6cb5228a9d83ed4b2fbc8051d0968c9e6b40b061c6d42e46eecb1f1f91aa0b141fd22e1d427171e04", "51526a6500", 0, 616562880, "550a3450c2b3ea42c462282df57e53d25c09e14e0e6fd1f12cb49ab9e26ad0ff"], - ["0f1c987d03d0cf72a62e2627e00211db45c7d042fa695f7420b295aa2a650e722ff4c7bb2d0300000009630052535253ab0065ffffffffe7b866040f01bbc674a00c7bca7d2a5e7d5aae6121826198633545aad50528e80300000009ac636500515253ac52ce7ae54dd7d99915bff6ada040ac740f266b4169639b418735167825cd8f5e77a5eedf410200000004ab65ab65ffffffff02098d99040000000002515238bb430300000000055300ab5153ef15ced303c8995f00000000000000000000000000bd903a9858f70d3974279028d28bb6bf0c83be93411a7d283e2a501cbb7313bee05b227bdd331625b7bbcaf0600416bd1d85fa5305b24a60f0cbadab26db665969b1d722fbf70ba2e12a2b19c724b5f035797d315114fd1795ce3af2da57ebe6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009eb1e57c77df09819b680914bcbeeed296153380d7fb6823ccf106c881bc6d6663a173a08aa00fc5956f50681e5e68fc5be829e5f94ce8c8239c6f37b0648dee648bcf0189a5ffdddfb421598a0703454929a9d551262e93c1edb467031b532ca419586b58ae6018fb0b98eefae22c7aeb7cbafa4c01abdb26da6c469d9104fb0203be28da2ae6c41a7b188795731100ce5f279d6958f6849cd918ac208a2918d3022f70932658bc1ec673bb471959e9f9abb7b282dc57c2afd62644bf0819bbb4b90b157680ed59ff29dacd16f1f50049e821fea4a93339bdd6df34588cdbb46381e71cfd88b0ebffd9ad85274efa3fe8e31565d6b57b8c44c71ea882a2ecd08cbe8e0226b151f83e79c58fa3a8a8622ec75cb3fad6590191c99042d06af05d1ea57db4021058e0184a1ca178754ef40bf8affe314ba344e6bc7bb080a38480bc3748a1780316bc512dff9059576487151e62a41a7cdff07ded7fcaddedfd388f56f680d2c8022f75f4d54a2b128bbe521f7b018f29eb02cabd44076cf7909c951cf2ade3fb26031abe2486594bf6c86a43b5a040d60cc77567a95b2aeeda017deeddbbb916110be47fb96303a9ecbd8f584995669194f7d4dd8c8c65903c314ec24391a8c85cc67a55f23a85d8b5af9d13e446c84e26ba9ce8042b21c36965347e5d02de5e26cf1a2f8ea4ce4374f108b50faf7a28c7ba54c2584faa87d92c2c08786b1283c52c65343b47a770a2d1b315a6f9bb49a417d42ca4a711484e1f830bbfd60e9706f8b141422449d8b0d9e3aba6ccad0046ed2acf96280e995a629df3013575e1fa43f1ef6ff43d35b34de2add1bd5859cb6308fb774c04183c184a2076524dc05e2b2372f1e1ff95e842721911279212ae46d243e54703d0ffc18b6459771e25f417e79d5ef85fa100141586a0764aa6f563172b52bc2071776c7f16e2ac85a80f28989068848a9aed74652e809e8d9cbb5ae40b13c98437d00840566e8bcdb367ad915d989c618f8a6d3715c8a5eae7510fc0fc58fafb2a469df99ce0eca583ad04bf2b235b94a8a4c11204305624782a4c6ee33c65dc897291992b097073642ae097c7abe33cd0cc5baba447d29decc864de0d2ce77d3c3afec4bacec885d9216131c80650df2cbd80a75c5c7483c0d7e0f5df3ecf371605b84318584c8348a661195254b7723d743e6737a19841138ffb45a5ae5ad748a5b7321ee1406fb66d0cad92de74f17ca191bb0de36b4a97d9fbcd1a0f390da202e91a1e7ed3fd899de132c6093038aef5f0d513dec679c3d7af92f819a797e8f7acea8dfcf333ad8317b44de245762a30870245f1375e3c6d88ed3ce40bf72e98cd9d1a02d24b7fb54aad8eaec237581499c42498a7d713ff3831607e90132b823bf78540147ba750941eb6d4136aa1c0217bd160362877432c814937f25a5e55f0a1a47388b4ce173da82d3c26246370ebb5efe4c43e5164f14a74fd2d24bc81055095ac2f07349040b67b9b97609f535f569065e412aa6dfdf1d85d16f901e2e53e285a9272f4b68a0a85de908499ae434c78f2f2ac7caf78423694f81b93976dd0e3c3b5ecf2879379dc5bbdd7aa3914fd8beac75adea5d91eea600542774f1ee3343fc0277f3373a1349221847b65183bd565f5b875ae3053fa6f56584391426bd304def28bf51609983c397c2697af3c4dd4d21e75e8a514aa94fd3b0659a009adda2c331b1da1136c3c6384e97c1c999277edf9acaabab60943adf9b8cc8a9e1c744cb1090d5718ea9bf74735d0ba573b017b54b52d7ffb81f99b7718f892d6f8295bed370e0dc2e06f5b48f5c5bfad74adb50d56eb9af86bdd3e1b28172e2a92174259f2154016495477f405dbbe6fa16b33e6f123a35c1f0a8c406cdb8bf8e800f2a7287eef02f33a4422b5128a753b3af5211b8a0ab40fd4f31dccaedd590fa902ecb932bbba3b58ae7a45eba3508b610c1912138ec71ecbac93d9aed8ea110c1b24786adc62e390752ce2282ab05795ac2502b5b1d2a8be75f32dfab93411da404800453e0159ec254742f12516a9ddca431ac53cdf656fca2dc9d2cc23f95ca0e144d87ab068b5dc67e9afdf0e422763eac1f25ee33cfa4a59e90ac389c3d2a4b862962bf566b3636e6d73840cf3db1ab1967c7e358d391b8b2c848354e82fa89190ea967e033297fff42d7cb8c2224ecd8889ff9605bd64f7122a9741791edcff11624fa851db3606ec9e936b86b56e926e4b136cd32f5210ae70aa89b42c7726a4d8110693f3c0c18cae286628d34e7d700e680a9a00000000000000008f659f01000000001427eb266f535c9064084b90fab607f2935fb0a78e49d2e4b252267e79512ae9b49210fb1e22d9fba7c6eb691f399f83edd2601204b9339cbff5b9fb5d2e85e59bcb58e6225b6e8475e76891bd15a919f0f3edaa8fb3667e76dae009820f4e9c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ec3fe26a08b8dc07028f72d26b9d184d27b1050d341ffd6575e62451210e9ed61e10286989f77c8ad295028a40ed4845dbfde53f20741d219af23f35f6098f385ee63aaa9a6a763d44f947f9e53174b4f61ebad091bc4cfe913274e81d791aecaf4c85bdee7f40d8fe632651654c1ccd5a6186c21342c1d1f84fea250c0efd8021151cd44449fa64baae5631e9028c5a1b81ddf29adb545d4a0acde012fbf7a9b020a7e12fe972df913ec64d23cf7bb6521718c57ca09fb4631a14493c0841e76c60a1acd6cb8eba15be15e154677155e9d384db76f8fd213566b771804a01aa96bf11ad730e17ace2a633cd0b46789ac1901f77a68034ff5f6a23b6974f79f6512dd020ae7cd70d7d877a428a7c9c55fe4a5b109cd61869b918c2a837423e5083585d6020e697b2a0a93b2e04c18c4ea4a230fa7cacdd226d36fe027e7dd5f1a51f92b83030bdaf4cbd37e90a7d977aeda12f2baa106e358a78271eac28d7ec913d7feb0e6032c2e142c28065e5b19368e8d0fe9b92a315be9f39f78a46c3da8e913bf2ff59d032e150ea73ae8d3b6ae9a94117a53b56dcbdc1f09408b9f87957540be6d6edc1cf2eac3fe04fcae81801ae814100a33c3c8927055f12f4687574e2d11fc9bd0250930736d084ab006ab062e1d7d231c85da5ab3d325ab5413362fa2e58d7fedab7c6dddd49e80d8397e92b2a799d67683251267d5f58c3e7e80678a61ade049a99152cac182c29b14c78604d78ccdf1cd92ca393e0bd759d64247719edbe7523f202b6410f8b054bc9411563a937613624f5439ee41548aa1fa0d6c2ea04b9c03bb9b15ff897d705c1dba1d5e52081a466a8b7018f6be4e2eccf1d4d7b276fa9af8b2f1b1d30316b63a4cab320f9e88a7e97c5ef0d3df4b5ac1d6788e8d43dc7bcbbd9dbd8cd3a983c1b1e2f0202d90178ad8e7086b60a27a5dba0b557a98d1c9bfe1c239a689cbc5e81e572df444ac3dbe2d0b5dbc1990e18b71254c12dcefc818e400c2112dca22f7c45061bdde1f918ba3a6a50c011c42d35ebe395b231afbd03d6040a0c795784b56d08106d5616a362bbf2b498ad25d3d4fb6f87fabe5118fbf6352ef91a3c1e881b33491a3e9cf287d5ce4c1c525d929fb6c0d802988a68efab3a060a08302655a4a9d78b118fd423a91ecb97fd1d49b09d2e14725dc5c328832e4e07cd112ad5fd0ef6616c1bf160b2f94aed7c05dc13fff096b82157c7c17f96109a40021a67d25d577916eaa2f43eddd352c1b225e4ab3da13acc0087bd361c5b2bfca32451b53c4cab83dc18aeeb3184ef0a4c230cb79136f57438395d766a7cadf989aa0e9e9af7930c704dd95201b320c5723b37e65091e554313dd757165d2f24928950c29cebd31083928f390cf537d791568555131e27daadd3ec1822176887edf4de0b28305cfa34158bdd7bd8ede800667140eea8f865b7ce83bd1c720d85d783695d30f51731fd81c65fca06b07d358666f938c6b96786df53a972bd53d1529b9c88142880472ffcf678e60582917eab6b94ec3d6c11677cb1247dc72936c65903b0d9f4d195f91cfc08f2057db18948489237503d67f756c23528ec43b1b27985a355f3fd4087289058ded33979381daa8395d6d37d2447fc99580abe3c637662c8608dde027cb1bd8575cf7c08a565e9b1cbacd6e31d111a80b67909644b78fa59ee7e7b4ad0bbecd76ad77ee485cbaaa2cfa9f19428292562f416b7e908a6ac9cb3fec0b6acd6ecb1805192fb8ba4531280f6b763ef64bba4ca0f7b6bf3a3bb493ad24704e52ea3232dc486b4f678092f5ce63aeea34cb66910ce91d6f0e1d64f7782b7f122dc115e63d86cac55465a7c46c045af5ac85e483d0928b478c03180659ab469c6d617d0c67ed7308a2948300dc02374533d55cd16421a39099b27a0b0c2a3879861a18ae63392c81c62df09520a0aa2b16dd95470c7f1afa1c7e0a560f718e332be26fbf97d1b5e074148f7a5780a7e92ad1bd753bc226495de02232f5c371cdef06582c699bac566455e2539f444d95c01bf88f9f3d1413116a7c16e521fa6c97f2fd6cb0998eedce5c55841050b2e8128bd6160202673cc0e95c6dcb83b1a2e45f03b888c1770a2cc9125438186b8020a9c0111ed25e3d71d3b7a4076f5bb56a9ac9aad3115f5a66554320ac1d35886845db5fd496f44802ed11b7afab8710999b1da0c83749de46f80c0e4418944a1fd6551143b99e53f23e85cdcfa8d12b3341f94111ff18d53c52139db9fe32ea028b7fc1bdbffa6be85dc302ca259bc6f6478897dd6c05000000000000000000000000b9b200e72bc4c09f1b517e261d2886b24012cc68cfc9e0d4fe819a1ac2771bbee43ab800797345d6a95ba486d5b2f8b855bb6f1b936bb6b5e89fd0407b5b3140297648f8c68ed2c820d6d1712179f961e7e1ad796cfb3d2fda30ddf59d0f6744000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a3e5ecbd404110fbf75824fe5dbaf9b57b6133fde01a77a7e30a6cd018842fda6f365a353c29f6d262e2cbfe20cd0a8c1c624e6a6e4fcf97856e532740b5f7f563a0c47fcbceaa4d1fa8429d00b2f5e737454b8b4b8c23b286a5e440f7ca3f35c81ba621cf898d3e64d22b32afb2cc5e209445b9fa8d415cafc5a64f28489690327bea66cccb349325912e1b0e038cd37806f856ab75e19cb2648a00a4282c9bf032f6f6fe0910d07b99ebee5ef0ea5ad34266ecf33de617fa4ca807c8702c671eb0a00c1f8a383bdac14827e4be0572aa8384d12b357a9a13ac831338ec93eb641810b4ce24dd1f52a2f84c289d4f0ff33692bc7aa68965745c7f6e6e0cc32c0089a0313bbf94763175d3643dae025de45bea2759115011cecbce3eb4c7ddaecda1d5c0214f5ba88684512410c7aa2a05baed28934b430a1738f13a57bffc7ff7d75e2020300c446a3096d56770505c677480918ee4e946c7561f306b7f1d7aaccd177c5e3022c7cd94f3ad32ddc6db9f0fba3e5075ae77e581a827440f0c263c800a3b0b7f1031f96e197f06a9d2c003305bc8d81b36b65159eb3c77e024911f080f2e08699155c4a8d7ed28aba5fffd234391e0baa129c4a98aa6c415b5cef50803ba6c282619c1258c07fe6677bfabfe2056f76d4907636e3ee58429d63f6b524d2d3a85436f1bfcecf943a6f69a2af29cd1e91b99217a8c355769349735c3350c837acccde4810aaa83fab2a777cefff7ace26f980589b70308e5d2bbbb60cf64cd5c09882342679506a919ecf6360aa5c3982c62b1dc7897757e7ce016b69c42e62419cbc210f6a5d4d06f57fc9bd59e3a1ded33e9483d09b6c128b0d68aa34c50f22cf38cf4af401f455409e1eb58099c5e6f1346ff35941aae4d0e1a864327ed5dde3d2db9e16b7037283290fdb128b6a1b23dab8af931ba26394fed7825ef7efa3f322a17589f3bf77baf8a93e74407ba90b3c377750a2f25b1ff8b56c2c72704635927dd8793095b394cae822414ecc3f39102fb69306393862fd6c81a977e3ef30b68309c92bd358d627265714add08dd5607a4fa0e959f8cdb2ef2fb4caf0ee9c20bd6861fb4c03bd132e0c8bc2d14d80b0e501f06bc01aee2edba55c743d7e71690735e8297857f5ecb3ae626f23288acb814cf6350a40ba1c311798522e3a0410a07e14006339a054536f63a73fe3464b801f201f11ba2615dd90ae63486ed67d57e90adbe109bbcf69dd35367675066d13fc1b77bc62899446021d1f7f0c2e5c532268e2acee12cd1f5ea07a1e57d5c9f6ab30a26c426a708c31acd9b6e39e55dfc81c8897a017468bc011c81b0aa3631725baed749eaca8ba4509d114259c3aa23045c98f847b4ba38383bcbce13038286999e35a202ee1ad57ef38bb9ea7b8ca9c9d7e301e20d9ba3755354efd81518af5a296c227ab188a07e46d9e8cce4277ac837d78c3d6c022d7d0d71dd84c0ff3bc6c11b24dde049ecc36d294538cd683287bf00c551330a5abdf40b26f4beedee1cde431370a3fd0ea4c72ab4ef3cf95c9bdadc15e0962b5bc0cc8288fd4fa660b337245ab0df6152d91f18bb2e959ed42e1632326664324211443f745600b2df2d89ee106c3b7adf7662437b8ced7872bd294fe73e8df44dcdf0142bf3d6f52f98fecd3e11c204cc2422cd5b8912cd174c1120ff1f800865a15ef774337e14359701cef17bc0d08af760b038e7b40b95ccdfc6875fd628b7a4221f2dccc96420da9325f75e149175d3a8250dd826f3bda65182854dc03e00b4fa06f73f5609527e3cb1496282613024d254fea3b65f20c757a4cdbf9ba99b41b4054a217590af69f59c4b28ea90cb606610cf2403b3cd0491e9f2897ad44d7c933dffb606adadafe709ea234474335bf037a02a256e30ff5f96b713e57eba6df62124b13964e45ce31e3aabcdf7e79bb67930980128bada151a612f1a79df7755fc73e8285525d9caabc181e8a10cb1ea1abc608c6103dc0bb2522fc5eb863d544012f948ade9118e5c16624d420f6f5287233d68e7889e7d8ff510f4a31cf611178a60cfa88a31e986d63f769f7c3ae523ee4a8a7d33f565b87a35950e8453173520c2684b9d74fe8a137a625c3f92755b13ecf73110c2bc5e09f84fefeafdb4b68efb234ad6e2377d00212309678ab32cb981347d04fe140ac5c0b14940d51ca95de5beb4d7a8aef66939e9b1d041d822b228f1c8af453e2a23a0b1ed29f148e3edeb35581d97979739f1972192037f0d454a48f70f0f75439807095bcb6ba205b496b857df6d0258a705f10c5382bad9ed936904208b48aa3ab696bc983c2fd4b88a162bb7490adb11d47a624441088b2f3448b885f3ba24f2799c1aebc84c17cdfe71a186971f5626ec1db695f979b606872a4e5cfd2c33953061c1c8587928d583c9f700e", "6a53", 1, 968570945, "db97a44659afa6a8b8dab437affd047b78b5e8a528a2e7aeef971e588bba9441"], - ["749d52af03d97dbce330b9dcddb01aba477ccf318f1e39521577578ffd6f715f1d28e476280300000000a29bb643fd85bad112e8ca8a541fddd34b00c8315c86cd6cc86138c4d08d8451b35889a30300000002ab6590662a8d7613e996fb1566a0d78f435301b4a6ce4d2f8323c8d3e305dc75fcd0ccdec52b00000000055351535200ffffffff014aa40c03000000000452006a5300000000", "5265535353", 2, 1722198015, "722cdba9d2cd57d981c90a50eac8d3a79c5f1e90b40390cf8809112021d1c517"], - ["b10018dd01b6598f0febe78aabf545f890ad67e0f869a56a864a6f81861fc6183b050344bc000000000951ac5251006a5165acffffffff035be8860500000000096352510051ab5300abe737fd0000000000025252b8cbc50300000000096300acabab6a006aac9795f0a7", "6a53", 0, 1198506131, "0ccfc41fd78f4185055b65b650a00c0eef0f1efeb281d273e02043118de0810a"], - ["92acf4d20342b456acd940e834770017fb19115c889d6fe2bed5f56a9677383dc807df05fd0300000001651ff8febb5a2da28ebb29598f70af8fcd85aadd928accb42c06721dddecf305067530e4fd02000000056a52acac53f11a73e22717203d756482483b9031244c50898e8d65a725e5bce9bca5df00bc14eff418000000000952530051ab53acac00ffffffff016e73fc010000000001abac784a53", "65005152", 1, 1544025466, "d9403b6a24a00f08e0887c6294e72f828f2f392c24fc70775a370431f71f7937"], - ["1465af2603916546bbbb49eab4cda6d14d83f361fc605a1536923169fa10cf74e0ab4e2a4201000000076aab52526a6a63196a5bc55c6f4733399b88e76264c9391788ff4cdc11731b26fbb9549be0340fcd40130a0000000009525151ab63525200abb07604c93f25ab7078b963732d27accafee671b5cc09d24d839dfa43ff5e2628280a034d03000000016affffffff030fc9a005000000000452ac6365d4a1ad050000000000f1d4940100000000076a6a53ac63ac6a0000000003593536000000000000000000000000007af3e76f4980b702387e0afa5303db62717f7fb2907f0de7806d1aa17b24b0c019b0754b34871fecdd2427258e8bae932bfaf0f5406940582859cad20dbbbfafefb6ed5440c6d5f8a92177f7f83720188dad65629b2ea0f46193add8637906d6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d8c6ba008fc8f02bd45886c2a5eb995271a34cea289fce7f70ee8c216de2837b42ac8801f1235723b400f78d52beabf5b1deaaa4ce8625866f019e024010d9051452cb487ba8455450ff1dd86a13403914377ba495f674f69f2ea58fd3ed7de831a21e28b0bf2cb070684c63fc3dd3ed247c492e863513a0f1849127a0881940211fc3fd78b78b35ea65f8736e09d5ee78ea9a73fd68452fbeeb9d8f478cf9f8b021892eb6841e3bf6003e57f9bb65b494bd249823f6d55d48247ed75db022839590a06ed7e56090ba2469d191f83663904a164957f5780a4cf57c3027b412210d94f2128606059996c1bf2f9899e5faf4924457cf064dff0b903ee3b3356b3a09976020b94e8fb5561b5fb7a59bad897e2ce84ab4eba6647c7a79559ebd73fe773de3f032ff07964ed66b14ed46c37af807840692e02605ea063796208a04642190375f003209c65102401b8d0c4396b4fc8a818c7a2c432d5be2601362504804782bd3c1202241cd923e81abee836c1440fafdf79be9a6e4db2f338213fecee8e4bc73aab0d020639530ecd245642b282ffd5b10ca8df118c1f210c5c0cc4321d6ebfe1a8132ecaee553e0e9abe00e8bf62b851831acb3ef0c565aa5014291204777b6bc7e33c404376e6a5aa7a2d37c9db4f80ee94b14f95705ecca2d04b58f03a9c27b0542f16846d08ca0d5b064539e0ba52808e032a021357318cb5026b6a25baab77213535ba80d20a293e02e8c4e9d9a23f48334262ac3519cefaa81dfff81fd3b919df768ff2be2c5722401c6a6d7470613f08dcfe08f3c1d2d7f595951dc656bc2255acb8a0cc0ccf903e1127a242e3f67a4272d870036d68d9f8ebc08957b1e42359217513f3478d79cedd996294d722d54d7b7f7a60562b574ba70c1143dae78e3e99ad7f27be1e3a99131e4c2c1c9f19e7e0604b81f19d8f1b44793d716ba54fdcb9d12cb781e83eebef9e15c1c0ee9059831c6af37ec797cc12bcd3a80c23429e91e3458d2ab0e908c54877cdab36b660368bef6d961c7664469112cc1ac2f121130c56a104ba1f4c3d410d91822b50617aa022b8e1e69b2c9fb0eb5071e164a238f2392d52447505acb850e1d30b009326619a821506596482c383492d5dc6c3d70df765bcc9badc9de0f3bfeae2ec4c3a7fb31742a9e3a2ad04d96af02ff6b3e7959fb8d86974b832ef72414963877b95dd8953b9acba05c80f9d6f64064d5feac82c5fbd46768b5cdffa48e6d00535b5437a71e55ce5140dc67ceec4cabd166fd927c4ec7f38954f69adc257db0fc902427fadf383c8802c36719a89a3188ad95754637270e99a914cae4bd469f4a4c2d1312088fd83a4449122bf3112a34cf5179577a73dd8b6bcf239bdf7d1fa5eeb9621225dc46b501247dfe94e8db0b0b68ebedfd54835ccafdcb5cc273de102453b5fa2944c3324f8a5bae189bd99f4624d95e541e5a612dea168bbd1e7e248a8f15067e99198070322b7d5a96a929b4ef601126fd9507410557f55f345b6d50b73606c6bce1296f87d4f8c5eb2cd9b023a7dcf400555ba591022442adbaaf74e0d169d37f3fd5a529c6379ec4ccd8548122c4fe6dd988f189b6a9c4373227f3b3b6abca212a04865e9acad5b841cb51fe1f704a6fa4a872a0280318f883d348b3dd38a88402fb935f4ae9d52427e90779184ae1893e3c71d622b003e0a794eeff9bd7351dc72da65e7c9fc2b3c792121a1266241019fcb4a9c22e20eaa58f8495a5c2e3947b9ea654a4a02727292d183f6f8ae5ca14c50de60760a38d81d468a6fa1a798a02539ce095e759a2085e0fa8c2c676c39a471f8dad064f24fd7fe510d23d455c49219b2d5c8e14899c29eb2d2e4d76065722b1231829f2f15f06757d344926620da40860308e237fc81f43c7cccaf103a7c5ea3c6a5cf466cc94aac8dac53a69007a0a10789facff54abaf945809fbe3281490bbeadc5cdc11ed01efc9331c2f8a7b58ede38a3261082db5a30697f22536e363aa4192d40e71f25d065d77147849218593a9418c7370135af511697424057b0df15b3d70978171f7ab543a0e6a77556c1d93fa496c42aeb1eafba05609ac362ced553855baf8ee73e6692ada2dccd123c33d3d86991d0391f2458ebc44e86d2422dd34df251277b78d4d61ff5086eb046ae92f6616f222e98703d89d944c04396647de5b20814c6d3497f3af1674f467837915fe6c98a04083535658ec5e3e473c35edab29208be96975a9ab48e63e7eebb2d0aac4c8493436353cf1255b6ff5557c3667d59288a172c00000000000000004515bc02000000001331979ac742c7f6bc036e49baa52f3ddd0cc0e6d094a45e9f9b3676fed9453cf7748abdc3683a263df4156144412d719821c46e971407d3312e770bd5f2181ed3b7266c648c9814b40e0a1a7cfbcb806a7c831f671669e54561cd9ea7d1547e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dab2749f7e301a4c204223d0ef4bbffe0c0a938310425bfba71fb3b374c5b335c6e75350d06313e7f0de0199ee6c6536ff1c3f3addc3664670fe8c0f2963b00330c28d89a26bc5cddac81b178fee3bdbbd78e9859a34a3582211fa626eba7c61a651877fad43af7fd7ffc445ea679760a737d83ff8eab78faa6342b5fa59061c032d10536c053db45361766b7971a90b6c8b1f4e7e67d3b2eb2b2cf1e3183ea17e032e34eaba6ba5ded39fd236e4e9f94f0a1a43c3fde91713193ec46ba3d948178c0b2ddb1bec3943458ebe2323d8d0e2fa471d1ea8ebfea3a30f78aff2c65d438ae814cba2df42741de15504a4a0828a20b4f932ce4a83be74c01f325f9e4d762f61031f08eefd750500000a15ffb8cfb044e79b677f4f5cbe2ecd45e6e5542828d0260220555caeb58b03b51c59d53a150a4fdf72b3e1bbe34a91bebac2f0c18b6b33940204a6aaf7f72f4a4aa86678b405db1b21d919458f72406b39889fc7a2b0336133022e46c7afe396956e85080148071da595e3cc1831c2b37f5b36e0179a26f430fa030571582d3282fa3dc0712813d5639060f2ac917778ac5eba962794fc2891da7a4d291c09b01a6d83a1407c89694e0a14b3ed5ab080d9f95af76390b86f8c8b1c4538231087e0d58dc0c8921e1c88e39f1a7b12af42b04714a7c2e7f23e0bbd8059d2f62533a50c215d3747e6338cab85d425b1491531d017fdc1d8ee6b927bff39fffe386491e26b82caa69b3f9251802f37c2a6a48f7d7c8b44ab3b0d201955bfb78b78df7feace037aaed675149f87e7bbff9689ab5348f5d50630d77b214b822c8677feebacd9be2f390a44d265f4b0376c77712c23df227ae2a1155a2763e23eea4df15716707cad440b3013ca6e40b4158b9f20e105eecd3c3057b155443a734d6e95e58ad4204f5835e73f1bd01bf042e8601001869af091f4c24863a86e80de02554e0f368a847a5178e6c8e8900f6b356271538c9bbd91513ae3fcab36bfb62aff0e9fef0bac93747d6930e3a432f1c623e66675361bc548bf8b83c667d60f3e0d16ff5ef85771241dcd41fe76ed833070c7105ce0ec4075c4a0982552db63ee002a8d47afeee97a59fa1e73e6d33f8f3205d5b05d0ad5ae1c43a0db2f0b430c033aa4727dd60633f7819f35ed00c433ba4f1135141ef623074c2e86e2565810bfef81443789842c41e3059c81b183c802d71154f54055beba6a47d47d18be90b93baeb80d272d31fade670d130e773ab0c04fbcb279f5a23cb164987f3793b48a6dcf95894fae43985c04df3c5cf76d1e57dce61e4ba3a384844c87602bde0bccb634c66f3b26da59d9753d4cd82fa8059dfc83ea504de12fbc80fade645c7d8342d4df15751bb2cd648a13ce39b9bb9ed3aa002dfb50bc7f8b0e0181df18e1c9ea8c323017218a6c9d19ea5a3010f127309dd4050f7a1fe9513f72b5cfb68aca5865dcde7b3db3f3a49037290418ff0d91912304805c400551e11e041feb6809e6b509f32758a205847b9331f7bae16526a9b57c49c6ef4e4ae73fb6f7b73f788665ca338b2de1f1e0266654589cfcf484777778eede800940a0fb0b021dfb507f2bb4c564c404777b02b50b4b3b3c4223aae2dbaf5dee0baa829881ebf81764d557fc10d11f502510e287f058d42990bd2734aa7006c7746359d412b3c575009905d9aa3473140a1962948d9184e2494df8509c00dc342ea8e509f7f4f3a68cffa6d602f182a92ffdb16188fffef1a752494f3d755dfa6facac8b574ddc79801dc820f39defbfbc9882c07bc92b129955ce4f918a3cf85641027e91233a94cbeb806aae1e0c15d5d5e3d9de2483e139f61c5f52c30653697ab5e093f7581e6d768410a233fd7b5a62bd6dfc3519e4dd3f5cbaf7152f625a13d0002f9e394a61e40ddc582ecc46bfc2400f71f5e8d6111803fb4c454f124531db111f498f4986d9da4b058caf954c6220dbcb82fa4d1490a30ec336dc8bff1fc1ba3cf6d5ae24ac863722dfa0a07f854768ce154df2343475f849048d9bebc767af64a5cf5a459185bbb602da315e0c619fdb5e6b828836d2580dae4e3236731e559c5e8fcc62d11634ed98ba63c5809cec1171bee9d2c37458cb4b719cdbf744701167deb8963b013f28049a03aaa76b9bb3254b9180ed09f4732d70ca26bc75cfa33e168dbdf07d89d7471e41e0486f4660c9893bc774a435ddc7e4a07aac5ea566dc49e09bdbc4d316899bdd72f3f4f8f99558266e39ce0ad95df0bf6d5b245e09bd42d4a5ad4e728b1bea572a7703a4bd5b445c750000000000000000000000000007fe571bbb2e812c4a70b78cd78ff90cff57f88adfbe2fdf7026bb8b33f1ae5a37dbbc82528f249fab10c471426a342ef9a39a2cd7d65a31056d9f62dd1ca55e8cc9a2bc0a567a0c9ee0ace60f32e58795fb683efb6b922ee16f333e60a5f26b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000229c561756b18475f936fa3ba432376f80260b3f19f3baf76026493954940b8944f3af0cea0142b384e239fc538c4154b606fdf0a311841fc5fc63ea5f35366afafb1708b232ab0362b81024531f267aea2061d146b92eb81cab77bc16af0dab1f353513e1b9b2408a1c1f2ebee866b39b67e25ce096455ff850cdbd5bd350ba0320ab37a3ac35b23d7ee63d98ec182bbf57b1094295d31fde44f875a3a13b3b21020f5414f4523e2bf72069730a357a3dcfa58ee848efc03463b322085dbb86dec80b280f8947b1b431bdf8cf9216f3e8f919fa2ecb085201f42235952127218264a122b9e7b2242333fa8a808cb04d9a95c04615b3dc639161a07b2a9119d68407cd022bb540099345376e89f9e029f38548a8698e467382e4900a000d8ec01d8fc807020cae80d43b8b84120f18fee4b178f396cbafeac83d52da433ea406484f17787603146d91352f4e312c955a3cd1c6f47ed7f5f7b1e55e4b3fda1ad7e90007898d6802062819a15ddc40ad189b2adb634aa1db873563614cb6d9bf4c8cf564ff28e27f022e7d21056188e7a3c1b57b5f44b7f4d5e330640f8646c7cb1927b29dc6e816523f9e98ec9bf2bc28efa1ca6969888a5aebc0ca6998e99db1f0a3a74e05f3f3b947bd8bec29fedd93e64e1213c6d019c6ab69677ec3af870cfa57b605b942f546490f94a89ec0487c3828454482b207601e283a710b796287eafb3a60d2330eeee0d1282d38fa43963de55bf1983ad3202f2688188d5635a6b83cef6fac52eb40522878ffa2f85cd9cf12efbacb7a6e95aa1e24fb9995cc3890ab5712011c0166ecbe04b15de6c135bc985ff2a86499c11b4418d74af0eaec419249976ab1a80f02b561edc659cced2d2b01a15c807f20230cac94cc14c608198f0160509f1f36f48da82451929263f08232e5dda037873550b2b6b8d7078ad1dcc8a1f4c36674cadc2a3ba2b0a406f97d1e105d537ae7393d611e96125af0d0a5d1dce1713340e17c1d3c75403019dc6c6e71ba19b467ca141a67de50f8c1c10c90d2bf01e7bc2d1e8215bf7c885de117e064dbb28b4561df8fef0c4168a95a1007940d48c6d5417900f6e0c9d26d728b480b8bef337ef383fb1f291a00c66e5047bc4f9eb1c4570673a867731d477116023fe03014aef0e7919cc30ea1349bbf4317f994a964d16852816525705634623cd97a8e82443b54cc74753465514489f1750ff5131f56d169922410173ef4fafbb53aa501a7de0b8840888ad33beab082d82260d3d1ddb8c9d6618a7d9ad69f5cd7c9feda347831f1f0baf0e28325f683c2d56c871c3600c8ef9ac2f4126ab5ca2d958c9ea57b9837fe950977023fee46834fc8a7a02b298a4dbc13711bdd0f483344d7ab20cfff38695b19d30987369480e7463cb4e96a3396d241a7f218f9b3b62715b4fbcac1e52a2b5c3cb3bda58270da624986e95a15f368d63f1c86abdc67d4739abb481b7bb8b0b506635fdf8b92d19cd3c06877ccba8f4f7dd73dcc9eec0bca263348d7228613254279bc8800f1a666bdcc78cfaa9a206180a17f8de1ae30d080635bb9811504a4762867f5ddc55d7730ce8636704db52ccda2e4f2bef847a82ef072f1475134b0f330fba9edd9c232f86725ec6a4059ea6f7630d6b4d42bfe50c56ef8d437b3128bd311f60e83b7e933743b4cbadcdb06d6d61cfd17499ecbbe15bbdfd3d7a859a3af798e107c11947271f7be5a6b5ed87ba5e072116af7dc78f71924f0b4508689e7b36d56c368fd3292ae54649996e298c65c84de6a01ca18f0a7fd3336676541ea311eed6984f1462610fd8b5ec3b719c37232c304c18e2bcfdf9ebff6dbd8c243ab5ae348ab94dab17276545d0432a942744851e13ad9c290f82af8692d1066b8f2e8516881db2b658f3ef1b5a66586a51e275b0262c9fcc124a722f0ce68f40ea5d8c88a86ea064f154194cb9a82f89f2e6bcb16af251b7fbfacb2c86a3def22aa08dc4729e17733134adf84e9309757389dfcc2522ee07c494373670818799fb8d7753504ef7b8fc187f0081c029b60acf247d93e1b3f25581655a76c2cf40fa7e3c649ab2018c5169415cbf90f05adeda85e0f4eb03966b8b3b709a83de22c7a699d3dea42fc4773e7c4d83e1810595670bb1285a93102514e9791f3f9e7f1f74ddd5674c9c6e1af9d8d774e1dc05c9451ef8ef0a83c7a730d8a1b870c016ad291af915a004434f77d6f747a24e51c7f8a3b52e7e363c4cbadba573ad4e429189541618bebd594bc28f3c85bf67bcc8f5e3a45ddf38c5a77f3922d4bc47e76b7311da5aeb2ba31be339a3ab87ffe9271cb61ecf6b94ca4a8cd9661c5c5591e6520c11d10166860deeedb8d9644a02d313e843108fb8997f967db29e96e476c94f7cc1f3cc9cf6568f5ac82f06de91f6b8982cc879575612c05", "516a6365655151", 1, -1609995268, "0c90fcffd7a7a1b35b849db654fff8f3b71dc9938fbb4740555346f4c03f65e2"], - ["432230f301f4ac25151ec09c420c6372b7409ec85a25a4d64a2b8a47048755d5b2939242e400000000056a5363ac6ab2f7e1d004ae2c15020000000000a330480200000000046a515100472be1000000000005630052526a2a815e0200000000046a0052632bdd6d19", "", 0, -441325616, "a2deddedb2e2ab7cb40ae5740ab8669f47bebc8ba6f3c1a1c85573465130645a"], - ["ac02aded03fdb1f89354358a1496207e2fb9e4210968aab55c65848c6be62c9bbca33c0c5100000000050000ac65533057faff1f15bc5f7e08fc57d59f630e7b611e530a63d1bfae1d0fe8c92afb2ddcbbba650100000007636aabab6363acffffffff508e7c465c0dcfdd3d3535434446ffaaf22ef803ffd4d5c9d92d1e9ce034fdf102000000055300ac51ab62aa389f04a77fcc0400000000008850990400000000008d838c0300000000008f115201000000000800536a6a63ab536500000000", "6a006a0063525252", 0, 1181079097, "0d001d8ad43abc4457a5d8b1e6c39810517d5459451a5a274c73231b1b090882"], - ["c301e7a201790268bf7f418ee32b3f0b84e7d5f9406b27aecd4ba69b7b619467556d4663270200000002ac53daa5eb7e0445e57702000000000665536352ab51e5f3eb010000000001ac55170f030000000003abac65a4182002000000000751ac6aab656565b745b34a", "", 0, -479447383, "96d09221331b6a08e224ba65003e62309f8304183a3f71373a0704535b13bf5e"], - ["c3d7619601e46ff07403d2a789e8ea3ab4c6295e51bdc751d4a361eb02618700fa46b028160000000009ab00536a636a6aababffffffff042856e00200000000086a636353006553ab3f4a72050000000009005200ac5365acab65340935030000000000436aab000000000002ab5300000000", "6553", 0, -817234043, "0e7eeae3d0ef319b636eae2e9d6beda237f6b0884528b0ac0cf8b4c0a243e92b"], - ["b3b490cc0437be797c194a2a6063273c2ddf18c31598800270d1b269fc9f17f8e1eedf2bda0100000003656565ffffffff72fbd6c465c18bca4ed28e8aafa231f765509f34fe6b29dc95016acfd2188d49010000000853636563ab000053c9e35e34ccea0039fc21f5d06ba00eb241a5315243a8609d2e621b5b5bedebdfd25187850200000000ffffffff9aa2d4fe25dbb060213943d456608bbe0ed4ff5228461fcd56498487fba75b8f00000000065352ac5351acffffffff01f54dad0000000000086365005353ab63006886b81e", "63515300516563", 3, 2112582072, "feeeee394d78315fab87fbc2a82d1bb119de3660dbd6a781bc45e052c09cd45f"], - ["7881b80b010723adf5f2184187b78357e4f786707ac4f7c6790726facb60f6ce0baca2cc7a010000000151ffffffff03d6e6be020000000006ab65005253ab850e8f010000000003ac52ac8328be050000000001abb38b24ab00", "53ac5165", 0, -1702400657, "944cfac48535d715d11bbfb90eab3ac85abce145004c5521923c7fc9220adbe5"], - ["0d3fdc3d02fad2dab63a3b20540ac11effdf753ba3974a5afeb813a713f531ff5e781f50ab0100000000450ec220476f4ed01e8600b3dc65fc2ad1cccaec5ef45463e61d28f93d1ed0e4d2d781580300000006636365acab53ffffffff021ad25104000000000073091e05000000000000000000029bbda604000000000000000000000000b967babd92e695b9384cbe8c9ef3306326f97095052267a469cb893fe601176433137542e55619acce4b6d1b5c50c952dce97e46544c8e34956c7f02de29ba7ecde8a3a908290033715b03a15a6d2d1335caadae339899ad941458230b24d2be00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d4092529c74f171e27d8b95538fab12a98448ca7e4a0a523f0617e9fffb9547d9df569b123f9c8f1b25eef44c040fa1772a6241542a12510ef1390e6257e2bcf2c1423d22f7cfb0560a5b1486081e26a24507aee52148152e3288268a7eade111c59cb017600ae8d499868630103839cdc837ee1e3006adc644fb1c97d123ab6030e567fa7782441c36c253e971d4ade298d37eeeedcec933d8904ffd226df79e9033062fb66afa0fe4a8fcfa732e7b530a00e80f487b5da5511d9a2107f617535de0b2bace505b1dfbaa2ea5a9d064b4dc6b8c739971dff6e6bf26d3b5925a4a3b2140b51d144f7d5cf1f98dd8ad05fdf160da8c63f84e77541725508d3d7c57279d402201cc4c39d7321903826a6cfbf312b861aef3997fe14ce0437b04d4c7b73922d020d96c96feb0f795837314b8870c41b9329040750733400ef08a664593b6759650303b944f477df31a5eb87f966df884ff0170f59debb42019c06ab8799b69738f4021c15df2d6753beccda8a1118ea1a14726ad0f83d03c5e09d3ed22ce53a379751031811fca622c07b4b39f8f4bc9aed8283480c8e191fdc38e78146019ec8163ace89ca2197e91bb59507064c77bd383ae4c309c9ffaa98bd6790de8459d46216ceafae59092c2a73fc9d6c725ea2609492673d91051cc177cf11b9588ace097b5ccb8126043b036b5aad053e44816ae193ca201ec6f4c9426baa55ba897983e46182fc577d9f05868428378f175fd6e49ed007d8c0061e5aa481f414aece9ef5c314d969bd928b0791c013f90ba843578e921cc969b2ac3045319af3dcae35a76fc0a13c6e830dcfd0f5a0c61d24301746f244186a2949c12e1041090f916eb8857868da6203d2707cb899891b480f2889ca6ea37c0d5f30b68a4281023e06244e4ee94af8338e1e2b39ac35a4730f5b77618503325e7c3c5f0ccfe47862083d9eabcde4315461cc19087cb59fc2aba7e4ccf130a630f126a98cbed04ee5c04da4772bbac7a8b1baed76c67cd89efd56e0f54b7b1c5f2b9924f26edb3792809d03097b075bc0b814ea31fc2f9fbeb7f413b6c95006fd518b3739cd71c798e420fb4c82a8c6440f5291c4ade64e2c2accadbb865b486f2674d5ee48c0b2a9b91025d25cb25f704586ca29bcdad33bb814053d9c47937ef91c5aec054430f13c3a060858838a4d329d06bec441e40fcec7d961f08ced6b6433b392be042cef1d22de662b50182a7ae8c89fe3c5dc2f18455c286f04c184aa1f947f1a7ef989ada707d43c148be212110488d456d2bf4439d7c6882d56fb00d5d0688502269c9579d1afb705a01efc4b1283fba0cb2085ded66e1e38d115ba7daf4c91b79b9efe4a4f6bb0ba89bd887d6f3f84382d9628dacf455c9b527f84188818d3b0af5cb35b5643b7df1b09389b83dc1dcd9d1ec9e3bffdea48edc25cfd80c2ac4aaacaa3855577d31155ed45662051d30827b6f603e99156c9771b7bca38bd4070b18dcfc443634d1aa68fd2940cc0e7a3a6d7a29e3351d1ed4aadd5cb3cd5967b2f171fca1da93c88ab350a784ea2d37ce86ccea403bf34f1863a749ec5a8a5c07b7f13160740210baf4f97388154517471b20e20b8c7f0c7bfb61e59ea90e287a9870adfcf1c4846f538f905890b5d0bd1df0689542913df76a549888acc7578317962d93df4f7d708a5be7f16cac48d3046330321beba670d59eceeba41c17c45f0a2cc4628b17ef1422d1c665fe7be19ce343e96a3bdf5ee2b8aa4c0e6ef5e307ebba40f5866ce81da7550ef83542d0d013ea377fa81e463f0990160b1f2c8e40941c67c31f2787d4fc255a8344d90a1aefd8b101909048922f11309f275a3ab52e8e1190dcc5767ebdd1cccff5ebbbc848d54ae7d7ee075b398bdf8d95c9c4f599dd8dbcac4d8704c4e48ac309edebabaccb3ec6b2889a58cd72023bbd504977c0994be6f5e768cbaa5b543056b01aa8ccaa47aceda7d39064c5d0b7794fd2836099f6637de2c63efcda05c2755ce752776e87d1dec4641d93011564329ef82af428f75fe829059035bfd26713eb433c751392023bdf08d8eb0f17ad9b84fbcaa6ced4ef93d1aa98209ea71bfe92dea32a49538fc1d660d2ca72f2e0030d107ba2751a667c06034fc4bc80276ccb2f32e8e739f1410749a82733e6c2c9e0c68a801af82f6fd38fbae3b90ee9e540aa6b986b9b26094c8d743daf9103ad272fb6cf405a9adc516583261f09adff7893332f38e99851d2ea7ccbf0098675a336f4586c0a9ede469ad68da365032ae799b8c21ddf771270000000000000000524b160100000000618a203257b8efeeeb6e595ac4dd1ad4b15c0293949347aa2885b5008a817147fea016c72d6fd119f26aca7802c10e58bac60d55857862e38a949b8303f66ad06cbab3d91a9067ede04432f58c15c38f3f70e3a05ab04445a81586d83dad231700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000103ae9ac43f6f78bcff81f59f06d516ff046ec5618dfcc4be5d7c6ab2a16a9da2fe1d61c61227b920a193baf5430691724d71a147ebe00a6e081702133200ee7e5e9a4bfc309623ae5c60dfface6f12f2c4fcf82bafa51f6b3fb1e982707697ffed09cdc9178183d35a7983aea2ce57040a1ee475f4e4fb9815d2bebdd06c7f70217d0faa77aa1fa537ef644bffe281d9662372e7db4b21eaf370f4fc08e37068e02280070c3d9f3244798af536ab7d269408cfd1789d12335a47f2c364f5522bcb40b28ea1ac2b56cd9258879fe48eac397ffdc898d78b5aa7ddabc8d81805d8f17b126f46ba25fe36169b02551bf8131a6df182c270ebab092dc546a530719a6b86f022fc652557b55b794b71a78800f7b4d1ee608adb0a245a3b0ed4db95f48e80acf0202abe5c4cd0514837133feececc0dcc180e123ebc66121b3d931f7ffa58ecd7f021bf87690822b2d406dfe9c90460ed947f9cea689d787eeaaa3f612e04d9e68fa03226553258175dc16f8ee81ca0696da749649f71c710afd574f1d6b5831d2e172022935c8f79ddd10bdffedf84797d03f087913048ff3d762f8d7a53fa7295b0e948a05074c5e0a626708998710dbd7c1ac15ea23b91ea9e85e266f389e0678fe0917d42ceea98fec564ad188800ababeed1f79e9b52c25704666361949c18900f5f738040ae42eb822947fcf5ffffd585fc7efd7b491c18b47851250a7faab4aca9c1355730c249390e0760a80913633d73f5e15db6c4808213521eddb1ac308b19725fa15a4d0b92604896fe1ff0a2e21081d0e955a71031b124f6e052b73ed52fa087c34557696651adf397aeb0e37c2ec8cbd0d13fe92ce08bbcd34c454459b15a88ae8fa62f3eb67f421c4a4c152b20dcabe18bc08684ac0d280d2a24fc3c847edd93230a4e1d6736a938c174cc1a43b46b54edcad8a532957f56d152134e5eaf4e1d064c137883883d99b68a2246dc435e7e226b77cbe6ae1d37c3031d1f405bfb99fea16883d7dc9d37aa81784c3d826b87e69b94ec76e3fe76ddd1bcd2b90da32991af5cd4d06d74e0ce41eaf8f4c300af227a5030e48b3601b3e793672ac134fa7b2a5538cfa1659e6e4062c6f0d18a23abd2711b7f0319e780f06dbcad2a83c92bc5e283b12b81f44d096c97f4442be19386cd1045efff045920b705a09eb5f7e16571a6104798b354888eb5af2c623bd99d7ebd8704ce7ce0f874915fdf4d86eb70e75acbf872a1a93c5a1a7f2ecbc986f939882c273d30c5eac1a1e37f9fab3f25b5a9a96ff4a805c13bd93dbb33b22b4674c47d99ef9f631fd98710d334b7c16a46d6e4a46317b4a6a781ca639113182b950aea6d97f847780f0035951e05865e4c17b3b744963f28e5d1a5d568620252757d8968e77489131f6ea7c3a513cf1b96b245894469991789789d5d80e1d7c5d6d1f74a844671830179a1c4e990f6c040b57cc0d45745823bb17aa827020131e5a02402c86a75ab2d1b483d481158af8ee9f82e0f9ad3acd5c8ce92fc2f50917c7c8577b4ed600b819e00593c657c21661cf3ee74f83e119a4d0ed19046bbb6ab28dc121db3548341af8e2c197d0f526a5413a264051cf7e27eefd56a7f3c1bdb0115fe837916bfbcaf23c7492efe00fae49fb55c058867df7705146e6d5a4810cfad56c41b6bda09ac8ff6063405da4f902dbc666e6160faece051a0ffe0b55a3fbaa11692f0722e0e12144e1a58c28c10fce7de95a960272cccb74eeb106503338b29dcfb6e22ca4bae8c6d2d58ecef29a8d59ae3e70e34aa2a99144b6fedc47558b6d566f03add2c937ad5bf1e152e45545c76b262c22e46aaa93250be9172d388e8f951a4893e7c0b7919a95b46d132c41e6049315da615e59dcc07c0f9d4dff5a9edfb9a9b0bdce52018668d3d01f3117ec1eb286ab9c1fb192bcb2786edc28416ad89d2b54418cce414e86f6aa996e5700422aba15f6a2bd44745523c4f9a0232996d309178d866aaa9bb7904ac5d841d1a642e5f747c4be10e90e924580ed140be9c5f19aa03eab0b19c1965c719b53b50a96f9efac911ebb8c6be0ae7a4ff38af1ecaecd938e77f15982c53552699555e9c2e7a10857d7898832f9a43bf9263dbdedb2918e91470b70908845192e05f453872f18788f9da67aaaee83f174316bd2b73c124aa4edb44edf3e4569ba42f33df5cee0e02b98d5a5daf430a37bfee6d091f73837adc8befebaf8eb219a659bd1906ad8c1a62c20ddf5b31086cf41e0b712efc3d2fc402c51f4b37b971081a51cb78e688609df83e348057668fff52fbb68944eaa66b04665b447a31eb8dd903b234b6026b22d590e8c393e4595cc3b942546da2c6e433c487c8ab3911f166af66ab47cd46d8f13337b240ee380dd03802cb7fd9596646bcc63af6655ad9bc2041b1925fb65530d", "5100536a5153006a", 1, 2128484212, "0c073667f8a072a52d55497381934a4e350c33c82c4705c7abae57b483f41d84"], - ["89634d970348a02d05bd377b79ec5c303d175e4c2c865cd6551671d3a1a7c8629b977faa110100000000ffffffffde45d190ade6253823d55ebb5ff720d1167b5dc0ed62552207dd2f9be10ef66a03000000045100526a423559a3be47061578a8f2103f300eb6412111530da6a2fffc547e6c0190b81fb59575fa0000000001aca0a6804f02864ac40500000000046a53ab008b2aad02000000000351656300000000", "", 2, -1183668709, "4e4ba43568605e895800309260cd06e9233767e6c57e0132ba703df3c311955c"], - ["bb4e996603078125edb44d4c80bf286c8d2b83dccf0f352f4469a99b981017b8c34a16152400000000076a5365ab5365abffffffff569c13493d32578cf6e0d143952e649922433ab1fe3edd2e21e8bf25d2fe6ea000000000066553abacab5140ed5b672e206b9c9ed00efdf30967d9b4b5771399e496a2bbd72aeca4a992360e6566b20200000009ab656553526353ababffffffff01c67f6f000000000002515316d1e16b020000000000000000ef4c9001000000008ef973fe53762692895a5b28b0fb2e55c560f3f41df626fd66586e6b822fe777aa8f9908453ca0fc05ac31e99ab75086dfc2e3a64890267769537db05845f5c37fb791e4aea27eff91978b35e8538ed90a0861ef8d1edb58d5f8a5643615bb85000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006a174541820080547604fdeb2186bf9f1727ee8a92d5bb2971b1ad8c614e0c5d50d6db7d450b3585fce05d1ea6765105aa69a2de1e644f1a26b0025cb0365b69c4a07ffd8f1d86bc0ef20da7639a1b6ffd0cce8beecdc4606ce1322abcc25e47e4240559ec0d66885395963ddd1ed091265b23aa42aaeec2b20baa8c8144effc0229fce2606bf7180da14f77d5de398deaca5e543728b4c9e6381567f18157249c022079316778e811b5d3214a89545d042130eb33f4b9f5e1574ab491fb544e90520a050edbbdd814ae40c02f43cff407061c68c4a4e17a337e35ac1eaa4e5e973cbb2bd5fe95882b7b28d2cf26a3ae80c470813de98ac204c1041e7b4c2310848cf803075a2855e9dad212a2d635bc8663dea374f313355b40118e5ec10635d2298d8f03136635a9015c5aa9962bdb3668b0d4400c51e59ba83b9d6de5908f8d470859880308c229c95b5afebdd48d496ce0afeb4b14a10aec76f414c5ab102946b8a9bf8f0229741b95182dce271cf6b6c18e6bf7ed462402186d877af52a1e173a0df7a95b021934ce30603a236e2529f11139ef04488733264fa4a8f9b15abb92265b8d76532b3db3d98e063ef67165eb0513dc9c303cf50b0d42e912baf04408aed41366ca77bc9185aa611598ee7eb8e4ec255fc4995afd2deef44f486880ff43023b4facbd4d56a7deb38dd22fdbbae24f73a227314043256bb8cbbd0badc228b4842745436c6fb0b5bdf3d0698a36188220b4204976f045a87fa1e41cacd2d90fe967039fc7f8c7536387b53cc3c64e955da105a536c952c79312712973ba8c464bd7c0a18876082b9f36e4e61114ed1b64e1018fe00385d01ed619bc60ccc9db4c626a7f742bea3e8db863543ea717bc72659c6346d4c3003017f052294fa1ca06727bd8f443f34b5e6117647298a3c1e5aadeb0a9f47c7af9ba9bbef24de6d1d76a28a13280ec8e156c9b82b6c1e9d235e62029a2eca899b603249b85ea4cd36669be3fc8879190849425356e10ef3993fbcd7be0be83c936c4e6fcffb63c9a8a5bd23812cf7b826f86109c1999f7e55477c4a4438f8cfee33ffd15908e823c266108f955508cdd6715c756be951abe4a9bdb436bea6e7b84e07f58f553c84529c5c4cc30f89978107e827babe5f6d8aaa7b9d081637ad78d5a323b8b3c3349ab21dfd3777821fd81e152345d116f4523ac4bc8c8fa58158b345574e5c597374f18e899d81f742a554e65658627ca245b9885c873efc153793334e51762ce6b5136cd31545f94f9feb9fc5df1fa819481b9846001a91d5f885da5feaa7e9e1cd2a9963055b6043267d177850db68d7ec57c968bd122426a12df8a2c528e4da611349da4120200db82b25359b9583cb7dac27f6c6338079432ba44ddc4f4be82d146336466e14af252411c466c3c2f7f7509d1953a90794fa10959d983be145d73e4b392a41bb72cc3084d0d663e622c2def6f3b526f32da7e227f12647da138b2bf3545f823d68fcf9f7cc07bf21ccd30aea972a4958e2e0c4dc63111671c556231ccade97a11173a97feefc169bd497d4f8a0d7b8229edc164335a7d68b10702a9d2e55b5889c43dae47818775eadc1ce22325affa13b095c63f8619f86ddc282e99da9ae8bc1910b8617f632789b4c2b14b18298fec213453d88a36a9e7565bd13c6b19ece9fa36d2fbcb3a2afecde525028350141ee94ede7c4148fe455109af07f215df20f070ec68d42969e883c10b255faec11b6d3d2e3a3d7aef4dcf5df715ebb60ec135ccfd61eabbedc0145c3172fdb84d939c4d9e4f50c59b894f1f271eed99988a34f929958f36a1cc2a0fea2441359e886e37e1be1ffb4dbf544cfe544286856b093463f5bac71f9b24f49a1bcf984e40018f5a52c69bbd7527f67490f11bb6f0c6842730ab25ef2d9fe8fad21c9bd8e1d4a9f512cc3e6bc49ef12d095bec7c78eea93ec7f7e516529cf8c23f2ea31def6e90ed4477999be12c84298aa65869ebdd50b7677ad7f42ce7833178f8da2cf21f307103c4095955b188a1b6711bde4591fef58227ca14d4ea6d4273d1d9dbbc9e88a21f1502d1b45564d8671c9b71bb6073922833763e8f315488d14c17ab2dc1c0d7de79ea00bcacfe62c12aee086f3cc0783bf97dc8c3d494845d1d85c2d7741e4f2aea5b3829751535674caf36543c8b76afe33f5a7061309176bf82a50b9c9ce03063c9583b90979069ac36326e2d4694bf4436e9eb2f47c8e54562b28e1a278398c850d6ba84d93f20e18aa1adb651340304d7ec0661a2641871a03366370500000000000000000000000095673fd59d4d44ae78dc9d1f8cd54941c617719d8433787da50afea7a32c443412fdb222a2403c24606061066b585794e62c679837d878bb3ca27f88f78ee097aa96017c12ed83be765fb3c38dabe13b41d83a2e08e20106dbc2f387a912ec29000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004eec79f38ea78fafe9f6768ef1edde8d63320007e98d0e51a9dc5258e1fca929f2d1c9fffa0a7563644908febd3212a18cc06cfff72bac86810e5863f12e19a03e5ee07af114636dd9a5c35b7d06bfe66511dd5a9c48e18aac4c18b6461a0814320499203ffcb47cf8b41efd20c979ceef5afd1a8619b6d2e00bbb43fbc798d10302fdb946fa1796b2fa5be961f965b38392c4536c9d89e0e2850bdb80b0b867ad031cfd43f24a4887c4aef3c82251e804fd99c266a44bfe3555234b200607f436730a02ff9165b47ab4c9e378858bf9fd151a7d4d3e511a9f8d857b8487a4837e97b61e1c6c7bd94e93b02ded2426e8ae9713749f1a080fcd1823b89250c648215c090217428cd2789cc4050d9654f049beda5eddbd398199231b250052c1e8dd0afb24020e9064d2fcdb9cb88b16ef32979612b3f1875789f5e1fbbf4cf56f3c7ef0c3c9030c3a22225f7421e93f1851e04c42acbad136462602667c7e83cee465e09bf3640212b25188350c6fd44d6d5233dcf718af262752ff6303b3e42a382c888ec3f33903260c6024e1339c5f910fec4b3adc63582ab574baa69c3ffdfaf96fbaa6e926a336b1b26b1066acf29a517309f5c13c17a54087b1d3754478a10c7ffe3e9dfafdabf06e4902047863da6d78eb36766f995a2c9753a9a745d0eaf427b0bfa01b932a4c785c7c5bc3e8903fbd58f1ee9353a69171a2a07d8389b4167df10917aa446e3cb59182c8583b6aa5a039dfa357bd498963fe82dec891efb8a9d14041e5d48e336d3f0a00f2d5faac67d9bc20187b7012249c86078a088b2488e69052f921ff6cb9bfe69e02594b100f4d2dfbc7a27777d26eee885e5b5ea1253d1e503d224b45675a282e5da5a2f2897c1330820f35d7273a36bb2138fb1be9cd8c2c8872f63a885f419b4fa9517b050724e1829f7ded707bac4f4237735f743cd55960a1b75ecff53dad1be864b9304465a9a033287f8bc0056a37926799d4cb889b7592b5c1dbffae18f41d104bacd64a2edce91e7adf8cfa38912ffca52294a841fb49a5ad1e30682080071a57c58999dc7fcdb8442f918354e15d2854394def1b5187ae5752c15bcf9ff930a8be1a0b7950a21c135af0551acbaf482eb990b391bccf89c97f427e802bbda3eb2d087aefbaad4534b7ca75858d6a11ba903974dabcea521afa80c995012afbd78ad8ee6de1939e13942e8fd2b3a4904a46fe827c3b209e330b7c37b8dc48e208b78612f3188302cdac6457a5ea44b757f99627cc7e39ab785f13d46c04ed388d6cc83016bdb4c5383a098f461fa39b33537b5427141cfea2afe5720fabe35839a2737f1ce6348f1209ccd9740928b911d32368c2d91c1411e91b72aa876ffca25c83504a8af8a9b7b6d8366e87557cfcceda90ad231a64b52f06a1fd3f59b7675764799cac94360b0106e5a8ce4e8792a6a8c07589918d7cfd9f290cecc370649224b271b1eaa118f4740b15993330a83c7a9cabb7bcb5adbfee12b5f21b759f0a309146448781c17653559ae4490f5f1601fea151485aa19ca9afc84617071e9e9a103c4e31e1c0bdf108bc2753e4eca718c4651eeb4839682157e8e6e19029f08e5312acea3ecdcb44adaad5939f0f68227080f164daa72ffd6965cbb5372527a1ea1bae2597376b2797701bab637ec29673511b362e5222716b6ace3a3983da48042baf113f7a92ea96752966a816eb0fe0fe7768b4a57f9f0853d495e8a3810a97114e56dacf4d8d5fd452f58030eeb257f5359163d4d66d988376b95973141dcd27f2b42bc7c6c28d5df66d82bdb3769b8ca1dc679d0505d8c29eb3d0253b62b6406d908707ff206fa4084034b74dec7e56423ea2e4688d568eefabb188fe5fa2f5bd3afe104e5ede7527b2df85ca48f5f145511bdf05c73926ff9d53aead8142f334c5396399598e7d71217678ab053a89782bdf1d4c417abef23cfddf874c1f71b08fcc6a635b3b3215994b6bb422be696cd0ee67d42b47417fda348ab7f7c0d96c1e31f9232f9b7b6be06ce8a6ac733ea42cabab7f8d72c0b1bb8f72aeb074dec504b7fff08af8991a1908384162da12fe2e2edc0be596772ebd7e54a857e227e6b20071b34ce6c5de412e7289d6ba76454ad8baa56e9dc0aca42235b00e5f82c335fa37dce0941551689d3a7dd1ab78f0ab0a81ebe77986c80abe6ee8ce4a0a07b70ab64648cc7c79f87a007bbd9303d98764ca3589563fd72c497c9cf64016c75e602dc2a6ae6195eee93fa00e7a96a1ca0a035036e1a862abf084010834e105e088b3da8dd3371a42d162341cac2d32fbc52bc79e9dd07319fc3d27cc36fd8c669a4f7008c47920e52eb083c1b65edcf398947d27027494bfb75610991d7698a624508f3a528632f2c820af6036e918beff68734c1d05c7cc00364725c91cd9569d0b", "6a63536aacac", 1, -2126396243, "7f6bf6a09ec6e56563d0b47e82e0fe82eb4a038c737f5a1b39c90fab74a0290a"], - ["f940d172020e6ce30407d65e13b5be3c043cb0e23941bd5eae046476682ff35e122c83eb6c01000000075251ac6552ac00ffffffffbc79826d613f48d49e3e557ab308bdaff79c9b2bcc9f5251f9227e912a69cd74030000000853656552656aab6affffffff04e18c230400000000040053006adf8dd50200000000066a6a51ab6aabd06dd4020000000008630063acab635151356ee101000000000098bb7d5e03f7c69301000000000000000000000000ab01731d5fe01b221c4175f7eabf53fdfb9957c5e3961de7211c1c99e2c7d9e58b8114f7e20a651997bae3fb317b7e452186d3333236df2a222d05cf3177df6d61f83544a023f04e9f0ff8f337712fc4b9f7bec6d09fc432fac9b2dea13c1dcf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f37283587292e6b50a3038d1aace7102ff00446789816265528d0f1fb6de5ba452865c724d1e5535b4560c62eb647002a5cd17927e8471c926d7d8c58f10b62ff263ee458fa8eb2122b247df0878700fe2aee424ed194dbc55f82f29896986049528bcda3f35f081bafc280906d6a57fe9cfec13da52f10e72a3562c581ee77a0225536a25191c1ced1073402cd9bf2ed01bf374a0c76e7cadf5510d409e978db50227f992d756734419688e76b5d2addd7081c2edbf1672277648b954eb1678302d0b0c9909dadab876f72bc47374495a4f112b0d29f5a96b446b8a23ef52b062af212930f9a4d8c073dadc6524386e8530ba140cd47bd868ab8eb26898c5666f1102032d078ee96da32cada0efdc4dce5098a63fc3aa69c104a07692fe4d57892d4aee032d1878d93c450e3c73fae0ee71f777b4bafd40f11c1e67f49a6f4f4d8d57d38f031f8e44699a26a9fa03ff09d96f8ef4c8285623b1dc50ae84443c93f5e3495cae032f6a8b297796ebd9f6490df07c984452ddd767b2cee94f004c60cc0ac6e85ca402183b2c2950245367af8548b416f28ab77ee92b183df1128977857193dc6c07b65c0651a3eb2447a610bdae079ddede9f7f0e3b913703c3f819acb11513f16804fe3923c0dac9c5c3825c4a9406f867dfe1d089197ccba0d76beaaba0084d277b8baecf63b892269b7033b60f718abd992172fcf87f209596c0feadc5319d3f2bd7c3f6066a5c9c84b180f16e88069c6b317c680fc085c4d8d8643a44663e8bc2aafdfb0bd84ac5980de5508bd2adcc26615fa3083d96257f35db583b3b729b5e0fe22fdbcb06575db814fd3a06faf33ad1f75d46a5ed99181f2c0b70a8540df1dec0a50c24cc3968e342b8fe6221a4f29d5bf6d19b4d61e5af57e6ad5a87c4021e73a5672910f368964c9ffd25d46d3719d818bf6dd21cf0f5c921faef2e94594e0c5bdefc6369d7d24fc974ea8457e9733278c09f932b3896d0244e96ed1dae50deb803bf82b37f1defd71c67df95be1add3eea9d8d595f531c8bf5adabfd437e4663cbbc89187c99b9ed8d63ce2eacedbcf77686e31c2ddf9dab65cc879620d1a46aa5365377fbd63bc5e343e2bce140b3f6927151b450dac48b6c694e2a11619e01978bcf1b13fecde40834623792b40954e2fd784317be9d6b53cdd902e16d5a3f843043463c5f5bae553095bb94b194c9f999ae718a69ca634c13a7721f3ad2d9aed1026867defb26ffce0e652f379c2669e56f5cc0618a88e3decf3aa81b076872c0143ed790ac33f5613d19629190e4091463a158af6f403d22c8f10c61660314df26ed320283f218171adf0eaeeaa01be6980fff565989b84cf36da2f5d08e31141669f475baff566ccc1a97895c1e93abc0f6488bf907eaab654710e5d479304a77f42f6ac802c9f7c16b9f14b2712e2d636557a5540cbabace0257e560956064f4e7e1b2f83a46bab5aca5f9efe63e4d9dc94977db7a6ea2adabc6d59a56f53a8211bd77bfb0732062cc466e39c30b3ede76c6c828cd727f0b6546929ac418345db068f7e47b33fb6b3168672f2324ea206c84f149656bc9a60e0e887c8f178645634b808d0ac8de8edbf90082ac2f5c147706c9deb525366a5e5c92f1240ce65db0e98583a4ada6905accdae579e5e8fee5770eeea3f7f50a15bbb739a4c555d0b0625f4bd4c3e673313bf2ed91f2bb1f3f3700add15cf44588314ea3945476aaf4acfb88292fcfce1616bd658f2540b7d6f77daa74da205d8cbf67dc19dd93c8ebe06ff28b27d1b5550d6cc399fc94dae8e7fdfb421f9ec51fa9b2a642fe7954ee6bd4e15a98e05c52d8ecdabc103bf5d9b2153c4203c49d7bba65b43563803d222639af9fa84e3e74a32074e6980b862c77027cdd1a1fa5817015cb7bb43b237aeb2789cbf0a5f1fe619698a626c625cc91bad52dc651d76e3e1615c32498dd48a71ba92cf3872018effdfa6d1cb2aec293a2e564ceb9d0e6fda32d2f32b4a57ac5c751bbe999edb16949f66f217402dc3b3a086a811805d454d64a77138137b65145fb747d6add79ddeafbeba5b222421ea71b48bb313b0e85848c59ded0a69e5f3941d7884517375cf831ac6496281a008cefa8cb3cf9591c822deee6c5e5adf2916c1998bdd522c51236ab02b3cd56c68501122d0f85aecf8edc72bc91fc44927e365ebb001593baf3e12725a06664aa345e3ddf992e3f46881904a59a8f54d45a826367e2ff8c033bbac052206d9c54c7162b919af3c09da0ae0bae2414870a5a1f3b956d5f62d0a2d9000000000000000056b95805000000009bbc0294528f2050c510db4c90af0fd8035fcb4ba7932350df20b8d27a2bad48b17fc2eea127b0508a88920e99551e3e34634f1d460d08b33836a626922377bfedcaf22ddbf66393b14b1683f06c61166e8b972d725ac0d4f90f40a00fe7f52600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fd24cb07a154d9255404d74d87c083cf90707d20cabbeb54d144f9722643acacf9c593e6f8347da755a766ea4d5c1aef772fbc0da9441ec3fbdf2f384c5721b122c81530759571ccc4faea8605950c8a7f277af2e22a902005cf5389d0ac1cc07563fd46cba0f3afac7e96d2ada05e381d12f34fb8da0c8d6fc15b50e3b0d05503046795ace7092af55b415b74bbad8a19bfa8c657940d7beb705e88350ec1b82d020ac30abfe7de4bfd395b4c6c044d9c0fa24d9aaa6fb5f53a3154f8316c0cefd20b2af69df37fd4c161ea608e3e3e507439faed3185ae4a4182a02f18e81a8ea49224487ce053e20489deb2919aa2deb9d47beef1adb189672c5b35492608ad073703021f20898fb876643d4a4d5878df085270ada308c6f0bd4f4e2e5072034dc6190301e1f26a1412dc6d01843787d032c1a44a7b2ef16d40f63ca34dc654273bd7f003252cdb5489cf65f385c7ad676d39121ef836c050c5b93f73e8acedad2d49fba00306724be3af062c4f6328731bfa511763058de4e557bcd859937823d52cac59a00212292dcdc0ae3785286a109a4c1fdf297e7f244d94ac0e01cdc6a074ccf4e81bdfd3387fcfb7fec1b34df291bbf4d3a4c32d278f335497cf1699e00a393c0371d5c00df1ac9388eacd76918099a011f5736a79ad0604abeed8b5f030d07afc3400ea84d46fd1a325ba504495d0304f9bb2ff08e371b046783589c0ed516e9a1d832a89df3cfebd7b0bc89732f5d6d560f57335563aead411720f418b3685416611e6f55bf409732698f899b70a1aea18858bc69cfd39301cd472fecc26fbfb95a7fd1ae7abdcc1bac6b949f0044eb4a1152811878f42f4354d7909b18dac3d20154e80aa213677c0b9ee014e58472ac7934ca56e41f4a5c9c7bc7eef20c4cd6e8564368ba9cf35cd4d624790b45f2c5752d8419d8853d52cc92427c01bbc32201125b09648a704c3c70fe1c9ebc7bff171915292b2f2da94d3229dea579affb4158d2a764e5f6ad17c57f17ce287484a7d231dcdb4bf54e678d944fb969381e519773324f0b06b710d30c34be8c2580db85e2c094dc398618c38514110318dc55e3ce49f04d743f034c9699ba4fcf474fef9f273af563a569dee158f65216ec88e3f22fe17e37f5890cbee307d8bfe358b470e8cae95569daf502ce41e15a0ea941506740ae274e2d440ad7fdd5c04a177e3e59dd9740b9b16b20f33e59a2e4cd5449f4bdadcc52c05b7076425d37a56d4d5fe2bfc86468b33b05f33b8de1065e8b763acdde296d9860ea8be57bef211f972917c0cd612e444481a3b09c21903430f1c761d2b6d6894486f87df4498400d5a824874b4556f8dc569d381b34500392f144c5e3801cae195b3f8a0f184943725d6abb77fdf598af9bfee305940696d1f2bdeec12225e3f148a3844154a59986d39be1328368bebbf434d8d63d5335c62f2f42d25afa756ed24f7c75b9bf32ec5a6ed441d9bd302ced84aa05712d80ae6c0d84836283f8b6a33e3b35cf934e936a4885e28160f0169b20a4e3bb451b22d1b74b9ccaa2aadfdc8fa77768f01a59ecaaaaef9a768825ec7f85003c81a0002ac51c13644579a9253150bef29f4355db646b065b3e36f276d59ea74ece4a2df0da54fa225cbf13b745cbe51cd8d2d135c66a06254d9b01cc6e8dacfcce30ff6e31b0eb149e6f9564d5c9ef4f755e5cc9d8ae44ab7bbbf0da7c0bc890c79a1be3b1495cd46b09540bb0a2f58f761570f016b6d3969b91f1140b9377b47d1ac7399add9610ae76e9ce6185ada417f6d22d66788c387cb419d7b485dd54bef00901322c4bb42f70b6d59ed5098ae7ecbe1a37ede2ac393b8a2f98671da7af667fa724ef2283d3ee3c55df2a2724f94b32bf9c8ef90e5d509d03b641777b8d7ebad9ce7309cd33b04f9b5f49be5a4ad65154ec045a00e7caf70d4b459c15684fdf235972ff34f6061b8f893c388d1da3996cb40b8a69c4899ef80f2dc3dc8b71518b6d71ca68805fb467c11a0a3a57c20ce35bf0a885431d40ac29800ce881a544c0f9512bc9f1ac9a0cce0fc3a78aaf364f87eee4f137316b7370ce585b95d60b9fb6a91ffa2c7eecd4fa563073aea51b212a2d540f9dedeb082fd6e4e4a793e62faf4e14dd0829e46df88da05e58615d687b21f6a25b3654c6a71535fa3bd6f74b26f504f461b1485e7d0d140be8afc970157fd69b34a253aa1197f2ab8e70c0307c33ed369b519c36de4863be54b690c8539f7768b17052b55afc22c3a83e3cca210ef216ebb86f1ba057864747cf0ac0000000000000000714e640200000000a6c3f86361684c3fd9825f7d19b9734713140f25a15453121315837776c70696415331698658e322cfa843170d9e7f831e8d4d149f9c8128d7a34fedfbe6905400c8b0b81591245aaf08b613f1b388ac383b77e11ad749de1cbdc184645dcfc5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009b23794da8db34c9dfe349c18d95ecc7cb66b9854302fd3ffde82be948a7012d16ac720ba10247ed95d2c3de3b1f45c096231696ce46616daf4f019905b25eb9f9e576ce77e01fe6e14bfc0e03d178483715153a0b4a604e2720390c298a628311b764f0edc20418b8c7dc094bc6b60896bdab280739544a7451004de4ea3bbd0213218f9758ea127469cf5a13280566076e0aefedf64dea2041bcefe09dc6430d0215f3ba49720bed55a826860581d9c50e3c4097d9f5491ba8a14eb31c11a5c0420b08b8132226292d7b56316a5ac14c670b9c9fe4d71ca9588e393d79739bf3aee6179d8dd08465e4f3bfbe45a4cf20e82e3b289e8705e96c3468b45766d55e0096021c036df5e48217b03389b94e5e5047026a7f3af6fca415893987456c4e4fdb25021099276ce71fe17db677fa08074061e66d54689497091e60209b7f13b4a73a760320acad174e0235bb08edfa7c5be99d0fbbb2dba2ed3fadf7479e0b3d018543e00202d6aeab86af5cbbbad6c1ea8d2cf71a28b8af83de16673d01a2e34eed9f342403247a8e9ce8fa2cea5953880736cbb28fff62bfd1084df1f9a9ae6fbf54e75814353c3a45fded83a646a93223e796648ec547aae2d1fc548708c57613fe1ba4c186e298aad7943a48d0cf451b272218635978013f1be6a6a7731214c83c15d38dde2a6170d08315a853f0e029ff50a1526d556a141dae11c804364266111d1c0dbd32b2234c45e610ef2328bad202f8f1f470244b3e4f81a892253e6ec7e33652a419b276bd065e14589ef8903a6ea1a4902d5d84444131f098797c356c3affce420d3bba883a334348ffd38f91d198868319f3231dbb1b186594cb3e53f734c05f54aabcf6a5e1079a7da3afa85c467b1e4a9c17907107f92f757e904ac1115b6f3cb8ac695cfadfb6c721c04dd8ebae9560594fe891ba045f62f5de4e1294c3f7fea463a8db901e757ef6aff7ad9bcea177b5adec237a4b26135d125ebe91215b50c3363020c9ef120349dd1af164fb1523ec6908bcc446880102e7574fe605ca5310e17fe21ea365b6a82df2a8e7bcfe9eb2ad745a22fa39447ed3d5ed84d919d8c3b9874b0cc4ab230bb618725c8bad085235941ab95f9cce6da608326a1c840f4e290d65c64c342d5e63c14ff09752f5814c665ac594cce0c219c70fa943ef0e4d0f14b6e10be6a319b7b57d45a6b44c3cfb02c4281ab6e3089b91bfa1c60f283b33931e2bc2a10204f7e68edfddccc1d2f9c8a53563ea2b6f49594716abea23ccef2d3d363d03b7b4f2d3192485a732b74b1693e1b42a50b5ace9ed6244dcc5a29ad20a01d1c24c92d24ba42f6cf3e6cb18451e416af5b4fe6f54dbf5733d7d01d81c97a37da041437d238265340cc178bd37255ae7b7bc9e19b57b37044eec48a85edd1b38de4ace5722ed91940044c50446e7324fbcf8db1a9510d96ceaf56bbd91c301583de243d8ca27e4bc63256ad39eab717fecd5dba1974b9547dc22adce9308f32f1c1883736b608d6b6a8667916179ea3b90ff79fa4b0fd946c15f070af3613465f6e2bffb4a794716d832e38cb0e9a9569fe2b84c2b79125b3712b3c36ddaa3a18737d10d84a04365aae98f4a6090b7fffd689400653575c3f5b5c24521bb4a78eacc80beed4c51de2de73b17d0a4138ab5b8ddfdfedaccfbc3394766fb03b66e9e52e972af28b9ea8562a4188ac8b456fe03ed30fcb525ed5bf379d6fe4db0682e857f8dc27d70c7e050788a1cde02e6b33f6e549b39efbd72b84ead17cc2b184fb41f0b9a4524aa5523a3a81ad911cf4f92038114a3d062e9f87b6cf929a5012b8d22591fcf709bb5cbe79a44bb4b7a8d992e69db192914b75d8d65da62d463c9930535bd915aac7dea64e15cb5c4d5402268f926ae985bedb250e43849a5184009d8e3b61c41abcde3ef0cfb391ff59dc0485265aaf5236a75b06c0889e0737e6c29d3463e00bef157628a49cc04ae2d9f9765ed5d87fbdc9768ff984a3680e9eb3851bf5bd7dec0c15950a539438b0151382006c3532525c716f112859c5bacaaee02ae7b4d7a1ba4f6b199b9c084c426bcc1d94ba8d6d6d802fac0844f1f817530dc19b47fc1250f4a5a37c4777ac971804f24a4a293b318839a93dd8a071f93d8518e23008152a2ed722dcae901ebb82b2d0787b61ed696f64fdd893db844fbe78739e713e120aebc1bdc376916d005bd2ebb495dcfdcb91725cfc9713b54751e25ef9dae7828567899afb57dbe6bac3c325d91a973789300e0c2a7ae0a8e4e8da76210cfa5270c4bf73add72dbc19696faed6f81bc08d25948c372e672eff153f1b255978e6fe681fd5f3cd91c3cc49e8f817ad0ffbd92256ee7b827fc60bb31d246fb242fe8b85da3fbfebd4734aa86ecaed31b2b1a9d09c918f5dea6a86c5d845680ff93ac09", "6a65ac5152", 1, -1523284677, "a652bba3d14b4a700388c133727a872a2437481c4139a4d1794280ffd15b95af"], - ["94e756b601fd976058da034883dd970499e98483ca928387e379d81882933e27e7c6ac90090100000004ac51636affffffff021c73c7040000000007006565abab6500b24069020000000004ab00ac655b797bb9", "535252ac535263", 0, -717663808, "3a890b896816074a0bcf66112bddce4798c178f2fc893cf5d00453542908fe75"], - ["610e9f1302f8aac74170da6488397674fbcbc884ba16022194b51be977b2e42f32adde1ba40000000005ab655353630db007e0f4b0496a738deb2af3961ecf13b5171121ea1a7fb04ccb0557223678586d0d280000000009526aac5251ac52acac42533ddd02591b73010000000006acabac6a0051bc3e71040000000000bdc689180200000000000000007dd262050000000081b108b9ad8f35aa8ab2e8be05d20c680201ef8790e9f748afb1cb84b3aa3e4632e09cbbe65ab3d9f75e82d59bd9faf9b8c521265515c115e028634e72286adcb9527a7b21e0c78b3b200768e07bfc1005a4d140eb34f88c2fb8b1c0a793527600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fee1fddf1bf38445fd330d1356f88fd8840bbed58842f801160e9966fcf52d73538ac9a68009672a1de6153625f13db32e5b632eb93d90aca07bb77d446535195044558873aff21d7b176bd3d738dcce39f14f05c43a48d4977365905a3ea1a05ed35693d39f93edaf2204bfee017f1c6ee77a27cc50de9f668d092cd092c31003177b17ee383214acb0767c8b2ab77e5eb532cefc4f0fa1d0f794f071579998450319302605c8afffa27cfb16427b6a78845f666c8cae3e6fe7e4fc17c8275d71a60a1ebc8f7f7a40f0121366065c66de76c8a21555aa4f25c3f22df9b5096494b44b0ad3847545aa55875b0ce1f6f0571f43d1251924ac55d2f213e24a5f58fb23e2020f121c4c0c5b8435fb923ae46c3911e1e1dbfc60d2631190e767c45fbd9df33e03072548abf98acae12564f344a146167134788a14da5bad64e111fd4b8379a70f03268bf09d62318b5180a510614704593840f83bb7a1f7f72c08c0cae9e7ddb5580309005b85972c4439b2ba805df54c11ed503ae362242a6782eb7152e0e7645975022889dc0fdb484c8a769d2a42ad9c0c5d35453f8b9a0837bcdd8887253c6fe1433e619750dd553296efe8fd1bb4c1bf94599eadf524f6dcb237e1ae36a82d526f4f9e447cef7721d1a409c3eaf8c24f05701ce2912ee144bf98b92a215d451bbe1c7d9efa24993d9969848ca851cabd04400d27b19351655a134c7db4ff7cdadbcf5235663b0cae58fb6046a7f97b2f7b71839e9dc10b029e98a4a0e6c83afc43217964e09c2fd225d46fdf5d0b5fc628c542fedae0ab6978c059e644eefba12496614d24f45004cb89ee39f47fdca31f267f55e691d408d4b9dc425aab10e298d8617a64ef14936c9dbf019f03e68b36ca1271ee451f360d595543456d4489f26b4afe39d4e97e5e0f47468ea7d4a5aae8e757e19f95fda233ddbe1f2d245ccb1245a42ee8bf8756d06ccf29573ad703545970f7d5e457ddf8b42b24582028813e4a83a28309dba75dc14f1a24e2b1b05a058be0fd0ad2002a7dee7d93645065a95c153c984aa9ae1e303447d29a25a159f497c40784cb254b61be7b66754950e5b0aa30fbc6ea22bbb725be4bfb8c3d2cf20c010d4ef197b6c508e0da15087c9e1bd65d6d18432c81fda253b53ae425cad642fb3209e5ed57b4ba058340c56239608942b464c5f81bc9d2bc8a9ecc58ddafe198e3486214c8937fd58cceab8085c7957ba7258d7b196fef88f519f8ea78d933d04f798345d898a43520f60f9849cbe5ea234d3134cd760b2ebeacf36c9d8beb07730df1d6c28073b62e6f20d7fa8da48604384c6000c937324af3691bd632c701055ff727d49adf955623017f1efca0e8e34268062c32cf101d1c220b60ddd942561e2ba644fea9d13be350fd13ba779fcb31377c7783b2511e8c5983054d6610084bb616ad56d1a518685cc21cc27f133ef2b3013e496fdded2cbf2e125ac3d38368337f67ed7f955ff1ed7686f03bdbc33e7713f22c8919639d051ebb00900b42357b5ce830c26770a0939d197e8bb72fc1d552dba15eb75cfcd3595517b65eeeb08edba1dd49837485baab75008fdea4362d5c9b8bbee7f4edddf358349f8a9d20145bdad2c4c16e1de5da68fd9eeb8366ab6c98476b0f3c02258ede713ba8d2ac8a5cb0a14c080c7d2c3e2311569a29e4b9c452111897c9349dfa2e220fe3314500496f96992ce4e5ed0b7b23084015db74281608366d5b031f80403391f70518fd2a893164b6c89cb2686ff77b26d3578b1f50cb03a7f14014f4fb258416acba7b0f4616b1757b15be7711de9d76bda8a6823d6c6ac3d1858552482080d6b01d792fbb2d7e90f7d4c0d6b9966feda57c45e2e8588e57ed91188b85f982dd16399ef8a564c3ff8c5597c76820ab7de4931ad94f84ca38db7296c2df2d6c515d519d07dc1ad932a40f0a1d9e61ec4c0a53feada12cfbf6c1c38538ea7fabbfdd8d23a799086b474cba3145fb3fff56c0ead51cea3299b6a92c280e1348fed887c254a48f282026cd508da2ce0abb297ff4df443e8f7ee5a3ce6c5f6588b6cc9c6a4d5bc9b1a630526a9e97a87964828c288f8a9f50f3aa44dac43684f1b09370716e7f786b7265863702afe58f862042958590e304c6ac79e488581492a3ec9803bcfc498540114d5e3ce138e24fa0b67b17aad7be1d6f4760555f620680842cdaec49882fc5994c0a9f4e341c1a7cbc76d47c78013e81cefb3ce13260b09ef88285ac82bae0daafcfed50d1f08020edeadbc001771ba4cfde547c055c98b7d705000000000000000000000000e8b281a9860f7273cdd15f4675b20f13b7f9ca24a8b76e17e1c1e4b1155920240e83e49727f061e6b70a844d3c9c4f6df5aa7e8aba61e17603c89857fed92deb87452a2ad50337577f8663cf9a72ee9331923e7fb607e6dcfab8b90175719c9700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cbb440f81d4549e0309e46509ce4c3024c9c176663ba428483c13f284b116d6860cacac5032afda3e7d3c86bd15e653dcc5a038f78e65b0b55c7a5ad4bc57873203b3f1c4b4ee2c489666f67c8451c98ecf0dc042cda16bd9ed7d0031b035166cda77758665578410fa9d4786f3f774e0dcb8a7bc23182d190fe7c54a637eb3a031334fe8379a5dfcfe68ddd7dad9cb2e04f74387a45dd72f8946ceae0401b39e8030e907abbefc8a07b456342cf656d8fe949a74d148d081ead68370763cadf8e270a20761e02a061667e96b374904e023c5e70ae2d8219e176f5fb2b713f88e595c00cc3810a4c0d0cdf8b833f9f1a3ef6e027c629e8de3d3009eb38a26f1cc27724022cb1e36cb17190940c56f37f0e2a760b4c2b6e268ce11da77b8783436912b0f403179f4e5769e57a8333645f1d99c30ae8cfb563867fe762393da20f3433a56c2d030fb51df639562712157a165aeb7a3a77211ef263d70e7a116cfcb4dd9d2a87c40314bd6c07ba4590209398ea3f28e076005123d1277b86ba189bff76808bc3c540030af451ee78570489fdd72c39c4127252dcead075f284093776f5908ccdbab1d2d103fb217bf1f3511db971a6b153fe02275bb76ae0d1674f136c95badd05728651eb0b201236c8723d029356d3d56bf8d08543c47998726f1b716450813d18e0940455dfcacad2dcbf18302cb0e8efbaa7217dd0e923b411297541d8d4eea8a298e2e6021dcd46d2679b0fe7e38db81188b4242e1655c6db14335c95e18a90b05b5254aaebef462f58438811b6c11d291c038a853db7dc6ff6599d3770073c286bb9e3b7bf03d4412c2753072033723fb5dcbc2a2a3e20eebdf0c42b8b4bd7fad076f06c9b1ab1a3a909a787767ebe7747f15f55084ad87d7d7a12df98ec00fb450be3fd52959a92c915d4137475d28fb616724d48b688773712695164d1cae531fa831bcf7fcffa90f3732ef8b5164042dbde286ec9db0bc34537e91d5e1d11fcc3a5fee6b2b63c75c4a6459c367f06d4934bc9c850349ca0c68c2d967115c607e6de97cc8324dff65ad2151e0a9234c082c27f2debc4f0595f7ac38b4100e36ed6f7e5c1d4a337c0a2fc92976bf27d26dedc5175f07031331402bd25d8d24cc94415d3281b9e29648aeb2ee701e3574792f3ac51db3e550f3d1024d79d54569abaadcd33810cb56985d451261c1c061dd1352e5038b897e79c130a31f9bb494623becb727ac62e584b0991eba72a1595971fc2af17b6e882dfe833f15f8ffbe623dc99890137418614951529c6f93e02500f33fbde5706731dd540aaecb930cb8dd3b241656d31def4e57413f4c78f336d0b8e405b02f870681c37d35d5ef751891f814d00b11c871f925c1aa510e93c2256580462fad9e1cd42aa4db790d111368ba77627196310c7c5823b63136c141f64856c0fe178f6268d7c405f58784a151fce5083218a9ee53c7e4b5a60fc21c1f55ab5d27c7f1b5075f9bceab87185333b31008ecae651cd9e368781262fbabd0436fe1ac2d68daa603c125bd9cad5bb8f427cde404d62645915793d6138861148500770e618ab3212a6091436dcc2d4c549c7c06d279c310b1531328ed95b15bc3ca3e7f036203866fb51b7c0dee9a8980feaab5800b90a86dd11aef0d9ee3138315e6de38b2856f9ba76ff10288bf278ce72c8d0d6dc2868c3f3e53648303279ef4741a66bd881b2edddb4eae8eee5545fff832249b53008ac4126fa3873c615670080f76af6707c0819b3e832b4b957fb2e7499cd55ca291686068ae61c8b4808e4ab84552abe29d795870f8a61214934c71090e612a419b721c65256d2f1f54f7f91616342e6400ab70b1d39541b1707a07ef938cf3aa4cb04a564e910175982c9796b457bda71c2a012526626609e207cef453ccecc9e58e9a48face985aa2598b381e29bed84294da84d68eee0949546a7f9f088dde48439ddb1dd041c30156ac859afa6ad02c4fd42800ee3c82a058cdb6799a0d58a6c4caacb00f05f461827754144ce2f721497ee98815103d8f3d09807161b98281ebf371295863f51fb6424b4f0d6bf96d0d862d379606ea0266c47069d9f30ba5034236dc094d66d4faa7da5c17767967e4349dbd472ced5d7fa0d8dcc9bdcc07a23bbeab004ea8d7922f47474eb4333cd76c0a7dd38e739e88d584d8aa2590c44802628105a93decc243d44a3901cc3ed18bcc73101bd30732945be50e9f61cdea13f4f50953286f53e10f58359fe8a6b00a2982cb71b1676600f74f1c8e28acde2cd509661f7f2c66b10e39998f50ac9ba40b5cc35adc9de9ceee847303ccff3cba3fed252e4c78979ddf63d537a1a24a257cda66fe0d6b3ba75730236d59e69803d3305021cac9247d6c9e8086790e4f3021569a03ae7066704d1ba8b4607ead5b6c01e8500", "526aac516563", 0, 690020955, "1c972b28ed17bc256167bb0eb67ceba813075121fa935a981421bbae0495c4c2"], - ["8c245238023b85dd56547c8b04045672be3fe4867c299e2894597b962796089f0375a243f50300000005ac63ac5363ffffffffccd4f49704e65c38f39c6cdef108912032f201a5ee0f643af66a6ed53a3aa64e0100000006006a655253658eea69b8019694190100000000065152ac52636500000000020000000000000000b5b2de05000000004b70f3b2a3489a26b7c3e35c71b41227d16cba9a59b611fd3330bde0616e976d766ec0a35179b80c445677178104a8c80b92dbb72edba771490a2c18f21df0d6d3f572031ce191ba44e034a197e129cabacec5d0353323f4da89c82ef71c24240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036aefd592f85b834e8d380350ea8ffb44d6a2dacb72707b053fb53d583e1a7c9dcb24baaf64000135692fa454aa24a866654f47e5c657fd8475b1d688d1137e04ee0da95a5cffe3c60fa24407d6bd2ca6c6d86aadce126ce3dbacde9997e543feba7054606609714a9a263f6120243f45adba67b94a9277fb188273dc9bf4d3a022277d2e531f51596325c66813afa2fb533c35574b9f1143036edd32b3166ee00022555e6c179707665cda11ccb3591442e6c21a1d995c610b311a58a0a8f82c4ad0b0640fd3538fa9540516f88e8c1b0d72af5a6b1d4c57b100dd44c536df729416008e1efda1fa80d44e53a8b0aa4e7e6711071063e61da92626efc565b26fdac44031c4c2d4bf1617e214da09eabb869ae266c02965a160049dfd370495057aaac020309f6ed0a3127c1c3682dce976dea4ffede0865502fefe61db618b60647949200022f895785803f68f464a8a01cbc82804bb99fc0c162f4e79556de659c17205bad032792f62f5c8f55e2acb915a81c287114951b274b22a4b2225a5bc7d1442bc3c1022b96cf7623c2c914ef94cff2c02cd3a5b421ccd17fd2f7f35386a3ee869538413faf62d5e6fc51c0d867fba42f6dfdc2131e649f0c6b01cd363cdc35f56370f039f5f1832c1653002ab7ced29a4b699a5363af66f23a00f681597bef04141992f14e7f41e2b6fdebdda8dc8b9e8aa7fcbcb973128a25102c7bfd0123f5b8a5c8c239ad6f59c5f51febd81a838576f6f11aea9c0ab3d7b155d36f8ef0c403760809d650438f760a37e55b1cf22de8ef6ae43f2affbbccfd7fe6febfa08f5944f864570b703dd10950bf801376a0cbe1933d30ad03f9f3758e47e948b4269e5ac153f90e28d5f80fd36e05fd88a20609ef751cdad4fc44f401b9660fd7dee8c51e1c43420507dce9c70e9378afdd99afe0d7aadfc36d964751b4cb1708289bf7c1f336452c8f74d8a2d9e5e22db0229febc819357f38c94a3472a2048ccb805bf89c27f8cac214e2feae4a8e817ba188df08eeac94980faa3a27f57d15759379f07fd98ac0832cf44214e26c061843730531767417b8605848e228f9e00df17c25aee32acc88e5c9af5f0d43a8e91424290d50c50b521565f0f4b1c5195cc951b9f3a295251c66c181d78df2114efc7a94c5489da353992e44db5237c29dc8740a10487c44bfc69ca4bacc991890dc4928841b660a1060e1007e0083e7124da5b2972bdf1df082385b0796013ac3cc85ccc8b57a86dccd6d3ba900b8e9b8d18e597477a0282747579f0d71a5a6524dc142a11e4e81f18f38788956c52e2eb584e02d01b13a142de5c09b2074cae574f5692db25aa43a3cb4a8b66603ea943c0cd53093a329cd4bf39f117de3c46bb74f867c097e91cc0d1aec7df6b1bd56ffad831e9c25d2ded963d9e36e6399973f024a760b847b65a9dd8eb50bcdd739181f0351ebbbdc53698fa7bb26b4b117d7b6d34a5b0ddb14ce51cbcca0e923005bfbaf11d96a08be0bed36ca31fbc1d52f7fe2f3285344f587134caf8cf3b92cd3996393f17f0d112770a36727824ae5c571402dcc9b8c1fbc5dfb57ae639e766b5d1b2f8e219b390793cacd15eef105decc539c00289150b5276991b2349deee2efed440a82cf8e1de3c8f895a1043f899c20132cea9adb1bd92f3e43222c8acd881ab92ec3a0290659478dfeeb81acfb48c855fe9282029103a592d0944efcb93f01af71f4b925feefe9c289ef92e1fc8a939d83405dd06424f1c6e076980319a3f9021c8cb4aef01cc3cb155f523328f4d262f175256fc8ed0846ef87f8256b1f155eaf02bf257e967f3ea94f36ef3abd91b4f076323bb812de6295b0eb3c3b20c5b490e7ad12465fedcbcaa0308475719a86e4fbb4a53bf9073020d05e5c060ec862bc3cccd2405c6b4f4cc78a78b76fb1a7b281aaf164fd6d535ba5e7deefc121929e4525ae0b9f226d16d57741df0ec0ab3840473fc01acc252c8ad55c2f572c36c7832e06987ab27d70e68fcb174a807fae6c577ff6190f0f8096f46b5a6e47b160a7af14c1466556a6fb4a2950e52d695ce3ba67cf4857421d17eac44dbfabd259694fe2313164d2b801b9dd583219670284ba7162c8d11e16e9d2b391cf567a7f4a6eb8a581e7df63041eb0a0c8e48585d615f543e6f6623a8b675a99a6716c0124775b7377fdb497bbc5ccc82225ea390457d5f5d665264a2294747c4e9ce2972b68b6bbdd339792b47b2ba660d3488b3399dc566859e40754a964d8407f76ee63b7e98b1c37ac11f347cd4c4bc19b0ad1f874020000000000000000000000001e9a5f950d18ef7eada2e9a5113f26a2d0346a7592a902d9e41d0075b8e300b82a218c7ca863781d82fda0da040c036e53eb26835858e5e5d2563542ceb67ee806410ddf0a57c7e9d8bd5171a797111119c28a7bcfda276ec26992bbcd4c617700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b665aa6d5a0ea7ec8831fbaef6d68067caa7f37f721f701226c84b061b78859a020234cbf3226c17bf663861197c979fbd8db9a17059bd397d1f2ae01b02c772620e3ca8790c5172ca75f90b70f3df7b7c79929071fc16c878228da167f5b3b4dbe8bb3dc4fae068d45a954cd4206a8cd44818b3e41c4e83785632d42cff3655021f809eddcce8fb102a2432fcfe021d104bf94aa68143058fb0b6ed52dc1224b9020d248df5acb65923947b02fb94056c8b500d42339d802c85d233659a5b646c070b158931b4d000e5ae2a83e34d47485572fc558a9fa0e80cd0d34441d867fdfc9b29580725b84583e469ba08409e6d6aa57eb42c7b1826fe3044657527cf03bb6c021f9bfba19e7808021fa0fc831a04ac0d71b9a81b916bcf784a437b3b99aaa1130227f3999117a4b5ff21eaa946c1773996c15907f9a76784f4cbaaeaf21b40cf08022148249301aa7792a3deb4e1af2d7d06c51a89fcad3c307f46710b1587e35509022df8d139f9b016c72c3e0c1d274d458671432c74e3b9f72c4c0027df722aa8e1020a9133435be80ee6f26dbbd2759838316f1fd8591368372cb079d6da6dde3dbfa0bcf4753d64a2035c3370ff87cf6eca46838cfc93d916c5a5bedec9545602e7bdc96700e467abbddc34b29418a75f31aec09eab56ed1ce3f635002c3a0aff418d7749f9d2aeb90836e5d7616dc38aa0ffe615a618d02fa4fb3cc0c0fc827fc2104026bcf25b0eddf8c204285bfd524076bc9549e96efa3e010eee57a211455a99d1798aac35e52acab0c11d9929afd052ca30f612eac9a73f3349d0326971e45830dfcfdb5145c78cb4998589456121779524ac609643f3039e182aee32f074ea24e98d26c49d1740e875f10bf291965cd51102600e3b4893a6aaddb802956b862f40754121796e4bba8d35b48c38935dabb975082fd11d6732dfdab2ac0b43901bc7a3f389f6d2cb0f0cb8fedeb1be55d82906e863025b3119a2c0eca44d54a2638ffef8a4a5358f6bc27ccca946f77c49807e4245dfc442b8cb336881b4f11980578396d0ea6b5b8b08b3e4b88ea57a26be679d83617db5c3de4acbd034dc32ed5746ff77cf6b1c8bb1b6721b47f6b32d41157835f7b033a7bf6ba17d3286b2e444c8b4d938aa3710c45fc5c32642fd0c5ccd73edaf8cdadfcdebdb52912a9c5d6d7f44a720fe9179b4908f6f44f319f1a9695816cfc6bffd838fc2f67aa52e84eb6f86fd21956c1bc943219b18aee8eb21999554573fc97cea18cf507b6a8aab8d193d3540c486babd264d144c3924e2e6523756466a418c19de381e368f5429ed35f6498559cfd3ac730304fc63935f0c507540bb72bd9628fe10afb258230f329ee8880db1e3ccbc45458e846cae164f80ab536d60ee19343c7c79a0bcf2bf47d57a12918d3777c698b49ed438331db2eb0d1c7d0b5957cd802e7aab227d68a81bec0b6ec31dd31d217db9275257afa0c954f8d913e0c81a3c4b9aa83cec551be8fba4ce797324b3cd2437d54dd0820b62eac1eb03421ad667657d018ac29680970494551b154e054fe757dd256396df15de2c3ce46e123c48c8c42ed57fca565c8b862bc0239b27519a54c78dedb6b64bc262afe62b1adbbc87211922fb25948d26521307b5ae0b6fac1b227d63cebd5edb66cd9fb232f3ca4b57ca72925377fe3b8f8a869d8cff703c646504f37d03ab3793690308c1b2c8f59fe79b84b975b243d2cd62dcdae3a90c19ea33eda7f6e1f27701dc27d5367646e6e3dc6cd4154ccbd0af28b21279d667002b8f6b2d35d9c4f92e658d17617c3c595c9765d208f0a183cd238c3f54e8e5630eb337c9f8e563b489f353064cb6a2bb3aecb1988e86b63099fdbf2dbb84599f6efd8918928eacb8e5edc3e79beb82aee9176733e8e72298afb29ddedc2a518e409ef3d7f8ae04459052eae14c7f0b6e8dcb18d62aa1b63be51f8845a90fb49e4607006ddfc0ab551dfd08797f168cf3be664c183429400fcf44cbf32696c69654815a18dcfe8f950f179f408d1e3c6f89bedb6067dcf0513aa65bab314b790b6a223e2ef8f141ca9e3ab6842c42cc77e3008f1776a8bf4d88e92006ccdaead15f1a4be23f538dffed693199bbf32eec21a03d7ff67612589713808d245e42d010236efdeb03b8d04724d135a121964511c076a7db2bb69245023e05ddfd92d4bfa3fb3cb82cc49273e7a78c17e7d31221600e1b093aa9a8dcb12f8f796726d3da2c72d0bab8b3d07164ac70b44d99440c285c20159d902b6e2bceb676b1e0b26b3b84030fecbf1ba9c70ce04058a63bbed23dd4b8b8a29ed019b8f07982b257691bf7e118894a9e2555cd430c73d29077c49a4cd94d4f67e3c1a9f6c2a90e4879658a5aca1532ce9fd779d2e522e17db9318d404fa0f3bb21c45f3234bb86dddda4f505", "0000", 0, -926080502, "e8d36d92f19253e9351bb522511852c54c190fd186da53729378b2f678515e7c"], - ["858fc233033ca627c2c1d40767e385baddf648c30f49d536bf213606dd63240004991b50ee03000000025351ffffffff78fe020d977077e998fc9b98770b059c905e914d4e4d7610726a16b9d447ac8f0300000004ac52ab52ffffffff14e4d519c04e8e4b31d426884e39a9d172971c271eb6ffed86b19604758feb630200000004ab53ab63ffffffff016e9757020000000001acb3229a0303176a2500000000000000000000000000941e0fb5560a19d6ec8114be286264d9bc1d6ff29bfccaba358e3d1212faa4e3cea01013c0472e09d2addaf30e24d32554d425191d0cbcf9cdff319532bfb0435855af96e3b7de651d423bd1cf669894c8cdb6ac475ffc3893dd3d930d67719f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a562b4f8e5d15cc40946f958c765d0b7787e07a1b9f295d70d0da0b07d1d6e68e43aee7b5161cfcac87f10619602a6128189bbea897c9e36081302395679c601a556754feca5047e2f042b0b9dc867f4f4c10d1407f0c30e4ac6b4696c099c2427e08970f77f8580b2f2a0e3480711977bc94f6a0a08f9a123cbae819bb9870003107bba9dc852eb77c71a164a35c13ad7b99ec630e2d90712f89e727759fa5e35031c77cc37865f4c2e4e819170044ffcd69e320f51a00f042fd813fc0d52c54bda0a28616ac3f7b0375711035069cb289adddcc6396a6f9d424806ea62f32797530104e2e85ca57fe91d8e2f0cc2a606c7567010e8edebc68c7d5fc40a380512a19903280f66c915e38a130dd921f333a937ad47cdd45150e69f40813079e23c56c59003118423a55f4f01396dc29d5210d01a6861206e334cbe01506aa0e8de35f24be2030933903afaceeb82a9362dac1394f7a40b49a4bd55e8e45636089943bb933aff03148b958a1322729538b4778c65281c895d7af5cdf9a31f2a927fb76fc103a3af021ecb51e1b8d9cde1719fd6c1ffd62fb298c08586420b94b4689e6651e733332d406499067112411cb1945389522e12743a8c802abf0a1786fc3ef470d6de2800667b199f424ebecffdea25dd3af7dafea8223ea8d7250b39751cb1ac7eba026f0e0cf07e7ec9a5fde28206d8ef9f099bc16a8dc872a90d08460acb795402b93898cd87a033c4e5311b2de65e471b442a71f18fadda378b0408ec7011f227a639e9d0b4125f46bc125a5e8ba3de1e922642348bc8f9328125699623c9fb7b8102340d18f95970be9a092c24a71ce43250478166cc2ac14da96893d1d86db66af75cbc2803aab5a7797e033512709d1563a0b668ccfdbb0bf73c2db2ac3d6b8d6224aa2a8a70f4439bd31054ab0c32cdb17a499bbc259b8676904e17d4d8824be979594a9dd779ac4dac090d6b3ab79da67f54401efe3ad726e021bd32b063a36dba0e8e3e017d4a83b852d558e3c6f2825da3392afab26b60bcfaa044ecaad1d584993f31c192b7cb7679e77dadcfa1589118e17b2dd5f63e95f9eed91d9d9ef94dbbbafc8ec3701fbdf8cc5f1e5941a393199aac7ab10c981561131aaa228f4347bcebbcfb90f651c5af1cf6ee047c19e34381c149b2268148448f791ab650f097941ac02e723394761b9d03108953486740e5863353ac78a951f3704767bc385b4cfb82245ecef374807f18994a636bdcba4761c0bae54c22b943b24c06e5fc8e98d5b6f9ccce18132110e4934213f54a5cbe5e9c368dfdd825bfcab4785d9fec7350d0d092303e611325973aec8d2f0f27b82855854e8b51f410c016d18104d4d9539e9fb086a8138d15fa008adb1dea32f202058228884737c8025bb4e0db9377fb62bf61c8f138b086784d0dc77ae6a55c921d56cc3c2eb192b0fa23fb5cf7dafb944f8f5c203463c4020543f0e39d832ab986f1b7a8b9144e0d788e5eb3a309e5280fe3b113f10230e30e06624f9a52a0725ff94c0946cc870215b12d577b666bacdcc9be4ca227c116ee140283fc1a85b43f40685295e5f8343ef12b0cbfd321d831640ad0ad3b6cf34fd47cdf8ff1851525c44c140b37185268961c04f4fed619963bf958059ffb28aa633cd08ba0fa5f4f97f90e15bf8d73b22192a7ed78e58d5809208c60b036b59226339505f942fb7b2f18e0d319bb2ba7eaa4191948a3de01d55dde215a9354122d26df1371edbc5a8c5d3fc14f3fc51a89c855826e1651e61708a263f6474819e769c9f7ca29c94aedfd501e4c77f80808e05ff934dfc04cecb3ab769db271df429fed088061a8355c376c492571886820af42abc3d5743be2d4168bf5bf2a1ab62228402761f4a5ce0d41c5e171579197aefd92cfeebf81ef288f2f2e789d2c4b106c6ce584fa3474f12b0256203841729c82d6fac5e61921f7a1b2270e4ed5674b4ce7de0d428772f99c688551af2c7bad00d0e348ed2cb0de9929957b250b11c2e78a678cbefac57b17966f48043aef3f5bd3df29e34b24306fc85d45904024d1644e5b8556560324161e123bd3c9ddda7375e43cec6e435ec1b9aedfa52b0d7e3ce0f2f41c49854662f42e924e168d89a74fef004b67f2c6de92ef928fb7256aa5f03894837dc15d4d1843021de68882041b05a6879a09489250b118b05e0d8e3bb42c92c78c9ef40b16085f114efea59d470fbe805aede9a2a08ac876f1c5cf257b914c0dd1c6df4c291b187acb5c8da34d6642887e9553b5a11efc31769fb1d700ec08def500000000000000000000000000f611f27cc1f995e631538f345d547847884c9aac383e26c8f258e6ce9c64405a376c8bef9df1960addc28b62dad3c4b3ea4c2f01896412893b8671b85d86c41aaa45e8731686488029ae040ca41dc7155e0935b6a04128a8b70f62875980815500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f21ce9f73a7bfe2719cba1bdde65c74c864ea758a201bdb68748fca3b8d290943e6e7a39c8a06e9b778937534a19d63fa1d9c705b38e4cba057d018580d753b0b909658db44bbe0839d5a1bd6e8aed920fe65eedd4eda212eeeda1c0a95cdbacee7063797c5683d0432941ad49a5681ab3b27936c135ffe47b6315b7b8ce7d7603146a4a6ad3c22507af59282a172e0eddc5c5f210e304d6e12c515553e7ddf7e903030cfb94843b1495492ea8a6a4779c5c2179b92601e90faf24d644f9ba16078e0a15df6c5d2db6a538759c47852e41285a6f81404568e51941438c4acad45e0d161a6783da1dacb6df99c60c407a9ff0481f4266ee6efa9cbbf0422fd6f1f53926032261f17ab892f149e787af9528bb548a96f02a9ca59ccc69d025d92f7feca0ef0225aaae370e6cff2f0b5f40d5dd569a553e0db719cf20bbcee19d31a5e864236a0211bd2f6b9bab5cb423766b5218017966b7411c2645d0d70ea6c4bafcf1338a80021bfae25d4dcaec161d8921ecb33e1dcc249ec9eed2fb7c4d93a4ada2fd697acc020dcdb0fb1d84cf299fed68499924f593d26d1e78e395c0ad1840d7949b84ffbdc15fa0430a81141df3e7402d9f739343f4d8d4a70c277a73acd954e707dc2221b522c2caafdbb25c188be063d9ed600aab5f35bcc29983bb8b76b736f04705cdce3aa51bf28f89134dacad03b565ac903fc4aed77c8f7f0f08d2cd221039a606a5f823ab498293b33c5fd28da7b98195c29d34da7cafc3eb3a49d6e04586bf3e921b7747d57b49dc0c9e39e180f879504b4bffaaabbbca8930dd36d56674551d9f53cfbbdc95c18eb5013b936135353547f21c7691fdc2ad89edd8d8d62424802f4b539d099e77e822c1d2bed7a45e6ec4c3c5bc644111f555039348cce363ca83fd0552f00a0d574870c50756e57e69bc6facd8fca6e74c3d50cb539a8b0577e480df2284a0264529830936f9d6fce34ac0043b2961d366ff0d5b72ad9dd60625ffd619e1b5cc255165e6f3593b555770b2a37702a3ba1d810b75288de65d069dff4e0581408edf2666a9ef7199e4efc77c17b2c5616de0e4dddb3fc36c06bc7407c858ba4812e1ef83ba1a22d95f4bc626c435783ab2f90f2377f94d3f7f2aab6e46af21829e5202dad5d4f6e3b0332ecce7cc43902522a0e799af48aab08693c50938501bcd427c13830b102e1c572f16494774368d22ad83591eef8fd568203ba5197c3bf5dc8c3869da8006d2e77cad6d782e55320ff842160cfa62e993955fb6f68c4eaca3575a5105a89772b641244abb958e5d1536733f2e5709820794ecc4578db9a390d98f60bdc1a4477392cabf65a9f54610f54c0810656104f963612771096886f0f651006e539b9eea9c86f5a7157cee195058ba3ac0b6e51975448701af0e0aef0ec08ee74a4d292735c4983e0023f282faac0b77541d23918abf1c628214bdc33fe01d5c975f21fe42c62aeed80af365d508c79417ec103b3c5abe24a5ac1d5c5186c631af3e237f96e2bfe1e92060d92ebb4b6d54df964e786b272f2d6b54b1a2fb306bf768be11c4158c8b0152ce37a8d45db5c75afc569f95844dc895dfe74f54b9b0bb813634b779dc972d83c46d6bee822284c017a8cf8180ff39ac4dfeea24c3242adca0a4ce8a0765d879f6f41e217e8ce3eef386a89c0b82023ca3f1e936efd737a0ccb1f44f69f0e8bd43c7e26f41b10f9d90a1fe6d57da8214dfe598812900f69a506bd90509fb935e8369e2bfbe2f06753ca01e92b45001101ba151de4683b40bc4f73e1c2adbdee8818604a19222f5f5e55589e8b5088d4fdb26d636792d915f5f927ccb2a6c3ef4d7e9cde4c9f4af9c69b547d86857c8590411783be87674759e5642805ae9b34e3e1a61b397f71330cba0be8e267f76f170476f99aaa6e493ccb6bdeff4f67047ae1199099b5f53e0d21b5553800c0e67f2b92713fc94a6033a37bfe400264176ab072426877b1d447dfcd50484321179e93722be552a6b89562a5cafc81b6906d64187f8718bfedf32c064263f8aafb13ed0d71bb3030aa92a124230ce0c2936114d75811197318f3f8d31ad7bc7578f91afc5a5d2443bf6ed6c25e4f5ed0e8d8ec0f5f27d1b381c25d50d548b61d967074109aee13a216da149753be684318580644add363386a158f93e3231db540a6cf18af66a32baf17dc0a3acbf38725f2778728fad9d3c51eb8f8d30075f1fc2f4928207babd9326214474ad433c17819c48531d34f818fbe8ac0b4fecd467d6a1c8a42550954754427bcf46e87fa8010000000000000000000000009e85966989d8af5abd41862b4f560e42d57ccff7550f5ec3c43bad0cf9cc5c04f40734cf9949348016c97fd129cee02614bb23eead99ebaefe96bc781bbab5be9c4651c387a5322006bb24dbaed0552ed0a74a9cc6979a1e9655c5b672c97c41000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c42388b54195117ba1fe35b004594ac0b54478e56b125d00eb48fbe3f1d045d381f4b2a7ff1f8b9623bdb7cb8cadd6c193182811d717b520ddc4cc5e4d403a6bbf3d8306d131e279ac6378ce115397a742aaf19ff8b68edc8f384902638e00443d4023df9e00473bbd4347856e46cba09595eb0cdc5176dbfc81c1396d298dd02154daaf02db6951a58545845d91240e1c0f309d53db32ab614fa9e34ec9c83e2021bae843bb89a1a36d195a027308c68dedb3bea00a0c9430c5f3e03fbc6ed34fd0a04314ed0a7da2917e12a35c3ef047c3ee8da013f44e5158d44d2c92e80f8d38716330167ffaf7de2330a5f057aa98044c18fb717ebc6c526ae0cab8f95e768c703214cdd90b7dbdf8351c5a28ac04eceeee27d3d2458aff34edb8dbe47a23685950323d6ca23eaacea4799ce8900ac0fb98e97ba3d45a48d2b3d6368f78814574c9a03052d1835446ba7259e8c11633322b5eecfe78f3f375737dc1b50e2a0c5f90d94031accbcaa430200e94a0cf88b5d15a193393946bb050b0629985163ce4ae3b78d032bb1953bfdbe280bbf4774649e7a4d556ae328a38070dd960de0b0151e6540bc2b0f29d0715f724828083b3fd6f35d0596ef83df24a7ad63c2f6ba42223523e4ede248d34144e4636f9ed7b31d753c9daa351a38b32a3ff63cd27f04dfe9955de67901b339b5d3a4a3dee363b4b79102e4455ee53df8da4ba623ce64f3db8a57c74f1f1370a6e1d2d3724e386aee947cd4588ed9a75db25e0f14943a77604e531fd3826ca4d4f85e71ea6b02f357d19291ddf72584f0598530d2e9a95fda4cf9361461072a26dd4257bfde27276b59e6cf4059377f386357b8f61a90d0c240307bfb40b3cd96c2e0cfa2a5285f22b5c6c3b814c83bae1a4faf522902b32bea7d8d77b2decec50fc4d468019c1fc681c885aaf47d13c86c0fc7ddbcb34b6b58206e172691b70b67e64b7d2906eb8f80d47888dfa69a1678d56098eae1a7d429d73fbc865753801ff3cea7ab399df84ecd13d833215f4608cccd4160b1b4e8328b429419c6b69346c52715066fe9914647fd04b72d89f9ca00f22fa365e9ab01499eddf50fe807a61a71ee3744582f6628ea3b537fa640a1d79b8b076dd9cfe13c55e115c34e6f261579c19d1c639670d1e84fe64026b01c183fa6c8264a76e40d722ec0cc7d2c1f847963404a4debc6eabdc23d0c03c5eb3e896e72156056e0401d9f99c1a977a52b39afd0fb00eca6f6651099afd71656602bae24a9d74e8e25d59cedd3d1d87d094836bdb98e8a26cc6ba9f0a8f8054863d92cbdb7cc2c4ca5db089ab0a511d6e3bf10b7c30a7fe021d6c04d1193b85fe1ed7dae25eb7d89dbafb2e25c29da42259f431eb667b642306d806b72712084ffcb87d5f0c71dac0b13a958dd371f401ee8d9f8021bfe6e321ac4b5d74f64470eee82264b836cf5672dfcd4f861d19c3a64b5128cadc480e95690d6f5aaa09fdaa372a423250adde7ba48e36b5b8ec6650512b3282fe5284942e597ce755e44babe743bdb8063c1b4028cc600df559e1e7c48d4a4aaed58522e1d17921ff59186657beaed7583751822e70ea66f89f5b83cb2119f81c3bbf0a07101959841d1114c228adbc82700a52c08ae16a8c6a847b87b2dfe8519697b92731ef2f3dbec12a15bda47d4008930b38e8cca015c84890c9220caf581d682836e54ec4333b56fa26c3004759e8eb1ec1fb677f7966eaf7cea57d8eefa77e2f71b3a00c282ee747d14d69e5994ec5772c40efa46727e01369b664a79104c4071c06796e00b8def3f54b605fba239631806d5e71b2027d74c0dff81b98bfb67c798c098685cf2de82cc2a66ca392373b31c466472ae98a8f3b946706ab5a1a93f11162a587a02643a109dddcb4ddef19f65f9783b8fc9237ae8e6dc4bda72a7c03f5a31aff7175cc39cf640c7ef1e8b772bcaf23542ab345b4e144d7a9d77286053d2a4fa372ea12137c4e91611611f66da2d3d82cf74b0e817e78bc99c01f1e627b1e96aa7a329c6306d4fb1576733145abab2bafca9557fdc7d54063d8d57476d5cc71c4d621a79f76c924693ff39c801ed66a586bc257471a7ec6da6fa92bfde12e81633762e17f29d896781f2a1cc026343ec56c9e4ce4f1655ae9e834989f301dc55f010c79b72b80d6caabe576cf8b0f7b77160a8f43f4969b926107cfbf0d47904a72e2b03400b16937e32d0603d9263c3210ec4a1054b06c846903e46ed4a987a95356cfe3debe4cb05645dcb9d33f91030e566cc42b4abcbb86fb30c58b90fe3a7e2b3f82f8ac13964be9d9fe9764c42bafd0e6b2bb7dc7ca8df14ee90e37ad5990bf8a8f67840f228a8ab01f3c5acea796e84106432b31f8db84452edf2309971d858347f41987aa2a8ac80008110884bc9e515cb89956c9c4aeec701", "006a63ac", 2, -1633900595, "5716eb5829a40cb433fc003a1bbc356ecec53c64c7684148b5138030a2beaf5f"], - ["83f79225020fc35fb09fa9e5207ee49f96fd6fb3b8d282bf0ae47e36278e99949639497ac200000000096a536a6300ab6a00520d030e5e1aae0a9a2249ae04f34844fa5512060503d4ae4236598810a59418a32ee8a66b030000000253539abc1bfc0429a5a8050000000003abac65ce118204000000000552536563514e1ed40100000000065263515363abb0f279020000000007ababab5263006a00000000030000000000000000720f0d0300000000f77130710f3c9dbe060339377d73de73974d0812e49d54115bcf667020349cae54e4add91a6409d85d20ac45d96bfe0d6a41f3525794d0d24e918ea59e23307702b062a622c6f038fb2697ceaeb4890927149bacaf6d3e222510d68f6c5eaa94000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ac1847538483736211e62c6b52e24bdb8d417d4cb417d631588b97f03736e12152afe5978900f33556e72d46543a76bdccaed95d907fd028bf3793b875d2122c3c552d12fb95b097d3893465383bd682a4bb64891d9d0b8a1f11b63f4f62ecd7d8e13da2399d8872bb52297645200204f4d0a1a607fb544e0657da0f0b81e1c0212eb49fc4ce0672b07fd72503f665eee3c55effeff095473e59683a4b42adca203060931f337f6bd4b31e56f48f3757e25d0f71c55262ba0ecff8443ab879563570a0b8ebc0467456f7d642255c1e246a6178b2f34635232baafe56ebdde0e73c99b2450a51ec14e3c2afb29a9132efc39dc2ab409f7d965bf86e0a30b978e02b34d02184de582992b6dc644e93aa3fbbd76203c1dc03dc4c62dba03daf2d9adfd896f02002ec89c77ce02f8150a378a9cfa1c810440c634642d6807fcb23d5729633492022a5c5235b7f15e46775d8ec229f7b6c82a27cdc69543b903c757a46fdc2a3dbc021be619a59be2a177bf5c58ac8526e4b86eba0c643186fbddc56458ec83b936b0030fa816f9ff4d3dd471f256a7a730ca0745938c1afd5036f41ecb0dd10b121ddf078dccfc430b895254852a3396abe0229616cffd12bcfe8146af55fa60ac34443384486e7216b07adeaff17a8dc20b194033cb34511d22b238694ed086d0b6135dcb456d30ff02cece2a4e1341c7b72388d1c4e99726af2e5c4e9e0efa744e387b10df25b607bc8fabd4a72b12ca8edecada3d308319d0ee2ee58bf9eaf4554fc5346f640d3526b21088050c02a8ffc70a1a0d7afa2df92a33af1e4d9e2802c8b1a4439014dec9854a4d9f95fdd0f3aeb416cdb1f2a169a45203e3cdb631675bbc03fb1f4b9dad23114c31cdc136475902ac1113b775c0ffd0e96e210d9cc2ab813212fbefacc0eecde0cee3609cbc4a33268934ee7cf8436e3e1ff27d67cc8ced49a8b711953ac2e07bd6abb832d180616e87f40958aa9aa5f81162e8083c5c27abf4b3464fef75fcdaa447c1da8aa291a50e46405e8d2b5eeca8e8cdfafe21b1be50e47d2eb692bb981e0af2218e484e54f56ede23254053e819db5bed2e653b2896d9599e55d409bae1b539ddc3f84e0e1937161d74135f17b23a3d474f087b57137b7dcdcd5862a6effcf9bf813a805be52ba9e9e006807e51127876ced82c4d68ee4a7b8144fb1e5cf8889bc68ffcca5e208c91d4217c15735fbb67cbda1a7a330327d6b13b92f853de95d5445b799beca4a62e6c327df4cd1da052323456dbbc999918805c2dde203a9f29f8e561d5d9313195655b1cb7a24136a55c05164cfd6ac7bb45c1a04da857098c9a88429271d3c8c220e83da60683764aac91412ef9109111b24b7fafdd2ae74ee785f2cd4435e2ce8937d3d780ec19f3755d43e16a160fe88458edeaa401fb5cefe4d2857056e5e223a128909126b156f849772a2c8cbf2146e5deef9a142d49d175a9c98cc9d5c411474a0f8bb91970c57a1664a3e88e46f8e0ef5541c3994b021c2dcb02c1ef15bacde40209125287406578f4609083d34c4c4a98d9ebbbd97b8981846ebfa7dcff709e30725ee1f9c6fb3184930c0bf3125bf94a0ef4ae3c6869dc19a2be19878543bd56ff81348579862598a30b727b04375511642a65a486b08c54555043ffb3f3f65b0bebec601e4b6e7778f264bc062e7d2ae73284a243d85b0520b0a0765b917e771ba8dd1d6e91bb5326bb1ded294dfb7cc37e99b3414893ef0116ffc9d48ee70e1ffa306bc94621f3f909fa22e7d2b0247f5826ae9a37de001bb0dc8ea8f063b95994758a34a25125908a468801abe4221b0c7ce8d4627b375a068662ee4ee1343a73b540d378066dd2d10ca39a98c6bf7c1a534fc3b64a317fab3ae459057ce0cabd2d9258afb61e59e944c4c5468fa55768222b45604dfb42133d0c76e13865c8938a807c421cbbb3fccf9edf42995e16e000f403917b95d0f29d9c3e1cd8ed68644bd2f7655f68c01d5a178e021d5063c62decf51c99ea57aa443f14c2d53aaa73b88d0c8266d018b36f2f523c41db59fb1b342ca8b1fdc983e24701b2ebf41ffa76b96a3974dc1d0a0c70b1eba4c3a8ff01a78699ca165ab10503bc9f3c52d3cbe68d6c13b13cef27160104d910dfde91ba338a894a05842bc9027e4c842ec027581f680cdfc7e0511b0c151270539d58d1f592ea616db32a80c65d9baef8074bc8c2c6b815dfa589414c13d242842b9aad7ef0f8a4279342154be3eea29d0708cee66149b9e64c51f81d93393ae8e92ad420c531f4f407f7a00400000000000000000000000050fa76c248ad9b8fc6fe70e3635acc80ef665c6f38bf7aab39719b76aef79bcd098db99af66815ab876a3e611c2b4324273e21a6854d73cc13932232dc4ce3988252cf3a8712c36dd27774f596b89c470fec4ee85a0fba8182878ddb6f7d86ba0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007cd402f152cc62cdc8abcb4d220de4cbe4175736469182f4ef817162f8b0ecb40f7d88a022052c8d1377c49a0ca675607e62476eda4620af03b2076ed2f6c6b9e5a7edf2b577250538919440f6a5130060be7db00912682f87202ecb2f8055fce09f06331567f0f00c83fcfc5cb68378e5c8702fa7d8b07cb441442e309bd2d0316e7c8a2014eda1e4abb3c977ae953d3b8df62c6fb3ce2612a4ccb6aada8688e031699aea6a3a2e9a236c85ed1dfbcfda87726f68a60cac560ba476b2d2c36871e0a0132f9c768a71b3a5638fd89f5b067ef68f8aede9f6771adb89eeab325b1d4411e5608ae17c49193ebc4c3d71842d5be8bad806b93db422b73a4e97ba2ac78a9021c604220f0dd1ff65def79a71555875fde5bfa1075d004bdc072e187637d7fcd0218c6609d6e220d1f9585e2f484deb61b118cf675a6089d30dec75aee5cf2fb48021e4a2116012b2007c7b9a830cb5a3629c77a1d6ba275a410fd1826adf5046277022d3b89ebc6d0872576d56b4bceffed0df1ba9bef29bd7fda02b5ae2cf51ed76a030ecc6c08ce3222cfff83940e6bdc8af59ba1d867a760aa384a20a03b546a315a1f786b37408de0782a068096088d43d7573b9112c6788e7d51e49a3a0dac903c26148fecc5bf5cd9358bb6f01593aaf8326f7f2c965b85bc1b3d234209505292d7d526f8d7717ad28897491ab8a2e192fb0ecbc492a57f96e67a732ef3977f6eee3f3f218c33430c85ebed98e46f0761d89c66c0128b7b3af2ed70c19203b276f8c8db0a7cb30fc3757550966378262e0864e5998bfc360b373c8c9786fd54e3b9e18660a024b34495fb35d075aec850a8a8d5e58e7088beab2050a3d9cce0ae1ea65575be7fb15573916dcfbf1def0f020fcd07dcbd38062c35184e29be301ea9b591a6caaffc5cd7e10c4eaae8596667ddb45acfd85e82648c876baf40ecfc221c130cf61d5f69e61d5dcd99768cccc23fdae1bbd078cddcdb077954aded2dedb30d41bd3e9d00fb53cb8633d52d88671f5de62b061100861ce1115132b51fa0bedfb00ee2d48b59984161fdcd4adb913a797ed58c1802f04c4bf08553f8d8a2d1cd1bd0091614e7214996cd452a25134f1619aecf0a9b5e619af3de5c6f49428c2a727a6b2711ce24e6002912986145e4fdeba81eefeb879db1c822e6db12c05c27aa7e5ec281c2f9971eadf4ba74b8228074bc19af2e17a3e779e10997faca340d8269fffb8b77d6e455e72f1eef323ae6f38d3d775e5e6e1f951a5679cd4fd6b6ff5c261d174d643466e6064d6ced7c223cabbf4cdd1664eeeaf2e1666e09b5a959389ed14aae60afe2b4f8454d88930552b03ea0d313b19b3f125e635dd6eda0e8c31ab29d4d2711a336f4758bb8220cac5fdbce62aeb28fc6e08f4398a79a5140b04034a5b5e9ffc32dd88da9cffb42d72547939738e609e19e169b0265e581a575947c9947e1fcc86bc9dfac54c4d9ae08f4a9e120d69214471349063155b41cf33225b87a1b8ca749a9de9a8a312405f655bbee105b661f2f5ce494b4967e0901d41ac2d117c44f86c32f6f586676f9f912e32c63cf57d42dee7102a238251b145c1f0a51618e18e3d382c06e1b557d62caed665a3e0cae8b278aea47d6b43046933579a3a67390cec68c4bad4457e0ec424e61afa064b5b5dfc740a6e1f6dce431eeeef7dbd65ab51f809ff5b1033b5aba7bf6a9626aa493747f3e588e479115d48fdd99fa6d4d275b845b12f4b0cc5277324a2c340a948303d1fe782320deaf47cbee1f2bd215167ce621871104f366a7f4f11a26ac524e666fe1efd1d8a6532a3e39b2a29b077d3ec2a599b5be0c607e7230ae2eb6ca7a2cd2768b61300ff22624f6edf6f8bf84ebe78e3d1b11ad3dd833ecf080f4e42e417cefa3350dcbdce5e78301cd5b0c8aa9d1cce9817b5327ec68ae4faec08d6e88bedcb523bb774773bd980657190d4d65a46ccb4b0e6de8513e7698ccbf7c1a2923183b704720abebca8eba5aae39e3018e204aad58ae7cd643b0694cdf2fce89f8e8bc1db01ac9da31c5ddefdbb6717c2423106b84f4d40b718cfe269ce85b93f6447e98e189771cb88ac8152ab8bcb43caf74487a2ce3ec330dfdb539a48df4181a0c27f0dc2666614024fdc04c660ae3c03b384858c7b2fb955d632dba29fc1a1ee589c22f6e4a50357925923ac8889ae2381a49088ab0e40aec31b85c644494f306bd7afbef2f4d4e72eb4893fd829741ffeb53788f456b613e932e30fe0f78b494d8d427cfc564afa82c22b6cf1699e5f6a2000000000000000054d6f30000000000b51bbea6afd8649f1b6da89520b2695c94681e22b64ca0398b90cad9470dbea9e2eeec914f4cb3cb38888d980d5ea3fa24fafdc73fe9f35466587f24397d1cc137533d61de3f61977c579efcec43a059fb23265dd77c17f1ab0833c1e15571850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019002b16552e219df7a3f588a1e35211b5aafdc0a2732f2de978b59ffc1eb50bee0d5de5cb4725e4bf64fe9533164bc3acc345995302768cb3347469be3b582586c53cc5e586a91a7fab937c417c1375a17bf3af3d00da0eff4b3e6010ad8b2e26a3643cf81484bdf0cb5134fbf0b57aa53313aee64e97caa9eb6b1e1e40250f032985a0b7980ad15a4d69ff2f3abf12049227e741c38719cdefb64f2e2d84b9af02005a090b0aaa30cdbbd32b15d50b17178f9e694d28c3bedd0ba79f09906021bb0a140f5548c626dcc9ef9c389aade96407a0713747a6df5a1e1eb3583a07ca956b297402a5d19199d11334c9d55892729eeb9b6d1e2fc3e3ba124a620ae33cc3a0020267facbf5eeaef3ae869501bb6154ac65eb2e94be83171e4d4652188683bbca0202fb9b6f43ec05763b6ff81815a8a90d28c94d659f403aeae3ac5dfe798147730222cf8b4522ff3d354a6653c90b6349dd0b1ce4b6074851e177c694f92264714702174457eacec109f0e3a2f9d6ab2d03a2ce2248a50d0c72550ace3afd0c3f646e031217ab6576043fa0c3651ead0fc8585e7d6ab538385d3bea46bbe29797fa4edf199631b56e257268224ce82b37e9fa08d8900b834f2d0d850907ba26ce1daf31a2cc50ee5974ac572868293714aef0de27d07a12ef4a4ffa8129b6782b996d699d1231a5d11784e67f24e51d23cb893a2cb8745a6e2eb821777381162fe138f40f2e8458bb0b267da8300f630a1331c20dffc750ce7d24e5c0319cbb6b0761b8b10a333c2ed05bbfe80e424f9f9688ed19f2380c4b7654b91975d32198c088a13830ef4b4bcc2a24ca988a118c4943b0e739e0fd13e199a56392fe5dd3fd78e2c0c3fd855eccea482b89f0f8bceb22432f661e8b5d438bf03c97b07e9457b7e27fc3948a6c153dc7f8cf5c0d4739243e254959c16d7d6abe73202f8bb6020cf06e37ce17914e5a7f04aed8dd021bac4a93712ef30de273cd0cb263b95218eabe7366643c9bfed5e4b2f6f15d4611c1272c8119e5edd7121fe687d711366131c77448991c5c8d8751457b78bc8c454b1fd3dfe3f69a644ac4a57f697337c3ad969e996eee6081ef1424beb1dd50185100318524b1649d8b9dee1f8ae43874e828727145f5f9196c844c6957da845baa5418ccaab3f940b0117f3df0ad1809eef3f6a57a64bb1e3b3d9578759b1194588258df5d1d8b5143c2beb3b032873b357ae57043b466cb05b7c272478f9e49c1d21bdd047ecd88bc92ab8eab24f15f715b3837694f295400857f4340222d9fbb997dbdbb49b17d725100dde3bc2de80040f0fe49a98a02e10bb439b3e48d681d972318a06545fe31d9cd5a935d26e5328c9e1850e1cd11af398b02e38931ada28786367ce4e9da793d6c49f93882ed730c884e40a2ee7399f3eb47586f9fe3defc81491d1ae5c2b7e70355e455df7142ee7d35ac1fe8cf8da02ae278397a9f351caa11b923c9b9ac68bfaaa0f9caca7d0c18184a2a611bb4adb6a98cbf30e7bb9f3442fef3346a6a37c186c3519f43a63a810b87bb5713f60cca0eed4d47d6c8fc0c4a0181230b04a5be5e97db49d72a39d57bf6a369f8df829241d202c80d96d97949de4272ec4f94840f94e6b5f77ce5f9fed10b26f8988bc12ef89482867c190a932d593db1e5bc182b985190d1f7bb741ca8479e9a927566d5e95d941eab9d54cb55af3b175d2d3fd012b8127243582f22888d679e0d4619883fe8807425700a1624c97eb313ce27adec83f5c4dc07c87757f1771d78d90eda3a93ec8c4ee0bf293b81e2d990a42e2a1205356860c98e1ceff2fa49d7f16fa16bb76c859c05826a525e1acff240c5ab4a2582e11b0888b58a9c3b46753d31ddd7d6c3c422cbaf2ba9debc51bcd26988d51c1387e8289b10c88b734c0d4637c596bac28ab5a836d15a0c36c69cf18191d2310e0e9f21b75456e3c702efffea5cdb0a22a982ddfd88e35409ddcd9955d4f00e251784097271b403ee9064752ca359d0efe4e2cc11f958642f678e73ca7d07877fb6143b1563f218ab73f2b3be14a2acb13d249dbd31dd8a0a84a07149f50ccf3c0791975a52ad1c75d9c8ebeb6b7b60ad111c87927b45a5242ca8aa4e6d9c679944ea9a30552eab935f55dc2edf1457a34532f5c7791bcc566b1dac4aca258b0e98bf06003191815e08ae2eb9357d0adfd1f9e01cdbbcb48635d2afad4027cb3e94ea4f178f5acc6238aa871dd609dcc155f54ea8621e672be78d9735441b703e78b5d2825f737b1becdd54811c3bb0b5d350098a2328cb91d1f1beb1307bde18ff6f8dcbcc3fdc18519d51e8815797489d445638460af48a5f105725e90969e3dbf5ca41fc07ec47a398c1431bf52abe1df39761ad426ef738465c78d44e7939f3a2aa4a0b98099834f7ff49519d0e432d3750ea0c", "63", 1, -645320676, "a8c5132e7bb19250f74c4e1a1f40c9ababad51df8a9624d59268cac9e8af9bc7"], - ["c137b74f03c654f9773c1e2b2c3cc1dfcdee992b9ef59fd91e7f931c207d6b1b2cbfd3b7dc0200000007636a6a53515163ffffffffee6ddd63193b6ef3c2922b7302e4a0e9ad37a6362d225b44c421e8742712e91f02000000086351ab52ac6a65658f3ece963f6aee77ee413c848788ca41bf021379f2a328dbd9edc98166624fa06906eccc000000000865ac5352515351513400126204990f5a00000000000800ab635200525351bbe831040000000005ab51520053d6a79a050000000008ab6a6353656500ac3fad2d0300000000036a5163c2430f2c00", "6363516551", 0, 200675681, "ff929a188efa75c2dea4369b26f03325cc3424889b88806ca7ca96494c0286bb"], - ["375cf69c035d9eaaaf9319b3828790371b66b32c87dc5d552785763eb636f6ee7377bdc91503000000086a53ab6a6a6aab6affffffff012a7e43f342508cbb049d45a7464a4fc6f38c753de1977c59e04de1a34cadb80200000000ffffffff00368517c490a0b80c4bdc84caad3646823ba109b0af8a8164cbd70b60246836030000000800006a5153656aacbce599960408de59010000000006ab51ababac5263d8b2010000000007526a52ababab6a9897e204000000000500acab6a65383ce10000000000010000000000", "00ac0000", 2, -1351539974, "ebc543ce646e52c153f106160e0864344195b5a6e5e53826334cf71870e0d218"], - ["d0c482aa0408a9da36d79a7590b110464bc309b1ce492fa915a40422d62f72b136d2d0ca89000000000753ab00ac5252521e9dd1fcb2d94aa944b565ba6aa77ce1137d7834fb7ed99c3893052f809a0c01b5d2d42701000000025165799ddd7dd27b42043c4c6d41d5b6113a471712f98c6d817860e3565fea814216362539140300000000ffffffff85b27f4ec728de8081554b3ca6f4b94d76c4b749c6cfc1ae39c933d48a78a09102000000026a532ac3e62901f9dcda04000000000000000000", "63", 3, -1506398402, "39fc0281befc99b730774e7a32d41025fa46f24015a833f5cd0cf37cd910372b"], - ["7c6b0c00013689d3e55feb133bc0b7117346475668431f444f6f2425aa50cc1201741c1f220300000006006aac635353ffffffff030723fa04000000000600ab52525265e93c53040000000002535220c66a020000000005ab6a656a5172eeacc301d8218701000000000000000000000000444b0e625e8f32625a61a2cf67e8df6b11138229228c77155a73da0349e4ff9ade2d976b0ff75dd6d95133379b7fd8378f582eb390de278314769aff032fda037ccf490c3532fb9658466f2b916afbafe938bace9b0210d90216031a9e13eecc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa9e41668af0cb147507a6c874e40b32d4ac2e770b71ac1dc605c5dfce4debe08a22a95cb07782f0cb9a8c9c2decf4ce456ce1e1d88b94fde6bc3db4d2a2dab9e0b3b778d0f900bf9a5d0b7e99ca797b3aa711b5d2e2f3e22c592696ed77e63d303076aba7f3ec753f00741294e911644fb730315e6c1db97d1148effd547e7003053434d3e3e5d007b07298d254c2a0285914dd8bf65d152289a11735b97deeab02219f61546a79ae96193639e7da7519b1fcf278185d5b7188d07f0f9fba5177df0a256e1eb58aef20e185a91b95b478507926e53ab039f1ba647248a661b08d3c6f06099fc0adc1a8e99a73e2efbeded2f2a798d34784a0de5cf98057d313994d160213764b19d74dfbc100e3b078ad14b2fa37917736914ff5f8c1012cf0472d7c9a0207229c4c9b27ff8bdd7d6748089241628ffb454753e9425102c41ea15001d79e031cb6f9b7320feff3a5a61c79ada587aec18d7bf89ecfc161bc2327542f2d58ba020af00d1d1e1b071c31cc802a9aef3b3f3a972c8a781745b3e711c435dea9b10a0211891a070170000bf0f705c37e72aaf4a16dea74cbe8dcdeaabedc9d03ab826b2125e139447d741320c14d7fdd9c3097fb1ebb8d5e7b8be0de094eb6650452319f5b831152f6f3f52fad061c024585b309e5ee4f2df34f1a09c0bf280eebad41b68b8a33da5556179c02908c18153517176ceb91c728242dc3bf413f90dcbaa302ee438c00f2a8834097bd20b2bcf0e7b43c7bf52ce7d83c281dcd6957b2e783a8ec0f8f14db4d13d85db3d37ba569d202a79986d470e58f788edbde68719e3bb006216f114ae2b7f4b98ea0260397d6322a732df57ad032072cd73d04d210f74aa06da14f68a1eb0d06aaa8a94f20dbf27787d71ad517bf3a3e6fb356fde8ecfcb2bddd9f146f6b2e89efeddaee7a1ade1f2590a8eb782170446a329ce33bc0071d43e953c84679ac8b371e1de43e8898fc061dfd8d98ce2b10166655f94f44a110feae99765f252c8c09695742ef3c905a291d992ca9c179e50177105cb69084d0f0098f93d8c059d9d84d8b39326c823c0f1a1365bce78ab2b8cebbab59d2eabbc9f2228d06f3d06a1b63b1448c1c0dd3b1fdc823c07ef426812b9fddf0f9de39ccc6a133d0c64d9a5d7c2f613baf03b7c693ecfa72208023bd8463bc8256f0b8f99d5314d0655b29a71ae2fb2a8ad8d1d9c9c76289bdbe8bf56343bce99d8ccdc75435dfe13d7f67615552609ff6bd3c9915f7c1ec999174410d3fd3b65ddb0defd028a20ac47e7d27c5c010abd3849a38bfc809ccf0beca45ca9852053d7cf138fc2c87609786cba1ec837abc92e8d04c7a7e2fdf15a00768ef32f7e9b80a5e27a18847eb6b09c7c217998951abb65a68f2f1ffa96381afe4ecc6c20a511d97053377bc145c09af39c66ebc74bdfe97a89b7ba64fa7a066db0c6b37a8f510236f29a10e0774f6c3b90217f32bdd985df928c5dcbda5f1ac19ad6d63b9dbc2b991e0e619d02ea3f3548debb6e75848fa0e00cc46eed946ce8dc8bf82f0ff676aa8384f6bc3f39551e7834bcb973f98e2bb6cccdc1744c2f1df9b11e2a1ae45566caab33b3627104d1b6fd281b1fbb5aebeae14639303cf1d40a782c4686d3920322bfa51147d450b27611cdd9f27d8a9acf5145fefc2881646858623dc827128a8978c2e543f4f309c090de65ec91c6f25ae92ed258cb0752ccb8256176704b3d482b216d7ec43b0a8776a7549feed2931909b9089f2998629729238bd68af80e3c2c88c0f323af56bf3c4d2b1efa1f0e6b3ef8617503a8f159d4f917d956024731f9b4677d0d5eeb9e8b7fd8e9e6143ce3567b47b79370027b74b237d264927d58b82ebad37207ca02ece242756e55b25b0d83be831a0ae06daac936ee4fcca56afddb9f5230d5b21e91e4d2d9ecb91b19f592d2411cb6c08c14738c3283f1c3872ef4d24f92ca33664f7ece4445895b41e785ea77b6607bbcd8fbedd021265541c717c97920bda17af39436c5b4b380029faf60db66f5ab37a08e76625c22824fb35f87caf91ee9166cf2e734100e217044ddace2290947ef53f9ff84ccff89b0e238131b13e0628ce96bf6a21b9fc7304d7ff739d867cb10b61f9fcee77373b610502abae21a6c6607629dd6cbd1258b42614b3b89bd6628b429538993fe5f9398f2f370e8ed27832af8dc4ba84ca216c59b4b348c185da7094ce7a5ccd6d8745d2b4a2b200e33a081b6cf049726bc9c4b3cabce0b3ef28901919f8ea537a7ad4323da2165648325b6658739cab548a8386c592eaa485a6bef28b9815ab13a885acedaf8b473c9d11439c735c2219e616fe812617adbd9e3e82781f31430cb8689b6ddbe85c2bd3931201c0a225548dc4216b02e7a389111cda5f6d2fc984a6fe3fcccc67070fae0c23a005737001", "5152516553", 0, -1490017737, "704e94177f5a311c53590bce2d1bd3df848b1200e471f3cf8eef58f0c3615f22"], - ["3dea1afa015b498fa64bfe13a54f42947c295dabf75fe7ffbba2d78984760726661d6ddb4c030000000851acabab63516a51ffffffff01a4641402000000000663636553acac00000000", "5165526a51ac6a6a", 0, -1612566191, "906390cfcc1cf43a915fb597ffbe08a3d441d33b21a33b157cc5998d5127a21f"], - ["1c28162f044291ac71b3b7adf788f47b432a373154aa8238be8d73fab579f0e9c4c2af2c4d00000000095153ac655151ab5253ffffffff27bbb1278809761ec719969e01fa07fe0f34e5dbd57e2e7975d5f744912dc0a70000000003ab52acffffffffd4aa0f1824a21fb5f60b91c4f83c03dd6eb3b008c62d3bd097e5fde2b637311f0300000001acffffffff63336a920801f811f0ba287f17948b89995f8454af67c1a5bd994694094093d60100000005ac00516553bbc9751603be1141000000000007ac0065ac656aac2c2acb0500000000006d423a010000000005636551636aaba3252700", "ac", 1, -287142519, "03c12df20878e11e510b07eab2b62b7a73e220c8e0dab6b78c2ab8bc6c87720c"], - ["b1a534fa03a0472f5c0f1b021024090ffc1c54a7ed838c7127307d7da0de8fd6c391b9d4040100000008636a52ac63ab52abffffffff79c37553df16a1688b5ac9a2b59e0bc28377f6a42ec97bce0453f4c6b831b16c0300000004636aacacdfb4673a847e55fce4ba1396b64aed279017e07a357722015cce29bd7e4c562ec7334ea2020000000100d66c3426024f8fed0500000000025352e46d570000000000046a5363006617eeca", "6500ac6551635363", 2, 158221600, "50f6487c617267d11ecbc6831b52ac3e8fba68e72abc7c9f9b00233eaa584ace"], - ["372fb39f036c7a8e6b1bf477f2baa7dfaeb9f0a71dad045ee1030c132dbbbaac3951b00c9f0300000004526aac63ffffffff65d2473bf2f55f1937e0517c03e197140f315f3739cffe188407655b5e7ee9090300000002526a43018420be5d38c961889373da283a5f74b3e5b3c29aa556936dcd83b5725b641b6eecd20000000004516a0052ffffffff03a1b593010000000005ac6300ac5243e0cc010000000008ab65abac52656a65de3936050000000005516a65acac00000000", "5200ac515251536a", 1, -1807372379, "06951c75f703be46fa836b70c623ec7024719b3d72426c4bdfd9bab034f09fa1"], - ["d0c7d2a8015c34558957fde6643c7c2df5efdca813a8d49ce42127b52ce07ad430ab1ec81d030000000251abffffffff0337fe8d000000000003ab656322133704000000000365ac531ca5c6010000000000787d924a", "ac", 0, 1119628954, "4188e3514f32a682890d71498123498d76a2d9c9fe460513c760b0f844413f30"], - ["92785a37034f9d20008dbc283df80b42d43357306bb1f0b185a5a638b3dfbf88fc8e126b6000000000076552ac53515300ffffffffba609f4bec2e35809fda050d770364477a37cee6a37a26c34633f842406d193f0100000005656352acacffffffff215d9e7d4f1a8801d33a43605dd03ba2ba95965555bf113bb7649996f4fde8660000000007acac5363abac53ffffffff0252845800000000000763ac0063520063b228590100000000006f64bdc502000000000000000044bd1f00000000006eea51c33062ec244064cdb0a03ed4fbd2cf05ea617b55e2eef84888dc6829fe542d995fd6359b47541e4f76eec037e79a2f63eeb66993f8e35e6e66d1f57e449590e413b75163e42c89f497d5d8fa4f91d65a7d903a3925205b1ae8c3d460b90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000089050010f4d7c5b1d2bb4703903b0ac4b2761e0c2dcb1f1679aa1dc7995c3ef75eceadc98b4b0fb2ff30290abfb88b73d33bdd7e8874f8145e29f28c683b906ae5ed5d588e64e612dc44b2cbb3f795040d05dd881b9a074094f7d95105c745ce0a3bc184d9554a71bf881aaa106fc6166536922f4c78e501cab4e24560ad9be4032448370d101d40d1d541d853cb6c3958d34cc688535850386dfba3a7f840645a022e90252f86437c7f8173e319a78d9dcd9bc51db6e4bb83ba68ab419c371dea260b1639eaa6457c9da6dc7d68c06bd9b77c01d34e5b8c7284f566e6687347c69ee4279be083a7fe57276284342bc13c986599be3ebed89d8316ec9eb37cba2c21c90328684526385bcf6eab24c91bca30f38a2732b33623a0d051fdbcb0b940fc45ac030fe9e6927964a2f13837ce562a4b4c46ca683fe4b08262c8144e75e32d242946031c5f137d6109488236e21cd3e8ae93078393de186681c62408be2b3dd0f2d83f030b868822a44e51972f773ebeadc9b1e6194bb48575fef6223db6dc7edf60ba0c03143bd923714650762517bef19fc194b43a37c9b70bb0ff93f8a825d3005e2c339d6925cd71da9887202131b20a8bc5b5ecc9deacfec9126ddd338d6f2a3841359c3481d5205962bdc767c7c5c45b27429598695be1124059f3e7e7bfb0f1dc3c88c0780d5e20453b4fabc83012e093195976b90e84226ff0afe1085c35f62a8790fdfc2241dc1d8bd2ecb3453fb99bd8d86065457d4f6e2d90cca23cd171e6092ed5664e89a98c7933738eebe64fe023d33fd5f0675b9ba98e76a5876c816fd91075065d4b390e93524f9595c628ac9e63f28271894b4a0c84e88a5b41c93f38100f274dd722da6344123ca41fba55ade43ce0fcccf3babd17fb2c86b53c38aba85a84a72826cf41a620e72864e2805bc7d0a2b83e99bc16bb088121e83ed016692d36ae5565879a0dfdf852df04a8b35c5261420110113fd65d47c264c252da2911d58a7ed4598a40d94d1e0d385fdb289206986cf76b5ceb4481c5a98863a5a349196dba37b2b091850ffb225cc2bfe744daffff1ed1d6b947c6391561716e05736da86cbac5240176fc4d3600bf78e2e177a69aa45823c80b2d5fa0ffa7227c989820c06e122caba43e2be39db55228d6f8bccf32692419cfb649b42f56ae241a0dac1f7237b2ee3812245fb57bf568b4305871777d1724e5bfa5e5d041006840e55ff22d326f39697639a030e77dec40cb69903230dad10bb291d7af1e0f191c0dedb09b20bef3bdac66463c1d5cffc417b8c7f5784c0f9a08f1816bb2d9130e4ccd9bfa222b647a938ec15ea6e72e3c3125852a80f0b70e6eef18fc6b498cd90c7d321136875c3c06aea6b2adb8da26ed79f91654dc9c3c6d3f537c4a06dc4085b4db6cd5595dab9f2878c3916eb6709b8f3f238b4a0df1a8728189d276eecb6e4093eb1bd876e3d581e7e8d4790c2ba9ecfab3a76a036b54201cc77547c975298a598aa2a3bcface420dacbb76aa935d8a7472d2594ffaa475ad686f0750fcfc466a31450dc39d0fba72215b80b188df34f761f37ed6adda8fe185b1293218b3f20d87253c24dd91e99359351e68f78bb25106646340d1b75a1d86e8dd56349486643b38836bf05c7361a8b849d836a830bf5b5f1b9c0177c5e873908cbd9f5724cb10846e13556f13a2b4a75b57b2d1f7518cbb1a212bf3ee2e0a9d7bb3dc7ca978ffc42101cb4479ee8c1c42038b7273a12c6e940a648a080de59308ed3cc65222bee82ce6ed29115d0db76ffcb95f13dee8fd185a8dc6f31f522f04414008defe094e1020fc9053a1ec32068d22e75916ebba036af64267792ec7cb3bc1d1b121fc57d97ecb7b8dc53a12be1f93df73bf62210e213c759190b9f5ef15f80ffec7f53258c328890d42b5f3968addc2814d66a8c87b56b234f20103a533063b3bdc1688944dbfc3caf1171a53292e977e82e7fc7e9c98f5bbc86b952d9ef59e587725a5241b754b7d037b814c49bad63c110420a5c80bd115785115ad65e0ccdf5243f5e311ab7fbc106e1d70a64814e5fe9902ff44d37803626ad080f57c5e4af51472e26d8f62500cd8e3497ecc34a50be4116ba9d935b50b8b8630b9e767724ac15008e80ca35aa506d1672c75310dfebad4e0deacd070bb508671cfb31ca700e5a4b0e9661d600f4c15838b1ec5d1be0b43aca652e3066341a31c1dab53a4963fdffeb35e5a8cfda780fbb59e8d02b0a65d9dcfc5b5740efe99bf0298d4bef84b9252ae6860adb950ce13a9d200000000000000008a60b302000000009fb24bc204c521668af4eb34b1a91ea2aa04a6c32c075fd717120a860fd7d513b84ff3df8dcd9f205674bfc9f0a460936fcaaa8cbd5490a7b1ec05224bb4432972142d398bd78ac0dadfbd87369d11d4458f831110285e6fcb2c6ad350472f4f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007880f49ae7cab9979238883a39204ed99d4ec88fd0df9b41938cc4ab8042b932b288f054293cff8e58f6b23fcfbfef87c2e830eec2e8b2af333a8105184bc08b9e8c501a9570865f23991e56cae8d484e007bbe28a2c19c078676ce13f5947750bd7f94c59ea1956bbb26d1f02dadc5fd933c76e16133fa9277a6b94a3760deb020081cc59c034c4cd8d72c67c4ea8c50c64cb812a0424bf10edb6ab376b04b1c1021bb93b6bbfb929ad2df1d6de9a9f27aeb8d9ee024493473d588e9bed28a16cd40b02ad297932e653f9480362e1f0bf85f0e76c2b0895f2b89fb4160eb27640c1971c84b00ac569500fdf28ac7206faa7393f0b02701ab1b451e4db1b9aaabe42b10202c3ec4cbe6d7743948f7a5f4fe9390b59e12c783e6e53a3af4c60c99b2dc521021a34a3586a145a1a3cf577c7637bc9d416b162ede2e6f113dd8c4c5d8f85409d02057b803742d91353fd868eeb04244d2745c7f2ade0f719c008434719022a580f0220fb3afc6dfb044c114e90e47d0ac4a90644bed3fdf96d098a2fa3f96509387f0216cbab6ab9abe3afeb6c5733f654ba644900013f6e09b0db74bbec659b3915427e924b97c4161db3342efe54359dfdf4c5f7589ffee5fff9f2f4b31cf52f2628ee534730ed379c63ea1863edde61a6a12248986b950dcbd3dd77083b6bd70319b376e69125643445b9b93a07489675315694658b6f704664d88a19f6cf3392b1fccb1b2bb836dc9baac19225ead4437c53e81f7632df8e9cf1a018f8be57b05b9abc427a1f7494a9edaca3747e691d57adb9d53d36e84a455ea8d92a42d331dd8223f8e2f6abec84c86f79c1c935f234b6234594e838bf6a889533533082039c25d807341701aabef6deb869bea6102c8849da2cf11bc186cadad3b63c2c8a5d0fbe3a4b8777d41b6165083bb0bc75674ac45ae91a2ab54a4a544445ea5f73cbce7df28f0431c369bc7c7f9428aff441b79325fcdda0b633e58247bedfde51ae8cf6693af7df1a8995da85ddb8daafd83e4e03759a06a114bb72757ebcce0e6ff940d71ee4af585a78d667fde9783f307e33c82819c4a8e55c30b6c182081d6340eb2994a33f0aed31251036461bf2a7241b2443ef83f1651e7896e536e433bde0e666a472b458193f974aa9bd691a0b2a333294c71e38a2d352edff3a47c1c2837da1cb5e9d12a261ff63019df0be184dc888314bdcc18f07c842c0dd5ef0e2ef3529343cc09496af6400592224ba6f794a82965e5edbd76d82fe0d12166b28516aa7ef6e02ba2e68f960acb2deae00152fdf9e1d9fdd4134e9fa303489ceda760e8ab75f3f8e2307d4047c273f12cce3f06ad3a4ffa6c5530f46bdf93b3ebedddf79430358475a59cd2312c50570593f81e4dd3f4467dcad26739f3f87dba6234bfc0256478f1737d6f90583e8269e69583e77dcd776ccad439ab4de7c584792506c541ae7aa0432ab99e6fc0218fb49a46049b42a686678618269796754c94ea80050ecebd84c2b71bb9632c3a0b744129afe77ea3d6d917541f55d2c61738ad542bebf012064561977cfdf124ed404c87b6657f23c1d4137f260ebf999989a5c266b08f827b645b9766bd7cfdcbc53389fdd04dd024675ab25333e9676f64966085eb35a78bd925bd9a1209453c9d55803a63739639bf4b8bb67100a6a7522bc472d94db5a518927af92d9a3ed6092493b43385ec511d3fc97386d767e16d395369f034a58c861ca86702b0633d9d757ca2f4c5d972cdfb6f88d691f9182de11caee24c7f78427aee09173a690a5bb6f381999a4ff65988a1604e1bc60d13649205f6d17da9fe87745cb2ec815d22729051f21a7ba09190cb4a0340d6a8ea163efc6899e7e0ec45a88d1d7d4ec58d520d05fbd653a68431433692527177f0557b4f63c5fe4c85c13c8ee22e9e05cc1c7fa126733a9de0eb50c6be1c7a121c03c2bef66b64cb38f4ae93b6acc5bec7ffb036a85f54ba0932ac2614044783d325cfcc99e709dcfaba1913061453334b6f5b245d9033c2903a886ff24cdc103943f05c6fbcfcf55dba347de03574886477702138e65d353071684aac0f9d24f5fd115d6164ad602b51b33dfc6488236623681f53e57a6ed011789f9b3d713ffb656f24d5dbc119b1debf6fda83849446705ecc105b6606b95c581782563f6686027ed41f626c96cb8c54e3ccdfd4fb2ff9047f052025de6612f573adc54fc06288f2e5b2be67d3f8a5dd2d2fd533daf356d0985307a91a8a0cea625243d884d4ed16f8308c7f9e404257baf5b6e100c11c24e3e2a6c0d840506b36c8d3d10fe9c06844f80ad6cec1f3a3a0c4837042c7dd3e00c1275eefee93d92baba41996807d489b6de57cb6aeffb71fe54099682c49ea9cc84bc6ecd83663af952c722afcaa067f9e12b6a66540a6c7e2a364b86b10f", "ac52ac", 1, -2006459521, "49d4df96f9c3cec0889d4ab64086607857846f090daabedc61213e4e85698c73"], - ["21410e0603148b7eab5fa234d5c72e381a47e7e165348d3b2e91cd059b1c461c2066cbe0180000000007536353ac65ab65ffffffffd3bb1945642fd76ccd2cafdeb3f7531526945377996b75c9117802e873920e5701000000066a5100655100ffffffff900370fd304d531d55579cc7e61ed7dea5344643fbed641f01bc4717ec0695000200000006ac6363abac52066b11ac037b55a8050000000006650053636553d5d67d04000000000853515353526563ab3965d201000000000653536565ac65f454cd6001d11006010000000000000000000000003fc3c7c70d6f0c2261a91e1ff5ca5ae8a4e0d57c3f71f6ca957e65cd6f0545369d8b8e47a91b43b9c920c5ab218988630586230644ebfb1f4f7da7014b0df377165b5b989be955bb1da1291c398f3ff78bef19b5f16827c23cc0e8cba81e787200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000654e225a282b89f56e7d6737e88b74101bfa04786e3ff42ddde5bd4f8ce52e5e2a114125ac19ab708bf7d9fa6bc52549943c4e1888f41ffc6d10f842fe2ca9478ffb7ff5dcd423b065f87c857651fd49e7cdc9b167fcd6cba484936de507eafa0157909eaab849a3333b3484b2244aac0b4fead589f7d70257b665f431a5fac6032550bcc66f9986366102c42e40af642bafba6bad31b1722f0e4c84c469799be7032eb1209b0a10181a69130ee4104516bfe08e6baff91d4adac673fa11bcafbea60b13c0e88c9871afaeac120c17c2ac2057698116098894e901d6f9825fa15546e3113d6b3b6499d553801fcebae84dd48eaac386eba3e7a387304ea36ababc1a06031b4a59e7ec79e146b982d61db2b28223f242e55ccf8aa91f06fe0caef80d6c3803191549e4100d0eaca3445d8991c7194bd6e1b7f66bb1726288d95b8272dc4a45030f99d6a0740e2e7e4f9df4f84f04777bc0d5a428c0d98cadd0eca3f10a1a02d60217e11dc9d6155f671acc2714ee97adcc1ded409c41d8e4749bd6148b9bd4ded6031ea58547713cce136570414434f8cfae877b20cbfd8285c38ded546ae552756b15e3ce7de4ecdb5ef7edeffcf3e09ce62512b686ea5115f1992caa0d1d530bda8a2f82cd7bf0f3f1dba93234b8d22d451c9ae114c31f4a8200d4c630a56aedade3b328f2af776d2e2abdcbbe1f288db7fb9eb568b067b559f27b83bc5c569a8d357afb6afcbcfb6c2d8c253079f227d8c9933ec9e1db51af97c13de5f683ed85893152c8c606aaf6eda638c1ea2430c7e56e2874706bb50d94b67204b2b3bc82812616ac15981eddcc6cdc9e05b14b916e236ec0ace63fc1fea090ec120ffd338dcc894fd3379f4d528f0a945e8b49768107407c46fd2066aa6ee1575ebff40e928792a78bbf303c41948251660abfa9a90a8d900df14ac3c877dc419505af147a5068c6a6d2fc94c2bcbae88e07a7987588e564bfaddf9f7e8beabd56cad76306aeefa048fc3498ad02eaded6011775d40cdd41b5771b32be578bd11a5675eb22133dfed19ecfa3fa1faf0b918183f83a9bf3852ebdde2a183fb088f911e22efbdfb4d2fb74363f7422169d4ee812a0cab5b17c851c70461ed701d30d08be4067a1a75f04958155ddb91424c7ae99a54e4d85cc30d86f1b57f88232d95769e926605769c6546cf5ac8286b7c2c715076a7e973c1fd57a7dfc3fa843267000af221144f783828e97b1312c7782746cd25a75de1213e31402b9ac692284de1d103b3d4bf3183de7cff35a388d4b6e69da79809a00c03dc182b9408a0cea19e3c67dfbc66b5e8cb8a503b7808c5d25ddf3ea88b7a6b687f1234f76751dad2277969f29994455a7951a81a715bade8f8c47be0d2bb52261763fc869d6dd3bf0e0382150f6645ab5e145b29c0bb561c23657d351da835401cbc2e91d09a932312fdc118a53bc3596ee3b2725e814bceea8c549a664afa4db89f3ca467f8f9b94a543f6bf7b68b9cd39c97ec4ac07a7c3dd56561dba35866b6fdf56ad2d70e8fc17ab6c950ba70eb30dac277bb1ba7413239c4bb8af0ae0f5d21febcdbbf1ebb0839062fa393b1ee7cfe3b78dc478f5f45c8529d0f21eaee2c7b2fc7a288baa0d31cac1f1846a954abce93e29502b5b0dda98cc2506b479f3245d0bdcd0145614dad63f22079de6f6e173bffe5cd61ec3047608643f27a4fcc5a3294c0279954e247f7e3ab8a1824a1184a0c4c400d6d2ecd37529f11b5630db65e63e0a76936f7a6e0c895eb27c526c48a5f2006f79d59bbeb5a7c212c30ea1c934608a8ffcd536f38cc548eb996b356591f3741d578cf9d8fd280820985d89fb6faeb2cb68eb21d2d7496edfdaf3380c2804a18cd36d8627491d789daea21193c701103b73a81e034033fce65162f89d9b9486bff015c3e87b2f15db76826bf67b3e62410a1242dc2a13c1474052bc2ca5e4b059d19b0c12f0ecba94d657c2578135405fca4761b86ca8d0e0c94a54c686b6a3a1d4db45baac949546137aa4cac1baeb9e7778e20abd876dc25f9d42d6c4a0f3b23c30b016ca4fe153d1c227cd9517bbbd964d9e28dc131cbe679eab6f9564e3f0050c353b103f8fc9172318d261d9276ff9eef2d20616e3300d1591fb0960f46143289bf1d9c26483c9e3c5ffc98fa10a23cc211d1b9fe84dd5f032f8cc16cfa743d5f081349370eadd29ad2efce20990e62a5385a9a7d92928fa52d9b5ad7abb590302c4b16e2f95ee7eff96167be894ed8367764d251eade35659821d81e565af5427a5f07800fa0875de34debc3fd96a5ff158b275878a64b729fa00bc6f194107c3f9e4d3c601126402debabeccd8f63f7567ad90ad95868e9dcd8afec27aa8075c75f71d5dd7d244a7e4d5721a69e0582639ad08235a6c40e287def5b045f9b7b41ed506", "ac005153", 1, -1261392869, "821e787a1fd1d2a63b0b83b192cd1e7d20bc2b14296c7ab1616782b01f15d72a"], - ["db4813b3023983d2eebfb3aab865746c655736ee7682cbeb671b110d3f04ac573a9ca5e1ff030000000100ffffffff0e7211b4289294c4f8785429d343ea57b178870a6869cf8675dec1a9edf45cae030000000951516551ab52ac0063ffffffff0160dbcb0500000000036353ab00000000", "5265526551", 0, 1228609669, "75edabe179544a7055878c4aa824862185d5b7a7c8c4006f8001bbbdaa96abd9"], - ["686ee92e03e5ff970fb5acfb484fbd2b971af67cb5f827bb2819c2e740edf9b2956035bf2402000000076a005363ab6363ffffffff7b7b949dde6f992989297d075d51f791e90faf5ff80a1dd02fe8a283afe8944401000000009e66457ecb9b459529b16614bc9f64506537c29242de08a2bc05dcadd291cdb161f9e20e02000000016368e874900189f8eb02000000000551515153acd01ebab0020d879f01000000000000000000000000a3f6adb5ae818b1826f115ebe60e9e477657e30e6eb29e46506740cb27be5140547eff1ee0e7bb65e10dd4f8904a1bb20b65608f980e39c4471397de4fb9cdc87e3aa9f055a8e9d3d1fcf208a9c6bc828c4cbc4344cc3019702d391727b933e1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007cd7d2243d138b0094636ea573ba728af48fec4ec464cf2d8aec2c14866362f74b709cbc2129da5bf0d53d9eb1ace831be480f6d73d0388e79296b578fcc59e7dc04d0a81cd2bcb12d47f093950aaea063460e090e47a8d8f9d8553d2de9701e933060bda424be647b5aa8474b0716bb46d5f1a1dccfed37b162c74fb8b824b10301dba0e998d6546aeebc8f58ec92320d3f116f19cf9b570488919555c1a55c990220bd6b64af38214573afb827f59dc06a9bab938b47bbb87163f1d5e8fdf1e2ec0a26a75016fc0fb3cf72801d3ba047d74e505e0f0c4f99c917a58fc4174f2ae2d81c605bdda62dee15744a17d2322f46b80995dd71aa472bc7b17264d5786842e70229076d8e168f04e68b2982919aa4f1f9de45858c0d8607e18ff31aaebdcaf7da0305339e2c0945f9297322a47fdaa13f097a93477fd130ee4698ba952243746da003073ea4914219d282ffd261b84d4fc1052fe6f711adc2f5fbb1b96a952b9a8e0a02134cfb16a580051bc38b3f4e6feab16545173ecd2a0ae05fc997ffb21a6e3809021452efe114b895e5dc098e86333fe493e2d294923312114d3ccb942b87e9432c3abe2d55194dfc41915c6955edc2e575ce786205b8b51d500b6a1d729139f8262b77f30fb4d1b0df357f71b72638496149d8c74f59a23df8ecc124df808f33de49e309b1435e3db5c32f7ef60776f04318c7c7ee5fe04a022983e6fc5e177fc98d3f0bfc31508c8f2ad847cf298bbe697505c241604e2f3c078b92a2770c9aa362cb8b8091d93bb4d1ae1963d61f3970f2cb948fd6db65bf52ecb6f0ad585b100f83b3aeb7a4f8942407cb5013e0ed2a7d1dcfefbae72ba79fad269032a4f0f88d380b2395d8c3093fd1ca1f735253bc412dad4446c85a43770542cb7c260b7efe6929afa4c21a43432c9c0e1b7c377c7540adee9bb2893d323afd3ea882a7b29ea8c69391f36d628291c6cb9660dd7b39e8e813f9b4bc5724ec94f3b713ef8f764c3360299408e820ce2e7163ae47f6ffde18e082625a06c8051e2d292c62530b9b225d1d384aadc27ac268791737a05db08f70bdf343bb71844b94c061dd4e76247db6ad81dac24c56e371c22a61a8c9285d2a91ba350514a9bb9a478698257bff1eac039cb427afb413c4e4f7b8b1572bcd4f0ec6d2dcb2a3549f191d92ae2a1a9430733efb2afed70414c7f4863a16745ff7b637d0ccf4d23452deb0b5833778076662ff75b31bdaa1b8eed4f1415f76ad18a3750bd3c6492e467f659ea8b862b7afa4a7838545d02344d88eb487418c403248218eafc3aa2f627f7aec9263ed5ef51a00bfa2a80b4d921ebc3276a9e77dd9f15cc8af06ef5c5ce1949acbee87d0e9f6381a396984f21e05f23b5bca81b1d05305cac375b6fd58937424b2bd325987dbf5deb8fe6e7f54a93b70320adc7e099c93f0e26eb7fa6062e692fc2be3998c40b97a46fa5f3de3f52f5684763d42f919b04ab84aaeec0bc49481449a8864e1d3e83cf45bb830d066ae924c51e947149944c170ae66a2cd4ef2b05815f0db685e043e08e6514ab23a9ade3a855644332cd3653866c00e2a704d415d2b6ceae003f0540066246e762cadb125db8e1cee6a2b94301e454b45a191e8d70ac7368d50439ea43aaa0e1ec3374cfcf7e771bfb0af727fb59b316600f448adeaf2c2e08965b755c0308ac71002f89f9f9b9abfa28018acb0020b82efc49d83966d2bc613eb2143e6f42b85c3ea600b89b2c4452a9f7ad4307812666f01458865e93fed999dffbe2bff13b860713a06487a230687c33a1b30fde9e0b8c2510a59a1d66ca9303bc3b2206c142bc0806007f5d31fcec6f78deac9d957e4c92c4c9cebf22318c5b4c1100e61ffd19ecb22e0cc60fe2985af55c62a9712a08fedfb2da7938cec0499191e76bd90d8df9c6cd4a0a5d0aae91a393a6a2c5759919ab96da5a1a8afbbe3112c2f711a6226af91b1e369ebb746c11dce48f22fc5053285c42321ba6cbb32bd5dc1e5da4ee9bb108553162b12bcd772dc7c6272f91db945fb374337cec2d475fcf8756da6a83feba68a42acd75070c4be0f82eab462c3679e4836f5fb80f8776dae7f3cfcc94978c8adeadd18f5624def202010092e854d250ea780c8f4576405450551e7da3d8e1b22490a85b55bc648b8ae97b0fc85a8183b7689bbef3b7d6e846544f5cd9fdc9d5a3c2a66e1b2d42f55b629544492e23de5b89f6cc0bdcc086c9913586f7a21b5b77304ef74dafc440a5af563236b6ffcd9a853d3b996821270ea7cbef2b84d108bd8466501000000000000000000000000920dbb0b8206ae6b022769960dbd126af68f628342255b9101bf98e0e4b05df9c31779c6275a63538f756ee08f2acd445d2f73a6b506c4f286472fbd25ff69e7ee0ad4d4cbf126ef1a1d237854e5d797de17c551725908f42b22857d5df0182100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e2fa06c55dd6a34764846f7812ad38c259402bfb5d2b8f05f4dd8f384167d7d39deacfa0064e25e74276254144f71fd94d75bb4971c05a2ad31fde4487bd8ad50fdace4cc741ab42a9b6acb3025181bbec0386a1203042282c322c1cdd39b32be2cd9f4f589b68fbf61ff4a60ae87e03921158d9bf6b6f190ef30187578ef88f030e14df6b75c3ca02c7c00f42751349497a81a5d8bfbe426806bfd6097be201a4022151897ea041ec6f203cc02e28003130a77f03cad330d0522ffc87493d91c1110b0333a4bc91324c4eedfda78f9661808fe0c164c6a009597e8d31e851fdf00a4c2e210207f399d9392f75a09b86bef5a064acde6ac73240c6ef81816f54726380021c739cd182c3cca87bc6f1eb6b9a9c91154f7903e6609c75f8d871f99781bfdf02166368c1996d7d136e1daf6cee4591a14e976a25c1ba3fa942cbebfff4ace9bf0319adf8bee8d7a09ae7d6581e2ad27b5e39ca663397238fb8b04ec8d7aafc58d00305db1b6e108175a99cd4121b5c0876090b0285aedd05b4d4508aa6938df365d5030a4f131cf47877714eb4c393f1a5d6ae2a0c6687e676c5995bced1102c3d4e6561522026d60d0e89e6da1d55d392a564c69934e52392ba18087788372ddc42a1f624b20b646c02c74d202330370f0e30bd8b7c49948dea71205afa2b3ee4b289719f90e796756cdad86bba9fedd6e4fa832e1ff2a93e0c90f864a63a7f5b1a9ba0aedb7db72ed0ed935e9dadc2dc20c4683742a860225a73132e0db60611d1d4d85cfda8593d10b188a083caf62813c13c7ca606ae40c18a73108b00a65b2bc1973f5bd58ca816873c5484b5461b9376af9355eee0af0268e104e136ad4f85ef2681cb0ad4a2b2caba11f19db17dcb954f05da239fd38a5bb3293d4c7cf2ffeb5e77e3fe7ae3ebebb93bda26000ba3f0601b00212fa97f03257095930d52accc250b67b6d703bfa200c1dc68f10cdcd8b9e9d02f52c06d9627849cf6cf76e4c2fb2f0238b3c21c9d2ed9636ec112b2d0dbe3a3d6de122155f2bce6bbdbd891ebf312a09614cb6e37a4faf12fcfb6e6f6158774351ac9560eb2df0802094b7b6eb6c24884b3b762c150ab043dc340cc68958aeef70c6c2555125c620e4d1532a07e04306539811cc1bf896ee637b371ad9fb0657157331b07673921d9f860141bf71c1d817853c25cf0c0ff23ae83ce42f29e54b106b2badf0a1bfc815981c15b6c1818db20e4f0b6de165c5256e110fb7c98766da9112cfa5301062ea272e6687d19386a2ea020a66359e5dff5745f59ec28658e4e11f5327b488ef1c1e595164700a555928da6401409b91ac7ae8d1623cec2fddc653fbc4ea7b8085a699d241fc4367656a9d9a5462276909c3d61d21789e3c3712b3633702a40de4385a8e152ab1002b9820db80cb6b2c9cc365ea3fe2da3ac752bafcfffac318638779ba4f80f0a88f807cc2f28a2f29ade17457342f4877ae9a28aa7bd1cd6a17b477e7992b5a433ffb74eb72fad0505871d592eb02c30459f78a6dbbe5bee333a150682855e98a7a417af0cf2ec8951de3b329944dafed9c8ab3374942070c63f5193291f0d188b97282ab8681838f8bb62724a04c1367bd72560ea15162d528ac79bd15e3561825f1ce26b9fc47b6eec0365c706de3768f99d554ed914c16eb0a7c7bbe1f0fa9960b69fa1900020354e6d1be7c471c99f2f38a68c9e19b516c628657a24b3fc1974dbf05c2f3d193289cf446a5524873dd9522c72254f27e5263a0d71da467eea1618c1b843e83e2b344e90d23306da90f3828d195bbd4801455a7b3f8c0dc18a2085267005c12741a45a1af3fb2a989a18f1d374c8f7f7e9fc20bb5c9fe56a3de1b28dc96680fbcc6363711133c896e7c05a947981c3a20079e3797a587b756be3ed629a0f0cae22c2167aaa7fac0f4b2d473a1922ed11d51775bc170239ff16185ea170b2504fcf2d3970427c206f8904dc83f10077770dbbb2922fc85f14f0d86dda2ba1d23576431ab83f37d7c90046bda028d712d95bae1d94e4e8d098f92c4bab87979e3c10d2794f446da706ddd57723b4018542c8529393862e7a1c6e450b5722c67debbb57787551a0e7c151256659183e735098e342879ed6858e41e0c97f9245d01cca17e97f1dddb814ecab83db28c6f64c4eff569d25375d205de500f7379ed26df771b2646afb5e4abe04bd18c1b7113d553949fd3018c484cdf63130fa88f6fcdf629338e0787bd35ca71ec4923f594cb2d8f853b88f673028195f04bedef619b88e3f3cd44e29946d90d105307080afd566e75c0f078d8e0ccd4b9d593b250834c45e82b3ccc093acdd2bc014183c4ce318efdb475190e8e6fd70d35b8a4bb90952b68de8dfcf5cd9c214cc6f9b1395cf29d1b4addc05d6a17e4bfe9a7dd6d124656b72de6908", "5351530000acac", 1, 2055472226, "271189653df5d8387cb9b64d996c46ac37da99906be9705099b547a8607c9a05"], - ["266a8348024815decda64aad93ea273c28bc3bcc154e11b54fe98381c204d51cc41f4359060100000006006565ab006547b5f89c93caf4e0f2f9203aa2447591fb6619d2758ec36866a1f71f1a939d9f31d6ef5600000000008621b5dd042dad4d0500000000065100006363ab4fa4dd0200000000095263635152515152514f88f50000000000010005adce01000000000200ac00000000010000000000000000144f6c02000000007d70a8244c98d73389fffd7dad3d377a27e0b5ed0884f4b9ffd23bfc25d7a28b5e17aaeedfd6ace3cd60772e46c86787ec65b722fb54f996a2e08e5652dc4e155bc842beccc2d048d87393d0074d40f8e864986b3427131909082b9268b5e8e100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f75cced1a9ad7639a4551ff313f04412f54b349df98359c3bf7df72252cf09e5246aaaa7242788993afcb9e6842d16e388bb14023003ba5213b6f8992f68d93529a5fdbdd89a1e825973999819237b87bb2f085524fc85736d9e34b8ced8193247ded76d3941b34904a2642dcb1209ff284c26876c6ec649ccd2a3199b9f521e02282fa07473be2524d70bbf11fe24c23d5b92c99f7b94ca7a48021e0a4975e1e002087ba8082aafdf48e6502e9664f5fe96b23f7ebbb221df0c6ef2f4a43a7be2b90b16032239b42956e382f9e2d4098b02d425fa7a358ca17b442e92c16d83e949d40b8fc04732d62c1664631c8568adc865a61a2295e85c00c929ca96965303724d0313a366f72b0718a1cdd0da27ced3ee7f578a5b8d7b9e08a2721db726dc0dc02f0319fac83eefe9c673da1c200f58012fd1114c02fb82e34a1bd4edceccd6a3e53603252a963940dc23d8d58c95af380aa80be20fe772951d51522cf48601baba1ace020e9f118befd29a1afc0891d4fa8ed68e3b2e81c2239e2c059d37debfe88793b0021e03ce4579d6b2942f349b735a202568ab370001b4fb2425029b930b71bd07cf486dc092fd17e6b51707435be531f89ff648ee176cab080f4ecc5476005d2937af6fe2150653e31f7453b4d3a319ec987040bc24f7009a60208b25b74be3f9c58938c86e650ad7e884f79d72342217e757e49f9962bb464140cf77ca0844eaedaac9cf2a02d4290dd16df18769d8d15994f86702224d30cb79ed3d6f4e2d9010c8abe13b875e78b1e71c586299cf14d136542d32711b2e063f63ec1dd75c787969994ae883399ceffb178c467d2bcdbc8f7b3e6424edf4d681cd0746def8413eb18557070350e7a8abf2a60320b7c81fae25a14d0f7f17b959821874cc94cd462f826f069a34e63ebcac9abfb4fc4d13c88d00eed65854a2ac47ebabd6c1c0ff85d5e52fbf37a6824e69d71ae6e7e114aacf7a0ba24024f85abee18cac2de013dc457c38704e23986e0a67a04f25e36a5ea5ec8eb02529361f7afa86f688245e9529a15ce80e84dea83cf0515ffa88455b895d1b30f550a63bc087d31a4cc96a97bcdfb4bd21728919c8673c888e73b9457b7166a026360a8118a76ce1e652876df8c897f66890c87853f6c3bda0ec966a4e8e93a3fb1b8042d06d8445be507944c64bc41fed3a1ab99d044f4df6e614db41d54ad606dcf0838d7c27256511d4959e8ed2cbd32833d58250ec08ca7bb4423d0d1cc22a8b8482b5f9993ee23c8e50a489a4f558b16257a61fa378dc022ac74c2f74cc2ce26c6d5c377cad8dcd6900113df41c455f50211466b0a32fc5aefad3ed6392941858002987d13ee79c619cac44b7ba8acc23c80a8581af57e223b40396a54d6aa0951246e86bfd53a28793ab30d4f16b0ae4bf451526fa7a13fa0ef01f149845941933f10a448712c1556dda458c31f227a3f72312e7872200a47d8b9864247fb2fa7e511ffea17d9dc71f7492ca4a7efb6045508a3f4d03e4befb57192889136a54d267f52f64462c15b5e9f2102650d2a6e87d82ace89ac74d9ee9c12bab752370993ffef820c74eb524ebd3bf7d99ce9a8efdc711106165e6ddfbd600008c278a8d4a045d1e644c23ba09f413b16c30f3e5b9fb8107656ed4d5910470acac74c91bdef91449369b4d84a2ec99d077128f2439ba03813dc9d134bf087a66b53fa12a4c860ae19cecc04740f63e8e624c2e28d7aa0f17bef6bd69c575b61346711cb4287fb0822e6512bfd95fb26484de2b9432d99e919377480464c9018609afce1ee5b1addc7e37361675f8810f5ca320da87dbb7a04e08790cfa50d603ccd07ff87796b4d66e2ca6a4e12666a055b66776cb05111b720fb3cee1a64bdfb5203e16af95fb0b9835a7cbc0bb07a9a6fefaa8e89984c1dbad493b9e0b57cb166e69545ba4727764cbbd3b104297676c1bc4ba8d45f56213d5de048ea8b934043b9107411b3ccc3dd7ad639fe82e92a6dea8e41542220bc82158fb6c542fa61c49846ac3e2b601621fadafea7712fb30b8c9e7e5508763c26a6bc564dd6e1bd72838848bdd7b782eb6e7b9833dff5d1dbc0dbe913a1d795877956fbdd5f820ccb090b009e1932205083de1b9538c919c09b846ffc527a3f8860958b7b24ff257c96f458e22239b4b29cda74ef55e26b61b3d74a798459862b3e573171f8b375d619b4fc6340b9446e652632169a0bd41b3f4989e480affed216dd72de5fa01fa7f449d91f17ecf29ee5648bccc55fdedbe78f5f96cd1b3c329b27be5e6291d478d0622dccca998a67b3b2fb37aacfcc9c789df044c0884cf36d4210c13f0097cbf5596b6a3a12ff0b8537e206d6a17afaf7c93845c9f9dd7fdc782385825e4ad6ce23bc319adf1f2ccf100d05077707c095693ed76c2d3d7ff946104", "52656a63", 0, 980983185, "4feb010621bd08ce9d64707081fc66b3e0d321b4a83636f04931648439d850fe"], - ["9551c938022164dc49b221004651eacb2fe596c509c3f506d3582d6ef1c1e27c07011eaa5502000000055263ac51652ad1ce10f7eb67817fbee116eb0cbc12753abf6954bf85fbdc5238e53c20beb2850dd087020000000752ab655152ababffffffff0280a051050000000006635252ac65514132bf010000000008535200ac520053ac0000000000", "ac5352ac6565", 0, -1733984556, "52e51eabd9edb4c335ba6c68fe33695da0891f341acb48a38a8d7e53c0fecbcf"], - ["ed4b022001f2264a0ff2f451fb63eda871017bcdbae48d51921fbdd01e9b90a1c6b4fbc67f000000000163ffffffff037c6fe30300000000095200ac5353526365ab3a7c0f0200000000066a53abab6365696d6a03000000000351536a0000000001cffcaa01000000000000000000000000a07f832c8d6b558a38214227e31a3ebe8ef3787ff824fb72f31318c973e7f01b1093fd18c0ca7afbfa82ae44fe9774d61b4f5c83ed5bfbcf22cf648a63111deb663794e62bf30dc39be7a7c9a74eed9ef61b7c60b41d9cdf23839a2225b9938200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b4e84e0a09c4388a6a80a10360436ec58e4f2ed1783ae94f0ce62d895c5289abfc3569e224fe1a4da2a86a1168514f8755711dd5c1437ae629662a17e0b3cff7c883b0bbc4cd53a0be8059d6dcf843d34ee145bad50eacc7ef3dae6771b1f100d2f854adca6e2e8788e937831e82298f80b852fb36ceee2e81e0e483b8ae56b9021e8d323d5c42f5b73c43e0627a6bd5919c201d4d3fae7fc205f9784c63b61f2f021f5583425e662463543e716b01de80eecadd19b6a772226c1d1737cd6db1b3c10a093958358a828240b0ff5ce6c928337ba4006c706d95dba59d72a12541e2350a182c4944e5876f82ed9e8c9c8660a883858255c8c75da8cba20224aaf21db82e0201202656d814584ef18018a2d8e6d5a062c5bb8c8056d96c708b441e7eb1e5db0310553659f00077d06eaf5e213dbb0a67f15a0970e72dee13ca27a118171ce7ed03061e085e8cb429c1b3d54348f87aca0a08321e6d66aa6b83364eabb32e99d8df022b1a5ad0abc5349302f75305992c9ce2ecd487a290772f5c642e50e655cbabd003283637d19fc0578f91b08e60ec18e02a581775be4207f7c1ae2197dbf45183c84005c2d924e447e9949d4b1131887d23e57d720d79bff400d07fee27877ddf26d0843fa10a2deeee71510e1bc0e72dbf5eaa108d0a2a3c2a4a3c75f5795b3ff8d4746bba92088b4313a7bdc555ec975793fa0706efa998c4d2c912db3508a3e5900a0d29bbe3302ad6a1c5f41b08d61f692cdf01de2897d06d5440ea4617a143936f5f6e34e857fbedc008f85ecb6c5152a9d21407c6855547d9ecd7d2560a5a5211eb1fcb3757a65aa35addd4677d02f9966a16a6afa4715009e6cfb0f444c3d84cb2979dc46c94e3c4e3495ff6a0ad64e7bd7d28ee860c95f529312d0bbc3b34f839ea61c7c989b5f75443b47eafd58b55cb945ed7d0f8e0f8757004a048f7ae5a77092fd3cbf925358863eab4883a47e8a38ffcdf8f06e1454a2bc25ed302870b71521b1d7db6620f573485ac37ad4904fc091023c4af9ed705498dde889f30fcf78501bba180f09171c7cb86eab15a0cfd321449e81e481f22a9989f07bae0f73081f07f260bb8a7cc557bb6f6b9718bb4539ae1848c26a94592297f25fe0beb84b2485fe771afbd83af02340b6ebee08bd3324e560d606e564b197b740a1971c8e43c105ec15ead7b5bf07d7ffedfaeee16b692c794f9a6fb31fb253650bfcf12d95ee210b624e791c9ca38b7f0557284c4741e9ee01bd69ed9aa38fa18d970c1a96fd370a543fe1f79a9a05747f5ba49fe1160f36f0dbdd1b448fca921a5126cb082c13163ec314ff39853550364ff34a10ceffe4f5c8ca77f83d44ba7846bf90a67d9fc7aeec1f8498ebaa1c8f878d3e704fb8ead5995bfb434ed94d8a6ab12d17abbb697406fb8e9321874fc6c285f1939c15c17ac493e739a2af68a2f21623a93ad59f779bf70c148c2b6ddcb1343076efe85e1dd10fa0d997adbb39f6f06eb48cc3c8f181aaa1f7ff1561b04c3c9095335097780bce454f8761325bdbdf52cc35bea93c248c3055d1f71a237d7a17b07cba7db42ca8a4a2e09901fc3748b0565d07d647204a42ce04a3debf7869b1eece82f6d3bb3de3c59c84f36878b36f32c9a46d676ea590bfa24b22159841311388064dee76032bf4fbea970ca005c44610caa7d063e576ebb1c301390e9b963bfdb6c1d6df08931d3c91098f795d08472120f43ceeb90f97b09ba93dea0768afc07c7fc92813b02c73b0cde3f161312f08ef2643639870b239f9ef57ea0fd5eddbe0be93d9a2f342023a13145fdad08eb197d07148efbdbb46f8987bc7eb1b4e25f2bb0056e36400cb0f730af9a427149899e82e9bd4ad5a52cfe44507a35d29ac93544046416e0e24c62d2659ea598c0fb4245337a3672adc72cca6c5b965c939a523ba439559c120dbe2b86d269eb310787649827c1ae8fe78f741be7ea308845406ddff993ec8e6b24acfdf0920cc011c962f993b0fa615ce75ae813aa3375c12d2b4061ed82d1b28c96a3b8f0847bd9e8908c73e4e2bece05a97197878e8d4898a5d90788ae2bc93bb3f0b118f80b9ba95709b6769059b2585b653f31a9e461ba6e010ddc7e734a1b088ef5c9fc976143ab9d2a482f8027039f0d5d5bf3928435cf7c2ccef380523337c8b4c79748a7f44688641043433caad4996c1617626c571bfe379f73c1359b040631b00c53afc09dc3c590578f642d268eb13dbdd5e3ec5e71d721358d439863a63f6f3a1315a19e7e383e9a14af8da9c9af86275e29011230358a52a054562fa4c8ee33379737b0167c06ef4419998f79b1c1618fc726fff2de7b225702b7a579e90ef11b0f1c6456829640180268c487e066cf89e969cb369ea1e8a3fc1b1d88822eff5e686510cea9c155e42ac57b4404", "ac51", 0, -399663988, "65112ea9d2c6d5c5e64dac15c79bd6b8de093a0c76715afcab1110e41c0bdb6b"], - ["62d90c8f022dc4b84ccace2b3835fea403b965fb6f38dc73131ce204734d13cf07d7f94b3503000000095365006a6a6352ab53ffffffff2c24eef8cd1259685154560fce4f7766da8d30a22114d9ffe0867e191fa3e38c000000000752526500ab5252ffffffff03b69d790200000000056a0063526a2c9f8104000000000651655100ac634baf4c020000000002656ac10191c8", "516aac53656a", 1, 1457994268, "cd77a3b431a124cb98f825db6c7d2d8652fe5a39df6be90e9418365f438f9bc5"], - ["74d2fd49046187da7cc7a83262f2c6d15d4b3de9df25a97774b375249bbdbbeb7eaa81948900000000035252527188dd8ffb2eaa610c37db244b8f271db433bb0604940c7352f4b487c3c7fa23d1a3ba820000000009ab51ac6a0000ab52acffffffff8c8d5051cef9baefd8afb67add44533093e33bfdbf7facd12a6f9522d8d5f54b0300000006515352ababacc3bcb3145d7c3584ed6e8fc8d5cf061b5bdcf5857b772ca0cc8d004c0bf8806b1fb4e1f60200000001abffffffff040a4c770200000000066363636552ac5ef4e7040000000003ababab030bc3030000000000f89db201000000000000000000030000000000000000d140c301000000001d41e0a75f718352daca18103fce57f8b45faa8752b60f781e4863b12f8a248780ad6774f7dcadb0b1b9b7146ed11324422d73cfbf3eafc4faafdd94d0bcfad39e09982d977cff4e92ff6c0c4ee9ea3d76a406ec9ee1e6aa8f2685bdbe4727b900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000992fd456920ba7d294812e2d5d9ff670519bc4794b75dbdd0307c7297baa3aa52b3eb09956418f9ea93500dedfd3c7a21cb7ba9b4ba4efb62a2f995cb60ef25282a5bf92805d7c60b92b00eb9d0b71acf601ea74e66aed0087203d53d2e2749e5c34657c988a4f2af213dfac269ccd5bdd0730d5c0f17d260949042c4310d1c30212ccadb1bb3a24a961b7d4216183ea3b59b54c85059b08baffcf23383dd92c4903209d4fd13cc026f3a12fc856915fc2792f0b7457a39543a2962ba9c2bb5dc39a0b20d093d6d9a3dfdc8f56989375c4e4b53802e932b77e3f674e6b7c22e225b1fb012b48e8985ecf55d725e7436a3f5b90e69306021aa769f933347e346652cafe03237a4478a72e50a7cab013c3635bb312ab989bbb398e3f9d6e2f674a8e58ab6e02209d653fd5c8d8c8515cac110fab2c759f16bc23aee748e58803fba5ffdd4bb10221977518ac5725ebee0f910742c83bb59128aed4a47b2ace1880efa3c02314ad020e12cb3b9dd54c664228cba80ec9265744e389d98ed421852f12e61157dc8da103046dfe0556b6709b6ed8109abf98765ec8a0ae292047fd12a324364264c0df5b7d3cb20bda2cfa0165b2a7b3258caa28c1448c0a1c251b652fe7d89acf65511aba4f8fdec0ad794002c4a61fc6a6f58ae99046bb4577e21d306a6ed339d7144a8009b87027a2b835d3f3c41bbd4c245084c9a51c3af31e89588d18161f2d43f2f9836f1a0338fd53d2f5cffb32ac4dd877b1ceec9f488dc84bed43b29c1cf7c1ce3845f6a8d006e9cbbf40e3d4066a10cc6a17d1e965e877ae278a649fdefc4e0f1c40b1923eb1107a9623911a92243c1b696eb43ac73eab935277a6f01a892e33fa22aa87eefa3214fcf4679beb34b5e8b4c9bb2673c556524f628c78f2c8c913fbe0860a29eceaa18ac42346192cb85c2025e374971758b1b75dd3ae4cb0b15b2e47596cc2dfb94124d88e73d39a7f55cd1485a8be512cd072e765dc4b4d898c5ea43a7e20c31649bd15ec1fae111f4301dbb2fdd0e925658e0f7e73a02312c7ccb009b0bc03d3da4842aeffdd9a188716f7be7e1a9cf029504ea85c458152673cacb0264ee85b708f0a864b0a63097c47e1b1f5b2ad73ecb5c10d8e6fa532e902d11b6e0ccd42d38d2907aae35a974df799cd4ef4679e7dc8cb4a41a0290b69d7b1458901de6ef2f119addb0ca795c3fac0e13fdf9350ae7ca5a81737f00bd4a7ee632dfcf609abf9be25ad3cb7c8ca626fb279c6fc34550c7c30a7227cc28b69783ef01feabf88061587099e8f2ad71012b2d6d818282cae95dd5323eec72e39606e79b7c3f42d1c312b9b67ce7484bc97b29277d705ba4ac1f5942383325ae69d2a7cdc35e87fbdebd9eacea2e8563df4c5b4ba48678e0bee6a6700c4c8305be022270089aa944d3903e7f9d7b07e60ed53ccac5e8ad76dfb8923b49b1b9faecbc934408dfd7468d7545f51dbdcea67604157c1bd4f0f181559833eb61e65e186eb206642ec7a632b71805636bdeab23f01369fc4fbc0864c2b826fa4a4c48ea9c9aac18bc7af602a9783b84621d4ae9b4a5cf3285ed91658bf2e7d3f0ee72154c0cb0f058d4f7ebebfe33044332dcd4c6741ada9edb34dbbe1ff754b8bf21acf2263bbf4802c9f172250c3323524aea50beaa8d8f2dbc195716c42963304367e92bd9a288dd7e83cd5d390928ed057e572c0926a781f1654d503c73be951cbf70a2c552b3be8bc0fb576754abc76bcf829ea7383c87e25286aeb4cc41eb78d20236a3a88c50e983eb48d31ddef3f4d031fd3f9526a69871ebf2da4b3a65d1c9781402626f24c8159d59174a82d0e70760d60dcffff08b525016a506ba835c9e4f18b3359b6c4a9d68aea4bcae1835ae1aca703c6b36269659b24d7625246f93b975f9edbf3bf8b6949e217fb082852ee9d8ede1c376626d2c10f7e22384aa5308e78b13fb167827a4d32bffcb349ad4e3b6d027ecd2c9a0d901f6b850b947cc40b5ae058cb28b885a2f5a9df69cb6b96c6ad4b16a9e3cccc0c77a2cadfc1af0fd528baa4c693e4cd3d36f9474ff6a33cbaeef23927568f47aed1f6388d42768c875cbb1c8cf44a02ede35720865ec347f268f0373fec19a4941d6db6f47f23e4a1154c16dc791bb6a7bed4cb6848c71cd5cb34aeeae999a1a608404724d1ebd1c04b543a66e32f2f0a1edb15dae03c627b1c457b36f157e445e157db5abb3eb6deca5f4c8a80f8cc527fb0b3da3676a8cbbf2e5be574fe05dda7ebf697f0551e056dc58c529365918b41e176c479bb0000000000000000a7b90d01000000005a24985f27d452daa9b15c339f279cc9b5902ee949aec313865e26fbb4c1dd5ed650b16b0b94f07e3315eeb54c95735b233971abf6ee0ce6639d7fa7ec2a5fafa359e3f8c74dd3f3242128f69f35a7d12579962b4e4d1be8ae32a9bf9e035e6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714daa5dc3a07359050201a1e5825bf539d0e92863b65d043b96629837a1d8e8792334bb7a15b026f27e4d7fd0bea95af76a6eaf922301ba2d055407014d24b57689f4a58dc667cdfcacb87b337fd0589c02ed2780a7e37e85325f88b37b4d6b49a70aeaa9466de8131f67c9b349fb42ecc46159f3a0a78b2e419a0c5c3b4a2a030287157f7e9c6edb947320bd3c2ae88975e979093cd14857d309e54d5aefbb6503167c90efc8c1fb63423a714d822b2b8af61931097d4b6e804501af4b9243bd5d0a1dcab20a530e7333db5c8ac46d482ca4231a5ac2001bad3287784885ebb48d5f27a13905a24ce46a3f4d061f09168d07923993bcac08f06743a99fb70ef9daba0323c26063c309d87dd469202e99e7fd11eef565432b2d1c0fa34cc267e40693ed0209c2ab673eb1e458f212bba29149f11dc80fb72f8f9be4d5c1b5d30575122e820305ef73ef7ddba35180cab24692f95f5c3290a648a06c37b2a085613693824468032ed757799c5af04c133f87e4797b5fb89a7aa675f2761b179252ea2519451e9f031497ad3cbe40d37517216fa3b5f71954058a246d97a5dec823a29957db2eb5ec56e1ccf5a9c1263ee356e95775ab36e7dc68a4dc00f90cfcf906ffff99ce91c2b2d79661db716077885359b53384620fe4a9582507defbe9d2d273c1992445ffdf3c567f8dec65e16a44aeeb316b705eb95d8a9493fedb4906c5cc414f9a4f288f140108ecbb45d4590df4f3dd3087f35d2c7fe274aaf710e60637c5e3182be37a1f94160e79158759aec5016aaa3d74fd321debd78fcf475bc0500d3af746f916d58fcb9951662adbe073264b471b28d6be5242de33c1c73dc93509bbbf977be4595a87cadd8d789d74a40baaa1ba428884114682932e8b1bea9ca0e5c372286c3b4c5c8c9bcad257b37ddbfc57046c8888da30afc0f6277896b971847ba7e52f44cbd340807559dcb17b0939bacf097959fdf4bc6be436f6b1d7e2ae8ed19f098a86eb42787d1c92bc146acb8479488d57fdaaee643af24b765238afa5a94aea11b6568caf2406e29b804f27981b6216e5cbb37b23671dc9274d48c62e2ae31ba4b2646d17f63f9331690d493d45de6792e8cfe68c634768b4f2ca0329dab550b3a4a3eefaa692f60057f5b85d368a167ff0d678779708444f2677f96cf4a6001ce6fbbfd322d6e3507834db56decb4bd8ebc87a6cc72891f11a5713687d483ce56750568a19aef71551bd7c628f5bf0b1ebebdc74f788b88d7c8f94716dee05e4f937f92bd2db90153a93540da6993610336e6112a03f93be64518aba71ce5434cd1db82d0341b9c73346ae43940354e66fbe6bb9db6c3efa024c08ceb6a1639552cc755fdf6094499e61fd0e832774f00bb14346bc08a540ac0b3ed8912bf3fd96816045abfd0fb08b9e3e8238795f4b1c9161c08f40c5be51ebdc107af271ea090c0f4746fd82782e08756f89d774919b6a3c81d2d97a644147f2e16a4d57c948f977a277abfc733b9bf6838fd6f343a5fee471b2f4fb07427e76e05a4f1bc6796d54dc15295efc0894cfeb71a239e8264b02da8becbfdc97b84a77eb79adfe92cefeff50cd5ba0ec235803fdf641336a94dacaa16d064eaba1985d959471680f507e0b0c37832a2bbcea202714691db7cf9d30f7560a2c62f9e124c136048797c146b0e6b71f249d774e440cd562e18882e738129d4aa1857e8900ed2f3ed029bab8837df043666f69551273d34b2ff2278df971664359abc60c5bc29ac0753fb1b012ae2d9d3d45276d3adb040f4113a6eed1d663784cd35c92ff77fc00c9dfd1a09abff13bb93bff175090192ee02cabbc7bdaf28093f7ba832a00b5e46bf50a9c5f651bb39dd1847b6ecdc0ede368f1127dc5326112ef54f6b481250636e3ca23ae96aa7b9af27a2855ba7a7a1234707299d2c475c1ccaafeeafc75fe1eb431ec87dd69129d0fa3a512843ad55ff8c628c936179fcdce567c84eabca5687f367e99beb1520d11c5affda93776e8e3037407ab12292392ac015e5eb13144eb364b3bcda57670960ce023fcb1b89508eea2f466774893df45a74474d46f20bff52fd9d53dfc3478e88e9416fa645f82c91464434528b35eef16aa48fb8c9d43ea0825e65639defbadc2a9cf8209b9749676973b35109c859f9832bb47a98b303682ecdb3c6eaebb666d8b772b0119267feb97de5921b4326c2b6e1f8b7569218b8ec4e816f9ae8722c2f8a369c41a84c16d2c0caaad2bfe53bf6620ea3083703d478ee9971d4d11fdb00fd9e95b86f7e4aa01000000000000000000000000654d07910ad834e954083a529bc6c7166ba6fa5bb090348ef800e104bd9dc7920ee65cd3cb0dc17b5c2ba3540d26fd5fd58151edc92702832f6d0140d58a74a40f04c8816630b61ea81e858bfe841a5c4ff74d0906d4a23ad9153f5630904f9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ad71c2fe579a9186acbf525024f80e7f5d65bdce07b71cfb6a0875291036da76b5d3603f382c66ca642e466bdd9804a15700ed8b7bbf1b94afdad959a048531907457f1b862ec562cf0c6c45037e80b2a376b392648bff2ffbe411e1b052f7de1a51f3a496aa3970d4b9784f72295d0985b4b68f7ec7e787c3c67db22be2905e022d64d858d268d2beac923796a4287e6d29c7ae43253c3c5182a73daf6cc67b5e0221939eea4d7a70f6e7a63f85a5a23cd8fccf48ecc6f25ea1fc7bba2cee9cf25a0b251aeac7fea1b21014d64c2975aa73934e8fd10a03a4f79633788a149b547b800f4adbc8ede2725e05e6ee4a7593fc34d8c8de4b019561dda4889ed4472a5066031a96a0a242655c0fbb84a20990f333666672806108f41b549fa866c0acc393ce020bde6a60422023923296426f9bc42cc16e650b76e51a767ed63674307785c39a0220206c26186effde9af5a0f48ef47e6bff7c3e6fc9921561ced573c9636e0f39031bc20ee7ea11eb0d40a66082fda8878a69178572dcc0b3a0bfe24078755586f40327c5cbddaa93afc495c4af4762f7d57fc37ba2d608e3bdbb848b72d25d03ec080e78d23ccb485e0dfee6964d6e157eb0b267fc601d1656571a5c9a09b3ea1bf1a1021c04bf3b71a5f7a9448613a7c5d878501a1da85395ad054b24ca3c24f883c9c1fc703a1229f60c2b1e22cace53e4a78a79d2677f6ba2decb9e294e24790928a458adea555c8d03f6dd33ef9907d7ec50f664ad8902c86922cd13d87b0ba8f34fe8487b59a2b319de48ddc94a6fe116ef4ccc1f677f0538ea2b1e954f71768fb5a3bd53ae482acbef153ba12c725d00251c2609de0a44964aa92c43ef32e6babd8b679e5f43d78c67110f15ea60bccfef41de11e1aec4abeb1d36dec6067ff4e66c157a459606a3ba3b15b9dacb45d35c8f5d3a443767ffcc5aa2fbda17e6f79681c3d1faea7adea12b63150e3217189c21ceafdedf5a3a0f1cea0224da6bf63a77dbc77324c55f8e8be346e5acc2044700d45729d71899f98507f3cabc18fbf103369b88e48376b450269726e2fbe6fa99ab2d5cca2fd6107cdf8a032e97a88378a864ba6dc5f294a867e05a5d98d810bbe0d85537ec1aa9262a892c64d256397058b4e28fef54c40edd6eb3466983599694dfe4eb62bf01e841640fdf7731872118df4edc580bbc55a42644e0ab0f536acbdb05d21b319994320d3ffed50a5080a02d2cd8cd8824f12ae196eee95fffafbd22e095e40da731a11ce0ae3b15d293cbd414a9cb2bbb2febe91204b313f263d54edfa56facc5da1314ad61d4708fdcc601d2a337770810a2860dde14de0715505c3ac1cc7f4fb68e1ba81406f4d0661720e7c1c8b2158e7b7365b231b06a75347d4080159359b8faf481f689caab193911d4f698391087f13d35a47502f6bdd9943f438515f3112a769a1a79b0c68d6d855ffc79494300ad0dc1c09ef557c3d0f1334967e5e77180341f38d4e4ba615260a772a313ff2adb4e0f5a17b434f70f94244e3cd135328dd1d508e40c8f21b5c51aca77d577097e9ed52889c384e1dcde762f962ee8c8ceffa2ebe18c0210ea1cce95fa51811c826a7fe13da347dc031195f2f55397b07eecd8343a91727f8c06589018841207620801902548caee8add568e7c4873638adda391c18a2141da93dbc36def038cafa5c2b537ad90cc0706d28ba4d49fc3b12bacb5f3f04257e4796c56beda0961c507b19f555148bd64b2145504741fa8eed47f6a27f87b496e37326b726c7d7b29024941119581ca1df49d207b0b2648cd922c53c1aec79fec5dea56ac234662faf5ac8801e9ca6fe5eb6d6133b2b3683116bc7cee48212e10d2ff92d5ffe0cdf2b801448644a2426f9d547de9e3707fb7fd619b98a0b1751145c80b03b0bb7226954214a9edf704c55f7acb408775164f06ccbb253de9b3a3ce83d4d1039f9457990188a3e3fb2ce3734e2ba69f9d73bc1c3ebed15c48d3de128751b9d7762a7e89a1179642476f3c88311ddfbf951f568bb663db5cd48671afb0312ddda3e9c15cdf888d9ea199e875f4d9cc6ad86c9c4def9a1f8383ed9f06ab166202869f3ff878ab05b1acc7943a54595541d17f3f8c597b5cef97b5d1c840da57009a65bc0502542c3da3b428ee5aff55f404549346da59737d8b1d520917bf4efdbd6d91c5686456eab2b29d4289dcb9a54f8f036ddd9daa1c634bd959b79a6c6195cbaebed4f12b430868977d3d011cc07055f9f47882f96ff222dfddfbd7daa12758b1653540c0e29c821fa3cf83368f11eeb7e35bc9ddc4cf7574a6b483a9a192e5b9ee7a6422706f1d9a8352564f87f14a48f8b7431de41c296c1699f7586e649feb62b350288f1dd4ad3c4584e84723380863a7e4a3c463b56a49965b0db0a5a550efb9c648a30d", "ac", 1, -941057562, "26871f674a555fec36c2b4641b631133a3f016de0fef311e7086bf5e838fb2f8"], - ["4384790001f5562fdb01eb3fff3ab35a1e98837b88146545bc3da58a442aefaa027c19061d0300000004006a5300dd28d60204ef375905000000000465516a51d216650200000000066565ac00006aea486b020000000003525265984eed02000000000763ab536565ac520000000003000000000000000031e60f0100000000f406dfc80ad580c7cd4dfa983829922b88807b3435e09f421b3057635cb584d565e49fb52295486c559fb19bb90d445d5ac12a031722a239712f90b03015ad38780f3afc0883415f24ea4ccb8224d99153441d99935e68db810b26fb8077dcbc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023338c787dd0d0e06120cce25b6a7fc3180a447d42075ac02850700c889d34f18fc363b88c464a0a958d5172dff796085e4799aae411277c5377a720571db3f8d435ce5c1d89d6ceb6ccfd07382a1a0d01adc3b44b876a6a6e66064507e096ba220f1842dffcfb35defc83727d30c24373f6f0540513c55e2e26e03cc229245b0319bfc59dfff2a2e89792b6db83675bd9197f4cbc353470c454d3c4c5371d8351021dd87004aaf5fb94d2bfd5aa18e61c6e9243ded34f21a6302d278dcf363133780b0cde4b6a2ad5e3e25c5b7772cda63634937bb493715820a59be21bd7068079200206818ba1e36537ced6f29c9cac7484d11f77c3ca37edc7b62347f04b9d7f000226fdbb9b0394af9cdf77f737f71cfb40121ea388fcf6b9dd7d751757e6a34968021dc3e74356dd0d749b3f6c319c3cfea46fd093935546053653237408097b2daf030d9ab64172fc5bf54a69b4cf67b0b8f5d1b0601f3bf7ed205f6fc475ca03f2f30326bacc0fb7516268028b4a8cc931da97c8c23b4b918c1dffd22b0893bd673c22021371109fe735d3efdfcd6fa6a2886b78dd067a288c16278bac39ffc5fbbdfd02e3bd8d8e475d37eab11f876b1748bec1fd3667eafaf7acb64a8bd2e155781a3af9f6c0a75deaf5c1871a44c857db0b7a07b0282dc33857ab0fc2559fc09574e2429a2f0ebee66b46ddb1956cce56bc9a1307dc6936383774e0ff8f80acb4ff4473284af79b1605bc0394e8b1bcc65baf584208c40ddfe5e700c508bc2c77a727ced4204f047f68dc339b7185c60d1fefc6030a83882958b628f8e61b6a78d8406ab3ede152a8d1a16a1a0a6819c9cefcbc5932f74ba2ec5bebcdf54276567b4c7870e6c261bf32834e753356bcfdfc5fcb9e080915c04a10983ed0f047bc89f635d6418fa645c5b8f1dc5a6e4dcef00372e0e2c3ad627f2fae0643f049bee8bb0f2e0eb1d9e87f70c4db1e6fefc55a9faa4e9e9746c4c4a7c986b29f43397466103da0cdd307faa82607d64d0289b08443e115a919190e66b518a7c110cef1f9684841befa3d2cb24d04a5b1987991ea1907de0f616c3312ba3674f2568144a3735dbdf451abd885cf5331803e1020f8ec7bbec524ed1b70625cd87ceb5cbec9a04b58d157e57c32eafaa413aefd3ee45e28cd519caf091e38910d3bc08e47b43bb22e0823fe32c3045281c88da961d8e8ab1a1c7513c80795ac484dbb872ab0fa43e572b9013d1adc81416d957897b4a428cc0b553df149742214e03261de276103d9496950e4a5a3103a7624d2aff9c8c8fa27efde90c869e4df2ebcaaf490d2ac3054f1ec0056e8012da7a0d915c70f5af1a430d3421b94c4fe6bccb26d1b89ba32e989c696cb69980eaa90bbe3ed4ee6b2b5d39037b6d452268ee504bb28648fa9fd55abc6c9814b9a3c54aab67563f66b253000ce1b82ef1ad9f085dde2dae8af653cb2db87ee351cf88d78824fa668e590286f55c93b50bb03d0e87e6a384a33154801472b1afa9d86643c1a36cbc028d5a5ee391266bc29408120eb30ce51bf193d727bf9f12f1e7955fadffb2baf5c197c35be52b2a179288f20fae433356625123750ed15c08315df70b31a22eb1743909d8759d97a944e02651aea642b0682efbf14703c7df0aead58678f5e1bcf1d24582cbbde8e462ac2aa8c4806f6286be744c69d16fd718b0268c9acdb5ec5faeb273c03186dd8e272e35a6bfe377b184339a09c84a0dc44f81b77dd32c40a2789c034e01e2b0b2cebf66a02741515f2a2f323b6d1258119337cb44e26d93ed6d38c4c4094e57e37cd57ac138ff3dfb85dd180a317a107333e6454b07d2b2de26d32e5c18ed2dae6393fcdee7d17a18f7dbcfef317be650bbd3fee34c53ba827f6f7c5ebe1a14edbe41b968ae16dc60f4d12961facee91f100876b4a690fd64f250d633b8af8d62e38a8875965c04e31de21d9c40fda23da4b859cc90e0f56d54441743ab4e0ccef7915df569af50306e3bf6637d505618b513b289dcfb2ce13cc28f7a2b024f0a093608f2c64c09066424fd7780745aef4e84a7cdcee263cf27d77ad7a153a004915bddc6596a1a024a1132557718fef9cd72bd92e6e4cde2187c357e906c649f032b218a7a0cfe4ba27d908835829461b8fc23c75b7c2508802494dd5192f88005a76958ee675d758a444779f70e2f6310ad51dc79f2897a430002df37a6a2281e2c5af79035d7f1a6c596e1c49b604deda44ce70a81be2e73fe4e56640762143ca011cd042257aa6e5a08392505c742d972f0686bc943b7fe404000000000000000000000000786ac66066bf1e01e71fc83bb1b2117d5dda142e509ca517b631f9e15d5c97d9b83e45b12e6cd1c3e97de311be40d8810311e5c2cea6481fd9923e15996940138b6100cad0757a6b2b7a44e6f31a8c0f31418f2ba3e12e2bb7f860d78bf122a700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f2459fe73efba355eac24fe9a393d5224641799ecfedde15c8b8db6db5ff44b1ea52fa150d73dfb1b5587cfae4ca644087998fc42b2733cae776c9c44ba3a267b1b0e5d7ea3a91d7a0c1984018f3479ec5fee96a9fdb3cf5a5ef7eeda754d3e491adf2f24b5f0c38c8a8ae4100da27156984f12141365366a2242556177ccae202112576da80054eb52560d837dd2869f5da6f224420991d1dc402ae522fec95b9022d75568cc9b1e7f762cec4c173cc2456f8b45b1b08c2ace058b2c9c7188194e40b0104f0353c8133253d21b51a8dfae97b1f27a7bbe1132b2731103683d204a7172ad9f04cad8cb6b25311a428597f39144687b7e202fa6ede5ae968772588e75d022ab725479d6c46961f28ebf7cb48c5e3adb7761670ee711672cef214eefe4d1f03163438c334e5d014c606f49f740c12e0d2b631bf745e12b48cc324f3a9cc4e4102129275a0a9fafbdb223667aa7bdb49825051ab0018a3e09b3421a620b9982212022de7d9b239189990cad2ec85ffb244dd42d0c7d96eb0ff57265ad7fd27ccca2702163e1352d486eee55ccc18187d8dc819cb4f1512d6c4802ddea01cc600d43e94c6c6d7d68b577c77cbf17537f040541e517559ca79f82699c755e24cc965a2029275ba27d76a9ba588bfd9f00026cea0eb955314c38d24a6d583acc30518bb2c7ee74b8d762f6c6508bf163a628a4bda8fa947b3413a8b4775c9e5ec9f5658074d9f9f8e1b96f15084e172a71f558684bf3f97e3e5b6ad029a03ca25f76497624a77f372c23de89915773be639389b2a688a36e59438f9a6bbd4eb15f6ea7480e7cb26a0c3733c8324b7ac89b39ca58be9a5a2d09b89e063df97419ddb42f01dd13422d4fbbe6f93dab73907120c3f84c1adbca36ef54e2e511a0d3087bdb3b1b856727281da6480fa40fe2096e9a2c8c61dc2c674d90ac3eae798ae670dce45f5cb9d6aa8a63224c02d8a36cec56e9bdb122fbf5ddeb988b4023f1e0c84791f13736f1a566d146fcf7bcc367ab662c58d9b713b0de35c05fa939d84f17446133dbff922ab7602b927a7d4b721ab5d893f2e720a582a26e597173c0ec3e9f023f8f7396caeb35053ac15ade6c753d7554652f20f515015d3a8b9e70244aa2ce7d901155893a0fcdfbbc78bd38488fe30987ed6ab880f993e85679d81716426172d38e2659b422338510485cec37373a03f0fda92788fab9fc32ee20f5ffc17c53ea19b8f9c6634c5890689e2c93dc9cb8c2df73c27e34f45e0bd6ccad43deaebfb8727f0eebadb837b625ba092dcb1f69316686964235e52463a43bfab116f5b8476e8c826dbb4edc02673dfd97f7b89a1d1abee42c9fc9ef1117a7e9ec22049616a3bae6ae06d28086f174ad10fae70d99787bb503703dbab0e1cf93beecf99897a70e41bcb26354bb6f6bdb56f9e4ce55639ad961c13cfeefe9a5dc253722122e89eb85e57b75ff8f5a9e9aedc7b43b039239a42915fb9873040676289a90deb9524bcffb3e0ece801e937fbd1703a24c22b69f43095a1bf06978228bb613951f6d3461b5ba63c984bbdf3487c8dd430f39e6fb849e13d1153c090c58471482c5e57ef844024fcd0e932e1c6d3a559c829faab36d590551383def8a98083cdefc65bdde0d492e60f9bd88564ad7619f79a7faea7045a340c17404a864eec44a69dfa693e9189e0e09ea071de355f24e5c6c989de46215aa9c7adf1c5f008f43de8232194df2ff7f31c19cdffbe3d4e15fd40ada7b88703f1c9371271d780f4965c05215996f5aa23adf5212350d6b30aac35cded0ab7907efbacd2a6adb30dfe4ba44b331dd767365b654980929c48ff57d7d27b3ad93c8e4201e29e2531ca9aa22eb173fd5ffbf80638e32749e30f074eace7d51dcf3d9f8b6f50c4cf1c057fbc816b70932ea097064a998e9ef09a36d7a1614ec722c51b727e55bf1bc0c072b5132e9c0b5b14a080aff97a25115fef9f46cb2f1cf6ae6ed6d156acc961f8708879e475f6c915d842aef14e9799f5d0c4227ecb3363e039108342023e235c65225f4909a35ff29600888d3ca3aa74d6df9d3f0a2e026c428bcfa8e087405d91fadd5f08bd5228066153d47f6afb91582fbe75785541e93ea1c9374778c781f741acc0a76c906ee2b5e615c0520175a67302116747033b98e66c4cacd98aef3954abcc55d628bdfca5b43b317e447f599fae07dcf76608c8948f3a8762f3dbe5777ff65df025a486dca66bf8ffa6d7bee405fbcec684c15813cd483b51988ea4d2e1e919199c441964a8bfc47320d14a3d3d87130500000000000000000000000053dad622af7576d00907ad969b63b1bb5040c14d4dfeedb2ba37b7c39ce458fbf1dbfa37df21a50e953871f07224ed37fe03251354c31d8f07d2110783427c7755cbb62212bad8ba6f121f5f94302050137b23cb9aa7fca9826ad473ad99e82d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a1e2411bd703b1b6a31dd4dee9d41c18a5a8d5b329f4e88fca9bb03af65ffdf3444e3f97f9e67c35d0709b3761ca822f3c60f97cca74025370cde2a28f57737a9f12774cfa8fe3bd5d2aea4920feaa646c202a69e265becb260979a5e718cc1b14c6cd8a7bfe522586ddd0acb60497903d81f8e716d30d64b61dac84b99426f022a40a892a21dcbff64bcf4f8c3b50c5f59aafe70999e926e5052a4ef2bc73277032479eca488d960b1bd127cf9cabf59b3ab5a3d18b77f4ebd8101de1e0e43661a0a0ce45a518c846d7f20dae93f938cae4e7eac9385873511c265a16ee49dee614c06444d4bcb2a3ef186e690a70ec1b226321673954ad629583a9374c6fda2347103128f7d6bf6347b2ac12ba70caa9c73bf05768f50d379f89fd9877f45cc81e90702291f0c3ba75c9801cdec05dbfc0c322a4b090650eb4e7555d4f416744a70c0a7020ce6062e161ae075e62d5edfcde4f3ea9ea0a59ef9ea0f01a046b78c333a1ba1022fdc73329259a4877172d8a246808938911c98937c2ce17e5718170e29625a7e02186fd9391ba0a1cfcc5cc3f9082a0a12f22813cd316ff0a7b3bde27dbe5c652b98857d05b65adce84900e292e62388542f1136fb9b11c6a3948d7019a95513012f688c2e4757d6b906689ab14a125b6473fd64fd5088fa57e12ecac8cfa14aa7b6745569df3272c812fbd2dd12c3acfe9b9c42177132087613ce8441c9bbe804afc25744f12d30857e2bb26da15f944151fac959e863ebd4c9a16698aa0f0718fc00b50c589eb56b65c028de6ffe7e393e705e9a248fd954863e3bf4550bc99d157e805d2e1d54a5b177fe6b430d2abb32c662013a10f1ce799ffc963b7dbe38a993cdce4b49edcbaf975df0ea755ca6134724900749802033f9179504effecf5342b421ae85e2b4376b1d41ca011de5190b27b79099aa3e3c2c9a799a01e9edbefd1145b3d5d0cd2e0390d9e6d4863346d6f66b04465f7fa1c9bf414d4d9a0df780c801aa1a6560714eadf342a7f08db210cfff5467cb2fc0f0df3393550068f537ff5447eae7988067aee1c4c98a35eeafc9bcc6b0d5d7243d74f61509974b34ba4ed47ebaf53a8ebe4015d70634f65afd75aec95192a2ff1f3d68987c86659b91e937efff58f40badbf2cd293e75ba21085fca99acd78785c456789e9ae37bfa888d4cf5707b292c2d453e5c0152ff9c0973f4ad3306a963142be64ef0554e4a447ed9ce19ebf849eae2c1d1db4fdf7387e74541ab61759610995e1dde6e59f4d8815456deb5a4a56dd226867de4666a9d9e37e944c50cae995c4ffd31ab9ebf6d7a86d4850c19596a7773a88463c1d43424e54b3e57bcabffece95b4938cf33fb06f8f5a1a3556d2536d2c526ba3a407170fe5e2df44193365722884263a7a3a90e3d557378a16d1cb5bf4edc4b09657e41030827c96cd518cc0ebd5ad13a4419a15baabfc21e2b764cff1552bddd36fbf61bd8033dfd70073326bcf2a1e49060403f9aadf77b3bd59a041ebf9662fa5e1bba70b3cdae08ab97895d0a23bcb11163bd2beff8ead5cfcc4f05ac0c221efc8be662ad16f907cf896c64caca1ed265d6ec09dda36034e38ccffd1d29785b42c707fd1b10b31abd888a1c042542ecaf4e139bf38eb869295725bf3a7c30aa7d90211c3686ff3fe06bbbc7d05532da3e2bb55cd7926c06ae6cb8e6a3a5d92ec0e70121964b3c418efc25e681ec5ea0fe7b5bd02acff3316aa109b7d92dabbaba05cece217b71e0fd576723927fa3fac59bc68c8adf4b817a96578fa083e61d1ada3db9bf93ac25b5486d2ba24a8f6d16dca059ad18f68c2ad05e48d3d74749fd458f02f2af8feffc7e73ef6c04a74379b3c2867497e21466c8ef08697d9c5b4f1c59647d310cadd8d6b22598e8f313a3e1c78dbc55590b0fa33500fb4ca7c06614a615a34c18a1d6eb76b534947cfdce82a73b10a4480fba1bccded4324f191a9cbbaac2f2df877685cb39a7aa86add7a5ec451f3a973988b6755ac580c642ca38cb0424ff2187e3b00b3836a12529496468e36f30c5f44e0d4e42a84f67317025138e9cdc40f1a9a1bec50d20d8b304bfb024e375752a22a0c51d208034a4b541b289c2015298147c96ebbd34354851e6a2e2a812747b3ca0d4789690d2ad13487c6c4277de65d872fcba58646d4b75640b8940aa642f9d77a80e1d60e7020af6de68329b8f6599bd1a71ba518996d5e036a79fe3d609eade5b85444c53a3cacfa2cfde1772ddc5aae035375d26a459e1d74697855055840965672fcaf126f8462dfbc2b2d32a76649f0219a8e6613117cab1931131bb76ab517a55255b66207c60554017b7626315d28e4ad843f8914e1d9afb1e3bdd69381949975f3c3461e7abf28104bc26b423c9dddeb32b9bc808071dec590449db4b877eeacbf4204", "6553535363", 0, -1507154841, "0d7d9d163b83010bd7e82cb154af0aaa63ae35b472e6567086dd9ae49d608860"], - ["1cb311e5047a5625e2da9147245b52634d20d0b8d21bab797289b8aaef5d3c0ba2a628af1502000000070051ac65636aabffffffff7b513e1e92edf8b8e5f776b845aa1a5745f113f87d7c4acf2e1342e6150493a203000000026a5201115cb0088bd443beeca6931df2c269a87679b5054daff72e3aebb8605adda306aa0a2a03000000026552f10ca9ebcb16268af101bb686875452127fbca63bf625e93c4f37875bb479efdf66c78d00100000008536a51526363ababe96d24c8047080eb01000000000253636c723c0200000000009f9c0f04000000000951515351ab00abab52098a5a01000000000651ac00656aac00000000", "0065ac656a5353", 0, -1533137217, "274c7ce6beaf089bebe36c0fe30e8811220355eec7da101d2e56b42a7c65fc78"], - ["a76f7d83022402bda653adc5c38985e8094e0aa9346a741cb421043c4e49689ec019e9e3530300000006520051516563dbe0f3c21616e05c0d56139c9211f045e180a1132bcd3d39ee70b806489654c537e3181900000000036a5365ffffffff021583fc010000000007535351ac650053713ec7010000000004005253ab0d657db8", "5163", 0, 962319507, "d0b4e917270c5b7dfe356dd7475733ca31bc07631c48b55a117755e57b162fb8"], - ["d56f8d3601774412e534f06fa24b8b9ffd01c6290d3c2b3407ed051f8f9c9e815d8276e3b9010000000165ffffffff01e92652040000000008ac5363536a52006383d49a8102240a090100000000000000000000000066ca4d44de2ee1bdc95b335420997333912d01856459818d9650b06231f4de4173dce3beca5445d4425a28e5b7698b1cc93d9238b700fed61b173ba6cdedff3a2c988826c9edfb33e4c6ea5d375ea149808fac6e17f9686656ba2d75b0adc61100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000895c353d7313751376f368cc743abf1936c29010e740848bf37d3931e22237a7f544f15ed547f7c5b0185f33c589c9ac9cd7c3f1a44fbcfcc68ac96e02bfc17244c624b0a33de554564d86e04fa56757117f21cd65b28109bf0b8923b7d94e56fd170cd3bad114a7ff844b3aa9b23a9dfde7d8a03a753d3d6ce598b528d67267031da884755dd064c78bc6cc96d6e8e4c60c28bdffc2a915fbef42ec6579c474a0022c047fb49144eee159a87f4b8fac2140cd1eb96910140e588505441253387a440a23c56081df7f470bbfaa5f6e038cd2d3cd0e20cd8a0b336e7d6d375c0ab5f7f627377e6bda8e106156c37925817d4030f8bdd0cef87e3c97d2b4c52c07565e94022ab91cb24adefb3adf90bd2ea25d66fccd32b895f641cfb0423045e23d40c23903248aa50fd29e1baad51961d32168e72b5fa94ce002ac367c7aefb82c23a8d93403230c95c440f850f5b3f58c3e083073cf54992cf90641e27f75c2e72f7236cf94031e3ee062b6a81a64f8a49ed23502d20a980fe081b8fa8fb96c532e762bd5d857030c6acb5d6ccb16938d1830e2902fa44584bddd1a75c18534948bc87d9e6ae23fb477c4ec55ef21317aa8dc6ad1d70c98f14b00a91317b8a7a6c6b50ed8130ccb6e2127d0a45dab00815454fe11fd9d0adf06c924ac229eb4fd41765f03028133a18a5578eecf1dbe1c50b7de021b3f8285af17738995ba3a3461f44e220f1cd09aef2997b810845f76b5de54b00fa48e4a98f02a0eb5625030775bae352d7d8e456acaf7b8dc829df5beff8a31c1921a2396a288b3536ab265f781948a63147a5f26be895602e4f5f225cc980ce1194c5a02512106b51c8cca0e84ba63caaa7238a2fa0d9077196c7f1a46e34de0cdf680280ef126c01e2a729212695613b95270ad52f2bf902b32a75cce2b1a94d5f5f604a230a1a0ee384df54c35a4a2c8754dacc5b12d1e884997c87c38e10db2c8e72cc0e90e618b6b749e3dbe592a4412153cadf179171ead24dce08e9b5e4195b5f05f411ac8f3db98c60a07e41de2604e61c846811510c8d0587baccfc0334603587a0f61b2bed50ee23477d20b1dc285ce35f49ace3513af2a184636435bf81468e17f6866717feb085a42e840e67e5279087faf344def3aa82f32080dfdda8fc777b2b36aaf5e81949bbe1108dfaf2ed2c4965445cc5df8814aecac8fecc35c2d3a1f70bb9ff31ede8aa2f12cd38504b24b23ea4e0472be6697f8d0b768a1b53a5dad220292bb2bcef0174965825f27eeeea8238533e92cd03d19e8d4f888cc6f445eea839f5672c6ac76b7958eee4f3877ccc9f4a67717aeabb18ca3e7a650fa8aa6480a8cb861922f77f1b9ed8ea940d1fd68d49d9c0064fd75771a0ead8fa1be4c1db13abd501f07ae0565fa65c95905d7edca9bd101ada53d855818cb37d7b415aafa4531d5f8305ec1ebb47c50c86f700704c2d90a8444f3b6d240949cc8dd4f2b97836b4a82e2504c9d71562f01cb75529c3dc7f6c248689bbbf9f4f24ccae87f45b39034bad4de0ea3047382649870d8e0f915d9f5b4e1ab6baeca7187707afa6adb04420a3e3478889f1bec57ebbe8a6ad860a6ede2aa942b4f5df1129b73c81e96b17f484c93835ed3d4a488b13d3b27a65d5f187b983f7490431a6199c5e8abfdbb7c14048d28ce63a3d9c1cee3e625a08b8bff9b1d5df6f7c3e2c60d6d5a2757eee6caf05c96870ee1b609388f2160894facf165ca65af2523a9128e6d1d42d6822b1ca0128ef10c513848d84df10515074e932a7cb9059bacc91ddc66c84b9c84aecb7863bc01ab86699127e72d615d52fe13b26142295e024e5a93be2fc847d5d6f92b24dfcc96af2c3fc92cd01f3379325e06f7cae0bfcf8086473353fcf657d0c071a9aee9e9e3b9a131645e1c439d0d6e9a6c5648c097145888f2b92e9f2ccaff420e6370e8815a7f78dc8fd6720d8550a938faa954eac2712a0760abcae6a3add93af1e1f44b5f2fb54962afb39e2a9b65aed7af11487815b16d8638c9e10bc42a8fd8dbe98cfe86ffbecb959c57615281f6d67bbe2f8680f0c504fe5c26d2c064cb0b5590ba75ac8f710dbd7d7c6efb87ceb5d9a3e8daca4eea117003c5bedb6867bcca2d06e170adaaeaf2df7c744fa8c17d707cada10da9eca1d79d0fd90bdd32b89952ee7992fa245a553658add8f462c69d7819d3e98a1541408c2305f1a28c613acce628e57e9ddd079a5638d40f034272b401baff84579e4db6f42f43c0093a91dd3ee3a3709395d87e571817b8eb725de39ace2a0000000000000000c280da0200000000462d935c1b7032a04f09cece0fdf082523ec095050108e936398ca77e62267a9d1f02b83d2912ee2335796ba509b0ac34d434316a351d59e72b2b2d223366b0da4d301095db6629fbd4c6593a54310237fc93210d3f7fc5061efae7657205bf500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bd38c10a581a2d916ffc2623ae6e36f96c80590ce3859edef89702154bdbf877897685240cb018c8784b7f221aa7e25825d1a0427ce25e47558212a436b9a57ebeafc2fae3f4ee520ade8e2630d334ecb0dc9ce20b29136d813122fb91bcc9a1eebed83a48626c863f87ea23c117c64f4c8c0b4d7eaa3015bf8b3b7dce0addb20327446d624f686869bbc7ec3f61106c884861d3b84082860d23cace9af9ece24c03064d014044cbf62a8e44daf60f0f9a71e275dd580a7fd04dfe3e4cb516bdac4a0b27e74dfc66f211c09ed7a7acb79b67dd12dfc929ccf56556a0f0ef5dbc11e287049a0e635565af59cc9b66834bdb6094ace75c172c2216a32a74df40c2e9b55e032fd842b756da797a4839428f0d2b77eee6d37841e0b20a612348e6bb0f7ede2b02073910b7a4615297beaae6fe7408f72085b40d5c3a227ba60f4acd490c842030020080066d76a0c29d5b3bac1dfbc468667deef0558f02547a88fcc624ae7c11ce0201c90971ee0f3cec8a59fdf619d252e83ed0b98d91ec6a0ba0097d36425121cf03100c99a14847ae04059909aa08efeef66118df68a90b3099fb6e6d3caed1e43c21908a48859ed018d2bc5fe1666d00cc0d6430e4661525fd6437308171f2b7b85635bc7fd0ad186e4cfa034d2de329d41ee8a8349dd04deb34b76bfdaca035b8d173efd4e4add5d1fa3069a21fd7bc3b589f949cd436be6addb3c23019e6d831ec45638e2292d5bea41395f7e3f0de4937b27b8b6f8c6b670afb13e2dbb05eaa12fd93bd161bb6296c5d7194a83f3ac3ca76cae229caf7765a767c6fc6f09d3518840ec5be739f4b17a1d2345cf927fb67d23865f00975c9868b24c1877bdc3e9bd371c8191090a9e0433ec0712a8815863ba4b1518bfa196a436ea8d164b887384cc7784db7229aabf18111066e6f680fd83a74b69c853a0e2c20552870130093b0e06730614a9e9397c9cac16e36daf7b3107e34520981d01bf197cdf26b2056711c4d5b56724d3db98b9c7138c2481b134239cd54d42ae5094e25174e224dfb2cc4355581770316f4a9db417683b7f4f31cd5f49dba7f93bf0a3fe62b85de23de21f439ac7769248cd9929cadf6b705f36eb4d537230869728cfc109f5df7e839e36682c1a4cae9472657dbf900038279a2bf616cdd93fbb03c15b29f44e806b4427e2bd35d2e4202ef2b1339dcef0a369e05f3f5dc89d110181319ae54b4b4798554452bfd6bc3ac2b91f4de92efbf535f5ca223e8940008c8b35376b8a02e18799cb6b00964cda27e5c699f2642b6cfd588df943de99abefdb702d2c44a2fd0df2f093cfe89c30ad77a4b4508ca794207949068bb96a79bfb8100372e26e16fa6b397e0cb8c91974734a9646b515b892d5fe725032b4ea614563e59d8b1abcb97650feed6b41b55765cabad4397f8f3ff51f5e2f0456c430e324e1697d4d287d1b2656480e0f404e0512f18449b170925f5fa95fd5f51dc8a88f2b598e6d46cf12c74050ae942c2a2c0f831590c458ff30807d497ece2ed0eb4ce2d68b2947f1029e692089aee44024711b51378cc2635f1929dfa41a1b8dcbc8406fb559af1acd2a52eee96fac53a6a32a25e327a0b32b49577ffa08b5a1715bd2ff126b4c8c9f2e6763883a6c541e200af43593d486c646d21d67a0836b72a24ba402d9d4f7a5285005b7dd9228ff5f333545eb65f23caca641bea1fde914477c4c602f21b9aad9e9dbb0f8ff4ba3e1e2ca0667fff5f706b508a3e6a7fd5540baddcd7dcf904b744d87de60fa4f56fddb702fdbfb45ffee6090bbb23ae6da4b2d518b4c1888d5f42ce13484184e31f79414e3d232ef429d52615a0f50bab4252c97a5248b3761b9cf5e8f2dd16d732166d168d8cac11d3b5634b2ce52f7b1278d24713770953e2988dda6435c1bd3913cfdaea8404176738ed111b8ff41c12afd2fe7172759948b1b67782c837763b81eebe297d4e74db72603af0cbde50984f4aac26df214119f964dd8599d9e75b9b56dce2077eaf0b9d63355d4ac24bca1f2b6899da15266eafff492ee0247e06876a729550ddf1dff7c39adad548add69da80d6c584fa8a8918348f5030b56bf31c6ce88f555392e327e8b1c1d847f57388c1fc9de02170447ded4b1ed6d21f07c18ff38045dff82b426c7ee894629dc2365f9a8dba37d4341225c67a750c746615497650f048de89c07b1422910607d3aa9599c354a1ed35a40af07d8829a87e3ab254af724dbdcf49bd00d579fb22a5a28478883c3c5e62075ddc6fec307f8f1ffefc4354282894dffc73c1b47265dab7a860a296a4849cc6bcd21ce02cd6822e8495cef7241e3731744c7e8605d53d387d0a91e3e1baf99ff3fc6de8f045983011dad0fd28a87587c71646d024d3c76fc1e3521ec6f6572d674819e30e29f1c804c85ab0c", "00", 0, -189858871, "31302b0b5bf82d67fa0bc55dfba2b0212d1653f1b770d2af757be6fbb320012e"], - ["ba854ed102e09b9dd6135120c4c23c1445579c344491c16c375368da910f4fa936ac795d1b0300000000af79ff6b2b18f0f81a764666eb9a36b178d1176b5b1a72cdb9c5d15f57ef37e52a2283e60000000008ab00ac6300636a531f433c1c03dfdd04020000000004006563519310df010000000004ac51526351a9140200000000075200ac516a6a5200000000", "53ac53", 0, -246097963, "432f48bd7288c5fcf8084474c909ec7d03c870adc68fa215d82cd8e15d01bcc7"], - ["1844eb77044a356885d20df7d397b1daf22acb88612db507ce0874c5a7a646e243ca96e52300000000086551006a51ac5252ffffffff7799b64c6b10cc6a44ccde733895b8ab90ea25f4ad7de40cb327739e245567790100000007656a6a525300abd883acbd8b944e4717076fe8f584f310b7c56cae467d4daf345a6472d755069f8f36d2e2030000000253abfc40b8223a41eb2100bdd108d11723cf1481f95812c5401c75d975d8191b2c639abc980400000000086552ab00ab65ac53ffffffff02b5f299000000000003005353f79c320300000000086a00656a63abac5300000000016b15490100000000000000000000000064e674a2b26ed87cde7569a56aad8dde4ff4bcc6bc9676664b4abbb582408f66ffd8f64bc0ac82afeb8066b22601be915f045925c9b41445561667385c2841edb2bf690a57552739d7b92901e5f1cb5fa4b66c8e9a862611a30dcedb2bc85eb100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000623583f9c245ae79a99bf38086d1d9d2545530b76a2ad2243cbe39a8f41bc291a985b3faae604523cb14c67546c16f9f470bdec10c8ac17828ddadeaf1fb05f79001e43a4b2ff36260e8232170015cb748e7d93789d94cffc1ebc0df57f0428fc9cf3a7362e2ac2fd7a245d09182fa5a2762397e4811e1ccf85f16b0ff983e70022110c45da1334755c6845fba465c8a42465377edceb3363e8e39f74c3ff60f240325d939b881de83c9fbf96444e845b20ac31e8dd74f87bbcc1337ba3b77a500560a2d5ae4abdfcc5390878e72545e94541a10d86098d9c76b77cb390730762c65a90c8d55e70ab3aec5738e5861f15186b9bb98062762f8b5433886da56390b4b4802272e64f893630cec45b6b46e74591571b21e67471aed2c3c86642fda855c0338032204cc747984319cd6e61c2a84747709ea862c7dc71c7b9d7cc937ed6c223cdd032719742cf7892d372b33a2e541e1bc581102c863050326d8be8628fad5ea3d5b0328a7cfe1e1d7d23388d34d88984f8cc16eb410a2df2a65edcf0306ffa0266f5b0212146c3eb1ca53077c28d7ac23ec1413eb1b5c39496a17d6c217d0bf467bcfafb84e3052fb2f41b09def5c06c5d313aa9db9facfed8bb76e4c9c9b7bbf71584709f2220ae1f8d4edbd1f046ef2d05d586a2a795d9586ebea37013542dcb6ea077a6291c5c3e02d64782bc5b2d6c88ee21f23aeb197409f86eac81209e65ad00066974534b23b8da8f8ba3277c4821cc6df2eb769b449bbad6a1d8c67edac6cce8927518fe6f4b2494c4a8deebb744992af16947a086b1cd03520485effe4bbe5d30bc114e841740bd92118ed98a419c050b1e6911030911e1200fb277d76c283f032070f5d205cae1f96ef0cedea8124b95288d13c71e65852374c9098c3154086f0ced0fc72b30914ac849f171a20201e65bbfda64bdcd7f5e3a4bc4d061002ec716458b49643a4ad9161acefff0e4c9ecb8da70bd80ede51259c70da3a290e4b74795ac609913ac8766ca40aa7344375e288eb270793d0a544fd1817aa5c3e0f89d2ff558e5251a2c3f83d6a3bddf64023be8969de0d23441fa4e3a10a4f34947abc5ddb4c22d22dafee4eaf59620b3d3d2b892e20318a4729ec6e9904b5d7c0f7a6a10950643fcde9dea4e790f585d6c8143f56401468418fef78af88b60a3a13d1288b0c7214e2ff04f136df3d5452010d2af16e32156f41b7b1f48f719d4992db8f2c18c7d34c6c828da2dc0c2dfe08957a931005741b2b95c5bbfaf1d0100b2e735b96c9fc33d5d878b6a26fcfc621a62a73bca43b1352480e611e26813ba6b1fb074b07d8fdf8c17d9445b226625d19fbf8d2ee348c43cd58f782fb6a02d3f87ab816db6ffd5dd0d687c14c3307b6a9b792386be0e7f9cbad14f1bfda7e97394861d523caca4f08b85650dbffafc2178a517ba27ab599f77defb07a21858aeb0143c169abe80cdf24fece0b917c55185048fe83f1cc8e5312fbbd0633589340123d3901dec87400c88d118c01414c2098f4be8c47a1a1b01656f768e26a6a144f07b107c9b2f33480053991c675a95475077c0d26f2cd602c84bf23cb86f05538b6cd3af77a706bd9c680a289978297e4322e9ceb76388a0a37fe2cfc250e3ca667fbf91208254ff60f6c5a6ec718521eadb74361dd4b9d9585cc02ea5670fa80aebd94d3d9aea06429d8301cb70ca89d5a828c9c9cb194e24b6e270d8f5b61c5e6206680f6044c13f1ce81018aaefdb08e2ba2cee4f233c2c6652e9b1894930c06693c45fec9a5543b1a702ff37df7436a03cd592f8ee1bd98d5a8e9e51c071b195ae308b73ac377fcc85b91cef3ae84b6b958b005e76bc8616fc9d53d0a9c3be697a09208b9653c72120c2faeb3624799c8576eeed1593d9ffeccf248448f1f26fa696ab3051a0c49ecf5399f38fb30e04ebedcfb4e0e4f022696d8a53e1d742b9cc36f9070d71c4ea28c5cfe45229491c0bf138c3fe5c605d9d1e7b6e7c29b45103e87375f0c5c11a3168c9fba3db9c291c7d47132f1d3349fbb4762aba067df20b04c4f89f4abe0ea09420dd256cbe36c8c2c59d5c3bc77f287f4c38756b1dcab58c06a607b46ccdcfc2d3482d94c3110dcddc295411a04d75cfe0c583a6d17381d4431693379f71ffa574ab2da15d9852a861ab6731813c49fd06dd62a9fb23034554553708761136f2ca7c3a42c55d8dfe56f1633a7df1d62a4969cb16ab6d8596c03f540eca9e09837a80bbb598e8f08616b2889ef026fd8f1a5abf11cf7509647d8a79d70cde076f1a5bc7d89f4c17c6cc4ef6b79fbaa4439d8adf6d3bd31c71e13f91fac87179e0a35114d12b13dd1936bc3010d7c3d245c2cdc22315fd891f4d5672a73cf34369180d0a02d697cc3bce87d521e822e631bf92c02e11548aafef2ff6a758fa76496970f", "52ac51516a536a", 3, 939494798, "0cc1c75c55ed572b62d93d95faa69b82971f71f69f3fef35b033872ad0093594"], - ["d0c7fdd802806f7925c45fb9d42a514532fe7a16e1fd1d6b0c2ab1081a9e8f081afeafee9c01000000046a516a6370310e30d06c88af702aef9ae0b9711ed9e91d5630bdb657bf541ebb5a70662e658e10f10100000000ffffffff044fce5404000000000652635151ab6551884703000000000100daf1e404000000000800516563ac526500928407000000000008525363656aab6553d833e4fd", "5151526a5251", 0, -1112764220, "f1e168d185e3ed217c2cd57f729a5ecc427bbd7973ada07c00a65e7612159106"], - ["38fbda0203d874f265c6ee03c28a4fe8b71dfd8fb00a8f4a920541ba605063b8fda1c8f9d50300000008ac5365ac0051005338ea37825fd9ccf602aab90700a02388682124da8140039f82745a9e1eee038a5ba4b8230000000007ab6565516553ac57cac3617241d072e65f2f391c1008887739288119b104726c0b447246b4d9dde040526c0200000006536a6a00ac0088acb7f703046491050000000009536351ab52526a51aba6ded7050000000002526a88ec640400000000075300ab63516352db0aa67f020000000000000000c1c2810000000000ac55ef555246a722913c5058e92b86a23e518b6c47a9d68e422da0295c2010d7dc73370a65398c3585531fb23c940b2b41248484d5f652b7f5f2f09bc766e6773cbf48f800118d186f52a48dfa3ef8dd9f21a9565f0ad7ca82dac19eaa81025200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b9f221c2289df639cb4b7b1fc9981d35d83925aa8a0459ea766c053d8a1f6492024e6d34dea6dd6178319dc51e573869b90332201d5841c53c3f896c48b4827a3b22c14e2c2982858b1e341b1a705c74c1cb867b1dad111c5e1fdef8a003cf15f2630628b710faeba0a62defc021f649ed15281fe72c2768f77ddc0f0a5b8ade031c995a7081c1f3e819d642e81da79d972e071eaec43f19f204db62568394304e0202d14751fbe990780c63e02f837e50cd8fae7393f51a70e6df2787b091297f6a0b1ebf55acd038e56fe23c88376af938972e3aa9d83defdf6df2c9f7445663e1b40d2d8df02e5349a27c0b65b4d449955ac4c261b80735f4379e38cf1cca4919d4021fbf6929c6fda8170bc5de4f6ab529aaf4a8012ab8c01e01239d413d9463c52e0209d38e27467d469677e87459bbf42524d98ccde5389dd8d57974efad6a5cae9d0306c98690d930d1adfb4f62b812acaff6de2bfe083f394d87b157a8fb792f82260304d3a9763767e98d9a3c2464a8bba418fd2c2c884631f2f495a7c80b72ef0f080322aa40b4b7ffdde46758c4c3c1813c3049ea2863fe6ba0595a77de02ec36196d19671070010d30a0211535c70a67b525ff4f334998186a99c04f9fa9d50978d573d005d475dba359efe64831e93bb57cf6a63765f78f93d356d352761041525de032979f9aa42f2805440b1cc503bebbddd70f24017bdb49c11298effacb06d8b7c2171f6b79593102415e98ba8eae37d6db7a3a2535d4bed80107affabc694d9417b683cacca2c11dd50c08d16cfd494d420ba2df51f59e29c6380725e7e67cce117ac0527af53f9c0e85e56db0649ac7d798bfc40bc89bd034f19ae7e42af712aa1bf65469a346b1de39d3dcb58fbe7aa83afcb4e8046154b12dd5061eabcf4943d8806700557282d0bfadc49f59e92312e030b65ae9f5604d410322cd5006df7975d8166f98c36128b86d9d168e0014ec1e90d80892e88463b54710b5080a7751253c37e8cf58f77a84f24d89247d5adb3ac698ba92edd352f223c99c055f032edaac846a941ed130f51bbdd6f2249b189cc634e7379bf87076b7a95c2580b99dd13a72fde3d1691d178b0769930d948a5c9e70f977c79ecaabae7743da6a80d1a7450787871f021a7d5eac4610534ecc9883c0ed56f2581ba541a89db58bade7043338b39ad8303350d7a5bf773cf9f899c4a78a2ef4d350e4814059944867974ec64e07c2ffc5c1fdb49c5261824f6fa356b28a3f2a712a7f4d0fff047ebb4071a5fdafaf1a79cec03a3b0f9c36b2c62a82730b09b184850cb09a71ea47d4ca06dc0c6394030395e224113ed32581c253708bdc173c9a4efe26e9f8a13e397f159fd2c0c4646b77ec9bcc302f579b1db83692f6923200d8194c00233b2da4581a144b4e695f69461205941ad81f7e31b2ced2209e489f60e19c97f5e0ac01915e58a140812750265ad40ec10276cc9d8be4b50fb0334c5dcd51b81750568685748c1df8480994ba8362e40a48db34367682519e430b58fca1450142ddad64f38c1f57c4e85384b80e4a2a28d12c83534e3259953e288ed7431482262199bee33654d290c8263b7864fb5e7ac892e3bece78b07b34b4065e33233a7935668698915393e884473ac4a47628019925949118e5da91914b730f811d4c92b91e001a2e66cae7d6ce4f06e9168f400b7d4ab39b8fd2770d946ac4dfbef190aff3b59f0c5d29efaacb0371bd137c21fb4860a6ce0ab03fe003186592b17ea1c347e013ff3394e73698054a4799997822241d9bf315a18d46429a4b5ede907f3dca089a4cab5088f660e7343e41260928050656103a48ae086e1242a95907c69dc89f35cd006a4943792397df9e0d7f36298e73e7ec33564934283672946878456765142d857c5eef63918a064fb3c47df65f9f8f6c47d1b353034e7232a08f7ad6d8e2c1adfeacf1234aad85a6d501c36895c8c5c896e4b35daf59b2f5ba7d2221a3a2faad7900aee9b0795e5afcaf1146541424988a2a7bad3ad61f40050b4ee2118f8dd770a3a7f9e8e3bfe97c3841e2b1ba28aaf61c7ab0568314343fa6538ba8293d55e0482d1ed0560905d42dba69f4d834de6fdba285fcba9f521673b5e9471f093c0418813b7a95001266974147ce3e58c5210b87a75963029276a66315f59963edec6b73d79a55669d0ab9405825d8ae3ea03f47229e6adb1be51155d7ef28d565626852deb33b64b4e20ca7548b41683756136617597056c1767e652204e125d2d4a1c5e1cc46d80a086f3deb7adb0000000000000000b08b5505000000001b18d552365a7a80633bba4221a24a40084d9300e3ff1da15424fed2b0397a11cf54bd578ea86d7277f0c4b6fc17c221939610546e70986d03aefa4f9798f513d4f9fb3d837c63f6f51fea32b75a0d9100fc5bc5b8413d14aac3a9f389c9769100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cc89746a8a26bf931f023fc62be7b9dd6b23aa273ea38c85f80670b5b087a3e3e34ab0ae3b308868a7563b778e732c1e3c0401ffba29f94942b751a9bc810c667791267e85dabe8cacd9d38f74f6259dd6007233197c2f0c04910977754ead549bab2be1931c99bbc6905c50da60b615dfaad3ab6e63dfbfce8f320e84ec2778032b30f9bf009bb8b1c8416f490d2116e11211d4bb15a4044f4f249cf5db0a8dbf030339841f3785ce307b52c425c48b080000e08ac10bf25e0f3f34c1689061d87a0b002f5c482a576e5b44bb04bc4d9d9c55245c9da067b0b9c3bd762ad8c44e3eba05bbbb9db0a2b31643ef9d9c760c6a659f17455209ad839aad02005fd7d88c9f0305d21726e0748be8acbf675b3f9ee264163f41a3dee23b2562275db06442d4b7020d798832bdb98d3ba34dc39e443b1f9f50b14a33323d57be2b5764aba4af93ec030cb42d993f3fc3ca67c51cd280bb13456894730ba61437207bbe3e3c62485954020b79e548853b32b53faa92972082bad0bfe39ee6e161cf292df35e67f2cdd309021f1791a87d5f16aa19754f407e0e8c779b24d64d67f9e5c97b1ce99701aacd602b744d7d573bc4fdcd334d63b19377d2b5259766dd597bf74c37b459f7fef0b916d0114cf592626a40d7ec926625903e764e0ffc4ea91b7723c1ab58d81f4c4f2420d00e3cbd3729bda824c140d5c095050cd16963fd00f7bcd33f367192d4064def812a0deb8a26bf7e71007ea6542781ff70133fa8eec8377cc88af562ca0938455319b310c92224a7b6f8e0fb137a589a4ec0bab6580ce72b18eafbbf0f24d59db5baa462772a48d0aa62778230d6b54270f778f8968775cfb69136f8eebee62042ab2d3238cb07ada37cdd9f8c428eeb9e016e244338d7ce8ed47a461e4ba30a725609bf8234d584a7cb527e8fd0b81ea56fe8424052e77ccbb79587835c7af93be9493ae15920292b129fd086d9e0a4a73a5f8f7849a109d9f11af380c60386f434ecf40780ad3200a3b328fcec397bb9b87aa7d27eb68da7f53a83370a60dbaea07dc86e6ae6647a1f53bb93607f8ff42760b0710035d6272036cba7e789bcf7546d5d6a2781abfd95e9e6f25db92dc0dd22d3dbf0778ce4c9da294d714c268317616b2614bb297b5069eb6d9f7b1aed36cad5857a0977d7b6e1eb3209c02a257f3010db385cc698cd32e56c7b662c45528f7c2990217cee41025da8d7334e986cc4203488255e1357195375c7aae7d2a5f48db7142594dc625aa409eef34fd1b2a63fa3e57a0c6bc8e8f01717a162955be986342d1d3ed1d3ebc9a12dcbc22cb9db122b11e73c22620745dbbe1b770a40e1047b9faf8b2328b3996bd620039fc00def8711d138a6a7c45dd04a5f4ff09c80897be8bf492d0c7c67180590d333409118203a7e030c028484dff0b69b91de8eaceecc2a936aad26b2871da17b11ea670837e256169287495078e7c93c943e94b5858a564ed7af789fd3fdc6676129bb9916f2db92e9221948faedbfc547cbc9331558ee73dbdaf5f665b4262ce3257e305869288d6b394d59c95195f3aa9ab0f115d491a2aa151785aab2b039fd5147da7d765e55f594edb1293086cfa52901e7b87bd9d3f27a17e506f38ff9c8ef03e811bae5a0223d5cd818ebb99c024cb438e0d239d667da10b3841c61b2986a1359df1453caad5492f4af8f1e12fd9f15e06288fb7f5bbc0d42dbe12a07d60c0f55cfe4585496367349152a957f4e2d92b473963aac3a10e4809b1c60dc6beb64fc08eecf9cb3d5a17fa88417e34b2b58dc0df819710d410e4c329998b9d0e31b43743a730f1b381efb51dd182dc66e4f367671c4a065e0c8414a8bbd8e1050dfba44c9fcd7c3c9b52719231f35d19936c4105d60573af6c76db8e7b3f0dc58405071618a6342df9d1479a75b6b53521cf2f1f01603b63020e8018666b08e180cec60e5e88b3bc9753695cd801197e815805d9f4328b59cf03fb6089b0531104d158afeb09028fcf2c8a47bf65f08d4875df175e6c39da1c1257b8f481d439b5d6d27c997ffe969d6e921301af3d3ceb5b8221c3cbebf55ee3f48a634a108d49cf2c6255c807faf2cca1f88633539e1675a211cc171bea643e56a60a76683ae118cbe4e444ad84dca519d401793807216d4211efc9337a0a1be7012a1f52adc956a5f22a0b30f5678d75473ffcafea2ad68433bc2d0b831c2622f5252f6dbc4ccab9d9931b6d61e20769b12d4c5132749d93e4e67e0bd409f5d72b4c03c34802934fc7af23946e3f2acfbbe87edd2559c6bad08b89859a384fc2e9ecd7ba99271f83f324779aeee6b94d18477b23a9c82a25e0f92eadad30ce161d4467189e414e88bda9a1b9638d1ec168d06911781226dd41bc4babd5407c7d45a73543fd76895f85b5673b04b4dea7f2c7e0f", "00", 1, 1254601664, "2058c6775d1d75642ad4c832027972d0e8431ece85aeffb5df1c1ed8f1da08b9"], - ["ab0494810124db8b073039e4f4234282f0b6106e9272b71c204380eeadb6f14386705b0f13000000000163ffffffff04693ce60400000000016affdfb804000000000965526a516552656a53d6f85d0500000000085265515363655263cbc1460400000000076553ab52ab515100000000", "ac65", 0, -760664371, "326df314a309ce6c1282fb59fd3708ee9ee8bd4d882050cec69935b4741a7aab"], - ["f8db671e019d148a0c6150f9b948e5662ea334688b526a6d4aa502a849c10160655afc6bac0200000001ac20b7634103c605d70200000000016a8c682801000000000078e3b9040000000009636a6aac630053536500000000020000000000000000090e7f0500000000845a6132db739b9cb963d669dba367c3a3bf338e974161967c07a87b356a647bf26283f3514acff9fe5477b88266c37e116f09c9183f1a41cc2980567aac7f35130b5bc7ab0f3c93d5df13622c0ad2fde0b6cdfd484a4958fea372b8d35409dc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b042efebdaea17572004c4946c1cfa1e6aba58fa2fd4bce0edec9ebc661f8ad56c2fd27e6e299f7e7992c1a4119f9ea422f2eab35e47144cba85b550c71e169a323b51c56a2ec1384b781c8b9c66815995ed3a56eaa8e19b69c1a76b97bf311f25df43a2443e9770bae3439422439ad5adeac555fcea33010347a7471714d3140305d47483d376e47f9ed03b0e7092471f29f8421bcdc4d3f9b1b639aa23033b7403121578305221550f0c7c58194f9d5173cdf50e34fe860df036afda2e9b31afed0a26418a43b414ad303ba5d0d4c3522c856bd06aa40dd7c3646642064d398f1a390745c940ad32b72d9ab8dc795e55412b1a843845c08117999ba671dbfd372a94031dd5a0fbdfae997ea3930a172983c8bfb79404d35e8d95f37e9c3feb604abf5002169df91308666f5fb042bc0bf6af6c5d0a1ce0d812837924e709afb6497ade1f032953bf4f1a180ca87af39241a6467293ccc2a11104bc57596facf11f22dddcf202059d32a5f4bd8e6568dd9418bd1e19816906728525457a60b4768d8b74c048e4030ed2307429164774b69b77389784b1511e80b1d5d727e2e1f0deed2e1b616f5d41422d31b7f0bd9759301abe0ec77b99d630250017acb509aa7b10ad7edc0e592adaa58e744bb60d1d35e41b7f3536ad1fdf99f2751976f1a30570264ee87be39b088f908a20c0983c2c7a32297ae5721c16f7cf25c28b94ab266dce59cea66ff71ae229bdcb38b9d86597d2b6e648c2e479087bf0a78a34fe0e3e318b9ff834e8243b0294648c8c1b8e4882b58b92a784968b655c94ebe4e0101e95ac8fd1d8dabaedc7508b64e4fc4de32444f0bad0bc80408c8b102fd6fb109e8becd5bc74d7cb93e1b91f5470c2723bdf7c8331e47360b07178af3fb21ed43808a7cbb3a17c7c7b53d0172b813f2675f8a14ec7eac517928bd649ab194726c867e7fa4d87398e925ac669731209444748bbbca85c1835ff427ce6081c1c22d6aa0ceb108937205059d24a85c4a7bba5b1bd45fd9b00870f3c4bbce71ad95b42ca711cf68c21205dbc79a2093cff6de00edb3eaed80f19dff7c7e633fb3bacd4400fbe6f350ba877a44b2ade8f7cd7f6ccc67a6f43256aca7da94e8b199b6538223134ec97f6620b59c3aa22a4c8ceb052906200250f22e11b4072bc33bf64588f870fcd64f7952b0a2612ea68e31c4f6fdea23105eb05629a2eac11c4344d9deca1db87853dc76e326713f8a4cdfc726526477c4b5efdb986359376a614c383bfef93e2858acf618211406e40c65cec79c61d8b0583df795d4ae8848b353525e964431ed94eef17b91f87d18b4c2c8edb61ad427c8af243fbb15f7232c628412df7a964abe6a6609529017c7a6e68907b250268360bf4639f3ea48cd3fb46fe658b9f3a44306ea0bb4ca0002cc223d73c08913e36bcc518bc9485a474e80fd3278e53d70f6b40a7218a527996af8abb5cd9879d37d05b69f3d5b1c3a42109ae04a4982b509b0e84cdd07c03f5b264ee819d932f8d8279a15b7c7c1e770c05e269138a5b1489682c5285a860110eb4923733f831298b8eced48d3c79df6d946690d7a74a0e9d57a171beb0d7a3ac29bd830aa533770eea1d393b5d90a2810bc4f103b273dd31589746ced2c1524f554b84fea86a154b17b37cff1529381cfa872cfebb070556181ca10c157099c8f464cee195fb7b45cad27d33677d92ed97c9f1aaa30abbf2b704d44e90e7acbb6eba4482a4c49ea6cd32a246da18c2476b45b3df3bb6f9506e5c4ae985f56bbb0a9898239c3f106577f2e67a80c4115ad4afe2e267510cb7dd77c2ac61ed04a2dc86a5e423145599ab8cfed0097cf46a11a41e2eafe04bd6c3859e9a6eb6c6c91a69c1b61349b4b1d5663b799cb0a280b53f3a17ff6ea628a3227a16c33dc1eac5f7df4d4f87a0e6abbee58126a4ac37324b4d11730379d31e8e043d42f8cc32f9283f66cf27733f885fb9f996b9475e45ceb0eb56b18b246620c52a63d0505a3bfcba09e65e3f3496657f56034c69cf68fed8e97dcdc6c9df5b2705151bcd5c70dbabd16dddb9de1c1055c6bf902d71f87455a79e2dc37247fe966c426b47ce6816e3fe1ad2b6ce3434a1a915221f8682978cdc166c16c2c6b8a6ed21ae5ce393a88b06583945b6eb17c51c05d1c2545f785f3975639d66d3bd4b2f916be0d961df3da089bab23d4a7dd6808d7668b648936049ac151ccc1df197ab2d4961200901cdabc861b65ca0f8af754fe094ea0e39bacd4e2ec41518507c171c409f7da4be41816a4f917fc780ec0c00000000000000000000000000f65af88ada05ab7f4da0c7af39b00caf10af201fcfb8199e0704d9df89f998ed37e87c5d54e268c1d229cb85f006871197307b8c442ed0c37c9d26802553581b60d1e9bccfb4aabb5491b9c4cdf12db7974b62806841c477ff14877125bf1508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d9034cef9ce65b5111f37fc2a5e4a5cafe8f5fe1b076bd8ecb06a369bc9f0cd66abaa5b565a041f8368d8a3ab5a43a6c1b5ceb132c492cab4e0b79e46f93168d83c2cea7a05a379b6e99321e0c7e4161cd74258460e164fcf8d0d15e76ae3889033e25dc2515203b9f23b583e2fdcfecdf89afda1b2665eb443ca3c6c49e4fb030fab8af4638ba46aed386aeca90affcabd6fc2b562c09bdcbe0c1c2b0a6d0b43030080b36341cddc0df0272fffee738bbec77ba4f2c70b2457682fdd76fca8b7600b04929ff48947e6a96964ca373b9840aaaa0ee165d00c68a0bb0137a9e8de65fd2a041a513a4a151e7f2e5831442228de40ed3b098982a310653811ec5c58689b02252736df22a1d9b6f322129e126ebb2cf4f4245ea4c8978cb099df57d039b891022842aa9ca489ced4b4ade94baff804037edba7b286e64aea102977b8749688cc0323a7b2c5bcd1468e77b27117c7573fe5fd276e4a58c7a983b26cdf3c8837499602084a00b52fe6b03f26983379527db9f26c43c41230967c18f1f3b9e6aaa3e7090200c63130f829b0f8a5aa4d1e241bd0c5a516a3faa4fba146c7281a1235e3a72914fb7fc4a7b09ffa4bad97d04d93d7e214a52873634f921c8fad0a6f9b99f03eb9a0f64d6a27a807c725ec179b8f50709da8b8b2cecba100a5d5b30e05c1a715fe10d865076f186b6f0dc254ded9476b2b9c3dcf8548062b8c221bf24138aad31dbb116a92d07b416c026e9832f8ca214b7a36d91f87436d8cb92ec6658d17a624fb6278f65519527bed24ea0fda6e07f99edc462de3c1bac9c7f7f0cafb03beddaf804d15b3d15e10755bb8b1c4ad2c363eaab53a86b609265e3d3d9c7c9c239c6581197144e45e8af8936197538c7187dc76ae03e68e9a37b5a65b718f920593829fe3b11c290e43bfa706f0a7f28d03edcaaa47918db7242effb71e9dfb1b72d5b3412bd0a5c8d37806491b447fa86ad8bd716f166aaa4df0680c303eb6686fca09371d00bbf56934d8744b9852b4f9c7b73cce89a62c922299b8648bab48ea4e555290d521e4c548b6d1af968edb745b2b86e66b14e80316c67da718ffe1a440a15d889e148cf62caa673ffab6236eee1b73dbf3ec02706c55cd72261fec699ffb2b2abefb01eb6e240ad94c9e79abefc8e2dd3bde4bf5330b82cb03d476b3b535ddf727bdc6eb3f59102ad55bacd5ab259f089145c5ba6481af5045b37f608556cf08f22efb576f07fa7dfed01242aec9acc8e2cb2f7eda4d3f1fdff96844a02c5e54bdddb7f30356c27ec8287c3a99f14fd844ce0450f8f4ea42e33e44bffc35a128e4658cec355c512f4254d471ac4a733af62de211660c678cc40718c25e4ce0383486e82a0d5cfa3f666af5a6a61ecacdf0d78efd0b807cd54b7c9605aebda2596170320866736d52c71a2fc71fc5ac51272347f252e14e0131d464ef5efc982c0269c4b8ab3dfabc42457219226ac8a57b0816b11ae88258a6e85fb383a286d59839ac6af14f6e85df6c22d5f2bbf38013fe15e484900a07cf14126eec915db36b319193f8338312c3c956f275e891d7fb7239b2bbfa8fdf24f0a30dc877c52f153db2bea04c0c29493bfc1271e31f9ceabc27ac8f04bb9c16b808e6ef6c581c4c403dd7ab1cab8ad6e541c956e54975758e07af349a59719fb3eb12279cfbf8bf70497f796de0f6f74d19b7ade33faad935dc0df69869a9baaf8ee81ebac550bb934d679ac002c5edfc56b5609303752272a979fa6c9390a6217a6420f93ff5bdeb9781eeb8a1abf000a72fb8c273cdf693e5780f2129994637429746443175a2f0c80a0794fcd55c54bcf106536fb21a68e39ebbadc76e51d7c7a453c4ba4cb294444471b42dd8d5a35e2697afe252298c5a01f2448039921f9ace9adce8372502e4d8dc551a0aaab2d2a096b831ad410e601239e435efb257c99cd91012a0ed45e29c14a152e2d05bc573d9b58918d0845e94bf6a9558a5fc0858f845d84be5ee45c3cb6f1333d8b4b20d6099f24525c1b6992c5635d521bb81ecf575d83aa78cf54e8bd60bcea0240f6ac3e25f81d7c3f534b9c3300bdcada0ed71df9f99b990a5307b375774016c628dc2cf096c5e0e00acc222d48b1592f0242c3f833c919bce31d4ce00066b67f13bdb2f668253846801b0ad1fd95f6cc1bc9b40c22c8a3fca6f3612d58c223c9e3730753f171de70ec6e36c5b2505997c6538f70a4ff575aff026a375660842a842f789df728ab5ac8e6ed9f7c5aef35f7db8aaca2643f40e2679b90837888164159c7fa682b4c478b575952b4106aeeee15770b97517fa5dcfc342cddcab3bbd0d9460981d7a5cf8af49062158e1d21082327c040205b4f5b6dd615b31d3c83a188e8dda1718c3f91374ad4dcd8ec89039afbe5cf9ccf4aebe2cf6b4c3783538c009", "51006a", 0, 999335528, "ee0239e5c9750c50f71933f310435390cbdc95504832d69b595ca0dd0d71823e"], - ["84024a0302613627dbfd7a2111b8282ce01c56eeda85cf10787c420f6f47ff149491ba22100100000005ac6a63ac6ac08eb05b2ca12680d05a71a6cdb90eab2e96b3aa6596fbb0010ae9a274cb48769f05de2e0000000006abac65acab00ffffffff0350da22020000000007ab52656aab51009ef6100300000000006b67ea0200000000055263526565d0fc73c802cac53d02000000000000000000000000641a722676a9cddeb37a19886945971e05263dae7b987cdc1fc871e3951bba034f9cab588692a665013edb0ebf303ecc9efb0eb6aa5297ed804c81f0465af8b1bcbddc84ece0fbb4bdb428713cbc1cff39c074db71c952ac2b207d650912568400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ee6bb6aa3c5ee6d417edb7dcc0dbf7417b308b4953714bfc1b8d46e6a7ac1362edbb2616e1770939e1783c9901638b4b1ab564cd8d62a678f62481200035f4d488138a70a0d6c05d8e9793d1929a73e6e925c526e73b6a69cf9bc7a22e4bfc937d07501ac69101fcebd3e17b523b2cbd12215d590e15cc0cf52d07d0ca0ef22c021ee427e9223629bbb10db41361b88b304b309fcdd5065b3e04d0d0aaabbd3b9603114f06b2fb2516fb863d9df537cbfff629877cb148245982d26f34fbcafc27230a3056911f5ae37df8e59a1be69c176c5ad2db117a3939ce5c1f50e825e405aebd0c94ae094843b68f96e624431119ff5c784ed92265186b58bf1a52988ee633dc031117a15cf0824e54b7c470caa643ea8f9f1908db603d848f3c173a632c1f1398030345e3171c32e591f197bacedc83aa254d0e63e7da2c8d249f77b641acabe5230316158ff6622521a30c368e04d2fe311a8fcf10d1d4cf13e51c57efb4a7cdefea02148211996a347f30b3ccc6da4e93b9394e11136a0dd3c4cbabc4c7217765b3ed022ba217c21e1cdb672b5535b942acf8f9ef56db50070ed431e37a81b9118fe11203f5be2345408304b7499ba19ea9c8a75b3f7bd2b9b1899c8fe7794ff99e16ceb564d5a550ebc924e0bfdf7e65ab913fd8305e3020289beb61deebf41bd58d23cc5c3e933c069b3072b993b4a926a5197163222b262a5921aafbf5420ebb0365ef9a692aefdace19e9009a753e5475d2578487a374cabd0ac79c7866c7ff2522ca1bb523f0a2ef6e07f1a73621b1793901271e799774306da19c5c87d5dc5275c15261b8393490ccfc169ff144b3a369e7944ec3286cec95adab4b6b3eb43f7cc9da79a0f3fd7fba3ba1073dc12256460bdcc0e1ca6760cab4eb200e41d441e34c153d1ac8ef2a728316e92a4970a4bafa74b75589eea6788454187376691f47da33f431d6117e9df78070239a521d478877d627da4edff168ec6d352d45002df3307db2f04ef7376c93235c5d0a2fc1def4f3153e0f97d810f318a8330cb50115a16e03373514913da93810321cf664587d582775131bdae096babbc435510f72aa5f3b4b73ed83d949979b4a2d5aaae78f8fcb4f603c330c9a3cd3d52237181daa2bbe45b711f56f9710b7884517f77482918d2bb2a2bc952e64ece504e425824fd86135a56a225d25997371571126cea94b27fcc15ce8f5b30ab9c1a63201189187ef5ecfefcec21940a4cb59db00da6487356d992b6b9a6dc84500256846bdedad57ef128e485cd323110685b9a7ab92c164558047d54332e1e9d12086424b0f04cc8536598546ae80b5a5d2290e8b7984fbfd83f31ad2e9cddd8eef303261d85cdf8f3efd7ee436a87ae51f7dd3e936f70c11c01c7af3c7b5dc8aaec9f41a5014de23f8e4c1ee272f5f9a0c70b902e2d980ea74d434a34097cdd40ca7b904d6d1275105c4ec41867678e2415736ef21dd81fe6547069c99b241463521bf9c29d89151047cea8cf3a4605d444e44b398cc742827e84d7cd0073ed73808e945beaeb54cf40af55a5d4c5b2c29463c18cbe42248bfca3582727772fa096be69d18b3abafc05bb2a42ae884c945584642c4dceec30c47b82bf9bc58783c2c75c0f44f848456fef540f4584ff1915c4269781e78c54bc4879c4c6b84671e3eeb1ccb3b0acf877fed6e9c98274c95c31eaf9a7467311badcdc78912a80d1d609274f10c5c3d5312060c9a3bd9a177d39f5cebede1e70933a09e1ad415f14e26589b20334cbe7e1aef51c381b75cc2b13981d4355ff52814a606c2ccf44051ca75b4d33e90c4c3956c32fd13316284421efba00f0899632a66b6e05e76d9b63c066964525d24d472e127d9c045b642269ee2742ccc58b3b4c08cece3c25e011d1e05ad3ee36f9269a7b26095446b6d108749ac2e78a9dfb2358a4b61465701371fca37d27e447b92b268c767f8af0c9a0aa684b1a065f810bb3804bb57c0edf98b4cd46bd1036258c444d512958d7613317de5913c947fcfa46f351f0410638b60dd796def760249ab65c63018d8cf14882df240911c341c636e3da6edcf3560a02d7c9fc376c1ef4ca536a0cda22295316eaa5ff09361b62d3f9a69c2bef1f0391f77872b38d30939633d14eaf93bf0d18ec5fd067d7e1409ffc576e864820426f20d0b149afeaeeee05a0e73c251a0fd1f4d641a7ffd179a7840554be247e881a85c22dd0d546b7babf4b78d963dc4216f44946a67b2b34cc871ee56d4c8a0589e941de062cb7d75d614ba90b7219345ca9e00000000000000005f05080500000000f0bb3f7ba71435c8df809d18c163d56796a850e4daaa06ac3ffce690ff8a72f4d568df140aa01a6582d4f05e47e92f610595cc7b4b41277231f05c38a49bb32b02053d8de28f3ff3e1251b01333ebf7fa030d2b1b0178fbc4450a379cd306ff700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f0ddb18cb6062ac5556bb9c7ecae7fa6c027922ee0918285841f26dd60e79dbadc3e420bdd80623314845e85243c13e8554b279bcbfd577b3d88d69f7bb36ed51a7d8407d0a17b1ccb39b66d253ba556e03516c170e48c1aa0e05a57842bc9e35d5e4980c27ba68899bb53e3a0a95efab1d6669398a355a4fde8cdc69811e54902179f31d6748cc8989b69564eb39d4fae9ae1f6bfab87b5a53d46db2956823e3b02223a624bc9a0beba20fcbe12bd8535a19d37c9b79f56d38a1b9fed0828aab42d0b20669ce1cb9dcd5f5d1416cfbd587a7e25e20930e127527adeb285682d27c47b108ee05ec40e6e45eb337dd022fcf3800cd8b8378ab4f5c5405df89e908ed73b020843f298708e8dd70294d7f1058982097b592a9c42ded73fc36028732292738a032f5366fe0f91696897b7c157e5b827b54fab9090f99bf13a93d30aec4c75bc8903093b5bd3200d012934903599e8aee68935ad80a18d549fe0b0407c9f12792154020728c6d0faa1a01682cd22775dba4de0df1344abaf2f1a26873ebcabd408410d0316064c1340df92c334ed7ebf610b270ad161bc45db7ebc790a29edaf21b1ecaf6267c69676fdad49f95402013e0e5009c24884f1f6f005d51fadbdbf510263f1c10156e4439f93b9e90a3414277c03b2e3ecc8e9a54a5a1358f52138e67af1e718842d340e158f35d0f24b42281415e4bcc27629466cd042b2b4774c0ba7422f2703386b9f2510e98d43df5057d16eaa1c44f6c5e27930b6fb764592dd683e98820db189e6f33f1444b4e947c8062c4d25fd22c6efdb8f86371116470525f2eaba653b9d88c53228cacebc0ae649880185c4ac32667f5354534c572202f7a56d2045410a8551eeafa07d1c71599e382d1984c06b4b8d62eda49c57691d283566176f19e9003f68c717fff61037524d8fb5702b25d20ac36936912b8147a98d1af1dbc87acba9a73bca81571e7e2c38910a0396939ad13d07cb64f8b5782bc0b8e20bf235e1313f820081465ad110c6c314649ee670dbbc7a8ec37aa7a95f30a74d395611ae897a6f973fa9dc559e8a4b3d226a6a5cfb6e46712f74ac58c1a3e16bed926a837c65d104fed90a9ba0111c9efccc9240ab3f2128fde759e309f1ba5f2b5a61289b9887ff31bbd3734ab6932dbb3d01836fc2234cc9afcfe35c4f47f089fa1b3722799765fb2249185b28cfadd4d455cc0a499a1e9ddb5f8c5a80425b05997381870b8d7fb2a6b0fd43933720b376d3d231ef1d7886da2bcb687c0856607b75362c370566365998903c3af0b7cbadc1e6cc418e9bd933d8060dcc6218176d8d670062e4e2d8fdb58b66ca3736f82986c76bafdb03c547cb8e50181499989d6ab1a4051e392341b339f6f7bc7fcc761c9120a31f96748b903f81e3c4820f78bc9fb675c3585bf2e3b9f67d8a4fe06b481111f5d26ef2c26d109d651c00405e19af517237ca2b4bc352ac5fdfd15aac7ffdeb135783336be74f89472f7890f6a62a1c2c330d02873fa21f9c6985f1cc5f48ca8e3fc70736b597cae297d5a3f20ef10c76aa5097660d5ef1db4aac69796fdae893d20eb7339cf812031b7ef3b242dc14156dbde7f07ea8344f56cc2c52fc17a8a46ba71c16eb56363bc036e3cac3e17c9b88dd0cc4f1565b1067974873461d97c60e589e44fb35838f74891aa50b02c2ab6e6fbab875058a4a5c4fbbf8343640a6a6bc1f3df388cc08bd48efe1e563f76b150440bffa00709843d40fb22c1b21d93be41a12e2ae7d239bfd096bffb732d66311e5deb194f04c57d5193aeb117904713d7d820974831fa8245aecb7f7285b7b65ec9815f8e9ed8bf4deb0f2a3e5d50b446518e0769dba83255efb0dfd6c2d3c485bf7c7ab8324cf57d4209af4339b475acbab528739defe4e1cc29c9b4645c2b9f57308bdb0143937f0384cdee7e18cb1b15ece7ec510e3caf492e07bd388ffc877e62b4c9411c367e85b25d555c6881609990c50d10ef701157b2a04c3ff83339862f2b9561a06e9d0cbc7c4cdcbb4ab158193f864893c8a6d4a647ed181697fff55fc5ff79806c5ec08da0e6ec842e4b353bac6eb0eea15a5f415cc03b891e2f85b699e837f51af379168a3df4b91bea9b3e2ec42cdeb68b83a1b99d7e90d8977afeb1ec13011f250a7e93c3382ea3c73c11b7de3957cb867d73a3121b9c482b09a2b412edca246f6ee922fd74cc39716ebdccc416fbd72705b4f19244328961bdf964371582a4263383659a76c99213902b8b68988d96342b05a3a40929d982d260b6bc8cdacbbf5940c17ec2b3252cf54bed6b00627773aff0ebc0143b6884ec5152381bd2c85cd8afa329ec99a105c1234069a6072ad82b254375c103667e5b179d8cbdd8498b9092753497658cb890bde2b97ec074b723874759eafb4a397b1d21e2af2723e06", "5163ac", 1, 905166469, "c8e54310ea27bb773446d007dc49377f04eec8094b83cbde39765c025b7f7018"], - ["981dc2e9042e344695dc6f651cc32ad0b4249feccff073f5cd0ae473a547f4f8e59f302ac103000000010082a6611959e82ebff6a8a0c5a8e14162038dc67a3be96ffdc9ab1feaf657b2feb382a0830100000000ffffffff050cce30507d6f5e7529ec49445cdd917c1dbc5c9c87e4f8a678f43c192350c10000000000ffffffffda1d27bc69b4e065109ab3632ddfa2bcdcf9f12efbf4ad659bd6b4c8653de29d0100000000ffffffff03e4f1a502000000000463ab6552f2eed905000000000451ac65ac27d7c20400000000004cb02484", "ac6a6a65", 3, -1968106151, "91b1be815e98f8d67c5b88a2d23b1ab0907271c867e450c174795a9e6c7f87eb"], - ["01e595fe01d3c0a2c4877033db04ab6bae6d8e291a54e15ffed7fe7390852e7458585e9e60010000000551ac006565e3b79d6901c6879a0100000000016500000000", "", 0, -1003443996, "85a22598c21a0bb31e50726f7802bc542efe3adde91761eb6f0cb748ad85ee76"], - ["eb4f6d8a0442ebbab38afbea3fbb81094ba5b531e7a5c70a011295a7f74f46c35edf88614f02000000025252ffffffff19dbe563eae7ee749df597f559f62ac5d1083cf415d5289a273e29b332d1fe7b03000000016553b0e9fdeaabd5aa93f83bb2c77bec29bb65648976d80e553ac77bdec9451a189598706a030000000463006aacffffffffef525986aa8177e6ac03f9517f733c647be7ac54a22cffe3e2a2b8e11d80faa7000000000951ab65ab52516a5253ffffffff029b4e5a020000000001537e0417050000000002536300000000", "51ac63ac6a5100", 1, -1773057003, "dc4a423be4bb076455dc739dfbb64d576708494cdc13a8316b6e94017ef76c63"], - ["56f490200390740fcffa10a3f5d12d47eae473bdddc98564d2925b44cb3f22153a15c6ac41000000000453ab006a333bdf387bd4ca2ecfb818ea8594acaba1c6512068c191784afa3d8fd2c0c7ff37e1b32f0000000009ab6aab6a526552525223abe04e5343a3f0e200eb332ede0d80b9de2112b40e14c00da6d2943d84772086340932030000000165ffffffff01f8b4c602000000000463ac51530cf2e4d0030000000000000000becfff0200000000fde7fe5059457dc35fca53db46f1fb2993fea794c478b26b2a5270bfd41d6f85bc0e16d98b26154712602f9da6c2be4069fd319d5c15a0464a731a9b5df451e7deb4901f2d645e0b8013e13af87b5b3e9fb23709d768a90ef8f025ba78c104a1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e8d8dd6964d0827961ecf8ef7a268c322b867c70654c4d2bdb0c3ad5040cca329c7cde5eab6f1e40642c50d09cea3075c4fc68d5f7a21d9a66886a6973fdae680902b334ef47f1deab203f35b84edab809d4f5c9718ab83dfce79e468e62a3d8176bd89a56dc25783eea78544bc20231a2da97c1d2c55c58edd4231a3a21931021dee03fc5525b26a648114b542950cd14571b55d21bc9b0043422c17c5f6dfc8020a821d7730dfbcf62bf57a3f4b41ba65847e91efddb2db1f1b773c198e4b3d830b1365474ecc286f1efb2be142c43e1ac5787f966369dd4c0d789132690340beb90302002de830ed0a9cf00b110bd2849dd2d5c8cf78ebfcde5eeebd0562c82874030c94ee904c834b15118229c90167ca19bce875c672a200b3e67ccea7113cfb1f020a203bdea9df97fd8faa01198973cfb93607a4ccbdbcfa444e30bfa19af168ef0228c8906b5f1d9287c9e5a93f22b0644a25e005b5fce587c2554370eb6ae70f00031ba01aa00b7790167ee8243dfe419cb4831c23d909fd881c7b08d502854e8fd70209a8769f5e2a411b12726243aa961a5c27cee49408b75a2edeb7e3447b36f5cd515beb78b71126e69f7795d7efa4bc1a9086d61f568f971b891bc780cc82ae87c48ce245456af0c3cdbe9fa45d6f809bb96a65f86c28857ec8a8412e83fd726162ac773c61b1801be55eb7d680cf5ab285d054cc8fa4a53a72e7a0c90d0879ec52667b4de9847b9f647e3722126572e681f8d5bf4d6823bfb980250f940195a10620953baa5ee5830237d4fd66216cced32d614954725dc844475010b6652d339d84b4186a92956b2c03fac21c3778480e721a43628ff3f40a85df5829a80bc25896ee4d13599fc6f6a6b874ea1dfd037d485b9983f6f67db2bad8ffb173ba0b72e759a4f7c5dc7b6d9ffdfeb36d0b1bae3864e5a9b236fd2d6ebe042a9096f2fabe7171d94eee5db582f6695e56224e9bcd96653def8a40caac2af0818c700c3f81812568cc70338823893d7f8d47213ced64228f3370fda512b29020d6562245e034ee248e96443a14ebc49b5305a24785ae78ed1af52abc5318a20c87bf85168f2dd962e8bf9c153cf808c9aa126f0878aed8c4b2fe28a94923a77772e74a2606e56276109aa55a396cd3aceeace59e347c95e19d9169b5d7dca67ce5a14e6726905313a19eaecadd1e3110234bbd74a6ef548ea55c1244e14e5d5cb6ca0db9b5e3a53c5b39e53e14cb0629a4bb046576ffc802e2cb0e92c2d3d16c0f8b262283888d02e89bbe1f7e822bd3dce02f7046b6c846739b20473cf5786e6cfe314f2a36bb9bc31f2217479420844ab1a8c26b8db2c3b62c4fc389f30cde2c2d4dcaf99ff18dd9b5a481c003380b26213cdef27e6983b3016e417cb72b1669a367f299d2818866805268bd17c0c013846d684bae2494cc2b942641de48fd2899c3023b836311da831a1e2804beabd2555c537eddb14c2f695c40ff2ad2599329fe45779ccdb51b9ac344d43ffb0ddc356d4b697e88d6142335f77b8bccedf6e184ccd4007bb35c6eb0980fae29aad201b8031e0fefba1cdf91c66e09056dec76abce6a54eb120899903c09e2e29f0e6cf19cf4ee839ab184dbe6219adb5773923ad39177ddacad5b6c4e4a25a396395188df87f20668e407fab6176cfc055a43dfd29da56151631eb4427969a55db06f6b391933aed02728b947e0e52d17311bc5eaaa32ee53483e050e074e5f56561514260d095f224ecd1872565244bd47712d147b402b69ab9d1c377aa65b358ecdead83c3b9b497df88b2cfa9eec0c15f96d8b0c573d0df03a1621fb616355e06fb75644acfb3812b11e1c04fa7d68b5c3a7b71c3a4a2bb6bdaa074841a115531b893119e03144a57c5cce0ac1184f525e8000aebf9b254366b32fcc170c210d4df0f6b876a75e9dedd54a24fb393b0405e0523983bd62e88bd243605805153aee46a26a7fb5203e2ce904ef2091e3de1d2a9458f1bcde1d49dae99d053a912e7bc5144d17d435eae3e98074727b41df60958e46c8456040cfb90538c50182efb4db807eb0e1d1f90372ed40a69f45f577a4a483a23f433c9dcb5dc573644857dda00f014240d3700445eed2738d26a6cc0fd93e7384e1e61e6358d1d6d922797f65161b9b52ac8e038fd6755acd6b0ca1fa6cf20dad3651e8597b3b2b4dd3bd0474c89b9fcb0e189185ef867bb4282b65546265a33698b50a54ea8d8151d1ecd4a58b028c6c4ea8b8242cd1fee6cc376d7b6e2faa233293c2efa476133577d58b4ef5d2000000000000000011346c030000000014908dc91193ca1a41b7232496889d6460abb1fc390117c26acf36441970113a411bf70b8f7375db9ad8eec64fb7c8f4b51f754940b0065a589e9b8ffe98aa156ebd82ee8c68ef42e486793bc3c744cb910204e655c54d102e59f806dba14db500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f56c22207dee24b72cf6060cda33d4b2ccf6f6a3bd4b0587d123a74d524cbb80d12f5474b5ba38b1e2d95feb4423f72c12949bdf5c72798498c142d2375d74755cf8af12ac8a0461a697305e8d5b133103414cae99a3762b1381cc74044fa6c6068066bd374543936b9f98724decd11fb7cecc622636853cd78cd1b1d5f79c540229e6a25a5f0530e9a61da93c3e3b2254f0962a236e939b3dc03d0898c2d71c81030f0f512ffb857b5e2e939250704b870f6df576f2215463c2737f58109b8f66f70a0568c2e6538b8e9310b62ddf628a242a9e59ada0b3d827d677af9d74ebed1f152bde2d9b70ba864541b28dc39a910a62ac933fa08bcaea3f36f65ae12239444a0307ada2b940131824e1fa980b37e5abe76f5e021369ac971a49c5a96541cc8047031cd760b3ab8d1dfad91b1d3e385761ca16850f8766a6ef49ab081d86b5ac33d002158ba59cf101342223b6c79787786586ee9c237e2fc49bab20276706c4a2fe100317f45668626854856a5bb72c09167def7aa1a2ffec5f21c1c98de1070bc14a86021708eed123648afb661130db518db66eee67b07e8fbae8d74c390a86d0cdcc2a58fda7f35f2d67632cdca4f8074bc7d0813a4d2a0bb131646e1c664a2d5a4ce7ede62cb15180e89ba7d9cf58d5ab261fcf9ddc40a5d08bb23e32a244b62ed9065cd3a276568dc1a9d9dba5135d58ca6d99474130a5e9b3245b1a8c91801b84419800a654a666b2d1660c23afa65a87fc8f7d01db89c063d3cc980541ce66938e7986c25ba4b9c3f8e70fae1c84dcc1a9b47ed5dec411ed2eada62410c6cfbe3c90316726c1e69ee42df49e6a27bea9725b7dc1f4fe45ce58d605f32418c9d31f936fde48d7671e9a343649ff2a7ffdcd1c76b21eae1deb2584b0ade921f8085693732c6af97aeedb2f9e42d08cb8a7f011b7a0ea46682dedad3a286da4264648af4b55a0b9ac8eb9e8330506eec79bf5439d2e70cd2dc5d69ad5eec033eb80e307f845786c7d8add06c58edde06e2bee21bf29917495ba86be989614f5a993386aa28318edd6d7f9d22dda749aecb30cbacb9a23116cee9f80c6ab33e6bf5d89c41c040627a2865e87f38e1a130a2c2ec9c2c9595aaa1d9caa227290acaf7cecaf991eb09ba79d20290b524c6f0115e95420471bbb0502feb0eb8109b59ed8c9a4bb808d16a6ec85afee6f3c664f48e88990ff45e1ae3971165c2f25103184dad0f5afb32d2c4960605a274416d01eca4a0f7e152ded086ae5da135f4fa73f5a606e1d01587c826f1ee17b2cd9da99d0a97b2f769c29d2dab589e73c64126eb01766734287150e4afd3cf1e93134f73a76ae7469963f31bbe556db9f5bc3fe5878e10e8b929ca46b3274e73d1a9dee1935e0c7264e631d213fce4caf27a2b3a951b19102f205319a5b5372429c307d222a7e98e50f41d16cd0dc20c42442c77b170e4a17b70bc765697565a7e4a1ec0724d2a2706905241f6387d21a45fa0f0f8c8bb6888c94c58cf8d64580b773aa465416c191235a4a3d018acc476c7de545b2a1ba161a81dfa619fcf256aa26482a923b2a4de3d287949b083f51d477b675e860a05951817dc3ae5c69466d2699d8dca407e02edc5594b72476d1c5ddcde8172a2d81845aaa885cce38fe02ca819440c92008ca401cd4815a33f60c781e6b393e978020c45242e286ac7ce098ccf453dfc96f415422cc55b8a1a07c90d7a1785d8142b5034ef65b3483a6a685d5b9a6795a9ac818f4e096764690e5a72549d017c85aefd8145a5c913da464646e94d968df0346beb8a5673f0f65e8c7e4fff8e6b4a82105fc8a116b0bd5ef2d8fa6e52a36624dd2b660b38fa3e4a643567c712f54a8d54cc7bc3f9091d2ed80d26a6008b925c83714298807bd005f734ac70e7799554a4537b14b0bbeab7f315b6a987904268b9f8e49029a49159f962f224787f7d0b2b55068632cab87c5608be4d30833a4aa4e9d97bba01b0f5bd71921411da55e624ff63b584ce1288be09a133c11e19c850bb86eccc40d8d7827c770ebd085f846f2736a988e0bb73ee61b8eaccff6d75aeccd95604d0892977e48c979df3e8521ef75d6dda7eede990b226141a652ca671324c89ac7f849482c2cfd5390443cb1d97e673e2eadbfb4ef13f2b52dc1fe8461b8108f6984847136f3745e6f892bcd8f8202ab356f646f96857ab99bb58a2c7587f7c29d5cfac430db5e14e9dfc91f116d8ec0c4d8ee4c9f37cb5cebddd99fec19c94c3e30f718818cc088344c5ac155c6504c2c25242ec9ffa9f0fd0000000000000000c5003d00000000004c2016a7f51853d1b86445a20c969d2f58927b8adedb8a1ce08bb6af9765876869dfb7eed75e4f713a2ff7db77ebc7db333f20f10220a38817b043ef2a20f54c1f2949db43d58800326fd49618c51409e711c57848e4ed48d281788bee51d85d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004aea369f9d3ee43c36b1b7c19ab5ed33f7786197816d965fe3f765bcb167d5a341014c6e5e08bd1a8fd117eafacb47e9127a817fbdf2c61fbcbb043daa1ea15e64d9c4137f5fdb3e71e9c04b9703b832d5bdc9dcc62fa7b490862410fb1fdf2a56422bc2c5ccf959177e61a63559c681651852a9da432230e9075e23036bedbd030b1fc4d3cbff010b09a83168ee0c2f0cc3f5acb6cc47c4ffca63894e5a0565f7030003eb2cab583295258aaee7f18f3d5a77e2d6e28b04243791999abfd93366060a0d38426eaf1206da109726f2711b0ef4325f06c5ffa522c4ad425b8a57da593d1e9d5875b605b073b6a91f1e2ec23cef6992d0f1295e30f8c882b0a9afa9cf84022ccf8a305c7b1f1c34474eed90aedfb4e0af27c959cef2b3b3aff2313890477e03115146e9ed3bfbeb1d3d2c2adeac5748360c8809f932d814343de8eae45d797002021108e7e305cf8379c68f97e302fa67fccd7f60810d2cf2a0cffe352d71e987022d3357c9c310e4267a5916720fe88143a77eb2253a6a2e3e9519aae58ebc3a82030afc897012656adb51b82973ef40d72d0c6e44ce062614bd99e0da13f30512319fe2d01ab12b5e3071f0eaa495cb0eeb1a76016ad6f0c20731f88f20fa7ec39c5329d2b94d353a05bfde4a1c5de3c2ccf1f69ee9fb6ab13221a8e61f476f2c8fb88f8c382abea56956d3450ef907bb15e33d3df72c924c64701d534fa4c0f80d70a513b15c48f8c8b2ebe07038f499390b21e792b8d417b5e35d42755972bab028a37f97d591f791a50addfe32f87aa2e4d61ce494528efa917b2f1e8bde697ac42744614a3fd70e262a19d3391f7cc7fab8bb20d7aa179e5c7db9962313ec1a0bcd06a5976f7ba7716d89c2411d4e1203aae3365db161d0cb815800ab71d289998317a41ea3ff398d21eeeb692bc1cb7d33358c879522de429aefa7654949b494ffed282c9bc39d51611d22f7534365a8dd35561abbb527dad82157e2a059f22a82cdecca60b13a96b1700e94f7d4cd6a61770bdccf027a35876d56f8a8b19dd1caf702be5d720ef81b4fde82faa8e99e1a08000ce09e3a7425592f7743584f7fc9ae1838124c74cf93c91cedf1a6b002fd9cdc1e1dc2afb6c54ec27528f76ef7696834ba89f8de2c7e212babe3a8c54f1f3c6b9b8b2f8715a3713868addf6d8d1b5dc0c0b268aa79745df51fde9f94e0e37651377d056714097e206f483791bab60c06359124c9338be136bcd2912b2b89457bd0d07780ba8b81ed7165f398811a1fe891468f5a3e76224250739efd6f26c390a1329b3aad806f7a21d829d34172cac31ceec198f249792779a5c69bf23f4a9bb8895fe6a8237d03905142938ab0f33c9fbb926db4850c4a96274ac49a79aeb42d35f9267aa96120519ce985252656ea5b1a2ef46677b2de59822f982810d31a8a01f3e66e422979a126443e88c0afa36aaff9ab065cd1c23505e4d5ce0cc4fbcf8eafc3d959ec0f4d6cebd47d3e662f5b17eb4c769844fe76441885ed3087caaa768a8e6ba4506b0446417dbebbc6ee1bec161ba819488921c47fc77042644968d6d1c9713061920c092cddf88c357e5571d5720cfac10c5ca921b68d596e8edb6ed07454ea1aeed8495eadc87a1e294265217df1321396b4147f4c521ebc4a5b887d9a7e7c71d57b284662c6d2c2c4c0aac96da4dc0de2d90cc88940be2f648210551f201b57e5bff8f9e41c82bdf5175b2a39beb6c0ca9aaca6735df9dd28b75a1bdf8b4e49d38b35858a5b165810ccacbf4344f6316f52442f5f1f7fb913c7683723e75929edb1cc72b496a6e29aaa0f998005714222e31ffee0da57715097d15b4f0be78d7e92e39c9dbeb908b3599d39c0c71692ed03915503d507a16c7ed8ff6dd7f4c1fe5b6b9929f99862e6bc1861d5ffda10fae7f4abaff08efd89f60cd7d26e317adbfb218556124b129281a39e097b3413471d669ff6198c7e3922502dd9b894b2b4571a8abb3387994204f3f231f333dd25e254d8f0f4ed09399b56519ecdc4d3489c5b61352b6dc2dd52bac7f8784521b398a2dacd0905d47eb80d632216123d259a8266cfabf07f84806c66ae2506b842620f437374a4d3207ab37912ab1a451758e04431ad96b1c0003e658e303b3aac11a30eb32e4052591f61c01487c2ec9f0e9099f1cb33d685b37cf89115eef563e7719e4c7245fbe50055fadeb1a6cdc4475f865c0a6b45137e39c05e82c24d2762e78164f401d39cbeabac1c0d0d14fdb1960dbb10602abe70d6ed1ed0f4adad1705a469f0a448132cc9b01a40f02154abf7b96bd017da845a12b910ef7d47ee496cb99958b384a46c257fff70337caa110b547e6b17ae133559cb3347c774f392b0565a8aa2be662ade6e3b869a248d0a6f2a5f6c4f170188d3bc762618392f012b3aca350c", "", 1, 1987178934, "f7add204e6f9230a4d1e720c8d3b98c58c543e501a1f72f2639ec9ca4e5d3031"], - ["962e1312036d1d23047fac3265917059a56ff70cb37c60070a520ef5ca0b2bc57b401118b7030000000851ab52005363000000c5bd8c7b98762ce634ab24822598a9563a5b93d2dac75860153694baee4eeaf0da7ae40000000004515265acebedd6a5fd38430c916b7794791751d0de2b0f6389bb8873c799d7dc02e2bfb44dc52de70100000003ab53abffffffff026e31c2000000000009ab6a6a5252516551ac75024404000000000093d812a00334dbb001000000000000000000000000ade09504489b7965f6c5fb81ae87a155b76e3c025cd0fec1f063741fe6536be8f824e747d0998f9af99246dd7814ccbd7df6ea6767c516f31b1d6e6f2149f1f34d542ba609c5e0d4c8da3b4e4c1262e6086b764d3a86989bec7877f646de007000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000606ec1c2dba4804b42e1178ed374a20168afd5ce9ce90de306302326d899a0a509416d9138e619a6da46bf3e8c564898da492124aa84cf60f25036296e7db55c097499acd982325bd60a80aabcbf85407979a404e066adec57ee8cb226eb2af98a088caea941a64d57ac9d0ab962060e39b3c4138f2baf35f8f3496a822ba8c1031973df3dfa9c70f91d5a9e82f67bc907ecfd3757714062a8345a5878307347770210de995d4bc91aef8efb2e35a8f348dc3417712c7d333ceefa70659eacdde7e10a2e6e95781aba2b6d6a33c2bb6da0a9d1662d58dd54e0cda3f73a53a58223655622859948ae0138982e5d74e4dc2705b05a165eb1e548ecbcb973893b1085423a031b6b838249a84edf7f12627ef9654b920e00ae8fe6bf035607696dec14f88fc8022b8f72c842322914cf4752c8f5cef86609fa1488a862e857b719321d197411200219078e526261e75eb176c54720afe86aaed49f548faeba6029dadcf3f7dc5224032ca7f4272a18c7ec282e1b62c6063e8cb2f0407173f7460e769c18842c2974c9032281b388bbbf812ce7bc239132e21f80410b67d86cf5c381eb90443ab0ce631b78ee61c21f9cc1e86bf341602bf76127fc62d32bff3a111d38cd156806f25aaa7e2d6ed2330364469fc2dae0793b88ed3d774d0c413e2de455333f9997e2316441413e734f870b8f44460161c33b7e5c2e32d3fd7adea0e0a896167f9fe5cc94acc5d180c05e6e98742f3682b27819d042d7e2b6c1b11d85ab437e419e860aa7672e7728ff84eed0e9b66d2de6f33d575e8e2f406ffa6a1bdc4342da13e2b3ab092d96d26489116d50f86ccf6152315a1b32f23281ffb0185c676e6c6be6d241d3b8d4d9957184c9f1c145eb03b3f283e7471328c39755f5e00bbbd032d8f1cccfd1e90cd794421a95aa1d95813ead916d31c4aedb67c073ca488ff7d02a5d91adb185649de39ebd2a63658255d7308a0c2ba1e707d94a2c5aef7efe1e150be9c54d5e00510b53dd9ff70c0fe07c524f3b3a3b56ac3bcc8873ac21da1cd830c725917e21f71191335131552656765afaf7bfc82d818496853de7909752e8f17a33f133fd8b1cb1666830c3aa46bb22630efdb84a2b41f09ebed1f721578177274d92703bcfc2950364025e535c8c7b083e98276a05e0f482270b439be3dd44f0e51abd28162ced2f612ce130ac22896ae415e37aa32ef7bc4877efa05dfe87529d8495f987b66cc6f7e37de30a303c42fb524ef02940e244e1b055b6e73d5abd993baa92166f0a1a67e07c4b78ff4a483c73b8657c2b08480d1177dbbb48762f57612e7a5b18ff12a678f90b2abe1348d365f8fde1efcf2154885043d4a01fbe4dc1e6041801d6479b00efd711b64aba178cb8255009a54329ffcb4e14f0ad7a4f5431e4737bc3f86c6001b2dbce0bca671cc04b2c57ecc835bc8ba373afc2c88f6b7f69fe601c2262d2e6a269ca4caf1dfc77a5c470d4307ebe0bda45ce8c5f0ed69910122ac37b3fdefa48de9511518ec9bc09f872ca313810aa68d576e524deac20108911cd1b21bed01081a39953356639c8d9523472d678b51239614950f6ad1c6e87da3ebef9ff030cd35827ba59486123823063df4840171d0c6535f956f2a54600346619dd9bea3da2e1a449e262b64da4178a53537ffd0e46e29bb86d9d25e5913f1d4203f321d0338f824a07135ae44970f7dbb61083ca3dc02524e05b1909a8a2b7e3b687f5d931884e25b63254c411e38beed2fbc344a037e2823450dfe2d5da596b68094114f695372e3a0635b29276d8b0bf5bee3d90ab76de1fc31327ab0982fdf5aeee341759fd1ee14de5ffe814c103a5a202583da56fcc07ea1e5c295e75dc9bf2c87d0ddd8ae24ed046bcd1ac0219a650f2753cc394569ea61967bafeba3980ca5cf72d11ca2927f69ad708d5edb093522bd57d17e0e6a8574082b94afc818e11c8bbbd72579c1700c1f25a5924e05e12dbc9e5f6cb37c6814190c113ac668af2bc7d9a0a28de5682f0c9831ec0cfd2238577f30d77c528e354242a1e4ba91334db0be9e0e1c562331feffbb0fbfddd298b976180c6df77f854260a87ea88a92e9dc860bd8440e0f92221167a9d18801d16c4451de7c2f78b0c546abbd8e8fa632f16bb0f5dd7c4abaf296c9398a90de8a5a9f67ee45e4f97cdb760ca7f5c90334f5171830e0bbd952bc37c7bd7f3228d02f6e5c922c44910bf97c72b050043f60f762f62da1a7c65210b95f5ca4bd90667de10ac9c5e0848a1f5afa094df1abbeef9a5254b348d95000000000000000051e0ce01000000002cb97ba23882ea8144d87fed19eeb2feb7bf61628c7091a03b7e3fe01c4c4ab97d94326dced2d938c54483e8b9670df6e9fe47adc6ca46b6cd2a5ba9d0f13e53a8c309319bf6c8aed7e4bc30cd2f18ef5de971579ca12eea854385425d59491c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e0ec680f9783080a4949c33aebb683f4ad4b2084ccf5d68cca49d7742288a925601bb948e72fb87c0a7500faf07f0b88591cce7ec0df7ef55bb0608713506847cf26a51b3d3ff4eab4a4f6966de2686b6f17041f46503ebb41dd7ff13e6475fa09fdf06241926253e29ae01e7f8916e638804080c1d87be644b0d88c48fd036030d04877befb470ace2ef0a477eac5abc62f3ff6c409cdb570e84e9b9940b73440313aca4c8c181c43f98cedcbf6651158305cd6be12633bb3a58c116b150fbc3410b136aac9b79d40bd305cae0057cfabf45deb793649909929b11a719caf617fe99302948d2688bfcf2d21d41f800ab43b9b70798707756b9441f2853ea203ff64b03119258a2243d7b0823c22110230f3997c5be50b52dfb7d33a6cfeaf8a172f89202179bbb16bc1d531601456687e939e1f254eb31621a28606e1b8a4494f551953202292e616d69fc91e4f60419df665f30090bcd8d5ceeb75d6ececa143f5696298f032ae6b91f062471bea9c0255abb0a4a3300f5d53961c9f4954940096bc0cb060d0305236b877b74e5dd944d82771af95d45d8f5792620614bf9991589e7dae69f440cfdd126c16e60d840ed2c75ee6d406df9e3868d83a61ba33d2bbc88533c33edd1df47941fdfac19d775e10cdf692744b19a312fe73323cf27f961b21432d727ea9ebd4e6a6b858bc380aed293e930b3942832200b68b0a08c1abcf8ddeee816380b6d24e5cafda1999669a8617bafc48eb155d1dd3c8104be7ebdd87099ac529ebb7667f3cff6e824908463eb59c01fc3212340fcda28789e40cd6c78a366b257c1a605edc4b65cfc158ccb7426f0d7954485b10ba3acb5ed3bdcccb201723bc173ed5faa1a4f09f18fd17a37ab230e152eaa7b6e40f0fad889a72f0817ee7376c24f820f9c0a7c779a2ff138cab82f2d6bc04b037dd2c45f5f22349689a74d8710f68bd90ee42734f082dedb8bb6391c85eebd4df9bd8904e85e64735e435d54e693d3e16940abb8c45e942308edeb4e623ab38e4e328ffb9d211028c461e3354ce4a13f2d77b87a786b54ca3166ed868e00aac36146e9d04344ee17f5de048d7467da3b6e223f57e5b0b7be3e64fe412cbc36df59c7189403dffd39027260a5287df6b1313492a504531ddde22b5f009308f802774a6182d767e5cc275b74ed607c7e37a8d1976ee4ff780af2ab0d93c9fac6d0a3fea13b5026ad18f23b6f3fafb39d120c6dcb005eb598fa369e20dabe5a892666352c4a184cf36618a41882eef4752cd73a148fd7858a3a5e6829b563e2271b75dec2df4e3d16eb6bed5280dffc9dd0d67301588ea2424d60fbc1850413a276d09cca0ab32da2ee542bbbb2a6ec71a5770ff80d05a4221d5ace9a41af9affb255e791db4fa0719d08aed5da1301a32070d1bdac2ef4ec9af291d0166df97f60bb2f0a569dcd4e7c907c3087723c49c2c82d74140a445e35aece76d396866a3d6a24f6a63efa0295107e5d212e5cbea78dd1124ab0fa6b15084edb2dc8274d7548a6f7ebe238cf3468b7a5be57e35b96101c9502143879b737cfe19d511cd50706388936a6da60f83de534dab033ce31a42f4d35b9261197ea16fad312c7ae26e4aa2617ea31845a9c00d99a3822d616ad3d14c7d82b2a30d7ec0c4366e88333c348e832335609516db080303c886765f10eb35862e70545d66b57256e432d8255b1d80bdde73420372f1746e2567384374235cf17a33babddaea4e2754b5f440d16b8a87e35f09e88c77e20ad8415e317d5c7dfb16f1c90c4d26ed31e2f57ef57351c966fd7046360b79a54fa028d16ad51135d1c6bf49f815e03779e64fd4476a747183e68e46a4ece5115295727882b18524e9bb6e0cffd1ff7a859b5a069c60c155aac7f35deb636c1fb7890e897859c3d41c0430f680857d33f28072f5ce87fa3bf9e852cf4aef5d589e293f913d960b0deecc6d163dd3159e809d60b723f94c1db2ffe23171fd78da5c74a55b192d89cbf23ef543732c1ce8f9f7fe4d4a787b86beeae55e418fc4bcf886ababaa5529372c6d96980a3c59fa0494c83362f9ed5e84db38b65ad49fd4d867eb372bfc039dd43789947be540287f42d5ddbf002543afbe985bbf721e13a4d107eebae67267f443dcf47883f02e3a2b8f7189e303ad8046b8a13e9cca3402d96ae414a88aec97f3b9bd5b153a3e133cbdfbb9b80d7e1c38f76a18d6c1dea754d31f34e81b4b290fb610e475378a384c7f4194cb20c76364346cbd2d7346609faa44d4283a172474de2921a4ca28dd9878506000000000000000000000000003d3931e72c3bfa1c10b1be6db6b35e708e8317247c8e0e2148986010e6f1ba14acf7a86d684630f34a2cbe7e88b9b96fccd22e26f913db02368d89efd85fed4be26c188dbf485c62866fb1873424ba217682ec30b88c8fe2af29d2c2cffc77cc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000067f1231f071b8c71ebc6887501d749e3d16f20ad33a980676f80ac33a582e9d0cee51e50b61e5df5ddd6231a93b1c47932fb79e80f727150b269dc36b4004b068587ed9ed7e3d649a009988fc707abd32754b32b25ae4592fb58706c78e1ca444d66e37c67e31dd486827044bac821a9fb23d1da4ee09581977f71fe67d398f9030908fc017fe5a8ff5e5fda0cbf7ece450051bdafcb8f1181e57080500cd6aac1020c748e5e2e8e1b7415f0a5e3c2f08a11442fb89848479bfca0704d72274cf0d30a08b6fe5914020bfe9b79a578ba517846a121eafb93322dbfc0f01dabe765e9261ce497e22f50e1095d64fbfe9b388709c530ae5f5f236a94cb35ddfb510ad1e20300a64c286577ba911b5f57af8844ea8606f03bb5f54a6c2dd02021d227a224030321ff811b329136ea47beb76c6d7e1d3370aa9ef2ce34e2cbe57f8b29d3c6b21c02202b3d69170a73bf81b5182692087a453b8fa9284ef3d45d13559b19f38eeb730303bf248b818c6cc2c0b213a7722cc1fdae51ab1e5c4f40f8eaff83641765cbfb03220cd2381724d691080355dd5bab5b44f8d92ec8c2dee3b2cd08ef1a1efaca730ffbcddb2fa617f6b8a70ca880c043f8bc201036e62aaf8cae2a4585e642c94858b2489c0c00f130ca3e9722426673dd6585904147b5e01c9232f09ddbd30b03f8ce8e62d67e704ef38dc1765965062d20bec4bd275f114495cb56be34dcfcb2b4b88912c48a75cec809a80e193216ca55474e7366ad164bd10316083db06a31c122b761136fba55088564c4370cdc942950f00c15fcff92ee161f2d7ed124a6d0da9b8bee8967f4c154f97888d8169ddc8fd83e724dfcd43256048bffec189e6a91bc13d70ca3da0caba5a17dc1aafd85f562e295da6c576ec0563c412321459e1b011a4e712dea677deb4e1174ee701508de5bb5a913d1384f0cc03dba444f9b628d30616c55e2360a17bbb67d10dac320d5a21c76803371f5ccb8adafd6df2174ffc2ba3027d5bf61df44290eba87aae491f4e342ca598190dfba55440fe4b0dc9bdb298f7e8c2ac815d542b6b8a632dd4c6c76a3a90637acd95274e0d73db0faee820a97c14eb9e37b5fb13328fdf7309c9a5c33380f1c9bffa1d77334c5001421a20a5775d92ac5db531dcb3ed22dc2e2b7b0607d40295b7177e95cdc50694cb0cade2d31397e3680f3ab765454a01a073050c550a0a8083686d531535839ef88a5e4191b34f3af3bc48502ef6c6a5fe76bc3fb99e322d2f09e9d57d35064f075be1f74463f5ec230d8f6149044310d1544039ec0fd6666f36a48a0f6fabeb8fa3a4eac7d950446a1516c64137d81c8a1b10d478d2f555b3946d4dbe5032d940ddf57df8c0e335d9466ad68f639b7178b3f1748f6c6a0837b1a68d80a41820440cf552d59d0ad757014fc5e43f142f7bced1e0239cc70436a6424b49c1ede32971872c326a661d27c44ada164b4dae44b3ee6dc2ded2b1f2c843c8e2bab510f9eb8e050f4811f9be1e8fc8685f2d7f6cbf83ecf1a4db9414ff614f584f36a6742e3a16651b45fb711af84441dd76c308467502846eb1a4e313ca1c97dd3761e434ebb8c899b98baab83fd14c4fc45b134f2daf5aee3344c32b94f4ce6a8c21b1d1dc86ab03b13fcf08cf70d64241b0a94fbb3aace31f67f4f937427afbd18967f04065a938bd5b6ba8caa8dd73977d0c9a308a46234f3ca51877621525a6fffb44c510a3f4ccfe51d9a09e3f1573ef5b09ff98689100d6b9741ee82bb4c7da3f5db3734c23f884f9f3522cffd9dd490abd86f8386066bf3aca91541422e81a8937e6b2ed0c1d389e24a433e44c130f125f22c44366f78a9eacb51690ddd566b4621cee8b3509dd8344b80601f507cc7831da803d7e06d40353104dd50b65f7b9a85ced4e4cb9f01323af9054e26d4494ad828e2f3aa2d588229e9c1704fdc8e3da12bc28bb0a5715ee17342e21ba63eb0dad83b9d61644f985bbd7df578eb5906e6a32f02bbe081b8d4800b3bbe3544fe0558d076a90efba46f15f45199f2a091cbf03bd57dd49c69a21476652b6ea20a54974d64f46633dbec9d406b9fc2b13460deb4d30ee8e426efe663bb21c76ed2439c54b115476889febc3be297d6ae6ce526585964945cc223d8b421625b499f995b4b218f696e7a72c2b97b561f70e94e60a2c802680ed56180aad956d89dd95cf93934a55a4a7fc56261d4eddefd7c46e061bedadad576146171ec50040d770be04a8733c98659ed6b57166ec0823cab31838cc77708b97646d3a5916550b46a6326961336ce48c489842a254f2a4375a69d22ccd53fe9ff7ff887fd9762ec6b208b8c8487ae84730a48c6b906aed971416fb40960698b1b3f618592b598c56ed353fa92092a627ce7f8eb43bd3ba8dae41af682cae4611ebd9c3b074307", "635153526a", 2, -1612124312, "c59cda5d0c13d7c2d43709c6ca3d8e559fd2622396317781441eddf4d7c7fc28"], - ["1f6475c9049b26acc3676816dd3aaa647ff904c54533a8103ff528ff1dca017865f64295f50300000007ab636353526352ffffffffab544ad4326bb45f2cda1afd6900492b0fdc1f8c5e28196fafe5e652f5c424bf03000000008767a3d33fb3dfecf70860c0a1c060a78ec22047f85043a23df2b9f85a294d0e12b42a480300000007ababab65006a6affffffffad3ad4a67e9da5cf09c9f6277a79c5beb9c994dca91c6d11a2ee5ac537a27aad0000000008636a6aab6a53536ac212057603377e3c0300000000065251006563ac705bc603000000000365ab63467131020000000008515153516300655100000000", "53ac5100ac", 2, 1025636861, "0ce4ad3390de1442c6b75dca298a3a5999093629a22198065694e913ae7102ac"], - ["c94f421b01cd130cbc590d508a01840f938d221e8a206232201671bbeb2322d95e86329a370000000009516565515100abab51dfb9d9f00328f9f90000000000026aacf5b41f030000000005acab005363f9ac260100000000036a5253acecf299014974bf010000000000000000000000002ac31ebe3e9886310fcc1b3b34441cac1f4a1cea46fc3fd996c6b63d4096a15f087dc6b200b94d46310d8e3663075c73f7f3d40a2cb9bb74fa68031299d919d6c04f659902443e17bb18f1157ade0349960fa91383609ef8a61a36770cf865ac00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b42769baf0fe750e1e74527ca0b7349d81cb9521b3aee1942f32b4a0c763f7512115e32ef377d0d421fd6d0026ae9f568e9a27e6da38f079baf1f59f0ef84f95f3d35f40013c94602873ede859e324a856273d4501e5481fd9f11906e26fde7e43763508c32bbb6d08a1a4f703059f0f68e8faed927cf5eebe485065aef1e511032f3395523cac35d43b1b0e869a026d972b68d6cdbaef1a5433c4c7fe5af83f580312fb4a868af8efcc4a1bd55c3bc071a2ba6c40d81d8572c48e9209b94494bee60a0f44837fe10167e746773393218e6795103b1bac7d774849ff4f3455e9fa13b603c942e3e2028388052c08f7dcab7901c8e22f11c1e729646b34d4a7cc36d67f02002c4a7902198dd796621c1712f7ad1b718533fd9a55b540f90f19783e9b9fe602128ac1d87e2985589f060fcfe31548db979ee1fa4e0c7673e1bfc7a11b152559032552cdf68e5391e91e467b35b07ddfbd88d72b3442e56eeb7be23fd7be3aa6ca0330639194317c3f9e628820185593ef004f49359b4ec0e1b8fe54fbdd5ddc6ab50223da9185f89eadf8935bd830adedd7b9436163c6d8999f385a0f831c10ed61850aa1dc91fba1c3a7279f09523ea4f28406b21ee7243bb2f7f4141f09bdc639d18aa472f4251ab4893e89dfd9e265a9ac29a751f15fee540f4702f558c151493aed1e8b7f82e47c808978b67ace721b73a4a23291dcdb8e45072d8c7c747b797c4661928324de4ed972a63fcce893b367fdcfb2179b861e5d79330fd57ae13071d57b0d8de7499a234f5af8a453ae4082cd32b6faef6ca7e8683e936fa39fdf34b37d06a775c5f1fbd5c9638d4bbfeeebb586fb5edb73aeb1c2fe51e53424c2f28e089294cee1dfba9c201dcf08874a97bd5085898bf341bf94c479a7e45a8ae86a2b982809e23e4abf96ca5be7776da77126905a9fcae7ffeb0fef10d6a071c245c2c6f83095d5f9af76aebfa339954a32fb3caca1bf45f4b9b7414c85771ed7501c0b7eb94cf9d86f27d5560be3486f17b6fa38c1447f286319a9ade7b294ca744859fa8220a7419f72fef564f52f09012d932934e1a7af66fc1d93ca2ae692c4ef6ae83d1ff0c5e567177f823822391df780ebe024f822e09d749fa3b6107d4922e32399822f0663a684a78c22f75efe0c0bceec6a1429fc134f166ea605338a3f71170b8e5949a5b8269a0381b7b76c9b96e2d4e328089b619f43ae2ebafddc43905677a11c75f80416aa81f4a934ce69f9e680d62122434417b487b3122eac284885e38c07ac6b806a68f817d4a0bd5e9171ab0097f18e7353cdf7722da22f9bf55f50bc9aaacc9b82d21cdb58b1fc5a37a9a448d569639dc33b9645aeb435c74e89bcc11a845c7be147dd48f24ea99a9ad8a521969e6e76663f35325b01a38c79d074597974f91347b4b0758781f68095150be89f30ded30d6eeca4ca61e473e557eab5e9449a3114a1a73034bc6db374be65110d07fc63cbbf83a1fb88b686c67ca6d450b41073b252307cbc88c84654fe7d501a727339d1785bf631dc4452b2ed5b0d40f18b146b5e1126babc811e4b41b7c5440795985d9bc8f9f87d5b4f3d80fdee38bbb45c5c06886600bd2699d5315d7525c77ae10ea28351d5895e9a1653d3b09eda70a9b1f25ba7ca0b948c90c75e996b7ffa13b8d6b4c3324adba89b81191a50ae045352e5f5a1a18cfe3e7e1ff5767b327c5f69f60a19b5f0fac21c89641f06c0f0a02e035ba77ff3e809f09dc00be454be86ca265fe6d6d8fee72ae731e9dcc5a58f45f90cd2af88593df2dbcec6dd652fc526cee2b1babda8848aa102ae0ed1db1019451dabbf825e6b5674d84fb9094bef2a5ce201866f54cfa038675d85efd1c3ea689cbfcddf2fc317dffdbdc31edeaeec2d628e585447590d2092305ee0c9a4a6869eeffb950ecdd636d2f518d6ca5af6b182a0625b4769d9a1bb98456a907fa966694f5eae28a478d5de8eccbad07439a4a16bd7e78ef36a9e19a1d1fb64564fecf2baef045bc67c8f1886ebc6d5d3c41ec331b701eeae7e1b9c8adb67ea50e54cfd19e1959f4c7c866920805d9bfe87c58e65b9303ddc34a5104a3ae49bbc923db7e9ed9024eac561f95e635e4ef5e98ea8ea71eec9085368bba488fb127631d6185147abbce28cea705958e36db3373af693d0365866fdec9ef546a3c47e21ff3bda99b695b84273768aa846e7d9c9d662d95ea8a2f5a55c0ec11a1b6dcd0a4539fc588a350a26d15c0e6109d7da3b197c1c0a3141e8ac9d71b0d6753edb7842aa718c035b68efb6c8480dc3a6431b72f936f9ee867255a2c60837d4c83e8fe1b888b99c9b9e220b9d56ba7cfde69e4d9c3f47e396fb1151f3714c0ca05f74f4a1ea0664c11ca9e255f67ee310b2ebcc48e3d7dd7ed2ab7d088810b141ea453408febfe7930b", "656a53", 0, 107611704, "a2deb721b45673d45ed38da59a17a1e839b2ba6a243a8064616bef2edb1618a5"], - ["a9f3a5510467fb857674a3f5c1f832394f6b14ecb0f33e13fb47e1a295a66bca126730740f03000000075300656300656affffffff17166f3f106590a22577002fab710751357ec61fe2e75433255670162f1b5a6b02000000095300ab5353ab525153654c913e7d8bf21efab8dd424396ebfeb1004865d445b0ae1d836efceecb90497a81330600000000026a53739d27878853a44a4bbbd07ed256907d959f8e19a89972dc03075d2ba3507c5510bfd38c0200000001630b2f8a1e03ec5e2d0500000000096a0053006a6565ac516978c000000000000263ab9035ae010000000009acab53ababab6a52520000000003000000000000000076dcfa02000000000e884a785d7268409dd4d48b9152a462c7c4d9824e3a7c6d972ef541467c24372f3cf5e5d8df9473b660fe0dc22ab438559d3c200c8980ae018ea2b893ed5f90855469624e8936ff5a35eb302dee30f28cf2ed2cbd17bf8cc20c55a78904b9520000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020becf193bfb20b6b4fcaaad1dae0847e1e76d134fb6d8c28f3115f25d01b03437ddafbe526a8ca9f02f97ea11b3cc85e7cd8c4aed6fd1ed04c6efc890b77c5c4f1ebb6a22f224715c56e7fa1a976388ce0bb16fb86c649f0ae174982087a7447e0b97bc6dbdd88e42f8c364cbe0c1e4b8ada265d186ac0ab956cefc290d3a63031254ac12a47714bd2b8ca2484833858a5ec60007344a09e86591970d20f57060030539e3442d7f742c706d368bb1b1e3b566c0dae1d490e15dc04444359503d0d40a2fc8c23821c5a65bc5a230a1fab25b43e57fae7db16cadc82bd7661dc820dc711de1d4b0371f2fd92dc7a7723b6873c6e5964de2d0a20c43ad8844772ee460880201092a8de45afa52317bb9ed27d63e3634d86f1b3c6dfb79c4621dfd2f31f2fb0200efa867a6ebc27cd972f2bcf19431332df0c5fb4251783e7088e57966f2379303059c7eba743fd6effa0a1cd658265b26eb18c658f357511c4df30e0cccd8f97f020426e9f7a2e02825cac9fa771e253bc1481ea6cee0f9e4ca3ab4b75dfa1d6bc8022346a5660025363af68801db5caf06550c58aac6ad180d66ab0d32891478e8d01acf3593530cfb26579267afff040b0534f655c00d150e8073c7d6c46acfab84fc77a7a640a75ab680d769974d12c854f1e9440d01e31e537334817c64657da90b4a1d8f9a1707d4e1a6e7c54b2cf5505f48a7b10f27552c41b2b865cb0a362fe3fada94f8a037bde6e12f9e91b7ada4ea1616b612d6a76bd402300362677d011465ad63569e66350458d822ea0105546de26817bb7b5fc5f9104c23affae4b40209a5ff986f2892d138abbe9b2138e5edd4937609cc084d7628258a7d042a182fcba317abf91f562dcb1286abdbd851b435b40d3dfaefc055ea0bad69add1c4d8f37bd70cd1cc02c3122e2c49f487f1e8f4800d7ea677c2afaca05a3caba6686dd857be2f2d410836afb01ad7e65b51cf372cedb320cb1f3fbe06f4ddb154393b98d2fa5b6e5d7d7b5c6ed432c2aa3629b85a0dec5c849b580a984df9120af3f94bf3ee6077875d5c64cf6ced1d40458a329b6e929bded890418a2ba12b0144a6af86b967181ce0f5f468032f9b3bae4ec37673792cebfc2dc7b2e4ae364b5055f9b331468951cc2dcca5bc0cbfdcbc9c373abec2c2a92d81c902a15b8c397b91d5dd12bf2a003239fd00b393f929da0f431314cf654ed589b3cba7d1228b5a9b62d7c3170b7da62d45f86191885969fd6356f890690c8e9747c7e7c79873197934f7bdd699dd27c35aefeae27f717f222c6d1d7e3cdadbcd7e380334d60ca55a185a108e9105a61e154506a3be44c16e57d8719e04aa4fd01ea58e7135e87ed08efeaa48f64c7e2044674578d149cf7f36926e06ed4455d8d4df61a5c718b0d3b1c4eef491e29463ac145aed6319899ae3944b923376cab70a570eed036df82235181e187afaacfac08596b47d4c21bf7d0dacaece79a3adc628287302befc9a5d51b4e27c66675e9f0b79f9077d262535fa3d4d902a36bc69c9670955061a1a4cc280f2546930e310f2b899abfd020d1fab369290babe262d8cdb4cf233e20c988a251440ceb1fc3e9e6caf20517295c736ab8d43722b17b3f8c6705d907daa47f4e4dd95c574d235789b45da9563d4d541a3274f8046ad0f318a1f25d184d5386a4d31475b649d4fabc743105388fdfabf53a0cbf702776d1f16334fbc0cce2714c48f93e9682eedee13e0aea17130d999cdf9699a3399ca9a4311b243d49a8f11a93f76f882a1260ee6709546290d3d1f48a531e2936a3564b86cbbeb81ca76cefb3432e2ccd0c16f0e82a31da4e8d3d76b473797efc1a13dcaa116b9d732874d18b1a09737d6f15c272b80fe3ae6399a741d1355b24f7724b87323a37551c2710f5b99c8259075ebbdc3c1cb0dd8db2a49fd732503e75ab2fd66bc8339d67002fea8b40c6ac43580c1d6e95508c87449ccdfeb7b91b66e343d0114a563fe8b58b9897a54046dfa8cbf4f43db40557658d2ea9f5322384fe81cac5f2cabd8f2d4bb14955851b0115270f54369bc887d2c4644447bd78b648f28bf0e646339ebad7cd9c7bba4b23aa130bfc274ac9e44757be19388c7f8604f9e89710a71dbd863420c69f5a55e404c49fa675abb0aedece428b69306efc5dacfcfce07873fd47a47fadfb307250bdf2397534e97b57093ae3399ae0a79970f37ccf574b435b72ebe15b69bd970a9337102fcc999169cff84c7c265373156c89761ee939011c368e9b13840c6ee8b6351714c3a958a610a47d9000000000000000000000000005aa19a0831ceb3f3464d046dce7a09f8100c59520153963f91e71d84adf7e176af18532330d56206fab71d33f6edc9067a929aa52a84c7abd8b37db08c5eb2c93d8623285e27bf87c16e121de204281b74b66a6745ed82ba0a75c660790c723f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c43d1877f2a46ecd981b319e689a3d2bdfe1c5d0356ddd30909971c46e3feb809b5087cabcfc53f062167c74a08f1960fecb417187a93b8e2a2da5a12c4386b69fb7a1791ea1fbfd3ee807fe1d4de10b0ffbc4104769f21f1980f85f479a4181fa185a6061c78b764bbc088e010865ff198f15a29c0a50ebcda0ec8ad8ecab903046b58a71a9bf4f4c44ff4d7a8127cac3382f04e4d2a4b8867379abec5fe76630221992b8f041ad268ba595b1c4577cfae51ceae93d5ba142cbc61a7375c94cc530a094b1bff5a081b9c20cd03964d248ca5e8ba9d7cb00fc96cb4ec396b16cb14272eb198f06003d0724e5800490786139f61cc88c8c083a7dc0ce778c75f8250a102029dc8a9e6d58f27dd1f4d160ae7269eead42d710e4bd0260dcdc4c2cc4fc092031624573ed98417c56cd11212343b57cbcbe831b47fab301e7776be83b2b8c68103075227c95b6b56657d715ea01cb18c0f97d8be78360d24b080c23cd6fb61b403020ad49256ac29079227a9c256d6a5a444532292e6629bcab35e2e0f7795b6d8710225813af57ee6d595aac92405f1416dedb44e3bed61e2802c0f73051d38f597b4498fbefe4f30756962b7eb0147bc795887c366a7fd3be30e8c78cf18919893a6768d1f7f0f4f9ffc3f08a9841e95321644249e78658731e8905be0df875dbe2ad27ddecfd9af2ba578af5ef5c17ae088cede16bf05bfd888065da4fffcf903458e8181157a55a6433e2c062a5edaad0533b9a80d096feb731b430f943e8cc36580ae9fc41cc1d8ab9b143f0e10abcb62bece9462e49c907d70da7cd54e9d7f31b439394cdcd9be06a4bf678f5e0cf3c8ff181d1bd3f3dd8e0659ebca0dc92ffad1ac06d372918ed68028cee77bb7db1b195bd0ecf7dfbb1a4a1d10c7bbd91de1a9fc3bd41468703528eba34bde454b3584a51b3304cfc78bc945e0b18247690d104dcdc96294d8603d674a8497bd19919b7d86fb2c90d1e9c9ad709663ebe602184834ed5751c17af5c2f6aa705e713f1543fbeddda82ec429a7ed8fb216a3c744baeeb698d8521bc34985fca48e07288245252f8f19a3f0bba8dc08e599d2f459230f6f8acef52ffa41b14d74f84addf92216af570d89be887f1fb459709100abb47abe5043fb70b01ce8bec7deccfb7e20886c2208a2e288dfb806b0a958648ab0df13480fa7bbcab8cc878e0f28dc6e85233bb177aa081baa067f4ce1da17591187d32c6a6401de1a79b361af6332e6a32e62b01a36c8cc18e19a529c3649e7c7206262f616cacb57bf94303bce4f6b851289108265a65c0282c7484c7c5c1bb04d5477e931415823478733644e3d8aab559a9202a70c9e1f902fad053289c085b22cec380c4f4c66e4a3059ba1056a80c4f2bab360b7235763beecc55504b794cc7fd4e4bc1e8dd6fb4e0a441b192d0465127679b547d3b2d37012badc74cf6fcaf93756732e68b5efa19bdcc5f023e947cb650ed9d98c34b50b019d87be6c194dcc6a3ff834f73c4bb61a96b928733473a782d688f019eb123deb5cdc558855fd0c1ec6ad3f8aa0f55078e171bf4f2b1e2326e4acfb5657933d37152b7ea98d2ef48026afbcdb29e513ab3c7470a0031f6e2d0133fb017b2fc328db1138876323cd34013a5627b43005ce3575654eb3ec4df78ae86d372e1c46adce40aca34552eb2737a38424e003e7b5d7284a6bd9bdc924ccb31015b5cbf2767c8d7a7ec6026053b01175cb9e026d005f40db3ed028ccfa8431c3bb3c62842476a43169ed48bd2942e5f2d80f338968e9114353d6116bc9484a501b01b693e05282be7ca23f8384395f58ec007d2d8497fc02926f899632b0a9e070313194a48d4472775160bf80b88d928041446c9180a0ddb3791c557dea165576d6740de2d0a4cdccad8eb176a011d64632079d6d96280eb0f37c0bf35ad8572d969f8bd9848703b85be758dfe4e1135be346a14e89b1d12b7a18a5a8e16fa1b1b331e31ebb0d70f00ea3e0bbcdab7dbc73eedd6dbe529fa9ed2fb4e2441733694b9c79e53d5a0534e69d3efb958196e301239e686bb4e486188c264314f0bf7a87ce3ac4f65bc7139106335b43cb53f8a36d05b459a56fe58e751ceabc26a882877a3d66b5135b3d11a5fe7711e1ed2a0f57f34d7ad403d3c356256015a48b3dff6441fa585b780ecd00f2ea1e6385675ed5ccf83e519f22e5e5e3d8bae7d5f518eb9f8cfe520694d1eb967093cd5ac1d3477ccf44e8e1cc39a216b5c70de7f7d5e80c3fd9876bd02219947b5d7e430422a684bfcc69fdac5de49b3103000000000000000000000000d2af3bac5ad4e758d9380c8befff8372d6a3651b935a015b451a7fec50da9b98cbc0290fac16822f7c9e095b4fb5ae69757af271dea9926b47ba5f42056d428610cf9d9b8a94ba7fcf491e3b6a37e37fefd403cdcef2b22a5374e626bef2e91c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d32cf40b382a245d821e0f5197425b8e50cd02ef27da641bc6e51d68c3dc712e5979835e06cac53943175c79c43804c886ccea09c129cd429acd10d8fdab61f2f10802ee88f1babdb8ae8902f8a8f73c78bcdc68da7512ce6902baf9b8ec424dcce37122a1991af34bb5174f7665fae46fa67e436606e0b4d310e40b49ea1561020e05eea90b9bcc517affb8ba97785d224da332bdb1753e290aeb8302bfe75d68031666d94be4e3507ad6bf911040831f9fa3daf5a44866189ef43448a1bcd70a9d0b21e3b5a22b9b4472918de6b7fae452db4910ebee92e1fd1fde10bb846456a7b023e7cab89ec400ba904777cbf0275c0e24f656a423af7f64d1c84a7fd046119c0322496f937364eef01d7ff28e78923af80e867d644ac46a4c4cc2309a2883a1ba022ce21869651a5c9ed5ab8a59c631fc0abb5713cb90afb6a3703bfa3a34680d24020c3d23012b46fcaa1f3b0c4f4f68835980fe9dd20b07e2972725b8c21953933003141b31f69c651f131acb40a27a8ec96d004126d3e80f274948f5d1feac5e55f80217edde51b5821e25a57f74ee832c5d6b97e7b2b37f94da00f88667227a5e895971483e4a38c50e96e97a8e1c5f7bd1e411f27b52cd09f5e547177820afe2f8085c6e514616b9a852cc334a5735551afd81462b41b6e16413ac4384df417c666f281fe50d18521a006133b05a51d75a6d18decfef80f5d8bb4047c094680c9948d754d76019a9ff70e1fcdf34586e706b02d751c802676a4cc3b976534de54cc4a86c15aa42a0d05ea64924949477856947be20809c3f7ccd37a326526197216f0aa636e3c8d931f03ae7ebc314d9f98faa1c2647b9395a811ac716ecc2aff9342fc72e93c0820c078b33206dc7201cfcf465ee5b39e8f7ed8aa2feae319afdbf201e7f2dbb6307e52332577c1c5a222ffbf7e7c151dff4a9014a607972fc2e0b0e5f20bea147c68dd7c24657cb47ab428a35a4264736e589fc4019aad1cf7279ce9914a322aa7ec261c673e810bffb0544e4ac5078528b969ded45e2ddacf3c3980d1091d6cee3fe63278ea2ebd928d3cbe6019c08c51f960bfbae01266c98b98dbca04086dc497ed9fbdb05f93298d57e2b709bf8032b3bc5cf4e6ded70ff3b64056e3c53c283924c2a31b4f3734f6a3f660fcd5a5526e31348b2a8fc1cbf1125afc99c35053c390aa74b863a900d998eeb6ad46967f4ca3454f4041bb3593c513e17033e69edd0bb1b5ca531b0a6ea2247d701b85ec07c7e2e74ed68666cf4b2b0d205aa3cfa04c7b8a1648f0b820bb280ab3b25e2c452bf06f3c03db2f44f94c442ef6b7d1583389c9e4aa76abede6ae01c22f992ee3ffc0667ac733e11d33d5fc3ce2365f345e67d57fbc933ea626958a9686c8047e52561c0fa8d0ad7637dc9e5a446ffecf86e1109e829789f6cddb139dd916e7f483a27d7bf61a0b8aa07751c8261f5098b672fcd061139e02467f4e6d550094173bf6720d014238e66f39ae7a14a72b440d571d30420c216bea74b7ee323739cb9b3c7ae7ad4008a7766cf9b2d7d1b4f1fe36618c01c11df4711e8d6293edf0e7accf1c2620a83c8bc2a426d19b1dfce3293029616f758bd6f4fd51c9fefdfe4e15735ded92c552621bdeaa7a51a80ce6c229bd42d4df72d34f13d15de9d8cd3562cc910a7e54a593bae1c02b5928335083bfd2134fba464d73e3b6847b520429206edacfa1e5cdf88fea5245a5c2c394fa82950330c4843292db137be2e11ffdd5c7a1b128789b6d465dff69dd48e0a802a2e9090a6e428dd75665e944908ebb8d8ffd40901c3bb586d6982245fe15285bc1ada4e6b91f9c164bd998df7dc3656992bd274266ab9f2ee40de28e930e2d073f3b76d8d6dae5efd4ee43f2070ea2f706e448a9c0d4f5268e5226d043614fe06a975efa71f63dc92de5a97546dfbc003a70849ef4de3e93cee20277c067d72ecf3864815cb439c55e8ccc409acb1888a1060952dc0b9b66a8d115dc23c40288ade6059a84fe852ee362602dacb64eb3a20f2a376812f6cf4ac6eb058a6e2c77d5cfa66e4f429221cd8a32f242a1f6f2569aed7d5d2e5497bf391d0f16ba462a5d18f600485111cbb7f3edb818f60ac910e39c1178838527e879ee913d39e87abfdfa9ee3a3b6cff04ef04022753b9ee68b36086ad3816c722be81b38525453f12df9588dcf032e23b0eebb2a424a61e3b37a85c4b0d1dd78689fc90ba5021e6b21875a9c6bca6ecf452c57d3f870a8832a31a3210d9377f476fb7cd810086f687ac29fb1ea9823cb46efde653faff3a2ece3e3e1c82a579e01988f1768c2cf991aef55150b47b351f9e916d56a9430cf171935edf964568e27f6e1c10ef24a14809f125869d8741f28cbd35592af334594a0d313775b976999a913ed77d042d88069549f348b6c490a", "006a5163535153", 1, -1278062566, "646573a74f95625ad6292b67eb2e7b3a3e47c5c9a7a039cb077cb23d02a9ffe7"], - ["fe0d47e0038da737989be3e12a926e1f43a0c27e01d34d3ee8b358b9ab0e4de6692fffe8ad00000000035351ab2948a60516a7e96ed259feb50cd1ff62e3858900b1c1c9067bd32177b004e1c82ca45e9501000000016a096080e72436612083a7c2e66e3add1c1521353ad6ab9a7d029e6cb12fac6e3864ccbef00000000006536a65006a63c41634ae04d709c2010000000004acac00ab56945f050000000000405ff2000000000002ac0046814705000000000553515151525bdcae77", "636551ac65636500", 2, -3340207, "95314e3d1b84e28648f0eca4a1f9337f92d5fe652c5b3b178bd926a077d89362"], - ["c0acde4704aa909f5d532fde665a0d52c3904d86395f1dcd9d12617bffea8352451ab30480010000000252abffffffffb524d9765785215589ea2c6c4ebfa9b9e37e5301b5f97a0a47c08c9033bb25fa0200000005006a53ab51ffffffff2cd213338b767181caa2c669ce8cf8456870aece35e5d85545f66f4259bd589f0000000001525e77af7dd0b88b8a9f793ebb044647e537cf63e6e921fdeff4e49338f6465e8274492ae80000000004ac6565530baee77b039abcac020000000005ab5365005374252604000000000500526553ac0418c90500000000055351ab5251dc994cdc019e061303000000000000000000000000475d9464113d39e4862d69ce3f0f3381ce2623b70864ff47fbb3e3e9fded64cf310b76c45286f08fe7ee837272384d22c3d395081f43dc3984a3c5962048e9453e56707d3005c4dad15b0f4501109adfbc5f3fe61b42e0ca2d833290e133fc7b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057c07ad16c27fd386d7d15d9aa317b3d4547172d0e61eee9fc6d8829055f741d265e335c90b2b963ad313898d0aa5d568ce834d59b67e4b36a84dbae7b8fd2914f2283c44f6b472b60241c31ab84018c8c9efcd8a68ec0c81a35483d0bfbf82fa42f90c8258f3521b64d7761824a07069a19ec25fd27016b7ea27ec3899a7d2b030a23c1cf3a58dd0808514cb700c71628a36fd3f3eb8b8a0c599768eebc98a0ba021d5e1bb84081f938a86ddf00a1170b617d33360d48618e037e6423516126945e0a0f248f185279c77a49316c6ce8ceee84845346bfc165bfc42517f83150da8d050806478d4a164ca53aff027fd43b97f448d4bce5eeeb4b46bb73a40247c077f40203693f7bff18bdb1032baf95df80850b72411082a0cb36cee3e6e2e2636e318403213c0de3239a08b3b76c041291ef62cc233fb9b8d3346389addf7b882d07ae89022b2c195a6d73ab415c92d9a716b326e334de20c1839714def1d0aaf7929eb8e9032faa074e42b52ffeba6f0c654d5345c1ad31ac0afcebb75ba7fa6ccf0602622503288613fc12e58431bc529657995dd3f40199cf37705120a9ec231bb21c746f993a54e66a04bab7cc9f81bbfc40c1f008a349f656a1cbbacb290d0ac33c67579ea313df804e9c1dfffef1e980a93ac1de485f0f16127eea137b1e866c6c2fe47dd24bc8f2c6522f9d4ae0ca685c5b2c5094cca623866b3aa619dad4b1c01f5c2b4f893079a5a56d43216eb199f2cbb1f0549f296cf850cca330d584c987c13b7e1e0ca2441ffec6c5d7a2727ea417f87bfb479a691609e0a8525cac51350c3672b50abe0c2f984e28ac28cd8d8d79fdb1d240ecdf8cb8c8b7e2159737b1607b2c3d8b29bd61e80f7c59529a2327b3e0926b50df31417d4e66d58363c531ace5d007100e5e97335b212c81700db0dabdc75787a29c848f81e81231d6b24c93144e85e8f8182b32fa96b25f0281790ae86fd9e7af7e528d6b81e9d52a803d3ecd63d167740c70a0c5aa3b1768133e843b890d9f15162a50592f1c05105faba435e765dc8357fd0fdd2ee9841f4c8604fa55e46cec8c56258a7356a2af0e8577dabf1b7351294d7236d62e7e3cb71684cce60b4462df8bbd7c54ef2f5a977df4f4d8a88cbda04a232b2d48ef67056e85a8e2400899ea26ba0395c3e775d0499dd6ac1d9acb5219f56651c414c24e28cc150bcc48866b21064a8757018942adf6fa3e2e9dfa80c69758b19a3197008035b43808ff69b34b396b5acacf164b58f44eb101c2c92035f7f0f6a34be0641cfd57c0e4c3bb5b36a4f8871968cd61d87deb00f34ed049db2f40deaad873acb6ac928b49da68a2941a1bdbbf81570722b6ab3cd6a2ae8c62fdc1c0b80b800566c09c253a991430fa404eb35fe9dd7dc08ad6a17c8c71c1468711a238ea6585c1840ab916f90638fa403f529016adfc3533b508f3b7eff073011ce4957bab46570925e68c24b7a1d87b11651dc3e6c4b7bc2624d82bb96d32630c94b87415338453e172c0a2d1693b87b122397ceed81f84269c4d57797816a30d216a4e593884f571988cda75d2cd64b3ae7ccfd8145846d9dd052a9d9baa688ed310963f74c0b1a5936d382508ea8bcc01d80458dd740f252ee90d1a7e7614625ebad3403f3451e22bf026d1d6b4a80621fc7ccbc61ba879d76f3aef58cf89494d91f57bb57bfc9020dcda8a5dabbcbbaad986ecc475aab897975b30902cd00a362a1a27dcfecbda3c497a3a4d143b6c65984ae36cb44e7ee5f542bcc87a619c1e7a8d9af650f8316c90ec013fa5b1f0136e88bf4231d10f364fff3a02e1f066bc1546e62bab4317aa40e3d1b661d1c30efc30c55315f26bae4416092e91bbd403b3c288061d0651de3b411484c1a033542db560fa34b9b2f2b105e2fd47a7d62824d23aa8d9142075f5a5b9c9be6f838cfdfd02cb25f922f8cb7d4973c4cee88bbd69ac0d8f85d00d67281a4206c4b4942d072a2007e3a6a82a706633f839250497673adfd0384140fd7351644a4f5ce320ee0d465de7607241ba5f9572105d71479468936ad41d2a7eafaaa05fac6c3f8e41bce13955d32d43b7e0fa478a4e32bdc8573d9111810fc737e81b1126352e219ce5b91b03e3211f2d7cdcafc15965905427bdb49e42a5f71eec00d74c192bc2fac12879aed36043faacc3901a027118bd13b4ec1372536b5ca916d2623e5414f5fa0aa1bb766ed31050c5513813d98e82dd0bde22599a51ca13284452cabb604ccb92cee0ee0665c0c8b64a28efa51f7306c4c8ed4f02537f4bcc8eecc3d670cd007c10816fe4229420fa5abbba567579788eb985bc728db4c7f0a82b15ce5b096d46d5f2aaccae53f45f3c77ba407fe394cb26b720d8f6b61a8d5e61e8295be1c41ce67c0624bef1b02f580fd925f5002bffd180ce4a1108", "00ac52ac5251", 3, 582941288, "4ed0e37f515e78a8084bb281e5a6fe3cf07ad142b706ccf0fad56a82f12f6255"], - ["0256d2c6035ee62983e4a76440fc9c4236c33ebb1956e2662d3ff6ca4b091593907d210fba020000000400515265ffffffff56fe1c3dc85c08614c5ed393d6f14dba7c883baa25446c16de0d314a441fc0380100000008526a63526aabababffffffff4ab4361603447a992c8279b1a04fc2bf0eeea8efaa8236835742bf0e2185cf83020000000152ffffffff017af9c60500000000076a520051525351a5f75b64", "ac5163ac", 0, 124548875, "262e7b1ece99e0a5c8cc08f57f047a3332a7d6adc45de3a786a7f74be016bfc0"], - ["471f412a04f7368ebce021a19c89f9f36eed12817cfd20a8cf593daaf46e2dcabd9838069c0100000000ffffffff11afe59e938ab1c93cc8e93cbdd5c1029b2b81611149d19551d3aaee02cf5729010000000565520063abfffffffff28067031f7c31f71006cd2f6771b14f0f9ab07514c7414c0bf6ddbbf43083660100000009630053536a63ac53651905f68bef104cc28f7e5fbedb18a9f9931a1e3211a820c95193f4fb9d8341099d342dc70100000003ab5200ffffffff04e4c80705000000000865656aac6aab650079bbbd03000000000551ab0053510474210200000000026363c5ca690000000000045100636386a87cf900", "516a", 1, -1234865985, "972925a4e858bf237b225c30f94805ab76c437e5cc4e5808fc505756d816075f"], - ["2b26c277034dae93473cebd38ea1f5ed085c1265c61f1fc61882926311cedba8dbe56211220000000002ac00ffffffffc873a1081b98749d2b8a2cc874cad76a1281b8a3b28ee718c135a2b9c35a4b7b01000000036a6300ffffffff69525d5f8fa7817ad5b70eb847a1a12a9f1e5e1dea492fa8d5857d63aca0b39e0200000008535365526500abab322d659d04c85b2a040000000000c245c100000000000165df9b47050000000009ac6563ab525352ac0082d6c802000000000765ab65516aabab00000000020000000000000000d3a48103000000009137d52223eb9618dfd21efb5758ef35fe95b0f3e68f3dbdefd8c5f811cacae023c277ebc8e40b566b93d1a665bc8ed309b2215880a8211af34ea7fbff6775799d0d51b7416c021e49b98a76891423a0d6ddf44566a0f90a95926909f8ba1ae7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bdd4d10c3cf8bd0464223935e6eaa72cc4265d90b19ca04d0f6f9199e2a4ba34b6052ccdb08ec1bd294fc5b0f4294f056f111c2a6f1830ea5deb3c6fd8c30b38685ca779cc16dbdfd4231c2dc70aecba9a6412be1038631a37e1cfb44bde160342e7fdf100cf93164f05fcf0d9e4708a388dc8b63008248448f664bbced73f7023013d2d3e5a152f034c236933146c7e8eea5835aca43dcf8285bf45f15e2cb6e0222c13c77bcdbd12b35b028a2fbd48ff850603c7ee917234ec80a5f15e6ebcc420a05cfaa3d9a76e6b6fc99694658483be11aa64d34c2b914fc15f533635f6ac77e27baedf8c52a49f4f2cdbab3d7d6706215e77b7995d03416b21c51eb3e56f4c903190aff636953d7a6dc286fc53dd8c47aa59a447eb6ff06429526356234e936ab0314e1ea0d8b4f9a6e304f478711ff2a8591258bcac14acc9eff24d9740fc4aa8b032929c97b7944f97f361b87982cfab1b4c7d17a3d246aeaf183e58bca2f782fe203238921e4cebdadb4015f59772ece53fdd33184907d663f644a6c3eded4cd1b1c02063a837bb1326037d8e0f2cfb2e07fdd0a94343dcec72bfdb3e31c2c7ac6f6d0ec091ea73a8221c8228c4c06c5673819ef3e33d648ef0a3bb4568b9debd9841dd38b772cb59b8ed3c3475f1ce392e9092ec8469033e326abff655f9d4cea5f98460e4efe1eb29d8b9e593f4222a6d4887c5ea55ff0335af6e9e6f40514a268a8ae1bc88fba3c3a2592692d7b4af427ad2c1d5ab32689b1485a66751711bdb045b84eb09e46321b88ed662ac9996d6cfce9c56418c52ec8830fbb5a03deb087535b6f84d0ef82b936398d3c96a0487870d7bf451f7a261e29d3bbbc8ae624475b5335ac5dafacd132adc3d7778d6a865c33cf154cf14d0925fd97c18584be79e31ce284d6168f45fa083c68dfc49b731d324a22e86e29e97b5a0c4d76e14f08772f94d228f2565f5576c111e8b0a3f076bd2eaa3277e63b28b9885f8558bfa251b6b3a99831c6fc35be9e249ac84a08a277a21250e2c9ec59211f0a59b6cf76f68180e0ba03b08e48988b1e3b54885550ce478ab325d231d7505700a23a24f356b74319afbc1ad24a19dcdf89adcded1c540cb622fffc1c5e2121f5c1f6ca34a7c9ede9418b78bdf837281be6a9862c2043ac76430f98374b23251684c551953078db475014a11fb3211b507104beaf0970db1f0e480d32b9b295a61bc1368644cf054f8c3a88f5beed17cffce4229e2136c6debbe79030e29cd4c0ce53a5bf9a85498659b66e2e75db386287c24b1e85cc91f890a00a9fd78d3ad8781c71a8b01201cc1dde3791514d7a29a12bede3bf4968d41c30bf93b3a9afa095d4e70afe19501a14bc13f1b53c58c991976cbe5255705e974d4df367b2f869bd41f2ca0fc7393a8c918dc57321c6d1acab8c06809ba3252a99bb2f653a58e2bba7752ae41d12ffd7f04fe0f0565e0e41c4cbb9c5ac1fce0be2808beebbe52a2f5a4cb4142e8d1ea48f17c4b62881dfd1972feb93e21aea362f00b839c183ce86c3276cd85e8ec1c54fb6f3471ef79ac6241ae875282ff872585330e35ef504034f60ce84abd1170c6eba9e33a811aec5789ee564ff86ac958aeace6c01600ea57d35d95cfb2bd84342fd0472b6d001dee47cf5910ef2c61b82cb59cab5db7d0eef8f0a4a6fb88fdc63b1d1e8d52d3742aa9e68837029e2d727dd49da035ef88d276fec86c6d331650c85fe10cff3c9d01302d6f6e89f3e050bf1f1d87f6500a3d21abe9449072b51ef814a9d2fd110f0cac538bb55f2ac2fba00029b0f9678d04ba7d7658f3824669b7ff54f2ea98900276a604cf60343e786cc9390a06b2088522effd5e743ac6c16b15b33b5bc0b0ac3c17e3436acb7984fea6b82af2829ede04b74e0b3a1680f0957603229fb7b0ff09d5de03d8cead6d18b96a40aaafec65d62bd1d9222ccde1e4b0349045e10190ad0b350c89cfc4e463971adf9326638f1bb7f0c207d4f873ac3a92db58d31dd29eb24162d1c27b3f13a908e3b4487290fcd4f2f9662dafe6355ec2e8d8d242156c62199ec65787c6d94f4aba9332b1c90522db67ec68e35b193d8e01aeda90abddabe9cac765e47ccbe6a205a767e7023851565fa4da45c9652098715d17a4211765948d00c92c3c14135de645354c5bce9f43f55c7a336eb724726959cb73eedd085d70a28cee19bbac87cbcb5e563af0f8dfafc30c0083d75fec9f45cc47ee3fd64999ec6136dfe5935dc8907fe5ea271c2eefd84a27a1d499596243d682be2ac607f9f2300000000000000008c4b2e0000000000983fa7fef86a3b01f612d7d17f30fb78b910d86bd2b3e81a8d95354b689d4b87ec5f25c7ed6336921836adcf92053509d015c44665af7eea4399464d5f7302705d3b5237316df2c717681eb63276b31f9ea941e62a542661764ca2e0a895b51f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004de5401343433e0f4395bf0a792077cddd495e78957d5340f8ffbc9bd8f80c929eedb509521edc69c080f336faede9aa03e6e816dad9d387f70d2de28f07bef882ca59ff639b9355596204d709cd9c38edfc2d61292cba3740af91e8112ee0f87b8f2e52a107fc7d62c27b3e5701bad70ce99f1e425a98926c1f908098e546be0229e2ca399fdbb2fb53e4082b85a5bbb13e1f5e6c9185fd530d4e7d42d941f3ed030944aa06fcec643fe660c7de5669e5dc14ec8ac8f81f75006dc703754345b09d0b203049589c78b1ce3673a44a611723d3c0bc87a2c21bbd0c01276c457743b7f616af9cf8e17d4f2bec0ef71eab373ccb015efa23fe2e2bc304b3c09161f06ffe021533dde12fda2934bbef35431617b78a8d096531ffd1d6dc825e0bd9c312208c0307c9d0cd7c3a427225946876285e2435ca55936ab244d0fa820402db2212067b021ab8fc644ea41adfbb8a4fa138355b74fdbe060d921a64f738657c3c5c2dd836022ef2af93511688cd8f848be9838294e76abc7514bf056681b6b19b4a6bc81d6f022199f876314e5ad8712b6eec29603344f1b2cf5c158274d0c36bc1851835466839887675c92e21cd3daeb78e902298233a827e8197b32a845c3af7f7bbdad50203c90df34c9becb8166e14ff76dc6843dbaca4e77a0dee4f1598f02da3ce63f0ef72869a8cc348b4848f8ded91131eff3949e2eb1eef94a0ea74664687b2a2b088cf77f9d2c62fdea5aa41a13379a702ea1afd79d4e987e104f51fe82802931837d57b18a754d822381bee5c1050e578733120783a180072b05f070b02fce4f5a0889d862a9d132c26a76c64631fb3ad8ba8956e844e4e6fe6c53e114d0de272dc6a5ea5400fb1e8bc4b410b0de7f1757a442e59644d2149a34d8ebcd32f13684c1af261169dde8aadd6d8e897182a40352f9e66111cfaa2a0821c5327bc588a9831804c82c796221b426918181fde162680151581532367dfbb5318e16d9af81c2606c0ff678285414bbdd069a9145988b405b3b898ad1491b8d8a6501df16b678c7de54ef984ef266ec6195b5533bbe3a23ffdaf76d302f050d119686c10d46fe6dab67a51a5f98d98ce06c156c8ebe87d671a9abe2e4d135dd4ea6e9c007bbae4318e1b7c9772e6fce2e585a4c374b4410b5fa8af69d2ae6842dae95aacfcb7b30dcd9535b53f94938619c4d50b377764c87505cd6031912df1dca66fa892358687a2f034acd83c1d545fa6b7ef41b2b60f5b64971e19edef278ea5a5a8cc1149f637a13ac7aa710dd1cb15cc0283648380708444d8b1c6a6fd12fb0386f8c4ece7e681748289189b617fcae279136f7073a47a3f6d163e203ce4c2c8ac058c6dfcde3c508d96f586a1a0214da7f10e947fd085913ce46aad953ddcb7a2ff445599f71b90aa3152939a64ee99249a5a65d19ec530ad8e607af6ffa452988277af7b0bab822eade9606f29cebf72e0fdb2886866210157095fa45dec7d1a179052a862b9aff8ee1dc2c5a0eabcdf7c43593ac46939cbe8de90782d1f55f61753ef9290692baabb0f1dd2cbb8a3e91e3083c942ae3278249c697195b6b544cb9e09699bfc72d7b336b37938c3310eee4134f265b6e2154dd861917f9d3082b447fdc433a795524858b427685948a5a96196995b078ddfbe7961773393fcfb9864cbf851affc35efefed7a714e2bf1d2348e5d5117171e42ad151158e767c57cff9a36553ddb8908c4cf66c899a657db7b491c9eb09cea3846a51946508ae78e722755f335a7152be98b02837b41da186f0277da19e5ab4e0f714362b4125a8bb911249af4b9c3fc7348764da80c236be08239eb9ac34c8396748c545450f4d998d5fc0c3ce5dea4755d82b2d2ca72959a3190f1ff1adcf69b07dc42ba00439837cd817e9ea5009c1e897d222034773460d3f109d1a11a9ed16127c5b207551d143c4ae2bd1876f58080ecf502e59279a7bb41db9a26f05cba15ef44e616971a712cbafcaa595475bce899e7386841ad47e7e31b46c06ca6ef04193fdd96a48067f8ab87cfd04ca64c191e6c059f362e2fe8fadda43f464b02456a69e695899a02bc30886423895db9276602d95204717d0c0757f6c1fb50cbb10f35b2a92d3773cf30112568cc0f31fe394dd394f52c2f0d354e3d4faa2be0e1f6664c165e7a767a35d621902c09b108403c25ba381d159fd8815eb5d6aabf573f79e45e34139b1b6ee3dd070bc08747f81dc6d51dc5a9061fb6f602a2ddc19940330ba582a8a837a96ad1c64362b549eb35f9993cae579c1ea50f11cb3240330da6df383adf548bc9c75b1cc3bd4b2d288ce95d278d15f7b99cc8ac090154963bbc3093e9a7e6598ea597a7309cf0188db74bd41f33cdff09165a12b17ebcb59979f992895d7b46d5acd014aed1df5502e9c442654eee07", "6a6a51ac5200", 0, -267341217, "d2033ca30e40bd2cb89ea9195c732a5d065ccceeaf266467f78565f66a82b95c"], - ["eba18af004bf8cfcef337a5b833472f7744773ba90555e97b42e4b8bfdf6e1e02d0c26ebf3000000000752ab5300acacabbf69caeb0777cf70b40d31163fc265d338b388e04294714076c6e2582a3287eed224b4be0000000003526300ad36472653341effaf59fe698a70180e9ff1f24f468cfa2455dde2f8b3cc17ba47a1ee470200000003516352ffffffffc05bfe2a3da09c398f7487b0513b9f45efe969052f962314f422a4046cc186dc0000000004ab00ab00ffffffff0164f2af05000000000800006a63006a5163958a358b", "006a000065acac", 0, -2090116042, "5932ed1e27740a1810c1dd0cd1f235ff8bcf64d2579e40cf502e594d386e4ad3"], - ["fc4d72240382b4e8eb87f70aa50773203c5643f6993837fb8634119afbb7e96553d9d9c4020100000000ffffffffb6467961659e63b8441e96cd5eec4c5ef8bbb442826d3a419650dc055ce468cf0100000008ac00520051ab5352ffffffff65a1a0b0bcc1f353499143455259ba6007a289eec9160e84f6fe6848286631ca010000000565536565ab9d1d5f0401beecc3000000000000b88f6419012a583c020000000000000000000000006b887428d35b9f57beaa10a3cad2e233c57ec29e44ca4531b271ff4f52b2d9fdf066663253eef81ffac867472775291f235d913677731090e40cef467365a6c90c59f39e1a13e15257b477098568a2d57cdc08191f2122975a4cd4fe3d3efc7200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f901f1685cce76ec9650e94e8983e29eb0195a5eb5ed56c8cb8d314cfa309a6e564cac880a0a312d46ff7beea6c916eb77a927a22ecee1e03bb029a7ee2cd3e3c9d873410007dc76788fd27826e87660ed8989f5a3d0bce7150a4b209435a43dae7d7245f71a83b3661b917e211fd4735dfda69bf29241c048bf90e823c6cf7202103edc6ba683be3d97fae0de5430a5f8e87c4879337978a82c289e8f40d0bf1f0318b80d4039530ad723003b0527496c9f3c4322814934384ad27015d45151f9af0b240ada9efb3d0a35ec117899020ee65ab1b59d2295deeb7c563bf98f965d61d02c696d6ecb078a57bb130ff92724b954c924b0194f6ff36a07163b64ba42cb6c0308e17a4da1a157e78d82d135dc9c74e701741e56dea8ea6ad80ae6f110fff9ac0328616b2f31829bc7e506cfe3556ce2d7e549ccf9495f7418a4ded8cb35a11b8e0222204ca9d155f3c78db8e4ef6247ede93bb92925796f5a2b325f9e55314b06d50224bed1563db2c1552e6910e37bebc5ff30cdb249b09e085b1041ac51941b5be003202d7a22165fbdab3fa7ac27bffb5a3844a44e552b5f8c3330d7646d6c91b6603a2d717922bdb52244f1abd956928cf98ff8cf19a7e32c75afe90cbd028159cdbd0ecd06184adbffea2777da3b5fcbce80f7d7445afc9f91e2b0c1a9b6390436d7d7d5d4dcfc18b207fe0d9faf38155364af122c015bd32fcab3b7ce2451ece32531a8e792a9e8cd55a317c38e737b7b8bc6d942c2c7bcea43fac046362dc11ea9539efc2068ab4c561eb14525e456f0b4f63275d217ee3d0553485f00781ad7578a668e3bf93e586b5e7c53919d27c15cdb705bdfcdf2a6115d651c78576e78a84648a298c91796d57aefa36e9f97106ef532415201d70b49620c8ea4d9660837b7820fb3cd4184ae37303343f528ad846457adb486925301a4e0783146831ce860116f2707a9047f54c2adca7b2b5886cec503d9213bdc637b99d6b88f1f3c2926295c4ecc00a2098e8932f9c08930539fcfeaa86ced926935267c599556cb44fc44f8320832545f1e5cf9065dc7c5d6785fb650e38a1e49b8a25654a9e538cab841eb861ee6e1c26b5fb181d00812b6c83de5d48c110bdb646c9ea3025cfa45f4e1b6d4ece4273887dffa460378b2c606534a3340c37c62b738fcab1f0d3c9c694033fff0fe34eae94375ccbcc617cb2dea2d4845201637d352416fd0e2c76f8a5855a1da9e4598803f3a890428b94347dcb6876bca976e4050e083681306713cf62780f691c44b6291f98c21867e19d70ab2a2c55b40a1e882be0cda1d767b6938a70354a2b55f01e6ccba19efed93f049d865804f91cf87f8ad708f7a9525340d1dd549fd207a459be175a4b88951f75c84e225a8587a8048171ae6697f7f6eab71a4331dea250a04c94091a73e68e58f2d2cbc17600f2df3d488854f0bd1bb52022c62412c1022b4916f68559e8ce4b6a954087edb85c346702c4c704c10bdb8e3284baba107c095f069c3378791dcd5ac25a051771468004e349ed0740c3d83ce5269dc3e41a0445565eb69ab127e8f74fb6de22e73457f5bd5650f11db82ee0b4406d36376767bb57c5691544d1421dbab22027779db272bd9e29aaaa571c14599f0a5c01aeed2265434a9826e14adb8785e7bfd352af93953c6238cc092eb48ae2dd9b78f55a4e98858a84bb7175dcb3d380513067b8e95fa768bfda4692349baa8bf9572c3056ce3d702bec634162f377cab605ec1bb9a540478b623e486c229116d3d83afd483878671af63d1b19cf74ef864350e61bf151825d47f14cc9e0247d51e4e8203934ce33f3d3614b2db40fa349983a18a3a77121415c241f743b068f0ba36a14f1d577fb3d49572b1efc13d920587a8c7159169e895e50503509c478c83dc49d2d39dd5bddcf5ac04672fb76db6708af0751aa3f605ab775293a730ef3cffdd7c1cdd7be99cb09e657474542544902f515eb6e2b4e38b329f38ce602d7c083b12347694e6f4c9bebe3014b3281f68528a5c3cf139d9d3c91d883c600a0d56bd3b9c3cea32d1802364e3a5f1b8f17b1028d673caab6a3c6562a57e39845432ee79d45b81ab764cc436eaaae773cd44acb61a604f0d77cdf44e3ae44cc5c1f85d619ea99fdf0a4e92a80daf472cb6aacb0589c690d734f1585b934438e96e69ef675336abc4c1da01676441e307237355c331361f93b7d1b5dc57ff79def4817ecd27e2e803d017fa97f431492a55a60136f8ea88ea0628e5eafec19fda43abb8c7cf166088027d8673c618f4fd7d6a8accaa72fb5155dc9204f44a8768b504d4717533370ee79015f13b2c0d6b9bc21c5144520208c6da4aef1c90895048da5169a8c06b4894eb49bbbd4dba5c2084f751416f2d92630d555e2d17ef15a6f1d7c9cf0fa5c759c100", "52", 0, -1488314322, "63f5ac3840448cbd4a66fb2be6e822a7db7f18cf13b7dd3d96114e687c3790e3"], - ["372b960002945027e2e089396934348f923890b4ea27e086fc9072df4bc2e82f2b327ffe75020000000400536565ffffffff73aed46dbf129934ea2332df8c4215c754060ca5baafd83a295f3f396fa3156303000000010018c008820294d17b030000000004ab526a65f4a1fb040000000008516a655152005251e1a2e7cd02000000000000000085e2990200000000e8f046329edddc72c97f3d1cb7aa717ccb79731fbafedc182c62daf227cf32f71ef691a0d7fa6367123df1df8dbb3acc23f3be25a62f747adaf70c6505363f97df0acd2927471abe78a75053034231166d5cf6e6db98022446b0ee74deade55c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e7005cc04ea334d37d2b90bbe536dd35e3c7776ee5605c9d04e4b5f7ee606cb2281a5c02d5efd19cdec31b0c6e1f997df1880adce06ff99ed743efd4f2eaf1042179b009fc7b7aa00d44c59f995a0783535624f216cb5211acdc9e7381aecc34bb7aeed9aabfe26417d6cd194866a7f212504ce07c4d99eedf370eee18dc3a89030401ed1bfcfc32bd0c57cb271f81385a7dd85725d9a7fee7e64177df098b3cac0304cd93b58c085f36cca709dd8e0d139ac29640ffa72aaab2791c063f7c73ec6d0b2fe27e352df4b584dcb4764ab2464e84a9c25cbd6b06dc1b868ec9d723f183bf1d96b972ae79c943d27a15caf399fb286769fcdd73d0ab2431a19ff46d89f3310329adc4e42216895976b341375f9e2f77b7ab7f6d235a5e1c53354aff4f1e7a51030d1220fb573252d9db2fc95e2e672f70c34c2cc7644029d90433a15ef47df74e030764415b82de00258c9b30a3a9a294503cf365c9b4a9e1b26a50649c4be6547702125b3e3ce89bd004b507c041556e8ff7e4cc28502483adf79ff32bab360aefc4021d5998c80412a1bb0eae381aa209dbdb6ea1e4da1a52cefd13d9328a24868a4642077e14e0b9148d54d5425003fee1739e15027c9613d13d1d9fdb4592a7685603fc573c5ee8d78a44f20c3dd8ca6502737e83c1c491124a60c1bf01467734e387119df6a2e642a8c473d96a8eb386681551b350d7a3d088206befe2bddbaf04948c13e53b453b1a931768a46120d002f568eee2f9e847016d9ed776fbc4914db7e2875eb6ac8c5f05b505c38939b0389233ecbf12fde1f489f67f1f790bfa7c68b9e347ea0311612917d6c27cf8bc5989d2e47f55ba2f28f508c3f7b220e6c2b97d99e49c990780ce37b47ec991759f17e14fde543e0df04dba16afe54db0c2a6bf8b2a911f6aa2010635356de93933a9afbfd7d0d02d1b3beb431e3be893f669e7f9f12cd5e141e1c3f434903cf10fff09226bad66c3dbe13d17238cdc69a43c53559546de2d168f099c9ca84df21ec0daab96dc22c9a7de792f888640d1c8083a7581acc46c5358e188e203f580029b52ee3bd954db4a3f03c5434db1e8a24f18f393a01ed48efd5819c2d37e51e34292c0c2126bedd3b9b18b9008f517ac6d57cb23c4bfa2a8e7ef81b04de94ef6d161fa2a29e7df0ed74d8ca34b44f0a6dcef58ed30fdb223826551f056aa8d4565536c5a58070067dca102d0c11c5bcfe3db4b9140e0eba87de2cee18816ee2443490e518b90351ffa9ad3516217f3db675f253ef988968410ac81878cdd01f206dd9d76c5a42cf800b7e7ba920fbde2dd7dde4628b3e4000873ae132714dad125546d1d8c4fd64fda02ec9a5fdee87bf5a5c785978f38cb1a3ab34819ba29cdd5a4dc3ec5ed0f3bcd6d88b7fdf0eb3e7a565c1792c72348866abfbd1cbe460f055077e35a313aaf06505da5dee699680190a41dc64802b2e366e5eae8bd71149bd46d010445d234e8b16495caacad0dd90631daf9af5aae20f61fc67ad58ce4c2e32970c790755600dfa48679fea299dd4b38ec7ddac5adcdebaefc83fa0768ea695991a5e0ae786f752b307fb4468c231b08d58fc23c16f2032bb683c94251b6645e13482bb291d65e8252ae72c0d2bb2aff32156d67a04c1e6c14deb1b75a3b81fc15d67ae5e598b90dc69da4bd247adec8dbe39010de775c1fd887595bb2fcee3a6cdf74e4d31923ab865a35d79b378cc30a047e8457b108e39b189b25a65ad630f6c1199e84aa707b270d34ed10904fd5b014c70ab5733af09c0e49003f6a6fce81e70eb07ca7f536299ca0034a7448ce1d922b9531fcb2678a2ec74a7d4c287d5011016162a6fff2be04615a5f0ca6c03b0448247b96ef4bb0486baca9cbeb7c3d03342b4aaf94991db77cba2f53fa10622684e3a7ad697bb30709dcd147746e5e40a8f930f3415786886bc70ec89e1473701ece4dc8f65038215058646a68db613b22cce5480c96644fb46ac3a1a73e8992020a387bf397b848bbe6614101b44fbf46c3eb501363d2ee816c979ade40620f70720e3807b9ef2a22e296e121138950f00f3ab918cf5c775e9973ce5120c49ea74db15b4c4fa2743c41ac69a703f1c78a958b2a1bc6bfb704c0a94d2e79b7d10557e03ed847869cee9b4ea10b4400dd3f37b0a6ec07642fb7bb69dd041ab2aa5460dee54772c193f25fe4a493ab4ef7b0570be2f3563b926a120ef17417e415e11985aa693bb78f15e5a997e4b0deee6d34f209add737660a4ee3af277cc8ae6364c6977d785648b7c3819ccce01f4600000000000000000000000000da50d9bb6a6441e3ad5a83db49f29b487ff32e3f72179651793257b1f0df2f0cbf285d18dce0bb70d0fc634f5af99f4370ee834e36eae10216a0fff7f0d98afaecc34e2a30cd566328fd3889bf19d0dd66bb17fca14b600b6cca54e8f77e84430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069e09b3d3383bb896acaef245ef4481b8cedf3c31f6c2245687af062846433bf788e3eb23f55fe9b1215e1c933a0583a2f2bb178542b5fcecd0a7f30266eadc64e54f643a107e3450c58642164acbe6fe693f1d36e214c9f3a8f7b19305ae7647e138e11f84889f0234bac9af7e9eaad0f20ae7913c5aff9672fdfb329982501031057e9ecc1808efb4a9993f322cdf093631c5230ce53b85072c65e97a1fb2ba70203454731381b05ed3e0dd13d4c01ed32abca86c83d4640500d2280da6238cb170a2d96c6d7fb35250bbacc20edf287ed61797358a2b5721186f6c6ad90ae7671be1cd412dffa25f857ee3f28fd2159e6a149de47f251ff2533e90a523ac2b2e63a020a30e7527bd5c3cc10b192c4aa0fb83f958547fc2c9dfd67c5b5f2734ad91d8c0202b88ce0fb768c3c15010445335fd2cccb725743af5e66efed6f77487433e6b502116c69c649579f77bfcce709a673288567bd058c6d140a03d2983ea3dfac89b9032a8baf4564ae856e6965a6c79a95fc8db27f30152eb3e8f3f1eba4a1a6517c40021c53c6e8fa76bbfd5f19f0fcdd1e1276e5125afbb232d3bc4452bf0a905690b214691056b91d7c9d99ef93d9e4a1cec109a505c9d58763fd57e76883b54a299873634245050f86c02006478ff92496ae68f21639b5ae842422159edaf2db7c8890b8d67c03316b5a9f87082c02ef988f8d508e0b104a334f8ab3f211e6f0346c717ac163bda0b2e29c13dd5cc6e7c139718850746f30613a17665a947a76b42bbb34c7bbc003f4d4d95e1d0089bca9033b7df0e3189a79fca3f3cbba5526a6ff73a7ba29818b05fb1ff26fa9c844f54febc0e5930726d8a9fc8410ee40869ba0f202414973932988fb007e4bb6b4ddb3a888f72cdee3e1354c0ff1d9e5602070ded6a71b6e78e72125c22b26b16c1b0e505a77b2c4c867465fb25254e8aaecfbe59956566c0cc695b016cede6f8b35a0ff85a127f5b595f778fe0471060a1bc78bc2b1a11bbd32d21a758f6c1e93397f4a584e71f569efd5c0cb8bff1ef334a53acc3ceb37da82a206dc144692fa79cb54fe45d347131ac6c5e0257aa1ba90a5b85a6f460a1b39ec872b9da66d077095b8f72dc83f4b2dbad4e55a296917ae910e41fec2bfe4f623110aff2af8d510b1c45a900e6e209cf577a5e9a39d6e998ee6d7e9453ca04de7d5589189bcc1cd0364f1803bb7650682fdd35eb59568682a24e09d534a9ea4b79614bd7a78372ce6f152d7780a2a20fa2736a121c44ca61ca6446bcbd2b246c4ca8e773304c0b77734bb74e90da62dca42fda7ddb20d326a31caa5ac52a9ef4806b42e5a52bbea41fd405a5b83d99c32f6d1788bbb37d69567a12b5c9431150755babf35182b897c6c7063e17b8c4064c7c102c5d11c42d36f79d29e20f48240e8d3f9626e01aecd76f71166854b1e163dca591f02b012a42324865a5cfd6b9cb2461d670a46cf2a829c59a9a60c9f3248e18057a52da38b35cfeb169e2c9573d1c6011e8aa394322b253ab88cef5d1ace2ba7407ece52534813dc49fdf7e1e380f079f494f666275d503c3f4b907e3fe986607fedaaa63e83fc1d52f8cbfa932e1d5f95bb3ef63dfd834f1fa5a16dd4e8b68fc5927522385eee26dd0b546a4eecd3f8083e28a3405712e30b86933fa87dcfb7a90ae8a9be285e1acb53dcd2b214bfd6ea741b461fa473ac7bc199a0acc331aa02487e67f0802b1957aa0b4103b7354d23df199fb64b0ec1e4a6e384f6c0284e47cb5fd86edd4f2904a8411a07a7e957209d80fe9d27510039c4da15790f53a0b83ef70613f575afc53701d708e3689cb6ba4992e30189c837ccfd33de44d0a42fb1dbdc94ddd553857bb14ad077553c9d08b4cd303f7b181d41e4c8cc1afa99f7298eeb1fcd40fa4e31443e883bf51b9fc24248e37a36a21469d64299463164aeb7333025646a287bae8139ffb38976b1d2c592421c19cc7d5ba97de8c22d2de902d9a8e279ee013e1addb877a28d8cf02db24cacec82f805a4897b77d70295136b03e712edae441f68a29da3f6c9db2f6d569bb8940c7f4f044c699f6650c733777f706c690f4bb6408692ad0509949c457a5f397a7ec374b997d3f42d779f839ca634dd82191ab4f7abf3f9110db87619090eab285e82af1b843ebad66bd68a882ccdccf4426be0335a1654ba58972cd4df85034a2289bf46ea9b79ba6f86abf46d6667e59052ae55db52cfbd96e66bf1afc189df588a53325b33c34b9069144c2fbe9230e68b356b363f0052355a8646707bb95ccbb47de96978f80a49a43849db3381f66d4e8d1be49a1c356e8fb842206e5ec5ec204a83d57cc4d7dcc1b4313c48f3a940c05fc20c3ca5f5ecd5f7747771905b4574d0299d72aaf6b696d1dcf581a4b940f957bd3f01bb2eddee00833c75fea909", "53ac526a65", 0, 240217027, "e628cc1a2e8af55a8f84b8d6fd9cf7377fc071401b342e32841a0f9f2a9c6862"], - ["eacdfa310328cc19d2837431469ddd858f0aad9a05db01815e6ddbcb4689eda8bba9926a5c0100000008006500acac6300acfffffffffbaf50bd9d1150b80ab7628a9e5d404b9506677bca9701d29f886c26d84bfbb2020000000152ffffffff3290b89a59fabcddd03bc83ec49e61efdb51c3f9366ca530f78397a4f29032750200000004ab516500ffffffff01f9fecf0400000000055365ab525311035cf300", "ac530000535100", 0, -388087160, "cb3af6e0c9b4c5bad39e608da939196f5902710f9b75e8cad500b07fedc7c024"], - ["1b8ec97b04edb8a0683d0378519d4562df6e8fb803a5e8c001a24864825b59d9b754a3dc2a01000000026a6affffffffab66c4b59ddb0c5ad9bdafc5acba38f2c74760c020b99b1846a3dc5b9a8c58b90200000008ac51535100ac0000ffffffffa874f87fe21dd2ae81f42f09c32f8cb0cb4c32e7b41326813356919b66fe282b00000000046a51ab65ffffffff29c38af16dbebd4dc48ca087614e28306be0a0b4a522eced4e10be5f57231189020000000800535265ab51ac51ffffffff014db8ad0200000000016300000000024fd448040000000000000000000000008d2ac5312d2f1e03e8d1999df1f028e1e0e86b5c89903e3cddda4d347834b6f4f6d3df3982bbacd1fd9aac9dc34f00e7251c2fd0f206c4bf52fc65a3d56ad60aba0f89e8d2accf05276bbb6c9c28ce665db4d4ff456c87b55185c54f50e8e2b400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cebf1bb3c04a91ecf43544ea54e0cb8116a8ba2620e2f600bb6449c31571d10c396bdd9c493539e9f4c45db1c5df74d3b27fe4c8b67d5bd17598cfe6a35e7d93ceecfa887de1890ca34fe8bdb542b6a84571a45912deb7e430600b956113841b6d5ebc1cd44eed86df20507902f1d6430e26ce0ad8ac724ed68cba25ff0c356f022f63e8efb8cae3bf3393fb95c26e872341d04da0a8eabab94b22ec25bb62608902025ae4bf0d96f99796ed0e924e846b6cc0a1c158d5234f43cc8f6eed6290e93c0a1b31f32f3c319ea8ecb599285010523355966669994d6f29c5275103167a8b292bd3fb20c40d97d093ce04472be01b1205b93d42b36a9dc78c9af5179aeade9c0214ec8c8eb9a14c395c04c6de8d901ae7080e4d3600b28cedc5e6d4a3b2abb931030da6849d63a4781fe6324f400ac496445326eee46e4505fc69466c6a88d4d450030ed4882f557ffc7bcec5fc47af7343222df10d722ecd9ce6026b3c936145e749030d340257db18176a87a93d2ee462f474a34d39dc20a1e23c6d9912323c33fc14022cf63905a4304fbe489dfc5f759cda91b4e7744fb5811f03dc4c11f9796dfd1ce3d5bb4bc6eb3b879c1caf7626780a2fe85756aff1071cb9a1d1458a8b82cae9709a5c8c43a550dffda73b2222aa11c2682ea7c5c98785fb04157e161c5b83f08039adc2b5bef62f4d3ee68929e616b22a582933c276a48baea6e1ce053142e45e6c8007012d3ce36be2c2c70ca1c0f2fd772ac421a79cd28c937a0773669fbe3b5d902419ff68b56901dad5f908f272f56d096593a67fe7bc9f0ff68798e100e2c3c6732e96f27c730aff0d6ca9da6e3d1c98f7b1b2865d0ae653369a6e7440dbfe571e73aeadd2a22fd6dbb297de83021abf8a113c261f8873275853275f94e5442a04809474e44c708e976fdae6e9d949e43fc538523360eed0d032ed1d6d299163c62fbfa122c5838343dbdc8a36344dfe45dad113694fc9733fb71c743833a7052f70f2a8ff861694a264bb14b1f15a9b79cacc03ac3c517a9495cbb00fbfd17ce25f36aca1c87dc65799e3ec3fc72cec85eeff060d6d3eeb512514c39a5b9b71975d500bfe17d38ad49f647008dfda3e7c751857e85225282f8cea98308ccc45a6ddc8da9d368863c030904c3a6d5b0beb0c6de49e8fbdbeb81c151fa324eda781d4ff5eca7fc1bfd7bb0a8ca2b4628afc76a67ec5806f8a7afd45f9447d2993802cac9dab0cfa99a16c0a5637d4a49c03fb84c7a81006f4d60147bc32253a6a0524ff176c772fd2ed9e0110e9c409c1de854f134e32869517315ca38f0349e5367f3e5856ad6765b5a0dce300c1dbb3cf1c756aed64d0ad1d134593b6e4120c07871fcf15a58f6fdf5e0210cc63e05f8640de77678171fdd87e88c9b921c4b6ee2505d682e3813ee48a6bc0029365a9d1756c405a90c2cfdd42fc9ad48742cc0a43196977bd4cd900dff7a2f3b2e289cdc4fd77b7e36760dd54a0a4ff22dc8f16990171465977dcef8af925cb2626044b8a1889bf1f06242f752402312c80bcc61c8e3637e9bd301449d491a22ceaf83a4e96b060dde6b78f361ace3393a5d9e8db7617d435403da768c0742d6bfab85d1efd3afa3ee7407f5bc20a7cd77d71ac420b9dd08c308aeeb725fbc119075a9299088431431cc535c128be983ed6e7e2286f347d1283987c4802e61be54d02f2d8833a463f451144c8f4ca505f84c43d3eecf796585ba08680f60417ce143ab6eaf3c357dd89fa3d66dc4217d74cdbeb8443b7aec0cdf4669fad309ea08c91a5bba7f0bb1f0a136cfda382b27df85a33de94e29ab39c531f7567ef3d9440fe32d64c2d4d4f5b9b514d7cfc3c84fbd0d99d0e6a3e9d4813fee24bdb86dd93203223a673d294a1a78110347789f72ff2239495c3860f8dd596f13530d07357d11058a5b7afc22ba9211017e207e5707cd93c209119ed6f95bd733104bb905f10580897e08566b4f97aeee9fd32e235792fe3bed7a3101fad5f7491f68a1addd0362ebdc5b319d463b38460c6b529c09e9d8b63b672457c1921e641bb0d9dfe8a83dabe66607f1526b182a81c8b144cd5650690f553ab3609cffd256c22388e7e3667794b406a3038dd91f43e21882f4908102fc71be42c87ebe3f3c316ab7646c240c3a9d850303a4fdb5a63f669e6d9521777b92ad30d42ef42d7e86b2c306eb943bc45265aca6b56e85060e2fb470050c34fa02eccfd1e852628a4fd0a2a51f8806a57e1613fbdb7239ae87f86434c19842914bc5676e8c998acd7b22a31e68b07020000000000000000000000001e4e75eaa68f232a43bf34fea1065a5f22ad5d2cdf0904378de2658cd0061046a2497622d7724ef6422ce1d0eb2cbdeeb7de4d5cc9bf916bf53affec92cd5c928587dee1956bd12f8b67d0a5bfeb3162db3fdb28feec1b3f183b20f20379c26b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e553c818d3e2fad4e2c4b39f7fc6e94e6ced344af37664e1c12ea8ce4dbaa9786b2e263c5f37506a46c1dc640e66454fae0478594c4fecd29b2bd5845464af0855203b6b85e1f59d1e1ec2cd2ea79e1e07634b596348333a7ef2cfb340f2e4be300539c760885d3d5d1d5e06cdea1f7ce6dcb690f3325aee5717db03a7ffa2f4022236aa1abf77b53bfc2770f2849d26ade3681debfccba8d147115232e33437660317aa7a1ea4baea378d5fa09af68a92ea0d13e41b1feac2f20b4fba68ed8a42af0b17a19b732aa9ba8cb7a0943aa5d4071deeab401423e864191b2c39edb034b94c1ac0fd6c321932b13d170c90ae4d6c621478ca8f771a8ba3f362d72d13c2739c021570f66bd9ac2c8fd3499b0c082b95e2e95a2f8b880394c893adb022aa636d44032f1f7d436369c052037e50f1e28fc499874cca2fbe88e1befa59ca9f1d13b2c6031f2cbac5500f8b436a421f5e270569734a90c31cecc6e06954514cbcc3258874031318143003735bf810dee7ef12bca2e96b1d0a5f4811a902642091400adc9cc9020de26e61ce1b6620a273e0ddb2f47e9709af5fea1f590b954b64b45dfc973c1d6ca869287deadc35588e4482ae981aa421c7dd97e48c57e12c84d9abbb541731fff8868703c1d4831b7932d53014b120ca0dc094d3d2b37f7822c27a1ccddcf9136a77c0e4b4721fae959ded2d07bb096d107826f8e7a0b037f51fd41aab8aae5cde66e1e5a25cc9f3611e833deb18196d7a289ed6953e7a582212678a5a139e7eefadee46a67ad6f15391b811be9f175531e44e2775c5a684226a44dade8f4b71e5ab79a493479d0154466ab052f38ac04763bb9386e07ad026802097cc6913844587e74e5ca4283616a4379f2e4b265c880bc13387596dfb37da8fdbb58a20887139edbc8d96ee28bcc5dbeefa95c0291275b81a381e153069d92930b5f3a089ee8263efb81d2aaa4de15898e71d7ef98f27ff5b6107a5cac7faa6c368511e1d4483f8feb9e9ca81981af4125b48d56ccae3b0e93ef8e8cfb7abd34ca32a91a56a770fcf4e04c62993407457a73e9aaf1cec49fcd8bd28786c73b17af38f685b95c765c3830fba88f2f6dad192ea5c38e76f35baa130e982ca161534e53e54608e117358bb75e8dbda97ab36af10f1d4138fc226af0e1750f18188909807e352393beb15e482d7d2358162249ad0415549e00752e02f62ec14ba2c70a20abadf55299051fe11d57d0ddd2b0be10c4154fa3743487f58d1275ff3261ecf701015160cdeb483f9e2d619734765f94a84b0e1c94aae781a5125828706dfb620c4e36d1aeea9a30908016073ac242594bf63afe9a155bc412ace91d790ac3020d8724597137a8b19ecb4b0ab9c903d5b4abffa613abaf4470e2af39bcd85129e970413d94f3d34cf548c1a1009021832a1097d67fb3821af2c9ec7b0d08c15e9226aa1e9a6227258358e9e24d7b30b4a9abf265a579e2e907983e869041655e78f74078ad23bb46d9519a1680f94c95008c0bc28cd507b5bcf2d4a7ee03bd365dafb2c211a41db475fa6bf04d44240d0915722c06c16e68239b7a30a8d227ffa00b63595aae14e3fd65f32030ae0bf41265a172242804f3edae4587e77359aeb4001394d2ae7ffff9cb20a070cad9fbbc347abbb0512f861326d1d67d990bf5313dc96b31e4688b01d079d07fd44532f3abfb7d67358378e29de78ddec2434aa637a449af881e8a6ba259f96afff6dc984b132aa180eb28ed7cd502fc1bf83d1799ce1dad5afb6acf3baac859b783cb4da30e97f74561ff978be0913464170188aee3882f696c55929add4a0f3f835d0a2a026b23f963bd07ec5fef6202e858c7376c2efb013db759a4a09048d1f5a7a5c64b0867299509bb1de8ca98c129689f923d7a28cc123a260c58cf6440a5ba4fc4d56ad4ed80a862a630491632399feb2700172ee5b47481bad36075fa1abef7a70763a72f34cc5defd8f2bba95778a6c054b0cad8d6daf636853fe5f8aa5b716217498ba2b660b55c84020a236c1dfb33320c599ee107b136e1584f53821809d362b3c307d41c5aa3b14c8188231c94f5d3d02a9e300db71a1c17efc34820a8c86cd53c9b42e24d0f4ab1e5f9878a94c7957b5fb799ae1f1d8faa3b55657fba6898b382789fcadf5dc2bd08e6e7ae47f2e36dbd77e8774da97bd1b892727a288118bba4009b7de816b708fe8a64ffd705b8cec0e089e9c0782a4bb9a087e9bfd5805e40d6387eb956b2978a3398a6a5bbf11aa43feeb66751890fd312e27ab1511b7bfaeaf2fc3aa9a9362ab058c753fe8a59a93870dd1b99ecc5b4ae8995b6497384755d4a030943a0702972c874245e443036ca512c5f5ff1bca4074b06e5a2a42f82ca486903405ef23d406dccbaac8e9ad390f08fc22e134ead6419c6d86c204", "00ac5353", 2, 1904815369, "07014e106a35cede24e90201532009d94effaf6e40494079af5df1c1a8562a61"], - ["18118b2303fea54ced8c8bbbfc43887d1caef7195c69288ddcf19c0d43af2cc973db549bdf0100000001517f5f2fbf1ae9751c89a98e7bd8026d96c867a1cb79111c73f665f7c11c57a28e8cf8dac101000000090051ab65636a6a5252ffffffff4267ec3067b077544458022b1c4db9629c20d32b369d1b81bf308a4fa3956f7f000000000763526553630053ffffffff03e3b76b000000000000909c570000000000050051acab65e1848204000000000465000000000000000200000000000000008fc41502000000003765cd32f84bf4e1c978c168bcce6a58f63f90885de19a5efbd27379059cc9062d50fe63177047f544f6eda54238ee44f0b4c9973de1c40e743d34fbdeb169e58c134f00463458516dfad656477faecbb6e7acf38fe5e75f42d8965b870bd34300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c4c452cf9b43d0a076682545b8c5c61fd49b70b803e64a88128f6ce150c85631e925949ec68f99ed1a0c21d5b62c059e7dbe7b0f67584926af19e761181d997a9b8f1e133b5bed02a033824480693d58c6999e33dcb4cd8f4225c2178d30df9a831e4fdc61a4a1be958eb1c52f0b3757374a23a968cc3ad19b69c0cb737ae3650211d92b99198a4bb2def9b73d3d204c511b2b68642f65a39488088087b97af61c031941b8f75b8f703d8f0e5528807e1b058f6ceeba3fe9b9f42b5b48f4f0370dad0a26241587fd2ec36ec831d4e814b240883a50cd2c3637273a865712a4498d50771f0e6ca9e8dbfcb20d6b9e9caf95e5f7f1a7fd0e31b50e684deb6b0e24b97475020f425a0d46787d40969a35ae6f9a530c2e7fafb440e293dea634383f90ea915f022c221c628fad7d1ffa5616a7006176a924ee203ee5bcc6d655c6dcc00661312e02157278f5408f46a6db1193eeb3c5993231188323db902345162a6ea5f597172902234c8fcd0468567b2402a18f122b5b6133d4f606177e22ba7a18398e74c05025030e6dbadda52b8ce3e81e77355c55b4da65f9020a90130cd2767e497ce4c5104a9d8b766367657829004fbc7dd344ef3116ffd9e66f9cd30c5f4facc6f0b9252a82120330a26a6c060df5a876a65a241dc0fef59d3d42b6c83bafbb73456f22a6414b289ea9853bd8938960aebdd0b3839bf27e4610dea7bc529fac977e81550f2126b47416b4fb485260a2b6bf41fd14b9035d7ab893fcf7a76d82ee7dcf3f1c9927ce81199f63e91c40c89ab1b1c51c4ba7197ff12a3de6061eaa79f89f247f5095f8224d56eb6edd9b378599629be3bdd616464cd0766579de89c47e4f22b2c48115da5720ebe75ba9282e4dfbbe57530c870507a5bd969ee9f9fd6137970e5ec78fe96078ecd3fb046460685a8b22382f5b404d65ed13b4a1db761d846ab3a2d9cc7f9ebb125f617a36120924166ae86a800e2bd84ff81b624a168c07eb83fc142b5b3a0aa4ba666d20c1ba50cf4061528729dbda7bf2b80dd5b713c7367f68902ca653f495ace37bd45a9c9809b7720c398aad699c41a5591c3e6741589b6cd6926d1c6cd25e0bdd6c38f517b70009dfdd1c49d563a20734075cbad234c7cf1816c74c40c47ae935ab6096db1fd42cf90fa61d63780efe780fda02ca27001b5e4414283fe48125c68a54e82e24fabb870b9d54aeb7a0b4007a7de15b35ca6e8338c842f818c657fb812928cb312274fe3ae83f051392ada2fd1bddcc637bcf7cf75eb0253b202f67a6271d830476f6074d9225b86617826e329140c4eecaac8e6dd608380bd2e010c3238c503283d16185da94fe4c8c10d8b75321cd7751bb3c5d133cc7e132c6783f4a05795cb9ea9b23b84ba236b6f97a89a4315f3c95337a24afd9955833658131cb9141ee8b2a8c43832a13b60e968c8d088aa938d11590b036220025d2960b7655d9d792624e289ddec33b8bed291879c3e3e7ba7fbfccab8471b977a0b3cbaef409204395ff59b3758a71ae5b30469afa9290592ef36bf9aa0131bb32bc5b0fad945cb4db6be26cc55a632a4ff45aec769c244a7c0d6804bd021086a8e5a6bacaca69ff04fb18d4a53777c45882bfc186848080f93b58e39f2e6bc36497779f01442474e4fe5678e13a516afe8b75e023b73688f4fb2a11830e7d33f69abc12b755af166e2b10e145283fb3e51e42cf1ab76cbfeb3a58bee5f85028d371900c36277a9ce65b36d9a483b3d2e8805f8d7212e350073e53f2e0f3960d0ed79eb356f82222633a17a894eadc4ebc36a3d1d2ce63c445ee485d73afc2727b135bfa1083c23565f3d27e61738e53bec97f9c0872c0f93be3086aae9b1c0c173613481ead1d33c8e92de90ff00f8adad49747331a7a979cf1fd30a5e611e0ee4d088d710ac38c8e60e2c305afaf3714e45f773eb6cb408fe511ca970e5824482a092d04387434b1f10c76ae543435296c02c55637a75ca6d25d2e56d778582eb5e127cb19513f20dbca118446d4264b00375fe2148b6b088086b389fbdc0a456c98265bd57a0c8dbf906f5a30416489a29d9673a6e43b2a9981e271662c5b1907aa24d951bcfb6a86cc4d4f5f6de2cfa3d05bfba14417e3e1eb608d2f3e6da8aa2511545d74fdc107e9cd4f0b9190a4714822526256d29c7e0dab63bbcb5298f2af4949e9fdb33f18b50235c481d1a3fde7b40dddda391d337bb7a6774d148a6065ce0612bc9f09fd91a428603161541f7409547a585ab674f9fd3403378811d3b6cf15bfdb4480a3d661bae50500000000000000000000000095cc8edf7c026b70b660f7945b47569e2bbf37edd2fe3fbc5c03280d9cc348dc0ccc366a7bec5d764ee2cb1ff330811b7d3d3bd0ff8953d689ef3e8b11494efb5335e689f90a1b4591b5b739c218aebddeedb82a9fb15af1c3e3e9bb9e6fe02d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e624ea378a29751f68cd38f7fd128b3d641768e3a7f424f2302ae38fef4858e81b0e36658d93cbcf1a6be54f1705cd83008883c77499bdf4bb576e79c92ad6c1dffdd8bf1e1895ccae2d9c68cc7b7de05705cf959ff8494ecd953cb12424a5a91271fdb099a428c577faa5a4fdc62e7c87198dae11c5060c535c32921917ff0a02018bf15b93267ce9655da6aa9dbd812045b936a6bb1cb006f391783427ce64930209c0651acfff916447961db7d220fc1029e952e7fb268814f666fe67650f59890b2e7e883f29308324ef26fa25c16362c9d14ccef9a9a6588b1c7358afc3f2f606200f0e7034795f224d9e1938d175d0f38f8e3563cbc50db677de8553ec091cc30320fd2d0794c56253ea8b7d41f95c3f1cd79f2340d3f7ae4145b1ca28c50b87e8020403855aa882150b737e4689f25df841cd53d98dc29945538f5051b406bf9005021ad98cdcddf78dc3aa18f377ece7a7119c8771c9d6726ba47297ed70a23ecb2d020c44dfa5df6a34bb65f4fb74d602eb0e33f5272e9d6eed3e34970e8f45268d7802106192a050de4348730de0c056b626762c0b13b2eba91e683a0a170cf90b63fc9eb9b34dcc3be05bdaf2aac35c59a346a8c08caa3397362bf62cbeea8223e7e3cb3251bce400df6d944c86819ad47dd21fe156ffe01d288a314449238ec18e28b4e76dfff8c92b44b599675d8c34cbff48314f9dbf9e1d315bf812250e02993aced8a12f2fd6e983800a64e9080e79cba63562952ed64c0cf59ade27ad076058af2efe19282e2a449011f1e12b861893c71bbb33dbd2d0875f32c0ec4813d865a2374b5a30ff6b5e7565b1d8c6a12e1c6274e1b8984eefa6f56792aeedcce37f4c2968fd0905cab4adf50504af4f5e9dbb33fb18d3efbb9da218e5f4a0a815185d5cab2f0d93866906feea2d690301908f5ed9e6a869d1278b6d6181af3eccd51a395cbbed754bcbc5f2813bafbae7bd5e9afd20d826ab682bbe8c0a5db9d53524915600a9710ab0a27470ac46510caae9d510586bd9b1761efde8e37c0f48793ffe56df175d2e7ab7984f29fc1651326fa4b96b00e61363ccbcc0d7cf4f45f736cc200f649ffb29781f6d811570d2237bfa47548e32afabe45d1bab65b0e2fae44fea81bb8a094953d480dbcd5d20084a0895a094076d3a848d77046de67caf24ae81fc1e6d53a00bac31a5a3b462b3e2327980e8f8bf4c89f806b02b8185cc4f2205fd9d79bad2d8cdb3828ce52ae7d11ee1e06cc17b7556c804136da4537386b96a948b3892bf60fd751ee0d630c1055d39a44482c568a20999caa9d618627c9297232dbc36cddabcbf5aa816aa08df16184aac40a2a3e13677667780d68bf1952b16ac29b70abd3f48c176f45f428625064c47f137138b9b1ed4b967b164a41a2372ad5dacdd3aab11b250121f07ac2845e2a0ebb3ddb94f3c059d5b1fc534a9d3767c057192014905f29ffdf70bff450105f88a1c95bdcd107966670559f2487880ec5b9c47b450b82527b33632411794e38ecf37e6e0fdba85e17e47aba82d6f2772e4e2816c9091d2f91c75d5fcc031b7dd99d4cce29d0466e7f3e468b30e8aa218d9f41ba6a3bf0c7b583e7b3ab37650e5f77cb66947ad4fea733f32f88621c925c887bb27cbeedde9283d543bde731a933d6f9a6aa659c98b07591a082b4274db41b4c437a15eb598c01e5a48b71512c3a79ae288bbc8351d2f65dc40430cfb354d79721c6a4e38de1a65cc0d7fa5b0c12749066604dd7ba02aed20937c5796e6ae6a651837feec5003c7bf46f52d5f1e73b8980c34907cee57b3e9c5fee3c59a3d88a2e695279ea3083bbbea64cdf5e562e48ba12ce28e7c6594bcbb2c8ca30643b5f314ab2e677718964118ccf38231b4a588d4371e6242d299dfffd9f8c043e6c94855feeaab393e9e8c3607ba764c422b5105029b5e54f6f48cd15c63cd96854c7147269a80fbba22ebd7aaee15cf5177bd01bb9f65a7284981261462228d9b1126a4bd3111b24eef7c13c29189e6a0e82021ed090046ad04b3a0752b4650fd435ed356a0aa96d1f44e79269f578678e07284aa5e2ca39c39c55f457c25ccf78a44e84b70789619d9e8bd91a35d074a38006e0feffa290b8de1659f495c72b800d0791d6f9914fc6168793488e3a557cb5e7c246d1b2d97c6c7925b170c480fd83fa6a0be3a56799221770d71cbd0cb319a9fcff6e7ebfcc08ca65f03906c21f8b2360a0acbf0c0de996044ff05e6d1496b0223d665724b9ba0303280a58f01010a17f1fbcc7c3e5190b5367f5b47c1c6be359a89e11f54d243b4df53175c8cac3a1e92f4b9c0d88725229523085e818e3f67a72162c821e25bd48d87ff6385bc2ed18bbe76dd8bdae85621ab23fec91002e48779a0a3bb3a73843222823ae158cf12fccfaf0946d1419804", "ac6352526500ac6a52", 1, 98842182, "581ad9ea6b077080c32b1d6e218c700b82af807b454cf63a45625a5c16609acf"], - ["20aa2c0003e4ce50af6b557b7ca2752b85222d751132028f9bb64d13723013033a9098fa4c0100000001abffffffff28e81e0d68abada0e6ed36ee6403c541b8704fe672b6a7c894bb567e4f25ac38030000000765ab6352ac6a63ffffffff00adfc964a6fb053ac9f89381c3bcfb5aef9124c29dcf21f45ff966d8760aeee0100000003ab00acffffffff0481dbae05000000000152a08e72000000000003ab5263cdb10202000000000152acc0f8030000000006655200abac630000000003000000000000000012e74a050000000094e6f7319ee360653a391c70aa79053852206575be9e9da21a7a4a0e824c9b5457ac443b5ca28e5fc28ed4be8a2d2f707144019ff2efcfd6ff21f6d62de4a058dff82f6777768edd404a98b8ca04d3addccb29946fa777ab0e49cdb903627aa20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021866e74d23970289dec464616b765ba5bd4ff9936d0c2e43184da8d85f31543410190313ecaedec6a4ac255c309576fb4ce8867cf42fb064a7c723057d9f565ec2e47c620b0bf85832fb8f0947507297c2f9e21593f8ca512783c72d45dbaa51227d8de85044c338307960f3ea3644a63f6b3afa15041aa1662bad6399efe27030fd22b30db0e2d39e88df0a7300f1ee556daf6016c04dc1b3612b471ebf0d5eb020caee1404d81bc52bea65ec4fd60685a58816e0841b0cf6be8257ee05cf5cc1a0a1906c9b4633e74371a7a86be16df3533cede4fbc4b38de869c9374ccbc3c09a32662cee2d9e5dfec7ce3c6abed33b1e963408fadda299cd160bb085a5fcd59930227c85fd26af5db4bfe81dc89163dbe3e515d62ede33675640c5b0af6a2c609300215f42fd9d4c021ffb3b87a272db0d371bcbde64c6c483cb35f4683bbd1e66215020e9400ff10513683bd1909786d3db7f3685f1797ed83e0f6204342ecb743ac6e02179357461940322a63c7b2ee325c8b2304feb40f3d0a62bc547fc2185742924902066faf0465440325727a1a7eb2656e0394fd8b7927f44644b94b9584063cf4dc82599afc03f48834804333658e2764bf6b4350a2183c5b7cfce4a3f4511546f4b030c5db3cbb9194acfc09abbf7666647b0bd578627f9b877be6fa38825ae845e3270c70c27d7b2ff452dfd791cbd266f11a500fee056b2079b71ffd1f7613461531b9a4bbc6760496505fb1fa8b0dfc80572849d00c176e0fbbf69cb709c12ef2230d4ed586a6a90967120650dbdbd43912cb686b6e6a917c3cd06aa5a328db6eca47819a5c6b47c8643a055e7a2188b7582a800eb0205bbb21fc7bea7a45c1e2320ac0861c3b5f082529798f54abc70aabd5d3f9562910e2f0e8e2e3c4d342a97b3202b1400a1828ddd43c73025996730fd9614feb864179d41880e88173023b27e9c35a46c9cbd3552ec6d0775b9fcbd42dc7cef799deb74c8f16695a2aece9f4b0c30497ff3b51c894735d7f75ad54ad29dec49f0accb24f8587ce64417dc3f65cc84d15dbd1ab6815ea4f83032f9fdc8a1ea10220d0fc8aded10f5bb9cab10c8ff47ab1d41bae0ced760f45f672d745cfefcf05a193545be4232df1e099d61c93a43f288fb10f7f2e7bee3074c4f6320fcbf703f86dd8001e3355edb84a62cbcc4e22a1f4d58c12a2200aa455883b483677985fb0683928eeeff5a378fd43fd1f9daa6f3c461938e0cdf9c54f63fefe1f8220b8242289cace97165e7e67a7ead3e7e96e905748e82249d63c36ec7a8b1338b73eebab80121922041c438544d9524b2e219535616bbf6efb49f61ad0809893e7ecad1a235980e593c3964a7f3c611762dce9563282d7711438b1f647741f081948eac8d3b25259aa089b55df3c8938f65a5de94d494a102e41ec3ebdb50a112d28f7ea8285d5544d3f6e351a5f85fa39865a73a05d815637975f1004b642d43b354bd58bf17d3bd9098962b0531257b6621008582a660a5d48b237db74345c3f4cad7a83020b7c3ea271553f6c880789cadb73f046927c1f81730b8757779be3ebedd6c4925fff1bb7b1b9a2c24913dab5eafdb4bccdc1680d5b8b8a1e1ee233cad1e365832cc6fd3acaa5eba52ee8c9796643eeead58c95b07808b26597bb92af695c5766a7f2a2ff7d82b79a75ea19a31b75b53e754b8e48623d64366e2498900e1f4de0f412de94a439cbb8d535a2ee0567dbc88f4d5407b33ed3d9e6cd0260e579aca7d0a2ab6f693ce58c5557a5cd916e8fae824467dd8372b227c2d3cdee7315d0e165db98c920c9063c35222973ca2abcee17ec3cb439b0bc5f469369e516d63a47056df3da38e758d75a1bb200bf540db0f4e3007d56fd7c8af9b8b38a6cbe5afc4f48402279a2ac3507e1fc7a20d4c4b74bfaf8307493a44feb927eee938a46a8c9f162a336bff52e1980da3d657500397ae387481c2319a5e526827788e68f3992d9325f0cdc464733a963480fbb671eda239e06fa8fad59a426b62c935de587e98a68d75d3402e7da5b9918fcc0f5ee7c43ccdbe0d508d99a58264e0f2fe7c4cac6b5295cbe55ab927c42b66985a313fef8130fc9e78d30321365fce2ec070841e1624bbfeaf1c603582a3af3331c163e601a5e32243132e7e2d6d3dfc1e286f6b7f5c04f8c13fe14e43561009664aaabc4c507f2cd14c8950d16a49d4ba83b8e04f7f48b5365e8edf41e32c234d43d188ad5e0c9e66a638d783098807ea23a8dfd2cdafdcf20a7485a4ffaf855844dad089c9e5d2ca83e0000000000000000cf8dbe0400000000204788050782feef909a10217cbdda364e7635d7032966a3780d99fb693d78bc570a446eccbff38d8af11a942a3a47c7b86b6ec29f168e082d4d94bfddcca896dd34195ae2259891cb16ec7d05029c74b78331716de3591477b04464a29be5290000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091b9b6ba8536b7a39f45552c9fe27e72299880c2975871e8cc73f959c454f23e2d0c798161850216b323126e7e4fafcd2cfadceb029c5146b8837aaf0ebc3ff18d5755727d134ac8b130b4f240ad62e966419ed4fe8f2333a01492a9e0efa6a04879700c43e2792682aa5550916b0c1a1c01d9e3f297e5558fc756c6cfd499cd020fe005d7c20f38e9913f534d8400f9a089da58bbc4c6525b1241d49ab967873803279de6f3afeb97437af3a9f10edd1a0e8b462ce294fa3c18f13d194174103a0b0b20463ca3338c3a9facf5910340214daad9e283b2ac974233b8852e99a36057f012a2e13abbb65d1db6d440b3f0bd1efc9f264cd3bafd88530032b39d339437240207eb509744e50c0ec0acada3e42259da58d6579feedb68601e13a66e070799bf020257847ef166a143ca1ea38de422a7690991732884ab89e82f2144212d95ba720322e2e8dedfcdcd336dc2a97cec6886da0af85f4ae1c746121278657be8a08ec4021a390939fa5d7d4c88ce4227a4b3666acdf2f175abe3b5820b2731cb6ac76b24022880ecc6c586125470de4f29cbaaaf1f5c2c1638a8d6824a52971cbecdd4ffbe2f5ed205d216557c89dfab4165bbe485631fc21f818b7b29d72e54f4e3b3bbf0d4b391290850d5f1461b8b796edae50b40144b33338cea50462ae5fff4c519ec0b631cd51f9ebbdd04eddc442e8fb6432c4ae1e6dc576b44033a46e4db87a85bb4ab63d144fb837ae6261ef551a2c2e8c85922ee04e6d09e83e14e3f47dd0962c277004301b4bbc9ac7e9aefdbe1e94808a0007be5bb05c1950d901639a08068fefcb5a783c6910a30ad4d6a7a0951105b5c6436e774df310a40a6120eaa36989d0b52239e6ddef11d69f2e13516c0ee0fcbce5851fea083e1d6a7f9f6cbe1b473dc3559a510699a75a7ad1185c696ff6c343cf0b5f6929082dc5feeb70cd34f509ed38de5bae6b1b309d3f012e5119c3b132fef0bf00b9d6c7d6fbcae6449fdbf36bda76fd394a7c6defa80ee8747b8825485a336e2c12db9322b05ae751de5b1cba45c0f2515ef88702adb95633ff0f3163dfc747445cb01675152ef72b98bc80da5874a916df3270805a6094ebf08ac160f137e2884d4c0821622f299232ab412c6728b9769c5bf3774f461a800c6a63d3577099ff315fcee7b08a23de0df66e129d78ddcfaa68ce2c6feb6aaff74fe63a649c953fa6147f5390b48aee818f49b362cff46f6bccf556dcc509df1ca5a1a5393abc9b08fa78476698e8fea1105d810bbbe9ec9b0783ce1f0c2bd74c1192f3d3314b6eb17c60573eab3675279aafc6685e7eacb03a90e80d7f747af0f7fa731547d3a4df71628dc81a1319f320460318d62225017ebec32d3146aafd0560a38fc8dff559bae920669767753469e4457b0a753ac51846dfcde9baadfea8311e2653299c1665fff67e8e145e77571e75b849c2d1f5d7edb7c7265f61a5f57ca2d591a082bdc10e86ab8ecae36153b0d1677aebe43fa0e374580a924c1582ce3f1555f284d9a015125e7467b274994c1c7350a9d0178f482c7f983c686ec65bacdffcba6b12eb3ffe8bf06eb47d167b2f51f5d2113e2f5a8c84c0867ce4942079a70277ac4cd7062ac9fdfec5b10637630ec2488a79b014aad77ba787ef89062f2a9c72e66c3b92da3d89cb00726049ae8b80aef6035249a48432b3d208cca4d3d07d29478ce035f9f07da278ddb5ac5af1ca87fdc0e407d6e7fdd2bf14bf82e20488bd09f781f5e55ecc78b142c89fb02198a91f172b77cdd2075e1c0b6bcceea43a7c39f1c1afc8f0ff7ef559db82d18b2cbda57fae883d36c50349a65ca80fb62d9436c28d33c538ad02b5eb60b7f0aecaee51a540696242712234eb1251bff3bc871c1ecfe1b0adfcb92c5a5bd25e2119e94d838c43fd5cfd8a6d3cedd15152373eb531b487485d140460e3c504b71e8eeac9aaed9848bb3844c625831b5f2a76541b277f4e9bc52c76294e0486b4e15f63e08957a32586a16e8d72ef773e1ce919f0a0c1c1118d5a1bb89721c2f90ace007c0414a7534aa146c9c1411a1759d8e883ec6f0a9fe9c3ceb8be986013b5063ee51008132166c0fbe2740b31bc98aa9b73b1d62ad48beff8b3ca2cbbb1f1bd7df8955eaa9bce4ecc7c52f7676e8c6aafdd6eb81ff05441372805692d232c41bc8268700ae9d1d138c6f7cfc61ec0b38a15a3ffadc2d5c82c4d1103ac632e4decb1ee4d489feb3ca042145cd9bbe2ed34b4ee060e01aaf8ac879bec08b470342915245477373dea2fa3a39ba4300000000000000009f5f8505000000009f842ba0255512379ea8478eed494f94570afb8973f87ea4a7e91b2887b5c61728ec20f1df88e81a5617841e4bebb037c22790184d95db097bb5e42f2121bed1a3de2a4ed83467f6584af18f46c5ed9264c51dd66a0525e410b3d0835bea68ca00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a3a2414af1ef0035bc0663503e4830b3b3fce3b7f7562ddaf5365108b94b37d2c824dca061c7509a43d1ff17e7a1375bf341452c2f0521dfdea97158a1e472b89f1b9d4ac852a82e15117d40aed9c9ea3ac70d0481b45cac131a94a71dba668375af0158da84a816507538c5759dffad9cd9bd1e243420d554b7460724d97d41032df5ea050489f570507723e32f856f78040e284f3616c5f16f790e6de0fd292402030b846dd4dc4647bceae6deabfd501ac9109bee08e3694cb988321c59e608420a06561e0d6efcc68489ab818d58aa2cc5419c807363aaa00a1bfa66c366ebc1da1919e3b0d0555eeed9f934c02074d9a80c9e8e21f8b9efd3fb417102960a38db032d733d49277532bc2d0953aee95d484a22c30b09756d0e6177bd8b617a86cb9a0302c1ef8981933846d8a36e38443746e4ca327a3267945d6d5057d63bbb0650150228c3e64373aba70916f751522e456e3dcc4225d97f9d37a4d6fa93101f9d2f130307b65582539ce38ae8c9aab5e76009695b9582e6b622231d242629dbde2883a80309e031e771b5c59247191332efe6b9c60fd93d800cc3d993149c5dc7216a031a98c880d9cb068f9a64a8d8b011a05d0d3105b49e4f2f96c6b889c448491af31f740cf8a39375d5c0f1ae45f5ea65ab6e3de87639f76fb6877cc8d2268512cf178200c24db6a7d4f9bd0df019601ef362fcc20ed395bc0fcfc4048caf5247385e71b4139e3990769bff266e556acd870745abdaff6bb19c200847f2fcc55ef089e7473f46e0457c9becddd9ab056bde83b8b233cee8f13baf60114f5deb99424ab7e6acc2a8becbd4c8255d8e828a2da1402e2e051c75456fec95612f8048fd3a17ff11ff3ca8ae780888293f68d10666c9a849fd6b3b5d960e271e7d26bb8b8b7ab38ebf836cbd22eccf5e9e2f6d18d9525abd182513a3bb09e719ed28ee7c2be7292018850166c9ac870605006ba951b29cfbe95d3962d55ccf5dd117ae58cc20a5ac3fc87f0b0cd51a3cab0d906ac0ca3eb3feedcff2089f7487677b13e6fe453d74166155903f3a63dba03599ab90e9e653c65c38e44210835b899d7246433541130e1cc7d5d7f8d66ed19c282b04a91b5af890edbe28b8fbeb0b47b423d414f447f06e76e144348c18b2e2119bf5ef1dd35693d0231f42acd8dc9f7fe74bfd5e696abf64e991b2a1098a640ad0e5b44edc4422c9827e267765a1350d72e665d2d3fa1e6e85232dfa11bacc2aabc355eb58287fa9f95d8980ce726120265a412428f858ca7eb16b64b764c687f4c23e7e312104e28670c504f85176a2eac32a0097837dce1a7fbcba882e54eb8c0f3880ee27919307a54d93ebd27e898cdd2cdfc0a484083c900fc8603df05d22ce7e12742173e012a3a9b5bff8d2192fc21b74be0e29e1fc1c051404b01acbd2fb6ab8b037c826842f487aa63a4fe09429c3e08f2891e57cfd0fdc8e06ee3ecf6300041d704aacedef452026a0bceea1e5ebbd8c5e89e23d70fc8c9f239fc1812304745df0c7fb0b9e19abe3c84e31e85750b27a562d4dbc1dc7decd4968a30a218542a5b2601c05c3dc199c40ec835b42fab2890906a91ab5a5a4a76c931d2918048d94ab8b6517b921b3fc8b3e8400787e8d87210c0ba7a096b5981545bc83f0bec8ccd4dd05a3b83be5dac8cb7b51040f58540c6c3e5c5fb467ac4af6cf6a3f32ba4f6536cbaf34c9cbfa2e2c1c078b3ada7d2fb3d1186f8d4989a00f9a019ac24cedd9c0dc043ff2da833078c74a259d706eae3fcc5899c454d6dd88663700c611a8e523a75bd7b2709d1731eec7167637c6dea13fbe8a197a784aa9c4b39292c5e549c8d3765c81edb09c40e1dc8964c4c2f42999b216e2ad738cd5729001bf95ae7ddf6e905fc119b0c5baff276bc74450dddc51fb33a44140ed88cc8e94ad60b324d49a468fa52980eae83350da444e1af6c0ef60b18266476fa06c79fa7997960a450389f4ddc1ef369f0202d7992223c1927fb104ff450ca4c653fa435995dca4f9ef6b9013e4e4af41ac6859541eecd5810212847206749dde0c1314559ce75eebe421054b330dfe3ee4855c31a5ee127081629e343b8acf580fb5a4da7706811309ee7fa8324be45f0dd7295e21e36a124c147aed8101ed4f0ae5425dacbc1e33c50a63388706cf7befbd8c390c8f3a5d27ef1b98bfbefd7d385524e04c078956860e1780bdafcb9fef85c9a91fa5a81c2febdeb255527d2eb0dca64f91a06de8c9f05155f286cb442dbd9c5a9f61937f6d2153cde1aa39da9ed47ed01b9b69c93b490ea2f36218a1925e940601912b133f39c1fbec782b034e07d01f7f72affb5de1a748cdeb6683c1876c64a5480570b36f20aee910432ce614b6efc4f06363f8103885e386aa8cc1c1f07e919035897b10863d972d06ae34bb0da90c", "ac", 2, -1372283481, "59b364a42de9c1341712329772482c71b301b4966396934bac9859967bb24b65"], - ["71050a7501a58c8f0924234484267a2bc5161d45ec76278acc7cd1f7f2d6794db4a62fc61c000000000963ab5252ac65ac6551300da93f031640f104000000000853516551ac65526a0f7c840300000000046a6500aba06b2e00000000000200ab229adde500", "6351656a00", 0, -1864018183, "61a699765d2084b8b954c3bf9c3cb915018702c7195420a63f262be60647483b"], - ["915c7bd201374b15277767f331337804b05b5d40b3d326ef1a7cdb89b20b4e741787aa89c103000000096500636aabacac5365ffffffff03e50183020000000001acf1246e01000000000553656aabab40c7e00300000000035351534c57863c", "6a53ac5163536a", 0, -1095091889, "071d3fbe623395be3550c456ddc164cad4d35636760730b5924b736e8ea2ffc4"], - ["242bbcb902e8e939bf1091494df520fd862f4e41dfd6de90f4f735d91aa62d32f0719e0f5402000000086a00516553ab00aba27790c24d562d764a2433a3323205556f91187c82cabd28453dd1c2cce5ef579c36638c0000000002536a0f169275015a9909000000000005526552ac53d5569a9a", "5252ac", 0, 99349162, "fbf374afd532389fad9edab612fe371be40c255062c75599ff83470ee5ef4a63"], - ["65c9a2e0043a3e47be6986ab25b007001ce121a7192a6a8783a141234381b9b59bc88463320100000002ac00ffffffff308ea3d3728cf8256155f6f88f96277f1ee319319857218cb4f924fcb8051eeb0200000009525263526300ac630079bb3bf3babd3001364109f96409989d380f0dafbcebce43b6085b8b1d97bfc66c61dfd200000000076a5252530063abffffffff9a29519905c81595e98ecf37b3fcc217ac7fb5142824810df839be90898bb7690000000008ab53536363ac5165ffffffff02b7fd8b01000000000653abab636300c1921b03000000000000000000", "63656551ac", 1, 596457409, "71b022c1cb29faa7620aca470a6db85d6c83d063db3184c5bc559e3edd00add4"], - ["26b33cce026f7bba1ab3f419b07cde25c0f1f7bd7a474e31586397e91f211c22b0782ff9050300000006abac5351526361d7fff952ebdbc7d77b9107222711495609e1e1ae371ef9c7130c777ef6ad984e98cd69020000000265ac76dcfd6501eb67b1020000000009005265536aac65526a00000000", "526351", 1, -1070540843, "a95658e37fc00a99045667b3deb458e478a8cd11956fa18226ba404ed06cf9bf"], - ["7947ba71042806084182ee486d3ff89fdb674d85c91cea0b4fa73e7a4be5965340debb786002000000085200acac6a000065382981eb6a108216df4da7079bec0baaf2050abd8b72778a2fdc000d307eaaf261f2cba50200000002ab63ffffffff86bceb91eb764b4c388a546a8e877b3f3b16066be429925a60b18c3becc5376900000000066551630063654958fe3869b2b4626d8b6d0ac28893e648893c35aa612e821c71f9466169e4e00df7f01601000000086aac526a00ac636affffffff01f4084c0000000000035300ab00000000024cb7a903000000000000000000000000c2786419a62aaf7ac7c1788a1316e2a392b5be2d76f362a7987979e8176199130a690fdc5e876895cef176a021aaff601266b00f6c7b27d582e17b2054840a70a6c466ff5b40a76ea1972f90fd922b4b1b0b07ce02c1c89c3104d9aad715801e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077e27f7a419744c162532649be1c8098b6bb9b704aed0e05464afbf8a6bc443faeb029e8436cf57671320295d5c09c89b943b6aa7edd3c8957649fabe128a8a9c516e95eda16c5372a61b003983fe1e5f1d42e03d79af2c7f7f94d106066e5c1eafbaf201f4db8439654abad5fd74ef099c98ee519184a54e06af6d2c43d27840219846815268b58ee6a384d1ad940630c511bca67ef94fa3dd57bc0daf3d6f0b20201511c15417a563e21b3f46ac08f210fef4a468afcef494562c44e104a0ec4df0b16cc79003838493611720c11e942b7c6e081728ac0d150017a7a955ab4cb5c1e29e2c19a4aa96ad9ba614ee96dfdae308c390335f08e18d56da742fb52b58afa03055d34d4db672d43e5e95d7265e1a8a7382232db42dfe1031f13e3d49bb8ca1d030c343634c53022cea4f16f7ac759dc47f6744e77482dab5ec4fd1cc998b2212b02252c52807cdd86dccafd41e1468fceb924a7eccaa7b45106887cc912038ba1ef031fd2502b662622cb6cd015cae8b953b1916b0ee8c8c9cf55bd7c28b87b14a2d4032b07550a5d1ee3e756ebaad5dfa356cfad6d1425312e98917d0170d28ed15184ea539e90ef7a497bf3b33a09a0b92d368024e92a7f959692638e8e1fcb6bd801c58aa3ad73586fce6440452b79c1b56a14cbc1b2eeed6276acb9609332311fffd13f84d8b6d8e16864e6b26b8a21620f95cc0ea56370b961be167a67e7f45c0b41b2d620d17752e7b47a3f79bbf66297e76a0327912c5f8a1b9229e77edf1469816f9f11135c3926649355735a0dcc49169827c57e264e93f0c61cc4b0786b9f7d6ac6fb252f9f5a1dff30fe36463a6f3b122adf2034c6920ec008fadca34696d3668c20387f1eb1027443c2c4672ceb94cf03cf376d8cf21d9eeebbeeea54ffbad474a59384f5da187b84881704a2701d721c95c55d4e03a66e6a25ab1824cbee4fe693cc739b23d585f9d1fb369dbf38f4e2026e11ae54880878f66f3cfb571776b49babde1e6d70178eef8903433b6c377ee8410f2f30a76501d3b5c6476051d3f859e08964004827be21491a2481a507a6dad4f6be6ca30621c98e0677012f97284a148f8f911789d3ab2b36681db7e56ad1188b7648a144f58bf865f5a578d9633180cbddd393c33793a6664a76c72c5ea23ab50f83538cc0915fca91c6cac55b0a9248bb9dd3383e3979f685b58536d9361fdd99baddc7371e84b891e0cf4ea56e38467e8cb50979518e44935850e162ded64cfa533205cb367e638dc1362571dcd91e4ff606c20999f4880fd1075f3c7891b69aa0e521ad163cdd69969f119b2ff2383e896502406515594b4e0496e997c272eab30881404df602daf5d8f37aae41f8d4ceaf8d15320d5d41e0176f4922650b64026a1cdf91b71c004c5f58bfa0bb1c4275716bcdc7c59858d5ab509688f71ed732d1090a87040355f50f06a12e79c37fc6593d2ffef7df45c3c46451ca02ba42c32e7c93b1e330f5e4f1afa9139dc77a9dccbf5ccda74699dd1c63d6b751b64fd10b556f1be930f0617e21d5abfdfc9c883edad56af0a3e99677725d3bc53baf64a73f5c9866c8226fa157030dad27bf2c1cdb3d9a3eeaf4e141890be563de92b47626690ade55f782ecd88cb01543d4e10c57e10aa8252dc4d6a0f602de56041d7208904480542bd220ef7febb1a82013cca9bda3ce7b891bf996f14e74efb2a8404a499d75e256ce75d9f61ab6470da9c5827b41dbc23dd275daa1e6659c790b20a8c331a8bfd2e333999132aad613ffd923877b21dc8d27b8ae9b33e4838ea6ae9cbfd6dbc21e1d80d5ba3d04cba02b838c660c5d16cf6934735f4f49a91043580fa876b4693386c1355472dd21178c3b3fce9018cd9083917dacafdb9f6a242eabbbbda3f96a069626d50b9e863d1498e3a74c02b31e7b4312fc8b10349c2d527c6c3faa68f1efbd438e68a209e4b36c9535c97a7781e40230dda11325aacd43cdedfe49f737fbe56f985258e9195f5621a160fa9611ec9e59bc56049bb446afa7f0346f253d2e91d5f76b9e869202e53d8a1077d49cef1682b9f4cf2020f479386a3b8380ce878d9bc4dd5e456f8284362259d8067a57f9f7caaaebc15471fa8d546c6f24551bc0c13c36785d79efde73f82f247cd5f738a9271af701f646e928ac28399ff03998502873a39e516508b4c76b40e24dc21c16e916c550827ba7961bba74af1431bfea1c2725f1a53a36aa77080290712b8824d2a791ad528b3fc49e90d2220f67c67dc7ef4f9d89b276be72130b025e40fbc00000000000000000022f890200000000b60f439c1bfd63ecba78779b261ae6d9daffec0f4122fbf206a14607a7134fca27f5cb81975589f2a8931729e88f322d82b649f453675798fc9b86848f6c1038aba87bfa06794b0886accdd81460e77c39833067d650b51c2846e9c5187fc09b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070439d464b4a06ec1c12bd6414e9210ee34ca5fa40aec3953cd6b70c6353f4c7a8d659ecb74138e73acebc6274a17e79efaca9ad833e16bfeb156b0808bfc604f07b58352fc7a7cad0f7213448ee842dadb6352320f696ba433eadf11873fcd128b04fcdd9fa0b24287ce2e2e0ed6181bc03fb6cfa27645bb4b9c684c876ee8d02017075cc4a151ea3849b6cdd482eba2e2aee9f076d6a63bbfc1cd3e39526fd3d0316e81f1210eaaf529af05d18be446668d5c0cddf8f99f85e71a00a84b18f46fe0b22cb46821583c7eb03d8ef7b41d07858afed30f7c274abb10e614e988abcfd4d11a0644e4e9fd40b883b05ffd26588f2b98aee192d70248b93c89bbfdabd6dcf022ddcf5beb477f1d1dbc57c9ea89d83fa18549b159d8e34179d2b06b49e57996d021a36dd5e47f4a490600b5335bff98bf8b935d3c232c31fdaf8149a0c66f9542c021187330d31014600e3d4873581148d36a2e4e8576944b2f3d9977fbe725d296f03104be871a018ea55267cb5c46f1e683f2d18b0eb383e6932d1fe285b2de84f82022ecfa4cbcf2f6b76d5e75bef16c1ea994355bcac1d007a16d49fca5f6ec30e0979c2875b8695fbb6c072363c9ff124ba87a4e0eb476d942cf8f50d1ceb6b93f2a4aed7a204c1f59a345e60bd45e84c2c83c813ef15f42870ee4dd20f9ee0ed6d265a4a350e4398c5855045b4c7b343fde80d9be202889962882982f4e1fbf0bd613b2d79a8784de917eac794feb85f6e0618fd427740adfaf2b9ae96c24a8ca873ebce199db9b0b15ce25c5d773eb4c8ed9da3180eaebecbffdc241de78b7e57de20ebad5e5b8bb378accccea235083951c29ab33f3e6f6ad1845983b3a18c5f6514fc96d1d4ea379067e73bed25e01d609d38b70c0a0f4399b95601518f8b56ceda71f46433c5da864b4ea14cb3e94acdfbbb425af383ffe9c83a20617dd7ac610a5c85d3a7f468a22f63a1240c015b093b9d1888ede22cf1ecd8a9968adb9136f789e0edb45b55fbd5fdd7a894df09a14265a8a01da4fa466b845126821418adaa31ff87e18fb6ffdf30b2963e04879955868cd03e96028ad01f6d2aaf9c6df7c5697f79b3758fb377f014664425ed8573b6da5aeeb5a9d65d063e2992ff9169394442ec1249c0504e4c0d4e5dca67a8b49c976a8a7f4f06022adeb40f47caeffd21f607f30f916999faa514c56c1f064f96b5c61b358a78f01b9a0b5a9762ca5e6ec6e2d6988083185260d2f8fa89f6bd67cffd3eb0855e04c58d00ecb982a5f46a87eee48af58ca341ff7c6442a46e8f0039a89542cd234ff5bc4fdc700de0db25bcb45f02546a9d0ac80328bb0f065ce484982d46fb8223d849699de551bb08d07ae8e616431199a7f735d02a78da12843cf6ac482308b2003ea605f4ca0b16076f9ec84895b67d910f2e2372bd111fd65415593992cee426fb6642fdcfbdb7a3eeeacb8c7809b2bfb34b9439c78dda8e51846cf05667e4d1e780dc845708c59e8baf5093267daf79cf888511220386c0be053e56258a90d99abd57b2209959223c9ea2bfd4c0e39b021a27e077ed97afef87eeae4d72f9657d47a07c55ed8aaa0c8af5843cc4a97fa7460189d87abade83471da35656b6a2b1178a4d4ba001acfba54e70f77eab4441d7e8f93ec750dc8a4f67d5d5d56068a7a20c3e282b20c0dd09fb2f55a8a243e9ce3af97bb6612f4ab266ffa738051fb8fa680971586b9578c4bc2cb7f3b510b9c57f2158cd41d1dbfc3deb43bc10ee32f5ce1f001cf8395839769a2f0b66a3225c6165721eb6cce174441661229b1281b2d49bc39e9e3c55da7700cb6fcc0ad5ad5e73c059f9f24e6c5c67dfcabbb45d21dba81663f471bda95b5772db483832787b626ad8fc02107c3c6f4c5c99d8b9459ae9ea83875e1e2d27a63f08f8ba90b42298d7eda032c035a9068e2f23e65bba9a78e8fb1ed20c3253ab8543965f28b7bbab033f1d209a569c51bc13d1f9b8c31d990af73d4df03f6cff72a4eb760b1886db3802226fedb0c4700f47bc7e61b9904070aeca79a68387e5c8c2e0cea572986ba6ee1dbdcd9180be185b136240cdb02056585e82a1956cf9232d3d138e29c3deb1662889b2728af2f85fd025359c62e8c41fb26fe1f287eb22b47e26cd4db564176a91aeaa36d8d3e8688c6ba62c4b35ac79b5408b639dbb6dc8b4dbf020f5f9046f22419ba884dab5ed8350ddf4412f747c7428cf58309e4450b7b4636b73e5ffc20ff224172eac07e5287edaf770731f713b5efe81bc924e3667fbb19f0e2335986f0b067e43ddcdc6462eada5734783802d33507463fe1ba2c1611c95b50cdcd426451cf2c8001b7bcfcc87894d4da613d448c3ed260d073144fc0c196853c1d289ee97d8e9893f211af0941d5daad2c99b7623e6beddcf36150d5c3e1c4f420e0e", "53", 0, -1676254180, "96f55243108d11a5d44638165ceef6600e21d320462b7873aff4b6d60d0d1254"], - ["878e93bf03da8ab76e0290eb35a10717485cec2d64997d405d23b63b98d56800a8ac123cb003000000095253535253ac6565abffffffffded8f49b6c83c8ecd821d4d29c563e9827be40e0b3754b556edf3acb18286917020000000163bb81ad97ce483f2fa49ec39505a6c162aab7eb87f9d803fe0e6046f1a632c39d8d0e31680000000004ab650051ffffffff024c3c150200000000026aac435bab030000000002530000000000", "516a52656a656a", 1, 654153698, "22177338e483537aaec208b340d798531b3dc71441e0a511985b12a5ca131c40"], - ["a439457a0180964b4016102711a923ed926d4227c875186b2bc24313f1de550a49bdff90f1020000000253006f90d107016ce172050000000005636a65ab0000000000033db9d4050000000000000000000000009a8ff768b7841bf62dcb5f6d42569290591f12be16385780ba1ed26a9a1d39447847697c118a9b8eedede49a0560c92983fb7c7079bcbf8b04aed3d638bdf75f3f2bf8b986c8848594ecafe28ab46716d5da43f2430ad9f26eca0c8077d40bf60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000089032c5f850d5e98515dc1a12b0e7587f2e7f8e08aa6f89c87ab7895f7a3b4f884c1be66358b54f171107ca193dcffc5d17fcb1a9af954d8f3272bf0f4dc0f95fd8ae138c9af028df7931f6252921a6e87383a281c686a0b8ec32a552f54d0cc60ac4dc7a050ede354da7339e1826b8e505ba69f1a77831ea141eabc34737251021e50a34d3bd2880bf4b290503ec9b3bded96129823a97efad8ffa83d83754b080324f76f42d94e445f3eebbc01612cc60bbc5a061a3150d1028f48e6f3ab36ac1d0a294e2e94a71918c922db2bebf00d284acdd35fad95cc14e64d48e594e3b3dba32ed990fd3df8c4619a6732cf6166746c72d5237d84f57985f3cc25902a33db28032fb0a46ec99f53a680d165f0a2045157066fb3a27bcd71a752f1c0e96ca55751022f69678e44d3b55c6638cc1973adf184cadc95d2aa95c0da84a5ae769cbaaef10319d07e1be12f3572cf8b530b4fe324c3c9a06d5a22b916690a8a27776598c7b30312279d9eb42e73ff789cf3dcda44f5f0afde88bcd8ef9807045a8aa1b82b7a06032309228d8e3777b20b0e6fd90dd4044dae5de0cb1d27b9ec35f2e91601bd22ed5a6630abc9a9cfc9d38c1d36f3d67daff53768dae8d0de0e84210ef34b5c80574b9e706db08a87224206c72eb5ca0b901b7dbe662061b7ea83a4b2bdd0aed85680094fc2edba5a2dfe0e305328fd27e1be92df94d2858cf90e4d869dd79965b6eb73305bbfd8cd477f5a06fba9655e8627f5efb833aa70576e90f5990a01bb4ae86686dfe2cce5a9295b0203c3e6142a4e2bbfe86230d3e21b7bc5206274a3e1ca0a8e87df7ff88f9f74b91edf2a6e94affbfe844f485f9c758ed6e527b5ff7a7752abc355db172b08a84c373d2e03acbf39ebf6ce321a4112863af4ae09616205268544ecf11f546acb4976388cabb74e528e8a648610e39d6e3b9ddba99694d596e15189ce2a9036b9f0bf4789aa94737e88f26809ba6f97be31da0cf0667fa69b9ae92d9e44f3a192016ac576b11eba5542c38d365b340de2241c2ebe55d0906c3c2d0ea9048cfd22aa290cc2ed21a48a774e6f9b1d011e93128e1b4602f18e0544ff4b77a7f82cb1a80e5c76fc62366ee754f7973232515562564de833cfb6ba360406a4f753c5e39986acc1c8061264389f69375f179229dbffc576a47d290480cfbc780125c2ad135a8ecb4627a26f404b7f8a8c9a09b2a69a7c960504ea5566a87cfc0ec235051008d19a71244ef72fbb39ab54359b1b97a210591edf8bf5c97d488a54393bb605bfe66c5a34d0b4f3427aa1bc29f170bec4286aa56d678ef916a361ede7740f47e53bf0066f6d23c3779c2603ab9a4c0f033f335444f0bbdc22c60edf79cb90ad9e62024f12f0a5ac6dcc079eea6666d7e364b73d231e25a63129449a0924794685744935d19c2870f66a9fb5620fac95045809aaa7dbf347c2e7796306c584ee61f438c1ec843654d67e25b103a12c1fc8ba8a49fff4351c9f2724ea49cc4717d80dfededc59b522c98b9d72058958910f69379ef6a36d341942873b7d4755da87c599eca42bdc3bc73fc16680715260ac0ca5227a5e89d49bed3facf7d37210abe0f83778fb9f850dbae508766e4adb879bbfee180d951b201d24d3a2a9054eb93f2e46836b6be7e61db100a2f8af52eed87d1afebee0ec27f95ffbc5a403d433e04931e15df496dab0e02084c05322c77e82b796961ec9ab1b47b8e3c5bc6c52fec28fb0c380712cb5f226d785bf6c744dff89d0853bdb4da71ec6d551b9f6e40bc76fdda04732d124132a5b050bd8553dcfa37231e4b426c7805130e7b6617f1f65285b867692927b5d324506919df0bb66ffb39bc332f7ede8d2ecc4aee87252e19b821ec9b3ab1fbe91d1e8bdd9c0b0059e09183688b175ae143365d93470b95e068e8621714354aaa6debef4961fd9f2ed54901e216fcf04a73ca606fc7731c0b4244d081fbdc6b2ab17872cac740e2d103586aa3738e7c7f727330d780ee26c74f20394cf144f2f3083a24b5e7746b881762af99dad2b7ad5de057d9233ca5d127f48049d0d2b18e2cd43abe48c38ff7230eb6571e7f3a5c8fef38e3a9d1ff883e60cbe6ca7c525c849e42f6400ff8988a9c394992b1ad50510870de615c9222ef5df28e69ca0e02f1ab5e1026453772c4b31658b78d41bfb13438cb9e123d4d213835eaae761c17e2f1dc7967993261ed721e7f1185cdd6f34877fb678f5c5ccae4ec3cbee8e2e4de9ba28d5fa200c08ef376c3cdebc09c7b5672fb1105cdf6c2a83f0633fa003000000000000000000000000c1f8762bbd24396b1cd7c42123d9b58c9b3bb43cb2c1b9529cc4f40fcbda2b3fcdbbdab78d9cff090f2e0b8951230c99f62d12b11ed3973adae4a1418bf9b50fdac7cf402b0fd7f9d4f0940054ff4f7aaa0118b04949917d4b68ef458ba89c07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006218e1f3d49084d853570ad68f43d6212c45833d5056f9958ba794100f730d9bffa98a38b06155b63b1ec514ad6cd044f2a679ed46ccc6b6770a876c0b4402950ad36272ec9c6714deb6798caa1f8be56caaf91df415ade30aefd49ca2d0202bf6327d1e8d1d33d048a7e71698d4d9040b794cdec46d42bbdd51308e9d8a5797021ff4f128f5ff1f674d9e3ab8ad0b636d09a31b82fdec2cda9e4889c4e96c413f021c83fac2a6188edef19e19bcd53de4ceb4f5b97377593c3a502ce99d4a9ba1f40b1146941dce85d04995518d9d9736842b023212f8194df567d99c78c6d3b8976f032f49f3e302b94075c087961d4b66ff7fb5832773e92a26615031d859ef652c0321212ce6a1790388e28bb7e60afdb6c8283db7de1c25d9b8c407e111845afad0031a6c5c60ecec70ae3fe8316f2b643cc1d0639bed325258527e4a6cdc0158ef21021fb2367223908666979ad39a86fedeed3a9ca3b06bc7e2414ace79b022c7d5d1030bae5deb43e9e26ac1140a094a5c2cd00aab64e99e2bf40dd6609a4a5bff8c79021eded15b99f507a417db2113bded7b726407c917fde30b63a53c3928e1a6593ed1eb64a3f02aee3c172b98dad2807e19691e526493f42603e437e8f2e30f3a4f1a379814683dbd2a5deff7cc69ad158e18707f339370b00bf010b5c5c4679934c03c6408de0fa5dab2e4ed40f96be80c3c4fad7ce1c4d365e421788010f2538957d5f774cb5cac8a386002de4c370dbab19cf9369daa5e7318f5ee07281a844e5337a19a2eb98c160c5931f0b6eec2a79fdc5f176c17e93eb26bfab8eda86b8a6d584cd271f41f18d9046247d4160805a8f2fd7048218d3f219a4adc939c971024bb026a309057f938a1878166a029ea0e5f66fe17bac953ae89536d3a2f9051cda00c9e282cff4347bfdd56b783e75b7ca8e838bfdf9f72c1b84133dab0461b53ef13a8ce6ba262c613771d1a7e39a2b6815fe6155945f4a95ec8581ecd2ab60c7894cdc4b1a58a5e4473fb77081ed1f3533bd06cef78bd866825335fdc5e3d180039380ace265e4538a304e930d4180c31452174408ee40a06b2ad8496799b1159dfbd6e8ee9981b6cdf3b400cd8d32578784946311da4bfe81c50747248068d7a7fc0e5998c6c46dc4143a000ece438c20917ab43ae0a33e7e7840db9b9b13372048716df912409efd95cae2d545b9bfb165aa3da500a019fa25398081e8900798db73a144efc8e9ec96a990c77438fc1980812a96c1164d9b49326c124f0ed1328c23ca897aa47d1ddbddbb0c9489bf51e6f6e44e991f59c72c473aa53c7ddf0350df96858906a395349bbf255efaa9e067db63554a6c9126e9d9119bd27c140a6b15e89c10c4d65a3e46938eec62c7c29284e6bffd8a68bf89fe81543dddf3323e1818efd2afce48a3f5ebe7b44a8603e43127beb5175ead4eb048aad9b1920d28142377ada59d98e9755fee48ef1ca9694654779c611a6ddb3efb1062e4ac3b34b4c8e5d71888dd1848fc43e9bb660c24a354a3433de4c639259fd8664fded42422ee270f2624282a28251257d490bbf699f8cdce1f8f2b29bd27f3ae8345b7627b74e2dbf7000e8afe4d26be49ff0510dfdbeff4ce10ea59a526458db2b9083d5de0255b9374e1d0aa39f2d0b37670bb683a4bb061a058687c84965f2c527b8e2e19f1a110dbc2778b5d4942ebdd8773b5bbe0dbfb4b24c5082153a6b0cf5fa7523716d2196b82949ad6f7a8ce04ec1cec561199148b56b5548a7b2b4ec8b9c780e94a7cbfc52ffaa082b15be437edb7c181cccd0376bebfe0907881079828c9dd328efffd28421f810e39a2e35339de2c4a8b24fd4f591fa2bd79fccda951dc3f98c7098ffd2a9ad2118514e6857977e535eeb94579a91d15619bfc9239613ddb2a960d8423b0d2e12814a2fed1e1e0d1d90dd1c717055675cfb18d5dad56e5d14b1c07be2ae76da9384bb6a0893876a78438c7cf34eabc03a7e981f74687f5c86bc8cc85d6965fda9b1cf37cf8e69e89447a2b611609bb1f7ebac7404a03d4e40a1d86db91b59439ced38386ac024eba3bc5c8c8a914d34f97ca6e31760afa9ef62f72fc29df0cf0da7d58426204267e0558f2b57dcbeae63f0d43438caec44deae52d48ca503f799cc0dad26c8055bab98f88b70738b5c50902eec3b0010f5489ce2a40a002102bb36f12dc0e0a59b2a48da217f3a2074426c79466fcff8ef11f01e685effe675ceda137975f6ef0c3a8b5908f80a058fc301d73c5ec771de0437da7c89189f3efa3e2fb4e24200000000000000005d72e20200000000d34b5fd577b8cc90700416b58b4f4d456e7ef0034ac81205aa7c9fff577931194755ace1232b67dfbafa74025b597615baaffb87ff792ae2b4a0c69d492ca64461a60b9840855c2610fc8f69c9934a6ce3005d15a568a53115946e3227a7991000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000acfff3e09420cbfd207fbf54e225f7e74e42c57ff1ed40a2f7f286f1b3c3ca004b64bbaf98a93c8a2786e27d5c2b57b4fe9200a962550f1d028f75decccd15e482aa5cd2e148b0ca4e7c8ef1018d25b33680952bbb372cc383e567eccbf00cad4724dbe34f70da58b6f7a84ddc263ba011aac5aafa11bd7827077a2de381314402104cf46c26d3c693c1bbe7568379c257adf2e65eb60e38ce9720a4846b336bcc0225d91a68f04f55f9fa7a96155ade1c234e2c3627c2702ec96390f961aef9d0220b2dc488967af75020adcb3d90d0e6be3a0ebc7dbd028fc1145e81dc8709920ff91aaead93df02b98e5e0df7d9395a4579ea217c1b1916ab1bbc51bf5dcca3036b030408e2dc5b837d512c4df658c414af4feafd360541aa53e61ee21ea5266a10db022f48e34f765592b1575f276a55b9559251b585de585e2b05fe2575b48098192b031c9b0096ae75eec0ea27b87d527f51325f21e3b7905798363854aa0793a1c45f0229584d9fee2c020d5dce4fd25c729a86f9647313c2c58899123b273eb7d945c10317fc08e5f225d5ea0f5d6f3136d249ca162c06b32cdb65de3f6b9560ad413643c0add073b2a3d1c74445c561a666ad7347ed5d5d44ef084a7b4238df1e9e8c1621ccf26d622ef87587278ba19d7081660ce616936bec2786d4b03286746ad1ca3e656d8506ab1c396d01a7b9f3dd7d72564b5b3dd87f88a228e4a1136dd67a30666f8a861d685edc1e6d0c51d0fb7e68b2593387fdbdde724e1350f130510d0553d7d3a180c61395720fa8c6eccfd33fda460fa19611eca46976197ef61e0739c891f85ebfdd6a00ea38d192f98778b3601f2a289d36f8d04f011816761f7edbeadfdfc07a0b19b0c805c02df94cbb56e45e666b97b2a8114346186a01b51b600ae535980f316237db9d85fc34d8800938d3d4db495c42567272368a332b9dbcd8ebf0f4fdf9ab4b5a62784a739932e8ef3ad5cb91936110a165657d1949930ea9fa211fcd0280397a3e1925955b9448eca4b38d1ff19268fcf886316af987fb7c48313be16df9f795ca348d9b3f34350c790f1ed377c86703d8194a50aa4b0fd3dbb74cd836ff2d26028d8d8a97bf99fa98dbd4de6d844440a8a31c0948453245e755b4b5882152a6f631b43ba92575bdaadc0782ef602049c5630282bddbbce61e2dcf89635b3aad8ef826f5729122a4377f92a4f7332f6d79891ceaabc78f23e8a01f000b7e09e7ac0079d007b2268916bfad25948d12a38f092310f29d75ce45a689a7dbc437d3fa699b4369cd1861adf6c9f019a40265cca1c8e07394cc62928dfad1d766a55fecd3e87606d3a0fc6ec0b53cc70370b34e9ffee67da868f34a308f7f23e8a1c0f9053f2b9881ef1f261e1dc22fa8826d61b259e7634c23a1323f8266d42322a5a34b8a53991c9f85a9e003ea82703aa0c34098dab089acf5691c3340d06363d95e49cc7b6093dca9d07e95cc34e79e09d9815733cfbcb5706eddcd8324836a1c2286b92cb0c663a4f2e13c382c81372a16414958f155194149e59d79b8864db508956e0da4ae6e5a035197e38cf32a9018b82164ee8c4f955c9326611b0394d668bf3529c829ae3582ed2675396182a48412bd67bbfc87ab8cb809fcbdc9ad62f84c0718a2ccedcb77e655c6c9ca4d98367a7a8844f8573558afb6cfd7d88fb07291f9b6be3176853cbbf745b92384dee2969719f17fe8fabac2194c43dd4d3080378e382f8b8aecb4f624f98c57b61fb3f64ef822dd96313d7541526aa9375680f3f9a47fd0cfe43449049575cea45a644661680a63aaf8830419023da60df47d68433c55455bafa27a4b2f2af5949ea5a8fd2d0ace54d88ef0072c48d36c497938c9c7745908acc7d2fb16c016f9e8c0c2b7a0b5c57497c6785eddefebdf109780a342b0f6230531850a22f27507b16fb900c1233ca69cb0e0e54fb134ec050aea0a074e6a1db65498fc0b5b4923a63f2ad2264443d53196b4e75d4aef91bf77b4e701cc941eaa1fa6d2abde8ee01bf52dfc88392a6333d007ab3fdaf24cb2284ba59bd0db9e7fc1bf1924fa56eb08e493dfde21422d95a573ad883aa4e193c9259727871bb3dcc34bb30d5cd63df39bc15af3ff0de8c6de5bae0d4fe844735e2ca7375e22c4911ba8c2081bd37c8f3fd0f4ef4f95d6de830a0f05776f8e8ae25bbdae34218a360f93b9f8254ba785e43de6fdf2555230732dcb20f3b3ca9e267bf92f9c698f6bd254b5d429c8f53b8a776af1ac4e28546531d4153331030dc29a88118f233be3c57a3e4bea25c00e18c49007019304f1956ca2fb84a8b7df68b354fe96cf45b610c75c8fa35e34121dbab78e33cb15ec32b21339529ec077eb19d13110321c942a5187591f9b08d2e33f195b352de92fb2972bd1d16971c4bc05f4e209ed25fa07", "", 0, 699689189, "c15ae46c62646892a265071051de2cef71842bb33ae9294cbcf8896c34398630"], - ["82ac9c5a017068bba7ecf380b207d33e93612c7db339df73f593a145dda9fd32aae22108f5020000000153ffffffff0165591a03000000000263650000000001c3c7c40200000000000000000000000026fb1f241ca9c504f221e8436e535bbb714e2d4bc57ce7c5009dcb82ec3c02954d31a185dfe73a923b357af54834a1171c8ea5a359a0e77b917e3a3d46705825903cc7d4e024e9f6e84033e23010e202cdd01a1be1216672f59b85449a4b611a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d687d4424377733d25b3ee860123d78a939a4c03b488327aa8e3b3020bfda0d481ccff08915404e7793c93d2cb0ead38f96c28f1d6178e3b612e8f93ad800626ff05cca34f7e7c75bf150496748bfba43c0ed79eae70499d5bf09bca383b09cf2a63c014a7a5a5dbfaad28c85e012416c7051a32e23eebe9097efe2a5894d8032c924a07295c6166d4a5cc60021db741b2e41147f7526e8cb7a58512e2652a8d032ae6e6f3192878bbb40851570d21261cf5c2c6d054ed123c8ab376ef588a28dc0a132aee74de075677ddfaf7ebae085dae65419c5e9d55ac27f7c59528482eec0524872bb3ad544592e1b9cb90203fdb6da9e961b30ad0ededeafb3b9b0f0c78cf021976dcf9b9c3c7d9d807934e1d353d9f7b12224f0c8a857bd0e971ef0cd44cc3022b13bd143df5b72718122efae6bec6168bc0db7668074ad6aec24818341c27c1022e17b8c25289e3239f19da3eda2e53c5562653a8c7499b92a153e92e0eae0cca02083858b18d149d69c585dcb299012768d1cbacb89c80d28c3681a18e60729dea0221c7186d061e9ce05954ec24a56045a0095ca7b447dc95abcb413980568f6c2440d985c9002a6c16471bd2c7c3f9aedf68aeed8af18be62cacb5b4bd1c1c4d0ce44380a27d3233bbf425582aab10b8c52c048e48c486c1978cb40be8ae1c8427ecaf9f035b595335b30beaa14660f544fb181c25ca0f425a4ee61d7feafd67dc947fa8603fb3e3210f163208f1efb889adbabaf109329c61f00498d59926ca93e3da3fe151388ccc2e0be10e6bdd301c877593410ef1aa2b9fad84a9556ad41c2af0c18771d2632879b655bb9cd718399461ac95e49baa71a8feabe5eb8d3de9447c357639db284dd4dc4d18494be8614e9c52a68c25b2d86ecb17124699945bdfd8707c5159ac3a2142c7220d279a386a344a0af02ff32d7f97d5cc5bb1ed900ddc6d37d19dd49b79ebbd6a7bf7d90245324cc52e6ca0e549e21918243d1daa461026e7232d30f4514f2d423f6627a6a20a67df3b3bc5fc73581f071c3b25d1249971df2f8f32889520d84a1a07bdd09070f0c7eb126aa7195f3238fb6cafa22a402d8a9edb10b562cb21d6e87d49a670f9f9062a08ca1b93deb17700361c8ab6172b0d9a5d13c62831cfb2a2d887f3ff1f78ec2a1ffdd7c2b7b6977788220d3996f1b6393bd1a801f3c8e7a6f91f71e72f1cc890129216fe2c616aaddc58ca30e2ad1553c9c1066eabd614a52bc5b75e2183ea2515417490eefabd0ea8c68b18b1695b494008042d7eb14f3eef8109440fc6b77d3d0d15de5751973e4c50afe1dd2c2adfda3296843dde41f432916410c21af9d0b83baccd3b978d8fe054eb649bf9c8de50043841dfcc7de2299daf362d5e350cbd95f4c43112a805ea94f0ab24404b8c40a3396fdeb46551ab50a73dffac2a478def97188820e0ed75ea89f9c923e1469f61e10521f5a313d94bc02671a885284b763de627c9dedd863503dc911e73c5dccf7e649bc722b489b845a390ad21755a6e6ed4f1b076e86f2a05bdf1bdc55bba7bf10395e4463cd84d33c3739fa2e23de4baace991b1e549dea4adf736ceaef206031df8ffd301d579b51b4ba7329319fbdd389e79dd8e0583ea2e26878901d126bfc060401d1d3edce03215ffdd2996ce1d8652aae4960b767c089f3eec9dc3b77dd23c6de4266ea712144d25e0deedda3b24039c32d26ddc3a293ef6301b9e33ecef62315c14242955cf9477f96fdaf189b59c823566703bfc449c02e7b4774dbe996a01078aad6afa8e9ca0d8781facc2f4c601912742e263df5653d1f2fbee72cfbe215d21a7388ea2a9df9785f65de0d971df18d50ef06706bb3719ef2aa6b9f817228db71a1afc62a96499629238e7c81c4d5b421963138f8cf455a9ff9d8eb9e040781b92bd6dd9db4df02440f5979d4d968600ef3d8b8fe391a13d030f8864f5c517c9e2fcf5ce29aadbb1d76119f7622111b2228767b86cb7cbbb7b4ae8702a0e316cca9728006ad9ff3a096c297dde9e29c976bcef839e9b8748b4abbe1db1ff2d78b6b9275433e5eb479016f7673636ee9f03406b928f3ae6181de100be9f1948b0f9e9fcd5c1a9ac67f917e35f82cbc3c99ad1a739e8a1f609579973c82c6fe77f65bf05bf3e0d24f0599047cb13515c1f32b16a3c29c5c3f37cb3a43a88178518f4c6e5990536d386e93d691e323cfcce6a7aab3399241db9aee4987dcc3fc39077899d6ec9e4e09a7a6a40277b02ed725b2c66278b5de89f0160cfc56fea8d0d9b6bc2e2f6656fa6f5afcfe3905362f45cfc2f153215126c84b6867d2626170a32ffd2b15d113f1bbf4624052df7ceb599915a10396c0dfe82864bbf92cfd52882425f7d76fe9c999a366e36e19a68e551ae22e2daf171eec29161e18fca032b3b3f9e6e00", "", 0, -1856072120, "c13ccecd01c3a55cf6be70b12a9b8abf5156c76bb4bb1dbc3517d6d5479e9a28"], - ["94080c8304bd8cbc25dd597d5f6f90c45738d968269ceda7e0eafe4ae40303ba87ab255f0a00000000045153ac63ffffffff0d1025e21795004b21b9ffafde52bda8bf00960bf80d8f50063613b52a5d640801000000026363ffffffffca2f7580d22e2505d888d6218612e0cd8da6be34de926533051152cb156dad8c020000000453ac65ac5c6163500efdb5083517d6b9d481f457460c95f373cbb0546744124a14e518fd2b8528b800000000086551ac5365536a6affffffff01244a1e0300000000036353ab0c8e4bee", "53516a51ac53", 3, -623078067, "1c52caf592af9810c424958d6b4ec412db104e244dfb08a408504322ca9c5888"], - ["55b531ec0121b8a708f5612bec69987a38adad2e368415887a0da8061a6085113adfcd74b7000000000965526a526a65535252f69352e503bfd6490200000000066351abac5152385053050000000006655251006300d81b770200000000016a00000000", "6a5263", 0, 7550576, "83dd52f7402ff4b10f8022e0014cc13c1cce863bd224089eefeab5b8bff79047"], - ["abbfdbc002b7476778aca611d376d4fb6c18222656258f6cf646cdee1405a4332e98af406e03000000056563516500a4e902a0aec3db82928332decea4b6c1709d7b6125c4288fd98e176ba05fb0c819182f0900000000025152ffffffff012fbdaa01000000000500526a636500000000", "6a000063ac52", 1, -744043499, "00ae05cbff709f588ce4d2479a499dec122beea0ddacca0f6c2fed90aebe58de"], - ["782b043804cd2719dc75c897c26ae980542a641a328c5b5ea0880c7a355f224eedb24b0c4d0100000008656a6a5353650052acb011bc64e9877a8683e00f425b81d6d412585509de13c2a14316509eff5ccf44f34c340200000007656a515253ab6ab90aed62df88fb3ee5f4c1e08131926c740f8b875814cd0e9e19ade78bbd63855adf545f0200000008abac00ab536553637c56a0c60756330c0ebc3521f6e62229787a2537613ece765d2087bd98c579ded6c229a50200000007ac63006553ac65f98d1a78024014e3020000000000b2fbe8040000000006516553006a530000000002ed634300000000000000000000000000a12884ae0b2adc5b56d9899e4f9289099d00b37b0df765de03901eada8a42a3dc9f4f35375022fa3d30cb5281782e4d5b287916878a79db72c8f0eb8dd8fe31135ee1eb41a7ba742d0940d64284c62fbffc64f1399e504a1e82386561f1cda57000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c96f5f2fc62759842b8811deb269d470af478b41424b71b57a63ef84995063e1b7c73fb96025c195131e8a4871bfd4c75f7f9a7b0fb405004e45dc3be552507f27e84ce35f560f49d7268d6632289c95069286f68a36de0c2bc8f8fa502cf532fbbee671ebec40b84e1a485300d2d5333bde69278cc5a31721038d1571a5284021a41a0fb85f614849b87237420bec97da85cec214c3b022409c469eccc193c48030c514904e3eb1fba250583b5177a4c2209c15cde1b53b4ad5d50322484deeb850b0bda7d206e791d0c9a3dbd844c47d3b3dfbd9d83e42a3f34e563c29d4af18f4b2ecb8fbdc094565c6697b7b0ccb2042068f8dd25d9c25b509dc9c1b8f583cf6502058c14687338356e76bdde17d7723144e73ee99ad127ad0c63e07a5dcbfa47e5021ee4b83ed808722df2eaaa30e5dfef12cea21296db26f8f3443a4937d668790102233d467a209d43f956ed927cb2ae881dca203a3ec6b7e5396f3649a889c7a84b0312aacf708be4a59670965186f19c552536764aa70d3109bd634511a751b3f0ac0203bfaff9af00b0d9816044c66a5f14dcf10228db14d611c91e7b3ad9038f0e6aa2a41b7a70fb5e62261180c33d9c7a0103df99ea4a868e430cc7afd805c2220f7b7edb867426fe060da4a6a61429d6763c54ab40296752a667911c465cc6d9eaf2292ba973715795ec0757b41b43e5a7b471eadb4d4a59c909d92936348b33c12b68964309db2b4c0654e68570bfb55e42b349a461123bfdfebea511b4e323a429376a24d37d61130370000d0b4b763efd8e7b3118cbd7817ffded8913cf77c7fa23bcfe4aaa80ddd347fdc9340ec162442b45bbf3448136c926debc81e3865065e87c11acf8c17c1b82396a1f75f0e2e216b5669777713a6f96c4509ee4fe46af19111f0e29787c5e5c8f37a92e4a878ce30d0daebef31ecb9fb01836dc9b3866ecaad0e8c1bb1c8f947254cb0a5498d2544f88de8c13c46f54465db8d5ea1796b83ee5434d412cb024ee562fe2a90e84377e4f34aa94ad7a98b2f5a698ea4a88c09ce68be2624a2ac9de9c09cea50356d9d270360c4cb291120f708ea1f2079c2732ab60ac36adcb97febd8d4378543336f0f2027eb0a8c34c274a01c996fc0d782abe95627d4e5ae6e61f3d56e50f3d18bf8ffa083a67a3ef188ae02a473bb5cc5ba679a7f9833f9b9793512fd0172f5db65a10d420a5c0bcd1f7dedf5178dcf6d84fba0214c1d5a4377617d98e31a18eaade04ddb868f9b58f1bd6a9bddb804c7d913ad4d0e70fbed68722d9250c1a12ba6c88540337165de435eebcb3b5a3866dd5cbe44b638702fe547d20ef2ad95239c85e829b0754f71a6722ee17422de2173425ca33dd0c1d2efaf9f59075e35148bfd05938c86f89b1193b35348078d97384789a5718b23aa4129e69f1ec86a76bc59d512f37fa16382971c7a3ecea4dcbd5a926e00565c7bd73c256985212c748bf33fd7f104a675909e43e99e4a485442d56d5f00b7a5b5e387a8960573b33b74e520d84ba641cd2f2dcf82dd39605d7a8ebbf01ec0e7dc4e28723e846aab9c65e3b3ac5452f303eae1549b65b6a99710b2f7ca64532f137eb631bc8f695c37341489200e189fd3af02db94d7b746bef89a3df23b9d22607daba3420d957814bdb632a1017a9612a143ed8abcdd41c0339aa60cefbcfb88fcc7f2e0aa4f56d0cda9683c0027ff110645d432444ebc3fc034efb9574422a226fe113ed1c2807a445e1ef55e4138ba12db432ecea02d5ce7b622c907989e7073b592e22a75b00181478f9a4c96469e0d610b89c6e515d86ba62d70e9ca9b66958e722fc56e1ac1217559d65f79418f5c07cb036c7ecce8ee09a987fc8132c2c06e64d34089cf3a5beaf506b42dd964be1239258f52d684fc6a4c04f42c3c94988e0b86cf35d9de7b0dbf5e17e9512102ba1137c8302f9cf8031c57084976293e29556e1a39ded12f08e54fb713619c5a6169f8f6302adbd4e22566b0fb26d191730cb33940112f4b5e33fbe2aa84a32ca1e7207cca876a8e3a70a0ec340edf49211523cb05d65a4c54ed544315d265690565ccb9e701659183d090df3ec02fa126b3b7fcf54266f2ecf0df1342b9fef554221bfb3b96d94b71d7e07a799a96f793500f91c1cdfdcba02842208312f1b07435b280f3d4c20bac4e9be6bf6a37f9c9758254ab895a36a7dc37d799ccdbc14c29981b6dc405bf94f8322c1d646ce75a74707ea7bba9282415e51e153db997da721fe57f835d40a498ec2e860d6a71f79026b25dfdb00000000000000008d652a01000000002cd5f6a9483d18ac91e2053553dc2e4d7c62df545572523db3bb327f572fee4cabd07ffdf9596c6abb558a163ab8b5706af308eb390dc9c69fd3f2ae1a88d355518f58db9b7b0db9e6c5aa57184e6d3c7a6abbd077f0a8fb01f25502db15d71500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000234133c8fd12dd7095c23850bca3afac86e077af8eac230ebce11e547895eb513c56d1aac5eb2318f950daa32665f0e5d9373117c8153da23e08494814cc6d3f740bd5ad166d769386932df4ac11b38eda6eb6c2f87a679e2429b9fa088602dddc7f28f793242cbef41ac0a4bd3028eba809b5d6737591e9133c35f4190a95cd022bfef8965c734c9d08b8100c4fb396501e0ab083b603a18f4752de095b0dec4d020a2de9f382564421045661b7ab331ce292228f2f20ce72225699a45bf9536e440b0ac87e20a676bf9fdd3c7801fc87a8649993f98b452914dd1de7f9dffd7b069b0393170dccb833e680751039fdb230b8625a369663ff19e542aa3937307a51ad022c1062ef9c76ee29394fb84cc46ff068148ae545281e99c4e91f390df8b7eb440300ae56b3ea848d2302b968ff02c79be75eb79a9771ab6c105e2a96fddaef15f9021d28fa6d69d2601e23c3488ebf6c9cad61e8d99a387ebb81efc5d8f6c45cdf2c02015c5d5f4d6ba2a9e86f9ff4614aec9f55c8e59e250f0f7a560eb35930437f73032617e43788014ac1e19ceab5ec8f1e749300ff73b3cf19f583d3c3ec9f0e5e419dc1944e6eb6670beaa4c4707c9a4fc912215fac4016ed8c9c5b6eb66259a12fc8b4c745c084b247431b4ec1c342d5d900c2ede82d7eaa68a659ec7a21c1737a95b641f2a1dcbe4f3d119854350f9870b4efa801db52e3c72a24272dc91b6978d58739374c5ae0ac66bd4d9e15c9b66853fb706dd016cab802dc6baa379ae717cb397d53e9b5dc20401b785fd362e9675558fa5eb48b4543978acf8f6e3152e3b1f55342b6a66a3b4480777a72a5f69332d306b8d016315112412564065b06264c951e8f36f796d4b76092f7cd6411e2851fc57c6e919484adb824ad47168a2436ac9c801740b4a8674c375cf6035cf9e8164a4b187a1c52422cbfa051ccb28350137bb9ce0d685c42e06be256dc3d302b7d61013ad03a71d77c43c1050d6062630905d261a5f2b199755ffd5df03770fc2ea38e7cc3e8bf2116ff72688e699b65189f61a44827216ceef998f9732413ce09f132648f3a338e7ce7ccb630ebc69bfaf0a18a4cbec2c0a84832569177414f6b1515c824b7ffefceba28dcdf9efb5e4d99f43b09131fd1a3a7d838f32656c294b3282750ecce1bd51451d588f641825f68df25642558aaab76b577ffb63bdefa4aea9537636fec9c0bed441cb61de618670c27764e52594d7e832eaa7d04b6c5ec57d72f7dd81eafa2feea78cbeec0886fc85a2f94dd4eb947728f585b726247f92313a6811b6e5cb21d4ca96cfc752bf3259bee98e97cf2404eebaccad53024fe2fc01eb4d844614d213e019a8d1a980ef69a30438d1ad1ac57b2a230085cc901c5fe1cdc1688819594af5c96b0f1745f1599a341bfcdae3f2a703f9ee4d033b8691b05a1a5f271aabbf53ea07c2e0407af579b0dd8d46f2f1d7092281bc19e235283e4b438dbbd398dd2c118c1bcd045cb698203aab95faf1315715bc084dd7ed0b773afe404bb222cdec8dd52f3be63a0a0cf20a95602b964601da576f3b65e4e61a50cbf6fa3c75447e971b13a1c79f028c713fb59197cc98fe559d3f72ef5aa19498e3a9f88bbb7eaac67c6a37017300d8d8b4e251828aa9e6aea80f0b5bc30a4eab370083e9b8cdab23b79cf9a25d030a48f31c20eb574139c0d10cb867a89ea171993c17389a4bb9ae1b151efdb4f0e67113505708848d99d6a2265af17e07dcc9452cb16061c74d8a573810675f820f6c94c2f9825b25f62e862ccca8004af7f1df776788f12c6e5fa9a5398551d5561ec8684962f3ef3ec8042ffdc5b50bba84b823959e4dcf952cb2115a387414dc3412af87a42e6e9fba9c92545c6b1d7bf83ccc3e8786945f62fb1210924fa2198172a12e1dc782cf0140e4c0d4d2db65c821fa4a29e035424981ac489fe7a7bbbdb6fc3374027ff1cc073499c824eff7f8e0eb29d680f6024b1e0169e87742e895396d703fdd01e046f4e9d7c0b4865b57a1b1377b0c1f1aa373bf0602e623d744bae475d893a5d603db64453d15ddbe2abd9ca27b4fa5a95ae87a4e70a7724894555f2145c8c83afa5a53ee750eb458ba06ce67e2a52db9137ce231f8ad7f3f907ca936d7c052fd0a3fbe95acdc57ef2fdf42641a5d73ab9aeeb1b713b96be38d73e5ab81bca2897b4a2ecd1af7fe15cb692194aa665d11859445decb63aae2a8b00567f27ab0b653eb6cff08f9ade49b8c98cd2fbb0f014299f179fb62ef7e9a0fc45af2450a24504807d5cc32bcde02d82c2527b5ce094e5e821744549bbb9fcd8c0bfb7b45031332146b8afb927a3ecc742b3cfafb437b6df47e1658efa614352ee24f8f4b5dfc5cff29abdae18be451ec81d266030eb7c62542362fe576c2a442b2c954283ae1b51d907", "00ac", 3, 186612117, "f0e8d52bd7e6330a2923e97ce8e33c815d90acf03358a2d7bd7a092a3a1c1d56"], - ["6c88ee1402d257547566ad4ee4310b85d079b4b6f1da8e7efdf65764b10e2eee1ce0250e9b020000000952636aac6a51635352ffffffffa1a53cdadc18e2ad71a1e81417f55eaa12ca18bbb93365a313ce989bff7aac3d010000000765630063006aac3808196d04c1333e03000000000265003e9abe050000000002525285f31a010000000005ac00535163dc08f10300000000046553535200000000020000000000000000586f5a0200000000e1e5f9e35e83a773e7d4a47228d3d02c228e85aba23c39062f256274e60bd501981134bee2128d405f53c871e2ef1884821757819f8d21693e46f0a9a8bd70099ed000ace9c34250e05d127086c2da126300cb4aeb691726a651451ba02b1054000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a4fd2a20e2070c47d513c98c107db81e0618e84e35842fd87712abc1039aa21cd11b0c10e04013ead56614cede560a67c53f2160dcf10a5090516354ef1d5470afd55f45de81db4a44ed2a6a4016a521e85e88344c59e996556ef243366d151f1d63f03f31742d83e784e9abf503bf04549390b65c7ed7b83a1626298eb3d1302082619ce99e9871b0377eca8bbb84575ef3320cf76ff4514146b480a9cac2740022274e6297e3b3644dc967279fdd30a19890e09f5d83b4ba9ce67f184cf1e15d90b29b77b31bafefbb9ec6e2ef9a3aedf866beef71eae4d510cdaaea5551a6590741517f44a70f21d6622625e81ed82345e2e521e9cf3d580a5811cc2edd86b9b2e0329280769f0fcb87df6f41d34b1877b75176dc40303e9d0b1e05f17fc595f7cce030691411d28bc444b47c7bc8ef037096c2583f431f1472e85a7a06947ffd955a50206e5036152efb2f527fa2ab53461f25b9ecb0d120154d0d0a59529e44b2cf3e70306ea533218a1b7bac534926dca28c82e4599c5931929cbf0faa5da65b4049bc902168aa686921c1182287c619aec53dde29eec03f93c86a468c62d219df6d5f49b561aa29968412b92f35216355afd38ebbd531035347015edc34cb35cc61520b41d1c90090e6555ddc40394b2acbca49453467507a63b12108349dc0ed62df1b0f301c37424dc8a81296d48dc1aa898b0660d3575350588e25ffa0279f3379715a3202faf7d7e3d1fdbf858a380f46d815604293918d6994ce998057dc1bd7ed1e6fc8351944669bd34a6f33a921239fa5fccb0a279e3294499f30493a75ec58e6e74bce78ea9710f2fb841d88305643596d00d08c4b85834c68a1653c57f94e8fb8c8b538356cdd8c311b44d184a5273caff90991b1d5a218da1db9cd8d534f64d037a29ad0776a6350bf16637130808f328806b01860f997176c22e7918a459b59efe6b79577fe3e2d09ad63f423da38db8e1f09ee2cb2dcfd20b35c2fe2e40200aa05a615ba043cc57a41ecc74a088b85d2bbed097d362cc0b4a19fdf55af2d00055e275139b6f60c5aafb95d0ef571b786c73ea653bc261e7842ff618dc6483991c193e2bbe1fa5c06d198e6ea7c799ebc0e8ed34d3395b7e88e24bc0a5d28662bc9b257113b0595ca91edec0e15f2071cd77bb66cfb5e743681bdaf3a8892ada7c1c31805e830618b9d8abc07609922fb10cc2e01f4a62a95b8a982b9dc1c288a4dd5e93b5e927acb67d0b742ff5ed1fa8050328204d5930037d5a9234d964646d0fe37687643e40b5c41e02ca03580262e31e6ff02c0adad8b858f65705b393d2871f559d7a941ae1b072250b8f8b20ee5b22f067aa6f371e0fd8a6da440ffd1345656ba08b0822bf04b46fc397c770fdf8ae4ced8ee7e664127a9a6ec6b57cf8dcb74ae94cb3d957a65e09442aa7a87cfdd65e119a49622dfc4f7d8a79885cf7f66e9c3e9fb613e0ab1dc9ee9b59675e40d0d7fff097cb83c5d83a175e256ce8664c56309f5d4ee0d97418869654e57a19005abb0853907da89e9da83c6f90480fb85ec87ca44844527cc74a8f9d43f98f4c9df2f35ee2a63f18eebcb906655cf3af689d013c5354a2c6550df358d4fd8b6b1a3da1da8bdc4f430f709e8bc6034c62a8f55fe10d98ddc148a142c374e702b52517794c20027a35b6b83e8a96edd56989feef5c7073fd48ead31d7110b61ecbaacb7089d4cdfd05436ce1c162118bd8cda145b742fc0e85a59c26f4674ff35be2ea100e6c5d6328bd86371a166accbd16d339d05936037f59714132d2183e2ffc0ce2c56b13d118772f269a3a14887a64a743f71556a273afa582472b681c2262b9ab58cbef99dd55392c7a29001fd49c9eb936c75519166d6c9fd0b53586fb9bf1e6543bd4e11293e64fdbefc58519089b3b8636ac8726d7bcc8bdf523761df37568af19a67f2c46135ae54bd4468be46c84b3b4f66894e9c010646291bbeaefa909756f744a8bfc01496ae6da05aacea52ccbdc384bc7f7cf8ce8347b178b838888a200e378f758570ab156fbeff226e1de615d7e395dbdb64df31e4829bc4a3e1161ebcd78034b20f735481d46f40440ad6e9437334b8da6681ab46773636f5e0ae6f32674cf89b26b2283ca0b65399f06e1557bbe796d3c4269bfea420bd1de629ff28341bdc46f9866df813c6a3b9fcf7454973a967010797b91024b3ed9e1ece7aae233d599d245b95354410cb5b7a17027e1c6b9f018965faf5e12e6ff946c4d1121294a092b036f708841e2b781bc50d3d093442f980ecaca000000000000000043a2310400000000b8565e3af17e83f3eafc1821e71e5016f3c28313b5432ab47ab1f253fa3ae24fb5103348bc92b987166bbdedd83849617ad0993beca9aaf91fe5f6b1842af2097996149b4b05880f10cb1e0a5a7d9f4107ae240aacf4da4d456a576402991c3a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077141519abc615aa49841f0997f1e759f6f4ad9de39fc60c42f4b6683fc084823b9b7774b098f13736331b658b547833b81a9b0841b18deeff453aa159da76c6171f74abccc0cb0182efa55468776a7ba7613a90be0cfe72313d051b0bf1c3a8a7832050e12baaf823c39321acdab268d7b648f5ef1c7c958a04b6ac6a89a36a030055d998748eb6cae46cf10019058ec0935725ffbc8c5f8921aa41bbc7a987d00321fa2419823e3b6ba17ef475181e927d57b8cadbb84c82d2145fbf86f4c5bdee0a17ea9d21fca1e8188d2c937e1f3bdc00926da3affdc525195b3286c29da62f03101d0fcfd8b612b88abaf813ff206f9b1cb0a8f915ef57c507376e58007edd2f022042790357c2a9017612776124580cfe5a9f21ba886edea1851eb4cea422f90c031f5ed76d265851de53f467e806b965b1bcfd3d06f03fc035c38e017a1cf3ac2d032bfcbd81c35d56d7c1d25fbee6e9088d8b2dc44573e8f49b746018580892bf50031866355570d950b90f35107493b70405ed35c24f323d5c58abdf263474d7d23b021e662bcfd93feb218b13528e7c6cb492947da095e8884535c4385f8708986922b1820bf2861c1ab2d4e278db70a6d2a443909730d7e373363896b1c66a8032b60544a35ac953b0d87cfc2314fd5c55411eb611499875056ea42e59db48d7eb9c0740a021197c36272d807fed6932aec18befa48feef2963ac7b0b14b3eeacabdf2e9addf191c8b92ba5f3211b8161cf387586ce1b82b58a8e394768ceeaa5306c4a787202d18f26ea8f853288c6c3b61615a656bf5cfac0423886ed6859ed01b045d512eeadb868d1daa880e36fe42ea03b61265c25c2f15f0be5ecb21f5b90162e54c52049f3953cf0eafed28ed069f722606953177ea938d483cbd122a456654521a0c9245eb144496db685ed31d897099bfeab3098900f890cd637dad15edc5a533be9b3560a2ef9e877954a3e7f5bb32511d68ab01dd4d97d08126c81ed9da1f2e6dec61a780f715fb806ef5b86c3940ea77b1da8b09f2448682ce986b8a8677a07b5d358871561b36d89b24d789e3290b9aa9e87e4aa231e8596fd31136cf09480fbb3c5cd73956e35a1c9b06095068a42ef8c7e370a4715297c615c32d73893b6b383a6556cbe9f9d9a4062c5b8172e9d57616fcb956cb424e8a2161f07648e413bfd2413142d5ce78493746c8f90eada36890657c5b9035c00460288320931664a63cc99f658d32fe6079618f6b8ce7af484d29677480d9d54857da5b67e02236d51f2cfba1588a24ed04d8363d9196baff8ae4555c346aea7fb0900844c0bbb9b54278f125c491c2f95ececa9ab455308942104e001b4fdd8b972adf83b200791dd74fa2c50039ce109f4a11a3f515781c8c88f5f0418ec078306198a857a89096b3fbb6aceb08eedbe60da75a888e9c67967e42d4fb1d3d4291156ad09540c9e4a971d6dd2a913bd6dfd43e1973f3371e194d77e69fe1e32ca9a53564bc498c1e6fef4a8ab3646b287601d3a3496866110499fabdc965944e0d5de9163bc37d53a2fb244879b1b842e8f298ad463ccd7dabecf9aa59e75ad8faa4ee73e219a9aad514302488b3dc433aefb07797b85ad1bff5e606778497c97e85f6a6dc04fd592a5d233809baf199827717e62b03a9689eb53df77ad9ec3817392ecc5cffb416450f0f994c31333e0bd11364eae447a4cd4454c2d850a54e804fb4e4b3379b56eed814025b2945cdabb382e901a007966326231ba882e880cf2a5db8ae3c33a12c0c702f724f3ceb9118b1a9dfe323181c87d28b69b929665353980fd70f765896f1729dfa5dd84bf3ddf142c85db1e5faa44bf664ab4b8e125e0d8a5409a362d631b8c9f77678df757fb2f89a4e2c86ff47dd20015e6b6bff99b2bc950d15e4b49a1c9960761b55dd6fac0e4730bf8588508724a719825c08be9b40b2dd690d55a91cd214e18e1b94f9916585ebeb4ac4c199318dbfc1c02503b316dd49c7c78735c4bcc2671f5c6a1e312e3d0ddc3ee0d182d50d0d934e9c649d4d9dd9b9f6ccb6629dbd26432f36bb23e0a0caea401c943a265f177f5e4f1043f9ed943f06de6b1820b0e9cfb651dde4b68b775c42d3195dfc3aada9b274103590c9a6995af0f5b2aa912fd85f04c06e7a7ed508dcd849b971da83568366d37ab10f44b3995d732bb36a8c8f8ea5ceddc824322db147a077923c809f794c0ce4bc315ce486243be5a4d3c0cf7c1746b65ff05f2adfdf65883a296464a4457812a4f1c1a930dce10c6103b496bbd316d541ef9bc90182fc36ad19c7b21bc39815737000f4ed21e94a75597ded0cf8e088aa3161d1b5eb90cbeb3f1c71a65bbd78791d0f0b06439c843fa8a48f3784a04be50589750d39d991e2ec1639dd5b321c3c1c35af21a6710b0c6ba8ad7e43c6065b0f", "526a", 0, -1414862612, "3af793667dcadf98fa1f2e2b8d94f60e0411aea57ccb03cedd41fe26b480985d"], - ["3ca95a6d02f8432a95bf07ee5ab11fda7c17981744eedba824264c8c944989ebbab728cd7e0000000004656a0000ffffffff33086fd4a3a13b8a9d2de07b4c0752e908a058a081e8fc15ad3d215fad5b01fd0200000000d76f082a0437d19b040000000004ac5163657fe2dc0000000000020052faa25f050000000008526aabac636a6363425a11000000000001ac0000000001e94d540500000000000000000000000057a9f4f35e0446d3bc60b6e02c4a9aa051f0e6d99f589f74fcd235d8664591a31880f03320fae5de86ae9f99643a04b8b62df6e8be3c49959d3a717af3790a33dd7a9291b708f8a2ebca0fb9e700988bb809c268fe20e44cd8b5b831a2c88c6a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c5e66f61b399612cddc698973e12016d28df01c87876c360f71acfc398ecf17d12ae1b889287bb42aecca1c5392aad32c885b41f30e4331c8e8ac2babda17f90d74fcca7992448f6e9ae1663ccca2833ecb02a15f80f72a5a9250f25d8660ec2af6e7e73da86682fe16a34370488fc6b780d139946c4691495be93d7dfa26b21022c5668399a0cd94bba355cdf8cacc6c9da6313cecb5821dff3d97d2f9a7d144d02191a29406437f2f0eb87f55de667673da2c9dd7e9c766a3e5414f4c9f5fcd4ce0a2b2abda53502b32201a5dcdd4095ebbe7614a051b1126882b26fe46f635afee510396a591b7220278d427ad806e0d8d99d9438c74aadc73db4b7d933647e9b060307bac21bacfb1eb49e184e373a23789b2f5bf6da0a2636e0b068a1b5f9e5439b032c96226acae45e454b931815873e1f5f56cf6c11b6797da68538f542a893b26c02229148076b2177b7edd66e0d6e58d50207081d673cdaff6c9032bb13d93750b302254b2c25f11bca5bdc421cbd937b68888c3fe84da0fa16e889ad47c75c0b82950328a59ee0567dd438555a5224eadc2cde172891bea5f40aad2aa1f5602c7916e50dcc683bfd5754a01338b53f2d37e41f2f0391c1bfd511cb4d97e09822f30d9f5dc613b9012895e054cb67c8ca37ecea4c5b1801662cf497626f7c0d1e8e743ede21b911ecb8415e61938629cf2f2a302a75cdcf78214d0640c25038994d2f0eb02884b6518530b117144f0c6ae3973dc29e06e983956467f11fe1d248a48a6e720081e6b9517432e9e93c456499ee84930c52a8a9506858eda9dc40529d39e65517b631c861092cc8b31cca716f1e6ac3c86def98704515f6297c3e1318ed2b62b91bc8bf1c8c2c2b794c0a6a8f57e7d2a0c011e35116f05625af5446dd5ff56dcdc5e509e0b6f249352b48e771d7e3f0b006c003f2394139386cbf7087e44f92dfce6365f301e1aa3b3b7e7c2e221f0947a24fe962f8b0e0c23a1e28c16841535ff2247a6cdccb3e698ceaab98c0ce3fbe137faad2c34bf1b26b3c32f0a1b20f3074f4fb287c9de6916cc91d23e8df10f05b2a710579fb660f2700c9eb159e1b82a1e44fb24f7db459c3034890d9b3625b8543fe313d71475b88bdebc2c0f774b7ff9c206c0a1251c57d811b9e31e2c0b0288336e0fdefe3095eea9bf319348f1374a2dc5bbbc1c837ad9d6885fda8c17720821be30ee7259c050deefe6feca0256820c1bafd17479e6e7a5de07bca4c7da7a6a105b7fe1527527dac3274afe93447c54dacfe6c64e50464d792aad788c255ad005ddd81f1524c4986bf92bdbcfb9f8c7bcdc579d5938909e3bf3b40ecc47a88264cca4cd63c25f93f7e61a5129ba525e2582c74b524c49d63820b4f4c23e08059c41f40c5491f25a00ef60082c27a2f19d2bb6a18539345a137a1cae8841ab1d5e58d2201f752df12a9b41dec3feba80e2fefd9da99bd4921f3d244dafc437083146a6ea140439c594216e5f7ad30fe52b43b6b4c63c591344ed8efab9066362196299726ac47814114808673d8a0ed9b21aeaa967dd1cdc95573a6ebde90ebcec60ee97b2de0d7e24fd1da4a799756a49828c4f078e56f0fe1125b9da9ec419c05b4a87f616e0edf8e30920540fdbc9d71dbe0edbb3f9f78b005f2acd683760f0abefc9f70c4af0483d85b66fa8e6382d829aad4a09fee0c4e92dc5134ebac4057ba227e436114f4df8241939670421ce8eb3511188cb39ae1a93ac3b148da17d2a625df8684856b005bf70baedecf34f9501c56af94b99378b4ddcc73da0dad4a551cfd003012de8671182f487478e9c5b67c735ade31749e2a32d8fa6345e0a890a0ab2bc84cff11090a8e63207b752027016b31e919fd86bf78654175183e2a8a95efb59f28de33677d293d975c7918d6a7b97b31d1fa0d15183c0287926e574313b8aead31cb5cf8392b771c9aa9c83a281a0b6848f362282dc9d9fbce30887b1f6d6b8733f41900e8627f0ffd53a15859eb573fa333b862ba5df86dda49660351e952a8f6b4d92248df5a90affe25865250a1d6edacad0d0eb29ba86f4f319283cb711b1c765326e15c0be98b395a452c1c05d77f41a1a052dabcea18c784cbaf77395410eaa585e08af7b99e941c2d9b33bb993f98f53e86c6314d2ff45594ef683111431295594be7a33f7e527b9516cdbb069f53f2d911542c176ec7aa2ed4aa1bdc4316f9dfc5eae944cbfe8d172d0d7c89c61b15c75d997a46469d0ed3c858db3240662b29a1673dcca33dc561d42de5c2763ddf0644f0d99eaa3eae4e9f82df7c5256fd416e0ee40b0c1c007bf04ff9e3edb3685157daee4feeb8730e6e3fab274d478a4cb428d896912189c37f9b402f866c92ac382ec9a4e92aaf89fd788ccdc0fbafe1039b468c8c39e4dbc19537f1e19c1b5fc39104", "5251", 0, -996058480, "3a24fb41654cb80953f14d345fe32477d61cf219d3f1a6978a6d72cf73b66b31"], - ["1a8d7e1401448ba3d245cd61a697dfbdd0306a6b6e3dc6c915447ed083a5f55e16a9b0ad8000000000055365536552d1e43fca0394aebe0500000000015290352b0300000000007a098b010000000006ab65636a51ac4b93ce39020000000000000000469b300300000000376656b641009e8e60cb7863eaf1bbde4923cdb5a8f9d34f175f72f9d351cd1b2866a64c3fbebc85c50805e9ac25f114d627d3feee33be4f919905cea6cadecb8992b5d7182f74d218d2d95d56647c5a52f2f0014156870e6a03bebfc576023f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055a58d728b85ece19cb4d43ae9a1727b4da487b08fd769597fa334f102ba6bef52aad86f0c95d9da7a545327b6bcac456e1e6d9cd513daa65b50ec78a9004470fde11e4181c84763c14550c1b44e1ed038b67a74387ee112547981054855595586f7cb40f0c2fed50f2b3e4a5bd8e16f077b72126dd92fefe698322253e98cb40309432debc6d3f919f7d59ee4e411bdd12f21d5f93d146a08693f06378792f459032f2ff67cfe0ffe13fd6a03344a5465292fb6ce7dd5a9dca2776ced87d844b04b0b14fb67db880d1cef19981ebee87680109e72d7cd763f45ffa851e46c992b065f0870d705ca87987bc8eb446634ae563d4463d47200742e33644d3f8d2f28d1770204efa9c3bff0a93b6272ace3dcd5e6676593678f65a253c8e97020e4f64ff97602060eab75dc1ebde481b7058037022f27630a94e76e255be80b194f0c32469ce8030cd60897e6741528462ed56395fc188855dbd03462735b8506bdd556be367eeb0309d0a52fb719f0530bfea9de08cc95766c28630a04f5143d5613a59d583b101e032022b939ed71bc0e61a7480d14336fb6613c1afea725ec5dbc7cd61b01ef8abd56ad04fe51cf39c39392c5a2f41f99bfabf27776cb19e8b9230828653692a9fabea3a63a71f7baba16bfefb13c0f54730c6f8625acc87758dfabd3310bf28c7c57a98edda826259f27bac449899873c014faba24a3a8471f39985a6dbc7e76b20d60e3c6767dfca6d28f07e9e1e6db7968cf59d747e389df7c2c0ec16a56e186fb6d94c4cb0dcac917562f9beb83f0a4a0ef2dd7d5da4f48331bd21bfe9cfcf989de0c9185da9ea6abbd6765bf6809f91d970d3b6ccd764abd851dd87663322988a0782ae918f7b990d5da4935d8b8c4cd39398696b62c70b957ede530f45bb633eca4f2f7d815d5bf6eda269b5dc354dd8535d3d290f9c07d2787e74930c91f0c7c2238ec82e9aed4be68909ee30678daacdcf21ac5accb7b525831109a168e3b42e0aebe5d1823fcebc495707bd9fabf7d56580e29b67abcea2476576e5d161a7402059865c816775d06f88a92f4aea076f3af12ace29e6b96d68d746e938c2a65c894b903d7c5df5b923a8d620a4405238d4b3c86e6eeb0abdfb7519de2d9aa7c872c99e56f0275e04786eb916de5ee4261d72b68bfe61e3fc80fbf519927f4ac59828f1625df73b0ea92645c852822cebc781888b86ef28950ef1adeeaf29f7dde0489f8fa0d7de9c91cc9d3ae1971754e59e639f1c27d13810b5fa365de562e8e915da05f3be417f8ede21d642941f1644d47e0fe308c00044d4c9585d93e52083c83ea53c6aa56e47ec8149f14bed3ef97a645077626bd34e922b3f18698bb6e78122bc89591535729d59c54a17140fe5691bc2c292d31b607c053bd40f6f496e95d0c9a3c147945eca827d067e8d0052e13431d9f63527c15a200379e42eba647166e69c096877eb9d1b2c98b3f84be6c2da70b0a040ff1c77855fb952e8bae6b946c6ac580473586833236d0665ee3e2fa49aea44356cffeea34319c68368e2dbd802761d521e3115b225e4655be4f95ba4e4b368f6068ebcac7bec92868bd3e4e64738707d90ac3ba359e91e2644e87035b158fbc67373b79391962e1be8b68c29ec4965af29da47a28cdfcb66f50f0ad3c244e7c4a57f689b4e440c162a2f2643360af631e2cbe304660be47cd73e08a2c7b82fff4a4163f18c1d86896fcb86806f6466de2f3f71ff0be76b96d10fdbad395421354836bb057fdc5228f9c4d89c7bd955f942b2a4f581430264d1d03f10790a296eae5461e7f79f5f7acc930e6ed9824933c64ddb98cb7c9c16bd7f1c0d329fd511d0cef0292f351e87fc74788f62e4f44e5f2c2e5497f7ea10dd5d5673fa04bcc45e452d3c5994b6a373a59dc83f069138470adb82534496c4701affb381b4611f43039b9be6980005950546a635775a75d5d7e77eccfce284a9acac02aa4ad7ba21287311fc9c6966c270a2823e7a6179d47780284cbd179b7362b4250cc7024a32e0eabc143232dac75c39b9d86acd47370aeb56fd43f33ac4a4c5d28a795ca854d99ec540f568b7e965c8f799715725a26fb0767f8585535f93179a5aea3bbd9de54a7d76e08d929b796456420b3ced3d119186fadfd9a1b68e8f789b48edcf659e341b2d5f619a67d70aa44bcc3719ebaa454b581c24ce8500ed46b4670d1a2775ec078235464d86c949d8bc174b25036b7c8e8d4c4cf03bb7280b0260b350ca017153a1cfa544e3b0893e84795d79c91ad2ddc9a230454f46daa0100000000000000000000000092284c2684eec78f7744b520078494438d73381f0a36668d84cb4cdf595b01d259cf0a91455309dd0c9139076bfc775e2880aabe70defa0317e3a1f4170cb22548352555e47bbf0c1824df8e8dbb43aa38a5a65e9ce3f8cef4fc5f423d98d7c300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c657d8d763b1894fe063e16b91edf90c6987b03e7c08e68286f842dc4fa7c8dd84c093d3d8def9abd5390210427b2431d0ca2ef6c0fa454ed0269e0ffb21987472efc2c6779d4cdb8d82e17307abdbca8c1b7c1c05af1fee40058a6361dfd76c9d64b786643aaa6c3a705f29eb6a051ffc48026725eb929d0c3164bb565ff7ec032bcb9db05179f1b3c894a47e4b6f1d20e132e93c19f0e9c278e23ca91ead475c0319b321103458a599c122c6373dbff98f64a58a17ab307311408fa68e64813a370b15dc71945172f6c80baa335bf73db5486109956f1e691ac1f5a685bd9bf9a4570045f70bba3f7b33173c585bfd19ea133e8e54c76924e783538ee6d7440e48cc022613ebca87cbbe509598f4911c754ddbf33ef96f8725f2d3aecc0177a955bf5c0304d820842e10584654a70a91873914a5ebdd70c8d574ebef61365ada71a8ae05032e3194b9c19d1862079d8630bd820289041c792fd04ce9a068913009cc67306b020793d32cbd048dd544c1aa9ee2147bbca6eb920dab578ba57d95d90706c6a38e032357c66bc0bae220c19a95f4a9ff8c01d5d559d1ef6a53cf96063c346118816527ddcbef53d34abf71324677c519c2c798851f965167917a2558d6f4af4bd900d05870702c9adc41e24ec4ec2a8d63e2f9ffc6d3cf350e4bde10d03868fe29de3fb402656040a839637dfa8205b996543fbb7038d1d37209f89844b2dd98bf8f67a37a29f35ee9711aa006142578d6444d19616f2b741392bd6397c94d2265de44bbfcb6308d3ef04057ada134e701bbb49c67032cacf2d33b32f1ec94c11997c3e1a57b935705a466053e0f71793da2eba9121b10300759c66c239a77af2c8ce46ad4cca19c44058d7f130dc6dc9612b3a4dbf91d01b0a95d2ff8befdeab4d0be4ec2d7ab90b4999093675cf7651d5bff5fdc9c7b04b33a23a72669f30ef2a278622f811f84b131f8b4141b77272bd7995bd3772dcf2c5d7667658cd74786ba63286bf6ada3161f58830066bf04fe75327c81a94a22c05a6b5b5a72ca4cdfc98e382db937489fb2308a4131d5d79a6ab4aaa0c0840be5fc0b8e936177caab45dcee29ee81b67f11f1c35dc5f3d6da566b14b32968c4b8ab0c49725e5f6f995869fbf3c5fa7823a0f55a144834f4c5973f859edaf2539eca68f107111e181902d121c7621ad21bc1c515033d62204b66b9718f2d39588ca92cddd72d628d007ac0eb63a9856f1d71322bbc6135c9146c56a86b93371da8af58ea6bb5867271ac5e2371c084ebb2cbf629112340a7e172d054cdc06c862ac1ef78ecc5bfa128c8d3714d4b4973a1768179915c5c76b08accf2cac83058aaee4fcbfe8351a51f03b0d2b6a2051f125b59a138c4d59bb3432f815d85ae5e86ff47d758c0aa4cb2cd1bacf1ad0443ad76a2c446705468a077eaa90f1457f7d5568408d954ea995345d553a10f78a5877bd33713ad4fa065825a5af6c4dd7578a54cc5a1a8d52f163105eb9deaef9f45c521659d63a00e7982a57fdfd46e98a7a33d2a4a846238000950f0c2c2335389dd6461438fbd18cce85164e6668e5281d1fb5d704999aa4b895dc1b6b1e15f7113ebde33c77230671ab3e9ccefbb4665fe6f75396f304104e5573f975dee888c94cb3aa66ea7400cece9b2e4ccb5bdc9acc5e7099f6dab63c624727cc245f77bf115fda2389628e887b556d0ccc82db76f57eb9646831c9d883642031b9a9b1366700db8bdeda9857f9f44fc4ed66c75626f41552629c4f78b839df719b32a3b318766c4dd4e8dbfeb5f90b2260d9d208865711261511528ae3112bf8a33f937d4168ef066e6e00f1b37f03037244205f4281d4e47fe7cf64f83325f057fa9396185fb5f4254f790569de20d8eb2264696723c199e1909be5bc2088001cc73ed7846263561c6b707cc8a61810921b6605990c145d63f6299eb8dacd28c6a668ab910c186c7b05ccbcfbdeea220b39f758d0688acf94b4c186514bf2e47ed95d4e28200743b6e5e0a96919454ca6da032136771c9ff77cf78cbbef5c3ce8f881747d0cf0840678af94cce317f25d1c94177536476179908783ce9ced6aa5370ea6e9146ab8f96f77241558cba57ee25d21a7723b2b9f0a59c1a99cf9a3797673eea2151d9bb5e8e1d60cf9960f1971e831ca840cbe19868cfe7557d8ee692b1f93b0664af0c04fbbe8423f63f434b4a858b09468867cedaf56cdd5fcff0d03278140fa384e530a9d6c813889652872df5e42c11777df7793ceec8db5443df1e6c6c0b0f9bdf3374cbc054a4d5fd400daa1c030eb105a93ee365e3c31d0f86c16172716788e88a786e8efc4bdf66ccadc40c444405b448646b8709606078a507866632a43f19d2cbcb1828ba7bc224010f56832c96f9193257d46a2cd5e088a5dfabff73ad5688153a2beb04", "6a", 0, -511879882, "e5202e5638f254d1b7ceec49f4f1c6d57f53a49460e93ffda5b003f3359320b5"], - ["938d360f047bf0fc9a8c43de489a76647b8ea4b6330e60765bed346f2299ecf76e9e4bbb0b0100000000ffffffff9756a836d5dc2148e71fe4f668f6c99e9b9661c48d5d3ec91202dbf33cc4db990300000005ab5265636affffffff9042ddb7980d7d647392cddad9ab0dcf554a830724fcfb5974cf65c3a46a2cf70100000008635263630053526affffffff8765ac57fa4390b0a0782feac8bc6ab9fcbd7c8f19853b146e6e6ef806eb88bf02000000056353acac65ffffffff04f95375040000000005630000ac6a50c47c0300000000066a000000ab53552f45020000000005abab53ababd63aac0400000000046552006a5f22fb9e00", "525351ac", 0, -1493545131, "1716e3c8c5a7054c89ecf1075bb253315812e6961c49eead1097094ae874b4e9"], - ["5a4a0491012189274b61ea652441ed43ac2ce6a30e931c24da5e35a4d1f9511282d649985e0000000006515251ac6351d8fb126d018ac7a5030000000007006a635365536a9291e645", "510000ac6a006a", 0, 553396675, "5916d3804ccf20ac520d3b330801dc095ed3f39f4748cfb715b78fc3771e3262"], - ["e75601be04c08fd0453d9425ae549e6d5a3c1ea51bd0899bbe61b9553f98baeb28fa3ead290100000000fffffffff11f1ec1e4e673218323ed12824a0bd1bdadee2f01e663cd5ef1fbf9ed0ef8060100000002ab51ffffffff5115df8edd11b50348abf556d3d5b90da50d4ab51fc8a5eedfad91392c74ce450200000000ffffffff16f2d298eae8f67161cfe0ab898e75814d54f9ad953b0c136d1e0c419b8d0a2d0300000009ac52535253006a53acffffffff040fc3410300000000066a6a00ac65ac6236e800000000000551535100526dd0c10100000000056352006353c8a9e90400000000036551ac00000000", "63", 2, -1316286187, "5be63e47764a59805ac39f0718a82477bf8b620f4b2bbb5ef3913436f4577da6"], - ["8355e829039dc8e259febf68b85cff8431155baa7b8c9d91382e9da6e5d5d56b218914599e0000000008ac51ab6353ab51acffffffff4504add04343e67ab5891c2fcbe2fd2725eeb42a591b95e72ecb4af63a2af14b0300000000ffffffff6a3ab9c8686705023b123d95b44562bc961e0ab02ea91d92f54819186edec8fd000000000251abffffffff03036242030000000000638ceb05000000000863ac5365635351ac5874f50200000000000000000001000000000000000031f70404000000007d109a6753a11f0108c8dc11c584ef784bc0d2ebe4bb5fb5d3f71e841280e976eceb8bdc6327c201eefaa6f2ec2a2740e493af0eafc47afbacec7490921aa3e39bd6e34b74ef25349c857fa4876be8aa698998ee2dad3ee7131c474beeda394500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ebb0a23ef75aaaad7030105452d7c98c3d62b98c79fb328cb69fa52caff6dd0dd1243ea2b35340620da3010c93a1fa1a5cefce4db0ec1925bff3e9e2f0a6ba7d92d335821ddece12c2a9a7a09187549432761c80142e18df00577d1fdfdb32134447f98587339932ac78dfe85ad0d0b8d8c378a2ec9e01d10fc0362036e96ab1021da595cef654480e06ed63dc67b2b821245c2ecd371fddbe945997e8d2bb3168022774c4555a2d7a6c08625206668903dd898c4b951c3c07ddec7d20b4f29de2ee0a22393c1971ee0ce1656253a771a52b54afe61d73b451cb7675728ecc9c2f8cf31779a6dd6d966e64a57756b1ddc187417ae55f45b68a80fe20b8877471177b7b03104c1ae3f56dedbf316bea7b5dc56d242a5fc242b28d421ccf90b9d595beaf52031a4f6b41f8d1986afce5dd772419fefc15a60314fc3489b1970dfddaa13802400220ec12b2af487b5fb7b5712eb8450c46864dc0bbac563cf5d254aec41fb67730020d0ca24178edcf28b39678da30540d8c612be2e649a78147b03f267ea2139a73020d35caaead85181bf128c92e481fb025999f7f1617cb320a9db02f9071f423f8bbc54cef3e9f6ee9a169a1c22c265a9f46b685b8ee1300ab5f49623b967a8be8c683d751113e13ed2a51ff8c72b1360f4c6958fc51c1dc540d9ade01c1f9f925af277e1bea6e6acacae4bec6b08064ee79e615ac0306c9ab83b2728fd493d571e250a230ec749e1283911a00aada50cc57227ad4d1897d37b0baf573ac1919e322a28bfd5213f8d5812ab489d5bf17e1651eaff77444afd4fc2e0fa369a3346c7dc7cc26be1ffbcc0c87f5a48c264f422f07d07c1a3ee678f9c3cae3df58fb2ea5b5b68414a91e24afdf28fb7d73440faa20c7d83b41ae205cebd7fd87faa83cfa21942de3af9c54914459039de81b9ec230fe7deb4d097ef6c66ce590a724352a67822d81067a129aebeb3ef903a6cd5aab9998c379a9fcaf43f09360393dd37ee4e38bf0fb747ebc15239702219df33107e8ccf35c8be857d5b1b45166b0e43a4f39eb3dc9f79d25679ef12f4856a51eaf18f78bab3b427c2cd9da2ff37050db49108c42b6398e671aba41e78f1555b837bbef5a4f681ce293228cbd1aa62bcb2da6eca52477443d72369c7e80c28e4c52d96410adb73c9b7b40949c02be378aa25e0934d91f2ec7c90a856cf17b2871972a51ff862cb79a88c5a5ed5b03fd662da5e169ef63f002c5831504c7ae8a39e10adad3ebed176651ceb0b0f9cf3aee24d1a82db733a20e81b1a24f4938e6cba0e3c2205b4dcd20761b299e69e659b7697edb1bd911509d49985476665b05f888ac991dafeda025aad0707627be0387a7acebe99d8d3eb749d5cb6271dd6652290cd66683c96e2fd5365b78d4ce005b604fff3fd833986f603eebf2f0a2ecc94d26aa1300292773a2d9b20c50a7ee9d9ab4e6e4bf51e31009a6136581dfeb739e511c010485c387bb2fb34b5696b7f16953c238c066ff1c5f262ae70ca6d85578e71524f0fe4875ee4bab1e0cd0fd662c8914a503994f3a8f20ee20770fb76f2137b1eee60daa62ea71c31f438cbb1fa03c42d0eb213c9b5e7af6fa88559170ee921c5bf88c1d1aa1d2083c48d15980f54983591f6c74cc70368f412782989b5a1fc3a289a87f4df0e88f3c53994bd6a77096b84c455c2a4676fa0546073947983bb3ca48859b8845b98c580111dca06ee47a466651433634a3b5ab94ec55aef721db6d49680776dd001b4f685f14feb1280eafad571e0e986bc5fc8f69b562b7bc5e1b5488f9c7e2bbf1d2831f42cd80b6a91d4c36696135562ad445c2b188c22a7f850946ca66a8d737854fffd84bdce4e98939b7c8cf06e8a128c864b1d41b34b5fb5b5323d7384a5c8f738c4cffb42ad3c7bf7db04fa6d741097f483e7d7a65909c1fb18802a8169f684bf5e8ef2c546f82d4361e254d31a5d7ac3e4ca5860451ba19e2557c1bbc2f4a347467b32eef24253aced18bd4ae6ba55581470636c805cdf74824f6f2ac115fccb0d780f8242415470099a6c4bf9f9a4a099a77aad77f8ca1d97e1dfbb943cea6886253e5440f2702a52aa7e0936391cb467916fb03d3fea0dadd2bb93dde7397b6d3d30f93c72505bb4b58d503dab49e7b3efc3026c6ffc76a135647912d872b1ad70c5eee63fc0669515a8d69e873a110e98874f99bcd63e40c14ca0193fcc3b243541cdad8bc3d48aee6c5a67b854d417690a966c45f8a2b45fe19becdcca2a2c403fffb7cea41d30d0a2c546d8bce1854aa6fc10e81a9e7dad8e1d3f2dd749f93c5f97b2edc2e3a0f7709d18d85d86383c3452f8d10deb0b97784f15722341f9627202b1c92cf7644bc9be98404f52fbc91372f14d4778fae28d17aaea6ae52d61df7e5e1f846f84df6363bc076dc101a5b0c", "6a52ac", 2, -430810237, "997a13abe0950ec34d4542cb9e15f9f01aa6dbad3939c9970fa4271ae6bfacce"], - ["ec901df603b4902b579da5f6581082be2dbfc2df8ccab4d24109e30e81fb7b5da395ef1ec202000000026a53ffffffffd8ca09bd6124b57a122484eee81504d1a76cf293b7fbe0800df0a82dd5ea81ea0200000005abac516363a3832b3e8aaed34ddbf9809985c2cb15b345ee02a7e95f7f2d9c2eabf3295df38d0f3d960000000007636365ab5200abffffffff0234328e02000000000024ac8b0100000000036a000000000000", "6552acac", 0, 450715887, "489dfdd063ceae8705b612d8964571944472a3b3cb630fff143f77438534f978"], - ["3e643690034ce1d533333f2088999104d45d2bc2f2c6aab1a4439fb647e47bb54d219fbd71000000000252abe7466df6603cca03345785de77913161b7fd49f2f575e4137dbee94029ff7ff3744b222303000000026aab1946b07ac511e0ba02cb348c05c51583e9ddd4953bd8a16f1f6701392375d8804f8bf72e000000000100ffffffff02d06ce303000000000265ab52c53d0000000000096363535253526500ac00000000", "656a515153", 0, -2059040994, "a6c9f7c8ecfe45101c6d5d07c4eedfce8ae6c0e0ab33c22c0a192d6887be6142"], - ["1ba2d5b901cabc5b109893102862294f5c1a5c913e46cb090dde06c393a71b4d8eaa1e58250200000003536aacffffffff0112e232020000000009ab535263ab636aab5200000000", "536353ac650065", 0, -1595492331, "6b24b6f05c114b3fe35f5743dc8eac4c391c5aefca24f550ddbc709c240cb21c"], - ["8b705149024141121cf42a3d68f078e91b7e5e30ab50bbcb5a3311e634aa15175526994abc03000000025151ffffffffed920c4bb906909481762dd168027e3ecd94d1a0cc2cfa09b472e23beef43fb70300000001511746e4b801ce40d40400000000070065006a516563e3569dae00", "006351", 0, -1842010233, "2922fc423915af0985b5e6a0da7f85d84aaf9d5ffa82301bd9af2ff126839b7d"], - ["c4834c2c01ad2bbf6a65c9d4c008fa64ab8045f99f84b89af7497ff89072047b6de7a50a9f02000000020000f3dc7018025139c50500000000026553a243c20200000000015100000000017b5323000000000000000000000000003b3815bb8b45066a14a74817063db54cd47226faabc9dd5235603cbc8bb804ee1dfb8159415b38c770ff0ad6525dde3f4c1332e60ea481be1b232d9c17affd5271d6f028aadf58b5c8dec4f6496cd28d69c66ffd9b87bc2c35bd20cd6c91fe9e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002aa7cd7982ac2b396279650fa04b9db535ea845a24a9c95e65a95fa877bccaef04b73b72a71fcb213df953b3a491e38b7559837e9a94e5ba55ee7c45c41118350eca2c1e9527322dca8535de51804ccd2b8055f542267e8761824540b829002803d96e48c26f1c568139fa5c0ef1e64cd2fc9376fd641e2319c3f8343bd3758e022cb5b268a5172265fb3ba28cf565ecff8e3eaee37c28e8662f7bcd2b5ccb065c0227e9ad4c6bf6612fe57bfa147d6835f905ae8d083308004b74d51b3f2775b5700b16a06793b4ec39d5824501f0cb3ddb51063698ec41b34c83eb282cdb65c625b922dae72851987c91aecce2dd893428b3f790ea04b464c1305a216363222c1af3021c239ad75d4c64b8f8fbb5498186f2f6ffeec91c173bea69dcf4916d4a8c67f3022f9162557ae4b17562c4bf9e0b68273612d8680e0eebd6d4a0e002793078aaae0308fe52a9b549dd9f31021cb6b6ae4e200f2ea0f133fcf229395a313dffd4ef950213d29ba0407b2d1e4a268474fc7513bcaaf2ce3a3caeb9e142ee2943a109234e0314b49891035b19d135e0879f91862c656a92f8d8b5ff4830228ec80181dafb0a085963dca5fc3aa171f9145188cf104404683e09fe7cdc6544c4e00f16c7c48a8f4012a690c438357ee9d5eed6fa6410fcf01eae9fd0e420dfc5e5c094f802e6ffe016fcb32c805d48b1059de10e6493ad49acc1f6ca1f090179e5f9045039a8b7ebe57bdf32d33c3edebe6048de8b34aae8848dbce3f7f1bdbd9353d87e7aefe1105a392d7f0f18684cbe744902d0a79f81dcbef86d557b7b268809db11f6f5b3b8431d50e6d75743df49703d807f6a98e92b3ed28955b7c288c3adf8fd008f5365c912f1274d314bf299041e84282768b165138bd833445a1136fc9a550ed84c95bc624070115cf347e9c50bfda6c685c5eff59296c575dc28d1d7033fbf9a738661b73794348b6684cff4bd953b17f7dd460b91a348bdb456063f0332e00d226759183b681169fee93be59a51feec7b569b0fdd523cca26bbec795a5a31e5af46285fde56ad88b5b0b2c1d3e63e0a63b3d0421660219bb5d0252f54f1f5d3ce858817e19c7721a971db19ef599711e7d95e35765fcd628c92e69210fce79eea7bc036506bef0b75f5e25a135df859519a4482313e5e5cea83d34fc007e003a3deaa9eaf353f4a55dd41d662e3c6a8d152610db0be23ed6578dc748e28bbec24c8f315af39d7b7dabe982b072f664607cb1bdf8c18d935681c11a568c8bfc03c172378279c47b6f933306cde3ac9fb4eada0886f413c7dce3ef6e2fe0d93eb20fc0d16712c37365a9090b6eeee3a6e3f7b251734df997ebc9567725691d59f20c0481b88077e26290199d82da9e6cfd558a064894f73bff9f00247139aaf86587783ba7176b716a28f1dbc0f224ad7ff0c01a5cb957f4ea60dcf184d9b612981028b9dcb79c901fec9d46a3d940ededd89fa3275ac13ce174860eef8d0fcfdd14f3af8f9b3d7043107e10022818fa97709241a92dc2844dbdbaecfd28d1ca8521821d8196c87d58f1a43177fd35e59d58347fe628cbfb87a1a90d49e3ef721683bd01a8382bbf8a0d44bcb132970bc49976ba78f58d659793b7b8bb124fb4e451f963052acf62b1beea278c1d84f86c66dc4f39c6b5136055d86ad96ef06a1da94c51a904e316d2077b4d509cdf433456284c2496aa664734413026e4c5fc5e773d738912230d106c9865bfd4ae001c8af37a614c13813c25355d5470356355af37f5c8202564f21582c480b07065d0d6ee0c1c2a737bd577c97634573d31b0c910c0f23385f1997361d40a1ef4536e38469416323f17d8a33da5480a35ccaa172bbd515f1c4e3cedb1dfa56c5786da6ed52b772bb0bfa56fc06cae527d098751bc8d2bdbea3cfb94e8f169270227d67177e7fb72918904bb293dacabb021c90d86a1199f6992fdc1d9d240d303e56746eef689024fcec83347d620aac00626eec3a089f4e8ee075dfacb589e9a8e1e28a5684094ac479a83019719af1d2677ccef2c1dc3181dcbe5d868405423b302e426924b8d44e0cfcf931f5feb34fe7d5a17f9b724b3371cab13c0c9f62b65ca7b97ba79a170b378786bd1b191879564ccfac5429a521b5f0f9769e504e32c30735632ffa083f60208e855556d53529ca13316e21ab78443f57898adfc312f87d8965a95c13e4b7221124d3eeff5a0f44f7426520f683b6de4d641cbbf83af509ee9da5c1444791e856a976910ee88141cd8427ccd401da827086bef2017cfe35dd9c9991419a101648caaeb8ea88a5e661c021de8cac68abde864d96814f500c178363f09daee01a5b6c05c6f997d87faa75097a49dd693f8d6209cea90f7af2dbaf348a9292b1a5e01a5dc8bea9c4602eecebaeca7f9dab6946aa941da77db304", "53516551", 0, 206226581, "886fcc8864af8803d33994cde84834d6569275963bd029e0edd76ec273896296"], - ["684d93ea01a1659b9f7d0f59b07238d5374ead4a5494f8763464060b22141e72d5a6b0d2130100000007ab5363abac5263ab5703470116a9d305000000000251537f8b57cc", "ac63", 0, 2017936627, "2bae93d9b47803022976492f9f014aa0b572129d0e40c02e14ce8549cf617138"], - ["3612d41f0285c82ef5184bc6b07b0e85e29792b5d262df80f38fda77b204c53d7dab31ec2d0100000005516a65515229f019e1c28538443daf968295914d51fcede7f92b08875a3a4bffd72cbe8d850f04b2200000000005ac6a516300ffffffff048c64d90200000000016a1cafb503000000000763006a52ac6a51c7552a0500000000066aac5151ab6522e16d02000000000452ab52630000000003b0383b05000000000000000000000000d96c24349e5626e4ab9ccfb0923d4483e52a6f220e5197ff22271089977789a5add151fd34dacee6685b1dc04e7da1d5edfbe5c933729b72aae63f8d961a5fea88253a7d8fa485b5743cffce98de6128def93c2c2fcb3f2e766f09d50101f1ed00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000376799c9583cb23ff64fc6a6f25cb6d468375da59e032597f665240d9e80c666bbd3edca08045f7b19a68faf322d2c0a8a5546e21724d252de1f1ad026096c372bfa23919d443ab04622f97ce3fb27bb20f88bc5b3fc23dde7c982a8da2f6a670033b3cd0afc2e3228175d4961e15ec7972123b69c0c2c3193aaaa193eba4ff20316350897eeb070975cd13fff3ddd3a59abaa40983bf778aab196b643ce4ccd70020b25784c0a843af1ad38952ff3ef96fee58a705b58a160b8885953943563a5c60a21f67a434b87042151a6eb9f62930510ccd4e8155fb24ef299f6825816f3a83c152fb4b8e0296f37b6237ac72c9c1e91a870c25c804a753d3786308280c9beb103289c7f6f8b93203ed5c4f83e06a566515548f2c3ebe473b589837666a322d9b903058580fd6284e4d1f3de06fafd7df6b00cf5c20cfcdc25ea9958e6f4a037a53d0221f6227212b930548b0099edec210a12a84789830543c3392a6cfdf144027f93021a61d301bfbb1d63650c60f6a955dd37aa1a41738f7fa91d62e9a8811cc4b1a803131e9e8437669fce089f8e952e1ea4ee6429e294cba3555ddac8b25bc0921a15dc5da86bcf048d87133a053213bd5c164f6ce0fc5b5f05085ab30fe8fa6ba686850ad85c0599ff58cd025af20407b558097144ae4a17ee497947ed0251ce4fa6e2872d9b69cadd241e8180b910a0a78a46fe19fabbb147e1b5c57e98705141b0aff785871e1bb7d7d7dd7df7294a43771686374e669101c1583950259bbbb300552f270d8061e24adc64d2422ecedc04f57c7856a87f27550d22aab5c3131e0c782df51b0b296c309ccb9a771dbb23a36d8b6894cd74c9c2c4fc0a0fc43a66011746515c6f0ffbe2d908111d1296ffd2b908a9686914bb58b4f25aecaf9257148d47dc2791daab91c9999861ea2391104448920d5e053bdda0bad13b658b47388212d719a2a8c96a46c1e5d1fb40fb5707b255b1c3c2a4c1bf43946bc091a9dfee37ec429b7242557096643f7b23966e9ea2e76e45825c9cbf1d8be6a93df225ab919c3be57b6d7dd82d3076211c9d2efdc3786cc72ad57fc603b938c5ee8ab363ee156a9ea53785a10fca7086d8438e0068a35a3e3bc5b60e14875038224932967fa0c9e8293647d6a23a9cc0f007162b81c0fecac7a9d469f96c539e1d2a21129a438b9d9ddaa5026117c2e2bf3971357f48e684ba382113498d6138e6b0887d88b992383c212ab1ade4328eb61e5ad4df9c5c57c6c52051c5165e2f2210f8be59f01b50f542428ed348f1f476427012bcfa67ead8b5a19c258edd9484173c4e9a7580107967a261d2f98bf6d27d80af5c18313297b4cdcf7d93762269f109da9b1e3588b59ef72d8b54557a836c5746794b58ea92e014217ccd9298e9a8c946728d67b25e9de798c474a29bb17a04d9a63bae82ba09380fcdcb3e35f5959b232668802ee9042c37107bc306afc84dcb2d548140b01cc9da34c658cb1131e6711f0a004aaf4fbbf04f4c8e6b80ed2938426450494d37b1455bdb2963cf2aae78cf5858d825cb6668c2f5f17e3c01ce16d47f9893b57482e6b5f744dc16fa97e3c27381e3d77cebf838330fac2594574fb7ee2575bde11e14748eac71f12bfcd45f9cd86218f9dd6e5b86c3f18b6e38a3c6e16205f1493f6c19274d173dff18d243668c6418f4d842b50dcb4621a95d35407598d4877185e24e8802cb12e14ede93dea567fc9e307c54dc9d84db5c368727d76b0fdf8c9e4a5bfed139899289d45ca174114e0a5781661d3af15902d3f680fa0637be97a28f9481ca77f5971e58cef8f05c6f807c0005f6b14f2d2d2a93cb43a8f9ec8bd51e5ce0b1d9a478f55051caaccad892f6571e2c97a28a02ca8ee0b091d2f74dd7517f5b04035275b163202f5b465295536730c07f23e88088691443263493c748a04e587effde15584d7e7771af5b071fcdc0f10702c661d2e0ae75b11eabd284af786bfab4d0b6501b377a094ee65ba371682497a64bbed7a6e780256623f56c064431f9053bec944d3e7b488b72c35281e7b25f1a41c6f005931b4e09cff327f2dd6c622bc89c52ffa3767457eeb15f12f349ef1e59f89d4e5f876528017229a0d4d29dfea75343725ebf2ed2f6b1202a5ec47f20a4f5c4aed5748480ff42a0fda67307aabbbf689aff8eec315fc636aad84c1257ba7f87fe5cc5f1c51458dfb35322a0dfc5de474e49e956bb9ce53495b7309c2a30b66f28b1f31fc06a8f0fd668c9058b79771fd4604ccbda2a606ffc50829b031ac9e0d2fcd839cd0400000000000000000000000006ef216b1d8f58986ea347c3e17ad660d480b80f0730d99570352e034728dec79f3aa5be3d5a5ad2a5cf77b708f70ec242845bfa1a370e30509804d6a3d75b0afc5a6b26162df3f9c5fe8702bea6b7fb80d1a2b553c682167892adedb788435e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eabf3e6174d6a5e8c0357e41d891efee65aa6deea7f5e6999e7011b8a71a71468811e1279100bf1c8f04ee4e0852da6f7f1e62485d2b687ee48f7ae1566b3ea4c04530211d8f7ef8e2cadf551b98b49c20055aa85ce35c9ff3cbc52c15a1c036f475dacaa715b8cf0b3e8ec2e68c264c7ac6de795d8c34f41fc55874f3c39093031c6e9b1a0738433694177c7f47482798610599a54c20cf0d61cc23dfcf279a4c020b6b8c4b1c0a427ad585b888cf0e2ad8f490d75e4f818d3497e0169e7d17ab510b031fd77dd0f510e440fe0d53d36f85b252f3908c009a8a651a4dd15618b8c45f186abc4493518f5aa0e8aed9bb72ae12dfce479891324bc1718bb53d0dc2860903036c74f42f744528bab76e0ec68263ccc836aeed1317d26628cc4feabdc5d2fe032a5aecce136537c52551a8b92c466281e513bfd741dd023f42dfafbc5f8633570322e5a47b5aaabadf15c5f48f85f78b7a750a39e4856328eb406c7a09d206d461031d09aae96fd76af32568921273f8bc7691234c3cf4a91d7678fd482954a274dd0217694ba8925f5e687cdb6f5f7ad814a6bf48d43d27612aa99163189d291d4a61366000d294d6dce16af640c162f0ec0b9dc406b7bf2415ed2e48f1bdecf5fac8265c9b8055e10434b847a3c8c10a99826e9051d1880caa73401dc652fb80b6666f77a525a2f91845ac4993e3fb02e85df0815996f941ff908a7ad8278986351533429509b24a1a56507884a95466f7e66a61acf5d63d6e75b2406e1c115cbebac990dd9b6845507b5adec0565499fafbe43d84e1a345bd69270d54c9aa08ac2efb0222f7ad8f7b375ad3b79275e29c14bc076e3ebd41ae42909aaf37fcc5ed95ff0755a1d470b6c29be5d96e8339a6296844d1dd53a776cafcc9b2926a63742d91bcf18ef9a4912ad926a4f00b950c119b84e5eaf4e0003beeb38ced6714409da85a53ae505078560958a57b9a0f8269c615a905c72c0ee16f9766d9668944956103dba8883051d3c47052cb201c0374336c3ff7edb8c19558c6a216febe9a1c4a5088da068b3b8fe095960ce34d846a8b931dcb3dda2712e7395660fbd651aa22d3e7d072d850a8031c8beed1d14aa879899eb0359fab7eaa9fbf1f34ba28993fb347f04dccd98dab5fff00fdf84392a962a9d1d43031a4c1e436da7dfd8b05630c844f2199067dc511e93fa145b66472ea20613f5ee400e500b60cec21d235bacf6ad50470efd5fa10c4cbd23e39c50bf1e2655980425c9b9b1883d661bb3a1ef514bc57d1acc30322fddcb98f70004924ca1ac3f6f7c80ab96da12cd53425e37e402fcff340f8261c62d9045df4afbd81ee4b11d00d21101ac20c4958e518bb1ffbeb2e8ec31ebc82f5f6fef921460938e69652a268843ae49362e4f87e7a1612b2ffe5d2f71732db8660903499376512adbdd207cc78958d66bc96659617fc623fefaa765a9d11a6ed40c221a014bdd371c58f089a5254e30a2497c62c7be4ec7e015abc49162d4bd9a4e7b863fbceca6bb8e14e06456c335d2f3b4e4952a0357cf93350137eab108d39c51e910a4cfb28060f4c134ee78a5c79d8de4276670466e44bc4e523d6f6f0d1a207aaae81c3b52f04fd914e8d357ab7ef2b107cda96e198470f1799fc6cb258d4b9ed2bac9451300afc6ee573d7d6f7c1ab2256ebe8db586a5822f3f70db2fdda352d3ffb03bf94606ca35bc25f58976e5f125e36fa67a5ed42d49c74b1e121fcd59b19b4659b8a47db13474ad29e0e593b6fba91402da9079825a829c52cdf6a3e9769067c4102f6b835865b93a82f9dfa409488c30399d4a4bede539b0ed8601498e9cf7fcc196aa8f99174fe06838205e3a53a4147b0ce9bb0cee98d822a22ad5d89323b8b8e94e9750624f44d66897983a7917c8b865f189d92cd4e583d5876e1e284a200efb93c43c15009aae2010b4ddacfbb9265563e5757f451931049d9256f637e607e7880b63d5546719bfe0edd5676690688dd86f06eaa0968f16eeb6aebd831b1faa19377233794b84832d75bae6e4a99ce88beb21aad573e09a85f561d7976d68d8a1ac605f65f1e218a07fb09f86124dae26f1d9ace65ae09d6dabc4d65d1c764cbf80d856497be0c823b25d96b434d8ea2ff0f570e0bfeb965ff9fd6fb063bf6dc0ab95e32a83675d21f3df6f660814a796baafe376f2646d26519fb0b896917ce77d867e999ed0becb9390c39a62ca8f2d7a4499cbe808929416dd990f338f87218e8d554b2e95ac725ccf4c2fb8b9f5661bbc6704d58a160b33b65aaf80000000000000000df49f40200000000a2790a6770039771a6986dc5346581ed23c91a2488f8fc57abd56d3c05ea807625577a70569f0789e6b02bfb8c3a4c3a47d20d364d6cf03c3ea71d389af67f32a39ca6406dbc60f2e091358528996bb150c88804da4bdb84437f81364c9ff20700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dcd38d0256fd07f7b4aa2263c0c2e195d921f6713bfc938a5fa7e8611228a55fe88eda097ae6a76b0312244d3653c1de3390875d2d4ba4a271d18debd66c8d87154577467c1d820f4fff7a96ae0f8d9c99e5932c90db83ff59ffa46d4abade94025f4833ebcf04979e96f20e1e6f0d7beb2374147b295528e27ab114b21a091b032f298b131b0bc7ac4f8b0db9827dca0cf536ddfd56fe7d97947c8cd5cf6fb03b030053842ab1e1d9c1bc2cdfebfc7b9784fe7b4292b516d96b59ed4099851a925a0b226e57fede229dc05389fd5070e0ce0d0ac8e70acf4bc486b25505d390aee354094e3613ca04ecf29de5461b07a6dd162a0990c830931bc82412eecfb211d875021686423da6fe1fcd4d1a2fc983be16616c09788c5b42e807e148d1f5c134609b0326c46b10b748659ca9c2a0fed60da50eeddf97c06248217972a392b2a5f4beba020a09e65fd9f830445cd1f0f5814cfd001231006d0c15db5d75b6536a7c23c3890201949e371590d05fc0ed7529dd00759ca41453f8a1623bb5c3373ce1052924e8021984d524238c55ce8a981d1fa1b2f0989c8bd2511fe95e6feaf1eaa7cec5b499263db03dd9a6d87f6dfda68bbfec4eac42b01877c36ccb59d4776a2e3b8906094575e6d9fb4027822177b9e31dbb6692b0a3d6f09f3d87cbc313c1b919bf9e3d303f336c6864434bdabe7be97e215ff6d89630433090101e7ffcf34b68d12277b1410bd98c45ae33f8359afad34515bd74bcc7e5289a37b0cf86d2b29460b84476824c5717bccb2754fa8854606f2f735d8093de341af991b702fe30919655c10d96ae9174dd6a3bfbc3d3862fabb2066027b93f45ccebe8387407ba361136c292ed701dbdf06e7b948b5ef9f658caa2a0caaa93fbf3b1f4cf2caa28b1efe39136273a8cbef15e817e23ab612617ae4d59452a08987840a32d8f2e5c72c764bb1ed5d1fd466d7ce8472e6b9383a4614b80cdad450dd1694eeb1047285c422f4e95ec3f822ba4f6eab351607d9869963eadf2a5fc5b37e65323e60dfca852b4365f695807e2c0cd62fdd4a8b14aec15002df2a9a13bab395ab60c358747d620df39f6dfbca8899dc5b34ba840175f35d4980d9e5247ff277cc0da8da323ea666fceb379747214b21a2335d96fa9ce331536e4c5ecb30bded3609f0d50ff3beb8231a87fb3f7a7bb7a77dbe81cc0facdbc84175821cda388aee08b014c22e84b4b4a3f3262bf87fa516ac15635c7f5039f4d17150a32a7363e5fbd85955528c25471322917f05d6ef09762bc290d3cef7c6dbb6ddc86c8cf5983d5c54353fdcf55dd66b0c2ba23b03f583b4c69b08e0f859e4c142086e367eba70acd4239d502499795bd8b36dedbef41874e593a4f13357f722e775f026530513356c60074dfaa2623eb691e84e30475f5c58e0b3b1e1036bf9f787ffe67f72e2beb08d9bed687d920aa12e96482c7d01f412d195c832e847a9b1e79bd3385b1fe7f4eece4ca232a1af870a57a7fde59d46a4eedcfcb9b9da8262dea53546564721d7da6af5abed8889a969effbc3437470a7ddcd855feb4e9d476d47957d5d8690b95720e3089a4395461e782a84b2bbc10b5534473a71aa4f92b4f4ba83282e00b7703f84bc8e4da5ef4a20b30448178ed25cc3ea49db556fbdf55c088235dafaa001b5743a23ccb04f565fd22c8e7f41e7b1012e6917abda884193f1c61ad611842348941204ae4098f2b02475ba779d82a7c0b893fb21e9a5ecf03d4883a1c08ef3156b378d06c1295b66ada5137e26a287bfd986385180927ee893d281fec541014cc5e4e2a3a8713d5d8b8a63bf88425ae1eec8623b1e796acff1da6768671771a070b899d189c1fe471d5eff2a4f69de78f60c9ec6d64325d7a907338f31a40b814aaeba0a49f970b7d58454fd7af7601cfb72cb4f396f5af2b290be5d29dfc2382e1035b4e88fc2f719fbd77bec5f343b0bf0ffed94101bde6281541a0f5f5c2274129367d55995494eb5318e72a41723466a34eed1a297dde4ce161490f689fd5960798e73fb0e9ea993b55f0519f6d108bbbc3d59e5b1d9c64f664c74d7015116c235c6cc8a812cf263789d2b8632e3cbd99a0c64fbd325b4cc03b8406eaf4fc48d564a808f4844524b7b88fe013b834f4db0cd2c7bd60fe8969c04e989a7d173ababf3f5b34a6f75ec0f07ea193822fb4f41ce57db9bdf625c025a9d3a86e0b954be1575992a8a32d4c6a1dad7dc5a128cefe8d6580cb88a366170263e065a5a2c467e043770f89026d3f7864af54525203f8528e3c5334e2fac7e22b74f17c1c639d4b41a00162ca6bf76ef073aad5675e752b476c180045c647af021c4fbf3c37084b05eadcb1e05fb5a41503cbfe44f19cb42dff5772f73ae2d6f623ae01bc99612ede7a5dee373b6956e59c56e90d98720a", "6a", 1, 1293760694, "ac0cb63a22e7e6cb72df175f6c5a81d63aa55ec87a54658742bc8328fe7c5a44"], - ["eece262e02eec80ed40445027c14808eba8ed26e499c4d6d00ca539c2f2b5f52d8f48278fd0300000000ffffffff91a0024a1caee7f299f3269a27c4874bea468b411616f9a0e8a48dbdd618eb65030000000852516a6aac636a63ebb95448046ce61f01000000000851ac63ac51525152522c5a020000000007656a516a52acac6e0b1e000000000007acab005251650098776905000000000253ac000000000100000000000000001a0811030000000066b99442557cd6012ec4003f2de2abb4e0c0adfaa3d14c9fa98c2338142cdd69ffdf37cd25d80bda98f620a1c3e879966a6dfc035feebb5c9bed73b026c56f2cf687463310b8f41d5c20f8530a17482c5e59c7e04c3010e3e29b366285eded3300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bd51d7ffaf70ffe9ba7557b3ea1b43c5f585137559617e7a65514bdd216946707b4fb4d109f87ea7c8f2d38578d5be63b6db3b1705c9522c8084b9190bff39eba0fd86c062f9c0e09740c51414cb59eea57acedc3f0fcae07b888c4aaa11f58b4cf00e29dd32bdb5fe7bad124d9c3286ec70e438b1df7b2f2c5916bd450d8f87030d0f02d5a96a34986c164d272720eaf8fa58ffcac999f7e0a546e1acbd336ecf02186c8dda946fe4e0e5e85c476474a72b2390d4b84ac568979f432760c3474fd70b1d2cc4b1fd3c93a42ab84d8fe5464553b517c040214b8e98e2c2cfef6d36832c27f34cb81872886e91325b1a5e5f2fd081c9dd809e75445146078a13816d204d022b3830433f68556fcd471920b19aefc02f05e55e3e1fd68905c64ebdde2cf9140228af8a5801bd56292546cd703994280f7e5b91a51cd1477ed167081771d7ba15020ac1bba9080686b5e1c01dc6c5405b67a54afcb3347728956cc6eea1d8f4ec560323a533da2456c39ba92f825600b1ece71de3398bca6e0a77c0736fba74032b74032aaa06b4b791dca9e1183435cf8c7ff4b5e07afa9d50a87df552cb41e945f7845075c6840dbb2247ba536a1ebcf377bdb6ec37e5414ea20b930da8ac8b0e9b2e43f589d4af81726cbb6aa31c6f45f99492b07c2c0f5d22d64828f3442907f68c14f9c35c271b863c2617273aabe672e487369778471792ec2b03121607e0dc0ce56b51b403e4d62b336637dff08951f1ed48eb9d281634ee5a51ac17f1cfbc074ecc79b8e714fb3d85a7e2c814ad78d88fcc798fb645a5a16d6bd7006ed2cecf826a8257dec7535cc93b2c54debf8d759c2fb41504afda271a0f9fa4ae35f7909a89708c210d4792f344f1c346e9e777a6bfe60a62446066491881ddaa15c2203bd0ddcf338f6bb0d1b4182c067a7fb6e7b72f157ca2eef65365bcef676f4503edfd3b6523dd348865610f6179605236d5673903b48790c1256f5af44cf0c1146b03529b47ac68203e68e78a2114b85b43ebcfc28ba5c0049457bf48e76ad14bb2a3aba5b9b5dff8a64ae346c3b897346b9b64e76ce3e102053b243ef92c2d105eedee4a2a0571bdc9fb3a9a3c353b0991ade7c5951cab70d49ea28a07ec8fa7002e8d3960ab5ed06a201db5c28bb2394de44bb34e3e74b61ab183c7fb1e1b9760ed362474e94042fa0bdac3d7e95104e038f7ddcb09daf662ba0d291cd5f8fba431af54b2e5bd043089a1e618ec396ca39a587479dab9c55473f266bb0314cd544bc4a08f3fca80c8bde5e54acf91b941aba837369e15e223e358cab15c6216c052beba164e9752ac149db8e0a6debc114706720385a248042fd5689405b4e4ee95725f0ec4b3f53dcc8c121e337ffccce9934b9b5d05424abeb97bdc1cfc620e42902bc2c482ae70921d4cfebb7dd7c96d27de089982cdbc64f6b2a9cd92db26c9824f9c7b6c9b36d84b642ed9164ae1314bf805c8b9aa7d7cd7e370020a290c578414fa7b2060455f00ed26392f89a2b6453c059414855962c0422c490ce0f99544534d3a1c5746039f725f4380a335af4bd819e66809a6a48008209b5804ca7f8c51a6cdd57c8fee0a2bf032b615ac402f782980825284817d0ef2f34d80a34259e2b33fe8c075b8c3f7e81d2daec5e49c2ef2afd42f3c94ecc565cf75eae94ff6b56a84a8f1bb92a63109561456b0636bf471a6b637fa30db8092ff3de38dbdbf4f899eddfaf68ee7da56f46e25d36b50a6b7c505369790f38c311a4f9b4d9327dd26c61733e7a08baaa169d5990fb8d06600c33e04dee82d4a7584cd9885ff66f6e973a151a3750ff05c5ed6a75c352e9a277161019a335e4848782efcbbe2e9a6722dacec116039b7ff10dba5ac1814158ecb9f4c0579c2953d141a1d4dd71dd5c6a0caf47f9c5ef748b3f38bded3c19193c0eaa6d037a529c9a4fc03abf9cfedbdeff11633fa44257152725585a76639536a9a216e4085a2ab7c1f322276a3cd01aeda71eb8096e739447314190bcb1d5a475a89b3cf841576ea7d5bfa2ed5af2fff3e5d33217ec2ad386583aaedb518f58c2467b80470f06a84ddb4d43d3670b49bf48a553898c5475483492414dae64b05b6f6dc5296e3453e248793c8bad4bf32ffc974d35141a256b9bcb9c07beaa8e37d14813fb8c9255d7462b59b62accc189e796c1e4aa4d3c0d20b123d3d73902be459e4657e6a9f0d30f3fdf1f92420d4e48bbf14b89bbabff953c13188fcbd31501d2d94e7581639ba1ff7b6a769593e20b359e3ba4aa2f25feb1c24fe61778dfd06318c587e96cb626698990bcd8fe9eab263a095a714e89ff18a69c991da4b29cdadec00f19e5a85cbd367955c4a48c698bb52b411d2316616d14cb4e00a1fd608ac33cb612783c463d6160fde6dc765af9d8ea4f65427d825180c", "52", 1, -1324892752, "d1fddb093cab147e9495581c89f66a95e4cc353926734dfaed61eb4ed7089e96"], - ["7bf1f59d031a4c7611005d0e7eb54122bf9fa05f6e47fcb54173be032acc8b34a59ae2e4890300000003ac00acffffffff151de5fd6852fa2e97ee6faf21ad823c587dae6dcfc378ad50c1f7f95c7b8fc70100000001ac5dae4c0fe37af888e621ac1862077511dca4fe3449cd622960305f86b9b4047a2fbdef65010000000765516300515365ffffffff01ec4bc0010000000005636aac6aab9f893a6c", "51655351", 1, 425065340, "ec8523774b91c4331182e83838838700ffdf795e34ca6f37c979400e9d2fd60e"], - ["47372d9903e4155ed05d00f6ad6290e2a46ad97a3b36bca39a5c49c50a1cefda89a3ef18b30100000003ab6552fffffffff7fefdd9b5592af6760040cf4484c09b7f66a34b9242489e6563d20e35363838030000000052c662f4a8075826482dfec36ed04cdfe01f6c18c873d27dcfaa13591fddd5e1dceac664020000000351ab53c068b60402ca7232010000000003656563aa6d19040000000005526a51ab5100000000", "52630053ac5252", 0, -1051898593, "8b45c956be084c427cee98f23d8283a39c313829438f6a6c32390b16e9282c39"], - ["7d810b2701a38f4afb08e340533e60458fc57a4b05bfec7010e79fa5e61b3d163cb6a15ed301000000026aabffffffff0491bdcf010000000002ac6a8e5bd80100000000080052abac51516553aea09402000000000652516a6565acf850ae030000000002ac6a9e7a919d00", "0051", 0, -222753988, "7b88d845a3e71b5ca87536c6e11662fa20482d3026a3f1c181896455485c1619"], - ["90c5e6e703e52f954758fa5c3e2c98f11a8058a87288bee1f2f0152d4ebbef913af563fb4301000000056363ab6553ca88d176c00b6e462a85b3724eac5e06f76cb503df0939ea83f08aebaa1c80c6340b0d2d0100000000ffffffff62e9c5fa461911dfc8d8af64b95e1cddcddacb578fdb208fc37e5cdedc8ee25f02000000095165ac6553ab52636affffffff02a4d86401000000000551ab6aac65dbeb640400000000096565520063650053ac00000000", "63", 1, 1870370869, "b2a524dd96b919cd782ca3eefc1d6b7751d69382306e961ac9ad341226dc9433"], - ["6a25676602bad87485b576e5d70433f94b111ed3246fbdca46bb03813938ba49a1965802b50000000000b339876a073c755458d446ce903d699999f2ac43ce29a02dbf5ef7070ab6ec75d633080b0000000006006aab5151533f11197704b6b95c01000000000600636aab636ac209c10100000000066a51acabab63edd11402000000000553630065633f61960200000000065263526a510000000000027ee6790400000000000000000000000086e0ef62e638e5f3db785ce056d62c02e35fd946f8c4b002ce723ec67be0a44273f51167a2290e35fae54db3bd06b28d2f9e431b7ace13179387a14d41e1258dc1a9572a09b408aa34126f3b92b737823c02eba06ba8e739107a43073cecbe8900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e9fa51c57f034645c403dd4219a63d8174b7c157e1ec4af809525160a238197ece7fc713c569711ca407634aa4e5056bf5a15249da619cc4c568a445b4003ea24e67c8d2aa7e6574e57b347fe4ebdaa43f3f52235e0913c9960bbd93c95cf2d3dbf1b625509db0fb75ed6599f2d2ce845e5d8bf7730c9fa3e7a38fba14472e93020926d9c2f62ca9d7d200f666a89ceafedbe3ef7510810a45bf246c5b1acc2226020f864cf6984f0fc0cc99b6e0d617e12ce556758578ed672f71b5ebab1fce39b40b0c09873e890144db3f951fb2ad1abddcb98ff80de81609c191b32debcf159b7718dffcc86442522b5ef2716b5c0124e838da085a4fd11d6d520ffa7923e422da032d8bd2c0f52ffe9fe420b5c6675f9b9cd011a82b7ea2929942574bfab4118e52031c036dcc33f5770df1e820293cf26000df88ea4a9e357060a4ec04ae0aaf6ab9030ac960d5fea4488f8bb54336e928a932afd8e9abdcf8a6690e551da322665b8b022afc0ca590eb98d837ba03c8a22000b98c6055c21b0bf5cb5457d59a588654a902136044e7b571aa68d6dd4def809157c35406e87c9c80a1188d73ffc67bd611ddac9bdbeae79af3cf182f0482e99f2fc97ba2a33b6e895538756a1936361a2f49225cbc63829a6e742001b31167863fbc6bfcb2fb9d530a2e8692762b88af8740b363efadd69917dbf70ac963a6a36fe820715d46131a65dd00152399c01ae806876dfcc18f6982c4979526ad68575f202d2581cd0e99e915540e572d222ea730ba8afcb7c2e07f34cde1a61cc3f00a64056fc0ced38d44a2a7638fd54e57877682b07e1012fd9464c25aa41dfe3beff35bce6c54fb4a4b3d451bbdd288114c7e263c7b4346838e5b62bd7b8054b6e2680ba633924c97f7722b855f0cd3204a6e570dd6b5d31edb8692c31675aa9841a81d2c728dca229e87de0a3fbe9307e3ab47f0601741a7929802a91c727dccc5dba62090331fd1bb39550b96e4790495d52aba93bb43b5dbc557a0e7721dbd6df75dd22db7e2520c5dec62700ddc87e92d7846ea7db1cfe167c6e5c60e7a3b5bf065f66083317ea4d7054ab03303717bdcbfcff5e7e7583281aadcc9432318b465d8333ec8b4439a81184db3ea0111b0ac42fd70ee5c63c37476607663b48e59db124752f07d17058e7e144be4b34dafa9a1268d93badafb342690a7517a952c24b065d0afbe49a638c52146b27dd25a0b3500fb57a11247fc253fa6eed727cd6324f23c898d1cae95a6b4bbbd4763e2c1353e6e2c5a32b35df37ed9f248e230925ee236f2ee2d3d66ccd4fec61b32e10dc990bbe7fa9d371fd7e6409d8485367f12833954fb4bfe584b3161de5b70fdfe999aa704f48d3a71b72580745588879042748c81f7624149e8ceb3d0d4b1fd85768194423162ed48693de3051b93a5e13be2cbf96dfb683f9904b277d2f10810f0dae57ce849e1bc5cf123005b0b8463c70f1e2a8161c296ca4d52c04a2ef150b7c895ff4c3f6b0774b83522c325e5a43015e37e4790c938e18c04c4a47105db69ffe691165434f42b741e32c697c013fea99fb872536310affa3cd25d8ab9634c3461fdc6d9a7461473cccbea6bba5bcd1ebce5b1e07b24ac4e1dd26840517d964dbdbb7ed310ea1b1d93abeb1e9a842a0fe10875376b854d5d7d0b03bb28f1aaa8c7f09281748069a75267f14963c88a3b8122ce616622bc727269e5ea318e174400a828de584b5d2a8309db4818e11142fe5d80935e0a464bceab1f824d2e5552472e85925d187b79b223b45e587c7aeef09afbf0a832a9596054ac9cbfd4cd0d25138d948b33ab93be9897cd2b7bc13dbf273e4a7807531c51d33c472da461a1bfcca3b35aa36d29cc54240c395e18785b25900ed62fb6d2e645f19cab084057e749ab8fe3510eca710c1c7a7a4fe3c02618c2e2a79f9991a9d84ddb02cd517afeef9b7aba405126d6c98e750e6fdae4f6e107f67674ff568a85f83237cb1820375761505b143e4c2d7d87b8a65a71970bc45f4ea8f3f7e3352f1d3e4c27a48802a9430309ace9d29fa27e1ff0b12142268cfc48e463feb93f6bddc87aa391fb8390411e18773e3a177a9720a1efdb79ecb04f7714f3521ea12b36d6df60be9b131c9c714d4e6eb74bf867003771fbb0ece57eae671819906e48198f05544e3044b9f134eef2bc237f541278e824aced225a68d149055c114ca66a0bb77c566b96a90e9b7f7ce2868baddcbb04477575ea9b3f971386e363f3c450f2e3b205c5cd9dc0841643ffa97c00f936bfae622600000000000000001d973502000000004f2e7264dfc63686b303330a312c4cb0c43f416b57bd4251de6d879b0a68520c1d551a7b98192e697cddd80399e599d0b5513f9b94956c8f30f6040d8f9ac0452294986f87ce9a42a3ca7b67136abe7297ebbeaac06c07728ead32a30981e47800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d30ffa8f60985f835f55b9dabf9a9566a033692f5a156edd533203ac97d548200450330a5a279c81ee2c9516e2d32de7659c487532dfd765e16f13b0b5253f8ec64a6f8d033db8afbd3e407df012ece299188a8e2454daa74c2517bcc2d4eea3f4ce450d99397ac634aa5e16459524ac2a229982b5b5edc4a2059063ce50a36802244f9da19db48ebb22c1dcb3b4733b13309d66b7da871f5582141652aee515a0032b27e05061b66c7f9a1146abab440f86f9715322eda1f83d8e28f63769d6b5410a28ac369eeb78ca7d7380cad4e9822b5abbba6af3ec78d84971c1385f16429b0a247bbf35576cceb96bc39006ff97aaa52a7cc61fda7cbfe0f790b3773d9b3fb90314683e687d70932be8a847959144a07178409ad248f8a1ffa47cdbe02cd5ae26032e901cc7d2dacb81b975b9201c55838b11ef473c679af8b3c90f13f81851ca0902054a89651c935fb6488a0d9321c6ff631fd8b1843b55c1a488e1eafe811fd7240200f5e5a0fa040a4e788248f2cd69241cb9eb83f684929f2e4cf3df4b33f8689803299ac7ad22dac4ccde1249ff807d4d1370d8163ee6bde392998bcde91f5a7ecf729126f4867446ffe1bc4e1c02379088ee395f3ffbebd1688bf86bebb16e0cfd02b3020af3adda9948ecdaccae48a182fc2c031d259ce498593fa962f36b8e51d60b700f932d83c7ef15ababe32ff859df0faf4ff1142d3b30fd900f70543c1ed21a421b87643353132a014a4b8f7409964460d3341fe116d7611926f1b89d017219a2c5b2dfc8fc5daf1891a2a88489f3ecd201e80dad62ea0a264663f06580f322abba0c91ee84703961cffad0b2b45c9765352befc7b2a9a6ba7a00eb6858342136181f25af6103a17f47ea8eeb351e487e5464524e42c6dc63f7011d06e603f052f072133f90caac696be70cf278a5768ba164ac1f7fc16b684d4feaa3302886818e6790ff2564ebe28880d63ec157149d919a0e15d46e876ce9b2876c378ea0da1e5befdc6908cc877baac4af3cc28563f5eed3ba01726ae71756611a1429852aa8254133dcbd42d0384ada1b80d909d34833a413d47e406f64b5e414cee37908e950c0e1ed19267f09d5268fcb48f4cacc367e12316c4f741811ee294f2a748bf45b79e5f2f98977427f003e5295ecda97455ac138036cc8f774a0a3cae81e5642bb0bb2fa0bbc0abbb2f2dc3274b80420bc553d327456a120a108f4868368ee13a872dfb286090e5686abd4dc9ccde9f3c330fde39fac30b1a1f36ec4cb73f1c1d7357c2cde7539805edab0f260cd4bd860e11ff08eacb5ca3e5940e02c3daa4b24809a2c2ec26773c85f0587e584f115c4e5d17913a5ab6145fb0711fbb074b013562e597bec9ec9b41e248fb2f9fa2c5a009256246a67529356b8e66d267217f6efaa6fe0cc8aecc450a78df22ab6318fd9ce36af9c7891772886b18874395ad591bbe9ab0c0c957d8d78f9d9483dd7d19b089cb633b9b3a4a757dd44c124e88038b18899c27084a9a3f0b689ab7fd7c0f4ebf0eb5e15d4f5913963b2fb79e4d1d76d0516b9a70a141baf65a250ab7bab9a23780ce9fcd3fe89b11c0d1ca61a7d620530217d39bc5b131d167778ad8eadd3bb29fb06c31c0ca941c41339a715396d88fd8d83f50ce54f4374c4cb586e9e65e76cc6bc6c56f5feca88bb75d9263b90d561de22137e29fec6ee93ff45d04f3a4dd7e0379d5f12bdfaf033292a16c100226cf0721a83e12d4de5321ad0d1be4d3676aae782c941f14a80072328c04516ddb89ccda584c483a98511403d610ddd05ba7da5605026937d8b1641b29041f59dc4cb9efca10a7031f76e0a79732625da2008356b6d76ef74a8950de7cfe166f85fc548a3bac17856ad276fea2f1f26cc7ba3fa50c7d18c9932e8e52466d437b8abbefee2dfe27b17311239b4efab037f406ef4a84bfda8916bd0ecbd25017e77e5b2c35c29faf59471dc655c2f0b4a21d781353783b61ff520eff4429c308c8da0f8cada1b206b51aa16f6a88388738a53a3d828b123dad55d0fd20772fa72f3ff8595ca8635603455b3c02922ec3bf06119637bf4d21131885f24c33ff63066a2c98b36af64c883386be47b4e10dfe28e1457c8771686442444a42786731e6c786efc04e2a4401dfaf7b1dc26e7da5174317d994feb05e428a6e14e3efa27b05a43db513209c5712a433aa568dea8ef87ef6a47fc31fd37e98038aef67331d29f03beeb7d1a5fc54134dd531ba4d0c588ddb130b61b5cc406affe54d4a8a0b156d73b502792769b96e6dd5b2b71354e5c4baf97215697d9f27520bd55662694ee16c8e3275c8785a603be64bb4fddbb5ea59f95ba1d3b7883b81d1387a2cc754101ae743b3dea20b868af11e1d464cf2a40cee2a0f96ca9843c5b8c0f0e64c43ef0206b69d802ca883c0a", "6351656a", 1, -1755215588, "8e5d14df724d9255629742d57866d0345966942eb175ba1f6a65786a78c15a43"], - ["56f61416049e5e325c552b4d5f809950b1be84cece2ce171c9d305d59187bd8a2f722cb7470200000008ac525163526365ac98e29be1f2e0ddb98e685e8c4160f10bb114d761720eea9cdbb3fdea49a9f7bcf82ae45200000000045352ac65a0cb9d68aabd402754d73e1d06cb6c30f64576463da9478765aa307754c45bf74a33a3c703000000066a5353636353d7b5fbe333a990c0add81ad79fd49d05f943ba0c9c6fd0c0b8fc09f5ab6e8e3cb2fa865a000000000363630078b1146104598e5d00000000000100b31389020000000001acd31f7902000000000700abac510000abb8e2b0030000000008ab516a006351ac51a83e661c02ae7971030000000000000000000000004ba03020c4369724b56d0ea9600d75a275b843e81304d622e2a81a65ba3d1917cf2fcf8d6d0bb328cd49a5cb6fa9367b37c9a85124c824340cf4a9d2ebafb611166c5c16c8179fa9a6104af44efce9d3dc172b23e417dc10c8cec0ef3a80da2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000302b31e098a355845b9fe39c00b7fa17cd39feb8828adec95158973733f4f7aba32ad02e277b7ca23879514df2f7e6bfe74868424759b81bae105657163aac843b4b3bf9d0ae8826af2a922e8dd5758d500d4ffaaaf57fa45d310e4fa0ace17b7fbb1845aa1da3dea4ec5d28836a22b41f750516ce34cad3b754dfb697f87a1e030cbc038353ba2f304734426b1b9cc04ad7395e6c63d1e7eba43be0bded5c6e70022523aebd7663d5e4b64c514f121c545bc28b6a03c4b5f257bd214639bab038d40b13024c9994634ab05c2c7117dce16aa7d28e68a40453863f3c331a07864f9da60b48dbde01a16576604fac9369750272d513d6ab38e7995fff4c809481e56a1a030a03e5d75a8237b32b348428f0c13a8a84e8b22f6f2e1db3e89393b30d49dcd3030c52debee305924ab755b4dcbf2d6d29b927e6efcdb6b3d36e74a231e0cfe7760321790cd5739bf88b00f0df464d44883dea63a014cd4dcffaa2c0f2664cc69aa90311c334e2f2a3fd4a7e1d55f1d6fd2f6b47be998e8acb458c122d7bd8778447a403276904bad1a3e8a37b995f1c07198e67abaa0de6a6b38678f9daa501b150896736e31cf9e28fce742ef9fc65f0e88822d81e7f6a758c3d53810e3652c510fb254c9dcd191f819961db4f6de0e85b37c0a18340b52892297bc625e15f5b39e5c216f2b10c4a6e20385b1f406f0da7470610939273bfe28cf0634a78e602bfa7036f9575d44f6f610c1bd27567d82cb07d6dec67eb22f1950ee93efe603615692adbd1b2b4ad0475e11b7e7ecb556acbd52aa9513d085020e2947926d7d9048f6c2b0f554b95e241d87203e1aeef7b7522c64704f6fbedab38990da57bfcbfc1221d1302a78d5b07a78e2ea382a026793618f75f891ec28fac6257082e52b0558a14e5c2a313123def81363f28647156a82897c3687f181fcf8521935ec8d9fbb3a8822ea541ee7078747390e3ffb95e6c07f3f9c95a0a22eafd8d700983fd04bb2a502f2d07c01a17794ab79ab017cb41599aad4eac5c59551693825252b394064fe821edff395e1ba4e1e309ee98629578d29062921384cac55a0f446d657dbd7d662e50d309a818ac98bb02fcc38de6c5672ace54bf163c726bcad506f014d8bbd8dc21553296313328dd7fd27a815f0c5503ea2678f44208e1b3ea3133d0d9d31c5b9765ca145bf0e4b232f6daa81bb6586f815e1df02261505e4e9a372978c76f938eb69098a76807bb7a444e4bbab39543b2a20b3c711fa7f321d0d2bff290822eddf94f4a6c4c806bd694242d9cce3b7be95bc5f7d3b9945baa8b913923ef7c2d03c78f22279c188aad3aa8cfda5913741395a022e1881099265c3ae70058477e3e2af8f8a4e763c3586318b56e7b0e8630b341689272b9249c74e482fbf4c9442abe80fe700815032bf3d492004766bdd5ba8887ac452035a4861ff24af7bada58543d57a3bf925eb65a4318f36967a77dc1f4ad37374903ea9b5e1b8dc87dd6c334265eabd9b082e9a6c962c622bf77ed93b63d6c904c543e0b9a709c2501869d2755489c53a42ff547970f76b24fd0a4c294cf7f0bfcffb19f5f879482355e87efad759a7d5ec929a365e2d76ca10efbb03f05c207f7951376f86205bbe5e320f52d692aabf8208a54ccec33ac9c58b2c32a17ff4b60c1af88e1c4668dbc30731bdd1ab59dfc77a454426affc3d7d35f272f626132c6ed44d4f509f4ea05b2cedd2d0a811c3c36481dad4214f239800d8a5a1e6b9225d5105186ebc4fe633ad07e2384d603975901e99361b22e070ca47a559ba3f48bf490b11aed1064394dfb093a5e61795e15b9acd73c05c844d435be3ab7764410096313ea14cc54e891a7e888e26d1682d7c99a4b44fcb7ab9e33449ee82d0f49ca85041bf6c2440fd8bf5c8c4bfe714cf39f9d1ce8f3dffa285de1744be11748fb061811a69efd6ac29bcdeb07e14daffe8b55a37574239aedf9b767cad3c64e37ecf24f9e128d3b3dc788b9a8eee2ccccc62b83307b52673d235051445cab2f52deb69adc2e4c99386b1c02296ac24be3e3ab0e761a79706edd81f1e72c269cbc593e3ef3d92b30095feebcdc4f29a5fb4a3dc1a4a180bce812017b1a4b0d3ce615ef64109b80be3ca842c2d4e7780ea30e7cd45914e0fab33e8591caccc161fe2867ce092194a1a245616a114e35dc4bfae41eeffe1ecb543bb30e9257b1d83c75453b72e79a940e1710d3db079817b46a36249c8d79d8c4135cc9a46781ec42358fd4c72c8c56dbc273bb73d3a6bd61f4c30dfeb673013ce6c8040000000000000000000000009b466357f4ea93f486bdaaed388e31d7c367eb1ab67ca479c4cc7cd840a4b5e23cf06e5478d8991c7b0c53f82fc3d402f58d93533726397c64e0440a0043d942fb2121727d5e9f999067a8ebddfb29fd2b416ab3496c9182310c43f7a53f386300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c71e5a979f5ab7ee272ccb09c2e729eb8b9086b073ac9f81fbfe0e5720bfd250903eb4a183d45a4c816ac293c097a8046f889fa98b3a24f65433d71e2c849024258730bf403286cdcf9362315e6a500cea1d86e54586114f81f86379e4ac6e919f8df2a8f67eacf88710dd18fccca5ecb664276237da99c3622d581cfced3f87022dd944332edf84a87075756849dd74725ca194dd1131d84aa4c1a79ddec904c4031cc061e3108c235a88e4cf002364aabebed1fb3675ddbc7a7b22f318e9c8de070b2908793a214f021c26d5860b7a4adb4521cb546d0ba2bddd9955d63d3cd538fd0316967c1eae61696b74bfc79e06e33beb89787bf26c8629553b247373ffae5b020d7c97081c50cadea9f53015f70333713dda75061f3e6eb8968696472ebcdf4902024f4dd3db6da8817a2fe095bd94766b1bb06325557160440ca4d33317d1d6bc0302110889542b73cc0dde373769e716f4c2d04034aed1d46cd6ebe19de84006a0031e79d9739c4b011decbb61aa78193deb2518d6dba7c85a0d003cfad8d51539ec021bd906a4eae53d21a33b99077991f68091958715a4bd8ba9b4730a9ef54f67e5d2ec7e4e8a4d1fc16d7ae4f13dbd75ab9e9850f1353eec17b4ea9e4f3ca662df427a8ba832670d0fb02b310e933c80d381296b854678053df71ac3d10cfa781fc39f94e3b98d41e96d8dcd42e0d797d54c8b528ce681b020a17954997b0023e9c05b5b37456b50a981664c885db0179ba91f60e8ffdaa4f9b9b9967cb6986f891d234d6051726f8bde5a7ff8837c37060997effe0ffe066b61085400bef8ab2295c780f9ed4f4aada2efc9c071f6f48b249a3d88c75df3209cb50ebcf0e20100012f6396c49cbfbac9b9979dfc55a3c42bb586436f0ee008e611656ae167507ac2a8e26f83d87806dd205b3e4ed1e200dd2bd50691812ef7908480aaf2734ef89a44b19542ab21f0de4dc69f0a0f2c44b0014a89d2f8cb48429a438e92951567b839a5ece3776cdd697fd92715824e2b5d03262ba3ba5bf03f60ab1ef177c0f6e957d0edfe2d0110952168805adf022e16462c3463c771ffb75a13eba23e0f7ffe73729cfafecba603e79476e1820e0c10bcf964e96ab398f309e478693b02cb2c8cd0b712fe32903ccb3a06855b69150aabf93d8f6be400c3e1722e266416ee9f6a231ee8cae54f5462e9e5e579ebb8e10ada1d9d26072478f2ec289118ee39f9e7ce81de296f61224a4c1e17be395b7e3c7842fd7760456cf2fe9553d32ab83e74442f2a23925278416310ee5b600cd8df2ba1faa3cc5f88c90d389ca492098f0b0eeeb4240d1395fbafdba43e089ee54384ddc0bfc81ce26312a9b7c44a4483f250ce15026ef7bd9a32250577dc44d760ac1296c3f7c7469662feec83ae7d69afe991ead1551bad3d564eaf0db7c6cd24d2a51dcef6acfabcdec64a57af741694cf3b3fe93c59d020bb25ba8208f4a482d7cc8dc0b54ce7a80a9fbf459403fc57812d2a20b14069ba30b99111beaf9589bc7478fef9784aeb5ac5da00a104a2a3bfb6843cff8109f7ff036cb1bcdd268e95bdbd1ea4560fe7ee1f2c1d689e47104b5bedfbe2f1359f38addbb24b84f045047ee9752a302d1c26e75f1939639d7d9ef9649ca68cafc9a090cd27cc5f2fc397e13426bcda935aa7f6401d7887f432f52348fc62cdd2b813e8b198aa300a07488b485e7989b9ecf9e30de8d11791247c06336c649afd894c56502963837923a1d2a4113e72eed675c68adce6d897479372c2481d4b86ddb63f45521a51a0ba31d29fd5a586c1e5b5ddf258afccae8615bf5ad1b455c2ccab0d77d497424e3dd9692efbaa7172631d76956d38cfa80c00db401107b210e0dc911c95882ac1a539568315a5575bd9147e6a155cadeb17b6809f026d328160f0cfba0120be6236a821d7d4f47f76ad19ff0bb6d006ddb6a02808d2b8b84484c2dc27f575e0767cfee2a073d8a162ee2993571402df60df9e6a11772dbf5573aab751f8032e5cd2bd60a8ccd700bfb1f26d5f7fab7caa72f44fb59d80412f517c04659897a9cd907caa092702121621fbc4693792cb8c4cd96da4ce57995c04b2dc64fb0da181c5991c2286cff2ec0f79ac4dc094973bb53ed58dd7cd311ec9a07de54c4fd557f802e84cbdfd408f883396a4f7adf19af38934e0adc2f1d26bc47e1f89a0c927204f3b6c9e421b6d0955adcc0904e950447b7b39e3314e2f16359b918880c3d40486f0b34ae95986a1612b866b75577a65ece63c78f7119210b0f7b6d68d53316d67cf0333d678ec66f96275f17deab246cdba4c4fc105cbd68f2d9eb2f1b7b14383473595a5cfa84195b5d66ea4ef76a6829fe8a6ca1ff3c43c605c1127bdbb9d21fc0b942bc1142a34e8863b1004cf4ca3834ddce99c5f34cbc23ee3f3d19609", "", 2, -387096437, "0c594f9104cbe763cfc0c0b01856c19236d204e1aff05f1c67ef7bdec54026fd"], - ["7d59287903ead37eb1114f34c3c84ba0855e377b6339aed82c1e8bf58bcc32f3b23f40d4350300000005530052636affffffff7a21b5cdab674d88b4b625cd8d4903ff6c5f39c46fcf7e8a04e603e70f49a2be0200000003535152ffffffff70d2f99594aa6f0dd888296a2fb9872bb6da1547994fea73a38188b3021926ad0000000003acab52ffffffff030245e20100000000008ba4c802000000000763acab656500653f7429010000000000fce6f85f00", "656a535152", 2, 1730337781, "d10363f7d78870c1c6fa9345ee058e635db2cebbab570431c817cab2c87553ac"], - ["7a947e0e0407485fafd7a03e8ac64e6ac6637c084ac2481fb50c9f05a374ba1e3844c4beb50200000008ab52ac655165ac53ead13a51424626955569b4bda62af6f3055a9106fc9a6f1afd846aab2bffea63e142388f03000000025152ffffffff15941f33a9a9f1ca9a3d4c97abe99753fcde99dba8646647028e97d492f97627020000000951ac51655265526aabfffffffff098cfdb908fe5e09f0da59eab436578ba9e88ba113c383723c2e631fc7d6695030000000300ababcb9fdaeb04f1e12f040000000003535152354aa2030000000000f91a50010000000009526563ab635351ac00911ec8010000000007abacabacab6a520988139800", "516a650063ac63", 3, -1020794756, "048aad30e475f2bd0cbb166d16bf3682b1851dfb1cbd7e3bb8845ce446ead925"], - ["f6577da801949a2cb73406a60d1601244381ebdc07504f4463c3d007e94c81f0410ebe643c0300000001acffffffff01e76a4c030000000009ac63ac6a00abac530000000000", "acac0052", 0, -1242433645, "c311b0bab09ffae0b660ff006f3a990f0c1a0ecbb4f87b9e18f7b44e1c5d3528"], - ["0fabcba203876ec086455014fc07c1b585e012625d37a342ea975b47963e274979d82ba1b40300000003abab00ffffffff62c17bf0ccc1b6150af39f4a0f87923ec0455ae84c25f8561dcbe486bdad36bc0100000008006a6352acac5365ef9bc61e7e34fff6e5294657883854df1bd62255452b8ced8b918d0f30a691929441eccd0000000000ffffffff029a74d403000000000963ac000063536a6552ec9dcb030000000004abac655200000000", "5152", 2, -231833641, "507d8af51deb25658ea60a1f380090f5865a6a4f8b695a8aeeaba90b3b613779"], - ["ecf12beb03025193af2ce2e17243076f2a88fd32c37b6a47bafc56e716bf81114a8106698502000000086553515165ab5363ffffffff25b637d477cd53241036d89588e36d56c1e1faf0ba307221f04fc1e520517c6e0100000009ab6353abab51635265c93c729ad88df5e763b935e1dd9cc8e8d1d64b6374206333af277b9e3696bfbe0da733fa01000000056a65ab63acffffffff016590d103000000000165fd30e034", "6552", 0, 1706991474, "8efa29c7ad17453fddf17d7e52ee315cdaa44e0998eab09872305de9653e13b0"], - ["8c2f48c6022fc922383992ddbf84c4c6eb98e60d4b7263ba3859a5009480f0b89a4c3c982e030000000553abab6a5311ffafdaf14091da0ec920ef211f766ca8a0df8c9095c3f898b2574d646ca40a61b39a96020000000253655ed1397d04a152a505000000000563635353650ca5fe02000000000351525150e4c4030000000005006563ac651c1808020000000002526a6fe89fd1", "", 0, -1230454624, "24a4fa6c9f2644cf171a6bc02249c8601f25b98fdf224df36da6573d1f22f8e7"], - ["8f98e62304ed74ee854d7fc769dcc20aa8ee29a92b737aa8a5a61b512e01d16a024c8d7f410300000009526a6565530053ac00ffffffff1fda9c62280138264fab7e52bad0a35399ef1c845a70bab03762ae11f4248a3b0200000004636353acffffffffaa88b4856def669ccda1f24880069f05bab490ae1e54656be926b8d23279997c02000000002ee52173f8a8a0101d4b46b68c68855bcdb08692d11778ed5bb038c7a77e4fd482ac14600200000002ab001bf871a704ac876a020000000009ac5200526a520051ace7a1d10100000000002d7e1a0100000000035263523182d9010000000009535352ab5163536363140cd17f020000000000000000ae453c0300000000a09cdf53aab2b36ead5af9194385d45ee6f22ea4d34491c499ff7ed6c46dbddc01c1ee344cf9f2ae6b7aa10728e374cd0210a923710e89f4294fcf03ca698bf9148a425167c704916fb5256d3355dba02cb913c93cb70b977bfca059b01c7998000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009346b5fe610bb7be8adb1268f7467db021f42dfad98ed4c63ffb5b98c507cd8b98e7dd404d9d7571d826a74f555bf49d3d40581ab548b36814409c61cf5d1f84d8442bc7ef453f044f3eb5d99aac3643f03a081f1646f2233623e3748d5f4c048af44b1933851636540ad93f074529ed002c17d1b7515fd452a9b53a289f4362032a05dcf3336c7c2649df837abd95d8607d2d9355c14a1f818b7a7ed2a88ef665030d9b0d7aa8b68b070ad129bded178332872a3abec762ba5b8fc1d2e12bd500c00a00eb2b31d281980be20f46a3216e746252cecc059dc0c095e0127417f6b3e3ad0e84b47e655e790fae6a57756217dbe11f86192a1a02658d72fe7191420abb4f031e747734b2de1d299c54de5f6d367683d9e1603816d11c96f69b04147c7c1efe021cc2942a07b80eeb9db65290f3b82ed454ff3c549d3eacffbd04df0ef1c67347020741fb2356b47410695daa809fd20f3a5b50e3a3b4b11ad953e3a3c5a751f33f03190b7c89742ef19c04c9fb9363e51c514486a2b935020e342a0c5ffa786249e503253c5da0befad18f8e1bfe8fa17b7fa5b56da7397095bc63b286f067ef5c36cc1b6fb5c40680e6ade0842bf529f403cd1f0e0689547dbf929b4c9579956b91fe5f53e8d6f2deddfac52154f87023463c43f282a7ece27629ee7c0f654dbc6a26b12d0f8c61309dd67d38fc8f7db738d9dbc266b6480abc1d8b88c4dfa24c74ffb5303b2fd5d5956f3c96e8f02d68b13995b5424dfeee259b9261891983633ee02b4747d4175701270bcd67b8b8e96322ec45ff7089f1c93fd4cf5c78c547736cae0615c1b051e8bb1f9d62868034f6d446c70243d14be9b78d5edb309b75c7d48f712b954e1a90b8b8f6a45570088db42a697d52c3daffb1092427f58b2a0921e29b30a625247a8b84bbe576905a062749ef83f0d0978f681e355413a9525f14f299b49ebea103eebac836b56fa9b55e9a6ea15474d50c430b5dd6ab4b41c0a7c3e57430037f13ac40b2bed95c31dbab1083dbab79c0f7b36a684f31f3d8a9dcab8629ce300950f01074d1b86871a3104640fab784451b90c487743a8f91101bc049c4fa480fe0115833c2b4b53026ed12247fd6adc4b1d4b3c5de2e6afcea620bfe12e4c8f99c5a7fe9911f820914075ccaebd0115488da6f65d35b8cd77ef54dcf0ccd453c2857423b0e576cba6725587e3cd34bcbaefe5edb73628c5282a89e15b8c45bbbbf355b39d5fd28994bed8c3bb944f9075ff61249ab9696dcb1342e89f7fd32cd418addf586e85996bb7d6eaa26aa102793807550567f45ad3605f4b77f8e560534f7880ecbe1890e43361f53c455a080c71f031409755cf48367e3397db72da3b1b3069d1886cae24c2be1392a42b7b7cab0bf5e083f85c08fc4e26fe6e8e0422b18591719df56e403497005f1b821027bf80eaafb96953d2736ac18aa7a8b703bc83e2ada1be4dbf9558f83b313a36cdf1c1e0fb1f78645bd4f4fd277218ce82049bfc161b5273c128054d13c7cf0f53bf490d825926a53f349a564376c4d689967290a53277ad3b585a1084c262051cd384c3339f7a25d76448390f488245a1f49e37432d75302f3aaf877d96fcb66b57e01c136eb8fbe4d47a786aecc17e9e8f349c8ee59472679c0f728087deb9d487dfea7cd52dc4114148860d9d7d2baf478357da9bfded61dc9b1bc42baa0dffed114f605228e21eb0cf0b0d5616f9f0b4f4e10c4ade900eaf18f25d675b8a5dd78710fbf426c72adb5e9aba47145ed089db8cc0c30044f8409dd44076cf414b2efb159627d5a04adec5756cc86458acd2ec89c9d037ba825d7816bfd4a59424aa6adf53bf1047555ad4a4f93f56695d286fd1ad534b9bab2f003e9bb1b916796d9b2b8026a6f9e67f4ace7cdf4f7668f5a3df7568a8bc7b4793b10afe67db2863d946ff142fec6415570d83808c41849d45b33abf393cb1b20f4da892ed494ac4f73b47cf128607d16c40c63e0e5590351703007a6e7ce189745e313da1a22dab4437d45805a42552892a6670f9489bd97809fdc74af3919465006983dc6b07cd93eb56e01d72b039d556d5107902241b59615e539b2fbe1af39874688712fc84ec7060945489107b1fdde52e934c999d6487c543ec4e6bb17d9ebbeaa2533721e2631406f3bf3ce55859e3e4388d5eb14c3e57ba802208e2aa6d7c20e45ff44891cc73912230fd97398924b419de325a30532befdef5e81eebd77e5fb80bfb5d6945bc3abb03735d46028cc59196cc626b97d4ad40f24f536177a1a8045050000000000000000000000004a11e9c70d3bec0dee63977897269a1ad97492e9a43052ce1253e1554f96b6b2efe482a52bdf363845b36aef62f89f96f74981191295969341064dbdbbb9ec000949c9dca8912a7721ea25f27965cc5abedbb1961c55512e83cf96a934ff5431000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008596e1099e37715c16b714432150a5de70b5a7c811d152def3593c1ea30d07d7ecb83366d4e380af65e3a3b987c8037a9aa91d022584cde4146f82a5af5d0e03b9e50e0fdd8808b28ab253ad2ec4c0112954a537d8af7ce42f68200e8f4dc1ff0ea56d882b0bb219f4c93eb84de9b0026dc89494d74b97cc33ec3521e1be8fc0030782dc9df794364d62961538c597c3f8246595edc231d5281efdd794a0494149021f07334552a608cc8e99873eb21b7d0ac3a5500c186d39e44da42c9d409791940a2e4b83fe57bb7ceb89cc38d178684888f31dbd18d3b3cdfc542cc9332b2616652b832d9429e1b47b1d8bf147adb32bd6f4cc7faf635dd86fefdf8a6ad3a8a1820329f8cb5e934fa681e0e2d542f0ee8c179b9deb9bbb89d1bbb16788fa3e9962ea032ca24b85d007df6f32c8291bb0d172b508c5611d6508c5be98397926747b8ed80221fd678dedc7cd5cfafd910236c69dcd7566dc3556920606432c86109563a2590208ff401d054fb526a1b39de79511d31c8d46392e6587565188e61b17a862917a022c12274f152b186bdd29b2722b92ecf101b7b3677cc37dc024dff6e0b182efba7ff5edfa87ec22850481334cddce03fd794c626fffbda760ed63edb43202795ea672650f07f7ac9c498ad2d7529d021f92bf07677e87351ac2e1fb5ce7ffa26b65d8ab67cda166e18f6579dfa686cfb814b9d6bb07a20af435e2bf1ddc7b81d7620634a91c6245e103ef3e62cb50ab4e60292409a877b01653f5079d12d2f296c8e186b7dc28ae6245bd31f72db24334f81270542ac2b33581c4dfc84518888c3fcca56f3def017a30bc7a8c0335b6103c632caa490bbb8eabe34d707332dd1b19e300766f59169248dc59f2cd1fb82c318f116b737924866f47fd9bf092c193db010cda003f23c7c8b4948eb90bd67885dac978f37da63ae9feb63c4e89bfc79be6c119643309db8a5eeeeb3b44abf064f6b92d1e96e8678b4ea1b17fe9117d5e13e35a0912e2df0236e4737bf0e139b20806cf2a8f8b6a629d45a26be86bd1086c6bbb7dc6af4b9103ba4bb9f76fc91e080c13d949d2aa9bbcf0a81fd2c9e6e82130887e43d670ce9ffb660c9733b5ec0e1f9ece1d270029ef560340cba9e70b61a589c350a07a49482a42688cb60bb821f8e92c716cdba5e68bd9a43f22c0ab8681adac5d3273a07a2325926c3293647b77e332cfe0988c6fc72b076a50ecec396f4336214d1ea8315fd4cfe8b159a1059aecedc9c1b9755f154e70463c81de9f772548b6a86538578361050d293677325a86009b53ca55e5ef9bda13f148c5b6558e9a1509f4d1eec51b4925cfc6aaf64923744babe1139fef3b84bd670c3cc626a57654d52fe3fa2b66392d1dd53b282c836f2ad783131e08c6719fa997c1aeb62a2db02e2a81f50573076ecb1d95b521fc7dbb99f98861c30fa5b9b4b072c3347ddef71dd9cbb37d56f6edaef7e88799a41e74a76b123a069409ce4526ea1c0de032dba705ccc88612bfd0d0466fc86131fd627e1225dfcb3ffb048354841181e53bcc56a4b9cbb8d34471c5b54d0bd6ca9d47c4c47bb1d9feb2e82dbe351e0ff3de674614887effbe140d4cf25cbe3c87c31e41b8b5c737b9026bba770ab9f9300b053b3e3079bfdfe3f075989bd303011d1017e98c4455add242fdb601838f1a8119b9372bb6e7f86abb7a160d4b0ea41a1d2cdf1966c9d99eaa90a17afebab42ba11a4d7b92271809de7fdc090a8bbad16e323f194d61f5175f45639f5fd54b0b72ea931e613b1e4ab69a01550f26ce05e074f161188163aa78ed106272eda7ef60383334ae2404819f86e14610841c0c4873795ddf1c646374eef2d5e5395e28f251540128aca0b4ae1a0d7e95e2a13ad5c008938eb8dbc2e1c99b6c3326173623874d0f5643da268f8668fb6e62c82cdf3c1758c8a4fe718a174721b366c5476cc71edf4e7dc155f29627a314178c8abf6c05af86eb41bcc93b2ec3d26510b2f408dab3f6f54c6da28ce8ae677276831f5ac8c3cab5d61488ff2ccdc632854c6fb2c80a819da7279325fcb57604504f74ad86e219c0b27e4a13c6f35e7b2b368fd5163e88c261134c7e64fb067004948ea0c9d4908351bc0de2331c65b2a999787094b57deb89f9ce72ad6a601a934689faf691dc1986ab4a544634f0508554f3d966a35ce5d319cbc15e014dd6c35861f22b55e8c20790068957788ab2c9f9406da18b5ccd974c9b57c905bd85592b8c2e6d59cccb1d267f9ec94ad89db04b40f29b62446893ef537f838a2abc835e3f0571a14587e2f8456b03bdae757556e6ecc22477e64432a499c816f1bb0686bb692a6f0bb596616c9bf83614479ea04314a218d0f1bea617554d065f60fd168f9d912361cdd56d54bb8b512202a1ff4350decf38928f897cbd370b09", "52", 3, -677808630, "084b6c756e78d03e5a3b17bf372962f737c29cbc54fea86ccc20f109efcf3bc6"], - ["6b791808011b103bc1d2c94fb7ae97b441de1079669e5c78edbd6f60d4d85c29373a3466020300000008656a51ac6563636324eb1fe20205914b020000000001525e76090300000000055265ab63abc73d02290200000000000000007ac2ac0200000000c294010d4a3768e2c416c9488d17c44bc7320e1d6aee5f25a312e7a3d4420d1f166ef704dc4db28149ab1c1285e08451bcdf35c6dc672ac351c7a1bb7d83ae0e374da923c0123e52cc9a2f7c90077aae0d7977628bf7bfe4d76b706aeb2773e7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004f0791a86e318910f88216a120c6cf4c93fb128ce1b206560efa5c1896be6d97d7bce8a9821de90e6983b3698b6540ef7aba9995f782d024c1401fd37919d7dd4e17fdc88e2b4928681b05b277c53e3e1da255cde979930449c9f280c3c29e633c3f30d7dbd836b39e7c9d19b90d75f706ed8554cbeb0fa2a22f9d0a3a39c1620322c20bc4742bb8847373e91c26e5a7b615dca2cd270659eff85997898f61ef4c0212a519cec850480ca01d50492d42830e86593c469b77bf24e5108e5ae2e0b0000b08bc1237acc34890987121dd67f7406fed90276cb5aff6140d2856c7775cf4560669d993fcd0b47192c689b129556e4ea8f649ccc493100409417437350f1929032fe7dc6de416f4bd1fdaa7b74d5f9be988f829eaa8db3f88cda768f6a5e6a455020ac6052f09d25d8fac5eee79d036470ea6379ade7f2bc516d6adb913757d5de8021e6f29a403411d254209adf2b750bdbf082c26de3b98a1b0bb171dcae903fb9f020c8cf2aa06e2eb34fb69531778645bc53db2848f652d144642053aa27f850e430202e554102367d42c5a175a4d6f16a685df273f8a2dac980ca26f496debfb515bab30aeeff3bb21bd781e5fdedbf9808d764368de3607b8a4061b083d25fc17fd7426973a4fbc30314adcdf20cb7c97427eb34397bbfcf6258f74dd4d1493d77e5761569527ac7eeeba6151ad5794d0c5a4d9e8b7b7fcba4f9ce4c9faed6886b13cde1c7e618475bc069688e36c3388744032ca50d9f9d498ff20ac6b30975a9d7551bcf90c08cda4b0d3bff7142c31b6f7ecce16454b69c3814ab0016f9215242d326e8f25e9c9f8c45f7cd488fc66fb59df728dafdb3382c69ad390cdc6747d0e0da0a5a7fb5eb417e0bbce8d168ba538b3905e3cf8ddcee430e331f62b7011b61bb443504cd7238becdfdb1ffeaf82c67fec211bbf52ac94b3d70ba164065ddc732896c301337d0a419b91c730c03e1ca13267a6c203c990ec35f4480558b20de2d1575538d8c729149cc3e27ed7eff1176f76b06a561e4d406448a93ce461bc375d33a4f8878fd79d2a6e5bd07c32f3849195fe2481d1d7d3b5b215b97bc0b4dd9262281cb98c2233292612b0daca1dc068f879b8797678e66cbf7064134e6d2c144cc1961b3fc144d42b8d52e26895b6d565fa37f3018830a59098be18464839e6c5c8790917681618f03201a69dcabd91d7e9934a78aac63b67d630b4521b76c4765b29a1a2c42f75e44dcaa81975e16972c5aa1844aadfb38ef87965cfc0d083e80888d92a6f84eed23c19f291f4d4e6181b5e76daf2a9cb326bb84567f8a994681fa1e59053e33cd9175c35699ccba45a8ce792d74bdcd003f770c39843b709f95ba9e3ebe27b30fbadf99a1ebfaccf18054d43766c09d894dd7bf5e533778305f28a42c96d7c4f1c6b9e0b82ea60664fd6b18fe06ce1cfb6259ae9573f9bd24be1c4037170a88018255b1c4861461eedb95dde67be569cd0255c7e2901f8e79f7b83aa90e2e011356cca96476993897ccb8f90412105b3a2c78b0930fcbc3b7d22e861cd50ace4aa38c7bc326a5c101cf612e083dcbab92e4fe834aa2d4ac88c9e064f75dcc3af21d19396d24c589a56ca96c0e51cf9d04128b13cd81bccbfee08464121acb4b851330ee1c180da2e3dc24228083df688ea496bfc9173221fbd7803fc326ddc756fa5c5843f92dcdb594d34bc3ee65d46162caf05115c7e2679e2a82b9cbe450f884cd4cf44941957ee931194d8050c4069dca67ce8f166717019dddfdd8064c8595604e6de341d5427a881544f820263ecb9fcd4261f4d8e8d632de9d2b6926e11cb8c205798f1a03d4957e8c1cd0e23a20e27b51d7a880be11d3391fc12882bef83f912bda3c76936b7e98615e8fdd279cc249b75d37c11f6e3fdf802c1c1e4b6c5b07f6506aa3c7dfb3e0b3aaac2d5dfc07a05f431d9b7d1e85c9b569e4a604220647b30ab8e0e9f323be5eded6afa7f6f5e8ff3fa1dc531a126c0715320e2e9426c78996dc160149ae99dafc3e03a31d98c0acd8dcd06e07c06a3ce3a2342ec3e745798e8aae39fdb41476665dc0c9b82a48ae08780a26647d89fa76e29bbff605d27f4bc08bc55d563ef0bfaa8e7bc642899f9daa8f3c15f18c7392b78a0904d4d26892125e2d256299c61e8c3e48412921da54f57c6f6b512f27e4a3d2d580b3f4445228bd10992879f9799d38e5cd44366db154830d2bb96ea62cb223a79e70be3971d1fa535730c3e4d6d2089e878fcea40d7b420cdffe22fb2719153dfa39b5a9e67c49b09e701000000000000000000000000bc6d1ed50e741067aa02fbd3ff51e7e363940ed582023831bc5300afcf0e16d509a8f08f224aa67e317a1425f88ade3f9263b969588b1dc0b685915b3e52c509052f3c18d250c1f6ca71c864ae729c078e763fdbf44b56e211444d96f21009bb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009529634b4cbb1684ce396021455fdbcbf4d6e61a0c3cdef287404600e586370229aacaa84423dc1770c0dc8b447eed1e8499adb172fcbc6685a40e72b2b82d502932b75a7cbb0a260d1466567115270cb53d77ef4aa728f84f454af2805b0515eb424ab82387994dc445cd83919b9f0e8087db37181871529ef121dbbc7ed1ca0315f68963bca0ba9964f892c7b402f7ee9b9f9dc045494e6e35c7fb74b2f7bab50306e0c239f18d11c276552261b681ae2ca0f1d73b78750adfa351ef2e8bca48630b1e8401cba05a8dc6b326fd66f3009c05687a0fa601c86a8f774a8171d00d056c158a54f589b6d1c2b102983e64088f205749258f6627b91f050eb26a66f542ec022962192c58d47cdc491f1d2ae6c2799086217353dee79221ee8a3164d108cf79031f8ad5defa8761668bbdea74ace95f698b88704f68b6e2bd19d9cddf0263c2670306b697f6037b80d59cb371cb5221fc3ce7ca3c58212547983f164c7fecef9bf1030c02ded10afccbdd4677320f70799eadd66c284ae4daf339821d642c6e338d8f0210e9908cf15dc28d3ebbefadab1b3553144938506512d247400de3cafb7e5ac9dc9f34795a7fa2e46f304105756bdfef422ffea26c18fed1980335660e7b8ad54d102012a860b1d6c376da2f0bde0376320507876e6a2860f1d5e374411ab3279e72a1084bee1b50c04b8c81b3c2605937fb37b9d7aaeb0bc4cdd93215fe88e126f6874e009ba721b63c361ebb9eebc002b4744939215ecb5aaed0239ce26cfa2db0df98f775c8592741c13437bd929daee9b6323c233901472b748e018c681ca75d634054afa3447b8544b0b4dfa8a3d60464d9ae3d508c42ffaad2faad66d4f95d90d771f8363d24758b0763395ca7e8a4108e32aeb225991c4529896358ce8612d29d43c75818610c5224c41441340a586ca790e2d05815e03a5144f4b42e93bf7bbf8cfa952765e9348f6d1f744895bcad0baf7b220dbfa259478ca3c1ee32613dcf1f8201ad5c377afd5a71aadaae981b7d3084da68af0667c51170f95b2f096771c48b91d400cb0763cca8e8f182b426c16cf21ee241b86a38106c07c0c4ae7ef191eba885201bb8958435b3dc90bb1936a74043bf0a5a8b3ae7677ac2dc4afca239df7653d09cfd264deafd8ab66f4b02338942c1900721eef45cf5b5b751ec43d6bb93818bce83a58b601202adca9cf845188ead8d78b8123d30aefe933bde822ab425004013c1427f12b81bd15fa45ec791db504f156fcccb14477c1a9437eb14d0746becff253dd8c897611596d7fe0ad056e86771b29c03e78a912aa94602f77c9a9ba4359ca227d46a831a57e438870762c7c0c989da1ec6b0de4d3db028389d140da81043f63e6951593b23b29fbc4cde84aad7f893ef47820230d14d73e55eb005796f6c9d4f5f0ac9df94745729171ee86c258d16fb29a6b7922d99b1770349b89b6e988d8d61186a8fa2e93a81a15f2c6a651168d0a2ca2af3d493c7f3520a40c6546d7f739f2bec9587de489d2861872ce02bdeaec32d8f1a858a019bae413260fe65a7dcd1de9f8e572d28a906f4c6077331d7ed3f7f87aa7761d88ae76621edcba95b3c575cb030716c53037c376ad149d2ed32b02d1aa83d927a8482619c63b6b39ed062f17cfc10182739738d8fb5b8d0e7ba39fe60ff47cc617bd4952b0b6d6066ebdd4f99994d0b27d0bc797d7e57b6619f92b3238f735dc98c522d539a99d6c781cd4c783bcab48673c842e8085b48432a269e5435a2f5902ca880388724a1c1022096f96344291cea34c0c4abacc6b7da60f6f6d7d5a5016e168a10ce731b78f65dfd20b3430ada860afe257aa979ef359b7dce4fad0d2c3514962c8c97798c774a82ed86a8b9b9003d0422cc0751e5270394a916094de63b08f95ce027200a19ead2b93299bcea2675f1234f14bd92b5bf6129745d68a884a7d0afbaedfff9fc4d4999a7db2e767e3777b7faa5d5dcd5d71872a81c4618731c34d21baa22eae8f5a81598283c480f8515397ebde7793531e4b3ad4b4b4cdeb594328549187e01fef56c8637f863ffd0e678add35049576566e2b98f5de0f80aebfdba903feb7c52c4230861065927068245f45d9496d8bd46d724c5baddcc8dd9c5f94e23d8d51519aca82706aebc9da149c1c84cbf9a6f3cfa1e3bc2f34904eb8ef7b344ad3ba0547f0fa10f3b938fb1b2b4834075caeba3ca538031b490f1a3747a429d35da89afa3f97bbb2f66e321f68074999ceb2971d2f1fa2cc97e4fa2b4cbfb7ff16c972f49c3df4d8d8687e5bd67f457507a994a5e4b3c8d9672b244aec81d10fd36b20528aa1fb5eb6d5bf8cd515cb3f908d1e487685e05c60215f2d168eef5d5e64e94fe4d2d88afbc38af7a15deb31ada74571b9f3598953ae55553db81f0c7bfb67bcdb803", "65ac", 0, 1298665457, "fb640021de7cd35157f1de86bd3a555051eb85a8dbee2e7b453ef02cab3f057f"], - ["583fc53a0479012a9e0330440f130e23a126cf83924b571f2ed3d3c5b4fad568580191e30502000000001ab528b2e9246ecf458413dea34b6c6939c4b781b3728d507b0573e7d31de428ac2d22820200000001abffffffffeec3752b1e5891dfada7ec63aab8675fb35d926a3d32120449b2e16fc907c483030000000165998e8d07166d49703cd04aef2cd3bb1678e1771fce1aa2005b17f4aecef5779c66beb6560200000004ac51abac3e47dee5030d1faa04000000000151d13466040000000004ab525165971be00200000000000000000000", "5265ac6300ac6500", 2, 1123439229, "55fd1cb17c2ec68f1d7fca1f13760a1a9c2d633c32db3d8b1f59ce501364ef0d"], - ["c25e076703e122a89ddb750f09f942d0cf25cb532bf2d2f08482ff79104c57a96600634da70200000003520065835b0d9bcc2c00a4d15e8efd69471df7f08d83e6d51d9e72f59b531307100ac1f99cf7250000000003525152ffffffff91bc687f6e2e517a924bf67136ba12bf03e1205f75dfa66d1c6da534dfd491e0010000000765ac515251656aa42e68ed0495fbd30200000000065252ab656aacba314c0500000000003affc4010000000007ac0052510052511461ac0100000000046a656aac000000000296519f01000000000000000000000000c970770b4ff56aba303e943d42e2a64cb8723f194f87f755a7b82e241e57d9b62bbc71d341add7773512502f562a7e509f6e7f35fe2a0e7c8f9d43ba4c27f0b3e7060b8d7f84ec0063f6b53bde73f0061184579f634a16210d34dc54cfb99faf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046860a5debc701ca1e6023129f844865ec0d969d2a7810397ad2f03daf1ea3760d2aa10820dc4478b8c8336c192d209021414b7833821e18229f6508df4ec07e8f11b0633cb3974a0668d2473ea4321ec71e138c369165239937cc6f19969a289f5ac077174b4966e7cf26ce5f17e5469d950967a492a4831b1b0f194f1e3f2202091901d1c34cec1a995c7da50c3cdae30439557a286f3bd63fe66b374661d9a10321c3cc68185483d8ca991751365a5fa1d31aece3ee1e7dbcb19b09a9945a786e0a2451e8f2c7ccb560ede72ee0c9aa99352449c4c13d9d49005726c253eb30bb5a2c06d3eddca104de42d54732e50aba7c4996851834b2981c5b6375f49d2b9ee90300e3ba06049ae326a0dd40e3597d1edac9b6d96bfd63b8bbf59e130dd855ab7c021a5ffa317cdcd3d9caa4b729446fdebafb36044fd7e60ef646e8435d1aa47e7e0328e1b0eeba02fc296e2e56a8845ab9c599e40f66f1a8380bf98e29d3576c999a0319162b2f5b3b3f0ef1316778a7c0b5327f1734625647ef8197680b8f2275ee4c030e0ec6dab45b9d745075d6eb3ac2e7c73523cf84fe122de634661c8384f81bc87a484fff2d249b3edd8a9f06b15183bfbcd60a39b1e129135c789adcd0688f88701b4cc1ba453d02f87842d95dd483e5d900343c75bd5b882d704e3513a2c5f921a32feedf4b61effc114ab81dba9179f9cd14a9bb1fc1138106f2a41cf406a2e69192ae77d6db1fb93990152af10e40ecc8c5433cb26debacc10d92f4df403a4352ce1d4b66911dfd86a5b68f0994576e6ccdc689e153913f50ae752d78aec8a187aa8cb29d44dd9838bdb5508cf8bca229126c8828241353f69b0768cfcdd6395faf90881f5ccf5da41f05e25f4c6a3dfac24f6a3c8dab513cc3d69fb9009a8594cf9bcd5cc273e2e07c402505070f3d5370196a7a46f5b64a844310761336abf49a9a32ad5ec887fae6c4b2712088d9412c0dc2b02ddad0802a34fe6d13487518bfb81137c3fe0c7bc923d4a96e120a311f71a725e58a452fca0fca71e330099de64f8e9ba86102ea082ebbcf188056f97e78cff9c1c361fa52e3f42e612ead5c0b9c33fedec3b311c0044d08b2b0199dbf53245a1e5a0f64560729a92a73d96b7c6c890fbdc19dff5fa2464cad15d5632b034aef13e9dfe217ba21e5e7c8e5f2ac9261dee61c894be8d1cac778e8f1f4440b85d3b548351e326ae9d398cbcb74f13a10d66023d461b5e3ba9ca1615014968ada2ed60ba00e8f1552fb00a49e2c7815b06398c93af1f593c5e0a35d3ca3f0d54c501335da1159a11cebce519bd5c412ac3c2fdc1e34cfc76c8dadfedcff86f8eac554c9650ee65eef07d57b61adf259126171e89847923fc8a50eac31c70abbdfc136f53d12706ffdcc22c80107e146b2900b2160a4fd01a06c68cbc3264eb6dbee2d404a9fa6f8d717a703471cae02ad1c1582a60ae6f3f623056de10f62d49c34d0a6cf23050ad583615b5a19d0d56e959453dd7f2d2e3fab92619c3866b52c718d9b17528373ce139a084955bf156eb0dc294d2a22001c8f4fbb7a869c831712aa89e243c976e0df44bc213308f4ec4e27ba62f4f69f132ca931f08666e91e2f3c686cbc3c77e4fe107e7c584cd39e95e80db715e24d30ce11d3bd843babee178ffa3e0bbc936ff82e2b3f0dcdd8bf36d8f12fc7299d5eb01963cf872c816dfe7ecceab228321ab4a9145ff81eee37c09c248e4a5e2738f6e39166a4cf2cd639b5c451c8a1860f72b4e1c8beece360409fdd6b0b88dfb29417128247e14fd0c93f636059af0a668aadb77ffd78d311722fe86dc4d50f7924974d15d409e51f3266895586cb773a95abb19fec022c35aaf1a15fb248ab03c5fee7292b6efc43f50aa9f1bdbcce901d6a1fdb960091dbd5ed33ce2e013bc97a622e0af9e2274e2d35f7a7edf5d3504e994ac466e6c05b54963454c3816326a73b7538d991573ee1648c9cb84b1b59a351c671e08c3f5cbb98c9feb62fb3d3e29abffe7fcb8a2c27fd8316c907a2d3588679e80d59e7771dcc9aa1cb38e4ec6ba06b72255a750793d18da4e16bf12f38f425630ec11ff33d52fd30be143bbe795de920cbf0d0764ac25c35c211e79244ef846f64abfec2f1e9d26d798bca6726f4bd89ad97390dcf61c6fa0fe334e9d6b518273812a97b0332a3f8ed9e09e74010111829a5fa99a27c212793f18cc749809c8d091f7902078f46754cfffe4274db100d1a5593e9a7c3b304f9a5522193cbe1f199537ba2b3ea0229009a0c2dc3ab8daf1400000000000000000bd8f80300000000f0543b0ed18a378b59cb7cab73c3f9615c3e51869ec61b551b4f419a8d6d55da404b80eafa701e5e6c8fb68fa6a72aaaa2d6b8a856fb3570a80533966c1920c2ec82ebe76d5fde7ce0c0a4ef3a2d9e722bee12a10cdf774f24c3375ea776262a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004b399f600f7a36e83e4bf3f5d14637f9f42fbccb4fc28b40b9a298964ea950bfc2babfde36adaf9b47add9be6ea932bd01233f63d29d1ebf373d15376a385ef638bcf382eabd50ed872c659447a6d12f1808cf32986be62686bc3006cf5fb1789961a3c157ba25be02dfa7e886bf68a96aae2d40fb7018141c1fbd66bbc824bc020575de58cdb15f6b0d4c7d18301b0f363936740db405153a2dedbff4bef101c4021d6686b2848419017f1baef950574335f893f48923350c9509f2c9313cd4c8940a26415c8eb38f34e29264252a1b56eb96996079fa1e0594efbf1f5b29b6763c7c21bb9f6d68fcfdb78447cdee785fc1e901673da5318b31a02f2e9d02193e01cd032f8992ac20809e45fc3d2102a170b7b62e1c9a646fb907d7ae6583b02d8101ef02064511eb7c4502533e51185a61e8e28776f5fd4fc0828d53a5a6ec6d36c7c14b030d8b9ce7d13088f053f9742a299ccb7085d1e153bedc2d029bb18c19cc7c8e5b0319a78e90039ec1a443db987d9cb2491f0aa5649f403996f41685a5a88ff3c7ff031e39fc968346ee68f34e9246493b3dd001e33485501c23dde16ef4ba239535195bab95beb1f972fde6689b5cb0c43c0e896128b3282a4c0a0e56ee0a733a8e48be596b6801a9bac3dab41399996017e658a06a90247b0e01a1246bdd421e36ecef69b501aac24c76c7cdcf77a5ed6bdde93f46d4f37d7f85d117ce03115a43c8ac16f62c093b6ac797b2e416ba5459561892369b62bdec5e6181b813c4a513fd056b0988182a6055f18f2f41fb10b3b3dec7790cf5d9407fb527786407ea182bc7634ea133b31b3278f8f39674f4841560a21017c8dd20f9a955c1baa9e6bd2532652410c30b7056043cb97d53a2889c44e74e1e9fa28fe00cfdb724cfc280865f18087623fd4916e7772bb4c3e9dd5bdaeecaa424511d9863d7ccbc5665c27975a67a4e32a38b3a4b4f794f34616ef7c99b50990929ac1bfe83288b39c5aea6b02328e217e6c1f0988e9cfbf354a9b2cfdc8e27cf0ed6ef3e489dfb07de66869ea2bc7706346418f4882f53d3a5b87c5c88e73fb09e2b776d44d84fba165620633b67d7c53c3f6929a11b3e590280f0c5b499360bd5cc95bd5c991586be10482efb14e518bf6654c183bc5b2a3955d24024131bc001bb63774c391578488bbfbf91795dbd67c1273d61442e380e536e11b82ad04fb0d39f821a7e7d2b5c5a3089544c448177b21780299a0da8ce188ffe95acc3ae332b07edb63bafa1a931920edf73c3131133f9683e111777b4ef19ef6b1b50df742a2fccb09c631b9097d1f518cdb78e299354feecdae71442c01d020c00b2a6979bd7c031badd90a8710aa4912bac081819ec8098d185592a77950644db0d170a3ad5fc74d0e35c42d881422b02a724578c547599259395ddb6767e6f2ea29e2df1fe57c5fbce458bbe5850ddc27ec33cae574d3cbd8bcaa18ea23b7f12c2a2a28ddd04a6b46b31c484e87e5aacd1d0b8ca8460159d3a5c76dff3bc05924ff9f3e48abaeb2a9f3b98711b0c47cad069897576f6464a5dc9868e4cfe92e51d275c847c4abcffc6b9bf2de8327f3b2f0b5fc9cfb66d40835fb4403ab2604a9b1f3158e19c8e9eb72cbd9d4dbf7e05cd7aeee48e03f4d1a5fb736b5bd45d469ca918c0192a2adf34ff328c82cef96332b9311f2a1c45edd24df93a5da0c35f1409265a9a224e0360d97bfa07868e6ee3b159cb9d829b8f98e5717c92cc7c0fb16de2b99221664797724bb3cd7bdeb674dceefb978e3825986e950d805eb0c92bfe8898b4192967ac728a3f8028fb0fa9e4d87babf48172d536bc8946ca29e79d06e71810193c1a0e367578f925bf07ccb54e63905521e3ec38e7ca71fe32f53d6e0a15774c331ee799357d5bae9501fe6baf3321c8761ea2d397d70b7fd498afd69684c0f82ed71ea047d065f3795966033f274dab1fa00adeb478d4c47d6036d8ef82c6c625fbf7791a57b6a340566eede2366a3fbf8d85e33248bffd6251f3c2584f714676bee7456f0ce558a073dc7952bce9c9403cfa0ff81ddab9ad989ed9c0ed5779d4006b66d214ef708cf47de9f0b34ffaec3ab9bc4f7371d839aa7204cbdebd1802b80aee71db38b72f13051ff954de122a406bca28ecd97ad2a7511da52992009769a2e801b3c5c5262d7cb18e4f9e1786704905548b0ceee18955f2ac2583d8ccda391ce8d59f53e9dc9620b865393211593028b4e3e4af39dbff7fedb02e42b2ef48a87713405909fdbfec597a5f545273a38da06d6545619aeabd2303cf065fe4f4e13c7ddb6a4fd563cada3d9c7a0c6f81f30db8c29dbcdafd7e8d2834fa3ee4a14aaa79fb6054e65a368a9ea780763faa52cf7ad9a4249439e0b2bf3ed1bd7d701948d3fc99f67ad52004f9630c72406924cef9271802", "65006563", 1, -1138087830, "0dfdd17d9153ebd22e8142ea8baf4fb86a30de395c335032865ad81d36c0347b"], - ["c3cf14eb04668efab16b4575c7745340009a2d72c9a724b69a959fefd8d6d3c9e1f2e5928e02000000086552656a0052656a68783a111ce036b399b6111b1ff8f1270b3944826a1efa4639edeab73f8af1e24f3438d80000000007656aac53ac6363ffffffff149e779af191ea7928be6dd8a37b6f4ac42e5c10488ffb3ef4147bb3d48226fc02000000066a6563ac5263ffffffffbe78852b579c2d15a20c3c2c467e9c78757c9103cbb3f5382f4e298efa2094cc03000000030053acffffffff0144aa0b0200000000066a6aac5165ab00000000", "", 2, 1379973953, "387e127df56d79965bdbcefbdcc16532159c46f2f0496f97e275dc11d08506cc"], - ["32c7454701d837c1a6c63e0ad8feef52254baf18567720724baca6117cae2ab7fe51e2ca890000000003536551ffffffff02d4ca900200000000056563ab6aabcb0d75010000000007ab00ac5363ab51a74dddba010000000000000000394a2a0400000000f434862b65ff451ec5ebd2df1c1fab15115af597806fe2d0fa2f5fc1c0cbf2edb1fd0ee00396db936a9d14e097127fc9177e1e02b2aef3a08e79b3efd0afd9ba04e4a26cb7296b96b9eeb81e3897882f351be120873313733dd512b309b5a9f10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073ccf4e7f61c0cfcaaff4c6c01cbfe229a72b2fe594a274de0e1b681ae44fe0d9bd49f1e23c6a9ca38c216b7258b0f72920ec9413ff0b54c0324cc95d023f0052ff6b30f37fa2fa4743dcf08081f24e91f432d0e1d2497b32a18e724f3026b071e08a847f8c2ff8a96fb414462c3081eca0304e9aa78bf751c0a853025026313032484a229dd2d072e8405d4565920785005c3dd9676addba869d18a420bb8c243030db83871b9820ed44da9385fe65acd3e2a22c0f169e0b7e752a814b4cbca78d60a1965689df7ecdf5ce1d131d2ab11bc2579e68c8df9efad7436b3b88fff42192c116893333d6143c5d31f123445b756d9b0a87eb5b8e3b52a348c03ec8d5d9bdd0316aeaf60f49c357a0aa92d184c337947f41f05a3b5c8ea7de28dd816dacaec260317702dd31e518b99da81d9be364d55b4f8b8ea91a7fc06c428714b0b302056db0327a72b5fccc760214866738b03d63f889b0efe7099f0d7ca39b8fee69cfa901c0210c61cfa4e295a2f429ad08c7eb4b86964080e9bec2366e8df334c2dad225dc3031bb6c582ee8c7307b47bf59fc472ee1068bcea63fd87fb36500faaecdfd3615fb3844656aeee665dd11d833663ff4c70ba0c9496f271a2e7a71a1213983e18eaf95dec93d09c3915baca3092118151a1d22bcfd3675c2e8d561aaf3a019ddeb60ae55d2126f29f04587dbd0d6490dd300191cf17b4875d1bc2d73e2e4345c710c49cb16408d5935cc92c92002f6d3a14363727e140a86e6f2afc1ad9b81e354b2ac4c6f6b96d69d0a0cabade730e1cbb3371162d2cf750c404edcf7e3581acf9929c8a61327e2465997bdf88f5af34d6f1d403427c18e05764fef335faac04896502999b5da8466e3a88e659733ac38919381ab05b03854b24e7b7089a459cff4856f4b9d2a9d59fd07131f3c2b49c65f0b9555b33afc7e2898556f7fbba8a72736ed8494ccff5a3695b2f68dec7fb5e0abc7886464b20f54a3884bb99ded51c16031fcbf40a92eb2f8c6595b941837ff1a36dd672dadb5745f872f56c27ece6abe53f2520385a9220cb0fef89e995c48ada29be1cb01e64dab8d05d0c1fda028073fc031205e391324b020bb032723ef19aa4a3620401bbc447b6b93d19cabf566fb53e41b4880c0964a668dba10cb2902564a629a91099a20896754273465c879c1c9f3669069f006401088de690891f970ff1085edc3cecae41eafd154f237c1749a164e7cbacf4b44642697583a87978c186d73cbbc351915f58ab63254daca88932c0bd66835005e6cadda0f8907051e64ee77c7856c42e73e6fd9861d6a2e07342c22992bdace74669f75f22cc0393f00d947f304033034817a7dddd6d8c326fe0bfc853c9dcf229d93b64f856eaf54c694a5f07743a90b580ea35b8272bd01a8058dbff97646428abddeb0ab1061309bbded1c3a95a2e021fa1dc2cf926c3d414cc64c2a652d69936727ec46ce8131d83c34e8223fb46ef0eeae4e4f8676cb7508c2dedc9d8d1fd286a9b124c81a4311eb890cc7ed84f7a5de5fd6c5625b86adc556e4c077991c9a8c868d9e003b3c45e0531f9819455b93ae5b55cbebc7fe4204e1e5483c921fb15ca2b33e0700db4f9b4702f347b539bb4144a89353a9dbbe290e5562ca001af505e6393d24b5f3deb5c257af3179591d078ba9cd474a5ffabd5daff7946926ede528fa6b1ff38e72e8b812e370976b00ae85ae3584274dca57970b56482f3e30998d62e2af96aa4f0b3562b0b66df6293dfa9e16150582f97e534fe9f9e5ba4721bd36a52918219aa2627387827594cf50423acdb12dcf090cc69d2f686953eda253683ef5d38d9660739227a22bc3e1c2fa223d192557be4b56cd1075369cd40817d1389a28e12e7423ea75fc5d2466422690454d592cd931ec29bb90368348e0072e92d28de2f0f8251bb4582424a0a921727e2e966e45410b955b91a2a4ce25185c2c224568e45370228a3daafdbc11848e6dd55fc82b69282af68e375a5f84eb92b4f97b5d6a567653079f9e29679cf862b5ec3152363fd41a513dda25075def85f623b1f78121f074967b72ee32b325904d53c3dd998bf64dec2f5fc2a3d4bb0a23a65c9b0eb93106c57f05c4dc53af52bb7d37aa2a9d96eb8a90fba4932d56daefcfc3ca127087586d6a15c0cb07031cd5c9ec6e7eef24869fb1c839728565603236d5a00c7426f3fbe14c354333629ce3b597a0d29c2c26a3015c787020c5532deff20fae05e02d839e946a63c23d2daa039d7ee6f587c822775e0ab78f9928f70b71583007b1026aba5a53524413bae6be80a6d2cfc96b0870b0406b6cbd46805482770368063c8bcabb4348f3012ef2efd83cebc8b300bb1b64125c99d69755a43273f1376e7e6c60a096f7be23f065b98e8a3fcaa0e2e4a3cf5d70b1dc3e2abeb0e", "636552ac655153", 0, -1236282920, "1cf4363e83d55e79b5e658cdfbbbfdce529a2bf93b19f95c3b4d2c7f4798da10"], - ["2a58d205022ccd0bfef60e16566246832551140f251a2c5e2c949611977c03d37f2721adf90000000009ac6352ab65ac6553514c074bfd8af262f6385f56231e9d00f14f1758db062d0b2dbcb46f31b1e6bfa90ef36af2010000000700ac6aab636a6a1ad6370c0116b4bf0100000000002ddc08cf020000000000000000bc5d3d040000000037db541e54fa4df50ff294027fb9359706839ef98dbca16f407228d609cd07f276cb333b7c41202695de61f9f1bba46ff1996795d3a98a7398b4dd5de6641fdad982ad68a5bcf6b2b22cb0566d25c6dba0b0f8848a5913e6b7feda2957ee450f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e12f6dc377b17bd29a34aaceb0ef695becd9b7d65779658b0f19e7a2e87a8590aaa7906ad03af5bc415648cf0aa71724982ee6d3d7a155887c761bbf03f58de8893cb3833b3955b10532c54480bbefa844e21fecb5d81d1890ee950ff5b920e92855beb609f39421f84943125b7f23ba5af7956fdfa49e4e0da8c78d0eafa2b030149820e7e51a55adc1b82c7ff54b66e19616a67b5e1536ad84b5eaae8ba9711030dbc89d79dd1c817e0ab85f0ecb5cb7288e4d33a4a27b3b1b0d3eb355eb2464a0a2e00da61200911e11af147774beb757f6955f3951c074b96595719c53463cbd827c9f0937174fae935445fb538309b1cf232f9d92b3d37d9dfd3c39356be4b8d031cbd6d82844795af9d2be68546a1ac4c1f5a12750d27de3f2502c530520935a602225a1b9f074440b12207f35f7e89402e06441bc6e48e00f2878a5e6e99390693031537028fa08e10f02436fbbb7f0230ac265f04a7ff8e6c61f4fef1b9b5dd17ec021b6d9c635fc289fd8dd437fba8e1e99ae594c996b6cd3601eceb72e0adb61710022eccf05ec66e7cc81f6d40100df805cecc2768cfb35d179bbf8043caf254b429ab278d5d51fc2cd68bb134a5bf8c4794c8e8c0362c2c0beaa7d9e3e6ceb7cf0c6474ed7843b11eaac34569108e80a18bb7c1a85a31febe630f40b4d0c0692678472c0b49420adbd1d8254086ba864efbe88a7a55d0263fc7c2778a22ab914a5e974e282fc038850d5d805d6350748e6846df44d717e2d2d6e04920568e460058ead6e78f8ffc0cb7e68dfaef2653416cdfe2629d1ee63636bdf599ba2eb22a6962e71411d5f17ab3bc326b7dca72e74e3e8d4682bd220648562fbd002e923c0b29db569386e106f1486d8a71fbbc860bfda9bad5518f97dd40d54eab7599e1e1adc10aa14ae43ac11537ec866b2b0295aa8e9182421da1f603786ec9670aa9b08b1f741d8b5affb23fce2dbb5da25b118345a39e1b8bbca75fc2ee7d06e4bc5380d0aa7f0c8cb4665f74ed376c6dca841c06fb8792f916629c67d56e45ef2b428a1c61a8fadafa7ae4884cc40c6f0de4d59b630c53632217ead6fba39cf3712cba38a0062e54b404dea8c5587368b52b4a3a51297434429c09870a08c204419bb03daddb1e84bb4f4131f0bde10608ee3f7792e6e7bdcac6acb1bb533736e1bf87c80e9460f07074ef1a8b018f4e95f9b110527ebfc0c8e761d158cac83c92e08cbf677d5d094e9ad8ecc0f460d7fa6a5cae8ba6c9866c2d2bc2513a792a991efe75d1f06dd05c106d53d6c02f96fe8c49c129ecd26ffeb91b6ebf2065acd9ba7e2c9ad822d6246f3b383354efaa89c90c921a00881d8acffb61a387a85067fa2fde090530f1cec6159196a27109da8e1b0aa7f6ffa75f3b2bbf1b927449e0f67b34f8fae6b2a560ba396c673ea43a9dbf78f5d7085b23e92d8b69c73cf0f77abd98336f1a9954dac238d34e5ce9373e33201a19739c32f41e0f53015321857e7477ad3afef2aba2f84b6bc9cf3329f6de11e67fb21411f9512b776e5dc4b583e712825404ab23d1173477099d18c117603d9d1d6b27288aba26aedb31f5695c50244d85e95dd5e3d398737309184b7200383bf761cb2282f6257dfa5422f425d79ebbeff73606b9de82224c3235b19487b75cc5da3a9d23bf8294b9320da1d2032c9a6e58e1a86d1a170bf02211e27c306718832145efc474feae34deae62da5f0eac5bf9534da0515208b60d6759d6820e1646408f0baeae18f502dae7e08f1d6e17e1ddc03c4f84192c3cf2bb4d8d8f43f336066510693edbcf4573a83f3b0f09dbed7a68c896b246a6ca118dd32459ce55a15020f909dc0f417172487a7712eaac82aba6d8bf72ad85f0e201b6ce79286ef98fedb67b310598b31ef0bb76b4b66e8b5d7dfaf0155c219aebae498dcad7d059c2acce77213329f1fc8d913fec474ea6bacbb6e2243cbdcc78b8c35492a3aa7f12c01edc810e98af0374f330d08148f0d749821160854dfa55a249049196dd3a25e22a552fbdd3a20c20b6471f3bf89c426880a50cda88a567456e19597415c873552f84caa9b4467ca6902e281255337b6944f6dc47d297ddf439abae203937bd45667b082de32c0add1577eb8e96a6db8758b12fdc0c05b0d3f0367adbeb893806516688eed3d439222fe7d9eaacaa84c279e8401a37feabcfd2f312607329cf50ea36e8c5af060f68bec415b65544caa378e29f55f9d5031f0f73c863d608d44f396aee4ed9b11fcfd8d10d790afbf55da03135ff63b65e8f3d2d757200000000000000004e32cd0400000000c391545e7e9a44e2c6f59aaf88b956fca4513b4343ee16f5ad056604fb5000cefb228edaedb153a10c522d65e446e14771b0a9ef4545bbd5b2e8e8c7ab6ee5f4b97d6ebf239d71a3f6f6d1bd16629d424bfda2253c71540e7e0afdbb4f20467200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c33b2117ee1bbc87fcadf898ea510ddff4f63351ee78857fae8df175cd96bc8836c6175578e482e4934c656848b882b90a1cd86fd6452bb546e56481bdf2527ea7aee6debbe0861a21f27e1384c83d0da8b81a8aaea7fcd040566d2f8b5d3795e386e5410913147461d877b6ef68e605befaa9a2dcbae2664dd8901f224bdce6022c8d497e6f3864f86c3b38a39be343c5dbdaa5f85fb089ebaf08b2b3bca866b302281434982b1be726fcc689e549ebf3665022092db6f7e921b54df82c8f3d2b1f0b111b78b0a3c824a82ecf8e7e82e2c8a11da231cbd341de5f2a5f331f6923c0d000c9b684bc72d4aedc0e3fd5b7e19aff01427cfc002658797ea2922bc335c9ca031920bbe0092361e790cd303cadf2306bdfcb66b8f1c58d33907d5808f27563460329867b41dc304d528d6e6e45c9adcaebaac7405be5bb4ee33181d4046bacf0eb0303dfddb43b48db9fc9da56386419a08e8f47bfb7588f188d536671942104108103197008c83146e1a84da8935ee5df0ce105f8c8b43009a1600aa48decf24c2a410319e84d6dcdd91be57f97ee40d07d359a63bad1179593927876ce7176db6ebc1bb258db352869ecf9c41ebf589be2ca2c130d14d66b33f1b6e1ce39b5db2d7d37b907be600ffbd1b0ee336cc823593dc6640e1465b5cd2ed962d5041755e4c300a5d9f2d0f433d6f08dfa7ffa959c12c8358adabf4d2df16299a564f8f33bba6b2b5884be7e03dabc7d8fda0dec17f95ba208e8e4ef9455e5b58f4c4e02fceac0327581ebd8cc1e2efa639f2178924dd3983d03b255beb82641af32bfde8c558f299ee0bdd15af49e887b9bcaa754345e683098efa54ed11d6e08606b4a41056dff329c7849c079fc49db8a1c3b63054a5efe0b3699119c26510a92fd2e7be8ec7a8f2cb1221c2228c62bb4cb98cc9997f95ab551dd05d016ecf280db5882a3a587888da4303587dc0ced74a91afe1b80d401686092a26f4ea0ba39d05b9668f1db9df20f2d345e85d4490492efe11bb874bcbfbf7c194b9aed4635aa24d548e763a57febab6631d525403129354fd5f0793beda34af5d50a4c0fe3736eaadaca3fade8e0c773cd39d6cb7c78eef625f6338420c47ddd413c05cb57b44328ed7619ca30ce55c2527173a9dea8f9836cbba691c956b40126a2249952ad42724c24597e48ec6d0cbe785381f74bdaa403da97b0d0373d9c850c38262324238871bf5c673e3b43f5a42724e98cd2245814d3bf9c0fe595ccb7fa5bdf7cd811267d2120e9e890c971bc7c92f69bd901164c641bf62a34a7bce3cc5406e640f1090503efd11e223fbe44ebbffb5bfa5c9a66f39d618e9ef3eebeab35a3266418d1cb9835cc52038f069a48f9f8c89ce46554439782321b4b7dc5bc89e98c3bdb81220f799fbeea41676647f06d8732d22adc0156396b3c4fdc37fe77ad1c5be2ece40a619b705d513e78eeb0b74ee905b30d8152758d7a00153c4de1170da68f3b26707170ab8062c917e8191a42929a19a8b266f4099adcd15834814ade27918c989f8882b9b1d14c694805ea92376ff54c0d334a88edae2943cefa97b6ad185ffcfc07691b1136dc278a9edbb4d07ee2ac51ed4163a264a6ac0d3fd041b85becabde95618b0fb5d40ad38e60da1746e103c8f736c8315096ae6d11230196152f773d1d131804992dc8c42537360c505869a6bfd4e7cf005e70abb7ca10605fa1a2ee481813f7b47e9607c47f29ddd22627fc051e0ca0c15d6e11bf63f61d52e5a9cb43d7d246206f8be0ca03ff82b6d1c79cf85a7d808d532dbe91ba0c5ddb36296c191cf5023c47de93235831ff190459d61dd93c435eb5e7e5f4011e84a64d8c78412970a281478752c4eb094ebb076d6d8ee415756c41f448d2a2e119ae7a746e97d7355fe772a84738ec667dd17cf4519ef99741b5a4b46d019cf4a2de126d9866f2d13a235660efc265ee40dff14e111e43798ceb4117d5bd49f8ef2864a2970446ede1829f4421b4d95a271115e77fff567b760bd6712e74b46387ab5249f591c617e729b4615d8d61b650efc48e186e98b110a5da0bac5d2cef830b91ca41ac25c827f85252619e251e2823308fde296c31ab7a036f89087a6880a6a1339772747f781af23c74721b4fc245f203bd47cd764aec4395427debd7d9fa8545939aef6d912b330dfbd6ee2975774d16364cc0a1e94183b280cd9bf39d04728aa6523a1805448514dc11e927de5c53383bf0f9afced39102aeb50d35661817c55b4f746deb9d5927e3268bd288d9fb497fede4cafe5919eb5ef3b69952ba359369602c8151e78b68031f752ab05a265188271005843e9759b666de37e571d0d9c5937e31a02f6ff174c5bccee10e7c10b8c4482d26899aaf8757dbdfe72583940f858730bfbdc99f39b446ba4f3e72bfcf4c0c", "52006553655300ac", 0, 809922732, "35420a3c2aea4dcbd8b85fd458fac620a1d2fefc956bec8ccf613750ad155545"], - ["985643d304fd3f7b5148143b11e38306cb3afe70b71b420dbdad8ef92214c67cbf18ff8bb1010000000765ab65516a5200ffffffff0d82a105f6fdc3ae9a6e4846563e5e956eed60b6c27ca6230ca0222a4b8c631d0300000000ffffffffcc46eddbf01c71a777436c1eaa281f7d2c4c7f2c7e5fff5b01e3f5f9bbf3dc5c030000000663ac655200abe9af7e1550734e46ca4e69dc3b3fd482a13e8b32bd009244a92345138bbda17c18946ba00000000005ac53635351ffffffff03063481010000000002ac53ccd7a10400000000090063ab636a6500650002d5b703000000000400ac63ab00000000", "6563", 3, -369456481, "5a322b00c2ccd5e9f8586be959731bdfcb2d57045ec30b3e919ccac2f65c22d1"], - ["20be07d40265da8d5c54f55a7bea15a675fed58a9dcb2bbdc43778c37ceaa64c6bf4e0e0f8000000000865536a51ab5265acffffffff5c45c5ed5adf2cc99e4bf9d3af0ed2ac9e589e175c165c056ec051fc06ef20c203000000026500ffffffff02b92eca000000000005acac6a006a91667d03000000000400636a6581e02dae", "6352ac", 0, -1051900195, "724c4f8f12074a37c786776e4acf21eca4e9af89145268421c69934cee759be0"], - ["e9995ee90148e2a5f994c608a99fad2d3c7f025c355dcbfb13abee7046cd22f4e04433e1e10300000005536a63ab51ffffffff018775a6020000000003ac526a00000000", "65636a5163", 0, -2014976053, "8c986ba7d59f348ddfd0777587a409b09953e0e8eb57a83266c129b52da1603e"], - ["a01b61b202e199a6303e713d52d83ed7e411dea967b5816f87ae860a021e06ef72f1d3ef740300000005005300ab635b1a4311d651dd2abaea78cd7c1e9373d385e150b5ed655a92b7b26cc9838b2c8867a9600000000006000051ac53acffffffff03c224c20100000000006696b20100000000096500acac53526a530070230c00000000000352ac5176c8881e", "5352ac65", 0, -949295909, "dc920ccfd882a8f18cfe4388ee7d4b01938fafc468825f51d7c68ba1e06d71de"], - ["5f2ab240014a46f9c266c131fec2eb5baf6105c9f0b2a2d30be9446f4e274108c14cb3b788010000000953656551ab53acac51ffffffff043aaf29010000000004ac005165c5151b020000000008ac00636aac65ac52cd198f04000000000253529bab8d00000000000853ab53ab655151520000000003f0b9d103000000000000000000000000076b4d8692631b9f23466ffbeccb5cee7fb6da895960fa7d80fbc2bf203001fad1eba6aa79a0c878bc91144a0d51152655475ed417de7db7c569b452d6c5a5f2c05dbd2fa0ff5251e0391a153599035854e376acd65b12f4cd5ee2cf789a0e49000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c5dac04033fdc341b52326fe52edca136204bd075c95e8ab44ccf33f502a590d3f5c56bbdc27b0c76428e5c5ceade78388a43749abdce9f2402252b554a05fe3d991a2eddbc0d9b0ea615541a612312c289e0ea296e582b0eb244ba83f9b9ce5dbb239a960eb3e75e237f459130c6373285e85227d8a8d1e5c08e6d0170ac8802220063ff18428ee19e55ed7c216424ee13099d0109edabe7c2779aa8390a5fdf02091119539d35ac8444e2dcb0a9e0722416f9bea1b538ec94e9ec226489fc79f60b039f08c6b2a2ea20c1cb15e51909c67cf68c6b6df1e20f157c068b5ad4db944402dbb280361d5be624fe0c11f615fb98b017986dd19919b66b559edafa6149a40315fc9b700c51ad5547ef5e3e4079f7cdc11578b6ba0f29c36f626a5313042d930202c7a1aff43a00f5621da4814399989e47cbb62672e1e8c89e915f7983ec893003066795da7c3714f2ac8d2be9d0c858407d7d077160826a90753ca1c29e39767f0311304e038089c589e13c66d73508ac49e87fa202136075970a05985ba25503c4032a005254957f7c59aaebd9560f5a18e0e169181f20c9b3f7d5fba0998e687f11f00ebf573e083b436d4c96ce25d0c0a0309f3d57ae9770bdc0e911f948040a79d919d7f9c19f136bdfa6196a1f06cc0c3357bbce41bc46ba2e4fbdad74d5f1c8886ba09fd7fb3d331ce57c2ada02aaa1310e63194f38fa6a2cceab990f2955ce45f4c822bcfffedabb5b6413d0c6c84507a61c0dd1c759acb50784a39ac1f38fe0e638d73c12005f129e63c8e78512d1e5ed3c4dddab07984c16463d205d359b50611d75b1b30921a7d0358d925cb2be25e2d1c1d2a1f7fa8143527a6458a1ca33dd77c05c1f4f24b3679c4761137719fe36cfdcb103dbe192b4a4e269b08b2b6b0d88c336c68c7241318be80307d57ca4c4f7cfeeb540931083eb59925eaad52d4c2aab85039ee8d53e751487007deb00bceabebb5539a4c83d4aa9c5eb4a0ca2c81decfda933d8c265dd993ea2e4b7449fd55b820ae84980fff6d73002993386016192ec321db34cd1ef4931c7be085069170e68563721b7900b6cb8c1e68d1c162f8ba627e73c151ea88bb5a5ebafba8b5c3e1f9c0719ddfa55f602779df78bd15b6b56453c0fff6fd9a603e479f3817b637102c4490f6a77732a3f8c76ebbe90403bb25913c813ebea65178e55dc842a8bfaca0143f29a7fdcc233b20899a3112ebcc849c299ce6045d9a835b68069294f5e79457eccd4b4067f59d4debba7824f265133a8953670972603fb3e58dd0e88a4f5dc5d05be39820203551c25ca2c2f0ac4be60ba8794f86d13b83456f1c794e2ccd1f03dc005e37f6f3244231a11c835664661aef56c215672046646e9070859ce9d7f0234a6278f0dbe33c68704b20b742fffff975601f2f32713b1775ea1f766ebe7af6ba98446cbe5aa589c56a74c159467fc2a768f14d6e509edcd1a427f0923251495560fa00197877a8d78a47cbe711837ed6e2eee937965857cbf9b0999c9c6f8fcd3d5f892284c9125bcc80aeb91b5ef2fadfa3345e16dc9001b729ba6dbbc795a6d67f4a6e3baa92ed44a4fc9e474646629ef37cf0006d976262596572a58adc22d1386738b930234d830951005127db6b9a99697852b5674c82c0eb7427e923ff63ef6a558e4e3849f18c5130d25076bd17461abfa10a824def5a34cb3418296b01e5cb32d42fa4bf97f684b60ce9be74b4a30fcd377b71158730c083b094e4e2b5141f76dd21fb94b33359bf3f651f81279116d76006c3f0afd46dbe4cb0692624287ed8457b613d00e7c6696630a985f4df9d47a79dc22754aebdf46da8a63a21d93d35ed56aca76b3e95faf077982d10076b72ed46f8aba30de93bd42726bf0b1ae801ebf224b062ade3ca617f033eb062af41fece7a77ea6870a3fe8ee67eb174e2ffc5e8d56226d754821764eab45126e42cb118f8651ccf3e006f10b74c08993028148cc0c14e5bfe1e2144c1ad0b1a0f2038724adb45742cf28b36f336758c5b8430e206ba18de9c303319a78aee477ad5916918e43b75be626b8b62c665602be16d928e0b4c5b05f5c5783155f730b32c27cadc684e61ef4723621544dfc488802be396452bb9bfe1941baca8a71ed94fc85846ad3e60465f5bff550de6b8282cff1ba247e2e90a64d25d082d7ec87db6a73a76a7b5031e2e2d515c31d22739b27a521af0230f68bbf5ffc8ed07a95282436bbaa92c4792b2e4b1c3d08d74ac35a7325957300dcd5f5b3758e662f085cedb87c5f470000000000000000b4c2000000000000ec93c8c10a9a394a862445b544e257acbe3efbebd08747a00e96f99449974e296b6ef8c9ba349f8a7a24904dce2f34dad01360c0edc8123d8e7860cf21ddc3c64a7a6c14e53daddb55106ef330032e526d1260429ff2410be1c41475b82dbf1800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034dc4cebcfb3d80b241491307a4d4048d1ea9d216d0aa42c79706f21caf1a9448811874bfc0ec151d57c47a9423740786c520545512fcbd19b1b8971e4fe43e69ea196ce059cc6b4930de85717a22559a9de51ccb0827706b5c395bda3d1e35ee8c1f32a0344918cd847eaf1f69f2e5f5b899d425832ace74d3931c0db9b80d0229d132de73304a29ba1798b6f0fef80a42ece9875b2d64baf3d96e4339552be003088dc053a05bfd9f3eb380bc5d89b70a2667b5f841c27996bb036d48a0b787060b0adce2d984d0e7915d6cd3e9d3b4459029abe618abfe325a8102763cb9029b7c1ae6dc047c3c91488db32d81ea5fb26af415493e1ac96fd050f70ca6cfc7b38103212e1d5088b09c7c9a47338781a737da576ba5784126908e3860c42d1f7d52a90204d40534f1191c58f6c2e553d3a1ccd5e1caf33084db1fbddeb8d967f2204b560310dd2e6df6c1aefa8c5c8cf38380438b17bb2f0580881cc6cb584dbb097338450327526811e6fd0bf6ceea5f09256bc1effd53da8eaffd072a1850ba8ce2fedeec0225aa5061df874d16f589ff31534892d1eb4484820b9f500e6ca89c5338e03814fdea9f8167d30ac5f21cb5c61f2422bf10313fecc8719eaafb81c221c7e1a2c9c99ea8e3bae44370dc6411e32ff0946879357b6bbc5b8c8d87b81197990e1c8cc7f3cbb22056e2ddec2ba6aebed61d9e9fbca27be6b7b8a34c07fd751299bb64f3e9a4a9f503b096cd8c323cf3b2150af1400d2225f9724c55cdcabb8f4c46eb17814795b070916567f94e1dc5e42f6fc0c0e2075b4ea248f144d8e3f625ee95e45334f01e9365a8949529cc670bae6703c94a6eef3ea5dfa9a950de190d970acfab90726a2b3510436e4c1ac4a701e9ddeea5804db00d481a71ed0ad284baca1f533f63550ca88fd9818500258f62f0b7377022e1965c04aaadd7ecc46489e9e369e6b07604bb14525967297835b944b7cd1c1eb7726ec4f14c6501a1472aca4972a970b65cf80d70b608d3930940152ca233d2453413cd9207c480ab5ee848cdb299354fecaeb16e548c1597727e34224b2a73b4c5e63f714e64b4a6d053731d9574bb1bc2b24d8e12d9a385a4c7358e3cc0230dbcf133aae5c578c40335d4e4ea25a5ab33365edb8702ae7516081b3ebdfc260c7bc29695a5be0cc05fcb3dc749cc2b3bcb5d07ad9d49eeec852cd52c029a513b65730d20f63eef18e0b9a7838512c15955b40a29f20e57c5375846abf15e5b0b78060de5ee03347301b0a6cabbfda63120ec0ec9c76ec11a9ea9cc653230ce9abb35d93ce3714bef5b0fd5595e17a9a7a1e3f7445014070555a930bdcf298810714db6f7897f4dc089061208f8fd1f86de0fa1e0cb9845e8dddb2e79e42f9aa4ca0bfe217758d97b7f026c648cb4675f029b0e7286b7a0bb873dff0439bb4e3a9fd28162ab6d2aee43eb08df39a6a4b38feac42c8ddbb7dad5efe12273b1bb88ecf03cec56319b3430da26d0d83e71dbd61666e9b90e22684800ef865d4285f570d5db216eb5c7fe9ccdb52e6ea2d179ce086da7fb772a15423b04fc6df56385654b6f7b26d3dc21c4c88efe5ad581ec6cf9021d90114235eaed8c9888aa5272ada85efed934d01775d4605d2d51f6040d4ccc608e545758b285cc68c106d2477c7b68d875408150d746c5dc7366b2b206ef8b81be992531a662179b916af6f58140fc6bfc5d5d14e6691b047944a2da3f3ca6b11d1a53cce315dd6a33d7ecea2a8d6eae2d101a252dcd140f64e6ef3df693ceae9c7adfb13af5eb7b9945e91b1273f4ba9dfd5721a6334af4b31fa4729c839c42bd5ced5eaa8c708d8d0d659839e184fca0dd8f4281ae598d8f8c1dd9da2f9ab9043a71bfb11c3d97f87828113129a6d43507d25fba8cf2ce354914655aca9165a18d574aee1e3872f6b604dbf89940fbde84152268cf150b8c95913b94b4f979f85b0aac8ec2294d6579dfcedd429171191cf189a27d37de48bb35f3f4fb395d90dbe75ab6be3e652967d5c60a0c125248a29e7cbd18efbcdf8a874a144501054cdf3bfd71bb16620eba7e56bc20e25e0884f5aa7fbc612e4b570f17ad24c4f0e16bea1ec7502acba19c7db9b548588ae4a0e67d8a76290c37c719d1d4b97c547d091160c0ab23f3a95db9dfe8dfcca5486b9b574f0a701b368b1cb8e3becf519187cc84014f67d8f25326082d8c0ceca6e48d18d87d685e0d4e4ddbf86a0fbffe1b1c965bb7f82cc49bc37c41fcfc945e312d548a624aa01e5558fd7817e7787af5e7105134c249010000000000000000a379fe04000000003cd42dfdbcbb84317bccda3a0111ed98eb96f3b8b3357af6bb4cd199f2390830d907a2ab4b969dc2c97e6514ebc59e7b9e8168731f397885a24e347b8c026ceab1c4dbfefbe0b9570c44485f147b74c7d4f5146807ef4a2072940af0cccac7210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087d53e2fb7575922c0dddb73d96b5ac6f8a3744700f6ca2fba2f037a42fd8a8de8628ff25d25c9a6c4ba6fd005c6444dd08b03f45f271d3de14fc924d9660437ebdfd742a972b7fee14ca5cc20b938a4ccebb5b65d30599e95e045553a369077a89fe1c9922af781ee79319e2669525fd10831fa9741cf2c78d22c36b05d28f3020789ed52d26b70218b1c1fd233d095f2e96544dd7774529a169a8327e9d8bc6d03124549075ac9118192901ad76a86eda668329cb31036bb751aa85fc266724cf30b1da73f18597cd96ea3734b7be0a47bb784d2f6ccd5912864c7bee025f04548f42962c51f064a8cfbf3eef4a94c1ea0b410132da71ab0eaf4632fb6e2932202790202642238103af65349232011ef1bb8ca7d615c25308351d7ff17c6a56139b9ee0200168992f6cf4a333c357a80662b9d1e92f7005248bd33f7110e435261b3dd76030f933b6120171d058fe73f02063afec502a2246326e3a5b96d2053d9d3c1aebe0229459a6c87f2f7a515f32f24c08f067eb53acb82299e75e97061246dc5931f490227b77faa8cb5991e399ca4983b77395ad377af1c535d58a91c72bfb2caa1cf24e81dd5afaecdd727300b9cdf102678feeb72fb22826fe74c2ba5738272a5bcf6da3b36d51f720fea702e3f787618b67ce3fd57ea3308c1b3a8980648acc3b8c9f4961e26dc53e2027c2ddb7260a832b306ce5547a798135df660b3fdcd4774d96b97c435af2005cb7b57632f01c05e6e5c83a89192baba5e87210d819efe5e5d9a6d1f2f86818b3c861ea8df8fe668ba938076df09767bcc02f727382f59131b0d28cc76ef9f1b2ec928820a70bba08d6abad05c17bb02a1cac4e53ca8397297f259e97c0b563dd0d74329db4b46a112130592f71cb53e3982a4afd6ab6a5f22d06a044d7297ab58f05d510ac446c7d68838ac71b2239b9dd8a1221801b5c6e09382c2d56e2ba6688f9c51eeb9c025a10ddd37ba4b75a96b668d73f982c1a772c287778cec1796bfd5f7935331a3b902c7d25ef683441e9699c2fe6ecf4f4b8053c3eec344fe92de3d0a17ffda2b5d4138c08e85f04d50859cb111efdd0cf7345c078f1acc169ad66b8150ff7264ac54ec6150ade992dadb7bdf5cde037edecbef952eb6da264d15a7e035781207e86f296b803dc124a8121812b8dc8cd5c44503d3d451ea241657a943d42726e42cf656d9d3d4565b2f714393128c000da662d0e3f9d172733a3560a00a4f5aa513384c047407c844a9319dc0f6f69de3d0b37222e0e36b754b5fd7b3bc71c4fad8c0895a445910bddde0a949d4769797b24b1b06862d8eaaaf1b7339f59f3617dec9f5dba8efe9a87ce883421a731e2b56500a762243557928087f4df0f9ffc49b964b5a8e040327ebe78074fd7d95fa5f5e03f2bc16681b0704ad7c019e1898a97d24d1d548cafae3fb28c6a4880001a73e7a07e1be2787b74226f96842110694c4973aba8c3052a160b674904655f646dce230e1a9a0fd6700a5e88f191aaa406f7f0bd8989fa984ac1e4a6ba7101405270e84eee07a9a034aa5a59d71ac8b406af478e9da4eed9b6913cf9264a4fae29afa221611118209dee641622ebfdbd6c68575cdbe560762a4a7fd96db910a25a9dc9c063c400eed5aa9283028f398ed7d09a0ed9e51350abc1a535ff598b0a8356cff87d0a738c821cbf46a2ca8d81421a01e1bcc97a3cba52b118391c59adb4298d60bb48bf06eb1c1e988ca679feeaecd0e74ee9670a41e89449994c7ea45a427b3b1735d641ecc22ff6268759f488ad97bbfd258ab3d36bf7b7fab3448b71b31bd4dcb39892b27462652c9dcfb3e4f2ebec00cfd3072706079f07e60eed857d1c2e4f11fda62244133a171139f15605853d3f5e269c9a496b667ce750fe48c48bc25eca9845a4329d7b1e914a897ca39336bd715dc9ecf714e0947ab0e4adbf9ec09e68ade53d668f6ce5fc6ce3ba54c8e6be6949551c31bb3f9ab7b0e2d9599ce772d2549f891a1ffa4696c1eceee420cea36ea58e9c5cd3462bc9566f6c4a62c5591e698c0fa2749e6c61cfdfe5072c7062b1a16798c454f2b132bbc464becdc5910a0f5f12f999aca68329912611851758d470a7614fd6a050f5053b3458d44f197458e3eb5e98620f8d94b9cf593560b921a3bdb3ce5e2640e19e42224de0ec2d7c7820804170c63c470df57e6e8e74f7775c4019131197c5fcff140ae1ca53de98522c6efe089a2b8847b72e2e3d7d3022cd26bb0c0d3b8e05ab55e89d12d75a1780974daae8a58fda3c38a68d623bd0e08fa02221dd66dbe9014adc93798b0bdce4e1420b70197e5317a70b2294c6c4a3c934b88fdd1037a0147e976f88ff2bb158553fa74fbcb6c2e3d582d15d5ab5720652a9695df97069b697eb9ce63fa49a7d232736918cfb6a9073ca8c104", "ac6352", 0, 990198618, "51c43fec7b1b86df20aa709eefbe288b262356d08665e7243c5525235e4a30c3"], - ["b068d6c904eb4388577d82bd380448bba2d15e912b1bb098487a56eaa4bc49a71cbd5c21780300000003ab6352471a76344d4e192cdc549309ef38aeec83d7395897fb8d1546f0eada72fa40abb6854e0c0000000005ac635100acffffffff53202ef478d919fc114adac3614099882689b055f346c61ef84ad8e4bc1442de000000000963636a53ac516aac51ee96579ccefe3b10dd3e687bb153de7557000681b01e93575c397fb052d26da6dbc7f79f03000000086500abac535265004495c76f0120a47c010000000009535100510065ac53633904d6f1", "5100006500510052", 1, 615824480, "6c893f0465c9f2e782494bbaea7cdeaf83ed6a40faf590e0e0285448b3453146"], - ["25c769d804e5b5fb2ab4352bb144582bcc1e158027e41369eda9cedbb59f7d979dab70b760000000000851ab52650000ab53ffffffffbd7fd3d989c5a9c9b69e1d7a968e41621f8ec374fdae031fe32c937589e780d600000000035163ac2bee71c8f8e363109b8462fbbb354ae753fa8ba9a138ea174caee5aa2cbab4b1d1b5020202000000086500536a536a63abffffffffe76b4dc755115a40ecc465714a3b848ca932f31d815fbb5a1ceb6f61591458f400000000046a6a6a53dde536cd01f8c641050000000003526351416c1c50", "65", 2, 605436556, "17c248b5e5d846d5ef1a34a0d877334e0d2c5b17ffcd214f22e6a2c1bf4a489b"] + ["af8fe92403914ce455f5d35f120779fe7c008fa7fa628861b9561035482cb9a823a9ee425700000000025200ffffffff6ac130b9ab8dd61d2f8c47e17166b7ee59f375c35aa21e0681bac3fe8a1a135b000000000851005253ac6a0053a7c123fedba8e4362c1392254e6f26b56fa9560c9e660b8d48c8bc16214038674ce283cd020000000163ffffffff020174da0000000000010057a639030000000003acac6530dd305b00", "00630051656a", 0, -1077130669, "6da7e90d501b84e04a356691bf555418ad47f1335dbd00c4fd8d8c898cc6ac1b"], + ["7dc0be5c036d9c60065671bd6a25236151c48386c8ad32d49e2bb3a2cca3bcd8ea17cbf47d010000000152ffffffff1382323c464c5744edf34c1c592120d4642d7988cb3cf89bff83679fd33cfa03000000000153ffffffff0683ad8dd6ea82b3ac76c3f5f5aca398f1eaa91fa5f9e649f2d78df834b534d1010000000652535352acacffffffff0145e1a805000000000163b22180320334704c0000000000000000000000000017f0078879e2569f294959868f094acf0cd147358706b293b09808927fadb7d14aab8761e88d46ad584866c0675878dfabc196c0577887f533dee5ee6dd6aa265dfc65779328a38cb20fb30fdb5bf20098746a6c3163bc23963767a679854500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b40fb432f609f6d381b591c1ecf672836e30a0ed8d69df284287bf061fa58fa7cf5c2b2f84110a715df5f83be71d0ec9f5b4f0026e3b1a2c8e3e1f767f8c979db29833895e8d17cce112fe5bb3bb263433d0a1e1de342e2feac8074ca06062830139e58cd47fc2bed7658313b913dfb18356619e2730ae9b10c2f6c98356386021adf31dbe1a4054160b0b53ba47ba32f9c670223b05daee6c528ca42b7a707c503275fc8f9900e43f1fc6f064daba9baa50109f3fe7c3c0604965a2376c8ab0d890b00a5ba63dc4ca41c0a7b19cd8ba731329aff6c6ecacafc6d9b9084bd16b222ead4a43d1dc7c5456edb7d2c7d86af870da61899c3fa0adbdb6948afa3b33ca13602114bebf72df509f0bb2e04e57244789857b892b7e57d9af68c433c50e85bcabe03281cbe4390bee55592639407244bc0922e10a340b4e839fac30e016534419e6b02284a1ad62f3fedae71733951d5513fe3a3d427eee604a8806e1493dd4ac82a9f022353dc07d81fabd3adf7081f62a9a2fa9473ff20057e90e0f1d39d22a0d4891b021ba263a8868a1c50c99dbdfdb0131bbdf690234a66d710ee0c491c92c2c77f0a27be3252ba6d7fb712def9ced9af9ea4b29843fbf728248a3959b54cd891363a23fe5166e5ae8ea7b8247d705937d5db095d9b3dc916b4185e672b6936a57ae5ef2d56bf44ca146e5d7ce880656d69deeba45f43dfdb16b70dabf678837243cb0400d3d21c23a7975d89271e7000d2e7e1c2f3fbfd05ea4fc6a1a752ca94412e54d62686a5cc00875a077fd095c7cea57a6239d735abb09dee46a41bf55ad3089b1d02b621534cc55ed96b5c168a29682c3d4f8e6a5388fc0b3458b388e8ade2fdac3307f2a6d6c49c64afcdbe9ad085314fef6682669fb82ba7795d380dc3f9abf1ddf7c507528dfc7c722c3c7eda14d0549fac1c6812d4aef0b63102823d45c55d61cc5ceaab39f236a70bc9797da4f693f9ac30e2fdadfb05093949bf6de35abca7a587c8f6b0a8e45a9ff3864793644c83a89867914fa86da7c0f633ef7cf47e9fa33b001d0f5616e9ba2d11287ff245dac10f188e539030b99d7323a6ad95b5b376edd09f929b2ce3e69914b639a0e9314cb413ce6e078478bb60d736a37d31940af494550d059ac3a9549e62deab5a93fe7da8a0a5e09a5247935c09b06e5fd3a73facea4e963fd57eefe95a3ca5b2e39199b1df907acabb7ead6447b477fe624abcaa2a42b2b34cfe613608837c0e59c6ad57caa152a96f8d9dc718e0219dec20775f83240ec96b58d331dd279402d821c1f818e4a8c7e8435df6a97a20ec09628921c9405bbae77ce41ae3032d0cfc0bb98914043def407614896e6f4c2acd94f0fdcc75df75306a451f006b9733a5ccba232eb7aabfb75063d0e8c72f957c0c3aab5bbcf5123353f9671be0c248089233faeadfe37d92b7457662f130394bfe84656749e6bd3334709c7c82c5b40d5cb58e1c040088deac10e21bb2641fd2235a56428561d9592bb498247fa8a792b3a795ca284c18a198554b2f2a2eb9f406a559575a5251ad6faf5909c1de9becdc965b402da7801759f8cd7a22458cdb55e3222f1540b9f5a2cd5bc660a5ac6d2a53f1ded9374098016ac3367eb36094d8bc2bd20bed247ae17a53ed5cf8f9f6b2ea28c5bff999d8723d25f4caeb44dd2daa5cb40327b12d73687daa8818599148ff42df3bc1d03eef9c0a87434001f9597bb8cd6ba25012328e97f1faea4669f5dd348e78ccbc78c4cb76d9c2a5674b91749437897a42598836a5e444ec457fbb0e4c8cce4a2cb468a537d4c5ea3e1758a17da3958716df9e9f40aae2b6d4997e64102119cdcaeeb59509089b96391fb32983eec204bd0c4361ca04b944d72f1aa02b252b4e23dc85bd9ddeedaa8800c11d7ab30ea545e67c226e699e144be62eb35897c82fe8dd148e92cc74d3131fadca4cef4adc173ca045d51945848be2b3a26948f80d7934a6b17f1984cd02c6d3c9daf11a8534590e69241d8238880eccb8f1f0af39966f9ef2993f816ef1aba8e49d59aecdb9c003617eb32f0a64d4d5239b9ea2e5daf4d89c59335b9432730d34a29e33a2c3037df57114ae20c94a5853c1c8103c46dca30d4972c13d228d9cfb45394aaeefc4b21db485ce2a584ea31d3a82276ab531b2668dae2da77a4d10054559143e8ab5a300e528fab170f87899c57ff0e6a34c8897e70905832eea6266eac780c1242714dd1d0da3c15372bdaa0c3587616fbbdfc7e61d4677d6fe93cd52673b8a096e19b0fc5f55a9af2a2c5b010000000000000000000000002322c37109ca805d3c9d40b625d268e05155bee8cd4632dd8086c8aafc8e1bc473977413d2cdde5a25fad354892c1d2d8c16e747a08d8aef543dc0334ab658b811cd97b667a9dfa69b0b130e4f61eeedf75c4c431d46f901c229cfe50291528d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f403abbb15c9c64b591c423d7f524a71e16cf9ef71205772ba94b06fa09d560d5b27eac4cc31e7ef8c474fc563285039b9f07c18849f3ebdbc3ac3d4454ad1e0d6a08c9ae040cab300119f43c67c7e5041b1db51fb34b1c6d92875b98fb9826055ac48d7ca75acc7f212462ffb7bf20f260816b24dbd44be0e9a734f532b230302038159deee2c02091ff1f31de8b27d357dc16b24c13b75193190846dd3dbc4b70216ffc3fa95fe7ae2b80b0929687b300b00f14ba8ab8ff98b5757a0481c846e5a0b01b63ff5a69e59eb1e762232d52e8564df83d141c2a9c9a6ad38210d3c0f66d79123d012a97b813aa42af49d7cc9f09ea2e0a80a260662b94437b8c2517f0f150209f9cc78ce1390ba013b02790aaced8ab3de5ac9ce4538731d40ccf371e837d7020669101e529030270a9f3e0140924b0d0a7f450361731bc6f6b2490f9e389e4f0306a47173a0d5fe11099a809875a686bf2743d3a04d7776ed2632be8b03479f0c0203cccd7b1c83c671f0f5060a51cd17cd545253e02ccf85b1b34347263b1bb0b90326a177fe63ba6179fb1df8b3c96de5ee73e3ad0c844e314ca2cf64f25990e353b0d45c4df44f66d483ab1ada9a9b836aa0647de153a688bd78f443e83e74401ab8405b5d5f11a80c27abc5f2b3530843f5c96b0005b9db01175383b625dd3c2b9fff6667b90b14ffa1c38778e126f82ab2cc770c0d5aa91590e0c0d63241d73e5c3e630e0a99f13f30adaf69b976f17293bae88aa7a3d19b6b65182fb0fa9e78b963f2f599b29eebcf094cd5d6c92b1fe635fc80404c9260708995a61def8a7f1175ba31f6cbfc6a0bd5372fbd662e20bdae55e27bcda9850b448a3b18b7a0b4f232d49572e02353b5a48e3753833858db9fa0dc88edab8b2109f7db9d17e1d15040410fdbdcb9859945104fa6bf1fbaee8dc4b0641e8a9612d6e5378624e47e892ff1c3163b29a6d3943f8d1c5474869d86df625d2728feacab58fb57bbb1f72ad6b1069c9835bf5cf798fa05f611ff0790856b1316f0e4fb1ad7e9214187bd568c1ecf868e3aedde714cc9f48952ceb3aa7b32bd9b7e4cbe1cd1b5aafe67487c95b79c9bb433a0bf3657764397280c8dc109c497aec5c2e56ab7c368516ac0f026f561132a967563c09a097b4a4b7c3cc8c7a21bd4ae14ea0a8922e62b99443320b1b5bb14a2b6b6a02f4916d607d9276ffb02ae65fcf9820282f77621bc323a87450d60cf31445c64922a248b727e99562aa337aa01d1dcdc604d4c46acfb324040d0b8af4a585d56784b28be60b22ee99045cd4b51b51ee6fc69bd00793b8ef12484d27fc5133da387db447f8b6d7a79ab6c9e3f13166649f1a43f02debb26744dd88d6e2e33350d0ad7bdd18f3e00e8e4f07fdada947739e70d81be8b2da99b24a572e33aca0deb604ae16545b327dc6993dc628783a7d7d5c42f182818b7f55d5f1938bb4e21365f756c48f4a762f762e15a1bb0ee90f3f92f8d02e5b19ddc8bb7710d4a0c57d807dba51b9da9b75af66838a0dd1ce677be78e6e21ba27e7d7a28ae3af545d5b3a1b7fcb87c1bfc6fe50cead4c3d82f9e9836ae080f678204b6e4c0618072a2f84f96c73e929f709bed42f6cd714713cb2570446d1a94a9122ed92236b587232cb42b183f36bd1bcceaa37fb9d9ed9214b049dd7a72782d221dda0b1ba9d029f8e4c678cee123ce3ceebd106812674a0b7db28ece762cc5bb3c3794719160d86e9f99ea402c06e87b10206d9bfd0a871d2d5674ba2d2383a7b768b5d38cc41eb949e7c1c643d99074f16f150479f9e89697b057cc4921d4bc3a3660de9c1f20530cbd0608d227e7315a29ccd17db001be72d7f77c9e080831921bcf03ba2c663808ad0b205cc14e311aa9073dcb66cec7b3f52610d72122078b81689e5f4f6938839ced408e8e8e3f36ccdf6150feb40d2b91ede25576652571b7b8955ad51bb73456f0305316ae58696d3b1cb9d499f2b686f52ee67cd85e63ad66ae78879bc8d666d394134740acfb82fbc0b59a81c9c960407fb079a1ce1f214522d9db8d89355e0ad1619d4815e80af6033ea33b73e39b900942695029525af788e7c51f0c1345ef97f94d5f761d6d4273e90c74920e36541dba719bf6faafeca822790109157a64964d6fed475aec73c4189cb2a476e43256be94fb4bb5665f799ebb6267d9f9505d957fc15bfb49d21ca1864611ed77658d2b1276c8b16dc2936040cdbdc79b328447ad853de699df7bd42aff7b49471c89dece9e16f9473e91bd107339cae9f1b5000c5c460000000000000000c871650500000000a99fa5bf8acd97ca190951c6757f1872e0f2be4856bd07c65da35d2b0ea6b0076828b620b501cfd10f849d74571a82741aa2ac63a59fd513fe6851e560c857ace97f21795ebe9da35c22691d2466e86f4302a92f2425f8307667c813100ece2600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308fc0340ec2af4b70d148c38e062ba46eaa7773575304a2d1a167ad6e59724d6a8c29df049e79ad4a30f670e3276b7fdd98f255720c256d3b3540ab958733cc43bae0cf5120e54e703854f04c4f8913fdb38a076d6c60adc112d03d88fd1e137b0d8b70f7bf0db49ab96402269a97319552d8f41efecc806b2a17b22560866f02235df0654369f1faa3975399e0a3d0a4adeccfce6723d6d928a08107d39156a10319670d79dfd50ed9f9464905b91a8d0493a4f5420af26bedbceec557cf96c80f0b0338d83406d86f9d214d32065258e207530017f5d9efd30adc01fbf39064e6d396874f18472f90099fdd821874e087a79694ce3d71293cc4f070a72a23b1971302000c7be9ea583a7e8a4f189f6b04a1865ba23a37684f6adc16824c10cc85110c0310c714a92cba09dbc970a27c31f2dcc03c164151b0c7098a4b5d1f743aa7ac6802213eb911c32815291a531c1090d7ff8b2da0cc64b145101f9a8e0e5ad0417b0b020e13c4e8d86651fe02b28c1a37218affc8dfdba0cbdeba7f1158cf5d475debb502144530b9e0064f13801a76b1420f958eb0980e17523157331528a6a7492668421aa08bdc01e9279197a861ed1f0f4645ee914b0b1e82ebe57d9994449fb3b4d122cd6825899f945ea871c9f0edecfd0b6aa891e6a88f2f732b15097ad2194d28b2fbe915e7391332e47de174d7babe55e9c38595cc9dd7e962d78ae8c499498954077b823f7321f5ba68988cd802a97ff52f2c3b83bb1b101f4fc3cac2c48d2a8dcb82463fb8b7c5dad390cc0b08bd4195a6a7d6d3e8f7e667643b8e54bf34e663fecfc5bec3253f70eb562bc9e9020f9b9b36f8cf9a8d9548dcefe98593a97e1af4f7e899778e902da89425e87ff81bffee591b91b3cb54f4801381e9f3789548a477cf5176340475212b34c9787aa067d1e44c75f5bf97b2900ae1f69757563324224b4002fd2e0b64f1a34049cf12ed24d244b6fc5610dfb6ff151c342fbd66dca2606ec3b69f39be752e6b8520b1d59746fb535f16d2c43ee21106c1e9c58cac74c6b89079c0946dbcb9bb81dab94e2403dbd19cf1a6e0b36b67f47fd94b84a1a76b7cd842102ef5cce23c50d1e22ccbe54bc76954cfe7b9e93880ddf6eaab8567f23f1b0abd676e884a26c7dc8c51ff72ed9eb12e28a2a9dcf72b13c41ea3d399161af2043ce631721c280f3d94337ec9bfece7be1dade98e4c3a573def2109da254470131c9da29ffe3830f0d66828a577ff778d07ec98f03f787ce6c9d51d80e80b35f350e6704707e5225704bcb8a1d1ecacc8ff73c08a4737325328695a9138f6113819d637d6a9b919df39f9f337bf629a4650ed3808dcbebb2b26b2940bc08abc10fc72083ee6e833179da11e0ab625c3a31b6538cb1322cc28665d08e509fa2dff9752329ebbbc053f216656990f7100b39cf46967cd92bb5652ea47db2acf4882d84b1cc8b4a99dd142413d4681daf3dde5f13f9a4401087b97d85af42d5133b7195a682932f5bf78c2e92709450925cbf571fb9b0d6f43ed8c5bd1b415f66e5beb310b3003b9bb37cfe7f0737e6b255f05b1cf211ac1dc410dab1066ad4e199a0b38ad1ec371e3dc5a3873ef59a020fdd98d9f71e816bb090cb23ad9298f3d5aec22be74b42e0fd42d7b0313492db18e96c76e5135dc31d0f2387b9df97c050258d996e603c5e0ea7790cad19d6ddfa118691767bec64806a2430cdc88a5fe9d1f6dcdf1c15f74645793d6dec7eba3b76b67b858fde5400a925d6902589dafa00c538265bc7e5b4b6662c9241cc1764ee848e5b64bf482a6432a16410c6d587d3cba41fb4c3c85a845f93e990567cfa9895d290e506974828208277ca50528640f338eb2bb6f65d62676cd54477a92361a5cc408354c9d10a0eea65d4d6d1c32cc5b173ad789ff7ea74bc80af51211a2fc462427ed9d858c9da858e274e6747e48a17505ffcf391ee000a0b5f9ed372f20cd54410a45058440c1b2b764bbf90823ff9f06a0f2976b9e419badcc7cdbad492b5927a20df4c8cb68c1d5377063bc8cfe3362046543c834e2a7eb43a920b3a0d13ad1f4a86ad50d98e31a0fb5a895fc21e75fdb71b0443f0db806b931b3fe27a4aa182eaa6d5a1a6bf2f5f0a7f085abe937f81d63cfe4c838c86c786aa29e70fa9e180e1e47fd8ff2c10e2b14137ad5713d128d795fe223e7d9ccc5a762bad50f65010a10ec855408fadf1868c8a6e9328d1bd1586096a6db96a698c04a992258132b096ffd56483afd3658a8889f6d467578cf8c689519174fedca05ea8a56e3fd77b409a5fd191a05c6b5912a5c59c2b48f98956bc95bd36b30cc68f6b7b0200156c51c24b6bfe4160a789ef3b5fc29af2ea1e5bd6702dd7393f28fd7249f54253ab4c8af16428ae0abb5b22425fc33c7e4a7420c97b11d08", "53", 1, -395415678, "7468f2d20e3b9bdcd6f2440b1e6a87e4b62d708a87e13d16639fe5a4eddffab7"], + ["030000807082c403044e4f0d278def1db451647f061b38f55ff9bccebdcfd4567d0151469542e5f57e030000000451536300ffffffff1ebc44abc559eaa26871a75e441cbc125efef41dbe23beb76a90cb98849b3707000000000753526351510052e0ff7b860a9b74d122b6d508ad0fb4c05daf5ad65e5301dd4a3886a70b853e7365c4de6200000000055352515165ffffffffeecd88711f2762b30d100a684f3d5d41320f84918c153d14951647db9d6c35b401000000007150795b029c5eca020000000004525251ac9a4306000000000004536a51535fc4a0a6c90319f600", "536a6a51636a6a6553", 0, -1560453704, "8ce5500e74cb733fd632091bd3677a6f9f6e0233fcbe747223a53d37343e5acf"], + ["4df7471201c0343609e3f91d97d227404a66d1488edfe6527561bd8e1b2fca36688de1c89a00000000085363536a6a65635326d7b2fe035c0b86020000000005ac6aac63ac03b7ca050000000009535100516a63536565cfbcb102000000000553acac52530000000000", "52ac00526363", 0, 2100933674, "b3a242c3f6c8b9d1f673b51e1c797d0722127a018a688b8f0b24fdc4f66499a1"], + ["9bc1d07603cb402f2750e616406b7b130e24efb80e71e70d6aeb4309165196f4f5af262e07030000000863526565635265acffffffff5344624c48512f3b0110b98dbfa0b53db49ccd3db5c909eb66fad70ad143af7e00000000046a516a001b142f284fa3537416ea80503d145bf7796033e0e964a4a783432f5d1ce670af501960ee03000000026aacca8cb49f03ef68c50500000000046a635265ee4a46040000000009005152516a53ac526a6fac680400000000076565526a516300583835f2019513df00000000000000000000000000a10f85251d137afd33032dda51bf3ac06d7a3f21e794707d3637e12f358fcc83057319184cac99dd1d844a35d04f3691c1f33f4e650c1ba289c1cc133bb0768c35dac60eb65204affc983b57756b8d37ca2d5083cc8b1722335ebf087b561dbe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000488ee4fd26678e76fdae02be6f5ed1715a1cf82754a3299cc19b6fe2d0f29a52e434b02469e678c514c4c5e61b5abb03db8fd0764b12ff891dffff9f8baaa0d848c5eddb853866454be3e59e5c51a686989e90029f93985e01b0cadaf62ba7187a28efcc65a0dbf6ebc3144fb4e36e71f6eee1243ea8cb824e38c82e21e6b5da0212e20b1fc3fab0a5168ff14e927943538cc1616f2f7d1eff230cfab73ccc7473020914561e9c1779481b80073fc28fdbf5a931dc1efa1b368e86d245df5c9932940a0876a9c16edb7959b9b99ec342bb9bb5c2e2a62dec7b72a8aeb1b6ca6aa096e12b0be5275a2faf85d987a4a92a583bbe10852a8784195271929aad3df01ebc51031dcb8a023c0096d67dcbe97b436bd657857630d846e031b7d1c563b70478467d0307bd3cb025b9e81a4b6a69f3f4ca449d262c432a1e7c704b429a5d21e4789682032bfd65ad6aec351377734e108f2305cd3b1f846e2381daa9a8b4a555f49d44d1020ad49d53714107b343440f78c8f0ebcdb4ac811e431174cdbbd8520113b0491e0215de083ce272d21c3f2eb3db261930495c4065cf415a6fb2b4baa0c3184300cb24f29987d62ef8de6201b6df004032bace3aef27768c709921b3e88c51d016cd9a38f19cf02f7d896eec816b4168a95d8ec91b9187c141dd9a8fbff7f7db84e7866b1c044578e193e5199ea3f39d06fe25576918090ac6481b48c3e10e36720bf0191b9e4be4db9e475f0751860b1047ca809255236d24ad8814ba72faf2897b9a97fbe00558f85657d37aaaebaea7cb9f0e4f88591c999fbec7268d90b9aafd133383da1d9de3e2b4483a4ebf1ded8a39ea148c6d80b5102c93e65c5755df393cdd01a88391d8883b48f5d5095ca656982e81b1bdedd26f9ea6c9a028312480daf6dfa583730001ae71e087037c37ea1b6d66cbb6fce6abe0852e775c6fca69906b249d6ca977d3ce55b372f4a729f877e1ec2378f66043e3f8434020558fb4e5a023b5afb90ab19afb63635cddc20c4585c8e92c8bf93b33ca2a0e273c746be522dbb3dfc73f13a7b1aa773712226b7b48e7f39cb963221f467c5ebf51d02d03a7bba50230012791fb0f80f076b47bdd689753c2ea58dd43abbe82db976b1e581123cf681389e7ff22edc36285865b4c9fe92a3212a90370a2db42e8875a3909ac945b65b68416f7981a4a21293d006b1f44b0b6de9be46ebbddda1d343190f64d518320fead68284d59625f4d359f13dd380bb8a26a0606a9acfb9ce8a0c50d7dde3c3da0c59ea6148e3fde73e0799167489727a46f508869d74bf83aece8b414f818e0651205478a7af6d5524f1bef6aecb0430b754129e878b36cc31a7697cb02291a93972c3457585f274054577e08399e4aba34b738bd6f13402904ba97c230ba8b95c76846c2b0cb3a4497810612ff64fc9ea39da71594bc0eeded7cd66170e357d6d38d0c5b88f5fb22f2839e4c4d60e56b6318c4f5224e22dabcdfbdcfc2fad1b4d8358712392d59a19063dd925412b9068f1f5d8951da08061af6523857cd2ba36aeecfcca1ec7b2301e8f2cb274557d43aa153d5d31cf0ae27b53baba305ffc4bd1117099981280a82e73a20a170254c1e1357638a4f41fab956a6e3e767320940bf791ddbb6c23a2a96273d1d79783f4f73a317227740fcbb2eff873c369d9f835cb35f1277d17d321d9cb29cb50dff3c259193286bd4fe6be91f2bb5d1e34b2073a2014a4a0e9d7b343f62ab02e7784193af720a2250af436a20c06677701bdf1bff33ce19b69bbac689550fc9b82760110d5bdd69436f96ca584b8098a86e07c7b95a9d4bef3aa368e1bbbf812855fe4191c840c88393103d50bb3d1490d8a1a010b54d3964a6e1566a9d481e1f11b1c9f4d931c00e57f9d4c2c5203295fa3d10a770efcb9d1cd8d6d01890537035f5756dc05c45cdfba4bc373c9ccafcb0597e7f0ab53b4f7a1ca95ab6352a398fbc0c4cd804487386d3ce965f099511974e114e63c3c55140e729357b62a492b9d8887d3e64b43a9b992969558e2231123a56cf3025414dd3a155386d16626b5b3335d9e096e64ee2c2d8b335e3d649c076e185e549355eaadb2ece82a93dbd421c3b3b209f84478b6dad553a585f75e72d83a80d5ae14020ca5ab868f2e0861a735e34d08f633461599f72b9f9869246705ad01c6374e17115e949a5599f6567c58839f78634911256f41ae3af68ae706eda2ecebf384a3961512d1b737913860f4f872a53cb9bb71475f95ab8e805a7f2385b4d286d067615fcc08a07f50261220874cb813e1d374c36bb461efbc8ebd1694366cded9db4fc67d70be3b73cd4a325dbfa5d6a98c753b36127d9e3ce7cb4b2bcd31e1ccd32251925ee926f24ad6ef4bac5b4eb93b3f913fa1c40b93e40d56a55f9995d692256989f0c", "51", 0, -262673329, "70d16c41db0711e301c4cb9599c61e1a2fe30affc073eb7aba2c8805900f515e"], + ["030000807082c40303ae7bdcb35a3d282af38988fde53be6521a71101eee13a3fc89fc546e47fbfa3a0300000002ac524bca559c5d72bff8fd449d8af0ad97637e6badccefa7a7a76a91ace863c9c63f4f1d03fd0100000002ac6521835fde0d10780ee5c4f33f45ab43e9a33644d61484bc537e88dc88b77a0895afafd24d0200000000ce040cc404135b41000000000009ac5352acac52655300cb797801000000000100cea06c0100000000046a65516321f2ad010000000007006363ac00ac6500000000000000000352780f0000000000000000000000000099ee335b1a028f2cfb6acd04d963c482d25401408de974a611b8eca7da3fe37de6ffa52308d8cf45d89e81f0801a12c2e7eb805ae2db6052f341bf9a241f483bb330a447cdf102b0fd28703033dcf717ee2d7aa9bdd742c9c2a222236f05f3dc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004b614c279f9123aec6836da5620df5bd21505a4560fa6062c520d0ee63d986876ee15dea15e07d6d058ba7a6ab7eab90cd6bcf3182aafedc9e3936055d220c857a1ac5a1abee296527d11ceaf1e3db3f82894af6c74fc833a8dc1ebc5c67b5aae9286d95eb0ca19bb47455ba2a6950fa7d00fd02ff04984e45023be28af56289021496f84204b6ab506704bd1c9be8177d13d6ccc83a80af466463b7d5aabbe73c0228344344ffeb67b35647880e0d03b04e6c0b9239dca5764a9ee3dd33ddf72e540b025f59d3d47f14da252a17e913378a55f62a8458504ff7385aa7f98f8102d140c5d64fb739416d4cd4797be17176bf0074af19b2ab077d4631862ddb7f3a6a960312f1e451dbb9b2da50f1931654144af81faae76a4ade8076c1596d2cd2ec9f2d030a2fd786173b93ca6073903d6b3a783a72ebfe963316d1ee596ac0b9d7e0c5790326f8d5a0b9415c7cb3d7e8dc968231540afb2849de49b61749fbc6c9d1caed3903162e647e461b8550a00f34296e59b24f056bc38a0067e78cf355171a47a0a994021e7a8716370a4827c56beb0faa5cec1efdcb7bc16406b19baf656d002b883d082818483d88911a02047a2d5c0142e1b9d0d3800e7ae6ce1512a8f2c8799c15cd0fcbca3a6e6ce746abd70e130acc97b6905c599ca6364c869d292e99e3886b86e9849bf4d88da8ba9fd65bf31361a4e9cab0853290aace4886ddbb7675066f6b8de8e1d81bd8401f44852f2365719fc7b732ff5266eba3c28290f7087604fe209f31b98ddd86c5df200f576a10b57774d6f4f70037d1654e7773244c3778e6fb18f1b5e3b5b36a6e4ab892611eae24114e0d11cace356be4bc3ca88b51b2d878800eb8ab57d72d2ad197682a180383a61fb2371f8b4ef05ba29528bc3af4cc71fe6fc079a8acedc3f633ca78de37a3394c08a35c9de93655f87916b6ab6f6a0c0ed49bb877c5ab5f45b3c06e817381da32f963a83d4114aaa094ac3a018f3be003ffcd860bd08837e7ee67381a4d97df38bec50fa620c78d976ddb693547aa0e8ab8abecbd4617ebd9d36a2c9ecbfadd080dde713dd8a884869e55783945dea2e67261d66c9340affa46aef3e525f5c5e2dc4921e10bf12f9359978fa0c28be1b8ec569325a43b26b7977fe1bccc900ae66093bb63c96caf9a54ee145a51e80cd2094b97793b435d1aefd76891a03414b1a7a7ab8967b0256c9ad3f855760a22afd8fc6fd07505953f4c0ea13eef871ec669a2254306bbb0ea9037a9f1c08dcb40ed0522e3ba015b446aac579778fb00467673892aab4678f290156919a65197ad183bc4c9778f498e216245575cf3eafd7ad00f5c84e258f914b9125af4c6b616221c590fa6feed8bc97b2f300ca90435f3af64cf5c0dd09be6c1a7945aeeb1e3bf14f4305ffb456fddb3ab96c4f50adc89ea28c63e78cd78500adc279cfb5e85102e4e3a4a3878c30dd03838c83779a65d7475af8adeedcf8dfbf74f2ec833ba7d6e4242fba3b61e283d0f96c594e9b65f7cf3307099a24d06a1f033f66975e17d511f0422c376abeee49b559f6146c9eefd77760b1cca07429a324ae96abd796f1fa28ad4ad4c6f0f13383c1c54be124e827eaa97f31dbc29871418f3153ce2199efe6a275d2ab2c01688a5ed0a43c6deef38a0d70fbb029097d842d6ebe8fb91c36f9353c989e35cd0792548ba977c4d839b72b322c5c4c1d9df1e55dcf0bc21ade2ab3c3e0cc16672c94583f699a01be4c8dd92717dba90e09f0d913762fff4ed16d1b8930f3f6e17085bee882245b8aef6624242acdb21947550c2f13167a7026154ea675975af976c6f8852c74242fc2d12c2c5040de88c2361683784b1e34a7d2cc84d9da811012cdea71d1869bab628a5430298928c252bc1cd625993b36d10c398910f75b012a5a4f5f56ebbb803885848a15cfc5ae7578b6ea8a91c1e7cc600a4f7a26ac8a97168c2fcb5211622d51c52c3d2cddfd09f569f5dd78029467ac4b4521c536fae255754fd930cc863701d4edb669ba14cad5b0e625b19cb5255543a92c9d1622f52bcb74535ec5764c9a74df1a9f7e0a34945190e0d00e4696c9123ae47d9873d48de0b16892e4454954bdb686b7e958a064d3d93f1a89342cc0ef17ac77da686450fb5e2554ef4e840a8f7defa84610f1c7698960826eaab7df11a7e8fa0507addd1249851d79acb1eafb615767d73af16d59acf153e3da4fafca3fd8bae636ca2c9dcc46ff9100d620e00c87f96fe921eb1b2ebae4803bb80225c1dbbc8f7de0aa2e98ccc441100000000000000003fc5e3010000000016d1faad0d9742cc25239d22dbdfb45b0bced396a45b87b700503b9b30d25618c56818d1280116a152b42c6716331157c1a7152eb4141bcc808c1541ce0b346222c0a4cbbfe66418666937bc3513b0ba6c90703d2a59543ddf43dd0b0197892100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fc4b63d45ecc5d3ead962ef78dc97f65e6892b5b6da62975c75cbd100a5d32a8f197f31ef18b8976288f1a32064a18d4300c1a4799fca5ba00748f24dbc9c777c103f945de0169dcd536b1c2e837454acfdc391b6d2d9aaca69d8fa1f535f81dd83fdeb88a2e5fe8cea35085fe7e30a98bdacd730cadcaed51640979388cc6610227dd37dfbe0025e0c6110924428e88e0518397baea1ecfa3b9974099d94159f6021aada538b292f0415fb36ff3e4a52b0eeb59ffaee919afa3939c0d2e9c05bb000a06dbb2215692d2c693a2eafb9ffd30fd55ce7c687e43429a98939f539911e35bdff069818db228ea49ec9bf031171e74bcf0e545204cbacaf69a4df4640877640313bc51b0061ad2b9fc213977bd92c7a05c0f7b5e9c5aae04ccb6191f9df941a702105375bfe89aa94e4c8b020ea8e5e189f8da6d94fc315715ea0b0d5a0ffb3e84031b285da8806e1fe2c8dcdd08d6ff4462dbefdcc295bc14fa88ea2869ce69fd0c030e95780f72cd409e12d6a30897fd67c20e4f11db9e11d2d5036b04a5bd5deae5022ecd64a3af7cc5aabddfc2d095bb62f34c5406934fa275adb98ae0f2551c38616463e0295e08916d6213299474c6cdf12633b7caea9818957e9c9086514ec2865579bdf09d8e03a5caaf6f8546d0029808f3f7c39a27608a3082830a2c3189792af75c92cb4e54065925ff75ecdaa2153f4de9035fb645b33f801a322d44ef62267b4843c4e8b8c3aeae0a3c19e154f508e8aeb8a8eeb1ee025db695b452f68df1eb62928db5e9ab58a8e5fc251e1833b329756f35902bcde60d87eda5018908b02a578eb9f6d9f173239a5285a81434bba27ec179044579fcd232b6ca3ca5d49fe7e7ce9c5585d55fc64dd1b5bb9e596c68a5bd8aa8c3a413c328ff1030dd2a66878da31e6ea3472412a871dfd037af8130765884ae482f187676a49d79e7dd6068be9bb496ae90c5834c016c93e25a6d6e2e5c763efdbf522bd19b7a7a1ce007826270d0d3b5dfa70d401aca5d7f77532de5105f69380d4f3e17d05713b2fb9fa10631c4a489ec02af77e8b0a23817cbd2f2ea5edbf675f6eb2d773a5606572bc6c9399fe6a0a5b1977d2982b7156d6805cffbe9edf810adfa608c2385186285f0405236f716083ffd44851d07241324e32dbcd72f28fe64878e7f92dc90232b38ca9a22c57fed1202f395f928f46700e6152370fbac33d95b3ec86e57357b2b3d1b0e32865b37f3de85482bc27445ff419314698920b8a1189756888b65e09c48d603f42b2b51f863296a8df7e693c1d2eeb7828ee0651805ffbb3221a72a0275149c0da360e74d5b8245df927acda3a50cacb6222492f95d88e85935e827173f272ad09f104d6fb14d318cf69670b4a0a9bb1a2de3270416bf9bdb93244df670087f2552234932de5c0a8e9b59efce7e02c0c095e356906000ad0c5ec44b0e223a5c50f79fe048a3296add6ff4d1ef36bcd7bcf25d83dabeb58bed364e008ded246e7c17e83f5b32c9e8719cd268c40a3b62ffe2a3f62c2fb3defb6ad10926addfe664c64ed4bb05a0ae9a79ac117d8fb3f98a51acea5d62521222ae4deb3fc75af7a9031b4849170f8fb3ff3728023647effa80501533f83a3966243b3f5703833b123c4f33cde68cef471742ce12bb2d973205d4d6bc75b009228a0a21109820dfcac7d860c51588d25ee3fd80c7cf6a5ceea6f0b201624780fde9569189b03a6c14c9df282d53e4a9e792e595f1c3769d64c59f59e4cc9cb93b08592cdec611480b38e8cde0749574f09eb9abb2a636c738cc407de5be4cb784c4dd6d9467c0c41577ec767b4c4666fec22233d9f15eb3e9e4dbb8142e0df7e86420cf448efd849d0310d6ee5e800b03958b63d81633eb8447f75e1086d3011a91f57afc7934783408a25c1101fc4e0d646e6c24b5a74518592ec8eb9e84d68286d2765a9af6c4333846ce5b2796e44cf95a3c7cf18db791ebe86c64dc1e1cf230fe8bda1a68f7365fe20873c7bd75e86aed350f7bd113ec001e7c7c507ef98a3756823b2c7d5e56964aeb2f6f9af5c817d17bd1fa06e838d6f76edc81d39c26eb8da0dcc6b9e9160f385cea9f1ceba0dda120043db3d370a0595b6e18b54c4246554aa2ab5fae4d76656a9938543305a2e20d8087beb7885fd262191952924c8ba228ccb730d62742bfc66b29fe93b2766f118ec32ecc5d03fa73d9b48c36483cf0d36d3415766ffb87ae609aaf44c7598bfe07896bb83555426575e029582820ab6fe6334a44f1088f268d8e11bbbdbe36471d230ea3480200000000000000000000000085c75c8b4bb019551f3a67a029f364846df4ca1fd45c939b8aef1169d2ac287c21e0a4e14c3f19418d4b34f7fa589145aa1f2219294d4c7967e5c6d66bab4b24f81a610fb3eb1a3bb8cd926f2b1cf107a19b65cac519dccc1b5c0fec5ad4403500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e3f4e18351535e0788bd7f5186bef0199dd89b2b026fd2b85f10a1f9c4159a30e9bc732b7342e563108c34d7533e5a88f5084430287e2077743c65c6fec0a3215bbf254dbe754de4dcf25eb80732f9acecb9a4e1addba3807422414ff613b7b121cc3f3c25ba8d2d088844998543d5f84f0d015f166436b72c6b8c6532efb5020213e8eaff1ee09cd5bb5ad85a510981174241b2ebbaa1d9fc95fe66a4f3b633e70326a7f6d0638bc09567d994b10b5a1a020d8c69c993b04868e5781608623092ba0a03e3aec9f22e944b27b5bbdb403ccd49650a68ec4d2414da20ec1e1112bc7baeaf6670ed9a1698c2828ba61856492ad6f34603c22994096c62a394f9edf9b24003062e3cbd02e639d33a661174b533c503f42a002b560f69eef9e46d928e67653c0212bf91e1df56ee4ecb8edcbd8255f81628e132a73647b36812d1c925656fb29b0316df1f7ca86e152e1833b3b08409ad55fcd8da798358e6f8833bb6384dd6f9c9031c05708578412bcb6ebc50e8d7c1d4345b395a31f59642a00dac1a5876e907f1020c0cbefceac44f87f09c8c8c7840729acd7649d9e8be57e38550bd82d210541191f6a25241c9e847ec7eb033736adfae149630d88334b74550d8be1b43e86343cae2760e02bda14a5f6afa2c5deeeee8859d13116017ca9178d4e681293c22a344a736e67017f50a9b36c3043a4cb1cce36167eccc6bcdf951c80a0f2ea22c5be8fe14b222a9b19701fb16151595410ffaebfcd4e80226ac02ec26d926d9a1d2666d574fc52c372bcc144a1d46d86853ead2a42dc8463201cb1f46eee66249e5eaeb760e42a3da2808927d6390ae75efcd2f02238a47ff945da3772f8f78bbcfb5f7a8bd98522a61f288d077c2627313cf6f13d803e5ba09b6314f2d63f3fe1b7dcb0925c5e03479346077ad92b13b8c006207b9a526707e4199919386f77941783fe3308cbfc69ebf03adb4fa969f6aa7bf32269ecd553630777990b16d19dfc37d2f99be51ba951f9aec90a7040788d88eafd45476368518c2bac59e8e8b7a38570fd4030abb32568eb572819c91076a1a1d15d3ea1238449a7e5c95ec84e02b36ce0a7972453e7efa882093375539022e5db154f2b981a87680eb37885b3641b9210ea6401edbb3c457f6882d867f2aa08a6af23e8462fd8ab3e85e596dca1bef64109ab090070f8a3dccb24ac6ad5d6696c3f8839d1b6e996b2caf47c482cba58e724ed7a248973afa00e78e13114725951dcc3037ebdaeafec24ec5dcd229e207aa5bf4e62aa8de92f4aab2ecaaa41667a174046a0e29a73b54ee3d7c67fff7bfd3fc8722f4636d0a065875796b8b7c227ff519fe3ee856243ae5f507d184ac866570d18b34c3581510ed176954a089e6acca3e5f9b75d7a0523ba685aaba524a99cbe65b7bcb22b2c4e67aacab32ead1be753aff038801476c790511181c98d34c423d878dcb5896bc606aa63e358dc12143f6d1c7b02ed6a6cc27c13c20f609976014964063e40832a50e55487cddab7ce6218f733e9d8ed6f547b1490faf53f3f0f33068d6a0d7fff3f51272c39ca3daeb3b2af34d8b88e204901933af15a5cb95b930527214cadb9596f9977e2498338d6664b09e5964c534b7d62a88da5f8bdb9a2efc277e42a5b934ed3838415a9b38af56c19f983e5af6ae47e024fdb217459bf561a267c456539ea156bf61987b7114dbb3e99fa9131c66f2d236f15fdd05cb2ab6c64aeb6913a98f0bce28e81c6264b77dfa8921c43ddd309951bbe5dd53afcbf029ec564c6d22e0da8e2842c50699d469e0bd5aa577d7e3ebc194e1ca9e80645497178acd3d5e55aa30adcd0ef910febaf703f7cf83188b64e8d07152e3a9857b66bb1f462e80141d1607e96596b82bfbbcef2ed18caa827cca16cd8a618affabedbbf65994b17240d978f8dafd05a0353a88237a91c6de4a22f3b0c80419eff484c8ff8ff3f1eb59d16ba9250aea98db805d3e4fefe2af3573bf0a7cacc5cbd24ba8ee9fbca36748493b72454e3b3fc98da1ee2cb9296e7c7e3917c1b2b72c39a981f8ec939cf04a63119c5cb83e95f0d183ac79b0666e3ac8b69add76e453c3751d2a348d8bb3de52b2d567d96132780ce332c7f76e784b1ccaa653fc041ea68a71a962a292e47da46621a1d562ad5e6b543a5af992042787dba960352caf63cb602bbe2032c6794825950a76c0a14905eb0d623e86057627eaea3e76e2cf6cc91a36636bc50870bf6abd1b8c58667e08a6305d28a93060d881dd9e824ada7d69e3b885c5cabce2e767c2aaa5fa23c9f047f8b050902f3a75f1123caacf348c3e044a8e4621bc482f60a2a6dd28a15dfb04411963afe3a197aefa347075b40942940099245b3c11f3530e5a75c6220c915309bd98a6feb6641e95e52b99701b30939e04bb43d90c8605", "6563630052535163ac", 0, -1859524749, "35f3de71356bf8221a32ba18cf638eb4831e29a7f6c6e75da6e5c28185cc16b1"], + ["d1cf336b03a2d367caed796b3bd941066a0554c63ff5f4e8c72722164a3dc033f440045b8c0000000001632a3fe634d778b78f58fcd6c1c11e09228e0495510d4c8dfc08b2f64798fd5570f43b7c6c00000000056a6a526552ffffffff4eecc194c11060ecd7b42adbd7c0a1dbc620f61c79ffce90f61ccc198b6ee3d30300000000c6b203bd011cca85000000000009525265516aac65516a3fa348b402c5052200000000000000000000000000902c20d6f93a1d4be3b3c20a29df3eb1bb3e18d62f63415181fddcdca5c5fb2c95f71e28d8ca9a7ebf4d35522e6fc19e6df0184f02462f8e76163e555bf3c0a5d8cbdeceac35a09057edd3e77869223f3ac0729dba49e23a62d3781f5846583c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a25efba1d58d75e797483b3931de65fd8806bcccdc9433601cba5957ea73300217dcbb4cfd01392ef369f06227f9c6e95c2fb02d2802c53bfb624b1d6c86d4918dd9199ed58a389fddf81ccf400acbd5a4e74d4c81605ef439c84dc4bbba724b373a7ac218b441514f55f0a0e5759d04f87bc8bc509990217d9655da0430fc2b0207396bd63063507c60b327c0ae91837e02011bccdfbd3b345b4e6344d02b2c54031761c643d6f0d5430c1ab515571561f5c3dc7ac8cae01e77503031529de0a4280b05a264e4f50452a110d5a6131b1ae68f7c56d729da24712dc059aaa4407e7193fbf2197e263f224a46ea105a10b1ca901ecaade8162c965491b7ab1a84a7d5dc030fc93081aa84472144d4999c470214d8191038c8702b96eadb9dbac07938744a020b3117299059e8503b5afce48ab2bace84ec2d4e72cc1542309e594e2a88bba40321194f04659687fa8ed31133210b93690b9ec368041d8d8f8699be3a2bec973202029a311e564f3e8a91b618135c4f2f3cbd221a591a28c9aaf625b6cbd3cd66b5021f059296033f4fc806f49224c94260b58a487e452c572b72d7bb023f75fb336504bcf34b1fde61f86fa26b432f4047016a33cce5d488c7834008d79745335940efd40bf3a73d4b30a8921a060f0990bace601475b1a502b6619c0f984865f5782874d201d9d9ba9b9676407b16b62123304bbd880ae35c9559f5adc3ef45dd13486097598e6ba229e22efab14fc83c4240dd3f4d0751dedf0f1be0b3100eb2051c5f5b2703840936c0776c9066722afe80f6e24fe1991a072facec4a66c78e8f1b63a2091f26728072d432f6465a1c95f279fe5acf8d0caa682e10e51b3ef1bbd497eaef1bdc2749e1f18d6eb3f2b7ba8b93cc3a37292eb937b64d3fc2bc1db1598d552d26af2e862dc5974134d00c20a79c9bd3150def5ca4ea9380eaf9ec11e9c3ca314685cbce75ec267676d5dad81cfe5121c7aaf7d51f3b4e1ceaa8fa29bc1475c6405b3a644b709beacb63cee7d5b3e0e6bd19f5c7b695fec471609353d156076c04788d626830750ef7b81c337676c15e60d93e71f5d275e7464b25d136845f2e4db1258fc2b9c48821b6c12358a9aa16b317a85d2a5f29ab47e63a0f4198d7104d920dfb406acd7d4c08f738f5f33ef14f3761f754555eb8490407c727c503ad04c431efbe834f726e78b9c3a836380d627b62c13668f9605e58e1dd84d62eaf15e6fc5f2567a55afd8b2cdd2c653375b323da22079bcc08eb644098ae16b11c10f291abbd0ed6af6f8f08dff396b4ada25e7e57aa7ba8e69876f5b33757343c8af302a7441f642f5d61f2a7bf1745b80f3f3db0911069ef44017dcb88a75e6553daa5150d11275a2a892379dc5d1a90c7cb13226fbd784b554ac8aa9e181aa62cdbd57bd99173ee7d3210a93bdba9e9c0339609ac6cfa79b94be1fef325bc04c011acf825fffc4b761a46a605efb3a5dd117c4af082616144a84f085714ab4ab06788ba0aa1e4eea45e17a65ebc5f1f05af767e46abaea3e401b392b0ea140826d99f0b0e1cb27935c5571ecc767fbea401bc269a507469438ae7c5e95ff3f8b29201d6e674b3739a71afa8f2954bf76ad78dec53a11b30fc0cbf139d5e452433af95e70afc3575e61f5fd0014c6aa349bf50b8078339d788c1a80d77193387d433f0f94ebd24e8d00a33d989f0d5a63ce8215507178cb44f3458f98f517ee500688df9947627bcecf0ac94a251a0865eee1416ed240495f35d4e5f94c6e0b8a489d02ab6a7c643538279e8a79991ac14d2917571c435520992595641f691609da8a94236f871844a9ad3c774c266e6ba0d44b40f7344236a6c6402d8bf72b7aa1261382ac9ef4ec7e98d07279e9a014d48fab88db6b33b2c10be7b08af0d390dc7e887541bc38e710acb68a44068d15a92ca720d50adf246d011eca66a12defc6a258f3371768b60b4df4ce740f325434b1ac0f5471d27de26331f2d39700a3499de2d619d2af3a196731b2fec631edcc23859daf2661ae21737a7889afd959bcdeac43d449ea27e02c39668757489dc134123c13d70ab0a8c152474478591a0d4a8c9abfe7c4d492da1d053d8dc2ad2b7be66313b0a997fb5320471892fd75ca81ee4d2a892e93d396560ebcbd9da1eeedb998b3d9e5290f8b936ed408d9b32eed1fdab58cea80c908c851b251fc19c7e54c405fbefa948b447bec189b209919cdc574a00e2dd8b7fab3fa0a6218f1a81658c6c7af72482add84889ca07b59bc2ad91e91882b916d1df434a42231cbb00000000000000000000000000d3ab1523738dc2cb826796331ba8321851e5026b13808ef490e428e466b1d0edb968e4a63c30025acbf8fe811a96d674a90bfe52902ce5f09cf9c075df206197cd6af6708a2ae6c3190b10d4b112271c3f11cba70f7c4ddb6faa3d004e89c46c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d5e94640cb9e4668e45b1b60e007b6da9c299ead626528e49bf4dbd1636d1e7458d281c5de983ed81d1941d3b70af1f6b573d3e098060081f2cf51d741559e094d25724271247bda5d13e6d2b02def3be4d360b6c3f3a72a133fa857c9b4f05fdd1358df6f98305b747618fd4ff4f1cf99ebfad11c8ab6a81dcbb61e81433cf7021183c623c90290dd23958c909913f2a884a352e0c4745214c918c6cc06b3e89902224e862fcfda32a97ca212f400386abb027ceb1b46fe971a7bb71c6e8e27aa740a048203b9b8cd36bb0bc7c85d79fa16032f5fe8c8ab734aa267d2314a18f95f0dc69fd0450a9224448e7ff055c4e1fd6b536f6c17c747164cf3658545acfa011502172fa09d5421c04e43ca59b76550965b06f2975aef5c7109e0dc574a4280675e020a208ffb42a944c5381d09d31d561daecde47f3687c17b32d3c352c99cab506202282a68c3431a02785822060f4b1374e85032423fe6aca4645af00fd7e7deec10031130c1df4425374cbf59ae2afb6b3c58f89c49978173574c094893ffa44be758032705513b9e01cc6cd749c7663587e82d9d71330e9481c83a40e80bf0f94c4abdcda2931b8bc710c5429575c58848fe3ee89d45df2104473e642425059ddfbf219847ee12fe048079a5950b0243165994a570147bfed931aa456bd9ef0687c30bc79130907c41d967742c948eaf4f15411b8e8b06fb058829236c12cb00581ca3d466ce0d9334f3d0a78998fcb52796951538d74b66a0e990772ff193487d43ee04eb8c35240d3c16aa53a587233e53798ff1af0cf872938888d668f66c4ebc8656905508a55002791de35c85dffae08e308bf8ba0d9f301df1371df2ff4667dcfffc3ee9e409debb4b839d82143a92acf65db554d5cd71e212e416c04f02c19419e04de25ce364720fd08da784b54df49035251e03faba669256a1e13fff7570b436e52119812e8008c833fad4a0c78c10c0133119802ef72ceb91dda69a2bf468c6fd1cd51e579be6e0e5602d20dfda5a8d66cee35e9747f20343d0039836b01189e770fe0f621223e0390822f1d2df5cb6146bd6bb8de3f2a19852c4f1fa3328cc2d62f19c531d085a2959f85ccf92020f84446074f5d7b2d01e9bbace970980d1f301d405753a86cc33c0e0a208c2d06c4be49627b2380a52d0ef80279411e841f26188a468cbabb5ed4042aba68172731e2775b2b3ce083d8f313d87ef4150a20d89b9888d5f9d497d8f883cf7faeaf27bbeed789f384d4ed506ae39bb47f7274d2e8d116b165813216b79b3eaf6d682458807be0af2c66009a72720d535d2cbca1b86064eaef9c9f46835df141f7968e6341b30b4cfef105c1de7f715ea584c2625853fd0d9819771846aeb78e33b62213b65876d3efd0775d77cd0034e098ae5adbe36a048ba9801b65db750b89576c67fcd893e99eebb20dc760600a16550bab52b45c1707142dd0196713017683b6320772046a73aeb63bc41a552cc42e1172ce3e4ba1721c53debe2966a37bd78ee6944e30d4ad7f1203c2fa1e23fe0d0621dbb619c2ee658a72d506d604e4fa48d2c488cd8ce3c955f5266d475d31c6d9aa952cd72d34c419998d8374ee2168fd63284623367752232571aee63db4ce989c36512fe0ae62ab70f93863a54e7da74d38ea8a2ec3a8131251391b526f2a226dc09de277340a906484fe1a23cb55a90b43d31cca191c9f2bfae7b6d40e8bd0e45d5f46d3a2c85749646db5f5d6bde5d0a11ecc370089239173c4ee978409316f18ef15537ac8e81cf3f14086ec28380249233a2cabe1d47e559cc080d3d9b59d929af630e859ca8eda15a33b9577fe2d3489c3a60ceedfc2264866965113f061e26e7b4ceeeb12e55f3d5ed2dd62333d0fcc29e374fdc5b7403f4f973e356fec83e3bc19f1997a218c3f52a47224e827b37e48a03c89e93d8d2ff651b05d7e874be4c530509dc3c7f165a612c748ea308533c8489adefdd131b0fa6431b9deacf0d93fc35fc198368a78f88948262de3d66eb3ac656c25ef657821d53fc033460c306d90d46271118cdae41bb0bd0c79ddd9d78e30cb994b6f4b96f4897eeb7433543baae6df6fb5f9039fbedd21b801dae2b559e4039015d5087aa597db21bd9b602806dfa314c474f9a02e9666ca8f0d93300ca95aafaa36f101d822b0ee8638030b3fbdb3bff82e20f3d56a53d49d06b84269dc76c2df8ba158af3052c34644fde22d1f671f0fbf159cd7c7a39ab54b01a95f0d2b86de0dc4a06d117f508fbc61657b74709b0c9a9b7c9fc7e85e727fa53c209d150251e9780b4361f49b62fc40eac84e865f96a535193d2aac83c0432426ad85d9440c662a3ef90deb68179ad476cf1725a3c492aa4be42ccd6a885351ab5246b0f34042385c6fdd1f711516afca9365d8bdffa615023156c0e", "52ac", 2, 1425848865, "91db25e48556eccb130bbe8b7f0d30583fc59192e071b3a4c658d60b8d34225e"], + ["030000807082c403021cd7a2e8308577b557e0864ef54d849583b041a607bcfad2b83858480427d4bf0300000006536565536565ffffffffb8d439e97ffbb94f79156fcd2e6d0b27d41f522a38c3e4866dc0edba5eeaabbb030000000020ea22e804f5ed050300000000016a745761010000000008acac6a00525300637206220400000000016351240c000000000007516a6a00ac52ac4378dd800000000000", "6a5300006552535165", 0, 213345942, "5c886fe55eaabcc2f555751158d8b2687381b976945e35ff087c087e6598f8bd"], + ["c1915e300361006ab80e30b4056141e849fe8532bf43c4806723c449e0d31d34e1e32371990100000005526a5251514f8d9bd514b560cc975fcf63a95f92f466685b9c43e422107fd49db9b51f3652de8076090300000003ac6a5373b2b06c633481fa5e72ce06120c37348347b719de67f19adec64a2d7cb70b9d4a4c2f9903000000070000510063536affffffff04d3467e0300000000076553006a65005246e34102000000000452515263a163ed0400000000086a51ac526353ac6ad085d2050000000009005152ac00ac530053ef17906803000000000000000099d28a05000000003564f2202a991f7c76d5c84cf1102c31f2c65ba0a13abc0e598d4ef3d9adbc7df4c6dd93b89f4c22ed6161039b8d5b1e8c885fdbad05051701de48a64ff0d0b801f3d06ca44c22627007b1c206c3549e6661de4d7a972f8dec2169fba20979450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043ac22e113e685836b33085856f81d33b9591d1043ac4de0b71b8bef9a0b77ff4e60cc6ec19a502dc4616966cf2553e1a46e580847e26668e480dd218641465c12361296d47f91e6eb475b7ab6c355a598516c95612abba910cd770a5661bca4f896230199e2fe3b23aa4ad1d99da936b3557e25027c67ec3c00e634037fdcd5030db57c9428279cfcf23b3eb343b522a3af0631a72d2488027e94c5874ed2126b02091b0bd434d3c4d46e8f67f1b84ab218431e03f7ef02d9c49aaee4808befe5640b08c8262e22aa1835f6749dd6d632a3663f3aa17bd1e6e97c9ac8a69344d798f66dc30c7a9d1cc7a1c52b44dbb64735e0161f3de92125f200eabc2ba82f36522e0218ab4bc26a9856d26f88251d1d7769ad08353aff2b41e423cfb25012c27b7409032d2af05db14cebbd0e037afe3f2be41783b0122c2095bbfd05454e28dc187d5b0312ae26e1bc63d5f7f229c0ed9f35ef01d5d6fa9637965534c58fa2e51812879703142cd667c72864b62bd39d666662a2fe78dcf80660afad91dbb56105ccc1f15902143ce3577a3b8ea0381d7fd0b05a5fa4cbec62291ceb293cc1950da68788086fe588cce3086ef2b9c28a8295a3ec566723e30de7b83aca4ecc97c9cc265b15be50f74a478a2b32e53437cf75efd2c8c0199e82f90b0b6e91144046491f5c613f4c770c280b918482b41a9db6bfb1d39d3e0c046b88ab7ca58bf119c7e4b2ef03eb781807057c21e70b7163663905520be00537eba7fdb62e743374f446c4c5e1211d0fc8a211b215856b6e1b089984391b4cd376963ab8dfe3faf80cc4acbd42ffecad02f3ea4c5008cd3be2504b4fb1a6afa763df893fb8ef976df12dbe139327e5a2bdda7ae339f840c9d07ec0e2820187c2009bf60c3fcc128f932a872537acaead3cd11536b2525048b3947afe405afb625ce7b3c66b3352d0cd6cdcff9332a61fcbb6a7b8e0a0b2d0778f990a9cac1a30f095c86a1a6117d2e13d77bee763cfd72da948e39a1956dc08b59d1cc55fe0d9ba1517a047e85bb2bdf5235c2e4b655eced91ef761554aa260261b6620ce90808b1932f2616371b676b069c677948486bd931d56a46c3b82a847c20a24158d57bdfc5079d2902fab7c00eb5bca8f822c2b1ffc69798e4f30cc40696e1f6e380e0941c9aeae66c09b73cecbdd65cf6226c9e82a4e56724eecd595f4a198e20f4d076aa398fcc98d93bd72c8eff8038a945d9212e56391298747a78e4ec58b1359e51f3e59de62a6a084c02613384116b7a9b488de6ac3206b040a83e4758d9ddafabb8e7018a3332c5ea5a02ca805e82ac417e8880c49ea97bf90a5e32011927c55dce0cae4ecf6fd7428a7156bd81f9e37a95f25587acda036382230013dfb119e923cebe88d40a2290c334c84f176be2c80d310e8b207b208e42b87e0e2e69ee98a04a6402b9181ab2aea8c381cb8c6bc7c6e21258cd5c4ee33bff1d48083fadaa0c1bfecd3e55f7a3251d6999d2dbf340b605033263569ecaf8d31659bd2985996ceefeb7f62f4e0e904201e592e1ffdbd663cc495af11ec7f0bd8111e0ee47ea91625bb01bfc0fbbb1c334656ac439554ae311be75f36221e21c02960926b9614c2a034e7febc2410af7599c1b5977812d5df675dfe9ce6181862d57c564426ac7b21557a366af0d3e62f81f1d6dcecda0c5f686d91699a6d6f86ee8245967a6524755cdfa21e64501671cc821534078ab2117403c5b9b6f17fd29ca136926592b1115833a72c5fbe2eaa2c29c21154d2289005de183dc74744edb8158336cbc0fa845f9993843160390730aec1783fdd55aedafa53e927e7d2829bfb2696ae1dc992cdb1c0dfa5da04259c7b1b1def2cb5dc461396085bb4df5f715b014ebb97fb65de1ccf7eb6cb231459c35be20fe73a97ad19873c106bc100eec60d81a3df013ea3dbe329a03b9396bf6ac11972169517f64a227f3c704cb8d352b6e73d6bf959bbac781747a5057b593deb0fa90de50fa240f85f628e4eb03bed23937762a4c142bf6ca12f03dd6166418e1eb6f618592bb9c3717bd45f32821688838a4a757a783b4aea04686e3fcf2a40752e7b547fff6458da124603025830f2496aaa8289ec35f339b4eb75293d1c30c8bbff2412f685519633a2e9949c1efec6432f997d9b4919e8744f5cfa6554e77591699f0b0afa2a4d448fe777cf35609076f4e08f2ce7b0189dc7818d2a98e28e3208088273a61ffe076594b1db3e5f6637befe04b5d005cad073bbfe7eba0b50dc04186bba6730743d8742e0c23a5438ed6500000000000000000000000000372e33cac33155005a8559592bb92371b69c11294c129694a8fb8e92270fbab2d0644c39816d4ac91ad373c3f45b291d1c21764e073cb2b23f11dee8a599776f27b58b6112116043bea91a6612d7a455fabd5e2c08add0cafc3af20b509a15150000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000056a8643a265640fb316e656f527ebd58bc29aa4d493e939a0fece2191f7ce511c213559b2486f6d1a9d60a6c478e4d799153cb5ddaa430290799f7e891639fff86649ce61c3d9a581e1cdc811089878c936d9a8a7a6ee427c1a6cd8eab05f069d791f8074df507636bedafb8d92290f9dba2d7a33982518fea4c1af66b1691c10310bd9cd773b635bc4831928e318ea5790f5438c9d5fc26bd9a2969bc41ee0b60020c738de0c352fee5d9a5a504ecc63d873dad10ba8dec7cbb997dab4c16d6978f0a03ed7e67aa7255fe1b979118e2085face8fb26abbd383ced9263109eed9e99ba717c2896cf74f30b0a5d9cdeeebee7523e115cdde302c97bf0013063eda3fd3b020091fe91b415fc9072ccb4af271064e968df4a9cc3a34a7abd4911f722d18714020d27c7aca694d16ab1e84c460e46818d3b272dac3d5f725eafdef86334467c91022d194d037b63972b513e407bb2fd1fd5e987d50c6dede9f85138d003dfa61d33030b69633349e94c4e33054c5a6687dbdfa8cfa15303420e59b3f39c42fb463aac032559d47eed94230e09c1482b7fb4ac32eaa4793ee1f81dc1b5c18db3cf1c2ae0be289cad9bc7075ebd2c7fa9f2b2ba7d52439ea1891af4fd04d92d1d41cef40455fa994a8985bbc17ef41990752ff1e7c74f00de484013be70c7bacc21d469b4b2497d3c4efc227ca2fda67a359e72c60beb5f138f330cad3ee26d4b66f5489d8360e06bad0bd19b3d818c4dd4c30ef5c178955f426013f57b161f511aadaa41e15c7e70bd8a9fd9746bcf23eb9e70959af8843889bef0d3ed761e906fbbe2d83fb421cb57f95e90454a2c4cae0a7b87b4dd53d18b4e0fd949d5a77185f9d83d185e980bd8d0f4a57e20eb58759585ef74a34fae90168e7f20c2af9ddc17a0c8123dcdd3851c1c8844cb2184589bf5a66ac2532182ab486ed6441467e6438fc4829f03b39456c80e30b2df58df65238c603d29968bc6ac1e7eb42db0f6c3b2effe9dac678d9d05a1e97502f9803555c562b78db5fef4e221c78b46b3f154d31dae7f9c42fab5297e1161de4283d396551c7fbdcc1e28540868a6bcc58fcd1a545eb0f48089a6d7588aa53d2a7b821d4702adfca4cf25056075aebd230edb4af71be9e3fbafe0362578ad2826a6e8e3ffcc77ee28fa0b95aca2d4b8c4f9bf86d481df66c90af4d962d7dddcf8c7bd412846e18e27fad4a4197e360694eb685f31c4c50b27d8a253dadb12d3ce398de2fa22646f4eabbebb0e4f9b5ac7463d74a48ff79b1fb7136351381c4fa308b8c46a34d6ee2df9b1a9c74457def01c4d88a5a0937a4418e77f3b3e946d92e1057ac562d84623cabf3914ba747fe9ea58697f0895c20a88606a6428e4bc5fe814fb8a0333752219553b0049d3c47ddcf2d69fb43b3a7e53d6371f20f91743d14b940356e04911af499ff58820d1c70b855a3bc6809c2b2e6f5fc9c5f3f6036394d62c5bc8958471e1213172b5c19c5b9805a5869f552835cf4d8200f5f4e58e674a9b1e445e07836414f8d9bba17a50d2f049473aa79df3cf471b997a7b86023cefc8766e6395203bde8d7ad2ca72c522ca9915639753f34fe9142e7785ce4163f13a48d2e7a0c179f5be3983f496472ffb303e685e68f1f5726ac2653598e55c8c7d11803d0ccf4e98a742c0ad10609e7ae7b6aa821ac486b62af12615a27dce37048e454427afecc7c1c8d150fc6428daaf490c5d2723ea17e98e1008c118a00897446aef266306396e307e365917f87dae788a3b30226b5ef664da8bf2964b38d4cbc237e1a79f30af36ee92fe3709d2839d6816cf46868edb2ef4a0becad871f3b48ce5a49f9d690631e5506e4def871acf2c0222f2555f108ae7440485fd96894d1affc964064c0d3dbeafdeff4e77c615044b39116a0de13ea7a322fa8dfdc821c18a1bb4b5f8d60c09ac457f2e2e40c178902279cfb2a1344b3b2a777fafefc92ed839ea87204cb88f20cc6bf2afe125110059509828ae1606efc376a566c087d110095b27ba04853d29acd7ffcc6a57f3d96d3cbad8fe40b0f6f633c3473c08ca14ba2b61005e4f70178335c9a197164f55e5fd61b285b1c20b33a0c9f510fea0c7058cc54562187d4efb638bfa44ce0fd4bc44694494452471b7b6f8ae7b1cded5292be085356c2b4cbaf8afd6893613387306a97f490f61c1c2dcb8bfb773b1eda072177fea05b274d09f8a26724b8a1a8b1bc758d04795c5b7decc814b3c4f77687430ffbd24031f6cd3727ac0d9d5a94a631a867f3961530379b7d8f936220000000000000000e927be0500000000699c9fef61ace886beedcb85bfe41aff1a3a44f59aee5c8295b812fbda34c9141ae424f0797d0d0b0d8867ffdfb3086ab92db7c89517d1a1fabf44d8c46d51917aebb1b15f1222b2dbf6ef9fe755a939deeaf64bc5be7e257b117388be2795c80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041c697cde5a95e417c3e3d873715dffd63d0e9ca08ee43e726d1c668bedc4f1748675ea676da6d0527c6c449bfa4ed19ba51c7c2c2db5e1b4b2c41697f3dc53d76cc2bb417fc93c69608259319fad2360dbbb2e0cca07507a162409561101f88bb1ecaeed2f0d254ccb4aad2f3b8c3b963d0c75a545e5aa53d618181804170480215a6a96fcaaaa09e16f08dba7b8cc6b25cc24604cf14d8f51938ca937024a1f902134b58cadc38a4dad927400f7430aee41e5bf6904c88cdc14af85a213d49916a0a07251546063e22d9c64586c8cf8b3e46fea77e28f4ef87aded52881c4a1c3ba05a754f1e6c4bcf4a11efd7f86aaebc3a4363703e219bc9c75e769b14a2ed848402181d2ab61a8fe078341bace01e6342e06480ca97f5fbbe80a9ba64df07322c6d0208a7055c7781fbfda9c5abaa0e6cbd2bb87bbba82da50904d147c5df5bec9c2d0326f4a5fba66a0d94af13b74c497ebc1812ced1d8bea6d8b28cd9619ea362a2120319a54c773e6c284367f3861d7b1bccc517d74a8c8b36fbf91b89e43dcebe397202123ec3d59c4217625b9f5bf2ae719a9bd23b96ef8d6a56a263749fc4c19303c24b88f2f95a1637bf3066056bed7ac78353d0311b3db2826d06dd9b0221360373afc5d1e059f6b43b0e27ed6a445d573d67dc1876ed56d9c312ece63e0c6f364ce0beb5f5f3127408d99e0ac00d7f8773d56472b509e0e0c5ae83e1533a56a247c05f25ee5f0e73f98803c4d53bd92528115bbee13515524fc5d39111e24a95c0402c1109d7599f31422c52344902221720b6f0eb0aaf2316ab63ff59a03f60abeae07831a53eb9cec0eef2c3263580ac7919f660e7df7638b03df143f82132dfddd037bad7c22a03b79012d8e7c0220de357b992f2478a6a2648c848487ed6a287d9f45a6b0f2161829bfaa7cfe29b2a7dacf5305138aa8848fc28d0d8441749dff6bdbc2411d82616ffe454401b80ef5ba0917f1229e1dc69392af52cac728e16986c8bbc338803456021ad08be52835d56797b2a4d74151d4322d2fc720c597eb266cf1a76e1ea70323ea842403d5dcc17e2eb95f70133dd9ec9d8bed6bdbd00a54ce8559987fed4c38a8b5ae1fe583e1dfe5824a45eb2e1cada03f10fa488f47cef6f57203508802d9e5b1540b5a452d9f2307c40506d92053abfee7365d26553883423ac95a08164f0b0cef5721029b2f5628ca74dbf1ba168fbdbcd4083e9a0654985d849f441573ef8f4872b0507a0e67be0a30680f92347de10b96868a499fa0ad92c8ae22a2f559b1da493bbb4dfb2012345ecf3e259d53b60d3a586c325acc5313e544389892574be94e772abcdc43c07d0e6ece09d068b4070ab45333fceec9e0dba05b2f20ded354aa04f252cb1aceb1d291a23cd4162dcc6e9ea3e42d438b9ba515795be277f83ff8736d37237e14e80c166c3a2e56c061405ffc032c24ca8e0331077f7a34600fccc571072e067f2476fab181f582522b8d6810c0f5bd899a3a607690c34e7af7be96071102bc95061a991d8861bb96f230f7edd8a0b3c663322e395e92001b47b84dd182471f89a061e7d5b8ac5cc5b29ee967eaf4b484a73c1f7c292d467388a5e4572dd2b6f14a2c6fe408ca2d6a87d0ca08490579aabaf6fa83cd6640dc4615a6425f7df0d4b3676078a69a7fe37cf53641425f5808243a2ca7ec0f37d40a9d14eaa76fa7d4a4e8a014df43d743114aa0c29104950d31da1eb29755263a543dc895914e3c3129a22593150b95d794f4f96c2df2b8834da551a9a583ee3569abdd3738f77ab6dfcc0e6c60bee6be5078000c8ed039d69b3429a70bdfd8f73ec00c3cfd99dfeab107643a402946e5885d19e217a86491aeacafc5dc55a1454af36a1c0e59d3532defad9d65ef22139a92403bbefbf3fb0afea831687f36cf3e3db1cafa3b466c3cb918a597e4a555281a8897147225701f891d9d7e28c86daa3e4cdb5fdf87398b82cb9f4fc0e5181405638d71297306dbdf6801b5baaee755612ea4027553a154e7914e4208e007fe151035d8340edd8f8c29e939dc3c3e667473c518156f0fa803b6437720862ed7947b580d1eb77e8a3321ec192ed16ee02b3f5d89c895ee6c11a80dc0218d20095b39a2d895d704bb7149ff9ddd93d76f872f1a7d0a44937060c4fc5f5745b67f8f35bef70515aba13745fbc985681285a5ed6e8e33d91567c835471918c86dbc2bb800ec738ea818c90446dd423321e3c6b4b357b649638c7a4a92e416c13acd58cba4168c85128fadf33105e67b28e68d1feb00cc06f678b062637340d6e868c2c9f248d744a0c68e591503ad8c3970283dc2d7776810b6ee9e1b1e89e1926772a8021cf7c2128c2ddd1a15a27f0e3f33327ae3bd67a88f883ea202419f6103cc84ac7dfa1084c5455c5f700c4062f3b313dd908", "635253000052", 1, -1304925564, "f8047c00305d256b1b4593bbc5b276364cc92a45d0c38313d3c93347c4ac4cae"], + ["e6d2062004971807250e781e3f084a181d2525e8c3280c242297ff9808b58d773242a8f88b00000000007366a1b0150e6e4f4c164830330bd429ac9d9fea9c69bdeefc2cc003ce0e4743fd2bdd7201000000066a0000516a53ffffffff9570dd415ae4f5cc2b1c95c884901f39a15f44b57111c05e2ca4347c788f13260200000007536300006aac52ffffffff567d082a24732a14a7617531a447cf22a0aed5acccff12b75a3c5f927e868d1e0300000006536a53635353ffffffff04086f14010000000008516a636a6a65636a04ce5b02000000000151f401020200000000066a6565535252df971205000000000700636a63656a51b534e33903c98d13000000000000000000000000004fdbd30b09fed3ea940c103bc65430d56700ae8e153563f3ef34ec7b70ce97db7a9aba93805f1d4716e5a306f28abf92eb19c4f406bc7929672858719634950de4c76b8880ffeb940ab35773b7bbb268e97ae39d9695aa015888102a3fbb05b3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f7f1e9c9c16dbe9f6cadd0c40971f67cffd3d0a682914b3df0be490f514f7158af31112f3c78971fe9de3d2b5ae2a6e5cbd5e91312a86e2b57a319a9375b6bd9c35a6aa5fb4f2f514d44761c9b4b2c5c6ffac7ec382e46ec2aac80cb7548996813e54d7ded52cab0b11ac210f2a0cac214d852d44c8875ba73ec0973a1efe67020d1304d14db7249198f4ce2b46a3067c190dce73f55f29103fac49d006b67d1f03025e280c35a9b494453207050c3969aac781d0d48ee56336d0340bc6ee9f926d0b07a239957c18a2303cfa06c0d94e7186b60fe10f87ef9f579152f3b91cd7c0bb6619d9b21b5dbb6cc051b62ba4f8796582b6cac727f9410966db3ac39baa363d022a45078cc2e6f3b53bce6ae8552e38da32e6efdcf82c98d5ef9a97e37b89ddfd020a697181997c8a4a3781b94df6071cc69447ef34bafabedbce2c14a617ffc58b032c125e135e39954d2fab4d3eb9ff535a2720f156fec25b560f18416ece80b48703022e716ac90f6774d396df61adef43db36d1850bbb072d9b8a102c2494949e410210369cd33b9e949404372f1fe8e10da48c4307fe11e3bf84ae0b35da1de197c9559190fad804928a9f4e5e58ea61a54ac6d5c8f404d567deafa1aea2311b51d913d37cd5261f2e4126384e5669ed0cea9022df0b812f35ead4c48ba68a04e77082957121bb9cd1371ffb0af38fd4c346d9b46586ad5094c6d9e62423fa52def9673af241eb53986e40d5f3909c87c59f4d2048a19e9e18765221d04cdf5048c20a14ced7c4f350c3cb451599ce888201e43d1b832abc1336085b608d9d6fef89d947abc135aa4bcb12d28481f0b65f2ba109f48e54f105768e08c16a0a7de2ff429eb82e9103c2ccafe2881fff1b8a60ad2076f93650dbcc61d38dcd65a61cebf47191ff3124b573d3fe554a45f9d57f0a189c43ee42c2a9a1af9356e7bbc387576f1325ef20147a077226c7f79bef6791f1e88cff5fda89d0475e26dfe26d94c5ba4bc839a0a3736be498fc7469dede758e9472e3214ea0634d6d8f0632279caa80bb3b8712258eeed26e2129ea8806074f5f445ea25969961c5cdc18e5a49b7301f82a6b90a3af3dd598ebcf2f3e85f20af20f3fa0a7547e5291b2beb9b5cc44578c041fb353c60b31d3109c5bc89cb415cc0ecf009094463a46847f7473c766637928ecb890b75501ad2a163dae41db61b6947a903426800917c5831d07c6e8a41055c02b06e1fd7e2996601d9f981538238c4c14b27722fc97b7d050dd06082da72415f66ddb861b94e60b746f5320653da5c9322c25edaf98d35b58eb1a05ed7fdca077729d02b870d47192cfb5496881135043e7efee570ac10f876e49bfa6895346102226e410d8d7c913c25e3f9042190083306127338d310e9606dc623618ff78c9fecbb24f49038de9aa19558a2dcbc3a61c8b5d596ecc13ce29e75313a627dafa42931ed4550fad16ff9c10c6205b44c3b7525aec3fc8ad73bc3a594df6c5368f22fdac19b8243d0f1bebbcdd888fc8dc2302787d250535cb488bcb628cd039ac3b2e5d0a00164b5d4e54ef62fa3257efc023e64962ba4cecc6902628d6685a56d857bbeb4ece4ae3cfc577827bdc22fd1aa53bacab3a98fa5e5f2186fbb309416f914acb27369b7bdca0771bccf00de33b1c7e1fdefafc57ba8475854244575a880d0dd343e12d8c66c4933d964528a454be8593aa6008ff5dda674f6e0bcd6a97c31e4f6ed209920d1fe66db0b120209f42241cde029472950739210afd0e06bf5b85c8bc68eeaebded262dffccaba19548f2a4075d2f40761238b34178a45f23b3e939ae911292e650e4e66ba8d078ee1ceaa3cdf784a9ba1064ec343bcd4af13f6df7d61507d141378e9122ec05f2ec2485a74765f9aff9314d4f64f74c5b40eaf4745cbb927352db2cdd76185f9e32b1059071da8b1b893006ca45cef47ff71268af1b1e2c7dfb410f5f882b2a073c339bcae2a2cfca3050aa9f64a210f5d9827fbf401621181d4362de410f5b70321afb7b556811356e61cd7b8bd69b1df0c2dc187c052514459a197b8c4b9ea8d2a8c0ed45a554d054c6a27c6fc62604acd2946f21bba8736ca8c89d1b860e6985681102843c219959aa397093c665ca092e22a19f09532e657bdb872923eb20fce134a406bbbd3572064322b07a09f9ee8f207f6075b32416fb1a926b5c4a6194f9e34419fca9e709ff7bc60291a7f52338ce3d7ae382819e8519e253169346f73968647c2c77aecea47da6d728d982f121d62318e77540a1e16cc10000000000000000f495260500000000af62ca71f4c38f2e483f0a07e86c6512f45e19304595706a31a3ecf8c1da696594f0d799a80e9edd84bf3858e5dfc5820ca35137b1064af6bb86f9e6fe3076f389fe10a0b2d691d7404a88b92577eb5c3c3df6258412eed4b412cf32fe62266200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d175109e1cdd1bd4f4ecfb8c5a758633d91fbe8eeb4fec9ca777038a9fba3fa32cc0da6f4f3544fc967aed28a26bd065140f8be2a215c8c8d1fe9badd87d4305ce492118d7b0fe70638afc7dd0308ddbe3e977a945eaf23766d1f0b01f16fbd9a680bcc4dd1ce88d4d5cce23e4b35446d70d78d2bb06c9049ac44f7c05a22e610228a5d2d03b53549d3d5876c75d5922f4da643f3a31bd6aff4093304bfea63e630225877137e7af5e3c740411d4efa39aeaa64df41b9fe7d76bdcb3b750311ba1b30b0842b36db5b8aa3c17e2d437f754b92c6791d208036b21ce0b6dd9fc175d04d46f6ec82f3cfce4cda7efa0a3e711d3cd9b3071a17fdaab070d37581f0cc970ab02252fe6934acda8fd8fb5c887fa6999442fe0ed8aa82571d5991a2b8f9c4ae60b020bd33798cbac93a3bd7513f8fe7fe82614fae9f2bcac6c8ee5c57e71a0f8cf1a032f312b459fbfc327b82ebf5fde59e8a1cfc9076f94d170e9d01def31ae4ca531030b13724db8255ae972de7ac973d351261f9a0d5d4afcd94eb54b85168312973f021fb30202f39fe4c75f3c151bdf0bc16522a15768a3389ece82551490453351a3363c357031aaae36111880439c0969d3b3c9e865d67e90d50d846381b3befc1ada554d172b10ac8845803267166efbb7d6fd10ffb0efed0808acef4f9c4447dbfd32c7df9620aefec49a84e16b3789c1133c0d4ceeee91648ede419bc2a28fa20fdccedcbb14b52345adc68bcf0bee10c3bbe66243a29b6ea171b7471475aea52c784246912042a22c630203bfed481258fb88ad695abfec842848837969f2d3285baa9c6f7734c21708aa547d495fc26763824b80f4dcf8864860dcd5abf2d1570120b2aef7e83f6bf313ce9d8d00d118c975c49f29db2a0b529bde93239ed46d448e117c1f170b9f066adb9268d8dc80ee0112e5a13987ceb8101b32abbd8e2657eb4dce91d26d0783a132be01f336f112e06416a7f3bd291263bc6ab522abf1f99912b7ff3a5b16bca84ce9914a2cbffa5c8cba9fcafac7c35768654fe2ab2fe81e35a7606de487f488b3d6ed8ab521298af8cdba105b52d49b4b52157b7519161dfaf2881e09bc6d58371f332e5955a797ad19a53896a63146b4c8a78277dfb634667173b1fbf6eb3018adcee8c2eb2a1a01da1ee2e424992ca9557cfe39c7cd8be9ac58fc67aa0c51398242f611a00003dbe536e174cb3842b3544c6f1aa21b8ea7fb2711de5a76e1d157bcd80b6e06449f8314dd9bbef87b28e9338e0b58420784e490a6191ea12ff32f7e923e10748b6c5a0b6fe700a468c04e37e7c33bf44b3b162ea4123461c724568e2fff173041db71706d34052ff65fbe05de6306e401883b922a40d7624a31c66bc05a061a601e41bfffad24f9a3f2903b00d537ffb95d822f08e9c12752052edf7ed4e150957fad71bc3054bdf9dcde3e13f7e31ecb9813482c2f2f55a569454450d1de2bd366575e8971a4df64fb9beea85a868fd4d23acfc856afafd3fe9db17e1e68281ae0d6bdab57fe1c7cc7ba2ba6da4f0fd67f28bde4df40d498515c2b0d3a032c5a720370f7ec19361e5e83702cafccc4b0fb9c253a297b6bcf68ae543046acdcacd7ef617c2d3c4c0cd91341411f7f4f444f252fd6b7d9f41fdee9eadbd761bf082151259638e2f50ce13cd561e2821f355d93ecc507c86cf34b3592c00d660be71d62efe18719550e9683915e5ab595afa17d16ecefb57fa8701495c172b2ae2359014a2ffe04fe7a8547f69d696852d37e9d76ce31eea566527b1dcd37f92384062c1ed077caaaef5180c3017b14a267c768476d035f88595a82086e192981dea4b90131257cee0914560ccdd13c094248d0562d956aef52c3fdc07b97f566bac145225a6494f3915949126c49bc3258990c413bad015e63c4602e4010fab23a7a3343a5459782dbc6a1132687fc6cc43ca931d1d08347ed637f1915278c01db568e0ee914bd9525c16d2ecdf31272878ee9c134530c9a5d9f3d1e90cd0044d3de15968586a3af799e7239f5187aedec1111b5a31e2dd8536ef9d637dd714929b1397084a77a5110133e079d68b7e27f4d677d85a3ddcf2956a20f54a3290936b34b16fb04286948f6e55e79b3cea6dc606d26f93d9d05af865d22d276203e585c247c6781fd6749dcc250bb0d39de55301b48f829585a24d4bb55b9cccf3ce8791a67c1b32ccc66b7c2d361846079c3a108df08d3d16669c8fb2d320acd90c793bc2fddf78d54bc0a6eaa97dc2c6f705905f8916aa9587e1561a073fa348d538c4605000000000000000000000000ba575e89602bb512fedde645d0ebc3385587bf89b196667ef82ea0f887196c979135893f34164ea9fe4d731389b5de373a0ff7b4268cff3a90309f399df9adbe081c889934758cede1a30c6d5dc8e2876e7c09a9d480567a3cedd8941b3445e500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000db9276014ef1b0573971da2348d0e6e72753f06a7d72bf36407db6fb3135c87194dda5c0719744d3a75660b24c2ebbec15007e0e7feea9c5734f2ec42c790d0a1b110567fcbf5bd174a0616715d990d2eb59a70ac4a890ea1ddf1ae87a058080a45d20be31e844b1e9942617222a82f0cc3c82921b92d4da37b5ecc9a4c239e30201039106ca2c61938c2e9388ec12c15f414f1c354b197fada334c259a2af3fb3020255902dacee254bb6be786ab307a44c51211453b3acbe3ec698de51fff8ffe60a0699925c836e1e3a08d9d89db9387df30d887f0c339c5d24e93f68dbe3e9e6b74da5f1b63132fa1a64b06d15ad880490b00bcc4ec50bcbef72efa3f9502680fe031fdde170a28960443b4dc15c8d27005f33f0b38289279d7cc17b07426880ac4c031e38f6d4678ce942a67f4ac9f318729687700ec5fb92a4fcfce29b8468d0f9d503197759f076211bc61b7cc47681166638a025c3e22f43f4679922986411f8e937032e5191e6f51ac5da0cadbf1d67f585dd1988c8a9ed22563752ad0c6393765bba0220bc35f9653a5093c96ae372a05d364381d45b84f9b4556c8b8127dcd1d635db6e788c31084ab9cb060dc2705ae2a1a5e083500853d47881c22ae5e4e34b8de180f9e2d020a4dab607edb9d4f87963b8ad6c713336dfacf5065d0a55679fa4387e71bb31aef94d5222909c066535335f157810adde3b8378caa60526630beed793a7844ee609714f5810bc4bb469ca17b52a86a3e630e9f9325fced86ee9f9f691f330d03f14230151d1608178c3c6848dec30811b56f91c7103d640f8f29de327528c92f021b1dbb89ec05b7766ce07d432eb973f130270d41cbf3024e037aa8dca0069a55b73eb9b5d854a54579dc102758b10d85112163cc29291081f8c93ebdf2f62357d5bb187002c50d9c5be5bded30ae714dcd2d9e802de31e31a49f4cf129418d8b01cf29bfc544bd1561a8475c03e2ac23e3a774500e3bc8743b497cee6851f11631f7d04b8938066ca5c9f7118e652b99fe8a34d5d555cf11b90c9cacc773b319f86f84cbda8ed5f56dedf51a8cc688d9f33b1f3e594d46b966959f46f146d9b906ee5f820174871197691f43b639eeac514172579afa6b878897c59cf5e9d564c05cd05b7a18d2cbd6c203745dbe2a7b89e981add12450bd05d4198ccf0e8332755c470336b24d98dbec8d0f6298bc0757bd70af737b35751b7cf6ffc94e36e2a1abc06ab6c5f64858899eb4347c06132d299b7a10dbb8002f5b1113e29280e16f97bce3c670be836b374d578f79c9bbf767c613a2c24ce8e3297f9afec09f65f3ce48d2ca5e305aaedee4687353d635075b633a77c5bb47df366a64e09e27aa8db24a116839e0da7bcacddf7284346136b48c78b434fca32e77682984817da3888724c413ee853d1624101b9a4239e313390eadda112bc73bda7188a998f5e7b6644d1403b218e959695a470ba25ae84d14c9c79f84f2b2fcdb1d4cdc7bfaf56551ff14a8e9095c545f60b5fda7feddbc473b3711f4a01afbbf4cdd0c466fce209c4786f0bd35602ae0532987262394cf81c4500cc5052ad07b47a3782cc71ae8cacc7f1111a94eca1f76759672b05c3c9fd3008584997d672210cf61686962d58817741ca0489056fa20d0b2f8739080a4ec44b0ca53eaf7c01f08d0afe2e00dc00ff73f7dd18212da1946d50ddef0d99933f15ca5de814a73f8d5620340beb2e0f16c6cf8b7e37743b9b1502e549912e0790885695888bc2f896451eacd5269d86e0a65067a4b1af9a856a1157808afeee263c5b223e15d6e80fcb77d1114903ba7ce190913992ef060dd1e833925c390d4b1e3c132ecb3756c6350273ce4b2142986490d727200373364d5e09a720eba53e95c6bf73c077631d14ee9a229f319e129308cf4c60ffa351d797b7d8f4be47888cfdf436a17fd789c28df5ecd6085aa53cccfdf07a3ecec25bde3dbd75f3f42d380b37b8d557711344bfbbdb84693f35e9096931ab53217771667aab28d3dbe4e07d30a07457890ed0a21c6a0cb56150dc551df72f4e60e966db697c0aadbe6edad99388ca7a618c286c0bb77c5c067c2204aea8c5178875e932bf75750f1cd153da3dae3c8f15af1cc90e810ad1c98ff63d24b7a2845931a020f257385af1f7f077ca32953ed890e366cec74eccb2762a1b58d82308ff4b3a4983ce89fd782eb2e83eb74e68d113a555141cda923156359e7078b007f3af124ea8f467c1c5e4f75b85a73031d06ab000cd6e256bf7bc85900cdd1651617c9d1a6f12655f2a448fd2c67bed3b8588aff5e794f9da404731e5afba68d1ebee558aa8e4cbfbfdb3f024f07c39559dccdf80245c33fe00a4fef1f9dda88784dd683f7c77d5b48db73f513db04e5ca400a6eb392f6ce94d7b0cd3f98f42cc524202", "5300", 3, 1571146707, "14982e6ab1f9b3c5a5dd150c8a098a8e110c2f4a2a3fbbe6984d5d72e3cc26d9"], + ["030000807082c403012d5017a7ae26c78b5699d32a911a64104b95a7f456710ac9c6a2c167b39d9bd20200000003655100951c0aaa01b2189605000000000463655265fb644087e5a25d0f03b7e744040000000000000000000000009ca906e12e08c6145866b11f03281b6cedcc5213b3a3c8fe821f2aea571d1c42b639b64f2c5dbb0dfb06972dc9ecf971d08f6241abac84ddff7b5c366e60f89a3e856031b2b4b6c1d86edf623dfee537747ab43eee30387120c0012a0c8459ef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009000a8b4aa20858edf7e6aed6e58b7d01b5a30054e42ad8b2786758568995a5a5b6bc7c05f985874bf9ece5c103bd4915535f7ee6964146ca9c81fdaf2282baa43ad5b7674a9eaa25348ee8f0aad13cbbf52d62b3aabbc17d55cb32067f012660f7b51b5ff790f304831705c71567daaca588644aad8626ba3f126adb0dbb00e02121100c03ba0adde27998380f11dd163cd574fe60f8d3dd4d926727b145dcfdb03189de18407904d06c8c675ae70a5d70fcb0a8d0d88e0dea0ec4aad98b8e5ca690b042b61c1f414e0bb2dfa0400aa8dfd8f16cc875577ceffe592b7503b5b204a917a23ec31a9c25146e6fb25d399a49efa0c3c634c7336aafb843bd0680a8334430206104215519460e45faa1d0854187b291ab9aebe1957ab95ea76153d5ac2f628031123d6ddd30544fc4bef4fd672d2d314223e1bb15dfa0a9e6ac576a03fdcef190229d8d52453593fe22844eb48a65f8d193020120297170cab45833b0d43f97207032ebd4faeb52c5f275856a6d6d68e60439556b419f831cdd835e1958626b6d32203230c5f57efcd58e80f91ba7970d8032da23948d840d17ec80e0946c681406ece79f81178fb45ed2a6d7debdf8239428e70b634749a43a11faf93ae48662dc70d8fe70c60518d5944c19db933913f4f146252eabd853b25caa1c4cd5f0d8a98768bd098867a85a13f266dc6d531cd18ef74e84f144fd84e283414789c8e13b0796c3b650d0fc7eae6c4e722c41073511f0823373d55e73f3ce19cad18f30951a53fa05061edee783890f82805f035f6aa578067ae380024de0d40d8c903e27c992ed95c556400126fff760f0feefbce82c94ce442ddf266699b7123b53f74688c5fdbc7df003049f8bd78dca0ad8233fd2918bcaa6c4c287212de9734bc0989881ad55ade7366cbda59f83daa6459c6a6375e21212d024844db4c1bc7082123b92cd9e73dd6b863f0688cab938c2ac3e42564c4ac640e3096c46417c640b33a7a67fcd857a646654c2defa1d5e5b6f0fd0bf71c57852a981078eb581054dca65fbdfbc6f156b0f842c788eb87ce58fdf8bc87f26a3a830101afaf26b55aee5f27aa4cffebb63895e93ae1bee2cf269873be75b774bc7788cb5d3c5693804824583412371e1fb7118df4f7273bf08df2679a4426e43f95d1cc06c9bb5f1580f4061ff7a21db91d8f3e4378e801d34ee1b8fd11c2c8ace4043c21e838decb5f6a7291b4d0215f56d519c6ee962486130fdaba6b34c0c82b168d3ff91139559615ebbbd012b42ee4b4c7404ac790db212928f892a696d52f48a9b27a7676cea1c4be24b6f0d03ff74996574c84f25156e80f3af73a99361f0bec54e4da8cb1037b1fed85e4e9d712620818055d804633c1345b628b9f759b07790611a2b30c73f50fcc305f5b28fde529f18361eb3607af8f947f9ebf14dc98515b3fd03cb01652b8e8a0426ca719241448eb2d7d4f2e3c4005d5806f8154264f30f5341ef5d00f4ed665e1e5904eb822e04aa71b7f8fa6039f4574149f1558ebc876e4350cc18c39c30c3c25a417e1723a5e4906f8b820d4ccd9e16c52e0d85705901137fb2c4fbc5a43bc8b0fdf4176a13392e777986db1f60c471b1ee33498f57972b34ceeaf0e85af611a9c4e617ad6fbf61dc5c8e5a8d09910f03e88fa25134978bef0380eb3f767c3dfc29d3ea3a1277e2d5fdab8d0bcbadf317ecfdf53640bb3ac56744b90ab8ab2198838b752836d62c76bd9e86b4548737b3bc97185970bc3461a8b27cfb6dc283e4b939777e6b3eaba58e1e0f202dc396fb4f04dba72aadcdf1195e85854a56092ce9fd1ea4575a395d24582537f2106ee19c0a70871bd9bfd7ca1aed2a8f3e5daf5a5e0f80040de0e41aad6978bada360fc01a6d151d16ac45a3303bfab242fcd85195f72ead76b7d787a0c919bef7d28672572d8bc82364c23c72341b9669220463955b6974b1d7d5b80ecac5fefb13f27ce3f6d1e23671ecf6a09ae1829abda8e9bea4af65d0930f23607b94d46f600918341b230949147c5b42165fe5a5fa1526cd07e6b2b4ca620cbc4be5a904af0bbdd343b5ab92e021ee3c24469d97adfb0cd5425a53bbd4befeb09e095bdffa1cc285bc6ef4de3697f5d68cf31e0fe58b4a7dacd98578a78486b4f15007944ce402a12acde2a6dcd0d30a048cdc6a56cfa3774a2ada73508224ed341317d72b3494f36f6c65ee11879d0688757d4d1bc6326ab7dc2e1f8d36a9adff941fb6a5a3076a8ce934f2fd780f55fe983645a1e743120d11e9f19fc0813b564a9afc8439e050000000000000000000000007c54d75ef295f15fe7b65e7a1b10c1c553f5a7f97a621001854e73a66ca40ac2faace281ac456f94d663067f0d86accef37a5374c3d4d4ceca724beaa7dfe4ef5cab8baaecf35b4b290bfbf504fe523740e75247543c7867327321b66c0a048d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d2036570ec4f58789dd9dd3408d56eb29d2adfdc838527ce6b350f00f76bff5cc9a23946b4df90c21dcfd3df3306ffa61b33954659ae3d957315369afd10c57c73b7871ab21f31e708a8721e4d36c6e2411866de04a1de90948d2713c617cb9b121e146194ffe6e41dd5b156f27b245c89afb21e41044b5336fd323d02e3c2c502099c769d349f82c147c97884e62fb7a4ff9179ab5636fb509960f640fc99abc203057deaeee5f927c5c5b37eee5c1f15c6f91a60d046e138b52b34f42cccff0e010a03f17a5f02c9e95b5e6c8b5a373b77a90285d98145f5d0e4cced2e05a0f7b77b5c747b56b729faadf057c94328a9abb466ceb77c1fe5fd9ae589e527b4e2c3f802147aabda7dd151c52615e0fc15bc0bad313068c0d01a02b1badac836fd560f0c032e94cea5049f46c30d13be7543628b548074dd40970a41e0731b2041ae8babe9032db882b8f07fdcd17c0772031d1d225294f23590450ac467bf2378b6e204494703128bfb5802df6d0a925743de97ef7bf925fedb51569f3a64080d83d7686545c70214ad524be83a34c72083be5a4fb4f3d6a3bdb9513324d3983ff966f2334dcd16231f90d9024cd95b85ec181fa75293fe15e9f28e6315faefa817114d5b3a516b8b576141619938d479328ffc43a88f882f4f48b57fd9ca475ba5e40ce5b79f3457c1825f488b1718a15b0b8cd9afddd366c88df7091ef9ac415a9f950401b14454023105ec2d835d40ec362d6354b2f3231a42d30c0586a2054af01ab6dbfa68b33d22dcde518ee2a60d1bc1f4ba2d313945c540225e358a70df2f839dc033a99817d1c53c5a4b101f88bf6563d25eebc6192bf7932016fd4a058c574f8e5c2cb639b5e435b3f1d2e2adcf729ad909902734575cdd83bca78f640a75bc733c6fc8c932f625f864be172a7866fafb7f05851a67421387e4f8508e369ad755e16243da1507b322993a1a200f958a2cc3f9b349ccba026cf39828a5a6b38265b7cdf951eb4fb86d2cb075549bc6b589f75244b33f448475dd5173ee2b83afef3398ed5b5238ff1a25b13ad3730a20341a06d969a69e8f509728708cb8b5e87e2155e00c928908019cf885858a715668244b8644dc723efc37a4a58f1549a971638e7411b85bf54b59aa692f92574edc1ba6ca107b4ed621f8daa919e0885788e5d53be02672c0d38219e7b3c79c83ca95f1d9c4454cda32e1f536c55a1b8dd76ff151cf796b5a520b09c2118796d60ed2897c185a43e5fea0b313ead2b0f445f39b49ad47237729ccbdb097c225d6f1215a368d855a07a7286d7782be3b57de514926e7fe02f88cfa2e70fbd5613b130bf28c35679050a6d3d3ed88dfc6701493dc58a18ed3f7b661fe3b35448f119643f67a2830e14594c4fd371db0fae2fae73014dbcc4f9c8f49f20e57c0df615dfc458f04afc6368ae1a32335bf129405c9a4180806c6f044cbe9fa74d25c77035561c5507e5bcce9596177930b9719dce778d78ef09a512df017f7a8374064741e800caac15e9fc2668ab60557ed6381052aece1e1d0601969352b494bd4eca7dc6df9e7d59931719ecc24c2a85d49c69edda923083b0bf209dde5330cece20f6f4166f6883e4c5aaa077069dadfe5bda59b313f3a5932bbce129ef8ea8f0ae022a866bc508a6575a74a4b17b012eb4deae92a0fa9c244af5ee669706ac148f13e61b673eae41f806e1744db9ec0b51b06bed2537b439a4c783017e54fd5cc3299993c5e86dce4676454baad4f03017768b1fe33f3c60a53fc9c7bb9f690d4199e8f4534b949dec2db810259a6c6e5513bcee8135fa6ab34948b15f47b88441c5d63555cf9d5c863f5ba1f4728ea322644e3b76f6ad4b53a92898b0994b2667f25b1437703286791611a5f4c4f2a2cd817dd0ae2dc4f3c2c093554d518404597e6b944f33227dec2b303e5f15ec64b4e56da56fd8b7ef02f293f484af7a819ab5b6c4ce1d621c816f561c44e5ed5a28ed412e32ac2d1b22b0e641b7e375cd1c1ba2c7d3d9ae0ee83e93a46dfa28a4e3d72abd10f963ae645ce59991cb4df28cd2f336c0ac54710e1df8ee7c01f7a4258d15690bbb201e2977b242a80e1bef0278d63ab88cb81886c7e7a5ff6ccbb9f2dd8708e9604df3af08444a26fc9909bf0b50ad21755ab34815f4e98a8332716fe14234e8cb1c312050060fcb15803abdef39b1488366ed2188ba55800bdd291b332099b75899a471e6a1f40640296226a2cbc5623335bddb091015216bd25225d63864fd65e8d2b336430ce8489d1a8240a0d4ab10000000000000000bfa83e040000000053659b90adb6623adc27233f264a2dc3197ff28b2979fa280bf916fa3354b33678c6ade79a080e08ee3dea6b789f57b12292634e6b4885a637f5cafa1987cd71489f21931e79b4cac8115101b7ce29cf4a58e924dbfb97ad75c9ea53588a5c6a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e5438a18960fd5f3c48302ec8535ab2b405ff42993e04dbdb011b79d9d53cfeb25fa26a6e95ed13605922186c4382e098620a110defdff806b1f0f703121e996d301c94cc1220ff186ae65efb6c4a732769fdd43507059bd3e460be1f4100d5c393cef6c8b35457c88148832877c0c67917a31e71e46da85a5e9374c95b0a48b031cb85d36e5cbf647794a6289af5e95339244dbd9c0b5ef8a746dda363d02f8380317a545a8362cdf477a038ab7122422f23dcfa982d7e02931367bf581d06914fd0a07cccccedaba5fdaa8a672f595bd8c1704533c0b4e8e0f83a0686d277713633808b5a70d9428de90377595baeb9a4130b3f40f70c6598748c554ecba0a12d346022708e399892e82deeb046c67da410d7d1a51ef97b605a79c7ae9ca669320455b022a1e4f56b05dbafb04b11b45952d661e758d46c42b7304862b5ecf34ef7d5bd00326470e77058e3a85bd00497bfd68c94aea221010833a3283427c3728e4e25f8e022041f3b7b288406204095deb4ec2fa3e942b931337a93469ed0a2c14bcd19d53031c8969c633b40a7d3b03762a39d7ece948ea4fd9bc20a82a34d232abd903873a66c718349bd4a31692ec19556461592fbff7166e41a118f88d150bb33174c4336e7bc253b8f16dd40fc92fd2285f34455085992f9fca6244216ea8855805abd4f50f0769a9e0a942933ee08c5e6dad62ffe862b9712ed795e0d56f2cd7c57ecf3656c8e7d4e56650c76252f4391e0fabf6a1471e2875ccf5c3c7ffbec974bdd14fe08e97565cb340af04060baa528b09a9f0bc4962348b9d882f22342c7f58408f830f3fd60cb8f71e6b2be8843b913985e512911f75fa69fa9551540720cc115fb649c67867d8fa4d9307c31d350850d1e73c7a987d34abaddda49805b3b1c4cccbd621aae37f282709709aa6e59df030de0098794de1ab577eb2fec82f133fa097cedabf3c60f7b3262ff986baada9e2a2dc8b71dfd8009c62593f1f2861e5ecebe28095830602ecf8c87b599aead1e30ab59f4c57764e946398e7e9a5a4568db67ea55237afa10d1df617e465b01bb4d4a5046d1a58e65ff60e2e4433a6e9bc0aa4312b902f5bc7f95c49b362e3c46d000b6e33d7e0be29a83bc42cd4881afdde68a037f59c95043835592b063d77f0a5ccf22a9583d1ddaf745517e3055e72753ec8864b35598878c5087ec44f569b440d75f661bfb8198f4b8e4f2e2dae29da453e3549bb5a2f8a5aff73e32eb495e6337dfebabf2dbbd3b4c153fe21ec7c49b32dd2fa2f97067354a7737f6f8f2367af6f8f410ce7f7a854813c7843d60a9ff0d63c07a9e1a635557a84dbbc5a50ffa2d6e4df264ad5e6b7677dd0f7f4901392b7d023c4cf41494cf26403325d63df29c4aefaf8f76646e68dcf775189caabd2febf742c9c15c745b9112708a1fdd3fe2b417b5d3a944c624161f8c5209438396fde4b3fda1f0b093298c2531aef727129b3530173c389050776eb46917ddbc2698bf0f595c3fe0005db8de5e7acaab23b8cdf7a4f1130390a3e4b91635ff899c1d72bdcd1a3ecd9f995f2f10460bee3b9cf0e2b8fe64460133785b43c95ddc6e42affbde665356cc1da238fecbdaa5a92bc6b9c5cf06142f286303c412ee91dda8b13070e057232a9495773c47b0d5ac15e6b783ebfea486aa2c209c769dae588f073c1ee0a9dced5a057000ed95cc03de449fe8b5fc6da5e48d6757e3b8cddebead9165ad6add969f7c929271cbcbd4401bc42d8186ac5c9e2444c862aebf640d441b07f77845cd46b9922893cacd697bf9ce90702ebdb85626f0eaf5ff6b7d868f3231266bafba625acd33b3fbb20dabb09f11769d31524b75e2135c857d98da3019741c191ee02c4294312ae82da83639fbdb9fe01d8d6cde0ffc51bf2bdfa5b0fec6d9eae8ff4a8970d2fe971d139d28eb00ddd92f4cb968ef7d491e7a95641e9a70e2cfb47d3999643d4ff1de07866beb129d1de4fa2437042197697f873addb405993492ac2df58729701a855194a4799a5b5f6442281a41c3853fb690eec27da632aa7ffade25a36690f92632755c6f590c7b0ea2e0978f66e4cc5a144e1f404139a0afe2a1e44c3b7ebdfb40753599155dcb4b094f28a7b542dfbec669953d6ead6e76e7fd1961bae84c460f9f750e4bfa4e401a8920e9a541e6594c2d3b0676e088dd401157d93539ab2106f2e4c4ef98e34f8437a880532463be7e03b0e9220e09708215321324e0c39a0b0d3fe545a981221b94ef23470a5d12238e3d540bd4221241e6ce426c8b372a64a4c3abed8596ff327d1c68388a5b77c01f68c43e63bc2fef7d04f8c7f4e4738d33cdefed1449e65d855ea3bec59ca422822830449c4d063af307959e5247a62b06876f084834ee57bfbcf56e4e2ec163fae413a28360d9c0ffd8d5d678208", "52", 0, 2018432410, "9c28db347617261d4bc4c85774f57946095e7f1d194eabf764340b8568328969"], + ["030000807082c40301deb324cee36769a2b4ec215514d82af156965f9f9592d36d7ef681159376ba2e010000000963526351656a6a6551ffffffff01e84f6702000000000653ac5253515199e4416e0000000000", "51516a656a5265", 0, -1665486074, "734862003c4c86f30939cef4c5687a31d41437a09553a2152aa2a97a9eebbc5d"], + ["0551791103dbc491e9c90f43806069c0a89c894c85115ee9eab2d11f9d68e8cf609105ebb40000000003650053ffffffff2899075fbe57b0cab3ad75b01efd2caae4b78a64b944cbd53ccfbd4dcc5050aa0300000002006385ff353e00a675dc15f5ef9bf2ee2de479cbb3dfa0cdae28fc392c5875abc2727cc7b5fb020000000153ffffffff032330ab040000000003526353a9eee0030000000009006351525352006a5241bd5a0500000000066351ac51536375fd3b3603419dc801000000000000000000000000705b7a4bea2b78b93cedd4a930fb76ba11eb25b8f9e8130c643e504e068cb700d483d1588f4285cbb770fc15e937a50fc884fe96a85b5586dbe1263ede60c4bd647b5022c4ab5ca659573135fc32867eede095cb5366f033a4ad038c37ae6dd2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003fadc3b7e848534241f448a0a12a5fd99ef3e98ac58e18ee90b2c1b4e29f4cdbee850cca7a9bb06b5c330df89ca56f2a5db0d07d77d0a8320cbfa69309ebbb7923f5c9b023ce6b063728800c4131ce909e0b448160a8c464f78cdbfdab79417c64190ff153bb27f109b2e37433d2cca14bc3b6f30a51a10f6a5a56f9b3f2d748022f9de9e365f8f3432ae049b32ba2c78d2b337a5a96aac07180f755ae611b562402048759c9bf6de700c1a0a587f85ff22208e826225fd1f855c956ed33c59a9e180a073f32bad36fb417cf9676cc97f7c5798c25ccd1e4b0096ad24a2978a3af76c0b97345795837fcdec2beed6ebe2f809ba129503345c7833c298bcf0d7618461a0312d143b5f1e816e2dc141567c936d83b2ab46f8649c43a3ff84b3bbe6f33fdbf031002ebb631025edfc6532600dc5a4db175740b098c9c371d25d79c5c147f33730317f694f3b2c1afbdb2436188d66d186c35e691d5cebf7c33009da267624c9a8a022061e95091f3bb39cc075cc9038b6195ae231b0fb2195dfa7e00d55fb838ace20321f274b97e31a4d893744f3c4b0f57df8b6907f3dbfc40978dd42b8fdd03de53c9f2360adf3e805a2cbbcfefe85fd811791684fe4c65293848a4f1d566dba55a22cfefd1e8b462cf80602e1cf7893ecd5e91587239719c69e0fbe45729fd2a133b91b2a27bd2c3f66dfb7e7f80e861750d79fda2d6375da4104e52db58b7854a1c7d4bc2db7c1901eb6f11a175117500009cc18dc741b14ed6dfa093dbda755d2ba146e5b0c4f61cdc6d130b07184876adb82e292faf9ebe14ed5dc0c73e660129fd20a55e5a588f7e26eb5acd7262e6acff8826bc5186205a3ba9c690bc42c390fd2520e9e66bf70065160e6bd8900a7d12a42931a0dfed1169068840d2ac6e9c66180846e4d93be6dcd31d0ea2d9cb66cb1a3962f192c61be0355c7b8719f1240bc4822faf7af2ba43037a86bce9895a976ec20c97f3afe07c6f12cf88a668a904e73c5f496457512e1b663f378b8c62f5f5868bc5d9431bd2a13b9179d850d6efe29593be1d133de9f3f724bd17a4b3bbffc71c0dbc8a8b0576d327b18f911001f77c67c0840da3f48a579c177a83f3d112bbdc3210519fc7b314f373c82871f6149ac6a162ba2197b3217dbdc26c54831bf7234a3d3104c38d60d448f1c4624bd0edb472a78b78de32494604b7ec68f925c3359fa44c085ec65f8e206dcbc9e7cf0bb15834977ac27ce3bbbba2f922f356960ec2247b479b01f43f7a9050b0458f9c475ecba0b7e629760ae519317062863ae72ab290b8d8cd6f1238da2b177b705f3aa526df32be4a543b743995a2d6b01908658d6770d03b0e1e7d7e06d2ee5b64a94eaf56024b7f617dd2fe80995c3387d9eb19a4e5ef2c56609b673d0b12e13ce2d3e8d049c8a9fd70d6cfe3ae6eab8923cd0214a4356bd5b8a7a93e09af2aeee56ab6f0c27b5237bffe705a3414033cb08e5edcd5506309cc66f8f6e37357ff038baff75c3d6225230278cc8f96ea281cc8051cf63579e895297a5070013b00abf65d3b827950d2a20f4106e938339de0bfe2fb963ac203fd11335dfe4d6b07c465212206b9db4bc92d4ae678d37a6241303937c528fce828a112c254dd924889da89598785ec8e0477b8b58fb7b873b6b05455049e1645aabf952e6bf0aa29e3735a1d14d0b8fc94d5ce1ee0cc34c861189b6b8b28c62f3158cb9708cf5b705da387c24e9339b2473590b4e5fe16bffa65d592d9cc8541958c62da10f0adc3b270d8b6e6c759f1445005127e8052c28969401464e127eaebea52501bc81f82910c8e9f7518fae2619b2a18a1091dbbb6075cd6787ddaaa5eae650579e138166f6ef68fcf684a6c3829df7959e0387817bcdfce15aa11e1a2f9b6e8430d4cafe8fd37515f789f22bbda5882574cacd5eea22bebcfcb7ac5cc97ff37d0b678b236334625fc519ae6a9c603152b97eaf14cfa3cd32ccf770cd1e1574ced39ffef0c23ae48d77b11084b2219034808458874500b2b47a9a2ba625cf876d25ed8528d0bc9b45206532d9e7ceed60c692a8df29c67a296830c1e0eb32e8fb035ece43d31aa9958277d41672343395631670c1074916100c94c0abae109ff82bdf286da3a4929f7005cb9f1fb70be85905502b6113d1fbf6b53780368f4fd35b59e422103bd3e7267b3bc32dae7415490c442a322cb32059052dfdfcf4d540dab165479126534a2d84451211cd98b68ef368e0666fe0d8f04bb656a67e5ef75d65336c9b623c45942c03af43158cef3ffb95620030000000000000000000000009b7d656307534259c52751af1700216ff5fe3ca8392b3a3375fef26d89ba71e0cb14605afa8c9bf3ece0aa6a89aca7127061bff834e0786cd7f57f28de39d0a47a712c80d083ea526dca857b82fa9f5da19fe082f32cfbb0e9f9304f4d5608ea00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a6312d045793da121f4133b90a60887956d5581fd3b5eaa911eeee8b8ef559a6070ba005c40073ee965f699dfe413555128617519598372892a14e200c5d27337b7d29b8b9054d3231fc73dbceaf8d55deaca0d59d02156dbae9780b342d61bc119dec2f996e497be78683f2fd313027c6114b842535b05f42de6a971e422cf703043b3b63f649c74c27d0414fbb677e7ec2a8c4ee22920e25ed2e757169e80dee02199893afd5e696230467c27c378f35fad88132f626410bbbc1416b6fc96ed5300a05e58e43143f5184f5a6c52bb57dc1010725cdf98291db45cf3596b23967ff08a930fa006f23be198f66dad930be6e2921b1c5190039d9e99fcc93155f74c3de02032b7b98278d602d038592c5dcf4b32d97e0de9258fce2b00bcedd558eea0bec020fcaf93dd16592f078a9af73162e02a5051f5f923dee2d5cdac07fedfa87989b030ee441cc9f0cc00b4c8cdb3e457ff8a404a34eadf105af811509a5811f9c46340216931746e124950e4c1be5a18f96704fb2bb2d8996861077d172da1c2e75578c031ffb73caf6c37ad731648a4b6d3eebdc8f1d739c2e610713cb370becfa52b88d68d3537ef04d9b4c6659dc9d0081bf57eabaac3039392265d37a1d2a5c4894c3587de8ad0a5285d6d7a8083315d9ea9a16008f9ab312f8593ce1bc56d8017a052bd02dcec144764c5ee2921f785a45c0d7477fd43bfb30717d2ea8bae02634338536bf7b2e95564dc85c55188c6763a176818baafa0322398deb062eb6af486fe4bd72aed9a17beb18058e39f509f475faa58931c47ef080203cd5e32f5a545649a473bdfe046446f77a768d6e017a5f96b81e7fea5c3ded2d0b97794216eab46f3b57d5e33420210b17a4596a72385f4136d1c3108c400fa51539f7fff251353fe066bbea8fc57200c2888589e3beb600094fc1dc95568a9735f2b9a37f94ea9bc757fd4ddfdd344dbc1fccfd0336209d93728c3b0b246bece0f9d10d5b3f46ce5a1b625b2532e145f712b8a4c3652cf6fadc68176d47aa9538a7d27017e93ce7ee11c2e8b9eeccde299ffe47701157260b220bc5022e01e66dffb021df361b95f546786b74a99850d4d50dd8fc1fe2d56a86f3f8a24f13e565e9299d114d92f27c66af6301322d835ba5975ea79497be34294c58bec44c7884412dc8a1c33025c2f27a80b5d8dd724229c261991aa3dbcdb14e8bd6b7958be5f5f9c700406ad6318e8dd7676dca9fc36074ea69d7e7e2711bd4d38f00e00d8360b3e926fe9c52ccc1b724ac21bef882092bd08dd723d93661d346ca5616f85fa1ec1ec1ca2a59eda4463058d0b8af6351db6884d6e8265f72264a47609f603a9a5bbf64024b8145a4d62f4ed9a7d6ff937993406ebbca23d4d8bb617e8267f3fbe9cd2b15ed1c92175426310f533a9eb480f518b1531b3cddb02ff697b24bc4456a6c28a5d90aad605d979e4877dfac1c20801d80cfaf4b89a377d6bdf731f20029748eaed19865d58e81211ef5e906181c9968622eaeb31687e2a2f0c149c2af7e0408f106acabdd0390688259f59246774e5a33e73ee99bab1ce536ff1b020aca0fd4ca0ba1e4258d2fef31915b78397225417c65370aeb0d757509edde16eca5f8fdf5c720f3c9f1b49f6cd1780590618cde793e304a398ce9419b3172437fed8500a3f3b00fe2fe88336a39832992dd6ead9be19f8071330c9b37c8a9cb5da4c2d2e532c06efee9a4b0336c16cc2adac507e2333cf8af1197ed3ae4388a924060dd1342a3e2851b9cc863f08ebef2d02e0b30aa4a914c7ca967cc77763abd1508ccbb21836025f1256e7ec654e143c00da407757e79dc6392c2e0672f37839ffd0654549bd19be3832749ffb5f82c761a819dea50a33243d60bbb436449f70e93b95d3910db387d2edd82d9454f740ce0743afffb366dfd14d44baccccecfc1bda298cb6a5291fd997f728a2d345df48659e80994a6c10709eeb9c6754e54a13afab9042894a561fb295df491032ac8b995a3b623e7080702df02a7af82b4333e48610f3f5c60cde81f0b0c475a6582c294017dfd2f4c64239a132a1e1de3602995ea26c39779d21ce65df66f552d18af16a91cc0ea2945a5e06ca4c9bc2459a55c822aecc9d3f69f3e51e1a0a80b2c36b518a9e3da92355ca69f577c3a93e44f05fedf7e8028df8bb610855a485bc558688c7b578a7a576efac70e5019bb40797231d6b42f372d799e5aaeff2042f161848dddbeb5af48693d4f6e22575b8f58e4ce1738fd6275693daae8fbe4566ba912a97a534f5953d502000000000000000000000000f0369b9076a387ab5983e427408878f3149dd78aeee88c722b399980b8ede92f6b509ca6e690fe9525ddc662de9b2e88c64e582aa647e536fa01fc3e39c849488ae4d509404f78330d08e30212bb20a72b9f0b841be11107d13537c73f73d7dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000788438ee00d8223bb0ad2a863405aac5755a1af74bf701c8cc47431be606971495b7f0a8d3132d6b1087b5b235cc4c05c64914005cf0962233095954c427e441255c7dfd8f189faf83241a4c5374f17c144472e4a11700aa45581fee394befa5b79ff9d1cdff75f22d80739ce6bd66da15171d75aaee40d21c9568e4f6b8def7020bc70eddb74047da07199cda7b250f077ebfd86a3af599702f0ee17983cf40d6030d081a40b705139eb5166285b20b66c5bc6584dd06be6201cbe7a9bdc5988d6b0b04952dfe62056b961b3a876459409bf0851b34befdb3b94cb45fd6016fb26380d7cad2e5ad9ddc46aa8d5c7f6eb2006106614428ea9bed8e21f179526ac908d3020d608903f7e5c1529e42ab3040d0cbe3d211b9b2e13fcdb69e4ca17785ae157f03305b1d582808b36a7b68ec6cea9a7c3e3baca857c745cf7aa9e8534b2fe2c8f10308323c4bb0784f435c134108161670e71d781cd8eca5f137688c04508f024ecf021b0f19b2b6d7ec25dd58c71b314e5f2e02a9fd77e3e01c2b8fbeca5d035283ec020b9227a0458cf11a00277929b101e562ae3d354dc0119d71db3781c2b5d7f3bb5141d22fd7d07a68b59196ff2ade75726f5625c9ff82960e8883913f3c360aa8dc8b3f05231dcc89a8e6cafa3305e8a404811944ea700d4da69b9fdfe039631a7fe292c1a888c15166a14ed274ddab73464ccfaefe788240b065231082a74c69fdb10094fc8257b124c7f54c63f070b66ff6fa87dbf6ddb31b37a4655171ae1edd351df13c527e6d6fd8817cc5cb0a1e3b928579d7d499e10bd6a25e3a29dd43dd5e7ebed388351352f994bfed74b78af9252cd2b2b405fb9e7c4df837f756207ac82dcf1fa6e9711242a012f9ea1efd1c81d43f5f2d43c8b3f77fc0f276a62517b84d1e641e728d2ffb6688d44afabf51ed5f179d54e8afe301b803b72eeb586307b1a28a278ed1ff0b8f1345dd96febfb91b11cabf023784e53c1f0509f28759d087636d6d726af63dc9afae383c95a72dfa2e4561364fc186a971fc9ea9fc9406b1d4836606c61ba5e5f58f66448d32244551c06136f1233a3959214a04c39bee2fe45ec8e5cb112b18b209c48b7d7f21e09e31edb8cf29175cf8d317b5ec1b66e778cb31e5f2d7e0adcf84dbe8077d27778d759f5e03e34c6e3d83266371353653b82bb969c793c7ee68d04d08f539a6fbf1aba37c2303014f012aad740631914897ced1df9c03f56ea3c8cb09123f0674b8544a06a6aa0d9fbe42c505c300a410a2cb1512df3ab84f7c79d0229aa5cc802a6c8d6064089d82ed08e475f41edf00487fc56dbb9ce818da0f63265071b1e2eb281bd1643adbc2471e4ea0f326463e3367b3891384912b186710d23054261f699620d943e0d1f194f6a14e4ebf082c01cc3f8c1ad7bc29dbd7c3f9fbaee9ca54a8e019b22907508862d432b3860adc9445a9d59f248b29fff42db4c6119016c594c258329ab471480c0e319d03aa162cc7a5a0c374f65d0b3836b8110f8ddbd524edd4d1afc04a3cca5fe533c74adf598059c39659363483f1127943a91445383d31ba477b3791492924fa256472af5bb7cec5fbd504a7b329d2ba05dccfffbef4188a8a55ed990fccb0eea795d671b30b67a13b39f72238a62cf42943b970872babde757774b806cb7ad66a9a502de87ef078e3bdf9d56156c7f126a066b805091ec88744a925e4279934d41f842524ce586723607cac67bcc10232cc3897e6d2ae59202c00bf8a200e86275e47feccb3f6f3210a650ff40bb01e78d014d85e2db82318285f73dc03c7cb98e1d1b96bfc48692da249feac935498c9e2930feb5a13cdb54550b538b7398863a73b83880c4cc287b2dff1c42774562e45e672d5d31972e42d6489c8d99e3169de356b854ccddda09fdd9c19f866a7d729677064f84e00b2b9a546cc50dc7a5f6f1e956fc54f98dd742dfe227bbcadd18e6c5a0f8164b201d092a0338ce4f07855b42f1e4ebfe2bbb91dd584ed8eda69a3a056c781786b3ef16e67d35fda32f9ec4f2a991abbf68b42234c191e6219c9812df2da8887836320ea29e0a3dff44f9df65e79e5cdb32ac65496c5359eeb381c77b7a899c90771d8da8a891ff81bbdfe985f4151bb5cacba5504b7f6417a4a0c40a668ee751d1f53e3097aba4eeef08899bfd020781ae6a9aa1edeba7966907c5120ff09e4cc69ca76a74af8a4fbb6fe58c288a552894e2670c4b597eb5fb095d7be8d30889ca3a0cf29c2412623be9a800a78e9445d88456e00394e45726798c7cfde36fbd3a8c063d864b426a684fbdad6a38aaf4216fd9b1ef23bb6257a1d725d69255e3b275cabcd372f2e05ed1a9c3c2e4bc3f2679fb03c37c1a4d889918962af972dcd01e804055d4daa91628ea7938a44e6ccd94eb980b8f0dfc51c290b", "acac53525351535100", 0, -123431435, "251a5eb050b0b6f722da95037514f550ff34344828bbfcb35d05b2c31c281488"], + ["030000807082c403049b6943c67cad93d18e9b2e49958bba2310229068f5f8ec6e0e3b798f71446bcd020000000700656a51536aacffffffff13b8d724283bddbf443e86913d726a9477515296adaed1486c72b38bbd5508f602000000075300636aacac539fa92e666375bd6a28acc6293f8279a6782bb26802f0749cff73c17b0041df862fcc5ce6020000000700636353000063ffffffffabd16ef9ab11c510c07999737511194b2fd0a475ac9238f8e10f216544f018590200000008536a6a6a65656a53dfbd6127011ff839030000000000000000000000000000", "6351525100ac00", 0, 1281785322, "6fe168dceb9c81e7cad1e0274e20e287e44afc6edbff6e54b2aca8c384baf41a"], + ["38c81c7c021737903af5eb3dfef84e849f9610de5d3c1fece6da1b679db29473178920479602000000026552480baab1de809cc5ba3df18ccf52d9f2adf3af4f9f92ac3c00a6381615db5be1d3ca5838020000000151b459771b040fa097050000000005635353656ad9d203050000000008530051526353ac51d59a01040000000001632ce68e030000000007636a5252636a53435c58e900", "ac6a6a", 1, 14067726, "f557ccbe534fc484797ee6bf7a42396c0211aae6e9407d0c9c6369349e82ada6"], + ["8aa2ca28025f02ea90983f5e08f6b30498bc1ea867d0efe06a1271eadcb42157ecc9aa7a400300000006515251655163f5884e88a73ff63f1e2516240a9079ff6743254c37f886812870cb140310ea6f5f57afe702000000025165a96e647103485dd0030000000008ac6551536500006a07dcfc0100000000056565ac53006e5340010000000001537b24f3bb00", "52ac53536a65636a", 0, 1170681403, "fdfa080d47d4d1e3ac94878ae38c3f6f7571b1c41edb6d456fbd390a185cae85"], + ["030000807082c403017608e96d09e106f628dacf4bd141a67b6ec2dac3acbbb17a5ece69411572f851010000000351ac00ffffffff02a112770500000000095252ac6300516a536325322d010000000005ac536a6300000000000000000003ff709501000000000000000000000000b1124d20f40094fdb48f60feb9f5d545c02c69eb4e736eb0a359b4b77bdcedd5a9be56d955019a8e85f4d633ba793620cff9a50810e1b72c98718a92852bf7b663bf4a0f55ecea4b23087c7d2e45226256ecf90da0b75f0a3cb026d6d626cac4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c9f647e5b46528dc74a7d1653452fe382b8dd2dbf90ba97a7cd97dbb22b3b3d69e006c40c7b0a7d16a1b8b869af3f9410998d33b20fe345860fe886a4476b388cde57bdde7b64ccbffc881374cd223cffc4981dda5cec04b77c734428f817009b9a10ea25ba52f08f85f945c22012cf06f57136d0546aa16fa8b0a5d04fe090021cde4703134b00be83f200e5638c1569b95293c89bb490c81899d77415f028690219c9e8de59a323c171e3e74b23c013bf9051ab82be92f3e26c44f91c4fcf97e60b08dd7869dabf762277f9ec691c98a330a39b6b6c734dd1ae75deb7d2389ec8d47dd204ae79a5ecc13044bfa633784437f6d514dda3a359428962300c16442968030b80136631097fd9ca79f605b2c73280be1df78bee657896bbcfc703f4a9a9f703083f259e872c1d4f8d95d52d784808f2125f9d0bde83602af7960b9f937c2e7b030107a5f44d301e76fc7bb57818642511d003b77d276fcb317b8fdddba55abeb9031c0a800322fe0f2eb16d00a5afbfc448d559ad4daa75bebe99aff4a2176bebf702033370b7e845002418567e40d7f30eb83fe654ef1277b8ac593f9cb3080a9b2562f97cf41a0746ad00c78db413536f79743ba553b97ffcbb6fb7aa192d07b23348f75f2d16fb0bf402ec40bfd2dc90abe2f996e11d71754d8049353e991cf6cb61850de7d329f849be2be8d5bcdc24233f0af55760120f6473176e868f89f715f0fdf97143b62d1e2fa25ac70d9c0675e19ccc078349758a8d0134e4f30d647186b69d2262f652391552570da19442edafa30bffc88fec3f650702ef530087924ccf4cea92e88349765246598b9a326faeba96c1e35d9ff3add244e5ba22ceb5e64c60a06d5d382e5c0d5d22cd6ec49c0db26f1cd48888b5f93c4614b7d1bad6937d1f207019e1b6480e3101f9d986baba8acbe6933c581966fd92af5cf5f0c0dee68dfb4b024ff02a60a58cbdc92345407631787928a8b189dfb76b91e531939732f15cb7a267ff1bbe53156fd87f66ea588b2a53f9e8f7474f90bfb2e18facf41fbdc44fbe375c76f5719e85115ab8c290f5ae179579cbac6ca303d8f13dccb802870ceee655e93a4c2d4d32a464a25a314819466a039896578a1651b1779ab394498eb3eac58614fb2675b3a67d7f8dfc1d65826b9ccd49a2c7702800e2e300286f4af1f01adcfe0c832762af5ab06ef0164ba99d59250c9b2a0ed440e20b5cb54600023def7d61b8f582d872e4c54ceb24a942ca548314873d875b430818d9ba84d3a620c5625b8159b5af5a16166df4507d5df8417ccb3640c7a6be292a868e6cd66a3a39f0fd1fd64ff32de2a3cf217eb6cb845e20006dd71252ac61da93b5dfc1e56d264cda6ad8dfc80cc7735f77939651bd5ca2ddaf709d540fcf97c765dcfc243ed0e4308d96108dc9288f83f9b6047f62cfde83ff8392a6d1acd1d06231825000e6fdac25a765d4944fbe07f528fbfd83ba198203ae1378e36d3560de31dcc5db8b855a71270a0be46193cec665c9b26e61d71dd81074428c4e531b4a860444d7045e55cb4aa22b97ec4a191ad6f2280d50d5975f7128a3f606c077f56bf5c5ee271f37820b87bb55fc9671dc994715d338c89379510ca9ccee512fce89e13292226788cae49a57900dfe76c5706581fad033fab3ebe647c6e8c63c463c8b4d1515ec975f5e15ffefb097857a01df0ec9fd989cabef922747ea8bea02d77ff3c4c387f706d4db326f50809e81d72412697b34457ac25d500922732a1c8b78b7fbacb8fe7c9d65b030c5928108924306aa42c094340eb3fcc1906475ca055589b736cd1f7a294a88984e93fbcbd6693ec70da3cd36703f090183fe6261ab01ac8cd67db7e6bd3033203f5c50feb537ba95e2796793f886d43a7349de265bc1887e1d136074879c7d3dd0fb1df8e778f3b5f3c65afb882697c2839e9252e94f3abac6b494689663895718d05a6b15374e0e60b09cae6afa40c4b57ea72f2b32854696808b114b4b1f605369db8c6a40af2b56dfcc78dbb8edaa406b92c5a620bbbf20bafe21d5e1f213d477b840640ff687d8807f60ad1d0b281c0fd099f4d78cebb8de6447fa2b63705652aab930dd4db6ebad72b9bd834e6194b93be0ba57599474d80be575d8cb4d03b7a9783407b4f367bcac381fd00c35b6257c46aed4e1465c53475047f5a033a850dd1333fd3c4e7dafff49db6455b82937752705863b6c7978299534250f4ef50bde3330cd8e26388be3060a0993a450a172e8b9b4b7b640a931ce08b7d7052c89d03c65e2b7040000000000000000000000005af4243a022a4608a3fdff9d57a1b19e3347b31f233c391eb4f41004fc62335db27e5786544d3aae6f030113cf3b2bb4ee14c315e8d8e96c43f0eafdbcde83a550a0bbe497c1fe4cf85ff9d9d2518b0546530ad922a17cc7ca0e997cbfd4eed50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057864c7b89aaeafbb4a131a2ec4cd12d05948600c4882621e9a87f442935291808e43bfffc18f2c56d85c03bcaddd05d0a70d42f71c7bbd6a77d64bd8f8d27a2020c1240c07cf969e49cfe53ce7b0bed80fb22ce862fc2fcb49f7ca88441ed5b4ce2a1ab8aecdf63e9adb60044321e4d689f64937b14d5ee0edd94661e43dea90209e27fc35db38b92e938b95914331ba82e99b11fa12770535f90fce77cac9bfb02239b700493a2c183454be617d112e50f42f0c2cf8da5b97eb2fb7d776727c3600a08c419fe5125748f7a3a7462424840154994509cf61fc180172fad1f43d085d1c1e5c960c0a3de1be552f20b087c690e9970094aeb5dad5bfdd994ad87bcf9fe0229e90c7e3c240a8e602ab829feb388165ff06b3636cf79457128090f8118f014020516953f8fa50e4cca833a943d3240be16fe0d8b843648a2e582376afc03d049020826e21044a99ef40c5491b234be6149bc5ceb791fa3ae592245b0bfc970e182022f529566b2dc58f2d6290deacc155e47290f2134a7a2aa781d2187280eb8e5780205b07cb4c201c1ffabb829996f50f9c5f728bb608e59c19bbb29223a3a3638f3105b42ba690c69848550bdea488f8b4ebccc89b7e3cc1d80f2e42ef395299a44c1ace092a2d271885d47c0fdef97a90effc76383d0c6d6cbd7a798580c0021fcffc71a99d0e1c1fe1ea86ca58f84a06f02ac3dce11972ab7978e4daafbfc359712af396ec672017511e7fa08141479a36a63475211bdca9f8257ba88be8169f1ffe7f9533e72d7d254553a0c0e2e543dba493429dda77cdc9f47200dd7f172a40b8e3f787da1538ed4ed3945657ef59b01c8dcf34c359416f066fbbbd07c14a47b36b3d1e211c5ecef34540555b4de1bee24703ca9dd35d65b2639866fa172b05feb6017f9b64184700bfd1f3f8eae5986fe2c193b8d9105cef075a34177e0e670a67ac03ea47cc6acb8585e6a4b118657e27d7beb3928723dc5ec4316b2acde4a1725c3ca3df03d4f1c77a089c1ec76889a59f0a31e274e3994ddbe8ce6e359052640c1edc34fb4bb3361dd971aaf4eaede12b09c41500f1daf571012851f4dda4d0dad848ba9f6ab9da20f247a52990cf1d76b61e56d44f92a1e79bd0c5fb797b6d1302bf9188134ddc45377677bc766a71a5a8e6f1cabe0b4cb19a3e705ee3887170342442b045f0722e8a4f0df030f2f3c257927ddd22e03769a00f68109237ae375b8737b38dfdb672a51cc7bc54b37da45da230ed3d6b5345d0a4cd49ac1b18839ad978c42317ec72afb246314febb39a654e2f92d46630bd515d73eed5b4499a21c862728f567223764d9e06f0b9691d978d0881266dd2a6d64a01832b7f22207d22c716d07217595dfe24649773d4c3005b1dee5ae4bbaf5dbba1b88c65f204466bc539a17a522d78ef41360d64aea1f72ef6d1213de83651955a3e77e5d2bac380e36c3c9cf4f938f6f1953e9f8c9d609801643424d8e43889ef9666c498b771b86d5cc46af593d986372e830875c8b39113331026905bbdf5d14505ae3475dd60de662e9aabe9c9ac9f27ffb3568278c9583079402a15e3b01d46e81e6e5aa6c9ec5047f6060bbf694d17d6065238b0e80550969aa14f3a6a31d46077fb9e0dc5789cad0d34e3ae65b19838b76ad711ab6fc723e4977f5b70f160f4818c3a3a17347379d71e7ea307b731264d42c914f0e107c3c1e092cb767206e5572a0b76b84106ca50bc8390ee53b1085046c0e2193417d18e0ba0b1c781e9606b851717d62ddc67a3f2e7ef8cc3bb6ebfb11a108d093f2b51f27f0df804013d404cfa9334a2beee3acd1dcf016eb654c0c9c37e322735d4620d75ee13839180091c59d4ca5ff73491bcffe2c4f3a877f1b63f87928b675379ef2f42565f15155cb5d8cfc59b6d57a4c639d8d213c9d1ae8e701e2b6475c62b6e70904c852401f7ac9913890a49035895180d81fdb33aac316ab098f59c9bf9019349f5e570c38032800e71a4598d86315eccb40a795cdebcbd4f1acd29426307ce9c92109fd19697d392e9ba7a0b339fe0e92c052c6d2f911675c496d99f14480e7b44a1a40016c16c59036411d8e68248291034204987bf929392a9836151da52a171904dffda49a8cfbadbe25488a5f5cf34f52757c76c0e59c2c965d52db7dbac32cd091f62486ddf6bc9519cbff9f32d1e5806c0405e51e10e5aba2609106ccd67e541445a93786d7aef18042e188da5bf0af0e8e9ad7138f0954d2d3a4a2b6e3ac9fc28720a375b7170617b30175700099971fe762d45074020000000000000000000000008d49e4eb1cdc05fb9bc9c4c4a53c5644c901af3be2fae33d358d07c03dc3c0a2c96a9bd5700a610c00872f67653a4cb5aa86bc367398c5151289f9518dbb5f34592ee69a6fa98553724c8826b952e3129730e0fc3c620dda8978be1cfbfea20500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ea8da212d710422e468640599fda9ca15258779f6a06f7d90c436e9861bc7903a32b0d451f0bf97928187700dbb6c02d689007f85bcfa4b69dcf47dfa5c15becd9c7a725630366a8b5bfa9d0cf6af57cc713ebfa5b022b590ccc3c378329ce03a5c32da144109b60a1536a4920ff5f12881f1298052330f3169bc2256d1628ff022976074b285ecad8bd5b8716637c6769c730c664b857cb089eb9e73d68c5c77803168835e4be69f00b2bc7140fa4a4f9f8a03287404f2e4b1ba35fc55222ca41e20a043a411ee2ab694da4f54543de242339e1f39bcb1d1c414a8c0b025399a5fc265dd25c4632f3bd55fc232db2048afc565f509da1fc3691166c2c34aa1b6fece3020b1d025aa118c562c80f78f27f8fda40f2fb44151da6b83f7a5aa3f2da52300e0218645eadcce5d53740714aec709c840a526e1dcb23eff8f833529826c056bcd2020abb4716c4cd36ab792aa5a775c905e4a3c98eb27d38b0f8c4aa45fcb197f9a20216495e4c4e14f5845b951b1658ab44470ef5510ae87802673b1e36fda459bc3d0305880283919a697018d389647a9cdb95f07f473d774fec20cbee7b9d290edb9f9e51ac703e3fee006987a46d79f6d5f11293c3ed99806098c91e825c7676b86ff1a55ed230cc8779f160851eb40ac7e4366cf2bdfca26907f0e85e86ca4b4fcd599dda06e2ed0bfa5163bf5f9b597c3427bb170be6161b2af37aa528e0929c94de0e59b33417f967cf9cca1a2f68cd521b4fe32aaac16da272a8c531b11fdab79ec4ef75390fe6a16aba50662a12317aa0cf3cc605ea8c4f13e44e3cba49e7d3b26183b22623d1701ff43f349f9dde3eadb66c01347e4a415d69bce32c388d3fc5d6bdc6c3612b81bdc929d60d40e3a203b7b29e0c335bc170a796e9e6f07c6312286cc965afea5232a1bc3ba9fe63b25e2a28c2c1d0d6a87f28eef6024ff9a1da99afa8871fbc1c7f27bf562dc0fb3dd241db5895d1de2ed0208ff03f493d981a6dc7e5c430dac0407c381f961affa6f453e6f3516998485f2da44b0e7605f36067cf4af324b9da2616f69a70338b3442b8705955d3ab416a80e689e4fdeff61bd6e05137a1da16dc3fd5a21c61cc1f47e94eb0bd403bcc5e7ce1deb8fc903820543c6571d9432c687c6b40196c09aaf27c51a6b914d6d8fbd2796332ad7565bf02b25906277f79373ea49e6013a4c9cafa477afd7c225a254d4d43676c75b4e45b723c0dfab785032b879fde5eb93ab41e4888aea1da6fa4d773938542db4c60cc0bcf8819ba657be99700182c4705069d7aec27ad12a4538ec281434d8e34dd8dfb63a8e15738ab4ecf008bf3bc2ec99c6f91a6007f87cd21e1c7319cbb365af7abf0bd405a2b721d7b14e16642704488ec2772bff2a72056edf063dff27dae1d4ce1beddd671660be81a5aced019190b013cbd7013729255a0979149f2b04e70758e333f6b5568c1a8c5d78c58ee098a1c2f6f36fc1693e58901c2dd489d5155d256446b10626718e8b55fec9cc43ebc74f700648513164679cf0874b6dae4df33c939e14631607af01fe0f1687fb4f6c6b3164ad4bfb08dadd7e4e65e6b3733280c7e1ecea1aab6c17a08eec0a84c66e84ab28685aed298af7b31bde8a5c8b731ce5d9ef6a9b94b5ec2b4541fc353cf248cde2040f943d4aa775fae2af8789b8d62da482e00ee9b3a703d2207b841fe73195a958679e5f800e221b3f0cb47253c5ba1eefd3e3e6d2c069894543884dad3fff54cca537eac1321c4115b0f876f4981c33dbdda2cc48c65b73fcea04e7934ba2097c3f2fb1a50a31cce853a435a983c2b514bad24c9f48051457ea9b2a7ade665ba912e7e374fc0e69336b10e60c07227ce630995ddfd7d2a95b2d8ba486907aed5e07479957c1a1e39060a6360a0b6ec60a5c9aeaacd47b3df287522bc698b11efadbf47584131e57bcd8769e7805666e1dda05b597e83ec72b3cb74d971ae3eec8c75919bc78aeced11bd844082041419dcb057dfea6da073bf674115e22dcf65c8740ca7db3f1e92514fcebf8d6535d883e9fddaf0097d743be08af8df156d80915ad1365441f5506406c66f00deaa125a644be4f3452438bd751c925190fbcd2ce81265e1d94fff4fe7827680b613f505862c1132985992140e185d0c7c258146d17edd91736bf0ac689752c9a0efe6c79e4cdec73d81c1f4bc48d8d978b47398e9492e3f11cd24427165f1fac040931ffaa6fa6400d6fac005c9c4e54da796a57fcc3d2d5a60c8e6f3edf4834b3459166033392567ba06247a0cfa0213b39c868ecfc1438438368d1157b6e3208ad3f9939be691315fafab91eaeaffd6285581573a0a33040128ca677228caef5a8dba0828b013a2caf91e3c9168b1257ad436b294042d3b07dad18dff9c761c548c570b334b42f6b5170b8c6f0a", "526363", 0, 105899175, "c15e99a8ee523e193d12a77f1b36344709f109c42bfe2c4b4cbf6b17ef3b9464"], + ["db300837029015390c0cb72b1d157c278fb9023f600e15108639f5d127d0de1ba001945de003000000066aac6aacac51ffffffff47c39556369085ee2c2440c7712073aed23dab1c747fd379076c6c70026fe1d70000000001ac7b6e1491023b52f9040000000009ac5252635100656552ac897e04000000000300656550c2a1c801000000000000000048aa10030000000071cb17b92fba5ce5ccec0edd9de6bed567a76eb18982b63e5157985ca439a2ff470c447711222ec8853fee52a77ad81ecdd71d76e247efd1f071fef30354c9752a0494d96241d56eee6903af98881505086777d6018075830a67c0da305a47270000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064edf6e0e755a2b0dc0454ae2aeea13456928eea08314c550c75f603c40c835a6550bbeb9e35a06d940159638d71177a5903c268759cb0da489578e46ef2b5d50c1a6d5a8c2e7356de48ef8277c7d74c177da119f6e056d8b4f94474a286f95641aed84884b2ccb156356a66cbc5e6fbf9fd97d218b84f7887f07fadedbd5cab022da63fb26f23b8beb477960120ad0ca2f6a56b7504f8b0096a5694b43041d5a0020a05a1744a839960d61fd2ce2c91847da911f6eea15b6de06146bf3fe810eeeb0b0736b7c871c65c0d4f5232ce00a6ff684b7a4297e38d4da928300db729a9ed4dd5ebc3f4d7bd4c71e4d337eb9063bad38f7265fefb6e386feaf0a1a2df50c4660222ba8dad2e0f673ad687099b694a4b5ff32c61fc527c9ca1a992aefbc3d263e2031db9dd8f7c475cc58cdf1c02ae08c0145dd0ecbd23f4aacc380b7cc0d1a4bdd3031911e2ccca8041b31b5e2c9d53de01fa736aede5a0d3870fd3c6cd52547190d70325867aab2f8063c6790d72651e7f29b8e434c9a20c8d2ce4273fc3e81232a2ca020765534cb63862a34725553b66ba49b96e6162f61d385254baeb3a8c8506917dedb1444f3d6e23cab6ffc534a5e1a15b303e64aa21277790f537ad806d75810929ea26b47c75b17d140f46d96090457ea3f43c44878a1993ac9135b0fbf8b4efd291ce36e2caa231071a3202871889b880d0032c07059b01f08ca2385419a578eb5b20009f8ea9d90572f85cc8171c90645e22532fc5c3a2f6e6c807c5385ce4d428329f45ef5edf6d025f5a9754f59776e84cddf5c9b8d685b5562ffc34e9adef1e95762c70b2c0c3a46ac8371d2dc28504ded0ee1f7f26afb44f27b986189da3067dc78dc8ea88fc466ff763bc61b2914f87b6b94952630ddfb4ee8ceba13b9e7bf7d07e2674eff97ad3bb83fd2460eaa421bfd934eb6dcc6b9cd93fe25e01307b819f57cfafb228eb04137ce3ed5da2245c0f5952eb5e843b3fa6dbdacb954af805e598f884aed077340dac0b7ea71428a7a73c02ca5981d66c68eea38f58dea66023b8807b05436cc098e3117e037273f707e70d2153a187f028321ed5d91972b950f960b50ddc65341a2362233e5a88abaec546495be0933aefb8267ef0f45b62f31510b609f07eea4c022768df4833235a1de38a2bce467c05c8cc1086235fc1cf068c63a9c328a70fcb80d3e3089f9f5fcdad143332b4cd24cd7e08eb35f64b4e367bf90ad0e02ce26c47d4061d50dc1b59cd2ebf19a66fe9eec763d0c6e4d251cdf5eec218471f1ac51b4c15e75b77f1fdcc1df13058d7af53a147e39a67523e3ea2f3e1a03e6de0b1fb6d7fc84a0bd2e63f5ce938a9524c192f9e0841896ad0aba1e99f70a4d6405a393a0825cf8e238cdfa1117cd5f4d39d8298d69d1cef71ae83b38dbad97b1e0246750440ed38d2ab8bdfb9482b75e077763f27939118c7f1ffa40d16007d0a46f2d1acdcfbf841b757838ea95285e7d481b58522a7dfeed32b63afc357f4faa4fc919a5811fcb92ac0f759dbe16949234dbc586f9ccfe539773520c5dc06362e90b45eac5d113fee04557f867865f54d72cd107081354b45e4eece7f4211b52245d2269c79c783796771cf57698127a10989a960773f25c11ea490bce46ab0c5b1d3d3a23f9d0f6c104ab741abc16e5f09894e4492d97e139d66e8918856eaa292fab801bac98c5695cf033b6ddbae58b232cf4a3e8100db77a024a7180a05b26cc6ab4a76d457a30106701b6463717050a760da728b34645217438a5a2cb5be81f8826d6a2ced5bba7a697ccab19765b4f9876b2c7f1a7fc3a28c947923a856a14298152fd7ab97ed96b2c89e93eda99428957995f0db08cab22975f16d0db8baaedd21ab560e90a8e537121ca503da2661968c61ab3e60a783e26eed09bf82aec7feb578c7cfbb55f33498f59e2d8e5a4c9be9ebc09ce94e35192d29af22eff188e23779e6b97d56010c942195dbaa2bebba9e63020e2fe28d62c06c5a097968075c4ab2513ce00358525294e9099f77b82ec8f1568c55afcfd4013ce834817d54a5a2fb151754cc30fb093c98078075f5a774e7e66c6b562680b0a13ee8914f70eba2460277035ea17b249af85e1dacd177c5c326bc9d963e3e6a0eacc35d2079d2e1c9321869f6540c24589aa848f102a264647eddc1ce927ca02d6d4a013b40db3c6640c3113b5c2bb0b46846f93469c4279a1969051c210e8be305bf581a688cb02cdfb187aa5220af6c26b47f69d897f00b45a98ef5931b73ca2a305ff9d206ce4c42265eb952db289f9caa25f40cf8d44ba5c7e7c002be70464460f5c36c6e83aaa46755c1a7401af0becbe7ca51d2a2082cb37247e7524ceb996fda0f90c325da91a4a56aafbe695baa102cc881722451208278dc65a00cf9b7d8bf06b2756109", "6a51", 1, 2044544761, "9e6fb915ab40b469bd88edb9924d02d4ac66ea1149448f58c2811b3d0612ed78"], + ["030000807082c40304a74090fffe30ecb92c2b1771df056f4403cfcc64fcdcb6cbb3a55597dc9a5cb401000000070065630052535153f31e180fdfec76079a2cf9352b5862311e70eca02592caa20e3e25e7052574577d981f01000000096365535163510051520ad5b7ee4077fcf87d20cbd62d22374a8084eaec9334dc8253fee57bd07d3769ab65386902000000036a6a51ffffffff73e13a4a738907f5ea044ffa825fa4ba08862e19d4ffbf00e65db74e38f4349f010000000152ffffffff026c6668030000000005636563636a058bdf01000000000252654408b3ad6d03a37400", "", 0, 1121240992, "771a78bbca955c5c1513bb1c4f7081e34eae8f2567b31253576dd5e1136e6b53"], + ["030000807082c403018630ad7bb378f609ecb65221c11c96071c820adebfe100c0c885b543c480cde1020000000865acac0052005251ffffffff020e81710100000000096aac63ac535252005110642203000000000863656a6352536a536ec401180000000002000000000000000045bdeb04000000005ae881c5a86c843e346c43d8b9c58f8c9ac5181405e08056f63acd781d8ce7c74e9994adb8f709f830b88b67d6866d983bb8b3b25e6aea15ab573f6b2808f8877cb2724dfd6731f4352af1c316447cba6b2de8c855a41523be0ba00f0d0a407f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a01cb93d04e61606c05fefa0fe54eab7f44dddbc748850676e887a8ef3b3b7f96fc3a6b82cf80f3c1bfe307fd7e00ac7e94c8f135b3e6eafaa8b2174dd61c13462593b47b1c063d6326895259646a1062650be903e620516857999a76e0f89dc86bbc782a9d3adc3f185c3405849c2ef6f0600409e203e09d0b7b71ade40ad440216369c0cfd24d82aa8de286da9c43988152e861fbada3dd73ed7fb37b142903102216f2ac840d931cc94a48b14c5db2c5cc40e9dee45cc50f81a0e59c428b8b9e10a0421f24e72bced999643dd9c69bf6ea3faa5b996ff9c1337e519928ea348ca81ba470b287a4167bdd0bb2e5d0e4f37c7d240ae229b26b4cffd429779edc3508d020b26931c8275c98a3dbb8cfdfcb63c9755ea94fc33d89429cc41657f8a9cd1ef02055d3ea84ebb9e1ff820216ffb85cbd7cecbb1ffa9cd0d86def2650067fdfee502079e7bda7133c78880a24f42d42de9bdc566d95a90f6417c61b08e79a5193f550222c063074255d9e87dc181fe3c2f6904dba27722ef0dbbb0a1d6210afe2122d4021e7727816bb687ff08ce1757f5caef7b2e7d97490a1f33912fa03a9d2f221f2f3625ce4ed32062764707367501fddd8f769efdee845e5e564607cb1b1134ca5601295239638cbcd0bb538e1501abeaa1773446c0540fdbc1edc9f9e8d1f10e0390f2e8c70297879f2c8b9e1333423c212ef5bae274de4110e4b9fcf7bc8d18d9a80e852fff64329cbf4294bf267e68d124d34c5d4d296501120ec5131ae03ca557c3dd24b8df5419486ea6bbd5c2bc6398745f474d9247005189d0033f29f5d2568cbf6e355e154bac05afd913d8c9324dd86e566fd44770ddd63f737009c9070157f590c2cb04b3bb474cdeecf17aa94deb41fe1fe0db66fa814e9cf907ad06bed9c33f97ab5c6d43198bf77e6132263f91c811db9b1d014b97753a325830e9e00c5fac6436b47d169ab3dcbe9b63518a3b6231f5c3e45b051360a16b8c27a025a5a8d5cca96a7ba7a46a3f1d66ee90da0108d0d3c4590e976cf566f79c321f4f24e6a986e10fa3ee1251aeaab0caa7ed55fa084fbd8e1d1c01e525387640eeb278f9402c641cba117cb6db6c0c6ff9b19103d079a5914b85f71389c1c16b7f64f613fed1935f96a2cd8bd7089cb229d36ebd03294629f26ebfa0796c18f464365cfcbb9b730d2128a1117bc2a00bdbbc95acc74bd767614683069e5221535aa3a92ec1fa2321ce9d1e64ce0f88ba968fd6e63f618a9481416f2a042582facf3535f82e2b85585913975e7d5dfd178156db4712b4489db4c24fc4a282b1f4ebc86d635f02f41cbd2b7cf334acb7792923763be5a5ad23982e75594d73dec20cc597508fb02bc8a3bc96eb7c189a1733c741e5e4fc8a342e36abbcb5ed840e0c4bb137219d55e53bc1e398c577455cca0cf3fb7150660115c38821de9a931686bb554ab4d1fc3f7781429573507b5eb123f07902744fe313aff3e4a9bd36833e6c018c7c2504a85542171b7ee17969b1853c8caa839862d0752ce5b7a9772730898f9cc615296b965192382769089ca7725b18d5f63ca2e68b4e5b4e6686868e1045f9d90ca7d9cb3d9372fb8cf18b3f8d89dbf47feb2feaa41fbc3181efceb8b0a915342e0094b099b5dc771e11236869aca652cbb0e94f074bd12dcb2ce63214f50984ff95caedff6bef0aa1baa9543dd6856cfb8ee485ff153ce897893be4b07155a7cdf1e9536a934cfd411d5b1b098a655e0ff843bdc749fe1250ea175274463301b37915064c841f2fca430012c984f9f2142269e8953eea02df31ae07e8d634d2db025f344d0639ef6564cfdf081dd6b201454f13def6040a517d890d76265903d58fd5eebaec293bf18b584302c8399f8dd2d02017fad7cf2249d3b28acab038399bf796502b05f6238e1522a31121e079b8db954790dd7af9b5f81a4b82c6bc00fbb05b8e49d34e2fc7787dd52738cfd210107faac9f6f573fbc408d7a184c4ed6823523cf92816b8ed6e5d1c075c896ed218dd615baba0cfa2edcb97c882979e8f38f9e7228f16cbdc81174c1781ab221ffcaafb8527121d70165c6b72a88f6d45597719fff5636633169a46351d18cfa029d546f744d84fbd18caa28982da99ca34983e8be7d948143f242bcf6c2bdcc74b6454bfa567a05e882a5093aa0718d2f11a81c49e22e6feadb80cfb092747f02f75d725c38cb470987e5830d4700630f7d24c8255d3b0f37389ae398c50f9a88fb18bf78900ce00d8bb5a687ab5fec8e10c5f606cab6d71c82164614ce5ea02000000000000000000000000a6b9fe587d3ce836a8b99cc10d09a7bb58167fc18f357b7206defbcb9b7bdd27843ac7d1abaee283bbdfbd9da1f9481e7c16090abb42d9acfc60f5ebf0d0320155b9e509abb2443eebafe3b36e24e4d9da7211c1b334bba6ea3485a347d1c7d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a34d41dc988e4cc1063c94b89c5d8ce7246b263bedddd23732347ee7b3b293e555a6332a0508344134a7d9116d3407ceecdd2f2e887bff37b7b717dccbb659c6e08ede6525b195ed8aeb91c613332306db0ab0ca83b664412db1aaf5c46ae5bfbdff935cd64b6b059164f9e7852ccf785a51ba64ee57ceca25535f2f96e690cc0313a2140fc243c2d232a3c5569b47a2484de0daa9e1fc66730808f9111e3b91970309e84dfe1186d28bdd9e6112e706108f65e8eb9d86a4d62556aea838f664ad700b00848e3f5411147dd6fff7bd6830a1b5c47b8468214c439fb04be3997bcb92d149229f20943462a00ca0290b008668816cbb27bca2279985cb5d41ab81744bd2032095f4e611407ef7defcb443b11ad368ab3897ae3ea6998343c6f3e7ff9303b60322225a1fe4ba9cabf070e8f263c7d6aa1a0a9d675b4176efdba965bd44ad0643030afcf932269e7043826605a531edee44e0766304044431ef7ab0f3d1e44414cc0227cb1a9fb5006dd7d59eeaae4d91182681535e85fceb29e644a2a9dc44dc8512020f8a16bbbc78afdfdc0e83ed6f5df596ba4c51cd54047b2ed325a64f732f03026dfae46d54c042b7b847ea8afbda403004a78799073ccaed8ccc5f089c72500e9e36ea2fa4fdf2be11b256d2ae3679b03eee58ff4dbf1707494426280c0b4300c56d283eed93726abcae00b99252e0aee4b8d35a9400c67777c7ec75baa68a94f99aa65e6327a848d826315bc948fa91dc9880fad21d9f0b872bca520910eb7bf0940793095438e3abb50391e39a402d643d6c9cb8c920630a6b6c6573396382912f3bdb02f0bdf528d96f577e5729e582fb7950de2c84a78084b35bb07fbecaceadfd6597356b2d8a5974a4f923aef41733696381b6b7471309726182707f4a26201536a17dd8efdf52153d3eb7d150c064654f828309bc041060f75c29ba2bc90e4f094539f51253564869e358eea25d639d307ce59705438630ddd883bd304a2c2ca430e33a86c590ec4fa1b114609521af979d39040270e11e982eaf37f659582a628e65cc169af277fa09bc9d0d5543942c20f9c4851e1d6aabec8e26358046e15d980a3aa100b89ca394b627a0de060ce9c01d8cea63b1b04ef931902520297e00b1f6a7902b8bcfd5485172144197253fcf9ec2911cde3f0f7b6704e9995473ac41c6b29d018a8f8f9a03b943cdbe6c0f5b10258bae0488b42f7c03994cd363732b9c594f459596ec3b93a5245a812ebf4e06dcaf787192c99ac762495f52c8735a61020b11d59e6a6d6282141c23712d16e23417f8fcd8ad08341f3bfa465ccf423cca288fc09a37e575cf987739d4c4051a768fb88c328c15a6c2731ef5e6c70aa420788bcf2fca2c8185e0c573d95f05eb05d2850fc7ba97272b6fd56b54dc316e14364d61eb0bdf84ed93ee19cf17bdb13dcb7002caee7cd8767f6c732e040089311eef88a9bf53ec2b1dcf31760543eefadc171a1dee3175f735a91b3b6096ac1c763b41be5f7b410d61d3c931711cd32b86910dcf4a512aac87913cd48614ad7ad8ff0a43e4fc286e9a85ee4dcbd2cdfc9e6c0e367af8a681bcb88e895d8db65fb5caab67c6d25a491353155aea8ea6df6e2d30380bac387a0d23ad02c960748af149e31c832cb515b29a9d3d4fcb1d9255f8e42b84809654c64115ad9d6f2cb1e902d2874d52e159fd13bee20df9504834463d9b20a08a1b928dfe2342a795ae67104ff46587cf32318f8ff4fd363701c559d944c4d712a3273b387e332c1364f0d3694d19e559e611fba704cf4186e3fc1875a5293d0a5d5e2932e14f032a1453e5414453c93a3905e2b654f6c73e2721e620dd0e1e37d520e76d1f0df625fa4a92f7a59da4d2feb1cb9a49050c4323a3f42fa8895b5c2d22179bc6dbab7ea3832b0751b2891178c4891539a457dda07d6c088ec9408e8b809a0fd98e936ef52b2162a683ec79918560be6b0e3cf56fc84a4e30a6ae9255e2744d40e41887b4f12ddd99e6b9cbce26e1681a6697bfd8a5f2c2ab9831071cdcc5b403cedc5da2ce6783b1dad5499ec75aba404f052ee690fbffcc4865441a3d13eb81fd39bad2945c21823da56cd02e6dfefa97441e5efa8dd24416e9fe4b29273f8c2212af465ca8cde30d78d48dc84807212a368e3f6a3694151105fa286a0db9dc4654cd8738de2a14d6132e5e5efc7c768aabb012d83f7835f08d8515da3c5844ea137170597fe56c32753513225fcdcb4941dff2da7337bcf88dcfc968a24af67b4cbe666239409f1745ee4de383dd3949311299c68681eb978718f52c3d22697d9f2224c7ac10f7b2f5f18e5e95040608cfc1aea4d44b38e7648d1c579db4670fc681b37372ec5097207da6e3e01e67dd90624ae552598f6c077e2bf4bebfd74c056b3fac6c68796bf0825f9c7604", "535365536363ac", 0, 525818037, "72388729e16b0a460ac85eadd42a2f4a7f4df39d9aac3d7567919bf20c100e62"], + ["030000807082c40304b8cbff44a82fe78c93c734c92a10dac534912d7223095b3613aafa28ea8802f80200000008006a6a6aac0053636f72b20dca6a3972062dbc83b20a5253230fef6e9d5156e6a1f27e2c9e77ce1b14b61e3b01000000002a0621680c9bf70eda0b6d34d4f4697661a6592ff8ffcf1cc9b735ba7db73e26946c6a9a030000000163ffffffff1de553bffcad3978397e832169805bb1c1ab05fd0a464ef866ac1503a9e85c050300000006635351636a63ffffffff01f6a9a401000000000153000000000000000000", "516a", 3, -926956723, "3194ae0c2f10d77d81a2142ec53bb557f9289e582c9c921f7469c653224e47c6"], + ["030000807082c4030169f260b7e3967c9112df3da5daf94eb4d377ff6cce181f30e3f888e2f69185f4000000000452535152ffffffff04cccf1403000000000351656aacabb3040000000007acac52635353aca0e493030000000005516aac0063c0e1be020000000007636a6a636aac6300000000000000000160eddb03000000000000000000000000dbd1b39966834cf677fbea0cdd867e7856807d530efaf917a02d8682f22faa9b5048311420811ba34d4898e689bef619c69f3971b9782d4fa1be1d86cee93d4f8cdbd07b34c227e5fea64a436cd84a236004d32070838f5b04423b90e366b98500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dfc0171d07ee857fa8a56a305bbb61cee6736676374f1a7f9b73fa3320bd7ba1c7f1031e83fc83baf8c6d40c1cace8841eaaccc7708510d9ca67f348c4e0d217156e247f66b1b5c4321f82ab6048228902dfac56a9df8bf98b46bdf85c5275c519579c11a8251cc57ec10bdd021575f11a15226c1557fc54a48690b54eb3a0f502237220c7789a964f37d0145e9931e125638aad2907f3025a5230ad2f98e801000311f38333f32e16eaac01102d568651886283e41f32610ff5d8a740a6ac6c464e0a00f5f5f1106eddafc6c8ee112c294cdc26516ce9aac98f9f44a17e75c2caee2f1eb34b40986d0eacf83b19c07f158b0d872671756f0c7f020b34d494488174200223abb91787d886dadcb3ee457d88a8d4ea7a789c51a6a305805267565a2c7381030cd1a139d8b396506c08eff6d732d2dd8326f84f88f932b5545181b7dd61a74c030ac5da2e7a7426c0dd10987fc367f62e23dd0a56ef78b1db751424708c0c421102158e92efb9f568b244b60dec6220cc9e5f5dc1b8c3794bf4cc55e57200ddd29b0207a39bc95d08f97fb8a7bb2076a2b6ec72652a93d32b77e534e482082b4e846a625770f26eb159c75469614572ca69ca7d05528f264168e32a9ba5316a341d94a96d4141bedee409397b9c823eadc52fd4ae728d9e8c2174fcbd8f1883a0b33ec00db6eb3ac623b914b5612eea459fb31c2319703cf974aba739773104dc3eaaea68818f1d4cd121cb4e91a1e22342212381859b04359f08f6b1811f375a1fcd57650a26585e01f1bd825cf7bed964b3a6c7e25fd07dccfd3d22438defca4b74aa63e0b21cb49ecc009e618b8830cb2ebabc1eb522638075a961dda5b900207d0db67004db895844b623ca6e24b801946cba6065e9cadd4aee9b1f4f44b4bf7b544434c17e6b87685c00b40e3f7bf70df6bbc96135eedd286db33a11a984382d4b33168499efb49c160a30e557011cbb0a03eb8ce8c3d8b9a617160c8b77664b526cadb63e640c9d8b7d4c8cc004206a75ebacb3889d167f62677dde7106aa831546f795713d7ee9e6d73ae43588f5d68aca84d89869bbd6a5dcd558fe9eda178d74753194c1b7fa467b5d6910ff9334ad841e8e6f1d7ca58805360d29c7f3a5a0a26abc3b3e97bc57469582742282ca9a38d1c002a022fb12f90239ef3584e45f6a409f752134ad8ef0a048a28a9d1b72b180986ae8b0c4fee1f5be33b936040d68aa71d6b7791b7e35c102f1213431397f5a5a3b1906a76988c6f87cefc3583b01cb59da8f1b9151d54d6355d623818663e84c5ff477798278fa9a670e2d5d683145b866bf8f7b56707f16da1334041f69a2c9b50be5e24f65cd8f07abcd0af060f56330ca3d269ead2ec3b5715e92007155a2186cb6a2dcc3e11d8bb62afa1c305b1ac9d314e3ba2b7a0c32632892c77a4f495ed819c66de0e7069deeee24cf7c56dd6055ed395b17f84d1575a5e616c9d4ab3d93a354ab8ed7e564954ca1fff638a099b39a1497f2487afdefbde5bc15af0aed658942a91e2a6c20502ff037bf38345af58e1382a0f53866b9d3400245b62b85426683d2dba5af6db4aa91c6125a9478de9a11e290edb9ba7c05a27814d470ed7aaafeed7b1ebfbaf30c74e9dcb5d331eb29dcfbf024fac6795f508f7d098850547b0b0c383258f47ce4e81f43f60b3a5d3a061d17208b2bfee2fa5fcdc314951a3116afa87c40d482520392cecd204f3f9a61c229a861de8d4c02c394e8f547c332e8e3a5a992af00afa512b098cefada5faa1a62de05029995cb8224dbe753964db4e6fc7497a6982d4ad8f63e596ef9fec71e76d86adbbb638e2a67e72afdc4be500c78a40b0051a906fc7d37cb3e0aa79dc49a5be93b459f7ec8f113461c3044ddc3224602ae1b2997a0f5f70adbde196abc670a2630941b6c4ed24d3456314936c0b9b8ea42b2f6c6143a6475a57eef7e1549b04855fadd9b6ee4a1179bab36d05cf5922e40e83a4861794f31abd955e6c966e6263d74cac398d971d8b61e538b284e2e52da9a4903a8b000dcc54918ff5545830eb41e4aa5ebd6e6e30be6f49a4b0e0c668e121b2f33fd7bdbf224365fc2446072b08f2d4b7793ad7d17f2ac07bd37626d04a6c04180a84e9f2002a596dcd77702f923a816bec636de6f09909de03db35c5df22e256da8f19e40320e471c8c6dacd2e2bdcda070b5dcdfe9b75a9b714de042d76d890ddca3df00f1f4000163dd6dd8e6f11b6a55acc6041a49c13b189ddd02e54abafdbd8a35b370ed54403ffadce4c11a136ec5b005495b4284ae5264b63c678d196a329c9196a976d7ed9216ae5d46300c9225d523d4444a8e59a7d9432c237d0e17b358f8aa5868f032365f2b210bcc4177f6dca0734605a28ff97cf7616cd5c3db217fac8fe0a632e4fc0155509f786a9f02", "ac535300", 0, -482774287, "657441b435e8e2550a43d51d28035d59a7b94d2e3208636c0fa1a568f81c64ec"], + ["561d0d3c04798c66a279f66bebc7652331d4e6a098d743d8d0a67097953d976606d910c2ff0200000000ffffffff0b87ce52acecfd00e351904225ccae51e815c41fbf0e0725f5f92ec5a633bdaf00000000046aac5353214ec01b0e9222ebaf071a576b15d0e6ee9981c951821e3faa194e7f40ee496622b7adc702000000086aac5152ac5163524e8e10ec7b6aa89b77ed91ca21a62c1347b64b74719bccd0901c0de460e87b2ec1ceaced0200000000afc04281047ae6d904000000000763635251655300ae7a9f030000000004ac51ac52c4957c01000000000565526365516838fc00000000000652535265006300000000030000000000000000811c5c0500000000ea96a07982c8b43ee8f21a9f451f2c9851d00f3ac702d18249ffbb32625bdfdf4d9f8752404454ddb1f56abbe47187f4ae00f01f4557ff9546cfb49f9d0b5971b17f9692ca576098c19494ced06bbee3e2c57ddd4372cdd68145fa9ef4d036a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057ed6254315705195f8e483112a5536701549b4ec77beee6588e90e66847fedd211c150b64ad604faf48c10826ca1395a079175ffe5a0ebeadaf56a9adf93041daa9b71c41c0e040e7bc4e190ecf1f0e82fb27998941c44e6efdeb4145b6fce787b3b9ee776cb416de7826f42478bdb9e50044ef83c80a677697df41dbdf036e032fe026873c19c0ddf55e4da3abd1b993745940bdfd836062cd363cec0cf7cc22022067c35a4f5eefb75a3ab49aca54361f62a14a0bbe80b6dd9987e92049b5d8c70b065eabbcce51cd653d2f8da470262db59622b2ab72de06855a107d1ae296fa33aefaf6bfe080763ef45907789c4954a70bcb5a7107413c9d1efb61da9585688e0306d6517658f609a371b1e880a7c4c2c9ff2a6110144020c33f4f15a20a8162970316b02d09acef17f845f7990f0335816612d1151262899fd7714e92d3988c805c022a6f2b7d0bd4d1f597777c28003b7c8bdf1113ee6e227f5f631934ab93cd3fe0032277503abc7ea29546cef5681c37cf76106dc1c69182c0a24ece2288b61f7c5203028552b551e77d8ef9e444b40ab0ccf03b50bcabd939ac27a2c25a3ceeff0b5b30f40db4bfeaf44d86b2ae02b3b04e1b2f9da037c409b1630354612cedd1b4297ff58dd0a7944baae1220c877507fe12f4bc396faddd7a917edda72f1f4cc7f931b7388b4e6b6df60d347f0702316d244b6314f467d08b9668c464a75e98ad29a7bb94a163d9c7f2ae86b51b6aa3aea8c29177ccdc0cf7f9b228d0ccb10148b008782cab73b43b824e8313dceb2e6524917cd11e03e71dcf4bb2dfd807a3dcdb1346799fae7a1e3119a952ebef2f58240e2e4ff4dd36611594960e11456fd868b96499d3cba0b3d369b915c3c4e83150014841e81719454c2b6ca979684ad0a1c8fe4d730ffd40f24b42cd121420a29dbc7cd7ec7abeb0bb5c83f85a70dcc049b10c244f8ac012911edbdca0027571da7b769d965e196817ffba8d680ffb247ee70c519a8f6310b469c84daa9354854d6f8f5f42aef609e93d14b39be4961618cb47cbac337f89effbd172f98c177d037a79919ede57bcefeb2de2118e2e6aa00d94e6472f9e8bf465d6e901397c1da4ce21c8c4f026e6466a315963c909fcc30f5a6192bad784504e13bd81654904c7c2cb3389df7cc9bca050512e1c81da11f8c74ac11181ec37c7ed0be1798892799ef21d1e1e03161a7f12717f6fbae1f80c02319f6c8f22894aed80571d1a654cf6f21ce37ea75cc95941b1476791e7969e977786ac15e330b5aa640b5e0c6575428c23077402daa7ee3704ef7a095a8683692edb676eabe873452c0aced0726823112884c81827f34b9a31e2190a948683a52bf3ce5d8999e52af4c4026a0a0ac64bb3db6f6d6156d2b4539094a6cfec0cfabbb3396802c654bafdc006595167ab9b147f7024dd96697dd2833836a595526b94ecf29f6c37cd9c3b3b8b69ef5570244953617823cf12d999bfbf1937a41e9a258a169739fba5d4da428650c4583fbb5265b7ee7cde441ec7b0942adba06e006739379f46e3e9d04a37d26db04d3015f0d1bffc2249d49fa5534e05fa8429c0eebf15a4712d44ffb4f61f13299bce4ce4cfbeaf8d34bbc63edd1ce86db683be051e36400e6b0ef98fcca7ebd47a2aa0bcf63c8f2541b166423bee7a4a918c03ef337d50cd06edf1ae3614f68d1845280dd7a43255e4361c70586376ce2e5a48e281c03a0d9c1a07f5e05beabe4c1d796a57832e3afedaf6d5c04cfc9d15c9eca4021cc88f5e33aa5a0f3c505f4b536bf7b262675ea20be20b10db48be9ad0dd804732f3b8637c6cfbe5228a4f3c1728d338402669cf960e329c25874051d89e6a8ef58437d0898410e3bb17c07cba695b1dddedf854adafc472adc617499c7f9a1c4515ccede34b9cd27c7e93d35c4c6812e68081697e21263d483cb5db3c86fa1037cd840d1e85aa09ee56c66192ece5a78b54cd2229e3ba7ba3a1fc8216a2fd0d5c9bec8e98380f969265fc196b8149bbb28fdb8e79bd16f0439a90a57371b29ba14dfcfad4b26674d7aa5234287c9e92caa3a1bcb0e6bce844891a2e3836dcf50310adfeaafaaaeb96f9fa1ac51cbc4336c8702d94c6e3546102e4adff185227bee70b75d31fe4d03cb3d73c515fb0005d0448ec111ad32488d81f88514a07b18b964254b079a066f99459db08781115e683ff03e3cbf2a873082d049cb0fbf78e72fb5be05580d61229656cad3acfaf5cc0ea8c4ee4f3a8f600f9e551048ecba5bf6f4ebf735af29ba2ca4303aba58072040000000000000000000000008289065fe1780c98673488ef38104b0de68e7834595b5721f0741273d0e40d6f9ffe2ef4b177f2911d9239416d77e3d5fe38bb7dcf19dd03fc8e68bd2f3dd7fd1991748c98deb54576b08f2fccb69a4d10f4fa5ef1d3e5ec60caa5ed9d9ec1920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000078c70a05f060a68ac7abd943c4b18c31ecc29df6100af1c7992d2b9b0af7bab1d2cf9012af306615f9b550c2854e3cde48d72c0a3cb1da493729a5b868842a88e3e43e6205da428dd54f0a8c664055b30f131010e002f578401a9a9e8483f371bb86e5ff3abe017fc87533e044be2ca5528346f5592abbb0a800d622504c0b2e021d68e7ba371a3170f1826c4517f85ed2ea0d9c31c8f44ec9bb9a72034e3de8bb0226eb61b413bddcae2ba5bd569edca254dcd6f249e251718d95a7053b11c2964c0b02ddf0b77ef2ad9faff975fefd34759a00eeb6840574b1b0e7f78ef0e5bc5c693bea60c9272b0b31e90b0b885b063b521f9fa7e1a9f713eb0e68690eb97bb9410205e2111694f2d126552bc8093c8ebaa7aaddae2e072806a807ba9ff6062b3e83031411087f30e010452470a1f51fd8698356db213aa54ee3e5cbc0811552dfec33021b8bb818342c267114da747faa03261a5a7166e50a9fe5f8157fbeaefa3a7af50316e3c6b86c0d2e2fd21d22632d31fbac7dcca7feb1b1b3fdfd6f3d7b02d18e2502270bfb7fdd39b6184f1af7724719c5ecbfb6378e71e90f610085728ca79f2e0a4ccb5d7eebeaa563f27096528d660ee24edca8c329ba6d0be502b39079c17af9405fb9237a6441e3c45707152016346eca800f3bba7cf57260af14d935aeeea71cb2c492ba0e2b2b7a5b52495f93b73f5e8d6cd922611c0a7de2486088875650b86893e38bed3da9bcc33e1cf65e2d19be24092cc00d3474b3a022a224c150a53b8583df9de32b0dfad9431f98cdab5a2aebb23e0ddefc0778519b0e094f25d187bbc4b0a16af33728d71f23dfac4f0bd791e546336871e33bf080c53e6acf51be656def8fd1d10085517f35cd5f76e2c73a2dadffb9e1514875d9e4bfa272570723cab7c7c7d34b93423a7bf92e8843bd4dc5589147370b6a2ad5fa0d32f45d1bae83dfcfebd5e4f70a41570268ed0cba255238b4d3cd12b29951446e95dffa5adde9acb3dcc7caca912e0922b98c2933f6f456ce4231aa8e78d7ed42237bd59e6051fba0e64d2bcb1acbf6c9002db6a70b04d396f2c486d70b070f766c0a0b7503ef84ead391e34871b876e3699b48dce2768463ce6189628f3d2b31e79a1e5c54c8f6f2d827b5182b9925a32f633d352101acac730b8ee549d0a612ef428221c36b6fba36adcf5b4d7facc2cf1f9a117e2e1338927ecde00ca044bf1ab40bda8fa67c0ab91138b21e3e945d716603384c7decd8572e6560e4042c40693c3da94bbe71583bacc0e8d66d4cf3105d6eb452ec423c24743e6154ab3c5e933305cd01b5d5b51b5a454f90210918c70e86c1103a91d213655fd5f0f16dfe094c184f9322f4e7f4eec2e55a827a4e1757f7f50be2084cf445dfc70405a41f3e9c76a23dc6b591f54d0abd2c9593006fb684d25d01c553302e709963f12af7010a8aee272ad6632f6faa4657b6143e53c6998c7980d06dd0206a185131f209ec55d33d623bba1222891ae9a6e2d799fb03797a0af747c2995639a5ca4a5d5d707d20a5bb995b433774dd43124848511b98784f5cf1c05c36f3377c19a632142673df5964f6af810f26ea63e9bfc28a3a82447e883ebf40914f840794bb71b2a26dac01bf4972ab96afe5703e6b0dc98fa82fe9fa6a030daf7c49d4c6f10aa0932e68890cdd53b74e9a004870333e3e40d87043acffa15d8650c93dbbb8c13c7450c359932f47e7cddad4ce0a66d9604cb3491d4bca76a14e5a8213f7f61b37ebd02fc243525f58fdccf8506db4bdee789676a64e06b896d239a7653ddbca22af18e55a7d0aa1bbeee6e536bfbd3d654e80cf3585b13697c756e5cdd9112beb06ecf6de8bc579446de44129658d00fa74835d2e63817a8c21057a407a831d1865b815e40e786e6ea21d14236c4d6c3384e6c6939f254a16bb20fc34184d203664716e035fe2ee8fbd43a9da2bdaef4ae8d7eff0a70eb291291e4caadf809f3f8b354293e8f032d5fb3fa23ed1ed8e3b5501d200d1c7d9e21984c50d416de26bfb78d068515ff5c4db630ee3d2f7e9d7cd9e699ee27812c7a3fbb69afac18dc29e1c5b9aa0909f626be11725ffb5c3e3e0f5829d03bd101ef36f5dc82e5dd55f9fdd779d449e0075cafee4bb19a7530012ee635cd94fa1ad694eeeb8561dd5818a1616daa16762be7d31ff11a9be129e258abe1a285c48205d46e21a18e0f0ff97e5cc680e2850f5632d598b8adff61154bf75c151894caea9e8aee1fb17da808bf33e89b386bbb47e3d26d7ebaac67982c3559c31e6e66b0300000000000000000000000006bbac7c799bd41920c4311643ecb12ccf933e3fbc50a0d0dc437e97c5c09f39f5a3a743b82e687b112d089c5cfb75a6ec9f9ab195589031ca3a9e1b10fbb1473cac5b62121c404c372bac6dc0a3ef3e7823557358e34b78bccf8d5ac98ccd8400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000287a4a8e5fb5aa79c0039e5021da533462820de269f883479401dd3228cc864b489f66c56dd0e2168bed9ca60a9abc7ecdcb2bdc88b6977285aba66b7e1f562b6c224cfc7bd454138027fe38706d08c7ae98def2d3821891538374ca5721d2aaf8191a165a1ed3906a6a865398572019e5c980e70b0fc6c8fe6d137ac610a872021fe1173e5c8a87ce0024a30d9df902d58932172f0e21959749b8ea45ff9a968b032c2bd03ce3f871ad782fb2150a6b8fe55ea526ba2b952a41dd26992cd3032b2b0a065788528f478c11c0585e9b4548e7e0678876e4fffc00fffc931ae9a26f7a126c32218a9ea790d54f29261eb881a8e26ff6c3292d697a60751d0cea5d8f9fb70212d90b520f03c2f3df3c4d1dfc568b82d40e38bec9bf626333db11b165d143e70225595c06a3c33ca6c3ddac6cfe29a31707093d77cb7d20832f4a17d194924be1032e97901e66eec039934a15e0856db9342a9334b8ba17ae57c77ee66afa7084060315590fab79092b29849a89383ae57293b295be20a1bee8beb8e5eb9eca8664c2020b83f70577a105d7b6659b6677debe80f4450aa9b1d06a626459af776fa71aaf313bce416b8f62779d8769f2587550d5d0252984b8516bdaf7898be13b360c82901c547edebe56517913c68705fa945173f64ebca007051fb7986aa9ccb9b284efca3a2b6c4d09b210539bdaa80b4796dbd15c5515b788a91d41547972edb844911a8f33cf72cff6be2b395eee1bd05ba8f44e1045bb26b32ba0dece9c913c6cf1a79f9613420275ed39a224416d28d1c87de683acb049d4c208110afd375384b0b83c9d21114c1aae4ea47b07d1fdf72a05cada6c848b9b59a274d422b8a545f5354cf0093cb675417a2bba859eb7b1afd5c970718d50396a895b73ad7858fc74e7708549514d0e9d66bebb45739095a77d6e23de5417d5c87775b6a3f354485ec26a11fd4bd8fbc1441a87590a68651dfb8e959da4589e7cc91d4f46f58a1f3016cd671914c606d6fbf003560615c5a6a2f64af34c1f058d68171a12e5613a886287840999a407cfd4d1b1741e61cbeacbf232723186b9a33e02280314ffa06a129cbbf6da113ca1a133b258ebd85e285cc1f34b63c80e130c1eade32e784588727314d19de827802c617b424e0b9bd44eb896e965bb4aada6ebf7b007160f21f6d7863c092dfa10125b1a2f566b568443cb68818a6646d4fb7724d33480b367be3979a2741dcc643417b3c047e7a0123483904e85279c75dbd5337bbb3a0482d87dd4948a3de6179e12face5f628a96b2ebf78db24adabc17f2ffdf4e375278a9c95a6406324af9a2009b12240df620a5878e42c3773ae6da0a56cf81a1a55cc0489cbb9fa7c2a1abce9d08d6529d9702982d09b0af6c0d4b3430f77050169e90ed5d07728beaf7c13fd8f9f3d7de32641fe6ddb73f20c019e4a6f20a9713933fd5b0f94153fc4d7c85b7dc1f2e30652f18f86f537a087462c87c19409568da51d13ff38513dbb42eaa2042d1f5b31b76e9f307081be1950f93a715253602dd9daf3e026d8e8abcf77666edcb1b6e1cb0e1901c628e21e2a5b341879c8ab9bf1ac508e2f57161ba9a2d5d4f113f962f6d05cd45f3fc168f952e32b0167f3baf90f1490f7544d55617216eb63ee5c11fb740c13cbee804196395c7f1d6dd8925972587b343574486ca906413f5c30f692990dc6b05f02b10f2c6a22397ce0f3396e26f6ca8033ec3631b66aa697963718604d47cc24da81f22fa4dab56fa0deed0f58647a2e28a9cac700bdddf6638234e22e0ea48c8e106ecc530174bf844271d78957e903cf5dec28c836145e1213787418d3d3b262e52a2ee2640bf122c9ca9d7850fc636ab24c27beded2d5ee515c6a2bdabeb91e04bcd90c10aad52d1c52704c0a82a42bc5d55da4a77d782056bf28ff432c4624e2aa75eca3e2169c4ad18a0ef8df35e40bc77fd22d24417753c69c562324499ca9ee72e1635dacd15274af3ae4ff8cbe5a41a46bc6c8a27add862d0309a4f1f9d759e24f11f7c683fe8cfd05af76c7b47101f19100c8ec3de4d7548a8c42ba9a586a8746b16f22fd8a537a2efe5a99c67d7f079bd5e80507788ce69dc73eeb07de07b933204ff9cd1d1352027349a41605b116e5c3a87552b7c5d0f6407852cbcb2f83c80495df607ce9e7defc0fe6f591cdce468e337abc24ada94218d8d2956e8c0caa5fbe446e61f7ceaef24f90611340a57645d73bc1e51c50f100089f3eb23e24773c5285f7ece11a3f17d4499ec5e2ac3849fb896cb9087aabecd717d2b23670d5df6eb8c33f9088a2c35a3f1169e629d4618d5bfab826c3829403c82b5c1af82e7546dbb636787618aa5a1e330ff01334b309d9ce64bcc1e142c4a845bccb66e835002b754b3fa2b727cd548afeb42406413495c3ece01", "6a00006a6a53516353", 0, 825524142, "6cd32dbb03b68ed0ee06651c5ec0d340e7d8d220f26994d45737ba3e9d214494"], + ["030000807082c4030101ca6c6b47b926fa48a90daaea08f3c5077ced6b8fe2183f95d8264a904b609b010000000651536a005352d7444fd402169aaf000000000005636a525200d9c7e1020000000000e4a5402a00000000030000000000000000232b2103000000005f5b4c7159f9090a87aed2ab3562d2a3edf026618bfba7f91df0dff6464857f5e8dfcb6a751d862f0459e967d65e7472b3ecec3aa2a5d759a04778c33f4b060726a14810d37be71aea7675b583b620bef79b93e65db76f20bdf85c405fdea92700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb460103f0e909fae937e64cd6ed3dbd5fd51d9ffe46b012362345b1c827c2261e7520d6683a7719d5675b3b683e36b2d33c403d9579c187550e2d253a0d3fcbf5303c7984577fd3b5bbac5d4d242129d2a98a2f0ee39c51e101ecb9555eee93c661d7204fa05b85a1e2b7d380565b68bd930ec481d2737173610c03927aeb730211d84d8c9da8a334cd5b86446b6f6c13afdc8a03ab6d27178537ac4a5bd6f7ae02082904aaf9b397dc796541f910f2ddfb2149644073e8a4c5c588767c43d56ebd0a01ec4d0b7b86c872d0eb0df38f10839784ecf39dee2bc58ff929e67b4b87444fe8b86ed84bd21f00122f0a2c95611c386c77b92e6371904bb332a912bfbdfbb6031d18503bb2796656d54d8e9efdfae0ccae045c4a64de5bd855aa07d0d3215e58022f1e2471fdbaebe4e84dc188d5f7b70ace07cc3e23b6a80c054b6931f2486738032656c3ed721e8efd2dbb83b1e1c5cb7e3be8774aec463ba452ea30849140affb031a624713beb8f548a92899f8527bff5e317424f3422fe5c737695c8e67c89a82020b74aa9868da1328c99addb07db817bb5f246aee0fde9afc19801b6cd690c2790ae2edc053fa827f0bdda00f8c339a6d8316be0bc7b76aa673992b601a69012f6f4caf5eef664b94967af71a17512250362b29a4302d0462819e0941182c214ff2ea2a91c9332d33d4ff957c54b7d8c0c9fade3103837d76af5270a39055a3cc3fe0906720cd76ba0954b6a190c94fdc61a2715205f96efd56e56e2c0358252f811abba6f824ef66c97264c9de121daad2343295c29daaea6d3212c495d8166523f3fb20358b554cd6aa743e58b889c5ec967ba00a38836470bbb919c0eff5c23c716306e9811a3f3ce33293c683c9bd8103b5f65360aac69c37f89b5c9074e7b442cd9b4c8a885fac77647cff45f3ba9552a0409d1e1429f5484c6aa272dbfc94c569a6aa9b2ead23acf61d7984ba64026ec47aecbddb47b0e813ab7a220e42cf5a60e4b9e8c883c060150f39a63ed2d6a33df95a80252e47b2ee290eeba79a39411938e20f2267d7b06f20ceb36c46c27e69a3f0ee87de8841f22efab162f96701f4a568ef5ef0126d6c8e89186a40e3b6caacc44f697b2ec9eaf587778a16d56936b6bf2a2d995bd3ef77744a611edb4ffa71a9d2e503bb541910860ae2afab393b533a29b55dd5087b54041bc8fc3854efb845a6886cb721e6622202f9af94172c0d63269a309f3b221dff9796dd8d574b1927d4f8ab3edc994e1ca64cbd91f57524c3d94957d1e4499c0125c9e9ccc5873faa3dc22498c618f056fe4cdc3e935d8d58bc82d532d951ceb7c96469fadecc4c04bf6d1e970f185fdbd4863b5da7fcb75d0204fc5cd40bd3ecbc0b330f1e6b6a512cad40774c642cb0bd1cced4f227cdf241a3241958b60eb320b9b2b3c1a47612864c7f20676e4d0e129a04bc28f9bd711a6731fb26f776de5d60fa43f68cf899c12e00fb467b15d2b79d1427a2abdfd8c9e003a132dbe634439cfe1f329e13b6c9ca38caa33eea8de01480412c4d7d5f17b8963e1e2d0f154d99bc9558fde77e457d67583bf7cf486423557e6fe8fd7b278dd13a67e89e34fa9fe51c37144a27b096e9ae4bb8f8285f8cbced2b4f516759cd8e331b7958c6db3e464d0f918710b458403eb442fd9fdb859199688613e895bdf19d83ecde78fa105dee5c950d36d9f1da97ae083774ae3649c63028314608287d8a588380927271e997d949e14cb80f81e213d97fb13151654c5489dff37735c9584c9d8dc65b563104ac8b1b112ffc1b7b94d94dac8eed4a4a86279b3afca86dd840db4f6c2d61c8ad11dbb0f694c7a2f44b76bd90c104b8a6521c7a293ead171e7ef1ce09d4eab859424b38db17087b5dd9dd395d79149ed421c193efdc7ec10850ad47bd0267127aa3ae212d7d45bc4f700e3fade31e8b8c6583e13dd7db2eb6b933693c38a09e29c95634df1b7ded0aa2e0c416ae31d645134903e845f3fce30a6aadf1597dc1ad307b25c3d39c72fe51696e76ec58a866f0ca88e46f64a12c5343b50f2dc5bcdd99bb90e35163703f45410c9454add50ff8dd644eb5b2aab6282941bcf2b79e328c96e4a5ffa6d940f03a7409966303892041ecba42e36bd9d2f231c4fa5c1f307345e08765c370a3ec66c9a201db054c444abf81d6f90442384c676317c5ff94bb3b5e7e2bf37ffb7b6953ffb6e39c76f5ac69ce8a2d9522647b81f0429258e068bc43e9cd792e5e83f2b960caf698bce75378cb967a3a76c60f001b1d45b29d44a1967702000000000000000000000000d6e3b8df357b2f9cd6e88d7ea953766fe59d6af4ed115dd8f8eb322c5c81ab86f3bca4eb99a0ab763124989d9391d4326ff0981d3b7abc4a4dec2f515ce83fb206f2ecbd0520cbdb36ffb14a4c0606c6b5ba20e471c4013a839d148e626d7cb7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005f26c8d774ec4cfe372f43148e5fe8c2f0be06c36f025de937a51cdc97877479e8d5b06aeeb3903a5c8c34d988d3317b2de46c5accc24e2456ec8680eec5fdc71ff6d6ede53931be450956511e09a5904cc4391d0afc34bbdd04077d904abd403c533090e9fd920c7f52e2cbf3f5c8348910f1f13436d90bba402ce946260ec0031dbca91cdb521bd16593990fe3d457fdad7479c2ece182586919cb7518a5852a0212a2dddf3aad1bbc7a5c262647316ad6d386fb5fc8e544bf02269f28c0324de20b07f1805bd9ac1774e11ae353555484fd903e57802c8efd9ca0077e3e2e63cac808053fe8a637514110d8dcc81fafda35dd8b562e7b7497982bc2b2a7260fe47b021b0d79d3e7fdfe0181a4be257ea21861a10579975c60e437579cab43d8488cc60302006db8b0e7a3bafee79fec6de75631e2dddd3fb2f043b7643bc74685c09507021db59b0748e643cb6e0318f8a5948196634f6a97d1e525cdd7b43e352cef7a2702042a81f4de80d71d31f0be0857a1268427f8566e08a419a3046491c28e7b6bc5020e458685141b8dac9cf6b18d1ff34654d0a1f915dfd8d57b428afc0973735f8b67e387ea04a2754930047759c4058ece0873b51517ce41203bcb7abba3ccb85da945d86b9bc7eea9754ad149d720bdbdeacc2c7e528fdbaeedf3652ea1da710e41b5e2ced068f271411a1bf0523d8fddbdc5af41d82c86aa86a3fad83710ea6ba537a4dd16581e28f48d5c0b79d6d3faefadba621b2d48e9ea95c5610136c668fe4fecee39f0d67f27028e7a02267d4d9ddd4e44156b4fcd2e91274cec031bff2751ff9e73e432ecaa6c298982065850eb1c26bad823284998d450105bf2eb9462457e29ea5981b1d124b9ee1e70c91db77a2826765bfaa9d8a66e3f6dcdc61c387f1fe7a0a834c4353c57c05b294575ff9976c347b9d7f2cc21ba19dd153988573c258438e1ee1a4a41722f8de28877547813a9ec1154b25898fdda0a2ce1d1395f8e2c86076d153b824020279f21c4c9e2168c371cdc9cd58055b9a811c6ef14dd3a98f7f5436f69bf91d5380ce111d93fbf91891ef75a81cd97fc4565e1642b24e43c57f242f887a9a6729b6345304f71bc2818b8e82fa64f002ebcb312ce542ebf9d8ffc43c2233530d136d7d116dfc0de2b938ff4710ec289266b85e3e7b555ca322f5ede2512b0e0cb89eeaa76bcb201028494021523433d6f341e211f8593335e788bbd479a2449b047ff76898119971bf1354fad7ecd29d0e23bde8fb45c94b6999f5540b0f93972f469418160266f623bb8a575045484536c2fc1b2a464bc10889f71ca8389714d083b2fa684e352dbc4f274ad22c8af983cbf485383fc0d3ac93d841fb00d26cc040e0cc0b1bfc1e6e95f654aee452e88fc78b5f1be5ec173a296da186c70015ca7d9c5ee6920e2567bfa898ba03f7fdedd830539dea9825561197f615655851290028d1718866e5859f326575bc984ad00ca952511d5ec85e5220dccb5a148567bb7f1914955cad69109a9333d1cd844d936ffe61635dacc987af62a4d8693b8711bf6891d1ef4a2c290685e76c54d0505b2a1ae3c561adc33c572cb95c4b416965b9d9833472f287a09f93e27f81a058ddb19824d0804433df89146696738ca3559be83e755215fcb7beb01e40cc7ee1af73cbac3b8e85511629a8740367177a893228b731b604361b8e3eb601d2388dbe64fa0acb4922b7bd83fd617e5195814ca1b494560de657ceadee298af145985a9c2c7e6c7ef767acbe7638ab38b54fbbba6ebc1aa9a98e578bbf03e5c7b38450d1fbf3de29072d8119e5fe40431f78fbb067ae5cfdeba18f013623b4cdfc498d326a9ec7a9fb99ca6b833214333508b41e9ce396ebcb7eb15452372ff0320bbab8c7cc0bb728401829d0b342af09211ba801efc6aae98b97d224737cb3519d7f019613e0324ef1b060474c4ccd6ed4f3540fe0260bab3bd23eef863bb85ab1599ccda98d5fd4a6090f221766ab97dcbfa8c98d7de79e1be0734391a9699bb74bb36ab015a1522685cfc51d29d1ae0cb18efc5d81e68047004d0229803b8ba985b47ee7e290c9acc27d0864205ff0960837d4c5de138e5bcd1505d4f48e1488d641a63b238f19e791b4c3257eb33007438194bfdc32c1f54aeaa73a03e7bb479bd9470decc05964b51cb006e811548679c4e39abbb6173daea635589d31a9debb8025f05cf4f9da10ec693c36b189cadb011a2e7faca6a2602aa88a9674ffa5f85d4cbb020294fd4edefb11d873dbbfadf84f914b90000000000000000786392030000000041923a1fe63a928e3eddee375a5c7f6f0b0546e6a1ea9f52d43005d954198c08bcdbb8d2bb1d045c76c0cf862b56934c1c3d57c92462f6eeef8ab95d8b2bf0d8ba6212b43245e47a84830a88febce2ab8c60cf270e14ff0d3f86a016bd916a370000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046039133161c4aa4dc1797f4bedec101d78a081a8c41d7bf539d4f789371cf61dc9e1d0e84906bf1a7ef8a62e14d0dc010f617c1ca5e7faba3451d49be47bb9f1934cc9e438577d04d2b3293c1fc2a0b563c7654c298d727d63f7348313f416cc3af9b690cd41be0b9f89360a5f0585ab9dbd00c0e82110dc8b9923525870802022443db36a8c3bd89bfd60485353397b4349bc048d3e9f0c9536ac89830498ba0030d8bb7f5b5d812609c70ba7534af7ba71e8ce949a24329ce3f00590357e4a67c0b0395eff98c5e2e715acc0532d0b9641f2dc4220ab6f102646734e8c5907998b6f64d1b6e4f2f3c5383d75aae5d7a8478bc3a6e9ba8b731c5231102aded2f2100030ec81e4ad1e9894ec6da35e275771cab7be221606d6ba78114ed0c13f02a160e02067ce36f31853214532d16cac6a5dcfa101f83cd8c8fc0c3cf75f68f8dfa581d0305ef5b3ac42e4d58edb340ca7c439a0bd10b4439ee2fadd0ebf83051d2dbc0400313f13351114fa3c2eb69ac14a83ca2b3fc5333af7f393bbc537cb205729514ef021e906e22e2e2c59bff61427c9b8437991dbd45b664673bac45e7e06b42660fb97a03307d1e67359f34a0f7766943600bc53574b240b60d0344a4fdced3047d99f9410d99287a8425a17a81196411069fafcf38bbea130410ac83269a11d11bed8a89ef2c65eda4ed04a7c48cc24d5b3890b8563d8b843078b37578689fc4de6637c4141a59bf6f866c428e2b5042f23c629e9921d49f7764a887b676d7f9815bbf3485a136ac761c00ef5a0384c49dcd4f69a8a221cb9a77a7240bb289f8c371f8da47d245365648c7fbf19446ff702969706561bc96a5c97b1bf2bb0cccfaf5b0fc32c5d163b5a60115e1bb99e1bafa93827450ad2b40e0eb3aa92410304045ae16a6125ba3bd9d910525258fd1b4db0e0eef19062b3ffa6a1fdbf56022ecf859540cfb44b7bf269fa10a43004581503bb124465db6f0fd4d93f92faabf721466ebb158e378d94e031e4e4203ad57c59901da1a4a47837775e18d777a0fccf26bc319c5d45bd59c778f5da94e8704ca6a819f308dcfc4f64438e3da2fdb8527ec4c1c90049e4a4d30f127dff24c3d0083cadb21ca8cb5696e8d65df198e99825718a05ed364d8eab570184769a58e2e43fdbed04da8ba48d42d6ccf29c3338d17d2026e433eb6a5aa178aaec297df1a25edeeef3a524a1dcb58979ebee6dc5db405cbe97fd297e05b2e850df4092957aebab6ec0ee34c517871869ec8ed9ec8bab4489491d04cf3ed8ea0c41540e0ee0ad4c514bbc5deeeb22025b644be73b734a5fd97b55784ee8b53e454bacc48f4970885b151002c6c1607dedd3946983dc16a390439f82618874e411d2398caac576b154f142c1b2c112dc21e7346f11d2f9af9521880c4a53b48fcb7a476f98f6a614343f6f39a5bb9e76d01618dcc1327c97ed78d6a37a1b75b5a41998df4fc83a1fe884181261bfb17132d104333000c4f77f472f48d29941fdc9dd8afb49f778157baf8b0d5e8c717d81aa0779d3c218effc4e9ceba047e65e525a35a71bc1a2ffd040e708ee75851be70ff86df65ece94a479159ec10837bb2a4f5ed3c7e029b4ade9b91161d7f5e855393c3179f686b916c6f8883c52bf85fe8734bbb6837156a8bb4060196c172ec1f7eaed5d97031349149a48ce8cda9e1b3fd660453ed7501dc476023dfc641ac0af209231cba33810dfe65df15bf540f81ec6f5b613d88ed47b188f5f2dcca6788d4a6d79fa45e4bb0df46b8e25c66daed93b8ad5ca6cd9888379d8aa463816889795f7f9f6a177c456689714b57e713d108b2b385ab92954c56301c448ae6b395db5194a1ecc2963b54aecd6cc8f9539be3dea2ef1bbf3245fc5675227dac7165a8a0e8b2325d352c1ed4ccc1ab6f2c1d7ac2f540fa5a7649b14a0c418697aec560d03ed5c51075aca3bcc95e6713b4b86b0f53c6eb3353eada8da1690ea8aaca03347f75c8cab32d673ad0c59395c26b9a187728ecb6a5d248973646741d63f30db56493327e26cac8551c51462a31832cf7cc24f61a6adfd6b10dc1e016ab426854c5deb1c5a208d9a91ff9e5ac4ea3ac5bdcb21ea8b33e8c21842a900dc1a6655d4557328a717577d94c886edf567bf5176736ed4bf8e2df8c68699cdafea37080c51816e2f12d86cf97032255263e05cdb3beba469ceaddf94f093a98def72f21ecce44e3664dfa4838e76553b8b2ba1bb33b024987ae9e71c832966bdc5ed9c193e208e5eac072b0b6692d543558e707a3b64605f833d3a88baadb5fb028870e55d7e7d3329fa857a92901b8d32cf984291cf5c28d4dde4e86538409cd8ed388bbd687ebfa4a8e0072274e1ac7a1df1c310fe090fc785b727d7283c0a276a754902b1aabd67f26839e594ded116bb862eade9904", "6353ac00", 0, 29096817, "2ce02c0ba322698210fa4d7c83cf2dbca8d69b068b5a8009cc843c980e2ec615"], + ["030000807082c4030333e33e669c5e0d36c5bb45b19afed84e39dbc71a1d2da52c5d63cd2dc0ef96310100000001acffffffff885300a32c2d34b41438253ccca50dc69c40d0b6cffff4d33ad6eab9bcc63c9c0100000003515263d8e54c030329a08dd4bdc7cbd10d679ae2623fe390b1751842ec1358374d8db3cdefcf83000000000463525163ffffffff02dd648c01000000000900535253635351ac6534078c030000000003516300cdec3b20db3988e502000000000000000054fb4d01000000008b75a76d33daadd331e3183c15b9e1419b7bec04c5d04f9f8101ab292d3f8afaad05a223adcc647b48318a1504934b37d325f6a5b7e084e1c905f2bb3ff448ed6c7d4533a4d90862496de5ed636655f64e52f60d92f7a8b448797895ab20de7700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b316ec44f6b6bcc2c347bd2b372c8f15773c638cb1659d7b789455ac2081328f9cc23eaf50ed7a1f0d0c2b6d89a40b7254e9e7093a34347417a17306c26b864b3cc44afc251d531b0a5b94db520b773a0b18deb871921236729c727bf11c6e65b8ccb337ae9e523c307c089de6096480a33ec7a80be6f67bd5463f200364795903182e13414a29e4e01ef66a4dfed53fa4b27d9762413035776ed1636893a0e11003230ab9600e719030a072b68fbd1e0753a8f94d335020b39fa136331b12f2e4db0b002eaa02a73c4b95a2168bdaf94cdf8068b25c22dfd20b7a7f955cfedeed7b11925d30eb9a537f922b777af6b70b5e8e2ba90b4b6ee7597301e5740a185b74ec0224a0ac26ede085b4f665b7e6d45320daf23c6d79492e470d67df6ceeafddf547021b99cdc154cf832f00d0f9b415acdb639908a23e588b6dfe10a9a411c7b8d206030c7db7d7442a478ad72fd95d1b516131e636164550b1f02f595122a4d651d269020a0f669a5ea9850fd9d8f55e2ec7c88ad37e3d010a451cfeba685c5825f0edb50317edad75c12e18cd2bd011df6e47f31730fb60ba03f6365320a41930462efafccd7446861fcd80c090f4a9976ce842902cd7133789da0b11b1e1405944b6a082363c50a547ead307fb3176e95a59ad3578858a5517d5d24bf935294051d59a535d7faf7184e99a856bf7b9bf80468015a88e56a1e216fbdc9ad682abed0f5a0d893e66b59833ed525be95fbf8d5fc498b56bdea9657f29c5686c05f6580f0c86cb6099d82d3b491c7c13a8e863db38d364a0efb48fcd32b185158210b21fdec26af445c102f041673d6a5fd34295fb745e6b1511388b5ad108a27a187318e0a25c982a5c06f492f02217c23a0554c07b00bf9e5f14e69b4b19e2c3662aaa0844ac04bd9a4be70d699056ce34f5a9259a7b85db963a38ac4dc0e004e3bb95bfed9b4bb2e556b1f982c36060797f1393fb52bfc1f7611cf801aefcf18b9a92850bdf723c94f297d546f5d4ea72439bc6cf75ad7a4bfd6aeaa82358252d310d636c4e8d75036ded4884633cb6a9d4bfba9bd4e917bed386cc9e8c56eaff243c2a9ffa4e507c7fdbf672afff9ffe66f140c1a12acf1e14cc46ac79228aa6629f0d5b270653ee1139d99286be126ab9a712ad842a60eff28564edd84ca269aa2a1d71da9da2128a55e0e06161a4fc53709a0e00d4d4dd6f9d29965935895f985a2dbe7324621bc8b6bb6f57da1b4a135da0677826af469eb50f037c0f82d93b3679aed899a95350586b93b5b324cdee258549654c639a4ba2e20fe37841c5ed5e2637f4a3a09abff129fd1e58de0d8b27999facbcaa85e5fe6e4b04cebcafc0800dac7691346b45c00dce342cb220f9e9b386840d92a908f97e010988c720cdd7a91729836848cca652b7727ffcd234ec7514ac31774c96621de3aca88641ce3283f7d30f1728bae9b82919b57c7883ed5e189f14d01aeade74e10696d1b9bf380f7b67ea1362a736fd4c83c6ffa5f339f9c0ae5bee8597f30f36c0a0f451436a55bf06de51379a11c2aebafc595e2d44188272ccbd3f40892e4b346990982854fc6086c547073ff66a647e4b86beb9790729dcd6c8665da5e213acd80168bb9bef7f563b2c0631445df2dab3e9649118cca5935c029c61e97ebff7415bced7c7b758b8f1702b8bcce350934d4f3348b1b729b4323ecbcd3b0e121dae1422cd61f24bdec3a760b9b3a0b761e417ee36cc1d2bee5d223d4bda315726f6328446d54a6cec2ec284c9b571f19511b38d4a97f3c4c5bfd2770eacccc79823d91c9cc6b8266dad77cc3c2e6c0fb931da5f219593f790a102452e6beba6f85ae1aba0bb2a5282e7b305ee3e965ec071cb8a555e3e0e29249ce746e3f2e752b938be1059d683fdd6652103347b8917519d7453edcf701ba7b9fa66e765c026ab9eb33c2236749296cc15a7d1ba8039b826642bc78eafb64dee92faf14c528ddb3e5d5cc6b6320ce032d04c9849ed48bffe9430e61a7b2971e034d0c2179043fa1dad5b3575301237deb0c56ae21b16f4697c85035eeb6618cae7bdc0d3f43770c8e80fa68c1783d38298afb1c23dfe8a46d86b614f4ce61d5db456bbf63ca6ebc436bda15242d54dff932265b740f90ca4d46d080551271f90513358f993750a4e44fc58b691afb0bbfdcf3330d80c4d5235555b335786a20d3e0a42c1f570bddef9c6eb2c7f70d76d62261e42070ced39d275f42eea66946f6dc79489fa0e2a4b296b067d5604ce08c0ace09ebfe06bf3dc2e85797d348a2dc10c000000000000000000000000003b6a4e583bf956415d98f1c3153624459acb7e0cf8f0d2847de1efc78023c9b494c052f41c692bcef4b495d5ae9a0bdeccfa7bc5af539a9577065e318153ff0216ee954c269896c3e34283102d4648844886cf9630c800a41e75f74e526dce7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000acdb571607f9b6b72c3a3a2510a913fe508e43c988ac1131b46ebf9d497880074394b919e3b72ef2ce0d1ac427c869d0adb8f1a8c792f65be44621bfc85c7ce8d785395e759ab7db1adade0c5ab56f3dfa9ee81f37b12ba837817861d3c63109be895db67eec5a642dfcde5ed70fabf791f658868df23001ca2f1658e2b3e6800209388e6bf100de01fc2dac7017c4d9fb3a2d8757c8bb8744b60cc411287eefc30303fbf89a6d15bce530521aa92a558f825d68b33b4be736183db145790d0825070b08adf07cacd92c467516a50c715b74367a100d585bec63e60a1b4ac3f3f9909af23ac02c536f87c509e192ea0ff93c366465cef202edb0b5ddb385f2d7629fb8032502d8081b1fb25c420d4f7a9f19a0f438ab175eb1eaae7484fdce6b7cec4da0032adb9f6ea9f13b8ee2e5713a6a946fd1b7db44a34abe5b7c7189d8df71ddbadf030f3f521e112a991202e20145584f53f0f12cf9286fb846ab45dd0390154c968903182cf601ac5630c05f5a9255eeaa9de7c3c740b6b402ac5b7d880c1f8ca93444021c0bcabcdc770dd8e947073e04d29e9fa1f0207b30b26993194bcf50a99187ddc4805801eff7ed8821384ed9b2249f9541624c8f68b9b2c44dbb77e015bde8d648d39c2b598cd685fd39b574907ce727f9b70283fb8d2632d1b24abd94214314f1c43ec918c3df0ed506098497d3521c844b6716073210676891d9a4c70e1b3393a8ea5152f106596eb774d8377bc819c79fc97ee2a90dc0a635e3f6e78ba7b99c84fa005c6b97896f2cca55c10fd5224002a71b14a0d48856d30efcc3029612958f97b386ef26fa8efbd52a4441a0c4e0c09a99e71dbd8fccab7c36edefb47878eed7023446266545e616b9fd32b40bff2d000757191c6a5cdc14cd6993096b00e6b268edafeebce49beee0302ba1b8db0cae51224e737f7861d75ce9f690abe4b4c0502bbc41563513cdb5d8022ee400158ba8369c938f30db2314567550c2da9d6af4535958b969c5932c5233f83c568e6fb192fa51ed1757cdec291a662cb667c83b75007a7c8d6d29621d1f5037b991dbd05da70358921b1d1d38e10ade164de1b5fb33bcab451f7792b88bae6f92aaf33fc7c8204f04498a9ffed89af2f2d25a5cf19b8caa895d731e665670a214272b192cf85fb32eef28402b277e09de281148460e0fad8cd972361790e119773157484780832eaf9d8b83dbef7a100f41650d4ac5f7b3c462168fbad58198a39f884325af907dc2e9b9d7020953d226c5db7e4f3cf5976cb6b35e5f0aa6c29142876906e6080c7983a24342c93d8d8b48b298d28a657600543d7f75dd3865df348044d9c37336184f4c8fcb29534a87020c2ac23ce7346a0b4d6964f621cbfc109408fc9a6b03479cf7dd029f8f6139de3e8f57b7ac252281581f64fc5efc509bc635667fc8923d31eff2106ba9ac2cde81dae754406cec9f8b29964999a210699db326408a7a943193b5eb3436777e5158d200c7c4167d2a51a9fa93e316a085304c41b3a181f5c5b0e3569e22a054742159884bf80c498e974ac4c1040f3f6ceef8bf4395869d72c1e57218472ccb825c6b7a089e5be248b2a11f4d341a2852659592251de1b8b7290a12a692e95fc12641c1296122880684bb541ee7965f68e6ac9e4f25a015beac0ab7439e277a2bd5fe9922c4c3772f1c134db7a87783261df8e9dc1779addb0d803a594162c9c58bd170606f25926b081505a81e82a90b70e64df042145866183be4d78af927ee8060bee0ddd75f6bcaa692f4c1de9b869d6e0749f182f891afe40e093840bb88a4acc88fdab0e286633d27b53be8dd2c2cd704df9aeab4532b24d5bed8edeb669a10593c964e92095854928d2a02f1b1d1b2cfb9eea0cb196957d1de10b1cb23887daadd46fc7d22bce1d71e980789834003dac5452d59c22a698a5baa19234e411c73907f86dbcf6464b6c36fb0c80644d85758562ba4a966e3ad56d779372bf2cd71100869577d8df135bc6e566d65fd98ca579bfd0e0ba82a9d306a8ec24e3fc1954d1e6ff02098d70848fbbb1295ce19b642192ec25945ead93dc37e504f5f9f0d103d809e42721fcb76b6e14ad78634f3d4b0fa04ba1779a79041fd6137fbe3e162ab0bf72f846b5b156ff28e3a2bba2f4a64218446d4168abc37e9bc4917d2a175b4e9c725dfb013b0bca46d70c72f2211d915c1631caff3159d8dcdf3ffe332ecc5dab031be59c387ee7b1064bff0401bd617ed106f037091fe84d1a840f45619eef049283862972d8076085185e7fa985383fc6cba4d9745c7a7c057bddb0be50f65cb455b9731f42841786fbd965d0021611c349416f4dc9e4a0edd6b76175716d7d33b2d3104be264a324489aaa8e6567f686e88ab7d600f06f5b732d18d3a7a3d486613892915d27d0003", "5100", 1, 760059637, "297ec19ba03553fe398bdba9fc27abdb0425c7f0816a519cc856fb9838a7c291"], + ["2df31d3604a49b79b597156d1fc98a45b760690b021c15cfce93d8533103d56d55a87cc724000000000553ac6a00acffffffff1455377f299040b87952731a0adbd6ca42357a4f3a2a574059467c97de12db0302000000046353ac52ffffffffdf40522f6886d889c7fdfa264ace988d436fed2d314699d38b6576ef45be0884000000000465ac6a65ffffffff2e8d99511ec13fb853785c538b39a2820171bc88bf9644909d4026a17cb90bff0300000002ac6affffffff0249c8a10400000000030053ac2bdb52030000000001657a37620d01000000000000000087426e0400000000f8df940a99f06bf1af4917f69752ea810456a6a1f2229d0334b4fb29a04212150233bffbc74ac5cbe5413ce4d3042dce8ef154f79a72ac5bf6b66a6a6ed6b49d5dfd15d9f8a72cb9bfd2283d850f4d09bf8c3f9fe824f51b1c5aa9c2f9f77b6100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f938cb9d9900e2d1a1cc5a598625092feca377fa8c6c4af24474e4a654a1e8d134a8c491e9398f482c98057f91efa6c45f1bd49e1d6393cea5c858f26000ef4724381a8cc9499571d37488a1b21dbece2ad41a5b1acf90c116473240fb2bc0c87fd1de7b26828fe19d882d81f1d349373cf70eb479af084e6f0b9d6f987a9a82032055874a6ec3ba68108735d3f1d14465b4daff211729b046933b08ca1ae857cd021e96ceb3cdbf6f45ae1febc22335f8b7d7dad6fbb9abefe6d1fb608a9b6d41ba0b027373d531d7b3bdfb1ac49c3a7dc2e2817969b1bd2880d3d32c571f9e20add6261d272e797afd37e5703bdac85d870141b6e040ac9ea5799db41a3f4a1adae802109b6b99f1d53b89c4ac38082aa4fa1a96dbf4e8d250a81067bdb89453cecc6d021f96ba57cc0a9750a99cc8cf92afe3ac3748414f58fe7969fa0a03a0e70f2e450227d4f02aba814dc9f994afa7675ee2edaf87448a847bd1ce93daf6a6bf0eea36030b1fc5c8b64efe759c42a1a5e89a5d5a5cf7e959c7f97785d122e0f4db5426e90223c98b55039cd3ebb508c29de1f969ccb3358726838a7cf6cd3f4ce6c3f555db7e0eb1287e57e8c7f71bafcdcce1d5d17c81156167dab3a4caa0a677dd034e1fbb8ade50845f288f67764ec6b4dd16c363f67c247a479cf6afd6eeb52baccf4006602c554f45834c09bf13361a9f9d648c1d26119840a2d2250b8e3204622baabf2bc19355ff0076795dd7f68e9a7ea52d3bee39503e6ee8a464be5fa9d06a892985d47b4429c48f024e3108bb53fec8a9c87516814235647ced13c5832e314a6606a195cd00f3851d1c73d740fae59a3e740b96202d8e0513b0fcb867f867c7cbfe778342acaabd750ba098d4c86ab78edd7fd048d738a0bf7bd54d9bbae5e017eb6a5fceae52d00e81e4cdcdb48afbefcb7d7e1dd0c5fdb3fc233af6f88787a9c8bf6771f4d30752897c2735f674d2e38cced79789ea3a819fca4ec80026e35bdcc682f96ecc1966bbb487c803bf56a17dabc05d6a08f2fd8c5448a9aa1e2caa7acb5a000617939f57544cca2187cfeb14d06922cf3cbed6da415dbb8c0b45fbc4c4781843cff7d30421553b2c233f591fdad98677da9a1bfb786de8b2f9bedccab8da5407aec6e232deee12eb0d818e107ad014d785e301a41d72acf58747b79d6b6c1607f04d33aebe428e9d67272fb2a46bfb93885000d91a4f78c301b5df32cbb26afa9354c9558771a2f00db73fe1c8fb62a9870775a66a422a3557b391035daf9ce1fff2fa79fa17ac14685d340422efa5f1173c6c128e5e1811d890537db9cdbad3bf4285cb7f6136e435e2e7a9ce5a1b71955510d295e264e5b397831837c8b9012d55cd71a0f59dd4be2d0f9ddb2ae4e4cb44d08497b09a044855403797bc9ac8bae39fda6851a2b32ad7dd2be3ca7d7c08a052397116e9c43b2b41c2baf1e89bc7e9896ce98b6491468647ab79e7cb3d1a6bdde1de6f2c9f1ed50351d9b7262cd0f2f023057f13c8bdd308e67e72e3647bf03d245f8c8346299753d58cd7dc4ba6e73483080c7b37c868892c6d4cab8b2fb9c981712650ec69c95f1df6df97c5d5b94c066c4799d67e995a7c1b3df642d09a56a21b97fa253e305d7bbb3aa7191629055ec5f084936ac96d428b1ff071d04d313121822ca6dc5f171ffee35fd2d490a59042d530de8b4de2e1db21e5e678f2e5e92e939446939308ce4af50d2a843b32e41fcead20be4d521496421079fe8dfb5a795cdfa9fbda86fcb0fae8c86e440d8d244288809b1998fd77df9ce83f074375f92204d4a775d40471202f8aca5c7226442dcdcb7a8d4707186280a4bf0ed8370d7a9fc32e6bb1beea0f8282095b5ccb9f5e117120fc3be67a124a92f42c4e1138b2499550b822f853a2fb2ff26b5ecbdd84d2b443695307dc4a2f472d45fc55a41b1cb46161538882eadd26db96681b3b663ddffed6a7eca456ea9eb7b8c3b63e8a0cc07ee3ee3ff31bccdc66d3ad069d74595a18ae0b937995a63adfa5c03bf4f1560b5aacbda4b2ab78e1f6245b2c5e43422965440468652936a652cfc2def646175c7c6677ec027090026e8e84e2425683fc150d2c7706330c296dbcb9791cb551efb90ded7235c2d907416026e754db3bd15dfa64a39cc8432c76951272dc9a787eac3b61661e6f93241daaf01da19526fece8e18fa20c27b7a0bdec45381093a255311d3ad3c29704f5843d193b47e9119d3bf13dbd2a3750510f5308eb945c63db912626aceaccb88999d029ba7a0b81a4b66b956045879637672c11381b6fd3cffe94ccfbaf01e31a6d33293b49177031be6c48ebfc19625997957fb5a2cbd094497d61bfdfa490f740ab6a1e1f9b1d38b28aecad776cfedb27d10c5303fd4b7a8fb066b5dbffb80e61a3008098ac262c598ec05", "526551005300", 2, -1096924455, "56483bd229c1b768695d0a06478165407c8c5d422d1757b8dc619b7216bc85ef"], + ["030000807082c4030405b8dbf40a273e52c07e234c6622c521d47e2201bac787fc027760139779c706030000000152ffffffff87a084e740b9b8a137e46488c9c58a57ff497a5974d5820317813a0bc434009f020000000027f4d45d1d800b1644b534fa806d4dc681700522f616bf0fd6ceccab6c1024cfcc17f71503000000030000631f86211a9909a0bcc69bebc24276146abf5494c9f408c53f6bd68c0d59058c45dec81a750200000004536a636affffffff033cb9d20000000000076aacac00535163401f2101000000000753ac6aac65636506d303010000000007526aac5265516398b36b976e0ed44500", "6565656a515253", 0, -638258760, "25929be4131284ef3868f6aec264bc0b2dcb58b81465c1d9dbdb077d899de0c5"], + ["ff040e3b044dc5c145f0797ac20c65ceea71cf150ca59672e35f60288a5775b15778273aa20300000009005351535163ac63acffffffffb382c22390c6565932d9405746fe19cbdbd0725ab576e67a287f0edc82d983b20000000008656a51655153006a07e86273c3c76740319f113b04456057008873d72e53034fb4021d5b3b140b36c378256502000000055353655265ffffffffeb0c756286818b3bba950eeab301161cf184ccaf5c2f5ace35230480c2a1bf4f0100000004536563ac006b245f0477806400000000000151f996e9020000000007525353ac00536a9ae4550200000000056aac51525394de6705000000000353ac5300000000030000000000000000830a54020000000026752d7b0d3be2e1ef86eb99abed9fa71c6674af652a0e24ee96d7849df61f5cbf08ae33e14bec041f8902f89bf35f9cf5a76c48e65c109bf655b1d17368f3648ba287a7ed010c5cfa3df5f9812967d18c84527d335a792f103895f3fe1247c30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069db5ed0814419ab6264921ab6c1972065a12b989c702b0bf50c45765389bce17cb1320505789d27841a8b90f312cfd2d3ff6a2e296614358f878aa96b2338c56ff5e722f52f9093f872c6950c4278c4183ad827b6721df10f7965b3f8214b9c1443c7157b28d0d2227d7d40f87cda428a7f654ded0853c894090fbd4b9649100320a640f9ba57891f53184e4770af845aaee81d70d68dff65197f7be6c7b5c6d80226fd71936401828946c43553201c2f2cb4f46133b6b6ed161cbc1d257534d52e0a0358152fae38a4b046527d2d3aa78bb7b5ae555c91c5eb9071709248a3557d2dae3450735bae2e61cf0f0d3221bb066915ae297725defdabd5d01a51cdf3c0b80205aedde72523e7bc1c142a456c5a13654c929ab0ee56675157708469611f8e9c030900b8948801730e8b6886e10744c37005e74ec46a47cca56d2573937bdf591d021bcabca5c065e2b2c714779ea6907257e0d12f32bafd0663dc9d0f3a48cf33220211cc91cfcdd5219d2fa9542a3442abf770da77259ff253691995643d7dac85350323602a75135db2e9545c7433c19edcde64d8ecbaad124b30a44599516b56bf9a77aa53252f6de35676a5d61413a16107738adbadf0f936514c5230c105139bf1e8df424bbb7714cac564973ed5277305dedcca85a7d89f298df081b85266ec7c08375e08b48dc6c3fa8cecd94c529b1383bfd4ec847aa3d4023039be5fd64f555202152a13105e057499ed3c3a3fc5eeb9c67e0f4f0214223df1ebc2f74065bff2f7f1a751d3ff413f18ed1da715523b828bb372e96875ab63ce8c0fef0d6e64d97f58c401b0c8972a72dbfa58de76a5ebf1a62b8473b75d24158da0f774218ee4bf25956b23b62c1ff65f0661016b17b39bf2afe4f89f50d1a6205837f34b3038fbfecdb11a38617ec231ab6b21a82b48552ea5d895b0bda985fff7ad4fdb2328f1cbd02d0f023f25df37ce73427801feb04f7b078d76e7c8e764fdf709e63a02a2bfbb1bd3c30acaa91fe0495f168d0eb77df263e066e0292f2a28d4ba01addb73dbf032adedcc21dff93fa7a60c6ada693ea7fd353c4d4d089983ef3a52c559919615a62650d564e582bea0498bfa67a92a98023886a561bd934e2da2b344b7a6e069e374a3c0cea09220d8af65990d0fb4b8def7bc2871857e3c97eeb8c5df87a513c9bb752f341d9dcd75dec2f948ed8ccd5c5380dad121268d8ec6ad14bad728a98ad1041f046e48701510f0dbe25c8d438c5714bf9662486fce1f54c12c3312faa485e2a922a09f61dc8d055f6b440025f471252cbe69a1388f2fb898d5efea1078f725fa5e89c0d05b9b756d7e62a042c68ca3a332444a05ff1370452ed7e74fcb7dde48b26a4ec54384a7c462de946b3b62797e8017cc48cf38da507e9f74580281e5ebd889b2b5f1347d3d4c233addcb0edb459a51fa3d81dd8ec632a9e6dbcd975440e23b5951dd21200f43c4ee1d274bb1135e1dadaff3ef1146278242a8d176193cc4691ff09e60ac7d9bf6a47e4832347c5a2fe46f2c56ef46265d388c8a60c3ba32be704ac39c17b1159051cba9d55e8966faca64faa743a3d7a2cfed48005e97b7ea090c23a6a18517a4a93bafb9fddb6612e29e2db3fafe05aa0b68d23f01e7e1edbd5ecfd511518f11c14225b106795812e71c8e2f99735ac293d4fe4e6b5cdf64412879a0e9c7b48f59501365516cc9d094cea6a3cbe684d8e00231de5639cc0cbcf411c2a6714819c5872efcb31413bcc4cb113f6eb33db7a87bb950385e5ae8fa3c377c3615b67f43ede5aa934e0e469aef38558b8c4e8ad79f0570e00ae52e916e80de0ac8d94407263d32dd7eb19227e40a5a294116c8206306d007271d2ca139d59d605baef4e07499e4458b8e1333d6c0bc81e915c36cb2b88dc7e83c68d3ddbffa2a428c4619081ad142cda6dd5376ff7e714a90fb6dfd066c586633fc79bcbdf1aef02d1c9a1797bec958cf3cc7026efb18ea937aa2d482af0a9afa3e94fb393d6e211b11e0bbf272e80b0325b66e17eec9520d968679a45896a91819770477509b5aea75696f871eb320b00c91ec3b66cb7f49cfdcc9ba9d6b704f4f7563d419bad6b8f275a55aad5b30689c10b518a20eb742951312eb5665d540c5960bd86863b01fe879c8941191c7f2c944efe71c2a9557b6dfe46fa41c6327610ee0e10f139c17b68288eef75c8d65e36802a1d87e64340443e1a1b20dbafb2f4891cf4020740d93090ca45adddf2a6ee10d2985ebebeed269fb8df0cc2ee05751edfdad6e114e6e00000000000000008becb505000000008c674602f066b95655dd9dcae7369d1f288c41681b0c520b210fdff6f177f373630392763b721949727d5bd2027ed94dc0aaa17815f7d29f7a1026c7e78a3efb91961510297eb0f9dcaf3e950b0a7e922b04d5850b6517955c1c01eeffbfb5bc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d22963d80743013c93d37faa3095f3b464a5233e743b13bbe78c73d9823451b36ccee1a08977f6a95ca594d195923ef14bce0a392a7d181beeb9840910913eb6c5172b50212d98626e427e6545636f6cd2007c22996956db12f7a89366a4137ce6b4d5ae7baa3d5947431e11e12f2beb0f08d07e1b4766a49775e23b7f5fa7f0309004f1948160768f192307f7bcb6cc019d66e5370347f58cba35df98a2558bf021b5224781448a849b6741cf8cd6eb8b15193e2ceba99c29b6533121db4acf9c80b026dbfdcae2a2926efd5160ada69f611eafbc7097dc4ff07776928f60482cdd98646bed183a0a54bafa1ba4df7ef50ba9437dc2c144fe14f2b1aafa4cb22c3c802175ebb053c08b45ee437b32de6ce480486f2484c3fb08cc7ee8e8aca54f7ac850221fbbb8c1b5656c7fe58f00744d95fcabe9792a791a2b335771e4ec8622737350202612300a0af962ad4b40e0ab536ae55c8d80e33175eea6047b0b9868b2a0b1e0219b86142bf35452125eff3bffb4bbcc71b38e4bc6e040614af51bd9f191d6a4b022b083acc02dfd595577d3490d7dd1fccd76411743d3cd5b6b26326a7b1ccd40e275e82bb43e8484f4ef88535f1f1a6a022fa331f11a719f5a3a91d53da49f7dc3f86d47c7e0506d47e2d1f6cca001223229c9067ac7cc3f66d46dae3ed7c0af6606f2a75477e5c29732b9c192e09f6c8c75daaf1e5fb90993b940218a3d13117cb557285894b4615ebb44d3cdab4f0a0274d922dca658a3a9b27760a5e09bfcb162a5238e5666b1135af4d536c4bf9180b5d50e151ace5213a8af9184ff7447c8b2fcfeddca0f60a702f9ecb54983e7be481d92a2d9751a54d20b1795a3a9760df95fac635ccaa19da18370c913af725abdd433ac5a0ce60954e809436c10911f54f538df69004ab79e60f4eb1aadb45f0604c3d409e8dec94ebd018c02e6fddeb301832d2feecf1e5c7dbd3c33b628562dcdbb06a116af33f9f9413d9eefe271187268d744a7b058f86e349e74153aea226eca020a90b9c368c4f9b969beeaba3a028a6484efcea7b985535ffa636fd2ae16cb3f2759e49ef8e02bce586dfe935c5e38f6a1f8b1e5a74b5e6edf95d1a2526432c8cd4997ea3786132295198a32280d397664ba2d1b581c095f4a395532f611bf9e4ebe81e7c58cb1ec854f25f40f82781513f2f8fd27f841375066b1902343b0f044c9d00092630044f2eedef80bdba5b85d9b7d784219a05afcddfaea9bab285e0e73bb369d6501989cd4a6596471dff1504e58aada7f5a119017b71c70a0bd25e0b02247276a1bc5b7cdfe846969125b2946863e6acffa7e7939c0d123e7e6fdc04d518e4a61cdd2135b74007d7d3105ded0ee43d3feb4f0d8faca3e4d1e66a748fd0f504f99a9304bbdc71857706254db6239d39267c2841b5cd2df442b9a0c80386a545866e4c8307dd9b38b9f8e7a0cbedf1102d024daf339d6dadbf9b7ec0b7f41dda600f8559f6284e403df2b9af1cbe17c3c73ea9ab2fc536effa086a393986cc06aaa517e704b229dabac0aac8ba2cb721fa6d4cc7ff8227390900ddb6a9de986a1f36cc918c6f945639600606398a5143158ee03389f9cff60bc3112739b2b8d4662bcc314cd3364486045b2e3be230bf00c72235b32e24942268c553a8df76f345e333b378ad9a4d8f1c2df52d03c1f097cf612028cb8da4cbd2253428f38c950104385cef973b59359e1e8e05ba148a778f5e9dca34a03e24e6e99b11fbaef9a887dceaf4c8123ec9c51b75e517ba824b6f6701020d8bbe2fdfeeb087daa1ec748b8c59d7a44b2ccce14847fcafb760f475eef8b4e494e597ed66039dbebb6a913a8d8bacc59b99839c09b880cbad6880ffd1584276cf7f8e367686f4eb1341c8183deec95e7471ddd6c888ff661bc2f45a9a50b41ded0e1ff931b1b11b312d3755ecd49f5a40ee80519237773cb863085aaf8cc4053d7ecbce47283ee5aa1ca5480e46945bbe11406d9c5bb7d7d026bfc3d397e2d758b0e0fdde8ad5e23065fff2656dc634ca91f1f54a02ff226a841ec469e39eaa22bdf5430b71af3ec060c697cf7ac38f137a57dfa568ffdb2bbf7ec4d87f49296d3ac7d771289ae7c785350d540b6981822dda6d35820cf7ef31f8c48304ad29d2fc33235a29657da4602141822663f37ddd97524ef17f2eaa185260c328f48b4aaf1d92a3f8ae0ef8820a582198d3f86b758c6168cf28619d2ce6c1eaedcb253a8e690c532c9a3d5969eb9a0a400e90f0b2a897eb490a0970de58e528af48467670ba000000000000000097aeca010000000009ba0e5b34b50c81326fbd4710e8f038ffb480307ff48469df0e20084c6b0a228408e0e0ef459f231ca7a0689f2af3f942272e847bd4552d6909a060f382d4d88073b9971a403ba3c152b6b5a1c6d66e943157dcfae8c97afa9873f65bf189a200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b709879789fc57cd5d16921e27850ab1fe90d1cc3621ea5157a29135f09b660dc53767613b9a8eeeeb655d163872ccdfdc504b4a8cb54c2eb4a897d3c22fe98f5a1a65a66d3ec9c416d504254c293b6ffe6cb9bf4df4e2e3e4ca1e4d86c480a7d7bc6ae87be9a3e0f8c5e39158f5003fe50c57a24d1a796abe55da3abfe9f35b0313bc46881ad698201492e8e63cad258f8ecc42c0b2a304c58374214567aa0b67022364cfb7bf82864499fada231c48b79dc8dc6cd453fdad0ab9e270ecf4dcd6c20b0829694196090c39634e0cab2b8dd71c8220adc30dd7c58f47f3df2bde86b9811daed8f473a8b3658ccadd630c05c2baa76afdc1b43d513aa0da84d252609fbd0227ed37e4474fd50e8aab0a2702eff79811892d422d0828ccf1960852836c57ad032bafbc6c895162fc1428dd77b0757c835529e782ec8ac096e03b7034e3e2a0a10329871acaa0ff913e59da2c102f9d1bfd153419f2c45bae2bd8ac2356ccb6426d030201c50ad6bc23e8c9a503b24bf8258414c96e239e053591190e29b6c394a0d20307dbc81d816a9fe71074c07e1de18d5d36032035d782a5e154f349b4dfaa930495708c1ad18e38304bf6e93442daeb669f328ef22fdc62a10575ce7fcc9d6393657b34fe09dd03466871d04b09edf4880e4284a9aa29037e05c573f0e24cb54e7872e5d3dbfd28187696ed373272db2173a24d4cb2d51c673c1504c7397b2138416034252da6b20e4c4f55527762ce6a1c3039fec05d9f5f5639276592682b79165bbbc449c570b3374bda72778b7decdde6df38abae0bdfc8f780e73238e4f3bbba2cba43434498d76b49294f2df1130f6d1d691f16c9b098a764e6164950e15c9673dd6fbab2723a76ad968f9dc4fa80aad785ef9b2fd40a0d099ac4e4e97c62335e5928dfb689b64aa95f560197b923cd9e415785cb493bdc2895a6e146b4b69a1a8713af89f2ff0ab910bf89ffd98ec5e970694c958102adec0ff9b77b478bee8b00f75de598820a88a095639a312b89d09e7173de6f8fa9a7ce2657503d3887e40af00982135bb614d59ca1df0ba17e11833a51efac24f5420f7706a75b7233aeb0303fef683b3eafc2e3f303f432d81933ffbf70c2eb37295da77f3431b8bbc763c5e216963b2b38d91d6c9ce98f8506c7cebd89bbdf59d8efb27d5175290279d4855472ffeff6c0e358759b02d272b9ecadd971a57e2f80d200c1a22f05ce5573319122a2fd8feb2efc81cd7fd4b83ddabcb7afb39f5a5b42fd3c37ffd7dc8bb8ed0cc0322186a151d1ee4abf7d83fe84481e1134399ed1a685bc7ec2c40f49454104137755d0681ea8040f66a0ff9c6e095f0f325cbdf5be5198c725ebbbed17591024f86ab8ba7ef0f4d957eb0ac689a327f657c982d6c7903aa3b0a01f529200ff90cd37b74e2165b761dfc72df7a8afed3ab859ca60d33df33e7e05f00dbe5abc825168f1d73063b427f38c73e8b1e6231948b2bdbce1e5b161c90e30f19fbdadc6e569ff83e3bc1afb229ccad3120db9a2bde5eee106acf6bf731e54abceda64b9c265213c1249bf4e4ade4c98d4063ea76de2c205fb78b198a5515308210e725a2ce6075332f7708203338a720b31774050b8441f00563d28a0517e3036cb99551b2c2897546a93e2ef699944950397bb0f4423f42f406eb729ac52c15a72fab9995bd72fa51890bcc2534cebf4fba733a9167e17c4953d02c224e1b2647ae46bf2476a7889b3c2dfc815cdc9d6370c5cdcfc7c7976441f12a4c7006bf5e95fd4367f8bdcebec7892bd38ed4bd208593c9eac74ba199b62663026708a6f4a5352c8763ffad20c8fa8958650b3b3e307e79ac52a4841b537802a12ba6cada39bcaaf4e9ad455b604e7b4bf4983d28cb3eca663d0f1582c832e220bed7486338b6f876090e493e3a582e4f4ac7f234ec7155584fc99a51455b373adfee6f9e7538d17b3c08f5d1864294735d60556c443098d3167a9c06f585759855250e544aed94736253db0411355d1d5287817ca9a00225256a260f5dc6929813b4dc3a2369d0de6ab2fe19a94cccc11f370b3cb8217373542c8a768bf3f063079f30d018c78c30ec08f7e5f9e1825f4e3a4a2844f2a1c71642881e110e444d531e7bd8fd451c4b81c6ceaac840a0059b523457273215742ddd2a973a4da0704e889bc20f2715be0c621af796893d081b598591a7914eee0eeb6d7da4aaf50aec13beb70bb169b4b877a1564a93aa20dcfd9147e0f86e156848a657738f0a86154e2c64a7a2426a0cc73f726e275a1febd59bb6ea3055af042fbe60f175ff25c6f0064fc07e93f29e49c0a38315af1ce414e5f8f5d5a3e6cf0b697d7b30ea142f4308369547eed9efab2966916fecd263e709151fb7c22dba58a15e8a21f2eeb58fa83642f7bd8a70856bf94e548d51c08", "5365acacac00ac", 2, 1477509242, "d595534b05a9c8ebe6f8e9772c963d8074bf92cd06f2f35fa8231d3128322144"], + ["cfa8ca300135bf0250ed1a5b8b36da7edd8db739ec67a976a663e9addc12e1632a9f5bcb5e000000000865636500006a005172b5f4cb03b231c80500000000065163636a51533b675104000000000752526aac63acac2d04f60300000000045200005200000000010000000000000000a8523e020000000032fe61ab70d1a1a3d77c5b6e7eb5361cdae4f51dd338b32cac98860fe7ebde5f5d84ce09c13c41613297dfd2d35678531e7a8538689908ed5added2c167d62c8aa20cb1a23d6fdc2c98295d5fdc0d9544e19972563ab2cf31f80a75239accc1b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a9d616598df1e0575ba044cc7876504a055114a805e4aad02805c3a1714c653bbddf3b182bb1b053c7948fbe6eba80a593c1f9c8c3bd4bc3c34b2dc2d6b514b2cdcff1e5868b8e9ce020c359a3b2e3bc5e0821d407e9410386fcc3c4c29a8e1ae5f0a9d7df1a970126bf3c46dda034247667e6f5475dc5dffdfa04f371f9c17a032aa859da8d633ed926f32f9b9e4615a81f0d82b76e9f4cb83c5a2dc6158ad69e020365d23ca31c3c10b32611fd39b6115a1f8004ea9e572082722b3edd78c40a160b08e1264f24af7dda1d271efc30adf58e4efd55ee73b5c5a02904e43ff1f34e26a676c3cc2829bd2cc978b200d8364d2df008590762a6572537e5d1e1f76feb36031b3d3e4a2e8d7c72c5452f2e7a51b1d997e9d076a98872950e4f1c5cfbe031710209ec93e066c2bab7f4f9e8dec053bcabfc2721ffebc19777cf69eee3e564e259022801b216c8205cb60fd0f4960f0cd10ba8d47903e72d61d5f5b8ade4b3bb882202197d6fe3f363b73205113ab77d3befda88902e8200c93876cecd1b565631f0ca0314988bcfeab75450ffb77e4307a777e0360c28f9301a6f78932fc15db2751422e6e28a886b5cedd2f6a9f2f053bc9ba547acd3df5389fd13a08864f31ab4d04bd315b7da7774f8ef6ce6d116a9c151df6712deb5ed9b06083a340295ca90e0b979c5232382c44c01b46f0c6083a14065d8badbdac1c5e3494b238c7743104e0db3064d6de5b10315e505b255813b8cdf541d1bdce4816d23aa2cba2f8e871c0dbb8368d10a1bf2f20883de6214d70f8933c5d8ab1ac68358b069c8c6c5646b1c47456c9937ed6a2a6f44e1923ffe2a3043cc53c8f86c0f19b23522fabb646d7292614f948b6212c21359a2be368c51d427cb96ce88f04d5236925d036aafdb8f3f8901d38a5f8cf985206dd093ffe106807d051373eaa99bb0bd81989b87aede62cc7a8bf6dbc6b118eb4fec894d63c9e592e12af4ffc93528203336fbba22919a63c8a43c54b78f3c8a42ba16f397555b362c4ade89ec2202f8c6bec429fcc46605ec5d2e460975048d8fe2d3e8542d9e7360cd2f3f14aba24c9def413554390ff8ef8a3e3f9620d9a469bc6f5e7a81765a9a053cf170059020bfd7646f5201348644abdc2386954e345ef55e0cc3afb57e5ab5cd835b8190cf71453d52b89b9d99c18dd1c6157793d05ee304e46b551dad82ecb660fc77e9ead744da92ca06bf0a5dba74040d922ee16b14a7f61828e3e8f1a6f068509e9eb14919b8d8172d53fcc401d234b732624108fc2c937c76d540606dacaefa984ac486db5638be26a49c6cd6fcb6bd1d39a5ff60ff6ffce7beeca66e26d0ec59575083a5fdc00abc4f082f70669c36b84417d1c1fe90442d60983ab0d9dcba4403e415b500bd7868e6d9fa6618f32a7b8a2c264ef403997ad82814d87e75195d2d225b4f6b00c02c946f033c5619c18023a31c79c8526a8d61f752ec1a4acdefeda3d14d05346f2311dac6acc28623aee1bc124465f02cce952ad3aaf7cabe38be82f1d7f60083ca49c57ad055bce774c6738bab720e9ad2c56144ad6859ba22d89a5050f365f9bad4a94fbcd2ce66ada6364e1e37e607bfc86aa22d76374079b1dcf2065d21105792f03cbc187f03a55068b10d5f58cf3bb82107d19b504bfd79de7e955772b8cde3925ce6e6ec430fdd2f77cd8bc360ed99089a94da03e751d8c55c9d9ac0da30692b8e26de68f28d23e0ed0a5ddaf74019465e927d795bae9c5a9b1cebdcb8394ad25f8bc6b04f1f0c9787f3a9caf131ee6d1f428907b384b43dda5de616682d965325624966c4ca70ee5d9858d8fbf46634885f62c072b7bb4972231896171b0dd6b6c6af17c27cb20432fd1aac07f374cd7c60c46ebe277f310fceea98767405c4c17a947606c044b1aea708f70301442a3919f3eb4cfd00664f9a1d3bfc7fbd81b468abd62eeab2754791dbaa734478f672953384785c91993cdcb0830aa98230139fed7f0ba8d14a79d91ae28095db6fe7253e4186156f5a2685a4d72b68b020ba78ed6b1803793434f6a25e0aea834cc039554c582b5f56986a9266d341e717a73bd42dbfd581176e5313f3ce3de0fa581d3a85aa766e6b489b05ec81bd692ef55894f6cbc27929b4d4fb5bd67d101cc531d4fde64593b26ee339e528082a7740861ffe66ad60499fdba951d0e5c289f7b7f8f73c3f30927313c5638ed994e9efcc0417a028603c75f0adaa3d47baca99f6fd24424fea1d28ad8bf602c0e4284a0ffe28f5621fb15a6171e27ef2db84b041debce4efe7792e87dbdfa97d2b59ac59b0bddebe99f733aa6a015d2352c40ee8bb9df61ccafec7f342426d12b1b939129dca93978fd48ef65dd482fe3238ab51193a90b14002a1f301c807461ceeedc46ff48721bd95e158df513d830203", "6a0065656a005163", 0, -480249151, "4bc3f83e80a3babd80d984054dd62693058e7fd761e54fe390644a8f64b29734"], + ["f5730f2c025dd1f017cde5f0c97335205b544504725489125717465bfaeb447b371d4cec35000000000452ac6551ffffffff0cb8600e23bd05574dafe8d17a61779506f9849b37fad429c9c3150959a706b403000000026353ffffffff047466b10100000000086552536363526a510e600c050000000000676a940000000000016aabe6ec050000000005516a6a52007a3bc61d0300000000000000009edf190200000000634962fb0aa3486c95c9ed2ef13cbf07ba796dc581b628f78e524ffef07070cfbed489c9382c4e802a98083a5daf063a13fede0373397e97c035e7b8074001f5052d9f42fdb873bad7b1668bb1ec1e274f83290cec29cd76197382cd2e1030cf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052809f86d3830f4dc7f395c371fa8fc7312c98820ed50dff05e0e63fdd782c90432ecf9721d06486848c13ab69f9a8d600ba4357153ff6b966f13b5970d77887a25684a481bca0309c68b3a50bd4e93673ebb3cc6d0c0029b28cdb8b7857f1ca7012cb90d9fe1810de1ae594bc5b2587cbdf017ec3614b55594a8051b7f2bcb702036b52a9f1a8a10637d4f3205fb95c091792b9d4ee6009ab13a46d429bd65c3803130988ada4c927fa19c5b6339525deab085bd1c7d80a79dcf6f965d053eb0b250b07d23416b2f4fd80251d5a21ecf7f44101a51ae9e130a2a4bb9eee2540049e102da745fa1b8ca243dbb4c1f18789489aa694714dc6999f04c71de694f51e88e502294e68b708823bbde33705800706565c3ee1b83ccd4f25e3c550f3af542a7e85022086cbbb295cdb8ab8469f93928ced29e60e688fcf5aa2fa01063bc87a0e5fd00307e4bd2d9b66cb56073d0bb67b75f81d85e1cae1c44081831d8bfd7ddddd9586031ee7aaa19725d6f2cf4c84fc3fe8a5e4c6cf343e9abde5a5c4298d2e0c8d8683032f92aeed6af742aeffb6ee5335675f9faa4289c98a9ec9ab1cddadbe1a41b3ccc02be55a3b746576d44c410600cf5c8e298ece0f59639c1becbb2afca2bfe06572c63796ff48120bc4298687aafbd8c7563839141477840721a170e62fb3fd2e831b3df8ff9ce1ee8f5c9e476c91f2c5bbceee12d3b52ea6d33a69ed15c55c2c5aed09384d1c58668c0af3f503b7bf895ebfceda21e95e666df10eb0c3f6a9d52c18f7f425148dbaa2afb27d0c3b0960555fcffdbc3515a99f4ff2421cd007cb73e6d58fa28a92f81a8cddeca546d62574fd76682ee5aab0a591b44970f013c710aff3fd5c98377c6522918508b10ad81b58783aa107f8b66a547c90e21366e6a57187b06213d744ca809ded87fb6465985772bb08e86956947e9b6e3259227bafd9a5b3520f0cfdc86e51890e663ce572fd1e99e7caa6ba35d5cc21b5499744f7a184af67d67a395649e47016f4119c6b4186f58b5b72be07eb095a824ce65571b03e908190d21482320cbd3397641146ce6dc3e594772ce7452535fed9704ea0e7da3c2b3e0c8c854a6b020a9cf91d8f0146e876fa0a69ca71f29d8851dec5edf93ef10d8977964fe2dbe128d5fc8678952b545ae97948917440e735909456f283553fc0f80684516e4a3a8d82ee1ce913ae01049afca02bd08f1a38c9b883b2882ae0fbf04a400bd07ff1efda21c43e95331a97b96c9518ffe04a50cdd4fd2ee7d6fec354c0af40e49e6b7701cc2f4382f6aaee2d4f4d1d17258484644621af3876c13cb0d4abc1b408f7e3da6cf67050d9ad8f998ec9ccbc3cafc1d97fd3a2fd69c5e5e6a218488194f10de065237e57c8639133d70919f98f7989f21aff5031901a29059b0544f3701423c4f9ab90ad5a2d9cc99f79b80dc763214658344b6eaa24db5888cfacff1d680c57cd5f6dc01ff2dad000f2730ab32e3475a29f113d2cb2ed5926abbb5cc05ab82c52e96bafd3cfa78c9806ebb8ecae3ac8d9ad2d377df5cd6a377950e7dbaba95b86f7983835499e27dca5b1c5e1a36fe3e8ef284ac63319cc7a5fb7450cf68b71a56e89e3702c8e9810f73df963cda9dcba883386fb31240ba38f3123d9eff735148991b0859f2478316aa41d5272dd69b9df57c2a3dad72917f581fd0a4bc1297817087095989f724b4f9156561cb6972ee61e961b84ca07103754e405f489ae76c3fa268174ee5f6bd42a9956bb7568d25da832fc7cbddb3c09c80c954c52581334b84490f661a7ede3eba3a7affd4f6c0689dbb1e4ab0c3fa1046f6f7dc7ac7a8b34c2d16e3c22f298cb0316e5823fc4381ca4b4e1549c0a484b70611e65e84e96bc8ffcfcfd9e12033dac5077d584f3b1999563132dbe4573e35aeb651b8a56dabd58a173629ca920940d4599ecf5dfc73446bcdc27e13b895226c52cb6e9e0560f14be546c847b8c01320bb2ab807a51aaebfdc78370399216c9b69469ee9741307cde0ea7dceb06be17d2f95544f86981766ef843c6164f940d65d71be632a9ffe4c3c62cd18fa1b467dd6651bbb65b30248927088e9ec16bd6abab7b8f76698c37ea364392743a17880832162759f9aaf7660fc9b4116a304a4f3ffb6a182063f9edcfdc463e331c37c4a347e1db33dee7bd8b99ffd5e54447c3acfc4b1bae37cae96c9240a29e6175985bf16dbb6e4b1ef9444c3ed8c416380a0f074ad87fcce97fec804a71ccac9f97007b1306ff33966df3e01174433e7dd15516dc06780259000000000000000052b32f0500000000e237f1345cdbd0a7529aa9d9c9a4d3123e0538edc89caeb75626ed83bcbb7892b09fe852f2bac18c0fd61e4400b7fe3342b528056f8448bbdc63d2c5982e3434c27156191ba5e82cac319ec3e1e2f0c9a03e66e4cac244a1f114e9295592ca5700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f94ee2a9eedc4561d8fa1cfbb6a713787e5eaf3c4cfd563bb5ec52c3ed056ed0e39d8df2bb2a6180962685586514c2775998f1ef7ed76a067550fe8330ec6d634f35e9e35a87336ca8fb2be00b3195398d67a2af1f5a679dd99de9a379b0c6ea99e1a4e8f797b8a558b6fa80ed782c1a00ab8e56ca68eab4e52ec74526362f9702052d9d30d5ee97cc2c120c52fd7a48c389953aea80a766fde7637c1866978da20215811058b10c01047f85d0c052662ea1791447bf29b4978b817c1514c36631070b02c0d061f2fcf80f3f1d36b951134ed44d7781fe9c3e05e9e980fffddd547cb63ffde5057a6a08f638090d351ad09b1b1e1319cb985228cc23563384ace4019e021e3db325ea3fb3a31f26d645636d61f603c69f1e295fad2087f859f788a68fae03255135858c5725941aab5e42c8a2d1395990a0b933dfed1007ad21afc2d5234b030f487f339334e3a09fa0aec4a13adfd6dd7a8981abf1820b212515cfb4f33406021a6947aab212fbf157ead22cbe77b5f5b8fab8a619059076164dcdb142b19639030597a082f6cd352ce88c6dd82e641a805005b5c00b9e79f6b6a837c13c96d34cc4905b90bdb627f5773780c81cbadb15887c02502dbedfd31d475e7c7e5cad2c7ba7220de77a08be3553a08149060fc02302cfc7b3f9dfaaf484f9090f71e7b90d6688d686e992ef94e01944194e9ad6ac01e65bc260e9c6264e1ead472887b23c49694f66c6e4c49d4aebde7d80a19f6b0f5e6175b19a3eaaf0b9659bd5ce6c65f4cea0b541b63c83387892697df74f7e7cb969ea3bceff0fbec22389a56760550a0f7fa251290071521508eb18bd9b853f2fa19bd508a87d2ed41df45f9eea87682425020dc7280c56924ff175f9dd6c3bdcecf56b88c8d5872a3950b65c83ce0c009b4d9ac89f9763b6681ca9c53cb0a24a706a961bd4929525fe88841913cf2f1c48cb33b17a95eddf4fbb7819e8084e8a92b35d4f085d048b09b238d5cd502d534aac30b12e2a7d6e8a980f9fcc8e507c513b219ddf484f989036fd08bc58794448ef12754250d83d6f07ad967fffaabd4377685f6fb3c8ead4ab977867944cd1fadae90d40d37881e1d9cad7b88adbf949ab3801d4f1d9b730905408f379f08cd8d40b1b446c4c4d8ee77949ae92ba9628ebf58e267c712efb4d76434f3916433bbf0c7e8552ad9017da0486e4b1dced673979c61ab7c0b79d78c343d643872746a5e21e19b18647eb1d8ac12248f4e84a75d86d9cb605cc52b8253d16d4ad3b2b63d2d8d46e40a919e1d3bb7d368a1ee3d95700d3369212edb2bdfe545644f8a8c5bbc733da2e9b070505ecf16df2f6d500ea2f379ef77833da6af5a5eaa1ebc30926cb1945eb816ec0d27ea5059259545006480a7103dff9b3df14b9a4c665872588a387dfc8fd926d008c65af4e5fd03836e8d7736c0e8724de81e3914b6777fbfd0349bd7faf4a68719360afcb7d9413b6d6839ffd6ef708cf92617cb7a90c21f5efe54703c6e4e7db29f158777752d235125784d03b0f0f99cae64c414167015b0aa23a897d61c663cbcd285d8ebecc0b42b07f0dc48d3df0e89fa74893bc04d149ff4166bb976f14bba9f7e97e4a7305091a587b6313c68f300c81ae7387bb56126942ba86764d70f51e0bdd346e2693be56603d858836247b5bd851d61a30702e9d7e8c68da567cf0268280b7a659ee4d50fdd071770fbb1fc8d45615c631675b2856cbd4ccf7dc6534ec561cb18658cb680734e1f62134b4c160e248bc2feb30133940d445bbc6050e7cca9efde8240e85a3dc014381975d2f082bf8da8f4ad601e821ee0f84cc7140600c5e690a1c8898bc9487195215f5cc20457ebb0a93b303447168a1aa90604cc2731303ccebfecb5878769cbbdcc35d41725815666d33309809bc2b838f06e4e309a95ef277e3b9eca1eaa30e881d6aaf6b79614d5db6f3900ebba7516edc0da394e021d65f84547c4af0fce9118df2557d95b5e31a27a2813e3c24f5a776ed5d08eb031d3b6428e98bf326ef76b0085ac424f46f3b03df270a84ca34b88959fd65fbe6f5db24f52c27c5cbd7b5403d93fb86b7322ba9fafcd3cc188d6abd7ba85d6d95baa1a34a77d24bf5168793582061720e7be92e1c9d0be1bac7ca83b36dc2c4bef9c496181aae99e80b214041ada904b3ad166c5f43f06e653b1db97b11adf9bd1a9fef7dd0f708cf1685b5aaff12e0d63d30eee1adeaed5a9ec4a49a20a8b43a7db2d12ccb0331532db8e640977e60a7e3bba94f82a6f3fcc392b42d37010000000000000000a729190400000000cb8db852f04122a022f6c3ce4661024e2038540e4af6f8c699e8b04e2b1db809a9aac7f0dd8c527ba94f90ec02d34194053b3cd794dd43ab335af36a39cc833af379b44a07d8845149d8609d1830636ece980cf0b4712b4035909c40180f51200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091bf038eab11605b8120fbdc2ac24399961c8ed2bde06e8ea05d2dd0bf94cc835e79b684b74e4e0865a779a8661da7815c2f7f043a734a45ab312e6798a8de91f5542321c15e55ab20a76928371300e77a00924f64aa2997b7ed24c9a3a7aa1238bd9da193ea0d8afef2e4e81c70448006daa2e67d772e9f21d5e5c29be066130201f5693f98640de01f7aec89ec0ad9bc3d481d2ea02f2635d0eb4840e15ea18803062aeeefd82bc7477a16d4bd95ca3ce63d3ca4125bb07d10cda844ee17c57bec0a07d3146144435df55cebce9fd78394cb749020c439f325296872047d673a45f2af54d35d6eeda28295cedfb8d0146fed96444e8370afb5aa47130b89ae27608a0212bd072b860c349d547d6c2874ff0aedc443481de3cb3985829dac6762af419d0216bd51ac36e353dec3d6b30093337fcc2ab140ab181a812401a51126018ded86021941126ee4129bd497ae0cafbd9c6930cd5d7c9191bfc83bfc9f77b0be9a7a7d02265a4c1e473309d1cd72ea242586c670eaf8d00e1709981a82374de1f8f93f9b0325baba05c3183f9e786d5f589c2ef3a4fd1598e896bf1ff25014a2e55e7da30520eb7d301ab77adc871ef5b552c789dd86c6edb25a2392e0d71f3a9a7b267ffdf093a5342d7ff2d4cce0b9f79e308fd1c86f825783f8deae69e52ea821269bf730e459aed47a09875928a58b1272a9528990584b0a899ec52769966df1410b896b32d6581a44edf082bd0d10094d2a803ae86b3fb60f8dc414cf28463d3debafced91d37bf599bd76a6d555df8397a5762080e3f66f36f2e568a8e52d84d968f354eb877135639cb72bab1c772140bcca48aebf125b12ec9d2622e9f34433e4aa3d332ea7e5b2a59f23c20655193dc451c2f5266ec95e6d3bc27daf2911130dae6af7a479e4a181a9cec0d2cd11a9ac1c0544ac34072ac82bd648f800ffab37e146ff9432f08991d5c6cab98842786ea9b79da13a2260159a4b3b6af1f75738bdfb08400461e5350f689c4c6680bc4b0b8494c8178cfa3f62975ff38a59fc84017d8f012cdabad77f03d7f90338602d6535def68c706853e5101ee3f252e2c4f91fe89fec0aa52d00b54402ec948f6b5b5cada11abaa4ddb84e804e8ec8ed6de4f742934d93547baaa5cd0e2f7678ae1bb65bd31276bce3da1acf74a44236d217039e64c3a0397669759e0709650215e96307fdf0630e7602947c912c1451e2c3c9c57388238daa7b044445e1109caaeed8b120319e1881d3f2d0b6fc5d70889d2c8879b78425e57c54281259e36bc3028d11484ba387fd58bd8ea90268e43c9a7aceca4f532962108bcb8f1337556fb8d27def23d1d4328cb8b526c17a9a2613db4939ab6437760b12897a13353ab20e5c199ecd940352a7d74c6570e9a001e501ceb5ad4d75d804bccde13bf110ddf45dd9192560d58a97083f9d47bc6113d260e0ca5cf5d913ee12d76eb7130d8b91f20359e89f97f2dbe7aca39d6e1135c362f08e01fa351740ffa3adaca9f1a33d878535759a7746e9d2dfb86c7571ceb51de278e5f6d09ad473010579ed7aef0272ca325ed53166e7500a20200e410698e06cdf1f42a14c45582aec6925763ab13c8c3531ebb57a4cb0d12379526eb110dba40589c376c632a0127eb89bc71575ffe6a853ddfce57c24dd772e35cb2eec2b48be1c0d5f71cca32d98089771406142bb98850726a207f62dbc8aa04cf2da1e4a6e60f305c9d1e10e534bb52750842db9e4c06ca21334c8833e5c8658d3b4f18b08ab6ceb71ec8e9b0bbd899f207077f65418de74a9e7e81f0ea2898dae6a77b47527fe3035efcd9fa66a70894b662ed358aba6b7cd621366a73565f737bbcf86f729102f2d26990dd48111390f45c93ab8a5a0c84f88dd6b59da88cc9fd52b49c36fa1ab1b40be9dd31956fdbf5baa7434555d669edb9b8154278a3c970ad4833f5618ce6ac018880f163f4379adcf665cbd6140f79bd13e1cd17f1b1fbd165a89fb5789a91a9d14a6f6ed71a7310a034103446d3d53a14a6ca42564c751532d62f233bd25fd010f420a11b2dd87d0735bf8d9af31c970a8068de792a09cad93b81bb74d8884f5df9de960a760e3151cd981b061e1e29ff5018de35268917a759d2c93eb81c3a89362ffe06047b12e94065aa2a8ced1d7c56ce20ecf85616d26b891bc52d2a01c47524dbc6d2de24ce54566b63f40392fdd8e370990c0a981bbc5dea86d07b0fdc1267e21156f6f73c37e3f962d240c33acd4868d6424152c160d8d9a48c506f2f6c218a8d4e08bdb050c48dbdac23d3e47b0c9286051011f2d80a56811f24e85c57a704fd6b6087d53cec6017be0b37c66bf3d722994b4fea62114709e6e05d5aeb68373d5f7ad78dfcdb55b6d561440a0b1614a5902d72fbc81d1a33995a283590843a5cf8638b01", "6500ac5265", 1, 1946987001, "cd36ad611c9e60ad6b9350c6c8612bbec06addabc3319f06a7b0f22acd380d04"], + ["030000807082c40302aed2c79e1ca6e1b56509f37d401e5ae95533847fef13bd1028730b7ddfd7df550000000005acac530065ffffffff80813b205e396c20eb88e81a572726d290cd54a8aff004c62ff112edcf6cdc820200000000f7797d4603c92a3a0200000000066a005200ac51059c6e040000000007ac6a526351ac51f0e6ea0200000000036a00ac68741dd17965f2d7010000000000000000b7a02b0400000000b12d6187d0fcdc73d4326f8716c025e622c30ae954dd23da7fe32a86c32b26b96699a48bc4a1474976111914e43fff5d8b1eed137faf8561b1a5bc8bb738067ff825de124009da7fa78318c8019ad17e014aecf8868252ee5994bd4303bccd1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a10fce7a2c11cc8301dc09a24d564bb9e8f0aa116c7877c1502f33a151e9cc25085072c09a73f8b9f9b3ce89078e79d9e91f4a9217ba5a8b5454199d3c342b1eb4ad811e4159e8a48c18ef1e2cd5834f1832602dd9e7f94660b6d06815258a7b6c20b3e3a7891b4e9c7f1aa17ea646a39ea0d8d6ee1f04e88b403f7d7a2e81d9022e45f631f9567146ee9159693f82fc5a615e71c4ec761521c83ede05db87ab59031e3293c4cb14b5e152bd66e7c83d12def9178ff3d220f8a598e6051d4e49fe2d0a048680cc78919c12f5d76ec1e9cdfad12a637bab0ce65c2db50f9c8f4573999784e4c2699a6d4b9bad7d8612b55bb279bcc654a6cc32915590391ccc939256bd0310e3d2c353fc85206648453d2ee1b0baee0e3a3912fe0c630340ab6597a82ac8032017aa0bc401bc108441d69297af41006ee9d008f2030227d1711ff34ed3c5e20329cf3057d8e01e4dc13c3b75f5e121729759607197d0ee3c3b54a93433f84b23030edd04a57b48797722c688282a904618a17f1907da567f3ed00854da0321533c02166004a592f4c009f8e86d92415ebc32f89a6ec3527961830c5a3bef57e75edbb0de09096011b5fcde2d31c00ebff7ae414ba4f4f2b8fdb1e383eba7980fcf96095a3ccfe274c49570d8139930ba8e8480bab4b2baf79a1fa57563dadce0bca615916cc454ecf14e0524f5aff95cc632f4ff517f18539f6e18b5b265d64ae5ad98088f93075e42268153530788ee08229886dd887ba0efe21f749ffb83bcb9166afdfe68d7f1085cf2f003749ad1ca3966f467cd67dae6b051bd3561abed380ec5051a49d1f1f2e21decc3c5d99b5bb66d95b38fa2c3e366e769442c3ce3270147993a8d071b7dcbbdcadb725ad04fc2907af6c4ea721ae3ab603277fb8d6486615839f0b393d9e20f350bb9e0ac2e18a9159711324503d8a5911be9dbb4ef0f580162756279e16e895da253b09b60b9d1b692f09bfa51204b7bdbbd14e940c06af19ce63705fe0ed804d16536da89080344e319e7edd4e546829aa110355e29bb31d19a5df680a7f1f568859dc141b19eacbb8a6b7e57784c0b7c730196ec74fc96c19c3308e2fe353ae4cb2dcfb7880d01ea1b67f9103711f459cecf6d1f5e882534db76858ed9cb9b140861b79c2911df26f50a67f32fb6c844c7af96d165065bc89e33781ead6e2b9dc22bfd0635506937d52f7ea0d91417a751d851841fd3f7f2338fe5df25119e4c8e606c8b7c0dc219890599a065fcce97b6736e8921cb82611dd0ceb6fb378e42cec0d9bc445214d61cc17a43cb8f8c637788effbd3e385d363226f8ba090dc7e53ce8cfe78b8c15150545e55f858d0abcddc3d5e1e8755ac061e1639f453897ce451df50538da511d9aeb0a30a0002d848fae49084072e7bd63ac494a3ec841c907ca0a48adb3bfbce1d9fc27a0568d6bb00ca289a408cbc0d1686a582839c1d2043198d047d20c32ce78e8e02bca40fcdbfe19c509bdbab34435a076f1a92460341c131528488866700f2a6ce258d072bc97028bd5eca64857d00b4f88f44e1aa00e8363280484609e96bce79d65c109c137e56aeffcf5048595cc62435783331134035d8b2b61dde496c1ca1e66f5c15f6496e668c06d4586895a0d6e0696ce55435cc397df6effa2d3d301497587f43bdf39348acb6cef3636b561c4a61ae094bd1adc5205b98dba61413bcb70cc309f2e34eede1cc59ea9277fb5771e1297ccde6fa71800378e01d0fc0a64b38578694d7f2675b464ed1012fbf8c1e3b204cffeb246c9c0bc064503da8eedfe6214d3a6b7c8aee745842016ca2b76d48f8d77c7985ff678110e529b38938c36eb0a8355f13b7f73dff4574a86fd14700b2b21bfd190abdb8a785c0bc9157cd9e6affefad51a582fc115abe851dc4250d08ce82788ab53dd2d8e3edfd9823cde9cf932b81b790b2823f7782750982ef02c2c97ab6ae6b43f9f5363e6c25237646866b4cd82f4697bfd8025948bb7bfd9cab495f9e5a03e91d35fbbd8cbad7cafaa4c3cc0624495d635c634289a6fa25a2bc1bf7e4f7ab01030c5c916ce7ebedde8f3f14353b8ffae57ce034104958d76269e62bb5db3e8d72169ede9a8a0db7e5dc7d555777754ec8131e8faa4fa4d76310363b39be265d193107fd6797062af88fe0670d981678738b4bb361ef2153d1c360f760ecdef651093e86ae476d4a89f9b0f46dc4d44dd75e0da1d7a0d356b70de1dc51d70fb418321fe000c48bf7bd7700313e21e6add37e5cbf5ea86f9d2d7696a6b8a21a3a701d9d04a52297dfba7adac253bda1108ecd669c3713b988684fdc1c0f7d7a2b4e262b96bde3680211f12b046d6be376f61e2cd47f2d202d51766697acb955010c658bc1e2e69a45404e45c0818d7c22e2a60bbde73fa1863ebffdd5e887b47d0f", "52536a536a00", 0, -310549157, "3de66f01f791f2ffc306752bc500870776f51ffe644e3d6fa6a588659df7a978"], + ["030000807082c40303121df82a050bde546bb7179c1553c049c7ed4b96b7354725b3056c32875055330300000003516a52ffffffff30235d5436d6a12acf94dba4be4fa38cafd10b94a3f7d25edb5689a917b0da4a0100000002ac53ffffffff43a243d0aec8519b9adb20ff3a276e1c206b3d486f90c59dd4190052e7c5fb9f02000000025300f391348d047a8d99040000000004ac6aac51777a9804000000000400636a6aaa94c90400000000096a52635263636a656a9c926105000000000451ac6552000000000000000000", "51635165656563", 1, -1482703493, "611377bd9a1fefe5432289e56ed88bbc80fb6983c4a7a4c96bbba3a29111c613"], + ["030000807082c403019a9b787b904d4cf022786dcb89d5a646b74f604ef27d1b27d7aca75f06bf686a000000000663ac516351526938a9f104cccce505000000000653006aac650065662d02000000000753635252636a6a93fab602000000000852ac6300636a526a5a257f05000000000863ac516500656563000000000000000000", "", 0, -914045802, "a0e360335bacee6df666130acc3a8feb5415f45e867ed9621dd4e86b73e31a4b"], + ["2fd23c4303e3344fe7906f7812ffeaa116be0fddb0a76b3160d5bf7e5cce6e4713852d25b5020000000163c8c4d8cf3f7ce3316b19be96c2b81ec3e13cea578bdc4642b709866004d7f397a7b90e0e010000000651ac526a5200862cf856dbc35bc879cf7f396c4c976ccff883d7c4ab05362762eb5da533e7e669e44b04030000000653ac6a636a524f111405049adde30000000000036551517fe06902000000000263ac0f40c000000000000900006aac655251520007f1fb020000000001650000000002000000000000000051b6520200000000f3aca8a38b2a40213d675ecf9a4684c8a8e5e2b19fe7f252e8bac28e79e326a6a82aa4561c6a31bfb608f7c1361ff67846c9c3802a29f759f3e67c8f02dd6bc0c1df93e8430ac351d51a683272524919390041b2301fb961a7bc1eb5297abe4600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000db573b0ddc3c71b6c1eddb9c2781223641296903fe34f497e996208a9d76432c6ac45ea2d7454be5269ed5fafd2fff408f32cfd39bea61685c8724a2e5aa316b9acc42e635106be07d330d74a9aef4e2dd7f4b96ef4266da0cd19ec41fddfaace7aa96624cd3bd955c7df72858f9f7541e951b7c6f83d68830d30cc1ff52b2c60310957ff25c0c073dc84d4230d7c1dd81e3af47b9eb17448a6b9c934c63d124fc030d64ae6c8abaecc266d2cba4a8c3b34975b5cd4535b5bf0bbc7faea84d137d220b05037b121e9e7d8d4ec32d49faaa3897958ee0b4101fec583c8b7e36a59fb8209953a405db72d7a134d97dba725925fdbd0ec0a797a32b4b6fe3bad143c6148a02157bf63b8720be5c51c48caf235c68c486d95b44dde99e0745a373129eef8d760328cbf4b61dc537f8dbadff878230120de47f9ce42cf8e33a1fc52341f781a56b031f170e81df1baa2f07bbda3681b50ab5ead18893027f8cc0b85976abe1d2eb39021cd4fdb99b9b1a902902c963ad6ffb4e99510c5fa84a5e84888b9a711dd2fc74020b0cc0d7b58cf33f0399bd5f66b378192b1f206ebde188bdec562652325db83e7f48150ddb2f05df1c40a2ea280017e053b87b1add887ac54484c4794ba9fe4254889e6d68c0baf5cb71d7b0ee163bc7d7969ec7706b61c79aefb4d3acda31d50c2c871ade62e868fb2feab86802869910f9acd33f5fdb192c29015a3cb2ff1fda01f735ec9cc04e32e1611f1fa99f078e1018f3a21cd1930de4de6d836642913e1f9b988800bdb8fb357563258bbc59effa1b1bf84c134e843230f31628436dd9f5999c01f2cf036c2a1a960f6a7d78e8d764acef9afde8e3f4abd6ff2f6dd2d230d09b9a9a41aaa5bfe257fe4b745c3bbe1d2f9d592b99b1ef83e49a22f16627bb4728fe0edb0b7de9b9a9748567756cb5b432a43b7f3a2b80c89fbb33ffc534d21ddea474c1e9df85a86159e02e3fb2467440ed63f5fa1afbbfa1879ef9dddb6018825e89df41034c7730035292e553026fbe92a46fc2db59845864374ccfdc7c0e5693a1812519c8945faa75b070062647c29d46e8d3b512358d4147ef8890c149ed6be56bb5164abcdb26da0c2134d0d692164c9e42949a1c34973ced79c28faf8eed51f733a509b6b583cb63cd32b7a1c456af0c4e634d2bf87997a72b9d01e6bc976046d0b337e2d3aa773fd7b8de6389420a0850be9029139724fccec02c1bbbc4bd2468ff678b7aa5c21de79df8669bb40a8ad1cb69ac8fb988cc02c0d7864d5cd7574081626e45aa22681e83fc56c707a7df5aa306789f7de6aeceae9662a2ffb970396418cd7aa5a92236f24597883c3d524243743775082302541d36196deb04dbb3c41284a5c040ad9dd687e146cea78fddc8ed9f9b3d8c4551e2b723670badba6e54cb5497bd58a98abd9a9310310a20d1351216a66e48261461d377b50c4d05f7c3ceaefd78965d8b81edd8d7fc7b631a4ccbde394f8e98979bc921238ac6d9ae60af177c2de676ae18b9c5377ee4d6a956b003b1d428d7c1e1b61f6e9c41707d6b20bb58a0d32b5c381ca35b834c993cad6426e527f3c892ad6eff11cbbda355052e8afdbc356f8fbe16fc0555a797bd366a604430b942b3d1efd69d08ed232a264306076079877ee484a478d60418a1ad0bb786714228c013876c438638942237277683a47e7d8962b67fe7c570c55e291ccf21660969f3ca2029343c9a85e048cef097d9b6d1a1c7b9f7500f7f7178956dcc83bd14cbe5a07af2fd7fbb787a79de036fd8526c6117eee01668af1425f89b5701110fc58fe9da60ff7d85f8dab395b2f90826c76ddf70942468d815107a3558b92755e298aef2aad185d700436071871708f9e544bdaa5ddcf37b4de799b7671b5a9c037b1ae59e2f297f82c52f0c5424e0506c9d0e8432108883acea1eca36aebb6e179fa778eb47052dffdf9fd506a59b3bc286bbe878b575fdee5b5f70e7d7d791039ff6c81ec3321c99984f27b89831fb6cae1a0d9d8b9695769ad2dafd3cb82cf3a1b18e67835adecadc243e50870d95816d45fa7132557d5ee26ad881530b45d4cb90faed767d5a053e9752cfcaf11c3a68349c9a35b653d575d01b592867e715d5aa6adae1c518ca3f30d2209637514d40a5228552a28328c8b4e337bd481ac8d946351a6f289347d661b60d22096b11fde96b581fc3e970d3a7fb55ba8c1500b4eb72211994d8cd23854a29807c42d3222b36df0abb0e929d6537a8b80648a7395073f2f883a4ce145d4dc777d14850af0a43000000000000000047c9620300000000ba0c7d227e28add362f6f8de8b3e42f3a54890746f5d05ca74a933df767af2726df0e74cc871c964079be237c21d8ff1c9c5edd953198a4cdfe15edaa13b2c5c9bd9b87e74e54ffe4b877bf8b31289ae0eb4421eb8a02e6764f83e9ea2b1f80500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e9f8f9c7058aab9cba364e6a8030bca1bf9d6d16d2dbc3466d196216ad31ddcb2bbaafed703dcc2e0903508490e46525117fc4059ccabb29d43e645e447cb7c6c151bdee4fc80dff5352ab4d903f13fbe7f73de2d0a645e1da42328054a6be290f2404ede96f44c7c5d28d3febcfada89a0b760fbd647b8fa0476d2fdbdbac6b020c610b5c68d4f5063d62df9c6941edb6142419a3a72f2d22c536849a92bb37c2030b52dd490266a623a3cbb8f0e32595122a84c5651a1be5a226dd1e148980b7100a003735b99d213024377f048feb67657e30aa5a7a890cc57b8ea47dc1d5234e885be9592696ee221f87d7d118f885b86b81da36615b9ac5f6db1e80026210ad3d0307a54ed7a6862023e615eda228acc9cbd9bf3eb4519c3559816f390e2b6df631021530f1875b9799a77ac1cca9320572431c340b86302af7c0f4e7285105605ca70308eef4055155b720bedc70bf59dad2999683654fd6c1c246cbb4e6301eb3315f0202771a11eb6d0445634e693aced22c0a9b8ee10760a66dceeabd2dd6ebb39945032ef2bb08ca7db2775a8905c62d0a9c7b8205e07846ce102dd2ac2336ab9cbf796f9c715d70ad24dfadfa3840ee0a571f4de250ca3b2062551ece1a4476f4d177a78bfe1164892b7ab2b231bf75ad631c6ca1aed0c7175880735c01b20f9985c043e498cd25876783dc7c9a0075af288b03636887ce5285984794f716cfccc5639162e62c038a68956b9543a6c7874c069da81ffe8b36192c690d81fc7b47e05a1ce6b4678af55cdae08680baab33d4e0abdaec908634219d9de23e8a59a3731bfccc81dde14edb49199a1722c452ce16467a019b75b445cb14322782a4b054128cff0ee1c9657b3fb0cb1877c3121181eae0a48b881a5ff909f58105d2597a89385b046405fdaba05ea0efeefd7d463508726d42556f7fe45e3abf111dee3c30e9ec3cb5a2e7836113d0d1446d68f23ee77c3473357cc79c7316fe65e0eef8a8593625c29b6f42444cf49cac6f5c9770f6828b9d4dd8497c0a98ba465b60711982359dcbe505cf0780a339a00d04f1936523318e82011533778b396095390428ecc54d557d8c3fab559df4d7d49b21e3e8bc9f521385a401ca73c06f6a0d69d0c5579e0867a55b89731ef9dbf157246db93bf714189e7651f54f7f40a83328546fd50b9122a20431e50d7c59b2508c6d3958d56ab4a4ee10d075d60e2ae488c2f2c72ea5560566cf6a53411c85ce1d79020e6cec772fe687929d5232134f8a1e95296de2f27011725e1ab2b3754a03c9eb708607f730d78f09f3386ccab9c4b93b60253694cdab5da94f10d246e92c098ea4255bdee09e00d1ea72b38f6649018b8aaa6e27e7122f77b2a6141456cdd1a107792bdd4cbbf76cb9fa8174663f311334f9c16da4cba83e9698190cabdf081d6e6a514cc6b5ee5493502adec05a10a7fea001cafc1bb9a585f593d683a853d58319f84164a1d3169a471bf21c96ece2fa4f25aec651fd46a96675a1c54c845c624aafa294c0e4f8f15118a47ce03b82c7046c1b07c942f028b819e0f8c410f72b57c7a9f37947191539b4aff8fd0c82f2d73e4416419a66943295cff633cfdd82351fe0488c9d6665841d39f17a5e6a5cdbda334389f71ef470361b86dfac15ef8797fcafbb41eb64b6896e941475a0afc100ab289d496df60f2d7d424babc5c165a0fc0dd0d46bfd50ccba3dec18ae8d6b2f5aea420cc8f24d65b85de421726dc39d1657e9aba94fd9fb3def052cabba3a6971b4e5194e777734d6973085127cc879ccc4986d7fd919d703f5213cdf584b5cee02095de57269740268c286eaed7f025160743f75207b88a317c7e0c6a6c9c2a68e74e2a5262a523549041c3bbe934c8ce47c138f42b6ab3313f0b5ecccf5dbb6d4a25f9662d8b518f7324092957f5cdd7485f6dd9f2548f3181754d07acee575c9315f3c9a5c419c7e93e251e6d1ec6e20294fb2f2e67dcef8e0bf3f46ecc0deb24c86355f2899b24cb984ea9e806964f558c55401741bdb68d1c385e9876d3b6a376d236be6ef912a232186d65816e6b8f206c5bc74266a5d2218e72e81eae970d87970d781e0c07503bf902a066fd76415e67eac1b23be2de9d333e13b53d6573c73a1782cc9f6833766ee3e8cb3482fed95de825f23ad93cd5f7c0e18e09dc73963d00b717dcc11e55b94b25c0897f49a26e3bcc01f44317012e622bf113bdcd88767da4fbe4b3dec78915bc7b6c00dca070abd0f9f4f59378d2e0cc9f72142fdf689ae576dfbbec025d00f70bac7506cf8687fca61462890fa812fd0a9bc6da4539b687c750eb665351c35260000d9d58f060a473ac7a79a09912cae974427f1696d1b8673f0e695a3ebb7e26a566614ea5859f85be5bd762cad027e7747c83a89ec030c6000f8503d000b", "63ac6a6aac", 1, 396639463, "88edc2feadcb8873d09ff8991a9f76fbbe712f8103729f45af4cab36ea1264d7"], + ["4e52dd4f0438daa00a1ac71b47e532374adcc70df2bf1a3311d65b68d8aa57e38133879a3801000000026a53ffffffff887f8f05f4fea70a96535220c9fd9742b34f7cba1fdc1e2b39ead73e62c3c7e30200000003655151ffffffff113d5e16566f48df7a3bee0672b5c988c04f462bd1b6d3e72191f6160565e14d02000000050065ac65531ac8bc3c2ce5d747b8af5f92530762989a1fe88694f8a740b6c3f114e5ee4ce2082554be030000000552ac5252633d301f0c033306e80200000000090063acac52ac536a008ccdba04000000000863656aac6500ac51af0a5202000000000000000000020000000000000000e2c4d00400000000b528b0031336dac0d8bfa3af69e9430f2eb94425a4564b8c5bb5e8863b6becd74d124c1499cfd1cbbf63a737b09abe1e5aa7047a0ed6ba127e58de0a1d8d707164edb2e58966a060f00b6d7f0c6ca3e401a934e849ac016030872a4c6fb48fb400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cc4350096a6ec4193fbf2834bd0f1c96beec35ecb57316dd644e8fbf638c6477e71719b71149eb1a3ab7bc61084519dd84bd9578eb2043988e93fc42d374da68261fcc28155d249b4d62cb9c288ab03065c522feb542f6c4ce6d462222198779dbf147164ddc0c294bbf7e9203562b46dffffc4984e25d8e356dc58d66cd499e032524b5bdfa847ebb76ddd657e0d36db38a2e3ffb5bbb8e597fdc1b89fbf5cc70030325fd59f84505fb393409d21986a9e97f1a871a048e9595642e52e34d4da9410a03e5cd48dc62c8ec8743e8dd9d6515e10f07e39db0ed3c64907561d7c152bbf3bbd6f02a3034aaf6a0fe9b80f80c8c746d153765207dae88f1713c29435f79a7022f588cc480e07bf388c44ce54b9a6be8ece56c1521a9120e46863a05afc114cc03043aa45b388477210ff9b653972b15eaccea50b19e826d1445d52e9e83a1668f022aa03815947e2553b6a2dbefb16d2b20daa32811ddd9260ccc2dbe1221d23912020101cba7775015fef24b846e1a2532bd005cfaa9b4f44b037a39fa43f5672d6802164ffcb38b88ead551af79abb70c2a4e5f155c2ddccbe79da8a96ad85e116a687447582af112f0349ce09c563cf884b0eef661303fd6fc97b48542aa1a194fa67f77f6f92ba0e820cbaee5eb0d0a643c731fef86e2cca44e486a0e7598e0f2c823aaed855c905af849adc142c599de10893bc5a94a6f6d18bda0ff50e0efb53011075d3a6f365c1e9a9ae1f133d62277b4a3794667ec14d14086c934aad1d11a826937471bc38066b683b3a8188c9818ffc0bee5e8cadf09eea7e5656e238aa1aeaf648e4e61660b5b7164d3242934514212c50390f70798666fe9e644d22784f421df1dbad27b07730b59afba5248243b60269e7eb566b8e59b327d9733982546b69142ca101af5ba23a8a133940735a742e8684c3da0b2c4d45b9cb29af473977f28c1d4aaec91b303896427634e89e3d155f8381ed85257ca4247f2a58d20974d19b9e8af0da08f4c0328125ffada8a99c1d02d72008e120a49fcbc5cb7be0132723b9a27aff6218ef36a819b9b385141029c493c92c1c8df499f6825fab6441d6f484e1cb48077d212c65db0f058a01252a55a6c2c92a087addd74705877088b700a5dc49891bd3c0c5f2368f0a05fe7a355119c0bc206ee8d9d8113c549ff0aada08ac355bcd59b730f4554d47baa97987c786767a5768039c831b3ef3c62288c575c8c4de07ecee8259f754bb12938ea9f8f8bcda0034a4659dd36cb62c923e01c1e25278827314f61ed3d648803064679a535d66ba1b0e0657cb64b155397d200f784fd71e8f25b5cde58498253cc77a5415621f26554e5b507326011555ef78d6a816fab25aae96fdb826f8f3330a9bb4190ed59742f57ae5d35cbcabdbb58de5a65d584daa80e4241cd58ce2f21e8126fae230650f8b0caa02fd14f09f350137842fee5d564d004b90411e2b00f6eb2bd5cc437f4ae5b878308f0081a3f3762eb0ffdb9476edbd93b2f7372a9240f0c4b24d23210669158aa7b686341f5bea774b6fb8c18b6f079085a1c95d0222366b1c213ed858485c1145315cd299b4fb4e5af22fa20c0bab55a1d158613c5a9a303118dc71b4c1537856ae179c0963868ceba858dab0d55c8ae53f491a3613b20172a82e3bcafe84d18651b20d41d7cdd612434147f767d0cc06b7d46b234fd7192307b6800b0794e4b571fd9cb8ba32b26b9637f7465d1933e09a190eac6339b2d11ee5b1e70a84b3e6c706349d54c0ebeef993f63d3621da4c78ee01eb1c74ebf57552d7bec8c93f35221984c0661353abf429b082a024c71177f55a99b3f283b24626746786eedb26a17875eba94bbc3d8f81864e65195e61f9183c9dab3d4f1cc7cb0dc4b7764a4f6abb6a594605d8e0b2c13e0f7a792a88fdf6b80c88e9dc8799dde20ae58563b4f6c8399ba92fef994ebec60cc69afc5e0bc19b700462547aad6b285c754a7d79b67d839616e3372d8201b4eafe4608260bf47fafe6a9c29f9f4b0a5f04a91c2886cae0eb935066635f528f88cfdb2103746c7717eff9996f7abe1dfa86ee53ce50aa60f242b118891ba5c6221cfe2c77fd7857830c06d5d76b54958f8f4afc99533ec6c1f9f78023f03968885df3d86680a7b64d2a008fdada013f82b7d27cb7bed4dc7fe24ab590f4f5e30620145c736bd8e803af37db18354bcc314f3ec7916a49acb7534628562c092117b45bd24dfe159f74893c0f8f28907ac88ed0f4304e46cd3ce05c7d451c827fc9dea1bddf3cdd8488b00000000000000001a01d10300000000e27bcb58cac90edfb7d3062887bafab1d3a04681fb7c1beaa6d4d69bb86c01c4cd3a01e096c976ed33ee646618843fe9dfd7b1270a149388f7228cdd58a975fe3e80ed4aed07e68deb2d7a16b6f9aad98bc2a18e9d3d751fe7cd47b9c26aaf0c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003fb66690f7a38d0d69eef7482a457b6242c089aeeb5aeb33397334147235692997031b477698d575fbcc7b0bff1d32c39f729847da4903a4c5c362198f46c3ff8cd4566542578e6df4fb0a6d279a01723962eec98c19e01c2f84c897f1a347c14bfb506341a59854a1f43193e2b6839c2434ba66ebdebe3d5eb3447468e71b9d032ce32024ebe388aa257658da2f091991053652a7ec9afa4c81882b7e70abc623022c76bd76de53077708bc40f9a818bc922f0cc84ed3dfea75b5796997671d3e300a07e95fb899563822585b3b91a0e3c43dc8831776ce82fc6fcf67fa7e17ab3fdfeb88e1a4cdc551489f1af37a24dc5ed7618866db8768e819dd3ec8471ffa392c021fe3e36f2da6fdbdf663762b405d2ed4bc171791e80a1ffb5034cd2b388cd41c0318b96a28663df3b1652342aca1566214d9f9cc52f6205785b5f5d5f3612bb112020a466481f53160ff0aaf7d137d2ca7fb95193a238ab4e74552760bbb1f6b97bf030366362fac8d7d49a5a0a306efeda73008955601405531385e3b8a3ad087d57c031d5bdb956f6d9865876ac61f8da2ba0bfbd724a1bc7f1af165466c9ce54680b18272e8fc89880754c2568931137fc6592c21d40393173c1bd3cab9f741dc72be7c492c0d6711de87144a83ebcd45418c9019485948f484610c27ba938b9a390b1f0d58b8311252ab53886a6cca81a80f2c6b5b4227b9cf54736faa1afb49c2ccc436ea35f2e91b237b4a5cb5c34388dd5a11fa7bda50bf97d6878b52d84a6e24556ba34168786264c8c39cf38286a3a3e79bf6be297e60a26420ae85a5482c92c55815ad0f9e3017e8031fd87888589b4fccaae143e0a52e358a61704de2f9cdadf5fcfc9de14ae20c091d209ab156eced7e8cab056ba2c28aa96fef004cd793eabaa0cba75205d41d450587479d0b69758b3419f188cb88f8fc85fa94cd86b06eed3f7a5cdfa6eefd60f99cb1fd2b461665ff1001936f8a054ca758db8a62608c8e8a24b4e4e5d518b0381140186787f8c7703890b0ab2b10c246cb5b331df339cfb261217a102a7ae92587f438e90c51542ff26b71db10c1d4a2989d33a475eb72009cc902a74d7a53dba80053bf760bb93db8638853b80721a88df40a45d86dfc8aba71beb362ef32120227077f23949e3975fd7115842955e8baa5ac91d492c144c5281bd3ea6c4e262cb6ab07c92d067ec06838ba900d96a61f6b4b6aa4ed4104829db9093222f3ae4113f66b8e1b2722ba012ba4884d159be90f86eb976761ad7e29d43c3ccea188f11a8dd6be921bc6499d602c44ad733c67cfef4223847db9edcc8ed315c2fbd5bad402a0e97f91f726f777f5c66ec2393dc527078a889fd3e12cdd2a9c88d8e979d82d369aa35dccf84e431d50b5149dad68db77daaf67b779d8a2f5bf9735ca750eae13dafba11b753c8d58c895ac5ef7d7d8bf77ac8f1071a425ed958d056d6af2fd220d5c3eccbdccd7dcee0decac8fa4d00d26e04c2330930491cf493b82f6a406f85b22b9aa39820c27901942bb6d810f6ecdc2d38cdb43bc5cbd3b26aeb15a36439419570e367424efe708f4feb064ec130e511d50f1fb81baa2077cd832a6a821af8aa1568475bd5465568613b6629d922ae576f8b17e89b5ff4a2feadce55b0d24acb1719357e4c9f06531750b39d14a7f1318ed3b50051b4555b911e0ce328f52861ff8161d8647d965f4bafe85a41d280ffca5ff5674865e63bca8e116deb4c8c4f4a49b586ca1057d7df73e5a085808eba0d08cdd0b87fde838a50c48b3a16ca07d449bc99f3106a2b74ce268576f873888241ca1813cfeb7828d587a1cf0b2b938b996c139f2f496562d032f68414328b07d870d565c61313ca2e44c221316277fd4e67f0ffb00f835b35fdd91f7799076bb31cb445f7a61cf4e936db85a949d5a204f98f7ba3ea4b936ac6fc5989210158ec7a286f7942573fa837d438af26b58c77d74fd3630c7bd818625f97a75fef18e7506141bba27eca17cd232e7d8b20e96353e51ab9bb3d284654498e7dfd2d156fc65a0f71836237bd1697ee1bd1b92aed9fee58500e96916b62dc5f8612e2b45515d1faa0ea17a98b7ca9db1d7c478531b5cd8066e8a3d016ba0e6a470b932350ba8a8d5197155cfb396dcf46aae166de6812982bdaff43d00365cb5f502d996f22891e7886743bd8a5f2ec79a5878ef8bfd86f9efa5b1fc9fe7ed551f45e84cf53e8206efaf7f43e97a517f3d5ad274f759ba12b0aebc0d0b92351c7bae163057e281342c61f5e0f5955095b0e3ed5a3f56bb886958cb150e35c436d575f73f1ef566098b8dee5be2ea7ed5bb5b508e47f0ad4b2db124bf040c9063083a1440b15bd2eac5973456ad74b70e9889127bc93b62560afba61ef74ab3febca80ace1ee617c5b8ab618147521e1c002507", "ac00536365ac52", 0, 2074954959, "1fc4f2c528bacec299f4e47d9acdd190e5b3720477eeca997162aaa26ee14bd5"], + ["4641333601c4d8b68c367f652a69d0cad8419f638ef3a23ba59a308aad486bb08600af969e0200000006ac636a51656522eddb100427ee0b030000000001004b142d01000000000600535251526a82d445020000000008516352510052ac53961edd030000000008636a6a526a635151000000000339d2c70000000000000000000000000078091962975537a94f54d70367a4624b9ab50d02b9e0470be5c6dae21553b219b09d26e9156a38d30793c451abed150a4a6dc5e2b985493a4df739d9ca242046229fce70664e478a8eb4f7300481b45dd0a7150c3a570bc2546738cfa4173299000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002de5e154ecc9d6c12ecf54f20670cf9d02fd23a6de65d1fa01db19d64c39d23a2690c223b2605ef0249ecba7ce686c64d7da3533be49e45efeb0d564e49fb003f2125899723cc2c48a43c53feddd384ba0e8b9a7e2679664db6f19b5d1e2940fdc4aa16afafb7d09155e08acfe510ed1043f989253a9cc4253cf293f7c70e975030f403b3c663cd6017a0a88b3d3e9a10d8b30edff44048c3b1da9a882d4e5e5ca022e2e4b2ad2a3c02f07eaba38483e68173a5059d328bff41ca6982cbd064d106a0a022b046a96d606e5b5b627c9843cb56dc98ff406864952611dc4163bc269d31f9761cf2c9510957eb0e5300224431105f8294c017145563e4625e8d440ed77c70230368a6e1b4001dbe7fbab35bd1253452843245432c3e205ae2cf4f9d026858d0310b41c119c64c03a61d95f33971a13916a9194ec9e7a50b73c38f21f1c0062e60318ca4d311abd78368759f6c1688a389ed199f3fb58329e0f91174caec6035341021a9556840199e5c7841d66fa3866d70ae1a7a55d7182216d225f0a4ea1177672020be08c5f964339f7a38993938ae6fb38a4278f08862d984bfc00b43c0d61d5ad15e606deda6eb354132a2f2a6f4189cdd1be1e80acf131bc653517e6f7e60f581d7209c59fe113710b94e3cf17bb51410c3f0caf71cda999449d5463bb0900a908035fb97020c8288dfd798e403db0e446754b5a9fc956fd012e1b4009f64bd72c410deb929ba09e7cbe8a815794e742a3d7a3167f1067c2f2961b2224687d93924d9327294be7945bcaefa95501618c4638e2528e5c4a72e83d722ca79e8bb11d53d465db623d22d0aff3f91dda1602ddda98873aa45c46b11880a9340a1793600d46d57ae539716963d26263f937019023f19fd26d25e61778ed96288110d4f4a5c9b28c7e38a5359ff50c08f214981fdbd3bea27c0c19dea0c7f18e19e5216f833579d23ecdae9918f289b25a5e9e9c8d6b4642a597472947c026eb6ba571cacc9ee3e9976d5fdb615b2c19d2ac159152ac36d5ea226ef1d11f5875a0eb93dfdf846fba5ce292ac805706ff2b496e175f8ce4b5ae85f51ddf6438ebcc58f40a6432a88958a59863e23b82ccb9bb383467d13daa2f77be6d0b768f220755e5bc001d8fdc6542be6f086fa13d7957da2d41216e60e503838717c6f29f13997aaae430db33463383a043c92f3994ca320550b32b01cf85c29d4338f46e1053e534ca612328c1d411d63ba4f9427356a3ea474cb2cdfa70396377cc0d7b973b578fdb65c4102d49bc94ff029a34aec9c945ae28031cac0740c63a4ab035f3a66ad5649438ab99dd480afaabd52bbd4915966cf9fdd8a74303474c5c5bd19dc2f99fad151941eb8ca176ebc7c5ad0297b5b685f749aac50f74c5144bfe859e315dcd5a251a16727dcdc1d01c6b978afbd0c21b62183c4709ac61b4e5414c6a6340a62f40a78b6eb57b2edbf66377eccb6d3556a585a8dfeb1282c2d860234594bbe069f9b5651285bccae2e2e33276e0aea1b70e058c23337d01e7e89ef78c01b4a96f6b55e12696a2de1d91a8385bf90d15865fdd03782b4f774d0f3bee1f4c4059820eae8302d5de2c2fe1b1aad966894517b7abe92776c6c4070b6cbc98e21551d74cbec7ce8ca99f82f97d6a83fdbfd92a78a295a6357fb4e1b308295f8b0379df7cb46d7d5045a7258b8923d6981fe6ec5aa9f9cfe5bdee87477178ee0e8d8ae4e77e84bb2be0bd965dbf222c4c2b086c20347dd8ec2c4cd38a1f474bfe482526c7527d8aa1d95583801a3ef39b459cd1df39148808201f18e289b727de51a82c0cce4da88851f0603579194d5ff26758626b2860e541be7d1e0fbeed253a0a6f8e4410a5fb04527e9b0f28f06adad005393f7e217c420bf46a6e71516f880e68324e4442ea27893b2bff4b8204e1564c4c84edded538c83073fb80b976e2c79ee5d1f01d3b6c889293bf59270134ff06e5e3365ef8fde6640e01fc944405ac3d6522a93ca5bb10d572f4997e36ea7f3dd5b184760952281f885d4f720bb985f912ee9d4d4e09e92cc7d2946e7243fb3912eee8f52255178d5967fac9d528f8507bc6cf192519039325662294a7ace50f98aaf20e2a777d793e45f09fb332616244c5dbcc072486c1c0191d1ca11814485ba359ac568e5050b1bfea38adec9e85211338df5bcff582df0d9cc337c67274bcf842b38caa039476d9d72970cb5c48593cec20d07cbfd2d8fafa8d3348fe0752331560d5cb7f430df6a098c4770b4ecf81d8926a77763c2e4b0be6043790ab35927a03000000000000000000000000fa0727196d14af9b7c165a26c4aa7c974204f6915358cf77a21723b287b38c0751eb9fad9e92173f4e840f0cae91fcb8c562acd489ec33426320d49ef73c58164391ff74a26e6426edd65e3b12ea58ce15578a1b2053048e7774c990296eb57d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063c1ebb9d0c3c2f2226f6ceca4d26707f8b6f0581e519697f33891a521cf41a60f9ffed14fed5d77bdcc7913af21d20b699bf124f7a97aa19a2ee659245b230bf2dcad8dab704e2f0fdb54cb6446cb76dd8db19fd82c12450170d7f57177948eca70802f5bb3978904caba4cf23715565051f1030e152b1369d4cfc518a6e9b3022ba0988aa606c55134d52d74e3642a0ff81a7477bed3eb9c67df6419f09f9b730225657f1f4a7444b02d6c12fb41d5848d73a1b33ac5a944e79e1d6536d5069b130a01aff5d62a85e408b3ba5f336114ca0a8f225b47aa79f800acb93e8c392891466a9555ba9d6ec9357b6dfd6a4efce99d712a61bc7aedfe9a0c1039f345ff664e0318db9ab398d51ccfa4b22365092c985242691dab0b49b0d76a2e32a5c11dc1190228f65c84095fdc37b99fdfe4856d5d5923d0efa521b30d9bffbb6d974f54c8a5031dbd6ced3df7150f3accdcaf28e72d47c5581492f2d021d6d01e710e05143d7d0217c3e4fdb9928862a721cc1c236cf0636b878922a13da37766e808824284cbb20227d55e8ac0d3f57645fdee50f14acc0c885aa1d7a5af9f995427a46dba76b611b22486bdaa6e2098efab8cf3a92bcea310fc14c2f9fe029153dea1e321db91ef40dcea82c28710b2ddfad9991940a52b0fae2e1f29460179777b0504818fb91bf94d6bd179482203db8f7d5c62b00ab4f62d0cb32088e4367351a5b7d83fc6f86bb2d1b01c5f62edae46b6ddf646065a7304aa7fecbad2f93bdc6ffecc350919d787b1a00a4fc511722553f100d4465c057d8e886a997cd4136be17c77888c7b2fbc147b972efe0d676ae240f36447ab0e6ae61d2c564d465f3da78f2ab1288f7bf1c4b0e63744938cb60f15e93faf91c2fda4ad6d9aed6689847d4b470e95a371c7744e42381e7c3e5ce7cfafc2c4c584ab069cda6054957707b4e7082c0579736aa6145f5c0de6e3b68664dc159a8ec91565f0f4a1e1becf4ae3296c2b2af9a7f5fa3b613185b13d14a41fa7b1ac15262acfbe539ada532adc7baec1949710f93cf4bbddd9ae539122425dafe4492122b506b79172a5a4d46a132825b3ea756032a916e8627ef01bd5df946801d2379894cb0e63b84d6edd616475865c5e6c6d4c4bd361c046a0746269ee9cfd57ab87a38ef1d6e309c174ab044657cbe1bf31e8c8d7a182e2986175f76fefdec424e4dc14c0799ed422727287d6928181617d9f1570b359b34076d0c3a139f11e06c32bbd5f036544d31d7190f97d9060eb113164cda933be75644da0b9d0d38b4c98c0992c1550ca5ebb6a805cc5ea3175e60f52dff3409376a2d08bce82b490ae7d5bb9a3659b4106ee2ee0c0c7b39ada28f506f96fbb109757921c0018ceced191a900a2be6a6eb2b0c2cd81dced9a8ea6ab22430c483e43292d4dcfedcdd58f850daa78e22ae95ce36b19ce201c95d83ddcb954e2cab92fbe96b35bd0ec5e7f1c9685840db6089af09a3872c9b28ec427077df72848f1234d0c26595c7233ba15d148c5fd5c392b192d8b9b852c03525f8bf47f053b170f022877e41578eab78813503f88ffa522aeb6267d931b1d736db718eb551072b47018010534271d9d2ea9b4f275e0aac01223f7475c1dfcd1b0abc53a71ef483f20f33976bf365efc35f6344aae61b70379d39c01dce72c1c84c65d22bf48154b4faad8e465690906ca15982196f3e63d1193eb42d29087fc4aa007c109affa41194d44741be9cce9034c6679c981c9c8c57778efd8d5183a2d3f28ad314777044c49afd9caa6a49ca726e2ec738d397fe2ddc8aa3f397835e604ab866efa8e12b1383b6afaaca9a3317d698db0abc3f1a8b0de24153bb0f660efbd9595e735648e4d56127c948fddb07db0a3ade53f916f8e9258713e676ee96f15532cbc5437bde686d7d129c17ca2d816842594ee756af513fc204dd00f357accb0d2f6a29927393ed774598930ecf28b1c5abb1bea7e9aef44afe30c17106b2af4afe78e83b800b3b43ad0262c944bed23c37b38930600a497aeb2fa05f7b0494916bd3b1688f436488d3baffd29ac78e208b4437819865ae040b05dc79fd123f01f69eac938208a3ca76dd67e5b5ca1c364d80f734aeaab316f7a83909188cadbffdf75971f8ffd9b5cf1b0786053ffea512e8b6c5a55470dc152a143c1b50383289195a9bfe8169c582481a224c2c86cfc3bf9ee5e3711eaebf38e572c563a40365b53b103016109841c0cfc57b02e979ded441c21c347a2f2b5f69e1e9c593c9b32219dd8898dae5e92dbdf7b4a000000000000000015447b020000000036f52cffd42c691b5108ce59f092d9432b31ad7809720ed292d069957087a60f050493f4463c751138fb74d80ef6a0ada9d30ef5c88f5e23e4413ed7aff9fa4290a6c870dc525a0580eb92009dddfb2d5544aa291e7bda43e8560e2705bf201c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090a422fd240d9615569cf303a60cad20697710e65c2c2f04a55edd049de978da1fba7a1a3ba326687f9c518bff981425a2587bf645bfeaa1d20fb1b3f63029591b07cac3e85e4d41446fc0e7dfeddd5f372e810746962ce24a253f44549a9d61f4c6741ef20a309633ec6b8b4286d5a476283ea5578ad564b3ecf69de243b4b020dfe34d590d3faca321c2e4d790ea3ae16e13be358862a77ed089d524581a54c0305773cf3a86dd84112049bdb9cb9d34f07f5895f22b1a955cbc2a22d25f3f8e10b01349d71590ef95a090c39e68a5a79903f984e6d9730d8d45fb19b0265df9f1ffddeadaae51ce3ab9649ec846ba83349d958ea93eac1ea664e7eba5bb589e16f02119b1ef8bc9c2d23f0c6c704e58b7e0632ac880cdd617b42bc1a03cea7ebca0f022e13f38d57ca0f6fe238d8b873739a594b2815377aa791dc096acba10d0c9254030a4f42e30b578f05f474b9a568f00cb7f5f186c04e7229f6f48330d9e44227020303c78cd32b0972f2b14f54ca553b5129645d7d2b252f8b5288ad6fcdf3882e5f032704d507a6499ed7e13797086b341e57ff23c3e190288c64dbcab6b1721c84b125078a842aa431d155a93482e73d58b075364311a81a2bab2d8621f3abcc361810cdc6efe12c497120cbc7e60ed121c59d3c83feb4ad3f9c16f8d721914904ee4d36dd906039d468418cba2020cc3f612442f88723fd0b2fc1df0f89f1600c175e52a5ad51e99365a4b3076e1358e18cfdbc8be143eea970d99b734ec3f33fdc3f50fcf9891f02f21c07c01131bcfd86da4aec16ae7312ddddf3bdf5b36857f016716b4ac527f903ec3fe90be1261543ce554be24c5d3b710f40e311d2615626ead1c59afb37f882234bec447550d21d90448d69cec60d2dc2e0439cdbb8d20615a104348d84d52349b6358740ae15de7a2ba2298acec42df6a7cb1e383b8031f4e697563683377e09776d8bbbe22c62e81b01f063a87e0242add98b0cce7a7b7b91ea11f2b7b561213128d210faca1bd8acb5bb9ac652ae6ad20283b8877fc221e2cbeb4b2be2de8221193ba3c59a822dfe9bb827c71c43b7e1504c79f2bb1750e5d24b50dea1905af9047d19129a9fd17d72b1c2daf43af6be97c66e206f329ef87388bd9bc7f2571ad45bf3e4be2c83027def2896ca70048967e0d37bb3ab8b1bae7842f0da9d6f906a42b0bb2853f22201c1e960437fabf7de26cd02daea5c210a41e6a590ccca81b18210090df9f19ad2460de82445b67bdb4bdd9953957ff245d14279eeb7c8528cbadef1c4dfdc28bd7eb7fe9d95b324623e8de23698de6f359b2278597f0ec41302f5d7f623c448d68498958c202ad38ea6bed56c44acfaa86e2c2903b7680a1465c0651bee9f618a3edb030f4d8b10bc74aacd2192f404e88cf6d3a0414cd99fc0e088b65a8d4bc087f51f26af3b8a050d6b11a2d246650c043264f71b856721a8e2bde0ce8d27db670f5231f3b06b8e920069d2fcd9da9d4a24564f900605cd04914e9c82fe75033228c945c63013565c80481b57ac14f8c91a4b79f755504eb1b30f2311b0f691ed3f2f23329ef6bbdd3dd13363487cb98326d64f5fd480a869eee52e08299a3d84bc61d45b3e44a828ca4085b25b5e4120b73cce5c3101d7636b2537668b6e28098cb97360df5de162afd67d0f0ba606407a4d4d23761bc4042a7a5ef92dbd293da0813116b5049fece126d04bbfdc1eece7e32f51b0e9f1e107776fece0f9dddccf592b0d79e1b3920949fe72801eba7cc562d2bd02ada5cacc72352495907b69c7d1719249253b9615823db8e8d216bdef5e16d4911cad4e297b1acee6432b9e09c539f71a39043e6b9b94a2eabeaa0d6f42874ea74d67184234ccef0894945023fbd75c399f6589270dd7a2079d4c991b003886e6c44bcc917bf423d5e3747b643925aabd6300fb894158fd778d2e463624f8378d6bac40227fa68736002b7f4bd6666d15026f582393fe65f6276bcab7cbad925343ef483258558892475a8661e44a183b5634adba7b108dd31a9928b102db3746939574359c657a5634efa485ecbac2d99886568b445ce29ccae0113e1fa055bce2487e0edd11f152a0b05116511e9abb04e31af1c0778692a2e48d6b79654352467b730879343e97db606fa49acc8959e127b40a3653a53fd2e053347afec77464a76782dfce363a4ced6ef2a715b3dcccf314a07145f25a9eea82d5f64b30464d31d0cf3fbc399d806b6f71dfb589556a70d47e22d47890dfde71c8bc373d09f63ede769c32ef191514909e167db0e17842eeeda0f88b320b59d2a0cc06033152b45431528e531d72a2af592c7ef35090b9c6654ac751c445b04c4e2f56c73a0236f947558d435d5bb8b1d0c2451b12ed2d292ede22d16fa1bb17fc4fad96b48f3eab776be9750307", "6a0063ac6365", 0, 925636285, "282957a1db830d7987b1f7ad9d234c62276b83c4c496e8591ee441447ebb3c46"], + ["d5466b2b020177c2f69f45589609c9c3643b991c33f786c142ff564859d011bdee19403fc702000000085363655165520065ffffffffebf66881d73a3681c75c005cb9aaf99aaec5a0e95bb371e879a9ada4a95f3aa402000000055251536551ffffffff035fb2bf020000000005635200006a5293f200000000000152d622e90400000000076a52ac51526565000000000168aca2050000000000000000000000003f7593d8f5ed76ac2c0611d706c5374de52215d71b1f2785916d95ef7cece92ec6e640056b5dc8eb1ae5c56cabf38f43867d9f4e9038c22e11c2311daa41870ef2f03e59b08138d4076a54151a018161e71753b5be33e093185210de35071b1b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c68504cf581ef62b5f330ac134d2717856197ea2ad563f37c6381e8399438cac9be232060cb08636009ab0dbf96a75fcfe6e4f2c8f48d7af4eda5b6f0d63c1c5ffea766355418bee8636f78beb89cb2e562dc8937f7c5f664cc15278a1d6e4bb729841bb5194510ae39e555a68644b3cd0a360c91c9c3b62213a78b3fe27f0b00302f0a10381f4951e1dae52f0bb14173341417ce2f496687592c742b1be3da0190207f3fdff9a7a8b2018d68a0c48b642f944699448d9f1315834d8a6ca8a0257690b03c838c245899c768aad96297b37772ecdc63d8f260e9833f7ca5f07ee0fd1c59f7229fdd67458ec6255ac1ba706e138f7a6a2a0c22e3671de615e928488f1b6032e0490cd50c2ddd6e24700e6d44455647b78287f07a08905d0ee985a33bd75e6021e84c6d29033cdc54460bd445d123966bf84251a9fa248431058e4e7f6d70dfc0219869bf40f63c9dfbf41a35d180c8912ad42bed7a82f3bb517c43e019204924f021ff6c02ffc3898d11bc9e06fbc428d061824cd5bd2927f9637468a42c18564990313e320fc63a8e35408a59abaee7f6c3c6bf68f55f880c5f079cd23ee304a3a7055c551809d45022aa5f125060b868fcb7766ebef49c6db76dd462a11130b31b855f73d4dfa58141c62d37750d21de3efeacaac06af682342cd343032e776cd01ad417a24760f8f4b5e20530589252e1f608f48c6b11025f7b81f1d9658d60aa754aa324b8c73f303fdf846348371e94a0a0996b1d85d505d5d14300b692cfb45e62b64f12edc4095f02eaac75a0922391d1ea3ce64fb1d741ea13e89660075f75ef4fd1a769407a6a39108682346168bd6ce6d5e9f3bcf59d7d9d9352ece4e050a01d7b9d07afecb33c0071b18f3f15e6b2ab1e2da06caf8f70849b5be8af6dabafa1939a115723eaac0a497f26350841385f6cae4aff4f9d633661d1ad6da5637630f4f40414760f3dc8d002feb52b7e883385a1ad1f51da881a8eac4af43eb031067e9780415f8e7940422aacb6b04d7390cac8be576f36e2a8500428c60d484b19df8996d2a863aaaa1eb13c076cde6bfcdfc0ef31ccbcdb1ce85f9e333684e9b60ef1a7265f26d94dc771d5deb0258f378a1fc88d00a35d339f7d833a4c9e905e58fa83e20904199dd648c05cebc3011bed252343ba939bdc9e50341ecff6116f4f591e5219451f88058019ccb0cd1d73e1f5e1fafc3eaa87eae3e3eb83f3fd0c0389463037ab3003a6046a697d45738a12cdead35196d2bb76558b3fb62f18547a39f021e20e6482a37161a66f5f69bf837ff9ac869089e5f81ad1ed7ebcd6fb4f68099c7ff71720e8ae5643dd698124d1a24a97dfad938a3f1201d4de5dbf6ef84ac8f023293f4321bf71ccfdf25980ef4efc3b3e181705a8264036ad4d8a262256ff53564bbff8f22eb07fd0131195666132554f97176e44a0a1025c227acd1666d46e54faa491a1929242e142b8b1e47c08d49dc5ea9ff276a0fda5530ce93d75e77756254d4b7063880dc5f517de66ddad3ee946a83afa8232ff21d02f5104ac8e553c2f74e5c855b992423b11b2ab746d749a0f80b84f329edf69ed1fdff8dea3e3f97de517fbc6d20f18ab6d1e6ce3e6f29296fcbbc570280b18f5a68173f58d9349af43d07d1b0f52def51b91d1414f4dc6825cda75c2222fd57ea5a44403ce9fe85039517fb8d5f1af5e5291f45a3820d6d4352117c31a53390a0c71f90bf556a4d1584845667d556ea3e71691bc1bb7d09b48a904ebab1dc32891600e345803b255f14c16674eb8c58b097cdb2ac3859b82aa47389c44e0adf32027f5ea20e3e4874f95a2c4a64ccf5cb6b332019694fcb44eea2e80b3ed40acafc330505fb454834f4c2398a551a978f3477e0d385c8d57ad68616cad55ac6369fe8e1792e8365ed58a152a52847d275381cbd0ae7b96b6c49d9ab328f93f134f08ae345c90a4e7a0feb5fe4656da599163779d6a8dca2582a94c27f5c2761ef5247f13759f5fc6b5d06e9b3b4a075a9fe4fc10ffcd4a4dbc033a9ba796947ffe144c0655199712fce8f188cf9a13bd88ce07f4b7b8cf48113f530cf9b9a17b98b485ac5a64658115967ba49ad1edcc60da12fc38b7fd0546c1587f687ba2251bd1c5267744dfbb65488c2c637160c25719ec31630762e82f5b6f2d6dff988653635d037a2f75d5b90e6b40a74e7bd0cfb6454705ebfa9a943a5ad6a75d5eeb7cb159adbec59dc43b991bb6ae72e390569cf1d68518cda354fbecf595ab4233f73cbc45e46e52f21099376e5e068a9ad312186f6fa9dbdcfc937ee5ea76b62a3345ffc999a7d785a6c2d7f795a168d19fe83c9669257b2b45e89901ef1f7ccbe568cf088bcc95dbcaf64bbe4af98d57f82162490e8a699b167c4f12c9b923d5ad4bbd72d11a52fda32757afcd89aff370a", "65ac006a6a525165", 0, 345602513, "64938c275d53a4c34b3ab4741cc64ba2458685143fed94c9679c0cd3cb3d827c"], + ["030000807082c40303da3d24520e5189c60b267e8c36b8f688ad39b78918651c5f893bd784fcfd5ed302000000050065636365ffffffff94b9377155f6d5dd31bbe2a18e2b6fd4e1e3dd0bb2009714c8fc3a1e1cf86d2c02000000065353516a0065c41392a0851fe6646dc3aa4751fe2b57019a7ecb3d59fa8a5e4adbac515e1a3de6a1437901000000036300635315eb57029770ae01000000000653655163525134ed7705000000000953005365636a525251000000000000000002000000000000000040f69202000000004c19d779ba4ef09839b10f78d6f9f0edff3349df7d13ac8acde9cc87ed3718d871eb6f0f3ea4f0358f2c9aa861c1db04dc2aa8f4e9c3dc429824bd3b0982136aefb7e9b1abc26ff0db195cfe52eb4074d4e0f1eb9b4d4b240a23c1a911b6eba80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000037fe56bb9824db5fd93f030f06391be6d66dcab3e297319b9567b28314e83e8e4cef408ab5dfa8dce1d02ba3b512ff45755fbcfbd44954be68309c8179f2c47c14013563d85be2912d87f1b6fc320f10fc18e0ee7491d6a543890fd5410965a56f5f26cebf5725265819348b9cd0fa51218e161908da7b448384b6a664b30c79022956d3b6d6c9d6a8b44fd259986e76573e6a3ce8242f9211a13e905080f33ce2030223912cb71aaf049059ff48aae0f6a94d7f4161e072518d6a5d09def69fa4bd0b03966db0c575f000860d8116145bc0920f2835b6329965eb2d6d4b10f2f539c53937ca7d4d01ddea1ffcf9a1d605ee373a6b3607ad9567cc4ff3cd1da58aaf4b032dd3172c243ca9af8a17ab2b6f848352569ab3970aed5152e6ae677687e05a7c030a9087253cb90639a4614605d2044961c5cf3d2b93c9282ac1bce2d516cc7355022d6604127373adc5a1b926a87cb5bf68992fb7bff200119d33be2f7f633a598b0205709741548c519e82362b86439948a587bd3c13fb427e7c58e3827270b7d208031528dec02f16c9f2071e43780e5d6b9632ef9bfe4ebc7590d2279f05e3818ff846289af2a473b17c299ab379ab51967d979f940c4500fcd51a02799958241140f56d9afd7dd03e7469a6b1511d472aef3e972f9ca5c7ebeea0f03b90cbf7145bb41cbccd6d835571023f000332655758619c3ddb8b266073db0d791672112a17a8f00807b61f840dc733630dcf00ab0d938db2e132bf8095f7b60d62d1efb24baa3821feca8b963ef7c77cb64893c8274f3e3d11d5a8d5563160d34762f7b5298df974da243e6d7562e3090d7b3e8147429b77f0741fc4d9e5369a71f5fd202d39ba18cfafc1a16bd9d8f913714e870e17d428d31e6b29904f42a81e4f7ba33c95f7bb3c8ae08b8bbb429c76cd024ad253b27df3d03722b9a214435c419b21f624b15ce73158b8fe87bb856b3bf1cdff96339204922648427c883b126507eedb9edc3292c102a84f292fb5c9f091e2750aece79c0ff0384892b5016622f9a0a42ae228ca9ee03df81826920c3100284ad10e3341d19a488bc9bab2ef029e7c1cf4bd9640278fbddec440416f1634027c95a7eb2f90878bfbd415d585ce99507d506f4e8c8f2f53f572db87c00d15e3443e93fe02bd5aea0a06624377af2ceee628f5a333aa0781375296931fdd00a9dce902896eb73c3f66d694bc4e5e963f72fdc638b017ddda7688131c16e836400811d742b6c1d662e6e796adaf3768742163e296ecf9b543fd4af706890a1298288b6e052bcc528bc208cc5281512c92b6d986d4ae8f64016f859543c874dc008a3e42432d8c40623d1d8ceb1794c6a83f65c2c1b9ebe068fe44c48d43e5c6a26b9c71a78571b12dd8f5e581562c06db463c49ee3073f7538b06c63c4eb88d31e954c3a6aca45a433510632b7565648cc010fd3e5a7a8cb2edd19d3d868146e35946decd210c02308b8beac57dd47d9c13cfe75cf69677eb9e114e9e7f51eb82928ccfbce7c1804fed46a6e47471f2b06d8e707d83e7292c28b93e25ceac9b41ae10ba757f8e9432e3bcec301805889fea89e8e9474b5869117941ed1bae83305c49fd737488dcab94a2a15b5aa30da2e8463de8cdc7a4f973073dafbe195ff11aa607066d897614f97a62b76368063c9bdd0d2e884069414f268884b82da4f0b00c3f81b75d225edce835f5e77676f66378eda7bfb78d68499ee05d8ffd568d778ab219069c8de9c96492dc60b6dff9da438f466b3dae1a804cf6d0ec862770785ab4ae823338080b53ab6dc4a4d0bb94e012f698c67193f4085ee44af7326063006eb7fbc27b5fd036e79d1651b4df3049078ded8766b0a9aeb939ecca598d5c3cbf1bf8b03aa80506571432cac79a0060bde18489d503bcb3fb26646604725b9b8a88cdc6bb1bab4e834f008299debf0ac37dfb5059d7203b8e88fca241d4d7f9a44c82e75ad067677ec1c89cf76d8fe459afbefb59e16483f1493ea53edab92db22bc8e79a4120ae9a1dbe583db84162e2b3d50725e263afb36782e3b2b6846e47ef6f30d064d2bfd9e704cb062949055a2045b57d3f560a86dbaf9628653161b1672d2fcebc453000728572de04e92f7f1973554c35e1d038537f021107ccc4ea01eec6137e66dc2eddb4b6aedc03efe337bda806bf8ea721944db24a49f8a05733cf53ba4f28726f787d5d8527071a9deb467b734f8db1d60aa441cf7cfc7b702fc4989f8817bc54b18d7614903335376f7c4131572046dedc52dc336f510726000000000000000013d87c01000000002a9ac1a47384f1bb390845fa7cc1267cd367bd5cbb9e659a1cefbbc4010713410a5c1a9005658e929f36d6777e092d89f3d8a00577c90ab0ca9db039471920720e32936322bc1700aa5e8726ee06fb3bcfe3df7145cc95e2f779c3735bf3ade400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2bee9b4ca1ee14a65ea78fcc889dfd4f2f7deefa0a893c98e74e36168bf1e89e051e01aa1c51488ecb333830348536fd044808ef59d81f54c8350862eef0ba6eb5577e4e62e98c91592958b12dcd834d6654f06e09e7b1a2f34acfccb1029da1cd35566537d5734963ced7b819bacc50e390ab6ce9ce059bf2f9621eafd22700203da927c9cc750a93a172ba48cf63d920e2640125c00582b4e7adfbf50266e7d0326145afdcf0271d0aa40429faa314398eaa387d61799aff3dad6734fcff695910b00753889f8cde09bc2ef1f3749488ac25e8adaab0eab85a7c1635ad2092b83f9b06d06f42dbe29023b9dfdd2ee2800654e40cc7f6cd224bf52e17586572ae9350220b054727220c7f360378b8f3013e84dd686cd5246f9b2850e4a9de7116867ee022804399cb8b1aa1e01cbb0d826d6e0c1068e38bcb14952ed418d50b4f72ace8b030e7f5819c1d91d6b765b694c1b29c00149646c233b36cbe3249cc0ed4f9ef42b0302a9b0b4fa198a99cd348f399b3697318ab832b481aaf084e517b5636ae824e20301f0d809f5467d3193079eeadfe707f7d42c14da4a71c05ddbc974a4ee3b1d35ef552a7e9f1a231d634b448cc5cabe442767f76ced9b197f0031da17f55e86f120c4ed5bd280ad470060b16b46aa60742faa84de81d8ff7fc25139e86b2947138530a5fb3da101032a6d773fe4da28485e8aa025ace32eacf1efcd94b998f4a379a75921e86f391c77ee2afc9fb22e70c0efe119e06fad9f02605639c51a099f4121195388f3454465bb71d27f0d6d3e63d8f916ff52e5276bdf12a3aa86ac7ccc69d76632350ccbe86a5bcb32721b0ecaaa133e2575a5ec294e7c807cdd51303efdb4a3148f6e98410d6a9e17dd6eb1bf2674a1a179dabfefb950216cac3f94c27f8d5d43dd7733f077af8e0aed142186b60a4c9a530adab86d5cd4505c2945571f8eca2224a8ae7d54ab058de6341e1f8fedd21c7e02c49e8fc5dfefbc74cf5551afd5d01a1e0e6773f9057ecd43b14e6fcc9086c5ebab6d760dcd6b2a15fc9b667b6acc032580417badd8f4314ed06150712bdfd38b598318465b8fce64767fc32ec73f3fb960c8a663d321c5f88be5282309dc442de3b4eae77c8497fc78891e34a295c18dd2987f57f9ccdb6a2b21659518108d762a7e51aa3b7e6705f4e7bb4ad2793228648a05ab414a75bf88c3748487e8a403d3240c3c02e060c34948ce4ba56d40dad2f10b192788aadb025bb5b619d5872ae16cd3842fcf974bef9bc123fbb966cc9b04961fa03cabcf1979a89510a52a2e6f0ea5ab65bfb1e7813c53d5bcc4f481981dc8d7d2262ca00d4a00e97dbef5d015ea1b0edd097f573c3cde6a36cc46e9a7fabe5bd7b4c1c63f9cec75349ae7a4a4177f7c3c273061dc88b7eeb32120165168fc693d954360fc433bf360664c7f58f03e69c2e3cad7cba6dcc69f17bad72519ed71180010f33dd472ba16c9110aaee569917d9bb84116895691beacbddc367463451f93aa79b826f015be0c851e330382399f21bbc28687806f27ed42ccc96944a3a06bdb8b91f376d96479789c185aef9de1ab11c943583b5a55419cfcbec23ab967cb91961b138e9568ff87e906e674235c9114e72aa0c6ad48e641bfa02bf85a31203af4c64563b428c5735dbb67e18d69a5f3c58359400fb12dbc9f8ce3dca7feef4835681e37f29637129c51dfd8c1388c652cc29d6f0a7d9bf17f6bdf79944878e969199659c6a8e5703b55bfe85240991118455cfe88cedc2c3b4fdffc96111f74ca509586bad3907cbeca03c0a9ca1179e95b4616ca7e3c42f799b237614bb4cf31b634dc8767f86dc80c281e5a355488b2f3cd14e8c052c8f2077fd261218ff650696661468ed2d6e8ed8f29100309a27ba1cce63b8f544f086cf9d6ff6d6db42640d02f36992e9eb9970be3ab43254b809be13b7a2bd4deb79f6a3aaaccf8f8430f2368644c808b45f724677b86b14cd0c50b324c38301c0bd07c476da2a9ce24249af4a58401568697027532fc241c9cd9f3eccb1227b9ee585db37a71751c4b6b7caae8bb1407b39cae5c6925ea7c26f013ba3e9befcb9aa0313f1a17a92d7ffc59136b20c3813b0952cff46857096b1c8919f90d7655e8af30293aa61eb1041d8be40e859c1e2cdfa5ccb523cc75191491d58cb4691db5ef7985bb5189a6fddd431eeb25a7b4f5fad1e96971c6797abd63bbc0c2532ff5849161a840768e2615690de4eaf93c1ce92d03f240d05e0cf0b008e8f1ba467e7e0b8685f8ce8b8644f740530973f90403474b9a481f4d001c29b22f96f1edf95487fc5c275bf68052a8681cf41598b65c8a441eeff117359dbbecc9f3e178ccad89359a96cce321a203b1bc3b9b670e6e4e5ad9da8bbfcbda57eb8b888c3752dc9610385ddf6efd32b802", "51", 0, -581511426, "0c0e3440e40c474ee4c7ac035d49cd972431b5d540467d88238e818e3c8dcfdf"], + ["030000807082c403011af5073fbcf3e05586b88d1d29e5d396a8370f4ae0fd210615541a2182ad583e0000000000ffffffff01ebca8d000000000004ac6aac0053a0a3b89de01762030000000000000000ecbc5f03000000007c56098de8004a5dbbd6636822cb39ba14430491d2e95c3729dc1fb07301d6c11fe8d13c289e7ea42ebfa48c806d1ed34ef348e0f518fff487b20c97567fbd87690b61ae453c600d402d11947574c6fa4c0289efa6fa165a0e54c3ec457d522f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bdedbca5cf2ca58b40940cb68f4bada6f18b4e47a32c3743b3ac3114df721be743fa2230387e323601389093c7f96335d9f1ed28297b32e93771fafee40a28a7090b9ace868b4c9a620b3452e5e186e282947d7493b0368aaaa01d05b4927811e08ea48d3081be749cdc7ed40cbdbeceb7faa2612491f68c2796e5a5db0344fb03052cfdb0511d54fecf9396089d2f07ad0af496447ec6e29be48e33f880d1a6ba021c6f586fc11660d4875784fa3ddb218cc751743fa9a05fb19f9802b85594d4230a0347f07775942fa04c8a9365e05d94f6b5bb389a06922ebe256676195be352ebe4170b683dc2e4de91f4c3607925a5c00a89635c8378302a7c599959175e98c0021525b8bd2fd0a9bf9d560ccbc43db0cac108f2b3abfaadec4a134fd92cb7aa45032caf7086a641ef053b16fbc2de6e7b30d426ff7ebf87fc3228cceb1defc9aa4102194d3404622673e166589a4bacbe92eb6bdcd65d57300e4f6a4886137b59b88803015ddd9b5aebc3a2b9c58bd6b25e5cefcaee93836ea4c622ced07da89a5bc30a02243df17cabc3370e338d34e679f710e6b3b2466cc56588938f830c45af4602bc2198be77327acddf3e8215dbe1b6da1d12abdc6f6ac340fd9988a682ce4942200fbefa2a803312e391587bb18919ffa43188478acd42754a7fa8b3ed16fc1cc303e56ad8656983403ab1670cf1c6b2164c69ff34181dac48e71744703b6fff1959dfec7d8f807d449e7ccd505c5617acc5eacaccec3f5de9b11d690b1db267b419947478eed5e83a50811e28084e90609552cca551366a7c9c33224242074183fa8bb8c41974b4c1baa643dafc9c353c08fea817e3a34721067197ca0df90fa1296cb252f0cf51fed7d5c1cee19a37b5eb16b883595484c8ec265b328124a41b9b9fa3c28e89ddd83a6eced33e10d022f69b8267ef9df5c3434b0bec058354f0ff065d9234e0cc1727d10fcf06fe0078a8b4558808a4ec4f773de0ba0b6dcbb97b3cd0e8707a452d32a523c9074b750794760e7f7188fa1f3422219227e9421828814c8d0efe6342fe8eecee63df34beaeb6a78771f433b588323218f168f0c7b2bfa0c099741e035b211b570edb48cc4e35c8ebbbaca956eaff7343acbe14ec0b9a3eb9fbd2e015e72a9a8dc8567b2319bce1334c08c71b8226214ed3f117d62c9b9237fd235ff3e8460d499704b37da97e1f7848f5cb9a4049af513b7f2b198635a35b9a64bf2a7628311c16073dbb240d3a72f0fe7a56398f9178582845b2cc13a138d5a824d6d211eca7ed5316b4fc00c04f944709ddb522772d1ade6cb74cc920f0dc7e4aa106adfb4e43f33cb7aa99e6fa704a1db2d9bac7a0835ceb30707279bce64bf1253b620d8f81863a50d78b487b656f46617c466191844df60d851df8f1491561d127f13f9c386a77ff051b6f338605580ebff7007a72df39a32b71a4fa4c41821eec978fd886c6fc1fe03c84d6682fb2f231d636b567ea00b22f104a9c6ee51db45f9f571d2104282cc4c96f4825915f07982bbee8c2d129e77fc3a2be0205e8aa1028c5450f2b52888c92f1df9a2426cb2e200fc92d8da85634edbe7bd6e38fcbc2b5bfddf9d4f9745974e213fccdf2c69d8fe5505afe3836d8dfb5cc37de4b232ef4723dad6850c1b3d9b23eb93f8309e3e775b114741dc4cba16a6537e3c8c36e84d8bb2421373eed0b4400f7cef42b6cb1b014102b802d600e066677e260953da1c45e4b2d843e5824ab223ad507adcd5410d54bd13445b5ee9c01181cd804de96ef77d9dc7e5b8af23ff5513f3878e314b88a3979503bff1c4e7b1c1d1a50545340c75670966d5638159b6a818cfafb1e638ae70472b73d14e8cb8d340edeea3421e943d78757368424946ab15f2fc1b47e7fa55dc983c878ab6b51b07779d98d5e22037cf5fbfddfddaa2016f7abef6a923ee57efee25d8257f492c2005fc3d24c81776d059b1cbcf5e4edc611fa6a8df56003344d73416b9080773b7dc5d2808dd26de7890c3a5b36c8934e213c884c0e4584cb803826705633807f430817147ff4480943c85ee2cd53d34659e69aa4d4a927677fdec17ff40784c794b3a24053471cb974432085b8ebe72f0554ce1e7f3f3fb2cf164718e2aff80ace8b09789a901456d958e456e0201f396a6c81971c4e542436077267200eac2721347337912524d7f610da71d9a5de8e66c1dfd1fa31593470fc7548b92f5c1f4483ace90d3e3816734b403f64c6748227866f4321f382961688dea1ab6bf0fe6495d22e82a385c538b51b890000000000000000e06d610400000000cd63954ac0cb527ab179404b0031d0dc517ccc51f3a3920d53e4d4bbd1a2b4101359422ebd64b6d167b1529fd2a511a13e1fe2e8d83a3662802e3b0f185764cd60af9a4e7b3a0aeba7f46e07f61d3f97665a0950df92e0e9e411d6ffd6043c7900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000282b1a300065d3dd412925be31e2c6cf5a02dfe47c43afca18a186f9ad3f9062a9a5f5b0424044267e3c7ac2a99625ad391886185e9f3a571c28100a3a7fb7dadc51362f4b813781d3f119bb5d23b5226c04223507cb9879f4cae92ce3dedcb4886d04fa0351979105dceb267c6821a19d2b2d8258d5dbcfd25d5665f6c44050020a9c9e8936ed3900adb42ee57de802ea7883188385083873bb8241f413e33537031e189631c45d80e8976e3a0ad0df9f71d04cb9f693d9ba9e21869ca1c0707ae70a0754bfb4a13cf806f48bf44cabf901dc26c751e3c6fc363d83f6a96954eb260c8fb512406e7004f88fcd022d0c081b1d6b9800f5f9ff226a243f365d7432a9a60320ec3b566f283249291bf2a4a3f067ac5354d487829607194ea41f1244a9a01b0330009aae633bf340872adf4c6ddbecb2f7232c4930d9a57a471c0999403b04f902163fcc71564dd574e8d5d3f29ad4452ef7c847e9f571c21812d40bcf012a8ff40205bce23d29c8c9e7700831aba3d77607d86cd6e89a3edb827f6446826993d06c0223111c38b7b84bd9d6df6927a9af6c8a5b75ca4246a5a448a71ec93edbd8dfc9ef55315a782f6f1ad0fdbeb563f66f6b7165965eb2242dc7055ea810ba0de2edbfb9c4a6c1db66ab8ee42052130bb9da3af6983b59b289bb9d15c401b844ebff9dfd0c23d3c1916bbaa2f0dcbbe7053905156657e24aedae9b399984f6fb426940367d4a1d2a6f42b01453bae783f9ae11647cfe32403ef0a756c194c73f08efe454b0e0d9bbafeddb78c7df3a25cd29fa02eff80ec8023171763edaea9287143b95e0d6b2ac9844c2c7b6f1a41227bfaf4595367bd717756787dd5ee84e2ad77870015e219c354c4e1ca7c1db78a6555dbcdf70df371e31d486216e9e30dd73d4d46932fba8eca0b8c92353fa8e4aa78c226a940cb522e35a8a7c8aeab781af0ae7750b3d6085ccfb2b11d1e248c037ccb055f9db90dc07e6da4b667876615f048a1953328fc8297cc3a503e123953456cc946b7e0bd65872737f4cf077dbb3c8a7b05e73d7de8ac28ecc05f8d192de809e906443d0cbad32ff5f2651fc29ed198a8b69e4c6114e2f4e8e96c0660dfd3218cc56dbd5c4030ffef6d512d3651d8a7b52ff1da6d696b5c638c3995577b48792b431d94571b4509f294a625561d4dada594595e77522e6406a5be8e94998c03e4200ca1f5745e918d28b8ac083b9bf30fc5ebbd109dd52605a31d9279d77419190d284a812cdf2ec72dac9951c9e287b7005c8584a016a314fac0ccb1b4d74ad2bdfa9854211c85311348779be354ffab34544ccfd8ca46f32fa2fc9e8070935157e8b5e48cfdff7bb6ef7e94ea07534f1bacf540d5b6685a610203bcff929c0b5cd9041f8ac55c463ae61e9f9b612aaf49f16ca25262a74279dbe01981b8f4ad2c4b1e8c75f72f1e918594eb452434ba9ddc28a68a1c83969a6e43b5728d06ed2e4a7ac5725e872aa5a45897e6caef8893f90a8648b27aefceef1a1c87a6f5b0e678d0a8e4699f6971e3714a8d3d2300ac7b7fadfcfba544cc87b19786e3541b1989ba1bd1f4f2afae1cdd18b4f7e36785bfa373ac6a7fbab1ee7d691a8d9ed1f804805bb535222f2e77046afc0896668d6b79f9782e1f2cc867eb01512ac1b78ad8107f9ec913a964fa907010934492cbe4680e3bfb93b8f26f0297182b89ebc7239cbdd48962c4ec819632dcc8ce3cd692abe6378f67e3188c7a8401cabf03e5215889e10df6d0972cbb18fe73d98d03b6d10e159e38663c98361763d2fc2355d95bd32369ce946896f7e6685bcc2a04f323e065219a66a9fd619daf419b0b4bd97a02f3268870ea1603ba003033e60a08e2242d3546ebaafd50c6481a3680fd6cad2aab38b982ea6b7d1605f31fcc5cd9838ab01ebef123985ad6390ad47c3b2c92b38fde282c1565b6abffd0a49d770acce9bb9dd706c0c4def3c5d1aa84c5056f33480087b8d4f37b6e3284d6a7dc23a62392f49dc0033cb2e75d2308eb7593a45bd5f1d07cecccfa52011fe581082026a177a27ec67137d96ec4becde50bcc13639464800aa71961b3b29d8860b1bd8cec1cbb0a1bd82a1eb871082b1efc8916be77b722b74f6ac6c45bb1e5828ba8747ca5b1c74846cf012d03bb56dd68fea9c7b21c831138908225067e599869cbca9bbc97db16d156b60464f0a06f5aeb4939acb26f422350f80c7334af4214464180b5ddaca680f702a01883e0b0e9a6acb1f6700b9a9fccf6d8569e84d3ab4708293bc2ddac3de1891e360694900000000000000006be4580500000000db929d50e00b2af30125381527bc62e9bd13709158496b81476a75dd22326bc0a65c6dbcd7a4e845898908ecf90d86f12a9148b265c4ef5f6ae6d4f76ab41f5d63ad3833b455c57adc457eb10d789318cd9d515cb25792f7836ecf9e54f42ae5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007054cc606cc70d75602d75307daa361c77bb9574c5442cefa2f419d7213fb80ca647fee053d4e667ab8e70d97a6d3ba1c787824b17178de9c7e433a3f227b0c24a438b76fe45d64d935968cdb8e410de02394f8027613a59c9042241ee7a753b4819ef534655180afdc04b6b6dd4054dc8aec33ba8110dac9a68c9f0af22a0860210b2a3ce1017f06efacb62a5dc8a4fdc2fedb4d21bcc0a2077ab81cc7587080d03116146053af77d4ffc647fda1d7fb2203789777728441780c6e44833f31447220a0683a4b16254b2e0626a118c58b12e437502042ccadbf94e33ea11f760e14d3d901082c7f78a074c77b6c38d44da060b27ce95f590eb30753d533b878623c5af0219b763b4aee8d7bf42d2e665e0704379a9beb932f5fc2289de7c196228f1c88102184409aaf5f361fc5997b587b92222a406f80bb8830728b99777617ca6b9e295032dd00f21e782e9e8e8033f5e6a4c739cdc9af0d0fba9cdcdf1f947cdfefef543021ceaf737ece4b13bb7975326b0f55ad89d7869af0fbf55fdc2dcc8b188fd48530222d6514e7c67d54bffd8a1264fae71f1a63c6eb6654d8d80c1c76ce48f066ba2b9cf2a256fda03dc3e58438dba1b1b06d1279649b40460f070173da0ba2d18adc7c4c536a4712fac139a74c00690a85df0652f74d50e59a4943a3ccc014d6d457bd75dbe175282ad68b6c432f1cad2ee9b61862f5ac41cb7f922954ae31b8786eda35ea80931cd89d4a631344f36b6a78280a428f5e330793b7757c78001cdd38663584b78a772621cacb880d8812a61528ceb5d67edbf99baec97c8827cab00f7442fcbffb617a6ecfba622e9e221f67803fa980bec276fceda72e640a9ed0164c0418747074f52623133d7d23d91298e71a56eddc92c72109e5535f57c8e6dd62b193feb1ffa16d1f97f288bac14f89de1a2178b44b2fe6f9768015f261998a759e9afca30769c65e833632f12cdcfc1b35e01d66b94aaa76213bc6ffd6c9efdfd0b2472b24e3a2e0d1bde78cce8c54e2a4f19130343656e61d5e0c0354af47741a2bc61bc47248ea427bcd72dc65025146031ae40765db3de87b4c979c4075f38d5d45444aba988bb87e3930317a4afc477c6477587ac9603bc6bf64dda359891161c75d84b9f71ed2dfd149f1915247c281be37c422c039897501fd3d2afe99cb59c03f1e555514ca12782a829a80390988adcbe7c4a24a633cd6afcdbb6cef962f4ffbb4d3d5e2392200117e5514d9ef264d15d4a2522f4a6e68c97e37d2c298be308b83f08d705c4f5e4a6fa4fc68d867135dccc66187ad0942f9543fec237203afabe6cd9c308ffc0005f5ed6e2bbc3e5a7ccec28639a8da0c0e2dfe377353442e895bd461963c17b1417815a9fe8d7eb0a377037540062151b0c91837b2997c2102c8076000ff21564e9b305de23a90aeae1d9854ab6b5580746bcbe541624837731a5f2cf2edab3e346dc35392444507aa067abce734c6a4a8e337eb5cc6aa6ed93e9b1b0abe0717f72dea8891a2f733ae6b68bb81d01228457344b68ab0b9eadc156e613bb7beb81d2f334c8c20650550c378df79c792815e06d05fa9138ca233cb299536100ba10e3f8a3d8590489794650d83eaaadf710922e0b5f8155482e381e060227b1cb4d66a95ac78dd097b862eb3f97900c9b11a7be181eed1fa8efb205dc165bbec454389cb6405b13530f14d46c4b004a6b4f403711e3903ec9a63b545caaa350b21ef4867a2bba4be30f676522defd327bdbd9f378eee8c7a100c1d4ebb2324cf84453b36b1e1f7bbbccda44156158640b402a4f84ada09d7356bec80f1966dbcfc5c78715481aaa72d739419888eb736b66c39625ad55d9de87c533a8c3c7db86e1a9d91612834ff778d33b2f0c531bddb8d5cc814b66a8f6dbcc39f620750570efccfff7b5cf9b9934f405fb2b50bc2634e233e97fdd54d8aa8f0aff3f5ac850d7b8045d357f785a2f5a8a5b2addbfdc9f184f1a7e5cb89f618ba54920ea9695d0ed68690cb6a5232c1dece532a2d7b4fe963b95c288931fe792820c77da0396ef1c2153691468328f9a737632dc0ed617ef323f261c918f0a5663dda4761bcd2aa99a336f68cf0fc82324687525854b63801abe56f0b51cc54db8dc6acc9c2f00fe3bafb32863958a69002f2c38744ac6c419f23a792b8e822d6d551b13746465858e9d27f3a7ac804839f96f35e7749bf59f526b1a2775314c3f20f300817c34c6356df6efa171e662892cae209c30a5c6fad5b456e9f7a16cd6e91924b1dd463ca76de9bfd3ec14bd89d2373e0b89c2c50ab7fe7066dcc1470472ecaa07cca2e3be7be20262e5289ab7478b860b6e663e62a0b184fed0cdb49e69c4da5e2a3ac5adda9d9da8a2c0c30770c3e1fee78f23a80f50fc9e157f154e8fc043950bd1f38177770a", "536a63", 0, 135471245, "1d296b7517badd603a4511d102a681a6c77684e46d6229d67590559696f6d744"], + ["030000807082c403026a02eaad3bf1bd750dc2b5ab3755aee596aed0ea8cf463a9accf0c2901d09bc60000000002ac6a8c8cc93fd5f8c14b6c27cd14dabe4cf584abbf328dc68fe4c3d78e5a1ac1c5fc508a5e5302000000066a6363ac6565afdd109f03795ed0020000000000af4b39050000000005006aac63ac5ad3500100000000016a000000006d4d098603000000000000000099372f010000000014381d2d742317dbd017647d70d320d931aa2997df079c0d9d9b68e90be748751e28752d4e19656e3a973389986f7c3fcd9616b6a73636a0f97ea2b62892e975d9cc81d7eff66230cf48cb364779f74d35daa102793469a83090ed59725edecc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fd4190bc0cc0190a46ea6784432b5d4c74ab5b330e73f41c66925d67b7f14e5a33e26868af9fbc531e29450ad98d0109bed45b3adf35bc2cd57969f5af8fde0bda8be82dd71c9f1316b3de5f622b2d9df0e5cd5ff1362f32fff3cc99bafed2beda84fa2097349fed6cf6e2bf2cc1b96a8027a49518ce7a67e45c8b2d227a710203f567b29e940e330e59ee0754a270339a0502404ecfb00405df4b1a5aa0c058021035bfd46523c3273c559e836e9cff95e335a500d0eed4d6877e34806c7696490a071c7a39539a21edafa139adb0129536ed736328b6ebde064af43832ce8c5294d9c485540684759df279c19dea358e738cc11e77d61c27e68b71694aefad1cd7022e740e43b5877a3fd0bda8908421c04d69c67401c8d460afeadaf595574aff11031ce9e11e67ffe45ed4a1756c50694de400e7b581fb5c30d4663882b486d2129a022648029bc1140f1b275b6af72c250deec810ee298ab4ade7f86887d3678deb6c02082bd4ab04278c9af7f6cdcbe1de143e6fc00e6d02387c630e1440fd81fcc4ec0212451546ca1060de057141b1fae2f7214301d05ed2a408557a8a52e28682c49b369cf5d630e13f532fbe23ac013aad4f0f5078c526c80e706f32758cb5a7f2f62efc6ac8f52f7423fc2882a1fc5aba995bd761a948c51481d844ef91de5704d58e747da8210954364ab6e5cb1b415536ff62e82d3faa06005d63e09ab5b2d357c867a0f7d0f00ec958431a7b29960451d30f99827211a3c7ceb1ee03043b35fe22aa52b70787f00e9addb1c31274c573b08fb0acc3ef5e700aee9da6543eb5d0638101b1ac0a58c507d9a8f2b280ae5392398bd9821986ad5f47f99bdc667fbafab5cb25febb9f9c422ee93fdfd88f5cb01543fca542095ca8f8c0910fe1bb328aca0e835c0dadef1a7d22d8a96ac5dc2d4296e0db5d459d2e135d2d94c03a3d17a4653520395d60c62766a7976dceeb204fd0659004a6077c2cbf19497e29abf836b32e30b5bc4ca3ad5ccd421feb0d54773e0f4b0715c68bab1c07c7eeb0f2408e97ddb04ff93995704804e691b30c3b54f5a0483edefc1421a2f86a535bdca26c5b6bdbd6b5e203f12fc824dc86de7b509a566a2fc0b58ab747f8a0d56718d22113ef26f0eb46ef4565783b73cfb28d49bff98e01c92f437e528e2e83ea6c138a67a0fcdbbd0f6d75fb216bb72f5a5fc825038094c04b955b84ea75d72b87a5cd084f4fb50a89d3bf7363d04183349328c20cdb3ea58ba7c11cf9e99f72dccf4daad6257b8f039714c27f51c04d139cf8a85502e66b47c25a569a1fe30aa5693f3224e2c0b1adc02e21b3e96aec00cb82b044d617d9c2675c744771540cd6c97da6d3db7153d6f0be53c5ef651c34ecf404b1fe003b68f7c2cd2064c4832777e3dc4eb8df8db8e4f98b292eebdb49a6137f3718d070fe4ee4984e5663b1f0fe71e2621deb5b23a0c78a6f534202166b6bf25b00252f583f5b33c07caafd93b608a6404bd3064797bdacae842458b2eba84828ead58b8d4ce56abe5b81ab8d9c7f05fffde2d3b5c0e4cb9152d790952e80f68313075f3b774ca693e9bdbbedc9ad555c599e2559df7e794a605033325018a9573b81892bc29e33c0330cf438e8ed5c2f059571a74dcd81ea200157fefef6ebcbabbf0e736e4050d9b939f14e0149654825212ee7a1a1bbd09bc24284e9aef4c55609fa67476c723997330f9428c831768b6ac8e7ba21240e4a57f38dfe11174e9f66f508e8bdaa204d53b50ae0264207166e95e19f6e5d9c7780b0e329628410849869712df78e95d2ef9e332464092c5c4bb21b92a55a5211d6f77d6fb7d1b97314f7786fd3488f1758d904763e57b52e863db9f39a9f8e8a396164f41b4d7a5c1a2bb7c39c26a11e78e4de0d40f6e485c48ce1d700ae2ef4c6cc6b16e82fbec1b60c00465389d3d6125e641171d3463c6c99c37b3a1c92fc73ad4ed9e9e417960f26470b7dba5bb30039beef95adc981edf2f9b58fcc85927d77fe602e3a65848d2aa7bda5467b25b0dd828ed206bba9e00c64d62b5fa5805e472d257ef6b7085cb24f7b02f864a85080299d244c15509692d465c215fd6439f59c741e9107ffc56416357cf96e3130a7790c2fb891ba90078ebbda089454b1f2de85be8ac947a864c68344660bc4988ed8b00262aa52a80a03a8432ec6c0b454ea05f7640d602cecd0144f117fd7fb787f7c5f2309ac35654cb5fd089b1273d216be2c444e2ffc3faf2b22a583240c9ba2b5d0164f07c99e6aca8e4d1694fbb727505122b5b3030000000000000000000000002918fe5988bc08dfce2c767fa95c788c9b5044d24354d3e15f926ba2ee9c2b01c1dc35ddb3b155a4301d5ca98856c30a81286f1c553a738d567cf9b6f217c20fc609bfb8dabba216c96812a5364a4764aeb6b947ebf2fc4d51308e4fe4d5e25000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000be942dbef3d09889588ff44a373077172b6436ec7ff98ebf70793c667e691ff5e6f1a333ed71825f28ff7eb2b7c02c17f2aa402d6c4c6765ac1cd01001e7739ed81b1a578edc26df24a761eed1206cae36a2938aee64941076d875c0a88edd2f82b623145304f5ae53cccba69ede073555212763d13d6680f7e6f94d3fbd8f75021dd427e29a54ff541b33aae0e1430f418bf7dff2ddeedeba8d558912b26161f2031d7b4321668303f140f94726d21b0781ebeae3605e5e75ece09b3acf89602cdf0a02b35df7f6f48ed95aae6347d33eb894edf58abe47200a7beb2279b01d13aadf867d5746c6e7af6c26a4da52da19051c6419bad6e2e248c084aa18a942c5f594020d686a3f491081d46fa1315e82f9ac01ed998691c174429ba0b1358271eeacb802124404e8e884578fa95785744536f590a37d76b689d164b8bd7321dd910e6308021e9afd2706f259e931621e52752dfc1e76e664ec9c02dfe2acf5ab0be6dfc7f5030b2a83504e0a844c0eae43e37951d72a167a7c93f272f9b7889a7f7a42db6aa5021020fe16da6a9650ab3eba935e0626796a3ce2850257b08159f59412f587b99ec52c19a25b8674ffcac2134f9e9b2f4a6404e4258033bd5f88b4ec2ec1b03b98f84bdbebc473a847d6139d86657f6ad092c943ccc31489ce48d1c0f09b7c1ecb61079187fb8ffcaf844d1d898fd676c721e1aac2b9967c55c2c5f2dca29b6b5236741e681613b5dbd24f8a2de801e8d435e203597029369d0a3f144950aff8b0d9124ac1a0386bcf372276093fb211d96e05b87aa18cff274b0f5db3053a9c88ccc3cf2ef920ed4fc6bdbabdf9012ed729d6631a7be56480dbbfba9aa1d4904e4e41b8cf8c9ca031c8c7bc2ab23b0f48f960d00fa3835db936c1dfe2a8b6bbb9658bb3732debfbe9a160ec52ec9a983feed33b1104fe569f7562cb8bcac09b1721151dea7abc44cfd48f13fa16a17a2aa8e2d43eb9048e77b85bcec21d8cb2288b24d0e040c1743ffbc74f34f888850353a424f0d310b8a175c06d64db418ca138772620ffb6e939becc086864c10c479b321ecc43f5d4401981a9b5c89785bd665448f929c4cd23ba9ee3cb1b2ac83c13e091c250452c8bc3a3c68dc424a8e9f20c9da45dfe4c03fa9c20b24da01689938c7a8b19af5f79bac0c99b5e37098a53ad1540c249f7a0d9770558707ec9d75b038a77e86d25ee71e3fdc1c5626602e22553a36df04ca2b676d188407fff3d15eddcdd650858686e39f1b7f545ad32d357c151e2e1ff530a71edbcd22da8cd8aee7d5331feb9fb436b4b485ee4b2ed284744d759b2e97dd0e8629805c5535d4c438400a397400d7c7eec9b7518ee068c16aebf6aa76f7019fd9b4483e026afef7b6b2f4029259ad92f5f015d5423ebf58c6f140692c1bbc53687dff6ff104f35b1cc605c0871f1cc691f2f084eaab6dc2cf820b7649735457cb6af2e7b443d779822d5fd7ba751b9d48827f3bf15b31bc16575ad873ad15d6397e64953f7a1b7eb0da22462b3b8ab884254308117df7dcc48b62719c27cb4a3018b9e7f87d996f06d0c38c0659875444eb8403e35d1db6eb518168a9a75f41ab88018ad15fdf09499272096dfee0ed6e99b9d1dc2565dcdbae7d4f6df27a00631933a4c4598bd036fb1109488f1cfa279d21df443a7ed8c750b6576bcd45aed59d521c99364ae874d6a13a9e91bb48b1b2094fab931b383599032e0c2069f09718a00c5605d13d54e6dcd9a1edef27463e166f509842c6c043038358df4092e2ff715dbb89943443d3e18dd47515a1c55d7ab3bb509e583bdcbe35f5302e07ab6cd4ae49749cb1556d3ff2cab59f61f9823ea22ee80849f97feebe44b9ff61b3af9faa1bda607c520a090b837bc9550b9e055558a38e66ab146f9c85f7abfe6006843f53bd8906d1fa34bb22b4def64d33b43daca3eb1821a333ee6eb825c9cd1ac38ed60e6ca3c00d05b7b66df738481e789692ae1c657205d0d51a13f3130005477fd86ad9b98506cb5d2654b6a46684c113ecab1c58b498d020423f5cc4c2a7d046b0fca306409c259b13fbfdc87245a0b9393df3586c056bd8dfea9f2120a70fa464f2f4208fb8ee0e6657ab05a2ce00c2149ddfa71fb764f833a0133fb8fa1b052b8188dac6e7bb708c63fa6b36f31c9410d0a75f829aabefb8d8b35735cdae1f73c9301db36beabbe62f56cd1e13147774235b743d06127489f50bce9a9275bb4781c63d775f48e645454adb5026546f724992ec5b9938527d975df94e55e5e16c09490900000000000000000cfe9e203000000002302b7972959c8c39d631b48447d6e06df02da8d5c076c6bd8543ae9b367b2d60af70be87983593fad4ca53fa7b9a4f750b1694de1f076b074e82c6efca59dc71eb9ed585eedab05b546c72d8ea81fb283e3ac8fc6cfb39337994414e3d266fe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1065512bcd8d6150e0c6a06067cd989545fc31d7200690454c96437a21963903ce166a3a3fd59a921015e6842dbc2b299e9c4bf5ab2da5dcf02369a2c7fdceedd6b8189ca2c8d7729317fe27a9e4b41d0fde188029167697e7ac11aaa0db653d2344677165fbf00e2c2f24c431bd2f4daa1a44ca0ec580ddedc43c90a0346c9031e2bf9e3ff7d83e89881107763e5edd9458352fb0bbfc23197bddab6aa618e8e03224ef7d33ac70af47006ed452a9ee1e888f64a39dfc9f383807fff43fe7976e50a083b4b5ff36c6e43dd5a5b54eef3f2bcd9ecf634baa72efd210caecb7e01445c3d127e8012e387202fe9790ba49693562b2060e697bfd70217c3c9f248e8bef10307cbb70b4be4414492be0347b14927deb80d680d584ca9ef9405866f6c3bce6b0200d942dfe164b564a4aceb487f1b491df3abf570e039b26a7bc65442e422e187020a0194edfb33cb76c0fd3af2c77627ed051a6a8d229f191409af3fc4c6d3837c0329dd88eb4be4c7839c3fecce7657bb775f948ed4fac1806abc769640ae117911020dd834ca56e0b87134281f3a7f9d4c12998c4d88d5b1a5f153aa96835988280b69dc5134df36f6264a1ccded432523f7dc15716a115b91b448657d43245e7e6fa4a86da8c6bdfc594716be1482e1ef236931d58bc7dc486a6f369d2078078a674d117e00a59b493002be6b55d8ea3489254675bf1a2f32266126899c1fb0f81ce55cb638727bc357465d13ed5d409c9063e1d1321724a260ca1bc08d53819ffa5a8757be92d3c86c3d4c6ed03109dadb0714a8b3eab6149f4fbf2562e6f7af34f58efdfa666a0a2c070c195b64838454f47a7c6a30a6a36a6a480e43380c4d7ad4bbc8ddf23eebff482d8247c0d91d383253d1ce98ded34cba24c41a021cb23a757e8e6fae9f258f91c7b03b77d641b97fe379231d4851c5345aef8757b5d815f50d3b6ce769b58b219257bd906c522736db327f7d19a15e9b5b0f6b642dfe7fbfeee9b6b1b0c260f2677ca55f9e1f1dd4f9a778f3fe97b7d6f9380164fdccf278a5fe6d644cc769842dcb930cd3f8df714aa9113dd84cbb10982bfca3ac496f8ffec0f2efe72bbbdfbfa18bdd32aba8b880a8fd2e52642123c513a3cdab915ed209b667a23e9d08f03fe37e3fb4dbda5fae8c3afeb0035a441064b949d84fde90224ff9c804f92576055a23d86eed7325275788391521329c783490522a872a0c901915fc817e07c1f94c81716076f45956bfdb88d053ef88fca52f800e4d30b27b2b76a96043a62b3ca5589e36b947762c7924bc2dd7f939304fc5f921d338b6b2712e332598b6f790640c4b3c1c199115eebae835f8fa62152adcae7cc3e0da9e6d32d732864315972874851ec7f6fcaa28feabd8e8517be9d772ab7d38543e6d73efc0e05ec4bdc85cc29093d9f607fa7061272a03a2bb278894fb19464979dfb2739d74c665599bdc53ff3021e49413f8b6c83e6ac800029d66741bee2159a027cd7ee436d853f3dc1e44fa41fc124febed3cc598217ecf44cff18d9c244bd732425cf44964e945d261ea95c6fb969dc3a07bdc7f0d1a0b06ce447203abeb3babc0d0f86eb71db10340a242df2093db45ddeaffc4b8a546b578f1a11d43db678ac3e2aeac4fae4448619bc1aca5797fefffa265f664cf463e7eca40a479208eb8755d4ef873223a88e1d3b01bffe9b8ef22c8e16ce665260a8b300ad27690867f012ea254b96c42c07c437e36f79bc15baa00b56685748e80bd41dfe4f0face1344f78c33fd65fe2b6f2c82f2f19d69bbf2cfbb60a480bc4e4d93c24185e35e8537b90164cbe236782bb8cf25778ae17c7245e7f27be8f53c5a72412f9e0c4734fc405c4323c342bd5126e775fcddccdd38af8b81481ddac59a53b5f9d028c97ae1bf1c7c8a0aa595de4c0f7cdfd9fd12581ae585b17e458894a42c349d37ac6e4b78156e9bd2c6f6bb225fddd4f2aeebcc9e2775ecb77f6b49d1d910a429a32dc19d9ac929332e474119db468fbd23dfa6ceefd3b8322f456f2a3fb0c876a0ce76846c4314e34e34c3096ad6738adddddf4ebe2c2f1b0702c1d0be846024a28938082d3fd61c598acd7d80c61239e07c45cf873ec92724582acd21cce06330335c3233daf9e437253fdd6e8b65269e3b0c8659129209a14aa2b41debdedd9bdd683ba3554a334f728b45ae2b4af6cf935f78e098d5990938daace0892b2f40a1cb365edd17822a37924e97da4cde757502a1884c49166d79362f22293151a816d67bc37b7a25d03ab0799cfd17972ce61b65f90a238c5c9693ca7cea7ee9e030d979239f1639f49e91cd170d400922302329029a9125474e52f82005344adcd33bee3e3031603b0af0da2c0e6f94e30357ab02873fc9770d1ff834ba556664d8fdb3e6bbab8fdf327e83340a20570b", "", 0, -587207431, "9d7047cf3b32da291f6a6d08cb48939520d7166a4d9e5ce89e73403b5391df11"], + ["eeac0b74041626e86be834f49345edff1470f83a0e677f5d47e95875dab372147b9944f7e5020000000965635265ac635153acffffffff0f06918152c286dadc9d7cac9dc19368fe68ff2a05e28a5b038660560182759102000000096363656a63656a5351ffffffff88408b0a3e02c9a14c9200f6111710f6c1a15cb5fc2ad9db45e00c468903eecd03000000056a636a515263ae0856b62b22b5edaab3de78b4df925db011db07c0c014aec3b89be243fca49bdb80960200000003516552ffffffff018ce208020000000004006351ac0000000001b189d905000000000000000000000000d1020bca2f418328b43cbc27555332c914b519e21a89bd246b5308d16f1ffb9d3308678a0204bf2736c5c37aaf922eb771c90263f38e50074d6984d9f32f579c35b104663e94920a6bcaff8fbaf1d5af0d9fa636ebaf397a8eb5282ba82a484000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f612a7b1dcaa26248b1646b172982fabbb80b29fb96c7483c224b60a3bf645e35beb6ed732fedbd128c78698431108eb950fecb4086505a439d942c363e280789d9e7912c4b7c1b31d6de9420deff948908963a31a490eae046081bc270ce982053b038101828ec4d355327926c16d29e25dd9f8b9f84fbe171948c5f41e343703302cc701f1150c446f41072549726ede624ec357748f076bb2fba79b589771e70314f72153168eabd27af94887363a93c148430ca8290ba87e742fa7020504f0f20b0478de27cf767d1e2050ec124c17091494137d8e6d9589a0abebc930cf3e4c2e87b80679df7e57084f53ba8215a01e6d66d3066313722fad07586808edc5fb4302038a15aa9ea52487bb049b3cc47a77ebbc1f16e3b991f605c670c543cf59d0c10324bb03ca558a46b770d3660e5e565ed14170054d0376b0dcc3a6c72e5ca1448c030bbedb88dc64dde6fce9e8afd4b99544e5d932f4b06edd48f86c9603c879acca021fa8a873a40d10ecc4509061c409a580127801af5e63149de96ec072c3ffce3d03260fe06b3b3936b464ec29229c7ee303d8e0bd9a8ca5e35f163e98769187565b693eaefca993e0278595424e369e08518d26ee92d5f799aff18564cd2272be2725d24c01dfc59f87f362380d90b515760196f6d23e47d049670d6ef82a35d9a7d44982afbe8299650b7686fae901c59980a0758e1d0f25f88022f882e16187c54a8876049bb816f8ebe8befd901a0633c1a8ac2bf34989cb1222d96a693f361a283ceedf39cbac9e9f8662935689c0708b4e15fec749f1eb8e887eec29c117256088648a9e26059d3e1e058d860831693321975aa9b029179611b5ca71207e0f5779614f82586eedec1f81fae92c4c09d191bb58bc4df96da9ceca30963b7e910cd3d5a998b34cc1ac17993b4b6a728903e117babb4360c5371c74be13c427ff5f7695baa695ec67d5290bfb8c6d0f97b226367ebd1e1c3de15597f10a8efc6189c04e9808d44f0fab5c5e27e770649d6af03dbc5347255d6138beb95325ddaf43e1536cfa2e75c2d48cf278403faa2678bc2e32b6cc00f18554d0980858a0a518269da961b500973e606f78af42c0a79e79c712eb3e1f8e3c3dc8041f7d976c357e3547199b913940ab37942a0c4f7dd76ec16bcb6a6cb1ae9b5f1ec7faa06cbc5647ce7d1ccdd7a65c35f81b48744e8e72165a589e43b61984c64e2490ded11d3c1d462ed23e88dea0acb5685b510d17a874edb1a2a0c6d084f07e92327c8a35643dbc93300d883bb0191bb333a2fd0b933b9aaf555e692442ef815f0a0546d44a8a63f55ab718682f0d96311bd3b2d34c42d9ebcdc8f868c38947f09c3683c7339db915cae2edcade7b764ca6f904183a8ed78ccca6e49427365c380beff51c8c39cf10dde13c2b350dd9c53953202a14272f97834a082f5802d749a98a35546624a773293c033b391d9e8dd8a663e96e4bb12c2d81f389e0a082ec2b2c5c421b81961dd0a7cbb679ea11adcb787a679589538f3f5ad2dc3e67a913b7ac6a971d3bd7c2bc93e0ce640bae10cd8ea945949de6eeed3bb95356b9c64c58a733c1bb6acf3c9454b68a962e2e65b2ee441c8783faf84d004e03de55a583021d04d5651d63d16e28a0943e7268af851658aa02d777a0a501827560df174f75ad3db3dea76f4d0299c488e1908195922794f12483bf3ca361fdb0070018a173b1761edc16e5a041a33ad6fc420dd28bba76176335c565057193e3061dc0f1be3e1c24469c3e41fe9c881e46b340a658a9fdf5652277a8450061343a7c415fb4ceddfaedc1cdabfcf180154e77a9ca27c7fe8a08e7faa8d5531a243d3c7ddd0f40513daac25284b321e5f9eaceca59cd5ca31fd593d3d12983b444a5d3ee412723bf707ab97a3d553cba626a7142869e655bd54578c7c351a3adc92f3a9a6b6944d4d9d6686e9c61ea8e76d3e288f51be383f29ccbe0a1b9a25e80e0da815114f6633c7f71ab4e07ed5040411e20b765296170844be011dab1209b86448b8c695af1e3651d0c2f9049d8b3ecc79ba349d415bcbc77dca05a250d6a4cc1b8656c364502a87c8cbc703f1626002ff19d0ccd14e07c2d982bd5e3d033d5b7ccb61ec989fc52c81e2703c075d9ebac60a403749ddbc5046f80888bdbcae1d1bc811b41fdc0d8d3952d67a8cd78214aabbefe5e1e95fb7ead9ef07c9e341bc29579f948892cfb2ed61aacb7089b5d6285e25fc753aeb859ad9e9b0e416ef2368f8c8aafa83c8c13c90185c2e0f2fb064dc90fa57154d85561706b4d980e7fda0dc6fb5ff93951e7b0b3f0cb7a3e627a85728ec1637e632c898e52a2afea3a986eadae266edf16899c88b0b004f6bf6c8d1331d27880b26eeb0894ae9145c8978814c55e3708017ba465541755a222dab3640a36b1c90c", "63acac6365516351", 2, -440674777, "9b91b45951b298151174d187d6a562a94eea542a8e29defe8981b43623a61010"], + ["0d2f154b020f4d4870c7cc72f69d77dbb8fa25ced1086d3e906f1295feb367d11dd83c7268010000000151ffffffff5b208be11ac7407a7cd809671bc7bf22a3e83ecd38f321b238fa524fe1df489200000000036aac6a7b86c089041f72a20200000000075200006a526300b081970200000000056a53ac65530e2fad0400000000026a654c446802000000000852ac516365006300df06e2e700", "65655365525153ac", 1, -154224523, "042b62a5eb6f9c2502d268b51561904b4ae469f2a06b03ef9bc6b094ca9b4075"], + ["030000807082c4030100d85c508c575ff5377f677cb15c53193a884b1974d7ccad6abac95ba86e83ea0300000005536a635151ffffffff031a975001000000000600006a6565acf3db7b03000000000800656563656aac6a85af5d000000000007535263536a656a000000000000000000", "5152", 0, -1753285611, "decc344658ec8ae88090b0a003d3c9393d2a18c2af5a35e17cb7e8eb6f17ea42"], + ["cceb6f64028e8ebcf2f0a534722b9d0b1dd8b7eb6bec0662589a1d6bcf915f2aeeda763ef6020000000251000a0775c37f08946427ad41d071222635fd800e5b204ce026ee4ede71a964beee00524d700000000000f79e73f704b868d905000000000060fb31040000000004ac5152acd6da470500000000016a555ad903000000000351526500000000030000000000000000db2225010000000053eff9ec04ffac080e90fd2fdc62112a4aa5b480cd066eaa895053379852c6b58fb8e7b8e2da401be30a8e864517b1d823d2ebffb9a33fa051340797747da4413cfc691dbcf4a45ed3b614e1283ab709cecbb2f8e6cd8495d1562a9fddcfad8b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002cc4177f4d336314a666189c03db799112f1789092a73cd12e5e00e3b964435289769daa6cb12f2a27d9e96f586971776700b734672fd325db0bf25e3f9f1227033ff3c91bff04cad74cac819cbfc054c2b0987e3bc1377486397b54157940d6c3a246482cb325e832f8b5200a107e64072726e15ecdb25a7cb644489a283fa0021c34092edd22e277bf91a296ec8d0c942a8bb80108ccb40a49538cf5ff1847310309a8e3dd914b0fba6f726e251a200926447a270bd890cf1a0d55e26259f9da620b08523803e9338d121509c976a735af16cb4f8abec7623d507a282904727932d1ac3fb6421286ccdaf6baa3c6006524a3090bc6da6698654e81abb34a8b1d023e02034ff8bfcf13c56e94ead303923d04c2084358eb83a8df22ed4710d30f91d8de0316da9b8beb556df5bb6f88ca83f2b89cd6d4eed10bacbe73d1e32b6f1704323c0311244bb47b609b72f792e6fba8a0e94010e8bcb864b65470eabb5838c6ac303a031d7bccbfa26b602ddddce1345db24d17344f7c38f64de7914c1835d50639cea3020a3c0d8a282fa17a8444fe71b970457416097c5c2e54be42dce0ca6b03186e68c1790dcac3996da85b1a5ac7eb9cfcb997a95ce262c6df9450c0e59e8df6a0306be9c5db280de424a40ab13aa00dbadd27f2f4c0ca48c2cc1d6268bbb6dfb0e12058f0bf593c18a5c0382e1132d600cce613433147b546093d60dcc70a2aba3c6dd9a99789230ecd4895b520784e531ef73f2a665d26e65d33531dd3535497078f1a0e3f041518c30c3db2dbd5b9b82c0c83ad99de72023a51777de1692cd1f1999ed0f5afb3a7e5ffa10c94e748c4eb52053b2731dda5b7cbb4f3c5cdd109c9eb692f6e5a662d0344e15100c3c0c9c4418af74354cc370f91300bb4dc9c333d7a39e4aeaed807a5d6a9e714ab6ae89659f2b9a3d61721ca98dc989d9f19ad3eb187e7533be4c17b923b7d8def9dc402c93087af803104282ae5e765f2ef4f2052a1b039a11def7ee9b13dbfff17db1ecf7483af45efec5687183c8299a26036ff41ee87886e3db3edb70427d6ae6db1858d551455033e03504a3b93da12e2b486fb693d1b756d142c871942b7fe50bb19aec79d390e4fa190c24039a62cb6f49fc6637a4ca87afb4638cee3e024e98c38183bf89d28acc8f048f8bf0669bff15e5b96a6553948b610a7a7d507be8f594eeca83ce0284e73095f566e770692c3e9db454fad6fbcf03bb51e8e0e503d13573de578900d3521dab9624a068bbab6736a35011749338a706290d5226306f6ef13f97fc2c0ac3cab6930044756a6ca91eff118f69996978c73590d9bbccb461be8ca3c7aaa0138af1fb70ebb90849f8185a736fac4494e54c25a8ef84a599027ff62e572a8cc0e3d8dd9696a87cdddb35f2c90000848a32ba17e050c5931c4bbdc751178e9cd15db1fb306f95afd45850a984acbf101eca209cfba9c6aa31a424c1812eb23b1f2e167b319930339dd6c5731773c3be7c453a6dd3f89132b703032ed557ec7175a812ff97c2f718ada8e813928531e2aee7093e940155ded4b3b545f798d0c2ee7e95d9f02263e2062b66195f6718f9957ec292c74d4f609d95d50cd2bc551209e0771c4c64a241671cba6590a50708b07c9b3cc6e374c35f0781ed08f74664432a105ec920c351386efd284e937b189859b7b7a2a0204c70f2dfe07ec71bfe53c093af4cda4d5d07aa8cb0f31714a7ed508790039118d07dfb2df18a7e2568c7a0b7500abd9c076597c4dc2f6954ffe450eed104ad1ce3a73eebdb250aaec5f637f8ac158f9482edb972cb7309ac0343cc197f59d0b39b794c7f55be67b9e87abefd9abd0922ee3da422856fe88d1ea63c0444e5f94195fda7282e349700c4ed321fc4f0dd2dfdd9b4076a7bae42d2499330df576e1ea5b26cbac6b3873b7e66ad87aa8af035f04d8aaa4265f720d98cf8d08e8bc2f67389e255b8ea958c0f3733ef84773d8c9c12cf6f579cde3292c9ca7f8cc9f2158213df1f5672d3936d41bf39bc57fa30b3f33b757bfc24d74dec48256d22813d821fb3c5d8b1c3d9b928524eecfd40cd15f75a10b5537cbb60e05a1e748bb35af0ec14baeac34bd50f665a143397cf03a2c2ea3fbaa12fa43e31f4b8d898b896df04e533931f4d573ceb2a7fa3d4a3283ea5bb7264c63cd0417506c929d87f76f8db055438313f6068155f2693aa718e4640f7961b58d262ba5f7494ad3bd7c37f1d3b72a79b33eae8cc04ec65885907ae83c0ef0889679fcf97e68e54caef203043a893b342be604000000000000000000000000425ef32ad3f25ada191ba2be3819b75044f499a53851f1bb94b811d2adfdcbdb90bdc7f29e0b441b68ec4ff689e3011faf050c1e1255a334d4ca9d9e54846cf9f5d547d73a86f0c841fe5d7aff8287502459d6103648ed8cd7867bf9fb6a912300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d96ad5c27450bd2a87952b41f56e02d9c23e79fadfe5a77c3e23135f96788fcc812afc9b4777c34f71bfcd4b6cf1d767e501dd5d1a455d48b2d898b1418b9bcaa12c8419c384d05c9fb5d15838c62f13721a26ab99f167ad8f1c2a17fbaeae354c621282887aa2d94391976626d38008dcb245fc96b006a91412734a8096dcd0032b0c224ddcd8e117f15ec482b0ec7ef22b7a58110b03bf6a9757edae04bcf79c0210ccf9aa798fcf6968907b68fe308c5dee7cfef0720324243647a7d8f852d9c20b0819e03dbb17997eecb72e4ceb4e4eab690d3fe2c966062dc1f92691deab67ade563adfec5862166bfcdc1261ba19319fdc45b7bf91dc1f17e171224e8dc36ea031e3ff0f34fbfabcbd8c57e91bc6cc1647dcf14d824222a6f1fea6d1ac37f79f5021cde6fdb375e69af6fb5b3f5184312f9ab643c7412a5740345c2b7d4de94d59603136963c058b3a2906067f40702c57bca265dc83c61b153ebc44ba2dac2c3d98702262dc6c568d436381ea15b4978ed13910345eee12efef3887dda21e310ca032a021812567465ceabfcaf6cdc0e8fdc7783fda0762e560e62b532d659942f75f20b7fd4aaa804df881b787eb4696cc3f57ba88843c6068ffdbeb00d0bad93bc3e92fb69f2501cefb2b151029b7a10eed3e499f0b61732352722da0918a9cbb80a7f704f3543eb952ed4224d8aab187eeda3a66996002b9c4c17e6f1f38141ee6eb4865e2c86175d234e86a007ac33f99cbd2c28c7c5c88ddca9fc6da1888913923bb0ecded5af91bc8222c2e3581b5b726a0b0eeda8c4155ae9340e709e54935da8e99fe281f8404f6a1f361c521b56ea628a7bcdb11abc883111f5c8ce2b73ea9ff4e9b49822428ffaa9d8b559fb8fbbf0ec68539c95ac55273d9a2f04998efc1bc1d572201fb0d15a03f550be0ed10e4383dff802ba7d17845f1acb4c2c4410b6c55c78cb20b12805c071db09810625fb2ca4fc81e85d16b65dcd81900237e84bca883d808b39aa52962bb7aad9296a96f72de0767e80526bbec91d2423926edaa9d896d2c0b19f9ca650487ef56fd9b37821f7dbcc218ac7e1d7a114de691ee60d27b602266b0c20709e375395359394dfbedb9d2577c8a80891b9b80ad67019b67ca2bc18c93a83b3a77c18009f6df503c89909d9fdeebd3c4587029ffb727d75cebcd4899e39d851a31836d3dc4652e40f9a4e58e93b9b2e6d6386e1636d5f7b4db7ecbd749789e06c2ada53655098a0f8635f1bde5c43a7670493c067bb43fc2d996a348918db02d25651091922d2f3f32e9f9340c267b804c44b299143a4a3d6c42a1c10d542d42371d2b4503f9573c2ea1389349b53354544ca381f7d03f1b2ea6f23011ac8224858c607d1464dbe708f5b4e7b99198213ad3014bdb277326d4667881906d3e0a3b53f490f3b3f39449f1460f8432f42f4dcbc68c75b342b9d9139fea1d62dae3a152083eaaa1fdef0904a18ada0264186c56425a6e32114c80fece53f006ab103bf42df0d12b8245d0869a6c7c9bdc6689f749200e900d9647fe164b1e6cdfa053d59792272490730c11833d53e10dc359d63eeef7f4ecd9d2c2e5f4aada77a24b651314af8786fc8a778bfab0cd06d7cc5b83f24f216241635d50b30713578f6ab6b4635a1ff2c4d2dff0352342d85201dc541e521202ac76c41791efce95c804b8a2ec36ddb988c81faf416f60d37c84923a533d515c7a293c139c0efe873191a7844d7927dd36927d1821530071997598f3ff7a9eef722b8f8ecc221571b211176de3eda172c21c59896dbc1d6e60f9c9b1c1b45fcdb864cf81b124a25ec5039adb77aa53f50eb451b5ad2a9b8286ce060f55ecd3b66268a1aa42e802397c2d8558a1b32734e673cb1877364f3d10a17fe12683cbfbeb1f7ff25e764615a64ec965b0e71596031b079edc9fea98a8336318ef6dcb91587918bf30afda8c247efc1cae4b365e9ad2a71888e31548b9ddd4e5828bef869dd36fd7cec2a9f7e74c2f27f70e86307b2e99acc6babe617d9fc722a757c319ed03446b4a8af76e2c91d77de55d9834ea5244a68f880e3927a2448d318f354706645abd3ae8ec91bc749decf0b1e5c1bcfef9b9ea3292d4384ffaef762edc0236a0db86fb1492e9d3b00c39c149218ca1fad967af02ab78497cd2de1290ffb526696463123633e8c7811e09496e6733103b05315876a3a7114126f6eef79b93ca5e9b095192d886c21d5f48c07e0817ff827a0c2fff15fec90851312b99d41b4f43a18c62e6c1d8d042cf96746039404b90000000000000000bf2e5b0100000000b6fa4cec2d1660b31028e5a2b6c965b0fe1dcecb0b9810e240bef935e334458889c55a57c58ee7ec8edbb7ecd921ac468a7424d50379113fd21ea0124b1d3c7b4f397f1f824cf2e85438faf36a8b5235cf1eb2b8610e8820bac8f0f81c01e69300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000211d4ac543435b56ec6fd3a0062d78e3dcd7b9c0254f3955ff41d1147bade9a2ee07182c9b4a4ece724f46862e7b98a4a383f44ee35b3674de645450d8d83e8fc895be6ffaebe363ba815a8e1a3dc6a4f1dd48521a68a0999e84006f7bbed58774d091b077e3b10dddd9f0a541033a9c7496cb9143a1edfb9ac223d2f469a134021d2941fd88760199cedb57a6072c9372b84ed27f5432b88a09d5e4705e33335902254288747036418fa3d36d15a9f25d424cf2655904fe72c27e6d2e18d1818a260a01beb7682a197031062e8cb2e2726f16676fa21594a730109275d3be5a9d3790ca4562fc683efcf6f5b9515c47a311754717c9a0969d18866919694072bc17320215c654c641521991b7bc9f75215cbf493a257e7d537932c7b1097998b286feaa031a8de0ef54e8c1af4950f2cd79ee2e102eb4aa1d9f04b574787beaaad542c271021ccfe3ad70c2661c17070010a9c1acc268581ca1667b3debc3c206e4023e98c9022a15c47a5108610a85fe787d8018684feba6ef7345dac1bfcda2cdd885d26e3d02254b5b7b160f756ee27c8556e0c772d0b2ddac566fa5491e1ffbbffe83973d6ab9fec13524bd07d42d387b46f3bf027df18857b8927b0dcac73d157c910c219f83097abcba8a534d77536a1c343f2537880a90a3af93f45ffcf7cbe3cf6e9b681b048a9b0f8773124b0383c159dc24ddd48c25d29a6c4ec983cae24c142fefd79f2262bb2a6dae7959f3ee2e6467a4dc8e0d458f76ebc00207cce2b53ac04f16e008c524be8cc54046a5dbe3bbb80fb819e07ecec533dace6878b5257c5e8b76f9e8705e7b7be0c77544e3542b04aa492ba29ebae25d03ad7f5f75d24ef6f4104346fd3631552bf8a6aba6d43de9aeab9a31dfe254733fdba17e254121f78ce79d96ee702dbc3ec29caf677d78de3b2bf20bd7d8b54217f461fdfdae1b7aae2d04dfeb5fe76acf33dfcdda42d0f2197aeb27969a19973d6e717a5472b4d43f097c4468a037430dbe665b0037917c0e3e38904219cba7d128b324e32195ff5a259911b67670ddfb33094b790f20b62ecf87da01d8687d7c8cab3fbf22280daa2fd9cbd3a52a27944abdceeb018023bfe63d1e85dc12de95c1359acb605b9a556f91504d64912a455e07b223c9cfe3111c768ce9c362ce53a777362459c4cf4e41241c5a08b35cf119b84d15f81f4cf6df98a0e5f4739821f886f3865ca13cf299aeec67e83024378324df1bc246e543cb2556c63475ce8e9ea73f618c3c65293c1382078098d596ab3b4cad1e4009662a79e0f578a234d34f4b33c17f65d5621273bc64269d6c65016680ccfdc3f651f19317c8c756b953a8230dd9767325b441fdee76bb28c45250985ac6a0a182e8620dff13e7656c54a5de1ef528a304038711ab08bfbeeec0d91a4add523bb1b13a5565d5e303c59b6228392128db44d756827b5271eafe17884b30b513e92d951e09b92bb3c736cefeeaa878356c0d58d86097da86939cba3db1e6351534f781be76cb4110f3e38583dc5a8f023d210f24906d357b6b4961beae66e4a4c4eead16510890cea17ce2a7c9eb4a3a82ea7389a63eb956c7de3e4292ae98873ef7377c00705bed2bb1c68b67448568b2e62522d798e6dea6fc6c70096fcf2b8f6e22b7506f5f369f8628799a4dc0a3d9b69d3666102728de2bd355a1d3f933c30368335cfdeb673da93b22f52f60d5e328861dde34ae85986532347c86ff7fa60f44c54950013ac23c6b213ea6b7c487141f1b0d3140e0b56c2ffd8a9fbd19655cc27a9a892b6d3522c194730baed9535bc31dfbbe9a4ee0eff9c42363ed909f72a6778859a8edc3c06390f10a837ea7a1f3a925b2118664dd949170c8f93da1189d54cd53059b8ca39052e9a0f46027e722d353fb813f5dbcfc735510ede0dd91a2a26526e4377917f78b543bab311c7707082a1c6f19c43faa65fe07391e4e8d41c61218bc7078e3745e4f8e707c3a3b5648b15aae904df19f048794c4381f9325d93a2d4d4b2e45d2287318c519552882eb0c72f1786d4d0453b39897c2ecfb1df26724455186a13e197938b22ea3df86ab3c13de94211f20c969aca3918a14bdecb23b19cf9f3a9291be57f668c6a7d1f099487e6fe9cbc07bb9ad8ff8f911558757ada9529f73b09f9c0c0390465db8e94becdd4a5403144be1bde540abdc2157f7049a4896883726cf0f18bf9d115b4845b3b1ac9a496e2363da7752cfbc12a0bffaf0149ca6178ce83657dddc2663fb9828ddca73c6fa4a00ad866691dd025eb1514a7650cdcc32de3e2f8218cf5380e9dc2d3f2911e78e8c80b51df2330c748d8ce60f080589c92a05d5c824dd8e64319aead18075c61c33f6dd9e90f6cab11318ebd8ac50c047fc91046f8706c9ecb66df229673681a894a2df3c69e24f6e600c", "00", 1, -488271810, "90fa5f765de89f01c462e9f2c3155bbdefc633ed23c33d5befeca2c478d11fb3"], + ["d8d6d015013b424b8f6a6f5298db6eb347afaf6ef65f37e65b8068704459657bd6c6a51c9e03000000096a53636365acac6300ffffffff0115ebee010000000000fa2a84b10300000000000000008bf5f90200000000d36ad98649f883f6080068785a439e7e1036360368078b8605e1c468f1cd42dab6ead7f28639e0468ec1aee9db11cb413fd84284869887289740691ffa99ccadb17bfc98bfa75a14464b6d69095cb3c01b0feb055f941c76dccd78dbfd8c509d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c112d4ff6e939ea7eeb5b5047d838b996fa48d548b3b3fa228c82cfd1bd61dc0d400976695a885e21f2bf192271b01c6b18b2d58bcbcdf2d0ef4b30064c766cce05c33392481ba2160c7dd88e06309ceb8c9f47c60019ccd001c8c2252252823a393f93ef2bd2da1d1ef05b5169a5ae4f4ac1cdbfebe29feadbc0d47d15aed49031fed0180b11a073056078c4eef72335f3f720f107caf0af734061dac3836d7d2021d30387f3004e9c40c159c129adcb1b18cea8fa3648d0b04a42c1d1d8d32b8660a006eb7e914892d0f83c3d01ed6d9c09d8550ab0de3cbbaa1fe1b6daaf4cf6f586c5ddb4ab543c2a93009e67119741904f19f3ce7e1203b8cfd8499d9094f3c750324873004f8e2fd6f417888c5d357715fcf39a601a77948f8f522e49efe0fe15b020813ccb47ebeaf532006b96bc87912af615e54fae7cbd548010d7f0db7fdab360315112c323e248aea99cda1b26eb4d0f062b77fedde2ed420d75a859ea87a7edd030075d60dffb0072b53487888539dac402f39642a97c604484cb6039ad39a4449020c2cd7fda140291199e306b28888b267afc478dde29132c359a9de34a4d6bf8edf5329bf2d86ccbbb26c9a83cbc9b3ca40f64dc5d4b4fd96f02497a534f09e2dbca3494a56a43f1efd86a4ad0c0038a1490bc720d97732d11af8722c897b635484406ca3f2331b2cceb02d4b5cec18d693d626db15f082c83e0615a9c299b4ec8529437f0ebae0a4aa09b984c4110f46534e772bf0e8dcbaefaa807b196895bd18fa47d5f19380e8d1ca84d29c51f46da20e77acd0648ff788100215f658faa3ff2cba5beed7419264445b32d3e4bb7d46e7b7f296472687f43d6948d47484824e05f903bdad8dcc7719d4d737196ec50a62d74903c250c3e573c895d3366d7175b738cdd8d113ace42dd9117b5ea6261e54a2c8f4c4e217ea0f37fc36b5db7c481ff7aeb6c44d293e2e0bcb90f290efa8b2af048dcc324ea56c2b11061198a1874016a5f3f893f36e2c0e49699eb0a156213596078fb0aaecba85435c7c994ee9047d7fbba71309b3354c4658bc6c85a4bb82c88349e71f209df1a0a89b5365147e41ecd22d6101b59aa85ebec506c82338065cafd8b725b4ce427d53e58c9608142a73b209ce6a8fe064f7848fec0d72e7e289dc9bdc6e104c0b351ef92e5370c0913e595bbb066d9820f1381a679ee6791b424bccd370154a59e10898ae5f28fcda978bcf2953565d1206b52421b620e08eeacc427b2b083c58d090c079e6a61354cec90213e1e633b3347272bda33f4a834b08c623fbbfb097b0f9c42ac5264ec23a21f316b0f4ae1330a2bad86c7e32eb03d595cb8f0315403b73a0418bb3815c53053211c6f993006f4e4be2bdaaeeb3587e893b20f25586bb6dc064bc457c2bfe2c2e9f3ce7cf017e2cfb5aed8eb67665b8ba77b85b8a2afbbe6b4aba699cb3c6c90461610dd1c1f3e498ad49a9bffc1dd3d7d04127c6a924ba84c760f6bd5f809019f80357667b9457e5aed575fd07d6ec7e7f5e0171bef6ab7ef6fab06ff8314312365cbb63fdc123f31e7e26844a9056319be6c1480e2a2434dd04a7b311d1cdc07abb5a881ea15739dcab68fb741fc2660ea7fe99bb939c075e9749e2f8887f8bd362749c030b9f054b85809144dd5298c9e0593c1d19171b7685427444fa9962b5614362b01b0017282ddf7d0a40d88ebf848ed2dd56e030cb24a80ec222290745757a1b0689a2873f7787186088c5029dd741c8f9aa860db5573cec215f3af4474fae582058d3404941aaed11eff3acdedc341bc58d4e6b1cebe4ba8448b8e611d3195a833de2f447ccfbd6d8bbc4286332999eae2d6d72756495ae2dfaacb985bb9afb5c5a011a218343519fa30b25ebea862514aada38f78bf813d9a9106725daf256e5995612c5450c1f3a410aeaf06ff6679dbd1c41b14fb56c4898185d11a8649110330035c24d45ce3cca1a17d65b9b9a95302cfa44571bc975cd330eb9402f381dd02df0b95ff26b4d78182b66fef122b5791e180e181ada09f0e3f5461dbb62c1d0a147506fa93518a36bc939cadb8d42b035717f767992b555b75c546c9289c44bd99ced0cc90cc37894d735100c0a2d447b0939ce8e2a0dd8cdf853b5600a5563734bbb2b3ed2d501920f41291a095cb12774bd60f693a79b454d4ca2cfc8edae24cfedd7b80db136da3d2d30c958a539d36c379e93ba9a0121c32307edb823c966a4316c5064b626470a64072f842da2d6d6fe73d1c4614685b698057012be3341edd678131fb96e6a0100000000000000000000000040ab01e2b9316f3c15fb8a4f8a1f66c4c1f5fa026bffcdd944a0d12a14466264c09cec54db9b2d58f0b01a79ec09781871edbaabcec31d52481df4a910b450e1da98adc4ea86df8e4a75b6e05917eef9c9dc4c4080c0beb88f226cde9f47fd4100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c83b0e40f129057d50ab76118406707b87d891e6c58d304c24490133092e6e8b72f66465501fe9c8b18d5880bb503b1a2738d07328c5651f0902f02c748def51a306bb6ead1f79342e5ef6d364dbc78a892b9e229405cc670d772e0919ec4e7fd92ab2b971b3362ac44f62275605596098b1223c94c2ec186bb3e930415425cf02006797206ffdc3887abf4edabdacdcf09b9e8a44b216657d7e7d4417cc8779c4031a9b280b706e07fe63bdf638e6ff184af8f773240d059e1d5d9ee30e8e0c557d0a07a50f0dc95e547283c7d090854463a77d90bbf71fe95004790714e1a645977b2458fca9104a485b6ff62c661c28f3326508bcdca8a58d2013c6bbfa24465207031f6a015a18d4cb89f8a5f28d172fcbb64553c7103f439c878f14a40c81fc008203104d1ef800a7941df3a050800e24361bce2b5f91692548c038da47f4837c19b20316315a5a08eae4dd6a0d9c30d9fd12afeaf07533d8908619741f9325b160202c031cbe23c090029b5bfd09cb8d74f25700a53dbfc59759517cbf6cb71bf735ddd5021b6f6ff13bf98e96673001a10da286ffbc02576a00b695214b23c6bbe35eabb7cdf463b2813ea941bba1130f8d6a8fdad787e705047f2ff594d6795e32381e1963e2fd5746b9b7fd6ec318324c378dd3dbbdeaa76d409063af9f958b9afb3c55d86e84a0512cce648cfdfbe82a3b36456f459f03d1308bcbc9ee7b18d26b1eee300ab0c6beebf1a6e5e88737bffeea389d8b49e8c7723ed468f5a2c3b2f8890f28167015237b86d0c1a5ff568a679bca0a7b583c8782a6501aadefb9538256214a7c95a4351342bc630e68aa0ecf10cb9368bf52ca1ff0c60b75fe5bfba1979a9e94d1bf0ba200fd17a40aaaa5445505a6e7bbd3c5d1b97dd954ed1284a5c756411028dd8f0e16dd572bf54f0ee2f03f27130ecd5343e4e287523558332a2187bf1aba5275cb1a4fde773820f0b2d0c05065ebca199ac62a9a0fda5fa0071dc197fa7dd82f7678d606ba1a6378d37ed651a63594ed08e6aab82ae24b619bbe7f50afc62900211fdf25af2d7e1e6d0b92ca8869f504969b7580666f4f755ec9ed83a18f060b0f2aab607190882348baa0d1cd10d5fa3031423663b5379d5cc9aeb61257e0b40f7353f1db27eb57dd4d6d628e5719a97511af33ba9713ca4bc80ab7e0dc8e635173099bd9495c5d03a74a298d1551cd362ad8c0f1a23ebecad05dabd0d504cffb2a1cb8f76749d744490f7d7132c44d551af6c1d01bc8ebc5c845256a5727cfd7504dbd257c4f80624abb0c3c901472a56404b0a1d6180d4a55f0a55d756a4479c55d32e45140f677131cdceb7f89c9bd5efe5ca020fae05624753fc9eb64b5f3a5a0ae2d7316fef9fabadcbe2e7061f4a02a17a527217e005234a6803acdcd949f860979c4c95e438db7abbca39b4a1d3f7b352af93e82610b74d93448f8f7da83e7ab895532406dd49c2b52e823d92f44cbe1cfad4adac6c439894ba5d7e92fb693a2acca97078f2e0fb96297b9b8484080ac4f7b423708461ce0b7f1c49cbcb1ac078b2ab6c039b907762d2c06445b06d22cab003cc8792f0ad6447583a7c359e7607d165fb2910a44a2e908a024baa0c1860075edb82d2d97904bf473ad67d0602adf0fc08d4e827224b5b5d5d4c33b4b38a351bfc98fe45742f90fea87e1c96f13ce932f79748d9e6ea67d06a187d9aa5b390e7624a285fa28a48039ff65e66534e5dc76ee92ffdd380e36b01eb987c1f75c6996369ba515562def7b500b9ec34a8029c6145bd37656ccbfe7a5d58f95ab184155db0d39ab471e0315f7d8ee669343f214bbe19ba09470c16498cf55f0badd25283da5fd80fb1ffa2798533fecf72ea702058bfbe3699b630f5462d0153a4f6e4f9f42b8c50ce9631eedb8f09c1e0546d69e7994afebdd40f5a26b2f02b046944e4e2f63e2f660f6f83088f5a9bcd730583aaea7bfcc85aec0305bf4b523c223ecfe68c57ca38894af2abc037771d71e6213df1144590fbced215d5623e1614c947b0890cb9699390c005847e812c66a815e7201c53099a4818a6e4ccfcab8f8cbada8949bf36d35dadb796131cb2b0bd521e9117e04bea45944920ea5c4649c157b6293666c193d848d18a438a8e3edc4bdea61cd83ba2985dfd017eb9845f4f21e5d0d4dc4aac18be724e3e0236a9d78999fc26736101d974c9598b7ee972363ce964cdd33d148bcd4a51d5a9e37185f8edca16a65700f93c62124b452954e9c2cd797f0a8bd58013c6c9c6af70721fd5fde83cd1c4d00000000000000004c859304000000004b4a3fd418ccf3b7121dd6ac4451687d1dee133d0e8b764abeca2c3db6c2ebc8f79456f3ba357552964234b48184f1521b139ab5f87977dbec6c79899c87b4ccfb5a70db01d835342de3e9720eb7491ec3d7ad2d83e784cf4cfde4d7899f5668000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e34c070f4e17194489ea22307b5dc06613ec3b96bfa568150b766a30f7997730148efd414dde0a4f407c333491451f6f552fdb6dc5d8994ad6f9b36116e92a14aa67cfac6e0bff34b720d9808dd6767c41af03f34a49fa53ae2aaf930a890123d21362b10ebce4874ef70aa3158d81d099f6a871e0603f939aa6be36ebec023030a78b9558a198199d49a72e1da370d7c86651ea74d84195baafd11dbaac33d5302011b08f2783387c10b70612292d634c2440377a75bf57809d1860b2c652b74e80a02080eb30c83bf0ad3fec81d46667a1a4a3f9b192ab5c5def39de9f6500b95652728b6166a4267b2af022648c96917894798a51b3d1ec4c9bc0418055126cc25021efbe83333c5c143a20c5a91805e4b29abd8ee44236214fee473852e2d31a53c0227c8466403f97f1fb8de8760028378f4c354c9d7ca276d22b282ef4dd30ff4de0217fee61a86be97cc27023ee9730c52838336f03e110129c5431f6919d76f02540202c84e4a916a73ddf8e0003219ba7273d0dffe67e73324f1b787c2f82bf5359002058ac3527328487d5ae97629f4a81aeb0bdf42b890f3b08417e19f7219652c259d65d6b502e4c5f903256d62c3e067aee1696dcf5fc3fb3f543d9b847d3405616badc18077bfaee8334923ee7c80943a1f085762517781278a9b4a0b22ea18cbad4e559b8fc2c2ccecf6a0d8ec114e10fc8b3188c69b42a3a7418bc62ca02b0db69875b13991ebeff38a8f68c8eaf539d2b76d70aa9991235a2e9b1507839f5122cbf6b172180be99957add80cbd18c087666a6a997f82d4367cb77005aa5af77a850ca0bc250a2082bca35daf6be675334d2dc66a015940374842d1c7889fd5c5afeacb4217fb2957de184a904659fbab39cd3c5ea4a25ba611e08f8f060760bce51d92ba9537c0efc56f6e8d03ddf8397fb635e74c53b5d499571e60ffacc5af48e036f38d58fda697072b50919b8624e2cc929a912b4ee4dfb791a3ce11a180c4c02cbf1e99fddc484ca9b999514ecaf785d75674dfb4ff5e87a71a76b70edc7f197b1f5c1e694b4b5760962509b343b215a11ee1dca446d833fb55623ca042dc2b868dc160ba962270f3fd56472e8b11623861ef664c1545c51b06c077681a3900b86b77df68c1688ed7935c60e329c19e1f1bce092ccb1c2dde43ac06a6e8296021351c5bc4b64cc0e4aa98da4be12b08da4bc06f9d6fec99e9955368b768f4d396ebf1cf38f40faf987f99757e88e920a07cc6f5860385dbbe08072902d15b14423df4025305ec5c2602cad5ba594406aff9ec4a0da59d8aa59106671c12de1857a39f8fa94118d068b460b8543c6665a998499d31add29aff3da7b2894fb54b91cba6a28d14c14c065e3e2706dc4cec7cc1356819153dc73e88f1ea58cbe28a3458d10a8a01b1021b670c660e604a57f59199cb570e62a63f247a21d5c560af8565e9108f3c3ff8601abf8bb3806d63fa5cebe0055f18dbd094fe91b28bacf4626cebaf6247a9b2255e59f6e3984cdfd2ad72fc798c8536ae40c6b960f471c576366cf75f7dbcf966c77afba6bdafe9ef54735dd3ee5bc8abcf8cbcf658c9128624e38df805927036d2c892b9bf7fbbb4bc0a8a10641a4c272713d9b02fc5d9f4254fc8287207a155891e3dc3c37ddd327351cfbcd00d5a018cf5fe6efbe485c42eac8a7acae348e297f8b99de2fff3a6efc4a3b09f59d0f944f57433bc966708134a11c9be466b5a89d799915a3fa16fd0b504a0ac0313e44662eda2483dd3c01cbafc0d4c53b15adf4f6e07c3c29db5d17ad5c360b795406f5f362bd17f453539face985eeb318b7feb332fd98d932e518258598e9f1cea143bbad767703421681405154d633e4a99473cfb4a80bad510372de187dcabc36b376e9ea7e9adfe6706f85f8feaf3b827e4596593b7af23634ef1236578fb2735e4fbae5f0025fcc4ce0e209d21ee3f0a0b7456de2d6086197408f74ca84e054e6435a2df3ec7ace95ac46eaba8915515b76f7d79b98b0c9f34e855f2406e18cf51b3ee35a0b56de2292d47f2b2e4243a74c73bf2a027f4bdae16b88bdc603cd39f354168b36d7e5b0048c192b808c7a498dd8235db507522dfe41e5ba16b64265ae6bedb1de1465191cbef3f43e11f116fe192251c51294353c08cf9af43ca4d40d765837709313091b5a446e193f5f3601807fce9ae6439d75781b4326772c0fd7f48526ad54f7159e88bccca99af208521a0eacb37778f8e8ff6a8d6874da9f641257ec15f7741f9df2cdbb4df35b976d02bc87a3b5ae547ef4b6b173ff23e0386b80be5b1d19b3567eb6e6ec211af19eafac1fd6fcf868e8939cff02a0f49a886b26c6a54526c6828c32f3302ff6a718bcb8fe80a59b09cf6ea9a1f2c17ddd8468e827e3cb045b8fbbbe0fa2f98d40b4dd0dc03", "6a006a6552", 0, 1074475395, "1848dd19f63beffcca8cf2a249175aff234a4592ea30258fcab0691e8c387fbf"], + ["030000807082c40302a1a141b5f2d19847ce192647745fcc926b8ce6a7e05284aa5db89e70a3c1995000000000020000ffffffff2eaa776fc0f16e0fd7fd1ab7f859ff18349707bcf61ec6727d83090a082c57c2020000000865acac516300636a5355f8ba04c5edf104000000000055d92c0400000000016307afbf04000000000029c65b0100000000055300ac65acfbc6dea300000000030000000000000000a436bf0000000000a296e81c680efc10b468c46552a7803030034dab08aafb216fc2980bb7e72c0bc7009ea0223400231e6c5f4db08eb63a3023ea5109b6ad2285613f7b66199f9d296226fa00ca35226d467a014bf4b0d5c564de66836f89eb120d70ce303b927500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d64b7fe940d17198c3e6c4797657c36673cd2349f99e03b4127fa283e7afaf777267a131430c3712912c1a4e5e95624550330289bf98135fdbd254648012a5e778dc913902d44356562ae2480c9e9c629fcfa4b7acdb52ef7a62df42f8454a54f78ff52bb2a253799c1d3159e7eeb7364277339f0683bc924ade0275faf67f31022c16bb7fd3c79044bdd52759102469123661035853c879517a7b17088276981c021cea88b665a8380a1c2c03a0b9b02bdf0195e9205d0bc68dc0170d7861f488270b01858ff8cfd1662e4771e974ddeda5506734e9fad50ef382f4e843c591d9140e4c5046c67153b81b65cf2d10f4e041db2b7b65230d2c151d028b0535c62d44290305b8bf3e5a4ac8fa93a67d72d332a81e72ba5456a26db164ec916fb64f03512503267ad21b22f8ee281b397fda3956786b4455242502ed729a196b988937f3f07f021e62b10db6215398681cf521d8895b7a9a48a8e0b83b3d3507efb9be30e66216020d73e325ad0f1e0c9efbfd893b8cc31fc0bb257bc1684b38942db6861e6e93c00227a72c5f5de049b81e9ee3082731efe8b4c293f6e322bb99bbe0db93db25192c1aa257e5174ec91b17cabf4574319464436aac606a5525d75700aebe03e27a3e9f711ee58405fbd92eb4387cf18602c080c4f43d1f006a433312c9c6f2aaefe0692883bf7ea9b3575379b99b92092925a298b1bcee3686444871b4f89b3936325075df11fb103d3f5bd0b57e8a2df8a1934faae50e105f09f15b207442f9b38ad194dc8cbe89086ffb4a920c09c62b76b825f03166d1dfeb3a0c48824cd1360902f95cd9cf5a65b3ae8bf25adc367156e7b67566aa0ae4376fb6bb3e846e3585cfef2012e20e43564202c4e6e46aceec7b4143e5c641feb3f7e4779efd84645bd69f8c2c49a41ec05833bfd94331845b188b4a0bd41c66d79ea1bad9d4bfea5d26a92141e611b880833699a7b0c8d877311affa5cdce550e52fa1c8f5e553149eee395e3f303a012fb29bee4e686007d252d860805e5d03870db35f0edfeb97730a35d6c79967dd0ce893988da75f39b165029dd17d9e157c4e5e661ef3c9b85f62dfd1ec54f36f5ca7cb18afef5f5a5397f395346847310fcb428ce2cd80576059472a096321e0cc5475e2a3f819a91a41a1ce02b6de2b4c534ec76025ba9e64f2fcf124205ed38851c25f7d48a017c214f531dfd9d0f740c8526454c220b21fe9553fb856389ca84364418e3ca509305281801f7a4ace41dc0806dc2ee5b8597c90eb4337ce85fd8ae070fea13ec389a6d3c1cbc693f2a46ed71a5a51b70df912253f427c259aff8fc64cf6fcf1370202cf0464447765b59aba908c6937882c4acc202f61f63e6f8b53447ebf69fd4404edbc68e8970d641a0832714ffc14d11cc860b2cbc7f757c9386650a38bb22d79dfda086fb48de0d6cf85629ce94845b7ed54ffe66c04a539b09db045d23acd581867f29cc315edf16a9805fb160f0d1cd48401b28b2b8e510574fbb251541bb30c4ee09d48c46b3448005c3d77c90d8298d3e673c81d59dc0d10a9f072d6766c4f61a1df5cff4c6164b018616109d625e5ba4bec77c65934fafcf354eae0ccb4ccc71f556a9ac0a15b87a8224c79c7dddd92bb702b9a6a7ede20b1fcfb7ee9e71a2056d99f9f57533ff838bbc8bd4faf05bbbece36275ce80015d87707a5e8369f31f8ec76137b97fbea15586dece35eae9deeacb42e075b8c35167bb0ed602b58f5e3c19652225531e14e2e4d7b6b932930a6a3186b804f27759ad7b373f029a9f990e841de2f63fcf2b621a8f3a6fd636beed8fbd864ee693302223b21ccb3b0b1ddbc36429f9de90a21f70a1c864edeea3d3a3b16e78d393e0e563b9885c97e177f9704fac250d6f48f72a7377580ec77b7d0841454d0cb36e61f3d5c2863bc1bc355394123407cff1c515e48fff0806a0c2804873c37265d74b9e6b2159f0d073dedc30f32f9ea68415fd626b94ba5e09ccfb567d4a82928661016b820930119e44c35644033a2618644bafc88100b341711d54fe3b2750bbcbc1a411b4ab54bf59eda84f5f88fb137c05ea432414b5df2ecf3180b3e656fb9fe1648b3041be9df1701978031c2271f6a2f5606a2b0b803bddd157c5014d7d469faa4782b6020f4b39d417b23b7f9cfd520379c61edc7385232db2bf20415c4bb9751370a48289e409b08dadcdd889873f1ff47cc4a90a9ff200e6ff35704653e128972976b058d3c257454f2757992a33d625dc50079a00494ff71f9db8e17e97bfa096e1e3b29e00000000000000000000000000e9cc6af1d3553127b898df5e4f2f74a0c2008cfe818007cf759f727662bc718bf4b47bbf402ca1ecd37c256cd03712ec60e9cb174061b1d700a2789600b9b766e2a5189b49b367779a1510ff63796445e78deb7058c8ab023976462599cd6aa500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eace2101e46bffaddab8757c681f83e4723e7578462aee8d67324563d8b2d0798d256a620669dfeb49777ca442b24f63cf8d846df9e7edc51fd033e1d01f433fc54451a0da7264e08bebb00c41924dc393df7bf6f6629be75e770b0f8338c96406f2db0f1c3ee72f6b1942da0d261867b7b559e91974ef032fd80e5d86998f1a0327caf049ef3ee5d29c6306c063c841e0a1f594ee4c79aa329e7d7bfe4133ea12021cf12b9c6ddc7eb45933dcf39977e3fb7ebf0288a0417868a4d478ce40bc69a60b0628a53cf4fc32f9a6389b597bb4237cf420fc34f5884938ce9ff464bcf5cdcd66fe6e77daa59fb1b2f930174f3f0251b26cc67b2a95a8b14d96e8a0726b04a603181e5e8df529d9476a3b282504977942634b120347d59d436b4bc2af5a3b05590209efd15889c29acab3e92d6cbe21706b11d2bfda6848bb813f5f3acd57f3d1dc022413663d064f4bf19e371fa2a9527239a7d66efbd35307d9d654d41359f5c35f030d75ea22b27ccb913915eb0575f730619604d9e3b9154a9dfd255420a6bccf83032861fe2e69021872bf9b8d2c2a0516d705994da7bd303b37321adfd4027375f912dd547c065551476585b8fcb255c9a3d330fc7b20163c8ed945aa087a7d97fb06da377ed68f23555ba68222d334d591c7494c5384a9cd3d7b618469358ef39a6c3f4c323a773de888ab288792da8066c554d27567ad849a5549ad83ff5db203c3906e403f7aaf091ceb4610fbf99d1365b82a75859afb7562e42a83bf89f0aab8aecbb40009a8bcdcc54fb27edf943a330371d109c5415a7aa1db11a938a3dae67b8598f892772f913f5233944b72ee90ed5cb575da853de27afed05a0943c37d1aea7c309417092edb6169235c922364f6e9381d9bc432047ba98b299621a001cad166f666f48c2d9fa06df91242725153e6d39207e643f19cd083205e0d62632d0ae8cd4542120db0e7080e0b4553782969082ad064659a343b6ea8fb1eddfe79f68cf0a3fe1820b0a04857b32333b878c8401e8ae908651d567f88e04ac4192a3d4944020b5cf07beb7869d682585b372f251322efc342fef0e295932ad5435f66f2942409da8e2976d55b0015108934f5d4fd2a57da37f2130fcc307c2d4584020bcd1583d1b806763e0448f6d911fec43a053b03d621526aa6c623e6d37f737e85e45c768e42902a2fc49e0c098606f5901e92883b7c71aaa5c267d81c2ed5b9ca9bec44385841790af0386f4931f136826283bed5918902772b281b9b6c2149fc8b59dc822f8e6c232cbebe6f01234d0b1adac169ee8b5ed80255eb56bf85044f7183a5c127114a46d133565bfd4cc00bdc75134bf276fcae15c91c2b10107f1f0eb0099639ce077341c50a7c6cf4e7b39dcdd7e315cc5e1605ed290c2cad5ac8b4ad1ec78699ed566b146b42389b2ef88de604819483f6128aa9b70a229cd6248044ac6adac5c87f6e0bf386d151801adb5a9250cb55195ca97fd10cfbd7ebb109864cf39695a7660e466572d0b79a79278975e79a2e5278d44b774f1114ab6a859641bb260bdd388aae6dab899c592668cd8af289e76fdcd598299cb5e726198a3580d0d001e0f72abc9d622c4432da9e6cc79916204c2206afafe7e727e52d01bcb803f3fb66bc166ab3b4d0ba296185682f9edd40db7f2b0738fdf01db7f23c023aab433fa1f68cec7e3ed4fa481a0e58e484cfd87d14f5ed65364b746e66cd25f180735b0c0970fe89af310d700e020eabb994dd8ebfb928ee198c73ba0a8e4458eb7aee9dc6b7162fed00919fc52e04cb86345f88fca4de327d6692b16cd345eb325ff9b38a5b7ba6cae12b13603255912faa95996103176d8356005c396fc42f0a2f44c25390d184cb5e08b6c7e3861b8ea9870321bd311bd0e27cdb440dd5f2fa65869913984b8a51ffd924af86fab3afeca96827a5f3f796e88eb9876b1a49b5b3faa8611c45ce7e102c7e8c9ab33ed69f7f0108c7b434db205b46f3987dde2b1d033a4307c825f7b93200163544bb23d69ca8ad9a33b663944a8c0d4743a897e553c0dfcedaf9032f134eefcba95a87b9b700816e6853fefad1f4a25c53c5b3a53f2c5291c477dbbd457f9371a1f07873f1b8dedf29d3d6cc3e1b38cc478619f72aec9639346f5eec8def81ce64512eb572a808a19abd7a98868cef7bb4a7215a0a2a14b0520bcb513404fb961ab79e8233cba3df0bae4c359f8a8cf2e277b70eb45124a6c0d64d10780ba991529d174d63d86bdb7e42948e55c60a1248cee0b8b8bb8ca5721c11748d0000000000000000cca3be0100000000eae34d0685c1a524fef3e256375de1dd77e4a48afc20f9cada31405e4d569ce6e0ac362ddd66e2e1f755ea1f26962e7e9e0858d6c06326b5da6231502215dd004c85b4327e33ddcf83ae4673dbaa12a281a730cf519ef27e0f1a3ca105a9426600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cde210f5fb8ca9589826236452ce6b6be23136a3589ccd949f6b3d8590c3838b313d0fc386b00aeb81d3a3f29d4890e9721ec4494c305f6205cb16d98b775195088ab1d8cc0b8c2e3f424d8c95b10bb3b25480a2879843fde29e26f4c1038f9480c98ab76d1881fab634c114f74376b60e0b57c54fecbac563053dbfb235e7f8022076f5511ba1d953adc4620ea73bd826048cea81fd2473d8c463c7d7172d61430318f4ac2cebf3e9ef3af1166f7e1d11e943626bc6fe1016326296a1e421a7251b0b00d0b8adf9388a0b38539dd3e9487a2391250ff7eed88046fcadca25042c7c25960ac8ae552eb7c163cc09d235e8ad22b302d17b690dbfffaba9d09f73c71eba0208d6caaf29df410f5461568abd3820a141a227238d8f52316dbc781306755e94030af2ea320fa1e45fa47ff6ef3f7df2a7cf8169a993f6feb58378750cd5fc45ea021a53d1074186363a1f7cea59213393de2000983afc599922a0ceab7049b7ac7f030dc26dae136b8b906732f29b3c766df52d1f5dee79ffefb6c1fb0cbf3aee9f5d03041a3249f8381fe2e0b48032e64f4dc01573dac08add835b09d0dd0c3509ca6d7bd3251668e3afa91babc6a3a0bb888d8f51f9963963dfee5a215f3c96ee35a3e12cf5a7650d48766b2d9583e5f7cdfcd3796dcbf372d8f036da2a77c90215e05cef48e269ca638303bece8bf1474b9ec2fa5e8059e0c46a8e9930f24e1317305d97cfba7554fa1ae693bc19c6a6c0219aa888e8df1f2462a6c349df815232eec4356a74bcfb974cf1c728b00117cef398a6105cad6230c84c2e8c85ba4a267b3184d1ddf3aaf322225f0e366a45bde69344216897b95017f57907ffbbee2279d436a0221ec5f716fba23b27fb4568cf12535753b3ab708a9c6013466fc7dccfeb5e72a138c701874b72cdc86d36a0c929f735d38ea6dad4579d1417b79c6c45452b975604fcff017bc98e6733b30cd3a7d2a20e9f75d4582f163321ee53dca8661123bee5913fbe881aa77f029696045c69bcf053760ffdc06d4756570c80d2d2ab932afd5d46e7bbead0efdcebabccfc4a9dfd39be0fef7d9021e68e372c7fb6b41aa2450103144497b0f14bd1d628bfc648873339fd665c4652dc8d6aacb8a48b11e1ea6ee326f766046a389f5b54881682cf14eeecf4952fbd7392eeff1860459dc795a6a850675f4d19445018d844d94c431bba7bfa171259de2e197f4f94d7dcbe62c5c5d68fa9d99cefdf2bc6357bbbf5a8d9bc17823b92344b7686e56f250472a2b4bcd35077aef8d5538a1a0dca74e092abdae90f3a0955015f4c267ca6a89b62e29183c84c98fb547058e494dd39f4cb699a978e664a88816a891879301f4c745a96da1a31f1f7c256095de8bc2f32292b7101cfaadf646c91547b8224d84cb14ed2e4f1e7fa2a27dfc88e3c367357d24fa493ee47453a496a200624c85f082c3dbe5dc1033ab8333432854d1b85aab86ba494923d959fa4657197b70f7411c346b2d940bcf0912d7b0716ea43124e7928d682b01942b5c6873e16abd18162051700675169711ed17aabde5a6d9bbbbfb549b7c879709167932aaaa1dd2f8d3619ca0a0fc127b27cc39ac4df63b5ef2f0ad46fcaa9cfa83740942d6b344e985b238bb2b766b43e444c1a878f0b8249f27d7517c916fcf028fe58f25d6769e89c10257c194754c3375b86c0753716501bbfc8cec2845c6346802067902e8e4c01513d0ae4214333f35cd55dedccf9526e8bdd0656c17d8a237ec4a826bed52e92332aa9cac447766d410efa06182de81f9d79630d0955af0bf8e666cb48ce4d4b83670dc7bc0637887c222a177e47c27a77fb7d1573ff20ef5b86c98b39f6efa60d1eb6173f9a8fbee04b7b3eaabb0f655089c6310fbc1eae2a2c31d550c4e52ffd16709cf310f2e774d01763471c97b76778e337c1e4c24ecb2baa01d3da496e7dce2f33f6951f84c17449b87f1e9d618b3798144f2ecdd12b7d2ead7ac8f6cb6ea5cd57c582f826e689b3da8df59fd48a5a51aee3f775b27eb112c4ec9ff189324587070ae9e1337b3bde9c0e179fa6cf5c2dc1490ea0677c385166e3d7df7d45725dbd3a8002c6902855797642affc9d4df1d4031a2799f9000a35768b483eb108f899896491da14cc501c3d892ef69565c37bd1f66a46fc736ee9874ea7836b4fdccbb55ff753edaaecba45d04009e858f29e256c19d18bae1296b172ec4fb48e9870d357201e88af088183d2307e05bba5d699e42902c62c7b9c395be10a5d9042611dd21fc9ad0df0f02777bb3293fa8f513e20bf92a943431661961c488ad68d035e5d247c7d9a3c886c2a8a713e48e4f423569a1025c500118f757c38f5658adba4a1d256ca406cac694b348011eb2fc274b0a6ec92ccaab18a9fb91c29f1d836f6b8fb67236dba540f", "536552ac00656aac51", 0, 497824383, "043c65e324c6b5047adb7896cabc72d7149019574bdd02ffcd3b206e00d2bea5"], + ["030000807082c403049b56613ac60819ed873af38f6e8c6f7f4c4fbb0a56c5ec95a750c9170971a14900000000076a63516a0053652fde23e9b383119d6fe14c12bb280d84b6e28c3100ae6b9c9b978884f50e33852591b80f0300000006ac5300536353ffffffff3f47d2cb2f1769c6377ecca45c8c0f4cee99b701945af8d06db22748bc02920c030000000453635353ffffffffa6dfa4f39a984f5caf5724714ed01efa0f3176862624c301a167b688970bbe310300000000c9c54a3e037aaf76030000000004ac515353ac63b500000000000551535252aca29d55000000000006515263535265000000000000000000", "63", 2, 276197396, "1963b93df7585800979e22494f97942d6ad930118cb1471a5c4235de3d13c747"], + ["030000807082c40301eba668bcaae18b295a041effa2960e8a6700b1c420b02a4151ec1f001e96f7ce000000000700ac0000ac5265ffffffff010e67b60300000000046551ac5100000000000000000300000000000000000744570100000000c79b318e53c23c1b32c8baef1930c12117f1d815aef741d5c8e13e9bc520156354991268b4ea0630de8debe6b5d83eec1e6176b3b6df55068ff34188228d3276fcfa25f280614f7a481c469d5ff9d177956d3d3a27562f0b4b5c1481cc22a64a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000da7c20e08ccd9b01df42b478d486ac305153b790c1c2e3316b3082dc2656b56b06668a747d4bd62d19d8585f954c1ff400f938c3be475003cd7612a728918ba544ef1473fb04a21615c800f7201575fe8d0a6d55c2e5bf3fcb9f4bc4e417a048a3aedaf399527e2faa6f8beddc4571251c05dc885403db9357a2baed9ab34d6c03213d3dba3d0cd8a907edc114cf749ac2348e0bf2636cb3485bc3db92996c4ae70223bb805c3d9291ca44f5c770b47c62eb15c7d35ef4abb963cc32a1668495d7c90b072bc8b797a76b54e4c4b9b5132378061e319ca99093aefa56157b12139f7f9eb2644aa2342c5c55addcc133cb24d656ab9480dd253137b725179410d06b45f50221879d0c068af06a69b98021dc9fc9ef1d884625e32b22d7db75f65ccd8813820301e8397084832a976a59722a78a8e65156deceb845c0f87fa8b0a64892688e75030367d5c9d4f5462e3f646d85775feeb2ae0f3fc51bb7a0e857d09c33da5974bd021b896dad678dca938d96564032664833c9daa3079fbf8f8de6e561adf44f863d020884551830e7877b6c18990d7f2b197d7a4d126bd970fe6fbcd3e061921cdd92541bf97352d5bda8ae735a938148d1ea4f410d75264f990a069810310a6c96554137a5956475b44efb8524315820302f12d641f0609212b42e301f20a0bffb37714d66dbd8eaac069856a1ab35595208d9bce6b46c205df2ef67b019399ebb9a8b4d8283ad3aa6d893780813bee6c71a30d59477d0fdf28f28ad105d5121f1f0fae17897c059aebceaa99cf61ccc46984f9931328ea6ae91f24d59acecc6bd6ac26d7fbcdbd85b64d65a3b6d70b91adc355c85981566fe49f2e9ecbbab835039ff5c01a04fd012c2af3841a4d45138e891820423520179b0b4f278722593d84dea0adc76c4bdd540452df37e2c19b076907e44d60e12a8f0afca5080db278c60c802e87e49e1270d17c5c9e3826c354edd47da420e2eadd0e1a2b826f83c0c2d18c8dac805969a31d323c7c9b9b57e079478626a841ae7f9242a0b31e2431d08640a4be8c1c88dc6083372c60928c4be74daaf3e0e8f64c9ffbec99160248442ddd4d4cf6950c3c6ff16af35bbd47bb6ea4cb6238d011fe8fdf9e75a2fda47b24e0819b25eb0aa8065c4ad223cf4cc7f36b7154ee274d604ae1bd6d2ee90e426e1cb6e84b83669abb99887f93cfa06371a4f4378349cd97b60e82c4ce51d9614d947b03e6ca65f2fa8fba1cfcc5811b0617faa20f9a2f56a129df6f405f511c2cc8f35f7dbc84d060f119f80b12fb3e6f023c3de444e38c901db45b98bc3bc22c25eb67f664a7ccd012c5e9618fdc920e22eae2edc9a37e463100b8084666b7ff1a66f7c3e34680b42bdfeb314e0049d375ff4877206be377f4003d723986fafb1146ff1f90cb9f674e1b9ce2dfd958a44955826cad545753560c543c41796c6ac5506e8c0c3d30bedd9fb49b3e7a31ebd1874f1f41422f2c2b08c03b2eb6d18d179cb07fc407486721bd25b268ae11f7b098460cb6310d53834d1ea6fdd8b302f52e31ba072ec1fa62f39bfa465dab165789bff95e31b02acc08dbfd7de852ad0a79e249ce87e284806b1e9ea0f9ac09337a08f31548806ed0ff615b8c49a916b0b3f238670057dcffa4f5feaae56862d303ab4aed4d7d730770e0993d829bdd615e8c1e68c4427d4d85611afccba9c3a5f56ee05d078454c83336dcbc03577082ad8eba17d522f65dc74de15e236b033f54b32f57811bbdd6617488de8ae62c4cb91088f7f7fc5c5b5c2a0749b597d18511bf2814fc646b28c2254f289389938f47fa25f2dc5957b8dd1238fa32b234d07cf181be936deaf3b6a33b56bb9e2df52398cd0a842dd30353e724cee2e441916bde3eafb6e0f9aa864a903fc6e09a9021e3595a739510408a950f2529a2c20e238ebaabc37145b7222e250adb4c97ccbc8661b9ec15993fab8468b46b900f491f5de6ac6ac69e77834ea9e2b3bc4afd48973e6bda27c43a9d7cd0ab93ac67f14f6bc713f735bf6a790eb1ab72cb2432786026b04b41eb1c3bbdea5048a1bfeb3534cea0d2cfc6620efe8f44902da1cb606f996811e51964552ebd8f1c7e77499fe91ff38223876da704d8d2f6754d1da0443fe44ba100b56e725c2edafe2505be6fae304c8b5cb2b4033310520b3092f7d5f820f920d2c33fbaa2154894f450ab07592693b4303722c90230678b0614812ca33168b442ea11da92f336769636185fdcd5c13c3d9d869e8556958dd0fe9096ae57c5318f7a699e266d048db747e3892ef050000000000000000000000001898834f728d333ec122152fc374e4b987c5947efc86e3a8999eec1841cb5b4088042fee5d76df20b27cddbcb18cfffea57489b81e79efbba714ecf2b9adf33bc988f969bfc4c5c50afde522b4f88732adaddb49abf34807933a7410b9ef8d350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057c0a31daf5656223fcfdfaa6a790b4b5443bbfbfe3767826ea1b9757263c16843fe5fcf740a3fd15f6ff19a279bd289b3b169b534cd28d6a02d5d53a6aba0f8b568a0db54ac8273934c287ad149f2bd59c52d4cc0324468dc8b45200541230eb37aa575345b7300b317f60bcbc3a0e95f2fd30284c5c7fb5536da3a589365c3020a7fef2c2a61a190e8bab2503730c00a85e4bbd94479113dc5c23dfe178fd70b030cd59ffc7046f998e6454980d900bd54f19452c207af54b57ccc24dbd5a1de100b0052b596de3a4cde21915597e14b148f56a77a3ad27fb39869a6827762c85d7d8a3773ebf9b25b0a1db1de1115a2af8dd7941f38e502404bd22a9740e536bfe40313d9353a4f35add613cdfc728cfe7639090c9603be65a5ae2ca0f381da63f167020287145208cdeed88fd52f3f493005263c8c601ddde587be9fcb44b6c976c8c80209b5be5368f366dc4dee06a383b6f4cf0d315e664b87c9382abe1adbb9cc0deb02236298f48cfd33ebe1c47e66a4cf0f9bc274897e61b1284f5929f86153eb18590227bbef3a58ac7fcc782c0297b9c780a64c52ff9215cb6c07bca79d193a5f6c418c8d2829014a974560b399bb7543f2e8b1577351831e0740a1c2a42774c71a8c86d65f135bad5d0f05cf2ee305849b6b7957a3cfc01747231c8cde92b2bfb8046459032a5ad6b9e45c7b9ce39df5436495fd05ea165af6bb16e11c5572c22534811b985b0b3fd0e71ce14c49e98d0331ef5b806eb8c1f1609127502c80af94494c3ce397a124ab1a278f4a7c6bbc624a40ec14022a4f0ac06819df010dbf15f3ef59796097b6a7770fbdd29cc95d4c2a0fa35394b42743039a315ca3bb9efe8faba82f2505cdf14562c313cce86c1cfa3e5159b46ec58c0822fbc645ae8abbabf2337a389b6cc1e4a4b101493ca603337eab2f302161176e721183912ad45d57c1ac59e3f34d8b71a10e889dd7b4cb5c99c5eecff94af8788632a658ba788e967fdeb5b94679b56e29aa2923649c43ee61a445fff2af5cd70dba633375e53914a13a70b1ca3afd277f9da705215ea20aaddef813ae402fd38e4b6e4dbcf2f15405739405db645702fbeeee5382c4d12c908e11b29b2dcfb57138a4414dc538bd458c9a0c6c431996658ef89a4312823ac0bc7afa0be3ea57bcfc9971f825ea9eaef51823b10926ca90cfa4ce48c0b46aa9fc12bc69b21dfb3a308720ab371fed0d017b6aae97b8a240c524cbb6929f81756280be19931bd992f75d0bee05d82f159a4510ed6cf8e980830133429b4715b0ccfff558c6f679931656695e6e2def6854333e378dfb54fcaeec7bc97cc27b48e5d8b70d74a345c55c27e5341914b876e1fa2e815dc78e2d3ea47940c46dc9f91a6aefee30991dc6058c7b9620bdf06f9ba5030d6fd3787634690b827462215af83b39c75b353def76dac27d102276536be90bffda58eb61c07fffdd51a43d38679e1aa28a6f3e4345ca5e52e683d953428397980c3fb16ced4509995ebf3a0b5e5a418777ba3a99e373668f439f820b6c68c1bcd36b975b2d0b704743d582ab33292453dbb632507457e82ec47c446b7e4e75e29c7901fa0c0bf82c777694a7754671ec84fcb48d95d386fafa5db92c728f258203971f25ed3a413b0cba3a5d97142d4ea138b4389740f81584170487b8200b654f535fcd29a2f3a34d3b70981527b6aba7974652ad1677b8907008ef8f40988afcb014eaa2ad866e4c99c3a0563f8bf29d130d84f30b9a7dcb948f878d3e3d2578c9b53e4596e99cdcc0b0540f4974255751b851cad2e8c02f8d1034e5427713e5ebba0ce9419ce57788d794ccfcfb9f28c002524453cdb236c83067a5a81cba8de9f7e4ca7dd760d2e971d9eeac6c4f91daed3bd0f95a7c44004e5516bfadb8cb13976aa5b02a3131c123f9d0c15cb3feb54f8c8e617389e702a3649b11b2bc2d12c9be4fc1448ddc6175bce259bec821808291eb9b1134296d3905ed919d953910a7a21cabf5f5ded33b719090b279f24e0bde667a88e2fb27ba0af6b65b8709dc973d00b776804ed3ba15626a6a3d97bd8e7dc9e4483322ea46e663a4660fbafcc17f9e4771edb69a7b7217a89323343514c1f07c8049ce8089ca3b051f7c648c1780f30a7d0982ee2901cea2de6f32e3f2e80d42c9022bce8abc1a6b83774534bb56ca2b1d5f91c8444f4cff2fca1bb103a90a03dd63f965e778ef81366a1836c2d09f64812acc2ebca3d5dd66f980756f784f876d4dc9e8b9b3baf693e8ba41addab1367116b7a2082fe0000000000000000036de3d0500000000f5de61edc6a3a6378376a31a242d725bf4f0935a0a1eed950ba19e13edcf1b2e225b7079d239ff88928c6507b51ac993ff30a254e7a17030009602f38e3153cc963b45a1a20fe1f4adb3b64de211d398a0ed77fb840f051ccbf56f338231d18000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eddc94df3f084fadd346b6f30bd1506e8af66291c5e5b052e67962276ae12eb6281234cfe814ccf8dde31d4efa9c5401e68bebbb70f8c74b65862365283f6e52f0b9007df826034b7df50d014ea26824cee36428ff95f362ac2ffd5ae56640ee3950e393a36de2b6113f95a740a5595a4f7804c73b16534c74f0f18c43ed8da903087885e753456bf9abbd7f4286c16447417e52e1e700a75a7964fb9329bc294b022d247692ec657c3af7e81511bd983f94291d0809f2157363c8a8eea8df14534c0a062d87c00985a7b53f8536a62d09a2e56f42ad12d174bdf6d8a0623bae06fdc3d5d390e191d8c881e83d708696b45304d1ea7e4a5ce7fc545d56be86c06601490315dfa1be476dc16d0dba6d7c69c67669f41214d2148af796214d29fc6af62c120315e30618860b01e3483147b1736f400d911e440665bf2dc9e02ab51843d92b7b022d9525d79a4d868ab10f72eaa4780049c60f9a19aae2261930f15b9d3e8c2483032467b0a864e7a0a4f15a937d722fdf6bb17a74a0855229d5951cf7faff0f9dce032aa58a470809440e47a947ed448d5e99d9d81e1a7b19754260071a7d96642709eb5b41c48d7477632c531edeb72f71ad92b81cb935f95e577ae3da945ff2d0514785f0170fe9ea872321a6f331447adf0fa30d95d2dafe2919ac641c1b85ed5318e7ef9be15a57dbdda7b58367dc3b6c55f3d1c5810b4e7ae80c89b663604a5fb2a9c58ceef705fa833f55b2cbe393c25edcd69556da48b47a7047ce00d618feddbd5f357eda38cdd06f027c0452b0511272c03209118415a4aa9abc39359daaea79a33917e9275f65da6b34ff5bdc89042385526d4d5ce29b844d14189040ab45d26f4892ebcd8185431fa0a3fe5b197dee4b9f33f469dadef5671b568e15c9c7b5f64c62601fd36e275be3c57e3840a40b3399fc71285c9566578551b3d232c7a8653230e5d41d9998239f348e3c011851cd25b3340f8410c844c1ac5fedf1d25f447522add92624f75cf2d696d0efc44edfd7a6c10f5bc4fe2ada25373e513701559a9b446d340aae6b6c42bbd4c6c080747e9c0690d9fc2667dfdc9fcf0cbb33961371514d79c6d9945c17d18dfcfbf17ca4a8cfe2e39faeac312ce59c555fd7f19b7eee5e307847f850c53da63735db1351fd7900c4faa8a311b9e2657ebe4275ecd146e1881f1dbb499700a46ba1b077664c8c03ce7666de82cdf8a8e1f26993b661ba6befc7254f3c732b861fcd229fa1703b84814cbb590aec95fe745984ed54b1413982eacedb010a69de50489e48260f26fd7c65319cd1eb3cd430985835080596e71820466e171410cc290d7b929626704ad4eaa652c9a14971f36cd2821d0509d8e47f52a9da526f9fdca999f6a3349e72015893856df524d6eb250ddbc287f48b7f2935987c763e16e01df5d50748640e77ec1d26c6f45ec24234924efb6b51f947315246c0773cceb69cb79472318e04c99ed05e82f2eee90f9c743513f874686c0646adff18857336cc71aab2aae6ec5ce9d580a6f0d144003661855686e8322fe42e657b567a378047b031b84c57b55204c99499f4b9047db326bfc40930b71acfa411dc24cba06a060ca23562903b017db7f185ae3c3babf26f115f71400b680e8d5cd4afc51e9bb01ec7cf7db685fd0469ec0c943916c1c3c4bcf3ebdef26540c510689256dd8f2cd532cc4e561306005712565af9c98839f4fd309663ee705dc85670bcbe8cc89ad0e47fb873b6a60be859d27e18e49a0984daa6a128776b4662b6bd1acb2ed01371b13afb846b33b1b69d692250f12340629582b0677f0e94be6dc90bb57c4b9aae0759f2e3f157f7e7e70ae8e7ee2d811677ce2b754dab6f91ce9c7b4e50c8db6e4866960b6f09a0dda4fffe10145191bcbc9b672924f88cd6352547f0b86659b0276c0400c6af9c4e13c87d5fbd0690a228e69e6e8d9e3473b68b8e7429012a13067b605c20876e72f5239281b1bb121d42a9b48f4561206c0fafaa0bf1d77d81b72a3ba5b81e31ddfa0c45a876359c68e9140f446d31d2640a457959895e3216915cfcd35a32ebfaecd050da0bfc4adfe172cbd719e21aa0a98ba39f5629c6e1fc518bb304b0c51cec9f14976e56559c83cfdc1251edd53c7b7b773ef5e407f6a6d3d6b075b6743c8dc8f0e57d350f6102c1a57074a27debdc270dc76462dd0e296a9d7452dda8fad1d5971645250cf8d4944baa91b47491c49391f92d6078f4be884e384de29495af0b4321f024c822db6435f2d396c9b5bc2e37ae183039042aaf21c8586ccbb5e5736dcb0fddecc29f1e5955a30e02e967051b8bc021ecf5c67f6ad0a42f5da996691e481fd9acc366f7e9684dd3eea9883fd11eabf51ff0756feb8a2e11010e309d654f5fead0ee5e88df7f07c7271dad2bd3aad1dcc80c", "63006a00", 0, -1792234059, "8d9e1cefd2192d3a712e13a9880617a0951d69d39d85ddf34b87649aabccd397"], + ["716a533204f3cc913f49028b0e0da132c736004c982fa3c903aead50ab925928b4c468e4530200000005656363006362abf49e325fdfdbaae517b6ebed18d2f7d9b2243f00463995400b8cf8b6f09c92f2f77a020000000552536a5265ffffffff2002de98e318d15ac44f4e92697641e8cc12c857d5cdc4e98093e6380366ea5300000000010013640e550a786b3cab30b9e7724efa58ac455ab707f92629b0e600be860e99489c63f6c503000000090052ac63ac516300005598f86a0285cbca0200000000096553635151525363acb15a5a010000000007005100526363ac000000000200000000000000001645310000000000296fe2294a817ecd1b10cb520daa871cbf3de6d91e9652cb5697ead3c28df3e7f0c7b456500aebcd8854292db477e3ba33aabb8c48a2099165d6b942f29f94ea426d28655cc050c9ea24b1226da1578e53801f1ea1c2069bb0592dd29cf130fe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000da1b06141106e9a504b2a37428dc4760cc7e7f3f404fe97be74feb2ca0f9e9d09bbd12cc1d8440bfaa9c021fd0f7d0838b05801aea74d3a69a01e00e2d88109d7d8ced90e9c271e7eaa23388a8f36d7da7d5c9b7ba0a955835975496826a63c4effcbd7042dac7889b467a68ca7c3896dbcb97662c35549dc24e70f2433659de021f660d209c32f9c8bd3b222c32d121d7f473376d3fc8203ffd80536bb3632be2031390c847b58391290a58ba6303c675ed355e5479c38366bb6f424783b20343070a05ac8d573decac2ba6ec89f993ac1e0793d17b52dfb3c9c43965d321836da5660a0f7ef8b677b34b90f6f7a8aec0ca420e3b6159569940e242f6024a5f27775d0220b5175581f5fa12a83c69ff8fe274e09830ecdae29bb0f3ae8337c988fcae56031a42e78e9cdd8deea46e86dc19f12e71523a5a3eedf506a343b69b5d04cafceb03293e63ea1b6a941523da797dcbfcf7ffbff021fdcbcc3ca687e0546b6a10ce090316d7a51232228246237603f76564ff6a84a5b61219224f7c79208331478b716e031154e9187dfe11d995c0d92e674c713ad2424d04dffaaf06570b6aacdbe92fcece06e75e109ab1a365786af16f1e47bbceb7a59e4b0ca1e9610bf83a97023dfcc77e035a0f44980fc52eac3270b8875d06f41a25a3698584ba11db22dc07f0ab283472c8afc3d187dc61236f767c98355a3e5c28f2d0affd85fc53c051fd41f6b8d1f3facc4b794a9b79a9f853e38e66294251f187de4705d46dba4ad3a9df1891f22c3bbb9a5e66e7efbbf12f3782443acd4e1dabaadae46b7a168ec185275b504a965bf6e1f9a54fb0a9e3390971690a2a4c3aa6e5079449cbdabe82589573bbdc0ea7fd83c6dfe1bae85bb7e627aa9b972295bdd06439b1c7810eda4efa27edb41f538fd7f70dbe5383594e8a6021b87c43f8ab4a2a4bc929c30c18e24024e1723edfd76c87fa8e0550781c4801d4736c9ca7a914ad75cf37d497611d2f3efdac337794df25a0f3dd692198d19f069d5a4f13ba8ae9c3ab250d50439211e0dd5f14065e4ab4c4159cfd29f2637ef1477e975cc0bd8f396c32a55b20ec4bdc3033a92162385c0073d4154ca56dae413b8462c841ccb489ddb8d0c1776b9781f2638431fa944352b47f1160f3d45b3f918a6920b1ac6b62856fddb5df70380d35a34cd6fe5351c1a76fb491b42217d5d242398749397cb917f9b338c3321545dbe90f46ec73530cdc66db0df4ceb17a3efbff35a720ceb1c9de0329fa6cd990c00c161d69700888620a8659a546745b731146c5cfd18fe2bf8f1ef1145e112482de862f0a089199f02ee97fa404ca354a20f2cef6f96a0d5c488a9507b6ea8701c45a08a4318da3a173025af78b5e432bb2d49390771b6124e52f10ecb2295fa588f0578453c57f6556d2710ff6bb8c4c4a31a3dbdbc71e5e6716f1cfa3c51dd2b5c91bf2759b20dab6b532a7ad89c6680c1027fd605fb16fd0865f6390b89c7b4dd8bf7c38039d13f32ad4be8a4b67ee7577ccb184f18ace811368211ded3760e6438df49e230ab02c4231a0de7cd34d09b2f7b6564a6a78385958de8b10b0b3385eb72c9cc315a828e6cf6948dbda0c8e407b4b6126a47417034bb119bbc30d6a44c26fb910da6394f52110803af6df524eaa91196ffc0f14533d2534ea06a443acb313fc34a2f7914691b7d817fdaca0dac8237f24f9adde067a5dab7b8d833169a9b7b7652b662c465d766c9c7c4b4ee04114b1464379d9ff3ef7d56fef913094af6bfe85467c6be087307569a7c693331396279d41a04558c36e7e9e7e6c5b2084a4ea82477b3dddbe5d8c83b4e5b056239e06a86e824c31d02c4eeba59abb732df26ad6c6a0742eec59219520cf5976cb8c2bade8647b8d8b16eb1d4ae450bf477405fec5dc9f16fb3cfdd981fa4288b356dc14e83bcbb21171a80ea9227c884a48eb7ee4ce1b57791c19627cf394ebb652bac4c8c7099e5899ed2eab3cc415c1d0389f13253101dc2c9b4b743770b32691415563bc39f120f627d9fffe29b0407b83318677e97e21d90ee12b7a112cb91e8f66ee0be5993c4fdb21bd84437606700c9a4f253cefcc0d61657d19c5d5720bedb00dde00f23222289551b060e593d50b92dc9a90c29d5567242be088680480302dc03e1d0fd487b3e9e75bcd51658cddaf3622b168c2763abac8f898300dfe9abc916da42113152eff5071db728c117c66665b3473b8fef3c9d9cd37388537479c1c203e39f0a1bd67ed2b26912057a25e49f2e38fcc768d142199010000000000000000e14a3d0500000000b52a489eb0068eb0cedfc51728f7fb71196928796b93429fe61cb4bf3a95186c49748c54b230a68aa820afe25d18c4a4fefd63d3439bca530649eb46057f684325a543552c10e7d6494c5de63850791cf50f5d612f66010b79fed95aa1c1e9fb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021da5d6ffc4c818bb6dae7f445f1fcc33cd322cd2393af3feaec02d9b53d325bcf47853744a59e089d47f7e443bdac95ddbc3501c3c9b9555c6cf71b2147c2d2e6c9506a8d93d00264cca8f5f87557cc2b666e75cc72236abbcb0a321373375cb55293c410913c990ec89ca4677b845090a4424eed68c39922dd5d3bf632ead80217265452538d5b0a04d6c95f3c19379d3c3a088f51a73c0d30900967e80e055a020c1aae368663d9217335896cf458bfa94413a79f90854031e04c7eb1d93803930a075dab0f3912821060fa540f2cdf4e49be0066402bda247d15ff9083d83ec3210b342075147379df2429fe021c70d184b055273e7e52b4500ea8e3c98d33ae840314c189fb4d00d943d1873d3540b03aecad1855120f4069a9337e8ff0b7d095ce0215c97dce19275ee7edb66a9121ce3cca3e2c0dcf6d52350ee9edddff00e03629030e539ec71581b26614a0f8f4fc0089489b43b215bf568f1c496bc441b331c2f7032d76f017c62d972956dc28c7bed9deded853cdbaacfedc8470e3d34d66f436d50301905a8ab31429c6fb8019458039aa67fbbac3593b1d36d7592cd46033cdfdd7da192e4116133d0d746f2447dfe6b15e88153f378c9c370a7ac3e9ecd641498a9f6adf35d1963d6c155472a98135f2f13440c0b7a3d0316f812a65b9f68ccc9a2e4b1dd9681fe0568d06c91b77b81002b9cf8c0cd364bd17d51949b0bbbdcc617bf51bd239088fa6267b2afb5588fe2f225277db1a7b24d44f3e10df39e4d2ce3f5e2b24e9638ca911af257587924471676ba3b624d26490b03d3b482248e203e53fb257bf8aae77bbaeb6487c2a428e47238a07e13f9262d9acd10cebc94f87418a7c7fc631fa859d588c907c945c86a2c25528c8a136fe19a400ea001c253a944947f8ddd8b074dd843c3faa0ef089573239bdc418e010707d4e7962f5d8f634297f31a904d55b163f42121190b3dfba74af324868877b1acec76ab7780904909f57a1fb371f97349b2d0638a7af27167d5cfb36748c5eb93aef57346f910350dd211df0d375b690c27461d2a9ce5fbc0988b636e3f881b68f55e0d93ea142ff921a2565003052d3b4a0b340194b97b6c600bc0b3ba36e18b6c0e1735adcf76abdad87fc57e50f9ad04fe00db728c187179179d3f41c595ba275f6bafecc84f8039f4271866d6f5cb02c9bf00306cbf7aa0dde86e0a0e91a855e6a2e47ed0b5614b115267258d940058cbd6fb27e9aa5d850acd47a8018fad08e60cdb706031b6a77a2fb5dc0971a3e6c69e048e3bc88686de28d4eef62b17cceb16ec8887ad5e686270dfcd3b6e2a0bee0a744b4ce291fdfb6672c811931a06916e68c7371ee7d420fc36057c3adce6487d13213f27463e210402c13bbb9995fe31312b7845338e1db3e29899c7e0f56e0c9f4e072f5e2f8197fcc4c788fe3918071d389f54f66b1ff7f785d44c7fb2652558512b4fc9eaa676174ec356ba37d27bbcd5475ab49793e79b66ff6f28953ffbb85849eb2907d95f35d69d300ba1a5c48d3c328dc4f56459a4cbb293912e8397f801fae5e1b8456265647a9ac761a7825c4ea4636580ea52ac72abbc74dd2c73c4bd09458aca4fc5a542b88af93cc33f5aefabc97c8baeb33a06265e2f224754876458cc1ddd803ecae6d2dc8c62ebf888b36cefa9ed04348800d3efbba9c995095bc1b794b8b9e9867f1c027cf7c6172e7a62083c7db946eacf89b5788bf6ba9d4c00d750d92259a345f5d16298e27a22ccf7201e8a900f277013663ba9924efb26e95eaf5e0cba17f87e1500d1678bb2053a1a84fa2ea35ab4b5ffa731c2be6b4271d67d5e59fb68c8ff33c24362c1dd84f120740a929a079a13cb9daf2bc8b09f139325f92c12b8eb3cf4ad1930b9dd85c682cc412beef468fa8f5ace47d1c370e93a9c6331b1d709d7429883632d994a94a7b530bff15dff4ac8c7cda5c311c004f366997ae1a506661a5eb497d349edf58f55d901e994e172c76e153049577da4b67f3171f18418f6378bebe1957c6cb09bab2f82b82f9b631455321d57c1a25d484a4358dcddca28742cc3c91c6b72009db62d8566a8d605678c7e3506848784b82e85ffb1be42d2ae0c7add58524a6e5a6547dca1a9f826456ca43414ad968166292d34ae59f5147c35c4dfd85dba7ff417d6b585cc7622eccae4872a68d5b4238aa04c2599a237d9499f8492ef37873890978565f90de235d707efb214e02b233d097e8e060c80bb027233c623b9ae69709d2513baf5139483e6e6b170ad843a503b322fa83dd9bd0e3ac61a8be73be5223a170f32a52d33ef1d050fe46849fde0fb141e4af0a4a5155ca7d1a7531597afd2ed5932e07709775f628b57124261ab1098f57e8511e9ad9841df7bf92746dea4da2682b86544eddf016c24cf1109a00", "535200520000ac5263", 1, 885617380, "d95bd12608b9dc8dea40ffef9868f186afca0acf893a39333a01dec96e1aaa5e"], + ["94b5f256012de3eec80dd1456848e1ee2d5613abed14a8ff5e93b10bd8f9db289ece19d3f60100000007ac63ac6a00536ad928b7b703021458050000000009535152006a52acac53a8e549050000000007526a0053635151a5b4830500000000015300000000020000000000000000ba09a50000000000491d5653d744826513066389279f772fce4a119a5bd1c78a32aea92d50a27598118f77d2170fac8de0789ada5ce207d9d865fe04f72c3ba219233fb1c9cfb9bdfb023c9e38ca4764c9fb26c08e70f9ae244f0317fcd691f9131fca448e3a765600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c7a83f9efce7efbda1ed0e94f244ee0a2cc140223a22629136606ea9e401116e026354b8c2ed1197486780029aabcc4b03456c262aef6e85e4ddef30360c7b6a68cd00f4602d087871c890574128c8c8135279da5ba7b4dfe02a76d51ce6a9c0648c4dea3ed937653e420ec4c14ed438127fa61f5a5a4480486fbc96461d19ea0312d13cd52d591586c83b1e517ed2a895e5c50f1729bf3521d4c9a000a2a3366503154ef5644ad820d8ab203414dd98ce508b4fb3d987676555a00defd08414b7dd0a02cc0d97934fb8d57f3efe38845441832c1de99f41e3bbe54e22a99f67cf9756e76f461db9411d494efe6bc8b4d6cda4c9ad0aa8fb037c7d0d3a055c9c4aee12021f3705d63a73ac692d915828115973315b6e72b0e196c44d6d1a4f0129e971fe03089ff69f2c83ac6b832fef420e891023b4e8e600d5f73a2d969c6d61c136050102261c1f5d5b49a2f49bf34f0b095bd30ec40e28146850f7bfd15725e9a23bd36102049318a07468c1b240a22c084123dca5028e3b3c08a1eb868b332035c8953c43031d86d1800d49869bba7a81199caffaf096baa00b02ff67914ed3ee00c48a86204bac80b41e5cb4c07f2cef3d6deb00f464e04ee4aeba65aacbbcc32a0230c2072a56f7c368bac4c8e76a823550ecdc0c27e1e74ce102ac441ebd354c5f20e5121bc86b06687e97edb81835a31293b83a49f704105422714946a1d80d844c301c50b718535d1891de93909e0bbde1a07c1aeeabe65dce3edbbc5285b066a791e42a588cbacf8e66c67efda0117dd2d7815009376b91ea87323c10cccde900cbb7d92563fbfdc9342ebc2a549c1ad72038a91234bf3bcc4b68f1063102a95f22f95ef77f46cf0846200ac6435ab8f75a19c0da8d87663e98420a0842223d22aceddac961ce57be747c845a57361dbc75a4485cca2ad0e82c7650e1db907127eb00a5b22dc4765d071f4dc23035eab870aa207365a40dc3b8377104c0877ba40e1d764db3ca9eb75af027358880d78cbb6bb5a6a65fe15af435641888b3c3f08d0f2453b14c552d9109e42cfe83918f351079303490e9d991ba24e70bc4049667995c8c5f09a3ed6ae5ae99fde4b1099945e35b4660deeb839a0f0150929057d9b71027df61305f594445e037e7d94fd281738b830c1e44232ff53bff3e7a88350f6ff458ceab08aa10482cc845fededc74011bfa13a36ed6b2cc0cc6f6e704ca102dfdc832081337e95b161309ff50a2655a0882d67324caba065c35a8e0708698611112de99f786d20a2ee0b2340fda68b1926be0db051be8db3ac65e3a8f2d448262f1c3b4ba638bf9a5e79e7db960a6a3c73a4b89e1d532b553f240876b678eea3c9440e41fc86f1a7794f1bff7d22f44cab16dc0eef9eb0325be1c0b5f007a20951e2896e8d17824ab384ecd6c041bd158c4152bd1542156bd1d0e3858780ae031264cb3bcd2d34a9276077012ff62f219e539e0da37b298791bf267ddf744a61221d76f03f16fe2361b2ff6fb7318d87029f5755f79efeb6ee2b84dfc0b53493369e7c43116657ff27b1e206ef60ad0bb61a624ead07cb1be2c73afbc3e4b406d4a278b6517ce397eb26b622e81e6f006c798a0affe349c51bcf6cf5d7fc64df0943e83c886197761c757cf5839739b3da6535aee761514a52fafa3d9d2eeed15cedd24d004da15a8120ec8677600caab4d6e73f4ac309430772450d3d50f7ddd4e738c759617488e4dd21e8f6d1f293c90c58ba21b5ad44550cdff07af399cd0f1c84bc5f43c62218d5c7c83fc4337f36260d32171f2cee456f73fdb34fb85b4897edb8aa01f242fee508724e3acd711a78ba57e9d7f3d9eb1d835fdff1795cd099ef1b313691f5ca27a174aadafc310efc28fe8adac9f1491d8e130695d1a3c3a978dd34bdfeece3d7b596da091ad4fb0961afdfced6525ea91554187faf63768f8d0260532d4de4326568e6ed85b9218c928a94cf56325e47525d473f5b3bd31e5eeb60521767fd904c47cbd8763c31e14f8fcfe777f3ff82e3dfa11f18d223029dca17734a48f309d5f39dac50efd4167722bb557c780f465cbdcfe5f375a37486b415cf59e3800660b25f7a52f7d1c441eeeca9f4112647700b89e0c9e7cf9917fb5d6ebf791b5050a4d96a9d02741cf2315cc39192843f773f6a68c1a0e25e71b3796bfbc8581307a19e7be7955b1779c0327d40eb2c4758dbf9aa36a85260dbe2a5219fb1cb2bc1727ba1a69f7ee4c7368d9025fa31880607fbcafc750c29e59ed0e4d8436969190c7c48d6d241ef642030000000000000000000000002b33c7ce356a3873d1f024cd4557b0d9d75af28a064470fd27ae22c95a5002563bcb987044b7f23e22b7f47d0289d767fae8a6d6dd2be9391a8a224d17360ae6fbc00dcfd5d7d07c7163ecbdac9fefed3b8fd79d89c7a1133e0530889282df0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000955666f109460392075dffc5a0af36d9de04031f5650832d46e4d0f50af5d5f3e3c57744472c4431533e27817e4ad13b327ce5391444dad0b9d8957d30844ba4784d64ed7dc55118c4cba2c56c921aac6486ef816f85a25970e43253a4043f5fa2918078f13b9394b505df59147ddc5463d018de26452de58f80aea55807186f020b43cfc4c1c8d9c05986d4fdffac74461c7e23fa07cfddf2b0c59d5c96cf68b2032bf4b43c454df5054825624a77910c9b70fdee807d7251835f594ad4445841d40b01c698783638e33a445c05a6c74a537930c0552a7941a4155190a475d7dc44b1d7a7ab8a1bb0d6bd276aaeb2f19dfc67c718d387eb553415113406073ce6bc820202d15a6cce847fff467fba52923bdcf29deb913d610d21d8bdc20f3718b1e26a022ae1d88e665854cd91858867c73f3ce1ccbd81e979a8d755c67e4f82acb978bd022a6d21aec47fda33b2402278ec0325fd3d071f47c9d1b653b95d2fc19a4d23670207084045e8499f86aaac59bbd7a3b4d8e8f7acb1823ff15cd1ffc1589ef4da7a022b5c4d8929f5dd986dcb6166eb769d80cafeddbf31d33e204b9359218b8055a920cf906c718a6225f439a19d26b26ecd4a82336179b88185e7a8772e1b48510906a5ed65c280f62e8d17db44d3bd084a8798b6b9eec3bf80355a812d3f41bf8da91f8c4e6dc204bc7baa35aeae3cba4965d55675c27cb877fefd5352b06d30241212b4d7830f67d23cd562c6f3b5b949d30e957735eb5bf1491e49b6e82c74a75874c75501ae1cb080d3c7d867f7afce1acc23e01a28beadaab01137e72508217e53fb55faf20a6037e077d9da6dcd6a62d33fadbc9a794ea2dbbed2695d50364dd41878a3ce83f2e37033eb55d719b541c2b3ce81b596dcb9c813ac05b1a724c0c022621246d006dc7ce4fd0420701275975ca7eb374f8828b4b6a01add4920a232fe40db8c4bdb786217a5d6cc532f55d19b435e796f089c5b19c14c00aa934e27e4f01e398db3a6cfa3d535d15d25d87532b63163dbd6cf520acbe00f5507e9cd93ead98b3dc59fcef1984d8252a6b1b88f2a83a5364e8e4c07e0d6d3e9db50b2189733c59c8373994030799416a63acf6ee1c8dd73397456cc0fba32f020e829c7c2559f1153273baba80e8bada4683cc72d3697392b46e3121cc242ba6e5f768da2b14ee73322459152337f3a132e2ea99fbe224650ba487a25f38922f5414223da0a4a315492778989f3c22339797c7af507623221dc8ae03f5b5b488c301fc177af41146b321c3692c1e2c0d1ac7a1b2ec2b0307c09f3a8955e0ca88e7a1c0e20f0fd3784a228a204fc3146668c7823dade0737915fb3295314df8bdda0b225c47d4fd002fc6b83b050685c8fafd6f974a74ac1aa3030a5f35bc7d463efe73d29ef26ae76e07dcf4a52a9b16af0af08b7f885d5984643c52b341eff654aa746bb00d8bb92b7dedc010427b373120dfb2fcf01592c4b21ccdbdebca8188de3decb3227213c915d698b4e66ce75d71e615a4c512eab2d8827a161c38dc432af1fde7677469051c6c7373a59982f71dabf2cfa977be5fb01ff4ade8b636cdf2aa2c82c4c30b8b3c1aa0221e96fc2a8b66ffd4ea23cf7e3a36779ac2b730a0f71a119fd407fd8c8938460f27ddc058e462ac00266d6669e9b5ec7f66150f4093f72b25578f585e5cb8c63c27d7140790d900903a19a4820bcd690b08318e6086923203d6f55f778bc3071f8b1c69b026a22ae29bebb1c2477cb10ea065413f326f4fdf2af684089cb1cff2b79710fc3cdf8880e05d0244778511517c1d97e1f4731ee0b58e927a97c5c15bdb40d56a8597550c8ba250a491effcd6a180eb94db64ffece17aa851c376696c152d692df9205e2be9c9472fdaafaeccb0f3fede3bbc5b864ccf2cc6f8cbb7ec8ac71dfee271c09cd3ee69cf7cd577ab5f3f0db024f0533ba9df692f19cb8a8816811e5226d14b00f6ecffbcc2634dc2bedc2ff3fec3443750e70ec05c861ce5b3bd8b87f74b7a67691686df62ee11cde7557417151295df7d51f12712dd9018fdea3180c516b8088c1d80b596ac94e466a94f2cf22dd7a293a26a81d03077700cbcd64bfe470710344681550beb8fa24556f120f7ff1009c7e8165ae59539e4836e9240fa83d704d3e0269a19196c3621edecdb2d94fa25219e1d49ffe3c5b7ae867f862d8d1008d8a3f73f3be134e0957cbeb1e0167df91587f6a465dd84e3ea09c81fa8952a262cfe60fa6e339269f7a2567629ac6fe0d97bb6c44d0fadc358d4cde5d310fd1bc4320864832edf7c9bffcf22da32e0a75c5285e4b261de709e301b31505244897f1852487c9e1cc34229edeba38a6b04d61cb6f0226c96dc827062d42aafa84de46d12241a28229900c4bea2d128fa66a7b4f7f3fd6469933744eefc90f", "", 0, -456665322, "00edb2a8e64b4ed8faa90b2da5c863614835efa320d96ca7f97c42b54a6d944e"], + ["3719460e031fd671469d2235e364112d940528fc8860d954c95bd073ea7e821ae0f8fb074202000000026a6511ab59aa0a7aeafa6399adf58333dbfb93cb46b4380ad15c415ab4f4586500f5fde18ef9020000000763656563516551ffffffffd9f4a6de6e096899bbae029a84e5747b9dc7673fce6a17e6f821a6f19d7e92860100000007ac656365515265940c207f02ef29c7020000000003536a656a49e40300000000075253526a6500533e2bdb31038adf9204000000000000000000000000afef04d6e6ebd6ff8aa309f5efe57e8220773a1a24347c7766961bba4ce5f53ea16e417b7d645b5e217c9466856bf5ac172782d823d6733459363762ad040e12e6218b1e9d7480d9868d5d0e13ad9c505ef792e39e24073c0008ee8c4ce2420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd1c71468bad00e9d06fac01966f135a5d442ed401ad1c040adcc5a21f9cc0b24d2d9d6ae9c4c3cf1af17f975e7c8f12028d1b7b8677134f24dc65ad2febe5dd827506be6f24548cb816e9f5272d3f1fa7c9efa268a62078d17894657ebe45cb89ab42aab69942c1f2584e38707ddac6e138b9624000621e56c73158a1102e81022ca0e99763b2d0743481d3ad7bb5ad9f390693f5f54028cfe65598e97b3e99e7031233c30e5e43b7db370ce189d0e818a38e9536fbac6e1933deb548537f4fb7170a0191a85760b4d6d1c80a7d73747697cc169e60ee09ce6e76955f9897c68e05dcf9977ef4dea815cacd4a1e273a0287966b0bb88375f4f058b27166920a7c0f470313641b87d81baa2c55ab4a80f6b5fa575509b2d20e91cd911811a0a2633595f2032345f908e59fcd5688d8d08ecee0303917bf8bcb54db0c620b6a5a58cc2abae903130bab939d72705eb6626b6d1e91fe17f58f1581b85042b37cabfc2948e796820300ba04a5c00d187301e1b82a849a3c4c3e489131d31993ae5886a22623c42850031caf8526aa8d124437dde41445d90100da17ca98b41f17f67b712897864063d965f466620d6d7b29b4da40341118f3c0fd13f2c85025e5e8408f87bacc9e6a4cde18e3301228cae03d88f61b38526f4ac1f2407c5d0a68fe43c0abf2b171e91af99e789ef7b112a9fad3d90370d38cb922f2d372750d695945c8f14744283c27ba28c3603784094b441d2307a0c92efb24a5a4ceb4517281e1e72b06ee6ba8e815fbd6a47076942fa8c759c4fea6be87a5a3afd81b2f0b004852fe31a4e6f504ef84d899e3b0afe4a6ca6e6d93db86d8b6ae83bc7ac12f085b5378123ef579da3158387d8bd00687c7e1ccf567172cbfe7a3e1f191abb422300bb57d7e3302285170eab19ab6d953c61f4dc61cc29b58b36ae846ebdb7655129e7ef8994720adc3445b349387e2fa310aef5a419dbe306a5b5a3bffbf331e608a3088f62b5893a497a9959240272e09a61da195e97bcdd0ba730a0583800562f74c6be2cfa57fc09c841ddd08d99434a30821944a2eb0b861f82f2ae5771e146587a4f69aaec5b1ee1d5411577401dabe9bed98d293bc19986049b59c807d638590ad4b0e711c1da2017b841de623b0f9e942e111472766f7f020eb3176a97552ab2c855333f4c721925a760b2de9725ddc249942a02a8ca9075cea3f9837469835b81fadf4b481b03fae1bbf3f242d98d4c35ca009049776df0f4b52f9150163dfc92c5dfd1394c7501e5c82646b222d35c17426225bab377934ff4a1b0fa709590aaf6debde8808b2e36cc01cd53e0ec497769267903ecb418f11dd3dcbc8bc88d2479de8ee783a764c3a4eff181c05bf012d587de6f582c2be835237057fba6b94bc7779516d67d4f8aa8bc72d3189b6978b3d0085b58895c882a3d1a6f8962c410cfcff67ae8cdf454dc19da71476b63cdf9319504ae21cdcce232c547f3a818ae30a4a8d4b101ad5cf892b9d46f52870acb3ec969907faebc06234a12f7131379a5a0f8d16c336bd5328c63972c3740a4c71c3901a0f16310b3dccedc1f8680d918c0210fb55f901e7388706a133e14e76984946ef0046de4e061453ec2eef4da1e7ad3289c6827afb670704af461b50d452082f53bb0bbc2f972a5d731cca63f0f5cf602763ccd5ea4ae8a2d4081504a97348d89fd4f58561209a8f72493f3e77b92ab5cb7efb736f10817942325fc809dced1e831890744b801acd17ec710d3be351984220ae522b7ef2476f33df0db31a138fbd80f872e4bf8ea70e099d392f001b89ef429ceeefeb2bcf80bbaf6cbf3e421cb70c5523c087a5c0dc093fc33f9c922359bad79ab535f681735289edda2cc30055ad0dd0dc349b3cc5c223e5a9778b4df1eefcc894550ce25ebfb7e64202910d6af9fb6baf33cc21a0a092e7301deb7e5007f043308eaf6ef238ef6f1d8041a385b1d5cac3fdbaef7b11dbdbf2637d385fb621bee272457eece7d0c8714b398a9cf5fcd21a37977e8df91fea2ab53aac09cdc30dac6c19b419f7050b5565a57f2ebb96ae38b4ffb9ee2a9cc63616651b0c4d459b9b4a9879a3a23f5686e75c9dbd51ae14627d156f4e5daa1cea555109191b8021557269253114264e5b836aa998fcda6c667f3b58659810577041491c5c28fd135fc58594633dfba8119b7ec8f218a911ebcb9e88794b2b37243c4125d25f7a49c8a33c16ffd6a01f831b3c39b6a9590d2aedc70adcdb5e8043c1875f7731c1ae3ec7a8aafaaa09ef86907947a220000000000000000066e2b601000000003eeea7da2349158cb540fc0d4a482a867859fcfb965929dfe4552aeec31ee398b3d0f81d97e336a8f3cb131e21a1053df74866c2667269c222b5e029fcfb42ae1ea7f2f00e374f75f5f3749673e26d7b6fef5b75b053646c1ad7927f4df34bdc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046109e1194a0a0f2f51d9df17913f82d30a615b533fcc943ae9c2d19da65cf8f674b2e33ccb8cf8c1c526ad042ea3fb5b6ec2ddb0a867f4ccc712e330da479f68eda82c0751a22545f9023a8a7e8e32e3bf6d3f1f6e395811cb3c93f84aa3a11c3668234221d2d11bc26a03e707cbb9d94d2f1bc0bfa52bf20f7c2f5effda3220326354f2f312e7fa3cd638c2ef9726f60e263fe1c01ee8acf7a002a2560e7b299030b0b35532e4ecee8035817098b24ffaa3a1654ec5a32c5e1b4402dd037735a130b08ba049e872f6aa161ad61a1474759a3c527ee5d4a27cd73bffbe8c9a69c66470b1acd5a32d8087a5ec442e8a53f7ed6f223d2e163f266e90d9bf7d565dca6950303149ce808cda97a4214307702dfeb2bcd8155fe761eee88f025e871e549e5e70320ff1e1942299b74d39d988441a42635eeafcfaa26ec0fd258e399d4a3a18bc9031fd533893b8082a6e0ec485a9004f0cf7e32207a79284d003f57f14740e14224021fd54e9d37658b1c48695b5b5401f92f3a0b45d96e649219a21a8c4d0be3a2b80329238b6dca90d09af45d35d7178eb73dd10fdd8efe97742289b8242ce0126360a1dcd061968aa371ff014a94112d2d60f1e5fc9d2d0cf342d3b305a5392b17e87c95eccfcdd5aaa516bd7f9e4bc594668a883d73c08aca4838d3a34ea67365403906c43dac3f28b06968d73a5bc0eb1af106474a181dcee9574ce80edc19c9b8d0a06de3d9fbc9498196768b154f540291c4b5492e2b35d996fe6026f8b1b409947c962ff295f0eb94c86421c0a6169194f7da51667ca80599545b8fc1dcd9e34966673183db1d1de3b16a92e6e26177466be4c636dc2cc332382e26fd6607b2d9379a68679d9988bee52f9f4b98bb99951fe90e30adbe858019655e939d86a68db5f8d4dd60cfe2b758690276b5fcdca9748419f42a6e4defe7cd089079b198cb50ac8e34e0fc034173c5222143015ae67b09b8303a1aba103a8a60ac0435104e5c8007a86414af83ec4ed69f42b57b90a3b1fdf8794d5bb696cdde1363961318f60270259243db14a85b2875723abe8a08ebf4f4c7ff1dba567af587eb354c6fe14acbb309033d25b40b387b83c3fda86e648e10c01ed691f688f0a983c3e6b20e0d61d0889e112102a4cec25dba4d6049bb63d2de5b30e32a11fe0654612c05e8ad69bfc3c8d71e6dda844859718e916adfd465ceb6a0218f42a071a6e42f04909d065236dcca46734b3f3724b90e2d8486f7f4b17a32f859bd49df9b00da77e64cc8c8948e3e5929c0acc84d58c8892a970ce5cc09524459620b76648af3f2a94830362b5c3bdacde0e11a4a63b784b6fb6f147eb4bc616ee6c5801b0e9148b3bf72470769fe98e8e7c5cd8b76af89ce583868f6a3914c9f8b606aeeed4486be8ec57437997557a641b8dbebc516bdff9a015b648ef9fa47dac44a12bceb253c5834c50b2e7a5335ac87d777866fe8a3d8efe250f885a36902d741e2a7d94db97c2d88fe57c0c8d2ede16eb2cee7acd1dcf5699dc61dff7122783bed90d6e44ed5826ba346e2725d354096904b8d3c05b68fc674304091e4ed82a427982256c4f16962e913617eef6d1a260b247a99c855b44a6a9f42baf99f7a9016bff541c20b9ed68f49e1c5e4cbda0246cb06988a7c5bcb84933419490ba8450baadad16fca1027e4017210c7d1282bccca443a4fbc3ef8bb02659cbd5bd526b9a16357c80c35d3158cc51b2d343d11086582c78f010b10d93ab958128c7fea52e5e12b61342f41382590bd41b064cd3d7d10c59cca79cd85605578c40c45e6e8fb008110539e30fb3d678ddb7a470d94ca9f0b66626e96427c4f0ffd0c38fc1fe1fd378928692bd27ff568684887bcf4337e928bb560669abc963adf099c626690fe3e99ff5e48e6873c470c9905a4c914dfde26eb5b97c9855941514f6f423bc95dd0486a8bcd09468b379d97027b505511d62538154a1c125077ce239985ef308ab7038906b2ec53d688ffd4feb326d2c01b6f155564e3116e1f724b4feb4ec19cda4c6db8c802199225fd2e6406da0324b6dd60d988513f3cc85d4d203d72d772bc0699011f2fd18a0559dad61798cd4580bc383d4356cf41b763d66698f69e1c9fcde33b6f49f61180eb0e9b110bb53316852b3b179faa51cf6e6fc7ab2b4fa0c65ebb7b5d0ee66bc073e9883db983cba1a2aec123917a32f24cfe6857aa9abc26669f40e4201f2c4fd4205fb9bd19946073c4d3d89a0ba17b7e87d939bc7e06e5106413063c597a0a390cfb99deff88686a000000000000000054510501000000007f6121fca5828ad2661969aa9bab99d98386e5f7d6e747fa0bb74e92a8f2662a22082c8cdbf65335f5f935b6035ab5d08fd5c9181081e9bad5beddb1f8b30193a361bde02d7d97b6f9460426ce53087d598cccc5757fdbb9605b65a9e737667300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000912164a02e77ae846d96027ec883cb35b3b84e89edf9c8cf9e3f5026f584310c2bcde689cf9fa23c2b38d817e6d02516f9e808ef9d25a674103fcca9ae7715316faeb499cfef895851d74262f5b62bed506108dab5d2eb58e61332360c0bd9c1dda642bd85abe874176db54491b354839892c5b594706b7baf017a007c26d933030eacd6d188a598af59eb6b29b9a3cf659147467ec1909584e577ed3f333e945e02013426428f405b06fbd93e0329d6029ac4b16fb7e76482e87cb0f5e9446383030a0050e9b38f0e455af6a9805e3f424e2d7be807ee1cc354b7742f6395983b9e7cdd811669df09e3e8c4de4908850033911986db0e2fa7e54255dd80d4aec06a1b0213630f534f58e74bd847e391e1f7bdd9f93333e7d42ee890d41fb78b68b1b98c0308ed7a375c5bd8e1ff03ca45b1dabd07e87d38fd22e028cbc4a80a584ca8073b032326308d95bb05e124a33ddac61d9dd2b89f30b3697b0ba91ea9184f57af47b1022ff88d26a5c149d984040eda592edf4f95e01af6a39fa974702cd970bb47513c0225d99998a802621112aa9585c5f65c1e3b166b952777916cfdafe18bdd3545ee6cbce108134a6834a41bed009a28471d7715077aa8831335211e5506c3d295f6c5f91218bc238d54a91b84ceb38d13e3cc81d7488e267d42ac21c63f3d657bb32ce0150ce0367832169c2733ea3d7451cccac373cb5522b85422774e4c0311dd138fa33c564e686435b35366d4927e4b5c5a6d25b85673470670a2ce370198d97e999ce1a8a18c94bb5d2e94db4837ca428e4f797854447db8f73e4f6b71e8531b1bc578b219a96f265ce9218313620057980ce75cb6c87663439ca82392c5ab92eed7346c7be1f72b1657f69010c04cb0146d1ccf5e0f433815da2829f531aa4b26c319f2a78b97c3503ec2aaf120c92dc46b33c8b80a559e8eaefd2beb27030a03376e8a45c5fea0fb9ab656277a910f5cf495e15323a6774cbd7f6d1a969e1ced2e31be0ea1c60256a1a35b4adb8bae6b3870a02b82b1756b3f50d9a8cde9f058014e5f47ff79e608a1f7b36123fa2c5556b9671ae84ac0b9791425bd4c921f984de455a57b3614c8a28597f6811b2f093e5e741f848f25d514dd6251dbcc33a6d4882484b368f54903d97393d09a8148a137d50fb7622de35e3f9ea15aee15ad350b94196235f480e091a725793f9b5003f9c89e5bf8ccac9c14b0bca6864eee62ecba9b9702809b53cda3db19657d6e142e42c606501478899e33452738db6740a748f22a4a0851b586d41c0ff0971f8dc8a0c860b6b4b13d3ce2460e96745a6f981e5ee49ebd78aae0d87892f086e62690fcba9fd9c9c3af49102dbc82f0844855f47e5b6bcd0c81ab028503fc52bf32049875af6da76efd946ff30b3f77ab0bc2fa6add3015c2462fa3911458861e54b4008b41260df0c4371d7495d9ea855a6b78a05659438648f966532ae412511097a28c3158f16ba4a3c90b5219dd348f2d8ea769e21eb9098ed36493201e580755170323babbbc32bb187e4eff27bc3de4edbba4424598ef5f0117944ebdc9e8e681c5d709127e8dac9edaa13f2994cf8ba2daf5528d9e38185a95084fce650d58d2cff5f6bf1b6fc13f06ae67ccd435e5ce09072c924277feeb711b97dbc2d37d311d3bd1e61436d95f2e2bab9b49f491021f7f631eaf29ad0b4ae672fb8a361573afd098a492efb38678e852fa090aa27b403edac69f349c590693bacda44a9d592dc133f2d5872a00b89290a49c3f9f3fb2da203c9b18a0d4dc2287487e0b965787240982c6f9830709648666c0cbb57e5b8a1de5736626882c98982cd2e0aaadb1c89519ad24fc6ecd017d4b9f7b3a5fc8a05c8f68548775efb6cc7208053e363b66089569294baafd9f356b226427c0c6fb08200f54ac9b743e840f0877fd7723623ec3ea113298b8230cbdaad6fcdd177e7f181366434d81cc7e23a43bb6df3f5729697cfa669916f5379e50f2bc6d0a52192ff2794c2e0f31ec524f5882105bb0ea95ae732f826b6a20f56afd140f68c4892da040f9c7184fd562d0875f3f5bcfb23029f2749e9ed74fa2d893db9622cb7f459baef12ea692ef76c7e2b7d1565d5e9d78dcf917617fba4a9756a17c57d212539970d0167de59f3f8f3b991576c95917bd229af3e91737934b2a48a30ecd291d518e7ffedffe89157b0721df816a0ae0a0690f5dba5511a74a27ee6dd78029464b0ffb1fa3adf3c9a481e6033492125c14b26a88813f491b2f2ae951adce057eed0aa868bee42973a4ce26f76b85c5b33aeb49453f8a3ba2731d47dcb34f075b1e39ae2086f8e3f0590048cbb950b838db011f63ff5acf57a5b4717921e2e84f2e1c2c25bfc6d330292aacdf1fffced74d2f7dd5bb745f46449509dad3149cd29202aa091c2d59fa0d", "63", 0, 805557706, "f5bff5fda9240f4ac48160f1b5ea3edaf29079ad774a109090b915c0e7da054a"], + ["4b772936024419605639b5b2429adf1aac5fcc9b2232d32d9d6fd3c7fe179a8b60645ee9c20100000000ffffffff5577285eb37f2a1b647ff362cc5e37726050cfc75ed66a633fde13b19ef16d5e03000000025165b32dd0d003a39d7c050000000000e1bb31020000000003acac5200e6030000000000095265ac0051636352ac1c81b887020000000000000000ee719d04000000003aedd3f315ab2e2a30ca9852045fab64dcb9348fb04d2abe00cd4448d37f41f490723d2346a312d5769fa6379163d259ba3ef7b16b51cb7e5e4bbb72117844488f897c4466d9981ec4aee8fa7f5f02acd09fdfa43c1319e4344daa1469616a2f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d477dd65ef635a8119fb254ef92d267733e53f91706372e4113cc97f641a96044d55434efda5465dd6a913633cb344403e258b1195c062d9880ae37843bf44baaec6fd8db5819caa0bb398373ccd1ced8fa638dc5768fcec0dede047b77b450ce47e2b8af5351557bdc7580a86fe30fd03b0603223019b47274d05b01f9fa061031b6158ca6208a589e4da34ad97f0078e71b60c6f1a2ac85cad128fe83b5aa49d031e5948c77a9c17ea12efaca0194679e51308af374960faf08d1dc73a2ba07cc90b0777cde1c7af043b0dd876dcad98068ae9f822147a0bff25443f2903278598ac21c9c5fd375de3da38e7dc60d9fcab15ea7059c6af06be7e859a83036da9286b022e4c2abe475911f4b1e37f82190bf92fb13f8e61d9be0df07722d1f2de829dae03220849407090e7b84e852310140098b5b5af82e7411413a323c5fba5eaff519c032b19f237724d6dd71225efd9cacda2aa74d370ee82bbcd1987c731b859414df50227b01859342adf518f2c83f3eb890ba0ed83ff59bc5f63207a5512986b2cdd80030475f517dfb242003d9e0a99f06c0751c66ede555792a2532f2c5827ebb28961a59c28cb980f19effbe06a83a9d4bab32cbcd78f5f449fb4be0ccbf320f8699c2342e45c7986b834959fab6fcce606fdcb24b4c8831f9ec9c3bbd30f06c46d2cb5022f9076f271e03fbc4b2975530d35574301b4f3a71280e2b873a3792b6b114c6bbcfaadbfd9d3ffc48e97e7a969d10fb6301a48c1aba53ad6a62d4de3de162bc29a28e8486d6b7100b3572e9ab4ee1149c202384524591ccd4d205c79ffa19385b1c2581e5818c1682f64eeeccedbb621f1c192f94667b13622d9d80f26a292da6044f0ce5700655fc84eb2c27fb2a791b5f3f308d32d67cb97d45244c70c2aebad9bac167ec57dbd0cf22f92dbe004cd6aed7aa0de20ef2af28d7db8e2247593ef7a3f1bc9934217c264c046fc439542268f354e339babb42363d87973c37f468c31f94090b25628b1cf4c442404eec0174bdbd98dff7eb5754d7ac05e8c016a766a95e49c881609b125664616c47c967659ac8cdda97f0c74c3b4575fd19b53ee1ad572de09a073b092f48eae2fe9f8dd3d0ec5d0602cbb205d8b18309c285552464d15f58c4688f2e495e307413f59030f9de8a636484dda4f31ee517128c26befcd9cbcee31bd2dcb345aea7309f3cbef4ff402aa1f667d55aad185e8c5a6f594534a367928063fa93efe8799e9491be8c6bbfe17d67f20d1e51f06c37ecb2e5d117d5e28eda93b64a09a0498dacbee4ed077529a9a07610bd8e767d5164906f62209d5898668339a0c9e902514458687e702390bdf43104730d693f9de04eef50ab0beeac495e2e1cbcf3efce646c00a91bc1df235f1208bfb375e77d266f41ec181f654be8a6e282d09c93143417b19c1a5378bb3440865774de3db45c79cc00fdf49993a97e8d2f2efdb328c892dc9927984004c0529a2d7841438650272b17d7a04e8d269d0a7f63dff092e18161bb978df0a6e6857f48e46d259530f1c8c23bd27e2ce3e7e45dd59e17d65fb039b74d212817ba5690b5ebcf54f39dc9995edc42c849ddc89e085303d6f4c866bc825bbabede9713467e46af5c7fc8e58de26cd00119cdc25ccb0057dff69c53e543323204ff470e6dfad7a3b80514d44d6600c06360bbfb8ef186d9c546d6084a45522c3279c2508248921e973592aed4a0065d1f9361c48a33b281f15aaae56aef0c3ac772e833ce8f2c9c618356fc27c6a83644b06c126fc7e478b70eb450d2c35c4ae1c3105fa413b9b54552982fe85cad3fa57835806578612ad691315e9ce00ba9bb05b866df6e710610510f2b5b10b9f9ec17f17d6b38a455d1a1b833fc7afb1aa5724b573de8d39bbc71e98efd3998bea2442d9ede551eacc1244bda1646bd09df36a294717e2230f32baaf223c47d2f076f75320860d9db43102290c3cc5ed4ce63e803188ae3abf35c2cd5558799850e4a82c2e4defeecf94eed7c5c7f4c5a6428ecd4794c97e385ba801159df19238bb943fec9339c15629e9de4fcfd0492c06a3ce1a4f9883bc5e2c052c19fa22f450c6a057e9a138af317fb1c3b17875ae83d623417d20629d71dbec8d870800b554433c9c936a8b3ba78189410cce1e1b649f7f752df3098688320ffab0dd86b886c03bedbb54dd443a8b0d452d9355587e74ae9eaa5785b190740f26c23ab2a712cf07a2d5c22e979f26e95a3cf206fdf192c8e48467bc804c9f804cb237f8a87322bcb5c6a0ebc993ad2c8070af020000000000000000000000002d1210ba066fc74e21c76a54f5aab753ec09f9fd782c259bad9f4bcda4851f0f061b38f5f09ba2159f46065cacb5c25f11d11908f099e706fa86bb30dced3da9224d6fff44aab719901e93a2a3aa64bb9fae84f8c474ba260c2ebc2a5b1b37f500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eeb2dcee66ba217af55199bfc3059f79addaeda93c266e7fe126b6c1c148515a490a3a7f9e904bcbccb65ffdf3f9f7a087144ae77b31ca891858c76d2310d2bf532eb6d64a4b801f3a0042e6f49d1dec69fb6b33463f012f6557245100439a2ac6bee48190cdd3c94daf197990c03b73decd151e6923b16b763d9b5542819f3e0308a05100acf187ea4da2968f663a4a0dc1d583c99a3b702f24cfa18805522edb02054f5d780d6fdbd4efd27070966ec6ba829d9611235e7e4206d382bbef7bab870b02eb07df396ea7b43a6323485e9426709b325f1bcf5f08a83e9a96d7735c0295c2bfc938fd4249b8406c071e38e03f9d5f65667657413891f7bba05384d7fcb202240e7c55df81ee9e1e2bde42ec0e179f2a1ffcd56f802ffbc9ee1609daeab82d022a8ac708e987b965afe1db65f78102ed04c8d2183b7aa555da8416e64b6efa4802026f5fef48e978c8b58c926987c30f1210b7f449596cd6d9b3a79cf1d819b3da0309a4f808a339f98ca5db3b8a09a2bd07c84e8e0d968a6350dff1aeeb10648100032e559819554173a0464a90325527c518f7758020076c873af7a584060457da4c06afc67decf1baca2cd34067120c572c8bf16e97153314ef0e23bb9d71b680fade1dd24c62c4603c7572b307f6048f4f66c24fcadee71f762c43a08886df307c8fafe9975dd3807bd08b7bac6f0ea08389824661cc879f3fdba0b9a16d601ee4afee079fcd0c83e0b67b910ef3fb333901af871bf445f403b6ac3fb9994c1e66f8f6d706e324ddedfbbae2f6447fe63b3de9b98a7d33f4d4c082df5b3fe42cd932c291f85dd860a3130cd3eabcf320af0cb0887e72e739fb36fcfd8c9ae240d29773d769cfabcf6db73227cf305ffa3451f674950b304cd6ed4a466afa50ac42c773336ecf489e8d856ee5f3f9066e2a4b96e5629c8d29491fa4c17eacf862b570bbe950cb252dac956c2e5278bfb27d8bed51e43a4661bc695b1a6c19abcb9796ab3e666b9cbe6f5d8b81500edd0a06e11faec0cf71aba68dc00ca608bb2e6c8d2087b800d617caec36deead2e8bf16337e3fb272067cb890f3041c5d41f2fd1da006a3822730f34d89cd7e099f529e8359f5e3c45f7046b39806cf4ee59fce3a12517d7fa0d081362b14afe96d375318c41553bd85491f7a7b6a0e065a7cc30d952c0a820dd9c570de7ba5f2cac366a2e4bb5a55330436643ebb2abf9ce937065bb3fb196c304a5bc95ebdc936740fc43255ce4ab198f8b209b3d2c8b350cd25553615db67a34a026a8004bb51089100855a40dbd5d92d18f36159a6e538e2f83607e3c5c8d0af84d161bf85f000f500dd137433163ec3d1ae7875b3777785d410f20b88ff326523d2afb94469dfd19412832d1eeaf401a325a3c2fa17f4a9db15ed9ab5fb1c4dc60aff1a565631f4546de9703d7ef567d7f51f7111f69ec7f23019575d5c61c2669fc0ca39fed640e10f1c03f9fe48aec65da6f8e0eae24451f56e9d6a5e76a5c1de95e5626368b585d13cba5841f8a567fbe1e5e2e652bf1b624bc83ad03ec28310df4b80d935865320631a3f14557ebf338bc7e10add01ba6f64ff9a074bd824694ba0a35a2d47a04133dd38310dda70755fe91ea1fd44b42edb7b257ecbf4aeb55c5d288ad111e58819ff2beba639afc2ebf73b440115ca24b58012bc009344fa59efaa58c2c2d3642ef9f827682010a6599f9acdeb6feabfe4c49ba000d66ec9ab5dfdd74c62349d0e3a1733a502b51174f6d57d620d63df7437f42e04a03c84708d89008e78539d1213bf9233257583465aa5f53c807ae470b5aa66f10099798b04405c3312c0bca9bd4de5fea899108937ae8cf5eda52928b8e744ab7c13d6c8348aaf50a4cb6b0bbc9df890bb7b2cdff5ac253f502a9708e273357aca1961693a1ad8c599c76b529ff58c76addf9b71b9ee24822c1f389d4d3fd120b0b16f49de4686c218016e5ecc2f93e5a25dd3b7dbce6c05fe7a831bcdb179ddd123cb6f0e0a6fe7cd39cff63fc1fff9193276af420702dae0f596632ef2e360764ff8795e4da0fb3d7af1ce2d99dfe33f8223c7a260c91a4a128312bd46e77a6fae847f6891849112da996be6c07c4523669b7861c6808d5333d39b8cd0ca3f16f29b878516db272f86edf1c660fc177a6e86fbede190ff47ae1de2f6a32babcf4ca8d770fd8109f8417a0f7a6951ffafc8ce129ba1a5ed10171504bcb06fda4e9a1062d072bf11dc73e7ecf50c1ef83e01f1a6ea6f22f7e1b0554911b1c9c6f78aa2d8ede55ac41ae72de50abc7ebc48bd9dff883ca0c48d2b0caf60212de255d4c3559364922c900b0128c6653030e6ce113ebc681ff95c70cad48d12d1aa19f5c1be08c839ab0924d0368aba919f5cde354c245aa952042a0a34df3c18e324dcfb58bbc2c63e98130d", "5163005165ac6a", 1, -1690498139, "135061a4b941e1797f70be88982ea88ba9041318830d5582ac0f427a5de174a4"], + ["030000807082c403043342263082d68947e67063a4810dac9a324e4114dbd3879757ef5de72f010a120000000000ffffffff500cadb65ecab1d1c5145ad54f9916a233a09a51ff77518f8155aa1ede5fc0f9010000000453656aaca2c4f1f7ea8c1956cb045b378f3c0c0da3857b2b571ab0582cb0186b05f9b2954e735f150100000000ffffffff3e9c2ad1f615a5dcd40e2d0f9c2ef3479953a039a509df39e3e2fd96caac19930200000003516a53ffffffff013ad8520200000000095153536a516a005153c703e51ad692aca100", "ac5153656a65ac6565", 1, 1289876466, "e6daabb23d77c593c6fd77c3ad25d2d35994f2dcebdec21e8b2b932f7b9b79bd"], + ["030000807082c4030231851ab29b361830bfc09c9dc1ba35010f9d5bfd3c1d5fc359becf344fab6c260300000002536ac2b5e151b186710eba53f696d268112e28e862bb4c443fb6e9d6bad9a64d2c02cb15fcb00100000008ac526a63005152acb1f89aaf0348c409050000000009635265636500655153df317b010000000005006a650000f559b501000000000751ac5253ac65650000000053dd4039022c188603000000000000000000000000895692f2615464e26a7f0269b8f5c41fb576ce5f5ff5263fcc608d1eaa4c1278a0652ae9cb5d4e5eface6f033d928e434e34f5b1809d6259c17c5bf842444b9d534cf92d01e489ee8c6aacd5c6f8f2676fa75a3e310898fdbcdf2ff094bf08ac00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e6ad89b99470dafc969ef9d16a0457b7d202e491f520be1646eabd867c1f88e84d9cee6303fda3aac6516749e862be8bf608935589673aea7e410bff4f192e452acdcdf64fa38e8ec916b2689f8954d10e2c919bf4316057b9e5b0334712047003f7faed6ead488d94edcf54a1cb1d5538843f42b7d213995bad01af701923920208fae84e29e965d042d7787bde237d79d1fc4b4826d531b1c6506b7b7b5f178d020bbb324d01eca89174a35bb4d6b746543404abffeeae61b393d449bde3197a5e0b07eaddc597ac516a85ba6cd934a3690d4f1afff51e423fa34833938c1e8916547a5cf1cf1dd5416b81c3e2b6252064d13532654df6a8ac5ea38debf99ca7b3e6031aaf00c5e68a7680aac9ac3666a2f437fa3dbb392d386fd52fb8b1a816bfa1990306006152d5d8ddcf127b79cb2c474d1175f355fd1e4ddc52ad1ba8a29a50c7a00321a181cdbf32756fdf539a30b232a73c0766389450da269ff5418c20cd33a8eb021f213c136bd5d7b1dfe38499ca63a5ce28e1a31c52ff1e2cda0f9ebac6cabfae031d150ec6ba7afbe70e7ea0cf2a46ee1d2ea6a6434c51f41331625c3a2c06c61cea194a17aa49b771d93288276b0a272d9ee48f8d81308190ea0f947be90c30a8336ff95cd980c574623ed90886bf23160241a72e1c1dd0f4c379c7c3dd86332f486d4c83255f116857e9de014c01fc330a4df90e9819b75a86a0ecb1ad5e520290537dc7ed1c156059ee747b84916eb5e02f5475b55e7be105ce799e1817a93f9a9c4af910fd8a19602152bc363fdbf07be7eb0ac9865bbde639434e39dd626b03e7daca860be20bf399a3d161263410602b6259943c2c77ae57a8c325beb8be857f54d8cf66217f08457cdf77e427bb04dc459808d0d03d0210a6024d6f1bc435c283068b7fb4ab54a3e13c03cc218100ac72993a8a3f616820245d88078697ad20de07f84f55ad96a9a829d76d1a5197bdb58f17a50b8a5b4fe8e169a207003ba1f665f7e62108da20494f8a333e78ef91503109acaff03bf286c13d73091052d4ff5f1cc12b7824821114db76a496f6faf10d031c50987ff41f627fd07fc257b2d93221a5c32d97fbe2c6e7b6c4e6c909c9cfb1bd0d5ef45dfd54dfc8d8d70afeb0416d0275e9ec3fe581e64364172748251a079a36be6c33dc079c2c139fc9752f7349a701a69b809b5b3c6d488ebc7e8d6389f42e5162249d030a359eb21751d72efe2ee9acfdb5f8a6c10b3d52c646782d0b135202ae943e5f03b6083302cf138bdf3ffa8aa7d6ef87b9069be32c33f74915b7e43cfb32aa2b4e1fa5898e983e8be04f7896b1f235f4d18bc9e71656992313b70ef66296a6c1fff08ebebd152c1979d1168a7a27a817bdaaf438ba47d306085774cff31ff9456853db4877abcc954b722ef82026a0833d18913ee7b3587e48fb7b41ab18688f53f5ac6916960a794c8156dc36abff22b49ddf6a5436301ad697b17f2eff7a7af9e42b0e83e23d454ed7f9c7dfca585802e9d65dba1387eb5ab133f6b8cf87aa5fe02b3097434dcd48a226e361e941ae47091f329402ceb5e77445e27291b0541bf01bf898b8dd58b96af2fae9eff65e9c62c0a36d564d62e0f6f077ec0fded9ee0965f2ff2586eac959d4d447b71dde3b9266e83d53ee2df1fb88ef0495e434cf9fd46b6a8360df004afb9582be8347165b4cc3fb24f59bee1c8fe2b55d45b9b7242eb484f16ab32eba79121569d3f9c127f7bb28420e7b12eb15cec180a1d0234f71ea71c7edb11b77fd224e480c0e183eaa4bdafa7b5222749e0b6ced658a4fdc5e438b71c45ffc3ea8654455a0eaa18fdb7b9d1fee22df272b7d3ed4ecf90e5de76897de7c46dd6fda66644e7cbf11a36ae9c9a3df61f5afdadf4f538bd9c22b1056244bd68bd0f1f2876b892ecaa0ea16e719abeaad23a75b951ce3605d0d48b0519ff0528ceb1e37b9e68a1cadd876f76d681f27825636e8be8519577c8c09c5c91c827f3fc5836f88ed28bdcb251878409dbc74db47df6932bbd68ad7a431d9f7d472552f58b1aaef03c9337231cedda0ff4308fe7ed296e7b7e82915ef87f660d0383dd18e5a2141caf98f786bc2bdacc705857515c660e196c3b9754413e0cd07bc6600440d012c2a2da00628e7bf4b5688d4db741fa787fb60b8f6232269dd5736efada0068c701750022f645b1190092980439cda11966bc6d6c18da2b9d377104b68fda777517abafe8f2a597c8b5528b02fd202cae21d040f3443afb0d9cf86602fa0542860674d794c16a732b8f3b4e311f7000000000000000000000000000468b207fcdb3331c8e193ae4d84fa27c376ecd079d940eae0eaa7701e9a0061aa08b84a56f02b7f252276d2dcd58a287efb82ec0d3be0f23536ec27c829124234b63ca89898d4f07081da2103ba2c8d8d1e7e8a0e702b8bcbff766b5eb5c9d400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098c479e6c42cc183a8b66af449d98257eae68cc7c43229ac9d12336e0c9c3785351a9f177d252c0c60a728743bf6a19b34e9f18d56f62438ca1a913c4ceb9f01ec7c6ca88ec7cac761bc8b3394b106280f5a5e827544d2affbf03f1b2bbd3e1be85d59a9024682f67b6e67cab48e1285e4e924e266c95fb77197be731ae4b140319c283b32294f060a3c7cf69f1d41b56c83b36306a3394e18f560b6cbbcc28fb021d71e60172a2e4bcce2f5354dcf879cc97fec9a50f880b59c0c2819267cef7840a05b59f3d43a0375d932ff24823f129d0b10a4062c7ecd1668012b4b8ffdde3bd488dbe0293ec0e2d9b5ab44e0366ed8327310c59ad68041ed00ffa21c41a4cd3030b9365b9dcd7a6ecfd3246299319adaa7132e2179fd3d10b1de103b6e3d554960326f4fda9338dbc240e5ac2835cbaf22d9bc9778f89e87ce2d95012af6da73daa031ab64571260fbbcd115af37c4b755acd606134f01a20caa0f28eb998497946d403252ac06410c56e5a8bf496f06930cafd4321de7a0bc9b185084ac773ac7e11e00213317e669d79a54d26b667a7f9925365c9ce3529eef014148e68661ec2f1acfad9c95aaf17be5eb4ca4650a4cfa3cda0282e357b070c67d368ae5947b5881e8f94eb9617c0a6e599f9139807c95b219fb4c4529ae6641c5530b6c5ac3b30b7cdf23979f06d0b09036a7b52290fad8ccb2cdbaccf11edaea44bba96cfbff91de316138c725e5cef1a17c45addf55387235fdd7e1627f021e16a3224493a845e666926db7b2369ad6167da2fd20bc2f07338dbee812772a7bb3685061b7afaec0c425ef0cafb3efe8b2d279d7e5b403acf71b41b621f11a6c3d6236fe64084c044011e663e236e5ac4bfd4fac6bf15d7748590f01b63be6966a5f41ac6203b256e824864dfe25ec7fc7e8173306124e1dc3a66e418a316396e19cbfeda655e1df0934cbf674825e30a254cebee073a69931e887c5ac03a8b9743a592a91909e64b0f65f5a0a190871dcb9cec95100461ac6cf83d88d2d41f1ed6359440b1136304775e562c59fb1073a1401fdff5ac643cfec901685b9e651939643a667f80386baa4eb86426f673f089626c3e6cb8b734429db67b816836af29d4aee9bfcb705ce1dfd9170d886014ea846ec4bee80aee6ef3ae317de453adcb1a7c2ce79f4ae2252116f52a79c2fd149e60a85748d6a3456c63c11059f3b0c77c146e7bc8af69758be975b224ba695a26e49715e1ea4a281d54a831819d7cb193961ed835a22e52bbe6b2c2c5fd8cc850a1d48a6a2f326be85e7f068654124a79ae1427952e73d1d5f3c7be48e411e7ced79411b45b79c338832a50732552495d8ebb4d61c00eaa6add58a4415d9b11d18178e0eb5c92173b536bb9c9e5b68948ca44dde243c522813fc46c16fe8c0dc3f0bb73471d3714a4b78ac8647a8b25aceaea81ae7a4aff0b27e266312fc7d3fcb248a6aa628804ecd10795f5af8b2affd07a72293846bbd8e51e1318c6a3b2e47c5aff13e2957b25c9fbd2c7acf1eea70a92564319beec2f634de7e736f58651ab5d6b141872b27a44a0671d04997f08bab0ed0faa46c082598e50e073ee1623fb068090839b24dcad01c3ebe17c4b591c00ecabece31524f4cfa0e4b6ba65155d144b5439e615188456276592d9096757a847294097abeb1366f80177d92540b042acad939636f94b2dbb6e1414b5ae57d6e6018d220f805aa9c4ac090397df3d511610de34bcdf628183aa52b90cfc18a9feab1f1c7143095bbfaed0bc7373889cb71d437df91e7e4b476fcb53db1083e43923c07e8fec60600b4ba52e528def937dcd4b3905cdfe13b9d269687ca8d310337ce3bf68ab7d1e1ccd02ba96daf0efd600fadbca2a85c006a75827e64a54c85d0a9e7805e69d60343aceb8516a54505d11eaa484d0dc6529ecb50f9bf669374451472544adfaf413f4a22a266384d67a54f9803083ef6285a4941a9ef9ad3cffb68a57eece32fe62a7efb122ebacff8589bb02389b863665561d31d620b546be38789abfa1594ca251ae2fca91c3e54c44da290b0cdcfcbd89458c19e9fa95212f5af74581ff646f0ffdb328bf15447045dc095a6026941714271c2354c4ebeb25098770395bcada620c41baafbb524c28510333988669f4c42d5e7e09512a4787061157e818a6f710044b315c8eda5e89dc686f676242c5db80424af042e47e84067117d47664eb8cfcfc353a83844a177fb2aedc8fe4c28fb965fba7fc369a979692848a2d84419ffb381052a81148b03428e480f9a4d10d91dd1e7ab53354a8dddde0ee08e35ad9a8c6bb3e722766f8962ae7bddeb20864e7805df0b29e6bc75c9cf5d374226b6f7e6073fc6cae3cb18fba1605b8d5fbc72b221d1f8dfb3abafaf5f0d6f0e10c50ada17abebdcb2eff6bd03c04", "656a5165", 1, -640454416, "068fac29f92fcf159923b4f843199173e75d69636c7e316a46877a5b92da48fb"], + ["f11c0b5c0398815959daa8d5615eb20324e0a266195fbc915f804a76d360bcd62472ae84b000000000046a530053ec9d99dfbb7e87cbf54d45f41c5012be70c7f5f0c64aaeed3f93ff52415de21d605b6a58020000000151eb60b00346e8bf0f784fea4a57b29fb06a0b3e59468c500102f52e63db6f3a18ea5a426802000000086a52656aac530052ffffffff01d5bf810500000000085365ac636351ac65cc5a99b003000000000000000022b48e04000000008e98a4894a5106bcc2b4283b81f9a39a5ec3f2188b1e3b3acf82631b45be76fbaf74669c1cfd233f452c10537571a927bb7bf06461fd63178643fec23ee4ba013be036e95fe4741228661c90003b81ec0f3fcded95e1fa358632fc2515c6d815000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a38f3d1f059346753e773688f37dc5cf47e6cee14c3b99b0c08674f4b4ed383619245836f9dcf4b6d04b04c98f87add286aa9a53c5fb5d2f14a6b1b67eb624ea92b833752f2629424f7e3d85ef6a78baecb2e33f6b39735b43d0a2290704b553b9ba8f3305e72a6a3072bc5908c035cb93198ee955957590553f54a3d9ec80a021edb57e3d488696c48199728d931fab1cb5fe7346d9ffaa0b2f51bba8a304fae03128cf7bf5b5f57202311d4efb46e95935f77bcbf9b78b9289c3bed8978a09b780a008ea9a202beb8f2ab187bd4bebb2c672ec6d633460919d3b21bf0be5b8312ea57679d53f64ea9467e4f54f03496f37517ced593a225d69e628b2aa95ca433880300544cba69f30b6e3fef60c0395a891aacb89c8e59f212aa3a0d7c3c725ac04d0300ab6ead744e27066dd2fa36c56c36b0f67f7967009e1751cc5bb6cb2c0aa646021d83a88e4ab99f79103d5d3b597c6a3c65add61c75c32c4970df1225c9fd74270216023f19c737eaa1fd5fd2a97b3fddc41b937359429f4e150c29e68a3aa9168503203105ca164953378c67234fff2539815a5fad6ad91dfff4cab1e3e341acf25f3d1bceb62a9fe9a7cb41508ba8720761e5c84e6249c6100accf1ea2131f0a06b4454b9f86b8372034e9202d6b5c180de072a9bc883f17c2b724653096dca33ccbaa72f1e45f5101b6d1dc20aa21e88a5ca65dd0ecaced3bbdd8ac893be1fb7d7cf01838732f4a557fee74abd5bbc2099c9daff3638449bcfeb6a841ae7f5c7ab9fd1b0a2c5a10d554b1c966b09dc3cc9683869b51b12257b93a87ca5d625d516897a8191b5ec70ba2f1a2f1c5985f553e07b3c761932c2bf79c74fee46b921e767e2598f42be97c56cd4ca120f781c14a1185696a4f4d1605c7ffe0366557404014c58f838af5ed880ebc47c593badc69a16e3bf3c6dc1207f7e1f7e31d386d542ab62086199b70b46d02b4e686725e467d8f3f4ad6c59a8fefd7a63f4aec0621d6f7f5f2c9a48edb94ccd6e61fe2c53f5cd760eae43b985d44ebd2eb4408e7bbe8ab6c0912b7f643b0174399057a43c52e60fe33fe2463b43dd93d9b88d0020e4f39dedb0c19f95bc8dd1bbc62d92142e88e05dded8a263a5dee0dff95b9f86469f88d392234d55d0d5bcb59ddc106f6ae0de748697ffc238b85d92da6d051a8bd64a306616b08104d7f2570b1e7e0331d96db37ec097d361c6dc98af5dd66497d8c7793c313e9a9aed445fc92f9c63d34e4af30fbf7ff2ac521215bd940304c85e27cdd1f372e3c0c9c97fb89b8806d47c6f31009f1f0b9553ec07d66d2407329cf918fce7953dd75ba4583622a5edc31168a12665c124c000a4cfd79de0d0fa744d5a0440f1a44d136f8d4e56c949591ab699c48a74436d1317ee042ba8e5a61b3c26eae41e177a7d53b7df0112a4c7cb3b82093de91b2e51589c4e641f8107bbeb5a5dc10b0972e5bbf5bf295d5b3110058cf84937f4635a0a6594e3438ce7e897e87efec7a95e50f7c61850fbde264c74a57eb1b4da4c198ef9b8115fb20d89a4233dba1df848495b9115dd1b2da88df13b6dcc327bec5bb6da615714110140866b1175817134dd78a19355f01c96d489b08a0cfa28b790609712788412f20ebfbc94e4261803038ea613fa5231a418f71d38804fc0bc8cec8ffe5c8eb000c5bc9208850d92d39ab8a07108eb65f285b3e9fabff9521ffa7169b3a30641589e812539b2059226b9d3a9d35b8ca09a0fc0f92849dcdb2568798075101d24c84dadfb52b71aa3a5fb5b2c95260df6b23eacc0617e7abb1c38ed241e27746c46252f5544196cdece2f706f069c6d6babbb13143c98bbbf2e56f0d8c271f77932ffe845ce9965dd9ea0d4d7bdcf9b6fb1365e20148140754b18177717798fbc312640f88bf010ac9e672af88a5ad42f01b845899f9558d4a0cacdc3acc3792c7ba470f8906425fdc0a01fc1c2a9a965fbf8e9e1625a1a9abd2f6e1db3eee218d3333ebfff00c7224bade4b17556812a0f4c9bc3d35bae8e363b8f340ffc4fd1d7abc4abae1e939ae9603079287c216cbc15165c3a698ccac8e2b3c484d95bc13dfd8fbbd142bc49032c128cb01712e8584e48721e96cd31f71c0dd78c9a47892078e0e2c911bcd693b0b4088fcde92f2f37ccb512a716af28b6182226e90e9e69a5b507d89091365e746041de8dd59d8b1070c9b72e1516facd5336c4c739244228b7986816e35d2f8a8205c4d60df705f582dfe700d930bcb8bae1ccb2a8e5ffa33d34bebb7ec6a8de704a1d87152faf3300000000000000006cdf0a0100000000a0240942c7c77946f24280275388a40d4d8a16966892bed0e309f73ed593d8fd1b6ed090396639a7b0aa62a9957ec75e925b503af026dee7f77612f862ad7434c36527f0424c2983c7dc71802bdc2b50fb599c651f6287bd58a5983c2204ff3a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000850b1ff5f30f927a383a752b576d0971c3422a526b2149b21beee82795980d484789dee9586d5d1cb34d5b0c14a148890619c6bc500f72c939e9553d875196dcda80f40bc278365dc1de1fde63d83ec7b02ac3fdb35c60ff7d2adab4759a83aa7e73da8b6aec52db9580253bb568f051d8f7e82d67a0d6dcb6a506b51790afa50200604858917e9f2a9ed42e0b7a606036e66ef5283c17fb68c88ca1f343b56701021c7c0b27a45f94b6f5726949d4879b7fafa4853dab74c82309769485652f1c020b081ce7d0c7bf634e8b31153dfecce0cb27fa02d1767ccb97606e934567483bff7c5471924f624efad8fd7832fc38897f2e53ce61a562dd8ce1208db3642460ed030200aaef7e76a2f4b778c2724f8d0d73b5f0ad7a66d227f5bb57fd0fb2e964740227efb90075a6fc220dfeda3332909f9c14944af15bea26ababa164e4f18f16800317ad71716985607373e3e78a37c3645322b7ba62a591581d5b0cceb55dbd544903278a41f653f3dc324f98b6abd9c6a1e825f11637edd7fe38b0f753bf7a0e2dc8032eb6117ab46b133026bae8c4eeb6cc735d62a75f7bc455c3fd379efee31195580476d2d6484622b454b3e334826e0bcfb57b7bf16b84c37b56758d1a4e0004fbda39e1bcb5c199c27ee613908980ea7c63cee478ecf9e3ec91da4f5ba07a1aff2570b793527d80f22bf2773c88b33c55e0b51d2577a1c02e59e6000797743cc3db68bdbc318ae4a27279fec81bbdafd7786abfd092227721a8ec37a7de9c22b0f3a57ba5de679ac004d0d81ac381003791633e2c0e16842a4ade857d937c3c441d113f5d79bbeb5dc474bc797336238c97f1e40b25045aa176cfd5303dd90960f45dc47766f9a4099a5646b857194171b6488613def51151fd13232eef2e9f5d08d9bf585bb31918c2dc3a43205c1dc801f97b5d3dba63b7156613ee3dee907e6f9ff2299d67e08bc7cd2858f7c5cc14456c0375b431ba48e8d57438a62d243f3784f666bed7729e26bcdfcf2131cc39f601480a55387d3d39572799bc3904503b59892f1fd41c4cb170b911a6a0071fd7f98df142dc574882035a04c21136dab0b1a8d8a92a0e657b4fbc4c07b2d2440d77bba25df721a50285f4e7942ba25ffeb4e95e66b047c4b5fd9daf6e28ead46605201793efd6d5521bf8a876c57b74e650d7e2f1de507fb488f28ceaafc2b2a198303c4268ec70d970055650b21d3c36823ab9835282aedcd1f34735eea1352589371bb6002f3a46eccad8810cbe9a9fe15c5cb3c24a8cbfd36003ce7a99b49a4b42309b360841b094d8ae7314262d5f58023489962852863fb952b9d86f94db4aee4b93f12e4edcbecafed02c68ca6cee3d79e661246aa8e6ae6fc99e9e7e14df74a4ec01051cec1344450287459da3f04ef8108ca666239bc2c5ff0c4872a114714c2d94e27f2495527480420c9d5408499a2f4583a4ade5591edfa9ad8ad591dbba8cf205ee2756a9312ec7b218e62fe2a70f32263f9c59dd05220538abca58d1e0084d942b27f612ca7527d301fff193664fe11b05da67ff65c170decdeb84995c0beb3059db6a4fb97e9e960e2f3c9060425826e2d2ccbc2e99e921072b63be1ab5c745a1c9002abe73f4468e52ccfeb13ee66f975a12ee7afbacc0db2aa820ac1d2a76e8959d9ca63e7a35bceee3f8967334a3140fe214967fe1aae4ee99f3bb7bbc4ae2bbedfe9f79766ac71ffef7f67fd01a52d6799bd89781128d1c88fd59fa9e02d77a78a99cf67fb29a05e0b0d334800cdc5d938e1245610e671d5bbf4c872aee25473f06b81c09a904a45641ccea7a559fc387671a81c86dfee5ddbeb08323ed006a591b9e6b58ebc6821a630df3e56218506d2689dfbe00e401b680504944cdf6012cf8192e491201b3693a0116be950b36a1b7eed8d4a7478ce2fd142198717eb2957347568acf0f07fe185cbb9eb7fd8432061939ed2b5c1d684bb050fc0f9bed9827221f04c75b40d351d075ecebdb4b053cd43bd8d86d3b26f011dabf1eb639edd8af64086fea7d40f067799e5a5bae32c7e54c446486a68a6877656c4b56f5d93d95a5f4e4ffb483303dbabb50d53003216d6b858ac8e6467b755368dad10a9df4cb6dfc6c90b81e7c6aecbf4ec61039980eed6a752fa9d9d469c56b4ba65002a92f26a834516c89bd4bfd6e05b66a2ae8387c97896329269823c81e4a20954dddbbcb0e870be97b1c710d333dd46ed69c73f6419538180a1b4f0081205872ef3197d078a4de36ea2f449a18133c7177aa1a5218766696e70000000000000000c355a903000000006da0ca127fd7cd7a58b7b8f8592d8d361b404df38057fb23e0d6f980cecdf4046489975ca998fd0b6d705f412cec598ba02b35cf2214be24ec19c1ae3d09810c14504849dbf7781177e53dd5791537edcfaa1bfed6f1949d150f108728039fac0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028baed1fd9e1febe64a4ab956d8110aa4466fd7d0c9990ce2faca8d21654a9c35c40427f93dabea72132a1e24b888ef8c7cd1127469010b4b9db6ec7ef17484386cffe72f207d182832fd43ee0e3d2d65c2340837eb154c920d115ef2a382c0009be8bfec509b5a61ee01bd1a8f601411d5c2ad82461910148a82c5e1a90bc12031970996d06257638a42dbc78326bc116fbae7d93e630cf53ccac62d938314263020cef8b4cc70f1b6b93fc651adc3ac252f41ce6aa92319b26ea50dc2ec3e0a4500a053e772d4621e2edc00d71271e1861c86736abfa57508bfb58ca7db5a7bbd5448752b1f41ef683b4db2b1d49668deb0e50e7fe2367f3bd9025204b14d81f61ea022af9470848be2632f2295e3368990c454cd3fbf6ddb2720284ada3527aa596e5030d3b4d1b1025549616e3f87d30dab0e9c5445663b928156760aab475b9914944020d8dd790d3ebba860daeea6fd9ef446ebe10d9639bcdf99097006ac85e01def8031050bc7996d1e020574bc589144c676bf270411823746055f6b09690d2abbb56031223f0c41dee48e86c90940b3e57654b6e667792fe6842eb656f115df3c4d50baa40c68824e8379e08a9f1b410d6f97fd80dbc3d03c530008faeee15f1d08646c3fbde81f658e3f74ff2694f83face2e2ffbcaf9445f90bfa66ab47d74d7668c762597764336adae0bd201bff19a385a2b16fd9afc29a83dfb306d45dd82e744478ec403cf9335894e6bb6ca6ba9a6ef1c3593d893f3fb62d9b7e8e6a8e056c98720c3f0779b4b8cccbfefa4453c27f05e703fdcac43ac0a548d0f990ab6119d8a4f44e22773901b4b1686d3650c743f8a0d34eb91a4c5a378213b7e013797104ab38931436fcbf209f3fbd50a5a6743ec8e8bddb82e97a91c4aeb71048601d3d1d34b032553f0f20ce6432ac278f4013e552d43554a6f032ab014ce18efa1c9544791bcd40d3cd587de18e0d47649cc4cf71b43e12555f5aeaf47e1a078c49a91b754b02866d4b8be06c5c510848923c92d8b876649d412b9a4347d1ee758efedbb6a98e3af8e824ac1b5a20f955238688fa3a3dc91adb750d5a2df89b8695d58ce47ce06941e0edef8832a23820238af6e4c36e14ae0dc1076a9f976702079a95c31ef42a81ae62f34757f7987e093106ea4577141d6bf12fcdda2718b4191a3b365b279a6b855844f51866d017fd5ef06d7ddd1da36090bc6f23903209db71f9d6c1032e2caf67e0d230d20a8db5da8417c3bc95f0821bd8230165a22621a82298c3365066e3d1abf8d7a39a6c4594fcd77e2420554dd84c4a61b9caf526641eaed24b4f806b143e4bf1b38f33bcafb275e19bc956f1ccaa3e31cbd499a4bbfe3bc408226e1f7b64a67a6349f8c375617e7fea98c283307029f54eb9cb4691d8ee252ce4c8b7f33314a1ccf51477008cfd9a7790f75abe02adeaa1e0b228beb217125ac1270a33b96ee71a9baa0cef5f7858a0fc764a82accfab43fefa3e41c110a80e9e1d2905146a836672b532cf225563e884b116e63346de276f20cde24c418e6021b7a3c40af347fd8f7fa61d7c841115a428d1e101f2558b44c6deebbe1abb89a9c6bdf316a36b2817d5729dcc2cacacb318050f43e9b54ee7d556b5e9adc3f276cdff2b24ce5b54c3247e3efc16a34b0fcc2bd7891f91419bfff2f400254ff008bc4972d4c17cddb71ce0b95329ec85bd8a10134a1138ee7d53b3ae54a1cf24283aa34b07a8213b6d19d1d988590b20184e1591bd72cb4e7965b47ca7e5bd69bc94adb86341d35b47bdbda57035224c43280c5779fc97af1680bd72debd6c506f8b5623647c06ac382d98aaee8d9054c7a9db9db0c7feb7bdaef2378778bb06eb4e582b25dce8aaa68a8cf2b5413d98f828d85a131e3b9a56e7704acc2c0d8b5470c54badb26fc3b7432b69ce5deab7e07eaed3a0b12d9c292b70525c45407584bace6bb875a905fd11507471e82068e0b9d7d44ebe7be355258489eecd5d9df14c6cc1b09e6b02ebd1859cf7e74a6e2af90e4d0f78984b5420c4aab15494a45af3ab641f72e3aa920461bad732c4f8c39574719b99918a12e8bb67ed88de2ee7dcd8c2b4a8605ecd746653b9558b006169df17541faeda41f32a5269ac02655a3777ff80cefdf8a284ac6f506a9ea2336e845909e2385262aebf67a64f726037b977779a2bd03fa9c367b972295836c83d31676a7f2ad18ab1dc5ee2c0be84c8c9b231033175eefa6d33e208353489f1653b7e6b8f8ab0586b455eab995d11433bd1b0de679760e6e6597d6b11b7569c309cc28930c44b6147a192ad0b5961e931f28ddb4a6ca080a9020bf069278d92ae2fa2eee9e4419355b8f95ae1487605ed45fea1f1fda995c45ab79f9b6daa65e3f4587d9f8879140c61629b0896dd54c30044df651359a3f472bed04", "6a52525165530063", 0, 934885344, "5e357311c48f8b9d18b9a69ee75bcbf373c47939fb001ffa096c9dd94f75e0e3"], + ["08e04d7402e0eac9b25c4b1597d88362c02348dd3744604f9c3cae835ba3c38c919da239e00300000000ffffffff34b16bb0a575173af43d064f6406190ef8eae0b6dee529064f567b568b9dc24e0300000009636563655363000065ffffffff034988250400000000075352ac0052006576a0e501000000000565655152632ff12a0400000000036500630000000002cf040f000000000000000000000000008946ad4f2168ed0f0c08a34d306b3fa8cb70c1fb5140f22de4c8a6cc7609f8aa7f1b84652607239dc7094da9571ae15fb7b9116e4a5677fd5eb978602eedd4e80924e5a3c13edc00aa94fe77a6e19430b619f70d6ba15f9dbaaf39bfd98e64a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae69e98a1c73b907d5c1940ba48a2e3b78802c1fcf28d22cadc3f8deee7e4f8a5788f3adfcdd43e9f14847221ef04fd0bff5c5dfb867c6b598d8abdd25bd228bffcf967341a472ea621ebdb3976ab0340bb88ff4489eeeb1c8e7fa237f3bf87e6458535ba7368f42c159b01ff4f93cd128020dd2505151e056e81ac1cdc7a796031048a37e6525547ae85c67e315b20dc3cf38cfc17488d56af5ff797c2b46ac9a032bd0e37fae579e3956cd767298e4c463890a067a5c531c0de9aba06158cdbc930b00d4ec5b615fa2e8f3893d20edace68cbde8079a508a8f21680a3a96f11a1a5b91d60cdba4ba17f6972d48ea9632620fb65621e8935bfe691a2704904c8f635d022eefadc92ad02fa54c24f166e59d16b53fcdc7f7de12e7b81ca01c429fe66d38032c07464024f99bd268f03a98969481849e239a2a5802a622b610891b0347be010306e5896a7f200dc4cf088e41fc9ff4c5ac47524beaa4e2820cd8e41c5349fcca02194a8da4c4460dc9447d162f10b6b5b8ae2ae3f9cb1d98acdf44118cbc0bf39b021a67ed9b267c61994f06beb61ea1ee1986a995fae16991a87b2ef858f06d6b1acf51ae90257d1e4074fbd3f4a7f2a5e8cef98d4c7fde098c32bb0f4bf4f9ce1e5b54668b52339237914b5d83d8f6ae61217bd951dd56a2d57e35688bfe9ea3ef496c6fa79e103b03497e67a8ef917c9d88a2b5d69008af3c490e1712c9b088c7d8a6771249dc5df057c4d897ad60bdb2b0640c2abb91c765f74b9d5187a259baa6e8e8e814ed97c917f3de440c3e16b73352ac2a07200bc90b6e0588f45c84a04f7f4f77d138b31b1e9cca7ae38e4019f0f0c406d88e1dd04245a89adfb8a5bff06f6e109625261b626dac5529f99319d9d3dcbfd4eb36af1e8690dd00fc7efb08a8e9bfe8c493c1e217ed7f3d6a182f1e3645edb670ec0646c0c35f3dd447028295ee0777212f1d6039ad2322e51317d0562451fe623d29622ac8ac786a2d6d4a739a39be6661d3cee355cb020b86a3086913c5ed86013bd5f436995110394efafb720ff40f814fbdaf784d5c4d5479f9d610ebfe46b1b4f3e4b8641fe6bcbe57e351ebeb1d4b82ec67ca4e56438b7fe9274f28adc9061f2fe75d157b3a94dc69ce068ff85dd280104a7b39a2075ae1bcef28a51897317a95e3e47c391d67b2e2835d203ac2a1f1f4a6d60ab1932428d4513bc8d84852e17c76881fc1a74eafb7b9c9f97b0bcefb6ae5ee400528a346e351c74209b01763d3c79e6a265744d219f09ef8e7c4f54cdaefeef16a12864c27c09026bdd69f20ebc0ba84e33af203585bf0cd64a7c60773093451c277d296a38eb72714fc2f6ccf91d0a3654e4aae9350885b8075a2b687308df21f1e33e875c8244dbb01283ac26fe7cbe4cc0e89e7178de67418958d50e5946238e0c8093aeb076f124e15d5a127f855b89ce5777f71a432b3396ff919f30c7f19cd3ee6337ea46621bb043b958d75c2f044a7ba0e306809c8cc1de73504703059b3f91a5b21db4f984b2f135161ff5146ddd6a45e92d20b03f3284c45289dcebe21841c9c004087436014d1f7a8cec208051dec1802678d28c2c2d0d5604e53f2a70c47dffac3f0156e8f7eb7451859fcd59cf39f2c459ae5967e1a6885773a371c1be8bc467ddde515d0e3b0ec5cd034d8ba5fb5534d714f9863954f6f9e285450c0e18c6c8c559ea1ee2d8f0b02398d555adbde6dc9709c3a57910245d13f667c5e7b7262dbe6ee1093fc2dedc06c91e002d60629c60f3f2049e0f5c8f957db05ea579d612cc38d5ac0588d77f080be75053277d5bfd484f148dbca646917fb9a34ff8cf353b71a81fb473b023401f414b0afee9b93f130668c9e4cedb2bf845ee61e7d3e066e51d7e99eaf5eca61c2ce56df4ff41d5493d0f050b18213d41218fc23f73bf75a9decdcf72bb741aac6e3c9b25f2de79890f057988689b2b5f2cee662691b9dc65e811eb85459d2ff4c40052b3a50e0414e66bf2a102fde88900c93a118904810c5974c25906cba7a1e1b650534394c0abb59f2f8fb8d0110d599aad67523c4f853909cd9e13d9a4187c68b21cbe76cf0581c40890ad747c9504899a4270868e2eed31d1a85b2276632f28d49b08a49a78cc79a8fb1c961e99b7ee00c8247570b6de92d430166322d3216811e4d64e7e5f2f6d183959c1b808722689feb3684bb0a95b542e086a104ee3aa6fea6e3f0a1bfe3a57fb4877666d67dd048d9e5712cb74759a9a0c9aaff5eb5bc86e4ebad2124248c525694d43d4b08f4234d1d0000000000000000febfa4010000000089601ded29bc22a21f145cd77faade9b370d755016bc44e2ec9b9f93a0a96d71430f8bd8b244a9a2c9b6d0b3cf1f29c5bd436d6d593dea1268a401cdc1b9ba895270066c1aa037173aea03f0e78bccbe61a92e0c20be0a3d506e4ccede732ecb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae61403866e0df91eeafe846fc2f61fab8d6a38c30e76c40c580f12c1db6f6597332b86a7d933898f01b1f761aa74794bc7baa94e90361d57c7df3647c5f594c5ceb0c5acf49d1cc9562e8434a031bfc2b16aa81450945b1c474ed816c73df67d0aac77303bd1f386bfbd10c8f6bbaaf6743bfeec44b91d85bd9df066bdb21750311dd0db2c5607f18da64b0f0044c43c5bedc4e207731e780679942686332c4260218ef66e0042dc17deca035443933746c215b9355791a062844b89801dc094dea0b05fbf30de86fbfbacfefb0838639fba8f5c9d532978e2d824d659d46f50c067be5febab83bc0a4071f758b836086c66cb415819ff68b0d6442333bbecb88c01302249cd7d317fa852ef70242ad4d4a74ef4e2db9caf971a73a5ab3c322453e10c6020f4c52e7b0b5c76e294446ded05f070d5e38f9e4944372f5986791feaa8294680305aeace9f8ea28f62ae74647532f077f4c667c4f26d1b401f5531ff1e7f41b79030e962dea992bf44b7d230a82e703e1c86c5f1154222d843f717865c4ddfe1f2802150a7c3657cfca2e0ecd240b88e3c99bbcc4b74a036f0910fc567dd6e86981e7cb15670072f551b4439483c406088434d90152c9a7fd03e95f4ec285cd9304c912bc3b126e87ac8202e55e499ca41046a656be5abcd4ddf60e237b818f0253309f777060009332f5fcb4bfac633f7fd390d58977ca696cf3f601a857c9aff6fae787a7457828dea7757d5f4a16d26338f4e0bffdde889d927de14883a7b903f57c4dda6299b3b7d64a3126692d99f0138a16dafacb755bffff8691b31a8e004b7e5d77485b85dd19b2504dd91c5f0657414575b6729977e22380cc6018bf656e69a537fe4d5ec6f202c0ca5971c15f4148f951b16d46910f225b722f4091f367d687b88a9b227d6742e002af57a151f7dbe24afe542f3dd924c62840a8e4ee3e8c7aadf4bdbcd2fda8983a1872547da4fb3e209f3befae689a0321a9129c2255e5e0d7ba5efb18dd74f10a86692354b4b675947a70f49349bfa89c06a586dc6f699de71570b321fd114094bb4a7c4b5456e2717d28665f05cb72f997c3d21c3de522e3a57142f14f6d51d17ba0b3c269cbab04296fd67dc233362d32e86cc9b9f5d87e69b1c326d22716a1b58750979a638ed6df56e0431d446fe780454f2f2b07e821cdd867200268509cfd6f44d1ddb8594546592f71083dfa3125a57205771982ef7d640f97677824ed99310752df2221fc5ebde86212a06a2b525b6795c2e7d39b4ae63299e68f441cee6393dce34ccacc66b32c2534a9c463ae3eab2ae1ea1ba0efe7f04acd4e5860d0db4876d4656e3421d2e752c3c396afcd81c04568a462e8d528816d90146d9ef55891c64a7dd867266c47da82cdd1b37f1eb7875c5e20193527998a59e099ecb5d72a771c9ecfe1e82fde4a27cfc685f5905ff2c4bd557b5b3620a46a0664202caca6e533eec94957bbc64f0a63fb4b8361233cc3c563e453b73d7d3977fcba5fe8e48f4bca1a23033d5425ed0efb0c546f2fb68bcb02f5a0f5a24f8b22161e1c9439d39f5a7565297b97c059eafd967dda3188414072db1e3d307e4b0f04c9c2c311dd16ea7889e69383300bcdc9129c60e8217402e670202dec4942d391f1ff90fc37fdd7676d3157120be836e0f2635e8a4f6d9cbd931e7e621c86e89e05c494e5bd1391c226a9d9caaba74fc1887f1498b3a6d08dfc385c351f31768fb9ff141fc6951262b97239e09a9968f15687890554a96bf6d76f738a9237a0b59bcb3fb8af5c1aafee0a56de9248fcea9dbdd94cd9d6eae85d2a81bba37e561d0db626336076c3400a404d51fa2facf9c6119d9ae2fb90ad792bbf1c476dcba0b94859f3250aa7334a26efee12116a1d173e1aff8ca780ee970805c8ad76d4fc1384b0ddffec7c78c4936cbca672b7b8879d37b48e502bb362a75194f7cc75469e9833999348d79a11f05570fe5710b3b738590ed8be1fd33fb132fc66b99213c755ee1c275fcb6505c315f21a185ba717ef5eb068413bede9e9df907f7b3056b78845d8ca61986f29a68336f8723c32cafdf54f35089a3970bdc0d1b9a18b2abb17b7527fb79c1078e02e658ad7f2bd08a10816464d24d36155ca8ecb82be6d965f0ad76b0d6a60ae01f403a51e1e98d9ac8f1438a87f6a268b125dab10d03ef6e1d5ce6db868aea823c18f5443850cddf10b08374e951ffaf095b7159cd990cecd7c74240eb22151d759b283f81e4cd8690ab597efd955634a6548fa03ae16528502b64f217acd9ba5a52906fdecc5b5096372da28eca3b5bdd6f19ca2ac6d6ac4d33f9aa3ffb488dee14e226aa9cf57f346356d7f887fde2a4ebb921460c3d4b0dc86df46dc1cbf8941d479cd07a3394799bc2efcf21266cb0623858db559c3f03bb94a0eeb04", "636a", 1, 1955746522, "7a85a7da4d5ae49aac7fea27eda4267645a18e0543ffc650d1b00ed05634cafe"], + ["030000807082c403013b3a8ec11f9af2170f3d719b6b05ab8a7ec0121e31edacee9715e0e37387d15c030000000165cbc1622d02b9ac320400000000096a0051acac535165634fcee005000000000263ac5c361f30000000000300000000000000007642a10400000000b7ec7baf75fe2fbccca76fe4a510862d64c7f04cafcffef4873fa76db433b32363372a0733dab429440e4ec4f3bcc1ef8b695f4ec45e92ef113b9cd18ba9bca1129dbddd99f5bc0ecc0a39f0c5e93b5a54a1a93eef669ffa5752aa70b76d3ecc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c644a53aa4ddc97023c3923941599722e23a4d2975d265d79cdcac15d250b4a825be69fbff856bbc49040a8b1ae1b1b9a55c2aa25926b68a7885fea271c277e406b10f8ba209a521987a86a2f026e8f0973822a46b5404859b3629e8956b9ea8094bdad315ae9e61d08e48866d32bd1b34bbd852dcfdc88f1241fa61436996050204cb7da3fc3ead5e3ed08e51b27e0fcb4db94661808c3dcd059a105944a3739f021252e5289ea2930e3a2e9ff044c1b7014e27371e8c8903f48f1e720a425d8a030b06597ad76d1ed04a5736c1e9e8ae058aa744681ad03f2bfff486787616ddfb9a307917223f94f2ce7cea4a921a3ccf9b31532b4d88cdab90cae2bb0b0d1966d4032866d378c259369f4db25d922bf589ce4bdf1c730c306346f6f007b24e3ddc470207f2f51a84b274454582d13c8a1caffacb965b81edc696f74ee99df47d551b3003056efcdb97cc9dce39ac047164cec540b323710e23c19a2eaad22de33572d26502272d19ac58be29309c805f87dde5922c699cf6f8b7d101a6979b17420e1306410315c237adb7671a51cf0737564c828785e28a39df6576677b8d0ade9d5f39f5ec53e10711c514c6cf6f9cee2501432813f24fb97fade92fbacf70148d0a5f9ebfb7407c8d3ccb20f723e1f31bbdf0e26392c4f17261b66bf56e7637f641180dc8f04814ce15eb0972fabf4783873faccb1babf32b4d19723b1c624b17b47166998083e38ada1908a557163a78973af8de4dfb1446734d8401b0562d9c37408412a86d2966cb14cfc988f4b38f07fcea5c890599ea767d01a5c524f3e438277e18c220f340bd42be58d98204158a1dd84f13cf55429b5bbed35fb89b71df94253d682ab2b1de87a2d3a0adbb33c6f6b54091ba08b79d04d99bfe4025c2fad2ffe4993558e09df8d7549ff804f3c7db19bb11b3094dc3ae69cfa93ee39021f834b6cd6287d4ffa0d29186d0cdd061e2ad9b8e7e289d90c3faeceda12dbb3579f9e58ee9330c22dd0c8279ca8dfeb0f4b1e156343ab326266b1a328db833b55124932db24a9c7d8f6708d61c2b4a35e78ea0166bff547c7c68284b2c74a1489ccb378bdecf449fd0946bf016794972b95d66674d73f5f1de2acd5fbc1b08b17bc1ded7ac4fd5d4438bd109fed2b38e00f28b878dd5697948573e24eff93a1a2e6352e56516ece5705e55765d058cf40193a665204fdbe04352b8ffaaa7a84875ab018764d827da6b7fd505efd1aa8aa907864685fedad34ef1abf75fc377cacdfe5e54b295888639ebeb4a58e17a503b03d930da01e8dcd74e7e360ac7a594a084d0676701e467518262c87c6696c090577472362f7e67e38fc9f3b8ddf1c314d7003dd63478f25f193b2651e023230d792f9047630765ec946306b5d6e4847499286c418be0e77d4cd157d7e5237a8b3ee2cc7f48919227e4c0deb1bfa15c24c57cbbe31df83b3912357e781d4aaa17e4a98feefa87e16ad681e8f8a534438623b6a6eb7d5e772d200d184de1f6b1dd01a5cd2fe8f88a895e6a5233d7cb6f557fc8b69c374b581dcb50b84ff34b15c6148b7e5488fbed254282a3b1af80dffd06c262e94bbe5ac25d938076ab6f2fdeb59254b025699fa33341a310a79e312b3cfb6ef631de4578939aa88f6348edebb9c42e1623b9461f11268ea8af8173ae2182e6f9fc8431f2bc5e9be456f911b3fac9a56ebe9c7ea2d3496e520c9268e2b7ce1050d4445f1d02e05f2b2a65d1004d4abffd0505e1cc5f2be300ca478d58fee5b00dfbab7314f9462f7fb9beb58435cec824a38b4b1aa8d487ac056dd69e8facc6856a54ec0a6ae3f05bd8da4778acebba9cb1e40c79de4bc9c9acf91357c33100d9186e451046374b012dbf9e945ce46646490b5eb430305054dcd8902db2d8f0625215cca2249c1fdbe6bfb5f60894f45de2bfc845626834684a96ba687973787e474e4dd79545124e8a9c784fca913d2beb86ec9afc81e0bdf17762305fc58adc3dbe0d06fb1e5e1b60491291333402e457b1b7bb9c218d8a7a0e6da5c0dc8d8431ae50e587c39dbde7cb86b8a26eac8dcda69f6e6e6f434bfb3a915a1f0576c4902ac4624c48d33dffbe3b977018f11cebd3660257af959c48040c702c463e603b61111d7199dee196827f6f4a2b7c8e7ab8aab0e4b4751f92f2240ae338b4cd81a6f4b4d27c33e724313ea2876f2ffd36143529d23d04b78f40793bf4314e30ca550bb62f01fc13eed20c3623483acff84bce092e03cb4625b91d8075cdf9ca32bc5ad2f8bafffc88a01773409cead6d025c401000000000000000000000000bc4e8b071cc769869bc4f829367a9396cfcdd83385febc20ce913b4a31d4f711289235d572148ee6a59e1fcbc228f50cb2ddbb04c89c2ab91d64c7b860fc4600ed0d94256b6bd7be9d50a576a55a0bcfb445ead46b417cb54cda2ddfb204b4aa000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007aae9e144f9093476549db7e15fb3be02b0b1c20dde288ed401defc3a1c8c00eeb042780fcbf3f6df302dc85c0433b8f37a70464c7443f168acd8c6cc8d234b0e7e82629734b593d7426d9cf0a139044e81cffb9d4e7ed6a2c826c214fd1a3f76ee07d5800abaf42342a9021abe6aae0f0f8c7c77c4f36a63f85881fc4552d99020d99edea40e33eacc0710aacbf246c62486c19cfdfe70ab279e33842fe5341f2022b0ee72dcd46acc6c850b7f5781da36cbf83beb7e9271d94f79dc1175751a1950b00b1f43b0c4304564680c8559cc71b7193f6a2e409b6c0140f70bfd73dc2b2cbc5148d3dbaf4825a437bcb1a55319edccd30115adf860336c805a8fd85655d3602192df20ee26ca48b8403aacea0cac1b472d33c4c6d557a393ba06cef343b14cd021c402134d6b97ec7a56f44c2265bf378af0045884b1306473e590cbe205d935f03185732051d90dab60724b0fccd1b72c06a97bf38406685648748892e52cf120e0307e1471fb299450cc7ba3c81a1bc438d5cc76050da5bb6f452ffe2188e30c4730325246da5ba8a34cb55d8c3a77b148348d4360f117576aee8f59e70112ba92e99a3d4cc51c2df01cacd02c44a0afe52267be0d2ebacc27b669750ec289a98080fdeb09e2569ee386be795adc4f7fd39409cf2666f35deaaaf9e78597ed2ac67134bdd0109b665a46e2bd9488fc1efab8b4a7841cd52b81fdfcf0e88cca9150279f3f55f821dd7922ad13a7060c00a107d9da2e976dbba6c6adc701fe512468342f92a8cf3cfe2bfc12e3366450f7d8eb1743e9c302127fd056c36a344540af76835be39648fae451e1f1370dd3c6398937eebacbea479858b016b23cdcd9c7f61f15f065698421d45c16f493387328bdec4c8e9e2827995e900ac17b5179a3e35bb2612dde4ae99c79ee1e126dad5fc1d39586d1b3a6b6f032aabe2f4a1761fe992093ac6511f94e948e4cd26eeea498391b953a93a91aec7488781a41fa241da92da96f74d7cc71d3ef858ee744a43a643f49269d9462446ce61cfe51395038d5ad36929f8f0ed294eb56fab8d038eb84dcd57bbcfc9f8e4402cf2d464a00b3896adcf02f3e71016062402903aa486798edc161c8b30860386228798d06b44052273135f65063756cb722f210f943b89261a75b3d757556e3243f40d0d903d320a89463459787155bb6d74858f75213aa495c4030ac01feaf0b8195d894ad688af5e7ef4d1b98397b8d80b766d3cc68b7a3fd1500abfa5e4c42c306857be558b63d8694942d7c130620374959fa81be0cea1b04920debad8380ce4360a531de2f7cf2f523d65863beace7b6bcb99cc4bebcf456f7fcb5a295455edbc44c7a8a5d8d74461b4529f1c52162e087c7fb09f8c06669b6c3050bffb2d650e1db1c9b5666e5273f1e40d43005f6dc0985f395a7d5fabcf9d05da6f05e5f438698bc619bea73bdff1b839a7eac775075f89fce50f5beb3c3ed794c17577d8daa3ef99022073d40b124f90fb0809fd5d21c739356df0b9b7730bf41691a0bc91814730f63791171aa28cd53eff038eea56a5c000b8077a457573621d26fe8533675fa17f8c1f32fe30570433df02d489e1b5e4ac955d7fa899e7fc4bd48198a5a1536f6412fbd939005629ef70b981fe8b79707d9379be2c7d9709d0eec9972df6649e4d18d4b3b658ce4dab2dab825d68a443787f865b70abe9513f78a748e8993cbdc1c68d77fc29e43e4e9ce930d25f7432726298d9462054da76f3185f2ae8f9a3a5e6dc9c4638d4a16dfe1396296c7fc1331ea7c06ea83788b91fa571072e5afba9cd725a54aaaa77ac98d070e10ac538cccf5e5a27c407f7b8c92c7c3cfc6a6dfec6d020b9d16aff5db0ce946a69776eb5ce015e2e945bb28ecc0dff03c15ae94b48c200523eef002d47370eef9cc408f9b7397b57c2086b3dbaaaade6217a7a3f2c48f87ef6ccd3c3168de112f810a661d6a96f25add35057fe9afcd3b78520389ff3b4402e4f9e5eda88e31aed9e428cebfb8f47e608311a224efff1000879fbea3dff07c7403c9f66e9835c4e59dacb0f16038457ecd3c5c8b4f7e74bd6d7a6e5a01037d421e8874a93ad96a2547afb0a9db6cd5708aedcd3b632ad50ef66b1b4973c0606f9cba64680a49de6d5412850f8c5e0188144d8056f449e14de4f969c2178936f854b6293917db14d046e090355d0672c73ae5cd966fda7e14242c92ac4ea5b7fb9273a92d17af2a0fd41c4a17a3034a49d1e99615dd2f0e72e9b144ddd25210ae1cdb34671fb34c8c3618e40e40d1a0e00000000000000000000000000d4aedf2999d640601c8ae59838c4e74a6333ef3e1fa52e09e3cc340dcbec06012da7e46e181a522624db2f85f39ade66c940e072ad7c87489574308f38bc305512101173bb544d09c332735fc4eb89cda2b35d7b4b6023583e9f356bd63f838300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000461ca4c6e6a2546d4fb0c12cd0f0ee2ce5872322ac385d6743b58c370df3fb800f8f4c0ea89f7ea896e17e8a6f7dd397830268fbcbf3512f606931838200c5d72342a59f8bde0cdf47810824aa8a9daed3223d9513d4b0971bb3d02ab3cf23d22b5b521c95fbb0448d595d17ba8183f413925af7bd2243e1697643a8f90a6b00022756f6e3c4b4ff13e3c93ceb1b056f9dd2d0154537467fb99931cf860420138c032bb1a97fdd0e8ffbe9d99040b143588661af39ef47c5e69e0bba5beadc25c36e0a08f6f84f843d33f7cc07be6b981d1d56ba1f43f5170ad2066d94e68b92c20ccf2e185f037a7e4957cd23c771398576ebed8f01c8df5365ec536faffdd22e1ebb022759758120a831ddc50dd37d6bae626d4dd686ab9d1da92db174ebf6f6f657a303039898a7890c8db9fccc04dc706e32263cf8bce12f25bcc185a656763a2995400316464ca2b13c12e4ab3505aff002d7942947b9c20ec4dfea8c9617d0e46b7f07031dc9055b6caf400352bfeae4b859f075ccbdb11de41979cad30277d682842334030e17381bb51e542ca8f55216d562c06e18d2c838b9e894a3ef37d1c7d8a8014c93fcf0e4006776b2741d275019eb6fe5e86a5a87061392a7617333253abca9e2faf5a1215c6f0e66dbd3978511ef3f1dbdcf8834c25c3ea561b90b68327802f0028762a0271c43546f5216a93c4591ac6cab1a61611e749ff38ad042b75b8dc9708bab7f6b369eb21d8c0eaa7e6ee53035d2e85e0918a61b24eac6b2725ebccc157eb2020326875df23b366b58cf1d54c6071f65032ade3d118a5acc1e19c988e9ed4150eceef51aa7544425885e92e1d92efc713ea151aa53afaffae17759d64bfca8f3ad424093efcf4193760cceb1712836d76d5b000fc5c97da7864d5746153f497e3c23f2bfffe96f43cb1f5677dfd025c13f644e8d92b5e67f65ec68f9a370b4fa0088f0413686e99b7f78f8928b21293a586eefc120f7a142cd26e743ab6cb5423ac66318fc1d8eebca0a32711a7275747ff39820c9a9d6e7bea2b20330a3658d95a7f7afef1e5c032fef8f78f11fd2672e1b04003d2ebba4679e91f26e2bb583eb740959619423a74d8ef8eea5a15e32561507fddd08b6272a9cdbb428086ce052e29fbc7ce44a54a0a611fe45e2d05baa37f85d0c10317de60e7c737f13b9e0d1f8234e5dea53d4428fcfdfa6fef82bec00d078342ca037000f5d080445a4a0844754b1bd1a17d979b69e888ba861c03a318870eb844cdbda8a86ac2bf448cc3880b4e12c49fbffdec51b66061b62441b24020ff3a4d7c741ee2d95ccb1fa080759378740268f86db0824a100622992eccffe19e83437d59e2c3305e13306b54253b733dce20b1e1ed1af04c16910d488799854fd5cdc71433fcb73e96721808fd37a68ae397105d48eebcf5d9245c8913e31513b4d69440bf48338e3b4d2cdab6f00901b6623be7746e72d2c7801b1cff156dc4d5b3093967991e8cbcfe6753ec994220cd2cec8ce62e99b9b107b63b3711c8c20b13a98188beb3b55f78c804dae60ad472f16b044b4a62fb99de6764360d741337d02f4eac853fdd3d967a369f4e209142ad4922d7d7714de78d8f37d0d6c8e090048c5798e8f036ffaa8e8d26ac57bf67f582abf6907e025cfe6fa5e6c77e09cff8910adb5f42b7aac1601dbaca284cacfa4c1733d3cfc00a17e07185a82024cbf2413c5088ff05584b2d8824f6e1b74aa2c409a84d5a09cb4eee074341a8f5b4ea057c6433f79c4e7270778e0882c0c5802ddf03b86c9ce0ee4803bff8f9a0205c7d9ca91f11ea9c17e34e33beec03a7eb72debac9dbcc6302485237dda44aa598c9c77e2150de73a0a14653fffe6fd2a4108030d6cc0d04d86ec9886fe1d3105fac98b281bdf8236eb8256f8e0b438e6cab210c9222600dc1ccf94c58d1fce97346cc8e2e5bbea970c4ce1b109874b00599ae6898374ff8d216098fd7210488e925c26ed9fc6ff6673b9cacdea731c99c99f2bcba66badead4031b8a01a0eda0f3215a1f0fad56e4c9131abd163c78e2d7e4c90dd5ca9854abfb921b93d7f2f142c5478604969d949464455b5a022d942e6a6530fd27181a8c37205998eae2c12d9b8509cb10df31ad2e5d11567f7fd08becff959a35277a4893d883159f7964b520362b613da12e6530908760e34984b4510e88aa16c581f162248b5f08b241cf323db0bb2054a2e14d5227a08a62bf06c33905c53ea8d6fd8be3b80c82899e2353ceb4f2d0938e90aef55e951b078ae795ef8ffb17eb23932dcb22f71ad5ba316ab946bb1d5d9c82eb4a0cbf896c9b810958333b65fb8938988a16f62634db12149e6604332b41d83eff51c2dd551baee19ed2b5fecd8c51492a87e120d91a8769b864e55e6c097dfd9e34b7cf0e76ede03d99c5230d06", "52656352515200ac", 0, 1984609098, "543275886c88c3ce3856f9d1d0963864b287e18a6a6b5a66ea21a9fc7b4fe9da"], + ["0a5a467702c5858b42c275e6c60c8cff4d4c4712191c22ba4f031ca7e6f9fba94c5044c1f70200000009536552525151510063ffffffff11301a7f5af6d64320b1667c538c754d1c3ea24f9d3ea92a9bc6c9eb5b85d69500000000008a0bbdc9049cf99001000000000089fa46020000000004acac65ac2c099505000000000763ac000000655156bd5c000000000008000063ac52516a000000000002e24aeb02000000000000000000000000298704910adef651b51e87252b820e9382a4c46f49b00c66dc36ef2a7d5654b91df182e43ab882f0f353024a197c40d75b10e2f4eeb86ae8fc42058b08d1b5adcb7a74d17f8b95131e04abfb7f667ba6b1fe821e2fb1154d304c6f4a29cd14d400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cdfcda97d4888e16b28c83b11f32660df9d1958a9a9aa567d45fc86afb72276e5ebbbaa8e3af743fb34955df1906848cec9cf873d256c408c7f97e134ea44405ac53796ed2f2b6a9b011666d2c005671a34410db0e457a4509bc77cb6854af51774233e68b3c7aec6d49baad4b0d4ba95445f6f3fad1f47646b5188e9bdabe61021d44bf07dc5594dc241ea693e6d5ff5cd0df5f804143e02e466ed8f97cccac160213ce5453c9099fafcd3b535226fbfe417b8aa8843e577540d89a49c6eed0ddd50a019ec826ec0302c891304f6f244e42764f4c160eef6d4921a3526e08e45047e5e0b3d24469980581f6e264f1702292a67fc780ac762f42a9ffe4118e315d8c580204b1af0013f19c64daa4d834b8a1b38036a29dbcf74db6b4bdf88ceebc0398a502040a5a7b2ad9132be709fa5699ad585bc9fbbf19ef92ab05ef81e293bb2f4326020c7d08feda8f9ed2236f0a99f64720931362cb96c1491ee428ca588c715bcad602276e7fcfe1906e2110b35ac1a69b6ad91dc8641d9f694830063e85c0f858e7fa03026a84a84d6587a2cc05833eb3e456ad666c171ba2cde06542ca3e2b088c5b66c177a08fce2d6e65a2c7a71756cf4690bfdeccc2417c21c545f90775b4ac9a3cece4f52a0b8ef4b418d46e6d57e2bd4be96220481606cda9e122437a6ffdf499672dd7632cddd3e7497c562faf47f681f5be18b4b0a9a69c72c440f9fc09a8db8d1e450ba0c11af48a7953d8cd5df3d01b913391e35d9c7c13a5facf34a3a298288b89a4618e177f29ba94a0ea059a5200e0b2cfd523fa58b6ca09ef15796309ee470b872f0c4399a8ec00660031d86dc47ce88ea9392c7c97a7650894e4a398c5d2a4a604f85e81ba2ead5973855394ab8c10ee2226cc73f6b8c58e45a6fa42373fc2213b1fb9c25b2e1117c88c348ae7397ffc86ecb5b5fd06289d20815574a947d44afea1ea60ddfefe94ec63068ce67ebadb842b3114d2ebcda5de3f2f24c1fb9533db147b6ab9d480b14792ddeb6da48dd2f8fec80ca30cccec5fb24bf4c20f0973a2f057acf1540b88b6587fbc6ec4fa79e0122ae59bbfc4eab37a06409a7a4e5c93309e1d1c63d25de64a0b5f433851225249a13b0d174f7446e490035972d0b992a2a81946af55fb60ac1f01c53e9abe0dcbabd7347b407ae5531cfcaf8d9c6000970473a8526814f3f4294c368df89a5696ff9bf9bb479d59cb0c6a9bad29a53d9a81defaee33d4e6f6294a2dbc748707638b9a2cbc69eb2ba29f14c1fd7dd3e3e2e860168d563e527c8464103536f6062afb520fc0ba83d1fe3584f10f8912dbb0985a178233ec728ed3fa89c88e57c5cfb815c147ea012b035aa22cc9edc8be61e4c7137d332f130ededa6c44d79a8b2d07eb33ac64574d4a2f93a4ab0dee1fc017fcc8164b4760bfb7f9911d923c18f864e658fd9f10a5e5b25d685cc580352b82cf8625c519afeac5746d5e998f805c47b0ba2165716a24c66eb65db6553ba24e13d117b0cca4b087bdd6fe63d61b003de2756915bec5cf3cf5f77190625df597ac4536c70d3d79331d4d9fcd4ce37bf63bdfe09f756daca544b9abf7a6a2a35f0889a89600c1666203ca28074b738043a7f47a355eea8e3a814bb33709956da577a4aefafa0076909106f06c6dfa07111d25b7a759799e68a16af340b38625452b1cf010949600e4e35ce7f84fbf3d96507954b8098e0bfa8aa34376d3f8aafbb344ffe826f25110bc1a980a9b32903cf0db79ced06043187b48d13ff722c81331e40529bcd19f50c3ff8b27a9a1cfe9b7d35a45f3b720946a03d32937a6fb9368a2fcc43d2239ee61c0a883b270350bd9a6a7522de3a4f5340f2e6745ae36ba66256ef1cad2ae8d76f96031b71f12239a2de5a653ba0cb37459b2dcc82c2fa5a0521d5a156395320fb947a39f71e34ceb5f2367a804a4f2dffb252e0cf298221ed05b8d0bc7401bf98c2145e7870dfe3b4bdfe1bdd3719aebf35ba159c2a9dbf6cc7fe7b0c55cbd2e228ca444184b4c63159eb2fb899b460b165d732fdb88ff5ee5e7ac174c3800aefab932fe442b5c1420eb094b16fda441fdbe5a4e1ed5026710d38e1706d62a6e4a153e63010d69ef1a01c22c1427c511d481f497e0cd916d06c601696835178cdf9fc0c4b92e88d8f70a1a9fe69ee8da1058729e8af9ebbecee6e533b1b7ffa5535bd67bf68cb120a2958e349ea9637bae5fcbaa2b634717598ec71f23dc195d60c42f683b1086f63cbddcf691681041a03cd8034c2eeaff224b96ea47948c52fc54000000000000000022082101000000003c2ad9c8af100c4090f7e0953d9f2d06a3a339332ed0c1e0b8a8630c47045c5ee71289973aa25a90235c926678d860bf1e246e6ff445bb830d35615f3e69f9a962d0cac54a7b8168fb6060d32254e10daaabb3bf530722a5fc1cd697ff947d6c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073b6114831e6edc14a3b8c03947d454c2801581d527e3b3ff8d450316bfe401908494a73e89c72f99e6f097e260ddf8f861266af77767fea8f16b33229438b92903640b3ab808e1cb9d8b334e9c2d5f586b61e960e2c478602ac355a7488db6bdc4b75b85bff2ad1faa8befc83b230db505c2c8f281914c6294a6435ff45cea02104b0a225674dd5ba1a3bfc90e8fdb75921d04f67a93777988ec195d2f241cf60320f87ae8ea6bcd6422bf63edd3e587d7d70df20a7010f268d44ae8ae3bc93c8b0b00a482dda961874538b71f6eb56838355ff3eac6302fa48f584952bbf9a8b7dc3b5a07f93923ce75000a9f3474ad9cbffdecb892a38cb208c4fcec409187b63a030cc2dc5591545e8df28e2513ed17b349c0b198e65982dc068a6c60a73886d0c0030af667725d13c00a9dd132eee6f55be5d6dbf36c8e267b716637da2213c4445d021b3ee9ba3eb46b1063b8f08257d4405b71df0f93bffa2a4c64b9ca7e17478b3d0326dae003ad3df4761a17ab9c8e8a29345d8432e687577937131419a9684d47120207b642c2bde0756d368364559c60a4837f98cb84c45cc08178aa9296701903e3d3d73bda42b96f384e59a4db396644ad5b2dcf79628464beb8e01e8cd066fcec885c2e09b40b5e47beee0c312672ef1323696653b354308fde99566017d2449664c2fbdf237545b32e1622adb183ab28fa7cd1d171dfc0ca9915c47bb7390ddf88365cdfca5d2ebd39c63c0a89b6cccf320c701313259c81759eb4df2165fe8f09df218242b9345bc673f845dcd463c0481f30670c2a5b00c180cdeb7e0726f7b9ae631a84b86fd99be31fdab9dfadad78c68ac7fa051f72efe25345d97c2ad0298225926d829afa05afb1d0a9cff5a8282ad1023bcb6ec0e5bf56010ae2a5fdb94f3ac1b38bfd48dd6efd71bc19218af073b5422e02474bf4c2a97a9f5f9e796f8d01191803e90abd8814c6e1aa728f403d8292d5ca5164eca08b4ebe1ac5934a97ffc320679324ac7f733b6d20b2ba35dc0308a7ae060c47ad02fce5b2d43154e08a333ae41b22a1e95a8c0645bc61d63cb3f22f584a1387de0c4eb6820f48b1933faee50d9b5bd27a46798c200b8cbc36223c5797252aec774ce1a3a86abeeac853c84230e4c97bff3812294b3f71eaccbc9dcd11cc44908337887092e543f5a1d6665274a2054806dead09d50ea0eaef7adff552dc688dce7db07e92c524d2191dd32e23f3b729ca350e3bf7bec8a89279b8547dadee1e2e1380df59596e8b466ccac57d61d55d4cf55eab5af408a1fa4ac99cd384e28707e68cc4cc4e8a61e407920bfef2659a711fb654850c2022a0de74e526e82e34279ccb2edac12270da17e895da75e6782e8d1c729542165988eeb19ad51779763712958d91d1108d5abdfdf749c464859111020e74d17ddebefe0a55a33c32c087813b752130c16de1f453a7d6369448a21acab763ac2607976bc136d92eaecc7a95fb6a05e23d09a8c9af2bfce2964d89c77b03829d91e7a85eb89bd71005f0ab7502f85f11aea7c0cec31923a4b4912e9c5896256e2155f41a60363713797f2e6317431f57391e7e5fcfd26b428b0b588d6bdbbeb55efb3cca5d6684d7dcd9d38c33fa6370d1b8e3a8269faf44ef27d8beab53d7dfa57836ede872d2dc4039f2f63effeab508a9fcb54fcd5d0246728b281ef7c1974c757dece089195851c158417c6aa99be7803fc374fdd4814a627f5c46d623489e3ce3bf84d77dd86965fa4f5f1dfde5742dbb615681b4df8bcc8add0b1a59198e43d59e7af47d756de00dd2fe20cbd86f6d57e661da0cd30b6a5ffc60442b953ece9ba3cf00c59faeea50318f60337b718b77fe5865e23c8b811f4a981187959e538707f81c1e29c43d5b5bb3d1e19fa711ad45653c387512c5c7ae10c0d7eb910ea7895913f55dd6064876382a7fb356e5ba105613724015bca512a9ce51813fee4b12cdc34b242ec0cfd7790609323defc7c48a0e764ba74cee534b54fd9b2f71a4ac2be2797e5273421fd8a5c93e7de661c5500c909bc5398e9daab8cc55563329832b0c9e7553af096f9cd2e45c5ff6ada220cefb23e4f563775e6400c73cd59f3cc3c8d887186a32ad5dcd7f1f2a0a34629a1c9ecded4c6e86e131ffa3017574d63b630965a581ff5117c1289fbc79851a0a02afa57e26ff66ea9448a18034990eeb78dadb53ecd255869c696f845b2830ce08b0ee4da2c8d724ee75abd9717f522b69e19838a5778f36f4899aea30f2c972e783b08f310a9411a28819604f4029251711d5a55d5c778d8cdde0e564701b732a7b14c7dd581e01fedaa37bf4466c6903c01a2e0b64742cc9c738e536f2919d6ac2aacf753fe2644c8a612f8c62a36b99335eb8a1cd58244dce4ec0b8b853eeaed9b13447e7316f4ef02e538e08", "", 0, 225514616, "99efa90dffa8f3423aec0108175a1a05ae944288676f1ae43091ba2c561806b5"], + ["030000807082c403015bc3d6f76b9ee19dcfbfceef19d80ee44961958c3659702d167158d87a3436a2000000000765006a65ac52ac8373393f02358cdd04000000000200534de435000000000004515365651f40aec00000000001096a46030000000000000000000000005ba9b04fe70f00e92d4d10db023dc09abf24521793ad22d2f7e3b8a9a206234cadc91d950410a796710d89925a1cf8fad078160dc2c5216c7e07a5f17556f4b5ba05218ae6092e770cfde16d5427eb849ad8d9de14ce34ce956a8ef3a3b4913c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f2d0c50e62de326edf768910799e6314522f36ded5d4fc4030a23ddfa65f11dea02d52a083e5f3c99f9bef58693d1cd44fc5ee8cc81a5618d6f175bf8be0a303ac5c4aed42722acec6bc26019630cd32ca3f9d001ccff53d59d760a56aa4d59cb1b7bb1b04595f065159146498a69d662efc331ea6800846f26d9f8b34b650be0320f00ce3c6ec8779c32d6921edc5aaa0071f091aeea7ecf1f6f68fe92775c3d1020ddc5c3b059fcb2d3b26db0064ca4153fcc09a9305a2e53e38fa43daf1f8b5d40a082301c6efa150259afcf4c8160bdb8ecc768357cc1e26ef149374bed5a7bd200d909e414e335b0ecd5a7cea9b593f3c6b86f16b2eb59a178c0b7b68808917c5031d406d748a5d3323f2b384c122d9e9480a27b84dcfc4a33cd65590cca7e9165a0212534c06979c147481baafae02b1da593703dc906d829bddc31de3c8cccbc08603028afbb472fb28d3025b6d6ba916987611b0a9cbee7c1c1d93bd64a3e04dd70502027b0782190115d32bffdb013add59d7305c360b8a45dcf8a093d910e44c012a022c676c0e3f29bae54099c7d3428b3e3b9f5ca442ee8016fce453bbe770180122db5246ac86ff8815330ee9bf534f72627bce253bf949488a5342b550fbc4d818e62cdb3b733f4b4cd824b88e59dc04dbae2a564026ecc6ca1571a17f2d5a7eb89c37a578d2df719e11a0f55bb46d14d1bad3918f553dd52360defe93b22dde3a2ffb706d9f4b4d31349050e5c6a49e715926fe1216603765b10b46395fadefb72987a54b4600e03c9b5714b61511dc97ca0bf647e4a6d4e5267dada37f12593a67e5bcaaf21c3c01e9f6d936e518b8678bf6a271f4212791153a02b3af2a0e0125c4fb9595b6ef54c18e052c3afa5e639c418d66468cfb97e5d0abc5d5a362492c1ff4b2f5a4da2483f3fce982f19f396791251ec7a74ae31a7f5a2d047ef756ca6dc0d26441664be40e0a2d98cabffb49feea7d932c4d5826096bc310fb8c2f40ec84976c85c8dee5b81f97e36adab310d4aa7a3d6529f7470c96c8e2993bdd8a22b12c70080b4e33bc1234b07e58d7e06138da48dd7878ed65a2ca203fb26575a2b5d2a45a79f67cc0a893308325285e3df27beb7d66497c8c774c17276a2c086253e1f4a4b48e3185b9b61564e16365ddcc3947513e3dd768f7b7c3e4ae8de941e57daa7e2607550e6d45599b067697e8cf7ed8e20b29559eda47b5b686bbbf6da242802e48189aea5b1934b92af0b63c8b9d5c6d19d8141259ecf67195a4b48b25940f87729b8c125fb829043aeef9780b945cf7c27aa1491e39025b1d7939370139a96fd1f6dd0ff0b4ff85330f18f6c47718f29ec01a7eed5f2a7c6ccc266bac4aa67c4b2d9f8161a03981c8e8e5e28d34ce58be8360f29f13b51ed7a32487ec48a422fd275e2eb77df0e5d9d5fb9a82fb526faeac0c59fa6aefd6ba33dc024b578aa3c109bbfe4ce58a37302276e70ac0e2fad935d659d4d7fb4a52016e6c07ed2e2fe92542930a063cdb498484bb94b86dd7a698ba403e5a2f221851d919f8108c30bfe7253dbc48c9a45cb6429f6a4bedc54c64c54987434ae65a456a721cda5c8108d38e0ecb811040ebbb1b1aa7ac1887168beec652eb464ce55c3ea8f95c77dd39f819b2be695b09b371724f30632255cf0e34b53a368b706ec6e6d9d3d6857f4c1a21cb2e8e68c5aecd08d582380454f640a0a824bd6f59370406de0b21cda89d0528e089b685654902f03a72090d741aa550e36b2e46c70e57004da3829e3e30ff99534f327e298aec6edb02b4ad2e2a65848a3cf64d438d03c08a02b64d71a8573d9087a0e6dcdca50342ea0cab83dab4b1a9e56d20fb3e0297aab499c1472184cf2104e1822bed55c75c43f0c98d1a5df906a430d9c0aa607949fc18dd3e5828c1ba471bb4c637adf93d685f7fc0bb68d5649f332770b095f9defc4863f842e195f02187dc6dfd0b3b978feb67a1cb7c3073936f7e7bee1644624ca179c83800b0bdf565810a666b992aea72205c43a84cd96480a0b4197a3200c6f02c3180f62f3e0ae9587157b482e15b218bf120a155e671efa2a6f91d3083e7645140a32e05bb2921a0c8ad4e2716c4ea13a3b9b88e664a3e9c83e844a0f4622781d253cfc20efc30cd666378a72f03f3c78b24768164ecd11c84cd60b657f9fa584a35e7f164de5e38a951d5f672f33bd528c2ee8bd15970df3c6b2cade8e7c67112ca363c0fc8f4d28a551acf7a1094f274edb7778a000606cc64a5ec7750a903b9fefd8eabb934093e78d3a60822c8902d8c80bee683fd8252f27a9b2c8411993698fc01f9757a89efec1c658ec59b803ad4496ce7e8965d9fc98e9642f561f51f5eeddbc6478c161c2674a585e2412ea429473b13acec197d7e148e5068cd29d57f2178fb4ebefa43add81c05", "6300006365", 0, -1836378548, "02130d91c51c116e93aa32a7188481297fa341b4f9a1b8f9d8ae5ab11d2847bc"], + ["030000807082c403046932e71f00dc3d104508068b4040eb34819192be1bca662bf8788c1a64bca53e0200000009535251636a0051516affffffff7bc6a698b950014bf2c23f78e439c99df0bc8219aba497f465d27dcd4a62565b03000000025163af25a277de77a9698f67fab2734edeb20356e2c1c7adb5af72582aa3b020fb32cdd7cac001000000035152acffffffff5634d38e5bcbce98ef48146ea040837b85c39eeb24f3f114a10152acf1389a910200000005ac65526a5174c7ad6c029af5c20100000000056a53ac5152405f8c030000000006526553ac5100563839abaeccfee303cbfec905000000000000000000000000faa80e0cd947337cd560b5ca8d43253debe0895e19c6d454a4285d2ab7940aa2aaf549c9a6f2cfbaaf9460f06f6ea0b1c595da3a9a1008553c99dc858d4451616357ca02ddb24c0ee08d4a4b66a81464d860280b963174c165b570add5f7e8b2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008aefaccff2539dfe3fd83fe76ebda32081ce610225e88f03ebaa48436043d4fe14f786aab82fc4f54abaec5b42d4f6afe7a16f61f491618a40b1a1454e52dda3109b2dff5eaaeaa1781c45d1e622a8ccdc1cd94f17c26b2807418c1a4e884bba2841ac7f481fd1f96ea2e66806cd5d6582b04641d7970f83245ef24aa45266c30223757342ee4dd402f011f1d544a4cb7a44ebf8a95fa336b1dbe32beade4d06ff032fe3d0108106daf04dee330db2f934458173e0794f1f08d8e0e96ea48ee0d1e80b0304c2b75fe6f031be057a140d2f7d0f776e22ed38595445d8977b2678d89731109b4ff20bea3a998a5f74ae0da138a2b071c86e09107ad1e439a7408bf3227a0327e314b70b36c4f007e6f5ec21c2eb5bb68cbb9458af80f4e00a3f2f7921a46f02004b285d378a4633ab542d1ce8f476310ccd821010006a41bf729f70ff235c04031413a902965b5d2b5d4a828b23241d7267f86cc1ba2f5ba97d0d62652c30e4e6030cfb88fc106fb0f974c4c6d76d904fde60716cae8aaa37ca0a3735f069f54c86030dd0dda7a24873a86f2dfc48d2b06feb4afffe79ce85055a852c6ab23a800e108558181e24beaa6e8e42e6f091bd743a4255386c6104222a70fccb624bef0a47d59699fd2319aed18aced46b94bac819b492047950af11de2b7e03af83d182ee789824cfc341826a51af6116ff9d6313b6d72053660e92f5b0b4565544ddd509d839119aec24c1b950413c38cf8e6335d466f41772cd093815c0a462704b425a5938dbc3b34dd12d65fc4b31db59910588dfb25882834fa7779fbe5064ef6d7a63f44e468164082f80b96ca8db888b02e40f67cad3bbf5f8297e5e958f677f93b17f29430973521453eea2c59ef3daaefa9e7c304fabf3edde386d36cdb4a014c75de654e9ab81f9a684ce6eb782375f54f0ff4b5d290d9e3982d673c3df5271430afb61a8ada48004dee2f2b95d11f8b2df2b6473836fe9e344998dfd2f6333d44d44edef13a610299282c24c68bc83f49f0cc51d438ca511d389049bbd4f0613ba44f083d46aee8604ee26b8d75e211beef88daf3d4b86dd1fd10ed5fc72bba02714f08d39c2fab6a5641246803b35c0e373456a390d30c5e741a14c6dbbf7d80264803663b0e391c8d0822c9ba895156dfe9cd6db81005ddbaed83c31d886f18c8da68d1f6080be12e1c607824015b06b763a386f526aab7f0f4f7369add91c1003b658fa6cf98b6c3226238cf60d05731eaff103f110d090b6d8ca6d836cb0afa531a11560e20f015ccc8fc602ad3b9d180b29ae1846aa6859e08c2d0ba4ab7ac7e20f4f2192aaf83f6df7ff6b336fabcdc6322d01a0547dfc986abf1b4675c45314f8dc68947f06a3ea01eb0c80b17ab5489b344fb176127fa0978dfff415c408dc3114419894b7196fa065cfdcff081d7de5c9c7da2391790c944d27c05e67993e21e1dbdb8dae5717387f3075b0f3ec4aed15df00c9beff5694083618c206dbc2899fc6d6efe13dfb318073961e6df7636bfaf78a296c2e92eb1f037a9e1a4359637bd1372a86bae4adeb8b8d09e3820ca966d61600dddd1365166143ae69bca31998ace5d493a1e9818c1b382b0fc235ad70db5ab09ba1d829480bd654f3b371f74c14862d77eed067f4e23e4a55707e0a6bd7a354ac51a53fbece5f4ee17b0b3a11e328e512057a326f5abb1cf565fc6d30a735ba7e3956bb89277959b0f4887c5e1971ffe1ebaf71f257f3730f9cfe4da66b9c37c8727a1551b49cb9881b0be42e3be70abe8fbb91e10d405bd9160ea5361b7cbb8efa71967a22f6917613628cf83265c733df165426bbb3570dd5b10cac145095d77a19239f8a7d32d7490d1d81755edb66d8b2dff338522ed153f0635402e120c8a140c1d769848ff6f55f0ee5a1c39767b4fcc7d47f772f97fe5abf037bc3b7b6d5e4fafa7296ae0f758dab6d02ccfaed4026f47a855aa6e96f164dc978280d91c826c58a02a75d7fd4fee0c63178112e792d9faa95dbe6158c8fdd8609714584adc23eafe938d0541e890b5e5926818ce9c5a60c111e38f408156e973b2e9ebd6812e122bfe4e727ff96b685f0e54eee0904e11b112248a0a571c15b4e5e368847b7e1afd90c77e8954d0c340d14d495df5e7e3ecfdf9c3c11c460df0d89bfe28045cd4c2d0c3fd795801d50a4e503854d230a7ced14518da99bc5b71ce46d66808fe19426b97ca31c8dfb74fe2655936e00913cf40fba449b6ae7639298672d39e0a5e40b50794e208b90723ba16b8789247966c533932400000000000000006d413d0200000000e830bd21ee5e88076a01f03f1d13673180279109fea628488282fc50b618625190634a8a67a5b66419dcb51dd32d2dac9e70ddb46d4e0a86e56a03a3f294661e420fd14feac87743f005bde5cb8a5ef179b8a2429ae204ad010bf34ba71df380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d7083124871af6e63706a6c898d1428e2150f97cfb1747a1dbd1a419089f1d5474e30353833806c29362390492426f35031939edacbbff2a85cfa32564045f73965427e38dc35a9bdfba43add608e1cda3b9909b95395e5efd9c491f5aa4e9f5a68d2574c954b9afa9ca6bed951d1dc13c542a1576ff3312b5a269444a9398e0327763c61c4f33a049a99743fd3a5ef845ba7f33d8c65a617f5521f77cd74b5bd032aa52d5a4368d6c8c92309e9390ceaf69714e5ee05309b340aaedbac314571cf0a013267644d0184fa0d1ae594ac4bf007c8e33d70045492d3e01257ad110d02efa568ee53034855f51c58e87d6ca68212c6832cc4df98b13463a1f566271fab92030aa173d913f69ea834251ca2746aa213b6fbb17560ad57f2603c1af2021ba46403092bdbed3d03e7cc9d5782d8e5d1141b575df7869bdb631dc767827c134107d5032589316fb44928b934da106f244e660257fdf432bcc2b2aa1dd401c3f7792a3b03157478d90d364a9346d1c7c60e641d79c334e149fc208783bbaf45d08044de000300f98e754a4a07a15390aec28733827a66a19ce7a7af50122e30bcf45773cb5372711c639129889f3f89b5553d88875b61b6f3c86108c3ac54ad1337e4fede4ae4e26f373cada9bd1f08af41d931e0fcb535373a93d7f99c828f5d328527baf271c8c64b9d527c4521042d6d1128bfe89d938717d827111bce6adf5e57178c285218db1754c34fad567333e707e4877f7496dbe8864d704072608a5b55daa143552055d332bdd51b4140b13cac3ecdd474f28b7f99c328b0754c33e6cb6976abed269350d669351263309939ce56ea733bd2459b0cad15bc347faa12795e4a42562bfa4a475c81ba59d129775bdb2bcd2f4685044986886beabb9462e65bf66251609f0d4326677852de9d59d3019759a0c3a09cbe4a4a90dec03aa144fa8e7fb183f2665be2df3b45d8c1b90a2db48485791155c47e3124ab442b1bf9dfce81a4512255ce09ee7add9699f74298b140a135226a5412085386f73fb645ec03d9bebf81fe62c276f1130acef8e8128740701c12399f5b11b72f4fd371726055ae827d6c761b2b5dc9e9b909b85a1fe017b554526ae759dfb93559daf8718ef19a24f08547793aa42aef7dc3a13b9c2f2f1cade31fc6fb4758e2182b22d5eda10643de68cf97e599d575124a51629ea8324aa8fb16b242bb177f660c9e037ce101174dc49a0569707142b51762721ab9ce844ef66fb71c19830251514bac312e624c4efacac835ad32ae8514f2cda542a9d145372a7ee979eef2a4bafc6915b70e29857357cd6c82266fc8045a5c7d4b5d02428fef7880f665526b9e1fc1b784a8ce43dd473c19ea1054ef43e2cbb728e9bd9a2a606e09788ca598d746196be498fb3597e624ccbb68c1218d6b4b9288c58f535f200eaadb04605860ca0b0e70a447a166dca80a7456cf311ebc00bd4db37bdd24cfdfaf846a952cd3c4edd16a33aa3961e9b233650fa5837244f7390bf5ab4e8a855955a5226281ae3281770046c5b26c8f5208a6cbdb7004c3705b71552377a4cf7347b4614a398e1cdf4ec5d5a3a114ae56ebf4a88cbb0b6352abddd2a6076b765a0fcdf508fdc6ea6962668bbf7cbfdb863a7e77f5c8c6e9ea7b341bf5e4d3bf81947074f1e337da3a2df4a26a03c30d9ce27dfb375a58aeb8209cf7dc30906153d8719a85c2274764ac96a5b6d81c6231a9ddf46077a39ea9f1fe6db8d42295bccef9cb6e81ed6f57a826383dd76cabf4f162caf4f8cf3c138f6770f975043930e85251f374eb18c8b766437aa3a4bddcacc2b5bb99f4e5645ae12b594fd00fa648538ab0ac8bac09f1899bb17607f2fcc3aad9e89ed49c449d35fdd287bf858d62d2e900bc4e0a3008824e88512a65db8809855997c43e1295f28a67fba2666bf804a165d919e1502613e61f36783e3275117447abb20c96130bf08b150356bfc3fcfa96c5c223d1d9d52b66b40bbb59787959b6d71f4695c877673f3e5e46432868224bb6faf648914b21d560024829371cb3bce78832248f949807d3ba118f5d0fde0f5c959ea52e541229a57e889354a8e7673e26b682a4d2c429a756410ec50e6f0e8f310079c8a3ddd68d23ebe3cdb221d056340b8a175fb34a5e2009ad323ac7b1abb2749e3ae1126d2106c84c7ba09094ca81b97b6066bdaf8e732e3340d5ba819ed7fa6f388b6cf827b14766a51b15f012319eea52010f607ca9e420297234a428d70ea4bf0a15f05f09de14d747e80002935081d28db7fb3b00000000000000007b7a9b02000000004f01e55acb817c237120b76c9514c91886550460d74b77611c7fce045fab44129bbba65738d5f67900c22d0a315394671253f60bab5005a45c96c958dcdf5ce7e86a431906b6a3ba2d73103959d214b2891033a0208087164ff32914272f026e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000214680900cc22de5fcd1a86abb2fde66ab9bfdee945d1b5e452a8f3d1c63c716f68bfc46394b3297d865c0cf9830322c189db6c0fbbc07efe31df0c5d2bcee2ca8a1910dadcab010875fa2233eecc9eb0b1a9737cd0e4c1a9272942538ecff31c797a91af04e860b196e05234c75c46935a588ff39002f56223f3fba88caaf3c020901ff862f73745fd083665f612185d54fcb6fde3a1e687672cd4b6c9a4e1f750227721264a7619e474643124adce0dd76f73c25a0357efc1636e6714a9b441cad0b03c005ce19b1acaed34db07c3e26acb0bfd3ab49bf99648cc67a940a51c1a95c57845c75a131ff89bda23022ca75ef032be5d281c6ce2322960b758b86d2ecc1021c11c876ed50f21d7ca9fe5a127b09f04070ee60774fabb229ecf50f52143a670313e9216e38968e33277e7010be92a1c82cf96d9d82ac0933dd188c13ec6f4d9f020183c42d78068626bbde35313b670aade7fc79561684bb9c7907833ea7a1942902231e6c4ca87a86ac0391db0122d3d496f767e225ad12daf08cf1be5ef032c2f20216ebd0c035156354d3f7d4afe2b06641ccf98e1753e887062bbcc10e9aace80270eb63ed99bab2a25b59619e1e700d6fc2c0669a7609fa743bee697c674fc99bc34e83c069dd731fab25cb540ad16d6cbcd8d5de7a2ee0c46dd2bd8573b228a8c0034402b1a23670952a6ac5802087e92e41257982911289c266e7aa3aa3e48c96c6819f8998c3414ad070c2d253761958bed10230887517baa3d22a11cc107b3fb0935638891077100535d0c0fb5c1fc72684d43a2e0dd176e9885d3b825eb1abfd7d9401cd7b83c68c7425603b74eb3d1cbe5d0c2424b7cdb5da4e6f56b771cf1958254df6bf1632cdb7f8a43b97861b1bad1b6994a0aca0a970d7253ca58e41c6be2267306c8ec6b3f12bfd098d145fc2f998126cd35d9e626a93db7d4f9779ff4d5763bd2cd8d964dc5e666d9b28f78dbac494d0e92c1bb52b3983e0458e99e1e7877479dbb0f41d9c2d824d6fcd1d652fbe9a5f6d463fba425c56a5f2b49368761bab527ba0a9622e9c66bcdc828927a91a70fa6fbe881d93e0a138fd166ecd30fb42f43e43909f99d2440d0106c5f2bf40c6ee3c1037cc666a0d85a0431f414961cc92ffa68b96f3607b5f7d9f2124514671400bac1cfee343f2ae3e2dbf71bc0d95cea8db53c724f8681fa21578b56ba5f440e2181cbf666f0eb9f20c3ba36450c686baf35515946b7dff17d04ebed8ef48820e4e983c9fd025432252083dba6aca30d51210cddd4844ad02be9465db79ead350edbd41718c261a4dd9e432d3696392fdab078034d4ec11a840571c12f16928b8e3bc07afc1dc03c01ddeb97d0834f2f85d8268c3b85882343ac859aaed5701481429f43eb879a38f5d31df4f15949e6dc92f5ae85da72616b5565150e4630696b61a92d830c5c4e88f88ad99bd5467b0a1fa3648dd6c6e06d1f2571cf779ec52d9450785ecc6fc0f275dcf7effc18c60176f7ea0b8c2f50a755bac17dece36a81ea391b216dc51c4b2be08fc9857b9edfa28662d1a0d5d86432a563e323444ddcb7462d15ec8b6c0d051806fd803ff867593c46f128a67f6e43beaf2d4cf15867b12541000e9ef23019de46aec1cdbcfd1ee61b7f5e30318a4decda83f494d55fa481735ffc555cb4b4dad88767dbde2b6ee9c07c6f7cdafd12bc4edebd290e0188c5895d2c8bfc1b04417c356d5c6149ff93bdaabedd3229197f3241d0d480ae0e9a6441de0e86f3b17c06af6d66dae324fed1eb9e1359306638fd89829e7a6a78a9509da6029b81f03b91b7e6c1ba6e35f5afad25c334031d6ca0e0e19f1b3a880290d24844f03179454eb9c6d1ae9be5e0737717f97563dc111f5e1e8eba453c4028ebf11920700fcb0e328a4b305a65c09814ee6cd563f4d431b1fd339a2079ec4e560d6b19aee597069b23066c1ae465497603e4b181321083b339ef097ecc278fc2fdd6e70b6f02a4640d2b5c81632b35cb3a55af26c2425bf3b831099a60de5cd37bdbd1cb17a2e7a19c2a66b2e68469d3ba010910e8d2dad0427a34fcd094c769056e8d2a17523108a9123e6074b6bbd5247508ee809a4202a9dbe061ab7960de99dd3ef7eb2fb8cd92fa87d5967c2c15324e1ecbe12123e47d8210301e000d1dd2ab8a27d83da145b7b58576e39c2e51b42c0daacd5773ee1d0948acded73df4108b36fcbf12a6042cc4fa84576167c23f0608ea4311d3d2af35d9306235a98f7f3cf5ad2afd5912b8b9bfec647463cf5d2a85c10060db4d467064bf6529fc3fedb7540dd4316ec5af5abd9b771b97fe988b4aec3397961e62be6188d868c2783908067665bbf52d7c1c48a5277fe9b2f5caeb66a560018743d377128b1e27f93b532cca232837e524bdb3a23e944e30aefda3f36a403", "ac", 1, -1374172599, "50fd124dd5f2a00ee7784c9a3a79ca15733a5acd6f5267c65df6d75baa4ca173"], + ["030000807082c4030187a4ab4a7ef1c3fe07089cb05520e4e996a010b9f7dfa5878d0682bc0a2cafe80100000004515265ac3de9dc0102d0ef2504000000000452ac65ac36c2870000000000046a6a6352e909e80e3caff31c019769a701000000000000000000000000000bf0c1155909d4dfda030a2249b80c0814e92abe2bb50ae6ffc9c3c742f5af0316e42fce4a57297aadbc06e76b51640e58860c15c19c7369090387b9050ea22c2e8d1db8e300eaa77b682ff9b443926747375415a5afdd058e49c262cbf30400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fab667469c75ba1490d4a8e78facd71abb4d23e058718256424417a7b6b37a9f997d66ee82772ecaa3f4fbf83dd6c78c79ff22794f7c5f486a540eaca3cbb36b67497f32ff685e181beebf98d7f97f54556b9ea8b62afa11737bbdcd8786145b07aac2e6213dd754424a2240565605e67ec53cb68cbd7ea6f80597368754bd00022aba83ecbdd2183f9b72f74646b79b05687c466f96e52ea782623daa9fb402d9022fa5d8cd07f87343cb90f52f7b00733a69ae947025fe6f29d02962c87f084a850b086368e8fc0d3451eea209231f83e2aba9116d7fad28a121e7d0d955d1a7bb7b508b13251bdedb3dc5aeb2fb237a8a9980cac505f30da6ae30a48b6bf3a858e103279de636b45c68e75b18fa907ea51e3605cf192c8cbc52e97c05a745cf600ca9032d6cd85b64ae8cdff25c04a016e2f4cb8580ae60dffdd95d2a17727d799b5fdb0203d071d3408130f9797539aa729a85dd2b2e88eb2de17c7e4ddf2476210b8635021615e80f6cec459cebb897736114df0d0e7a6b919d88579dfe831c3a30285e150227a6d9e49631a4110a37b60835dc403ac4a819e67e2bc0fa6c8e3ede57100820fab2ff1011f2f78debbbd2363d86d4658f6331ed33ec6dfd8bf0f66b1c569a2c6b11a3be60493780cee48edd69ae186d39f94d00336905ac57fcadf37187a94da17797b2bf2156180a24b9c36830bc0faeb73c9737b5352370ae85c11a51f30453678db99cb537c77252fb5dff93a8e58717e14dc9a65c2ab94b4255d738979ef6a788349caa37a689a7ef7250b9937a76b70eace43a3e49a535bd4bc47ed79936349f39bbdc4bfc9e75b4108b40d01fd5f80a9df916e08b6eac75b4c2f1ba46a9891e5d5a2dbf109b367b1e5389097bf9140a6d9d7f8a36eb234331c69fbcaa209b6ed7fbc628185dc52a8fb6c92a9197621aa5acdcc4deb2c87f7ec5f106585a0dd44b6a9e5999d2210130b1911f1aa716b07aa818df258a29db3c0853d404a112cff265ade846cc11273f2890072130bc621d076a1dabdf57d65a7aa8ae5ac68b91c2a491c4ad6f88cb2b99a13ada45852654540f1d1b544cc4ca1a64e3399f43d909a45321bbcb4a5c473261f55dd199c7830b00c9955d22626966b088ca9d0dd05008dcfdfe4f30a82f1a606bb92c8fd66b165813fc5a5addc895781a191ef359048a78ed784e77688908b2011b76f5658c31f673b5e89ad2f592e461bd722d8d4785a71def2f0071fd47c3b780706e11e186461eacc4d38a5333a6b7d20f7eb1ebd43f8cb8792ea0c36c0d42f102dfe76438951a30dd451de0c1d88ea08c343d945525f530eb03bde8e5b062ac3232657b5c58626387fa5852a2a167e5800bc01b6a29f0917eab43e7a3db4b201a83abdf5d9988dfbc4c6143b2a00fb9e8a6467e7138219cada3f2b55b6f82c2958eca6979c228e8de75906a4560496c1a7cd67760997534866cb8dae8ae290b915bee4e8050c6d5848e7c891173016420b6e2f57332199c778ac81de55381651e456e0feb3ee1cfa8f628c13e7a5ac105186ee289e2efcb5054ec8958edb13c1387edf702fe4252f5e0670dd8f65b391d1be17df6d41628192742bc783a4b9bd1b834cb54bd88725894b678b83643da20c1b6656f57013f3e39e13003829d098c44ec42859cf8294cfa0fc4b33b906c51a6beafe5eb398666d03ceff929f94507cc47b6ceade1702af35af799293040e692d39e528b22c95782b1a5179f5af122e223f37c52438a5e15941e418756db7e5f75bb8d7797be25e4ff336e288fe73775feb57be18ea49b761b486b4a54552a74814f2a40b949fad4ab4270ebec819e0cff25c6cc7b70dfc1de6852cf67a2f9e24f590a0f73e25b467e7f838b99fd1776bfb09a9d290b13e20cf039c8ed96f44c32fa28af521d942d388a7d2ed146ae6d5cada6b4be6fe182364c1ebebbf9ab38a4b008914d1ed1089dc25e8e277ec226794a74b24870cd46806df514cf3ddb487f6d6684be24691217ad4005afdcdc23878aaef7e54c7aeb538c624b839ecb4156b33a5a81582018291ff4053df143cffb9f7e2ce098290f5a459b5cfe8129016b5a2fc54cb5c920ee120da113f0049f71e43cd3171c50bb7db50f3dfb6716f67bc2027b79d384b4e8ecbbe55595d09d62fbb0f64c9ee15061345b761cbda8e0e1c5e2f4f9b3efe3fcd6d278e8e1d4b43999d05aa398af0e57d555c3757467098ec14ab3be1438721c56e6c3dd35d56f2622476349648bc3ba97d3c3df132b6dece60f48d8f7faf7dd2f512af01e8e6776d437f9020996af634c4951d2f39921b8e6c5db6cc27b590bbd413f3c506e0c43bbe0bb693d0bf4148ae816f1a23874b881190e9bf78900a359b68b7e0fe3c406b9b53d4dc89d8b6b79ae87d8f186e07ee8c1511eee8572a5a5b8b592d0370c", "6a6563525152", 0, 23600395, "db8e97a506c2bc3e433b6306270d4bd8b3abeee0a6f5a5115f0036f46b83d627"], + ["ae57b155040b18f979dba36729df56fca5c95f9116076567630be837dd7ad3626bacd0be6f020000000653ac51ac6563ffffffff0c819aa864c50fc41b337cd4ca7c93c50d995103a5f041c0a8511b23fc6e7dba0100000004526a516affffffffd6642cbd57f81ba838ee28eccdc2856d1d0b3fd4d36ef6a3432cc757a4745cb803000000086551526a63655153ffffffff88b1c257e88e15b53f68a62c2c612e87eef1eb7a3ed8daeb270c36ec23e55d4d0000000007656a6553655265ffffffff02752f43050000000002ac6ab63577040000000004ac525265ed360a0a03000000000000000075d75803000000000bcafd7c8503a8c62b5ba31a35fcc33f05250cac1181962d0232ba64681fe9ea847cf50a066512529a472fd7e3887b6c28f4b9b97bf4c920247f4020cdefca272c27ea79ed78e03ca5273089978e447317681211072a22b54b48f2754f6c865600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b9eda1717698614e7b6751eb46bfb965122a6fc3c77cf5ab69d0911228f51dc3af83ef91ecdada881230e18abd77562db37352bb98bd6784ecac150f1446ed0252bddecf7b84f7e24daf4202b4f842b8a652de4d445f4e89a55488a407ec4097dfbfd98015b55ff975d9cc4295dcf6d86d7613809e3f6158e6018536ef06349a030278aa77c7c4eedd8245d7daadb0b17b94fbe19fdb65438e7b9e72a446e9b4ab020de1714cd47a4c6b2a2c22681c94084ce2f2b12ae0bda57d3382a49a729efd400b01830e2995dbe1c12cc67e0e61258b1da7a8b05ef759f055c4a3a8bf3e70f48f45f596f1dc7b5fbd0408da13fb6fc97e02ce8fd4e69590ca7683e1774b218a4e03184fa1627eca44af5e699b000348d535911d52d753a431fe3b44440f37081f9a020cc03943d84e7784e87a68b60086e0e001bf58f84f6dc3b70c843000fddf46df020ce1646805ae55857761bdfb66978af5714975d14c647291a1ca40d46b241046022a179d02f502b568d619d38129aeb1446053ad574211fd6a5610c6ad745f25b60202e369e3e55c187899512a5e5ea33fc76cf0c7b58486ff15660fc9b9e69e9ff2699395788d5b74a5d35fc49c6da66cba4e8d0058a3bbf106f1c47a6b27516dfe3680f37fad52f4fb5e3f92e5594e232161cbe4f7e9c1b0aa7bdef68aa38e7e653a49258a31ad024cb7d49edf7737e7b4ca7d448f87ff2db6b56f1d8f14d365c696c7c13302fbc207bda3ad78aeb5f14fd00d1de5c21f4780e4edb065e5aecb743f5769c088d7c82fa788e5566ec57f09b24015a1845f41333b657a25eef3818f07acb6f1340cb79b7a73d36e0ebdb69fe9bcb4e2293e8fc8d351a4caf0e61b0dd5f0385c4fc49b07e51fca73e8ad48c9613b0935c9d9ab3ce9ca6518a3f2d4f0721d700f2805e1d0a0349ed467612e226b16d1c6c9ff0a4f2f73cb356027daf964009339bbe699822eb9d77c171519feaec499f5a044d58f46f4e41834691687363e39e9ae19479e2f65a817999d16491fe62392ac516ad9f938e2d258f9284a530da91b4d01766e1fffe9e007cc36d300188cde74dee801dada0bfe1c604cfd7a7cae26acc71a8479dc0f2a71bf402ebcf604ecc8a8850b565d7bcf097cfe90e0962c4f99a664920dc8f7d3de81844633cbe8afe8af42ebc8e96605d5d3754c1f5da7c16e9c54bfd75f22907b32194a3b8fc02db6f8a056329678a5e7e65c873522e7de9811764d26f2413fad5f4cccdd1de122991c422b7e8a6cac126d900b4c981c034030e72c087b077061442595f68617285b0801d481e4d4aba4655cf2ca99556f13894a2ab0335c4386086fb84383539d6c65b65faf5d42736d1e6006f9d969a53533337b4802f3b222487441bc6b45792641f574caa0b3dd0f81b160130ca22d0086a2d2dc7a41d27480a0959fee366c15ec282c6574ed3c669608d002fac9df6f9a46ecd7fee40a312be51142580f5bdb69a08cd5e35fcb00d8839e360ba1e17d5b58fb109a27cb485dab8e9107c8666b002c304f58dc1a335674d3c8d97d12d078897c154f749881e7dfb10e20bd36f6f6f4efb47b99df138a43b1f2f88bcbb1ecebc26ac9b56aa8c2077fcd6952f8146acf17c00a00e32e4dd50f4fba9c01c31aba4e263b108e73d7a847a09822e79c44ad3b7f46f8f691f1f1371b6fa7ed4d7d23a14c2d9095c0507d25fbd51a1f2e3c4b6eb3464e3c25743e7e18ecd4684db90a97b8517bfe31cb6557763fa02dfe76aaee2a99e5ef79993092b8c7fd111e480f19e177b56d913ba71b1eee631406a33f7107fb300c3faa49fe82d46c7cf018e7f9f98d2868d691fb9d2194bffc4035ff11227fcafb6f119ee0b0196955262e669406a38b165ebb556acee7af79fa73bb70d7c345a8115681edfb52e576af50bf37a5683c2ad02e47ff3a824afe88d00e303a409b3275082326883baf6605b2493509bd4b6ec7028284eb9b1c54f37198316c2edf87b0d25a147654476c2e259cbd6260393a1322fb99a6253c3a59aab6a7ce3bbc89c81f03ed88a931a5ba9c3d538bf5e4178b07c4ec0f820da0376328522b15c4229931b03f95b2b9d2946c64199851cdb1e6a78ef7e078ee40919ad56688f11d2e4afdcb5cfb4b8ac55fcf29fd991b0e5c54cda98a4430113b01c2dcf57489bf512151fd96dbc119907304787a57abe2147dcfbb29b533ef527bfac073fbec8775cfd5165b8d7512e2679af1cdb32e793dced17b7fd7d446c6cbbc970ed11fb556e91d63ecb768a2e3e101a634f582ba50ead1914b9c9c36452900000000000000000000000000309f61b7158ded5ee8b9f2939c78b88d956b4dfddf56d3c1d40c6a6df0ce459dc79b38c94495705a9a6ba868b13383f8ea9c3999264e80799b032c56c1431512621dc2320c8811d993df83b507546fc43aee9c6aff2206092ef784680bcc10ec000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004618d5d481a82b9b1cad2b590f55b96b209c5523598adc1e5ad0d63789a9014f09e531f831d46005d716d067732b20a845444bbf0fc34e7c7da359c823801ff26886949dbea7c95b84abfaabd8b7101510ae2d437eda1e2efe04f0ecf513509c19ea876591b7608ed0feb642bdea8dd8d159d924bc77345722cc35a7d63cce9e0325e5f6c7afe14ee9f5435d31c32e9fbe541f9eb722d7fdff5674d39797a8a3a303210131bc847641879d46e2b7f59a3bf5d0ebeb760b6ccf6c292a3aa48c02d0020b084d1e07893837d9ecf702f360c2282770123c835062d0bb291d9f5ae3192ec0445a1d9008ba5263b3377545d7763b13ae998559b3e422581fc9261405aded350206b661f72f71ec5b25c3b38dd7335731c30d085b4dcd266afb97d0843530a6700224a2d8c766cc168b0e2e7bcf341c25a23bbc1d86a2637ea53fc7f934c5577e31032f554d9e7557d440b693c768276b8a1134673507fad652010410037a480a5c930214c393b3e5962c904ab762b521f72b009ba8f2e58cb208295ee562b6932b46830202071f2884972df52217f1e1ec6eff74d1ab669d2cb8241cf3bf1376ac5f0fde8efbf7d40ec922af8af2a5696aafc54ff7c9942b6d8a9ffacc0a50d8bfc2976bc62c0180cb2aee4617f68b71444ca2c16318e743541e1e082713fb65ab8b7a5f8a3b6fe297eb2104def06d5f2aebedb5d1092a6179d2c2dffb1b2695ef08f78d79194c88367d114412d95dee3f69220e539381f3a8cfc5ca1898359091d81d6195b08d7cb2ca90a4a89efe361dac9637861a63d9a3efb14e4c5a4d56f885a8b713246b3650d7eb0bcc6e9d66d7a358403a46c1bd683890221db9625d944c555ef5ab3847494cd3639435fccba6362e71c935b5bd80307e35f6c57829d91ee55f9e3ee36319d6a10e386965651fba32ec7af9e14d032cfe6deeb372691a40e9482d3ad7aaa69ec490076b8b70c0bd71372cae2bf7e3f5b63027c893bea6a904c2a415a57596faa37f00af5bad850d56c87a7348e1cdb9d2a5b86c998b60a73fd7d86e476f1e489ed347e2e4f730ef79853ee908d25122cd124d0855e62e1245b49630e274e193aee7d0e502a4b05b31428575aa5a210c98bc0afe961d033ef053bf904b885ca922cc01c155a824f408ba0cce968a1706066617e7238f0418d408543ac12450a47ef186d74086600654661e7711873c0172d3d68e93341956aa140ab47855801febae85ee909d7228ef231758ca21f46d54a6355d7b335b9c5d4ccc2713c8680b5f237d0652ac194985b5903fe02b287a4a24dcc433d5583ffca286180056fa9e1df6ba09e4554ad28f5d5db15321ce5cc7cacfb6173f5f5ca8070d7aff99f8b4484a0777b78afad871c42c2034590d4496f0bbbc4adcc8071624e34ebd66e0b7de1a43c269d242fd6e12cc24d0522544f93654a8b0291a7e6ba556e7269f40ce14dcbe2f7340479e3ce6e3fd9db270be66e4b5a527217c8e871a0c48b4dd3c8926ae2e9c2b8d51fd855c0e2121ea762b4c2e3ae4b471c3422721b362b8e4babd2a9190ec090574310e3caea29106c666d4c2a94b4e86a1b4108c81dd738f35dbfb76e219fa2c7e9510294c3687259c8a8f05d103a62674422a1ec2417bc66980e0e66bfd881ba66104842d2fe83ea4d18bd2270d0197253171563a6ed26a51ea796c036112fef15925100d6623cb07c14f60bf9b71c83014330685ee84912348f4afa143874515f0faa1760835f664dfa9371ab0f5a33a05fab78084407fe2a372ee7e68540dfe46f4a01cf035d535c6f48fe19a8bcca6c48e2adfd3795c4568687b36cedf5005f1c5e2f53e335c443a811de9da378aef91df0b4e151762ae4c47065b03e11a2af7d81aac4518f74a22999f3aa61b581a7509c8e033621afdbdf59148705ed848e5b76685d46b59483e310d594ff75fdb3619108a77f1e1bf6f940655d625e21f054497977bd4865edddabf5fd7a501bacd37bbdbf22d38179460c04bf9b62864a631e37732a3de7d420d85c380dcfc7037cc2a54b4d2280db969f74b833aae5a26fce6e0d72624f2c73f964eda2144a7e45d026084e54e0c3c7dd3dd0fdbc4e5423380dab1e039759b06a9788a2d2fde7f02dbd63e1d3039cde9700269000155672c3f49fbbab5ecc3016d6228342b91c03495b3000bfd446349e7669fe15b495b58f98fc19a59399fc61c39f1470a3bfb8426773489acf665e8ecefd1040eeae05b9ecabcaf0d82e6329fe1fd7ecaac51e207d66bceb8d1eebe11d94d0b1248f46f84e72f0000000000000000f398b10000000000ef1e2c9cbbc992dcf2fdcaaa547b15ebbaf33e42015494f1cab8697b6c8b50c707f6d7602c361b0b97dafdf2aa6660f9b41b11e81b507f15b5d82edc5dc70a9d412a9fd03838b67b36fcfc1153e8a702471d7d4f2c78906f2e331d13a5f7ca1e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005090cefee3b7101b8ad44596ac9919470731a821b154c02b6cc029a75a1d8a0eba37227497c8b0395abc63e61b0eb9d32993872a62f9fedd52653d2288c51efcc749f715bdfe44ede08f7f084568e106d2c568ebf035a00d793ed371fdde2a3f2ee7036d9af6694c35a51e7789532f52f0af970eae518fda1e539474c1b44aaf022389108a0f605faf4c721244ab2939d36fbaa270c15d28486262a15baadadf2b0209821b5f2fdd12da436f5091f1688b25acfba55d255cce4219680f52c2403e930a03de461ee304e6e6543f6556e8aa00f5585f13903a11a170e9644d9a618b5d4bd431f17044080603d705e404a09c47521a936aced953cc7ca9f6d9a10eb6e7f40326cfb80d3aff8978bdc393e9c5ff355f277bffd9594ed4936b7d0e5c6214aeae022d777594d3a0ed8a18659a5496ef2005da0b611f57cd27875d53b650af260695020a6811ee22c403b416afbaf8c7b886f12391c1ed3d264635cae3c6086ad334bd0216360990a3e61374dcc0078640617d89484efc9917134312d15b90b67f099dc9032833c7c17a40a325ae2c4cca417f6d6b0273085e9357c15a8e9885066e003ddca351140dda946ec1866708972ef47f4e9e0485a2e18a6360003c85ef608e4a7e328765da97a5c5086dd761ca8e39c1d4b8e78074a1adb2bc47725c76030c2c4d33b1a91b83b5cdd3ee97a8550d40940122fb1f5b3568b3ab428767ff6c86ba45df2e2ec7b82c4af4f7fe0297e1a02707d33efa8d04bda687d1e021e290a8618f8d9eac6fbb88d51bf65c50b1feb6ae37d564f53002291f857b94aa6859f54fb777f62f658847d635780eef1035eb3225d30f27ec226160ae75e9ab4519845cee3c3fa325e6c975f75aa66bbcfbe1d4956d5a4765ce1460e6050f7349ce607268eb585dbec08835a9fba0fc64236293524d686d786e4f685b677d8ba229046c2d275e6d0a8cea29cd3c408f020650b1ad10b7efa1d60220f18583b51e94c98df4c2b955fb08e85d16400531f2c14b8f9e1c7e10688e8c73d83d9cccce87a78ab59faaa68f0de1a8bb4b88977e988459716c15f9dbc48cc5f0948d62860961db3c2a1fd07ca1ff9ad0f907c9dabdfe1ef3b084c164928453da5573b9ae9df6bcdd44048bacb44d064adb7bebf49c7856ca0b67a0f642d3d05dd6f55ba2c88c954c50f7e4fd8eb0b80fe069a9a864edd9ce4c7beb94ef7d6b80cc325e2afb7ad972a3ea482618072001048dc62952917e6dc646250efe35a762eb04b05e1d50902878e3813dda7748d4c88e39f746d7aff1e511cdf90c6e92d613157e45d7337c74b43b951b25a9b11128d44406d22ed900ddbb726af7b86456fdcd48219cc9965737bbd621d2853ffcf3fd21159d02b374a5e64a217bfca41f9ceb89643ed4838faa2e864cfc8aa89bcda9981c42b07e1ceadabe404ea7c97aefdd5084bb9928da7a3f7c1c18d9ee9491214acd552b6aebc4868c9b3baa263659fb62a106e35843194edaf1b1a280954e8f9e96f4d8187a71cb441d17e3e70d15258f539929a8a186567c80850c162aaf9aaed0e0053feff7ccfa68c30ae4e79b530257418a42fafb373dbdb9ec2c9dfaeba4ec123cb2510a990a4c2defbed1f674151b492002df179a2af383a61f2f8556f58cd7fcc405fd0fa6a4cd0371c1560c985f48165732acbd05f88bb3cad32f1923e53dbabf3969dc4004c134544b25105f84bf1746cbd003ca66d710041f322d5f35b3866b21a5be9653c40b44c611a338594707693e46afef1c82758098347d5931fe25331bc646724750f53367ed10729cf8beaae477b038848595c5d99103ec507cf26de0da207c9494f7bc0d16daf09f9f71dad1b48c64749d9af3c00c13adcc2261627f4cd4d9f0a354af6d87516b4319a140d97f554ace3d61ad15fa1e718446b5da0c7592881d579faffacf25f26252306bb6df88d1f726d0074a09b573bde2be26e49ae64c4da4289db0616aa7d03f1b90b6acba7e6410c5bc8ee1aec223e58446992ffb8d57c2e67447705ec600211c54fe6e9066888238c0746ddee2bb70e2e820e4e641f5f75ff71c0f0f5e44025f4b69ce77d774809ed7ba7b078ed9266785554dd93dd43f4da786929190ec3ac90ef1b457c83cac85dac2ae1661e3684394ba2846ab9a15f2ec23d14755e6c3bd46cb8bd19c59f87a57cfc41a6c5d1e8fb53d0c3c2e5cbcbd749e6d9aea98ed727aa8ead0b98d36a7ffb58c071716307d9a7898f120dc125653669ad534644908ee6f4eb23904dbecdc8349e4baa99d381e3530a33b09098ed1603d290d136a442216e73bebf5526c760261c447b08753404f8175ccae04d27a3c7f67c8274238cc5dd045e36f097f98b4d0622abc6cbcb36e459e8e8eb1b9f3960e5502d974016b5642d9a880026af552c950f4f58805f49a480d", "0065636a", 2, 1561332473, "59cdccff8bf3889a779ef1f6c1a73d00f320b7e9c2ce050d4912879224454f4a"], + ["030000807082c4030309f3c2233a1fb4f5e5bc0f3bd14cc9dbd14cfffa759fa2f2d5c8abdff8149dda010000000665525165005395f50c8f7dd64e874f01eacbb03e74e732aa67205425bdaa77db4c8045f334b7237d194c00000000025165ffffffff55484f27f0ff9b1887632574166756bc896008214e2cc3a45efc480c8281a2e701000000009bf8f7d302e3573a040000000006ac655352636ab44c8c03000000000252ac00000000e51700b90114f58b01000000000000000000000000e356db2b317da20079594c6355ed6128673a26ff1719f74c4ea82760012b9adcf88579b7166e4706281bad02d1b275f8c18355155f48895e95b694a1c54839571987d9812e432483156906518ee8b516746674d93c376d3a02050c2151c6395c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009cd23e58e35103da7637a1f0959bcd730a2804d759b563b1b3356634c06c1098b00555a88ec15386616189b645a68dd8ee339910815f00024839c294564bd9ee3f04881a13f18248f39ccdea686ebfbfe847c04929f9e6cdade5794118c316e673721e8ecfc1877521576f51d335f16feaaa76e6ffc71064ef40ae0612146c8f0322bb287c91845a2f51ddf9ebc11254663a7f9a8b2475a65f4900840e081faf4c0309a8951be2cfc434053a0315a999fbc8f24a754ead16e682f98fddb80d12ddc80a021edb7849a4e3279c124a7cdcab6f4c058ae296640f9e9e40ea73dd7c2c65f9abd995c4f180e78d2082b1c86452985674599312cc118414f82d1062c131ad93031b866630de2caf72d74532e735914b6f8e5ae3372d0bf9b1e4de001c4d0ef532031004d51b74b0c6bb2fa12458c9d9ae1a5caab54483891cb1ff2abee8147e75460328885fa5b7d9450d99785a3811fcc6b0f301616d6f0cc1d00abf25bf2d9b45290226edc8314e3ce903c46d567a768b1da397180b181417fde5f69229157339a4e10218993ce61948209807ce160e3566923e88a9987ad2a3336bf56e83f56c114793427e96729a9f22f036a65ab0e3309aed8a2f317dc836a7066bbcaa6b3d62bb27ea44f002fd07e1d8b8c3e8647f80d9f4c77c1dea0e84158442b8ecfc0d5b2c31e1cd268e826f70a10a7795cab1b9f09973eb48242cf9c93b4a5598be588995eaeb3f8524439d570a8ff85c2b13a95b888bacd790b26bcc6ca94351c02a8f72f778b68997a9431ebccd1d01f047bf432aa14ef1c042ce38bc58a9ac0aa25a5817ff3c30134030f9d78f6f2dd7a7844fa4034f37d0a443455cf99f0b5cb1b13d737929101ded8eb03de96e3f0cae41750715c6d7c310a44861b478a4ceeb32e4557d534508241704726b125c1a3a49b7fd145ad9bf6cc073fb1d719b94009fba4704e0754d16596ac706724b1465380677b561515d3a26579f1e6536f2f2f0b2b031c6b872739509fb05b69ee77e0f831aaeaed1f4e9fc761753d17fa0be7d22d105d324965da7b027d5cad55a5c1781aef4ec1e8fd0ebeae22662709008f22dfc4c0f659411b9382ab053e4631351bcf2869d1b6eb5b15c750041c44cb255489431b9277d1b41824378be8b74b3e57080f0286f99df02cbbf0fee2d8332712b1f7190b6803704f94583a22abb0b5d02961ce78112dc55aadff544652790da5f6314e506717523b87ed85a6d8ae9f6fe8808793be517a0b9c078e8486764830f39a91053c587aab409b5938647b20858d548e2383aab274734b428ed9eecff7677680a84cde10575b7801358ae8702e4300f2ecc270a8df9a4fdb113c8e83b49500a471cc63854e2d9f3bdf3315bf15456452a65d680344b70f81d8a2bb7cde9eb2bce01d1dc7e55de8bee5e6d3ac50052da5c4255e33668c5b6be535c5bf59565cdb91c8f8ebc3f5cdb127a4f99fb802e493d55e5fdebe1cf1faf51e941aee6779a97e0dcee91666cd4cd99a78750aea2fe42d31b0bcd7caeb00d28a488a2c9d03c09fcc2f2f1ec0cdce9a189f20b9d3fbdd932fa2d0d49220f63ed2aadeeeccbe1253af17b154713636f666135706bbe0f292da53c888134a449d3cfa5ccb46a110c955672227b1c490daf41d35d14f1f461e15dd65ae3f6370e986c8ff116d1d9a7723654f5efe1f058459e6bb18a12b45a744d68c480b5395dbba3942cc8a6479ca019e7dee0fdf987407d796910dd6bee1153edde1581a0ec3df2929287c10ab70a6421feadb5964293b4f71568eb55016368871293140559d120ba8c9bfed8b340bd84c8d8abedd5e75b004cf808b9fef9507c2b30452ec1cb3b702d7c5dfc4b85e36772761f577f4ead2284d2fdb216e33b383f1c72ed9716d6be2a613a2e2420e2655789e55572d0c41e91ae6fc2d636ec0a059b9674867864fd3f26cd93f03e7e3cbab45eed8014dbcbbbe6fbd3c808b78af01661dc6c8a0b2c1d8dcf16ac85fb0e5a4300f5091f1e1502c8e0ddd8a6c80569cc76d55116652ab7cc4950bd02b80b3eceae9654d06e0fcd3e3e9971f5a6af9eb7f1c01cd2552bff2674229a80e47cbc50bdf51cf473659f954881099a08a5ac54e0f158da608cc2c605ddeb580cf0fbddf5387fbf2416cb4896d4be242dcba18b705f5bd1e6f88157bbdd0fd25607293eeb4f4451417c09a2ac877df3021fb8472cd3430756bb2d1f5d00b6cbfb68d386bee4ebd934df57addb9ad1f4a13d045047dc77c31c925ce5e92e1752b862fbc131f3b53386968ac0802a0c9440909a99c9cf76cdf3b763f18d40bcb664621b0de4e65bc726dd8c2d8edfa1a98338fba556cc3b9561a0422d42851311e5cf491a546f39b146dc47cae352bb58d9c0e69776cbd354d90a3247bbf674abc407b053eca1ea089fb531a7a55502", "63ac63", 1, -1260553995, "10538222a6ce5b1059cd7c0c6f2c313f4258b102b27e8f00f93e989a313322f6"], + ["030000807082c40301fac665a866086905d6e8679706edc3a3a3ccd787184108e1f5977c3683ba3aa60100000003525163663eff8901c64d53040000000001009c4b0e9547d6fa0b00", "53", 0, -739251193, "14f638f1617bfc484fad5c5bb6f30c3c145b1a2a422bc9575ce845007e1a82cb"], + ["b5a84c2e04937fc088f52b9701d13e9148801a0a66802cc5b90fee46b00cf184bc1dba60d8020000000852ac63ac6a526351ffffffffb4ed3cb0216acbe902a8a618e5ec3bd0d10b6b943fde569cb326ede80a30a04501000000016affffffffe7f1cab5585191b9a17cd07daa1d6e2457943af234b42f14c5938f625b018d9f02000000030052650fd1c83d29b4dfe792cc054953a031285aff5f2a446c38752ad30482932314a7eba481720000000004636a636affffffff04a699db020000000001ac10506d0200000000065200536a005192d426020000000003656563d3646c030000000002000066b9b5420200000000000000008baa73040000000047b78787985555f3b29bb93da5f7bf1509e290c5d3d09b098eee35aa001250339e0e53a763a3c64564384fd8b3a7aa62b731bdd1d370d46cb14d1516551eeeede6a19ebfb180f9e45f9fb942c24bf690c2bc5c7123eda191f376ba4d7a35866a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000463ee7024e532f41dd04c7b4280e1271a29ac8b52fff60d65e362b00231842887aa17a31092a7f1b195a4775b1d04f99f180920f8b5201e14349849e21df1bf8e6a58435ff9f905fdf3f26a788f7f3376624920c9f11e4983d5a9ea298bddc86877188529fe9516d307b95531bc5705147da1dfd032b174d7614a3eebb4b61710210a0382f282659db69c10f5943d99b6336ac26c04ad4e3b539ef43af86edf63b03129f2045d63b3e3c701bda8921666e6a2beeb9732af70398c3536b963a8e02e00a08bdac7ee61da7f1940cac5a2a1f3c4a0b22d692f6f17d8b13db3e381a37a0fbb0564c15e26f40e7d02cfb51934daf07f6eac32588ca8aa314e065c101558f80030949fbae9c9ee138344120160f5acfee1430aedb6e746ea8eeac229b3fbd726f030756d9d054548450fd4ec95b8cbe77cfae9b5976cc6068230bb29241226819a70305288460d13a75dbd0384c11a2b13592c83b519f3562c6a62ab3a97da5538b6902210a3c869da94c1082454413072c49acf09d7f7074d2b67ef35fc1d40a5e9e0a0213c68409fb147d0c6642e30f56af92a40d9db38343b03242307c0f94142ab07bfd1b9116422009267dac3ba13000ca3ee0cccb56a1cfa90d0b7a939f71b78f956c9f58bf30455a1706df7c6c919260fdaadae4e71921f409dc60ca59592fdc3e942336a25ccbbf98e84f2b467ea55c48770f91f5be7a6a607c4d71cfc75dc65eee38f2c6eae5e9aecb10946ed7e70d75b7f693e6c3267b40db994da91e1d6ab55a231f0ea63fee18c77f94cdc5ede769cb2893e9ddf95740131cb715ef4eb56f6e954085fdab876afe5d2ce1edfc905f9e641e389707791d9fd6357a343d15a7f89ab727e4b0df8b261c945551d92ee9379f373ae5b131df2d7bed31cd30714c3617ae01cde6b16bf4728dd1b160c883d11848517a118a23a1e5fff2d5b13aa07f0d45a1d9d9ce905accc81601c5dada4ad01761841ad138e84cab953467f3c56f474ec02abcef58454fef1ff600a1a5b5b2291eb97a343b6372f1de58e3bf186018d57312dc5a77fb1bc58fcbc02bc37e841f80850dc82c16e6549ee3688fce1b0dd687db17f2021300afbf1d634725c8b23e15edae2422876293a456dcde27b65c23efa970c61824cffeae27786b4db4e9df28d8167b7406d116acef9e34395e9fecb60c26e5be01015061bfe472d6e7b7ccee748625a6fd7c78551072b97cd348e1227adafed0f22e796c216237f8d6c7f3990dbd86c6d2de4ef38c9dd00b95421246fa0b661f409584c5946a67b46f892d3c847502d2ea64882920f8d22deeb1b36e9d8919cf64600193de40f6cc89ed2dcce3f52d01c6d9756dcb64807fd7d662da785df0071be0e31eee8342ae2c1f836115e1bd373d6b2eb64d2af46820f1946a01d5824836653e0afe9fb8fd94c994ebac6a2acd81f4086c48693d01c96763843a720da043cd3d967a8b30f403050cf69a5bd17119edc91373a3ea42db99b7ca66293a7ab4ff47e619007963f73ae2a7bfc8874b06accb96abecdf53945691bf6bf1399b547a32f4e117bc44003118a5d59b4a3d1e632f2bda0017d76d266bb185be49d041884bbf641a80947b79ee6584adbac8ef08f8f53639eb4ce94a066594b88544a85df0778d030a2c9ede7a8396b069a3e7cb2f51d785a5ae3b09a828707052acd8ef6380bd742728207f2d8e2db1a8a46245c9472d4832702efa873e71f88b3714ebc421abdcbc89dff437052c64ceebaf8202752ca082bac49a653fee83aacfc89dd7ac2d6af231ab97a03ddf5de8c3400cf42b258eaed0fcea17f925444d213478f53e3715ea383bc6adc9b762957b08b4b4ec396ede43a5a771acfbb98ce68bec5904e88f47923ff0697b56b489745e1f60a050c3694cf62c5a8917676296171b99b5a0c1ba2c5e92e1e7af9d9408de1d37f4000691b98064b2841b0c06536d78e19da5980cea7916d0c479a1bed9b732cd56827f44798bbfd428552aee35a3f93571e5978ff1e2d695d21c2b22c2e02dddc0932fa296d44af586298ab605b2b11aee07a57963559d00cfe659dd2dc42bab3f9fe252924bb5cbb77c2997184a8bff10085bfc6c096560ab417038dac15f93056a6ced8ffc7f16d2d2cc4adbf5217ccebe6dd9510c57e92d9dee253fc9197c053400f2831c4abe72cb53c48b07d95c6582f7f1aa75d4c076a1eca70522c2a10a951238a56c43874b818ef868cbc953b68f8aa8e903e65ea5ecabda522b8e58532a08ee95fa2059d6d0d28ed9c04042828dd68ec319f6d20f5b03000000000000000000000000a512cacae7565d39fbfe7a001bd71078318d102510fb2bdcd692a7bf996fa33aac47b7a5197f55cf7104af80622da2671405e51902de69d0528769d275c9f07855c992a0f75bb275c9466b0b45394de3ac7ceeba941af8ed50c35d9e579d49f6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004dee37ba0d519250791dfeb1f51401af60485b96d68464fc12e7f50542dd23fb8304d3f88f33eec6c5f63f2902dc79ff86411f7d33d25202a1a2def62147ae84c501238238a288d72bf9befcf8f046a47c141d8c780b9e10033b9e19f89dbfec851e82b708c3c6e479e6dd517769df9ab84ebdf3e402b496d28e70d092cc839d02137362efa22d101445a3e9c4ad484d186c60ce6f8c5d719ad9a82ebc2885fcff0305abc552e4d8303b702cdfd1b00c0a3399f63cc5042aeb7164b3f3354da046980a02502ec898122c3982b656b2c91fb0e543b3a2d2c434c5bc8f0440d0ca07eb7ed12b13e97ecca8cadc5ce072760950667505b7dc78ad55cbc9d89c7e8119d52c0205725d1fe89b392efca51aad99554ef2a18ba752df66219e9ed64b264577a008020cb728508b577d20f15ade24a5be0ea048b847b8899088c0c8959d476a1159340320fb25664ece7b61c39d424634b0995859213154ebe0d4c5cc00a7d4ce9986fe030ab5201f465f14f947eb5a3f1cb07ba4c32cbb9506973ff85ca5d7a0cfa05a0c031a49124723f95e44c4ee3eccbdc8903b537b97ff1542ed28e18c3c8f5bd9b2c02310f866b456edf2277d47512acd84a5445f1cabdf7296935315151273e505fc3356520a33abeb439f6a80f633ce9bc7579cfc5c20b591b1686773c45ab1a1d6874a8e0f148861b309774763fad553af562b00402a86f06f2f011f236d90c4ed4c290ac4d7d735a90484a5e0a3a3afc8af000473fea3c768f6b29107b9cd08fc1c099964d6a4d056ac32c8475f64c3ac90f22f1bb97d3d57cfe941a84f9c7e2b6ef71021de03176929c42ab70e09dbcd45e1dd41001dafd45495dcb64876f5d01c9f631a69be014e6308c0bd0b16710403db8bdb734ac329c45883850c479fa4eaaaefad2665a411bcb49522ccbd955bb3c47b84c3ab7333d102c833036b356cdef174e6536845447e9fb8fa3edc5b88d5d75b0b183ba686a6baacf50411903ae4c58a8d6a69bd504235ad28d030675ff9bd416be991454a056099f967ef0d4f53c1b26657e5beb078a519753f155d7f87149f8290a4ff8d3fff2393bee70c7f9051d0714f02e95516fcd364a1afbd43e83ad18d0c1d025a11a8e0b0cbfe92f2d5547a01e3c13efa636a165f7f6133db450a70e5684fd124349317b1f2987b4f27efdc0faba8bb18f2c9dc756c079974cec6c542dd8085715a4e197f153aff2dca6ad0507cacf8e799e8e6d4e32eba141196e6c133e236394838050716349fb06840f78d4868e92f0892dffe75b41de3005a93e1dead106b61152f77017737b14f9994e7c934141e2a5e62a62b957c0710c7e335323fa4a4d85a28bc6a4c6a73eecf24e7381771d47030d2d082f326d4cccab183e7fc57aafc5974ebcd0da0fbf0bbd099bbcccbfdd994cfc82d47fc6e58e8fe5b0b9f5adab663ad2d41732fb4188867f8d775004a297823ebd356de732a8b6ab214e58c2233db21ede968f5a0ed1022cff50482d6a0b6bb99724dc50f0036dea53f42e120ecf54eb854d8afc3bdef56d3bfefe83320f99482448cd3a56105cc758e3edc2add047e18bf324c63c7246280d26045afb080364ccea03bc72477d6ed2ea7218f642d7e6bf29db1a132c65a7e1cf21947d2528adc67b10e32de568589306f5920337f728f0faa37fe16f3b6172a21c852caf00bac19fd4e346bf170010f02f116e52d7048e143bc279a514afde8ec64facfde6ac29cfc6ad2f3a5e42d07411d17a2beee6712ce1c7d09c5b0bb7ae59f286b26d614a8a1cc530ab2b1d7df7fbd2b7a82bf13479e664bc41ad4d0de1246bada2f545f4545d0c6569a17b7bb9cf2edc8a7fcf767fb67876a66a60aba72cb6a84b24d8b9f7c4c3521a3a7d22e164ebdd611a30b621cdc83e8365e26087e55602964d3ffa095d2796a2b36e74d398aa4ab52b48f2f24b0ecddedb00334eedf94dc006a5e739197e537c8e8d31c467e5c2da2a7a66847baf61f9ec71d58ad454636725bda51de7cd5c3215169672741135a2115b415a94add1a884d9ab8f51f1c4ad3139fb6fd34ac60a1155af145caf9b6cd6c03e70b935e19c3b4089ed61dfded8e3000bb5768f827507e19cc3aeffd7a724661e341f841d4dc4db307c0515b38b1a4fb0184b306f054ab5222d0d31924121482c0cf0c4de143d5d83e221e05c40f243ad0ce531d9fd20f799e0c930ba91f7246e2579fabeda9bb0dfe4752a30048e2224403fd7d1cb3ae40e9d1f569f0b681daf00d7176808f51f1047280679c0667752183f2c7b6fc3adb89a88d32cfdce16afaf1e7b81a70c2f044bf2046e175c51f895ad74dd709aaf3635966fbf9853739b420907dbadc166391b3fc5a446b450abd450eaa062468beaaf2dfe94192328f20d4c2f44a85024855c9f2088f4bc8c4e4109a0c6208", "6aac53516a63", 2, -1188894128, "10a70e1cc33e95fbbf17f113cdee0979ffc4c5d91ab1bf7c5db63f45e74e1b9e"], + ["42f0223c014e45e6da2746fa994006ef6052d02da6c762fe9374d02a53e99d76dea0573a240300000009526565acacac00520059afb63b0179b3a2020000000005ac5253516a000000000300000000000000000edb6d0300000000d9cb57be69214003ef088e54f020da5a7bcbebb081e1e9a6c7cc739b2dfc3e5a6f3369b9708c192413b71e6258ac9e34d1c7fd24dff24a9a4d0d4441aaeacd5b24024594fbf34e7e5328e882f03698d5e36ca97cad82e12bc933a047f8e7026800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000187cefd6e9ac2fa6aaf841c1380c30635e4648a0ffebd5c80601568891feee4a9072f96e632437628f8d74eb59bda6dd2a2f5d77fdc38be8782d6d591b75b5710d56759c0d7889f8cc5af1835b635ffa5788a85dcfa3f97d6259d3fd2d1c9c94fe5869c6399edb0b1cef726cdb4a0d6d4f44d1431bbdd8b777c83809e8f1d064031a35d9406a5aea7b033c02ae02006574800b97b5a3e6200a0f5f467def08580c021e9ee75858e15852d5d1e6fb7dc2974ac7a2ade13cb3ddc113de2ab02d5f4cf10b0784af72ae068fc9b1fc0bf33754fa3a3d6afccaaffc5a62c3d6abb89835836db5fb5e006c4733871817e9edb7c2a8cc4f3ab99a8d5c6c91cc5b93d3645c5ee5030f82daa54b5247f537c58c6ee6094d5af3ea39cc04598e630429816d851c1ff20313ab9f4aa5237d9bccc6400134db11e25a9c1689032badcb1515f825e3e299ce022a37df98a38f54213e05b35973c498ee317b1a6d67ef66424b11f7ab4c18478a031a74174de3e64463c29f6d67783a8c103d16108c7d66646f9c0730415394191b0208b8f018669999b08d83584f7db9a83fcc1678b6a04219c04d2a5a205d253627fb3d5dede2b1be0dc1dd3e858b5773a076ae63b437565a334d2d12f6884f000021896c9f6ba8114e17e35100aa45abdb85bb7659dd27275d4b91393e8c46f0f2ffd5410e207a3e4fed45e744b0db2fc775560599aea5ca474ed5782e4699324a99c11df729b8d644530dacfd0831ba6ca2d734cf83ba06b46cbd8c7a25f20dce7a84324bf89d5c9bb36febe7b40df17b23791784d43cf31fda7d2edf67be39e23c8f4edb2a18b33ccfe8e86a6813d8a50f3808284306dee2370e70eb5a47d1412bd010e5784616b43e0bb74c194a73d7f3fe992de313929f0c342b21630ba6ee08371b4de9dcbd7b00e2aa976d7af3c29788838154f37d8095c74216eb7ce5bdc2f33fb9f2e78b80b0ca1549e883cf735dba092f715662df87860c3df8e5365e20d9720ae1d4bf3b4e31b0d47059bf0dbafa80fd34f8c949ab16ef36e929e4df2a0dbe56f0ef926e887049f1167d43e0e77026e2e421b3e55daedd2cce9e5643af45a1cab6e15d7838888662e246a51131bfca3e33fa24f6a54bfa7157ea9fdfa124a0af8ef8c275a0acc7846c834528bcf4e58f5f080d4fc3277ab6ed95ec93496250d4ee1dff5f3929d6b92e52cf655e17db33e535c26b182fcb60527a13bbba197e75cf7a98ef474d81ee736a47713f10f78e06e293fc5ebbe3cbff80ff37e0b906d8e14f9391950a8363866adf838b71ef52cdecef57cd1a0dd07acd268459f4c4a12fb0c58934dedd8b3bfe7d8deda6a21756b7602373ca7f9394ed13438b2ccd303682c6f70855f6bff37c245fd2ef8a8ba9da32b62b922202618e3c8d76093a8a7c7d5573a8ce3fbd68ab2d11b42ddfad01eb9f62a114fa19b96565afaf24770eac5e64b4da7ec29e65b5dafc2b5972e283c593646e3b41e63f65797f261bcac157ba8ea75021ccd2545cc64ad87092faf37a0cbcd4a08fc44e1826cec8279f5e2ed91bc8589182e06b87d03306de1132bdb0fa2c9e3e0f615e56572a1ef0e84c6ad956d91c3134026a999d06f6b5abde1a5de72f3f2a6f9636d4ff499d0746e883ac88f49205a3d583a379f39b73b4ecdcb57f55c871303356348804af78a25977e2af9c20b93e8fd69c6d770c1958af3499405396afccac2e23b0fa3efd3b52c4261959c767b0815cb3b82d866ce4bb5f1f1e80cc5f601deb26d7fa60954207162c1a7eb5c77bd84805edad7ab855629ce0c5c77137b0e3d569f7edacad4832086d9107337858aa77bbc87da6d4303537b75ddb625aa5515f09a0ce47cbedb70b3b2524f62cdd5a894ec578ce47f2484274d74f021853687c4bb14878792cf7c728051e216d113720dfdd91d6847f470f911d338a8696c1caa575230c1de14041304059125c681480e5f5e294ae21468cc2abf2171036238799ef0b9e11db99f8eafdbae358da99e1e7497a9a9364e3cb6cf3ab7cf27990ebceede8029f0df83b1aa0d62da561f2a9267766af41b545d56af82175de2c6da2c241b301dd5142c2c03080e46c8f38adbb49a387724ce87bb30550cb69252a47321f02ac1d45b88c572142e8f8debecfc8d4910deab263681453338eb309636b5f715e353b733e93f378c0c1c86887aaf1dde3e7bcc8d7c93f2629d7468be4303cc324adb64dbbdea8d5487850c0f923abcaa8ea692edb3b5593ba1bc89e757401c790a8fb71c4a1809d85b25d12e841f0d540bfd7d62f3b0100000000000000000000000071df170f4f72e10af6145931956a1ac26cd6823450d021c121fbe6832e8c37c2a5124a2bb0b9494268e60ebf8ae22260693430e595f99247d653676cf6f92804ab4881c180d33690f0fd0efeca614ed30c6966bc6ab7b0b4a4da0fcd24c76ca500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fcab45f39ae127457ce91984b480a7a9366455ddb336d93c285cf1802cc958fbc75b880ed8ff6f954707fe2a35b012d01fddf26a333ca2584463d04d14a7d5de606d3c5ca14b1fb1c9a4fbff1b959083623094a3e85a6dae0b093eedbfaa584a5506420b350212719d5ea190f20972319d8d21105ee14649d0dd60e39ef2cd380210da23374fab89cfff88879cb95f5c2db16a44149c6d3a8860aea9920fe105480225165481d69679d378623dc4d346e1c5fe973c263b1d75ad47c44844f63815840a03754547eaa901d9553c572423327c70c0e0e5b8af0e7ba71f905815f1f7addb3e7342d9c0d874bf3b9b493c4c002a1eea051af3bdefc8b9cadd4052b30322af0318ff3e1caa76913b3ee89ebd1f6a46c745082f854b8ff0ca2c5298006dc95a7202070084d0fb2680cb6eadb622642fdeb97b2dc98c30431280dbe456509a69782802210f79eee16e72c8712f221088ea1137e7ead02eb5c705b6adab041df9c0e8e0031dfe7d99aa5a56307021e14346b6b20167abe8fdce8920c799f56f2fb3767a00030c9a6c41781420d347a95cffa775f4cee89f79743c1b17ad128ffc94d490de6ea656725385877fd59d7478bc4986912708ffb8f6e67148cb4af5407fd518fdee9de418bb149ef3353d0528cd69d5852d2fdc3cf6818179bac59725dc61cbc2bdcdd9939b456f42790c53d27da3d42c6378224db412f35264bb99e6189b66f006e2a4b956b5b9f3449c85b9be117a66e4172a2840336424de453051e1c3afccad1566158c03eb1639b156243cefddc0b8c3026ce0f9e54b92a7e634581e0b5f43c4062303e5a026ff1522ab1aa89e1f07da4269ff756735732ad0bacae97581886034784175856be9b0437787ef993527e439c2c02b4d5b35622dc555453bd039d669059c3c73f124d4554a49de7198024b501a49593a5610c29effb689851e0a0ea630b6a5e9f72d5f5d62a09a7bdedbe33a0f02c3134e553fd52ddb40741cfbb427f5cbc8e7a10aa4599d2673746a83288d7371f2cfee092281da5ed6fa3a59a2e0c97a353c943cb970bc1bad5a8ea5d0952ce47c9764429a5105fbfd410ac3a0d9a46ff3d67a7efe8b8ea40593f0674fd49c29fec6544379a161ce531916e27ac3f9112629f4b4ad63a32da6f392e26b7db9a0ccdbd4b2d88b751b12476cfe0319ac5f3b68c14c92e4fbb1d3c69e52fd312285d863b0aa8c20e215007723f5b05e734383473db500956bb0079a330fc2b0075d8f747d90968c44af745ac62a57fce6df2db46148ee40b53da54674167612b28bbff97f688ac0cece9f8184accacad158bb0b05f2f08024850f6971f2ee6170fd44fb5a99c5cc718b59437a6f7b49762e3172fe8ac65770a0bdda6137db8f6a902321a8d8379318328c69cffe84687e81c94b057c5cda0041db86f8c7194952b15d60e01ebbcf28e523e9b3c78d75154a85f10ad6cd7794a347da6b6eed9ca869743d02fae18625e06e2f13b08b99a5fa844b24f2c0c447c4274b2726c71e18345887731ce9c50324de1cfa35c755748166d9058eb3b6ab1880ae8a63a9f9b3041341b19ef5135d929530e80803bdb649e1988285182b3ffd80fb933dfa0020d5968b61e06cc4d94bd1fe3c1dafe5936d97fbc039a83fe1dfd497321109d06ab804dc039447460ab4e8f0ff48a2c6e1509e40155bc664af1dd5370104e5ecd7a7689c03ef3ba5fe0e598cede6461eda1aff897ed46236f89ac54f0e792d620651d34748d6cbe301c6b2df0600331377a47945899af167d67f0eeb4fff5000f143ab335094790c09b352526466e7e9858ae9fad2aaa0b128a49a9c0059f7a820f0cdd0fa5a152a536ccffd43e8ab7cd6a03206eb5754fc63f23f3b6db84a6e0af758cee450cf8d1e4d66287d6375dda342a6653b10f59b9d6d46f7650c630070bc5bddf1a0cecced9259ad2824ca33164bbc3da988b3140f93e083d0386d932505078179850a00b6ad687088761fcdb1160a3fe06488cc1b65f582966ae89eec3045ef4dd923917403089653dfedf7005f4e700e87a7eec042f9bce4acc49245e21fc6717ccba2d1b5a8707ab7eb91a262117f302fc88e83e8a4fedf197e17d360146af4d79a1d1d90e39cd533c4cdbf9549e0fd00a74e9b595628eaa25664570d31131da46e2131ceaf7e7385412fb43c8decc18571b99f065e823fe31cbcc1c854f6b319d3bcb9e9b8ee4075684554d1fd9f9be05484282137ad607985b374e6de2a96b8767f86b5f8936e349ca4d99ccb54da8bc23bd63eb56db174ffc863be87010000000000000000000000006ae8a0d3d127302e5ec370180f9d4fe1f248483be93ace8064f9d92d1f285aa0f5f5430db1faa29da3e515e18f1e69317447da1109c9999ead9439d6b025a3ca790c81ef800f6c6357f7d34d38196c8920d36e2585ad8f29aa5300591400261400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f634081ebf5eda8bdf67f33e90810ba8e3a0c091536758db961b273660c190e6b73892a55bdccae139470bd26ab59bd0ed9506c926fdb499339999c503d9dcaab35a874ae1aacb53d9c7ec30cccbafd7586580e3368f76cd2d3dff75f5aad83b8eca4f4bed2d0b8bcd26f86463a45f23c09f8a124bcafb1b146c7338153fa38e03120d0b3689f943b0edbd3363ca3dee519e8a74cd1a606a01d245f75b1bf32be802064f1e8e588a5997e7ab133cf38d26a997c7a7e385a9cd3051d743326fed7be00a040df4ad01054d8329487e4e07541a28ea2e08a1172d2371b9c9341470fd5eafed2fa64760e79e38da6c8118b83d095161dbc4102df1b9ef6186c29dad06ffc402021fe7d6d28880549c67b08e0c82e33b12439362acb760871f2f6da32cdfc670032bcd24691cd0a16ca1c480c9fbd901b416e10a9fccc2b164694666363778ca1e021f6058aeebea95537852d8ff380ac3ae0f53b088ed65fdbb42cb5d6fa772233d0223cb5d31544db3406c3a8c0f4db15631bb42292d009b5f7a63a813707562cbfa0311d454c2622bef8236efc18700c53173e14cb63d0eef76b235107b2102e12c6fd0bf4ac1fe04509fa01d7c3d29b01de7f2c671e5ac332870e6b2751e86f14b32d733df270f4994bd916195fb41368bbd6016a36c324eff01a9a83777e753ee3d5b66d967893d1731ae424b59e53342fd80c6e50f8aca5305919c5998b5053b309fa7ccfd17d4e3e844ff688f72b3119e482cfd93a032d616a1b7008c7bbe23e560aa951523f411c9c820f4ae49c8fa236ae1057f8c71d583c14c2abd61069b07b202142f9201f2404f6b1d1f8de58e7025dd0d22fef3a679eb512f26c8aef2ff8d4f9bbe642f6a9f28a8d14d1ba4c637c1879ef27b8bb7c2534392b3cef7c25add84c6e6c2c44d8601f7661884c90ec5f7a9cc4694307689410ff8ed1669a1ef0c168a7e4516a899f00d3ae3f64eeb093eb523d6113010f173afddc6ff741320a7f7b122f962c35d0f1d50f2d059970241353bd7a332b2ce8fedb7b91037c728000aac71a27e90caeb15a862a542235ac507371028e23915b9d8f9472a5b896668ad063ee1ab3e997c53509249dcd66db54b2a59f89159a1279770a7b99dbafd8d69f878398181ec6ff17f6c36a7c1c2583507d25ea92258cec6c97bf7091e9376d3f9e82c9de69979dfdac4607aff8994fbf151d1a1552fd37eedfc08bd70eeb4d65961b90f65b4c46dd84fd4df2e4c38ede8dd0ab278072dd9599ea8aecfc9f5abea9a31711fce747b1603fe63138f4389745f2f8e21b35b3812348674f7346f9409b51aa84e5b8816bcd050253a7abe9c034719af29a0dd40e5e47df42d168bfe5410bb3874db5f0931fcdffb6bf8e4cd6625c04da3834111a0ef95eb7e1bab7a68fc67963490f6aa3cad0833023e31bb1d049463b75226ba73317f603d9d9c904639bd985e982df4d9b285c1cfa1b8994415d13f7916aee78671ee9611142860c84bf6566c085f553828df3832353e3bf0ffca4a049626bb093889f82434fdca625a55df17144cccaf7488bbc9457c756bd041c739c5f44e4ecbf372a12966a3a6fda3a8284eb57c03fa105abaf86a0ff6dd06f19b3c47f6facd96aa1e849d832591dba1d660373725daad690b357bec88bdbbd1cc1e714619b8d4b46e69d00dda59c79f14e96469e8f021acc653cb64860520bb91f38a704935b7b60f5eca9586f579b7002c205530264402101e35d734a9c22ada59876c0043eab8686f67bd1e859660f99e9c12cecbcef10fb7921b81b61c2a0787b8991229ab6fb0cabe40bd2b0b2cec904072680d62fcbff6bf7f0bb545003cff78c831e464cc0b8ccfda88736ae79652bf45c66246fb6d9a4c066f5b44a3e078e43141b7fac0f5433d6ac555793b9be3c3eff0fc4247f3daae189c8f45d341207b6da4bf31729bfd0f98b4cdc4dd977de213a552dda4390cf71657dabb3757a254787890168030b17c92e479656477f605065b87fa6bdc7bea612e167027ca8c11f4de8d4cdf8ee0af25b1fabf596129fcc7a639881027f8d63a392bcea78a959091a41f9c022255855b0c8a02aa788fa25a7e0b1d1d9482053c173c1593dc7c024ed82ae94a1de45dda10ebdc21c987e59bda861f998bc2186d4eb9878956847b79fc90010ddeb41f202f6aba09e9f59ed263522f9b845cc72a478753c4ed1657564bb98b51c881149c8efb42750b9254e163e3f44e07027c2f2ea47fcf1e6b10b23d1fc5355c6c885fe5d7708148c2d582800ab51f991a6a2c4c7bc0853af402b5185917687128177f53674b2f8cfdf0c69a9e8ae4fe3bd607d0f7250739759bc0b0854d8ff7a8fe57a220e7db022c0e876c85cf7ec3589d3a8379cede27722a72676f27617b35252b4192d4eae6c436f0b1bd50daf5d6460c", "526563650063ac6553", 0, 1902793955, "34158958fa20b13d9f9539f7a13f4dc61a0511c8ab61e475ed55e3f01c743a07"], + ["030000807082c4030289a614ab40fec3473380bc9c94a8443e876d80b78579813e4e87261abe9c11b10000000000f5324104e063ea73c72b3b95eb892a48fd8af55837d184c704ea8e4944254e59b9f4435d0000000000ffffffff017936ea000000000008ac53516a526363528b8183c634dbbef0029dad7d000000000000000000000000004b257669832a46194e49a67f0d003e724afa780dea0e30c6cda1a14d0c911909927766e2fa58180a9e8324a49f140ef9716f02dc4e1e827ffe1106cabe34f5e7df87c1e3ada3d932d13b6e6bba40913b57687884c74a04a11edff5a3358f2742000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003bb43553ba69b1ae63ec9616626a745bfca95d180dac643db0f8f840a72f77a60a84e8dbf7e9357fddafb64ea0e9ef4c3f2dddb72b63b85a4fdc6dec6bdcbb9115753d17eaba9c52820740fadea1c14cae10d4fea03e51b07e772e46d8e48cbb3ecc0736229d7ed08629e251007181489ef2f886799bc4227ac6feed3779de910202a35c3458d4759f6e6f56d5de8577bfc0f4243ce5b9482a69c93262270b56d9020c80a86c0a928faec37cd7f40a5699b374a780e9121f1297ba9f5eb81a02296a0a03d1a7047923feb4cb149df94aa3373051b2a8b4efb65aca97b854428831dc485744de9a9c04652ac76c86fa78957aa67351822ac47584e752697e6aea84f7e503225ae1b2e1e6f1158b68c14a111d739d9c5e13d67f20f5aa08f5565b7d24ec2f0310ce6095598893b4e0ffe7131ec1a42fd4f6cb845b857e3d8b4ef16ed32f145e032f8244d468eae67a6e737ac545e86a65bd5ee0dc125e86efe606416ae68c0939020d78e03ebb71217d534d079fb4b3561f5a9e9e40ec69194767bb1b91b4ff6cac020b500e589561bb29c0f642f10c4c033cd76c7e7dc5c8a0b6a2f041ad8ed2512185991df3e4f5be6ed2129894cface49cb96a054a2a709a4172cb4ed6264ae805df1f625108e67eb02c1279c5610c48e9abb117fecd73a879bd5557be6abe0cff74dcbe0ee86b6d36a449a9b9c63d6248b49eb8f87119dd989d7c52ec687eb9f41be68e36f49b8da330a1b41e7b62e458b47cceebfce317e208d27b8aa2e161a6f1e8269edae492d83e150c2258c36e9f5161ac9745d6d00f4fa72bf42a7288d1f31a28b026c34612419ee66b77da193ea150084a9c8de8b155467b59d62585af690fbb81967764883dc4006f1b1ac92b9a648adb08d687803338783f3f79a0f98d646d6ec7e50a1cc79235d40778cbb11d6ae62a1e8482f754ac45c39b65150b8bad0f28b7a7420d6812074a2b42a6e840c331fba353f6c2a94b616553582b108da166675fc2cb89664f398a397715951f4f62800d3bed409170036e3b1e0b55cb2820e40c3641391e727a35668d582a8c938263b68dd5ce3bcf94468be5cff88c3a70c0f500f0622c747ce1e7f7114d3f52797081a83b7dbb4b2ae852c746ee1d3f6c2f490c6269f40ba70f9de164ebd4f3f9713369275617dca67d690d6569c02db8fc16a351b4e07d47abe8f4b02b047cf1c0338b2d89cb0eb5a5ed349470262621e5164baa11d4f03d113dfe3b4597621efc4d1bac00ff24e094aac3ac72843637aac310d0d10176101b1d9cdba7d062be7d2c847e0dcfd36c808d06a55806d52b6c5744b244e03754444a233939210a7b4bc0f53d4d03a737f71f49f9dff561eb0a69f185c2ac02957d28b4575932ecf06016f24e2ec4b7cee72bc449cd5f8d169ebfc85e7598e53d97f8893d4d5371491f2ea111ab71b449f9523c4da320a97a1fde2a2dfae1a05d8768b6078a2658b802b8679187f647da4f0223c1dc72343deb695700636c710976c58a0ec62f529b80c36231499f60869165cffb21f82c3e672e1aa7426c9e96f9806f88e0eeeaf6bcbc593a75b07ff5f5a48dcb6d4fb9dcaf986ef65246fa46c5500aaadfd2cb2626618b7e1f910d2c687ad5097668ed632e9154e979b1cde4097f31c6597e81a325a0bcb983b3dd4458423673bee0ee260ef27ede7bd8112654e286cd021964571daafec991f9c33bbcc0ac4e009f7cd089fa2fe89b526c6c6d606ca67252e706fa6445320ccf8c5b56f5e35e905b4903e16b4c651e97da9c5fea89d3b1ecf8c8b88038f11b913f029f38c9340f2d0484015c5f34a15f3a44e86d00243f0e531d6405e442dda709666c6cdcafc87939ce0f8d6c9f9235e6233cabca6f4c4f1c98655d4076550f86c69c0b86e52e69dafc9d28f46b0fed762b8379f2f066afeaae13c4ddcaacdd2dce66a98b791b56ece681035785b06d1ebab72aafef25c6de8b29bac8893a1fc9cd15c6c41a6607baee335232c5df31a5465755294b71d210b4eacef6d552a3e1e10828800c72534494bf4b348598ef6c2dff86d271dbcd387058ff49cc52e8640c19e437eb84d3231c14c79962392c7e29336e3335d6f4fbc963a91d3a31f964742e233ab99206b52c88bc638bee00d2ba005f71db02253fc1d672c786fc92c24f1d91f3a41d9f88d7785acee2550627743c7443a729c0a893d12e007a22777b709ddf774f5c48342ca4c4f475777b8c933bb7a49841630b5b7c428e7543a6f3f8b57e75b04f1cf73ee5aebfdfc6e2a27c19f87a426ef6d70000000000000000bfaecd04000000003b464385710a9bf0efe90a0347c332b5c8652153dc90debf38b13eca5a5d13f9995b8e4fbb8f31ecb54cb577a09a56af4a90bacae7e7337faa30a83c67401ab4e5153695b624e9828c390e736cd901156d4e19e35bf513bc4824a91df26fc810000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005134a6a1b357d00f74889c2859c8e5ced4a1037ab27d99965fed898c3f6df4d8d42b59b78b6940c0ceda01b1473a77f86e3a1861f96e119a62521e29467285f408225e4f35dfa435129baf8dabb92c0a7d2f85036b2900d7860cf03fbcd1d0806abb43b626048be6d545e84a75d32ad25a681137a5ce7ae21c6715744f0c56ad0315a25dbcf9b25ab5979357e8250d584c209eb94a7134712484a845e18feab012030125b9c35d33dbae2827312fbcab22db29e7b4208bd25d4c9bda72a7b6bde0ac0b0224b3474cf2fe474b59f9e9e63a6e7be5dd767504d9a41ae5227f79e29b81e4c0593fc05d5cc3bfb862393f829b685742f9b9e342ef4525c39efe8fc7d065ec0326aee1e7b52b7723260ab005723c3e5a7f1887e4dc03bf836ebcfce5a7b5307e030d5604be2745cf18db745def5c6f536e78e7da6ef4c798b13a42c1f2a2f741610329a5a252f2bb57a9561fdd07df86eb81ad32bc096c865eb4110d125dda3f47f40211291e6b56219a93d0fc32e1ae94f0487c1bc4ba2a92225df64f6dca6abbe6f00205c8ad1e2113e17e554ba5a445b29147d69dfcb408c65472097ce41ac06d05e524715ed1b69c060393f2ca2e17e2f9a96d855798c5476de3ff21ef12aa15455bb4630399935e0c4f00f75e8f260dbec0ddd4e7183d4bc577fbb514d62e8aa05e58d46474f0411140dcf78d14eec982338985897cc414263234becaf75bd3d9b98bf0c92d7d3452a4ab59aba54d28fade7e2dff3ea0b48275e7f46598ad27da8370e4bb65dddcf0a198420e8bc0116d7bcb935cf4ac08570c32dc4e0db8a931a8a8ca5bceb8e4aec545372adfe36ad1914dab355e7e1df234015a2b61a4d4d6267460790bb68a2a630c24985d3326049afa1e9c8893bdf549afe9077912a26f36e7b1e0465fa5f7c5b7f715de377ec988cf8162c11032545a25f5acf72fe9f91308c6a5b6c49908759d5da8a45c3ae2ec3909df3836c3b8818dd3f41466b2b9182623dfd8339f4939a5833fb6d93c0a6cfa56562607c03d590388be71ddaf81cb08d3a8124e6f9193b618649eed9c5249884af3d71becf11d147740d2d79af16be8389ba6012be10d3855f6177a6c51dc07b5f32b64ea7f98ed87952c78f2afd9aecbc1b60e0e177246c9bd9929f6040767c3ebb00703cb015f30a429c7e880659b8ccbd6266227c6a1c230ca49b9d358d5145a60c16dd5978d4976855b26b5fdd5f3c943b3751e191747bc06e863594026c2d27c996de96a7a73178f29bc9efa73f7fc25ce885df0e3931f2fb4f07122b6c31921edb31132318c5c998ec33b033afd140b940686afec8885b921e769ee5d1431d1d99fb34e6b3f1b389bb3102fe4585dd5753a0eb2cb80a2082f88c5b3be41751d220490082ec5047c7c4a968b291d2f73327ecdc3d8ea3a02e547e49f1dd2dfc801464d590e5641d8c13d0771b37b95b6d6155051629d16f0b2a3f8f16114db27e6767ea14b8eff3087fa188405e467b00eb884f087427e3c06c90563d416417b43370eb774d64fa49c6bc67942cd37b5c44da88f616485c9dbfe8317d86809fa11f487c1f21c36a4c8973865bfb884dc8c315aa0cd8a9215dc85fd80586e734bb105a16f419f298a82578279a4f2c8b443df78dbd244275bec96a139d7b613d68bbc93b3be212c9b574333763f157d1ce51fdba7da0e248b8476adaf9d7b56c108154f4f6b92ea67dbe29ef4c950541e16343234ff92ce061c22ef2b8ed88bbced88e8c0a61eb7b615c8d524ff0468e1f1ec50ab8843379b3558cc4f5752c09ab928e284de586d15b1a4f63eed3c405df93f25b46cb98815f5627b30a4df7d678ae97b2d9421b97bfee8b0a6cd3288187f4bc989b8cdc74dabf16e90f7a2c7001b827da0f03bb19f332af95df8af14023adee84a11e7ac23cee00a1cd8663bd5e4f059c069e68b684f6b6af19f7d338e4ddb204cbe176636e84af165d6325dcc824323f53e7f23e5c20d55cd795b9ed69e654eb5ac02b75dbc8021e5b49fb69f9559850e03621e8f8a782b72a68e96ef5a40832dd3ed54fbebbc5da64bfaf8b359ef687d6099d47100fe909d314f31080f4ebe322f63cea51e47ab0162957ed653ef17970a6d4e6bbb86b7fb79a19bfdc473937d8e8daeaa78c360115c430e6500b74d330063061dca88672a4b2741698f0ad58d53464a779fd4b5192ffaaaeb6e66e1618845b8dd379693a54152e8626a5d5493b86b80c5a64519efa52a324e4c38c13ed8d64f1eb1e329d6d60a202de2afebe7a838192f52a942e72e28c1f4bbb35437d40fcc1c7799f281951b3e2feb9828d29371e73eb0fd9b91f63cd57d59211b53ab238cbe75ef60a0230a6d44061fa7f2b6315bb7c4ece8f8f0616bb1535241a992bd79dedd21d10c3d8f4e20f9d74a3b003cda85e945a798fe00", "5353650000", 0, 11342600, "11233bf994b5438fb0f2fef37fd7fe5d9fe58f417823d74c66c32d2a34655a6a"], + ["030000807082c403032b7dfbe6e34e59611dad3bea723a7b55ac7782e33f2261877eb01b2bf093975f02000000066a636563ac009e9cb8aa44e3a400a74678ae5f742aac7f47efb6c6e07e42988d63fc2e52abe3b42eecad010000000463ac536affffffff63b72e1c877570967e50704bfc0b170bb0d99114b68715de5b5d458795fe16020300000006ac65ac0000529a7d66d00337a764020000000007656300ac6a6553389696040000000008ac526352acac0000e9281e020000000002635143e6e987e9281215020000000000000000e01b5804000000006a5c84d798cc249d16c87c661569a43cd01ca690313016c900f582499b1159b4908ffb5b80282447f01a302bd19f51746daabc1f93164657452239755d775afe9df88c91026c1d49bd162d2107b6694d7b94a749357ed94eba3c8d1d1b30b95500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b5788f88db6edaf55bc5d8c0a75e266a79380a4a9bdfb4521a7dc616c7f6127271dd1bd809222f47f468ed2c77816f70c25a072772a6eb5d14ea383f840b7ba05fcdd47fe24a5f4df04e0e0af6702ee409b8f1ebbf51c571e9307ce55d90c1e7056e3da65fdefed758bfb6503aa65d1b694c1be8b3ae3f01c202ae96bc7e4e5b021bd8a77af9c11a9fd7e2533dd551a5e68e79ffebc9461bfdd142714df3f4383e032e607f009e5578d0595d0d428f85f02762939c44561a777fdfadc24ef7ba371d0a05c74becc846f2eef9862e7d88a4c6da90d76cabe0ae640c9538666cc51317fba91cbfdef86c3aaf7ea5a438820c7aca975930311ab0bd476d5089c3fca09e47031484fd28d6c43f27b1599182ff3cac77f88c5f01dde40b2e9bbb551172bb29680203d119df91428c9c49a5a65a76867b839758861920ec3a59926d9acf5df2c9a20324ba0981c4b114eeede31fc61fb09aec7cc2af54e5a9349f6c8570fd96e80946030c6e4e791218f70e0b1943062f9fbd8681f5a43299d34f918b438cae85938d6902188b14170d80e7bc53f1cbcec66ecde196568cde0591fba0b6d207290f2170a6970df7409688cb4ef430be976e756cf70a6e4b09dc144e49e92ce83e1e4533504f6ff205b57f26eee93c4526db84c728167b615f226892a7661ab513012fa5ba713113d590dbf260299c79f5c02fe66d048d1b7542fd79f329c653279fc18df4de4197c47ee72c2e41d6e5c8cd4367501a24d19972818076654c5adac76eb7c37b3c8ea0bfb1fcdf2eaec875feb1fa0b05fd85d52a4978055af401cdc33b0e78302f1ca5249f3b8927daec43b433e34da72cc06e0c1a0340541b3ef932fb46801587cec492064c0ab18c8eed50bf15fa1598ea42bb4a519cf482d2acfce083a0da9570cfb8939139d6104d4ce1a1c6dc051e3b113cdb4355b90810833f0d49eac6e150a2bbf486167838f3e04ffe17d2cbf7759cdb05cff79e1adf682c9fb432813bfebfe658f82002450100a97ed25cdc36c7fed06a02ea34010806e81608a3793edb724fd1665bdf6c3fc30bdfb3a26b1d9bfa01728fe942dfcc92829cd899c799f9cf4a4e0160e1c54ba78147b2747bb35586d66676f09fe0951b0712d44a2810542463962acb62380ce08528ca4655ff288ec43f4b17e1d244d2861dcae6aa86d32910bb3e644f7c3e13abc17b14896d4045baaf86313d3ef0f458cf9cf5422e2f5d62cb6ec8073a7e151a34a1e1c7bc48f2d15f5fda8d312a1bdbf2f8b3e0f2604b554211c8c381a7b7ef9cb01e6150fcc4d4c002edbd9c0b87e2ee981b1d96758bb2d6812473dc2b1ade0909b1c2fa136824473d321fbaa79c8f8f567abb2a6d4b7489aaa10bb316ae3edaa7b2ba321618a0528b51eaea61a41048ff833275f51fd8cd11cb8d86a93f59a3beca59defc76d69afe90f6641f2b84adbc3350ba3f9cac63b4346ca14d4df232570a0b103b3734f405dedfef4eefbf3e8b4987fcd2034e2c4e69984052f0606af25c44a8aba834fea452e15b353f957c306c0047c6afd3178473b25bda5286ad2f3b60739ec941e5f5afd1f0bf5b849ca6ac66a5cbc37298fbd063e9ee0bf6d1e109a7195b2d768cfdc4243f457dbb5d2818be437a9c54042d21a2981aa8feb6b1a825d8d13c3cf83ef4bae4f48001da117b5a733b0333ece64862c5efd1857c2d550b91ad5b2504029c8c09622a46263f6e6f9bb35a16df188384cff5a21a261021c0cbf234fb97c1c876bce6a69fb74621dafc69b712825d95952633940ba3e35b632fee5691632abe83996ce207dcf383dffc4309a9129502e7efc69c9a64729e4ef216bf385e4b49210c7ad72a2f35fadf937e521dc02ee69f743b13079b09223e501f06550640296623cdd76b846211871135533d11f7ddd1ec7484243cce7e64a2f021298f6363ce04cf6e3be18a37cc1b4c81f0321676f727d14e7ad1205211cf54acdb78d077650013191f66904e609430c5af4d3a9e2fcd0016257ac1c37e5a880d25ce8c3d1c2cb0724e33de69f64b534403501b21d19a3190460d35c835f1c3477cff390c7507c9be41f1fa14dd7017b9b44bf437a91bfd3d53d28e7ad7af32308d43a0ad2ed709b46ae8eb8d2fd7bee88ce131b97446c67bc43a9a670af3360805f6bfc5a3c9c42371ff5d32a5dadb1c4a54696cbe4445e383b037994799dfff05b15ac273760b3544752ffbff8651787f1f38b2fe2f45093c1eda599f978e5041ee8a9d12437c7fe81c3a32cbbd489e8962144b188b51269a99c75adba745dac603000000000000000000000000b52245a149aff7b01d504458bd82d484280d20e94089bdfdd70f2d9f392004f44fe220542c73b89803bba8ecb36e345fb558e9f44f4cb2b09b52dd3c27b36354f612bc9995cee93eb811b2a3ede1763dafca715aff58b06709469ed2ca747c37000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003fe6b98b7d861ab3bf468f2799df22d5befb9538ebddbd86cc55f90de73ce6f6cfeaf0bada522ffe0d2233ed6f7792ab62af8857e86344a15b05705a428695369edcfad6d05ce3cc005f9a54c112162ec7fdbd24b86aeaf104aebabbf7aef16f4ae7168ddc06f386c4e14a2ccdbfef8bb1aa05b434aee76ff6ace5cc67b35212022c91c5c552e112a0cf159a618e685a57cd29fdd5898aa622147e469d7e3ca369030425537a59ef7f253d4e853002c8e30c90dca8f63e0aed6dfc18c6c24007be2d0a002e053d431600497f40d887af2ef10f6f18ec3a4c4da37bda2263fe0145b3ff6ac882d59a96fa5d3996969ddea8d3af361c8a0484a8a14169f8c49cb317a9b502178acf3504e725abede4e63c64d1da3acace42e47ea4b215e8e37d96f7073597030d4088c3d6e619e81f40bb713c2de1582a853e4cb70c0fd5329493c10599fe72030ad4449e2983420ae257e256ff04d42f83490d0878ab52c98d48bf579440eba8021d220f2526f4935d81925bcc06d597636e0a761be84a058402ee0451b6ff687e020e246b913b9a1c179124621eaba777041f8d7f37a4449b451f567bf2d6ee9ce0fcf40ab04beb8082e3573c8f353abb6edc93c18fd19e75a6e82982659de192f681b39fea118e3758338a9c1261e98db44de072f04334573797a62ec5be00a3adb1e2bf424b9812f5e468802ffd42cc7f69e1db16ebb5cebd816a9b319fd87fbfbc6fe8a3ffb0b26461aab8206acef1e76b520ab943628c2a56ecf815e8ee94676559f083dd655e80b1bb148c01330bda6ec2bb483057d2f64f4a51bca175bc40a7b4535cc86e9a2b127058d77888f7321cfd933bbe0ddf23b9bbe6191a76444cc64dd17fa87441a3ab8a2984058ec4da22d3293edfe121438964c49b29c55b31c55b02527a446afd793b3bdeac651d11de77ce9c4973f0ff50a946b30c6bb3bf8b4ddabea44d6267e8b6bcb209c47da750e6d37488e546494218a8b92e5bc0b08e34a40fc7a358aaf0ad4b5d09fe33554a637de47e8d8402292e779b0cefbe62f758d54da5e3aab788f844bd40ca97d5c98e92d4a183d37de66be576f610cb6ce095b587192c8df327ab41563e717d059bcd62596e63e9258d1867749803e8525ffaefeb22ed8c44583b0562e6e4ae9b7095593b4e5fe1f9726d2d20546d7b9f8e0c9b33b9a368de872d05a702e3883bee2b3af38a85636c4d864306474e359d37ab7d8215fb11f6259872aafbd95c8bcd41d53435bebdeeed28017d30ac7491af3006bcaabf09fad1f47ff5d67f55aaa6fc9146a83526c1f8327dc6b01a02c42bb0e1d251b60164a4477cf55b79a538879afefb1b7fcfe6d84ec9916c800f024cddc737738fff43ea806439c865fdc76aa80c93f6a9e621c058377ec59f94475f41d0ea0dc7c6802fd5f919ce666a1501016e9a61b2662d73c048a51b77de72a5e659b6f63c3f72210b39174c9b31bae48a9bbbef0756c4d5e0832d7f847e24527179eb1d18f6c772e796c09a8f664a91bac8df04510ef53c05bbfb25bf3f32e6b61e455782d5b55899d555a66237304a0df3816d918aec7fd51129f87ff78515f0ac93520eeed359ad240538c009d1831132eab12edbe0c6cda9eccbd36975209268728f66f3a5c5f7c6856653ff6cd3e2139e02b7c6018c0ac08e1c16d47e2b602c2c6787fe8382b70a9fa5b52f443df223e7c87fbb1caf2aa391cc191c82f09311a1dbe53ce340096c705c9dd86e5c9e7f7258fe6111d4ae794fa88897813604c643c6b8f6ed60ef477928418936259f22d291c4c60ac3a1b820c4e69d9f7287ad4d161af9b6f843a5a5e4562bb2fdf45545eaf219710f45335012fc94250755be82f5a3a8641f2ad54f2f29af7617c075259c279c783f07477ac68e4366533b691fa62580b4f2f24326bb597cda411643f5fd013fc08f84666e59227a0a8c1242a17356b76444d645f0e55de6007ab40583ce5aef94345e8f886dedf530d94170aad92debf2fdedaef27927437e9658e888490194086006d82ac130a61f4210170dd4a18bdd39c970acfc40e840e27d5283f86a3c3766b8001699050ac0195788232d2c4841af160d48e6b52ff13fd5663bc127afd84609c6b36c76cb4bf9155686c7d5096372e46a3496eca296886b9012e1bc1c0e26dfb8428756349f5f04a072abf72eaeadab8d028a05b8c9d294ac70c54081ed11a1ed8d2a2e155d1855249cc581084953ed7e86bcf97dcbffbbbe2b68aeba219e4118b7a798da629a4697cd6c6423eb058d566a6ee9cae9218a84f4103d7d5f9ec2d5b22abca20b5e2891414bbefeef60c21487bd71cf472da2b4b73e4764ca6e16811cc6c1355f71971fb403bd2b3bc4c11cfe60dd3fcff873c447bc9ab95d313666355fe3ddfffea271fc3233f68865deed666ba23e5cc500", "ac53", 1, -2099164927, "8adeac2b6d51a5bf9ab039884cca7058d453220339a74eb10e4dfb7b9c16db29"], + ["fa570652025784f87753ddc37056de2b1d24461fc1e492622337a497f299ff1604cca4742e0100000009535253005165ac6a63f1da03bdfd1ac587783492a15434e9dcdbad2c67bbc6b994e8a6be3b2313cbd997ec7c74000000000552005152005323a4ef02e41c340300000000036563524249b6010000000003006a63fa0fe73a02dd43b00500000000000000000000000037753164e3145fe145430f07e449f8859f9f872fbd34c3e105514786194d612cb68509a7f95bbfbab07d687824e92b76434525f3b3bf2984b75a660e4ec7f5f26f834406dfa47c5e056a81ca74b34929a3d9032a8608d34d9f976e44046eac8b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e02c105af7c2f13c38b4c2cb4b60d80ae6d4102d2a318c8c6ca3dade89bb9273f258baff30bb82f2249133b373629e48590798a8138059c57c76579673969c918a0869f532f4dfd44203c55df81ddd469932a6576895cc4e5614487d3426a66707169bb055178afe7ef58ffe258acf43280551e4a7ca514732fc377b83a8778021c243ea57c2cfeebdf14590973c3e7572cf6fb89f274fb74c5e1a915f566c7d8021673dd72b361a304f017092057e3d638fe92b57b5e8cb68938ce7cfb8be6fdcb0b037b4e0cf6e13a9f2ad56312a6aa601feb083ec85e509c5873071e18dff0bc0d92575ae37987acb94e201ab9a0ec11328603d2d19532154c65ad86d076b7750303266fc1ebf8956248d5cc775b712d9cf254aab2c694798405233ae72fcf394703021a4c1207c1be1ee4f034985af176eb56b1df2168b13a9c055c31b13a8da7706f0325a2df5272aa3a659547b0435357803a6d2b07ddca942792d575a8f36c0f732f032daf529cf6a5e3150e95b060eec04265514296b182103d551e825def23c8bfd10227a90d5c8f7419e9dc0472fbbc7af179da5aa3ef9539f2cdc48b5c894f30f2b94dcc8725c1a1fb263d4f916ea31a9e3537283216cca989f173f55f21b85eb6815a297bc711b631b6669a6e86b6adf2bc29232d19630241c0bd688ad3fba2eb304545de0fbdd4e91b4a82d0d14024f4f33e9cc8ee052d914e59bd93a0d63ad3ade702bc70318c700dee91884c1e2787c8d39205777fb4c34cd311665c35baba89e57dcaad276a2bd17d2d8a758734dd70f04d7a8d3b1a337c3cf6ceffc54b98df5c81ed44f99d5c7d765977b305c92b97ab64ce85eb98b369a3fd4e912ca8dedc3f13d05755315d3b81d3b63a1f8d43ad51deb52741fb7ef3c2b6a21356dece2a8940b3ad660270ab94fdb724b2b452ed779a1a0a69f125ce8ecaa5267e0e8f0a676edd9558d2db23b569996c128a6fccb878c9053033b64275037fb1064ecfdc9f5c4244e5d59a099d7622a9078ee11c06bc8c4a65e9be55b4a9c64b3fa750d0e8a415bf1a9b56aac0afe5e12017ad9c971c63e243d250cb394410ea99be29afcc3784125e8541b72feadda609d93f32bfac54bf8b3734602a28b90908047c842c216a70dcfe791004d04dce83daf4d3afbe52823a512dc6fd6a389c3c0dc15228802127f05399eba7ee63221ee857a4e47d84573e3d4783aaead5479016b6550523a386b7de5fc6bbd2a440f144ce5e763f39361d01a121d2d235655c0595982a03751bfbe5073b26410ba2bf39ecc55c9131a286eb26443d6be3db71fcc6196cad582ce30f6d15e111c91811a9aa4eddc87de0679e689fd15e3488d462ea8234e558f3abd53db6cd4865cfad48f1bb54cc997056fa507f300b1542e2a5c954cacfda6f52b683077f4be0895450f447d3df0b2a62b05f548c2349c87b7110c6033d513175e938a2c82311dcaf303f8be6e8e02232e5aaa9775b4afe3ae8f5b4bade7e144bdcd53440520e52d6f6ee2bdb231a7fad5417d7187d5de2a8a3e221e1df44f6aa8219c813de823ebb9e81ed814007351632e61f06247b75ba6d87fbf259358d842112f4fec013e729264444be8aefef5c504d22ee7f02728784f71b8bc91704a4f76ab942aef8fd7124f4568125db98d3911ee6049ea86b0649135a2e726869b1ad8711767dde3ffd50335e18604a3d3512c1195795293245de3b4f04cfb700fcf97e20e596c014bab2d3af4ad492e229d2214226f58110fc7b8b6439acaa7ebbbfe64ea575c580dc89b518f87241e1cc30c3cd74881c123e88c833dc62820f27cceb94cb7e8e8a45f71c0abf5416e50a61dcf2ad980f9b10992ab0015722588dfa6558274d94f973179e571207a5eed1a10790c61d808cd008fc9245adcb6029c8209275c9547f16169091219d44b843f649ed021b0f0db35e0174ff91d78ab2db5d833e0de18ed4ee00b52490e303ca2adeec502df273596e72d143fabbef8b751e45a9bb29527df60a23f57f8c48628b69d84af36fb09a93ae5a9b65dd6956335ba5d3ee31306d3229b08062d53875d3a972958cbd4741435f54efad7833111af9b1d00a0bb5de282a109889be0e6544632957ba5160a08d9ee3fc6a8df8985bed40fb7226b5a6e4f65e1d1a49aab9878e56f867d9ac13f74e042afc357d0aed32b88f2bbd26014c252c1729d4421b0e863d94abbf49c69ad8be41120e8147a580bbdaa91450548e422871110de5f72fa02e86a66b592ab38e51cef83a5e8654ad677380df83f409c81f5f2f000000000000000005278201000000009ca252425d5064112584392a57a2e5d1faf6b7be88a9a9f09a2dc81bcbde97c89c7d9d9ea738aebf720297c78223a2ee0c775adf06def6ebafba39f1e7307c70f9e654534fe936cc3549101768352222b2f84257ed404bfb1e7aef48a05f858700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a033fd5165f3c3ff5abd3e4e167b8a9b083f840b96e8d26d0d097972a9902e4dc3e8852094216acb1639e71a4df2a58c752504f41e72866bf4e84c6cac51f302c7c4267a08332e086e25f7e9fda22aa4e16a09ee0b873e3de6ba5ed9ae3ad91cadd2c13b8d815898bd476c0c7da194e2a93bdac83495951de9ac8e4478b37f1f0327923d8fed0730a48c708e8a72dbd682ac6c5c27a5a132ceeb78b87eae4bf25702238d82b27b1c66f822ea0b67df458465eb86b34e12c421b42e7dbf4cefa2efb60a07a6d536811d8c9460846153749240526224986cb3b0af006f413dab10033c3bc3abd0329168781249cb283006061e440de5ad6c53327ffcee4b311eaef172ae0228cd9ab2e7e0c6bdc3ad701e93cf801593ae78648f2ca4cf4489990658847eaf020ca3c7ca46875543d56abb8d664c91a7337957b1f7aed14ac6def32f94780aac0329cdaa8856c004042ecd732da3a4eda42ccafc53030ad8a2753fee93963451f8020f0dd56e82b0e0721a2a069bc330056639da807ec325ed024a506e369fbe661d03043106fc8d17bad2fac85a459c642c1275fee2c77b035aeb158e13352aee5cd42590874238cbac9e2f91e6346871f94f0f13fdf76b6b6fafa63b03a1dfa5a9551d0d195ee5a8d50eba81223061e7afe4398c8b42a83627fe7878b70cbb499adf16ea3e92e87fbf6266dcf5657098f9a808ddfc4c4dc532734227c870400c11badf478cb3f88e9d18a3857ea4adfeec61c7b969d26a4ce9a537c13e435ab3c4dc5b336d47e2481994915620f176433498140defb6b018b33b7e5f2e283a48d9952fa3ad8a1a0aac83b2cd0749792e38e29b7e40b70698a2a4b3eb6fcb6de9190487b9f70fc8da863274493f275e5274e33967c888bcbe80c4e18f20d9bb3618ed643ec51924a0f54d7f33d9c30b11040214dd39aaa189d59b86b9af356ff701c57aee87f26fc97cb315825225f34f4a2cbda1e8d4fc33ed9cbe668b99cd08a32c824afe2b900c02df452ca05b946ccfdc157e963b4fe9c617e511d846ab61e119a8904f23dbaca2f4d4c66669a3dcbe71e3146cb0602e07b96dcc5018a3241ea6cf1297ef07764ee7270daae3346231960a36d9877457283f9d8cc3681a77dd424e9734059c4e272c9f39c661eaf7f5cd20e8275776da2e0beee4f2d18274df8acefdac322f92a05e3bf70efbe6a4a89bdcf96a38a8f3e1a10485393f4ad8539db28083b166ca540552b8c18abedb82195985bdcacf4ebd745c1aeff1e11ea1254a4c9477933b7216974249514edbb88818fc6ea01ba2601b29f6ea796c1b8fa6239e011d6af4098b3ff8bdce2c3239d89e834122bf9e27756bef07684b1cd18df60602213aac0606ac226a75800df52920f44c500749df61c9af8bafcb2f6660fc6db5d63e9f7553cbdd2812f8a90b18b8f522be95a02a7b29a0a95b2996598e25f8371db381824b82ecc66d25dedcc31791536d53a50fd49267220b3aacce8862d8f56d3b38eaaeefd35d7a3c0a9d23f5cd5a111d79eb7fdc44ddfa35e82605db9faf113b2f5a6499041e3ff654d2f2dc7495e7e0bdf9700bdc51b7c289c94effafc87463390ba291594916b3f2094c3d29a1b47e5baa4decb9a902d7c9c411bbf3566e988b25d3cad950cebc0bf67167acc818270c622d0a07e61aa681868f2b3346940cde93f1c57fc884c846ad06bea491253d803aa8afce68671f1f9d5b82b8bc9d95c8f18664c32fa1577f48f33302bbfdf1debcf5b27095777a04c7bd9d2dcb6c09745bb3b97a362efc5b45e074fa6cd7947721445f07f956a22bd319a1efdf7760ffa60a182b76b77e3b268238b67f69e0e46699e20713f108826892d55a6584ede8f36058cb86d5ee1e38b954b6b90401dc55eb750000f4282385649e498d031e0a2cf28028ec4730cd482b17bc126d994843032a42923464922afeaa8010c7bb54d7172a42c6580b3329e2be8314ec47bfc5a44c5f203c7fec241c4d272d4677091cad61d1a7cadd6ebe02655cc99f5fffd110b1b295c4036ab6c16702134abd829eb9dbc3acf64e18c255a82982c4b8f356676ccfe8ad0e25b817be4daf738c5d46ad704ab7d49e0b60001294d7f140344fe2617affe4b8ff19cc0690fe3c53b29b443db50302fcb3039fa46e12064adb21b7cd2a7144b9563be80d9ee7efa67a4e8f3a540d2c70ebe6cf7945edb8a981991fc6d8d4fa850869415b28fd998b374ee807a8e2f2352766a82ca1dc7ce73a15d4c243a2c2f4124096153a7cb0a8c04515a8f81048f856502a0b21882c7726bfefd27742a9164190e37e64c6a407100e0d670b792d0fdd04794117273621698343579a8a80ff4090655cdb7544c8ad72deb879c43e06104aca3fb772177bcd2cdf5c263afe272ad0edc8ab4d5118ceb4450998a81455e4941d7a07", "", 1, -1878466878, "f45ec332b19b5aba0a49c955be22ef968e627d809d08d4fa773210df752cf963"], + ["93b5f0790353ee9998e48654154a53aa889c0b812c1586e6a215533a70b46634c570116771000000000265acf2065410bcbac02a7efd172463263efb1cefda6f506fe0bb057c2c0615c4c9d1b079569c000000000552515253acffffffff43c729eeb7970736d45708931ebae19c13de7e78e544b6aa430ff4c0f6ba1f220000000002ac634a38681b04041d3203000000000765ac6a6aac6a00a20ea50400000000026365331b8a010000000000bee94c050000000002526500000000010000000000000000628a8a000000000027242dcf80bcc0e585c19bf1c5f18151d1a26c251523cf1837df0fd036015a6f678695977c9bbe37f86802b2730497a414e183e6cfabf493bf42ab8e18316c6ab1fe335ec74c2a47974d9b17f9ae9d780b17e69db3b17db866a6b75e0bfad818000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005252a859f1b4f614c15471cf1a0341031397dab4c526178e034132b589967ad83ceb7d29260d42fecb169305493910cda6bcc2d27dce114b47477e7f2fd7b817f059cd4b32ee00d734442cdaefd64e7f385b1ff7954b16994dd927cf630fe3afeb2d9ed87d6fac9956b8671c808c610f63ed3a3c69040fd8fbd9b6469112b7eb0215db947e7c98e66626a26a84748903381d00d78d5dbf8c6148cc823f8761d583031578feb415a182287b9c886c34f8a45bffa8bcb5f95b0751988973f138d7b88d0b00c1efc5f2520a78874851562ef5131f554826396bbf38472066b052ad68230171b396548fbc6a7c394e5abb9804624ea3fc72d3a6eaa7909d5275945244da5d0219065bdf4cb5c7b89d4628f9c9dc33b03089ad2118061d4880b46c10250971a40219bd01c8de90e3329ba306bbc2b18604a97027876805bf7e65be208b015f86bd020bac7c6afb429a00919f89a778c9560034c44cccbe4125069a239e9e7ee2f5b60205ce0ba53201ed3675d541b6adc52680e53928d9230962de812249e20479f43f02058b8713f40ff5d3de7cdfaa47aea45534329f6c8a0178c7953b04fac39f9bb705e67b501c5e35356e22d2690a3691dafea9ef4c6e556d6b49f29d13b316e4cd5d1c26b711113a7ae9939e1da23eb4b986f71abb52dd09bd340252b78ff4404302ca837ba83ad781c2c70f47afdab070fc57ea7b1f4bc66bd29cf65417ec3527e8936ddebbf2a9fc304f436bec84249e21970a89842e5d72b33d8d8a9c7df70c60c00ea51f13e093b2211b4c38497d6be9ab518c955dd81c7766b578fffc2e43a47530cf66da0fdd17a6183595936f12c92904a49216eb18554cf84d60502f77baf64e6d0e9ad38629550aa704ec0d7c861f52f3931ab6a5d32f9407a2acb4308078f6c2496b9c27c8f114f3486cb34a291f36b7b25aebe5ae42fff3e84a633d5307ef97b1236e6c4829b8abf720718b94a67dff0403d70b848e7e6b7eff90db92099c3f41b37b232b7903a4a6c08ea575ec2bf2d4e2e17769e42f465e2c1704445372e1d9c4ab7d2b5ced3c5cc53adbe14fe74eaae170e6529b9cd7bba6c8225489a4afd21d432eca9efab314823ecc097728033bb1e3f3679eda975ec2ed1f5b047fa531abaf37827fd24ea752bb6fefc618eb61ea7b00ed9844dcece66273a322c4518b3f2a986c0098dff70e336366d70da60045cc57ac30db5b7c728117ee0241dbb0b525f0d2f77b5c62eb44e15e47addeed1445976e496c52c7636bd6a4960236303c5976bab3e5ee5e71f3f9702903edf33454f460086efdfa8ec35ed9983c037ad637322ae4900d88d171fc5d01ee92cc26baf276289865e595b5ec04ac0f7f93e9a598ddcbdfa5ac582047a82ebb241613d1e3021b9259abeb0fddeb280b4515a74b2f53c21339126a3735940cedc56435a4165cb962bd2965656e6677cd93d8765d5f63f81088e38b64db245ddb37395174d5548cb3c6a270728f0b503a80da3cd6ebd126ce3a4512fc8eb62faac241d9a28fdccd05df77b9420a61bfad6850abc182afa79d9c6675f7897c668dbc7fd240ecb3dba0b65abbaf4d0fa2727cecae9ccd92e75eb301ec1dc1c9ad2aa9bc0fed9e51d70429935fdf39373bc4f4baab055dfb3844a6c8b97e8b70351f2d5e6376884e28e54624fbd8561e8f9c5426d464dbc461579788f38f4b0cf912a50605813bd69a58d32bb7bad40de13b01e2d88b91f9cec4d3e4a393fd0da20e9e95c799fb578e1efa5f09a81a1ed821a6272c41ae13f61446b63e788acd6b6dbc0ac36a57b5e0ee39eacfdacf5203f5d2154812871bb6f34caf2dd9a36c4ba4634fac18cad396837c7bd6a7a873ef037cb876619bd6b5366e5710e4b86a743aad1aaf65c1644fe0695ac46f04e726638dcbe980377bcabdb7ab05f613122cae1eb8feb5510180db424e8db442493fcce5804f208959b10e62b50c36a23130fd9c5e49da4fd5f7f92c9136ba4f9aedf8570d11f17575b184f52b4f81065afd593ec8f8b560ed57668072e41dc60a2f139b06e3d4e7ba45e1631a595300bfe28838dbaa048e7c3c0a43f9af6e528b220774320cf6f6b97ee6443b018d6a31a04f26d887ef7fba461084a3a21746e70df0d9200632eca9fe3e8832692c24ed096fbd20e1439fa1dab50f6f24b6dfd7b46029bb716b418be2ea8c8a2e3739fb8bcebfb99473178b77dccbba9d5aef5874151c9b7282605422113635b23f842abdb4b98c11ba1646cc5ab058a1302f6677e53b88fef14362582e0c88c242d1f01b15d8aef64346317de18f9a4abd09bceadedc175e213a174549f81ad09af0942b3d01bdece1065711677afd8a33748486e563c65d30aee7da537e628fb179c29e277346f004e456b1c95d7bf972cb4e582b92d6625dbe49bbd569ccb587fe320d", "526a", 2, 580987371, "27685b233ea6641e6decf9edca8487540694a98b789cb4d66998f669df894f26"], + ["3a0d4c3a028779fbf266d67dab9ae777d96229ae898a1797adf67856e4dbdb088900f3dbfc0100000007536a510063006afbf35cd30f3ff5af929993d6ea753757627b427e3292b0b5c8fe3fcc1150220aa8876565020000000100ffffffff01ecf43b040000000005ac5153005100000000030000000000000000c51053000000000061a9f51f1a5e84b8d980978b18e51e1382602fcb418f15448cbdc151bcfee4a17d98739a0e2bf7ed4ecd904735f6cc4dbeffae5bef0d826d7aa5fc2fd28bc297fa31f4400ef213082e5d3e7b339a42e6467f2ce20b4673e91180d978c775ac1200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e28ca71a795de4034ec14eb387ab61bdc2f7b8b960242ab70ff3e37ca9a07f96c1e1158b80be21d26cdc3e4784f9b233ab7968f16ee80b5c3582bb4a326b0cc5f5e95a3ba86f63b16ad7048eee4052876d1b0954edbb4510da2825bf0963c613dcd4e7c98d10d428014ef5737ddd61926ec5957619c36da85a8dd41ad473b09c0314ef63481480544851da1a89db4e2bc8da9a41eca9100cf363155250f2c3adc5031e4f65fa4d723abe9932c7946f2a2c19148e8026887d48b215f364d02db974060b07ef5845d55f8f685da1f46d14692a628a14680d760f4ddc8a2788af9653d910ce28da2e14b1fe88f195773902079722241aada09e6cd9c36ef9cd54773a46980206f7318c7a53feaa6f727499b12d1ac83c40551cf2744dbee87f1faca2a6012b020fa02974cd702408cbb1a5ddac93df28fa79270169ee7043d965fb3980e524c20217d4bb610cfa0d857721d0acc49116274bf3dce440547a0feaa9915770f8208302051eb79bb4fd5ad50717dc714ccebc05a77ec9736fa76b656df7b2644abc3403020ae2f5e92fe3d08db7d3cef2f79fd8f901d759a66579e013ada4da44916f519917ae7037f189b2e0a88a30a877cfb66756485057098c19f40d18a7d34bcaeeeab39e952739ea5f4b8a1a78bb51603f5943db438f25ecf8aa46878831e89c948a2a5aa9cf9b43de82af7b76130c5f30df6bdcf2753dada44cc100b9bfb0acb61dba1946f171030ff0c8fc1c04a0c75b81e6b8d8dcae7045e95672e5bd4345769951d0a188defec1f4f8b832842db39623d67938b243b38ff054e654f0477887ad60ec60f8c3627205e19a0afa4685609de27629cccf30dc766f5312c8f6c3198954590bddbc96ff02f847138728d440d60a65c5114b85cacb5eda443fb5fd56ff38580bed094118bf6b1d7902a8149fc09f98f4e03e5689a3923c1355f86ecfe99b8558d27c2c4e39fa99cbd9493d9a552bcde51db6438ac31ac27c20c4af6ad487db7433710c6da8aaeeb4e830acffd7aa75dc23563f1ea8daf5a6b2754151ad2296bf65dca47df9d306365645a5c341cb57ffda7787110916a2ba7c6954a350dffa61be5d065e1d043032f16cc14d22c18f382b7c239493f7e5462bda347fda5f270b79171dbb76846edcb5b24f30d3927a9f007059d0d6e81d4019497e4a7c4f504b7a1804d370a95024c66f0fa4638914cdbdc2167afc835bb17beea0445362c750a3a4b74c525000c8d36088eff38a97f11ccfafcdbf7ba94cca65f56579dab3932191bbe12841e2525a8b5fbf55d14da6b687c2ea72ecf6210e14b312bdb252280833279c5a1e8bc93b1397206e1373e9ee634be463ee80a94967c22482febbbaadcf5846d39914cde71707a6b41d50067fdfdb5111304cf0c6dd0553283553456acf9d255fa16d48d92913c58b87f5380b4d9d829de044e46869535e51de56c44b720603edb2f55812dd245f4bd32e6f421eae95e948c23c65244cc2750b5c2c0ce4db0289aaf12c6a0b521faf724bcee666e60adc5a13cd8ba46ec04aee6aee3fe5ea326a389eba327235019a2dfbf18b244108a3b7ba6eaaa79dc5899c678be149b6373db0aaaf5f522c40db2e60d4f44b8b6fdbdef35eec5e6c25522ed3a3d6a19163c719d63fe79355a4664114b05867277cbff7db4e2d828e10994b493641c9c2b394e6a607e7f58862cf045af720bac382c522b75e4892e4f3879eac334abc2f012b65f1ec059fabd4b0bf5665716e401b60ccf3f2c33b5edbe5e4f3a471747b14f7fa695d97f74bb72eb95ccd787239ca1052ac270a1333ad03919fd734f3cf6f174aaeae3b8be76b370b2d3670da12f0b5162310d6cf2798353a7910d408b5ed4bb07fec90dee61022c946d5518fa23910b0a53fe5cf2fbcd88696d1c7618a5082355e7e8230d2d5e4a4facb0a19147aa07f9b3cdb30cddbee4a58c9acb04803d353175c21de80a7c9b7713d635b6cee3a1cba7afc895c378f8b7dea39bdfbc424c42670025d02ce671f59bf5ecf539e10b0443b149dc8caf8cf2bbf5f87d29c12b03614b11977f72f73bebae95a7aeb38428377e7b1c92427faa9a21c59ce1d62a4cf0ca7fadb59f9aa61b9221f5e2ceff3067ae782cfaa6d69a0eaecda96a89aad83cc3db394af01f853911c9a3ce31bfcbf5782972daeb1b4ad2bfeebcf94717bca87eb3094202f972750d75858e7d16b5df21fc8686812c215b1ab24b7eeb14c16cc1a5f395a95b9a7301b355c5930f3490fa4248f37cbf6705401b3599bc4af184ed220eeaddcc6c30000000000000000541555020000000058ff449910ec76b3e9082f95341c471775f87300421b880f35551ab6b169babf1d73ef398fca8d4e18c85b464c3f8176b061442983a26baea08b1bdcd890269710a0fef912827929a77525b2548363853e553fbf0d14fe3d0b9403663363e14b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000df0299507b700c69b8eadb0c18bb1cd9cfaadc634ccc0eeef29ccd8ab0a9034981bc493fa6e1134a8e2894b2f00c76ee4cd01b4ddd0221938f5f1ffa196cb3fa22df2ab2e3902791b9311846866514f25da59268eab761d7f7a03a378713cd22ea782888a58f4d8ec402cdab8b806711ede6269e90edcf36689e16c7967369980222795ceb8a36a7fdd618325f03b574f7c5866c21d23143e98e9889d289ab7a030325fb8bf32231710cb07d0622e1b93be96ed4eaf92034c80c730075bd6de896080b036e59e42ab583acf9a25633bdc1a08df028158f4bad3203147e0282d418553ea7694d0fe4437c34f74810651c02d1be62da6998611ef51a03d9be43674ce4b20218ddcbd2484b81bb8aa654400e5fd492577370707c72fb3a62ec83c1fc69e453031f3a4424f37a24b31e581fa242bbe4ffd1cf883f28b81151d7b329232c4dc5e8020655975ad813502e234f4da68892cb19bdefcf66d9b668e67f40dd21be277e0a0325f14978bf1912ba0bc2d37bb9ccf62fde23a7c7d4671befcf7219802cea109103297930be4abb1f04cfe04e8f349287c2314b4b781fe0b6bd7fd9f8a27dc4577b362e7895fb5986ffef89239c41edeee08098cf4b23b67b606be259e0c1c97cdac439edba8cc756a167e0388ab66372aac1801457af1d13650247daa2c6b11316ec4479d81bc7f7c9300a9b8537a94c7ae4d9f688e82df307a7f9a54c1dde5efdcba6419f20c87ae687679f3255ac1eaf41a5b67751e1b92a0f7f0dcb11f745e679732bd6bde3364892d4e59b6e49825a2dad9cbdb4223b54343605654bc9516f838f26f577e33852703a9f446237b187d1d556db17fbed9a859fd14b209c8d6ba03c5063e2c4c6b9422469db006fe0fe144d360dbe181b72f5a2d6be30ff53ba05c7950dcb8f63e9ea30fecc8e581ef2eb37139a3748c714e46c29037034846f9e6f69d505eae42fe126406b3e930d2578e5c75bbc0e307e474399f03e8540373e6feae96c97f54eb0e57e9034dfd6079769bb47df622d8509be3a0961c9eef1ccc7fcce23e0d4c645768087c622e7665dfaa9c8780cb8d36428aacf381eacc9c446f357bbff1fcee4aa6b4556032f531f7d1d280c7058ebdb53abfab2078d21f08022477e0fecfdad756a4814bafc22068d0919d451789e4220a85ba36ed79dd60bc98fd14b7eb8b99240a67b5ab771f8d370ac3e9ab9934a774ad2a74b4bbccb955b65873093acaef8209722663b47c26d38aacb28384d1414ca27ae5b28eaa06343c71be626a93563e258d8d92a651556f47155b8194027b1cf3f1f9c9606fec565814f622aa14b772ab6e8b432aa74238b7fbeaf9e57e1acdd6745418a5fc8aa750b67c271a2ceab11f904addcccd7c4945af12cb01e9af1ee27bff7e3f3d937c3075965c14bc49779a6a8aab071b4e310eb18da783b96d5748ca083042364be6ca32e61ce2443d977635181a701c650bf5398c9ebba975335a8f3a6a9256a93d6ec66b7c10212039eaa8290ff55e816dada6055d4e2f3a3270ed8df85ae2093915c5ca1b1c5d199468f559585f5061e935a9fc30048bac45a21b99b56436b9a9ffad9d963856a88e567fbd121c36a52600d7008677339cb656c274daf6a0858490e226ce5ea6c6e5efdb021c306a4d01b1b2df3679f7d7495c066f55e9ec9f4611100ac28d7359d6f5230120e58c2efa80c31954a22b3fec065465e004b0f88f94e434400b9edc08660afb171e9d2dd9d31521dd61b610f1a8fcfbdab80d1104e909aa46044650c52480a4791ef0cffd59b342fd7adeb1e1b74ce1b3b9e2c56451979ab3cd4b2b95107bcb8262fdae6738b82a928de38b7250a42c588a5c8f176e8e29687f4e483398cacb1e58ff5c37d999cd88bbe2dd3ac9e24cfe16bc29ffbe1362e4d4ea7bd800c812d2096fbd5444c1485b04cb0d432eb0fd04d3799a92ecfa1a22637e136bc29b43e4bed7d36d8e1e7f83f6d55a5690b6e1c9501179fd7f7167dffee92388d737f24149f2a3b0acd670c07a88791745f0efb938c1467db195ff5bc5bcadfb69eca7027174d2d8f032798c8ee9342b534044f02b433e8a3266dd0e0b674d31269d2f0d016a3c6068815634cdd95582a21859146f7a9c95a21e51eb926b5f27381fb837386edc5c1f5f2c293257fbb2e6d5151191e4ae2606d8a91d4b5089d7687e19d57f9f14193a1b26cd2509bf5a305a2114373e4c965a403e9ed8ca0a4dab089e0ad126d0c07efe98f861721207fe5a536f37366c71193936bbaa288020591349300eaab0c00000000000000004850050100000000381c4ef9fe5272fdfc2f786842d3242cc6c6b3ecde289ed2b94791768e8dd8d719c5e54041b5b7f640a655d6445634667a1593c011ec2cb61dda9536169ce625ad29d53f4e696842cf736795eb6d7f66245342efc838e25ef2a4d723d9933521000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006d5aa41f1242afaee3d993b70fa7ac9a17bba0b7665656f6fd7d4a907be8ad7dab5d94687107e438e97a3443c9a1ee6e649fdee807091812ba3530ac2fc03f787fbabec14967a00cba569bd1adffe8a5736a2dff5d7fd4f9e8b03ad130c72fd7b521e9091ac905df89410c5490c1997e5eea35c0b22bde589d33571ee06ef387032c9ca499044dc1bc0213b183ffb564bbe198d97cf2d078d306a2c07f2ec6ce97021342702e3e1ebdcd95b59f029542aa71a06f01f851c8d7c5318e485285af290b0a0077a98701da904455014a1bb76c4ac9cd7876677707444653113eae5b8f7665d178c3624faa390e5dc443ea5f0d68e748aac3922a9d970110c5449ab46ec8c503072e9537348e8f71e1973df1110550755fc9ee80cac20ed8428653a1a60d5661022a9b9f4a85824dc47761853578714687c93edd5e833f22f3e2526447c4cc64b60219ed673500dcea018960a2a8f29532c911f3b9a76c3972bf6e6dad8f141c2c4d0204fe5592edcea8f6fcbff3d6731f10f7966cc2ed11ac15b867cd401cdb10ba590304aaa58b65fa07e0e4f36c0018b6c7810c284e316327420c42193a71dba17eadf223b326411db50c706cc682e724c17630ec042811237eba7b6a76a8ff8db51de7fdcd21fafb3d553de361adc96a81be0a6776ef072d2419bb10683ee2af35836af8a473b721043c01654d61614561cddd2266c5d9ed480205219b933e6d8d23516fa8462abe6726f54356473a649d6d06554d69d683fca63445f5f290c956c2325e24b1644de87e8a6b90ac5f8e92b6923d035d81647aff926c659e16dd0c69ebc87f7d8d75d65feae6923497b41d9f8858ee24116a55e132b659df63e99553a1582132d6957865252d62153337dd82d0925d8439328d4947f2533d20d9a671af300211831fdd318ddc2f3776455030f9db8772aa97069f10a1a865035883d6068b97a170b1178f046e86735ed89eb1189da0f6849473a2994774092a9e459491a102ce4c37bd9ff5d17242a30d25cc29847b5a766605e2775932d514ff5a3aa81ffa7abeb0c1c5707280a20b47d0bc8fb34ccf7d24d080a67191a7cd70a2b6d2dd1233addbef07f843d3b2e2f264c9b182f0f5805022db614bde1ac4b3a2a1e19ee0ce4fed0908ea76f887a1bdf02db499b2343129d47d3fb753d94883c689690ec78a3f5fdb9463e31c40a49ac43c5fbf2e54dcd774775c5364a0b1ea2f890b2fe8fce73f81de744574898bd5526da83ca3f6519366ba05a4729b0d2b174c57eda11f436f5e0df9096c9423e7744eafd92f1c3ad21f19d49b02930fa8cba3853f1826ad9dc4061ec22402297635efd33af08f23ba6d9cda34029f3207648de93bf9cd86a4c320515c67864aa74787b17d09c0830b63cbfa964fc5282859a8d6e41791b167015aa77db1a809bfe596e2de5094d55590f8d473269282d31ef9022c82aeaf3e5036b42f6c016c12b41b48481455df6f5982fca819a7ca5463f1d45455d49cfa31a9f693955ae9f42c10fc9d895d22c5aa70d4cf2466ab1d771ed1989ec02da2d757e5f97b24cd20bff0459ca9083612a273abfe287d5a710b56280394dee12b5b52b9675c4552c1468ea56415671737d4e1ebddb1a0fc4b9e0aa3ef1630e0012e3e4f3a439865e51100b4e8dea7a1d237ea12cf9c6669f3eee5e2a6a88537c95f0d1bb1963e80bae974e3a9f8037ce7290a1bc8480d3862209391920d0cac151a57989b7c4774b21c70f4d6dae5f8584bd25956e4546a5a113f67ddd10a9a14f584a3e1cae7520050694e7f226f2550a1615e2cb983ecda317283bb916bebb9f918ef65b9ac52f8c556abe3aa534646f5b206888cbbc5c6f6f296f3d7e2e7893bb7fda18e97e1b20a6709595f0b5315f80c19f941554446460768df6c03f5ab234b1a49ec557443b47d5ae1f4c4e3b3015724caa82792d40a5704116f89d4ba8bb86127ec6d7529c0f3f96b6664944fdb5e4f1c52dd2daa7a4e89d6c95bcf58fe2e681e48276eafb6bb5a3cb9559b13c191080a6a6b39953acb8429f6c96dee90495cbea82f9699c6ce417fd23cca3f980e4ee0fda36175bd6cafd69c8fbfecb698d9abc0cf2416ac534bf4444cd2fbfe25d72dd43fe0fb721853e922f44061ba46b131fbfa955f2477462e712090bf6ef8dfa28b4829f0d834ba4c48adfb384ef60a82298cf6653b19efe2ebceee5d477b5d79034c7a8a1e94c9ce4d509fffcefb8dd5e997f306175f354f68cf48463c0bf858d3647ab3ed92162f774f755c9b7c76ce95e5ff2c22eca1cdec4ccd9ad1091e3a8ad749b1eae1a52a15c2883f48f15daf3b1de0a2536344a97bcdc3bce7ed23dfcef5175888a29d5ed528b1d4071f5e4ce7b09d2f56ef12747e68f542b8991574def093622fe130f35239d05c5ba22a174bdf864a56f63004", "51525100acac6a6a", 1, -2110990180, "a7b0c5e0d14235dd261ab5958e18d371a3fed76ea9404cefafcefdf7d3761c20"], + ["ae7a5859033acea556bb3a52c1679d1ae7a0b2b986ca37f5685be927a0530cd53962a362490200000009510052635351630063ffffffffffb02672c4e7e6dbe7535e60aff5fcc6cae179982dc41a4361718213ef520e05010000000153ffffffffe9e761f99f3a00f2f04a68e5c650cf80e635895a814925ab0c7e4cf50b58204c0300000006656aac656a52ffffffff041ad82e020000000002636a7ce06c000000000008655151ac656553002e17d60300000000085352ac5163ac53525e8eb30200000000025363abcb83a2010e5c43050000000000000000000000008a484847c3507815e6106a8d6db107ab4cc0a29b43674508eecc375a5e9ce49be842351ff6610549c262aecb8d5f4c08facf82f4d4e5d308cb1a55df3682482ad2894c36671a4814d2bc963fc053eebbbb1d7c701981cc22bf70f6e5051ffb2e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b8715e7d6834076356831969cfd26f8827d8d2a89d173d9adc86e735562ca938c5b7627404128ba7c62785200a3b755485c6232e5549d8be9829db324c1a1795439cf4eb060813842b79e074696518f4b5c5dbd97c24c768a14c8432dd1acae9bb7d30b21a80789b4dc9f3e9babe6bd48113df27f982233698b0e5716e786ce022b49b221e781d613810a13db8fac7c722c7f66704d7cf799d234a29a17324c9a02188b6251eb570c854ea15c3d120367303aff3e33fbe5a733d0eed0f5b1bb4a7d0b04741b4dbc7d95ef6a923e362643fb7583d73ed372bb7d9c3c9ed064e64ff9777acaefbfae70bd3b32ac858578d17369b00849cc17cc23957c551e041bfc549e03051e1992c1077ff2fadddb64f4b9218bd8580ed0edfdffa9092efbde4c278f9f0216316749dc7b79408e3a18c4c7451cdafc81ffaf945bd8c1cc8853aef17c6cd20227da70167e1c560f4c8de907840bdb7cf3949dbb3cc8bd41e21357561afb299c030a142f7bfb6b39407f9b72de59575be77a02f1b785be4f87df53ba29a7ca932203274562cbd69e976de5f6ba10407c950e9bf18020df60f3c5db137e4e7e9bb7b0393fde5736beb1ea5564738b1196ab406d6419e18ba7f1c351888e13ad315d24d1e272a99f22b0007dd5c5d6ee75fe14b0e455ac6cf8b94e6925bcec070fe3ace5eeff552ab0435f1791f31a03bc2e31a778577e4f8de70b1e514b54783597b72b664d30bc998127fc2ee0d27af1843576c87b51e43e0d03af12dae3c9da234f55f01456a1186e81ebb4c22f1f491a14882db217f26a4845458d51dacbcb56515c86d4416c1ccbcb2d67470d116310fc5c42997e7dd868a8e6987f61aee135e47bc3fde92c13bdd57fe53f591d7e9001ea48eb4b5a72aa494d8f90e188b96b430692fc2ecf4856fe46743e280ca528abd1a1c8b3c2e67e1644623020ba28e8e71ab5553bf7ffa9f6c9612cef8db442a20a1f1937cbec54a72665ae1e84a80a6c508a2cceaccb50bfe419b1800df78cfa80bed75ab4cecb12657facf418963e2146f072fbc1a8411cc66711ef236e6043a816c5a920b01af377c2decf83ec64d16f6787f925c988630f489ea3abac6a33208ab4df3f7e015f82493e1a3c27d431315cbaaf731233c8f5fb35cd0cd112c295ea18bd85e156e068a3f3b539b2d09084030a86ce3d036502a580080216b47846dc4d341a081606b60f69efaac6b6349ab5b4499331f17755e78e03a762907be000a07c0bf9d13db27ce6728278de28a91aaa9c361a79a3dad83963d513c450ea6e690ea695e51b03049b8fe6c853103beac1202414f281c01c43713d7dcfffaa04df3ee20e7ec53857db38696ef916eee6c2c94f2ebb6f7e8ab495a79f895392791da2407629f54d2ba177efec7f42b4114be547826f35bb6cc18283d41d4bb44cb92c2008f7ba2e9c628e77aed900a9e8c7f1664bdbd62374098f9d1d4fd26a15e699036c3bdb9885ae0a4ba18dc75c8133921040e6ea06817a37973e53a28f174a29d6a089a10462b3af4a02f1f956f9dca30518adf545acc8b20a904d66c2a0750a780642bf10539777c68e905c339c04b5e0aa8665e1f432560fb6e8e06c8096559ef19232407a90bfc0cfc544eccd8726b3b9ce545a7782894b5b94d9792715f0aef28bf8a5dda8432d22654b27439ee1cc2b2f82ad08b223ff5513eb65daf372b8c4ca8aae077a71cb86ea7302173637ccb44612fa2a4cd525bd0d668bafa9d4d524dc2703c4469aa10fe09e73dc387ac5ce7ff3e3f13c1dc330558716347e82aa5b78a07db83c81063a6eef1cd55348215f3fa4bc4ea5e4ea66398aea5f00b59bfece0359e80d06baffb7d587a1e9eaef24c16824e889a9506a4a95076ee9a22b4f298ab3c741249975d8929559d36710570ff30c22ff79941d49a051263f02c42cd4558a27b4df0bd457862a1086e3cf40aec5023062339affbf9feccbd7219905257e954d180d41299db084197114facb4d35c91d36aad02623478ce33b5456e454d8030c5e695e19c57ce61271d9757d2d20a02fdf60c734d2700b01a1fc834ea603785934b227eaf599124ce51615c93e0e7bded347ed8de7c22ca62ef87acd52ba4a3cefdfb3ab8f6805c0aeaf9a685c77cf5c3e924c1cf327200a097fa20c7c53c2d4edbed05b42d29ef689919324d1a9228585b74d4006beecde706bce64c612d0211db7b2e35d5bba21607dc1f101ab1ec519e214df257a5f3f0817dd8bbcce4a6ea6c3cdb86ed71320ae8c1d183ad95754a70f352da88c5313f246151ac3fc2ad626e36c9186bf309dd2ab8d0a43e27c9bfb46aea0f79ac22175451ccb1a84d2a33f85466ed691276f40aadfa2cc9d7ddbb4be7bce1683635a4d667f75bc2e0833a2dc584420a08c1cf7213e62a5a8a808694a02ef694aed06", "635151", 0, -1270897166, "abcdb66c532f77f85e597d1ba003cec5b05c794fb152d102e7ccc35c1067e683"], + ["030000807082c40303fe50d3fa0873d4a620101f6b3e13026c7341c8a1ad6bb20778927044ec1c712f0000000008ac6aac516352535199446fb91804d52fd5c0268641f57741d791eddc9bf16f6eaec4ef45733a753c0d075ee301000000096a53535352ac5253656ca3f44078553073099525f57694f0eb130062807db155337646f8f47a2542e7b8fe3f3a0200000002516a26e1e86c019e6daa05000000000553ac006553000000005f596433030000000000000000c6c9e50200000000ccd22a213719a3db0798848708df371434a1208f28397161c76632e7553fc34c2470f95cd9f563517b01a8b5bd4548f8a7d0c2627055b656c9de41dbd010462cc6e50d52eb4e3ffd17eb3c2c4953044b8c0b60641135607dae333db4a5f8d7830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055450d205e8252700d936592404a8daf7d19b7f95ff48b350833494ed228bd49fac8ec07a88acf5f35e2b65f7246e3d284815310056c8c6ce43e7243784335d8bcc973fdc3879eebb0dd7e4a8aa2f6104e9c3d728effcc481cfbbc605ff24cb609fcf3cb301dbfc07561dd853bffbb7bd7ac3d8ffd51d5935574950e11a0a6f20310e7fa4ff7a7339d6de2563430da5d97b434f6d7465a444f504f83f7f90f0747020b4d71c17d9fcd5e88016caebb370d197bfb043d95a95760fa4859cf26aa34df0a012b068ca22a107e2ac425ed9273e67d6db017c97b73c5544368e73a9a508bae9d69c6ccbb70e56efc18a938af768af7d56d53fbd8f7bd37e76c2ad1e185a38f030bfc940f7e599ceab5bff16da15b511c5dd924de4fdce6ec74903ed66f7dfa92032350b9b6f0c5e3b024acac3935f49909d898030cff71a85d1ba36fbba3b784d20321738fe530839e022391fcf8bb77f3b1624dca6d0ca6aba077d7c719c078341a02185d565dcf7546ea353d3db10011d7ae9d7bc96221b47370f561f4db5943b9b2031c4ef6970c8a33fde7e242ffeab59d795ce131f42554f88f5b33c1ef8846e09fd89fb7f799aa235bbc01fc5bc9269dde7fa84eb5be5c68c597ef84c6be3cbccea3d1a3cac6b2ca897ad6deab853ebf5903f54b485b626474cf55695b216774425187ee6591f9c4ec372f44a15b1a3f1b0433fdbd108ed89af7afd08204ca7b8695358f23a7a75de6a2eb1ea4d6563560757db9a95feff399e23513a51545f11344a12d488bf388ab36b6e97a5e52e616f9112b555000a253d206cbdcf56a4aaf6dba02b288ea6d7dfb8848775af954c2285b86cecf90426b62927500e42306f53d7303efc6754790bab2f33d2764811de2b721c84a4c4fc38b8ebd6b9c6f4200a3524d29597a5604b7f3045f54a0d07d54fde690935b823eaaff6755c4651e2e461973bf11da176ad204b9e8ba9c9ecb4c077265c684227486b0b767bca6edbf8d2a0767117a779460b8f2e77f17e532d439f5f8d57882e9b86f78776a4550ad8b88a5f6c086be54a6fd0cb08c6a398e7aa8ddf79210c11ddf305d97fa80a43f869a443d83533c9b7cc8e447d42d53e4c828cd52c71b1c260d486b6565da0c27a3047dd08f00edb93ef6d4c5c4655413b053cd29308c1c6a69049ace5e1cb084b4bf408fc093de93b7547e4de6f60163ee3aaefa17ba3ac54d97653a51537c49afed38fb5de9184b0d164cfbb6ac4e2aaefb009adef72afbbf7fdb5489cad5c3adac5bc3b018339a54deb17a0dcba65ed17b60162765831c2f80af99e9cc6dfb4a69c35a200316f4c1469a8cb6c8980c8e3003ab6be64dae41cb0f7fb659d12ef75c5400e94e0213de613d44600cf590acf22af3245804c78f64161fd4b5469e376e77b5b49f02b894c963125d8ece20be01401ee48788bfb6b1dc629cbad7e61693f959d1a0b3a497501193b73189ef18e387bf89a62ed72aea262a406eafafa491f14afa8c7662d141a84c7c9db3614783a9023a5d652d70ffddbafda9664a5c479289ccd477dcfc94799a5a9de769ea1cf32ac259d448fe636605bc62a1cc1b16a5aaf00d290c6a332925edc1428f023f9eacc7609ac14162c84ca4da7bf631159d7f2a534efba1b54f93274218472d42046cbadc436629d93192882f0243a9cf735b5b306b8e3d7bc012f880ca6b9d23c69bf4154898dd7e91d5dafd18578fea55766204e2051e1af88bf14be260c50359deb1578ec356ed64673e14eb6dacabe64b261fa86d60078c6e8a320f485df00fb783696230d3fae45dceb52ed3357236695bd35e50a34ca52d8f7605f7463a2ab74acd6cbc178bdfcaf9ddc03885959d1d349ed4c4232eb4d1c32e018339bf845f35af7c9b04ebadfb3f9264db484ec95f72e3ac2f09db69ef56a4071da4ceea89b20111abc74105327cef5ae2aa2fa4f6fc83119c516f16112299fd5c3eda3e1d7fc8fe6f38e03cece1de46125ad585c26c2950e87828f6e946c5e2f030080fa16f8d40557340cf1511c3b426c02621a1c0d35850a4dafd5f354101cc38be1878f9cae3fdd2a845b0b9e5006cbdd9fab6ed82254dd6439f54e65f4727f9639fff0c834a400e09601f1f6bbfdfbd4ddb5e5c0bf1559de4d0f241a0cb8d049ee90859df4897f112f6d6c7cf8e4f03fce38ccba492bb15d7d733140b7dec6d96a9bba9ae1e753935820a3be150a0fd85d4ae9492ee240ec6726671f2b7c591424f05bbd3af4cee10ebab17e8f97aef62c8ab2cf7486d8cdd33548ea2f43259850000000000000000445def01000000000e3a1d17fa49a8f78355c9846401c0f169d8542e36fa5c5f183d098017465a44fac0f928160e562b98bef2cf95af988ae1d9cb2c3711ec2933085160f7a6d8ddb5e1ab36d3ae2c5d4ee91f783f844d1e70eddabd7ae4154759717f4e2bb1e5820000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000067227dfe9ce6ff7d6f5b3e602685a4a91439bd6e69fb4d187c84636685bc7e79205a6d75422fd61673b039954dcad4f300c1bcf6f89e9061bacadfed8473a53158f1091a81656c04676899c436e6b5b03de1c96b990715b2b34c9405249f89b616dcac6366a422b7fbbeb4b33801d5cbe240323d3f5515ff5471ec8c04024d17020c031a781e7f2925a2d9d3deb493021aadad21895cd3dfa2020f5d66434c4113022b173a5fe348112cedecbea52845c285cda0a6e181b5f6ab750355bc39921f750b07f23966e44ed1e3b111120c288092e654c1a5a8ff28e6abf1496c7253bab9fed83b15ee4e16a06345589a5730ab44b7d4a78efae81d32794d839ebe47bc2e44031b57dcfe4ee826d6d39c192c3643bfa88fd9799b77e75df98c092c0de756064402172751d00cd60f647cfbcb08e2b583d1f05ce0702ca68aadfa9a8cdba312748d0223358aac1e0978a7d6b1c2bac0bbdd831da522249f8c76fa01b3d68904ddb8cf0322306e16ff9616aeb03779373d229093aa354474b706f56fd32602d5d3ac70f8020ecd13d9449b26c6b00b2f0fdd0df2985a65a53c942241ba6f98476a2a4478dd78e03cf7870049b3f46ecc13c43dca9a23e4e820437860ecdbbbe39d4d23dd64ac1387b3c121366f710246b48d1d0ba785f7f8f57745fc9963a5b27022c534d138b9ce20b9b09bce36e6b5d6be2d3a25fa01b26cc3d58e32a65b1ded6997868e205c07cffa439cad881233d0b046dca081b33b7bef17f14979ad4311c6e98b8b99f3f538d91410c45164832694639871e51e86a43eb981033beffbaccc3c659025e1a93a10cb5d3eea06d978d2353c80ebab93ceda7953a654db4d61605ee9c7f4acd6f4718762efae6f5481b1e628fb29352d6d1875ac67c643f3e9b374be121fb35d26204cb4e0cef2fd34c4b282b844ef590a35be7dc02dfce3d6977c377aeed76aa91d9c53553e723bdebbfe96e97b559d66ca114276132269fec7ef50f8adbc78b4d5182ff1771f35f26eef6cd2c6d89a6dd0232dd2c9c4f932560c1942d05694507d7548b616c159d125c08b05d00fcb7a0a8767a81298455c312b1f753fa1ce1d768873d1c31622ba173aa42875c6197921cd2d0f3fd1709a49fc4a013128a40fc92ce49efab5c37a27a3d522485236b97d298d0d092be1f4fa4350920cd0633e68d2266e2cd55c430b88edaa47a1cbdb2bebdcadc2576b755755ebd6ea8724e8650abf701baf9b47605280f5b508f5c0a91c0aa77754defd56456d95e815ae2441db2fdccb2f265994fcced855e8953be822341b99f8359c8a94aae4867558be9e9faa8657351eb6488fbc69e57389cef930e1232c036b4adad7a98eabf97318c791a95e3aaaf3aa8e201d251d8dccdde6da4420ebad997da79cb6d510d445227993e0b6fb028e76a3db386f3fd5ea464bc3f7101f1e3f47432f970540aa9371f89368dcf9facf186c195b8077ce49f05c7fcd2b588efbc207fc125283a3d50364a20c0c81b62273dd7710f6bf609896710698dbd85d88c8d2940a4e484d653865524e019d0676bf6cfb1d8b02aa575c415880d96d45761300506e62d2913391261dc9dbe1fdb3392567e245fea64b0d02b07b89949fca24c30d59299af51009a7c9a338a56129f5e1728068cd4f5b1af25bb7ebc3c673c7eb7c28ee7573d199645948af993a6253e790354d6bc07f2c36aa056e75dcefd3a5ed1312f6c4550cdd2f73d175d6de691edbfdd6058a6715eaa19c49729c066985df468a5d909c3c5c07bda99aed213add113f00534d7d6db51f1fe449b3f1440e882aee952f6e97aa48815c2ebdb73b5355a03c43966d9f26d5c9309461a296950475fad0d3f03712c5a29d5d493f7e90ae70eb209749626241b053e686cf66db99b641585b30057975545a3bc9743656d81f7b4387481d9395de6e39e558cdcfc9e169a8b4f18497f076a7a57ec2b5ad9900cddfef519a29992fd4beffb70837011b4d4eecc503f27659605e00d550d5e4e6f062f3649e4b55c2f36bc76dc5351753e36ec684bde12038ca2e0fa432ee4e57b939c78ee12c70901ae2c7af905d45f3d61a8755ceb173606f8cde27a50dfa6657f188c562655e3bab12b613e9c3b68e653d993f326ceb9c27fbe0637fe0618cac617b01157cf81086c8279a0dcc4a298d366298da8977ad6ab05ad6483a2dc4d334279df628c585871ed0a040c0b151a002a4a114fbc58a789c99181905febf8fcc33b53e86053f75179491d6aefb894e16c700f882932418292a9c6a075f47f9f201e9d78805000000000000000000000000b1bd28d415bdbc995ce2b4659baa401c6ddeb8a209b5dce018d7dec5895c122222dcced6168cb39c687b62dbd86e0b7abf565612eb15100ef6d4a1eaed0468b66abaa2e2224b8b264e5ca680f7c583c99755e291e113e6c5022616851889dfdc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d09886461011ae904f621471855374c2e8b28343bf95cdb13dd660a84872ae3977209d254a532577d33cf377d22e78532aeef86db99db32814ac6fb64ab40b06a965e4b47a1d6323265b44c03f5423c0a49e60f0c4fcde7b76c18d57a5b28fed608c97e39817551a566e96b8c56db3351cbe4f0f1601d97ccb1a71dbf3e502ca0322bbeb6461abe526c94b588af35c2ca3732091b01d300036f220fe53aa29d9be031c3a116e7adc971d1e364189fd6739ffe7cdab86fe9f05576921899502acfb750a06ce9ea7b2d9fb9184cbbed7e9cf5006d342004b241bfbf124d5eb42442a92f5c2a1cc078d359fabdbb326ffb9486bf715c44d0ce87158072ea9eb548e4a5b30020129e7d24265e70751a3e785cdd9b0ddc016523b39bc38ff9613177fbceb0ee6032cc0137a6979c6b913435541d2ae704cc609663d637e3f4cb939b935612e34cc02294e64e2359a451fa1fa040e5e1866f53fa0db456d58307a5b9e39ad091df90e021e782f7b9c6cd918c8ce3d21643fd19345b4d5f0aba17c15459cce14a8695aec0220a3c9cca8af4605020ad71c80ac8ea04227413c4a5657ade1bfea4a29ccb8159f89e3388d43961410dec6b5c6fcb1581c59f1cb83e0ca7463eb4694b9580635b5417a537154f6ac756477d580d78bd3bc88a0c1a82e1a49efe721e330f419f0dbc3233be72d72075525fd28e968545764b4950e0abfba23a366c87c82415f6ca968403bf7151477f934e74e7d0728d14a2e17bf10819419d4c114d25031784178928bdfbeea5a620b5e151fef328cc9fb7d1673b8f69e570ac7d150271f715dc375dac529d94a877c0ad60dd5c977c89df7ddd0adf0fd61ae135ab69989cfbbd701a335af38ee1e8fd80543470567ead91a779fd02a0b75278bc45afe94b30b4cb31253afd26ae120044b27b8e138e47153d75bde0f632a14327a976987832b58c9061f9f8a25ee942d69a256400981b2f4d654ddd56d88784d8942262b43de086e8a0596d9a9850e53dbab5384999e0d5d4b203a918ee7c149597606eb32ee8208f48505786ea651c0d5886a0ad2a6557a8d12186660368ba18b114d4032e594ccd534929c9e2335843d452d5758d13d54fc29941ca829a636420fd4ef1de45d0df005f97fad82a841ee94b78668dd9468f0b25027d182447abf83a3dfb0c41bc2898fa91b9731476bdd295006095173b6e4e828cd35730f949283a0cbc42976d4bf22550b43e14f505a7700a6331e543334bcf3f2dbef085219c92144bb8f7dc56a86c1dbc61d7df69b9a0762e47e31468e3b53df937a0a74f5e72416fcf5246ac32e64c10d1ba59856f8a2f4d4b0b0277289096bd2e19a28ebfdc98af55917787bc1ad4215a67f0564a3cb0c22ee8e5c58da1569bfab065ca87de9cc723ebd0ff34416c10f1262daaab6c375f66eb09bd644ee9cb395bb4ad557c0a422e6ef0af2a0304bc5c5ed156f424e056259bce8f7001dd7dc41e76b1e76fd4f654b4ca33923d712a57c28d2ef06524801a35a030102d680bc3c4bfc403e97e178d92819b023a1d0f4d3db2282a045706d3e205c0a2d47fd95f855c8b380ea6679bb82e4cf48e5d36fb99d4f24d63c0b4bf169c1d437b5857c181b43233f461123b06342a97b6d6bb27e4582f774bef153c79607599ed8d7e94013fa8371641f6588d42b382a1fbf40a520ae5e48c4cdb53043d1648b6b0d79b2114b424838417774eb360fc4725fbd8435c53fceac81a0b45a954886cb26376c15c7307c5fae8ee06ba011bd33c1ac012f8cfd6f031036281a07b3167beca0698acd0ed8985a300d35e9b59ec75c817c6ec9b73e267ab58690a42fa2d239ec003c34ab3ce1303345fdec72eca3c2a890b39a7824e6e422ec2b9eab4582cad18e5e0991510699116186d30cf9a70a54d749dcd0b88466569788ea4610d30e80d2b65cc5b2ca96b584c7977dcf096edade484ae23ad90ab84c2ae5e9f2a1f271e4771d7488430295bdc592be51401efbd10f28d7a2ed93dcffd281add6a2a0d001b9d2e6cb8eff78cc602546db91b29b9287ccad05a62bf073345904c60c99911377db769ea64b641cb05dd006cd23a0772d22519bbfd6b4d5fec024df2e4c80583a57054d4fbaef45fbaf49f6efa59fd0156cab4c033f77d22bb27cb48a16155477c59f7a7a97b606c599ce1e06f85bff457aff8f3d4ab85d7569cad5b2e4bc14b810314e68264ef3c4c0e39e469d25a0d770962ef5f304b3c61bfdefe3332822ed0de40c8d71b949dce55a393d2aa882c7e3482bdfbce8edb86086ebaf11bdf2224d80abd13fd017cd8e9d93636233d757ece850150f9e54a72ec516784eb9326419ee064af08d14df4fff3116f7e7a8f23053246c662ad6a64d141e554708aac09b6d3bf0df8c84adafd4039dbbaf67c95923b4e5cedae90701", "ac5351", 2, -1526254886, "fb7a7e5c95e1a76ea58dcbaf0d9754ee5aebbd6b8fac4e5b7ecaadd6cfd8e4e6"], + ["b9455f4202b26182bd1a7d389ae1e6ec66c39484e58190eb652471472ee836d7f52b0a0a9c000000000151ffffffff4573ab218f58d4b3d1f4c2c2fed6f8aa4f7f37bc941a4fa0f1ccec14d49400470100000001004a95547d0292a3d001000000000352526ad0e6e30300000000026a530000000000", "6351656a53ac", 0, -754841972, "004ca792be0eeaf32c60be0d556bf56d8ca9b5a2915dae1fd78be9880d37cbb2"], + ["f815f50f02b7d509e1d7ec58d5016d3c0efa630105dcf347661ae1a22abb882530710df9300100000005536a6551ac68e74d347ccabfb5d28fef87bb569d83aba1c29343e8b49929198e4ae54058fab4051f0a0100000004526363655d3024350326e2e002000000000652ac51526363a7665402000000000265533017600100000000046a530063000000000119c7bd020000000000000000000000005b16be334614f17c1df8f30f8c606e6c842d9e1131a6cf812cb6a91f8b18d5de3a275a933b793658a47244304ba9c1c3670cb27696845f4ee0278ff64ec86646b16b46ffae62983fd90223b4f3397731237dce74875ec500b7de0abaf6d9d41c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1fa2e90075ae9501ac16136bebd4aed7a27832da1ce86b858e9b7ea21a32c0525da1b0a11a052e942e43d82db0c0625272b0e20acf0bed0616660fcd38c836e69eb3ca511c1625b2344d97b07fa9c7d7ec5b45673deb01d2ecab221df8656000657c06cceee9fa0e1aa9d2163c7752bb936de7fe3e01538148c30d93fa24098031d1113a258888012a1579e7018d3cbcf900be780a8a70094e127abc75f4d966103074b10be02978092e199f53a1bc0b6c0058bd5031808e92e8d367ebc293665fe0b060ea9622aab86fd525e72fb87f40d79aea5c9bcb1c7292ab23d466d80775441c6b4d58009ec51da921ee3885e849c697a85e9e95bfd8f6b80ef70ce582ceb8d030dda5d417b10fd70524e52878bb571829fcbddfb40f5c37fd2499386486c29c403251cb41f532877552d111c2f763099ebd25b5712e368c963409b3fbcefbf22e1020fcadc78042539d96fea6cc603ffc639596405358a71e48083b774146e6e438402011aa4d2d473026dd050781e8a98ad715f052046d9c0b508a5698e9f14267e7a030f576e243ae6ba71331108d3aa63adf251769960c3c64411671754cf5ef69324956713725174c1fc58a3071872c2067fe9ae3b41763be5d09a1f76c59bae8cb06189a05af68e9605ca12cf827e68d4333e9381aa373620fc409bd41a888b478f841255e9e1de08001e5118cd300b666221a42d035804fdb83e2fc69d7e1d818806640d318eefbcf0b07be70acff07bd1ce1407a803e67cf23d993db8c658d3c77a4b39581a8fce01bb5f2c175ed9ff6bfe7d0dda63f31bbd490ff10d843d430d4e392f9812f798123df9d3aca4f37fc1a1c1a7c0e8d4a135775a024d44988a48e2103766f1fff89e8c582f110ea9f3329e618cdea8565541a636b9a96ffb805b384841693a8533c2e5416355e2b481060bb04178ae545664dc1c0929aacef023dbac5f58ad578ab75b5392817358a6a79d58a2444100dcf441be0c6967ceaf4bc3535ad5dda2c467ec8bee33501190f069f5ef1606c2b9f0270ff843d8db6fbce15e94cc2e9ca7e02bdb2fab48cab65bca8b9254c90530a9af7a4b0ad2907afa3605d4964de2ca3e1d198d8c5f7dc269d551134b4d4d8d1054f93f2fdb83a2d80db817b07a145dd5fc855c5c515a604cb53af065e527d125882a1c13c6954a5fb51fded6a2c7dd1f90eab8764085d3093e5152c4758540c27e181ba57985388191ac1750ad8eb5234d2c6e3d61c28aece8ce56c1b804242194a217f7afd5acd2cdb0587d1d3ba1311efab37e1f63437655517cdf599f00d650c26eb6a53a7fa4fa49d0326846281df5cbda0e8de6250bd9b9e2115caef1eb53b5716d9d0e910d2cab290916c10132d05cdc018c8d737e3d9f50e38852053a1ad409b81c207e0bf69e6a9a24ba1df9ca4fa2032a5ab31f3efcefed36405a27e42cadf6ac3cc6783e49139c911e4fcdf23da8c88f4057f83495fd5de71aa9f364870d5d8cd8c97bea966f6fce00e938f3a1c0146f11dd6d550e0c107230143d86afa3532060d99e286469f8342e6d256aa7f5c308a0778127e5cdc0a1cf04edf64510a5a3bfb30deea338e225692298a351b5c58617d39532a4275f8f8cfe9e2a59fa06651c6a3055cede9e82086d384ddf865f2af3815047a656becfcc7f7d691e8bc5ab1ff9b385587f1e0ccc076fd07fe2f18d7d16b8151b9f6e701621a1625eef4c62a646796a276011603256ff26c67407d3bb9dcbd0a48c30f1fa446d2b0a2addd2b0b351e966ca99f2c6a8042bef6cf52616b982410142b98462b65926d2bb48a1f84eb79a8b5968f1f6989ef9f2bb7665038f86e6626af46b8282838ac8daade00225646a5357152b52b2bd7665abff8d07be8e4c8c6376c346905b0b048a448df7a568dcdcf014c81247087507189f8af2fc625fb9660abce576abff9f7b0a3b7486a8489101ed1140928139cf8bc20a6ed169ac3c861864dab25a94970e052191d8472b8e506afc897b9c393637040e544849d079a31a02dfc47727a6e73db9425779e51d850ad6209ddcf1af639fc49f357303cce9eb924a73ebe35b1cefbad7d6b12c893063a2acd9013045476a567a128e4ccf2d75c87139084d283fdaf96b0a39c555fe23e1f78efa76201cf735238d069cddd2bd95c943356ee27a967823c77eadbd6a29984e2c51fa39655ea7d22db030010a7d4a2152ba96eba7d032bee553e5d2b65d3505764c3b7f603ede126523567fde34c952ae673405a6ba55a05108fe2b9b3ccb67d481dd3043bbdb8fccbccf1243ff2af488f66737b9b4d9a5032b86af10f02eaba45c38fb7c82145b55a7db8441aca959951d94e4a481bb07d84176fbb78d03c406d68de1743825b3e6009efab46d215f805d1ec59cc53af23b07b88d196a2bb0de2f0dfa6b7f6c70a4dcf70f", "", 0, -457613618, "4ddea1bffc08bad6e72902a22ec31bca789b72c4572823efdc6ee7e959171851"], + ["030000807082c40303f9d14d5b608bd1e8fdc0c4b8a45adf8c46f4e8b20686a080cc4d9109ee958b00030000000400006565ffffffff2e6a3ab6fc9e673cfc541e827bb19f02635f46e83cf427ca472326df74d8052e000000000153ffffffff6a23b7dc3daadf3526d6ec815ac24342cd4899c9350692cd74ed7fc293c67ae7020000000952005252636a5152ac21f4cc0001af62a402000000000000000000000000000100000000000000006b50a90500000000beaaae354a134d801beada6d7a61f79b8434ae4dfd184765067ac87943afe56586e1c406bfc23f84fd96e898aa1f87d0448feb88f3d6bcaa0a3c56fee07d7a75a2b140913010968e521138bccef2dc51516ea8cc8e7d1d7a48fac10bb74b4b1e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cc24716afb3ecb34bd381b049f35f56913797a41c812feb5b2ef3e7bc73330dc714f51c810ef4094ae34c4c43967dd455e37f6528feff30e92f63b6f17263067cf8752d30242b53ed51037b3cf93ea324a1441c9adaa7207e591441317a6558693428730ff024fa37e48fabe58463c912d78a61089492e2f9f0f40383d10a691032a2f3b0e6f71c89fbc90ba0012032d1fcb8b4e9ef6da46bd15d23443bc19524e0201069268924a7f292f0dde18cd1872f4389a8abb279343babec1cbb17d07b1e40a0163146dde750607bd0792290cc3fdecbdbc93de59cb73c4c4fc90768707f7443ab153bcc7b8959adb5c3e3a974a646a3d2fb58beebb1c1b0fdb723a72307fd30328876a0dcdf4a4e0beb18f2b94819d2b8d8f291ab9298a7551c49cb43d911718030960b088e7a9ec411f6f5b2b27b6e13cc9c086482e94fa6a85a697a4b0a88c780200016495ebe09bd9038fd67086c27aa84c9029cf1a60ce8ed7fb3f8f005c230d03213104011e853d288b957f4f9e12de17e52054b80db5977fb007f49f96c6a7a703153ebf8e0bf5b6970f0b66cc6bbb6f6104a71fa08a31556c45bc790777f5667131c39d3591be4d84bee806b76a09e7cc9b40268f5f417375814133a5aa009f1436906ff5f473dd86d1645dee1a1a9a435c019e2eccc590ad50dcd8bb235221f3f46cc989a798c9f8c369208da4bb1f80130e1f58a952d099646027af5174f81d542f0de77aa35357c52f956f0b9435125eb3ea0ed87cf8720b7d8104b7d0ef9219446791437dba69fea046bc6e4e72464b5bf39049e9208a151bb7b482d7c003ce9bd6f90df53461d5bc18e47bb48369ec5e199fd3fe0c53fc44cd77817a11420146d1002873175d95a9fe435fbc5f762582af297865a7ed2594912d4e193c2febafe09100d3477529f0b8c321ec19bb845ec9306d00f5038465a2eff28a3c13ded490944d38b939610724e09acf5967b326d66e906fde9c46b51d421319c4c96a20af806d4eacc201aa4b0e56da3eb10f040e3f12a22e1e8ab1d1a1ba30b379981f6593c57fb8673f6969cedb6000b84718270d710adce5671813e557a4c24f69ed2308837084c2bfb9ee95c38fe1ffce71652df1d0a6f777133ecb92cb481174e8d574b99dccd78c350872938f4783f99d3f50c01a9e294a2cdf8d7bafb979b9cd60ea0db9ef3cf4ab91bd83ffab7c584e70e1cc85970fb1d736db8f687f56cdc6a3b340ca827fdf65bb031dafdc4df57bded16bbe30c482c5b267aed30e657bc25cfac423a84743a559fee94574eb3fe5d0ce6f28d79eefbe40f0ba894ce44a5cf4a5a5ce060b8759cc278c9234e00b38396fecc6b8a4b2fc496430d422cd337a59a176c148ed1ccff47124dbc9621ec8395547f45762763c375d2d7b910db0bfa6dc7f377b1ca27669e36226daf9a576cfd6c5345a5e85fc5760fef4a4a9070997735b0efae4836c0e4ee917766cc42f969f743d4880405b06f875bce2611a901d96343222933e42f9fdab1a6364b9e6c01b6f53ad91644c7c1a955431006673a4f5b8483e935bcc349feecb79c096f3dfa25594e96ffd3fe66e33162b20008907b00b742a6d81eeeb932086b241a749ad6fe11ed0da57d0bcd239977eb37eb6b084a1b1a9894a7461222a72cfe365fe4c0d616b91018fe874bbef6b99397a732b9a61f30d23a4bf48a9062aa2e9b69b7602c10555de55b0ee0f75ce5912fbd2a4afd3b60afb78c0468ee574fabc969f33932e94f1b5a9b5f4e4d422a55e8f7cacffd4acebbf30c851356a5bde7d9f7adf782e45467318787f01267cbb4a615b9c0147dbff3ac52c2a4b1809e6d48cfecd8910e521a54181665a64c5da5c0b32ae9256e81cd36b02eb30523cdd4c76412ddeff61fe11e4049e4a68101f3826d66811d8efcdbaf214b4cd4025c9a748eb8305e6f6a810bd651dfee8ad6a2a667a122f4fa4b7f5b540b2acd84a2620bfdecf7f892f13a0d9f513bc53144bc633e1f96077bd7cecb6bcfa923df273ea487eccdef656d68b3d73baaa093ab4fa879e1e21a4d10a031b0407e8b5d220cdfcb1e905160de8f5b0aa08f3f80632a4a0fa7628fb3ecfbd1e208c5a8949e161617c979a0f59489dcd7fb5422c142d93b6f76028f7c950a26c0f9712af7d46209b92d3aa201de530c75106b064ea519758d580177f264eaaaa99bd18bbbe3664870bdd8e68bcda82e21decb5d91f64e1f76c5f916de7de7693d0a7dd7e30fd4d428435d10a7fc5403e7588c884e55e244b5cc920b64d7fcec34da074ba8518face29204c800f9c0c7c15623dad1768e5ae957e1d664c4b836e49c9d138d0b40b50883d5bc2276a5662df98ac0ae060e2a3fa81de410f0d3e31f5ffcfd0c3c597a8788c2aa417c0d8b37a8628df9f4a82f04a21e8354ba25d802ec8a419f1500ee800", "53526365", 2, 1090213351, "c956f6d27c2f002bbb9fc3b3c68a6f5bab61f31b392522baa67439c7d08fede7"], + ["030000807082c403010a2b543c358a328e6dcae65b42ae3a9748c157f63e05ff60496ebd5ffe0b019300000000066a536aac526315946b16014bc3e7000000000007acac006a63ac51000000000000000002000000000000000007b9f50000000000935aa5862cc61ad1fd89a8b0c0b151126d7156a239314f631559c2939f57fe20d1c18aa9542063914d0eab4af623bad9e3677c71ab17770faa1b0fbf80e038ac4b41db4009c6a153263cb3f63df7da26b3296f4c281c79bf28657bbfdb1676bf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f5fbe5f16997d8306e1caafc3c8c8a52dd513af799260e5600c191f579e5be92467bd6febe20ea2cfa58d4467ddb9bc9ae818128b9ababc68b130ebb7a98f213a5668b8c02e6e9eb138ab028e263f644c50c4d7521314d07bb20a68ab1ccd04036aed4c24b307e0874c4d194e32c38ac8eeaf47eaafc16ac8c0056efc8f25f480318a22cf82c5a852766b80e5598a66e84158ee487d6a3adae745e1d9ccabb390403129824c1091827b17ce81edfb385f0ff9ee1a73b97c329ddb82a84a26db55d3c0a01e5d5f0200a35f449120051449d1755d338cbcc00fe796d1edceb7002a5727c94f29470cf3396ea59a677e192fc63da334783f1f45fe3f1e6df563e97fdf1f4030b891d16542cbe48ab99095a65bfd406b4efccfc2b3e9d25b4a5ad10019105960221ac50a28e610c7c665e52342769949e268808381986e17bda35596fb545d51003035eca2d1dcfbd70e22841078f9b3adc9f2af614a5db2366e68c7fe491c2956e03153d88855ef87a26e011eb49fe2eb29245f9ee1aeee55f064b4c4fa2b62e08e1020eb73ed7626f96334478761aa1943295806d808f3859e5cbac9c8a64e33ce5ef19796425ebe6047d00b1a0041a0a8be5c441907edc181c21f202a37d706812f5e546e155df3184c70bb3880250b1d6dcbb165253be6d4c223814190569cd6971d49060b322745af9bfd8df69f61e8cad4b0aca1f910ab082dcd4f35949d1c19077ac2fe664fe345a6741e9be3b3333a92718f802ef89cffc094a25095c30ac8dcff6f6325fc949508112d2e332cb63ab528ac60002a3753b4bb4adbf1c2acdacea7fc2a007bd50da7cf2bac70f72f06d34f19f082af14b1b25ab6b70cc8d84b0764c9057c8f996c2c83295a2e6bd1586f1fab830d0d274793a4c7932a2f512c9dea3ecff6921707ccc31ebb6b5b8cb03efaf2a82d70b8128703bbfd4d3611c532a6742b64f472f1eff4d027a786347e54f3d4c92f9a84f01afb82443cd423ff973c99d44e47b0ecaf1baba2432e15d26aff7163cc9bac76900bb72663a2a93806c3a82b2f8810d43820dd41ccd4e12bc3c2f4603c30dc6ccb24f9e904f9d252a3b1f8fa3026f9046750c92012eb5df9fa4b6276067d34af2fd7ae7fe1a2fed3e549944e6eaeba7d0db93da981851e7b9123745a9a5e69a0fe8512b52935a6c7b0f7a82c67e79fc9174814c8c8fac24157888ecef64b0ba1b3c9692d6a321cef2aa004c21f56e311986c1696f9243793ed3c6318e1d4cc9ff80923f9d55bb6eac9db64480110fb453e837bba140c0699b992c3bc52f91a0bf70d1bd32961f17b0b69eead4a2e1bf01686ed8d6f98888c7aa54cdca296e2014f1354447bf7e1cbd8210a9291cf87169764a012b6449b206ec7b2178b936402df179395771f451ad516199b4ef294ba7a77c58ab15e878fcbc7e1d60a40c5ed2789a5bff7fa6b87ec499a3d55d67203bf96d2408bc20f652b98164131627de51a1e1e8ef8bab54961f39b57cce8c50fb25d0b0da6e5cda14498fece32a9177c2fa8717fd52e1a30a2fd957c6400496cb4fd4a0874aacf1217ad0c694db1f1ab8aab4a4e5ded76db4249e15cd07180d24d7a97b58eabf1a2ba560a2b87d5f0cf08d73936fed90f513c02077caf2694a8f6c0713da1283cd908a8959f01ce275b715d817b9e10e276f21d1c3f47cf71a805ae488ff6962eda5c1e8290ef82c5de1dbfdd63171cc24706dbc888b2c83f699734906ba6f32ca14cc6f95f07f4b4098e2cfb2a42fb99a2ebf1ba085164722b22f985f1b1802e209999192ad8b9b85ac876d6ecb882f14e385393bba433c533964db1671075117c6f801e0bddea9299b129b92b40bad884c669302482efae9b828a1558d3d779a7524fe764bac006d438874150cb5e8b19ec5e8e75cf18f12e180bf5c0698376847dd5cb036312aca038496339ea72b5247be502894eb1d3089416e71f7f985dde3bb5b12b7bf38ff0b9c656fc20c39e7aba1e86f7503d4d1baf125665f1eba4dc9fc4cb8addc81c919ebc1051e28b00a2fca597aa0afdae12d492710e20300413aa664cc2000e8e9249da80a4029b4f3828eff4ecd4cc439fdc8cb8b3dd51d19c85ace94d32a50a5ad2f75634c9af22ec6c65b11dd847ffb1d7bb60144fa86f2ce714bdf6d11630dcdc2a4dd64580f8f59c25878770751cb4f457b027c1922d6abff57f726d297810c0c7d4dcde0d60a20d237c40c00e77451205a09df4d987a5756ad3708e48222c9ca7462d0e9509cb5b1e29a748accd925f9e16ff2525b67838fdc11ea350400000000000000000000000047c43eee889ee8639efefb20617cb56ab002e9d0e2ad682acbcf2ad43b3169d118a3225880072763ede2e357d679f448526b1a1d8360f161f683cda04b49f8d0984c2504afb60195c61073b36c2416c5378f82673d89659f449c7dcd465ecfa0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004cf6f68a0dd735e997507b63b64d4a2a5e13bc328a72fde99407f6a528c99324f671362c9ec32f4abd63a02b8db7f8b92f3662a95de4c2eace6b1248cf565d0dcda293eb3ecbc5d6400bfb9bc92f8634fde3e8cc8573e3b87014607d59b84878a9d14a14a50e018654b53ff9e93666b9e9e2606ffbf9eba590c2487ba4d1c89b0220998fa558d09a7ebc34f327460062fe11c6a0ba18fbaf2f34aa7060b69f9a720305e3135ded94f7fa311e5e1a83fc3db14743dbfc8dcbf9452e6adaf22f23cf1a0a08193e76a1cc1f85e1c86e3f41e4c073fc8bd1e83189edd21192bd68ce5acd6b63312728937d2389646b056c8d4f727eadf5d24a1cfdba9712dfb1f317f76c1702014f6cdaaa52f28f2b5f75cce155c654f8d8953d3b78add39f4ebe0406412e78021c7af7ac0cac89a33c3afc60ebe13b8d1c8611fbe2b180ac7e217dad0d51aa67020b629f07760a8f6afd36017f06b6c7baac89ca3295c0ea1b334901f988b1b825032abd4dc904237afb3e286a2095b0cbd481c2b67b666f391558725601f9639453031d88ecd11f7ba677522bbd756de7b55050e389cd25092c921df0bcea872a9c21ebe6df5fe092a4ba909005d079438e13b93d5e912ca22cf90a99ffcabbf98da8db160f29b62119342f47c8d7c0eac5a9abe457336ff64d58106ef4e1d56799c4e5492cfb276428ca60f89ef87059d976b7f9adf3d341daecba1a2f5275555a29a41db91c20a9036bf9658e73b2dcd57b300a0f4401b21a85af07802738afe7663d24c0757ec820607987b46c971afa8a69053ce9d68856f68f17f8c70451ad352a6102d47a94fb8333e4d59fbc6d8c3227544f0495e0a0326f67559b6a3a7eacdc6d078903ddebb498953a4538bf28d807b46fa15579ee62496b2257af8d4e35fa0c364b4c527641fe00aaadfbcf20fb2b20c898bea0c9f9f49572e79571e16eb13b43e6002cacc8b629f4e1a5a6936ca769f900bb09d9613a2e8cdc913812c27fa6b7b4fd9c9732144632d6c04cbb5a0b1dd332f54648e9fd5e4bd1886fc0cd8777e3a2a1bb7e6cb2759a46ff9500881b58d2814c9d57a2927d416f3b7b93211a87703928c05404d16e3a1e2795acdc124062b2fae5d3ae42746f4f5d9e872dc73f9820c74407a92a483f4565ddc1cd51007981c2d68504ae2376f55c392e04939e8fcbd0eb1898196d2a4e79aeeed3c243327de8bb0c169c9322ab00ab74c6c4aa1c6b632108de8e9b123426967679855127a2b625e7cf826dd102b9d9a3e8ffa7f41e9c16b5a486fa17a922774f8930f31ace4ddb8a847b21a8c2ef06521d9febf2534e55b210eea270899fb4970e34de39c31864ed3b2ec2712b4fdba506bec0123fd3b6d7bc300d8eaae20730a1580ee35e2a64d64585664c8cbe7afdefaa047cb27e6f5ee7ea4dce7a0218dc669cf20d3cb19f2ae2d13c9998cc745991559e3f9407bddd18e20bd7faedcc1e50a5eb5e30f9facd7aac358858d4e27494972546d85b92d39f3a493bcda28eb87a7f559dfec77e681fa0ab50d4214b5d428236011342c6c0a8b0abe8d0549209d1410691a9435f49fa7edb3344ab2fc87f36b8c8603b5656faaf5aaddc2e2244f1920d00ca0362be28b334c3446115befe81afb6f226659a70bb17af7a06e703bd79bfd1a2186644f13aad47300da47e3581bc514c88b64e00717aed6675c4c6e05db5b981996417aab3439a1b5732ede97f4e70371af0fd6f8ab8f215e6f9aec0999d5a8ae2615bd92c7916e93b1412a4e1b167c375d4273589f90148ee1fc1bc444ab420dce510d4d8de24f0f9ee7029d3de33801a139638d2235437d57408032f25ba799fae75d69e05d84fc9d02b10e548e6b787f1d63a8f6c38a9b4b92ab5beac67af91765393ba55772c53b96c67be069de739fbc0b8548e70f8adfb407461416358f11ebe55c690630e077ca056d9398029fd7d2f2575668b2610c1e6877a767a633483c8ec00c59841ed205e37af819a9d2e25bdbbc451b029d9f4a3c7cef732b2524a61a0242d82d7f8825376122cfe7c8429b50c34f1eda78aedbd4e83df30711253bd1d125ad592ab0e41b4ec1b99ab9302ff871077ce45ef72897ffc8d95ac66565be30a971184941869c39a5b1142fc3ffef3f4d6d10927c042afa4a7809f441ea8efb93a4ba6e5367f56a98508d2506d909278aa5d779513ab9a253af4cd8afd0bee323fc6221b72e1c84e8e1bd78073e0186db672663742fe08d40f74d700f85ae5c33d8c533970947d721592d96a639ae06256327874ac2077e8a56677ebcc861db51fdb148d900eed18bbd0590036eddefc782bdf5b64f7e6eece2be607ff61e60937cf481030869cf4b3e667e788b4cfc39a56bea9920f36e8bda712ef67ee785b6efed0dc4d7e59ce8861114f8ed301d2d3242fe324ddc1c004", "6aac536aac6a5151", 0, 409973093, "1e4fc4a8483205f3ab3d0f9c811fcf571ef06285256b203ef57c75f7b3301ab6"], + ["9134011903c0189a01b2b171fc6ece4f7b5f5b3fe5cda191eab8c13e9782308f81d3d7f2390200000004656a6300b6959da84c7d85d4365941b9361453fba856c69a2ee552114696f73beedf0c403cca2e710000000004526352519d1660a287c72ff8d1df255b34f8d59f944e61214279cdb5c005323c3d52c45dde1e448e0200000003635252331ad14301d9e785010000000004006365000000000002c0e3bd0400000000000000000000000010c299e5120ce38d4a65b9c4006cbfc48611670e2fe8f4a1894c573c01dd692d2c189c42169c7e79d49415da29d0a0df2e193d19bc75ef2fe4ca9bbc49767992454a2a305742b5d0e56a25578a9da47ba83d839b8658c54fa7394b0623649a0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000286d1447e46da2f127868373db6182be7e11546295564995f65f28ccb0f7b86c124c1a8cc0a0ecd675af9ffe4d2189fc52652176b8ea430193e369490a7a7c5fefec3a9d4076590e209cffcbfe2cc616f6bca2098a51e81cf82335fedebed83c5a46b513ad7442832f4ccb2b54d8aaceb2488a679f69cb308fd0a7bb54862c6103073cc674dedbcf6b8a6aac7ac3981e438be8133e7f6cb428b013a3d66a6aeeea03155d6aa1b0eb1cdeec355a9addf54b5bd9f5976d6434ede8ae8dec492787fc830b026ee19618f6d6d4d274f3e69b31964dde569a438595655ef589fcbdf344a558f5bcb7c803202eaa7ca0a6997f9bd84711985f428c5a060e1299bbe38ec2c62e0306ee1e9ab0fafbbad70414ece5b4d7a23562d5d99ef0d19cb44ad1003ee4487b0207660bf77b3706beea950a68d7fd6ae16419eb931f7b26b2e630e8378d0622bb022c43f363023c7906c0badd6e9c10c4c11a40c2fee9fa8e1f22fab6db600b6c6002102665882165183c231a7dfe6ff98b4561f40eba5f93e34eb14b476b0b965d1703163831ef0a353fe547afabf8d535763f926623a85a20e681b081af5c86f6573b868a5af5ca128a676098029e390658f565396ef2446d5fb7f06f43735bd601b864c0b96391df203e3bb09ff88caed5ada8e0313bf53c8684f559c96d4a5f365dee522aaf21049fbb19e843f82e7831bb99995fde755c5f65e8100893ae60f3ca26af011fdd16e90bf54ddc54072af5ccaec0573a7bd03c0d7a16ce3fe638495a41ab2f4d85b75a0fab6b8e899ab62dd447f1717ff365b0b5cf457a63f0b1111fbd3f22d7bdfdd78cdba1d43ee4fe8f7a65c1105d7bab1ced021089c38d59e5ccf706ed413bfff4feed9e6b798368590f4b0dbba0ac5bb6e2b68e6adfa88538a0bf51ac405dddd549674eb6ffe25ee530e68b522a3e753c790deb02c20b253dc755f181bee448baae473517dd2d33b53b4e5f79271cb51eac521b90b5197fab2fefe6a849439dc186de507c10010e34eb0940d800f74bcd708e787d3528d8f6f4efb2797f652115ef6ccb61dac838f595ba13712f36ea417e17c45ca3132b9b7f98660a91953bad202b1cc08bcd2b4f60c1bfeaf5f95bdd28fb25858a280b6f871c85dba766067e669ec0fe62bfeb482dc773642d7a463755043037b6cb23b8641dca2ce6a582baa149fed33017de2cca179692ef58a50fc0aa06ace6e2553739b23dae9bbb52fb806939534e7883861033432221d57dd3c2c2bdf73859ddd108a414a9f7bfac3adc7a5b75f023b9fd9a6751657b45cff38ee9efd16ab9a6a8a5c36fc4c2e158231ecfa640f220e472d118c490dc7c415fd2005f342f974f98a6e6bcb1cf7985ce8766e9897aa9cde6171bcc18c7fa318de10a01deddb1bb8bc9b2810f6ca5e2ea6dc7ef9f9fea7ff57c6196fa0c5e1908110f644253751e4bf5b552daff0e25ea34006f97b1f40531483b2438df93343f3270aca6df073810995579bf257a659212d7f403046c49dde902ade58b1558050d546e649d65a66367c865faff3d8ae1f85d815fb84ffc10fb2fe855a0a8b27590df47eca96abb6a38f0efe648dfdaa5410d1097bd380a7531afd31c261944f076f3f59ad8d9db9e9b6f72492608ca5ed0fa8d2a50392d437f7e75f819a767354272874ac072012e320681b88f70b578102d700a4eab9d1196035688a671c6265d34a8b5f67103ca99cf314ca2edd0cda58ddbcb39bbdcfdbb592e4abef452200b67b4926a8d38009a4ff3ce2639c57d8b6a43e5e254f84dd7f7f405b60fe112f1222b82b615ee56e8201dfe32e3814428f74b51ee66ba068b88af91f5356135def3a94fb6c0af70da3b706177994e78325852094e5f889eab138cb83a08c7ca732c8dabc400a81975bbe7e6cae198ba32bba65375d98430fa46a2d5f15c52c74520e9a71ecccfb7ec86c3b731183bd5ceb4e019784819a8aac91bc67f86f7214ee87b514687524a09fa83d8e33d39d9a9f64448a4e938cfab15dd3ead6b8d61d9e9c5b27e05d2ed60d51eb745cdbf39dbd6dadf614f62c71158632bbfd207fd90520a0458ac3023bdac6293c8ae8811d877439bb75420d7bf8f54eca217e25bba0c159c10b836a8129b2487d906cb822367e48876cbecf5630ccad5b577fedb5f7c9f8f148e9aa21ab82c3bfdf53e1b8ec3e9ead153c214b6b984fe12c0284f1510bb4d35e5b9258579eb26a38a678f0224ae78084369029f18035084895e8d226c19df6e58a08f32062e4feda7fc83720aa9e5fa944008bd3ece0000000000000000f099d703000000001f52cdb18438750f845294cfb3a6038a73ad06c25caf7fe0ed029fde46a98b86266a20269a260ae288c243df42a9ce1d6e46fdde99cbbc9525d122174bec2c549045c59491bc1489ebc229843cc1c751a17c647d16355c486c41cc839151bd70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008e353130176e93a52a298f4bacb25d7213cba568d50ba27517a3d7188734a88a25b3de632ea09c763474cf6c004b089113d40e7fc6391c7cbb8754817d29949a0de4098802b4f5785c77ddd1d5fd5f0dab1488a988d15287db298bee8fde8eb93110740aaf44ece4c350c935fb79c3107cc2c6079b33fb13438171f6ddf78580030048a5ab6f1dfa5ddd92e7cc5bca35465a00d8d3fe07529013c0b31ed8d78d7e032f66495c3388b84d2e6fab58a4b95cd0a1b862179dd36e69f182f1bf7ed51d730b049566d0e4ddb86c8c2280468216428998187fe4d8b025c96e232a8a966bffc39360100040c78da24284036686a8256186d2f1bbefc9c4da98f2f374dfe4f71c032e6c1c17cc8fb0ad3514f375ae672274ebff85e0cd850ccef973a0f41631e7560314fa38a908be611d8d8efe9dea403fb34b76b4594dbd70e2fc2f27313a9d5a250326fbdfddec83d84602ad978a4f5fa11f088d4c0acce623404ef01d6e01f78b59022b991efb20d315d3a99efefa1ca2652bb43f3e603fc86882633f676890446fdc031e325d67689d96a31dabc9f6e54892ca74a6fd96c4035f164d010346d4662add898268b14e9a7f63214a75908db63b5ec85886a67acca4308d5a8b3863db3e31d1b64c2ba2f2075152757875709da47296d4c5439ac2b53e12cbbc019dffec009348f45f2ece5a082ae0e287f50e5f3b0df6c1a0d6db57412b7fde9c743a0e983a0a26e5fd9222c53672e661fbf82ff50623af30d2380bd144aa77d374d92508f466bdcb227897dd958d2dea35257f7a179bdc9201e067e2bf3968e645ec7c27cbd4c82c5a74841cdd994d8df52816e645dad97392eebe539596053c491aba1b6222b455034f39799455b5daf278b5b6487cfdd2f3628983cd075f9313f3646cf075b93562b4d99bbbfea6d2376fce029b5ba7f6d59a240bcbc141693b0798d611e83bd40f28e07024529bacfe0a8276942c76f9e9cd36bbd2da72f6336a739182baed4af72d7eda144af8d4c600e51c5d5335be77cbddc6e7f5cdc9bdf02c415c02d79618d187b02cd8065e8a5c783502f14c6be87caefacdcf27cba866f5851dc29d882cae4197c8ea1a83395399d670e87171438fa365cb62ba0bfcf07a078374179c5d64ce43e8a0bc6d9fe970caf2c6b872548da6ae18c8ff25710c7a8421ef13b33a86a721e1ba65bf6634f71e8095e78e09f3a14cd64b4bf7ae4d8d49d92d3c4e6f8f1316f9baf3282372d661866c95fa4213e241550329e75f0a4de648b4863af63c27994a29099e848c0ff99b31f2f7a3158f53f2276eb2854cc8a7cc92752c5a3d85a73b6320d4844b5039e6a11297115098c9bf9ac626b0fc16d92e2c00bdf4a1173b870e73e5b030b3aa602f32f54f2107093af7d9e093a3f364ca36323ac1f2bd1a44f504f88e26da497a769a90efa05067cfba448bb0608c95e40b486254546d112c5fec14efb5660bb8dea4001f3b8c3598b328491a430ec4573aaf613b4b1a3379ec69bdf19dd959e2d96793ef74d2b66ffcffb92ea270a6317c7b4f4a2f576fc039274177ad63fb93034c82da13ce576f8e64322292c94438a5e6dd33009e0283780b94a957cf7f4ec1c9c3365ff5d092489c43eb8a1bec2ee460c9dc8366c881e79c07f44efd1ff65993216f2509e10d4cb52ef06ad46fb6110595b0146cad630f39021aa53f673e1c70806763db39a248783a4b106d4165b8aca44ded8f7e82f73d3ef1b587e6ea5c719b43e88171f4491fde8df72a4d973e35e073119bdd4af5ea32fcc6c26e0af4d4e49d0af07c3556fb87b665c3b19665e49d83e43db56d2a4bd53297edc1b400b73c3627f0e9aef64fc1d28a60b38305f46f7fc18a9c79a7da8f19f1423ef170861092ad6e087ad3cc11249ecc530708b65d9f8bd7c517b4665e716ba3ba65fee60394856b64c96a53cc83ca7245e07aff60f15ae78fa9b203a8adb0ac1aef947686ab24e7da0b59d9fb822e46db7b6ffcb4169bd1ad19f5049bffcfc960e8521a609407f17b44a927be1e1aaede285299661a533199bbb9f5cdf496eef62f5dfa061aabb4d1943c9568b83c6f5a9b12aa2efe96e337ee83d4d77c7f62c12453eac2140ee84817938f7568874a684f047e09ada1f1f4aab6de6ec2f5f39613b5aa3f2fd4c3de9c74117bac428711cc32a35b27cb94c16cafa2249d5c6b702ba5f4c867259652a0d79ca904ccad9d9b0b4ab7c3668624dfdc71097b6a7bbaf672cb0a4211b0cabf076a5dcf5390dd83714cf9226190c9c4f11248f5a17cf94416d838afd502bb3256b96f4ce4f53aa7f624170b60a3fb3155183c3b2d7072a9f1c3acbc99fe0875705cc4acca0038c86273d955b3ee5fdedba9912d48b7016a8b54ddccc8b5dfc84e0871ffba52b6e85afeb2db6f23de1233e2839b4d91596705", "6a536a5151", 1, -1274031908, "b1a0d30de855fcfb63521412cc7499e6369b742df4c01d5eec373585310c9cb2"], + ["ee72f43701869dad62bc7929756942d6a0b3752235d1e8b608b445e790c0fd74849311457f0000000003ac526affffffff011d211203000000000060a65cbd030000000000000000c788fe0300000000734b81014e2cff9f9215dfee0f6e018c95eaea12f79e28fff9ea3b4544475627b762e0d700afbaab12ba2a04ea24bb4d89c58620ca7945d66129ca41c91537ef2d198d2248419856d4d7f94914b7d90052629197c6ac438f52b5d4966e77c4f6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004f3e5124de0df262976e9ce211e2e8b73e9b66c9b9998d9cb0694938582cdc770500e9c7159e809b0059c02ee570cd87def60db7446744b4e52ce0ac1b4b713db81db5612c871e758deae3b21f4e867994977c64320ba0a40a6ce4df5d645ad195e5b6dd3c2684bc79c76d7b06899532c673acc32020d4cb176d8b9166a41b54031344483eb74a59d261303f536f5ff4b07f96d773cd5969e740a427bf37e4d1680215a4c43eb750be5c84cb4572a60304225b44b9abd7ca2d43e5766bec0b0021770a090b8bf80538cc96d3fa915252d60a01d7fb22b421055a922fb15a77aacec4264bfcc91715b4f2f5263ffcad05c08ffab2163a2d68c38f9c88ed392fdccde3d2031acd0856dc23d820b9d890220d93c4185fe8a0aa22ce3aea013db1ece47aa1160316248a017af82ca281c6ab82bf46edd5483cf54c77a342b5c14487cd761abb53020866e4fa23ab0901e37d0fef025921dd493629d019768ca107e913e96366d16e032465b72217fdd64fea1c49284d7606a2d397a406389e724a52c6a765971e4998032760ff0a894bcfc4b7b33614323278e9b3498c507040d45c0618e508f027a15af2b41e2b5e43047cb65c4cb9973212903a0fa7b9853a0b6d00dcc12e2a856d7c8abf99ede47c06fae93b76d068d6b97b1b00989f5cdc8d58285eb4f5ae93377d33e6cd664a62418603ffce1c3a521b371d26352f49b2ccdfa9becaa425086ca69f5698343e18139b038022294704cad18d9aed4a2c3d0a2265bac9ca50f68b208f3b98d8013b30f6bbfe72e57991c50c06a7e606606ecb708bd064841d1929a4925c89e2ca61d82ab01fac6f3bde69e30569a50432654b8ef337853d98343356472497858a66c0cfe4080a3394ff61a5206bec298850c82d2cb7af9811185425b3b2a9f2acae4b334f57803444bf5d6e7263016075ee35e45277e821c58f46f4df38d2f2bb73e1b94040f51ca7fa2768e2c67444012c2965792d1c98c30da98158c344c1fcee459cfe8a719efb689a702944626a9280b162a8b819c348c59e7e3cb11fcf916b643b8ba24bb98ff8d63fae44bafb79947dab630e909fbb515627802493aa6d8e4bcb0406e075cb3210607f1ba7857b844a8455102cb99e72b547b6bb42b24b0da7a712c32a60939e95c0806370041d149a04d0ba183bcbfa64e2b7d97b75f808cb66be72d79c216a90b410016e98ae79cf1e35bbdd0a856d6463e193a24c85dbc689d3f7302fda214ae6de41662a946e69f8a9a912de6b9bb74003461858b4e361a234717faa5f32afb5ceeda9e58db003eda8f4f0a56440644761dd5f3844ad72958c5285f2c39db883b8461327da9c4038600c739768bf8e199d4d38a59f117d41fd86ed58c4044bfdc67b4172fafa081f9d41cd3b825bde11259ae7bb8b2bb6966577638a4a52e84ff2445c95accfcd5032f656016062750ea3334b49f198c82e58954e287b775ce9d6679828482d504370748558f5a5f9a6e6ce4367651929d6ffcc27b4c65329fab594ac86043f0a098606d6e97e987e18be21b0e62c885b52c3326405ffe13e0a9aa9787e60ec29f700489b5b737b267f2680c3454d54c21268429340f18acb34461c51b93987f1fd8d1d3701f0a4aa71a8fa0200efe6557f6e929907cf07ee26e3367de8b84b76dec633c993b24ef778efc10cd15eea2d5b845a4565f09954762b88ad9c348e071f600d6f1c600d1a216cd31f31b7caec2c7d33802344001c02e81eefa00d5405eb3097972de10bd2d304cc94b852cdada599c6f6a010656eea71c39a40d007394104ca1f2fe0335230e388d33b35c340f6b909658c61a179e12361f1ad117bac16bc774c244123e0b84f271d4a1eafb61e5050b7a3111805c7bfc3cd456354e1fb0c2b346e26aa574bd55be41ec7b9edb87cca0124715bc3378cd2d6452bf91f3e129f8ed73e6b01d7dff203f908d5bb37171e9f3d00a1ee0d8b456d4e874ab5582b23788f01986da72cfa2475db229a08de3fd80f3dbcf2a10aacc29d01839d0143c083c913085cfd9bda025aac44993262fde1bd31102d8704935775b5b3ff3e31da5ed8f37c14fa81792d04a6c9f7929c38e8bbfb5bf1e4f056d253b8dda31a2ea085d311999a72b95c54dbb552f4f41f07e004833ee12f393e2422ce30aed48be2acf151f30675b7f7764cc2d06576d664d453a6b3845278be115d5cfd0feea2ffaecd6ed666d7d4ab4fbec4feea4c54b13e21de103df0997ac5bcaa2ac3ab11d6085e1f4739a1da28be1a449acbfa40bb2748750ab7939de93d15880400000000000000000000000095f519cbf2ace227870531e8022195ad938ea3b281291d58d7948684025dcb2ff15e665617f1b7e502be48832b96ca03471a988e0c633ef3b96954465e9a0848bb21fc602fd403bbed996b22b9a75440023e5a89a23264fb4b72484f7a89ce73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f1e5bd6c21b7307d9c6c9847d4fe0bd58dc659a7d6ac55183cb59302a1bde80e2a8cfb28794502c06585cc467070006b84fee04c3a80b41f438898974139b50a169fcdf5a20b76ce1931dac735cf72121cc090df4d3bc707af6f7f90fe289d4d84e325bc660457b5078cf500aedd982acfb03118f5e44ca4a64c0c8fd9cc59f030f11bb2b724d512aaedeb927947506070722bc8daf03f72577673de2215e706102065a9d6dff15e159f7b4220b808a17f8f8035496fbf0396153b88951f78a295a0a0618a637a9406b92486e30ece1929bb0385073a12af55e5b838ffce9f0e63fc4954305e063fc062cef1b0156e5797f66a5929af3f418232e86961fdc3e604b2d0316f67e2e63c171b7cd076bcb752994debbb7c7452f5617339950d3c74a1ce48a021798925c63b4a29db97f41d90ef44a5b51ac1c59d99b81fd5789004ce0cdbe1a03169a421f57d3b7d9dac5ee3c5ceeb9c12aac4d8315847a5275e4aac8141105d90309454c6dda5787d54a735334163d43b9503d8899fcca26f806a477cdf5851ef50302161fd59e6ea3bb63da25ade3feaad50f55cfe02a24c85ee91e15e52bbd196221e6994057bd2b4942d31334da29252efddee065d4f42c3ff3ce86c1292d984f66082e9376f73076457748eb308291ba4cce21a1bb2425ce3d134b1f0e2fad249f31a1bb278b170f61dd87fd7d8e642903df180eb14dacb6234baf01c65b04b9b5c79055c5f3b78880463777295d3fd9aabb9f21114fdaf290fb0ae206e510178d0cabe93139939627033111a8f1542640f55984082d4ac806d3a5818f5bd75699bfd93d52031a56b323bb3bb6a8127ea91a013204bee39a73fed0dcc89a9d7396f32dd1576dbfa4413ac347058caff5ee9dd2a11d364eb9fa45f53e37119bc8a258a2465cee828d3f85feb2509d36396da7d8b4b42d31db46ee09d3909fd8641e19de878fc5ff60463bad1c058d7d3c7195770f93db79975f72521a698592786929c4c16f115c3c0d1a61135e967543aee79fd6fb986af79a957292a58424da8499a785a5fd6b0a469333a432bd7aa4ef27328c77059bbde9739d76206bf9ddb55cb4d03f82b3c7a264a209be1e59a35c7cc72a304862423912b3afef47c92fd7cfc5bcecd49c46256e7995d43fa976377436106ab7c23c1fc22bd2fb939f4e79af8c1fe51ad372247224bff441c1b52a33b8711c172d66383e8db38927dffbc0d9377e23e5046e7c8df58cf12257981f785b5fb58b59c0ee180487b99d7c7568438f4d79b0e886adcea74942bec8e2017a937af727741431b53e9afcb734d671f10820e20adc412148f6db6a312d5ffe85421f23d3f99f95548b46ab10b35c1ff8260a73385d7b3f3776f4e88907bd3f0deba71ff05101ae95ac821f519900a787f7db4e761af45213750b6cb267d56d0006a8c70de7eff14daa611ac7ee25136ae80b6c5cd38b4520b24a668a0c561102c8dfd63a80b5b27f319f1633fde28331efef22851b1a1936d82eefa6217f1eae154889b44d4ac3bce338937359fa245d34097826f4dc0e93bf0586953cb3cbc86be5d44b88a246e957cf5d72ac667d028c3847b7543deb1772e133c975e6843ad87e5b57b7f52550bf379c4a5f352aac773edd5cebcce04efdb649b20ad5ffbb881e63e6d1e0ccfbe95f25b763f522265e84058bc94256ec0442dfdeb6da66c834e1c3dd51c9acdc248dac15d8c4f244edd74454ead606b3a3019ad3e83892e496f9131e00f7f9fdeda2eb64758f55930f8d03387e24bfd2620b1520d90ed83bd2ba0467dbaf7e4d01e54cac606a0fd6d948f688c86ab5d1b017f71bbd91f89527490dfa84a30b575e3fdaf27dd43757bfa848d58c533b3b2e697afcf80ae48e339a657425b9f3e1f3f5153eb25ff4606571bfd3dbbeeda22571e433612a5ceeb306fedd3fa44e1f2cb26add2db30ad43d55626a2229346dfade40ec27c23f7c3c2c595c81d3fc3e1acb41d1b2dcf7769d918f0cde09e4a426455dce34dff90f766a182549d1be2fdd95b05561f31c025da9cb9bafc63215aed3ab17ddc488f69242a11d2968220b6d30c81d40691aaac4299b301050a3d618e7c10f340eceef1532a73f95502a82670f4bdf85c30538d4ced54fa9c7da727fec1c4464b1c8a7468e24e6b454f76df781eae792e962ac3550341a9f8e34503d5463a3d05b518f59bf6de5ced6635ef39c893a387fa62cee83ae38988ab3e237a845cf4075492de25ac5e202cef3abf431773739baa94f6ae8dd1fc4c3b4c4b4c79d8d4dea691f000000000000000041828e01000000002bd214489274da3f13c265322addcd4e88c71b71f0d6faafe2e7fa408e7b46f4cb142e8e53846aa592c542f7bd698e3f302fcc3efa0d3b8fadcad9c109c9335dc26fef5b068f7d9380ede962e2ff0867c0d44c6d53aa3abf740b153fb4410dba0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076b5d3b9c0c894e1582abf1b9ce32616be0a15cd7faa4ce0675cbe3d6434f706997bb9ce837b8659691f75a3a49236849323c1f4b859de10a6893da57a408f93b94bba308edc9e17ab5c0e1624c91ded727f82c7ffa1fa3c3dd504a2b59689e97097b542d3490e22b11ea9c18bbe66544102c37d043cd9748eb595d9a2347afb0202eb49f56968f98288511ad25dfb96245f2ca8979f61511cb4993e8ddf02f5600311b1de98013866b43c1372c51cb904038b3be7f53f0edd691f913469e45d948e0a06cc1f8d0508194448a4d28359243fecfaf3a400658a4df8e0c83aedda746834b2e7d308b5bace2bf63ab1d109e184c9e4af4bb70ed54e3232f5fc64ff20160f030f5c9f75b87570f6546fd1d7f47b0d86498fd68b4b949b0386ddfc16873cda41032c779fcf1c04859fe7fa524c54c0e49b1dc170ffb1e0528724defe01fd844eb903180ac6d3af500da67c786f7ff7e7ff934c708818fbb2da6c30d1d9f585a283da031ccc97c61e7394a4d0b679f9a439e49d618a1952bb7c658f63fb230e27ba6a1f022104bb0da324ebc9e672c3262e2846c266dfb27a06600ddad4c2d262adcbc6acda45f8a7d360c7f631ff6af777e66db073d910b9e3d8ed137e5933299508af1adb6c27aa671375ed63d50a6b9af9fe52c243c560713f5734bd94ea48191ee3eefe3020cb1fd6c32579bc18282284a732592da21494b451fdbeedc9700431d56050a9d8df7a07520d19ff16230f3c177b5fcac7bc22c6bbc12f87c58b9ff2ed2d2eb836c2b56b49f6acc986a011aef8637d5690142bbd903b5de1fbf5d45f2ffee28fc9348f7fc34a1c10deef2e7666e8651d707d924fba1f3fb4b68fa3c11bec35e9eb88b2919f85a0eedbb019047f8fecacd3c1471971c100fe69ea655d650c12f5cec57de2c1900c35d595099d7fc5c91f9b6bc69d23b902b5371d3c944ad95bd9d0f0c6143f52a120f78c297a44d7524d91adcd8d130bfdb49579184165adaaab626e9cb4367c6ba7c19c5e44398ab33ab08ccccbe10553d958054d6a6a55be5b9c7a7da722e9b6528d16dcf32fdb3b2e01df1d9bd75daa0cf3d8d74c33f2367e468d19ad21af95160b51d4e9547748d6268694b9b996aabc3a193b4e8bfc02eaae75877e4551297a0054d2b51db2c6000ec173707f9cf092d154c1118f8b6b7d6e32b6427f29de1847ba833e346b11680532308985ef2f2732bfd0be6e4eca844afa2ac66ac0c1852425c4888a687883279e6de08a40a593532a3b786398a1aae36961971b9693ced5c83487f02630c9bb5bcd8b4ea499e72dd6e8787175a179738ba4ba9bb1e65848139121f626662936cafbbd2619994d66734937610d8f85e92a84a654313bcb2de52649a61a8cc8677f11f0f3886e5e111d250f0d9f1cbaf11061b6b0a8cbf2a5b02adf04bf52e540c1bae4d0c00f7ebb7b2d67f23c572db6c80c71931fbaf9c71da3a17235c69d4d37eb8ad848d992887ee953650d8f4783bb72b34582859b9b5142dcf26fc31cfe5fdc7edec6b9010a24c23cc9069776983f9684de816d952dd2198044afe860bc4a888502b38b13f18217a7cc964c8de353a713c843fd92d70ec99617a81f1c04d9d92152539cc1d27a285b4156e09177f118aeb66a3b700ac8f8dea5514051ca7475d959d570cebd5496fc2a9157e4a6f7db7e27dc1b9b33355fd03c797a866124e5200f525ca2aef086497a7bd66f6032a831ac7b1843be4a4eb75d443b4203fff5f5bda90d20e59aed2a2aca6830d8ac2ff3b5fdbd4e75578f35a8162cd05b86031aea9a70a64e71c0e6612791ceb067b92ed2e5187d97be08e6a7430f51ccc6e77f3ba922d364c348caf348f35bb927097f4da65c21d505ccd9713b5284701fe2c6f7d3d7aa6947a49feacf2c3d89f3afbc4dae84ac32d9906e022432fdd576a8474446a9368b4a806994d802ec1728d720715f8f8996c248d8017f24d88336bae35a16aedc14bbeb4f36755382293b61bf3712f4ad895210d83aea747637a65d25c936531ffcce0b532a617aa5e838354291fbafc3753b11a616630854dc8a00da162ea46108d0e9fe37db346f0b074af58f03be105a91cf61678d5bba729925f0f5a4800287495c6895cb8f52da9825f704a180fa438790fe1e31fcc5c9625043af91de2d1b63fb1beca5ee8c730788df6b2df8128ed0705d95bea7f6878ded4a10e461de0cc05d74e5683115bc428a54e38fc01d4813efd24ae098b965f0dab3f36e8f12a217cf44fc15e797b88e8cbfc9e54d6804a45cd8b5656783def1eed1a16078382f3706e57d0bae8a44276c3e2a96a7408706e05295f6763394223eb8e83071a474392c37f53ae9f4917aaeda6cd4230d2bd81fa15a2c131c5d5a8415307e1a69a741ed52303b6bb2d0627cd4e2214fafd43e18010689d403", "", 0, 1267452611, "76fed4cb3a5882a700b7b1a5947e7c278d14a1efb3901a539c6e07b08bbbb450"], + ["030000807082c403021816e0d96f2fe629381fa7ea761bbf35940d7b5ad2d53bfacbabe40edb419c3f00000000007b2adbfe2de64277178161ec18c91fdec1573582d857cc95b43e0bfded11c5b90ea920cc030000000353516affffffff0453d2860300000000060065655251005ef278050000000001655b09ba050000000001535d6a5d04000000000163c4ce597b000000000200000000000000009ccfeb030000000089a49e10ba5ae0ce2fbecc92b5c0f65b98536d20e7922845c1c47534eeceadb09eaacc77d5da5ff6ba1bc4cd148b60163abdfc71be913922ac0bae391262fde2ebf2078f6ef11eb2a1698716f9fe7287d5bb84e6ca2e3346e48d5b4c20a5e47700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bd096f1a6d0adc79a6a6932e1e34d0c8c16d49337a5413ff994302bd72a1b9a78576af28540254770e369af49496b86b0973137f20931f5236e7415ba9cf66bf148debffb3f758abbf4354ecda79308e744cf490c1717eee84a1b436c1fe6202faad7919a4f1faf43daf8f2ad69764c3f2e5c3c5c92a98d407f14af96d6f479e0309e28e79b7bf03b1d75200a6b74609a955a97b418a28ac8fd600d267103e607a031447031c034f633383f3096828bbb53b525964b4e2e21cb1f49098e99f19b7d10a02529f86a5c41b21361ff743202daf74cafd9e0e508a294b027c2f8272a733303de4cefd919e1c32299bcae9ed2ccca991f1feaddad73cce433eaf4c4b98aa1a03136b90c65add0794a8d179518c76198882bfb8f9c8cbcfd8353a42dac919bd97020da5b9711a3613fb1419c317f1530f6d3c54f120db7276c7769c2f2dec7926b2030daa0dc7eea204246e9cefee5017ca93348363f11f9e080b67961b9aff79e40d0212f7ace0dd862dc8ec645f7a45190d549025a97e9f720e7981242fe1962bb648022ddbe42b016a60f9771506b831e688f4236a2e3b238d39fbfca588c30e636d3481c6a06a8e782eaf188de5a3677572436eef0f19c7057bd62f285a7480e5c56b24a8c1cc02d5739bfd20417b93d218c72c4ee1072ea39c3f8cf5e5f9527761f557abb3236da87028a1d55e3d7ebf53fdde705241d751eab79fa546919b51b99d9d2c79253fd1ca534c5f058a752ed620943863f086b3a3a42ef777d243edefcc20c0927e6183f1b98fcd88656fbc028d52d5422a31337efaf628ba0f629d4783174007d9213c30ee595addcb87a831d6c975cba17e5bde8d1e57320d9f3087a3f692a97839dd182b867111898d276dd1c090dac4f5facaa9b2063593548cc3ef3d542563b14207be0f3ca1d48e2cf9d7e5918e6caa2b1a67476afba6664efff3280c2a53c4667b386bd8651004e3d91f33f0fa9fd7d373917a1b8cf037cee579cfecfa7207d6766f626bb182208055939f9d0990a957ee5d3364eac9b72bef6707e4bee532d3b644d02da900096fb81a69a01085043894b8ba5e2441c2718d791f5d6d5de7f2bcd982931b549a66bfe8754ddb86a95b585e59f8e6a8841ae4637bafbaa1f6bc582e38be9abcdc70edb703a4e580c97a2f341e7579381de5938d2f86291623cab0402e27e899a190657d4bfc947004d9a8e2cb4defe5ced4ba7fadcb1d058fc4d14e04b1e4087e1b3f631577e7578964fd28d035c3544d58762f50a427ee3cd9a6fd65fdac95cf816cf3d80821459df113d0a5083e3dee3bde23c744fc769e30172a762d874d0f4c66ef7242a0f041cfa59deba0bcd878f94eb23961d8fe931490500a0d80c025525285a327befc081dd2ff6487a8b4e8b796413cb5f0ed33fe6067cd62ea45873ea128198e6c96dee6f6d4d87dde39481664596c5a638796c27f51a1cccc601cf62e233d6167d63592191dd09b8042cc79e684ac2516b4ac2e2470443cbca5998799b10d81d9dbd8a95f760251afff8f00973a332b3c3aec5cf93bc73adf9b07e829d53db51dad92230ba45ec5244b79d8f754e5e7f1e42c2af9be1c096d211412edd3aac93512c846b27af849c609fa03bccaf93eec73cadc24b8efab1b05dc5ad198d8977457497c496f21c7c142aebf00859ee6ec29c5651e120490ef11fe8164fdef3bede6ff8b3ea7b1b274a9bf293d187a6e66e0b40159fbe5a33862cc11b7e3500f1147a5fef04767cfd60b28465770a18f29519c24809f0f2b1431fb41fdcaf07e5ffd4ac89cc7965d99b180f4492a6ddec3ad153145519fd949f23c17e91feb658c030f1cf6bb604d4e17ca71bd2071612098cc69caff85d12d8cd3f9354028bf23bef104ec7659ea295106cf98f46b0ffaee45ecff26678c81b7bc308e164ea536aec2dc478aa3ae385147bc28b4268a3e76390a5052465f657485bdc897a369557fc8e4ad1df6f5eeecf777b1b47acfcfa0729c03993a70d4f940083aa25c38731e70997fdc7a0fff6bf39466eec83fa01a1c819fad822a67aaab31bf5028e0572b4418b1922c224334c50f224cf32db883092482a914d25981fb660b364080644df47e453abebe4ceb3f3e4a914568a28c8474d42a7be0e1195f854929f041237346c26890ab02eb68a8e64420940921aa2dc0506f181f8190e3e2098fd07a8589abd8340a45e4239914f1d1d96920566f0e29a9c7a4aa428f636545faaf0d4213ced03608261c720cd84662697a1c51e3bcd11c512b7bf37a518bb5f5527d00000000000000001094160000000000b0b656645bfd83d3beb15e7cb0620331f2baa307aa21d48804990c2650586acfb454b7a78341c9380ae6ba5607ef30bc98d2901ca8b946236bdb42d4e296c0b800e68b1350ba81815f106c4d182f4f45b03a7ebd2ce95abef6fe9b86ca7006a60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027a64caf44f1cd2308aef98c33d5a2a3b3707d9c72ccc5dda24d80a1dac2bb3b8998c20ae3e0fdef7c46d4f1e208f19f2ffe9d0f7f2155961b5bcfe22fcf3d92482b48c994f092c790077d1e87043d4e34e194d4fb35634d20d3f19e5c73319a2f79ff8d2bd4b1e8c9142c891d2313e2b6fe202991fd82845004d88936120a1a032dba640020164489b470772656e64db7d4cee7b7003aba3869ce185fd6651b1f03209002b5449db641c60dc636dfa29287819ef6720a3edf393ed78bbcc6720cc80b02a4d40d2550ae76f4a677e2f18b276c3f1c327826206264b063a727321064904f0398f25b96cd470501d0d08a94ba12958b9c8bd885e178a782e22250ba2d35022ba5242ee3981de446c87d461a3cdadac5f9dc7e42051ac3d705c9290211a7a5031ea9037fbe11c44c3df88669c4f8b8d746426e375beb9c9d7ca27cb6041f6c4b03054570b28b10cce3d62e2fed313370dd44d37d848cbc72805483d1b02bcc38ec0223fefc1a277307ba51d5e8089006fba894f8d52614d4b95fad7429739446f67e031609f84594fd097743f43d1d61ec590b6307aaa4070dad25bf2b1866b9e00ad2c9ff2ba31c93f88e7fd4b726a391e476c582a0b7c820c749641dc904a9b3522908a16e1e62713235ae646808a35da87275c53a512a7bbd3bb2c4b91a86dd49d00949eadef70cbb02538b7503411dbec19f48123a9804f42bea494e238f1f9312dac202278a38df879446018041e41f19ad229f1128954e75c96a1251abd97cf156fd9084801b689d5fdc0ace2e03dc0298c83f36ec204ff7a62427f6beded8cb2d0014263145ebcd104be2912bf35d21bffe4b99eab38a16dcceab51125478395007683df647ad01b8869e6d6a8d6f318429012c9a006aee6b06005eb91c7454d2f840ceb85f9196d25dd97eea609eccdd1db64bff7110a6601602591cc43ce2d89b87df36a476d9ebba95ac30c91445d9090ca188650083835269e3f68eec519dca9e30ab4bb63b98e2c2b2d4b59a1659b732969dc24a5d8e15a66f12d00dbcae88ebbcc241f049139784052a2e61099ab4f96d703c9a4799e58364d04a2a0a15d73202fa5f27d30f6099a18518e7e283a33406e00251674a422b62348f4b9ded9b2f9d1b0de1ba272253aad8393d3e4685fe7abdae81b47ca765686b7cbe08297a188595d455d5c6c93d834f3c565aaebf6075923c49a99ab43d16fea4e0aa4409a452e86e1b05ccba2f922eb567bb3394a951587ecad40b46af442e3b94f3df52934d738cd063428a3868707fb86dd6875c29fc3d40ad3e9b7032b118a0feec9d505477d0a6eec93524e2b15c17098a98cf04f8f3d854353ab62bf18960dcc5fb1b8618773d53452fedbd02e2d97ae00013bdcb3265266f946eb5146c4508bfde2a14ed191c3bea8bbbe2821a006a159436e437b38b56cb12f0b95000cfe58885add9ddca511b8dbbfd466c2392f8ea3cca4b67b1c53f502d4b1191059abcc647d63651345793bb19a87fa9d14b95c3e73aedf0eff3c91d036df2c5dd179a408e9571c396c8e1061729fce60357a32c122a85016df4a9d3fd973e321a4ee33dec172b270e5f366fad0d5e707d67b23a47db330f6959816a8830ff0c6f98ed4614b7b5f5b30bfa628549d3dc24b2f4a83cb2f256ac93daa88a161f9df00bdb3bff47e07d647325516533a110b23730ad221ed1bcac444f1248fd48859a675c3664a612c5f60beed7e30f907bdda21beb30f4532e5f1851907656e8652a2b326ebdb6d24ebef8707b397af369596a561a04dd5ee69f9954f9587af4d77e119dd18dc7db2e8a04a075c69a9b3ff47649fd674f6877defc8d1636db8a0502bb626a727ed1e99ca27502795d2742da255b9a8f693e7fc207013652d63acea96894382d28b52159238827e991b2e9cea44922d7ad467bb06222349e45ad18cdfc7ff45d8d552041a6ae920c021062db6d2fdea53e69e382125363a400dfa4b51e11ecd75b3f36f0ce8a81451b1640a243498a586dfc3f319369f93bd183b7a04239c86aaeee87646aedbfd8cb22cba768dc54e092c6de8c13594bf80cdffb90d54a254cc0a038eac1eb9c4171b37ac8044a04fdb38ed36c1b700e36420aea4c02d06ccb031187d9de04ab5cd2044d8c571bbc12aff7c5b41493859bcbc59c063a2f154932568c21b0c58df9a6d95956171cbf131014747dbd0dac69632811464e7cdc1df0b6efdd629b3242c3790643ba19f949a5c55b609a904f57fae2bc981d9b201d12aa267e03a10c1bb2539c7aa8727d802413e51e789897466601c542bd6bf1fd0d8dc3c1ec6ca0e0e17d4c4ece82d6947acc9d43025a39ed75ce8195a1b5c81c37512df47f8e8a65e7433b6690580d2c3fb825c7975dde5b691fa6a8789fdcb99388155849e75764e291d47b27c4120f", "5100", 0, 2131778298, "1a5be4f91685b5f0e042c56b0dd9f546b2780bfd94791aa72251a075b9a0c3d7"], + ["030000807082c403033a5a90b201d30d84294f44390877c3b337b95fe3f715405568dc1266f7c8951702000000016a1b9e4ffb4ab40a5e969f6d68d4f227bdb7bcec27881b06c5002691e71d3749585d39275701000000035163aca9773cbe2ca209fafbf54b391ecb126416e707e9a25969171c837109f68ad66841fdd3df0200000008acac6a5253526553a18d1e7f04955ede020000000000c3a78b04000000000600525351ac65b8895202000000000042cf40030000000004536552ac000000000000000003f5efe70100000000000000000000000093ef374b28a13dd9db81c0ef38b6dc43e204b97c9b6cac17bbaa1eeb100424f7d255e46e8082a85112ca3ebfff8159e672f780354d28405c133fff6cf31fb2306ffc6ae780fbda69aa6b3b9013748ca02471f82f4622a731545c70b25473f06700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e956880e62ea3e4c5127bbdad99ebc6cc92e3439bdfa332baa5c07b50c1e611c27c79eae55f975340952693b32d06d4da61c06776adbde3429d682823701fcc79b6fe046d6aa0f22206742fe038e36e5572cd0fee9ffb9b5795221f25867d6977c8712b29801c79ca08ad2e9acef22162d20ec30a3dc375259fc655cb3a5f3ed0300b0203644ed5e401aff2aa3b1a338803bc228cfc359d1a158186e6458a7a83002084fdc99dc658fbe0004215476aad0ca3ef830837fa4a6e9a66d4d3f22ee157a0a01a9b88eea2b9a653d3c1fa5093a8e247fbc68fd3f5ebe53844ca0648076a95d0ccd2be0dfdc47954e6234e8d99fdff78418e57dee6969885e936afd748db0c902205d0f9c7c5b5d89d40a788c667c670404d4fe4b9f21dc3cb9fdc8ba7ed4f3040311b2473163f9692672f0cf1ff559efc1ce90fbb94593a33716c1406e1bedd4620317fea3359bd1896c2e22a031e3f80005ed9296ce9c7ff1f6379cd783b86eb5f502286899b3562310c7f0587b51d5e76e791c506a72730c9781a966ea24603117ac021cbff7381381b303728eee64c111487bb3ab46a07fefc6a16b906f4b89d49c651eb210768363ef6089cadcf03bc52314ac6b5fcb2065187d13cc515dcd17c9e33de7a98dcd919d846a091e53ab60f24b6f1011006316b1ddd8b1dc55618f44edd4d2c7a134cb7b4d678d8f589f90104d4c22dbe7ca5f72378d21bf02790d9da772ece29e8e0148bed4298fe06578ce6c99ee51c297790025680f3d4c7cdf2e343236ecf67c7b9d5a6a43d1d1130f24fd54ead7fa1cec901efa799ee1eb065969d67ab65c7cc9e4fd410a83c7825d80e2e152edb54fa4159de4d43efc1c3a976b0863d4d71bd1b2618d181a5d12d85198cfdeebdf0849a20c06f40c1bb70a859bc3eb9215d98691b4a775aab49a5fcf178dc48c4b4a6286e093a2184571e55f962c63b5d9635e25986e92b6f885ac77b420aa1fa4361a50fbbb97018b5b77590ceace2cf144c57f3b75ccf4fd61ecf82ec422fcf84061459e957c89d372a95a4a4c85fb07db7e459c2a56844b8535d048bab472f2a4709afa6dd2a4d6b1fbe78ea166643bebd2447c9573394f66ab29133aa5efaee57bb8339280d7ace7221cd65a03bb084ccb6da58ce9dd82bb68e6e837702bdc6b7a4f6b3571ca6224acdb4afe27ad4caf19e461d02ef437aedbb19c1dc7c2a1d93475c4c2261b0dc96ba47a913ac525edc2ed85a0dd9dd4075970e98878a4b18403bfed62f8af201a9fc7f91013909ac514df7fdaa32c351626515b00e0034ce23d31d51198941447c8e0b17fc8479cf416de49044de005558ba404d43792e409cee5b666be68d178a9e03c6f9b8fa5a10e9286b2c1548ce82445ad88d61927e2b0e729c7db1fa27b56f03f0f004669a55903df7cc65b8d16bb38b203e0aec03d3f1a199ee5531bc3e0dd1a261dc6d6c3b74e514754077cc96a9e52dbf06283692fcae24822237eb3ed2e58ee07370c6d8609b4653971943ee6fa54aab7bcc5037eafd2a7a88633e17078e3ecc207f955528fcfd65877cccc321f2dab873d6efe4e9cce75c1046981c31c127ddb22325e2490e0853d74aedca2aab2d77d9ea624f099e5fbbfbbd7f79f090fd82b1b7593bdbfc66cbf5643123e20a272b8f498c698747e675186afc04e858204eaa431b083bbe652ce1bba93d9df3cb91fe35d936335b7a6b80cc48f9f607b3f41ba6bb5c0ffe39f24b2d453d62da1ff197b100c4144c975752eb0c09ff5a2db9d18c0fc2d8031be3c02a8a90ffc765b0cf5071b9bda8f6e346f23fa3a7cf9b08a85a61a449ab9da6dfff4722a794f82673d0d9e28d1924ec9f7c5fd753c85515e263f27dbd1dade1b95c55d3a2a403e3931806e563438c7fccfc997ad2e9f9ef38e4214376095cb74b926d1184025216536f9f4080a37e0eea46419589c9a7a69b4a4e9e135cfccf953280940289307d3ec6f38dccd695eb90ee766e19901c02ea0836610feaa35e03b58d12396dc726c23cdafda892bbb04ab509b48c45ef0f5075d155a2019f312d33896d4b0c8c23f4f135fe300ad1cfa092adc2d314fbbe5eb1bf6430559af3bf509c5c8246be28667761641edb14c952ece8af91d38b5bba123d98affcd94c6e77d2f88e3067c58e4287c08eedb5d8cec0883d2b4e62278fa7dca1c5c52d775a2f10281fc27f213c06129a0b0a13fa9bbf55f01aeefbe31208cbddab62520ee222444f2371731c27b832360c5b041b0d0f4bc173d075e08248a18eacccc6b9634e88130cca33a19b478f405000000000000000000000000a8a28b7587270fd0a00eef1c552cf5f0cd83253c2a61bc5bb244291e75b74ba664a67a1f73d10e4232254589309118bc46196bdb3e1fdbe48fd9354dc84e504f2018f4dd0743aba6b2454db96a59150e4a93b22d8ec62f63db32c5cd9f4fb6630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bd31b4ebaa3617c14337d8d943fa4bed3fc1cc2fdf5049104bf9ace7932333d749bf4e4776b4cf211caec28b014bb296e27d6c310730606e9c74df989336bf35c4fbac691306d8baa576a05fe53d20cce0b2ecd6d5baf15f92864c4bf94ad28483688a9d4f6ddf88f570e36f5b6afb82ce2018b7af220e5d5c0e076412fa8e0223e4580fdac4a1efca1c259a237011834b4563f033aa06a8816607d70d4744800300cbcd6f361ff59cfb3ffefb82e8526effe4352b334be31ac8e1c336e6281f4b0b066bf514401bbbf052424b7babc3a59d438c36ecddffd2ad5bfd40e59d836be53d40e9a831db2694a7408f2cd30f64b39162aa1fe3438f83bfdbad24d7992722022875ed616d09616780704d89c275c795c99ffe64d1223cc2ce23ef0a04bf8768030bdda6dc86d557a7ea38c47fa660bca50d07ccf1de1cd6f7b3719e77ebc14332032870ea59cf2cdbb5ace8209b70f1ff7ecf9836c00a471f22ff11acce53752860032be7cdbac42fa5b0920b6b51d639efb5dbc0a91ffeb059f3379c14d4401711960229f7de7b8eddeea3762321f665060690655d3a5ba65def624f2e412b4e01b137ed2e859204cee3a3580238ec5e366277dcb40a07c2665513c1112c41368e8cd61e3ab4d7eb8171f081d731202fae6b592b0dfdeca52208c84e6d28eda05cfbf78e265db3b006b7328bbb73f67ce124302fe9c281af47dacb1100131982a8e42c9f1046a1a6ffeffd5f1a2aaecc7b57252f051b72e307dce0b3ecb2cf4f616a91f39403b7370916e8fb0f569ed247bec5d1c3816ade1a0f78be3ff21ac1d58a11cf16fece48031812ce67b38024e9c04cf3b1151fd43e06b19228687999709d63eca88583d56ba90f76a2fa78f03e3485c4c3a3d50b2a8c25fb304eb740df2b6422d3ebb86c5e2eef4a350c8d64e8a2f148b6cd333678685c5a2c45be295785b2bd0a4a155eef564bed3ea5470d3dcc8ca09af835ebf0a8eeb8a921e022ed9977083bc8fe7308a760ffe36edac742fb480d3e2560922283eeb5cc198d1ee42d17bf0bfed51b0df1f5d77f1b716f9885bef6cc2fb9795998d3a7c3483214a0563a72ccda862e12e8d4af4ef4f92e36b0c8fb2d3b2ad6ad08e0a7e4e6e3cfaa7ca9ab8cc499e6fd6842a897ff8bd2836d6005b9ee85460a65e94c5bdf8d5ad0620e0c1154fdb320fd7a819db4673676bf3df5ab9dd5cd9f693cc6e49152edd95eca8bd790803b719608236aae36010c392c4a2dccda5be679e5b4f49892ff206f4df08e2c4dcb3ffd22e81d3e11bbed267e589bc1b7150f20433f572c07a3e851a8f714ef26ed908d2ec295938399df33fba8140b75fdb093b7bb933ca2179b8437d779a0ad11b357b6d1f4cc3bb977630fef26bf484b36a3e63d149b47694a3919cb2fd53fd5a2a4584b418dcc0e4ca8a11f0eac64e4cf2583bedf06a732b3cde9f8d37f2ee8e1c6b825d99ff4bbfb07315b3abeda2570135938237f7f949b9e07a793a7b40be291e3510dbe4291bdb287886064ba4f67d445f9f6253f0d6b60fc203407f2177640aa38994bad8a4dea0147769502dd1a306a33a1b2287c7def3688de744708ebee9757e2ca0dcd51523049decaa71cd7f4050d9a13b907e9918cb359aecbb8fedc7dba5db800dfc0591de4e1e83549e0b560248d5daed4bc3bada0b31029dc8fb71c3821cbfc079f92e86b70aac5d885cfd2b455c30a504ca46616c1cfb0f400744995e68e7988f89e687172066320c87b8b7b5d8abfd1922462b8bf98362a2996c1b2e053c7fb367ca17b6aa0709e16edf4e411580be6d1fc34eec7a681d4345d668087d4bbb6f7b133c9c90a441696dbf94db61d0041d99c5c2a7f8f92df4c7f99bb4c38958196e922f71729ac2c97186c14f22ab8149cf4b51d434834f6fc03e63e13f64ff1af42d38257257d272110ad118023bee3f7f165b21ba0e5fcf5d9b6a952892e3756a6f852bdd6c0bc85a01cd9d03b8d6083f5ac65cb617fe46351cee32fec56e6388ae0b880dafae92bb09c39c9bd841fcff1eb6d36bd91249e48f1d076453a362f3e38e7e753736fdc89de7192e871e321db28dbbc3027e804ec9a2122f6a76f93b6915bb7663961bab73d39fc465663a0ea07ba9374e037d9fc2cbc13aa4ad9c5a843f4edaf59fca68339f8bb7c825e717965f5efc906fa2017afb3222d08ec90a39616358c11c64068bc595b15a2f77048d67665bfb68d9f843fb5b2c40e50136fc69997df1a78632e48baea2b7d663c618f20c2ef3d50001498b509bdb74c16d011c6006cc8b801000000000000000000000000593b8ef9b31e13e37a32a3205a30ab99a45a20d6ed6ce3ec2539c7aafa3a6166a692575c61cb7711e2dd2c7142f893fdfd9e608a5ed2d5a35d2238dbf4252cd6a6735870811e9be8e84a5e8cc5c923ca2a4cef7901153d4189fd3800039b961a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0c97ac9df4317c1f384c83668c8afe69b247ed6cd71442ac9609eb849158e864af17b3fdc6ac6dd9eddbf28c970e415adffce48fa32f04f20b0edb936c8082dedc709b55012bd033ff53df789cd19963fc6584947c37926d7b91fed9294707d91042236226e741a745a1514f89fe0debc6d7372d3b63a51850ca348f50f2d2c022f89c9e06c1c85330c48ae62660b264c59fe921377672b53dd0be546043e4608030e20ab8f01df58604927fa26c9e62a662f8d6194c58b75921b41c1e24827be080b01f91bcde1b14640a51eaf4cd2827ccaec57f08ff08c283896d5ebbc76f54bbc38162b9b0d5a49257881a1c973d0dfcab0ad524c662cd658aecdb0ef4a782629020ff992cd0b0f6dcd4df0734823001ec33227cd469535143c0a55a0135eb068fa020ba11b34ad893af77b882f6c9b6a3ead47b228c3e6c687824a13403a5494ff66032594fd33173757d9f49b3af976511d0185624543dcf933df85a12b3b2d434668032903275b760937abd61a13fe21770feda77097bba09afd5f17f69a35e725a84f030260374f96873b5f29ec21ffe21e5610bc9c5722cecf8943528071462da944fd239a1c1ba1a2ac74812707ed2a72b84c6266d39ba1342c502ce7e3d32f97e899143c3ed0eaadc9ba074d52c970c420a63ea358de176a4c1b1da089dc0c9631e28cd93223f623955713d9c347085a0a365aef3fdb3dc129f587c6569ca96dd91ae523ac23b55bff5a54255438ae69a7518644f84106f104a59663deb799fa9de850b136b713a0c93809abc4f98e757e9c108b9c502b38cca51c879df77abc642d76b2aa5ef7ea549d47d41ce270e147ae7aabd45a9f9a0e2dc450ead305eb4b1fd9df145007633df2f8bc86d5d047b15ec258962f1ca6e22c4bfacee6bd8891c7d717bc54535ddb77fee274687c37d69285621cd5d89820523d92df2219734b793f630567083540aeac7ede1c70b73d241100f95c100296c7fc95ed90546dc627a84a69a0394bbb74f98a65178587656797ec51d4c877ffc809a5e665b06c63b5911c266de87c1cc9390afe9f2f541694e609b855ffae2b81f4b7479ae0a55ebb8ad830e53322628058323a5478787882a7c9f7c388e0e22b6590b967ac0ecaf3bfeb1ad67ce9e8f7334ac32534a735ce2489d832bd8ef964a2c8fa40cb2f083990272d629ff11bc13c99417047391d395edb5f6eebe71dbfd2b97ec918ce3cb8eac0cbb3638fbe8dfd5df4585d45b292fc0cef49793914bd54130eb264b542fcafa3b04c35c4a91277660d765e3f4f5e6f7b8b9b5447262e3a53788d4946266313ce01b9f2f4d12e710e12ede1f8fdb317351a198b2c44343bc4f981b4623f851132864df037adb35391eb6222285adf81fa0510135abebad773deaee6faa8028192a41deaf3b67c0beeef040520442d1880bf7f730d2ebf0847d26a81b2956715916f11e1586678097f21bfdf1a876c015447e107cfdd2d32bf6646c2584192175e551b9d1cbde3a29ffa11130365cccba2b07edc7c5e0e091071e9675437e169f756143c0cbd806cf84b994cefd8e6fc37ecdcea016ffdc2c1b154ffbc6a0cef9f5d40135ecbf8fc6fb64cd46b9019f307e92a1e977fd82f37b92cb9583b7fb973fb73591093d4fd913bf8e51d3b4dc8cd3605ca1a9009cf77d51f8213ba4e05c71035631d3b8d66e96bde2a5c05a0b4664a27314e31a10af0767e39ac9cbb2e1ecec3eb67c515940af2089bee255c54806081778012ef8bd6971472a6016e3adc210e67c0f0b18f6a851a4826da3f34b3ac909992acf7157927b79d077af01a4f711753ca4bb6897053f4aa5281fb97ed8f4fa8452eaf933f607c7790ddd2c1dc3aa0b34b3ef9e7639b027aba3f6dbf7fd55c2e0b2572f1785f2f461d1cad5bd8038c5feb488b8f2515f93e4047ac36291ef3e0ef9d9102e0b2d35686e1ea196ba7ef047733bed79e43a40658ac0a3315487280d93c4ad93cfdf9a35d8875fe20f05e9661256b89361237913fab6159f080ae066d71510ec5a7ee018e6c2c2d737d0b2bdf535f558f123ad1cdb7b6102d39621a43380713900254ab0644e290f1b544585c71e76e9ff4f35be037780665d0cf39c9ce5251bc3c5edc4fb344fecaa22d4c5989d9eb3f0ee330e2b36472abbb80ff07565044b585b9cebbf15bb3913237052768ac69ba49e2e6aae572750c502616da2271a3aae648f1ad9e7a5191ac92cf0f62061fd4868061ca8b07e69ce5fb7fb1f8fd933de209690b5b0b3061176f6eac3e33f61a7a8cfe014921ba4ac5c14e8f2c1609fbeb6ded5887ab39be819eab50382b620c945bb9dde2ab2a4daacb4f3fe9156611463b55b2ec35184cecfeebf82e5ba6d91c71cb783fa0ae3693544f86bcb7a05e0402005a154611acdb8a62ed079a264802b11a45cfa42307", "5352516a0000ac00", 2, 1663512578, "eebaac1834cbfe9a9d04e1fa18668689cbfa19076b83da69bd15dfbb8ddb34af"], + ["030000807082c4030306cc09961a659f5ad7d1f98dd3fefaf4f9fa6be469d5630e76d5020c9424625302000000086552516365536353ffffffff81e49e2dadd71ee2b850a2c977b500d5ecc8a9516c0d27f99e47f9cc4bd0356c0300000009655300536352535353ffffffff01b6d65eeb54316eb6c84902b26ce4fa4b2833552d251083c7c49543472032b7000000000500ac515163d825f602032df15b0500000000002ef250010000000005535365acac87b0f501000000000763ac6a0052655300000000000000000200000000000000004f4835010000000060a6f2350ffff72b5ca56e385d1fa72a1050dffb171cdf0f41c2b14c96f7f2e2acd02d0fef3ab3533cc15a5f3f201ddf6f1bc8ecdec77ec9fbb7c106840c44c126f853420b5a2db32b3d7421113d835fdf406cda75f5709ec02493f2852e25c400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fbe6d51f34e49cd338d90c149454537b0a546aea2f72e4bf39f7ed710992a501b3b14fcd16c47d573a0b1799e4d10a47203f1946ca5c0d6059b5d3df5fd2f785b073fad1122b80d11dddc32b9950f9fa172e5b314218ce0244aacfce74bdab0dcef8063b1b0dc0275bee9e36a5d2dcf71326677101335cb80e24ff16b17afb9803110bb8b16f1609b7b0f60971256f3ed125b9d80f9ae688f3e571c09bb641e21903244ab8914be6e9da87ec7fba6c9ddedcf0382109c51652d7dae96cedccc0e4dd0b0085c49296031fb94ef9e3fcf9a9679503c9d9b07ef2f23c7040b60570f5bd234771a4391d9ed6d7f9f11dc90e0be7625a63dbc8c4bdf84bf9f98a04365a71c5030b654c4afc2fce1fce42a5f421e7cdbd39add4afd3d1b34bbe399bd5ae295d8e022f225928681fcb1af6eebcbc9a4b9d4deb6668762549ac06e04933e2d4343f870227981c0de789df8ea0cd1a0f32dc33f4a4312242073c01e6fde1bccfd3510bfb02184659a2262a5ee0ccafdad258019a5509fa1b9d1fbb137593158665dd9b59840207efca93c3faad44078bc792ec8eed70e80d4a6f5786ce70f7c25780b4a6148a95865a7dec1653da95b4bcda2699412187a71a0b1234c4d1b33cccef3db48fda864f5b569c0a9eb154b2a7700b1ef6f4f140591dd741fddd436b14be09d52acd7a6f5ba14f9f9411f131a98081b450cab462b358a15574aa5423ec9505a7d6d8360a89c4c4f9347cc04cfc8c282d463a2b7b9bd7dd5e70a14685519265e5507521b9cb9d093fa4bd05888e9f96f43133c4076f789516b0aad2ae1aa2cb15a39fa664193f061eec3dd8f22eb90f56c152f5cd65c43fbf9ed1602dd367204ecc145b523a98675b6743916b6c8e4db4349ab50f55d85a245c91e8219fcce57ded439085de27a331b094e3ec9d4fa0333b5dbb6235c12d035b169e5d20e97c3b99c7cd88f9695cf1dff26d929327a5561d9733d23f06603028e45b738f1add0592513286a52ab1bae7b4568a52def17e99117833714bd990389544c160c7c12decef4335828142bf77064c6d8f5f9f129241cfd6da60763944b1651aee9907bbde4b4cd8646a11949709c428f621f2b1b0bf3b9112a600ecb7b38b0f2931466917635a2cbe20b6513d0a24229aab4c0c5efd67a3af2b343bc7c655660ea5c50fed04368b9dde84ecb2c7de262ff00caa6070d18c42d707e2e4d22aa5f9b4687a51674c84637ca35aeb8f16b8153cdde36a50f5097f6722b52524038be165619136e5bf42d46e78b51d0eebd37d5ac8ba516a196c00402886d23a88b230703d53d56934db9108bc32312bb2b025daf3a492367a45f0f41f265efcb1b41f02bde2c59ce34e34d8e909310752744a42798ecfc83d0af7f7fabcf99405948af6e0c3f0ec383fde1442d51a1b6d0f302c58b9d170aa1fd783bfed46351df7b2851c7e7393633ddef468b4474fb3ccc9a4d7f59d4fe2f118aeb286a739017d742b1a672d9cf2c76d642af00fa0d0b552d223457479af20e8eb77940b34a5c797b83de64283ab8753a3fedde37f76c33414857e4f761c224bcb8b64877f2a1176fcf58610f3897c990c33003e958ae1813ffde08f12ea9fdd1e5bdd53b5e352d0d48cc05dfaac80d30a76a15fd7ef9f475ba17aa8ae2a6409ae1093b43682bd7fe93021fcf830238eca90b8a96134f34318bc7061dda648403058e36f0d3c06670e50189cf8a8f14a92183f78dba39c9c9c5c66e184b803d9e6753c5965a63af57dec40dbcf169ce47a4ff11763df98d80b483e1096ea679042d45225e99c9a2bf77b51aeb5b3c63190795ffc9ea55d6ae6110e480fb8884b6e5b2c2cba0be6841a4f7dc738b89034b4f53941af0d1a77b87647237329c9fd7cd44dacac26cf783d4c9a0298b06674662ed10544c9966fa66e3ce4e6ac9dd65a08c6475e50221e33c8bd369ff0b107eedb80e5b6d03acfa0036e38b288da6114937d2cb5939efbf31e0ac2ff3cfd490e96c3d0058eb79309ed9d658bfaf9992a403a6d28db0b91143595f9db2eb32208df2253e6b32906e4ea687cd395a3c496acd8ddb979af610b40368a90e3186fa28271d90f374dbdda694391932efe9afea8c03915da26c2fafcedf49dcd30d60944d3491132446788d303268ce3198bd98909fa8e508b725d106868ae3c35499f1e03d8dd5843cc954c0a17f47e3d76bdac50e5db8b614650716ed68a1224ccfceb29923def51194fc9bc61611a7a5c28c2fbb53dae9ba4574a798d32aa441d31df91a3cbea8f489202657f95825e7a73b5040000000000000000000000000b1a98f85780cb5f5091abf8d5f20c601866951d699ccb08ed68493df43647b03b100aed343e6d201feed21d610a8a0af43ed9a2a9675fdbdfe5106fbbc97307d192c4a9e48b89eb93391e80ae3267c52b2f984eb114ad7efa6e3a151f88d1ea000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009be78732071cf04ccc5e65b01b23ede3accd9fd113da3df02cac6e09974055f628a6cc6073ddbf7d505094033e8dfe84fc9ab997e758a95d881df183ddc14d97c8b64a206c9f4d159cd21c2f7ab19f372b8e2799e1d3ab4d61802329daf43be6cdbfbf8e7608bd498e16e201f397dc444442e3488272bb55cbce251e09f6d199022084ec782c69ea1008692fe15c8a4441d6f4e5e7a96214e9d71d6000e59252b402001c281285c472c07b44cdfd434b3c3a49593f7d3b8546ec92ff2339b792fae60b04aded641570ce27647843c4f636eb4d3a9621d2f757b594d6d5752bf34f955f32b7d5aae170e335afffe415ad09ef53d233cddc5209a1f507def075cc85011103213648550354b7b144c45496741a937e6dc98cff48cd28b50478d7c190efcec003282cc0c2700f75f0c6670125823cfc7e60634c0814522563bf0eb48f8b7c86cc021a0fe5a3c393463068d34ab6148135ae9c296b2b8128bf83d96ab4a849b4a9530311d13c794cf6096935078199fed0fc74cd2e5844f1945ae6d7b4b911a945e1fa021423d028fd3661508f009c6dc716cd83a5f545806e52dd3a03664933930b77bac96e7524736dfa70596c6917c1185165671deeb16ad7e53415961a5a58f72a657644b102061e09200b6e873ec41f60f7e6bcd6ec4f68b2cc7f621d07778f78c4d8d71ca6b34ba1e37cb81789aae608b47be71e3a147888b58bdf528989a653d6fd64e8538fbbc9bdbf975303c36ccc063c127623f1fb2dbc4781d2f865e033486b70747bfc7940b6ef86d54434c5e05fe8d58434c6323eeda911e33a4ab626364e7b886665365df65b56a27021d2c094fdc0533feb325606a1237900cb314ccb648b242ef47c509650999a4e449cf8f917397d665011306d48e0ccf77f1bced0e3de17a5ecb4ec15a3ef74b54ab3a9d4f925c2c1ffd1330721afe23aa7213012fef6f165017cccb52a1a337f99fb7b258a7765430c394d4caa3767b6917570341acc58b8debdbf504c90373c9b8bf1bb0bb80ae60b37f0f93e50a035aeab0cb1540be2b79d785873cff98a8eaf4a8bf243e4b4b6ac542d22a93572aaab5bf97e054ac38dd534952a56dc4d4d71bc8c91dc2fa2b802003bea53601bba17833968bfc365ebfddfbdd6909d020280db66e011b9e35b5145df048b04bf025a174a2d9861e36cfd763dbd6da1f5407db9784e8cd103843474cc901d20f1ef0fadc594963244cbdce38d92b0e5a9bdbbc360c5ff57c2ec8b9b98d48a137d160a37cd4680575faa2eb2158ccba3bf9af544ed15cf018869c80b79a0c37a158506895379956f7a1bd42a356e3176dd53ce240a869b20062c38d8e59225674bca8e7ce718cb1fd6212777c87cd25ff1a7e096c61bae7b755a1a7206bc93c557d31ea8ee64f73b4a32696d6c218db332b7ee461f99a034c8bdbe33cf89c0705b95fc9cc96d3d63186ecfff4a136cbe87266470d3be663f973a288062abaf8f4ee14ebfa5a04622a3d188dbbfd1a95f917148b139a1a27c5a597ae168dcd95a0496dea20e47fefe5c45fed2ff00a9348ac3c463ceb5e54bc6c8c169f4911e05e39a6e812b6818859113798a7d7e1e4280b71bb7ccfd0c4634f04aea0c0fbbf643e54eed7cc325c1eb9c5379762ae43bb894cdf5ec646ee41d10289251bc4adfc1f2d24b3a76c5ebc81b2d9e655eff192d7d1790f3dbe11bc54c27cfcbce0e00c95c198d8b04c7071bd425743810a0e973fe74f721723a9a582fb820afe952ab7cd857a7343235f153c53f59befbd8380b51f907045ae1166e2520ad052eda4fecf6f90e6a169566b628e9e3883cf4f855fff8b5f7952c566892462b9775952dadf67ae8a932952e6d54fe1015781442a531d92c376464346a025d191951403f9bfc32518062783338b94cc0dbc37ce17dc3efee9c6f190553d26978811933f75ff86a83c2f8b00ca228366961622896a7178b6eba8d7e26c5aca5b05e8dfc3a8394b117e05cbaf238c3e2a5b127ff04b9eac808333cca2f50dceb53656111316aac2de1c56fd4d4f9f08d9057b3b1d50558d78e80d9b7c56318d7bb3ac1e0777f8df6765ed6388f401a85e92320d47d74cb7882678ed688d1797f5fafc52c36ca831a87515caf640f4ec0fa8914fffb32d7f4a83160d7131eb6ac07b4d39b2fa7c7974e8af8b9f6196a69fdcb71e4438e1f32a07e015965eeefa5c5d1a2006e12c7117697bc25363041e6a6831f5cedeb389a7e7fe976e5be4b6a343b7aac98132d3ad60683e29994d8ef21ff558e040132dd47ec4d3736d63d87b64770ec3965163892cd9a6010c48cb2979f94eff01141ec696e99f0e36e32dd272e2cecee8c6859023503e31779c782bbd77a8513068e57d9fda8a81130991f2ba621b886353df35f5437bb3dadc968aac2fd21f878f23b703c22bb04", "63635365", 2, 1906685658, "e2f1fa0e7300bcc76c323711cf8459da68010a4dba65de01d9a61d4ebd30a2e0"], + ["030000807082c4030234d5398a1824f6345d11246dc626fa4a88bedbf0ec9ace59fb95ffa4f905f5f0020000000651526551ac51ffffffff8f956945a1ebb2fa3189047bbe85cbe5cc36a466d1b33e0f5cfdf19b72ca1d1d020000000100ffffffff0466b54d030000000008516a5251630065518d208c00000000000152c06cb0030000000005530065536a7625640000000000035353515964215e00000000010000000000000000b3942e03000000007cc429d84223fc739ea7a9295279fc7a0587d82f8871f28fe65598832b26a3b4dea402630e145a4a3431cfb2290307c7ceaab1945d48885d6c701b95c062b8aef99bd0910de52770b110cab898bec5fb4eb7ce12845fa6a9e65b6a875ced3dc40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000037500f69da198ee7d1d5cb5c135be9f496e6007804568f08713f0dc5282ed2bb878d6174b0919ae156175aba94091f0c78531b8fd62c097b9fcf11ce68dee0a554f8e0f60e0cd023e58585afd15d32c4fd289df53579079d4f713e3e6dd298a44b420b67e881180485edf4c0d2390341e774df1d9de9ce19bc20c183ece677fb03012995ea82cd0216c38714adc5382995fc1f5c3b315037fe209361f10e42f8e5031d9f27f74f5aefb16aa9dfaad6714c40d4cb15d8a0cbdc9b2b6d6bcff1a2cee00b026c87907ef29390c2975ce80825282e4398ac9916d1911934a6d55feed358faf3257e6ccd69d708e699c0c4c8b58fbc5d00eb1e81d36fe02a747e19ccbcc42603256d4bcfaa4fc455078f98b4cc43ee4b05fd385eb3d179f686e3a42f6cf5d948030d1f12df6e55403ef2bc2db9b6c080d01f64aa354b8f94293009cc9d995d428e030d91a0fc74dc88d914436d2a722de73e44a3c7baa5b079f42d592e64c549b980022e5c33f2e2d98ec8cf2d5c1c20bba6d1a970bcd8b1c4218be8ee0ca3a3dcfdad030660e989ce53f6b88a6c15bdc56c5bf6a3ccf0780055ab3936a9911a33ebb03337888bb0d7a42f00c7d91e44458878761b4d6413d9ad10534bc7a9bfd92bc0e0ae66f9136136ed5080d4adbbbb29b908464916ef166a8f0e8c7a7084aae2e45ddc049447aae29090caf7983af4049e2663356eb30682289aae397683eb3ddeb09b4fb99d5755260b123585dc4741a7fabb3b34d0cf10165eb33ebbaeff9abd4f421c8c56a67e6223507a26ffd1bdec4e4b9a9fc99ef5827fafc31818d4e8b853e6e79c99df4d029ded2659f34cf16667e417667bfde8adfbeaac08745e4dc65c5c44fd78ad1607dcd1e7881af6fb575c806a37f1c05b020ee7739d003ef8f7a47f2cf6f5aeaab659f170b4f6f66025ad222a8dbb6570fb9ddde53b1287a739458147a81c9a21bda01c44c08844151a173361849f315415e7e6f159c17c0444fbda8c8ceb202af0dd696bd1df3ab01616b9ef2b0f0f968f67f2c8b26d99e92a56c44bf34e15ae5a433e979583bfa3233d59b7715b58d1db74919989518ca303adbca9ba688c174683146a520a2072bc308e1b3235e80938d252c0c7a50bf59e442706eddc55a65bd17409ce2e888ef8b782569d9f83bcb718aa2956936db7dfb1963abddce78b0dff808ebe383a24ff7269d21f8ed3970b92e9a3c86ca2da2f9b9385e8e0f987e1ee3680b5973abac72a0ffb9473d485db402c52df180150ccb3ebbf287794d194816a0d1ddb824316e3d823484224ac236e97cb8f1006f0197a6c701f1a7800c8394b6a58fe264667188e7075182bcbb0ab652dbd957b01a760e60399b44dcb7d6a509ca7920affff5d25619b86409b4c2cdebdfaa8432dc3b554bb5f8f3138f0b5f63b15a36afd36a7f1f31d5c7cfc6db68f965957a7f9d17d59230de6375579b335ed7ebd489fbeedb7d26bc01da8e3c5dca28f458dbbdc6e0c6d81e7b7b414ec1edee0d24599ba46ac71de16580a1b874ae182660e19cca9587a8cc1afd8619c8676ac1b34711061cc9660c3f8bfdb54ce725bdf95f8c5836ceb5d411cc9fdb09ab3089c60ae7aec6371f6b99801660fd098d8254f9eb895303c71d26632a2a9b5e58ddb1be81c3a0432bf287c8b21a713a76743816967fc0010bbf64b46ac228e354c044bb121ac05072656feef2100861475f542c9a343f8612c34fda7065ba1226d0ca7b8c6433ce935a6c563c1930cc04d01fd8c0e39471c4a2e7e1c25b844561985d21f39bf2df94e6074ca315c7d425df709a9d737bed8374a99f563378494e228829d45babd3a71c0fd36ba7001435367b1f32f1cab4bc121feb1d143aa581f3f3f22080b1f54f5faff6b9af8f960d4e9eadd0f398fff2c34733be5ca733afbe203907ea37436ba7680a3578cd2a9ef1a532190b54b742df9ae0dca8075befd26f6d84385e29008ad955165ad2e0b8ddc62ffc167c346c62dbc3ca723bb34669b1ea9cc4b80237701c18ab66188840a223e6efa63fdd0d7f5e0c28df8a84e1d27dc92164eaa8f6c97ce7cf217796f0a36da7ee42fd389515384b2325e70183fa4ab588ebcda19fdb26045f8d4d9742bb4dc258c4d5b4429ab175e0614dce5ac45503127f8f948b9750ada17847c6a323c40e52b39a47dc566d09a0ab670edb22d3d0866cbfb5301baa4492b6825bea2241897ea74a8eb855a478e45fbaabe94e4f832b5953e07806f7073bd09fd30fbd9f3edd72d673db7218b0959f6e3de117e27053d5c7fd63ffb6d3cc01602c1b2ab2b43fc94574199d7e65687a9fb9a639bc6b1986a940c51e8b63e28efbcebdc451e62a3b82f68c68c75136c1cd1140fd71334216f6004cf281a82430800ba51417166eee24025eb61f56360818c3c041da6a2d600bc01", "65", 0, 1518328733, "b8f83b45276d7a4d3fb447198c99ca2a222a1d37b56b5855c26827cc3c859562"], + ["030000807082c4030177a468c49f0c2fa81cf5005c79404e239a420579d72edca181cbcb2012153b6303000000075165535352536affffffff04919c16020000000009635265ac6a5263636516a98a0100000000016391d1e4050000000002636575fcfc030000000003635100000000000000000002bff304030000000000000000000000004f62b5c3fad048630c80567ca42ed80eab62ba7d3c49ebec1c575b428987a02fbf501ccc3b48d04be987c080e4a331f486d69b2e332c90fbfe2259342130fe570b7e27dfba3fb69260da5f6484698d6f17673131eb795b88429c661e81d3b184000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008328eb381285cedc41c7be37666625566f1d55a27941666ca0ab7ecd4afb16b9ae05045f6f552bc4bc86bd2a0e51a54079091c15cb948db9bf06d05f2fabdd446ee5c2909bd22b2653377e18f06a92883de11e5d8d0af35290d6f63dbc13c8a9e9d863f03174875acaef74c82e6f8c1cfd842be4cc9d0d9d3691c8703e012e2902164a984e348fcba96577beadfa9873065a147ce8c642af9eb9a8cf44988351a3030bbf3b6333b7c06d5fc0b13fbbb2ed2b2ba57603c23aae704bd0554c1752d9390b06a7baa0b5bc43715bc18ada83bd19138f5639804910d6d40fffbc59687b07672272a1bfd447440792e1da790f93c5c39d92e5af23aedc2d90e4a9e8bf14a66a02294df8e6bd075aa6d1888d45f9c464c09398641ae4fddb8ba07bb272fa23671e020dbe101e121cd6f09f8477db11f276257f728b38b54198369c4b0f2c2854752b032d8ea2372e1e226126633e6797a98f5130fea13e994bb07978d59429635cf875020bc285f8e0e3b4afb080d2db2df27d0e617c7a389069aa48e666e2bd2fa62f26021031241432681b5b45f491b80b484635d08605022452f0a5bbb2715a03625d657b5db6d16046b101f513087f5b265f72442224c578dc987a8dfa4edeaf37cd8bc449b78d0f9ae87b2ec7e0d6b4972241514d333e497e3002defdc01af8b35fd082fe4a33ecc7f83282e39ac7de51cb4162bc169e59b15c7a62862b329913e6678d926ddc418eccc0e1ffe5e7797f0d80e6d9cb4f08bd998317688616833c563ca64d2df2f1f67c8c2bb156d1cd67ae55a725f5405f5648cb019b6c0d2258a413e3ba57a9cfad7bbe093f0d18a80569b4f586b8628064887c813ed61facb2e4661b120f97b1e7383ef3717dc6a3f8ae4c2e7341cbc765516f48c1f27dac0e64f9d7cba1fdb1848cd466b4b97acc4a8f28da973a569db1afcc6960c75948dee4b26c8eb775030baf54c5be85245bc1ee1e5fa0995f9882eb3632cb9bdc123a1f5b8d64a01e82cd2a4c67f446216b8e38efb6944a15376d02910aa256aa52477d48a56fc305b15383d4bdfde49fbb72125d4c81570ebc65d9a2584c6c8582b45c235eb55296fd744a51b0edb3794c483380933988d596bc0432037e12990fb43abcd9457170b12d8900cf405f2049130ad5727e560a61550f772a3f5bad3f29d05032498d52cd3dbbe089d87c15f000de97fcd95dfc53449c2bc472973359a6a99e98799a75e351ee38e600017c2a8b1450e3ae0523c576b16f7983940ade16c1b890065ef3aaee3eea6cf2e5d930845560299f7bc7fa4e263cf00db50980a391a9e53d0eed2132b47f0f293dbcf99c7ac578971a11a1a96998b7d8783102ddd0a7f7a09aaad30eeb9cba5fbf0b2c636a10d3f75cee203e788542f2bd945cd848acbad7f8b382ba8d3c355874ba439e6b67bb85c8a26df05054b343e68254d1b5de5518ee4d141b62e9f591052d0656c43ea319737373713bae3752b04988ba47db55f3b3eeee7f1093d7d78983a6b5b3c4d14a057fe27602a79fbe8a13c701fa3437af14586567a18fdd29fffc7b425ed8c41a3d2668ffa93f25df4fb9a3df38459eb980bde37dee6aaa96db3d7be61907687ac7dbf9402bd32c22cfc03849bc34eec108520f8fd990abfc22b1043b4f08bc2331e623ab5d5630313ab073b6fd0e6246d9c8d6fb4425476f16197844d7d561d97759c57873e497279cecc98e8bf013b07a5b479b597fee6c1d33d93cf20d41018eee8a771ee3bca22d677f35e1cc095fae18f84670946744d6f4d763aff51c0d309e8650ce8fc99760d3058572e96365f0806d014afb2d5c557de874d0f24482715b3ec4f24166477e12e0bf89e4203c09cd715ddf31446d8407f995fb16d6c288c53dd9776b19aa1dfccc1c806db358f538abe0f2b9d4f76a039dfc29b0943686b13dd45c0447081cba5e2234a719d35953f7604d9320a7cb0ca42ae4433a3f356f24cb22e477f1eea31b66daae3f81986b5fb3e56c6119715f2bdba422463986ed50a96cfeb161800e92a6a5eec957412d6d7737142b07f68adf894e7843c3513f3fded3b5505b0eb09f6d5b21f1b35f5919348706a882f2ac8c4743c88c978eff0c0047713f9108a4c7e24bc88551af15f9d9137a0b55180ad569ec46c21437ac95c4693598a0a65129d066d4af45f41420b37da2ae0f1a782f1682f7313e731ccbfec5fe80e8a0476d3234157688affedb7bfb99045c3521d1d5975e1bbd2d8e782d8c66e223a51e30825eba710ebc495c302b68aef951a30055286749575b41cf0200000000000000000000000080d6e9e6ebb4e5d82edd148714806728c7525466735dcfe574c800800cb4ec6c567296ba8eeadaeba0192d264a7a5d6b4c48f78142ec519f00263b8898a8198c40a606b35abba13403c8adfb2261512d8df2fdf2c448e5c024ffecdbfb84c355000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002dc8a7ff87e10eabf944b39d80fb4f37e3ea9805321b2f1756916347d744113a996945cdae86c4d5b242fd64340e7a06625bcb49f83928d31d460795693c03fde1b89788f84f48aa2ea983a959542f10a85c2c7ea9de3cbdbd5c08f7fc1e7ea3951105fff0f48b11bcf3816f32e1cc9535622de0c294f7347b22129b215fe3b9030707a923a83ff8a30168b66b0463955b7d836b890e98e7721525b741a9029107032c2f2d11f5dfe19504de590dc1621027a803fccecac0d06fd1d723bd6925738b0a001ae0f7f6032ba81798921a8d1fb5c40e519e4a13d20e1a501d5304c37341b115aff898b30b4f408262e7e972162871af86c458b6310ca4092fe27e0c2fd529032f495c38f55a010ae358820017e2b0e1772e795f698235385241c61360f03874032b42466335528a8a9c17751044d2a5feae2a146f8834d99261b734b8afa69f1102106d1819bb232f74fe4e6a380b8064e9af3596e6b4863b4fd1901713ce0a65dd0318c06b83bb5647b0296e24b01b7574f4eb32915ca2859a8974dec49f35249766032ae768d88f2f5519026231165c9648abf72488eb6e1cd6568cb769196da16c462313af251c2f20a736df5766d318dcf5bf6e24f51c24081f2aaf38987f671048299dd41715071359328e3942971ac0083c61d3d439a26be4e68ec10cf0fdef8d2239ae024e531dd5c3272ce86da331b5899d784a0e78a01bc29d2361a4f8fb008b48eb25cc6ed893982888a7c7bc622893d2ea178c915744f9ec5131dd048fe424b91e62c14f09090a95830bf06067bd46a8a6539a81957d62ca583fface4a90d14ac48a80380e002bec7c2198423d5ff4b010f6a2152022809989dfa6da29bd08d3374bcadf1ed1ab87d2bd0487878f126bf2f052d50ab3bb0f31bb0e265aca18f5aeef561cbca418b9703f2c74e893be11bb8da432b556f1483217d3fffe26de5993408f1d8e936fa1499017e6d0e51fa7c4853118f820952cd84356ae8780195143486a732aaaba28a8f2920449d13b3dcd6741b5c88b79f609d0ba0efff550c8e06ad476735072547682236f3450fad5a396a15c8df4a417338bf5c4bb32ec0ac297c67b26b19b6db1be9da410967e63fd606b1a8edb90728a4b82fe37fd1a1142882a1a796057c38728beb550940258bd4ceca148179c7be5422d620a8f369be4fbdfd95230fc00b41492e74d083e142bc3d17cc34380ac40ce14561646a8dcf0161afff04c58f1797a00b475999300516b5c0be61f4448a57c5117dbaa4748d70a0610dde730a781a0917199fae0944fbb970425bf890d82ff920852bbd86a3cf6f3ab60462300697eadcad5313dd1f7520d753ebdab0c1e1a1bcd4ae4273d71519e67892b71d32d1a47ab2c36a9fca606a35d4ff52f82439aab8a633a8b621db3d0301c9f57e6c789f08f681716b57001ecc59de50d48e4cff0ab01bc3c2309028b5066ada692eef40b4c7efc618cc6e3a826be7fa756c176364133bf9406a623a704a35e7c893fddea436935acbc4bde0515cd54f11ee3b2f0b24129edad968e5fbaf045e559a8eda5e1897c56726b902a687ff5edffccf37288147d46bff688b4ccf67a366a03fbb890b8d923fb2ece0e299e44ab2ad1cd8ae4bf5bf543b9529208e1fc2a89ea7fc689eccadb1175cfe4a2a161a0698b068a1b26ef87dc94fcfe69e9a96c81ceb0ef786bf64e5ea4d0aead38249c595915f43fe56800cc75346004ff09823466f98a75769e4f4e04abcf5d39d24dfdbe56e992d74de724b2a145c9ee9c8a334795f338d23987d99399ce3a9ca4c49472a6f7169b1401d8746c8fe55ae51b292344e91972091d3deb6781318216e523eb193151ec16a5d21b1d1f1deff697eb8767f0908ce9aa8cdbde973ceed0fc2a3b79f08af49eb6646ddb87c3675df406f08bc4961ec129b01f89984c566de98765dd6641320a61d94b150204acfba845af441014187bac4d33c7b30295393d7bde27e615a3c6499c992c0b8eef1df14f9ccb5d0724d93c8226a752361ef221ab514fabcbdf2b3db386fac395c79901aeeb0c4c4eb8fd56b4f921347159531325e025652e950bb798fc9c195d4328dddf4590e2541aaf3805622cd606e916c4bfd7c484180f94053a5fc5bcdaf36cf3849f64827a9e26164f1cde2ede207e9722621a1e589b59710285afd8aacff02b56d7e5f80d09c02471eee875c1dbeac239580a71268b8820a29757a2a18767d8ccb2944811fbc7462255f2ef44c85dda97e7b5a042b56f4537c85ed509eb2529e5836d357502de2c9707a43ad526ac67f469112df8f61dadfdc54c19dbfc8a627d59a7aac0aee7032056d619b7f11e13ab3fa6d37a6c8b217dc98f45cc833204cb554b4076936021b113f6813794fca51a5dd7cc86578a6c271baccf0646fbfc5175b2128feb604a0b", "520065636a", 0, -659553128, "fa6fd47299c1398cc938b308224c5c94e3d7e94eb6637182f1433ecb8b1cca7c"], + ["030000807082c4030465616febb2c9a6260c6a91ef9467e9787eca8a6811ef301c71296c0457f72c7a030000000163ffffffff524e163ea9264b44721ab1b6a11cb2dd4abf73eb09194af7ce035e44ea28daf003000000000b4ae269ebcec0aa574fb7f93b611d409c2661fad67dab1500557bad011f988211e9e2c00200000006655365636300213a0d68239c6c0450940eb0af2a62bdd7b6f31f1cf394ca7be7f7d869fcbc976e7e7ad5000000000400ac00acffffffff028e9f44050000000009006aac51ac53655365c8a25f000000000002636a000000000000000001738e8e03000000000000000000000000e58d0bf657379a44f61eb207b33b8e8f41f50787cfcd9db964c92b48a1ceb3e513fee6ab77cadb07d7bef2d1fe81688611299756a55a57f3ab63a8afa4c37ab36b6bf9557cd97646b7ccdb31f50075081391bced58d5106f13b4707127e65e9b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7bf1a7157215e433ee69c94aba81d2b49a44b88b74c371c7daea2cc0b69036bba4e60558f15526d69d732903f2100a6cd475bed54e2b511fce0b4c423e7e78467243bc05ed917a7dac49ebb8a0410bd1a1ab95e8110a3eb01e965cc1ed3d55875f0cc1cbe08383a19ba2fae25fd2e2c521be524f94088c16283a4083d1f924b021950698d4820741ae9447ebf3a665291974dffccb42585f5f8418370499db940020bae9377ab570b51dc0d099bc46f08ed6afe6c03e91cecd9dfb0cea0c4073dfc0a0327a48b6dafd301f6b7d203403b8f70982e3b60d91a0e3da416aec792173eaabf890eedc18904b9812a8bf55028345e57d35031d9addd890bdf042030e8d61b0222b81fdc6b8e22230ba8293a7b0ddd0c2db7622b993096776fb38b67b57c8a02030a6fa099ea23a52c541101f38bc185eb4926b3bdcd6d137e982c9234030615ad022665b84e234b725ca4e7766f20f30c590fa696c1ac0494b13960a8e112d2d89c020cf3465fd599e13eaa41bbccfe4e61fc0fdb4903628962aa6646c53f5910fc300226e1fceeaa1ef038cc04f4da5d35ef01a80b3e82ffd1cdeca5e351132f0554c653fee6d31f4fdb506eb610dd0afb1385f8e4db07d1c948c1cdb514ff58bb6396933215b17297065af2c9f57a5d2c8cdff39b6abc1fe66c1ff8989d304d610792110e19902817ad3da937ba2ee9009f56194011239503383eaa2af85433579c3433aad57f188e206401e8ad7c8c6ce7acc287148f8a94ba10271fb78e7e184cae490f9632277a69221445cf9ee8c70d30a9dd0d20d4f02419ef3e0d08b6c5eb7819f6fd021767e3bd3ab779af4279061275dc22573e7a51badd466a625a0be75d6521b089ede041f22efbcc97427236e942253228da65768e158c8cebbb9925efe5462015d4af9485dcf37277ec181ee4d9f9bc42346e3bb0f4fad2913d6f479302b6c7b14c8b8d7e44f260246780edfd70e0e1a654aad9d13a61461b478ce3e0740d91d06f8cc9dea64d42e6e9963445b6716676b92021ddb3846517d98a6848f84b0f67c48524aa32b21aff247b0785532724b7c2290ffaea8f7fa31b2f025bb81f8c3e33a8fe6044860559761c8b8426d8bbb1cf72a22f1745882ef329406a1fd214e3ad2a837521e3c7be1975819eddfd061fbfe06b12b433d8d7fb71e990f5a9cf86c16692b6b9b69aa50d2e156ddcb6b367d55eec92e48bc87da6f872f8480ea56cd9cddf6ea31a22cb330a8e726dbf575b5c1533ad7461c764c950536d3f30f28c129e3766a5a048d260318e9aa2e8e176a31c7ea79d259c35a5ef496f981ad4c277c3b51f2489f8df5e8e81a3710b69c44848c3e1bd4b2e76a7e55c9fd2256749b8b273e4e585b155c853150302240185e730103d2c2fd76c6bd08e041f1e661eacee56c13425147fbfcc9e173c46c4ce82a8bb9338b70920d1aacc801e894808839a1c6d952fb07f2f0a8e72c5908e1b9f9df93a737f91093af03a508e676c54f0b76011302bf24bd2971abcd847853d0dd6cb5775983682e3180277587769eee6c650f5f5ed1fc9f64d0dc2b4479538a91360153a04ab1042a9cc03e105f5c641cad57bb31e9915000fabf0ebd43f5f35aceb67a9eed3ce085853eead9dd76fb4f121b31f47ea006c60114c9d14d55b47e0729e723268a6958447df7f7e680105ecbda5272c9eb46aea41644fd37c9f12a56717b9855b2f8ab5d681db392c9e02bb560fe99a6893f5fc825ecac5db4465e6bd936c8377c646fda47815ddaa38a625d1d1de9f8d7d80712be255313709174eb451b38731a7efcc0782c064e2f1f29c367443f22b239a5624f8fb4e3dcec805d819b04124af5438fbf2a7868733c177920730461caed4054be928779ce11aeb7157d44c2de4e57554ad79d13a9114f3ce81cb8c54711f7d788ad34a205e401c1a24019eb91bd3a95d0bde8c66a9fb07b06ca7894ee3af4047ecfebeed47d6a3a7d8ce1194926bb938f95f35aa0d1cdc8aff73c747327d162ffdce0781f298c61eb6da12ac5268890d9b3938a12af5fc375e9e81d357291593c4bb617b0b49b462e6a06c1c7ac2dae003d478ced55d6dec51d0449ef5dc40876570a18f5aaecd76afb4535f5979057390029d2f1b6ebf449acf3b8e575ced8c13d4d2dbe311c5caa2727563f6e5bada7a8f11a4b5578d3a445643b174ef61ccd87e67d51c79d068294097b02ee608858eab8aa8e661c4f8d287538676237845408ef8489861dd808aca1d0d1514f47715102c03e26dc5b9db85333e7173f8efcde8676b3038c710282f8e7e59b88040e42d690bbfeb5afb8a89eba0954ff6d163e51dca8b1e1ed48c7a62881f9a29fa902a1161df384398d9b694d0af791002e66f4d407031988f17b22cf1bd3f300cb8814a126c227ebf1e4258d03e904fdcf39600", "65ac65536a5300", 2, 1724268038, "b57579fa9138aabc87a10dcbaa8685571e5691ddd545681d30b933aaedd6b62a"], + ["030000807082c40304303d1333d27ecb157e6d602abea3e2d69f0c857a1de9d24647ced5c7140f33ba0100000004005263acfffffffff282ebd5d712e5bc56ca9b457b5fcd044460ef18eba7c2ac03e76221ed944678030000000953536a536aac536aacff214db4580ca5e95f3379f2cdbfe04e0a3d45132e65297931ad0c83ba968f7aca579e2b0100000000ffffffff270ead6516a3a0e758bfb45c8a8ffe5c1176c9208e4652eae9d6d9d2fda6e37a0000000003655263b2845ae0030dfcd702000000000751536a6a53516347f3cd05000000000163c82548000000000000bad54d0b41414b140100000000000000002968290100000000f48e3c585647e04534df4b18da35bf99668cea491d3837b0d23316ae804ef9071cf0b497fee814f1ea188e5e94954e9012c84b701cd096d95758e31049356e4a979de2ed6c64aadebc1178ccc0af772114270861ebb8b5140f4b9282df9260ea0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033760c52757de296a808a0bcadd7f87498e6a2e8697aadbdaf439d9d0bcc2db2891637e54dd9903ccc305b1cbd821ab74103106c4dccc6598d936e45319cd4a6dedbe1fefa8942f15bbf5d05226a0ee811b693eb8ed0fa58f99d140e80cf11417daf383d28f46f7750ebcf34fc1a8b38d6abe4bb6e0ed360159cea4b69d54388030a37dcd75b7fde18459559cd870f5e6c639ad865a4e768e8323f1f40ef00798c030141932c303c3604e4acbb94182d93e0fffe4bb6c880a0f2f9d95dc9c1b9c3a30a05752067682ae320bdfd7285e9870b6515e47499e65393891ab2f4bdb93348e9c71624e5af8f63385c8bb6d847a56ac776dbfb905e52b840c6356acee669b089022f921eed9be3148a743e4ff42bbcf9a423e9c00c2575df8afaebec960b4a1acf03179d20fa57b7c350116351c84a78940d462f2d21d72ef9c8b72af997a6eea78f020cbbda91c389ad2d622d6c342de00241eb29f4c8b27d0f64022afb5217ab29c203235031794b6459e15be069b6d79049cda861b4dd2c16293580280a529bcbb710022441bf409f7e3d24ca4222fb5d30fa39a93e5c8948305b537bd0414aa40794236a3ba232b11e8736646ed29c6871ab5cc6dd7a79dee44a2ff1dff2b4eb49299fcaac1907e06c3aec90e53c63a68bee16ca2ea0f5f2b759c22588c1682c47ff1d15235070014e77da85a2da04250cae6926538f4b8f958d508245d590be08399007b2d48ec546543008dbf52adce84a7bcfd397c545debd2aafbf77b58b4828a8f54270c9032096c8f2282bedce52b4c5489f1ef5692488429bfadd39955967190572970b4830d5efb01a8359c444b2031379f004ed96e060c904feb9c9c10d2d93e73a273b3a8831f68a4f908fb42ff98508dc9e0582cddab09a59e01c0b0ffa8199b37f0d1245b4c9034827c03f87afcefdc163cd850a7c2730209a2f06465d37e27b677a6fcd35ca7d1c141c3c584863b27ddb723108e6994b8a25b6888d46fc98645d2669df13411412ea6e1e9e315a8c2be443d5d2723ce654fdb5b8b1e07f2f1c8cc4b8197da7442ade63e72f33732a970ae189619ea18487f0c64c1ae8f12dc3d41e04a39fda0c444278c41d0648f247be03c4d7d3692f4360bec0055dc13db0e6d12f82db656fc4aff933ecea9ca6b60831b6ebe1ac183a5202c923a6ae8c8d720afef972798c6ff10c26cd78109f5dcc7b85b6ee575119e0e7299fb91c1e926044bb318e57f4411776d2033903006bdcaa2526c67b837ea33f218f45e8e3cb10f8bf138e9a13b14624baea4724e202b008d453e2be3ac5ad2af9e5b49f39c705aa26a4126b4106700ab7b4d8cae74c3b6553449fd444e7616b1c779b5af2523d95c549bf4af8faa71acd0c70f6fe0097827219983578e16763ab4bdbf89d47ede5d32f3bcad3fad32a54177d154167f12259ba77649033f2f846dc9c147959f76d90b08a93a18c998674b2f25e8c145cd7e230a699f7d70bcfe696858b0c03c506f09b0a4a3f84c397fb86323bc8f91bfd1b1a03ae950896e3c75e86c8d98f8a68ae33183caa9ccde849ec4fe60b0ca0568ae655eed196d6d4326da1cbd49c7d1224da5587a45ef7878dc7e0ecb6f50a92209ca1d2c8c9d22cea71d5d02abb38746a9f03d2fe33a9c93ea150d0a3477e9c7ea54c641d30c88d1dc6d4d79a97ce5376c1ed39825bf2d3d63f2b46e5ab191742feabca43864e3fe12a8be69f8a84b4b43dd296a89d05740230fa16054e8cbe96f805e1a08229771b615df102e192076f9bc32665a4b3b6cad3f73f4cebd25def20b9908b2573d3cdd1c794b028a43834166e92551c9f9058d6274f65f74d1490adab57d5261bdc390de3f28d2e7f753d413fcb7aa7a28b2cfe03fb2dccd55f8b782ff0ea788ab2260e48c40fe4855149574add64776a98f856a66de640d0c805776326c38e3887c6724951c84997044dedf11c9b8b77cedfdfd088a1c62dbf524bc80272a83b2137400cc10397cc6d1c15edb2da699f45f975e5388f089b220a25e4ffc347b17a6c474ba4d0a5966beb3252fc70713ad5667a5ca69132f73ddfe46c339a549eca11a7a613c9ece64782bc1b69300d3bf506ec249520eb1c42474df49f41852d8c73632159e1ebaff7630e2666e3aa765dfb0924560dc6f917cffbd75a11f5ea80864a88f61601242078396e382f6879879ad2257a3ebf7f6d90b64cb9e95ac9cc482ece50094c85fe79c5fc7eddbf377a5833ab65da4c5fd445d68d38ed8ef837443116357502a9b42d45e8ced9387f96edc6b58962fee044b7f6c781fcfc6364f824f759b4f1ebde9a57241b14a9cbcb8758edf160dfdaa5d7976015098500812b1bb04905839e72da221505474652c12c54d9a232dbbcea9f1114357e32df88b0a26f534cccd7f30d416c05a9ad848fffa8939905", "6a53ac", 2, -316248815, "ffed79682e42e4ca16c672436fd5d9f87b82268dbb01afe4646cedda7a16f693"], + ["030000807082c403020e6a3eb1c217f4c8cab31688452c95f8581769893396beba475a574b2ece3cb501000000015301855bbd8ccb46ec2ce4c402cccb0701f07ec31e3186190866ab1fbbb8f5dc4dcfbdcd5403000000040000006affffffff0352ba8d0500000000026565f1b2fb040000000008ac6565ac52515353d4d635030000000004655365535f3a21d2000000000239089b05000000000000000000000000b4e19207ac2d9a21e8dccb41df77cbd4b2231ecf49cbdf53ad37909634177d49042e322d5b2d14ef64205351191c735f5e21a71b427d9c558011d3a909bc1fcaacc9f1e37f2697d139b2cd55ec64acd7c9c7e540cebb3da5ddcd6b286b4a191f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cfdca308001ebbff43bae8693f0e4f10423d554bb40798e79b8b6bba9a9edafffbb4838e5b185505e990e9d66d5e064ceff55042f3c433b7b1ad8c8def68562495b50051efacc0172f16aa9273c7924970bd747e57157d66cb217405e9c35a82962ac9eeb596f2ed298c0093273535209170e848baa17ad503f8c29153dc7d4b02158d688232049cba1b72ca7478286a9b06727843d144572d7c63d43d85d0c89d031d921240b892025489319bd6dc3a1efad0df88cdf21cd2f0e54786c0464429d70a048033a134dc55013d75023d30214aa64dd3f76583615c2bb576f01de991ea32aa072e3e81bebdbe225b09107919adadd334170a8f218b6f0d5c6a81a38f42040226ea77d369ae54a97c156807197e7e45c78fdd5f55b42830c2a3cc809dce153f02303b7f8d6607c997bf99dcbc414786e6da96033ba05d4c5593f261979425f0c7021c47512184007c800da90302e2c71a904d8adcfc8acb83b1e7d08e579c9a55ef02004474ea392eca3e9947c307cbbd67088929d58efb282aae684239c3a8110964030a86ea77ca3ab1fd89ddf0ce66e7fceabe23aefb534cd25e4f506bf8d28b3757345c91cdb2e15ad1d56779e841f9cd88b4990668bcf7123ab0421b344bbd3c6b3523a48e8f35189fb7ed65c146f758dfec25e236332dacce8adc142ae4fe3b624c63fe588a73c31e49310c0ca0167fe2c8fa10bac127f0023ff02737ae6c88acb87f4575e2c5f8a8b6f5ebe7aca2ae4771ca2cbe0cd551594ba8aaf9b8788d5c39c6ff0090bed6a5f7e8845a8ecbe204b6d190554ef07a9451b58bbdb78c58b385ae3befa10c8bb3ed5a5b4201fef8ca3201bec4aa7c4cfca76bbd2b8c6eae0d4e49dd3591f5c1813798b71e2af9a322e7121be5609906695c020012161ba338b7457980935de26ed1f7127e988103dd29ed43338d8f696dc8f545fc9cb39cd2e8a98115097d3f5ab42401c6b9592972ffb45f6e6816d165267aa77bc11776eab7387f158590fc75eeb643667d06807aeae179698d81ec1ba8ee50bedcb86b10eac19831cae12662ffc81741f841aa6a11e37f0ebbe12f029ae269215a1a58001b90611b1e315657dbcda67c8f1db2c6f7ad5b0c954cb0a9dfb0441e399a4cd29014bf424bef51bf716f89717e85325a7baa87841bb91078813ea8e7460f181f9d08720ba81541c5be2bd137c707d6e525f94b8b9c41df8bffba3b8c5e88f4fa6145e74a7824c79ebd74677b9b8c883a258c09a35eecbe7d793c94146dd60c11d47285210763f7cec54af41bfe5cc5f09eacf624364d2c5c35eaada0c5be3e8b64767df66226f07c678cbf2ea04c78a5b73a39cd8b54dad0d7e612e99ca1a951fd391bf2e8913fa51fe96d090d2e57270ba5ba7d8f26a95aca2dabc2128318642e23028fff2f522870d2459f666080f8988d08974c4e126652a04d734751705790d9c39f0c40389794f691204090a8016f89f5af36a25e612ac1fce414abaf0832c5b9f83bea7ec5dae23e92b68a5d977a423a757ecf024f586275c67e6b22a20c62df84edf7460da239830afaae3a075ea17679d0579cddffa3fe668b727504093ffa87b8e12cd54529bc82af7e3f7bcc858527a7be845d58e2f4729317c8ee74d34be28c2cd4415b77331c1e1889f784396ccd2614d8f0d57368a393767c127fe247db8cd3bab761d8c5adfaddde73a1cf8b801db1978e961873253b76ddbc11e88ff63f8ad2bfde063d42e1e703267c0b0bc48c9d694b01921583bd560d747ab148f904b23ac1afadef69c1fc373d3acd91f9b9f5e4c389405f336147aafa08b8d91e99c8cf8c31a5e9487f76842f40b727ec6eac1bd25073997c48b4305881cb9188890c40c9756dffbd45b5922ad8e1ca7e03d630195be5fe94dbfc918c01febe357d9951b784ca3fc7e53ff8901e244e8075f36099e599577c19d6b76f0d6828ab0b49820c98ee7054088062ce969589863cd9fdbe9cb70f8bb45e53c58b757f6e75b7338d1b8d9190615dd089f90d75b96de6e491df1d94c7693da3eba85ff1038eef048833340ca3d5770d1224e3fe7dd19cb51541b3cee68e6324ceeb0d0aec9ab1f00cb154234abe48800ff26664de405ce764867f681921fef1c275bbdf146353ce6fb9a495a6ff00f75979054e65241242591e47766d3bc826b40279b4a2cd6e2af2be23118bb48fd30e64dbf5235b0bfccee20be81f3666360c6c5772894e74ffc1fd9a16cdec72a06bf58753961661e74f8423431bafba3f1cc805862ae0ba4273bb82d52ae84d2c81ebfa0000000000000000b3a75803000000007b58f66baee33293dc3349b0afbd81801f88ff70a3e25b30f03d59ab604a02aa980a09efb2115381540920f5a451ce1bb781fbd51688f4f4280b20a46aff15f9db70e247582d46ee6a6ba1a002518ab7f0a3141f3c2106abf5b76a2a9a63c71500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d805b931d9b786b331f19a099472fc2aad216a80a487c9a47eeb1ecc99e54f819c0c4c62d37c1a4b22987896f286452d58f5fb810b19ddef9fa2e182b850aff77151513de9afceefd577dd96ff29728d931f7cfeca3f345adc92bce2f672a71fb6fea61a935f37fa508f95fba6a9963f0c692838222f116159c1a7c5eed3968903224666f476b1fc182046e65f34a8629af50bb65d3b4444b7a299933132786edd032f12860758f5c5e8b6dad69212618f6f17dd19dda87d1fdb74679ce071a0205e0a04a02b6c37ad59f3d99b65e1e3294d010a50fc516fd51318cfa0d6b864c8173be9eba94ef2d2a2208bfc031b7deff9781dc04a306dd650a43a13a570e483240a03172bdcdb40f8e89860b7f69db3c46fe412b9df97cf65e29d1cbbfbc43126dafa021bd55abf338d1c8d2cfab294a1550ff01f5b69ba4d8e5894e556983c00d7fd7603263141dbf8490977972b22dcd3150c7f2516d9b4910d769bdf6ed29f3b0d3a46030fc12331c7e1c2aa8a175a4a0c9c46baff66069aa2bc9f9929e65095ac4894b60216805283071d61b8c13b0534e8a2bd529c8b1cf7ab6171c43cdfa31d5757efc993b1994f51540ab6b4c31a083c21992026f1348301732c83a4f3f0f1de549f760ead79ab59334f65e349541dce3983e54926f1590236535d6666378d2c715ff6b3855b6ee02976c4d5c8e8215c2e2bce5d946c07294c9ad7365e0e3950b56ae1625c69df604f741d9b822e18f9d6685d801d757e915f401a544bf4e78be8a25b31e8c098c9fe613dd4f659c5e046ac3e76c2bd5212117deb0e2f3d6619ab5e2019b2358568d48a34f08c10a1cf16238202567e145ecc5a470620ff3d38e4209e625b4f6ad8be9d895db3b17c61035d33bd4390d6b2399aafd69156189004404a74d6b28d8642dd2eb59f6d948c4e20a13740da658fb91e6000a4ab4d73e086d4ebddadc19bef106c88fb5d88b96383074e1762e070d36a5c1de2e3f737e50f10d50385346aea402c107a1c0f22fd9d5dabbc63a041c5c799496353b27b820cf22b35a91d4002c628bc0ee619dbf226086001de4d6b44e06d5e9f0fd7e44c5973ea182c7654ae99c100e00d624dcced68d4905016bff27855219b97c83f84b3d4332b142ea6fc0a995b5f0d2168f53c4707d55b09504b062d587720a9edb6a3e3e5f541a169e8b82169cfb939078d0d0185bc3ce210217ecd5a75393e46ae501217d48fae7d959f19fe3f7973ba2908df016c9856181e10464c26fbe9eef4c36bdf0a2b475c482092530cd043131e59759c33d33144f29cc6bf6475cddedaeb7ac1f82274dfae92571e8f2a3412b3890731d7b1d9dc3c2a25c7ca20a225e1230f274a9cf6390ae7027154fc05d203bb22808a8548bf2a85a37fc4c1234186d53e23d013eb5c122b52e6b4f96dd6da55f880e986562135061227ddbf1d33ac968a95b79dcb5abba194291416f483838486d9bf00ce5421433ab5a3ff44076bc63d4bacf9cdcd1955480e28bd1abfcb749655ce1c9b495225b9fff914e72ce613d5ea50292a7b93853ac94d6df690b4aacf7f6bb0a8d1dd03f24e1e4c8561cb7f2179b883c6e025554ec4ff17b66b603458cc70ea01dea428535e81a07494ee63fefd5d175257d5360e21474dd0d85fba9cf476af706758ba8299642254298fb3cd883c6bcf5b6fdee978aed934b4c9c320d3ab287099fbc4bf1f22d9e93b462bee676a95c547172c32bd19a5479af181ef2db90d5e996c8cf5bce059d287955f0483223a36ffee09dc507dc881913369c5bcc7f232ed618654cc69e726c6c04b179a64ce0a2e3cae6a8b1a5c437e5f00669a5786196caec98861feff00772d8bd2d14eb02b51cbb12eea24c6df9d7b85082ababcc73cfd44fda6647d86bde5cb07e11f1e77c15288bb4c93325243b3662f967b227114f96ba25d4a260fb9fc80b3b938a2c1d25d5d720b06db9033fa7aff929268989b23459d974a18ff41b3aba45b682b610b4021c338b118b78a6c7628b47fa80e5fe97be3d826cc4b598fc98e0a4cfde72d741881e82fa405cdaf5d4e2110a44187ec1819f8761bfca2d25d3c045806aa1f937f36ba1e005caaffee73fc22ea876a5d6c9fbef2c48d974633d1b8bf83b99328ba9f84bc5881aa0a06d1f695faea4c56c323b65ba43f9e18e9337780484e7c7bb40129625ded40e3b64926da46001797a1a72e2eb5158b5d5416bc9810a804020f02e7902f16e502f08a5b3476552313add536bc4e621396466251a0b267ee346b69800a8b5d6dd2a953da48c98556c365a9736a64e318d95fdfd4d46b3952f3ee5ac1d0c8c35e28a28101bc8066edfc9b7b425b47f1d7cc8fead98e4e70084c9ce044dcbdca19ab03d315fb2fd9c2803811b0839761966baa43ddba059ee41b7768a31007bf249cf8975609", "6a52", 0, 1740129121, "fbfd8f015359ef639c515a9ae1f11b0671a6ab2dcfcbf3c2889564d08d10e6f6"], + ["ceec3b2b0475410ddbac2e9d8f61f1af0d6dc92e7b7216d3753bb3102ea3452f58f551589b02000000086551ac536a53515289dc532ff324a5c59ba462390fc1f7a4b9e0358a03f66dd33482c4d3afa4ee4a9e00eaf2030000000652acac006a52ffffffff822e2863a808c24d48cfbdb75fdc7f3d309cdafee2426efbb8f744d1f76174c60100000001ace79d58d3b74138f647e8b8a641df4982995879f5a08e5891ac12204345b26197cc74e97000000000005020e5dc020289f20100000000003bfb4f0200000000046a520052000000000184ef010500000000000000000000000093981217edeac6c6f84e623e673434ff0cced8a8b7d2ec5a5db481fa0c0e1ce1af23a3d58c2ebc972f4997960448cdb98aa88a54b1f714b519ad4a6a455fcf7ee6ef86c40f8705b04f7afc9fa1acd10f0f97d5c2c039eb69dc43659b51d2dac900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000abd0bfbb4bbbeb74eadaf01aa58d377803c62ed359c1f4776ceb84dd1691025235420f37c950f7815e009332d6c40b5bd6c4d39ba87328a08dcecff1c0205a4e6e7b3d961f2a05f512bba1c731501263114061da3e0ef4008bfe503fe7a6afb17b74fd81fd56e238cfb2c53df220084f3599f35048eccfefdc3be792b9fd9b9402138780ab6521fa069d942746c42291c5bd6fabbda5c7afeaa303fbfd9f58900d03245410b8efa5c90772ff96132e3c3d70392ee2d490b47e91043ad4b2560793c80b09246c65b9a959321b7667689c7116db13481ef21c69f5665b6fa7a9d9bf4fd9eeec02859f904fbc2dad751c6e8505aa3dfe0152ca67c8beff915c1001c78283021ceaf7fdebeba51f40db24d40366aa0c9622aa5156efcf57c21df81bb0b4597f022e2b80187d6b4f1b3a086fa87adb31945fca09e577392d39c04ed88d87db51e10207190ea62631abdb21ace553b014359e1d9ac3b57ed3dee9c32f2f542a2f469d0224cc6353f510462492ca9b4161ca51e5f9a4267426a9e1fdce5e2fd1f6d44b730301cfc463af17649cf3c1241bd52fa25864c2f5cbbce0d757deb5e182ac288d76a44627c4cb56ff29e6df5b6cf09dd03d1dc1f20a9b2b0abd0c1fdedf7f9516084a2b0b4df57024388f3c034d7ff3a9bd6669c71a7d75ff9a495ecc3086fb009ed3a75259b031b6e82b4f8f757d2437cd62be5a660780ddf97d8c835483b24a9e7baecf03a8aa76f1983016fd3b2434668b7440c19701c9e6e8394d86aa0697c06049bc90a1db68144078bd2ea98a3ac55711cabfc293733d0bf7cb101c95f2eb5a259c9aac45fdcba1e04452bb08a8ce4d50969c8752b81db0786c43566220dba9d9e3cc9e24e3710265cb0fd959c1b81c3d2379f6773ea3a868c21e6c069480c1df3f69852b48cb9a9ca124e8f0cc38b01395299d72476a19c6e92efe61370f464f2314672accb496db3e6cf9d012d527988833db9ace093c4afb103dc1ec9f8457661bc656db0aefe9ff22bc00daf389e5498700f8352981c84606e84d4f748f1185999f93c7a3719c6f906fc85d76f690271cfd8cb74abc804ac334f6eeb7b5fd2a34306fe7b06e6a2f52cf04aefffcc9e4b122342fe08d186736faf2e78f1b87af7ca5b55f860662634a95cf85285fb8b4700ec9763da4e5992c5990dd2e8f76598a06ee0e92e0edf0184437380d4609cf6ec56ff2f7b84b30faf91f25ae4c0d9f9747828d4f428177265bcb78ae65c7a1c7e7bfcc1754ad910675233fc0c72b50e603a3e8727fa7b963deaa832291e5566a52ea2b3c0facfc809e613b98e61897d494999036d336bf7e874455339b0fbe4895e90588737e1e7e09c25591f4c6f4a7a84e0113f598391b0e57b2891e63679caf6c7935f7b50b3bddfe3a04d1f975cbe37bdc162f2c4e52a617a8b68b1b03453a30c803dc80785ef8de68e86b3316f9684917737034281735c836e7caf6d1f14c44f54d484adf74f0e9284195a483d4dd6b1812265dd4206df125db46942371fee5ffd949ff2706ed6d8035d4f8c93873f09e0adc934d30c976ac5d0b9a6f894fb065ab5c7fac095ee69bd95aeaa166076331e14f7407e1cf81fd75df28e3ae64f12f1a4b96da18fb93a05e9045154d0cd60675ee984c30a20759fea841f2c73900c74eb327400d5d0e4765debd27cf773107e0d997b4868c45f15d811ec945c4e17aaf480c1c2cae9ee293ffd08c7c6ba42785f84b4434384960d9b79cc82d367fcf49f130e6005017ddf680877bdd937f3698038207684f979e08778c06383cf17acc6804e448dd6f3f5b3c09e412be35338c21920ce36f6ff4596dbd71ce48eb4eebca10638842e4cff94f956efccd98d06accaba240c6a600811e112d8183f492cd95dec63a916ccaccf6bbd7c006e4e4eba243ac9af839283e9ea5ebb5ab95a2478156ec69ce1c6e0c07ff9b46298f8591ad6e63e701bcbed8d98d024482450c761d4fe29fe9361ab628437a2848423875051e6e7a85e9f18dfdf5af8cae62070c634dd4a1ec6896ea650e76707ad36b02dba1ab396f1e80f0c13df97be6307408aaa8ae8a4692cf1bf65772e548f117eaf2a52da2e6731f6c18db2ca43cb63ccdefa3de7c95555ddf463ea987dd2277877fcc4396051991213d41f505c87d62d2c9ab91f4b2e5c8d41c63939338efe3794ad2e56ac38afd6d1a07906fd82fc17dfaaf64349ba09f293a77d6e3154cc53cb2a4b46de8b4481963fc17ab0f6d5fd7e1a6e0a8e615887ae9707bc43dcd0e4b8528edf7b0b47c312bb2ce88ac89693f5f004b15be33f7cecb49a8e469c0849664c4a5ec6dd43e845beb4817f06f0d3164a348d04089810d1a7737045ebee757d0b35506e90b0cdc249b293c94f49474a87771b7c9d851a4f1e4fe43858ca7b9290d840e1f08ae356801", "53", 1, -1235183906, "ce2c5263e2ffb84f681706a0c2432735c90132d0a6a8dea8fff1774413cf4dcc"], + ["da28705901cb7d269ec0b031b13df9c6a852468c40cea01f8457280d961843a6793b01646300000000020053f66500fb011d6098030000000001650000000000", "5151", 0, -1258123387, "edfc9d0dae278e26f23b3dbed6d8aa4a5f0b5914d34afbab7e55a3a3f0f056bb"], + ["030000807082c40303806a73d4908d65211566767eb4b719e36ac909f3f83fa42948b079f5d9a0bc2a0000000003ac5353da61db4a1b8b7d5f8dc5c3b37f4c61947e08567a6d781ea74f230f0ac9306fdce8a3250e02000000016a3078289879422a1b92413c6ef30e9e23b1dfd4f9a545f89a52267331a7c375b1e4e4d95201000000096a516a0053536a5253fb31d1d30265a5890400000000096552656352ac006a52c8ec460400000000056a006300ac000000000000000003ef69eb000000000000000000000000005d21da76a1695aa9bf3d0ea3336468f3bef2f2ed0c5ecb82bda1c1eb708280ce1f3b3c487b13be1db118fd9efcada7b77c87b38938f304ced4614ea2b085c3bf55125798e95207bdf86fdb86f37b46802bd54e980f548d5dc0f057e5cad9da70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002dbed893e7a42eebed8b248c74e09c357b2d6e83c25f0da9d0d83c6f429a6b3b09132502b837aed5fb212ac05fb8b1a833c993233cabc861a6b219336d50c556db1afb4e93ad423c1198f528ba0efdfe0f2f66b97ac31fadda3eedacb75aec6e7188d548ac8b34e13279599762b23c8bf1e606a434669726026e46b55b8773680230363b27ed596e8816fb68aa28e43482b277f7ea54072027b4b3d2c3053404b6022b44d3dab351cd0d510aa8d44a0b759f072aa474454bd9569dba0d520a38f6cd0b07f3d9aac7e1da161ab93c1ee5c0ed12370312b92454e9c47d6f3650e68ca1d7c7dbf3cf8277b8181556fc5fafd2d3280f8e78c1f6ef78f2bba026231de0ba6403198b3bb041e02be6c5fa8673c1a4b6da2e2b2cb4119c9a1845710d338fcfefd7022e38998bb300940e81402031c25b910b47ce7b02fee0f84c85f4e85b8d3f98270311f2bffe1ae4d0082dfa18919e0dc4f1f7e4d89ac5c89143f496ccf5a5ca3b6c021e7e2a0219b362889889819a68c8b447878d7912798a928ea224e08ee2f738d1021377ca78dad90c51833d7d2f23a7f97e3017b296a9711dd2a82ecc27be4e61a76547b63cdd3232099155bfb4195aeba15720003b094e32cb8bdb1ee8222a5c89a2027021f0206a353a24c69679093d85926791222d1db719814d02defed55be042386ce8b25f37ef59fd727db962a6e61f29d827a6a6c02eb80107e0baa1eee984a8a7146988365bb92c685e3b7327e115d18b3a6adb0f4ec8b84bb7e60984607cb9e99c2d5fb79ec7325942347b169bb1cf7a816a05c322047e992d33adeda2415701da15faea2218e2a7bbafea5f98eaf03ef6e1d3adab7369e240fd516dfb37f42e18f9909a20ba1b84f096063c9100ba1c3b2589a9a058f43da119f04f99096b99b812541ccefe6fcb63ed28e96b224652e2b1c5101ed15e66b4d7bd461829edc89cfe45096b5d895308e4eb147f200e2736bda428084e337a8bd1ae8fac610e0abd96e71d16cd77624aaf745f8cb953656c81d2459e0e524774347559e5a0a1e07c408c1860257a0f76569b55f062e490b0de5d7828586d4611fae947c443dca328c7982ec2520c23488fd9c66ba1f4152853ba1bcbfccdc11ca7a738b0f922c8941381a3d7d49fbec96aa41e3ca5cd8e796461d8331e8870b4e02049f0ce50a31da1a200b0843f51d8439846005d4fdbb90a126b8b1fd3e991738659ccc4dc1cb6e92d9804c7d2ca3bae276d7e44b548a45661e50b90f344759de9b49d31324201e5e9c94696625e0b196062b254ede62ef08a544a8f3d190e6a950fc206a8f653628c169c463ff406263a2d886e792bfe1715302662d787c2b9f1c3e22092fa937910230bc542b1438a52a9b1f66c845710637c1612454f8a5e89537947468b23fd2f72f42c0acd644c4ed165ca00f8bc267f093f80fdab71a01776ea1113e2f5c36345038990068bc661dca2c0aa03642c86e27d8cbdd4a0d4fd6401c215e5ab7fe07a6cef05d46c331822784d8a7fa8051f469743ff259affdcde62ffaf1f2ce942f9057421341a805cbd2317226d88541e66e5c10f16bcf3d4b1d5ed731ebe10f4753da815926b1ee6f23d31efd4ab1115e3ec2cddc9c3c8b820c32baf0c73a328a2574e3a26658bf7fb41f20269197870a01db3db021ba3ae9a87524624df17fb94e73e6596990a65d70e492a99d3af321b37e93b2227503038b72f489d0004877ae5346f390cbfae192d380dda91b10a52ed9b7464378bc6d2bb884d2e65f1a11210c6813a8d541d04e2941d4f89a53647eea1f6ee04848f7e4c559316ec3ae6d71ce64b3959d67d34c06b111ff629e5705aec0c5aee4ce9bf562e6e1e06b8aa5d6b73192780ecd4c023d087c8370746f71998ae51176b2ed9c886438911e14bce6cd83ba03a211d56e45675d8bdc00eb59a28bc39a3eb846691cc7e6dadd02e56703ba2c1424453005d98b29c024ce2a439312e6ec7d8e69c8040c137d47aff30ae1f5a5ff2c5b387643be678da56628568ca9d85b3d0c0ef5dcd2253091bd3ddaff436dd79a9480e81b696183ec48999d8e6afa3a9826011c3c4a7328cc3e08a4ebff144f9bd79f71913ba364859f0f68b3e854187607be2b45cbeb958033bc91e24e9c068f0be4c7e798875345ff2c5afecb877c300fbd3a28788ae8008007997f9b33f0b2509801316e875704f2237a97f75ef6a6074f4e9d875183fde58a2337c29be2bdfc560dc02eed15571a5f26773580634402d886a545da08e5e2db442fb902edb7af6a9f3321917dc8403000000000000000000000000e0ee7304f8bd58093ab9290fa65d2afc9e06af392e43020aaefb12a384974cce5546dacb37f79b95ec0cc7873d8a821c65f5d75205c1c6ec4923bf9a171e7887d1c0f78ba201c9b6acda2f94dffcb99df7daa97df4cf95c8cad44563a3fd08e6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009238cdfcdc1e0994f694d0905c517aa6b38ec2f62a05f92b15a6f93012d5edf1687d2760bd58a3ad6311eb5816f16da65a4571fd96f1fee32c8e10d1ee93cae4c408af94c19b29da0df65542d451cb902294b217ade62707009e5b6802ed7ecb046fd384b2d4de8bd1ec5cac975b159cd667b5c52c8ba01e5a382e87c5ad387d0214d8b02f6a1a46c7cb78ddd42fa18dbec55028b5ab0e24e70818bc1dc0433701032a18a2dfddf5d00cc75d454e0a7edeba8c6d457f46809f5e55b1b865717fe5c70a052654b68bf2b79c0cbae1db349c554cfcd140d6cf8040a6346060376093099bd13cb267ea2047efc9597006265a7500757b5dff00f1d1adc0a4be2f5def5a48021ab8edf29ab344fbeac858b6d8cbe2bb4fd948825dc69009992adf4e083f7b6e03014e5d52f59a09c80aea54cb5900aeff7eca9f11edc2c6e1f9f45935269fa774022938d7ecb82d61598be2a7d8f6b61d510269dd3eaa620b37ea315f0e484d95c00223e4042dee8e2078611eb83e833ddf3524ca32f2ec71c43d291944b700709c700321fe2e0edf7e96194b2050fa376465cf5b39452fff6de3861f45769b2199bb5cdd56fc86d7180e2322ba4a9cc3900ad38566fbcea5a07c749af02f0d6b17233685e74153c31993d6e4ac75d1dd961426df68f89e37918fcf6dcf64f8e28622b59abd481f0faaa572b3cc7cc8a137bcb833d63ae6abb7ba54c32d2a3ebffaa1fd11d8338c4822df77e0c2616c124b710a08b73a1ab38d780ef411aa861e617b2659ed6fff79e806fb81ee8856d5baca94f6930d8fb542893f2d38811a8bdc75a6007f434b5673ab682209471169b2c74503a86d3d40576dc0deaa592b7af2f33e5bd3e69d6b158f70663cc5f19eec49814de663f1db22c07e226c91b86448f7bce0ff025ded0e25d66d77968b04ad32fffa09af98bab558e5b1d64f18cfe3c55156b5326157d4f5b0b1972d2d00e327d916edb73acdf1d45e14fc31c3527b99aea17ed645289d706af689020c6220b4daaf47140089f203fd69f648705eee210904e310d7a533f6d0a0ce314696e22af5f6502ab7a7c75306e87b6923342291318fc9cdc7f9bc2de0c9d59e97d57b551394b38aadb0b8578515e189d922960869eed31e422f0a9369b3a284bc730a0fe0dedec0fcaa3066bb155ea0c4d50ac05c275c5ab08d73b68c8fb2b2cba1c8104b34713bac9464115ed10099f267124341b74a43f9bba43159e07027efb0ae411af2ceb5c71bf8f63f9ec88ec238d62d493736c696e23615bc731c3dfc32a72ff641db9707ff64d10f922a1ec6b2a5cd9ad87f2c040dd2fb8dc54f27eff3e832d62ef98bd6b3a9c7942cab916e2eaa956d7b22176de8a7f3f690ca201274618800cc5fea9136c287bc869352e212a8506cc62350d448acf28e88420325a40fc42540d066a886f9c04527d9085d12c9f7673d227ecefcfdb606e3c7bc8110fad29661b41c24db0547c7d24cd0a879862fd379625dcb1e41ae1569f0ba41a8e6677848b792b4f4c44ce132f585772473a842bc239de9cbd28217d892d358d7094e1b61014156847a4d9695e5d061d41b8ab3d3c03ca78793ae89cce9c43b4ca5b49bcec9c07521e2898a450853e24f401dd817a09f68b676e29afc0becd6af33abf9a5500ef4e1497596647707d1f577d4f8755cb402793b2ceca9b347ca631de40314b1e73dbe79619318c331e7a1f6200b7c7d151dc430fc246fdd2b9eec17c28eb6473a5cc223162f1b8b2a570b49d2e1a3fe485bc35984f46a47f20855d0cf4f8f6c39f08320ec11f867c2b7c5148ac922f7ecfb637aec012d56950232b268676e2d6b1957e6d7f48f4d1fa2e775b93489f922295905b8517899c1a2c0d13eb8d7c97ff3ea544d9ede1c78dab17914fdbb2696c704962fce051a25a4d3e2f886e735938d9e90362e273e1d8a47f7721bec3acea5b2754fab152673aa44e1ac0fa8fb2e3277b16ef3d6a8ae7ee2d6813c5190d4afade9aa4a3f9128c435acbbb2ca3bcada14ef6671abfbdfc7218e15a98ba17596a2a236e3cbfd6bb94fde34c3ca32b0bc2bd42fe504f151a3f1705692ffd5f0166e8e039e8f1a243a3c8f02f1a9811596969aec261fc7528d8425fcdd5ca1ba1fb5b9c4d1dbb462566f96438e107777ccee625d9e316cacae1a2a56cd359548b3fb9b8ef57658b88887350a6ca070713b5df1d191aba59fb478529c4285b0879452cee016cabc22724911b52062a4c2522c27361a4b28494ad977402cd6ee858fb9e9173a2e90d5ba7fb9fd9c701c00000000000000001e1c6100000000005f045ab7203dbf152de024e3eb84876884189c84469622dfb5022d5fc1b0618788a02a2e3fdf1906a4f296ef55053efdde460e8355e6e6367a429ebd6079d74f4db962e5fe7c5489fc0fd6d1e87f4aa189e5b6e1fc48bf96d09dfe1d7ae88e0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000059fc02fd2969279e51c41c77638acade9a9a2bb2be9fdd28c7d5ce1db26586354ce95d006d4af9cc6af0a9a6476446904d184aa5ebe95d5d89eedd809ab4b9b15e4f7b7abb0b7a6b4d5b1a7f22c41bfe3b184e2e5e53b2689e322c9059037a1581b4f2d5100d25caba25804db3146bf2a8b3f7ca59e6facaa0e560db0d99336003256391bf0e59d17da57c9775c9271dda5348628089952eebb1cf8d3291fa5227020215b156a9cc3fc593104eb5c3231a398bf6b894ead1376ed8081e78842b9a5b0a01e959a992ebf1e57e606c9f2594d758854e6650724c3aacd1823784bd115c6319ab88a5e23aae0264258638c7fb860e0cb5f5515a7713e86c0d6f844b51ac8f0227cc7f11f8569f9bc16982e220a7479eddb609c52911cf6dae3da168b34c68cf030cfe4898c125a1b80a1106c2b9e7ae6a3c2792a4c6aabf6d8a6e02f7f13c69650220f61312a681779a712c595a077e1d95021f4ad67aa1c3c661aee0783631a33b0303b214eb6eef8942ae0ddea7d1d8924a41bb7e281ba3d56ab292a935191b3e64021a09d4ee1ab12c1637951d1792900fc5e36f8992f41f69b26a8ea8c595ce2a1e0dffed75a0c3b82c4bc2a3b07349280772cbb6a0d2cba3c18b2deadc19975189295b5f9573d54b7fce66568d60499980196b2d944f54e0190b27f80b87a56ff4ee96f269193d1b558faecf7e0afe742ae3cc50c42dbf9a73508a6e894b50a5acd4898f6ae554c8f8ece8a6f0f19828283b6c5b6e47c26c5e090981d37388f6b10dc6f23a7e173e39ff81004e27495c38bfa6b8cd648c663975aa500f6ce5c62980f3284898767d2dae4f6a55157503f559fa577d620637ec79b0411fa3d7a9a253985e96a26b0105750153a10520d060845dd9fe05596d1cd0b1fe6063813bf0e13e17f6d7590fe098e4291567dce89379da1232ebcf99022ed624000e7004577e8322706fa470a9106adb8fa8710b26aaffe91b648f9e2c4979935ce226f1caac7b4e039e3aa977e3ba3e0e07d1f37f9b0174ff79020040903590c5e8ae78eddddf9f3b58d14a729f1dba1f1d6f81a74c7454a700e9cccca615bdc64d2d06c5dfd35475ee6445629c26c12f22ce921725a4af3b082b5f3d33e9364d5827b10fd85f5e34ed37ec86407e86c96f8b144f289c6df4067ffb7ee3efaff1e73301e80eb4944cb129915376c037795a48438501d5475885613bc374fb5661d1bd10c16e9a60024825150dd20884be41d49e688dea92027c4ed3246c0542e9bc374c14561467efa9f7997f8779d19f2087754a3717273824730ecb7e3d61a13dc726155740de8d16d56432e461d7a127432756243be610391ef95ccbbca4814c9c7c66656040f40293514619874e0aa70fcc04406c9211e98bc46285b5e78d4380c70b7696773ab8d04534c0844e83585d70b9d19f87de038afff14a95f27f503bd6dac626ae6bd3dd4658ec379660ef92fe9b2266d4e6f782d58069340ac85588e692b275879414a77dd9138b23870134af63645711b9e33d5894c8543897852912537bfe0abeac596af0822de900e981068975abf42dcf8dca2892612273646532e2fc7ef257b1a34205eb973ef2e344c9d7e9afbadb0f493c49642895057b669c43cf622bef162768cf224f136ce6bc128ea5c4acb176899bbf65e2a7ee09f550353c0d4223c764f98876736b3521dfa3f80fac6dfb4cc391bd6b2cfb42046035d2016c135e9a33e2fdb99842743c2f96c8e88702d49a82cd73be8efd75a74fb387ce2181f33d8136ba67fc73e3f1e67d3d443a5110eb799c3e76fad9e4499cc9f19acf09b978adba043d8222321ba5392c37af19b4255fbd4485ab9c531a3000f236b74edf231582b79cfa83093d3bfad6a08b9bbb20b04afe7b4a74d0cabc349a75640f6b0ca41ec38f67a22993d5c0c414699d0c160fc1dd8e3981efe04db3b1487acb077da3aa86f677ac7aa7aacf51640da3c596c0779dc3bf66573f2556cb8be0ae04bcea9f8d947f7c50045fbd3d82a7ea6b111d3ab365fe3fd3b369bc65b03c229b07d7374e729049ba8c359aa2256bfd970f3e31db9896fff18f8f62a43f3caf75722e75778aebc1fe362486035ae89cc1f510699995424df519b3364475d7bd74981e766562b697a7ff54245aad8ff34aae8d2a9583d10194e8522e9b2a37c05b9b1eaf4fbc327027c1c67e5fd628c298a7ea6a2e50f6f9a85683af05847425fb517f3b18cfbfceff4ea110058913dac8251dacf24fa0336d90f6eeeeac22a25de1a6188a1752199e4c98dd2a9e75c50ca1379986820dcad4a55752f77d7ad135c63609e501f957149cc02c85f00dc316f77de7b7dcf502b750798fc4f56810e3dcc08f1d6dd879587fa6692c673dc66f8ed14f989622d130e5f7b005ffacf671db200a0d756a9bc42862a2dbda02", "6a", 0, 441155734, "c3292bbb74b1b561e7f08faaf45b60d69c35cb897bea118cc24a0be226bb4981"], + ["178cb25d0220fd6339e3e661440d9b32bb22ec00e956879acfc45cd2635d6b336f1e4eaa500100000003ac6a63ffffffffeac099a3ee363f9a7b534697fc6916a51853cfde436d67a3de72a79cc81be92d0300000002515144aba16001edf480020000000007ac526500536553a5108ee900", "6a656353526a63", 1, -801959471, "7146b3c34eb7200565f41e8c4824d67a6c9d489de2969f24e2b791b7e757bcc7"], + ["675fa166043b203659a46668233e9ec715c711b862cee94e42952333fc5ed53e854e6a4e85030000000363526affffffffc4c97abfc6bb1a1daae550cd7ed529097270f64309e598c29d1a73e9be13db2f0000000000046448ef6090b0a98fe8794d389b1cb688f84feb2fbfa0ed1cb496beb429a9fee0f6fd82030000000863ac6a63ac51526affffffff96bc21ee9c4b2f065f8a0fc0821b7308ef5f57adbd64a2be42bf178335e5bc190300000002ac52ffffffff02f3189f0400000000076351656563510039b63305000000000465acacac62e6dc02010000000000000000de82fe020000000041218b99435a4dacf44170252c8da714077def11fba2b2463e0e08cb0be75d36cba88c873c6b65fec04bac3f402dc48081fd744b23fead613eab4bca7b39e96845de7f37b140ea6c8b0dfd2cc198904d7947a96d8f0f829a72955e92e7c46ad7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000649b3733c7ba1b9d68c96f74b6b6ce582d49b48a5c0f393cbb530d55cb9429cd303f3a43e7334941a9d69cb96f8c95f2e300bfd66a07974b7ba84815050f2d9b81e1a09abec9856bc19b844df63776f462bf6384a3d4aefc9e4c265496e22a462e18104302cba3198e5ef997184da04d572d449aa9853dbd7503c9d3f33564a020bf9f301dda938463921c1801d5472b7332e8aacd5b77efbddad5b0a960edd990304386cdecef80113a975f3454e851a641dac612cf8ec47e059c4138332d5464f0a0011468b2b6b7ac62d4c102e7bdad1c4f5d63497f2b24af016e335b7bea026a220a89cf7d1ad750bd6d8a842d4f899c1c90201755a6b43f234e00b66920334a0022fe9a03d2da89991cc9ad2a227d424e3887268626249d4e723da601a7e77e19602033d0c57a0649b6b0523e295e3c07d07e0dec976af52952284f01df00f768608021dd762a2afa1e017e4affe27d51c478228f8c95f892c6fdc39a9f60601d7f5130303ac542d41bd1ec48845009a5df6b6c84121b690da3763eb70e46b226a29bc4103196e227bf62e49d39c90665286246225df39350ef5d4a4bd0847219bbd16a6c7ab7fcf9ae6b539bbb359e4f3db05e1c2309d7fc28a77336c768f2c2847752d24e59e672bae5fb19e9db642cba26c5510c20db51875d055e2f53aeb2ca56dec8de03d2ac1e9583db8550b0938e29206631357595e40ca9e746867c768b22853ee559a2662a20a4dc8d1a5c2e5954a0e3f9b3fa0467c71bca83aecf0a7b418fdaa6489a947d731eba98a3b2bbd448ba0eae6a36f665d279e9e7d89c90be9cb3c6a44c4c384734190b8dccfdf51415a729c71d70e8b3fd53a6ca9ea692cf5833f9542b8813039e5ad5b2db8ac46564c07aa3e491789841e0ab7b15afade0931c8674b568a13d15c39642dd998ed2870b3bfbdb17b413d712f7626bc45a2559f6ddb41c40aaebdf9bbea4476664204b69c8861a6e5a87a9feb7951f3993fb4a65cda01bc70ca11f934764af0918b0662f02a324f7ddaa0505cf40855a773ff228670521e1fddc7e42b29879a90b8fc69b2b5ce72f2a786390ecd7664155f5f95ca166c66e7d39f761f3f5e80ca818bdc80933f770145801a712de41c78b8d725b6ea779af319b4ddfcc68ab40dd0621063cbd17c6ac618017dbf328a8336a35e3a0481a8cb4a53bce645ada17fa1ee77dd73cecaba0aa62cd1ea0cdf991ab1353ec0d0af254291af49bccbcf3e2df7e9cc35a4884d420792afbefbdad25829fc0bbc6482988f54b31b6d60d4d04b30709c5e9cbb99e629355eea80b071c149fa95a9671f7431d3feefbf2da371cc3b249dec6355e80566807a6d26cf761075bef015b93b2368c81fc643317bd3807a569250dc3e2f4f34b3149ca96731c7f06784370b5be6c4ffbeb2631342d3bd4fe8836ef306243b91c52e89920db4a333ce4a3d5d3462cff2e7052f1d461c3753fd8572e9c75f3dbdda3de48ee0c05369181b8269db79c42a94ce2ddae0d01c0d01d4842e33178948a5439ccb14e42c293ad6fb240e59673e4f3f148ad07bc31db50cd01115147aab51f4ec90de9712d24f5519f59355e99f8eef074e7f195d23e299a2a4df634588ba9f849f5c19c6f04d662549eede72bfb7e00b9b93ba27a8de2c3873597433d8445de823daf4eac0fe939397db6c427525677760a85500c8dcf7c2e89ac016cb90d24d811f3a4188d3f1e699e9d2f46f00a7ecd29ca75cca4b9c505d3c9324aa1111e1dd1452ad6dfc9e26eb9a749d7001be802e0e1187fca83d6027c3192aa9afd8e944c4b1c512ee1cb12ad92ebdb27b86ef377d1f78536933331428b9350acce8641943b673359b25ffb7f7317b9d4062e2a57849953c5c6f31cf51937aceab3db6cef3d5e4c7b923898dec87174a7cf38f03657e5fd055c932aa0e2c31e2faae5fef8a588b8a015f22a13f9b5b198f9f919c3b135f7fdee15c17f64238498447e88bfb8bfe2afb6e27ae61b558a8d8cbdd3389d8a494e3cf10801faccb1c043f3aa0b8cf9ccd57da5b8b8bffa29f4fb655fb1022918fdd28d3b603771854cd08994ca6d1a16255aead0a05c702ffb416ddd79ebc43c7fcda150727de9d71c42448a00afbf2b7de1b36b64e9dd0df07db64b5082718e0dc9e00c3cb950bcfbe8ec62e05e32aadeab0518ce35b142f813696dcc6bbe5aa47c80cbd107b18cb6aa145b4108e38c69dd1558dda9fc003883252f351e97a58b3e7eab6320774ebe4b1919febc97f23037fde326a5fa8fa886326ed202f319a3d8649f019b5e794d6cd94d13ed2e488371b08bc8038c1c55ac2079f139aaf7f19ed253b05da1fa03fb79fdcbd501f58d435965f3fb23b74e428c673fe06965a03048afbb8b4fbc659d97718a0bcdff55142a6d0604de83927025ac0efc14b3d83be310900", "ac63526a", 0, -1745775988, "dd2448f1ee4b0620d54f48a5eb8022e94afe32cbf156006607fb1e1726c74778"], + ["030000807082c4030310a5951463db872fce4431b3e8d61661177a6b4191916ca73e38d16114ca1f39020000000765ac6a005200006d9cd0b10d690822659aa3c2a71d947e1a8c28ad72b96e389fa19761d21ca0dd057b5a1a000000000452005253ffffffffee4696a60c13337c3854cfbb70456fe3b3adbfc4990121350fa02ecac6654fb000000000066a52655100acd814b0a903165d7f0100000000025152e57d2303000000000952535252acac536563fb3a4604000000000863526353635253ac790be8c22c3a38e3010000000000000000665cb80500000000d7d29430113c95bde39db23b8720e6a3e9b18df50ac143f6272ef25dc7d8a72927404fcfa46721779bc9d329d76188eaeb1b6f75ed2c201314e68309d4de02ffcd1a72816c5fd63fd0a6df1384f0ca5b3156ac594b256e0f841624870814594500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b7cc5243b32f33fb70458192fdd00b1092efc4e29655ac0318adcb8a05a893452438d9d889ce5f19c121afc7486d11ad5382b236e49212b7d8d7c8575b86857d1401d21354e61882c19ac04a6dd797f5737b1b5da7fb34d401c3c3cc4b11eaa95717b9c3682167abd587c0eb5f88435ed15a359ba63471bd36cc5e8de0cb4329021b7129c4ff71fc23ec870b5a926f160478e696779cb2b82d1b606167193d33d602215cf2224cd640547a40aba7d46202ce3723290d50d871e9732d76e48a92e6670a062ed0db38c4c81eeafda722718655141e6b9d854b0d75e497cab514a32b43df5e0efddedb7c3cd5665e3c187dac9ad7846971a0b4b77ccfec29295028e891f202113c563f1dd53d751e367941aa9427712d3c70f9ef79ea1acc6887e4a363d4bf022e089eb5e6b430ddc9d98612762d397f8d033e49dea91677f49e61688e6fde4803026f9333c6b3f64fd1ac44d2274eb95b1a06171a0387f226803a8d89bb1477c7021ed62973dc260d69ae26b76d19ea450a03f0cb0b5a26b1f38bbf62eca4169d2603209cdde3c4636370876acd061846464b64b93cbb05f69616455cce2a2ca4ca4e3a9de0f52f603e00b93f48ea85de0a4e04875fd56690b21ac44eaeac2dcb09d3f61abc97c02d2ca44f81aa392ea2201218a87efa68c2ff18c666a53c9848aac3a663c511c9dae60facfac1fc9c959928ff8c31a96cd3825529cda08151efd644945c939504c4fc9f9f4ad1bed894541c04335c68f6b7ea3afd1c8421398fe73c77ecebaaef6d09f452ae3be8dcfc0e8d5f8c3ebc06a5c7956b8a7f6f11450b7441dc0656314340027a18ebdf80b74ccb12d3165cd4585142d4674b28414fab0ccd81603277b18f4d99c7dbded5b5b689a9820af1b98ab9e88d4f74dfb7cf14a73d0d03ebe5132dbd86d9307cedc9c56ced54fcf845a6d8b12bb71298117bba3063dfc22d4e2d4d1394cf8eeb751c5ab21ffebdf28771e6c02f50759a5e11ccc0488f7f8962343f50c6eb9252b1a3dd57ddac8fc41819bc8af00ed83ca926b0587e96315947ed8f1f2078378aa9c179f57e6b34fd4c44dac1ba0f4c21303258137707d30d2bb8330e0f1cc2eae6a7b749f8da65c1451b3e9b7adcab8b1c14197d77e7e35df4c358f4f91cbf744477c63a27d53ff744e4748d3bcc29b34d4000e811778eafe9a438dab02a8cac6da9150c5bdfcbbc016de0a6518f823fcde128f63c0b57e8c8f86b89a955f0a0a7897523b0a85a8a28d8fbd7d5ca71c3104381a19ba55f3b2a16de7efaf48586a95a03a10ed5413f62697e64e8f18e0bd277b03705e309b9748a179177ab22dce3567008966cdb3650a8f69367c5332b8f0ef519f56504e72f1a23e525f464695ae3443f40786df90563f57dc342072269affc95b3102692187d01c7532dce6c662b58406641e9674a83e94c49c382bde3f38b57dddecc3b3ae4320ba4d938c7188f3cf02ca262d45eefa6d4507689d9e3d0676ca5ac9afd776876d407124009167debf57a33bc2ee0163f18043d45fbeb47f2af4138cc90f951dbc4d6e90c08a713985c043d5a8c2ce3cb743b6b1167120121dcb5d525efbcb6adca4b1415d1fc1b198a18f455f98fd2816543b523a1f32de655ee0fe235cdb8a54bb468023eb41cb5816892e891ffc8e9f45af22310c39e47c778ee610e24549ecc208eb748b07b6427018ff2a82755b5e19dc0041b161701b0ea812a6c7bf978e404ef8c77ebf7b513f9f5b86d26661210728371fcec5bc05282528aafb0e8c8cb3dc80d41d114f59d008a4c1aa11da9b4f3e9c3da082f3001cd377a302b590f16e94c7df26b23a6433d894f275968e4d9df5dccf7d8d0b14c7ab9eeb7ef1f810c1cd3199110cec40d5d4c540ea8cd9fcd614a667bae2a81660608f32032e005de91d43be89fd3cb1d37de62e2c243daab31ed0d9cd6191afbd25321ec79340251c8a72dcaad0704987c0ae4ebe593506ee954e357ad655cde10c659b247fae9f71055172eafc9897c966d5be504d838262548fcc034c858f348203a1819094545a4101a947e0efa3a30cdf42f738823e27ad7b8aebdfc216301a4b33dfbf460f47538b4f5ff8a19b88e260815b11576ebe016d25058071b05a12ec470692aacc91df2ea11e8bf4152b27b5bc3d7a29094ac5fff125ab54999969760f2279e02ea2b5fbdeccab346dc44b5fdc1d3edfe217486a8b0513cb1d209b9bce06e9949327a8cfdd987596aad630518856b1106bbb504afb988a3cef6c66b10228f6bbcf7baf0a39e1d5252c6c10e73e119b677e48300bc15c48ed64b01d7ef8f7ff70a84a9bd051a29bf991320afb3f0fe6767bb43983a9bc48135ab72c28f1272a5f7e3866547d6c89c412fba2f7843a00ad4bfa87611c88902b24d6e8fa6c6a7c6706fad2c01192fd269b6a305", "6aac6aac", 1, -1002125106, "8e34fdba064d3da83d64fa767f789670ee9e5638094712052d7fdaf1b5dbb409"], + ["345ebf1c0499e0276e117bcbd2be4cd9b2ea32e3968d6277a5f6445b785ce0f89a64a4f5a200000000025363ffffffff72e4bbb42b4792d20b53b73e92fad0f5e41525e7374915f2ee813fa5c8aa9dc0000000000653ac6551ac632b6fc4067e5446c2c0f63f9b4990f545cc2ac76224cbb50420dc13a7ac1a92019e3a7ce40300000007acacac6300536affffffffd55cba37d221e7a799486d2071c4ee37d070097e2d1f1d315bbcaf345654465b02000000056a53515252268cbddd0198b2eb02000000000763ac6363ac6aac0000000003e5adbb03000000000000000000000000c7426d3481df101f3d3a0782163ab54bda711f7c09859c4669a691a6344cafba4248865a153b160562e04e407959d10df00c4f6e5ed8a1e4e6de24de0aeb7b03f2d75b84e69411516c1b02ce0ef8e3f430bc7a84238f54d3055ad498657b1e2500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ac46c49dc7528b54b3aef0709adbd1dabb021fdca0fc25ef110ef3051deb771b5250467dcc2e91404cbf438265b86d49d7b96ca7ac91b9bec9ca743da985eb5b0f477ede78fab9a9b7d88c2c58fa92d6538fcabcf372c68116e4be618aa938bc4b061936a2147b3b5edabdf0e3ed4955da0ead441a9464ac9482dfb9cad55c38022515e04290e9c4eb8306f79bb7d42d7a8a049729140170ccf23a8f6eb4e224aa030652c46786c6f55f798aa283930907d716055d3dabb92353c1abaeca6e9d38370a05bdd25c94c48bde56c92002b672566c8b02d804a9f7a20482439fa81fa4fc97ab0b72ddba94945bdc61a0345bf91004b0b5601a4950a6815074fab8fe5bc09e0305ba2b1dbe40b54de47dc848022f2c02e259ec81df3beda399016ced9e39d69a022f6c972f47a20a5552a6f61059227fdd0480b996b3c75bcddb731f8e638d6ec1031b0049a5e99a4e9996f722903a04f970f50bb1470c33008347cefe5dc9d857750307d3eb060e24224f2e332c0307b8ac2fa224ee36b8f24403a070bb524519377c032f45f8997cee0d045ab17d518c30e0700f49605eeb1e49efac49c9d6375ac8cc671d0b919b98d23259fcb0de27eefa75472f817fdb026fbc6a089e65481100e3a5e4c206fafe821c84d32e9d734eac67fb9d20b445e0b6570a898e0dc402efc803de71f0c14bb40c6902b9540613c0730c3dcb992ead8b8e11d2ccef9acce7c081e3e0890c64091e610cd5934b61a7e57aa68cbc9690b2895c53bf6db5785f56afd2156cee8af03848bd3b766cf5e55571853c175a946a52cb9cfd995914bf69ef7b885afc10cda0287a3ce30620ed07fd25f6e694f783510aad4f5e92458682f0b139e7e3bcdc7f2cad7b9bfcd38350bcea0ccafb49dd364b61b98f6a3babe53485db24180efc1ceb71a5fe4cf719b6a1aff749d7ec0ef2805cf10eb1891ecbdbc87fa929dfcfa2f7ede52781f63428646a121ba3b5f3e73d006fefed03157e148b589d939882e6d4bd5303506d10541f45ce71ce7341d9de487c85bd8605dea9a156be7a122b4e03c7ebd224c7840a0e085c6c7a44e37514f122852c707cbc2156c04bd5f45349d428e9b20404f14b11d0d7a7d82c4b1d741bc169a1c282e95ef4d1cc88b58d76173af6a4affd0b3ebd5901ae9fbab65fe60eecf65f326f4dbf4339d1319538fadb31e12d43f9da27c0635b8cc0bffbc325ad9d6c32fa9d2adf2856f0838e6198f581801b8fdf7624f866567bd9c801de0ed17ec63ae08bb1bedc471cffe516092d502d2546af48e043aae9fb0031d51acad694accab9c36c465644a35b298c28b73884b289f210d6037e0fc6e37b0d7a5ec4a7cf9671618439e242282abfe8ea89f50de435be180adaf60451566be9de3f0926472d47bde14d15fa61c3c02cb7a6e54ddb2cf2d7605b00af52f84d255852e91a6690f340a6c6a65b400a3c3770e1fe768783b7a2a0027a2df3d4ae57c9b4cf59d01e54ca84c6c5b3ae3420687fc756730803424052da134bf87a5f924f4045b81716d9ad77782e20e597d82c7e74506483a26f86ff66718795f0b0cf29d23f2fbb2e47dbc85f60465f3c7bbfbf6d4d97de816dca14d1fa9a520b780cc64aebd7ccfd4b35875700b357f0aa5d2b99767f8c55072c07dca60197c1d3b2ec51993b837b0ceb71885ccf16212a7778bcb90d480b1dfc63308023869ea9de0b323c7d8d9468a887498b698a31bd01dff39f017b8cff75cff6ac4c487127419376b56be0b3f47a4cbb69473289d64b6a8ae64ea949ef4baa0b250adcff33bdda05929d8557fca887a34e1b392a884ee441d3489c7aa6c5bc65191bb0da815d364bca287164e3bd4386430799b7d91c1f61065d81deea3ac90b0f9adb8dd66050dc5e74488ebd0963d608d36b8257c13536c925b0d4c31a546b153b60606e1a99b79ed27a0058c6dd8d839f3b17dbaacd7e842625dc60f31fb430e0ad30f8702ceca85fb1c5fffeaba7c5a879b032081287d08267554f612a42dacbe43ee0f1c9d42f71c62786073bf10c7cefe45139af7470a5ccafffa836c40ecd7b920a35f4979a2dcdd3f16fe319a630b35e83a1f5405990da03491df31d7dd371ae6ec1bed076c2614fd706e0126df1bf395ef69c455c4a8bf89469a1e02ff6fdd921e81e9678d8ab954974e8209bd69f753035700a699af284c11400244baf7387f97fea6c17c3f6852f8dae0af76ab331c7e7bc491b8539bb2169ecba2bf2124547d3f09284c02c589ea30d0d87f455885c77599d4836e481d5cd15e576000000000000000004fb6c0500000000ac8d3cdc32b0a1b8ef021d5f5027519f4f75502abacef251b249c5033d86aa016049456eb6620e2521b8551e2ed6c156f5f6d4d14a5daa4bafc0f4b3b6d2d6de91ebd33c59fe2fffaa35a85299af3afb9415ff27f84ecc9449110822745334c8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f58aefc56841b4d6a38fa9de85866ec46470a997e83e46f25ac928e7fffff09e5a3da4377db64b461b53534a26a49f5d465c64956a21cd118d973047bc5a74853157746b3e549fde1bcd575044d296233c3c119272af346811731d0ac6b7101b860054707570f6d9215af67b1c730fa324610d12a9ee226f0377db3ed0b6114022490f9a722aa3b5ac7b41ff1897f3d4d94575a8c140e99457b616c4f6fcf06790307aee4d36d8cfe62d869b80e6f301308d3624276a3d75e5d47fc18d846f54d170b04dee7d1bece29e5313457ee64df633e0dafbb060854b64d71c365ab9bdf12ae49dadd9c853e58cc7fb9678ec51409e8454aef660c7daec57ad7290be35d76fc02042d7ee8e1b643c11045118e3ccf1947cd522d50df98c41c98bd3183caf665cc020ea493bf2a1073930cb1860d59511f59004e8c5824c7c68866f7a3795965d24c021ce78156a38147627c2c33e8d2175a72fc7071af176e30fc555ab2891a0a57f603200de34500eae990b9fee873ebca68940e1d026fe8c0c3e1d5fe5647f98a4fb0032d0814747162c27f5a98218eafa24ebf8356e314adffa278985846182e283f84f1acfea052aa19c970615e2ce6013151a3bf18ce630aab981691eb53f3368cfcccce931e1b82c97e01407bc48aabc121aeed4d0c4fced9c533a3ffbee7cc7fcba052f56c91b3f275a8c80d20b18e69276ab8787c1298d89608554c8af992004e7148974721eebebd7e5e70c334aa4bb11d7487baa72a5ba6f26261dd16ff9f418d8fd5e791788658541a9c60c61b1b26cd3c67fa966f354b1b92648e460177c478ee2184bafd8baa0cb6ebe0b5fdf650fa3c2151af0bb8784236023242a8ad3b49fd0f29f1fff29e998b752d7ff1012870cef01c3ce62b11ba46fa618fedd92fe782a533651e02bf9ab58783128be9225bfe9febdfb8163f82c1e3af91e684c806c4c1cdc68c6a67a0ee34e324bef9ca824e0c25b29b9001148d229c8a672afff5ef7d95836eb083e9fed679846df2fe2daa81263f34a90e8f2b8498f462c62542d9eec0aeb53e1fee2dd965e2df8945fa8fad851b7a7630e5b524819439a745102a623733561964a9d98e98bddc4cc86071890df9b2e322f2948554801cbe89868a9beb8f0c97ab033f3e62105e9ccaae1fc0db41a19f482b7ba5dff7a39277f1954250bb4e20ab2fc2a86a19c26896b1cb5a46ce5d53545cf875d39fef8bfa7f44ccb49ecae91954f21edd6bb9a05434c6dbd22604a9c7cff7b5b6ab89ffc37519123277b2fb696d52ca5c05f5c0c294aba1d7a8fccb55b732acb86adc07fbe5b642be2ffa4cc0c635772726eac583f3a32eaa11058ffa640ff1bd3f1ad6aa2c14234469e954b2977d7d8417307669fadf95d560f6731ba572231add9ebd1f6313e77342c020bc9e530c0f4168fa33688ac36601253d511b61e5283fea1b1dc4407e0ce4b18161e08ebcc872ff0ce0d7c414beda2a0451685f10ea69d30f6333ac845d1970490a80b0a0214e999dafd3191b403909820a36b5254cc8fcfaee7346dce1de37f83afc671afbe0d47902f450dfceefdc4f72f510020eaad4a9d9e74baf9aa2d0fb09cca43a1da10f4491b80c167adf5e9a28d9481e8452078f9224782bc1c2fa621cb764082788e6ceb81d5d153d83647604b373bebc5e11498e30bc679bade3945ff8b641d2fa60f333458b37ff05fb4e249962fe022d62eaf8445386bc29994f68b715cc229006ba1937eed66845d93ef36e2d5b907df3fcf117ce0d3cdb848bc1fbd79b11bcbd9d09e2c43517b88fd3ba07e428804dca4b4ea609d6fac4ed01f001acb3740cede0ea7af24d9cc9d0ff8b87ed90013cb87fc15be06011af583b845a4908d9b32b9103376643449255851084021364f32537f2880c2b598a05e64e8cf24c58a298a4c4c2f112bf09c0c0e970889b787aabf78f00886c4a70e0ff82fd98a1058dedc42409c6cddc251836550f59f6092f77727bc79fef3a444a62d7c3a1e97834bc834f47c99417a98a7e050fc91d4bad6caa70b9f1afa89ceef2fbc1cbe0e8954b9615472c1c925b60f1ef04537284eae86c888ae5103883674c3b6bec276110d61273d2a07404bbdbbdc89a5e63eff717084b350932f2a5c7af6f97e40ad9895bef1f2f2285134d6b7a305afd704eec604d918b4a660a8f3dde6f7cff5fbf54c1d0a3f48bf350b63df79bb53e8f6d625cf4b6c8660e397e60a7a89d4512ab4cec2f4a5a96382bfd7e5f4dbc4ea6dd6568921a160c47259ee4eef770fdf37aaa851f26b92e80921b010000000000000000000000007d7843bbc37b1e13ffe77e52b5ed83fe09d6d876864543a66b9336daeace2eac7cab6dcfcbd4e18a21850a049db8f2dd5b2fbad179934c651013bcd1785cfa338f3a45652b362d143f1b873dbb79481e7289b67ccbf99d9dd6ce28062002013300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ac62f89c081a04eb4323ca092fbcf9a1ee9d33ebe5ad1672953c1d708abe22ba0600ee5cec186a048166d58d8784ce70aedd424b83217f05c4f4d310abdc531b18abe15b0dc2bdcf7f25fb86b07662a092853a1824d9d88edda63b3f4fc28a4581725685eddb73c77839bf77cff903c6f5643704ce3843f4463455a97b647563031bc9eff40a1bceea945d3d9721e42b1300fd69bc337143eb492697742e50a90e030bae4880c1d8b6ea7f38e2c9bbb6c07e68b98f15e73b1dfb3e2ad20faed944ec0a0526f61c429ec5142fc89b10a763613ba0c92e8eec09df476f9faafc6457a7db13cb54ac54ed44b2e35467b2afc68cc9b4915a7327f9c2b01e0aa3293512b0660218610fc3fc227b0107f85793d01f026e2dcfdde7940201d2295b38fe117d1334032f55258d105426ecb58ba1a57eefcb9bb0d84fe721390a7936046138dc5d86ee0221e76f9971df2e612c26b664d78f61fada29d2923d4a956958a8a2948822aeb8032f70a2330a2c5af2db4bb15a80916190bcfcbb7f1e508aea74cab4f162ca94830218467e5449a43f659037ed1f13a8c81ddb34b909d13da77af750e00fe0b70d93476e7ececd059ca6a9eb1da2dc5cc24239f749f07bae05c9d22c78e71e50a8d010e05e77707731dc7c23b5ceb493705a8600416023827fe39cda700e35dcee2c9d205e98722a515324218b5197d11b643f8e9f13ac22d6f6fce90ccf97188dfb367c8fdb3a5009fdc5fe59964d790c4d50452568fe6231aae6abf3b73d44b34d82a1cba6e2c8cdca27fd5a6630b9834023513c8ecf02cf210da74eae860f83cc95345b9deb8011366a94219b4522d3986b304f5bfbd7e55e09292f96ec385dce173a0f595046b6f3868855cdd5dcaa6d414071989b45c63af97b10628ebd1c0fcdf56d63ddbf9280c791c58bdffd0492be414f9253e80566c6cfd2212acfee83aaf222532a818365b30342083b291266d7e45d7154d7218fde3de09fbff2c22293dfc2a5b5a1fd3c6dc1694cd4b6313fb869801ac2d04188f45dd2cc05d2432638af13516412eb3b3af4cad2f58e57dbac8b370b020ea17e683d7bb86b068f1f234312c10d1635cf4ea42e2aafd0f8642fb7cbb34b4907bbd17f7f98238706ecf7318befd8db71121d9306a0147f123ffcb8352ab5049a3573a2a35d8ea9054d93b1eaf311fb5e4856e2258628251cd1b106ce1f32ae5e210a15b9f7738b5890dd208487fff1a8778885a1ccd0b3d67bd39c6e13373d4067be3c24bb5fa37e4128f43a062b674731963fb6b4416df729034eb1f3520cc96d3537fa9733c103451144d8aeaba6aa5e612a79bb22807a382e7f676dcbd647d862bcacd0afba46af3576bc2629a7f3a59d7754d129868ae712c28d1bbd569d8f44ed80c667516b748213258b5bc1b0460961513af1154d3d07e8f69900aced4518987f431ddf18685d55ddb9f7d3c2ab7da647ae13f7eab10e26a60d937f617faac46dcd3754f984e0a39971da23f948e93cced721a5e47a374566477964510866931f0fa73327beb7e594b255efc59f792fc94e2668514e95ad3a3817afe52739821bced5215f9671625180163de5bcaa2c3b72877811a2100a1b2817238d5581925badedb2ecd555b1685b56042aaa5b089ec413b8bf868ec6fcfb0c13958df21b8863486e0d99fc19f0341eef60fc03cb5a3f5e80e6902f811c53ba4d62a564576bc2f8bea2d197d03ebf4431486285e641ca4765ed539c5481314cd03c29acfa1a88f064a0ceb95c41b3f6166d90b532bd60adfc08e61e64cf030ddd2bb3553c711afd61196bbe48a3031e834ad80e617e8e24df6d643b2f853b1fade0d92bfe0836210f116eb98674e3d9090b88734d2bd1e0f203d7c7eb694df5f33a03995932b1a44b78a9d6dee15d986cdba4b080fca168015a08e8dece7a83d6fa5f542df5cedcb524898d476db1395ab24d803bf0b6f69d4f764b31a5291a4fae768be6cdb6a4e3347b43e6d7c925126d676384c5cc3c371925817ac6b0ecac5cfc9ba91c6ea9e999d889e4d18beaaa04b56f1d937abd241c3c1432377c5bb01c4babaaca30d32a4dda80853c808bb0c4772f4c176e932b6e869f8776871fc01166af24ce23ccae7b2ce4d1eb64764bd84e696e07d862cc805f394f68dcdfa69f7387f1cf2b74145fc1bae640ce1c202cd12731ec7baf04f45d108e52ea5911b667ae692c90d1eca0d4565bac83b7cf1c14620a2d737fa09f1a3e7c904725b4df9bd00d048cc76d11dea3363568eeecc0b16640edb1bc0587668d63eebf9e0360b75fc774e388a9057c44c112e1517ae2e2594d84b5b09c3606a19f82d173733dac99b526fdd6e0a73d5f95e455caff8a72c3d74b727ca67ee1ffb6e232a05c79b100a9456d081a5c5953a1f1197ef7ea734532252f7c062facbc03", "5263", 3, -746429655, "6f99bb536d5b77b8ee2ae45fd53f85bb582da6cbf09c61ac09ecc27abfa4596a"], + ["030000807082c40304b60c093f603e9edb1a896db4d10bf05c831cbc5b3795f8c056b391107764c87d00000000046a000052ffffffffb7f4bd4b02d485f07c42da7347e7604dafa2cdd8e47bca9d3bc855039311959a0200000004525163acffffffffdcbcb64448037bc6023cc4faa99902ecf889ed1b562c10b93b7fcd2ef78478c703000000086aac006353006563ffffffff1c6ecfbce32b48538846ff29c9def794ee49dc77f5cefa5bf9a6ef84a7d4fff1010000000163df7980c6025840be00000000000353acaccbfa570200000000055165525153db2bbfa70000000003cd2dfe0300000000000000000000000006a3c888c6d0eb21d6ccb86383b29ff1d0aa510669309eeb69104129aff4e593686a326bed131e6cf5309ae495d10df98fbd06af0faf92a26c526b5706efc9dc077653052ed873915e0f4acb3513c11837a7d74681f5d8aba13aaee1cc77e2c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000199caa7a6787803e041cb418976b8614c5a1f0cfbc853b6b8738822af71a588fbf111828d0c6ea60bd296cb698999d649381f8b1f8afa3417ee3f33b3501cc121deababf1077de9ab0efb170870d1ce40bfe86f46b3da58fa3f8451db9ab91b952cb13e5a9ec6bc05db1cfd73163067d3324965bc3dcf54883d3975f50aadd540202123d65484a088701322d20321ad508d05068935ff0368dd437e21d574c64220228f2bc7cd04959753edb6fb9e4d70157b47fae4ee4a530b7caf59ef9462c164b0a05f705a1f9d5c46966082082d95038a84942ff7f2bd1377640b7790c760760c23517b4d3c3ee217caea065cf104b150256d4e781eab7515e0c05cc8eb06b7f840314990f40334da59ca9681b876ad8fba55db8276d2bf5142aaa2b01137c8aaf820223825d96a75b207f1086a5d7dd5c8d42c4c496d62305734c35c1e903a0ec3e670206c618e0caef5b1a16b890a766bb10c7ced9896bb2e1321f51aa1fbcbfe5fd32022ced51a7e8d8132cf065d2dd1030cead0ee2c25ad941358205a141c6bfa58a0d0306fa68dee89adb254a2deebe7cf397dd0290886b5a7301a64bf3b66c2cb7fa865bce6a014e8e35db3c2979d00f68f40286ae6718950023f491f6967ece8eae9e8d12cb57a087e3dd11b3994f7c6805592952a4abc881a5635b55e3a23266243d2f1608a8d8ff02284405a1f874908e448c7ab9f23f9b15effb430733e7b5cfa747c1c967cb8b37c1b922b86b9ff9358acfa65f15ea252cf910b4ba9038314ce189c00f87f3efd5b031c1e8990d7a5b001870b62df4f9595efab948643985019d7610bac062180d331d38835d5f5fe775a3ca358a5577eac018a66654b855814b293d9ce64e003d6ff56918bcb08835641c43ee80cc99fd101429bacf5ba734dafd22e7ffa29e4c30d65fa8c76e954780c5ce07e82d2b22aa07a05506999a8bd0797c5c70b9ee59886d100b9bbaa31df5c2f1a624870cc514001cc27a52a7f586482176a3b1f95f1aaa6a2965490981c39675c2afc616462d969727fe8a04be4177ace4303c454aaf3079786a1a081fd9ead100721ea5443f3546855d28d32cf92380c5b517203e1757b01e938cc2ab82b0640318228225fd4ae737857c31e7dbae1d22714f26f16b6e5b0f2f6f49530a75cc5240e79d7a748962f63a052637de7d9f0bccac3d541c0609bda026b5ef50b53e2d19f0230861eb12c5136e7cbdc663d3b05bf05c980caaafdfd6a091bfc27aa198abd154751171c51130c4b594e0ca287b2b402a60883f04097c4512efe576d63a09195294bbce660bb96b56ad5ba1066ec12839f3daf275e1cc20d3749219ab562dafdff14354a3d0da5f1bd6c1e3aa44e641370da79cd4d2b6cf69cb7fc3473d8ff6a54731e619f158077401fe0721b34f4622c39db6811a798101a24b455335cdadc91992b1c1f7b36f20d8e630c76d2aa46a400dc35059723c66406590578488cf8c6d554b952a03701f0fcce8f143cf246b5515dc443752084d0467fb04210aed5eb5724e0d593f0c4a142aa75f4bb469dc8105cbef49da8a4574109bbb7ee60f853d23a51a9a52779e3eceb4fdc02582587457036312738c628c021b3a3b030fdcbc0b79d2f1edfaa99f54526257fcb7798a81f9eccedfaf30aa03e52e30eba5ac5a6f3ba0bcf6f27bef229f77e7b5b4f3f99138e8a414c01c6858a3da0ad151152eff781b33bb49276d00d2230c44ffc9d0a55e704f5383a6e2a74c7d6146b8ad1238f11c7563eadde4a7b20f6607ded62b89a3bcb3dc043ed0182a1145341c01eb67734d073fbcfcd2e74d647bf8dc318076b6ba2d1e489bb0564cb9cc0651fa38fbea1f7967eea4f1cca19767bbee64a530a97fbbbcf3b78e575f77903283fcb043b219881c5e72e5209dd193caaf703885fce5c128f23f71a0bd779c52f335e6dd5f1248be71e415946c8ff6381e7d32254f0e366832d647700263a47f23f4bb15b318ece087c5d18df919a2586738f60ae46592fe32bd268bed4242289a61570caa734061d3feb7c22e80c15f6bda0a80fba7646f5cb305160ff2d533bc098325aaa4461029cbc8f734cfe5419091f2baaecd4876305bbe1f04d0047d203a00e1dd1c65b0ef08de279c264ba4ff9afe968ece2c83a7eda6a291db3d62b1afea63e6cbdb21c851dcefec5c0012d3d1ca81a2f63ef7da40a5275f281b851524cbb71b188fc931db35d0ac8f09e8c2a2d5fda530543ac8ca56508e8c0ad043fd6e7758739b938f5433a930d1ccb7a9e8d510f27b5a36e2d4811c5eee000000000000000063332a040000000010dc5ce5f159cb99db2cb1200855241fd2f100ddd91c32325c5c4fa11500c8817cf0032209f14c2b5dcea7c5362ead8cb34b051a57af45120d25518c73eeff6e5d1c55098839f440cfb0320cfb40d475b6ab9ada87d523f8e4c75f0927ea77a500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000675730d015f7e490c9f985fe8bedbe7b783a51ad492c87d909887cfadc1e07a59f822768ab26a0b92a8f670c181650921a50c79fb56fd41f6e5822927fba5900b967bee0c9e61cc8594b812e372b23b3590879d592e50c60c5f6a36763bea1798b5fb8d00c69f48786ada5a57b75549a0b41aba8b8edc7a3aa8f442746b46ab603122c5f82c243e600c8e1d6faea74fad7eef5965d1d8b8aa3396e9c52697e270d032c2ab4bb4d9888c591d7f6d49c09bcd66d332eeb4503e2dc4f00ebe3640a14800a020e4578ff93aaf2c520f6841f2c33b1365e0f5c4048f230f25144aa0e4ac566886977e93a54409c93bca189b9cf00c1caf4bff74e8e2a9f9541baedd20a651c031e0b678df853d588f76cf24c5646929da676f44dff622fdd09b64f6b90f6374203252eb5b19eaf3931ae69d3f1ea7c2c78a3c3aef327d75a95bc8ac19896422db0020a6f04a10f2c15b02d7347e22eea5c22e701445eb5cd63a67f02ea693225377d02163fa9f1d21b32fc8111aeccb84ae0ab0b14f9abf35dafc1e9151496208082ca0325a0fec48a8308efb7493badd2d523877efb9ac545d04477a6f5dc1cfc24ed2651ffb3be0605945b85b73387c1a651e2b4f2a817d6577d2353e239509762657ccc4689956be515e62febc4aee2fea86045401fba801507f88c7ab12dd74599dc4c352870eb1a69feed507a1c35cd08b244000bb8dedc79d1b2c9e959be2f1c64ce27a298e62b35b5905be59269b8d1342420e5590d7119a7fa217f7fdc2587fc6cc4769addc60eeb16151af32f5e79d801383eeae58f18bb9d946938fd1ca318de363407679c3f9144845fcf34c920b6635fc7cb2d630fa4d69fb9783b4696639d6963544baf9a54fd7c203af7b936efb266a5de0e9bfd311a68362285e03576b0f2af60f0ea980675c150b733be0a3e93a84d133409f6bccb5060493c9bbd6a240f4dc2f52ebcbd1753a9f85895c443a462dab0f1f7a4e44d27103b93cb461fc4fe176156f5ba6f40c38dda8ee80418a8553234379462aa2d6846a1d36efa094e2c1f8bd28d04d468f59dc2913b9776fee270e0cbb924dddfaae3ded5720c5fbb68a2cea017b9fd314ac434121e3899b75e801d5b4819a3e0dab3b5fda9a3ea788b2fb15904211bf3a0501a242e2cdad0cea21ffcc5e61d61bbc42e4584f8b870b51a5205f61e628f51b5a88f2e69762e2522aa7001a64f9ac5928a68e88869076f39e099bb65d0a62c09a282f94c8864d730e360d73eafecdda11d943e71723e8db1b389bb4cd296d2a1e5dc2b7201b27969d32077a2dbd3eeafacde71f2b00618a301213c4ce42a5ec5001cc9fd45775a17878972aa1387aad5f4999628cc37a3a39a85defcf6c90818a603f3209190df8edc4aca28b94783cb45778fc9a0ffbfa57cb2e340cd6f32947971fb1af371a60ebd12fa592da57be6e9e050b87198a2023ff157f6b24e5a50abb5c39a8b3fe17ac557b16846b94adddb8969698aee1c34106f28214f566c32a00a05ab03c228f606a43e95f76565424187151b83dc8b997f0d3ee91c8170e3b087d5d5ec15ce28d912afad1e3ab4b526cd84e1240c32a968aa49c48fcba261acbf5be2951d3e1eb45907e4f5a0a5d06912f8d416aeaf3ae48633e78ffeaeb130c30a12e8ec7f53f5698ddd6317e2dbaa0bb0a2ccd4c388374c12bea6050e8ca2af16e28b749bce88ec89952ffa1238fbac08e2693afe72f9a6562ce3e22cb9f72785c92721fe7147250b98c3a3b25053b2f19f0324cbc43fb99d8ef5fbfd832ca31f175cfa9aba9927c8f1de22d6405f14c11e9a3c2bf7b97ad80f6c8a2539bbd2f923eb003b18281c1998d13dbabc7dcaf87cdcb4a21c0b9a728f0920253b54d3655418a9eacaef49bc534cbc2035509107cc5519be6a9b81a90c1886994d5e5b7fbb9c5bcf1577ae2dee68b8a61d5c2f7ca18550d43f4d58c747a8e2c011167406097578ad26419d30f2dba8785d6062b3ab11614e565134663c0ddd73021c10aba06ec977dbd48de10530f86e912e613a95aac8ae9b6f911390fae38bcd2a1a01908bd784f290bdefc0aab6ad396056d1b844ef6971095d9f161bf26e9e6f10ba44252f48a44b08ab1c304a3e0dc9d20e383825cf04b30a94cd05f6ef9a7a416af2ba473cb978051bea1546828787c4385364618988ed6a8c6655dadd711d62c52ca2b59374f5467ff3c4438aabf4a5c46513960a6bd2869173ed9a21f8ed3b4435ddb61f9f63594d07aa1d8ba764a65f1c620077fdc2f8a5fdcbbb60831876f4541d528a00000000000000006a1c720300000000ed3587de8d6ca4dc914f428be6bdbb714c6170e8299bc11b00cd4fb5208728bab9467679828dce5decd8f5aa75723a151001530ec9863efbcc27d5ed18ba4e09c66dd535c734112a1e58880249620fdc4148f3888931db4671a6b8070b0f729e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004567483e3ff4d741260328dc9a855754a9bd09bc1270544693a04d7bcca2c43d8b30220fb0ae33d6eb8b18199b2ded5578ff64804b9b41ded9c676bb886d900235815bc7e6a1e9bd78fc76f7f132828fd3723cf00d9191018b6f3737b6e25e79ce96efa0bfdd69036e98bcebf07e0ee808cfcf2f0109973c8b5215f86f3725060208a7031b64a55fa00e4439a0f0d356b204a10101a79345ecec6ea6c820d451c60210d4b01d427c6a4cdab4155aa433b4b243cd337a47042839ab8b0c0023575cb00a002e4242aea135931e68ba054c6b9e8e02eb4f8725387ae4dd1e80ba10bae601087a8b251817a8f3ce43bcc7af350493233458ec60b4698650c49c16a01ee0d90317f3f97e11bfe89a895b800e292866297539f7eabea29cefaf269ae302564fc0030d20293a0babbc91ac6fc285c5cab17fe105f68491fd687ac7a90755f1725e25032b84d9949a7559029ad87cb23edfe35939270fe595e45b8cb4cba8780ec3b50f0319cf62ebd5bf5d3fa3858d980f29e8543b3029645389a15eaa015c65ea210f24032f55a3b33c0c3babc0d70124bb9bfc5db18237c8ac348a057830d5df1fa3be75ef7478fddda8f1c75d4a556a9c6f79762a264a703c03048c4dba275a391251bea7df94b58071b99793989c30b2bee5db6b6383501943a563cd416acb5f5ddfa4cc2d2cd0582968ebdad8c5b58a7124780fb58eb1e4cc556cdcb6c842c34f41211e91ad26726b38cd3963d9e1034fa55d6147a63e15b81ac7b5825a3f45102a957e506c907fdffcef17a8d00a0edebd759792620c6e2daa745df18f805356cb90d9e022f9ea23ae87b9b075768ad710a4d48a22b380d4a98169a27e826b95bfde5250df3a1093cf5c6c435cc6973285a8933215ddafdbb1b1faf946725d5afba3cfd889ca42f30488d8ef0cd35f76223352cfaa2bec6294a8fb604de126a86b697257b57739b83f0c67923f27d7ebc071ee3522eef7f0c2ee8f7f0014d7e9987bf271a0004baa61b46920839526a50451d12244d6b4784bcd7e772efbc0dc30276dfbf612fc8dab085d124e4b44a469f952debf8d93288b234e413257d39e7e97a8521ac564ffdab2cbe349123eaf4a41d0291e748329bffa8166c512d6ef4012dd0fd57fb6051e62ea271b190f3586a8de63457f13bb3cc19400843c7986e7c2ba353370eb777d6926635c325859aee3c8668ccf40407664b9ede867898b51d21e15e1a1abb673649e2c2419fc089d1f66b072dd38a6a5fdaa118c8064bdb0170ec7113b0668a682be44a37676d621c48d53b5c037e096899ba95f61e65cf613a6eca52de75595b7bc15a199682a0a102d26f2e2857eb38e22e855ce93f01d3721050df800211a69185385790301ed95a6741e3f1bc4695577ebdfada03d02097dfac5d7b79465b6b3c37344912cd0873d2f81a512d3bbfc4f0775561e15c9da004af387495a22be734e358c275c9af2cfa97e069c7f357e93b6a3f2be80b28c5d0cb1af8102c2e8c66c7faaaccbf242273115823792445cc8fde0a970b5b763813af58ef5c965b50d6c0111b1954344b6ab5aa9711861f6ede5b94711c89d0676e766163e2954aadb6c7877abb46ac4537738b40dfe90db18e3938a54b425f3781a9372547502da85dfeb58499e77087b7ae3395c430876c29fd0bc84fb40a31914e89433155767cd1524a3bf1956f967b8a07351fe2ba3cb5bad6f55373930715424c7f4e26b17a80d67a77a8ebd9f9d48b5a1b1c74906aa4dd83b52003d1f2823b16c013b65c1cec42c7f7313aabfe00d6f1159c13e7f6e6d88acf8d071d790640a78e375a1423d914833f49e5f5b420817cb4fa5c366bba1888a0bd7e61d7efc6c3343471c80124b38ae84895c2b7000c11bac3539d30718d6ef7eb836aac6b4c01eed3996fe086f190e3d7f704a2d1c7627dd7cfb66419a6508739989ee75ccde743cbe7c1b2638c6f64cab94ced0fcb5a0d2a11a6818a08f548b9e75f2c0c2b2a04314e461589fcdf51271f404944092470f31f992cb9163f1932237e7e91a37eeed7a48502a1013dd3bdd90aaf97ee7c35bab5ebb289d499d5b3e52f019695e8f771f55adbb23ae1298281e59f65423ec300b54fc3ee41b808c52fc41fe0310aad0b189df49d09481c2bd261942882484047649bdcfbbb2c6a33532cd0de84869899f5e25e212d0734eedce439a2b4154396cbd6dad846dc3d28461f8ffb94c9220d929c2897d904b2676c2b65b5b64bacd5ea331763ce5a60c2c47ba3a85717b0b7a6fe68c1efeda99a64cadca22035e72d7c8e8431a558334a1fcf6329c37a47ac0722aee47dc2b59fe1c49307879cda803bd1b29a4b48fe7c49b38072d47b43c77b8e3e8b077d8aa7a5149ea9552300aa6dc0837e07bae14fdbb9ac9d03a96fbf4c2d79636670123f788bb4703", "51ac51636352", 0, 258374368, "738388f5c1375e289f2cd7d2107cda9805ac921b7bcad487f10865ebf3216f16"], + ["030000807082c403016e8ad4120cccc3c4bfdfd47072bf6d9314771bbeebfbc75d70b565107fcfd0a203000000056a6352655223290644026dc19a00000000000151deafc801000000000852535365656552ac000000000000000002243952010000000000000000000000005de4539953b60ce1c56d12d4823a220a849840702a33cf88160f0822fc0993073ad8c1a149be8cbc2856cd843f23781f5dcd4eb9d3945f46ad7dde575fa13af05e77c9eb3d30600a7b31442ca6ea084f7246df3231e592b42f0c270b226a1457000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006724ef3f737caf748a4fa0e30e49a3a56144ccb85a82888e615c1fbabea0161634b39376322a9c7870e49eb591dfdd020e5176ece6b9afda4eac9b22faa191e3bd81b524863d528c99cd9db365a882e6e2bc44650fea4ce1bc50818199fab7f948c64b8f00d82af9fb085b930d5334b83a30ee34e8975f9d54729cbef3c7eee902296d5e2f997bf18d0aa0ccd13e52e035351fa864cad244a9adf94ae82aaee0350207aa9a6a77b9c66b8608d76fc7387e969aa9667b465e5245207fd4ba594478c20b06e0a3c6d3cc28f0d7dc90e90bbb8852b5c90bca5e658930bf33d9c77fc4201a5f72e10493a97c36a010b86bab7938835a6ea04be59c8a5ae7f2e23e1291d87e0229e31f6caa753d272b7af371d0d5ed99b45a0e7dfd98c97cdbd9feef6b9a33f4020ad95ff2033bd1f8f34ec65ed0d2c55d4a31e88b070652f0c2e02e1a011f6a9202058d1047f6577eecd90d117125115d18534d2423591241663df084d05065ca720326f29ebb36b50b4f895099fdc7739594b1bf89742466601bd0ffca9c9810d096020d290f005eb6e94a6f5886f1427dc8d1a06e2e5b20c1506c1dffce01bdff6acb37af4bf15ffeaa9ec9c03f05749228d97e1949696cd8e42111dd388dfda44f9dbed8d117952569b29bd665b54d09d8d9f3e72cac0051abd86ae27c618fcfd961c4ca7670d14ddf876cce2054302cfa23904899a8edb8cef351a759b597dacd8b5399edac3e7c58b1ebf3edf1cc1c7b0fe9747e7f6f693ce72c65a5991cdbe2d2b1b94284d9fa7d283725d39c3f27491141432c719a2a18fff3b1b8a3cfef4f79a624268b3cdc3b26cf89c8c8cae52d14dc402cff4ede31330065ba45d6df6cba0b01845e9b3a2100f10b1eeee2112251660e63b877c3410d2ae6142908b9da2497737b5a1852b6c56cf1f17b278da66d2c27d647069c0fed4ab5c6d2aefab9c8ff65e4989e9867c199fe92c72ed3518adf461d6ff4eafac39fc36eebfd6fef68197a784a707b0f2818981e4f2b82bd1311545b6d2bc8f6f148a515359fc02c44645985567f6ad567643ff8eb4e96790424a863888415f60dd104cbd43b30189b1f5848cb597fbe297f209127e4fb1ffe19733da14b9d0f66bb8b0b90f689b0c6ba127ccdda22e0917cf24b62d166a6e41992b4d7c423f0de55fceff13ab2a3cc72644f607c79b0aa20ffd175d83ad7570466e10caf382f4d3647619067f861899a990e1a85f5f6b874b4e567f37f118753b704069423c195a5c97770b2ab33cc3b2350a2acd268f6fcf3afffa845df020cb0a151151347e1472956fef496dbf39d817c3dae25cd3b76576aa3b0aa30c0a026c92b6d896835600982550a0239c6820736992aef764b473861a0e2cc492a727e650f89591ac6a540b3a8a6a674baa37f6be41d6a06bf52a7490cd9ec3687c74b89512109be45bb7f6bb8a6d8ed86b5333b29003f098cb958e110e940e0cec4b91a09163428fbaa0390b8dbdc4f642023a262beb78812828fe82ed53334a3da168f99b77a326ef135a6f387ab99db5e198f1955e506531b42f7eb6cef9b658da7dd0a2131b88b482fa4447e8362d83344cd0e7f8b129407f627bdc182aeb0b8fd62a9e05aafbe2271aae5f96713e5e88a98f761d83ca945390e090a1505be504b691a1825dd0af27e9da527fac6085442f20605ab18f12f155c73405eed18dc135d1fe6d6cea3337dcf2bee7f4508e1b1b8577ab0790ad69da3929da48c30b725012d022358d5aaf5ff5831952a49dc1e9b927b8d8691ffc09784ea8129a4e756d0d32cfdfdc187016c370af4769fe83569fc42a40d57d5e19663085f04d454a13969d8d7f237472e45a75daac3391bf19bfb1c605a7f9abefb3c2bd8b8c1fb7b2c5878d0bfd9a8f63ee260187ed3b1592261b9ed3851514e83cf4a1aaf08a50cd87e1209dba779b423dc76bf3c9f2669263163f3026b493dc04510399dcd30198947638a585832b4d0fb628c4ed217823d8223784df326057382dda5e2dcb2d4a56294a63d904d4611c4b03a45ab50e8de9ad3cd7270a6e79f79e232bfd50c0207279d28ee868641ae8e8e74ee22c0de001f85a65079b62ee1742c67ab28a692a84bfcdc4bba9525387aad6e3157c3d5f516cb9965d6e0ddb910c9bf2260e803b1d23a2de4d45c3e1bde8f0dcd202155d392935a873c8b20302d0521c3499885d7d7d653a9d88d3ab43b1121b077afbdef238da2d8c6ba4d223f84707871a77eccb78fda436f2e978da90e95177fe6cb4f060c4b80cb1e8a040cc790bd23f0a70000000000000000f830c90500000000c38efc7f709033ed0654778dd15e1417a4f4b4ed5633380a7497d7856b6ad6fe7ef0a63e77e1cc396e133832dbe5b37e6499620dfd6acc9bc9caa468b13ed075abd1446841048502c3d9a8dd967a3a9090aa9adaf08cf88777deac06fd705339000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c086afd97818983274a13be176f55f6ef6eb887af07bfa157cd72e6fc86f1bdea0f539f112ec8f69186f7fd10a6df842b8fffff9f4a78ef8b2268a8c82c9c73b728072d61c3fcbf382025690b89cb25168ab5ad2d10dbc976c8f4e15e5437ab2a877fb95b371f5bd5e864d325abc8922dfede3f39416ad26f71e302f24fa8c202037f7d64b31ddc4746273bd3ee9130431917b6ed872c6702872dde89e5a702fa020da441e21a747249d496d42d94fb1de994a326d1789ccd480037e72452b65f4d0b02e6a7e63d9722b7bab8e5817564a069c888f5ba8a1dc6cacc9b7ce20b6fe5bcbd7662e5ace563a1706fe95a5a518b0697523ecad7255fc1b62a7d14427f4a56022e1eca7a0a95f687acfe434c60e5c9032c6df925e4d7caf074d160db206526e2032ac2bd8ca1a314700af71c0873900db79fb94cda16d141f7efec268a0fb6fca3021674957572cd869c5284114d19346cdefa34f28572bdd3369c48962405ea05840303ca10d4bc50c7ec7b28ca8361bc63b837f126572256a1ea2988c94455dc5330022e6444bd7ae08ea255cc1345ed47fdda433a2e7777b2b40e7cb43e958f93668063cf5ba8b4d3ea2d9ee22a003d82b6565f1dee075cd14e883029dd0ae271fb80000760fd98009e888f743f02a2d5b26390ea8b0bd071fe75048f023e052eecb2ab2f877d89ff27ce47f6696b9bd232f3114cb2259c1d399cc073d761a608f7ddb1fb1901339d1e4359a9f8f4985d244f412400de1bef48c898d7a0c6ecc9b3be18b26f19f5e8453cb7d36a8c33def0516ec51f3512332b65d3b4229a3230ffa2ac5fdd692f96457e575f1f8a60613912f281d1312674cd34afd768a255badaecf2192e7f5f3ac00bce7d380aef02ad1a6af788823f44d5825a90b1ddd346ae56221adb5433616b0af864864c82e9711fc2e83465d3359c14ed758d0767df0008a5ff4a81bd332372a2980f785533d55720cfc3a4e5351a918abfee93ac4f884a61fc950b380b51531d7a89ea74bc980cbea4a8b32403333d0addd9d5fe90193bf602bf2edb73ae27cf56485dcc8ce6eff122aeeacf65950fd6d7f33b177fac838b6594fe563ec889787a482422f432c86051414a39c15573f7457fd45d6d1746038f8dc3b4554f28c82b73571f8ec22d6082ed4cdf03ecac3b2ff91cf5853dce06df954a7225b6321607330785671915fde1831c511bb41d5b9d08f8d01569b1b7f513bd3366647487e1ba949fec9530af572f8149d8d8f9328a6d98047bbba09bc6749f66c5a63f043271bf025f487f1c70295a09b307e1ee2ca34d93bd90663f223af06b12cfc1fe321ddbd6686a7e3162a107c4377176813c13748705ee9df1caee98ef0640d519fcabf634c3307405c93da5183407e2869c1bff4ef158f844781f9d83001f06415cf99dc9b55c8455dafffe63359fb68260d866c7898e1b52ddd39291aaaaf020b720d45e52ebba371e2aaa5a4b1b305c9cd3fba55fd66d954a5d2b4e683b1c91f5a144a2bf7c364c094489ad527f63aed8b57bd4c8af94ba2bde155ccd75f9f3509f603152e20184bd406b11df90ca22bd2f3c6c9dd885b7ea561fe58e5c665ebded78cc8b805ab37862cca84e1e7c155c75f236dcf99124921f41345a667071bb74abfb0024e79291c431ba67d139b482c5c35e6cb1b7cfe513b45c2213d4a4b7ea2bcb35820aaf2bdef28d3c072959aa69ff6e9277ff2bda40c68630ea2dcea57619784ee685e63827fd1929e5407a9aa7d91ac98b4ab2b2a4b01587ecc5915540b6c0ef720ecd586632f76f9c23116fd14f775752075ba09d000eba923e20654c050505c4359f22ac5214c2b1400ff8fbf0bc8393c83a33dee61d135e7f32cd1b8d8f646c0b5574215fa694498f6ba0d6e1ea298aac759b64061acc5c544644b5bedcfaf2af56b61757d86ea59e5247a31d0554d8eb4b9a7f81891b66500c1d4c3a94869992eca557539c4cb817c455856173d8dd9dbd12fecc75dbaba0ac315e0de8199b64c332dea47ea2078a76f46ab388f48a59771f6a156b678ca899071b3bde1bbca1a3a155413885f320596def78affbc1cda95f713c68fea259718ed2471212868aed8f80aa6f6ea9f65010b3e260bc7be176cd15528f5a507a8f98b25c7fb325b7c7046e77a9ce47ec6305685ad9e5c238e27591751506f3a4877a6cab3459d3b1f96beeb2dd41a27e99c58b30034233d0bd2622198ca3295e8cb4c2658e7a5ab92f20b3045e0b098c7c8f893980492b152b788206f716ff97497d94bc60ae7f4ed5f2403233891618bbfa0d7d986e944399866d14724bd1afc1844678d0efa95c5139851b9779e72d4f8b62b84d8a339575c0180525e06126f44d2fe3b12eed21f34841384e48745001d99156693cc09c89ed59eaaabac3f2ab940f7a5bf62dbd3f02", "acac65", 0, 1638029704, "732f2ba4353434cab5cbd3d148976e9f5ae98e625ab38863f7a7258174f0a67c"], + ["030000807082c4030221e527dd73c6cabad23aa7872275a6f69fd8d20f7d038dbf3976be3e17cae7bd01000000046a535153cfc50240ce96177cc07aad4f9a7684aaf4a40bc56db55fc8d0b19a17678726874a062de80100000008656a6563525352537160f9ea02271798000000000002005272968b0500000000035200656a72f009e7befc1100", "6500", 0, 1103634089, "533760c3c8451b313ab37f1eba4f8732761585a795d451cb16e68ad3e02152eb"], + ["030000807082c4030219834c6608d5a01c307783ce02ce6368efb6bb9cf1dd595ef8b847f00f50af7e01000000086aac006a51635251b34dd25b540ef16b9cac1646781328c7f293a571bfc33107e090a0b9c93255451e50910c020000000653ac63acac53ffffffff01d8fe290200000000016a00000000890ec10b03c9f4a6030000000000000000000000008f8390d47df31f839175ab32465f60a7de7c5aaec7ea05b3f0027728da0578b08debbfa132b411879f4790b684dbe0f81bf4c39bc3800a7ff06d6451d771a643c7c218bba8675922f7208455aee53f434717d47289eab57a9f1f67990c9aed1700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fef06419449a58c09098b8cb260a9368b5eb3a2a3335e624fe2f4d22b063dbccd4e8b80ce218b9f8c9fd454fec181ccb950d4825f958573d3f5d7863c6a5b56b7c8da1c08536846dd2e6fdcebc0469b941444bc890745d208680b862c9565cfec25a541fc68ff65c9a1e4cff28cbf217e1e12d19da40440dde41fc60372b796c0226c7205aaaaafe84a36460540a0a6a8a60f5de2c7e97fea9a37c4be437453af5020b3c0bf802ed458e919a0bd10b0bd174dd797444874837c41ce63e19cfd21fe10a075df75c3b8eb6dac0fab14b8a8122262baed32ad3ae628f241e4b318e1dc0953ea6c868351aab3be82cfd4f5a556d52544563f32f6c208918e25caab674d882022b36fdfb172e2f9b51217dfe66aa82ef978ad23aa0c9ee5e78d43ad8a9067f93030a5dc164a2059b84b1bb01dcb7b36e53a3b8e23bd850a52bda75cda1dd7a9336030e9b95a895916421839f4196673b400c807e856205813b3d463ebd8ccf2bd70802121d059b8a91c9fa15b17ce0452a0a5d0115dea6664a31ebcd279cd2f0cdfe0603004c68d3e705e0bb9e0b82b2dd4b65e3029f8f808464f1a962a89ac797d52639e04a8ebbfb4a4b8d60f16d1353cf9e1eb7622bda7d8f3d33b64870339db2994b084194d8404a51dd50abfe0e60e1895ca7881fcb4883ba5676835c3d0b013074e64022dabab2cdf57c83e925713b9a480df31c48d786bab4d42905bc461520b6484b4c3cc9201237e1a5c77072a3567b001b960ab426ebcdbbac8998cd0ad00b74c1e41110aa07934fe57d83e2dd3b7486342af1c9a257995a1abfc563a8f8735a743095d5232596125d01a68ee54dce6152ea53d34d4dfc72845817597821588c4d8df59d306744e399fa3391ca6426ef5eb9d82e1c829209bbf96822e17a393e5df4d8100404e9500ef96e339020abee03e4e0c682ca56d128ee52373c7cb32f5dc8105536e3419dc67ae237509ed1500c1228b69a2d312b9fcfb564d53cb8cfb64517092993fcf1fbd0806ca5a90eadd542bd1fac8d7a0cb8def23754ffbc541b34ec69a7c0230d4bf9325755239799120c496ac2da7d445052d1206207f4e3f0ef4de13739b3ea675793d806c1ba3438aa7adb4f2ea2bbb8809a4636f33a4748ea41668e97b837880460b4caa2e5fe5ba0744f7ce5ea8b11491c41f3d3fecc8a8e9bf8aea01a66bbe8a37d679bb5c66dfcf458b719f36f791e1c6d16a7959b3dc2d201bbceac19da3df752fc3ddb4fadad10c93132e116f5275bfc041fc4a63c118b0e1c013cc1e94840110d038a5caa5f0dc2b7516f0c26030f939b28ca1a1387b6478b7a14ae369639077035d3a71c26cb897f0efde8e92acc9b778829769a82ba491f1050f03a3abf3982d375b74b8a14f42c2ce4f199d2abf86f5f840ec88c1fc61dce8ad8ea06c900304b1770dc5a6580a4af8d301d86d3340eec3bfeaa158c607c10a01ce774b2c715a43e28d6d0f5e2226114e66abf57f9768f6f9a508b6d1836e3f58e010389699c3030be88560edb4e8fd2b8109f800092b72a9af068f9db59ce418a96ea438c95c60d3672e531d705985402d6dc0d88140a5804efd84da18762a09a515fca6ddfa4bf6d7cc89541d15b449177176aeeaec0092d0245d7a8266e50d491c5257c653b6e5dfaedde68200917eee554272652dbe4292f2fc1dbbcb42c7c76124dccbe5a6f9313e48f631b5a0927fd6442b107e0c9f88c389f306f0f73000d0f4d62880b2bbfaeced868edea92597d029ba474b10c7aa2480d51381f22f49ed1fa6431830a4529d620b700ddee46d4a7c4d01e204ece67a296638dad89085ae865c7f87b26b8712b5aa77633f7b68b1800fc9688772dd1c31d7a9952b910ea69d983ad8ded7382257064c25dcd4632076b2d62217b04b162d3de3f6f1f3fb22fd88d0641d5547f5fa2d0d20152566109f989c39264413fe309ff8b9149901ecf5b0f1e92be365297bdc15373a5195267bf616b2cdbff34c034302b2cbebcb233f7f7438a49acff061012800f529bc45cafb37712d94fca8a6bc2bbc5b2fd10cbd7ccc4c79aeb807297c0c09d0d6eef118ad777c00c2a56c0e3372957ac15a6b4818b3b362611b9759eb3061502dd4664c4ebae6b41ef7c01faa413a3c7a842a09118307bb28d660cb53d95b6814a6c3ea12bd474ed6dbad8bbb95309535ff9208968cf88b14c0c0109f87d2dab12912756da645bf2928e263e7f70cecbcdaec1a35e377442609cb272fb54e9eaf92ff8acf6cb6975d87d5acc047ab23aabb153aa150ce7c8218200000000000000006bc3c700000000009d299faa278df1f85da5c5411fea9728daec64ea2be54fae635dff42e5a5d9a9a36c078903f5428a88c6b863acfc508b20a8f769ad72cc60ec2bd8af895369ac522cca3171ced77f3cbdd9700adb7b6a0bbac7542ccaf4ebab69084ee7012018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bdc36bf21e3205b1f0eb49e08886bc3bcf8d3267b9599c6d8cdd55f5fcb5d4ea66a10e5036010c1174bfac289364df8c7b157401a65037fcfd0c4e2523364c1032be2570d1e392c4f3587deaf384cb12f5d4fdfe14baf5e4edab035e3960d011cddb20099990000d3aff439b877ca61ee6c1ace32e5c1925e4f7a3e089fbf9803201746d96be3bee9d6c4c8b0a050e3215b4b87992c2c32e98040e66b59579194021aa15b807a75d8000816bd4387343397b804f81e81d2eac802f31d1869d3bf8b0a00248ff5d8dbdbc18c749b9055b5400b8111de79c50bc8f724b9949a32fa50864548e1566726c4fd49ad723d760475258cd99effb86d4d3d8598c1cc59ab2158031e2687797268d3961bf972d502f657460463faaedfa31fb64a6a6cc6fa0c3c6d031c8d101b5e5bbdb26285c8720c850b8e35d342fba77c2df4bd33e99fe884cbfb02201b9926e19c7d483e7abe7067dd3bb373dce6a2fed5f9988d7ac683efc4c0d103277f1d07157b10f8166ab39cdb3443a090173b7dfb6fa3a0a5d3d19e0083a27a022ebd89574a7694007c16ea03e2a31205c691a9e2867f5357cddf1ec62e3833fe142e930b76661e72ea83b12c3df9b1e31b11ecb97a9971dbcb9f0b980b78ff6dee3dfb3c73f49568e4886ed7073614ede376b4ba59867f87aa73f0437f7a5c38ab95e960a8d3758719db0eda506c0c2a40f4a6c1d2fff000011053e7d975ee5f31b6f981a0ca7dc174fbb4bf94aac24c226ae0fadbd6cb25c2dcc74234296eb05c945c16642d882fb2241cadd62b6fad95d04c8ea03cecd40b32ed2686f3b7d94c49db6cd8d94068e31c775a7a2b86415de57468c1ed86565214cd4038a9ef449a90b4ab63a47903f2e65a1f9193a081cf220cb257adc290fe843dab70541af95014c2cebe5874eebfce0f8028ffa38e46a0e2fc301c0d96e4ad1b310b0a7a5db25bbba72f8454e16995036954451063adf60ad0399063980849588709d4b9adf4299a84243889c832c810c0ff6ee5b8670b529bb4d81681151e18141198acc5aafb2a47676234816e8283a7e35a92cc01082282a006cb85ee0079eb21523252e270373d6eb32dbdfbb2eee793a92000c1e9ce5e74126d0fcd441dfe8e6c09328e7f15686fa1757573922154b878e15d8b59fee5b8851f5e954e42d1f7152f60314ee1cfd4827913142f4c5a487999025eb0b4e7de20ece2b84d5670ed13b6581532c16508ace78e82bf05c12e9800a033596a1adb69cc4ee2c89533e4bf6096e7d122f290b46199b0585b62d4a980f32c8a2c44b80d69ee84b6aa32c157543de97d7bdafbe10147b4b28f5186567e76c6460411547a0e69a6fe66922ab637559e7183bb1d9fd6dc428ed6dd67e794018f4dbe1536f8b8ceebbbb3ae3b6d438ff87e9963c409eedf63d33f2855f9bef0769ca3db7b10b64ee79d2b30d8a3d8b4e34a376f998bdfbd38203edbc5725a1828cbcc417ddaf7a4f4c138bd41bf4b8431264901c4355371b4bed439df12335c3cc653cb6936a2cfb1d5c9da42cbf87da6c0b99572c2c518555d9fb2d0b4bbc3dd82c2ec9c7dbe05a29a98610b4c1a4228656e987d55192a9a3461c4bc797dd40305c6855d6813eb2fa57a303d8375696d3d44d8123e705cced67489d90191ce8e5a95983d53d41d2e95f81ca87ca6bb34d61d16cdaccd38f727bc3324f5cfde52b0fddf1334f5622ebd5e952bc42c13e6125d2c84353213252922783fcc3eea4feb0d69fee20f61a7afedbcddd6c336aba334fde29a3856f7713200129ef9196750213d3e05e66ed3e35fc142b03df9bf42abf1964c9442c81eb6898b9e5fc6bfb5d5350872cb6e88deab27cb472d4fc335a36acf67a041077de971754b5580d9535675327903ced20e6e2e65a0d5baaaea49d3538e08bb665e4adf24f83cf0de8b928cbdd09257873c6f81606463e43d09c94dde17820d83d6533c2a7802d74988ad445c8c37d7e20151a7b1d68226bbc0633dd067ad2fca019c54ccf17702a7ad18e093c71568f66aa0f75e0fcab14d0447707572b7e0020fde15e06146ddfe0739d264d0fb105daebbbb53bddd31851f40883255bd5254988e84e365379c850af64370e56c2f31d9fcfcc1fbd09f51983f6e5e0362c045dc32722d7e698a3c75981d0380b73acb0be8a0a07b9dfd9e0eabf7042771d7eb94572c31bcba4e55f7fea4415937db0f900d90b9542104ab2ac7d5d88637c5c7790e0b801e4bbd7ee4a347a529c3ef3db5dd1c7805d5029d6fe7c004b2e6391557e4d786e32abbb6200000000000000000879b5b010000000089a28d23e72e10a1f8b7ba54e617f938df360a60d47b8e17219adb021445fe9bae527a9002e8bb21f67b1c04dda0d89f7fbc77c0d5df765ff2f1815abb31b21e68d2ffde772afb365df95b2d67772717c1678b127c3b7d4f3dc26d90a5a8603100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000784c55f2c421fa46bb4d40ed9f833b4e3e98525315ca37e8b49a26036ef7af0a1c8b2497eb4715879e67034c67dfb8452061c8baf5912144d75a88aeab3db7a89e55672431a89e18a909f74875c555b26b61d47fca9b9b67a5ff85c5ccf6f5bb45b0d74b45e92f7e6a9ce12a544d250cdc0d6bb90706f1475f796d899860e0d40213017d3eb578edaebf071d92ab3070df888d957fe1c8908e1df05136b2c3a646030f850eff7b8bdb197ee7d086dd3865f2a03984f11bdad2e3cc971d658217cfc60b03e6fb1f4e18206ff63e444d031430faa7f070950b4a0ad65492168b9c0e35a67d2cb7f1078f30d992c5bea02fe1e37fb352c65e3b0f0009caa1a986d5318f1e03276c217a043b3cf4724f88d2978bbbe4c37e72475b7cf718af78f36ea795426003163221fdad0afb0a879fb1919654258e19c228c483c00ddf9517ebeb6f99fccc0308840a907e141785d5e32985ed8c3f659f9e0447f14c5785d905ce8f9e9eef8b0309291eeb37739ed381b750cf0109f38cf7ee1ea08cf17372d0f40ac96c50b58c03204d41ff2dd3f640749761e2cc3610ea9786b314eeff8eb390d1faace35fbfe7a16bbee246bfb45068d1bad10d4bbb12162d8375c16b2962af6cd9cde0d037b466a3c033a91e913e65a72e2764d7b93bb7269978cf64ce1544204d1952693724de8d09e285a31fa7776abe10c547a53bc57382369efae5182389a148e0860be951dc407a5c1b7bb241c183382c2f4f4cc1813706261cd4e9dce4d7e4d8aadea1a52f163eca5abc65a49dcf3855d1bb37f62e9ca0242be8b661c54532c9bb39b103438c728dba1cbf6e98e2ea265bd65ae8b74627d51af35284d6fc933bca357167b154e9ce5e8cb8c2eceb11f24587de4e1754a9907c5f34c1427e0a18bbaaa09811ef258a62aa2da9922dc2c574a982be005be67a63a94b265cb91e6d69d30f0a4953cdbc9342e0fb45ae5b58acee1ca9db2a8a6cc275ef4bc7240b7016773a495a4458ed17e9f69370f36b5c2f1d6a4d247a4973ae478c23b4d0ce0516d8a29a7c151aeaac55fd4ecc6a5d0711a57c532235a3856398774830fdb56ef269c716ce1a63682dde907118bd7ee0fd964e6f2dbb52a0c68a95927ba5c9a53ffa8f2f0be1ff0c5088c0c0e9a3efa900a85267dfe1c08a5f174b9ed2b50c7f408b0290644f40465451327868be3eb76de99b617e16435a801e0ddae0ea103aca41d26bb93da5660ef1626fd4484e480c65100f826896ec3adbc28d19d58119b1a07d57af13f51966917ed63a7b746be479d2b0bfc1a5f4d5b8108f00ee4273d7979b947fd9ac50c6c745f9361706c0aef2da510b04df24ef8c49ddf534f407508aa55b8f9e75f085bc46b46d39a026df7b35f5af20ae4e8150dc99672183d233b2ddfb0d1e0e08df866ea07c3f3a4296d718f3c342b7d337f8881215e96edac3f8506fdb32382207aaa9cb3a9bacda10cdf702e136cea2885c7ebcc112939b83ccaed39e0de7279ccfbf4d406adf86ea50642c320e16c382312d700aa1d72b1161ba38c291e478064f3f0388066886bb570c0645cc16bd95d9db05f9e4c698ac7bf9b492d40954c9753dced03e745932167f11219e079a9dd3b787620a8415e1f7f3fb907c9a93a0388bdea68038c60a08401af0c5d2b97a36608ee515538626415485014a4f6e9fd35c2e8e3ab1501f0480b6d88f2b9c4103bcd4f829ddd5ffa80e20eb78dd18ed7d90fd3869549357711b3a19c1728c83dbf580ed6a298c00d266a9174f582071922a8da2b479c0b0aff59fe0d7929d0066883f91e7720996b0738cb4fd500a35b760a72fd14bf45ccbe408fc8fa8898ff7df60dbe28141c6977b8974e282f99ea18b1219ca7a8b7368b0c75388e07b0a5d9a239aa27bc66a8c5ff708f9d739b05fc70b85b9d1f809d665489b2886ca688225be5204d8f62c3c44cff7a349f747851ae43e3bdf02334769fc76575587ed9543fceaf0441e5d7b93e7d301221e9143785d3a149d35fd5517dfc1f628c934a59b40ce609f3d3856b17c7c1644987f4e5fe02451c367b5a05c10ec49fc623fd616613b5bb3b7148687e5968a44882795101784cd34eb1b1bd07631e897f1e0bc594bd0b1646f63dcfcd39608c0a74643dcdf8ad2debca53b900cf7ed5a78ef67cdde149c7c9ca83a05d1e13be70f8ddbcde702ca6128a95176c55e1becd0fef781ace658eab3f8b7b1c6180f4d04da8549c078e191126c09ea4e2d64f62903110eefe2a412f23c37ec2de131bf82d6a7912c1ec86a91c412757ea57a79d974209596abaddb281bbf4e53934ecb1e680734e49eb028cb0fa6d151e4b0e526e6021f947f893476432064c906e98fc643759cd90db6fff6a895deac9b207c303a5ec1c784856a21db4c3c174d1c7e7c5112da68190fce38c5635eb509", "5365006565", 0, -1681709920, "deb222d7bef6ad0d68853da01f6407bf61a7eecfea6eb7a3955eb350da324296"], + ["030000807082c40301a12835b60188c6db289e22e98f055783a684078b35cae46d512f1a2d91362be30000000008526a526553ac6a65ffffffff04bbe1c4050000000006ac656a6552659b45b7010000000003ac6a655eeff50000000000086a6aac5353526aac0627e900000000000152c021a7938d4d01f70300000000000000001dc5ae0100000000bf2265e7e06a483fbd7b446727076b2991c2899f5b2137329ebd4e20b15764467a1edbf7da66327fb4b9a9e047caf93bc03036c1ca9245ee730b41b9d12e7be9b6665bea05026aaa38c8ec0fb7587bd156a00f73f7b56d7560a7d1cae3c922eb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000df0ce58ba96fdd5df564ea5bcd9c502dbdd95c999bb98f1c58a52488b5ccb5c199ff1f9436b9591fbab63406f73503dddcd4402ec399ad20fb4aae6fe86b1f70c4673c05f317434afe4e9a42a0f72167848f1b1dd620a9ffc7e7ca9d432f0f497a87b7c6495a67caf029bb91ac605addfb42ca0f81824742a35409aa8ca78e71031de486fbe15f75e9526461692efae0a4e1623a9d8a6015500e69a19368537c45030e4b79165f9bf3915f70add299d1474e66c87bf281563c08551711820cc7df450a0898a857bace7a0042c146d70488a9d158de9f225205fc181f25363f9d1abb499255d1b3b9c830a2a324a3031a340da18c1cd0d3a0a2fc73a1c67d023be1c7ef0205dd3f91b1797fd89e03ffcfe4d7e487a62d7f594a8de0b0fe78c9c3a79290ea022907dc6bd74ee91f99adbd0396958ba366dd302de03d1a5dd0529d90fc89ea8d02262a37d96b002ac18edfdab924a3048ebcf8d88af4ec975bfbcc18d745f5f633021ab94afa7d6d5621c812b5baab86e98fa4339aaa20470e1e8e4028051ce0c68c02270ae466067fc6d6f86986fe9d73e9812b1ae309b770f8d471dc56f013eae23e468d3f9e3800eb71a29217f3e1651d98e437353746febbea60a471b45583130265f0a8b3f9db44b92e9b64cc912d9ef366e0c78ea3b81fad4de18b3d882b070a28f047c526a2c8c7f40a219f71f0512c626ca8179569af87f2926c608576641b07cc11fa9e19b8d95285c9aa301c7d5d60ede293a439c1f98eec6dba43473de098f304c998cadbad3b3c12f725320c92b9256401652c7578f4aa02dd4640e3e6ad1a64408a1a26a98db27c3ab83122e4914e4f701d645fef1eed35e951755ed99defc06b35ab94b134036d8f9f55bf62ff8fbd20311ff595def12d88e79df8b81d23c0de9f44c996376782b81ea59d835110a21183f639be8554595480d020736b139501a33f5e88c547526205b7cb195405b81b599d2a7dfcb9f8ff289150d1c489c68c51878c8901abef909a3532a722022f2330ce07a1c4776f128cba77a1f2e95906c83db53ff13de97dfaa8abc91d2611eb9dfc56b3ebaf7b160fe0a3b6aef2de0bd48f4da34e521674158c5bd513da2030aef8ace84dc7f10a6a4395d355faf22ed0469d600f76b3a364b9b0fae7eb692a5f8057e1c6cae91e5d1dd0c49c816e542bc35b8396531289b645d3d13477d4cb11f71d54b0ecde0a5af0e8caa8a709988b6e2ea9240177dd3558c22ab7aa2b8682a7dd596e5b8f0d108593437d5cac262b99b0314372c345b977f999d2af627209de87e52957929d8898ca68d18dfa7e4b36a080628b01ba559d31fc2e5f671aa68c4ba5fa3e3d807e6e7977089308eb1cee5613ae03c637886f1357dcca3986d8e6f1a72d24617846bd0c0e0fcc5ee38a086aa709ad185d6f47587bdd871064efc602267d1875bd34449b837aaf25ea435615664fdf718a451c77102c3fda3c2d30bf2cd1ee43a4140356f2cfec920df5159d41edece76caf8057c1c474a17945935530f5791a67c04c1458a1b7ed3faa27809592f726638e19da5edaba18fa31fb58184fe27df28cc504d1a1955a0a189f34f9f20cdc6f0dd2f85ae2773bf86a8ff64d365df6f9cdd28e6f21c4e19913e0366dae60fdb009548296bcb86dbfebcd5729263801f49a380cc8e1d80e0db30aa2adb9a0a63685fbe022f7e50a3e4599ae20e8010aff6d58da132950263d82220e62ff705e51de745e13645308cdc5e1cdaf8b86f34f8378806c762b75a9c73b3a4427e9453ebdd94af3f94cea4ec059ee4069fa566df01ab19035e3afae89cf224ae69b80226349dd350d9fa1f10194147420361eb307541008229f06f353ba6528cfe6cf65ace8808604c9c6e106c22d2c88e0ad55943081379fbd95df6aef5d879d7ca2e9858ab3edac65825a2cf518a0b4d3f45fe3223af4fdcab5f13d7ee4f1cf09a2829ac67cf77838ea11a8d831a6d8462dbc452581a9c1a67fe5cf24675f5822e042f80a84470c80a0613d24e6ac956c4b413915d76734848734adff78ac60f9e0d7bb0a007eea2cedd32d81ea0d5c7318b23a32e2c5e9f90929e1101a0b0082754755c29f0bd7b837c9d200236a96db6fba6ae355f8e2ef50f8262cb6b89be684156cc326ac4440f6de043cb5a831b77567753be72cb2d6b1d4253fe1f88aef318e34ea8a675e09b8981b07ea33b8f8333184c2a27cd092b71602084251aefbe5b6a1c5565a2e268e0eb7f5986c7e34c0e452f2a33708de0cedcaac17821694ace20533a572f9b91d419f0100000000000000000000000049c9758a8408d33dee152b97be817f522803878ca92bb09274e4e1d5fcee9d86be8e7048b6ddeebadccfde06c3798cb9b2e953552f32b748ddde193c4961b43db24475d302e7a17b4257aa03d6791cc5e6ce4140f7883912a92dd7e05a8ccccb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006fb57dd4c0ee9e1a046cff40b8e94eb8b3bd601b8d28df4272a8a202ee49a4ed655045133983215da94f4cd2e2bdcf5f311e0d4d7f1d90240cadbfe4bf0c769660c89e2df98c531fff05834171ac7ee0f3517e1df8fa47eb6786d7b1749e707f454f4b83a4d4850fc0830d370fd34a6e3292a7c89c69057f2a7bfec1e6c4668f0304570ed5e98d313a17dd5dedc7dfb039cacd90e3aa5b7c4f6df4d61df727117202266690fd9d32efe29ac0bac0fe8ee8068e45857df3038e7c7bc6605c4286c0b10b008f74749851314faa7d4aeabaeb77e863b32f8f0182a1e5a9916d3253b8d2ae4b2744feae501c31ff96a94449c52eea817861f6f2b331aaa28dbc646a2b6650032b535ad80440a23141c4d8eb3b7ce1be26891d5dfe72285000c57c8ec10ff3280223f6878126b3c7ca3e697cf60d74c5a63ceb589cf1a292af7cd9d2b525967bd1021dca56f175456957a9f7731f77ce7d4e23f1b613a0477588f767a6f7c9bd9db6022afd78ff04dbd35e656d8a3d6b780943fbf01b79551b014674fc5c69e4b82338032e99f0f54058742e295b7e407c7bd0e5d0fd9ed421fd09d1cf791568545d5bea4e2a15993e7692849d08677ddbf7a181234e8fa407a5e0c529ec6449e709e8d97b742367d509dc826198d0a7c4fd78fd97c31c104936f42fcfbdc04ea33d83b4239ff4e96b7c3c28f163788bab4634281fc2fee9fc0e42e9a9aaede4d1c04cbf8e4e4d03fb46279003e100a16b7a8d67b4089a331816f6e3ae2c8bd51c0dc826b0351c6d7f5a231b03c9ed132c9331e81e6d5b511f20265c3cc795b4d755be79a94c365c44422ad139f494a3eafac81c58a0e21d60a708db5c97ffbfac1dbf500f7321be164cc71d258fe2970285bc584a13370792bc0310cfc895154088dd733f60c7c6a94fe3f5ac4736f15a57554b88afc5ace337c6bf4cb83d1e77b3b3336829b51a50578145a908f4821dd608e22b34bce57904cff9ceaf306f8acc95db8d9f97ede8f8f59086ae0d6a3c771088a0dd5591ef4cdc9adf02dddaa66c44d537ba1c3fc9da885b2c747f254de4eaf0f6e1582402759a572e69ff984dc002d3f1450adac36366e284657148ac1c37dcb822da760c865f67418dd863b26d6380f1c1a13d27a3fd84e428921ead806080bd7ddfc5454764c7cb92bce4ef5e678877e764818227f932d94a2a7aeb8706aff3a2c528b79fb140e93bf7d024234ead8110c263feeb3d48f392e0a1945bd9d2dd1738a73922b517f05a47f940c8e3907a20882ff56a5817a2b9106ec60bfdae41ec08bd514c0d2de57a0982e872c1d23e80c1a6aa5306cb41359be8c9be95f4d92652d576a86cce8a2c04afd851865907b869c1620b8a44a4d8e336e41b4212760b1d8c309adeaf8e746b265e5bd54d17171182c8d33e49730523f6d4d174ea765b90daefadca33088034ec7ed8a0de689ce041aff54b980855b4fd2187701fb61e045872c1522351ea22a0a5a8a53cdee59677b40cd8da1b507c79dee07ec03ab35305c416c61119efdf9b86983a5112e29e0aae0d5306d7f4c8473a73adad790332cbbea277eb729e838354ccf20ce08c935ae82a9b6d5bc1c62e38d6c13847d48c15b66d1bb89f2f6f91670b17a63452d4a658e927034a40bfa260088c724892df0cde4b2e0608833b89f48e7489f9d0cd20055d02d58decc4e96e0a8ea33ca793ecdafdd4400d4a365c5846092e38dc57bdf8dfb152930f4c11efccd9097ca54f5ff9083714ad68683e65be770b947d25344328340724db9fb0d63159154d628968af3ae916ad6d14fbf3fe2d0da13464ea7c4add0e44320f1157173a240c68609ea2f66fdf0964d4729a6b29faeea9f426817ae9db2f705edebdf58e623ef2414ee4d28ad8a6158ab88c3a1353a009b5284f0cdf052d43daa15a91220708a667c7c083956755d47db6cc07a9de2752acf5d87b39587fbbb9b7d2e248c4702d81dae2bb422a795f573ef83cab3c7fde596dddd4c30a2a24884debbb1a537881522128840e358d562a4c37e097f2ca0f7d1b627a61c39804d497dfbf7afdb9033cffc1756a3434d451851de5ae9e43d9f6f0943debc43e3258b6ecd967c28bb18229c0130b7b51dd55b36ab620b57acac39816dfd186c4aab552073e9a7332e8167b407cef2cef08618d85af4a1e11285d5dadead06c9bd56fcba9724c7c6b60dce841ea7b9bed0983f6de93fc8034a4aefee2930a227496a9db22e5ee501f6304446f5d985b91fdc426be6674135ba310d7dc8aedb8fef8403ac14d4ce2ef4c000000000000000025224d0200000000a8e6648800a2e3280d99cacbd4de8a11975829708242244f80ac9d6777594ad3cc67c021c0551376d90dcd5729628a4594222e7dae9fc12eae076169355bec637a03d640875756850745442a4f52546d1066c59b7f2d9dc36c7e3ea42801de210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028bb51c51eeea936bb73f9ca2587ab0a36aadf915b507482d7f5f612677e93fc844ef52dd9d8f1ea175ccff954ec0970858679ccc015905e6c1e1302ebbe1f5e19d26efb018b4f9995dc36c917f7fa2725c8e7ae332d66de141b3dd33370342b1073e8e7c563dc77b206f781340d563b8e7060fed628e2b8337fc30e76161c3b02078a3be3859e60818d22202a1e0624c98eb5f99797d29814078afdfddcdb4bda022f6b2dae13ccf2fdf304d03674fe19c11c81ed600f0e5f969c2202490b40d46f0b08d831ba6f68915afdad85cca651cb47bc82809d93a09b2ee67ab692ae6bc906778f633da4d926b2d2ccaf98ed61ce2bb4c076c66cee59ebb8dc46a8c68de0bd032e0ca49c00731abeec74f281f2f63fb026fa76290b1f97eff60e10bc0f52408e032e7225fba23ca7f57e6b8a340a36ba7c2f5f9c766deb4fb80c3b66a8c1254388021cb51edcbf78628ef14e0063dc9568bf3fcfaf5892e0ffda291bf1648ee80f650301098c6bc64fe56696d580157c143faa2c7dd1d99d23a8847844e343c779a04402133942e61cbd794a1135f967b140eaacd93664c057fd44cac18a6afd951a09881375933f7a09417a8c571694f16fae31eadf06f7a02d86ce0e4e1ab05b4128313511b948eeff13609bb7cd5f0bdf7eb3ceb548934c9b1aac31b5f43d8fab3807d7e936471b7c2438b4aa2aeea960a41fb9138c8a7e91307a11849026c34f866f77c63f7528a7b0a84741cc5e15c70099e6b8fef4fedf9e57037d93048771daec04c577c4b8b45ca52032e433710f1e2c1fe60416ff414220b5e76685082b231da736d375757d262d1be38fd6c1130848d208564c04fed173b447503b36bedaa14cc77a5c3a5c0135d535feac455e020dfc1fd8df990fecbaff707f7ba884c7ef4465725727938ed864bfa451c69454039a4b541703c37245042396285ff8036737b7bc889993532efba99ef7ab95f78f50bc219a789671bd491f110556127f46f721eebc4686170d13b86915c9d17d58bccc6f6bd354f62edb90590f403097acfdb2410ed78d96559c4ecb252f4e0717520d916b51baca62a148e4efb255ba11a88df22ff4b16b87c8e97be1058547f95b5b9a46af14507614b2816245ad4b89e08950aaae6a995580d9f79b359b5e1cc131492000e88adb83685dcc5ba7d48504f2c1d4d8508981fb890da47ea3dc34fe9a14bec5f1ff0bf907d1d3447ebf9bb5eeb9d646d6d32de0016325186cc08696442d8123859173dcb2640ffd091b7c8661758daca84c44164d5b1b7aa27d07a59f223804e8484e74db5230ad9f8f8763841652c8b2c878822d9d760eecf2766b94b11e2ab7b0ae977d9016d98f5dc55ced45e55db2b0839052c32a9324ace625c9280bf0432974f93cd77be3ee0a9aa1155ff3288af78af18562e8198659306c6740f50f18f4397cadff0cdc22e7beab0c00d47a5eac389731a0e5b54e39adb3fb821d5525a893047203c853f5e50cbc712915cba4ed5eed82d47ccff77160f0e5c7fdff2ec5d4e2724c2e2e49dcbabad1386cee578244d9a31f6929ef689359d24db293754924fa7355b1b71fa573598926d6afd7e714a23e890404d780d1becf13e63bf28607703523ad29a043ca7ee8042f2c996b9701e0c297fb48a36359baf436dd8f7eeed4c90d4dd32449e671e592cadb99364e0f032e6a2c81a9b3e2838b34ab71883e3fc84feec4d6153a4f62c58374e7584a23fe9ad60af595fac01b2fad95d91d3a5b6574bf108cd902968de71716bb0919ee681fbb58feaa2fd222fe5006eda7ef83130b732179efafc8922b2c2bddd5412340dc1acaf20e0fac8cc152ee6a236755f7d9d4f231525754caf2ec65a50993644fcd1c8c9fe5c01dc1254570e1aa22052fee079a395cf9bcfde045e7770f2d7d0d3ad49b2994546f3db3a1e705c1bebb9437600decdfe4e7eacf6e3c0ce52fcba45b41a742747b1394cc4be1fc1dd4e76498ee32ee2c10d95e544cae95f2e74c540e733a19f2646abbe11352d0aef0dfc8716576eb1673e00a2f586cff93cfafb7bd2c867a1f30669d62e3e455644a1e48a7897446bc76fbb196dda7e6689995edf7208c62659169355c5e9388a15bc32bd6ad78a8f19f949a3d37593de49b8bc20740da18681c9f3b3213055b4c6f4afc8806dcb2bada86f25449a115bdeef64195954bc43487909999fef7679688bf0c3cb24c18629fc4d5629c630ca7d1b82bd9f9c7ff031f7b529e5291f16b1f934fa7f93567c370be93e7ca8b6c7fbc54bc3189314d536416367b8fd9cf176b13413a7e11c424cd19a350c146e139cf6fcce17eb11dd5fabaecc2043602bf45a638a5deb3ec7d647b1daf940d7d79197380822d5d5f43540fb08a99ea8154bad970eb756fafdb0dc07bb17dd5f27d0dcc773707ca29233b1301", "52ac6a65", 0, -1153580287, "ed25279a03a344c5732396972dacfad0df7672d531a50a8dc6a5f33d5c293bac"], + ["43b945050230f2c04002b876caea67644c7063116c3284488f08e82d258b1d117538cd684e0300000009656a52515352535353ffffffff331d5f8f56d1180bd9c8a46fad1bd021f48b6eaf75b95413d0c91855cdcb2ad3030000000463005253ffffffff02aeed2402000000000752006a53656552fd4e2d0300000000075253526552006affe4115e010000000000000000363d6b02000000006ad4be6d422534166e488048fd62eaf50b508e374f0213aa0d9ffcc38bd2f761c3f6f72b4875bb46b247604b4f7130d4aa7b8264e169216718f386f351db5a463926425d010c4e26581a6b38f009d8ce2d064ab671f08c89dc5a917e99371f7800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ce60188698197132143309d25428d42f856b1033d6cea4bc2a59085f9896456fbf148101ce051151adf78e878cab3265ab0d3bc6a7aa400a708d4bc112e26fc756724f533dbd4a66fef086bb83596720093cd1fd7f5f6ff7c3c34bbf44ecdd3f9ebd8789984249ad515052b2e35332f46dbb15af05a98c859f4ad542d5c20d2c0216881612c41d1e33135e5e176c7c7e2c83b284e0321336be3960f2640fe198f803213d51d9991feb4b8c8ab110ec85c6c9b4a5afc1677089efae642c2c4a800f600b01189d19e8d2af217ccfc60f91f632cb3c323892bc331ec998d21a3f47b9bc15f33816b18d246c746843c95798e5ea3b12cb9725e18cf51310039be6f8e06a2b0210e1b4658be59431bb125e94940666828192a39b7a395987e7559e43679a7ec90317f107bcbb43a2d6d35176bf1988e88776fe0a26f5ea1a0f1b270918c451140a021c7cee697958f7cdf999b32fe71cbc50c7c71b4c06fbac950996b1ed522f9b60031ac98ce4737b8ac23dcb55b7bc5aa4e47fa238c520f1587223741717ab9c23c9030abae350c1e6469d40531b4da871dc2ca8ef221e5ba753912b3b6f27105df8490441e18713dac70628afa54582a3598dea47926eb74852cabaa9e980a3c539b5a375a6967782960832c7c4da39717900ada4ea22b19179402cec425dbe965665336a59261aaee3beb83849358103b9e7128bb51cac1e12c7d8259efefd0e8ee0bcbc29adbe959c6750e3d63f1fe5e99a19f69c9829c38943f3f75d3e7ee85dea3851892edda357166bcb1d85f352f4e54e058caaed2139bbe63604e6df6b3db9a84fd1ee03a5453685703c3b3a0934015f28251276ee98f3f1471ce5ba93283326ba04bc84831091501b995d88548b0282d5f4ba863caaaafb7e179a20cbbcc8adbc9e3ec5843f68d11c48a68aa7a1b8e1d79df3066e8e226680bdd39df61adc10f574fb6e7479eb61aa73393cea0528ded8787d770768798e933e98d3cbd76e8b1d0dffddec2ec3009be62371506271e3794fd6e04e97bba39c901f3893ab8f0db154c0c34488cf8fd9d0cae3b41c0a5b411ef271faab354f15c0cd102721248146201e4d706098f971c47bd0a41f274938018b74d6cd23f9fe98577450a18313eeef2b74a31d99c599bf158ffe59b98cf962333d6bb6957c57f5bf4db458d49b1c945e07e7aab19ce96e9a9942b7df00c11c07d11ada680ead2212c2f6616015f07d2af64ecf6cbbc64d54ec158e2e720faaf8295cdd5a88f59b39d5db01d2231d2aa462b4dc96c63f5a871023b3f3f9fc81cee2b5ef6492802912a57a42d73d1f484917e2a7127bb017655e35703ee261147b59d2fb6a7ab6f1d21eb95df9eb04f57ec6bd6ab73951a68e43aba7df587101090cfa2a2abb5a43ee7040cba46d0a023433cbe03a29b49bd44680b6b851255f5ba9d2b53133a388214c3432d932aef385049f6bb427a7ae47790f443bd85f0c640954a3a91da8ceaacab232e0e42086213b54b14c0f648f6edc83bb8094980153f8d9f4b63128789954ef1b2027a5fa503ea9f106286b89c36d9d80acfedd9b541bf2634568f321dafb90772a9adeb9fc69012dbba0a5c49d6b0a1dc1f413a5fbf7aac2b74f06a73e7896685f16f1b592a344ac153dcd1f2661b2d6ce83f34f5feaa804fef84298bde548a7d0a3ad159c7de0509fa9db69f490f7dc516ee970cb71bcdc70b909d0779e5be6ef7361f705f33987f051e65a6aff05310b5e098e1a1a894724586d1f0ef77f2e880ccdaa4740f5e0cddf6ed5fae7df1c046e161a3a7e020a625b4bc9e1cfa2df564ed88da79c18c0fa9546013e29d1dbc4833cdeabeeb81d5cfd32eea22ae2d0ccb6ff18ef020f2b6be8ad09313789e58f0b7345843fe8492c7cef020d8aa288f0ece1c42ce799763041bba77696baab610927ff6b19d00a324f9b56d8889fd409c738b36c6d7fd9e6ab9d91bcd3fc2bb7055f7be4122144c886bdf5a2aaa433a0e7ac925e220ad55b3b630502f80b05fb27ecf7ec8d3ba982feb5007eacbf9dda6af59b4f4450d2fdd4137d487e161d33e452249ba153163d27c94d4f791e98de939a21a530d04ce1582e4bdcace69a33155398c8e491ebb3b6a4eeb356beedb689e7522215c024b218225c1817585f0fc72278ad0b3298d0ff38c845ebb5365c12b790724998d896355c61c68b66d7b55cf6ac74d1b58c81ebffdb86b3740870e125d422988e8866d72fcae722943ef31c1d673454f0a86bb50412712e4f5bf89503ee559b329d89c7ffdd57385800cdca8c34fec7446a48e5ba7c6197103ee465b0639658d6fc31e440f7229e3d92c682f3d802e4a332a6431115b8427f3bfdc7a0546d0b7e94773fdc1d04981739785f37b8c79b2ea9a40f22dcd97d676f70fcadda91bf902fecd3bedd80db0e40e91201", "52515163", 0, -80422014, "f01fa9030f7492487195c2538e5791eac77e5d245b58c52e73c3fb30896a6eb3"], + ["030000807082c403049653ff034aca231e7ebedb883d32564f3e08efeef5e5bc79a660c53b9d3665190200000007516a535163ac63414bb303d42533fa47cdda4e8b47674911d1e0b2b39014710c6327ccd22b957de33cf98e00000000030063acffffffff01e75bdc5a50fc3cac114dd7aa8668ad6383b0cd213d7ea55f6a092f8aef54500100000008516a536a5100ac6a6d93a013dafec7b5f00cce43f2de8eb41900e6b8e0fedbd71241aa973bda0cdc44cffe590100000000de127467046a399e040000000008636563005251ac63b0e6e2020000000009636500ac535265ac52af1b810000000000085265000052006a00dff9290400000000045153ac52000000003417bcb00100000000000000007031ba020000000097828efee310acfa783ce248ab879ae32963bf203004cc2e48b861069410243ef6125ab175a91dd7ec60dd7aed8a3deb2dc1f61f4202878d8384fa96491462490f6e5f8497cff41ce6dda1589db226386c6d1ba75c2bce8396b9c4a88d67453a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009371c374b2376a4b515925c42bb50cff851d65493e77e2a418dfa1b3096c4bb8be33b5140d2bde7cde01156850ce3755b8b5aba3158644bfe452f75c580693246db7afed4fd90e5aee710535e519649e19681bf6cc7e830c5bdc0ebfbd9006c563e07aa6642c601dcd8f30313de2f30ef1a86251478a4b224e35918d66dd871a022c522b2219590cdbc7480b80979a131cf3fb3de973701ff6cb40f0a04ecab0fe021292b7f9a8b37d10f61699d5ee2704ce7d3be4eb3e8e1cdfe3e47015d5eebbef0b019e1af64b4b2550beca53f5b44a2a6e07980a4eaca0bff664846adad2c9f9f0f043ae2d18a715bbb0659b6cb09e1050aa77da14f81624c0809675fa892ed2710300b127fac9b3d541f59fe8011e8f94e5f6b4728c9bc3ff90a4aa63e67b68a93e022d0dbfc0cfef9df2c06c6418ce69871fe01541258dc22f74ba0243499d5283b1020403248b0820ff5ff99eadcd8da42d8a8d66c4345d2cb3794ae31a2b0735424c031454f2847a1cc750cb143002e4bacaa6ae450d2d2a44881ec82289265fe32dd5030e76f14f5547e01530ca4249178a0424dd4b687b08dda20387332cc9334c55cb72861d3665620e8d169b61ae62f4c7febdf589116cf9711d7284435b0f8645eb6aeaea4aef44a1aa6fc4ebe522892a8917b77038459448abb3b3a502e256721ccde6fa86a8fd6688ac183e6b7b6363bcb1bc478ac9cfae8f5da2ecf3fdc01470fe6c56a5463a13ae458a75c64e4e1778a382ecc170469e5931205b7a556b7cd8c8109189d68b2cab87bcc10a79b708f0fe8b306a6d212e3bb6a6c97ce4c76447628c6b9de4e0c531b6979f4eab8d6cc1042314dfba016d9037cc7a7889a52dcb522afc6d92fa0d7764d949f94956eeedc1558c3c6699847ecf0ed8feafe3b25ba21b13da60b3e3f115c12d61f13233a7c43d7c38341226ba45fc58bfbb594752343892845c5574944f4351c12b6fcbebc91e6b6c6ed6ad6b29e52a1df21c25cc2a64684a472ec5633972a7d39cbe7d93b8c749860fd4e38a2d757bbc189a9a5def11164234d2f89f73d2a26147c6376963e42457a2da288801af3b70d9c00363d96224e61f099d961810afaf59e6a4b58f5a2364b4cd35cf1ba32b7f7e5bef4fd748062630772a9f4b98ee85b31d6bce0e52bca71110425cd1ff7afe333241ee2cdca5a3f526f1f4349870e3399725b0eac76f9c02663ee7a43e64712d098f510dbd1091b4ec37757aa86dc2fe1cc8fb2da0538ad2b892c21d7e0eb6b292535009f3b80b634c1483566954372fc7e3d81cc28c6a51272c84ce4611aa7b48cf982a55950accf15f777431e30484ce3bcecb5bb6026ac215d871541f49afe8f62fc4c09c557dc0f3339399411f25ab3a3076ee99a23523164bbee01d05b15bf36f053e2355ba5b7870585ba19954f8eae6c4901c996b3026da2b19ec1f9c0dcdf796a72b43b7fbcb940384aa8e0ad53427b347c3cdb1a535e25f0c09c716f9869160d75a1300720a500f5690705ea91b3339e55db0cab283ee716e5937314aada7c27ba424ae7c6238ce250fc104bacc9929f86729d74cd2fad7f1af9849e4f2528b8affa833d1e8ffcb1c7a99359321937090e7be11422c054360e5c3c2a8c2d33532d02346faab65ecff0e3ae70ddcd235070767b2656204ee0bb2ee7f6ee1935e2b20b2a8249c4a6be1faeccdfeadcca9663b25d618fa5c53c9ddd609f374f1bfb1627443d3247f6c5d3791207c0ef1352609eb09c6fe9e28b11a185c5eaea7be52b9b7cdd04b97c258c3cd3e381093de9751d39151297e496f83cb371b0391e556754ef846512348f4911f71867a0c6f9b80c67804e964308c5199e63b0e427e72dd975fb75089bef330dae2fa243d85b325c0a6b703fbbe6d3dcba55c1c475ca5b37da5144340cac811b5de9874ed33f966ffd45d8cc0ff87cfaed9479631bedf9a56daa3e7d546d818603e9c81910b2bf3dff60aa7db87127b0eb3d846ab1845790b8c4a9883b4f083f2ed6e561eab7676fcc4509e369cae28f239158b0050584bccf1b972c10dbf3fef3718ba33ee1192ea1aa9b14647f8d5b591d4b9a9c39a76ee74a9542b8572fdc556aeac4c5568c7e4b607328b469542e8204bdebfe1ec047282c8c36a8453dd806d0a22c5d9ef234ab591b010282ca5dae6e3c9c825bb5b0dc93ec8a96ad3d80983249339ae1836cc00a1df58db6901c19c530f44484763b0667e4aac8dbe8e8f975c22a1d74388e7d048bac96a93a4a62c1fd40baed44296b2dceab9050451326edb95c0d48d13f121199c52746649259086ba058b0efb53c7d44d299cdb7d88f20f4ac36452752617c9a909ac76339b3a1f33521acd1f79908b0de8a9ec8c455859af37ffdf4b128670c586c01fddf3d136e9d9441a963a78328ad247d2a9d37e9711155600", "6300", 0, 1642677251, "0458f0832ce5aa17ffcc672f2487a747e8d77712429807e49c41a288a5012082"], + ["030000807082c403038e717c06afc8e22bb67ffe9d7f3909a46b1acc85c1b6f5c81e1f79237b58e02e01000000076a6a6a53ac5151ffffffffe75535abdafb66328cc9b2de441a52879eadad34aec4ecdd04d365aec7d241890100000000ecac9781f9d8e1ae16d56140130e4e385bd7df1cd8d19b94e20e8a2d4ad69e3ed63a84c8010000000252653564618802fd96650400000000026a00c279d103000000000851ac6553ac6300650000000000000000020000000000000000a6672400000000003c9cd0402263aa09151e943a3ac77b547a7a83d7eaccb922796f6ab4cb7e471028c04ea5219cd20fcff55427d23840ee71d16163aea319a2cf4d137a0d59aa0d74e0c6b68aef6a2c61689868cdbdeda67acb78510b6a25344ea3f9741e515d1f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005f1598ad9392d70c63f2333747b2d2c387f0d4d73fb69873f69bb109c6d62f3aa6ae26075646c7fd38cdcdb427ee7d1572520200f80afa5e40a956acecb1a8ce5e6c5dbf4c4cea2d3d7fdb7fa70f246e52edac8d4fe038e54a152822eb9b57495db6f37aab003da6793d614e1023b62df3bd7931802f66491a0203c1115505103022327b275136f8094ab1016d99c1fdd05b7711c0b2c30db53d812e9ac8833d5020957323a480e7785d80294301ab8140e96e8687cde44ba36fa24861e23a44a3f0a01fc7b255965f53947d0aab869c992ed4434b19f026accbe7baef6e5d9bc63ee7a715c656dfbee11018836b3544fefcef8b888dcb84cf8fa67981f24394025e9020b3ee60520d9f5da173689e3cd1f6c50a168975023dbe94f2480cc2b25d15619020ad2344896cea4cd5802e4b73225a47eea777b5685c54ee1d28b4a930c02fe2703030914e040224d39c4ce40ae57f07d34d7b3f61d91834accd00e7f533a43ab0d03240b92210cddf097583fcdbfabc97e9f63b13392a32d3504551cdc202e66d09b0309426f4adfc5e0b0f473b8677d3fcff0f1f57c368d1ac7cca27466eb796aadff357ba70d976d6c5b70059ada06f7556fa56a1a08b1f91a25d2cb1d1c33d73374a7f528d93201f40f041d41a324fccc2dcb3927f1724179baebb029685411a5acba8f0ccc3d54ea03c400b041d3b14487198a7a2377f701930f77a814867c5ce8b9854f39b70703a4c92c210ac9537b0c03bbfed4b6604bf5db1d658f38cab34fc6fe5532a2ad41ea9c696fb475a80227a68cc8cc7e4d50ba2c6424e50ba2c9518f6c02989f31b96357eb6407b79b7c782fe44869fb0ac549ef33e6dd9c77a833af9eca0a035fac17b319d4f9bdef9f7e7eed69c8717cce225b0612ba5f9cf3131195bf027544472b849a2247303eedb6e650d11d10f4cffafe33ef2752b69cb6e5860c75bc95bdf4309fde293c98422032767d86ef6b9a6b8c33eadc4dd10def9df4040850d9577a645931fcd88abe22bd57e6de3234a89b1a99669cfcda55279f120ec38f83edb99cafde4a0300e4fdf22d0e0bdff5c11180e4403169d3e7387af94092aaa02c427710cd50b26d314a19e809f033fcf0eb8f2fff3db1195dbe95b9cf73c7f445537b7a44e79ae2c8fb375fe997e19649354034992f5d3049d2b30ec12b2fb87fd0e44706cc0c80680a5038bb2acbda3dd850cc842dfc4c3c687dd1db69a20acfc898d1411b556c4c55ef36567b426a0c438d59d7ef036b41823a693802b74a5ad11654c6d3fc6a9d12ae5a3e6790664d61e29a6fafaefff1e63ddb06cd5d91a39ea7fbfbe72af1a5766049251d01fc98b01690079148716416c10e410c32df096a144cda56a52de6913d4c29bcf2948737d895c614228f4a8e7a9b05eeb8a29ae06efaa4c97952b78aa2be6806cda5137f9b9fcbf844da9eb949cc424597d24ce765aaad56e6015953e24f802bd08065c38d67806ffd54a4a91d6d1a603b60b500a01681a36de79ee0ceae7e72ee94bf07d5897db18f6989ffb5b908162de778e2f4e720dc7fb786db896c14a12807035f895eb69a7129adea8a42008322a90a1d92105377552e0a764442675e19bc596edf725fe99f968c911e803e436daf3a370c3036e2e2aa5ff34556d9c6dd87e0812ff3d89a5280f78075a5783cf616fa36024b9242924f1e9099ae4f09bcb4d6310c25968e03be945e784c87331ea3f678ab7ea6f9a40b31dfa8ec16c85f3892912940c3760f52ee5d01ff942ad471ae0d42189f80c3115d103d6be78624a36b0d131ac986a31759248b799161d9980449f1aecbbef466e38b6d5a6a487d33ff689e4aab962db805cbe17c3af1241c3e5b5bd9c90a79d2152f4408fa7e0d823179f519a6b7f4389e9f8386081520cc6b5832b19aac238c3531c08372829f992d9b30849e9c18d2c3681aed5051527b71cedb13c425bf72bf5409008bbb6bad6bfe66c3b35f8475f644b6bd0a44cb0f20a6b45407a7015b604339a6d955712dc83cd10a3f25bc40cea0430c48d957277185a864a2f0b6d2c56ad84d926f2efc382b0fdc4a2f678a6c3e090980e9903fc98b98b58ed48eadaaf2ce4888b73c7b1d7a2edd5a1d17908996cccf5b578903477f380cc324559bb54900bc3ef0f4f955ed64d68de6b21308858106b8f6c3044f511a4a6268c14ba3dac5d8e2213744bba6cf2f1a84b8d7a48412f8b5d222a9b2b096ad13d4cbfcbd854600e0c41a19b61a60bf74398dba6132431c4b64125955de30d742f8fa93a993756b0000000000000000132817030000000030278612f41cbd81782a97d8e254d7ac5f5518d64cc34de1ec6c8bc9cb0c5426a5b68038e159242e9c35ab783f83efa408efb5a60a62c151b16f6d1bee50cd508f5198bf32813e5377fcd4671e3cfc82e8893abb9807d68f5ba2fc951a23c69a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000048b345e1d02356327f88fb91e7e7a0073a4e9e066febd195ec17d45efef3dc61de3e98d33bf584ecb7d246943e665607a7812e30e9586954e444d46c76c654571d64c783d4690ed4fc8a240de5371ef5e40cd9490167e41dd1b1c68d6786642d54b57adbee5573e429856b4c2f5838686ddf448fcdd434d09aca2d5f4ba76700030fdaea2f3e2406e26e50d2ef6b0a8ed77bd868625ffe82cb40b0a69f464f907d030206c1f06689d00fddc0673a641a9dfe8ca26e1a6388767f6f71ac4ce2239f5b0b08703b6d437c75ccac131f8ee10e18243d0cf076e75676415efd4fecc0e50f37d938fca18a80653208d745e11da0195efb21f7d64bbc02124b28c77f0ce2e90c03182dd1cc3e76a133b1113362e9c52f27405b9748a074cca5531d155f996c9de0021cf2869f6adca00f24ff38a4041c0b8702ba1964f1655baca2725cde914ee9b8022ebe86ee00ab580a3e68787d944157fd576084254bf2adb9ea88549ae9af5f55021320aae6fc9b86f815fc60763b070ba06b62f4f42d241b835ee44bb50e42bec40220f23f855800793b19d52ea3b341bb133f3c0b48d082a37b4369436496543659d76cdf55e8ab9417b37e1c6073342fdcb613dd2461f85e9438a2cb26412e27919665c7cafde6101da272856e723dc5ef1d504e7c8a7fd410941a2900e82aa9ff2fe85cf646e7215b467de4fa78f26251a3d511d9521a75ba34c78a3fdaea2aa5b54568ebf1faea68e25c42e14eddd0e7604fad4cb46fd0f806297405edbcfdfc33af3de699a1b31d8661ddb43f5df616ff23bfcbc53f993379ee37524844dd8c01982f2f4738e695d6ed3a1a8c5f75f29d6f8d7c773eccd9373a9a29b7047654010fff50ab39080fadf70ebe3d575e79920cf59538365f9e463ded82590f48d199f883c88b0b4495af4ac1cc958a97b25576a27e17fd69a183f7da1391fedd8e125bf70660bb1ec8d0b01bf2dc01b98acc50b4cc9eb0384180c6c744209d2a7bc6d8b610b03417f5107f6c2b489b2609386ff49fdcb80bfd959394d44af675e874741ed1ecc3fad4697508e3994524f364d903ed04ca425c766e6874d5dadaaf094a26a11cf55d4529cd2936db084962c9d31021d9812b48dc662d7f13d6cf12307a6de632ee7f360a35aba537678c79aa30ccee0f96906d68ba262cba7af40887d4073246c2bc0473686667957c13de29bf7a8e91fa3ae0fded44b4e74a6dfad382f884ddd538437d709ec72c26aa32218786f4237d82814942b1c1909fde69a9ec65bf24aeae27d0d56a0f56fa4d188d4f77556d93610d3e9264d86654691b58d8e3ff3873f444c14ce08aa42d2e63d81c96d5fb5d98dfbcc0ad89b670b3d3432cbd9fa6d00ad4f0742d3f5031eacf2ad69eea7c89cfe872ed01358f069d148a5d1db95f93ca694ec95cde3f0618ed458dc4e6580fd38b291ced236f1d02c98fb3f2b0a7420a1eab11840f4ce513f3c5ed38dead44e90706f04ea64bb5a193418d1879c28ba1be6291cf78ea904f2d34777cc9392b87b403bdc260f1195b7b6f61af3faa7cb4389556b94fa9ab379c63f6f1c6247b464e75b7a635028d1a6a545c3f8768c3fa345bc0d92adeb55503da87c6b7f10a656d326c4367001b6e1587bcbf770f2cede916d638d04787e90b1d75feb6580e6a5d034caa027a3bb60c00b59042064adda7ee969927789c0790937247837c0fbfa375b3952bd36ac5cd0a6aaf77c0d55a8eeb08eb568ea099a681d7c856bb681e1601aa03a9b0f80e5b46269f63de1b10033c54171a14dae81622bd01df35080b7f594a644de3f0b7c79c1a1574f2c5b1f0dd34e9c43ddb66bd021fc0ead3781287f963e21f1701f949ddad010be045da02e93421cea97ad2fb40e4f2ead64e73f53229152d270ed4093dba28a13e649edc147345fb1a7dfb58bea898002b6546e3dcd2d929080c1170064b5c23c8533cdf19e6fb46130f8c541f9f56a4ed1fb19840c8f2cbd8691728a347636dc8679fd9ba9ef87a311855b04307cfb614bedfe476f0b0cf0ca1bc1a0386e9565a7fdbf751a1af55778e7fcf579c0aab9c8ff4b2aec5e1613e82d192123728654e4dc15f29d557d20e020c05c2170cb3c45f7950b141c44f85550b805b6adeab9627191e675e59390f483126db753ad40bab413262dba03ab73392217cb8f40e1cbabc551043d91fda190776023488879256d238d1f128cf7db43a1f90c2f051846b47135b115b79e807d7cb377987fae336e22d8c5646d96ae3159349f3b04df007ecf88957322c03a9be9de1237c8b866fe9c5acd20635e5b57685b7e4b3d142c4a01c9869e861c24902dda05e404420598f63031ddf4bd46f6796311006f91a8d5ad0007fe18c0fa2fa9b92d206f9512a0a5ebecbd65be653a547e469a62e60b89d4174af0f0ecb4f4a900a00", "52", 1, -397837202, "be80ba86194bebda79c7235ccca2cb872c36f02f4d08c3e89f0b2de08f1d5512"], + ["fc93f268010c1270c8ea5ff9dbf287c412cec17e1954270e40474530ae36e5ba4b6e8d03900000000001ac9553bab00137509005000000000165c30b5461030000000000000000e266ab010000000024e96f485ee735ddacb02b63e5fb88158438d8602d2292735bc70b259d5635aa527f4b2e2bda57a79429ab55696bbbfb4a328d403b6e8e5cc02eb43cd6ed79441eef0d618ab258947cf400282bfd4971192a400c071e745b9f7e6c1b60e385d8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e59b0cebe31d810cab54513021e1344583a1ee3abbc7fe5d200a646bd9c16da0b05ac51cb745ed5d2e1bd1a7843a2f8ef5b4cfe87e64d32f7983b68fa882ebd4b8df7d5d798e294572ed6ddd8846bd087667bb52cb947f5a1b00cdd833ba86384072daab1ca8e77c2e83a35cfc4ee843b0ea03bd6933fe9869127a16e17c915021a12a3e261ccb02b1728c776421f4201b9ac0bab0cbbd3a3f34a7c3c6b3591bb021495c35b4136dc553411f6840d825d87fd071c9b29e110f9cd0bba75a64b243e0b02676c611c9ad96160056c5794c3a89e9a15b0766ea1b2b157021ba3ff5ee8f84d06f607ea4e4a5582d2a75564b2b0b9ea3589eb9f2e037564a52de9d3d9895a0210b73d9225b10ecac856ee36c00cc6dc434e3a43aaf4d7862a32969b6f1cb1870308170e633c9ac5fbf914d71fd626dbaa6cc0e3048263d6f0f194d5d59bd47b9f0207af27be79969e1a161e26b94606239d767122dae5ade0b583434c16d632ef2403253d74ce33243c148a088d8fce0169b7ffba95d4b33aaae634d12ace746367b20204678df281f820df6d39c70b2226c7e937263fa47fdac820a9d5a49662eb999b0a2e1b8a31a41f6fb699101b3c1f872ac446971a20e38b43ce4b5654aa31650e5f1e01e00579915401e53d9d121beb7d123ca01bb92b71b695ce2088fe148489188a9e28930808af5752df91121c6ccae48910bfe06f8a4c479f2cf692fa5c7da18f0543df6e215644bea63a6df28c058513fb72423b0398292d74671f0ad3de35bd4f50e4876177543aa0fa562a757c5783f2dd714e447bed9462e7752c33aad160d9d07d2bf392e37c39d11e3e727b7363584569ab4eb8dbefab98845508aedfa49b785836686ef02729f32b6651af45d248f6d581ef2640e7ac0d01e037bf866403cd67751fca469e0403b331a590e21a8355e79b27c245358ebe550002e54a19eae354c3062a2c9a1fbbf23e9169a830cdfc8cb06088e6e323b2bd9b9e65cd451fa2d205d841447b3bcd5d2fc19752acb59f8daa6da1140e6c0259bde05ca9cd3b03e20d46d5b1edf3a87a6f4a5f60a70da6f3a6ff13be24b435cd89d5f527c6c24351f075773e6489acd2a12d23806509c85f21ff5f7023ec0592e402c5321cd2d13955655e80df0219767712e0a4efe188c387f5b47398527bbd9329bf0a6ff8c660b57aac2a65e233ac114a95123fe3d98b7f023797d3ba6322ab2e9b8d5f54237b1e009bbfc99a7c086e2ad2eb374d23f3b9da2c19d695b434c092a208da5102dbbc75df7f6afdabd1cad5b4405f306b6fa0b4884aeed331dc78c56213eea2125a8b430663f21c94a24badb999f83c245bf84ba7a826fa33337af21a3c526e3dddc6b01f57f812ddc13e5898bbd061d9f30bb8b27878ec4da85e7d0bbaddddb9081a8e26dc11bd73870e57c14d1788810807d288db3290230c3c499bf007556a95a8432942d16ae74f30a562f7314098de05ecbf681c716e7182df155a0768a03db4be44adc9b9e71641edee8df6c4de9e9b1c837d8df28139de344f087e8bcac9be263015a8c6fb922bf25e0cb74e0b1d55996b75a4c1d1f184fdad0a0509c571aa10880a00d52119d3220afa7266e047985c7d3be5da30f5b99f3a3e47af37d50244548dae66e6ca7d5c58e1febb1f783a96f5a16a311c9dbf77d27f7c11a2a074eb6836ffdcedad13c82aa1b2fc89a2c297fc8e58f9bb49e716fd9a43e03fb62a1ff4e947607c59e45a217e2889debb4ef35c948626386b62b0fe6cac325e5837fbd75985fea6a1c46f1955d2da18f237ad73e5bca6cdeeb5b5dcdc22ee2dfe618b1dc372553a64846137cb91a5b23f3785add33a9ada23de92db81157d52720ca188636960565b5d515551155c4a1b80bcfeaa763280955dff7bc87b75786c4edf01d295066f233b80af673dcbb78efa947617e5a676dee3e5f0043124ecda2eab3418bb6c8acb9537ff1c64088b090e70aaee5b5025a44383b275e8196ff04adc0c78a8ab6c0b078bf5b6814cf36997b425113a9e9712820469ad1777a2b0c75a9d5f89d4f6f202eebdf49d59efa6f0888c1f8fa7814940f2a95aff3dcfc66b5eb6d60bd770b4157d83aedce8811a1471b58ac2652d59068c99243574cdc16f0989ecd28b133b27ae71f140aae4efbf2d4aa54cbfcf3dbd25393addcb10d1c78a4655394409846ed41d721eaaf0264c77d327b21d81c40cca7ba95dd04a976175f7fca2e003eaf26a9f146ffa9128092b3c110045fa3c75dc14ed87a3f8d65fe6f04b4753c2f92507b531ba00000000000000007426920200000000c672f0649552a54b2eaf4049843456419cf014359aa50382a7ca4940a107b11709bcbdd70409d2e01e7d626c035351cad1a2031ab3e96ec4b20341ec05b04d763d4309350d21a3493ce498aaac3d1508b2e9877531ae42f71765a8c5ce67b524000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a93c6162ff5af4a68be0de55430cc3b3a0ce4528858b6c9b6f277d33632269b30b5d2c5284e1746f4495f6416273ae9d26ebbb98d9f596af9386c5cb056fc3fb80f1b2c97d28a4d21437e2c1cdebf6745c195988c46fce85ae1175c8ac0beb871a92586befe300efc112d895d0e31881702cb987a81cb79e04e0c98e0b24d8a02219aaa6d9f4ee0205d2535aa47ea2a426c722793135d0d54334032f00e1a2acc020ab65714ea3110553fbcf2914d4a18b868bd8dcb5fe1628a6e367ca0657515f70b07d53564fdad9ab6e36f1bdce8c43baaa4b766d2267b4cfebdd1b7be41d16b0b835e2bb5660a1355fc3f745001478e42cbc4efe7846522aefb9f08c5ae6074c3030e3264e6645f6c9438c62f6627d1520a76a0e48d9107359e24c8c212cdcdeacc0208adee4482b90c0364ac893ed0c09e87ce7f1ded8af08483f2e29268a45c46c703294882e68fb125135f6e6b94502ead418405747e94f64266e2f020b039cf92aa030eca011a394c11958bcf147d88232d28f73d551f878296fd3233d438d0acc61e0329bba984326b9241d7f24a1c20f43da5060e697dfd35b7330f5a515d7e9d45c9e3b42eba371e4f169a49055ecc72522ee4cafd41a6b5fd9164e673dd1bfe5edc1198a173008e660509856696a86a7b13a2d5bb10b952127533ed32223ee8ca97c9e8b22fbc0106ce0e51bb4c4b7f1703e30e6ff35ebcc78a3cb27a32c260806f302af4471ef105b4da667f7261c63977c4ac9d3c905524ce3e93911b0d7c14f24d15c6a66c03b9e90d0ff30ddb393e3616f86db19e054097c0f9ded4b5dd8c7e249ace0ac7c66bf703367410b2bbd6e54cbb97225e047179aeb80da134f22229da250d1bead15d44601ae8ea5914c0e43fd7678fb963265587208dcddda72796e64f3bc9c39e3339f8f753995bd84501a2976276519927ce1db1c0f5d13595ce88fdb522ab90e70649d96b193151f7f4ed89d3c16c7c96bc1b95f528982e8ff617daa037e7d53f29e2d02fa2dc8124236a33e9384062d2df4778733f7726fd0c96a60b7c5d3263499406baca511104026b173121d1e26b05bbc9fa4126c8ba09a2b0e17e32a98b017a0b2567ba107d7ea4f533ff336017a75e9177066b189394d71f8a0c8aa82dddf819c9e647ab735a04ca4bd1f9f40b0bd3a98955853e47cb2a4ff667ec812310ed14ef20b7ccb87e82f916b2ecad25dd5b90f554ac0e215de008a883f43149bb8547578278b703298defec8e3bb8f96f588e951466accb8a1a24809cd6c9d3eea9a43e4a5450678b6e01cf2bc39296009601c643f856921a814c64f4beb014857dd7027a780bea96650200717fce5320965fe7ae4127af1d79b9ed32c6d1cde2992d024c570c42a521d536844d6b636f5151df9c5fc505af8166db388d006497894d208c2d7d4cd0c51729dd931659b6652a8b6b2b4310c58381a34955d628548df977f0e1510823991fb78348d342d0364305cb88668d486ec7fb5fac94b67b852ac6508c00eed61a4b47b188cec9ba73bed136746e749fb7ea1f9e9e2d9f0c3bf4e03937c44f9d3223a76856b155d4d79f6bb287ea30a61fa13bc8925eb54814fb6594c1142644d67d541d7b045934e1a291a878a11eb37df254d38d022536e01ca90b0370fc52c0fa578b0bfaf238f2649968f672835f28d37e2d33fb4ea6cf4c500f4a9757214496a78a51a1f5e92323fd7bec6f28db5e82f52f0261a7ba16d6caf0881d505c0764413ef4035b737653a45855e40632b018dfef274969eea4adb9631bc9e836b4c9bbb8d4c17b5dd839374f5afe2e5591d45d3c7352df62c5ab2d7e5f7344b9993a982942df487200b70195f2df764aa1b24a968c53baecef5481235f0d2bd4ccc821f2977c969a22d6d5e774e9a791a01988f9931fb4fc223bfce593d51588f132baa18bcf0a6639ca3b3d65ca8d46c54f3a335e13e3d3f5359097754988089ff0607caca5c6bafeee4ce8b91b11a8bd0b3d12946162c90644bd63f125bec32e643c1bf3778e23b55b9202f72ef29c3c9f482e061a20a7420427d66a0504d64524083da069ca7f0eb7d9a38c8a37a804eeaf7ac3a90c1f18c789f7d1e028c5751d18486bda66d9f6c0bb6480b7091813057e1a5d3fc97f8bbd772dcd9fe2ec7a9b529629f06b978a99a392b3df82ef138cb7057e3975e5356e73573a286f037ab0ff819422faf08f0b66d9948e3243dc0d8301091c3c8d9b268802a9b6d1e3f84c3a5d5b1117f5e82b3f574e84ac115eb024b3b1148ce8bffd9968eff84a8ddc1a903e3f020000000000000000000000005a98258775ac33f5fd2a55d79126aad1da3ce50b2200254f38edcd873d597baa0f74e22e67ce012ef887bf08b80af5178feca914ce109fc22bedaac470d8735aacb69aa8554c1366aaef0d460da2fba314118e7c5326bc967f516357997a167b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084ce07d531901afcbe41c83899b014112403aa011586582d8ea9c24b17d62b9090d4680f6144a22bf3ee1016407776a09b933290d495e9f92b8c342c7f9fdb19c3d5ef61fb2635ccf8279927c2535265e327019e88f9ab00236e3aec00fff2e837a4057ded53aadf74893c8ff4ede84ae9b6ad3d6ff8eb2e2344150f22f9421b030e113f5994f4d918c0839ab6c39235eee89b33adcd56db835919df367e5d940c022915f5b934d03d328bbd254b85b934c1523d6d313302fc7343350e99c0eeb0730a0499d0e2a37d47a03f709b65eceb6a1cae6334d708cfc24f8b18d53bddaa59f23e5ffcffbd25e2aff8705bea49449e31645ee714b66fea13605a361180cef9ba020fe7cdb09c449030873365d751e830ece8935f32f965d73525673edbe0df1ab00323904eacfbb4d5b6129fbb717b51acf57d72226d987bf3d4b318444617705d1d022f8e627c372ae098f950df00f9be020d6fc6bd7b9729365f971e65ccadff7c68032f98e426cd93c8b9d48419d299274a9c8dd2b78c64f46344886638051537231902086d962945ecd89dedfab9668d92cf273673456ec4effe6d74c2f57eadfefcd7011114ad844c67b222e24afa5b7be3da1971313ccd006e9622c5a9e32e081d36d9f916b76e053085cbe686ff5979a31f84d867a44db24b795f78adbc7b65d185995ca468c4341c09f74d02152864b644f86456672fadc882ae058e9cd6dafe098f4e70ae77d78ddd587bb59758155a9bf106f74ffe07540c352172fecf82d34a6bd6a6efdb728294fbbeb49ee8e38fbf4ccb12af9c25d3a7a2b445f9f2695d979ea4698b9948271f3264684d6e8eb2b9b12c200bf6c11adf82a1180b96518852d05a654901cec606418f4c33bfcbe6de75d2d7ed14752ab44164664853b07d761eea6381d5c922b4e10388a52f6ee979d4f9b1dfdaa1dea89c5867ec466d09a502fb18c9737bb055d9fb3a1161b274edc83d5d3dc60c588b806b79be271be8361c9f37a2fe9076bf51bc92fdb526cbcafafa5f46279c8dbfc401b75df9075a0d74ff9e342a90c90b2d838a0c07f3688ba03c892be02ed1f636b56c50c9d3e25025d7427406f2420e693410014eb4f9b80c35224c14e13e5909a557706c84b25215fe352fa894e4daba04d8f8150a986809bce5bb7d7138423495f868de45e356428f8430bde1ea3bcdc09bc04281039193c1ccae54de3a0ee764b46874b828a8dfc34fb4be5262453fb32a26b934f3be599a38fdbdca2665de79f7ec4b5a80a22d97c8becd213786f6906541c810fea0afc589b24e8ac41fc99cb1de081d2ac3d75da20a1d38e700705ff2a19f414a45ef64bdeb2a8b92602c8779c3cfd36044e9799b0c2882998612beaf54d9b4b6a87dd7bc436cfe950d3501f070d1fbf155972a2e9855220663946d3ccfb3af344e8032fee049a6b5104119069932dfd09695df482087715fba08a5730fc79a4789ceb81b55aba7070dd8862537ddefd6ec0e6a894bd72fc0e1e4af2db1aac47bc94fd67553274e4517f17d8fea9da19b6b5eb2e7c38d20b60e899d4538319edce4090b80ed76bc639226e5eef4a468b081a5fe3784d77b327eb1dc64e614394c57f78db2d14e1f0301631072a685349f44daadb3e6b3cc68bb20c0fc6ba28db2cf4bd2ce1ded572b4e18aef81eb29b9b05ff7ff817f8c918b78da20fb6daf9d10e3dade777c3196e16687e6b8fe1f3866c477a47780228c809a202ceb81f9430d6583d6d06a199508c9f7635fdb8e65cc3fe31add1e4db5e07b0af0ba81e4b67913836b539057cc09752923e7279492b2f225a3f026e7a11436c2e85d38f6805cfc99d90d25edfc6a5e78711a8c624fee2bb8e442ed8e8b41fb1899ea3a77f67e208af9f50b06335050b862552c52f98975c7dfa47fa8c34c09fb4ce87189ca1d7e00b3bea313b3a0f16727b5138fa1a024705ac5605aced6d47e28431b8a447862a4c403c38673159c7ca3951fe2d65ce93d8221f3cd982302ebfa76715f410c7b8659fe5a834d2466f947b7b175c91f75838d46d84f21d577cb02d0cfba9e67e3541346289e3e772000f4c31daf8cff9a7a2f820cf6d515c027a311f3dead0d43d555c35163361d65ece6dc259ad1dea24bc55052c2de16c6bcea155bc6b2cba4cf6aabb2c61a20660c3ee75c9cc47d72a32f12af6ea87714a295aaf60d94c743af92e65fa52a5225401c45f2ca36f55db7aeac2490f7136bd5d863463ee608bcf4d3c70339b1988ad825bd43a97cd7b9dbb01a460eeac110230d24a08e6509b237c88218395ff9f4a9eb263f981c60b7ba13e33e14ec8ed4ba07d209035697fd676e72e61452a83168cf596d2193cacf65df8237493778b604749d680cacfedd508585b42700e570b3684338d60bf07b940a40894a63d530b53ae167ac077cdde02", "", 0, -1160665220, "1b3da39b478776482e83d201fa40234dc42b3fd49e753405dad947c706e3c27d"], + ["030000807082c403019ba8032d89e61c077bfb4b1fcef48edf4f9b7c5dda7eb3a7446177b9ccc19bc300000000000391183104e21591010000000007635300526363659209730500000000086a51006a63515365f708c8040000000005516a6a0065f0e96d040000000004ac6a00630e402fef0000000002000000000000000070aabc0500000000ee3b0bb2b8d9a0f60668bb44ef2715fa471aaa1f3683ccfd9395d33b7ae258fd7e1bb09d059cee11acd08649e989e578220d97c6a88a10de67236162cac9cc7ae2b40ec1dc4e9d52c59afa6f2a2afcc9d8d7a13c72f6aaa05704011d79157187000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005d529c9ebd10c4f9ecc9b7e71e68f2eaac14d5e07619ddbb7374d9484a6818c6ef7f797d60208f7b575d01cb8c7da9340edd584c0b8f38037f75a111d55efe5cf561a56fb1bbb9faadc3f9e73606c1f3f5f2d35310990a4fadde2d808cab8ea7236bf0507781f32f6a7f04f61c5750872a68570017f6b2e14d7d325edca6f48c0225b7057af5203675c01daa064964d566bff312f015f90905cad44d16129ba0ea0209dd59081d31131d8f4397aaa8c933dbd70f9cf9b9aab697fc9388c1f4729b990b02fc7ecec8a6372907c8c79d3a41302ae43329a664f103450033f58932001669c42e27efa91feaf54f4a36359d6b55c8ba07a71979a6a383e60d7012ce49bccc031a310baae0d699a2e69cb12e939e9d062eb71afcdf685541fe8d483e3e042205030c52915333fcd7201dd50c1aa0d3fdaab968189ea800d6f5ba9300ff3bbdb7bc0329434de72ef26990115b679b1a8371567122c10f259e125cd863a36fbe05e80002287ac946fe2618687b5c4f04664c69442198df2b21be1be670714c013b3b9b46032117f8259a71cdcd6a65a9c4362764851fd2292ab8fedc9f021c597126a64b83557dea2c6ea6dca3f72ee754ef95ec82d5ba269363f0a430125079d5ddc95748cb5705a723107727e0f511a28aaf83a4e28caa6f6654838318810ff4c4708e9bda6cde04ed5ace6b876bd7633a0fcd93e9416cd579a70c5f80b13fd8ea7ff3ee1c6f835f47439a773e4c9257e5f38212535940f7e9034ff9de43319e171d3f25f66bf42aa428e53819c401e1e5c3236fbd2365e74bd2784995fb5bbd3fcb85f6664bb7f406d661e82d7b51799fd829bb193ac44bb8e207d911fc0c5acf5c315d40714fb31df1d59c2ab24bee64bcc2289d766b75abb9ca02e810ba96ff4c2db8a36e42800ccc40d48afecb9a5945416c6bff82fe2d261ba392823609af926d4e839b245673601d0c993480f24e9f34e750b92ddebd7f289c1c76a53bb7e187eb2e83b8e858fc95642b6f39e112c02d03b2c54cee242285ee1f05a53b69f5bdf3576d86cc884ee0105943bbae603cf26d992b0e42c2f06af8129beb2ec80738ec099e07837a293287afe3aca099873b42aa73aac62e9467434c2336af6902fa215c9afe012927823184a48fd687731d9d3a0f835e28fde82b9a41b55b27c073d40125471385da3a7dc869b9359e090dbbc46f0230fbc73d1a17c5d3649b891586bbafb884ec0787f89b614277a83c47998cef348c5caa1f225a9c264d3b5bbca6365aa699f621a74751b7469ab4b80059ef377177cd1386f621bd343bb1eaaa59901b2506c001abc2b567572052267640d33538db5f84b67afe5565d2309c5dbf59de7fd9db44c57ff4494b0e71becd5965e3e5efeae88859f853a8778fe7cf644c3c73f050866e32ab03847e244f1384802806358c35fff3af4db75ba6c51b0f84d1f24cd0c128d56cf952d51682d72b1b61b733df0434379b119fdbe1d1e719cf7a511017efc0eed2435721e7ae1a66587e513095128644b716076f7c2eeda05db819321430a5ef50616605d07bdc22c9e58e7b11ac126826982ca680bccfd86327926776d79bc1db7bdc84d7e825a389a6a99e9e9dbf1312a6123daf1a788f25a10c2fcdeaef247bbe0c7fef9288a7b5692832d935dce3afe9e66a0353fbca94c6f2bbea0f844389c0bc7f96e12945b29e51df507d0a17de51a6f4a7b65e21c6c33668bfb84b8af1add40c8ec70886d49cba8d94a5f3262bae24473994d281cad2d0a7812b864ee59c06c6b12257f09f8f6ed8225451bf732d714c0c4c81832297a8762d0bb717c9a0dd92e17c8308b3909784e62a4c92962475bdc815eaf6e1ae854a3c32ce0b0ce94cf42b3e5b177d1efac954f924e14eb3e86faeef29bccf61429afb90cabae09e6c5d4b33f3cc3f40268e0d4984f81642ae72d671b9e1b4faf41f40e24a485987ac36452216c4e947c0749ecbfec8c99c49f8c6e2aecf138a0d8938abb9d64f6b6f66453b36fef84adeff75e10b10ec16f28d9d1f9ef169e8912e95a27de90416b48eb3ae69f0c68eef45bf4401872bcbe5652ad61c751ff04c32178fe1a47159fa9acf4a957a6bfb45de7ffc2d5e0eb27136b37e22061e1e6f0399300a85a7472fa4de76c5c8d1a9a0be5631d23b693569a33bb6b8e8111043d5c0f9c0b71eac20a78b4008c5916cd72080d8d41d8256dd4df27a97ea030642a0334396a92428e5de978ff44a694a09d9607719239c1530a1f2bf7bd2866ad3f301ecc092f7df591d0f24dc5600834d62660000000000000000000000000060f0979592e373c82419655612b2ff701e4fe89d22ea858e7d719f000e4595885716aab399bd0897c04696fc717fed85656d1cadc9b0a0f791ee4c1da2d1e912a44dd529207cdd040165d229d4a9f67ccca42f94675da67186376ecee7224f4700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b5a67e5e219f8cd17b8e6dc78b49b93b2db774ac60944a9e195e8beff1042712c943cac31b36a48e0c6607389637fcc49e9cc12e9ea68d846aa4e83c45cbdadc20abeec5e28d007ed7e396b47cc892c2f2cd3b439e76c00e4ed35fc4e574adb253752bf2c14fee662ea91eb78ab3a238d48cfe4e8829f750faa9a405296f39f6022ab767064f4e968dac3c8a9f10aa63043ad64f9023b1253243db34b1d7e3e4c60315e7c04625024066765f20fa2d83ab2d805ce11fc30781386423ec208cd0acba0b021e1d8c627d7f743b039b66adea370b3b1b9a19bb0231bae120daa27f2b3c20add7f81dc230a8e90e5f37a8ae4b97b50fcecb26f3f4f62c5b6927347ef2999b022fbb9596f108623620af0ab3f426ba49687263b8337d428ca2077ee7602d6df20215932b4bd492084b0338bc9b14422199c0b76b5eb099a3065a8ddae43773beb3032452ff816f0fb0bbe4cc656270ea72d4478966f6ebf12261826be0ed8ecfc90c020b62c36aa79768fb950d6ee72022f1eea2e73bd57762e2bcb818df8e8843c58a0213f6b5f6c775e4b94482c79567a4b0ad0d8e3c22f8e8309927354836fdcd4a48fde4886b88ddadf6926efe98a7e6d202300b51f49a8db4d57bada25d2a9f5faa460f2aa730d207d71012938e7b08b66195be2e177a7a2b1ded14094e845f1af24e7dd5ecf249db630e126082e252defc43d7aea6fa038442b88af0bc07c4e9931fdacfd84d87c22e0fb913b54e30ce7becec7cf86242136e642f924f98a37a548950ebc15b67a7ecaea301cc609b09e3b669ab5230084963b5ba41bbe5d92f5fa4fc5e74ffd2bb8eaafb16051bd0695aec08a08f261fbb155768c3d7245ace5ec7cd9e5c2f765bd8d0cd07d1f1e4560488911bd1671b1e1f720fcb80d70d181e7adc4447f5859f4e561763fd9d01194fd2e2e78cbb8732631254eea034562293b30e0493273574a064c9c8bb9cfcf07edec608255d7bf72d4d9c28558f48102e1b66f37c039dfacdcf6c47977f59625ac20caf10741272c32db9f244f7c5908810742b488cfd065aebed2f3aed710e44412fc1db5a6a207930d9d73284ca75507fe8c921ef289ef4bac2183c34303a23bd17e74e26bc5f09b4200b3c459fadd31a308f55fd840e6b81b7c6531a9448d3fa5121be7f3da934cc09e6ed1f4bc23b9ad2c878f351b62d0c4502a52e3bf3368354c01db184545926cc9d3860765935f731b0486c615fef9b22a6ecaea755cc97d639103519d08a490b5c63214e506bc398e105508a8c8e699d26c0af50b2c11bca0b35c8b6f2186ddab0eb812ae027f1739569d38f13dd7b6af75f2d03e155f6a2169cf7a48e59354d098f3b73f24df92598d7954e3486cba7918b28fd05c798af7fad924cd65874e22e7b59a2a8a74123d31fe62268ad3973ba89136ddfe00e530a98016772344d1bc3452a4657a1952685b2771cb4b7f98c41894e4fe6c82e03a284181e207887cfeccefed5c24b59142e4e1c2ce8330e5cb74472195ec6ace5d2d3a252f0377c0081a53a45301fc663079ea36b23183bfb7a9e586a97c1c3ece2c681e08521f6ca9680aa20b9460cac681243a5df7ec6c469874624989becb89d0469e8c72838a410171c8b71065e1779752a8957f499334c365dab380919e181c76cc4aad54d2ccd242dfa96910aea87cafb4ccb2b4d114e139d16b6182af623673432d5db8ec5feaf3e707a18538bacd18dc27d9b7d0099e2d0f3cc2ef0ca414f335b150403f0c9f09f7c5827e07b0c32e1cdbb19837e3e36c86ba2341a50bc7d0ebc58c4a561989515d72e849de754e4997acf4670a2d7b18694f14e6baaa77bcef7350573b18fe694f5b88a3dbda49dfcd34bb6e8a16ab08aabb7330282a256b8530231da5fa5c4ebe2d31fb122ee4b024a93c8d99258d8992da9bbec465650df044b518a16afa7a2333d6f5fbd69c3a5870ebab53c85e697ac2c1317e65e8cc680aba82e41df81d19a8275ea36db03c1e57175da3ec66824f1fcd70e56030326f2a3fe154af10296d56b828fdfaad2473567077783a5d4f2df0c3e19dd66d23edac4b14e3b582268e199ad3ff88ccfbd566e86c60e300506b8ff2b0f9fa4010220ed39d2cc5d6d203e6c67b2053e99cf6020bdd5ff134d09f46f2a733bac37be0f1e3fcadb2f1d6ab8c6e43a99b692b95f29adda899cff9ee7faa49b1c2fc4cb27d246239111744e0d27b237a7c7ff55eebd0f5c32a11da72ccc912b3a834ef1baac418734a2d4bec4cbc355ca57b9f51740b4bb527de0961823d88f21d625587c48b041bd622320e2e96d8f65911cc006e22673ee3befa5182b3b1946c00e63865495896555740de93768bc3c538393ab43889e6b33549b2cc04188fa5f18a1b294012d4766a45aa100032074c8a4a569945a6761a867934625400e05", "", 0, -1662352455, "f95b87be5d4ff8cf9dfa64f7c06e17edee35a5c0736a8ee27a75fa32dbd6a96c"], + ["3620486b01190a24bb8acd712a8c10e380ec33439e6be40706b6a72ed8ff6c12cd4d1a63b7020000000600006a525265ffffffff02606ad0020000000002ac00f9366d03000000000153068a7f02010000000000000000c9478e0200000000c034232a2298edd9480faa951d2572fb3eee9aec751e800410fe52727ba2af5e3d24ac44ca60f90e9510a15d13e33ae30a71d5a49f473246d35c50083188f84ab0ac6d2c5c23f95d3a7a949ddce8ed0c38e09e11aff74dc8ce56b2a93022be6b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003124168fa14e3dec88988503e12427f1a3b692f1bc335d289e27e1b820cb78f8d05be2d706cac7e790be50a99d6f736b69dc78d7910330bbf8c39f06f9ef41fc4e6a383808b16f6c69de012b918c0ec33c9f7ac99fc71f44594897720ae2809fe5811e10b95273e6df96d056bcc321e27201e1fc0555bce375410198214e1aa8030e9de306b99a4a21c95b6b209738f6dca4c83665abe024b7874c6027c00de4f303003f0607876e24a937562a728d49dec955f85a89ea96a26f74baa52b7c78b6300a08ba03709bc97131e64cf9e3707df75a24a0fc497997d359a243f1a625bc950d3601bb7303a32ba9b2a1ef7b155b2eca368152a0c86f89794899f895e9ec7c560307944818bd8c9e5512019d3f75bf82dca950235af2ef0b3079696f860b8ec2c90209bb196ea187b7016f7d49242f6c9d802b975b10b980bd7c4e89fd1c4a20dc060216b695864d3da5b00826645a181d42a302682a721138026f86bd42de01f40a5b0220b3eaa8c9404d437825a4da7fed808defadb17fa58415ee732c32afa69545bc02121549bc7bcd56be8fc3db70d1457f1c3a04433e2623db60abe856c83a3ceb335d7b58a65a2fd0e2afdfbac483cf9a02464e230e6c19ae260448978ccc18029124dbb529fae8ca0b12f1a2f40ce0ffcf0c08bfc3af1ca30c9e60b33ddc8d74fab5d9dc10c1beb5de35f98a344059413ebe4d3a6ee2f76b452cedadcb760ef87a94a65ff26e4bd222b117a8eec6623ad33f4b6963b717a2831b710441892a6bbe09140fb88e96d73e082a853d3bacd2ae95a17018c111578d0dd3ef299a2c2d0bb067fe64223d25fda10e3735c7c689344df9e0451a1f3eda070f4877fc5242e3808bf502fe1d71e991d8a65b0d5239a31e60d73a6473a644a638b572671946a5f375401b623a3ce3a6a87fc6397d8955eacc71aa2fb350e65005985cc20265fe0af14a8da228234b7ea1d5c839672c1f80d048a3c5b9de95e3dc2898a1ea6b6bfe09c73981bd5941b228f5c09e3ac519d383af0d8e74efbba7a6a261078b1e2c37014510db364577413106de30e48e0d59663f21d787ea6af80aaa08941837fadbfcb5c979e6207009cb935f4ebf98a78c745ebd8f36e3ab21c953b4d2ff3585ca75efe229c62aee063d27825a5ca867b7b0322d66a56de43e52c0d9c3908eb2459dedd81c25d21345d779509545e6d23e4b00d42e5292cbced1bfc208705d87d423120117ea9ace26cf490ee04f236f6b315109dadc7098ad5c7d6ad32bfe4e0fba0556dd414bcd10079b39b4383520444903bb227b47579865e1c5b699ed524a7c7617da25b62e995b76432937fe341ea9d0f520d3b3f1d0805261ed654310aa43385cc11d00594e4a3e6e665b786effbef686162b343c451cddb3aa1f557cb3994aedfd02bde82c39b64527f16bd0227340d2b40e6ec2d341c32de0ae6da8feeea42a9556a89001964f1f1868d1cda46190495ec89f82046cacf6de4fec140410f75af0afbd74073806e219a26eecd8f2220ee07a7815acb6abbd9862df166265af1615f16d2b21645272e93193cfbf83413a7a43606271769fe92986803487e6f0b85753a13afd11bb29516fc4329db07db126bc6c67bb8357a1f427cdf7875ae7113281f2cc3fd8c61a33105853a1df10410da574f78bc7ade975b2335797b594ceb59691ccc5ef2c2f4ea5586db86fb6b6484eed09b2f4d7eb04692743733aa5895a1fa00a7f480a473ac71f577c2d98d7510a438d39ba1134ac5ae61f597fa146e2c757dc1689718ba0e959fa961247318ff12673f756308000bfca6af7322297b88a9af369eaa9dea83bcd7e49bed6ae3ca6790341ff3732017f6dc5a2b9d5b02dc3256d53b01e7b44a5a34d55b61e4093d7ad6257d0f1c04835ee6e152f08bed55ec8fa469498b410579d04d0322cdc3afe6ffc3c65dfc9fce39e56aa3b1a6166225a543cc287700779f7f707f093acb736b72114b2bdd2549773709c21ae0c3981e6eb8a0b5d4690fea2cbd645183bc1cf7b4a1f462ea5b2cc72875a5090b76e1a4f16ebec9feb207d568a3d1d5c05b255bcc2aa6071a49aa2d27b745a0901fd08c42c1398a633937276259ad0ade7258a9b3377344029d690e4d9bde46e832dbd06b2803f4321268da3b2c56113e32f2269080c478ec52a7631377d0d55b441ca68f8dddd41e52b43d56086f71b77492638d159884a8b4ef646f9c092a4884504a9b5d6ac7cbd01a7b168fb8adbe645dfe447ac68fcee2975c1a985a7f22f85de4e47814309b3ebe0d51b12b6764a274a82d630b410827a08cab8ef77cbfc94680ceb1ca72f6af00c827a34a682fc057149fda4f4ad817d2271ac3c9046e0ce3955b58d28a3eeabf3f2edd8d29a7471119de0e0d9d76ca36b5c9081d8f7459e5f73e1d2f01aaf1e9e29f0eb05", "", 0, 316849224, "c44d1ad006beec8536ea4afbc4115faee7575a601fce03b3e0e7a48b5ceb83b1"], + ["030000807082c4030467a75c399255d110187cb1493c6cc0e64b236a5357ad98266de0593d2baf3f020300000001002084f46c2b425516285ebb40bf009f8f2b02ef5c25c8a23cd0563b3fd68005e7aa627cbf0100000003526a6ae635523c9e67e45abdc0f48268cc10297afd8931ab9639cc0d61e09bf9052bc9dadefd8e000000000165f928c2bddf6fc05118c279a4202aaf283b2436e00eb544a35f9a900d405c6fb393fffb0d01000000025165ffffffff021b37d20200000000026a659d144502000000000100000000008293413800", "acacac51635353ac52", 0, 2124744863, "e5df625f2fada41063bef6a55787fdbb2155d5db672e7957b6e91b9f66764bff"], + ["d9d7237404bbfd080f12492fd863fcf204fa2119180d4cb8e6dbbfb7a79d0804d779b12f0c0200000002515234092eab7245d47251ef203c5b263b195bd6f59d713758e80ee80901cf9662dbb61cfe4b03000000065163630063acffffffff3aa55f12599bca45c8a1882395bd4fc5650818c358b81a7266945a6ad222436d0200000005516a525265ffffffff76edfb23bf5a8bbb8ca4b2ecbce6d66c0bd30b3b536b530d3ea56ce77b089a53020000000853ac6a510051516affffffff0435f3ae04000000000251523c50a104000000000253acaa2a6a0400000000026a6abecdce01000000000351006500000000032b550801000000000000000000000000253887e2b2c3c536edbf677f192f121fb23c53d4a93e6ffd63b362c3fbac47568227790def44b9403baec49f2ca3a98a289f4225690168cfc7856b61b3eaea33d152dc110b40a14dc2a9cb75050be2f449381985bd1ee565d58045ce968b547a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7527a4e35f83a7a23521242a2df1c6c3bb820a706869659283fddbf8ba720652f6d78b3d014471a411720925d59a3a498debf1b5ff898036a524a577f566adbbdd9c195f4ac6fa1a18ac156b864b08edca25f8e0d34510fc61c3c3527fd6af6c6498be455deaeda464562dedff2ee7f87bf929195758c59218e179438c1bcf003040bd22dac83bb927e37e6ecb6add1f80ee67b8f4c7eb68d7da226da580d0fff0207a62fe907e376606672288412a3b61ebfdfa97ea64d84d67a9174e2dec51e140b04594b96741dfdc6833cfc6662db40067c5c771004cd9fa9c2b31d11e5e3da78d4953ef68eee54ea0d457ea2bbcec7be7a09ffc85d514513e1d0904273d298ae021d010e5d935e4ff7498f1814f936cf7bec39c0b68b00184ada94445e6b8d9a35022a0bf77661de60b946071ba2d29d6e518df0754bbf18ecdce31787391d75c5f103157758b6693882a8bb710b4d15d897bea5a8c61f9d162b0057a26fcd953ecb170200e3ac131984fef58a699f8738902a4558086c527b44caba1eee9e375f63a96e03198d7e1cae821f05c6482f13a083e94bb5b5c7a459e468adaa0125786eb52c6e4120ceed3c2b4660bd7fd036441f4433692c33a3b01547df9b84ee448feeb3513074d4bf5e798636a75650d517b77f63ada97bfcfa0091d34772585796b029aad3068ef14bac7defa27f326d43dca0c579df63c82a29fd6437bdc4aa8cae8d6747fbe700d3b96f1d365e18fe86a27ccb4abaccb9c2d25ec88d284fccb37644107ae71c3797cfd2f8e7d7eb6a008fe0936a2daf2feb2c45001af47ea4194282b9979ce5149ad5074af05bcccae95c6756308a55f84827b873f002f5c55da921a0f15bcbfb77a402dde38f48aa19908e6104c123baa40482ac394e37ef74b5a7096a660d29079dc32c2b8f2686413b3af3644e977c0a9ebbed5210c3379bb355d4e23a514c2b9b09aa145e1e1853ecbf8851c5bcb4ad3927ff6332c43654ba10ec597135ddeaa03175f3579113e9f7fd139587d9634fa2b69d67f87771240ba7e9a861dbc32d4211ec4d69417909fd78491b84a27142fbe4e135a591997c0f40882a1db519c607d5150d20b6079c8deb9b2b76a9e543e906a549e8f92574ee2de61fd49294ac85b7b8ffa826103d37a6a360b98d3a5a46146f283154286e53b771c504d1e7205a33b26b8db9d3211d4ab38a0317de9a4cda363b68f2ea12936807c3ec01064c33c26b0b66812470f65917ddf86b5e165d048a6831853059b643ebffaaa1e128e37ae899b5c3be093565ee0c04977ec83ed1da534904c7a5709f67e795f40b558e58e0f96126f9b3c47b97df612cf4bbcb182422da2ed5f60c38d73cf34a3674fba945726c9c1b5cccdb4bf753539f993f9c79e711574f14dd6a0f4f35fefc2d0cb53b3b53c7917052a446513de937f514642153458ff108698510da133df9d62c4653be1b147ec44c9bfda0ce48a98a043f04c22a27bc35fe44901824aeca26df85fe3f541b31d37879f1b65da32a39ff5e83b9681fa930c79b493f278681a0edfe7c6ca1d42077cff2becb64045f4830e5d7c9b7347b86cc1c0776d123a62a73c8945ee765c0a15da30649307ea79e60395993134388dc74765bd9ee0844c5d49c08d21d91a531c9d15a19bef6cf97b01d14bb0ec902af44bd3a876683771e5aec93f88e781e57cdb7bf848cf4bfd87234ea7cc6ef3bc3cd3038f8e77bf20677aa8be63e6947fb72cfcdd7283d20e44b6adab4b8920fa448632420eea173db6747675a2b41737ade929773612677e0020dd3f71734d7055e8d865e8f29ee2235ee0264e7e82ccff78fb19d2e4f0337b8e313ff8475681f5983ddac938e2e52881b0c43127157ebf2393ef284a719575a565734ed5410b4285646f93d5c0edd1841a668d4c872c2dc092d16b609786a6bbbfc8ff2dde8e91a58fdb578fcfd32fd0c5564ea19279771b712c7facdde0c901ef977fc2b3b9d5b35ba23126b8ac9c9cd76658a48586a003b26b5ef3e02b04c3d6bf7116c32ac822948b9950610e4d6576344d41cfbfcd08177468e161b43af1c46ff4b43b59d19a94b2a9e8d22831201028e26e8321388c841583706c6b17e0a28b9623b3e18a08af9c6c4b49fba51f7bf4b2f386700a583244ae316301eebdcb629cc5fa85a1aa541113d1d71bf0181c9fc69c9a138f60d4dee0619da501efc0e803df402972d1e12f1a5cefe5b510d49b3fd88a42b1789e3f6280fe7819144132272a204041a6084294fbf8e899a078e11742fa21f7d20e2ff26c28e3904000000000000000000000000bf57f066c5fd77fe95fea8d9374b5f3782881a720a5cdf07d967ae30f32c94dabb9235e2de79bedcca3767c324e497b735971fbe2f3e0365ca24ca3a182e51cbfa6140e6d5beb676ad48c40d25383c8db2c2d3d9d89f90929477a8a17ae8318e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e910523b5eb8afd32375f0b485db839cfeff595c2fa8e22763207d0d5cbbf81474de480c614bd8f33511055eadd1b92e2b4a77d15c427926fb8b1698031d3a199a95bc9e77d37f199272d6c189b489af9d041e121dd40b04c2891c0571eeb4c6aed33b16280316f5b3d2c4f8738318c742a48f5697d0deb00dee9f9d223b7224030c58a60da17dfc1b70696b086266005c3336b52aa6ef9bd9a9e73485788cbb3803003c3e215b0700ec4ab2901d50a81fcf7c99e1ccccbf4d53fbe97c17e9beb29d0b010f7175e68704328f7934821a9a1c94564fb039b2b10a4d13e0f65ff9b1f0489778068f6c6879a5f8dd031fd5fb0c83630a007be83dae15f3606593c4682fdb0225685c197f29b0f046c5107bf1de8a227ffac6b83e09fbe4e7a653c81674f8c803137700eb886fb870fd7981bb4012536e1aeb2633f99591dccfe0d6852503574b032356f0784cd7b4274ee62bfbae6b182d20ce02586a00954022df0d9cac5dbaa20223027c81364f40ffbcc6b046a4ddf4b52feaeeaee9023e31564a82b15052728103189b39ddd2b9a3ec27ac1abd0045054b7fcb4aeefb2830f9b9ef78c3f66a6a8c39032d3c9629b4f79ecbea3e2dd568cc20592750426db1d9eec534ac4901a713406e5119f8501ce026f854e181c62a0da8e693666a84a7cefb3d1dfcf0352cd0a04a4e726108c61cce59c06d862082b81cd3935a230e13b596d1f8580a96a9d5de1e990a21c648662844577687b8394c6be961ba525fb5105cfea911468e169b6fbfb0348fa551e2e9178448d32aef2a39c59940ac1043b27c23b4c74b2eb25dc8f6c63d4f614be78699382c592d698c575a48a722524120fe17758eb11e90b3768271cd5df2b6a63878d71dcbdc31f186a66374d0cd92b7722e1005cdff34f6172e76a20d72247f98de9ae0555b5cfeb5a8cb486337cd668d68a2f7d290982ba9510dcb472f5718a892697942ae42e845b27fb054caf369d5c406ef1e3ffa78265c3f349cfd99cf2039c98c57d78d750b76ed26d95608a8a2af64170902c3e76c0254b532ffc9700dec645b68ee778a1aa7295cb512ae4471817242a2893f5d57b2999264efa41f15151dc321c4048580388114465896dfe4433e156e882ae44a8d8454e71e97d1d8fec9d7fae39a5c0147fecb3441a94f653aa6fdc0bf63be3ef776b1bb37008ea416c455bb331ac5b63c21a41bd1b5e1b7d73cf6d398a678683dfc3b7aebbd8aad122b6e459e51e9a26de522ede0e12213616c0bbab09b8b5f6f9f21681a6309d728de09017553a55f03f79aa35ba87a61167b4050b01128f92879beb6f4ac064c4fb14db6de4d5f05be2b76ee46116986af915a3d1e8b8b4ffbf2e226f03894c7d47911d4db27296f895c3ad450eb051ad5cca1bf7a826894d511614ea5f4883736e6a882d92406755bceacbd230d5dbe581480f0fb57b91bf54320faf753e601cfdd4cba573da3ec446ebe69871ff2e62d068571dc6505e3c6fb5bc37b43c7f497cf10d9d5ec757e601dbd93d29a9bff15cf2b1927cca0ceabd692fd7de704c6c4dedb76badf5b8ac74db088b0cb6f6ffaf3200fb168596eda703e59187c822bc8ffbfb9cf66cf9c1fe77d7a07773e0cd5e775f2a546e5f88b423dee72c3774f7e0a81df4066afa507c266a79790e045bf5578179da5133ecd508b6e1702311cffeaac2706524f8a387a47571223f82dc5a66257daa94f55ff6c3c513a0a100d39c2e2cf1aec07b09f01a507e86d9f72e8d5fceb8c5279befb7e1c1fe84300e6ba2fdfe5e3556bd395ce3398d1d488f324b41a20dcb62a0b1c9f234f45397ae59d66646ab362fafd8b2cd5c34cdb0b71f0a7f7d20100d6f39b98d4d515ddcd8a180834aab433d1fb67925be194f82f5df187b1614c178a248561a573b01b1bd70793be137b9b5482ca3e665d1508de32c03a338c36d7d4534ab1cc1774fb60d5ca21559d1c63f5be57ca6e8f4ca7a466cec1c63990fc128f334442373c360aec0d0b434979c2c838e9ffc576f3ae9c795e3aea608c14f42a50ce118c2a833dc909edbb06a9ccbac488b581dd47ac75ff913601b0e297018625461ae3a96cfbba404df2d700b4e152c5634ae57d237c5a1d02873b1131adda944589ef05cc89edc1121afe66d8e0cb54a93f89293c916c2393323ce3bd075981ed15879172c711a1f0fbf0ef0ce5c838730d3f1624de90101a91687915de164893fa5eec7c0ebd65b11da309389294342d9b3c93339363cddea1254627b31cc585fc0c43670975110b80427fcbecd01b0000000000000000dea0990100000000de8cef50369ed5f34fc1c87acfdbf8dda6a9ec4f5d13638afac3c29d44d0456157ee17b9874ade41502fc375a1567ae5e96cbf3f2a32d590fdf3a3d5858c2b5c90e6f73c0d6d779547f10414bc94fff3e7b7859e95dadcfa527a1eb716a35ab50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005770b554a29b4e1a6b45495977ce260cbd27f7aa0cb7bec75e84d8e655b26c60e482df5b4141f001f5f4b28c978bf8ef39aa36ed3d90e4f5f5333413a60d1a0de6d273c62583e65a19d1557fe4d2847758665cd08d05cedb9199deb202b57b10d77ca7a5ac1833220fecfa502dead6b23ad9d5b122e08a375a1f260fcf373870228aba025fcbeddd5076db366d0d3be0551c944e2293b45aaa30d01dff040d32c021302770deba06e2b37db1fa71226923cdfcb33dd379a468c24fec9b78f6113e40b071b9b9403c2ea82e3815ac0d0e38ec4afc03e30e89b2befe2006ace6745c5e06731f6b83457513ef85e4e5642d7f262ebe1bda53be3876e04649e4d528a411402081ae8b060c909c9b0061600aa92ec2d0814f9aef1ab17e6fc3a3b5b583ccf090207a860fc4f065fdbb2e4b74f87c16600946a6d5fb833b3f3e0dcdda7378abc3c031576bfd6143c82b3173e6e2558559d60ced0823f3f2944e6f0c916fad81d1b83032e14d9d6f718ba97693289a4d2f2913422f8a78005eacb32ee7e52f3e70e20f8031c32b640bf8daadc04a78d10d0d16e7ba6c44530539a959bf9a91be6c168c9388a0d4c1565b6b89486cf5c9f2ad4aecfb9b07dd32862e0189bd9c3e47c0e09f4f1bf04e83c10fb6770a03ce5a6fc6d6e556051b5abe45daa0bd4fcf02129fb35207e4095480e66dbc99c6f01862bded9b0db8a7be2b21f122683db9dd2cab1c0095b847a0e2fbeb42e49041db8f248e5b1a974c2f793d10f411814704bd028133471b0534b6e34a48e0aaf7467dbd662c00686eecdabe69343b36992e55694db41f42eafbe83dc4698fcc1501e5700062be7cf539bbcd54c08e76d318881a869cbdb35bc445543b85239ac997869876e60a2454eb84518e52faab05e723da78f78ea04272f446d6b48c2bd38d0db225c43323cb76342f51eea46e3fc196488f2da51cdfeff65b752edbfd85e1f79584a97cf1e490457d0fde48d5df8c25dbffb147b1b39dd1fbd3a4a163d7f7ccb830cfcf0b71ef16ec811f999fe9dbe7707677e62144a3713faf6bbea3f8b5293e1991d27437861923d8714a0e6a63c93061880d0939448b0a260628addf80a2fe259e2312786c1d2fa7c59d031e2436a14021aa3895d61660d82dedbb581eb1bb03e413290d5fc1c233bd71c4db9a8a103d2ab74ba19a27d1b3f6881a33ed05189dd7f5137d53076fdb41458af4a2768af433f650552b63e03457d96cf6e81bb4e62a89da25d7428b0bcf2d0ddb512ceb0509ea30607bfe3b833bc192a01879c586ac62aec8e1c446a5da00f6f6c824391027ba75fd8480977252e96affefddd789e817d607f5cc063b25218c69001aa2b0560190ed891f7e000366c0f80f73d405c334d5ab26978ca31eff8d6798b8a124ef0fcd1a4bc872d237bb732baacbda5d9540e43656c218874f48a23db4e75a38c9d5a1a395c80595611cbb436dae83a2faeeb1acd48edffb47407c9d2c385d62442e2d5ba02fe4f33705c5bd4c576a87bfb3248608068624daa7677a8d4ed90b4404c769e5eae7d5b978b1731fd58ddf35873627250f26b7138713fdc6dc3e793c56f044f0a2e8a1c32ce1fa3f5b1571dcc29344faf25e05225d9bd642ca0eddee864f76866572827101847232c5f51b6bbc2b4d16176b7f24e5270b34c76bb2cae3e8f9141972153f567d4811c3e5bf7638a63963bc7ec50b16468e9b6887fea852cb57b4302e7aff1c0a110055ab659db044fff4bd49821891a82b96ae68dcb3d64eb270dc6231278f73326b8225a903085e2176f37f9f5f47d44d3c44371898023012034f663c73fcdf65e7b2b1acc21ea5dea5a780fb07e73802c025bcaecead79fe26043f02008a39126abb9632fa4c8c6b1cbeb0c14dfc6dac4da7423b996c87551771166913605a142b837f9dec24d4156a1317cada3f0d1e0837f423a9660b5cefe910d252b6bfd545567c13687706f468d4adaae833c68830126246ae2df38eb2cf292ebb110c261c0abf1ec6ab744ee2e535a8069b8359dc3dae67324830a5db1b1e4a239f1bc5561e8a8f37b46ee6157c435032237142986b7d0806ecd4381e3f8dce43100375c89519b74f97b6cb96ea2d2dd744cbf53f28a0da9bd301631c2ca61490767ecf9a123becbcb5eff3e9b36e3d707174acbafd9aff56e9cd1a9b760059b56f18affbb17629b131e5db42be4c710032b25c3bf069c1eab78bed3e6089d6a25253db03f4cf555c60cc1395800540ec1908ae599a3135350a23f3cceee8dfa074b412c72523860a912e1d9603cc19b96a93b8c8a95c2b1f87d565e247800f4476cc251f69169e2a27eeaf1387d01b73d943d1a25f831ceaee1df236426d4f35a24601f3801f888ce152efdbd83302f742ecb6c4dfdc45237e19cba80cdaeda66fa04ec14b976af6c03", "", 3, 1375209089, "00bc14874db6bba973d859b41c869ed4b785d5f14182d423fcb6b4aaefe15e1a"], + ["8dedbc0b0176665e68b4f502826e9ef3fa803483bb464990c0ade7d9b036b5c3d6373d87c402000000076551acac520052f22e0a560289c30f05000000000465536363189e91050000000002005135ce0e98030000000000000000c88d620000000000883442d290d6162d9deef792df29d081d75344c0e119946de51f06e9492158d5a43aa0303f7b473213489fd432cf326904d90bfd7622bc7d6cd46b9e39ca622534903c815fcb9c5e6b763ec22f1ce34e7b2a020df5fc884906f695bcee67a95900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e9a51ed5f2174d211600c87f524f6d714076c24b3d80676f6b42fffef236853ffbb998e53e0bf6c9646244bffe2903923c26c3c7a7d44535e36e154669ad971ad7fef56a148de3cae6092a462647e9c53ee02796bac50e6d512c4d97a316596d7005ec5c90ed57bfa1dc75d077462a7825e70ea5c73b07cf3be4ecd7e77cb04702115067e5c8a0082a07fa7b154522fcee574a8783092c9650cdec7a6843dab04e03109e3a0b1302f5e8d8a640b03946afe07e5dd908836c054b844342ef2c45fa310a05774c8d022972e0506811c6cf77687698c023cb58ed2b5b259bedfa49f7e1834cc60b6569116828456bbac78e58e18bc6b3008ee6838c655e1738cd3bb10cc0022676e617d7da28171bd4fa84d689de6bb33f48545f46056a31b7a8f41dc8c1500304e0ed2053db2167fdec6529a1c5e090c8db4a15369def6ce168e3482ea5f06c020bb962efb254d3713351a9dcbb82c0b39da70f8bf81d702e03f815548d839433032ccf0a826657ed7988e6d45b036259b9b0bf1e5ac834c066ef071bed0ef5354502068e8bd871b14e487f8ca8cc5ea394237def25eb40e1e7d329aada4d66972134346b725f9a25166c6523ae36149ed9a53dbcccdb6762e2a87abb82087ee6a74e9382a16c8d251e9c65b195576c13a8ba805bb2fdb221fb5c3d342b3ae1323d7a45ca4e4cebd7393a8dbe3dd7d500d135bde41fbf8f4e5c970de51ff56ae0da4933c273d72a994906b111539751cc2fe5167a1ad93ecc110fcff58a9285b34fbadbdfaf4d339c840104d84270befbfda9ecc8e5e48bff24d7ef1b32193b1c10afe8679d039ba2b5996dbf197c0969bd67b056e0efa77ecd3602d70c9a9bacf63d8409708ded4906a5485bf2b1ce9c719e662b2e3d810733d94df64ac71823648291f13a438848c5aa1c9cc7934d49dfd433b1047b28cb9a3a54557accf4c8bda57052d8da1d655a24eb235092c2293d9caee2758a54b5e40f8855c3d1b849b7902094537fe3ad10e9e8a69c743a2142cf7eb049098892f660bfa596eef64fe5298d50c490d1e86be6dd4cdf1ca2b25ed6fab2747b358e086e6f87c885dbd8219b0368ad87b5089084de4165e27a76f158f0a7242be146c75db2e8fb5a39f9478e6565d1f077b3d8c4684e726f6411ce56c0d2a54b26e06c15df6726ef4340ff492d314a3bf20460eb088aa25f18109af7afc0fad9ed3cabbe7bb790d63143de3f7378b2d0e132015d17291109a2fd29b196c1d689155f84289d6d9fb78d93efd828ffefdba1cdb45b763e63fcdc709afecf8317a72cc65193f4331dd9ec29a786d2ca293b8bcff9fe452eb4dc718fe69be27c2908561bfaf90b0347babda806e7bf7310dad3310bb2cdf8310b75d7b60965e4a12f933881af641676879f5f00324d76f9cd41ba385685c38b5d666933a0f03ce66df6579426068ea923a3cc3904ee885f2b83fcbbcf27570ad0f17cf0606bb170b0fe20e3ad6bcae855c8509261612ddf88f369b076e013c2a7c1c22cd5ec6af23dba33fdfb42998a11d6e7c3c63364a0ad5a7370e1186704823791a5da0b26f8605bd778846e3525242b3ffdbdee2a39a6b350f256eea3f88b6636b56c5c58768104da0bb01c9d29347ef962ed6430edc9b89a671578e625d6d6fc290f0e8782cf5013c08ac985e5a3fd13b40dfc87f5c54c28708a669f9180420430cdd08c81d550fbe281b85b6789c7e5cc04cdf24806b7363cd7a35061af66e0f32697bcffacc0c3871288b5e4151da08077779bc689974fc3b62467d610ee459249e59dd137f900a135ea3460c9d5e7e949eac7649dd20ba478b65ff8e096f5bc9e01f2dceed31cc8f9a28c335ae52038d6922aa42522a0064b60068037ab94d8af04b9b218df33e83133f4bf3dcd5ce0910149f7ef3ecd9431f1e057b54ce4c6b5417f933a965afa9dbf61b13b7608a78cac139eeaf0ead997969e20e56cd6b2d63cd60366dc965639d9c121fcf8fc13166b806befbad35e6fc5066094199a19458edb72a14fec67a8f4a4b8cce8ec7eaa66c2e4e8df3483e0b9cf0d91f4e797470f6e6d07c883a3bf8a80a003755c7cf0d4ef9ca2442f50b23d5468eb9240b21b9a435951067cac8756067c66900a359bedf535ce6f8818903ffc2c51ac1aa3bdb3b4ca6b5bfa90e02ff2d4e6e7ae1fb3c7a2642ca40f52c6b25629e8ec7896e34d04bdf751f1547b481876cf48bb4f4d28981375f75c5670c6e4ab45768a65bfae14e891e53036516d5fe1d42ac8f6c61966e4899699aa384555a3975f6c5f0f8bc60000000000000000dbe0b20300000000d4715afed16b9668e19e503d191d0e0eadc8d3170c93d5754b98cfb0c02452789be7da58c63bd1a4f6d1f8b327a387004448ca6da0f4e07ecc408d780dc362b661f94013bf3a0df6f6bb62354a1a505c6af52c8ea55e08d3b53b880c70c2235900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000373e5d89cc087123eb4761143b84f311b162bf26f7983b7b03270661a24c93310477d00cceb37653f71f223c0f0f2e81dacae286bff5fbd34da2c869cefbb50ecf0df479f0c8376fce6ccbae8e743e2a9c29d3b9ce333042574e0dc6942910b750f5a1cd6d976d8dd36def93b83aa23cd475107fab0f65a0629baf3680db04d50216ce377fd589e3cbc6a14c5f2e86a5f13dcd3165891cc2660e31e5f39c71f860030cead3b9abb82df47459a761d05d9f8cd31b5c4fe3cc6ec327408355017a8daa0b039cad4df276511e725ebc5802cddcebcfd761c802eef46c1a535aa0c894750982712d41ef2e66c927468d966cac73d38b6eb40d94cdef64af6a87019985994002092544dc4cfdc9293f6f9c6dc5f120d9bdab1a633ec03eb72e6ddd75b5d1931002075d55d84f47436a55b005e7ce6202baec8b6ec1356b06b5509953de8cea7adc031187e03557c499c111076d80988fd627c7b5f95d3edad457725d6c96629370980306c33670bdcf6de0ac6fcfbb70737bb51190b28d63e4bc609828e938b51e4e1b022698e12ab53dbb6ec8446a9fa32d127a8aaa037a10203b1122d654214b410ac57845f62d35cc1f88a877e9fb502c2f44325418a35ac714c644a5feeb6ea95568d64cfde60db4e187f234b8e41bce7380b0faaabafbaa0a3d40925bf0ee1cd1e97d08abf8056166186b323d28bc84d2fd650cbd3ec85e07e90932749d0fec22ea1bc3134ed4688390ab8e4cbca23a880ff1a888be3589bfeefb560d2451ef6ce4fa342be2cc375c94e42d55bf89ae96b57a3754854c7f5fc0ae24f1b977c4edd5a3ea62af59f3be9480e27df9b8920323116d7bedb6f41954eae7ff2219eb52bdb62bd0c5f62e562d2c493295f9f826759f70704c4731a483bdf5bc65baae302ac5347c82f2b81dac98dfb5d34ebbbad7bcf365e0cac33a90dbeb7f1536e04117d450fd842a763037634c3dbd9a00bb81342f15398b09eb22ca558e246d44ee36ef4be8018b66c67eacd3d80901d444dee1f51e82cce842210d24f90a17e6f97616185695a484f1bf0f4ade10f87902a66c44c090922d7b684d2a42a284f393d3429af04c06ae36f25c3462b2a6601731fc19f22097dd7394a892c7388ca862a6e12f70446a25722de48ff194735fa8cc82f620d5804951e7dc4582629c0f3f578b746645778070e004e07aaebac9982c52111013f159001420b352c45f56d52882a4a5f79e1a04441691a921a770b53f536f30b802759e70aa1b136c2a6a9ba2f9f55e2cb4762231c1946a25a3d28e744a358cd5fabaa39ce0bfe3461ad60ee1bf9a9f0e8e17f9dcc66e44e9e1a6aebb0b25ab19225cfe78fdb08cb35833c2fc6826c654808a2a8efdb4d4e00e9767bb2b8ca7c7b8e77e5393397ea55983cf1fdec253751565c015018f3e7913adf501cbcebe390990827d01093bfa62787d4e6cbb8cb8f70700a0c61abe58b191fe1865c9874b7d68a1602c0497be7ed48785cdad1d98b0c9dd75e23e9ab12b2f7b931e54271a2277600c70de5509888beba8e5495aafac4cf89a203bf346ee91faa77046b9169f57c5f7adbea610d4cfebe302998521ba230f04fa52589cdcb204d90b1f65eeb47ac0afa085afcb2a28808156501013344680ee74cbab9dae6b000567f1a7b2aad29da10cca66d53cb3032556a555994ad3baffb7ff3040f52dfbb23e95e5db7be2ea82b5d18a498801e55c99018027a032ba2f1562332f9440416800da19cda96f5dd0cc03566e4c14a8d3b3d3a3aac9a339a434ecb503ba25f1952ddb49db0560bedddeba3f4eca13425c5315800e3e7ebe88989c6989ba6fb2d4734a7e9570ce255bae36332093131bc2d50127ec610e1918351ddb5f9d91f53200002bc568106e09a6eba0636365556103759666ea5753668ac582b55a7d0ae1c0b0fdbe9f557b069940e45147deefe43c5e63fc223e9ddec509ffd2f921d70ec81a955eeb1a112427c41dde70c9f242050068230092d53571759f506cc02b1981db1a9da46ca8841f214948cbdeddbf9dab20a1c9b357f13bdca8f891148e053a7673efe9ef023437b176b4f694c1700fd8c010a6bc5fd585e261b2718499551798ece6528ab3bb387665181050a0be9c721a42b9637d1881ea3c0e469bf22879ab69a7bfebbbd7f1ca12070cd1a95b2e1af619dc8b42e3e868e43a0c30309a658e3fd27e10e656dcad7172294c976d16b7a77772ee842181f23ccc122658576b0757e9354fa62d51d327a52efd68d7119bfd9601772aacf11ebeb04ac2d12833c323c3f305000000000000000000000000516890b355d8704fca0aa01658ffcdd8bb47cd6170734c0a8bad2ef8f3c6d3dcdfcee5e5fd6dcd7c8eda4d981d83af8cfca29ec8e25e11fd06298f805f271eb4e1b355ffd1ff9badfa34c33bddf7207648c7f89db7814e67bfff80a18bdb6c6500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000851ab9acf9c44fad55e224ddae24adbc958aef4ca7c0c9ad162b4fc4fca803f3a3fb721c0d348f00c7d96cb87ae1bdac085222275805d705e41c69acb3b25869f7957943979d2b759d39d80fbe7d55811b9a09b6abd3612b02eb10e28d7aa102b1b506fbbd20d4d5f02e7cf69ea719e4910671abf8dc25df14b26e090e1c38420311f138b7479112285d89dcd17f03ad79b88436e9ca29a968c99bd49fb192f2940312b2cf393b1f7da9ce2131b6f610f65d372184547975bd988279b82574c3c1f40a06be7597db397761e367f833233f7643c70c6d903d7cca5a624df372a966c1f987e67afbc53c6302bca741eca5b4c5bef1f6acbb403cd64b5e1eb128d72672d003255ac925b7533ad70a2c561cedbc6cc5ef65b1e1eabdbe9ae3f6d77865d74b9f031cbc309e758f1e8c708d11a5a8df21315800d3064e13e8cb73347c32d202f621020e7b9c2d2fcc314bd432cd4313899c14dea86b428e7a05050289dcf34c3e86960309f1be91657146b208bc96d6799e4f26dcb11dfc2fad6e17ac5c4a1f0948d313020095aca10a57d686e7d71e06366d2f65a4abbffe9a3021773b1a76cc6a2f2226a622e72457d014c91b6ce4ad1feb2709c17becfc7536eef4ab2ee9e50f18a5c95a60aeafd0982c88d578e4dc2622521cf75c887b2941c7c8d30355abc413caf254c3079121c71ec8060fccce0c90ba4fe86eb312ed6f712a0aad131a5b519df2e930c27ad62d964e7686c7998e88267a12f76d02bda86f125fb5100dc6ae63dcf69f01db1a441ea4fd994b50998b9585b49dc2cef600b31ac7753268fc04008f35d0f7ea0e9f7fd98e07710d18ecdb074315f1be051e8f974782a7e693683ca292c5f6286ffe05d91ab46c28c6c06d64d4259bd4c04bb6bad3b240e0c8f9b2346e0a3ca378c1ed8a2b2bedc7cab7fba0c2a23bf0eecd4e0559b91faa50d437b7dbbbd5ba8eb57816eb83bc9ad065b63940f01d1ae2c2e19a746cdac33da1538fa50beeb7ecb4c66f2635d2d8dc4a9a98b20918b526683783e0f675a9f5f5e6a76bb89f7cde973609c87c70e66aebd7a629ed77d08c9e77ee02e2dfbc20cbe94a4a62165af3e1702679de54e8aa7dcd7d64c08f3c049dec10f7fe774bf7524ead1badb899311f8d2a310a5faa81ad8c787b8d7be755c85d974050a087a219f05ccae6dc210692ef2f2ccb2b60db91e02ef83f17d8fd4d7ec2711e414a4ac3dfffdcb0d99c47d1702e4660a9d7d90c10272d8642d7988f0926a54ac814368657f314b7829ed3f3b7f78f90a5f4fe38b02cdb938d51018c7578bfd92fd5c9e2cea97cc365c07a5118fb78547caa4abdb00df8bb02d6b60d2aa4431ece374a5f8247a8cb7046ef1eb7d9fcb7f1c7710059fc727527f99ba2271b7fff317a4a6bbce72169ccdbcb0ca54d1ad413ace4e99e52ba457721004606f4460332eaf38fd14cfe77064494d2992461cfacbe22a814c41eababce721221a697cc7e2371e782ed13119fcf6ad14295bf2e698ce01068c11e23f5fe2ee05b08b487f295701e739cddc53d9ee8a782ce593110ebcb21a4042e970ff0362e8b5b846e2b6754f5fe702ea32213dfee68db59ed5acf33cbdec98355456190eaa30df9718d597d25d1079f2873e46f424ade1875e4c7ba60c71143f5fa1b031e05364dc3dc3d1456018f10a65b2586f0e7490205dbc4a5cd9d43b4ccfa1114fcd2f155bd58b784042e21ba33fbdffa86baf319c7a5ce500da603ddcd0e5d737247b089d3e5a943921783cb8ec1e49b465c1c9511fb71a2ae69aa2945d1cd24520b75c02625909546aec9c58eb620ec5a21d11febc16ec7967b8759b203910c13853ef743d392cc1258fda1bd2b77950719ccb8f086a52d63a723c2f2219358892202d9c98a6a1ca64fcf3135113529d3e9d01889a244a677f229d733f6e189a1155fc35116fe4abc47948b8598d0b927e35dc70258b1ca0ac9eb5ef7011aa48f2df040b67a25fee7a3ae4608a7a03ae6f6edd4f71748da429195504be5d04108541a7d523c7a2348b178ec3d80b235e13a4006f218a149fa1ef1bae56a6b99aa21b03d73d3fa7400c565a167263bcc556b4adbbe5dfe3b38fbcfd7cf03300bbeae73a41ffe9fcb42cc28b7e63aa310790b5648589794ba4183dff8eb74562b7c5b0a44cc39a03b07a0fafeb6d54f894f7bae7ee286547e9756dbc206729f1f0654782ad0489e5ecdd2816767d81393ebe0a566731875f40ec0ba3da799a6c3ec866b77d6f063906d594eecdc310ed5413e1244fe884481cdf47d728d28fac55efb04512e746f9758629e36016f4cb99d06f7c170b62c4a205f5922c609d999d73395837ce5480bf01f5f1d0fe3e3e9970d85ff452a2d69b2f7c4b11be96390735591036e1e7a2fab1b2d485f48d481f65acf6f639ea3340256f8ff06", "65656a63", 0, -926391157, "f2975c44429db6a290a89be17349f68583ddf58725103f36207aa6d6de27bd69"], + ["030000807082c40301b24d161905fb6e5b84b66ba1f3518392d4ba36be02d7493041160cf7d9db06a80300000000ffffffff018ec1ac0300000000015258d3dc7600000000030000000000000000c4465d040000000077bb5d490927c0ecfdd97487f9d7f76f773f5e214ddcc26a370cba042ec9d63f92cf4a7e8c8311c19a558364321ee5f0b4eae40903c48146f4ff13a85c471f3f4fb777ce82c03803d0525bc5b7864dd45b870ca052041f27f4179654c62cd07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ed928df7b9849bb50aa47420f7eb5e1f58d2c3f7dd65fd7fc37c2d70ea302b35392312d53c5681908463a0510a1ffd6df0a27ee666394793538921b156402270d7b8a21103917987ef40ea042d7d6615a2a3d83d55af290368bd4e082faebaa2fcf2ad1280c920a4866cc1331691d64a08b0abe98a03e51acd5b6de8c0d8b2db032a3ad83041c40819d63f3f7bc645c6a94a2cdc781f1788d560a0036f593733a90205f3eb474196b6278f65100011c8ac4987d530d042841e220d85217263b038930b05dbdaa4429ab628296865f9e8c31029714fc19d094e3d026263f95c1ddc015469701cddeb9d81b068548c8c44dcef953f22443008b51cefbea2af190b816810021c0daccb16b65de1e00bea5360ebd4d7b8d7997708332a916c1186e4b86f7c61030d113a9f4a85e09fd7a2abbe9c7c31b874c8f54204cc39b95e7d1026de0c162e0216174cf1fdddbc796a977bd2757099093d0f3c3f883ad74ed308e2dad5ffa39202183138d7cb06fba0ba8dc4979783c8337604904f00825cbeb715694c8e653eb30216ad702913dbe2a951cb7f53489cb7aebeb1136e5e534df347d64bfc85ef6c3debd1860c8d79fb70dc1645e6f64e284d42ce24ec3c56df6c8251a69e25a87f80742aae059e9ed6fa442d2615203a81402739003e8c4a7bd83567e197e028203834f5d1c81d52d949fd5588d026332e7287f4081f825728908be666d06805d686c70ef9b9cb453acda8e512ce6a339294291264538c17a8da23a7989a4e4a5efe369b45948043bf4ea8c06525444c87bff19183c01cd656810ea3bd46bd858ce95cd32e32aac7efe75e434b26ac9d6c8190456f3f277dded3f85f7ffd851ccb6bcdbcdc3e1682aa490dfe67ae0c059a3ff6174407d3061e6822da5621189e6066db6aafac679f2fc7f7307466fbe4facf0fb37947028715d0aee0a1ac31239c076e0f8ecf844782ef2356b3065854fc91972f26375588911811bccd5658dbc0d1ff65528430ea9df01bb2a9f9de5e5e53103dd49b7be3cdddffc241064cbcb0ac09e644cf8cbd98ad18aa7853bef5ff938ba0b5d567d23dbce7d37e8e8596ddcd22a472f28e5af048ee4a0d2a74071ea965ab9f9902bbfaf99d4861717d195113ca11592262093927ca745c5dbe9c858cab268ae7ffc2d6100d1a43d24b11b3f9c0bd8730d974ef86c88df02cce4d5a464ebd158990a0e62cefa60100927d8aad35df9b84a6bec3dc9a2e25048e4cf656c8c1cb0062296d2b3061dafa98f3b14613ce38ff9f8f4c1ee87c7c20df6f8bd5dd5e4d52e0a9302091ccade8c49928e256715a0494c4d7ea619f9751f7f6ad4a284902b5e2333d8ccb197df6b25535cb67767e06a80c4a31cf23a5c373ad9758f3f6487ef84b3afdca27f584fa322e994f6e1fd929c33070802c47944abcba81e0b0fe132cf980ba21081f6043b50695b1806b7300c5a5fc98eef0e0fc32cb69e427635a79ce366932de5abc5008523f54e2547a88d211a2aa1a910fc4d4d3da479f5a29788641af13561e88ef867cc16cb608ffb7b0de617e7252c895b74ed8dd0cdf2c636c9577055f04b3800c5c696ad7adc5ef1773cfc8b89cea677a591136c22386314b1e871be7bc3e6b29f04bb936b5014687c73fc83d47b8fadc26a563b33afba34d1c7f83d03accdc13a71b26f9079f4f63ab8cb225d5426f36e597b066ae57f709b61c4a49c8d7c3467caf4a13db12fe1b67716c2f2e6e6cbdda2ac8a0f37d179bc1976e326bb3b9688972d07184fefd9ab334e646c26853878ee58cc05e31b885122be3b99cea3c86944e09e1e6986f58e7cc38fa6a28d80a905a7e554777e815266a6a884dfbe2b7d63e4ca883107eea4b3113aae217568c89b88fcfb988b25063b9ad45aec26aafbc1bbe9d615e91ce334b4fa7516091ec50f13f099f0c981c5bc75d6cb0596f1fe1bbd4d08af48c59585bb441dddbaff143dc308f7d9ba6f6f867de2737615cc9079097641a52d9a288c5871c69ccb6fdc08b4efcc4454627edd2614db2e9afb637e1153667706890c95a7f6a2d6bacc6fdee8aad9efd465d93203f6d6f8e268e55d4e7d596c25a3adb5fb40ddbb8cfb65b51e37ffa9e414c3bdcc2f3b77be0f833ef41f869f82f23225a2dbc9b76d0be03d186a1a972a73b39c245a43433b944da9ec8f458fa78bd74d85ec612efebf6b7cb0f929cafb02f726d4a4bd7d538879e33abd95e93fbdd6d181a902e055c4ccd813d0b1f2787b422092d3d217c082fc9599c5f1be99fa200c8fb0288e1887e654fbcf800000000000000007617050200000000b87a72bf1ede2645c69d9e0cd77557be924dc5020dbf9d578665f3cc66ec142afa48d33e7692061a72bec726f9b7cf466e4385361f60f2e00b7d2d458754368fca8d88aec60b88e68aa146adb6d9f5d251ccbbae6a028d74b9a790fff1936626000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009261500575b8da5ab4858dd14bf4b30030504ebdd2f644899dc6e30e5257682693d7ac2b308ad1b8de954905731379b707d780f4a0657a9466b1b7a6d068b07b6c3c2db0fe7481717169ad68b99dd6dcf3854363eec1f35cd5d726bca93d2cbe146d0698c8390940793d29a47580313d662fda4b542716b337eeffa4985597890312b2e8a630f47d89257bd0ad3da8556ed63662218867807d22732b78df54a54a0208a8407cf07b9183bfa895857b8a86e848ee8d208f12c8dbfbab1ea62c1fff140b000af5047cd3c0121423d16d3cc43d4cfdf66056769dd461057e3c25c1e11c5fc68ab17073cce761fe9bbf2032c31a6490887114737e0e2b814b4448326588e10303dfb2cf3fb84143771d812710f7384b5f8ea10c8b96436364c625873ff1bd68020088791fda5c9e47fa8671f42c8471b511072f6ab748abb1823069638e3e1c0c031673e4751a6ec9fac3ecf1715eb892ecbb900beb24313b03a2841230e5797ccb030c6a25de8dc29c42dfc4e03e10dbb655132d1b1b75081f755fa7cdda189761640303fc8765f245ae6f00140501d570a2275ddaaecf09efeb8c15de8c6697295317b330139d173c736d02b96023f859b5967a5838038db26803827c7dc41b5c192f284d62454a7badb2f1b5b6794afd0ae5e90754539c27f4c000df99ae014dfb0393a2ef520effeeb54f581e32a02130b4c1915fb135bbbb22bb862949ff4d9b899bf3f15265e36a13becfa38efe5fa802b884f87014dfc885ab0cfe0b6bb39cefefd845d7edc6066f6630af3bbb9289687f936ad4840541c821389b5209f25c0f28bfd5519100d1718f4a03ef250481bb6dd3511e10f96ff5d08d20426c9b8fbe621ad2ac486823b0565f186137d2693f6569bc6f471de6cd7491d070adb683752b8cd0a02be6b48cd51ca2149160e3f9ce48ddd3f506eff539f750e1bcff05d3976f552abc4c8609ec30bf0a945d1fa05f9ad49e835312662332771eb9d18d6ec166b6e459a280b8886a9038d617b3b03cf3d23f09150df3f279b520968471fec3c05ef9941c913cf7dd19e786535a815361190b6b00feac3d0fccfc78ff256da2237e2bdedb8dc208cb4d717540f3b2db65f6feb9bae67c4921341e27fcc2116218c501aaef556f4876206059482ae855039057276291b9b3b029554c4fe82d6b1454a4649b0be5548364f1b20d347012d144b1a84435d5c8689bc8394cd60d7c3cab65c7f83917a05a0a6c0a723ad8926240e92d849000e09eb356803b7e1d79ea7d1e122a2c9f476ecd40eb7f1a45dfa43a63c592b79d48affab11eaa02f399fa3c04055acefadc79297db316df6d23db04a71313109a5aaee6538867d5e521915e1b1e2291aa1c31efc91140538e5ee95e957d9ee1144a97c06d374fd670de50edd2c06edd5da85382d8512d26dfee81a13c06d99203eb07f313d2e69b86adc201c886ad3f6646173df17a246db19b6a77d47de6bac0a0beb01742623d653add295852137a577b4ab1ec4c5f7f2d28e793d5ae2085a2be578ca31ece947998334068cc76f18096318283a477a8e2aa28fbc0fd68ba07d055c7ca51561983ecc19cd4f52dbd359478b64ab0e34750330d635d3634696b2d752397525899a09adb681ccb796c8e60c5e5be5243b4ea8c932e21cd0897d0d3e83c83a6cd880f239a8bdf717e7edd1c66c96e66532382c42b9b5a47638ff82cf59388e86ca9b48b6924b333e247e596c0e6ee86b245e34f03ead491cff0eb1eb8170d5fd84e69d2279cff61269d5c062ab977e89267ae88518230d3d1a4424fdb47b14f70d4856133869cc6ee54f5aa40db764641941aaac1babf1859a289ad6646f612628c89de2281c7b52b15bae091d1805680eb6d74abeff11cb605d9732af647d5282829fedca92a5670d26910fb65e5976d0e2460f2e17831e4bdd9a3e10f312352b27a748c4e0f18bae33ab09ad3cc5a94d8dc2eaf6e76617592d48a5bc998cf7756fc50e193ca9c5cac735a91d9dcb96e168a0e92d0d39c64560ecaceb42174a26dbf94ebb1c4be93665642fa30fdffbaa08cc24f609dff9a128daeb9b30a7b9ce06bca29bd53a2b441c88cd4edf84c63e1306d8339fb0c82c1ad7d1e36b5d6c4025789079b0620850c9a1b77c93d5bf93b4c38f35df2de6213e0cb5968d405ef8b2682d169fb2feac419fd861742ac2d1ee48bf92939fc80a5cb31710e06e16d352839ac32cb86a1899640bb2723160ea6db9ebd915c748ef151620bcc9b8876c8c013194053e32ae1d771505d7964b7f96efb0200000000000000008ff8430400000000c620123994b395e18fa7595e4cc683a0bb9e5c45935d5a29cb1cbbdc1342f5b6f70c89fdf8fb7d3db76b5c9c97fb78af509bc6a2162cc2f3a1c439c441031c9af9fc2efaa88a019bbc659ca248566434fd5783d480f2dff103cf8bf683363716000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e2464d9a6bd8fbfada3e4b8ab07057224bf414888fdc3d5da216db13b99c3f33b3d004c742c546ba48c42fd1d35c4c0360555502338b657400a793e4d076a2660069b27dfe229580ecbb869c45d14de251ead3a9811a6e027295822e91849840a4168ede146b87804f4b567d6b65619b565254e63445a9fde8b1ddce3f8912b020948f97350189ceda786dd285d56db7691dc0c78063c5855f0c094d98549d679022a4dfe2d69feb359459f943b09bf055361a42df9d672ed067508fee2c8b5822b0a0283d23e940aa931d8c324b9a2e59ecb1166e4cbe14bf171b157d7378aa8c6ace7a929bf807d24d2ee66b2c807ee57b1d5a87db74f52246801d8beb6e6d6529b0327387d012bb4943c025ca699586e27f236ff686b562cf5d38cc8fefd4cb980ce031084284832e78d5ba12c7bc58de44bc8ce701e014f23455156518fdf5ed07994021182bb9ee10d779941cfabde31b332d8f9ce81bfc04f2c3f073ee46816097e9a032607cca53fa1a4a22f3841ba9e7a0cffd30cddce79000c66e647812dbb89afeb03023bd28b834cba88524d9455890bca3e5b90b906fe1deed166cda208fa19b33a8f44219b1dd75868b3c2ad7b6d9dd3c4d43d03d695f7f6ff65229a8b70764672c665b710a8a3e2171e2d7902947924c6183c9244cde492188af3182c43be7deb748205d4a1ce75e29a42b263b03f8ba1449661bf40880e0ca7cfacff9e0be29c8c0eb659c9857e18a3685875c919c949a681f73a22904fd3a9968de989350f9b7032a4702f375f82fe50d7c62784f63f9660bb35105e5c2eed329452b78a30846b3602945daa703c314bfe8852fca2585bc53f8b8561998b07a0ce6b61aa276c2a1fc571324d1f604d58fbdef1141acdb4e0d71a401f58b5b2630ca4e5902252f238569e402b48690eec3c8a32bf9b104a344f13ff5b9560e4192c352cd7d25933513a8108796f625c7d6782afd8d27f05940c495b15a8c365ba3e27e2322f7cddbec59fcffe986fe5ce0379a0669cd47280bc48ac9fcb858918b389d374a9bf61893c6eccc5bc47c2c01e292bd9caf3904eaa3e2c529702f6386d459317a14933717836e43089cdeb04a16a3e47632573bab3fca9ff68187fc42df595e14b08370e1ee73fe1b3db4a3e9c37c32e61cacbc5a7fc95247eb900520689f2e54619248159d52987849678f31007d28476ecd98bc6a3e7e880e7531f18041e65f3e0d5cfbb952553d0f99e555a8164f3a53b6540bb29a0072552537f9915eaee2016ff76f274fb20d3c96e1e80273499a5ea56a908d075feb9d3cd08dd67d06b4a378059cf34268c68c4f870e54ef3338edd4f77dd0c3e5b749e5a53b6429a354fc6a09213b77eea17303e32c3f2244dd893a1c320aee1b80d905d0def55288c50e63116483911cb5a0d77f2557bcac9f9747daf811d68c291a4715d58cf1c9d711b9c521840931fe916973be61be6162f63f9548d9d3a8bada299fcd89f845f5202108cdfa6a4961b432ceef3555c1cf141ad09e958befc4018b86c18ae12176087d8549bf3d40957f117395560d335f5e902333305dcbff69af5bee7e8de6c9d9cd7e96bb77a9bfb7f882ead22eeecd9824bb2c79b788fd6a0ceeacacae785eef1847f914e7dfe8cc52ddc45f65a09cb56dbe4f2718bd095ae1c29b9da9e43712f0a32216bbadb47506b57383c40d90cc7a9c75d41a33166d735cad12e8ef1eb8b57409ac23ca41a1e1ab5a33a6bdf4c559d68574c7d53ab433d679fa165ed1750590018365e6317c35f5a925d10dc77b9455afdf6590369a2a9d1f11aff7cd1511ea90ada7bec46032535917d131675a5aa8315b37c0c711abf76afe231eca34bfb4b0bf4a00834ae6aa7cacc3fb10697104b172c242bd3bc6817cd1b6ac526d2720cb798abe3a80b10e8a625ebc0afe0c050d9ea3fe4e9a8c7748d901f6414f27747203b56c458f14cfd3d5aae33e3a56c5278d17b106d5d31b2ea97242e2755088598c7b8f2ae90cfe2b42d7e20f986f7dcf840ff39d992a9bb67d57d655dd84e30ce248589b76475f434b856db5a4c145d3679e69e38b8acf5a29a89b407369afc317891cda35bbc0f8715f19c9a0cc0b743aea6019fde9ffb8e136f26bfdc049c4aee6b7bb894e952b6d1829ad76bbe9779d1e0dd4fd64941718c3ada02cb0c88cb6996c967c36bcf8e159830dd3ccc8bda57609b345694606ef3af25d6aba2cb84adc0ddc823ccfe3c83c07a7cc1123e527ead75d22470508845f86e2472b6497ff5f36d2eff80de304bfd3985259d5573d7570d09a2ef1985a966de23bba6f3bc96d14ca445728fe6282f765dc5270cb1f71e0c5cc3cf85aff3d67a6d5bbc0b03cd6f831146ac8821c53af6a1985a5b8b4b7acb7dfd98c588a4ef86fbac6ca61dd0cbe1c3d6fc22711377c6a6f95202", "", 0, 1659126309, "2bcc7d8fc0bee71c64b949b600ea85d9f3d625fac854483e81a484cab0cc7400"], + ["ff1b2b6a044f3bcd85c5a096b9aae80a79582deab72d80469d09b7ef19132878124e386eb700000000016aa2207910ce6c867abaae5f96fa1e1d768ab49fe06362ab8728663ff183e6da082b309ba502000000086552536365635300ffffffff264519f7f19b62c65053b147319c95278451d0e29a99c781c898fbc2b8734a15010000000553ac51ac52ffffffffea952c962e81708b2f7d840aa3133a677daaa94cad21de013908827a93fc64b30200000000ffffffff0425940a030000000002510040f4640100000000056300005165d9514b05000000000565ac0052aca137f4010000000000706f9a4b010000000000000000e6786305000000002ac5832ec9840f7f5ff924997076d691291d4b54c07f7ac42ba155e6c50ab7c791af0181f46d73e10a588ada8dbc179b7be34d82aafd6fb71af75de46fc517d9db1ebeba47aa148899a2b1ddef3e7ebc28306bbef3df84fabcb0297e60b8b885000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b07835c1832508549b867a9ff120505b637e0876684aa6343ec9c6c0f01f2304d2100b0b96c7f6381c9ce1c482e931b1214a9a584c1ebd30bc86ecdf0e248fe73cd0607512c6b72cc02b07ebcb02a9e2751dd977cbd48949cc9b27e9cfa26802296cbee054944739f2137ed408b5ee494ed478c085ed98ef93d46c13d40d9dc0305b02e58ee7779e191e91492f9821256eb839db0bee353bfe401f4ea793c4f6c0308ee6953895444aa734accbc2bfe242b4c77fc3db5e2f5761425bfe96141ccec0a06543d6acba6df03433800e356f9959688e480bf8ead437e841f13e2cf33bca6741510cdbefc09db962634677e22fac5bc4e0eb646d6cd1cd1c0e9222a8b1a26020c5b5861450c33e0e9c4f498a11e9b644d173a33b4680019303a305d88c583ae021aee4080d605e8744103640d9e86c5ab2fb28aa0f165a60064d268037129617b0200bfeee683dd308c43633be5baf69788e6e6a710be3e685cdc84f64908d5c6c5032fab3301038aea8f4a91bbb07fb3c22b77706425e2eea4052c77183e0edd1b0c031937b1d805c12b3c9fe41db416a6a79e1c9ebb938e776f6acc34d674d63d9fe6fe626c86c7d3617ca4f8631e53651a75787c2325f4f083d884c9e845a0aeba9ff3215c2d3abee73d384a4f34b255f0cc4c39646fd572d4f6ee958111be6e4350fb5932a2bb2c18525f7ee0925deba899b612b5e8c043765747e97fe740541bb86c3f30d7f5f8b5e7c5f2d64a917fa3fd328b3a78d6c2145c2bbf6ab77525db90164fd5fb6827fce6987cad1ea991738a6431f5b37930d1f00ebeea16fa6fadd891f4465d00f4eb9a074a94e211eb35a7cf8d640ce11ac176bedeb4dbec5338f1bfac7a51ab3c3eb5637ce40107c77c63e85099d536b546712f1fd51cad26e1ff3994b400b93426099a3d50bc1a13dd62d4e8bfb35575f528b155eadc5a3a0b1410389ccab6141ba97539ca2babce67dc857f5b394dc3d27fc456b0bbe15825f66aaafa741b6e2c9cda9879e1991eea9ea2ae268892b793d419cd1a1f9128673c153f0135b6d7fba94d79456694c39c45170347483f0bea4c66f64164dd2bb32597ba10845bb32d6212df15c6c7fbdff43f4b9b6948686c7c4cbd03754b6bb92494f7fc4e58b279bd93ec2f9b7ae0e9ac464e647289efa0b229393809c92a075057143ca09609741a8180f978a94f425eaa108b34206cd0516e81531fa64b947cfd780e3a4d4276172e1132c31a90e5855f8bc919a13ccc39872b506a67bf1dcd66d41b235c6fe295602124a388c025d555bcf2c7b19bfc88180b50e4bd05be2069103182f2706f962eae57d1dfa8c49e3f8acbc60e4bd176e471515b64c827e4242c6e205e96a0c6190331382804698aadeaf29164295bab9404fb17c2474899c5eab0611e34f47acfc0edaac0839440d4f55e5f6753fc7be5eff02264d3280a5e1e9f2160d6e32edaf765bac1b0b2ad505aa8f639c6a6433d2b2a0731a9e6e22b3b2d2cb8f47635e3ede1f39c7a52d309e4671cb37972faeebc039aaf0d915724620abc1aaaebbb6cc4a1782837a050dcebb3bab3ab4bd3e0c72cdb5e123037d28980610b298a6bf06d95e4a6922d368fcaa2166b8a39a6336b41cdfb2729984fad8a739995152842815e414f180eb74e39769b40d1d6c6531f9627c14cccc256daeb4cb52c9b96269928a7a68a05dabd44451fbcdb08e1633524fa75c83a337dc7d6afbe585f508817ab10d9c3dafe34ba0fbc018cf734ad9ae879cbe9ba4c0dd4a71e00e0752a365e185dbd8e19f570803c90e2d2ddeafea7501b774913225c4fb6aedd9c44757ae9f67044ae71e18fe24b965d3aa17400f3294afe992c2fbd2d6eed40c271462312dabd5d0927afd3f6b2c30a38355d871058ca2e0e465c977d3c6b8254eb0f09fa8f4c8a71e92d0c386c21bb2752d2b3632c23679108e0b25bf5e339d71ea9f70f19738958d0949f8919b6a778eefa7e29b3934f806167663af0327d8fc3ebe1b1e8271e3b16c34c0e96180adf3145d4a3578595142503be2d9ceb353f586a1879576c7980e3083dcb9c550f97eda139c206a4cc4695be537f9baeb79a193ffdc49eadcd54a89b71a5304fa9a2fd1031da97f026b4018355ce2b4f8a749164afc4ccc3d4d29ba6eddfd35815a3c22139775aadb77a974f62a7434770e15541401d2d4a2b89abef8b74cdc06e0def4311843e96c7238b0a26c4c34b1765d39c19ce4dcf36f0fb9033d2acc5a9249e5696af1c7f5fdf8ef88b6ea6dbcdc44ec3623cd73cc140b08077536634d930b397b7af7fd7c5bd295d76fe274d1932ae1d17fc94598193f60e6fc9a2e973442a6185964360413f3cc3bfdb8ac97e9e1556daab4a77a64518a40ccacf88290adf7dd6bc5aebc02e681856ed197ab33cc0df8aa99be02fefeaacce0b", "6a52", 1, -2053263233, "08ba895edb59cb83003dd96f70f73dc392e98cdb380ebf5218dd48e3f3641e0f"], + ["3544177f03df24e14819dd5f925410ad284a148d6a18591a60cf975bc35858cd07f47ea3340300000003ac5265db99f7c5d4ce21c71cd5bcfad390ba98b2d084bf8a8ba12e93ad0d23b154faa4703053c00000000006656a52ac6a657ceae35486e094796bf33b26e0d2deef8c4ae2d417ee30c7367bd4f848a5d0e4f63f2da403000000010056fd8028043785c90100000000016518e3f101000000000463536a5343436f050000000001ac267fa503000000000453ac510010b184350211bb2f0100000000000000000000000098e4ad320cb0cbc94843338dd317ae6bb2f24660a399689f801bb2f1ae1af65cbdfa2253a0b2738112aae8d13adba12c96d99d3e15235f0bd73d47e817db7ce301ece265d7507f96e6f55d97beccb63b0df2cb0dcaf91b05dd3726844fcc863c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022d64c5349ff168756c39c3fe7fe0141eb860b2c4da5d4ad964e796007db3cfce7b75831cdef598fe7d0276c51990a93b2da90c8e8f1086ed11daffb56186159cbefe3466c43a411c33e17a199ce6060d234e2025dbd8c6b4d36abaa8991efb2893caef9121a9354d76f382de488edaee845a3d3bd29467fb0cac35a77d0b7660318bf8d986f112ad66207d66d5e597506be66c3e68b88aacd889e7aa257aebc880217da2bd1db8ae1baf9240ddd9ec2e30456e5b900f1f1209a3a1618e8150c705a0a013097676ac0fcf7038f25cefc791c4b9a47d15b9077cfe288bd9f23789964bc625b5b076df40b061fa0eda9502646744106dc9711eb528cea5b647179875bf10229ce8923abbed79069cf7175ae9c17c7c7314bca6616cf23d7436a3b8c24a9a3022b31997410814bc9b98092550848c0ee511498d24befaadbb2f89e4ae651fcf60225dd1d08c39169ee2ccbc88ba07e93517b68160ddc209e36507ac02de7cc8da30201f4446775df37e10a6e14ef1d143053f5df81dc71b11a578f2f365c70458cbd02071dbd5ec47b4baf1e4eda7966648942215a8d8e16243896a3528a95ce786f9f3ccadf2e95d52559954881b0d061cddd19331779469e0157c870d1347599c0e27280f6b8e673b8deae6753b94001652f1a7f38fc914cad22e819c836841d3ba7b2bc843fc307a4a148ad8acc8a6b865a7c23abf4a043cacb4f71c5db212f36124c4115dffb77c414cf374301a1f1ed9ad839c3e8663b1cbbc44c305e22190242ef645c428cba628452ca82fa1ca3cb91cb0915a154650c7cef7d39a0565269a78b4f014e2f939f6baaf8cd4f4ff5e7c13a2946e16ad445c06415a4ddac7389055c3e30834211b38dddee228e87b883bcde18ee7add7a2652e3d6b1b1169f5ff02475ad7933deeb933cdd664ff9660e7e52ab5350ff24d14b1342374e98515bfe8cdb5d4190fc878ea5ade001e89217b3a9c8835814962ca1d6ae64483e7d3fb4bd9122b019284cc082433f537964758f39f7078a77e81aa717ed6e0b7311578773920033461fe265148d69719e2ac2a852e9cd0a48662e18e894098dd1b38a18ad5bb9cbaa1c93af32c08cb1e64317512a7f369e5355ab8c6cac2c1c2cd44d3387207fa31eba4065ba16ea11f573932efbe1d47c5ff542e2dc101931bab69d647e6e070348b0d41e0359145c0fd78e6ba9fb23cc4c684af85cf3b4ea7984e3b108e4b8218683e34e50f298a35bbe94ddb0007bdfd6e4725bce55ebc5831313bffa06fbc7ba0652f92e508e44530c8d79288c1cd83ca1307362b46797a2e8a97686042711c7ae811481cc7040f0835f67b8e0763117593892534ae9cb0aaf3d703f4bdb1df04a9214f83cb2cf96be66b3e6f12dd887d36f9bca89ebf5bb8588c7c902e22ff79f2bd78c9235480c115be2db91466ad1c04bc8aa2ca3028aeb5e852eba3596d510d5d95c007e5e7bfe758ac9e75754ff939975f922a4e0e8b62aabe0d587d9dc90d72b8daac29ff72e557d2d174055d585388e44b1a4fa0aae13bb7f15caf62ce1239cac79faa8a71ecff8ceb8d4abe5e0d5a898d74c3f04a9a5d5e53389de4ef7775665cfd9e1f37e9f7cff5d2be9d4d9157bf97f5e3e3523d924e4138315ea970f1fe553bbd2426cad437b5e3d325d89f5bf06c47480f0e1674b47bfb53b55859fe69cbf63d7038be40b76995052bccdb54ab3fe5055346443a44bea3faea17852ee22e07442d9ad28f0bcacc679d454ecf08458cf72f873fa671c931d34ddb87f96482d11a8b246aababd050a5f951d51354edfa4d1f05aea305ae90c96429cf694325a5cde9d49e71733ef1d8196fedda1aa75d1527e2a6587e3fcbe0af4ff0c805726478a0c4a8555f84cfa606a867b586f442d12d7cffa44664b304fa6c866afa8d7f9cb913a5edb7e256004c9a92c780d70d030dba487950726ba8796d6863a4d42d1e2a879e2a523b047a90c07e984fb0f43ca782ff12a28b359286c28d19473b63243faab01c0c05578ae5cf21476c24281e107434ea75356b3d6f557fca94ec9e83679ca704acd1fb04966959ba4c9116b21820bc252bee30449ed890b2e3057fcf44c3d6cb63ad560ae1b241a6f8914ff6c27b7103bca7f8934a4fa0b9799b2673b879a31aee1a16af19203884f1cb27de8c28a9b744f577e999925fde1bef672b1f6fe5ce98e42c186bb43d1debe4d28d8f93d41174d1bd58dd69a964a5fc6ca42bbe10d29eada9e2ee75b6f5aeef2bb336dae3425cbe3734e5533770c169a80f0dfccc4ac51a3fad5f000000000000000000000000000150e14218870348374d64b04754cfd280ee7e20f6f1a5d1bde30c0403eafa95b6396a78c63e22aba039fed420b7326dfb8b7e73ce3189f08455d42b23e0bdd617a89ab7c6d01501e1d07ed62a190d4619526c916388b949097aadfa6c7e01cf6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004aee330147d315993d226c5d7a6afbdc35c0ecd52adf7a10697629ec29b1937455146c7739b90b7cc8c71d67ad5da4928cd371bfcb813f980a5644417223e3c4d664627455088f21501aae06a940a39be80501a0fc4a7b9bc009213b44863ee20ef6238524605650d4955ecfb6f2884e56db4c6b2ae45313932814d7884902420214d62a20a71c3b7d7cfbb043f7a17c2d144ec05001849ce63a586030c0ad3d44022707367fee3fa75aa86b82f539f6d5e1421b485a15e3bd1bd0254a91ac073ee50b02c7383a03485c7bbc38f6c7011c0ae4859703d1d26b8ff76f2bb8591486482337bc0815fb6ae8ebe5b4430149ccd722a61e7cec40d8a2b95c2b0f61dae95b66020bc951229e5aeb9764806ab02ffdefc6fd291ca3a262b882fd48a9bcf18165c602215a854d196674f1d32fa6f6a80da0b9546eddff24ae169df81e61de4f53553a0203c59bb4e0679a65034c78fb1930cc8afb879fc2a2c4c522284a8cef52ef426502005d62bcac0b57d6f1c45e7778200b87e4a59f82bc2fca416bcc7c0bd5294d77021f285eddb8642f15c767f0da52b3241443be88edcafabad41a4577f25d7961b6d1b32cae9b609156521e8b11bd03d8a6a7ed607f722923f495e5a2a394a828703a4ee32cc046092b61eb4fd0cc706c168a017e5f98165ecbcca837695f311e1bccf5557281a264ac20cc7dc3032fd03cb700b927f31fd6cf3e295b38e4120f92308ce0bb05f8822154de1ddaee14e991bb77912eaf63efb181bb8d7c8683686e11120f522b4cb50d1adf95b24b8066f6995682362f1a414e769c1fdd84e86e44f3901a788fa106e37769a31ecf5027ae95fcf885abc02ad89117c3461d757151d1430e44aae93c1b52a47e7d4d14d9dbba8a86321ebebe343e01e48888d76998ae8df17fbe98169579e4e5cddae79425c6e66438f05bb954e60f6d4ecf81f1ae2639097a841017726da540a1d1b65aca9da30ac17fb8e22f6ff7bc6b6dda654f1fee238cab3a5afc471a2187f5b60595a72aad34c1052719ea4c85ea518d6b27c16e1f03356bc57d6ab39e3290ae9873c713196227d9d033c51956812848ef47af50fb4389bf6629c7c8bb37fbe4d9bf1b600d6b482b5af337d872978db0cd81d564c93e3b35fbc555776405c6de1954c3b64eb3afca5d22b4390d95b8564742fac28bb52830b1f331eff8f95134649ea8df832e2d51c59352c38c6869aba3b95bc563c72d9408a094f0f7154944878eb0ccd769bda6ddc929c6cc0a9f603629acf66b73fe53a09a60784f087272c79241c33c14d6545d61e469fd9ba7df584a19edddb981b9c0e3845f141e5b2cdcd4b87a169e4bbc405ee849432ffab4ae29bf672032e3f11709f745dee18b72e6ff743a4750992146044a140f71586e634a18956dd52a67715abb836d95379063eff28074b3b457d3592f834e38b39b529b7ce94e31da11b056aaa861aed84f75f1df3986dfaa2307c57b1601de519e930f3990b66d3547dca4203fd283490ae520a4549d7b40f9d5f2da85e27a6a77871ac921f16ef24707c50906feee1068ff9db31377950c176fccb9b88d957d8829497a8d74f30c8689b04554be5df785d89a040528ddcf10f3ace7928d0463092a415f958f4488eb1b8e87283a564a7891abc02a90c53baf88eaeababbe949add52e252edcf5d67c60194230e515b12c999293248ae296c86a4ba0e9b6fe7e9bca5ca5263e95f3ec5d1aa282e8b3297ca13adac91308015fa882ab6718494876acb440270d0e676462b055b342e6b09977b923d423c2b194cf15f98fceb3b46a11ec2205a20734eb56ff81587a81d29c1f36e885b65446c3c0428b4f279ddc18aca1584339d2f7c9f4fae3f4cb9a13aaac0a465ca5ba088187cc0c6377a5ec59939c1e1177770b552dc72c374016ea7677dc1aacf08596b3b96374950097c78815f236c11cbedfb04923684f43ee796e515f98694c987f8783c74c6e53f71e145dc1262d78d2c13128930fd67dd7387daed306dbc70cb68bc0e248905e56922abbb4ac037a4b186c1d91a52e65c08317649c474f9c7b364371de3bef6ca726f89b7707a5a30f51ec9c4086ef33800933221715ff19b2cc7f4f27653355e232c36c1d58cdc3808420aab54e0b85677afaaa90ac46fe06817010cf379ddafb99b15d03055f2bdb7b3f4163c5fd3400634a5ee009efba471578350f2e4a4694c315c90e2dd2db7a1ddd57d282eee61de8d6599e751ba740ce16dceaf8d610157cb7096cc579733082c7642e50a228a9eda0949772249506fdd7532bd520a238184ba63fe00671356c959edd4c7ca1c8d4b36ea1f76af8934602fbf97b36e6596b1d05d0fe08e1b7b53c9cb0886c4c8303a4dd9026eefff0b50ef75e904e62d9b09586dc9e16b98dcf053188b948009b8389a30a1301", "5252", 1, -79696048, "69cbc8571d957113502fa3949d6ca4633dce920e616ebf97875167b5ca119876"], + ["9fa04b3104c20d0abdba90864587ead82c48823daa611da2ffa0a943f66c29e4bbd406c1b70100000000ffffffffbe905dab49466e480333a9641c1c0624982db613d3bef8083b3eb70ca5431faf0000000009516552526563ac5365ffffffffabfbd7e677aea38f01fff1f76c4f2564477babdc0b9e4a7583e121f47e01fd17010000000300535267325dd0ab24656bb2aaa9ee35e1919eec9214e8fe933ccea45011101757d2d4a37c67110100000004006a6353ffffffff023e1f7c0400000000006cb700030000000005526563acac5ebeb38400", "ac6a655353", 2, 1079971704, "6461ac95bb594643d1d95090d342adb6e968b2585ed42b0d9f1ea10a4ba8aa50"], + ["bca6660c02d9c65b542551774eee379ecfcae61b88d531fb35e4c47edf587c17b703c1bd1103000000095352636a00636352638f15f604a02dcf043f481bc6fc34b3271c7a3017fc1c7dd894235b41fa6a6d5da80ee9d000000000056a65510051ffffffff01d06d210100000000016500000000010000000000000000ed78cb0300000000f685d1044c386c4791c7a7991801b3ec270529a67b1afec8d94ecbb4ed6f81a569dd8665f5d5564cd2164f5d851a941dba31f499d125dae1e3a03b6d97c49e41804690229321fa4ab89e3399b115f8f64ef3bd36ec3a79180fca2243e342834900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d8e4b000bfee4b3ab5898963c0c573157723e4c6276e521421d2dc9c7623d0988265e0b381f87b9f5851dd20d70ada78c1524ddf3ce8a85dac7ee93832ebec8c38d89de52446847f015c2e5097e76aa1664b39e969baa4367f72e0d3446bb7695203599037866d2b1d82b0bc21380b6b948a9f16ca1da582deae7ac0a83435031fdf76977cae00d8b77686ba6209598427bd0700ba3870706713ac15398ef4410302c9a33139d5a977721d1a84a950aaf6ae65050ab244d88527fe55108fbb413e0a066d1f9e266a34885ac306a9fad1a0475ebbf149a895eeb5d3a51012c0ae7bb32fedf1bcc3bd8d7825514cb5e9c9ac44de2be51952c6f8de3fd74bce878a791003142bf2d8825268c443c9683f5c7edb0a7c51ca903f8ec3376139f89039706ec90220fdb59aa4a3cdfe0920c8ba6bfaaa3d03a779d12146200c8fda517420b29580031c34de8cfd7a3d72126e133e4fc36a9954eb8363f71085aac2cd088690348b95031e1546d67fd389e7b846f0fcaa8a12c8f7994a0d34e7969c289f224a978c4b6703090f32f7903575c8588e2b5432dac32fe66b87c99c30f6ae1601bcee56154111fc4f2607da164c92867e6cdf900d229b2b532626d523941dcb29c8e0b1237f2f33aa86bd390b2017db35c50bacbd7ade359544940266bda668335cd3fb6ac3de55b5da89c96504b8c43db28af6f76c5382dd0e5f3602599b3e570deab2626e9e050a7583842078571016c2edecc9e47c6ca912a3616475a851bf4f94bbb9f9dbef15fbb5e7d8f8dc5cc50c274f55db834570156a6f32577d1c7093fa352ddcd89a4743e30bab97aa92addaded7cd697622163499af89ac0e3517176c300f8a14b579e8f62d54f2fb77f629b4a1ec63706d4b2b1686d286fe82bb40820256afe2789fe181f8e9e398235b764ded43ce84bcb9b075dac8b72296a7d04ed8d3ca8c07c8c2d01fb7b3004d0f38684a7b964bcaf437ae700af7d6cda06bdb289fb7edeb319fbe084ad6018d32eb194eaab98ed3ddda6967ac997d3b49468b907ef1d5d07eb473aa79d583cc5c3324f7fa396f6779bf0b5bdfb81ce54f3c92c4d25f4783d34f6de01d3ec256b63138c588b32f3f556bfe6a607a35f67c6c5aa733ada5da9640c7c004ccc4944303e64f4d7bd13efb055656541d7d06f74b87e232b13ff08e5d45ce5c020880580a57396e800a04c028da687320412fe402c3321391d7d62e1b0fd889ef16a171913bd7edcdcc519b696379f87eba1911cf4f007ba62a1338d32efe9db34549968976be66372d73e98e79de5e90fa66fee0ad6e384a96a6b9edfd4b856977183ab1c26d79d87f212a5e95ac790043d4a63a3cb38dbffd7046742322aec4bbab7f5b34423f5339eecf3e6c0f96b7b2d73b2ab26717f7f1f6f473cabcf07a819f847c09629baaa4c02d99a3aedcba4d333632eddb663ccfe926cd11598da4182974811132baaf4b32f2e42f89c23b87a247b64b16ead8e1fe18ce49e8a710fd38a6874145d85b314430591367bb4da2b719ab199378978558fd085727caf47f1101193b6238c7b1394e233719a859daaae6da7c6982dd9a2a2fe1af0a33789db1ca4c22e81a68149b323d9522f01d1a217b59120185269cad722ab5ed7c26830507f2e931b2588d5da52b55b5bd22918e6f7fcfd27f8e7df3b31ebaed9d7467891e35c28d20649700568ca1264f7d449fbb9a4820989d3fc9178a9e24753117a71687ff7798a5cde2f331192e78e55f91da5c3fa2c2349d72161f88bdb9ff222e4ed6acb80a74fa1baaadcbbca4dc1fe951988bc3e60b385ced3c4c6b1e09ca10dc2f682080fb6368ad0bcd3edcf81b601d1f0cd72d64e8cc6abf28e5b5da325eafc080551c2c18f1ebdff5036c26fb643346cf470079e27cbfac75325650dcfdc782dd8063c349da9efb15580282aeb6b8b84bde90aea2345aacc13c84e659ef20a380f979326dd1fdf594898759d319bf7efb7afbf9c6e64f0196ddc09fd136981233a3600c2924c3efe6bf8d08469ff416defc39bb9ffb8430aeef2356884979b21b455b3b87f3aebb4fa9b0f19d9b7f9ea6acd62847c882ebc6ec834a467d7e29c3e9a8108fa71e734bf01d1a7896debe5dce7061a938047eef78bff14d9184d61366c4d807e5adfdd13d04488306ac0a31c92df21ee8b3c2f5d0fe85478e535a2546640d0901afc994d1acae4a3c27a826fa24077418e8646838fbcaa4251d9fad6efdbcf740a13a0a44f945e2a0369a64f3248a9cd1fe21f9c9ea7ebbda8c77896cb12c0a900644e3810ca7c051769f1285555743f0da46018691d898822345294db2cc84490bbca9d6d2e7659a11e881328c4f0ece1f489a73114519b111a00f30a0dcc1c0f42466719e1c1eb7b138aa73f70ca7527af5818e79bf185785ace03c37e60ece0d", "006a536300ac006a53", 1, 1420116897, "aa0338443ee44f4bcec6fe24e696c4487261d35a0617d0c56bc9385c86ab8b10"], + ["16631349019fa35390ea542211a1c97bbbb588709ad0fd36f91ee9ae2ce93a87a572d08713020000000651516565ac6a63f338f8045027b4010000000008006a53ac525300638b3e2a00000000000852ac51526551510063626702000000000951526a656a63ac5163c600c904000000000652635200656a00000000030000000000000000da8a1504000000005bfe9464ad54083f2bf06e89829b84f157b3b3621dbb10367e495d2d18685f792525bf5d973b9c4e4bd9b6e63e17fa27b818eb9fc5ca340b99802db93a0e596e0a99897344db94a058b00cc85a9032e6f3e44184a6e4034f90a4baf91a8f5ff600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f11a23ca5aca68f3a07740f2ee4fec50a96e3dced4dcc5e8c539d42c86b6111324f3c7ad754120c06d12c4068daefa24018328e1b5044497ad682783e8cc499ab28bf04ffb9048a4f3c8a7a6ea7af528c60357ee517a664ba9136b6916df3abb432f8ff0ae5fb9ef3ad1c22682ba37c6d41145e1c9b330e0af6b67da6c8b314203142c81fba04514873ceb01deea4f65f30f8d0d8793b5d5b572f118a4f638c5030216ff21dd8d752e71190f4b7b27cfd801984466237a24e07bd76293f5e8e445d80b0684391cfe5ee4578809e855e4b6e3266d8f4c70a68e207169680cde7a928eb36ef75b7584f0a2299da9944b526738dcbeb7cd1de299906901c8c59f2c7626f20206f65b29ac825de8a0cf7b3800fcca83b2f9c0d65c96f8007026708bf3f60dd4020e1cea7cc09fcdd3952df10b3b3136b2d1b3c6f58ea33780b24375924a84e4c20311eee1bebf3cf290670f02847ca4bb5c41f5049b984d48e0eff3718b1fd460030205b0e46d879728effd6bf97431eb0472d186005c4b0cc789298056def20d5acf03118f1261a7e7c7818e8c2e600d6709df48deb4a1b6da055db0b718c7cedc932d098c6ba90808a1f5367df5cc59dfe9e7f6543950b01729132d1b42e4090d7f215a52819140cf51fe2da4819038781068e2feb221f90654550093e791d6d710c679b08f2685cfe6c90c6fd8c11811b9b2bfd00b964693a480f9839f4466697d151694ba89554f7034968321a847e4d15248cdce087df6b735d05b763795493d124fbf8380570aac41205fc236f24b0f1435cf7bf46124ad20036dc16c38b375eca62b92a57e93b99156de485555875ca1be00f17647c2a19d0b6dc97d30392afef8db8d831f06de1f4047102e99f0e025100ff3520a07bbc9c58722fabbcc3fea667259e24833eaf5e7608e1876cd46570821762a4ba36f2f71a9250558c38a5a208c1699390b514567f09b042546eba2f79e81c96ec3f99f0baf9e9bb8c11c420e18c7829eeca696797b555c8c02b8951c0f30893ddf2e78c3f58c00c41ec11c915b08ae36ee11afc1a8d234b98cb33063341f90b3796fb26aa6237ae15638bf9c4ad1b39224ed868cda7a4b398ebcf9b3bbecd07e032a280aadcc3b769ce58932c371384fe6e4aaf9b3e09c8efc154674fbe1b70566c562e44f58de2852cd3ad56ad9379fc52e57b3ef38955bd7f46090f4bc177e98b98b88dfec801ed6e31532a1306d1bd283a2caaa0249963afb0723af7eb8514f010f95c711e33a8f9e5666c95816efad5e055e176cdce607d6addbaa1054283d98a27e21a45143f89aacb31400cdd513334685ac90300d4a4ae9e3f6f20d0eeb7a4bed0fa14278ed1f7e67807d623f4335caa0c2fbfb5a82b8b3c985615ed1250bb858a25f8ae97846f0499b97bede1896f7c0995d3306a67b97c42a3192c1012e6c49bf0c792dd9ab4a60aab0d12eb6754c15e5e8918eddc9c1aaded0685c7676a084b6dda463c5943d13c20b75b964b5f093a8b090933dcd24b5b6a52283d223dc45b996e0457252e37ed7c1075cec44b26175e7f4cf55210fd9e2f78d8049d4ebfbaf10f759893e45bd7ee4e407593726f6e783a8ac676ade938f0b0b220224d91a037d58d9ce5af652557f8eacef44505f4a5d34e06c3c94cd92c90dc4d746b36d33ff28d6109fc63845423f4fc0c0fcb0eaaa016a69bb731e9cfb661ed7db6034bad611490eab43c4354ac25ed39d0d10541bffb854a8cb0809a54a1662bbd268f0f88c7a401e623826a753a008f9da747e46847dc7e924504f58aa30a6693c26f066cc3f65be335335d8e22cfcba8a53b3e7a2a147578404858eaeda035b1ec5c013ea4096d025770aa60c39b03ba49d7e9883709427838f6f5505c50ca0e5cb2cdbf959f7949983c4c8a59ba901a4852da37e7c97d1857ffb9dbb5890950f2d6630eb1e3e871ba3a7271e2b931e988c083117da84c490585994508a2db06f97ee608a038c20d137f24aae382494c8bc615114d3932ef4cbb75209cd519d7c7e2088fb7b370d180dc9b5b9b76d401542bb3112f0b7831cb5c4acc0e67264fc1813a9824d65dc50eaa6018d04266c3150753957f0c3e818c507c4c206bb99abfc1da3a584c90a1d110554e078090b7c6a8f543af676feaf4ae80d7200664380872779dfcd9d821f49db6a3652ededa97320cf3617ccef47dd541914c3cdc6196bd9e5f8be4a044368394e8e6c3d670480ff2db7085bdf8dea58619881c93a063975e15f2ac5b38c7818732c6fbd3bc2da483098b8e4d93b75c8bf9b0c03000000000000000000000000555e822470cbc645139d837af182c755ed17cd1b878b9198414dee8681216131fd98ad4793c8b101584f7c5206333a0ee7783beb178146453784d6982d9aea3e0e7cf955e0eeb5f8722aeb80d182f3a3aa88fcd8d07d2b49c9bd248c02d0f71a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de565262526610b6455dd6bdbb4da7d255e667595ace689c6aa3667dd12d23cfe7a88ad62fdc0209b16aec94e6cea4169e7880597fbc0144fbf63da98e0d1195f028606316924728e22f562a8d4f2da1780f740dd1ba6cde828a6cc7302ea014299a0489776937d8c7a16e7e03ef27f4ee56f30455ba3da2678a79d8d068f10c032ea517350543b378965317145322608c84f5fc5093bb2ac0e36b3d037446176c021f52e27c4ffd579bc2de0aece17f2e4c858322590a0f07db24dd227aa9686eb50a066f53dc860765654460f57a228bf378d19dcadc2dfeadf0c245b72c023b5887cd048b517bb61ea5cf2c383ce25692fe292a2c6c1fc94c5c555a09ad580deea6032354dab69076efe040022e149d792715afca33e7cc36ef7fe0c7cb6cf1dce5480302ff16e9300ebb4b11d310ff09baea08d3f6c3dfd62e7dba5c8414ffca8a713c032446ead1d20ed6fe034d138a0edbbe8f39aa4e7da5132902a82733eab1b1f7fe022dc173c3d2534d65fee59077318beee290ff397c238bf2449e4961c60393c11a03276618d139329ffde8e789e095e8b0d4eefde61fa12a406202ffc9c49f8c1d588899de3c7140586bb6ceba08c2a216100ba88541030f5b2bb4b771b59ae8319a1fa985f4a4ac0cfc2753a565d240c513fe9b5cf98b5810cb65b7890b61e370bfc69d3b21887b63c16d10e21e7de888f25ae16ace0bb4ae866d8d70e2677e2b1a40750716ada2eee9300405bd839c58f3f7d815f9d60015eae4870b50bfdb220224a5a0a24acb0987e58bf68b420ac63cf155bc0d57faa031501a42149dbdc236f940969b5a1405871e138812ab476a57c64bc5a7901b66e7e1622a4fce7509f49d7627e608bfecc76705e824844ad95a3d941c6ea83dddcdb71ba4f6e0f1b873fc331bf584a36b0ff45c19aa35e3deb98bd345c3d673504ac9947279555c058d90d0e340a74433f40c4ce45f97e16a7f3dc73b20f93b8e34393e2a6e1d41c9e60b3dfb931ac0eefac11507928a2a1e2b5e007752f1327d7fb4caf1856b8627e4ea0da3ba815a55e07c3e756d5da96ae691a079f12ad49231896c017e72d05993501fa976aa5c155599528b4a29d28f75c4f81b2d2fde4e2862379ebe0daadb9c8fec4c9c16814fc3319e770462b5746853d7057fa75e8d40e8138affc9fcab113de47675536fc408efe5a0a441a8960684158c6a0132c57fd12066da91d78294db3e990abb8b6c01787ddbcd38e8e47c84539ced4275bc36b4a72919480074f644b4c72760905d09d5eb66e542fa7ea1ff59c3c772655fa3cda8eb5ec32f0f013be247997f49cc004ef4376ab98a8d2f10f2ba4e42ce89bfac20b359b5cba8177dbcd98b2aaf53199a80dea5b66107fe92913de7a64d4696fd1f6bba09eecdba96dcc3fcf5d35f8ad4beaa4f4685531f49722d63c87bcc5593470472d00a6a1e82134cf8c2741aa398fddd1ab92fbbcd04fe332641ff69fa7f623cb898b977a4615da706420c09578db5209ba039b6e74d2826b013d1c1da55c223683de95ece1f98231a6deb98353e5efc40d478f945638d8249d790dc4efecbe4482c9f063fada8a24a53949e4b147c2177b144313b1654622acb2bd9681a256c0aa4d709484c2733444aa4f22ce0db9a9e5d079cebac5994c856923e00676858d7a388a9df79b2480d31852c535ba763226fdfd8ce686c8834df597a0f9d5875a9df1ff6f109070c44c2ad783d463ba24721292111951fce7c52bb06a2174a5068b689dcde9ce76e2c7b8934aa139938ad73f97ca9a0d6bcd791e498381251d9a34c9661f070f3767b8b94f2138e919ab02322b9fad0478b7bd061d1a0aa20055c499e82e893dc683f6218cc187f161279b1ef55ca49eb577a970be5a1916608c649a1575809f8817b50fc39d3cac020b354bd2a2ff487b0b3e3a3e4c31e688eeeedf204124e6a3506603419be8de69aabb9a6659c86d7629f0238c3050e0c2efe8835ad520c1acbffab86810524478fc90a9da5c0c594e118ae9157d3af091ccd14a652646a27926da8d6e75f6945d5b3924d15f13e1906ac78131e8b27432581da71890df312932d5202eecd176bd7889941ee78a53398e165c264b6a6182aa7ee52a339a18a1ebc6b7078f9448031db018043f6bb517f902e274e1a983926aaed017bb1bb8483e5b923b813331688013ef9f359ad7079cf27f8cdbce101f275435960501eedda68a6af9c86870809c91501742391979ea7f5c1b60df13e2c45fbbf5428c08ad466d041028838f36895c1deac04ea2bf6eb8f0000000000000000000000000043b9c461c84da40abeb5f4ecc574dfc7c72b2094907fb487596291314cea3ff5759a1f2fbcc3055390da5e3bd5d031cca748eef845f88ccb4f1f9a53d3f4a03e6bef6d5555d586e98c4668fc84385e5bbc129e44790e42ef6a6b96703534545200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000669a6680578f601e37269d815774c99022fe6ee954092da96f49f7011f2732b1731eb446ed75a0d79ce903a981a05a7091fbeee2cc53b1407991c67c7254c8613d7ccf9420ea51aa168a842e67b6f2bae1f419a0a5753b7cd2435c8ab583f76d6a11597ac9b4ce0778cc10376fd6b5a271042c7a5fe822f8e6838b3778c6320403181e57ef434e3c88d29271277550514f35292b7dbdb12029f04c5e2a73a03c9b022c1c0cd2c3c6ed57d55fb4b2e837955b28a0a8a039e523e76e118588b3c037e40b001c5c0d9aced6edac034a4a49b3c9ba8802786c378083a384d601367386cad9a106d2f15cc93837ad8b582070a30e7cb5945f3cc521a4e5150a53830fe0b68f022503439e222f5fe5f1db95971ab5726400a4d35fb0457212ecc027d51473a73d02288f864ec0c62a71a9892ac2f0f7827011d104d48f3151cfadf79c6aaedf1bc50300adf8b9ff7ae3a87fb72c998bfc8fc81576163f805a9f12178073bcd5bf001f020ed5aa1cbf052d084d78c28aa31558233096603b601b9a904b57a87fda1879fd0310716e8fda148f0bc29f3ba9afdcce703beefe962745d13b762be348cafb2ba705eb67088d2887c4937fdb780180c4c0aa47aae544017fc10f0919fe7a0e4e0f6492bce5af028ac7cdf8fc44b9a1906ce3b9b024d2ae7eeb4f751e46877b79ef6c540d215de5645e5d0af0067d0423e1788d408e2b08826d3865e4f95b38a5353f8b33e5cc2322ea3bb3e8ec92aac956bdd39fd04132775532af526b08d16f769819f355917d4d93dcf56634609168b791549e2f85f48a31f6c1b2a92667570c05fece9371ea93bfa1bce4b1ed03a9dd09ca5c0f3cc26d10387c92e4f4be43a568d6726c03caf2f040c9d718525e78739e5d6fed57da513272f8455b7ff4f3f14c2d218b7e62ec3fe525ce05119516f068e19bc7746d734cb993c0e3d30a452679843e9723d971851352b025a285a8f5396ec68162505a6fb41bc5b10cdd97bc0e735f63aaeed436b36d1c4d514a04fc31fce3e42565999c56d4d38f513369b3e16c9e2ece3289bc34f6d2e934ed5a299aa9351ddf98f3a12b917ae3ac5e0261970f6b37a07ee2c47970c27d1916bfdfdaf13ac0a35da3c9ebb530b2bff051c3a214af78a44fc0f5b7afa5ea713587badd7428e1767f89339f450fb37d01d15db6d8ce62c36873bf88f5531db858c8c5bb67c66e42494cef13607b080704d1e37b497201da0ce192cd9883b1d3400e8a2cc9a565af12d86ab4bee2c643e4079db072ced25a250674c37dc1b2878a7d179587b8f211e810ac4e87bb06880e2a3b984ffbdbcbd32609cb65939d8a44b8762140b7691daeb3de27b70b5a96e2df9b89473a4ade97eb3fdc48a9f7df5522e5525ac715959e76218af6ab3e75ceaaf2b56c5bb18295b90083cf340bc696a04c6f820a331e77bf62c1949024ec070e754000c0aefa4d3250a80f8643271dab69bf547fb64f261d404767c264a290e87fd91f98a485865913e63061da65335eb6411b7fc37edfd4f6f87dba158104673d4e5e8cfbdf83f087626988b24462dfd4533dcb676eef95bb0a1a7d5dd69b3771ce49ebf05539feaf0ce0a31484dfca27334b2a00b4f12ea0885adffbac3d6f49885923d7531e397d96eb5190c894e9b94c3bfb92659f294b635076d58d3ab9a32c0fe6cf1d0cf9eade29dc8a1e219b09334d62f4640a4f0c2eae0db9045b2b9197e84a228a5564ce25e0fd606762dad168d7efa711d77d32fdb07038c197d74bb8346a181c7775de2c56295b9f51225ab10fa6ace0b5391e435894759a687c0e8b9864b476f45afa257694a8b5daa12dd5340a7607e0c60da310d61d5fbcc5a5d596812aa8aa56a97f3abd7d685fa42e8e290e7373652f7cc028c71a4a1dfd8b062fe64cf100dc06dc301148bb50d68347cda1525054adb3df9bb2e36963719c2ce75ba02a0402f560311cb3e17ceb8e6636566a7ba670dba15ad5ede548fe3597f621f233d8512700b39e75a634d12a8ef370eeeb9206232c608d9aaa7abc32f444657834f302b5134e57672c03c723dc848b2d52c3c5d1beadb302cb24398dcf10e670f24fd381a5468a901cd771e909403a12f9f648d8fabdb6ad2793024a6ae95a6cba310a3aa80119b1c911b86870e02e8b4e2b3465ff7c8f444030b99570032b55a0e34b69383c219ed9a89f7a29c0b5d681ae58644707ab8ab115197b5206b515d1da50c09b82b1d36c3c6255f2cfb4126f3bda6f02b8158233cd41c00a36ec4004daefa9fd638c00de4264434d1b68eae0adfe2178ad037618e4a0d12b894ab59853e2ba8b88aceeed26fae64bcd227a6a1d57b94af59a43921a5c8545a07b44f2cce468cd5588eacaf9c9d6d0aab4f2d4609df2cf17c1ab634ae81595b35505fbef37f48e77edfcf31c14984b0d", "65525165ac65", 0, -58251772, "e73fdef47e42973d75c6e273a1e9d55333355b0e4e407dce1e3cb6d2e635632b"], + ["32db6f04020eae73a8510b203720d0e827b5093ea5f1ecc95d8914e85b8c9b4644d7209a4f0200000000ffffffff5174c13a2bfa5e1fd7956bdfa7a3b1a21cfcd29fccc26c7333cb5a80f1dea56c0300000009ac510065656aacacacef20c5040242bfea0500000000085265006a52516a652c47f10400000000045253656ae1ba05bb03575a0101000000000000000000000000d1fc676fd51e6242ae5075882d26aaa374df6b3067b49118fbe1dacaafd582e0d0b50ceda40de1664c7c71cc34342a35012a9859aa688ee911bc3d36d7408dbd6d89741028aaf92eb5df11a3fe24c2505b5a7cc60c6358d0c604ff5e9ae387cf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000faf853c93ec8d04f6bb6475d305d2e3ffa5775f084d8c88d5bf85ebb45b638655bdcb8faf6627afde8c2bc80ee131affe8c4a95b8d72445979f836c4dda5c2b5fb4b7ce4a192c35481c9a8346b489527cc61dc3d48faba86c8ad2b53d372044c7f5e11fe2681283cb383f73dc4e4cbb2344cd05dee68fc02c7cfb7a495723a3702174c09f9fcfe8cb49eb6149daff6d452a940f49244910d6f6d203cff05f4ba6802007565274f60d43422c2c7320ed5a546a93fbd873deb859fd1ba703b3b1dba060a059170e961b197f69e43028186af37ec1082948c644006d5088c8e90200642632ebf0081077ad5ca8b249b5eb6f8c06cb8088776568c3dfcb9e4df4356d2eabb0207c7236ebfdc1565deaa3c84252d3549da0a9d87a27eca13c7322b92f2e1700b020a60d200103e4c96bc42bd30e2e0a5bbdf2fc4329c55aef5bd58bb2aa21c3476020dcc053311b18b99ff1fbbeb2c14dcfceea965ba556cb33f7176f04a397990bb0201591d1f7db7e84cfa176fbc1df717a641ddcfff493d0c2830af4789ee4110fa0216735975e5e7997597a66d3dfeb2730481d31a1161212223cb3f50acd3904c5565c244424d906da7199f30f3ea8d8acf6e7eeb376be932950085d79e604d898e7c1afce2372e0c0d18d539fdb8e47c83c7ce15e128cb4f509008caa1d0cadd710438e51febc2f048c9519bc28f3796de1e72a985c17aec93ce1d4ac118919d6a7449acc1a12d997c4d5c3d2c0364e172b08192331980df1b5f4d7a74ffb9b8a969f43a54ad85fac220eb8e7e9a4c94f23ccab82eff2d78d0efb1df1d3153c1890f54be29758c45d8ddee9bae13c549706f0a3c50dabe575e0f51ef9e0908e630d42f1df3311621dd8c037d1e73b00036cdcb0ba3701136da7e66a9c6f3e61e370ecd828b43ba25922d2060c90c21082347667709c3f84946d154cc7e0493f030e2284fa770669b36dbc60c72bf86bb56822c85c6be5312b46d9b4d24046116707afafc8797b54d2cf260a374d57598f39cd605681868d49af8a031bdb6c13f604a7844c61e6708b6695e554e099523cb0fcb255cf3479694b80b8a64fd4c523678f1c269aee9b4d3cc7ca9438faeba58efbb1eb7a81136c5938d6a276b63b079216d98761ef264893051d92c495971439b6a09e7d2bc96c1ffd7d1f755b9ce7bf5d84640d8f914ae0b92ccb1a4b8867820cf161df7c092eb06a7af8901eb095864e5bb6b96e19f956ac56d27ff2d207cb9941b0be97a7c7bf68557fb163bf27d34999c1f2203a5c1f8f8bbea481d3d606f525556b33d10b684df6a6a26bd94c64a032f457346a4cf9e3fea10e087079ecad9707805974719b3a4d4cce92d864b54799effb973c93d3c6f38f46290fdd5b6a831cf51605e1c436e38fbc5cd471f6348572533a966611c18b70ff24ce958bcee245d0116a5c065853dac688a3c6802bed411bd1e59bc5ac3514a65822890691bf98a1dbfdf30984c78b6d026e65ce1ff3f492c1b6c5b488b8c54f417c501e6cdec41b78a3187bc1d956cb49a3e24515a2471d1612d64864f2e099da64eef9b254a9b0894562364208d708a417bdbcc39edb0f9a2af38f989f477cfc4b0dc0da8d26dc8fae8f4ebda50f3970c7f341a71510e5505cb28a362c1eb55b6f2fd51c4a8f0d464f2c3c204dc1a39f0240dbc7af15d0e68c7be0ba6403f8ce51ec5e2802c004f1f572b9c6c0093537f6343c4dea572b99df729a16a7a855a1f2ad120597e4a62cd3f2e0c096471df929e487efcb72b2162b69f79ba0953f342389661f7ba8ee81850a0b1325ac187092149979f3873b26a7f76276382d275ae4f1133b17f82769fd795086fd741383ad051716135550f029e803a6219d637618e92aa585e2f8ec96885086c9bde2437ab6a83ab44810897e54c4588289a84a22774c6cfba7765a6bcd57f97f92189d3e87f06968d1f7b61c5f70e4be23e01438bae2a27a4abfb0610e8811a8bd62be5f61e7b84b6fd39adc68680cd0669149431a550565a54e13c30fb28f987d6d98ac9944001897a942ecc44ae728fab5afa1bd7be6c8a2394aaf850b4c12e2ead25c28743e5c6879360b4709ec57fb5dba5122e83b791e4b58e82f3706bb3932751d48e711a26c669d8715f860ec587379b0f03be5c288f18b0f2ab975a880077e2e6acfb29f686845fe935dd3714daae0986327fe1276b60dbdd7e0ea758589d5be23ff412c578884854279eae9cec248f1f3e6497028df0a48a284a4da0a3f2ec1b7721050b4b1f0ca04db3a667e3cd6df50ff4a623832504000000000000000000000000e5a239705a92c5f78d5bad35c0a39cd63022c4183d2fc266ada2f4208d3a59187be3db47f67814b70b29aebdf2723561fc37068fef6ca0ee220055b538dedb4e0cd21d62e7d9e48e20ea65d6ac040e5ff5a7b9ee32a4bdb2e2a58eca650bc6b200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1cffb8dde583d082ea4b4906a0f3945dc2c38632e7de8a1cfb949c0530bb937bfbb7030a30c71651e5d9a42d5dce840c289e5ece4790b27d2a3b0f24f731a759edc69be547126d839cc08148aad677cee25bd0eb6a4c821b45cf14ee14be9226f32f9b38dcd3a58597f8491b02352d10026c74f7804caf3fadea0f07010dcbc032e15d431227209840d6ea08329630062456cc62b084a7b7ae9539ac917a674c30318cd23aa7fa4e709ebfa5baa4c41ce13c1963d2220dae7dede65cc1b1120ea3d0a088baa9b5c983db76bd4bc261a62522c0001de81d938c89382dc4fa0c82ff0d1012ae929a31967b167c4df0e215918c5d0a41950f71e79fb1fc5c091c68759af0314f27738a6c97dc07a092f267845c0401e331a554b8bd90d5c9e548409942073031671d6119006b14871246f02d05e63c5e7e3823a03d3247524c9340f3214228a0209b09b0e044a50517fbc92c7be0968617c979effaa6e3f97e117a135bf2a017b020d9c7a8d69a24c491b1ff9df898119347bf36259df5a355575553d3da4ea7ed30222b4a6634a2793edebda173e4e24b3e46336db08f7d7dcba4cbb8c55f7bbe6a2cdc53566086e8ac04ece5d870dccb484b18b58cc0eb80468e31aa63f5b08551b25e19de07fef32c8c5c3a0b44d8d53d79eb2640819583ce1c19af0dcf0002494724e20fbc8c30c88024a55061c8df93e826ba50bedc51a96af22c7d83be37ab8a3c17d8bab938392b89208b8841250255eb1ef030251e1ac7a2a50c3490a10f15ad32e2db20c3b504e307647a798e66ffcb4d075109886760f212312df3bf7993e66daba1603b0eddd5949465467542d266876af11cb0c345767852b3284786e9060516f88bbe09fcbc16ac72ac24e6e598f6c86e5c3f6dc1487d354644e9973b8da886ce1763c477ee9f6cce569359ba795c06f6b4b5952b03dc480fdb4e3dff60de9227a3d1ba50ea87c1d6a85bb994b2de10e27805c5b2505938625db7d218a3e9b76477b7976c56262ee6debed5ec704a0dbab48227ec4af9cccb52694a7297fce3dde38d377730c25034581d81f58a996297a431243484b2d276c43f110e6a5316ee2e43709a852e82d8e9c9f2d7b2634d1f3bcf9a61512d0c37d127df3beadcb8aa9e1c89d61ad75d81190a862473f5a5957a0bd75f3cc5f0b7fc300d452446b0f1c9b533dfb913be04d746f0c83efc4fb0a9072f99908f58381e38283de2ad1d866853ac15b97fa305cb65538adf4b98626e7d1ea6fc27deb23d02ca815aff2d4eb7e32360ccefeb4cd450cc753f09e8ebe292f2669ff2bd6de277a863c68cd19faebcc1d44d6a64bf1040865f2a9bbfa73e5ddc377225ae5ddb7286c798b0c252e46e3376cc209cc63aa068be1be9b62dced60b904d37178b11ad6eedfb69ee682d082d29b8a1f81380e4336231e4687b7a363485125ba627252067d01545fabcbd870161553d0cd0421dfeb70140015e98f97467a9a9666c81c671b79e41520ecab88ad98651166b48bad0853dcab47b9bde70aad9434cccb21fe3e58248a2041645a92daeb7b0c4d346c76411184295a6abecf1d5b164e5a1be48830323d22324900ed4c87b44748f61838ae93948ab3a6695c00e4a06fb683d4aa4c4cb5180b81676f687e0f66369a0d00120254ee399f690f755d3edf2b7f1a97edbd33ae7d063d00c0e7eb934a2d873167bff3d1edb313eb00e23070ab40c24694d7a838823631ffcad27a3b7ee41980868715b6d6067c72fa647db954bb565c3f369c961e2d1f7a767feb985e59ed048e579a3aeddf73df039273ad17f5a12d9ec15a03d917acc4d8d74957bf336bfac90c637d5ccd93795366baeb9e9cdfd03aec209d50db3d9ce1ba851a3f85065f7f9661e3ffe73082f5f21163be32ed54b7ed14b5a4844381a26026acc66935501ca459c6f078e5bfc6dcbd7f9e9fc1aded9b786d3eb3405f1a01d642f12a8bb1e1784b5df7468104aa880fafa5073c5e8cd73bec4a8f409c566d3af0261ae38ea4f9089ab4ac6a65bc9e30ca834ff6bd72b14bdb80be3ce58ed7ae35b66b9e9a2db6fb395e1aefc44d0b0e095b3a4ebd00fa4a38c457df528884f787948562852b01ac495d8baa8992c2f908f4571d64882ca6b2deeadc2ef38b78618fc4eacd29e18a45c06a144e48f34f7d3713cdff6fbc77e0aaa2b1f8a6b16c7749c7f23da367c0d3f9b2aa99a68dbd4abcdcefe2bbab6814b79dd7221f4f9c28e149a9d5a8de0deb997c978662ea143e80f402370b2621fc158a68bf70faba28b55f8d2d80050000000000000000e059410100000000eaf734623e4af06e70320712dd739672d3a018e64f2dc675f019adf8b9261311f73c750916f17f563b3446f22598059f3e097c419461a65ecab42fa9f6be5ede3ba5762f1ac82e1346c5d0c704f1894f910a20c5026b0815b90eaa8a86f986d300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bc11e348d507efc9915a1566e9ada18603811c20d418b295f37cbfc1b3620aad41f72cc3d308eb3c363ab31c3dfba00dd6198657da3a5a9040e20ac4640075433ef715cd11c5dde0d35cd4611404f331d1012fd96f474ed5bc0b2f85f488ac25fee805fa152aa4641a056e7709057a11741054896bf60fb77761404978629437021b6c73bde600504047c9260331bb55317188f92fb9cf874865935b45151073c703300525da019a5b64a4da1f58f5340bf01bd328877055a6e46ed4e0d5c45609360b05642d0c84427af9d3af56d66cc910622619a1030d8770ec2774ab7b55197ceefef996ee09b2512a07e21ee11fa29d5d3631580087c3de79f3488c7ca9f816ce0204d55ce06a7d362072a5b62fa6f543742dca7382f746f719d4d06908d04e519a0226cae0547b83b2d55f11fe9bf66ddbe08ed6dc86caa6b74d73b9df460f89357d0319526d2d07b6d899971883f6d04a91895f9837af606daa0e271fa97cdb829e2f021189dd36d9ba649f9ba6c45fd42a6fb39091e8b1c038701db971e5bed098e0b20317235d25986890315222dd9dff3b02a244fe98d6e1a9c8e4b6a698fc7f4f08929bc74d5dd337659e739a73e3b0589a2c0bd62727a658356cb04fb1ebbe587cd98e1d27b9c6cb8e929dc4a6aeda811ae413690391b261f2d455c57ea940b4c1cc74fb336d38bbfa8902bbcc4f3c4d01d653b044ad0922f0601e01b3d6319b1e01bf4c86f9a8665e5126160116a26550b97d8e13f0535fd33f96aa4fd0fbbbc6f06cca386eb83882d67b2798a0f5807e6ec52e9d45572f5258267d736f749fbf7b530ab4c88bb5b061ee1d8dec31e72be9bfd0abff5b64f885d43d751279abc525d4feecf5b96781d6f84d7d566e64a20cea479b70146a949dc92e5395fc06688709d99087b44cd3154cd38f426bf989d5960eff5d5300e51959efa212b8766b11fd8d5df1f47fcbd415cd10f7438dbb67eb13b8d4efbd7e1aa6baa9aedfba2250d66b0494df20cc94b85d16189b881bf3f0e85a450ac5d1c67e8042e7743f72a8217f80a15791aadf56e5085a941f3cdd4e700cb632d647744c201dcf1adce54b1f4e9da50cd415586a4b8cbf9c9858efe70b38259bb8253434c12e6b49ce69159b9b427f9ffe7242f2d0bfb0e0b5e6c4a78d7f13cc38b99c0c3eaf77954120abf0ab1731d2a619527094d1c9f96f8bd754cb936730d0f4e8f344633f450b4544b6166035e96704064685df3fc50e745538a7284570e5e4ab7ee4297b644c14c990145f27d4d99d78be7b831e2ba738cb1ee3e906a6ac56d4d928e865ea6d04b588ec77dfcfc3b82d4d65896221f53e7f10846f9e697342e0f6351e635c1e6cfdbee32273157c70b0eaedfb73463a50c930ef68d701603f88be8a33abc391b5d6fff6b075ef16927666bc3438e66a109d1172a71725fd70a05fc3033b04da3d82478f2fbfa7bc3491c0b053ca52918dc22b31d735d9914f99b23c7b2b58a91fd0013877f4bb6cb1ca2654f7dffb76f4af75ce5066c29972fc05169556834e48eb523da7de37d0a5f049fe549ad1f5cbebf4627934811a338bd847c5bd7315640bbfcd38fabdd8f83e24708f290cf216687d09a249371e57350063df208f7540706313ec2a52dc4a2e0a74c1f097d61fcb2fcbe527a279885d77a9b5c06284663004afafec7643356ac683d8a0248bf09188d33fc018d99d529e894da276344b941871d5c4dd5413463659033bb47f9741c15c2f43d0802e1784f9cccd7197dd7ad3c8f0c51e4f9dd94e9ab5a9f12ae61484154bfa32dd418c741afadc95474db2c86b111b0776107f595607edfc291ea5b83f842c7af559140c1d25f02456fa92876b1f4f889f0d341341fc353dd1d9fc9f8cf32182135f09eac4b54ee39539b1d55adab24cf5f649117e47fb0eb41233455635c27f812acf406a9dda88790ff9fc9236a008b8410a8b1f63ede5b52d084762a77ee9397ed49c0c2d1265f3800fcdee39836599c4bfa9f9077b750066b741bb396c3ad8d8427ffeadd3e552f95c8fac9859569fb4e311fdfdb003b6aed8f8d22ad7fdf526afa278047a8941bd8e9aeb50a407ebfbd29496f656de5c63417ffd01437bd5ec85740b1304d02874e7eb0befa2fa488a968516d65c64b6272b486edb64d3534091edf480ed7959fca0b5e7b3f8177e46396966839d27103c065e516c2d074b34a4b45c806827e1004fd2ad219263be6ecabe56d8ca3e39687d5a7e3dd9830c3d3e07f60166d21a59468684b7282242a2bfee111908e3d39ff7464da2a84fc3ebe703581f78bbaa823ee755b98684356af91656be6fbcdd8199fba24019ab08406a81f4eafe752bf375113b32eeff0722f129cdd783dad082dfdf0e9c4096f087e15a3dae5ccfd7f27c6c4d5438252d67531b78a254e58004ab5d0f", "00006353", 0, 1002542895, "99b3e76d24e9ab08fc13d88e9440506e49c65b8dad11226f0f0411209251c707"], + ["2545751e0165ecd7d67efa9e38274bb132aabee22b79a42e757d02c18f04e9cde243a1ea9c03000000075265516a656553ffffffff03745d74010000000007006352650000652f496002000000000451535163a4fdee0500000000076500ac0053525160ace37400", "5165", 0, 1960340943, "98ff05d233f56c7a01587d45104f35ab72b49a48c7e2ca5c9d109f26d1bd7125"], + ["f081660f0322765b474955cd38901fb2327c6613fb45908f3dfe90f980830f71831539f973030000000765ac6aac5100654467e964949a8faa58d8a452c1de4392e3db2154ea9e04bbafb2347e5b701207eb9fd32a0000000000ffffffffa82ddf66ce0314369f616099860034eae7021808d0947f4c8b7f0ca609ac3625020000000800006551536a0053ffffffff02a14d3b0000000000096a525265530000656a155fa800000000000451ac63514d59d5040200000000000000004c841105000000003586436d0c5c07a2195b163156abc3ccfcef787b06d0a41548c3907a1a4cda3ace4de16a634919dd044026e0fd998cff2f99a3abfb12f36af3372f2b57897233b0a37b6e114644093fdee60150229c8a0bab44e67a67df0a78a50f610717472f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003980f131c7900ac1ecec7bb569c3c7c9e610bc88850b8cf3607aeb3acf9eeef2752c28adb4fd65a496579c8fbe4bb47fa75b9af23b4615a84fdef3ba6bd1ff6fd77bc6a9427a8218ad1d7e7ef9f664a8935edd287db4507e257706be2133e6ada18c87d522a1110651c78dd5fb7b1caac24396cae4f7669fd5ae07b93e4cdb1021f16774c7af8a3fc55fb986f2e166a88c39764b2f673ff4f039e293ab0f1905e020148970026589a48554c577881341a35e04e4bf135edc46f0e95a9ab8879634a0b08938b72429f6771900f9e05f2f0e81083430343002928654e08309a70473fe409976e301c3d21641b5339fd0bca625768608308c90f25986a9bd353d1794abf03002d9a3ffd5c79ad6a4bec007b88669720367bdab12cce204ecc5947c1617d170328b9793dfc31c3ac58dff0bbbc3826883f6b2e37ee2f1f6591bf0b18b3bda7290202716588608eed6c23735a1725537e1b338a8370006ecf20693b48ac31c81541031c71869f92081cdf84dc2ff125024feb39a4f190ef623fe88118354b6d41876e03149ce9c87265edea44205e7f102ef700cfbb7f612c636371f6a27e9bf7a7ae01f4cc01867952e4e3d61146f0565b87abf460de1e69ce8d0201a7f9349445c6db1c93ae0eecdf1a084d1988268d76301ef8253e7af06ea3475c3fbe9b338f5ed1841a2d3d0d558e5f6329a3ca00db57156efb74d9c4e9ed5aef159ea2ae4bd3a863f02b1075d3898a5f849502769225d00610472bfb2d22e352d410c06d1d45b140df8a0023c47c5c9af988de57ffd35944b7a89f9fa2a3cc8b7f34a78b10ed2a03bc9e8eaecc0fbdeaade79f7cf5f994d353b13540390f431362e250b5fcea91c1d30a64e44182e7a1f3a814795fdd15139a1da2a1469d0658a0cae6d0ef164e8e1256e83d7571901419fe2d24d3499c7119abeeb6de71a75ef97c7a046c26a9dd8fa97ec60140a76ff664f7c4f3cfab3c9dac88e1af9e4bc17211852484bf5393d0c584f0947e7cd0d51e59010baa7a0527ef451ce483328d26b93df4b99933a67772f0b7c357f8339bcc10bc386d510d45c4c0021dd22ce7797ea866ea8d0c6451148768668254d5f1897e1dcc436e54301a6ba96ba51acb06e8418b7e6c5b8f26767ff212acc4cdee3e1c223c948591e05dc1a2c04a5d90a3f40a03719d6e73cb9ba57c962876867270bb444f831c6bd9b03ef81f1b15c91d31b03a65ffa19583bcf7bfea9c16ad985f681ffe78e53971449dd384f586389d664fd5251538fe7e3c9f38f347876dd19aabbdf3500346d8d95086d48790ef1fa4fce825e33d6bc85b5008d5025716a30a36a38f776bc0d19e3bebffcaefd8295ed4ea718e9b930c888ad742571bad49a09ab3a2382bb8eb84e5733ef66815b2ccaa8e98aa214a4aeba5e8b0cbae6d11bfa5f26594b8cc3bd532e57a6c77a76793965c92fbb02409592af3fb8c502c539eeb53baa45d307303fa52c032eaf06a6527d899593436708c0120b3cf20b0c5524bba56058902f4666ae2dc88540e5dddb9380362796839f996aaf540c8c4735c367087f265e9922ec56a9a442e7d9be776da50c2a7ca8cb3827821f77ae467079dd0e666a943ec86edf8b7e9f60b17e6c1e9c8028ad27f64252bdc4d8a8301255b996cc783ee0ef4bcc376346685dd790e9ba8987d10fef0b31dea68cfc997c92c9823534d318ed361f75815093f1f013cec27570047f18af6b06fa8374a3960b9e4e0a7ca6ed59b87188ed671b0e2142c908b5e36064f2203aa0ad2d71334360bf4bd9863bbeec9ab1e429ab0565eba280efa52512bfec46d3963de729723fc221d90b8d4840ca01ee43a6a016c7d3a3dab33865b65c1c55fa285b5bb0626f8b46aa324d21ffe77857860af8c2b1f8e92aa4eef81484be6a2a5a8c25550f1d9f1c537f76f2b93aaf7961d81d3ad49f00fb2d85e251a13cb758ac823550f0d8708f03ac3360e6889961e7dfb79e00b1025c559c8e53c2cf9d62b42d223214cb53046702888a9b32c8b606c3b7defa9eb95576d3901a9d0a49634fd80213ac9a4a13822ec1e694c6e0af7c9e18260dd8b174e32e4485a179b45812ab44543d99ca919e863b44327ff476a20aeddd2f7e8ed888603f252db212347d6872f223000507904903002b8dc00f2a51dac6799ed70139e6c8b51510e18c13038d55305a5783691bbbab50a9e4b81a73141143db26083b692166ad3904469a51719fb1dfc46db0d1d7aeb0279ac689432696366c782ac3bc7ec3fc0a407220ae464b1f18b944ec7dee53c41000000000000000052bd0e030000000083ed79c1d28449f507f9bf01125955aa7e8b3a6a050eb8f190ae0ebcb28488324e100bbb13b58f2c759c2e7a1bddc3d0e34bb59e78cb263f482ff4420fbd33e68643efa2782c10a4b0d11f76dfe6e43c1439682756030f2d65481d25a9d35279000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005baf3834c0243357a98636cf933fde2d5638a950a62ddc79e78209144f74523ac37cd6f4f3c67cdd68f3b0b5ec2b32f8579d7d0a033a3d7852dd63a51610db1ef7ede9b87a362c28f1e6e505fd08174441c4b8dce12be62bb19f466a6dcacbce0d2468f688c8841d71781b426d95a370511f7c085cac5c8cf147d9840be7e5a303013c6bce7653b5388e23c65c6f9fbb8d30bb75e58ff31f99e8a5970364daf40e020ec2cbb211065deba9a12c0f3efe5003d2130d23cec8d9d9d8d9774b633553300b076dbf9d76b03a0b4ca6bef8e1a0a7c123a22d59fc115ae3fee83e2c02aa76814548bc9b83652343dcafe18791a5718f34b81b8059b0e21ac0e568ef713d7c8d032019a3634b7e7c1a5a7d7deaab737e253a3176938edc5f1d3ca9eefc32a2b09802264fe0ffe23f40bf099797a31a62269cc6af4f494c03d23334bf0f87bd84a62d0225be6954e62e74e857054ae34ab7d27bc7843c0a6321bd17d4ac7cb56ee199b10221bbe9ed9555122be13e398cd3ece3ee4d95d972a10f5e21a3249c9a2c86bf5602200318eb6db8363bfe07bce2c7b20929699b23e54e39c154e0497d95a89759e0984b66664ac4a62477c140eebba9424f65e3319654ec3119ca030d6e1db53828055fe40833dca5d4002d6b177878e0c13713d736f23350cf4620766bab94b42f0d085ebb25efd9206375328e5b84c8f73514d08d3fa629cf32a1842cc25845773a184ad48a50d68471a6c9fec6b6eaa5a9a1454441d7a9a810e9b68fc553db1b718d811e9d773fa07c9e4f6626b6b17ad2b1476b717c70d0f8a3e6e3ce8c9275772f410504fa5aa564d1ff0b7ad15b0220494357a19b8586d1f91f03e939c0f12a061bf3428eb8f2071cf5c641cb8a29ed9ea7a916edc83171b0bbf919ba2635c52467deedcacf6e9289292ed2afc227c44c5522908e04574f11566390afd21b4ed8149bd2768d2a197d67a1eb40583c85ef51720ab8b4ce1a90eba8e608e0492c661d029cbb0cfe580dce9b96003f4db95cd4a4b590caf12c6d2517b5ebe6eb492114b5690c6fdc7a38aa020291c209f4c182b36175e73db6cca9c2e20d67745387b86b807936e4d4e88767d7f132c05c574fa90a58ccb94c709cc928f1d9aa2174bfacdd7b8b7461de81c277b24ca9db6cf36da12a42222d313c0e41ed1836aa4ab8c996f505305a113db9e812dd8f427e180e9d2826d245fba638ca108d9b47fd1ed240f0d5bce9665c55d587f2c33d0e781179fd7deaabbdc3e9139f8c0ccbe736b2e1f32547d3cf79b1526d2460c75fda999a108c5d0e9534cecad5bb415dbc3766f2cb0526eebdb210c0c1af92db5989dcb97d4ab2827e959c476067e31dfc4b0aa4706bcc3e3ada98dd9aea391fadea73cebeb809039f9db216bd9ecff01abb206a3fd5bedccb782ad2a61569c59a7a9f9fc9c3ad92ad1e8fbfd91863a813f66bb2299af05f640f1bafd0055c2c99cdf91b4af6fb1f6b4ca0a44436147bf97dd9be09ff6421bbb434d8b26af89dd3a99847131168c355b33096e909faa4b3a1972d46b2c7a4cdd994f1ca168b9bdc6d8295cbd6d14ab295af4a7ad00703d651348e6fa95df6c9546a2f9c2f2a132606cf200c5cc42e7b022b1ed3e1adbd4d6af6603f137d356ef70275677032749d174376ee24638a3c9cdc20ffc73b48d1fdb9d07e07fd8f1c5041a151237de9c819ce35b6380adabcc25c93b7ba0f77e6beefe996428833de8a9c71dc90bde4914478bb589ab07c589f64447317c951abc474db1651e1511beabadfc76c84d6194bf746ed6e585338f3d27ca09413e68d4af2f54421e0b501d33f5931bf58f8f2599250cb71ee955f1ae142761c89c1dee9dbe1b31e794d3d3b848e70511dc4fd850906bf06886eb84a41024c80cff2eb342bace843f6fa66da252420a5e45e65fa4b44631070b6a5b2613832e7527f719d0b63365f1a24d874ec5704002966ee060fe2daacb9ff0958e2c8b0cf4d08df6ec28ae461add932440afac4d73b1722a08e0163f697672a4ee106aca0cfe67cd565f05146ebe0aea342197af27517505f3c2fc81efced594d8d8bdacfe6810f65fccb16dfd1fc2ef60fcf38e7a21539f2f567d766bfe4193556ea04da379fc2fe62d5dfea7e3798462962b998c7412ac97e06fd5cbc2a7c6bc9122b89dbd12acb2eda00d095ef911797da94c5a78b206bb20681de13101142633fe90c2170f535796aba345ddbf7fe377ae5c900425dc6d4616f7e3fb64d0eaeeedbc2611f6f8b06348848298f9b7cc8d545882bd66cfab9952c9e75a47435424645854d5d2fe89c46abb72cef8b4ee48200cff2be8689a1588f53a1b08d71a1d0f9c40d107dd75a0d49f62ebc8654a9c8dfe062808a3e5982a37eb74e997815ba00c3167fe9d93fc4431f2133edc66c230f3db4d808", "00acac52ac", 1, 1412673965, "579e9a4be24babc7fb3fe80a094600a24eb90875091efbe346d28f64d43577fd"], + ["60346b5d0435ae943b32658ce045de1b2cc87e6d2840b66ebec18552349ceda054feff116f02000000046565655205dc3fe9618826ec1291cfa0afc5f0dec74fbb24f89feba363c370377544be45e350046100000000056aac52ac52ffffffffe2bb0920dd6b05b2e3981bf31662610ca7906efd0e0843c385e3d496c4ba1541000000000153d6850cd92625ab3adaa48b10b6a95f5eb16edf214373735c6578400bef9f48ed83b0408f01000000025251ea8ea6b003f41a43010000000000b3d1c301000000000952655363ac005200ac8f534c050000000001ac6488da2500", "", 0, -646752724, "a53ad87cba8abeb052776b7ee9741c2558f3a3bc2478bae5dd4c7ea213205c9a"], + ["030000807082c403039d361d0ca0ce45d678e3221c0be555928074fc6e5aedee3c7b0ab26da42f0d3700000000066a5263515351ffffffff060bec891d2e8c6b2d036bfed370cd01f287c77f0439a36def4a976798db68590000000009ac005265ac6a526a00c1d20191a3768e509ea9ef4ab1e6efe852e2413de38c0e15f52a5eab3d1b9b91278304b602000000070063656353536affffffff04d0e243040000000000de08f3000000000003520063ed56a10200000000046a655253fee08a0000000000086a6a5100ac65005200000000000000000391e0210300000000000000000000000098a42b4385fb47ebe49edfafb5d1db7894e5c7d3cc47b0c5ed3abe398d44d0fbfa2b5d6ec782814f13c0d63a1f05361b66d1be25846d7aaacc65f6ca5b3ee61425e2c143a7269f8eb315b4137fb9d6f604bd5eb68c82b046a86cd14035805d26000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004112db150c58d035569f8c5c3deb8c018553f608792bcf543eb8eebb3ba43b2820c4a1f479ede1bb990cd13c03732486663b04e7b10b8f8a4aab23658ab89738b00f4ba6b528b6b61da5cfc9d59c560ee5d4d933abf77078398c004501d8e13b33744813743c8b5f9aa5a3d3dc842625de5c15102421ea3161a5034e6b311411020133886041c5ae9e9d4b9eb499f8d486d3e7408ad621557247c70fa11fcf366c0204ed7f37a1b62330fb7a13f6fa26a21b93ad882cb1130f6cbe1ae31aef6979af0a01a29d01eb9f64ceb21e4f1bb77322148d9b752624a163b347adaeb3b421125794d399817da4b5483d2b76ace68da9e3aac213eb74754dfd9e2b16c330046241032e22b9a2c4dcfef641c8396462d805b702a0dbc28db43aa4fe6a1edf9c850009022bcd594d8ce407bad7e8f79da62f99399901806433123c4ffcbe5849b4f26c82021537045228fd4cbdab35d2a13bfbff0489871d763204febaea389cd59dfa7101020380543e26fb666f9e8eea7688061d6eb4c42737cd37fddae7b87efdf7c930be021c78574d42911e821b940b9681b28020be977b8f8b26d6f707af55d5a0b54cb7692764ba9832ed1392083023f447f2b295c6f14ff5dc88bffd8e03eee112b021f193b571084b8fa0b511531d4bd4bb10a0abc5066c461f6388f134f5ab63aed782e460c57521366468ca7b29564780d83d8fe9e1122f75ebb5a4a66ae30287c1864de7f3e598ee7ed7510c6daa34bb1d035c88bf52d66f79ff10f03f1f41f1637238cd29cf1bb0114cb5dde5a603974dad8b0b5c9aaec4200cd7d469e087864c7b7d56fbae9cafc7570d0c31a1a51ae3b67cbd5d1c96b14cf483480bb6afdd05267c0f7ecffc09db3b857b94a1263f2c7ccc38d0e96df3eec45502b8c3ca4bf08d2587d2674bbacf02aa6c70c4ad8f2bfa8ad573362b40d9b56b64d7e842e6d9287c0e22c1908b9930bbc948a14f50171fc324333960325a50aa646d2ecb2d96ecac32602eac51e58877272ea50f28bf935cc830311a67d22315512adab94c3d0260cbfd2c8ba443bb508a53665601644b47c1df58c8c7c2db0b8bdacfb380d92487e08ea2f021dae2c2d742e7e0f07f960ce645ebd0a01d2225243b81c7e654a4240eb85f29458a7dccf88dfea030720822d90baec5d05405832604fdac3921003cf63cad54b9e899886d3f728dc6982770f9c4d996a841224204c5fa261a546ee55055ea5b8f4467446f129d121f579261cb00d92476ddecaca57053f91c5736a623bb4b68b4745cbfa0c8eca7851d87fd0df6dbe0b205b3d95037b80ce703d53a7807efe032735661654a083bc550011ede43d34be438ebf9b30e1a751f2f1634e45dffc699257821e5c63a7079225bb275feeb956c8a3fb0ba04f7b68587b30f148d8243f09195902e1726d6e8cbc3141a3beee7789c1da632f651c8a91f38dd394eeceaebaa1f48c9a529e63c3d9499c2b91998e6cb85535671e1dd4d9387a202ce4907b97fc94851ddf833900b0e683a8b588609be9f51347448bd639a9d87ffba60d3958210f3ad9780a9e07fd34abb2980e0a38640224806e8b3e2c8cca5770be402f030e3c0239d59544a434d18def119ff0109ea64e3b785195c2894cefc19af0cb05b6ea54ec8eaa7cf8609504118b2da0beb704246e090fe6f4e638617a1151d02f220c53342409f08254a76a1902af67a48b45cfa5015f15b6f225c854c199037b1c04560e3169a3f741eb8558732ed916dac67bc2d66e6f7fb50b0f2d1a4c55e09e29f5abc5f719de5b2ddee0678d3ebeb789935c191528e7f81eb619ba9b9aad6f0ddbad21ced86439709ffbc5e0d0553a069fd3464c55aceed43197f6f4091adea112ffd902b6b129a07dc592b430710839e0ca87225b8f305d76a609ab45b47d769befbceb6f9a5b322c092da8387f7dd892071cecaa06ec181fa7305a92cf7136eacb48d9d617f661c36ff6612255b46d9514daa141a25fc6c1a0c894bf436096ce6adc7ff174197d1c4c6f6cbaa3545435a4b6e568fc1b832b3a4151e75f6bb23cca8bd7da2911b6cf743e48cd6432924fec9902418f9a4b56ce0af5c828164efe407f8fb80bcf48caca48a3358456c749a8ed5b672353024dfa1c1cd6e24a15f3b5190a9c4dfc18902c19dc3f0b2414a16490a529cfed58ba49e864446c357482990152b4e908df905569386d4dd387469eefc6dfd690d5c77288a2d8ea5907be0f7ebccd091bab511a3d88e5405d751610eb0b63294d47635bdb70eae6676a2fbbf6e88b6c6591885696f02000000000000000000000000403fb14501b486dd81aeff91b0b0e3c9c2370a63154702d288ca275a15708df7f1c72c1db7353c034d8b4e4a3cf4ab81c89d22cc4160474e02e29747c25a5fc39716c250499016d06f764b5f8baa7a4eba0ca25256b0c3db446fb3de01bf79dc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049584cb6d6a20a4b26862350b5f64237cf103b337c0fd4369a5a0c23dca7dd30c6120a4e9ecf00a29d645839a107dfcdc23782ff6cfff3231e59587792432a25a274f3ae0116589fdf5d889776f026d8e860846ff65845f78ce410b32e4100009074953c2c4b7aad543247503c524b7815af918f8d50cdd4f20b77abadc672660328d2c09428de6d378aae81e430ac5cc402b50cfc99612d6182b24f26636990ca0214d297ae16843696b97effb37af358e6d4e726699b28fddb98b428d8bd5c014b0b02ce02c2c48b84054d4d688efdb6b1e2bb109be4bd985dae302e57a1e3b05b55c3bcd127cfaebf7e442f880fd9b5510ee56429b8a7fb8081eae30ac19ad845d003095f052446e2f4e5d5d9b9102e6b101d8fbd0e4834d5f86db2d3fe5974b937030215154bf3d33851f01d000bae19e55589b80949a6b1b5042d79d5757a59720d53021c7328346a9b171614ce6612ce3eec79242ed886c9970f157d663d1efac1491703212457500831fb6b1dd3ac438a16ae12ea4b9221ef3549cdb1699a1a1851581f032513b1b674645b5538052156ca6ca3ab37c3a35fdf198af5271c12a80e88bb5ec929055f818257a47cada88805278328aadabf6480fe8ef205b911e1e3a4fc3d27b06da6ea8c8b69dc02627a76b9118078a2e2195a77b134efd45d1bf7ae25b22ccd5faab9fbf7598b6e640de3d07ebebd298cb3ae5ced0115ae4bbe1a430db0b34a4b578cc3e5dc33fcf08088120bed9089c2b1247e8fef5793d986c3f1082d902f4db6a9c19ad0b3159bd1b695a732611ce5f16baf8bb41f14a2ad8de327b6579457dd2ab7213eb98043b90cf88987092767f5c6e84b83b9e8c64f5cdcfed8cc3506ca4792ef5c2e562eb318f9e0023dd0022f0447988786c9b6aaf6fd4b232cc9ecfcdee917cffdfc1eea3457839957a991338855953050b12fe681b8e4451bb6e9c5140ec567a9b4a0c0c2aaa4f48a2195ae5747fcf93571ec7ec91b1ebb5e75f371843cf7e066bb25baff215d5740769a17072f48db4d182e1ca9bd651c49a41ac3111bb3f33a4907d89f5b7645a28e6baf213e88a1eed6ed7c94cff1565818b51770666b1ff20f98029080586ce0f77244feca7d55c53e47c2ec992feead59b3a0cbb8402371801aed77a70d1ef4f6a964f27d3579e0bf3e3aa01ddb93c07e71ae5d91b81dac41b127facb880dda11f3993ab1c0188243a5180a141bf8ee7e208f36fb9625b7b19ca992e1a64d696129ba3ed21ed4f565e31cc57fb6d0614c44402f9ca9a9f5bccd57292cfdf0e2e7775d0a223dca22135385fb9cc13d83a3acc3c08572da28aece2cac02f724f6e8865d8b6ab6e807f3f4d89b687cc1b44bb25654283a8a3bdc6c5aaa86642a6e0b39785991bca4efe1553a0503edcf6f4fb8fbddafc4680079872a9ed8a699c35983caf18831c11b6bf6719a4c4aca8fba1b02ed6866ff94b73e6bfd848a40b7b0aff0c96d574ad474607fedb5b6dd269b93e32b38a84f06c5726873f230bd97f6875ab6e98379306ce8d080f2e06a1cd323c41ba322e9061a458c4ac1d071c2f61626cf0f4aec3df2d686a64d25e312defa1fb5cee9253f5667a5ca902dffe71d58940e2f7107e2f07b7f010ff580c74f1d0e09a66b01fd2a0a3127ab1d776852e104984809f7d78aa3ab56b77a5138f368600a874abeb68fec1ba90e37e4f33e9d526ac210f348a0064098818dfb68063e076142506638aae5d014e7504fe6c326557a419fb6278f2d60313eb3ac67a7dcbb11c884e5e3a0a7d60a0bbd873914a95b90f36ac2544db8f7e389aa40e33e1d1e8c98b7eeb598c14d656f593485e7ad812cb796b842814f09d16362189d0650b193c4487b966dd03c914dca5faffe48df9e47f67894049a599eb3c5d1146d83513de152f1c67aec69bb95850a990ab6d652fb3234680b117431b855ad794143f6a69e3fc7108fce61a9605e999088f391e7da36b5dae2514b69c7b0a38d6d17f166df0c459f2894a83846ef563adb33bfe8687c756ce872bb0ed35643e5e959c6f94ed028dec9db7def6271557fde587e493c7137bc79d3ca7b2ccdbf4a6f06d49a4fc8048a5d5ea7dc61faefc00f2ce2af0df784551b6fd4594f8cd4d417deea67ad7cb74da7553441dea2db035b2790cac52ef035e721af96075c1ad79ce136ac32faf7bcd3791e5fc3043e1757b971ee7dd1fada40c9ad8fb8603fec01d40a47af9c22e50688ee77ae00c59abd38cc4ff0ac629e5433a7c36ffc5b77a32f7897f8608a1561272ef648beb45c0aa0b52a0100000000000000000000000048faa554f8b0b48a9112199acb93296e23138aa5bcca2d33cf896cce58f9c6f73534f452f864ab60608af8ed45561a8dd88ecdc837a228cb3afbe7000a74c742516519b4e15d237d919f415604f590b8d7c37efbf56840ba6d8fa5093b186cc7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b7b81826b4a7b6ff6f155a3d72c1c4ee314978b927a51e6e7be3facbfb1ecd3cccf52bd44ab695df84dff71133b294a162066d8212e46eb70b6210a9866cfa91cd459201723c40a69c1e52db1fde37f8e42d0d5e700d7490fe49f667e9b5564f654f8fa289570d029d73066eaa6e98f74d6ac2b7d1d830150efaaabc03a9a4b0303c2f33c3ebc1533a20b9bd4ef6f2566c4619f6dd705df341e399cb098b4d93d0229c76ec6cac33e76f0b402be8451e7ac843f94f534f1c5722eb64559cead8c400a05a7f86917575248aceeac2cbd29bf1e35e109adaa900881e59665b62684979febcd7b00f449b9423c59d0c576387966a81aeccb6d7c03863ee607f86f341320022e7d27b41e007a39cc38de755e785f8700c6008059562f2cf4b2c072ab1fd79f03108a8a1719e5ddd773f346aa4c1d3ec5fc31ef4ba51fdf3284972f79f312b079022b1ff6d67f3723536823a30334c295f6f546fc1d35ebbe6b59fa66150b2ce31f020e618ef4f5e2f4f682bae1310917c8362651f150f5f7f51343c55cef4000d72a0200bebd2d5959333228632d05566da28bdf059223d2d231874e78c2b40959a7804294891ba0d010a5e5c090ed4be6105210da9ff45e82f5add14b7eb96eff6cb0b7076a4273f9ebae33e3f180510102a99df9773d4bdace55462e4b692ebd3e9fc07aae437f23166b3d999bdcf17b6c79e39dcbbfe7e0b95b4dcb1558f1ea27ac03df265089789fa2b93ac977bcb610789effb20bc012c1470ed1e2adcfa100d9c9968001b81dd37c0428d888d219700590d7664a557261a1ca1de80819f67e0cc2fb8b8056ea50c312c3ee7a0bf1a12d513dc7ca0daa1e7c9d3d0d82699d86f51492ffd962e511fee057e1edd05e10fe4cf7e323630c39a76cf344c5ad7f0ad490222c291a730d8a1ed535246e826a5304f970e3d8bc83ee4dec15376d7bd0124723e657c0e69362c49cc2be0d048acad47030e87b0ee1ea776d21b5f091b431dff4b4aa6487b22d976cba02b4dcc290ddcc09dc4e54d0322bff2822908a5fb2c8d721bb7c7159b8f2d6a1a57df380dbfc0977e6b3af6db6ce1df57f1c9ef2343cd39f39e08cb27a95e5a66f797b4a4303b2c677ee01461ccf8fdfcbd717cb5ee4f8794eeeffd446d9387508f1c77f37032f7bf99033a9dd4e975ef7d7e6f1bd598b280fe611db71dee7c2b4fddc078513ef35d3ad7484ebe7f51c15552389a190a37d8d48a217c785ae671672f0bce0f46ec8573350b826a2dcb40d96c63362e1b02f5dd47d3d2ffe06914ee024fb82a075462dee8890844f693b135ef843f900c50d5668125091dcf5a0cb7376f976365fbacf7fdc19030210b2a43a1815e7daebf33669c35f4fd947a78a2741e84f7443b2facb7671f24a4befc1f168d2f43632f0e1a8509786833a8152bc04a42eab6ddb91ea72bfa984b0f1649e7487033628dd5601ee2a89f1678abb805cea9f707e128341054650e39531e3fba72683ff99f0c9176aa73e598224e334c39c1cf2de0cdc1aff36b3fafae13160f9c0106174242cb8dbe6d3bbb3bf577b4426c512e2737111850a30ce07f34a6b329cfa26040213dee8e140f252b36c602cc009bb6acb9c9582cfab3fefd3cef2955a30c6df537451f8051bd8ffd0dfebcf42ae8650e126f7fc2da27582526913f0cb36d5f2ce8c7d0d35dd77132706eefb77afdf2d09dcb7cd5c2b5a9b23c9c88318152747d6d9d459a33775e817fd399e09f7b8ecf1fd30bdba60a7d7f100edea739b4875b4fb70e95066c764c105820232959e811c171cd288034495f1f9b4279ea732e87b7de2437f510caf1b765484a147c3ff6d22dc8cd6c6931a41c5f39048974940f30cfc709cd2c2bf6beaa318b83b88db5c3db8d9a6ead11ded478957d0d41fe9268b8c09901ba79846cf77e1f6f75f72cd6e23c36830bbe2f695f89cb989c8f5b6745956d2f30f4c686435cae8066bf22f0bf39b0339b1478b239eb10e1da414c059d53dc3b4e71f921afa0e86a3494018ac68e1454429567276c7aa3cd3d972b6abeb18fefb32da77df9e3db458892056db4fa07c372493739e8f35aa1ad92103d266b9cb4f429f52e33ce965438444593220b030688a8817204574304b4ab65ec64e86daaa0fc9c0c71b121fa2307f91bdb4660575aee1ef37231a699bc0177a706ea5c0867e1a298e0e785f403a065390a42e23c76b3037d69557896a2ab28650d80738778350be0dcfcc40018ce72da3543fdbadecf16de4e289d53f8b26cbcae30078bcd3577c27fea9100a8546c8e12fba8ee6777352ffd43cdf89bc8f63a17eda49137b99256ede420db5498f64aa75ef83f500250cd4a94a2264e36e97bea28e12d27653758e9b73045095f1094038c7f0d51877320aa5cc8504ff732340a11bfa5be9e0e656eb8513fbbd0a", "ac52", 2, -452437318, "78d11296cfe45aa38180937b0a07c9edf8c14722974cca008b76577115f49a2d"], + ["030000807082c40302e6638c1828b5758f8853aef2cbf60eaf2cfab413e2f526ec2077439bb39d54ad0000000006526aac53ac63ffffffff4140e3d6dcb717d91513623020b9272d0dc73eb0acbc4ff6ae9e45e70bef31cd0000000005525351ac6a23a6931f03d4156b050000000008ac5300006aac636ab2b3a1030000000007ac6363515251001ea42a04000000000351ac6300000000000000000353c6710100000000000000000000000050779afa1f9f8d156a04451f6d7fa6c7a2efe5bda6c73cc625a0002e69c5d74c7454ae2d2387f51e18e1528aecf73cbdb6d3af8a4b1377f971227c168910538713200e2b9c674e9c10d08b29725e6a0816ad8ae4b87b47d3b73b4addecec5376000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a334b3aaa99708df5f62f5c41d419ab2ee6bde76b79d710d9247a270760c8662ecb8bff7ed79830a9ec55837d6476bfa97ce1e4265cf5d474b367bfd289219b7ad6adf5a706600929b1f7a13e9e805e5ef0566e4104bbf2c5f79b7099cffb97b4f95fcb2e2fc7b97101131a3414ee839f99128a9444e988456e3dc5c16e3bb4021cce506906a8b7fc5d65af7ed47b843b9269e0c2be88606315bfa6c55b2fb059021093e2f999bc548449f51934c15a1d28bfba273de98bb5d1cfe33ff2ccf86b990a03a3a0527d1ae174fd568a62e7cb949466cb8d26d8b4d61e39ef20424fce931fe0572e6c861b98da9936d9226ede3d6f1c303d54283b6e8ce3af196716aaf0d6022e20739fbdb8cbbf72e991a359ba033253a774924e6e31e9eac11c14b6a58fdd03149daef4c5cb5a0e90f34ea49a9ebae5ca7a7d10e53a1eb967e368be7d22da0802259c93c38b042a8c255b1957247a2a443642d9b77d20a7cabeb424d46036b6ed032ba8a0ef941c30b0124959b787c9671661d4baeddd99e90d67ada08c21d92d06032a65e88e24f1c5d6c54c12b1f0a109fdda101c4c25b19ec911750586ebea08a96fe2c350460b95ac788473074cc550fe5fcba722a826936bd1ab29d603a84cbad614e0d6ab296968a03d4f89c00c466988fa5d9d331f2fb00b62b85560f5933d9a5ff71531c5bc9c28c4a94499b2f0db93641f8ec16f3b40690279a4f18b0e8b908b10de2c07b4f44d0ad681bf04f1048d6beb26e816e937c68f975c33f9adda5f52a0034180d69af95ee8645815bc7ca2f5fe317372d2808af9d9fcac91481823e5c2186f0a6fb5f4a7e23a1a1fe52530273666f64355ecfe7c91daec6880abe588b1e201342bd92a7ad53e9ff8063851cea92c30f081264fe75bb109879649728a5b2d6a7da08f7a1ac11ed4b61e3e21d55911f2d78c76c3d508d7b5fe908d9dbfe041b3097fe020612732fd1c46a37a443199d21736f4ff25f7d7fa7b34efa61e6da75f9a783026a5da3a41dd9d1ea0d95bb9c4091102442e3268745752b9d6a23d7a8d22e7c759cb8d6709efe73b8953678f4258a42f705c31928892c579cdf7734b9336ba414767cb7c9290c4024e941e4de12591c9773c84fd14a4d8344d551ff1721d44783d9bd13939dab23865ca114ab5bd03d267cce49fa3d6eb3f5a0d937adc03bcdbc6c79858aef961ecd324b20ca4b36e4a7dc010128f0bc315ce317324719bb7ee99362b3a3c08cc0b272146820e751a29a7c231c067dd05765a3889fd47d7b84f09df3bc8123c54e340505b0713aa7cd3133fe52c331fa382c7dec2026c4e38a0a74225f7db3c6b3a8af4fce9f0b988c7ed4579680842cf737ee5c7af1d4aec87f4d4a73f850a30935a85b2171777612ecaea761fcb107eb60c67ceb83297f3156100e6b2693eb1e8026e4a4f7e4a293d2eae2eddbf7840840e653a6bf441b48e60ab8e6f70ad743b74d27e3c0d22a434a6d6f964a9ab56170a351cf4af1169998151b6667a2968076bdc365ee2541996e3db68ccf116d1a12d16394a222df426423709582d8dab6e61b978403558fb228c1d96772548db8f3ee17b7403d875f24fe21023010963c155e49eb86a05ddf079a09fb698dbba9b5a692fc4aacc01ea57a6e8216880232306c9c8a1a51fb1ff72ed2d1f882cd7480f5c9f4a443c06dbe6befb3a896791b160654e89314ffd0d6894de7bcc1d0ef39db266301c703ad3e772485c4a14b9664967969d76910c005288d5f68580bb7a41dea3eb7d60c4a5c9359a07a18ee404b4d64393f68948e6d9f20b1e0d031af034f746df35926a7973d659f31664e70f5284c569da1896e9cd8c695ffb6da275db93ab5ce47135e8b6a9d98a045fc5f7bd4b43a01d043822ab5abebbac9a24d00fefa61d4d277afed93c071aeda169d923e492b647a5897d0556efc18fa9ace532841f8224581c8b63e5f1278c5f08ca76c416f8311ba276361bf228cdf34d7cab6b0b22afa2cb10db920a74b0a60ee84d482b6630e31232f61b5d169ae33a2afa0e614295495990152701be969d272e67bfa56e2616f2faa079d78521f5faade3d3b9f10d23037c0976eef749167d1de2d8eac4f6438a7bd8ca281d73b63bc4324500c39c337d991647eb228e621641c960284bf3ea806c3ce6c81c9b256c3d4bd11a8ee42875d09185e4b18f0f220c42d69973df7a7cb379b857749c4a661455424732db43963264f5a9fe639ccec4b84479246b768b56a089e7596c6b428dac5aca8a38ad69f5519863e6e46ddf49c1db2179fd01000000000000000000000000707ff7e0d62857614bb9cfdc9a5547471e1476b8a6aefd2373273b8d18d7e562137efee746c2ac3d687afe96b609430d6cf7960f9b6a4bf14a2194641de7a2d09f634a50d9718de03f8d16715f49fbb9ae76e809b8af7e56e9bc8730b884d0d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249af0c0181e149d75e07a8960e75bded53ad8df10003eee71fecd8eee133d0e99b494374174e284fb583bcb47d2408333aa7afb94cbffb88233bd438995fe6b8683afde70d39da71456e4e86a79ff23f58e2f5221da1499d611b6e210ee9061fc77722c2d9b72c14a799c452313a56a92766d90ec4dab1b12d9edeb2e15097603268c81e117ab1d073caa9023c57fa0a690d8f443df4c1fbf507ad94b99bba696022f11eabe23d5a1284cc63ce82fc7f854c558ab383f0f53cac1050d88cf0830fc0b02c9391eca3286a4a26646c7efc48b0584d23f4ad21d7e096f5a1918ba227ed0824a3870fe76e8d9ff4680a01199ef949d5a085b0e2bd3a67bb9e086b35f41cc0310e42a0ddcfd66ba3059ea4b16715abe333f9ff4528e81c7affb49a3805ba33c022d8a9b97b70de6df3f62f3ea220175b5388877b35b95e0b2d3b96336be00dbe10210908a221077d8ad63589a8926dc3c979dd9f6db4deb4ea9d596c90479e206f8020f472644370b895d0aba1b060e37f3e4fb5423e88f28202b155d8592034c172b020b7f0c96ac683eaa60621a7d515ff6da1e8819e5e1eb474f086615958b16ff7ebafa28ec1861090e1e441e97fa2cc789ec1f954f0b2c09bbc7f60239e37dda5478b613203cf96251f2908879cd750dd01cc30b4e91c32fdee3fa449b146517e932969ea45d671f7e2d083de86e5c5f592e500e5e16d2d6b5ba24dab31912f92ff6f349bc1e547fcccb0fd4fdd04c15a3a98492046c61da26fe82b82ee96827761a1836ad217f35f3a7cca966cfd585f84dfb13cfc8c002c0ca7e59f7066fdc4e00c2aa2aaacd118875256d98447bc7cc9200d282805c55c712f55c40cfd071fd965b00d23c1419074d63343f9e917c2a378243e1a483d9a897450cd4d6b4efe757366ac01e200290ce35226b66e438097434f68423e7232b8a5d5e1611cc2c1035e77817fd74263fcc45d4ca94bf2964c4ee2b9ad7853875f62922210b7c48efda9505630264d3b05533d1e5d4610413c30c806465d6bb15df4074b520b53d55b254ac4c8494857d160251249b938186eb4874100b7b95988b9d65c31400f39f91ff4081684bb8fe747ecb6fa26af56063a312ca743f05c1a07443ffb75edf4b59536ccf39013f1ba3acc5ea57eb4af446351ea5038a015c052af9dc40abc327a62fae37320a99724911fbb024a7e41d0cf7e1905219ea07a2fe89d2c439fbcec66eb58600f4ae2c2b898d78a84afdf622d992ff90cc34d7875dfd1c53b4819b4c67092c35be3aafbe6f4a1b44fbef21f8670f5366813523bb4b0d4c43619c56f21af92f084e5882b1bad902bbc62c41a42d3f31d735b2196598472813fecd8d26c54c84b43189d485601a22358b47e2bb69ac17fca040afe952ee6479f76dbd009a3260f08edd3b6fe3867ba8a637c15f79ac6852883792e5e72bdd9075d301ea530a4bb8ee656074921f6a1b3e6c420ff8736c8502d4f874bfeb03aaf1e19b0a471816b36e6960a7659f91c97128bd94934091e53171ce5fdc0830b608297b5e95dde5947f009008c17e8191f5dbfb8edd28ca9aaa30b7508458b0ef7c688afd8443e5c4791d216c08f4e4192b7bc05b03c72329106d3c91ed6a7e9990e321a821c1ac9f7af2b6717bb5df3009f978e4d7b2584c9489cc6d27252a5d1140eb876b40e36286e45fe461ce50e09c7fba25e0fd4c0f0671a6e69417d57b55d81064d354022a50305d2a28b4df15eac66d037824f1263eeb5d025b22d0f7bb909dae85bd04e98826b3ea59b6c973ba2c9fec6d643305f30adbbedc8437c69bbb9dea53b23e52cb0640f1bbfbdd1de98953032160282d930e1749a2ff69e5685b7d8f255dfc18833bbfad644f1be71900bf15ad043657fff583f942408ffe5a2b976c39e00ed5bfc39d010db9d0fd892de09492db55c5ad29ea810c87a6ea496a1ea5d6dece653dda00f58116e99a1f75937ef8d3f49fd5678cb4595e2065bffa501e2ddd9d5c3d0f336532db5f4da4940a623164acdd2743555902383788b07c41d3a9d2d29e6ca2b217f52f2cb79ce502efd691ada4f99103ab32d13982eb9dbfce2753da29e38f31332e84a171ec840c83e9c8c8c7f922904e6d4a1b7013fa6b9c267b8c08f5b1989995cce229467ad583ccf958b7f84b7d9aa41b1f7e94ad052a3eae1fe4682722a4d48d254455c4c3c91e5e14990e5e8bd91f13e3c6132e4bafb54ee44d8bf06abec1d9139ab5b888cbb3b91b7f46b75b94887778f0d551e060fdf2a37a9e6fdc55315cae37037e87cfed0000000000000000cdb25f04000000006cc11e6cd804c21cce068f528b69a09333cae97c85c25e3c5ace549a0b834beeeabcbce8a54403b614823f47fa5d2d4f958840493df657bd08dc20ae2c872d0a3b0233a064371f5b9190b0d843423db10b9a128de524099cb8b34c3b9f047b80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c8e865717486e2ed5c7e3d910ad10e91835f36a1b64b1a3b159814aac792ef5fdc8eed704f7d89ae3985cc3606f7239380f107ba8ed9a005f2e0986f19777b556d1e48a65c399de8208c27a95c23ae0accf072df7e0f95cedfdee393bb4b3e5501bcb6d47717e5e72abaa14d931bff875b33b1ef9b13a823bfe951597b9e6b8031f75196f4d5ae2ffb26fe01d055606c561a38286df01412e041ffb96da24df290220ae1702cc911906f0740e9330705b26e61b53637b14c5e915f3045531e68c8e0a01c53e209a9d0fde72cc172ce05a04be576b13c00e8b8eaed4ed9b11231c731da411ad4b3f1bea615fbb23bb375bbd21347b0fa4428eb5f967fdd3f9891afdcb021ce44bba2bbf8e1b89a2c358a06fe5f11058fc6938dcacf300f557b6c5e8f0d30303a62615fd486fed1fdc834834af6af78f34421ef9aad5f7c75fc68174b23733020b41ff4dbe447eabb53ffc0e159a5c744df2273830911e267b5d73ddd8972a000311068431f04f79846c776621b786f0eb03809921ae16ca373367d4f9b0beaa560221b263aed9aae7bc1d4db23776f5a5b0de49dc2d5809cf7ff31e18f0e9063020c4342701980d1a28edfe7afb2ec46ec89ce529a8ae49ce016ab92a768019baa4fc810f5b5ee0ae10a82dc569eebe6e68b2642b90d57858a506f174c383403686bc4c206d6b18896ab3eb18cbaf40492bd2f6ec4a969fa18734c76045c39b089afa3310b1db12944ed4aff8ea9f327df24a178d4e9bb3fd565cfae9b1624a92621b363514ad55d3ef8b4b680f8a0514298f14caef77ccb062ea2cb5a3e38ee20bdf9ac67f577cad996280376ab0a22dfb8d03ba51a55e553921e98872df98c4472d98dce72d800d12b4a2fd58e80f96b97f97fd733110914381cd357ec69201591e158d3157ad467f1df3fe81ca290b14f7985b2acb45f9434500e6a04ea328b5e374a7e3809bf97c574d3edbd8847e95ef0602ce16985a8a9046df5b7cec81862a3ad96b1e1d9f1bc934da85c69fd443e1f59aa210126b6be53c53af9f94a3b841daabf73148fb70d13164d7c6ddad5150affc4403975660f5bb79f7612ddc77f1a82a102aa1c245600339fbc1faef670d36ddaae22ecd525b4f95daf2f6a2b56320a118358653921d95383c21a23cb015b11b851b0bc6e426394c7da31fc090e101bedc2ff41ec3bdc15757fcb68c8ac78882a32a1d5cd734b4fa4ac25f11567aa934d211dbebab3ef00efd19392696d3da22390774a41d4f0a3c8625aa25e25a204e5fe4627af554425abf5c82d5e2f8c1c6a3d6bd07db26a0c555104bd29c6d2512fc15b53fb39958c8e056eb75e73ea3d22d7de7117a6a862f1fdf674dd0f76f4ac625697ad55605cfcc59c2a802ea653f03c8315ee3ea6823eaf8db8dfb8c744be4968f29c8907e7f3344bd95a23f90f92e65d4c99790ac7ca6fc5eba1563626813460334ef3e61244acc4bf1a3e7bd2809f75a21194e13fb2b34a4005d3fb900199f06adcbc4908854568cb54df0c1d1faaebb9889599a66e339e488053b05ee6997e0ec51ca1f475121171833fdabc708660d5bf3d934ff5e71d1cdf1f9cd0adaa44b18dacf880106fa5718fbe1fc0dc3ef762041bfa0ace40ee7d1d73692658e3bfc37a32a1f8d9d78119eb0fa64decb7c8295e9a38213a44fd1a2573aa0c8f0cfde398646ae1c97de85e604299ee238639e36f5fb6bc3c8ed7076495709d112e93a6acad89ec5e9c1c627b7046b66b28a65af521ec3e5fa9485f993e7adf81d27e0164f8967e3c5bdc2b8fc7ab90b85e1afafc23658e1f3fda0384d1f961c646ad3fbd4d311f9809d3ab80fff0d5a9269636918fa3cd814e64d138a7339d993ae8759557e4975ca7f41908736a490c668e188ef24866af09f498490081d533b2295761d6b65482366c22ef702af1e5c037cfd86190fadc279a8fbc26e33c9d02ae2d4fa7e22192d62fecccbae52241a664348a9060c9396a06a73e90537bad9781d8fe18f2d25acdf11893ba73392c729f8b6218c1c1501b4510eaca33234da3de87ab495aac354f2fccaf56fa86c844fd3cae9d99baf88a612f4f714ef53568c810bb01284706d650a3c2aa743a989db54608149c775f0ec0419cdb22402251f70454cbfb6d5ffa98dcb8f3f097d1b8f09afab4860c02707b7ab41820c122343dae3ea21c761db958b327707563e59dc57bb6f89bb11486f9f62f1ad60e1e6dd9dfe7d8e6559aa2ff2b940ec8fc156aecb9f53cce3f70cde3427d28a241e3351512c5d92b4238cd0c81cca98a58050ceeaed90715d6ff3990ddfd4921936cd412dfc1cc968dc2d3fa585d07beb7c848e6d906364a4cbae2915aac3737a10ac7d6f8c08b0fabb15c7ef7266c87612571126d6db4b0178fba27f6516bf88c33b2445883ce2f654cc008387cad704", "53005263535251", 0, 1931210944, "e50ab954555e25a02c5c5c8b7fa85a0a4f876fe621feb494e36c8d0a3dc0271a"], + ["030000807082c4030167100d6d5b1e30d5c34a33666d5892bdec051aa3e12d3cb503ee1e0f1a050a8f03000000065100006a52633ba8b1e8034ae4d40100000000085153006a6a5200528d126d05000000000363ac6357ff38050000000005636363525200000000a4bd99c700", "656a53", 0, -215140001, "86cd6245af75db2d8b1715c8a8b1b5884c551db006478c69a2b729f8ae2ca3a9"], + ["030000807082c4030380f285134da1541565cee822f3e5b87d724110cc89afc508eebbcccb17f38817000000000663650053ac003b352f74590a67b4197b466a87b81a1935db599c648bf967e7752813b7ec41c6a0a5fc2401000000066a0063655163c9fc0f9de7fc3d2990752f7a9d61fdc6a0fd0b4025c8488c608f3880e074e21454f15a3b000000000453536a521eb0740a03bc9ecc030000000003006a6567db1c010000000007006a00536552ac2c202b020000000009ac5352006a655200000000000000000000019ca1f502000000000000000000000000cae4e56dcdce126879f44644ee474a1994a12c28014176b8e6ff468c05ed6aecdf2ea0c5a3399af0a2e98da4e705c400afce42d358db56f615a3725ead2ce83d8733e87f7daf7c2b3f6323b1bc69b63c62ba00746e7ed943385e5de903f28f9600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b4d672fe34924d0eaa1064693092c9b42942c3c6c171483f37114b7686889d0d04d69a240c5533839dddf971c1b515382ca95529f368090778220aeb5e1e75fea6b48cea57730ab25295e18e271417f73a21c4c1fddf7d679e604b223224bd7d6b99edc03fc98aa38843fa8f7400fcb510f97cab61b8ee6d1567a3db0aaa2cb502228c3f6447ca3b455ac211cfae16ba6789c58762a388d6b8b519f1182c8d4486022de3f214c5390d17f6a1f5f2911eb0cc2dfdf9544579330647afc7efef8da1d20a067ac832acc64645978f5645dd0166d7c0dc1020a1982d370f6145b4238c1d3a446a9194a7a4a6507d5d7c71deb08b7db87c650bceb24e479247a84ebe1da95b030b087a6559d936c69d565066ed7b7af403d866bb24cb0caf1451ad57c6a599aa0229fab4619a667fdd49d8a9aace3c6f486165a7e1373fdf54b47ffc452d0f4ccc030e095168a7c1df27ed2885b39577a5f55bedd4fd86cb9ed12b9aa5cb9885476e0216083d3661b21ea8e22ea4c0a10884f61b5726f489713ad0d2d175774d67c1e8030d5f80834a27915b8da375ac9797365ecaab30517244f1a45a219f3b235872df6deb9e0c07233c51b3950c91f8346b334a91c88207d1856f365be27f6742824bc7958a00eca8c8d822b369c31be8ac879375fb59293908ab0f500985062d45f8a35baf1e685542c06ced3ccea99c1196a5a71f034ffa3180004fe553d0aa5eb627ab1af77add743dc7507678cc17c2bb76f5c4b6511c4e4878618f5f0dc1ae11e3d4e9d57b109379363d78d89f4dc350cd73c116442f50c00553664ec1b1cf4ffb847727e70e7d6acd1617c4020e4d949e513064b4aa86fa0ea5b99d5d4b8f9e2e2f75705a9d48883a178d72f6f69236915bac93b38b93ccb7e5940aa80fb0c6ca2743e8fd97495fe41a71b193b67787e001959bb23c5dbf5f9c308f232c59b2a9cbb257e9de67f7f350eff8b1389a976cbd907aa0efc0b05850b9ebb227ad3530646c14c6ec46fd6f0d7f6eed3be8392a0e3103903e5b3f46c111d6affdca032817ffc1140d7b196c2b7ec0c712da14b8ab57aab17cd358b5d6aac9b889a9adeeb6dc07c2c8a6b7787e721bf68b08e58b37f69441472d9d05f54069abcf48bf3767947e168f0089fd4a37465e7ee727ffd6e0d7c9ad796dde4909bde2140613e8248ca95ca67bb4c0757ca3344dc4080bb8e79348a935898e8d9af05483ddbfb7299ab3c5b2e7882005004bf10b0a6f0162206d0771686ac25215202ecef93efe12dcb0c06bf9a647bb061b8705ea29600a1f245d71025400d3348849e9c05690628a7774be4c98bfc70450992300f7f969783047507a3dbd7885e27ba921de2f7987d843efc1ac57946443e04a864ab0a6317fe9d6a207e746e5b1e60edba167a9b8e500a7c24078a7775908a8dd7d1410f4532e72c0cc2a53fd5bc85f4e524555ec45680f7c7291c9d36d48e216a18939e78fd8ac27f140ab1eed7b6feb5c0e7b3d1ac2f8d0c26320ffe4aabe72f177dd2e571b57756abdf44032ece7fd8282524c4889c3526c09d7a0759a4397bb29554857cc8709114222faa8a85376a1d772f58ae0dabc1b6b5707988c219b1ab73f95f0d2e92d4e6e25246c8b8d56bf4a2790526b9a97d7b58dd0087d775613214f3dcf6601714e28799e46ecb93ef68ce439800c4ec8f76c18f27dfa171a5863cd69ba1d56c215d13540c5a4ed79bdca3ed79e4a348270346438f66cba610ce6de611aef20f274657d594b3314e834574aaa99799a6f01b114b065060c1fa90e64e26bc7f0b31f859ffd1a08ffe6acd5534e5355bf61797ca8809b7584aa9cf2934403f6fc84f91662242809ead38276ebf4ba5b07866b9f7dd0e2cbf39c849d18db05400949e3bb191382460b7e66c1bffc6b77ec32c2b3727d3cc258d0cc2d6a460910899ec6311b1728aa7ed2b26a01d6ce0f5fff3cf0e0bac20ccb36b555b8a06c88fa66c0f7715045d400b0945cdb96de3ebac1f29e600963e955c70b2f95ec16961a9df0d2ec86345fcb79d9ddbb1a4f487a4ba3b1fba2174e17ae3e2679ecb76e5c20b5ad86a8b9accf7f22c70308eacf10eb5a4d26c8c6041d45875c7c05b139c6d08e23b338bfd65a4c91d9bad002dff1f6dd6f3869b2b0d11a58a25a61ab5d361fa43695411a7b7c55045ccb71bdb471bcf5a58ffe73fc236c0e24ba0d7fca06c86775062138920061a40931b2749173acd83c3170b36cd4d119a3f24a5681ed8d0d367a385ce1f26beae520b5a8a082307b1bc73d32326b86a57b502810b10021cfe0236fbbfabfbf278d46f4894a77e474a06d348c5485a8bb185e3e7c81946cb3966794d3717e7a4971bf8d57553a30d25c7a245ab32dfcdeaa0ab55acd6a892ceb389eff22c00f8ef3797673714384fe138788f6e4c5ccccba07", "530052ac005265", 2, 1095169059, "85dfb7885a4738a6c494b6c58825ecbd91082fa5a5feb7442d105507de81fc8f"], + ["a351ab40019a4b2540bade0854b3e504befd0a75df48c33a948a33b1230341dda4a99f7761020000000152ffffffff01efbf110000000000036351530000000000", "5351", 0, 1028052498, "26648ac2ce5af231ded03e78f9b4dd73db0ad296c2964265c113f78693dc03f5"], + ["f260f55a01d6f2f1fb0fff5b5b87157c2d1d4c0b2538fb6e30123f2aae3b0818a880f7c8ed02000000026365ffffffff018ad0c6030000000001533bc6907e020000000000000000ca75ba0400000000c7158fe3a959db27dd90ffbeae4866f89aca4b305837e0220611a1383ac9a6aa1bf04d3fb8f2edae85e635872b1f5586e47e39adc624d38429bbc2b037d507706b87f7350677e5d5e2f78d5f82258b71f4d2a57f3bbcd5e4e05b05bfbef88488000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007e8e18d25407e19bef6618d312b53330344299d0b02a0c7708cf21a5e64e25739b515ef97cee1b7644d21e7a80b1e03dd374f3037c0bb109252cb9d2deb33df06ed4de0fcc995dc1c91bad43e90690c7db3171e068861989c77a8a30a3b5f1ca1156db37cc7ff2013fead133d2b2092839e1365408b82c7f29de2e803aa54955032ab68dbbb8993c4f6a8bd67eca0eee4dac614732494566f125e0bb8ef134f76602252dde1b15399649f0d5b1c954d5b207d9ee3c0765bd4fa8667c1d4a2fe6b95c0a000604b7f5343c1bbb566e2b70da0ed33a0c43c02b86d5cc4e436517b3a42767be8cd30cfbcb1bbffe5246aafef488df125b6cd7d3e5b3ae09d5bc9c658097450226080c076fc9c6c51e96734562c9f7f983c10bb4ab35db8d87c57bf5ea68f58b030bc9e4536d5fb45b24e48d2885aecd8e58fb7dd20cceabc4911b8dc1ebd5f83f032230eb59c6394e9983bc9a6fa29ef2b947ea125ba91533c1bc03824cdb552d2b022d82c91105dc8da5c85dcfa27f2c299bf59ea62485d840694d1e14c2efcd8193032cf89dfafd7f9dbaf4369cc1383f2cff1b29061f9a568322ca925a2c8cde4c4a076d00e01cd98fd4c625cc5b00383947169ac16bddb787847858e53348483d5155e0daa8e1dc70b81b933dec0f4a8b31eb64cdd60fce31657c48a19fa0f3b02d819a36e36eaadb7cb1b620bfb0fa27166db787c8f2be15a19254c48e7de352b46fc15e8ae3d93e3d6fe9af88ed5d226414cdd1c3ade32e61e62e142f2eed5540b3f87c441e17a6e93d19a0c6154b29bac390dafd6eacacbc4909ae9807d29c93670f1926fad3f851cad18153daa2190738094fab8f810448fe829d82f7321e3e32061b7fffb488ea2d1400d766df7baedfa3075e5d90448a30648c958ba630ae267143beb9937f7aef3676d533e327123f90dd91979a9046f12e084ac2e327429346ad15a84a5c921765a0034274b3c26462a7b6999977bb0b031073830dc149a1a234ab0c3e14b3a60690d798aa5f6591ab59210d4349fc11dcafb2a8f6fff0bb90f03557454a3ed6d93098156256d03c78af655f44f2012b2d574aa1df0c08e7e6a84594d7ea487476a815ca1b5e6d3dbe5246a51d81ce0b81238bafd0029c5d171b3ab2209013a33576448ff0982374cfccfee1373b2a3576febdbe5ca693c3687937a3c3545d98488fcb5c3774bf4f968aadb731fd7567c41efd016596f0da22d9009f7d4dc2f90c1a2b3eae3ff9ed369c2e131818943b40ade928d4b05022e7855c5ff96719e1b38c474ed5180ae833c29afa9d27ec232fd211c673449d5d53b9c2cfd094fca2209403b3fa05a14ecec81593c956238f68e17e40db3b9c77b549af722f6c7c7d973663b23db7b4ed4e55b96f2789d235f3b681839d977b3e3e4e3734d021e2a9caead8311f9c8177ca081656baf89f64623e75802b98afde65deea8222440937ab48c7d0c2c83125eb478a20a89ed4ad7a185a3da5dc708603727b03a1ffba03929ecb40f4ec2f3b9538eeadcd9bf8a06b7f503ae8f9a580389d12ab61cc849f15c1e7fa69d9da43519326c2a3e8b1ec6beee05ea7200f4eb488e15e4c611210a037b871bdfbec9a5281a4024f7615ec2366c7d4982327e0acd5bdda39147bd785272ef2003308556ab4e8c9d5c64695414acda0793e8e130c632fb536bc9a59f71dc3dd9917690ea06acfb1bf26e51a984057631ee0c55afb4b2a26777024bc684771d28dc2ba5fcdef7f28faeb5320462165cf4b2c555763ed21f1488c1cb6a9314ca4246387811784687754a0853b8f5e07ce099c5adb294886b90d20d58278beac07ef528344032a0ae6fdcf23574cfb0475d210d96000ea41761f9c4d86ed38087c686422de8ba106e3b803db4b043688fddfdcae5543ef93f2097e62096859fac3a1f615d67109bdd67b3708259a836790d60e5de2418153cd5e87c39e1d82e0938477eda0853d016827e4e3e26f82a66f817e10b15ddafaa0fc19495eaeb219679b8e4f211a4513db6e6f3e513376f6fa6e91463d01e677fdc90cca46adcab2be6106110e4397e9ec93f49e1dde6651125c7db619e3d843b064787c369736a697174709047e43d6eaed1cf42b38ca72b31d6e489af6bbcfd08da49404aabc0172cfd4251190834edcc1a1cfe5b16b267610861559d24a9526bc1e8bd48bb839f432916ecb437386fd0ae1dd7dc46ad394ade1c0b9dc0e70c05652364ce46d3401b24ee01af2498048294c59985e1749a32e57e1463c279b7260ae74865de59031c3a9e456920000000000000000277f07030000000035d3ac7bd06c74d9244294dc062463220ae11452ee13b370f8d47ccee7f5b5835bc21c38d5277b2756e8e05d78f10ba134345bbbc1ae0b8af41096d507f0f6bef8db8ffa340b6396aaeef35c51096f69529061e8d9fa0e39c9ae4427586bcbe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d519e500a330cd0d4e47e732146febb3a6d7e119f0dbd68de7ae0caad9397512baad5af31b3fb63ed9dcd650665b8e067ca9bd5da9dd1e54349f6de5e89b49625ed1ecec17fcab60f5cb13d6500efa751970e23fbbd134e19124f2466a36ff5b97ca5131c4ecec5ef28ed9c475f08b0d11f9205038c6ecb211010afc6cb4b2630220f3916abadc87683da78e17294a109cacd7c14d1efd87c144e0f4591d1eacd8032cf4349cb13cec5b10693aa159767d40cfb43656910442a5d58fd3a7f56f928f0a04082f04ff09b472c5f0b6e55e3a9fb1aa6c8972d43d1d70bdc0db0b3a28ebdc7860cbbad642ef6dee0c0a9f32fd5135a65d89ac224a97e319b070d8ba4361d4032aad57fe115bc601c753d2b27657a13a49942c1d658388e4ffdde18d3f543ac2030993fc489ebf32ee3117f9a976999ca4599606f9e13ddd9c1bd7b414b9ea64570211cc08395eacbfcc1164c84e7145896926908dafaff6c2afb90f107cef955d28022575ebd73b03fab43b2e3ad7102a1320f407dce79a1ce1ef0092fb42e86288f30206892b70f184d89fd51ecb924fac70d52b10b3969fe072ea00b507186818ee1b4fb05dd378a3087c0fd11601b7e11bda52a77ea9589d7b3c8221bb2087f1c1a8abce97f3f7ac2d26a9f9f6d939891c335fc4811f09eda33f80a94768240b67ac49fc8187283e06382a29b042ba474cfbe710d245ea2cdbe7f840fe30e32b4835f82f3e2dddfaaf520a51120cb1b1ace5524203da5c022d8a046bf80e0afc3fcf07f2baf9049392cddd5669ead11fad3d28ae9fc4b8bd2a3cdfb60764009818c6e10bb5a9096ddcc703a8ec19cd06a2b9cfa491c3edbf72d38a5627229d22b4e1537c0197ce6739ca0783ebef781d74b641a2430b3affb6b85b95099800a9fbee0735da5cdb80c2761651ac92e2303045db8be32a72e7c0a831bfdb91707f48f5be5c07883f9d0f291acb15d246c77c51a3cb268aad49465938a0742d7c5aa7c3e7c7bfdf2156de5ada95f67038287f79a68de4ca761436f6f9a5ee53da812a55ffcc1a083fa692387fd9242071042c0e5e5d4f713e08dc72d06b8f1b599fc5145bb98383a0f977f83ed79f94c8c40accac615037963bc91edb895c95af68e2afa76285044f51048ce3ee01ffbd1dd2565a2f1242a62b15b2861e4454203eb1ddd47b8a71a50ed2a3131186c98603a724fafc420c4f8ddccd26467e2e54726474bd788f82c2cdf7fd9cc18f3738007f20eab6df7bff9d8cc7bdb5302ee6569352895b3d1ce6a14524f0e91cbfa76a2692f79f878523b85668eea9c9d2b5710e9d9bb0564df76cacf337dfb9d02420be465640699fcfd068ecf26ef6f8bff613d15f481073b7464f91024bf499008509634d68772569f46072e012d2cdb69aeeb87ad338e6611cc05ab8bc821d8a9af714a206704d04106457e790c2dbf2b07d2355916d86c5ae0a8273e735fce88a990a607dd2b66db50a987c2749d122423e0b4f96ac50c74706783e3ebcdc02c38641498d701d984f3ed6852fcf5debb51679f04696845fab53173814a443e8e6561714f690aa647252a78de4374f0b065193f7d7e8e65560ef2cfcd85fe8334827b1f6e168fe5ddae7f223501ea12e3f9e9bdeabf3cb6ffde0dd863800396b2ccf994e0a1cf8d8e936647352c5d744599bc787b1d2bae8d6268492489a92995155320afeb9ba404b0744a43d5c58ff521f7917d594bee714564be928f30a3ee442f2e108e1d4f053716c8f8bb1a1e6da66cfee50d80dafccbc8edc02a4389fe2083a392c926eb4c935c365b0bb212460625eed8b444a48e978301ab45af5c3c728e980027a2441dedd1f31ad7e7dc6ecdc08e141f0fd9cc370cf096ef4d6566aac0a62f0bbd2ee4539d58f90e500af9e840c81a882782babebfcb80af10749226ba430dbb159d0bf2912334ca1bd355f79e9edf471b25d8f418f33dd2230777eb84884e8b8c0ae160a46ba928e307573be453dda2e526504bbaa98c379227ab7243bb555e7ac345c48465e145813a3938483a925c0cbad675faccd16dfd2cf919383364265f8a7086bc336a988676601e610c3f05ddd9ed204f09a370451b36cb6817ffb923da4f7719d91b5d700b4e2f6d2b8de154fe00a1f2761db7f545c25407f3fe75c1c4c5fa49c64fb848148e937bbf9f0931d152382785dc7cfe171ef4861fe12bc96d9b71b93150214513082a31b61db71912ecccda1b5db6e08c5a230eb20aedaa12ab2b3ae668839eb8b11578949352cbee278ebd82b49bf564bfa373f6f01ab7aace2d0d6719b624787a4242f998e893bbd97c2084aaf6c030d6cbd3ca041d285616d21272f42befb4a8b64e07217f227d448e6844ff7e0d1c1ca61f55172f64fabff3082b242d612c89fb3853d6129e9f1009117c16db2f846e0f4834804", "635165635151ac63", 0, -1766492488, "95efcd9531b150d091a8371953db0ab69c71aa36b66b391bd510bad9134358b2"], + ["b6ad5b53046dd980b1d9c97a3ee0afdad7aee0df5d9bb244b2653940da3222199b2d8109d60000000000d4fbe3189d35ad43b9fb21eb165bbae48be1643cc213d7b36fadad4afc989c747d390f800100000000ffffffff71fdeecae0bf411c1841c4343d365c8b8b4536ea214d2db145fdbd8a7c4012840300000009ac536a5363acac6a00ffffffff94b6c75f3c5bde989fc439ab3c6538f50aafdb5ba318e9278781b56c4b26ca8d03000000046300ac53ffffffff03ca6b1b0400000000030000515db3ef010000000003630052f0ac6f0000000000035353530000000000", "52", 2, -1773700474, "93b630bd54e94697ce40c154e1066f45cde2be68483168f0e8abb9d0e0ddc4ad"], + ["44056f0b03378de86ea341de249639af6465ba609d33696367a7a31cdb4ee1b7b741616677000000000165339b82bf56d717b003f47741029231fb75cd32806a86d121ea8c30c38166ead08887b8770200000004655352ac11e3f4fc6bc46804ad52bf520367eeab9eba2377c066d3c6870f1d624547be7990fb6cfb000000000753ac63515300ac8abdc64f045643570100000000050053006aac200bf30200000000075251525352526ae123d00100000000036353538c7aa9020000000002ac6a5d32e97601f76cab05000000000000000000000000588880ff6f93c0767c23fa424ff6091b62e35a6433d6c516822e6f668c3103d38156dfcaa1b36a27e37376230eb253e15006b1e6113eaa1f5a15d9a711a61c0345ea83ac7a6f714797f61f9e69efe0d2ec2294da44d3f41b93ab593d4f4df6ec000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f92bbe161cbffdeea9cf9109878421ec80ea096cbfdbfef75c2ef904d2b7d11ffcbeaab934a005aade37d39fcf80de689f498278dda25d60277acd212cef6aa004135f6ea9f4912221031846301653fd0652b6569abd534b9c1d6c46fbf13ad6781b2198f6e7e32c95cd6369d2bbabc06e603919a24a27f87f2dcf30673a87d030ad7dafe60973be945b7ef673fc8e1989a68a6cceeed5b3810ef81bf73e5ddd302063963f26747294b0027306eefbd1322e8cfd25cebb4681234d3430a67da256c0a06f26aba05c4373abe3146eaefc76c9c98cb549b0825b293916d918bfa1c8447b4378b403869efdd7d0b636414e117faff7d5d3d6c4af3f320497eb019635f620204d195c25963e8b70cc9760911ee6b682282d1aa723c02f158e7aed858096ff4031a598764b445487c5a66239ab5adfc96a738bc738bece598f36ae77abe0562ad0321763a9820e2627e76a0c607c42819b60eb6716c6a8e7f4c4ec17ff103fe08230200be72a88013e9fa9b5cee7497b146de56cca183328e98c8697f25b6ab8de48b03215b4abaedea700fd4e7a37aa3912f3f8be5c6c5d0ec9c1fbd9ca379c63f29d11618bd80f065c6713ae79071d30598e2ede4cd59d999ee9945627b8339188fc36bdab18842a673a45ab8a79e7c3c6759d9e3d06843cd9070ea268e0a751f253ce46f7ce2b1f01b08b5b0d67b2b1bfc4e8392d17624e72d0ba42e9afb156ca4b89f58e5add67976bb4a2af0c231c4922994d91d2622361203e2517bbe2416233e72f878377742b2f57ee0fc71d840d3e7bf92843c2f5a3d9df6855c8b3243ab4ab0f62ea427ad25bbdf8931b69190c920d97d1f89da17ac21cda6ef243eac3b4ed327c1bcdb7c9f6ec212f832e4a895b2a47503ef61f6d2e0934bd29ef23018173e1f277edee3ef606a20bb95565e8cd379da0babdd2a121cc988421622222370e789338b508d78b1d5e427865f9d878b9abec74f956e7bf095e83888a0b8dde3059757cb451d2a3e426215f043baa15e3bb513a0d92b5a0f96854f697d719cdbc555a2191326c971b99683db31e7085b7f4068696995ee10b163107d8fd66d6a374acf1587c6d95cecea3fa40ecd7c5c04f486e33d94c447cc73d31e1418fb2435975bc47933789123a69904b27af3fe42c8da78ab837734757feec3c70957970062829a1fbae6970f6de603a967181beb88118baddb9fedab291190443a3024711342279ac6baa0642116849d009227531935487663a8f7e29a185228533ce8564f9ccb0cd550561b04a35d9007445d7200fd47517f69beb7aefff4be78705973840c78f1c10af9f06bfa369a13145a66a7c14ccab16689af0815ea732bc006c2b06d2e22340e0c627b063219ca3a5acee876bb8df17914b2855e8386c7eb05755c7f33ac4ef69a784c5391d95aefb2a5e6674f7d9843632f85373e04b864e65fbd6ec20c93b4a5e0152e5e44b518fc374cfe6927506f54830997ddaede72eb560ca60f97e4779b5e86055ee1d6ed4add812748ea20f25aac9c752e6d3c7d793a1c80be457d8b11d1b1df52718f9f97c12866b81ba7adc7f215ebd8b9faaeab76b438042638b814a554902f4a8fac0dfbbf394b05b1eb8edeecc2673674a7e03d1c8221c8dd83dba1ecea12d5a1a36e475af7e14c6e80bb51ee71fd0dc6195417be971d9c827cb582ee1800c5e794327719580ab1392156808b5bb4213370895baa54200536f217003554c8acb4069e045f9cea489817b65feac65d88b8a04cc814ac2fa8fc61344e69ecdb6d05fe496111e469f34afd5d804cf9f3a4b7c5bd4a4bb0a7ad8ff2d502db15af2938fc248cebb84e927caf818e52c1ce3c010ab7396d3e35dcc8d6541f02bec6666eb59018b0309b97ee6c4b7d06743b351eb9e4400c839414fd3d9e008db3e21b06cc9fc83c9f36d7e20c3f84724a998eafd29e216346b0743dac1b9eeaf1cb8e799cc3e46738133c433776b1f6ba48f45f8258c47230f219d259a3625e1fbc257753944f1d02001a2646664a9f850a9ecc86abadcc0861389a74360ad6b42fd65efc9096f8fd3b8bd5e5c35457edde3011b618a4e08c5b6c8698485a1bfe1ccf1fd49f7ff0f5c2f0280dd46bf8cde533ff402e5edd12a13e0385bb9beeacaaa3bda1ad118f5c488cc7792ced95640e125e474ebdfb1beefea5317b1b66151574b47e7f0251d5e4d82eb6b57e9b8eb40d8e0ea07655d958326d4bcaa5741cb6a7e09797531f05e3491a25fefa7a44cd7fe5c7daf2e16088fdb695abcb36161540c6ef4a8f914b9e26e3c170d64003caeaecd1848de3169838157e6905d236056e9332d836fb15990b148dd3e180f2a71b84eb6269a6abd805d4093cebf3838da2fd00810022712925269d7f4eadc8e6c9a4a7b6cd595d8d32298ac4529bd0b42243886bb70b", "", 1, 550170128, "b53e6db9e4486a191e269c6b7c03fb73be8ec7b7c3381c83fa81847d7b30893e"], + ["3a6d335a04c68cf3208ee400187d0aff5bfcf2afd1880c80875f17ef221ca1ad0c250e4de001000000056553ac53516c323f0418f1937b5cfab63c210834553b6d94827deff1bedbbbe6c3575edb7df31e3e920300000002ac000ec5c2ff1e301e6417c43da9db0d99382875b3c8af188d0465b3fa512223934bed367553010000000153ffffffff1b2572521533196d4c326ef9215ae1c5216ac6e97993a78b14b7da3c8870942e00000000045263ac6a36c1b7c8049b9152050000000000bdfaed0300000000005fdc7c0200000000085352525365ac636a0a8c1504000000000952636a636a5200656a0000000001c67dc4050000000000000000000000006dd88da4704447f95c58dfb9749ff88816db755331b16bd8c1c1196298d84ee4e3a92a3e5ada615d1a3c3d17c07660d7a9dca8ac6c96c55b89e8c1a1edf1500995404157b1cddbbafb32ccfc5d88fe25a12c27079dbf9d8ef72788d886dc6a580000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040ac512e658e2ff9fc961c577ff00c79869da8edf34f807733019c72c786fbad924733e040727d5735d0d5620e66f8710358f142d330fa03467cb91a169deaa3d7e4b9c8843e56ec4bf049838f8201db6ccb9686fe53d069113741393a603e66159120fd530dc306b581809eaef5b6cac301bf2f2a433661d08e3ece3934b63503293ec12b100cbd405e103d99f68c7596f410c9fe86bd99ee844dc67409841522030790dfd1f593ff7e2161b18c856405144444659955e77ef7c6a53fbc5840072d0b0785df56ef2d035bde00fdbd5e21cc8363bb9cea919e78629ca5fa31ee46211d81925c548770751e396eebfd9d51a4efe2b52eed869695f864fa2d709e3f2b6c0312207f6d1e3c2fac1ef1326182e6f9eea34b0f3b3b4c7f786ce42338a8ec2042020a388352d371964b0616689cefecae115c22f496a7f4a6b59bc83959eeb034fd021ae61fb54e2bc6bf94d1622f90d0ce90b6788adb015a84c04e6288ee09015c00022cc694b868c3ae590fcce93f6fcabe76872dd2bf2ae3f126b23ba412274febe8021b3c1ceb0f22691d2e3fe18622be16c3e930c8ce2ae113f6aa2c2fd7e689be604e69741acdab06f1f78b5dfb4c4b107ff770fd2f1bb3c0401378e04cc7db018eec32d6dbbcc89e5e799a6cbc2b5bb20a11723f2420c54a72bad523abde1d2138942f65416f4e7353c08b20c7e508f11ec59cc6bbee53f04f00e220921097c84eedda1fd791f9a1ca871eef32137ca4aa377888ff7dd9e8f311d41b1a5a0d8ec918b1358e3509c912f48f007b5f929d3db2998dbed8d378613a6e9c89dab3b071a814047de1f212df44b6d02d097231a462d6c9a9fe03a8a01139cb28e58fcb312d1812122372540d533ed1d20ab789b24c02be6232b934f5e0bf3d7086d632fdfb77eb38fb90101648e7e39f69fe5ddb9a6be255c1be1e60251f303f97b476820f42758f9e7f9da8e53ed5e406be56e4dda1ee836ce5fa5c412e79ce9af719963ec6cae1b1901ee8446a784dbef26c9b3050966c5687d541cf089055f49b0b304e713f17f4270f1511789107f6ce2fc81e2b9cea4545508d42c5e9854328b23e7a99a032a21d5263a96952b4be55a0715e0cde92b67d18def042b6b28e06de0640d317f6ba378f161e800398f65a9fc21798a7ac58efebccc48c959df607f22a25a4cc7bebe7fa39f875f3acb954cc94eda85d129229d6d5e442f97dfe859e50ece3d1839cf4af725af2b2f7633a67aa2f3d62ba12084a5634ac049346c30e6b14a545ae03daf84f5c727a3cd908cdfa560ca3ba66b160371ea1841fd488e2b8482fbd34adca09b0667bab29aa1c9ffc7eb78f8e7ae3316567e71bcc541e86421f80a745356a015cd9093b1cd9b66f70c35ab9d50abf61ca3ec793df774d54ad170e33502936f0ae7c7db95014ddadb0f5dfa22e731d1c2daa6cf6963338ea4e2ea4f33ffc53e9fba85e0f2ed185a49c0316a20efa8ff2e5daf2d37f6e4415ce10dc61ba0f3ba657cc8d696ab23b9a116a45a50a99cb241329551648f9211ef2c64b031b3ef169e04e0be2411abf9b20bbf3a15b1590a64008c3bc5b5d094db8fdac5a1b905c6aa327ff001b55cdff4911aa38ca37c82219f50f1dbb2d1bf28d3d364fca31583c3c4434b2886de56fb92c96a4d3c060b1286d5ce8c8eacd622331544e560ced2075fc48ff9b03560dd09d6b28bf2edb53ae0f18e46ab5dd9b0aef1fce9895272bd268abc8f21a4f9b4788c3fa80d6faa039a8da3cdc95e2ddc75f4c2ac14b856286182384c748d751eb992412cc6c426159e1419f05a6311c80531ae49be762ef23c3fd3be84e5385113ed6137aba0a908de029d0b31a1a4c0f368528c96345276b5622a94fdeaa1fd6630a21124bd9bbcc78c2c41478422d725c402dfd686b117bf082b53de9fe8a7a09032aa91f5f8c0415f700f842267804365bb2f4e6e724fc15b917389172515c185044d44c65cd10802abf17439acb1991ad3fceb510d3e7127d546bc4d7122162914a97fcd62b8f72034eba0f5ea335a4f147bb876fa568f6861b4e594933e2905994ea6a268728893a8e3d6b59331d50f772402c933b8b7f0b00dbbcf8ee0ecb5a629558744d77fddf6a5ebdb7c0c6e4b17947d4b72653dbd8ddfaf24c04cf435ab49a1f7954ebb46b1e43d84f20b3d34ced1e504811d9fee937bcd9c659c38999eeb0b705a0c7dc41269b8a3d3e9b9c7602c5cb70a0a78c78104391f6dd95c2c00ae3c5af7d5462b592829d26f0b80a82f98ecffa99b1486f07534f9e710ed9b4dcfd1597ba0bb42067be9775cd33472f7dddcddd585604a4f06b4d3d51f20635e0748ec4b060a1a73e6a0d313958699b6aab9e75eb2a794f592f5631c7b6ab0e5c9c73d9eab8bdbaaba508053a9cfa47d70997704608c28addd89b2e644bf80a", "0000656a", 1, 498820236, "39fc093e2d0f27826aeff11be778d86cb044260132d865def86bc18af37bfb02"], + ["bda9a4540207d161cad79b91d7c46466154dd34d3dd5e66fd9a2cbb80750bf97a230de90a70300000000ffffffffeb2d62cefad6f249b4b6bd6aeb7aa79f4afd91d5b94dbf4bbdc194bf65e1147d03000000076a526a63516a6548dcc580022871ae01000000000365536a3bb41e02000000000553acac65007b3503c902ddc98f0300000000000000000000000068af552c300226c68b147a51e76a186370516e56a024ab3835ad3af3c5352149bc9187056c93e3c3223955837af9213a157e84ac34826f32123b5b1e76496878ec3632ff3ce611f8666ff8b59413d1f240cdcf226037b1a84ba54b9bb7b8ba4f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c7765dcfcd7ed884b23c64e4a3d85c32e160c91a406c437d8282edfb36bb9f0df6cda507559796cce20257cf1c53ed88fca5086d6ebb19501ec7ce5cf5dd9ca18174a5a8597aac86fdbeabcc6d515fde5f55eb0f3f673cda8f7404f1c2c37ff44af34586eea65e841c35e178b0caef024f819fe586b4e6355b7466043bc8b1031682cf70e74a0e89618a1e53f6a0b374614049bb7803ab117e575908a13981a40219129acd0709cb9ba83b4125550d3919ab5334ec7f54ead4cb948bb5ceecaacc0b0664c7b29c4527ae6828c742d0266eb253e729d0347acd32c1ee478064f9850f381bc17a11e47f8c4246306c26249b551c7299a6c5662b66b892d0cd6ef4e6250322850d4a995102f41e8cc9405cfb67b9f124e657f71d70e0e9e4c86eda8448630201666a7d19b9b1d306957d16d8c5cdc0229303aa18dab66be8050124252bb964022824aa457ed2fbfbe6143eee583509dc2ffd473b07b43955de3401e4e87c50fa030cc859c5b690110b4eddc15d8d22a7739465a2f5740525f0e5f475400e7d607b0321072cb52e8fcd55b7d3ff2ade74cee08e41920c3b297aa06bea9472bcf6f1d781a908307893757d281345abbd617f0581c3134aa7712320683d0d3e95612432230eea4b7ceebf78b193a399ee2254823e79d30b46acfa259dea1058edeadeef4d6325c4e6bc1b5be0a851df4a7e78ccd7c83c958d9ca110e10dca41b87da37a95209537fdd79bab98618344f2e090b54dccd0a0fd65660a63efc75a5c1d38356b2e25eb2cf6f1c93255a474a6deb4b8553d3fa68d7892651b7e590836bd7d673f284e4720f5f49c82e3ce1208c913b7c56d40d22da93a5702e4d4fed5ea7ff4ecd2a0cec5f8a01bf9d9cef2522c0028d474a5d6efde006abc42c16671be6f93335ac11d9eb962c993119d546708493abaa4b67dd4137b84b478fa31e7805248c4ed43624858bffa886f20a8f63d25f82a8b1551060504e0eac2f6273a70a1a4c42ca20bb952bb4f181f2eeb02f19a491c5ffee837e2da37f726e083d0ad1f44faa88528ac598dac7b8326cba715765a59f9199dfd30a284a7db87d77d279743594a039dff1e616adb7315178817887e2bfb30a6b57abd0f1c149eed1f30d7fe243bc418a0d39ebcb291530ba51ec63a69420310e4dcf7ef5d7bdd3edc5ff581644c010990b74186bda85c17bc2ee95b9e5279eadf936ca6a610089a36fc97f11570eeaef2b8cbb21277d7d3c3785ce25e844948bb50bcb1b2fa1a5fda10cca47f2a11db03cfa65777dfbd46a7089738cf9e2720dc107a4c73307a8bab20351be729527894259613974d792c79c8ef7f58fa40220907034ac45e854528765776cabc2636005f429f480d2ef2e686bdb513bc103716b84d543ccf47ea06d707fb689167e440ad45b4db4abcbd8ffdb6d4d339f4a61b49a821c4829807ffa04e58488043ebcdb794009163ffae7925152dc8bb15463a1fb7d5faff7cdefb2e4382b8bef6b20d111f2e8d19ec769d04c3560a262007e8d226e22517a70202b64131a518882e0b016db0746afa0d148b0ecf6dd97345af01adc7e0304d2c73f5eff4603e4c6381aeda8a62c53472bba4c997865f1293dc8b11b2b7f241b48acdc8a18f205548c0d36435da0876bb2bb77ebba80974efcde40dd8607083829ff37b5600ea10c6ce50d5351d8981ab4f6d408839cbdc77264bbec1e7fa40b0a0d89ffa0518719818b05f69106f82ca8edc1006362318359cddf86682ef59ae98236e93966a824022a28eca4338d99ad9a3d1b345b86723cc8c23380f9ffe3fdf7bad810c676239f6cc602541421b6a54da15bb101f822543fe2d1fc58f87d51a9284734c4e93bd2acd5c0557728873b5928ecc7fb320e45649bfa3a5bd260bb2e8e782c0e57e105dcb215da4c3f59fe9d15dda890990a83a2688b363885835286b1f764b6d7ba0d2ba1afa3b1949855a05726fe57745a294df984973966c52bb7ab222468bbcbbf127a4a125fab54a3c4d17db39533401e5282347fb8d94dad0ced5019725a45ad88c57fa7d5f18cd69fa760001b45f5629bf54a424d9355ba57a742bdbfb8ca4cbcd11027bb20e75f614de134d3f1a5fa02eaf81417438491569064168c31a125bef39091f4436b8be1a218cf1997f0c2b3ab6231988f2c6efff5455ec47bb465f45539de4f6fdaf6d07f02ad89b90bac39db34360f423df5a1029060b649361e2cebac6b67b8111bb3017cf87d0517013f345097a76f7f5a55128b80be13b9d618fb7d05657f1f794e3f89acda2000000000000000007a21d0000000000abbdb0cbb1e56da31cf9e72ef0f494a4d80a796c2921747e898f606273c8bc38eb98b80c7c4e971b5af2ed2af9cf0a03a381463bb70828930913cd0e5f929db5d6b89ab2a8eefb032fd3401b1d50739aebb1ebe6bfb8f26dfd6e698cb8628c8300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a3a6901e3f32cc1d728d0a578d04aca19c1fcae5a2091c74f074a6df1b76bd1dba4bc683ea6678eb3f431bec0f6d3b534f34bb7674e750dec19f7bcdeee89a5fa61c68d18b674c4bf70c6d84d933b64232a32b62553bf7d4fdd0d9842d3944bdeed5dd38308d128db7bc6e719c248f49d6671f5b3735b60f03fff396aaafcea6022e4b40ff004782568aadb4a4c6034086500f402158c95d3461623dcc7d856f4c020af509585434fcd1adf701591762eb0bd4a21dbe22fd999e15ca780ce87593c10a02282a0607cab589720945ca3a9874e44882c1ab5c2f531a48274b7ebc49e8a61758ac9c945a3b6d0e263063de9cc725c8688ae9390a7313f01371f94cebf79103162310954cfee28e1b50064246ad45e660f9c53184f2eb266680c0c45c214fbd031f8d32284480118249f0981d25815148712a859ac48aafcd26009bc8a0694257032d826ec0f180a3e00bce54908cf97686357a6691b0a292d0bdd0e296cffe4f490211154effcaae2582e93a2c13429ba21f29b3e4dcd2dfea1779b250b9450af97203112e7f7aafa432bad2caecc687555ea372af18f7d5dc2395f0f595dee8514ee4f4cb1f270c8d1ad16d30b43fb4590e6bb2ccc8ebdd9594e38fe68aeefa8cfa10a6f3ac9a2e66723fc945e178e627504019309e7a7b01b817d3464c5f521bee72ebd09d574b8f81ff393697a04d0cdd518cecc003ea14bd7dc574d8114eb077632043456126508f1095be8e84262d42311d02f7a06b85977893ed542e5bc018e41a665c14c2293469baece0e07ba725fc9403ed10ab17e4c350ffafe2a271c09a895e666b39cdaff4b4f69f5ee2485b79d572470562b8171f629596d1fae06bdc0ec245b142ed5d3c5ce6b79ca925910ef7d17a43cf914a6646ebaabec8d8fa6c88371be06c7cc7945946bb101a75492f33cb479405ddd4c0a441886508d9bc728287391b250802c060fee6aff54a62612a6f05ac02fb4ad143afadd55a3c243a1399984fdf15430c063d3cb25ec5b68cbb0e53b710ebc02da1f384a5fb84bde4dd8ba1b57b3ca83c7cd64cf72a11a78e3454b616a5c9a9644e1baa2f4c456f332308a0c0defc91778eaba8010716820812a9fc6d08ce49fa3b83d636e3650db467de1d9bf0dc53b546c842b8e19dcccd8144e7e6395bfb48de856484665da1a4a519744a1876c3c82dbe8ce5e524a8a550c4cf937e210bed52f2b5ba261fe7a49626b66ad3bc434b214394adebe473116f369be2e9e372eed07d5111d73f62ab322ecb4f0f12141f1db9cd70cc48d9ed09fd0df6cd6acbd9a327df4546996be30fc8ce5c5c47db72b7cbc96329f03444ca739853cf42e24cbb792bd4c7091523019f9bab3a218a81cffb5723d8f6828e1df9c396aea0c71e681ee7461131c99ef307615838d49760a4113abc8ebe94bf8daa6680a2c5d090b0674239848bb852f3e831b6081fce881e68e0e7d8d9923fd948f0811005049b581506bf98e5cc634e67a7c69eddaca64d55884cdf53b4b5dbb742650a92f75c442c202a7fd5526d6ca6abea1e410aa709f2065a14e9f8322b3b048aad0609d9dcc8473cd52bec90d38e17c87ea7ddbec705d34a49ddb6a9798abb5f5b9df73175286f2a5e1bb10391403508103d749ca5b483682c92aa447cdfe567047b614f2d61cce96edd0bc6bb8467a81531ac29c0ea9c0d3ca4445aa85c5d2184976a4b850defab97f97fee7895cb30c158db4b13230edd29ae1a8389fe15cd491f1c4c802a9846d457842511e9f0d9ab11f9230836b295b230a8bb990d3c854c62d2b730c68f0ef74e80395f99c95d23d2b8ac3ed7120239ce42133e481bf5ceee946434680e0dc6111b27a341631ea55b4339724c9bfc1401754675949bac33d5681be4600777ba2fd63abff26aae09705900991c08f0ced305b842e838a9db26bbb3bdca67bd1ab42a0fa9ef916432c97587697b191d4e8535c58692c66922eccf10fe4118fbcc4190bd3c296f50e07957988ceb0a5d714e73f79595e1637228b6486e154f8e097a1c8703c27154d2d67e70f3f36f03345e20c0472baacdcce49fa939d42fb31453ed38b161889ed3429f0c591c67a67c80b6f792e83dd53501264e7b24e8e7095e973aa95c780054b40f2209d620cc59ebdbb20a0c17d3f61caf3d9ecb1f411ec0d8a3da41501f5b65f2bb3c6b55eb2444593919d780fd90ca4ec302a6255e848c342da3f8425abb4364c1c438de3d3c0b3ee390730cc7246192cf063a298d45f9b6790283f93abf00228d7dd57b0554c9fa50f9247b487ffb5ffd4b99c3d283f70f9141450ce3edd452adc30ab5b7cdc933e0980c28634ba6dc6138f55365bcdee191ca599b65b157903ee44aac5c0f93f9544b608477fa0913afa19b412b442f37feda5cfe1ab68ea8005370f8eb92a868ba550b", "52635253635200", 1, 968493269, "c41c1f7ae7df5e7789135f43c8e65aa54eb22c557612740f0409d647706d8b44"], + ["030000807082c4030436241ef4d9d25667ff13df8813b1818960f67462db27e2023a62a50d3400a9cd030000000651ac53656351b490210cc99132a4c785327289323676aabdc44366682507ad7b70fbd0668ad20a02f2dd0200000001518413cbc359a676e80f7b5dc2607409e426acabc245b9547d4f0319d39625d817852ef3d90300000007ac636563acac63ffffffff59506e1309f8025bfcefb1dee92ece277cd0996e8e85b19cac1b1bc4f59e982703000000096a535152526a655251ffffffff01c591e1040000000004636565532a4d1fc70000000002c4afe902000000000000000000000000ef187f408b960c8f96a52c149856cb61cd4fbfbfd10de0fc0976722643dea2e5e6683aa4ade0d8d23a1b1cda805d171f31fe24647674ce72cd7130d266697c1ede13c7a13fa1c35a5c4d93f69c90d2ccd254091129494d7caa81f1dd7c0d325f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e056bcf1b6d45a87db3fcfd7a7c1d93b0aec728993cf19030d779ac2b6a5553379faa027a2b5461801875e318b0ccf2d6bb39990e0e1abfb3476989a6b550403913984ede5d85c1ee600b2cb67159747c919459f374de7f9ad95f374118933e7a9515a163e002f936e1d3c3fe18589dbd7d9a570c14fcba318218b23d66ab50c021639c42a38e21e9fd76cc1c90438620b3a9134d76274c1903b0da6f2cba6769102135d382e0e1bd69dcc83a2e727592150fd08ae4aba7025333480419c7d774be70a00dd89713c08afab49f087298f502996b76c3d19edfec179a3d06fb10c6d0c56c966ecc3bb26aca00f9c297a98f5a95a8207c64a95490e0e0943eabf0155a3210204f61c89d55e941a7bbe22eb65c319601fc6010070643d4a2a09b0e19d0b7e3403018c0419898a3cadc47b6895ff136ca14a9f1e8f48d3f5ab9bd99f95f48c12a60317efa8d50b7ff57bcb018507f37293af273e02857289a2e3ca803dcb4933f73d020823057f811b2b3be01d1e2a674c02415744f9ccbd5dc04d08c58f51a0f76b6d032e21919a4b68b987a29ca2b40162341d35016a0df7a428dcad34e44466fee0d9a3eb8de01c004975a3854cf01cc89a97f7c9b087c34106ba3c26be5625203c92fbd96c7057b72985277778763e58136fe65138ddbf0691f04376ae88278791ac872ca7dedd365e4f140ffd5e90d0d11cc8eec39e657437d4d44dc26134f992c8ec8339c279b097470b19a7881445dc49073ff27f6fb8a4417b52f1fa8a356d27f5629604da1cf4d681bf89e167bfb3e68d17f5376249a7d01ad404a7dd803b2f5a8d142fce74473b9938eb3308ff783d48518440cf749253266e5594854eddaed39ef9d80bede3df87706649f3f25aab4534b4b2386136962395690b27fc20525a4ca6736fdbc33e108abf2663d16078c595192a13a60f7f8881c370680c8883774ab9473eb33d687db3fa67034c28cea2071d9be46f95a98b0ab20ca7cea92d755b755221248243414018ea21e3ef9fb15b2e6b716d5ed12603357420192900c6bf2d6a674600490ec0ccd543d0802df0411228a1e7a4aeb131fcdcc1034016ae2189336d25ad0efe0c406df2735b9f17c2e9df418772faaf105f055253709590017f363e32a33ffb037ebe219b7877e283666a44f2dc86df81d43a36bb84b26305b6eb89c9df56dab90c9c62cac3b9e5544b36f27e0b802378aab91ebcf990388df8eb1954b3fffc0b75795d571d954555598a647824efceb4971a55b1922ed771853b516f8396f8411a14860af71ac96440dc520a0c6c6c11d946d13ae0925e8c9c53f9ce3e99051b960ed90262264b20456bf1a6fd9c1cdcc3d800e0ac01ab3a21bfcbe4f01cf83b4976718f262e392decbc5167e08742b46e282f416fe8c9c9c1075f534944ca331e9058a38cf826e63b8765a28e20f5b16a27393148d7466d6748c7805cc4f35607bb17f09cf5248532fab5636fefb6b80a5573351adae441432fdee43514d8ca7e695d468eda1c867b44cdff70e905992cfc2e21bd0e7fea85d9328f128b8b0fb696312a033ff2bf071ec9bc147ccb90ab562ea4105262156e7fd9e321a951e6a4b66876a234babfaeb8920ded84c66baeffd98d33cb99e3a6deb4a7f5eac5a5a985efe7897a1ae8d832b3a245ae5cf60a1d18a661f8bba8c4785ab4b18524c1ec3196b7bebbc596c334c1b1c029033fceb4978714dc2cd89f9b7f0f8037557a7a99061d76157564a22866f87d721d04427919bf2a96edf97e8e148d611fae225062838eb02c67c69d9b9e41c07d7173d9360e0ba0a7f181a16bf464ea28721e41e5251aa7dae0545f0d9c051b94e10d0c8209c54a5e9dedaa39f222545a85415da090cd4324d753e11a784c0f480adea9c7574a58320f8f9b9aed92a7303b544d3bdb5653b45d8c359c9ef55171f2c15b7a7645f7757fd77b4aa4adaa12266131c8ebfcd4f825bccc1193ae887eaa5038db78c191d847d1f200e87fb182368922f00792416fcb428b7d974d2892b9a43a7ea4a8da26e16b4d0183910f1b98bc967cf7a92cfb0a1081521bd2f3baea688e2d0f56108022211887c5e138245735c9353933035baf5738a5ed7088cc932f5db4655968ed89326b34e77cc04cb30e35b2ca8defa9eb5ca38b213938f83c7c38532b06348079eb75b7736970f313d87a0d1697e60656fc951f864cefd6efd5861eac8f730bec4e682b20a9f291c40189f161108505295680352689eec8482e9e053025c79ce0d57eb589767594037cc6d0c927719ece1dc19a24000000000000000000000000002b168c22438de6d16169bed4aef4f4cfa40f809851feb196bf75f65a2f129c4395614f670e6214541d180452fec70c9a4df8cabcd1185381673646149be4c9f30a9d45cd1b791725cdf1a3fd26569c313413c9b9b0e668dc4f4b768efd510647000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004b292c721d081d0ae2603631cccf8f3794b39c667607ab283b15f4a9fe85b78ad6bc706186aaf899e5fbbe3dd1eb4b22bf2f80115f1131d25f7735de5b009d8a4ca8ae119de71521a583d4e3e5682e8a1c8c51260d160b73a5a89f7ba32f1c930ad11ca60d5cc1dd25f42a2e6589a79b1becbbf20257c3c8ff030b46d109a01f0316eeef91da90ada4d1f7798046361017bce5cda86d6f7883670948d5fc5a96aa0220b896b67150d0282c3444e2d8a5e9423eb8dac8ced827c093259efc3065de530b04f2ad060a659c7ef27d3c2e571510069916f722028c62b172247db7c2421b26f4a2f92a9202237d7b48645633af76446b68a1a2f8a6789912e9f3ac22e6ecd50224a5bb155f1938ca971e036b32c39e16ec8dc35e6db1d71cccd5809c67632c2a0307a03b6c9f78f809767bd004bfca1696c5713fd6254e8b14306ef220fe95b51f0214c7095703a79c87abb945990512ae05002e0b05ce6f59f546db9d3540502f49022ae578e6036ba427d5ad143caab5ab83b67d099dda7984452e17214dc58839e1022e1b80e72354e0f13c057b1e5a201d62d2350c3f13c86ca983d86ca5d88d543aa4fc3240d421c38f00273515d540f4ce4c82c30bc194164a4b1cf90f5ba00609802ded631e28a0347f40768da1bf10df50699030396714ac6ad5132e5e80c7b8656df21cb0032147fb9b7eea9e117c65339770dab3c3d8529aee0ccd9f69211b3305f9284fb7cfc5117366ed733344aef870927768e6f8373b6bd63c92ea93c600070a0dfcfa447e5dbae8064636ea9b7e845ae3d7ca2f98dfc36cc36a3e5563d667eff8d6ad922f62fadd7b0902a9139f3ca33e6f694f51737113bba036491b3625dcf394a1f90396f171f41ec8bdaf82df364b8d3f78a43291d91dfa4e67d8088c12a681163bb44047ddb42a67d89d1d0708ea365242b3b7a5ad94c5f67f2ed920c2d45d0ce9891729420e1bf4b79f3ec2f6edf7f50b4e29553c9d87896cfe378fc5803582f3d2aff4b59c9f0fa6afc754045d7bb09477ba6d2285e525971475705e9f904fa286d5a094722247779756b5f530541f5ebbaf4fe564b359db1c2944d86eb9cddf7b7a0d330cc51f120f747ee5b59f7a15c0443da44745eb8d557d7dd2dc56e9e5759ead099ba5ef41dfae3b4ab7877e5a701092adab15968c93a9649d8702f26bec5bdc0833b61ec2d1e683f2b55d83e475ea88373a0ff8cc1953528d845e27e1cd2fd3b66f3947e037b1b8d5c31861e784c3a6e32e7f35d1289ca1b287c340d44786d59786e99c44980484e6bbe6b5edd2bee88abe6b7830a63c253e2ac227a6ac28a4dbbc2f50711a2b0ffac737f6465792e37820823fa87c37e3b2cc9e716f61178910d5526cccbd033a67fc52899acd8f2503cebf91276c50d1cbcb4e2595aa06227bcbe3bd85c3fd0f4268c670f97fd793a20c267e9c380310c4bc988845bcb92abee733393443c3092a485c44a27a72d76062e567343c28a963fd44c771313b726ecbf257aee84a8cd1ff5dc5c856479ac9225f825d7177b8a306afedb26d82fdeb5f1154ed4210a524f25b52dcbe90656582c1966ae70d1a31b5f451fce43d2e822a98adab245d0c8e7b13bf1d3cb429ce28b0cbf69743fac430b5a454aecbcf2ec9e6c1d9f216d8a7a80deee52ee91d6e8be81be83869df297205060a5075a3f58f9df82b3ddee88ee09a288760ebbc59c266c85a5f9a652e6e6795498f4e8ef106b7362c9fe62b22ab719b4ef3eff258c2b474a49658ce0b938efd16c783462e4ffcd7fdfbc5795ba18b07bd776187b1c160b4d0a1f489a2ff6d82760623b7643b20c8c10b66fc74d6554e1035471303cf265b35740aa6755b9b6603980d04f5df3fb6201a99586421c3e770929265f26cca6078ea6492508fb40dd2f75af6c0ddc57762c13a3dfd73dd28c3d4186d6d64d8f11ff5ac91667dc4d8b5972629e812c2aa3e01d232531dd32366cbed776f6516e1816e5a19f83034214218f713e5aba2336821da361207db24bb08bc4865cbd94d8bbab1dfe4c6227b99de7b3cc9709f02825ad088e82de9a72f2142296e7e2f2ab79acca0e2c3148295bd4dd75d3da2d8412cf41c503e6ffa030d8974b69f69b94e620bb500c11961ab982d7394ec974cce32cdc685fb7d67b9dd7152ef016e676866a1a387974191439e51bf21401653195ed0402e1347a907019a145fdbcde9e21e8d5a8ae3c379c1ed08dbe24d0a7f82bc4c230df437d1fe934a06b06183fbcba5df00dfb1175fa28968e94b82cba9f6a6fec8cfa173e3ab9c275f803e93d2e457b845696a5f925de55fa5d248c889cd9b141f09fa342b7e4d1e4cefb7f6821325585d7abd67de2cc168fdfb2cbfefc8c6c045be295011205e6530abec999ef28edd9c7bd05597cde6b60f5fd1f30dd0b0c605", "52ac", 0, -1955523078, "3ddf02213e370c7c9973822121977d7e2ad81654baa3dfc064ce837fcf81f935"], + ["030000807082c40302a4db52c80dd87e289d431d6ab744c2ced1f9981dcefc5b62f5346fa022f5446d0000000004ac530063ffffffff3806235cec5268360b6bfe59a3726ab789ad61b32d7f3ab0f3c2458e59b6c37c0300000002635188e00df903fbb0d40200000000050051515353fba8d10100000000036a6a63b79c7c040000000002ac51468ee33423d29575032c900300000000000000000000000000b57452cd68591df1976774dcb805892fa2d709e4fa19711a56cd55a8aca889e398044c3f17fda02d1de485cbe85ca1f75dcaaa0b3c832677edbbc2ac64dd169487180c567d19cce7fb9834a67d0ae69e66d7c61be0cc7e8cfff988e75910198f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007da6c5319c8a017f58ef1b2f6009fe77875de77c8c97dd01ac08159094b06a6a9b3f8c70822346a97954e2a19b79c55f00d04ea0a374d90290770cbd32cf8eb0c2da7efe16f849354b3a5eb7ef8d2bd7418eca94930b1da9d672f23893f6d89a0b0adfd252b647a046b1c302765048068b9fec8f97de9626f520f28f3b5a8ad202055d3920e69449e1baff62467685d670097278b803deaddfec6ba689c5010ff1021ec8d20e63800f45b25bcd6e40e50cd1f6bc2ca2a8a801623038d9cb83cf778e0a069398a7ba27b2000366c57099812d504d6a4a57601eefa892f834334521e6c7f4839f8bc72f36fd3b373b69236c1d99b3e9e8ef11ee819f00d08b1b37cd90f7020e9262dab1cf7f8c0dcba6ab90a166a8aa7552796326e2783de0daae5ce37c84032a9c5c83b2b7e2e40fc7255c44bf3a3077c7399d5b1f4982f330bc17b018e6bb0224d8e2929c8bcc14fea109c907ebb4c1428fffc6a30daca914996de1df8500df020d43a7edcc1e3b84a365bd12c5656bf38d59055da653bbf1dad5ea5432b063d5022a67821643b993f88291feda2f954b491ec588c6d17164115bf612d532de06300fedc2c410bb1378d5a386068bac1a6175880c9d0242795751e509e711e8cfdb9110370d6c72843ba8a8c5e1370f6c2255a95bda656f853820f89eae44673504911789f135e9b1ef5308391a92b87aeffbd9dea0255e6a4a310adf14d51b4a2d48c1a0555e2b156939b13559d7d474c79f4764c6deb5548070bdfdd56bef6adc3ecd92d59065aa3ebc8ae1e1f34e6eed403c0782c397bd3facac3cafa5cdd03ade29591039888d2ad5b04e03c59e70bc9919d72dd319f2823617a3af31dfc21b38b8cfd21012a8d2655c032e6e16c7b030c8b8ab459c96ac275281a871ebe2a92cfa6dc3f25cd7cf7779ad06a044c3e86522e61b7048705729762e29350f243bbe46ced2c9c52151cc11705a1691977996d182ea7fcfae5a6d81c1d59df4ee49b80ca630c338c2d9bf425292030dc01a80fb021e2d11b92c0eeb07c80db9e6419bd5f3dfe28e890154e40c4f952cfd6648f9030722a1cfc7270bccc8aea536928c4c3ca0d26f0917bf99093eacf91ffd2ea1eb75c2f412a390eac1ffc43dfb12da9a591733d77ea1ad60c0b9d9dd6698f0d3780f86a9396fbdb3d90c9ff40662a38bd1a91dccad8bee4fa0cb9ab72c0bd0d4ae309e3b5a6a248dfc6f637e5534311be62d57ac8065b92e34411bc1c7984da4b4124857a963c1e185a772b57ef6051300d982113958c14746c25a8b52ccfe5f23906c995b7ff3960bdee382271634d6c33bf3255bb5e34344b93108cae67d7b60952e535532def9c5ffda21069ccd031d29d3a5b837b9a014838387ec2a558ffbebd10c9424ee990f84adebdd3b04d2a0af0da0a7c7de9dafda55243eb7211c284ed35ef3792ce3359c1091c0caf375cce3fcc955fbb1c2d61a8ace4bc8e1038a63ecb5ff79c2537c6726eae13f1ed465c3f03ee33270bdd8afadc67137a2be62199179f6f7c9df8729f33542c0e7ea6c9ecfcc06712b1f65579a211deec275d1d2f885bb2714703771ab436db6149fd4595cf37439356d7365523f84e01f10f30cda5b8b74a7dd6477e31a00bf307d184dc34787da25c2dcce5f6295893e090779f2ebf660e8035a5e55b627528f00e3e4a7475e473aba76fdc0a5781598eb5376e771edd066cc7a0fa326c059b65d8e20786b9a0f7a762988fd1158ded74c514c3583f3090be91fe0a174cec6164927549becca2443d4b2b2585328a78b527ebc0386217758835a9a07a27c87a942967c202936c7b656b477b5705f0119c46dc3d24659228a7dfaba39f141b58a092bcde8eb26f1c8f11a481a508d4955cd62d7675063abdc873efcb243f80c353caa93b967faa8f605e6bd3c1a784af8c14cd21ec29bff35824a6b7f0ddbd7bfc4000049e12cd45301c6031790415b658f6a7a0759d65ebaf683b5a951db5ccbce61d99da49bb3a23cfe665c247c15a8bcd70aa6b6fadfe60cda14c7a993e3ae8abca48565a1f502ca28be8c310d805c326e636ee1c61fdbe69ca63eeb62c3963702bebd3539767ea8e47fd931ebf89d06e33eacdc7dac911bbc1c102b07f47028ff265e4338591ae4c05c6e0067d8a195b48639d5206a0b319fd72cdbbca5c539fb994920fe133058556fcc1126979ef59da5ddd6a3bd3d79abdd486b14862707588134a39951d9fa75b1393a260be34b28ac6fa413df9372fd850445de08ca2a0fd3a731124c61716d65472658c3aeb70000000000000000b9e2ca03000000003d1623f1eae5b97226f6c81b5abf90da9d2ab2400b50ce1b7e0f54b7bbb9b643efa85871ea2d3a977178f623f3d0498a2849877a9800e1ceadd15d88fd0417ca037e85163afe9b8176ee6cbe8a5dbf778fafb7aa8dd8c6f0e9eaefefdc4a085a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002942bedb492785eade18c8ab64b564e993bb44e5df4ae96938d9032b2f04b9375a1ba3e85c791fe0907f346f66b15ec127b7c8995bc730e0c5e35c0c199efb95d403f993e26ff1fc617a3b69c14e113cc3c21fcda17df1f1d21040dbea0e6918412efea6c619032d80b13c2dc11a88533275ef162ba75bf9c79c12c776a493bc032f92777ac707a8ceddb804a20d80c70746a83250be2cb6bdc05ca4d39d273bb303171742a85315fd62a75423fef0c2bddc3d662b4d3b236f5633c72b74528d90f80b05a17b2efe54ffcc1fdce0862b7d1b6ddfb08e16a6b63f086fe5adb16a399bd280980377a311e85ada55e4f198fcfc4e712c22c71c479ff455a9d4c35e21c980020c61672a9788526599efe960a22d27e92a0a44739b69e25603ff98ad2b1e948a0325bdc8875978227dc897e3504131add7e1ec5bdbba8f1eadc69827fca9746502020449ff3b23ff2b709ef47ab42cf131c6c1748d3331e34d8557e58fbe15707af0021e5c422b3f8b9245b7aaca387809f949550d6a5c600669809cdf9fe860906059020c6d3df659e5edc28850926cdd150879b4bf32c9a48ec4c42067fa8590ff766924eabd6eb0695e6dc06dbfcdb28e2a93ad98ab09f670fdbb578ad61ce1fb570b3a6b33497c09ff083fdaa4a9016692e6f1db4a6306c01b38380ff66cc2b10ff1ef865824808acd1dcb2b2956889ebb44099e06c258a69978606a897a402030de98d3d30136f1c0c3fe224592469606d5878f15faa212de0688a69e4c094f59bf1d512ce5bbc7bbcace2b288b465da32eb382f2f1bf23bee20c1e8d2ef28199478e7342937525a7d7696fc98d886e343877ede4a373f67f9cfe16309b7bb1ea8b52bd4e8fe67deff685c6c394f301a8e50def89ee3fd5bbf4e179b687f599ae59f58a5ea57d0d5d61752e3f6d799053788fe9592a930929d9eaed70fdc8be043857a112a27d26cf0429b0f7c5d2225d17bd73dfaed271b6e8cb1aa1759dc16b971e356aa3589bd6ce8b1931312bc9ddbe916f1cf5073ce4548d3e6f96538311b1a84c65d3c5ea6824d7ca8298833a7e56f06c8306d1b053aca85ce891de130792b522fdab80c7c435ccf6490b0e73e5be2ff06e2d831aac9a9f4edf71de48f3b6d992c2b8c189f5c4fdf6329e0c4689be7ad1a8e56ac5714a27c755f081eaf83989de34992997c8e2e0e6f3c2a0462ff5534392803b7be4aeec99aeb984574ef77d4d3e9808ce2e5a3c0859d7f0f873715b942a28ee094276cdfb6d0b69f731ae6a733bd114841b2d35446a9dea90052d7d75656527d47f13457b5c6b9d717b4dcdd28c0fe5ce08f092f6d030211086c6f2a1cdbc918f7728303894a9ce4f0715da94c516727820ed2b748e6cda6e926cccceac1aa67598d7591507919cb2cbc9979c0040c29ab3545b02f2948b1b697e614875ac946cf3de2c4366dd8abd4df535876e41f46ce8464f732c16918c43285fde0adfddf96fd05dd93fe4e090567268792306745b2d1e637a73e93b1199cf86dcfc786568a986d7da426d83cf9868abbd3c72fda8a601a92d9d12d51899689cee5747f24c1ce94d3e7a894d46a2e3304cbd8a7d8ad51103a094e9d9a8e135d587efbae88371e855adedb0ff01a8977aaaaef813fbb8caebff3f9d0c2190033d66d760e35313ca65794b8dc415c23d4bbc88496694cb754d320482194f6c5549599058333c22bc2c448d6bc61886e5d757d52319c1d1e0651475fdb9c8aa54e908dbc573b452e8e97c726224b85f4df7251ac8b5538000bd783892113c5534cbb6417458f4b041a7372a682ecda0aaa99d254cbf4933073f0a59305719c90ec27fd31f4361e23be78dc5d0415e1405e5ebd2e50b9c6e97cc17595c72100a56cbf9e4a4a97680786e6b6ba170eba6d8b22e888bc162e473889d2593fd6e2d5f09cad8fbabbb4dc829fcc2e99c54438e277b91d135914e31ef4ce74449cda65ea25b799d779b5c52b744053c07ec9e4ed6bd4a33b4003a823f3e2fe1d6dbac213c7eb89fa61c422e2c63280f032fa9493c4ea5d7be57711c5f95e8b1e0325473bfb2757f9c77cc1786dedd85ed45ce753b16c487be32239970a33b318ef26aa1317ba6bf973a914344891a929e33fb6a0c60a0f6bb941be22c13954dd4790750a7aab1edd7389c15d32c82404549a029b65a2c985c9eef46ccfab5a91946b327038e1a882f0f98491d1377b7893827ec0fc4047e8c4f890bf33927a5e95e04075e0647904499b4678eff7ee5686f10af9bd71c44e329ee19ebcada2482bb8986c8443cd5cd05000000000000000000000000186a63926ae968c10f90ceaf00a9b6be79c963d3d1f2b364c3b16ad837f052319b13ab633108bc9875d727683b30e85a532985043d4b5f49559d2871eff447fa876cf1e78ed7b0054d71c5d40ad0bc4d63715bf50eb4f548982e88b7546cc861000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a639ae0602d77728ac414a107ba8ede4c12621826c9932a635d96bf8776acb7c9c980a6e18972761aea4882c20e687f95dc5634726b12416c8c89e9cffb03dbc7a9a4db2864d39be585060b596f967dde3259ae5d681a7645b566a6df7b39c0ea6d8cb7dad303de4ba6240ba4bc65b2752880e7f448f0261f9ff9802e505fc2032844da3b7b173e6688a28062593f770220bcfad5b9adaaf5b748da867048fd9f030e4730582aa4e29ccc60751a8e0d9ad24c91dec6945d69561f89b1dc408d38b00a04314326ffa6e405a31d78bb7a864f7a1c71d835193e006db65170a63c34aa77ffda7a6350490340be5d65e1191b4e2cd729f57c8e6e38617a7da1e39f1a3f54031b45b4c2a1784e2c17874ea31a1e3d837df76f545d4ce0f52e89198105fc93c7030cc2f85d0762877185a5887f0e2cba401c6774b82b412158c1feae7f67cecab3020324ad2af81ea11d51fbcd4bfe212e8d2dcdf32287a4fe8791d1223fa7b31f400310803b964bb29c38019cbb0507e35a3f436a59fb03f5ce421d71f3cc5e09f21f02286c5e2b5af025110af37cd11547a94feff5abdc9e02a8211e9068afddd1260a835a432dd6d3049beb025b03cf0963b42c2debb955231fd462072ebe86029f65137b8a5d101bdca298680f7bf0dee86779389d1fa66216e291a8e1e64761a155c0994170fb93942ad852cbd52c1b3c25d4f89594e8b5a2fd0f5d706df359161bada77bc6026ed198c22b4fdd5dbb9da1da9f763cbbc17f0fe18e9880c8204190123cd2294f6cb7f80575c2c80b9b24fd821f257cc3fa388b53207b1c74c9354e5035484f0b9b082f58312e027fd6b809c2dcfcd9d4154729a1e63aea1e3e47ff422ed77ea6d18ec669887e990b59a1786793cf86c9ba94f1f574d02415faba0c0c66849a6636438d61a85d1c566279d621407f973e1f4dbc01cd3f10ed3f527dd6380db19276e54a481eb800a8995e452633a694025fad680b383f0a23260f7953dc549ec002fc1f2cf011ee6a002198b08d0c86fca957de4fff099dc00f42a7cef82e38bcc4ec4a93df7685fe5685480af0b1b1bb5a2c5cce138c023657c001a7b7459f66d023304df7157012ad4cd41d9468115051fcab1fdd4e833bf885e5521dc6ec50eb9dd84dffae49a00589266ba105432b2f59f245ed55173d152389bbeb36cf1bc48aac02d0a54a1a2d2c8812f846d336bebf7cc3af721e5fa6519a7d7aaf1264989e5113a0289a079bf0d4d5ceb160b033550f8cd28f7fb972b0dd3e569db4fc7c73a972fbf3f02d8babc79b64b76996bcd960dace28956affbbd4cc5304ebb495b23468d5d1e59b5d1578e13fdbe28178938160bed4da2b529bed70dda3162dffee1ade3fbf0ce444b60364bc74980c74f724deb149be2257f8bd1aed50471170a220e6f0b43f5496c77a1ac7cb60109584d8b477f656087d13a0dac2cabfdfa296c5e4446fcd29bee0a64c5940c1bfa9d6b5f92b5d0c5aa4115b87f5529691b3b5bf7fe187b19b270349b7436aefb5515aa7dff5aa51b63c2a7904559c46f4ad24e2c95f820c2ec032b3c0aaa704122165ca989c1c122ce8d75b18505407f1a9749c7e4a7644ec7444f0b685ed07d61ad2b59a23b8b68fb7ebaf0f2cff03f5d4bccadcb8f84b068f8fd5de800b394bf63c4d91fdb73566047f630c2cae43c1c3312d6de33e53c82783883df7bb63e923a2b665478b863b7c1380b2597b02d44f0f631ba89ddad0684c914ee01826b9178c9d9fb79ff62e46a346712adb20f9c52663bbb80a060743e34230e8b76634b9f2f9d7c71ecdd1e51e7a331fc4b603d450dd2da0e3ea7fb45435e09dbd7b19c009e19bf582ee99f2cb3687ceb84a9e0463c889ce311b5b1bb00e25f011afb383e1558233f484a49788493f6c2585f1df190ae4315210a66153a079a815676f4433907b6da8e465dfeafa2f1db86c05ad02c08c859c6db62b7073b1feb45cdb07788ad7576995bc9d80ab5b91c536468e5ac7b82656854f2f39b0f72f3205e82cae0f2cd71daf2febe8bc4338e11fe70827c671a0252142e335ea433eeefb97d3a64c2fd388b99641a36244aeedaa6e2f5890c8970d95d8627b9f65910c9f7eb7e92b32ec801dfeb6d12a4d24adfa370688ebe601a3b19c7985241898d23226340d0221022a492b53706349f7e84ee2466eb8f36e173631c8d9f72a3d19793355e07f147380f099cebe79e45ae42279c6827de864f47d61e91aeca6933775bbfc68fb36a9ee8d5f340a181053d28ac79ce837896fc7a2c6874e3d34a47098fba5beee3a3e791bda919d4fd073dad474bf93d763d7c4ae03488a73917fa281b16fc89c95c1bf1b7beda84e88ec158bdbd09cbe340fce573eade33f7b1df879c6684cbeade612945fe12ab64c3d822e062c4064ba0f9e54dd2c17c31304", "ac5252536a0065ac", 0, -1822856170, "4114ca03a256bd594d05d03bff27ec38eb22b9abe9b83e4c1b2b81daaf728905"], + ["030000807082c40302a7778e331aa44615dd4bfce788fa9155c25dac60b1574d365489d7a86aeaeb700200000002acac888d61bd554ae6310691470c0ed59ca766a495e6de3a594f2fa12a1f04d1a18d7db380e8030000000552ac635365ffffffff048a588805000000000951525163526a525352e7df1f010000000004656a635306d8d701000000000900ac51525351536a65e9410b0400000000015200000000000000000304a19e04000000000000000000000000a48b90b107fad2e9aba86b7cb1fb133a646681d1d87809e37b185af8cf11a566bfdffe08c190af5e1aff1ed383b21011c10f59d09cfeec0f8fca280652acf6ae54386c20e0fbbdc5e0c8b5b9a3eb5e36b5cd8eb1a75a4b7549764d3ab22777110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054f4ac70006e2aefd0178a8cc3223e89eb5eef4c6c1115ed8bddebd00f2bff873a49e36419c5ee4f4e870412217d54a549a2252bf8335c1379ce084d60324cf49d35059ccb524d79f109c058b6e7aa3fda8e218989484e1fb0563d8c3b48d138b4fc415d2a999e9b33faa826ce880bf43c4152f1278071251a933c5e00cade2e031d115684bb92c111a9a983d099e46e7a833b6fc150fb8390d98ecfad37d5e1bb02209ed4944f41db5842b9db35c53e8ceeff95941532f93fa531dddaf6c51991570b00ce8d67a34b6ab39b119dbbb364fff93c997adc2a0837a0adb068451ac9928141a7573ca857620f1f13738cdeaee53fde43d328a26c70d1b7992149f60c4a4902093e1e869eeff81dd25c0a9f5171328ffa765aa57df07b22b8776d85a159c554021e330b73ab6d8e07310ce9a375bd55b91240140e5eb767f6235f6952598fd5ba03275bb491b9782785b6907216c258d18cd58a88ee6655f5493c9ea49f7ede343a0316beccd47b8b20e784e77619f61cb0adbfaf69f4b083e0a26de8f41077cadd8802268411c0e47ed8f1bee5e993c37554236d78a42123253622204068a0b295e07d3c1a0dd7ee0fb44d4f65c609f4af73a5fc49a3abde8343e522d9cb689cabce83cff8ff215e555f8afde376d53d13e169080373ef3e4b6540074e3a43b25ef814c33724cb4ad4365435c96ca43f8893416bfe09558955d5f2d3495da8bd951a06bab4ef4fcd48696f48f3b67fd6cf1f719b631c7bbdff08a0f8fc33d4124116972d15a4659ff48405e7f3b9a34f917ec9e1fd7c78495c0ba686d70c512da6ac12d505bf2ab0103d5dbd6c1cd3feb67e441304d411e91e6ff50be68bb93e7363ec2919e73596726a20e66b6b1de0b577797c4626b3d557a482d812d61ae83114d1ba144b68565558725ca30ed7d14fef043f2ac0c2e839db2157bd63634bc098472cdd707c7c55c66b2dee7cfc78b4c3fdbd6aa1bad469c6e5a63766da050814d556b29f24e45c2a68fd9f7a37c3ff65ea65fea00541b783d0a8f355b21c713b2193c293a99cb60d17aaa2af91cc3a7b18b2f40e4a33dce95f66581c43e1564948dd1e8f82450eaaa9663cd528b53232972d6f7cd2bc5e07096c31042bcca59d7112bdb913a5ed96fc2ffc1b4aabd4f149fc4570c1493841d03006a2ffd914628e767ffeb8333d9c6e7685c7434cf30d6e211304a386b0317fa64e960d1979317292ec1371ff866030cdf81eca76c9a76013a2f01906a549c782823342c74a7a3a29382dbf50165696165eb1e0fc94295edcc0daec3b9958eddf35aff0fd1e54b055decf92f3a4de24862812ec164b4c8c94a333f4cf6313600853741d23b281279392691e5cc0645f8f10c6424e7bbb994173c261d61b502e2139cca3d39fbdfc22e1d8dc3b35820b6dfcfe691a65f28c5cc7e19f08f2b7d63dfd448ec023ddb77e1e8f5dfe8812af6377886d3dc9b369bac2ed769f75781ff199b01cb2c8770e689e85f756fd41fa2e4d0f7b59cc2347a10e16456475cd0d3f4f07478319ea940b02522b4b9ed6fec6e96e75e1076c5122eeefc01193ff66f29aa0da43e8863ff3d30c4787c3f9896303e3cf95f9c45658e1635c7df1ca4defe7e531d6fc8c7ef29c616f7f018d0aefa5268afd7f35d2100cdcd8266b2663bba5822c6d776bfdba1f7a8288211b68bd1ad13d329ccc1228512af5eb156c410cfad40eaf824cd27a4aeb50c9d00a5cdbb3ae823f79628ba05510e5f2879c30c7eb984581e689dcf13591fdd38cf818f6308d597737c7bc07151e12cd582efc62cefcad434ab6b17d453470febb925f411448f85577434645c57f23753d11a8ac8c5349559f06b938a8130fa18a6c386d08c2f378f1b3b9376ff88544e01ab49a28ddc46b02b6258c38a3826cc8bf4d2de7d12b2e54bfc2649ea7cc7b37d53796aa4c3c5003fc4c7f32119a4bac038ba2a110058872de9aeab005dce38fdc2e52be6c7552445e22476cd9474d22d5f3c329247f81c86de6aa01386e0fac5e7b8c9865a72ac6d24e80b4fdc28f6719d6236a288b2113cafba791796449815e2293917894191b9be1e3a82c0e80d24e2e90399a0680e77c925b1c40a814100a006cdcff08dbec1f34da91f729977c2c38efd964d56f5dab4ccc42a045b7c305f0b36df2f7f3a928e10b4b4b408f731939780e77e6706daf722358bcafdaeefa8c29abb311f2f58873f72cef68df1a0ec02680eb59986f7a2ea982340c897bccc7dccb846398b580e19fd4f8f7b12324ae288aec4742185dd4116600000000000000004ae5940400000000ee9b955be517eee42b247c29ccbffcff8def2eeb9c4943e00092993752ff979ebc03893ef686feb5275d36378050b1a13634e99c9e692a7f6a3296399a5e4c094fe8be5d86843fb7a1849286c4b471799b20aa243bee41643c37784ef3b7f2a400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d063ef03992d598a95dbc0e334843f6ffeefc3953df5eb3966a85272e502b541517ad373fe8746969eb75359176f934e92e993279d5fceb4539e6befac9752ae5c3bff0295da816bede9f111a3d8d470574e7a35ce27ab523b376d1dbf235beceaaa20273c5a567a8ca3c306d1b3d98eb805d0140d0fea405950df22323a3446022ea33f9b919399ca85174f0c1679694d24d3e467b9fde7e77bbb8b635c9c246f0215ca36019f72d3cf02c173b350a88f3ca7f4360087e01c0957fa51c6306a0b880b00e21361e89e34edae48bb876cca61f47613990e58c8d1d2955e1bcbce550d2c94ecaf770bb65d10ccca73ef8ed7c49f8fcb11b3aebdcead53ed704b59214b0f0306a8941e3e3fb6adce51efea1fa42a0649c677c08063615098f5ca4de57064ea021ec430605ffbeb193cad4c0be4c7896e91e6a400c523a0009a1eecf576501a7702016eca7971627abf48de6cd50ffbe1fb564d73d974ef9fdca3dc5db611895e9a0208e80b8b3c8f58bba07de02a66b411b6bc5d3abf7c43ac32f32546fad6ae5d8202150e6ac7f1e58beb5b26edb9ee4c06f20cec3da3717e891591d4bf41178c9b307195e58af398effb0aaf025a94b6e30ffb2e89a5b032376d8fe3118afeb56101036b6bbbbd5d9c3c43a7dcfcc942e74c5e97541152a0924bbc818efd6bc7e20b4938c677959f9b83572ef181345b6454acbd2a1d6440938e4eea5366ab044356667ee4e8b84d8e26f83a717be859de0fb165f0c959a55e7aaf39db42ae72f18cafc47d249859bfb53a75aa4726147275fffd6cb1d8984b3016395f524c06095345c162cf3e8270022e69f104e696ad52439982185f459e21c1b3217a2faf4e35447baf0ab65d9bd53ca1675c0d6b9f5b35a42e7475cb88d626eb68cf33ba525dc79bc542ebce4daa4753d053a44c904a332f5be3e4bd2aa8cd909d69d7676d3141114c6ec9d37d99fa591931be083017e58799b69a9b6a2beb6216c6f41f7724e4a7e8296ea3f9ae95a0a8c12d050eb88fbd5de1ba5254031bc5e25069f226c07a910e2a4416c4ce1767a9878a55c6e84750e40d487c1d2552695f7ca92f4fc6e01c5019137c30ab2f39085259f73467841554f95acd6fce9d4410ac6a0ad1094ad71ff682640db14ed4b8d8c4c4906217f3b94110dd8c195dc5bc14d2b2cac3c7b57fbd4aaec301a6f85203a027836d187ca5adcf5da2e16724e125974196894e0a44d633f5f4b53eb487ea0655451193cbc98e39d56610cb7bc347be44c196912df45fee4f20fcb5080c184d090fbeb8e2bc3a9e8223cfbf107771d73e8f033efe32a7a456fa0fb4faa3778e2fd94abd09b520e7d797acef9b2d7c414382771c90fbd0cf3f6a514491ee1db484474ebe186e1eee45bafe838dbdd3e3dac4f1fc232cc6cea036a95b0828a02db9f859891dbfec71a9aca2041d11e2e93c9fee003943febc8b12e44ffe043cfff882a7c787309694428f5f27a86903dd252755097a235644590d4182cc552ceabbfe4d8ba56d944e8f0987618213c9a6f50684469c9f4dba10454e66cb36eda7deea3ccbb855d0e29cc0c62e0ef42d09566ce5100e8c415de6be18edc887ec3bd6ff31a2be5d2d7ff8211e05560c6f635487319691d1058f175bb7d66fba55d9796f6a6f4266126761002bd767f372e4a47be5f6c51bb13ee6e891f7e05f76ae8f1154a8b68bb2e49756385da9721a098dc67b41699b8dcc481c05022780d65c9bdc0fd984d99bf19c44290382aece29fe69829792d66ea7aa6d89148aa44441e75cb802b6e9ac224bab80ec6ee9642d3c6919d0b3a4c41b7666f1fb33d70fc887aef2780cdf735cf94342d414363b392ff1d1d3b266b9a5eba3bcbf9ae0479a8c9effe6bd592fa079d8a6097465d855f6c33affd210a85bc32a960745497e6dcd47ff5384301e39fbb09ba5d71c0a697943f727366c76f874f0413cad1b8d7689107272ed3606a5b8934fcf68cc11c23fb27ee78466f229f645db12ca8f1c5342b61fc5ca4acc357c9963f2483784a759474818ede6b4325bae1360329d404fda57822ded3dd16b7c4f418c6e4bb1e755c43db9891cfb502cac9bebccb0f6f261626ac6c53ba565c3bc78824a4273a0b7971ada72d7377889e2ec7db1198a47481b8237662da1cedf9635c362334a1605aec2e7f93d72ac4a105e45171b034491332c630c7751988e754519da184e1ff02f39cde5359f436c38990d1e8117a8f3cf6da1fabc82b1b36dc5df3167a8bb7986d55e6ba95ffcaea00f52522b5a823b100bfb8a4327e505000000000000000000000000f2e88f70f06cb0d9f9c333ffb415cb8c25e2f5427e366e90f1b50c230460154e334f0f032799248219d82c7bdbe8054bde354418e7f9acc1be04e7e2a581534af6cdcaf32265187962e9fa79fe105f4a2a1cd97530faa9a851525be59b0e22dc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ceb594efd9a4c00aa1a0685198b2a874515661e6ffe5a1c14aded20495ba8cb2a2edc06ff898e8e71ccd22f3c1735d3eb1540854a727fc623ce15dcfecf107003ad24a1b4cfc571e3160905df2e01e29b0d1a40c0837b5110a550ba2bf4b1a5534ef3f20793968fa1c0a7dc509c484aedd16c0226cb29fed20d23f7ac65c34850202d05b5dbfd4ee05670708dd100ef3be1b507b7b1b639ac3bb10453b863b58cc0307be3d84bf074febae24ec6f5f2629c9ed5c2e8e9bd5da2e6459d911eac551c80a01b3ea763f54719a5b9446732697cad00e03937b687cc2d5f74b81bf3d5a5400da07e1c6485cb27e489aec635dfa865e30eebfcf25fd1eeb0d8febc7769b7af2021f222c2f4308fb139352cb3e6e1238ae88d48c42208e0dd0a1dcc3e068d84f430317937bd1287169b68b95c2fccc02a3e654ffccdd28306e189898c04ad0ee77180323feba486fc5fd454527b89b120b93c6989d58d537ccaf057e21d8d137d3c0b5031bba92815dde2390a2cd6fad22f1c1b7a2485ff5632ebfd4e17133d541e7e5b5021cf916f66cc9d6b37c67b8fc4022e5ead3b1ef1a809aefd91d2ad0c869f5e0259cd0579600286f95bff060d5b596a443e78f651ccd7c33e1435aea3d2e952e69ea77110220cac3f05d05bf9c77f2ab8c8d5d0152697d8f166c1b990df009f2f1da0d62c92c9a39e9401a82d45a8b5fe5bdf6db3687d388efc02676fe96d57b3add67cceae37efe7c8c713863fcd5709414aa1cd9a8cc5d5937f087aa54122cb96d9281efc73756664861eee5342ae58ac87809cc14aa677ab7848f47dcefaa7afeb7595d75bf847524bc09258afdce007eace5c56573dfc0b56d8272fa59875602486489b1a8f1a16b4d1a0ec0f97e0949bd1cef2bed1733483260ec4c1d6dc9ab66c192dd123edc68886439cf6131991a919bc9984b779ca225cf83a424c06de88712beb5333bb36de3014f49a1e89cf24d790074b280f00b1b41705fc0c67ab112ac1ac6f73d625239513555610be8a88516e8004366c931d141cdfcbdd6a0866ac6913459ce3216c9f45f089429739950d4f96b589b63b30e809c641881835a5e7d66a927acfeba351aa29cf91b3ab3fde1bff392efc16d3164e832a9d27c1c8f5e05a03b6a90f927e36cb757f42e01b09e0763d99144bb5b87ec6dccdc928b83ca91071eea72f23e3cdcf9eadd01607b9490e3702e853e2afaa402457a37698671169dce82972cc302e359b1e8c787847efcf126dcaa6b3287d1f74a4a60db04f06b8858e2653c3cede6f1b5144733ba540df0ed54ddeaf0a8d60106798363fd5f6243f39d229ee6062a88be959c06f64039d9ded443955ddec33ec93e437feced008a0d0a5b0c9f3e08b2f08a40f70e03045b5632b43faee08927fb06fc6f4de944c68a8ca528e3c8652849e4932d1d2824d70343dbae2aec9a67018c7f4a171b80891973f7e146db0b06a1bce81e8cce5c2a2db1cb178815fb1ce2ba255f20a216740c6a68b1298196ba52360dc485e9304ff17a69bd94a6bc49c304a92686ca95f14e04d4d03cd4c2d9ef74aeb832aab87a7d58935bb76c0c753630566ee3987bb3fc63e96297c73684dfaef4c280c1bc1bdd0ee3ead173f579cd895f48466bc7fa8af0d0ce922dec51d2c9919602879a1119be97332a61f070dfd05249cba95565d78fcdb60d2515f9bab4685cd52efe518ecafca096f84ebd002696739dea528942d8541c86a9a8e49ca948ebf403b1b8021b4ae7102d39c5e6f08d888ad5b0ccbf06c47e2598bf3c3890d24f2abf0a811e2aba1c0cccba79982bd1e14c163087ef24af36753ff7d862919876dae693b795636d0cb7417b5f68c414c0b3c17091c588d8c86f0401a8f865cf65401bca3dfe2489eb88c9a03a47b0800907dc8aab6e0e4bf43edbdaab777b94600dfd125e932a2e3d99a9a1c4806a063f4be5065db7be9709d6abba45e642a969c8ff2418c1645f7c8f71e7cd024a8eba1e0d12d07d0092405bd32db298257be6995c15d02ef2b79b3b8b5056f3f78503024bf7cccbcb57896ada851610bfb0ae04018be975e40524beec87b7b0f1e1bd7e04739a9e79f58386be3098257ccfc60abc8785aed167400635b5c745058d6a15b32a60d70bc3d20570c129b946e5f8b5833b105f655c18e799de9498397c7cfacc7a0862837a022667ca4cf7af129224275b9bbecdb9867c1994cfc166f2d7cd35c423a72395785422266fa1f52ff5dd4a5666280d052764ddb59a6d0cad326938629f1738d4a5a2e4e4ca57bfbaa6dff9289e38b6323a8d90876589370e1747480dc0eeb8a2bc4de07067cbd862b5c75f8400939c3b1d9b19fbf77f51d35b5841ef12d78fd4765f887d6bbf7bae14bc9ba5240d24c85675b2d6987c4b3c318652b85a502473df542baf273a8306b00b", "6a", 1, 1963462756, "fb00da5613e2083f5d84572734e740c14d49bec178cfcff9de312aa84a761483"], + ["030000807082c40304cc29585b2781e573d2e64de5b9b2b924aacc2b88f5bf1a6e5bf389c15a7aa5c9010000000663ac526a00acffffffff12abdf9ad1b077c32eaf9eab86017b36e6abf65545f744cfee6c30e24b783243010000000951ac515200515263659b22fbcb67c034698687d99ccb5d5260c7151d13061f65da4e4a032a35d3bc097f93ca9a020000000153fe7dbdd37e3ca515514bd9cf495f5631b8461e2d3b77b306bc54d1826706b83b6fa5406c030000000853ac526a65510051126d7806032bac4a04000000000451515365db56bc020000000004006aac51b6b247050000000008ac530051630063529c1337698d583b0c010000000000000000b57bd40500000000105a71628567cf76aaeb9f9285e9fddc506f7273e8d5eff8ae9484056cd2c106193c89ff6f879b86121efcb3f17e97f6e5192d022c08ead565ee93cb5ffcf92d4de9bf94b923666e53e1d0cdf3485e4e424ef3bbd87242cb78f25b4b37f38b8f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008ee0ab15050212c93b6d6b8f301d40bf4e5febdb98b4d86e195dfc168148216a54457bf60c73e7716c40b8b0d54ac448c21ce4951eb1f61d4c52393a49f36de4090ed9b943f8e2d360665eb5107bf78337f9bd83a38bb06bef8a424b219c3ed6a09af6a3cd4963e045705e92a591a71d3eda9d27ae56ad39b0442027f8030510022394ce49aa3d5201fab3cd78dda2860f5f644eed9f4834522b5dad7072289ae4030304b2ef8a3e09e7e2fa93ac80750982dfd8155060420de93472b67fff8197cb0b0310462530718521790e788624f64681ccca27d76a4b8da06a68965be93df8013c875344fe95ab3b163794a45cb9103b565f97cebbdb2a9bea3ac425f29253f3030554002eac1e9c369de6cb747cad5f4bd0d06c66cc19165a476b47b5e4119761021f3168fe14507ddb51a4db54a21a046447416094bdc0a5489b290a3c86f116050317de2c9753383358e4fdb433e03adba52bc532b714c9e70bec864c5783f00791020d900ac1b85cc001c156774cac4df20eb5a211dff5d261951610005d5153bbdd031351b195fe47e7a18e68b73e308f740b15bbf5f79fb6bd59701e1117c9456abc27e0f842dfea8dfa7aae5f246c42df4d3391db8aa4d1015195f728788403af4aa51970cb99ef2503e4a2407a6fae0f6f696618d914d71dd8b219b7722bd2a7d1e0a48152b31ed536abdf135f386f4da2299f867f3415b0698bcee14081a5015056e28b74a816bef7d066332795741872e62822ee0349c106f389ad1f4568d7c6a7fd84c7d94ec86c2dbe45b9fa84e4da8c29d0197f9956116e78f3644bf4321a466779b97b6c0e6b562835eb369d7d84ffd3fe0b19eb4bd6071864ad7fa57ae9fbe344d49c2bbfbe40eca37b7d76a111ba5b8899d2de92e19125e53af8b0fcfe7bf1236a5642ecf0dae3cf369324d144aa99a809b494e5b8cd45c09d20db36eb2723b459955ec288d20f43a08c3e173f9e3d41eb4f245cb0e25910469fa96e0b33e2e10dee183878dfa6b3cd2f632ab247b8cfdcfd4e0e76b5bcd311bbd8c7a90a4933bbd532f3180acd04042bbd899967b598525c9e93a7bb01b1407ef9e6658b3cde677ceedde9583788ef531093279f4d1f823fe32a9ea56626f8476a4ce7197e5129ad2b956e2fbf93fc5afad81cd200cb59e86bda396d46052d8310eb411f6c1effc76bc8a142da12adfe5a223263385c10c2aa788f9d6950a9fd9315935b5b62e9f552da157d752673997304c14e8268df4031a7a59997b2f020881fb5a744b41d2eb0bdeed2ab3e74ce85555d7789c8071cf8aa8683dfd5ea016023f426afbbc6d140f48a0b18af5f20b724fc718930a40ec209004fdbfbbc7f022bade9b31138c8c6b99e41110cee59faf9ccd3ddc8cd23a3e9240fba3b2e64436a87e365ea39b7b5b1210646cf04ae19a064490b5cdd3d2c0c276faf938d48b5675def4bf606ff1a860c1cdab2df3a608cccd714b9ada0c49796b6cc242b61e94392ee68505c5d4641f9e07b992c864c7a3ad5761f7649c73a54995c91495612f299386632a4ce64bfdd71973857c4fbb87d56a10f14eb08e9c7a66684c0bc384a433a491126d789e6810be87d4346d89642bb297436445b63680cf7e88c94aa538530f5e48a3455b8a0aa1fa583c8ba67cbaa885058f727a242b2466255365df8b4e4912b930057b583881cf30d437e23949618ca91bb8994c460597dd5f0b78a740bddecfd05dc3c6bdd736fbba272beb6e00beb2b120b1944eb26d98ecbdec7207905cf4c3cd645843004ba6077d2debcdec53871bb1e46cbfe0a7af9ce7ef6a9f090911ff4ddc55e14eaa651b8055769f3e9d75fc283bb562cbbf3ffb29d40f057efab1b30c6bbcfe85bde7c3d82d56eb2fe4775f9cac3520aa342ed747c71b5b5086d6e8cc27fdf3458e16870bf8c74c309b47402e694271df39af7a06aa751be0fc2927fddd3d90fbc6fe94d649979c646680d4fe4da1426ac42193ce92d4e85c6608264119afe8898649d09301eac2a26551ae1bff9a670eda29c562d35b9aca870192e8f34a8fe507765842d645a4a21281f5895b98dd7e955dcb69fc1183d6318438097e84a6f8c58dfcbfe6cd4a56b2dc498945c04b97287422991c7c64b8bda0424140219e3fa65e051417b67c33d49d77fd1f8a2e2c5d3f181fa74726642fc3db899ac66e8ac93de0a66e4ed4f98758e47c9239e91382fec52de3341fe4c884c8886cf9c846407d808a9630a943f179ed35f8cfbf43a1b5a4473b7561d2b744d309440f6ea62e1f23066202e4ab0857563fd37237c662a71268f94096153297e63b4412a9b94995c9d298fd96110c9c74e5fd131c72b1ff30fe60574fd016e7ac76381b944d080ef5e8e399edc186ce04fba9c23e6a236c6a9d61a6fa84c9e367c77815a0972d554cb0680e4e208", "5365", 2, 1669383160, "3e0ccb4e0bcafc6ff455a6ecf6175c079dcd6e2e5d8c4da35b9bee300b4182c4"], + ["96e8fe5201349f05fef8f82cbfd5f3bed83b25199e43d3dbee7dfd63673c02930245e8ac8500000000085300636a6a526a52ffffffff0144db680400000000086a520065516a636a000000000300000000000000007a018d050000000011778373a363758364d1fa40b75f578dc1ad4b9db4cb41e5ee106f5d72ebb87669b3a808f3cc49011e9033e3f7b4310a2eccedab23fc3c85ba90aaf19d0f6ad76132db9f5eed127fb1f2ade1ab20f6e24975f21ef8404011020fea1eca57d81b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013c3d1719a013279af42faeb05702d4d444610a1e64d0ba88e251477466d393641ba35cd523ef36cb14641c320ab6a7d0393c2515b2e76d88cc32010bc4f5fc6e881bcf91209ce56015c5c654699c55f48b7f3d8e78418d6c4401ce392e769396c3e1bb19bc51f73a6aff5ae6fa2cf4e7a8f4f713705648090a90f1a9ca0ebba0311d183cd0e2a674a2d304192067a065b8c42d5dac47858fc37972327c1dd93c1020ed86fca1a322777082122c16141b10dbc798472c66216e6c3644bb40505f65f0b04c100d917f361ac318221467e4eed1019166c56184f8a80c537f45bfa9a3df40241eaa4b6824776d7a3ef5dff6bfc75aa9fda68713ca8b933e91288fa74e2560205c59c78667ded152c76cbfef71e339248ab1e6bafab94cc76aa356067bd2aab0215ef5c567c29de9988d7d35ef6df0759553eb4bc3dada5e58014ea81b9d66476030e55debc07aca98bc91837a134e3cbe4a81a9342ba8387ce0f86657e995ab9110325627da5e12fb44c2757177b37250858f596d92d57cac42e349f3e6ada3de6aa02190c1699a6de1d4da30fca9aa528bcbdcab0e757897ec093e120cfe2be4dca5db47553ad46fa334156703f2a6a4a6fc9426e6f2e19aa5dad9b6664dbcf850da9acce1ee45a5ccaf9e2a5f8f7cf1af30aa5f9835ef3f150ad29fffbe5fcd087e23a0c73fa6e2e16d9dfc0b8587020714ce9419f74c5060a850f0ecb7a2f3f612e4efea9300f766da24d9531f3701556a84f5d8f5473a061d322dbcacd3e87187253a9cd29c395a8d1f15dff688af2b390f397ee8806720d3e48a050164f6f61ada8c760f9af55c0ba42428db2222279b50bcb3b729c2ac1c91125d2e700de446a6b6e8d966754acb0c4d7f8a64ab54ba9d108bfb64e889231d92bf6576d7d29650e46f5221e4513ef64b6718f86ec92ce616a9b069fe93055f0b1674227c03a880ef0914ef5e79a9e2a277329d7e02f5be615154128bc31ed13203b6c15f70e7971c7666515795e39dec25f020fd787bc7f328f1b93d014a54f177c0b5b04081a4cb5c26c00292fd3ac3bb6592a77a4fb4268ae6cd8adbe90bbc3767c4aa3590e0ddc20927bef5baf58e52866ae6e8e80b170a020ec9b1557cfb426b3a819b4d2f005466fb7266aea16b051515a68596931cfb60a45e28db46c85ad5e9251012d0f47d41d5d08cdf8aaac0c04c35a445e8b5bdd5e248852d112f8b386740dc35d68dabb2f2f9f86727fbeba444f89240042428054b447aba483388f6e791dd4dd303555fa3f5fe6198961eef1146ff6c2766e41ef42ffed58445501ff1162792511591f3aae3eb68023387d6a835c2a25bf63dc64b8da174b7ba90c8bdab01020ade84b3daffa77406a178a182c5c0a4eb5a75e740727e04395d77d9cc4eabd7187e8b7c80439ff6359ab4f67dde376701dbd98077db5d6d2069ba9390f4a54f856a62d5f0af3b46da855876a51c13b811de6ec646db1bfe74690843f59df2b2ab17141421d93416f943f327c82029fb1e1a5b2493563a2abef8c36e50f8483162077db829ec8e291ddb6c0f0af3a01c06614ce9973b0dd93dcc38f2151baa4ec756071e2c6892ad9c9027bc3764a03e1e9aaf11b031bb2e394c5129f3dcd23d31bcb4ded258b26ffb6745078ebf4a12fdbc18af6fcea43cb2025d918691e6e7a8117c1a9462a8c9ff1eebed9f1b00466048a1bde48f475f11525e717f86a30cddaa10cd2eabe05efcee0abcd76ae3c85e0163edfc4812571c554e642d5cf2b3d91fde776084ce272c618643467d62cb0fae4fed0a5c0734c41e7a310a5a5e0f9221fb2b16f291ecf4e5575327ae9f8548f2dee258e08884d90a6c27503cb94a1a87e8e52ffa1e9ceedd2884be8c9fee137a11181185398379c72a3e98df506d3ff5552c4738b4756bc0de672a6e9084d7f2760cf5203eec494f76f53ad8976584f7df80296ca4a3fea64c9196b2e47d88cc080c0983136907ff09eb1a1a5d892b35908a88fb9652213311d4cb3cc78782fa2834fd660a18fcfc1692368ee2824dfe69fc9da77190a709e8f02ba9e7cc510dc7ceddf86e04f9a53c8d614935bdaa28b1ce10627639a995c5dc3fd90158e9d34c3fbfc842d29d4de6eae81cece2276f24d46a342bed3527aa7b3c7950e814bd6e01587f6e5a5ba32397e102d89a8213bfabd8196d3c865977560bec486bab791d7496c8e973f0699499cb99956d72c06a7d0ebb3121a838563765738c2bab559b7fa8b1aee669c7226495f6a062532eb001dcaaf865db85993ea0cc84b7c428f00000000000000002a5f72020000000043cedbadef91e43e1635908983eba097579ca3a436847545f2d6a6575c2557567f4fb3917084866f89f5847b1398e1e0f3546b70675b11fb8e5497d1feb779f7c87b995413a49d20fa2657b40d1024aad29f6a0a1b34bf3d2942dbeb6d19d2f300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d4d91e0df364bf9da8eabd33f94ad7b5d5850e926d5cd9034c02619e7f40dc5fd0ba50955574034eaa713c66e34ce394e5ab5a1a7ba354570a71a700d7008b369faea4c24198c597978a2d39eb9d0a6cdc2bd6e3f97187faa5034bbb5e01f0b0d7f16b5074cb90e31193d8f8ad9c5fe949f1426f17539c32a140daea2ba3732a03259c7eb1ec87843f33001f5eb91c2458b07ab4cffe5a976d250796f943c45e94021bd5ebebe8b26fcdd033c84763d7b44690c77d05a78c8821c93ce3e575e72e6e0b027d44088bc4f8cf4cebfb3b61217cc581da79a7c0e2ebfdb5540196f64163d08625ff7fa18089b1cfa0ad71ecf29ef5a76f688b3225b8834384cbeb5926d957021fb4a3545c94ae21b845baea654713788d2d35b2421bfd68c98eedf2056cd5dc0210cc00291da686f1ef28608403f2d32d1d2d143626924a6b472b071ad7a43c4c0325d5a6c30ae694fb466b04343f8ff453626cd8913300c5ee483e2926bb6a725c032ef8939a8aa81e7b4e9dcfc3f4134230dd2a2a82a3e2b51df41aa2abcd80db61032a8fa05cc8cfafe1642f6c98d38d3c1b4d4697b53e4895aafcd69b06179356f6876346965b7fc900890c875c7834ea48a770547f5f6c48bc66693b828b06166e537fc550d29639e7a6c338c90bf1a6d80ebf8f72f9c18af3fcfd8dd685fed0e10770dc53a9d630724fc6aeed84214d88e2a54b8177cb5a32eb15794a7cd015fc7786bdc6352993a16613b5aec5969291f4e68efcea527dd9e46cb64712ac0811f737417c3195766393c77070415494025f5bc36c50224cf9594c9c5333e880b46499e6e6643f6738c2c73ce972ea1cebae099c27b3db235a979332dc133b0eeb86d40b9181b84f83c72cf90dd7656fbceadf0d2f81ce57018a2d3f3c94298a94a25f52a307d159905e3b365bf4294357cc7bd5bd0ff7a86cf2c83d312e142deedcbac82325932748878183bca3b44f621c833ab0a16449bbb028fc85252371228a87c21936a0f7b98b4441bfbe333e268b942b31a23488ab7281f19a876f6a00550e7eb5727ffdff7ba9acfe76dc3c8155ba11b687d5abca8adf87f93abc41ce36489ec6af11089df4a5d345853ad78d5470528de8520306d0d21270092b4b46f41016c21f61fbd690b40b83ebd802573dcd4b1898b9d0b7143699eb4701e8b6cf6fe0b1cb1180a4ff93a482df466270cd9d39a8d7a55f3eef942e8d50733e993f1e688bdd95938fb0a27b5ef8131e2c89a29c2c282ead2ac1565018e5e93c4cf9dcaa4b6194887a0628dacaf0f4de793e873b68b865352f4c71013e7fc653ee48c19c4b472d05a68c56fbefad34a888d9d1fda203d7f1496cb8ae253d0a005b3d54959527632d5d8aa3c4a15e121ea0b88faf41464dfdd04b7f1708c96c7c57967807b2dd2f29b2601fc026cf9e7018a51475f955211ab4ce1b61493147c44c9a18dbabea4de8cd3befcf48cbb9df846739c5dc2281fd1c5bcfa47c4e204aaf3980b53f176c972a81d453d08c3eac6a89e450a83f80d6a7a69bfea397a12c3dda95fc1aaa26411ce55c1c0a07c51b3a1e24f197d7f2409096cf6f0e59eaaa9b2f67914329dcf495466d2e30e7c9cad6e30ca5347418773f70e35cc0b5bba64be8c8b09075f6899d56cf15f000d92740160d02006fe99566dcc0ddcb775dfeffc015bc60a3b6790f9fab7a769ac636a08d0cc353f3fbce1488d4b72fc2a6fcfeb3ccd4880c5980b0039ccffba1f87e673b76b3c06f422fd64008d2b48997a08686c849ebb440e0764f1db016323b36cc619cd73d6f525b5e8fc66ccc011229d84e350ab3f4efe524616b6298fadbc4121fcf18b2734fcd847cb5abc723c4a49ad45981dbae61576759f1592ace3c1753ba206ae8f0d3c943da76a0788043a8f7bfbf028101dbbbfee4864ebe23671b11df0d3bd84afde6e4c6914ee9c71101446977d8ff73493296b39bf546aa98414cf0b10abc38b13e4dd2cc9d8189a1bf4f45c5405fb1742fc569f3925ddc952e54832e27e80fd01255c829bda689671787e86a54436e4574ccd036d8d617d7e6fc8fdceaf98c00d20684fe3ad5b9926bee548b3d9eb823b7575169c9bae9c718761cc650542cd46897d871496080052b0aad29caeedde34114d5ee6d20e466976877c93f15f3e95e4dc3fd6e76520d45df154c32b9d4185e5867b6f5b4f21f46430c6d027ee91176dee5b4bf5d34137e9c371b6cdf0c3baed0c70c6a201ed159de20eb4fb666116b4d31ecdd84a76e3a69d6763e37b33381ad76634613cb3e2c994fd7c0e88704000000000000000000000000d9f9dbc1f56630525e68eb822246115876cf06e7d9afb79cbb84197b1e39a7acbe79dd064f7e99842e70e202085ae5defdb8e7a7f94c7b31211f32cafd77610db37aad993b62151f02bfda55f975145e2ac8f92a5bca83431357c6a5e934517e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007e560b3ca4c387a89b31eb2720ae2983256251533e85052e39a29adfc922ee7c88a78129047011faaf493a341dc2a4b85773f1799cb9bc836317ab8766061db264d8f3dda7107625778a48311adf2f3778ffad0ed334d0fbe78069ff7ef7c5b7e30e2840f357fbdab8713e2bf0ebb35e4f98c7654d11901e9fc93bbbd96b23a60311db38db144d48373ab0237da4347d5fd9ecb8f01140c4125247d81e51212d860218133de9b7d9f23e6ae3dbc77825fc830ca151d140798b393d8af07ec7f4425c0a00acce49ff4402ae1feb211e91cc8ee52fce6b46aa29b4ad6ec3502c688acc284af0401b15525220d326f14f655d89a6a9d5ba292fe0712a4785eb17eef26d300220065870b63d5645e864fce19f3cdb14d696e07d022e6c9984b4aa3da3376652022078fbf797cc58fe08453d4e4350e2e7d1125f486f78c0fd826ab1a508c0f0b40213da1c2fe985b7b41701fc648dd935b9196e090f87698d1f502246dd411de43f030b3901dc3aeb3c2533960f2060eda24420caf600d70a6f94dde7ed31ffbaecce031e5c3f540628cde8f494c9765f437be64139a4c1a215949fb53706eadd07a7946cad2c2212da76739505cb244fffbe035d6fdba0218339973e9906c4a6cb91555c6bcfdb4ebc207ba88188ce741b96b26be801bb8a3aa39268ed46261a34840c2f1415f4ee03bead28aa51f48a1a123d33ad8e024932ce90cb39f8860b6e9010b9677b59eed3dadd83cd47b0c41d1cb91befc64f909f682a1b7fc35eeab4fb3a7b97776e0deb4316bb8fcc0a6a338859ff194cd374190fd22350dfad8bcc08905d5ee6f2bc65cbf15cacafdf9d4b0ca162a74ad3a99120c31cae8d2144a0dddf6aeaa749511eba5c7aea141c3a8bc6f20bc96cc790e32b2da71e3356fd5561d7789455ad5944adbe88f8765c606d858f4dbb09100e451455c1dc8e515e387557f49eead12aa6014961631f9a0fd23d24cc2a5980ff30d603a3b5e849e4aa5288f2388dba97f5adac46b2152dfa4ef9b4e0580103c9a18fa44dd67b83da6bc5f3c2dc138f72709b49ba08ae5c31d7f3e588502d06408919de66202953d98bfe51eabcdc6707116ed30a5be28043440ef8d3f358442893205fdca72f750ce3c731069bb3c71ddb6eee7008076feb37860f7fc122c31621e0bd0f6804dc261ac69b540baae5e8548ed032f62cf5b36be37cab22a357c92d01e8c87951585bb89244f3fecac91dec64c70c6be7be45697052b4dc7355c5f283d31ee763a379b22ced7920d5fccedfdfbe57946796330e2ef7acfd8755069c81a10625a7f00b728db002438a0c0473c4fed9f7c8d4784e866770af06648055bc113e6883f89e48632895c1b9d6a90afbbd7ba4395a0956bf42db3e90774c061cbc089341932d50a77bfb62c430cf8dca46adcbffe807607175789b9d094f6549b14743b21046d5e736b6c753579c07c3409acca65f554ef0fa4d8a83f120614eced26db9f73be237abe39a7011d3efe6878e1a6e69ebdf2d21d2f36cac9331cfbe07dae7b4ceb7bbbd45198bbe08e6392bc2fd66c63e59d2488fc52b8650ff0beb0b4101b6ed0ec991c6293d93d7ae3a4c75f4700ae9a01bba9f3a0c8d4e9554011524d1b1018d9f7750d0782c67d7f8636da466255d45f60b2514e8b8a476d6fb1f81e2725ec95407fe26d65c8b20309293f6a985346888688eab751042c5c1734b4859a7816b84ee4ffea7428a13248bc90585ac27e6f08f4b18932ca60e714cc22b94e72121aaa54defa7dfbdae332eb4f9be74817d01253bb13878ba308880e15dba8dbc348efd1df8c2a9f42d09519995a8b1138445142adcebf1da5ab7fc540cf6dc6639db0e02be73c344e45c260f126b6d4140832d823e1a4864b9df1502c1c1fbfc950aff3a9aa5418d467628617b51ae1dddc14f08f8f13342c338b4b769a6c46dea5767884bba062c1e61f42fce0b396163a2413fd68cd06454208b1299c4719ad336fa07d7e7637e8cb427f2d8a93ce667ee7767b4fe302f5e7eaeb9d5b5f336936ff913c52cd429f959befd9a716eb0c45b7eb656c790a7df78a1c981bf5d90818fc225cddd67003d4cacad449f02cf73bbd86c6eaf7bd5c2339d7807e2cdd26d7274771149fec567ca0149f63387e3436f541c323735ce3e3c870ebc94e1b138de90e04fbe86372a3103cb93616e44d907bbb9ac53096456aad0ec20321f024ea112d6b8b6c25426cd9a8734255629baa6ef936b911f1fccc06534a58998e20250813e72bd2614de233f4f0795fe313e63ac8037fc171b21fd473feb413530ba14aaba10993f6b5db9fe3044717489a019d53f8105f81713fd58a9bcf652e0bd5b55b6d9e32c211bcd8c06f4874671bd267434c2632ff4ecd2532b2d289101c1a4f07e0141c6ca26332fde653011f46a50f46604", "ac5253526352ac", 0, 301220637, "3fcf1054f80c635e9f66ed55ac14ff3a6aa7692788860d8ac5b099e330eff668"], + ["1bd6885e04cf7a09ac340e9a48244d922c098561963494af5ea5761568f13ee2110bfc4a92030000000465536a51ffffffff85c687ab7063d526a03ab8b58adb81e77e8a84b64a256a20b4f1f67e7eaabf4302000000035151ac6a587dd6e48f742e55331f4cc0ffecc2d26b0ed4a8ae8cd9aaa7b02103dd328577136149030000000951ac51ac650063655303f5bbc3e109c98fd3e0d2e556d64a0e711bdd569002ba1e7a9444172d8fcfec9e0d1ef5010000000751526363525365ffffffff0187fdeb0300000000046a53656a00000000020000000000000000e330810000000000203c147b3cc88db0951ed457f1a85fd0e7eb7a9f013209fa0bef4e5ab6fc65a43d35b636e205c27760c6a8ec8dc707870e4dc98eebcdade67b5b3fb176684bb0adda172159d79cea3bbe42c9ed44a9583fcf74a91f1a0695184ca01726b4e732000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008e6eb60f6fdd03ed6eafb3c05d8aef5df35a4817c32a2575ad1d0c9d780c33823c24073ca386277f7692a6fac32bbb9e74ebb9abfb31a068dafd825ca17adda0072e5719a4d74a316c83cf860cabbaf69c6e93c6fd4aa00ab1ec4c02aa737673620df7c31fa9bf429c9deaeef74cadefe252538f83eea93299153338578b0b590320321a59cd0d7b456f81ccf08ab1314efb99e88afecbaee4355192247a037b560329b397c0860562fe384edb4b11a6f850c40b83f11a123b3392b3164870eb99c00a019e7c1681b0b1df85ac789a9f6ec7fdbf6932431b0350bc5d19cb4356b8a1c9ab4a0ddb338005d921b36e67e1124b3fe378cdb90939cff624a0398491b2676e022b4b757f67ec24904bd5923db657ac02b279d8e9f95bfa90547fd313ae535d2e022ecce7b270452c4713542fd6c0e799ff07279e12f034856aead86fe7ed407ea3031033ea1b51cdce8205d21ac3d8be5d0ae3427a943fe57e8ad86d9d24891b0cc502229d9d3706d90d9d474a0d05bae86f6fca2c175f03edc6ae1dc9deb88e480f87032b65a2245dafc670442354201f56d7494f3318ea7d1b2fc22cd250de3669a1b1395d8a386ac9d9ea342312c8467a773e66235321db7eb1fd076df5c733ca25492a66767d85e6fbac1bcfd950bbde9d9ec171f1639166b8f8a947414d4a3c19ba0ef1509aff3313c6a6f31fd63e37ec44d23a52f64ea86f3115c44ca2c3de7bbffe17b147795fb6bdf55d3187a88e35df30117e79ec91f3acabdc894914eed0782315a7b748ddcd47ef99c91cd7978fbeb2314545e883ff588e9434f1471c7301c6f1a4fbea11320f175cfe0a24c00f027d80a99ec38f85c0732fa206bb9fb47258e8ee6f8d1101cf90add6045a1933fb6318c7038ce068d498b65fdb25c39e076191c8064f21f7dd32dcccba295613b5009ceffb5346b556f09b8a4352cb578568eb2a6f84c2d4d25000b77042dd4b71ab83c1bccaa64eea34a3f706d8c47e208974dedcc9c4b7da8c2e5e48bedb98b1cb49b29eea79dc968e679954fc58b2438bceb2eeb290e5d8014b293f0aa30103183b0c08ba5b00731d1178734b97838ac401d0267d05d234ae9e0d82ba4aaba616f28b2569af951bc8c1034866f761ffb8a3ecb64640eb1ae1f3e1eb546513533a3ce5c74428c68148becb046359b9df2e5c6df975daff3b99e76b1c99ffde2287ee713fbdf5cfb7b0977407567b4f08c0301c4b240abfa845fb854e82eccbda02e1af6408d6435ba8ab5b50ce6d04d65b76a3fae530abb7a2a6d51348c999b41df993ccff0fac20d0d9234c18ee64c180c20b7ace16351934ab795ef699f163696289c19f4a31ea037a7b0db4bedcc65bd533cf90239790d92ae2dfde51ad709a30cabb69ff270c95f9f98f77431e2aca9b5af89d297619129271a590496eb3e1eae9d8cbace555573e3d1d11ab780686ed066b89b0804e7a8e83464613f89eb6d61178cc9a0c598946a6f05a974f4ada17e892f969ee1089654eff1a9ed827316db9c4c4cf4e094a8385cdfa2a6ecbe1e8428dcfb1af7689fdc482c8eca0621c9685342058e66f8a17cffca0247f783b83aaa633ab67df4fc4091e0a3c6f77f0ee1f75c238f3eec7a60715727a1c4c74e85ab32d0942bdf9d8b53f7ebcec478f3d86c0d40b848e31df6c471f6d3f9f9fe9897d58b8484734325d19d7c6dd179a427fd049ea9e2793a341010c3da17a9926bf92dc5b015cab4ad8c66922f9befc196c3071d0c52ca5746dc930d1142b5107df2943ac5c19a9f29162f0237ef96ff711a7dea7ae53a791307a16db432941bdea59510efbc3bb1827c2bcc3d732160af1311a67b8dbd4264e12854c8e6180c0a4f5ac4ed107ccf9a2d8ddb36e5e31c2b87b37f54dbbff294efea2d8d45710101d09203d4c904edc3b98652195004186c272cb27d0fb881d278334b703772c9c743184664aad1b990dbc1e18750b4d078bcf1bfe0d3721ca3a45ea54e31d21c32ba068d32b8508319338c9d6397d883f76bc7efba294dedadd9339b124c922c9f4208dadc4bac6835150f5282933897894d80ce5aeba4db31c05ce111f1e27bee8b4a641adab2e93ccf828ba72981b896872be11e34db4e1a0afae411d95d249106f29800de2f4a19fc2dc86ef6f4600649df1b673ff5dbd7535368132559ddc416221df4d92025e1a2df131090415c6404388d262e0dd0bbc5a6e1f6ad991a174e1115d02deb15e7cde0caf6ae40c4c04755add0cbff29785083c651bf65377c18ca0d2e3ba6182b72f2e10e36cd5cd0000000000000000ddccab05000000002335ab298ae2e5849352138fb8874723487a28672f8879466788483e16909069619adfffa873dd4ad52023ba4680bf3d34d2f05707400556360e74292fd1fc6e9c52fa52955584b0e43e10ab4a17856b9170ba908319019b5ceb205fce442efe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af800152e73f7fb70670940ffbbcff4bf17fed45320a002d7cdf28944da32c1e96f03d53d7b98b0a5fee462a34e50daddb13d8a0a199f740dd5ce289f82b5bdbf9578e235905e54a9b524a806e3ae02a51b884bc08a0555a9fa8b0344d86d14f786f9b02e70c46c9b8cad3b782820d1e2bd03d8939c9783b40ddcb156b2c61ff03015f4f3e95e9fc1c342f62c9e22f954b0a25541fad335f5c7d2817ed46055bdb0301f08c61745d095c61407fcb87955b7d040e177d09c272658faa42be6fbe60f50a07ba6464843956c3fce44eb21d8b0d7e8bd0aaade951017e08d1ce67e4f49eaad8fba2b14e63b103621b2334092d34d623161c52caaec578e13a7e6dc3ef55a80305f6a7f081dbce27ce9413f6d12ce7c77ba26bb39defad714309109dd938dedb0206c34139c7b74fac72132d8641cbfdd20abd800068c9e42f3d10874fbc54cea7020e0cbd5c3ebdb7316f3d88145eb73d662ad22dd8d8e4f6be7d80af58656d781e031c03b8fedf44bdb0a06c3fde3a26f6c241451ba39fe60eb6c3327f7816ec62c50206dec3904a1a4f456b53af5ae36053440f26ccbcbff6bd92e1ee29eef86284f2eda791b995cc596439606e80dd60d83717ec55bcbb6abb1dd42b7bd89fb1180f5de6d344cb877fdc546453dfc24c3a2be248cc5115049285d9f084157801529e86bac7dc580d0572f5915f0970d9fba745327fa03b37dc107520542ad331c93180664d6d1794e975a613fc396b4b0606b3ac3222ecccc24a1a9dfea471a6722019fd43fb8a046c6bbf4b77b2194bbe2c2699ad6f26a8f86bf6bcbeb5ad423b03aa49c483d9be4ea7c2cfebf386159204922180b92d699d17ef2d7494c608fb0cf5353606d263625fc6bb53f337a4c23902b90da0fbd5bf238ac75495da225a1346800cde208a41facc3c83ea70835adb11003168de045933cae16d46b01bb949c06c40387736c9d9dedcdabe87618bb76ba6400feb2359cfd391cbacea9b5869f153212d0a286cdd5667aebc2a83c338ebde4ede7b1a0f8ba91fafe9675b06fed4fe6cff970b9bdfe778a53d636a94ac94b984cb7324eb3c30eb05913f9872c09897dc8599b2d74b11ccc80cf00b4fd27d58fcd08969d0102add4c4249ea97d0b3d941e3703315af6dae87dfa59c459baf482b310135126e7eafe1e103f2b6d879f1c46ac8723d013998142d21cab48db091fd3d511a8f2add25b468e38c712fc6968fd871fbb555a2212f1da813f8b199d8c9d5179d2b8237a95f936b62587ab43065c68a4a51d8b8e9aa04569239e10b2202cc77af3a5199e40c4b2329b6c43e56745a72b7c0255ee59af1595cb75088d75f34f42da5ce0f022827172ebf5b710b8faebb4b627576e8cff6c4aafe6a701621197cc8bf6181aa2e117c6520828d4e9a6710cfb814e0c3a4323434467cd5ca66a9ef64b78630da81a5c85cb1513278cf5b7d0b0d742c16d643fc3ee2fb3eeb84b07100c067579f3c866afc565764f48456aa672c4a249934d989d82b961eb992d888c27a8491729716a868faf5af15e018ec5e2c0200b58e41535012b2851a5ad225135f9de56958d9971c2c2c0ea4f5825fcbfc4cde457be3dea34cbdfb033de6b52e3ef5a77da706f6ff155eaf1dc067d057df4a9bfa3b2558aa2b71240dd72728ab3d1c303d27f0d1e50e3825a76e3b36534cda23a4deafcae427480bf310b70716f4dc5c91b7f24fba97809d29ad83abcf72c460996d24e3c227675cc2aa19f37e1928416ff091b9f454c48b114063323a1ea418529a40ae068bd45cc869ced3f7e9be63559a160dc4737ace23ab28552fd8b32a460297d2ad31a642a885b02e5d39616bb96e9c3d9de10f709e1a4b42600ecda3bf005ab3ba15c4a2d0d74ead6e190bf93cf6b58c66a50c7bfa7d9df255823b4e12287f8777df52c80fe3ea261cc2c604248df0412b9114ade301d9835fffc2deafcc656cca1278573b9346a5cabf37d6b79bf5f8337f2405690b32a7d4cff41c3d2c8aece5dfd21ead7e116c52715dbc20fb43c2aea713b34e44687b6c3d58e13319a869b592fd9fee75505546525d78b7eecce6b897d772a37b32f461800f9600081470e5a61e555f9d5782de282f0b170722eb62dfcd3c05a3dcf696fa713c6f33066ba009d0379871ff4b46cb0a90dd60a4acdbc6abec943a62a89c9c55676b52b0aacd6c41496af97a889d30c7900a8e2eb48eacb2bb778d5ed17113c5911256a4500592df07cf76b4a54f30b318e15dea637f3780b01d72e915d5cc13e771384399b24c0ad0c01152607877f65bf2b00d9f736da5de9899bb069007c02ebfc4e6f5c6286552dd837c50408e1260e3151c72dbded3a0acd0a885ab83c705e53e379e21631f71a3e9469743600809560a08439de7df230473e07c87ba87cd16a4ce34285e4fce03", "525365", 0, 925214721, "a8092dbe7d16515cb647eb7711427131239129f1873277bbe4b357911a6def67"], + ["030000807082c4030300f814248e7eaa51a02f55733ef0c14b9dfb86bfe45fdffb448fb68c3d051532010000000752ac636352635153b92cea53a6b095632d836da5b3714875207bbee9bfe137cd870d79e29cc9d75167eda200000000026352ffffffff56976a2eadec5968ee16cf3bd6a201d4bbdee26182d96eaec33f530dd34244190200000004516a5151ffffffff01f3d1a103000000000651656aac656a0000000046995ec601016e310200000000000000000000000058cbaa102d03473fbd1af31330df78b4a029001ad27abac4bf7001b9a748921a3558332332e9b5d897e50d5b310af7fe6076975389b6212b502bce0f0b59ef3f993deb2996b1f86eb87e110dbb0ceeeeabed07c943ac242b543ed0ce19e2ded60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058f81fecdffcf52e6884ce9305ffb6f4ec51c0a1184a82b53abc0c019f608da5ce7709462e0c3745cbd2dcbe24db4f12cc8ad1f71373b021de67fa1d03a06dd2e5072832045356ed8cc4ebab3279d3e436938078408c512764520b27e6e253e10e9d986aaedef8a0bb4ba607f03a7d80baf800ac72ae429bee5b894cb2f89780030cb7958b12b86f48d034f97f2b3c2c3444ffbba98c351276900caf25e494b9a802260b5b6f05a5652ed36bf25b4a91ac0f397fed2b6beeac0630251be8aa38de110b081def119c2ab4b610c0d5d8ac165eb042778b4aa6cc34d842c0674ac269ec17969961740f862e54bf367bfb3ed975b48176efe62d9843c1c1b7b351d99fd93d032dc3a83c8e278a642ad3dfc5ddab784b49ca123ff18b41e16748eec5cf64ebff02264474d4d398116f74292091192385e97b94fe37f296b5c7995a155202d4771d022f0a6fa4e6a93b5f3b8c3571bc91079c2950526cba59614ceaf976cffa486a06021d464dc4e800873e40d866d0174e5dbdeeeeb0197bb252babe790209516ee7d2030aa3ba82bfc265466a03b7096ddb0af5e6cbf56ad3aa0d4996ac316f24e60b691b2a926670aebb044f71c525016647a3e9c52c3cbd4a2f9decc956f043bdafb8332a585be990973fa5e48eb7482844a5fa0dad7e65cfde4d5da1b84b7d15817a7cd0e0419be2ca8ce710b78b2ab39c4b0e42fae8b5e53399158242771acd0ceee2c32c876ff7c561bedfd4ad4fdf70a6af466b8a788c1b0a4cfec57906ac7922e5d6f68bc04098d0fdab74f15a680828e778ae2aa693eed2e47505ac12f0b60fe21554153b4d68613a50f30ddcb15770f73ebe9e76b96f57f4771c95a32d73981cedc66069e42dd76615c2619b5fbf1ab27adad3ae4725292937d1f665cab3a4ea17322ef9d71f33f7149772b9e091cb107882a547844df4f616536e3ab9cd1dd654b6aaa37f5f979bd361a2360ac9cdf5e298dc0531264f2b0084e21414f6e9342ff4b5c7ccca99d9e1ba02b0b3a5cc435e2381ea0d1493f03b7c7d56d6aa9bb0a9709f76c07afc0257db33af87a62d9f79fc3c001be26b5600b5aaaeaa7966adee51bd1be80dc785b526ffbf672b03583edd443c8d938cdaa58913f46124885b6d0476b74cbe6fef7b05f1992c075d00dc5177c3ec2c887031f7e1a0934ea1c17f8f06696b33a88dfb6f6a5137561abcad108a6e5b966f63d5baf34254b922b2a19df5105fd16e3fa70dc40ed699808690a00311328752b5d78695fcbfbe5a4586bf1c9e3b2356e3b7cc0b011f95af8179ce95193c846b001d1183bfcf822df7822f2349d957ec4939a292ebd99e76d971aaf2266092f5c9f80338add6894934e9c3ab3ebccb6bfe5d3e523527907030c5407a84e94d1c5df17cf430bc84d2a5bbcd52c43aa382a1ff8d25854a3fc0b4c20b0328a517650b6c02ea90423147c5ea2dbde74c0710319d59ee5809da110c48d19c3267b39e0dc41a660f11a2416a3d35b075c0b88cf4852d8c4c330840e5083ecdfbe865ecdbc3903335e719855eb8e33a7d87be96a0ff0a120999fbd7d7330f1e3a4b66be350c81b17b295ab37255c1b42fceab37c86111447cb206f020c51789e397fd2710bdcfe184de9a65c5f85b48820a6a4c2fe2f3da6c92ed46c9ec8cc59eb1b1106ee7c75327b550dacc94c45ee1f2b91f02b8798fc4daa25383dfe7031cb68d30daaf80484e4d6de85c6b76aef069760d93fa39624a7f7bc71a258c094dd49da087c06d87786aa03b8253dfd3ec60f5515ed19d1ebbbd337d356bdca8b4ed695778417ef28af2a9b53673ad03ef7472daff5795708ef2328a6463c14a8c3848a7747e4c48b784628ab4c46d731f7061124ca736287d9b3e1ba4b3d87b060abb69ce5db3d3c2e4a4ba22e394e82fa4f873c4ac588efb3bfcf770b9b7d83b194de24cd113c15b3a0099eef691244dafb0669219b21b36213f0f666a0ddeb44d1fbf6c5e4f7a5ab7ec332ea5b30ae821f0d4a7853d791f8fbc736c30b27db6345d2ae13110b34f1b2f23cd94210de4ec1cbd52898231368659be1b4982c372a4c48a6e711746c1604c65eec66952aaaed689bcee7559d97257be0f9d2776fcba7585bd5c5b6bf2645b1e43e0ee7b03d127967c92c886de0713b242911ec73d8c7d3f67467e788e5dad9f4f7dfe7cacddcb710c03e69013bd62db53fd1661feea0c3297e9f0687712b420ae6039678f427bea233ed5e6b5411ede3f421a3f73d91766e22956de696281683bc71ddedd02d36eee481d113260ded2188f3ca093e5b6edfdb18c89ad59adda634649f5e2f3129838ffd0abf9b5d033375630750fa9eef98e0ace36f643f379dd2039bf0b605d1cda42159aafab13914affb1fed1e509531d35b035f4bf339cf4ad02ea8095bcc302e9cd5c25f20a178800", "526a656565", 1, -1049999694, "fbe32189afab409c7a6e38bae1b7766f8b0a8a82307bcdfeb8e51c70d7bd38c2"], + ["34e1326b03accbada377fe3d7eca010bf04c261daa6d67fa154abbd649af3808077f7ea82e02000000056553515252ffffffff93e15dd7444ba7005e8fa1808c1198b94e0bc1ce2000b55ad8a012c2c6d6ec4203000000086351ac51515251008a0f6c2fa4d4c75e1ffe1be4e1b20f533dc59e40b2033d185f5e5e0c2dced30a84c80b9101000000075352ac65ac51526ddc2eda0311033300000000000853656a00535351533562e2050000000005650053ac6adbdacc0100000000035100ac00000000020000000000000000255d930000000000560229d0d1759a0c40a73948788dba499842f1e10eb4db30f1316315384de95d83c43c93a2ac34d8c630e0f905534c6132987af98889b149fd694e840699aa1203f3da0c2302ceec66423cca22e1848506ff8e0d9f2151f2e4dbc41af31108e400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b2535ba7b3bdb4c0261a4221ecd5f520a319ba1a29d0915bcebceaac2e8468de7316b941456126d54aa8f1000bcc216f381aed7380fa855c468622209ffcc7ec8bfdb38ff2f2d6117abb2bb4eda41c5f3c1ae37208468ada43b13a202e1ea207cb9856daccf0e8ef26f50b780713326643500dd2228bba87f084bd2d910a083c032cc37a37af044044ed997005ab23e7785e6fedf42654a94d65ae701d701bbb34020039b0cbba661061b53c6384cf2521b962e343e2fa433b6f5563e299462a740e0a05a0ccd9e178f9350bd5c3d47aca56c8a5f5c2105e538323fe9e88ac2c0cb023d4847483d683e51a0f6d1d89bb9ec50d720efbb840e893225804c3d10fda92ab030c5e9f4ced7fd325257e5cac311723b92e83870207dbbcc037460093c898233a0318569f15de627944eeb991afe091900318027527129e3a56e7e0694ac9f0e54302076d96681805f623ccf47ba8618852fbac08a603943857fae1dfb2154eb990260214f704b5d41da9523760339a9686a04d6a8137651bbb69e42d41a635f48f6f61032087069162991d436ab7a8064b130698ae2bbb244fd6d0b8bca5cef8d78f019a9aa0db1c4726a32328b8b60d73df2946ec8058f4f56f7ba3ae29983c73373e7b5837c6a147b3dc4d1017d8de46822d2fd865413cd33240cd23da72c4b7e4ab1bc25cf159916d50a257770027e271642cf909095bd7fcf591e47b784ce828fce6effa55ed3b8ab73202e1df533aa96ed1337bf0835e57eceecc5d9bafc1a0238a20cf87260ccc35a580974112ef88139467b64ac3399a8ad29a4d3b35df7c5a2cee686f21741f19118a6e8ae7d74ebee4c09bb4866a7a469c564b9523f295f8dbdb1bf8d5e08debc13e638ef7c43ab3a80ab1fb4842ffbdd93c33cd26de94bc827709675d69f86e3684e89740c346fe2ac241703159f72bfb7c942c33c4df20f643afb16209a9f0484c8006a9cfaa887dbc9d9f4603f28ddf23df7441224e84697bd035249d1fd65749380c1dc294e7605c80f0c454bed6eea7fae0ddd234eb78ef53fcff37f43c18a1e26d9fae511abf5bf419837b707d5b06f7cde89195975a8ca96f384e7c8e385c99dbfc43023eeaa6ed796fc58c3da4ef0f6b53a0497a41e4aaedd648504fe64107ebf6b5653030f77f72d1787f61e54532f287d387b307ce2684f74663df858555399da0a629cdbcd5cccdea7528a57433fd2b19798553e5c8d9a2f3ad782c9b08bf585f104903b646432f4af54d938b33d685143b2c3ef05117a5617cfe78786cab7a68c237cae436b1e2739afd9819ee2be80361b86fc6d5c09d3d8e49b347531348c4fc4463ec5c4c31fc2ba408414279596cec0e101d19adaf896e97ffc0465749f6c2de331f7b2a4fd47fdc59e55a49f72536cceb868d4825f6320a4a466f663cc86e0cf849d031019d0450a630caad3e67d20f04ebb873a4e5231e35fbe356baff4c7b482c0656dc985dcf4a7d6212d7a6534a5807e88ebc6a3b56e476d54b5a24e0dd7ee34c983306b3b008a94e83c28fa8f32191bd2b49d1c651b6509c57c5fe7d36fc0336b99ad88079e749ca948d53e8821c2404620f55933ba1a76cc35051350dcc03c1a4ebb257367fe810e7db6c6514af210b57884ba81b868294cae4ef8d73a1504a940b3097fd8735479b92ad34fc7bb14cd700618a1771709a484edcf21444c3c0cc06d59b90c9d3a36302acfbc0ddcd1b06f5a7ba6106cf8f641ef4be40ef38a24c0ecf3f4548a080fe6e6aae293d8f81fed2bda3cfa58f17c7a8ca3abedb520197aa5dad506144cd8f4825fc82d79c29c608c523afa8e787a8af259584910a672c22fabd94d79721e36e41de8214190ea9cb1300be30d1c541d6a214d454ec1ac18d32482c5e88c461c95e51f2d8d222f682754945fa2fbc7e3e58cefcb6077e7ecda926cadb8b3c04cec9f467d7a431e399b149f5fbc58fd52bb2d64454af507734b461289c9e3253c56871c5fd9aeadb836a1a63780d1c337887c58d903cfca6da490f4a96cbe642559dc6d4a62f58297add023e5765a586a8f3a14b739b20f5e934286bca4e7b320790b3f5ec24f5f023b30d8aa029a46960444d4f0d0fa45cfcd326163d2a6cc982bdff08dbf7a64ded0daf93b944f801730b7ec025b1bdd031dc7c193e27507eab4574e0b1693210777bdc899f52e8c01bde5df3d9cd9594b116995620e3ec3fac96f12b5cdb7ad5b5c3a827345213fbe0e34ceb58136c123b7aa737d4c7d5c3a8c5c1b225b5d0f80093d3b4b4287aa8e962340568602b0000000000000000673b5804000000009d4eeb5e9369242403fed07cd759f220edbb56a6334e0d0f6866a9776e16bd0998224f72cf3f3c2ad4a616762026351109c95755f3ba7f61cee40342b7cd47270bc4cb47393f0f8b5bac419b6cc876a63fa892ce1583dccb2935b14f5310f4600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091fca6196f345430f116743bbd3e23e13152b1dee56354cf71ebb2e155d2321f00a14474d50813334a52ec924fd5f4f19245a24d48b8ef0a00334332c445c6c4c29333f29e26a17adeb1dae3dd5c006115f2f0d72683dd1ff4aa30f7c4145bd99734781f2a46165c771fa165bc9cb5deb2fc5ba55efa4b6ffd973425e8c5dc1d030e626f528186ddb886b231d527d5c91c682e9a45828fe72075be913f90d4e5d6020c3a6819f7444d75bf66ed7a14db211614dfee8e7eb1696bb33dec36c5d2e5b20a0377dcf74880f0a3c223613c4645b9c00c685b5f321fc4279065f565f9400791db5b1f79ae9b21c2440f03f4e8c11efa4353638b48f69d375bb40ce19febca35022f4b9acf8d802d8a8763bae83372ed42024da10e03ce85a6186cbc7058bc1641031083b92f59b1fe9b3e91d68ae8dcf8bcc08fd74f525ae64b79d0ba97c8d75ff10206626a2b31e8b4572f0cfcc8f847c31455082d5596e149d3a089999ef0504395021fbd336669d67023989a8c222c166eec12f32d80363948350d9d2c9a5d3cf106031aae6c576921c672da493d2f0c898f1492bd4403010d253de741249b4e325518fc13345cf680c2042e5c9fa82cad764e422b41bf2568859dd46ce7f3d0723c1f83aa683cabf22c92e7a5102dad7d8c4018468e41cfb3e7ca324ebc6fae43e82b33482af0917725c408d7b146088de114d88d348604058f78f6bf0a393810a6450f9c61f194fe8791643b199ef7ceb6d22527e7b6faaa6737af06e76d70569fc6efce5f4ab42ef52ca20f2e65922407a20b5a9a5a270da8e31f7a3a1c6416246a2e263cc217a9f0c54db5cf3e2ed14223919daf4de5b681ce7602bb6ef4c29e244ae10f9803d4093d8ad71d18b1cd20ad19f8bc98a0af4ff3ea20987969621781f94560c475a1ee93cedb47afe0ea1a45c0bca439d4dee052b8db250bc5cff6e2fbe839000c6d68578cfd265cc593256f2aafb189332b6bee162abeadc8cc59d2d71968d507d32a514842cdd4db2b53a5ad1c062cc1a43f9d8ed780f2b3c03ed0e466e3d55fc8523e7284108d4aa9aaf1e49c6ebfddb5e64854d74a4910b905262437764dd11c57d4070ae6eb5da5bff9b70a4a5fa5c4f341c8749cf7652968a0b3e6922b94652da6eb81642b8db18f50072594d3c3cff571d9366b431e4818817b2b520b39ff10b17f9fcf8cecb0978f651fcc42e499b701ec01dfbba8cf236e1002fd550594bc0b92b021e0825c62bf2ca0226ee3d8ed5acad63f7e313ef388b119ac9f746113dfe2f1e9187ec79eb94dc552f5ff672f2e36db337312b7e37795dddd8d825935596ec1c8d63e5a83316ca3b0750d9fd29a527e32b3a4403897b62e3202b55a37e134bd9a3ddf051928f40e91bc3c9194a2cb026061a9843beeef4f0a90e48c7249a16f325969ac6f27209bfbcd63966f2285e7d2c0bde166da676a5d5290449bd6e384c0868cc17e096679f27f7d1de6e1be3465e65fe0d14f0d8024edced3e7a170d44bcb4a61b8c173311683ba09cbe38ecacfc293cac8f21439e42c7df0cdbd6c599ec503183f92dcd74fa1d76dff5feb2ef5efc256c0ae01b36723944dff5710ed4796b784e4dd9411878ea9e5167e93dc22dd041c78cfd89cdc3f5e241a55fed768001a19e7b1cbced058f6cf8dea026aa3f22ad278e371eca0ad6e749fc57e9480eaf9a5eb17388f7e0feeed4489afbb32ffebd9669d8761a56b506e0dc53d035531af279c0d2e9196d886115daec9de2039ef54252a580143b1ffc99664a6a1f260607045518bdec8eb3efdf09ec24e4cd6b50d3811191c1741f8bf610f95af04d44522cab20f7ace9af03d8f6ba6ea324232e426580b42b0c676d83c9cdcde42e99e0904d6ba9fe4d91b6dc521f89857714cd5182919b1e024d1113cf68ca76bfb8ccbde97953b07bb513b0f02f91d820fe4306c69c5e33d4009575e538d5e3e4955d17a18a1e937e34968f6c6881dbc91fd3cb8bf31d8e67a97730e5209405c936aecda067b8c7e911bd544a29eda432da26433e7c065fa6581e2453b6278968dc8478a06d74550e08f17810d6f82d98457a27be62723a291951754215174d92723a8521b29807eeaeb577485808290f09125b3f5d130113bf1e52a6ff4a121823a3faa4e7718fa010e602b61e6877fcb5ba36ae63fc056b406bb612402b48f19af7f595acdc67f2d6388d4316b6dafc0004961d2a6afe75dd6097e3595783abe848ca13bca533b8c1d42cf770d5305e9e0e099466c27ceb8b9ed97dbd14130344431fba8b7b341405cc8aa402a6eff527fbe5dd76589993255561ebd2cdc14a403a02cc34a3f1984372def4f853b5ae615e150deab3365d60bbd451facea243ae9c84db7ec1492b8f5eef4465806966c958e7583f8ce6564528f392ba05cb8a6e880df47ab01", "656551", 0, 1506543656, "7cb56da6ab29eb828f4a1cdfe94e7e31af7252007032571b1228200aa3ed21d6"], + ["861668390319f92567b199dd6ab52c0316b9fec159802d0d4be0bd6132620973a613e155bd0100000004ac6a6552ffffffff557d453cbb2a5a2bfcb056c091c320f482a51f28e2e77c41a388f74c186e5642020000000453515363412254f0f82c5a07decc3a2761b5c05e857a12025afaca678a7ead667c484cfb81c8d2f502000000046a005252ffffffff018afb3c050000000002ac52468f946a03cd1c920400000000000000000000000055cd305fb39d577f64f1e8a40bed19389a025f1035f83f8d6cd71a26f5a2a5b24d7de62d379037e7a8a6aa4895f89523bff646ad75e42a6b29c0b7edaf9ad1b201c4915da944cb4de875da70c882c510583947fb16d7e1010d2ad0595c22ac0b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029de04b4e93913806dfec959f5e9d9127ce5cb540d294cd9a96258124377a6e371811220dc4d12897018c22748c510b74ce2c7c09c3d92c2b5e49ba79f28305c34d9f04f394aa8938afe3b4f6dd0f7f1d214effd36e7429a56b3cc1c3a54b4e386101fd635b46e39fdab7462cc592cc9c9f2044555d39be916f3577427d26c6d0314dbfb394e09cd2480b153069a36268eb3f28d66185ceb460fd0a2eb74bcbf59021a1325cb23dbb6d40af54bcccfec89da97fda055fda0bb7a58da54ad9124117c0a083ceb6f247ca3b537c7deec278252bce39422639ee2d32c7dfaf84b45e4391ec27256d25f8c542de9332652219a8a21696ddbc375377fb17a85e0c0aebcf6cf020e483bdf117a599623b982eb09740da5b1779b8e4effd4dae021aad4bfc853e70321333d1b008eeaf61febc6cc938f490c2eaac4cecc069663e9754ac3d06447dc022a3481df391c5ebb921f1227099b40a78ca1a39b13ed58f5b9d5bfdcaa7569e302064033b2d0108b983b6741060af92ba38064a26e514712295d729feb5bbf4556020195863fbbd6b4a5ee0d2c355b1baf767e13f4e5f738ff1565430706af3e99fb0abe96eda38775023dbddb226217bd3c503d78a33408266b99f8c8dd1323d839193f88f6a3b4fd6ea499a894d08091b6384db56cc71e1cb16c9cec8362b9e87157d954bf56f9eb22e5aa7734b522fa34c907e2ee5e804756a2215a9c20c40fad06ebb5f2a7e181d78686577c26bba290b27eb8761b8c86784ff82744353dc7eec9db2a2fe0aefa36679295043005b3fd5eaeebb40e0ce6ae6e26c03a28f92ca5bab4e1bfae93396f36e4dcbdf1624d2f67ee32b020c8e3b6ad284f0394138b9ac9f36f49a3013c7075bfbf0c73064c6622a842e6c64c9564806b32ae8ea3855017f031e890822cd16c2cd4b5e99c53f678cb43179fa678a6f0daa6201c696464fd2735158d024eefe5cba7d57da259ec103ee071a5d34c18c65edc305df8f3579181b66348db9064c316ebd4cb4ac72c9d4edf21f4f5b3cb37e346e39556ab59c86831246fcc469ef21e43d6d7375bdd172623abe645b1211c44c059369aca1ba7bec08690576ab848c98486c30e4cab9587d87797007b83ecffc1d75438bb504b895589b7a12358c34043a8828ccf40c2d2955af759966c7b4da625524c96b0d6ae666bea5d8ea9b9706b88301f7993e92bc7a5fe419516fd7ac2d44f250f4702413c925471d8031a5f9a396dc1de49c8145bc075092e72cf927e094f348289d5a98a97358c6c9dcb45297dc6efa5cac511ac869cfbb284039ca2303bc03e11ff1fdbb6f4406d562356ebdb0daf0a161052fc3c31313058beba32447a5199c6fb7c65acb8d83133d9667cb3c2fa8f7b642a06f53328cd24f46ae83bb838afdaaf9d554ec4ea76091d479e8025bb205866e3a725f84fac2d849b265b7097f51113448ec8ed98831f6f8fe01e1e3b2dca709ba29459eb8548f14630ce74f7147b57ea7d5a50e9aa2db72bd5f79269ce6ae7643ed185b52895dc255a842fb7b15c069ef54043cd1f03e38150804fdc7fa122302808baf226c02dbb44bb4b5863601d3d856c7fc65acf335ef51aa397e761dbce96cb0d8e7fb4450ae494d62bbda81a47e6166f67b83df32e0aec205042e2afcce37a95609a955ef053a4edc921f13c3d71c68cea4f465ec249ff21113c07472154ef32dc71c01f15172f98b4357284d718645257b21d16c16b597a1d54a0b2d1f7cb2f2bdbca39d952476e9f442d50a7403aa9f009dccc849ebc6a32819d2bcb9f20b3066dfacee31859003b23db89c3e56687fad23aec9128008a22bc424d01347e01a0d68b2c764a9f15778a8c0dc9d41b748bd21fb05cec773fc680e883756a7476a46d043a01e17edb2cfb186ee7514a4e8a1ffa3f0019e7934772b330daae639a94829428726c5594a0e710d1e23e3e5c97b993ab536b80fec7d6fd1e6787f557f84ef4417dd46aacbd4f8a47712d8caf180d1b172502605d34fef64f4fe652a1c53c33827e127127deeab5d6950cbd0b4599d23f2e3fc79c0a3d0fbcce11496b54249750bcbe610c15aa6636398a0c6ee2cb9f79947b506f066b6b91a33227d18c18838f9b880d55638bf67e1ebe2c1f1e5cff8fba8cfa886ff02c10437ad1c5d353cbacf2c44334d62245ac32857e40a0dd44267877e0bc822a755026615e212115af384d179d4156c65fad7c96f2576db5aaf5a0d7e03071a43892dface85379bf3983b547556faac4fe962464d0b6ec6fd5168ae132adaf8c381cd5e8cd0001000000000000000000000000a208866d63e8b551bb3404917072f077cb73cd6538d0bb42053ba24e81e1037d5953df6857e9855348ac0e93f4e8556aa3c74a687ce2049e647125848683d567327663557ad05affd5bbeff169d6cb470f12d7da8fe6f02ca91b3606bd3dc672000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003766767978ff8b58a087c81e29c5dce5ebf74f364112c79fb3ad6e6ba2f4d51f82f6ad9313880464e262e1d0647753a44be6dcf5347ff9e9a346092267e68ed0a9fb9345cfd5ea8197c2770564fefe10ae3edb748626950206fbebe0eabf7b66ffd09c797fbef92fbcf30b5fff709251f174b2f8640e2c33a945c51f264424e40219f71a2eda2de453ca1345a28dec97369bffe1957b8d4bc00fa00bd7651e6f940318ba32832ff01f98cd922fe21227d2b1a4a2350920139048accafa3365cc9f4a0b0324545dc44a93d3c9675cb4617676156d415f20aebabb6716eb98531eff5b6be2b1802049aa7de7b753ce18b031409519252de6a299c513a4ae87bcdf9568a0032b43824e8d5e25fca9f73d23b55b79979a7f7326fed7db01ef3b580982b3bb49030852824da64f0e38c955ab530d7b3c33ce2a2b1aefda883f9ef3584e82e6306c03107f070c922fb6e277f66690479ef9e28ebe9b38c1831d4e81647f6d4c0898840302ba148d7db50609950bcdea1fc15fa75c783d64569b542feaee97f18f61316102071a1f7763145f1d685122f3b536eee97dc815230428abcb73d18660425c51e459a2659223fa3e3ad5520460b9ce7971b7f03c3a3640263f3460b3cb63654fd6ad06f73e3185a4aec77e4c453e32e6e9ffe54a0daf1f11b1f027e0bdcd348d685d65be3ef729a227ca4c4b315158bc98927a423585f1c8906781ac616468cc8f538015cb7dc4e5d035da8ae5da26dd6a48a6b51292ec1b9d8ca683ee3135cbf7d549e26df29e9f0f8e395773db195f0e2c7ba1fb427bfd4995cc4fcec37fd06d966a2f3f4f5ac041cdfd97acbce1208a84539aba75b9d0f8cddd055bd4194b4b58d44b588ab72b7690d70d661e09d2318c3dae92775cd558b62fdac82859bf2461c758d1425210ca3fd53dfbe08418d35e2cfe0d41439386b7be55e813a06e1932ce81de757688a6c556ada57fb5bfdc2d24fe209a3bde2836ed4ff67a6dcaddddd0837b1ffcb85a5129d762f378f0fed721e15a748964a5544b1ad4f96be9c0a4af55d76eb103181e867328db1d949410d3d2f563bb8c67ae8098b3d3a88225e8bb0f4bc4f78bed163e93fbe78fe8dfb3a404588c0cd22fcc09735e1073e1774e1907d89384b067597116b832274d02daf8149c04b1e8619439c9ff3fd482adae73c3734e597338574186342918fc99c7f79ec4037d940cd871c589d44f08a00fe6de1975cac5c00be7e6764845d5a9369ac84c32e37d2c67e3559f5dde4c3a807d20fcf1c09d8fc6eebf8ecaae1bba52ff81ef7e3114dfacd5f94c67d77877cb39f5e0d72e8b23a1219cf911dc1767ed6fa62ab41befdd1b8f685f5f1d20e7f75ed4f61edcb39d048aa0214ff004484c08e373ef2d0e31387848ae27eff8f57b68143af3d3fe4103bc560a68aab421236adfee57fcb9d8c82a5677a7f2807f7779766320192cfde506f8cf9f04b6e1130bf6b7c4e8b0e6cf87148653ae06fa974fcac2dcdd9a1346ef8cf06f8c160698466265c295c647781b1d74448242535c3cbf075bf181175424fa20147c28ed7b9a9b4d69a1c55f9f186e0ae49db07ea498a3cb761a76b896b5c220194cde1438c96766213cb564974477326346f2221357c38345b42f85f8a2117ac7ffd1e8131f696f735a9b54820af8df3b4fd366d706e99356e7221219bf2c63b09fbe5a09281752a4095b04cbd034c12b23a5300318a4da7feddbb549c68f930424288eb674cd20d35673603862a3c57dc13477564783502f7ec405c50519c75984d1ec44a487b6726fa20b0c85463df38c90faf48526fbd2b9e65b41cd57142b6bbaca5623bfbf02078ac8beac34c032338352171f6c948316117db72dd15e750bcc1ad1c1d2572ce6b68c2df5e156f2372195c4810edf014542e6f254c4f43b239d795fd6c7e2fd78c53e4e6d2b5bd78f260047097055b1cfe1e77a3418ae82eea60a4370bfad17f54ea42da2304e0ea157acd14e43f75c10b70c522f83e367f8a37897c154511cec1fa608a3b1375fc9168d58dd563531645b03100465449d329b50f6001bcfdf0297bf0b066286672d531b7e824256723e4ff492f172a3bed05b11f902309b11ffbfd53670abe2dbed461e0ac6cdc21ce14557e76c46799e7b9f623abb4be7f48d06114afd97c25da350163b22d96c15ed1a292bc7ba544cea634bcd38fa85ade40ec4a7143036da1736d640023d93e521059319a0170470eae602b37123bdad19caf0fe01da88f8355a79b3e848fca07609ff4e15679b848960e94fdd26338e04000000000000000000000000ce7e5b6c5bdff0bbaffeb46211bb732a74e4ac7642e97d1470094934763fc32e09d3e097f530f1e03d4d4e18ae830646903b64947242e14d320f345a81ae8c69cc596f2a6a464af82ccf7545a9c5bf6907ae3005f8e23545179ba6039352b69f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c4aca2903e7010ed00820ab38663ffbe10ece403b5485cbe475fe16c74271eb3b11a9ca46a1a322cd23da7cf5de2a5b90dab76b34dfb40a6a8ac0908203113aa25b976a2d57c184e8b8797f4437a6f3b34aeb04551407fd6e9c800f8f6b3e1a7670307fd0e9b4ff88e1d6fd21277326b03670fc04cd677a7d63faaf1d87d145802259b95f6b194e1da5806dae5c881da3985f5984777e0bd87ccefb7753850725e021191bb308aff688ce26c3458f675f2542c0ad862b6fb851f200eeafd76be9a600a053aa7cf4456ea213d00d98598308267e2134dd5396d38b9943e0f0f27e5e988f50b3eef2f27d4cef5d85f29733ffd244b38f7316a4484f4c3e4725c967dc3d0030fdd20f889a4292a7f5c57f2eba619e7bd048812457ee97bdc4ae37c6680f536032555352aa72d3acfd3439ef81193effdbdbdf96320d2794a992fc2a1fc3c173e0208ad7a81ad5b88223068d9edb370baa684937134d16c95cada0588ef760cb671032b640a99ef0cfac47c845cd8f0da1ace5474cffc410d35421f19a9e686ffd295031089870fbb05322c2ec0015242f4b0211161c6061e017a77aa8cfc13d5bf7f9a64ac13b50db9813c926df1ca966c34bd09c645c9d7d492ca53863f32a10578473e982158bd4f1532927615a20997c5d004c9f4917cca6f695e6ee24f49e29ba4c5662c6cd05d36b406802e9aceb4713b508a49bb446c667b6677ee2b3bb799ee6daa4c15e84bbb09cf136c56fc2fba727eed6a76faa21cf59104742d2b0b896f7ebda517e0fc3f0978189f5466fce5edba07e7a5bc7f5d2215848fe7d40a5bf82285991ccf9246861fce38a803bc6a5c9b4092f26c9247eff67624759e4ee569f6e56334080cf4341ded83429c95e5d88bfcb6c594f31a907c9c02891ffa9bcd0ee303cd67158acd48f728fe621f13acc3a1e9fd80950ef05844de67b83b5d1a6caf23471fb84f2709829c47bcf4ca925b2a8587b57f14d6505cdae7836c09ed99728a33feabb150e6b9b5474c577d2384faee1c48a76a6508dfa08f850a07ad68fb091f573ba2c42140b02a293fead143042aea4ac24a19bbffe027d38559e79e1ee3a0e02c93c8e236d86574900b75460ffe9e727da92368c9af972ff9df387387f536a321136c8db3583957ef810862d03d85714114eb7919aa1c5e9fa7ba4a7f1178d488fc247828ab6c90bc79a9a0d95c4550a11eda34cd99121630660772d717b3d2a191956b9a09692d73b45c525a2b773d5a463ec1a4b91ad484bbec3f2b29d71e116b559eb87ca255f0566c81d23bcadf58d308a8ae8f9e4eebdea86858b18c0c217bd4e115e44f6d80a47f573b2b295f6352f7971fea25af234c2b8651d108f0be9dbb6febcc8eecb433a8b628de5d6f3a8c76a25574fef080f73d0ba07a6360b1863ecad5c53e73de54c132cbc659710630d05357d78c13bb4928cb96b9fddb8d3859acf5ee606511ce46e3f962d484c7acd0daba74475012441c837ff6f5f0d6b5627ec9ae7c20f47d00f867fab2022c9bd6716fd0aa08874f0efa4bfca2dd53a993eb463010b9629b3d7a3161175ca810d85127980c59d7051edacfc4acdf227b08667e5e66818678ce9c82d9950b2a938ad50b85ee128b02cea8d94083e5bebd6638d82352c02d88739c3d2d905d18052fa7f284c798d1bfe53a5cdb72fc8ad3b6603146521b9b8de1bd84741e8bca5db3edd578422adfc97c50110893a7ad0342a99f62386dec189e712dee2eff09f685a856d92a8f13dd5fd98f32b68bb2a2c72c9eb635dc0ed61e1b1bd35004df72b00b4710aeb9069cf77627e947541533683bf1a966fdf3d22f257865199d1c81480c846d5b1abbc65c00314ac77dc8f7e5d5d4d63f6fcc31347a9a5eae2ff73374647d4fc42b470a120f87bd60027149bc8151364dc0cd37ee7388cb13e7b0d4e3f59b12807085af8073b889b8b1613afdf47871cde618836683813040a5d89ca803e5d9f3a211cd820f8d0d33bbd5913884ee5e5d25cd1b3758af14fec9f365375a18a312cbcffdfc474e40bdc04613aa6c2de3c2c243cac3df03b06ff1a02821e043b8fee44121c88c4af1c2d7f5142bac5db225ce48285c85b04177c02f43eb54cd7707bd728ffc8563b4cfcfa7de29754b6ffccf85c8eb8da2f89e451cc81834eb2105704d3e3d8240570cf8bfd01ddee6ef6270c19c5aa7f55deba8f12b2a7860a5e678c10739e0a6241b5730f9176acf6d82fd0f7c90140fe561d54f82cb2f91b02bd3bbcfbb13cb75e5c001ac3e141f730353a46a795f15b1f1f02ed2ada9c52b5673ca0c5df0109a40ff6c7155555f85d55e602e844d8dda6dc167fc23dabd67c09a381f4f8a4c1e209cc1db5e3765797c732153b53821bfc56af377df3540576b737ff5f879f7b6cc8dd59424a73d3bb21849a5bca90b", "51", 1, 1706299201, "8fdddb9ed69c90fedfdfbcb77f29d584463a3940264dc81f16d8dd041f62c237"], + ["70463a050315edff41c45ca13cf25d9bc012b4105c31cb5b7c4cda0411a3f114550c1f5a5f02000000076a52655151ac52ffffffff7bd204ebf2b76fdf7c1d7ee3e835075031c3ba6829a4af5b3740dab0437c6f360000000004515253638f36c3cd66014d1dd4a5855f640862a97892ddc147a75ac473e02978f78b01e3556d41a50000000007515100ac51536affffffff02b5dd2a000000000000caa66a03000000000300656a000000000364e6e905000000000000000000000000c6a7be0ca91d1fbfef1f28fcf00bf946f860d5fa127735986318ad52c9a56364ec3486dbaa2e247a7cc6e3bd95eabb4878c14350494b8bb3bdf87686cb862958c34e32b2d1100e4927433daa45ad8b5e61ade49cf31dbf661ef23e1fcf0d238b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001259817be3420151bfa1ba3fdb351c1a58fda102852b37082666d716ae538f4088873fbd3304a3a734b36d252f9daf67172d1892cbccfcb5e554f0553c695988672cace782786941e43d0b94d1141c1d19744db8cc9dbfd41416978437804a69096f165325a3d777c1893698fd5599124c00baae47eb258b984899499586053503268e6ef919496dbc4c7df8aa7d7b19062720c91e6d35c34292bec74a3c44b5460207fba1ecd68d0daebc00891793ddbe1056403e0771d470345eb1fb5346bbe6130a080f09623b95f0a71f9196b19ca80852464cd4d9f49382bc11aa0c381f2551ac2f8500dcf0ff0932f899d5669e1e415997d4647befb87da77e93997fe668b24e0326d75f9f798884634bc899246f906b0524d4c5dab87f6d2654b18c1cc9660788030e04aa178a46ef12ab0782bfc8a0a9081e1f792e09eb7f7b6232d37fac790998031a8c249fbf3265c82285c33a02c0851bf6205905f1d47d4d22b04b334573149603045eb5895d0354dbcc8396245815ad19c2d89cab8146ac083fa46817126a1664020d29a20c1e4e16a117048eb51be4f6520535583e189272fbb762bd54136c82d3e25180af6a3ccf6f1532cb427f288a9eb2f911bc85725b1dd6897178537310f3e78e9847511789278517335161a841271b3aabc2c8e96aff5d0121a8398bb6be3b714af93159c82806be7c229bf294ccdc7f70e703a43d33c6e6958da37bfdb4242787932dfd7242a2e1f97d1c5a521c9c8f88eebca82a6ac6de48ac0ccf3857c90a4f486b76fd2217e045d25911de84d9b85b5c612b8b706dce105c8adde88022726357cd50910d5b4617e9907d0d188aa0340dc4f3c9c6b392ddd8527e17ffc865b1d0f524770fb2c5a63f9e72b5583480966207ec99e1decfe0fcb0d7686eb21f319166c7bf2b95a3c7531a1a2df85ea8db3ea8d510824f4f75c5ed9c328d75102ac8532ea7950e1a7270e4933a2dc3ec9edbc36481ba68c84bbefdcd624b37d76bd8b8b1268e4a67864782406dcfa790a1fb106d9b675ca83af87e23f9436ee562368c867fa902eb31efc921d34d97173f40d1cccaf488fed151e71bd3175cb1819996a1612486f3a102060f8d021db90bdef95aa0855ef6e60bfc58bc52b052356935b058133461b43fa888eeae8e833acc2b33000ff363f4ce2a9fc570a98594148970bb2a4fe1cc39272a295ce3e76014f479321237f9bf3c04235b1e648b6bddc2dd33a6d6b046d179c2abdf7f66512d1d0926f8a15c112863635f63832a62575c184a1a0243ea04eac73d03cd1ff7b38502919a6d6a33a72f7183ebbaaded0b5bd322f120443e0bfec9ec58fb5538e9dbd27b1f6e3e36d59e61211ef0b1bfe57d0c8673a8633735e3c21f052c2fe352473520c3b147236527c7f8294fed4416408bf715f1e2de343ebbdba5cc7e4b33fb13043413542bcb996ebe3a30d3b5edb66cd3b74567b8665823fcc30a3c71a9ce0e136cff34a8288410e4a3e822843513fbe1e49992fb7079535b5b2f90808c38097f11c8597290c2dc346d55fab1e99a2b5313fa060e3469bb57b82cd9f7e28038f5adf0ac903ca5afaa128ba25254c041d540666fca7acea47c974b64eb39ae753fed8fd5ef7b65ee75bea525c46c9b51ec0919cd156060dadd17f6ea55d4b27bcf4fffacf83bf4458860b2ec1ee0d552e8a3bf12564f57204be74feb38abd1de8a32244b0a412b36c1de3bf8dd0293f983b54527efabf874697f48e6ed4101ad72b4df92d28963deec7d84a47b45f243714bb412ae0b1dd3ac1eb48cc39cff020a4ee6e8265ab143cae766c1a36049020eb514236612245fffd1f608643bec31cd94b5ee5bbee1d5d3d8d6c191288cb9f97911218d79cfe773c9aeadae63a302e776ab2f201fe1ef93731fa14689db1ea1f8155b36ebe90695e4129f4b52c1b0f9bd8c45ec5b6483246a26a5f1a789e78e2e557af3406f5dcd8ad94e76327d25d522b87c2ae21c266c1fb476a2564b79f74113bcf9874a54b0a612886bbfc7234c35a87a0f2a8d2063423fcf75c1823a843d9c5369b3a2d7c4852abb91957f1428fa7da3588ab377d703cd7a56467ff61cf8b934c2a719790e02808ec2c6621f3e583a37b56edf6529c0ea687903d4ba9749001acff481cb205c7ddfdc69a256f8825c570d7946b7525cd71a8fda7892b55f89a8047eb32ab5763e104415781089c38471e4f79ff3b57e41e9d622737c60773a83497a3bae0a80a4f630c02004d425ee6cc2185d1ac89892ba9ae68bfe29dafe2693ea037b77c86a4200000000000000005b7640000000000083267a9b3d5152d8a04fe05f236673d3576860525c1a86829d2f76a0603e683d7561d7ac3c823ca3c3df715859186f89be9abe32708c47e39f4a25fabf83758b27216585c2585fc51c5006e503dfc7f0cbc527ff738c206dfae563d6b71013b700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff6b675d4bf8811bd5f6e42c93293a4987ccdde9b55be5c37341f5a6a7db010325797c7988a2bd7d545e408e7fa563b349dc95a86f27e085c6a0a2e668b4030aefdb4671676c842e6a668e6ee35674de9906eac84da35623fef2672c3659d9745e946c97a8d27698706cae6b040b6fb6ae454b7c74e28c8540d59a7b7fb467ed0323d8be838e285cd55cc64233230db24ba85d771fb9089192744c6bb5302678df0223e4baa1fcc4f1a2ab7a60a092bff9af5fab707b23a9ce5e21addbe46db22e1a0b0077576426e0c246e87f28408556c2edfac8ee47e5ff980a49f1735fde747910c1ddb4894f2399844de3420600e6217e4dffa65857321b6de58db071260b05c8032e557312c90e4e120205d431f100bb5b4189316dd99c8f9e53d568a1b0d0eb1103125726d86e95e576f54f6ea80aaae5255a50dfdd1f59d6de56e8645d13f48b85020e956a4144fbf56e707bdeed6f08d83712d830d41f2522b5142da91b66afe4b4021aa273ae7e33b89ee7aecc202b0bb4b4c2aac255c8ee0c525d6042c5d30db6e6031e80dcf8938c894ee16ded7db35af62261f24e359b0cce91aa64a9ce60fef3c59671a02755f07b3125f10d2c9d81ae363619ac4cf50fa6e6c0b32a040ee5c116385a9b999c11b4332bf155f6efefe77f54f524632e2487bcd8f81d1521bae616a19ab8c37f98d6a3415fe7ef2965ba899f41bc834fca9be1a7b4cc4e3349510bff7d40a474117cb09dcc98c2f220862c30d149df31d5961f275babaf11ac6d71e28b65e51969dde7c8a61d88a9090a737a24e3e73f7a1b96da29a3a0dc341cd0dc992985264b86f21df05b4d2fb8ffad405e7b8531e97a398b5fc82720dd9fbdbbcb720c25cace47e664e7ccd60e9853ec24e5a21485408590c1d16f6989e1d34e8a2022f399f17d1c5deed69698e04d7e3182840c18a63fd262f6fcca6828943c4de2e4b55a3f745ededa348116bfc6ee8603d37ea2e5a40014ab62dd57ac37aad592020254b281961a5baa7f41a787e7a9e13626e8053ffbf4dc6f7da7e89503addd5713ae2ec7217c0508ff931d1b1a31fdd452c7e4f306ef394559e1b4a6d103d526e465a4ae219b79ff3fdd074048c314b27a7ad01e450f51210b883a649b1d23e2601d3d076075433d5910f6fe661c46cb16e9a035676cff04a381151044a53ecf21a6270a531690fcdfa3e582f88fd4764537bac3fa76c547d242363ddfcd5a69d9e061c8a51777b16b08dfeaac5309568f8196274c4cc8e3a1992c3368cbd2d0045391462064ae3c08f549e2c4f1d6393b932f49a03ba5a54d18425be124fa4d86603dd7306888f04ff7e6e4ac055c4e5035fd6b97596dd696e74d5e19d88f7f0506bc05034e3413ff0abdaed652a507dc3e6968cb843522a62e05c1cb1bcb5dd23f22d13c2af9718c500eb6780b754a3d129b84399a72a2cce6396e4bb402372045cea25abba4307632579836270ae9f5da02de1c19694a12483e801a442a3e297c340658ccdaa29c94da97f6a07562bd46b536a27a8944039fab9cfbbed704e249f23aae33b3a97acc82ce638d90225607c53fe89620cde5ec8c5dc5cd7fa9a152d8b62160b777f30edf29eadc68587e22852222b393a15fcac596f2c9629f6f6e1304ec23f8640340d6a10bf420a1afcd5f31ebfa7d4d191e8ace3da880bdc7de385c8d696ace4ecac8ce494ce517b3552a144670c3fdc87529ab093a543174d44aefb96b81ff930d728db70b00c05d56082728ce5d19b7be464669cd7d921c88dbe6f456e8024163c25133cab2f591009e64660b33ae234e38a7a35c13d9f1472649341b1fdb1c7772aedda511964b56309215e7df5b0e6d331901dbdd15e1b167920d1b9cc9d09a4e6898864fd0246ebdce5177076d47c442b00e2bd1093daa1053e7983a92af6fc2f41166c29ee25463603e53454d9d4ef4ae463eefe332feb5bb81d2262ce997cb2e4eb4a43968ab4b647eb343810ea9ccda78e3d9637aaaec69f6121c0a7109976de0032732f9b735b5c57d20834f04d0d5abb4f63dba2e5573b2e5ce4394c68f9f36c720765c59267bac871f75b782b178ca6012d5bd915126618cbfbdc9b4b6a6d2c90995b3e1c85e3abb2f6d174e5579de5fcb69b93d735a25dc3798c054a9f4857ca6e8c2c9893151ae43a0ffedb7e4fa6ac30061bc42f79a426f66261d54254ebec146b8c9f44afe54b9e6c3bfbeb46eabc744246d33d9bd4cb6224d993c0029e0af48b8a18497351fc76db2cc2608ca506282b6549a1a7fdbbcfd468400d57d20afe1f2050000000000000000000000000e49eb84ac846b6c20a1c4220599f77f01dcaab45ab6fc9ea5ee2a50b25c1e4513b3ce36f219acf3d8bd3b662fd2aeb246aeaa0381cf96d48c6c80ba87c44b569c888ae19aa6776727ff6a2d47aec40d66a435f1545bf0674460eb53ad32de2e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064553a7120b0dd8e11a98048ab394bc19b6b5d67d7dbfc133e10377e21918929e28a02cf97976e5fd360b23a630b8dd6429b49cfc18e3f14b5ce2f98513a96498975bff54202f6ecd1db2eece162b0419788c16d12ed9a1378da83e4d05ca9ba22c474c6a00b15b8019e1939c27b06769d08d7f8dbbb936456d5522d4b4ebb1a02219971c685d101a8b8f38a873fd865accc4468e9d6938d3505d9ba0ffb81e08d022ebbbc09f13845ac8c93ad60bc355f0dc38fcfc819ca373d24ccae9fdfe912610a060760358ff65bceb95a658074026791eff142fc0e29ef823faa13c361c585bcd0a979ed538338ea6f62c4c9140f39b12278df443bd1ab914da6e07265fa0b6603245a784cd3a0e01daecf21a611beff7b7626e1d1a78958b1a4d2e88b06519188020353b0a7f60d580ee9fa4e5ecfdbe465ab30f37dcd05ca773bd85544fdea1fcf0329b455d3bfa5eb4f0ae8bb305e7477d28554e2e0a7e9a720ddae03979611a948020b834f68bef5b4a4248856137d1da2f2edeeda8fed0a630e17bf5b87fc7880c30202ea1b40f06f28daf003b79e8dfb4f8a8b05a941e4d0b998dbea6f048dbff73a9417e17c31962f57ccd159ea4b23345c310f9241e5385abb11d905e0c68c2df78c0cc8d174f2d1b4a078b9820a14ee8da4e49181c90225670682a9ed3dfae28c490bd5a30f2949ae66072dd0cacac9d52367da0808301681f99a1ef9e593b3bb4e3ea3bf8cb06ceacff3729125f63e32321bfd720b5282b51f9f123db946683e63ab5d3c410ddc32f9673b4e61637a10c2a2ecedf97f9c2d36fbe4cc4ffd453bc81f6b32db9cc78d48a45dde329c2a7517d3340ed46ace76149919215677b0990ad15840db32a777443f784e422e8e3a732e093a77694d63a06250e1ab76cafaee86a7cd5da3f6561985799a1272742e9f848d3eb5ef4ced6729b18f2eadfca85a312aca466e542e9aeb597f626db79af0bd596c7fd2f1ef3ca54b2e8c86cdfe03fb075e0bbc6c87c72d8c10e86694e3ffc9ab6a21528510e651f89e763ce3d3dc706dd11111c9f65c8012478c823fda13efd653fc644ed3383a1080844c10746aacb6470bcd1a8b4733e674e1ab221e60c33e7fcf080f796c6a40e045334dd7c71a0359b8eafb7e8fbdea1efcf6b8c6f876b4a382ed500589399ae3cf4d71c71307cf842adec0dcd2c88f9fa68f944f10462a2944e52f68feaa2fc6c5338604132ecf590a6db7eaf99bed11d5ccb5610f55153fd87db279edc0a21d4a192e7ea00ec4ae721b1b52491a313617c4d9ce3a7d7620c45f309049e4f5a0c12fa3025f1c3266acbf998db8b45582b32bd1c5db5b7c0f0fe34768ef3b4daf694e26b3b747a460b386d438d1b7aa3d48354c9a2e29f7127842a96729cf8785ddfd2c57186e6cfc8ee36ac16b343e1912781c1a24f16f6dfd1e30ef3b5d57dc74a2741e0c7732ad4ee5e70fb6c559e5dc52ddd94eadee51033e9d9bde7e0fc33dafb3c2803d00f386a219f31e34d58db18708bc81d0d325de4d429d1fa5a60eeda379681cafcde993fe83b1f3fca6856917cda696e774e880b6579427cd009405d058e9ae9d3af2a62720abdbd1adcf56ebafba524500bb9801d80da721a4a60dcc2bd1170d15d97ed307196fb806359f5b9b4dfcee4c5d12bbe5c7c3f26fe5d36fb32b5ab478f4f2ba398e6afedab85eaf30622f3f734d10f2370bd18a44631c2fa7733729977b9de69dc34b4998bda8b22bf6585c9ba28b88d8de654dc86e37821b640bcdf0cebbf4d3980f12c5673c54a984b538d89a049dd383fec4ad84fb98c4bf6d6680c35ad8f2e1ed46fccb43c636216ab940eb52b101b99d563af8e4ea4d011c7f9567de18f02787926bde6731f3d2b7695930ab0cbeb8653953dde910232efccdf1106b5d462c1748dc742ef9615fd60a98c49d7eecdf2cb76511d15295c20c03f6d6024acce6a0c490d2d5a90f29f666a4f769ac6ebea6e94530fab9fd4f2e844fe5ebfafde6b787ee631bfb0db782ed92d4de23587dd858a2039edea84b27f0195b5db457ba82bc6ba9b9e26776a42cfca713e5d2d6b8fe4eb00d49692ed164e802199a33422af1d6034c22e19ce2fbebc14ee1fed63bc83b22856eb9000837a65dda1cd0e547d0f1b45873ea9fddcd3959f24cd74fca33cb226f1caa707cdc36f170afb81a11e8839d4ed96a3b0a317624654ea676a8dcde75090ac53329f4d4bdb1c7eeefdf989076d03c082be2681cf787cf0640479d0e05d543c7eb43b3576bbd6b62a48af5be2ef37562bb438c22f8b10deb6eec93a79b0e829b2d08a31c7c3cc65ccf4a8254a1d74ed4a6b7a70e15e69b3c257116398d5cb40fd91abde1e06e9aa72d0c2de6fbdcaa5b4235dc9f51e8981ffcf70527edfa1126aeafa2b55006fdf914f3666ca69e09abd69401", "6a51", 0, 480032185, "4b528962c37518f4160790f00804334d128cc27b27e95a7cc4ecaf32e13af28d"], + ["0cc7887e01c86ddf19592c5d560cc5c7f2720d2f4b8d4c7394cd16df20ef85ffc6725ab7430300000009005265ac6a5363ac51ffffffff01c6227c050000000000d13659d800", "", 0, 1734439937, "be397021706832188eb49e62fc1e141c552f5b806f1d75cbecc221897319c0c1"], + ["3cb12158047822d88b8f7aa9d311d2cfcef2fb67a5d853e3f9029b037e7a6abc794b0d107a020000000700ac636a655200617be533365e290a46b30e97a6b945d3881562f4728938de1fd930be1763a1caa954a48e00000000096aacac005152005352ffffffff5ecaef2545ccbf640ef7df24c9003928e356ca7c12c4a217fbdbbcebca82c05e0200000007535365516a5153c0fdb39cbed3e41c622063fb1f52feaf5960716cd573eab2e72a9511d2e432b480416f730100000003ac63acc682f76b02c24dc6040000000005ac6363656a42adc0000000000009520000acac5363ac005771da88028d2075020000000000000000000000005c39d7c79cf50046cba343859de3ebe6946aeca93cbc8634592c36a1321e98f4111549e992991c6cecdcbc7836fbc04be3e4f009e8a5806bf0349efb740bb5a2627f98d05e57d6461c6131ac7100c6dd5f963c2e2001209dca2e0bd6327f1b2600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000525ad7c1ba9be1af65da2dcae118bab5434f3d04605bf54ae69893151435626ec700f2437a39b1220e8cc73e85a2e9e0e97972d64045a3301b33a0ffaca5958bdf1a9deea804d546030e71784ae1700531c66025ee744748a3930d1c1b0fc60520691dd7890d7193c363b2e6c7e3173622232f14b8e9883b563d25ab7905664d020be05856215111cf14419945abbfa1ee8c1a6f371cf529420a4517ff7fe7220f03179a646f542023aac2556620bad772bca54cb3d88a6c5fd21a8172edec2923f30b00e4fa576dcc9eb02682eab3ed58e00378815f459065628f6956941657ee58217691abfc73112de0247ed6462ed0922aabb48badc14f17612616ce9f14d7acd1022d888d3045751d8ad30cae0edb20a7e607c409d4315a35736cf952f6cede9d4c0214a8de6a96e660c95a2cdd63181ddf64b1c881e236921a97098c7584ccb190420309246aafa8a333c9561c4857dc693278ed8a3657c229d4a55f774d89294ee35d021fd113687769cd47aca1e48835ba92c08b7fc69c6d6d898bc08be8a1d3981a6c0304a7a81da1155043dc7a5f6dc578797b32eb6fa7501a9dc070994b27a941e59a714b08f80c557b37651e17b6ae3c4c6519272517cf060e5baeac0e51ab53da4b8b500c7e68130fabecd16c091e5d4928519de6da3fcf225a1080fcf1065ca48dba60a0681c501169725d4751991e1dd9fb58a07c28a1477c9c5fcf32704aa1e5a12bc0b0011d4d8bbd0f1303ded6c34fd530592b64f9ba6f157dd7189651ae505f91b4b99936235b915b0699e11ccab126f786eab6a17371b257dc7bb629e1de49d45f2ad14d69d224566521aae16ed0620c8f08d6d3d537b532f7d6d147595a384bef5d2411b2dcb1b2f6dbbfae4cbe1c050707aab338bdda331fbf11b543a338ba138ee614725f662592cd9d0add76efb446093716a6e6f752bf38d58443390bf2f4fd537287c27e90303f91ec34a5003dba4f42923225a1e8b1fcdbaf4141da2e098a4268ebaa986219b58afeb6ff0a35b45198dc522cea2bd922d270013d027436a68c4a9b2d756d90ff02511f556fe2f5103ee25b906752daf6dc0d1151abacd125b3d21e7fea9739c29c48df3d2e5512626abc05a2009040943f64820409a864c871c7d8a2267039e5a2ec2a42b2eff5617623a5a271fd401c6e60705a01ae0eae9199e87cb751d4ad71abc92ff32a7d15b1934e3aa135a8e8d87f5ac42a0aa3cca5942b00d12df69c6b1d353e6d5c8f6c69ebc3bde78a6e63f0bc3b53caa23b1b60eb057fe1c60f2f5ee4148d924de4b85c84412a31c65685cc6331ab2576370df746d49748e08c29a2ff143981a829c8b4350d2e02d65e6b1ed0b8d29510f63bcfc5b1c8b4f8acfbae761e8b42007ef019be567392c084810074bb384249cf3eb0818d7be9018199fd1ed50de12b0d1cb6a798700b7c7a23313dab762e6901e224eac440c7605cea383a35721f5bcfd27c85618f93c95456abcfca7d444decc120698ceb7b7586c8ea53608538a4b3b6d70df25a57ea34d9fb0d66486780e6b202dd3ffd2577e3e7ecbde782ed5a886590246e840fdd3d7db6b90fe1b33f14d11430f485fb8649636cc24cecf0e5cb5e742114c4497427c9a980c7dc5cd46cbd6f967b4b97cf4a00fcf4aed7f0e6a66960bdab4d9565971135563f13d79476eb5127ffdeaa7a82f118794e525cb52c5bbb10237968fd654251f97c67ea72dd6d779a50c96532383b12ce5f1a0a4f3038c178b8240787a9fec7df98dcde385bc752060d0a92c730240279963d2e3c822f4e48248f372a70b58bec82921345667aa66b06acf07a846d864c19d2f9d0c76179f7e6d86ac41c1046b1b186d1152db3cb7c050edce095cc93c0e5e53091b71f2426b2b32f006026491102b7a4dc68a78643752c1e076dc06cf18c86d6ea7560d575d0cf3e855d9ada61ce977c7e53e98ab8ba8d72d235df97075b24dd637576af26d977da66fcc1d3d7dbbaf7f07d63c3f2585651b69d6f4aa27126ec2a4171841035afbf3c904f13a151f5c00f026fa72b83f5d8bda39571e6d99d607d9277e147aad2ee732bca1602927fbea3fa53cda33a66ffa24b4432c4b1b65e947c716e1f9dafc40fedde95adad3c9daa19738a5e7f8f185efbfec00e4b171b44d3dad132450144f8a2efb1499328b2c15ae2c3367e86126719bf0b522eadd09d1978636dd7aaab405998cce2c0b3af74bcee935e453884b92f783efa55424081753c675203310f2fdb409bccd9188ace63dd0e919ab497eca8eaf76477a1369305f11002000000000000000000000000fb5840599a85ebf5bb8062dbc853010a24f6bad521ae3d123b4fddad8a37c1529ba1a192e0cb235d4ab57005d0ff82661e05008095320f0274c0d03d40f889fb07b183258957b8393ccf0f02ad155e7c15e85730f878cda7fa1ede3fe08982ba00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c840d51c81cb35b37eb30ef5d41995d011c48c452c98fb9d1e5853101227458c95e28220791709da7aa70c8b2296261c29960b38d4b52438744c67801a77838c3a80c5878ceefbf5c3ddb272b6ea108ebac5ef795c50314222bef045d101c03cb2c8e1007501604856dbe4362d260f1e8d32477cbc27d95e3c6354521b5dc5d30329de365a55a39dd80a2fcd24c29419ba4812cf5a6482d357b6a2ae86357d2b1502065510ede2d75ad8b16bc16bc4242dd0908faac242aa9de14e19d7b438725af00a02e58951c68d602aa7afbe89df93c6b70b8ab86833594caabab4253581429e0bc00e85188999d9b4a4a07c251b98b96183644c4f2e33d81239464be659da90a4020ea5c62617430922c86ca11c9a95e4e12a9767803bc3d5a9653886677b439a9d0318c8bb8b7728758fce3ac5c420c10ba58c25fec631596597ac5b04b80f0f562c030ec935dc6a980e0a30d529068e5ff37627d4fce42d5f54cf4aba4e3b66e3411302232481cd1070627db1c1c36197ed299fe005e038ef75ca6bf03b9896e38bf35e030f8434defba6765ae85b495e2111905027021319ebde488d060eca031e1d6a2144fdb46556be7f9ae618c86a09891647412fe10ff8f6a702826e3e1a901fd584c169529176b348810145b83ff2d96295c3a35861c606d6498548f1920453c524fbec4189445de1c6fbcfda86248d08e80385637b5af95df665d84fa74f9b64e032517bcea65b9f21b58cc05ad330ac576a38e9d2e269f19c65aabfc84949dca4821ad183d9161822aa5439428867398c68d86c409b43397b8f607b9a68e7c4ec4da23e0e8e260964fd52675e2d86609c973aa123f17bb9eb5681acede959775d1e1e163e1165ec3726f2b5c20e1d63d5eff1e91b4686ff32b67d663f6991774c3af66377f03f58f816d7467b3816cc79f7b9c07cb94ec0f33108c565eb9e6c2615f77334c676f24b50d94bc4e58ad28bfa8b0770738629e0d55303db34409855c48a205a76edec24e5e1a04cb0b48bb07378349fed9a450e41a84b46476adbabdf5639cac117cb7e6cd9369b68723c16956f841a093bf88e6d8dc75b2ffba2060e6b951f25a553711761008d619479341f56ce696244ad3feb094305ed13aa28f2cb7d01627dc5ed9befc75b129e0d6b574349cd4a213da406439673614d32f0eb83de6e68039f810ef5ed3cf4a497abfb022fda5d832077b8c47ae293b6ad8b76b427efa56f0b7f9e9571d59654e0960b8dfd56db8034d5baf8e71579edc18e61bfd336b9671a4599d5fa1099485b03488bbd96e7433053240733b8d534804bb66b56e9f53ebf87539ba7666fce97e6ed9fadac1836c249c7038cb90fa647bfecc13f16e2cd0c4d96a6bf228ad23e9f30cf3c6c1ec6a4467528ff4a14c6738308e4f036f37013c2e0409f23b1b03361ac348dc1788e28d1cd0e0e03e702d07da902247a0a9d5d95b9106fe23358544e9cd6c12455d58f27a6c41a655cecd940bf8d70e0911606e574f0e421e8f531a831751fdc3a9a4f348f84840a3ccab58dba9f676cf718fe1b0cb0293e650713bec04187e93e16d02beb28b88c398db82463bf9e182040f669e1207dc29aac49c8d5a64dee6b278d1fcc452f7367b9b2b4931799ec2723fb4ea52c2bb05453dbc6e8f367425f675327ef97a3f4b683f4a9206f56214ad0acdebe13d8f7e808715da907353cf5095ace856a703c86384e67696e7c78159f6a869fe185d3bcaee7cc620768cbd086f88945e82190f1520ce6064aedd44ef3239071529fe1c18cb39e28a63e956696a59e7722b775f674121d1c8561533aaa4db7869fbebc29f3fe5a1dfb1dc1c97ae066518e61650030aac29f43d878e54c246d7d66c348ec00defe325fe60bb2c5d7d393228ab07be502805cfadd99c17c52ff87c8179115b7f965b9df08f621554ebcff644e87aad644ba4d802ff00093de14bd10c536b5e96cf341fcfdbf8fa743c661b85edef71eaeb6905196855bebfe65ff8d33050de772fd0d45ff9d24bea65ff486aa79b463ceb4afaf65b1bf1aea93d8207b9b0cb7a1a1ff7d3aa27fd65235ffdcac6d296db85a96c49bb41c9822a68e8ab41edddd6442d44c6678b6fdb1f344816805e05410f5032d8f9ad90a55da96b9f116b63a565105d456e7a2a416c80f3d90653360adc65e3665b10d3bf5d5eaa09ddce489f9756b2863ebedfac91a3076da05a78d6abeb245e6cc3115262e3f51e1d43ec0c7c5e3fbb31a67759f53398176b4b287014655b89eda0bc49a8c01cc9affde086dd0d03f658268d73760578cb3f7195f82aee95a8d0d60647f0c62a3f8d4b52be2642253984fed6e404295485e65ed4a794b5c23ab10da5506a44370e172bd792081330eb94665c7cdae9340681de8ffa802d21b3a40359474343d7b830d1b0f7228a106", "5163635352636553ac", 2, -160947707, "21af35a5b9fab1800ec021808a26f2095e6b93ee1ca07ec1b36ccbd90419d0cb"], + ["030000807082c4030247b3f1e32d7c3f69eb32119c4ac26cdeefffccfcda55fa7bf0b7298fd84660f70300000009ac6353516563635200ffffffff15eac417887e421cd42583ee6f9bf4fe54dd0479c2746c4bd88b4809ff0fc6c20100000008ac5165655351ac6affffffff044ed2800100000000096565000053ac515265563d340200000000036a5265b06af20000000000066a5152ac63ac59326a01000000000000000000000000000300000000000000002caf75050000000037ea5f9fb0730e19de6f27ca27790b51a3e7c3466dae4a7b92362a573b104b494c98d0a5ebdf7e21d9038277b5f87928fd16bab9d967330b131b1907fbf43a78f6f656bfba0909be8e3a3daf298bf5b3ecd9eb6b378dc9461363fd19f90d27fc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000968f11675963e8a941ee06a8282f6013304b539390b047645e4a09dbc23b7769bf0ce9e6c27fb439877cc92a7d5862b2576513125623b0d912009d0d9a540ba0f62fe64956f6861b848e1816d0b183c7b1f9e7320d699f2fb56e46da8919651456a66c81317d241faed57e36616efe947788da0e5a94d0a3891cc8f50395abd8022f76e5c28f42a813b6fe7e39a300feba50e7cf15197a32d5fc5cd05b33aae4ce022810bd94b46a80c808f1fc8f51e179018446de9a01cabb5855617669e691a5e00a02fa068250a87471a14f9e280bb46ae62efb9bfed3e42a07a2fc813372cd872eebc2b3c0d7731f7e3c871f9081493f430decaf910452322a726c48444b08af68031157b31e702a0a84a86ba64c6a640992554d5220de294c7eef48161856ae670d022506a6e2166e5e8ca7c81b00cbd785916e6c9c0919c76f4776b297546f9aa6bc0317f28e45e6d2868b27a49d870e7bee8125eb505d954789ef9534dbdd5794bba503218f380d5cab6e2aea62b779c962863ee92d47e062f4dbfd3f5a31aeffaca4ee030fb955517b4332a35aa2413808bce7c0c687b88af5f1f1ef059e214f4accfe3f3684609ec6f12d7ffd69446f896f3223df82702c1d62d014531de07ad274d0f89d311f5d7bb781d7ea5ada2cfd6285fd7da7ac7d75d823a0287a69222e72ba997b38c1d6fc3176355205a84a1d2c1bd0173680f213fd218deda41493970550b83aadb37ef43dec69cce64583c677876ef5bd3e81d29cd004cc18ba0137bddbab3ca428efe051a6d25815c84f61e75c4ad5a8312c1d7c40432eb392dafac2c74d65b7fc50112f3ea5e3ce7b98b4e527fdc88c2ff7343eff889c204b680532ee09a4d05f3415759936da0d725bdc3d8d6b80d310efc1bd769e356737afb0db316f947442cbb0b59d03dc04b0e115bb46413e98656c01836d91045b3caeafc8cff6d004f4bd15565bcc5af755039cb2507f8a089c2838ad42e6a0e5774de681ed98025d2b985353e33df26fdbeb19f8defaee1e07cd3fd34d26248dc9aeb03d2bad1a41afc70b98ca78aa3eeae9f3b3de883b969455bf0627f36786458e812b292870c8f0af030f0b50c628bd30a39556fff9015c487c992ae86f5c7e12e94733dfd081439ba8675cb6464a5984587ee2974b4a69254ea52328e98174e22b5cf41460fa00603673e57956a93a2d8476dc694c1f3c0deeddf4b5df121ee8d6535562a00cdf5746ebe1024b2a1e633e2a5bfd3ceb576defa9040f6c2336c45bf2fad74ef003cbc61f46f2898160ef23939b80fd88cc094c93d90f4cfb345fb1cd7346a4ec96cb1239555285ddca6268504f51e948ca36e6ff72ce54cb448b03454b1bfb50c8c299a0583c02ea8b52a251808c62193b732141fbc0528a6c0fb6f205a62bd594cac835622dd331af7bb3c6db7e89145bc12e4fe28152486355c2e1413ed8d6efab3ac485d3ca0aa2ef9fc77bda7ab50012d862092f4d7db955644bbfdd5c9ada5af5aaed2f19bdf7b96bb95ebd9be8ad0f9e4eccb6c701902abe71e3b76ee74f4e9ccf90a3d0a83262b0ae27322081e257da1910191ceb168fb874123889a416201c4deec8206733c64e475b77d3926ea545ffb27d084b3a56f08bfde770537da213b8f1e4cbbecdf6ccc8ddadd340287265681386c58efee53320db0e7349b9725027e49b8071445d39118fab5a9003567485805a7d7043b7719c7c042a05e5f78238cb99cf6cb52bae5e76b1cac6f5d2c97c2e581c1efb2545a80f3ba8cb7b397f1f13e485618e4520ca507947577522b72fb3acf1fd9ee08e4a0be7657a8836d474e5650c5dc54ec3f37d24f708b43852ecf6c10dbc55bb8bb25b26f9368c5bf467fdb4d4b24b5226e01007cff150c18459525342a64872944d1013e4d4cc5a87a31f9b437fe1cbebdaac16fb858dc6cb3ad4dc6d88cc941aa5e4d0b3dea57c3c7018eaebbbc4aeac01043b2fb7863187cc053dab93396dc0fbe3e247e6c4aafbc4169f7cadf8a9917febae9c3c4c53181fc6b2b866323324cbe964f3557d129c3d932db2ea63105a2784434e25c347ba07852fdd8ca3d10dd54fa12675b9c6f45d2aac530ac4fdc7024dbf7b65a294fb6a6414e7c893b43e461f90c83d284fa4f686709225275e38817489facf92c0b8de7d190f6994d0bb1306b8f436be6cea9afaa2f7142b543deeaa6e440fa36cd725402666b35fced8666c1cd16c531ebe0bda362e203f59267326b70a3890af39d4f5f89d36893a3a851b872ea07cbc20129f083d358ffca03af5c1775c000000000000000020c05303000000008e671d00a4063d9c2efea19a5128ebbcb2f273d29f5e5a6ac5025a1a3cad0c1a9f9ffa98eecdfe7315aae8d36a54248ced4e5b7e272028a1b95fd53eec0340f33e16bd5a4f071d465f9a57f14bf0ad0775032429dfe9ce2e4c59e1c68a7346280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000032db2d0d702e78e062605742dd9f8f3f8ccbe5bd4e2e54f53776ff065b27b93fd33382834afc6fe775cd587d7bf81ea0cc522a1e832402450ce60574ee157d4e8331563155cc7b7ca649122737095c274f7856c28c3b8cee272df8c3a0ec4c325d06240b6d3438b3a90ffdb7b99a5a4bc19ead77b58527945e94f103c94a79ec02053001c17dabba12fa7c5d6041c3060b313e50a5aee99b8dacd59f2a8ef43dff0327753589bc1129fd1743b062ae5ff0970f154bc7ca42f15bb740c227325d514b0b076851221b743fac31374ef8eb7bb2282a0411d9f247ad6c7e77a2436807335e5f2680fb8ba3fede8f64d91ab9025d23af026eb6af605819f7be85e696f536d903231ea7e4df935b9e733cb4b20cb97927651e32fa8cdb38fcd621b4dacbb1c94d0312c29fecd76c8b4a27b52d7801403f30746e8cc315a37ab58366e37abcae5075021543b742c4c4e5c958a97213a2f33341d19eb81188f7f9ccc8acb5f19f36af810226594accaf533cb564dfcc25b038338de929de9e51f0646bbbba04ea5285f143021ef350122bee96b06dcf321299af70db2e860de7a09f932b5ec125779c06a1b37edc31ae2bae964ceb3dba0ff6c6ed442890c7c1d11a0c3eca5f75e03c3ba684019b66b837dc826f3028532b2c9c9da5c2e48f495cfd7ec9a7f93e36142ba5aa23983d6769dcd1580db8cd0be20f8af6b29a46deb59e883617507b3dcd275387a2480b38ea97708128432f0caa24a011e13ebb5b141854d308e29a83748f3db62de5b5ad446a83b5370cf8a3d7a08d29acd242cf3e686c92e98fbe6a20b2c7d367dc39070726cad3b7145b9a5b12ac5c2dbaedb8881c81d8b545ac00e77f916e36ccf6b3a67031df1d4b7afd7d6cb7ac128d38e2f6eb77f5ada6b4e32a247e99b8ba0e16cd2858988226d3d87b121891e38d75f41c04961b2e9506fc0140f552e5cf5eaf229d771cdce1194931557fa9360855446e95f5c18eb8eef64ef24c414e4bd975aedf086f35fae1c70de88fdda98676eb806d5e33f1c6b693e314fa7c12306b30eb56a7afe12ef4a11146b230467d7373cc3eef32994b9a04429d09c018df2c5e6e678608f58a2d2ace72350651078fae3f8f71023f49b6124a33a64ec71de7b564a2f8b1cba93f0a92d2c4d86312f5664e2d4a0d19fd830a65a30c4a28a528a215fec406c04d087fbe3d5a92a45687e89667632cd3867026bddb93173ae241d87dcc41f0abd63b3b56062231953540297a8b21bbef8180eaafc5f71606e0c3d4cd60a33cea71e42ad4b68dcc3d00d85104cec2241826584a8fac7b455541fec1d0f86634c1f81f3de5d14df2f1634790c3561bda48a1bdb2cfbf3c7d6eed6b9eee223d6196aa245441056f58ddfe792e7dba15e0e939c5cc50588cf6270d4fa16fef2498e1c337283e855291e2da952f5d840ec82871b35938c02c15885f36b362983d2108e35591b7a1bae99651e90cb325104bdeaff51fdc19e43b9e7d0519e9bde1603e77498e97113d730bd4cff56fa3e42c15dee1b206cef835a39eb9a900668d5e919493b13031286fdff1e34e076d18c12af64b73b24f137ca85d6b70b6e35c6d80eab6e41b4d77bf3ded39812e5b5f3eea9515c6f24b9cebab5b9f75045ea002cedcd93009b9e41e927c43113b197f97888c42fa0a8852b64476d9835d618825ca607296538814ab8618c7e51c34b08b0ba53b91141991f40ddb8bee4d70183813b9fa49121b64aec65662f18de921cea24f42cac90a09e7bdc252bd92aed9863f941b23a9ad21e44dd3c4e2ae542f65ed24152cf54f68348a20524c689577bfbe8002d8abf1c6185569915c58d78e59199c5a8c71e89519bb55d9a6807432417aea2fa8d55bb2db4ed0ff669255aef923eff65317965b6ef5fe2496c1c6cc8e13ce7f8901b7324b5a530f70d86f1c01e494955f11f94b17bd3b90fe6461b7c96f9819f911dd386fb7b89f9ddb55a4beaf83e4de52a78c3803ec8abc059252380c5ffe381141fb5d0ad3a8c1c80cd28fb5a27aa171d0148ab10182b6dd51622a2038ad6b925be28b89adddf13a4364d743a6c79b9588e527f18727c2fa67caa3618fcd755542ed819c2dd0c61ed4ac9086bde29669c4630c9da40c1643b1aea16b6310fafd9979ac3f2b37f73a1fdf2e8869235ac0aa9427fe1b3a381642d32b2492879d75cf85071c091844dcc9b4a23999b26c739fe115d284f7252a14f1eb644bf1f556c300dbcb8b844acd76d790d83fd57c0820a936b1f7448182480bcfc94b2dc6d85dfb50a7c0a663ac020000000000000000000000008a2ac036e26e3c733d65715911e8ee9bda315d5e2b3f444d1b384e3d353becd1942c6d80675bd1d69d1463ba817cc3598fc71aeb59914eee8944c9e0d7207bcf461c93f9a5754dcb0ebc0b2f537efde5bca9e9fc93fa0bad67aa8c2da4c0b9870000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000094467c69541df5365cb6a62160e77768c62e4e6c7e1c92eee6d72f0c0290595cca1b913aa46279d270c9bef713ecd58981a937396f72d2bcc4a9b6e108c46f84163d09c82810c4fe3a7f4682e339312b5077bda1099f6bd355ef464f32e8c56f24b9477442f768f94e94de095b7b2ecde75bd5407579703f90567d873d80f9fc02001ff360dac7cc0a7435c59b0dd1c7770b0fa6a1c2ba6dda4e3dace7ad1439240308014b5bd70f1d29bf961f586a020407ad197e41798b5683d77241c82f9446470a037a342a287d0e0b6af93cf30f9e04e2baff965d8f5a2c2b82411632bb747c2e8d2146d7f7e345911263a735c25fc958af7ad2649b804bc6bee994656963bf54021f57a5d6a65f3a10d91e04b82f9aec40433b4847a7cda78f5b2910a444d796400321541b3439a6679d38801112ff1eb3166b829f7ca798c3a3542de50376ac12e50218cc5c6d4a5222ee7d9475ba994df2eb34817ec7860b6b105501a657c780449a0302faa6af465288b00f80b8c0422aebe95f08b3bb4f25c8f408bfc5702ac69ee203179a7b5e6a5e9980c99606b24f1ab3c4708c21ee7e13d5d84353d1b412d634a3241c8bc8579c891b24beae2ef195b25262bfda6d81e8914148d01c578aea0a1c3ead04f97dd0a305045865ec41397df5e437f06cf17d89eb7e9651bd96a8ea48da7061942228c41639e4b1d75bbacb8813adaedee5ff1f96ed5c0619e9422258efdf8272ef5fe24bf9eca3b724803ca882e39e1e111152bf8cc6b63d7186ff84d305b22a8b9bf03419c4cf217c8bf77e2b90bd3ad7f82838695922c11d900ecd140d84495274225b19ec2137b22076960f46b31839b3a225016805e6f5b3c2c87a0c4aabda339cc75510aba418e8bd045052bfbcce0ff67ff2ddad4ce7d3ff3a6736859c5ca7b950e829a05735d8c02b9ed6c342ba041850e7ae3dfa72febaa0e2fd5be03c9ec8cb3cc3e24d411116a34a75b3c6e95bd74535587a69170dcb330ec229f5d4e3ba23eb98d797fb8d6ddeb2dbd03dd2e2e7c27908949656c28351531fb43be4802ccc11460f45d3611b1b1558364b05a33eacf0ae2e91d9774fc87413161254714b634fd6735594e20fd3ee8b3242c94047e7c14908fd29b998ad707dda6c004e09d2e458c8b57d7bf485ef6473eacfa3c702a009861049b5d265d438150d29ba6ae4915d98723080155bdc07edd45c9314f60db18b071074498fbc2aa97cc5936c27eec31c41f294c5449b313ce892ac872b8c713362e58f429dde8265dae6f343c89c0fd4723455965e77e45ec559bec329bb32d8e179f6893cf36f83a8e04028c1ae81e6577924f7b2e42e5150cb95a1ce479c417ec015d477e100b0d861d1c887391a4c0a05a66c827ea9550ffb1fdf27b97a517c60dd585198bb77b7db34c15790629421aac8ef1ed5e1d6713fb285a112efe3ad3297728ac3f7fa1e5fe64692aff46315269399c3927a3de1fa8460c521403f1fae1f035ba1ba5c0377ff13edfe1a4763e7ce0836d1641b7b7226f2466c3acc29b27871d82f4c5f2e85c86897a7863135ff1a870ca4cd9677b8a235e521541e20bd4e715c7ad92119380e50cbb6c45aff188a3b630db6656890144a05034c3b8ac52193bb32a288be8a196bb2806bedf767ce442cbd1789186595f39c147566116deb6f658d1ad6859cd018114c610887052480838f5eab60f116149307093781b54a5b7c91cb76205e2216a326bbb92fbbcc64ca6e9c2008dc95d20511fa72c368599c1e48ec88e7460d4619cb78ea0b03832f9a7a6350a70dce8a41c28db767a36b3ebcef9a86d7a3aebe5919b8f1dd3260afbb4eff6bd27a9119b32642ba203b1fe292f6ff00e2ca81e5bd8264f7a3f3554ecf601d5f7dac40a4b96629555c891d784fd88b191b031c0812f39297f768a84c0177c7057c6c610743ad9a0b0e447da2be74b70184baf52fb872a0169e1fbbcf92c871f8dd1e6f5b18210f22e93e3ff8e93c61c1712307476940fff979e0e8f4ffb25fb479a7ce5f72a8ccbbc958ccf9df5e7b0231f9ed8bc18243f01dbff98ecf98e1d9e658ebd1ae94427f6ef3128d84e8a1e080f714323309be173a3461d5100a9407c81f40391ca6f3e22d1a4bf670c84d4c26bb9e64d397473ad3dd37c0260d221a088939f23a3d39b3c0c4e96f96d0b909d3a8c99cae5999fbc7dd3b55a32e43e5a85fd71d8389e5172e68198b72d13898fad31a8ab3cc5b266add05064bf6b867c067dbd057e285922e4d156b7fccc525c33fea232f4961fc12a9681f34a691569491dc77d0e3a89aae167f770037180bc6d2cf094016ac7dc23c1be1bed2ed3d12cd8f642c468af2382a157b07dbeee4de205e82084d3bee1b9d618285b2e8624852de5e3553a17169fe6c59ce3237d64a3e036f267d34b24fb27013cab90f", "ac6500", 1, 418809954, "39cac2914406bcae92f9a95a6f3c13d97a2bc196aacc814594cb803d1fe51ded"], + ["9928173b0356d45c70a9db9f93b63e84a92cda0aac0e4ca6fe9400bc916a0d700e1b13a91300000000086a52636500ac63653abfd88e1da0798477cd01b4449f2ae8882d1b235ae6fb719ebfdacdd5db2a8efa9234200300000004536365acffffffffdc3ed9a12a4555242f6eaed0440f32740c2ebd72581efbef6c189bb0dc3378920300000000ffffffff037528220000000000035252ac9c05d00400000000036a006572057c02000000000152000000000260a40f04000000000000000000000000a7c3a6aa24880b726a109e1790f2be8bc78af6b8a96683d82d0be6486d98be7126393a11ea5cdd91609705d418a193340ed674d516dbd1952c3fbc8f2ea86d3536f7ddb00c9010bcb36fa95e4f2376dc94e040ec15cb3c76b5178db2288bc00e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ba135034506c297e03bc46152e493875fef8bbcf2fb6da6d913fff4a6888f87caf60dd8142c41d7e7c6dd174c6cfdbb67b4b9f7784b902cc41c9708fb04fa8541314de0ab57561c109977097d7e854a3b6308bed816aa09b61ba5c16a78d60f0cc310e9d8b01f24549c8f38a51a78e027bc91f63738aef86a894fedd3bd0e9a02239d53c23fc53f7246d755c39c553dda573c703c2aed28d035e95afa078aa1e30217d1ef13d37d7b2808fc4680860176161b49e4b3f9bdc86f69d783b1b1365f050a06e8784593719e0e1fb85b8c5b14fb443306eab0150cc7a4c064a53ea9cd2755aa5df1842e65b184301081430919c7cde73e462356b97c9ad4b39f56daa047c50322d9c72583c487903d3da3147191cd52f1966299a095d6a134b135041fa61088020d456a26aa9610d671c8c64a89cba467e144e084b036188384bfc5c823eff3d00217d35472a8484d135e801242f903a32875df075b3a7d717f3f87b36c923e8bbd0214344d0face2079beb704598b047c7976df62c04927ad804686152a87388dedb021eff7cf9b6e409de115f3df97165c52db2188c2f50f6f2d25a50bb1facffef9f41ce312acfdab508f213db908a175b2b86a22fe7c2be867d00ccc073b60020693532a3ef75eca1bbb274d6c774b29cb5ac4edf450eb8ada6ee7a6c17d137e44e899861db15c8a7c97dd0b2a79aea989b2f1691f4c78f05b0898a059c509259e63d2fc063fd11596c3b16509a014ec2a8d73f8ed390f39b9d1d0b9ebecba7bd47537ed80ac48e33b9aa2533b8838194bd2a9624383251f6fb1c9295aef85566b5a432696eca46e3a4c4c4d48d21ad010e6f1daef25401e239a78c6ad65865d58f011e0374fb9ec07b1ffb1d52631fa650f5e66f3b697ad45d67af9eddc33ba0e1832605f76d296fe413f94f6f61173ae74c34f67f7dde41d1d29137292ba7d3d4462c5486204ed7ebe1c280b217e34659e785414fab8e0caf0f7aa2dc75ab72b33f83c088ea638f53127e4c392848b3a4d8d4b126069d84a1526589d0974c84c9c2b68cdbe9215c27fecb3cf8fef39a8db016d1ed6f5970dcc61c7ebf9121b4cd913a11c64bc5286693042f7eee574fb7669190334e4fa73c502499300a3f6f9e6caf72af1703340d6bb2de1ab16784aa14779ac066a256232fc15a86ff1d1d454df09c1b4b72222d99655844c67fde6bdb4534523ee7b62d1a8adccbd17fdd6f9714851ef514487d129ca06077ad130769fa5605f0d5f3260314ceb4829412585f9fefafa28665a19b9957b6b6f3f4ecd928b5174ec1773aeb857ffd58565781a400a1ce74b51274b43468d2695a36e593c06d82339a8b8a69e11400480621a22562010ea814bd2c16bdf48b4bb12fe4ebc94b1e628cffb3383f583000f312d2cc3434c00dad8608c1b12a3df8c1840c1d73ca99e53d8a8e11d73182eb8a750e77fdc05858ec91a3f0b5cf816ec0f5d118f4121a5961d931f27407a984e8ec780684473c1bb9c6001e387b567ea91746f5d3b1b958557c34dbe8ba2ddb75df4482394c84d1be69eb76da7725962b8e1b3f18791bedad1f2f6500b70e1db02addd492d428ccca97375d51d4dfd4f06dc2fa48113ca66e57a717e77ee34657afe537a21a58cc9c2d5128d7da279a6208f2740f10cbb43b2dc822504834b8f435dcc2c6625642deda9e66e04e610d59b6c2deaabdec70822775bc44ccde4efc37ac3b049523a39137c9d1be1f0c5425c9ca9ad256f1244aaf56856157f47006ff6a1f67cb2071b57233953ab49c7297be13b25f053add44c08b245fe513e9125f0aff193b591b5259796f112ceeed82dfa78a459db98506223cb9fb9ab4e914a1e33bc5b5e420f2b8f90062ad054604f72b40420d2353ba6d3908e0784c685fcd1149087a5135abfdfc74a4e9b6c9d1efd77bede4ec17e33f1f87a1604edebc42a0dee77dd0f811f8fea5a4d2b75a8bc0c761dc84f1abd0c25bc1ba82725f42d9371090ba82a9a32117520f6e3d8a55ac4d82459b53c2d165945b0d2dbe81e0b180c316347928d9ba27292d455094dc26ad372d07b577bef8a9df84532bb42806123197ba4ead32130c8342d5091ad99f7f8d24f7fefb76b6e0530f7cbcdcd813785778ae121132fd72339a1cd6ad4d206b9d22ec4f9d796d1767a56d4bcaabd4fb9fa4639d117aac00c763380b1509e620535744112e04a91d83bf1da1307156a109120fedf210d59685ad729f5988bb2b276090108dc4d22dac2cba07e577c7c86b9568bf76e95e0357b1bb99327442f073a80000000000000000724bfc03000000006654582e5f2cae087d112db81b0f438d854dc8c08eede3933a000890d387a34c16c62ac9b35ccf4c21515437e08007accbfc9ef63182bf36bcd9b14e20674b497134200554040d780f9ff6643ff90dfba2267b5edbf271b7f593dbb99c2a6c39000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e0de4670f2392760d13fbed86a9b2a1afbd25a6feceaf5a317d1338afe40548658467ff5ad75caa4126719b7248b461ab99dea54a00794ecfa53112ef976368313d3002b5d6bee76a6b22c2a458427c99aba3070890a45f96104745336fe1a44db8b386c4af7e6257316aa8b789a85a29e5f0437c65574608efb2426efa7b9302063006e7bc7f10f0b8bd98954cf2e99c91f7e613d543f14b4c290f16e54e6f7a0204c9de1a823b4126a939a6446b7c1c053372143572be07ba5b29e24e8bb2b3080b0719c8c84e3438d087430afdb8fac9830987b636dfb1a17cda82725f751178ff83d7bddb8ac964e7c365609bfae3b4d57aa47e94c66d9924c9965f6f0fd1913a0323e25d82899eaef95d3bf0df278ffcac1596a804902eb87cf10ded0819c94b060306e8f99fc927140a5d9b0136f12040ea4749c811c4e96c31748bf7ff5019f6a8022e6a1f63c8469e6f8061b26de4fceeae67a819867e1c4faf7a6c330920ea00ec031ce27781ca8e2e1ea0fc6be0cfb49e3186f08653d6dbd540f76686495f56993d0223ed408080a6b86cca42ab5cc2b068e35a0e41e7716f0ddea979babd353e0f0540c2b41bf70594e6460aa7edfa5de246571cacdcf8398d2b0d13cd95aab8f7ac0715490017608df1e0061784e51d19e8cc6de6b50d771493d6b4039ed90255339aa17e5943eecc3659247276fa087764854e028fa450e5c7d202cbba17971a2249a6ee0c562544793f251bc162f780668c59070b66de637e701a4b1c2d6b01e6a65944837caf5eab0162a63b7a6014eaa4ecc82c92dd3ef3da48633f405bf3e03adbc3089cdf6c75d0c87aae7d2c89d80661d70dd46e91fc517102e48782f4b3cce8553695b9e80b8cddacba1eccd9e78a178b7dce45d498d22499a2853d3113394563f089d7a69a390a8d1ae5545fc3f6288b16894c2c103a35411a5c3300edadf5cf921fa4f04f6ecef1db1f68faa621ef3d8891cf875a47dea37293395717ac81a89f4f41ff784cf6353032683f8b1990f8564d215f667f04b8c8ca32034302202502cd3657452a4e17d7f33a200b45be527cc6250462804227cf8d952ab979ca7415f7f61acbcc8b33eed2a2f9ac74ec3fcc17b41f8bde061622ced6351cfa9ae620d8431c12d1d7e4f1938a38e7cb627aa4efe1645be0fe53e260b4b94f74b58f55ab476b7af909cf7e9b30f24fe20a248871a12c9fece6d68585153480dd88b9b9940515063e1d79cd720a1247a7d6f917bc8f0136941589364de62752d523615294f58e7d0d79fdcfe91446bb8773451e450540f0852c384e55351f44abe3881a069b47ab7577e7d0f2d1cec9f6bcdf043a190b66a7b22fedb85014917e629e47aec9c256fd88c7bdd959ad31a8993df3b76cb11d9153bd3c7d2d7b3acf33374aee59f5afe71bad8947f40469215cf944558ae964cdad21e7cc9654ff5482c86bb7ea3d8bb5deaa3ccd17a93a07655cf5cf2b18c0afa84985dc6b2beca37df765481fcb0ca61fceb794a3fe8b1aa9c85d01a9b7c3209442f57cb3ff244b497726940b58e1d83bafcdda3afffcaaf96d5f84cc08ba36cb889e7400b32b3d7daddcd589e29ea9f3aaf7ba1c2cf87a12aa5f59e9998a5f5b68fb97ba542ad95141357d42a95dd954759f363cf4dba98f26b0b701ff7bf2d85c41b34f35ff9a72c4b8a9129a1debf4067e0b8b2f508dec2c589b75433e89c08c572dfb7f11afeb53c17faa831a956ff5d79bd1127e6e68f1c2fc3831f2c96ef93d1033bc99b05865e813fe0b9b134b79d78def65a117c62dad96bf8f211eb09e067dbd8e0f34cffe8fffcb91510bc8cd8b90f33af2f1f4f8748b920c92acaa490fb3644c4aaf252919811f4095e60707a41b271bdb7a85efbf7911f0ea58048083f16baf76f1ab7abb5e2a0ef27f09b83d1036b601ec8da515ee5831e7efb64d2783da56c7316c3166b3c831cb21a056eee4f8eb944167ecba1abd7fb2a15debf6810c31609cf5d86baf7d680ce1e9519176c12c1248d056d5e627cc8e299eba7761e3eeec80bf8a9ddb8168d35267e43a71faebba765ad168ce56deacb86034489dbad6ac7e41a4b38b156b78ad63fc8bf8001e302aa856bd08d00510f3bb73fef53b2a6b4f2b5fd734b5dda6681cb3f1cd8a2f366fe2f4a5f3eeae9c40c39c1d0a3f9a76a6855cec84279886dcb9a3730d747ed982912b24c52c450435565b7d0bbe8ab8b7da8cd34485f37bf825c49e3058598c2867f7b0655ff9ca8ec445ad68a92183302e45c0613234bcaf9bf4b78b63d2a9f5e7b9600c2f22b932ed8eaf0cc08f86fd607bbe9df5b2d699d15a43e6c9a2c9e34ac77d1ff33487ec0a3e3a83122aa23c8af0ffe4be50799cf81fd201d8b847cfb6e8f5da4447b7856b7af68d6d237ab1ca7b9223c7999a6bf47faeace78af8d501", "535365", 2, -1994589496, "96e9e9f8f4fc6f09873884d8992483c554c2f4ed15ad83e56cc7398185e91190"], + ["030000807082c40301485766f7af772a560417154101e77a70dd3b31e953b7c2dbd01206a26de2301700000000045165006a3d3a06020187baaf03000000000100000000000000000002d03626040000000000000000000000004c27d9f716e30893500046a753aa3897f4e102314dc329b404f5f9ce2f41a2bead1b0ebfc85a1ccee5603d1928a3f07630b2b8b8dc4bd867b62352dc27b83ddbbc88d47359008fb4d1e5629754a155a503cfcf6c64204dc762fbca762259e32200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000663f3c7bb7ac3b899ffb71b1e712e826bddac3c53fe7c228c1f2d7e5a5f5998223b05b635431b416b164161cef4d6d39d2c2120dea7dc94f0a7547f7bf6b65ff183f47ef215100a197d5a78e1b8cc4cb28be878b9455c3990fe964d31bff32950db26300267cfeccda627c83633fa6070b7d8843d457f5bee81d3a84160ecdb003219d6ac3d73e88a02bbbe9d77b84408875b16a267356104eefa0fe46e177142f0307bcd03251d385b73a3ba8bf649ea50b75958630397e01eda8cc805706053f1d0a07a5c4cd68b4f9213680242844e144303e7a46dfd5cf2957f9c59d886f8daaf3df500d5733b149a8809efa16f122e66280ab384c92856da6f4d49cb24a97792d022d74ab9532ba897dd45a096c4b2b8cbb9ab253a2696b8f9345018c7b66e00bba0222f499bd34f81832a4471bdf91a86020bb2ee3aeeea4c79d29507f36f4a8b64803231bdf616761ac8cd1be73bcaaf8d02a5cb8d60885411bf5a12c1ad079a946ea030e96fb2ee369478f0c41c1cf4c70f27485f060c1f2179ed7eadd23c39c2ac4f60311377ad655dd81ae4b8f614a5295ab31b39b7e10d3462e49a6d39ee6e12d434c37b3c1b4e60b10028a0869aef436717c77230c789466aab717eb7eea9bdc1f61eb1dd7a7133848ff6c16f43ba3358cc8d74f106afe910b1535a484ef89d61cf75a4d9b265f27b339a1f9ea626b688f3475ff2f9080e2cfc8593ffe03cc17521740a5712f5a848dd236cdaed2ad931c6985cd002ca6dcc69773fceccdfc48d2e03b843cf3a3896cb83c67b90ed9c36fe2df0a94e3a068a9cc500ff5f7c7fe1afaed56a7218f0029ef69806c30bc2f5099c7096a7614266ec4c03f6467e4a94fdc80a6e293b079cc7965203a3b3156decdb4f47596ed8ae83ece28889df4cbf8ae7a2e20d59595e9e08c3f1773578ae43aee60a06c30984117840ca8164089668312f51d4c0f400a001f357661982e759822a3a6d49c0bffc577820152291f72a8b645e9388c45f25acf3f1eda69bf42ec2f6064e0c1faa705b3ed689e61bd9dd81523280fef6e9996c2694f523ae243a791b95e88cb9af09752012b6d4472f95e401cd8701590fe9a73051f1d52eff4401cb4a87d86fd2df9d59af04e60f116ac8cb97f564e7fcf504dbc693a646db8966138ff5094e5cf979be69f7c547dc710869068b29403a55c57fb634fc9a8c7e3dd96f2512880381d5ca0decb92d19723a3eefd719b66320746438ea798087e9112d42c280ec8ccf7aa16dd286240218a16ca33bf5b4a4abf1dcf524a3132694efafd08eb9b0febc08a15a49c7e3b974466955b2faad4969b61f4056a7026e5607bc0901258185d5ea93ed82ca59f0e63078bb630b6c0b6d5f6c047fc7106033250c0f4088b4806bcf6bf4a100deb84111548627e0183425a4eb8bd86fc3e9336c9343129e30b041bfe718050efe0882aa67caca097eb6fa96e3002543c27afd11f0baeb307d71c1e88d64d100526163e1927dcc923946f902fa76955017db65a325d1150658f0752db5368ac02a9bba4835c263f8129c801a404bb61b3ac99340e8fe87f2e19989aa53cbe13fdcb9bdb63b340a1353cd32af113be1e16a65aacc526d74b92659c595c2c8b25f01e43d7967dee00224b6038327dc91557e428b3aa25a0fe63eb46aeb20176fd1ed04a06690364478cf6dbe5c076ae9263cb00f257838a4e68a5e8083ed378c893b15509e252892f3ef1cf7e5aafc8a3f28b194d9ee19ce98ed70c52586b661cb6065603ec27e16c906299db348b3030d24195d9d78c1568a3482aa0ae9cb15023761fceeab9f81be076761d18205b199bbaed20407937f48710d4b552a825d86a40c6b6cfcac022743f2350d62ca6c0a3225685a158a14f0c814b524a8e66edc9500a693c4484445df1397921394016dc4fe898af4c9deba1ba3c176f8554999d5db45b02dfb896ec0c2f4e51121e9eada9016364cfea48c63eb8fcd4b9c053cd892297e9a3fc84645efd6256ce70281024eb571b383562350a583b64bc51553f960d473c328d31114cd8f150b0b902c7225184d62411b4c20fa9d597f956ce51243070953351b2675f289c5522944cb01452252fdcbf4d7748f83e61af5af8657217d2a521a3752326a1ae1c3842069f2e0d0594032f5f3af76338ee4cca524f593cf2fdfc2edd20c930ef40177ee12b4cfe4bc34c2c64408631f0c8dd9b7a0be842308fac76ba4b2c74ef34e15a84729c74d54915cec98a923a06c5b035a0dbffd9c7e81f5f71086262c50dad1e82f8b159f669e20000000000000000e0da54020000000085d91685ac48be3ea5ce10d922b2d17a84fc83f2b3395d13e7a83f97d2067785602c1c6c03742f03f97e5ae164ed4ca7bd01f040478eb5417abde052b9e1126a882cab730a78787a0aea4972a22058cf7ff1c1555ccd7e15e0eff63f0bcf9abd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e53fafe450545131f5da209c0afb723259628f170849d9ac003d39b4b1fc13efa5489685c460c729c1fdc501be4b5bab9b7b7de60152516e91a5ca906e85d971b164e4ecbb995fb45027a5cb1d3443b9b94ee9a31e441a5ffd1420cb6bde16a13f2ffb3d3fd7cb6a191de961ddeae5312c3532ff0813ce61d67fda8de4bbf1dc0309b67b930cf228dc2e578efc9f0429f761ed14be2a49106ef4e62db1da1708b602011f2fa568042e22ce9a734b9682c2562303e9704b9d74c6b94f7ba668ba3fac0b01a4033ea2dd0f3c8c00bf0d9112c123111212e2d2f3ae56a5e87109a7b81ead5a5a55aeb6101fd92282b1d67e42ad124db5219965aebd0511ef4338692aeabd022b37246a208a0c3baffde9b0916068eccc3f5727e565e14754779b7aee8363bd0305cc64003c6116333193c896dd67295c6acf7b64b7e8e0a3687090120fca35500317871fdf110bd223ff22c842727afbc5003806809b91b224e7c50bcf9a0c53d80302997429be6ff63ac4a57e7c51d6650e9635a25712a68746033565be4d982326021c86d7c030d2333fca3ca147b8a0e3bfa2832e499222cfaafcfa7aa128f264c10ee9efafaa8d846e32756f3755fa8ef466cb62e8417d0a3e98702bc1814ac14920e6e154e4c0af6216f88b9634032eefd9fe16384034a2e7870df16c6135b9ac0bae032356b012b7775cec382d9425753d70ce221524495c53534dcfa907175e98907db9174a96c06d50db6f43fa0e289256f59563a993cd44612920bc1530e135ec3fc1f3471c2bab1f20785227b278cc95d67b36119e9f3b9a2b6c7d48a9bbe5309ff3305ed76f3715ef6e3a1ba630e32c2e659f078a469be7284e403c1e89cdf0cd2e4580df4246a7472a9bb82a8b45bbdde0356441314e8cbb422d0e7e5c5881c4cb47e5b5e0b1c566bf9f4379868b50e5472d8c4693e68c1aa98bdaab3e74542f92c63cc22a2f7797a589a2a731df31850cc58cfe8194df0702bb4daf9fccae0652b10b9d75c687e7479ba560930b2efc5e9b169b1afacc19c4ee225b3248b154da9155dd01638917a2d1edcb9c85ef812df4b05f8ed54ecf2413b75138f80d00f0e5e170ed5f3a2f9f6aabfb681f56811596c71bc386b29f923dd5a28fff95b05da91be6c7b4fe1cb1a23866edc3603e24ea96ac67732ec6e8960279d89fe6ae5b0fe948f6c9af6897de41e6957abe3f8eb382eaf387d9b39461e17403cc073e64f44f893e23db5cff3d578ffec192aae690eb6fc93ae71f62dce01dd4deb062dd9b42d43f90ca45f8986a5722853cc07667f57177b618eb1ae475d1fb7ee8bdd7590a48c1ce30421518d446ea67d6b0febd4fca1bfcfc730bdaaf98c1017b243918f12c296f902aaf44d17d73dc0f1f82e4a1017f034c40c2505131a3fd94064af96b36f2ccba8220de82264441dcbaf210d73595f0297d2ea6ceb85eaafb0c77b24d9a5c78f132c85ae448f8eb48299e0a3e56a5a439b84da6a3b5d977863220e71d62b7e1f6c10b81b46bc8c42897bf5c678ab44b4e43c4f2f6b1f15a7f1140622b0c9a63b2eab2144e10be071cae39abbfd792ccd5279aabd76fdb3a80db2ccb260a08dde251434cb96e15cf703c60c411a09895daa19baa0e49c6e43dbd809cdc53a885bcf0038facaa0ee2fed672c0d8f6cc0d583beb180805af6e5d6229751b8b41ca13fc43952f5575302fa4df51b48d85cd6b31f4d1b7643a6da36214b2436a2889a298146ffd63e15b8f9ed995970c4d4c3ec6b1411bd730683b8244ad3db8c5d646a10f5c737450f5a24305ae85781537d367743f593179434478646f3403b4e2ada442e62c9b287ca8ef53dc217d6fbc74fde46252b88c927b3c93efb0d15561f1ce62ea605ab4b83736ec79b39dba8a6475227d4b6c225264479f7e866a02208d42066b54c8d9a5f88601f99d97e956ace2e3b7a120f285f4d695b5e5ac7ad84ac63534833633f735b1030b98ba6b7683fa968f05cc23f85460ab5a771fc9b5ce17d3fc9b957d38140aa9463a3986f28df2e9fa5d8b4cbdd9f80a415f5df2b2174c18314177c61eb45164d4d63a1340046bab912c414ad8589a8c5ac99c5daeb5a1d564f5eae2e9a34108bbb860098b50a1b2abba4940cf97a6b5e7b94596d3d6eb134f244bf7beae8228a61478ab33004b0502b153d6d2d9c73a5dbb83212ce0bf1857248a29003176b8e4c47b207ca0311a39d011806ae8bbc46e74c0608035abe4ff39d6f62581777ec9c8fe3a06f6977ba9f5287c2446783fb41f498eeef48016005a0a954a5dbb6bf28c3c8e97fc675498794d27ba8836e9bd69edd2ea281a166a7a1bfbe5c4f3fb9f3e47dee3c6a1a9db89286b19fea90e7a685dea856cea352b831bc7aff97d2626081fe753a2fddd4e10753745f79a9d061c2e91439c4b7c21a4ccbba70a", "510053", 0, 855084578, "e35730804f4d3614758e94560ec80cd34a364fb21a84320edff33c85f967b2c5"], + ["78f65f4704aeee4765f4a24d4474499b803f6cf88d8038ef009f127aa9737bcf5d8ca0bfa501000000002a757306e6dedb7bd2ef96e48a26462aedcf17a9f6d91f3b51b6f93ad7e4221bebbe4955030000000400ac536affffffffc40f441e918540e4f085d0ed637e4f1ec8dd3c5a864b2796982f5db094047663000000000153ffffffff33e2e78ebffe3596da0cdd6ff8ec20e81938ee9f84ac8a89bb23211bcea5e2bb030000000251009786f1c4044c9579000000000006006551ac5100bf43f7040000000006006a655163008ff05e040000000002ac5379170c02000000000551ac636365e956081800", "6a51ac6553", 3, -1393017821, "78fa195821c8ac6c44c02ebfe64c323a0090f6d749227f21ebf2315343f7db57"], + ["030000807082c40304aa8ebeb6090a9d2fd9acd9f1f15218fa113bba18a7df8dfd4d3734e91537c4e20100000001632b7b2f1cd4048641adac141f46644c8cced747b312985d4e9b948ca37b26ac3162e780c70000000003515100f6c03d8b205596d8f292ee0e3ec24b057045c248edbc944df4c7b8a67043dd872f2c198c020000000900525100655300526514bbc68814490ab4690a7ccd528ca757354f6aa4916a1776c376ed86f076089a4768a7990300000001acb5bdaf7901330d0e02000000000763510063635153eaae961abaf580bd0100000000000000005871300000000000635073fcf508af34b728707465d6680ac58845acb2d161d25df091e8ec4f0b529f0de3744ada0c63a64613cfd3dc661cbb57ff6c26d947a737894415c3d1b36fa0146536be75320212dd1ca429774a54c717bc98bccae83eed0b4d915ad13ed2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008de1a66aec493410de89491b2747d942fb2c73f421f3c7ed6e82e5cf3c99401b11712c4927d19bbb9122a07dc787825a8841d6f7fd58a1dcf39daa9b26c084df68e177b104a7921e1f2d2a27739fc43fe29c477ad59c8a2c39e44033a760a0a5f746f0f036573367a97d64232dc814a4b1600cc2183aa54408de6683d48e027f030b3df523feee3ec263ea71a1083b1fd7ff0667a912cf357c85df10187b512e05020e4cbf19befed0e1332c8fea97d5056c144aeb17d382ee0c3c4aae42d76b51500b04725cc685db08e675c39a0b2bd47e27f262bde226d1b9abb23d46a0e222f9ea5545cf15ae70b0280e525d1765ae06a05e0578253a3824f8af324119227e8ac00222fd12d02938d5ddc22bbf6b5d5c605e369eff0938a2df1d29298f8c834a586402036c9ca4ee2594b2eebf0172a3f3035401e5acdf7978e2e60528b2131e1e988f020e4f7c08c25eea4f63a8f8bee1d5344b271ea41daab1b114c6662195793f7c3a030b9fe856debbf564abd29f038a8c2fa4eee676d08288af0cd06293d0ca7a7592020274f6a3499ec757bbb95324fb8418f507230c5cbd9032f51ac0fb3d956f7f65472e257c7b485d5c6fcab4dca62c04f2dc08d880c01df9fa97c49c728ac4d0eb3202f51247d66a83f181b266733ea1eae05059d5f607e2cedb7e3671a1a80da9542d07f28137a9600b5b8fa998c9204004aba588adedcd9fd1a913e253fe921972ec3e4ef16b948569624a842677893e5c49618dedee3434476c318ae41394af95c6114759067dcc12b3211a64b828a6aa41580e82d9cf6f49d13fb9b2aaff6f519263c6bf49c415e64225c95bbc77578a4b8a17123e558b04287e9bb7ffa2db80f53ee4bfe73f76a9809343c65529612fd2e7a3aed01a5bf42a05a1a14c19f1208671dbc226efd112374c2237e47d247fd874afc6d80e3aa22e753217677be3a34e372cde0d13b9b3ebd9a08250ed456b212b6951626092d1903230e1fdb403071cc0985baa8b143444e3dd39fcb633cb01d5984665c28ab33745ab700a151b9379cc94a920817f1e3a41450b84d4943e8dcfb8ade845c88021ca4dcc4fea025b58f9581f2ad4b90f96ea1f89e7b15d0afe55452e908e5e491efbf1ec696761f146bf872aaaf5c5041b1d9ae57af67dacf5d539739ee1f5b31f59c250d65badc7f105fb8402c2940b523e997832290113b664c71e126a8489915d98dc2ec03d85d65aaa3b31ad9f30c607c3a98782ef7d3867cccaa147b06642544b39838901858cea83ed6685abd4f83400b64631f66aedfea9d4e1ce9b57ceef051385e4215e55e236133e2f05ad359d019ad6247f91f8f90f29c02cca804ecbb4d0d0d103923cd6cd692801a538ef70384ff72798bb3751bed286a067f49c3467c878d2fbf4e63072fcb5bea3a6daebc3fda87ff6dafb1d40216faf2f580a90bfed2bb6062419ca3d1a03b9f6281e033c06aeebc576e5d27e92eb5ff8381966456b566e03f30e85274c40873386b4b9d90e3cf3b691ddfa227edacbd8d53124e500502f181f98efbfc46518dfbb4dec10326fa2cc98622f5aa22e420000f2c677ac8d8e052f6748b7a9adb3377ae0a4d993462252913605bfef0aa5574bd28a7526ee504d73a326aa3eaba4f5b9c323036b260b81a7fa36ff29406777fe96029d9ea0d7b01171f9527ccf1814b398c26a59d6bb051a42555fdc1289895def9ba456f2da87c2cb92f7f2d95679b880c81d6c9d06ae944d810d6a2e4d2011ba4cefc038ad6ff96590540066dfcd04e46c313951180e1fcf3862ce279feaa83a5f0363a1c5b71ffa72a6338d5cf09ad99688164f4436a61865969a7715d7eb956d93648221b136a76ebd6d1f50379ee779ec5125e9d3972f110714c2b394bc1613f3004b1477eabd4f3488ebdcc26d7fed04dc34315ba59ac182a00d5624938361e35248103d6a2fde1d846efb389c0a451fd0445f558a7d4ad50a6331fb3ec4c8274db725167ea2c18cd7ff807871e3e01e22d5fa5cb0c8e18cec65af051c642a4b9a15518d1af1fbaab44d8b659f157d116b89b65f6486d0495b3c131d39496f01ff54bbbaee5b34e8dd5f0d0c30cc53f5966c9161116cf0c86b5377352c33076a9fb7aa22c34078072931ba1ef96443ae3767949005b2ef75bdd3b24c950f6a4d9ac7ec4500191b9e4692999dd8ec66c16c45d9454783709097b33785dc308a0c6f2f070cf06341058939b1f5010218ffa7e856c9891b78a6a6a0f70338b5958b9ef2ce8f9a28d6544c23663129d682320fb98d0044ca3497cf5e9dd5d83afbc183da34c912b53c1f5e5a019bc31b1925fc49d730f7be0c48158cfd59b3f9851ddc36064b3c36acb429dfc1bafdc27e9b4f50d9f2da14f625a1fa93cc73560a61470e6562a9d94ea55852d2dd9c30d8ae5895995f0005", "00635200636500", 2, -1128554963, "384ad32ad6f2019437690a0297d78f0948e542e42898a9a69271d357b53312aa"], + ["030000807082c403045b0453278dd7bf0d26f850c794bbdbc59828a97ab47502e231a98c2316ad68b50100000008536a516352526300ffffffff6a4039115531339fa826ca3d28b2d3f0b8bbb306cdc6556f23f1b1c042af351202000000076563515100ac51fffffffff46c231810cb32147b58a71f8a73142f3a4c49b50f8882f9105d6aafc916258e030000000852636a5365005163f4b049ad3630160f8c4f2f3121cc801e09d7ee90692a7848894bcc20b8e479f9e3be448402000000056500006a00d2e69f7c045289a902000000000353630023b0f502000000000663655253ac63f93ac703000000000800ac006563525253c687db02000000000965006551006a510063000000000000000002000000000000000039f09b00000000005fa3d36777bc739f7c42b244700a15bce6af14fee8cc99ba293944ff199d5ab445112feca1931b2fa89b385db6b52a92ed30b4ea0fc605dea43ae5e0edbe8005a0545f1ccfe7b321e39018f9faa797420629b71f4407f87ccc202e1ec407b8cb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bbae880a53931cb15c89a47776174cb6349421b3e5e906dad4ecb8ea0a2b4dde1fb22b6cc5cd257f9989cdcc44d747cfce62ed40ee53da7c08465f21b1cedc6ad15e681d65330555e6766f7379fda6fd4b13e316a88303e4011e0f07f36382c920e9277ff22ccc5a1d16550e9b2445d564d3612aa0580ed55484557aa2be162d0203725ebd59cf1d9b62d5b4f1486fc61c3e82d87e3e7f618dbce2fd0a1323c8d7020ef46cd2e445b8a78693fa36dff30d192f404909988a94b516bdbf9ec7c796a40a000723f98fe452f2ce67375e25bda2b1081a85df11dc80ed42b963638ede5f025e2ec75f4108fd4d2dae443a7a8ab372c50c3c12f3c354f8f1cffd3222bf64eb031aeeeeb9bd3cfe742706faa60a4470360daeb8f5ff27dd2f79fb5b5e1eb36262020632d36d3c3afd12bbe8eb548fc75486c38fb084a3aec3f14a3f6bc2a7b73aa4022bcf26ca87edf7868e4db8d02055e005504f5d04e469bcfea7ee79b120f6ae900202e3ae1797e6d774c50c3a3fae35547f20eaae770c5e0a5ef4ac49406144db2e0223655a01b6f41eb109e8b5368fab082c29b8531dedc5ebbbb2c247dfc62567d437bc13f5f57972889af35e164a8e09cf9e9ea2725f285a95be650098425a891169820e5d1eda560a70b2c998df646135f7667578bd43e49b8dfc367c570abcfa8cbcf3b654c2dee5644ac1e24d2f9fd00f986c51a4f3afc4a6a4c0c605fe0cfc414a7bce07b394c069fc8e617b87c602ca7774a6d2fd071423d10c98a4f640895647e967483ef2e5152c3a191bc67261c4a69ba0a6e3102597aae8be078c03ba6e22462948342740d9ade2bc4ec7be1a347737ed432ab1edc08426718ac3438772751fad5b3093d44ce3aa92b3c6c867f8c4fee53b09bd78ca75c17e58ca9d297be411b6275eeaec33d432e5a8d9bfb57ca4d87aed7da119fec1b7b7a7e81242c51c031c24b0076c864a4157ad26b52ef7019ed5fc2a0eded8284434a81655b7f37bc24cd6025e58944b5fbd4261a8322b1a33da163de1c7458b7a57b889651dd084ce6ee5eaf21e42fca94ef4f99aa24637ed93819ac6976b6adb442ad84ea91702d977096bb33fad2e9b0ddd8d718f57858e1bf4c41a6fdc4364efd030262bed414d0cea85f3a9b00bd88483f0c58840d3051448cc1aab34c8a7ff5860c71432db6f7d64267f6849e87cb4c0732a35ef190676d5591f789d9f03b395f8e8ba3c61d65f010f95c8c1f9e0ba51dc2497add3d3cb469e0944b59cfd3f17b2748f395f76e7246b88765d2ffde3c99f3a0b3b0b719377894dcc4f43b6cb0dd9170e2afc6c2bc69fd3edba18a08ffb2a4f924405cbbe3e5ce83100a5a333ecee092702eb8af044a926e6cd4bbaa9942b7c5b17633571c92dc2f72a5a831b4a09570b93ba6c0d9aaa6b9c8b30db3ac1c5004612e2774786f2f0e71d9f5bfc6a785d25da46e289488a551d6dbaa4a009dbaad58109cfdd1b7f9a571eefdcec6756374514f14650820b5b56f26196d8fc071889b0d974ede8606b64cc02e691e81799adc3f11fe4422f1a8c187fd536863ef260ad7fb5fd59e4ee9d5c23b27bbbe12355eef2cff02bb7be38ac6fc293f546c07f681eb410ce13fd997818033b2a5ecf2217df2562a2c67bc533f43245465c8c2f5059bfa0ac4b028e12441ee91a416eb37db920fe3b9f0164d9570ad9c7f7b05eb3ccbb5d6e8d34feb341704977ac3791d6604d4b37d3851a0a206de1a018327e05f490a8e172027f16d96b5d19e40d05ef6992c3c3ae720fe3d95a381eeada86afea78bc6fca8b5cecf3014abcd366db8a3b8421ec45fdb8df00042c845148166d5adff07d9ce18d57184ee9c34e5b4f9481c121418bd674ee70675fef7f15b3e4de7a45ff66d3943f1bed9754b0cdd4d45515e17b9b30d1662bea4185929b71a961904de382f981b936ed1c5f050e543758d2162fea48c8465d16aa45e3e71c98924d60f0ffa6258289ac400b7250fc2a77cf2de2aaec9dd35c48c32f61d16555fab04108902ae183acb570cea7a87bd12cff424a1e8d000584a383d08f6fd3fcfd13f209f45b88e4dd623a462a1afb93f2e8d98031b0838920c7f61a3d981650347537b46c38aa817608c99e86e15c3d65b50c06b9d364258f8935b9254067733123bc5da7c9c7bf87801272fe15a5b4bc5bf2be98fa6bbaeb4295cc406925481660692526b8c6ffc3af3dff09c10679ce7844ba5b1d23a3b1cad2e27ab5996fd318ae3404294ab40fa0583429eaa2ceb8e55b85528c47f63046413da54bd94fe10000000000000000c7cd330500000000a186936f7fa3870e3993aabeabb99a49f38ab38e58f0db0e8c3f311440c7e627d1d2f1bef9001d492de28694aea51e10e40eda873230d9bc2ba9a2e1ac37068dcc4ce77c55d90b98873b36de70f4238d51ec16a89d58a5e1718fa9bf132f9cba00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000edb4b5c8a65646dcbbbc655630f7caf22eb2fe283ea7074394b6d6b9c0ff69b27f2df69d92e02db92be740552808a467994517fccf3e5fa1cc276cfc71b708d5937aaa721957db999ada548244d7b6b415af247a91a90207764d5b0ae5a48e3deeae8f0d1ca3771489b58acaba5f471a8ada2aa3f867497e141ab54a1c4d9859020c2f811c8efea4b5edabb0d076fc2d1852966b428550e4bedb5eeca5ab20753f020b50bfe2014033afb1cb071ec91eed6cfd8ac043469eb722fde5b66a96c4dfb00b08499beb61512919b3d4fc157ef6c4ad50c6aab6a1602aeedcb8f873e01aeff4cc9150db280d1e209fbc389ca6bace723e485beeaeb426dd22b6ef23051aa5100304aa5a882a88b75718f1775e486cbe19467f07146339a8b45f27ad2b7b3cb63c03303c1c7760cf574e1d259ef05d82b7ac05676ede7547a0b0ef025636854cc0d003295cc4a78d30fc2ed46d5f1f3c21c711aa4b87eadfffb3a662f8a97ffe99fbe202040006c7bd67a13d7926487a104ce89a2d8d5c0ebbf8f15937b42e73e3f42339032fb173d9c32435d2514d16ff33d914719c4dbf2e2e5724361864018e7fccd929f0e70d1c0fa1a5151149de69c21d7e1c6219b1a1b5ea977c034be09a2d93923583e04ae4679ed66152ae4e66bd323b400ba0d0ebca9129d591ada86c7a34da8029d105da3fb0fb386d228e3ff579e3211f207c914f9c1540d991397ba6f0c4a2abcafca7a04c6a445e1a7701f3e7e334209a054ca1564526eb65350cd68fecc6cd271571acd750acadbb94d0a1fcb68d77968eb44bea116efab1b2ced5824f1c492e2e906507ffc612aa78556e29f67254ec58b401a435152de3943aba6fe4d134fe146f5d0c2bf27f4ce49b518b7c35ccc9973f5fb72be1a2347cf6ba892d4e7c9f483c03cac4a7fa3569b3fc85082fbcfa392a90d07fdafe0bde9f3ac898974168a876e90ac72a03c19a0ee56eb522f204ebdba7289d78f69c5b0f244cc1fb938bd14594d03f517456afcf2e6a8acdb585295157f7497d83dc3421750af67546714b7a11c25bb857b778ce69c567ecfe1c6fab287d35d1010152d86119057e8b3351ca3eb0f9e50567c93614c80da7f58e313487010be379b1f88d4ae09e0f9e75a47b45a21bb28495c0391715f0ad7c7983af3d7cabb109e3bcfa3207f61466f765ad88daea502028ad8a105783ae37d92408c5e638ed10984f8642982aa0a6b8a742f57b725cdeb3e0051c71eac648a9bfae0260e6928619d7cb468ed2e8ff6eb6fae6d60527e8be7c1c2e3d46d03c2f0072822012a65277223c0647bad202c17af20164778b29e022083fd5507b5052d38e913a88baeabc740efe4fab4a2619d1260c254c105fa8d020cc5e7a7274729f494176f9ad08807591299436f2a4e77c126946544e3e4c5dcff10d47e5b709e0ca2453c36c7010072241b94d329a989965286b583d169286d2440d07959c5e455b8ee3ec6d885ff68da863dbd44060cdc87ab707e9f73772d51470040638607e54da049e8f272f70b5533205bf5dd9669ef84c42a3ce00db58b834633c785a3dff5d27491fadf4c326318c215392ebc02a9ffea821f203a9a99ae59951e0f7bf3486e6c41d5ba476366107de7cc40f904125bc9dfd90f1209f6948f2b2d441697a1d9b37c1ec6247ccf97892a9a61b087a666d681e335ada99d6f49622b27192a34fb7b0d912208e09b67e4d2decf341accd054287995b02443345a3935e72ab1a110fa903907cf795089fe6c565e520c2ca2647c5a236284c4e201aad820ce0eeca76ab55a184aed2fe26e7e707da301888f6733dd3233f11c1b24c8c49bfcaf99b1d148322fdd63c36700ce40bb5ccf88ca893579b83328dd437270d3f9e43dbfb672ce2249709bd8bee2209ef6290c1e85f853bc5c21d32fcad47fcdb68523e53826ec94d5f4a2002149dfbcfedb3cf9e1ad6e130f1176cafbb28bef0a423ac058e1509056c232df5b7fa3af46651f06f9b45c6f23300d7c5b86e63a2ef5e15af76a4762916ccaf52a8646b510c9c0c761995e1451965e83cfa505c52714f5d4b96f35724025e3e8b3bf4040c01088e91fd35701b49bd3d40d9b860b93f0e61bbd4211b7c01157153d86e32fcdf8894edbc74636d382e566b4b739758857d76c3780e96ad3a4e7d53ced84109e0cb91108019b4d98be647b5867e23a887223a541e4bf62009c4cf6c2e05bbcadac89752de87495f72e22eb9f60a896e08288b6f1a30bdf2a9113df12d64b3cc59effeec3bfc8f9755a8adbf95d8383ed75f9b07519f798da8d7d41578f5ccd99a9c4e34030864d210412e06dd6a00f5adeb7373ac14b8441d405ef3e7b6873c96d9f9984efc3d75cc97c12b261bce9ff2d8dcf514b6d5059404c0b0d961bf1c69dcb6e217314bec8ec7c869d8a2eee005", "63ac636a65ac", 0, -1282330610, "1fdc3da92b3acddf9f1c068be4ff0450d9dc362fcf6f22b703f215c32c1a548e"], + ["030000807082c403043fffde9d8c3d6b9a92de74d54754dd528a289aade2596c6572b6cf58b840283303000000026a53ffffffff83aa6f92600af8245ae76b2f2b6d507f7093558ba1c12abfe4539c8efa82a6ef00000000036a5163e6bccdaf4704680b9e4b34deffc53b2294fab6ed0e8a7fb64bf2f3527392e06ec948e4d0000000000751520053536aacffffffff8241376c02bc43bd3139aec26ca296afbf9a1d2d2635f67cab26c028073d9b0002000000008c071e06025d49d10400000000036353acf791e1030000000009535300526565630052642e5a26506d6e84029dc1c8010000000000000000000000004c9173a6cb06e38b3915ad4aa31e68c9f93724e763886cce3c71272d85b2d6b2ebf6729332d1256db5bdc901a35a6123f5f9c07906bb670993584d1b9538e344b87e1a499685bc202220732e02f8ca8161743e2a596f08cf2d9bcdb1308867d300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000834326443ce756844fbee973212dd6386e8fe2971420ba8377dafa518f57f8d57b2ceedf74644d00b33f9503fb1a9f98e1b4b4f022fbc98ff0ea55ee06700dc66688fd5ddc479b28b3a2000238ec43c6e4b48de720de171730d1204a827f28c5fd75609b7c8b45f8c2564e31605e09b302a53e918df72edf0f6accda42f0a346021b7ea3d8549a2e906b4543f26e008e0a4e7444df6c8b5d77537a3b4e894447d8020a4c1cf2a5fe58d85341758c60abf08eee55392f9016a69a43fd92e6af2cd6bc0a015d3651194075a642ec17ea9f519f33bc0509d1a7f684ae2ad4af081b7c388f826776f5b15dd8203373ffc3eb9dcd54b85cbde6d65522cf42ff120f9009e360021423b68de1abe5c17a69dd15dcece555c6aabbd40a1a923d024322c5aac1ba1f021300da3b346c53ba02efa3d47ba866d65c0a82571f602926660e845e38d99f0f022f2fe357e52bf30b4bb0f1a84b5fa41afcef531bef843aacd799ef3893aff2840211beecb55011ec907783ac3c4ac91f3de0e218567717dd08ce00f46565169b840306ad831ab1a8af299afd1f8606530d1e18ad1aacd9edf12f3c18d92ea429ef1908e2660405a739f10623b0f15440a8ede521dbcff288adcaeb8344e679eff40692dceb67768001a28e0222544de18f90c439845e33248918b1d0ce0475b3d4b81271e7321d351aa2dabf316696d5f6d01d893cd4cc59042e6067a4b7b42fef9cb42e9818ffdc49257fe61412c94a1bcc9dc8889b07eb434514228d0ddd72a508e69dc65fb744868d27771b49d8ce4da78d45083a0a7a742658ae8e59c5592581976fabea9406cda557f79bd392d59ef69578d23f6ce3668b484125938fd6b109033676f7099fc1d80be38231cc2a83cc56ae016a4cf9f2682a6181e3456bca1dc0985f1548286871b55a1c571f9417fbcfb7398789d33665a7c5dae3f6155e6da83cefa4c0f881fa88c79220d3a0c5364f9cfad5bda9f98513a7153fd715852003dbe9694a3f9ecbcfbf30737ed37cdb508253c63fdb8e21e4a9079e7fc351850328a9764ba48e8a26239a2c8313c918de3e7f202c22285e444bb10d879dfd9c9e9d7df5d998e58e973580f7d3c84942cb3cc6000bb6f4821ac8a12eaf5f0a434f9614e8dad72f984efbf55766f9cfeb630536874b9d91d78aea20ac329138761290494282a173ccd59a96e7040e77ba308d9767e145319feb9db3c56e181f978c10706ca147c44e126340f3376a51dd78e73e42b429bb59c6c42739c59eaff8169264aef8b99985b2b5d0374bee4ea41e9094d1ff2c514597b6123a5bee891421014704efe6cf89ccf4d39b34a3e92a2d131363b5897c2bcada6eeb4a5c703045e012c38b8f7b73a7a2a6d8b73f1c4727a7688a5fdb96d56ad59c5f8a56e9e292d986e4ccbc36e39c562b07aa0478f65f66e45665f95d0742685935527129c111a36956ff187aec1e563e4f470a833e214f9315f714eb77c6b9fd4484c9f66503a0d9c85c3e7745b4d72778e7e3b068d6a3081e2d5f14a7015bdd8a7b23d8480cc5a72e01102236c2632214067b48ac18ba592cbf097ad2872463a16cd8066703dc1b546ec8d1d4a8756a570c0da3a0efc4ccd9bef1ae39e227961098a20d69d5f3085378f7bde93497c2c62cbf55f99686292bdfccf676f16b9ae221a87367a8c41e5ec2c659503c74694b10493cc2afd9d6354c16414f8068f162e906dcc054fd73863713e2bbc45d2b849adac1f8c152b9e3541ef5aeeb46be1254d961181c5606377e1d678673cb872ef0732955ddf221fc9df890cdf47c32ea53d511b105103045377e966231c4ba5bf06dc1d18c98a79fa097690f03bc0227b52a5d598d57ab221e2e97c22c55b9c535c95ade11dbc83a03ff866e057bf8016866997b495e0c44d64f578e0238604454ae802fea9ceb46911b6aa7598fc2552c512aacc7b7ffec50c4c7ccfe640ab5ce358f900d06f1f979c095446ef53c52977171af6f068c6bf788a3969afac9a2639b83c16faca7d17587939bc433bc31f57e1cb044b7e217779e18e386e196c843554117abc863dba9ecaa8d9243262b4fed002446c68c37c189308d34f56751a7f72db610dcc181213eada7957bce5e65b837f0b308ea4ebc49e7094a3297da9ca4fd7a7bb4bfc6fd5ec8141dee7b7aca9dc5eee4ae0fb5ccef595733f50bb6584e953bccdb2e43078aab966ace10195974aba63ffb92477090e033d87fe160a0fcb8e7f1953496adc4324aa2e2c64364ff9afbaf9fa6a627de7c8cae16989c861554c852b90000000000000000b44ba40000000000bc9513ace821460747bada6cb91481482133760d6de7872f4c64a29acbb79cbf0941231f101cd76907bd04a0347738542778bdec1ed85cffd9e1ae48417309392442fcabd98b71e59d060413b2d531fcbfbbc3c53b23a49eaf402c47d576dd7300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a69310366929d31d22ad985379ffb9ce59e811b511cd811a25f735e481a89861126a2767a94452af05720f9f7f01f2108961677f53782e668a91b7a6f8e83c29d37a268a8370d8ac8310c88a283d9181c811b9ea4c60ff7d2800aae1e4c26f52c4cdad23e485973151d76c54eefab0e4b8002265ef35e631b0a7f83068ffdaae020d83fdc5cd050f5737443a2792565c02e0f5859854728ade70bd9a32fe19cba4031956968c655b709dcdf406bc5df50d5e518ba60c604df1022f966e7e45b460240a04c64215ae3499d401d7095a867a8490a53c8f3b53938d517abbb50cc254a80176673bdfbf13218c27da81831ca314ccbefec9239178c44c3cfdb3a42d205acf0223a1f2b27d6b81b97f057b3c81ac8bd2914c99204684427267ff80e8a499495b0304dde9354080a47ad8342dd4e3683d5125391293231b15ccc54015c952ee38850201d9566301b45f48dc51a3752860091f08933a37b003156cafd0b6003767e45c030ec15f04bbcb7ba2cb1361ff7ade1dcef491e39c77c4d292d523a14adb4f2419032b9e952f8f4bace53125fddbfce0d801f57f26585f70d0ebd160165759b88e99362ab0d282ceb382c2542e1028cdd477f166b15c0893b2786dbb1341dc79ae7beb44e5c7e045f55586401a7d2ef3a3682e3d28992ab930c069a20a13cbbd98c80aae8872b7622777734c3b716aa428db56bb62a82ce6a9b014a8b3f7e3fafdd7abf7de84f860c2ec1db4f5514f8e27bda8476eff2b6ff9b7f8607569c1656ed33f9683ec661be1a965b51d9a4f3452457059b8f726598a7ee7730b74fba3a5f03448a6a026264d0c086fe3df38c7faaf76193794c34dca91c90fb1f0d242ce3613112b24263f8860616a0ef732ec11339b30afb73633c6c07636a830cd91515db55d686201b14c827c55f0709ac2db8d854493a4a3af3cc9c3beef468691f69d04ca411f6b455055026c7181d1dec238eca3991eb7fee0f13bd1ccab3684fad1972f4ec6911740554a81c92dd99ea626b0a24350a5ae74c9ecc9480cc30bf158aa3abfd3acde1286d7880df2bee81436fd3835c38fe1619a4b28ffd887b539e51a654ec7cf1fcd2fd4eb18ea885c68a104d8fa1ef82a68899440551d08492d9e0df787131be02298e0862a0b7e1170cd8710367f52f4eb65c820d495412733024b943eab19216899d9dd547ff271103aa82e49bd5e01ddb435c028a76961f6025ac3e3f65123c607c539dfd6f0a0d271e8c1e98939181f4fed2873339a50fce2da1308c7da063c87953a9658a4ec296f0c3fdfe479852641640a525842c5f1def14d2d56d61110f2a34965457294781ec6997be316048d80d1189cf5eb3fb4deea6acaf46d4eed80c6bbf930ddf29a6f658c011adcd554d83223ef52b4e46f225d751ef06d1071b0d03b4ed9df7a98962629933a8ea5c72a15db522541816048d4acfa17d2ca6d21fea69149ced03d682e1cde03e3d8b072d5ab5650d9200645d1e63d9ce0c8b75f78624a03778e0f91922df95de077e9e04c00166bfa645f351e9cfc009d52d288cd17436f6f97e8575d942e34b1438fcf8cb99683f6a5190bd42222bd1580d1fd31b8f2a4cee9fa5120b0f2adaf13e40a3d3840addbe00188f680052b7ac4bd8fc30e231787290c18e1850a56b5382adacbe07b76ed0934fdf43f86d581b2f8dcd013069f2dd032313966073c1e77abf1626c87ed2f6eceafc753aee75c20266b25faa40d7577cf9abefc90b8da57fb2067203ec9f73b6004c0d7a1bfe2b7475d4627d6e5fcafa6a9f323313728ab96d237880bd3179a54e3fc625f37ed05889f6fc7336949b09f5198eaf256c58b220f4f40d48ab43cee438855f6a5c57d11a4b6fb65a6ac46af5ac4109288acb12d65d393f925f9258df0168cc0fbfde9da2939abc8e1afbac7d023ece0f31a364a245c000a6079490ce1bee047312bfedeb1e6c71982117d4a14c228af8310cb9c73f827b7307f09ccabc997fa2d707ffcff7ff691d965d2e0bfd66af070d56065c88d96e85df573c1d5e6e6c84eaa841ca2265cfa8016c94b13abfaac20f27eeffc274a87f4baeecdd1674a97385819c7d4121fc4c0db1f1dd65288d877de162964875ca593c6dc0efdfd49610cec273faf60ae366d8d1d06cd4127193eef7a86b385b05031a86e20b12f012283af3f4da2e40915a46c45e425d228d28ccffbedb14369986b86a55cd5255ca629d69f33968ed54bec49658c9b4896b5cdc0a0e0bb498143633e7025f87a4dddff835d16fda75335573a1ff6046a6491de1ed2843711a5c77de5387900739e656c21a3b14dddadac8a033927e19932d60edf00ecafcf0824c15e1cf7530eb18c8c05205154b34c52c56e2915066523c0bf90ac0ac52e4fb3488793939e72743113f37df872acae449243cbd7783d0a", "6300", 3, 1611897920, "3a1a5eeadcfe531bde2aa6f16623cda98d2e52b9cfefc06a95e625ffbda40d94"], + ["6c0fd52f02439aac102526fd4949a60f22e86323b902fd2cfdbf2a7601f0f9304fa2fa7aa702000000046a6a636a5c5485c0033d2127d1614f831a0fdd04e0e23413de8b3dd59fb87be45dcff6f8337cb4a001000000075151636a526a52ffffffff0325f5c900000000000400526a53de81d2000000000003ac526a906d3d0300000000055253536a53724d0ba700", "65ac656a006565ac63", 0, -1501232704, "0c9cff6586ad9e66407ae8349cd0c576eb900443cfa28917c26ce822122b277d"], + ["030000807082c4030159b32c60328b1613f7976933e0fdbce330b7c1f77ea54df907b3c232f9cccf920100000006635253ac0063ffffffff0465e6ce03000000000151b8153a010000000003ac6552e8e94405000000000452000000b69e600400000000086a52ac6300ac52520000000000000000010000000000000000e4723405000000004bb67790ef35f9fd2a93ab8f8e9e97d2fe98dfac69408860272132dbcff03dc7fcc290b506e4dc1d30731a1fa2aded78e72dfeb216d4df4dbd3d75bc4c8e21173bc1c899f0a55590b83fe9becd26dce13797caf8ec756eec21bebee44e7f2c66000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005386c495e64d4a23d069133c8f39e575398081a1c5f44b259db5315d4968152f486a9170e9d12703e39df40defcd9184dbb83ec02b39755dbad08cb533efb75baf311d08d2a8174036c82172983b8ac7be88c0a624afc24f10502ac63c74a6116a438b705253afd92a1d1737a690c8f0131b1710ad1883cdd84873d12c6cb2f6021d87502ef3ee9de37327abc62fab3cc6466689d1ab84848dce3fbba3ffb321a8032d5730ba1e0c6e2562dbacaa1a07cbbfcef2b22937b9b25fbbb7800494acf8d60b061577ba7cff9bd63ef6a539b67af1d3c5c6f5e91eb3c9c8749dae47884d4174f61e0d596792e70520ac54a50dee28acf5d9f5e0028a1b16b31240d4f05296b103304fa5ba87cc4a42bd50e1acd6ce383a10c0cf9f44b8dd6a4fae8900461517150324c1ce82822924d2843b0cd843ca38d436026fafb226dad6f204376118df692b022e27605a5a2b122122eee064987797f8e6c811b710de3f0155bf70cc2c3a2b07022dc6a42386f1d8cc2e5a1f60b1337e74996f8e1ad9d01e8402b6eaaed774b678032c6aaf7a335cc1de6f2becf80b91751fd6342434a43282f123923c10dc48f72778993289909d7326fc7015e3b017bbca874576e1079695484bb2fed4d2d19f508726065ae439ae89c92ed0b8f07048a145ce3d92f1d441a18fea16f8128d79de326fb21f98abb373e63f0adae4cdb960afeea3934744f521d9a4df6d7b5afdb55ad3232b457ecf6cb8178d075e3096990362aa465786fbf4fc8c843df9beb8d8e31366b6a08b3f1482dacd0e91483244789cbd65c6ba98ef2e7920a6f18f98ac9fee8dab1d777ee52a7e0355254bccf2996e89f1a4e782df7046b33992bb01371936b074674d4bc6119270c033b092ac85a4a9928f8216a5f20435599940337dd5e986a9135cdd1beeb45898afe9c850ca5f5b144fb090bc3dde92c9c383e0f5dd6947bc682056a01abf975e6f3e10fbf6c79bb83c07c5ff4819fe4fdcd8873273ec65c25f3c2122152ca31049c0ead05a8d20837089e28bf7828e143a2e33f245286bc3faf65838599af7cd7c3c894ba066681a6430e86c23002382aa50c302cdf01531595b975ba51eda67c23dc36e18d696635de2ac31144164517579d0028e1bdaa2aab494c97a67f4a52f5a4de36a2e6943ce8c45fe8d8a908a4a6227d56c9f88e40ceef83e09ab016b28e8b3975bb1098ce2fc69d409bea8c0e3f9a2ce237925eebe6d7f53007af4a672ca4d5e7e825cf7183e4bcc1e42f357539d9798a56eff5fa11809b08d51212398f17db09f26c0e2fe72178e3e93923cbd2d8f400d49046b0208db66a93de8d665bb28bc93fb0efdd84b2c8c9b2a953a477a1a679bff7e963eb3888175cc35489186656de4ce98ace903bb925b7108be039e277032b901ec8eee461238580017693cf9ea96006dfad23ee916c79b6a06c140db024ab0b7ab2d188c51500276c06f189a540de54b9662972cc1bcd99d1aa2ebf5fa9b8858ea12ea0a4cdbf0276def1607b466c5fbb35d24a36b56b47eba5a578b4bdb4a1cfb9f3acd9e7ad614b01404d7c3335432a7683a2d165d03b6defbd1785458195cae8ef083ca7f6e8937fd370f17883dd5249a0690290df4ccae2fdaad6f697c98e03d14fa29a8d1324c5412ad112bdba0bbd3d3f38547ade07f4caebfbe24118b64894e90329ee6a0e30e0aefdfd54d8dc57f14e3f977761110cfa2133970d50e202276307af8d9be2a1c14501e4581f987daac8d20f022b62bca5a455bfba305f91f2acc98cb7c9249a9c7f4a4c4751727f700460bd9939ba5f72e803b9eeebfbc31296517970e67354a8925bba70c61cda18f0dbefa8c0a07239c209ffa04308bc032491bab10a0f5a6c8f597dc19fdcd7337e25e70023cd95892e6a34edaa50c155d28ab87579108c1c77a69ed9ed978359f330a1621889781633bc740a2b4d111feefb658adee5fda57db9482e91df06058457bb8c1cd7e1e6d72eb8ceb8d8624f5d7b937e253a8adc3be2ba0b38ace1c193165b9e9b76b3e7e9cc7084f36530d1d105e9ba403e984b0f6c6ce4085a484235487024acf3980e969cb44bdab935924c7a6da54f9912cc593877c1a0589b8d80217b5822d131be1a80f2c589e4916b3f460efeab78ee7170c2a14c8f4866ae0e0dd3cb8999f1c897766c48bba417d57b78fe0d2d7e66e2e62b75c1f71248c716cd7eb1b961f0fb727d15caf6695c9c92024169ed1c8c4a902370cd7c2020025d64820090a9ee07707deda41c67146f2c017c3abbb6b63247f272134510b1dc77acbcb32a64f47b04923dd4d7ed558702d9619fb79490c57e49ad2d930d46d723cc781b4c4dc7a2f7c91ee0a092401011e38eeb72695fd3beda149ffec865c549d87e459b8a43afa3eedf87b4b44bcd72fb483df04f711e10230fb04", "00ac", 0, 549221536, "8570a09e35a88076aaca52440362cdf5dc615406a8d38340b15cc4e3defa42a9"], + ["2c10a47f018ae736552845982f084b821d54c772171cd2916b4af80188bb74d25ace6f9ad8000000000365526a7828ea1d043e80cf02000000000451ac6553001bce01000000000700656a51526a00aee55703000000000852655363635251654ae74f01000000000751006a53ac51513411bb0303000000000000000022e9fa03000000003bea9b2060ab077819083365b0b16e0487597c3e7fdb52b9bad6962ee25b95b62e2bca6d67fec12d94a70a398f139f66e2a17f30e362e56de06fe4d91d62817d6a3a08944fa594011006ce24c7cbc144a24b75f10994a03f37b17cdc203b65e100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aca2f95a463e8dc1f58636364cf909baec765ffdf4986fef5fef3c89cc5db9db9f7fae037ebf2ffa40da29843e2d99a914ac1d7dd625f66fbe8743298c7d80bc4721bc105d6f886bc3c19690944c2071015ea3faa5c77ba9a0822cfd4666e249caffd86756385177bc7a9953c7813e599c580abe5451ffd9e48419ceb2c4767b031ece8179c792b89370fc4a40d5b0735c8665d244cd0402249b02c5cecf2a0e66030d8878c32960496a2c59b2cba601548ab33baccf5d5907c0420712687d2dced20b02fd6ec2ef2f87514e1ae66d8569d81430fdef25e7c5901e5900488dce27b1770aa8c9077b4d5ad761f06aed23561a6c58e72250d28125a23ea6bd5992babf810204868477895bc6857c10bbd5f8585342d6a5c04459c2a7622166cc838ef4c232032e7b31253658c93904756a5eb766ca1e1cdb3c6a6fb499dbd8e917aea23bf540032cc7e78cab84830d78670056fdaed3c6b432ac924d21df8a45f6ed14ab68a5bf031a2b22ad67cf780be7945ff3f03a322ab6f7878a4cce9e6b7b665ad248d18ffb031bc2f0ac43a6f6b0d5646c48ce672509f23f29e528135d65c26aabd96644b1b6138fbfb027c4783bfdcdd17899adb3c0b978d758add39fc6a4609decd3548ee697c53017ef79c669c4bede8c827a9a34ea8c740aa4a2fbc98126d3363031590b25f2c92d45330ce1a875dbee1d92515480572b0ce979992b2e14949d1c9c12bbcd19b4ab57e68b7fbc5b8c53a8bc7221ebb842ee6c20be57568840904161d10ee880349d85a75b497bbdf97add7942e0788e9abe4bec95b7510df76e207f4447a39f78aa1ce2e9c719fafe1c3ac6cb8f553265d542f64126f3f76175b094a21ddc2bfa3e200d73ac5b00a57eae3e61f0703d38f2b01b593c6d89f8c5d3ee969e6deab7f7465ab98545da4c88b10cff30d2e8403650176751549065a1fffe713904482490b4dd9f851b427e9e32a2b436fc6b9ce5177b7158c170235e054de2b580b1ec8beee15a5ebf67d58bc3acfed099320823bf5b2e5f847e1f23aa2b38abbe74c67b007d3872fb430846682e2a4fb710b6382acadf751ab664f82e08dc1dfbd412de8e0953f495a8693447c4e89c3a70f4cce9309b402f5994fff5dee9bab9319ba464a130818246ce75c82fc50ebaec99574d9f344d53af6d650cd6de191af7f8d39a3a1e3e6537d55bcd00fc97a2ffe8d9b11e8a95862449cae32e33161ecb0479f1d4c4018df1b1ef73f230d12cdb33c8de7695f08ac22ce589b7849afd0a8991954fce510035224bd453474d62f9d9257e093adb190f60a495af00f9e7c107eedfc67b972b515d55a8f4f24b4249539a1fc3618d92f9b7d15cc3d4e1a57ae2146e3912a0d53383b6dfdbd36994007418125f0f296e0eaa113f71891064d11d946601f40c19008896eac83ce5cd630c908e8fe813e09951d1425c6f0721f560b08403ebbd9994ceb561029615017e656fcae7ebba3f35608ade6652a494700f0eccd868b2533bd9bfc106428584d4e8243d45852a3ec63d0cb1b5aeef78d9ce075f662e7debec31444544f5978ca6ed5f7ea2da90405c85cfa36bf4788273e1e79559838125af3febf62b71bce618f34a67848f3dbcc939029d0746cbd79c675b49060b49300371325b8b32f980865d48354e16b8a01928d4c23eb66d4b063ccc6fe773e40a34d2f140987f919ead929f52963f37d94a5aac740feaebf469b0b6131d8725f09336489dcc2c9d71681330427a2df7dfc4017f02347137b51808c3498b21a31438d6d015e3ce916996bfb02159a1648343b61fb93a2517ba07b7ec65ceede306b5809181d93ee96e17c69d415afc76e5e8c69ba442ecd2b16762a6db1304519d50801e6860ca052953af74234eddba71f0a44d078fb61095b1550dd4f8e6b7fbeb32498b44aa9feeedee25a304c2cb1aef0a67e52f8dac2b8c2e2967038c4f0fb1cc2913db916baa2028bfcd9d777b8272f6156b03bac9c196879927908881a9074f084e82ef894f5e8cf2f3651baad55b113490329b0d677b88f5d16ce27258ba97e21fd443cac229135d2c132f72511b7c04e43c85de02f450ed2c9eb2c3feae584654d6a73500a75d198f4dc50b8360e7ad703a3deef211e6ed2b8a6e5b54bad6e9e6b9c54476dcd167b12e02ff3fd3aab5d5de000b7b34871049dce6f1be4314ef3820ef96ac9371b1c83930cc720f4e08e06ba330fdfb13a56202a58991b5de3744494adec8c2644572c20db963fc79bf739b256bd27f98477067ccd98318da9cc3e028310ac00000000000000000e6751f020000000045a6d21df9143c0592020169bf149967336bfffd6a0881eb255c2aaa774d45b89d4cb570423cb8629720622502f699baa0f803e300559d796885fe3e0f8a1537339398a585be18ed135dc7175fe6784bd5aae1a2b94fb9eafce6031fef779aa8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002155f58054d975797aa3e6dac041581d41a829d18bcb65992b4dbf04fa1645933b72f7d78b397c18a972e4d1d033028914e353bbd4e19f7b205f48e120f2801d4652e952a4b9ba5095a38ef12458a1968061f81711cf153f6a3444f9819da2d13569269abd7babb514bdd25e59acc497c3bbb4cab504bb2c15b4eab197a0e70d0211c6fda247cd1786174ba8d22d3803951a73876a9919003404ae09b19b8913e8032c9c08925aa988e57bc6a7373771de3dd770e5c4c42fc1982e95ca1af9ec726c0b036dea353e382aaff8550e292ec6c9f3e8bfef92e2a6881569b001fb8918fcc94d1f40e4da8931770f179662d49d44268b89901fdd77be4f46fced2508b3f46a02069f52b5b5e8d766fdf35c9563bf581a969547342a963a40c213ae9d5715f2f2022b21ed06a084ff3cf23531a7e264b576a0fd448ddf0a1f14b6e5f8a1812a0e91020393ff16142b48436de4aaf52b71ccea7b6919d6fc97d87228a2788eec6d840e021334449c83e89a525108b6f44a19a05136ba748ffe8c86d655bf7e2e8243a59c032024453a645e801b6cec2f86e98df8cb958399c6048c1114c0da514bba073a6fdb1dd65b8b987a417db40fb3cfd14b6df6b832d9029eef555d720d94196b088c9b39b400a9b8382458142d5f6751229e200b46a7d900bc27838dc02bf6a8b0ac7bd95ebe7f7c5525f4c1a8624a1ab8f1fd030d682e4f73d6625356fccfd516a0cf9be5ef37f103ed9958c2c0cff06d15f3bd61cf80b9b7573bd94c4a678a1ddc0e96f2ca60e32ca47858bffe9f95fa742cecac6c557c9d1b6406302ab62b4ca7ea1aacdf4ab2f6708874fd9bd3635fa20d754743fe78cb6c4babd1a5b5bbad979bfae61e54eeab40db25b992dd6f663bb051a48aa374638dbde0c72cc8894a2d659ebdb0a5e661a3836979c10eaf08aa1e73ff9eabae71cfb3e1bc167ae50714b35a0721407f136f64a727fc1cd8a3ff8aec2e5fb8d33d11288caa1de9fa0accf4fb70ef4c42b849f9beb173616fda4812eba0bed11a9f91c680fc2d265053fe7b8161e2af8501ce3121022a9808d1b0c17d2e1bdd4a2ca16caa37e1b171884012b5dd553d6a826916e4590eddd3668fd952a25b4e38ea5c413c52f7f8e6f2039aeb1581171efa3eec50c1ae10e730771336c4d54932492f6e9d31ba58deaac215ad8b8448dfac3732cbbdcd318a186c14cc85fc91a30ce77498cc1f22418610b1d8f23ad8a6f9f289d4cb78ea4bbc9e279111e0fb583c6edb5932f2f999e5ecde7efacf133c17fed5e2f054fafbb4ecb5319f3455e8b91616dde0f753fc9cbf6e4861a00c0b4e01c573df026d8916c18976bb72549b922c6a789d535b6920048cdd38c5751b52572d2d282401e2f436b30cbca701832e9e7bcf8297dc88f52a81e1024111d66635698db78385dd3d39cb713ce1f5029dbffe2600d5a61f91469db6f25a4a17c2d3623191ae517d5312ddde7e51b58c3ea344f60f8716a04646f7c295875f85bb6edab12b55714f06cb2b11fb992ab69710a2895e9cde9523318359917855b329be6586568735a6ad751316a1d31a061c760b0e3b3d2a26adbb95c71df90214262c920e12969e0de85b5f99fd6280aa1467265fae4ba8aef5691a9df8ffbd05da92a1782da038847d746457fa263b6fd0ed958146e3d21fc6cb494b51e3119438e8e5a3df7943b72cac05685e8ae0fb2808d7c102ab20949e27f0f68e7c971993adf95d78ffb7a333d4aa6cfdecd1cf72627656d53d71d6582490dfb550c5f508c1a22ba8f524b6e7d481e06038c162861543905b89e68d523630f21f7476a35bac23e6357d086ae5bdfb5916ea4833662ed25d43051e3950fe43f1da84bb47f067d1170a0a856573b1f4802ed8417dc2b0f0a72c87f73c4e0fef91fb40bfaf210394e34cda1a13e883e542b24312538a7e925b94ebd4a8d3c92f9b02648b293336063bfcc0dbce85a4276b91d791f99aa17cda565e19c7284cc90c6fffc4f615a89ef6b2f343e651aed0a318c449baf6a4a11f5e2f8135e631b7c2b2fccc426820673e89c10dcd6771d61795efd1088cef6c9e755cda978ef58c2bef4914ff0ad9a2f0531d78d117ce738bc5f492e89656c22a74794adecac376fd6bc931067a5979415ded2b6d3ff62c93a86eca081f1f9b7ef3a92698f1536204b51dd7b779c650c4420c5501a53fb3907ef1c7c9f9c84e7814b8b40f22dcdbd420ca6df72b17844364c56e4ab7e159fae5b6d623fd1b57342366198c9ddfeac5a24432c57799ef55c1164e51be9ebfbd000000000000000099fe1a0300000000d1207122315b218ef5fc688d4013e6ec2e223fb525690b96be8d6ad7a7bbe3d214670a997ff66913af9a068ecdacd50359696276005ad908a11a48890537fc0c077bcd7855c647faded30ab36434f5daa62f61c5af1b586951757e4c6ef10b8b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072a38f56b7cf7c8717b2d140be4650ab292147b82c1c7903818907b2ffd98b04dea2a55f008bdd6ae309b433a2e567015f613342b4ee4bfa38bdb14256d049fff2c9690fe01e08fcbb332fac11c2b726f6474f0f312733ebe1163ff2293dc30f818aba3f2f9350f9c7d1748898398272bca7498c8de938cea44d9719e28de3d3032d63a774bffca32b992fe194e5c22de19928d31cea08a008d0cdebd0da7c869d03033102ae29abf32e82a453432761835438b4f664826109c618df4cd227e78c0e0b05807ca016592aa16c5f3925ff3b939974a3c226d6cbf342be52e988a8c5fcf3657d8c93a444cc3c4c008b48843403e01c8ee025f52b9cd27518950aab238c82021373be65df191c120a61740a95fe221e21c00f94f244a6714689598c7000e8250229bca8528c7c05db53ee76108304c6a54620820e1408600f0fa97ad8e360298a021b6114388e3415e6b4613295806109bde183b6df5ad82769389a99267e70dcc6032bd0c78ed89de17299257ab8079023575ddd9770dc987d1072d8f097cb9831050320f5d95da7d5c0acfe506d7447e94011a78495b088ae50faba7ccb2cb9b452b8eec67b07c27261e09cebfe8b07ca26acee877e4dd6ec5d5d73de47f695e91a6e4f88861ed91bffa77bb096dc184c774093b181f4cfcd7c6ca0f371ec757d23be4cde554e27ec4000e1d8ec38db889ccb4ea7ffe0fa72da58a92ddfce39042f2eb768dfbccdab00f42ae3799d1a47404481f74474fd40d3f9985c8f0ef65afc062d131610299db851c4b138634277d5572da926ec46bd08c7555b78f2d1a0e8930b472571ce2fb8e8f2008b624d9f8c0e33b09306a8e883f3bb25be9d80a64a27ed67c0356a1890ef16ae6213885c3f86e576baec5d266522de314446edb6832e32750bcea0e0e8c499ffbf78974e353c084ccfeffe0d2598cfd673f7892d9f9b0771547f40e83fdb8607582afd81ab902d3dd1e0df9361d7165618dbee276a97f000014c91d164333311d064d02fd0aea1d382fbe2ad47c48516793310d9bd9edc7f194e553cf9d7f4d7f6ed10353aa91a91423be4876477649f5620229656641b32b5738888c08012d7bfe199c9737f1741847257396b9c3f87b35ed02631fa4647f525b3215ce7ce3e92d8f7462b93cb490b26f82c633a645a7b81a6fafa5a8b64e3a7d008c3533f97bb64872d55906341012300ed7a0db4de7c5cd0af61350eb6784b88f34e7cf855002b3b4f7e188015a43c4ee596c222e711195d244fd4783c8756766121add87235d27c10e8f181270f7fa109e8e02dd458c03362074046de297f5532be2c836be1ec4f05ca3f3ed412ac559eb619b105c258cf76ad3cb8618851fd4d5ad6664281b7448c5935e821a820aa077a95d20599ea014a7eaf60a756439d5c6fa6bd3dfe40687e3630489f06240799dfe86f465e684000812e5b0e83c23736ee61ce1d910a4aabc88868e9c7487ada29a19e739d91dc41ad68484b70a309c0499ddd77ebe78c9c107ade70a94f70030403bf39da276c28fdb5cedfd878a521bd390b03976197c347240e66aba0f4ea3004fd181b6cada681b3e6014139893ff997c1db3a14295a7d5168e80fba760ba4142af16fe527729ffa64e6abb0ecb2a37e5355ecfaf7a4e94326bc4f2123c4273667e6f768fa6342c8ff7afaf40cf93b19bc791be364ecd433c179e82436631f9447e3937125a276ccd733ad5a987ba6c4cbab54b036f2e2cd519eb91cc52f23d9dd948466ce44357a14fffb5346a33dc365ebd6315b81b3408989991ec82233fb3a70b0ac268a324c7c574f3d925473f747fdf29099a81e83570d6d94996de94e4bd969b3de7dea494b3ca00ca1fd967d77052f5ea9f8b71556d24020b556458588739755fd89e5b68562fb5575bfbf01ffec0872d18536356ebc05215e481e6a3ec04a2081ba2e0ce0b33885d32d55527336524fd21070ab07902a4b7fba70a7a7effef1cf850329844c89c813f6187769f2f5ee93960aa87e8aa72a68a9393dd1ff9c9ef2340568fb1acf68b23c076af7ac949b001483d42d65aa3647d6009de4a6524da313c15be173d545fd64766a0e84b21f5312d5467fa3583f1684a06a73b38ab132eceee77fee6c4d685426ea78b7d934a89803baf687f34287057fc1b83bb34533dc6e8d2a83147d1136c7948d61ddee748c0a5b6b980df484cc865e156673f8d5d3a6f9e9d5226194d7f3ff6d54aa2f5a757de1e3857ea9e79d968cfdb3266eb2953bd172b66ce16f9cc57a5d63991088b34f357c3641e9aa70800643f9253ac3c88804f84957bfdbb95dd79a4d44a00114f9b2fb55dea75d7e1663cb1c5e172ff7b819abab1a18bbd942f4fd10ae7b5a34957d34cac10eb45ce219260105e5c8fdfdcb8e7784562c206f3966813d998a028ede780a", "6563", 0, 150238741, "63b9b7aeba960c7649c1a78693f7f7b148e953e5016853514b730a4a6d60cbe0"], + ["030000807082c40301466defa4b872f4a9e587c3a7d9cd87b8c68b1989de7520db922c6a78dea51a1c010000000952ac5353655153636aedc353c5030df589000000000008ac63516565656553a5dba903000000000763526363ac0052849ddb01000000000252654af52a1c000000000148cfc104000000000000000000000000fb2641b9655f563d882c6432279a83f7e74e7fc0fb323aa128635fb9fcf03c37d739aa8ab394f4b8260784797bba6d8d0123e1a098eb6f95737f4b1564eac5a10a08f99e985ca8ed7d7a8e326d15ca26eab9dcf2aaa9a9e69419fc78c37ee39f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075ebb8dd3a8bffa0fee55267f6028825ef9aaa9dbcb2e21a5c7bcc3c00e9e3d093d0e01120fd4b68b3e227e19f411e77ffcbdbd0d215757422325a333a8ed9d45b64a9315ad6693f5a7447d60b2cca9a55cc919a103440564528bf9dc233852c8704e694534d19e870820385954b5d442987d3c6764157ec1cbfd5b11d09dcd803129945c51f68f5ba932d7c3e939ab025f4c078a612e3ee9f9822061f06ede4950327c0ecb051a8339934a07efeb48b210f791b5366f71641d4db14480d85eb9b7f0b04d38b62dfd6c10bc40cd205ce6fac755449fa8204fd956299b35e78d7c2920a64965e667487004017b870d9b6b9efb5775acc2125727b615abb2c9907ed25d1020b3525bbb472ec3cfa9c6a73ec2ff485ae148e98f899c2acfd10a65c8bd8209a031362922e591eafb8c6e6bd9ff0195df1791d1d8b6647a439c714d77ff33a2f0302136f423354043d5c507b7a94e6cebc38cc3ddef5f27e373842bcebbcec676ff40216dfa26dd75e1bd3ead2b2dd1af9ed2d5f05567350436b87d24b88acf8d406330218b169209e4d426de03040c0fe37aedf0e913e9aaa6aeb7e0bad7b890cee770a423ef21f548501b8338501d179e8c3f1456c25d9566edd197be864a8900163c824fb056ba9f2cc416afbd801be8bdb5e5e30c1e62fae06a599d2fdd074aea7d7e2691b303df8f9ba4e36e58c16e36babd9d77bd538b7592c1d50a0c1a5c3b1bc0d957b7c4be8c76ecfd61ec51dd9168f7118689a88488cbf0384f64736b2a7ff580b6784c207cc3fbf1be633098761260b4fc9463e3730abb78724e25ea5944af0acf916fabc7aab75d1ff982d848b15c0b3410f283d0860ee4a7e5a1c11d363652472c2ec1bd86a678607af4e6ff945182c16c61d3490a33469c4cee8fd58a908b6dda5cd8a465145c87ebf2ae5a568ef04c71beec614774b1450f2b4ef1eeb615c8b695ba0c3ad2f1817836c904a75b749234242eeda1196235664c8251c10e262602b5fb23326f0dcc2af125a87d08549fe8e450af2a0235e439a90636d5e0830064768fd268eb1aa4efc662eb3fd0b8fce5c2eb95dd5440ed1a80a25b76e77d95c49f23ce9f9df637cbc5f4a2377fcc0c8aba0313934ad5618bb05992c4b8f07175ac298db6555b2163954397b111598f23013ebafe19752e8c0135279657990aaebe50dec880ddbdd28474ee5e81489d2953b94d523b7041927dbb24f8e7b7d65dfde46882d8dec56458e69ce655def147617d757fa850bc1d335a2fcfde91a7c7ed8fd74e71ceffe8946c4cef35cacc32b281926b79cb49f18f5ba4723ab1c4df3002c29053543f3bc3481fd0e6f19b084324efe866bd7a7b15003db7f4c6741afe366dd42912e4b353592bdf8647e67cc378844fec30076adee39c75113c0533dcdf8315bde80298f68c8e56d0b41564fed6c25d93c362ecdb3f79d906ee3921d405bb89ba1cedab10761ce5928a33366045b7237a5353c4271f3beb6368a73486104107a2f67ac12d4167dd37f7c7bf229710b8a3efdd5b2099267bca2303e36ef1c04dc6357d2509b2a257ee41066a53850da93b42390e6a3f2b6af1dfb61c7865ab32394e0a4b89d65a93093f145daefe31cec27e8d9d38be8adab7891da7badd742bae2ab8119b2defc6c152389a2a38eb974cc36b7d55402842b8fe8ee90e84482f70c20410c8126a47d2ca4340cb26fb75ec83ad6ef4e49bde6433fba097632bf5f14964ab1264b965e5d5c447b6ca26da5da91975c941db867f00d9fd969cd4c125d291fbddda13431c334404c3921c5f279c2e422d8009c762ae431d83b2ff745db0ca35f2804eb3a886820aa6c0d1b53fdae6dedfbc7c1a2217ed47f548b4eaa3722cfa807fac38b846891e30e0132c543514a234dc4ec71c00bf896a4e078a6783267d769cf8c21c390403479e4eff5436808a767460eb248d2578b8a5a5cc5a22def9de48b30ed4272d0aa3b84cb8f1ab12a57af265978c1deecfef8793b20b7c043f8fd44c35e28e8ffc67a00b654406a4e5c58649a8e0b82f6d61dc19edc6664bcae79399e0ae8aeaeb575a78d1a533b9055d601a1274c5df0b7721c63b3f80e1de4afe25dd7dc4b7d1705c579a3c0f189c56ef9605033c208cd78a7faaec03a714d980bccd0a766f250b31fff87a9b3697b0ff4a4ad9dc1812eb2607eb5a9662bc4a01004bd728216cec90f1c575b4bb183cee8b87feb9aa09ab8b92c618e48743ebd8afc8d68c2ab9793c89b44ab6b4de5043463d96dd644621aaaacb06064dcc679950c276a6d8f8eb929c19876e94297739c707527a1f56f8741433fded4e6cae65615e7a56711d94efdf5d684722244ca4699338e4a642ed9009c44a488a4e376c4bfd9cdfda68c41fb66fcc2586cdb306a9db9eeb31748e3efd1880095755448870079fb04", "6a006551", 0, -1451159415, "ac810807884ced7ba3eff69704fea8785ea995a9f5a7fa74ae141dfda48a883a"], + ["53d1a460039e6b2d64ce2feeae7d165cc1fb592a3e9c69e6227483a9a8ba0ac9db2135fc9e00000000056a655151acffffffff1f274b4d9fff0e4507e73dd01e177e29dfc253f0cb530c6494e086eb25f40f220300000003005263ca3c02fd31d2ba07585dcd2a195885468455726a4313ea061e510f94afdac0b8bce9810502000000025363ffffffff02ebe33e01000000000067d210010000000007515152536a5100fb7ccb7d00", "", 2, -156355169, "a877190bc9e82a3a2c3ed9f1ef410250791293133f75265c6a298363c85e5295"], + ["254cd82d04dcc95a5ca67e4bc6e5ec6d8a6d71becd53956b27fd2dce2f368acf036969d9770100000003515351ffffffff056f6b5635d9732436618ea009b4edfb1938b0e1d0af254a9b04b2b3ef84a9ce030000000153ffffffff62bf89cb92b3479fb1e3884481111d0c18dbd297ff647f6e586ba63377dee74c0100000005ac6563636a8e57871fa33e05d90e7da24e9f4fa5cb37f38170cacf506d140d46420a838c8dc925258403000000056a00acac53ffffffff019cd6830100000000096353655251ac656a65d100a2e1028475d303000000000000000000000000a50ed35f0e5eef3abeca0b1fcee038cd67fdb76fc73e20cb53e91eb21860af074564ab8e56de773ce0ad21fb90102d1deca9f3e0522bf2575c0e8175ea10b9ef53e492c9a0d2bbca18b4f3e197c35ce8b16f0086ff25c5b7bca772ca74a89f520000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ca9cd530037a19413d15d8d3696ce7b1bcf981d6fb4f94c4f9af3e7d0413913b635d860e6ba90b577f874faea004451cb91b919f00d62f4d2810e90b155a529e54c4230c8d87333a7b888955370b6bde8e24fba466c98637ecb004af993f46c49d641ba4296ba3155ce0f5c558ed6d9fc82d7ad2f5c507a706421520e785340200f029ca1b9b20dcade2129fae113497b12f45db76db411ac165bcd1a9491080032f436ea3596af6d0bfae9dd384e2668d93618d4fcca17d48c0daff9e49633dc10b05ce3ae9e5db5dfb84ec2656302760d6a06087df52b97e9dada160a3bd072f24fed01786075871e94f55106cd6538219157e34cd948cb9e1781a0f775053d44f032f87ecc7b262d0381b642cfe0c12cc697b52331ebe1c188e396426980696a491032730a8ec68547bef23408b99cbb9bf3755cb2864830e32cf737ceb8bcefc13ed0212680802d039375da72d03e8e0afa265c99b7584b76ff2017e72f073ad7fb0f40307e7efbcbe28260c6a99d6c606b22f304a012bae53886d032662352c5fd666ed030ef54da47fa050ccfa9dde1b96fc529718db13c013f122b6a2f33703c1d6dec22445d37738f3cd2c4d0e2ee5ad7c10f6c858a2637cb042ce1189ad50e5257209f4a0bb6cf538c1c49c117b3c48b723fdf036414e66e9890aa8b7d7101f54a78085158ea88f5505e9d8332d191d0c7cde89a03764cda9258c317edb0a692e35e46c7484996e2a0327f4d2b49267fd1b4af16da4b7f30721368c773256898899b03d9adafc25c931a47a06e4ee3b9490834f7021a89bf499f33837a1b95d8da84f00a023ea291683c1dabbd2b402b30330cb0f58bf38864dc6e0e777330eca120ae4a5c1c30302f27cba8a9c7cc7476ff79de3f00108347b6a244132807d273f13688629b46407bf80069a3559137f723b511e047e5a11ee1f665835fb510963e721b1bb6911ead6f89a55ad0f2c1986c28128cc55e7ad4d3ad3657a12c4ed958f470961b5278aa331746f734e0729fa194223007aee29725f8822d3c1d37311cad215dc3bef5c4448e94067616004317db6056e11246fb7cf0617b51112cc44d95d21b01797392c1eef2875942ef5cd49f463fb9ada5e197ac4202287f7a15db2e4846330533cc85610dc462854331a7a9abf03d40a5f4a094fa4e17f85d015823a850477bc2c4b64ab3e77f4ccbf38ad94ac16799ca45e30540c8fdf254cf83144edd5cfcdb61220c1f93553bc51d44684b23414fe19a47b031a7dbb2f4d9d65437afa196322f384997b9419d7df34fa70a78d078f26736551e097519415f15402ee8b677ff11e60dd5200e5d799c2aad38c2db6ff6607b454b092b5ad28b28f3bc0e356e83a15c90395a41c4eb3f57e4856e361c687af13beea4bb474f3f08083e6221a4fcf92a7fc3bb4b9c21f3c51c445fde2422e44917766920338692228a7105cb36e5bbec5612146074cf128ba86ab5f36b4d4637f303cfe6c4b5a298019adbd8c876ff48650c4e2a9d287b939e5c457aee445dda96b248768c3cae1cc12878d8e3e910387fe00726d14c82504eb87b85585357be02e633286a6854b78f14583d2113ee6f41efcd02fcbcc3ed17f07901026e08518d00f323b558193e211a0921bc306744976a2658384b81995493846fc3726ec739d9167d7d124cd0eb5a967f163be41a648f40db0b3b4a3401d421cd08d93304a505443021e6698ae664966389868a3bf54e098207b24f18450f43c563f1fbfe09ab2e0e7cf3f4c5a4dc4578086b886f92df3b4a4905b4889c8b7abab8d4594ccb5ff0582f18f5d86669583eec72045d4e57c2fd627bc86ce69346a6816bce8fa431de4d898872c02621855a72bdc7019726d009c37a50b37093cebdcaac26131a3702b7d61f86cb0c7b6cdfff20162c366d70488e04720f76ac6c71de5c170bc7118121a81738e01cd942dbb1a4573de64309a7409dcecfae310bfccf69417f0483d49e0941482a2242d85d85c9891ee193549caba0820482ab9891a73f9f8e274755596abaf28fb678a50a6edf6b2f9646f87466112c59ada9e3e98fa28f3410d3fa81e434f92d65225905f24d0417aca4e48899bfc7f0c25537a3abe4d4d048e701b662d8c940f31a244594b1bfbf6d7ac30644e1048923a573401b2601ae36c04f273ce54ad5598593c993e86f324c22e0df027bbadfe3fbfcfe207952cdc97edbef36a8140736712f4fea2b30e6e187d8e2a856968ea95c2b8b493d474f5e1d807fc89a38a55fcdf5cd8545e5bc25412734fcec9c9a7ca48a10c19020000000000000000000000003ab1104700278e6a9d92234e0a4a128848da935255702d5276a8afd289510a22b63f03b53054c615045e6d3989a5ea4a3c0c96411568580d93fb7b26e2d54f39acda5033c62c8159671bf69fb48cb8476caa9881198a0214784f86d85d16c417000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ebaa9fe3a57a25e88da04f7b86b69143a7bfedc51a190cb5bee3a0452008320f8c4923816c618a828b9c64632ca60572e7cee66fb3ae4ddc26aa5a951f02e2a41c84cbe3c3415eb5bc6d2d90f5bcb0ac1f6a8449a74d6edb080eaff8298e89180062bf8a86ecb8ed71addfc4211be317c701b59a04bb6abfd82659b43eebe850328863731edf47942ecd96f35f159882434e98428f21c57d2664ba0438250306c020b1d95df6b30bc7277daa6d839f951b605abb2f252e8e0942c93e5b483c14db60a0253ab712a87d25a3650fc310d834f580ed587dec72b9d543f8f602656ceb9906c90653760a215fbbc033f0c2024185a849817873cd3ff84193e4529f0196b64030dd319d28d0dddfdcc255e055a745e2f39188fb4bfdd7abc4643c03158f92ad6031768a8a98aacc37649f55b6a6e620747c92d62196307dca5002074c77ae2bb0d020ad7324d08495ba51ce008a179585516f945bc66d0f148995758adf8879d4e1d022e2e96bf54352c9bfee1063c1c45b3e0f940ce3e48c9c43f17af32f1518f6d9f03163c0753c93be10ab8c9647dd2f2d9d3e748fdd5939e904f3345ca32db0754659f86e6733ae3d77e7e17edf2c723cb891c832654dbbb04cff0e03a6d7c15a30f9ba2d44a3ee2bc5063e3edd5f2dcdbd53311ad4840b9eee59483de4ac043ba68d66d9f9b2e5665d97aa31357e8f0f55468f71fe3cc9316c98c52b9d4270a8f5062ae17f9a82bcb8b90b32ed33d517149071548e6a30d78ce7f5f04971813b230c64570f49a1f6f37842e71f1f75667a0431d4c6267d9490e560829caae3e08af0c36a347520bf585321c087047be8a4b0f949ceaccdbc34e27c15e9220490585b7679d845da121957883d4f849c7635b5a9980f9ee910457089b69cb9b4201cc064ac7bc34be222daf1e8f2a7ef69a63e6faa8b911d0e80de9880caa888807d9283f36b914adf95563bac392bdc582d55f68ba58f8c4824355ba55b1d080e3c79b3d7b51b18dd3afcbf4da73976f0f56a810420ba83d534d8024130fe7a7fe0b2e2c6391975b43ccfdc642bd3932a1353a671a2942006c09f6eae50411d41ac49a7a1c10b0ff0a09a91685586a851d8a912f4bde044fcc4ced18aaa5a5de936bcfc00efb76d784f2c64d0246957ee50cab62850bda37d6dde570ca12a13bed3f5a5cd51d715162adebcbeae03e2b5267010a0157192c3451d745ba5cea8302ef050bee70acd72bd4565897a39be60d8a1be672b1ce40877895b28ad193f371c57c7742cff4a1e81cb8b07feff4991bc515f53c61686e044553a72a6249aa6b7b707e0610bb8bedd19b254ac0d6559c21fa0c5e9931e40661de33cc6a52e4f482f1a3a6673503934bbcd07bf70176f5cc44ed97e43c25fe9630e277c3b9ab69b8d1069b658fb3b142f535f992001f420d8af4d05610c68379a79d93f2b83766694f703fb2dfc1525c8c62a88928286bb6cc8fa17002919b9b894038236c3378e3c1d9c793e38adaa3be53e6e1620cb00be24bc6d55e9f9f0c15a26d6f817b86922b3fb29e71b224171d5949dece521618770990ceae73c9de4ecd8794c58e03fbc0fdec8e2d58d504224dd87fa3a986b3d82a0d1234d9b99624e619083c8136a2885b21566b2498e7c313d6b017dfdcd7101da0e3fc2c29c76c30cf3ed7ff9de44e4195251c70183f97b46c73b0063334634537905c6d6e483573a04bc25cc6bda15151ee3517cf8adfaa7a669d6dc9f7da818445be3229c074767745d3adb55c57ad96dd9e636ebf3752d0563268e755065c74198cce8d7b960eb90c07594103233434fa3b46d00126d19fd97aca32b1a967c423e44a6abbd4141ed26834618983bd49f942f3e6ef3b949f7d733c19ce3a787af74ed46b591f73b0b2d0fbb9354bce002468a003127f191e23ffc45fcd8d134916312151cd2a4aa3be09ef4a8920dea4629ec122b60622451005078481da4df503cac2904e43c6afd4a3664234784239d580605e1589b9cb6a12d808242d684b4063454fd1e24c99d1bee14f540ab6d7d5ab2d52b3d805496bac14810442cd0b956ce38d97f849508e687f661dfc27e72ec047e945d8a7e75fcaf783e89771ce01f308afd280a9819b11f94ff3af952193b88c7acdc13b4213eba921e13926ee7a3cf7cf0ec32576b087b321b5a2dcf6de0c1ce011d515b77d0758bd33d07a69018c0817707ca5145b06355fc76687848b7fc31d790ffdeb885111f9da6cf064a8a9eba87ee6f81b892c991c0e1c93c2897205b91d6d52b7b63ab91bfec6192c0ec788ce121eea9e299bd442cc9d94169841cabca7ed88c84ada7c93a73d43c38c25923245b9839fa1b87335223c72514091e017950175953e3ee3ad0de2d81f6e5ae9fed30ed4cd8c5e38353fcc827b190d06902b4231c8166659701ec602", "63", 2, -307363047, "81648795368494d20de9d9d1a487027c6b52702838851137583f5f28847c300d"], + ["f28e927904b68bf1d1ce3c1307d631da5951a948f35247fa91fcfa66a995e40ea098a84df703000000086a0051ac005152acffffffffd6cabc465d77edefa56173f6820aaf52173603e2f3244a00f8454de70802752e03000000016a00dc457f15ad00639e05d33173a4ad5b3a5c8ce7aee23561362d57c0fa83827258c580150000000000ffffffff8f1b4784e5bad9aebb3f2c9f76269f578c2eebd1a4a855dea357f18707b1bd7201000000076352535352ac63b85b554b03582645040000000009655252656a515251acaa285f000000000005536351516513c5ce050000000009526565ac00530065630000000000", "6500656a63", 1, -1510038594, "3fbb7e25a69b626a8c79369950ea1323672298aa1bec7065b82288c2db4310e4"], + ["030000807082c40302eb91abb96f18ba59fc1026ebebd29b76ebfbe7c03c23b5dfb61f0e168e94860b01000000055351516500ffffffff05226ddead4353e241cd1450d8e05ededfd3c8bea42859a3611af9d5a8bef93d0100000008ac6365650065516affffffff0125d230010000000001510000000065c94ca4010000000000000000caeb5801000000006ee6c76883a7c76cac0adc578a92f232f6a371f489421ba2d851e5b8145b8dd13604369c59e2d8708f0865227773d91aa12ab908d7a1efbdaf96970ad1ab81aaf86e723157aec8215ac5b2750de9e45a83b3d8f223187265d30da150a07c6211000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006cfc54d8f298fdc19bcc7da9f197b2081c8ccf22f6d9a098de95164510f65bab5d6f770edf44164721528616bf2a858a07feea7306b4029549ce6b98b4e62b03154c85098880a15df9bbc2a1b6fa05e55a8bb81ae1d1f921e5283dcb363772662825a738cb5c9b22ea46b2fefea961564fa4862566453258d220f15c8ab8396c032aaea14fdb2da60a66e4277155fbf52096d7fdfbe1ce81ac9c7683259878229a02293235f959fa7675fd0834d885caac7afc35fa2d23ccb801231e5f9f87fb2a5e0b0030a6bcd089bb3223167d7b157eedab5758fbec00da70e91e51264babb6b8b7303af7b28a665c30324f1a61c8120489fd3d76be2a75a1f1e345fef514e65f29021c28ba73e948b95caed27c9cd20946b77b19b24a84406d3b1ad39239fef4760b031fb1057ccd94e407d43903ab0fd14f8755b434450799f59ea5aad6bf689afb180323dfe8b234d05c51dbaf010b51168d03f5ec658fabf6ddfac9fadc70a3d612f80204bdb18837794b3e684434d5565ce6595c24dfbc880c41c3c515d95894d99732030b9ac845750f08d99e3f983e3b6376ee97c6c1bfc7600afed66a3ab5a562d8767b2fef3ed82b0846332354f63816953953fc7b3f7957b17d23256bdb052da404ddb6df5ffc9e746162ee5a6b172590ea58c179cd5963ebfc0cb5b8ca2d7184affe77da76c1367016ea088930c3bd7a1216d652c16c5839bb690676cad055e2f5d06855ffb782c88e8a28e92391d9f43ecd348ca43514d0b0d43c33fbb5690ff0c7956c0c79026b6e0fb2e30c9e6f7d2c08b0b5a0e819456934b3901eb8dbeb81dbf6030b8f23eb5f68ea95c909fe23529b06ea6d46d29d1292ff8292be55dc8711304426182d6359aca2db5044eca6be643a753c238306ab07d4b0df45793a5ceafd581d480ea44066e6d988daf81ce6d4f1c522ef1e09782055abafe8e470de9cd997a56204b905a5d8ebb7630a06dd6b8179799f2bda174a085c5f1114d721421268b8ffff474c72041d1ac695b9975eb8379843a5eb7b7e96dce9e7afe753af6d4a12542c442d4cf796baefff6b0e279cb6f9ca5eb0bcba058ac58f5ed0f24ad37d09b480c3a1deec04bb52cdabc79acb5147137223e8a67a088d99b229b3b0dba8f7d99d96c2feabaf34fee71b56f1a095119f3cdc989ca079489fe388cadeab84ee515da95df3e4cce2344bc77205bc923b686671ee1ce86abea8567f8e439c32f504d8e5ab96c429dc603ff9b849739205f6733745a967212181c48c0fc0f9bc129dfd59f223de48e76cded29dda6496d2b137d129be15f03d6dea063752c4fb95e741ab7cc3284ba3e26959582cb6f09bbb4cc3af2fa1f9345db6a753203a77f3e0d0937701b377d93bd8b06b9af6a3f900a7c960bcbde56ed131bc8045a73e332226596e5d7305c3900fbbe279ac11497513c9458f308eaa7d430869b07ad48dfeb016ff410ffc41192f5e0457ff450212534128034c57d1a2e05e91cf4cf653062dd1660375f3f26fcbec43dc5091a58b19525519645a0aa73c746f767dc2e92e784e33f4c7c5e95d59085843ffdf2461f82d30de050a169e1c436502e9d9e608e889ec3ecacdcf0a6fbce5a394e9b7c5369787876abbae6fdfaa3bf228c9058966edec0857fa16f4e0d97372eda00b307972935dd768c4be5b421f8761bd43f79e0ba5e8c540e33cc14793f43be7baeef4ec05812d2f755bfc6ba336e9c271d3ab3b54495279c5fd1a7d590873131b7a0dbb60da62085befe012c2a18227f6a6745584853eed7099f63627557bf5ffffb90cedc89d9b97fd6683fc18fa0933db73b7487e7a0bf2f7d655f68bb9832a2123cd57ab773ec9b632247f2d564808992f32cd852d36f5bc1515ee8470edce67921844b31e76614420ce750cff22dd6c4cedc13fa09d5a815de5b4c15996b6e63f9c4b29a5919bf30b0fb263fddef835e0689e2342ef702876367a1da4642418ed031b17f4ae22a273814574b016e654d6f4009814b5b835058f169ed710ab75b1447e9f11e50586bc33bcdef0785a1e6a1e4d46471e231b4451194feb458bd6fb1fd866574224c43ba2fc097c85cf44537a08daed59689e76c3f3ba70ec6ee1431fc0744d1b6dd218ac742aa43944ec933fb39e8783d99a3e01dc96602dd3734b75968bb8d442d610d7e2f690df5d05f4ac290447e1fe3e5639d95cc1759aeed069d64315f131cea38534d5dd018245246018c981ca32885c7a820a4d2fac1f2e6d14a7a934baeabb5e331934a4276583bd765fcab0c1bb76aa960ad672089f15b5c5abaf87dada2dd40a7766c2bfaf9a14f04a46f17aa2e5b0c4a8f254684b2a4f290d46af2589b7f5b724266a64eac3b61436e752848bf58bee9862401698b6e1770ec1be0847b5606ebe507d93078ffbba0e058be66fd3749acd06", "", 0, 1564260044, "c2bd35b009c906f398362282a2155d02bd552518439249b82cd81c2252e497c1"], + ["030000807082c40304704bed92f5739e092a366c3290e2cd0ec6d2a80cb5b3e1031b3bd69a088aec840100000000ffffffffb222d9860dd695aa9e1da3dd47bb383b99c80a9cc2032f7cc95f20174d54e696020000000865656aac63526300ffffffffb8f9a36380b5f0f13f03a04e7a33fbe1e7f1691ab8b7312b7b936d0a5e74aa73000000000753526353006300b2cc79561873070d613760e0fa61a2b7ca785dc631003077f60086a9c0787e523ddded08020000000800635163535100650e3490f503f92f35020000000000413110010000000005635252636aac30ba050000000003536a6a000000000000000001000000000000000046a2ed030000000079d520bf173964608abd5c8527885278fc2740e2e367387e64c68dc8cc9d1c1843a71dbcc96348566d20a44d2ed45fa66b738076e7c325967e9dfb2b0831184d00426ff9fe91833503c51cce42bda931f3d17e5074327167bd3cee71186be93300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aa6da328f5d259f6195189a9523a4e947e898c666d196710c1776eab7ee2faf5bda74f867a9fb597228072e09a6cf76a578ce8b0d07a817967cdf6c066d5a81dcfeb9daedb132492153a38af1433f4c8a7cac46588db40957bd95ef6599e8a0107f77e78fd412a6fc777c5926a2d124656bd96e0c367d10e17285f0debe096d30311caf80ec0b9ce9d64748d261b219a69d53622bb6e156a0e096d88295effc4fa0210696d709f4c7f83efcad0fb6110c96bdf2b59d7d0bacfa5d07da78c2b751f820b055f2d0103038bd195e59156371370fa99483ea2f0c98de59bedd3125529e7d301e6922d03d3338148325039fcd22f64d78b0ca436664c8aa496c59d4c5beff9032b6c02e1b2d3238707d444833c2423b509f03dac31bc1e99d3340560c0f5e92a032470a09f28a93a5e88a7794865ce6ea4d6cce072c79997ed2b1a3ce4e9c0408a02181e3f8a37904a58803456c301e5692e0f675a621c845b1623661b8eff4cd0ea031804390f4f0eb44d184d2c89be743863b3360363a53aef535f9dc845d24b126c0306ec740ef7ed805ab91867ff5b36685453ea59a947aaaa3222820f1d0b65a4375134db8d4f51e423358357f0b6b9c60590a56b8c6018808254010b49de98d954afa97a4b38ddda64fe74fac7137f7e48b9074c9d50961fee3697f4b9a10b48c8095ce4f831bfaaf17c1696eb8f35368201c218fc1a99cbe5bbebe17d86d33bd25c215e593d7cae6c4136fb6a03c56f552b00abbfa08437a0d225e9e253ce2c35525909715a04b46fc13e03e89ca4c141ed74eff8a81aea316dadcd4178eb12615af7f10fb57be06d0ecc58afa93afc7edbc8a0a754143ded1cd235da8286c3971690807e44b43f198ae77c374c34184780226506147792bb70311f3c458fa845dbefbd2334973017b573563ebce42325ff49fe69ab8907a072e796dd96159d9447fb8ce98dd3e410ea830c0b00dff7f5e05c9151d97b97160b08a93460482af0bb8d74241d96fee3265bf7f511f2204b167b64db3726792a52611a1305b8d2a29c9c42be12ea735d48752f12b7b2400f660c866f9a64b81b8128469f8b0b2a40c3bad5fc21312c0df938efbb3cbd15230de0dab6ff56cd6e6f541da2b1904c1884203a08607d43c0e12b4cba1fa574d233c2a07206d465643328e63107290ab334d2437ad11fbe4dc8c860ca53d9e23e7c0b9576cc815af44514571344e1421a34202ff4cfd4d9287554fbc11f0c8d44f66dcbf5c9a3ae335ccc124541942433da3d35c7d5165c7059b6a0c2bfb36f956be21b1239553c6a4133f96782d0791483d4317a9ea3b1c35d8003f685ccd4d79a227c3f6ee5cd77a13975f88e38af34e5771a4804f4743e6d6b12f6a8e0e16800f89d91d11b744d1bee57c9dc9eb3b4c9af55434c45b9fa6f9ce7f8df3847ee36ab2ece7ead2c097b787d1f5d1976375273318d137f7876609349d8c1e197fac5fa827ab188736f7761fffbdc6fdc523a1cc7f487aaa5f386c53481db3060d1c671c6a17b1411dee4f388826d6d822be334d774b23b638b149538c6322305550cbf0b57e9f34e2d95c34bbf0bc85bf8a38ffc13d187ad64ec813385a2b393fe9a475838e3fb2015642f068c4ca7a80c245b6048a9abc67dc5bee46d8b8992de57e131b03e2a301645bac45a205ec2debe6b9a556e8dfc3bcfd8192a9bcc1d84a308ea890224a19278d540f3b432215eae42627a1b63ca26235b488be61f572a75ca4cfb0f6c8d8269526870724700e977d43104b8a3eef4f4e1fe2a46ebdd20b42d87582859ee3192dbf4d4d2bfaab14198ec83c1a2a6684652e76d119d3462e0e252ea82f0f63953109dea2f283894d001f18aa6ea3ad150665538cacb43573218864f1874e185bd405bb3478dcc16211eacf545ef1e7fde0c32fecc9b45d6a68a4e0e5247766d8fcf2121dda95f29c8e0e952f8dc3689ec9ab04fe53384b75402cabd756edbea01661ff3e6c99e87c751623ae618aaaff4156876f717b0abedf3aaae121d0bbb2389860155dac64b4cf4e5d0be868bb62216395de5694769e2faf234b2cb792dfcab4d0044aafee64a3cfb193167e6241a6378ea16833db86fd248f94f99156e23b747c2d9942d5552bbd94f7b6c163946b7585d5eb814b3bff8c10308feae29a14d632a32192cbd878aaa0c03fa0d17aa91aff2d34f8220fc083dfd5f045659eea3b69697447616e0c2c9e04ff14b754b31e1e86c469e289e5548b312de8e4eb7b5dc318ac8fe552d81993a1154852b71d8bee78e891f2d71f05ec686babe7c20c4b35ea5014a837217e36db5b7d622922553b7160d1d23c10c2f2e284a005ce04bb2fc54d12622e76bd141690f275818535a5ba18f5bfd5afae31647ae199f213af9158172d1010a6348c5935648647c10ede57271f21f1007", "ac63515153", 1, 2039863368, "b0d04ff3eb9edc00d2e0c50b43f1f824cc20a0b6915fdefaa4a3a574db3c8c49"], + ["030000807082c40301d0865215aeff19e14028320bbe84e6e6cdfd16656836a1719a17957331af4a3d0000000002ac6affffffff03372bdc020000000006525165525252e4f15b040000000002006ac180410000000000026563000000000000000001df9b7e030000000000000000000000006fdccbdbbc40370ce48442f5fd1f6c853464f8fee758327d905b3756eebcd454ef3f4fc116c26c96bda974d1e8b86562f212850f5a80797d8c201e31842939cae8967e9715997f71273452cac2cce8da14c653b793468069effa426c2303a1e900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f65597af4dd6c80a0495a48a9f5325c7f1db1927a48045ed0515384bca9a2f07e846ffca71cda15598366afd2cb904aee7470fc8bb1e0d776bfff032e866d48b103a4dfc89a69fa2d9992ae67ffc89d538735a6ddadcf7aa328567fa4f9e7b7793e0ba1c81de31bbb6b6638b9b3568d1a83ee54d0d7271b23faa3fbf81b4735a0226ef179f02e0952dcdb7c3ed6315055c248e1fcba498643e428ade58b849090e0205db01b64756124d789eb7e1a45607c608585f6884a3fa1f75e89a3f436259fe0b037aaa20f88fabe496a2b9fb3df6ee6dc1d9e74e5c21cbcbe653c7ba26a80ad0992cd9a6534bc5e18f05ed9ef4554621d6cd4548f03941ddb3d2b7931f2d427a031b6b7f3fde1ac9467ed87be73bc111a8747d52b46c88cf2becf38034225a7486022a93ea1c44b1900259c9d2a89ea316fb6b4dd1f0cbeb5651b18d7d706ccb544b0323b93975e02fc468c370673da715dd07ac31f55935d59d31d5eaa2588e389ff0021680bb1ed46ada70ee79ef8e1cfb5c12bb4906d4b230851e05e6325dccc07fac0200de74fc9b0e0db881baacbab816b12b88fb4eccfd7a1770db6fc6cc26d713b5ceaa76d199598cb45ce4828da5c15677da363b73065c2de70362749f243627a6abdfc090c98173eb90895ae2f496533beda7810eceee1c2e8cc9a00272dc334fbfed2a6df4e51c3b0fb92d83ceca3043e0a2cd85decccccd51dfec0e75bdb2e81cac0d4a6348b642bb36be3d0deaca34fc9e6aff317c8bab8ab48123e8740e09eba30cf1add3afff39fdadfb94add823bf041faa7ebe8286e0ef178f725cfda08234ce1082b2d6a545f18490aa6f5f0fff5843961f735d4f8288f51da86fe3220b243e87446d1b91b77b13d52234f3bad1389dd8c327d43ebdb4d67c3f6e183dd85f82a226e2875e33c5799b2dbf42f10a2a4298a2c7b0c651238cfdcbc3ebb8472d332a62dfe9aff799f86db10cc4e7b6444da942630b25a5e5e23c06dac7287d7762cd8e7847187219f18310bf131aafd457f9719824884daf7b4bf301dc83451ed9e2280c0dbe000e21e3ef07a1a3ed72cfa26a5cd726a2414265a52b26427a44e9a63ea8e971c3e1b1fffc0f8b3f6fa69d96880bb365cbaf40fafb96431b72aa2375636320350e22fbe5450eb0f27169e28d343d90deed44c704335af81d664908e697c7e4abcbbbc2050b39e32d328525b109aeaccd004fa7e407f36df55aa1dd626562041a226fd166d603fe70ccd013719149470f97148dc2bd29c709699bc41dee3720d531dd3a9f4ee5746ded7b94b3cc6b2c30a73708c871add1ede0397eb60b23e559a03629d00f5e8440f51611cf0c54764b683389765c4762a2f2069ff1fdf05e65b653d511665aa6097b853b0c0814d624f58dbe317940ebdbe8cd6db8dca721ce7daef3ebfc4f360de400cf85b0b6941dca8d11d703f1345bd0c7255c2f5d7a449266d94670675e2855966c269aa212a868b31516987137899942a10739251e6496774147b78846a836c7e704cba059d4608a954d524896ab93735fbd0e232edada179ac0a44d4b163851f54ae77e3108ec81aa135b2b4e5bd50461b1e7e1f5fa4fbfe4ab612f2fc9f04f2c6bbf1e792e153724714a4340e9f286dbb1d57d31427d59fa51a8502ff6a7b7ef88572dc8f3417ab5ea53eb41435a6dd50c252667c11ffa1d05cce7502bc7d8e141c8d20bdf3a1ef01ca38d9c066d66177d2a1ea87a3710af72e6480e1a90acd8093122ade5bfab46ece8eafb99c92f50feae5bd5cf84a3531e359c7876b7908c2a590832f29758192425cc7b14d882ec448268b37b1ca5e63d12108c4f6d623054802249af086d66569eba28fe9b3267a6db89f57ab692918439e62e040c86a1c9725a18fce08b411556a8c2ee1983566c38b18cea0800322f38c0d662aaa57aa67a071773f635bb0f5836a4e8ce61b82d25023d401d1ad2303eb2a6e1bc68db88dd23b2c2094c1c499b9130aba31a9f343387d5e52d5f36ae5aef487b03de88920f07ee655536d726e25c28a81710869daf9c2dab3c34e5680f894be16a98e884b15cd9dc9664e30b2bb37fcfd93259b08e5e1684ca1805ae1e60bb24ca8dd05a9d159ca4fac7f04d1e192105264e27e27886add64ac70f53663ca0dd6e2eb13c227385436132683ed55aa7537f1874fc28df56b13802fdb3f1924d348f2a1bafd1e072c01c16990fac9408ab2189fa093044e20c7d9116019ea8a3557f169f06a83bd823e8bfac10bdcbf8122f9dd444d3e54b1774f125b083f932ac476065a7ebaad2bb39be2b1f8929ed691b0d1498364e0df1e4b7aa1162161c30dd787b33cfb4997a3bb6a0130371a9c2d05dfb63bbbb99553abf8315d50b2e95fcd1765e7c3262f6b918c87bac3af0ab50b0b51aaa07d3d9b2845252d7e1cc5ec705", "52ac006a0000526a6a", 0, -121624942, "e9cb4eb1feb7631e5396a5dbaf0373b153a30c7a796780db3be932b2239d5077"], + ["d714db590125259ca54ed4afa3dc8bd64c3a6f8236fd33347340a0503264bd9d26feec53e40100000001519dc8e94403f4234e0300000000096a005365636a526552b7231c030000000003630065d815270300000000076a63ac6a006a63385c766f020000000000000000b3b9cb02000000003e62937f603d2f8ee14c1542729e0afa254defe2880976d26e3c68b64468599c19c147d7d3708d433efb9fe83236c08471df2f57fdc6318956aca294ac23773464a7f68b268167233d688616aaacdb70753783d16b066f5ca2ccaee6d3f07dda000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c43153ea41bfaa3efe96dd9b636756535c3a1d061874eefd3a400b3c7276554cd10673a1f324e9ec1da92915cfd2a8eab97f14e457e77ea76b7b643d2ac7089b69d328603cbd21ca67808fa980763c6004234697a9bfd106545470064a228489da8cfa10f207baec4429f1e38270a6ef037e7512916b637531f555be0740c7e020933d68e14b8a1221cd83b1a2c12f03a2d03d20371b00558df7eebf4e9ece038022626207b8c3f228e91ac72abb6ec42aca1572d7082ceab597edf91604c9d70390a0474119dce2284c8e6018b074d8d7b73ae64b2d5ae5ec60feb51434fa4d15f7eb922b59a299c92de982140430d4aebfedcc841f0ac9717fa90cb252b4827cb010229c5044a17787c0e2fbcf5962387f4f0fc5f0f1f449c71a661ec66cf481612bd022288347e8d1cff857e3454eb06667fa831e1f6ca0faf5c20c01aee4304e2401402252b6d2db39f376224f42b5b8a981801af60f6af0c14732146b9744a7bf225cd022a790c2d6f8ce63722712f62f03b90a420192dddad71c5a40cfc5beb1d1e456e0221e5fe4f4e78ebbfcebe8e132ef1dff830f1f6cdb2af2eea757644a9c1962043b0e388423f7bf664c73ab5b535d7c3f835c74bbf606d24d235fad557dec01c2c48a2e414c56171030fcdd5368045bb5209b4f8598360c571e8da1752b7550a7d979a1bafea980046aa6ef7eb303360c5ebd59fcc72acce2159ab7dc72d9f7b4adb7cb2e0c60226c46527447b45b61c6cf1b4c96946e9a176cc159ff1fa1a3e867fffc2136ff9ce21e847a4dd9e81d51b38e03b7af588820e17c20dd4a0c05810e9e6978a4ab08a989538339c027426025cf1ef4e42e3896e716208fcdb43287e0fb72c3b2460aac95152551dbb1f992146009abec01c0c300d84880bc54526a82000bce37aa6e85fcfa3a20c0a3b934c8aab1e5fd933a7480806937c7d5a5f6a1df0ef2c7488a4fdc5d97e1fef37aad5f9015aadec262e08a4a4d45223bbdae2be37ec96f307bc14bc0a64d54d710d235bcabfefbc992026e88de5082a879474f78f1e9b7561952c9489ee81b172bf46f6255b3245c05d359e4324d3ddde17daf3e727cfd5755b021f67cfc7f5314070de66d49115499d44d433993183c88a13df72e1cade51b7648e25310fbb2b4f6596803f1185866790c90a0b5a8ce842524abbd28291748efad21551c912b6f597b784d0a1aab15ca5ef943856a10f145b0b6aa23390891afab289d23fb6723eb85e984464a5283cf1423c4cfe168cb9752cab4a7fb239ad93ca6373847eaaa7b7b935e33c1f84268e8dca8e1470bb07ed311ed925248069fd43c44c8fa0221ae4dc07340a5f9b0d048956bca85c4c793777e0cee1b3bb8a33743cf0234677ddbe82fb6855b7a38fa42f7cd606225de0ca0e98c666786a7527513f77fc81d84054b1191b8f3d63591f663e79722b16a21d88f2875a32ba7506e104a9fc62c25e0f356c498fce10d5a088c39dd2d792153738f6d40a0531b85bb595f33627a401a1caf84ccc9b35c20dc51125d13d9e831a5493417a36e1389b4c2836d9fc5fc4bd9c40148beb3af3569c954b52fb70a0e6b626b0e12543c78d6b94326c0353327da937e49649be768aaa0a7eafd40cc181213c6ed0335997d466dcba1c925b77f6bc1c7ac12309beeb9684e784b958a588dd445793a17624fe87cf309d81c44287a7cbe9a2a7ee7c9a957a9107227b098109c69711f42e139b9b7422023c3a00c20110eed7141e1ea412c3f5972f4c0289d814a8b1349273ee8d8a88233d43becb77738c52820b336763ac598a39f7338a75ea59af9323d044d85e35278f4753719283bff1beecd3ac8b8f98eec632accb7a410d84a3e197b833b85c66b30a623d83835ba152a5b04c828af11765d57f0e7e8a9f9b75cf32ed45ec7bd0035eb7a76f90722a6df632b4fe9e5891e997ab65d5473494c38b33f1601fa2ea03a196d673613cac28ac68f0d51dfef504929a0e0f8ab67748269df2e4da1889c08bae7529a67ce099898040c92fbe9bfe71fd34f18dc08543e196198741b21ed3e6f94dfcc966f4edbcb340113d230f8f9ef3d1eedc28d12d18a88701a0d0b0cfc53304aca496c36defb3d0b20c386eea3a41a09a87b033964929e8ec229f71bfec9c082aacdc6414661b522a0904f0c18dd6e50c47be2d27643f2ef4596611b9b2beea7225bbced97f53f0b3ee5646cb9f44ccd1903fc060e14223599b2bee3fbac7330fb550d35ef8f5585e9da6a876f5f1eb58ec98c9fe7bf0d8bb486524fbc65aa071c800000000000000000ea53c0400000000d3899bcfaaa624e2caa8737f61e61fc19246bb639775314fdeff9afad97bf33b93603baef75e776d9501d0cdf73a7f0b047ae6c016d009e7c355d7e99123e3699ad03eb3b73555aeb88abfa6ddcd2e844fcbf992f4dae621d2c7acccc87c6c180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000067915c888d6fd568f93dbe32a38caddcf04bbd82c5d4d1797de75501eb2ddbf018f6e508bab2c25c537e3461897ef0cad0914c9affe965428815bff79096791e80a649aa0ee6313a4cf9b7edf262a6d8ea34d55a8204a69e66435b235ed3ca9a43d8f57d9a81f826bb7a69afd2122123373926aa3d9bce4c52e47c623699a98e02157198cceaae569fcb4a760a574b4bbf15d8142c92b77f9acb6e8f7a6eca93ac021eefd134bc4a883e973e29a60d6d8c4fd1700fe9ae173d8395ef10bd5fb95abe0b00fa619c9a375c035dbba43fb98a71aa0caf81d6a8f6e21aca3c1e68f9f78d69848ac30feb72b156d8bc58e3949b7acb37bea0d9a04df9cf9025f67c9cb0a0970306debdb8a98cf59c1de8a24085f276ebd35301ccfe87f9f6e206d51a9b02e0be030ae2550472a84f34894af99b8792cec7c9911e04ddd0a18d3320b6cb09e9874c022f29dbc7d51365ad56b1436bcb9f4e97404c31b5a113629c3a2fd9d24f3cdaaa021f084107c39af0c80b363045c48d38188f0e9ff7116318bac6932ef1cce363f40324f3af30e20e4730352dffcca4eb7c5b371b8b65121534b5e17edc87d46e09bead231c7a1a6071a8f0e729d5f2bde5774a76ae5276a2c732cdd7d40286ada583cd38a7a6805fbd55be54b684206378b8ec711fae9797a5f2a6dd2075862ff0d3040e759d88f6ad48ec87aa693e27190c239a7879aa7c39c7247e9c1b75c0fa9e116cb86eeb0f3b316f9f3db3a0ccf1a10f46dacb04cba500314111ae739fd60fe3aaa8f4e05bba93337682cc6399a7312a667b7549c67adb34add97f54bbfde31fa106c5104a302242119b1a9599f6128580903722dfda40856d91b05ea8066d635e7a5b70594d4355045b09a3743c1f53ad1737bf7493493f73eaf530f36c6dcb3cc9a5e0ed61d4dd589e8e5e8aa8984a21fbc2213e6e06df21e51b4ac34f0bc6ab336a02eeef7409e76bdcefd52e9ec020dafb5ce8e143c699df2180186d09776ab6c39a993cff6dcd5cd06989d51f36f9391d690a1254dc11218835822c3dfb6142982f9d1bcd353a4eec47d2ae0ca1477de710b8cf116ba94524d1c98c9cb7b95f7a6d702e06d524e4cc9835b3c5f773da3377f18574186809ee26ae2efb2765088c255545025a986c527e35ffc855ba1daeecde778ecdcbf3d1f6fce097d0006adf359422e7258a68231788b85e4fc88da620534116b6478aa487616281ff78b863ae626d9c341e305747dcaa7401889d5493550ed4a03f5996ef6acb1166515994e8b2aa431bf1b78f7b9855010455633923ab781480e8c4b7461e33ad882513aa532d6d35306096744074e9783d5272d397df6032a36f724e8dee9c4faacde9a0fe76c551a2f4935dbebb289b39cb9c9fd5af5303c6ea1d052bc78531ceea6f3d014306e31e450156e122d4d0f58fffa4b7338cd51ac393a84f2811b979beb7c8fbaacd9f1d6b83936917a0ff73984e44e50385d21ed38cd7787dc179e8e848b210d040f67c607e99084f989c6122eb5c12e8bcbb96100401b16f86e78528246e87df5d78c45c15bc25d07abe43a79b9166f481e35f0272024bd18f60fcdcaff2acd4371a9ab00898b35424b3c126ad27e8d6042c9aa7dc921ff924376276b419e4c507e93310b6b14fbf0a7ed6981025f3723aa0a25930fdf831370a26fdc8270e6b50532d172457885d8ef0f81945d2dc3298f50515986c55441e940bbe4e1e12a7a1180095b94ef932ce4501c3a3f7f3c8e268165dfd151f9f785d67ed8e3f580ee16e59559b62d0cd9e6c1f9d2da398f5aea4f861f07d2b71b6389a5a0eab7094b4035d786787493c2b7ddeaa360472d03ba880e375269e9056159747b21b06bacd1cde7dec565321e3cc61f7e0deca4c3db0ecff7aa696b63ad72e31287dbf7db773d65305b179953cde411ebd6c9c4af583eeb0aa6a950d3872a2e044390c25095956f826df1a3beb4bd8792b3a283e514929adae90b2a3ffbd330f78d6e41d7bcf23d333866afc2251b727503f09dd6772201418d2387231be974950568f979ac1fe8d963dbdec9fd7f49138b1920936081ebba8bc57c9da7031bce7d039120ca0fc529b6f269ff02a4419c6fb1a3dd43638cc095b4b2729ddc6a68da254109ed7c7927e892701d60f5266e92075c1264061c174d8a2d543b5a6bc9cf20ac02309f7b3b8991775412b3e3f5082bac3084ad679c7a68d9ea85bb6ca773f6d18eac1cff2b95e5ee06558f918a9cff190ba654af5a3b6c2801e95e81029640cfdda60bf6bf634390f934bef8a4f84333b3e14818b1d573e668fe060be3ba58b15ce99aabe65b474fb6edfb9e2f715baede219af5cfd0f3082eac16ee6c5808d5b596516717e9aa640f457a6aced6fd1c79f31dff3fef1e3a6a2e1773b933df02380dd7cecf455fd1d9ffcce04", "535300acacac65", 0, -2103617336, "4111fce15d6314a297173e579f6fc59b2e02819adbcfe377e3853bbe874f82fc"], + ["2fd7837c01e4b49deda0a66ca1175f6cef879fbd4570f694ca663bb610d7970e5e96338dfc010000000152eb75b28703a46de7030000000008ac53525253ac63526cff900100000000066a0052ac6500d66a21030000000004655351630000000002028c94040000000000000000000000002799476da0c6c0f90ab94817e7e7d32be5e205200566783437b6cd283604d0a54a91df42f20029d639353aa28492eee8e199561d6bbb30e4d56bafeee4b1098b9f01719ae34433ed3def8cc3f372732f0a3dca3fbdcffac777f28d7447151702000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004bdd069d82e0965df2bcf851184ff60b5ce4c23e58fbfd4576374965c69534f35c7ca0d63439251204b3fee7b3187e3ea35c7dac29742429f5d3e9d141fea8f507e435523efe58b5e02a5dda82d7c7880cc43cee50f2eb3abb15ad2d82a94a0fc4c104081eaf533b8a567c2362fc29f56e451dac9e59339dc547b3d42281fbba030e10a0bf16a6dde7557c3d8c16d31b0f396af6873f5d2dca25d698d1b5186043030393fb27b94eae2928d27b21ecaf65fca7b7416fe8909a1ee3de32d9212090690a08146938b3af5aa088c53cd2a6454e0063765bde7d00eaa86dce1526c910933d17a123653ce9c8cff2809abc8a700db96997435f1629fa0836f7531a066e02ef021f3f1af1c3b51627c209cfd8f74fe7ff500c2636939898b7787d7ac41df49add0316a697e7c06f163d35e33037b2f9384628a2e21cfb7d65a7ea4a1d67b462e70302052072e4a8a601fa56cef4fcab33a3bc84033834beb3dde38baa7526f19bde1703063d48d9a273d761fc1c6892401b068acaba634818f3f8b6a7339fc2e7050dce022aa4f68cea9508db58e0394b655d615044f679b4903a70c566d00f4b4a1d1b79fd80aa15703edd1b23171e6e94f8a658948c09669bb3dc4e4bdea78abc7715cae06316eba48521733a053c2ed567281bb9014f64869cc2ef1ae63f677910b2857b397680c5c44f5aa84809f5c282d58f5dece0270edd0936cac90e13b2b6cb00122370eb8a899b84bdab9607eaf03ccd8fde382956b6da9c093d05e85c46164c1a731e7f460ef6ee9aaa82066502b9d8803b352a4e48fd9950b018aac006ee9fc7fcbe2723398b0e0dcc73006f439bd9c6f6912b5e9867d4a847ee8be5a42ec67bb17a981ab119433a72daf3dd02a3299dd65e4fe6d88518a1806c2c0fa287d1f35ed5584adba498687c0eb99289dcb199d647ec0978a87d0c3d8cd065a8b37ae12eeac28a88daf4a7e8deb589bc7f63e71be2ebb3d37d753b9ca74a487a83b1da2a1cba2c92863d9ec975afb1714ce8f0016a832ab19df86301911464185ed8d8c8dd31ffde6ff36b4d01c173a1c2af1ef6b4e0db977b360f82a6a8316bbc4f7b4f35f6acf73c5d06fea9a6e41ab2e30bc7fbe9ac850448aaa11c23a58b55d6042c1e7ca026fbe5f22842533b825448dcc1a878fb23f35d2d29e22a91fa1701397c75a867e711e2591f6376ad1cf7b9fa40a6f6dfb5cc4f635b71d769e99b0d9942ce02859cb40e86fa0831b9565add09b10d722d4546a8af458170c24fc6c06f97ef141389fbdbdd84f6fb45fe7f92efffdfb1aca1c0ccf93573457a11bef8edefbc5792181cc6d0561d90fda5deb91813440c40adcd9551e428d34011b099b9fe4de7c5c7604a3d1692c44b460f241bdb8be00c5e6df6c2886a6928f4c6d8f6f0cdec85fa25c05be0641627986caa7a07c58d082e0b98e85a330ca54f5133a70d110d9323bdc4f629998db450ac065011f0615d060a40605ccaad8bab5cfdb03b826f90c70f8ef6e455a63c92c4af34bf40b9f605833ffe902d309328729aa1d264b66697d68fc211b37cd66e1f13f310424b2b1bb81ddf244f3082d930bfd621d9a493d33140f2ddb1d18ad1f05cf7c78b3c1b44182c1c0d114f6a0b33533a3f52d93f1504940821c022097013f48ee8a7dfa75bb53c8724c560ceb5e35e216419f272decd59231b1765bb4421571d35f34fee04119359c41437c85772ed26a98892abb07b6f9ed28e9f8893f9642c08d21a699307fa10b6eafadc46471c5ffc25fd216bd03e18ea935019d0b666ddae8b9eece614ff8d28afc711cc7283ab97dca1f9838f410f176b51d2d560307e6fead11257ecc8657a2a77fffff6ae6ac5ee413570d19aa4979799a329ca517729ba88be9450449df5a7156cc3d66a4823f1237fdb69235b621bfce6559725d8f65d2e5124687e5b7a2d642c83d8a6ed452b12ed0e0d1e0a2d670f98b6a0b03fe8edc4d13f97dad47d2e1c5c53a58e9de9ad4d5ea5ce9cf22e527fbb5eec7057e7d9ef7330ed5e3111309cacc40c0073cc2f47ba8377659c738bb1561232e9a50aaff953e04c8a2aa787e8f758295561cba5ece455f2b0ddc66d693c1eb2e3e206f4e6e182ec5e9da625c23cd9c4c7c76cdb6c2bd6471e40623d06c359135a6df7b3bb36836849cb28af21987a0b37414df6e439ade5470ae398e0058b7088fd288d455245d7898aaa7b6b269a1fae76bf47f69ae7e2667832e399e1955463c8b752f8efcad5a2dc19ca4ef1a36e2a3b091d4777ea8aa14a812f778ce44cb88a87a56b32040000000000000000000000007da443d8da82aa66334ad5ecbb12b5774c5896b93d8f16bdecc7e876459ae8e7eb37ab4f51acbde223f2a9cc4aa6f3f37de05b9694dab7f5fc7e04332bddc3e024a39a50876a69241f2cdbe806334e615c28a00d747a6454e7bb600a06cbaf100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083e360506d4a5746563d923ddf1df7c04d35b9e1311e88fad4560e8ae7dac471a69475624d4b37f5260883c045092c1a26809b4bd1b11903c4bd3a7c2e27ad1554e2643e9d014be4199a624eabe065689fb7ceba6a16cb1123c6d513154297734ec7b77cc800e47d77977ac45ecf32471ed6d8b89cd0711529133eb99591f83503028ebbdcb1168226b58b1faa398932581dbb145ee5403241d601b687b8479c24020185aacc0fe78c859d30467e3aca099bf08040db6f7bfeb8533af345f7e4dfc00b0460241c920416cb6a5f30ea5ea96dace14da3389e2d290cb0798479bec641047e62ce12dd963d66376b89c82d78dc5740dfa707d781db3a8e5dcac040d10ed3022509bf08d81e47e42d914e4fbf725f15541c20b084432255fbb0203d5988b24002287dbc3c354e568e30106839582789e0e1c1d78afba1855395dc8fcc1b0d41790310bc4c32b65564af8fe76c4f9dc390d6bbbf1d233a53c3771185b5963fc00134031b8addec58df1539db7de3abde8398dbf4b274d5b83beea88e5d2c61d53b4af00302cd24034c47f66abecbfa5c2bb0698669bc8c420bfefcd7aa91681a996d1ed3ab9500b4a4a6ba3b513e66a99c3fff95f94535a07d41e40afb6e1af1d446b4095979c71ee2730c94d48f04a34f9bac37eb44a58d00ef6e25caea2f03274b8b6206250a014c270077b52e8a7c9002b7a4c41bebc4d8e472ca017ce484814c1e3ded296413d2d03d469054f96212b16b5284e99c8ee820affa9149c9f857ef2d51bad25c57aa7bcfafb2098e0e345dcc48d34c144e77d9257d324f66d50f1439bfb547e11cd56dc4f5d278b624f5144c4e6223b4bb22c2a9e10a7fa445140ecf792924fa8a8af06dc9b444e505f81946e32b1a5e5f0856c2609d9811dfad43ad4119041d9f6fe26ce5e1bb56bdfdd467f8fb8330de2a861c19bae9e575db9accaa042e178c609cefb58fb855ed3a0eda9fab326916424dd38bdf2899df07db36ae81be631d41644a0dad9fe4d31e6df1a5cea54b8b62f3169a49f051f2db995055ee16c62413caf59c0cb922a788ad371a98eee40af8410c34cc73ef4f89523d1c17b146bf520069cc729d6c20cf89c31e9b4f11d3e6caa289f4971b8ad8599c2901cfa0603efcb1f5ae69c659ab5b759be771fea942a8805a750fc16542a90a0e835a9316ce24e876ca8211248e0c2cbdc65d115001033eda589cf5a435444e21609f9ce7919c734edff2b31cffb375cf747921429aaf75d9a5d63a38da74c624efc7f42a098072c467224afdc1fe69ec2dbbeb7dd646b6fce18702ec1b3b24150bd10f6dd682d3328837d395751140e5f99143636a22ad43c0585b032e7a4d808fdaa1e73faeda370f5b4319f42a4e98e74c116370ed188b491f759266df3aa5b3681e5b73469b02a59f126bc98d6bff67ec54fdd45cd7069ca81ba1db7371c60b70ec5155b0a6fd9877837a6e54f5362ce5889a5e600f785505b5055663ed2511c4bcce0edb7ccd1e8c58b9ee0a981a615bbbf4684235387346e3545e7779870298485472b4a9bc65359af24e9d8fea20fa3bb1001ea3a03a9ad25c2e0670058e3d70f885809859d537a4d7133d7885f6749707c1d955b816749490846cc952d0cc480a75bbf8de1e36783b5c4f39c40dca1f2f0da137e111eab71fe0797beafa2f172ccca381685cfb08c578fbf6c501511fec121e6cb473a6d95986c2f1c6bca69fbd078f365a0d7896097b3dcff13d1896c68a9baf31cb5eaf5f3dcd1a73f0413412e9f1e375946296ac0315937a1e4076969a05759ca50ea34924acc1beed1e4050b9bd220f9397c81da1e5d143c54d777a55aadd1aae2bbae845bb83885958f35392bd14209358199f51767ac64135239431bd80d295f2eaaf7b93c4d51777dfaa80d9444bace3988bb4808c22611659e672dbca782db45868b93997d6f58fde43298a8e97d1ae83d1375e22e5b3a4de39a51883832a4284e1b5b2eadc9e470608ac1764426144ede6cd430b9d03f635edbb670e0802733813dc374b16da608a1a4d7a30d8702ec9b72a55dbd178ef7fe7d9ed533203ae6c4dd4ff51012bedcc5204d6101cf512424e6c2ebe48b06b376956b789ad64177d17489953b1714d1c76e0eb43b8d889c132193bd273ba91829463b515b31f3d1dc0e713273fa8326a00f8485c066dd35883705e20c19b9b626e4f1013d04bf6da8f71fd2a1bc098b87f19026d8b598bda331edd7123318cb0b8b6de7d27476aaa9b1b312d6f0e11822de0b2e55d20864e1e49f2d47b5c4da97ce6680de75de29a63c3c20ed079dda6c02e3b7e8ac43322aa3ba85e339171cc33387f9e104ec4dec1f910d3745eb7639be54d6c78072029151d4d3f08e14a60511c5a2dda545fa0f38bf13525f860d3d3326218ffb7408fb147ddac2e050f", "", 0, 919815237, "58babda91ed5ac352c84bde2ef2daf5d29cf06b398f355771c7326bd07a84711"], + ["030000807082c40304af88a3bf6f756db4dd0ea994c4ef3ba1673c52d744c6fd5b73a6605c0ff4091901000000026a533e79da75334dddda5297f30b232e820f081ab74b76dd6a6ba95631e78a0f4afac670523400000000055265ac5351ffffffff3835b43fccef3a2f1517d227a851de41d8fca535c356e1ae5c270257b0d16f790300000000ffffffffe979d937fd09a3e55f65fce4f45574c442a285554e728ddb517738a0301568fa030000000165910e66c504bee1be02000000000500510052ac60357f0300000000046a6365658e52540500000000086363006300510053076fa2050000000002536346ef3401000000000100000000000000000252e701000000006ed46c835c82ee6578147d175ae75d368e7c80ff380fb892c40785dc743a399dea75bdfb4ad912ad8b7f58b38d9683de7e4fc64c58fc6c3d73eb8093a3b4d27fc82030f2cb1d599359fa5842f0c96532cd49d369183dc4e1ebc47775133a4ca200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000734349a289775dca7db00215aaddbaa97b9c6baaf0d5fe7d3740a8979f643f1308ca694c9c2fda2576fd0bf00d34924327a54e696235c4822e2c102592073473f1e6b5052b047430b770572eb42616c7f9d040bb6aea7d7edc28a357867972c0cd97e423aceda359030379abcb60e0042c164f2e231d4fa5f490b4eff2596126021555be2fb944608752f88588984ff75284997af13102483c1a9768c1e13bef67031a5f3fefb7e1cc145d649e70457948e2cc32b5cffe00e66bee7f3d0fc69088e60a028ee997d6cef9489c3d3d9199cc0ceea77ca4063529d7feb32fc9c5a676e64da2507c8e520ca444f00d6229e5cf2db9eea015f78893f3c89b1b043f1c4d71c4031fd2c7bc5f9f22582f7809b2d89548e73479f90b836d6a39da0a35a0d19ccb16022b8e6179682ba438d7ab3e66aee11bd60dcb2b65386c226e66560221cadd3d660215abe1fd70ffe40c0681209a393fcb04b3c15916a84734acbb5fe3e6326940e1032d214751af8675c9d0467a59a1ea42dd6eea93f1b6b9ffe951b54e4248bd065f020f91127111d22438b24f0629fcb93a464310fecd6a853c1798c2d6d42b17fe8d2c99f6fe71ee1561a94ce3815bc9c25f144376d0f3e0e615296d0ba1063bf6b0a8f6d6437db1dca55ed56a3d88a6505160be7d4513913d447708c55a7fe47bc8e3370a8cc5887d21029b2c99c7c41445b0d087303707ce223cb47d95e4555845b3a69ebe042beed117953ab463fb43fe2a11959009754fcb028dd1da34bc17bed49a2924496190f1f8f3bfd70a2d3626b3b8ea1def284952d27a2f6146405d549813d8af06ae2a65b38e2c86f91dbba7a2b83a33e59853b2e243763bf00505228f5e04660714cb00f1cac0e925a15cb2579caf023d5ae30a78a86eedc49fc6665849ec81b2de7a1a477929c289619ffffaabb057eb90ca006fbf6816a88c0c4ff774838bf0911ede542c10f939f8d0c1de1414df4f45f9e1ed971c5b4b878a6281f57d6cefb255f0b8ea081d5fd5825891eed4899c1d90560eb4c0aa39308de3fd13fe9f546935e2580286e8d6af18f31f208d6daa35edfad038c98e5745dd1b1267e67326d22d79e9c5c58d3c8b5a09cd1b18a4ddccc399db3a56f7d9d1fea36023e8fcad75e77067a60622293b3b41abc4e30bb58384aca025f0059ed24314a89b519c4fbf3079b1d69550cbe9dcf61863e7c3fbd685602066ee98bd78953c52f905323fb538a6e8f2b6716cc7145ddb7b6bf51879fbd852ccbc7bf85e193c86f2a7aa00998228383dba16b68496c6f070f84f09bb493541db1a4cd007fcea71d3384a58e0590fdde2cad768c582808c5548f1bb47af18b260abd6579835b0e38e15e4f75383af5bdc150584a502f0efa2594d530fca2e8bf8d84431c45794e70c9da6e38f6a0f4f51000b73d9e0a64332f2565b09915238f7365c370d3155c473d9773ca1e76c553f825dc1b73f224dfa6ed394d3aea7c9250296b3b4dd8e662f33561778c99dee4d383e7b7eda5e732d1eb1dd0d890ad183912e879bb603810edd0dcfbfa9bfb8fb3bc4211f142eb577752a8ef0b9c6cbdf5859a85480d467964e52366de2caf8981776afd9dd763dcf079f7ca7e13edb1fbe482d4f94268699de9ae4119fc2ff1fe2661c855df82c7dd6c8ecc0026a54e6feb6a31a3be423cbbf37a296a22d11b045a2f86db03344789fb5230e7b056e80869a6d3ad5524bf5ba49c029fdca47847aa3aea1e3c22857e715b36554ad453e6824a16e8783629b68480175f87b25631ef8993cbd7fc94f54b99692aeaeb1f9515b175e893203011280a36a8e6fca711b4ec20a67d46f7776cd5a85c03ba45230a754824769b17128b3522cd3bdb4e28a9a259a8becf5a0473d0beab1fdc69c38f210c846de202e0b087b7b7980302e5157a57ee0cb1e11b9d6cce51cff68a7857dfe2e943df13f14f27c7d552230092c482cc357d637812a7ccaadd3cb562a24e831c9e6764160fbe90e01e2abc81c8fd3724e4096009b9fabfbc94bbf84f0112d2c2af5c6c66fa106cbc11c3820e77673fefdfb00153ed6c00ed26c1f340337f380d1ff95a24d939527e38107562c8ed0cd0dfe5e5abadb6e051eae3bf6b07d47b81f618d9a757f05d6482b2817c7caf421a3dce7db93af5939810bdec0beb2242a82e85f8e0edc67e227c737200647f3584062a84b2420aa7b92ed1340f1bd1be7d417fd207f428252901229a0f4c18f8a75022eea4f09500a3a78598d07dcaf93cd3ed586082ce59352facdc69fc9c283f1123ab8161e52250e6d1852e0736242b8ace456653e0410300a4b1034f3d170ad79f75aa313b0f1f0f43538fb1a1c72546192d8b464746734d613541980fac89cc74ac8a76bb6862a2ffcd9983e4ec013b26053385c72e3823a7056dfccf0f6744df3040c", "ac515152516a5353", 1, 353428099, "f540cf41ff94668294b4da8981731a33361a728cb360621aa06354233cbdbd7f"], + ["e8c993070407dfbe4d7f7e92a717ad7d8dd285acddedab1e53fc11a773175da239d229c57202000000076aac6363ac63655e54572bd96832be268bf16629d245947903e14911e5db8421715e6805e997dee0be2d7a000000000965005363acacac53acffffffff7cfda185f12337c95a0cdf875a57f51fcf5a3423898aad37e42902bb6fc6a9e6010000000251acffffffffb734f1e151aa911f040119e41a5bc746c2e114c677b74f2903eee3841abfb01700000000096a00630051ac5200652961e4fa020be4f80200000000025153903f8e010000000002636a30fedab200", "5353006553", 3, 875597649, "587d62dbca76c1f7fb8b1a88c0a2db6cae269a89cc29584054360c07b1c6f328"], + ["030000807082c40302e02d81148afb02e30a918859f090b41661a9cee31c34f0bba08249449e22587d000000000963650053ac6a6a53acffffffff62d83727314b621753d79266bc42d449ddea0867c3633fd0320ec848c3e2c0ce03000000026a6a1d1b8cb00452ac4c03000000000500655352ac74651c0500000000046a6552524424f3050000000007ac5365636552005c96460500000000045100ac51000000000000000003e76ad804000000000000000000000000c01f6cca7245e5c499a92bacfe7a5b48280ab8542f6bce9ff8db1289a73bd5ef3da0118eeca5152b7a90688689ddc38cc2c733005bef8da91488562fda0b0e377c075cf1710606d6afbb6e37ac93f501a8e91519c580e555367b51b7cfe6c26a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ddffd079bd715556b4e7c54ebabebb62117c480ce5e7e87027af7a17b70ec00270176c99a66bade23a6f42645aa12c73651dc8666a9ac9eb7a47e532ff4dc89117c7b49cf30218963d37d957f965a7b3962232144b3982f80908fbed11c1d7019a3ea954c3195cb5c9753e93d0a7f56eacb2c7b3eb10090f76296b3751ae61450225debd1e45b9fee3ba0c2e51928197b08231ce560a98dd48729f51de3e1773c50305f60e6e9b02595c8f814e724ccf190956700af40a1208a244612a1526b4dd730b044c3f419c0ba3124ded21b51a953d87109ae3bdbec2e648beb7f9b4ca030f6997d0ed28d4e134dd59712bebc5b7e198a55a9479e590bc08f5805de90f5df92e022ff74789cbf8838d056a20f027203f9ae39855f6fd3e4192a9bed5f827af4e9e022bc89c0a4877b3cabab14e3b018c92ffdb6fa0e39ee219782e0e7ee038da78880202be3d2bb9ac33562221dd925a8f6ec6bf4d7d45d12c173644bfc40f9e9fc9bf0222317d43f983da7a0434dfcaf3e76d7cc436f89f5c55de2e75d9325cbfff9a520212bdc00043b8b957b6cabea08d3d76d2b053c4b0fa7b649efb31aa5d6980a37aa01862895500893fa7a5ece2a79f4de95df764376da7ba1ec835f71ee4f0c41cbf008a96fc8c30907df055e7d0a6c2ec46f9509454fbd73fb9d20ba745f420c7f0390bfcf6a70a5039150c113e1e92329b1866fd2872852485c327b1aee02924ecbe037c52437db368ac588aaf3ce4d43619affbb65c52ab5c05000343ba308d0b870cd0e8e9fb8c622e7c381ae3c21cf42288c358273ad3bb319613c6433ce9ad120a78882e116ab994ff5fbd82dba467049920f16bd1182dfc690da06a474686195cb00d12a77d3c86622210ab2ff53eb29c6a1b7a9ca86cfb671424c48964774e9137d5733d9fadf9ae509a09099370c1d42094c47a32ef3958fc821ad427cfc0b897804036c109f78be3e53f58320b46e76383dbfd32d806efb48c26f8f3f3147076ac1ed40946546b3a90a3bef06eff681ebb2a71ddf667382ae41eea4e6adb20dd8823d3ba4f5885e46a300a020a6dd42bceed4dfc1666ab12a3807f34f1d4f1ad0aa26fa230685b0141b0fdf09e8f2dda475d1c0c64dfbe03ad46bad665efeabd0e51bb93ca409908cec097022948efc9badcc1fc76882b3a3f8349f82189af104a0a8ad938441777eed9bb595356c4ec61d0e6bada306a5ba1a603fc99fc818eaa61612e99927a913a94b34619f7f88d037ef13e1a7aa8a6844b06ba1d1ee617f3a0aa62e947f13d6ccffc9676137ad1a45a971bdc2b60cf6fae11b45ec01c5f329f5b3f03df10f8327dad397b28b20446599a1474b56a6cbbc747bfba9f99bac7e84415b2069752ed0809f3645097e3ac91cf129a5d1efae8bad3c786f9794cedc6c81f4e08dd45d4858518c777f25bd73c8de7810c6197f14d1466974252af003c21eb2c46fc1f1d8e508835fefbead14af8185f2c6d49167bc65bc9e0b50efdf8a7aad60802152a7615e95c1d2ee0fa557950d33d2c945cdd49d21a9f099bb3bb2940a5b847a37f216856205b707159d75fcb9090bfc0f8d17dc97481e2cb7fbb668e0df3cc1f93ef959d8e2869f67d73de0e3cadca49e941ac14f17676917b264a10f5cdce2996a95d8341b5c1bf16dd94c27e71012a256af19c9c5c88524cc3aee6e13f791d0103692d5cc028977abfea1ad4299a10ba3ccd906a27ce9e31626ad09066193facee533530d4973e76529c7a98e0eeeb7dfd27b3e4ca4245bd1a1ffb11a5c0a03954e8859e8119f3407f620b351e4ec5c750252e8f8d31daa889374b066c9fa94dcb71716962bed1a2b1fea4ea689356585b044a5440901bd6a45961cbaf36242f2cb30086965051a5918d098b7ca776fe8d020d2314b5829da71eb61f383968fc18faab4951f2bd807f775a81e6e02bd84b244e8ef8fbea9400ec29313eb785ab1e665143249932d8c11886acc7e8d61cf7ccd5ee0413e1df94739c18b2d1e2e65aca512719a40ee6c35e2560ba297c8e7dae9349bcda04bdf70730686b3671c48afad82388117d69d42d5d0baeacbdafae7a73696bae065eb5b20f15d5fb720b300e625ebc8ead248b49ea97758fdf65989e1e3b202df15075b41fecec36d7c0dafc932b5e7b3fb49c171ea8e588154d04477e64c3735649a3425fdbe3eddc83f1edc74191a338edda84cc4708bf20f6674d1f288bbbbb11299388b4b35f173d4339a83be7a42334159904008e5549c3d5f823f5b92e158d8434f21146e67f73cae7fddef9afdeea050000000000000000000000001fca4c1799e4e91d3f8992c4c45e11fe8cf8b5429b39177b885bffee3300163a3348a8556b4892e9587eee45eb2b553ad8a9250443c1c4a11fd3d120ff1aaaeb95b6393d51bebc647ce90a27a0584bda2fa4340f30632d4400ef7e6c8f04da6d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000df915db5d594d68d883d658f5cc5640bb9628cc01e46b78a973fd3709a7e3f858033cba0c03def2948028c327dd19f9424c82f06107f14f13f5119b13891c2fd77f39961746ed0b512f149276d96c9abaffda56f6929b5bf7214f2cc50cca22867ba8b917bbab34f6cb8866b5a7a4fdba386eb6529f89559ac9566adb636760a031a30d817222fb00e9d79794c0902ef71de1767ebeb1e4e32ffb1873be9de8a5b0217b52e3af8792ca362b838d48c8dfb81bbb4a33d5729bc0033a33848408edc2a0a0454876fd9dcb5cdd0234e01afdcf68c7c371ee00038506dc0ccdd20358322fe11ffe18e8bf34ca0d520b27d79227ef4745b656a546aa0d25e9b38141ec6a26f02000f82a7d7c2e5334f2da9e4ab33da7b73143ab649b62ceaf92484db0840387d0305123bdad1c1a4853caaa42b23e5ee99fd77b187cee557ea330f37593b32c9ff0325e5e653f7a63fe47558a5ef1c255b5a1d392345b632ac9375ff2b5b1bcccd45022f512b3e68cf2269cf7983d188d95b404681e18d1a3b402699df24039b604e2f03080c306455be9466c12103eacb0efd009965f2cbf9dcaeba2c6f7b8dcbd8a0a4accddbcdb78e3e2be82bb87aa49f6225b8a387b141541b20f56c669cdbb62aafa987afad093a09e39a16d3ad69c1737cb4369958703a4a222f00556a712fe10d1a2d93d4240bc41328d924bb1aefb81de1eaedb9496a00fd7ec8d3371218b65777f49fbb347c807ff3413460ef474f6a1070b5aad8642ac76a1d1967a904ef6214615fda1036ea99c84133d21295efe19d51eb46ba0ca65d6b0c8877addb507ac981aaec3ca1912da209cb4347276104be5cf2a528499864239c103b161c1b82df37e09af4df06b84364740e209f6ed90c09c32299b5393b1a88493733ef32543db6ef42c127e52cb07d47b373461a4b31031a1482ab7264fcf41021165d5456340febf70097b388ff5c96f580a5c1105fbf0b8808b1a7fca77f655e5ade9bd4b2dad418e869d0b59148623615744426a511b7c04db3217144438bbffa3c39bf6354780445f1a4c91e007baf1824fcf584eda4dfc3d77ef1da1ee03aa5bc04894a781ec6ea1fe910e3f94af1e976070b2726ff4a369f7b76f1c7f9245397827e02939c056ea7d8769fe37d8f4b9e62f673d2bb703263fa2ed59027fbfab4bc47bf76635262bbefc91b1731061f7edea7a1927ee6211028f545d41c9981f9407dcb3e54122c7e78ce342270f35ac00550c2aec034716bbbcb0c3b30a81002a5ad3aaf2d2ccbf85976df6dfce2ce16603afb58d01f794be323d1d6251a0db9eac9e921d4329c5f8ff3d4ee420e3f3a9ffc879806a2c508de81cb6fbc1005379b8c703db48651834cbbdc208014cfdaa6aad05b5a2e8da8edd2f370d55674db62aaf8495f6e75a7d187fc5b3ed1978f300728724895515173dbd2a1c6f3d4475217f61fa5ccc6cc6588695af18e2e03151a60425f2cfac449dd4d337d7b289e707745f36e3179dab25fefde39fcfe691c1fd5cf6f0d48607e7c87040e8e47f91a5f034690772ff5021cb835c53b612157ba6993973020457f48054ceee5e9f4b08561340c5671c0c5b6c2509606d93cc2e1354d5b673ba8853c2c40b27713a7359a6861965b31bb01b6cdeb2c2c1c56b510a5baa175cb6cf69b88b07f84e988024dfe9bb549fa961c70ab1502985a0825260f5753f6dee70320277ea08bf18e6e232dec08966c834ced61ae0031fcd02e822626d30729ef273808682135b48bc2e89eba662dcbb38cf8399eb68ca82f6a306f91aca60f2ca779d79f2130d9c80472ee7a5b208277c744a6afebd49100769dbb45b54b6895e3b3214139ca297272fc073f9263ea99b8bb07267073068eca676a8bd3d8679f6237694e1f771bf54ab7ff43e82350d036507782fb1ecf998f7350621f885a867361a0514033b83dce61f7a046c970676436b7cf84f4a81479a122061147c1362ab897bb31aba3034833fd214434b542aa9df889e574599d2993d791d8382fc7db4c5056c50d6627484d2b588f1ee4f635463ffe80096b4c3b5aa2e1ebe314b77333ef37a2e179462453b76a16c67f026ec28d178dd988c6050135fc0575165703db2a6fd1c48d7c7603e60983ccdeae437ebca6adda59b8dd8ba8ebadfd9ccb4536b990f3603b70b3f5cf06a78c4092182a8576f1926f5530cc3e636ec0f48877e6ee1168a5f6c78ad5d88b0b0102d774a7b7222fe9e89ede12d33890ad61f71b21c26fb63cb57850ae71649af553d6b05346afd9b483283e34c3cc0000000000000000f8421a01000000004b4956283215106d8d189d2a38f4b428c8265ce665f29161cb0cc197ac264e0992f299ad13652a3546a63b4f5566307462bc71a4d9f223519d4cc6bdb85a364c6769699854806ae710aee708c102372af32f9e6d16a2075aaa56364ba9d5a51700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ed83a60816c298aaf0a0bbd71421b9f36ba26f04e62a5ba209fc2f7dd9c03dd7d1e22c48911c56af339f24edc9d08d6294ccd1f92760738dea994f3e75f423b22a5c5b518f4b3c5de5c54894ba8799dc53079969a09389fc1394e7a2c5530e1d4c537dc3a74311eecd0b813aff737d00f89f18edd706f160468a88ae98fbc008021b7fddd917a1e9f9c203927c3f20cca87c9a3a790c18c1779d74015a9cd50f8e03037de58ea7eaf610dbf4924083ca8e4b3d24acf2a22031c1f58b9f515595a3680b041181dcd5acf5f93344e76f6f8bc6d62f351b2240d84b20a69c6e57c05a46d9a926cebb7b78b9c55acacb35e12ff4b3d1ddf384be4db657ebdfd9b78af1d1b803147767c6d4adbf59af0619f7ebf4b00219714f9fadc40e302ed53dc7defc4a94021506c77cfe8b02bc3de4e35b71841eec5606707888c1d6117ad94c966d35a4da021ddb185d42f993806567fbac057481b1db12d2d1a2cbce1d21319ee6f511c60303180ff9fe20cbefe8c6f26075431b2ad023d415fe79f955dff5a2cc769e7e169603125b15d6be454718083a084041346dcdb83d70970b4fb8204e757b3110cef4b942896c2dc67b4185d256e3ceeb83a4dc902c9f124eb29b9159b75851f152bcb2ba989c380d0f1ed91d5e1f4b4d64dcc28b86f239d50d84da2c0b977ee64e0800caf28e243317b1b6be58064296ca8c89212a5da619c076407248870c519ad214c60e0fcc509a31269712307749971301142aa98fc18e7a2e28aa7ca17961cb97a97ae4d7cdb8ea73dd7a8870f24efa2efefe15f8bd9b2353dfbc3f90f4fc02f90deeef1a26ac37e168141d9a1beec0d19f8822c4fdd327c70fb20fef0afd8bdc366655e2ff72f056f8d08e7e759428a4a9071668d1bc848709d0086999f70b956ebf66408b8787d78ae1e9bfb6713264c14bbd5c3f1b21152238be6c1bd90293ad614f2da2f79456e7d99ba6c9fef78b72388d960a40efc93279364f028c9d9f92e978ae8831b3540c9d44bbb50caf776370dbb36c491600ea5b83685e6ba0eac1cf4a2b8df5d6f17aabd31c4f29c70e89a843f23215769e36346cf832d1baddc36ca32d84ea6e6072b861b48d0ec06f412d074c9be3c17de000ac286e312401bacbdddb2d3643b08a1bbffb2f8b25a1138d4c1b5e69e9d96f1c5b75fa6e6831d559ae509cab6cdf12dad096766e0f527bb39c5295156e629f3f66d070b3f58ad2448a04cb83c3d5db2c82d0be605a6dc5e49aba8aea4d7c0ad1aa0f2ff427bf5c4bd6cd32151f6b2531fd4cf94ac533df94b84f4139e45fda1675c107ef31f032c1d025af9356cb9ab70e1be177ce4c5a5b54ba7f3346479b985af554928d95dac5fc973a2ba9297eed4562686b9916d6d3945cb120187b2e0a849e7bacf8cf197d038b9d6c5b9dcaa8590d8ab04e82315273b887b20fb28807a9e1e8b986be749eebf158ecbdbcdf9b8c1885973d8b2a131039863c4d971ef921294330906b57e5ba0b1bcbc90969438047dae3ac246ceba6aaea8fdd89be9ddd9a3db23f5b9232ce4d9c1759102feddf4c505b220a773d7f3305d2d6666021e37ffb768e08b2a46ca6717fb981637fdac04cf76a52c57b01a53b602ac4f105f50afe95a5fe79d21fee1a76e3b3cd641790d26b6adf4248a85ad4d95cbea37b438170b5c34c8e97104109944cc273f4a08001b026ba60d413790f5607cfeb8662c2ca2c002d51c9107ac4ba0e5a45441b47905d163e2367958fa7a3f98f712554a98bf301ddfa555b0dabb52c754d0c4014e221426d96c0e1a1610250f265646dd9334f679eeb4d5e72d850988b7864185089f6dbffdc3ebd65c6c02db41dbb1f9682e5727c061ec8940d355ae7dde32217f2e3b8ada540428b79bf14b1bd95896ec77767ffb56f7b43505c4b7c4a71fe26b0d954d5d10b028c1a67406369e8b738f4cbdc4d8c5ce53b58e8c7dce46df02203a7989fa4b28ac3b4295828646f06516b8129742637cf63492f7f89dd3390c91001aee425f96632a7b3458934c9a58548d4b72f397c9fbe231ce258b4dc333343c79e943ca2681971481b5815654ed8e44bd3ed5f8e2a0d572bc290743c26d111a4ceaa1bb0ba9856cba4980ad47bbf6d651f58fd1062fd8aa3259759373f9978ec20bc0cfb3b9393394fe0387021a57f1cf2821532cf214c727b4aef262c984ecd45da7ad3f8289580f0dafc5bc3b33129ba88995e0f7fc8541105b21ee5e79d92c3658ae385d2b66944e42e0a2d15e945ae5c90f947331357c44c5cc44390f17e688dba641d6a69c612171194c66d20f120dfb7be37746c9b5145e048b50947adc047adc7ad102e1e205098c113d0f5a2b87e5a04d7ca1b9da1904475731a1ae012ffaab49a138ea2c9e5c365f743e5e55fcc71f7c7a8ea2c8d0d606ca4bd617d9641ef04", "6a51ac00", 1, 432803785, "a525728918dd2db1e8c1cc328ab4f5c859b1c65a2e5bc8fd04f7936699271999"], + ["030000807082c40301bef3f6cb4bffb205ef3638cbd40fe4efb6d9111a422edf4389151486d59d08000000000004536a6aac682b822402fc312a0300000000004d59a3040000000009ac00656a526565526363fb0c63a02fffcc0200000000000000002360b80200000000dce39302fa687c1005e06113ee6df2572ee173018cb669cc1cb562f33911182f6bd642947f9109c8de33b0cfc250badf11e4caea9e53943f0db7c12d6e81d34efa2b6ce0bd791b5db9e7f6fe4bf030f7e184221aad74e877bc6a0c5e442276330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040ef35629fafa9765f177bca64dbcc55e5a6efcb971994d441080d4fcb3fe6eaf77432887b260c047a1dd077be34137107f00c51dee464dc87c9e04caf6edd56b0fe3300b53f858b09885368c974f2ab2f8218153caee37202a9a30ca755e9f6fdc6cf86d275f0cfe975c23c6b0b7700f3888eb877232a3ea24326ad16ea23d50325121f8dcbf3585c53134b8de8bc6510e0d9562ac12994d5e07fd31c9b4edf990215d977e61dd28a2f38efac90ef101975d48f7ab5e711d196e34656c24cec8e710b0710e8d41fc6ee4cfe7201251f6652de7f04c59a71e631527121089beae2b00736771d9907128c02db2d9f8b0d9f5d752fb9a2a4944587e606e16ef0b472f4c80222a3c440543620073337067c4ddf9c4149d7807f56f54e68a08e58bbae5c232f020ab86e356f76b092e7be92fa22354644840b9aeb89bc42b04badb6dfbb1bcb41020a600242424bd029538cdb1f3db432327e234e3784bbad07ee4f0df6f2349b9b020d208bf7cb9f2b1663bb3f1f387395bbb30137cc3cf51fdf946f11cfe6585984022ffb74c1d3b708bbdc6fc8de913f9701cd7bdc1c325db403a3461c5248bd8c367f715e98e3a14387905b336982af401b4c296701da224df76e337a1cbd7d393f4c0d1c0c570c645ad88f9f9d77806bfb50480df053e66d0d01ae1c4bbbfdc840d5a052c1d92b3610e297464db0e2fb25f362813e65989df7c340b33b5e38d841cd6a4b0ed56b5eaf88a6d0801172ead9af9ff59e36b9f5ca0240a79c3a92b0333300591a75ae83b91da2fd266d0d1a9b0e5a13f675b30922b4c6188b93ffedf7ed3dd8087541890aa343faf47e403f630fec12b8211c11db478f356296da63321ca26aac4c0304433359c68506926da50188dafdf0b2f8576e1016350d066e1b056775f87adaf5e6ff8296d785115317e137678f03c96c6a2dc2b8e14a270db368ec8a3e9529a47a4de0e12aae22cdbc45cc17b7c3324316dd05d7e764e1b8960e9c5db54095a79e0eb5c62cb29cc7b2e826eded9c3c1600d48995023d12228684586ee2592106d7d6b99ef482693b9c02a8d6947d31de03f20e2c08300158be726ace77c62a110654d055efca95e543f30bd0631962d92288a99da082b84810aca650809b90429ab0f302fc10adaebbb708dc349746aa24cc20e5c451ada5d4bb3cf3fc7230cf6867f7e187281943be036b58571a4a70bcdffab3d155d44760cc7d623498b121263ed11728f6da5efc5618848c907ab7d1ee5ca9f7b84fa663d73cee64ba9ba35509ecf5c9d6dc316c14015fffbece7448820f31678b7196cab7221bb1e2023c6c4aec0cb261702f0686037141bdc645a784cce2e7cdbc0d65807a47bc462654249ab646ebdab2c61908d9e3966ab51b276bf6ba18db42db3b4768fe27389500a89a08f105e898e3b4d276763785daa6c57fd967edd306104a121a5065b45ea7608fa6de334fb6cc0d57710b9e0dd1d49cda3291620cd5cd4727f72832d1cfc3088162575716df524b3457adf06e867a7e563b1f2c80e3ce32e66ea30fc7094f79cafb7695afa6e4ad287ab222b8de2bdc4becfaf0de5ea7a88576b958f77bd826263a124daaa8f82bfb2f2c214cc80cfc5a6f0bf7f65ba062756343c526d1149d194e40f30e7f508dddcb490b8673ce61461c0771366b028d74fdba4303ab872548db5a23efb02721dcbdebdf029d22737afcc56f248b6a479341be43c2c877554f8889a0cc65cb140140033ee1d3d7d6fa86335f5d911d07d1d4b5a9282c9494dd29504cf0f87a053f31052b9b74bf73aed835bc3e61851ec6932542100eebbd797f395216ca6b7e32f8245d39732b51f625970df8282b05681e308392d2e506a1aff6aedd5fcb100a17807faff1b3d695cc965e7837b21b2f88b009b2d0fceb61a4d825346ea0819d51d0957532e95d73455b6a66d8a7a859cb3229ce98f8190cafbfe3359650453468790444ced0b0030c522daefad63bac9d6fc93da6a477dda2a8c64b766979dbcff751b895aff96b0eff0efe68a7c5af4bae3a54aa1b8f36f2b5a0e15e5a0b88a8154181ee9b99ecc021615c161dd425dddc7a6ee3b44176228c502595d2d13bbd100e1f46081671927076fc5d8064e44bf25148aa0b421fec7a2b481b0513dd18f115b4f96e345fde64938cbd1f240589bf4c3e278eaa4fcb7170f37c81ce66de79c978aef37f759fdebc24c252881b045c2671481cef2df359f1b93671abe3a9d6f9ce83df9d0130146699646afd7d6fedb8a531c85de7b4e1d4daf11b09dd2286950300000000000000000000000000be359d841ea0bbf8cb1946e02afd897615e8e30777b25edffef0ee8acb28eeea56c1787868676df0b20f035e7663151d2562b7989b811953f8c5f12106ecda7c32752e9f96a9efb9940358e8a545bace19cd45d75ed68bc86861b6be9b670392000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e5df8ba42e03011252f7d04c153ccd8e709dc4756719a449d086ecd9c378b9359806fafcc4e3da711f71cf4d2c2006dd2588401ee492d372a63f08026fcafcd73e83abb3ad4494161afe0f8a4df9e6fb9add0df3288986e366c49eacf252d80ac5838a07d35c4166a6c13fab24e7a19a41537a5b6c199dbfdd3bea02f7e07280203fde1316a33c189534c12f45f1cb32b9a3a7bd6f81cc1bcfaaddbafba91d31403124f474af1e2c772205ec1c910c071a376fae971552abfa915e2f47010f5c0820b07705fca88955cb93db4ce8787304add35b464919bf2e63750525ff6cd060e2a9a739dfe86af0d4a8c45150a663208578ffbc2a91bad7bb2116268efb7ea8dab0323195f49ab3deda200fea8bb0b1f3274cb11cbcada0752ff7fd6bec59d4a638e02120e168cded99c21b08337dda0e3645dd8493aa617bbb97e70adf1fe310409d30228516410dce030b6b02c8ee2e6f982ab8d273fefba26b6afe8f3ad2fbf2b483702281ed896d04ab338a906e1314f1bebc26d5bcd7e76c1a2ff677bfd43c717306e03254be7c6c9fe667c30a44ce8eea6571f391208492e25aa7d9fa5c2455b332ae33616c9350665fc9e6de065e2ddda104d66ef69d72385f54ef3180b4e255f2822d3da967701b00f05293b57fd3d58ac51540c60f9c92937b737c4642e269a1803db2bb56243c83a1949dc30dffca0f457aecff32ce03416c7054e2338718a9d7deb24ca136caa1693f149d1845e140d410e77c5cb7d5e85ca4d2c6a2118d52a6f667a6efc637623e873576d50a0cc4d6f1088e59cdcee609ab0c25ebb3accf195676b1522b735df8f94a22ae5063aa34fa4d05dd9e946af09adee08dea0810bdc61be494e874cad58e59a3c4a641eb4f16a65d5868db2deda9714ca7fb20e1846d7b6d1769f8bcc2667e9a8ddd24fe6a921850d497e584a9fac0085386b33c4d126ccdbf28bd4238ac3ebe7c2f2afaedeb100dab510488a22b9963195aee3fa195b81c2b8699befa4046954842cd9adb3437329490232f7d3583b2bff97d47d257560d48aba2e2bc774993d9cd2a7be3fc1dbbcf10dd9452bd641812989aa8bd88f8c4957e84fb81d332660d18aeefb5b2212b5df4a7c5b6062ee281467d726dfed8e5f856c6947b0c5fff7e11cd75816164800be1f000da8afc406ddbecb753f62b7ede0bb89f143bac609a1a11366f20ad8b46bd387f2f7a9349a70869502261b08f6d9acfce7a1449943665d3d6beb5fe88491aacf50c2c6577658809a72f3a8b1f27db4907905b223270ac53bc1106f29c9e9fcd1764d3c2eaec038bf6aa5c42f982b6ca4f2de92ecd5a32369fc145f503bd5266525f30caa2cc42ba654c5248f33f26467ed284efaa174482f917fa8d1e0060316876a540ce55f5f0493be6ef7d635d934415c88fbe446e925305717df3b48738effb22a300dc8a2b80176f9859b71f854ee47f59e95ea361237aba333eb873fdf8125eb23f5ba2a93eba0f315bb87216b0569adca2f350ac48de5781e99ffdca919ca2a04bafd97ba4fc393a565b41db17edf187ac43051d587568743594a2f4b304c8e40970c771743df7046523a2bc287ea2f6d0c05f0e94172483888e66becb414249b07a81adce233916bcc07bfa6f35cbf8851c43d5555a20b6b2d9767fdc6dfc2d0d6792e67a770d65d3fadb55a0b5147bdf2bfbdafe53768ee4fe94bf8a0eeab6cbbf727024bed169aa6c7ef93f5746bf98435656e9d8b744acf279616926327fd2ee5512f1f60a62390220306e9b5f0211ba85dfd83b6fa5fd1082240ee7912b78088ae65e819f408ffcd0ba0e9d2eba89ae014f8af24ff82c69eb8d363b65b039e7ea6299ef97118dd76b3b0fcbf6378f528672b4ddcf1d78558032fafb4bfbb84d45106f7d6a940d1c4e57b6268f66a1bd2297ddb088d96cf6879f6aa30f2d4c40c07990b99b9fefe96b0bd0ffc1d40cdcedf22c9e593e05d3c1750c95b44bed4094a987f4b7fa9f4e211abb4b812b832c090138857f2ae0b68c60849c870f55b571df5d586f019b22a03b683f0d0dd51780249793c2662ef27d78e14d06d64837bfa2bcab6aea7010b41108151affd5d09fee03d73bcf6e8b0902cf6f954150a8994dba804a21d472c94c0678270d6dcaae0b87a56a54db14fec73ebee451f456c5dd7251022e45b248062f6d279737684e463a5114df68ce80196d03fb25483ee6112ae6a9d547fcd7f8e89b99a9d287f6fc767618629a0f5b1515aa995e5e1d8969cea5672508b27eb5e695171aaa7eb5caaa5771cbf1de5f1680a5d0bf291caf696fede4880da6887de83ab370d951251a3a230b16c3cade752cf6f6fb6fc92b31ee0188008337ea7f3d3567bba7a46236859e25501cb8f996843b3cf39fda8a730e971e2fb2e890ade2db994d3f8e3e7d272c07001", "6553525251acac6365", 0, 222134588, "8ba1072f592bf9ed37494e4006c2d0b9b793d371b0f2938a1d358be526544463"], + ["030000807082c40303d6401cd2da461d86db5e5e5efa571218982b0a78b04e9f71f33db43ec5d236dc0000000005655263636affffffff9d32bc6b4909e9cad84035855266ceffdc4eecd9cdb01c4f1e754f481259e905020000000163807a27b19a02acaf8f17ab1753ae6174a3570a2ac44b2f925170674d01edcefad039268c0200000002516ac24a1cbc020ba37d0000000000026a0002aee105000000000163000000000000000001f7854d02000000000000000000000000c9393bdcf55c9fe0eef982810ae37a1434dadb2a23690b6fb8a490a644eb90272bbd0553cfde0c9a8837b463f4e114a80af0736e859c0c24b49d9b6b2a398bcf4296cb597174f633a1e422d86240610410b3559046775f919dfa1402bdb600c20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082190d92bcb2fa59921800c44a1c55726a03a2438ac2b132563be4f581aa3447f18b6f2ea24b0bab8619e28796260f19014668afd586a52b757d2489151a5eb5ea339c532fd349bfb666a198726c9c8ba1a98b027f048ef7973d7e6af9bb6c741283ed80f41d0b8b880c7046d5f9b921679db1cfc15d39e606e63906f909ea210301b6e403815cb8b649959860f2a760866c655d23c34790ecd4da8c024843b34f032652cf8c00845f731ff513a8454f17e9506ba666420dd395ce919290669bf7290a04ceb7deacb1c001b65a744d85b48221668d382ef8105e40904f4f43035fc1047e238acfb76e86b03779d16127be40493e973bb2ef6069d8ddcb24489d1fe5da0306c29ae1cac43c1b463ae638002c4b85db2c39e49d8f4de68be1c174c18d8395020a3ca614f3f8b23622125abd5eb668660eeb2e85a1bbeeb76734648c267b56af032f06305dfcd9bdfd52f1d04e47e0d56fe2b1d36df45140f49319f2df507230fa0314a23a48d52f13670953c04219ad09ea6e1a016f4160bd77f4601e2eb85addfb020794df7b8673abbb87eea54f8fbbf392fd54762673ad097ce1ae5b6a0657b1e65d703a7c85ec081c2130c3afa94d92fad83d2d36e6d5e96d3a63508e5301365a9b3a54a0a2c4465425921920b4151543ed16fb92de1b562caf978595b15141a52efa8b701948e6248adbd6a5f8c6fc3749560dd05e4e41d368ed5974cfa7879ba754d43ca3dfda4a9c8eab94fbcb689222cf985fe27841bc53cd591d3f97ca9c238f5fe9a6a6754f1cfa4e2125257858c186ac2f479c416f8fbdfa8914ea61c4252dad00459f9abbb7aa98dad55f0aa3d9b6b54e80c2ffbfa3eae4b27dfe20a1875d365acb4c20dac48a55d535958a53240851f0149635285b8b186a06139e2ff2e83d2a6dc95f6fe9b72c350bf6d5af5537109756826e3ceb31569ab53b78f5f91f7527dd06596df96806a0896d15e6c5d3c2ea7d1d61f3eb77fe24a0bdcea23376c45d6192604b4af4f5176a8aa7ce133914c7d0a61f20482bfc66b0f7dbbb08c6aa0636f36c941b5bfee81e88d7511b393f18cfa27466b7d9e9fb79e072ec979fdd41de84d5444a4845166701c4720c52d4fc589ca7f2c022c6916c1d3f40550d74dc6a75b4bf3e47af5205645ca111de90a7448d705023836553238e376e5ce1cba1143ee8a63817d0d539faea1debfa310ea3f287b09853f7e94e3a0b80577731bcc83637e2f73166e47b343cbdb1e15e87b286eaa776792552eb624335738138c6811faf84c56667f216bfe5322ad47ee421673cce49393d39b4c4463d5a5d48ddeb8ac260b3c67f4a5aaf047de5f602a4880c52f96156ecb201b67c31b193eb367d72b8d496ce9db1fc5af1f8906251f37b1abb254e509bee9b08b675b143305ce33b34c0d3b951443293f12ca5debce649adce261a2e98c0a1ac51029adfc0eb7decdb68f43664ea936e595fbe8df20a96976c20d0b64758a1cc03015a775542317feedf7909711813e91ccf4f845b53b2675137a4d26193ec5dbd1fa9fded0e0098d20e170c840c47cac98ae5134291a8b211b420313457a1e9f48a60055c52ca1af0079f284df67d66798d2df3e090f7fe00e6252ceff2587c787b71f235f7aea968f911203ba2e0fa6258c18af7fac36b7955688733afb56a268faf05afc9854ecc3d27989cfd06aef5ace9f8c5c1600029bc021b34505a1fce99ea0396f7d3b0b77f4940340c3e6d9daf4343013d6892358a564e3cc7a799dfc937c5c954724f6fee214051d0b250b0c08d7ced8215a5bb70207f091986f8eb07dbb27a35dea72eab1094bf1c579a35218b5e0508fc16facb1200d295638b7295068df8c88f9bc2ca377ac4ee4eb86f82c53740aa5df02b5001a7cf7af2af60f3f95bba3d980a9590e34f9dd351f3999a6a943b37d6c6c5191c06fe7e9a03999fff8b29122cef175dca108b1f139335fdb0a85703a267014beb59c048d9e98ba7cb4a56a3513af2737dfcf9c043517eefcdfb2f25fc81db5c491f6cf7ec2242af51ed9523a045ad02c7b6760780a3444325c3aaffe916e7003b51379fec4929f1b21e52735bfa2a51ad2098ff6a37f2a1b9280aa49606553e70014b2eab855a381d3e7b23158d127859d86027cbd20bcbcfce3d23d9230ec7851290698bfae9f062a7f8402d7d087e88dd72d2e529c93f1210e047431a4688536dbabbf9b4a92259a8812f84ef9b5bac7367542ffefe8f34061e41bb568d969acc665882581472af099b4956d59090fab3d564f429498afc1bf05058519299d64e99113a9b03533bfd49f63764ff8d9e5707bab3bf65288a77fafd20a62d53df4b2b7126eba5d916ebe74edc0c7854abd5c953668697f59b5b43c10e38dddccfe504d7792541b862e33844ee5e326b7c054227da0d1bfb6c0a", "5163", 2, -760721532, "9a7c510c8e78872b9d512eecabba48546f9fcf357bc1122d7b3c6ea42ec8e506"], + ["ca313d10015f5be7be7d29951980bb191773e0f42981a82c323a59c9be0df35a337d20337b0000000007510052536a5351ffffffff030f3deb0100000000026aac4329e6040000000007ac536363ac006a352bea0100000000056a53630052110d68af010000000000000000e2333205000000000485ef4993c8bd460a8d706e86dd0fe1eca4b4b8c99553b49a8ca6c744a4907009796fa502df4e9eca731599b6e12066c3d65cd1ee1ef954abe4e7708d7bf3685048c2e545b47cd91ddeebf8442cb40f04dec610781fbe3ecba5564968247e35000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d571067852443f1085081cd793e74d8f036f7b4baea8692130917ce282ea0a36384915a49d957ea26ad7574599c25fd01736667415332857072bad8ae6258ee0e726d1d1a1e6f73cf31c36ac44a41db68b4b4d5636cc07516b8d8fc629d6544dd97cc85508c3a1fad6f0e14bf9b27dbcf912ca30fbd98a6aeb461348047b1ad020e64862a06fd39f1986e236a024b5081ea6a3407969edc11cec89f270b4513b703101da940df20c2daeb6a7bbddb5d8ecf9653a6d28c09dc43726033c9819e82000a015b3bd48c6dfba637ac716ab86e5a5bf0b3b25002b6cc83d5f4c87ccbae355e71341b9ddb72ab219562f8bf688d5b95b0400cc018a4d0bd0e876411129aa2870206f99220618ecfc3aa2ba5a5c11c8e1986bbd9ebf23f4c6f3a58a765f0eef2fa03276d5449faa3baffbf250e02724a0c332c817c3292d907b6e05a25535d5f7c9d021217c2a532de1b1e826634e60955b41aacd0e20a0ee6be8a54e0dab1f35a02a10211ff64c3cab386c38f1687c1b41f9384971e411b0e1157158be8bdc5183e0f12030eb1964a63a71f89859688fc7654e59e735bfe40b8c332505d04ff9590fc831a67dc6c94820ac007079cdae0dc572bc48ac54185060051b6037f3a690200d97cd053d54e85d2252c507e6de89bb08258a0a66f16c35cc2bfd68fc30ec544cbf40073df344e366322072d0931f016615e57d581f95b6efca1f2a2f8e32ecdc3b6fdc777f428cff2c462be0990e26a506bc07392f6aca671cbef279c1558a4aaeb0f79f237f2166c7d09e76dad52a082311769ca534405393c38e96c797c0c503ce9f29c67a5a20f79b24051c92cb8f99330f609b6f06e8cdc57ff26e8bad8b84eaa2cfbb2f23f13cfb2ee60f20d8d4b11708a8cfc7ee25a00812fa132d64d407116769ec71128c48d1a720e7caaaca699f4c87f5383abd5ae4f377153229cccffa4e1a5234ec5480058043b2df7ad6c0c3c7a77933fe926b4ce914c365fcea190be61004bf086c9599b7474d8c1f2b24e66acdf217b76db034a48a4bc8b649fc262c4b367b59dd9269ecfa5a5aae77dc04ddf4e716517a06d02490b7e01d8be53e845bb45e7b1d68302c106a55bd768e7518fcd58d89539dd7d7e434c527962ecf13a92e85e4f4a9ab35563375c85d67ab8ee793f887cab08b9cec1866162fe6e50213b6a8d6507bee28d3a36c1924a66d13dee34749bca1bb74aa9da65f922970b69532755c646113486611d4c10706c7a77fc7088323d34b52bb2ed9e1f1de0e7f2f0c1c3cb03f9e043096579fc3a1bc29c69a6b3e8d5d2c7ec1840933d5aeca06218d58732c356f2eccc74aea315222c8dfcabb8625c08dcdf698ca2faf864b251b80ef3b8e37a5d0a4fda7f15f2a0e6cbe658e186d7b2db1f502acaf1119eaadeaa763cb23670948c54247f6f04780f1df183813092cf7794fa1358424155b57bea0092b638c1d45a4e7bb1e901ebf4d20df7e7007b2e52f42d309bc28e7a43459bbff059bc753576e0061d1cba66fe16d1ed34a0a8ea51e58b9cfd87b889754a43f6d001a65ee8a9e82f1e6f06d0dec763c6e8eb471ef51312001888be1ad6d03422e8ebc79921e04595b0dfa159a21a4c976f6f3f25968b0a66a85cec7f05bff26dcfa2ba1fbdd23768aa27ff57180fa8cc7286f3211ddf11c1a45353f9dbb7acd672197ff9b2f2d89a66f93e79ad44cb3d1a703cbfacd3c8f8ab4dbd5c9bc935315e89ce03529bfaba72c815bf6aeb4b95c32cab901c10243b3500621ffeec4506007b49136dfc2e6859ba406c91950b94c4a4b2594f88c5e2388d48e9a14f2014513a3f3888950011df03edd2dab0c52ef6471ab9fbe1d2163444f8868a829933ace228aca1fcabd092de8de561541a6e74f8204e490dd9d7c3d89cf96571eb4f01e6cee0a75dc96ea81d669dfa6988bf159c4b533cdc8f18e245fb83617d9790eb6c8c47d9825216ad504cfc1902ffd39cad75f16559f65e0d1839d18678f5928acc3e56d0dad41a305dbd9162a0659fe50441ba2d16641ba31825bd918676385a53383178ae41509356c65211c2ad650ad5129a7b834d973fdb59b231952fdd5b271407745436e20b6b39fb178c9492bc0d7da6d03469cbb7684a89129f5dffc9d6b3604ced6f55411355f5428bae35c46cbf164793f30d5f22cf8fe064cc3b78b47dbe3d21c4b4fa8249cf66e2e965f27a3b31ca8077b9bccde89467cb49855f46a6e1ad9f463641bd99b164522c854f967deac2a7130aee02a009b33617a0717c1bae76158d788b791b3a1eb78963d34998a6b5778fd7ccb99439a32d86f4279b2aafedb7cfdd14936ad457baacdcf22547b85567e17cfc09b5a5e087eb41d376c95a06281aaaf66d055f79b520a81fa4aa04ed8d82c71f099d0d0003147f9237e4c94d28ee2151672fa6dd0c", "52ac52", 0, 1091588510, "ef6544dddd52cbccaa8506222be41269dd8588fff2324581a53b8977d921f2e1"], + ["f0d7930e03283c0a6ef110eac61427f66af1dba8566ddab37e5465d30a986c927febb564fd03000000025365914d75d7943e0ba8cc258b47080df6fd82b70b7c123482e76c15275e6c23844848300f99020000000700635100526300acf8d2dc3ecf0125792176812f572ce58fc129d79967dd40384a8fcdb392b6b163b951840200000001acffffffff0369ebad000000000007655300ac5153ac54052300000000000365650070320705000000000952ac6a53ac5200ac510000000002ce8a7c04000000000000000000000000ab7d8586fb3999e5c471638f94d8fbc5ffe15bdaa529a5cdb274ff9fd5d9602be39f796f9169e3b506be134656150ad82950804aded7e2f21b2547bf2b59c964a0f459bf7760ef79814934ccd6dc3fb05c89136510b64e3549cd7fd3191eb7fd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d9837569046388b5fad5c6c63b2d1f5cf59d8cf44804f1e29919688d7ccd79bfe4deb0b4e3e99a0c42183c2161595d6535951b63a1b63719e0e123bde658f567e68c8c443a0c152510a5e0c470e09b494093a9d9ec7cb5ccefcee9552112c3e2d41f5ec4b26faf7a71e6505d9a4deda979ccf5a061c377e99710d8fea3fa7cb003136d1bef0bfed1a316bcb891568373d5a95670fda6de04d9eaf1f7979a9f8290020072b02b10b5ccc75b16295d0a5c2887863496d5bc0eb311223c93bf8ee14ace0a049107521b10efd167aefe6f00325a0d9f3357e02bf99e26cabd7d787d8b552d380ae38db52f27cec6d4f8dfe33b3e8cfc5219009c0e7d66a11bde726a36030a0215c88347464e87eebef2c5b4c81123674f76aada47e56946e50079d798956bfb022317f9bed1583bde19a9520d2b2d0dc5969e6d6f7681176ad4b5a63740ce669b032f831b3c3a6153136380549050ba010963518d130171ec18ebc183bdcf047a29031101913eb63fe7204a4e766e62c6b003214063db171a9a41a83e101df25d1c13032dd0b9d944e93a51c5a0aab6e37b6c0b3bf8eff35f236692be23f7519b690c7fc2e39b0f0c704f4000f64a945d29fc904e92663918c3845cd62044059f5824e16eb062ca4f69a5d50b2e9ca7bc1a1346f0c637b0d295788c6e9bcf3bd7d9070368f60ffb3ee241be00054d44de5be156c0150c0580e41dc71194f0e3cfcc8825daa0bdecfb6a040b61b907cf63ca02d66831b101ae04bf5041d1ca0924a08b5639e74b550bb989159d110f2dab30784036796c3a1dfff777cbc32e635438f0d4cdd5a2e4d97931a746aeb0ffbc53eee18f478a6529d89497ddf49a621707f3ed27b9a51083bd371fc7f79857e8a5a6aa0c24294f12d6ebf5b0ff47c151cc531d78e91a187c0c7d4d26e583aed7d7e24510d7544b9ee481853270d3fed0d88669c5acb816effbe68bc2f686fb6e9678dd41516d3210ee2ce9ac8b33ceb9954883d056fcf32e607cb4f76f7c5294048f67c8d572eebdf878480448f9f2c68ac71ddddde4a05b9b5cf3af52839d47132773f514c5a4645f6a3e829bdc0cf7429d4825f5dd71196f2b9574808ac7785e9c429b99ee52e9bf33bdd00afa83425625aaa89e55f61e2ba87fd3c84fb36b7e4fc0061ed2f5109a6642373cb0ae9d7093f840827dcdbc816c95e73f728d5963a0625f7f9cfc02d34dd4f383140a0b1f6a5903c79b9677bec9a886781882076331eea79462771503887d57db02c4a90956f275fee6cab1cf497b0ed5391f149ca9bb774c40b5684712d1b10e2b69113003375d7e952b9f7d747ace224157b3ecde0cc53efbbce84d183f25d6c8d4876fb09e2426318cee103fa774858c1a68ebbaf534c5099b0295df8984d0369e33eec45a1b305fa4374524914bde54fe9a5c24c6ac014c708f81732de6638b90e7639c647a7a4f34dd41e5c54926a13679dffc126f1f416a04702ab6b33711010a3c940e30e0549121e04a350d15caf64c69a05ebe3c81a48510502c6a766ec29093285dd254a7dd9df551839429c6a6dda7e60838c678c77608b64c35add1c000f9ef4909dc0f73d4cf04dd9fc41291e6e91be78b655bec00233420b504da3b56dd087b1f5a483aa40fed4e64b0875643840c48dbfb545d4182e55dd923a601ff022df6adfab34af345afb2fff54ccd454117d03dc3a78033cb2534a9e0ed08a3b5d8cce3322316848f89b77992616836da991e577d24d519882fdc87890b9ce3cb5ab5db5763a230328a25aaaa189d642bd782ff4100cfd6083f5e00532fd4ab3dbd8c317fe576ed5b946b2f40a429909f00bc99da77dc022e60c2a9b145f2c140a68deeeebe0afd5b57495e4287e9f2c0c574bc4f2bc4ba6f54f38f62c094f89608542c5b1d1118b7ec7ddcb1a2903019ea4f21ae5b55afb8da5780ed0cc146375f9b6a9c28a03ca2678403de123e014ac95784fcb0cf15c41c4c59ad36b1dccdbb881aa0b4bb1a93d624c5d2c6175242ce90e5380be4b626d77b010f4da941870d40e3d45ceaacf30939952cf8e7f32ee56ead2626b7b41da611bb83eecb2a2fbb3b38d449326cdb201471925713a199c40238ee5c36dba00388ab7a622670ca8bbe43dce5fda72b9b4723427d9201f2eb08bc3d865ac994a132484356662bd2fecce771ed0943ec7a0ee852e8279b3aeea4bf82711dd5394f677afb9c0038f8a06a1cc30298ee85b5ad3018868c31f745c140032d9aa26c1c79f3c6a24165cb6e90045741f1212d24270054388d1e76618086f7d29a02010000000000000000000000003ed7aa7b5519e1ad3a4a9fa78dcbd10f11ed74bd292755c4505cb52754bc5bcec94d0599e4e542c184dbbd89cb9da46014eb81f8e8097bb0135a778efa10e3c708221f2a472bbbef660eb57830102bd5a84318bf42124cb9eb680c4527cd76db00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fbbaa8fe9c5ff9c99585aad548923a194c7e8ddf12e3c0b025ae318bbf4ab0ddcf718a781679a980e1f10a49e2a4baf535ef035bb2c3aeb4802be13d27d9738bf4437f33499e7d7affd993922918939f0beb3c37a8afb684d8e19c1dde97110437cd5a46c06c1469ac86acb8d0d767a442ec1e63c1ba9c669caf2ef96fa540b0030f0e5183258587b1bae4d41bc660532b7bd4bcc39615dfb2f72c45b51945c4d2031525166719809d4014abb6d54de988020418892eb67fd4ca58b6f462b3aa3cf00b07f3efb1e71412abc467a0a7804cf9f7bb0253fe28bf4930287e03d2b9242a15dd8ca35d2d40fafcff93f435fbcf4427c330d84dc2d8db9ccf3fffde30ac4e1d0227fd876afde2be4d7846390ec5eb776c9bbf9772de786f060f4d4744f478d4b8022b4309f5c8c712699c4cf90d39bcd5473424ced0f142328d29ba93eedeadf73d0327ab639edf6dde2c0bca07f9c4be78dec6db1758f6d8b8e4d070a09fdd8932460309955d21331866fa2970020be33dc29f13d9a7dfa275e297d0a07f51c33c654d031ce6778f541d24d5ca2c86dc1dad57343ee19aa7e105f1c19aa4ce80a11054e97cb9a5c94b35410589b691abb8d7942cef300048af0ad8075d396cd6f3ca2d4af6aa418cde93cc60b4cbfc85cb5ca50d73cec922ef73aedee055fe4e8d8948b4059831e1c0ea1cc1d382a424057fd53aaa682df46a2b67785d92f9618717ad20d4c52aa59490b5bb3234a47386e3ea32df7f3f2b91a4e6ef37ef9c33ba4dc9fffc3db69146d48ccd8ab2d66ab23266ff1337fa53999b913636ecee89bb7f874e2b62a6c0ad39a2d368eb7c194c738eaeae7769c16883f8bdc818a52bded42f4fc3a3fb19ee429a77417e1e2e1ef4482d199fe6550e17041981bc0420ebd3776805c64fe34ddc8a91a12a644101f143caa90c889b2a9cf0388c561e6b20b5d2908e8500201620b88a452d99557a00de4c4cfaf026bced8a219616b49b6b8fb643a388d1a9cc6a961ce782c5a232d2cd924aca9006b890848e2c43c8c0e055a2acee4666fb0eee1541bec353cc9b953b772deaaf24de61faf42e53c17ea3df246e2e29ada16647e4d124d1eafbdcb2cd76f5e4bc509fa3423a4daec18b6092cde08689842bf89700839fdcf8d8954d75738a6d55718cca1bbd4450380e8f1772cf86f3122d288db46188497e59d0d1e1a5fdbdedd65e6e2f4c0f570fb6cefa34beb4d1ff9cbc841f4566eca0fc0e0078a0e336ca7a0ac80fdfcaaae8a7fb01f82847fba061280ee749def22d69fb89f573380380aaf8f0abc9a557a8fbe01079b6daecdc5125d1d5b4a26c85884411d6b7518a4a43b26a75533324f45ec2f683748aff9e04eb2b101c8b5e3c673da543c617958ef534ab15c32df891ddacf36f0950b0550e2f77516275b8e4f64299263c119209d41c11e26584d2092c67aa5c6788eb3357ed11c71a3d14952d16b1a9facdf231d26ac02abc96c6bf32efa05ff653159e6f26cf930b5a85bbca4e6f12e763249366ef50934362e37e13699431b54a72e3cda37d3d5e9559832e5df26d7c6165b66cb80cf62ca8da11b7d8b65b50cd557c52103240af6082bf10e2b6e285965d67a6f41bac0ff7c8e9754ae1ee365b434159b3c2602119080dec25f52bde838c6363ced9a0cbf48bc5988e8fd635c16006a904807a16d81d4f054829bf1bed5a07512e10b91cd006e2a96afe691bc4fbba449cb14f39a3ec3c1293fa8b271be99c1d2ca18b866126f9cdb755e63aeb2aeee470ad2c2808563af9f1a0aa9f03b6e770bca3f9d81bfab2baac4ad276926c16e400fe1d2d49fad7f34f3dca635d91b33ee167f51eabec08e094c90da161d54fe208efa5871862588e8105d66ebd228b7fe3bc376825706c11f0f480a95b61a595239723b8ab37098901617dca29f0dbd3c7b1fc3484cd693a3262c2b60f33155512494062bf1cb572b529683715f8978754d576d0a6024955f845f5dafc721d392fe24e998b0e710a929b308887fdd2f30b8ba828c69de8018f3d1e774d084d7a864932146640f2791df0ef8cdcf649eb921e1865341cdf775c3714f3ce49b092959191b16769543db282beb80b9c55ec3c22d5eb9573cf81cdaac231de900cd9de29cbaf0263da4a14fa16946aaba9a734180c8ce180535fbf879664fc3405fecaa972a3a5bda5e7b13a584d503bb8ce840545ef5f417271464379b2e570cde519acc888b19125920fc6e752fe76f4e8d3d1b0ae248cd673625855bdd0ba71700e5d028a0ee53c962c191b0bb1dc39f3e95a5c6e4e25808d7fd28d709393bea59e8a2545ab459aca8bf1427849328f6c2864154dd68e4d0ba61f7a5bdcb1f09e6bcfc91e172ecd488a913e156cc4f4415516d846226682843d4ae84bbf3dc2929defbab94332293da2f3c8131a01", "", 2, -2042866870, "db157e965f1efe8d0f76d5eb15cbb4e1e531cc82341a0a4be6f599323a012a4c"], + ["030000807082c40301ea4630b9413a3b85467a6513a30047001e6c57c88e1bcfede0f8a81e2127a1c201000000016ad31e87b3030106b80300000000066a52526a63510f06140200000000096a0051530063636553e1bfbf00000000000000000000384ab79000", "525151", 0, 943335287, "4f12bfd65b714c821daa7eceb25c561c235825dcbadd0b2daf31e3566c93a661"], + ["b56c8b1b01b86af14d39250e573f11d0201130e70f01e7ac60318f10831a4e88e1f07b8d61030000000563515163acffffffff04d549c7030000000007516a63ac52ac00fee951010000000000f5aefa010000000005636353ac658abfba050000000005ac63535263dfa0c2a1030000000000000000f0df300400000000f574c6a518b993996d43c2a6e1caa0f392ef52f957fa35df50ef0106f74a8974da68243a29be5ec311736379e394b56ba2f4f99587f38e4b2b73617472ed97dbb5d709d5ce07112a9749cd702a5cd1a39323dedb1f8da60bf62f2bf4490defc9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005a5ad8d9355113c577f3bd4800177f8113b12724f8183c3a71f3ecbdb8522e66dba3fd15f1dab4a471026440c02681f03855677cbc8fbaf447b32e43c587000f686379053c643fd8f226e7f4440e01f654a60120ad64ea7b5c67e7c6103bfdd44088b2a463adbcfccc34b100095394f9dfd48707a015ae48a419895ec1d20d03030038bccbfc99df94775d8c8ed77f461cd24a7f2a175de361c8578bcee1739a9a0309344f65ffa19c984aed876761913db997bccb0a63d850cff0b3484cf6d53c880b0570d4e677282349d9fe03a861c08f325b66c7f78d1d2c9304aecee91b224e6cac471a20df35cb2ee7e97d3e22d9a2765efae900d0d390bdc781944525bc895f0302d6ef3164e96033dd46d85e48c74879227aa4aaaa79487fc1ba3edce4c32ef202023f9bc4f2cb6c85318d7b2cc4d060b57085c80601845a8e5c2cfa89a974ffee021ed7137fc8556b1433828c6c045e4267a6f95d3aa1a0f955aad8e3a3ae9f09a4031ed661c0b51b6cb686678ab904a52ec2429c6c4ff66ee24e3baf805ec48244a2021c48dbe84e8fd0cb41c57307e4f62b469620fc64047bd09f4c71129307fcb6f8174cd9440e43e7545fa99eda443f49a70eec131ce499e645806a08d1a2980078e6e4edaa171b9809c8cbd88b6865b4d2257c2545efa0df0fc599e233986bc8aa92951c7a321f7bf1bd8572c4c18722482bba9480d85abff2ff3864acd4b22d61e88310eef7dd881f7d7845dd485734d41931847c8a0175a60e4351a2fce120e186e924adffe914476185349288641b58d1235c8cfbf175c3fa27e4b9c0f36a55e6baf487edd5e0996d0c09ededbd830c5694e90edd388d8e8e43002f3d6387a124142dc9d937ac79fb0f653e46de2183c14c97527a683d306d538d4c4de5c60f82218dc47c513e814429ffd7616ddae76c78d54ea1942762e73e4a06a1e517ee1ecc11398b70533fd743c8f39ebaa235cfa1b52cb38a525cd88b97bfe7b227745749a605d875cb820c91852aca6484a34393b71c9da83a2cd449536e38a07d7e3d3f7f6efa39a00a267f070dbb2e0ee5236a36f42dac89ee7c982b2151d73f10dddb979dfa979cf0dc006ebec80d688cce5c764b3bf9174162d6bd26382beba0066deef15bbd8c698cef57a89de365ab0320ecfadac6d99c728631348a15f1ccf49b2374495c77c8103ea1b8fe617809949f75433723dda4e0efddfa80a660b10ae374c6221eb2edf4be13c276fd810fca44a008eb283da0ffe1aff075922ca37aa4fdfd8c1870c3ad93c6993cb546139a8d94a44d2f01e4938d6f125075b07120d73e075b46ccb3a2d8d94c26c828412ced100871d1ec675f42e6ba23c6fac3f0ebb45b8b35586fc6b9e243baa624057a48be0015adbfda9336e5d389fcb17e71c99263fb41df45634454cdc9a1fee0e0ca143ac622ce92ce3eca6b80f87a96688a84f48047108f0f0b41286d182a54087f03a11989b8a2a196a1c434069b16890cd711049428c37f57011ce4f0620ab42f8398b4a78afe470ac09629b60af9231f1c13748826024f749bfd4bbf9341fe8bc3ed1bf554d768915070e35a210d4e255319fb784137ea73664ae607eb71e1ff337969aa409f29565d181c67aaca8f1f1c4c2bd9c477c9739bcab130a0d46e2c118176e1271553624a8c12a001059c81b141d023a32abf9290fe6559adf74632e8b88b8eed3c0f07512c5d2b3dfd0a986ab00fd76de2c7498ce521bb64b3c3e6a9ea4225afdd70336cc1e3f0c0a96f3ef1aa5c6eeafb14191810d89f2705a7055c09537ad9d87695818e2cbffa9c8371a554b1e396939cfa21b8f21a94e1f73903096d7a1137fae8b49bf26ac699c48a592ca1b5f8487797def8c54bbc7faddd4143d01fd7f2bdf9a28f4d3ece860ad3e18e56da1f12abf93a2c0e7060c03b8956114df0d694e4c684aa400cd170c5c26829c680e81214098ba0c49018eaa4e2c2e400bc2be20f51b631547163ecfde3f6f53f76c270375f8df05eafe68e76497dfabf913d404108a695c60cbf58596c084403955753c9554ad79f40606621175353d65d1db2df331945e705aea4f5c10a4913e142261e17beeb4ba5150cb48864dbfaaf30d25681908749fdf2d490fd77eee98440b168be3f8490d77c75682639ef38796d5eabf0a44f24032991079fc8c34dc1903b60908fe12818d61ad1f2a8e4f2715fcaec2b48ec7de1e8a8d6c165cc38ea3f54d7836b728ce403f9a3e557b7bcf16db6a5858c4488c22a4a491d97a2e5167c45b8bf23680cc4a4bd2fcc0000000000000000ee18a401000000005c8ba2e7bfe0883116bff2a1f5e87caa99450d9d0da05ac30c4fdebb58b5b2af7de97d74e5d7ab97d9d7abe2bf02abc096f4bfaa10bf41707caa15ab3e53ada7151d471f672bf6e552496c36ea94df1b4de64af91c81a9448273e6fe7560c76800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b73db5f0bad461e278795e3cc5b4d2e9b8d230c3ceb829e9671dad906d76028a283e2833e006361bddacd8e2023de915e8b96cf521fecedf8d76fd22a5b46a4aad514da0a737d630d4b78521137314dd6692ad14875df95ebc4b41eb2fa11923f33d14b8be87f30b17ed6e84aeff2bb0556fc3636c4f17a4915dfabfa1f97c4003159db1ce08bf7c4cb4b10c49691b834dec09cf6b5cf8b786ad826acc7d62c0270322eee4ad55bbf6de49b82d508ec0e95ca67dadc9896b8f7d1593a7f02b8485220b01375884da03e6bf36d2b6e72ad18e31e6013fceb906402b8ebe17858267e972c28921757749160956eb8a8dcd5a54cf2f3f77efb1179501e6f9be9e2e1c47ca020f8ef9a1a199ef55057b1c409e24cdec05ae272226ac2ce7cefd903688472543020d4dbc4da96b01cd8e07d355cb499d6a4fdaddd6f4760c1bbad4c117efa553e70315a7ba826f915096011b61d81e6e8079f32301808d75dce69bc52a4a56a2dad40212fecfc98a18fc7c64ec2760d43b5d00dd38e32d989db0552c004398e872557b0325e1386b4107608a28a4519dd0210aaf53d2cb981f5c0435376dd7c0bedf6b0cf403d9d187d09bf1b102771445b1a00b3b4c32a4a18432266f80ba558fd4655423146f868dd7b1a171de98e1a495f071703a35983c9d3c02282598ebd7c34105ad383786052989cc0455ecb1d441d2d284e4c2d94e3cdc9ac2a190fa5c6fefca684ddffca1e1f0e0ca3ac65708a25f62d6ebdd7ffef6c6eaa51d93d77ad93a1ac3f7e08d5f8a103a390e7d3347493f2e2df82442af73ea103a52de9959c5df68e69f482474183bec435ca2f7ea2bf290e5568f6328c111722f71d458b038e902de466f621e45f905e3a25765ed1b8316d890669a0798976ab41209be1b3ccdaad005970030f78771548ab59c620026155520304d7b01ae2b84c8d465d78fcf7f1c6d2999a6384073631943893a9d6f432db218bc583b4050d9ac40019c1c7dd2bedc032f1c7ff1ef62de4c199db58b293eac6707c66cf9c8965ab8ee05e09304d0a8e338f9bb30be2be645198f761fedf9b0726ceaacb9b5e81cb28778ba6f72c5ce4904ad8ccc1ac047e807b829d9e62bc603b6f8a04441065b22cc54b13313546b58fa428e14d8a41b2ba5756e219fc08ce545ed4dd526ab7868284efb7fa25c70d78235fa6052fdfe085084b1bd083077db3e90952c1d45fb6b1536705378ffc8f07ede38f4ffcc1c890275853d6079ae9fde52e5c1b1a7dcdc3537d0c6cf12a1f87d6bb09018e0538fe75e3f9b613bc07468aeaf344155518ad534daf4329d09d10cf164eb1d1e6dfecdcc6e0c0bdf7713890315cce39f0baa1d34657dd3480033974df633c1f7820021719a4f2b74066ec9b8faa106a7de20d9c52305c41615385729a7fa4f8b8acab0d5d7347687e0f1a876b8b243ecbc81b623774cd9103b1f555600e317d513771f16d96bf574c61e5fa6b229048d87c34c8d72f70f077d5df8a0a9b9433744387f4c5914e787c949b9e5e3020ecc7f2f6b28887bbabf3f3290d3d6f59d1095755f033a425ce5bb89e00a094f7b19d76cb2869d029d4e94db80562514bb68cc475f00fe635dccd78c28c8a2e058e1205ba3b29884831258acf618625d61b304c5b852b5a4cfce205ed24b182db29e4c9f70787a85239f3d193edb1e84fb9a4e6215b3b1e325612d99fe646d1eb3c4725e77475b9ca1e9bd4352b8fd2b9994fba7570fa81e4806ebd5452c54b7eff3c322ae00c5aa96391192ff997d0251d0058dcc921a04bc54cb9395cb6db6dc97595419a96bf7d20ef507e5503c76a06d22161bab35512a49477be391b8ca6dad46df759d1dd2cfb73c846dc15569c76d0bfb636ef81125052ac6778829597eeb0f0bcc92d4e85ddbd36e50f8006c303ea7bf66949302d3882661719e9b98f2d0be8493707b887778e98613b5c3f4af5f37f3fdc1fd079064c79bcfb7da98e54f47680b103ad94f2675f5e52674792697a2134ef31c6d45d56cb57b1b93e57d4f60da84225261bc6ccac123f9b0c5474aa4aaafc9baa5e8c14e03e384d03f7c69d215cd999b8eeee4b3ee1520d71f8c63e22074e9d34cdcb39ef0ea0c20449ad8293c186f01a80ee5768891ba1b2665edcaefd9ca07ebb589c69777705e0c183ccd0dcbfc4f2e483cbe6229bb9dd5f0d29da555f6a319879b9f84e809a9610caf336f3ae12816c871a06ffffdd3d2bcf4187e0c54d80dd2c850a8c33515c7b56797dfd08163a7a5764a2c8aab8f380a9896ffa85d2bada7941407d5cf000000000000000000000000003eecf233dee579afb7e86c16583bc5025ec457fe613e41ef91e0a0cf29313965b76d43341be8602468d79affebf9fbde4eb47631abdb1ca14adfbaee6f94f55aa065a6e05c676412fed900c7df9e05dea69f34add0e81c2bc9041797e108e15c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e974cfa39f0cee9610017370bda12a3e9823d025dc6251c4a6afcf15281c52f81efe5950482e815cd3d68335aef8037ca3275281eee1e5bd4b35bb8f2c1d03eff8ffea2db69b3319981e447c06bc3f323908f1c24848e5826d3a140f12e3d3517f4b0cc2531fbe268bf79a45d0b6be4efbb8a2162053bce33649d8cda55a35c70311465bf601a49225b6ea2e8fe06a118fbc840ad3faf55bef46ba19af019874a30323c87d58c20c36578df8084d55a11015112143cd2dbb5a99fb0c9842021b527b0b061ced684601caeee7000e7bece94231b47366a55e0a958e5eaf006bcc6f60ff23468c24bc673f7f72a398b7b84de1a42dafa6c4c5d9a99ec3c696087742c2100227ccee356c5556239314471f764778abd3212a5a821ef514339d452c9d20dbcb032a88a0c617c7521d821fd12b2e3392a3731057694d22b2a47878da1f7cf940270319760e49000790cb0a51cb508c8160f9478bd02f3cff0216d2b36b2397b4a6660329801c4598fa6aa88f8940314274eda7dbe8f3d0c41be7150afe13f34edc0a3d030a2817a5759f3f413a178e18f623f22a9ced4c096453dea253f668e790fa7ab83d6adfc58cee8516824b904e93838017d710aea52b847cf750495da48077e66cf19c25c601bedfd35f33f336c91a59b00a43effcdf717a7ed52b11c0d9d91f6f25cadaebae18d85d3f231fb84166c7381c988615f473674cd1b5879d2fd8fb3fc572861aede3395f60cc1ed311760ee622eca0390db8ac87e391c7484ad1a4f328a65d2a803342864897441738ac0251f2014f82567b87541ea3369fb3eed7bc8ab1d254bdb768f29886282594714eed1f161ec95b567bd46e84fbffe6f65828236ae56e51aba214a93085eedd884d1b5a683582bd3b272d92576cdc417c95eb9e4f7d0a021304811b01fe4e1d8f651841537b6b1e0ec4d7622c6220c8f6d7890ab18847d402f399a544cce60da397bb6da6a2c93d3943ff4f572c3ffef28a0c58fc02b0fdca7c6e8fa9aa51b56b4e8d2cbedf9ddc240fb754282b4cd42271d701e050d9947846af1d34bdb3c0afe79841471066a992a4b83e1cac61989ae4dbdc45b483360ea37ae212d6251d89e1f69e6183c71dc56e0ea93b8c759182cb8f0e1db34309067942fdee9abf1fa121037381d385065a7cabdad64a990ec137a1f768282f8e50dea82dbf452723d47ce678baa9a4ca592fdcc6f662e802fb6b85f6a47a245d8f74df10784fb5d91967fbaf462aac397fa45455b76539607a3c87782b3f7980a480e70fedad25b55d7921f3ee8e17fe5be6c33929a5aaff76d6125a9455074c777cbe560c6367cbedbde50cd56978cc772963e65bf233bdd2799624e54c32a747708963a5f8b024bd1fd2561f51a7d0eee7ce2340557438b082b9e66e40846f5dd40c34edca400e5ffc15bb9e8cae9c30a9acc4a7abb492e01cf046c6272af7a9898633291ba742a29da9e7a5be897ab4144f721927fa1d0d416faa0caef8c295cbe8d877b41b98bd764832f5f5fcf930daeb594357151c7138fc9d8b814df4e251da4f21cd5ee3c65fa99173e3e8e182793b9916cac159315a637a3c2aa3ef999fd4ec2cf3cebc8877e6ec715b39ac737d2c34a39bd1d6060a2a3f0582c836f04f19d14f957a4a082110e7768ddeccf9d1c98ac1ddd8dc408083926718a82291a9a6babf06547681496e8415bef7238a53ab5b7e91e511ab89fcfbfed571835b81e7e453e9f4a6314e9f9cb8546a825d630d2e481179232a007b31cf57bea61de890be85acfeda763b83913fd840614e306006651c5c166facd444cd64e4ccad80104c3985fa266f5d66d3177b16e1b566556028a1d3632a7aa5f8fa225c953e6d07a753d80a455a36d139d4aa4ab9b3fd0c12c77ac2c926febd609266942879b68c6227c79e5e92529ca166e92daa90a0c5ea7918d9a6eb10b2f32c26a26ae6ad08ae1fbdbdf1bfc0a4d3e63f2341ea76ae8702106559f7906975442fb81b3867b16e769de163259bf230531b7efad37bc7a2127de6c1501126a505aa878982ab81f25aae2504e7f492355a0977d1b5b058f805bc8c568388d2ba5c7cb03448cf966e95580c546daeaafd00174f7b551c79504d214a9c1b130ee75da37af9b7f67229c81faaca030dbe652dd8c518e3b091ea8fa944f4ae5b8db8b523b008ab1569c9194aeb444fb9e739e5b9d70107a23b29dfc28d4771d548882f240bf79a74f9c39942d0b0b1df6c32568a48679370d0254046810f4724cc81a43038cdc4fc70f4d3014e1a2066f740d5cd3ad896662578adab6cf549b6a839074ca6fcb2261bcaf7b8500390b1fb36d37e7a6d837b852e674c682347d0e4987531140a27590463a936506c66a29f6c648a48cf41139f3249d6cedbd43a40e89363561c1586539dc83dd88df3d9077e0d", "516563515351", 0, 1496333835, "5e39bf0aadb71d3104722e770c10feb86bbc306fccc4616e82182729b1358045"], + ["030000807082c40304d07bc0c78da8c19aa227dcb473f7e19de2d5dfa4362b6d0b9ea02dbe2f9ba1f302000000075153ac515163527cadda59b707dc26bc5e8a2074af44ee70e1a497092fdae2e0241f7b42a478fc1a6899990300000008526a63005363525115bee31becfb953cd77c2085a3fbacfd41f74babd52484b9b164b4c81bdedb80fd6a4d280100000006535363630053d2d770b68f235b889cd20954f4dc7c50864aab118e8b596266117003189a8957847c03c10300000001acffffffff01e8b37c0300000000025152000000000f29543a02c59cff010000000000000000000000006fb0d82515d386b737ed3583a996baa213e7844dbf9f579061c8d3cbdfe715f3b254ab610783ac623293e21985ae5a00ea1bc9cda969974a5f064a6504078d7b3deb27481139e6b1acc46d81cbe57aa1f1403b1c5ceb9fb27f1e48b89e73693e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aa1f26ce43764e596fbc81faf7adae0b95526816beca78421b6f600f4088d753ce201c37030596c01ab5b6a0085e696cdf26caffb4deb6cca3f762bb906f99f5acdebce61d6e9f4b940e42687d1cf6fb24975980804b30b2593c620d70a95c0f505b64813864f8497cedc9cffb759177bb5110f854fb5acb95539ab7636e5ed022b37d2ade963c5de0f0bb8f612605fcb9cf490b18b1d7e3fbdf2331828bcc19a031dacc6e9f8bf19dcf2fc62a2252a87857288adbc20962fafd7934ea8c797114b0b06fe461af1d7e9e2d15a4aff290fa1126870fe6e60d59f1f54b189c165610864b46149d9e5360171b4e83f33d21f576b5b0f13d90d75329e8b48579bf6561d3603220d549c0ed416475ceee4f4453f91475a7e6398739550d501591e0dcfcbea1402106027fca74e1f8d2d835f32ee3c6b974de0eceee71f5707325272b8305cdbc503061aec366bd8e93bf9d87363d0b0ab411f7deba34ad1b635b5e77a3cdacc322103019e19d46c324cfcd313271e40ced26cf6e0808e778d5f884322dfec7176f60c03201992fdef854a68340d81150339a3452538a68b41ef382d23342fff28f2a6d85186a1f8abab26babecbfd115890f007de5b9491980b0ef7b6ba798e300a709d0443d4f753e4ecf0da937fe3fc4f3fbb09227caed1cb5da3e823b1229d3faf7df0bd8d7580b9cf8a027fc4756c1c656405bb3f18219f036826c383667d705100ff1a8eb374421e317e6dd23ecfb0453907f4740a796ef5f4af1c88255e4355856dfea2a0882384538aaa7c8662542a455198e8a3268d599a0215fa6c6c6ddcfc1dee8fbf029f936dd51eee5612dd7415062257b5b5e2b4ad016416f134935bf524cef92505070169a049fef90aeee6213be26fa447db7c177dd6bf74db71b9a99c903fe00a4915bffaaec946a016ca99b5599dbd46ed0a317d50221f3a2a98dc8fd02b5806420763a35a4da223b6ea5e5c3860e7d03155c8cb5db9bdffe47af9ad7beb6d472541266219edb6392738f2a5ba4c98d2bb4d73e30ff3ff2b27e07ee3495a92f9c53efbde62d9cd37e8f2dbffd1c22d77bc1fbd493d1263e56b70db833d009077461411e762af04745ad5d3e8293c7f478c4a9a3d7244c3fa38c520e36d8023840bbbf65f4b119643a0933ca385f0abca3f05f9bb3e81f1d6feaf9f6c61c4ba975bf2cab5cca204467e221704b509ce422019094475c7bca54faa983a844a74dd93dd19def488df112bc9bee3146b5b18b6ec58e24f3bb5472f8b3012277bcbb2c0ec8e361e33a2918495eb5172f67a1b3e1c2b78ff7f0be76ba269317de32f3640573fa42c0af504f24b9174cc256ec7aab8e829fcf79a554b7a16b51782ee2f4cbc0e49bf1dabdf74a892518bab58907057f5f33ae473411520a451dfbdcfae730a68ee8ee7a7daf6c9301c693deb149900ad08f5e78b2017b579fc865f02f246144f7ef02627cc61d429c561251ebb503ce6a6bc8a0407c8be756db2478ca82454fe404d0ace5f31f036f12c4fb7266321f181d7e26aa271fcf7e83783335fdfed13a77665106a0fb507a355d7b37e19a22be21f7bd703b3c85988b876b34e4277efc88537954a135e6ba0f78447896c6c7e3c17b15ddb03f84c5fc381450e1ccd66f144dd5813fff274f8d12575906272e9e0890192d2bf205bd098d6660352f0a3342ca930bb3b76b3023c1527b696c41fcb42cf754eae0992179d7561a4d4927734d9cf61da2191a4d67169c5a6886a19769bae022bf6fc70734c0b4bc10788679cfed6d0b83cea5cd6f547ee14462d9053dd4f357c55acb764d3b3d942325eac0720142c35d8fc32fd8bef55fdd2895343ac95079e04344c51cc0581ab2a31b984c5c680ee80165189d5916cd5513275d655b8aa2cd7554005511a19be1f3a81a215aed1e4a910a49fba4234031a02df59dd17ce75c4f79c06c5f0e93a1e8bdace791dda9d165d0acd066bf5415b0778f42e0849de19d4260205d382898858362d40fcd3dddae48aeda3c402d98035dff0114880604474c0c22616091ce7e86dd2fa15ba405dd242ef3668b6565e6d3ac673adbc47cfea57a60657829a6281e03b5592d726b73557e26a0bf36882e0ebec711c52a088a0c48099739a91f8490104f19f55f755f0eb3ba55d9646f947b01fff08ccddff26309ae0f505720a509c558cfc8a2b21b89e3bf96c2d2d97595fb47d24cb918bf123f5b0295a2874c4fa46823676fd7a3585c757daf838a4d3652077861aeef1380ca528349948d2db471bf333e3a2dbfd01fa1a000000000000000075dca002000000003476cc941e10a1df2171fcbf78a5d104a174c0444d5f29bfc2c4f6d4766351de223af783cba893d90ce1ce7e9fcfcb8545f3dbe5c886090c80c98aa3d5ed5f8fb893f52f9dba631aabf0fb04c8d018326b98495b3dce44e4f1b80c6932347d500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c8875d9824c1e850cb6f7caeb5118bcf3f777f21bedb5986fa687562b544511c97e759e3d4f499eb317ab57c4a05b285ea08c695ab204d8b5e569640e7d9e818c8f1dd42d300338a05e70923822029d752e8753933fc4a3888b81dedf9cafe733b0458874741d817b4ce7aca5e4e36b42014bd638bcdf6279b4376514cad90020ae56f59228cf00e4144f74da9816bd4aec61cbc670e7c7e2ddfe2b079503c9b021ee375ea75aafc683ca21dcc0040549491638a5ff4a7fac6898792c04b34b6a40a037b3de4f3221c5bc39417d554f4b2923d32bd617c7f93d101cbefab11905daf0ae72ddaed1bebac26d31caaadb4284cdfe9c666732c70a792656b504b6a4d1a02201b385054cae22ca94e827cbd034455dba960d64ab292310f0d0097f3534eeb0301f156d3a86c23f09acf4d036e9195c1336b26cba18a66feb3a32c376a777e3a0317f0b24274af00fd0ff7f2327e03488f678f3cc6d627f5841563f887c0957225020f186541ef39c2aeade5c9c297c92bc555b57aa7a55f369e48c7261830008b460217d02dd88c55f1e342651b08f0c5c64bf1076c8fb9ddaceeb8f01a0079c6b1f8f289c4f3445691fbb943c0a52304d0df929f142416642bb4192ce94e2e3db898a5228f73206108fd34b2986816e1b50e06e0ca7e74f970a9c3461d40a506b5b840578dce7b3f70ac7ed746bad204621c1b7d0a5872a947b05231018782680e47612c526e4481ad22570fc4b9247bcfaa5c9117675687daab343e4cd61c2d417068e8a3220749f959bf7838254f92d6a0365669bbb5f6137ee19b44c5303ef2efae8c7890859e048d97db0457fddde5b34d002084701905968732c3f7d845f29952adbdfdb22298e1d9868caa0e1f464a98fd9bf6d8187b55bb1c7f5c7eb30a7dee4060af02d1c2db4297d3c33a7498158c198702d79ce9bca287eaf2672a8e4ff01f4d8dedfcc2693e7e23a250698030e51d14a2fb02c95d92bfc4aad717a41b23cc60712b607d86cc83081673c7fcbad060e443c33a24eb2a5f32a95874d3fe7ae3ce91bbce96303471f36d1548edaf94d70ce1d924baedd5d9f4048d6e5002d1ae245184753b260b107a0ea303a1d7148b81659b054d2d8463dfa1cfde2f858485a91271db0bc8047d44047fcbedd2e1f70c707a44399bf83a71e72765a061112475d7b2db64d17ce484104f22342bcd5b5c029bc84bac6fbcb39b061e82c7ce1fb26f4f12c0c1c138ebf5d8947f5e253980969313a4cc45c844a590571c90a82e1e217fd1f4e477ec5f7660a54375f5606d02b7325a657a213462e4163b6ac5c72074ed0660c2753d082d5a22504cc5d59d6325de21949fbcc2198b55606713ce8aea2e3a488cd63a7aff8d4ad61c54b1a6075e89afa3b1fad84279980aabf159c22288f4a2fd014631daf2368e7a8b3e7ae505d8cf9e9eae6ccd4beb922440b4c7d6c7429059d6ddfd4702b7d5849c467d3bd8c069bb84574444e6c8efc2ab3eac4e76d757201597582feb99ce141b8e510df6decd0889af4fadfd2a5de59a4d64a1a02a290fafbbceb608569c31f49eeda10f6078402c8248b1a2054c790ff92c0b496b3aef3a99208215b6cb34684a34d8e49643f1495848be7b8f1abe6b189ffb183adff1de8be45e8f943a6f5f7bec6935389d91f4852107dff443c98bef89b633cfdffeb428b61ea45b88ade474817ff6c90871d34cbb5ad184945e2e6cc394d267bf94cd7fddb1513cdf69356af033fd970a5c1c58140c02025a49269948edb6408170a838b5b400b6e4c4677ea17b8b66ad4f6d8bd8b3ac089d2d9b41b9e424292c2f27eaddce9e683d417bee1890ec684bfd40a92e003eccc0b02501f3ed81da0453f31e4831126bf6d3862adbdbcc93fa1ff3651a873e24aec38a1e9ea4d2a03acce43a33aff426bf3177ed80dc8372c616b60b4015ad4be00cb612e5e4dfd3a42a1970653323909e8f86fd54c92d5369deeea312b4a0732691a5c559ca529d268fa6ca26eeefc14d2b12cd72af66d9cd2a021b62dbb5578acf32963bac39d1718ff6de803b00048ab7d5ee2e2a5fa520ce160315dab2a11c4dff9b95a5c1d4e1638077093fb110f14eaa44cbfaca561640184bad6eb8177876a2193cac4ca6bc4737ece92db2c541801591b8043cad0032cbc3a3671f2f0560187d12efc7c4b57ef1dbf18918bbdad8c8224593ff42cfd5d3c6f504a4f8e8f50cf5dc2b452b2a1abaf6d00f716a63f149f40e6adb307997bebdf3dd0a7cd4c653f27e7f931d5336ef83e5e74020f6e373e924a8344dde7cbbd2d01b3369ac2bdc3cbac62f3dfc67fe72fa8abb356987be124f084b61b99e3e820c1df455253980a741d97fb49cf4612bcf1f2e26e4fdb50b02c29f4a7211e3871576e94473a01f875369bccb868375e6d7e5e4a3bbaf2409", "6551535300", 0, -860315563, "d304e3f7a680bd826a551d540127cb00c19f34ee9f752d859f84ab60c9c5750a"], + ["030000807082c40302ac3fdf131d4921e04953d19c3d90380c015906fcdb441b895dc76e7fb8679a4e0200000001acffffffffaabfff06062de8735a012d5bd212a4b7cfe2daacebf016e9dcd84738aae4972d0100000003655365ffffffff03f1c44203000000000953000065ac65ac00acce264e0200000000086a00535263635353790fd50100000000002da0c56d0000000003e929a00400000000000000000000000071856779df9c7e3ca6df10b465d2cdd92cb3cfdd17a02d725c7720529096c3dda70641636c039dea26f579812c6b8a9e22bff0e0fe0a501d11c6a4c4ed30ff308165488449a2f22ccb5f1ad6ef885cf335b3c4796bec0bece05deb772e4d07a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000849cfe275a2b5caf9f335807e908423cf54e3f5cc61d93d6a150b112a005b8c6b31e8ebcaae93aa45ac44056256556994cae4f2186da7a84176c22dded8a060647351748b3995c8f855bc7432c66ca28efdc8edabf4d33e4ffab2942065df017e22275b291c9ce9d27eb23c1d7a7c5a65e7c44470b98081ef8c9be380348344d0309c9c2b677c93a34ffc0a2dbd48007944af3ba4167c53a1b73c6d18f3e78bf7303224ef54b1bf4d9bc903ae18c9fb1b92a2700b5d26e0cb34f1997ef5227f0d1560a00288e6d11589aa1628d7b7509699a11032f70589c5c878ede96bf05f132de6baaca3eace056d8f9ef3eecdf6d081bb8712b0f9cf148fccdefea90c0527a7661031cffe1c28970576faadbb4c9827f0548eebe09d7bbe8c444fd145f09afdebbde021a788839f87e63383ecda86503355053ea572a9f11f3138fd7b63c40383a5185030d36c05a20996f9bbc7a25c13ffefe4a323afbbade36053c72634be82f055d6603282121cc49737b013756ec2ef7073ef7be4565d5a6105ca47fc08076a5783867022172f05c5a6fa39587ed1f6633f85f70db42e022f86f0fa018dcb475bf7f27c8fd74bb44be1224772dac1ee1b1b24ea47dfe22c71836f531c81cb156627df99a871a38e6c137ea91f195ca4b0d7bbc0aa1310b6a8d3e3a497bb51d75778de421f82ca4f1dd686ce29e4c9de7371cca1332d72cbae2d5ebdc54fd1ec0ebeeb9637340a5b1382fef93f3ef96cbb91091b7170b8c8f66e6a7c3ab82813f0b187b5ad23272dcfcda321a2fdbe0ab93417a19d77d20dabf189df9290bada57fb25a8660db52254ac78a208fa2e4b43d3bf225c1f76f56832a9e894c82104c75380ec9ba82669e2ecff5dc1b089f9e3bd37bc68365512cc6a0a9ddd9054296baaef95e7275d43a5d0e00ccfa4b65c94573dc258fb45466aab8a86c7c0bf07e59cd6cb4ac214a0f6b144f17ca076655894b21e5ec39da62e76216ea31b8549586d2aaafc313457d0f42d0ccdf80481fff6d88f02c8fe3453daddea69309e826ec1c020fd401909c5886c9235e67cb166e8b5e8922fa5da764f3537df7804e1a9acc6598d657c5ba977125624c1369fe776fc8d53abb181d5d16ff6cae57c73e7692a223ae316993b4e1a70fd30be96814ed6879f0e2545962ec55a8680c0d0123822ff4b8bc04bb46ffce87f8f30e4823fb9be24b9552bb9aba477c157591f4904e14aff9559453715d7e23a77d7cd44f6ab2ac00ba88199473efa1fcafbc569aa0e8f8f0b7ea4fe0db2b2b5bd21cc171887fe1fdba0b6e14fd2dff50fb91b808483a08744cb729b4742dde0d29b7330288844dc9cddb287bf5f7b44639bccc47cb012b1007a0bc7782c717766f01e12ae817ac232985d6a269c210ef4a785d3fdddb4825599f331151622f709f23b8fab3f119266c31ce9d85d54dd1e20065808bd78e955f105c5984ff54bdf6f5d816f4881e1a4ed8580b1352e451d33eec49ce7338a95530d210d810f1980f095a0cd7fbf4a8aebd5e35b2f459f5fbcc73d6fbf7b01bf1ec8e99df099f0fa753e256a95458938ea08e295b03bbb1128afadf8e1e3210023c6870546160b1dfa424c78f7777df685ec2a9d741b1f3300db89e815cd052d712a20e7a46a57946495bd81d7b93c311af81059775951c4300f3a8d16c90f882d46802c4a91e601f2550374e740ef52f39092ce779c66784fdb879d69aa3893d6e882797f4438c96c86153031d582117940b0a799ce6f46fffe722b3bdc4b2eb155933520593c6df5d182abf93ba04694bd6b7ac1527f0e6351f4e489c45778dcdf24427efe99e15fc14e13d8d416e9909e33c85ab040fcec52c2176251c59ecec1fe0206386def1249d8452166501cfb1a7ed36e88a57d6d8a4ef892839d6df282d2a86f20c3cb843eb11b6de37614579c3c49f25b20eaa0ffb64f4833ed2123a2c6f4262796ea911a4a9b9d2ad3191878843c6453f88a28211972117ee9853cb73ae35c978237ee181311f2d4d843d3d98a03659d589290a88005c90858a9f4aa2fa44705502b32a8e92f9600e6ce1a27539c71d91ce76b6989ad482ffeecb3a589ba5328fd8b5333b7df43f2889b1016fa685e48b463b443885382c6bc80408172d66c821c24cd394e291981a4f0f7d0e10e1d49a3893348f1318dc2fbf6f66eeed02eab15fb0a8706bf67f52ecd3b8df231966dfb500689a6e3b1ab543181c8f0fcfadc53cbd89585ddb029e47e24a6a65479b00397e7fc118cdf61891944016e72ef66f0840c68e614ba512fae4d05f8905000000000000000000000000fe2e5ad4f6f63470687734be76460805777aa7be6b1c659b4158e968690c5d2937596309b14c831e955d70458f2794f9a80330eb0d5f5a484e616fc5e0fbf6b3e97a4c0bb84d07d5b4a98c1dabf96e667ab5dfb65bd075c64c6d4b34201b238d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e765bd277e49af26eca28c5f0089726a1c14dd95f056e726a69f0b340159975f094ab87fa12e4a95aa110726c50e5057efcdda87d5b0b0fa50ac0f02d67dfead7d29527832dfefbae0c38958937d6674768c8296f79263fa21074f55a11699bb41a2dd4df8155d701a027c36f04130be51d8035ef341a484ef89c68caf4da41e021ebc02dc9c09e9aca9d693208cf5ccf07440d263bf94cdcf9a433005bb00da0f0301aa7c6285b483b780b2df4ae0e6ec3b957b1978bbdb34b5333f98f74be28ccd0a080e2a8173fc459c27e22f49c53e3c8b39d562b64997e748f8051f725eec00ce04c10bc33bf44010af82cea1348c4bfffbf8eaf205f18136327997b17f3e522902021deca74b7c41df7c57d8f240ee06ab4a42a53c839c39417c52e8acb5e1081d020eb6a8456c9ede68888a694e5ceef893f7a930026a7a547997349ad3980695b702148e25bdaebd1693bd4648b79a53ddf5afa0f7babc5214e96c2e3d3fd1ac6fc3030fdf280949b5da1f2edf77a3d868c7b713a8b0d48b3a141bf8622130e201ad900301c1983e91a564fc3cfaf8377ad4f3641ae93432b9e786d252e6303d0e4f5417fdf3ae7267b2b4bd3d44ce3e9f401da984fe231a2ab80f892af507dc376d9035c9ae72c88c07daff9624c1f62ca668d189a3bd6d45f72c8af3e7a087dc3ed290bff3dd4ffbaa8bdf8e188e196e3b634e951a5ed75cd47a51909ab1d743f184bdb4d05520acdeb00f3822b5ee6c3437bc2e3b27464b325578528f402215b906f0eb27bea4d6b2bbfd6f429422e6ae7b9bfc54fc02fd81f0b25401eb1a6a1004f60d46e0293016c275a296227c2e28f43886a313106fb7f113344058477c2db92b5d8e54ef87243b720ceb9694e34f5278f1ca063636bca928e0f41a15aa1da1c3a4d0d6e5f391a4c2abd6930e082d80a70d55bbccf826f30e1afb87e50427ec9655a47ae4ecb503e24d2d72d3e87c654fe6f2c38571ce76e644804c384223cb24adf91c7fadec81bcdbc9f2302b4b8ef934d4ef8c93b5e88a8c0893329c0610ae535c61a25bf26d4f85854afb472e60016763aee37e6bee13599d98e85a37e9e76e30888326d9f7fb73e9265aa6432cd9c6b9f1bd85f27d5f8b42ab58ea8fdb0ea1f0018405ad74cb9a67cba6a0acc3919e36d0e678b9867359a521a095445e81849c77e099e45dd3354dc58edcd8acd0af4adfdbcfc0d05b1cc0765f90a20f7d26113d385a387b5ad28d41ad5e2df43b11656b0179b5de07d1ea11a4c01022bb079150ca36d483f20aa83f0941608e054a1c5aaa13e2ae374080ed13fcdf5c79b0991040574fa1a0d4142fbcc257bb37e94784a6f3dc6f06f9aa035ac344a285fde75df96e491a69da81fa5becb44e68d30679dd5e0a7b8550dfefc7731a870759dde95ade0622684bd57df566d6369b53fd15bf51a5dbe6a24a65e80ceb1f7d1a7b8c299bcc6e7e79a6ff86c340446891fd5ce044cc329dceefb53e4116613e270254ccc780a8a26f41177cccdf2bf1c5232c552c9bbe5816a5a550a12d71c501694f33663edc8839f58732f9113abdbfd421dfd875073feb877a7b93152609ab34fc8a8f0f1abc9b55db2d4e1332e1f877e287ff246ae3957dee805f8ea5397d130b6369b4fb0f58824de28cd4cb0eb399fd2f0ebad01ce19962e8e8cc439cd9db07f7398bef49daa285f87a97173e9df209dbeaf456a30ea4e25dbc9aeead762f5cf7682a236d9b97310e319e6912c35308707f872abf177e7fa3b22c69b1bff1c2bf34f1d13f70adc930a326b741ea3750dec9a67276d4a48ecaefd93fe5228619e89ad350e140a5158f8e5ea5e4dae8cc41b4a267ae12bd5ca3cb824ff06766d67b86c5d0f4bd4b28732a123d1b34cd0b433d99852996a23a74c3752e5cc003d0a3764954e0edc5674c28e6200fa79029933898bcb78fcf5c415df64fa4f2e14036a7e00d40c67c8a958dcb15bd90011c54eb3ee102e5ba5a3b3ebba09670528a3cc09160e4098b7b6ae808bbe29843a6fb3f2d384e9846637bc562040c20c06fe955ea5872eb9169bb1d8542309b324dadb04d5040aba744cb8c9cfb5fda9bed60b2305ffa590e2326eae0c05fc3aba19e00d2f99232a026ac309cfb897dd116f9b78ac3c37107a2277dfcf6758d1dab001ab1c9d9a9184c216d278d18f50c5a8c37e3d05f524ddee4068455dd8de7a80ac41d5bb5716405c912381c879b8f4addd4de484e3e2967273a28b82bb61d8391653734b0eca658c1d701176d1aaed48769a5f17018b8aa7dacfa3358532e64538e01000000000000000000000000cbd6f7e1232d5472f9459eae08baf971ccc3297f90537b45e9514f07d446759d5b6a57cce3706b42c29c78227f9298103070ce66acf821a553eee1e6d91a9924da341741541421732339de6b66ee67146b01ae83e3920568ddda0982aaed809c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000244242d273ab020b39b1a16ed4b6d8f8754e5d383cd22c037eddc8e6c498fd69f3865f643ef48cad31b06ea0598222352ba3f2df176099df1206f0ba72a5431ab51cf2218ea64beeb96352e90f2eda41ed310d947d55ba57e698232a9de460d8015b1c57044d0658fda2b20fd15b3d147f58871b13d0bef49d17e93d6cf3a6c5032157def9e8e193ca2c52d75163d9c5246106fa2f77188977bf27b0dc856f54d9031b1f4066cf6572d9976a720fd83df312e3988285bdc80bc5d9f130c32f17ad2b0a060f5b49b4c85100f08ae0a9fcd2036e52257d91cddf7c01f0921267340fff11f54440937f1132dd9684993b67ab9469ec2294a18fabcfed5aa22c002c0ec860022f8b37ad9047cadc72cc9e5d7cf1a3a144166ff2c01e22379daf863fd60ec99a03137fd538a08660453ce56bbb68385994e4f0786d17f1c5147a2383b7dc25a39303060aa8a8c6a1a6bf8498bbcbae230d655c2dd87169dfb01de28501f93903c64f02035d11f9e8165390fbf2f529946e17b0be7b52035869f21470f3615f2d23ae31030acf3f45f6ed2c41f17c1a08be137f26c107ad07db9c7759789ec95ba2dba274d908f7e2e1a3bee96c2fe9463894d0d2db937eaba4b6b2762a052bf98f4c128f60f17b4ebd7a4c89e3e63ade39dc505226c3b94afe14a1bbdf1f093e416523fc1013c59cbd98008abc3d781409bc572483bc5f2d47353918e0d4c02e07842d3f516f24ac62d883aa6aa70bee6e05d599ad2a773b1011ef052a31542a774d4edd3cda675badeaa57c9a019f4e5ff9937108c1b6db486b83b332377c228d773d6300238fabb94e64625057122de7d90d0fea836cf17f181971e94910189179d7b3ea7779f04e034b48d20b5fada153b7f986e0c2acdc7d32e55f1572c430bb9f6d769c60f3c587d24d84a167a99b120f1090068f500578cb74f6c44805b43d71832be39ffbd6eaaf6ffe125261822a01ccc63e489554593ac345ac2153b5fa7015ac238482e266e09cb5265888d0c1e82c68aa0fd4a856e2f4d25c835376a6b3fafb2516cbf5c4526d495ee5ece2d20ad6632015603f9c11e4ec08fe7f019d9640bb6dd53addc0eea6da2ed74d510b9a045e0a680d8659dedb263a4983834923dac9fed5ff105739cb964d6e82e469f16cfff118a854c304fe51268383de2ab4e3686d6729dd123976ea4e1f2d7c3fa9e3a1695c695737dcb1467b5a68141a25425cb661a78c347cb7d6ff83e78cfad6078db0a9f4b60f714e42624cee4690105d2ace84d54800c8156b1b44d9c362135ad73d4b3828236bdae4dcadb1e10627da2c349afd497d089211f0d673418b3b4f849c1ac10f7f277c1a3c89359c38f2e355c7a65cc0c747d58a5e10751dfb818f4c3ff7f24b151b67767db11b13539c0f05699b6a2886d6ec026b2afe031587d54761733ac7bd74469d12aa5f0ddbe96b9e06136e2bf4da986574b167d08348311a43fcc3afbd1acf31697d5e908aeaa75d39b2c114d687f34ac2f854745add290e48f65f4559dd639a898fb7ebe53aba48c4fcc0dcd5185f9930167ad7206aca3dd1a89acf27e653ba1fc1965b6c4a20cc9ad75763b9eebebbc88962c29ace9a4cb66523c3839cc22e704fd2b4b4b8c6fca830b9235bf5d50cd4655083e33d7800a9e9af35b6e0c064aa85afdca9a2f7b8f103ce9911071899c4f0ce965995e8a42783e9804b5a2db3f6dfd8701a31f6fbab2026d59ee9800c59fff3aef853051fb7453e6a8959db831127b7c86ef29ee61114e1a6b46fdb686f121058cc426215b5a301993bcc8610e8193f1c857660c125c7d3840ba968518fe1a88d928a646d0b437e9a18bc400e987cd08205b984afa643b443eafd076093baac9acc0815cb44987c9b035733670c48088260ab3db5b69f57ae4bc2a7294bdb469362b159e05a2bd98dbe9cf411ee995545ec340deafd565c6e3f8b18591acfbc8a1b67f4b506e9d458be17f43b506c6f2f823bd23d9d233a25b437cc53fa6ecc3b394b573be0849c8c602674caca8add470e1d12892db8a8f4fac4d0acc23237d2a906732680d0e8805461ceb970ec6101c93d9f696d2abec5b1d093129058a28f8a27a340c6f22e87a448dd0967fccf54c38aa07c3b837f148dfcbc16c506ae63d7456a95666e2e949d528e11f917d1955230e13c0cb931e8599017131ff10695dac9af798848924e3c26a327f376980c84636f7ee002d95650bf438994a7b4a330b98dd1d6c3e48cee1f3f500ae85a697066181ba968ec8fe4a7c05eae81929982c9a8f558bc6bd42729928a63c3fb926e940757cec4598ff070ffb54770072931255f236cf6ab0d16ed6e7f36710821e84e57cf7f481ac1a45b393b875f1f3c9600534447440181e1581ef090e0c68f650cb5e58041b3b0d02d05c6c15d120723a0116808", "6552", 1, 1167438736, "ebc5fbff483017a91a18447bea4ef2b688a553e51d189abb1dff2ce1c67f4e5d"], + ["030000807082c403017bc3887bb6261426b474b26273b979c9a4df8d6586013e2c5b676e70ce7c56370000000007ac510051ac5163ffffffff0247dea1000000000004ac536a6a59ef84040000000000000000008d7872bc030000000000000000e94f0e0500000000eb8a23d7dfbd3b66eea4d08fec976a907a7318e406cdc6a23bd6492d699087dd3cd5ba9bf3cf1c747a6edcd194c019100a31377c7e0faf3ca88a0aea78ea95fa52a321624634ae17ebee2163ad4bcb1b2acfdf12b249ceb28465f578e3d597f700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000634b8f7553b587fced607b7573017fb48e42b74044f0f2d58e07c073684ab6dfdc4542a2f6b9eb6fa9bb99e99c8ec38da1d0101f442e993a37286430c7c3f5f850324a0fe45c9a8e9c40dc9144240b6672b53a0de577a63d0adb915a87f2b8e301e3fcb3bfab93d5032bba8cd469aac810ec1288a479080959dd763cb024791502184f0b7e2e0ec6fae4fba09445df159968039964fecc3a5f96a53e95a3a6e9e203271cb45d4d0e4b5dffb6dd64913a49eff28f26d30e3a0c05622d6facb21657b30a069d1382f8515849a0968a1e90e1490acd76e32de99ee961bcf16e6f325614af6af950d6ef66f4cf1079203a6bf64aa8cef321aa06d0f4854ed30c2b78585a98020b15302a7339258c4d4384faa31baf17fa292b2133ed79faf8d989736313d3110221515315304328c5d6ea40489abac019e3206f5d07d70f11b8b9f28e1989bd5e0318fd27b5cad794f787d437712e60193702d18d7d9581597ece993da58d3e9bf0020e11aaac4ae0e4e4e41c99e8a3ffc67d0325e1fd31156731b15d4b04988709190200d8876f84eaa0c95d4113a061ef5a871511dbb350f27526071f1649f13f52fce35d7fbcb5179c05ab3aa49cfaa7ed239d3f5a025957fbca96354ca9ed326b126011ccf896cbddc2644cd5aea0c38ca6a45a085e54077383cfbda6c0dc0760b5923d363e510542337c479ed96e6916ec6f912e30699556a6f26f9e637171461ab6c620557d7696cb1f870247424176fdc5cb0e5507aa9541ae155d5b9c86c5a1ec7d1c583004e160cdad3dca00537375672a81e17ddbfd2806d28fe039be1255101c1f455154d7aa2ab72ca3393a5846ebb03f38a5537f5bedd5b552f93dcb974456535fc78939b715348177dc6bbb9da991a1c438b0a344f995e759c4333b4c6ea231c118f7af8612652943a940f1ca1fe0bfcdb66ed70362c4a508cdab9b6430166744443b66bde924f98ec7681e796433966f46c905e0f59568d26826ab0c755484e6a620acbdebb5145bd861a82f933b52279ecee1dce84cfa6cbd6bdb376a3dcfb2dfcf8c0f40faf5f8f3ef7dbcfec9d177f6b7362bfc0bcc24a7d7c04ce187e18ad47ecae09af64817925b0b87f632abf9669e56e96ac8e8c34a840ea4e89eda9f96cb1e6681b0301f3a31e5d5d16e1acdbb2597f5c99ebb9d7155e719ba999adc0d0ced1cf94a56e1e6bfe2499ca80984fe84d8cee9312459f777c6d0ee7052d405387e1600aec40f58773207937f40bb9bf12d02913d814a1db6dfaa0f286aa5453a8053af6a53f426c9dd4bf50dd5730319e4f17f5e48cfab4d1602cb97199f47939b3403d20dae6de94f030706d7a220cf9b3b03d150cfa954e9e86254dff297c616054ad62e67e23ce8714e22b89daf90bf27632d85d342f99e43909c7d267747bba3e775140db00f7e6f625677ef8839c87d6e88c61ce274f8e488703ec93eb68ad40cd49d43e45a0a57f7d81f6457a1d4c1b45f49a87a21325ed9597fc60678d3074e150bdcf0750ab2e9d2e2ee24fefd8baa838546a89a1335b0bb4be8fe9f40c484d0596b39a20d5281c76ab21e4aa95dd318d84096de53de9e3c7309c78f415483a2c6dfdd55af526c9f211a3ca92fd68de838134cc95179cec517aa4916c450dc30c8c044c033d21e2daf58830509bc93a04745a65b8f3a0476c21e2cd43bc059ee81ff3de6a87b0781b925f99283f1644daeb60e32038efa346a3aadf49b5e5b54e3c468f5ba1aee38a78cab51d23b5d8f32c9dc92797b9656a067b48d38b521e3f27b060a118a24d7bed8d1cb10e00fb7aa972953298d7badaf84c2147d56d5115d2b6d038beff0656cb005800caab73ccc269b96ad78dd5e64ca8fbebcedbec1e047bf4aa567fe03dc26afe7835294b8251b02e08d8b1cb07bb8fb5872a537ff3093a08425aae00eb390a0d00ba3e05ee2741643e591d98a569e6b4896f6f8394f7a4c8e4fde53375cc356d1e8235cc51a4d4913d1fc6f57ba59096443a7019d6e1c0f61b51f0b356bea9566a60fc5ce7e466850700230124f1ef05a2bcf7ed5b3cb31132406df1ccbb2d960656cc6132cac8f7149475d7a93c7923ed8a7a5355d45f530e3addcf8756fbd01504558073ab468cfd4eaa208b3a8840a91722b40e49b6d557a14a50a84fd2e628c6ba6a56469f8a1a23e779cd9bbe472a0cf3a9044e2aa97656f82feed11d37581b8db405a37f1d83a5b28855f1f424ad0b903e8813aa83bd13977cf4117657dafca1ce1a008a63a8cb80873f7d468d2a7f985cd6f39a0326e5b9c120000000000000000ada8a004000000002da3481274f115626feffbb7f1cf63bf6350f4508a24abec67f1e580c5fef830ff61993635333aff8adb9c55f7b97f8e4a0afea40d4c3367cdfe4bb2b6e884093ab9a71df870b94d3f8cf98875854b6360f62cc51797d56111073564e247e6160000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043886828b2df977f243eb49c4457ebdda813961b6bad33027e3c2babbbfeec8a1337c86378c460801ab3a115f11fbb89f908e6a7793b12d56ecab16f2a26af1181352c2f4fb96de15373dc9b3353eb6771cae3433b1ef2de489943284fa6384fae7e3475ddc9da2edf0086f7d6f6795e8b557c6cfd1fa9b27624329806edb4ec0319e6a98a6a34421d319f363de9dcd35609e1f940bf1ceb9a817fea8392e5fc9d020a5ca8887f4e837c1ad9b5c67aaac0d5e32d22e0d970dd7bc65bbdbdcc7279950b0187e83d9cc9f4fbf1bf7edc6804d5992ec78bc3d50d730e80c8e531f190316498034035e28cfadcfa59cc99082df27ceb2eac19315138317cb1be60c7232d6a032bd4b1a8d95664e1be83d9da8d84be0ad2c25fe8b1866842147b28d2b22c5318022676b375a1bc3f88976470180833dc37f87bae66016b8d8618ae148c8e13a9af031b46801b1541ab7723bb67fa13a5ea0ef392c914256fe492446fe5ebbab5866e0227431ac4fefb0b7441eb0136ea567aae038a9fe02ed4f052313b812ecd55ca9f0316bcb9ce672e56629d93b3405e0a3e44466ea1ac20d449a8aff2a5bdc133ba21aef4019af44ebdb516ded967097ce4010ac9723b22ebd90b6ca3e3d65455ac57138d12f51d847780d51cb3ae0ebacd3e86d005ff68c9548d6b8d293608f9cd3082330491667646cf45269680eddac38e226e733ab40890d73460d7fed271f52b2a54ff5ca3c98cc77fdc3ed94f5a83f401456c7dc1d8a47d1539f336939acd183fa36b9ea68638fbceca66389d52acf360b6ec18174a5f99a6efcb2ac4e49e55b5d873b751f313153b4cddb718129c49ab8728a25b2f9777fa474cb4cf0401f3f8edce6a448f69abcfe4286d1cef9deea4acc545256812440b8871a7d9340194b3b3de09a2f4cda2b4ee8b030d825ada911658b2589f13e678c841fbd0237e200bc50c7de5255b7892dc7ad5ce87c10fa35f71eb3fbe873f06d49befbb98ee0976fcdc196b5793e0b98bc62a9c7855793f8822befb6ee8f8504c6e3fb13e5a2100b26a600dff96be30d1069241116f11708029f106d65e776074d78e56d5a20fda6717c6e7acaeb958eebc871d089a72a10d19389d2ab39fb9b1daf0225a6ad1cb72d9b754bfbd309cbe6cadb9481a2f05718cfc6a4a9a8f0d0d5721790c5e7f746cf895428e4c338beda0d042408df7da407a2d5912f8254a37f170ce7f5769570f7bd88d366bdb764e3c2e1465f01827398d35b904651dfe4ca0d76c8322d773c1a36be41aa1afe77596513c3fe1450ff14d155faac955a7454c413c7b6f217473894a92d1ac0a2d6b5356f3d391d053ca43c0074e23defdbcb8e3daae34fb69647cf0648d050eae5d6cc94c83321f065e4b516f4de00be95751bc1c43a62f28d4d47728a5cf074da1b5aa06ebaf52de45929c4f3d5e88a26fbbc9e34462e700c703194f06c689caf8ad03c13710d152501bba2fe3f288ea73d0ecf7162f86a54ee7eac547bcd14583b30a8e53667bc8eaddb51560e1e734f8b3339cd90b1f5b9f4cf9c5f46013ad743e102a9861a2b968ca2de8b9ab0977318a914b001f46bdc6827e2236a401ad735ce793291b01b1d67c68292ee01d5f3877296a594d091eee9f8108f36c7ecfbe074f8bb730708c697e0afe6f14d9dbbf71e23a79a8686f0f85ac566646ee9e57ef3346794068bd4e8198c948f35191d6769a3e20efb342cf747216534d8007808b20fc3aeb9c436c3b55c592055aa51ab1a9f1b41ffd8852dcc3cf4e333930644fcaeca9dad1c4a6801a01ab78a0bede74ff5779801c9176042831463449263f6bf2beb01da24d4300daf92c2b9ba0353a287da06f370fd8d90b3d5040b9072ac6a1b0549b83237c47fb6674d9e450fad9589a663202bd9690152b2e6d0e1bdc4f0dc9f85e51acd0e46676f5d79d486ae8a40b099bc38d4967c79dac69957093c4e34751dfe7a4b19ec5e01927a50e00b061e21ee9bd13592aeb6a6ac928f19069554622dfd9a02604aaed467e296675624ccde65b1828b96a5815af5d8e5dd24f48afd41939361b7b175bfdb3c6fe6e7482d2f3bb9dbfca295c31bbe4d6aca9ec5780e91a0d14aad4584d90f94682fb46f7392519bb0a121703c5bd79af360b7632c806472d083fb7e3378b540d274443a8006cd74a796196338e1996b4b8db3754a927d1b5404f1de534b116c000f43bb81f70c023fb5243a89f88f077ac49a5cd90b868a80f4b626942bcbf2332f8bb15ce927fd5e21b50d9e9016644169198f8278ac4eab7c300000000000000004ac1ea050000000085092661af97eeb0533ac2dcd99a4c3f80251a6e0fe5dbe61554ec03217959a59b8362684ef7afa8bbd1ff2e60aef5f500ad5f69d71c8fcbc4dcd477379e26e8e485b12fa59d14edc94e3d777e92bbe0894bc9bb98d477537555bb48bf08c44f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d9be3aa4e700103c8d11825f58262c19f284980500b11869c67c002387b9c1a7842f8283758ea6df3d5228cef66c77b993e5613a87435cf2d4a7a54a841b7531c4ff5b975c982d5f3a1ef478842a5cfedb2a24c5dce91d5d3c2d2227ebf3c686a3e5588de5f760e1d61c506a9c4063fe30fdfc87c14d6dbed81e7945f432f9ff0310885804f1a54a0c34c99835cbccced609d987f0866334033b5c26d2e22418c80312ce5459d00d68bd9cc55d8482b767c2385473c620e56b0a8e80e633d52539590b049a0e9b0bc6846008797154001a6f7c09cabe3f49597ee5ff8b496ab3a65252378371566c63e53c7f4f869b72325e72cfb0f688af03c9fcbb29540843359e3a03301adc016656ce2e1b667b1fa6a55e07eba3b4bf935b2ae28a408e54cd7860700315d7e2f9ff09a9c0fca387a617abc921e79dd043d1e1098507d9a616f2703428032de41b650488fa7385c773ddf14c60c9feb59fe489ef09168820cb6b6b2152e1032687039dc945dd034ba38d575e7493674297f3f54d53a2c9b2c84489825eeb800324f76d91d27ca351b26a34c78bce476a357d681d4c7c8dfcf47e2c19d7424363f0139f40be226627975cb5fd20711119de96c6f3a3525faa0cfd359c5fb46f417afe78fa89e53f259a6e79df5598404cc23b3f3cb4068a7d7d375fcdba81d2ae2aca879d8e0e59cef7e1e0eeddca7a5ff0f97058704cf463cfbf88ab9433577aa8e4fcc0c03310357c79aa221984b2d686e703010313cad5beefcfdf517294e1c02869258bea5bf13b2c961ba8d21c8915ff40c4b4f34dba5fb74ed5ab0e80e47e73be8128523ee5a2ec675136fe9f97a91e41e0f550707e0b07e937a07233455e87c930be0a82fade89ad0b400c92c044abb81473af8a03498e59e6f76a1d113dafb6547600da0c6bdc63328443679be76acbe2f63b82d416848ce7f0a4cbac2fa947f266aa7dcf624764b41331a2042dc82dec5e58752fde4c125e23b31ea6c0610201452f96ffe353e6b00ae5851a39dacb09cfdcf669e61a274f37293e3b119cd91f37b258e092111bd7036ad196b5e31f5e9bbc6557b195ec4b928c9a64edc6d35a4ffa160b1d78cc36ee36fa0048af3e0791fcdfad059d497eae3cf8f99e19d92ac5fe3eef6e4a6b920ed3fc03306d4c6e366e08b9d4ad062681df3d66556d06a44a53eb76e0bbd2e24acc3d87cd3117fcc30cb9f4278920db4202a827c2929492421df3e92a3ea92931f7a4fc8ce60814a6e4d90708e12ae87d2fcbb7b41e0f9120f8a4072bc2bda51013bfbe56c876faad693a4737b3705a13da8174fe37701d0bfed58c15cce899a5c62e1fcec65ad8c793703c15c4ff43ab432a77062afb998712d9c0a0fc2ed1013eac1ae043844b52525e1d81f0e63f0eb4db3561c1d75111c54179bc9aeaa61d82496b4c118b0737c234c60cb91998388ece846f201d25acc5cc4eafd63525552376162996a4e1b1d75a71d59dd8f8162365f55bf822f3774b5423d6ad9bec7b6850eb1ae02f6cc8f5f3004d12eead53bcab2f2872a1829f88b690b400e28bde2ff2183a7ef060e12b8ec9b260fca6afb3270d9e8daaaaafe3670e72fa61ce79cf1cc92e3584accb66386476af510abeb7e265fbe15dfc9c2e9a9d9e0cbbdbc58b822868211a1483af2f66ed2211928c1f5bd528adf66f22002b9dce4ba23d4161b8e83d77fc17574d999e300913c09443a5d651f368274133a4eba59923c0ce8c36a0618b51c37edfba2fe3364e84b8d1713c96928c92075dc3f4e4146813022fbab89145a500d9d420cb72aafdbe633599ad054b69bcd4257ffed595d77a6047df0bb2cc71c283bdbb154a0eea6d1a86b5b5b51b34c1052eda76833749024a649bf229bb9e1075c631df8751262d862bec03af5e7bf16625e6fb4ec8fc6ab3dabef7bd17848570eb490af06df1b1e7a3693fa8bc4b04bbb7c9a3ead3f6f639281aff2c0e4d6783b47aebdcfd74209c0a9050137e51b932dfa4820fb05087b932129767db67434b82a4e0351b7a98ea4ade52f9f947b41e3f37177eb2a7ed45fbc07504a4a9de3a3daaebcdc4ea9fecef2ecc0ed07810afca26dc39ddbd662900e7f1e4a66e35fdaab6b2df7ce8b1b702c4df38f3abce07d8702237751b1a677d2f13cac747d55e7208ef2477fa824822326f76ee4c619a659bae70c8b1c83efbbff917eebd0b74bc3862ab683d645ab04898305adb6225af2d11c64cb2bc69a0b44f0de85758bc11f05e17337e17f557100683d79a1f6b1c9b0057058c4be206b0ff66233fb68c13f632ed758747952b80b43b0d8534648502fef377c64c2a8212bdbb99c96b920f96411a2168a30e33c118993e9752d011c995baa9bc8f7c2e0f2c191b19ff8ddb0e6eebf5c4f4a560d0099b795bbd590267ad4af038923d2754085300", "525152ac650063656a", 0, 757810813, "53f0d6befa4fd4354c0104f8bc51ab601feb4f7d58bbf053ea7cd9175f8131fd"], + ["030000807082c40301ce19953cd3f91cc2ab547cfb0b44d72aac5b562baa86d248fc85f06723ec55c80100000009ac516563ac5365536a941cd0590481c94c030000000004006a6a53ff3bc4000000000004510051537e2bfc0300000000036a6a526e7b2d000000000006655152516300fc157bb000000000030000000000000000096f3f02000000007bdbf7f8804ae8bf1cd9d82c12fe2ddc6f7640c0365486211640976057709db7dd45a5737d7bca3e5f49ce02e38db3f696bc7ac59b44ad764c5c3c09b5fdfc5e527795eb2d3752060a5734f14dfe5176cbbf9aef7dddd4fb947468febe573c2d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b4a4be45fdac193e9093064e6e84a9446b17fdc5e393d1efa30b24010ec1ba0853c1c9e6c6207ffbba6df2a2713de1c4edacfd5e7c91950b9488bf763182d6c6412c75cb22de393cd9e9124bc9f3b70131f717b97fedc7390ef5500cc5109cb498b7a4f64d13e3a205e1a58524c949ddf29794205160fdc97bb07e5537733d9c022d20443cf0b084f6d0afe399a55951e81e673ce3e0cf8cf76767967ed662545f020a502c0163442e7deee9c41d9ca80aa787828a5a122409545659f7ba1867f20e0b03fa11b1308f2d867de50e5f4350fb605fe87093a0660cd737e50f85b808e29b124f2278bd4e8078b7cc0503130c39372978f04612ec3096ac89749d94932004031f95b9d01f6d27965ee13435909c6c7a5558ba48a22b548ed8b708545ae3b70202071a137f5a131ae6a8d0618da631751f1cfccb1758e19f2f02170f101697cbcf03037e05b46634883b04e528e739f5e8573d8e739d86b4352a1493ab98eaa384af02266577904391c7c48ab731f800b0528d03e69a195cd4ae8b747c7acf76535b95031de1812202ee6e6af8cf933c8296ba201ff2750011091ba561a2f117eac8b78946b95c11cf12fd064026131d7db34097f9e52ac0e6975c51741f1f5e46230dca757cbd019eb7031b3e1e6f0d8923540ce51f54e65f1591099953f506c6da74aa7e7cffefea449160ddb52d184e0bb65b4ad23a0999a844d9ac9d003162e1b63b0b0150d1185b84a16f98a04ba2d9c58909587a82d4a1a436324eacdf85fcf0a35c0f08b71ab915d0d363bb489dcadef21dcf14ee5f382d469c27a1edbae94bf9e2a9ec32d0c3c66316422a3810a892075edc1bd5d53e72808c80f1f6551090146b50f16a16812ca962c1a0ae737626c62d6ba3ba5c2e00ad6adc55269e81ffcceaaaed17a7202c67f55559d2f05b8106c0d6be6b25186a36d537ae93d9415ad1c1e368443fea2c4561425a8760a625a7c9e7325c8d0da938ec402f2b10f7f8cac1b59dcaee668840de234f00da0be16dde87b5bceb197105adc312ac711e09bf41deb882b73ebd486dd511c7ef4309eb6676083f8184d9f70dcb3ff3dd51ef62436ddf75a1f26c3f0f83f9cac093dc8536ee3e1c1905b811e73110242048856c417a555adaca84ec6871d5a4ab82e6b37dd83c56e4a369bccb7a000d4d8ae140eef2efcf733086aedbf92117641cb168217740b726b1f106772ecd836d022f3a03a2c782e838865a260467ce170aebd11dc07ba68b2debf3fb4e6524fd24029056cb03b30b98518de0a514ac1005248cdbba07fdca3f196473edbfa63b355a8881bd0f2ccfff5b4244acbbb8ff28c871e32300b6cedac6a2a72881ed30f92a23f4aa8d48d1bdba7f666f3e62f6da2923fec9f391d591b8fa55e02d1d6d33a31d113f3de0f0016ac8c77ea4eeecc7302cccf2cedd852948d12e922753a2feea967c87eeb08719de9ef1f74c1fa2a2c4ee4d738a18852d80f1dd12b9f70f10fbc2bbf295914e91ca7443ae28f0ebd8266320a61100d198b7a08d0701bddf9ffbd6439fd39ed6e65ec5591834c9870d625e8fa50d5de7ddb189e11a925925311aba86a299b2ad4c05e25a8e27cb31cb4ee17c4065fadf6d010c59c1fb01a37d54f342d9bc5e11e025c154cb91f049996307a856ff93937e0ff0381bd2d02043517caaceb5e124c30d370aff7355b42777be0ef8f0a72b1dbd0b22dfe81b67c56410081ec18356aead89b1724c985d3a94f3def6f9f15f1b38cfa486691211f853679f29e57aa61b6f7fe3d2e9eb3cbedceb24fda1fa6d9688e95f1798f52dc4b9ce1455e5bec80f155f2a7ecae770e93d0da4ae0968968923e43217fea0e7d7a59ef39559cb52580103fdd413052027d27a5c5aa710fcc7b0c08fa852ad3405606a4d102b6dadbd32dc94f6cf6ae8a9043f579722f19420b4edfa9a6fe4075d668a68ab76e866d2d94547b27e0b8ec76c4793ccf530b8f501da1e22ca3252e3d626127f5fb2b886ed9ff1ff9218c9a4d80f74f9186d5aec8a86b0611ddb332bbe6b4d1250d5f0a56a6d285b2136eb629cd8430bb83c07ba2d8dc7509b338900ac6957a4e9509bba6ed68234a65be467720afc843072511235f85d4f4eb116b809dc92f9660c971c28749b8e73feac0ea580f7d3ea68abf275c57e2a92027b266c95bcd30f727f6c9a2315e70f25b2c740aadce3c73aa8e99dec8e02014302276757bb5ecf8383b0e9620333bd339491a2c4d78d36c871ec8c4931ec638f2de3ebd8c9f0acb850d5d90e88dff6ee7f177505a93000000000000000002f665d0400000000a4fee8115626855fcdf209a5d54cd7f25a33bd2a17f8738efd4cd5114e3e63590bb5c22bbd15bec4a95c147611b4ff9b46927f82e54572b4b4d3d72eb078e79b3f6cbff0eef5024120fa113a2991b1fc92281b9cef352f79ef39c57eae6911b40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026e9d6f5f90293772e97639f7436a7fecf1498a6f2f1fc793a1caa18b3607b57c8eb3199f4341be6191239d404583fe7bb883a258d1bf664e89fd82edd1c1e6d5dbba9816b635f5b5ad69ef1d57946cefee3a86ace01cfad52d32e292243856969ac0af16244b3e147df0fcb426e5d6695161d3ed19abdf60b8381286c7a90370324e30c0775a0d420e92b05b936569e5a14e33241ea2f978fe3c1d8d5cbd114860305c7a960416f3ad99cdfb14db813b743071089abcc569d7c8a94bc804d4516340b086ae03413aa79059086dab10c743bb99f94c115267872f2a4138e1e4cb8789cf1451357295f3ec73ab8e827c4fed30816b005394ee7583100c41d9002ee00740200aafb14cc14db575928757d19ae2b8d0c5c1ec2226cce8ede5ad9bf70f9d2e0020e3887591008b1149df8e30bf5d2e35163ff51ac53def225d8779e2fb183bd5702186a3ef4c455abb38fcc5c32bb6b5f55e1dfbdc13deb54553bc788131e98d93d031877327d333878c2b676235bb69feb6c359f78082aa4f191d82e04be42c33af0021e716fd498012f159e4b9faa4555505c6b7c4af3ce84dec5c755da2aa80d599453574b96650e9914794e6f3a585244895f9b0e30e4c726ab4ea2fc6476f946c08ddd1c32c5199ea54f5d4e3a4a7987827f862fad91a06f50b3752f0c368184341db6f751ceb977311dee0e3ad1e094302b5ef3a74c49a007cee55411ecbdf83db210cd48dfa8ebb5cb8bf0817adc3267b9778f927d1c0034fdf8fe5fc893d54a4fcb575fd0a0ec03850a48ea12a8df6173bdcdd8a3e69bb04fd7d37f10fa769288c92e288ad3ad70da0b207f68474e05ad35c121dc854793ec16378a512edd23f3ff761c6fe996aafb3a10e3577bea18d1e80f1280adf8f297d1c9575c6a9f3505e61621b9d479415afe8cdff66d0cf1a63f88c834c349deb2c69c4bfdb0bf231b15e2fb2ffcda7be6cc6fc2850933acc2c73640685c0364584445e248539604e1040e719032dde582de711373407adefdcc7f761d857299814b43b96d05821f1dc9ec3a32967a64eefd905a24c26fefb5f3ecadf0ebb1f812b8916969bea4eabcff94460b2a27409e8f9011bc7fd964dce2d48e8773b911af648e6cb5b659192840a17f629be45f14fa1392b4a9e5a0daf01ddf2e4b4a0849955e3de0dbc0c0b213327b29e5bc944b266dc49b8866753ea9ffa6187023d59b25472bde8696b18db7f7e01caec50df1d58558864407c59ed6044709a88c01c867b266b732d64aafdba05ea1f74e9e0b202d183d76d1fc2f9a64695ce55d360a85515c4794bb8fb1f45dfc2ad323c98569c5f084aec336ee25e7cf277516888009ab14cb4d26dfa83febfafd88717329178496d39ed523071d34f4f5e4a76da38aba2ad9450be7a027e5361c817cb551d061003d26555a8109b472e92f2307d9c64702ff4c9765eaa88cb3cb2718f5e6c02870642cd4c88c166b2ebbe17437e1d1f6f6e135cf6ca338da2bb3facf1df4d239210b258966764a459439370e0229cba7f80f33bfd9c50dee1ff8b7a24c7431391018d0882162f7280e0ef05ca1d4fa47434433d2c96ac2345ff7c6cd65a2d6a289049e6fc2e83e4f1d629c0f5bc258bca7a729fb106defc43b8dd88d7e79b9f988e32e01835d5bdaa0813363cf380b79ffe9adc052be762f1abf87b7860f0825e873cceb9dbeecc4e278867bfa0811c9a5a630b18dd5e5aa1e08a6592a42affbfe46a57955683a0e5d752e30d56bf4195424c557376f4167d6f58b52a1c708c58d8b593262a9132ba20b89a7cca4eb050ddf471dbd22136a19f0ec57b4623300c9d0e7afee2c62835b8e16f697d6677e50ae876646cd6aca3f23d5e47161b8a7258bd50abf87bdf94cbbd4abe01cd62ff76c4297dc35e7e83b990c0f84f83723ae21c3af7c49f8b10243404ad0221606f5c9778a69dafbe2e747c7a3f63fdf7668f63fa53fa9624f0c2bc0e0281eacda73870a539e1214851aecdde571d46a01c0b8f63db0ee08d8fc7c985a1c42358a3db365d3d116926db45fcc73323f24870626bc6581e734de33bcd4476c8a29ba1dfd0da0d56258fb74a188a3475fa55c2ceb042ca111ad6ac54d5935938d59dd95b1cb89b7ac735622d03a08a0d893e86712f3bf8f98fad6bf4dece7260299e4839abf61ceb74b0e6a971d1356ce9ce9038ed8356c9834fe369568a6ee92e6d1cf8cd0c26a6bd7af3b48ae636499f3a812130e48e8c85745af4bc1fbc0495a4b565581dd50e4b02148062649ae6caa83d594b1c184e5080000000000000000a465690300000000b214d4d9d91de8140f7f72444b49b39b76229c95f5807553fe40cf90aa6e9f22fff1b6822ced93902c452aa723aadfa9797b9bd9648c2eddcbfe914dba2e7d9b43cc4a9a6a4b667fae0b4b34e28befc3aa64a14402d1a87a10c72239dcc7178000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f12a30703c19100b92e5b8d266ebd3316679fb47a6b19df247a2822e17007bd660351e05c3486eba74fd621f41db6ea8b694830d3a61920defce67e47d34ee60b8e347d3fcd505bdf7b4a8ae5742eadba47598cd781b7fab8dffd404073466ae81d9e648a07fe36d93a9e8b75d9afead03d820d1f90a2c89e4538205e3eac43d021fbc9d80cce8afa23fe4e75840c3fdb34aa3c51bbb46622e937b5775ccc4658d0200ca904e4b2189845d17659a760ae0a81cdaf3c58b429cde0c945a516dfb70f20a092474d073d937aa44dc087645a2ccce0c5b7bca4164787bbb9d2ec3cb9628127b8a92e1ac094f56c7af3e53cb9347f93ab78db48523d64c587ace567b9e9dd4021f25a817e37496a619bf193a3f9db8a3fb38f78416e54f57bb0fdc5d6d37d5640328ffd8559b8bcd7663c491499779f6fb4736f599f6eaf3840b3930046330330a0214fa621b04d02ec3e0ae9d98531f10ba32b57315c4f5107f87a1b1659e5e00970226f432694ed6afe382236fe8fe5890377e1ca0dfb158013748890216cd1d2dae020889d3689e379dd23088ecc82d89b2d9bc40aed2911d4eb0f9d04971cded48413297d1750507d80786fbd1eb8fb4ed9974a23bacde11cc00394876287c734a00d3ee82c05f24336a1a8bb109b0bb63b915dbdcb68323c362a356813ab5d83c0d149540182c53050b22aa511ff759a68921f206169278d83ad0a592bc72d72c4b76825c675ba0f7e3b26a5b271cb9b0bf497f4650261ba16eeed70ac34cadf2664f1c773ba973786cdb1a88f03a29080b502c32a2db7c7fb003b330aa3b14afd6853ef7f6ae80b1fed08b8d93c01ace25191171eeaa755ae93b35fd31ec24280a40139e088719397b1c3eba37a9cae1f1db260a62dd75c1a12313ff2739f3ed3d3cf1a1e9e32184cc6c7ab14385cd30f6c645f1c0dad198bcdee3708740a1fd178bf6247f8dc77efa9f7c7d96f4fccda7de5d9913a1875d683d85f07d9212a5c784a1d64fdefb4c14c08acb5e454c7db2266091d171617fdd23b7931d256a330520ad2a39103e5d5780a96f24b1d12da5eab96bdb21e8dfa8048e333f16ece6056fd8395f46f9c3a8066e1c1b818f719e338720eb5f0cfb934696381783ed0ccabd415c71f98507dc7b512d2dd68181710d096e76093cb090d8ab1b13b54b99b368a2f66c1cf00a60cdae40d962c36baa8582afbf4a04d99ed8f3c0b9285d35c983580d0f71d094202479f2e119f93cbdebc28e49e902f036524d32f5507949836b34c62e62fc00d20a4808e4038ffd416380e307b42c4fdec42ea137c38121f4ecdad5989831fe055e3558255ae2ae8f22d7921e4f1f805d70f795a2f5a1c6aede9d67624457223eb8105c70894726281eb8ecf5a483f8377cdd533143fcde679e618713440e2cc3b5ab109950e43d3aa7c2a185b5933cbfb104f07e8bf60a837fd51327e5427835476e7cdb4c3ef704d22d8b272eef5340665b28fe4fc3c278dd296a2a0c9b7aa2ace3dddda142dfa4ece7016302a955ce5082a67a837eaffd64849f885b8af05a6900b14ca46d033fca516b10ade31bd5dfda0ff9bce8e7e9a21285f23015c36078f8f7ccdeee26084aa932b5fec4f6687c11a7b335aed9e069fadf207be75edbe3a8dce7208959a6e291d64c2844bc63a445e01b5388701034fd7ffbf2d7d1f6e4657703a3c4bf6982389b022a1e93c7e67cc6306e29b59bc94db8562ca5788f77092758bb8a30c64cc4822ff0c68b8f47b8b9d305eaeb8105522f4eec6d02de881033acd25eb52fc15d7d587375f3eddfc9019b1136690a01cc92527304d423c6fe44f876b3ff65f06642ee342ee94a0bd02af8499092f25c1c7146afba8bd2b6b98a7f8071b318687dc3345fbdf3b55ca3d3a99c5d0a6ced629d123d2f9ed07922f06fecfff932e92fe8cbdc9657935983755e5b566e5e7ffc0bbac6ea83676f124709c63a3e2297598198a0652cc5e7165a325a32632df5b06dead334f8d1911fdb447b6d679f0a48a506aec0094e2aab779a7b84bee102e4490b091ee9c4b222dac21070ae1c9cd789996a8120281200a18f2b1b43ef39c603d7ec6327ab75f49a34913602e3f1a279e19ac8e2bef12b434d9018d2a11d7b89b9904033b9b9f7033d81e4cf9c35cbbcc112b790f33711ab6970d46ff96af2aeecfc08f84c769c51b64e91cac3ca096846b1b2e3853064461b9735b9986b21bd6304f7a0c8a53bfedb8b16a7ec7a10b8c1c745ce3249cb0dde7b840c40f1118dc1b461890a7695b0e430bd1b3a2670732073746b2101ea7b1d4e167c10c5ac1f371d1a82d37ac781e9600cf7437215a9e71230804cab282e509494186a406eacfcf3fe985aad8a548c4206c55a74b3916d8045a5e76a30d05740841d15a29fe9ec801213222ba35f51c8f66241f302", "536a", 0, -2050693444, "c6e0896ed1f9335cecb29dcc81d3dc9af9cc7a682ddb8dee06d6cd56c1d0b0dc"], + ["1c0be9230467288914d5f8ae2241857d450d58a32eb09abe9f02379b1ea07b072b1d3d7fe70300000000ffffffff508071a7732d826ad802bee2b2a06d2267774fe99ccb43b060f46bd3826fe7d901000000056351536565ffffffff886f386e6489ac30549e13d88f6cbe4b76fbf98c0611dd5f1a98466f524af2990100000005635363ac63ffffffffffa02e9462bf4b4b94075074c494f1af5c219eee6fd7c78384afe2d65c5417e901000000036365526e16cf1601bd2f3604000000000851ac6a63ac65536a0000000000", "6a", 3, -1603271225, "d0ced9e890d0196bca9d3d609f055c78bf21e0c43afffbfcc1f1d6be8421ada8"], + ["030000807082c403024367b31c42e667da4ca15bb665180ce7a311cde080fcc932cead7e95bfc90ac8030000000163ffffffff3186aecb80d8c2700b6882e5eeb0c83ba68222dfd6e254d15fd66cd42668f242030000000965525300ac00656300ffffffff02260b6f04000000000074cb68000000000002536a000000000000000001ae353603000000000000000000000000dc44349891cff5f888b8ad977353405aa45f306fd94924f4ad828fd3982824c6f5d6ed6b21eb7a1192a9f873e02aba109b5ae860b6c09fe7ee39a76886da1105ab79af87909f2d1570145052779a906e42e5c3097ff1991d413f822de337eb130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087a75d6a0fcf19b40a024763d45fdfdff16b60d4372f85eb6b3db108fa2d9758002ebaa4f17f1be59ccd1c5b4ea78707662024976c15f39c6f158414dccc1609a6a7484844b7292197e24277e1d6274b49e3884b39dea32aed8562052e808b02f8121424e45de93ac852e99021623b970f2bd74fa3422f9dcfcf0cf0a1d5720f031797989766e6841c2c03eee374c77eb6fdfc6dc2f73ff06a96809de7d3fd53fc030d92c6235d5933d8780289b3b2ca239804067f52a312f4c89a3e23140cc409930a02a9b0ba5ddcbfbb6af837014239f332da7da662b3ea16dac1ce9eed149157ac008a19cbc430a067a9091abe27e9a8be0d85f0fc59ed224b84cbf3fbb7556d30031e99d365340b61ead86557e49b6eabffb95ad8125e60ce7f39f7c9ff09f6dac1020a0cb62577c4f8b264977d59ab4d4d7a643ce19cbae395e02e3c82cf77bccbf00213b285c02c2c78b735b03ad142645ebee4d3d9e1477e35e829a85bed5f0d746a032dbe8669c342dc74f171ac8390effaa47c2fff4ed062b432e7f073514468c029031a7e97948d2f65aaa59aea60640d8414912a8e34739adbc8b8d801d861c6ca6e88de130e71bb29554edfb2eadbaa0d6a85af0964f5ea27c73b659a5806c274b05054f102070508fd58f89f86a87e9e42c3f72e1796ba26ea22292bd0b55de146f0f7858601865aa80d2e679747b11c0b79a9b0105edfc5bf391721098a88dd4c8a661774bda119489aa597716d02a92dbfdd47a403a63963f4a6b25065dece7c04b34c4cc9380686c4a480899f15fac3b8d644a25acf4716dea17347f0a0fdeddffdb78b7ee919dc35210d82f324c99d70dc99ac5dbf9565ec18c6394a157617ed1ffe085d02021b10571ec8c75a1875fb77abc4c09722ab4fd75151a1e22645f1bb00e1618258893240b5a155a3218794da5e557b9c9bf0c849cf008a132b086580b69a71c63b0b72dfaaba8cffd5e9ad17b4bb9bc4f18938e7ce3cf0abf84f077a5345e3e9e5c32eccac060740ceb3a3b3a110ebd755fecb9f32c0cc984da3eefc4e8fcb0b866f09175110faa5889f9be354ae38c90399a2c6a55c20456e2d9b1db984bbe2dbc7532c96315035407bdb8c6e6e40bf4f26076209195e13372d3cdcf66b816421f50d6fc59ce0dae66a9721ca2ab04d6bccf4e30e2576cc0cccab04a76b9f6fe182806c5958cebec456e96aa5eca7f4eacef1e42432482b0e8f030398b5529b434c6c1a9df17a3c9b258d320c21f753c65a9630e8e87da9e62064ccc7d2a2c237796675eac61a16f9d5855bd6df8cbb4b4b4a68ec2e6b2ada8654a3c8e0c423ffd0da9d42a31a40612ae0c13783948e9c0f315e6b4bc5ff1d0dabbe5cc397dde3a29a98e307243919b0c31f800f3871e00faebf38f53c0f23c0d092bb87dd9f85ae696df58f7d8cde7bcc8198992ab0db023cdef4b82090359b3cba9d9fd06fdaf3641a80dca4b3148e599a8ef984313776c791fdfd079874d3a6b0e0c1261544c61ab8ed7e22c61bfa5a82b9e1aed505444fa473e2816a30a68c5171c694bc5c0a31068c86ffed1db5cd615bb30c4576f246c9d02de87eb292ab1d86b7887f7222acd96197433cff14a68bad26d770e0b8574a7a3b76ab7ac61f1972244d9886bc4f0ccb9902edf8eca3b1dfa9bd2f3078888627d331cbed91a750ac7b974416b41227e7b2b48b1a26249f8c1aee83ca7ab3f8061d345aeb9620a04790bbe6d87c5910eca4e9ef2be99f4e5218d0897fdcb2518238825d40c61e252dd0a26217d45ff8095a099224afcbff5bd9e7cb0219967c467908b33992b78764b92b50b473b334a9d15e904eae54acffeb429929141a7e9dddca11dce770e3a6f804bc5d005c8033a0fd5e5783824f2dd38c8cc40ff46a44a4cc3e8474b211ffe3a1d0268edf7309fa4e7917213feace21a0d1aba3615fe5b9869826a9f3b36d71688bbbc57c5248e5b63feaad3fbd0b45f0a9604eb294595482faff86dc6b62ea202bbcc1cc0effaca30e4bdfeee3f31ee8d793ed4c76cf916699820f9176e4751fcde3d02ea76035c86444f1a2c5ab0e0d75df33fae774d90c34535d2eed11cbe0502f55dd36683612b0ac4ef2f54f3a9ae7c99e8f1745adcf346a55df7efc26082fde26d9e4b2d82a14595f8149a09092f725e4600974b54c1a5a0abfb0e6634948c45e6d161d892bb6b4d9ba8601c393ad51863803db832627a2752310875236169eef711c5ef5b743168c39cf9ecc961ef10f03c92128703e3bbbde3519baf8e504b2b719261bb3be1032a83ec243673c28a0dca46b9b445ba9e3b9d60b02af31b8411deda89ad8a6e9b09d780696cf58c6e20c06fbe2bd1086a3529fef709ac49e10255367758529f87125edb8176dab51c278f64c4e914cabb1ec6249553c135bc63ae12b847e38e521e909", "ac515251", 0, -1568012363, "21a5c35070070b7868e32632763475b630cdea03c4b73982d16b033205d4691d"], + ["030000807082c4030222e2872df55b06fa03c1d45eaa346892dd2cd1bf26cea6f79dae119aa0a0c0a2010000000565656a5151ffffffff5b0498c2af176319ed42b09aa3573d66553495bb2e9d71cb5be2984d23ab0715020000000651656a00536a55ce59e40149516a030000000001ac00000000000000000100000000000000009fa1380400000000911b1b3bc88516ee3e203bc291f6195a38b17d80aaf0b0a60c52cb5d726c9645135933341cda176b922746325b5977315edebe1050b60671837a6570b0ad1702cde7e504157af25ba160a35224f3be1583f89b036bda33c84517f7b9bee9041c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de7fef1682a8cbd80403001ea6bacdf5149231bc07f76fd17a1de992d66eb2ca97b83feeb4ab95c0bf77940f1e7ba58187ec3e3a843d63b0f7e7d0d96865343ccb5389e6741755731c0ec01cb605b175fdb5fca7861476bd076981acf707d89923baaa466e637f0c65d4eb6a9cc3a8fe22b93fd775070c6ffecdfaf1fd3ac4bf0314cb56c8c39ee23adbfa8d215363ac08d4a7aa067573ad089abc5cee08431e45022fc185f6112e03c5b51e91c8cef8b8e4d5be63f277c1b25a744df676a091670b0a068c33699faef3f2c086c00e9f9af09b955b9c5c58f02c01dda30ef1256c2b05bde8c86f40f4165efa88d9cd8ee90e912785e57bca268d6c490d89cdd2762a930215db4111f67f56b2fefa74a9573c91e2755a1131b118fc1f43ac3f81703fc29c032c378fdf28115c24b0c6693fc135da44c8fdc4d95592329d94c1352ca3431b06032c93a001460df77005ce586104741f27ccefe62abb58f8b5a3245d7fd32e4d10031e798173979f093fe10146b0c2fc1ed4120ef35d7111e69e9f5542784fbc0e820213b99f4ddcc6ffa27b8cfd9de72c34f0c8c7c2dc9b5645a148dc325a82473999e0f055b02942669b6ea9c876ca5b786633de21a4de3564310593b65f87f65d4b8853c9fbae52d4d65fa9083b250219688fd2989efa93d9ea765a0de2c17c81621fce6949b17b8b8f83b90ca4e0ddbe1a3b337ac047d06ab12b270f88ff8e0c1baf9e868b69eeb50e5c1b61af7766a6004ed45e262e08f5dadf0dc5f239d891213a5ff5c47b90e154657115bfd9b5ec71c0104f119042dab11d8de54e0f99f557a55c5185609b54d9549a370c4c39bc4fa82cb32f7826a5bc50ab0cff16e5035933578b54e92203dcbd0a381bfee0bbe000859b4b07bf5f9c0a3ab437dbe35d52079ba9d1b71a76c94b70ad62fc68af5da3e06161247db83dbb559a05093df5d41075cbad648c4358a53e76625ff0bfa01f80b043bb8b8a055045115f46965640d27453c6331c4e1ffe0c7f8eb92c085d4e34801d5a532fbfb3b60a5946d90840834b5c9dfda70e17b04c4fdbb619a9aa213624b79f559087d84c518f56dfbe311b79f0236133db418e218dc0ed872b669e1197c7ee984427b068913fcc8f4a2a0f35cc6167407600d407840b35818e2d709a181561cefd35ef4e28450b8c268a2c65e046f26dda01a5653d6178787297866f970d654ed9736a12de7dbc406f7b4cb4113b77fd6d2d1dc73d0c734ac657ff910467c58b49939aacdfc363ad9e56b4684c1f7550a198cee3ca06987b445667a7f05300da9cd4692504a52fcb7984c09657034ed0f56d62ad6fb82fc79501a82977593def4ac2adac2c6c095085db51e38a67665c123600ae8a1723ca084238fc6a086739c2e1531fc8aff04f4e3f4b4614066a4d1ddd0f94ddab7a168d3356ecb734911475e58d289deb29bcc714ea822dcc67c964ccafd99bc619768daac85bde3880f5ed53f9d1e0a92e5553bfddcc793c71630edf6d17426bdc559afeb1f36ad58e04d1029e32c6b1862e5e6af7c446c3bc72c6c112d6543fe3a357325265cd242e7bb084c11ce1a27137552264aac62d8b2971341b89babb823ddc67fd36a1554cbb2853153f714967326816008afd582236e7e4a7b283d73097bcd97ee3343f0168745c094f145ac77564fff4ab9a3d7df5e610addae3e21b2835641b0fa423190c19b678f2b10dcd22cda3536fe940a184be3e6d359ad4143ec0180da00ba566692e2c4a871ad0d6015dd92ca7f97df0ca345ede3dcd6cd978ffe84f8c5d85f1e6a6aec82edd7502ce5e498346a39dda5bf1685060803f6c093d6f509c1b659ecf1c10549f55b84bf6b6c9a10273181d60494f1e849f427242da967744b0ecf1e2e46ef2d00a7011d9255d8b6d585e078beb619b325e3355fca5b38af49150d1c8aad620926dd311db1964784a4277a46cf46248ba650ce43101fea2f5287309853543479df30fcf2a4bdf3ee174b3303943a787083fc960b714a0ff505d0c4df5478260ad244defd88e49dab04da63807d9300d1338f4cdc8addbd45e11c00203b3c26fa643f0ab74fb7b1606bb5fd84c77ca331b75b43754b93d48fde2b19f680d8d96dfb7f461c6d04ce516bc77f7728286073112fd2f2d27c81f860afe9d6164c8d6ccdf3345d48435e88a3270502a04e30c836912fac4177f82548b85d2b1ed1a9edd711dfbfefd38dbab61b8a7925aa4bbd6a34bc9099292d95c8de61e0442cac0377b363db6ea6a7acb507718fc615139f9edf356f8165f016b085566861530d51bc947b8425e43fd7b6807a24f36ab4c5bab8044816bcddcfd758a0c85d923d2ae050a4868eb8c348378715dbc448a1887c53b5307dff52433eaa5a84e78586eab2d289a9344373041063152aa93e37bd0e7efc9be975c4402", "65", 1, 1455836950, "c759e3f410bf0d386c4f26a0dd73c4ba6ce0cd38ecfe15f659edc4c8c53ace14"], + ["030000807082c403038d2ca2c199741014aef309377610a4b4483f39959baa979ee784d6329f9567570100000006ac6563525252ffffffff3bb431a38c62e7bac903d693527e1acd5ae934523341f8dbf942135e7de4864f0200000003535263ffffffffba444ed1b71087bbcd1aaa61b672cda02eb1c159b10a67a65fadf0b9ac9cb5db0100000000e07e6da601e42b19000000000006ac00ac656551f4b6098c0000000003f11e7d05000000000000000000000000a658716305cbc3f0da348238d9b1549fefe8c6aad12249233776febe24653d121745ac1ffd6acfe36a7f1f231de0a4c7d714f2cbdf4b6b2df19705b059b6cbededee413a44849f68a55bbf163434823a7bd71ab7f620a2799aaf90fcfa0df26700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f0ed32513d9652dd3f0abf7baf86d8b00551c2f80003185aa65d2c665a2cc53d3c232bb023a00bce5d2fb5f35699a2f8c4be55a36db30beab1933a695b106fd8cf5def190f881f852dcf20c6610ad77e50db5ab7d972e71210d889eb40f7a7dac52cedb0de5691a56687475f6ec037f37bcc7b3f737214ece8d153d9fbf05d8c02115e425a8ce148f6af36c50882512e44f8dbe956673fbdb9b70d65c1825e0afb021a9d96f50ee385071103b1cfc12174cdc64ca0edea00e2b2909b8324411de8ab0b02a295b696356054a7f3524a6f9a9dd2ec86d7917fc34ed2acaf7c367312d1da0745a96c87e54e1b0092f8ed639b7a712a5d6f5e8f9b8933b80b8bcab851aa53021d3a27b6651256ef37c88c428c6d94ccbd82dbde447242da5ddec3697311a351022d8773004d0a91d3cc7839f55ebaf8618b0dbb63dce214d60acb7f3ba4776c49022822f0d149e4017c37e1395dea0c70e01d6fac76a94d40a6fe17db4345f60e6c020ffa0fd8c012e14b6338d5547418180f4406eef3537e586d2d2d93b49e93c503031d8c0d2e9aef9dc928e44724e1a1f6256d21ac3cf7b891c0215724c227d937ca8c3105342a0f16ecadfe79986c753fb0d97b424288bfd98885d943c672caa585993c70b4ba463e22fe9af6c7960dfee4904cfe0217546a5b749d7c19b34812afc8dc431fdc300dddb9306860b7b5fba7114e4f7c713eec7bbca86aa161fc9f5a58a2e9caa004189efc7666bfb0dcf768dcb104a2e9dd4dde0fde10c4cc758f48e5afe8584b9f4aa851b6a85290f000ecd8580a7fecdeeb155e4e4213d833353b0294d9612a9d43667dad3e60942b00270d4712df4ac4414c36f5bcdd6a3a12160998112c65cc48685aacd40e74c22ea9d33bc17243d4b4a5cb6decb1957dcea3733368fa37b5d14d4fb3fb5b80ff1b06074de79c9c4e0638d5fe451e7e38f1f6ec1b3257c201b39722331de7a78b8e506e9b2067d1889ea7343ed23312c601d6586f7d7dd782d3f86565eea63d0c9101d12381471f2d23c83051f6e238936f5a965e977fbd3db79b489a809610779e2ffc1c8ea198760a29747a149ea3e69c86c7769551f6fe6dba2d6c21c563ba7d137e04a426d0980764a1a0b9b131c181cb102456ea52ef158940d6289fbf2e9c4ab2f0349274abda3555f60561aec5826d73f0b9da99adcd54ba3b70ce646326b4a97b7893ce6e6d2c0beb83983e5f48d3e295f64870fa28e2bc8b01b545bcc25b6a5e9f4ce3f5426f2da578cffd3e6d0ff59e9333477ffd0986881387e700807fd988bc9b6027ae5a6d2aa7216b075b83730a4f1376f0b69e91123f4523eb17b6468a00ad8c43036d7e0ff29adff6df769b5655472e11b5ad825c93e9c1d1784a885ce1eb2e8f73ca3c996a1b9497738b6e1a9408df8688f6eae80370940de4bee8ea9f1fba973887e2c48970d154591cf60a883d4ab7aa202bc44ad6cdf0eb9f485d4df9061cb27d4c505d20820566565a5974328d30708df26715c5cf7b37995c4351d49b674a62cc7ee3fd7fcd9e33a38b5990f3813d3f16f9f3167cb4efb83f777310f9daf467cd4b97b4f6bcb8e20dd858c327f607966c0aa7b0d8eb7bb3bb864b3b021541b3a5492d5318cf1c9736b584d0b1daa08be815e5426054c4d8be1ec4964bbe2056ac2f07409f566c08d36d9d3a9577523375e924dbe55bb54e5a808f58b5b849b8d2449519b21dda008f4fb270fbdd5bcf1e6a92250df32489851e9d521a7e4ef12b2bec93a3b08603e955d913924444e63b0bbb909a8da1566351c27961c523b34f745e03377dbba4cc8c1f9f8eaaca53047890c9366ca206f1fff3c0bc8e7ea8a4215ea89d6cbdc87bbdd2dcc94c06702b4716fea3138a43b2231bc52fe0b78cab8c48b2bebe24e4970e853897f2562bae84d27aff0bb13a451ddf089e8a19ad486173fea3642609807a1c5b42525322f8bfbf2aab2f2d1625686c71ad7b9afa23a8a4c18226b1e3686c4599375c396b763685f82e4a400a4a00bbadbdb43c665f07a6b2b97f7f4ede309f860b553993dac9462e3671ed1cf502d2ae94e1748956e2235d330dbd4d6373e6d95e8620a00dff792f7aa79394be21a288dc78eb45a4ae54dada240c4a700cc233f9acb616e978f60b178af41810dc55290cdd4d2fba8d9a1c51d5e8c49d9670599803b5249d107a0708c98b4260fa62e2fa83d311b22cfe206fc5a7cd402b82f664bc30650c5285fd7d45e1678ad5fd4daf2086e73a73e81963eb423e6d4c427deaa331943aea1274bade041bc16e92162b00000000000000000000000000f5612985c686d2952af106702e3e143fa57ab92a4c26d6e7c68485ee056547c4e0d3b542bbd6f4b879a2ab4dfd3e3480e749786cae958ee064cff4458e655a128cd7595a290ca5ba9d5176cf0e7d21442f8b251564c39b11f2aeaf7750e74469000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007cf64216c89d98ac8a11c2a612586e2f4adba7fea81d28fac6e97bcb1f0bd90b59fb1ba3f0655b9fddbf3bbfc26d4621dd5f179fc41c1eed0d49809ec8bc96dd498a56413bb343e4eb5d231e613e0e93eb17657e6cb68e8386240ac20655117250df6b4a78634227687e1a0fceb8a55bd8437ad685ac3a75a55b74a75e45cc140307a9ebecf8652f8268238926238af1f0ac133862392b80fa5987dd67c305cae3020d4fb0851b583a100bfdc247954ef3a704638d8346975d3dcd8ec96c5b48a5c10a056ff2abef36cae85f065b74943ce29401a62ac2bc3ca82206c26a3a4123ca4f7882fca7d44848aaffba5e673153a4b49db71931fcfbe4e5485959710f45c0cb0321c6e216fb850d9021d8b6775c20404d78ed02efa0ddece185ff5012766a2a5c0317e5c1a85e0040866b2c5423fb8a047f1138c309b67b57c7ae5a29256c95df34032d9cde6bc58896177692879db688976cd8a37309a50fdb3f3136120f1a5cd1b7030008444b5050ef8c558514f04beb3c45acc1c17203d50baab47a9c780f68e093021cb54117cfb3aa8fbee977b5298af9483df7eaaffcd112cc458f6df5083addf032f2c538f22acb72218863c7596019758d1b1036a76936b22e62a095b0e1c6d29f99fdaa777e8619fdcb4d8281f0c7f6fc6fb90449d285b4180d5230fa44669e467f3c4685e5bd2570a78dd6e6ecb5e81fd9bc42d5d7c0d92d26d8e0b10e53ae5c03e7a5e593d1b215e5108fb3f8bbb34c905283573cae4fcc8e47715be47602eca6a737a9bde1a236f074c7a96c2988a5710ad67bc54285d6a7127020cc5fe0b61d9794c4f9d15a6049db0fa08af5b3c968af66796d4945f72830fc64cb83cf1ac56a38cd6135fcc61091e63ab230663858b2690e660b80151b11fd43f5d81321b1658d2efc8cc9307d0450de114f1c1bb70d0f5672c6a2473567dd1bd3b32b81b27c163c36c9940d97e54788a3c9894b9ea891520c4a1b3bf3ddb97493f10124cf9508b85a0c912315c158f4993cb7ae50b8f1e8cf20c5b5efaabd934cba8c7cc56e2bcfa1855a1fcdc5e18379f55a648a35e8e6a4165ef80b30bde051e6a53f7ddac41d7a8ca51ce86c18dc42e4b48158e755deccd9ccf854ccb1af4edc4b97f259c9c6804771a332a32aae6df97367f5956412d3d5b6532aa65a226637d12c22dbff164dbd2c6e2059f77389882ef27b977c77a0ca3cad64ecf729701e09418cde43b8027bf7f087859c07575aca869216010fd7874ef7c9fc6e01c8861475a391b59af4a31eb101d7b81f84b62eed4458c342e540ba2076643fbeb68396ebff5dab07a6da56cbc21c30c06e3ab367ef3a1c29c43bed437f13f42d44950042390dfd9c8f2103e10176c89d62f622379007e4353420eddd9fb3d30b7a0d4d98e8f05201f5d3bfcd6f8cd1b59b5ffde8d4919e405d45fc49525a8245756392da30402756736ef5ad5e6aed9c16237e5e0495f29c07859b446e5704999b0b9495d7619068a5a3868a0e2ca50bc833c6cb2be1ae7989e3ed2393b6a62c8c449472ca624ce78ec300c0a1091bd8abc05e0a82c9505fe542e25d9082c9ee70afc365bee5f62cdaf04f640a3985005499901a345858821c6391b6651bcd0d6911eb09f544aceb3261f5c97ff04f4a10568dcc13eb2d91300e1f13ce4ceba6fb7db9feadd376c60f67e40774eedae08059ddb7b7ea028db40b2863a04463ab551e823896a7cc44a0dec4c233f7cecd838fcb3d539496e86090e56dd7b3a531f9aacca486ea4682d54d626385068d2ed902bbe0351a552193b51f19fdf8ee5a0e03b240e32e2a22c80b230c599b6f5048f5bd7d7132473f9d0d7eb22e4114be65d46ff3746f1e902f2153e086f70b6c75917929f790be53375f01c50b0a116a3c7c047bdbb17c71f716408d92265a552e3a1d4b980a2c12e814f1d4887492c9111dcbc4bcd283e34bfe0c62100434decd930e85f3110e9071bd6af3a2fdf6fb3406eb26174733dc4a31bb681283f2ebca15a73d0d798cfbaf18725dfc8737dd8213409d33cd769a3cdb61fff28a19b959c727d42386cd90d2499e212435d832e6e1fe76c6dbda5ebbcd69353da97e306f0e25f0810d3fc691d9d351914192e69e7b34175826178dd56b160f30d219d9f594ad4ebba1f5add6d0236d703d998afbd309d4683c0dd71a52e60779f2360ae49d94cc03668ce9efd3b64f0c66ecb7e5172a0352f80e8f3ecbfd29a898cadf5838060803ff205c165e58a35fa93173b3a0168e3f70681096bcb13766f2192dcf0fb7c39e0000000000000000b556210200000000e845312f0b31a76d81d74ec001954a35944cf631c613a3a3284bad6a247e6a32cfef00222fad38401ec744117d4144a00e5ef4c257c3dca875287f23760eceb1c84bd851c34b6571f59b53dbe4f330326563c9a15096e7b27ea185ef68e8efe100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4e27fb1443eab00e67085843f89f6737676eec83bee7dd2aa361ab013d8748963187b40ac23c8a5615ed885aa96696cd7069840c3f8cbea65fe94eda5a0a7e68d685358e95a0ff027221067164bd6c53159bee9e4d8fd71d40e9d67259be8f8c02a675b99b01742d6ca11d00364593a1bc3e9066831758cfb7243bb8c43f839022b16d28e00e1d2bb8f80494e2c8ce94fbd84c0cd38c3bea36673e180c65136dd031da637817158500af671823215e18facdc1cd164cd5f812fed1498b1e9d69e9c0a0295f3a6679c4114594eefceb56540d820018a30cf38a25d0567e4d1bd28f7f0b73f2a06a88bfcc3d295b78d5549bdda6de83e400ce1dc6c8855808a41b03d6603174a809171e82da41f60b7aed40d90d29eddeffc1d29b13a6110ab04919c4389022089712be444f44ee9b03ca8de61081445351209c161a24e00254dfb88b3909a03136f5638ec43c5d2888514821697f3ce654fda7a386ac68cfe0259bbdb997771030d4efedade8a51f8c01ec1dcc1e4ca9ed8fb9cdea6fccb8ada662460f49d2789030e076939ae95ad34f684e4ac5de18cb756bf37b21c27aae86f37a96fea517f3b7a0e0aeef6e29bcc897b4b57ad34d0b11098a658e41775ead485318f903417f9a6e70aa5098c2219d83e4378e773538ba5a76d9c24cff2d2f95f0eacff9cd3ba3a1cb9c85c03198a09575aa760293446d8851affd65393f01bbd1e2692cc1545aa3bcf1c93001c75d6f9fdbfefa51437f7ec0ebb9890c7a14382da8bf8b07a66573948398cc70ef4716050cc2629fb7868ac5c6155e549cab24ec61e954f04ab9bb712e2fd29efc7bb091a1e41a34ebc06064783ae4e5112c124988287373f5acbc875f3cff3f29e682aca78d1f96bb2af219cca25ae316f1dbd79a38b74599e6ffaba511045067969daeae0d5d869ded030c07f2e07bbf20edb48f7f4dcdb1b8421a7be53a8313c3a5316da67b54445e104a24c81381d44061c5186cb677eb90eaeb5d933f16cb16a3f340dd486337c51a4c3abadf0be7756f4db747ecedd206182227dbba9dafc40fb0b2891840f74e12e9ac5c45f733f9d980cf005bc286b3ffc1033ebafc91a88909a31a631324fd8e2d1e6a1e6fd30f4330f053d9bb2a851ba8e6dce14040e5162056dd541e5e6f62bb8b80a48b66d5424d4e6692d2cba372d4dcffc08e2571d25a5a420408b631c18ed152f71461cea3115055de3aa4cdd1d7d5c8632c5222024b227e54ae313ca65714dd513659b1275192e414f1bdeadd6dca43ee3c3fda4385695efc72db5a7b45d6030e7fef9c72357b65a6835d412dbcd2a3a2a471dac43aba2312d266fbfcafc2b2ee0281796b7311fd798d6a539d91fc0b2f7e8c7a4bd10d82d040689e3075b327603684a0e1df973624e2184b45b28d7ad200cd87c096a4378b2ab19deb79c0c67084511b3682fa980b5a293e10eedb5c210cea4039e1712ad048c22a60922eddef17d2f64a74bdb1cb83067b27ca0dc55bcfdd4a4cb38131e4b0d24c6b3ab0d99d17f5f934e54703a75d0fe5bc33e14e37e5e0a922d6d57225102993708540bec090b750792db7e37ff462e5a0b588c80066be576e13ec78beba00ac0ea6f349f0d5bcdd53f6f0875909b2fe66a439e1ca94283cb9f3e3bddeb30c90d8bdf69a15e790cab1490d97759383c1799d1df47afd91381703d1532d321b76b6e4520f108c8c8255434addf7e9a3296d9a39b7e21481cb830b77ef1c3994bcfc44ba0d752d5b5e9a91cac6ec0eeb7b23337c8293a2ea2edb7a026b1f9a12fd60d94976b6056078265466a2cafec5e54c4165acb47ac312c34c29763a8676872307c3f117726e4596bb1ba908bd22cdd047a2250817586f71b20c44229991d2862ac2fe011e4aa45c904c6a320d3095ce177126492ebe998af6e0dd55db60b866a79f7d7e832064b95a299f7d84aac608b503218214a67ba3ba3f8085c003e969d0015733924e7e998650e7b98a5540f6db322cd29f80c89e134670721f691f51be2fbc29fd0b0be2e95cfbcfcabb18a696d2a46006bb355a78fedae44c9dad27fc3fb713fdf397d0f764f09866a3600d5ee0fae94fc3198c886360728e97f48b8a4ef8ff550b39bc7e38b94061d39485c32493b151ed878e20173abeee2b4ea15d64cc3c5ea958f3628a8a5cadce2255acbf135ca2cf253f05d0da9590b562b14d983977d1964ad146a32345833d0952a01de0cfa1da179e18f0a9b894dc369db3a9ec4620452a3d084c78e5ee263bcb7dc658f43b4ebbe64be2ac655a3e5d618f29369361cd08678d1c39eee510e6f65389cf65575f4c2a73cb4c3f608bbbc762ec39da5c6cd6aae10ef0a7b7eab39adeddf3c2e1d888fa2fb1dfaa096ebeb8721754731dcb8fb58a504a34101d4c1193e22633334a5436f07a135b076929d08", "ac", 2, -733833542, "b01c594dab8d1c223fa3f88e6ac467ee1fb4292beb6ef76efa6d692993741794"], + ["030000807082c403020d40cae0a44eba333f49937568d4c1beea0f1a82eb0a4fce930cad7b14137f61030000000151a6ab3966b4a7edaed3005da7c39bb81a8b5b4fb0650b27e8b964948b6c3e3bb7bdcf01d2030000000151421a839e046dc2ac0300000000056aacac6aac9af225020000000003006a6532fef200000000000900ac63655251510051906fcb03000000000865635253ac5165526ccf52bee99ada1b01fe5de5050000000000000000000000003e873159605c07fd87fadb8efa2841812554c0cc387fdc408bddfa059abbc3d6760255de0c57bd805809a9dde0cf964e7d110fd13dba870074475b9acd4157c8218a2e8814f69471bf4512b081689ecf068df59a0ef4c621df11daaa810556c700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e6e028810dcfc220678303c26bd75efaff11c7cbdbcfd7665bc3945192332bd03e6c4c0703d264abc1115c5b538b8fde2f416d8915f1c30ff7f239436aed8d8382c8928192e01b2fc0ca0ca03fc98889d4ca332b357c55572e7d1ee2189192a43f4ed9a15a925fa8317baac9063e8298a0ed49767db0132a30e59beeda200ae00222228d08f64b9e41219ff8f438a1800cb187144cfc0c58a3d67b5ea913d4992a021e510f2260f1cb801123310b95425821f5ecb3d2a072a57c075527c755a2ddf90a019fdd7d69b6866ba949260b9a28ce62f2ce61b82abb864811b3681fbbc0257de40b16bf591c50ecf8e7b0a5abc31306ae6993d58551080112595e2d411b0210031e8429f57a8112f6e400e6c7f01738e33fc85e8861d2f8f0c2fce71dea56a3fa022afe1108711ef88a21c323288db0144d1aa53b5af67c60e03088f40a0a1b0f54020b3b436d89d02054c8a71e618ed2ca21bffd424f64df2247e0844c8a8664414f0219a69a4d024df6a5edb488fdbfe7984ae37134a82f1a764abfb201e958fd899e0210891bfbbd83c9506d701e9d65ab4da018278aa0a068bfdae1f972de9aa011a663026a2acd8cf25b02b59e7a08b3e09188f8e1a941c361175c06bb016336cdd2385e12e6140f878f04c29a6a2c3a763367b8ce0250001785d63fcc5c84c4eeee0d675ed09a9a35936c7b4285f734d02172dfdf73ffb3f6b20ae88d3f7303762fb3319280f244df5487472adf30d8be16d0884ae3876f63f209d7637a3fef642654898c8b756c22b46be9de45688731baae6240da948b5090aff24a658b5ac84237d806aa7c2c991cea9577bd40cb046c4fdf9a89d05806f828dcde36bca66b4e92285308dc0e2fa611adcf8585e6ecb15d6c9873559876112191ad6cb590c1f1c6d6f175caed5d4f7b6e168643c0b0cb771c0aed3f858852531d13830a27ed2893e1fa08469f426b558045d87e233e457b7189a47e3e65f814580d032e417a410f1ac9c98371328c53f6a27e274c73591a56247f3084367064df6eabe5496856315205d7ecb0284b5eb58350eb1824297bd0e6b94246a13f9643917270d8602ac5f51a61e6995a21a9508c944fd4533c86f1144bc40f751bac43d9287e1112b330fdb4a077f1fce42e0a9452df1caccb1213d28142cd9752d9ee3a0ef1391a50af43f2c848d5b776169e81d101507fd162420fb23fcbb46554969907dd1af339be4bdc0390ec38088d4c24f0572713a7af7c0058ccf5800a609f57fe2661e439cf114fb435c8cf226d12c6874d3780a15d2818692336cfdd9951f75929836de8b2536257fe2da575310c30164f34cae55577646bc2936a402a8dbd06d3ec6ebc591179e6bed4c430f9add6fe64bc903ea4992e5ff26fef54aa49b035ad3f1c91e31bf7f1ff0ac47c07af4aa7a2e70e771e4318c0db0b6b6f6df63606ba2bb96f3d4b5e57cd36c973303de6d99344b3bc9f21ba9298bf60d12aafdae8596acbabfe9ac34698212d0e771096ebf73b46b42cb1cf6b95b85b10130292f75cd20b6dca6abeeb2bfebd67c46ff56897b3d2d1a3d9421356ca99f0273018c8926aba718052237459ccdffdb26408fa276d32cc48287fe894cc6602c58bf3d46b79f5ca605443054fdd84f93c38fa85e5301cc1ceb0027c768636b14e731abf2d92ee8ae0a8db33e3b7d3c154828bad3b82569c792892d24fbd279181942fd2311bf61588c706e5e50c39c02a88a8b4e5413c617e188c6fec63fcaa1f6be7ab796ad1b64edf0144738b5658e7afb35f6a3b56e289b23af10ab9f35642426a3b120a09993a6b905d681ab9578159ca47d1b452cdc852b880ae8f8f6ac4edff213f617f93fc57c3c7784ea71a32499f33427b3a8cbb087908ff208d791c04d0c0ef3891148d7c1b7a33023b54bb8ec255ced97317fb8a8d9ce09be07825c21f4af82d276b99483e5de4b2989e29664a838ee47deffba844644b9523fb536f076980053b2dd7baadf726dc675599a87ff6f4f4efffa711eced09f856928eac8a37de17594ee04ff3748fefb225913abcee864c537dc42b0799c74d384596b11cbd64c81b5349258af40138055e1aab6cc4c9ae2f42fafdaa6a3c7b04f52683fd9fec9f2846ee552b090bdf602bfa8b61909895e8a2086f7c72ce36e1ead028762b2912a3f389aa6e009abdc2c94149df6a7a2cabf2aebe5e68c6973fdbc593f90ae794441c805af0056caaaa6af1cc9ad001b2f6a7c1855c48fef31cb5c879459fbd58eb9da2b423c186d83ae15a5cca8a670a6a144ba1ef8b9b88e77374205dabe7d72980fa6c559fa3e7d0ce79e05f486d011b5e22e6256629ec7482eeea321c0abb8a7d9c07d61246d727e44c0656c3cfc3efe630c59cecacb35d8d641ef96c28e4b922269c499f937ae9474deb32682f539d475205", "6a52636a63", 0, -205822255, "4b4b7f527ca560ed5a6b84ffc20a1081ca92464508fbdacf84482470d1f55474"], + ["c650551502c7051fcaaf02f3ac7626d904cfc1b252cad89e889e6b5b9d909a5548a3c520ff0100000005ac656aac6affffffff8c47ae4e5d8a0cfc61b6760068819b4d88dc1efe652892ebc22bfee176385d920000000002ac51ffffffff02789a8004000000000951516a0065acac65002f78bc0200000000000000000003000000000000000038cdb604000000003215197cbcfdac51c19c34233c13d4146c7614d8171f89242ac6d3837259cef8a51702d2ac94d710041ce4ef708bbc6e69d4abbadb86177d0cd7deee453ea180a886ef8226c567857e3df39c1a4a450a7c013bc65f6470d9f63fadc37525971e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008cd0a87f1347dc0435d0e8d9980f47c393288af90a5b223aba20ffa365a3261facfa1177c257de4b87497cb0a470f4ca2f3c26f745089faf4a8691bef1a9b1a496eceb55c7ebd90a00e52e6e60e1a27032096905c5b30e9ea2ae64a974e224cab9ccf5bea864859f44ac02a0fa50972205b066f060fe88c0d470cbaab02b7e60217a3dcccfa146a662fa6bd9fb2af2793623622b8e77bd3fc1a0edcef69d1edcc030f02cf4485331a060d18976588d50ba4dff00766ee2ada2972ab207d39a7e21f0a06021fe2d9824aacd242b3f40f18fc147176359a469959914178d7129d48e11095b3b9e6fdae00f313fd6e57f88c342116b591653f4d7d073825f17bec6610cf0318171e90b35fe28d0bc4afcd903173597131737f012a4be141d6e2072a34f575022891387a720842c4b65e1f1d33b0ddec7b4da85da8124339a9c092b128b36ca302054ce71adc25ed87a5676ebf5add78ff725188706d99606bf9b66ed64c6c1d2302100d2bbb2b388750afa5cfe1a25e80d0dde36c79348cbd51f6a79b8208ec4f0f0322ff92f257398d6996649d2af60540f8f6ab2353c9b654dfad3661b5d6ac0072bcdee4443f751fd96909a073840c0745685b93c648354173367ca1b29b2c914a9159b8765757e0aac0583578db551626784a2106ba4d022338bf90a542ee220997b85d0a1292bbfd2accbb15a15da15adf7cac4a3ec8c28080a5b95f9806f51c5009ebe175e57aaae6e5fab94efd1eb13b8f4c347fcdb3d9dad737e063e74b113f27de08f932affe5398947da3ec2e1fec3e968949b61062aec6fa32802481f079b4851d885a7f5d91c3cc4b776b5f338413de759d7682b78adc17e27fe32a9e4d65c629980930fafbdff55a6f3b23ef6b2ba385bccc3f314ff130d2440e5254a7b8eed7ef0b407c96d7842bfb1669118046a4e8834fcba7a072e1dcf818442b1bc43563145bbc42ed798c3748465c4809b7675af9b362e14611b21443ec837ecc450068f33f430daa5863c6d7ac4bdc8510c5137061345d19899758201cb9f9f80fc5aad04a03080076df7128df955451de118baadee58e05b8c5a057ec2df6c53289031fff6b313ac057aef545c875896ae34851bb62d359fae7ef2ba893723f84ab2a0537cbab1d80d00b73561cb2aced4dbf24f7cf1f58470008b7df998fed994503e647f5fe986fb7fe90c66d9e3a9e0a844b1a7597001a6187184b0f162d3a153535506945dc2f04ed27549f4226dd63b822f9e17bd759493b4f05a8a662f5571343eacd4a3a73b05694b1549b25ab5b6680ea29d1ba0eeec0401c5ca501d86cc6ef6876ef3280b93a74d6798371459e9ffe40dade58803b2be846b3ba2d4b240c0ba9be02b20e894a51f3c7b0b41624d52b72c8f41befe09097dd8c848c5d3b576d387d301600162445c5a1a64fadcb41618722e63bdc65911f231806400cbfa7d6b264d1ef2595be87461d0abfdb0885fa3b7cc1b5ae6d15797cca93f326c1900d39ee6f1dd84546a5c9797e5481ef8852367d2bcbbc9a0986868e5949f5c9a73a834e5776f7e0d40beeb34f522a60c1ec451ae7ef41f0eaf58aabcdef99e1f80695ff7f29162f3ac98620989ff50e2a5a0d0bf39da142d67c2b99a99ac14b72962b588be3dd9b6dc77b741adcec2f1f0531370b3cf8c0d63cb52079b1e388f130aa5aedc6875b66e74159fdaeae4b04f951bbfb5cbe7aa4dc0958a500f53a16eb5fae18dfcf863252909c676764664236d24b0973f685631423156f5e8efa91f195aa5ff8806f75cece30a6617ac64f5a9c498e153f132dac4e51a0f39846320d384387b0b12d0b0f61a227e866d4ed1f923f67c199ae3029e435a977951b8119f92e1112cbd3e99680074baa4b1b4185312d2577ac419b3099daa57afdd79318b67aaa56b536a58e931652132e67beac9affb181521127a98f5c1945ba6898f360032600d48aa6242099771eb2da3d2f62b880b4149461b03ff05c6b03dfcc9db107521456d950b03c1b64672e344c4ea10a1196833499f3ef47e6b06fa741e8eb13f42201933c58f7592ce8cfd9d64adbf9eba6556e6a9f3ea403bc10b62e2be1394d33e03802cfd6c270eceb965657caad70e4e6e2e9ec8771ff435b318b8055f9d06137a74f766bbc63ea2cb088d7ab989e1713aa9a66e83778472e58eea34e3e99b1b24d98db3ed7a9ab29601086e4f16a3c639b4af895dd82e05efadb7bff12fb8eac01fc0c95619db5a131cc98c2e5dcea76351cab3eacba090232933e0ebc6eed9687ecf76d989ebbe8a07ab9000000000000000000000000006dc73baed8d4e7dc8d7aef0a0f9978b0cf25cca0b3687bda6ddb215df6b7a4c06de031b14ba69d4d5429e9f6057a75977e0de809b9186aef0257473f9e84ef6a872f5a70796fca852edd4ec3212790ced4c65f2a27a4b19dcc7a932bf9976916000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009dcd9eaa13f93fb6738f7d375f9160bd5dced36c2c7cefcc9fa69bffb5ac2c79f755cef1bfcb7e7612fcfe5a37520786f9b799c0b0e65cdcef8e39d9fd8968d8a48440c2200da57fa5609101b560a66d8c8f3f7c2365066d281f2c75ba76ce68ef7a452febaa82d8f970044b6257c8ff04e1127ed88ba8802e029e1f31eb0c75021b9655c014db6bbe5b83ec30d7cd2833c035259505223ca3f0b00422f3bba0b6021eb60016928fa231531750fa9a3ac24e8393d02177966eb0f1810ff3c8eb3f990a04fad893de506d9c9a0f2fea29ecb9538a93f793a4724099f5330db1479456c16f05d91f4579253da209805985de4f36f922421f710bdd27aabcd6405d66c50802198d3a9584d7003f0203d1c0f7f6dda54a8544f176bfcdbfc75da76e9a0b945c0316e6022dbfea38021349c8d75366677f3c85453d418ca5ad708924e41a4cdda3021d4354bc78b6a41a7f0daa90e69d4cea54cf68bf3d3eb94b9611fcd57eef4909032343763699317feba8638d8aef5f9e86a16be9f1c84e9d0d346fbea4bf7d989302245b2496aa953c9434fd0581d8bb0ae43253d3c896c5dee82e2385e34842f1874e946635095cebd60812f0c456f57709ac13a06d72829274db5b62a00e8add75c5c7a5c98af0683cbfdbace18148d6b40767bb2f2f05980aeaf6d1443208ca6cf7f168643d7dc54aee24a6d184bcaec255023cee831e5e9a4b885667462cb101972b439059937916059f023e15c825c4fff1d40b34dc8ef3bdeafb03e9deccbf331ab4e11f4b055806db5b50bbccbfe2a2699725e40d2306f7a0723a37b3588ea04c4b3b22b0cc903b09b1bea0b8b80d5e6686cd4ceec327e26387e675fe0970a73efa6862d250ad0766634f92ba72b387348cfbfde766e95c29f2570ecf9f175f094355d63a4a55439b7393248d42bafdcc980a977aad4425d8068c1bdfb03dd56e19a2a7abdba30f58f22c40009c7d5d78b7deb42099b9c3eed798472051d7717c370229b189b0967e679e2def1bdec47748694bf67268298f736ebcdbc40fbe80954e08c062d92887a0932bc2254db758411e90fe49d608bce68ce033b06cd0c2ddec7c5de3e5b5a03b12765d7e59fa1bc996262899f8695a21c9161d25d711dbe4f20405141f0d5e3827ed64eeead2772969e52fc6ce3128624c6f51d61f806f3f2a2fa5a7d4bab003afa5076a29b304c245ec5a24dd4fc006604c05b5a2fbd26166a3b5b6f7caf900230b04e685c373854783ad43ed2e366160272496850bf3298c76bebaa5b9ac7d589a9c094b3bfa23cc232e3b2660bf53abe8fc6de4e2868a04070f876d5df4a07e70fdd04994c0f032cc09cddadbccb0171cf56e96606248fc48cbd1f7c4784e5e3550e92f74742a82541e261aac659c2f1439694b9f37b378b93b42167dce9f8fc6607c53d2135b9eba373f948f3c7cc53a6cf2fffe9f9e502ce0159de3533cdd2fdb849cbcf2d40d94139a761e7dea737c66023882bc362bdff7c046cdc914a6570f0fec6d6e541f8b98e92ae769d29c56c8279be2892f831c1d7b28a1caad48e6c1f062cd30d5e83c5b138b0a6a69c9a7f15e12ee889d0f6e675af86ce96fc837d64b1953f24220da6ce8d3a7d27ea92f432f299ba5223b805b6f5c0895d094ca7f173d30677794cc16af73fedfa849bad11ddacc14305ea7ad509429b7c35410ff6a3cc31ec2a6dc6122233e35b4189a7579a122e01b1da2d85dd81e7c36b9940d43cb497cc1752db61987cfe23b88f172339d451b7fef19e4ea953fe8d61935be7bf2322c934f31e95e89ecb7542e3bc926ec5ad33c2fa0666d79a973185bcc836515732eb6feb3a35def9f61956bd7d0a5b782783a72fd8f443cf7e74d2d1ec575dc13d870b1e92980f3878911c8a070392af1865cbb9afc5a5ab8ab9f3b068c6affd272094ab7934849184fbf7adf4d53c95c41cccef5085ae63b00c171fa92831a564a3729eb9a9bfefb07557d8c7cd6780fe46d9f9690b3a5bc19906c9688bfae51aa922510fe481e28c2ee475decdc1944c5e463c84fc025f6f7be88b429367362ac49f88fbf5f47a582d0b827f4046cd159d320c653b0ee198ef4ed91f576bd151223af27ef0764a9c754d913493e6e30333586c429e67a7cccd60c8eb96ab9bf6f1a6e9bbb96824f344a18f4c6cc9b0050b63d07fb8fc304f67da80616d9393a919def4ee8f3f8a1d019a83f084b3270c1de1f11650b80c8594ac484b3635c07655e5a7cd22ec201c217fdeb17d1374c78aabadaaca98f7fa22c634eaa1888f1270000000000000000ea0c8d0100000000ce6957e7a5f84eefe43642f745cd0f4fc497954f2534045802394dc170e1768b964ba43f6441c2af5e0b96d765644c5fd77225ba65e8ad45f1650faa4e3d28ba60c89a0afb7cae0cb4d1e178322ad236c9e91354fbadca9f7aca16870ee65cba00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7b32dbb653744596997a28493a54a176b4177e0b8ea35f3beada9fe43255d83724f4e54938c2ed156a4fc93d5ae50e27d5c841165004d74d064a745ca3bf389b6ae90ac71b79ee7ba2019e27cef15f1214b5f16107f001973aea2456786ef0dadc868a8838e84753c518219764b44c86925ce591a335cca755f82c363b1a139022120f04c6985d5954cf3b3fa437fd8be383fb0f6346f405d8e0f977d8443803e0219fb94a292081a5d67d737eb4655c9de99ed69b69d832d462b547aa0b5f52bd10a0613a510104ed4d1b393192e95d58024cef7ca72263eb8d7669ac73b36441f44a029ba7a8af89bdfa237da37ebd64865540eabdbe34e9bb9102f632b6061937b0328e4d502863e13f2bdd3b8f0d08fc36032f821ae746a877e2911ec6ef8aef4bb0222baf7494f609a57c3f07313c4aa7724844bebf1075d5cd3864b612381c89d35022d5509171900a0aba869ccd21b6f5600ee67bda696f2eefa71a2aa5240e62681020dd488c8754a8ad6dedddeae80b9d9ad6b1b517939850e86e674c5b040955b5e030ba7f0089e1973032f409018cc82613a2ae4e6490570a0f8df01feeadfbd6cf0f67c554f5c06bb8adfddb1564f670b78109af7eccac65e4750484914f391eab5fbc5bfb607078dfbcc69eee4f545069e7199fe4baccc8bd66325cf4b978360e5919133fb0c2f8de6f46d31c4a50b0f7b983a275e378acbcdee2f7b538a25247c80da86f1c706789b2efda7967c8d9049ee08e30ff83e3a97c469a753d36095c40c2d4f949ff1a7a4c67b0b7359d4e87f562c002a12bbad84d27b7e0469e31cc731c2795b1f2c5049c83142b0b06fe14698c9f408aeb9fa0baa959b0ed8dc3b46c8809cea23fd23efe49738d39245960868982e7838f20d58f68232e6f3aed511fc1b7a23ee7440d8b2e781dbaaf567269ffb7314e024be81d6021eaf3078fab29edcccf4f06b71f6bf7bf5f577ccaec9baf8379dc38c3ec0c4cad534e0cf73f23832367447e5e71623f9beb578f4844a11abe8e07cef9ac04e05ecf3ca13f07ebdb0eb475700fc599ed6631b15a17f92068cf05f1edd12c0d9a251b11f69c4c939faafd7592f9825b62b3185fb5313ba97fb94c83c0bc3c94ad473bd95ee7fec2a9c19e73e4d23a74e61222ee871e273fcaf14e8b47c86413bfba2eaca7d6fcef920b9fbc2ba04ff3f176e6d4e5f2fb22ba2241666ea82a1321d020a778faecef425789c7f9e020f7d2c1adb565f9ff3671cf0bd9f265d0023a5c9ed9e392f1aaa8f43510b73995f35cffe0ef84d45b2ccd1c6a3afefa20e27381563da2ecff2347dd4cad349b45bebcac5cc654f6eb454e98a09ac546e1de37eced533ddd347597bbdbc23cdc9fa6a6f321c3d1f9c04d21575d3f2518d4032f9c320161cd2f248843a5673007215238b7a3dbe9269e4dccbae9508ea12ec876d88e8994d9e192ba9de155bd5874d444326d0346dca66e0a8c81f744b065aad51a6fcfb6eab239482f65cc0320617f251154d1d3fd7ad0ad41fe81328fe77827d4ae89cd6663f75ce4c3e47d9878d07c28c620e6ac73d689723731a1e61512db67e7f2bac86c0a8ab38c5e95a26f26f82b81c8c1ab63187605e6cf81382b36f5eb934640c7e8e9de84762c23b097c4a0aa72ffd9a7dd148d80ef64bd54be4cd0eae4e3e5935d402187749c2554763c877a14ec0cba7d862e8558973effab536eb24700670d6915ab0564c1741b55601d6f0358d8788addbdd2c3e7d78e068f4805dd6ae238330abb5f2e39940d7241c2171d44d1a8438d053dbf9ceb9fc15d300f519137916d592490dcbd012e8a106a37d5033fdb16d105518045498a7a183221ea4f5273ac1d3816a001b690151ca6044fa0c01a9cc0f59483c6daa8baf56c7543ffdf9578347e69ce5c83049f66d5f82917d2a81553312ff7598e89ac13aa3a99784df6026a42843ae55ebdb65e1907227ac78de653d55a6d73297ad5cdf41052eb60ccdb5e0982762377d6bd0e59e82d02fc0a91f81787852d769bc98f21e8a758af1a6f0fcd2b9e03c9d16d1c20ef840ece264f6de4c2e5f04ba9335569c37f7a8680ebd567541446b7e0b8aceeb1379cf81f7bb32b3437f10748409e98f9169b5ec9701470056356177ae61f2a03f57cbc6abddea867f19a8cf5a41bc9364ccdd1ca27d42bc9b649a9e36f02884d6aa568694948f9e3bb4a7805f179e92cebc7d9e338c00276df9344401222d28ab8b39f323f3de67147d0295d5245643e118482c5f6bc2e5a44a4d85461812824d91151d2153da930b3352f385e9c058dfce901234fde754ee1662feb898d92d65d433ef1b7449bc662ff8a3a6d0e450ec059b0c83410da0ea711d0fb711f6261e4e661fbacd944b1b7d638e6d93892029fcc02e858d9f631a73d8a1d94b20a0cb86aa06037fb506", "6a0063516351655363", 1, 1180418245, "f03921ccc7a7e1130f0e2aae5d30a1b13c111189d18a62c41b44d06b7d0ae18f"], + ["030000807082c40304ebf6d9db6f243fad36e10b4305218130924caea7b700ac9612018c584c45e01501000000025200ffffffff9b5e9e872dc20f4431b48839fc09f5cd5e5fcc121ff2fe8fc9caa8a7122afa6b01000000076a5251ac525365af133cf1f7775903f1d7cc2f623a4b2f3d0006b2d4fdc24b589be451b27282efea4e3d310000000006526a515300ac5ee2157fb712660dde7ed8ee3062e45da0e459610b128193eaaa1472e795cf06bb99653f000000000452515363d45a23b0016d62880000000000096552ac00005100536a000000000000000000", "526500", 1, 1921883673, "cfda708c932c5b41f689fa6ee2d3e596566a0836b28ac26fbcf23921e4103205"], + ["1c1c3260013ffa0fcdaa45a93546500ad51e736600f43a8fbe63b8d709b522b12dc7c83036000000000153ffffffff04c5bbc6020000000001ac7f935f0400000000006009e40200000000085200000053526a513524fd010000000006510051006352a69d012402000000000000000070fade000000000062589c979802f477868ee1485ed2b87942fcab360fa21512fecd3f2b5f2b3ce11f3c3d99ed8b806071d3e4af2bc3747227be6e5a0da85b72768c158bf7ce6fcaa7d52e2b99f25c2417dce28341377a877c421486ab44a28baac74825b0c8873c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096b3a6021f8dee84fb4f71e47118e2c5964f89680b831594c635614cea64c617c3131090ee2d9a1d7c988b2fef02000dc4f912cb746b7c300459d77ad8bc482f80d918596b5c8902e16ad8126366f714b99435ab04b2bf70042c738ecffafbd502a9f4c9021fe68c6e7a56012fc10ec8f22bb27234db6dc2f770c3875d476d3020e435c08740a42f88ee04c6ce89dfc4dcbd531352c7a819ea20c5799314f5fdb030f852dee64a1adc1d5643161004fb726e7569b1a22498435a1ab7c2e7f5e32b10a06ce04cb46c0487a8c798215dcd49d4b15b95ac0baa5406fff3861f2da8690b5a9cfcbdae9c1b63fa3593d8ead2cdd838e0c658e53e1744eb4def0e54c25648403297427839dfa7f8c78704168255c918c999037cfbc2536c820985ca4bf62bc9a022caea72e2e763b99f65a1e656db3806014e297e7d5ed7d21af5e0e1c2f69f922021a4177f880c10b901b3c3777360f3a795fda6a38f9a1d390fc60bf7b61f56dc6022cf95040db972141d6113f9826668c28eb2e50ef54c2ce518714b89ca1f782d102149d96b80b53ff1af17225081275581b3d1c5b9e60f7c7cd00b1297477d4989149ca362d0d150cfabc617853cfa20db602eda56d8dd1b60e736320a947ba1cdc5d195df1b302b95c52697bacd2ee491135d90f3342afb4b341e976cc212287d64c1a79360904a273c640eb9dd4dfb260a0915fb68e5b6e1c8774960c5bf3bc98dd66fe2978f41d3defbfdb2168f107068bde59f406a2dd53d3c0e67f59776a9e0257e1bcfdc3bc293de5cbdc2ba288019954cede56a84ce81147459dca6ac0d87d0c829c174392064dff496a2000f536b0370857a2c64d00e6bf402c0ed3606398178bbd3e817b932304214c189c4a58612c9557f18b6ce992dc2933e3850913e78332008bd73e93a876382d0c268dc41c398813f1ad9b22c7bf094dded1d23823402413d445599eec3e5d3199775ac7ca87c3a5cace79b19baa482c7339c070e27bf2c8c1474fc89bb00287b0d519c7f9e944eb8ffcd954b0e9e6e65bb9f66f9a36471fe52c574c9e27f1573db8a370a8b9733783e01bcd075da97b1e84441dcc60457c294b60363a1bffacf07bb382d54ecbc928e637095031b20daa4ca9f053221c9f741284c302a1ced8c6af5f26a84c3468a55b660dadbb7d2baa595a465f312327dd4d48bdf49fe1d215fa6a702014b3e50c1eed81ea44154470fd0e2af0dfee85a95263dd2865f8909de3f1c15bea061a6acb2fcbaedb47fc76b2da7192937eacfe0a595ef5b9ad25d81310966b7c902ae3e20b93e0cc9f58cb8aaa872dacf5af10ec81215a3980db8b36f2dc246abbc75f77ebf082ffc7974c4188ea114de40547c944c3db65c614ccf2b929ef441927938716ee50df4dd5d067591f73a3febdf212aca754c51ab9b62a01fec2e7a0f6e9118e8b65620b01d4395388d061c3ffd9f3763ed0839ef6aa69105b2e231bfbfbcf2467ec9e560289eebdfa793b8b85ca2501f8a210d40aff7e2e8642da2c6923a1dfcfcecdcaa002eedebadbb4a76decbdbfa130014660ce6f01c1ceb06b22d9d7b61f4172cfe090f18fbecbc5eea9da914e69282a773f1143e30c3837476bf5fabb337823257c1ac894b4d66791a79ac8959348784b83bc843627bf12a9d93dd14d6dfdc09537071d615862c25d20d8ff2175cacbca8d8eab9ed5ce7ace0ad65092193520fd8a56df2ffb32d7f12be35d762d99469b4aa7858a3c7e9d7e2768b2835cf30fa5c3597046c46f9328c123c77184e34a476149fab1dc820a45923d01da5a85d0ed8ac37b19d549a47f2691d473f0c5fc76c0aaea1ab9e2b9800c8f56bd232230e509fa9db6b8bcfeffb47f99c0aec6a97170e23ee1c45d1dce8dbe31ceff4d595bab7e4feee4d6dcbc644a4cf4e1b15987ff537f038e833f600cfb88306fdf6a5a7281507e6b2f10213cd47851037bc76d1e90756980570e5e87f3bc1852af59869429f57eea114b17c40fbac672dde923b40843de7cb25a8ece6339d8992c214181ff00010f67a4143c3bb8b7c5d8f0ee057f2a2c7150acce200daed33baaea6b4fbdee7fc5cee7edb0e7c59148635866e5d98adb6db9e79ce84ed76d15310dc77c7c040d1013b043a8afaf1f32d1fb03fdc3d20fe5c9ff9afab5e1c40d978f3fcd8bc267031ada8364476a41ef728b77ae606734d0c4adf7938a84abcc0d889a2a430bf0596e2a2adde6b98efe1f90fdc2e211f756636e516f1a134bc5b68fdfd80b23634d324e7cdb7eec43539a89770df192d2c13eed00000000000000006fa4f00100000000a9ee3bae06131ca9b9ef1257ac94710a769d9328c7301135a0f9b2be6212f52c13e93b2310777f9a6a95e32eaffd664cc5ff4554ffa36761dbceb316f707c9703ca510559ad1ed07a218f566c7f6541924ccbed45d3fb0471d92b57c7759fd3b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046f2592545edc12c0b71a13abe49a04a9b84efadad7d4e980852c35d2673ff3d2de2379576780ecc8dab429cb686a93931ac90bbde81667cd940390c91039139fc5cb19f888dacf5460aa1a35447af3c83db3519b268f76dd5f1220e5d71ef39c40906a072f6b75b3f09ec2a187c178ccd736b4c741b83a8a826f7ca6c383369021183c516198abd5a7f453b0a66e07cce45a040d9af997135534f2428fa1f7836021f3ae61af2d8d9178015ac6f11d18cae54b0b05f0a12948695c9e861ec2c86810a06b27f456b294328e109569c0984d2ce2ba25837081a006317b9945b347174fbc2a7ca2a0ecb9da15b8b5a65a893a5113e406a04f32dcf0e78013519e72bf9140315be992b6a993146c6b09d8e2acaaa0c9a204701d6af11dc07bed6b3f17712eb020f98228d17b7c0f87de50a84d39e8b154625b5abbb5128adaecbc268c57877d40323ddb0c4c0f22cf27f38bda7301e0303dc0793e00d92de429249ed092136add5020e641e266229b08a3ee24e41867d60ad0e6cbb203a273c9378b3ab9b5b3a4e0e0228350fc3f29f79a5aad2b0595f6e4afa5943a07724404cbeb8c676d9f677c2e4e595cc6584565ef9536f26a36b441f993b918fccc59dd94cdca15763264ef9d963666b025fa514938a872bc24af89dca69fe440fdd9b2582dcd6f52baf856b51652312905136dd308ec40521d062d9fb973ae6be4bc48894721ede4025f9936dbd7a48a2c2edbd322e8b96a578025cfa15e0027db1a80a45f65dd119dfe8e291c9be89cad2458cea8ee1a1b0777bbde20dfdfc1274d0780603ee19932d8c52b9fd9224c04fff5054d3aeb8a92f1e5aa22f2bca2b85b64b90f54224a946264753becf7caa56482ee8f667970956ab004338b0363853ed38baced4b4b1f4eaf31597def26d58950f5fffed2c64bf52de15c2b333693988b54733591028dfda81e884fae1219e004a82ddcf01f826f33b3747d5b0ea634bd715d825f72c9add4af3466ddbd05074883baa220c71dcc2b6495f0cfc592f0ff7a0a22b594c51a0a8050dd9af79aefb5f7345b4727dc5b588f7cb9393e8e349c542e2bfda4e92c5c3564626f13be8cc501e07a2c058706006c5d0adcacb818b97722c3c68c4cd81080fac3707cab26b6ba06e4bcb35eb00a6e1b9e378d9ef97a54a269c3befff2f5b874820e31bfe38e74f20f412f734d70719f3c300a1f619c49112e8d0279aaf715567bc1375ce08417aa3fddf350a99437f1aa58ab9231cf00c10b91ce041e416131e00a07c7b02f803b268354cf08e6de4e3c5da20e4045c44a6f1f7f73f4b504ca16de43c989941e33ecf0c6de04126bb7fb1041659d48207cafb35fd558fe1a725fc3e6bd1109e9128bd5ef5586d7c0b470a5d3cdc72b4ad94af2c0f68e92e09639e5ec4f585153a391ef8b84c1079e4a9f832a3c7e29a39f70c0505bd1d707348ae5e1c64cfebd0ab6b2155c48a1270734feb337b282468b1184f2c85fb9649eef4f1fc630c9cf1d7095bdf16801fbb191b2be9d157ac5955287068d56a724e81772d5e663d055a6ae9189f9c8900b9e6fe30a340c4a51649e7eae48967f2105949305128148f668e6b177ddd90017318f1e555367041868a4f5337df911d20b2d266e791ef996cbbeebd10db3146255e041e253f0529d341a811f85facc110b8e0169aec2384d63a4554f9fb3b54461f9042277123d5b10b43786b6c494f3d0d06c3e1218a01586d6f88a72e27a33bfb25b406f44a35418e354c2b4820e6dfc575bb83476d8c61a366741521559ef7c7f8753ed615e39ae071433749aca4d6d9ac34e71449c19af5b66473a41b2fc817c9f1aac695b6ded909be4f8e5667a9b305febe92fb6b855722c81848ff20f2da0f9e2848be248db39d719da4ba521760b8358af9a612da7321d7418833d4d8d81e2e969aaa69f62325f56c95654ea06833448347e88c906a6ba86556e86702eee785fad7e6586d1f7aeb3957e24a10dfd89ead3993bb026e96c7f10a6d1c1b0f5327875862173999ff2c83e8a6c5186c56c045720e391c7ec58c3ae854f63d9f61820c74da24453a99e8e8bcf4278e987bc0df43f7a3a8cf03304e361e6c5a1aaef1b4a7da7ba7c09805c189780a0e762b284e16bd4fe9370df7d206f43fdfb13ea5ba4034d4509cef93687a1c52f6ecb33c017a4ae636ae722ed294d9c680cd5cb7007018e0e6a9bfb2bfd48ddb19157828cc1a0307ccb98e6aee43ee514c8a954994bb555df70abf9d508222d58ac1830a09f0e9fd2d5d117c7d66f76d749647e30f90eef297ebf6ce3caf5b949b34350dfeed276be8951d9faab178ed77cd02d415a73a23b70723ff9dc047e4c6ee74c2e2b6d6a293068bcc1bc2b61f42b3928d68f8e90a40a7ee2777253cd5221cf0451a06b16afe3440a0ad5a325ca89806", "52", 0, 1611755130, "28d0f940a350016aa13537993ee9f558f1cf824e6398ecdeeb10cf63638aab0e"], + ["030000807082c40302df1bd6a2b5cd73feeac762525a8168134a9ec09cd55113a2fc91df7bec97b8df01000000095365ac005265526a52ffffffffa976a0e2670e111bd454b3f8c0ea6bc16bb25534f5463d1fb1401f6a14420a91010000000700525363525352ffffffff04274297050000000003655265742a7d05000000000351005256447c0500000000025265f5b791000000000007ac51536353006a000000000000000000", "ac6352520052", 0, 210685970, "1d2e05c1d4e37359583954bc49ced3c28af363c2f3e03f594b4598ba26410536"], + ["a012753a03878bc70d4bb6ce9dfe179c65da8d58fa84922f52732537e756f7c21a0a2983f1000000000265533c391f50b6bd172205ed743d62ea831e576b8df1c8a575e2386cfc64662a07e49362ce10000000000153f52a888d923116fba6ba622b0a4b753f5f18884ef1dad0b509d4987b49e421563334c08d010000000015a9047702cc3d31000000000005ac52005351641fe50300000000000000000000", "63ac5265526552", 1, -1494471707, "19e4555837dd74e837599e382a3054cbe18adcf5e6b122e708d3366472b20221"], + ["030000807082c40301a5f8705d674dc7c279bc397af76a32168c2bc39f66a2af3669189142bed296980200000005ac525265510167a9780396d28302000000000852526a630053656a9ab5a30200000000016a61c80b040000000005ac65ac63ac590dd7a05c5d49d302e3450503000000000000000000000000aeb019e375f76e5ba2f045051c524dac476b03142292c5989024b8de21225948da385a1cdf8681c13aaacff5d99ecf63f3d2e47977cf3aca3d5b1e0a10731b4aa280a9864bb9810f29fb39419629502ae64f00c7a0e22c4b8b2b89a7b5d3c38700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ca11b4772bc953731f4609c2509905d4fd44c11e52360f7ed0c4e3a410dae349253a37de723bf98f3e37e69ef44c5bdfa9e9f768095d0bd808aa99c303b59282a882e38e0c56efededd9abccf27dc4ddb648102e74e8b4fa9bb4eb05973e8adcf252001afc463d33f54442f39a4c4465e1a11c437de1431f8711a1eb9bed0e27021e5d748e9a9ade7ca4a94a8707f6275fa771ea7c57989d0287f0d439704b137a020d390ed16b152354e69fd9c25e43e79f90150006ef9195c476b5da6cca78867d0a01c8d54286326a9020b44c515a9ee629516dd6600636dc57963e69d883c38e4c32efaaeb57db1f8615b933b0e1310843c3e8a12e8a10907a0021d0af44fd760a0228c16a305398f0b238ebf1a5625049df514d8075bf38458dba0b33d7104f8946030fcee73b79132913e2ad699e6ea0590f3c983c87d6edd80ea31867600b751c2503072ed99ff6206e520603ade5a4fec517c2d1abba2eb4a9094c47dddb8532ccd70220a9130fc245bd9151484bbd385f21bcfb28a68088d18321b9fe6ed96b8a7d2803122dee96efe946aad2f6d56e029f74c9eb8ed1d6f2ffa86cfa5cb00e426baaee1b5aac82e1db2cfe148144e628282ca1f6a8f7ec81a34f08c45466c63bcd3054e41f678d74c4fb326b0e203403c6ee1fabe188ef107dd5b3ba14f2679b30851ca21e653782695a686587bf5efd69c4eb83d99fc35091e0b11fcf315597d5b9bc2ea231ab4227cf670a4a060415eb9c912b6fce000a7568551b80dc2a9fb85241dc07293d3d8e52eb66357f6048756d2b68a8155798154412c0c3c0011a1b7d11bdfd53436c77fd1c8a0b8350c6f8ead59766303d27ea7ca6d2879c7809c7b2cae51c3aa21f31518690e713073e5b6b4c5ab9560094ed61d5f9feeebeb807bfb2c200f0b649104e7372b35db0a55dfd869316407f7596bf8b616c57130b290298362b0780f33d6d1ada9d61ffa009c25e1a601d260b2ed5b6b5e4ee9c42afe570b076a88592ac1d35f83cea0f6f40c123d6ead7dbc707e52407a2d78e8b9a65a1d040e13616a496b8540dfb04f0f7ce0c50456493c0beb1bdec84358aaa9dd5bdb2f1811fc61097233bfe37de73fc0e93031681b0a3a89488408ed18694af112717f95f87ab9b3f7ca97f4f37b5ec84522d7428e23bbf6e710204fc047d153b1a3ca5360585b0d675c7fcb565844d10006e9b81a5c2cff61364873e4def87ee32e104dd0b0d565c5847554af5ef20169543fcb6d90b1a93eed0de470c92991be9d64b3327549852d633525f6b502563e1084767567743933a1178c2814b50d0a28a810db38ea27cd508d0af807a23d2747aa455f9a509709598cd4856f9d99748196d8b0d0de56d7bc77509c8d05c60813c12a8ff8ee1ba1821e9c9929c817ff53f143447fdf229fca3d75ca5e8305c533481621cdcaa22981503f2aa361983bebd5a8f5c1588445dd4d89de6c02df9d60c14467e0e3dde32b379785a021d4d30330f6579aaf9ac52536f116e4a420d6b719483964ce391279a5d017a260ded55297573a24333094488db355319d67cd71877609d672a3a499409597a91e1f430068654ee1eec10016576337ecc0c97cc974690a562a42c9ff5489e90e52abdbc84d9e4e6f863012cdeb832c541b0354f8d00080463168e62797f11acb7826bbde3d9ef700159bccdf223333f3912729ac3dceda820522d8caebfdb8b816db999d5353d00ef4760b6cc7da2a3c7e02d7a405a6bf460368919d19cf03231a959e74454fc843e4983d725efd84eb6c5f056cd88c6f1133699ebf2f94a09ce04c080a3bd7de77df37836743437273bf7449c71479376c809fafe1cf9ef544d8598909f509758395f35a84c509a921bd7a062567bef86e72c95f3e732017ce0956536e78db09812c479c6f57cc3938b7af1afcc7326f8a70100854895bf5c29697ee14ad9b9bf62e19c4ba7add66202ea7a7552c2638ac297c5e6e2ad49e147332a6bbfb6a5b833bfd27627fc649d48a5ec71b7ffd59f06f0c11b33e3ded95597f7ba65ba5fc6ec289e00c109049b80212ee18ab5b8d1f7142914cb70ee95a3a84477e3d53f30196f06ca575352d2abea1aac1b6c01109dd5c6bca9608cc235508a64c3282eeab19a747ba1f30ce9c9013236b317987e15fd5a5a69ca7e33802dfb547ce1da5237d79e4dfee3a28ee955a17c7730cbac0bcdf0d97f88f77d2ce38ffe275a57afbacc698ae13c7d5419c28ec3520749ee325cc318eacf37374baf308e59be3780e8a098ab31e1e7abea006413030ffa92ee000000000000000000000000004e46706acf8063e88110f06f7693933c57fbf714ca84fab7dbe457a0942910160fff86f3b7e0b16e77dbd915f67f121422866480cf31c526de2f0e730af303d7cfc4e5a0b3bfcb93264f1ee3f8a56bcf5f2294b201c18cf9238c2e8bea6ff67a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0b8ee591a25aa2b8cf03d5e7c06e4cf5fb7f71131266aaa00c19b742513073d16295299dd425ee1c1b6992473e7ef29756c83ef5e8a454fe770181b5bc8c52de0d7f01a0b906ad874e445a0881c5558dd79440d3fba0ee6298c278bc46d892849aaa5cac0db38cd4335b62da6102d73fd1131949653b0ec0b07660f15f732540227d8f499a26c16cb368865d17f2add6c6ca180ef6d458a99643742e950f28153030b4055b9bff3d11f872727e4e0cb852ddee5425a9e602d835ef040707c9b701e0b01856d96ba79e6051282faa3c9cfcddf676496aa8e4a889906f480f316491a26669d8738e113616e9da8752fe6c1270769c72ae972a151a7fadcc8a8f350d58c020a982b095592707f751cbe41cac46bd7301610f7a67c908c764f358e660f18a8032805efcbe8dc8fb23de1d0fcc7ebeddfcffef6e0c8792f18df3d31f7124f4ffb03296736a76f627db27f51cbe605b58837ecfb847f3e77c6cc5734d02488bb93c6022fa18b6d66184d97163fa9af8db12d842555a7998841ab27cfce07d0b6e24581031d16e0fb2e90dfb59e705fddadbc565026f08be1d1e3ae5a731a6019f8b42d689d58cea6ac4cb47891d90e55a64c309006881d6c52a5fef2ab58898e0eac5202208923c2750a8f48e1873d5c5b6e8aa547fa91a490687f32fd91d6b6605dc6c44638c5a5cb855cd554eec3461bc6efeb68e6fa8e1e8ac5fc6d6dfc6a64b09bd80c72c9c76e2033c9209b15baa9da7c6453ea3da70dab52b971aa64fa940ec5cad5f12c0d3df2212bad2a53f0a372c43262e8d04de1ab6105a54b04be96012f1dbe2c58451c452f6254806bf1ddac0fab793e5e5846eee03b491579d529993ca0fb396c67cc31937ff537d21f8bbf50bb9b1039b2f859a450edf4ffc5b79e5603541f3d617a178488bc34f05a529475c4636292bc94d58c6255ef5d36a77e2ea11e63009347924c6ee68f936b1ba62f54f02e9c702af8c2da7846d93be3321acc46219e52efab6be55c215f1a6fb1ab9f95186e19cd2743b7caf83884528ca3e7d41095414ed7bbbcd9f614663a15f0994002e92389c266a36731130b22a5646a75a14a41d8826f9e122f5c98d77059f79391f0cab441c2ca08f803cb3ec53889392e6476b64383289b55317916345b9c2d59c1d79ec7cf6cb654c04abdd2d66edef4613fcb85894484d7e7e708c05a9482af8a7c19f815128306a95e3f5045df1d94a742355ebdf7373d388bd92f54b315c0ce062f60ba782f5b2eab3e34bf4a77aa19fd3709193cb0ccd66049a3676c7980c48047ae21a55394e099a8ad8cae3357c3d31c485400f200e076a9dd0ce1e3f1d06fbf4be4076de8a290911a01d0e45a3b37e2cfcf806090b20212413caec803df6bf0fbc45aec1ea06219d36c9f03da104aadee310df7e328f06ff05a90f691f64c98d9b90d62a1830f5fb581123e6d9adf186082487d2af0016a8e97bb0288a67e56ab032b066a7879c84f1dd8beec6faeb9067e8a65735ec9da0144e5cdb9d8cdb6f2760995c26d4e59aef51fb730a53e955823e2cf403d1ad0f0c20c83a8ead05cd1c56c544528b550a6883d17ecb24dae565d0b66d62c2be5b1e90ff172e21091c3bee7175c573f250d77297c1faacd5f6ddb03290ff1bf2cfd2016266437a0f7d66906e61192a83861b691d04fd6be2751b22fd49a8b59a356cce7ed9f1b1edb1e16f54b38850d07909914f21951e26670bb3e05a4e3f0f98ce062d4a1d934614ae56c11fb29116949cd9f94ce87a838d5bc80e025884161c2b4e1a1c47146a2e31b44289272abdeb9bf2ec1d9a89aa0fd536f45c0f975d9a549e93488f8f2f5d4ed4355cddf96b1cfe22e63f3506e5f3bb6a7e9c8e433ea28066ea214d9eb2fd9b7b0d0ba0445853cb6418945013ee9cb24e006920285924d25da842eb1d4312975cdb9c50637718c8e97b20eeb1f96213812f89503ec7928ebd98c46088936267158ba48179666337ccdc50758224d23d81ef575ddd0d40d1eb82b4ae6f80ec8a64cc1aa7fd2b79121f44d830d357705a1f2f241285266dcad7d8ab74feae6bb4bdc89dab65504e6addd980f2d282a99a40073c21cd7a508edb7c3919cfaa3c55fb90414a20ea748098ef1d5a10704dbcf7fb891ebf5aa5d0d8a7a39d8f03954b53c9b77a351e1951887d76f4c2cda3a7c0d2d7c63cd2d6804ef1dda158c80660dbf5006f0ec27e3dae59de9971213565b05ae7b5ac6a0783c9bdb0c9625e3cc5eac7d41364196f5ea0476bcfdc964f8550800e3a6fc3f39a971fb462a0b71912ba4fd527be4806aecf151ea4c19c1a50aa3aa4195d5486aced0b99a4e11028ed076baed47b7dde2245e5cce31064df32888d82b1def11b760a0791697a439c4f7bd49c8e8484e1ba7348070aa2ae1180a81434b6e20968e0b713a0c", "005165516a0052ac00", 0, 869088223, "152f785a22f84f52b5f8cff56a5358b1873fcb3b76a9142208452a276675e6e2"], + ["56bcbd3b02fd55f3f9d5b03b59345a04946f8659b895d712491a21d408d842ef58cb424b9b00000000076a65536553520075efa458766eaf9f8a4f895418de7b34129ae769eb60b4a80f3573bea043356b41e5a29e00000000046a656a6affffffff04ec6d170500000000045153acaccb9bc4010000000002ac52d7567d040000000003536552018a91050000000004526353535ce9cf4b0300000000000000009e855b010000000072bcb734a5d6737be7456ae96d4e2d39d41e452de84eb620a3e3dec041168a7ab43e8db5aecf962189732220a205d3e6042f7c8cec7cfd3e9e6e24e5de0fc07f5fdd5fced4a1590ad39c9bc922a58a9b0d53350ae7facbb2c021c8ec508508c80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072dc3af94c801849fbac88a40784786c9346f53f3a56b883f7f63ab5f14defbab796f49b819e1dfede3f6522395da7faeb4a1376bec0b553a3e6af577a93a429c649d201630b73918991f957479b14ea02f340fc772e5f56b090459258091a927c495d5e7e8e8c4dccbfb6c6f8d45a65015ad615074c7a17b6b19edc1ab9c343020436efbd66122499916c71835178ed6e1edda1ce27af2ca7d26268a893ca3772020873d3e542bb708064826626a2c5f1cedb60ed3994309ca91ba9b39020bb60cb0b052ddd7ed1e19c3588af7414865d587f580abc0f262860451c2c4611af101e9b38c03e7b3269e91c047d9558c8b54b653499e57c2282e6667abfd37935f5450f02097658c54b0ed1c68a42be0e1cb5644c9cc5471e2c3403d337a559bf87920e130225885f31192800d8dca8ae4fee811517211bf5e5f3060a4a24a0b0d871ab592b032fe6a274a6b75c1c92c17a5af438e9eecd961cfeebbf263e78180d1acda13e5a0302efe1eed6667e851e47cf5333db6f985ae336a8858500a5964678fad0f37f12031c6b95fa4b63946a95e8c59d640462fa7aef56ae5377eeb14ea50acc5ebff83f8b9211ead4ac37f9b444e1c3af44b15e13442f023c83ddd93846b4342191c9ec4a07dda4210d9f9638741d1c56bc09ca428eda00c16a10f780fecdce46211ee636503610a9ae9ab7c6cbe92f94ff5ee1cd1d776f63bfab4c3f3fd9c1d6656c0f263c4b87fcf4f4dc31d3f5b1eb945bed255807b79e90142e6bc801ad77015c06d223b2e58d08507b49e2fdd73c2255b3d2531eb97077428d4ffa9a7fbfe74dd5a3116467cc7e2f1cfb56105e1d68c3d4437fed227054ecfca54ecd9297fd20e7e79447da0f59d5c1f9782ddf8b83ab4b3d031d4f6603b0fc473082586bed769be12da30a1231c1311acab6f61c06ee6e8b3bbd2a6390e3af6d2f62c6bfc7a45d007a3af449f38ca39f3abac653a5e6553c42fd98cc3c618bc4de686ba04681b8cda6e984e3eafe49dc46c449a45be620ec842e08e023c63c206dd582339da40382e5e413f9a19d99d8ab644f5ec631e5a1d410bc0d9bbf779ba381ebcdc6b7fc327cd6d40ce3bb1c5c2e09f94ea5ce5471ad4e418e39ac73a8e641971c5f64fb841e8ae026a2e6a0f46ba954450d027b32dfd5a72b2f4dba7a6f1c431ba089da24641318e31b1761d2671ba0af2f8d6b6f75f4e12a72981a58a2866d43119a2bafa28d57cb508614dfd88b7622102fd91f633083c2803d128dee7178437cb07ae78ac3288dc7993b2d99ab061f923b61428021697bb4dc869afe45594987315df18757b9940c4dc67a4f70d36055a42ec9fdf33377e625fbaeaa21fb2acf0ce159c0c91e6fb6cf31f7b409653e8096a314a9ad5fed14ba13d30a64252d5e0e1aaf497673e77767c03ea77f27b11de8d22e0503d78e42d7fd356e5359efa2e230a3febd874f986f48d4ed9ef0b56e71af315b796e471772f810defb5893cbd289d79070d91071ef89aea09ee7ca2fa9fee1fee45d2217e76f5bba9836ed9c186f36b1bc35d685d3f240626499d21ca5eb63416afbcf4406ede1a3474e6cbab26b25c3eb8c63db90277200ec0e09fe1a4df62fc9da15bea89bdb56158e80d01529f2a65963d0431240ca0aa14612fab796e123631b5b7aa7d95095b8e2588006dc3812615f32e20a599f31a24e5389c315d15b03482819f1d5c43b862fd611c5bae1a142eab5df2a14dd9deac6e7e683ab214be4c32caf17ddce2306529f5ec6218ff31068b390842d3f69b1990b57d4848d0938b14e5441d6af71301f31cc65be5f96c28a11f2c8c62cb18d6e59488f51f141ffa321e9c99cd7ca60fe571f3ff8ca106f9363d361732a2509e76def3be9ce79ffaed7b7e0ee605df709ec3addd5dd41ef0d37d3e94f3b2427e0beb7c2ca351887dfa7e32d694706c15d1527ff54e7b120a356ab31d3a6e7c6be8aee59f34afe0ec39fdfc3824c1a70e5dceedca477b1d3b73a9ce4db1d093f12bbf09d6ee264387f8cfe998b4b930f1022a65fd9aca8e7aab983507137ab7efef165331fab7f0f1d905c478d25dc45d9fa31a8ddd7ee7f499006dec0dee86066ef72dd5a572f521822cc922ca7d6bf0c59552018fcbbe538cfd15b665dc0337496a34a19d0cfd62c9a027239434c56acb4ef382fad33562d5af59e983d57d92fa8fe3afc7317110c4346ef7ddeda113b606b54caabeea9705ad781fd41685ee7cf89053a4515fcb6c57a275fc039c3479e2b924087ec3e0f51db8915ddaedd9c8e6dff95dacddb6db300000000000000000000000000b905cc01447f708289299e3205ef44661b0f56560dd891a33fe1e5cd7fa383168392244f81782e3d4dbbe60cc4fc8b1e6e1c1a3e4c65f5eacc88706e427823689e38e6c7c66b11270fe680d7fa740341a0765fdee45f14d2efe32610bf04cae80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081ba0471dd88bd0f437ff9a9381ab3fadc607881b20f2ca68401b89fb5341f047c404a880f034b4b012266ad1c5c1d2d00c38a33de37d97aa9c6bd5659913126dda0d9e35b0c2c804b58674e66093e6ba6aa937ff4fa74042f708d2716c07531d7fed0b2d304267ba674e6dc22516f277c9b8e9112722817606f40e92242e5e00213c91ad68f411f4ba09f60c4ec7dbbf14d462d9edcc0798712a3d6d99c8e011103190a503d0ca7896d29d42051f37e7d66b0654a74cebb3a15160323d2427b41130a0125cc105b6292a351e5a6c17d0921cb3cb210c32ab19ab2643adfe98edc3a8dc189e5e505b81f14bf98db616a6aec9650a386deae2cccb49688e71bea7042dd021b5d1bf84fb6e1000221f2c6f2a915470c7b690d84640a996b1c91e84502d661021d73f69a72af17d0eacffa775ebde85454f483f11faccfe90a29a33f72593a3c021ac38e213b3a8e2f9cdc061843f81e83d13aab32f612d6fd22c21175c70b475002114a02cea20da095a520c9b0575c092bf04482eb98752d9f1a4892dfd8e0f178030edee1e27ee8b5df9d727b39a38eb7f2b47e453004caaecb7a64e7e8e4a42b80d84920344b5716e048cf720195d6a454c0c40c6b9c96426e4b7d01626869c4261a5965d57824b2fc8f1e43242de64810fa46eaf0d2fb78c30a76911ac8cf282266123691ed650f429731e0381276954f220dd2b349241dcfb843bb2deb0656bccfa1be17512d20eced0c4871ac58e223336c8d16d87f01dfe7004cdff6abb708e9cb1fb0de658413fbdce0acd86bb3a2f555afb6f3a5245643ff37ed7f9970cad8f000af971786af7d208fa01cd13ee0eae1d71058300cadf9a0a5189871388dfaa9cbfb7008516f45fc3de11517afa5d494f47f0f0352c9de5b2f9ae2e76830a7df656f60b7c18ddc5af66c43323dc15660ea27980af7c1be0294b51ecd815b88ece43cadf2ff1ee647e6f90c54f836d844f2dc13221cd180a804901cb1ca85954ee83149063e6fb3395d20d313e6056d1016c3d7fe6b10c6cc7203654c30498474806265121153fb2a6c210dc0e787c1a1baa00ed03a65108118e6e78a1538de8df6a44b2b7295ee86dadb41603011c4406d7e45b2244aee28b003ac7680233a2d1294773220eed23b53059cad2d3f613da903d3ccea7e2f9dcdfba6c9cd1d1ecad2068c676a45b2661dc4b86a35b50c7391450fcf2880256c517ae6b0962d637bbd4b1b6a04ad723758df332c8879b62950fe475bc04bb465c60b5057d54757a4545e6678134e8922cb0472d3e59b3c4660b72137a4e925eda4f54f565207c2479eebaabe76cdcb94b4bbe9cd9e73d25b742ad990c649a6893d15dabdd63e68131e18fd7a60afb13b5b82efc6737abe8641d3ab5f947036dc6eca9ec4c69c5a0cb109cea6330f483cc9cbae0cae6af9e402e413606c1439219aa8175cc1e9a07ab0184ebeea97d0429b2ed05efaf21c241b567edc754b26d723cee561d3b9a7caa0520fd3bf0cdb02d00dfabd469505a4f663ee344b5a21c6f02b7b8f89ce7ea57dad77c86b8bcdb058719de08e85e95790a97a00abcdf0870f3bd05db664edbd109b95d4590df93bcda0eac64863d3abf4b723e86edd54ce5a3b64c30ab0e03752f1b133c2d6fd2cfaa53272c1902c5c84a29841667e51fbf49f99d9ac28fe290a7e4664f7f055a4e83041b5028a628f2d863785f0c824b128341317be14faf3e6631074cc3c47e7c04cee7e7f4dc0492a47983cefad9ca937e8a65df0abe8c78abf93b6bc4ba96bb9df81822fe4d8785d63e44e73195296b88b888f7a35d640431fab9a2ce3171445c3c844eded5ed0b5182db377208b1d3105c3d9b3bcb22027bb3a44b001f99f611ac47ce7286b70bd7bd8b3e8c6145c815c63e3cdb5f44b1c3c05f67a38dbdf9911bf9a7bb0c1e0613218115f8a55fa5bfd8c14dcfd521055598aef51ad6ac28e912ea3ace3a319d44937b6d5df46636e8a305317ac910569cb6efab6f01320dd04f56a4f913081171793bc41e9c7f837985ac1231fcec2a43e49a35d314f721536bcb059fcd200d3d3c93750da484419848e3fede7d11b6b4b1b94e124ae0be452e392854d4c35a330aef978a74108e2fe24e7d54bae6f1535c7a22d45e99589b1c889cee8f4d5891f21b3976c58dda4c9a73103bb96f9cf7943be74beed47864e112878ef176eda3d30b76a7764a277ab11d337a439354487947e79c1b6c21a5ce79feef2b08bc6b8bb7cd75bd5ef31903523e32157af84a55e9aa353ba5c5d91d682338f2277cc961101000000000000000000000000b38943623706b24439a33d9182b22f92a2c1785bfbc368249c6968bd2c6da293f99d819ac1c64744fbde6b21b51af7381a0b592d79e0798e692e9037dadee883b4e4845424fe0d6e52ff54cc16883b196a968810b4a535b874315aa89d060f6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8fd648a7d9ac9ef7d5af501df46625e091606baab8dff5edb7d8f730802347dfaf7bd5e810786f5cd4607120d08065eaa4d5736efdf978995583614e54376d4ae5fa57e595aaf8726a9d16232d61c9e6fa3d70711833af311b9e0981e5ef5dc83d1282ab07f31fe9dfeceee18e304d16dfb035d3a5352dd2da241b2681932c303179e0b450b5084a2f42f4e64ebcf6bcee7d96053b438042e9a892353f19b402502058490c8eca7f8639d531f8c898c1eaefb2540959bbe843dce7768f9e77f39810a085d5cea3c684be9fb5636beae8ead79b4166c7216dc9e8a1a1139d7249d2fd65f321fd2b153a913c87a8ad56a3b4fd8f012feabc9a71ea3f0482e7377f3af01020c1a5bedb9640e0ea8053bf0181e4a8c45da4ff256ae58425d8449ead5e84220030700c27ab74cc3bd1addd74f9106e7493b542792f7c288c593806374c3dad789030f82dc42c2bfe5128b85551995cf5174819a611e191051bc6f01a078066bf8370325d82218aa16b96e06d50329ab766c16c09539d336b2d9e2546f86b5e3a6bf8502090bcf12f4ad897d1b0cd71ef8a61324205348c49a7ab95af3a253feec2f5caaaa3a2ddd6b98c0baa124fc4af2fc1aa3bb09aacdb0c1daf20e4027dd4cb008cc611d269e123c185076cc7cf871562e7289df0c7ca3df6bbfb20c1832a2f88c69c9bfc95694f838e2332580dce9d13a2b313693763ab996b5896c96224983373d2b6eb699d2c604fc64470ef29aea8c4a1e99e9c6cc68592975e7e7f0e724115bec4d7be866bf541f65d8d32601ad24d4ce03db7ea5c5a8e60692a5ac773e5c2a71dc01cd832b7ec8080738f5db0d6142c08d2e193790a9c3187df6d0e938a4280326ed038bf2618c2b45608c8f55d89b4146560e9d9eff30d23d91b1593bc93dee037d8a5df28585d898991ccd5e27fb155744e07f2fbeaeacd32cd32dd0e1a186dc4f8ba22ec1a32f9aa28be598dbef76b0050d11a8672c6b9e23dfad8bbf7cec08decc1475cc5d734860c90b90c0e43bfa0e55fa409f3726e23360c01d2bdd5f7a50c05187ece84e9915c6f33e5b4aa5cb03762fbaefa42f20655835575bef79ec3c98975ce60b1b39f5579f19a45165f85c36fe8a7e30d646846cfa3ae9e937867313257d2f9e8c82d56661e6093c3decec2c54484df812dae5b79aabe983b7d191eeb0117651d68bf404d9673c4086fa9cfdffaf3a7be347fe21c2eda416861ff4ccc57e258c5723e10c9f7f10823c612af6837480b72200084f6c88fd12a6c9e0725ea1cc69ccd01da404017ca012d0019bc56dce3e2fd4bc9e4d11445476be909aae183e430d22d9d3b1b433b5fa0350ad9cc9800d74411d9cb50015febfe44c74c53d78e1b80d170089eb3ed5465a8eaa84c1690982e89af606a21f06518b9fc0bc28d19ef33be21f6241694be29790ab7443156e8c1f74d7e208a45b7794b3233112bb64725b6ef455f4e73f8752bb8adecda618456dcb9a82b5c6fc3148527164e842fac8d6aaba63e6d14100080b869bfd3f6e14bcf29170f5b83aa03248060cef0c8e16d0ac32f11a393d5a5ec840758975d0d63b32b9826f86651e870c1716422a29b73805f82a07bb35d024f92616b56b3ca0ca31a4766b500cedf106b64df9edd81a347c25d8d943d9162839d728261c0421a8029744d4bdd234be0c2cc7d66ef35b10e495c0fefc0f2bab08147c6b3ef5c115e32088a854f24e337c7a0663c148f8e93ba8fdd02d511f6cdbd8b03e67ef5713960c21df9f664a1f2363ca8eb8d1a6381b4442bff219d6ebd97900be54d5600388ecb2a63ed187e0707982a6fceb6ee2980b44684f8ec0a8ce94e1ce2fab686a2d56b7788218b30d7ecc9806ce7444a5c5339ce5ae3c7d450d229f02a1bbac507dd7a37b964e42eb46d695644e68fc2ae163ba18dfb08c47997bbba5a37ab52b42a70afcff89a895f956808b82b4e5c4eefce08828d02840866e1c99038b5bad8403d4416a4200b19c6b036d3d7fffe7d16f5ebcc14cb1a4feffee994250c7f3c9927eecb32e04690a77fd757b493a70f3dac2f4aec58c2a529aa82fcfb84d5639477417c261eb9c9eeb799a3a6109a3fb54e0d45f99205544344d146bba4379f987b418b16fb705c0f43684b1d36de98ae4e35b87b27646bcbd6dcde9b3511f8e0caa4dffb0f36e806f85ac41938e53fb46d73164be20dfa9c57157ce687b1460a7c8025bfa951b9b524e907d155c1b88c5f27737e10c4e7bee9f9f35ffee25f538626ae267b72a824ed9a69805e094e604f7bfd4f60f5a77108ceaf84cec312d06ab89eeaca15b31cbc49ea2cd9fb3f8f33cf3a2ff9dcb4b2104b87f277fe4237da826a99cf3b6826124268f2323b736da16644030428b63cb05c0c1b05ae1a7390b8587544ee15e2d3f957e3b2aebcec990904d8ac903", "006a63ac6a5263", 1, 182421578, "caabbdfddf125b3b7761d253b8d2ec95b18bfecb7daaba6ab3a39000208bf2a8"], + ["030000807082c403034d6b2975fe438268b9dfaa89c1574100fd34df537b20ae4c97d81fabfe21355c0100000002acacffffffff37917aad76b8d42715edc37820e550cbf1886148f9cc615b1292bde1f13ea8f80200000004525200632e1e1aa4c074b8775c19e60da9443be66791395a04b6f0777b691ded62753ad8e6b7d8bf03000000076a530065ac52ac4a19615602399d290200000000095263516a6a525165ac0c2282030000000000000000000000000000", "006a526aac65", 0, -2145079486, "eb86784c5875ecfdbe4937649ade55b91f58982df7af57bb69cf7ec64438387a"], + ["030000807082c4030410dcf7cb2240b2642f388910b89598dc5ef0854a261e8f6304308d8dc3e3bf26020000000365656adfbd2f96eb8e9fdeca61db07821440d6a02743daa610e5ba87e4235f3495c9bd6900153401000000066a535265516affffffffe6aca458caf8d6bd53d86ebc223d64bb81fb52861586ff7153a8b96efb9d318203000000066a656553656ae1654c67dfb963f9fcf908cbe33ce2a21baf255d06b911cf16f9db4f29df104ddb8472d603000000055263005251ffffffff0422ff320200000000026a52fe4da40500000000020000547b190200000000096a5100636aac00526391597d0500000000046a006353eab7359058f0c0ab03f54d3c03000000000000000000000000fab2f1d454b3af25049978dc54f0026dc1170de40999c01760f9fc0dfdb21923d1e9fbc997c5a319e418969a28bf8541a1f547405c3b4c1c1ff048e59304fd35df1565729d01692171b234beaad0fd389cd6512a348c9dc36e2d0bf7d27257c5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006422e6afdbe2ab79a95ff8d978b302886cc38797f819ea1e2bf81ec64bfd30f72f88a3ebadb55b1933d776f365d172ef614e5d88bbfd550df4781d712b1262b45ce0dbb9fc6660b212e236a7c9001f915d17eecca2d17dd467a32b9e9a0e4acdb84a21da91a52a570d71abdc259dbc7fb796fb36ab3973c553dda792934be1070224bb6f4aa2e75162774f5e0059ae7d2e3f77a60a5a68bb4bc5bcd07f0d9567cf0327bd327771c9f164e4f4853bf14c9e65aa05a39b2e20668556ecf199c3109d0d0b054d1c76caac162caf913f663497f7625be8de82108671f17622fbad3b2f39411062a76277738fff3d622b903ec6cb58ab8d54d933e37d24ee8a3e60e85f8092020e144d3896a15e83f946e80a023845fa49b59c97b0436d7ee3805dab96787c01022016401a01a40d1fd03ff563d41b5c03d5d6db74ed30a35347b14bbfc55d9ebd021d0b4c18c8f95c9966c09a29d45c90dcfb76916fb67df9fea3d2ebeda17b35410227e1b6a1844363470373266e4b83bf4cde30b243ac04ccc488b402dc3f5e1efa032b7c31c3d2e9b3fda3b5df7a5e4a3d8bea6f3810a1ca409dd19ce22633e2c567762562f8b56fdc3751c11582f780ba816556304943bf3e8f74f491bef306e00d16507b0a99104358c00551dfee9ea3c4d1b4c114b3657ebc22026b7bfd6ced16333e1d922a617cb670b316b70d1e3fe7dbb8b9289b3205e5d9f0543369a25a6b19a9770d7bfe094e44042297937cf5b8e5d2f107b794db054bbbb8e1c8dde3c72fcf38401880a2b484ce65a48b94c3b053001cae178c8ff67cea8475415b8d43fd76eeaea3cd448318364da2f58f5218a96e7e100d1e43af390941e22a3721c3f6e514dc63b751b4380c39c68caf4a433e423d8d701dda076854c4897cd29f2e672a5f0c41885f3b3ac08767fb18131979f7b947b165e740684f22c32517e3f952a7fc8d8754ea0d6e79248924efd8c5dff5105ca7aafdbc5d9ab1011b0e6c74e87734603f80400f2c204e3a64c4e687a68a4a4f6eabe04e74d1e0b878b562a0e8ed98532f8333c2a69fa1fa08f7fff2e53fe61d0e01c6f83b182a0cbf1ebfe9f67618832645e9df91dbbf1ac85478773499db5f333ba500be041629572af20d860c22ad645888d2a24a6feafb93ff96300a0e95bd7bb08fb3696a0cd00a12b7f55d9fc259ffe4e4427f783a3557569ad99b1f7381562d059afc71a4180341354543ef5a573ee75b87853af9452d8f4e21071a2b7a676d053fee9eac5d2e5e6e98ec775f46a0639bc2563e221feb426a3f7dbf03c6c76974a75becf3cacda98a6901f656902e9bb9bdbea727cb0b9b86161dfdc297df1439b6178451fccd6cc7c28975b9e84bb820807be863d68f59c2a0ab74fc6e2387720dfbdaec359381d471d5e5325fcb5379cccbc6d903d24e3590915508c52920de469b476ed029138eb876f87abfe1ad4a42987fb83ad0378c2c767b9d496230b0363d39445019c7f87427bfa843f0a3940623977e988da73279f0fdc4f03f4cdaa8b8a1df3534f6a73583902598ad4de433ffa4af405cbf78f7f181d10d1957472d66ba2c9af92f435c508871353da24068634fe2166d531640b92bd2075d66b92c5589bc84a3647fd0bddd2e607772c5fd3e03a114c54c61480b97ff03006456bbedbc0a63a1a95b7ad91150486fd6bf03622d99f514dad3e2eccb8288ae25731a561693775a7547c2d85daa2a007995e1ee541865d634067037b505f02c4b15de020fd847e4928461d706d675c1628e7cfe7a8f2ba031c1a495bc77537faefe1878c85972ff72db649ef3d61283a0c22ed991e4f20ab1c6ae6e0e57448a96b998f4c53f9004c80ad573f6d632f200c26ccdff4075bf73532dd4f2a8e85888dd7e1bdfe9c12c506edd6f03170ac5847b88e6462cd63260f4e1462695f856a15134fbde7da02e26c6654c7981aed326461b167a0247eba630258311ede2e8ea8b56b00b38f51de0ac6c6a355876c3aae49ad3c7661fa737afba4b241b21521804bc3f22b2cd6694911ab1c53b1a6ff14a242798766ccf5d1f1dbdcef499a447b6858918433c986d5abac7abc66b045f7a0f28f9b6f9d84c3723bbc4ec80691cf06bef27a2573db1ce6d4a8f8c573fcd567ee5c877955c3ffb21410ca3ee26f10826e4a903eef562221469fcce7ea961e7fc4d84efed46c25cc807c73c0826b8b400295c5d7d0ac4e38047aef72001e5b134c08d1bbe5197e41c73f0580a850045f49b94f52451358e10fdf82c6fc4b4f7e52504523cb1c639379d000000000000000033505705000000002f57597edc1f9951a87966e72f4a2cb26b2555730f10b31001dac5776f99da0d1990809485370f917a38ffb041a9344057f6c1af71ff53e24eb62b0af000e6ff6cb2e6b07dc9d330a13b837e2d0faf1f20507505d9766dad5e03c9e396dfefce000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006c31bf8a255b863ca1b89ec3161b3df6a7d4f393f0883c102d9001f9a2ec60ca0f4d152f766b1fae27afc12d257735700e6191198284f314874b702a5c1b079acca53b1725647630cc01323248a7e0997e5dfc2c762a7cc60c814caaf197e81d7f8130815ebce6d291e346a8ce1a70157d8335502706569c9a513902fc0d7844020c16be20717a8af465d0a3d02ba11f9f91024a022a2099c2ab3ec4fae1211d9703273908f9510ba2a248c8edcaaa88e1b9dea67a5989ff285bcca1b5d74f0a30b90a06e73450cb74694933c57862ca82bf457fccc087678c388cd531df8d88f82e3dc0792cfaef7c6889e4fc0060a0865311ae3be4950d788c971bbd7467c9dbed870207baba233c1e8cd3ea2b111aa43a7b7fdaa2c9a208a3099090eae7e1b3a3618f0212efa06dfb059aedd506484481c0eac184dcf5be7851b9ba68d517dd7bafdb74031b2b7e8fe81ca6e6481b735949e3129139ec486d92b9dd0b8d84b87f1b5d19ba02194ed7f33861434427319008f27b33fe8a79ae215f7a908165a2c00a996fd21703240383a7c80966c338a4d8c93d369e5cbb9e29402df01ed6c39dd955fd7c4f6f6e4c1ecb095488fcb1583f6d5e89c2208601c525f30b561490bb82fdc1ff2c5ecdcb0030bd7c02f15b1c074e06dd12e7a6082e4061a48244fa76768ba24dc60d6d6b169dfbe1b1b82c5199e3d89b22e3a334960b153f5eae15bd530cf2a2590a96c516ab6086120e2f83ed8b75bcf087c1cbe381f0422f864c892b9a0f1cbd54cec8fee255bf7676d977dd874a720824001de8b46176ac53a425025a10bc16f6a4cb7ad894e5567f405187ac9634f4348901058ba7211bfe7608c77bcab9006017cc0eda9102f90be1b63d0816715d9dd0c5492a99b00e635efe842b95f582a3d703a910f7b038be89a9f18d56e60b75a70ab888d3b0b189c64ba200a572c3e218516d33b51a725ffe72ed34eccb2ebdffcd9fd151e6316441963bcd12bd17745e571ce93615efac86df8eb9b7711331c8e396e99ffc191dcce1fc25e8fe65d0cc338526f686cf49dbd0b3335570cabb7045ad88e9dce0b7c89642e47b7a8edb410462f7cabca39b28b159f952bde420a1a0b8fc7dc765aa7fa3462deb88e07c76f4d5465133c5399270a72766a11ca4e690797c009f179e4f5ccebc9f26ddae5cf475f78ce60f0b33b5b0c1b1c24bf112b77a943f261b521d75405fef6f448909cc3a9d9f2c2eae16ced7eaff1d724ae7ed4ac7a5d4a59f49787e76fca18bb33d07116c20aa4ad8a949a357b24655b30e67a9b1be64df6e1b23f010087a72f76750fa17ed969d84108f40b5dd6eee5e249da81da577ccbd0146d52958bbeab4f6feb1d9ff8ed07038a34eba7262b51d5f52646cfe4ffd681d79066d8cfc13ee45dab1a062da7297969c511df25a234ca5c13e8b4c53cf7cc4f61ef9db2d9399d6a301a528152d510d8404054bf05e6000576d7038cc9800332b045ac78d475218088eba3f51ec2cac1dbcdbc48c4887b93839dc3cdf3c8c9b45a325eba9117a7c6ef96a10f1bf9e3eb181f1ee268e70aeef9178c8ccfe47d810ccf27417ed37d8f146e347e87eba5062e8c31b77b5087ec800dec42110fd1869cae033d77f06e64fa6da0330de7cddf72b3cfd9336f7417f38114fa06d6164ff1ecaff50861e3230e2d5592df344941a2be378ad3c93d117ebd1f276d419fc1a926ee751a184da218e12c9b1b909114826ebc2114442d861b5722c23d549fe23ea35fdfdcbd866816fccfc9e36aee15d119dcb0a73af5232f53f1289532ffc49fbb1e6a601cc38c92efc43f54c5a3857bf5342e3a30af3f615d789434189cf0a91fdddca90d5fe8cad46d5304cdebf905490273aaafbbe28c6ff807e8e26659bdc7953b21c9e08e1e2cd56c33b366ba0dff4d3ede35a35048baac1e3caeb260de09a922c68f0f713083a7a88480c38ffe30f706e2885bead81ab83b37f50081f2e3cbabe613b9063f05f925a457990a817d7ac3143adcb080959d0c931320cc97bd269b74f402784a03ebb7994fcfa2f09ebf077d510d07336a3e3ed178175b59718307258ff3e8e0116fb5f38f0fa33f3328ff02226e59d38197bab1ae2e06eced2261d9decc5519aeae1471af8dbf1abe2bd59b30ce8d2114b8ecd2d49a1c80d20e33c18653d5253f17e14b5238f5196556905f2994454907df61a2187043d79aa006e209f1c208c97648e1de052e9255dd6fdb151622f7863d67b7ea2e013c2201c2418899a25123cf597f18f48d57406e942bf7d442a486bb8010000000000000000000000004cd15445d839bb5fd3972bd2df4137e134091f95255f4b0063c811f7a8c8f60afcce9a2461293d63a4b4967a693d548cd35493b1610a4e7fb7446e0bab30cfa089be8429182adaa4f19fd4b267e8e8a73682a76da7186ab6325bf0f3c45a9418000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002399534b3d58bf13b82eb180de056c4dd864207a2f7f0e2e8c4b56182430c676dd86e22e18a8883a81d5b94f6c0ad7b1a989e7593e118b05b7a725780d870e94f68f183010fe16050ccdcfedde931e4065b914d50e9f4a6d585a755c735fde7b913daf56341e781d210ce23f29f9f5e33f7f7ec19ff5aedebd0e26c62cb4fa1f0226207d2841662230a5537ba8253fd768570268ae79a72a0d348d27ef2d6d0a13032556e17a6626ab887220e9ae066e93b07bb7b9eaafae056b589051eda1579d380b05e361af204514869167b43a8fcc39aa51239e3d4ab0893256618d48b51125361b59abc1e5e05301c3c1e21ab73dba2f5cd1b35d2b1a668f0d264c15132906df0310c485337e8c3b501407ad53f09b8b210b97f2bd4eae6a73fcbbfcb5febf9c25031e00a2aff3ee725751e8b3dcc3234ec62d409e7498174e72937aa96e0c88158c03216fac31419b198c48866418517d8dc73377fe5724d7b07f5dbc6a81abdcd0a5031e1c8eac15b4b1087bf7083e9309ffc232404995a48959eb8d4d6975ee1577a70215ef4f4d5936d45e16b06b9da9a401a8bc97d24a6835b77e1fb6b9822c5203c1d18ccc6a7bf2e23ed2338a01a5bba11379c6cdf86060481bfdcea0699e8627e3580870a4e478efc8ec1606ae265c3036bddedc6ff9c14cbcc75a085ccc177982f7107a7128824b8707c6b6e5cf67209bf0cec29f7161a237c953bf38e46a42455dd43e87abaaabd31c0efda460c83997f7c0030c26c512c67395b04179a70b195c8c6ec6fe1b6951614bce5ff275cc85151655a9e1ea31af53db56fb5a70aa0628daebf6aefdd318b1e716e67c2d0c41f6e0a5473e09742c9faaddf89b0ab023569d468e99d90703bfbaca3df7bdee975d4733ffdf427cdd3f1e3ba201091db3342b9447be4d39fb3c6703a3184adb76fd7f92109657410d3ab81b83baae62489d3e6a7f88deb66553680f70cc698551203eed235909d5a543353d36205c5e022c9df068f81452ab7f03ee7b00ed621cab81f86e8f6422ed3a71b32a90269e04d38a9c4163c77a25dee99175c8911cff578f9598818776f7d16383a468fcd90a0aff6b3f979a01b75d43062a91c988623fca7e93b85b5e84c878a2cd9a9b625b1fa5ab724a70406040dbd46f289c34b1ccf57811f1f8509c1d64af76ee7f101ea66c0095b2ed4b49012a05f94588c57ea07aa35d1cf4ff3d8527704faf6b062e3cb13897480c78c6a3817421f69cf26ca35335da5a9b815c465169df0912599181515fdc1f94e113104d6b39631a0fb4a779c771b8445a180aa667da0189f68caaf565eaad43b7b3bf43cf98ebbc8ba2218d71f8513043588ca2d5e1aa644b1dd09de59910f8eaac3d3c5fb9b6e326c9e9466bae48cceb102e847f70bca88fd81b4346932f8241438a872c600ffb0f7a3c9ba28c15993214097340fed0b8da354873e1d7a626e392a71c9e18474ed24390358194941bcb6f3e3ec0e1f83e0d44ae79ad4d734640feea1ec48d6dd773fa37a9d74fe4061adade32ae49983c7f1d4971f80678f5087cef2531b80a33084d0aff10492f5ac72076b8c5488035481b93bcab5bfaf17e532560104048d238507bd2afeb18f9619a86c7f57eb227ea137d6f1b676b65b3ae8b900ad560c2124a25f4014418ad83cad892f718978b71fb495c2e119accfe784b17b911b6f01a12203a2cdfab4afe8eb6d2951aca241ee42554a9d9e86969c816f85b8f7bb21ca97b273fbdfc17d49871a2095815841acd4ebf5914596473637dde4e0b67e70754baa8bf00ba059ecc2997b0c18d51d988387081ff9f01cc92d693e767b5e4fe9b7f4ee53c2cfbd4f593625368b175a05271cd63bfbcdc5210bbaa10c5a830b73de7994d6703b4b6678757b2817c2b515abe3253644f6ca4cbeef6e791f15c5872e85e1e3e8bd18300080b15bbf7f426bfbd358ee43a3a446330ef40f742e5ec8d843f9d2305bfa5cb8e3b0ff0f204a7644553de3d1e25d3ba6b20d02723fa8e9d3837fbaee3f2373e61da925975ffe7d882ae8ea0196c5efe58dfe53de6da17f2750d6b46a7ba026b90953c9e04eae38d3a478553813f0586d7a4af2e7b1465f6598d43a8c109ef65832ea841e902e4c4ea08c249aa808a2dbec4bf0860f2b852a9045918664b5da293ae416b3bdb3df46f8f18e1c5ee57f152f9485db2c8a262b67acfafc7ee3a0272d032dda0b12b6a869e7e3f07f5026b43d3bf6703ee655ad5ce98f4277eddc34ec198ac58320e1954e7c9616ce5ba3aecf284a7b031d93be1b4772a9ec140439253ea4e7964c5ae8ceb256d6d5f3351ee09ca4c4ef6d77e66616b6192f07029037e417754edbc933ba2b7bdb13f345f731f198c75180e38aed3cc1a63bf12fabbf423e794a6bb47afd05552ba67f880ca81a1c8247f10328e07", "636a630000", 0, 145861685, "9dc0474710973d6cfda394f4fa76a353df4c6695bcdf2bd6ed61d91d5d5cb461"], + ["030000807082c40302b675c8d883ece31d8a277c629134bc4e2c66bd8f76467c88490da85c5cd54fa60100000009ac52ac520053ac6a63ffffffffbe7c46e8bc9520211ad3fe0af499490bb4c474c3217d78b3f9ce96a4509064f003000000016affffffff045a2b71010000000003535365b568c40100000000046365ac6301637a0300000000080065acacacacac0014619f000000000005536352636a48f029bc00000000038cb8ee03000000000000000000000000331b07ddfdd82c9f8faa2feb3a0dd55f0d941fcc4cf697c77d4c6526caee5c94bcc95cc17839580844b366b7f5ed323d39affa705127f60533b06c6938fb40552289cef58cde7efd26419642deed5eed2a008a238e045ef943a54c9a3d01160b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f2c3178d9900c59e4714ada35e27ba445486f9d55a567b96c618fb8c492a44c1124ebf0fa47723f25f9d9e5afe57b7ff7e261e987558cb56f24b0f710cbf39f19986150649029835a246d68c1b51264bc9d751e5e5fcfc5c58f13e801e1ae5d466c2bccd0c03629c51ac7368fe08d0135d8b19a9a53ce8dbbabaef04a006794303171921f6268a2a9ea9d296038dbc3718efe1c8702a687995364276b8cbab82000221e29e7a4d6b5663ae559f7f78ecb6449e75dc54face31c3c0388b8cf38825310b071670c11bac71c65f4f6e2a2788871f73a118f028d36ec45dd4c132387d7507323a6f677921e062651724587cea538211a8ccfb67bb4204b8cde2a448c33dad032339c9467e26156c90ed0039f667a52ba7210f249e628249f7d316551a9e346b03202b050c08c7066cbe3b37b29c38e2d0761a8563d83335e2716f149a4bc6428a02159ea91392af616c231022e36a025e31e10eacfede2be15c373656fa06b4f018031e3488ef0fe6f7e2673220f34eaf4188601b2374e50900d686e334879ca9f8390303405644f401c7a7dfde9e48e456850621ee480fea123442e4469fa5e0754bdfaa11509bf28879195526b4d88037cf4e899aa38630a9d3cb0946d445b985bc213edf10f2b7c71b28a006e50b9807d4f67e0b1b03153b49e9ea763cdf1b8b9d985209f6df600ec87733fcc8aeac72c2bdf9edffc946fbd23d4fb997972b54ed6133cc84ffa515c4a756f8efe1afa80cb2df139e17eb441949812ad8bbf111846bd504520feb4c345b54730565cae0b19ce92d3b5782ca6e3d22e16f168ed77a67edb9d57b20975753f2a099c839fffe8d4672127d3fd2809c07286bc9a850d711f28920f367d4ad3409db3a871b449fed6a2234e49ff198d0608f4f8dc5308846f15798c31e7093b6453090e1a1bd444ea27c87cfd7617b616ded4c25702c0bff161e78450df987aaafa4484d9dfa7356f5ad3c95b01325f1dd1168331873716b3c2464ff573617d6f7ce1dcb58b25a3fea7f8e5e216dfb38ef86bb82a85d88bbde5f8e8be9b3764ad65c68a434754d87b6ea033da65e1c5a763790f059b2ea540d0793ff39d072e2a41d69b16dfdc173ea855ea1e4232d88873ade3fccd50a2b46dc65695a5d4f1adabeab42c605c0ec1d7c341cf270e49ac3fc73df97de874679a707bdae9ac6bc2af916e3eb02be901b490def25047922741c861ec54dcf80d03d228df519a5b703d6b944fde8507bcae75b48858f815b1a3074537a0dc22985467a4a4217d7a75e70b9f64ccf1614bf007c9e58f2b063dbfa4435c4eb09d8dbb261c73ecc5b0b88ccc3184da85dd32aece3be23090605292be1019956454e3c10654630a5769c2055637d40d3823df170eb12388d9d1461b77fe4a86ed8ba5352e686ffabe9f59e9a6197d24981cb54ecfec8cb6fb2133759f3028a38ea9afab9cd7d4be78004afaac7bdf685b5c1ab5fbd13e378f00b8951865ac910049c9650c0785ca99dbcccbacbc3ceb123c0014a7703e4cf3a34d2f5eb9563c5107edfe02de3c47c4e618ea5a5500f16fc10269189948109e5c5c31e748abf92862b036d6460c7937c515cdf44a563a42555deff712bec5ba94d604ff254f33799369759a3d6998cf0469b271b74f1791cbebd5efe960b7bf53f176f907004efac91d2aa8defecf27e917bf05b0a21270530eb988e2e8db972c37389165deb084c5f8d61000da9f0c6a09000c9fd91bae761d7cd78d906e24514f098e1026e3cff9505af461b46d16b7af8c15545f53d7a359ce1668a0d8b108ba7608490e846cccc712e43025f6ecd911db3c7d830b68dc1337d261bd5c8e76dec9feeae36691b2b23dceb8376223468be073a84f401f00164dc26da3d60dbf3757f5586c98213a1d0ca0e4820ec800d7690124d29dbd2aaa62a7b757018b85f0a1e290c87eb7d3f7c2eac4023abebc55841d9a024ae494bc00a3cd95f65ef41a1570a17d5e22b96002a648c258761991d5e535933fa14d514a6c82319aeffb3dea0a5f6363327a97d6ab6655a1284abbf967c0f6bde7053da03fa857a6daedc24549da7e04bcf4e03a7bd1e05f44d51809c70299f834ae2ae3049f078881ee1e5e112d33c81e9fee11e9149c8799c4b48143b55294bb9c4338a5aed19eb512c2fc6f59fe8f4fca0b74bb2724cfc9d2ec68c90c51177f71c0470f9c0d7b37aff5a79a35b68fcca12acc13ab7be33cce80f0cb08044b1966f8e5cdb375191664b3555b76ab1d2b7574a8cff1e7aaf103f04ddee713a056622d8a2dd5a2f03000000000000000000000000a3932224e2f70f061a31f38649ef7e2f317dcbe2a6b6f9e1587329ffd3988b684869098cbc7e9b1249083cce8b001557f666aba3189e031ca7c78cba23dfa827e9255b4dee0e161743ade899b984243e5ba8656191113cb94a56e388b6925a75000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d8a8406dd25614dbf04e5fa8e00a0768fd61b5e9484f80afd0415c6ab834db2f4d0ebf2fe438a64aee7775f17b0f6ac9b7a854f144f120481c3de51bacfdc226b23649658d72c1bd717ae8758af727df7337aa82cefce6ec8d98d407c583c5430f7220310cddf70516c0a2ec799eaae31a6e583fb4a9d8bc06eb962faa53d3a032729ac9f0c427756adf80a43de546b6ef6a7162aa3be966180d7b2f9d6edd938020cfb48957dd2ba422ddb48c645144d93181d6aaaff4dae98602ea2168f5a3e360a0880b051a8cdd956e378b2cb840e21b1fb2036ba78727b063ed2185f4a2ee0492ff27b4585812f0f144efd9d8debdbdb4cf74707406e7786d9d11a89b53d1a1b02046fcc3d7ffd7613ca464165be06e47db929b75f63f94818517c77cca26754550306c476f7db251742a0c12779da19ef2449831593103c8114638001be2e17f3b4022ffbba3a2efc8a986b79f3e95c7bdabf7e42d09aa4e00ccd20df2324770c7c150314cef08188551e85fc09f65f310c7dddc44c8ab1d93b598de82059bc841effb20206a3c7a985037a7d1c46fb7de5ec373a0ef3f961ec3a4828407fe84fbb6a17df33cfadc4fb4417306ef8f21c341fb9c16661d5b877f89b42557f739c210db0c3b1a934e1fa2b1e1b3da59d99826ec2e7432efcb83d955f069bac54052620b8c0947ce2966f683406385b92cb08dae16b12c913d346bc740a1ce2a56020fb40451b97d77ce8a3e34e9797bd4f2f9aaa2d71dfba916600dcfc3ac8175399a7bb89ee59d7d6e1df43b1ebc8584fd04a52646830966274af858b18b82b911c2f11975f92dfea14b6c5e976b48b0d24490c5847bfd923a09d52ac7c60d31a0cd4be6f8769b77eb5efa45cac9e2d870df7b2e76ec853707c877bc6a453d8054b56efc846bed8227fa47917d0bcb27d6e69fe73549937383dc3649685a2ea8beee83d59b73c880b8c46eaf117879260e06c775991c9004765f9da9aaaae55d356ba70ca2ec362f7fa26c246b8c3f06ec3cb731ebb5e61be4d9cd67d07bf2e38d59ed971e39182ecc091344a9fbb3d67e1e01cefba102f3c537cf4eac4428a761204209986280440ee4e98865f1f0222781de0a4eba6f2ed99a4a4017d477cb492896adfa2306e336681bfdadc0a0f6536499f4a172a3edecd44e873d3395dafec1fff9ed37f811e2e731f79b21108e9f54a156af096d619352502ae08e8c8b1b050388b8354167e05d66634bc4d9a7be8d254a2c426684ed1d416c95ee0f9dba44111c4439edc5cc9275e3863685079da0a6bcbf2d7bc4090f8f4664f728d032ecdd4c1ca6aff64dad2f947a52d05ab734fc1db11d083d5ce2318ab9df1c13ebba0c291cab2ce7fbf7823cd2d60fb290cdb61b2a97921ac13038f1c58dba3ed304dca5cf6903d531563006e14602a80c47630c845ddb5486545d16e08a47129532ca540c25eb4233b750a17429cb0615ae6261332a9bd5ae744e9b040fbb126d2be5bacb270ecae3e49ab36746fd4dd932e4af8041c8966b283cf289f1530f29a79b8556e18ee208914068e01e2ca37cf4bd86793a0009e9273919f7d40341f119838913ae8ab5e21f3f09d264c46870a18ef6918bb46dc483bedca8598d91b03e12b73b659029e4184804d8dbec16325b013f0d9599f3749c90372b6c33ceac7949d8c99713f85980dec14234aa2678ce217f2fce5ed48bc8f12c67381a2982f344115b2386134d247c385449e022c3118d24bcbb24f3906ec2785ab7cc69ca83659de957f66a69f538472755673b02b47809132dc144fcb7f150a31096320a939235c35f5dafc539be931c73ecdaad69346a33339e4af6f819f29b9a24355b3c6eac85e52bf1813a9d443070f2731d05c75811fe1d0bf566687541075392b69cb7ac0919d1ea21e21cc7847d9396870226fa51a06a36420a7746238d6a9f8ac8a4e6dd661956b161df9348054ddbab1ea4621858d031d7a350b85d6e67afc45703b9432a495c6f778c090ba958a9de88256fd0f1104ea868273523453a8a253973a1504528b41be48c3c28f96b0175f15abad3cbf8e41e7d053d40aee308d0b4e0826dfe487e1217340688cd568a1569920c34ebd2d1c068b3a99c3932e9a9989218148edf625d439c6efcce7c2499bb1ca803f631e01e0cd61ea5d48e6ef85f44422919daee7b17a786efd6d2bcb1fb737cfb203720e573674e8d0511ca7213cc7b70f80f2f0bdc7c9aa5591475bd0f9c0a174b56247c3ca12705086a8b07db5e4517621a26d4b0d5c35f6de1440236ef2df08c54ea45b00000000000000000000000000a84a0b788b1e404980a560e8a4555ea2f36cb2097de3ae089bac2b9fed1a7b9427adabacae6c504d44b9cb48b8b20702cbd8e16256bf36efdad3bdd3b32f15d9bbfa5b6cdb36b0ae001323bb7399bef5d0dd0649a04a40ff2cf138e0b45a75df000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008f7972aec2e641d8705cceead800d3d1a23986bb668019794523183f8343285de4778e861e75b173e140116978266cd7d0b8a3699376e8332fe7a5e4dcfb4bac6377085b09a9a93b17db03985c051ff107403b7f16e988cfb8fc9ec8b04d6f7fd8c6a787448789b6e11087ea9bda66ef00fd7bc5fbbe9fad7ead43df9e159d66021248d0febba5c98c94920e508ea8b3d6cc9b16e32286d5ecbb375af73968318c0203d0ae4a8c55e469d4aa9eebc17150e245d15041c415cb9667ba7e4db46260ff0a0421ac2390f7d5670fa50862310c4018d13744a6a876442df27de81b108437a644e46491de8d76f7a360053ab30107483dd84d078ba1e03d12a8fd40d8839a7902283014b850c6804f01a38f2ce7e05744eeff999f0968ab947107b85203c99065032a05db5b216e405345813afcafa49682742efc48f092519e11dd887ea7b546b00204ab01c8c867e7d0fb6a295b8aafb094b85877dd1802dcbe77da701638773f2b03194c3a94c860d7e76e2582da083e2d300b9a9204fa313a55a52b3a2be4577bfe0205244c9444b4e6f461e96ab33f6639a79e35837de1265a762bd63f2e0513a305edb20153e3232a517a69e9bb064135e9e38ffe8dbd9253765870f7ddbe4699c080e9d4d617fbc716fc35d25e6851b96e62abae342b09602df3dec2bde498e3f1df9e8e5c6b70cd1d6366190320575784ecee0f1c159769f682173eb611ae7dbc7e30061921a5c1f8abca96bca8794fc50eaf2d883944b39747440a1920ecd04bbae818a90fc3ae4d52d709c3d6e3db31c503de20a72ed7a951450f56547a60199cccbcd19a59ae91b3277e13fb73fa0b43139d61941c04dcc7d58862b87959183083b8b3ca936b36c0143e7ced8f30b3d89b8a58ded7bf49b1f7eebc4cd46cb2c3afe51bb2a20f5f900265efd51e8c85783e469d58324a51ef6820f769eb204371d4632f7a708dfd956fb5608af6ef6f76cc665dc1c90dfd6300a0bb0eba5c686eea89cdb0eee2c7bbf6bff2c0591871cc4c6d1f37b4f84fa3cae1560b6c7b0911bf4ad497d8ad4041b9745a76bad159b74c558d367d019547fa851bc76e5ef993be066282312cc80ba0f160762b6849c22f6f2899ddd719b89ccc6426ff9428f2355b4587f041358d8bb23358f659334ed2040a6d87f30a0bc015a8f9c310f1c75c6b00340118de8fb092d59a9dd2ff12a2b2b48b4ac407efe90b9cdfb6f1d6cd636cda7d3f3f70bde342f04fd1fadb475a2fd80ff25122149186a92b4b4d05b5b559b40aa748259d340f99deecbd3ae32c459beae4f8880756bb36625a6567311c795d3c134ea07eae7c3e39f344a1092986ad1d54b16c9377f124565f4bbf15ba08def3385008660b74f6b2de204b9dba8af43bec3707337cd267ce52532c99698da22ee6e67876289cfbc05df941cf5dada9845afbd4cb4da50908c513b7b0dfe6168616ddcd125acf46b33907e33efebb56c45013108533c02fff1fab76c877a68fcd71eeabcae8fa1042e512c3a4d746710edb4190880f653dfcc4d67eae631fa8df33c7e7cf65483bb63e0cccb9aa49f778755c13d1f7e8789a20532cf7aa05df39b61fd52e7803918e9f808a70aeb52e3593598c6e8a5ecd4bd4929874393ff42b5001c70aca003232b659fa58765ab9bc028b8edcc506ba9ce63c642facddbf8950566389c92ab814dd75cc599dc249e783806a97e5f9b961248e134e89f1e1f4f010f625f02aea4ba0f6fdd52e1c1a13bba405975321a3ab268f84042752e5d8aa0c55eb50d1fe177df2d03414b814bdb712a166a9959de66374e3c8e41ff29833d18022a304d9776a05d63ec5d0ea97a98370eb2d60e239d673cdd418a64e6cfa87f8d1e7286dcdf599587f366f93bae6f0a29d7911ac0ffa0f556b803feb5c70c5f5b8238e004626978a4fd4336b3964faf5f7edcece352684ddc04a3202ed9f9b9054b6b20a728ff8b96962e25918f97ccf7c45d7eedbabc059ee9830fa35e3a26fe5b0ee783461a994cd18dd4e176d8cd1be733a7d75231492d5a830269c85cd03f0384b0e48517cd7d15d6dd8dea02b8205b32ffe2916414440b14c1dc140002b4e906b60d146e860c2dd898a951560dfa16be6c151d2caaab6c486eea99b6d8ddb28a56e889930da7fb8ecbd1b7fc9d2f315322213015d04a1c2c69bf2b7291c9233458085e106665267eafeb1aebbf864ed0f69fe51956a48637d4c6b63e556310ec707941615ceabe4def5757c4259af8c649a7a2f129f5b37df22b4ba195abfa0e2e7dc3213cc0e1c4b9407a4aa3c6d03799d3f9e689f022dbf387f7b70defd2921aea43175faf67c4ef4fc70e7c225b73d24856d90d4fa331761f74d2736de4265a56b869685dc15daa72698ac16559713a73755b7ee3f052ae014371661b6113a8ec134d3cdc90f", "510000", 1, 1317415740, "913c00c8bd605125938998957ca6a25c79e06a37a9b79b84b4c642fb88e556d8"], + ["e60d247b022dcf47a7c50e7d5c34e4ceae6ede4fdee84de837494aa4af132a482ef8f3e95c0100000003526a51ffffffff792583d95413b9858653a5369876d3554b34036171a67355eebc5160434812920100000006ac53536363524155ffe70210d25a04000000000565006a6a65cb08af050000000008510065656a53526a0000000000", "520000", 0, 1263090422, "c54a7d5691c322b113292451694dc7a3ee81a9d010ab90547bc16534c16d4037"], + ["030000807082c4030350f596581d8acf853c99a6da82d40d862a9783b9a78f04d1ca46bbd0f3a4c3ad0300000000ffffffff8513dd9d8234ff1c97f4196fef45a32000f0ddfe146319870c3390439dcfcc680200000004516a6a53ffffffff7e52fcd6d2ecaf000ee2062cfdac0cce720596512694a807bd31d32bee51b7d2020000000563ac006a6ab0dd588d02acf19e0100000000046a5251ac836640000000000009515352536563536352a018ab990000000001e11dbd010000000000000000000000001ed0dc109a06e409977814c214d37e23993ceba92f0e76b9447b041e6a2f64ff3290c0c9ab743c545298ba3c852a63db2e8353bae4e2597c2aace0a91d0916803a58d5f3a0315d7bfa93cc650232b20daf13815a225b7e7ccb70c5781ba240bd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040f7fae9998c7c92c4d0676504e19832dc722a2405316624aa6d52db91fa8f083bfa04f42eb50c31329977b99967098637d8d4d8db024062e60302c3125c7b785118c1487f14bfa629479518f6df83929c3c61edb318df091020db1803f428c1ac9e820b929f62c258ac28bfafebc8f483dbd2e90df16f6eab7028edfd9cd1ab02215d1c779a9e9dbe0f54f88a856520f0b00a78225c0d9bcb4b06610d2290da050214285b487fe67cffa8dffa8530be3052a559587483a8c6a134c5b920f001fbe40a0796e1078b7bfe2631b90f78f4bba209eac40429f7646e57dd69a5e29479de9a128e7bef7bd656db84b319e3380ed75a004ef52acec29de79152d22400aad0ee020b7976da587dfde731a20d0d08be81d80dddd23178479bba5fd0a8ed19c508e602012ecab72461f47b10b3a134888fd19d3f556987cc4f97776ab78f755648d24903227c63eb01421f7f06e98317883c8d75fe538f1f2a2dd7dfa126cb47d15a4489032564e9e0217d346927a1f4e92dbbe10916bc02410f856ee6798a211c2f57a88a02062b5546da823be530b59e7d628758f65ceeb559b17f535dd82127c820a252e8f6a5041f88a98555c4d2b3dfd3805334c3df2aeacbceb5d65fa81ccf2dc314ad5fabeaea2dc6974f63cadc768ac908f06e04c9564aaac0e1f6bd6fc1a994d2735ed7a0adee95714c09cc6dd91a44a4cc821d2feb8d0fddbbca2fd0ced6b1b11b93ff5b7c3aa8651e27dcf9b41d2018f2659e6df69de841744a3db82ef24a274ad47b286ecfe729dc2220a867f606ffa5d2046767deca81ee7c9f38c5f0c27b10068e9111f91a98bc983afc7a49f19cd2cca2694c876e1a140bb52d68fe0c4701e71dbeea7f200a05c54d50bf76e2924bfa84d5360e38104b35747627c9cf50bdbf07e895b8d73e0a01841055d49eac5073b1897d2e7169b775c006a8e50bf11596982c1447f119056f0f2fcf1858e6de318e73fb750a10b8ec65f9d06f587f5573b3499a88e65905bbe16c315f9dfaddcb27381b9efef4d6bf7d6927ebc81ed85bde8e106cd369f447a03143eafccd6d81e8a7ce3b88eae5e4b9eda4afb26339323fc2209e70a9c532f59f01b16d11fcd14906f07490bf5f0ef0fb0c41b2de71096eb0f75c18b6d5979e1f9b066b98760ccfdf823a1cfcbed5bf1d49dd7f8f7f04786f9ba2b01d7aacceeb2e8fe9940fedf2957f5e3d0215786a0b2c1f8981782e92674095599681d1b8e998e21c60d3bd4feb4936546442cea2031723afe1bdafbb14937833e732128fc75f59663dd02fb7e712b9d6673a1e2d96e2e9914e0f08a7e1cefb6e50c03c71829008acfd386ca6e2e2600bd2420e1abd763202223ccfba754b40039321883539c7021ba185f67cfd0b45d630654e1de510e1c23b9b12f6c589bff1b02e32fb9f050bea89592fa3e801f0748c52b498e590b5f096109d8e9cee257efc7c85ea172ae7dfd6fe6d242e7e07a65316160d2d58c6440e6e4b221be4323557099007fe9cd8644bb0f7865ce7c2a5f15edcf326339f6b9e1d05ac579f317b5edb4c0bc8f8a6a85a089f66e0a378e965aab7cab81e370a2bd64ccae38cd469a2408c3af6c607ecc1b2f4b58f556226f4f2bb0672f41f73dc112e698f8ccd4bcaa9d613115e1a0bbc093b8d95d1726c9323894ce3f5ed254b6e40ce8a4e416b12a881ce87aea73ee078f367332788ca9ab58e2e3814634faab1a8910f062e038f7c4c4452ed6f40f92928fa3609f773f5173efb36c973ed51b92b02cbeab24434816b7d574c6b3ae9cd22eca2089249129af98b7c505146346cabd71b4377446fd49f54492ba00f6bd99003a76c258b8dfd123b13c4e08ddf1549fbc3687a8475ad9b0f8484372c495e91212cbff4c47d34ad93fdab89338a4da5b671d849f3276ee645a17ee42fb3e49b66c56db6ddafe4d24e7ff598632b0a1b65320e1847f57347cb8bf0a54d60038ac7e980d3cd8001832d4f1e1ace8af8b762c8b84c3c38351104e671bc3467c9bf918d2e0ec0152e1883f07b55e7d796cbc6516d160caa8a23d6f52c18127918ab08d68305611d5a59be18069a945eff0a7a310f5b1b14927caf90d57779bb3b5003def54f673507ef5a4a92ed2203c58561aba0db8dc5c840df0f15f2ceb93fbeb23d8a799f8ddee3e1622bc295a808734c5be9ecde574a9889f7ad43c461d93f5940f5d727852b2fbf41cc919285624172868025b150fc9e4fd45732f3166984be4f80781cae72f10f98ca2ce82c72ec68e469b2097e42f793f3a3d43b7775b94866aee783ae63d70306ff7d57de45e6effcead771563bd02dc91f479f8b71d57dc5e4ccbe76131e8b01947365e1a20d7618726b92b8e323dd99aaaf53234ba9a6c096ff320b5cb5a91824f19dc49efe06d8a59da78f37359a5a177e0674c7f707", "5353515263516300ac", 0, -1977473266, "bd5a6d5587609ac1e4e59089b1e967ca2211d231694f7d7194a06f6476b97747"], + ["1b0c263603ba58795ee32006cd3788e83e5e4dd0fa45adde1e11718147a9c0305c883870020100000003ac5351711eee89b5e8d9cb65efd68f5b8adf4b6633417a36694dcf56c5e3f759524d4a8ed41c480100000009acac0052acac5200acffffffff23551fff5f145d2c526b81419dc647b6c179646c1e679850685961d7588fe62b02000000035165ace6bab48101afec400400000000036a6351000000000283bf5601000000000000000000000000dbc6a8611abdf64ce4e41375f0b0b538b34eaba3d000c049fdcb5ee7ef0eec8c7bc9b7fd88ee7e0bef94b0e20230cb97b3012cbb167918b7000727dedc8165b7e5b25b05d950ff72ab00130921756580b42b22ce0d13743cbd7443d162596f3e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ce0d4c1786fbf79c7bbf3c9aeb94790c2499e4cea4249886418994b768c785e2ad901b0682fb2dc7a9a192c15e437e4812f6fef793d0fa60b936711f81a20091dc013fd28f33aa52ba8ce0f36d04278b0e62e71f4a5f94f954655c78abb87dfec91ce5c853c54089729ca11c224da2e1dae358b54ecccccda60c4b14ff7e4bbb0207727f64399a4beeb497adfac320e74668faa09520b59b794deb56355351398202306342843213b181c334be21ef56ba4733ee84399e92759f8da4b4ddb4ab30a60a06bf0bd1b6b6196b6dc7df9ba10843d369d3a8e304e467025c76fa12cb4801cae3f49e76b28a44890d88ee070a633abd013240c1e8a7946af7f959f3750eb98e021966d9ca8f6a3c9192df7b6ceb2df2c671795b548fb5e1e5b389e33a9adbb7c802186e146f77cc14ff792f3a56a30280b358ef7d89eb0ae3f8af1fc1645cfe13720330186988cab2162da542563d40a029e9a587c745efccc6d485ad21c6cb6ea3af032d0e3478d5216544677f7da5f42b9b32ebae3ca864f4ba94020a797b6b5f73600223230cf086ea3e718094798669b0251cd1d4c8ea06ff01fa6632eb93974c4de7e305d69fc8924117d0499c94ffafafa2da9eca11fefc832a610a84a9f7e75617de658c5c3e3ad8e147d0d0d97c381695690a2bc0af09f02e025880ab1957c40cbf1864acb3ae1dc139ec283ddfcbd9d9d26ff9dcef21c46029464288c21e06bdcaa4041e10169c2caa4195108f58e348f52e0db1f3ec6c51a0219e4ee0b31e703294fc880f4e8063d5e5cd3c85e7896570df00f28c669ec8716eca7952504ac27da1297dec73b2b10f72ee1dc59d43439bee8105a04ffe4c7b5613378172386bd0f3afa13f2f0248ef4e102205377750f151908596cbcb24354f5890bd3d6dec9ec8e6fc273c1353d692fc26c612cf9b61ac27a4239365323fc9715b130624e38d0c90b2121e3c8c61fccb41b6d2004bba936aa09d92a59bdb7b004dea9d18534c71f9503eb88ed0d5d40c9261cbdc4a730aff1ec007c167e67e75b748c66ab518ad4aa1c0e35acd1b764bdca82555fd08aa9ccadc101b8ae9e492c9d02cd29cac502f826b524c3e9c4ebf41deb257c7aae5922e59bcb375a02571f578c18e72fe09d2c0f0494d8632c94c80aa35fcc266873edb69a39cde5a358b439a6896ebe189e48c91af3dae28f1ea4ed82d2664c762d46b5b5a3cbbfca6f0d505eeaf80b1e550bb373b8f4071fb1fc7f55cf2100565bb059737377f29f22009f66ec6948a52d4362537f3e03e4de1c6144d3bb1f6ffe7720f3f4f1674af57c803d8d685990ddb056051d3080737bf9b2308a0ede840d018b8dbc4a6d97aec346ecb7bc4df189d1307424d16e6f45080cca1edb7bcbd56266620f71e9f4376253c54b16a1c75613a59604112a45245b7a8d5079b4d353dbc855c5d09a01a199bb40471c904bd1242ac31a1432ebd6a4563bfcae824a3753f2093c6e8d60f5ae2c758d3a395534037ddc42f75751e3545dbf7f6aff66c6a48ced21e8635639010b03a84ec232e637bf3f6dbe084b4fd95905264b96d84f6fa91ec9abf5002db59bb322cff01c4aba9177e1602ec21932f46a7ba1e03fe07a3c9fcde5aa0b3b4e280bac96710e6d3df739f5db9980879ec4ff5e8139ae956de9f9bdbeb9a2685f4247ad6e4d07a53e20ab399b0f97679f4acb6bef5c9425d2a84515af17c6430a56ec6b1a2fc193bdd87567b5c6036e1326cc6dba6fb7db2d1fa6bafa7774bdb126b2c995457d40bca04314c19840794aba51de155384eb06537f36bb6202aacdbc33524e7f81b2acf1a0d1c493a82589ac34d7432e3eb42fd29796a23b62c9b098c36541de2d6c9894f77058a2b53562f119572b9d713bfe210a544cf4e79055b1545c0f43932bc4f7be864f4f7155e9f26aef51c8fd73a1a21fbab92e8b3ab243b55f4ea6d3a8d79fa37fb47c2af4f17a5d729ce014ea63ad890e6092dacf53533743f00d09eead7dfdaa6d20df5fa2e5aab16f5029f52bab1b5560b6afa80687bfa231f4179f2c668e8a5faa023eba36414d30b237594f9bcc73f0ba82567b7c78afbb11bc6e3b82202b4fbdd9b7ee41913d2217e4f44a39870b68a5d3629063508929944d11ec007b5e7e4fce0dc82e800ed3843971c38acff2f87e68b0cc3a7e9c8324ab4caa375d99546a200d39faa07f6de868b79062ecf8781c34b34b6122e2fc3c32cb1bd6022c966d83d7036b783521b299d5adcf62e87954a22136c08fddeaff078d515ab3fd47a5d1808b5f880c32731cd000000000000000074dc6c0100000000a5d5341d60739aee5890f0a6715c4fe2ad155f9691db3c07f14f7852a6433c442d9f89e1cc4129394a9bc9cf17706fd6e459acdbaba6f1979ef6596073614eafbf875d09f6ea33e85d3b26e6bc3d4624f13d5076d6647c96462932ef7de268b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000352babdcdceb2856924ef43024c7f2a5249e083cceb1d3631624775e4874893cdea1b64de0d5cd8502103e408cad3aa30e5c0ad3004ea19b83608dc326de88ce248934a2e27288145670b42ea1337b9b4e8e57bd416f3f6fb2a5769333955d00ab4560199290788fd16846c9e7fa07e0c30b5214cd5192cac352fb754d46125e022536a4e4947d17400a44aa1fb8ad3f9cca60a33e88402e8b285b1fabde9c9622022ff43c374a3eaf0441038999a82f2155070c3e083e61e7ac92daf0922eeb0dbb0a01ff429e572f40e99c25e2a963b4f4734dd29085a1c824278d19f2a8277d3a21c8b74f83742dcff49dcfb2e5e605e511b7c727874d9211fc6ca0968712198c60022acb1f08cdb6b115f17d87d2c6b695fea4d00c336bae39cab06ccb153c69cda203140646a4f7d86a8c3cc821082eb8391487ec21f3599394c150864aa6b7320dd50310a11b58dbccce49b46ba97c477a38a10a325527b65b2a9816ea4c4b6a032ef3032634367405ff70b02b6b9ab54bf5619428a962efcc2f844024ff531e00f7dc1c020fb7aac23e18472012ef625107f447ff5169c4a38f41b3c6d8936f3ebd135982d2d7adf21251f4d9e587df4bacdd7046f30214e577be092039355d4b21f24f60d4f234c294c32a18208868af1e1116baf9911d08635d382686e62154a99865fb903f4634710216a6454667a9b33b990b25471d2239b43b71b49b8be9e963877bdddb4f26a2468ef391434d7b8d7b46e01bb8c03c569a01d9efbb315f1dd0617469ffe400655b1cb9e70332945bce7ad275bf0ea8edbc263f3cb6df494c0a7c5c0c77f12c1c3fe7ce60e7b6c6ff8f03a94c2bdb763e37da4914091290adee5b16aa8b9dcef87f1fa2cee16ee8ab6757ba02a359ea3a2ab8f6a3944c2d5178aa5ea4027c27620281eb8b634b493ab5356ce525515507ab75a011dc845f47e503c278716105b396d1a6213921dc71e8e8188b71981ef7f450880c85e7cd76e20c899887f2113b35c9bc35cb9b46be95ecdbdc9e1dcdf8c8e2f0a67c279c83913f885198056f0667d03642f97d6f620b7c4b7ed3c01809ce49a88ac472b54c86929ef5c48a1984b8bed0d3027d800b694ff13510a5dbaf25d12df69baca8018c2fe4eed04c55374aa6476b1ff51deb67cdcc54bc211a22ebd4f36ed5a3a892ed1bd52a50188bcf20c2b8aec0a4841206dafdcd58a70fe61c83aadb6a907fbc9aeac515d5833c20b9b02f4ebfafe2295e3e460a5752d7794a32ead8df9bdf327b8a1ecc80a614d6f98da9370d3f54ea1e1a8d030a6cc113afe67ced36bb200c14a86497aa80a445f1e71557a511e9bcd7bc5dc52107dae97d42bf4eff84ea2825333a1d345a3ceba7cd94a72d2bac93a6a2d2ce6206698609826df9f50ed1f6ff94e468c1efee9e6ad3b2d7316fa4afb12d20d24c617006abee00a244ba4486a362289257c671a1dc5c23ef0b5e9b8cc2f7d2ee612be1a9a0493979c816a48de60c19dc1269dfcf3fefb7c6499f4275bb98a94b7e7d733f39402069d6607803c1cfc6d80fec74762d682acbb57892a2be5cb1d47c935294c87941ef3fd258a03cb31cf4f0a84fa34542ad3de5ed98a01de0adf46e87eb981ea6968e046518d4f540371fee520c97be627cf7e3ff4f77a6d7ebf7e6837c65a28590eb110206ff38121b8d3024d8053f41da5b7613fc1045d57cee9e8d518e1de2fd96854569901b91627eb7aa076fa355721f2f91eaf8ef5362e456015ca9e9c3430bce15e0f3911d749173dae672f11e66c9603bf017e67c687bf72dd999979052b599e57e301335fc31cecfcbcf34004038f214c6cec1f4d032980cebe6095baa576bbfb6aaecc1c327e03aad714def93f121dab393acf31ea89c300a857e0008614203355de8d2f9df8ab02d6bb7f6cd9755a03f860bdfb9170417f57308f8bd53ffe4b2123041ae4d36bd711649fdc883ab3eafd87ac551f4769c0f090af050b22f6c8cbda24dd98fa52fc0d8a400226893252f385cb77fbb9e822e32942cb1d9d9f1f8adb7c4c61e6e7017294cbb50c6d151db53b3d14cff3ec9fe2fba919dd15c8ac00f07109008ab7610276fa9a9b1dec33113f23a714a9cff7b1d90a4a567b5bffbd9300a71da10c9005238bc376e347451e834a7372be55be1f0cbcb2a082d9b68e057e36b66855939f7a223fc043bac817bb0d8b13eea9bc579ee40f7125be7174b6d91dfaab203c1f55dcb653e989f694e81a3a81b6790adc6b07ff67b6d59f2019c7fa260c77077b3ca4abcb65465e36a32d5556f5e89695ff54267ed8dbff228ee97e5f65982b9c53cc304f06a177d022ac56401d093e3679f0c7ddbc789ddcad5aa8af469ffbb6728ac080a0b5a61601fb3543ac697ed31b1823cfe4837704f1b5d5b679325d24c6409a56b15e5fbcb03e0712709", "006a6a6351515163", 2, 580898207, "a6e1af72996ff92393987f69625f1f131eb4a6c3cdb3fe809c44d2641ccc3234"], + ["169d862602fb20a174106e6a04ba4a1ca70bd9dad44a2d6d813e558f97f1e6831818c202490300000003525363ffffffff8c63c4d0143fd600b0b041ae2a929f95fc45284858b49ad7ecce8f35d57800ae0000000007005363656563accc2a8e4003395c41040000000005ac6353536ada0405040000000005006300005146a20e050000000007ac51515351516a9cb915b200", "53515300535163ac", 0, -1331549506, "15e6e3c810e602d421b21e9ed172948a446d7a5c8c5635bcf4c93adebf94f853"], + ["030000807082c40304ab7218f16bfbcdabad7f70638486af802a4aba49235805256268b3ca1a47ea2e0300000005536a526a52ffffffff2219c349c58ac34f3003cd26b54374ad39f7cc252ea6eb34eea5bd0dba78f2860300000000d1a628516a9b6a58bf174e42f8d3a956e033e9a1e9065bf6fb17b446b640319960ec237202000000046a5365acffffffffe86b405f1756b875d0cdcb4921bf00a87baca80381ec127f1e6087c778962a5a0000000007655253ac536565ffffffff027c88cd010000000003ac655297ac4105000000000600ac5352656a5fbea9730000000000", "526a53ac", 2, -949674542, "3a29d54e14f5b8e4ec32931e614a26c3dd9cff4a9016679a88528c3c5c47b276"], + ["030000807082c40301daee3d45a3270be91cefd092b9bee963e9a7b7f18648daba159c068a84362ad603000000016aacabd28804bbc67e04000000000463526a63bcd21d04000000000553ac65636335699a0000000000020052c3f2c0010000000009ac63636a65636a5200650340f00000000001000000000000000079669700000000003f7c2de64b378db991bb517e1500f56789af89a8d5c3bd8cff3dc5f102b7facc8771fbe812d0fdec719cd5ea78a771539740c7d182c7959be65989586880b8684ba97a9f9c50277eca3c25cad69ef68863e63fb1215084a0180be855a55a3a8900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bbedcd84243e27540c10f4ef789c626c6b0e069b67711d9cbf1552b3941a29cc54c220671a8beb596210794ee6dfa37d79fa81591bf23af766d91735c5357239eda633f1a771cc240ec2904c96d1ca0ec487f24a0bcaaab66fb7746f872d5fc7d0c21cdc289e1501c37cc53c5578f7af98ec5d8980a442801cf9ec458a36192603191604ced9223ced051494f3ef0d316fce669c1495c6ce4e9e331e332fea69210212684453456c40ad2bc22ff5fb392752edbd255a0b59fd2cf89343da9d5c7f510a05d0b9baed81514cb62df8d655edb42ce46aca4b6e676f683816b4b82f129a8f2b92e0ccf5a92f18c591a8344fad2c316537ebcc0b5aeeee5bd5eaa716eca8d2031eaa03f7b03ae5f908bd777d0036b6329ba36dfddd7ba75523bdfcb084415b48031235ed9d75f2171764551c7b3b2dea68200739b0cce14c43a19573f0947be26e032ff4ed2a788329fcb97b2ef48dba0860646c7e9c6f6e652e3e899411e58cdfa60324dee81e816e1556b554726f47015c930916109a63b741a51725a03ad4a7cc590317f60d1cb6c49514fcb57a24d672ba72692aef55ee77bf5730e60364e4324292ab010e00063b49333a2cc54d734f1317568b977477c058d0271836a36adb147a8b209c65853dc8e183583651b06770447b1ddecb6a65a8f7a34149b5719b066489e0be70ba82a3f7134baddf9a74a92f6dc8413c1b059685b068bae6c0694d3316a03402d61491c7214d34f6f0eab70282197b5db1dd5550eee98bbab2dce9e32190dc7a2ce0ad299cc3b364259c1d8bd9661512bbe17b05c902bd1f32dfaf8d6f86306142d11658ce47e1201627dd656d5830e26db845bc8ca9688d0b22dfb2b65a5e2bb69701f4475067b644171856dfd4734e99a229978a6b258f4dfed54f6c3eb30be136ecb7e9ce568ea45e006f93676b98ce28bc64981deb7744a30b8133497b4bef2206ead1c81e9c66d9eabdcc93b3c76daa320693b27781022ee5c5e8bc57948f50633496a9ecdc9f38b589b7e9013ef723553eb8c0b5e57e6e9b2ec125dd5450733f3f596f5fba4cda310641e53d06290326b27150a817d3683e5672efec7295e2f494b207a7323b9d6a6b78bf8a3fafdb11707901bd4589eabd01aa7f8d35fbdcc5337d1f74e6d00e348e51c1390d920be3abd1beabdfb0fb4083089019bb56bae78ed763f3dd6fa88c4c4dac28eb200618233aec14cb0fcc9c68a670a8ae5688a18ce9b98a87a71ee5c20c4a8f9771b52ad46774cd04ee57df672cdffc49d9d5ffbab5fe3432f436a18ba48304af2b78bc36bdc31a811f928929618a80367ced9cb52772ab93a4fc342eb30be76cd333b5ca92c50f2839caf8b7e7fbb20062031282027e83c87f2cb1aef1be1ee78b617915d71aa1a3a48c8dc2f30a5b44f6852ea162a199240957c22d797cc7dbdd1e4787c2277d7cc9aec958c4de3943d21032a793354aec32356836f582b20eb2401b14aa8b6bbc739d6274cc46dd5650113db080bb960d1c5a9e8b2881607f7d85e14eaea53eab8a7e44e3989e2d8469972dbbdbb1bcf672ed4ddf9f3b3480b791cd60e0679695a28eee5b30ed2f67dc9641cd19371f435d2a3a3c52269cecbf07b402e25a8791f66284ac9c664d8b19c594bd223d0ace9e835a5d5b209005e2ddbe916a21880d7f685bdcc81599d0c1dab67c703d63a181b422ef4493a9eeb7d949278e1c6854335b6e6a96ee25a1a9c22419b1805565febccb7eacc22d995d193c5f8160604e636e9d3b6362723179658def199f8d8b919fb458004aeb2fc1d1d9b123621b7edb955418840c3c0a52cef80efbc5f6f9c7c468ab6aa147302b7074ce2f0cf64a7e9d8871f2832ca864eba85fad6612c2209704158b547d6298147d0fbe02c0158f97913bd43c201d79d3996a21b7fc595e282c5b0c96c9cf5000387bccd7a4c95a3d0e69ee1044171a19b2fa4d0551aa2f4ac8aaa59c8261b869115f383c76e8b6da91b3301ad619c750d0610b8c6cf8cc4ed49cc39febb42585c5ae3c5737bbf5e12c9fdb10d5b6d9156e13c57065dacff83ad0d00d1a15a6eb983c0a170ca61a39901d25bff0950322b16337392bc6055266cd06ffb56de9bf7503b2e710bfcc7a4bd929eb14aa7ca5c2d549b8aabc7ba9c1f1e690fb69a68091deb42d98f4df99b55550ef51c9fdd81fe06246b50d2b003983036d177f3cdc596820289303863e782b956c539d6d2919e7bf92fb3db2dd6f3ae8ffedaeb1f50079807cb89ced58c1563d1e2b81cdbe40c23adf9872ac129c183156b3a7ae25692a62feedea9a9e80302cb7478f910b1135ef8ecfd2b0c93b08c5f30765633ead637a25a62f7fafad3f86bbbac8ce86022291c4912d8c5771e485cb8be1d9bf144f9eac1cb57753f6c7c534a1dfb1bb465c889eff7d803f1199ba0f", "5200635253ac5163ac", 0, 1105850581, "43da57bbdcff50879d5612185007a0642633ba1918f87f4499eeb2c832bc6a55"], + ["526fc73404f5a9356ccaf5b3d91252083ea12d5e7bac8a3abedc07a0fd4f41b9e132552cce020000000465516a526c8cb639652025f2b870e2622d12907ab0ac3b4020d65225df34b425a794822668c42824030000000165ffffffffe82886fa548bd914e3bbd1fbf164936549a68559e746b8ddd4e2e75e3146a6c80200000009536500536a006a0053fa002cf3ec129066c7f0c63cc6ceb26c1be4b502d632325811af36c15c8f16ee2b7ec9990300000008ac53515300ac525146bed169015f9a9c00000000000016a2e80602000000000000000040865605000000005faceb17517b004ee326cc6f14909f509a10c384897dac8a6f54581e8154c63c533a0b230c89fca7abd9c77dbad731b9d05492cdee1086ea75fdf7127d6e2484f2f50a491b4b745527601d4ad9e25f9fefbdf277602080093980eb409a92262b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021670aa8043f96e84dc1d418408107a471d5dee81b47a9fc2eb7be0520de881db1df96a62bd9b82ac1a22f3a5b7951ff73a6b26b0e455d1f53a178eacf86c25dec21124392c7517a860ee631fa29967e3c09b75d2fe348c8658641ab9a3348cc5b670967658804e3be1f73a0ed26c85492278de2fa21f69ef43518d644349b77032929f48d891bd86dae149a6656a15131a6829da9c24632844784a2c24deb835c02046fd51c81eee5c401a70652003824052368fd4722a61e5fc6d0070bc930ecfa0a07ea64f7caa351c4ab3a20176f9782b785eb41835820ba033fde3cd4bdfd4ae4c0e64a4d9473ba0bd96c1e02512cc8116f451f166c0c388acd9e2c5aab08ea410321d4c189e5c0fab1f22b95222d491f6b1dd2c0e6ee81f30589af2f1227c9c0150315e1e8f685f85c643a97925cf92ee922e4b9316fd09d48cf53e2e7dfae96a2de0315bb7a9af3cde0ee69989ab385a9c0add5460b6a8c102a4ebbbcc06251f5c0760200ae7f7a779e46dc5aca07a896c12b642503990129332be0bac6979dc7235d690219e423a4d54d1ed02f1169d06c55b15f5e93f5ef87a0e57cd89987b9ed41b807d8d1b682a87a3a1dacf825c10cdbbe8bffb4d26a99fca03ebe2fcb593c4028e4c58799f307b32fcc29cad7c1d762d0da485ebe6964cc5392e48d60f28f66b01b2e0a7b0c5a1b15865ecc3d618080556bdeb7fdc0aa9b4f1286ff80354df69cf15d866a07db2531f3ea757c968b65246823e90a598e141530961c584c2fa1747d1425ebf970448b439ef73fb34bde3d5159e8df63c9bd83a70e2f25481649c09a870c90f57fd98db0401bd44b8322128611622f96be7e71f308f9dada05cf7d695231754d818c853edc065c2da05d98f8e950042aee4075a90f3d4643e63caa9a0d89e1433cf79a481ec8c6041f130323332f300adbc6970cc281b0ddc573f66f76f4df0ff61744b5bf8ceeb5a59603451082fcf9608842097d65a4ccdde4797ce6659f5e969a41cd6c3a64359b854749ae3fdc32661501edff48c342d32ac39577b01b098590d28c7f7d3b85d6dfea5e44a38853eea35878eeb50f0c8e751d4483c8e852f288344ee893268ad54ca30415f5f3dcd32e13113be1c79562abd99de6eec3b1e0bd6334aecfa3768fd3ead0a405a8199b622ff3151ee2f9028ffd1554a871e60131da144f9fa9fb3d027feda64d93f783c1f1e075dfb407f7b5b7bf3f1dfb008b250428bb305b67fdca3940b9bbb3185fa6993a5ecb90ea2ace4e84e4a5724913b40a81abbaf3dad89b60ba917954dd3b9ae18106ee09f424b4da8c2ecd9349ae6f56cb183ae5e2df0d20bf3a2e161da42de8fbfa97b3e94be9677d0b704dbe45addb8c7d756e3a24a606830899a7668bccf501de8f70ea32171ecc6cfdd1c0799560a7bc2552b606f96330ecd8bf272edc26632ddf9564e792ee4bff5d111e8cafc6538d0a33773a0c6c84f9891e2ff07e4550c4158f24b7c992129d498726aedfa728aa060933b2fb56e02686d4e7f9c9f30a35fff324a00756e40ce5202a91001462cefeee626f4ddcdd8197864467518aacc7d15ecbe10dbea15b6b47b66c7e052840786d615779fa14dcf23a13638e22b1bb3459855d9cdf8940f129956ff5018434f68573851fe8de31700788fa183fef58b9e973613dcb953605334979c033c2e7fa5b9451caec073f8199696e1cbd0bfaec8aba6aafdd04aac216a0850fb2ef3e55b6e74ebbe6151f8101491fc78961333f3643a60b3334d7cf855025731a27fc5b1836ef9054918fb6dc4fa5670dcfdee3dcb55e4ea9bb8d1428a6008ef7597693e746afbfa7b8023d38041e8117cfb1e12e858b5f5f8f22a92f6333428743256f0cf9045d680a25554382c3e4c79029c4d2605c2e9081c8a2203c8ee40e675d6021367039a028e296a9a5cb9b23b275f456f060585689384dcb79bf24eb34645c74890fdcd600ef5f6f384f672576ee6326c05405b9675ee9128363570ac9b375dd9d0b62cc6e967837e47a9bb234ec7fc987e61ee5af5620b3afd870b8883f5a2aeb0e8daec4de502a47e2463f01f757dcafc120800620b8453b581079cb35ecfcb249827d88ff3c907dd56b385647d108782540094ce9c14c3e1169de4d09fc4ea2e6534fba97332f7c8ea40f5d3b0c0a7421766d297911fa27cdb9efbbf357d2c16b56a3f4e02fe154979470feab6d7efc8757af3057538c4370c86d3c6658b1aef1f1f9814d5d9ded6ee4bdd18b4b22620da9e5f1b8ca5104c000d2fc71e8db6d8325669de011bfd76602000000000000000000000000652c8660f0e622b3822fb1c195439a11104069907dcaeed36932300b970b658e1072c995d5be3b6ac921452de256d521897d630ca6d12ddcba7b640e63b7b9bb368796cb6bad0a395a512b3c9e780b572bc05cc7dd51ae3d1c3dd404dcc3be510000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061f47fab5872fa7d4c92fb05a6032e50c79e25012b103f8986969c4b6b5c053e145861b23b6362b3626e89484d69f4454e55181212ca3acbfdffc6b3ef9db2c1a87863d5a12bf4b3db9ebc6213db7e41a6523de9628e78fc43afc8d6a619df9dcf000f6e07d2d568e17af931c6eb8c6726ed89f56039a6c1c9a424a188f869b6022c7d7b81634078cf9b9160b7b53dae56ede205506501de41cdd945a552043fb4030052bf0826bc41b2a6e792e67306c98aac0782c0621464734b653d4ac19318360a08eebf6ab7d7ce5ab61f05c74e097f8f233b407aa6f743e8cac12fec95647cfee5a5f90b776a1f9e4597d53d90fc7d3d944d1fa5e7935a1976cb061decf3e0f30306377c7845eba6085caa14669015aa8cdbe42b8d1cae8baec421f513a4bc41310222ed73d9fcd600e844472b8dc6eee8321347c04a2f8d7e169fa2fef0741ca0ee0321008d4c3b00d85a65dd712aa0c801394b6e23daa0f56193ce2d50f1599a9fad030a275f40af835c496be7c45dd0f26a685016cb02399f6ff5e415b3c0f3f36e24021af66357827d3ebf6883a9f1227fdab743aaafe9e35315f76c1c48f8acc1b8a69b0c251f99ce0ac284c8576fc1a27d3664ea2899d70cea755fb1bb8a81750a9eb12c20176fa2995cb2e57d30a89c84e5bdfe95dfce55ec8d0a4e0326a63aed3d29d13dba75ed7707c049ee36291b43b5a3f58e013063173eb58ca8e10a75d0063622ef83a8d52a78ff9e71f67ccb66fb0dbce27af486519307aad9fd1cd8ef3e6cd9dedbeaedbe67ae6ad57f7fc7010ce8b53131d854505557d8a7a7d64a7a31a3addb80a088b70c60bad89c15121724e03620008a3d5c632d1e5f5c856c72836ba1e88a657f02fb43b758f9e5b3d2728c27fea7955287d8a15d69049a9322c62aee15fd342203e1cdc8a4478bc6de2d6d9a0be463cc997344f9b527e14b02c843ae2087d53363871566844e3eb9d36bdc4c1e7f02065a685421132d3a784609261a6fc3ae87592c37a0446b03659b00b880bca6ae40c486f6a650a136d414f934245541fd00f31176d32e85c1a0d192fcfda69a4c0e943d56633815143ad16652fe9f5dfcb8614bb1af0842f6c6d088618853ba9137f8df74d93202edaa0d4d20e26e5c53c969ee4693b26ba4600196ca866c842c1eec13a6e0ab082ca0c1d32d6fc07b09e3e64fde1c3244dc36a27dc6beed60c685d06bd3d2409b5a10aa2b33aafd310449379c763fd83677cc9592fd02438d42c527ded051e8765b29a23d6e4b204cb75a50aa5326546f75bb2509cd1c4835e86e4b38b7efae3ba369a34579d780e70c16edabeb27451265b08341870b4d1fd3eafcf19fde59bddaba9a9c7ebff48fec467e9b3dca672a857bcd057a3636e005c13e5d5ff42c90ba88c5c42114694d51e9cab6773cb3f54a0d38924ff4463698f64673f7c656144e8b0c9f8f5534ab9cd1eb2895f403b0c7e500b92d631ff2d3ba55bc653438cdac8a58ea831c42119b32e3d084e893f6888a5dd8145ba581b10cd5595ba6a597abe1c9b1f8b1c577f0a69017c7d21871bce2ae7b1ab50f7606b54d04d68bb9a65354e67d5e43f7eacdbde5448a4ab3adbe38b4ef9dfdbe3514279569cdef01211233a8ef7ccda3b4fc9826821ac0ad359d279846b76a4bbd317a5bdf8ee62a1458ffcbc0f2fc35bbdc2223fc03c3e630b652e1957b268d6f5e2e75a51a7f01d17629417b1011ec445d3500b956d1cd92cf68e125f76cb3e74447891eb0980f8776a9b7e782c792b1036ef569c973add4384daf34fe0de81d1b8e7f710235a848e83eba03caa84d96146dc7de3de5be7685446dbc1f12d46ef591dbce57d61d5491716317228e8158fc220c62c14631ced8ab1876263f6967096b1c5bc037f4442282ba12dfda4942789a01a1c1f266a58723c15780aa0a195ecd3d27e90d295d8e1e1c08b627c3f4559bc0d12d1c7d97984e5d288a4f0a4de9c8500a03b176dc43d8fb8077e86af8ef6cf6764dff0b82b5f88eece08444b2c6033ed030a70bfaeee13ddd079a439477fbd31615af9a20ce6040ae7dc0afee63ec1b71896c38ee35a6b2d0667de7d8e0afef957f7e4584cb519e5acb3bcdedec9d953d08e2e1bd5b3532bd2bb98d5675731654a34122772161330bd58ded0fe175a4d4a35a7b7100fb7da53fd98e82b4e560648391fa381c34dfae378481c750dea8bc3c8ee26ef3a8aea317c1c5009dd2e9bb03074d6694bad2a79d13908b730a7679f8d4e3a650f626fd4371746e8e2ab91d89fafd778850e1c77712c110af95fff386890bc382efd87944a9fd0769c2f3975fb807874fbfaa9048fff033aeb2a6cf243857fa79d3f5dc0abb1a90a646c3186356d291c2e784da93d619eecc4898badf837b22da2638057e2f2500b2397c0a1491a59823f944494e07", "63ac5263526300", 3, 1024262495, "d40351da077fe3e976063611083ca7cd7fdff860416fbe5ebaca233bcf92e3f6"], + ["030000807082c40302631ecc4a71928258a5b96cd9d57397105c5bbc063ffab1b7f9ce220e585052cf03000000046353516affffffff26e8bd2f70bceb2b341f095248235de8895aeeccebd93ad06ad3925d8f6798ef03000000045151ac53ffffffff04b9d3ce0100000000056a51ac51525bda8201000000000465656363d2789405000000000951ac650053ac52ac511fe28a030000000008536300656a6365534f581e0200000000028b35e803000000000000000000000000193d8c72e8ee4670e6d8ecf96c2885aa513a42fb7895389d789e466b695f47866bb33ada7cc51aeae8d6bad0a022ca17aacc06bd72f66bdc3e2492911bb0ef0fcdc6cb483a17c8f9bfedd4e40230577c635199d371b2db0978b48687e3b991a30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042b5d0bfbfc045ed90bd10bb8c33f76ded2458c5f433ad9facb4375b82abf9b9c6cabb2047d8c146ca81ac399b3880d555af138655c9f8197f78f6a2dbb0eac75502fd8ab5cb1dc66ff789191072c367a502beeb0c914b24281d668bc3d276fcc220bb0d673792e364d06394651885dc795756777264f12a8f93244cfb4a3cd202038a34121ace5b9bcc9f4b2e9619e06fc27a4e27cf9978908630dcac941590ca0317d5b53349aa6ad3f52b1e7c60bec429cf19a6451708918e7e42fd2f40d399ea0b0906b691cf95fbb891a0492170aab25201c31efa8153657fe7414184c8735d4002054eafbf1f26125ffcf85f88de5f97e0594b849b56d647060b64e82a95adaa020d856b057da3bbdaeb86c661a88e1c2fda0f150add5716be6fb61b19b87c1fed020634f36c8ab0ea96cc149477a0bc3a20eb5c638ce4c5a286ba7a2d9d9348c298021f21337ffeb6b0ba9246269f0a1cf83123a9dc6bb4586779b5feefd07134291b020b39c922de39d133ada674556fb8820326f3e988c83c38608c995c9bbd0c62ed02069ef2bde4de9c97a76660eb6bcd7928cc44acb39e3405cc28e108e74407f11567c9e8b74238dc086d025caa92f1a72ca9a21ebe389af859db9966b655a3cf7bad657fb539e5f592f3edbd44e32f7edee15fd8380b0f34f455ab5078600fa16437b44d26a45cbb0dbd3ff10b6182f7059cc1c3169a1d6d0fc3b7ff2eb47552e5088357e488279c21af325bf695d81685f1ceafad154a70b01a71b6b5a4ee2968b4b9028fb93779252279ab00279620b1724d1390f1c351d3bddde7936f27691113e0e64ddac7f31564a092bc71deda33517b90868ab0d63b9b31d73f5089db2c1a899ad7551a3c469305d9ad3c63ec4ceeb6c8eea0173ec439c2f480e62bc9d1a7bfbfa04c03fea75715afd44b9741fc60a61ef5effbabc54f71cc8c839d1f26904ed94bcfc58e63a31e2cd535c9eac436523ec71db5bc0c4d686b776977caa2a13d7014ecf92f90de8e96792082c12545a7b0480fdeb5218344742d5334f4728dfc162ab36d83ba5af019d1e94aadd0b4c9f306b789ffe764e3429eb368698cfb7f7a450de9595c75b9a3febb5f55bbcf23210147be9ffee829b00e93413340dcd1c1de59bcd1bf54118e8f51e76866b1399e1dc9b34273c1751876470f1f3153eec17f55d682dbfcc8f40b85c662510873f091a1dbd872e8cacac51dac5177336e5fb628839d6e7bd963b5430774d0edecd684ec92be50d6ddb7b38a113df5a2f5e1331c83594ea5585010c854c810ae18852120928e0dacbcb8a9f1b784cc181975b479f5edf2e46bafa1fa5d34b4e9f8b297873f0a7cd2248f6cef710f2b1cd1f51e3ffbee9f93a5fbb01119e722695db8731e6e3593ed44740a38aa0ff471fcace8eb39dd3455f24a3fdebd36a1111d3b7ca0a46f3bfd5cdf818ccba8cfd3d3cfe7897d8f9face1678e6bd57eacd6372548210419026b93c3dfc04ffc40191142077917341234d6c349f16c0f8fbcd5809e460f5ee9d16f757ddf49b86b9582f6404390ce8e5e17aeeaf2fd4776c31641cedc07b6c301b4df8f60b92410ce49ae9f287f168d0bee79d9a8ebf5db9fe78ce24c6b97a0f962cb19ef5920bff94f2bd7ca86d6dea531203f9aac97d53a4847fb0a1780b0db92344c6f62c2f1d18909a56078d2d3eaca632533582d959177dbbc68966bd03763b8921e170515c8bfb4be869d66b9be41dbe70b1b5212c9eec422b12a88fea9815b0ba44690e649a930809f5d0a28455f772962ef1065ae5590246b570843688aa7059c6920a109712e9e93cc29bb86f602095dccb5e4c53cf9fb9c8ad969c59efc797839bfacd96e4ef17b2b6a21be57d8daea77351f868766f0326856d22f10504ec4b78da4150d8c093904763d10c2b54e146fddd6a1f5f1ec05ccbc1dba09a65f82c78ba2f96bada02303eb4e8e923e6e5237d4e69d4101ff74385a27baad0bb07751955e8b61e759998e8de6c62a9539d8aefaf39d78c1a94af9e6e25a7ecfd3e229b1669f0d35f065a6eb8ff18ab6716afd4a308575bd965d13844c1febd594abb8094c886d13592248e83902d61a753b2a7d2716e65803491fad510de97dcb0d6a6ae0fe2f908a2de30e247f734956bf56a964eb7557a8708fba732049eddb2a59d08a4f700e204aff810d78bdefca33490852f62eff59da79b6ed8f54e56f259575874e33aba454913b4d3060ad812ac7d93548ad1e7863f00ab440ffab99f78dda8adccc71f1eefeb99ce107d5e332cda9f88f050000000000000000f6436f050000000073d4b51fc7121831ff743d63de692a3d23cfdb0ad53fad028e7f0295b4b3e97db979c8d742d9a0fc0bc5a37f4604fe20b80cebd42dd5f06185ed022663a28a49b2083d3b22767fbc1f7caab1a7b63afad080d70b422ca07273d3797a341f91ef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009aebffade2d054d005cb3bf9323f3bcbf3f55002bbe4763d67a49f2fe506ab894cda3946f2a860a8ab2403dae39692c0b6aec0de39387bdd8d7e31f75df4a51e16857771f574680b661855450861428f9fb4e48197db6b5441d43f87b45f140c34e8ef89f9e8a687cc5df1b105d3b02b3bc9ea66e45cdbaa5859cccbba99040b0221d9faf8e3408ee01bc6030242ed503a2e557b321c0106626a8654533ca96e80030bc3b74cabefcbc5f3f63722d32f09fa1a0201d3a02d59f2974f751db9ee33650a076b9e26ac634bdb6fc50db88f53aa85d86068fec756238c6bc5691ac7d2ecbf2f053391380c9f7dcd1dda6735a572909b5484d8d189792b028f7e12dc72a45a020e84c8cdcb5131327ad640e47498c8e4f53b32b8429fa05213e4ba39420d57bb0201eefecd1640b3a9acd444954668c55e595f12a3610d876c86770fe2be24aa51020997d8e3dd45d9e6f4f564df86323b3058bb74154554d3cc60215e7be8e0480c02299667f584e9e2b11f958c11bb69c64201aec77278d35cd48a8c86a90c5323010301d169254901144f59e03f3d5bf81f90fdd85040c49291958019afe41f4dfac24f18bbb1f7d30b88dc8452d5322609a310b5d5566693926d91b8a32738abfa3c4d3879a9705467d48141f055936e7ec3382f3bf0c58999beb457d0c214beaaf6c3e46af88bc376ce8329be2bcdf0a450305e1b3ebe21f407769b5e72628cf7cd3b027cac7dd77c05ad997ef9b5202a26770135abf2d52cbd453227bc6160722e5780d447ed3ab831d24d931570f94af41dc5a53f8b2cccea55b7bb4b16bb6ebc0114ab8fc2dd1c5864ec4555d69c1e55d2fc93411d70757a8b25e2dec2c3e7808dc59b8ff03c912fd5ca742c6ae717b8e6e2d4f23f29647a0c796bf56c8614402ee23517d107408e5f064af6149c58a84bff3e31b3abc1c102e1b88ec0c99e61cf5cd97a4e868fc578b296d1d1b4538f0b35fee8d403a7333fa332498ddcbddb138322ba3be07e1cabe91fbc508cbbf99e844864008f53738cfd752b97cc01f9135513108dfe90542060a6b08e405ff6ee755db66184b9ed43c4a0d62349f5eed4b46bf410effc1d744f740d214096ec827f4646dd64a40411c019c85d309a4c7a08ee990e6bceaeeda56c353aea3b0b99045bb489c6edb2368df8f1d87e2f7b92a120fc59500fad5d622fc38ca078ef8c778801140daf20ed6608c514cbe7770d8655a3542fcdf29c1e570ac84668c21c93249ba4aa66f578f31ca80ba38c95d037d46e8f8056075e8b9c657f2ad1f758629644a755d6841d6d4e065a6d3ece5dd03d7be2e7885eb3ddcc3b77aae3f500c7668e00851937e0be0d05c58149386f5e56fc47f6bd321c080e4cd2b8962520395a0ac4eb1bc864e32bc16daa6ab31347c59f2e2c3b159ccd975054c283b91be36f148eb0185cd50f99af3064b61ff7ca7f8f5b92d7d42b3cab20415d34c54a1673ac86ae59ab21627065330a9962da20ae88aefe42a10505c2104060b237baf6b09823fa1ebacc6c8f7b9269b6d29b9826ce3bf61b1b7e1cb1f81fdc319a91fb965e75f74aa671bf9cf3f87804fe96e1f1d8b00caa3b036689f23b55b995190cf51544f637b313b50388c884be9434b2bdf004c7c7ed536f1ef4232fc316bf519eef217d6e040233d961dda3eaf5fd54345f2f40e2ec36fa2191d955b090412584bf7c6216d71b88f2ab4619f0f2e503675fe571d09e64a4fdd151484aa26d6df062ebebddb7d099279bac5d06dc6051911a9a9e21e6ddc2b414b84f98fae4b989f8656e5404201a0e8475e3f844cf1e82c725104552f3119ea254fd2e14066e2dd1ddbbd2f24b07420098d9b542c33f0143ebc6d0e9bf9750c676c281636c617d26897aaabfccf5ad9c0d3e45e2af746f0b4af95b709ec5df46b7e3f92bdae72e19f2304d839c5df46c108934e5d2d3bf84ae43f23558a3614da49f906db5de60d4b88c8de3ba3c06bbb5d6aeb7de88ceecbb0015841f6a8102b692f3d0d17713aba68ae5fbe9e4740ab09889e35fa49a036f9a37392d51a551f517e244ef2ffb3918a1e37f7a0f5baa2f4e09ab9328c1a9640a677b0938136dc46676fac102f947972669424f755cac9d9bbe3103168d57fef1a57d31bfe9e4fa4ce6d9be39722cefa5c3f9237f8289804c22de7dffa4cbe922d39a60d0677d9bf799e6830ae247a843bfa57a35965128a5e827f8b72a5bc929318d4e4d0a02f69b94b24750139df3c51d19d1664457e42c5ec1850055895e259aa0893d95ac94b898085e6565349ae591745fab06953670661c1ef666fcbe2954ba5bac206b97c1fcc7ccefcdcb8215b43cb2d0f8db2597988bde5d5b978c131844a128e6b40bdf65780095d9207cea4ae41433edf92fa4888f97a4a6f834a9090665dff81bd866c2d49c0a", "636563", 0, 914316945, "af5f017b43c2a3cf54bca7cff01657ac73b8729a736ee7fe2ef0f9b55d0cce40"], + ["030000807082c403021a6a2ec0c7fa9d43f225301ffc0ada3598033ff8240d3d36bb8af5efdb2ea21c020000000151ffffffff536d9fe7eaed237eaf069e7b699e3fc0c2005c6423f7c57e1911a8959fbcd4170000000009006aac5300ac655165ffffffff037e2c6301000000000800510063006a53ac40bd17020000000002ac63184f980500000000056365ac6563000000000000000000", "65ac5152", 0, -80746578, "9e03e767f0df9bf89d5c3bbd320a3939bb92fbd3ffc50d62455d94d80ae688b8"], + ["87335b58049cd15bde499ae1026654e64028fbc02dc045b3662757bfd5a9f860eef971df740100000003515152ffffffff98dc40d854b366440ab717bc1c4c6791642a51017b4ca131108ecb1281288df90100000000ffffffff42e4eed71ebc806371cd94282b5bc89cce2d78460f7c45a60cac69248e6202410200000007000053516a6a6a815ed7ea60fb8a8393905cc7bcff5e47b49c38abf53b7b64e5bd73c7159964bc667465940200000005ac5151636324162ab70134d3ee010000000009006a63535351650052bcbef35701d3bf790400000000000000000000000022ba2e0de252a5c36543a4938cb825f481e1b8c652282c651a61629d4ce086975022ff4d9e307b838012b748dd120ab16fe0c9afa67341eeafb6efde6c87d0f5e66bed03624be1eacc93925fa8fb48006f15c1fa4fbad5afd31be796d8021b530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000039deb265492dff6b144d4feec8be539cb0cc80df94c88845ef62eeb93a835495e8fef215c7b1a811c8ab782dd7940cc897687e42f25b9226b2dc8769249a3dddcdda1b13bf5af0653f567e853b535a907d93d0beaef3141241e92de10588c10b8e812c1e35cdbaa8fb325bdef7ef7e04138b7516b654097d415683bed558e53b032d5f32fef2a903e83e32837feaa8830d654c482da58463995dc986c11156240b0208f2397aa481d4a17201e3996ce930f90227de9a17a9b71fa9b111b756d0a9420a003d7724a9821ae7db1b068ceb76c374e20202c73587e5d4e409827aa537e0e0239bc6f3a4d3f14b5827390ce29c99da7159e915d39f1e68264a088c728ca25e020029e0dba8ed52e15bb8be958a98484d926f8ed322b4f8d6743275e85ce74274030f690d2839c4e71dc1816b9b5b8d33fb5314d1b738df314926ae95122e6d29f3021a42dbf759d5e3e4deaec8795addf54618e58ca2a1e22bec41ba4195c0b31d020208a170d4a4cb807d6d80f4a4a895dc054749e74fc0512d987a762e719d87bd19022875e5bbbaacd7fe1d85322b7925afa3f999076189bf5b48a97365dfbbf6b2ae26f86b40a64814b3ffa5b8f95e2c2e140ec6605342a408ff537b16aa56f8abbce40b973f78447ff24cc2d317f0c8b3fa3221649c3e36cda52ebaae7e2ca74e948a42d02a39e248a94507c7a5629ebcc8a5465b59a9d8e04cb321d37e4ba405a3ad53654cfd50e1b36661c99cc11e89ea7a4146726d1509e077e863e37338573eee7beceb2c1fb6c4e1569876b30ed8a99feb5acce68ab450bcd2dfe569962ae8fb89987b8766394ef2c34c57edeb4329ded8cbdc47d661a3820ea232a65511f0c7184a11b7319df5bf5c78b7d03ec7e3a86836653adbad2e406177a057cd800e431aa1aab9d854be56351cd90091f6cde8e4bf33fa75a86c70fdc2b680c9b8a63ec9ba548c49260ff84f06a764899f68b844f9aaf97c133a0c92906c19fd0fa587ccae19d16c9571c7c5719694f6c70fcc79fb3b2367f31613f8f6c0d18f63a5df716505b8dd25f823312ade86d03ccaee652dc4e52c0b27a95e7a46b54ec11f7c82281e4f91875ef7b5e3ed4799e09d37549af822346883f5492ba517668fcde57da9bee6777c7091584e31d4920afdf9a05b529a117e03f4f4d4955e8a5fd326c9e2d348922fdf7104cc0b15aa77355c2de7a703e35897fb828b7225f5158b803575329411c3bdb205e5aa2de3c77b1be77cd1af7028858628e90fe6adb1e6a86a8976b6a772d5b0c4fabb2122140aa6d117589d6323e79aa56b1a8fd7f4860e7d223ef237d9880bbc8966db7628cefd277da6a4a437cfa55d22c4779793107b9a6982b5da66b1a11e9cf2454d016cf39462540db2512986f3fa96979200084ae044b15e603f7dbbd8867fb39b9a7348a1cdebe22b87113b42a46eb9f7870db49cf884d1096422140c291893928e2e1fdb267b065ab472a74303bbd24f57f1eb7f11cde132cede369fc61177ea5fa0b3769e7886dd58ddd6a533e757a68b181e7d558b139c4250577b15c4c19408b6e6db72ca5f7920f61ae03453ad856af5e34d2b0571b833b47a809674bcd8d20f8eb00e3f8e1ad29d53865f2a7f2033307af87b106db024780731645461a99bd62d9765de229e950cf81c769c92b83495ac7f428bf6ef10c0e812adc6bdd5e2604471c7c189461af3ef194fc9e349f15c43e2a39f63239974c8ad824b40da10c23d3d23273b4384deb5f91ee9bd7241bce92af6ec30a50b073a7a9b90b67be886ff85b759609a821fee9f0bf14839b88b4b74d1d99eb827aba17ee38793ac9625464ff42cb9dddaf8fb23ab70847d8263386a04c0f9499a465342b8e9ca68ace3f592e51b511a5b65caf9ee0e45768c57d6dbd5527172e5ddbc771d2d3039f99ff97311feef78b091489f3e1f8def11cd6f31b4c4d750b758c97a7164f15f3b952ce785351b478563856e84ce326f8aa0cbefa04d5b01a1db52f4a228ae38c628dc49fdce68cc0a2264889635d271bd37d2084adaedb06a3bb875384f6d604b9bc63c8bf658555746a5850782474a9f351fca60b9312c38f0c01545dad017ddf7bc3fdb2389130b9c53c1272a4a9dc13a6df1f07d45abe3a2bcc2ddd4c08f3bd23bd4bd8a9152dc49bb689ac70f68ac5725567a8211d24b342abd9c353a1d841b87839a83d0d396a4bd3e42b492ec2fae0203344a16b75ea0882188b63b148a960c8b58aa3cc0819b125ae0eca28a3fe2c42d554de454d50eab6ea9be59b087eb4b50654d6033235f929210140d94074fd28981836eb2c048b0d923a98de84815d145ea573f9778cc3fdcf1845e28b5db6aa19dc18ea5c58a2ba5b59360421bfdb694c3363230b835dc79eef873ec5f09832f8af82ed551c9f84a12e7b6c12c19eb00", "635363", 3, -1492128473, "a28ff3d456cd132aa46334627685e61058b3f5765f6c4de81131f367192d8d50"], + ["fef844000126eab60a32b6927e449c90251bc79d88bdf7827f2d47b3089f89cd855c3d87430000000003000065ffffffff02c2e0bb020000000007525251ac00635120f8d20500000000066565006aac6500000000030000000000000000ba174d03000000002f3d2b0a8d3d7288b6dfb6956a0184c59799fb0eebe135602480451a2ebb31b3546da694d9ae3ede2ba33a187057b5c78769a3686057df351736d78f2f7581627aaa61f63ba381128ccef2a5f512be63b0a70d8542324475919b1c7c92d4899d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000778e10e1dd0a09fa706ff4dadc447b200cea874ff10e74302b0eec13c5dd3262e0c15d13034ab25a2923391067bf937e219f4339f9d7637510426e2bd7e68f5a35a61a8159b815d0f14a1f9e121c3abef4fc051f290c941fc4d1506335e611b26590fb9045e9ea7a1bf9ae841f6b0f8dd21483e4f1606bb7af14e2a729e654a90228ac736da0dc203511fd6d1ff9df4f6b88bfd90c37316f16f86fde0accb1ee35021ad3438118683ddef3b62ba53ee6433cc6d128224c654f0df8233f51d042e1940b0146e2b96f976f69d34e9e8f96fde8f9763cef2c402e124a4c664a56c39c26425deb6e34a85c0c95634d1890be18e711d194ff75ef1b269760596ff55e92a7190200fc7f534eeafd79eb4024780627818172d3c74d961e91f1e6eee7c45fc6671f02066171c66e1cec6ad7632d9a227faf1f5cf238a17924766960c212036aa275a002305498f0652569ea73686f8a4ba8b09163beffbf9ce47f883c051250624eb1b403130e2df3faa59510f9f71c18b2a32c6773461b84cf644806c04de5cc2e0ab8f60304b5eb262b0586c3624c7e6220f4d7a1e50b8f435affcbcc83f2ea0052ddf36777fe1c90d3b1d98772ae54f93ed62d5aa1511c1436af46192b08f1a7889ea17b979633a1e1444aed3f55e253a500123c9570003f1a76cd057f46e9cc8c9637a05972a1978361126ed957e517ff674aa089d32c01c955216e5322a8c52f3b46aa09acdbc3a3aebeaf2ec80080592e89d314125d88d8f240330d17fd57ffc0ade392fc3296d3d71cb8acb1a2a9b42940ebc0d473303d490a90f71d53446cfc25956b98c43047ee9a44aff54ed2e91a7210681a0f2457aee5a2750f2ff946c9ca0dd21f329b4ab114d6c7aabadacd485d2fefef72d9336a0e3ad26ff7272a84be9779a1ca85cc648894c47015358973a279ad0e57e688bd1b1ef6c32250e993c20f2024613b3f5ed7ffa032022ea4493215bc28dadca877fd2efeb26edc0d79ca90dd85933a7494982d6cd849ae7c141856861232c47b49e1a5acf6362428637347051385dad8b44e8a73cb31382c579f58fe1074e58a9456f10afccff0323fb6ed299a77f3732e9e4a7898fec182046ca885c2cd845c6c0d833045c6b6b3abac9649fb1134ef1437f83dd148335b25cda5577b5e7cfcebffe3a1055a16569e0353a56b177be3855bcef652de17db422dd061fc0120142c683aaa1e18bba96750c747f9a74eba6cbc4a5f5b0d6fa596cc4d05ff11274280ebb4efb4802298291e5ab02965059ab812de0ccbd836f3634c32762ea7f38afdde29053dda313910c17ed9b4ab29ba05bd382b3b77cb593387dd681974f62434f811b008f8b924f625e117f81180a458c87e96293dc9d676eef95d5e9168f65b46e43fb6cd1867ce8edb878fdcde8b52f83a0090b2e142720beda23892241191b193b5b7d1ac5077fa2e6d0d60481701a097b82d9e0b3155c0eb536ef7de647009f3dca3d250fcfd4c24857ba347e5a3c256b8a9dabc988c2de2660290622215063b0fc37db9eea4e5d906c975bd6c71dc954a0e914614fd94fdf1642b6fff9018118ab7192709f6bde95bda75931aec784f658d1eeaeff60bc9e138f9c2e8a352ef11fcc1a82c0f4823e2ff83eaa58a3b5a6c1913b294b9c09801d1bd8981322d9f3dc21cbef8a5fc2d2124319550952122ad93101a972a2d11688ab50d84704a715361d4930756ea544e3597d30a99c5d6ef3d5b4d399a489146b2679604315f05f48847e17e8e159f5894acbc95372e5398ceadfe76896fc5d605f033b4a9940ea4a9bdbb655614ffe975083e49687a80d0e6d530c53cabbc0eda255f5f1fccf2392e9c975cc8ed21e69cd9e8a48e59cf3995f57db88b37ad749c07404da4d009c8438de4f2d2bb9ecf24d1050d84b464f269f2bfb77ae2e37255e9f029c71f3139ee61ac5ba045b970957568442c43fde51efb593df80a4173c4d346064e3bdabcd43c9da5a9c1db943e6986e0aed362352c44a887e16170528ee46e63e0d3e521b94758b0f677167cc96f868778243e7321047b2c560da65ce1787a26c2298ba898cf476f1f72387cf2f241c5549509e0234a03d233c23df1ae146d47bed311b5f01c2cbedec4cd409fb06c03c2871869b9ddbdca1a46477cb16c243c877c66af658fa891bd3eb891a07ac161903aa6a2ce09c97abd99eb652d4caeb13bf218e336cfe98c4e31c488dd320c6f8fed01d95b2011d79cb1a131b5bd8023deecb31429fbac215c20a267034424003a797c75b908b55c33ac9694ca0000000000000000b0643204000000000e0b273f2021709705c9489ab7136699e210156d7207bb6b23f3733d40d6f3354332ca394f6418121ee11ecd299eeaaabbed3bc2aee361f2651cc6813207dde7754b2f7847c9b8db2af85108e0ffa651f64285a3d305196a6e9e3687aa267bdd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bfcce8dcd2b4e4f4d5bfeac1a4e76a182b4f3d13dd4a51b5de6dfe75dce1cec3c9e9ec7a257e8d8a06d70c1744438133d68cfb266ee4230e1a065b27b49bab6fa144ed58aad85b101d030f9a3a442529c9dedf2f724a2db513eaf4c2e9d3e5db382d8816a62270d94f6d8ca6d0acd0c5cf804704d9b50a87d0619756bc84a1f5021343a271b4c8bf870c5d5ec548b46628f8595e33b6b587514370104b03c35146032a6b668ebbce7f7106da67a5d7211c3f3319c3898f530c71520315890a0067740a0156f9966c69eb91c84d0d9434ee8f5c1ff9a8cdaae2ffb76ff970feb9f70e715b17299f7c81d19c9914845664e0a9f9d959e8610cf1eb0737259890cc78c80b022653b701984efd4390e4e0f8fe3f5273a5bffe0b7d7ad553a924faab2904c80a022fe5ab4cd0ff1c2fa3948d58748c50b7bac0655fc4e3be1d3618e1509ee46c610304e42e857bd7adda788856681c77e52a2ce600a2fcafd50bdbc596a0e89d7dc2020bd0ffc4583a8cb07afdb6828bf954b438ff3d8e1ea928ad6280ea1ef3763b2c0210149135a436f9dfab38c6a724bcb9804a6184c7ff6cf54bf135d2e046cd80692b05306283bfebf0beb6026f4136b8e36005c138bb3cb873ce1203dc3c96a528fad75a6b87e2ee3465cb26cff7762a4b58ee47d50693fb7f3a92846b5f86ec6fb1abd8df1fa4a68e2e8f60e805f4c1da8a6bcafc470cabdec5162db3686582a53ca07e74420dcb302d40609e4fe5e2f94d835315149c61a7a4c34c0020ef8eb9a9e467cfb55b33c35702a1e7796b054137c331b56640609e00e8b1be7a20d5669554fecbc47d04535473c175f32235bbf7bf98332b86a497ebd27434bb0175ef02ff494c8cfeb131d19205af5e68bb29729cb6ebea6e294995d21c6416b4a8dc677ccd68e7b9f69cc8193a68fc50ede3300fd2261aefcf04810584695a8937416e9cb307020fd97cc8cd315f6734c034c9d9e0cdd5b23ab6c76a383662c846d8631d6a9215cc6ce36e1cf7de40b514d411690624ff1c5b0b19908a8c262fb8407aea7fbd751a22c9d7cb93e7977b8aef8be4c561e861f4b8a871510718271960e690b344922342939b105bf3837a65bc057227e1e599e01b6d9760842f9f6b161805b2b79a2c18f3e1b49b72cfb3c9d2b54ca8500a8c406191552628f64c61cbfa53345a749b24c19750d9a70bf1091449c1cfbc8b35cc2c2bb1c937f9169fac7103d3bc106cf51ab63fdf05fa2385cd8bad300665b1e0451a5d3162246861f742dcd1f14e55b80430bf57c2b5adb906d366576109770bfa4d912c4fbce218d844608df7665ab616c244b02a8cab222fa46032d8d519778bfb29f54141a06be2bac40bccccf1e48bb0382d5e9c686c6c641a5a0a0958946036fee61f5a1cccf97c6fe3ce500e5f673f96c6fb8a2f1cd9fe20e41f0ec769caad18de1a4e697c575e8609d5de70f623eea56ba895be30a02c21128d41735e1b973e05c6936eeb4d891a21285dc61b605acfa6446aa0543b8fd0e47ea281c89978535d03149c379f49be28925cd4e69a0bd3d3fdfef24cc2f80324e7fbe6f1a1ff8addd817369261ec7d5031eede2da51c2e784d01cc1d302072c0977be9cbbd8635e0eb2445dc16a7f983bd8a76a47fa107c60e3874c52ffaf9b174723bbb4743b60b9e044fac0c6dd7b2d4875b98303ec5eb24a62a73976fd9cb23fd4b68a9ecb85fe0aa1d2248a7969e69cf3056f3b7a3428dcd32b9c0334eecd4d25538073d61489f0a614b6b8668e117f1602dd1367a8b2b1c71dbf2d9116965ff5bbdf7c20b47ead625cde099e46d7fa30f7f78fc09aab5dfea0336f0f2891d4e75d2a8cbbf2124eeb5e615cff5841e36a40747b2f85bb26bf414efdbea7cf383bdc6bc053fba3d5b0e00104c67a96d0fae15f1d19ca14d6c8b13ea0d2738b4e1a8aa24bfa23f9cfb5a2d31f6a7d002db0415b2c253083fa5a2ac09e0f84718d17705bdd8f3411d64a1e05070227886ef64e778335bdbcad60288612e1d3ae7df3fe8b8cdc58c0734f8dd5b0d87a6bb2b1cf7e46539b66194fa31353f121b55ff61f96f2eee8dcb4b672705dcc588329a089f13b0d7f75ba4e2b9f6e460ff6c115ba0917b1f7a52a0b3179bfef06be5b6514807bca940210402dc8afeaea8db8d669b4670fd86a46945fb748da225796622ae8f37fad247a5dca3831b6773e20e77abcf1946b89f6dada4751a959510b95907bddf2d0099abb724c6795920f9c999e95fe8af0b0353ef84be105bfec6efe6bbc11a8cd5580aa281742424591bad00000000000000000000000000d622c1b24371be8fbf2190cb37d41d03e5f0608bd99074529c377337c0fa948eabea801ed4785dd3519ba60954e2b7954012391146f695481979e89c6ae732348e3bff41444078a4acdd4401c0311a9b7b0f75390d504a052c3b89bc5c86773b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004763683340a32e2e6c4814cb8270521a7c5423e583771faa38f03d89029e7ffca04976346532b63f2d4fa8b405815c25121e9f08652a5da69912d2731d09f820f1696df0ba5cb8bee345c7baded51bfe86bca871ec7795eb2c80bea80d90d0f8f783c9857afb19e2cf16856cb7bebe7a266fab9265ba20275ed32460c2894fa40212bc64185e9d66a44c77456bef4e12fc2d2374c72255590a64da9755fd48815902284660cceb468de24b0f537f171fdc592877701b73102fe7e08a74062ec68e7e0a02e7f6c8ed8a4990b76ac5fa61cf73ce47dec0e0aa3c3115e21b5fdc16c890fcc803d52bdea78155aea990f67555849cad2f2adeefc4d5f5e4e82c7388f310a70212035c733b35382ac1e99dad718521acbaadbb485f20388138ae91857f028fac022b644bf4234a82434ed5942992a701a139dec0ab9bd6b8abd997ca4097c9b626031731634394cebf0a591d0aa1fe3f45ba783bb3e7b6a08f8b6959f2e1de168cd5031ed6841fa42c317f98fb09f8e659f1773ae10c4a4564ec6101fe8c0858ef349c032c94a56ccb85899581bddf37ef1c05a3000dfc57ce306ef640124066ae46b6c2c164d6736ee3bc586332b2b65a6a570f411bd2da4647ec398263f0e14bb9bdef44e60e4a640fe9915f6a774d89af725abfec94cb342bec0cba905955bdb4213b313f2a5df0c831817133568796e9ca5db554854f2e67a4ae42c5b56f5c378a32a8b28cfefabbd7270964b44caefdf5fe46bc6e05ede54d8c75caa8a66ce291cb5969e603373ca6d021eb66658b7e737dfac6abcff2125292bd65dda22c883deaf9638e7d633d07939b4698141343290106da8c607e20079057e72aef46fb8024a179b5927ac4aa97ec8d6cc6b3be2500beed3181758eeeece9f3dfc7008c61277e851db1f5ac1641be240e213355c45b41a43a88f4b872ed089e23db3b98c9626c8597fe32160ef717561f829f98ff7e51cf7fdc9c3e9fd55e56b90ae1561b1d41a15e6d939043a0c9ef2c1e76d28a4ab1ee790fc4bd8c915ae1bd81220e69b938da433f2a3f802ec8268107ac8d1d1a797589a592491d6d5e2ce2d00a8bdc87593b62e2de878cfdd8083b9207f1cefd8f2b4527a7a0468abb2efa0c4869fa004587db34355c75e4cf4deee9139c8fdfa67a723267cd80c1d8920f17b24fcb4eabcc3ba081122cfdfa320c6138b1c348c21513698888442150544b1d28e046175843aea345121f96a3a8014d21f0b5490af71eff38c579c5ffc0ecdf12a22274bf382b8d49f5572460e23602c41cfe66db4ca8a6c53bd9344117baa3d8ceb34b72def528fc471e0c5c382fef7691c7e2b6572f72f691e145086ea8aadc850fb11e38a03730cbac01a61bf3aad37bd1d35179c9f89b1dd7452bddec0efb27d3757aad7e617bd8ba522334c19e20d909f989d2e40c15d32738c7bf9290d5e3d985d00f8237d50d9d32d29e0b685ce2741e954679414983e6c8c72fe8f5adb274be567d34138366da076007c79c2a7faeeb43900e4a76d35b002d19a7d81bb3652f11c7e92d7d6dbbd2908ba6a6643c229ee3864cb9aea035f43fbea6f288d8021c53a5f67d62f35338db9d4823273e589585d8027b2d3ef19fdbd4de50e53ff3593fdf885ef393b74190a2e603d0819f45b9239e599b1ca282791744c7324d7e7d80f5137452ed16003e41caf6d43507e8449bff6d6734c1e575b0dd4a6dfa09bb3065301fe0014a941e579eb0c47c325468b0dc1e94123f27f78ee67812feff1e8bc1122fdb9aac1c62dbb348712bb4f96ebbe4d34cf0c89899ceac2e5b1e404c29c013c81c8221a44930039d8e19cd3425fb895bc08297b3597edf02269c54700da575e2699b595e04d429bb54f8766950f5555d2f24b1281af5b7d8d1618103e2e26b0d2687a50c54e7693b98a34006cd2061d3c8614249f1e5c636ef6c2e3457b2b52f5e82f392e69ddcf7b2cde3cf16d091d1d5778e02ec55b349217c0a1bef667c757406641051274e80de80b9de5458c2c2d319c4a7ae75db6735ebdd47494653142581061e382f072fb6d2ec2af7a4d956627e7f43bd8f6b0c87de40103b40f74149156aa15c849e4b1b2868852b4123e0fb78df5340fec9d2970ea23d87045e97d326e3da35e4264a285585e0ce5ef1b30df7a52472dd7bafb8eb4860377a67b35edb83941d639679449e6a2502f1efac0d9864ca7f305a322d9f3e11388a6d4d9a973ba5a505446faacb3ca3329003ed59a290a4c17debe641caea43bd9d3c857cf900fb45e7ea3a0f43d303555e08e1b2de46e26dffc45a475e5f468847752ca7f16598ea0b905e2fe83c7ff3055361fd29eb7d4fa91e8f9ad00d3827be1d28c5a8a6f203482e629136ee716622965551358128ce34a71bea43ce64d6132f96647de2cf4f42358eb869f3260f0c", "53", 0, -953249244, "4ba46b32da92140e115aadc0547a8c11a37f34d8f47f29ab5c6052e6771dfe31"], + ["030000807082c40301ae0ca80c6fdbc019a7bc780907d6b9d88ba3fa2b3a5445b4ddd3a372ce7afe02010000000465ac516aadbaec0e04132e4b030000000003006553bad40303000000000763516a00acac51b175a7020000000000c55eda030000000008ac5251ac65ac63651fae9007505499d2014d5baa010000000000000000000000005ebe9969bcbcf531a7c255d88cfb1672e4d3e0fe70bfcb0d7ef51c3d9201398a5ed3648fba081fb66922110d4c03d9104bf6466c1dd4ed6f1d5f7f0a1be6e13628fc921c2509d29030921b1be70e8a90ff996fc772a6f4141a8cb4792a866c3c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c07e20a0b23fb009bfcce4e6df835aae862f3ec28d549a19d92db4c5e1473f7217f1da27f68475fa2fe9675b0caf812aec44fec00ff046420d691e0883f31c588bcb769e3a367bbb6d75c48ed9ee5bb1b35686242fea12365e7e559de9ba8396e2af58e6d2180a90452f0a7ae541c1396513e26802f7098fd639a3605afe9c1d022b2c1375d0bce4b2ec700d403d0a1f7af73cac87081326f6e10caaff0c759b000211b2d69a90f08a7d205b442b784a68937144199a2d9d7687c813467471583d8b0a0885a39c7045c1ef94f23a02d3838c0afed70c1badb6d2b1c7be4b76bdca22ebd095e69fe00072ae36984f3ab5374d0b383089ef625928493e2767eacf1698be03220fcb0a42b2c0ce44afcbd97ab1154b0caeb6c6c6a349196aaeb612a0ba1ab903070b4c5c762ebee8ba507064d83b3ccfe61db697ffa75e19d3c51050698b94f3021fef1bcfa1772539e27bc409ae5c1811b6a0eb17813d8b84d604f0d57ed718160225dcebb435f0c9cbe9120fc9044748724af0bcdff47056127f69b794c3d073160214d72f1d0c9e486e7a28fadb993784874faf53ff4b2ec0211709acf6f04b2282f1ae56bd3e7878e44692bc02aa4e0f34424f27594d600da2fdc251d3983df0e7dd9a57b4dbd9cc746f0c993063bcad63c24b8f4614b0bfc7a82aae5358435ecbf0e4d350389833ae424a42b28e7e6bbae2e205268bb29bdecedd7c463b74decc1e884755e72ce42e5d1a021d91102408ae5da4b15440aa98e83415d85154c411ac2d26be233282b8e9676e3a7aee0da61edf31d0dfb7c6b019190a9e8eda7bebe90e59ccab136777e67977b590cb5d703da90fe2f786a267a2441e01b7d9f02bb4fa41ed05b03339b9254afa9bec847c8601d0d89e2f0603d08217318b945e318b13c6fbeb2516aae7b787100a4bb684f1706ada89d5282471cb570390a5643a6840c1517e3032460ab0d201756a507fcccfaf6157a71252f63ecdbc38ee01a3153d6544722b7992b586fbaf5bcb108fff13c41976917a2d845535c820c2b24595069e1778c02b0826e938b1af3a6f62fedfe60aa06b76dfad90c6c52f22e08cc29388291a3b30085e713e8dcf3e7743b36f5d5b1c3d47b98842ba994098e41cb737fa8386bdb29aa34937870a90214f90b7d05681798b3b05167e7463adb7f6bbc7726e14ba4a1930751f01a49813bd40301457d531cc4170773b4d998aa1a3d00cebabdb6fec7dc102d654dfe29f3ba252fa15436295f39c06405e21000a0e4fa15dd56b4cba44f0cc606b954ade22111577dd7da748e3d2ed8791b95db18a24cf7e6e86daf3f5642038863d93392f7799c4c8a5e715055d66d2e7a2d394e9201dde23e95fdcf5250ba30caca8a9950557594eb6471bc40745b70f2bf84e406162278bce22b1a9bfb7937932ece4b30603e6354b386bee9a7b30c2d4434b1bc5fc3aaa892360268a4bab5709252124cb20f52ab103e6099b7e10fe62332d79503ddfd935f32971148010623ea8e1fac8ee5db2f1cb5a49b992f53b09bd0eee2e050d85954301e55df0663122903af11e6951277d45d66e8609f3cf2e8fb993c5402961dfe51d9305a2c1449fd213146adcd2c9130671576f52a8adef376073d546c61e690f5bcb9812b6f92332251a2169ba2e4edda1a19304b85c6cc03a532ed040a579175f30c9987e4b654c9585d5b7c849689b54a647b62681961593ace67955608aef2cebdf251d3cc171bd2f2a8f214b7c59df5b67bdfb7fbf468d613cd93c6e72e794152318a938ca412b16445d3195d2f1b360ef77775a9d7ccd7f994514c6687a17b893d5458028a4af403ee9593ffd8782fda97544af23085e769a343a03c5faf6d439b007de6e177a293c9e33a46f4734ecec024767167b05722ec6e26c58c4d93daba749f1a54decab4433f041be27c1e879d17855c0e2b0f361e2009ba65d4e33256ab450d71d8a81bfba8c2a333a2ceb5bd4d107bd1140b542dc8ccda2b4333ca9c11b86048509a458271c392a83752d546168c10cba290a4eec1842f3295255832783ab349768f8406a5f3f20b66d6f46b611edcb8c8a717065d0c9b047694700f5c67cf7890be2a1865c69f6c4b9e6f3dbe4516f1e39bdc79f45f2538d24bdef5a7969870d44c9ffd51ee1de204321a866c014d64eb540bf5c0f3477538f685033610301ed2fc4ab91382a811b4bbf26bb984edfb3331ea25289efebed15b105569c8641bdb9701a465003bbde9ae709891cf13e18b563e5d6c136d7b8d5965f0947c599a53bcbc03025832eb6f6c80bb3a082101bc76db174b0719084c6f5a9a18785a9aff2a49490f5a9cf85ed7c17e5c158a5409dd088e4d56053cfe81af62b4c9f5e63d0c94884fcb1e3f49a3b3bad8ea9bed173cde1feafaec7ae75763bf2d62ae5b07ed9140d", "006a5165006a", 0, 21671255, "c3100d79679601b74941450606fe23a4c3c8f2ba7b2bb023d64568c3d34e9872"], + ["030000807082c40301f1a6a3ea6b9aae305fdd947a1862005b2e339de1f189881b6d12e3b4aabb47a203000000050065516365ffffffff02a717ff00000000000353655111e3510500000000056a656353ac8bc3dd2500000000010000000000000000876b5700000000009aeab98aa52c4c6a541c64ef97692ef0193a838377b50b1e46ec016113be5ab48bc4c4f2b7248fe16c3b4370acd7bf7e26554cce137854a0a9f75445816ba09e8dd2f57d72e585ee62ff8a569903cde7f42f8f02ba52fc84d49931a383b9155100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000357e1cfb9e7c108d48988c4a430f878d1f55ea47aeacf65898bf29ab03862426479fc567e948a5289a8f421647ab63dcb17dd154f4c9320f27fba0c78b3266c8cb910f9279b2c38a5f199b1099db551f8944f5b853503449e23894dd2a1706d7d3691c15edbf1632c24e7e82ef3e7bade0c7bfcbffb73ac2c7c32ec862d908600309a0e2b10bc59420d48c5253c44afc934a0ec30babb54555a4f6cb90c16f3f1702289d6128cf1b9148d89fc6514d5ae8c3505b7f14f5eca32bd8cafdfe49605a490a05788fcf8dd78d76d7c754da9aa2eef080a83e53686995bc654662ee99aa67ec42fa143af54aeba94c88c1df5b6cdcbea0e7cd91d669adb77e365800a870e2a003186e672b3e60dc341fd24ebdac042aa1389cc1dc48b0c36819fb7f76ab332a0703260c7e60f2dcbbaccf84708520df1cd794bf83dbf84307a0bb78db5faff1a337030933fb079ffd46c9d28d93bdb308ad8d7bb16af02734848ff3cfe01d2a14cc740305d5eeeeea5f1c4e56a26d9a503e60045a591f3f3bae7d83907e89cd686f7fc10300fbb239cf706480a3b97dac4babf47d7ecf85cc341dc784ae0789acb31bb6786f907ab66fd842fcc553f5e8ad3f28ccea258077288ebe9aec462f7410b1f499a34d65893a6ff1e6b9161ca12146b163390bef54e16700ced6558287f2bb5931833e5c0854c45adf12952f7f876feeceae9cf9bf5e11a871fc2ff50643ddbf9259d69e8e0146127deef88df632cb062161520194db39ff03c5887096b1d1ebc491c65a057b298a2d437a88ca93c329f8e5150f3ed24f16d478cfa582b1462efd472419299db50e0673085da25cbf404f476283a332da495f0a4c164f42465c82f123e98ff4e1a98c6e8e79a0904a6ec13ff356f82494a23c08c330124dac6f3e3a68d6e88e68a464012c4275174d8f68556060072bbff9daf1b426c099ab08fc19eac8bdcaad4239851ebebd0001bef474601ce77b9f967290702b3dd612c52cc81326e016f9f83b4cc2aa6f43e795b15f6e59e5766f56804fc1a1ac7adaacf9e3086dff6305482f1c4fac12208a7730efb6b38357b40e5b45c3ab465af4062db02de3b801d3c36b6a2b93947bc7fb67153e844244ddb001f7a129cbfe0706732f423cfa07369b9261009efd9289bc1bfe8f55d029aa19d98e030a7d2d2924b5519ecf3e875dc6c887ad02829c4f2cb6c4bb260620eb2c98fcb1f220b3d77208f8b844fca1e3af73b2a1ed40fc698aba2de2be27da260e0ae64034485b354c7cefcf4c39455e5ce6cbbd161f71ec80ef68362cd2d357dc734e3c51a644d2b0db6985887a8b0dd0dd551f766c0be3f49ff522730986f0e08a5ef72f2aa382060810450531f5d7253fbde1a603821080bc48a84af7df168025964f1f60d542613b9229da81a910c05a2c8815776f7f4bead9a6a7d4200495c9b2d9aaa64e9bffd29e3d619c1045c6c1aa824f2ce77d1900dbc6d9e300fc55e437472ac1ad781e606d9937324fc42ee12f9a599b8638610f8b1db792eaa18d8783ab08667549374c65adea7d850abe43ab29992a7958ed462306048138dfcbf77d1b87296108e010fda647390353dc5361cb9ec640b91cc4f3489c25de1aa46a602be27c9da09e1e50f9665606e1b25f7cacababcbad85df3fe0ad00bc2e19e131fd77625767c3f73cbaa71dd85eee9ff4148acc954663b1919e340d2a8c3451ffac074d5b05280f859cc701ccfbdc4f3721e00cda2a66445b80c44e02b565fd69e2cedc7258d04382892d173b3cfc9d0c4589ae03ec3652da597dfeda76d3730cf49cec32c74be77ea743846737274cb8519375d10fa7fceb9de15affb6f86573c9b68e5cc7c4fc617da57f6cbb856ef164bd8d22df2f51da63dd713435b662f0ab6d2bde64fc1bd8b60358a24fcb643da5e2d0b273156a15ec0f60a7f210b5e271046c8e5b807fecf4df084ee1cfdde2ff3977138f899cf9e81f5aaa0d2608fb5cd82ca5f149936edefe6648ec819ecfc23c76e75854099b48819a41b2f6a6d6d4eb77b9d76407a15ab568cdfa3b8947f78f6bdb115fc76fe1a7af9ae9c748633e1db3831e25923904bc6772fa402926cbb7d871621d15a8a715d6df61729f831593a2ac6bca96275a8f1b2c8bf4ee81cd659988a887d1fd62de06338514f5ad1636d99fd1ced3dc304b7fd0e30052414056d3c351dc657397b3da919409f2bf81225febb3e9fb24696066d4a4d5323072c73aa599c59bb90d7f9f59e4b181bfb9c6cd8f9a40fd3e075acfd710b896e9da31ae5bc5412845b0fd6694437e6e7073eb250db1b096d441ad549c8554941c7b93e6609fcaa8c4b6307e9e35ad2686111728c0e7b6e5baef08394d345c7f82b780eeb6c3c807b46ce4028124cf55b88fedfd9b156ac384939ce3d18ff1e4ead2b59cfeeb91f5dd0d", "ac6a53", 0, -1068012626, "47641900317a5fe7c2af42f5642bfa9b1401375ba72709e13d9b1d875eebeba0"], + ["a06d466903d13341fbd5e3c3d63a31ff939ab62a3f0e35336090f6eb652676c7d5a2bda42a01000000076aac6365536a51874216c218d42c97db0ea63a73145c10949a7aca6cacf246a6cc21e157d1fde17fca2d3b01000000026a529d64b3b2b6becb5f0034dc1f3c9eb917b5b8d659be7b135fd94a8d724e643572aaa4f9c103000000060000ac6a0052870ce8fa03eb0bf0050000000002516a0280b705000000000300ac51ca02ed03000000000265000000000003004f97020000000000000000000000003dd311d71a3c4c63622f985a054b7242bf26eb7440eb102700cab90917f9858cc69b285fdb89776f0e04ce26ddfdc21814ec4298ea835b06d2b0cdb47cb6dcd99158b9522b9b03a781c69b75b4fac06ee2fb1e6c91d25f9e25541dd40c8f863a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cb744267886b4a934c43c86290750f8cd22d00c5c510b135cf85561b16cab06c7c454240a1be6642c5bae40fa476a967964be5935213e1fc6bce5a65aae801462bac7e497fe651f58112bd8615a5f60d585b685567ae89e8e865ed922f5388eec10151113ade7e7ceee65be9d17ad97fb64210dc2ede675f66146346aaf041fc020eb724adf0b23bc402677840d606ed13068a0b1ee1ce0457fd12cb95063b9b6a031c06af67ca3af68a890759d54677ac94385b8f021d5bc165ae11da91729663880a05230ed48e1a76b362d41bdfdfa3de47ea7475d1f03da19205ee16a812cb5bb34d347a1981aebb63b86e223a35f9f5c8dc9ed81472fac0f8eddfa434106aa5340215394deeefc72ec5c60a19f8f5cfa71bf164f65c958eaf54ca7228f64bef72990204a8a4c0a8c0eb3ec14fe4368f6db60ccc2a6e460f41f39edfa28413e6be59e00225618ecfd6c21597c8245e4c4d427571c1a91693b33b318dcbf3370c6f80c7fb020e35a5d37837ad0a0d52f33b2821ef48174a0abb0f0d243772b3521a44296dd403034e9200fd75e985c4b644802125f79e706bd8a77a43dfc9ada8861d7f6f1988d07c0293f3d7ddee268c2bccc0db46ce89fa8a17274602e74efd456010d77db3bd16dd92a7b704d62237c8581b8457d8436b1ebd38ae490914e2b03e97e70e54ebb1bf16b23ecc787b644a1e19a3ec23d269273f9e807388aa4cd6109100356b634c0a389d5309f50b55f44772125a42c0b8bc158845eb56b75518cc6d81619ceaf334fea5c9c51980f0ff76a7a98e5447c3e5839cb316b26cdfbc8a5212a036e8aaa8e7f11c978b3a0fd6a3d8780cc75be14cc4da9dc0b29bf9792a503249271a96ff68204c27964283600a09fec8f1980ce753a78d2b7994e78ca925bcabe4b0d727155114fea128ebacef46cd3a6f43aa70bb60d5ebe9ed5ded6eadbd8f98b255dd58925013c417264afe8656ea23f44a8b9d838274f27e267ed73e2be1dc374c82d1d6248512534d9e88ed5ba3b2c5aaf392a24b78eb156e4a169fb4f9c65e04c8b103ad0d40f9efd93ea04eb46e167fa24935bab58b25d478e72d74d5ceda43818f63cb6be296b66803de69668cc0452b1413f4cccdb95e94cf5b8e9973fb5b6645a82db74ae3e1738dc26d38f9ec2c245dfed6865b94710581c5b9d8863ca333e5ecf5efbcc67cd207fa658198b7f0f8bc26c9cea85a8f3c3c1a7ee1080f1c6f4abb939f227ccde63f8eb042f9735a9bac1078027664069a64b041c00a46d440322a329b51a0ee85a8cc42aed9888fbc86362194ae59e78bff02e2b0b7e240f41461619c8112835e1d21aa80ec617702b2a902a55ac1f64bd726460f29a2e0678a1d3f1859365d48c42011b08c8aaa6b93866414749d4eccc3ab22239c49f20109d6dbd7cb67c9595edcbe475b6a637d78b152561e117e49bef9fd4f8aeae524394844b700c1fffd4a218d21fa2bda17e7f4dd1acbb557c701c3672d3b11f8966f3c3d922736a93bf1b9eb8d73577e974ea7b2c7ec8b27f074d93f58d5779821cd64ef32f2b5e0b04ba91d0798733f81782b108991bbeeb3d39f207ce5eb6299c9683bff5c08333f6aac65b6e4316437e641f9140030d3f3b209e41e6c3827f3c8a8298e2c7eb70bdcccad70c7190dacad5eee4e90a8eef578a1aac7f4dedad47a3f6e909243677c3d8560f0569a405903d312a15c910472822ac610028039650d686a9170c91b710faa171301ad3f2ab40896ba1931e837a40bfc8294ef55965c4eaac464fd5efac52221acf7dd87856b841a942bc9d648a60025fa5edb7f85a166745ef9beace9489d193e48c9ab2dc20d48695317985cabdbbd9f599d1392a6695c2481723ae66ff2b6a7467d7a1f60d670505c6bf952d262613fe2fcf8279feddf885de52bd7e47dc7c4e50c369f96c0180f5ba4ef1b44244ba5ca3ffe1e0c7cc2d0f59936457af88c93d5f8aa57d70d1e3265af9ea9aadde712d18ba3429c7d28a967f0b832065fcd94cecbc55adb22a725cbf73cca279c133b9ba9948fcb319733a1a6b5471aff56626fe90b3718ea55257d0bf59a03416f58321be9509f9e2ffcacfcb32201b05cdf454d2e5405f7390637f4d4221e94c4bfd236e71219665c8f77fe8f09f26f463c9f44e27b98a29efaf1fcec1d3afc62d3e0429cda2a03e053eabff47331e5681a3006e0f8fb13838d81ddbc9649a8ed99d810ca4bfc869c2a02f32ecffb96ae0ab7bf5b370bdfd9176cdc8367bc023b5584043308c1c2fa5f91c8ba1a36590b281dbddae693cc04000000000000000000000000b7f6aebba6425c6d00dcd1640440ffec21c1ae8d63adf08666c498414745a35b7dc6a7236f1ff5153c4b763ddfe7e3b8b6f6b19ece64aa2f917e2d6cc197fd558bf3f55f45bc6bdad1a6bac4576f317928a0fa61297817ace497410d44eb5df80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088c73500021a43e177c7f472562b60fffd31a6dff16e4df5b29169dc57f02da9c53f0b78f8357eba2dfc2f8104272ec9a1fb596ab370f1ae4402aec5aa20364b403c31a10f4ca29cabdda83159f2df05ab4d2dfd2e787a7322cb8950ca5ec0fe9497258d468c02de2fcbc9cf72a82cc3287488c5e444ffae8faac46a7a490dff0225fb6180f8e04da73a15db9434fe0ae0e237a89c9907f3f6f04899b996666606021b771f2c66c3ead1a96003b30a66e4cd5641e1cf1ea4f4c7e361d770dfff075f0a0342c22d75a56c63f6e76f4acb4b81cdbb8addb70afcdde01f502855b1be40ce7ca6d9bc59ced887fd4d8667e889b8f9bd25508d9b7ebac6e262888dab806e23030510a53a8d9a89c8dc7c8db4ec74623a587ad8eb56e7991c67073cfd6e6e7598020917fd70a649f45a88b8ee657c94b0e6d6735ef2a0c70a3e67862c7e1038d7f0031ea9cd0daf83e373a2fb3da82f26a133a1c239af5d37841e7879537e509dce5c022f8434f51c90cf2236c470679da080afb662d1f89bbc3937e9f6f573c97ed52602092ce08db8a6f5326074aafb06d89c4d382b894ecfe89c1070c141d518a28e95d2137ae7efb0488881193249e3df152c7bf7f1c9d615bc4485d9bc8fa9793a548bb062b521cfa68e89e37bd5ff3f54ade6fda1f97be83e1d2a49501aa4036a4aa23837513b9db7a4954f0d1b292566f04466b3118fd94e20647c0888af2cd6e8150bae08fdc18335103e22dc9b6b8891577054e381e74fb20b288f931cd5a5af408e5df709dc4427a2fa4a86e50df121217181890fc6e41e17d4cbff08bce4596e465cfc155f2d86bb3392cd35b17bf5d77f60668eaf8cf2b695d7ba6ad6c2f1404649572e471523cdca707ab6d53ea94092535cad25e322abe22174d22c00a1f388b8e86ebcb6662afa99a4a5844ca9cbcc058a5d6e26d4615494a7daf6b1f96f4799a0eaf85a0685961cd7e685ae46021194104d61042af382419cb9f1a49faa8fe430f8651efca36d08dd8127969d2515a1de8affecf692fe2890273c0efad0cebdca071525c136b8fa50e421f9b085addc2c87c969839cbb744519b6161aed6bdfc1ff73d77ff8201cd2bcffe06f6b435bd746d8b7e6b7f909f78082c6b6d83a8d78ed93c303516677ef6f7630f35c3b47387c58ba27cf5eb7ce94b6a0c80d2b142f7994563611df7db874581946f9410d5fe54257ce3c8290b155ef8ce672f0a9957aaae4fa12d26304667d420a61d569fe4ba6d230dbb3d38944cbe034c33b47349972fdfd3dab8f948842b5b896ac0c99a4489223f91d1ff9c0548b36a4b32da58ece8fe0aee52d6b5b3781988997cb88fa9af0265e400d2e6acbeceed18d84edab98887e94327223ba3c7042ddbbb7801139dd9eea1859e54bed11172736c56dda4e4c5b64e21834c8a330c96b9af8b6c4f07b7a325288f1c2dea7000e32716c1fa6b6de7273d8a258b12094fec13ca2584a6e53fa0d86931d964624f641e1f6f651e084b4d3cb00aeecc33e9834bab6e240930969c9997e73abb24bf93089f41ac7c7aa1973c57d592c75290ac12df99c4ca0aead7c35468ea1d96b8fdc4bbab248d3e18a3f1612e09628f4b2eb09c5e100add1925be6f1b2d314a435cec51f3edad1a9aadd1af20c536184d5f6dcd668f7eafa5ec9b66ea381d034e33345211a1c138502ca15746b4bab8319b1e360a4144a2ffed7fde007f7fc8359815ea8152fc94ae34c48c8fbcb99aa01b0323ce353fcc21be22daf306719a269200850ff1c79971844bda36d0e92ecac1bcc285b1b5c8e06c1eebee0f237e23c541bb60135d7f4ba241a78d60519535bf5f9f09761414bd8ba46672ed18e2c26c8225e0dfa638502439ef514512a6fc5a0bf852ff6f18f762e09518621edbb8eafea1ad6fafc664f6cc3ced9e9b57fe1aee2f06f9762e79512ca3352f6489109ac80f53eb3a4ea314c8e618267de6f01bbd3ed63e92ea73305d6f6af7fcb547267c44c0efe4fd0b363285b08e5b6b041f078b462f57361cb8619d73908bfd439aca6de92e95c5858da70eff0d183b0eb04353ea9df7ce85ffd126a3a55244a90897f9be11447780bf9fe0c8858ee6ffe861103c95c8e5add41b6e780a567765a4359696d380c11a377a97c86fa4796cd9aa6ad43c2c38c4eff28a7c2ce27893d1593827f11ba2147ada5e30be5079d83ec44e2e0bb8e86d8f9f5d5872a1d0953a70da971327d2a74038f978d41202b8abe8cb912959829cd63032f6875e1ecb34b57c0901e784e96f398a5216556e0627357d63904000000000000000000000000b0aa7f7914aea1d1dfaeb7742266ad683179c6beb38f4cdbef0b7ece9b4d3fae8d70c99bd1f816bb6f2b170d3453eec1af7d0196d38a44ccfe807f3f77a4ab2e7ce7a0715e3935b67ad4b493f6ef4311bc5712a8447005bb705e0a72e2cf489b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8e9d230207966f7b19712e746a176561d62ded84d84391fe24da62faa6c602af5b1a7063724e8b15ca5d1f709ad080d127be23d25c2cf59ed48e647213f5bd35f6951950cb1975c6bf2ca3a76eb1675e90d7ebf0ee7ecf1e316071be7fc043b1558363ab0479b150438a2becaa8a26a9412fc9c683eda340a839600dee7e0080320a420cd0fbbbec9cf7ef312048579de948d7f6897502a1770704f476b3d63dc0228fd76435bb4d68b5148254dc4c98918743b6e302284c3c4efff94ee0b129b3f0b07f0316f0db0ae8faaacfd4a98fcdbb5f30b4f8770aafede4750b57fafa63ea608e86095a6d419f003fe55e8dc810c784101be784c13f64b64fe7f727d00e4a2030c451ddf2ac61a1d4110562c660029dd919937806d3b6dda7a30c97949eaf163032bc52dcd26c480dc17cf62cc716e76c3e016768423dda479f6d4f95980e02d74032cb8a9763afd55a0961953911e3e7d67900b4311168e4067fdaf701ba0dc3ee50217e6e079ffd9ec514f2b414d8d49f42e52f53e503e8b49681bd10270375d3e71022e67ec4e9d1b77772dcac1a7538b5b26d3eff55d235e52db8d4f58a7d94eab0f0c3fc7c17c6868683ff46805bf75b54bb4c9ebb45c52dc49ae0eedacd9f459163f9ba63694278938458162d509b95434b0a3aca64e3ed1880eab93355a7d5228943ca47e7ed85d334a770a6eac45fea1c04ed2ea2aa0bffe08973957a955251e3ec51139964391ff52d0970fe7bfea5ddc99c50e6b6c0f6b8bf355ac9c9bf002a264906cfb2211aef8b45f30a4ca3ce4d34176ed0c56d8f7eaca814b5246e94c2a80727b51660f64dab4d8f028069891cbbe06df78ef29080cb7c5c571813fbeabbef4dc65a690b0d7182519c5b31a72d23d37517e6989ae3fb51e6b887d80de54502e16dfefef941d970fbdbe0aaaadb4bc63d75c1c4443a287ec2de244edc2311d3e54ad0ff36ff7cba8e255181d3fb880b831f37ad2e3013a7ab5ce8b0243d13ace6862c612d2eb03ec9ec7beb72fc4f478230bdbb24884a33cf17509df300f0d557f305809dc75ce9e3fbaba30c25ced0fb61551b32f361f3f128cf07079d6eb40767b2ef9d7c823b3dd9345acb1f81248cd0fbb24b88ef4297b42118dccbdc1c23cef2233e38a2e4a8490e1270bc0baee7f2efefdda3443bec9c031382a7256283c62591b803392af44de1edbfb293d6fd39f308912640df5fe554303d0640097c406df19fd3a7fe986de43241a6f1bd7f86a05449287b4b2e14aad730eb6093b5dc4da7a0fc647c11a6e5fa67373d9f1699883a9d2dc2ccf50beac428f4e23b898c807090e3d38b2e82838a07fb9abe5f15c930f76af30e289a4bc70f570c0fe93ed08c95a11a1367caf201716105b087776c7aa975519d0fae53148742ab356d1d1de3aba983e7ee3a77a6d97fe24f7e1fe29f3dabeef46e0741618789d16ca7d2056a5d509b40ad40f0e0f30c1c2eae87b725bbe479523baff4b27d1c54f9ffddfea3223fa01431210498d5dfa01ea23e0dcbe81b0a4efdc8a6ec37b981b810a0cbc1c197a531b7a3b2cebbed06e9116296afbefd583bda74f9d2e62641c9ca51748437b77e123a2737de657a58808e1afe90d838e1f3b366b5569b08c9c44138eedbcc211a96a463ec6d61b53e8cf1d791926307bb2777eaddc3f2e650b5b58c4896287e4533c61a435f7cfc4d9206b47158b45db50deb91eedc5c8d798ffcbb602f1dfcb9f7a319bfce99e92fba927b2053fd8de344aae526e06aa53c2c041ce09948882b1d8ddab767be211eaa47a8bb5c7ad1d339e06d3bd290349b93a97d6adef0519a675b0226aa749dc1d0b59cc3554bfc495220f1f1604a8885dec914479cdbb1ddccb7b0ae885b7ff5282306ef9cf8f94e8c4a153cc0eafc3fbe24e099dc93436dc109f3b7fc8b1f07655125a3071534438ebfbaaff38db886ac80f7b05ed0fc1edb9122104dcaa14bd6dc82642a5dec4ce4f9abc5e8aeae537f496586e57c95053d99bc35e9e1a1fc6c74fabf1389090ac05581032e0b54867b88c906825be1c2a559b2e20ac183bd95eae02299dca2c4cac229d04272a05368a136936577c62d331600e76c1649fc95368e2fcc39d1c7b9459ba845a63a38ed7aecfd11881060e83f0c1142c1f772098ad6ab974020f8cd5835ba3e1d6dfc06c15317a24f31b912c5bbdb45f0f25a04093317a43775e2a7657b1813d89d6a7f565e72e507900469ff21d9d8fa1677361cc0d7eb21c3670cd4889f7df40745af7b4f47923e3bad87ae6f4e9f472c416e8a6d4e002a347752b88da518b0446d85564421841500daa559cf9cbc16e060ce424a47ea60071d3b7d02ae7a24ea03154305c4b2ab122b3f7439ed13029d5c8851c62002f0df9163d86bdf44c9451f27e3d89f7213fe28efbb7ed472029fa0c", "6351", 2, -336737076, "21147e08edaf71403fd8a4c6f8f85ed5460af6eaca430d5744d9afaaa62a8d24"], + ["030000807082c4030332fec50e3551113a6b5904837a70ce061cd9e4862287d8e3b74667774f043467000000000153ffffffff20caf29101680b449dc7f57a6073bf655541b33b775d63d5f5fa286925dad702000000000100ffffffff5dbaea0192f45032a742259cbce9e4e2ae0cc02ea3c7575bfcac2dbe4f540d3a02000000086a630053ac636a6abc5f3b2002a777db010000000004526aacac768221050000000002636a3fdda25800000000020000000000000000cce496030000000076a22a624e4dfc73ea3cbc5e7f1a525ba180158db26c046611a4be14d4153c2b558283eb83a630c49d0d5b9b9e750a4a6442277bcbbe863451ff62a36bf35235696c9f29805cabdfa2d16e6b0fbb593221d2889a3bebf2e6058749ac8fd98b23000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c53096053c714daac2eaa101b3a65880e28489058f2e1b1ceb0f0028b24f9a4e0ceba3008137ab2a1b5ef9002b60164d9d513c6eafb51b7029b3da957c11b81c72ed15af41dd4e1596ad326053268d288007792682199613147d310bb975d694b566783c1ceb506bdf189afe8c292fb73ac5febf92fe12b04bec0bb209dfeda020879ffc0299e4ab5789f8d7eb86256a7d457fb08f96966225b52aa2f6aba8d83020e2915f2ce202e40bb81f3e24a035a1979ac3387fec734ca7eb24f10645d71130a081edfb9fd0261a7ddbceb8fe9b25ca1a5b9ef3fd941a63524a35e6af6d629d87c2366d27d349d43ba4103a84cc1fbdfb82b7ab601ae409ec4ae2d093357da6f0322d04e0f6e9d0751cb9165caff2f19b37405226b02ba2c1fc0c54336b19e1cfd032ec6da53a62d0d1700999dc57697daef40f10deeb89867c0aba0dc800fb6817d022ce1f46b272990336bd99a5f3737a26495b00a163ce910e144e309e699c8aece020643522efd5e81b640a98ab4f96a699c7f5b9dcc1fb1745d4f2fe29ea16f4d96031e562454686e6d4575bd4923c1a37a3bb6f9019d800dde8b0a008c883743e8b85582516e1004491d1b24ce9ceb4beaac4e6a0fc6a5c2b59fd8d421619585e67a194346caad45afc856d3fac864c552e63da1be8ce91bd46885db9912b5b3902f97078c8824db39e90f387750574c9ee84cfebfaa30eb6e1b9d3d12c0975bcce06a22789d4658062ff2fe11c05fd8898f1393e13fcaba450d505671dae4c7e801784e8ed07a9e6dbb4403bf511a188ad9bc1a77b749aaf0a79b1b96472def2d40006273edb62b5a71792c620cd55a34a537bea703d6880a50c0c9065bd28622c3c96273abca05aab1351cb028ae6ec2d4fd6f470dd000baced525a0d6327f14386b3b46962675345290cf0243017e7239c0703e1f56edb915eaa22795e54784b9fc1974d9755950a50516c372aea5b86f84b3a6a2ecf16c7b6ac72dbc791846463cbad50024a2739f91f1963ac9e72b82677aa1d7cde4519881c6caca0eb31aa3236e9fc46aa2b1e7ef5c0fe951c40f22bc205c0c4d5b071d76bac0f7ec5d34bbab3d8f9278d4c9385c54809363bddbfc181b1ee6f96de2670a9740e8b08c8d891787e8d3a128a3ddfc153c771f26e7a87212d2bc86800ba7bf9a907890789506b4d7627e8edcd2cca031cf66f65069cf30508c240051aa96e9396ed69ba4f510c5a19efd1a5b9bfb14cf33894d9cc3c638f0de1be022cd6d2c78cc83fc458cf38cdbc3f0f147a93f1974ee54cc3af8c0d37d25186243de8857f4c3c55d4d74bab0387927a1806f588a685d1fde43d9627b223dc51d486091fd86b90cc1c1b412d4803dc998d4e0e6357e3abf66c48155e8445299715938207fd62804e38c1ff1d872c59fc25f7a0ac6d5f2487d063eba052bd0d3b206f874f23a332af6cd66aad1c8c479a4e6726649e767757c2d9d22312662dd53c72133eb89c8b20acc9ceb0c04bcb7177bc487b7e822a7c2a949c4f2632dfc98a4ad845a19c9151c8f232a2f3914383fa699bebdb5cd0b0bb08763ba6f3f9c37c288caab932436f04046800f880a0f40248e69f38a50bbd9d6776e6ef852490ac0c108e272314a887421f5f0c51feb47c93a1ff36a27ef21978e52b29e2ee712771164bd300a811b24082637a2f2ad290f3154b962e494382641a8ce8e7ac62262294ce00196bf9afa0e4d6580538aaba3397ac4c1e7efd0ac588b1860f4f3748224d8ebfa23514ca56160c2a44653fab19e5adb6b26005d08baf838cffe998ea10a74fe8163d667f433050e25483c891c0d49686d555b8d82b70f9c255d41367c86214388bd6ec913bc34675b325e0410ee61e611bb66c64dc2681e618d0da915186ccb3ff260bf8184fd1d2b7684261b466413874a0ac47c44cadab80f9b95bd2c3bd7425c516f375c1a1a901fba5a546f2ab2a5f989db3e5aa566a030c9bb5ea91914ee6ec7d4f4bfb41dba2df814f036780026b656387f6eb489144e5f9536aba0dd3f2bbc13df65400d97ea625704264b2d2aff8453818fa4a969a2415c69d4c583edcce7075393ca2c8761abf96d2e4a969d9ee5b62eb353e0c9d47a74b8adb0a595fea2dabfa3d92ef7ac91c642f6a14b00541c66ffa469143c05d43a25138a9bd4cad4757e7941fecfd2076cbaa34a9d2555294b5b0a9764129798843c68d4ce34e0d6995105b9c80f4820bfd30ac678bf3901b063b5abc03e305f148f6f61c8de2b86a5ab45734824d1464e7c7cd7042d8b690a38231a699012fcec0300000000000000000000000036e3e38fbd705823cd07436db95f0163b335c6f5d9340683eb2807ad7070e4ebf6d7ecb835b922447201121a822ba22d4e40173fc449d668d1525d31ff6fcc1c4412747400440de83a571f6c61e892ab3ce5eb9c594184357d85a2f58975214f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009de934b8fa34b15b49aaad172e3d6bb04e06cbe8777cca88728d283311c8fb5ed0a5b2a19ba8998a18f02a878303f508f66f83e93271eec87ee94f722515489e4d78f9ca7d85249ad71a80f0eb28a42a7d4efb96144212666fd9bba84d9ed0c18f16068fb6596a6d88b60bc00e694c455369caed49018d19803944884893cc700219df174c07c2877c99e90a196f00fe0bfaee8ab9ed708f94b620b19a57248941031b1d4a118bb7aada3a96ad08695649c67f61a7b26f9a23611f5902c0d72a9bb20b08ae32a3ecc14c164283f05751c81992b57e66e5d4c7d2eeb06e2038a78bef9e75589263de3608bd1e54f0c611e5a0a75267849600246a32f484b6048cf24b970224049f65fe8b26c2ea2d2e6ca7f4925246c24053a7895d0b61ebb703764d06a10215f8d975ca0bfc82e369bf80ab446ed5e6ef0c3e059f7ffc61caea61b3ab56150304517dfb083c2785a3a6099b827fd92ce507bc9be1dc01c3f566c48689edd433021e42e508c055fed063e7763565a53f44573c55bb593dfba3b847d4307e56850b02195f27927f075caf9db40e534776966549e12ad9f0e8c9c4768f7cfc88b5e2c775e798ec0fd9c10eb3d4c3bf95ffaccd76a94a96907054be62737674a0780a22439ebd925938e3fe9c8bdbfe8e39b88ab2577f7287ea1c00aa3f1ddc4046856b7a876eee298d607b5f3dc67cef89d0d82c994adc162b8ba32311cf7869475615319a0e2bab3629d80233dea39088038132d990d67563183f7aed1403a73fb6d0143da1fc7f69c0fc1683dc288c76833b050a6b8370e4e39031866fbc72f439dc6a147cf594584f9ae308e586818dbe9f0017dc198c2d7046b5cef273c698441b9021036f3e937966d593316b46c875edd7efc787b5bfea75f0aec88fe0a782087f1ab508d946c5b0158b892c89e28b4be2a77fc8f4f04936fc19b0ef75017bd87ede3a18ff80e1b5f4d2eceb331a50f9959ece9a55e9280b52339a3e52b9f24d67f2ab838299be1b8910b5816b17a5caae76796897454a6830ad1847a0876b38663c5275a2b58108df0a2cad764cd585846485aa381cc9f28df831f27bc47c61dae3e66725d5c6f6f8f0f700d3c8f60f31d6030b9d4ed6a8f90c1265e27731c1aa5a42f1b1c3d3371d25d4bc8e8888cca9586943f9e4077263e2ea65b6d49090534e11bb3192234227e82105a2caa13cfc37d7cacba0c782fe20ff0f0f03fe4dfb2d9670917c9d4785d12bd39ddc096e7b08c8a5acad7c8d9e75c374cf6bb0bc9cdd76d2e322907553c345a2234dfaac91a350c874ca8492c4fb452fdcecd09f0fcd3c827fa9916db5b8c0c58ddb42f12b1a7d21677e41390e4f2b16308f61602c89e1ba14e1a06a117d0911623ff04c850a4a02404e76adc869ffd937119b687f72c49b15ef4fc82355a52852594f4aba0d54e568eb00dd2a84661a54135ab649734844b48acfbe7a70b2384d64e6bb2d127a656ec667ec2bc739ea58d5f910121a545eb05f5e6d5eddf3847807009b371ac25899f8771044eaeead60ebde148087df9782200293ef0539ce281861528640f11e96774ecab20eded8f7754c2cb202f0c52c419741412e5f4bacd84bd40dfbd2a1a8136491dd84717e3f0f285f6d783dd7abd637135fac1e86ea416e311d1c5a941eb3b3e1a4f9e25c1c602465fa5f96b6beae46af6a580cdb5e17105daff1a704bdc7e5abf3e311b6dfc765a036d015b7eba6882f1eb3e7f385fb72bed3b173dd4f1cb30f5208b60f0bf19373c5dfe11d7f1eb2a8d9c18fb509e56d4a0c7e5d6ee29df09951f2f9ed5cf2472f0039f112dd724fa05f61c6ce85f5cc678463d2a054c3c8e6f2f697175c0c508cf81f483bc5faceb731ff1371400649294555444b7fd608140ef012f971014c79cf9e2710977cd410ad87ff8e67c2c2226f9392ba6b5d0670936674c581283545775f17b4a674983eea1bc3ee1d95cbb4df8d16e2dec1b6a47a790205552b166aeed8f60f1f08ebaabb58537ba29becf00df2bbaf2754244cfeefea6907247078d2527e895da10de885014d6d0b8d2e901491cd5043365ac817a56c5dce544d60e7174d23857bb8c62227522706e6236414e1158cd00ee0f67535f6d8bc0663ebeba810f61ef94e7dda0ab95467ebbb42c634415779d69914dae24c8b6de5a645066973e310fce0078c28b66cf357026ea83a9a46834aee3f3abbe0a8a2e9cff396a60ebb3ceb5809a0954bb11c0d7cc12fb7ae5d165098018eedc4e12712627c5bec6f5c5198de441fb7a1cefaaa1bc06dc1c16c9cbf19f8dd99ca10d24709034ce57b27ec2c926268c85875b9ae5cf1d521e76cf336137f3488eff27ddcdb09344d160c1e2c4845574ee15f34f074fdd95f813e3afc29d7effc4c8b4f30ef67d6fc9cdcec6a3a63997eaf596af093f7e30a", "00ac65536a5351ac52", 0, 109140103, "fbc44527650de83b02628e15ed0acd340e439dc4593af74b7569565582c6d16f"], + ["030000807082c4030410db459594b8f6e740885a7ae1ec4928ee47f60b437a5515895cc928bcfda5080200000000e705d366b5b2f61913252fd8f11c847e69af077beb1295e6a49610e8d0535215163ab1a802000000080051acac51515251ffffffff993a1c2e7088ffa21dd36a56ffe234e8ea93bdf634b3e009e49ec943809f7ef10000000000a81a51808552f9a00d671bc11ffe4f3a07991ee00b5f730d23c6a4b796508a18fec6d52e000000000965ac515151526a6553ffffffff017fbdc4000000000000d2e2926700000000030000000000000000ae5bcd02000000002b27af0c3f1145426cc4a85c1d06966e749cbfd7329cbd7d5f023c838313c10fc6032fdd3e623eba4d3fdc7a4c8bd77415473a681673a5b483ee420929c22a6cb75295e8172e80b2725d7353f34e2d61baccc0934d163d066fde247b40df12060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000092b6e5d7647927db9013299989b75f7588cdb93a455fe9755daccfde59243bf9216ab71404b269d6ab6b0b8b3120608cf43ea28966d396e09107a4565ae2056db44c171b917f7f39d0fd5e81b0d174c6060cf424926ee5f6d03d6c58f967ad787098a22aa53f1b6e45140188ee6aea9a155a3aa7f8251a659d933647fa9c5cec030c0f62abbab991207c2d3ffcd4ac93cc0c4d680ad097a9f060ed0eb3f20564b40329f851df92607a244e9fda88983da118791808cf8e4bc8064804995c8cde5c0b0b044c50b914ec42e581ff145493ab9729b75d76bfeb6c8bddd79170bee16f47dacbf2136c545fb8113c1435fc90f3f37911a3acb57d4b3884bbfca22f9eb8118c0319e79b6dfe20b1dc314d8f450eaa1d95e360631156ed6892777421d30c34bdb00317d4f97d08983f65511244b3a856ee997b9de69bc433f3b44137059a029c7a720318295e26a5a91ffbe9dc4dbc8b5f958cd1d240cbd6f04c1414bee09e0b2bf2f5031e711952fec7380fb0ad27ca6ea680fb44f087eced2cae8778c84db91b5e0462021aa760ff181249ee055654e82f4bb152a1ab7db89c756a9f7cf47c7f41c89e12a3c0e99dbe6d779e73822359fc1c9a3502b8329cb46b1042f6deaf9a1df65bdbb3f29cd6c6ae865e61143311a477cd2156434f3aa10f15200942082c14788ba7768023c50f0031a66c23943066323ede4a41a51e68002b939b20cb51f82aa07d5cfb927a1a959c992e7e55e8e0735ff904df0fa3ff98d924f7ef4b41ca60be922f117edb7a35c0391cca249adc1318b23c6c792657664a89e84f17f78a6f3d3015b48a9bc17311c819295ff4a3c5879a988b09f6f0b3e0163057fa9cbe9bc81441d85df5903c4fa940f6272c7f517e82a427b53c3202cb7ae923787170f7131fc683343f44cfca61c539b61a23246a874eea817d366c5711f97bc6a21590967adcc2dbd70c9ee79e18c27a8bbc462ec8c05c0d6d66deab8cb8cfa6e338f68dfc6d68fbf5e88bdc646fd2f5ff5cf310df0cfdde9a3f4e469ec4a46d0ffdbc16bbce2004d1b328d62ed4c8625e439d2a2f25ab258197d462a9c32677373a65d5f5ef92d9bfdea8938244417fff2dbbe18c656d60b4fc0e0a262a87d9f16cd795f2c87db0d81dc64120995b873312eff8bfa55b71bbe1ee4e88a707f5e28c5817a396e614c75a39e7d86ed5c530cc67e2c2831c67b4d4cf576ce00a3775a3d9a286aeb5aa028cae0e0c64a3433d609168e0227b964bee9330acf76d0e5e2bb85e02ff941c917472a0110ec630bdfbb0dec31d22bccc413063ad131a0d17ba4a2c963c21cf8f34f30b0b9bd0c480716b3ae1bd2934d4e25cbd00c6728dcc6474c096ef1e4a7c71e0776be8d9dc1412e4ca1f65520c4d3fec4a992eda7b8033dd6d6a2f21e21ac49b430799b9939e68985fea3079081f39b6326f802bbfade590b6c538dbea9be0399c47f3933eacfd86af88e77eca9c534faff94faed853bbd2061db6bc7d12dc9dd1a083d2c7331ffd935b3c4bf43fb80acc05fbf4dda73420cb0ca07d75c2f07afae39bfeec68070970e6ec5c0001800454915616586bd81f373a320659aa16044a1edc2e0aae59924bbfad1b973bb01ad946a00682dcdab14e5d5df126259f1df36351e6c2d764710cfe55efbdf2d011d094c5e65290a4f3f69a1e12a0b234edfef8834453341912b3eff60c18b360d770652fe45fecd8b5b09ab9d53ac68ee180c6fa9596b8f0bed93f32e2cc4f800224c4a3abf3f311caa0ecb88372600d6501af7ca37905080c7a9d0083c7fd7c58364a359981b1528f8a30cb9eb73cb419da5680c5b70e1731e97a54620e33608015328e1f55fbfc9ae427dde0f89dbd1c9e6fa666d4a0ed11ca663048396682d05dd3b13749d0c8f73ab2605f6dc8645f5acaadc69fb64f301e826c8210667696c126b2650ca8ed3131c092184fffb411c0227531244c4bec4bb5609bacda08f862128c57015022a0e498a950ff33eaf6830b386693582ad8c4afa523b64a973a50827d870074d5af10421d6f69b80019507881da1c328f43418c109796958961e917b10c727e3ec3b4c88ee9bf0a0c3e50735d449f5c054c396354235af6e144576a9e4e276df9f0f51889e62dc47d176c35ddd49f2b8a74554d06370f479e15d705a5307d03215aa095fb1d2b47d87b9f6a318c7e7b37f3fa9ba7b36eeb4bf13cd1ce8cf0294d0e980c66e132f34e233c82d61e3247788e372af9049a1993dd0d154e55163d9c665e7689d188bdf88b446ad6b7957ff9536dd48e36799870010000000000000000000000008a3412f6b081d3f539d513dabad9c73fe7962650a97d3414b55d4a77e30abc09f1962546118006fdcfbde82ee31d4bb594790df7d827d218c0938126d84cdc0b4c2cef0d43ce00107cd1f2aea404772d18e5c74642d112f9ce06f8b13d4195a50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087400ec123f1becd9857782574629a062b96499ef888b552c28c6f5e03f783445dbb2b021e1ec901c647b01b50e55cf79716143b8dea119fa19567eedfad696846e7794e82195a44cc4718d989346bdfb18d810146fcebf18aa8ea6827ac5b6e955caa1566e23055b2001ddc40da775fe8a3a851677590eccb2b144dc4014a240311e55e9c79cb144b561e4c1b3594de1847e0d1b319bd9bb17d54ac830446805f020f1550a2734501362019bf823584d9aa8122a2ddedf82c5af498717aa585b0d10b075338d81b7d69555e09d2abbe3bb2d571b404646dbb51f6b896b3be7d58dc11b1a6e9b7b9345eea580971d14b2cde693d8e3fa84946f01a15954c7d12ef67d4032e3159b95ec8b7d2e5d7d1e86835563549e1b346d33830bc87ab9cec9349169003062e6f736983cf9294d9b4574f5f69fc327bac17058347dc590135ceed85bc19022227b841abe2bc30dde21283e64077c123e48947132028b9f54680fce738b7820217404006e50a8d0181e107ffead9e6dd30e87402990993d3439afad280a13a4f022ac853f75e691b21a245c3d959df29b27a9e750cb17faafc0d6f559ec1eab7b4018d6ab4e09ecd8eada11ddcdafd3aad21d74c8ad20ea85d1f7428397767203960440a16971c5c9da4e1fda857879da52848d813f8040fe5db7ee9db7e4fb42ed4722c7b47affc0a769985c24e5a7116517cccfe5d117d259e3e6c1acb742e4170bb1574fa3cc2fe26c0abaffee324a279de53d4646043558cae67c22850fdedbde73049bea1f01a3be46bd76278c5172976481d3a0b1359458c52244edfaba193a0d5541811b918bb47eb3be0edeb2c538c9a6a13bbfd2a73a0521a2ad2b04166ea2c86b396edebdb93d8fcd45b43ad12d31df8f034a2f4f49bc4d3a6068b3d581f6911d507e101d0405d17fe11c769fbb237bf88936a70f11d9e0ff36a1cc1abb825345aca735fb80be190c4a97f264bc46a3971d6010dcb82d547e41db3b772c5f0d37b4a34ae15818077b2ead981f552a2023afbaac509ddff3c3b7c28d9597b1dd67b4a11ef8358a4dd8890d6d4ca9ff125eb16d01741990459168014b7d2308826eecb6b83b7ffe5bf149d0860da38ff90a57ddcee4706cc0a58b2d7374f005a3e8ed1ed00012e36ad8b9abe01ca6a6988c9b426ac96cd97dc8d7e1fda5779719cab3c505322d0a837a099819979975b62e4a9c1af66c595a4b6f9f5ca6b27fd4632414aa79d99db037e212042011b4dfe72402ef7cc20b8f41a29a6e120d0f6bb656a886e516ae6c18b5210f461729482e3c38c3f2e955a40fcc95b8e0d4a65288b450aed1c08d883164ef667949361e9627766156b28a54411387f5a66947c10b93fbddb0313fd6634030fbe3773b653e644f5153c3ceed0c47ca28588177db4e7d19d17a4302233764b49f9b48447b8590ae5cdacc1efa7385069fd900bc034bce5400b8f353c5b079fcd2ca6f20dcb8d3f79180ce8526de1bc6715aa9ad8233c72047c0bf3f6042a4bb08f5e4d3a1919d95e6a4f3cbf448143b06e3bb861a8603127679026b251c0bb67fc7db4734765c0169afb3ccb5a98e321dfc716441842b7e9c868cd54ea0a50fbd03da9f56850f011de03e638ccd59d2b1bf62d9323d60144684c4b24a08a317dac38eb4f762ec47670f3cd0a401b499da563a99970f493c24b902f63e07eb0eb0e4a847f70a8e573e180b7ca77b24571a05a92b4a8b707dc8a49f7e40f2f29f22e932e42e4b11bb54e3b94df6855949ffc0a2fd7dccba0a6e4d9ffaf4d71159c3dd8f95a015d752897d8e7b87c3c70fe7a411c10aeee91be8ed66a2c996ebe84e62182a6f1aeb4dd582fc9286ea0814f6893afe264ab87f7c007414a5df64a7be3bb681a2991593ea5adc6c7283da4b329fb3be07a5c08426633d5536969382acb454c7f2a2e009ebf8eee7d0398d0ecd8d3c663fef234b55a164c20e63173320a96a1f2fdf3410395b5d717d5b204fc0a46231786d90791c9ad9bbb5e23bc22c19235521c67941e35de7501923e214c2341575fa62ee5f7df30a1449ba94ae0071f6700e1b1669dc18b9cd16001c8231a0956c1233890301614e1fdabe28f8dc226126a8d47b340685011edeb6f9690b28d8a89f925b8b39308918751348278c5cf5ffd38e0bcd198a015258937485ff265effd62f9f67dfeeba42ecdb0e6204141b32e63dfe25d3f7a35a55b06f58b818ae2aaa7c6587e0b048c8a22013d12ad6c14cf9265d9dfb33f81036aa2724147cc186f5f1a5098e7a63487ec716ee73b7fcc00000000000000004991010200000000b757cee736c5cf7d308d60c3058bf5be513c9156fedd84f8c9eb5c111917fb4bcbc4340c38a83b6df04a84f98c9594322741f6d113c94dcbe01e60679f79ce41c71fc6154b4af35e211b866a7d257de7eced375fb3bd231a9583fbbfdf5a3df600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000732ce1e06443ece8fa229c52f9c797fe76bcdb2a9d0dba8700dbd3316876915a08701ad3a38931a548adff66a930746cb6f5dc062ebeb6fba81befcb3fb9b03e6a64e57e9de7ca11c3134f1c4d9e2bb1d9cac02abb7298dd7bd9821889a7caef888fc53967d6968988d977fa6144348df9a401acec848d1c12b6ae535459c1e30312a8973545996a292eb871321fa3fdfd5118fda2032b21eff04e30a562e3967f030cb29731a82c838566d53647c902c9170fe766cc4848ad288f82de0c15b8f2160b04e05bafc659e834c4893f0e1593fedd5afc87bdeb05e7c307d0ea05475119216f8cbb11d1c646cfef4b896212d58149a7915b7d7293339182fa31deee8e24e00226583841f61f79064ee646e98a91fd0732598061beafd6a9e16a4f1b08dcd1910201b08cc59b03a26af6dd82e8439fbce2ad0def0037f575cb4cbc3b2761c5ff39030972af858002b90bce66d47b0bf48da0d841c6108c4506ce9e82c9eb1ce48db8032fce0b2671143043334c11cb5bb46a9d13c0c8c00889dd5e38b338fae83ca97a022167e867674b9f03e840379acb8a5b0ac432fba816468fbe9c3aa9dda19addfc9fcbb85540267100ce30cf3345df48cc0007531ddc79508110bef43a2f7d9668e8267e5d6b1ebda13ec2b753f0c104d8a5b89cdc730e1003da7a677027efea651f0556581a06b98fc3c0ed099f0971b1c46d6128ac6b8d5d3c9d4b85614b002f8e5c399ab2ff392a77579494739c9ed3775cb7b37a20f38b27216ccf153fb04a4ea2c3e6f87ca297b2e85ef4a791803b61d9455d23502c1d845b2a970ded36b6c498d2ce65889bc0e29089436b011719e5aac31ac6257fac4755159d514abefb59acdb0dcd258241006cef58a389556a14bcde7a3dc1ea4644343584b4d993ffdd6c9589db4d73dd43e372aa4e5711583d14d1a6d217a08a4a4485213b5836be177e0644c2ca093e8d2549567c3935ec3a50e8c3e3fd99603d4b974b2929dd5319e5d25dc462ef4665549745b232c0926255e78abcdaf73618e8ca5da59449fd0f58c44500ee89a450567e0880461f4c5e1dbf413b48ebab52479a9f20a03145514408c89ff10b867916fa37f94f76f5ab99e931e1f5ba5b3310e7cc1ebab56d2697738957d332cf5efaa24dcbe6e44484ccffc55a1351a6d449686cdf7c7b72cfd2256970029bc9d7caa07a45a01117885d83a0d7da85be30409ee350f560be4fcefb1fa837e23de6ad81a1b6885fb571874a51f1fa4126715f8e72293d1c29f455bd9bdbe2180eb12848cad5245d31b57060b130604b82a8f5d4a3a4d571e6700af14b66718a7d88371920660de2e56ad9f6fcd513b2b9418c8ae81fead397c78d298cbd159b3076739b9934d7c4297d1881811767e4cd4691ba53bb3211437edd26d5b2e0ce328d598d10eb40ba9b43e5c1c4a2277468dbae86a74e5b4e918f27ea6246c745be06aebfc293fe3ae294a2d183a2d19dab3b4f7cbf3f1d95bfcf42c471175ffd1318e444574c0ea779ec5b611a6d03dc63288414fd64544fc87bd42ae5915b6e8b3b5c8597d80be12fefb8fb8666eb102ecf6cf4a1854d1b2b64dc690b4a444fbb1002ae49fe7d697a8f939ddd9f8e323981d2c1167f735663b3792840009de8792fcc638eba58fb7925b60512b25d67681342e84d9c8d6c21539e1a1d1abe95e4c1e5525e29884b3b0877d40dced40c2e65d82ce9c4debb178f359c5c5dfc15e76dea4e0370876e317da69f52c1437694da8d63c4c380fbd4afddee022070f6dd14355c74f8bfddf5bc525ac0bb8ea6cff338336f3a7ac4b4970fb777c9ec994fdbe12fafbc3da57a5caad518a6e6bc7c61d459840e12d596d42f9b5bd9409f6d42cef6075b0c0311e9618169db314662eea902f32f84a06a686158e8e32de8311d5eb4466b469e632b2a4327c7cf3c12caf89c28308228c6ee3c6f9413a02812b7843bbd41f19fbc323c6e2a569a48b202b277282fcafd820202e4ac731f2320fb98ac7a70c172893adfffd21f8847d6924dfb710f8aaaa57e88197ef3e1c216c9d819a4c262165f325cd6d42165ba81f04ecd762c7a8c1d7295556eb2eabbce7f329a6c34c046c2fadfdb867137091a13a536e7d700a18c1077f8b45476d8c042f67356d22d7a1f3ffb3e7e47d4cbdd41babe17fe90a8c6820f8ed03dc07192abaa61270ac7a1589b3c28844324646e1ea36d1558c6dccd53c2e7c38bd1bfd749659289ae8245b191daeaa19340e6858c3193077ac2d511313bfb1cfa575555ebffd5dbea30008126b5976e1ae680c18661362e52f853fc3bf5e3cea269011d990a4677ad18b177770587d9746a09e5a2bc97d1a4f22cb7f891055bd019a55669fa48c60dfcf34320df85116bfc325e6e2b531fdaae3b37ed13a99c10c1231cf9454090125306f39b02", "51536351526a5351", 3, 235416821, "69d5eced605a9ffe10d02c5a537536fa151f2f7d2c651b2131f92631cb1dd503"], + ["030000807082c40302fad5cc60dedfed6bb86e582f00b9f62259aa1d17e2085d2c548001ca5a13c1bc0000000004656a00acffffffffc84f46daad8766c941a18d4065d07bd814d6397c57bc77bda6df1a077f70f6ab00000000076a53536500ac65ffffffff0197952d030000000002ac528429d9d60000000002000000000000000078fed003000000006384898e91d13c868b9fd3a0d5d00a2210bd527709ee720e7333be4be61bad3608c498e8595e50a4b1f09154f2bac6831939c86a157a276266b81165eee5a83a131e4f3f042b3516317048be8696a18ea7427e62d0293b9d311e46122f72caa00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000099813b92fb6ad11f7fd806369d8527bda5da13814a8b9ff1884406d94de59314239ae50e74ef798f4a6a59dafbf104bcd797d776802f5ebc91dc57a00edd45b388b827b0dfe95b7c9aceb184d469d24d8cbd61e9d05ef1fd7496484b34ea62f98b4758fde074d53d5822288c0b64ecc9eb2db60e81108094f885a0db94e5128303260b6b92242f24c5c8359cad91602095953566dd3494ee64cbbf7752c79d023e03010d8efcac036b77fd4aad696c8f8e8991721a325de7bdd22e2b1b906f08ac210b06437227d8543eac369c689cd92bc2b466c307d224dde963b9b137b40ff8ac36b10660d0fa49d9c72d7ce416321145908331c8d2e7d00dc11ad8ed8ae57fe8160301db2b7609f491bfc4bdeb7692a900242ff37bda48ed0641cb272f866ff421b4030241eb97a973149737dbc8480c5249a2223fac26ad25ffe728d7a451b61e6415020e610048927f88ab1d4e6581883526627a9e07d01285bcb58e4c61979f591a9d03292aef62df25ccfbc00cb60872abb7cb69ca1d9b13f45641ad165f720056fd14022203cf0d70ea3a57073697f5c13436e03751269e3cd6758aaf6a8c8b462d7a43dadf54d859cbdb2c6bc42f017596685dd2087d459371511e2472a0942b68ba9884f1ed6bdc998a26d8d13fd72d7742479d9b3dccd8913febafb176486b82f54dd057b9e7c90b019f61e4de30eabd9251c8f7afb7dc93eafb2f2e218ebb553bb22274435d257ff07be835fdc5d2d18fe3ba0c868ae94ff20a1b3fa1e737c13d560be1b0f1019ed5811d680d954e0ce976d7ac67e2db5e3b627f93ea6b810debe51d07debf2f6b7ae21edf3525df64451fb3aed142fa6e10f43f520b9352132e72e196e4077ae80e05e6475e38355c491d05646f60e255792f8b43719b95ea42287fec8e9fd255ad572f5c0a2b53c3f57c2a9ed237932241f9955d0144454424e7a8da878dad58ff6f11005e8afc965e9abea4b921f0ae44b53a0af97fcc34040eef0d082736011c81d89106e3fa783a2f9eb3dfeab0135c1c6d7a82b64313c9c6497de0a9c0959fcbb182040f0924e5f0e940999585081a4d15cb1fd578adf53b2033b6a7ad607acb3e1d984bbd32909e1dcae05205ebed06b09053993024ded56547b6db6deededb9a74943e45d36d1a7835eb066e8409ae8667e6acf4ff3f1b12867484de838f034d9559addc13e0fc22a577471fc3ee3cc2909dd4c1d0ef3a8b5ad7ddb7841f72ef616b431d7c874e02c387a5013b3e7f71fefd0907e73e95302ffa96fb15939fb38f120b8a3206611839a646f6742c13e5a47dd82cfb43b170f157b7311fcfe1960b215519bde6808aed3de0c390987c96d34f40d8c2c9b0e4f8d01cf7b9201b04978994a8234748512e2624b657b57459f9e862f0f6d6ee4f0d4500d6b22f88322d7bcb10c329db21c0118a25b6adbcda1a3d18d3495aefb8057a1dd45768db84d2ba333e1afcae52dd77813e1eb2f1f24de2036b20a0d28872929fef9ca134089a5cc492cdecb8485dfa7cd61c986754f4f671b46506b7651db9ca55ba1352b39efcaa2c398b31c6f21eab665bd38d5cdf97088b9cf303e0efa562f07b3aa41131e93ec0366bbf676541e5acbb4257a2c99b57f4354031eb55578442ba06f13d5b5d5adbfa9652777775ab7860fa948ea120cb8fc7bc7e88e80c1fdd154497620de19ffd883ddd437361b7fcf1d7b807ae02b0d69eb8287a24f108a04a3f884e90583788d1e9d908e710c38dd9d2685e0a3ac31cd29fe6342462255baf4a12738812c7c90cfa753b16a9edbcaa9d697d2c8ef0356dff05c87577c6fb37f2a2a7c9dc694f6702346e82137bc23d9cbba30cb9514970e56d9d0f9c28812082ac448d5ed0c9045d2f203ec0b6a6a31bda3a085e1c658265b3e8969ab61406e281cc07414960911dfd805f5a243bdacfa19fa22aa50e8ab96494c56955727f0309b2932136d713a032668f0e3b3fff7d61759b296c00d477dd0e27798fcc3226d3afce5496f1ecf4ee81d9cae480085b9b2f2104b97c239e4078935558429f9e81ff4ae79c70e3df5b82842762a5537fb3eea423186f77a830b0a6b3a7b5ecf33716a7b8bb8a99909c1880fe579f6ab81d7d57fe819dd953a89ea7e9603940ac843a4fec05b866c6fb39b8d681bb8c4304506e4146aa819e766bdceff03084007824659b4d615a53821ee8a853a08c562312b151ab5bfdf9cae1e457a4dad1ebf36e0fc12cf4add9fec0d3a8da5e5a48065ab6806e52102ba2465061f2ae2d45dc237a64c925d3053027d10000000000000000becbaa0300000000506f8144d0eb7007f3a44aaabad2130d7f5fd3b5b39897fed06bd3142aaf92794539cc4ec96e3bb16d9f5412bf823ff93a122ea39fc5168183815a971c66a43e2467c3c4cbbeff708ef1a5a5c3a1063a802dfacb3733036163335e0848a24647000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007d92e0fe45d8a9b3350a128d95ed247f9a63c60a194632a598c748b6cfcca80c0ade9c8f72b91c1eb348fd9f0147267c1f25c96006b563d46bde769830f5c1becc42c7f73cca1d52fd3a70e82ae67b5d085e7f863334e473b5aea5850749ee4a611c744f775f0f379b22f539a77a472de6160964ee3b0687b25a28aa05162c9a0220b82febeb66e5a22cdc0de4996888b59dde5d3bae72eb100d365ea470a4264f031897e1ede449de217e0a3dcfcd6ef5640bdffe92bc8ccffa6ed772a76c3985500a06db5a7113e588da39915fa29c0779b495aa1278980b42b36ee856ea54c519309e83e5b5b4afc127357ec6e8dccc208f785c4bdfdc121e1f5ed383008b5a18440215a57af99935e7e5a70f1b85455ddd2d72f9b702919921f01f65b7268a9724520210e2bfdea9f71690b137e8c9999896d7b5cce4ba5e14da453492bc23d966ee780229655ee84b64d9dc02032f13275ba5ac5ec0e00d5ded46dc14b0fb10e6d311a303040cd42a5685f6d9d98800b2ed3e3eb422972a76075caa4c6cf491ab9001034a031e715d260ed90d2439972c1a417f85dd6656f83609849ce8a35c70474ba4a70683ad7be36671e0bf77c98a2e6cf89ca196690397336efa6b12d1fbf126b238a60123673d7efabac88856bc7874aab293f39571dced515e027d43be8bc7cb05536ee701a2c19a06fab71b40619f9b01187fb427d4966ac36e5dc83467693e4268c74116f6d4d44a9865463c560672b0642319eae868946cb857db24a5c2cba536829f003ee61704e2663284a6a4ec8018cb77ae87cbf1d1113b2b71896b392bea31b64778172681eb5024b7880a69db93a5b1acd6e3ae2659cf5fcf1945055e474da1b00cfa7ac180e69f767e1474b709da8cbeb61d8f077ae9f7a3df78d4473aed3adaf1d43d1ced78550a96caf6dd2bc209f2e4934fcc05cb152dc35b40d14f5bd453b9ea4c756b59a1350cb76a5dfe349cb19572bf6cebfd21109f0294db87aaab3b4e32f382888cc7ae1a7f7ee23bcfe1ab376341fe9b2316e0ef514859f1f70ce3467f638df038e0d5cea858423a09df1313a7b08830d992b55c679b9f7173013bee82e96384df21a4f915cc3e53bad650c7645498633be70d2cc2b1aff6c0cf087c44cce75ecb5fa7e4410dd1dbb7847f7ed66e46d7822927200803f796ca5f3e1fa0ce4c2ee41ea2e798bd656a2e24d6ba33c77d92321e6a429f819fd02df502b1d88894e51a6eb920de727292e252a93335d9f0bb5eb2f15936effbcfb0e9d8205ca08015ff52a9be40af812a804d3d3d0b667b256b02702fc8652f9d3b45b5e10a629f68c70cde6d8569a7b1171f7dadcfac7f517252cfc7af9a4433baf2abf99b39bf0bbf9375e9ba9db1295ebbf360a9c96453fa899a53a4c73779c868e46ec71b8b2cc813ff1d4670ca4bc6857b3295b8a59210f39ded4707977b849143025a3d0d74e8dc38b9e867e8f3dcf8c1e2118a0aebf33c22076ef0a17241eaf683a81a998a6ebc619c270edd0da8d745f4111d4cb7557618f0b0eea9f30910ad3258b78aa1ed3156147ed81107d40a692c79b4e4f21046dad23f9fbf56b90a18faaa2ecd9f12cbbd79290d264aa7f32db694ab63054012795afcedef2c8c7da19e0faee4e4535020652e4331a6e6152649d588fab478674cb2fb025f194a4c96edff1bc1d3fb8682a5ea78a48333e673c0cfe951541a6b4908a4800398740544f5919693c013f002c1a6cd76f95363bb27896ad05d482dcc613072937ce566110efb5b0885438b0a3cadb4417988abca2323078281e2f7417f42d40d7dde1b433707e7d62375bc5a21be9ec88d3833c4e1730155e917876b1334108e82e6f226948703a989cc8cb4a9b92bc0ac8c6b3a382925af0ecaa4b311d4810b64915840c3122396adcbb01054fad57212c3c20df658f39a1f7f7041da28f9fd90720319e1fcb619042f9af2ad2b4c917acb9245d6a2ad3bae9a7d5190e1861e07947684e5ef59708a49d4633f21ed5cdf7eba3ec2e19dc33343346c7501d8d95bf56087a1315073ae83caae58fdf2af51ec7b3f97f221a299c27a0227cb4ee5d10bba3015ad8863906eea25451da381059919e1c999e4b8994c09d807a93a5af28c8662259a4df36c890285892e0a0f58d5c4085b71a531902fb04be7c809943123bc62fd2a467c04e5459614304957ff6f39e0e67aef5540db8b2ede88f10228f06360340d6e56457c03288e499010751668e5c38ecbd7260698c847806bc25e6c249bf3a61dfa930eddf9f23c3dbbeeaf23049d1667555289595df3a36bcd0743e0324ae9be605f40951c3e8998337d2914fef594033c3a5bb9848fe3c11c182b4c4fac67d86fcbc2f4f2f5c2a8b56a4bb755ab5a4b8794c2b6f8cb6d2f88cdc56057a6fbaca2c29830f6cdbfbfa9736e02", "00520051", 0, -145198895, "18b8788720320bc2c2c21146c50599c57dbc92050ec6892c2d5f36f559d4b1a1"], + ["76d6663804a62602f41c36fbda0521035a10425cbbc10e680d50131b424a7c742a4330b7ca0200000007525252635252631acc38c747d3ec35228c5dc31907e8a8280f39a712e52131fdbf02e429f529f5754228e603000000056a63526552ffffffff7766984e888492cb2031779848f35e42bfb7175fee68198267ea966ff8fc0532010000000551520051acffffffff7c0a824ef7100312e3fdf2fb78c1511fb1bb351c82be45996d0ecd4780433c4b000000000963655265acac63656ac6ef474a02cec014010000000005ac525263ac3f597e010000000007635353656aac6a092b1153031db07d00000000000000000000000000fc949a281c30e830ca6145441fe9dfed3409ea5fd07e4e89ddd6ec857cbdfe2d97d4c4dbd7cdc8f61631a1125fedddd7d113dca70c18ce7ca9f04b4a9da4c290d38749edc29dd75e69b381126dd30d10b5ea7fa8a2bee2d5f548a6b6489ba388000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d21a5fc2ed8ee347274b156773cad49d37e5916141563d9d1ca50894a0f558da3471f3bdfb64e50deb24baf0f27762cd17b6c12eaaf3ef8740be052c4bd2c1b4ec0a61eef5a92f7c21db1119b69ad97cb59b9740ea5304ae2f60134a602fe65c6cbf5ae939653f3ef2261b23ecfeccee02ab0faac3fef6aa44e638b5214625a030a36023627c88ebe6504b42ea8c8c1eae7796fceada2ecac8c609d7d4346da4103208d65d5fe20679f547f0033dddb45dabd4687319699d8befc76d72ecf05c82d0a08b32f940b3ea1b1f2fcc6651b292ac22d94079ee675b14c4ea00aa0b08e4c697a45ccb077d93354f358cddb058e897ef041d35f6cd4dfd1ecd79075bfe26e440206271a055b78f02ea39e91a2d0d8421598ef4be304f12f6d0810269ac39e24b50219b2c9a8872c0aec016359b799bc0d7a38a45a727d2f52463b97c7fec4f5254503247d07966f01a506ebda8114087aa3d6f3c45da08ce38eab8e19fb3b1f055844030baca96f9c7049d6cf7fb835137ef799a6ad0f6a40f1a4c1d447339dfeeddef002213388719ba1bd6a5acbdcd5c1eca8dbd22463802b2c7d2b936e787421012f407a31d63d9cb5137e10f233f3ee2997121aa2a36ef4cb49b5198789efab97f53f366b0c0d29d8f50aed5fc7b80d02127d05237ae1b1fdabacc5e2bab513baf4d1dcf9208af9122f0bc73d2b9ecb9433e32effb2575cc2a9fc0259990a9609bf32b32affdb64a974f2eeaf19e1bf547d4f16e54768473709373169468260939a79411384c3631bd8df984e9f72d688b8cc3881c7595f54e8141c3864d69dbbc72d4ffc821516b8be9c0c08c79d7822d80a5706cce5ae58959dcd935550886f85641d1fcce79961ea1f556723f0b895102f397fba5d0816fe9819a9f52cbc264e497d2ebc9ec81fa9d55eb09f0b57ea11ab566019921f7750ecf564d8ce4767b3fd4452b7ead0206fa3a02f3b10d531828e2ea37249d9376811e9e7e7cdca292a2dfd8885754ce33945bcf83122e09ba6c4ec85b0e06a05ad07be93716ea9e4423f254d4a630a7325c648bfcdafd7eba239f19283b241da1b7b2e9150cbb8820f6fbcd7018e2b51b2ea1ff904262e0429baf28c20cc3dd099f95b389de539934526da01fe53826dc9af5386a958ae1766078f34ab4fc95057bc1b9e06df706897b677a1399e32988ee179684632322ee3f50b17c809636f89efab3c0d8efd2c02d2cc227a83d710eaff9ffcb5f454756c0afc501659923a7f6ae149bb667cb4aae6fed3eec98e87ba94192804d0d99dc35fb34f9e561f3401c00521272641cbabbde7339db0d67be8e8c0fd0715d1dc49e19e207289caccc1f370599d2a5c83d92bd6bead6c26687cead490a51e5deadcf8d7f045089b7e85038db7d9d6d4a2ebbd00989bb37a7da5fecbeaaaee031227b90027f6627998cab611443536d02f89626bba0f215db12cc9b52f3e879c2ebca7a071c7ffb80aceed2e4c383c1ecbc022a629f7fbb304d212f747d7aaacd87dd25740fd429e9f59376b2474c97ce26b63f98709b2f94ed3f9709b3756579350f554538d8efface7a1fb109e954127269384f1b07c5b5709e14631e6d1756c9883492824dc3b2f8f5275118a6fa4d91228e03d6bda4e37f166584c13a2a56bb1445b7618c2f27abdef68efb1e9e64cd2b53c2381f6f29d043d42d239c17bc3c01c06357e3a7cfe1dee71e2e5c314df051f960d7cc002fc71d65f3fb6fd11e029176bfb80ef3a33e6740006eb421985ba85af908bb18664397311453af204cc31e11cd1b279e03aeda099a7c0d8042e249af187d3e5eadcdc343aaff1d6e8ccdaaf82a409c094359deb9f2e5388bccb5b9b0c03609c493e2e70cb10dc7c6dff63f84ffc610c9653110be0eb45d9afc4078d99c7fe29c47f2763712a848b79b8a30507455e4f2079148d11977654181b44779b3bc7a48d991bae51f107031ff3c91c109e1819490a73f23184456936f6f425b577dededd1472df1e89d1bee81a62c2cdfd9ab35bceff6070cbb7c4226977212bac919344bb4bf2c11f2f9e433af7bab128f2c3bc20e2316b890416de3f2624dd7817cfef54073fa3028fd713be888a1bd0d0dfaa405772eba8529bd06ad59db3ac47b236025329e70c6c7bc0003b4585d64a4ddafd7b5a3cd7f91508d1930db356406dcd1bdde9b43b6081297174cf6b32e5ba738afa5bbf22d8364fb625ca0dd2bba50a6a85f8df6624b7545cb7d3ef71b328fbaf8f64f2e66a7132a9a889bda4955d16be5c981aab32620511d5bbe69723b4d700000000000000000000000000bb08ebb6269ba6ceb40c1471a409c877560432721dc0374a682e46e1820b6d70b01e02a654a4bc347f8d337b802ce3323e11e24fa9126f8403f9e528ec588f95220bd2057ed8e73fcaed1b6b0feb6095afb2b5e745895e12b543208aab9585b50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000059f8d0882e9412f903e91cdad3e1aedb78ffc817a59147df84e4d010b15646333baa0354e062bc16fb381564da52e7c67b9c980c478e82ae953d8260161c3f181d70972c84d28e5e8a30b46191c93954f261436788598980731fc1656832cf410f24aad854e06962c0e63c3a4d3f6384958bd1b7074e41f056eb3d66a47ef5b30320d40557e0d54bf383215945e184ecfbc26b7f52f0175b66bc4fbd6d7f8cde7b020e4fc5575daed8959e298dd97735cda55de27cf643af5a73e574109eb448d2160a017d5e4769bec670c02da84c33240e1446ebd0feca73d46026079ca06d464f8d2357ccf6c46888d7815fba718edb82f1eb55e4d6d1dc45fb16768f42b8d19eba022dc0435879136eaaaf38c99b01b500ed8425e12785059bdde778baee505ff5d4022bfb748bd5610fd0dbfa0005860ea3d696991b495f5231b9c5c765cc112015f30219a94c97b824468b0be5053a9fa87de48c1a05f35dc9c14185efd8bc5b85e1be020475a9351efc4edd9ddef0761c5d7309f2b7f739b4bd8554929912310e022dd90213004875748453696f543b6b98303e7ea406ef5eb7ab95d909297031efb4616cc352a4a688ed6a451f8bdb5ec4199d6fdbe186a3b0441cd6df36e6b99f818245ce3cfa9bc61148192838aeb17401872f28c53fa7ca7ad105a5317852ec9e166b4a92375f198e6bde08d0e19c2ae59325f72f3a4e90e93d8a3945757813478bd4a2ea7b5a322b4fb0ea0fe0e5cbf9daafebf3b79408fb82cfab2bb63230e65f9ed3301b60094a772795734d23f99f2b3d97ece950e5f028908baa85b20a67ac2373e28eae97c6cee9e8e2400242f3a83771f2ff426421e93897b359e07856b6092148a03000704dc4ab84e63ce21aad1f46baf86f5a79ba0cd6e6ca1e70649fd68d017072f960d4f7b95248a367db25aaf577a31ae91cbbcb2ea097e0d20a209196949890a67a2a3d654719d84a5fb09533f912fa6ca3a6e864e595a5b5d3769519a142961e10591c742612bbf88e25a6ff4bfa1d8eca63dc0c9b32f698a12a79cfc1d7e79b10be72431d1755da0e14e778ec622945958ded1c10cb2840a629130fee9289f26d66063b6a3c242b7970d6c99b3dc7dea37e3ed096b912d3923c25fd394ff978b618d07cd6b4c4896cd05077024874e3c7e8fb168d194bbda11a957d5fa492b89c7d825eab26fe99d2937daf80bf5d29ac2aa18df44879ab8b90f621460ecc7da9ccac994d0f9e4ecc4a6a314233efdfcde1891782c7ec5d98ee82db7019cf53f5df362d3c6826f62812cf2c2e38d9315dd0528008efde1a13d4a298852422102ceb83ea7f90bc3aa5b2a24706d5750038efa6295a97db12e9690b2cc44be4be81a51d6fda414f65781434515b0489d6ffb95d88592b60f08eec73a21cc15c5ddcaf142be57f8f325a9f9c09a39541c64902ba39d483b5bbd070e3f18a6477279a97a365d60feb031b2aef710fc5781d274112847286cb2c7f1b17cc69d57b1d6090ffe062aba3a14350fdafdcb777c4dc7ce45770bc813e008191740fe252a3e7332fe2435481096bc62fe34eb1795e54a1d16e759cb2421fdf928c2d898e1dfa4cd84c84dd78f18d8f3412c1f5f12f3ef1211e3a6254d7528556679706cd483d5215d6235c3610ef6b855968b1eccfb666fc022481ce422c6f83d95c02cf4342de8b0757a65a7a86bb25f0182d21192e58251d05af129beee0c1f920e7df6c9339ae519c55adbda17696c09899b441380dc97a2617b9dc33bbfc00b7741532a08473ed325ca11e13d4578528541e315485b7d2f3e0a4abc0c36bc56151fc188bdf697f145aea7f2ff77ca85ba48112ca7bd0db957f10f266e7a2e7df329232c1ec28416dab2056c3f98d75fa9f4781fd72449c69503f1c7edebe20c8a4f57db34de9fc451d88cfb9a8a065f4f6956401f8aa15a967dab10cd9a288c02f16fa3f2b925828ddbec3b701cfac5d47e83b8988157e4df42951bd150ee5b57034e836079272b0d3035e26d17075c2f46a957db3c36f0a5864ad1d28a3cd235b3b464c354d68948bc368e8438ec6c185d60494f5795d681387aa2471d49f6b50f70cbcbaf922c26bf88f516ef7abbfb09ce5b4b410d47eaef1ed4467f5e6e4c48c7a1beab7a2a10cf30f5a9331d060ac463d323083acf8f481093beb60350b6e58ce10bdd804a181d197e49e559051f633ad5ca3b0fdd5e12adffe67551f7330a6417d2c3625bcf9fa02f64e8b8d3ded25d77fa2ddd59be006e8c9286d70062e7de27bb6612699763ceb4005f781f3000000000000000058700d02000000003a3ce3d53c23aa4ac4eb6b2ac228b429646a3b0533a6959e2f48c4d742582f32096c2a7f401ecea185fc3d39f581561e8dec4d75600557fcc04c351f7b84398c81ae6ca772ac16a82dcab519cded5ca72b602ff3cb8e0e32729da53dfdd326be000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000345294ebc9f009fd6f98a86b4b0d2ec227680e8fb4823d758c1fb26e156574ccd5620473116190c2c699fa9e6f534d63d5a1ead2d97fca696d919b82d96ac81f9e1f5b48d10598952072c4e90ebc9a2afe00e013be1370c53a0373b4600d2fa07b480f489c5657d812582b3a0e124c9e9f5247140cb76bb8bf7bd03a56fb34f031f95cd86708e6bc7847ca7134c329d460ea09a536cd0476ce655ac38fe96620b020b6c1ae45116863ac62847f211c80d6ef24390e6821b9d71583860fe6e01f12f0a036ca9b1de948ada5dfbd277fac25c02e07edbe308d7819c527ebd0859df561e1c13f79a5f305c068f44cea9b23a85fee0dfeb5e3098126ccd03fea70b0c424a022a6d0c3a048fd9ba48f72085fd9ed074cfb8f7df36d6c1aa40b5ae05afafcb4c030fc197d56953dd9bfdb56f8d79ed9de12dda5c879fda1bd66f5f32c63bb9c18f02244ba031e3fce37dafbee973aab7cd02492658f24d6f567d77176c26b5bb01c1020cabcec60ff40999cf5917a6b8e69cfb352b6563976a1d3e713f46497c4bbcc70201373f34e2d74bb35d1667a98e88f1c343a1753c402f9e1464c94eef67b05a4d4098c5337fffe01f2bf37fffd2621387822c699fb051fb5880ef5f9c8ae3cf8fda3648c29e92715f934e7616a332bb3afa0b6aad910f7a32a40d81a9b449cf26a21f0db4de866b76b66f8ccdf336b863ae33a67b24a5d3820687d6e90d6340c523216e615c12d3ab897d76af86fd4959ed6ecd7d512593d057ecf1d250c50d7e704546db0761fa3b26e7e373e3b7dcff04fd1aa61c7cdddbe956f2d5cbd77d5d045d3af78619169941ffdf8ec957b4aeec30200153b6a0f3465cdae3918f64466dc8bed13b306c825df52ba4ee009f177fd57467bb4b9f682e2a5171b91c4009f1e880e582ad69be701854d7bdba702c6e7a0af4585bfce1c5e12f5c88e970b056505be429a210b81bc7580b5c705002753a59d0d0d6b180dd4b67ff23856e8ca2d808d6842e265c8720d8e4bd64cca25cb0f2442e2ff2693332b6d86e102bacfbfb9369a5ba72726d70a564b8e72e5eedd5ba277c1e74ec845ad40eb4eac3a06ae9f78121c671145284da0c5f40cc979e020808dbe2cab6e12e4bf326160c70823d46180229ee16193957c77ff9f0786590f448141c46e688d71f49809fb44a313db370b69151c81a99ac737da44b4c8cea3e489648ab8b731da0f4b6e1eb8fe1a8da5d385fed61b999996b130bb4a00fcea34ef5b6dec49230c702a713ac9f5b99cdf57f36d42f4dca8b7f125159a84f3cb7020a3e7157836b40c8a2c1ab7c1e8182f50e990b47452bfd988cee6ec38144a972f85d4295427a21640a7607b94877d546c5d9e6a3fa35cc29a47544eb33cd3662811444d35e0e166c91bc07333e066f7b1ea40abde7923b56c4dc85e35fc752310b2c4a10675bb5c716a9bac17366e0de46ce835da5964d6b66f9dba4cdfcd2c7fd13d22ceeb13f4a72a61f69aafa08e391b9752ad9680689028ed45ddb2b834a9e34f9011f9dbdbb0cb87e21562d27d7a4ab586d23eb0ed656ebfd21a026d4f5588a4d516e77c8b1de537beeca3d612dc8b5e1ed5df984fddbc2d3275a3d814488aeeaf3a4838d7db6a23a239be757d848e64373b4bd1447b63ce9929f68ec7b5df48cb32fc70be9e4c269312a2642276a13bf3aaf4739057d05de71cf9e7009887f5bec3185e1d5d29c84227ba4911811240a84a449702add57699856d950f949d91cb062c5aebe9d61864e50ac822079a7463f31f4ec1b4782bcdfbdb04fc0cc49c1c9f2ae21871b049642550163bdf6b113f25ebf0e655e4676cc2ccece5b830a36234799b81810ae0cfc9317c545ace4054e6efda6dc8cf69e834f75fddbe5ca2f634cd71756b0f2957dfbc6e97c104d7fc2c20cf4104486601ce6a071bb985e431616152c7ecfb700240da1214435c58a7cf9fbb2875dea880d4ece57c6e4be2d695e42a81c3d12e80fdda4c22230d9b8ef219204ffa92c1c0aa70d14341bea335b901b25ce4db4863cd07b9ef952c9228d48edd0db7fbb91c6420b3908230c6fbc81cfaf13e15ca672a7868cc24bdd5684fe6369d02dd89bc6ea19a7dbe301b6c384e97c4d62d5c26d46f0ba5dff9829b7b172caa206d25f50a55481092d14cd3c30380e6d2df6d76d3f51abad3a3f6d15868a2ae20e5e39736bfec51e40e3d1e10aac5b5ba1659b740eb4b099da57df305f78965bc480709cbe3694a0610ab40912167031461891aeed689349bf761e4250fba3342f4c59cf3d8d601e41af27d864e9e6a5ff73abc658902cc0ad9e1062ac8034070d422eeb303d959ffba963d29702eaf9357d76db28d93fd4e596a46a72da9d8843dcf7b711fcf2ea85df4a848f89b685e4fce6e7915c215db4308caed6b671ade77e0161cc05", "510063", 2, -675465780, "82e8310db16a80a2e9e1d872310e5ef93b6130f9b5b61852f0b752743cd0acb0"], + ["24d9700404d0c858e11de10b5ae402c56a99dd49d344792cacbf155f0773332c4330508b16000000000653526500535344f2d66c84afecc6fcbabaf3f629213483bf0cdeff7f6aa9855bae23342b5c3c048566be02000000075352526aac006a6792075dbd180e14aa670a956a0b114b62128236c9508ebda7f8f2f4772cca53689c91b50200000008ac53526a52525353ffffffff4ec7208527073abc18912aabb8ce2fd22025780b93e7b6892ae14b688bf3feec020000000153ffffffff0362ef90040000000006515365526351816cb5050000000006ac520051ac510ba1cc040000000007536a650065006300000000030000000000000000401c610100000000be9d1dbe1743ad17a8a4d390cacd99415e466b96adcaea95156c9dfad0c1a4adf1d97e7893207c662e4ecd24d5f9246b344d7d5fe43cbf1972c70c99f4ed2036e205d2d683d79c1037e1093615771ae913215574cf70a8ffff8c83a06c262b44000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008401786ea8321b522a75f04420805f8596043cf30007b055127f526a2e1d0a98ae9e2c4453fc4366841c75dc909d9d33fd31ecd66dac52517a5cd891602588722d6ccbb98a823974b74a95824df6ab4feb7c56048ef243b1ce5fab25de5e5c167075a208701c4d8f0e6ddffa9cd2cebce4163d3af06fcb1e9dba858ab54b599703271f5bb053aac61c00c43fce1caa86b629381178074b4dbeecea00cc3085af3c021db50b5e492b1aa8998c33ddca55c8a5af28bf38290571f557aa41e50077f9700a032feeef81688d7f29a2d130e11e979311c362de244bf3b2e82a638abca3f68c3f958ca767faa537155617951e0ec2f2020fe3f3461b1734cfd8e1fa09c2743602102458852995711c974cc64e9934e12cdf4a6a5849e591e3f3315b31f9d0094e0320866b21aed529a8a256003155e015bfacf8901571ca92fd0fa0f58c31156f6a0205f28c00a864ee64874cfb9b7f7addc77e808ddc487342e329557e64e6526b7b030d3fe58de320844346f1820e13f8326cdc06f80c7347a653b3f06ce7973ea2af021044c854f1ad4c9a1e82a622021c411491afbd9d692747ed23c47d6a0035b6e29bfea45f81dbaf33484216ed5bbab8f35e785c629f25f9e9d53cfa0bf477280df13739b66f2aaca50fba44a70d98f63aa04c355b26f438e7104c9fa4fa4e99500cd4b3d0ca714e33e3fb8845fba1c5d1d6e172295bdd57522dc3c73089024383de8e59daa45411378ea1b75fb20652baf77c8856124541c77ded42a6587141364a04fdb68bab0621e5c4b790ab718edef48c43d91b763dfe0766761a18477d4f2a52ac183927c08a00a0edac3c4c44168396444eff24c14587fcfe157831f92148ba7d8d9e5645288da66e1520fbdbde81135c053991ea3800cad5f17daeac70b1ebea75ec228f336f98ac2d237b991e301918d8b9146862ef992f16f6a357d5b6b2a71487065ef56e865168769b13e8af8bb5b0d1b59180105e19484536d57ffba8b85b3490ca94fa1220341176ddc03f4e2e4694018c4246139d7e69aa51e86d42f24d208f26e7d6f53b3319eef2b6b656671f64d1a7769b41d9d22d4b51ae65b92922072150833cdf42f2b3d5299cfc7d09b1977c17551e16a3ceb2dc2328d39d05b982e5a5936dc52c4f02873d467eebf82ff12d45616f7de83a59d6d1246128e5bb081b3b1c93c2488221c2eafa84e93fde23a15816f0c1ad68b718beeeff870ad1be8c29d29bf615cd117b0496aac57ba7f23ecace7a75cdcacccd3517eeac4bf6e7c827aa9938af3a428483637834a013b1acb8bbc3ecbd8c297581ff64fe2a418e873bd273a8394b1c0c0317f01ead5ec0118cdd96b2a26236735b840f7bc7f5bfac344b005b3806a873d365bb6567a28c6e2543e847874c618db85485b8a0301bdbf06aebcf78ce969e77fbbba75fbc9605b7d17a66003cffd54283f81ea15150c5bd2c47ed318ba02d627ddd6334af7024c9336540c1bda3352afc682cf46f01db474e0f29080ca306ef95c230d8403f37b6820e3dc0d7a0f489cff2fec20455b0ceb0982f81b6659ee85a787200d07ff52e6938e6301cce2253f5d8bee22715e9e70aa455250a02cf3c0ab6ab2c1b8c9ff6c983a492e7dd5d397124a30c1609768fadb378e224b34e7da77580eec1d12bbe3a10997541101b862e2c85643ca0f7313cd141f28a7deac6956d786a5123a551f418f3c71a8757f3cb2cb886e0503ad2afcda7732fdbb2a487b9a062772b87ccc39ee48dde39bb1601f975abbe293ccaec6461c553cfebe71c972f539255f8b32d8da33fa3fecef019567a133a6041a96c935185b3e710438e6daca6a1e81261e03ecd577972ac4b914b73aa991b70d1f2b5403763907d5b1fad75575423a283137a42c8b3359b0662801efe1db214d003bb4068fc06df27b5cfe33f6335255da19b86122508e0d6c3405eeedee20c565b1ad43c33b5923b9d5253c9e39f9d7f3d15a7d344a1ae8aad209aafca5e4da5b1deba997f36fc9ed42538e6d7d3755105a620b05fc70fcc49048355f11982848af0bb9ba39a6c84a28fc8992821148ce8d1529e98dfa119929dc1dc1f07433a1a583a9fc3165592f9705c3b55585f72f8f5f84647a7ac5bceca602c4a8ee4e38127c74e91c0f6a08fdd3d0835a9daf847248568158ddc12d01688c7420484c2a0a77c70e2da2a5c1730cc97ed8a894c01f4f42cacc50d4dc085b9137e866bc882816508ea5cb79793cc7645ea75bf678cdcca66d352dbab20db6cb3b52d8461e8aaed38a0c2749f071de20000000000000000a4e455000000000062b75c7425212b4393342129881fbd9c99ebd1dac6150a5fdbbd9e445537eef27a1c4e41456067714f8212fa382e31450813f827d4bbaf6384dff6559194c8014fb83988dac0dce1ae5225162fc62e5a481851499e015ea3289096d699ecdd3c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065e60a3cff41a5d03ba57ba99fb153af199b4e690078ad0d5db1a7b4af6c734a7992f9aa425b5f7bf8c13797105ff179e037d8aba60dfc62cc8ce6aae2fc173d80b2af1cf9116d1993bd835c39f909423f1beda4f51dce8b4f3643776fda8b6c538f460945e696b91694a950af3059840e240eb0058d205850f1da712bbfa32c021efd69a9e8129535b946458f206f1b5d2c4cdbedb4ed6554fcb7521e5a2310e303199a1b9b701e0a64abc1b741fb73b75568ba3a506bb817f8c5e18064dd3a802d0b0475e33c3edb101cc9089833d5f80d44948883951d8981bc679f208fa593508027d6edf33a876861270dead8b19ffaeb5214c8033d040c39522b0a7c781e4164020e140e34a10078d0f4d0a041ade89f1352a3f02456afb4bd70636697d3fd00910306d1afaef6f80bffeadaf54ccbdb785f57a5ee39dfc28f90c820b3fdcb451ee302238467d588b5b976a784ec69b9bb3f8184bc30e7fb4126af273b18d5c2eb0e580206a844ccf4ca4cd35ad50371a655fa95dfe12efd62ebbd6d6af9cf1d7626b28f021828bb929e16df530c68c63593e94808996b62e1e9e093cb9f870b6a6ab9bdf761b2a0b39ff04d724a0463e4b98930294d544e7e8b4a7cbd4671448068b24f20efff1f1a82cb9efaf3fe096796dad1c835e715bb3d1d7b93e0a12e9ea8ba13ff25dc428198084b893b5d4bfbd5d9c8a355b69e43610b882a115b601676fc27d4ff77a9740fd7436f26566b87a458a411f159b44b251f7c32ae038a3461dbe125d316609b61b731009ec29366ccc8cfaabc0989f74e6c66eb28cc433601c6cd6086523b175bf17d13d85cbcbf78eaa874a5b5535eae137a77b871fc13f0bd4ef259b50ee5d4d25cd604b947ba23933bf7585e656d70a499df4715b72398d3a073fce2230dc195003fb527a7b747b3a3c2fb192b1850bb0190a3647de9675a7e14a804f8332e08e3dfada8044d78c798455b70fdd4de0be9da6c75f9a5205b8fdd9405c39a61783b106770928979a26ad717626b80041b1aee0ef270c64393314b61e4fccda2c7f4b18ae7079f6753d611e04993d3a45c152400e2c9c2f034ebe59c2f1013a16e1209b6c51aa81d9d0333ec92d6c7671a6f6b5b312c1efdf14e29c7b4fd9bfc316892de371cf886252acae0bf54ec6ad1f03d353d6b5a894605e33b7a1baa96230643314257f0cb7002c6aef2a28acd6b1f5290b7e4cad8fb746301c8c129e038652f1c71624928e956ecd2e8415ad34f1d60f123dbf5fea8a89416619b6f9be52fac7186ee3e831ee9cf34723d3530ac51143b35b52e94ab10d969d232f301d7963d94ff1e18c466117f17664b7c54cbd12cffd4e09a989b1364ee0b299f9c24e7889274b85da6bafdb65ea049a692c165608aa2b95e73fb23d1f9086f6671c6759143429a86de968a66dd8e41845dd099ae498b69d5bf61347ea9989a84cae515a5dfb1d65e8ad9bd81b46f4f0d8a8f7ee5ca1a3bfcb4c89e181acc796e8881a7f61e9532ad894ccd59d3eea02ec4dbefd912954647aeee035069bde7c7b90fceb1cc8a6e95b84d35d6129e031b9da63365dfddd12a9580049a20bf2e80901df578778f105fb3d52a21df3a914e308cd8206555d1cc331b017181799d027e83fbe3cc3fccd0ef199ed2f718189ac53fd34e15dd097ba55f5ddd50f8cf884ce84c768571fc3dffe52612b049bbb9a86f721bae9e820e219e6e8aa0f68f86aede4520f7889fc8d2641ed06617e4895d9f7c51b11d2525170a791e8868bdda07a8ec3c263a004be34b4f8c7279a58caea75b5b0e63e636e40b32d4e43422b53b84f40c0ded61b34e97297ade2a149c47055292fe92591225f5005c0c8bc9f9e4f7db30a1debb04ff0c80b8fbe160b7eccd9bbf49cfe35c654b46a201d2da5fd34413626cf160a28da3c9ad73b331f11bdba822924e0c1ca401d59c2781fdfa91e2316a2bcfea3ea9fd06ecf31aa0139a47a9b259965a17c7f3db33a2b0e56dc3425f7cd095d4962fd503290c70f5fea78d4a47b5f789afd64d14828605e19058b11294b8338754d963c3e385515324808d822e0a8f5dc3cf46902c0779f15c81f6f1dfefbef8bfd600b1b9d9798339fe369a2f366de9f4d1fe6ae8406af5ff02b52018c98cdf05c9dc6718e293cd9e2b6a6ab6a2377ff81460a4e20bf730f917e600f92ad285a180d10be8f44fa65ab81eb10d7895144c57d20f2b97962bbfa0ba2e4cb81609c2dfc0316428db953e8f2b7c957c88101ee5631c12210e80b540ddb807d7a1c375b7f66aa3755acc2a5b01000000000000000000000000965dd8e94a4119bf8dd9622853a56b73260bddd783087ee96b93522fa0acf9d355631b33d3818988fd752be35c08cf31c94c0fcd12fd808124c53026143aba3c13e90df849808accd9d691e65cd849f8fab86edb86e31d100e2464aaef41ed09000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009db5447b0c4c126d711b8e1f2ece081a5d3eb04a51f06f27a845350ae5e0545339740c795fd6323cb44ffc7d07e1f9bff756fe2f040e824b308f92cc1140653799b3507f1b5e5a16937abff60675d8b2c8d11037c05ea6098ce5809761010e6cbc4a9960deeda650eae8706dd5dee2f3611659fdf21e014cfcbb1c0b6f384d410312c80b2519a8339cb4e5cc00e70d5095449e48e9b240b1b12ebe4ae1dee2cdb602229a4a48901e018e688a6d85409a4492eec971f71e5d88b708664d415db4135d0b0710ae921965d7c234022a1996e662a61b71e0edef52b1166ade4c99b53fe6324672c99fe179640e782d70a09498d821f791a5007126bcad5d3de00a30768fa40202a8169c124a112ddacc3fa8ce5b859ebc2aaff8afcdc8131c74cc4398193bad030ecae531c78bf5abeadcbc123771ada0f0835233316f1ce93550c30b24825db9021b8b4b312a407e2a62ae99a62e10b0d75156952e6032ed3e83de199d7aececa9030d4197512a18119845c31d33f9f59ff4dda062151dc5cc2ec4ce1f380d7fb3f60223f6c3859d05956d0171d942d38838f8aa828211ee4d09d9ccade46af634fc44eed21ccd51e80d0578dde63cb25cfe108b72d241d5578e749ea3d1bbec6afd8ac084d31e0f4ae48a886e7f8286cb9597544cd7dcc39c7318aece7e3117f6056eb64e5080a628560eb5166040de0735455917983fab233945b2cbb9ff240fbed1c0416c9e429fa5ff7e50b69cc6b1fa8211d1adc7b74713ce024b83970b8bbaece76a34ac7e847f8e18a570085f3ffc1ab10da18501c713543f9c73f9ed7fbe4e2d1e7b5c264886bc6438f0a7c5f28cf09372fdb0985f0bfd9c1a456cfb448714773ab0cfba4045dafa5882b7b7616bae7dae8a4417382941590cfca88ee080ca76481625b5922d00f656d8d0de9beee1e5c129b689794a1457bd22cef14ef969aacac929ae6094e88e5e0c60526fc449465f966ba61491e96e0f9649d75922eb7bb9c941f3a3ff7e61e5fc975d4fc12dc5d969c40fb1470c2b418d600796ef187016236dd84b37fd558eaf5476105a438231c9ee551dddd35158b67133abd22b9a3e1b6483bf7191dea4e9130d4fbda608c0b95ea1ad53e324a313e486bb969baba5a5d13b3622507a4ed79f347235172084ad82d9e7718d8b07eff9c7dd6b87fc1437fd4f3c2b5d1c1771b09408ba08c92de76e8cbf54c17972bf573a56c3483d8d06bd497f91d54e0fb8488eb56d330e27b3b7bb42430867c46c6e01eecfd938921104dde850a3d28d95218ceace8206fac55f9c6e8a0ba645843ad88b99b289668183645996741178a58e061c423095074cdb7d328ea2234e92424ad479670221bd1c4fd9068ec534be01bd96e5ebbd0c6b2dff3cb93b3bbc0e6ca590683ab5ab9b65520a2368dc44d31081381b9a03122d60085f72653c87ff7d2ff4ae425ae651f8318a815d8df13e1d278d4fd7f463789e7dcc58003664541209353fbb46b3fd8735b3e027a24a24e66aee4454106ef089471f2c67d72128c6ad5e5df671df5e008424e067eb76bfa0f53f017f7daf81cc0389444b76e58faa66a6b06939b3ffaf302485d187723bebb9fb97034a3689b48ec26bc5e055c9ee414f92c1ce36b3b6ced62795ea79ad329f3de477369819342375b9ab7e6cf0076979ed614601d2cd924f63e9312b58ba7f3b0b8242d321453d03c4ee41fa6671d39142de19550e8eafb2a2366c04e7b56c669615eb3bc481ccbfb6cca907a01fe979603e121c90b5c3a7b3089a6304e35c6736d2a3b5eda5c6b93e018ed0c3ee9af7d2054fb93b339182a00bf06d58eb69e807b289aab7a2323a207d5e301f7f5531306d169b1e275544e1bafe874afaaf4f73aa3f237802406484c34360769e84d49b6ba8865c713c40ded3ad73fbe483154a5f5e891bf9f26191377deaf3899457c54633125a187daff90c7f5cfea916bc947527b6d2624f94432bbc5fc29be5ff739f6deb0834a8be5eba81498daef2f34198b998111a6bed9eeb45a5b29536383d7d106170e0bc94f8314303917027696928d92483d5b89a6aaefcaa1729e85b001f02135b5a8d27022e5a9472888e9bc7764258c11c1481c2af105cdd948b9792aa8992515d471d62b85e32df6434f8bfeedcb8cbd579a91672eb48c4c4cfbaee560aa2085f35ae217e642e123344c75873c6cd896fb3d5e4c6c3336f76da7bb5fa711f159fa5c84052ecb8a3c65d548345fbf596090a6d8fa7b8a4498f4f440c7caf4303136456011b0730ce86b91806c5ec808f24cbaf1418aec47ac7a5a85e509ac6ccc02914dacc20fb51e57ff950f480d8148a6aa74b697bd60afa120f3c7895bf57af434309d55fa535392dbebf284857d1cb8ca5eb1f3f95f792a1ad04379556be71059502e7ed396e95a73f906fed0c", "65656300526a52", 1, -878695867, "d9df7fe127081c74dd3b607e369e399ecde19967902ee3971a0ec2210f8ce547"], + ["52cd752a03be17bc81255f791f7d4251f66a45fdc287875ffc8678c998530faee89cfeea1d01000000026500ffffffffac4fd199c8d06342159a06171149a048575cd92831408b622eeef6524049831d030000000965ac52525365ac5152ffffffffab4a43baf5c165bdd022064dd56db36873cd9b5de96ebec3d7c17deecebac1a90000000009655352655365ac6565ffffffff011bf5b60300000000065252acac65ac0000000000", "ac65", 2, 1937444831, "02aa5d44f34775d4aed333fac47248ad4ce9ef9c6dd16501418a2ef5a68607d4"], + ["7fde2a4b016d8f7fd2ec0e3d41bc50c7fd7116e001b8c6dac8a4a2cc030e207bb46ab74a7201000000046a51006a059401eb0185d63b0200000000066a6553656a65000000000300000000000000004583980500000000c15b1fe11ba17443ce8a193273f5512dfcff304a5b99cdaa01e225f7f8db5f9c31727071b13fa0b0fcc0e05c0e08bf117fe587401b2b1087a2b5845f2c4ab14b4f1726e892fd5f475c2374a1e333c0209525ab39ff90dc103694df9a2a602f3c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d73c1b84f9faaa9f8b3c3feae22ab866d7cafd858f828952ad715967e4bc25eb23b482543e8f8d74bdd1835b6aa2eae395d90c9f45df0dd6c804320ac88bb744b159b5590903d7a03b174f103f36eaf1b77023dfbac5bcb69cc4f2476f45162cbd7312dddac0e7bc3f5fabc2811ed9710a3273e5952a83e227c465500bd103920323aa908264a2004e5a72fc0869347ffba66b61951ee6e9a2904eab448bda18c8032c287b7feefc1eaa67220edd499076b19019b7aea2106c7c927f583d176aae250a0330f17401ebd8270519d837e9a80225de063b751a43506381044283449b27b7b52d6a01717adcefdc34f87b6c8a298248c50e0d485967c8ee1116355065c8730218a429522b8c7d038ea404056d7a7c270b92aba0cd626d26f6a823a5fcb274e5032b90be84ca6e923f8e6b731544a1c99d1ddab3a291de968716c4f567a7392a11021b25c4650522dacc581e18e07556915a13d4019c23d817e3c4224cb8305b6430030247ea51ae4c0fa5248fdb130edf8f9855cff0239ed96f4f7fa01ee8e4bf39720325b430b8a4d8b11a115e8ade9be5bc6484e07b992d16c1d1f45a0f0070009c0f43ad63077c84acaf5edf46034657dc2eea3f62d89c3fd5f34e7cbe966e63922def2b24b6d01903f9af1f2cffbf667ffc401abe2a8da2ee09a5444de421fd9e2133414449b7dce488afb185d85948519f7c8eca36afdbe56ba8efcb387bdb3b4b855b5868ad3d53e733b2180d5c788268e6b9c16056437c8b41dbd887b071149b25d922839446b9258448b0910bfa1547b6caf261396327b5df5690466e744eef28d577ad587d77ec372ce797108353bdf9621a4a84df9096fc113f580585d6bfd0a6f50019255671c606d1edb42632e48cffe33e2f95f781a330454632d17ce99edb949bdccfb15870d1cbde0b14a7316296a79a0a6457cf6fff562c57b8170357e29381ad13a0756e59ae0f775bde0f79308d8d6ac2c88dfa196182b21c16be3d241a99def3561417a20e518f104b6553907d00bcbb600eb3497c23d6cd2f43c33f6e1e1b61fb251410c8567f00af61730d12d7f5be56f39fab3d991c7da0cacc420e77ff415a952f6d4c79b5d22d7df696fcd275019825549bb0b1cd2817f0b20e70ba1d2597ee603e999402aabc4f6a167434dde43c0ef03a2a9e5830da82a485ea15a4ad2af6798d882ca2614210efa172a59b5774b2bebf6c23d56335b718e793b3c7ecf069cace88e5003cc0b3133292dcd4369a26f3c610934e28695a078b027f4cad62e11af0c79ad979a7f89008c112c568f969215a3448927ef0b3ee1d9bfcfe095bbbe129600944d3b216e9a8c81222b27fe66f101dbe968a4b7b1e60260f2a0e4d269a5cfa5960147cb645cfb121b058c9c5d34aac1abd8f5cc4fee97ec80b1adc778b50e07fa2d4fda3c83796d21682bdd12e8359265a2f7aea432e5b969424a5e923ad9a61867f3945b728b488ce19ef1cf6e1f0218566751c8aea8fcda21a7e7d99af7fa90c02fbb5b7defc5a521e39d0ada8d672d8018c15efc9cda7d584742187e816aa9b1687c35d42bbf8df664e574dde4ead0218892c40eab9b9bdc2e2c8b3b67d8d75f44b3fe34c3a5747593e906ad13f54f97b21ba4d803674e5d29a4bf96c63756aa67a2d5f4bff91813987134d48e279cae27be6b5f14b36f4123f0c0bed328831115986ceffd9a221b8f57967077fd22f951af30bc1be037e868dfcdd37fcb4b6418f4f448779c524aba01f3762f22ce00a63916de0f480b688fa078e8bb194508a0b5a5ea75a8cd8301aabb799b36d7d54eb362e5699ae45466b389735252e8e5882800bbdc1529a853862b9f95c9f716604f11b0b9373a1c2e881e12e63bb6a27077eb2048d1223e8fb0f6cc0f65e017f49c4e9f275fcffce57785c45432b42e08d32566eb87429278ccffecea2f1de96268d30eaa50ed3f38cd5bf21410cd99673d8e882154564428fc466311fb9ec6e307850bcb3f7152e149fcc2704a361a8514e3d7ab38230bd0d0fad04686a0bc5982e3135c84bf89147237bce5400a45759daf6f953ea84e679722626bf6f7846a3312254c82b2cf4ca348c9614eed9506d30ef12f9b9a58bd9676c64b54a50c7b36560b14655baa42a576b2d38797addf4d3b87b9f0ac906f8e4299d600bfbc4e2c131ca8ac81da1caf64d2d8bafdf4d809a55f0e19e4c9b496bdc03987c2c8e42e9ca6cb8abafed703e166d6c61482de78d5e6c37a357456da9ff8a7ab76e45af40bac382152b17faf4e8ff5c540182f03a4570194186020000000000000000000000004e8dea6581ee7ee68ad124c9ce2ed375a5fcb40750ac37be344de80fe78de933d5aa99e8ba6dcc97f61fa7763b2610f977510e6d7deaa2fe360488406e3e299d84f561e5879bda81ef627ccf2bca6b9718f23d5e08fe6bf0396a2e87373d124d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fe91dcd4d5eec796c7202024ed45f6f044ebb9dad363426b62fcf1c38249b206b090c599d01fe6dc08ec8ad77b0e0f5f0f7626f803aea4c81f533e202199f72d0647639d43a7287950b95d45c2dca72ebcb8c797fc59c78236955dd4fb8dba213317b823864a5e31a8163620c00d0705793917ba622ff9f34ae26dccd20ccc7030793d7eafb31a873979b99354e0c4a7f64180d26e300b67b0202b443bf1aaa3703215294c488c74ee6ea9f9f19bdfbe30038ef52bf2b3eded5f67beb834cdb841d0b08dd3b1e4f8d9b5e040c3a9c9c058e9cde0742115db3e5fe5a6bcb1a69aa73f9b8820b880ee4d6573c00f83e9bf67341c76e3278718de55c51defd89422c51550221c869e51e24cfb970b8c034b26628f65f1c03f98244e6462335d91d3ceb54ba031738f9c6fedcc315b62322a21a39e6e99e013187f9181b60120cfa356b2cbbae021eb9a653bf3c16c6945a1ae37d42879e9e5bd2e4c410abb65607c4ab4149a70f0212ae5c8be828611ccccd4897dabe9638bd619f4349fa0bdf1a7ba725c27241680204afb521d9713d9e1682891dd4f72519b7df1c1c51a95243df710d4a14303e478ec2c04e03da5b6a04535d3c114387e65a1c2e82d9c955f2089edbf8d8641fb585b159bc2102731b3ee9a5a49e2683c8522bbd7383f376d1b5faff66096f1a6e789ae6ac6c61a8680806eed3e8a5551edbf84446ef8e3017a0a4e69d5a2251039db91994d79c83fb04d5f8eafee0aac7e7523d451f54b9915b64f0c4be538f83ff613e08a6f51fdb4786a57ba6f6e9cda8f4c4637e171ed3b62c8e729d2926672c2e64b88edd9f664c94cc4071ad21d8575f8295ace9fa4ad7e67b7fa80b219de54f4d5ac0292c88432f758bb73ea6c40a720289f87634d1104d6572689fa239b1297b8febd535afdd7e5a1b9dbeade10c7b400b524db9de561ee9f6d97a90beb28a60f2f2a5d86fac6aa24aedb82c500acd155db00b202c5854f4e407047d607202109dbcc472f5e5305d40aa82d2331988cfddd59579eead479955510622e53fac61d91dd20b070cb2265ffbd4142000780ed586204c85ff00f587cac5ad2d2f8211bd97dd3420c740a31d878a86153b4226cc5c5015f4508e04eeb8476e25890b465e0721edb70ed01e885a05b78555cb3f41e464b465cc616493e2a8e3860694c4a6cf653e022289c73c63515a7089a149c04d19d4acc031dd7ca1467b16c06e07b4b985ff1e3666d1b0ee66450ac3268a1ab2db429c607e52ec31c1e6c81af347cf467677df14ed3ee05aeb44dc4a5d7461305f04ae00ff832800492cf2270a8610ebb81e22f99c52f6486fcef9c4f2c1b8cd468fc9ab175d10d004f03cf1a3411e2952efc84fd949ba77fd5893e82875762e4745a5dd47c912105075fc73abdb26da9a49a40347c48799cf64a10eae30b14b393b77c13ba74b119765e8f42b3f76324a3523236cfdea7b2355c2f245b050c5e52886a0ffa65c17c26fda57b9045641ac119fd8432a94d00145859733d1ddab6b2728c8e941db87661204b52a9eb17a76b9c74f56f52302738af83b983e2eb8bdded329dd1424bb9f6776c08aac849ffddd214c66c32555861c1017e9e86836c5b3119f4a1e07186b16418ec6a86e7c354d09119f92146abbd978824198797b3410d10167c9cefb93ad6afebae9a9a16ee99f80a40ed5e8262e97680fa4cd68db239bf442d6527fa38329cb3c73a0de64418bef415b0bccbdeffe874ab264e698d9d38ce434e545d63f450836ce1a3518259c382dd1f01c737696e6b378911a228092f07014d2345d7ea63603d7daed63a772a2ff1b765740ee45bfb67a776f5c62859b78993ae998a201803e4424b126a7cb6ee8c223b16a526b652acf7ece5ed440b24a92af8e5b29a99ff8d6b15714e997c7a7f996ed1a5e4d4438e4af292c6758629274c89809dde282398a4cc54a03d6ebd457176e471eb614a455e685aee7ca4e96151f444e9213d2b5d6c914642bbd8d2cce65c66450dabc3778c3b0ddc4ff0336f7e01120eced2461ba349246f6e59105ab0f472fd2ed4d6cc6a04288b8477b7270111415c1e2e7e080a663c046bdf56482b9e52d1aecf57023e10770a10dadef8b6ed634c62a74962f8352a5cfec1b153dd8bb99ffcb1006982868e1632eb767544bcbf483b9243c67a2e777535d1cfb83d171caaf3a20462a228e4505d3e2d0bbf92573138fac17b0b9040974e4d0a9ec8bd5d9261025d24ec3fab43ca824cb428e4bf73eb41d6935e33b5aa2742b22fd207bfdeddbdf586e535e020000000000000000000000002173ca8461d7173d50e28f0771f79c7d33989e22fe49c2ca2157af030cf346c95ab203118bda70ccc730ac96739ed444771cdce90e444c4e28912202c1633d472a126087f3b5a57da12a67927468ee7956304ca24000b57e0328199a8b3d0d6a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c7613f6d88f102f273a0e278cab6bc0b2afc03c9d1036de64e90abbb47fddbc69d210e9cec39cc485d128adb24b026491f39cfcae875f8b2ecd5a8d120b2718edc62caaf74716236541790121dc1e4b10413541d5b743812cd9d9c2e7f5c7fb181220f06c97bb7b52fb1faecdc14ea2613cbd7e6a758edc456418b8874aee740209e4f8d2b74be4abde3e64f5969d2c010728f52df7ad765626cf0a9a812de077031bc31835726d2d9d08c5127ba67e625c01f93925556d8eb6fe629147d4acb6f00a02812048ca04360696e1fef80d53db60447e578f7cae5daec856aaf709c480aba630a322414ea2e8df97977143069a527fb17846f90eca4f5a361ce1af184b550300b47bae8f12032533cd20c53bf04a9cbbee02636b4f35db19ef3db1550abcb4020085890a56f1d05868182e740e3e750c3fb8a91436fb49760ffcc92a86bf848c020a7ad3a87eefa4084ecf6e0eac23f78ff903635c4460675cca5faa9fd64f18fe0205496f63cd6eb3c5743608ce24a50775ec4983614ed08d5320d93d53898f6cdc020daffc0978a543bcfec605f8bed96274583abf7771e286d2298c60c19d77e1c17badd71197afcbdd6d807bb38f8227c781b3a2d0cd59f971a8cee4ed91a783f167950e214f1e04c2ef78d8fb3633b3c11061e47ab5759e5c790926c9e92e9df9be3dec0615dd8b5c9c5dd6d6426d00efe5f9cee259bf7cf6816cc5881e6f135b53fcea490d77bcd54f9f26f7ce190667af5a629dfff821226aafb5bffab2efcba284d1c367e1e6dca45f08484a2e04ebdc4a8a92109e6091df2d0cc6c6e4e38ab6a83e2f33c80d1cb3fbad00f653139fe218792c9afbfc6fd5901a652d4a44a23709292105840fdb27b5274695e56c8edfcc9e5f3d9ef9d393d8645b554e3059e6b9131238c4172a31d59817b8cb6b119b96226f11eb7228eb97703c9f61938135750f0f1720bc9a0dd1c0936ecea38c2e1b42ffa5b41fd2f5f7ff7d8fed2aa8765fd5dc91717c2dc5b84fd8865a075c8b0bcec50724ff798cd07aa28a4bd816e1f505c35cd95aef02b0907315ca816bf4e9d4e5bdcd6d26588c3f28f7cf560aa940170a0d372b050d34171589e29b33b7a3f02dcfedb575a43c4edff36f336deea46a95755f853891969f121f1a497a94b86dc9925bdb2db0f4f7264e8e04c4fb1b63e1db78a36a3e2a3b2fbdcbe223464deff9ee9235cd7d0a5858cf3488d42792722a6b3f7563f8b2399c3247cea416efce8b64df7ac267b45ca3e3cdc32b863e6a4770c3f3bb034fa9c52c84c6cbcdcf44b9e699a49626977f23727b465260eb4451903a517a9432be217aad89e3ccf7abb96abd3d5ed8cbe23dbfa81f6c53e8910ed0b308e27246ea31e54c8c59de2c68bfdbb90a035642ce06ad24f2b3397acdc5dd756b5fb4b9a4cd265201b9b853f8cd4e530910393d0ecea15178243309dffa619fdaf6d6c8c78c2b9747db8bb668c4991fc13cd0dca1d3ef487e19c3742999b23163f108b32ad2615297320ecb0125be0b5eeecbe9d625e54fff095abca50fc2beafcce3a074ceb65285ef2571e9b83168bc0fa7054f9cc32e60c39b37643f26451a2bd3d4921dc37581f3cb34b072d3bbe2bc0c680a129fbc26a14dac119c9a7920110aa10f84192fa812d29bca93bcc40a83f428825882dda064d5c183c8d81e44be3ee6e3039dab80f08da2489d0314e911e76fe096a8bad9c15888e5a494ae9e79391ee5d1a6257ff207e47ebe01636cf62f0b92e018387b1ce031fa4af9926eddca9e6a58c52306cdc4301621448ebe21c127bd5486fb70914a7a0eecf95d6dabf1ac8fb2a7f4caad0143ba8dd8a0eb06c70e5e0937bbf7f12507625984c541fe1eb14544763c240cd30e33445f8999d8a395dbaf2e276f2b39612751f25b0f7f3436b597dcb2717d32f44202aa2d46364e24037d15925abe2ffa055a41cd670c37719d384de1e87a5eb768ed617f10ce0ea2ce11a3827a97ab25dff5ea6bc6fb55e4d488fe7c681b9eca4cd97125f02f9455935edd14898bf92f705702a889622762165600147c161d8ab9fc2c844952b72cee5909ace4667e48546233d64166bfd95bea32d11c117265b1c6a9ba333aac07cd0684ac37094fde6208268484a065e5da7182baa72156559a55f9e0aab27acb1be2165fd3a59e5f889ab405b2c2f5e0a1bcb3e0cc67ea5c57ac0e0cb67a504927f4c8e35dfd22c75e32d7615ea020fc844459ba1b8bdb68d1443517823b5b3a2d4376363b6d91dc312f2f451b79176b7487b996d23ec0ba0f3857515537865c9b19a66a8f5f48d97ad41c6fd5c6d936875130f47f7871b03db317ae448992a2856b3e0dd59221d8f115196ad2ed5b4fbe5afd9dd5342105c4cd9d6f9522284fcaaaaa93e5d7294f1ec4c92731942aa7dfa62b3e534e7e07", "", 0, 821766270, "b7bd104edd16cc835fe725208dccc798d84e59ed3818c65fbbc10d897b23ddbb"], + ["8bffad1304e82d6daf297be715e8e8ae18e5ea1fe112ee4c56f6153f01c697ddc6748a6dcc010000000096214ccca0087ef095538e987f4c42e0550c413cce7d24c6a52acf4be837081bf4402f1103000000016331dac89c78a3b76d44b0a4b9acf247109f191c99ef42f2a50019ce6d9c7179dda4e47ca7000000000752526aac525365ffffffffeb74f792868397e48601dde7095c773dca1251cb4dc6b161c2670180ecca6c90020000000552636300acffffffff04eb9648020000000002526a0075d70200000000015142da8b00000000000600ac00006a513f97ef020000000009ac526365005200516a6cad258c010000000000000000d99689030000000075e5c543300ac6b6f79d900eb6e3debbb691ff993f39c4251c509f4e280eef4bca66a55285302463fdbc9a08f4eb43e496c5597241fee2f4545904f74085c0eb438e7abb6c7df1eb8a9e1b4fd07fa787a6d2eef25f9da298fec7d6e4b8a0a110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f33f54163b6185e8ab5105cba49832503fe2d926bd341485d08be054ebacbe3a50b8494d507df56e4c1109c65c9d3d11123ca626ea0550fb7aa8848f24523199f65757c18680f30898334a478a6bb8c5f034928c530653eb718ff7f12397f63f15709ac220cd83b110b081228acf90d05edc110db9d1c27010d66530b1c171b021e2dc7ecfb6d531da659107008ffd5ac0b87a4ab0596a36aefc897a4f745613d0219405518cfe396d1246eb767c86b3dee8a45c97fce7aca88d482cda08c3a00280b072d12b2a9ef80aa5579493a0d3f76488cd6f76d071de69024b732f30bafa2653b9926b3020ec908c043b4713818e611e5d54ddfe5fc2f10fecf5582233e566d03044eb26f19d12b4540f4f935db1f374d15210f009f2c2a464dae85585cc8d3a702138646f70d833ec3354b237775302fd26d47b953f8b873ef506862acb450dec303184514134151dc56458878affc0ddfcd06abb1f02a5e39b0e0b6f16a1a57e182021e84725a342637063d2d2f0131c77c62f7ec7e2a11ac665440f625e04964f6070306ea1a7118dbf11de64acbb44aae9a6546da9dcd6bd63e3dee8a47ae87f612759aaa956405b0c7ead51a99dec302b1873eca3452ff30659d4e23bba44524b5553f6837b5a2654078b24cb54ca38a8a5d693f1811b35e15e966d93c81366ca9f0d3e9a328bfd490f7cc9e1718a822d8ac693433bd070091a66615bb57a5d95abffd528a52d7add8cf5e0a730edfddf2b7ff7c113ba99f0dad174eea8b724d37e6685253e7e8898f97a0331673dfee1f83a68ed823c151fbc0b3563aa7f678765d28a33feab990259a5529fef87535f978b7cd348ba9bbe2d7baf0a0aaaeeeeefb3c4abc7b5d508529433584461f10e8687e184acb8ea19c6e4562585f7004979689fdad125b3ec68d27b06a0b63ade309240084501ded9efa3c896566149bf654f9146a036906c90598e430962303ba09393bd82a3b95cf8d2beee07219bd9905ae6d06a57565f4478024c009d35503f8e3a14f1168cb078ba9ad494ef4c032e799b90927e054acbd7552595f0acb5d3bc022112bf7f20df13e6cd4c0de0023642abcf84bfedb9f30ad9da5e18ad4b288daea572238419a84eb38eeb3280e79f247ec181a8c844d708f2d5efb28dbb88818fda6f689e944f8c5b614dfba2a03dfb20467f3745c7a1ac39ca7d1e000e8f2766d28cdf750a3e55268738f4b113a2b8fd463e53a40787833b7c524c3e31b9c9746e1a65e87c86327b3242a0aa0986da9cc2f91ca3dc537d71a08df885a35d91a8e64032f9412c230717ad5fb26772cff801a501994bd8006b7d385d9578681542545490de4227efdf2146d01ce47973164973c59ed898866a8b38ef9324c3ace4d3cb7c20680a48f1316e68acc7831efc71f2ddff93e910821b0e5d535d35d51e55b80796a304b8de2c9ebb824aa6aba03ebb8fed45703fa62012940b794116ecf968d3274db93950b788513fa82f91dd2ef376ebf0acc066a5f2cba6d69cb59ed805998e12d1d2be5320d00f6a9cc1212d566980620cffcc69112f6b1e1d36b8865b41c8ed22ef34cc3c7128b0c5daa70e329a4891f7c5d716d618f1a3df4e0568814d7ccbd58138e28c186b9dce3e33cdcd17310350c587d5847fe69ec95e7a7b616c9e4b62834389902b7acd491f3518308102a644f2ca5482d46d83c6da41e4a1223bb711a90ebcd863d032ccf27511c4209bf1e8e542be94712dbc1fc2f08f88dd7af52cc787fb98db2c384b23840de01eb80b9c7eadf0c8b055099646adf85e63dcec83df44749573b9a2c65704825f1ff9442213d804b133a7308720e201da85fc74910d6b727b6770e02efe458a77e46aad72a71496d73379b0c0bf25a39ef512800af962fb7f13ddb8d12ba9374dd76681e4cc3d87ad00dde5297b9595abd4af6abdb668297a5b5273ecfb4bf1940151fee80dde31ae1d4abb9564f764679195c89b4b2f6c618b2e135a78db434fc8ae836eeca87d344564538f63e806adf83e1a148e82421bdcd579fe0db50396e905104f50115e692586abde66bd81dac33e5a7a91d7f79e59cfa9c576665bd243b8277650237fdd7909d5dbf37dfb2525352647b380a890f942b63778d3a287b5e3da7d84aabc9a9900df92c605252332892f049ea4a0937fc2e4d6d56389fd311460ebf62eb43bdb6332d5e15a9073eaf2d3161c16436cb8181ccfa6b8be65f68e775a77bb2b29e6c6c5aff543935d884921f77ec2631b5cc8eeceea0a8b9c54df5fbbed57a861e6b6060d2a443af867b25799443baa384338cb384fe57a2db55bf4b9d7f678e20068e576117b8eb58aae9d8a91f8836b29027af6bd093e78580696b9cda2c2497791365d30cfdacde51938232d3e42adf6f6829fda635b4f7c064096f6129e34c53fb919c5503", "525151ac", 3, 669318839, "87e4d283c7f2b9f8e96edfaf79b4ef87e8a04a7984971e8b66d3dd52e766625e"], + ["745753360366e3166012edf9ce59b8b15979ea8c47b2f06fbf223ffc51f1a7fa5820af36ae030000000765ac636a53636aa53beb12e3d12e7087424350fae97a3408bdd6d9223324427c40c46d0cac9a2d36bd1bcd02000000056551656565ffffffff9957a3c832a0bf1531fdbb2a0689a07911584dbd8a1a324fb007e682c6968ab1030000000952acac65656aac00525141d569035f7fec03000000000952636a52656552ac51dad1dc020000000006ac6a51636353f04b280300000000066500515300ac820615070200000000000000000fd63903000000004583517ace0f899c82f650510592f19220dcdebdfe2d4ebca5f59de494920231c31390bd14277a725cc8e06c8426977a7a46198458b59391a23a0d5290dfe26490aea95fc9625d88a6328bfe4de046a21a3fd571e04e913c4cd560d16a798c66000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000726130281d81c2f5b2e0fe39d4e852b12d6ef6ba40c60a454a9e6acaf646598195a43d5050b745c5738aea679db353a96135bbf7946fcac8e8086a909cf350250c086b886a07ef774b98a13d9e515f89ec4a7b7063328ccaece2e78a37ed165d939f45f7b9694063c03ecaa99726be63dc6822cb3f6b6233fba98e27e4f02120219f2cc1d316eb836cf6d0d7989fea394c857b84d50729a5064bfe14adac1e19e032990d19fe9424ee24b8d4465c83b25a107d602ab69853d01c87ed5858c59f0f00a067c929e76613b4a44d5a489920a464fd02ede4f9bd691890b958db70b43b882112a0993fb21c08295df82d7c330acf7c4a0aeaac40e2393d026cf8c2882e870022559c6da889080b2ad533b0c24b06cec8e4d88475afe5adcf6e804f57e41a08f02257df1f2c06a37c9b196d894616bc128cc88f40aba79ff20c394bab291df86d6020bcf2016b65ae767d9a1a4bfe4876525850881ef680050592e8598d6966cad3203086881c1f813a978b08d4ce76c6e931479ac32adea783119db5d55b80164f71702001cefca25729985533b131e48fcb0e80b23f073358bd636d97336b3574d5be61018b2303e3949273fcb377f39df39fa5e1cdf2ff2813479dd65e36ff8745c21a334c5e5e281f491e3760f618ed65fc423968bd454bfa8c44981942fae848f0ad4ced2f72192afe2e868696f7ffc267e6ed8ce1bd4ee2f5e10660d86f77e5801867afab3fc97435b4aa19e6516fd5a62524fe0d95b1f7645b583afe38a69706855c8c993c98bce6a4c634859f90b79acb5ec98d23c83e8638763896bffb73eb74ca5db888357bfa94c8952ffa08e493db0e06ab1a1025f6095276646192fb5f0f7f1f9019357aaa2ce87b6d2b877dc029693582efe0ed892c736492a0d9da9c3c18744ff116a971c0bf71f61b433b7481937288951ab31c6709db7b6dc66dd6f7e6f61850bdf151a5a21c1ee438a04fd21a2b0717daff26ed43b69a61efa18682d60ea8b05feea0977574af331d4b4cf56c44ee14dde5f4766e253aa1e4290e513e0377c928cd12edbff0118bb5711962483281fccdb2885439a7e6920cf076fa33b4b50d1d4c5bd51f02fa557029870dd0451b0517522183f8d1b86ca5b87539679c34ee2f08fab08cf23951052f73d15028fe94b1c4abea9d49b92d0dfaad7ec5062c20ba7d6a637cd9430f8dcbf19b6f1a1503f4aa0caf72ce4a80f9e049cd675aa302b098465382780ec5f88f0133b495e57af807c41c31cdc38978ef52920463370507683e3a6687e318f0d4f7b4a6558395fb48f757910b96b584ea57db41224ee39b1bcbfdfc5c8aed654256eff86040479ddd84d68cfb4001ddc1660a0f7d1b741e128791cc7abfb98ef7d1cc7d2cf32b0bbf8917dd48636ab371786c019568e3d32fb918824f8d57309e6d6fa3492d2a50fc0109431b09dfd926d7b8ee6f3cd4e50af89dda8891233cfa95ef24b1cd696a3edfe3e3adc9b9f357d6f023855545f06f886aa475fafe9247dc046a896616a816f12606ba6ae64c70a05eb5f8347401c47270b4789c7a0865b20d2afeb9caa2d3198ba13c6ca588f991984a082a5be72c5bbbcb5904baa51fd7beb230f8b3cd4e2f371ede66694798c97cebad71de08c09a827d69d2a062506161c7d36a7fe025fea29b44ae8ebafefe9697ef74f413bea10a763a9d817ed203809cd3235a66b9398dd808281f8db5c5c2e7a5ecf72875c5eb869e7277e2fb1f9af7de1a48a9061153b41dea29e7d0ee60c3923908fe0be1a241bb98878ab2dbf94d69299e2dad6084c28db938220c224bb798190d6d12a2731d481fdc6fb9eacd0a58ec21ac20a2d3bbe0d5332393cc587576f83158cb523f1f9052cd14cfd9b57b1218dfeba64c10bdd3b107c63e4f02eda5d983b77e496dc2cd85616ed1c956b7d937c41b4d2404629b0d625377c1122443df597fb62036f3c5561a042a92e87918f44c585071a263a40fda39bee83ce832bdaffb918fc29774961a01abda631f595f5ee079fcd4248cfe7051781528f792dd822d88a3f167059dc70bbfdcd7674a2fe74abf878457824a5df3688e58f47faa2565609162ae33825582f57325f30e58120af4315d6acd62f549db766ff5d8d34fdaf2bbc00b4a99b0a8930ddd473b8b1c08d7dbb0cdeaa8fba263f27d86c698935ba5dd90f2baa12a15fd78cfc03d58b8e554bc80a34ee1f07f285e446a85bb78e26a2114be29be759da390422a8fc5f45c2369f2b40130cf81fbe5f62ca1f802a66a6b4a437ee83410394166a1f000000000000000085f14f04000000004e256235e1c5cc4126c933a279f31150cea066969d755ee4b3e76e37ba8cbfd9f02e50b89fbc2f79d6a9cd07ac6f3535493a9ab83fd46d3c32e456586b3e61d25429a18b9d0f5576be27925a6ed1d34573e99e7e3eb6cee3001be007dc8e7e8b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061063ba29572a0267d572b5750c2532359056f45ca4505ddf7ba71ba92176845fbeb34c9bd4126a58a1e22ec8f87951152af6228104b3430571d71cbcaa347e44c271803c7ad5b424c669bfbefe36b1bbe5c79e5b5bf1b4f6f45611a1e7539f5bd475477d2a474561c7e3dbe7b0850f3222cbd28a913bc41cdf97eaebde9b9560301d5e6ce64d6e89d021a81adf4b7a95807a2b9a1eb2e391ae3e718654372e4fa0213169ecb88edf2dd0bbfa59c361b9c9df6220e41a4e69f67f1de5de25a194eda0a001b08065dd7a2d3382beecb9ca652f81d184001df4a50f4ebe2d1a0123c6b38ab1a00eaafb959d694b79dd6df57884b36a8c100b651034d922c45cdfda980400321bf72434b87a76f364fedd1d62955b83d261cc440725c2c8e0e81a066b9c7c50310823b2da259ba69da016d69d16affd36fccf302e98b4e7ba1339dd1c1b239ed021335740276dcc56bf6d1251071fd5515c17dc541cb8288aa9b2369779cc0181a02264801f9340219b2af5f6fd7ac565d863965d4069a8af512d010d05edd1b4d2703083f4092918e73c62b93ff9cea21023e26929984af133813d19710a71dda6ac50a118190eb91390ebe03d49cb3fbdf4d97af4c422532da2fcf30c79af593966e81750117756203d9f506f9a5df55196d75615e5b83e5ae978ddd3eaa96c76df05ad616502a819d36cadc0d52e49cc33208c1141b0ee1cef3827499135c182bd378978ca7b2b0bc8d09176c76766c7809a659a17c38aa753c2ca2061bdf6ab0bdb34365bf19926a7f2309476d3be2a0acffd6577783212730906ec153408b8b8b479717a673e2c330859bc949a7432dc771626b8baa8d31a3b6ec08f659e530f347d1e2bb333664625fe27f1af3b63feee34fe60ec34466b17b85f79d1376eb01d0c9ac64e9a01adfcdee516bb9d04bea1c7e8210aa05594dfdf72090646a2ea2a8a12ea113db1bd42df147082ee23588ef2063d4fe6a8e715c063a496867c73fd2ebd72df2086cda65d76be5d5f23fdbbeaf906dc00bb57e57d281a85e60ee1c530d1406b2526fb963eb20807fadb388e6a93a297a13200f05d0c166f0db1a20837213371cf59ae90e984a8c7723d0de28167a554be4024ebd91fa72e0bd89c748638b571e14c546fec7dd75f460bf1f0a6a560ae813909cc7f6ed22806a7bde1de9dc236e1b73c1b6f90031b5f4525627d59d0fdabedfa8ef5ec908ff8eccfd624c0ffbd1f149bf7d1d992735e8a6552f1110b3d3426ea6186270ceb410a165f5fbe172eae923ead9f227591856dc3336fe53a3550cc00f12f3529bc6fc0404b34a230d47752c8803687b1cb9baf99f94ff231a937afeb9227ab6cc3aaf7c62cf931ed17a7304183a4b2ada83e6f89c9f60bb84c780d72fcc7088b07b591a834c40a92d5ffe8a111ce55e4f633fc15bfb563efef43835a952fa9fddc5beab66eb8a0fa332d3c300ca4dda133f7740b2bb6ee2ba0050dce090cd41d86decd5c26dc314d6a0ae079650bd0358e76ec4df56805456ded43df804595d96b0d9afb691c9c29982f5707a98296218fcb5ae251b3163ccbd9dd1a455a5a13941e11d130561cc494473b88658cf98f306124c0be4c81a1853c2ad210136757aa94cc1f4d834d22581282453bd146883c6f52f3805495632a60479b68e44b42b10b90fcec6d1c43a55d8bd1bbcd00c8be15d4609ae2307100e53cef467ad249f5590fc58a697eb56debd7efa724931da77c9cb639bfa94af70107adb7a668dbf21be7e96202cbd78c578480fca3c03699e7944c5dd09c660677ac786e9bc2fb364afa3d6fa8936c2df7e37b0d048c7d768dd71d5fb7394c9c82d7e82ae4407fa61e0e1fe63cb64ec14ec8dac63c10949b469c8c6d42898a5b1b7c9d351b70b47bddf214b835a4f6b58311beea57f6bfd91ff9898835e0b5b0c15de6da628d81039eef7490bb22abde88f70e13adf8c0d0cd860538dbc4ff5167ddedbc160364cca45da4eecb31bf6d45981cfbabfce5e5d313ac118ee3c6ece2fb16015f58569393211ec26b11bb5b3ea0973d3496c3a391db35d7db818d85920c808337301255c94833fcca2dee77c62fb0e5db65ba3ea6b8cdace67979f1a54f1ecf78a979e159bf936d7b6b179ecaa93ac055566285670d6ad9385feba564b09278221d1af4eaa3386cde257d79e2b3ec7798b5ef024ef6456c53537826a99eb16000157ac9fa29343f7ee6d178f281cf0358a59acd5908e8f714662406dcdd0edbd3c7aa0d474955595496afd833c23dd90ff62f7fa2426fbf50926e4161843e9e797df922971b377c18e1f6b6b66f39c55e057163af5c6023b1682198432c89f56fcdf7906753b416a2f35b2c4f8b10b35ba9a9c28a11e6787b7582927f68913ecc9bba590efc1c8e79001d3cb328396076ce017fdd02220280b", "63526aac5153", 2, 382137557, "b85b5cfc51af7a0d5b75f0c0076ebb13e369583fcccfebea493d737fad8613ca"], + ["030000807082c40303b1dfa10166d85bd66150847bfc6643fa19a0403ec4da1d38b3f7921a63b0b8f7000000000365acaca3cce7cd0935dd5b07497b3b0a14b8079298ba31a1004f9b6e720badf5ab68de9a53fcb200000000046aac5265fffffffff36ec434a90d595c5a6d829e317b20c5af56b6962be9a24d082f220e5ac9afc40300000000ffffffff033ef7380000000000055252535351ba5dd304000000000800ac5351ac000052f10fb2040000000007515251ac63536a00000000427cf715030000000000000000a3501604000000002ee1eadc0c6ee6a7dbd6f09b27fc4fe25052cea8f0c500ff3d5642b7fb00a47226b8f1bacccf28df896e267f38fddb44d60960153bc0ceb0d9bab9b1178abcc3ed2d189c9d7d84acad0a25a8b1aca16e81ab62aa2df8a15add65a32550f545d9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004ea612fc3715357594da52008afd381241af74538c566de816ce06c04a9115a017e09d09dd8b0d3804b8df8caa4e7f59393edfb856b76a08f251a087adae7c8e16aad098da5585c20a9f112fc7a141caed2c56c2060a1c7ae7b55921c78c77137fcdf9db7366bed4f85cab681593bc17b667871935b9ac89c54dd4f4c4f176520230067b60a9c7b730d1b344013ddbdcff3b5275e5ea805cc79207718e8bbb504d02078c9d1cddfe40737d0544154c8f35448130de249380b089255789e9a85996dd0b048333e803fb0de072d8a5e01d0dbd44c66883e78fd2d6bc8320426c44fe51a42afdc5af27abbca043987ebb87820d20ffd77d57526ea9650b9213a2edaf09340306f9cf9af2c7b213e52a75a07c5e07b6ee26014ca2251cbff0219430b38c160d021c32ed6245a9fbfb7b34cb13626a10b1f46b88ae0eb3cd58bdacd9c528dbbe1f031d3021c5077fa0f25e738b0051d2d4c0810b2d8e691eaf26a7d1885e4a626daf03286ec15d1deb55b3d5c59de91e9242b5f582e9313c8343fc542e3a7230868c860214fb4f4ed83d488a2d917c7dbbad057aa034f12f5a09c997104295e0bf1fe7a5d9dffcce1b99e176e41938fba0d9ab6bd4331a775d9947c884e8f4a5d10797446ed5cc67a93f513dd4b755783cca428d13ec452614cb996fd51149f8721afeccb4e624dc098f9dd8a4a3d522ea50c8b7f3eee1db521b7872e22121fec0eaa7b6b72f012744cf07772e7cac9330c29ac29885e93da75b6ae8b0313499602465258ea9ef2e6168d2acfae194a7744087029c1ec467762d2063a6f04eb0c6c94b611e1deaa87642235aa5af19cccaff68a55f940bf1cf4d5c4603b3c049474dbdeeb882ac7165cb1764be9dcc097677a263c26a699586cc2f350dc48e6efa7b2602695697e60242d4bdab15d6bf2a5ff7ed7036e583f99f21c161bc675ddab3edc664bafea7428e63a02ec0a4f8e0335ae0e0fd7053d810ad9358839b3804fb4240251301db0bcc1f2379a9c95f91e81aea87935083e554a540175b193c70a2a5feb24ff421386996ec13056ee43568821216c8b872bd81c7a89e665fe11058f1fc6565681e7839e490af86d37701b34ec1012da14ac9c9a17fb0d29a617294fa2ea3865dd13c8894d3b65098ed74be09cc8df10634c20f2ff85df17f9ed1114a193c112f70061711789e884bdc56e8a38482e1c6d031760017a6817f12d4c8a22cb043abb7b298fa6075ab832fe683c2e0844032847ee694d2fdfad7e5bc3e5597f4f2722388eacd83efb6613bec5083a62eb3707bdec2bc9bf2f01aa6dcc4decbaddf05e4a9cba6c9674d3082da05a436eb03c8c7d3aa361c6612d8249adec6e9e331594e118b0064dd1b43ee4d345bb8c865859f95903d320e6265ce232f692145c17cdc8aed24a5d475c6e7ddd1fb75ff050e0782398bb396c9a02b73093567eacce9f9782f8dca806eb62207b3f58840bb596de9768536d9b437f6c3f02e6bfec8ec908df773dde126946e126da86587e9c687d2b9f6e7caebd38a52fc31a8fe74873506edf5f26a1934c7bfcdbb257dc9d452110a505e453bb2296ab2a8b3a7cafbc105645a2d755de88a392bb3c68dc0f001b24bd94df00274f8981f7144d07ed064e3e60bc6f12795fab907a5a90bd9ebd331842a85bb4cbe94e38fe28063214759fc707af84d249483f8e9d2a59af7ec4cacb516cc318e3bb1fb039217d243c98d3e01f5766f61e5cefff5b06f6768be95b8d0e94fed68c5e3579d63f86022ce871efb88dc236972576aadd1602d254274c023219ee5bbba4ea643c1c43da232db9c3c77a94c51099e9f1c142233bb3be2c30965a2678c769c5b19882902b13241c12a5a09432363697ed341b414daf39bad573c43bebdcf36e7a28a0b23031d65aaa14340e64d0a9226376661155107a1e6925c34997d284c4e39061e9b2c03096872bc067b66c0a400ceaa9dd70593cf1157997577601c60bd79660ac6af2d3f8768e76611e10ba666eba3ec4b8e111a8ad1a22452c4e5d33859338856ec0071b5bbd8b9de2e05f2727617b64a14a3d437b7050540f50a6e99b1478608c0dd97f2c2a4b53aa9752e339c5fa3deaf30918dfa6156f68d4e47df5ed1def07ce03645dd2372238744846f954488aaf525a938f6ab9a8ccaa07227bd0a555b9313f879dd3a05ac53caed8ca2960f217fa268e15a91cbb24f097b783b21347d55d5f686f6390264f6f2607e9fb2a08a115bd3d9914ce4fc53e38fdd2f8703737283196622749a9a880ba587eedfa24410b6d1fc02000000000000000000000000994eccf2e4a0cd40e2c0737fa469628d705bb2c3a40d92f43b39b999d27e6ff2fc362b8c32881241ab468dc92b7296c3f509d85a72513bc9af0946fc9e48500ae690125b1c19fedf07c7295ebcce19b06fcd273a24b6e174e0b26aec8138136400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bf3b2fe9330e33c5615d037bb8a31e0818f3fe657dbc68485a22abf72be36a64df53f57902a4c450d198d863b3028453b9b2ac440b548d3b644eebf8297056772979a2f59a7648b721cd5de1ac71a5744588f71011774f47d2caeee610013381f7bbe7356fef99c7ae2153252ed39a71cfed9ad48c68704084b38366c31ec586031cc4f77d4d14450cd6a35f78cffc5ad3bfeae5207ca40a0f719135b81bb42e440324be1a7453acda0f0906b70762cc3348921a455defcb2b27fcd5508b41637ebd0a00b70edbb11ba1f35add86a2bf392df0e7dd12d93468d1983c33b9db39c11bb1c90af693611df6848443f2a8790705cf5cff9f20238aea83357440d18b939d04030e9dccc046acbb1947050ee981a2271e1a34a0468f6158a73fa78e419e322508030c1d7a7de76ef0e5f220655249cdc3d10b35c995b0950acf0f2db774a921e04f02225bc8ecb983443692676b38c40e99aa54a492313d8fead29fa19f98ff36e27102177878a111cec577f8d3027a3e64dd1ac19c4d2f475374c745ab8bd4387cb8ef031626c2cd1fdd828e98068b8b6b6f0248c2e3ff8ea75811a8d1d65e6d3c6ea1c6595df7cfa0af2b2b8c00b31e782fe8cb40fc221f0d8701f894a4e67cef3949f065dbf3ff7a5763738ec6a230a196815fe81357e812efe10f75515596e6a7f6f2ed1e93e62dcdf983d095ab9f012a3f88afe686ca4f9409da3e32bc7909226816e15621f3b388923b4c12c608c10ee0bbe197725137a288e74445ce3399b2e683907cf36d4995e7bea2a205814ac8619fd7ecb437f7ac3d6070cacd31a91d5434b5437d9597f82eb67be4d908d1f13cbe2afa1a45005cfa5e62464547415f55176e5f01eec57a34ff0bab7b2e83761eb5a61498b1a25c02ff64afdf198f70b37efd55260739f91238f6bd18278d28f48f82d573e886b1e25eca042c15ed3c685f62159a84485cab948cc79ba8f242baadc3615b6955c16151284a5dbbc36920ce7b0aa5a309e2cf58044cc917313d398d5537a85c5fc9bf4ea4f81a7b5d4c622b3f192601efc197be920ed72a4ef7b40532e61f21d1ae68c9e35d87c3596970ce0934d31dabbef9566d180f1192e6eac48ca9019caff7ccfbcab120d71a967cd13d2b2c79dba13137985b3a9edcd57280f0ee6205299bbd2afacf035089ae116d97af7ac21bd9b4e47088874b17f45449482d9a8c86f8e94e1c47f2bdb7bbc7795f4fe1fa79f70690828336666faf2d54d6f233d3ad79a0afa8c2b79e60d307672aa710fdb55bc1b63d24af196fc16047e95ac3634b6a49d4a613715f7687a9b88643450972e2cb6bc785e9dfeb7a5c71afdc03ce5d3708d562d0d475a0d9dbecc57a175478dcf7513093b263d0fef2d66334eb34db74d4ec5009fba0c76caf70b5c02caddc8e88be76eadfc07b2f0a6efef4fd03207eb712787c63043c79d85b10f87f99a5ec76152293b6607f6a18bcb38b3a0650b683481b09d29f00963bcf9f0ad36c3871ecead2383646077a18d5a8db7c7aa6539afe196b1628f15963d29f5759958effa2ab0cd7b106bebefa321ae9d3d000db69f20ea596a844192feee2f081d983c1cda4a54cdf88c1fb3decfacdaf027a52f5a52df94dec53c756ffe2fc23a3da48c2807ad18e3ca68278896c74b80b0d14a9880594947e7fa697f216149153b6db09d6244354fca28e6f80639919a16012afc81e416dc7480ec4e34eeae1d8e39197c434983bc6a8b145fc9539ae866eded21dce45240c7997e719698ff68eed6bd55ef42cf20bda629dd56ef8e71e86c11a87c80ba68fbf53307cc51b0bd45e23b8077e1c3249bf68136a07fbc031430f474a5de2af07d07a49104960e0fdff64a1ece72618d431593b943abd7b11d8ecba3ed54caff9a893372bcf34db0428bee605690f450fe13d4f70599d2b38feaf6a8fd6e138cce90c3b0c511f11bd508ba8003e7493b843cbf0343bf38c75ecef047a66ffe411b58c4793719a2968b1fd5e26b8cca6f01a44c5b7b215247b3c12cb55f7c0adfea41785fd9269766e2048c61fdbefa8b1bf7ca9d6aa4cdeb9fdcbbe57f9beab6f5a099be974852a75ebaa250b90e6d1214b102f07c83ab6009949e5a63414b2b526cc3a23e51358fe700261568612f11557438c2d9244631b7082072af143415ed04af768362a2e2ea6ea9abb1f06762553f87a76ffcbb04dc7a2761fb7c8363d54981197c84aaaa518575e8bb4e05d25fa518f4b5c64694f7f7f79dae30979926d3ee20053cfd57d9da4a3d4f80bbaafc504cbb8eaed000000000000000027b0d2020000000067f45ca90468f84ec035553925962f0ad4b6aa1332047f2ba9d16c90abc7452fd6c123697225c4c3c562547dcc615da1e82d94e1fa66bc0de398e4d70033b97e2280892b1d05c3b78f9b5bb343ce632fc4f95cdfaa032dcc0fcfefa96186f4400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064c71419905f3402e7b1cd35955c6e060f87cd8aaa9a10e37236b4a3b9883e31a7959117d33cf6b07382fa651d63e1d1992affd87bad4254326eacddcf9b4f33152cb4949f59ecbe97e216261af95cab61fa5f0c849c12f73c32752f64b846a14f46390ee3caffc2a84adec13002fe934214449dea0cc1a79ad12c0fbb608a5a032c057abfe94b05126aa5bdeb2fe86676b14400f3dca476aba7cb97c402fb1e16031a81fd0ed334f323f89d03619642c1a57f810915444e11b707b706ebb5484f750a067e2b548848c407461be07107a60bf67588bcdc66e0ba19ab5f8b1dd4ed797992994225bfff535a9efcc0d3178f862a0cbb501362f04754f906772af22ef00b022ce093c841e46eaba20467e469b2bb2126e51c76bc13f8a9832a90f9dea83c520203044d66a78adec963c4f1ae0b67836c0bf0cf07aacdc0f985b9376637fa078b020850b200de0269130d3fe9d176b092e1a432e1dfa901153790ea065ed5b4461b030c133c7d35a9dbdf10817c76a307bc9cc037e9aed309e1ff806937b86c8a51280329181b0de70547fae0c274c02f5335928c31249791b19b49d990a42bcbc8adbe4dc463087d81afb9c631d304851f0b8dc663f223abdab79be381388fe712dff0cc171e7fa1822bad7699741e731362f4c0b69b641aa01bc09f43895c0cac9f409ed5bf227f0a2093e8b149a39aeedd6fd20a1c4f88b7b9c9d200b3d9710278f44922af54b61f0ac4d7fc09a4fb8c74758148f5deb71fd63274eb46f484e1fd051e9149bc887800ae2e39fa85f64cbe2a0c9d3e9c2fa88e42743a4363cd36516e6b2babe3ef6c83acfeadbc64c1af59495804c4a6c462c67dd13e26bd497645c0dff28d99ae7f630d5961cad16771dd5c434616a5d43cdc3681a276b47becbda5a0431d95239649db9a4bc396eae19558169ff57592158f6eb9a28b970dc79bc9945d2b02485c4d1c91168575eaf6eb9e43852349c0cedf376678b13b72dcddba2d5e30069b2af66924bab3ed2e5f2379fd692be185aaaf98153e88eda2f0f746ebe726d9d89cdcacd0d44f1eb6e335ca4684ae9d44bbcc585b3e2196e8a1e4568e5c812416c7cfb0f8bc1629333e38ed1b741565cc1d0e1e5612b1d9cbc4491996022c597d5489b72a73aecb8f57259d1ea83589d35b2fb5da291c0b277a61f2c668cb4f5cc1b692760f3cf4d5318e3d20528b112da2982bec24e20c08a864f0faafb8c347572f7ffd580791d097321ead930d82388a23750f111ff20ea870548ab02c68e0aac8d9c46ee39c60f2219c34b16ce7c4edaf0586bd16528dce5aa5e6a412ef4fc7663fb6103a94c7ac8d94237cdddb5d38354d0d6c8d0b4fc50d0cf6b0ec2903ba8531440fed3a6cbdbececdb23879b8b2f4c93defc1757d70053a0430aa0933484022e410225a0efdc6c78b99127dc2b129fb097d72558ac12db410c563cb663272f9d7391b65361a156352dbe21c421c50a3abb7bba17457f61b37bbd1e9162682376e0fc1a5c20d5df1b0e506289374d3f76d013e49a3cd5ff3a6e4efbaf7af9ae69188f67e7206fb7a8330687c7dfce73b8d518ad1a77f2e6ef85459bcbd55e681416ba48f2972f3ba88d589073be11f59964a7f2dfefa37c9f270d72a67985f017e59f86dbdacb90a878379b5fdb9a42870fb054dc3a8355f61dd8711cfe57b13e0a7acac3c6c9cd7a695c351a10463833af446ee066fa7ae9557b60f54d1c69ab34d46242e24576c77ee92f57ec0ab8379b90340282b5bd2a0af81f49cf79b39e6cdab36537d6c664d39037f5631b277d54dcca99b2855c00e0108339f3c1beca36a98bf52f727b15848066f34beefb538595d69454ae4998145a89902399db1e76ed6f88ed66873af21d11dd2b3a26a4d722fea62a017e9c5a8c44d236254b16e1b7b2744688d7746b499fcb2543b47d561c5687d8b18b783241f7be18ab6dbe56de21019cb2c1fe3c2c0f742123b8a9596562d6ff22cbd78f133e0e58fd63965376623bdb66ce4f8241a1bbb5ce6d6edbc7afc8e83760a8e7f8eacef8af6dbc2879fba94fd72fbfe315b8f9171b58206ead81c0b2b9b9487855883101af0894b3614dbcd62289d26b00b80c8388c59181878d6a4a5889c034fa315f0ed27f03cbfc7f1223ffbb8876a96fabda1277b0f0512fe2b1e2fe5ce25b76c6e571211ae9cd77fc383e63cbf422ac76afa084aa950429760780c8d5658105d9d8fb6b82efd4eaf187c0fbc93d0d01d78ee0d72124b3c861668154cf73bcaac7e2f12744c75b2e1fa7ce52bded77fa8625fb7f267d5f135c779f1ef4075b72e15996eac7fa2f1b7a389c138688212386ff2720a4cff5d0d944e40cf01dd4d33b72bcc78c6452562bed1bc46c84a4765aa85a1594bd0eaa0675302b49fd8385cfd65681fffd9f3de0037d5a43703", "520000530065", 2, -926727091, "ee71102845243b377ebbadbb27c73df1e275fe151fff1a91bf6a9e08cc638e3b"], + ["030000807082c40301700cf73238a1ba9f952b17491b2253dec3089b191a8c056f411050b611ee284b020000000965ac51ac526352ac65ffffffff04a09d0b0000000000096aac6552ac63ac6a6a0f6dcb0400000000036552acfe83170200000000035353534db8f40000000000025253000000009b7ff829014d83d400000000000000000000000000ce5dc7803c475ad6e4237b889ac1cfc8f4f56104b12bc523868408137d4c5cf1f4181b3b91e27b342a7cc71da83881773691c8812087430e7c25c888fd1a149607cb0b938814a205397b5493187337ddb8965aba7364605b0af021474016056f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815130b706dbb66b2380c9f4fb01b878862f40fdad92905c71759274b3077eea720383660d6762499c571a46ddb421d09e60ed080c8c98767a8a103fd3ccf6d6cff4856ecee621602a8cad61965f65e5b043e2eec1314dc3a54e5434e9dab7e7d392c4273f9a4863e9d2d84df22ee78f4590a5793f7e238f49cd14a7954201f30215622f2a177b685ed0d675a0772e79c5fb65fd6898b438767dadbd4dbac14d9d022511132d94f5dad1aa8e5de5df5a97669364702cd6cdd28d788c9aaaa8862ec10b08c401febabb7737e722f3024def5b9dd4174b263a28c9b166adce71f95f0abba85970c000e6fab28ff1c36da2f957a4e81bdf303539249bacc3ef664a001a7502229cc5a981734e93d8a674a8d83517018b78795dcd22ccc737ca8347dbb0d5a3031206aa33e5b9e088e201bb3821c8119c09b1ec89017ba487e9cf69b6ffff341e0202575558161ac4a312607e7427f379098ea6621dd9d1c232982444e5432f1c7b031c4e3114f464998f01100690ac26e3c53595268101b52a3e02eeb3de867f899b032ac3c67860274c4a17cc3035994016b62951ac65d5b3d48f58b246c8c7f59643a1f23de8d5921b73d0dbc0501acc64934f6fb05e09152f2479b7eff075d60ae1e135e6ca3cdd98b7fca6396f5a2c2953ef023965d03f0842f07cfa923f1825f52c1329a867685cf803d3c36dea19e0f1956a739531bf1591ab4db89c50aa1d92d8a5520b499639d7a203915535661901c1062b46c225553a62708ce21c6e806dc9259744b8f7767792ff92da7f061fb602d8e257ced816bff78f21d703c312a96cd06d77a011541e1f5fd6eccb8067e68fe816f862e6fab2673a5c6fee0be4c2e6cdea4cc001a357982862076bcf4315327dc450115d259d50920d71ede9611e8591ab8a24514f5a982e3a27bb264b845fc221d2f6be203f12c7eff106341149c0cfbff4672507842b200903148b7b38a0b6af1b458371ad3031fabdb9e967ee9a818d280059b42c6453acde91e0e843b9aa8704ad8b196efc02a99d878569166ead2a1b5c9b44fa32138e3784dfe30857199c41b7f678ceca662da8ac5fe0e22401f12829b42601e2e3c7dd70ed941b8368581bec5bc6b2fe052620a4fc6c02d6e20f3ce9325fd776eb05e0b342873902f0032a9af95cad49f0774a7df066e12c00b607736736a85127765f3dd973d065a085f2acbf85f094f174973886f95bdfdd4c45c02a717681fb41bfd0b98c933a31289c214e4b1ff17873154fefc0caf6df4ba35ad779b49d4c436f83637d89acca2b2a83700dd6ff360a7c694e7b50aff59b705694bf2e799eab71fde73236001ffbb5155dccb6bbab74907b020e6da5b38eb23e472cda57abe9a93d7af950ee4c20d69ee95aef2c84675f63e13c255a4b511bace8ca4dd12ef9f68db126746b57c94bcb4f05c795d2a7fd5a9642b25813ab4d69cada2c4de9a4e150d487f95437aa87b8fcaea8fd6b0f7a02d4023ba78271da828c77e1313779fdf0db3f8e39caf150676a393e1f93eb05ac496eca99d5093406fdf3f0abe3dad8cd7794021406398bad15d5eca4d7f03d5422b0a1c4180071542e20fb99b57d37b372afdd7cc68905e2691c3259984f1ee174f5bbf553b07f0b4a6a1300f3b23d102073c706f021bacfc1eb37702c17b89bdfdfc0df8727dc67989112ce617b77696efd1794da7d8a2fc421985325422c5c1ab26021d5db32e42a913a9c5d3028c3480603007793bed5d469ee3c12a957dc74c39a808887b1994ca3a7840e6d5e4d71233428ea5bf81a510fc42700c0ed8a3c3407adac8516c251c83f8440ed116f765fc53cf8c3161baff66db1506ad6a2cf79f0caf3265f4cd075b324ba28dc553e80bdf68c046d1043d82161ce2b616043dfbf3f045ddac20ecb9deeab44d2a2d0a92daa02505c32c11dd1905048d1240a004023032c79c8b45ad125f18e164182b4d732e2432cac5fbc01982c933cc50141b836930236616cf921b6d6b8cbe562050a7b2d0d56bae811f6eec8ceb3cfbbe74eb189f6b12a1f166806dcf75ce5bdb43544c5cc24d9e54475fe47cd1f7874ac8e55ea9ce78c1ebb12a28e62f1f66b91c9dc9ee04df1b270d1045c838b50f88bd2b48bece68826a3d2e482a69a068ca591b32a9c10ea7c72e4987119f6c3739f4570c178747629aad2736e52a69665bffbdc544412ecc1d31eab0543fd27e6f38a271883a3450838287f4b3dd2494d529840fd2dc6595012ca1e427a5f3c00c543056ca12dd475eeb830daef15cc6d2280bf1105f0559d0c1c63de656e1b0629955890f7fb06182ac7ae89307c1c13e93fd78d627b4c8d0010cc4d9c38478b07fb87834ada442a670b217c6a9442318e56ab9bdb8c6ae083b0cf231f589a159091dbd70232e9d8686d3ca244aac8038149240e", "65", 0, -125438860, "2773aa879e03135823514882b423a7218237c3ebe427a13f7101e94d7da4852a"], + ["030000807082c40302802a5f05c9387694419a8adc4a5af509a40c3bf02c668c8b6e41a29ceef0f451000000000163ffffffffad7e9ebbe6317ea505c45c580fbc382269b0453bc959e4f0c1404481d1790adb000000000665656a6565538fcfdab901adf9c9040000000000e571ba740000000000", "5265ac52516aac63", 1, 979218886, "73a885b3e63fb7e391a3810af747d06002b7989480ea52b8602e7311c8db6672"], + ["030000807082c40301372750da3b37bc8243e8eb2ffb109aad68417fd8f7940e72c2a9db2c8c80b53302000000026aac06340c110444fea30500000000056a5200656a4afe1a05000000000100d96fd7010000000003536a52f7c1b503000000000700ac530052526300000000e51009ee00", "6551655265", 0, 401929485, "d082796f8e749599bdb04ba657cd04226d69a81577b51e75d7c5034f9b0b41a1"], + ["db8586520336f6687f5ae51f379947e594eb6b8c111c189dbd13a6ee3211491e7983181d0d02000000096352525163ac636a001baa18c62f2f9df0adbec66db21b7e1130bcb43ec96f2ac8e9ce9a18b869f8d2b9d8091d00000000030065515d141fd1da74ca8ae64afa7bc1b8564f45d55d0a6f7cb9dd47ead3f3bb4cd6b6819f03ce01000000095300ac00516a636a51c2fe82e802be0b400500000000096a656500006a006a63a979ac0100000000026a63898a8801020000000000000000856d81020000000075c0cb95e9ae1208fd1d91726a2a6a81fc61df32c6febef9d7c11f4ea7b248a759c3e9ebbb62d2ea93572d49f4484dc8f0cf3844d4db1d7b21637cfb0da7c43e5c7b30f2ce4fa9a48c6bb66bb20783a0f17579f60a22f885705f0db85109b3470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072d8871aa96655c503ba368e506f7c54da040482a964cbe31a93b6e3f4287398bdee3b6c484e5755c246043c8eb8315a5507b33164b540ab4279eb910b61b9caaa97f3e6585a90dbcb8acf06f96e2f491eefb7f0435b12683c01efa06ab8afaa9fed4defb73812398c90e0b318616957c530740f309d9c4305283aafb145b95a022a0b79a47697e5abe7b1e6bcebc9d0d3fc59d63dfc90c40d0c7d4532cdcfb9a802304c8bfb22bc7a12939d018e9c026cd0bbc89f03bbcc38b60c24bff6b95ef3bc0b01a5ce5af8472eafd6eff3bdf2c2f44fb5df144b6f95cf0e1219576e2adaa2e9b528cdde8d19daba5bf1ca539385575e45369f4c4909b1998a425a0ed554e8d7020d26f437e708aa1293c81498ae99ead121c60b38632780d03d974824c790a25e0215f13001327f1de3435c7f62d24e84aaabb55c919533f351b6583b2ba6ece27a03107aef48925e518207eb96920737c4ad06ae9c4c03be75828ba5d023c48436df02181d6cd2a98ffd11a6ba4c1fd40dfc8a3fd45eca4c3dd77685f642ab83284c20030e540f14035c372a6b49fbbddff1e80f3aa989f39d1567d4fe94391dbb6d4ef37eb7a09b67eb012c3a985973f084e42bc83c28f7008d0dbe7f6604612d9390d4ebf074e0968a9e3717e612a0d2ffa6a1168629a5613bf46238d8ca5e57329c9e6abc4979a76613161147e97f3360d9acc5c3df339d54a76369a5867d13868bbb7a96df151ddd42be53582990830e8ac29befeed33eba0a52693a70e8fb42442428c7ae8b814124abe14d94656a25782a014047bf430e7748bd300efe2f8b9aa0b60db37c14152dfd2c80593363ca6c86229a0332c656eb69d1dee2bafbf3e796ca5047369264369455744380f4e463d26f6611be5d05b96b4325a94161153bf9eeade93218869a03d6c4dc6d8bffc75637ae9d13cea89d550cffbf5460ecbf041e81f17d5ae18ea332fdb74fac12a41a978a0d7f03a01c2f163f34924d433aae7816ca0c659726efe9ed62b8e7be8b56ef2e3894313602ed24b4e38ab61365f5b3cf53ea8ec436deae40f7aa78b1466407311f08ae86e5ff0aab271f4107945cc09babb0723cae7ffa4385ff70e0ded567442bccffa80cac6a84fdbb99f3fa434126a964a7247b1ae26274e5fe030553fc8ec748fea853d19afdb63562a334fd3c3981c428c10e25fcca8c7e86b6fc00cb81c24c03469ee9bc1197b1bc9d7d558e655a14f9ac1335af880e7b70ed7e2ab26a99942268c6f665f34f24b757bb141b689a07c3dcf17c61c6acc10fac6a611e823b9b3d3c3d338f9bacfb372fbd67fb4076b3ba8ae087a087517f25b5e71698275cece1ee585dfca7d00512d3c4733661a96edd735549ad995c8e4f4beb7dd49b711e2828f0922084752c7fed8fc8f6f2efbe3b1f919f5bcfb174c887c0e345e57611bb3d13634c579f0006ee61c5c99bc4994f6c4310dc87a356c021e30298fdacf4cbf8e7d26544cdb1945d75ba7f80c824ef9fced05feca91a91522b1b68ad371c7b62db67fa6b287efb3a7db1aac7bff8f002aec5482810c317c622d24b29fa3bfd54dce1637f227f0cf2eb3be1537b8e406c679bc1c28e58c5bac3814b99049adeff0e6814edb4e3eccff3328e5078a9ba41c69e5ab7aa057812bf1f631d9ea7ca6ecdb62b7ab354c62b36890286c2744ad77a1c9b5013ad901e4ddffd9472b0c59878e65821432d70e1c79b9a4932c40992d208e0f36615c6dc1a29c3b53e6e1cc48737c8ecae4b8b39d0864605cb3d1b2b57eec71d6f45655e97226a650fda956ee8d03bdf756a573edbc31cbea0a4cca7bf0882d12443630d817ba71f53b34b8299805d5c7f1977e3e77a73f41597d596c235627dcce75bd3ea720df0cd879e6623bb8085f27c8af2324801cf82b16254110a3124c2b9d25e60121a6854a30480beffe1fe9ef4965908cdb907bd33bb967c7dcf219fa7d5eda5942cb3170f92afdee0b2a299ced0f89217f9b13db6507d87843da7654e3265972656ed018ce77dfe08f96a3868251a96d900c079dde6e12f74ffe5aa42efeaf9342bac2626e8027d7e5b30a34ffef0b01ed9ceefa15f9098b68a24ae9adbe660ed36da5d2931edd71883d499067d028ed53dc860db748fbd3d92da9a089c4441a290390d263cbe9bfb14a9f52e5e4b9cc5dbfafecac36af1b19dd293d0369ca4f8447a11648b13b602b7ecf8422e87de096868b2c1b4f92cb23f61203e3572ccb9f609ef8a20ae4a5c31511943e66dbe56a39019cc9875d0fd5274e6b730366596512e07101f05000000000000000000000000d780b71fcd65a9108a4f43ca5641f505459668eb07ae57cfdd7a6d6177f38771a21ddd32e9e9aed7dc0a8f2a53d4421fd174a7038eb44a6d6fb53907e26168d1c1a2f36ef66a16a9ad975815f78e8b7edc5b21aad53c318865b7fa28b537032600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e7819e55fc0dad3eabb92f98e038eae65599a5b543cfc5aeff90b97e8f6309ee185129c11f4bd5f5524b6cc29d208e9cf970d901f0d9783a01211a35898c2cc97c45df943fc299ddcdec0c39e54b08301f7b331b34a46d28bad3b431e48296406dd81c1cf89eb21bbc5b7e50cf2aa3a90682e1eef05c68bfb6bd5dbe3eda6b880313282ce6799218f169945c75cf8f338a6561ad91d0f15d6d94fa0b1333dda25903271c60dd512b5f46687e208a9038be4fb0af9bacdd3b83b74a6f4b6192b5612b0a01ef9b2ea7bafc8e3ef87d67f1c64cd53c0d96aa62cb47bb89ac6d4d8302d814ca217aa206a54165d784e0df4cb2d9a01edde446db6a2775e5b69b8d36ceca3a031663027f9a8f5d377b498145a8245cd3d12b5a2ff86ed9e0dc7eefd39a1c3dd9021225fb04901b201420f6443b279e00a048bed5e6594ec1efb9eef1f7931126e30203c43fc2a931484bc59704e307cd05847ffd546eb59cdd91b9f965af33790a80022e44bb9b3ad13881ef1f609db1e3440949a4971dd0978b67bc7d5f076a0bcc90020dd68080ed08364d7a2be8aa25a32e721ee4d91d8c811ff6d9108b2e40ae8f3409cac2e1358ddaec031a3c6ac6ce6eeff5af377b9973003c360f491b6682df6565b1b3ae75a0df150df68bbc0d224263de9f1f85d86c10d143f442af15dc0cc8491cc065bee299161b552abb776b54eef8dbae41b7f70bab4ecd2a2653db854c5ebc9223e483a78d80c7f2c6f6f3fb17e42f8eb39c5deee154a048882be4361f5d4a795a5d67830541a61fc71474512bd40ed16a2e7f8428f8d81ce65df8663f0e6aa3cb93ac0a6bdcd051a715bf513d4d5681c652eb2e8e621c8fc70d92be8045f03e27e25f25c059e2267446f80a6e65e4f61a4d574e16ab540055865d3c6d52f9006464fc847f3409731b653da8655b5a286043ff780f3e900f0c2b3cce5da9fd818ae7112e280b39c7563f52941135b37e1255a397bd84f5915ee6437301a89b05d7cc0eba29ec97555d471ee83a8b438b75831431915ec400f5d1401005d9c0cd662461a42da74c3884b02bdcfea04c0d4ff7457330261f9569b15b3ff3a5ba5911fc4aa2fad1bbe644b5180f28cd68a36dfcb8507994fde19c58f49c2525dd508ac064169b6a0c825b4de5f4d5be30ab2c368921e4950bdf79d661f28dbac3cbf89118efe33a4becd65b357e6bdd4ea7992edbe9275b3646a83bf80d1ced2d0089075a00c613fe7037825b7f661cdc0e0a78279e1d7dc0e63ce836cb99b6740dc9370f21f9e0f8ad70e10cdd60f82af72d696beffceed126f40e753ae27117c4a68ac5a1bcd7a9a05fcb61f0e2e6db52f3831cccac0ea3cc251b8e2217469615e91caee06451b7364b89e6869139c572178647e057c7c9195b0963123a3c79ff5010570ff69fe89a8925a28b3caa8beb22e961377d6df0266b4e7a6b0fde93bdeb8b9a422f9f6290863cef0ad937710378d62e0a13af37a01bffa46d5a5a2bd5423e9a96521148a62a19b512ab579a216db82cb8ad32839d1a609a600d25c05231b8fcaabd52e6b318b88ad327633b983789aa01d93145515ee433c5d1fe2925970b1eb212cc2abc6a926ad1e5b56390cefb779c31e6dbc6a9171a7ba60e0b25679061b1c316c44cea0af8a3bdfc79a4167f24eb1eac4c5dee4ece4883f54b19a33d44bc418120711ffb2413eee6db03b1aa746cb939e06284fe91d6f3deb5684e2680fa1a77d81d1d959ad3e123b6c62ac5c45d6fb3de4ea79634cc648301a08f3085144ab8c0d99679310bfb8b246216838578f268a03f68702af592a34071bea971bcbbb99354f9851738c04dd0801b790baeed7a8499ddb12bd49f2d3a207a82cd9e2dfee196d8798a69af3fa21ab681922eb4b63d4b1c126c38d892f9146cad4c8c5f5a741fddfca4a39b1acfba766f11b391fe29a09672ebabc201c20f913e507737fe4a7629e3f1fb350cf4f966efd2250fc509d4d53d5321756f6f25b42e4a4d618ae8d900d2fc8833e3ed47250db7de31f7cf99c4c74d9c52ab066c5b94b04604dc1143319ee54ed35e9457fffc4e45ae9b510ee6cc9491581156b23336ca7c02ee1fc53831f7dd24097228f5d0f4bad64ba3b5f39a5b3ddcb6c818fe232d776839010a40ea41446a95ede69ccd90c86ee6a8a22620b671c14ce0eedba7cf44f0429586720e585a4573df2c17e13835e1f8c507df8fd8831ab1696d9bdc0ec7d2f0ba5cae9b0164ba14523fea223ecf3a3ffc81ae747dc98e0f2923db096484f70483fbc082a4d3740acd8b4ae200f515b13269d05b1be5f147330bba6a4b4383ed47d19590dc6db2ea4c83ea42c83c966527bb9a320de00d4b3d8c514dc6e53c8f621c09376d6c4ac03b539ae180087b2c272eebbaa00d316ac4a238dd1d65e2582097d59e81f426890e", "63655251", 2, 799619452, "f1c86d62c087d52db3c3bbff1f6a94557a13023ca5dbf9ba743641fcfb31ac55"], + ["b63e174a01026a756603f40d34dbb3f529fc948b74272e30e4c1e06016a41468a51a691fad02000000036a6a657bd4ef9702b7716e05000000000552535165acfac11302000000000863515251516363651bed323f0100000000000000008aa2610400000000519a91eaae2b272fbae1bbaa1d33f4bedc78956e1f3480baae696aeb5ad0976a32634d8a388c0556c57992c86ccc8f0fd0f8ac17a839f7b55bbe0e8d490826ee21282147671c6dc488fabff1313b712abdf98953b3df05b717891f7f2d4ae2ce00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000694307bee57944627038c692c8e959d4903efaf6b3c3219e31601a8e8af2ea14e5596d3d3d51c49a460f2f1020a03c9fc75f8188b2f01cfe7a9560cdf580cc7764c50427ac910343c2ab7f95bc78cbb15bcc53b5bd5382d5014c7ab0fc139031a3e6317f41dc09addad7c63680674af0d20905d0fcdca55e4c3bebef21c462ec021aa2c655c3f4770c77d4506ab52bbbccaacc240bd02f4d5fb6c2d8ff8bf985120304681fe717e85d8e9ad755e7c88a486796a16ea63adbb2af1f24f85fb96165140a049c6659e7bbfe888f1d11ba4f8ed891af0f265217fdcd382352ddaf5208c172fb343b1b0cbf5f667fa5a6a1c33963025559ed592d27b93176821e7afb24d59f0212bbc50d54adfa28e55ce3757b90e5a8b52bda8cc9a7c5583744a57c905b55d5022807a49494afe0cb5df2f08fbfa375e37b799a6c98b3927e260e2d7f3f1fbb1802121464df25d9c5bce44b69f4d578843a1f27cc8c341c13c34dc9751aa56ada090212fa6a81f6ebf912928560ceffa7bdff52a8383251a1855db676591e65475e010214c6325a7d6a5ab2c7ba44beb1a328aae668e8cf639c071ebd300f97a9e5cfc8156cfa9eacc8e7d68fb2dd5ec1a00d8bf7ff296cadb5dffcdc544f239c95a7f089fe1b2596171db924319e8852221013542f14809af112795f90fd8e525353f81314560cb9ff8e154f2990c8c3b2f9fe62fb5b7ae8336df57103fff41918dd42578f2e8702d431b49818d38c3b35860acb3523363f66133ec368ca253442c4eb1a5cb957226b4045d1b3000142b63c13318cf27046b0b53f65036cb5fdddf3e2b107f6c00238304bc8688863c59ada0fc5083fb2ec8d18232a3d134655c8af604092fca84cf22907d986113f340c89a04f81141e1aad56165d50ba6b73ddfa755adff42a35ffbb6e39a07f45afe8726ea135dc412b5897458700591bec16d5634a4758493966fafbc80d079678ea0c9a4f575502011a72891cfc7a2875f881a13aff856a5a6a22ea22afa95878539a222dd0a30529834b85cd2da9fa5f62f1d169069b30b691ca0b18ff721e1cf11683e0c4ed4aee3dbd57a3209c90e2c1e3216ba4f5dcb6547f9b66943a17a98b642c26148aa09d6b6bd35d2802036fefe292b03015514231b19af3d81347eb522ceb1b25b1246e1c22b96bd70ac23d08a3aabea5f7322fc25ec974164b8eaa68eb45f66a4dacc4ff3ef2cb2bb9bdd994c319e841fe94dac796e6617fb5ad70ef0985686614604193270457170061250247e74f01113a8802aeac0f0de269e5a411be4543e20940c045d2403a545b6b2a3794c54616434f08385447a12c4fdc2b43f1abcab4b2d0c8e99576e9d8c3cbf547193d56735fa93e1de435e1dddec0730542dcf749b24d19b9b4dcaf2db0902f4cc7ca18614a50bd47f35f06d70eaa88a7e6ebb7baddf44dfcc771b37754b491c6cf3c092e74b953b9fd0231280bbe7b84d67d8be5c047de89f3df459b2348b580247a7c6e149ca5c22393318e5273acff1de14306f9b51b777cc6811b1529e2f83295abfd8131ce070de3bc5f6066ddae4ffd3b3020753e30d92dd0f5087835cca03c9d92e6751646586f0359a9009de1ce96760ba6983eb81363f0e6513231db163710a10abd052b5337e42583f68209b4754df79c263c073725d3af66627683670313d5ca8e6d32d7629027d054a4b232c1268aa0bc0262347b17dc2b481eb5a9c9715705ad6e30c640e9d7f846f03f79cab3d2280a2d98d2ec661e12b2b44aa8a238c338f20781a6035d6e396f8527175b46616b94d46e54cc8492d07db02dc9684130cc26ef1d433919f6416ab2552d5a5b8ea0fb443a647440495f980722f41c4fdfdd9b4895c99cd784afa7082bb20594000d25ae9dbf17877a75e2f32a2552abf3216a38660cf239d1b71fdcd31280600f635087b4e323608766dd12e412492d34b19422b058a49cc3e69894d13a88893c0bf9a19f359d2c6db92a1f57bb3e62e6509bde0ca08e6a8440cccfbdd0d0b69f552e3f1eb61d86de5935f88504ffd4b16045f23d3124a0db2b290c933bb0b1d880ad887b40efc65109b5f7b5d4a8a1be792db7307f32d864a043032bc535e2d8aaf80ea9e3ba1d4a4c55210f7730ed510dcbac3f7611db4b3c1c3c62526d20343e2ffbc06487b5e23f228fdc07d9b9bef0c6e1e7319cc26ed06b02aa256473aa1e34add70499e67b7abe3a443225911672914d481e686f53536f81e31f1b7b73e9c07d101943411c3a772740adc0d2c4743987314c5ce4ab7bb8aad0f17917c57d67927cbfa4a6a3a47f5c28283083999df628367914312186829c4f280e302e14f3d6d84a0babfc5d0348a9a5b99c0f5a5e0b8058cf89118af740a45f62c4be09c443b6215b54a53040d9ac48f781f6653ba1c2e39614d02017cf1249f505", "51536551", 0, 84109073, "f097daa172234c1bf2a950d3e6b25668c3dc4a391251260ce8c41d778e604776"], + ["030000807082c403033a2eba33d7077a7b33fb276f4721c911e79bbb24b063a23975498335358776a603000000065100525153635c6abd5a2d393eab736db05cefc8063d03e788ae732c7da0a0c11ddb7a6a912d455ddf720300000000ffffffff06930a8acd5c21ce80ab2b6825d850dd5f3a44e38daa5f74459c5464809a52380200000007536a6300ac5100ffffffff0365849b020000000006526a53526a65cfd16004000000000253ac5446dc0300000000076551ac51ac636585861448610eaf6702c5ef63000000000000000000000000001140ded5a96a37d0f7256127ff4c95536395047b269a8bc5e1bd9d232b17ccef3ddc7806e3ba455efc846771e91c6990c005727f363f4184d3d50e8050da06d61fd42a3b2f5ce4d2cbd72cca096c3dc2a06d059e1dd8dc962392d3e34905d98800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cb0972207f745bbf7933b18898316f41be6897152c6621574769cbbbd63b0cd4f7d1b51b3c0da29b2c1d28cf217595e87f535050dccfbcd6ea1fa0acaaecfe2fe450188cac11730c3e05c8a7f14be917a1dca26ee6e7f87bc43cccd952338e648c8104f88f80edb0149f21d70a2f7c358700dd034e616397b43740bd727119f002263c68c15cdeea527a063355a5ae423758ff0f8f4e96abe69354a509154c14d602039c0db2a2da2e581cf397d19acbeb59248a2e8274e529d12cc77eafbcf973310b05ab28aa8fa83a3d7dce8095ad8eaadfd0cb886bb07917f1faf47197a26e973725da3a3758fb7c20807073b67a2458bb3058f5982f76f93bb7e1f8ca3d6b7383022d4842c559e33f1b0786385d5a7d7c1c4b657d519997514e3d3153a7fce64f01030e008b9fe3e0d81995f18f95eb328aeb46441d70f87dc1aebe0b2a9cca6168d9031f6e886bf195d0a9faca0ebee486ba90bdcc2f4f444941a962cac6adaea58e480311ff3e73814b29b9f8d0952d2034c36093010ccfb7fd9804901324e8c01645770209ac757cfaecccb8f3d22b95dc0bb9d1a3d46b14b4469bd29988d43cbc21081beee268ecdef33615419f77761d3bb67dc99636747ca10f49e4fa6f6050a94033a8c68fd85e269b3bf4c15af9f47c49e38aefdc9a548f95a76659a2261f150981025b1b6a01e9a9c42154d683ef782abe2f8fde985dcc604b8fdbbba61ec0a62061a3937860fed6aeb748efd1aee4d8a040c45ce7aed462d61bfa506af5006cbbfdd89469aa5e0293c7853ec7899d6bd2cdcd598891d0294e7cc23811690a84f40cf3a08f2fd0842754eb3814f422ce28274b88f8f518e3811556329782e281dccd2bc0de1b7b169c82e33e8e8f4decd955a82263f3e5a76dadeda452eb2cf72ae7a6d76686ecea04bd5185948e0efd10af4a73236ecfd04e1ffe19229038ae60609734968bd3b99f34f8bb2b25835cdc7fadd291b3b30692a740212315e7d79493c568abd974b49f6e511a0d8e914805cc18a3a4663c167c3effa034a0e39afb0eab081c8061a071e4acb176280b263aca9149b8aa3ac4d25a3ed215de90739b266207965838251958453521e8a2b7293756f2c4d026e4819a84e3be32b6a1615e97811be667a868c1f36134bc18d9a5ab695bdf04dd435fbae7a38a38b93c5e4fba38576b9ee14e6bfaad2cd2aba475ab77f785a4b3ab016591196b3ae91e416580469a3410a6bdfcf324b143157459b15f3d8631dd97753bf85c6b1093b437324a54c9c3ffc0548c40f0efaf2713501cf6a6ad25eda724775cb2fab3a8a36a132ffead8b4e217968b1c9999b72dcce3933433190a1b673c08c374c0c97dccfe7b9c1de1f4a52d4812a1e9d92e33262a7622d54cc7984a25f89e956f2d6af080d400562aff0081dad1e2956c3fa065f43935efa9959acfc736ef8a127e0ae05c0e1c4a08cca272e61d7c49506c8a1d59ba7df47574cd4fa5c4a4957025b9e6235f76a3cb3721c561ad0365ae6bbf53a221eac4834e217b78d4c0d7ebc8b73a1e38ec350537c04c421fe88eedc6ce8a9d91b0397375374c1dfb428caa3815bf5cb6e4f4ae4bd4748481b6aefcd1f1ff938514d8a7fd57f949ad3121d39fd0e9810e741a0ce5648a66fbcedec808ef1af4c56ed7bd7d332155ae6e7efdf859c3cc3888e5dfe59c251960f4f7dbb2d384df4e44bc7facf659b29dc501829a7f0c757d1161ddc1c6a6545d460256227dfe265b41e03f19cd858a72abdd45e84b8d3fd2b8c7f8d7efaa8a6fb54542d14108c04295b51f02eeb2103495bd9c581069323a8ffb2cc30056571378cb24db1bf975224a967013a3f5748cd75a6086c1d97467ee5089f6f8c7b5a6987890205622563ab7eefbab87638d46d331c6a16a137d3c61722405f95e430b86602c830ce88cac58ae38e9226f4e50b3336d64e1a2fde7f15f4d6e9bbf5f75a893075349f0d3dfaa6f7b720f6c5cc436f2ef43c3de79f41ad466242c6e068905f01e57805f817144688ff5df8517ad21ea3b8c6633ae5a30130853dff0bb2dcc084da4c29a3d8d7949139dac3ebf3a1b97390371e7f682e351607df334ab69010d942ad0449b9e1c92d18d91b18cf3f3966e39e267db7937652265a4a3c8a0937f70ea589b72fba1b8d802c7d633862784bad3941011c779e3663127a38c727a6eea3c74fad8406ba355f7c18556ba548fbd6f744004430174f29441366a02bacdf6f040815939e982e3049e882c5edfc868629176279c4979d2bfef6a0011c7dc240fa39411f0b0000000000000000b876ac03000000006cf39c949c23136df056132e3bd3c20358779739c9bcb353c0de797b474bf0a6bebbc66426aa723af2657b1bb55d436fb327f992bddc77add4a53f3313c9c1d9ec87f9b4bb351b613b45e65d0098597ce3ec5da6ecb65ea79902dbafbb12375c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b6f0adbcc35e8c26a853ba8618d4f8090c1dac0addd44fc3fef5871b94e3fb71e11c392687281be1f16ae6148a36b4352568ed989cd2f3e73c962a418e0d1d40e6c542963ba07c4ade0d4ee72a42a4613e7d098d659aa3b6634ceba79b7da44da356bdeaff17c8413dfe51080128320e9372db0c9a667ab6a13453540a628d5f021e16826ea1fe68d7426770d86ef7075c6b5bfbb026c70891b41e43e33f2fe888030f92d2751750d6f49d7551c08f268948619905ee60ee27da9ad7e6b41187defa0b064001ff342261529c967cff1a2c2b17c18b56b2589147d6fce4180f1181536bb0913bacc6af7b42e8688d9947a9ed8a76ca6eed5bb98e2fab8a7af14a44b5a3031c719db1ae033f41b6d481132cb9d6a1f228f90b5ecc2af9c1e40fed449ba35603264bd9dfeb835f9b3bfee562a5881cd5dc6efe47232a076f6292eba1ae31e177032245fd978931fa75c3646c02ce013a1066229c708b550714190a531ef0b8bc030325fcff66d2f826317d4130c1d12f25bf6a967a73342928e660ebcfd5b51092d3030d9f4ec518eabcafb843a1ceac0742510816f9fbea33ae5ebb4f77d99411b6e703f59cddab1ede8b9dd34c90b6565cb8f8c8defdd80751a57f2c9cbc4373d13a39d79f865b221678e115ad7897f6a8de6b38d399e785bd42475a4a69958cedb824b3f7390555ab93a6708e74ef017aa010216121c2c2bc55222941c20d79460dc1c939cee843b4ae8fd4170688cf5a3ad13d5ef7ee8bd43add87e969d81191905f8a79396ee49bf360826620469e74adcfd1e45531c62a1b1f53b14400833f574232e70cf4f53c6f28a69be7be4712964cf32b789fa7d4968d231f697a8cdd60df578141d297bf2d292e7e44a7db6e3685ce1d436e9ea7269167a85423e36f64bac061aed8c18f08d0f103acce7e702fc75b4926a065bfefa2c50ed69761122d5dcb4c74cec68cf60f5d20b87846794c17d114b2a0eaa48aeee2724d38a52c0d9d960191d40e0e9d4cd8919db26bf8feae7c20fd31422b82d0b38ba2de216eff1887b4ffbbc54cc9f73bc0948ec37353b7a4e17ca9daa31d93237baf1b0b45d5ec56a3160db2414d3f4cea51a966d5cdb8c09a20481138988d6276837dc721677ad5dd0b4352cb5e9ed4a88c693759b497a4ef836a4ace4b712a7e6d2445734e1e0094ac16fee43133b8b54abaafae0f793fb86023e47ef49c28df9ed7d355de8c19e1181382a85444c59b32d4cc3f9ecad175d77dede111c4a6ed082f3fe161a55c064c6b102b0a38ee6b3653e1060c542c8f21fb2d79e88498a5c7c9fd3859d4b9e388ae6cad57484abbe24680992f27f3ea4285e0cf88fc0441d05435a46f25b6fdc3c94ca971db7938e7af2fc9146c4177912660535bcbdff52a2e0e853e121bd5860c331b8de79f1865f62850c9327ba0ae4c8c15bbb16a5efc28b0fdb7c7245a331576f12d5be99b5a6a7acc44ab75ddbfc2005582ae07bf3cdd532669aa81794d9218d807b269eb29392e7bcd133937d569978717342f2e03af8e4b63f59a1d05ab9ec0ffd07a2562366ba09f1d922d8bbd08d306729f81ba25a16be509e77d42935a35bf50388a4ae0c02ef88cdba35839b52d35b5d93878e3de357fcba736a6d354f019e1134c65299eca3af778c1c02a313a71321dd868c8ef60597a14752aa4f05a8600e53f30e1a45c2292c613111d76d054847e65120439c8bd61b96f5c13dd43c71cafc61b113d067666845ada06e595eae0807834e96b3e4fa85239162c3801cd70892d54fc63e4a5d8120c8bf5fb7ac26d4d116d6b7c5c7fc7df00399cc2d34af068a4c2e60e84092f4d5ab19f49134efe3f41bddb4ed9d0a08cacc135889144547b8c010dc0eae644275183d33ebfc3873d7a87c7838b493b7988ea7d7d2a259234cd5a116ed90f662123f28348a1bb620c198ecb9bd3260521696eab254b3e3951e5a37e424907023ffeff7f220a0f2e0ff049c774cbcc3ed643a4ac965e3d6ed04990c8796b57e8e1469182f3b370e8d1420d56e03dddef86473ffa11af193e3602e29b78842f24bea02ae7934b163db078eb93ea7865d61c12571f4a229e4544fdd9c489f7e0abce90f7ca59f365fb57f60945a9fe50b866cea82b59e991846af599bfc57aecad4c7b407c9e9f806a96cd07ac0badb2726bade290c953b0be975cadebae0fd97e039842a33468dbecb659a77b65e90454616ff471e6fab8cc3fd7ae0c888266353e6086d79182da7b94fd72f4460d4baa263ba493580a2945dd2f263e0e68ae64ded9a2abfc11f0fc30b08f977afb06f5b68c315997f0a070db23bc22da3bf92d113d204fede92f3de97f9291d197357a8cf8ae121a16b938978708024beb6d5647d84f517d19a12fb2b3e7846dae7297476f010e65257eb23b065520df5cf0d100", "655153656a5165", 2, 1044365995, "1e26790db38fb0e5608e17bebca509dd14b98a29f055ed98a74fcb98ec26bdb6"], + ["8862213301d99b84024f8d8e945885825507aa0b5a73d459c8730d7db4ae9c275cb0f9a6fb0300000007516a6352005300ffffffff047616fc0000000000065152ac630065cfd25f040000000002ac6a7adfd501000000000352ac51dbfe110500000000020000000000000200000000000000002182040500000000862d003b43d824567786a01798172d8b236da9b18156fb130e400e19fdb69f9902917874c3a2bc531b602624d230412e479f0b2de0b6555b62645bca8de7eb44ff8a85f0d07d94f27f9014ea5f30b34763eabdb911a4044d19df88c80c27421e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab2f6cc533366d0bdbb77d29087f5e069141b9a52ca102a014a31b554ec731e10f894f2957b58a92cf715756a2dfff2bf63d9b58f03c623490505ba380af25c4f94b68e5645f5257f6c08b49e8516fc6766a231fa31a0a426281909d669ceb7511d585105d6320e145ca62baf888b0b1f6db83b44617f58298cade4ec31757100215b387948675aba31898c86f3cc5179860e1b0e73d989f177d7338fbc00c2e2603112044a88015299e791a1a249ba57c16ad3ee7a83cccd2bb9ada518810f2294b0b020a80653b493c6cbacdc2644376c222be8619e104d118a433b8505abf722901311586f5288ff67c8d28dd496011b2ebfa6dee2e242af5e0bb5fb76aec3e1d3b0328321d4416fecb7b5feb5d98f7ecdee8412965674afb5164ac1cb2f28becda360203db430e9e7de62dd4ece204bc124f08e5cbdb2eab5eaae53fc0ec6bc46de05703277d4d8b0ab0832de94669fae1909a83133b0a4a1c5936e71660aefaf488dd1c0323f98f16ebd4dc855b613f71d5ed04abb6aeb5d98454bd33b52052a95fdb71cf032771adeaca979a162c20215a255bceadb7dd6d68fdf41b7d96035b0b24ba8373aad75a588de22e55b0531f09e642bb9f646b5889e6e49881198649d4b4264aef6294a52c538e956056ae6c1821fe550175f05943549a616b91278827f33814c716b8f1bf8c21816f6f4f58dce0657abf56c6f9c94c2bd125c3c9fa03ecea3a2281d2334b8a5530eecd0edd83435747fadff289afa53746c5d0d097abf37f449cc7e3f3a5e90d0aa0d4b3b50b46f3b5d09c577eb91b90c4cf39a41507d777571cec758387bd635c8315f5cf17c24831bd53742e32c30ebef7d7c4c21630b9c4a38950e04ecc8201ecb4f8b6404ae93e6195ab36360cfaca861ffe58ac21678fd772d61822c705e3808bf5c86cbe4fa0b29bcfc7bee6b81e19dea810f362e6ab3f94f4508fa8353fffa9d58110cc31762c247d598e28ea1d2f4942da2f5af282216b941051e1b3f5af7c75b44da48e564343fbbe7823a077d976b510a44270d46775ad43be90092f9f5cf92c9b57a96b1c0a5153e53c72c4466e6615d2c425aa34edf8105b9d7bfb96a0830273ec72a13c7a95bb48e0cc310425bc95d3f74dc1ea7d990d70d1d62d350c45fd315eaba8feb28f7e77157de2b4c6c54a404111c7cc351ff5fd3c73b15da70aa492e7aed8ac4d12e10ee335d7534b44bb2da32eaf76c0bd1033bcbaad910cff976c08af1e8b1ec66c242124184acb2b971a0ac3556bc6f755ccf0670199eb9445eb428bae8da76933daa1614de072327a45bad9458a62dfdb5d851128190515e3c43d5b265f48ca8bc7a8a71cd31dfd4c412968959ac2ebfb40e3b5b65c7827da302bbc1aef9d4445ac214a0323ed6a0dba97b5d7909b8177b2527dcfa4b96830b5ecdcc7c7b8ca0a54e63c8357db61798fa46495f09f65dc0cf4af8d7f236d38815d09f14086c770e9e6b46194b630198571c8896788448bcf4ee845e588aafe6f9874906ba3e6ed4d5512b63a10e35e3dad30b3b06921e94812570b83056516713f8d850da7e659fd89456cf953649ef90052d6a201b7ddd801aa1a61ecba90b9007621609fb3971434b431a2c7e15594b4da2f2bedc10c534fd8a41b8dda5eb1b67df9bb0e911f911bb0581afed871770b3e5d3f0a532bd14d08b1de2a033575ab88e8c34ec6bfdebdb71ba258b320464925f442091faa862e5518efd23594d8c489759bd4c700e6db08d27373d4d212a9e4bdfc3a8b4dfdd63c70465ca2f273220cdc47840df952790990fa50ed7d5880a40c1fb54e996772f837adcead413c69271a70d75f42b2b712a0f6c32d911a95742bb8d0e9995182a3d246b0443d6de70a4357b9860a633d2b9fb8601e71208fa3969f9849fa80d80fe1e64b2a0f92f0ed1edf27df699c4fa9423d08feef1cf002c22e34ab076943c0e81c41a40107313900d9771b07e1934dfb9a5d9b0b33647fd3e727ee9c7010596718cdb6bbb59230e6785625ead65c2d63f64ea370ed22643119d74e22530d8f8e23721290504266072c0fb7744dcd08b1337bcbe0f993f4c280837405ed9870f3e6e0f39b7555426abe00de1c563b34cfbb0ca48b05f7f9465fbe6f4109048473d88a395fa1eb37bb74efa9b81ea1cd391be64d01eac640c60969f7b47dd80e2c2fba204b6cb5ec1f91202eeecce181859fceb7a1c7cb01c0db7bfd2bf3a9c574dd2becd8bc21205ac1b4062410529049da6f0f1a43466ad45ceff3856e03416a198b4893e212464647c5cf00000000000000000b53bd03000000004584c33ed5506d096b2ec820830eec1e7edf99e23e3fad28d8b50f58a002ca267fddefb19c4680f5d036d6ba81279663f883ede0d713fd63d0fc9286ad4ce906d3baad801158296484753a32ad7c9124de7b3203447c8f219667b0590643f1c100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000610278c3928ce67906a161932f9ce7b68b4b171b130491b2c59a76c0515203c3d5b483b6dc832f62e852d3f8750384fae02191473aa78f3142b824d23e23e2e95b2364fbbf863489ac66979de0bf731edaa7324017f71036951b40adb054b5620d8471c06111849470222427937f685c12af86ab3485e3732f65afc1fa1208b5020b9e16e6f2dd0a75dd53d8e24cc14d490480ca2bf1d0e4fdc27b5d9a0e736d04031f94a0676bfd1e715da20b684126f1b7a9a2c646cc1aceaf31a80454b1f23e440a06d916ecd95a0cb8ff032b2f56d8a592a3ed832f0cacf6e57966b2834f689b1ae5e943842956701e8f1f48f0c94056dfbb213438badbd1e01d9e7a0071cdf6d402183c6470129442a8ce11d2bc977354a08d6d36fddbbc685c4db9eb05cb63922802289a86aa82031ccf9fe61f56f14c3de14f6df931090c13c41ff1cbe61de4432f021afb23ee9b56c0d7254c94552202f1fcb6a39e072e0b7f42ac0b40e3bb19a14b0322936edaab351094034c9e6d37832576e327c5ed9d812e1d2a06d420fa450785031580d54b3128ec90f296b8d376f66b087701b433f785585b9c9627b5df1689398cade67bbac6faacdbcf83e79afabd7a7845e6eec89ad314c5a30690a9ca86daa27c47caf14884bb517e48635ab166730fc8650cf1411f5ef3c82f1627a2bee039974945c5bbfcbed712fc8e1e09985d7b62659cdcf71f71c42c15060a9d15c405d7a63d610f6d54db7a5b1078a44a79ac830b3dd517638c536dea8fc0d64a8abb78d308bccdecd79c663b46d024f0ebf6a9d1c35ad5c87d84715e18fa1693b89d2725362bd10f5fd89860ac901f8d48b9a9d6b2c67b33b641abe1b24388bc31443648ba211b5cb4699d8882cdace3265b17f34597744e635c9fc90428134fb12029cc91bbec059fd7134894e93414af3f5cd0f4c54a05d1aa9552311009761a63d28dcbe6354bc31e61bc8fb03de80fd6b0df5424513baa3216147428efbff78abba1efc10ef1ac9d775647e9d1e1182032a15458cfec25325a5d038359c35ff23338a844072f9ab5bbf05fb278335938e97cd19ae42fe5b34fc3189d7c4fb1a1d05d10c5a749e85a48b465f3653f55ca8775e7b51b7a87d90e310b4487b4560a248616d514d55e8807a873c48bfd88a4616e36a226ceb233577133d98bfc91627be106358fcdcfdc15a989e0621f846940ab2fff28fdb1cfd215d32ff8389bf99acaadb80bb664c6167a43d987ad0e912420c9e0e50f3026cd85d2eb72b2f1a311d7e88cb20411602c66948577341790c4b1bf340d7f491e36a78d2c9bcb38fdd6f60675ea25c006ee8a6850b8adcb252af378d107b84d49a83d47e5d19fc7430e10edc1421807b8243e82aebd4bb8aecd708cd632b5fbd6bd7495fbb018f59ed20bd6c27bacb9617d1a1368264a99f6b85bbced5fd11f99f6a3a279e41ddec5d76eba807c13e39a60d237abbbd284171a6313038ed3649f370a2a3c87642951b6c6895d3516f35208540b187bd26322ef5006cb13e5221fc97c98abac4400c44c13214924c3ee2bfb7718ac93b37fb40f8c2b14e90931a83b193dfa1e446b3b9b00f3e38210a1fa0f01c95b9e65cb26c883793a6a40d95df623aa18e67a13e0b150f7059e7c4496b7e4699f6f5dc2f4f00d67d0219c7bcd7680d76b32049b6b41354572af7ea322168aa0d6d2750a9b9f6592ae56059b487721253dde2ca5381eeff6efd67aab38dd8ce2c99ec988fbd7eb1d4cad531bd301ed9f592ce94cc9aabc08be99061d1e0241a115891801d2496be4f425c5bae9ae8bcce06fc2ab02f958b755c7bb076b7d951aa9ade60d4b54388c57c15f8e6132b814d46211e6ee60f940051ad63443a47880672e9d6c8b65a44a2926e17baf1716626ca49d4f93621982eb4bdcaaffd6bac346d306eeca4e1563d307690c85defe03a28f043896087c1ee66d2d8889676f733d4d340ea27b83653e793e1c6ff2f51ac1d47b2c7a79f686027f4df18f7891d89eaf9e0d9c62d62f00f2578e4dc0975581e7fe854fd4c2358763bd67bd8843fe640cfb208f5f461913f8da0c227a221e7467f77aaa5a2ac94feeb0b947dd734208e74f632ee8e0b5672935356edbf68209c78e02797955b604ddcec84d5abe13fca408929915eb5226fcf12cff280f954be07c446ddc23e24138a0d8d6fa10fab12769fb3e03d0b58a2c49b7a1075cb487a359b4b39caf7cd128b2c0ada54f35a179ccfd424c1ddbb23aa25f94e565457ef3f57b3a81ea69ccfe9f955041c4b4fe95a9c51f8ecb70f084f7b205eaa82b831e6f17edd9779570795762d7f32669e4452ec90418ecc9b1b188d9800693d255346214fd2572e7bbdc98a571d80a7716398ebed9d2feb48c01b2e32db5b33b7c88497258d5f1828d1af65224c2f8f04ac3f3b37008", "51526a53acac52acac", 0, -1751814608, "a0f4fdcaa3487d198eb1e594fb5b8f00d0cd425e4c1092fd3ccf85ff79363ff2"], + ["b247654904692bc6dbc998d355a9a1f1231eea8406e4ad67f3c0eb354f77040f219360dd95000000000551ac5300537741830731a8f054bb005cb56663732c57c6d3605ed9e141cba75d2ffa507102c458ae4b00000000025263ffffffff58259463289032c46e8e6b55c1159de2754b33f6b20a1939b8a8385dec3a14380000000000056892b95008c92d230037df13062d29c77fca00d37ba15cd2630dde30c32181e65f151c03000000026a00f98ac18804ea9376020000000009515151635363ac5253379604040000000008000000006353516abdcccd000000000004525352ac807184050000000004520000510e6446680128c8a503000000000000000000000000c93554bb3fd7d926c57ba3e1de7d32b1b5a7d2b27aa82d6720f678c3cd0ae1303f432545c70072ef0201d904bdbc6ac4b223dec15ac2be9f319631ad2f7647de3058ac7807e651755d95e1c10a320808f84ece9cfd32bf09e984af92097896db00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0a7e07a8646837dfacadc590ef37b2b6dc31e6a176de9eb502553f8aa7317dd758c2833c3ec458d0ebfcc32cd5b17ad6a00951d6d80dfe017c06c7b6ee20825da5f9bb1d461c3c5705f56b3c600170146b467f23ce37ae82f0f0091ce5d520718e51d79fba05a420699e48bd54c6a7896bfb46414a0439002cb95ae7d7c8050020e77930698898df03f3137680d5bc74dc26e2579595fcf9c8d3d3862e3d8d96b03222e54db07eec80190112da3b3899791a0c5f9c212e59a55bb9fefce86b59a580b04b917ea23fff62e10da84d980f3937fbb09cf4a2d020ae22c3171fd600f267dfc0e1947762e3cac7593765e486b3d082afd46dcb6abae891e5a2ff554cef76e0206619a57198a389cbd8d5d74f397f90f86df8acf9480d92efb4d090c7f8bf0c5032bd57ee2777ac2a9d6269f3dad3bccf2f32bab745d50e5776a5d8200f561b3ea0306098f477639cab217b4562ef3e7f7eecb4c2b83ff6dab93388f2eb212053431030aa495504020010b2c1ae22e68bf1b070211a692c0ef7ef2e63a8fa76382ac55022a07d3284d1ca57341c33294424f9d4e9fbb487f56fbb00f47fba8216897e261c3b9261a3aef66e1fed131eb3469f2d3c28175010ad110a058d285d74d532a7df1dcf9bdc4f93990126e6c3b982c574f1fa23935ad0884b47e3730a5a505a2d096c4f9277d26e906703e3ce242d962cb137d90e79fecfb83d596bd11348d6a0e2952026c0522b900c5bbf0b2337c6fc3486cc84c8c75a4ea3624bb187c5ab5a7dc663de39d6b441d0279f0cb8cf2c0e394c3e2737e8be18a85c860210cb49b562d54c15739146a38b4e68b74677f431730eba9cdcccab826e06954438176b2eea28de85a61aea83c0f5acc079e7a04f729e44110fad665ef9fd1c40de25a272ca1a6aee8f51f521daf4617b111870e2ed408d347c651699a666d6b6c84e32235df9d5fba1be848caba0ffeeedc7e8fcc7f9236e5c06c4fde4c5ddb20d437ee3755aab0b0d999960d07a539aea792a78d7b2e00b130e523420ec03eee86ff7116bc711eced54a7150aaebc12f12269974c71242e8d5d124dca82ae6b4698c2c34ea25a28c9655ba9fa651d867ff49b7f6a00c2182e512e4466c8e4664fe9f3c3eee087824ecc33a91310c8cb4f95ed429237f802959d9a0227aa77d45a366e2809982363674a48539e723afad6d0bce3be29d60f7ff24615d655fdb126c883026cc053dd79c328108c4f7dcb48ac210ad02ab9182d0280d9d5fe5278ded309ee51bba8a945c1c285f6fcc971e5fe8db1a132c8a712f00d3ad58f6b0092370c8904eacf32c5ff1a546eae381f744cf3fbfb2187400ecaad133cea52354ac463c5609ac21eec1f223fc01a7abae2f6026724c4c085dcfe29250e642af0ca7dde1095e41a372856c9930ee92705403cd0a37a8494f4af48b83228a3aefcc908d12247ee519353220d422dff7a3dcbabb07ed801c8be7e663b3ed9383962882e41b74ff1340279bdcf4a7d79e901b49e4e03b19b8665f3984c6b05ce2036335cdf13ec643e48438f4a34c9a8f2a8f1b486eeefc241c74234fe1c2c19d3670a56db0ffbe1745224d9e4a80b3432c397fc22fdf16b73afadcd90d817bfded4d044562e1f0d5c483bfb30b8425ed7465aa3c554a5a77709b0fd4c25571e0bf432d2d5d1b67398cc130198f66e90a314b1e8434f1689ef694786c9466a21ed34a80f10f49e11f1b7501199af312ba0f011103d1b48b3ed1832052b34a43aad9a74eec5cd36018e63cba9ad2511e585b009ae64c8b14de652ce823e0e306168af718370e50f909c9b2469be726d0ef59bb5d3fc46de7de54f0ff7d3ee0c9063455d7f29bb11132b567b75d448280ed885d795bf388d6d1dda9ca85dcb1108f3e742b194e5a585541d989e002a15940e9278552350d99bd30def1b62f059ddbdf1260876c295ee2f88dbbe49bf46cc9e87232ec1ce1d6cbc3a6336fc8d281b53b106eaf895180b10e4e20bf9a48f2ab3cecb156bb07f11514c024c32af39456c1c7397c50eda9b41b07057cf48b6fe6576d61c2da0f6699ea3de118200ee46333a0461302734db00df45d664da8560320d0c0f2a05935a273a2f31423a78cd8b6639eb3cf3b039280ed77e72d05a6d74a657647c5ba5db2011197da89ce402bc3167eaa7c0dc71be29117311e592476b961d0b034402e67ce4c432370a69b5b8d2033caaa65c5b502746aefb32ea847d973294ee3b191cb0f9f4efaa44ead66e674e05fd20746b933a02ffc150c69b9d9609c167a121aa2abbc338ba10e4ad9d459bd6ec05f0931960281cdf8a6704e53f6a5f0f0e6596fb7bc2397521348f7c4e95faf3a2be5c07c0a35dd877514edf42474159d2e09e3cc163742f5fafd403bdc14d9c44ddbfa6b4696435b1e9be81a0b99f8349de00f", "6300", 3, 1948661153, "534163043ccb8049e97570cd21aa18037b1ffb4ea160d9ea60e3fd00579bd31b"], + ["030000807082c4030132cf1d17b97fb1185a83d942f07b52f018c100b58493e6067dd713cbb38ec72f02000000045165ac52ffffffff01a494e0040000000003acac650000000000000000010000000000000000d1c62f0200000000a96403e1377eaa112c8a64be86886260f7a8373f346567826f221513fe5fb4f5809312145c69d6d71ba44e582695ab89e54d21fc56575f0d6872b5842e79e12856534bf3db22b42e23c71596bfcbaf97c8924376bc7df33cc9f9866c8cf5bb5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d7537642370ec10375644611d7917682bf7b3735671818af99800c0b9d39fb280b8a9fbaff544378c4f9d67f47eca81565cb17d7cdee2ce73247546d0783c9e67cc45e1f1fff665b6b3b10d5b5b67c3490d35626584bd243a264f10565fae92ee418f6a6f91be97856ede47a412fe6531a8013fc99974cdafe87037c39df788a030e94a4e16f8834a0354e33fc14033ffcd6181e2870176ef016a8d61cb0699302022a82313b68277025ae86a3cd758e8eba3cdb9cdb27edbebff38e371ef341993a0a007733ac42c29d48659766adaed55b7c299a21bb407fe65d72f3c1ec7ed74230485fad2ad3180cc2e9ddee2938603e981f6228a5607e8e73287b2889efb83bd20312ea20656e73fd0c0c48bca282c332cd5783eb3fcf865770d601e7f5d35d422402166997e3a21cfc2848bded79e449995b004e9e698412f342c06f1e0f56ccc07302123e8c8c05c7d3ec33d97530c9f70e70ea98043ca8edd9dc8664383658bb586902184c096fc6981ae448a9fd174012b92e74adbc16d8157c7ba2e39e77e7cecfad0312ed0dc249c53961321049a39c0f587666ca34713383d3c91abff028c55d52a89ef78ae9efe7d39d5d9b0f407a1f845a91f1d8cf89a49ff71c332898c4d8790912891b3b3803ca5407b84c5c0808adb318496a106b6465c3860f78828971cf430df86c53314e045237d78c65833109265e5de307591c4e77a46d2f1db40af364ac76fc9fe2a368ae98d82a2203cab24cc6ea1d19fff2e17e20eeaf9331561d969e5cf40e1abbfed8bfc30d0cf56c92614e6d16ce1ff01884af40dfc384554d9022c8ba011bfefc2c5099a95eb4cf746aad98056fe4562841141277f1b69c2a9c9fea16fa67e215cfb07385fcd1ae448ec4ea6f3f9462ed04b45f8e30b2e2882bdfbc40cfe0be932a6f2487a9ab73823835fe4b273c6a4ba8d70eeed9e67e960e686414528cd38702716b3208cb45ec02abb1b1680f9a8b40d3bfd555066d628bcb9cb49e869c32f1672cbe04ec040b1b9b80e2fd340ca0c38f09c50803dcc4c94a16bd1474f043fe45fc2da7963752df6ae16fa45519bce3110a33c29c69386fc1cc5e93b86bdc0644661474dffb952b430eec541a92830dc66ce90c6e9c804f35cbd637b8c49c03895cfd71ddc4edbc800494aef98d6474dd0473d66a334383e91ae6d2d322156618a1fc39fb7cbca9cff36a1187c83cd3edc9a357f8b229c7f2b429f9315c55f4baa4d8b3e9229247cefe903686f14d0a283c523509fcec9c49b628be252fc16f71334d75ccbe51897a165b15b16dc26fffca72590c89c27f81e764482c3bd8d543b04ca97d440ef8e24f4c42d6c2867fabe3d486a993d25364245276a94b5af6346c21979e007206b8bbc24a90875e1a43429b6ec673df114d73513348637f4033dc2c0b3e48b94b4b9b282d026451c076563ffe71945d19ef9b67f5b8b7a1f6eee4dd019dd3ed937472e0ae28227d18bad235e6980cd46f295138776fbeec1fe6acf1c798781b82a4e71485d520450d9894bb2c1465a1c2281f7a1c51d9654f7c8cf1ec59cccae7bd90ee4bddd76a6e6a4afe0db0d8a7ffcebb6f66e5049453a350539882e6fc2fd6dd6f9b4e5111340e91f420439bc0cb05d96e99b390c906819151588c08cc682aabff246017b86cf86c0ffa579480d1e48dfcb733d89105cc80c8c22a3f3a45de569453c019f81f9ea1d4e699e44bc83b4935c57bfa4080eefa77a904fe6286d3bb7a2f939ebedd20b3b36bb8d1b12b7ca4b6d29c9c37359e7a88d3788a03315bc1a6627467605053c968f1344a69bdb933ecb2278c20c343db1ee3d264c1c648ad020d19cbe8acdf00d9a1bf094a8ad42c787f1cdc6c8ea579568074457041d25b34c24fdcd7be70397577bc39712e7b61938c48f8b363ee2a52adaa9871f5bd2f7f05d23fef08d5e99458e4bba61ac07a24828214a06b520fa4753ac76a1b34cb234298169b4fa1b2e753daa07c1f52cc6b42c437e15754962e9e58ccfbd4d7064398a218f99014384fa345689ccb0281ccf423b01c8964fb6b962295285130fce0b957acd8999d616057834128baa77360f1cb9a7310f516ec9c3c3204b0302533dcba5c9573549f0f32fdcd8bd115ce910f42b8f523840ed1098743210e850c660e0445674fd06e7ac533cc141eb3bb1b01ce6e82b6224da8efe11968bd73c66b57fb24d5b9b024dc7184ebad3cfb06de3405ecfd7a1d2d68b6fc28df110b7db6096bf1bd6eaefd1c4ffa2f1637dd644bca252c473669acf0b3c9cecd3eec89e7f7d1692540cd09ac1ed4bebe699386facffb953ee317f5f932b2c94be2317274e308005b40855dfc3c4cac2b473b6e6cbb728e2572b6f6239c4fc7b21d626565c1e8b3308f085a7c9dd85d8b781b9bf1cfece98cdfebb89af2c849c2aecb08", "ac51", 0, -1529755828, "c43aa4f170dd23d8cabfb5a5dceeca19047957080ce7cc04fd2239113c4643c7"], + ["a0efee1a02726289d9751eaf5acc0f8cabb69df77f5972298a765fe26702459beb0cde7da3000000000263008f0e20d38a280a3becb8e325d4764368179336af6d944d0123885016fed42d6dca878f5c0200000008ac635151ac656363b5bb69c303c9f32a0200000000086352656a536300ac1a8069040000000001515a01690100000000075363ac520051520000000000", "6a", 0, -1387715744, "77b67cb2edd03045108f28c4d825ebc95f81696ee8f13d81f5e0828afddaa064"], + ["030000807082c40304a8f49e077cc0a0117021ac5e74200662fe5866a07172e088542a82c3a67d25da0000000002526affffffff1b1f102316874c3b9a5d15eb27478cc5f4e381603503941724fd174b37e203c100000000060052ac655265fffffffffede20cf48118f1ea6286b094f63396edb6927564bc1f5361145fabafc564f5d00000000085363536551655265ffffffff482fdf66f05a5153cb6c09ff670d1763a46739505af08e097f936f1011f0b5eb000000000700006a6a6a5153d190673004128b67050000000001000191c100000000000651ac00516a530287f80100000000096365536300516aac631aef320000000000056a0063526518cda38be85a781b030000000000000000a57b9705000000007baa34a728a5537c8e28d08e86251b1be8bdc7390c69ccefa28fde51fd562803304a7fa947fb1677a3bb7cafe8bfbd12cda38f1ee7659f1ec46a78a289584848f75731543e1f8edb12c7d3ac3e5a2a3d7ed6c8c1e350ffbde3d83a75a06bd90400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b589eb727ecc84f5e64dedb307ebdc50964412bbefb3f5e3c64ec8568afd0fd41488d82d498fcde85d2ba35a81e7d314897a003deab40abeccbf81b89c1d84eb57b7199f9388a5d1bb0d3023cdcbb101f52fda3da37f368a3cf35a2c3bc3ed566ae5f05492a44c83fda8ad91963d3b3e37eda1e812d885152bcca379b396b6450307b798b0a6e110991d8f13880aecbd4888983df9fc9eec1e69a5c2d63fb69bdd0204aa1341627c3f0f7268a451e50972b7362220f078cb7c8c97cac85454517a6b0a02ba4ec26f17e1d433a92a97f5fd8b6f822e6790d2d0fd3f8c7fe0efa76276bce877eccc19b52fc8026bce192a4d2c0c5dbdd852ea60c155c7408949afb846ce030d262d680cff0b8c8c2940ad6ddc8a60efc3342e0b6bff20ee2e3e1226c97981021fb6c324906082e669e7441d31e0035c8f68811e7ff90b2ea9af121b1a55913b02132861abe2c336683b4b2db0a76282ab79082f7012192a65f07a99b05444e7cb020befab2f8230822e224b41ccbe3f4731bb428b0c2bb31d6ff536c0144a7ad55902183f8e1c270e113786d3f2df3e58c56f8fbe421d46e6aa529ad5a3fa37fffe8bf86ee7fd7f8979993835c4a9acbc3b1bd0fd0256f3304e29a12a88b8fe50e5dafe38e8e0f86692c88d242e697aecbe28101e71547be654dc6cfac067afc02b5c5b4f65ac39cd5010afe380d62c7508d0ad65208f0259f20ce87f1a64f57eddb69c70a135fb9af3ee9e483aa1f5d37209463dfe18b3bccbc6c458bd81a9d73302468f9665de6e2e28aa348ee4dffc8d60204b74bc3c824e1e1a41576d1fd687373f03fcb37ea759b0eb10a5b1d1d8810abbf7a80c5f2b39eeef7c2daec1c0537296812a1ff4a4dfad5c41453a30c07f67bfd435ac57d1e06b1d3f7885543fc9c5f779788c30c907b67b364dd6d1e888e3881976ee8eda95320fe6ec6599e355f81a7fd208a618da44056373f2becf75ca29055cc39be367e1b20ce91f40ed3a94604465eabc914cec63c9f0d7ceb473324745d28410c075e96a68ba7c723e64d742c8c3a6d99ea3b867779e1683be46391c5efa898fad7c8af9d5ebad73365a816b527b75002f0ad9bd3998f8013413be704ce228c046a5ec214c021481b66da0f3e4b2481ae960e276c07c335eecc44aed37976403be4fcaa03f3fbe72e40e0b35b34158431e70d2a380bb447e7da456bc818e93d05ecc7e2cbbb2113f621c9bde8adf45be3fe82bf4718ded15d4d3f37dcd5b7782688599802b99cfd7cf43d870adef575e77310125622fb1219faf6f6e82472cb20b6fd2023d908c09181943ddf9d9d47009f784b57634e0beb9076bc7bb6a2748a3c0207fa1cb43e89284e2bdba88a73f4ef0b68f6cacba61e4bc71e5fba6267212a2e08d42afe8d5b892a02d2a883a85a61fa321e890ee00821cef2929bb96c105ef231ac9e90e019d962876d58587be09a09ad57d97bbdfe49f9c7947078ef8b8682a5890f20236ccb7d85116ee4329d2c1047583273dfa2d7895d12709e03bc160e5262975e7cc29a92b4ed63297f5dfbb7aa322069f27d41c575f8161a8bd37dab9497de9df0dede3b93b7ba691a0a0acccbaea6af597367b980d5d35e7584016da71fdde314d94e00b768c4c6200aab5491d7f2ecc13c71aae10865d6d3138f8601c7886a9b8d3c5afada94f82b72a7cb803b6de87a9aea4a6febe0c01c82acfa3a0926237778f84bdec664c6ad97bc9d627ad96d1f4b674ccad74e8e9005d4597a5566d200f19c7934e68d52a3934669018a554850978a9d75258698509dc8e0661b4af1081549b1d1e192acfa59775d67132ed62f10d49cf128eec2f87819bf43c0a268fee6d7298d741e1f95a7d1717db824ae92860eee2e344ad2f88cb23b7b313f4c7cb0ef78271883ba7f2609d63a9115e5c294db3e1c207a3a051db38f204bbfa229b07975191f9cffb441d968b7596fc3c37d5354b0bd0cde7e0c1a2688e71975ff266dd2321d131313f3b0d5e09ddef1c6b89f52a89d6f9c63801c73ced0e0c59b8e41f4641c586942b87f1523fe0bddf0fef0a9f2014073d4499312d04a427e7c15c247ba786db22c02a2bbdeda15bd29e70417e6d6e926455a14b22456698f586bd4f2880936fa020f2ddd54163bec0bfe51cfac2764e008ad9fb2206c4ef292d6797120fed89ca539edef4e77e6611b9f63949b878d2d3a737e46280455ed9a5cd3a74d20312335cb0a7ebd7cc3c329fa338276941769a63fd217bebf0c7a35a0caaaf9a26f4f888b4637d188db9597133dd66656418a2590400000000000000000000000088e38a1548367365ccc473bcc5f6c35b7125e56afc9167968e392e75088d9ce01b832c839443975248cb55e95abd3d4703d44ebaf9fb9f5e92ab8c2a17eca594c46fa9848404f62ef0da6f44d78d329f9d8fc0a596fab36eaafe038588c0e59b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030ec3225cff71a471005b4b750fbd197b52ac9721581ba49a239743febc52ae762ec9bc4649e3e0b0063f6350e1fb2d94df3a9d3ea42b19e7c7129bb765f66d1d64fbde9f0215d44e5d2abf880bd2df1a2df2e8465afc83fb77030c24f6ef60b410eff34fc790ca0d21914b549abc008d6ce1da1c608472adba628b9ca66e95c022c5bcebf4c2f45c134405cc84ca9739e6e54ff421000e91b641811d1ec908ea4030256a42e2eaa5329b71279643b84a52efe14be5e4061b783bfe6d13978d72fa90b07c91123f3036b2bb5f6a243acb0c23b6d0a77bda3a0c5b1b2996f817220c38be7048570ca138833e77806230e655df7d9150554d9bbffdc94d699823cabacc803154918ecd9ff6150c85df0479459b79ec130f4f64cae8c7948973825de7cdef7020058d4689e281607ec5f4efe6b4ac5e03a5404dee53734be931f1fd1ff96211d03002faebcd299823b08c1a2374077f276d4a387d62687d0a724158af3780501b5021d9a37ea039e8ced96f3af199d23d3aa7e8414c01e69ced224efdda60a9195ec022249db675ba10717381cafe684b350cc468c677511bc90cf96cfbb6a532604e2ae77a5696cd79e73415f2587f588d27a36f98f5fc1e516b0cc65d9e55b7bef5be9957a75d82c3e1236e51a453428d3707842106292ae6671ada71afb01e27a78fede19e957aeb4c26d997f0bdf23f3bd5596a03992847e7292e15fc8f668d0ff193f64149ba1afe120637b0d69cd54a8c03ec999e1014b261bb35fa1009a03ec6986c3f6ac22db06c0366ae4df689600220c88b5868947f7eb3bd447a0ad88b16ccd4f7e264236ff9b476124fe12abad90e06dc684f1ad2a272212e16d8bb9cb8b28e1ae5bc1fcda8b4579f6a380754ad0fcdcc19d748f799a3fc771715ec794d1f82159636fe2c839e517053c8ac626fe9bcbfd1d4a6121a9507a1e5ea9de6624f453f430faa8bd12a70d96a2b94a97c328358c5295930e569e465a9ccae7f337a5cbf1e36ebcfcba0b14f610469df85dbe49a0c46221646dbd40f13622599d2bfa556845aa0ec2dc55581bd1fb069dfa5974935c4e2b52efec07054498855f4fe51484a15810752e81bf63bdcc87c5b5b2d458b9d4aa9b00beba7e6dfd3c770c0cf0d6fff2ebd57c3a2d340fef481a948eaa30b53cea037dde00c5a28e89672db4c611daad7d685af66160f3022eaac81dc77645a9d12ba3baa54d33203e01818e40da7119f59e4425ff4b1477df0b9db1d928b58e4e2b5b4364ca1973cf7f4e5f5620ec92281f84f63c0fb0a0c872882a4e50566903edbb2c832329cad7fbd9a6e42934cdeece59dd1aadebbcfe735b76321f9a59e6304b71c9188ef20f43e761f9d826ff73cd923e8adb8a8ceee6647c3797ed980dae692bb9bd1b08ea7285ed68e81873fe7a5cb77d57bdc37310c3aedf6068d7be5ff440f6ba3f36e1d5053528bc06c679411064f04be95edd78e0839f9f09192513f81559066295567cef3de282248b43140e46f0eb12cda870218e44616eaff7d70ad461eb044226bc76df05eda0ac5892587feb673a8b0c333668424671aa62687c9d850e2239e526ef99ad80b398c0d681da705737ee8a3f2a578dc8dbe06b779776cc10bcb832aa1a6ad6effc0605bf3a39c74581ee5c28fc2fe60ceea6212f151fc4e4f6087eb7b528ea653f2e4015cdff717087b4c4bd778c5b30ba31efbcb08dfbba52f2ee764c3fe180cdd684aa736fc6d54e4f4fb220b5bbdc295014b441c24caddc68929183e1309a0bfbdc3c2ec2751185d4f362a61b6d4fc966f8195e7029b504225e356f6b9cf75c67cb638327ad472fffa0785d9a30ea66b3f4c8fa8b4dcf6c5f6180a71b6c88e6b0ed3dcba3ab26e46ab05c9a1c1e3467994bbd0f46a798787c4ee639e485eb1be8789afb94290cd3a0671483ed7755aca0b54a0f097e042cc0b3aba6570639cbc6e9dbdf9440ee183c194fb9ec8b4fad1bfcdd689c3bc01e3f026d757d35be257f0df82dd9d797a4fbc8e8887d2d5b64283b79b991ac32ee31b1b24f7e0a1a1a90f675a85390facfd6772e6233ab749f0ccd3135fca5089c5635df45b6e8c72d61f40a23486d82aed267faffae77e1d0e743d650a06b456403371a74f4a5e6be05fc8b43a6fdee71f4f4d815494427fec047b178011474a8b863c583a08bb8597bfc08145e6d84155bdb4147d4367993b435f38cacf79ee7d386164868e88ec665ba2868380bc801be0411cb1a3e6fed6b25ba2d905233be286b9e06dbd4a5508998953a5b2335686bbb6c404fb2191e04000000000000000000000000a5ee8d5a894dfeeafec89d71cbd02aab4828cd074b879d7844fe20e1723a9d7b65918ca6f92c02b0aef626f6fa043f1c6bf1d16a092a80f7766c2cb8f86f098a175d6f1d259b0240a5f9ae9f4a356234f84dca38ef329bbe95602fd5669056740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007cedd596197857eaf93f2713e34ad356c8c7f86c06c70428419febdcba60d11b0650a3966990d56c4301ba4104fb64b29b1ef68f671a984e9aeaae652149f6e0d29febfe45ef7da5119d50509db9f20ee681d9e6b3b76f5f58dad9d64c04e69fead30f57d5594db2065354780fc510c8754cfaa51c0cf018b8a8d9ae09d78bb0202f0707ca77902d79d65585396579c5f87975f0f490dfcf4b4b7286e9fc1b101022c402391d96f0ece4e1a7515f30a2bf11e0d3b09a4cf2b8777d379f52c9960170a02a1c07b06b6dd44e649995acd78740ba779debf7ea5dce2c609d5e1c6785653b980e6b3d99c44ac26e18fedd697215ace9b8bc0820783570cfe0202bbcf2c6d0220e6f00c57e15f7edc100f6ccfcfeb703afaf1a51e2a29b59a4f8c49f589095c031f616b4811141368de30e006df6229b3972383d716ae04af4702184fb5f43777021c3e4b97c390d7b0d3d97a766b49e9b5d7efc4311ef6c54c0e3128af56b80b6a02233931e6ed9181f16bfd19310a9c0d653cf856dd8e533f393fd02005a76e4445021626a95bf60607f4c037263e22064ba4fd5a727cf627ba54e84e670691b9fe44846a437cc3c5ba6f3076fe83e35aad16a16e979c0327ec9291010c197f00b3244bec85f6e64cd4917fc12ebf30ed837048035a0e627abfd949a889a6edaccb73a3c1f1f4d6f395b6a27f612ef374871d343997fce07b8e3bc1729bc8bb90074bd3028ffed0af477b96bb988db277f50ee7d14fbf8517670b88fce52b95ddc3991e3c02d12cf059a4d8cdfa0c3cda68227fae5cf414d5facf9010a6b7e5b995435ccb2b95391e3c454302a913ad89f3f89e1f9b90c0d9d93dd0c201046b349a3a10b474b33fbaa5b327c8538085470f2f3a979c211ea02df262b5a16300900db29f7e3900a41e270e99f7e8ac6773d10540902a7693f5a7600222376c509cd03b691215b008da6040e13bd9f9ec3776a9a612537cc5e058ebc405e98b5f33a529817a8fb3f7596b5836444110a745c60643ce410adae036ceee0e5c1b42102bf00c7e5e08b9daa98c8e697bf6ca7109dffa6bb699ebe113d16c4ae4e09d346bfe35d1d5b17f0e82b3518a231a635a24094dd8e99226de02526d95bf78e74206f54920cea7bce7de542ba3c67431e3da87ca89a8f23328ca8eceef1c99ed466169c54b01231e0de4cb63f981ce7ddf2b55b9d92866757d9021ea62161bc9a30f4c20df42a0660e95f7b05d6448439ccec7c33d74639ee1bded74c60b25eec7d4b6b100d2e8f4bc48c088d26b54d84b307540cae38e3fc296f4048e4a40a532d272b6f68a956138e979da2af63ba527c6a87cfbbe9dfa1545ed320e5aec4ac1addadbaa889f0787485219656dc0ab6e74f3802180c9973a1b81c0400c28f7743d1e307083d73b5a36c4a5c9443d0e66498f1bf3dbb40a0198a2280813bcf9c71f08538f67257e38d6730824048043494277c4dd23c5bf3fd31a96155608f66a6d17fa7923a30864cce9880f46bac892007082e91c97a8f6610ea5706ee6ecae565ffb7d13ddf409c693c1c0835bb6c13da8de3174a69dfe6206ff6332d1fdaf6ec5ad5f755aa91837829cf4b169b311b2442420d6892df7d98aa6f2e6b6a0a4f81edb8169f69ecbd0916e83b453a7fd6808a2d1136aa6aee165d106254ce63efa59bdc2cc4f705aaa3633be9df698098afd846162537f91d577b77db01d2108d8bc222071160ff7b14881320aad1ec0d8081f44c5e51d88953c1bdee0465b83833038c74e2764c36213740dd031995e39f2638412956771a7dda05be9743d51ee64168c07f6b66b2d9a093fb4cd2dc71ee91b85d76c2a1c40b5b059d86aee2de7d6bdb0f2f5a86ccbe77e987bd372f62ea5585144a90cfa7d0cfb62da541645f424cd0fa054493f8abefbf4b00d527228a4edcdab99186595931adc51abcb5cdf0cedd1383d147aa4cb17f55d12e50015c2fe10f8f63294316fbffe9b207f2206f78e946a24834c9ea3c76fad0e3a52507645e514af9b085fbf271e6db546980c4f7f7d98a4cbeb62a4ff509fa034782fe7d51cf22bd0bbbc0291c1e74fe94f838ee0eb0da79ab9121a4a2862a028803f007def50e86dbff8d25e8c6b324ffd190e138e23088111ffd0a4f0a86371f2e07ff5e97287f5cd5b4c37a06b2c04b11caf01c1dea0c67edbe78064dbdf745ab7ea0d29f8ec9734b92f3b59da8bba28f278b42d223566845d68ae7a45e2451dc86cfd32e7a2a0e069ca2be8f78ce5031234505cb451d197d7eef7062bdca0a51b833495667aaad711d199a7912492af15a1085306ef54512574ebe0a128ec6d7ce74e9f628db3bc452a88db4efc2ec8412f48c30c2ff698a7338c8432bae46009d79f3812c6f13ff98abd3771402f5323af537f551a757ac672b060870203f9652ef90e", "536a65005200000000", 2, -1010303400, "35dd89fee0a6bf0b2881488ac30eed90f03ccd0ccc0552cc5467d5a25893c87f"], + ["cbf33a6b039de68cfa02bae3466ba002ecbbb246f5680e46302a0652ebd4144237675303af020000000453ac5365ffffffff263dcadc4a52bd53cad859050acb0e9d4349b871f115e79a0ce59cd99491164802000000016afffffffffa135ce3793719c0dbd8c7392b12e0012c7ebccfd44aa1853d65d0c48f6ae93d0200000001522e489f76046aead0020000000007005263536a00ac899ba5020000000009516a6a5252006363ac7c82a20300000000096352525251ac536353b837fc020000000009acacac5352636553526599da3401000000000000000001da0401000000002b5db344e50cab3dccb5bf32369fff4c276c5200bfc9f0555d76939ee27102723911e407c91fedc1285dceb3d62f19554b916400d0823f238751c8f0a6652bfafd6c2963bac627123e7e27b3428cb7e2e9b68f8b966a8237a01ce82d10e77bcb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d6e5dc9dfd829d2678cbc676ae99d39671ee24644fe47065d3ecb6edd90ebe0066194ed27d8ffcc0476c3cd53754910bd601c9acabbe51f36c951796f929df955fef4934113ef72a5a2524590dc2b39e7670018a97a3ab96ebee0c204da309ec837370e044ea4616e21c528bd07579162fab3aca1c95577912e2d204c89fdad803075bdabffa714b62b7eb1d455769092b76c24e527b5feab528997a7895e3d7d0032bb75aced96edeefa20dbf3e6c8c82fd1ce8c8a15bbd48ac069bd6f25abf235f0a084ba7c1aa208d4ac640bc1997ee9ca100a7c0f149183ae32d369a1d047d3a9044905a3767dc66e2d8ffcf158feb30936034952fbeb01c9ece97299f07f251d003045a613037990ede4d944477ea51b43ce1010f6a03f3c320f315ede6c743472f02179c4b1c588fcc0749582bea46061b7409d49ea3ba13c239ad04e3043f74b5d2032eacb49fb84af02099543e66208f51271ca82b72c5bd6e5553a29e5a5e2c01a5020de521cb7f623990a71f15dc1377dc52d9d043c225218af878bde0f9aa579ec8031def89640b8bf48919126407fbb773ea2826412600b9a7c2680ee97b60c14d0078f2a83e41a49d55dedd53a6121ff54528d9628f1daef247546bb09d1fa83be71ae2f8e50e5f41f068902a95f05b7e25c08bdedefe47781ec9699f705b350c6effb28e3bf8d25a0c13165cf99be95229a83e66485c139601062f59415611f78985bbc927ea89f63526bdeb271cd8b163062bc73d354810c87ac3afa4cfb95550f84826e6585b6f8fc819579d9ec66103f2eddbdb109279c2f037af22032af78c58e749db3df98b9bfed11ebd3f2ccbd7ea3520a2622f898f45c845b73da7c51fd55aeeed38c454af9abb787320cfd9a43051fbec1e5aecff098ef660f7dcc60ffa4fc4ae94780cea235c17fef76232bb11b1b1c95c2244d633c3d7a656c95784795aa70c5ecb23216d2fe32feb547900a0eb9ad198d27df91f53ba9c831ee23cbcef9c5aa1b3ae89b61a4b3bc52a2714416e24ce1d02967cdbcdafd9a54419eaa1e83c68df882622b5106e603f0e068b54f3bbd14786fe51759ede625fcbf3e8e695ca74c365de92cdbb9991aaa974506ef7bd1167de444aba535d7a399fded27e4ae3cb20b25813634d716c55d90cd685899b6d60d6210eed8072bc3c83ac929f6e1ff5925e1e05630bb6e8be4113822b2a314029ebf83055df9a0324ede8b0ed0892175497aebd83bba30f0958c71b94d0111891972d7c0f0eff674f36bd85d65444ef81f51754ff4b97900a2c801b6a83f9d42c2a96395ad22762f135370531868223b6230883052bc5f0dff0c091f285d02b0cb34cfd3bf77b49e4de63c165a6d76c2a8eda43f293cbb2d9e8bea4c9b7851da7afce6316a6ca69feaa80a21c00787700a1b9ff7721fe59c6f0145289113c94f7a8d59d9890ab36afbc1a248df7a39c595b25c2ecb848dcff2105369f690c04f6475f30021cdb593a637b88661108958762e261aef2d2f7f775de5ffe4f164ae7c5338c82081402af294308e584de8e0a830977816a014b9dd9d78bd65a0ac2fe94e9945014a79f5764f5e77970e87989bced7ce731f8646b05d8d25c2249b493cac640ed8767e1e8636ed2ba5361c359509f18edb16d35d870edff2086cd11f1ddef41c4eab500b268c2b1462ecab775bf5411fae1126c7bebe81ebb35d830918e2f5fe801adc19d9288de9553fc277bc98ab4d405f1d358421a5c859d40a8b3e6c541635713c7147ce75113ca5df032c550beb9ccfcd3662d572cf8f28001b03205bd61a1894a0608dab50127ea93772eab5b9751c96aa80bf04f64037e03a6b002e59b8f8b8949c2d48140b95d895cec07f2408d5ec5b90b834fa223a90b183b74076a626e0ed94531f165e6930ba7adabd322693f8773721e52d851410640d3096e034db29e7317f106a2739984631ad6ca50f0d13c4ddff6a65a13b53c9816f3b66ec960dcc1bf39a9b9e9b3b4bb760e6a516db92403cef2e1065544dcfd2a4872c584e351f5f9e2e659bfc21035c2a9ddf9db9fdc03c3ba22a16138b4e71029094d22f078033534bf76dc84919480bdf07675b20171379730227c93d64ef34f663f839d9b0867db02e33610d20949f0c8ef03b854be1ba139b2adc67f74a2d370d4beca522185469938dace3efc29908722ce3f887400ffec5b157179bd0a3cd509f70ed4e172a278c0ed2bdf629ec2692194301410a02b71fb83891a00ec1e7f6202fea2e5d473e9220dc03d17cce9b63485359cdecaed03142e4a5ad1c4b08869f8a82996d99bc2c748d1ca45b0280102b8b6538a5a3df908e3f9585e1ccdc2f8e8db9ac912e067492b8adf8cc317d82679a964c63da7861fe699da1978c0210f7e86eaa5c9dbb840d8921f95fa474ec3baf0e7f3dd201f6906", "5152", 0, 291479857, "f7cc007f7f9195f0a28de434a92d8ce313757b1e065f32d0782ecf205686af66"], + ["db2d2339022f1dc0291055c5ba03c0182d279f8a8dc370aa8ee5fa9a7e59278807e729dc1601000000096300520000530051006129c95348403331127afc460c53765221371b7b94a08e44c35a259f982341c35095f5ed01000000085365ac5165526a51bfaf30a403c40957030000000007ac5300656365003ac92a0300000000066a6353516500d7b0ca000000000000000000000377822204000000000000000000000000fb8826c59f94047eca4c1799630a7efb1e5f8aed7a01488a00122d3f5beccdb0c00aa7fd4fe9ea247972bc5bf07702824ef14e609aaa2792f016622cd5cf0433784342ccb1723dedd43a36581bd17c4aacf641561d62536b036e98838a3c316b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000242985810ce8b7db23535cb029c69f933823e2e26660ca5340358c0367e175ee19bf62691b75bc34a99bc110c6d8a4d29bea14dc08869977e8c30d60413deaefb9a9aed17ebf2e72c66041d926f8afd6fbdf0d897b78a58e1c0d380d8ed324cb4ebd58ccecd477e8769e2a8e144f91826aa4a1a0c26e4568a69628f970d188e021588b33ea6bfdd6d52224dff8dca3f82a6370f50546c90cda4c67d06337bbd2a0204cf6dff5f09f6eb3cba283d7525e96ecb4c4ee222378ba7b00c2a31f2f037df0b055e6e1f798e1850c7c84b0896c971c74278c4efec2dc981b70000b350053b7df03cc39bf67e812f2cbbc945d4d2698ca11fac4c4143c17e9e0b5a57633c7b0a0323c1b4a8b15bf5b1d2c2531f530e7efc95dd6ae4db9d780080f32757b3e230ff03264fc8a783d310be76e50f3cf376cbd4f5111abb64149ac9f2862891476c45ae022d13eb86f3df5adae3eeac07fac2f00b0c895c21561796e22ed3f1e0941978ff03069603dfa17ede2b185f7b24176e34f4b2a7e030150e38af1c0762528ec0ccd3022f0c4f58816e2f40ebfe605e98b0d251259d1dcd7ba4e50602490be1838bf0996d22e370d8672ca5b8af989e540a5e408c8a38b008d0a1f7c61570b7a846d51e4de3ed739aeb1bb986c4048c01dd563b0f5bd7087689a0c826d88b91728df85c927c34ce8e10654f23ef84db78c1ecef57b334dccede96e0fc657c2d50851f3e73119827bc7f11add612c4d43fc8552d224b53065b4ad4f70663d9bb6fa263419923ad2f1b93b9b62974fbb96f112a297738da5a54d1fef8426142357bfcb60f04c3e000b62f2840c8009f43df3e5ab771e21053c469c68ad6f825537cda1a35f33980929c612f41f3112cc605e182e63b4fc99fc505868a637faeb80517eed53fe2694e4c61c84f1cb516666177190a288191e73106dd3377aca085a97cfb725f215972ace0ac3aea0975b780bee1a56e3201eb3cac37c7e4dd1823b67e79ada79e93d8b548e4f54e19399dcfda820d755b79039315b82ae8b9f6aa020e35f5824cc81d0fcd9b4be34771758cb5b2a8dd4e4f241f10bfa4e4a399bb52eb535bc36a19fec4664f624b00e33e70d35ca180c208677029c585528bfbe5a8aabc9207b1c5b273ec0db4e1e60bfa2acc03aae4126c321379b86a49264cd0007ea696799e9b80f65a324a7155568953b179c44abaa2d38445d468c697f1918cbf08cb2330c17f995436587400334d6713ed4c8b4112c46ba5dcd51403948db6b5feb90e89ee76e5686afacce81307e395c5eeaa0a0a891608d20613ba9e67e34597db9451a9fb9411716a235125688f31d5b312c59257517f19a3954134408f0ef264f6e89e9e9b3555fbd810a2657a2a65a137b5722f967be925a81e05c71d9484841e8ff113a79dd633d11352f207a245a0d84fd0eec4428e1238fd2d04c276b6bee5a2023579184f732f7d0f787244e1edabfc9f0c181e24a4803c3f0209b82f6f54971710c874ee8d873cd1642c22ba0b0a2cb3cc7742b5bca7c16245eec97e6b47a3a81873ca27438cfc823a3514d245267d8f795b89e43065f0bba67c7937b475ee9086b51cc2d7d6fe341f89b08f486d2bfc702c59eed1ee0df0abf549f46684930dbcb8417bd2d6890ad1809c7417e679679eb051a3dbc829da16f0e527e92ff87cec5ae3cceb4684c27fe97aebaf60005a1b7d4b61288f4d6f1c501e79c7005cf2f5f110d681297da976d4e0d2e39e5d8b7a4eee585de20caabff22876b2df8c0df139cee1f92059fe43f2c5c1b2bbdcde0da651efc70e4b24e9a944b2905df40cf8181e659e3d0612f6bfb615be69e4d16c40d5f1a7c5e08bc560db742e13b4ef1234152a969d3045c0b7c1f1bc29e85b23e9a81dd3d051de3810613dd462c517ac9f098f07099da4db32e8c800417aa6d5d23d6383fad20f796434c123a9789a44e22fedd0203ba4bc349ad2e537f4873ab2a291c20edbcf02215e45e1cbcbca58291b6cfae32f212261b1169f3d4db1a0c145eb92f68ec8f55033420978c4fab0f7159a3aa7bec8f72651d7ee4bac7fea01531f4f14f4b0cb7c41a04aa108e29d4fd967f5659456abc75b2401cb617498d170db696c67853b243eeb061c41d68179e1176a1e2fecc8b13157502cbdbdae64cfb9a495e2d050dd50bca2a4c542c3ade17335e9afd203bde7c57081dfc42a2fd5f29334f303a746b25b1e43efabfc14e9e0e0f60eee8c9f4e5331617f095104e08b3a6b09239517c1d222ff7fa70162ee9c80cb8a009a4b6d24a28e260000000000000000a67e760200000000d254e7937b9abac7334222916c619290eea2c8304adcbc32ebf2f24eb7f611e6a10f9f6d3d83657bef0b25395ec4370326d911189240690d4f4c28e2ff06ed49179b419d24d535134c5545c9b56d623cdfe480c519880964849f9bcc94dba057000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007591ddaeb1807b2acbe271d13a29d1ead5a8ac0b01c811ef392299e55976cc5bde415cc57d16405efe903d296bbce90a6065dba5bf6e2a1d657b43f6c0c9ab706b7083320f914b0ffed33e2421c4af9c19bc06680ee492be7ef79a88773c8ef034e53730bfb6495f81c18dc82c608beb8c91b85896c1fa038277c3a93d49765d02157af2c227567087a996092aa49257d79b1ec7fb6aa38257e27dfabc4911584e020865070895f74e4668028075d0fb176308d4995f755660aaa5a072a87ad38c1d0a05b23159a95dc6811148c3a20c3319353b1afb0411c3a3b798c3d27eef2e3f55e5d91d2a5ca0ca6e8b56306fb8755668497376cc1113698ccebfc6d7b4e2859c0300c7c16f733c53d020be0852bb17188ee3daa6ed1bedf3542e03d3903e8675a2031d9c5faf7c339d98330aff3fde483046d2ae09657beee5626b9ec028883c7459030bca2d7f3de4729abcd3b88507808f451813f0799152a6e88e5cc901e76287be032700e2f721a3e5c50aed1fdbc8b7b9507a24a017e520d1f7ec2efd94ae9affc702042ca5e45c9f7d9306c7ca59563a548f5c557381efe93272e48994815918d7b98b4b0d6abacc632af6ed753373924aa9cb1616966d561d61947d7878c2a6105d2fdac493b0d392a91fdadbb2963c993868ca12f4aac45610a0a641fdfe2452e1d51cfbb78998d8e760bea51136fec538e6515c8d5be40903f92ebb7170108a659e4a22e52f4e9dea84b7f028c3a55a1311b5c6a3a35341de2321721c9668896505b42194735977a5b6f0c49c2ea6090b66b319ffe78aab0552e7469a8e0f77b0d111d3d2631357b7fedc5ff63761b92eff6b237e4bfbc719e1fffa1f69393374eb84afeb6bf512b136fb6726da13f17f065a524cd63d9a499d68e6001267c99ce85e5801b33473374570e0819b054a6e202adfeb202ec8dde1e34087fc57cd1ea61f6f9568de41f160de3ae6bac19450afe57113e26d7af03c84536dfb0c7dd3ec222eddb22031bb0b4a1c5aedcb379d8d02671f0d7fa80ca1f551049e76e7512c047ccc67670ab03e02f14625e49f0e4d5062bef1ee7a243a4876a3ea5ff388c2e5c46c3001d00ace2450ea01e442a9ff96f5a1b58e8859f89ac6391b945c4d9091855d80abe3f950d81737aa462c9a3f595d2d452a154e85a0e0ed67c32e180069a23955a5cb88581dbf0e61feaf9681b4ed0bc35d527bf2a369959d6141fa22385354703c50cc779fb3e01623afca3d2841b736589ba0ec7e1b995bfaa0d5be40efd7e2bc2a5abc358f9817f733f4ad2ef2d9877169e6138cc854b8289ba171fc1ec390900008b3651dc325a7ee0252dec02d60a8a703ef305b44e46401fa1229b5fa08b20b9adf4c639a17de98edcd601810de1be58ca1d362d41019b511d3906e9848e8022c700ca4474eb06ed2bf93b642850b5385a4aef13810603834e6a465d849ae7808d1c38949bdd4e2cab4034a0b567a7b08c3aa8f92530bf40f1bc6e7e94573888905efb96699700090ccee85664e8f8d57fadd7f7693cf6c12645636c8b94d46bad72eb7dd6fa3d4c58e28ac94f3428a588b2c730215e30f772e8e4eca82c2218c56df7863e3e25c21ca07a98e01e4f578bafe1e42d065dcc8135cdb2d721d0e6081d763895165bb0b61f6387d767d09ecca70c06a61dceaf88b9e9a75ced281836be57a544eb35f214ece39aae212dbc25ecd39003748a1fb163cc0dfc2257cf9054195a3b809ee44fe5592a0575b2d381491635598915ff4057348082dc0ed559d133a18213b9fbf1f1c4dbf0cb99a2c32ed4dd4f4f21cead4e384c95adb20bed013caae28b3e2446bed067b2192e3ad98b0f9095cfe3c6ea7e1fe0ce3010706d49582dcaf5cc7e81a67fb6b2ef900ab0df58a07533c19b566a5103ea5fd1affdc7b3fdef3fac8cc267f430dfcb41c5f0928509aef97a9943a69334b07f06e399250b172cac354216ce2d6147dae1e7c6bc3778e519d1e55fed9c72a54228d22b911b7048d22d8e51eddcfe27936e2b69c725f4dcef37d1b192d0e3b8aff98baf16edb5d8a8a3c7076d1d1a528de8e4c433abb819aac8a01462b22f0475a27b5fbc35d48579e5855d3b6c577bbd2808d8609bbe59db9090b28521f281661952395e340c8934d5ece8edc38c52508dae067fd289627b01d9ad39759df9b883f652092ce0bc08b8feece5236d81fa58e44731690fb0c4653387087070e2cb8a225cc75519dcf6e11f7437e63404d7a8a83a2c240c388d3d999e9533dfd0d28ad5c30ceed1882d542dc78880000000000000000b48f0d02000000006cf0b9c941626f30de50242144ab07a84347989249880786f2cb53c91ff7386e1fae05252ea36dcf9b0dec9f355a2920ac71fc62215993847e06b6a80a809ac021b48900d3df6c19c8c0e7b6b17ad54c5989303eb648e370725a2990bd9f82db0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030903a2f2a65f419e9f7011a81749b8c8a0ca32eee42569fb6d46e34ffb449474472e14e53d8d2e2b9be49bf0baf6378d13aace104e5a1b01dd509357f6c757ed6b2cb93530822e89399ba9be690c1193f170159a432b850b517a860bba4a7c2b98387a4cd70c42648b6a5ea6aa6f43bad4b8b3c6e8667644f85b4fdcbe2704d0225cdd40493923cebb75354ba4d08d35d6d4215468ad25fa878fe25336c33f65f022977b02e2f307be4b6b5486884422ce2ec85ac46f833d86dc14d9c45928ba28b0a05a7a69d3bed00d4b4ea2d9a9e71743e1bcacf618a77a2a104899a4678c5b3b149899b265116ebc826d09502233aeeb411d5f14ae24e0c92d305ad8a2b1c028402193729d701a25969724430fb4f9a9cfb88b5b599b801981aa1439ee6a19b8a850223fa40c286c8895dfcb76de4043b89238f380a86fbace7caf5c69fad41cef553030b353e6978ee909c9a6b9b2a5ddc82736ecb47e733c4b3891dd7ebc5c1988fb10225a8c784f20dd7eca7dd5b7c732a372f5b31c66ad01cad2cd05ba5e1b43fd571020fb31531ca23b5f8af3459dce5a86acb4a2f7e8055fc2d8fff6f82fb3d6ea2c1fb4517cfa8eff0eeec1aed2791551c0215e7e347e49f26ca5746fda995b50adffe11eb2b7ea72a01fc94b8955e32dca053840c0c0ab5c8ccd89e5b47d39b663fb4e9e0750963846de0c9db41fecef46850bd204fd763ee8280bd79ef8f5b6803a4b376b0ba7d901aa0adb682292b88971e0fd6e77d107b48331a74a517298ddd19ffba3d1b2527b8599f675e30d7605cb6723a713158963ae9e32c0f834f6668a2aedd6b311534213330b45e939a0da53febe70577f61cf0e0f26eddb1d633503a60941a5936d8fed5e4d74e40d80ebb040cb13fd7818e2fa073a912d3ad204a5077722ecde2a09edcdd07c5ac10effc8a1cf4267d917fbadaec60afe9bd6b6ed622633a932f7d2c1c7054bafc11effde17525df43b097c10195cf259b728ea9bf3f8f58a6e366729aee1a709e596b04f34f7b9e97282e36e7ab1cb1d4f143901217a375ed7d2a1d2e84c0eb4dfa5dee6ff7130789108b768f1bfe5d72c5c0934fce9fea08086c2e3b133d616795f6df2c11a3585bc80ee7d8b05d49d076749869d9925ff391ab4b7d6c946fa974f3a816fab2ae6827573e970c2e677bc04a529d1bcaee5a4869760c987bd647377f79f99108280d6487ede08f1989246338d74bae43c4f281cb94954ee633716346875569331a8509fc97e342ffaea4bacf7f8aa06f467dfb14f96d7f80d2f83b51121bbe268f17006402dfbf74f5efa7ce6e32930f8d1f3f1a37a97dead465989836f6372ac95ce3c91b1aa556a672f1650c5680ac47a910657f08d9c89d0e6568d75c3058da55af7248d3cd35a9819a55289d3a0ccb9eb069effa57bc4f97cc7493b80659e7c9b1a45c8d1511af568206ae84c72147b8cc6440b01ab37c8d74ada8c54b2f4c4aab9f4ccb6248159166390521a45f0207dc13b118bd11bcafd21267fb53c39beecb5665d9c1cc708e6862752865c8cb275ecc9a7e6a09a3066526e55784a8c059554d93c4f2651ff9c0669683db079ff6287d2e0f32ca7e05050bbff13ebe71e5b187281e60643c0bc9fa7aaae7e9a832bfbaeedf30adaf9f0e61575997ebd4b2e17f10339e1f1835d8299c9edf209b79fe68c2b9a3188f1b211c04f56d92e8f05e43b94197341cd469433cc8b09396070e577cb84af72b92cef4b9130da9b1e958f68d09ab80ba50d2086bd174b15e45b608b5a84d70a9020849ceb70b00c40983cc12adb41b09c89cdd084a1cd400a6a35039d5e531fad5204304313552dbfc268fe29013e0f310cb87e998cb84ce783d221f645898bc5e0f20015e166ce82a30478ab04832e000c4f3b7afd72d7c13bb519a82cf43510344ddb67d54dad1ac7ca86ae54c6b8e88b47928bdb4a1dfcd4bae76f83987efec30be718d87fe846c66a72a70180e7646858f2193a7dc22fe2b7b42fff994c94b84f5ae046e76fe745dd2a5b8d4d1de9322bba1df2697dd3defda817942f6d5728f9f1cd4fa7fc62d69dd673e05999fe5332e8a7b04c7537039fe106bf76e9f1c5a0e470837d584dd5200f198c793c427e1791e80b11d7f572d0b056702ac69d15a5972dc5410bd444ec89993e2c6a5bdf4796ace7004f266e8acdef3ec6103176ccc597eb77d8e823dd07f108707d31e320bb8abd6c62cc5375501e102a28a65eeff9d6284e3a8aa3c8122dddd41b2e1c737213a618ac2f837d578bb2471721ffcf65d753c23a44489a9cb21a7bfc2e59ce613a1bf313260eaebb2646cbccb1bdf2d92ef0e28e5ad8470847b6c9201486be5fe632f3203f0ec5344c880153fe1533c19c61307001df9c0c2acb6f0a8d6522eaa9bc0bf4432df6f1c3ae1fc156611bcd1940a", "00005252ac5253", 1, -707386742, "68d3480514577a4fc5e9011f1a3041a1622d35b8843e01a459c4fd4bf8b934f4"], + ["a7a408310224eb3470d239a910ec1557d06ca7645e80200f592b592f1b3ce2f0dd716466b60200000002ac00ea8a71fc78dfa411ee53409d80ced744300513bd3044ef6737a99085750446fa93b412d20300000005acac5363533e25d2b504b78ce80000000000095252ac5163ac006a656bbdd1040000000008536a51515300005168acf9030000000008515300ac52655152d8375b05000000000163ab8ac82302565fa3040000000000000000000000003808325bece096e7cab0237782ece191b94d339b125ed53c5922c27926650b97ad4ac42c8b445b992e5f9a626ab6abdf7b412580ae0872f807c2cee93db87e0abd05251b28acdf0feffa5d34c2ec61b42c0f090dbab1ceaa4f2c1c292db23909000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007eeb87979963e834890cd9d2c2e978eefaac1fd4ed8315518a9b790f4549c360b013e989d209007653db3ba3abf4bd5138fc06c6ebc21508c8cbe107970847d7a64108fdef2f52a95e26991418a2f33014c7b730aa16eeea621c0542efc173c38decc4f1c9b99f2c7fbdf417059b89dc0fe0c0c55cc5f3dff75e01bd80767dce03187e7f19df2661f8614a8103bf447c7af25621d18426f0f73a6cdbecb7b529ad032204b9caed231c45824208ec4d3cb954079c30f5d505a313f4de629d49360d240b0849dddd656b41bc73043bae454f0510026cf77b9d3b3b9d477672b49317025ac648e5440d21eadf55b50bb66a691f2f5b0c779e3ed24a5e2462332fc390727203145cffd5fc56c6d6d761b1a4aaf6d7964247c2cf960b25cbe2a185fa6161e8ce0306399b299e1a5ff896c766fed4f70044bbb72867d763a35a6e2b120f159d3b66031c6c149374cfcc41ec3b2863fda78a61f3a1766e6ead10e3fd7a86b2b1b5ef60020d52b63aa9470488e257ef0f4816d5def902cf5271a4360e13d35e570c126e420207f9ddbfaf263d10e09d19f7aa5ea9e1e27c33e15d4e04b4ae71fd63fe0393f4b26996532a549a1d241186bccc5f7811bc69cfbc67190514b84f651ce5ef8efbfc23a5662de699b77c12fd68ab2d06ccf8495ee3a459b85fa6c2de842ee32431d33cc3e2184238ecb5e6c6e5febc4674693cc3eab5c88a5ed3e74b28f5f399a365e8dd56cd9d55a86ca53506202dfc2fc49299deca6d0340a2c316d213541fad987acda0ded1696ad012156261dc5da89418fe5b099449fefb7526b15bddfca92578553a486c39dd55d4f82e9842d417d42c00d2ebc580c808d7153ef2847b86eb1439de4f22acf51f2c393f95c7b4ce8e3022e0cbdb48c637344e73188fbc068cd4713573daf346fcb67692857d0915959097fdeb5242cd4be79cf99ee79ab78bb38d85360da01203e5ea1e27f70d536272ce67ca571ecd6b186722c09d1598a62912ade95b01aaddcbd20d31980d553f98f54b94b1ad6b7a12f0aa0b6c82a156dba2d2cab19fc284ac0ee10fd0d8cc57fe5081aef61e98b7f7dcc99c34ed90f4163a5b855a3bedbb0f22691263f7a97ffc1ca2b0b4982defeae3b5771db4ad589c79ed2d4b9687d6f6c792ad4a110786879c9fca840315e1d5fb6151b24403232de49818b64ac05567d93a3f6a8d945b75b567e998733415884e80a094ecffeaa6d372b461f7f502cf7e1e0602f13c747d4597590e960689d1ae58dda0fde7ab28496545beb5d77af141fea7763b05c0453eb3c5e35960533fefb2c91c038977d7dd34f7023831c5d96552908b7bb9ce56597546676bda33ea154472107c83f7ac934c94ee3ea0220b7d2686cb3579a62547b83077cac48bd9d0de006f4ce1f02bac69f554c0e6574994f33e898f3d39e9365612b4e1aee09843fb8c129ab14c733b012a2399d908a2f747cecd0fad8698ba618699b214cdd68a9575d4427d0fc2a4ac529b4f55f38ff570fa8f488cb6396dfb82de807c1edc6b8dce9cf07039fd70e77ce94f70b737b82b76a6111a9e6991ee1589cb26d6142f5f0f9af426442b379fa8c6d94bbe6617ac98e2cd1d37876dfb872f318aa944c7ec26a43cb7cf0cb96322d9b59cccf368efe1efa72e2da63fcfbcb431cd93000d7e165f7158c3fb600a7f3fd8d562bd56168f3ffbca0a9943ddc6d73db9052904166883636155156816c2615279b49f7cfeeea19e5f83ffbf19f1948467d3f6e8ed125ea5c6277d65f53ea8615b1d64136f04c58a6911a99a6ecbd14c7807db32e1648c28e3265314db7080029b8137d6824afc850d6594f871f80ede439939f952436d26fd665be42d0baebaebc9f1a1a5b863d155f3c121c3804582003d06175515142e6c79d4e2c3ef6ed9933c52927a1a89710f874768c372615ada8c64ba4fd65c586a4541066316e2063bfea6fb1a8b38637fe13a439820e6b6a34b4cf6dfd6768e2d76fe22e74d13cca7971445171d88acdf739baf76fe7beaa759d07bb13e66151a574f56613c3c403c547afd718a26e4e21ca222ae3049b31f6d72823c48c83adfd57c25e2dd1a61097fa48f072424f0f03418c5afdb6ac4e242b4239150ca7ad6378595b1d366698baf030c40c9b6731af073b8dd153c075515ecfa5522e8c658f0093e11b17e4ee79b30f28c616ec83f92c6f6585f332f27525d760ba54b9ffa49be9257c42deb48bdcf06ad629642c97ba482ba45058927862d4dd3686a7af9d60c675e96e867fa9db9e71201368062e87400000000000000003f964401000000006f945b2965cabe5b6c26f981d3a331792dab695dd223b87debe8025a77112cd0a6793de542b4568b90b83d3953a7050c2cec682023a9c00f6983f65fec3fc8da419a03c408ce261d8f080292d2a9f519380796846f3fc88d886fea10f5108422000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000846e8f4b9d880a8630b1350eed082e0f853e2da150a5a85be58540472739e7f53abe7d7a6b8e8b3be3f70a60e1b6f93323b037aba20904f765fb19bec919840c71de47c0adf598a9ebd823bbfde5fb68cdc067050262b9680fc1a75c0748c9cee28efa711eeffb4d1bba1850b5b636bf93a354133912a64d0e60636f30cfe2502225ad38cae465cc2d477ecaea77a37e1ccdcfe6323c65f2956e5cabcd55959c40204ac4d6abffefeb842fed4896df0b6839af96b2b0ce6c0e7e5809ed024fffc460b07e07a37bed63d167fb43af313ab2f9cc2b72bfe685c09f33abac7f224a9c003bdfdc2d62cdcc944592a7d63d18f7a3abd017ab9649bb889ac48bb4847fd404c022aa03e93614f9b831f3453eab284a7bbc2eee4b6105bf484c6a311a9f32582f7032a4c91ef45d68c21d03d6e1f6185f94406bc6f1e46f7ec82be4ec0b4daa95c2e03076fb6d2dcc7fdd7b1ff4af83020d15eeb7279b932b3a4c3fac13267e8aef5ff021cd7815f162f920508c6bdfcc218c0d145ecc8fb17f7ca2bba339c757d46b1b202173cc3ba676bfc252d9a86107596433441977244a472b245df3728fe02ce8361a2eb9d3a894ae6b1da98b2bab8f87f6c948ee8ffa3883dfb3f0b80f1e2c97c826af22c41e8cc0e6db16240b9b6917d2951fa1c47ece9b4ddee970c9ae85ef847ffecc37dd3f72a1224fc834ad891957fc76b891a2dc99669c4f1d3d81ecd0772cda815a866f46f0d046837477a549226736a5ea8dafd5e06ae6f6ff08b0148d8b228efad3e636f1ae29595a90f3ab111f04790d69e0866ae79e4491d3ef25a8ad666ec23f888c91c3fdc8d1528b7d8cb27b335a878dae45bea6ec71e1d1d00ef5c65f56a8bd07dcc3842df2a74bc70525947bb8c41a022d14aba542a3d626c0deeaaa8281750e647f265cc175e0d20c6030820f176d511f4538f55ee42775794a0d09321e863067561a7f26f17b0008391f40d612b8c1da45d29747e29f8cf3b4f2802aeebd1f2e47d91872abfb81d9954b3fbe354a51a4ad3b765755dbae058d51795bca6ef01b9ce7de070c64bd113da71beab3a5354b4184badc98a385e083c2ebe67c1bf379a4ed03311a2f84b6404014b78e5021a06eb638cc70781994c1c77b483ab803a77a6083cbfde0405431837d83ebafef5d59f8f4ddffcdc13e0c3d601feb80ed4815697e6047129121368650770224d47eb6b13fddbbb2b725068acab4eb3cf26dc94bf5392a1948427769c1bddf35c2bf7533de575a964d75d8bf3007dcbb06b760d1b75d12cde094ad5b5878bbcf5607a9502986087f3915694a05c3cc35f1edde37f1d9d9f6adb42b8249c2aebf7571842d0f3ca1144cadbbf1b6138f1670139c78f6b165432afccef6da255785b8022199c7a600470d43837e104441dc22c16752bd926ff117674bb44ee6c67ec36387f6053df4df6cb55fed08e07cb0b98d94a71cb4e16ae6b11d5c9e95aa0ed089d72c981c67ae54d6e75f2931c2aabdd9dbcc605e44360c10d4fd0104f365fe87bb20866719d2b080d3022a4aab5bdd1956f3173e04a32750121feb72c95037099d10cd11c5da24d6c973feace9ddf7ed1d72d13625c5efacdc52f4c979de2246cadd860df58aa5aab65001261a5ce3e3057fdfa1714f8ad62083a6f7f9a90291a7dce5b1d0882d804c930339c791f95259be92f5eaf4d83ce201458e72826959dc995659f9c7bb546fb1551cd6ed79f798759734bbe252aef1433c634aba15b9bf44278d8861b255dfeebff8e86f88cdfd5adb32bfde9e669f2b31f078d67ec21df4a92b5b1f91081bf7892bbde43a15cc544a69e39c58749d98950d9a84a2224393e559e937cb145d440ebc61fc04f29271ca9d7a2492c7916201e321031ea0c300e2f2e31f51eeabe28a2f2d8fa744dd3cce81ef37c4ca2e7168098a8b1b4935dd2d7e2ab52f6e754c30717f1e5df020eb5c8c89ae37c0aa9847e97028de948ed090b046a6298dabb3c21914646f1fcfe57d63fb7997f5a05c814e4d3ed978445b888462ec014841f14b34f5b7f33a2291afcd536916776e647a5b96cae6e0262bcd81f6d6ff075dd2d8749b5d4d1783e9631197e7076b27958a4ec62825d13a1b352767c5744cfc8fa59e8cc633a84d79865af73b450e33af343e1e16fc84966a7189f65a4a7058a79035ab926e035b1528752f259b1ca0c89a5cb9934cc8505998164f98dc26d69156d8629e86026007cab4ca5e4849c42f80475dbfeedc5eaa53fe791991a29409d14a1b4c682e7e4ac75ad65b4765a0bb6f3b423ffebdbded603385d5a83f661db31df0e0282f1177e38b8fe2c7b87e8fb59a94a096c5640163be342b9852cfcc8befa407cd1936c696eb560146c97329962b4192eca56ed24235a0e0931024700da72f908bf9e0646a53756d4a7b3c305", "6a51", 1, -1644351662, "71f68734362eb22f0ec786bdd70806653e237105db6c42a0aaf527baf58f6772"], + ["4587cc210412522bb6f739c47970e6dd69f961654cdc6ff6a336bcef86ab9058d2874eaacc01000000025253ffffffff6706d1b5ba4f90fbebe568f7e7849360821e6a012ed991f377dc0d9da57096b6000000000565ac6552ac0e3bdd43307d1507e563238ca8cbde145fab533c5ea8e3945ee6e7a6388191cba8f83538000000000465516551ffffffff7d0516739f6dea3e7e0ff7b899b782502c3ca0d4c520592ccffb75a3661232000300000006acac6a5152651e1ae3a502b6e6ef010000000003516a517a8c8101000000000865526363515100510000000000", "5265516aac6a6353", 1, -488915631, "cb945917d6dfb68be69f22214ae053e039e5ccef3a2ce8c3b05daa7d27817c37"], + ["4feb672501c69f8d1d704f3af0a86878c2f3f4550cd3a238ed534afea34a8a368e0caf151d01000000055365acac004741afb001ff63e00500000000086a6a63636363ac5100000000010000000000000000c655370400000000535e95df7213d68af0816c00eb305da587ab8868fb2aad18b367d70b9f25b370b7c5107ae4fdc9b4294f1b430418f5ae7ecfc63117495581a8e13d4b1b1d18da9ef530daeed31e9c58727ded891680fc3c386c977a102b4a4a635fb38dec68aa00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af214c680007b6fe91c63a196c493977d2f9511c62b18a359ebdb11465d82b85e6cbcd843853d24413e41249eedf8021e6988eb12dcafe7711934cc65821481ad4721e3b2d3ab5ac9480048099a4ecb80034d06b60cdbb6904304ada867d0c8e66fa41db026c7e651299ed2ed559e40e8f227c0fa4ac51894804e8db0385e537021cfd13167bcac443fed0897cd09a594eb0267cfeb718a6870694d3a137610e2202110237b2d60ec3584db5605a5b93e9c79b7d7d443464c8f833e291f658421a340b06796cf8d46ed102d285bf7be0ef738c90629082d0b8269b44e52280dff88e0f44e29390006eb5a3643747753291e6c83ea9bd6b2d4c9bf0903d26a36ac0248a022b1c021c04e22ee2fd5118a7f0b6e20eec2a6ebe2c47e1f04e6015c97daaf1ab02248ccde7e46fa59bf4e5620b381128f1bbeff1830d7b95c902c09c7d7be2921402187c0d758d95bf63b2f9ab7e3b3dbac50d0d0c45441b6055ceecd8fc0b9ac476030c6fad19832a9c3e9f1e034f01f1b2af3caa098fafbecf41aff55240005ebb95030c023f7046363e67c38ffe8af2597e7aea447a4f8da60ef6e25237357f17eadf83041dd7a4348f92aaa55bc091e8ab9e07a0926bd84de46420f71608fb5e930178abe982006949319624a65671e342eeccdf597ef90bdef85acee6d4faa9549745cc29654aca3aee44dcd5b1e0486ecb7ad23394733e2945060db20333da2a47e75b54c57a3d7d491470c1738043a6ee5076e26bff62a3990adb859a68dc2e60456e526e75ee88e01725c4ce6258ac0b60b77c174c4408fc35ea431b49e369083c309a8f10e1a0afec9a1d8796f999dc3fad5bb7e58b0db91ea5269006ef6d124950448aac3576214c951e9113f970615550e25071451b6da30970bad7686bc0dd47b23d3251fdcd0adbdcf14a5516890c3fde56e5e50dfa9d28ad7c09f5dceea4da9e17eb03b894474e4b078e15c6ea3f0f8b861e337b3ba71b2ed15f17524ae4b97f7f4b750c87859bc8412993fec644ef51480ccdb96ba3c5f1002bb043b6b870f5ca01cb4a5b4b8ac51892089bde2deb5792e4b8c11517966c7e84dd4a2a4f8d165f85bc2181e17f35118b6db6134af06d351331ed36a3aa9e3a580c18a1b51f2ec478acbd1912bf3fca5e13eaac12212b244667b8dc93cfdc5d7b42d5d44a1348da3145e6e48412d2c6f123bfde5069843f4878e9a3eeae2b78f130cfd58af4fc24fcb5bbb44bf47fa80f0077921d13ec3d29b3a9967bff09385341edb2e5449caa6c093dc6e5d4085cbe2721d7e6728b7fc4e6334834ddd534c8f3341493f4530eaab37feddb0bdcdfec472078c92adbb75644836283ef6514d9695ff0a61ba1e296dda28d79558b6b41918bd7610b9a6f27909d206a6fe4854aee3c9a21b11336ca20ed836b17db0124660dbcf66537ad7613670a7e6a16caddc2732e9cb6eac305445ab0c961f3b98a2147cda394d938032333368a9cfab8b01cc8f61ee174c8ab14958b870fba174c5081897b5b13bf82160e2e36a4d45450c82f6d3726b45f317ebb6b2675d4ad32beef00475dabc75ede48e474afb9175473266e44023fb71d62beb46cd87c32c64cb5a24c62901d5610fb973bbc21dfd78ff735ba70540e00f2e13a16a14b7cf1f408019623d49c4df9118b0ced6445e5e42ba8b8f243de98255cbf688ee285e9e384ab6c8a070aa37c81eefa426a4f03aa4cbdf953c92674354a29e0496921cf9be3ca864f3a55978a7d4038859ccd786de8e45f4aa7e88756d9a2d7a15a867fb99368bbe9f221c177746410d444e6b3f21ca867b03b1745f9c374f7426993f55f4647143d499b5b266e65fb4d047de126409e8319314c1a3b1f0a4d0f9bd69e35a66952de06e06b726078b94f3683d8b14cd60714a0eadf5a2f59a867175543065fb7ed128002b594d97d04049ff7231770afd1dbe741c57cc9731ff8de4127e5521281e64f2d6b3f25a1b22539c252e44fbc1df2eb6c35dcfc860e4e8155fbcb61e8c8b2f20ca9f3bc1b4d3bc28c5a46a4442efd805c092efec75ab908acefb4954462c8f1b7c579fbca8da17e51a6aaa6a50b42225252b2158360b62f419f9f079cc1483b9fe9a63755aed641705d858e7c9a2563efdda03670957348899b30ef3e921c5d4c021e0a501a5012c21f39b303149b9cf09c52468645cffe43a6dea997400f695575ea95dfc439adaf7d3eb65a129d2c0133fbdae3fcfc6a6e75c4e9901e8df262a84cc3c8686f462a30e368e8919705c02534d7da5be6456143ac7569faf7ab62f38c9ba6132204122bf36aff29c8a79c393af4b1d46ac84af2a76a52f5b2ead4266657565c8802f05368f0086b63b0782714ac2de4f033824dc6c047792acdeebefcacba4eae2bdfe797558230441ed072206c78e6400d33aa6727729d04", "650052536500526a", 0, -1211196861, "e1334257290d0d2efc2a56b9ec22633b60e47d3ca16d90093841ea5ae5e366d7"], + ["030000807082c40303a31f109845908705b9801b3a6dbb0daf3dab90d6268acaf2327b76b309050d0b03000000076300536a6a516afffffffff25ab15f4056764195de8ef52619aaf84659b25ab61e3dc80e651257aa9f12120300000006ac65536a6a65ffffffffa9b5a5fff80118585722f6b72108a3c563234da245f9cd96648635d12a8e05d302000000015251a8437401b07f8702000000000365005300000000754e166c018dc23400000000000000000000000000967d919e02427aad7bc426586bbbe671b04b2a85da8fe23b3de67eaaac49f722d206248279fe0d6617724111a6b1bbe148f71d5d4ea72e10c13de3988a1c6d41d2e226a6e5b52cb2a2d07eafd0bbdbf71eed4c3c654168be91de5f6c4e7dbaea00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ca50855c227122f214a0685d530e0302d079f6fb5c3f9f3d6b4460cb9ed92ea373d2152f9566e6b847879a0ae50e6fc9a9535b5a3a60cd24eea36d2a1239074e92a9c6cf4528b322c6467055e13cf35df7b9c3ff7856da8fbb7e2ffea0e7fe96ca73804a531d116339dad286203474d987212e4185c1d9290ddec26beada5a03022081bda3228778fbe4aafca880f6cfc4154b993c018111841a6a889a5bbdca9d0303b3039f2e3dbdd04148304da7758ce26dfdaf1ea28b412880ba344b411f93ad0b047563d7c5a2333611f3d97d309e4d9f19c89c5140d35a65762482d25efd755d5c7d3b838f23ffce9828c0fa0271810698d68b7257de5af777ff85fa1abd6c15022e7b41d94f21edf00528322c8f3ffae69876b49c6788a47140f6b989a223dfae03276dfb03c2487a6bd0db602125d5f599a89c3ab13621c6070960566fd7277ebc02191cc2ebe59339d167483297ad91e9f6e7e36300e900b5b38a38e6d5f7ccf7d4020d2b1f5dd189f93d6be44fec8cd15f548cf05de5a7e35e2b15c4f45fcddb70ca031c6d916e9b292d619e76837781d67549f3e7b5ce825360b370e6b7e7852bd1a23caf724b3572682f121603708d0d48d33df344209b08e76fbe967870cf3a250225af7912ef9b13ca5493cfc2ec9d25dbeee78d8b4f0e554ca2e7b6b239be38d4bee43f403a1941e7d1094b95b4f2db9f37dacfdd80b3d41d11cf596d329606a97d6533d70797199ffd5c08d25739089f9bb8290f0a126b1973a558dff473871ec107edaea421d507bdadc0452089520851ce8bf5d9c3a13c9a5b810541a4d00dc45b0baf7c30e7ed26557d613e2ef234a99bce73e160652b4ab9fd2a8f17c644b4b98c6a69ba8e1199f9463cf13e5a8e1e2652dffc48806a3c2aa665116ad0913aaa1f10801a86afa12704375e76e80d0beba35c2e848f8e3277403a606e65d02361db395275b3245fe8822617affa52fa9fc1baa8d4073d754d1af1899936898ccc074f597ef0d6d6362aa4e43e09ac9af1d0254107133d485b8dc4c8d499184cc991180d56c5960d05699c4ee9354227790cdd93378f17eb3667553574b78ddd4241c0c9109dff1f07d5db4d63fb909eebc896865892a67867962ee155c1444196df33212595a81aebd7f929d5ec57c83737bbf6070bcc7c0644cbd73f082344348385a234f2ddce35bc9342232ce029e34cc3756c3ff7e7c2fa82900923e2914dc90269781961de1f8bc10be6edffe3e005e2040907a559cb00c87c514b47be59086b66badd7e88cce07039501b51a4ee2391cb6fa84654c04127faedd33f615a8c8dbe17545a59a68c97319e02bc62920e5fed8d82ceef0892bd755d8930ec23454e942dbef93643829e524e22d149d14f8f95ac01aad1bbcfdd816b836b85743846e9ded579666c4f6ed9812c6d8f062bd9a92d2d67ac2f1e524eab17178556fcd2903b5befbfd7ed95fbf8e38c7cdb6eead7b263eada12e6f0021220575bc6f27816662acc71bf189fa8a1205d3b1b2b7ec8b7c749d594a7448ef0373f3da2578ac398a6eae63617bbf17e51b8b9652d6563c73c89ef89ad42a59f1c309e04cdb0c235652a5f770b578fb9714ac32233a274bcdb188b8c0b15be5dcbcf816ae0828a2ec0695685c25b07728094159ec9e3921e23d64ef0a840ecec122de3473722ebec195ffb4e50a5163bc012d5154fadb61cde68eff121965283938ef40273ad3a0b9a035e6d3826228a6a1b3c936f8f105ea754b97d20fd02b591b737450740e0b2de88332835599f7b3a83c039087a403e39b495b5c70dd649dc226b6b9f9807d00f4c88438a15a3f84c3c3d5e53ab0da792738a666ec88f73befbabd9ad0dedf11163363e12002e3d5563cc173f4cd24b0bdfbef1a058f355bfad361abe284cef5a8a22c062d041df970ccc9fdffd85718342b90d2663ba08d6336bdd6f38381a6b1e7cf058d66d66e586ec7a799f96b0788227b9f979bb0fa4c70847deae282ed32311afddd7143eed5d7c26a3a784c13f022365915400431f2620fdfbba1f03854af1eaf6139a295a9cb1b0ed8cc7b47930fceb50801740e2a5e95848dce66ed6b16a468952ab871afe9dee5a9986a8ef03698a5c2c8458d899ad41a7f0bceb3260caf4430a0c325fc276095cd97e7a146ce94b2df5cdf51d5169901aaa4c45a0a13cfceedd1b0594db496c8ec81afe43aa796980551986d11b54c0a3da7c344341f65deb308ac84595a4ef8a574bca69650a0d4b35e740d70c38e700440b3775fb07f9cd5a3d5434f5f3737a09ac7b1cff5ed5e5cc1978d7b71c67d620e256437ae90b46bca1751f0e7ff6674f113e37da183e8bbb997b2933fe0c1e2a39f25f5e2265d868e5bbbcbc86ca1f024beb26033f392c2a6782b22c3006ad9272fdbc2ec80d44c65293da846207", "515263ac655165006a", 2, -809004528, "51ce68a5beb4ba1b639668301fae2cd88e0c58e44d7d70f5dce4e5912fbcbd19"], + ["030000807082c4030339a6b040025f3ff147a8d3bc21b11934daee2e85a7577856dff7429ddfc4883f000000000151ffffffff2f87b891ce87a3f7460552611a000fa7137ede6a5e8fe9499cf27158445ef33600000000085163650063ac5363ffffffffee5ab89613f59821302df260ddc0b56c614b2110e0bf1f748d0be0b09a9ad0c102000000055265ac65537a07738d02d373ce0000000000075352636a6a6563ac7cc40300000000026a65d2a0a256ada04f90031f619a00000000000000000000000000c90480dff57bde8fc2b8ac082097977730feb8f4f8d94e10c10915b306fe9aaf27a21da352900dad176877a337fe35e311254179738cb4fc9e55938ffe47b335f8ebe640bd6811e2f17c0df33204d89a93222c656894e0500aaebf93040af1ce000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004ecbb7279adb4f4e0cb669698133c275d69ffef9c758b9b12101e888ec0c3dd4c99ad374e9871c8321e76118e0a460422924bd09104272807fb0b83dbcd9959f3baf16e439f65c9928b4b1e4352d2b3e273e37ecd6496a8f115e2f47ab0af5139b994fe749c891ec146ead70d9856daa7f27a6c649b81fdbba00c86d3de1fdcb03187af48ba1c9e6f586bdd3bbbf48dc0bb50422176baf21a61924319057548fcc031da4f2b63ce0e5f8be2e42b6b0a156af939c4465b2a2bbd5160d38de81a441160a082003f2c0027a9a53f51fb117173ba1776e4c10094651b3cd92fa2f2befdfb934bf86714a4bc36ae0f1d35118c5ae9bd0efed40d627857e24f705b94a1fad9c0210979f5cbbf173fb83e5f8a5cedc6bc388c4d406e41eeccf81a8ba4d20e289e5021789bd544c6b56c06c7702b502a2ed8cfccde971679060f16acc9f19597ace79021794add067f1f07aef2a925f72effa198cc375b99ca3122dccbb68b8ad4d295903179b20beb8f1548ede2a7d93760ed6c80f9c56a68112af41374cb82b28e58c83032204a8360d1bd262b9928d9cadaa17a4d36a45055de9b6a10053268c75bce88769b2ab39f2a87d1740770b4d8c7ee32cb29ba21b13f141af51cffd0576711c65cc58b8c4c88da4dc99cb5360f05caef6ee295aabb852c901781a01a14c8393b1a9d65ee818c8c36d939cae9f6879a2dd7c1492fc9d2950c76241d72986fd076ff4cca4e8d8b7a96a6b9db5273b5476905f1de3e72b4db8cde2d6c9df803f1befd870405955ee86e76a5540893db660bd3f985e69beff98a0eb304a1cf813d455a5ec408c0fe016bc752afd02bd41f1f62ca829f984ff4876b50f45baf5cf2db6e77dfe262e57681b7b489000f37248a6699f389e7297d978cdfc0b7e0fbd3c735cf0356ec99a1e1f144d3b900a70537692b3025af6f0868ab7813a36c4286d1646edf7198e260abfb2e707f877e64435e6b060141317b905d335a6ee1b5e6b948c1cf7eec5faa1d7c9b31842b9f59d05ba35119a34b1c1596717447a62fad985a07dcfe64cb3a7e1aaf046f8b5a3f36213c0fb22939c2f51cbbebd3611733e46f28e7ceccfa033d5adf76029b86ab110846459739988019c8b3c4c8f7ec449bb88851aa9bdb887b98b42d1bf286942ae63632c1e58953765eb62ee43bb03399615c89620a0c683cc2ff94e796c866c3981f9dd07dc31c8b7374b460098b955715c7ddbb93fe6a2887fc3aa40220a9a42b8a33b51bb24bc46bc6a19a0ff14e0e69efcabfbab18d9c6d79ec2badae2ba7c8fabe85b7cffdeb904843ed2820b7afa04facb8b3c1788dee36f6e0f6fb85f68353829edc5b0898731a279cfdaed3864bb54768903116c9566632ec05e678e2bba42e700af03c3e3793ac7bdbde4424d201d491763b47a8c896d6aea27ced9ca8b3ffee7abff0f676054ea7265772cd780f37fece6451923d3a6a7a7783109b0b7beb6d02b1eb725b4dc2fb1ffcecbdab8ab16aeee2d1d464e760075b47b3df648d56c19dca9da6bdf134e965a2af76b3506be8bbd19418bfa8cf6678e4409726770eceac16f9d4ff199cad809051ef505a89051a634d2f757001bbd87120725bd568d14da73c4a74aca81791886bf82af0faeda628c27631fd1f31cf6c13995071567b0a0d4f8ac4a4b9f5e756d58cf125065a421a4a23ccb4773cf86aa59551144b9da1c8771c4c094ac1bb5548bc9c25020a0a97096a0cd9ec87b58d1619a40960a461b710fd78d481139a1c89f7f2c9c75d9b005e65cddf3c666f155bc6f2797324343ab988378163e638aa75930b5f8de09b43cca727af67617369be6d73bd6e3c4b2e45f06f824d228f6239c3d78664332d0f8ac791e94713dc1f0f72fa0e5bc88299964f2422b5d1a368dcb86a33a38a8198d5ec8c6521621914b21ec5d56152aac1a4ccb6d551a74daf047c511dea8789b1f0361591a7bece8b8e92278819b25bcc6f28ceef7347a5d32ab8b45dc8d9da17c8e141bbb0b9a44f2260006f5126c3483ef3466a0a4efc2238b32bd2cbc1c202e704813ebe465a84c339248e3da4eb4ad37bfbc4d25a6d98b4f0b1109ecb4e31bb7beda934233dc1904873a9e4cf1fb70544af653fc8b957573b77429c8f863880cbb30bea39fdbd45719c4881940715b4bba184edb10ee374283436e6fd0bb9efe631866a0a1d166dffb4fa4666a33579fb513095fa1c4ec46bf00e1b0159d5debc8be5562996ad8f471076193996972dc4a933900b312963478b7cbf4286eeb00040231e65d42698ed2ce4ba52e9802000000000000000000000000d9f7d40fcfa3952f0531fc0359aa131d8b3138c040ea215259f823301d0de16168fa4850656237c529c9f3220fbbcc0ed5139c947bf2407ef3f0ffec176a84bccf76ef91ba87689798671d1c36765f75f5ca7443acd329294428c0d2dd84a1360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022781a84f77559b8ff76c35cde40b42055df6c3791d20365c9d4e8a30797303a7bb33d83afdd651f67f08c1672ef8817decbc1dc3a71da1b48b6f82e2173b7d3252162905dbf5a1a3eed77a27adc69abb53123c343a14ad81de91af6c7a644d21afe26771d5feec641c606c3b4604f44670d836685f580e470ee68ccd11d2476020d67d5191c75d4acc8a1d6712cfee832b060dafab84c4390c313900a91c306ef030bba1cc5042774659b9b2bfa884f50821e6cb4e481dd551537d699c0de8aacd20b008c8c98790e39e11a3e0f382499f360a60c3083a018c3a08c5982f1ffa2c57da32b7153714403facf25ba44391b6e0bf8f14de9375756c26a49fadf350aa108020c2f2de3338543c6c6460a3e994da04ab2f3b61f82cc0f9cedca33867f9571c30230250a0f1c42923b0394f22fe9a143c9cddc297a561b219c0f382c4d748d24f5020d035347039a50bd0393b4097d89bef1284d933ccd487864144e49eed78735c503121deb32a46d4b672642b1bfee43a55d10e60a98e301caa68e49aaa4e565d451021981cbb6dc5cf5ab4fa36053ffd33b9f12998354d57cee617a419729f5d2b644892c78816ee2e1e6344fd5ffd8e64bd441eb976a834f56f18e9f202c0fb3e588e76970bad7d87ccb307d5bbb1709e536d52dbbb0ec56db04661b3777637b07eb71d73fe662c24b91d2f52070ab491702fb5e0adddfb0cfe1bad878a8be5fe77ffa4ebcbb7807546083e63fa8b546324299cd3cc445cbba135fc3d7936c126d125645e845e1a517168401fa2cbc6145f396aeae353820fab43ddd13e521449e3468b2551d457043904c00dbcbda7a632c69c306ceebcc0db377af78a15c23c2e68ca8f9cb3e33c9c9aacd4c197382a9acaa14af413ab9ac793c1e96367376c1ed77d2a1da566d6a16abededf122f3622d9d78b05f476684926ec3dd6113a40a54fcfd7924a4078576e66f6fe63ebb5dd5966eec2737c53511fb0329feb9636c6f89507909e6f7cb6aa7613fe0632e45d2a395deb8dc5df8ffd089424dae2c57536c9659acc0fa0835cf0556655716ad5799f9d02c940b28868a028bf4236ea3a5242cca7481ef6bff2231d0828d68c050526b2ebcef2d3d82d29fe78c962a356e24b63f3443bdc1057c230104b4033ca5e647a55b2a88c5be27f4c5b79c4a8446296102aa80e036f810fbea75e6eca38fe987ed57751589dc465fc75351011eb4130c22ad51c8d4c763e0fe7fd080a3fb86cd1872d3533fea3c1f5f8ee6a7e27bcad01f6b563d090aac392b606ec723aa96b13e163cca498d15f22af2f190233a5c09f68323c3662337bd89c4f3e8f88f6d03e3f8ef0a804fb8fb1b28e467154a6ec38119a21aff166da018ba719c3ea5de456bede475c145ea979b5efd99ce8d23fa931f800e4f7c4536a7b3e82a1f6157f80171ec3a569a83ddc2504f52ecc6242f2d4aeecb0bb364428a9529fd441d362f75d7bcbaa2a2bf56948be06f679f5dade7d87910f99acc3d978f4f5c2c4f49e230c17f9b95779057094fc1220908bfcfbc19a0ac5ce7a6712b06c5a01901b5992a800c849be1c31ff4833907fb8f0a3a5a685b7e98c228021e36a6f235504214b76c1105f5b2badfe87d5972af38f0be9aeac76f8051d605eab09f2b8d5cc6d2e551c4a72eeeb45d701b567b4607c946dc0f03c18f23f6c6f7a36597267c46c2fa9d75885f5881ccab414c8411e87c3c0af7d3a0a4e214166ac9d6233e19294f199dddc6474bad4d2a13675b861ba59d981720009d38edecff7a8ff2bed58c91f794de6af2f8bd1a16c9a16aed70a6ff7d38157eceb380b1db362cc496c93059f687cd9afb46e8e10d69517165a542c55457dd796f84beb69222d8eabac9c980bec0c6e5cc7d7a62bd013597973e043b33c7724b26134dc6e910d29b4f4118d538f7f0a28c6951c03f1ff4eef8fac37f63e730276fe2eaa98be2ecbdc04465d00f4bd769d41e587704aa63835c7f84b2f10832c95d2d2154d6b25decfef1a76776a101e556c56d6b70e35b98e7c26024f8fd8be3a7337d340d16cad09c5ae23efba3d78e5f5a066071b5e595b32562db268e92e4f618c5d14ae564fb98ad8e8f5ea13d83b22b9dab507f3c3a67dc439e3ce316549460d3c702f9d933ffd0676ff89b2e4350635d2a43058fd43aacc6c455d135b71c61bc6eabc10b490f5c18f1ff62fdfe5af616788745f1e5e66beae82db80404922e16c34a2c26defa00ba7607de22e71a52770263c0b8d88a84af507c09a9248a5fb93b9c95b31642d3e80a95f01e03000000000000000000000000dd284cc57258dbf2d62a1e01967c9691422579619995bb33c7ed17383a8211f3cff236f25160e99f6d55d3faa77677fcfb5ed45bc946fbae983f3b885d90f7b5ed24b6fb44b8a87a888deef978cfb4c46ab75b2273a99ac8da3a57312748b5f800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ad2ab502466da6f9a7660f4d29d180036abe5af3be2e3aa673dd0fd1304a65e226661d1560ee00b11b4198ed711641f0cbee031bea40c9df0dcb03f8f3b428fd330b0c844cf173d7b1f7955c7e1138fd3cd7b805301efabed670f67850200b512614dc4de2e3562d07ba916625206cd1d76b48a6b72365aa372ad243f470b649032e80f78fdd601591b8c52292d9e0734c8bce14e7b8564f58a6027b4290d1ea1a0211c5dbaabe21b707b292119a3e458ef7f0d8c42df6823dc08ba971c26cbf31e50a00632ae684a1e25b62ffa4f755fdc13a93c2da93b1104ecda1d147f9d14a5117721e6e0395c6e6b7b3307328f4c8681ef28819d85fdb3644fbd2f1987a711abe031e94f6d3145676674e0ef45e84912f775b9e06c41559fa5aab93f9a3c6e448df021a04700d63af854c299c2ab9605b8c4f097d358fbc5f9adb722bd18fc5c7edff021c838bd487df60e9a656641b08d3734209f51e40e2e85a9f5d5dd65533e3c8e5022f702eead3f3cb8038decff321b608af54e9827ced16d523ae8d7e1c084048d4030106508c591a12e9ff5cecc287ddbf824f4311e0f50c074f38ed4c7ae191974c79e64062ef561a2af8e093b1374c2ac53716d6c33c076567fd8ab42fab21563b19ec3452f3a717b5182dd71c6f5e334a8bfb56f741cae93ec3b1a3dd1e964e549e8d3966c2725fe431fbd62b332be4ff2c2a5daff16bb2a4328ab87e3a8314fc918da80a32b631b21e77c9ef20fea0f016fdd79e5d91a197163940cf4342cb0929423ef40438e5aba912b1ff656a5ce9f41033158c73d2c36f3659354bf9879efbe78961af27b18fbf446275b6cdd66da1a67e6cf8323aa388eba1fe7e1249bc89b9fae6902aac667635794454a1ad8b19456c4a2cd530ad1e1bebaed44c38d15149d207411ff44f5159874f4f0bb6f772f952c84fe6859d0db08b39c92af381390c038894858f449a9e07253a12b20a9103b3183adceaff540cc0525c45796f12b10e861c4cd3ac9c7287c87796dc7fbdac3d6c56e6a23248b62f42b59282d441d3907590b06eb0a1914e681bd8477c263d503bf64edfcdc441960ce75ec942add3c254622cb66b90e8ce56ad41ab1ef7b7e561cfc4b5f5c31d9077ec8954332872ee18c4713212db39e861962cecc96ff88793af550ac7f94e6bb12dbaf10b71895fb66bdba6a247b015244d7739e29ab41566ea1b66b527bde850a3819a3ee15aa65fa5906fe75910e9262da92b0477844f5378fdf133441dc5156103a33e35aa839ac8e4bc2f6f216f774c00d6dbfb7b0b903185af9cdc2fb84a5ca5b316a09a7a3d2ebb444dde8859e793e1a2bf0bff71b68f8c3dd0beace4a9e745b25a2ca5bbdd5fd754cd4552d2014b0a43c64155fc99617482b410008fd87ee81b943caf8589c134eec91f463529514f7911c296a27f3880c16da3021de2d272af70676025b598ccac4bd66ec5d4ac86e9a8f7ebcf5bbfe8de440064e95a3218b5fdc22dbc040948033d5efd4c570c4db47899a62d108a1c5b4de9bcc884e9c4cf62289b226b0d0f5507d1b0bfb87be955a806139df54d4a243a51cf198a743e3f841c706d91dbe71007c9ff581aaffc0ac52d0a75c915c451c1e439b86989e7df3ac51da5b8fd248de0d4dea499fa5dcc76a82741b10b2d87331b396d27334524a9c3ae116e6addcc44716b015a2f70cefaf70837d644e3b49f2708c354d02ad91b18d32ce47c894bcb0d5d2d2da4d9cb5f57f35c4166e04a1e6b35c3d69e3d284c052128ae759e43f7c7b7314018af628123ba406ffacf591a3122d7e1665d1139833c61bdeb4412e72d23b24730fa74611a31751cb4d712c7e77f47456690c648f7db7734440666ba8d61af9e9bebed6b7961a8abc899b33f0be5c5dcb6705114d8f66a17de62f37098e99985970587917bfecfa848c13da43ed5ec5580e940cf0e0c71807ee1684d3cf08282aad57adb346e7488f18bb3c5b3aeaf51fe71dbd0d372c548eb1944d50f7bfddff53387934502a45b5467d49a195ff0605e7e41461a4e64e4433d41a5abfffd9e33d07a84d3304d9bbe90631094644c7b2dc74431a2524b8febb15d74183eb23289a5d155c60a13c686fc8e1421377db5aedd3afd3efc155fbf5b29dafef3b89641894e4999f46df4aadbc831abc73553dd3b553145967f38efdf293a195a7888acf8fd25751d14075215b64c45db112ee1971101e0cbaa9ec1d821716dd5c38a21ddfc87535acad96aedbd36d49be77d7255ab94d35b5728e9f0093907c63c134ea1c9714367cb0c3e714c67b38a59f47c63695019f8fe79c8f31516b9e1727c7f38aa3446ccfc757f5d5234c29470253c90b13351c25ce12aa1d44e76f964a5e6854b21f6ecfce8a45bcfacbed43f83dd0082cbdb9c063791d574d5f553575a8a0dcfd46303", "6aac53ac530000", 0, -2009538034, "d72dd7282bfd4a8ab9adf78c6fd2c3063ed035c49c7ecb3c4d0677df1adc57d7"], + ["030000807082c403017bbe240a1e04a8abc3395b2ab8a4c1f1d07e9157f0c784ecde5f957ebba462f40200000000ffffffff02aa766c0000000000066a00acacac526b8a3e00000000000600636a530063bf4480db2c62a3330204e3d801000000000000000000000000f41bfff7cb1cd95da43cd0088fecf6addd372a870bea4704234baf30518429728bc78d9882bddf240945bbd6251271c0670d58332253b71b8040c0587c3353a246a121a3b9c593c6f5a3d864d54e5c306da7e4a118fda7e0a09a2980a9100e8500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c6a40d5b990a7bd668ac817b0d3600dcc7744381232238371d0a71f12fee92e5b3c2628dd617092952f89de8d96711dc64256c3c73ed8134cff31966c9b24f1d70b2887fd8df02a69ebb755898e8f2ff0f06b6181c02b24ce7f9376feb0329aa6c2e5e6163f6573c2d5f49cfaf7ad2a8dd9d53665d9da93c4b847dbe7b58e8fb031622e838bf3a236898e583edbddba498b4114b7a1c897620abff5c497b474d02032e5010f0d682fc03ad95c4f5574354a9c4125816cbd0505097b6f0f2462ca5280a07e2dd2e87d853405e9bee90227751b395a651f9d6421e69eddb989f65edbaa68a0376e12d747bfa3be98937592db137f9db4a6a40449813c051c1ff41c51563021a2902084e68b7c8cafde2da0a342714d636d4210d77e95d0b1ddfd52c9c5a64022a7ef4eb0fdec3b3a8f0bc49d6f8f2ff1eff1a9b00293efe3e1fb4f7d117cc730309aadcbb06d0fda934a365b0106cf221ee08f70435f793b6f18c3e221d4d5b1c021a127d1f68052725b4a6cc2b4d21f08814fea48a4ab162e664167585feaa5d85030490e41f3f5509672a1b6e8088d0a1d18dda54acc4a4b124f3dd636768b296b4df2edaa7c0c726bdf0b7a07022d211b09201c5a82e36f5a58e35608fccd6e4c050d1a4d126680c865f36b3f488b9c837d736f344386bbb977e9025fd67006658f682113602218805c1dfdef537f32e54edddd74b8f331114329943452cbdcc506b0e224e8035df4e9d00005aa10162b6cca5b12003bcfabf3f4436498641a240a89ffe9066e81716b4705c44986ede82c2aae29d416bda75d00a4fd66f9580e215c9af07f5b15cce48bc55ff14b574ad6d39f9b2a3fed39a05317e7c94ec6ae2dbe1ac4f9b158c5a7afe6896421812e25545196b9bb228bd740b2037514ce1e5ff171a59888204fa42009a4c5f3967dd5f2fbe3a2e1743c18d0d484800cc458dda256a067b34680ab952fb4f08b78044f216830f3af8fb0ab64c7c7dfbe9fe7f22af5172d7bcd35e925587e17d874d87c322337130bc6d31a3f43ff100da350148f415679520ed830b05400e2963755c4b5e18755363a52565ef3bef083b593d9f18faf06d6aca991cf2607b37c7431ef6722dd827961b6efdc9d399b5062d27220832a89c8aa44b8cf7dfc04a99d4dd330743f3db170ff30ebecfde8c9262ad0bf9dce5c6db8d001ecb7272a2d3ddf4cb793b6781d1470d74a4c9623025fcf0f0692021d581b853980724a8881575c9dbefec5e4ee55f19799835a9d444b76692a8b4f7779778c75e556eab8880f5d0220b52b7fc70f08b84fedec1b1cde7ba76c2b5dfa4bc2cd814351c5f01b729ceb0271905c71e06deba4bff4125d39357bde5b6fe15d9f2e9b6e464a94bc6c4fe388eef352e1231bab3fb3c2d939005afe6abba34e402aba99669f7f90572daa85d6c58828e6d197da4700fa7454a17429823c2d71127eeabb36ea8b90c4c0d0f628896876bf7719b9b67e913f60ca9c1cf19ee5e7bc2a35f28a756af08c6772af5d90fa7b37d60ffe9c449bf50a7d36a74e2e770b25164f0386523a174d31b25f7c8bae926d04dbb2d521fa2935ccabe6a20c22b707a60a08e9f19cf889a5854516e6c0c1d9bb93059ab3ebd990d10d9e11954b6dfdae9648defc3ffe762cc811340ebe9411042a9d7af517c62f048ec6501bb1b657678ddf7a0800e5cdbbfb33a359febdc399736e8f4cd952f03b401e6a0f27955f7eadd19b40845c76e5be700f3b2f10109250f8324df9cd48cd4f76ad2a487a60a0fb46a34bd159668021195fa6769ef20dedc58eb8e1482263677512b496dd8600d8b9f915aeb09c5dd6c1e83e48308ea86faa81bcadbc7d1c5eedd34746eb7d911e7ee2f8d8d7e868d1211903e7bdd0cbb9f6d0ff87ecd2e598af114a24db4396b52ae1bad292cab1cd0db19bbe0583f159053514cf13a04a1f26fd9b39bae9b5562c0e4c9a72c3b069ed774819f10ceb9952669b8b847a203827d5a0226d8dc3df4030585a2b4cf999e470b3d3aab08ece69a24f1a246d04df6e54789a09afffdf3b35b5581980b6fcdf155dc41eafd633ee46d9cdf2dcfac8da5c8f938127cb6e5cda6027db7421d672b0e52e44edb5af804d468275adffc14bf6a57e3797d713df98ae12551fbf55467ce5d6ccea7519da450617731c4568b290194207f04cafce6fa5d0a1044e4c1930a511fe938309adc307b35b679ac61116f75f1196e24b454b01de13b45e931e7bc14f103b9579e97844ddb3cd59803c96930932d73706939ddfe23759522f70f3200000000000000008ad986030000000085814b6ebc7564379512a1a3c7d5db457370f430eadfc06216e5b135649a1f0c03e1feae1c923d71da1aab2636b56bb61ce9ada47143fbfbe1095c0e3f23d6b635585210b3b1e4fbf19193b7b74dac8a0bc6bf3c584f081a1f2734f7df6fa4c700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bd19955d062b5d9a90440eddcdcd0823053a6c5a736d276803d419c148448b22dd11a595f694652b58651dd0e9f13ecd529af45cb3b47f3e18fcd5c61254f1545db0617512abb81b64fe142245c0159dabe5836802fd7a9f5d1c139f3b19fd7b10cc4e2cea936040e8cb7af573d114f766f1e805d95088a2ceb0e4867e78a6ba031e9441dfdd6fbe103b7f6c3f9495481de68e0425867f6bb9a2875a41845fb8230318e8c62856944e9f4f30cefa5ad901272584be4cdadc0633ac398068156032910b05d40d212f50f10c4e7e843aafca21edb7bc782324d7d06d364894c2c9a3b17cea7787591f9950c4b9c77aae0aaa44469fba1623a249f9ab17c944dddc3c43c602073c6d2c5817232cd1d3de9f725a62e9cc306b92fd1c4056b2c0c86c1ce4c169021924e40504bb70a901a162d13ea1a165346f6737eb63ee43ddfcec7ab82b6298020ce70ffa94969199f44511b308ffaeb794528312d4bda0ff9b4ad93e442a519703023f079036b4853b82157312c0040d09696425ed101c04911600e1b55e7b0fdd022cfb70b08b8ac52a333b31459e64dc626c94e3659832be08cd6a99c656986788cf591c82206c1bcd1ced2c51c02d9d5abb3846a0a63758b5532b1511ead06b8f87ff1cd2414aa5689da296a50adb306b916af7576eaf7816e760ced600417b93073cd5b1a2a879d6c0ee80aa5c1ab95af864b0bffc266563c7b4f4e339ebe56c9adc443e65369b1c0087f3678f31116fb5ac5208a66a9a27505da90e7e28b9f7e790bab7655b054646ab9d0af3419f6a9bae1eef96b1b2a841501fd30ccfe8f338261beed5a7121ab6374380f140052555b3182e27d3334957a2f00310117bec75c0d68eb2634be8a5e64810ffe49dc7cf02a4b08d33fc6897dbe12920801a35837bf86e1517cae4860244c05d21c62967baaacfeacc17489676a0c64c67b81acb23baf1317c12bc9478ee72e4a0e140bdd59fbfd8e94f546dbd7216ff3ae4aa010a3a3843e7b0490a0e34d8087eda46958a79cf24a276ca75bf4f06cf170d622700c21b38fade26a0835db6d3f2b1cccf1d3c7d87a84ee48dfb2f48e4b2551784718fc49c8066e191b4e7a6c7501fa4affdcb96e414b2650c566ee4dc7243717477da2f116adfa2fd91e554dc4f230dfe950fd1f25fd89357b044456adc4b2f3bfaef6d5ad7151734af90f3df66e7f1a82084ad5621358e1d23cb0cd850bcd5c3ae5afa70f01a3a30b798b3d26fa86344fda221881d0ac2378dcb742c39cc57ff68a86d05946c2da4bf4e5454b2bfe1c57d6d75e32c6c7a8a00b6bbeea234304393ce61556b799b315e89b841c7d4aa0d335ce3c1d9c136e477070476afbb41061f911ec89042d9c6343bec34cdf395270f501a24163c4ff07dc9f2e7eaa255a417a557b6adc38866f21a91758bb1495f69520fd7a1d53ebc4a8da38271935b34c0de2857b3eacc92c8493ffde32396ec3d3bcfe4b736f3230014eed288aa09d055791980a1e3ac700fbf1ecc53644e60d96df6501a1c95c92506d8d163c46b661e2b5c57480cb6ef14a9bd8daba84e8587a856ed3931e21db2a7adf961b6c9b4ab1db82261b49ffbcbbe1586b15433bb6f009f6c3fcadc998d61343dcf7834bd4df0230416053798918c24024460adcc4e88d6a6d606524d7cd6a256d2c33809e0013336c5eb06a630799518147997d93f854223191e7395d2a09e69fdec0b5db0811e9e1a89c985e455e4ed082c101e09e65d8455266e2f3ece6c085f0870810fbf2797881816c07b571e0364519c95deb6e6899940a778d5fb5454364dc25296d8c4e1ff552a22469da99066c958b6453c1e3409779b7ba646ca14b6e3e5dba7fad5f201eba02da6463a0617d58171bf6fb9c7c79656093205cf1c778813720069892bd189d456b5a4e3bb8526ed4264ae825417909f27d7ead632388cea0802beac0960526dc91fba2a93cc093d663e3291104ea55a2046bc6b92caf0c4407feab132cf2d1c6d40e85b1bc5e9283dc913c8c3b8f6293db1aafeac05e90d42123eb1409c6d06dd7cc9f0a74720ad959c1c8d819b49db59345fb8ad573308f24d26efa0d6d9290983b597d5e055e379569ae136d01a3910205474b8e8ef5ad702f3dd5a45c93d9d8644c289ebc56f5f1b0cc9f61540e5dc354e5901417b70cc5d687408918ff10f3bee52b6577852cabe5d768608505a2558704b767dcefc6595349c0256cce9d38bd5c717cd9ec588ffa7d931ed44fa7cf0a8a04a5b8e4e1e5c6402c5b942f048d72647b4a2d43700a97f16c5fc73721d8b590967cb13c17b3a319cdc90cb7adf6fd29eaef18825d457b979795a402952b8daaf2861be03fa69597c073002fb360e261f8049de64430beb95dc3573e6eacd002fb085acd3d13517dac457541a999cace86a7eefee150a", "6500006a5152", 0, -192607878, "f41df8af8c28af0781e5bb5af91b4cf5b77e242bf0c6c0575c11fd3f9c90f3bf"], + ["6ee5b5530432851b5553e0bfcca4359fbb040ca832737ec5d129e47b61071965e1b20f09740000000000d0d78466f79a73bc3cfc1e413ce33b209bac200c4d4de5fa407dad015549c984d75140150100000000ffffffffdf7f20ce1b21ba1fea40a3f0a98c773e3e039076d73ccf70558c0373546ba5f30000000009526a65ac655100516a77fd714ec345c69a8e4d4198ea2f00d9572e72cd7b8eb2d42eb35dbbbfee62bcb74a6cf1030000000653ac516353652e076b6f03fe31eb000000000000f6ddf30100000000026aac9d7f620200000000070051635351520000000000010000000000000000b6646e02000000009a357346f00268c497e00120723d8bbb0d12ab5482a562302386a24d71f8d393cf71f175d9c9f661920edac450dd49a1ff99ce51a943f04f24e3dee4c66918641849abd1a5c49b61d1263fea989e4575f2f579a1ae92a5a5266ac97b6f618b2800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000acf229b444019ded7450fc9554c0e00d09f91ae017446cca024dd9e963ff7163abacb0affae0df2107dfeb75573223d811b5c6075287c2f53482d1853f651c041b8f64291c88a12eb5412840a155d502a6598b7e10a7e5e863aebb1770b5507d7b0c24b4b4b9612555a03117160ec55ea0c625f8c994e93df3dbe3cecc2d000f03022b320738cfffe7d73b9ec3fb8c0eb89b1178c6b0ec64832090f33537eb451b021d10d2f2d7ab6281d57bb5953597bc599f7f5444f24567f423b311ef7917ad6d0b022cfa6c64b42d3a1d5d990b9679d1d745ddaaa6b3699e735374f2937605c7467fce1a3760161ad4373bc65867531d9bb78f83a35aea0caf09bf607ec9a6a484031ee8eddca45c86c33b7998cf85303a86116fe736db78321dc27f1b5c2b9ad3b40327b30360ef8e9e96154516c69806f68ebb1adce3f0a80357c23a6e4b2eb70a770212e628447f91fea53bb9a670382a72057547e4e3786a4eee798acf28c6e1e77c020c77652314b689f0404a299cd83b77907a8f15d250e3c4a82cac4d951347fc1d0228c73e622d1433fe9782e929a7295afbcb0c1dc099c9d74b3178fd6b56ff3724d614564a57411943fd936a0f18e2a64177e608bf537fc42d5b4978e6810334587089ae937501ddeb62c213694c9ad13b9998eb6754289bda381e8a8c1ee980a3568b058dce5cffa78c9be8249ea0d634e756ca772f9d8dc3236806a7f2eeea65715cb8d0874537310440f95d1289446264a10c8f32fd09b4998f566a301c3c83c93b9569d0c16263ed930b3df5945867ca29947cd334206c16defa04098a6ac2ab58c8b2841870e2f857c5d59059ab33724929c523cd5ddf4d38871498bb0fef048c8df475610c896a9e6c2eedb327c110f085e45e71fb9a53aaf7982111b052f1fc1f5970aa6e45e4fe159b9e04577b571417d2f74ffb9332a1280a1dcffaff038d72e17ea7acc2b426ff49785b2601da111d75ed456602ef9a32850f0c002164a40a3c8912d8157837f52993085898d7bd299366e7ea82238bae34914086fb0db4052b97fdc2d0a3aa0df2502e58fc14b653631c2464d19f3b605a9f0500f15529352365da60addc226581fceef3b67abff8eba8b6e6940d3e807e39e4061c2b79dba8d9de1372083fc62af8384d1e4918c97bcb789781750127418bd93fd563724d37216102904d194e7cd776ee1552ec09f286696f7ec822d1f8854089c32759c7ca83a224d976e853d53ff0f51c9941875296bd7f9501ad7047efb7cb03a658415a55af052a35cea4f536c37746a73ccbbedb15c75b03afa29a9a6ad6f24ce9d6032969b8a2784f4306409a2b4bce776f087103160b4bca6897ceebfdf93c2fb316cd5996a82e14022b928a1bb3172f05f77ba4cbf394f8086f712b67b04e905c8be7b8e2f8a9d2232126856099a0d2248b637f41cbba3d64f451838835693d1ca2a8a7ff0b5324ecbfd50ded67f36af4f869f2dccb32439138d9ef64a91c30e9b1df70596ce6f87f94fc6d96cb29ee007c6dce875111609a0102c6d514fa823f682a6283aa0c7c1d083f74a7c1377ecfc048b5ad68063275dc60a4b19fdcd1dd2217a61605cd113cb72bc3e16c104e64c5a7c788bafe3087b8ee1220e836afd158619f64b0cbfe793c9840c4fa0620ca6be1831ccaba60eb72b50ce2d1cd4335a92e4b273766a41d691efba2b99c7a0b7995cf3e8b0e91f6cf14d7b0522a297a51df8e7e0241c658f6b10ecad26a3286dcb582d6b9ea899e91ddb39e9bc33d60da494f99bcf605c5bfccebae0a58484270e3163eafe67e470fc82f495389ecc6bdc0c66a939a4e2fcb4055fcc87dfad88f35cf54ec6a248feee35dbe576e1d2ddb1e16cf3407ff02aecb6c778892996f5b6bc33c597813024f3ebff32be3b95bacebe31a5d02197ea47547a85b7159f965207b0c1f5dd58582eb324e6505a4c432e850b0119fcacc6f60a8c815472ff5e4b171062ab7a1bb4d7a418fb7fc4f3a4a0a6f122fccad941aa3b044fc93b6b229beb633af2f68a6d778dfc59633e9ade7bcadbdeaca3703c948fb7b5a812c1768b52bfb66d037624c692adbc17cf5993f58b7340edf0d4a57b5c0d2098102a9c2eb58b75d21d183d713661aac7094bc9dea42c842ed6c765d075d6741593b1c7d2305e51c054a0bb326d2a26dd4a35bc5618e9faff33408222f834d88652fe53571bd35cb04ad4cdd2a34d029130faae9b91171106382ac65d9ea58092963b4af759cc2ea75485bc2d3c9846ace808242b95fa9f10dd45d407808f1ca6ea05960fd99d743e285c255cbef2a5960b24f84943fd4c15b73bc7b2147f1ea360014500ec3a10ea912c5fe40902fce33861ca862fdfee9fededb6596dbdce2bcaa904bd06bb59b3ff7c9757b1dae24c3094dbce44dbfa13a6c0e30a29cf1b6a503", "51acac6a65526aac65", 1, -1274962426, "4239b8327bd0554f937f67ffbfc96648261e2e1dec923c001dde2aaddca3e93d"], + ["a5ea6f48038b13aa12d48eef8bdb1a0b6bef1dcade3f62b9e0c2147be178daa7fc616cdc240000000004ac6a0052493f9adc6a707fb67c6c2c4b770b90da99ec9fd4c5b15f31198b6d37f06152e144617c750300000006ac656aac5251ffffffff8cb84a2659cf9c1812dbcb698ea0e8d99066ecdc69303ee2ea1e3e7e52d3496e01000000076351525153ac53ffffffff02204652030000000000d48e3102000000000952636a630053536563b6bc3d3c03bdc2f500000000000000000000000000f84e3dda3e5e654f6664b39c4c4e010b9a1648f340e50eae57aaea06efab2878a25fdcf7b7d9f757d1e701dc80d41f8f2874048ad82fab70bd7ae2c11c3967380b49022d328aae6ce5b9e100de9dfeceaccfff86cac9a7e7323546a7e7e6585600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2f8dad9ce536ed95644b183a5cee852625bf05819acec3fefc32301343d7d5765cb500ccb649665e7c655347c32b9d2453460801667e8afb4964846460b8e7196b9201d342e38385c30a7780fb9cf7e8dc95e25cde3beef267cda7dc2bd89630d73a0b618b8beee97d99e2779318eecb6211aa59df3192d5d5a887d49549e9403017ece4aec986d28a96b1e18e27b1ef451abc1871bb5590dcd40d8d6285221b60215f6dfd4da18731281173023480cc136260063456e71ffe7d38efc147d3c250b0a0148b2dbd241e806e20f7dc60734e49d695b0a7b936b44681425a0bb80bf088a7123a8fe259a868ff6f9d02cd6d8ae0363d28d63dd9c5b54cd553a6b64de462d021fbb8f8e9d1a1f3478095d695068bba0907073a9b47eabc71e83b85560d6a5b603023e31089526475320c858cb80d679f965701803e86d2797adb5ae6983b47be2021e9bb91be740f5550d28ef07d2b2a7631e138663b3f6472bbe5dada37641b0a50216e69cac56e066587a7118f5a747389d025b2c6871cc9627bf9aa3bff9da565a031e33e493cc0b56c91c67b85e7234dae4bf01309a346d7a5b0f06b167f29401a30bc1891591e18411644990ef3fa6526c5eec7de5d4d5aa163f8ad7bafcde6bc43b86c0171b78917e8a8fa7a7c8e2f2e854ebb8ba67ff90b07f2cf8f6aec0b24d94279e6497ce2d2f13e022c95c4d1de48c92c37ddb48edd6bec87c5bff33d2ccc523f09d0e42ead6524b70fa36592bbd98eb27ab7b7daa48e8e19440ee670b8a2dd2bc719958ca28418b1474b263e297cd6f4943496f664a524ff24bb0565c239d55d210379e7969fd576bdb594625aab4c5f987d275002693b8ceee6a7de8035e8ff3bf0dd3fb558122835cf708673150e01c7d37041d162cef4cfb898e5c3aba866d1b5b14deacc83aa94d8e9d9ff2f16894b7ee39d63d9e080dd216ad4fb16601d447a244071e1bacbabba29a7949e99d3c148df7b1272225d4e32acdc4cbe026bfcc22831df2f6898e7ead07cd92b5aa2045a5759e41911359b065c65a5c34b4a8fbbccd211a52fdfbe2258d1ea44cf2510c333f9c012bf2b183a4be9c71ca2ccd0c3925833bbdcd60410d065cd629a3d5ead919e76e20da0c330a5b580c42aaae90be36422e34442666d074f43e3cd44fb356e16c37df3d800f57f52b88627802d88c1910d48f0c32dd604f0c0bba433d382a7c19b25a484c44708b4225e5ecf20ff64ec9b1af313e220b2687a19ef7343224c005c65d3441f3d085de17e3bf8cbeea74a3fda0c26759245454ce818764b7346ec0bf7486e555b0ab6063dd38c7c1d50a22280f46a387f1ee0aa918c67bf452fab540c2b7e8951f6ac2a55cc3688388e44b4883a1d6790fd3a68c2d6ad3ac14e2df596e7760a7f040289a313c4daf483cab8d372c1d58cce0b2d91b3344bbc18313ec18e36e311f9a4fecec60301236b15e092a2a5e099b0e4c07ddc60036eba138426c98295bf08f15e44678cad791ae735da29ddc191070559f0ea63e6e953d551d3e8adb5bd3c08fc98072b053031893641ae5500c51460a81f5602d62c251bc46e9ea686b895269d12bcc6998d516078407a50256bfc9cd75d01f663e70d68704f34a337b07bc94c2a10e1cbb012546ffe3a1e6da570c4a5a7f922c236f54db725e369e3f0fbd4d0fae54c0f62c81b1484aad819d00a85ad59eee6b67c509cb164fb85a9a8dab7300d341136f5ed241004b43309d704fff5a149cb59419859b1ddf0d7021422f0e78989b4957dfb53c08af82b0efce3aa6b05de6386a04e545274219b5bcabd5013bfa61260625814c85152c58e70db9e2ab95d673db704b4b9152cc5fe9bedec9205d7e42c20b317743fc86e6310302233f02e8c58ca79a2396aa5670218cad3e50be1e62ff87ff9e82a8c7bb9cf19f204bcca1f02625e23ec5b488ff5b2b6225eb3c8f3d66e200442419596aaa9c33596e620b3944d395bc688ee837a8e888fb2ba5a2a3fd415839687a1b3989d474b24628229daec51709a9ae87558876a26592dd4a6ec5faffc283194d913c4e47fecc5bf6ac4303d4ebe1c17c5803098159a5d51d2ca83fab0d6cf432c7e87152ce75d66e773e0aae7a21043612395d94ce58e1df6b2144ffa3e3399befdd23f0528d7d7d83c065fc2a90aa8e657ca833c1307d79e44b67572fb229f0c5951d1befd52d97cb6bf7f93a09aa381509f9db19598aa33184c8abea5180139bfc48b656a367030d6cd6184fee98a01aa78649f83567632924a62b0f92d4924d867db4dc23d907f04c0b0100000000000000000000000020ba9a5e448585a1e70609873a149e9f0408e5a51c7585532d405b75ba9a3273968a83d093b214805f7a983e7a0b847ba84823c439a5f1a1af07a235ef13c836a9fe48c2416a7fedaab66b74eae7594d971538acb32529ceab357000d50964f400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000963354fbcc36cb9c4b1f068aa2c2df0beb212ba09afb580626d9cba978804c1a5988e67b23742a2df1e46091e4d38bc283fac59b42fedc9310690fcc5da5ea03e6b88167c548a5d08b4c6f37b230a4f227cc9a31a96c15ea725b858deb4bf64838d20064daef76f2c69d52c2336bb8953dcb26c31b7e68a6fe3077d11fb46f0302223e8cdf46f585ab1f789e881042289e854b9a3351b7bff00974430844eac9b60326e5594598cae019dc5c7d651cdd3bf285aaaef601af77a0f4fb1c80b44a738b0b03847e7579f58e3396063558b782de063b370cce90c58f9084d3986cafbfc63bf92518e5be21e1b35b91074ac2747e9641d0723063b64e5c9056d72aa2a12fa20304cbcf944d02206704a27c7d2640c8952e6dcba731889d0e4c07702df9843203032240f45fc6fc9de6a40cdbd0677e205ad785f2388ecd9ced1eda3adae0677a04020559f5e433e66d309bf0fb3a8e462f4d607f935f563adf7be68e5c76f796266d03014b1adc20b1d5857f78ff2b835dc72f507390a713e1ed7413818c3fd50372fd022dcee834886dad019324092e6e4cd17b1db46fb695b035c886f9e47063d812d73e64a5ffeddd6792341e02e9d318ce1e06b95fcd1d4c7b1284e4509a0aa9eb9a0531142d27af8b00e3f45f99953264e82d7fd5d1958a8655690191e6a92789f6395c249aa4d27e6b12712d13eafe3dbc66c3a0ec9b5228c4f059734354623583c5dc182d745ccc8119e0e4eb2f6d570b922214233d32749221b75577e4113e9fa383533e01bb625c394d13e25f4be0263b86efb310b63c255c41d831eb6abaab1cc46745df8272fbdc4912428892197a218a582984f33936d2aabc4f00ad60739b532b70a419d3ab607234ad9ba518f49e8c64b8befd86f51fd471b9d3e08166240ea70515836f18b02723fc61b8d2d13e82a0c59bfca3dccab15e15d5ff7ed173d60be6fe8d004b85ee17ec7acf395f0681db3f6ac4bc6e218e9691b2696507434dee7728c8960750b59e56feffd0168e519163edca851d3d947367e53f1f770fb25d1d662e45f07bec7d13bc19e717639e9ed7791bf0c6725b7411897cb148fb379d6532855da6860629a1773182855e20fff00446391ef037a5976815d0284dd550799a3132359f2fce6b41a7feb8db7f6dd21ba67e13da2a5ddd61a32fdea2c0a2f91579cb0104a1d135ea2be29f7798a84aacef6f98e03c73078a23c362684be8f144f483a368b4a36b06028a8ad8175e525c9011b6e88b1eff16cb2c0fb2e7a8c9fec0c37deda23b87960ddc24484112fd6cbb05ca54da4865089cf719919867920c41f333674f24053f73d7f96fde785fe9d23c9b68aace448d4798284cdda4ae1519fe93ef11523192ad2bd4c578d13d85a30485b812384b3551e135252de4af8123e397db1bd329fe45bed8425158d17cf5fe3f2d811d03697e29658462c9729e734d060fb6716057eda174b7ae07b12225675968b5c040b0ebd350a26d77f6e8de3006a94e8392cbd017d2160986d6064abc86352fa7972d13aeaf0f466233a8d9d02757c99196304f634633ce69d679ba3ffc3a233182f530b8560f7ff3eadbb475c18059c33ae8782cf9fb07418b214436d45e358035350d74211d0f1252a709fb688d111c2b3285ecc11f94b4251f6fded33a9fd5abf4aa1a9f728f419fda0797da398e9d84846eaceac302f214e242d61e1777f432e537c262053143ea25c0a374d27c7ed4651efed140d8dac66ab9b9bb45d1aac212ecfd6d415a35362b7e27d99a52923194b03caf55b1d747199ecfe5536df7e1e48d598b52d90d9f5d51313b51204bea3052273177c62b7c3b403e005d256a187dd2142a5a3d3e2a5d00e0e81b99574fc6dce41b1aee714bebcda4ad30490ad6d7d7fa1512bd659df91aa3fc446bdebee102e8eeea3f8e1c29bb441b9e5b10cf52cdf2e6ff0ccb3c1e4f6eeb8fffd548d8332d1161df7a1a449cf28ee2813c228deddec56fd83f8b7fe37d041bf297054ca4713e4b00e82fceb9892e44a87a914b8db382da86429b087031a8fb9a826fcbeaf0cafc77c87a5392611e788ba2d706b7f18bc58d0e0f748a65c2651e1bd6b00548b66002a21afa8992445b25c520fb0c38cb40ab0d6f5ca2875f93f7fcd56dd1c53052c990fe4be0b6e899cc7fa550e638c59a84c5bac395ebbe962468ad5ff67f28832990c965a86e63342ee2a13c3d39d15fc114ffbe100a20ab7377d6a79eda40e88402932934d007a402e7ba339d06295ce71830ed33568fb84276b84348b779f963409b7105000000000000000000000000ce820aba1702091c789688427267ec812e2aefc6093e1ee0bb6a8fd6c1d73ab84fdd2b0f9f9b1609ebd667ac9512d80dea0eaecedc27d135c725ca53d87eb667c1bc5856daa2c486aa4c6b7e7bf02232b9341b25cd87ab3f210b282ab7952c2f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a8654e6e9880a3e209b57500cb5584a4ce340df13063c8d20099a2a30e6590cdea83efecf25c30d4e447e1ff44dfb5606324a1d67a5e224c3c16011d6605b1a829ac77c0ab75484d74887759235ce18e2115443a26aeed754deec439becc1df7b8fa19b41a6dc8d8a1c8344d96e20d28f8e13fdca436fb557b8e5fe8f8c75c5021b596c9fdd5df8aad6bdfd58fc7425f66192f3ac9863ac7276763aaa8df0d3c5031ec05e4d0301f9eb1adbae68298ed41936f5f9c6a5226d7f144b6af343594e2f0b01e67bdcf91f0a7c91bad12db4f1012fb90e2963eecd56129e04fff592e856646e6f00d8a29f902ec0412142094c10b34dc7df69a936db41a552841295a213330218d2e21d16b6223ad630abf119830b766a4b5b4225b285e566ba4ed384c9fbf8020e2ec7be2056da847f00b40cfe62c4f7c98d4912070660b8e66a3b40ae49bb3403174076268510cb542399908504bc83028503328a9bccba8457cd745e8b9831ec03112252e1655e88bea4b22a5c9a74477dd896d06a9e458897f9cbc5d22fb43887020ddde2a977941182c74db9763b3b08d8e78fbf14d5ac0cc672aa5f2b647329fae76c4b1fa349f5c0bd8dbf6e00ae8fad8233edcb5aff2a8806ad75b2e580514c319772b73e01a45c6eae5d783caeb275b4820180cf031f43854530eb7cf5f723cd41b60a20347f208263910ad15430eb4718dd3f3305d2dfcba622d072a7d3733fae176902ac8541d2fe7ca5052957fc3fa7ed9e1f995e7fca347e383efda75b52e2fcaf752fdc3f54d95ebc6b2e5dd9a9f36531510dc668e168ca597e72bd8dd36050a0fc670eb82b9f0a20d7d7f2ebbb9405d1abd625ec148107c58860e6fbede1a4b879efc48b7f3c63249e28a8e6fce860bfab6808278251323ab928cde57793c9ae8a790ddd8d9505fb4c790be18af67c149cbe57ad8dcf5c69d6b819e20718179fd08073ff05bfe4aaf59e08c55508fa02ddbe9f999079adc4a4999429fd1c4a53d49cd9b34467585bcf82b70740b0fdeb0e815071f7b527de0bab12e1852e178e8ab83db24b43bed0aba9aa6988236ccc830e644524c37aa2a096dfc146e4ebc00e745b5143618ff89f50bc9cddf469070a30d871f621adf13e10ec131a388fdccedbc33703301055d2bdc096aba319ce7b8815713e291b956c42217bf378b8c7a3a6248a5b1fe5ca39dbf03cb102551d3c7ce2b484de77a03edb1b2b505f0b12a1881da166252d2bf9a4b1ccc07fcde93a1d9d8b424db8a0bab86ab34c42cb80dcd6b0bdcbb4e36dcff03b2d0e6617ad368f9d0f3e9affa2f1b838b37a6af37074a2e103403121a839f851a29d33a999344673d6c4a25c6ae2da061ca5a57350a038c7866df4b49f5576c72915476adfbbe11706ae05f225ff8009c83840d7b22782ac590a14662c5c72f4cb480036c6cb89218a3493c22c610cee130e53d276ea6ef0e7fa4cf6b3549f4f027acc1903dc65b9014749402937c9b59eb59731fee4da9a0b416121890b0b1985cab8fb37bdde9ded886ddc62e0137f628f5448cbc240d2bc07d6fd01b043fea7121e31b586eb415c77d647822c7d902d9114b8ef2cea9838ab15e37d06d3c10772d08bc58d2bdc2762cfa230b4ba7784f0ebbca97ce924b450762de55304440e2d193c50d85e81fe277a8bd505caa44eba577ed33097efeeeef1c5dbc87e152d4bf997472d78c98877b8d09d746eb9cb09a5929cb6bc5cfe0c64d17e6438a3ac9c6be34190d5f11e32ebddbf0fd6e731b2c80b165883c27aa8a14410b7bbc7e34aadda01e0fb3e52332af8d72c5d75c12ae253e4a035a8f62d212e9883f3b7b541eb942789ccf97cfe04792eac80b1229ad8c63479ef7172f6d175b725e972a7b3d5201f9be4870f13667097602880139184efc9cbd96d08f08b0f2bfa5c6b569ebbe804e8e92b3b5d4dab8cfb518212e5164508b4c3f9674c180a025e7ddd5a6f2e6fab6b01570db5c233a746c84738d55517b1dfaf174982b24e9860d9e82f861cce41a5af5fa30565ae711d5eba54ce04bed2aaeb04b038df140ceb521a6ffb7c1e11f6f8f07c03bd602ed3c59dd9bed04119a9a96defa3cf4f91ffa5f7945974aad2139ad50f5a768d7b7257ccd0c0cae6b74ac815e36ad84bacce0860bf7f239bd1e37ca5507af56a01c40f383eb7515d6cbbcc103a5654a0eed560f161b6218a6f5e66097137b30c145167a8f2e7f0ef543b85587b9fd1bc12d28543599e113791b3558a407bcfcd0767d27fbeb0b22f0b2d076ac4bcbb4814800c74f18a7b26fbd63371f150cec620cfb148678cda3e5c69eca41a8938418437ea6e7faaced9d8ed0b50fcc14b04d7f4d90cafcbcedfb6fdd401dd39259dc8580a394a0ca76396c03dc1aecd8a2f647b4635149a8ac927e77a27ebda394a06f148af033105", "52006552ac", 1, 234185119, "b7326cd9f518c94f350f20b21e043298d7dab3f5e0c1e8cf6b6cc9b7f150b1a0"], + ["030000807082c403047f77ae2b6fb5653f990658d2fc21d99a5144060405867b2e769ff77f6ab98bba000000000100ffffffff1ba6e55fb1ecd14c703532169ffce8fa85a58638be340b85044516e611f985190200000002636a42e21326f01f7ccf7d8606f095d6246cad9d7ce1188e518d80f7e342d2434e9dd67269f3030000000165ffffffff209f327c926f94229f6c1bfac6d0e06ad3e25fb5f35bc9995c58f420bc79d8ef030000000031dbfa4c01b4147e000000000001520c8ba587f118e45101bbbd060400000000000000000000000023e349d33ae5012f912d17346a7c4dbb537e88fa5e4a7d9b5e49cd52735fd2cc0e3a3df704d56bc2878b14d4fe4b7eb8861bafd18698446ea1f79fbcef7ffb67cae0ca273e64e131f9e2d00a5de1960fb0dfed53f5d3250217d4880ee0f0b07200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d75eb6ac8ed58199518c7e52043751020613914b569c2b3e9476185fc398932823021766225b648a0bbefea41d5715ab85eb06cdf0511e24dcf46e6394d9ee00f496941334781741cf1279802183296b39919f99d65b84ef607213c446198332da56159b146234dc18fa77b6d3a61979a326658354b759ea45321a08d18424c6032658d96d7c928d933fbe73ff3de29530e4cf4b33513f430e9ffdd437b35808c10209c615d4e0561439a03149b189a1258f1c27d4d8420363eaab9972390973a0300b07137a70a1e319a9a267f0e199ffa9d0adc4af3d91a2bfb8d820589724829d50e0a4f69cbcd039b31db1ac0e20a706efc4b8b1ee2ec6a81385a55c248c36e7bf02054813a4d86f49f01f87e2cd5abae701f4ae61c80b32c03ff58fb23cce334ada0211a0c255fe1020f9af93acdca0f52b14b184aac2d69fb335610de27301cdfd45021eb62a0617f7b8d2e6d969fcb04e23c735b8e239132b68160918edca4e0fc61e03121506cf7589851049b2b3b243d83f81111b04a4e9fac5f7cb9947642e8f4d41020c56980700e695359f131a595e89fa4d3c1454f1094d3d0bee3ab901c9545a81286fc6422a56261ebdfb4bf5eb9a608421329030d11867c3bec68413d4f7a67957715c93bd9db0f6acbaed868d80046e2744e405cb7cb72e3b16cbafe1be2b56cabc9eade01abc07d33d9630addcb5ebda8061500fa65f9118859662e0228d64f2625893396fa060d32dbcb986049a81728c5bf5ecbed71f6748231b6a05d0d43578992079195919f0b5d4f259cf3ab8d876695e63e38018a59d11c2fda9f3bacd37d2035c6ec890342f4651347f03320615c85bca18bdafcda8ca11577ca7c470b0787b83dd635ecc8be8b22a56d834ae03ca2b23d998218e76de8cd07fd26db5d842774cbba5de6f018b2ca5c9b72a8caf1db8b3ced613bfe27b09e91869f8d039edd196eac008942591d45215b146d100702a6245155c71b3b65059e16e02e2170711ea5e59cbfb660d0993c8c6000eb21ccea368f4ab514fbe3150e3618d513529efe98c5e6846e9f5ff1667b3a887272c5607129b041c75d1e847cf2756b3a19e0d9f7ee2a55aaf49802870a85efaa70429bb868350249ef93be7d8dba45074ffa7d242e3869c54fa56dc8c43187157fd4f46ae5def0f6e64870d93e6bf80848fa7ccb887f15d5260a5517e6ba394dab0d5cd8220c9946ea88b5b22b570b789ead8fef181123cc672a55531092051b763ef3809aaa41f353e101dfb8c1080d3b4f37b7b671143cad895705201e2a056b1210c929f0f1c1785dfad42e50fc4981b53202a0d217ac2776707a5bb0914bb5f171731ca27e8c19376180aaf175d2944f2aaa6ac5a5330d22c28647c0f886d140b81c4af51d5c206689d3f10abf2c23b78e8667799ec45abc9200b90948058fce5f3045cc1d2ec35ffee4e8dfd5c42809b71a96a79ad0742a18f2ecb3befa5a2e91736ddcd9314f399328bc48e24c019610638bafae225498fc5d91c9f95e7dfc2afae2445e2cf24808412ab05c3f7ea8d1b21b126e71dfc2800273246bb2a90fc3e2b991f8dfc2b5ad46ff2719f6390356d954237312cb7c93590089c91d84cd4f32681492d26694e6d8ea955632af5c42aa8a03e350cc0352779c3eba128316a8bb520744c5f9ebd11f6376d315eb8b272169f03d4b89d2a62434e159a70d0e02b863e702005be638579e9fc1b64b78d99d3c13ff900f7494f0006a4d4f42a08360e20a1c271a1a1a2a246b363acb8595d43b6c6817aef9e4b593e7978a1b00d0d563237812aa74724afedca65d1597be1670d6655644b3dfbb6b2532c51cc52925e7a040cc61739d847a1d56fb4ea3bf1d701ff2f19d4d819fc64185827d69abadf211cd169c6740f1a00a340a03b98f2d313b66d5fe4d8a86329357960f2f2e4249374306b26a9f1cac0031de17199ef4be5b913e11f6a0a997345a9608921a36f50ff418ace02a480b5a253811063d6b256b014204e127c9b519d91ca50ddf43c8c754a512e5ee1ea2856acac67484f67a4f5aed80338ab51617a2aea05c160827ca3e6d0af41a4ad6aebc5a08f57fd8def8d213b542c7bd4f09a2ba42802cfd375589f5e94519dd39ad45ab2c2d993cb440d5e96daa85b045c9b6bcd29f40e33a4b24fb06b83b92ea970f77aa59d2dff76fe4830b16a6b3e95622e9c256205ae93d48e7460f7f074067aed55a5809514e9a760eefaa435e753fb92a5aed760d8298ca03665e6f4b8baac71722298c2176420d85dad5a673d3a703c3200fefb33d422837073abe2a37dbca1e765b741f40e994337d328f102fdad28ede8c9af37948499f371c6c81e7a2456580159b4868cbf9f4379362ffc214977b2f5c86e58626fc8946266249a36c0438eef16b7291712a9ea6993a58768fbef00", "00", 2, 779010436, "626283da48751e0e5049efd7fdf1dac57469bfde50f7d4e23654e52b425ede01"], + ["cd481b5802ad130250c3280c382a3a94ee4fa0798f60f6bc6d343865a7b5b87fed60058f46000000000451656aacffffffff9fbbbf864b29a010f95b136b38fd1777282994145591d8528e36c58164b8aa6f030000000863515200530053531028566404d1afd2000000000002656a5c08e1000000000002006a58b2c40100000000016aed5e0e0100000000066a6a52635251bab4ec29010000000000000000f47c960000000000df8603128d8bfed56a30ef2ce29233599d7fd17954cb09404a827b27f5b406e687103a8654a7eaf8e2786b31f256e9cf0d0e265f3fc5bee94c4974490a34cd4d6c855ffb747cc99ce89183e46ea5934f9f2498fd47af21267cfd43cd3137241300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000131f15402ef1e1d62e47d2f6efecddfd4cdfc6600b8af466a14825bc9575c26c5af49ce1c1db851f6238505a8ae1127378f638c26cf3e2cd682c415e90ce7b83d68e2ca7dd7d811060b56c57a67e9c241a166910b32bddf6aba18aa17ad19a7d07a9922b60503948661f69ecfca22c0b556b9d1c27de7f5ce75c50cffa42f3a7021fda184c28b126b142f5c2ee6d3d63a4a640db850795d69b0f5668f7c1f5b7f502186a12d133f1a88a68e15e822693cf16b348afbde3aa1bcc5f9353f37d461bb90a01a39ff08247ab214ef3b49bb17a777f9f0b5822c6d60c28541337a16d10bb6df40863032068ab2946f069cab6eceb1efd5c53e7db18b59baee1d0600c06e9cf0217235d4ef1bb41179b41fef02a014bae90acc2f63f336c952e32715ba981774a031b30b4a91b2c3f46d9543da3c7fcdf91c6f3d64460432fef16aefd6cfa3b87de0208a891e45bc8af26e238b4de3519a843dd473dc68bd88c0fa5cf9d1a7d1b05d5020e81b9692a752a0dddb8350696bc556368cf523cde78133fc27e144df7eaa4870219b8afefeb9d36344325e2c21f2c6522384b4f56431747e4f7408128ec6855809172e776a1bad68d7721a326e2a0cfa214ea1ad7569759ee316ec99cf46f3f2fbc003b23b16a7b6d5d08a487805e120d997dd0d16820ea8fae6c877157cb3a0d4a2be83c415f25f7a1065b10d803c55e729fcce664083d635d2ef795d25138fb053d06460b4648bbd72d3f94499087d4297a93529d31d61aa9d77353b91065b61e3d44297920635c0e09bb06e79efdd529d8ac3092f1a526561647b18f71a1b7af6788577111c3b3110a8cf37f47cebca9f46b6c04be1117137346de8cf54a2de988150327a7a4a06bd00604ec1f27fc5ff2bfc0148cb766225170e970909c8f768b33457d92ebf1c3a513554161af4267860867de77e3c788c2dbe42e1e0ba11adc20fb0130f53ecc93faa6952119725d8fd7ffded22362ee9c6f5814d145d89addff015e167f37c4f5dad902f8e170b3b40961ec2009f225cd46f7b75576c589d2b1d7b48cf3b2e7bcb4aa61b2ec0c52aa52ab4a471ffd5a3ebb7a646060dda41248c9900d98193be09e924d54948bcab9d92211bd853010653ace6ed9331154ecfd825defd7eaf5477c04c465f845ee46bc32d1d0e740b7d3091e5ec7b0365c55e6c613f2904a5603f93c7df51b23e71d43f7fd3c723ecfbc44b27af635a0c991bd631823067f4cdb5e86b9383a43b289468a53535f42ba15c5661c23419ce618204fd37c98e9e69fb36f7f00bff0ba2e48b0248bca69444a3fed21f423833046a2e06940b6289d884a49e44befedca6b98763c578cc00a66e3adf7d1d58106e0d64e5c90b95bb4b2bfc6f9473bcdc40dfd4ba0749fc2434a1d26dc0bc46fcea5d5ba8083dddf77cbdbe93c386f5e20c16953a664dbe68b48ceca2f040a3f0978f01d57a2cbe82f476aa4ef43d00aa6681e9f36884f9a03dc27156c81c4e59b80016f20e3a18175036d4f605c92e819890fe04104ae3cbdb2fd619730c1f389955d7aeb2b5dd3cb980df59eb95ef065a29988e04aa0e2f0a28a7701951414fa69da5ebfff3d2218cd62808f6e611b9ddd5fa0fce8674532248de688560a34b91e29f14a6ca9ba0b53488d35ff80c29101915be1412a3a87cce6a27e2a758a4ddc2488010eefbdc2f5c267f76cd09c7c0f9723e52a58b59631ae6da9b0e20a3fefe4c4b8f6eae9a91100a5e5aeb6ca24bc16f436440033c73f139ef7315474171d12b7f4fd1529c16eb88a3c943abd42db0024e32a6759f77de39ac8c54c3fcf44d32fb9c3b0ee979db9951bdc7f72616c9c26a2dad86a1eec4ac0db1db42a1ad0bc7888939ee6ba2b8e18367f4151f04444ac8e41238fb35702992bd23394b95b889b88755f2e5785125403fb9b8fd81082c3a4eb400381d460a9a3a76619c06206a86a312df1206cbb3a3ad2d80eb9cb5054841ee18e81c813690519533286106edd78d4309ccbf3f01a3a1d1bfff52285d52795c0a3a0fc65dd388601cefdf6a64ec46bb798ea5c546172ef6d5691eb616c26f6613b6a37c8745da34f4ed595586dcb92de6710f434847271085971e33645a9d2409ab5d6f4f7031372bd1e4007a19294ba0e9f2e3293934aa075c54bd8fc68ce973102914d65b4205a3ad5a5de3c3c1f3dbcbb5b87dea5d3e23790d2a339a6f43a874340958affed536b8d7bee30083c677a5335da35f48712fc2ff39c049101f7bf7f157d4b1f70c0578da71935a0ae09d402232ad5b6c2e572cde0a7cb7dd5c8557ded313e3b6694889d98734a295e0d9695d25bd53e620e4a2647fb39af1a5d65d4cd5660ac0fa7c55d21a37d1042a15b7d9a4d5b1a6c0e8a535a616ce74281b8ad32792242bfdaa4c9da2b1d8266cbb5bcf790b5d00d3a691300", "6500", 0, 536406407, "39ece220c0cb3eed384ccbb34e3e8f9f4fd9c6ebbd172cbc07654aa18a8ddbf3"], + ["1715ec26030c58fd6b950a93bca7262283f941e9b61796d12585def5f37d4814ab1b7111bf03000000085100525253005263ffffffff8007e44652a40f0248e87af453f6a3e509b643d196b5e2039c8f320de386aa6f010000000852536a6a00525153ffffffff0fc2590f4254f52f5d5782df2206d2e762e281310ac950b1be69b06f7177f103020000000253acffffffff032bfabe0500000000016380d0fd0400000000096352516a6a5365ac0050f5aa010000000001534c6f2ce200", "655363", 1, -1344805601, "baacad49f66d20a40f862732c5c5e9e9671bef0faf23f22b4848b203d8ab24b2"], + ["030000807082c40304b931b7dc3d76ebd7deae6d718add13e62726ce1b0b8f681b95b112c4f116b414020000000465515163c426abdd91340a487483465bb4c34ed0d1cb039da9897b25c85c626af992517388bf7e7c01000000096aac0065526a655165a5274d9cdcc2600a64b71fe75655682ca5026251f872c68b1305cfd41341e7f57ba135970000000009526552530053650053ffffffffa1106c2274e02d66b5831adec8c6d86ab7ade93d14b0406abbfb7c1549f8d481010000000351525389455c9501c85e20020000000003526365a1aefa15e5923e5800", "6553655253ac52", 1, 1705523770, "567acfe74e30d625d193612720d6b23193e7a820a4f05bab043eb277f76d88b3"], + ["19f1c91a02e43edc8dcbe574a759a716dd23a5164479c69c30021e4bcb78eb32fe88ac1e03010000000100ffffffff440ce47480b87c71baacb8a35db89d319262b8a975fbfb40c7264c430005fdff01000000046363ac6affffffff04dace3d0400000000045251ac532240ae00000000000263527d7f5b010000000001acfae1e30100000000056553ac635100000000010000000000000000dcac3105000000002f7681e43a05d79dc6ac7e7c8600e2160efe9c3803a49e7f9cc7b95e3f39a659d53febf1362f5f5d0c4b06270e09e734c5f47ca54f332e18bd5fb3a76bbf8dced531a3844190becc57c97b46b63490d454bad4bcb406cd59e4befae7465addaa0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018bc5e81456a1453d42920b99636f35fb7df01c53ad8085ebb39f8d43cddfae8a9d2c0b2943cb5f7d83f13625d0de5c508148f62062fd6ec53ec02597267c18156d4642d143bb86c351f53cc44c5ab10e61f017d34c4104b37ec805d4e9b1fa3586c83132cc5b46141fd4fa16237b6233d91eeaf8e4d0bfd6fca1b50418dfe66022537322c59395d87e7c3c390ce325b886922ff615759cdd39e553e820e117db8021c545079e894fa1d94662617a0e90058057f19338e839bdfff991da2ed1b8e1c0b02e14b4c7710c0aaa9fe366218c8506656fe1450d82648497d32c022a5b80bd06bb7478a74a1c6931869de14cc51243931e2cd1d51fb39d92789b4f47f8a78950225e9eecf0cc4131723d3e72d8ddfaedb24711b146f994d85184b577fcff81a020304357c6ac160a8e924fccc1834402a44dcdc8221f81ef221fbf7cd77e0363d3c032c600b6ae2b6a774c9cf721561e4575ca303a94a31ca452ea756278cfbef3cdb03249d6d1fa2fef7c4e41c1e97d9b74b9cf247e2cc899a291af39d5f5774b2924c02034c5cb5bbb15e7c78f1406c5be258624f36e6dfd94dd509e49048325d2b58644fed5ca862b3ca639338b992fb0ff8f4441ece10194b93ff2bcf1cc7f6b41c40999c795775315dd4caf5be17a5766ec3eb268a39953a623b8b4052ceb075e803e61a287dc077a4d782330e072c1c24f1102d595eb5e513aae7e53b57569b476398ce40e352bf365e5927cc4c0a6c79d82d88f670fd50be8d3a40aed5241b8b5c1f769e3901c39836becff464506797731fbf9199e81c2706e1dc363e5a93424bde050f04aae4fca4660c463230b7ce2a244d65a4d559e4d09906aa9a83b23c1020af7882dc0b3329f7e974711fa66151b97871d3d68ff46c0190339be85fdf9b25d34d842df46f72d79c08e4dedf81cb8334f6adb82e7f04a1101ceabffb639c0f55f002d262d68f4b742652da8024bebfb2f1fdeb0de2017b94d4224063509b1d8d6fae13deb330e4715b25436665676a4717774cbad55139c4ec0628051e7ee8c0200ee8a76cba9c15c035309330230bf0f839a60578772880b1be7bcdf584fdb1f7aca8fe0ee55340be7db367c942b05e871a8c52b9e7b987935a382faedc9dbfa754527614d3fa75eb9c9142d281fe779cc075f90fe55e695c07eea3d97cc014357d9332fdd884e7de285f928350c52d4cb0a1582e323107c0129e96c6545f6de4b692efd228b4c7fd872560b72308989219b8d90f4fbf749d905109fdf49da216596b406efa24e9f555411fd799ddd746b484564360382f372ef97f1ceba29fdf48cd87079e33fcad203194f75ca07ca28aaa919c70f6c4f00cde5f0765a8527a3d30b6004ee03b75e283f30dfff3d260d85d87fac1716fc7ce047fcfcdc2e29a04f1ef35381fafe7e9b0e87223bd75936ef37ddef6e2ac5aca5ce0ca8c085198116cf209fac8ce72fd76346013685c204501ac6b5317b016612351fc231b829648cd512c613a051726a13f7ee51b649fe8f0834185a56110aec4f68245df779dfdaba8c7bfd4440b40ce0e5bc7805a8e99880d836d4dc89f5bb8cbabc705058c11cbc292b271f7fe57ebbb8ac1acb7fcccfe47f442df111465d38837a682024c8788e002e92a1c88a5d73183ea390ca0e650ca8f7a93ce6e52c77f795ee5d577da257b86cd990d23f48e04f0fb5cb9da0b488419be99fa600ab25ed5a6fa4778c416dcb63e3998f2871bdb183a7ca6a10101d72c4bf6f23ed94f1b3204d68d2b6f790388a1dc346daddfacfe48e65beff07ff242fbffe5e95b370a60c09396c19e5a73a7ae2bafded9b12952b98abfd9ac9d29ed62e30dabc2773ee6432a44a241f27cb8efb933c62d070012678afcfa6149ec79dad351371470571b48baa4ce45e68cd875f2a5cc839338a58a445959ff3f873aa017f0672157b105b0d8d573ea29c398e3d381ef53db375d1d3e8cbb5b33f0c54fe5205b5dc9dace9ca5c41f1fa38c2b5ad98aa665502aadc71379911ab8b7dee8cd2ca86666d3ca476f0f94597b7ef695d156d1aa994ab852fa8a286e021531c84c7e04f53eeda586ab388d166dcd9e5984031b9576ce39aded30deef11bb94f4ece30c7c22f36e670b6530d58c236d2c03b37f62df74a03c4ad5c73a3522cd29bdbee84763964fd64c2c05f9464f904a4f063b48a1496e0f03ed2bcf97ddf96d4c51602079a6cc155940556c5e11d0a758659970d1d63a28e7cd7fa235abaac5b74b05ba24d2e1b26030145dc67754ce16d792c32299a8cadbbc417e6645bd2c9488c5f5905c0901f470432175da0e19ef6855a165fc645aa769cb833779cb4dd95d5a58b30787e49ec3f9b6acbc14ad3d8233f6d3e254039d6975450f79cb4fcaeb7833f100bd4cdf8fff8e0f04396b0a42383d6b51b364300f", "5300ac52ac", 0, 1786612629, "371b3a0a9a964df1c71aafc793649b51f13c9d00ea2c982e25e984da27aade37"], + ["32795d5e0185a3cfabc2336de4831f94134f29ea3db4bbbe8ca4fe87510105486a7cc8d07f030000000800526a63ac650065ffad1c3a0417747003000000000865516352516a5351f057a504000000000951006a0053ac51650028d9b80400000000016a7e689900000000000363526392ef86f500", "00005252ac", 0, 1662367146, "f14ac6591a779adc32b5183147ef92deabec38d80b045fbf9da27e5a9192d001"], + ["030000807082c4030347c23eb1889c7538133e85a534a254f28aa597b0c83a3a9695a39517a4c33285030000000500ac005163ffffffffe64b9d8317e0fd34b269ca3d9c43bfff616285876d30d708c290f39e77d868eb000000000100ffffffff64d88b3cc8a2fcd725b2f422c84962d564839e97dc0195fc247bbe9ab44685cf03000000066aac52536a524e591720019521a7020000000005ac536a65650000000000000000037426710300000000000000000000000093aff5f8c85bae1cf4d73811bd0eac6b23c4899a695108381fd9caabeac3c9633e9e77ee847391f40375e43561d05d59b14bbc58e965d69fe1049776201f1466093b116cee74a672debe71ad6671ef0b7f70e30cb6bb1d87cfc2867f49fcd5f700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd67da5323af8b69ff48d0be3e9a5e920277225627c959aeb9e85fdca2335e91ba775cd2038328b43247620491c68c160fda536c1ba161a0abf3f668bc5fa623c552d61b8a8d9fda2e0cc6823807089f53d9f6a517d94d8cb134c9f4b256379b19b48841d0b67c8a47aa780d7b549490d2443914413892cd199ece84b6c93bb8020b9de9bb641fbcf9382944c4282c3c255934678c4b7c9abe40e1905dcd05ccab032d146c75df1fc430a8f23e7e427c36466b69ff52bef9b3a4a7e100a9a46b3d120a08995dfd63cd06d481b67ef63248a5dcf7eb8ee11c41bf36f67ad66475696b66f93605a4433bd31672e6616de351e3c8c6df340b227cd1224f20f88831c0e178022e396748b21dbc050809d931d303f3712b7402a20a4950182fffe775cf58950803117f0cc7ca8411985874df1c9d7e4c68c4279c8b0d490a32574d13be2cfd8f8a02085440c4474e7230ae94c7e6c0660c82ae99e8982e99d6a832a75c4b6fbaff8a021322d0c33b6e0f0d9d61152c784336a24af1e2ba733506bac8c49e531a818e420316fca5ccecb58a4fff52415d1eba886254413ea6d1482b1c67dc4ce0c4451a48b1073deb4899a2e95b7ab671d6b9c8831f858c25b5e2184d5ede739907a250c8d84aa0bbbcf6ad37fa5a1bcf0eae5a2e404ef3714d1f95a4985b028b2005e2c12acdab0a0d607034b2e787e64e212b46247d587f4051c2d67913b094876cf9cca0004a6e306dd9e5b7b76f38bf4c4de5ade5028ff10ea3320755842ade5ca8e08e607b8419fff86981a5a3c67e8fb6390fc76075c8f55c974bfb8f670289ee17c62f564f2f1d51a7e6c34de90ad20f0d2198cd8002aa63fbffb9afd256d4fdd784497f127ebf8b06d1b740be9669592b7762e5d2a40baac4eb7d3aeb6cc46760211793fef932c384a4b3379c38ba73e212dcfe61f2643097146c41364b08aea55df047499daf0787925cff8b340a6b61673e0f7465f77669620e50a1a92c777f76b8d3f2e31b93cecfc70bf9cc4abb90a4547780440ac4b3e06612d1015b3c0462900988c7da1597bbfd39f7e00c8e19783c1a8633b23d898a692ea62fe298f65e15ea8a3bca9e72c062b96b97fa3300c006ca593c34955bd78059ec13ef9c8435c17dcde2b3641b31e8124551ae0b6e456fb5b88bd2bb1fe57b13edc75d1267c16c00ead95494e9546ee0daf53b9ae8d2ad64b616b6bb8a825ba35d331ebe8b0e279ccfb369de28c93d1e6fef8389eee1ed0f18e755ccd30aff8de1168c546fbaab41ee8d3ee35e687e3535af7959c405110b5120cf418f5f5cf121426e9c0b9713cb1ecfcc6212e01971850013ec3370ef0a0d08b73b621ae8ee7e9daaa6397d8b918b29abe30de52ddc713a6ee66a8bc1b43be642c5854c7217d21cbefcca15734c887136bdfdc6095e8e7505d0066e30e0a67499e493899482f9c6fd3fccb298c6e3bc1795d5909326342ad135a6a8373a46bc9937ce55355d603c96efb9eff07bfa806efad36c3ee9a842db2e6b970dd8ae933b192eb57c3614a8b60a5058350c6736a7903d3e0a0fedc2c9132ee71f3d05590f9c81ba1fa1d9cdac284011ca46d4aabc0bc78990acffb292c4b91d42388cc8b6c7d3820158f6716c153f39216ade145db534673d305a67a61f1316989928113c796012e518440557032cd9eeac7309ba9c046291dbe99491e8ea32372acbb9282f6dc6a6e048c9c6ae8baff3873cb320a062c000e98e8d46636cf62234ef9bab179f5030e56594981d3f4bcc2e96b49b5b8626e26b02faaea7b11f8ae5fee654de64b66de2aac7ab768009126ebfc9c0afe0f83830ce3608820046ec4955143b4392c8aeff45039889de96b2cd3855e28192205133e0f9eecfec177fed817584faf97a4fb5fb5386bc3074f226430cf84fe20d0456269e6fd96496d9844507ed8192f901cd5fcb8579e5a2ea02a61d9d55ae5acad9b0266df5f153f4c50b1bbee8b8e8261637c3ee53d6bca31540b39f9b29d6c3708f97e326a4377b454954cbdabaf926ed9611d267676866b186e3d448bf1eb15fa4e02d8f3625364018cf1967f0e75ac3fedb0357dec8709909f260014e1d0551126af22ced624dee721b20724a8698ecd7b3a59159e80672b68f535e6dac3909d4419b552430ef2e5ee2174898b11b8c79b5daef6f1a8294bc0a53adc7b69d5d1304eb9088f1f1ceff513ae25349b679507de8d4822552302ac8a4e05a2e222b8b9c1eb17c8df52790df4630b52d661f1e2746b58224cfc86a35388e5ee029e06018cc09409a8522878200000000000000000000000000e806be0a19a4cd0526a2c3790a8c42fa4b556f579f664fae93f148db3d3d8b48d97ffb0aaf58d85350be6628185d2ce0b26847a1dbc4aefa519d1cc15aa0f5f5dee78e7c5975c16c409d906112e921f86bed2f047d3651ff1be9b984e9affe3c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006190c9c887d1b065614f83415627a4830cf1fd819e1ef295971f8176f3579f395861b8d3e733bf086217e8edeb4ac0ed1ea1c8049c91adf7d4e8315bf4aeb4e8e3d377493633cb943db6f7f78c9d6f20cb76654d62af3122bc7cadf6f7169a11b39d925a01a11326c8741345e632f67210e7be44d6f4531c2f66c1de847ed885020e535c3538777f36b84f82c529233071ecc5d55694d448e154cf0e0c246a2da30213f530d3b4d1f35b8ab2a0cb965acc8a187f82f4e615a7c836a2c3e60ec948e40b03aa086bee4fcfb7eae217e2cc80727dfbc6053e7d8bf82d40e1276f957893d01948762ce2e0af707aea1aad646c7f9d99bcb45514344c9fa79089cd5a986cc9020e7e4b7196354da526e707469dc2d35c90a4338a7697f2ed836c1f672aaf5f1802136cbbc35edd09fe5f41360ae9103117f36d590ea3ab4530e7b9c9a57fa23c16030e2395bc1c93e088f15545b9fb054e55801f4e0299c226142aecbdb610cd4655030300d5b01e34926b7678fb623d5067ee891b27345480c653db6b8bda9fc8e0a10204be1c91321a8a4370879bbcb1c726e134b73a31a02063141409e2b443c69407a0436728c4fe68bef1c5266e2af8f0a11cc688a287b96016689472cf7dbc99bff528e5082f333d69f0c86e795e318ef2b181e47c827ce8c737a62a4251b55cf0aaf6e55fd02a9c67aeb09523c490bd978726dfe5ec81f56accdff475a98213e8ae2ae941835783710440763285847af97ea223381a586463e0fcc17a30f5bae4a40110c5cf98534d7176796d49a67c6b77fe7cb0075ec99828477a353e3fa43d0984e8554fe7135e4a755e8ad8dc1d533e5ec40e544fc09782a8ea89e1dccb3ce1dda2226dd8fb830c5dee28d1c05bb717c5521626ce9484847030668ffa6d2c0202856f423839815c79cbff42f87a3a3fa57af10066bbc5559163d41d3bb664d31141d4e53ea15c1ac42bc69971c38ab06a8fdcdfeda264f5f20f6621b56c091254666e5fe23266e3e6a23b1e8a1b73484273803e2d87028114adfb9f535612a5915a7fd309171f719d569b1055a81d73408967b778ecd7b5f827e48ebaa00f46bf9841643936cf9a294f197a0e714edd8207a25a55f897770e162b56cddd2fe01cecb83779d71f64a5de7b1435d0515d1bfc4dc9df2f12cd0103fe030b13913b943e49eba6db88816b26ff6512b94bbc4b0d53f483cd173cd0894f659e96140271bbcb4c564e71390c0846d7fc3b6d864da3c1300b1f71b6cb3ba4a45ff4eca4bfce1ce13b5cc424d4b80a650b134b061b61e0e752f03d3851331c0ada81a15448a96e4fba7f5fecdb0de0257450bf671041e5cb7702c8c983221391f70f4fb4f694d6a39fde30040cff6a9b504218911b293118a278106ec33b507151d510fcf878a9e7106e132436670cb4f2337c9d4ee075d109b5a9459bdc5bd5a667e4c37c67847b23216d921ecd2612ce1197f7bd6a5406a864bcf04f6c2a4301831133fc125c95e3ed8357ac31b2edea9217df213025f60aa948bd899504919c7160cea1bfa02767a55535817fb7935429f604e0672aee8ca783a426a7e2a0c56f2d557edb88ac1177223a719da088b1e0fb1489216b650b3aaf083f3b5191b1f8d310fa1ad57855499e801b3115ece066497443dc6127d74a487bf7b48efb940422c29d194eec70e0fe8c75d0cc3b468c7bd9f13680c9734968308c175397e7c0757471f21dc9ef0ce4ee76b855876bd0cb4c6a44cabda7d6db1c66a44bb78003bb744127b8a6a3eca00cac3f8ff6372b188a5217b4e68200be81cd49c0876fcf6c441076b70f6a136e76f23d6af60642bcf3abd2faac9aeb696938a2e119eb2af21182a5fb335563ae7ac3c87d4fd8fbe7b2ba15de6b33b403d4f625272ce897287332bc57cb6d12500e32d327a5bfff2f3fdb40d949a3b2aa24c402487db0bf53e5853352004135ff4c65fe423a8eb71eccbb4c3e6ebea1f2227adbc622122f7684619c22ccc2f77e34f60fcfb8fd84e29e01be2ecddde895ab244ab34e35ebce9a0ed266ef4c59968849dbbe4328ec01a8204cc0f20e3e14bba4ff38939eb9e236e208e731aeb7dcbf22519ecc329ea242fea2b652ccd6a91e0e78a77ab7d9f8952a39bcef24fdca36e6612ad68a11157949bb18bbf5aa1a73318dd76390e5d10328a2da0f81d42df032134e3cc479ec2c8e2fea5b969c435c44f6ae642ad7e1e49b072c6f957bd8a337d576e3de762b49cb54b5687349a0d0c1c9a55bd07f61705dff80f6addfdbe418b0835cbaaa1e4adf0000000000000000e9e3a005000000007981b5c8a482fd08da59472f1a53d727e99161d39519a843e941a8a231d70cb4e26e63ad0cd934b4e9fdc305296af337e37cbac4770d6c1afbc71811f4891de4483bdae534f759ca40ca02716a8873314733bc16f8eb6463eca8b71c0144d46f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c8348284cb14d43ad92393f5e65c3615a7ea699fa0da72560f999cb74744a88ab39f3e03935d2a2cb630fda3b6f10e28ce2ccd09ef917fcc9f3e2960a95612cbeb2dad6d445b79ce38f852b5661a25e65dfc9d10015af75c291b3ffd2f7ac22abbb324b4afc880443e52a8c04aeffe6fffbf85ea0af1a11cf7890a77a7ca341c030cc4cc6509a0c301c27ade9d32d89959e8feba33fd59ef2be98d3b0ab223501e0212658481d3650fad8967366de4f919d9f97c99ec463bb78099014b15624a211b0b0221704bb56384cb7a17b8bb57309cabb48c41b1b026282852f319d32c2d45d0967b87e747751de5a6712e0d9f264bfa7e10be97c7bfbde98488dfbe97b0c85d022a51b828575e1b2c40ce9676f370288dd6b507b6e0caffa7fd5fe169ad23152a030d51d9c9a034918c5d922fd9c912ceb442cc455e448dd9371c81ec6f9da5cb3103162f0639857e00249fa6fd0ab96c02c55dd4d8c5825e402032faf1ab912bb1c3021694147066973927c1b83ec9188cff1487587d0b0badc3b02b1a0bbb36f10aa803048a14e26160dbf5238af9a25fdabc895275d8ff3ae3da660d3a6d6c8f53d8d429300dcc02241db68fec8e35a8f6a74d328a91b4f960b2b8fd53ac07d4bf530ffabf8530154d30e9511496d9809d3460e03e69c4c5dd494db509d3287e20bf6a67025542ebdd8f6eee3703e4ed2478eea8c3aaf21fcca5ef3b7de249fedf6e2be3adffff529e5f5c4c8405721266f7c8316fb5f0903cb28b2dbb736d43d245ef4a26651d057ce4dc65e5a10a71e314981d4bc65df03355ce5fa2577ed7aad4f3a774ecb6b9b88d16eb71da91f057fac58291448d1be60357da42da1519045b67078a55165411c600b8dd81c57365a4edc805aa37935b714e4dc231453de8bf70b77f1fb3a5f5f39b3c325a1b43ac77b790219acc066bf59820be123f17e4268ba8505fa912ed60da3eccca1d04f5bf2de564d136ea5ef4893f65c88dddda8220971e730c6f62fc3a37e6bcae79ab7b2c49e75891314d2d44b603a26c0dc234ae1e1ae28984f371af04a667ed2a8bc4611b1770e6638314b301699082bc7230dd36ba291a9b507f431ad62f63660e83e2504cd11d959c4568d38effe67662a131118b69d5f77cf77b49d0db2295f1753ba1d0c20f3f470813395708b8072879331ac421d078a0e5476819079a872c9652f344e2d1b698267434db16bea2f7bc713a53aa3919798739ab2d6105cd1cfe5ac6223e55cad8e1b356c5abd5bce75698cce48ff2127059e2c635da752202856b488ad33023d75d89cafcbd59dcf4e8d20b09704de31ff79f0f5a3cfd98a4c71fadf07cc35d9366014e51caec217ed5a10e5bb4c982cab616779555c4e00b333b65f1aec1804760e7a6b535ab3050e48caa5991b1cfe3fa5e8caffbdb780f7b58e4e0bf299ad58476d08a869a8dad4ddc59c044261a93b94e0460037908175e04daea76addebb20e81718be196f709f9c3dd337181de3b4cdab15d920400b8368cea3c8b8f26f6755a62f1c7f31cc32c0db10631d3b1971239ba1fa5ae16858bf8271e47f6084ac038b39cbf4e4ca4bfec750f71006482da453f352dcd8d5d4318bc9e021b7eb709d37c055c69503cb4e1389b3b7efa979a936f8a6431949eee224dc30ad27066ab252d28ab263b3265ed9e8d9bd246d705670cffea943b6cb45370a88e5a4b09a627a378ff3cbaf56485c8dbaa526f622dd100831f495d985f654bb68551a0019924ac307846357fdd53e84e62982a18d1127b56af125903f49de5eb03846cfdb7381a8ff38e7e1c4af58d81e59004eed49e2fbd80f1cf06e1bc825b4c008cff5f3a8a479a5bbede65d0fa7168fa010e098d9aaafe786d1034018f33367f3b72ea79e4b03fb680dc44451e1f44430f0687cbc8cbaed858737b12e5a07b4a4d3adb553f2c7d7ac17a15ea96003059785de50289c93ae5511e462ecd5dc18fe8ae14b580b71b6954ec9c89044921278f969f0de46611724b47c426d37b3b3aa72c82c684484c11b1b9152e5b552f5ac45ff97637efb368ed9744f01238cb252504020bcdd65a9266e36bb03d813f8cd4ccc1f6de312b10bc901cbc21865586a3b7e59cddf3731a2944a0d6c425d999ad868493d6329e2285542ab3f5dbeb7cd15c2346f7af2877019c749b945690f69babccec6f17a0cb21ee42e972382271af5295a9c378c10718be62a473707396e29431dd08525439697fb8505768dfc6c68064aae25b7a894869a88faa1759160ff1b1a3f287385aca5a30dca865ea436b0a83925e79645fee79e41038635e1b5daa8f6cefd37ae877aa0d929dcac955dc3c6d1a1c8915bbfe438bbf4b3985a0aca4a97ce0e62e289af003bcd77c76d1e0bcf6aa57097e7393f3c1f581726710372670ad394b4c49a249dfb9509", "65", 2, 497516486, "331f07608e81e38c5059ef57cbc83b6ca0462ec41887d3f6887b50e16570d9df"], + ["030000807082c40303d9fdcc1b243a89ad9f942a4d20127060dea73098f19462c04b96f536d455b4580100000000ffffffff1aaefb7494db9145c1d4aa64f8074f9acb4d639db43937664b6206bc50193495020000000165ffffffffc3fae57cb020af9e6ab480775387c95604ea915dfebc4931b77405c47e9cc4da0000000001acffffffff02a82dd904000000000652635151526aab98f00500000000056a65525365000000003b5d4eb903000000000000000081d3160000000000b2db9b792c0ea2ba1b9ca5934e5a88b46156066edea28f9e8254afc4f1576f540da73f691eaa5f53af5c4b4248a0df5b23e561fc0b8cf415a61fbce280a7d40d1d1475b5e8d8659427cdd5a8abf299fe3077dc32be911b1ac3b6289fa1135ac100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f895808e33c9b9d586b71c790378db3e8514a102a6878163b6b9f89ff0f9015f143fbc5b44ce3357011dc8a3b4e1d7642ec8275acf8de06f251c8753e90c9adcdb1c1aa92e6753137012b1186dd3ca1a60a520a53173041d1c178858e524d2a877e3e2314e51e7318000d999318820598b0135838eaf4425d0abdc4c9a1901c6022c66694e8b5d7e31a4905352603509502ce621b90dec411c67290e7dd213cab3031646e9d65e06635b07bcfd5b1e48fddc4efee1b8ac1729dc0b9c5c01c57492170b090c25f0a26f433097f473c3353ec7ec5996149585abb545fb2468dffbc037393ced8c8120e432e4d42eb1452d59165e99ac1ceee6687fa7767ac71404bf91ac03264b9719ef0e0d82652315feb32133bab585bb4fd3be527be403ae46efc3ba64033052eb0b8620e4c4aa4b39164fe49f09a8ff5f89c0855525a4e5bc5fc17da4e1032fad20ace982e906666af411c74f2ebe1ee8ea40eb8a3d72836050064ee89eae0305e511715bc684b03d1cc0cabba6912ce60c5dab27af91cb947755bd0a283812020b97058f433e1e8ed38f81f29f70aee67387c5f944ad06dd8f66cc1f341afaecc0bac13e85622c5d8daf7af6321b647fe110b2519f39a3a509cedca0d84844f103a40b4c5c034ed7807e2cd4b6ba88a28f2f5a578621119f95f45cdf71c929806ab6dec9cedd4e4c710721246310d6f4930fc7c0d8f32583cf3f68970f4e0270111dcf557d464bff39021d1791528e02c10dd49b6c55f760af2f932c74a4fce08451fe35c267c9c2a7e7a77d3d7e301d3171c85e8243f61973bce109238624ff4da3d9aa6f96540ce14488cb18600a61763d86d2bd54f2a5e3412f4c32068b074be6d9d4355d1014606c9bf9a96c81a783689c235cd74504811d42743cf8dd3d4b09a70caae1c9e44875b5edb8fcd31c808d09e79c5e5ccacbfeefc4b5e81a5ac064bd3b992a099aa6a1b78ded750bb558c8671e5463bbd76bbda59332463aff1bdc37026b8ff1e2c04ae3198cbac135fdd21be089372f3d907587731ead579a1a3e86fcdb5c2d4424ff829553f419e6d94a2b83e721fcb9bcc600e3291992ed523a987e16b4f37f8cbe7cf898fb15ff7c4bc0b11b908c93754381b2d204eec21f1fc10d32021053203973397017e52a48db93ff9d7c20a313f3ddb767aa121b9cf73a8adc310ccf216caccb4669f157b15731ba774c841011ea4fb6df8bce95605b140754ce28654643fd7e158d54a6b05f8b11cbd1938004e85dc78323441c6fed569f7eec428751f4e7d2d8476a2608d4ed923a79840b3789cfccb6ae82898e95c70011a7ba5c7a0a4edb79312563a6521f872b8f0146c9aa385c7667120fccf2e1587235656e4b953926b2e5f77a06613df690d89c9ab13cdd2d5eee5718d7d1871718070a7958fdc0b57b3d5b721f089af32e301c212e203851b13f992948093dc0f7da6ef50aaa914f66966de2d952ed1868951b866fae9fa91ef172dd11a13ac51b68164984ccd0e71440fc16a41ddb4d5115abfafd9adfa7cb9a53270b0db1b0085bc2f2c851eed49cfb17d7931222be259d986ad6cb355d803c4cde22cc096fabd63118b78b4fb3e869367a993996d8ec06aa8c016cdee27914da9a8495ab54d1baaa13a0fa61aa424b10333d7dcf449c6ae6ab1a48984a1da7610c361c6d83b87a1f38be38a82096fd4b3a1300f691dea27284b3304ab201bb0e692563e0c2e207954987a180e1b2bab84f9bc2a78106c999dc6d92db3af0f499c74551f191e12a39b9b39143530e9a7e53c1e12ec5873740b0a7e8f93f61a70b04b99bf5040ef2070afe7674565e967b23ad3b17cca799310c197d8e03adb7c54c09ef6a25a75cf2385389de85e483be24b3f1102aa93274de4a9da19eb44cbd24c262328218c8bed505ae6e5ce0423540f19df5987f4eac52c20f59d5afcf3960326c04c8f2a9420a8440bdce1d6fb05dc4b191856a9d8d0d772ec492f1542ee308792489388762e1ba3af7154ce5f4fcc68b11edb14c53ff8b9c7a02bba66bbb0f2ce70321c2eab13974781c0acfde846d0233a4af5417dffa43ea8b142af3a4b3e558da31ecf9a452ecc81969c6cb90d70c8b4fe3b1336eeb1837af4c5fb7bddef2b23a7b81d11db578785824f537ccfa110bc92a83f8fc0fc2c7f85b539f031943f55dedec6d07662bf43c7e6e28f2340ced26ec0908b597454e7b1b0ecb59abe073b38dbe332575c3351fa1388019428692e28fb80745c82953370a8943d3e1dd11b6cb0c493beac2b582cafdd5b04aad0000000000000000856d6401000000007f6333f2b4e54019d566c0068e46c5c0e7e3db5bdf9d6fe81173adb624f1ee092780e133adcc8ddbb72563ce24c32d70bd5e48745119891fcae933f30b73fadeeb7955197adb5e5f8cd072a42dbc4b20ad6fd39d276748e102eaad9307ca64b200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000890bce394f972d9ab98a2168f482d00d80c5610640ed83bb84056882c0bfc0d6e30c70feefeb77040556680b6bc2d0702abbd992d9e249ed5244a626df77b23b13253e87def7ea0f34e1aee21e648152c2fdc0b8445b900d291b227ad07ad1d4968699979088ab629be920d697389aa3ae822c0e8e0364780a9792e36d1acacf02085e0061f1f139e7ca43b089ae642fb46eb52ad3a8a13a2b418f23ba8cccc51503010f96e88b546dac329df535eed5915fd148b3d193a4b44b92e2e7f148245cb30a02fbd19fd728efa8328817f26e4f4d0a8d679d9a23265e22e5d23bbd9b45277167e0fd45f38297807717aa17529f83f8982c4c32ea0e8de768f8b724b79dd802021e932ba5afdaa7b0d3257eed1a9498ac71003ba5ac0f769fe1dca90c6e36660a0306e8236c206a80a6143d2e0f46bcddc6f81a206d93d5e4ad049f5df4c309cd63021ee2341e553303a08509ad96673f4fc25f142da090bcd2301cd72a17e8e234eb0312adfb040e15a674f33e72f083539447ada6b0e2898a3c5ba7c13a484f9d734a0211db4df7e36028ba421d6e96400d5b9579bae52aee4729eb4a222a27bb885854745cf29d4d7f01b55a18a1250385d899bcd0359dcca5b08c945a479f388c54fac95c3407d8c64d4a905fb77d4479bbe7f36bb5b2543aa6ed0afeb6f373683cc3792d35fb403d71776ff5aafd794d14bff146e2fea07d14528c1391e6c6e1d72492636bd72e570df81012910ed672bd1d760edfacea569b289ac76cd8fb63487374fdedb421b8182b2663711ce51f2aac7f522fa50c023a6b523d629d0ec58b4c2c665fb0566ce5a2db7b8f2c4d6a4bb2493b3ac048d9b113325e02e99658d62718383fc324fcaa6a9a45d7173a9a0db4a1247d046e1b1ed1227f40fcb0259ba11e1dff3db9a14102f94636c9636c9c731ffa2641b59e5b33a1a81668a2cfaab2004e4440ebdb24c8cdbb7dd473ab15a1bc813f3a8bfcf9d1484679926365c1c7ebc107e97db22d3696e2c0590db55615c68ca9ee7e2d96d7154a06b110a5b9e886829f4681f457e75cad0391393b996d9937554577bea8f9a620b2e9b6ab0d2180c0ac6da7dfe27075f41069cb5a302dcf60e1505d9f8eb5533737b37115ab39ba4b5dc96c869060eb54b5951493ada251e9e287c4c8e58b85ffc1e93e8bc51d7d990b3a45c7f0c2cd4b1b5197fa6d7988e9a8971da1e16d14df827c34695132707f8a7a1d1478ab552c80629ec4e39f9fd9408b8edbdcfda738a3c691a4d81b09d5a32b2f06003ac38a949e1113d5a8d249296a17a12dff62a2f091582c30d3af17435c4fe11a9aae42212f39c5ceb08b6d5649b05f71f9782e91f039bed6cc1544139c26073bbc4956ba1aa4c62c70e9734120a2c1da84f3bc18384b0ea92f5b3fd07881f7be41cb4fc715cfec70dbc6492f9d82b99c276de9b73e7bf482783857b0b195754f34c586563b88da39c2389cdb0f64402ce6b8b0e131450abeb09cd8897be92420024b18feb91da1c210200241a158b8ce494c957a94150e042a4dd1cb23544f3d32fa15a83b3a946fe2327a2f1f003662a42cfd51b047ad03ef818c806282da6539b95f23174b4908be6bfaa192f87f1ddf275b4282206cc4454aafb2241c1077dc92dc0630750bb51a28d1c3a23f3514303bccc93a65afbdda4d03437669003eab8fade0a9443969a10374832dd8733b42d24d83d8991bb122ed971bf2302f408a0b36bd3cf92710e2e3d6922e4961743ba62e1917b24e03f58d90f477bfd84eac785affcee5f92dd33a22a82927352b5e7256f4ef1eae1cdc2867c76a327aba3dfe96915fa68d7507c182f952bab12ed46b9a01bc0eae5604273848f177cc477eb304e5ba96f9d8c971c9425bbfe385933f157bb21cd4b8e34737108519fd29f5ba45ec4963c6d5e50b9734ea1604ba8c46a35bfa86873a9f062bafd997071f2bcbbd178a9eabba7ef1558ee09700d557e9085dd868298d2685f1667784ce88e689b2fddd162958b16e827ab12b22bb74768df4b34d405a43e53815b163eefa0f78b64b4f1e753dd6769ae0d041de86cba46deacec3a1a9602ee68655274232d5aa5e40ad41f2c96a2418b81c60f14b3b4bbe0b8efa75803086d4904a71f9d503c213d5f37340889c409dd8241ad4573a6bdb39bf9d4eae6f284ae5ff444ed6a6c8c1f5e3a563d725b518b09fe2ff0dab4d4810fed1f4a5b160e30d76c4e1c9c33426c0763240edea1134ae2244c320e1fd287ea4f263c78a54a1382d445e4b28d871f94353f28c504604829712040000000000000000000000007b4a9cac9c4e1717cebba5a097029590faafa73db467dbb8915acf4cf84f7e5b0b562040ba7732720bd2c40a2e345fef3894f82e1c72db4ea3b91bf4cbb2b363e4291deae48f923671a5ace73b5d48380bee08fa71cccacfd666490c2c4c90af00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c8f96fb6a618501404480ddf0074d8654581558eb2131e9519db5801b09de173719dc9670673acaab76d1065d3371d7e26538b0294ea38ddc6b1fbeb8121e7557f9527474e223e960fd3e385ff2074d661702567c0ab51a2ab89db3f60f4d35370c4261f211b071172837c45de8f1c3ec2da8ca68c110fa3010f92060f9d6b3e031b986d6ca0803d094e2e40bca105c29a1e46a34377291dba38f24f02e6b23175021537f698a71d6b764248ce00114c0dfab4685cc4b7b35c13b2f61d27b7b50c7f0a03e40349c830a90b697bd33b58b8c59da1c8bddf614caa0525abc5551e6fa8bfdf2fc55dcef4a4a6d1a899d3c3cbc11774a13c4195b7691526802f38ab170d4d0325368020ea7343cea70b0c1584835d66c1001bf9a9fb83acbdde38977719c4dc0212f00c7e047ed3b0d8adc0ffbb1ff4bf1054e5c92ee8ac1897bbe6462744e7b5021c6395804eed6621471d8c744fc9149de88f8e8ab9d41d5afb2674f3afcb3ea6032c61224b3da8345f6ed8cfcedcc276074752418f9f88c740641ba5725cae0d55031a80fba94bcf55d9e48fbe7cc0944ad977c4bf5fa0189130b0036751eb0f65f3486bcd59c2f2bbd1ca7073e86f6c384f54914301c3816a154f9ec46d15b0330297354dc668a1a3276b6bf697b5fd32a96ddeb27b4ce23c30714565bba7b2f4e24663c190d80c4225ac4e7c67a84b75a6a94b49e6b2e4fdf2f3236c33e79bd7c45eb5f0c5b36a652f6dc32430c2a6f8519120cbfb5dcf442ed47c7196c2164e7ad807d075f0a28b3978864784d108147938c282c8089f8b2042999ce75238cbdc9b05915a6a5e08a43ae47bb629dff970afb5e5f93f0a14dba54f708aff230c255b78ceee7cb4857dd74aa16c5cdbaf6dccc73f6bda55cb4542d4ed49ad4862f4a02deb756e50086ddc9dd52190bd03349e895566e528561595394cacfc19c9d134fb108e4e052d17c55f86f0c7a680a0f338ef6ac2f0a3cf2c8630f1fc33e8aa1fca6674f7329728248c5861e8d624ee52ebaf6eb46ea1bb7b7604475ff97db98923050378ad817de91cb1592d671cc8104f1bb392820645fe29ddbfcd74a03a4ac0ab2d52e75c2959eace7116ba35e2f713bd3618221d50f3db857b8aeb30567a7b6de5e762e34d84f97704f097cfd73f1374fcfe6514959bcac707562a5d5509b1a94bf888e323bb58c5ce91c361237bf0abccdbaa90fddecb596a69759c165bba9d79c96c9251db873a64469609b65c5c2c8a4350be020c569c88479cc145f4a0b07e4796aefcb4cc09f8cf15a58bfdb9949245aad296a8fd652e8ce961f3303d2d7c9c81cd3802d5cadf0407dae476cad8fbcf187207458c8c064d67d1202563308bd1e806e23e6ab1f7ba28af8061fd792548f11c0b4a24fc15b459e83b26e14fd5909300d40c180d26a5177e68221984c0038c06543f11126c048a0350e233daab12a84a66de523dd1b36e720563b4d9676d3c8cbce356bd959e896ffbf96dbc155991a626af33b76f8ddd2596909e9cede45136ec80834059d2a20fb84ece695aa5f1a2a6ec3834c10ec63665a26b3d3f4116238accee95c71c0de56216742f5bf6e2bfc15176578ceb42c2f010bdf4273623825ab92cb3ed4ee2f19a2f28b27b53ded36ac1f0491d302641326da821db187673c7601fcbb89d737ef98a2730e09454f93645d4e2498073437541c3906543f986493a7539a9e7dd973c716e3ec405348e460229ff352f1b1f9cac7667bee4eede3902888ea7043b95f17abdb01ef15bcf73b71f885ea2a343f9d934ff8dd9c2580a98d7e3962f2af9031e10800c5a6e905c3bdabe11400099c7b84e65b2e181891a0cb3c399bc5b25920bdba357639f4a53962fb2c3d47ce040083854d3b4a58d35cd4300c8dc3a566998d66199c1dbcee249aa7acab516c8de730ea4f5cb588df3cd3666278e7fa5c76c09a285b58fd57f0664e0173e59453b59545e21fea1dab201fb80dbfd361c4811d5110dfd7b31191dd0cba285b889bc7d8bc739eee7fdca84bb8a28b7674359a4fb9cd5c7809e89c3619cb183c56d905f50f4728ee7867740920cf191c86bb778b63cdddef898177be682ca9b22c35ffe775b04b16402f318e2536786d4ff6521037be6ec8c21c457546fe8556bbc255392fa3f13ff79e3c6b87586112779c8dc06ddd9ce9c0891e6c823d6e35e5b9f5b00ad13d0a43fa54e62920f8d602502bad345a5244550f1440fa8cd0f5bbfb86794c84c05920c0eba677e61f2816963e609d1524bd3e1f562175da5434065590dbaaa8f8da9dc8e377e5bae74ff0bf03385b6434449c2b30f68b56fb68f18742a787a81a3219989481fc0e386e9589ce6755fac8b99d3830e0b083fe04be58552ec0ef9eb067945f353b70015f2209d4b70ad658b29fb2a569fceda5503b5af160d", "ac635363", 0, -210674011, "dc8e5f7913900e8915979706c86dec560c99cf0bace9db9f31a8ee9456a65bf4"], + ["030000807082c40303f4b499c5764c02138fd1450e654b9e957f3c6313d88d79a74c539fd27011b6c500000000076a63635351ac65ffffffffed49f756b3edfb596eb6f498c56aefcf6261259845a7f37b950a08e911937e8901000000085300006a636a5251e6205a48f8d197fdfa16488ee3ab8291ae7365cffef3e77634105a4e9318e64c9764294303000000026551ffffffff04d23d3b000000000004ac656a633cdc16050000000000fc1976040000000001537518e50300000000080065536a006365630000000000000000010000000000000000ec338e0200000000b4e70fcb010d4705bd1716fd9c2ff5e68714c62ed89953cfbcfe66dab53b831b9de3742d3cbafe687fa2aaa62e68dc361c7db5dcd956d2c1088e36bf133c5941ec5e667f055de0996ace9da6dcc77d1fd0b6f8c6d62897dc1b510a0650463f52000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003dc67933c387f0688eb8ef75e1798f706317d174615203d5e36d74fd2a6e7fcbe7bc33eac8002823e0aacb06b906d9b766c255a3dd0c04af2e6ce074b0e271bf4718eacac64d8a775216a5dd8579da9c64becd2a3bb7eef3bea964a91b4f115d53236724fcce03f3d74d57ed24f3d6bbda6b21dc1dada3468fc2eefb937b3740021c6da71b6d1e3830f43b3de8822db5ab16d80a2080134599ab17c7096290dcfd022eb083f487a6b2747e96b0c8e4bf6723a371b67bcb0c4b5df3ac6e119772efdb0a06850ee497a6347f9f723eac16a06e3bdd31aa1af839b86c9ecfd070809d2f42f9ce3c8a79247f6c4aabbd15d662140db454da8184e790a54777ec92abe7633f03059bb2735540f6359363be68fcf1d265d3756be162c6a4a2d140b1fdea1f039f020bada31c4e9f48c8aec4d36b8cab13f301f8896033ab1bb51ff16eb65fb17148031177b307538760c2c689b577950e3df67cfe05086455c364afb70ee33e250ce603147fea825d94fbd6ba43d4cb50487fd56e5729b8cd0010d9da40824d26cc0c500309b4df6266b103be257550b25a901f35c1992558c814fdd74561f474575834be76d9c88d8613c2bd12b16ad6f56c6c2600e27ffea0252aa62481324c3568964e3a3a75f7f54c63959079c287c14f3d6aa058b3a859448ece3a3c6eff12e6119e7e930d4d8a17b6a6221ac5ab6958a51b9d51898cbeee25f948e93c131baddb5b640eea7c8570595dce6a4792164a3f9ef1b73008d14dfbbba69ee4c5902836b48a2635a38a8feda296aa499a6a70e528b44cb9702d54530c19c079ab428ed48442461be3627407e256224165ea53ea1209af76218672aff08b5de11e560eaa0b9eebdb88d58d6100f40412c9cc87c1abaf28130cb58427e8425cdca3fd21fb7a27999042fd9471f0150e3d6b7afc1b0840a369b512240e90c999aef7d4cb1eccf70684488cb5acd1c3ea59e816c9c349e207032bc99cfff715779835fcd92129aea1a6c3307eb9854fc091012cd44553c0d0c3dcb36301466d1855b12c0aff56c50562e5113db714a54336871ecb17607796ff421fe877415d6f76886b2e48be199b9450d6001bf9022a146b692628ffcfd4738bad8897ec64d0dd1574bab8c5119b599f743f27b3671717428ecfccd43f51947513472bb8ca7a8a5a3504d91d6fef55cea7d5c3da18af1f04cce1bd99827e86a8fd6641c58b7338198deb2717845c49546cd061a8a5ceabff2b4ca0c180836025ff48a1ec73c0869eff7f466c91dc4a30bfb7ad99ca9814bb0c159fc3f975cf69ecd1f08b41517a38a8c8a232c54ac8128dc7787573e739e6d283339788e6a2216305899b26667b85dd3de6ec11f825853d4414229f1f66ed7f4269cf4ae753c44ef342652f048f42f3a676e52088210a03f31e60001eab7535a6caa786fd6d0e8f589889c659c9930530904b3e8dc97b15742df35a64823237c5c6e0583fb31e8f910b27b07bff7fd402244cb80e5c670fd1573147b1bd34ee26a7a9376abf698aeddd8fb5c32999bcd7230da7967c2ada884c43973829b421a94ff310e2ad39e8e34633669a05b35d6b0294e72adf3ee9ec211d8953ffe4b2d7ab7a6a0a0bb7269b316ab0308272207c70a212fc2b106319cea389eb69156d4d49456c58ef46755e60ee262af07ab3a3e142aad2290eb6584946782dfdc9eaee212f15dc8bb6f255e0cbbefbd8903d07c57e2428e651e79b6317e60f10a200fa7a36a1e8ec0348cd70bd87b5865771e03d1c9d64a751500f98d2b83e292a5d91e92a6c7b5d45bcb30371af38ade06a4e5bf086740601da65efe0f52711adb3ea7e560edb26ebb34e222ea7057cb50a86851d84d5df657770483ce428c26b37b84e6dce2e2c524b55d52c896f98fc97772fa5134b36918ffffaa9d714553c3e3341df26035512db5c8be14aac3c4eb658103de6a77cb32b1770dcb971bb6947dcde088fd89811e8850ced351939206423e5ef80a474849a911b2ca07f03beed7d224a190bb1b780914c8c1fc25df5232cb0a50322a3999b3e6b050cdd19766cc9c033a3f1adb4870325fde2e7117c07a4bac9cbc877adb4a4a681ee54464d3ce2b6f89b97d579af4b46df2c04ccc3d2f5e71e1921005db7f4ccb0d31843dfdaa7ce377bbafd2428086f9ddc5a345aa2880232b56588d6e1a7f43d7db53fa0a237035f80389cbcbfaea44076a01260159e1d5f530cfbbf709d31c656ebe6c3de733d64793f0b065023b9d1ddc18c0966937af9170e3e8b9a717c4eb26e724afb641e90949496e4368c425038423fe0742ad5efaa8fe3bf7af38a4be55b7dbed60aefd4a5c170ecc722b5f025401e6b83c1112b398beb070fe0cf18dfc9d2f49427a3878512339dc59fa087930c5d63fa14ee1ee631d705f3f7c2039e94573c59af72c37e02", "525353536a63", 2, 840246195, "ac1ac76aa88df47df100f8d6ac92c120e18ae55b2aab54c9534d696e51c8c2da"], + ["3995aa250464e58ce96a7977f1ef53426d6218250c71710baf57b283876323cc02e1974312000000000900516aac6552655300ffffffff55e26946d8632bf6a04df245e7322a0d559b313542b0ff6078c351c0ebc281140100000000dadd0683f75541a5ab66440c0d054c3a2b31c314df9eb593faf2acdf1f49fcf1cfa45b7d030000000252658776e0ca71723603890b8cff3b549424c7086cbe569314613ba4a4a64fde320a39b14436030000000765ac0000515365ffffffff03bc7525030000000003acac639425a3030000000006536a52526a63bcfca5020000000000000000000170cf5d0300000000000000000000000023a49697dbc33ba319e50bc0465048a624d8628ebf60b548cf35aa2ae5b8d4c00d4abf1e4d5594945d1a7d728aa20079593888862269003f064760fe0a5b14dfa202ae933aa1244a58191fc8532e09d5bf62514a136101ebc0b2a631784d2406000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006756d8176a0944efd246bee9211b598c1a934e3bde8dae281d1e2e00db6fcffecb4dd7de015f71e82db115745b66d3693a8674e4bf787ec3a86e5e6c4e9d77447a63a250d7cba0917a808a2166d65eee3ff3857b6c3c5bcd942c67c11c5fa085713e005207bbea5b09cc8bdb1261efd057831f6669a2b488da6dcd669b5b952f03056afc39f09fc15d2f8aa2aa9b3626a18e82fa1a70567ef24e3ae6eb41da4564020dc1f79f8b7817dad5c752d108184948f34a63a44ada2f464baa0032b25a7b000b037b6c87f9688741221c9ef79a2219b2d8d187e3e8891cc69b12feed7d6f0ddbda681ac8ab437a9dd60273772555cf59114f0164a82d078970f13a9b19245b610318ac6dd4e49becc511119590394f42e8433b7fb6aa107a210476b1a577125b2e02032afefcb530d49c8d437cefb6a630f1bb8dd0136d46b0db770cacf56953fc9e031fb748c30feee3df519bc18bcc10c436a2c1d55dcc91ad8068856861eab6923a0212b50e7307870387b0d9f8486694ab60efc02b0b3d7474e543dad7e1514e5bfa0313ccd51d60112f632d39018000d93d6ea699108066292787d6cf29d311b0ad9dd67da680498e81ba6c64ad0026bc2be94d7886f5aa68af6ec36a9ddd42c7576acb3c7766f013134d679475c1d59bc4b71a2fa815d9aeb0926ddfebe1e14648a219f80453819f2994c79a37038a10f95ee9f33ef5a9d174b9bcb6e46402ed03acea8118e864c884775c72101ba0021531be18a19a9d443daeecd5346ceec90fcc867721eac32c908e413c82dc2fa6e184c6f71863039bd2560863193cf4c462e0f729674d64d35b7c83158a94dc993a4b7ccfafa18670c36b408899bf8c394c1885d26753648189586329f2e73158997d3afd982bcdadc633f8210f5655c7560ab67c723af5963890729f6b759b9c19d0f2c7da33b02e87a77e2db89d2bcd79b3193472082b9a80523522293a6a8d22a169f1110f73f05aaf52edaf7884bd2570f50f667ef8db1fd431b0d60d4529578c2292710da9efe047b352fe246abd8ee9e94d490fb3269da086c394a174cefc20c9a357f79c9b6848641ad4bd8634df0fc1332c57422fdc0a5346a45f477c41ed5fddc2b6052d1cf360e8f621b5e63db3364bb48aeea47a319267c5f00c4308b4a6f3e273a676f07bb70f23b4d374f0cbb5f63457ada7f3ddee0bb8703cd57255e10e8cd85d23bf2c7bb7e3c36517b82c9001e77613ab1e9d39f0d103985b50e9dc3c02682f8b98fb168cf386989ac44b073cd0e1541c8e21cf42149bdb6409a08fe9fa1a950e514c6aca586135d3c5eca1591492bdd594a2ac6b0f291c336f07d157425bf12129dee22a64d1b53e268b226dc1954b42ecadc8c14bbc68c5637eff7c510c8a4b141ccd67041ce7caabb5852ccac8208e7591085d2f6ea745dc23a98aaafb958788631febd6f6f2fe9a1d023ab79ebde098162a1a00e11a44442331dc44d95643ccd826a87a7963a52e76110b04af7a343f072a900bc29fd2608c87833d793dd62bfef2d4298863e432278b7eed751cf4902c459c1fee23ef1e12477273f86ef3b59e93e5421901f21cdb79429b8e1a33ceea13bd752d1b5312004b44ab7a8218f941ac1df84e3f47f39b5d66a6d9002669a78f33464360324e8b747f443db1c5d6f0589fe75e2177be681bc57bcf9e8456808bab3cb364cdf65e0c5c5045114efa2dc83e562534c7952532886f76d0a4df3b9e365dfaab33595ed0a6752af60e460ff32127c2a88f42b2f2232259a12222c230d5aed5e634832905802fb352b592782f2a116e28bf0c35c8eadbb8ce7050ad8117ff7eaab8340d8ef87f289d585f51c405536e306cc4ef313655a338ae58f5bdab7d75ff558200fec74e4a6b9d412a06141595a94fc324722b2746e6ed84c57af0cbcab71dc427c8b74ac6bf55ce11d2164f6f5cf1b5f1ff016fa32e3e3749d32bca9d2088cc38adb7206e25a1331f093b746af2f352c0a5dee95855b45cd95cb90b30c0ff521ebc9b4467fff436ac7cc41eb8bfc11ab1c9ffcdeda7f87b9f0b8542e99a4779c1fc3ce61eb0df642d2abb2fa9d1b75a033c2b378ccdf578a672365835333fd9c220e7b57656c20aa353f77201f955e2db6f8f0725a4cd65f17123b20c501b9061ff276f75d9f46488a84f2a5a70e91a308717f8b0f94ead7046b09cfdc70446f9d977680c7babbc9b7c2bc34c9d62005ec3c10f3f69bcb4db370c01d6972d2a11ae91288b53668450e08f9eacacb05709f10c57465782c6d9d43cdcb35204112bdfc873a89ca1a60a9a4d3bc7614a447e8aba91fa8a7f5f6f7e2fc6cbf666c9e3431dd87a2f3a53c262f9182ea739f3cd4f05b86c5fd260638b013b29e90212f18ded7fa81a52e1508fbfda85cb2904be68017c87608dc374528923cd341a863ee803", "ac0000", 3, 1732170039, "bd6808daa2dc458a24133aeb12ba3b5e59026231985d3d53acf9ce3f8b1d5d0b"], + ["cfcafb23048cf4e0fee7b3cec11c1b4f8c27bf89e051c1aade9e740df82fa989c9164e8004030000000004f2f1d04d69c306d0298d7ebeafe40ccb0f620cc3baa35173cc44a0e4197ad11b7519d50000000007acac5353536aac6fb7186201cedee43fe5ae4da2a58dc9dca3fefdbde43a12b4db3e9d89f71683002a3dea02000000026565fffffffffce29580d8dbb471208d147175871729ed1b2ad3bbd4a1589936119c071741630200000009ac525263526a6a51515711becb042e724304000000000863656a51ac6352004500ed05000000000100be018d04000000000100e7e60f03000000000300ac520000000000", "536a6a", 3, -736151693, "de7aa40c6b42559382dadf56b27f1cdf550fa220f72ab5128b773f66b570bafa"], + ["030000807082c403024790bf93b9caa04188a7ebe5e57eff18058f16d8c33f1578719b086fc0198bba00000000096365516aac656a5251ed33d9e527bdcb9e675d1a71e1ffd2860694f6aff0a1f91230020d656eea98ffa5a9dee303000000046a5163514ec6af1502c8f8ee02000000000500536500536786020000000000066a6aac63ac51075ea84a6be9653b010000000000000000f2cc9b0300000000638f9533aaf678c6479d886aa50b42cc1f7aa14408afa890e3f68dcc4e56fab424a21129de1ce8f53b611971587ae6522691e5918ab4cf8419e667c083902059e3c5a0c5551b350a4ac691db86388440f367fe653e9112c1ad7e872da3a6d9db0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011a5e5f7e9ace5ee63d757196a3326b1b3287b05a421577bc00a71314f3b276c1ec30f47e97bdfa24913df8a3afc49fbc09cf0420c683b1a6007b7226fafaea25545b0c637e4b8f6b2f5a261c9a55d347149183ca4b220b927439e504248d16a74cc4a43a8024f6ddccf3f37d487275f793426d88169bff94060e9dac559fa830315aa1dbdccb026e6f7b6cc65ff5765939203f0ef540658d22fe6c0143e4f1ef802004035341cc08851a01b323c94d95195c827204868a5562b8f970488a7fe43100a009a9eb0d51f06d328f76783bb7b19b670b86b97f0e29bb4b1d4e71205e16aabb291d80c974c95fdfd7c1924eb0be098261f49ecb0e4cf0a2932fec7f2572a12020c1fec5c1cbb43995cf66d8a88b687602fe2db2aeb20aced1060d7d2b7df34200208e818f85c9761ecedc42e696c0bd39b37148d009aee44c3b02c1a975540d2fb0305cce7c167659ca199c6765acf26ccec7a660d6605a4cbac4e8c2c27c4f9410c021bd617549898a62df1b802b2840590a245313787787eea2e28bd3f4121050e2c0300080adc6b17e2b428656b7399eca6755be3652a61ff73ab0a81c15464b9c1fe25b33490deb4768bd0201ef3985311e34f0ed730b889a4e5aad931bc3e4b7a74b1d289798aa1d9cca796cffdcdb13c84a4ff108a251153b32056415aa5a71fc75399b8226e0b252243e8ae62ac01ac3b3a06ae28a724af57fb385dae819d299a9f7da78854de68467d17c013eaf3471edf4aefb0ee0a4991e688609bdff725c9484a4d9f45e2b618b7bd15d42feef64ea9d15ce8ec5540883da363c9d1976bf162f906404f7c795fe2a6c352af8641560b9b43d2db302ae5d6812b73bf0cdbac1ec00ede2bd428f8b5cdc462e640c77211b071bd878550098937a962caf9ee73d7bb45403fee1ab8cff7f0c729f18afe2e8e934acc853531d7eca56d3ec7edb7344e82d6c2dc111ef36b13be7fb36d5d8b23f5e831cfb876efeade79c0c2494f0b4b538329eb44a4175149c835d33ed60e8033edea006f2a185eeb3fa9d6fc52e5f52073edcde75a91e0df39af92462b4a3cc1e3cf992c77a60cdc1f93ea25fcc513b26317bc30270ba4dd28f72f46fb8b3514b8eed64c0f81cd1a5466060a43e315f4ccf94ce61766a3b602f3d08be261f323609fcbaf877311e8381ab0a58b601b091fdcddc00c68b6b6cff110562af30418f17b01be89a4f2e20658dc0d8ca52ec22463bdcf6b59e1a4532e015895e771878eabf50be3fa5d6ea9ca091801bc67183c52296a163136abb4a2bc7f248ef42477e68d2f53a13b1a1660fd8703bb05dc0f78671cb56696ba1376ba54104b86e81497927d00eb0767b610539d9e8816a9a5cc35802c77efe6423661815de09677ddc6ed457ce6b2936d83978f1f5cb3e2151de16d45a5d8df75a2bf56a5f99cd2b133a1c55dc5effa743554e163a3b5f1b7e9ae7140e482d681fc632500b4bca3c64bb82a12e16b7fc1b5bf81257e5aba82a49d286e2c55ac18063704e9d99a1ab51501e54bdf938397eeb8fb4af31779e7b22c234c442b1eca3e3c91761eb26c3b295b52087772d7ea06b12adcda6b90941320dd2fbdfbc7956f9d2044b43a9c06781bae088cb41b328dea91d137386a04f2ebf51d85632dd287bb5dd39f2b0656e4b524d2ce59845f9351cb75bd51b70f8ea0a995212fd0f46503ed96d691c4ca5ad04ae2bec63f433de6d12f22b1dbac14a20837723c43526cda4f770ec32dc7e6eb52d8ae57f3831728982b5c1c0b037e4ab6ccd80b2c3be17d099a6e4f5ec8024679447c4f3f894e7a0090ee118ea2cdf911b2bc3be53e53a2df20b374b32c66a9fb2dcfcbde11b2ef0a3f28e95c678273e39d0ff8aa453a2f77829fec981b0c5b45ba65ee9ffff59a85bef154af7fedad6e33de7401778cc2355331419c4757f81c29e993d11d32550fd0596972c4a99c134211b6efe45bd06389bdbb829259cb1d33eb938ee45d084901132f9fd9d7cc8ec77c7a09f67a2414b98633ef7a8aa5fe99ee497e611f4baec46b4f764f86d95d141a34399996eda2e3a0c2c9e16affbcac539dfb2487c28460811382566bf27d3596700763f8a1d9eedd97b0b8ddfce7279f2a0c92b2ec5de7071669b3e6f8f88d69f92d897e0e72d79d558e20bcd764324bce70b09238908fce59002800feac4d61644d1f1435b5e3107148487edd7d401ca793b160db5dc09878ffbdabacee92b029133417b1f9aed89fff13661cace196a1fb2b4f192aef3f94e5263410dfddc45ea7a951d5c7820ff72e21ba2b40df2e286f90511f1b83114c3bc3241092e81a4b4d2067ebba45bc751095c10748f2a9fdf3c453664fe6d41571f8e52f904bc43e36b9752b3c0b0b6ea79951d4a5b23b898dc592020451959f32f0ec4cd28ea0d30e2849810f6e7903", "", 0, -1280342139, "376142848914a468fc83b4c96b6cc69d3316a96e9c1eee7043decc631fb0c6e2"], + ["030000807082c403035c772832364f3fdf8a48cf9f2b4feea31deb8325af0c5efbec4303671c74b086020000000153ffffffffae934456712326ebf21e20c088a6d6244f14a23152724e255b4157198501f7cc010000000665ac00515263e3aa906f37ef13dd7d13c81829b106856b9c9c0f438152274ce35872425cf056b9d453fd030000000652ac636a52acffffffff0464b564010000000000330f5e020000000002635389ee5b0200000000066551636a526a763039040000000009ac516a6363ac51acac000000009b17bc8a020000000000000000031335020000000011a7f860c43a959166d5584f2c64dd067b1903bb536c939b4e9d110b0164ba5368ba40b397317015f3ec6c9074c5c30fa27bd1ada557a8348673c703f4dedfff4fefc06e5a7aae9a83ec2b6037a7375f12a22f8ef9a5eedc3f95cf9dcc91b70500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060d86710e5059d47ac4ec3eae895e90de8a9fb15b17c97015a2009114ee85cf952728a1f967da779b7f7ab34980f16a0a95238b9304bc03865cb80e6395843c2135030b098ec459bc23e1dec532763a3db3494ccc73f7a36d812d3aed4391aab34cdf56acdc04594f855eb0bed5b02f3175b3315ba81a544c7e7fdac2c88aac0210a9b76534934ea722983a4e37a8c3a82b825c8a99c34ffd617a9f83c6eebc4b020feaa06968d3d50b99005634f968a3fa006a806b5465a04c613338c3aa4d3bf40b05417bf26457caf289909c3ca79023b58b36c621f1cf4e403507f9976f418dc9ba6bb7d7acb3a4c6d0f6f7edf1459abfb114f6225a974a08696a4da5b5b5d2f50208118aa341d4599b59c623c414de8bc29f4b6174bc9afaabdacc248b7338650203150c3b51294dcca53938088060fe27224351a859dd2ca7fab45f411da05384730308abfd3c388be6c8c79376f3630b9190bc29f4a6dc81ee96a5e1f0671c58a9ac022e48e6a4815b65d04025aa7865d35c86e09fd9cf85bb23e43c8b843ed95aba480209b8218206429a87651001f955b8f7653721f9e25fa369712ef819015ae4dd0497f861a4ca4fe07592e3d26e6af94d37d049702f8a76110bd4d6b94001147b8709b9835c2b901481c351ffe391226fb07697d0479555367450a235f3fbe627ea66effb81f40b53d04d9c0cc9a3c4a47cf2384620c3ce2424acff8b530800a640ea044afdd471cfbc0a868b43e92d5734beae89554e9a11ca2ec72ea78cc462dff61643498ed9e088f1917096d29d06c93e90cd8c8db2d6483863f15645add014cc07bd4a79e663d947dad8c6ba3a1bc9e54cd6a36ce25499a066a7c6cfda891e0c5c5a10086bd03b45299178acf58d8cb1f195c592e312ef525fbdc3594443f608e3d7cc17c7f290e66a66b403ef997a04bf57db5e6ca351a360ab00dfee320a60d199c4ef4c7fb637b0f22da9964cfb32f3084c8fb86e14da1490d6378d5cdafec6293b8628df09e7f8953376e26a8b2f349470510f25914883ef7c7ee3e44707bc001ff476e724d32a172e344460d69990e56c35984d42ecba082646eea7b9ec463ad0e5c8424c44b83d9cda9f9207b5feb3daaa43a9770c005fe7d493c7bee6f9af396f87a4485b6435626956f2ac7a255414ad72fdadc34c5151df7938ffe22094f55ec269dcb89a95debeceb00b92a7946bb14e372672c51fc2f566ecc759cd262580d0111713db98dd95ab81376622ffd6a9e3d98c1f0b9a732b7bb16e4e5ffd06aa3850442f7abdd5a5cb39469a027afced3158a8180553161fedce1f622e63b20bcfa7ff1a464e1e65e45c8f402659641f5eda0c0965d2d78607bc913fd893a865315b3cf751c110e1a30ccc3ba3d7b4543f36a1bcef16107a900269c014959b40ed466584e0bd6904f359aa512f9a65923a25909d3c6811b5fb3ef920d456557fbd16f368600e7810273ddb4a40e1cb0193f39dbb857c3442369f827806afdafaeaaa761495f3d17518bde433e06123d2f099d31ed7d18b3e8601067040e8ae957decb259e8a8bb503935d42cdd8ff1ac19aaf7a965815b0d4bd4181390048c8c1b193259bd2a3e642aa79f61c712084cc424e864a50b52aa526e5234b96eb8e02175fe911b7342beddfb6c5f7ae3b9cb168ed1e567cdb46c90fb4ef5ae444810904becb81393306b622105f976408ded3384777b19701b7bbef02def8de752f10a79fa47abdbe79e9a724c4428b42818ac2609ef315094a1005f046487020699e6f10a143aa3f2ca3923eadb0d5ab307ee8ce20ce635fdcb5401ab9341a0c5f9e0911b11a6586eb269c5ea60243c2ef0be2714bae887d82b840a92302f092a526415716a53ffdc175ae967d6e6ffbe263f802a9dda4e94880971987adbdd6a3347affb76f6e35849d47a1bb16b2b3529334bca53c1541db1c842613e0b00d6043f7d54cf2d8aec8f269083fcbba4a0a21435b65776e2e1df9231fcdd989b40cd59f25f7d04d2b9eb660a6a6bc54ec3702bfb58c38ef81988081b5a39798ff2f544c1de19d7430878057109d40d9deb8f434556df336628d9a47813071c23e1416a6c4c577ce0b4a4ee6063417cf5ff2771d87e36eca53fe55a8311218cde4124b28f9f3321b93f4687b2f62409de87e7cf1e9ebc35d4f213fa5967ed53a1c4b4537bcf88337a79278928e622401857b2116fce4fcbd2b982bcbe184e6afbf155cbb1853237af6815ecb767b67cdc13ba2b0d052f715d95fbb60b1f133cc7d9b182d0dd4c9d6347b4a6e0db6ff00000000000000000d7558505000000007bd957ef136ffbe8e6d0fb4307b84e82c47e2929936f7777d71fb1f41c96dab9f33875c8a5d3917ff0730ad65667d8b6bc9c1730872cc4d3fbe0601e4c463d93a44f8a163fe816b55b494ce256591a4945a1a30e85add765460c933343da1136000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b98f0363f944fbab0ed2fc1f3d9dd089f981843467d8f7fdb43ac82fd51d09817a4c60f5202f46284050e8cbaa1733e7d58abbfb0a15e13d0a7fc2b7302664585bc2795f72feb6214491ded6ba2dda424de88f4e6666a9ee0f38702901d37992cf68377b700c0055dee298de27603bf692b42d1e2300b58d7840c864b04f44e021ecd7ffdd373bc9fe68a58513d3f29f50152d2af8dcc362915de0c6b6edfae8a0227103aed2fba1513c6b9f1657fbd0a45940dc506e1155a351909ae39c480417d0a090d0d5c3d4af466f5e48177b4fe61e238158ad8144689e9e80a18d7067a9479b7c72e7e6e581cff9cef59b6a6bd93f19fe13a78c1d93bcd895a501212c874f5030735a031a2162921dec5e76c6465cd3ccb4f07eb6c8c8129bba7ecde752af81a030b570d74eb37baf72e2badec8ec32d4ea85dd4e882a5f23717a754537826dfc902118b121a2e222f52c53fa6840cf60523bb0889aaf484b9f7eeab8ad19c5430eb03081f8456bcd720958034558434b21c399831645769a03fbe1bc0a114ff961d68020f0a005362d09afb269f7cf55f3b3b63a1dcc24aa4ec3898ef1ee5beaf6f42dc18ab639272b1046f284517714a23d14e37ea6e9b46ecebd3b114839ed7b698511960ce6013403bea1b4006cc0e4e6caff0a925f4ff669c47eedf6d1e05b043ea82f1198629d920674df6dc98bab5e9b9758ddd15022677858ec1f5fb57ea9d833b7293ec560638d5a2e512f198ce8158fea69e3b9c890752fd952a560efb491ecbd81052b9f5240664b14567a30355d0490324b1eee0e3368b26e5e6699638167c50e1a34706619be246fd49c3b83f78fa66666e3bbe105642766efdae0b085664d862c67c751ecb4269cc675422324df9da9c74fed61c6d7c3962709a596861bfca219c0d54f852599bde767893d5d5152feace003c820c6864a654643b547ca0ea346b8167a411382ad2103e9f5e6440bf918489bb5325da12d11e9b3b09c6284938c74cede04598a6665f1933288195eec5610317fbc3254969ce0a09f31f72140f9178e03f079bd79ed0278404532582fa8d643fa41e2d95d578f183dd898f12f103f7b67ef98a47450604fb965974a1448641bd881ddf5dee30a28fcc9871256949b6111687efcf29e94bd0e0cd134db01480ab2f025de766f351621f3f3fa5d3a42416fa143560f5bc4770996f342f57bb5285e94410a16c3b239c5b26db1025f18a00bb439445b1eedecfa7c6129a67e09bda656f4274aa270a429a3933e9ad8eb7a41dac3f7b0689ed20eac4c5a61440990a8708f5fc7b5d5a5e8cbd9b460837635070d2ca831287421f9e564899b3fb67bfbf857e296efd081d6dc1a35a4008ef35ba4ea286aa9ab4382b98aa808a4fb5c302033cdea6d2d300dfd168e923bc146ef11a0319c7fd96f09eeedeace929d2eedc14f95a2455c4cb1a054407421fb91a2398532105b58b5edf4107c3bd14941675c470d8d79282814d62590c03ec702b9aa77c3491c07f928f71712a5935f482b2040c9422e897c1feb8aa0a50254437c386d3bbccb40b2140918fb724f9cde31f965f80626beaa225df2f72f2fb156e74cd1663ae1eb95be570d334028c87640d037ceb7483a1bf7d8ba5aecea74079fa276d07f705009e7f415efbe6d74ed27213ace7e861f6d7ec3fdfd3509527c102957ed12e201e2f8f3ffe9119c6f50d64da6944d0b1c71906690acfe6b99dd5a043dd7645eb04a591a1b8d391a7c4386f5be62e7023c6f7a63b1c99f16ec832f4c927d5e6d86c4d496bac5890e1f14c91ef7b3b3cc04bde8a87c11b76c02b1b364b37c5b27611ee0df74bd5dc4be362aa22a42af65100dad1e09bbcc6a4cae387471c272c9293e87a13db5b6a0f35db40664499b463e10e7606375f8717ef49f6b8599b98eadd5d018ebfd03986186b093e26d1382bfa285871630c41b6c14b3be301cc19ce82e53b9f7763a1c5ae9ecb184379b9131e51168c94bddb539cc93a9a1c60267a53486e6bbca352a9356313a8968e591af435e30b3664353a2d89d4f57f0101fe54b5b8f9b97fa517d74cdf4b6c7876ce5d1477ff007cef4698b0242242ebb1b84bcdc86f575e3c8888739a327836ec52e789327c36240dc5d32344160081f84fcdd8e1dd0648c6f4870552486c3fb8c85c04cca285c9590c1a6baac4c7e7bebd0ae29030ba4427f3f94745d2b86939b8df1599b5081fa0b742cd4ddc5537b48610724f79cdf6eb544f1cdebc65ba0e2b7b99952e47bdeedeae8a45f5d413da11d80e9cba7065208d45bff455dc8780e6f1b6037ca4221da8419bc2af206011d6f5b71ea5efa62ef8d52877c8028f42d0b8c7fafe29dc92d2a9a2fce1e75c8637f35eacf3f59ce936bcfafe9482cf50f973926ebe39999edc754b21f5e1f13bba6f6ac1573a0b", "65635365656500", 1, -1947049650, "9eb45a38bccc61146612b3706ade6f4a44b99c3605fb33ecc3de61848f7f041e"], + ["030000807082c40302e193aac5a04ccb7a60d3f4da45f6025e45a09ccf7ac4ae3949a1e9b3a6043d9301000000040051526affffffff5987a9c8c53c60288efac2fd8b87adcd192c59afceedbb4616d34280e96d01890100000004526a6a63ffffffff041b3aea02000000000152e472b50100000000016a5eabbf030000000002acac7d32e9010000000005655265ac5200000000dbd47fe1020000000000000000a38141050000000036af43bbaf8abae9f244514ee55b75da8fb39fa9d1b556ab6f8e8aaae8dbe926dd914163ca1fc2083981e36644343403eb7761eb4c276693e2b9f219747453cff742bd078784340c3789f7812b63f5285ec00b9d8967571475783118fd0fa98a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aed8dbaec5baa8ea98da6d26f3c4ea802bde77f4ca152cf6ab0833df11b6b8151409c72ac0e09ce45217944121c14db7ab53b5c00271b03e63b54fdb243c28765b3b49a900742c32248e253d23c92cf999de240f6c6e7744feac50bcdb6e1f44cd7c43e064eebb8d854d526925036bdd205da287e84e4549fe70e7091a22155c0228e99d8a9564e68f5b6515923b2cc93fc5575a7565f9aa7725541b98fb973ac6032e582227c9472871bf8a40f8c7accb03c03b3de3d69dba494419559a6aafaa500a075d844d0ba48628dc63ccc6e5b9e279b6f9e46d4746a15b06d526df851bfa7a82542a7b7ac946b0dacf3b38739ad613f08a3d7ce2b1585780c078b92a3282a902094b808165531b2af7e1f8b5c071ebe0c46b2c642dea5784fc5bcee07cbf2e180217cb91d7b21b3dcdc31385c0a5b4c099881735240b840b54838469e2767bf31e022ae34c59c959eefdd6cdb88a63d6fe8ac107102c9fd805876af52dbb4a2b22e8021b6a0fdbe6643c6e0a02bd02caf639ee266ca92cc8c29c325225d4dee1c9da5603193a3ac1c1a453c810e628bcf6eacc92f11c420e32a3eba998b12dd41d1c55ccc405c0f2d466cd0e876c35f0f6e34e2052a194fddbcf738197744f84db5f6dcc3a709d65d9e0abb44febeef72f60ae8cf2fb31f31a519e0e7201e3ba88418079698377c065066589414fb697ab6e53a5e73c547f94028c1b727978899ea5907b5f8d9d3b8ac029ca1ab37ac7a48adb37a1f5e8da498909d4ae824af87a4d5807c063c237a591b5c07fdb081c0c67231b1af4b9da8a1e220e83b0a7492022c61183f4eda948a0cf855d30d4256dbd6661e13bb873cdf32edcf75429029232d8166b534597988480677c8af6ddc732ee2fec323a2f87bb0b77fce88b1a9876fccc8deaf0617aa911c292283f0ca4dab1405f2d043192ccebe54a4f30444fc337613053710b02b4ab1ab10b1cc634f0cf6943d6cf5fa6d3628d3a9f98a4e8487a9a34f68c6a56796a3d3c5711cc018eac2b4effe828b2c05e4bf0ba5625d0cb472bc069ad1ce5f9b4ee1577f70d2a643bf172001e70dcecc31af1e11ccf59be03dcd988a9d42c32a59b79586cc51109b10e3b19b0f1536efe91f355ce5e1bd3d99b6d3a7929286810df1771a39818bd56201969c6da8d09b9f8135c60151dbbc246ce98a38866b6e500c65dfbc1928badbce03114f7dd19fd704b408d830ee06ddb91e72d7b0d6943f8b0ed31a74939c528bc19ec3480da574334d5dbbf06c9882ecd0d42c7dbb00a4f64bd7ba75b2fa16711a1443603777f2b6668ac28e46e1633464016f45a9845bd5f88bc6e95fdc422ac07911d9adc6204181357c71be03121a0db6e00486fe83c5053f4a551d20bcaa8b4e3a622685ad9ae4e940fa9068cadf7955a409034c149630bc4f5e08dba83e3378083780b52f9d3b6510bd3897585b4a10194c9159dbea43c16fa2cdc8f272879b56bcbc3bd3e32a698be68cddb2047db726b3f1a9a5da90077c0769ded9af2a0d89ac67468c52b66aa8a6c89f47b780e6b93d2509c35e9bfc6da4d725b775ce465709e41acae1a35bbde3ff86a1c887d90c322f7412f8a63540fd3b19df53940bf6df9379e3c156c91e51e1fd6b1eaef4b8f0bddbddd733a6792d415445279de04753c6f3072a3dbbf481be89d2448420807431398caf37bcb3ad5dade930e204e17a8a8f091b3d6e187f2b2f037dd8dcfe65ee52b0056a78a496d4bb13d3654bb97da4d1bbd81bacfdf97f755b14300b2c0a736b74412c48d7c30ec2c6c3617ac2e9e34ccf873e50e4e79e4bb92349432faafbb6435e25beb2e06323c1817a4184d95ed47676247b53d71e011df40ba272c0548c27d0a9316323e18684669d6061045806f2bfb7017a8e131672103b039ab6497ecf39f4e2ceb3d8169a6ce12f41f60ad5ecb2ef9365334ff8ad93c6d4ef3d96bd28a5be0da282122d191ffc12e81f81a1bbbb5ec5797daff70613feaa6fd5eb41e6f07fa39d52a300d13bee252d2ec20d333c23893ad145dc21a59d71971a33d52b3aaa2f5b181dd98f3a7dc980cbd82bbb13a1d1c7b4c2a3cb1e850b50f4706f6f2215d6194715998e29e603fd3ac16f961e4196ce7d105a116d5c073d26bac7172cba6b3cdcc810f5b93b7d9fe3287a6b8ae06725eb5aee1ea27128c207e89371294e868cd21fbebf8e3ed20e9daeb10842b33985050ee28f2e4184abbac3fcb88095d85b37b3892ea738f51b4f54ca7f7f5fa6d0994d14a7c5d905b4f5757459f22a1dd62d748d819db260000000000000000e398870000000000fba3dd979bbc222d397b4c5a91a5aa0d4c1c41a106dc3bd4e5bd067d01e5f0f855224656b655286143f06a72abaf05a0d0e66eedf14b723adef0512202e9e1d4ba594cb7f0bdb7ab99b2553820aa24a4e79a763d59ae897fa08b5dc878c99e8d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab102422edd995cb9aca989db370c72be320ad0bc02276e5ee9db401081e08a91a3af750113db0ecccbe78672d12c18885bbd096f1a0b97baac2e8c4a7126a63ae74e354c7aeb078cb9450a0500af101f2b55d027a364d5ec608e81b9c63241b087b9afd296d01d4a3159ec65180a203ce6fc02cd3ae0fa0e6ead62d9958e5cf02029db2802682660685d465f0e9815541c7688b97bb16355c9e548fede9862ab0020db2f1ee857917d4ba4b7a341e8a0328564603366076cb2feb87c3e36c13d0070b08be568ffd91db7134714e5c40fc421779c5eb6c9634124923b478617383b07d651406bf18f87dc8c7d3875803bfb0011ac0e930d9bd835aa4e170698b3fb883030a55f0d76db0de9bf9a8453a128d02dd9ca4b5bb6eae3416a8f353406447cfab0316d7a8b4e54a36ebbb9dc3ea102e13caf10db60407e0bb9116e0bb95f4712f63022b9b8b8a322075c26472983cff8631b8eb1dc4ca705fc2b83e0a623af2c894e0032189b5ec5f732d9f4c25b2e3ffb5f091c7a2cdb512a94dd12992289f726cf8880320fb5266902429cc3af8d33a9a4ff9a48ff14c342540d06a65b53fac33d1ebfd934f1246c38403ff042aab21b14b8a26dd98c7f73737b8fd85f703e3b992cc7d29763c7032132d7dbcb49cb8b1da3b6371194b5258e6d137d38ea99a0b52a18216badf9db4227f8f22cc3881170d394bea928de07f4284a7019c7ed27fd2aba71d5d1420a25f2c3976bfca9bbffc78ed729fe7cb2aff0c79eab909ea3a77d24fe14bcf10e975719e42675905096fccc387e8141aa7e966c2a377f931f5b8016cb627adc595fb202c56cd4ef11b604766ac4cb91341ebdce75d61e6cf21b9dae9c9e0e35a5fb1cf5a5727d8e3e1451bf05882da22a8176156079441d05f5a2943816db4f3f4b142dcfbb7e1e22467bd59a9ac33228e42b00e1c222c1ec79591b4f4e09e1be86f39b937acb1a03b6fc966dfbc09be37f667655ef465fa483781d8d6f3a5b0882f5a9d4d27d4425094dee0db3ef32fe023204d9a3a9e087c64e22093226d4c47f21635a40006c9d642d5cd3d149019810971745feefd19ba7ea9a4ada4c81d8130b16a498f42ccf8670a5f68f300f25c8009235725f1dd0e5e25b8c636973b354f6b2bbe549d955a45e4a5613dba2530524d1bbba4652796ea23abc519139469ad5f9ea28390bde277f49d467eecc1b8d198f236fc561bf0683b9a37ee9a23d6b3bc0d13f77b87375aa35511e4d74ea7348f6ddd53ce8915099bad63c1cff40a63f309752af3e7b3e824b62864dfd6501cb50ae0219de4e59e934c58ea665a7e60fca2069dbaa9836e2e25a81736a55a86e04d730f9b260acde16058270cc0343922e6f3a1c5ba6289690a305178a689869fa5235c20b10442e450065c80baf68c783c270b9be37437065280337377d3cb3b59042e0717c6ed1ca7cfc20b5e2755674068d108c87dfd388254b6e32620f2755a79bb6142bd7bc3d63a939a2294379bc4059f7a3cf7a481fce6f34b0232353f82ddee30bfa2587ffd8be6ba6210f46da29f540d7f8f8a8f5c8943afd757c2d8422965d976cef0df824533fc6c874614e072e6270ceae0917c188ed3f2cea6ac7b72a09083c9c28f094d1c3bd81b1a28d94d4d0651e44c212eb4099198295bf373bd532c29f1cf5f01a982037a3800c9c4fff4cffbedc2ecc94875b92719447b7324436034cc2032469f85ecfc04e5aa6a62a8974840af4a93f84c613f1f368e1a5cd0f992b2cfdf41804985c87678302a17d4761919db75e69d7d9f04ca03aac0263c1a716786b498f1dc95d4a45be47e7bdfeefa58ac9c7ff530097d4f6190be492901aff648712a322d619ccf129cd339dc24a7f8aa701950515dad793afb0d16bf2835ecd8047985dd70b8c1970c1f978affa8257ad863558a903846c926cb61c79313426e68fe96f6150e569edc2731a69f86515520fe2a9c3a9921f589f4920d7ecb05167a58b8706c9db04bdd52f817319eae7e31cb98fd768d34db8d070d8a35f232b6b98d088ddd3c6f3723786ccd6d4b0542674f9511d443256ffed5a7fcdeca8437f2ef93c2eef536484b046e1d58f52da1be17641ff6167a9feb2f59f5c9e86921bf105d7f9c9b43f1eaabb969eb75947a4155d6bb3d4754a18f249ecb65c25aa04aee6b1738b3bf55e1c30b2c9951fdc14279007eefc04558ad6e044c43d1e0dfd4b7dabd5cab3e3feb604406a572d29f1efdd76ffe8f627689c12198e228b1e660d2a259948e88c6e6c0e4beeb9ef24088200c1b93597b8a02e04ae55a3c5bbdd7f1294e04bea89345aa0a8738bfcb985fb4cb11a13cda7e5c3b27bf7d6d933f13d286999a556bad42a2c7eca7d63a94fef29aca19a7a2294b8c16329cc3150d4360020bbad7931490e25e23064c48363303fc08", "ac6a51ac5352", 0, 1158050457, "5a3a7a2a2dec231dbb6486ebfb415956701d54b031181edac69c5d1f8b811a06"], + ["030000807082c40301934ce9c4569419841b53e5159b259273836a16edb3d84c877abe583843e36a6300000000015383fdeaa603ef41de030000000008006a53515165656a551d780400000000075351acac006a53268b54010000000009ac63656aac53656363a183127300000000016e4aab05000000000000000000000000176645125844c5af36dca7eb7f60cb0c2d6de26cc33f3ab8a452738634818d7806b364aa6c8d67c1aacd8da84eacad645fdef42dc279c422e04b677dcaa267c4ed07a2537a093f0838be68b87227c88f805c29eca2c2a12799f85522d9c341a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000089b58b904195f33e8d6bc280f01e4c13fd22679fd06a744a52d3b31c1616012432441a6203fdec8089f825290ddac6c29b6d032873ccf4d6d38731d00af8a895e261f48c932c950c21286d504014ce9c27c933777f4fa5b2ac6430e42db50e6e4332f26cff0d3d4b9cc1b7e74afc83d3a90e5a8258d81159631ea64ffeda5c78020a6cd5a73c32faded910125c26c4da2a04ab4a77e859efe1f1f126196b5f299c030d49e0d73ef82d654d2c5351b2e32d4dafe6d91f8c4f6e93d995237800e89a910a046c1885a3340ff55e49ad9f0655a43f9fba273d3a017f645ea844b5ceab8407f6980a77def676a50f6a3938ba2db53967b39625ca21c6aefdf397b2100636560304fdb93b37c91c9d7aba814fe0bab449cb37db2484de0f8b46e071836eb2c8d7031d1e177810c6d241903afc2d6b6fac0f0847d7f79eafe1f8fb73f7cc8ddb28640319a2c59545cce058a344580e365685e8989d3149c24a106926761ecc3acbc1a3020576169953b24615b6a4d25ab1396bf6e9836142c2a6ff6c9029c2ea6e7fe135022b19136a4ae0c0f6c2db5236ccbafd131b69552e9cf5f04866b5f4d507568c2e49ee57c031217be50385e73e417d7c630c41249b46be5b1f25c793b8c0f7f64bd05fa3bb8d98d5a00461cf76750911f57da4aeade2db3c97b30853a73848da789ef06b120ca37e8850994796e71f549897c7d17e65c7af1aa7a3e28013db35ed337f4fc5936c0b64a27dc547135bdebf627a83ecb4708b4c912dd9967231f73ddd0befdcf55540ea6cc0062b0f15488570452047f244a6f723b5e53eb20972bba83bbd48263b8d987fb7f8111b3a1470648a1b60c7d7a0ba907b5df9db648316b585da7adfe3281398443cf059d128e1e5b27418ccd5d0c5937e01a300711ab50aad3df6aac28fd7c8b94460f36515fdd655375da9e71577447d51253898fd1f1a18acc2fc9dd83b14c7a5a3be28072d50b9e607cbe22701151eec6852436751f15b8e394dee970b60033c8799052473351fd1023c4c965975e7e5b19f75c6b92aa23edd63154aac5f710d720b87d29a0b32ecd056624fa21a5efc4c8707dd2987f0863a0e6ba64985fc3d0c4b1800bffff5326efb801241d0654624bd50224a58cd7ae4ec8fe0b2d7991c1420c3edb2fee5cdb1ff94af8595675b378b6b693fea4c30ec8fb6644459cc9d5df8fd273a05927fdbb846ad6fb077ed3c71d9aa4e290b9834c130cdbdc2ee95dd7961fdcaa1b9f2786886100259378594e69e64785d2cb4c88f7c9708ef53ea57c9b744a014d4d38ac02ee70ab06ed938a246045e63d914adc3ddf85b8820d56d39cbdf7fb51ee565f9e46ed46abd27bc8ec50977bbe2ea36798fce75ebf970bb99d6bf47c7bb4b35c20a5b81384bdff85a5469e7ca0d6edf9a152ebdb21ee6ff19e7e2441e7a04dc649f7e9556fb3b235acc45e5c2bbcf4f743b6f3341c394d0e67e220192147237cc578806a02faa532612bae9aa2d54b2e397f8da5fa4760fd1794d96f2e7aeb5772e61829e73d539da5f9fbb3a483462513c7cdfc939c8597bc919737fd9c7ddc24cf2e2b50c019d525fa9cc2dc43f01cee70b05cadd4835db27ffdf00922f0f6d3b31342d9c8565c89618edebe6625760d63f9f05736a8b7c6754f13cc2ecc8a30e2964826715fad7d1fcc772f84ce0415c9fc16d83c52a9e441d1e6990aa55e2445281f31d04b4328b7e5ff27afb6061e1bda04347f1c6d5299183a625d55f92574bc799e5a6dc303963bde427c2dbd89c0f2871a5105647b2eb4b2052764a4092d4398632a84e3e23de81ca5ab172b447bccbe56168630ef2ab643adb12830685499836638ea9aefc84ba56dda938c38cb9fcb060ce95be0ddfe236e7d8a38b21cf6e374c17144fc9061b46464618b5c0df8428286b383d75416b6cb3e47f237ed74423e68e94d63dfb3831508e4be06d9aca709423571b9534298e159cf1dbef2a0c11f48a39cd51b30780b275340447e776c9224a2dd5ba38e5f70e52322cdf2737e906f324565cd240d37163d20456ced4cf3b7eedf5de48dba678f01426254e09b8ebb97086e1fb83e7475949ac8218fe71e50367b1c22da762d6959f0ae00bea13ed9fecec7804628a8357b2c4fda0ee5fbd9baed6c38779f88195da4d541c0288ff4ac1402534a807ab0c0df6bf0e389610f854f556c692861df33c510070150327abed707d21f0d69b8ae8589d8bd929e06eb77b321dbcd321e233e78ee0514ab09adaca9569163f02d23a89e6fd4e1adad0075070c195f10e3ab1d205b6f3d5cc9240b8e81c0f6305cdb18098cfba39bcf7a2dcebb9ac92d8535b03aa47d87099c0b4193c2693da2c25fc45bb850ebae1dd3309a94a50dc0295048b8eb8bf5c2c659ad6474f22418562b515149b23519ad960b396f1c08c07", "526a65536aac63", 0, -762053034, "6267279784c2a8724724d552cef3858ab69c60dd6855c95b965bdcb2a3eccd18"], + ["75d00b0704e30f1dd330bfb8562bbf8cc84f9f723ebc786eb8ece826ba7772b55a071374ac03000000026a6affffffff7d7626d68c71cb9a58353ca009de37e11d2e873a89eb17cc8e6584fccdba105502000000066a006a006a53ffffffff3ff81802d2c1e95fea4503cfd5c364517588b70d31e92161795547f3776ebe2901000000025363e8b77745f442f121d845f91fa6ff77f0442b0499fa23a8988df272c73d4964d670f02d2f030000000963656365536a636a6affffffff02ebb81c0000000000075200ac63acac6361444203000000000463536a51a4b9b401010000000000000000c0baf70000000000752d366720396dfeea3c40e562d84eae74758249552eb7e2336090c72dda7eaa9f9ddae990bc7ff4f59d98dd46ebd6fbd17f46bc1cd832116895811d773ddd0483fa8349d0ce8672e9eed444749ce709eaf50b531948ebbd7fd6218c21ec5930000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005d61aa318480a9ba2eecf0cfba0447a979a9528af3552b882e3550b4c9870ed077099a8587c402ffcf12ba89118532c34032315ddfd915ad8caf90d8c69393535e9dff5da89bd3454be9456133e66001679be181effc0ddb75abe42b9cf7f06cae6415809c80ea476179428263bcaac2c8fc897415167e7a1cb2606b3c93ce9d03171c896604316d9a97297a84644bd4a535783163a9ef2ffd6b68a56a998e68ce02017aa03454fa5148df29660175de6f78569ba37394fab0b0e5b8a7adba5432130a0631e821dd587a2c2413614892a914bb1fd21dc68ea6036861a9937f82c7c9793e556e8e339cba9d991f0a344f93ee932e9e12edb22d093b7b7a0a62573333b4021a4f8c1fc7facab50d15f3027b49b52e2d2189ab0de6098817a927bd21f043c10307f694927408b63504618bbbc11dbf3d7f1e5c0d20bc6a05f07a1407519bddb6032994443711800e1c5b9c294611a85004f508351ea4e0b3c48addd972c356ca43022607671367a9a13d12ef51df8f84948cf7993bdce9516ff53aff95e777cfe09603016edd77e489900b06a4ee0fdb47989780b600925548473e9164360d57552a681b54b0f1e55f98beb0d38967284007c3c21fb09f8f0af22c863c3c223238bdf1c30034c76d7b846d2cb55fa714158b1c63f45964fff91f2525ace5922f5e1aa162947014463a45092287080cb44e0f23ec1b2c9e6a020436f85477ed59fe0557e2a9e22894c038fdc5e727029e7bdba0996f927d77e44857a985ee2b4eb3a3206bafe0daff90a9cffc2725d3257b0b8ca730a92471630bb97ff52554c57d0fbb560a0edcf22f0509506d56f86ea1e22f285a5b0b652168ea3c26b6ea20010ce5e9858cdf40a82d71fb94e6f06d7cb623ed85f26635d8a49cf6508a6944dbdc989b0ceba1caadf23372b2ddd31529db0ebab7a60e87c19afd8146f312716a435aabeb2411ac3f985b1b25b8d05f0a71cb7ec2c73592f5ab22ff508578db4a59736e5c3d631007068d6ab7e55946b27cec05c44936d8a9b05be92096c8e46d09fd0b814b94bae6f14bb429eff5cace228aee2ede3bd92fe9992bca07b1177b9821b337f52ce0318cbbf4599ec8be3e9d4c2ff46d3a65a2ba2149307049ea172cd5e3c88788066243c7d0e983506358de0a909df4ee09820586733574831539872832f1e67acfb59be54b12977f2452d79e5449efebb0e220f451c9ba40d0c7f6454e1d65b8354e89d3bd70e65f7672b8c6a34338fdf3eae8b5b02ff25f51d22a3d8d8c833afd6aa249fee40320f8e56433a1595a3b10de3882dac095dc725369b89570051ef8458df7d65bef68504f808654e816c52b195ef786f50646a2ab20048d94ff8260c53f2c592ebfe57cb6b08a2130bb11406d7883087b3dfaf3f409b509e68ef8e02d57ffb6449aa982a51ed3d566e06e12b4a5857857da0be588e85810c1ce9ad39d3c009efcb5775f36270fc08684f3ece2de01236e22be12dae8b134e8eaecf90eb1820debe9c66caadf5fee769d543f06aeec0b4042429eed0866b170dfd4bdd0f04627dd7aa5950d53bc49a5302071f70a4e05bc06ef2d2bad64e04cea26b4ecb4ee38e5cb562c7ad6066654376a47704f589a63511735f9d76e1796b083475e31f6eb081660fed1a3ddc78940bd980c940f53447437dabb5f9d6547f6fe67fc61320fc76aeea1aed62fe31a683180f0430bd2cb76b9ff8c3ae0beee2e3dc579e0463aba12d070da791bf671703e031f43aa60fa10cad608fbba3dd3bd134732a2d9ecdf14d4a21abc615c472a0b6a77a6908435fc71d614c1abf12d4810448ddb6bf4842850ae813689c799e12a1fbd50cd886c0c5182d46eedc02c2ac90b28a529f113e902328136c5aefb7d63f90f4542e3ca03c147ab1e27d6c75bbb9cc061a68c32f20f2e49217a7c06d7e7ce809977cef1617170a437a48623ea2e1d9fed27a34fa09009d388b2964aa039816dfe0ae9976a3ae583015e03f1eda8dbe4d4efec1c881503ec8e46a57cd6845a60597744487b2b2cdcd8f72ec48a6141697c4a6ba662abf3663cf8a994da3f608151fc3ba7d3fe77b3f0c8cc5ea35f53f7806619491fff238c76e2bac27a619d3413d1fcfa2f2474e488b0b07a816c0a42d44d9755dfcb970dc8eb7a0a9dcae7df452a544852fd911fae54d5c6ab56703eb9a158474d69b37564bcbe8019257728ac395a5e63a72848db6059e2b44ff711f1bf44d4636949eff0e8f4d6ecb85cd118949a1c1bdb06ccd96c786e5573ba207436bc11f6024dfea2a974677fd58c3482d84369e38bbf04ec8174f6631ad2edf1f2fb69abe5fa615df06967747fefa7e7460eae1be2d63204ae2199f24fd7c8345fae5cf582a621893703431c188f14a77389ccdf3ec2458180ab271780fd7e882bcd42022dd0a6b1aa8c05", "635152", 1, 153796088, "c5db35d2bb145408829bfe2114fa4bc9cc36086f460323c94c10d50a72e80927"], + ["6509742f0329a9b959f147e2ff7243eab1305bf03e6f940a9751e47461a721ae2a62b5cc790200000009516a6300656a5100005d51b86ad943b5f8b241d678336c2bfdd0e9c9ed6becefb50ebd9bb3d684720b9fe4f51f000000000800ac00536a526363b5a0daf0d6b3b2ac3aba04fce040304736b2b030368a3571dc6df247103f4149cc7cb9aa0200000000ffffffff022f1e37010000000008515251000065526a8cd3960100000000095200526a5253636a00e6f6e0270100000000000000000e225603000000006439c2ee2be80e8afe3ac2b3991cc0f43b385ac57ce927007c06ce84d0a4081cf7f974f1ff4926a3388f4461be12f00435b499f668f34b12b6acb461b234e6057397e19031722374227f35dfbba2a2628f7bccd71481d7e97f8e3124d90028d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003db57c6c20fead3e158f476c11a89646fc2439e6b60649ce554bec9105d0b834741865eae433517847e89049500e8b69d3affbb28ac0fb936fe19d710fbae09bcb31c07adea8d9228775f3f2db44e2f3d14b7efb85a885bca088b1827ceefcb7607537e4eff95fba8231cb18ed63daebe27777cf7b79287b572ee788038f56e7031346ec11974786cf3b64902415917ee22d5ccfd1ccb6ef700bb19446a61c291a03238f38a247c4c3cf807fee2c3652d5053e7de9aa70d4cd41bd6bec693d52382b0a06fa5aba2c5d87850c78bee8e53c61594c89ec1f5d3e107c882f018566aade6ef16b4e1f959fcd2199c403d33e0aacced8253259399e1ba3b8921e3810746ff8031b2c8a43530c4780053ff5d936adb21d6e619a9ee445080de97c655ac8decf33031c09b162a1cc40ceb2c1c63f026fe0d11564cb508a458095b040c18796d0e0ef0323431f8c64316f66ff59941e006f146b66bd58fdfa8d80afd878cea9cd9abded0224f00780e43e47928cc1d5b29dc196b8fca21f89525756778e8d08f7ea7ca97803093424e36a25da278bae7e2e93b8fc5b89d34f59f63efd814f32956d1ee106c36e6ed849843268f46811adc0c6628632a02c74ff66d5f26de0d05b0ff41af28294614b42da1ccfad36659f06b99606c7b90660bb81d4ff351e4fa801fc6dcf7945718dfee11bc9bbcbc9c856cf4ca43266fdcf30b8c74e5df4af7c3f65d12da13537b0d394c8947856a3b045d711bdecf8dd99b272ece7ab9f5419b0729b143064dcf480fc516c2ca1ee92ad4b7dc81363248ced3fdf673a57db9886aab76b5aa4d8fe50f11582929977717070fa7159d24654e2bd76d815c5e00db594bc4c278e977c431ddbe13ef1f30ac410ecd844d5900cf17b89d587f2ddf39c1a6ffe23cb216fbc041ecf0babdf53e0f045a99b63e5bf4d48f8eb26c687f6435c12872f0c1f6cdf5bd052e08583aadfe2399e8719aa65eef7b3da7fe4e30a3c644c874b6cbdc93ba13c3257e47e106a9ff2a607333143aa26c1479da01cbdc3e137dcea3502b7e2d01b3062de2ea42f82034046cdf91fef5f92447f1d638034ce3e763b46be9f90c9dcc15c11acb392ee41a0d05799421182932da65b32d754f272f6a6f2e9968b511df49f12e81704c9c506c444c3ea5b63b1deae9d2a75b63fa99a2bc93fddc823f6e10e3621d0610f0927e78aac27b6647e4412e3e1e0ce1964a8ba758e6d28ac1d8921bcf91d8942102bdff3875c56720d7af518ec56a8267971e4c8540a9761e0cfbf55b02043e06eca30cddf4c631f5932908c1ff1f42ef290fa1dbf4c40cf86a1e6c4580a25bd9b2f95a8159d3902860af7beb5857ce9605e2fcec52738e2c7a3d9a7b80a7f484f9bb6bafaaa0b9791bf2cc18420bed95f3e4b6d4afb2fbf372a96cb9f869261580a152635f06adea76107d8597dab7c2c2efbfe546eb8ae9ec057429870183c5977a7bd5d6c7fbde904904d788e9b1b43fbc30733b0d776c8639d9b24e2cb452e9159cc17ff97a750125965babfec92ef551ad917959403def67b5d3fe5d8a11d5fe7f85352de9a2d85091e6e2915f1deb1094e03cdc34b79cd0ab1c40f8765057add74417e71ce5fa173b56cb00c31377482fd218a06605c65547ad4249285e503a83cb8f908fbb1b1c4e9f5a42b599f1575fe61c46afc6d7369a95289c554d14b5495f956b91858fc724b50422968e0404bad6685234988f6440b5d9b366d19baa0399c2a477de153f842c4d0914502c65fec8324cb8c4b4da08c7f9906ce59b2c6c949806f34a209a728098769c4c52b3cf69d4d69fd6f115be327b3520f2f6bf85b9f5c8fb0c7a8dd3eba54444bd3a2961a61dcaa5d6ef93f74ef7505342bc1dfe843ae5ebca8a9e8361972ea6e4e8803a6eebb169be0c6e26965344c4e995d8423422260b9aebd6271e0f6d5d94c260837008ef576fb86b0e0ca830fc8e9d0063a17ff316480b5e1784866bf36b42490f56e3ef4448d1ed1a2e8af40e30977775b38c4c44a5184f31f91eafd72015c29c0eee73e451c57fa51bef39056c8ed33317185ae6cbf1b6c19b350c6a88f409c8287ac93b6ca8d53808364b686056b83af8687c971328d18897b7c78359003a32ee18ac296c72ad25423be3e38a5048111642d86a0223068756f17f55a8d7ec1b36f94329ca4ec9d46bddac637db07bf9f5257e3d87e5283ed9953a1b609b141dec9e22bc7bddbc57c4fcc6ad63b27cf9d338497d2233a3b3fb6b7ddafd96a61c854b755a2bbf9b998ad6f2d3e9dffc950afd05d3e82738aa92bc046acd4f89436d1914161e0b2e52ba3464c5994d95387abf6be4298cb861c69495570746d343eeda25bcd2ac853382aa0101bdea71d20d9ec3e28aab4cc3e44ea63499f9009712b9a024cc30a5f4144222e996260337400", "53520063006a", 2, -1098114161, "bf2fa54be3d004652b3ed5ca0ae2d570ee2ecde95e684834c1094aa5ba96142f"], + ["6e183347039662a0eb9f91b8aa60ae926fbdc33e4f61df597c44615d5929f53e70a359a678000000000365515195fd24fd704bf9a4a641a111dde5fc8d53fcb2d6a1c1c65f842ae5918b02346c072e074d020000000852ac515165005165ffffffff7cbfbe3498f532a93bf541d8a569b443be6033ab4be7467049149fc125cefeec0000000008536a006aac000053ffffffff04637da4030000000004635152652083950000000000056565526352e1e24601000000000099d02a0100000000096a516365526a65ac6a00000000020c772d040000000000000000000000004073c129b430746856fc3e1f565c610a6c08942cd99a3d131396afc733151cc64ecafc3e2fe034daebd16a96563cd7e86c839b62c60566ddb9f994208e897c15ad1511c3e1375dcaa7463a79d43ba4a350203f912ce91c406639967264128bb8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007733c3b4e3715da3e97eae989d679673b38a89918e607dab858c953c7762d7712b95e24c6b614f4f4b19638803934a192bbd0fb3fc6f449b5fc73b7c960dd87f3f470537baaf44af0f93d6fce8dc05e222efc167d0b6aa88a2d73a45c990d4d1165b0d517a2a3adcaf2e9015ddc8ca143594bfeb79e466186de2be0477b0d4dc0218d9f3cf1d9a29371d2ccaeebf2e15e129efb45669d3058557861596832247f8031ab85c290f7e5457c19dd8ed70e0a314f9e7125b8934fb202f88986fd5c6d29c0a03f35f44e7e6959678f121fa074b76282156603303ac16638a1f34c7c85fd7a1589c27a5c2a49a37a28a16000940d381039059a93c85c1b688f644b683816155030f413459f3dabf0ba52b8a3e3af5224db2b2f778bf5baeef343d3c1f7a082e77022c973600c44c603bb167134a5ed1e3adc87499ab5c715a6e9e096044ac1164d4020a239d8913bd5dceaddf3fb1cefe806da194190588832ef3291d69a01147647003180aba6af2bc60e60f90c39675930940c5d41600a832ecf43e7e4292331fba0003014bfa7ef32f1b3f8f71952df2735b339524e4179395300375a7d7c9c1760b7d495f9ca9671a2c430dc56daea31d673fa64f674551004fc22e0daf2b9b1a2a72c3b18cfbe680d0c066bbe7bacd9702f9cfa807c86a39b1e3b993fc28cd148c4ca77acdb15a953f0031819e3b535b9bb3ded5ab962e2955af170a0f2e1cc8306a39b76456c34700c1a7abdc2a97a9af4c981a3dfc3c034df7a5d1f9b7e6d959de0e279c809df7df5e9520075d10f5f27eefbe5a1e97721f52e47d9200ff94537bdadface98985a3cbcdc4aa0a3645bdaad959282de4a954c584ebc9f608cf74f8ac607815013cdbbff95fcc5eb7901ed2e97eb37363f5cf7d85bfb57958a7ff5ca2dc8859a3e4a81fb936bed8e71fd0ba4dcec68ec4c6ba9007cb3fef5e613378545a9b48cb0f292f222f739e27fbeb9d07a23371c2d882fd95f1a1e58cd44a9ec365469d277bd91c7a880a83634e303ccf09939e2ad9db3ceb1f240eda185806563b0c057f7d0438dbe3a5a20748df4904f7d49b2d96d2c876a2d6695c811693f675d2939b2dcdc906b8d83476690c9d2ce445f596e8e3dd5557181ed31d499454bd9e7cd86f395681f426e581ed6860ade9824d32e3fb0dda4e94babe4e343813c090fe0ad3b7016cc50747d0a6c3d9592aa203d57eb37940ee1e2d0e1f5f01c90a1cdeaf3e3c283f5cf8401291f7ece525f3c4c167644b2d530a8578ac17e97cba75e3983ceda1ddb4deaa74fbdebc6d238a7aaa935db1ae118d430f56bacde995d818eb090f0f2605858bb8ff6fa2b17e836b8ac722ff0d835211359ac84f3455702088c90f3c9847cf48706b072020a916823d9cf7e262d6a8605ec9f07efab9dca3c3a452353c504fb212aea6b059258d7f0cd93b527c41b25f4861b7cc981e710ddb74f68792ed1d6f5a38521c790140f83779d3d3ce291775577163583273c118a3b7776824b4aad54a1b664b9cf6667dbafdf542e26930afa2300dc3aeb8dcb16b4f907556702ea69ae5a057c7a74ee99de1c0b55b53f26f256998e007938df6933ac55a7d03b3e78414672616d416f1c4e352a31220261b7bdcb99600752c0a1803a9109a6bc013c609bf2acc7bdd6eccef5feef85b134889cc1717fb1c6d1086585c6a5630157dd0c64ef8b97bc69caddf77afab7016f4f275924618c112e6bf65a182e5784a663d966f04391935f3e06983e81adf08fd4ca92d96e15a3fcf956030a006b68e873dd56a392b8e747e19544143e23108afd4342e5a81552a54ff4990db3a9aa5f44288577a91e5ef961038ec3e7f805e72970f607123ea73cfccc8919ad9f438f043d7208d951cce58ccf217b91c093c121bd1f03e1d846331db56dea92ffa5e3502d577756317b67a2e40791b32028c242ff86207d8201670122df1212663f55fb0eda215be1d669b0de68607c4385cff8d27833c70aeee39b7853eea263dc6a9b1c035aca89a642462b89adddec5cfdf9e7398cd33a4e87b726e6de63c5aa48cc7175792c00578361e0bcb32caa0078b2f833f43b72790509e44f0fb869254ce49fa08e97fbfbf1c5ca40a7078eeef1b8795792e084cb0e587f41d1d83a6184e4da26b4923c1f0bb9872f2e64b18bffc91943c2bacdc8a18bab272721d0a94d1e281535b314a81b70f7a28c904f1842b7bac4026b404fc6a239144c58654c6a6832010d9113ba17f1b068222d709424e30f236d343931c3985a6449b1543e222ed171f4cf6660000000000000000fdc7da01000000007f2a1d960b583af79ecae1e4345357d4256f7bab5d33a78b44cb94075a3fb4c3b90e84fc3c3035d92fcf1474d21ae6c7af6985d382309c7ffab1c14cddaa7ef4fea59452db37741429e665de197fe3b3e1299a44000f80f586efb3ce91f21cec0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038d93f8ee8b512f1a4e672eae4c029fe3e0791b909aaf6123a4df7be88c34da50a9cfa2a112d4d5e58429c67c36369caacfabf46e671baf6a0271ebdfe63da4067d3772bcccb6f305271adb892308d9e0eb3baa35ebed1d2b6635478e606ac2f38f652f46245c92e064ed995075cacf6c2a740e1b28dfd4bf398ec25df36e718021c5884b5a197819b44ff701a92af7f519fb8b6699b1c81d78f7d95960e773f8b03212410ba6b5580c6b470d136e6bd7823a7c4c4175396cf2f2730c266dbe815350b00105f60f61fefd388f6b5b68c5bf1438afc154b8c75ae1567e2eface79405ad5c5fb90a07e5d506844bbe6fa396d4fea4a2a1c47d4db5470a2293ae70ff580e0326948e60c3c90f784867d98b1fdb5b067c758dd69f41c69096da7f52c6d1a4e9022041ed398d4790626e9fc2bdc982a47600eb949570be05010286901343a221af02156ec4ed8a5497f839331cf93218a7d942924b3e2fccda9467c008b1e37bbb660300f91b467fe91717d853b582c47a8d0652fd277cf1303f67b012621aff17bcfa022f8916260a2daaee40e1b2b0131e5c39e57f68c50913ea5b2f8badf71f54eb7d6b0ce3140c8d5ce338c78eb9839cd758376aee22047125523f2549c076ed2519067c97ad2de7c97045c39d55c4cd2d49ececc37083ee29e3836e044b521b935aa86e4347cb4bd44feba6b2bdbc77c7231307c289b7f28a7835b4e28064913c038d8507651ece02b9f6e3fc75452f90a98ffcaa0f2e0b44483488d7bf48db9123ba429e60951a657b83072140eb19edbd4deb943130d33d8623aeffc9a8a702db4c5c97213bf28e68db10b44c9318b849c45e48a9bb6810c69f1e04b1364752942483cad6e43c70e3e632b62957af329b90b0c57fbd9d7612aee48d08fe00ce847f17a9eafbb123bd5478a13497daa47272708f748cf6e56c9263597c289d16acb1e326949e413ad6f9da6d2725ac9e73c2df762025f799c3d480368d5c0b0b523ea0a0ee5f273c12b54a07e0cba97681547b5b6a4cb1941cb6d66a31a660efd060c55e0fcc6382a04a0ad12c6b04648cbf6ca457c68294bc1c4511aba098c30f45a0e6e843912752e1391880e20701a49594e7ad9cefa35235362e1ecb134de804b26715f44bf6e6739c68db1dc485c0ee60640023bb95d2185026e35c5ebfc7ecffbfb304cf498956e2916bfa080176871a4b66ce4c109d3adfc6fe3c1c7843cece952dd6ab69efc6e6ad5b4fd1f7a053374e3b8dcee7ae8d96c9f09828b931b137c88108b251b653d8e9f65e3c2d505c89c8b5e1978fd465f9536b8981d916eaa8ffe56fa4e506206b9c305ee50a28fd9fb8c4f3dfbf325e6cda69719fbd5ebdeb244af806593cbfe69401e2ad5bd35a26815df3d09b65d4e30819c760c089a048e7b55854eb7142cafc058df6dbfe7fc2633dacc61f5071750315002754bc9f3d041363ae864759d2841736489aece9cd33642f3898ea2832a539bbc13129090067e5969f43174412d8d32493c4411d2de071632c12efcae7e36cc615d72d0f76efbcddbaa7d74b12ec04772d3bdce6eca44cabbf8b86594a34ebf4168c61ca9d5e987834cd3a8b86cb151b0d799fa16ed8edf89c4c87b0a5aa141e9b6e298fe9aff435fc523f886516d014517e89e69bffdbb8da963e6a4ebe44ae7200bcce926e27a4002454872fc4f0a46d8d73b633048a26ce8f078d1076ad6f5aa9ca45bd8b186b03dc79a0e3dfea0d794263920454f7aafc8ac95a3ed2df8331a08a723d03529b05b202d9d90f22b33c3a5ba867ffbb38a82da1542474dfc8dfa703530c8effd00f91ef2b18ed5edc6bada838e39edbb93e587a7cce07601a80f7c576c70a3b4063574de561d997af166e7780e5f2d8ac955406a0575a7a3d8b237c572d9596ab1290734a46ed526d002eff5dcce4359203f83f85a906cd7044f198b9ef483039d06a2024915cb0913f4bff2df4fafb78df13cfdf5cbc98c7e2177e7437178b22f9cf7a6876ef7316119a21d32d1f6cac4fd8eb5d8e67f52ef439cb66c8bdec7b35022d1ddb079fdd40881de96872d858ebcaac715a180828c67d2e1558918f42172b3123fbd0a931613b6ca7920b631352e9f6015de5f61320f9bc1ab7d413e720f8ba9fa9b48ad311ea1c009eef939a0e66d7e483d301afef05e9dbe61d7c37dd2644ea58d7276c6f8f0339bd11fc113ca1ca9f6612a866c33dfcd6ece25ae01ed7334a34b80354028cc751ab4a90f3c9e2331028d55b488d44c140f4d26ca62e2c5ef85e70b153039bf3bba657defc35befdd2eb5847d4ac46ee7adf659461c88119a7eb777c46d346326a2966638292cd15ae9e67802c93e0b39eee5e9aa92a5b437ef5649f4dc61f4e7639fd6a5818d2a874d29e1011f4d0a41836984d509ab5fc0f07f27f1e842b8a8b0b", "65536a65", 1, 312405906, "1d32fb809b4d35c1af16fc103fc3e6363d35beefd9e24c9d40e6a89f74b7774c"], + ["9437473301f74395c6c6f58573057d7f250a8ee17e56868191565896cae0e496e1218d85500300000000d87b82b80388f8c90000000000008a70d501000000000152fb3bd800000000000352ac52a1d4467a00", "6a00ac00", 0, -480914887, "bd7a1166f76d7fb966b40271751514a527528ee27ef248b526ae4aee31909adf"], + ["030000807082c403041ebbf2e9a217a0889de997e4cffb12fe2cb85a510389b145e4d53c44bc15468c00000000055352516353ffffffff41a0d8c6d41872e73f66d9868fa15782f8c41a4009db4442dcd8aed36d723ab20300000000e7de8000382102975b54a35eee87c6a93a59d9b8a49264b26f6b096201e85a0ecf88522000000000075351525153ac63b0ac72bf8237e03f595db89e6eb7dcd4d09c9f4299d137996917c0f7167414f06a4ff58d0200000006ac6365005265ffffffff03fcc770020000000001659157be05000000000200000ef804050000000001001b5e841fcf406fe603a5ca38050000000000000000000000006c182faa94bd9b0f9d88cab9853df308b5151b6dee6102fcee452c0ffc03c20e6aee34bf8cd3268e25580c4f96a8eb4ef0538e19324b6ba2b4696e766c94333da2d66f8359656e1bdca1290768c9f49278778f443283d47e7d2975f0b285358700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ac2db8c21a1cbe644a3001a869dc8c61dea08983b1a293a06ccc4449a75e23d8224ba6a4a5f6c8a9ade9a52c12beba04e93074089f0e424d2e8812940cd828b6407a995ff4cdc4240605b4d6eb74a3c619e580a432b2809e6df4abd33685b2b4d4baa3ce32e28ab0c4939b610e3e4a818fdd8e9e6a8a17afa37eacdfbd83d4820224b29412bb71cfae999eb132afc3bc2b4a141402f4297563d973cda6730f3c63032c7b0d246095e3585130e4ff06e324017252eb92ccc32070ccd0bc23431634a60b05dc023817afe73ea63a31377a470e3df2a0b81b4fbb5877090758bdd5b6e85f468622b0bbbaa8a4a594118256c2058e04824ec3d9c305c5a4ec1ff0efe213e6022e38b45fd803b3c26377b5ce81adbdf27ef16d3f209b5235987dac6be0960156032fb07542a0861b196e821dd3396a956ed121367405f3767ae48f137f93107f11022fba00a3d6a2bbe5635bb74e97d27bafe407ae0270ddc54d326ec71d253245d702164c91f2728845d4157445fd85813379453b074732a9ff95f1a3b7e07573f6b1032bced980f1332a69b37930fe419996a00bd190d8600d26e743ce4b7f5146e875f97f93fd44d6a417aef951a21187f2de0deef0eda6191fe1a88c067de8326fe83d5d7c7c39d47b68e523d7667b8c14fe14382ec839312f1ecedfecb179f21554b969bf0e6354382fc08df3109815c39a617ef813b231904dea66284804b2dd0ca5367d1b250fe1eac9cae1edbf087e9b6b2ad90f7300f9da4fbc8d812e870ae1786bdf6ed48dd79bfafd8a4d09e69df76e394727848d723f426c07bcbd537c70d7bec6eef2d7f46a8086bdf052299e6d1b8815fe85c97175347f853be9d7bb00d1e1d96c389d7bc683a33ce21ebcb70c77ae09a6fa788bd83ea9024806f326a9c16d419e75f0f0780ca908978b0cc727eb6579951ec09a9dd2f32bba9cfd5553474f8e284eeeda21acb66feaf2fbb3969d41a7f36f5ac19848d345cd475a5b8e28d6d46c6d1d094bc30fcd5bd626b7fc39a721f1c587b648b1bb7d3e5fe9043369f2aeca0e8e49cda1b2b1dc05c459c4a6459932624b61fd3dc48a4dfbb4e10273a2c8a81f4e8890faaa782d2e7b7111630d4ce68c298b082ffb532795e32e56b5220fde3e4dd241eb610cdbed24bc0ac2ad6aae762e8cef77175a1b1dc9ddfe99a0b396dacc4f6b14322596f47347d2c2c330f8bd1cb00b55a7426ff99f96708f94027874feb3185ba175f3cd2cfe7dae20f2241c3859ec7960edee3231cc8dca956dfb6c036ee39a45e1092c944d5bd57fe04deb4aa4a028d170dda2292a47f8c51e45bf7bcdc9b217128c6b0606a61445a5bd4406e53aec43314b5ad614ba14c5bd11bf34978011c3ce4d320e67dbbe9fd8c640c69dcc42d0e249b61b259be00f9731f7ce27be0dc6f593eaca811758720839ae3ac7859894961fe2b7f3833e372c4eae6336309e037ab17e68114558bac7849761d8f3ba6b9676803b673cc5c84a4b236123789590c700c5f1c83c412c22d9c9be906224ae2cc0b9b19c486fb30d1bd222f08325ac2428fc2680dd37e85b6be96f4c2c8c7006d8d7f8cdec117cd1322a8c740e246bf333e7befc1c441f2f78be5ee7db93120d2194dd07d8678161222d07c56a74125b835a013d2c95c3daa8a1bffe2364379f3565821114a77d727261bf5048faebd86f13e9dfdfa721ac275ea0ac131679013e34e88d4344d293fbbd669b5d7970aea783438c910ed135c282806683f2e4483542592e3ba2516183166ec5f45dbe037cae9b4b9f5c33145f73032256a4da8e1981b8f7f029267708cf8216d5150d6a3636bff5afc80c6e586bfbde2370107692bfdce51ea85d28a56e9b20faed68994830297ef919c2e92c23f26b6c3d1e7ce8253684d49a88a777cd46c02e7f468662bdd8892ae3f98fa0e78014dea094b98b189985bda756bab8f928dd9a53ec905492608a85412188c06aae0c260af8f7d65de4710ad73ffac52cfa10ef312e99ba46ce8794746827baad900690aa27f02b757afce2afa3848b9334e35fb16692722ecf642728639ac3a3c60f3dab8e9afd3360e84d5cfb76b09c9658a7e0a0644c7d73f4fcd8f2f3c62b2a87eb3d9a653d8d4238382508b1f48a7e50d61f6408aecb82007b3a7bdac479199552e23a7537fd5dffe36f7e759c06a213fd2d22647bd57c7b6d76d1db9304258adcf843ad904a201ff3de661d4486ad421f69b06900380c49842899d57987e143388288dd55c51472924e57e5375c64e80658d1546ffba98554fbe595439a02000000000000000000000000121bceb5146f64a7d527d2685b63193967888b967ea0bc4cc6c942cb9703d37313f04108f36cba5ff2c5f9e735cff6a3024c26ed9e789a8bbeed12258b02361821f866dd88efb806b9e4b30da17f06c5be2045a8b0bf455533e1d998a53f9f9500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7af57f693050be4c6832ac980daeba1010bbd5ddb229c360b386a421afde3f56e19a26d7085f6eda003297f94c2f91a9b83860b807d29484ce4b28d6dcfe86a5a1f7c19b5681950764c90a310c5699915f16c1268d516b8b9d721ff55b0d2391b6640e2516852b7636b5dbb15d54a5b4e18d4955c911f8718bbe3e122bdc6020310390574a47d8db01dd494843570c1eb200bdf25a299dc1c996101c9511deaa5030f0d6e1e402d5f602b5d5f431e775c87293b0af9b4baf7bbd54cf88754fd3e270a04810ed386ea0679f1a9da1efbbe846c4d483768c5668203fe45bac340d645adfed5d0c482908ceafb3eb10c39d31e9642be4d401ffd59ec9fcee6bb51e4712a0320faa102dbfbdc34866f9be3dae4b14b1538ccc5b73c7446485c85698954de54020e9a33f28c8157b4393846d636ffd58599aa92891d85afc3154c3f62377908eb0317306d10127c021a834f082fdda1286dd79e585cb9234be900c059e349b77b5603137f82fe80a92619e132bf0b61eb331d1c54aab1d05c64da1aff4b3dffa79455030139ca6b1343e26b3d8ac3a9df546c9637cca61ce63de19ee9278c969324fe8dfe9602eaa3a826ff280b9531e60e60000e30ce3c00a7aa748fc3961c8bd2bf4bd3907f16bc5b17804c81b5ea182427c1d842921b8602eba539f0089bf9a3bb93d85ca7982f8fa743eb7998e3a79faa18fa32bc6d1bd028a523d066e8fe026c36e12905608a93dbc1326103edf36f02f92f30924fd4071b97f7247b6a8c579545436ade235cc77054c884e1303451e578f7db2be8f14a07ea2ea8faa7e7b01c9fa872d17661ceeac462b536e4d469e13246e9826f76308cd48e1e430c2291d84d73e14d3403f1e660df12c55f6d6593a51a3c0f7b78e98c666a2386a465618d8b7ea0616975a9891520b7e4b861ec50ed6e0bfb1c9e960d7792e4b343df6bda66abcd547f094627c554fc22832faf2c7aedecae847574ac03fbda4334fc45d810da4f80d2e0ccee9f3ac8a86a14319a37ad707af5dc8993a5bca7f8d1c58b2ed2fec178111d382e2f0b3c8cd683a08029e2bad288965743037481ac6806906009e7087025202683b850e3419d46e9ab6e9cc6c2ed263aa3cfce82927a0d4ea84e809181f45828e3a7905aa43431be0dace1206ba447238d639cacb93b48c416a7738f95882dbdcf380a93f3958533e859c6f4fead8c343de4b866f0cb11e92ecf88e668021b13c024691bd5c6a66f8b5447189cbb24e030f67f2262d821462d3999ef599e106a22eabfe88c7ea622d08ba90bbbd03bbd9c8450a24af991be2663cabbec3c1625d12a9e4244c46776e2cca09b91a31fab18d47afff16dee2d702b6babb2fd2457ac1f4ed57a329dc59ae309e0e52921b6989becf9a932584a88524d6add1d3be568a8b876d4740eb5a5ffe1f55017ae6e78e39f7ba0dfd74988927d325cf68a957126902689d6e1b924fd5ad59db554babb51d5ee871ab8449b7992efd6bbc7e128763c13250a1e053e9ce055c20a32753ce58575e88809246c3c2f4bf84509f9ad480c90d55ef10f2b837ba80d057725947e7a3d7107d9520de8aaab350c1e2362c4f5817b5515fc4336364a5347329496a9b89eb1402f1a46fbec38a340c5df1c65220b632144cb284d04647464ccdfb6e00c623fb855e9b929bdd65a7719776bd6e823fd6446fc31df437099b337bc0a998a1c279a334b6c827f809b5d8d3918450f6320671d367fd1a46e75dc3c95125bc45cadd6c8255706114263b565819d5658845e682a844182f38efaee52706f10809933d35b13af39b8fd42fc362723a43ab7abbdba16d64a495e4e4bfdf80967a5fcede3fb72a89298b1d74024d5f952715b2a5f89c3bf43036c92985c22fc825940a38e1d198a41cb0c2ff3f53f674d8733e06018b6ea71f1216850d5bba624795cc6542e9d57cb26db9ef73911c0e2a208e668d91615ae3bbb05958901de18d628cffbdd11ec2726a1dd47a52b91aae5d5f4682f4c7a76ae28e20ac80b3505c0013ca360950a11514a304e7c38aebd51616a1bb3e1404785a69cf1f42384b1a5ec905951a793533ec62541fb7c9dd335920099eeb681d7ce733c74532f50978e9b42c91895081c4727687c23f39c9ceb34179f4120c0541bada5efe1cb00d18fcf8490ebaf4ef4a6281341d9721ffa25cdc020e9207993c3f9a109e31b34fedfb7f1cfb677cf8709f6d7721cd650566b0376cdaa73545c36ac7502034c51008897df5476d34f419d77dbb3cd391cdc9e8a9ef051408e92474247147f010000000000000000000000005962195a756af4c9816d4e020fb341b05e32b9077b4850263da247ca6f08b560c4735c928629473575199a0271e78790e43f4f106ca2c689ea4507195e6433cd5a15a5800a2d1e0a1c3d8cb8f7ac1b939a82c1fde8180c2ca2a84ca17b3bcba700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000391134915991447eaf84bc2dfc34ba9514904c2069839af6ade8a5fe4d938d9abdc01297d2ba11521a5d6ced25b571f31bd5c2a07110a99c9ef25479974a3848a8f5ff249165b7538ae0cdea2cb729967d618c3520a4059e9c330417d75190a4c88709a32d4cbe318715138f6a9e0d53e2f1359fda395e3f56ce3f68acc156720204e0853cf3ea51a0e855f670bee2da7fe8702fb4ad8171c1aebbc10207194289020d387c9dea0e27013ac7ef6b78fd16195b13d91df41c7f257d61a9c83cd26a820a0275219471f13d7cc3722fd8169d0667339c5f3625a69669b13c0e6586ff0ef44d5d9374e99b589cc317b6de7f79b111cb3ae598f60dac6900831adbc09ee0190321ce887e80c4338427b5decd004e96c790a624da896993f9e75043c0ae3428200219bc501d4375e90da279b22c89b040a3b424364ae70fa11c6d74bfaf0ad9ca7502239ceb7836ee8ad1e7342ad3dfb5d63b4801b7e5282403e94135740085b151d1020437700a9fd2da29eb38365b25646ad459c98961ef3f89cbc3bcce1a88ab228503204148ec26ce30be7894ca1979b06f03a8e19d78de1dade999f35bd5af58aced666a0224161aac939e07145d2f602d1a2394b5a8b00f2a8f8ef3e08e41f82f7962b24c34c985a99d4d6afc7398c465893ba36b95c51bdc2f127ac7768bfb469ee27a56762beeddf7a37a29f2277b6f45723099ac9c7a6031876184cbf282a5205ae1ea30f504021ca57426772bf54db231c5309a652b0ffee392fc6505b96b718a4ed4a0139b5082d9f722f7b30434eb9744b2b9dfa57774c155fa688147276bb252ee95eef0c3d79e773f1be294f6c13c3fe348482abe05f76d0dd60842d333002ab34ffc34255cb963537afd29669a07f7efe42bdd8a9d00b03715518c0d663c148a6c67cb18a10ba8bfa68a54b98bc20381c7a55cd44e5cf95af4a52ea36e01e998eb1968b543b1cb698fc098eaabe5361b05c39cebc97e2fb2bf696f8b891451ca8d24791dbe7d5387a8a276d63ed38c4ab35fcb8996993ccb0df5f51ee553d0e445c8867975fd7bf3d2e0d2970e38c9b4049c0a36d445674ce57326f3eaadbc066d197a9b81d901a85e24e02becaa4f28189c4952cf5d4f75f75dd4f084e79bb2d3087129484323fde953202bae1dcfe552afa020f5febba4b7f80af32d666efd2b7ac9cf950b2122ded9ebdaf459364e10c1db67cb6cab0699c580d1758db288cf7d89a5822041396129af29ee4b1fbae14e2cf61b7a3dc5fde87b88d369ecf36017a8d343c4d08b0b1f6ae9cc8d16f8d5e568d0f2bff39dc11e3cf2373972137a7c59077ee9df2631c9cbdba6531f4131c7a3e1270243c58a5cc0d831cd9c1eff1901f32dbd97a420e2cc1142741298e36f44e493608217bb95d8382db1b00e70bb7ecb9e3cdb2171cc23e2bc12957d37b65d012714cb773fedbb4ba840816baa2dd8703619a3672c82a6b6b2e2f9cd6754c1a98159c2d40d8051a0567ab440ad356dc665e4254b985e6a85784687cc58877c8d398bd71465b22d87c2f639273fb9067d0e26d63a522f799798fb1a3ecec5615386252847afdbfa8ddbb3bc579c5a635219b75a056ff8f78ef75e1ca1e9ab4fa0524a6b0a9cddf70ed6033c9bdecdec44462db22d98f6aaa796bb943971a67eb08df523fc1d9ca6a2c5e3141042a9a1da3f45034263f0a9d68b8670147cb214a99bf4cf22736c52267f19a2ae722b6669824e76aa972a12f8ced3e8aecd1c9ef811d4a9192dd379d9e22a59d4841b3b3e4a64c02a26fcd2bbf6364ec54cdd13e5f0a1353da7acb77570fa75a21d6bec73962960deffbeb8bb307d8da3912f2396674aa03ff4df294f7de86a16db6a2897747e94720947a0fef6a8c373c28cae4c362332a2710b8bdc95390d607b381651fbda90049cb9bd13eec183723e5ea5a2873c8f18f2fa24ecee84f1777fc7d5f8617fedc200dc00dc5c067b99aded785b2588b041b241fb423bcd632a073baf475fce0d0adad47bf398b47ad710c8cb980942ee4b1b38ea500039d145fa406b327baffd741b7582649cf13d8468c7d6b59d188904e56fddecb94cd1687dc668a3eef40abe651fb07c14aa8621664242a2a54f158e82159789d77eafba37ca482744ec3ef0df584fe8716ee4429a13419e6bbd33c0eb328c4ca410575ccaffd22a251eceb5e26726de214b9f36d857bdb7f4972e33e94f39b6008c7ebbf9dcea5a360bdf6a3578243a5fb4c0e0ee35e0d7c7c86d83894bda36cc8ce8262ec34f8b9d10eec9ae1af60ef13a90ce6f916297bb2bcdf0d30440aa4bd046d3362428376c8ecaa290793eb0a08665805cb463d6db56520286191359d01c00ac5d643dca048a11e3586f2a736db142bddebf98e899404b329dd1049e441f8fc63df61421b1f8cb8afe74f525edd709", "51526a52", 2, 608300159, "15d76fef191077394f4b3110ad6768ad5f02f0c9420de34f8855cfa945e94129"], + ["030000807082c4030210da28e60bca55d20d2b5778692c8a3cdcb45d4d8af48349c6a4953e1cb7026c01000000056563655352ffffffff1a6608434d7d8a51df53b350f6a36cc455b57d9f78cdd5aecc87cea489d8c063030000000751536563655165ffffffff01f03c83020000000005536a65635196b33040b5216fb801f841a60100000000000000000000000046c17f867389ad949b77d050898d6cacdabd9bbd99e75318b41983a949acddaa19cc975951c92441ff459c505510ea0f12e478e1745f98b6cd8f00f81390cb40b99e61a4b46cecada586bc2ffd7d39ebdae62bb943c9491d68146e235593a5e8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009cb699deaf926be49bdc200b565bd30880763ecf28551be3e6f3b1778fb55f33bd8e4a97d4f6447cc596138d5dbc3fed78a1f73ba5c0dbef4d771e1e797eba0e2fb9e44b544a7da2d5175041cd6c0350fdafa6252713aa5ed853ffd736413407c7d5c654c96331cbca8970dadc96df02ce82a761d4ec766388eeeadfd34e086c03179df1772ee2aaccdccd9383e6a1dfa0ebc1051e4f9ebeaf129cf884102d86f2032e0b85072749b09df8c114e005813c0fd2c28666ca224e1e3f629b985e030fc00b0490b39949480c02bbb2f9a27d5a4a02d3063b571fa5f7eaa29bc343ef85af1dd53e3161382980ae10c79f4f9b4e326bb61d27c889817d94faa0c4c3c9c5d5ac030cf5c522279d5a21dc517bc139028cb590d12dded98e2e252e2a30675dd3569c03042ba722af28c0a0bbfeb25e0ce853ad1c4623a3603686ac1e2e80acf627995b031149164845b5d494047b9e19ebfc876dcc7edeb6cdcaa63fdc992a4f4826fd37031cac5e6c4636ffa18898d98e1e1c6b901e3c7a73202d7985e10d2cce2e415d590223882bc3ca437d84ab937f85bc26e027fbce253e9ef6db858d0a72c49eae3b295134368c510792c0e4b99eb72e2fcf741c8c0c2e599b0d84a15d86e562d118ffc834a9b16486115776e9c5992a6028ddf70dc3762809cc362a1d0bed99ef30a575a7c9fcfc8a6fcbb09a9648f8331607f17d12445d63d757aa8ae4ddb0e77d39a81f82782a2b7b7369b394f3ef093b76c58f42fb387f6dbe1708fab09e71454af7ba4ccd1f4665fb5f76f3d4c178e90c024371b9346cf2850f26a3e53f6166c6f110883c74fff0fddbe2f60bf08365eb1cf896fa7a5b139d3383b3cec38b32aad0f891ae772fa712d13f90a8035f928c17a9cec821f0463b2cc1a43ebe253e4e70fa4729ee91a418cf92b17d9894773f4029517e759a0d04969328a26ec32b35b68d95af69001878b8df74de10ed7a8dc21e6395e8019ce697ef813db1604f131412ccbc685f8b431edad72b4712a9f8fddb94596c385a9ece8f92e341472f5fabb963cd1c4ebcfb4af2d832b6f8cb31fd810d0ba3f17ef18572756b48ef78f8f536a9d0d30c9f8013f1f5e1f269eb0c33fede99e8fa22e4d1fa253147419ef3520f6033896de291a4b195451a8863f50fed515dd31c78e9e4575cb112eea268a73828b8620df81898c322718135793e398931c5d0adc02d3f554deb9e131e5b74f01845e7fc088fcdff2299e60848be8241be2ba659d3579e9c7ffbcc3f4d9707f5ad42e6a8ccda59c3abd1b11dc6dada9406b7dbe72523117b69749499f9eb094a3f50b0f65ae2e4e56a5ae9d8e162e35486d79fbb94d7639e3f6b96513689f3212a5e430faadc3dbcfba7b4fd6d80a575c2bb3562be39a224879ad4552993eb6abc0dfc371b0cd89a2fdadddac02a3ad4d25dfa64a002094b265a8a323b3152b21624d0123dc10f600e5963645eb4c06d4cf9e756b083507533d4b80d2a14fab7109d1e5cf09f6ee7efd3f94ed96be1b4acca0a973f9749cac5b266dd7b8c3e83b7e7e8b09d6634b20002748475e9daa8135c0725c693bb267ef1bfe6c5aba9dde844d3dcf385699918a3d1168960c978aff690e1c5db079bce5bddc122a67f932e5e19231db33eb4e837c11a5bf05bd33967d59fd00626df046ea24c0a936db7c7435c6f9d101f193f3ee8e180a955a76d91e0a059e0f39be5f207d22694d03dd0f8863ad78adbdf615c2b33474e73c4781a0a956deccb0a19b308a662386eb46b339a42716da9f31b5f151e5209f0cbec2d5b69d9cfb40416c31cb4bfaed64953d4a32466d115220540a0dedf3146abe1d47170e443ce4a001b4b34fca0b3d2b9b1be673e16f36156281083bbd5ee3ef7587197f19d7c9f6e2d1ce2d646d031b949453e15969cb6094ff84961432ae9fd852f705054a5f1ccd3c44d660dccbc3efdc3e3ccf97b6cd276b9d3b753382456e5c06ec7abd5a913b38a7c1c6497157a4ead15471c191bfe24528a3177f25b547c70071db8406866a04adc16a5959a2bf79d98ba737db159d16d6f849d618fd65abfcd27488dd52bbecb9ca17318784fbb6a49ea1b33ca4a355a58c8a0e01b26cdd3166bc66daae348998729a839af661054d80c663667bd00c8507f0e3dbf7f58b77336d22855e2c9aaf8cf5fa410fa5c4cf8b88d502876dfc076789ea3fe4bdb52964972055f86ede713e81b11e70d3b1e844b9629b7bbbf2800855cf27bf98deab2e48bf9b1e0ee0edddd53b923fca64936c55c2a3306ea912b4f90bfc452cea31301d01767f8778827394d3d40cf52ede0af468a6f4b51b42dcfb990c5f96b36964fd006585ccbd2e48a787901cb48bbc1a0dfdc6055ea0f32408c210cc86b966b0482ca91604918b324625774031974a062c06946d44f1a5281832303", "ac5200", 1, -440778132, "ba972a681059a9eab5a4d140d5d105023ebf22a07462dd6bebbc7c3677d2dfa1"], + ["764d0a2404616e2ec1a453676be3aa433ec678ab5c6f075acc50821537e9077e14bde618a503000000020051ffffffffa9e6f03b4a4dbeaa8bff2203a8381dbc48693253d48a5f710cb926b5fef4c8f30300000008ac53536aac63636affffffff9f62988f8574e5f5160cff02dc2f8e34f0eb1650c72e58eaea6875e881071ca40200000004ac515153f922a5afc6a8ea50aa087f073d3792aeb21b9a466215ce7521e3b67d5fa98e1b8db2063b0000000006535353ac5151ffffffff022bcfc50500000000066a516552515159a0f0010000000009ac52525252ac510052a558338a015d610a01000000000000000000000000dcf749f0f686ebd38bf370e4d6771cd8dca401f020479e9bc10007ab9ba20fec90a88bc0df749805c6594087e0c118179a8c8d6345560ab21072c0947d1a0321f32c237effe81f3595ecde775a69c25622f43ad624e20594bd838210cd826594000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007681954562afcfec451e7c2cabbf1fbe081809608e727057c4a636fdbe73bb1dcf0572e860621e3d44a56d9a3b9d5af58c7aa9943068973b2dbb481f2fc937b4f270925eec36c3272b02b5b5acfb94338884f0a068e1aebee6af8a3a1da0bf5222ab61fdb0f0c8939369ac64835e08b9ff61b672a5d8b3a764427893f8d48ad8031c744ee85959cb8b7cd058a58b0476c42b104e6e19095d3d729ba7425ffd0401030d718239764db92e09eb5ff71b924750248c9b513245db5a051544ff0fe605160a060c364a258e31263771398a3193d29aa039843943267bca2c38ac1a4d1d6c72c4bdb8ae40122577dee1e495c546f1c8a6c2603b624f3ebe30f4ae8e112d8c20031f00cea1ec46bb971573b69bef13d11c99dfc3e6e04ffcae77e996b94216be04032c77d6ad61991e31bb3c2e6fc6881054f160aadb9f031920e42e00e02e23ade6022607a7c0a4020c7b0990d7f0d269e548e27f1e2ebe5db3e0223f4b8d7207ce1602141080061b9424551547a42a748c9f8b91e3451be62c12bc9fb982f36068cc9e03202d54d8de9565c6eecbf596fac99bbcfbf023604d12780d17439145d4e144b6385cae40a367a105c59fbeb0e0f2d59986c02d9dafcc5fd14d760faa17d01ba75efd14713f347ca855b25b590a2d3d25a00d7f14ef0f111d3d84015ee5a9b30ab25594916c6a52e8c2fd46f07c72a34b3f0fcde6ec9069c5adf6161d88ad35cf2a0c3d98b77b5eb2d796f644090d1f0897a160613fb1e3a708087f6f350cc933d139ccad524ae8a7417d3804e78fab83a65fe930ccde745b6fb7f5a3a840de7e39b5095eceb88d1174f6dd92e74b1d46992a93ad8e5f70c4349b0e41ac997e92c032e1e1c990aa74f33a75a1757ded637bcde2354a14628ffee9bcc88bd4baf5344eed28f7c2b4b6cfaf58bf0492a4b11a2f165bb3531f003ff6ffe5c9c8676993fb0c97e4351b098abebb34032bc41f264fe43b0168d929bb2347eef313f595c38637a3b814c48c2b1462a622ff6f9c6853c35389a98697acf183dfbeadb8459831e155d51908c79586d91109e08c4e998a3dae54d761cb4e653b675599b9dab89f44a5daae1e845152a315a275370ec9bb93e8bfe64a735fd66715e0a769877a7f72612be81a76cbfadd4102c3c3b3013d544e2f6ac5c21a0c51070fc5bfbcfc5955ae58a2ddeb27482480d9c1724a465b7615d1db0a6404d8bca2a70b1c08200a465eeeb4552b236e9f691ca7e76d35c2d2a4b54d20e20a87d235dff8db077c8c3920216c03e928970c01f19694e8e9331d1a7b87901475b21f687c623b0638beff5371e1f93ec248168bdddfd7944d6e0f36d8cd6d2a2f5152c9f4095fcd8538209eda88b5f434d14d18a8e974554d2d399ddd802dd741da4c2b8684a1632490b69688ab7556c73877330432b0aac1399ac18cb07fe7e0ed3747f4771158b7c066a3ffcfde1ced8c1650d5b10c27ccefdaf1c4230d1955ef104df73e43168655e0267570a620d1c4a9458a539861857d876558e19a565fcc6f1f7497785954d04d8e507fa43fad138200d61d420a9ae1603db1ff44a7b3c23ae030c6203d8f6fc13f99667dc525d37e463917b5847b22e674feb6dbcd24fb158ee72805a4771796f406f68ce789eec4cf9195fca63261095438341537a968c71d01a90896e4c3f2106e410e516bf41105bbb411aeaa0f5d40f1714407687a983b6a70354edebe67db863160c0b907e1efd5e400ac6457c03b4ac7a12acdbd0ecee3508ab35cbbfedcd7230949f915a7f3c523e5db6e3cc06b3fab3eb835473046fa66d4a14ec0b19d47243288fb6ba7eb333ff229d0d66bebebfc84d3b650f64659bd1d46707efad419d3a2895219c480fa65887c2d7ec91d31c99e8f708bd6e107564a3544ae19e0754da33eede118e480b90a7732204bf1f3eb9587c34fa0e9b0bdaf2e40f0e8edbccb4f93670932841e029df08c23ba792a0765a62e58c145b01177ec3431576174ea9224db7c407c34cc4dc7d8ec4a96ab86eda22e0edde97b6c05628542f1c1cfa1e80b3c5a333b619be4b0da709bf95ec2977958ed4e378841d6b57f1eef466d3ae62b3dbd6c3a578f20e8bec210c7d778541cdf0de601bf8a448afa704b31334f7ef09d356d0e3904cc2f5d643490c744b3ec50329f2f5246bf68ca10833ba978189ad591cc2926cf5ec28f676bf83be45dec1cacf46bed5504c2671bef3bb2bd936698b8e391740c1fa0262906a11580b7df335377b8f8d38049a30f7becf738b08dcfe83c0fbae610ae184d9f1763059241a18c5e0fe3411427779a878a11bacd150132651e7548294a57303115db80b14f0dea4ad433f7fde7fb5c4e29205ac0983e4591d2421b2a5d1af3896dc086bd2b93fd0479fbe0a96d779b6759f521da7e3cc131429b2194ab9a0b", "656a6300", 3, 1808694734, "7fa5478b22eff3c07e2883a80e0385c95a505405e6560470710ee557450068c0"], + ["1ee2c65a03f479529dd1cf9e00a322ee432a22ed199af4e6238ad74fe8873c6055edd5698c0300000000ffffffffc1c92366acd025d58b6f64358d4cd6a89390e8c901e58b4257bffe9ae4c47b0d00000000070063635263656a8c7cc1801c1ea5a3c0bab62cde054b36e2d58383e7eb8e59cf2f26c29f336e37765a16be0200000008526a53ac6a63636affffffff01702466020000000003526365000000000300000000000000000a175a0000000000179efe20968c228f58e0c4f3d338c56d62cac49014a617034230e95378b73f737a168b9cff7f5d2948a53755a911c95069e8b9ed242eaabc84d4def3bb467b9211f0db531ca3de393c82474ed0dd4a2d68bb2a7934e316b5b725bbcfd0c65de000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000788cbbe73e02782b7891e2ba792f453ec82dab45c37f71842da7e61d309225b29cf6104f65326ff41885fc385c7dacdbad3c1eee1a7425a35b63c1f5440bd00bd5cbac57e917cf650402bddd938ae9989ea546f4de863974d9445338326405cebf9bbdc40328c5789f72f1f1882bd1bc8180a951d30698ff7bc08ff54c8a4d43021ff1c59e32e9dfe878eba6ff781867f7ca814eb492d9f44c978e24ae37fcdb3d02245803a4426264500725d49fcc53e1c87161f0b5639e8e6319335076812a22440b01b181564652b00d66b0c19b3e2d7c25383b645fe574153bb9ef767e4127129f543a306b6e46a2338976f103676db24cdbef7ed8e72cd0f611d4a1183eb363440206c402576afaed133f4adb49ff8271f56a4e5e479a4b9029e1f2c0d7276deeb40227e145f59dccad558a24899086a114cf0603347d6a78ac373b5189ca0b8c33e9020c7a65536bc7cacbef3d490960db4b6a0b565a867f8b359a1e4f96aab0d0479802254bb1b4f89b0fc414df8ab7a254eadf1d51e1690c09e5c73051fa2092023cf402170a0530d7b6e2c75d376771736def9b6b72e2ca6689851b7dcf9ae179f501a14d64e52c1d46016ee3c79a1a6415a342beffdaee7ac2b83a08d997b895f0450a0bc7172f418f1ca9d63ec913473a9b422bf17672762d9378a5ff84079436db6f6d6d24316a5cb6606282d15a7967e719d9d2ef53394f6f8b4d7c95234f59420c4238fa0f7349a9264593852b700e433d0dcb380e1c67c14949a1213ee9aa0cc2fe288e6204aa0008ab8da3ada2c2544309dd994f044a53f92ac503488fb801c7b32b6bff2f6557e97034b6fb1d39a41d81505b5163c7e5e8d271f28c7f5a9dff8b604fec56b3d54fc6c8bbc69f28b5f755ba9cb267d1ed0f9098f556525bda2207a2df2dbf6b3c24fee7d01f4562ede6e8b67515d193338cec88be2f8f91dbe2ad73681da25fd8dcd2aa3be12501ea193de6af67618ef29e352beec7182c2c201d3a03cef084f46300a0258d2fb54fe770a353f5d60fe72d17356c7d1e7a7be6d7d6d8ed0010ca378fac2a93204f9b4e3f32c8a65c1cbc4401df6903f7e657850b21f327ba591e7eecb56e82bd2d1471692b0204f7d5eb75a6a8d5dfd445d462bab3b4c2618449644840120edd995fdd51979ac723bf3d8a5fda11844d1a24bce31603ed25ea5ae6b80814d60468598dbd35ff3c69d1092b0da3ae81003ef58ffb0d0fb0247f6044107cd59236138b2b0db2dc8368bdb7f95991184319a4a0640439f75034e339d603162161c5455aa5396e414a792fc3288ba2135346896e8bac9831571a7b8ea7a871878f7a8768eb1a858ebed908b32e1f465e84cd2c10a3fb8f56cfe8e1276c991900cb8e7755432c6657646f0c2628cbd9bc404cefbaa4b471943b26f5877883dce6a1b26db5c8bde1bad70bce0cddef63ec0d1e04248d93db35faf3abdceddab11a72f4c0ebcb131de556749190467d9d2f7400ee90426702bb8b54e08ee9305008a91bdb21373956bfe3a557cbfeee50607f56da3201a97044ac94f4f87ddf5430cd9b590d6c281cf5e157185f56fb51a54b73cefa78f9e90392f5704e943ae0da3c7407cd248e5ec11122e675bd5c0af907c2227215512c33ae4fbca046bc52cb8bd3e870a30e8b4fc9c2f2cf3772634a506bb5bbc6907ce9bac1467081cbd860d6d0d6358533181d7e9e68cc184b93108e881ff8111390ed69fa1dd33b5224e308ef78ac446dbd5c5dbf57abac28d77ad86c2ec64f9e49e72f0c1fc81ae1234fe5654b54d1bce9d502f2a8e6d5e211abc88b87452695c1255be466f043a8ff24e1b572b342695a195b15d78263f43e64c04f7f01d003b948f70c10901c1877dcdeb2bd09b5758fda6f087fe773267648fd1632d2c5b51d56a4a85bd1307dbc38e1c597fa91acdd1fb75c5a58155af96a883977c6fed3ff28588e535d0990cb77790af52380a516045ca977ec32645e14be60a16402d6775baea66632262fbe40bd2eddbf5bec7a9e63564c95f726f356923e9db22d248602bf7f2a353d35c43831d5c89037772aeb7106e0fd726b1c430a961f9c0a65daf7284f1ea0dd14de07cd792ff8d3e46976c33c7aa083d36b15352f1012c8aabc6a5d6c385ae946a562aba578063733a8819b373341abddd5e6bb59b14ea32d1e83ad29a6c62974cb1ffe7109f9fa69926d4446ce5ef42765355c76b6dcfb53a5a473c85ed1e566923c9cd3fa6acadea0766a861334c461c5f674c3d2a4f4157ccb04a9002d74b2c347030e242b60d82300000000000000002a5b31040000000089cda86dfe48024a04830b75734c7281466cfce99ade60a534e0264f4e181668d83b7ae1e73234401d7d967b4a47b65eeca0752a1226370878944980ca7514a29634ecc08d3be96220378314de46e40867dd46ac76f7297522a0bcb9769ff7c200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e858b9cadfbec202b50ec4250d377e0e34cb3a14072adb033ba1c30390ff1a4eac9a416365cb69e84682e77bd196927bc99380bda31befaa18776055f8db9fbf1088810b92d2477bf81dcd9ec0e790261986fc69d7f89938f010a98848b5dc358d9d197ee4bff62affad19afc5f930bb74633e8a16a8152d55ba8fc253142ff60320b74c3b8b28d36acd5dedc15f8eed3888d5385a58dbf7f8d0c4ca7d43881a22031b59b6b3545f5af838870c629e9e6eec82321e04478aa34c0e3e98fe09938e250a058444afc324d8c9bea588402e62df1c96e051f3ab37a33d3d651b40d1c81c669b983c0c95c529ec548b0b312f93b2f945a7ca2cb3e45fb005724f197edf1ac1032fbf689cc17b66ab502d264a235fc09854997a62405eb405647f0adf14225e8403166bd70c3eea845d58b3d40aad135878eff2f2f9b959a43f53447c0a4aa26d790226f8c9bdcebc608a6316a7aa30c3d155e48fedcd2ce7a6db51bb537cf4b66e040201e3ae5a09763bc266892939fb488d915e45c3c0f6e3e1424a2ab1094927cfdc0329a333dd5400afeeb416501bac7819621c2cc59a9b2d13e9d6ff472481c6981884a562509623f6a79745266dc28c93657058edf535fe38077a5e265ffab5c7433000ce6d241a97d3747647982e078dc079ff498c8310ce1839da96dfe9e384af13fc0dffeb9dd04cc8845bece7809d7a81e3aa3a725f584403ab88a5208f71ca97d32707e9de16cc454da9f52ac75f6d24976353fa11fa9bad2599a83816e29c1cb0923efc0b94ed97976a912d2ca4d5ee9ba873b07fe2faa0496abb08acd00670d2108a213086a03548c08276ec8a8f92e7626783218d516f875ed922009aa857c1c92c51f2d4e3389baca6e15037bebb275a511bd07354bb49edffc8d6c37b65e0bde122315b8fb4eab15aa8f8056f8f411ae9e9b9059615eeb8655d5e72b02441473a8239b4d2d41dd418a509291507542dc28e32d075ea8cb8b28efdcd0c670c65c53d57c46792da06c744a1549675d3029e9be72891c9311fb3652efc741ebc31862ade8c066da6e4a8df5c76c510974fbae8edf240755deca900c59a08eb44bae58ce37eabe8ff2191aa2cb068916ed36005ffa2091252c75f9a02354d7597b4c88878f056393306fda7d240f33d6e955ea7965ca4d07cb815e1797d8a7e04424c5f57fca3396b86019a585179143b1ac95d9187ad7c1bf0b205781582f8e33691c92143b9cc2183f5fe2d6946d37bd741fbf47b11fb43864fe5811262bbcb59ab8631b7079b470d81e16a4d48942f6c3ae29c9ab106f9a3748898350c341022339d3c924fe4a9a5910e818f31b070bff9e626d45cccbbbf2a712910c293d15a4ee412155c9071c47e2b6d2878b08a21980c1c246e7967202744ec9af13ec8eb26bea8699621e33de04988a7881f6c6edf1ee441f90907037286ea213d8ce8c8ab59e6e4ad084c803941e84c2d4becf16a0ce07998ed71c24c2bc1c4d654e1d53b3c5bc21ac8848f5fa1b45c64f3855e4fe832f2ba65661c841994b6d6a8c351f1e94eb351e799eb143892e074210031914fc7230fb7f97115d484d56792da5e8a0310173469436a8798f18e99cb33a291c7ae37c775fb71f2431a9dff90b8f8a662bdd943b919d6ff3832d33bab87840f128875c2e976eb94964ddec6b5897847cc9999fff5c8858c175b6fc8585e78f0eb99d00d3053c9b9efc0c9ffb3f47cff2242b4756c4c273bca9ba86f681afb706944e69cd8373cba2db79f1b730c721626a2b116a928ff0cbe7f1bf9c6c9882771d2ea7f45da34575366b4a00b1d72643b4a5aeaf1a4f15422542c0cffc18759cdea43a72a84800325b856c4a720510b29dd441a1250492dd64623c256ed8e31a21157e73130b3448e79607c7cff398a19ed5cf744acfdb98b4a66254ae9b6579b33270239b78db519e524b87f52a44d0a344b1aa46a0982218ad56f27346ebc2a489064b4a71fc6105a5a5cf6099937416ab07d3d88a3afa544f163b8555321256b0b048b0386a626ed9c38f0c4e5debc423e6b1eb4cf44850a547ca91f1cf26a622a4a9be1edd181a7ca2421e99ee5addc7e22bcea9be9733a80084ae0015f769e686d903bb4b7e8cf5055240efcc7d62f6226beb0774b661fe81f6001f1c4b41f3f0bed8ae4491dbf6dc92714ef4a8ee9e6580dd54fad9bdcba68b4251eddf63ecea2e321cd47c1e7c400d3bb09d58cb674f39d42300452d8b6057c83b3593884f09303d47fa691dd82f03129224cc9096ebe73ea261ddeee7ad8d0c904112204000000000000000000000000b63566ff8930053e0102f55ba882546352122741d1f327c83a87a1a820bd78eb255e960c4087d90d634f594009e3e08fa64e2988d7bbbae5ba409127ee6048c65b77b5817478da6f6c9b6bfc47986e02cae38a819230b82f0cf641ffff15b36000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7cc45bfca425f166722f5214669d51a0465b84131d1dbb72a92d49d32d8c9d9eaa7a76f48626f684666fc248428a89abd52dcf2d6caf212f8f09f110d08aadeb5429e2f54e9d4b91fadeb802f51d1fa1f2ad74fda43ed88226d0eee2a1c17b24f5936adb2a49845c23f22cce5c3edb3c683d729db39c6cc82107d4650b1ce2e032ca29f12186d262bffea24160f7601c92bcf8616c4fc591253b4a6167facbeb8022c9b41b83ed901e74e0dacc753eb86497470dd18298eff7a1da0022157cc92250b07d415f64baba2555371fc3efb08c1a628a2bda85b7bf09f65cd7acf253e133d3ba4d613ab402e68ff287d1f7d40407998c0bf025abf8cd597c76ace324b24f00307e0845c3ebe3b3c337c85606b9af2befe0a99fd537f45ed7ce9371145aa2aba020258f300e6ab24937ca1118861916e0e9720c1fbe39869bfaf1daf329a3b70f3030574c9f16700e64d13c530635f39caa84db972bba2aa12fc31c9caedcb72b08c02173d0873e30184efc6fc8742b2b75bfb671260379f10a0db2a532b285bad9c0c030a6bf01b392b23add4502cd664e4c0e3cfa1c77fa9790889be9142dc7b08910bb69fc9ec121af84cffa4ae77fbad9ee272d41f92df7e7f3e4f1a49cb21260c3df5bb95d052f7ecedf4527d815ad9eca005eac39ed56ac0a370de72403ad44f5b0295a94d9bfc9ebe70b78cf492c21c79cf937d18b526f839f686eca61c2757b3fe26725095533a01e644c35fe5da3368a7b8c6fec0233386c650e240e7a647b372a222e932f73e312d5715373f0b1a4532c43e9ee4e62638edeade80e9050aa31df69078110dc4a295282a6975fddee9bc9d8149d35c317eafbf430edce4429dceedba528317e02083053e0b1f01416f4185222eb990bb04cbc5229b2d0bf0dc53455201a7b2a77c3cb7ae0a1ade27aeec322f54e1a94cb7430940581bdac0d8dba579e0e2ca450be0d3943d90f8400173f9104a46c242e9d99031538712970aea69e8de5131eba9fc14204ca2b518ea6b6e59846d524619aca2bffaffead2ed9e614ef38b128dce6eae9165a8ad0fed632c849f54a01e445cb5a81020203959e16773b3112068c446383c02b46ef4b3929c4761616300170756d622bf734cb80616b7d8e4f6da3f48a9b0c1b03d331e4e53a24aca78681e00ac477238c9d0846e852f98b56c315c731e0f30479ac68e2abb99def3bf427ce336714cf61696d232e850ea40016c077a83b791217a675af049ccad68e345ac97a4b80a52bdef338ffdd6b2a67423de853b3bd03bf523ee9a96e82c24f14812495bc332fa951edf32ee9c2b35eeb7b9a9ce25ae56aa30efc8a622b3f2dd09dd9ce778c252e1dc369eefce2d1198d9bd4ac7b4d10297841d8d6d94068a65039599180ed9bacb9ea3a65cc37b2c888d4d4a70fbc620aa47eeb8829e4259a985f307050e8555654be6ba87c8e3503572583ca3b3bc8e21129733828db955e8d2a9f2c1ca48e9e07771e03b827cb80544df597fe7fee572402666c42d5d230bc36fbee6cc465050fe7bdcfbb4a07c331c561fad5739154a070418bee42e00ce2efd6895dea0b43de6a6986a13dfbd8d54348a34f35871ff18fb44386c41a020e90d8c9c2b115b00b47f902f39c3e584f634aa4da24ed66b345dbc7d50f23831fb6ead93f9f07986a072f6dfcdac6abbf69a3ea4820be4846ceded68a14d5691dfaac1ca59227fd51272bcff727aa7fc96d19891894b8bdfb3f1864c39126fd203f81f8b2a21839f2cada3fed5f93ec681984155ee97d0bb2ad3dac8887af890efa99b9afcf5e8a2f7422aa226bb3cafb7ebe8d2c33ebec0a131404a6d1461c4dca2a0220a88e10a3ce9ae06c724b22cbbe65a7df5bb797e4e1dd04e51d65baaa997366e4a47efbfd57a280a91d20ea3dedbe378eefa475797b5a1c525f63c901ea048c014e4356404a3b99db4c4a26f57034d6e19eeb6fedc54df62ae42c1e94b3f0d56fa70b7d1413958bf4c861d2385dcc6c2f0c8e6ddcfe83734f1e4604830fa0330c0f068104c29ab176a0dea1caf8243baca4a037da8df68380fc8b7759b544063f6e94b14a49bf4327e118c4660725ec4a223ff48f7f562bd17da454ded81ca2530d947ae766759b17d7c298ad897d11f8967925b567ddecac0f1ab1bfbd5fc87737d686e622dcf5c784520d7bce620ffcc2060d7f70d5e80111fafc0f05653a045ba484634ca86338da7f77588d9066a622fef5f5c0644e18e17f700bd3247ad6240e477659bd5841734d54b69928b336f7db6cdea4ad33fec8e76c015eb45a053986c8a544800fc19bcd8291ffafb4b0f71a83ed875492ddeb5552fbd7714d44416166b47c16533a3a16710d97c686fcb1a9eb57702bc5159698f6c1ff9e6d92be5b8ef5bfce18d67edb2d1f0df40801247cd0830965204", "0051ac51516a5351", 1, -140398311, "50d36a402c3c7af871d4810e00b1d3c816811f2e15a3a8d7d988f74a31519a0c"], + ["404de92a04c744e9918621da4b4e58747773019c392e0e6ed00038e2ac190546f52c930b0f01000000096553516565ac536565ffffffffb888b4a408469de92e7e6523d6c7c818b9e02aee354964439df64d69dfcd1c2e0200000006655152510053ffffffff9a305f7c549daf8d0563bcab0db77394e3895d9c1c2c2d5903471f58823916db00000000085251ac6a51516aacffffffff1e64e835c396ed7cdc2e9619061671bdd65b3feaad90eef5eaed3fa087ce57cb020000000465ac65537e5aa2c704921ad7020000000006635153656a6a645aa305000000000363535204c6ea0300000000025200efe02102000000000465ac656547c86cb203ea37b005000000000000000000000000f1f6d703a43df582336f6b2e8691a57f1a1f2d4fdf7d0c98409beebb92e2960ea80d21c14bd3833d1bc9568697b9719e4c4467425ac793f876085c6fd73c057dfbedd7f69b742efd24ad0dc8e7cf07901a40ef770a004781ccc010a9c0cf088100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000675cbc362fc2b1e87121e77c32e5ad96b309bd1d2d82f456690b00fbca1543c1655f4ca0583b81245af634c3f3e783a22f546be24027ce02d54ea3d7a04013491273970b63d25b336f694a33bd12fa804c86fa95ec14493055f83cca4552cac7ec56b3c861b9518004fde55a068e846d50615ac3412816b4a0366d25b7ac8cc60311547e22dac62a8b893051404aa93d0640e630584220dbce14341b3a60f0fb670327b742a04fdd97b567da1220a18915c67c33b247baa7a08da45b6c689b6b6c480b02ed90ebc7b7575abaa49c8c41a83ce7ddb1701dd3bb82c50d8a19b7601411ef52c5842ddbf6540d3300da7ec0f0a3f880c3c700fa7bae18fcf6c87c1ca6e64f0324a7f3017930eefda75779624b0307df41855cf895b41617f0de41619e0168b8022a51b89ab76e30b0f4686a66d64bfcbcdbd3b10c14c1e8698d3c575143cef7ed020e7b03e8b0c357379f9ec094a05ec8e66b185140357afe1e783ba7fcf7707a02020b2d334e283e3551200c939e9d3e9bbc1423f7d36c51798174ddb0840a60873a033035c2d7a549443750e9c9daab2c0eb307825e100ed37100d9b702da6b9eb6bddaf30389bc9689b7bc87fd1376f7b1c6f32377813698bdc27ab8b5b8b4d80157212926f30ec84f2d6a984d09324803aa41263b325454817ced74caec5c1f02b0bc123f76ab4a10f82d3d466ad8693f6503a899d1665a113409ab19626b7f8146a9338aa0caf441c0b1db24543a519e24172fef630040900886c54d1fcbefac994bd13a8ce2392b580554e1c8b918596c4e611ed2166375ffbfe4539bd5ea07865c9867a106e7765c4436da6215fe5145a2653cb8ad617e8b8687f647ea556d0de56e8e8ebc1cd7c2f350b249131fbd6defede77c6ab9323753d1a817615722fdec48a6fef3062b96660dcf86bdc08f09e616ad80495bdb9a6cab29b942e6c5cc5a801136308ece5f0305301a77e10c9390828ec739408c8c5dd7b325169523649c70af1a2746dcec7e93b6a5a9b739de1e7ee5d900a8ecc00c1f338fe4ba231f677c73c256b79bb759fc1c8eb9749b8ca372b8ae97c133bf83b8f42f4062ad3dd6fa176a9ca8a1326008409028120908f1f3f9a38e40f4b9d47dce945688af8fc2cbabca0d02d0c3cf74014e949a4b79880bcca506dc8139bec2c3b89185e8dd26f334ec32791a0a27e0bb457f72b88ae72b2178231e6a2afe1aeeeac3c63f6f2eb5437d18bb2365632831df2168fc805cf82812cd339a5b84cf78d50c35cedebffdf68b7663176d15082dc10ff3871718ff9b9cc4b1857511b6a3dca2f22a87ee1bc2a858efbea3b0fdc6b7ac6090c852bc9c55e809c875198446c3932db21d20475d9e9adb96a757f3bf1f9cc34105fa94ae105747b235643c8edc006d1ae61bd249a1d16c0171bd51885cea877b334802a7804094ce6fdf84382426341e10de80c1a6c1c40e6a913a000cb2b007135085a2f41474d267d4d24f37730a3c15bee9c66f41e4a73e451c168740ff4502a8635417134f7d0c091a3efe6d85637c80b90a2fbe64c2b980cea25ff1d309d21f6d2582e0a7318eeb02d6e3d0b84add53337ae01436096139776ed0c4cb35270de4770d0ee11dea91396f2c4089456327249b673af45c083be9e29b3ed0c4ea7e1fccfabe6114569ff17830d83849275db99016060e09978274077ed8d15be2c7e189a351bd602e97cca255d052ce470c59e616af2bc69e87675850ffe9ca5ddf013fc761a73740b6f81c40eb11062f8bbfa1961a12d2c29a35172da8233dc42bad489360bb47847e4c807dd1cacbbcd588b7380a0197450836e78297dc382bdb52e7dfa3737a853dd00ebf25d4f680a47b8ccf0b69363cc6d27bc9e9e5196f88cd5cbc9fbb4754727aef7da432b80903f356af9a26eefb63ae2a70ac5318c8b9432741e7ac39b29dc45af9fc429a939399afad41fef31757e280546b218b375ee09feab230e005e3c0fc4b55cd41adecfd00bdab573b90210a91ce564556a1bee54e555fe78e6232cc2a62ade4312b483adcd4a59bf3b8ad7a9142f97969d4e965e9a43b92f24d7e253a53143ea3eb9b760af822421c70bafa6e3ac92336808cfaca47d0aeef1164178c90bc663d1ca0a86a461d433a529dab52a2ebaef72dbdc8d0f6030259ee043af3bbd3effbcf0611dad06a3ca305855ca136a57c7abeb42a2583901de5c24d0b9e71b4191794e6d83f2ccfdc666539761f8bf10833326af689b93921d743356814c38a6ec0e42c132b56fd53216033b257895d573691dcd8000000000000000016aa800200000000726bcf30343901ee8a8502eeb3c0ac9817f5a432cc99da8df0a3e6fae4b91ee41433f7cbf9ce815bd4e3b18f652202e95d89e87a7a9f45f28a246db82b02a2e3b58446d2b74eaa16c543373c5f29d9a25e61feaa092cecf9506b428f3707d58300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d9494b89cb8f393790ef6e67ead35d26f60d50f357aee8c73cb919d633adc9f9f37ffbeb37e5d4f21b83b6e76b855381ac9d8ae2e59c397b3cd75049c137a9da39883a510c6c43efcf404bffb1135bad6028792867a901e28f30f9e77b87f41046657aa008c5d9b691d9246389ed8bee8f702394d11d9aef17bd245e1a73509f022c326893965389b1fc88230819998f1657736f26bd0bec379b256365a24026f20320c2200254575088364fc2102336579ee437bcfb6975e967a6de5259e37291da0b0424da46b708f3896ce8a824078134945be13292f51ff0457988ba991ff26a4d01af9cf4fb0d00327390d8114772f4e86be59d166510f9ff36544adc7b186387031bc9884464d0b3d191401555182ad3ac157166bde49d58bb82ad3e00d6165d1f032d77b26c8564ab7c57e968bd343292ffb43bb1b860b02addf09923d92cc662d50229720d9eb6a2b52aaa40fecba9199e44490c14e84398ce9d440179edd158a42b0305a499cfa9739aa00902cdf1d8ea7333b6bffd169ab183761a34a087d75615210310b95249b37077a3337f87229fb30864883d08c15088f08f96850c41f9f46a288d4de1c532be20cb0b11be4ef7cabe1bae0f9587cba2175b4534a08b5cd1a9aae1d80ee033822b676ca05b088eedd2693986a5422e292243557d5208648122f97494490df17443eed10b9e5534d74e5799a736906db73f17e1f2d9d6aace94b1c6acf739ce4c5741e8389586cc8fe93c631785d21906cdce73704dee2aead38c6a73581e2d3bbf1e01407c69b88db0c3ab7fbae9969fa25c0d41d0a9f6354f981dda93c56b8849850495a91a7514f71af4b3b8e095add831e448df81678087816ca9f19b0c515f110ba2f538b973c8be4901c0fbc824d8b174f8b263ffd14a52eef24b6a0ff6627ff1ab69ca79d65c274d4dc0ba7e7a17c93fadad848a8d2da873d40b0d978c572681b262a789130b22e644be43e142b7e8ccd48f8c1022d3c418a14f76bb8f25853c051743051ce7bc53ed736729271e15a299a6bdf362f35b683f20bff00fc4f7590e2b2929b5d100a697a05d892d2d52741ddcc396a1e5e0be3811eaa5b68d2e98e129fbde374956f8047c63ba7f96de520fb483379cbb69552285e0d7790ecae38af553afaea44513d5ef9012967088d97b8f6307d4f360c45ca767fe5189f189929d7f06c569ff9ab437800e6af666b0d0c243048816c311b4eb89a80e9b276f627a8b652cac2395539a0a6196c077cde9d8597dff71384cf7a52806787c819c3eeb395baaee571ca1e7905131c997832ff29e16f9fda91b60bcffa850e27d2d83b6272e4511755a7a50ea8dfb3d33e6ba4d3785fe34b524132a033bdbc518f4aa5fd306b243d276b9ecec1319e6435c31f775d463e9b4260d24c95ec85edde5e482e021a9ca075e3e0f5f9a785ce9822701ef5c9db32dd6bc8fc7fb3c0a2050b9d536873967b2ac5da39d0d433ccadefb01d1839710c3f426df2ca829b5ab83f9a900bc65125aa56636561f1862cb98567059b7d4c3ff9ec62171ba0652ca7a91d86792690370841884531dd51bbdcff3d02a6c88bcfb1999c640d62b2820fc18b34c6c6171f831c15b164e7d71e9ba0c988a3ec46587cee3d333f87c8b9343dcbf33aef65ea87d83cf350c92b07a8939ae1a9a143b62de9166b3c536f8560c177c9345570973df7f266520598cf64278d59e57e77e2f70aa64b1545ccdddc9979683785a1c8fbe7b1158818dacbe281137907884119aa4f39c8971e7495f77a501427ee4b67702ae776fbf166ffd9ac2e2740e2d8aea17860dde8771fad4969444b4844b745170f7ba84c1d67290b3360f0cb8ae13dd20d1c27035537257b15148856346f7dfabe2df17deeb7d6b4edf170d55c1620e553e1002e97b300932b147baf292e0b3f4009f147b214ccf560d457710296f544fdacb857ec4bf27b2ec9284af20b7bf0fe4c284e4ecbc209aa724e9b6008a2e35bf07c99369a0597f9869fe89a4829792db67fd879ec0f8b80d1e9fa37988e5e7f371a496a00fa9e9268c8cb3cfa412b32666691144898bb71ab85cd161956c6ca3d53322ed3931969d8e698a7bb8b83ffaf61cd5f858d66a31c9c05cb864345c8b24da775e87bc821f74352a32baffdb60a7ba9d1ce9fdfe68bba8036331b917e5a9d05750daee374ebf4fbffa405cf011448f67220eb778dbe34297e88dcd4b30335155c0c5dd0773e5f7871f1b6afff7126a7ff60884aeaea726d3969efb8df029244a4715170a53f5a51fcaf2d1f52f7e55fe04000000000000000000000000d9d16c0f42fa0ca44a548aed3b2820a10946caacc3fd707f817d429a6630152bfaf372aa0262e9fd6018ee274ec15213efddd1958859380c674f22299804c49a011d39bf5e67892c6087722c5a08f968e7221f480a673b4090bab054e776fe6b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1e105ac5aefc76cd8eb7a6613818f01ace57ec3d0b922afb9f9bd12420444e5048528fb22e8046b9e656fbb2cd981b41c5944d633205c26ed916861c87bcec7feb4c63831f191ed1a9ff6bd0169dfe0b0f29b3515d82d3b87f649062152d42e97879f9f9ac7a225284303247aa2e0b8c69a9509c9a7f824f3a1b812ef18410a0204c03149baa5bb9eeb59b47432616570ed30823230978573827904d986d07a13020ba49017045c5542c5561f6078b6a83fca7441dd2db8ac4374a82c187ce7ee760a046779417c83f20f0c25c7fbcc4563c2cacd52e6c47bcafdf5a6f67bc71204c7f93bae66ecbdc329c829148b23cbdec3f18007d3a15d1cc2d9dcba4939b8e0ce02172749a7ede2888394a9cf1b5c339b61f31d808ecab93af6e9661ef133772777031dd30d888aabe629bdc6e840f799f5c9cdaaa2f0d80032f656bc1e55026a1639031c272d87436586c661a0abcf688df1e2fc1fc67ecb458d8bf75d2c31ae9d60bb0226eadd62f6ead8a2ae3a53f416ebac76fbcb3b43dce6073d934a9db911b4b7c9032ae2287304274e9f6fce523a252ad7dfd34cc9da092b209970c830aa3a1573be5e282b43d4dbfa939c27f26b752eedc7239d2af6090f6a7d9748440286ff6dfadb076067ebf94365e9b9537ce359054e2968b79336e88346c061c668344fd46b07bc9dfee5ba96692e1c086c3811a89251e7eb1647250a3e7cf5a705c19b9d8025b034fdac099d1096a4ce659b0c8b8962ead13168d5ae7114ea74f7e6b83886fd97b87e125aff4dfce20bacb72738cc345136e1efe829a610b7cab602d5f77ac76b329cb9f5ea57b0c5996903211e4bdb259678eb566dc2fcab636337e3ecd91eb3a6444cb7c851ac2f968bf9d296e7cfc0519960a90efe1aff45794da70f36ac59b559ee2de0cbb48e280e5e9ba2a435a39b2176d09c82d058e0d9d444a6c3a1f1a04292b42cb62616947b891998f210b4c2f0379618aa6e5e29ca47c5900b500af92a4fd3f1beb7b94f1fff67cb9c7b8a308c9c6b8f01370f49617bf763576714163cce3bd1bc3922c078cf93d5319be5d1f6c7d2713d4dd4e18db0fd9375130c76f7b61afbd3d23d116b3314869e4be537baeedcc2e9d137314fd0329f9f0ca6a9b73e47397b997a24d966cbe26c2c1b201c0117167975b939fe57c4a62971f069e58da277c246a7184b6136f303d8f4bb6e43bb9cb3cf82437ce44f016c448b84b10b61c6cac432917fb0e4b361ee882f187dd867ae5ad5047ecd96d4f4ee6da23066660602d1016fe9cc84d7f31b2dbfb1d5e5766ced5d3545cb8021a627d3392182bc5984089d4a2d234e9e8475d8ca29698568722bac5a7911f98e43d1a0e59cf726fd4dc20ccdd87c3fc652e21803edbcc41566c0006d47b918ac82a5c4505fe5fd9c929d65230500298d2065ec57543eb2dd0ed954c6637c391795fb685275e0f96b6ee0a554b67e67daf39a94da7f7745f0a359d2b6c242b8cab8ddf564b1de3dc7588a809edfa102821ff7601acbacc3b30594ac7ba234f1fe3e42c8e5fea55d97aa20abf4951fe151849203a015e374ba6702d39669e0ac202ff616db59df94a36261fab7285bc9cf0fe99779c57f1e2e7392c91d35c508a68003c1321f56867503348bb5e508ed8af68a7bad395ada5647fc82405ef5103ba7dd608aa6b084a38cb4df223ca3ac3b2f2a8ae98a09858bb3ac75c6308940b8a295b51a8cea099a78cc6fedc1c2b141aef4a381a9fb09f64bac839867c1d413b4f35549876a3ef86328b775f483d7e42ae8d298d3d2de535c1187ff9f9e3b2e7f901493af5232840f5136cdd29113c345e90c9bd8af2222d3a49cf4fc1bcece26f0fcf8dbdfcceceb4ff1d996f4ef611f9f6fdcdc44e1080ed8dafdd7e23b05d4a7f9e082af565b7e86b9ea6ed291c284124ea50191898066269c3cb9a524afdfe47e95fa8c58d014d0904da975409aa2d0a88a2616866bbf528a301d53eb3b46b58d741713943e9993e17cc6f179dc84c0e0a9bfa68900216e48c5cadd35213339e3c5678263256fd692867d96b86f0852f9691719ed7e04f77b5627bde4467e9da3b93beadb8c070203ba4a08ccebdca1a80134d5329f201a8803422759af10a8e3f81aafcb061be20290d33f97a31b92a38702f1b2e6dbaeae07d35aff5e3f2e7683dcc07e40f4054e3e0b73d8e051a50e257f1c6d68d83c3f3f3073be900ef058a62cfbafa5808e1c2eb376aadc9e8b32f8dced0ebc982be7852a560ab0cb41e5cb808ebc92c36626d7f8b53a905949dae6292f54160528d38a7b0439579a5556d4ecb854cea3d9342b1e33918fc4e59a0858507580f89019869749ee876fb1ea8213d41aef0c769abfc48c5b3024bc6c94308c3d024afe5712131b1b960f57daf6af4cdebe10efb4ddf29d05ae81b70d", "656a526a00ac", 2, -1305210345, "2b399838a055523b65693cbcaa5be43a76fbfe9e2c813de35adf123e2d03f380"], + ["f2fd615b034bcc0fb845a4bc26219771aa36397252eba1006fcb604cd7a0fe6f322d30232800000000095100516552515251655def7602542b2da813831c51279e8b722ab1f9e9183ca9ab3a03827c2b619a51f9e701b70300000003635352ebc577befc0b4e2d050939d0daa303ab801a7bd1817634316dcbc011850c9e1a52dc2dc7000000000153ffffffff04a144680400000000085363650053630051d7d5500100000000076a65536a655263b5f4ae020000000005535300ac51904cf900000000000152f9ba72be030000000000000000fe90a105000000000e643c42872b950443e139b406f45b5a5741b007a49e68e3a38af2eba39a8a3353571547044a8775fa070b754f69f18cf0e2dec17dab486f27d12d4a5ea1d09c3a6614cc11aaaa67a10f14b699f508f3727f88d887c1cd25531d22adde88b6a10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000068c449bc0882546f4708738e7f5ea7afa2cf0744a2b3298619eff033da6ea274ab04f996a4ffcff02eded6e452ad5a0e2eda68ed27434f4a26a8dcc9715a782abac408f3575ef6d388f21bd93352c8662d2109aa44ba7fae7f10a7eeca6d48adc2b619d75b5226200af265e932efcef8e77f4f64f2cc33fa891e91fc9da0317103008a1b63e07336f31a0bbf74f8653d813a7be35e734ebbb25669f246fab02286032a1cd1b4bd1adcf3ad0c0cbddaa04ca14aae594681129b5e21f60e3e136edc500a01601845f94d6b796f2f30d9955645c4eafd4a1e13c89e920e9ddd8156950ace85d15b4ccffffe984d90882cde09647c771bf7fbd5494ee20e9a49fa5f4dc36b022453d6c704ae2ac337e71481aae006b6c45b63daf8cc34deb009c20ef137935f032f62d4b7049495bdae252237c6e57b98a0cee1c18315c561dc7d7e429bde22b8022be02541d48e501f3ece4a631306f2352330eec8f0f00933aa55616db83ae4a303047bcc057fc86d570a1d8f55f03edd885e94720784b8b3bd09e3a0a756b16c59030236cd52ec8344418d32d35e89feb24b5afbb7eda5bfffb12a26a782c446224a5abfdb2525796a52bb2f453c37ec2f1396eca7049b0f2db8ab89c694ae5d538755093f1622ba4822c914d6c50088d84528ce554279e2e911b0d646acb125b83afc8af90ea62e9f2f02dbc5ec58d4cb189d3cc3ed31ceba6a9c1d5a19e837fdc6ef800f6359840854dc72d4d67baa7e29b00cf30417714ff4554dd1a867ada6a2e0770dbdf8e2ff51ae6a6c4f90c51354f49451d00a9804d88884202c2a11836c75ff8124dbbb4708669cdc4cd0368174588eb9bc62fda520312356f509c2a78991272ebb85d2190c4fddbfba620efeea93e26d4338d309bdbc56e91106bc7bf3369d1e91b9d3e65b5d96d750f344621c6dc1460a7d4263424d0dfef1bfdbcfd153a2ad359d9162528588cee497d86d29e790ab8269fb18802ad294025d68a3789c46c59585ba806cb19aa07ce75d688a98232d9bb3f67c59c7e4dd705685079103b108d1146e9b05ac694ec9f6e2ef5f0211a2e7aa5737cab87e233dfca9a762ee73556bc9d58e28d93ce8973c8cff94c88e985e1676c360e93af0a043bd0192684d87070bb2eda70e153d89b39287739703a9f0759031ab8b4f0a6901e8e3dc60170c6e32d116bd18c26e7bb834e69f29fcc36e31f195b34daf484fe584e0de5a7e3555a951b3920b856bd04bb183120026659ce0877c5e9f5f379be092c0ea4cb7a8df30150c7e2598874ac09d3351ddcf2b00d8199b916cb4074d9ad8579c2ead2c67c3c6ad05e6942eae27263ef87db7dcc1090c03e97955f38122beab42d893e7a9c575618d4ff83c05fbed7966e8d661226a515faf625a9bd279adec0e1dfde044fd54b7cf8f1f2943bb4014a11c43f6e0e88cef8a220c25e15824dbd6a514602cdde30dbb5ddf50096080c91c2fe5eca5d2629f298db7b49e06b4cc5ae58369f21f86df50e632e5fe0c30d7c364ebfd059b6d35415c5eb768185079656aab4ad4a28b76938d0b4f52f8b1ba0de3b3269bf59d8bc232b78b1cb997e1ffd6cb3eb2e7ef803656921cae9de3a1104cda6dd0f472fb96ad1ca5a583f6fd1f93926c1f336faf1ef87ad731568069223864194bd76a87c176846b906bfe7edd860b6d0e733078651cbc4e222abfb621cf5ca7dc3569ec36f692d6d57ed24e5dcd4bd6a35d3c1326b7c6eb0ab23675552b53270c21a0ea058cc04df5f165c3b92235a74da7d0fc6958cf884a18ec967e68ecea8a412e66fa53604f59124995a032114aa40775872a7d6c4bfe850901837a011d6d83d31fd4c532b53003d7fba740f7cbe6078c5746583989abe8218082161fcefbb33a99b26ba10f27377cd2a7379de0bee93e0f474a3589595c5cd12eeb31631930362868a7f20673fa0c7661cd247fba39e8cbe998f1c2fe9ccf0191e2cf92878b6b55aac2e2c17d27309972593408e80728044bc5c17fc2a38c8dd8694a05c292839be3e29034a699cba3160ff4639d15b5107271f14b0c41362c0adf93753f2eecc28d1d1d8fe00c1a1c0c7e8180607db6989fe8a9927e38f57d56794f0afc8c471bab6c1f1e111aacf326ca68e4621c7364baa4615128773301b35b40c93a4a14d1b984b5df215ce0e09cd9f30de6fccb44616dfab6a71338bd7bd966dad954e69bdb0293818c383384fff99d6cadcd69e55926f1dd86aa2e3211ffabc9f88359c98e9266609a0dd2e6455d4a5aa494d00192329d5620c97f50f49bf2000000000000000083fce00100000000423a11cb54464c65ce883a2ad8bb22d847f98949a2ad94fa968f6680d2e73a7e4f2cdc5a5491783c0510161a78a0bb92310a461e9267812c62bd3cf7af007b2dad92738231a381cc0751fbf758039aaab6d17b9a2cfe59253e119ebf79fbbd8600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fc4f285f7b83dd99960a9679f73b73a46b38c3f2096660a6fdd1681e7fe61fa1810f2b7ce973c4a95937f185857973c60a81aef245fd3c6133b1f302f40a0938a1b45a06f9c4c7b7726e92e9770247bc7b1e8fce6395ac2763321b7424a9d19ec120ee03a53ca582938c52b9bc675aa35eed67f1488dcf7a6747f165230bfa98032535cc5b6044db2942d45fa330d194df7a57bbeecbd59a7f94af978d8adf7bd103062305c2feff1b870158b910a44c047504f0cca6342c51c6045238c8593d1fa00b01e6e161e296a61f6494808d511ba1e4efc46b933534a7192bbeaf9e087cc2e5457c743924e0cf3380e72de4ada27a2a9a98ce0123fd461418ca235c024992130218a8235408a24dfc1a8b33610cb3bf08767589e52829ab7bf3ff4cdc9405322e0326ff0cd7ce71f1348a15c123597311825eff05769a48b667e1e2ff965468994e031bf122b4f5e019bceb9083a70ff57efb6f03ce10c1d8cce2b0476a6a03ace3b40229ed2c2f113e0db5f74f9ad0e25db330e609d0bf71aacbca53f49ab98f6fa4a2031f6cc7e9511dd798b05a6e348e074d62a75ee03001878bbb89d5eca204fd2a14eb8efdb112aa38b319db6c2ddd0e1ba232c4ab973c07b67827a95ada989098e42dde9cc69abbb7cedd2e1ed5986120d9374a12d334ff00786fc110068e910463e2a2241a918dde431947fcf894480c03ab447f48d972b7cea2408911a92f0c12de7ad5636746f6d11c0a7548fd7d80731bc02abb152ea76a1128aba2cd586ebc36776a7d708f08c0cfafce3dc93856e173a892994fdb9a783b587d869b0c17fb459e4b269ce76d85d00964def625f5e18b1c747d702c38d82ab2af9c2ac88e012ce182b9b10213ef4ff1832c916f7eb38f5e5f6229ff4a34f92c62392a49f0f2cfabe8ee666e14fc994dd74db3014e9fa0261810f11a6615a3fd5efa5ddf1893858c2a3bc69f874e462d7f3fb4f57fb186586b7a3c9234c15bf7275c0c8ea8c7654b094b09241aa0d51dc909ad18ac3393df9f785d78aa4071b2336a86c810302fec74d3c3614bd82eba649a49004914b505e885cb7c8655815786db23d78f64b29a74f9d72e7ded5a4a53813e9d0dd922b27f904f70e690294a19eb8c8ea8d2ace67af4230832ed5a63eff6fc3b7a3ec79d7969f514b241e9b2b3be5fd2a403a8e826dcb575ca1c11fb955853452e50a4cc30598e7e08e658a121f51f278146ee89fceaca04811985bfbd0ca107030f83978ce4f946f17a36fed6304bc2c5c722fec71b6b47c9c72440dd941d207d894472856f55d83be5fe20fddfb67417504d8966ac9d0bd80c3584a47c55e1cb35e4339c51b8ff55fc03ad1ea6baec278c43533d2e7ddd3862d6188abd6518ca28938b1dbb2c5cb87afd75b16e8d18375146da65dce057331f4104d6cd96f4a83d6fe0b3e393b930539628b7bcfca441071adbda4aa5f832275f885dab19a9e3d2fe639140f36e5628e3133c2c2113bebf7ce2d34e0b5a035b3bb2ef3eaa8f8b71d115a4fd3aba3cb67dfaf05e4f8b0099c60a081701b7fca5d18e9c834577eb11023936c0e254699b04d756dfb39a536f0a38c726bdb0304db19db2c4105d2b1aa2735b7973d7f69e30a70c704aeb8df546621199613f75a0cb3cc9ccf4c8040d83fa5b5609b3c302caa65c46a484206038a2d82ccf7868a62562c9fe53b5074d5dcaa36ef5f315089bf5e2a819df2b6cca5fdcc7983ce33936a7728242f872b8abe95ab4c595b901294279e402b2f3066ffc9a524f57dfa7582a3f2f5ad9e3c46d1cadff9def43de36c2d0f9535dd87c7e747aa6630cfa910095fc1f28aa927b65fdec04e3fbb1347a6c8fd70c0464d7354ca11fa213ec911f4b627d0ec038515b9c36434a0370fd5f63dced16da7e6ad9a86068b110fe7fe5f0973fb5446732f1f0d1c967e2b09773eb50aab633c98a5a3df259a0784eea92ca365a2d0fb417ad01d26470a147d9d191b5c62018a4a16cd96c86fb3d4c765b065e0dd06a964b639f916ac8020cc11fd076897291926a9509beb7f475157d01f1a36d71f31e9c4662497f1b193fc30edc98a6c33cf72d89b4feebd16043e2d16562c08dc93be2014ad680c77879b8384fae8bd3591117ec64a4c1dab7d27f5fc747281680f777ef1866931e36f9aefe89d2fd5a269a8c723736c0c2914d498eec01dd7cabd32c1f55610a5ab03d6ce5320ec47efea016341144083edc739c565be244cc0828cd07f068fabc9b9b80a02da9cfc84d67e87307d8f240afa280d967b437d3999b2ca2aa1f4a01030000000000000000000000004540604febfc712fb5597d1e68f0193b779d291463d8668185a244e7d3d312112f04a59a389611b4f15a59f221cb4d581b9224604fc4f5dfb7e7c58b31dd947018fbae59b2aaff7d3f9b12cb60c9447039f9e8274e3c49f6b37134ece505817b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb4bdbec3151324c6e042b2940afed76b66ced5f63705c0824fda4c2f10b1ee9a96e02704b1eea0e881b9f3021b08096bf49a95e92661ce4bf46502f2d7d4c8baa0019bb2cba0377cb5dd7bf69d63a67b7e9aabf0b830cf612ce8fcc9273ef74d2577d3d49c342e09c1c2fd1d998e6b1acbd4cd7021407e9b57bf454127bfb020306622ecb87aeb544717f3337a6aa01ec0a7e25996c14383519332c3eb5c518ad030e8d80d77e4b283dac2c42b8bf0112b037776193a8760936e3ffb31c2d10dcf20b02bf3402ef7a180cae59fba99fcf4e2a0dfc229d039e6c26c859ca790cf977f9eac9b409f694731fa3f2195b8ca8699777cee085058eb9ecb3117e0b9262e2f5021bdfbc4568d2329d2efca5bc7adae26465d58b130434433be8e68d372ca0a00502052e24d9fcba1e214082e74e666c5a224275bacee2ce5101e41c5e835fee7f6a022286cfa1ffe65f7d89b1678d65c0ce5a1155614ac5af9ac61b44ae1702a0505e0201f673772b522486f4eb827c33501593abd3ee967ed1bb0c231ee6d2d4c52eb702126a252375953d7106f188f6ce7a95bf0118a7681cd760e137d18d52d700fab704b8fe8526d594689bfef4af93d064080c997743754401d91e4748b8b1edaf1db1f6225332f1661e948c789cb6a637acd2111a5313fbbbb1301f8a5ad551e6e13bcda4219df9243386bde23dde51f315c4f36b25533adfbbf2c399832ad74ae759a3ae5c11cb4d6b09449a06cd755ac9f720f1f56eded75f2a1057ffff11a0a86572e4be98e39237cf07fa23deec1939ae26350258071484b521b4367473f730a8bc9f679b86bf3699a8a3ba9f9c2203aa2605f3c01dbebfad613acda3823c804b3aa161475f10b18c36d122dd1f89dfb2fc55a15ad898b21abae63d28acad5934b7ac6184a16922bd5d643bb543b88a8986d366433a86c53855d81d4417dbec067102adf7efb283ba535603fd1c206cd1ba45fb101bb578c9bc335baec6a169156f33129e637040e8675380f838d170a94b7596a8e44ad19ce54f4f1506b543f4ba43580b1e1c4224540d181b89e01273cc2d46ff8893bab48de4ad5ae0ce125b8826fe5d7a4605064341aee111ff2249ad0c6ae8ff13c4b139aaec148abfe6f6d0693e38011b1df0b87fce224187b0c79023fafabd17586e67a72ed19eef9ed0b20be2439a1c074c37043539ea11c2fe8baedb813cd79324a392a11c07c4aa6984e19997326c0c32e1a304d1d71584073cc13bf61e63712431b03cf214b1705ecf067225e3c6b72b4b0ec12fc3e4dd793fa91ef166c43c4231af84f4e80c02fbab1874a6266ac1065b23b3de0bc7b009de3f2d245942e2bd33d6df9f9934cea2f9dc35e782f7652ed8eba4c97e9dd620eed4337855d992985afe358e3f975464139e3941581d24ed14be373bdc383ef6ff6ca88140eec25a2a5b2cb584703abf86473e1623233ccd1584149aef2da12e959ce3df644fd9327017b8e0ad3866f0d15d53ba058a0a28545ec07b2f4082fce771c461382fa80f22bb0bcf1063bf0f1ba521c8aff9ec3c9d71bb98d7142f39ca3900aeb51818fd35e850b3512a62154a2f92cec58ae79ac5f67195df3372fced99883b037ebdcfef3891017e697e7ba47bec5df79d9777d8371326d6b18b14c4acc27fef8920761b47af1bab4b3fe522c5b3374af5873e03485bf1faf49d3b61c55f7513c1b9ed83612d3b50ca6bf896297485e2f5aebb92f2e94280dc825c47592d335ea924e67d7c89ccb3956c4060a128a29df2b038e1ab964c0e789471928431d124994d687901fc5612d58af069ccdf0c18a597e3e82afcc419c79ebee2c370565d2324d320b02f4fb93dd27f0363af3e8ea54c4d18c1daf58463c6125a5f6bda1ac502096e874023bc7c7005ac16978d3054ba310fa01f413384f67dd7cee37dbc87621a7bb764672cfb24123f65924540fb59986bbf363937a4e0e04c436e7083d17be8a18897d910027a766267713ca2c1ab79821577073b4c4f637126da0d56b5ab591c677c1daea5ad8b61a674d8882123ee2a360e1e97dbcc2f9148a8bab4c67fffcad418a1f282e4b90bedfd2efb9d6e331b8b505bcd2fe8023b5ea38957e8840e4a71fc9c95ef8983056a3ccb33a631b67cb26ce4831879d956e603a7cf4223a1f0950feeb466664f9d4e58ead89cf89c902ed158ce08853713aac023d28fb53b8635b762f37a12c11b20da17ad2febebe4bd3cdd6b0b7a66ef880fe2e6fbaed013352eb9f4fd53c426cae7be3a4fc18407bb5ada2254376168705400915b825fe65ae2271bc82d9763b3230ff9ab854a718f58e0f43447a963f31cadb95d2f3564a0f35d4272b9349d61fcf12c907b67e3b3f9ddc0ea4cd347844c4805a9ebedc8d6bd79d960ba7ac146086bda2586a966e7ff9248ea8f000f", "635265ac", 1, 1709422518, "011f714134a89f06e5851621a610ff8c795a07202828271054fb38ac01d822cc"], + ["030000807082c4030348e7f9c3ef1decc00d520b93b3eda46438e34f7b8e1b39bb598e766df239d6bd0100000001539ef85fae70467f6e105cec2f22b9d7ee7ba931ac632578a52888e5acd28ef8cd39141e14010000000963ac516a000063ac6ac45cf321f52e4f00d8763f4ef801b311d9d34396d3cc4af0f3f301c3adef4e26156f52810000000006516351ac0063ffffffff02d7682c00000000000751516a6a6551658c88220400000000016a000000000000000000", "51536a", 0, -1206006264, "02030e33468db45638fedc609909e45225dfd22d92063248466b44ee3bc698b6"], + ["37c3807b02fd7881c26d95d8a8271e31395fa17aabc5acec484a7648edfd438112155199f5010000000851656563536500527f14618418b90be188e8ae6afff4d6e6b51d5fb6c1a37af635db9daf74a150c372ef0a8a00000000020051a439815001e37f3f01000000000765635352530053a409d45800", "51ac525251", 0, 1218767852, "9cc088da6747554f5bcae07a2f6115081952fc32d6fe689d34f413048afaf1b0"], + ["030000807082c40301e57ed0b95cdadb62c14cccdc5d504a54416eeb050fdcc8178f5e99c37e8ee4b60300000003006a52f78b28b901d527eb010000000003006a6a000000000000000002000000000000000004b5cf05000000009a232de19ad262078d730267a5059162991bf192f071a3946e1944cc277c01bef3a015ed1ddeb0cd315226ca2636989f3bf6a59946054bc7e5930e9e7d25b3651b626c0522d172834449826ac706bfaa0eacebb6a1e249977164490fc2dc2ffd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000032879580647f02195aaabf31da0ab6dd2f6f87a9f00bc5e1e738ce2418b3bdfe8688bcc5b38b0cef97d1289e79d716f18ca5e19d5ddd101bb7a33b837b126caa5ceaee3e9b8cb1a31b5883b4b723e9e0f3da37e451e7f7abc1fe5433bf95749b831c901dec88de7560065f3bab88ec703e68d8f5bed2086a3c3d3f6e9fbc31560206c539f7aba5515e48482150ffe17d8d1cf367d0758c1e17a51e39e7928adf28020d0b48b485162992907290f17be1c6cd6ea6e418064c5432f73ad20a94aa55da0b0671968b4128555a7ca02ca13c5a48c2ee27eaf203b18124f0273011506a86605d7079136daa3063cbeb48ecbc8cf7dfe7caf4bf1c1c61627548ad6b2e84579d0220e3d04d4961e5512fc0054e92806e9861c59ca3a77de8a94be84384e5e7f7c60318f5dd322d14f9cc8df83aac599d67541923a832e72f5006c5c4859b5779b596020251f668762c3c4da5693281ea639e27e7f198096e04219c70e8282453f1335a022cdd13258f94cdb8cf9b3e8eda4866f21223303ce73885859a40da841d07d36b022cd780953dfe1e7c11e8c4dfae4435b045e98cd7b5cad6d558d79ee8466eb04b0cff697362853b39d82da807bbf936ff9f0c66723f8d2e351c5b7c9615d2c1ad2e0ead6c57e93df8a095bbcd05082da3cc27617f89073e2a646f003d8cee27a37eb70d068315ff975bf3968a29a05eecbc256db96e68ade4775cd45573e1cd39932091ddde89310ad42961030ea1e2327e792608d2097fb8b04cee3da6554876d6a77837809b7e7d9d7a0dc6ef6cb2293fdb5c511ba7b016c70641bc5d38fad96dc6fd0649b15dc474af0a1918002119cc71b708e834000c29279994d869cd5e9d5c542ef17c9c22bfd9a16462b9641bef52f367fb7a2f7ab6623bfed3d4dd34da8b500e907c183ccad5b084f86735380a1e662248edb9ec2fcd13de516bfc218d64d1f1e04a6d70db718cdf72455bfeb8513ca288d28570a8688c85f0e603b67c72c4d373d0951ed88ffd2771b5e6096a3706d38d3588aba617f7a3daae6dac1070502a74ab39e6017816a1c6b92db99cd57774b60420d8c2de213166871d3106c4b44783778df99ad66a8e3d2943caab49c212e9d4a02a226828d2b3bf548b2a3220b168920109a61e8174abf7e13c5e0ba889b0c7fba4fe8ae7a64bba21bf43644b53af3b296360061ec5d48cf7a14851377e8e696593d4305c6fba1573f375025ea2eb20fcb53338562988e2badf35b54e4d7347c7fd9d6bb5015807cc0ac1b9d2af0f8226fb390dd8b52b02bcf8e129aa415cd4624f94cf69cb09613cce52fd70d0e2bb379f9b74763ac6767881050833ff8e829af54c72feb494c8e87e4771adc45f41df0298267a3b24a03b7482537500009f89825ee3d0ead9f8ad7936586cf508930dd6df1ec60efbe75234e688e2e4c7ca5448671f1c84fdaaeef2c5b5227a512599dda80a69f9678d98c227d44776006af1f7d3e6c2790070c271711c603e5153c130cd2726b8bcf0bed8b4417afe451da9619a0f780b2160758f6ab9d9f9081d24ac892fcff06da18accb8a2421e89e89b6bc6cc4fa0ec3a0ba01c2783a140d37d5a1fb3ed3b6e15d7017ad6d78e99efebc7995510cc39a0370efd56e11ac8c267a79105d72298e358185ba798cd78e5fb0800459134a3971baacadc13589331636d1cfafc933be661e8210a1874a76c2d9b79fdfb137f429d55e1f52eff78dd5ce2fb2805adc6cf7dc671a9f49d6e3387db4221d179cdf69bdac0698f501e69dda2489b45eebe88c7cb38775e96f8cd1b10af7d0892469ae1bebb17f1cc7eabbe58fbdab84f6b588268b138f5b95bb71e842472fa59f7035ef0569aa2d2c87d385ddb02132a8389a4475dbf7f765c1288fdf1f9d6f3f4eb907a01181f8eee992c006228a2e3693569c68eacc76a670b5cd4d32e63daf04458620f332908503867129976ca2649d8ff55eaadca13fca3b9693c02a0798af41c88a343ed290b564eb16ad8862c11741954dbcb96244a31cb41e846633207f861e16b01be4300f2f74b92b25eaf3f36b2901045c557f08b3d118364ce0c9bdce2ad82fff5618b685a67a1c7546e8cde3f442855cffce99bd5e97bdd5d087144e6bacdcf18fab866f493d1467e31502e197121e859f77ad3ad37537567ebd3b60359449b375e7bee2fcefab94ed3b06386676879a080cf6afaf4a6909900eb22bd28c7130d1c70083a5655d6630ab81ef4e2ebb9d35345e18b5e0ec54613f215a740d62d05ba9e69cccca65817664722d572f8eb00000000000000004739ec0100000000dd03a3b12fc89de710c46038354d8aad5cda5a60c5e65981606d61974ada24a30cd92a437d32571fc4cbbdf427aa38ddf5f2cb7cc391cd6e1ffe4ef5752d0b16a2498ed913a07b15382b43b28db99da865ea9f7e42b07e262de03269c07f423600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ea81d5da708d858359297e1a41cbf59ce5258a2b93c3362b43634a200a832f1dd3966379f7bcacd5f4bad8f1fe5e9f055000d1dbd9642bddb411175b70627f27acd114e63d5dba5cb802ee850e0cb9672c281281fa64dc1196576f8fe987c64d90b3979aa88902bb80bb3384e118f4eee68a397b4c0e8baaed6f1d40759923b50222aec1d4050f8e29a4472af128c9cf9bb3b56c9c31e73d674a5aed9641cecd4c030a093830d7e2596f515f88778611ba3a31598d457b93a999ed6f4e85528674740a04141195397b32bf76c6f2f58f810f2230da430a1af032b87a909e33f792ba8a4778291e53f62b21cfea185696fe2d30781616dfc97d938288d7245f3d19b426030718a65a496dc4cee26a2e9e0be6f26d3e8eb94d2b355b2969b459a3c8969d300205aa71e7cd5a2531c2257b8cf5dc7991b7a5405e8a0c9a074392366b8e0d8a62030f8be47fbcff407569d8ef21029e4a8638687056da80b5fe5708cb2fc2cacb8f021c103fd65c59611cbf3b71a7885303821521c2234228b5edc9836836a97badb902199a14ca134afa1f2479f6a27f193bbab63f05d03ab688b73f8535d3089c33bb887b7ad750e1b72354b15cdd8952af017cc7448a9c0a7e071a8f4abcb776860a83418aa1fd34e40f350aab89179f871dfd921b0a934bf569d8faa47019edb9ead42fc67253a7963fe17681b1e006f45c085c04678fb6ed33cb4f08f4d016ab759d3984ee79b2061c802314ca25618db843f0d90ac8f4dce8158b4def424b87ceb710319854f6f2c3aad09318fe76067c9a6ffee9d7de250d3284a54e018dfce5b34e5b1e5cd5b7abe97b36063f881fa932214a01a27e59ad3744d6075a67632f883ad77808c79ae2d90da4ef57fd890db4070a9a33c196fe5374a9bad063642b47dc91d2c8f427480f1a58435b823f7acda4f127b9b44117825028a5f3f8b1aece3d1cfa45f248ed220b301516d7e105fd2a32c8fb0adae97e151ac15674c66e8d2c114caeec7c3c6c3a8c35e0c0a337caf18789e55cf7e399b9f1f2ce2d7ff0a15949158f5d2a4efab92af91f8ca3895f7f4e1dfa66dfd297c3f6ed7e95addbe1d03adc9b795eadbd6824c1977a7dc9eebc825ffbdcc08014dba2b4f7bf8a5b9204411007164c5fe1f5b4c0d7efe9db0ad3fc920ecdb4a098d9a31d53800f1477ede8d8a1ceed7463c7d30c625a267722adbe9d08b34ce0e97fdaf3e58681a9c5e03dcda5dccca250c27e5fb79fedd5f922f9ea4e70aa303633041fc8de2984d0c11cc32122e239d2f9efbf6cb5c3560b9fe0e8a3631ac013fd2cdc512dcbf210ab6961c2b2626e49b0b67d0fd91c72a4bf50175c3bbaf56973620d8415abdddf41be7229709418f6b036a3b24be9e7f5f624951af5af7a43057175ba30be3ba8332476147952a85a6e8158c2125d48adecf2f5ce7a3803b7499234f6dd9430d9c3f2f990e17226d6b0aff2f39596b79bffb07f519e3c2eecd7c21d889efa9403310dbef2cce19214f2d9d7871b4507e8c6061aa4bcbe8912f59a132f5d089d7cf470830b3ce572c600732797b919ccf02188fb271690ac0620369f1fe79bb432a43cd4a88fc6189d1a9750caa24756f43c89a60d0b65b55952a25bac898bcfe70b91b18a4c78a81312af46f7087a1e33d6b7fd657d854e0a8f1318d21e1b5623f997ebc51ae204d69f9a91643c8c53281e30cf8b31c82e3967314c7da25c4b17503b1d00a9ccce28836098ff6f4f80bd427ec76c0d8bb4b772c3f9fdccb4de2878ed23f04bde1a2930ba021f926c39bc4758b17884cab06083ada26eea12fc83da4e9ff359f965d642a45ea8a64c9c8e0d4210136266b11bca988fb76cef3247acc094df817d96ec3471758caf3ce1ca9845187693a3e44691e6b826a8f75fbfa6564e81424d0b2d3c98bd865c86b4b87a2af07653baa5c238c4c827a65ace274f62f849a1fa21a10a16bce8dd8140c7f1989c1c7fefbc6f34cd08b4f4f7c5ea0e93ec87e6874370e41380582d627865bad91f2c5ac77c1d75113a9db907ffdd349683edcb966df56671486cc0b1321eafb857c4c9bb23774aebaf9e7b6f841c28f87dc5f8fd0386f794f4dcc217759720a0610c0de15054d4b36e0ca4c370dd2d922864da85b38df914e3a18c7cacbf9e78a3e81efbd6052c9c09286ea157b7bea9e27de555e5a593c3f45fadc09d6c4d34b9f35904c2fce2dc0b54502242e0ad4bff236ff1c41c0942900fb4fe755a77ea02fed82345695b421ab5085bbe3e872622f7d979ab8faf0bbd7a68b41c9af434ba36d67001cdf69f4871dcae20a9ad9630f98f1c18caf66e45aa11b3b330389134bd92a866f38a70757a7cfade8dd8fde3d0821b5be76cbb23911cd51c746818b2721a78c0b0a560a6a72c0fbcb0aa7c28cfb375e96b82aa31e6ffbc50170c", "65ac63ac6a00006352", 0, 608848059, "99218d14135d668fd8b9f40ce1fc6f28328220e72699c5316ab5a5ffbe1fd763"], + ["030000807082c403021d77f297188ba6728f2f5292d17cb97eac084975ac8bb16f748643ebe3b7221d03000000025363ffffffff8c7d7ab33c3cacf4bc6df2e3ad96ef684c276ce71dd5a89b37bc1d8a48b420570000000005acac515163ffffffff039eae500200000000055251ac6a6ab8016e0000000000050051ac515364181003000000000081c79f2ff5105dcd0200000000000000002ee46e000000000044b243c62fd354f63a3a628aaa2de974aa44b8bec6d5352e29e5eae591af956ab3809336c0a0b95791605233cd50a380122fb0b33c615fbf7c41640b42dd349dedb12fc43237b794025fd7aa5fb3f3d51fc496126dc40d90bd3d3f0300c1631e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d0665bd38fe6065bf8d75cd123208676656fdee091beb52f5b3f851300d4aa152a9bf83cb08eb1cbe583a673827c205f3a9e6f778f1c983d57623331648e6ffaf1edb7bfc960f4ff9686f0f7c7b4bf6fbf9e96b58dc385cb1741e45ec714f3566a114529d8ab8b49c9e7c1434d48cc27d6a73727a0e697a8d33a0b54b3c29d30021c93d5a9617d34b9b4caabc0764bced9633755ab76a7dd83a6ebd60295171fa1022b04d1d8303d93d93564ce65832ac488de6b29f0ac2aed1822b32a4516e973900b036e7c080eb57e828965c54538b2b7e730730c7fe2c771f5adfc89e1a9e000f6835f5bcdb7552addf9be8123ab306d114c4145d51ee317e14b8da8a3adc717370208aef71324767371e2495e094b757ebbe94a674a19479d6dfbb63d3092bb5bc403279fca5f8f70e633a6618c074e2a7afa1eae9d4d32eadc655c6c57ef04529d460203d1da7063368a68499ae99e921b377c904c176964d7adb5ee7daa00cfceed8c02211d8909ed675f3fc1d7d231c494419a5fd18c406686f95d5c7aa6dcc1860eef020e58a0cef3e3e9fd03793075ec45f41f23a7e854fc4ffeeafb4c4af9c6aad0b550728cb5cb30d2449f6ece02c94261a26549dfcf8e3f0f8810071be5fff62d9f356881d269f52e3a2587db7672c20ff36c195a7c6b036e3b341db1ec58832cbdf56079592b65a50e9355f070b3f72adf80ea033a52d31aa74afc883f4d09e8c4535ef918002ad9d1fc2eeca2cc76ff5ccce0edbd54f5e1322baa13a5aa1852d7fcc9ffa0638696c95c3e9a66cff8f00d16f9a0901cf9799a530174dbc2af205f7f992b6aa69827a672065ad9d2b14034bb048abd37536f0ba3ae86791fbd7a8bea619793d00cf62f746043c23087098a9b1d488b099419b88113556e0a6ffe0e85319dcf5c9f61bd25027810b67f7844534a4053a765ef90c1d86c1657cbd58cbff0e844b30d51ba7f3d1a1097f9d3ab21a6df2903a38f704997f454c78429d2f0f48b2dce00bb89e0986e54867f2ab2539f02368a5b4013660d3c4d90a2c5f031967dcf8a8806073ab1b8c528b375ad1ea7e26ab1ee4ea8fb55225734ed4c7210d58499e496b363ae0df914314cb393b66b5870ff7391b513da35482d7d21bc3cb9f0ff2db282871cc50cfe2a091c63e8b9bfba2a2f189d7f0c614311210ba7a9c31c89ed59c81e25df1b4508c4211e5c04fd5a33937a6cedf7634b2ae30be98b1b45ced47c0c168d670e7f90cfe19ba52d85ddd910cf5719d420cc7fbf099d079742af300655661a6520d5995426108c7fa93ae134a3fcd55b13e9f2fe23d9b2689b99e339efc670b80a86e59a2fbe4c33a7c49a10bff34fe8912ff10b32417ede47ddb91eddae82b2bff04c4177625197f637a3f9841f5a75a3f343f199a3e2bf1566df7bfc44815cd89c4f783bde871937ce6d99d0c2a711bcc05c0fec4182b07d593e44b383a77986d1415ff184e997629b6ef9990a04db62f9c4c08faa003f8374637c1c160aefb12456e33ab06bbe84014e80202fa925784869dc61b645ef310148441904e4489b51c8cf69c173251d97c72e71b45fe0a24ea1583743888bdb60a7f389467414ac750e83eb8e3e90e34d4b28a1e3e4e5cd182a0a97950f08c2acca92ad567dc4a94f183c0bfb942641201619adebfa6d05012dc3eadfe1e6384247eaf747d81f9bdf6680551fd0f5d3e9c1a42cc2862078135dbcb204f802bb6954d3bc3f692084fb5deba55f4a85ac93399ac2aa56276a84bb49d5d88d3b58f714fa9fe0fad1432e2997e155d8707eb9bd3af6506b6098d35306a635a5b2cabc886cd21a92ad648d02c9c2d3c16fa4cb05a3aec766f18918a36928490252be7af040f7df3749d3e8344e6a5bb2e561ec9fc3c45da23c0682d052b36a4c9cbd25230aa7b751579d9a52e1a6a48f21d254c1c6f2cacbc5607f5fe960baf498c153f21cf03901c830e6b7f0ee862b212d1b5e84cd03996e15710f27c61600ab02135774f333766b8bc2f1282fba3931c755a6c6f2593b37a282e58f69d1dbc8a2e4c8fb713a55e2de129e41076999c517d68c22e8608bd715d25ca11e1aeed9f15c7bcfecc855a4090d87d7a8902843713006b4f71e5e8c733e2564e2b5608d4b5113da66663d5ca36bbe8431c628629fbf866455504ee7bae7025ea4b069b61372f3ed1074e1cf82118463bce29fe6208304d410eed8fb27be968f84ba2b01e6f7d390c637d7ea14dfaad1748cd4ce45a1e35d81eb89ce15d30c737155b0d696a37d7b84da107898b33c72e8d74d490000000000000000d054c30000000000760e2351d31c0c4252660dea3977dfa3434157562287746c163904ce2cc5c6b4bc5b55e98cf139e5758798a513c4728e2b186ba87e5f46ec222b5326eb8f94cdd819f09f6b4ab41af73b272ef3dfa4803e6dda833776446ca8174d76e582d46b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006c2e2b2ab92719882a2ee4fbf64999d5fb613b772f738bb8c2c85d0f8de7ef69e9cb636841aec4ddba60ace9138ef884303cedb057badf3c8e3d121af2ef98ce04108deb64df0f9af3e60b13c6bd197d8aaccf0f733c12fcdaa44fc3f07f374b4d2936ef1b5531f18817b0fc17da0024f7f780cc5d6f99dbd4d90be53e200b2c030f53279abeef2d63343079bb0d16e74e5fa5e4b76e457e74888c5d4b442a643b02232a36b56ed55f0ef3f331deb5bd916c9e0b61c37d623392602d0e3f6ec8225c0b07c3239061c7ec1cac689c2e3b8cc3864895ed83a89dea6a5260bcb24c084d5086affdc86134daa4030b287f092bc93433ea8fdc25e330db3a8e9e0ceab164970316c8ecffeb8a5d7053bdcb296d21c51a2c18e9aefb5df44606a5bfcb4e5f3ae702269056670e764fe23b67c8c6b91ba4de0b2f43044f009df5322820a5061882cc0211dd21b1d84ed45f0efe720d48945f6c208b59aee734adcb60787e664eefb38b02171eade6deb899f5f15a2205403ec1f398f82b37d1c6ff3dbcca6b40b65c917f0212cbcbefd59219b714c23f1f7033bc7a3073540abfb3b7453eee7997d706f3c48615409b6f2dac668cd5632fcce01e4667122cbe24e8e09024be00f478c567b18cd9d07c1c2fd5c6c9adc11ab1190924308f0ed10e8d598bd777c7f4f76c3822c4b56a2963b0737caf2a64adc7feeab11efa4146f7980092f2695de16a0e3e84fde9a774b0f8614bf3fb78552a4e9c2695e41782da4987dd3de1579a32f9b81ab55e70e3cf657ae87a201a1f4249ebd5e20d133f0a67bb0295fdc1217a3b5b85f3da211a8fa0362fbb096429b9d814620c8ed33e119106da7bf2bfba0fff70b6814d5f480c223853aa554c229e152b5e53e027fc3ef3f505b11c8a58cad35c6979391a7d95010edbbf9db0135fb2b27c5304af4ecaa61f419cfd940c6d5c7dfd84c73bda04dbc3e5426397cc7f1e676be105711f32e41e3a2636cfe219d10051bc760e448c50ca1c91a6b0687a274ddab7582e9b37d2bf1b58499d6fd6043e6c1a2a6d067da1aca70962e068ce3d4ce37f9b87a83d744603780fe5fa910150ef8846e86b415aacebb4f110a1bcc0cf7eb1e766d5715f6ca894a005bb8759412cbcd7fd4c5e67fa768b5899ebade77149168d0c105bcd860c7dc6d80e783c931b68f5bbbf71eff5c16ce855df3424e737daa193034deedf5ddef4be382a6abd1fabb0d678ca5d7fc7a08ac3a8955daba89c7471c46ed079e31b7ff8e0d3f8a6111379451c5c92b9d1822c542afc3c64b1a15206e378916293bbdfd3a3c71738880869c5de1e2596a3930f78a5d70a093193d75a4c0df689a8d7dd8f59a7ad209db301124d9eca3933a8c6f117362beaa183207fb71c3c0c565bb7b758785bd453cc0b35c093c0ffbbee9ae6c9f96af0be6fd6bf07d8de33a2645e4d2c8e35fdf3267ea1b82f51cd56525049cfd812758712e2a8f71b8a867ea4deddc45051c51a1279ca169693e0a2b63e3fa1e849690b2b106e56146f413665d002912f35911d51b441f79b43f952cdde0bf6b52e8d36ae479789531c5b4dbb3e2d375aeeb34594dd8109a24bac9458d020e5dec126a8d1f447d8e94eb663d0c3e88eaa79f5c0c76b9644aa6d87c2297eba2f10ed9e7cbc1df04b028059bdfe44c9e3e62471c9e11801705625ea0f5acdf08c1d3e38a8a6d0c7a9f7204ae9df45822860a8e02f46d5f973f36def3d8c1662d6dbac13e6d246e8fc566426740de7881f508d9be79e31aa7518c7b1124999681cfd6de8cf7f6874c92badefe63a985d7f446b8e631eae67466d7911a0edd16f64db9f2b83dd85d56b3c80a7bed20bcf9e3e0f0b93f9021218cffc1c426c893fade0966b117a2f04837dd061161c4c8344c2c558f6397e570b4a44620ab0025e8f13e739ddc044e307cec9c0e022458af75728b2b560c3fc167410796527943ad0b6a402dea7e14536b08e50137fcdd3384c0aa7d6a68b82d68aceaff224baff8b6e38ecbc522f3f596ce12a2a78931561aa69ce10086b9227779742601c9a461c1448c9800bbb8d52738069b98ababc1a1b6e949b20956ce9a8f0b02a7cab241524b9210a595c8b3c3146911b6f6f2e5841dce67b4e8ff433a7faab07797d5057f80782a07460a428b00488ad2a92847651366842f6368b47f9ab01b8ebcaffe40b844ef91f85e7d205e7783a60b40a886260ea786a899c2d052dd9344a2987fe3218042769cefbe19bf29a0d6dba8151b610d05beeb346f367d1f1666a43c7d704497b7383518fd967cdeb5ede0431c78498a5d8fdf1b48e82755fa275ef34afbd1ce4c086c874c6518c956f39d2eb2e2c9e8c452af0aa9e840034eb6ffcca3144863150b2f9813f452c841beb424a8863eb6ba0f5966eff62d2b2ec919edce512805eff0c05", "655363", 0, -1670916298, "b9d9bbbef2cc5256da5bdbb8012c4f34ce477bc27875bee47a4e545546d39da8"], + ["8690320a0198fbc8c773aa53b2b8204e6c4189c54d2e6fe2d6bc738cb69c27bbd0ba19e0e802000000025200ffffffff045496ad0200000000046351006afeba040500000000076a63ac65ac6a52cfc8c7020000000007ac63005353ac656a891e0200000000076a656a6351ac654278daa00282e9f402000000000000000000000000e3e4e83ce30b5ff7d5dbcd129b8ec08591a9940493695c13924ee7e40415ea0f550cca456be42ad414d6466cab8d648dfcc9fbfa56ce55136af34f7951121a5e8dc1e444d95935d7bdabf548b564f64453c5d942589e31cb2e327d8f7e713cb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018cde58cf665de933d5a6ec45ff9ef049b2014487187b86dc5d365350702751ffbbd70447bfebcd53092bdbd1c490326adc10c9f0149ee8510b9324e15e7790b6f9d6190200382df15d752977ff9f578b51b5d3c3f87ba1b5e4e90052f5e215f34c19e1068f30564e73d231855eb6914253c8f63e2907d1645ae8f444c2e83e90224df5c5fc37b1dbf42003db1904cf56fd181fc0e30ab13f51d8a1e2231930241020756cf196fadb469c8117168adb0f7a58070cd0216e818f5433b4980dcf745bb0a05ccc378e5d1304597157abbab9520f565e0e4d2ded010c2c29af86e413a2f8b61643389696520a57e65e5c19837e359880bf77e385e7626d848de4f8ca858ee020fc90cd4fb1a48fdbf0650c56df4cb124fd9fbdbbee5b1f4797f623392d21bd9022f78d7353affce71cdd48486d847b9953d8180433c6ff7a79688f66b556d051e0225c9df43800a59f00786cfc5b1852b0a152e9b17746b744074241b0654b1ce3402285c2d3b3f0b59d9fe65f535fbfe18191bbd7c240042014a1d0e30fb61b5f42b032359b059cb28b2b96800524e29398809989467471692a6dcfa9c8c6dafc6b54f0f705183cbb102c3b3b7ba67200ff58f8bdcbb34abd2a05ae28528bc7a9a630a715b86a589478a46502670f8d94c046c71786d47317ead28ddefce64cca202c4b46e123d3338493fb63b1707afa70f3af61bad587b068aa4a9e82aa4c7efdbac55f8402eb6fd51fb091054a6a10e0f6b71c79d9fdd706938e92311db7b2128fd5d21c2d8f73dc0ded2744f68df3e0a2f11bb92680015481cb3457d137d7a9a64447f6131d1e840ff041085e41bae697de8b2300b12b2c118946a37910ae19234a7379e9343a1a03fb90ddf9a3d0852c458faf86919b8f3e63939f755e600403488eb0ca4f5d715c5e56395299e4ccc4255d63d44e9fbc0a4bbe60b059b8a6f0416b590cdff89ce538e58ce37f10fa435fa346bdc82f3b0e3a276ba9675e85d0cb2f6d5f2a72a21a24facbf9444411bd734d399b7574258633905828480cb15d79d970256da2863d038b658aa03ac28b7ea90b4fc972d3b2cccb96ab1c2dae1e255c2c553062c7ef94ce9364e4648123d4fb40d3faf00c40399ce211da9f6c6246f01cecbaa24e59a619470fe98f3deebab01226f6a8887dd4aa3eccfc3b417d50e69e7650ded934068062fd28702f698cafcf8174d08a432c9685760dd8a801a287ff5316af1e3e32b10f2db6a50bd40cb857143c7184d6545bde60dea2e9a85b055db4621c8ec42edb68bbeb68c82a4fbae843f4e29915f587cb587a1a1e15398cafd8ef1422e9cf46d3ac446a35eb95662f6cd05b98d21cf3d80a2a41a8bb538f01aeb7c7f330777aadb1eb599c92b5f042fba72c4b1c562a5267144ea85781ff91f64e0f13402c3c63c37562b87f8cfeb32ee0f7360965b9674bd6b9d513d5ee876cb34da619a131e0b2bc106fb9440f50ae370ef664896bdc87d4b6089a0e625ea723ce41424d77383680c3601e2d78ab0cd1a84c44df2bc8ae910ec280512a92dd002bd3aac854158cc4b29bdcb4692e0bafff1ea5958d5b5c67f28275bf5d469dae95b284dd82cbe1177c05506ca0141e622e7f70e3762e805accf04c2d50f421d78f78bfdc9a38ae35031e0cf74058b1abc6b2921fe32df73ced7fb2813517601428d90dfe076f01a3a2f082f9a2753c6145a1b46d3edd7c8c1dcdf91a4e1d1062ea077f552df6ff0a3036587b7b6b48faf3d91b7064b427db9af1a0b27e35f454e0738c20b5189d45e42de6d97db22f9d6dbb7d74b8a59cd5fe06ef00ca6d6e44c3b1c808d36e332ee73f5d4f93dbb5b0a669b24b6ed4a38f0ed7e8890bbfde5d0403bfbd0e6df379187cd6de7b70e5c234785dca78943b8503cd7b7070d23c6f74138870b80623f6f3337b993c2e5c0eab6cbf080f825fe79b5291ea02e8c9feee0bf1779c8b637a89a440005848c24c5e5548a78f400da7efc18edf432ebae3c5140a5390fcbfb0bb7abbb2ab529440f44c3fd810389998934943c1243e9f0f2e567e20fed955f903d70780dfdd35d6e85053977a5e9df1251f983f61c8f98249d8971b33fb55862e646989490e42db9de65c8e8e2b13277c8b2c9ca464dc830f2911a5e41223346e75682c8ce91182aed5da29befcf2a790a5798fee27973384e2d276770a7fd2438bf711f2b57d86c74769354e77eaf592f43132ff7ed18fa4a0e751db2efa9865a6529ff4b60d55907cd6fc7227612537226b0c2481ebb501ad3675a19966c43f1128816c900000000000000008ea0660200000000dbb91019112d5a0e8678557d3a6a40920a7d650864d8dfe707d3f02c4d9eb17e2e29c30df83a5cdc5f19c560498c298339fe4598d9c7ea0eb2d4103e506e027f30755b32f24adaf348d114b2932bda4091c477bc4eefd1fad615c6aaf07df2a500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000948e4d1ba824526dd11e202c7db071a07b3e83549d72e86fe1ac1872d3fa1b38d6bec9fb26efb263f681a41f2328be723d2b66037f943748409da62b54c7f3273f2692a10571bf562a07f8c2bf27c5b565af8e273c5394dd9af5360fa17cd4d192c426f7768185b6255f15b30afec3d055a7e25fa124aed7b233fd020b4c145a022ccedc6f2effbd7165ae581832516d395e857f38735cc4fbc6f7950c67086d7f0206582c46392905e70ae2e0a40ef9afb00f05a658dacb3f663b5991cd87157f8e0b0110b3a70cc236d2fc433228793181a8838797d977ce200112fef4a73ed9b50237e8324eea379fdde02177ad3d680ad9c2f9fca1159be5f6a3b8f23f4221191d02233f85df2ffc409816f76fc53161b94e35810ef50f4d1583683f608962fa6cfc0203f83afc58eac34ac88caec73b67b6e533b0de7e015ce1c92a1d8f94bb56fe5d022b24a000a99e9ce9241785a3dbf95943fc8dae8db9f7a2dfadc5ca9e98f4436a020a87d2b3181fc486b75f6fabd70af2d48290530900b5b10e404800544c6d88b20224fed8448d5ece72c5d3fca1b75635f03da9705a8b502abf106a96ce49adcf68a13a78e550943ec9076425c6be8c927c610b7e0b1182bd43a83187c454fc4a0f42d53848c68dee1568fc9d952da250c4a78398cf63a78470e78fa77df3ef8284df611dc71f97c13ffa500295598c4f7ca1fc5c4247ea17dac5141091d5118b3fa50e8124ef865aadf271350f5473ee91b53150b3e3da349be1117615219956670b9b95d11633fe97c06eb4dc34866f31df8f149a83a3f84a7b100db216e5ce65a5feadfc1f3e2b6840a273f0ae08f146164d895949554cc7b7e4a427e27004560d3cc180e0b00faa8a4034ef49d001e04adda64e9a1945641fe4d8f3fcc58f2651e35b988b90a951f44767a5f6d5f51ca0c955e3046ab7e438041f9096da3ad6a66e6442b99c3864cfcfd60fcf633f6f0ef8466a86822a06c0210b2626a1db739c233a9c9da3f2fca95ed19942197ce36803abcb37e057b953e24996a10d7feac2cbc4ea53af28ed8325d1775c9393afc4e35933feb9830fb9f01ca204be18db3bdb41cc570e712324d8be297cca91eb1f77c751fa0391fa993dc3f2ee0a6b44d5ad9735acaf86027eb468972cde61f6ade199c5e31052707bcf0185e57bc19d4996c00c35eb2ad54e091eb9e705b97b56f222ab77687c192badc00cd8086b902c1a224e55a5086046865c5bae8064e7420a4d1630eac8735bca740990cd5bf1ffd45c25261fa875295a0653486f8ece626ea692d03501d6f0e8720f74b9634e97a80e54c1fd195eef55034f914b6bff8962e131a78b692b54552c130d5da6f0adce08f454747f0919520a4af97bb50071cd8e8c6b1e105359fda7b98e402deea8fa12f04b1b2577b0dc842b88f2a3e5efa421d785f583a04d51dba333c88a61f547e390c4f4a3409210b0524e893acadd8f8255067b92f2ae0f6ddf2887379288a46e153870475c3dd126e712eef7725aedc136e7b69f460e2cc3db92662efccdde02eb9aaceb5f989cb4b8b35ff00104ef05e8c85adfb81629a6a1a7863c8a4a0bc38f3b09976d0512aa79233484adc3069bc971063f9251399bd3f8e9c85c5cac7862c3b8e76b4854e85fdf30a4b51c5dd74d51024b3a50ae9c4f0f6f5d212916e6f48eee96ea524fe130ae835baf96c4f2292cab1703015cf3618176af9d4392d3f9db2519c75d7112b5aa7eaad6c4a3d8ba7dc5c24b764717ad83805366ae51fe43975562696a6a45362dfd961ba0ea9ccf1800341ea01dcbe8cb48b5323d1c62b06227be0508a0861cdd30ccbc5faa4d1a49c080820dc2927cc73e43761af61d78073eb1c308041812646bbbed67b1f6a9db34a5b6891cecae718daa31fedcfa89b7ac89d8e92166ccfef35e1a99bb3b2e9ccfa859c6e3a8b2cf0eac0334fbb4d7c95f5fe8dd2ba79fcae3ed31d24fdceadeabc794e4f84218d18efd7b9fd472b0de35ec851264a72c3bd26ec9b6c54ab66b47646c118650f6823c347c3c39a3f9d300926643d60ce8450ae04754465d0f6edbeed5fcc89088ec38fecfbd991fd4808981aae3a02dbaf4ca7ff73ee3825dcc89330c2290d651a5017d39d64e7d40d7d1de0dcc80c0218c28ec55de4afbb3c6bba0197201029e6e8c6f20a5d03dd3266f36c225f124ca50c9eb8fbe633bafa7308ff9031b71aedc954b56a392aeeb52dbd5510fdd139fb77ec66221204e3a5cbdd79260b10f9dd6b1698d5d60d6d39598145011211a2f09b60e2d4e1b74a5005c9bcc4360dbea5b68f21a9e61dbb0a41e6bc4442770f57a127912e7aea46f86bd5f8938a73ce07770ba5f820bcf3d0c321803e4b60f7d244ad103594e7df5a73db13719dec694594b20d241c8f817985caa2b73c82d0396ef130f810c", "005151", 0, 1202865054, "1fee130f8996f57f1209cddb36b35e88f1ce4de6d8757579db5e0d75235fc00e"], + ["23e7b34802a645a6cacf3fef45f55fbfb25a27aa1216a9da6b93ffa4b40ab26e9bf2a6ec290000000001516049cdbe9bd62a9e9966f7083f5f85e061f72d43914704878b2dbf531735a8b6551bad2b0100000003006a51ffffffff02d2f5750300000000096553ac6a52536a51ac6ff35e010000000002516599c620dc0200000000000000004cc4fe010000000069bb5033253937a07a38aa4cbe5989e8f164811bbcf30f03ab638684be0045501c4416917acf8d9d363812c1efff0d83d0d226d637999fdf3207c8ec009671ad55952146932df31351977221e94c6e94b4c5e7b66164dc9de53c7b20b2ef31b300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d64203b0571c38f36cfe91361ab44ec666735ab6ca86509c2ea5a94f1bb5404c2f32ada5295236e54a1f1f8f2eafc65e393574a03c32c16c373ffa6333511a52cacd158505e9aa0686aa0d25edbd0269f5f29551a39f7cb8f3ef5f919b414863fe56e7b2fec6b5686889a5fe80bf1b713c2093b84851e619c17923c8acf93225021e0fc0053f053a2d130b78c7eb6d8a6ecf8a0d5bea687e09c75106f786065cb202133149d12429008a5be697657ebfbda5fc2c3f9f7759ea156b73ba06d4d07aef0b0355c2beb37d05b9f20375ac8e1651859aee2079842529c7fb719f0af8fdd7311e9aae048eaaad426573ff8f78524f26d6414b08d5b89ae202ea77d4dbfdf8ce0229bcf99c0e6d1c6c7770247367bc26492a8fc63c0fa602f6eef334bc73dd9dce030db84582c387e7cff9984064f3118b5be6225f634e86dbd7b44c6af826e651d8032010844fc7cc9e547901d5849ebc8da249a53f95d01cc2dcd94feb83ecf9cd750211406a8c05d97af9c24b30bfdb18ca8715482f55609de87eb48966d90dd1d50b0309943e96081b6e684dd7262b5661b39132795ab508ea7cf8c92055cd3218e58ea17e6ee91aa8ca4130dae510d617033e9067673a93fbd139b1703cfc9ecded78fc98a46394d47632e35d0256d02281249c86cc346c2480b660735d8eaad77f93540420e2ee9f68b1c2fe7900c4b9bb90fc0fe1fa7677870e6ab6f131dea81980632ce9153daedc69e16d6d7f953194e4f210cdd9ab337606dab56918a4c94bb2e3e55e300c74e5e137d855cc09a8b3334352d8d6fcf7d0975d0a7312e084a23a218adf882bb67c444dce7e9c7601b0685a4aec59a173e4a5ef52b06a00b51c1cd9ee747fd26662da8e283439ad750c6366c421c6e4a79c5baba6206a363d14c66ae356eb9eecaa61b48be7112aa24a113731e00b66d60cc0e045576f15557827f93315c9fc43f9ecfc681b33ac32e60b8e8bfe13d5bb93926d30333f927ff2a176f7aee8f423974542a24609bc08f76f814a2868e3224c9478137218c30d2c572304522f8d6d99bb61a0b8f30fa9bd67a58d6400bb556926970c3112829b913df5733e4c61978ffe5177992b7793605b5fc1206939b5d68fa5b9b2efe04c95cadf49f30543ccb01fd1f69727219fd60b768c4442e0cbbd44b097720b128d3d387c1d75e63a84d3e289f53c183fb971758c528471793a926f9b886d99a1cf16f79ca6bdb29f7175d1224968261853e84b2c4fd00ce78e1ae95ffab97274abee0d4855b9497647817136a68cd67da30217fc0b9051d75adf2da3f7b16547115dfdde01bb07137921d4b6db7446cb20bacf7c907ffdbc2377badf944beed3106842b3ee2591198ba495302e3b8d3083d2bebd9b15f1ea298e24bcd5bc1e8c479454c381166839f2fe64df2b45d702e146faba913fa62976c7b031269af75b1bb60aef60b915dfd2689d2054b6057db16a7d10c3dc613049a617a6ff38b989ea626099e1f65e04a3ba93df3d162014ecd38e15a1c2a9e462fd45fa1cee2d668682e42c43d3281ad8542ff662afaac4648e07295191a4c796d8867e99a4a5c0c1ed63a830f37ed91fa7a6715c0b7198f56b6f23fb86bf879447e9c98491b2d6ed3a3f9ff3645e949a9235f6e5ecdf19722b4802c91afd008f3cc20039a4f89cb374937e3aae626b41aef2fb44dab6821d501b988ee9293eb68adb987dd7be4611655fc656138ac5c64db646721635eb97bbf48363a05541e661495f29ac2e7c601f5dc34f3c92c21a423164bb4919d9b40ac170bc11a92bfd15e8646a0cf37d6ab76b8dc4d487cc2e8bc1bbe33d3c7de94bd5f8411f2d8ed0da24614e4be5d80ae01ea72174a157809092c25011fecb79bcdfb95ae3bd91f535f538f5e33812d2e537144da2dd1821d232a3a120b68442214d307d708d9c7002718658700151d815c77d8b5b55b7f75240ce6757eb59790058949acd03a8c27c523e1932067bdfec174dec91c41dd9a81eae654336e028d3c6bc6277eb53f47dded9932dcf71aeca45dcf48ee15665f30d042bb676251a97ec417e3c3c3b518ccf788385fab23818135ab17db4d86c138d80a8259ae19192aacf9607f60aaad8b526d76a19af5cf2a9a93238ae1e8518ad640ce9e957aa7e5a6a6eaeb84f219530e02906291ee0c0aed886b412f60480d42d858f693c177ec36933aa2624b3a71a30031d31962950c46834dbeb884e9374f6e15ba14f079f5cf27faa813fd5db75d0e6ec15247a1087d260850335d11faf49e4268e8c027be853920000000000000000c9c29c0100000000eed6cbcc1d07f369f6bfe246a453a8eedd77ccec707da50fa519690afb962ba77e05fe4e33366a064246b3df10f128dc805f5f7d2e35c9e83629e025e30ab7ad4b0ead4c6df9a60d239aa7e257c4e98ded367cf4ad22a6197578392e872ced0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d05e9365a7c213903995c5c95fa3dd0c0798c480bec597639ada78f9e498946867058f197f4548fc6913845542a3019826a1c862f59b49eebf3774a13e49347f3a3e6f7ab9ce5c3a0e92135f4d86349a2c9988406cf9f05b443ec0492923483ef3d9194bfa008dbbacc4d7e51b1297a47541ccbdd1f3fc357c116af01c91492c0227da3109e698e9e5ca0f449e2e719974bbb20ba34b6a7f51eb1c015a5965e12a031d04885d4c81f2ea977224a76521c9141a444f715cb40e881e68e8ec1ddcbc3a0b0772a5f158b09c8456086b201d04e143abf8d32df6563a86afef613051783a8a40eda5c3feceb2a817a6892941f641e9f102949c9de31e391cead423ba0577b80320fa49b29f0eba0828c98067e5ae5e2a2932882e1383dde7b83acd8744be14680201ac14aee7acaf1b22a062d8ddb9a4bfebfb76e122baa1ff96711a97bee7277402171279fe33c445ebc0e3f50755f2d13337cf8b5f27a8b87e48a379657275e9ac022d52291468e2e6d5211a956ea735a80c4dbf8b9ce6bbefc355de7aed6e22c329023023d44c3b391b8b3aa156c5d5afa5b6bc0ed702c8897459e5a0048b8b7f612706e4f156443fb07e5a29bf420a47374f70f78a359af2d36593d15721a53d359f30f7ddcc95186863bee6072d1b171ca6acaa80ea85ee6d93c7bc068a9410628f5d053d0d5092e7a0dc0053df66472f2c658461e55938a2c9cc90306529da936f61b1ae9004f15e0d8a11c2ddf1182306ad010abbf0bdf7ab900f34675a1b92b5aac3fba87d6d9e44824e1ec5b0383ab7dff6e31fb2652cc26c1d3000de3ecdd06e28c44888f9563ba28bf085aa35f0769d6566334f271270b89ac0d7e2b80546a342f9781cc6a401e35d07bd76824e55b602170e7c7635e7f20d9ad42acb88be78ffb0d273d045819e98b1d7c1305d972370528591051201ff3e6fd64a9a4d4718e8bd46445ecc4748ae77a017cdb5e0c6c9dc44545a24fa18bf556f551f81948e4cea198c0fc37940c9adbe6c4b72bd101f416064b4838024f1fce79b8d167cce322c577b5f3e6125c5bb58e8e46b4a783aa318604c08eef4013e3282405cde462c699447d1763d36726f00a055e6d1e952c23e1eac8b25289056d110dc1bca95d87f5cd7cb70e3ced43256277ea475af3a3fd5ae6b5e2a09526edda439173febee069a38113eb2e800bb9bf9fc626fcf4f6431d5585f1cf7a50bee6838a9fb9a25dbadc4e8264be870e1286ee3bc573e34521b8722628b82fcbfacea9d15d06d2345330826186f15b54232afa46c6229062152a437ff83dac39654036e93ccbc3b7a5621b0b3e6cd80e8507160cd8e7f5153dfdcb4f6eebf26ab4108e1286f67390ce80b2dfb88fdfce64d6ca8f7576cdbb82be363ae7dcf76abc0de3c887a9e37643771150faff690f9fb5dfa48877b11159b72003e26466b794c22a286fb283e46a19147d9a4c18d721620d6a1c973f006a2b3bb91ffac35a432d0f1697c2f7309f408b53ce242fb89e637c529696a58b5827ea40488847b6554638949e00eea458884e1573712aeff0e82b5c53c5b0fe74e2125f7b5fc6e6a5278cc9917a4dcce07d53631d5a23a6b52b81f967ebb258ff8ee5f37d47dda35506491fedc227f5e3facaf80278b8f75e846a54161caa1fec7e273b81f29e8195a7af3c030462211c5a1b6cf92a02e3430db263b1e6e45fc0838b47114138a7ad319b29a97224d3fde9af60be0b2b35bcce6982041b907b14433ba44c278bf408aa0dff9a38ed30e0116a6863ba2b626c85e9dabfe21be67fd6411681875f0c49ca456cdb6feee6b36ead76e504a31ee0bd60e823482a6e3534c7ff77f425732224a4f805a5fefa998e06e0d2da271f43a48f0b81a9df9040de80d435bbf200f8d287f9f7d002c877abbd2c58d5062b65867a93ad60ae8fb2a3575bff35308a80dfe5ddb83f21193f7039cead894dcc500da44b8efcef2b5bbd80955c9281cb7bd2d5ba4a5ab4f2cc54237f2d7f992b6f669c2edbc92e63753bbbf662da06d58e54d18488702b28401e779327ec65e99aa24677f0436edc8d66297d6990b834e630e4667b5d3d7e0a3e3dc7a081dd60c786d64db8b64c51f8517d12303397d4a60a7f52db75e541116bfd7c489098c22ca6f3ef4c5aba81573a76f46ad839e8d8a692b36d4dda51b38db6b98fc5a4738038e7131c92d5eabf002c5fa6a9cbb112e6f8b9d7a1f71c1201224bae716f3973edfccc892be524d913bc0eb527bca4782bcde8bc303225b2f35fedae84c4eaadc574edacaebba2a65350d6c810cf52feee25f9938ecd28028b73a05fefb9f1270234ca39775611114bd414e8d2807a0c3ae1394966acaabb0bfa5ae96fbe8c57a4f9a36cd7eeef9615b86e983da638d916d5d9d1094494707d4a45d4bde621d524af1dd6b4501", "510053536a6a525300", 1, -461196428, "53c46fde66b90d6f0d5e1b57ef3097f0a03518f899bd7f3117c1e44337cc8d76"], + ["aeedbf6d01bd5b37e4b2219004314a0125b5fe48b56c5061588322956aa095d4d65135fcc701000000026500a9efd7a304c6f3be0000000000055363acac6aa464790400000000035263525c939c02000000000753530053ac5263176d190300000000036a6565f4bc9644025d48d600000000000000000000000000af1d13dae122b7aea02a0a446818879ddfa71b3458f2e22a6931a5714a2cd958b3be4b1fb456b69db073a3cf3b5e494f3d3668ae2a0d0a9b6898809abc97ec9a9e36d3a435f96d7852010de6fa179d6374369e5d06d3b8c118b13829aae99ef300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c677b0130dcca54ae3ba9c4371b6b57574763aa409688a368e813f376f3ce0679c230d0d49da266943eca2364d19bf3b12e10297a3cb37730fabdb4f8546c49cc9f75f7cdd90a5736927289ba9f8bc78035b5ee4e198c4af46cbad0de436493b39069afd30a36476457e8893a48245ec4e4f137d5172c1045037c4f82e62f75a0304cac6754cac8770e7f1078a9e44ba2a037164046f6bed03adfd725e58949e8d030cd866af819161a22658df3012e695d55e932bc693844bf7508068656c595c060b0224e1262b6607ac473f98a8dc5a12d6da2b0725ff1c28330d620b23f00f9f0c9d6d8e4fac2ffd83ac8be2e793018fa71d97f1530584eabe5dc11342cb043743021f46c6fa1791d875b942a6dba175102f8700cfa7288a7fb62dfaa097721510480310a4e447773b2686ccc7dd87cc32299834474b776058fff8058be8e92e2d98850301299805fc05cf3b02c86c55d06a88908b7c3400b0c9ba3a078220e57d8fdfe602074beb243f3788ed8e06655d3182796e87126aa5c5bef77aac531f41bdb2b3e9020e67f2651db33cb80a56b326491234cd6e5e9f6e9a0b63aaf77ade7018dd4f50cbb4e4632c216f596f9e03f08fbaa322030e2c1d4b4064254b90a3253669c7298c95e08dd8292de8d17e2314f77cb220bbdfcbdc672829a9de269847ff4eb08912e7be60b770d8ea8daf8ba7554da957c712cabe46c6c554d1240a4c69dc447a3556cd80414d3e5853b43c1749c86de6d7c4ccc05e62199cea4294423f2c8a3276e8f05c41837e389daca46ec5b0f64f5956e6fc1af90dfcdda33f6e051070d3ed71c2cd5ff7b905bfc7cab7ab9f4b65057a820d500c804d3a6da1629360fde1817bda0eb1e70a7955173398343730aa35ea9e59f6b32e3c761e1e7d738faffb2705fdab1e4b9fe5af3fa9fcf930c67afa2b309ef38de00e9d6b6d6e88f9264584325075a552c0eee7140dc0ed2b71ebec485ffec94919d1297df69e86d630e8a083166cc0796859515e28cc8464f6c8df76db98fa683d2eecfa3cd1bacf5fbeb1d33028a24427c89571afe0220b1e55f3752bec125f6ca46ce73977206a90144bd57723c9d4c89b0d1de78e8f65f8690a4a4153aeb1ba96f951faef9f8bd4fb47577c5a98ac47e355e21df50003c0e297747fdeb1ea22791cca187189443c799b7f6396ef013c5444d04c5bc60e56cccdcc61c288351a1d9508e4ea54a8e3e6b09236a3f72aab105507bf3e137c8e48043228c38caf44128d9153e38122cc6bdeb84ec990f650222856e9f480cf0724b1fd3d52a955efc8b982c266ca39ddea9a161bb88d6cef5a200fdccf3a28bef6ead0e23571f6dbff75d0143cfc465c31fb729b5e379b61e03aa21a4481d5e2cf2162e2d316f1d7c20fde0c2e30a45acd6051a3ca51620ebe855c294280c9986388a7c62b5bc636efcc88355dd2e488fed7ec24bece18688a3e4dae297fcef80be57349c51e471ca5f28dba95a2e93675c405e4996a41ce9a69792656d668822290b8ddff07b41927058619ee7c92fa717f217e616b97d686dcd30405c710fd8fe37bca0b299e66dac1a0b837e74d43cfc04ace4930610ca25b3521396c7dff7b2b94c78842ab88f4aab21d0fb2f3bcb9b16d668a2f5b1952a56135a228b89582f9533d02d974620bb042ae7aa4df13742b516d03a93929cff16ff0dd5e766758f2e6ee750ee507e62697c9f47bf807a13ad09683133b9bdb1878c5acd0b6aea46d7f439cda0b6e166821da803036788a41b30917f95224e271a151cf69b2581a7bb704dcc070bec396a095ff3109c01b4adae7af4ccecdf34471837b09966db00190d54f04feec4ace8f3509dce26ebf0e9eb761810276d99710f20b31785dd3f94557972453dcb3f9d4afc78ce382881f330aabaa3ce50bef502e06bbdc671970d1609dad8ebea750e748ba1e9c55c93d0c706b7defc16d6b284b316dcacb796642da8caff2505e974f901d06ea76e9fd149cccbe067f8adf78a56dd0c1b48ac55c2b9d7be671ced3e2bd5d117f84d38a6485590b0b636019a0b9a17d949a4cf8d1095ba5dba343b93d1624c974e8a10489980599651cca250eed1811dfd17b5ccc3bdf98473178d7644b3674b8169b4e06811b99ff385bf530e83df26b356aebcd11d6da8bb833ab31eb1298a6266f41366e0be4971e34ec9b0d43cd030d53d6e051b62c04981deece1ef9c6aa56eba4b3bace3141584f7e662c367c7b8e389cc1631511d840b0f3516ebe6483b9067a90d82811dda59fff8f41e60335f755f37f0000000000000000434b410100000000bf1c9dce5a1debf0322a220b741e58f4edb5bba9fb2c4d25ed73b9bc517c0a5a3486167841172df8fb1b906a3c25fe343504b46c05733a1084a94e0e5c07c3d0712b786e437453a844b235f216571c1fa5cfb60bfa6cbabfd003bb448f44b27e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd78b27af4bf9b3171c3d793e1f2bbe47527414585226740139f8b5e1c0525dab69c502d5d4cfa6abb7f8d374e0fc31afb98645dd5119f464239a1afccc53e261eff427d5cffe4c2114e516c47f02f319fc0bd3743a5eb124622a1258c78d03e82cd7838e828feb31c4eab78adcc736022f3a602e8d04b24328158ee85c00325020c071533982b33a1099b3b27826b73ca0013e286b36d08ecce8081473b3b603a02041a5b9a6dedef68d0710eb07e4fc53a65e1413ff0bc5e0d65d746e6ebe4bfdd0b031be914bff9613ab117361443683a85f98e8c1fffdc4590d3aebf56e634133ca108325f068beb6465b5d4b4670fe0c6d78c24f436a696af7b265e0bcd0cb4ea031adf323f256c7c444dc05428ed92796623a208eca165cd7610a5636380164f000329ddbdfce0fb301778520944deaa75c3cc9857c771789b1a121b06bd8ec772d2022b6c841e375a91e92b1f49146476759c817c70438aaf8da92071bd2aca4dfef10209a2e9fa734cef05a2b092b167736a1fe31d14d3ef6fb594ae8ad2f6b334e854021b947ae739a83d12ba76e5badd403436a6c75f4b658db03fac3454aba8c41c29337939b9bfee89aed887b216d81b95c4256bc3a122e980ec23c5cbf4308123b70051f35cfcc970a55ae78167f610ebdedd48751b2b0e098903dec7a3fbbc1630d67e316a808656ae7e5914b5ae6fa2adf0731c20b9625e1969bdb1c664b7f8ab495efc244738d29403ef6edc8bbf1855b53526e04b5657cd64e605995c83733be246ec6d8172a52766ebaabb33fe6dfa469e9ab186922a83fc1c1192000a1eb15456d14c006fbbf58c0c7e4a6f266d25b669e29ced9b1b2865cb2ea857ef0e6f938de3ce980f0d76e5baee71bf7fe4449021e75dcba4d2ea342af0e354205279e243c8317c20ae191b30c19aeee1020ded20eb98dd534688b4d8d119c53ae17d129b9c1c21e29fe6efe7d7c4f694a157d64e181aae252be635cad90527e6256bac2217ab78e9950efc3dfd67a16baa3265c9f8f523e892b3406f96ede424257400ddb5485b7273bf0e9d87dc87fed46338b8e8081e0e43ce10ae6082b8b3288029bc62e8cf049225ceb7ba683f05d51e0d920955e3ccea26343c463b64d8371e563c361e2e6992a7abd04128e0c22094c8c40f2498ee3c61d2f686744aa17f14258a6150e3e349b292cd45550176afcb796affaeb9822a558517b88e6f0a6e58c81a6c90865a6629c849054857d99deab38079a389a0a3ac21af01c2dd14f3e92a7f1e6adb112be9b71bfc8631e3a9f49ef4a18c912539ae99ba3a775c5c6f5528c4301873c6ed379aa388c9e532fad3dcdd63484b1bd34caa233007fb45cc281fad90b78d185067105948d99412ec69e60db07ed908552f8ccb861745ca209276dbe50ea062d3e37a1970600aecb4e001293601a4db4122f0b7a7dfe72e0b4aaf4134a3f5e99ad3db6ee7139e99d46677e521de3c7db59a396f5beb7c9d5f519b667d80f415646572d42a0cf5370f902e9a0e23a5d77143b4d0a061f531bbda03beec6e82a910eb4005532d7ad10f827b2df70572b428909560eea8113fb91f94f5e40abe899f0f7d64c937e2c462f9c273b9dbc4d9c70d0c6b8cb9a877ad60bc5b6488ab5ac231e7935704e0e9abf8f62ef3887e18641689c1ab40500c5ecd92a1159ef99a9c724f2301a104bfafcd94e8d60db5e6723768cd809f02d29a912c3dd519a933c9bf7b9f839481948439fb789002f3690e07326bb005df43ec5a7cb1e7b89ee8af27227469079113ba4515413c718a98d975b6748fec212d953b720df6c694c9ba501cc0cb7ac69e98bf10580797872fac6430a1ab3636b88c8f53ba88b210a57d548ab246df7b95cd5f45848f4bcce5ac3e1f543082ba6ab8ca2c974b349dacc2d98dbb0bbddffcaeb7b7f9477eb2954ebbfd30c9c61a49a2cc6fedb103b3f6732f446b236bd1bedb2cfaa439f5bf4f3035d7b75df8e1d8f34fdbc930f7617f175d562be72d01a9227e9f3f7f98f01ac2c4a2521889fcdf6008fcbb653151f784f02fdbee0fe718228797dcd222a1034328b719310022d2209eed4cb295cb6b1b8530b75304d78420414ac87d48cc4bda2c8109b5ca25d40b0855cc594e8ecb25128477eba8736c9a4369e0fca0c7713421e696067126aac24d5ffbaf6c2c4c1af60d4657c35c9d7e08441d51da4ec4e609b470a43a229c2a0bc8b2527331ce8c4888437e646ce3a5a5bc439f82bfe938a157e8f9b2c12d101e244b011245e30b827cc77728620b38d49f644b8bb703509b131e37de6a2fce53e92b0b6d442daf3cc5f79dfada82d8c1d7dd71b9d07d957f0a5f97394589b59dbf77ad99720d037413c62b82b7673734c6f437bb2c103bb263d5d4c71e2c1e7492e9895ad5f72d96c780a5f2f5e71af4c70c", "516552", 0, 736629714, "7c8fee9252312af76feb6e0612d54759bf87749e76069982b47aa1bc23505835"], + ["030000807082c4030271742c68e138b2098b51c6daf3a00df4094dc04846fa8add87329e57f1163bd9000000000763ac00ac005151ffffffff6eb6869821f90234f94abaa3a821bca0d618d122e87b7aef20f9dd7b154351810100000008ac6565ac00656a53ffffffff03e688b8050000000003526aac814af900000000000563006551522db5e5040000000006520063630052d3ab329f000000000397778800000000000000000000000000127ad2779ac892fd3c3d8572f09a2629de1b19ee964ab7d51232263381598545df34131487660dbcde49177a82f2e5ff3562469b4b5dac5431306ba4f9f666b3f67448e8aca6f9e1f0c0d2eff732647ef6dac595f2a2bd70f27edba7a332428c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033eeebd029671e00f33184f311451660bae9a449a0c853de464c1d0cf0992e11dd2598e4acbb863f340d2a1b22012a38e7e2f19b8f3ef8100b98c51ece1e1e33a39bf84251a5c69fd065b646252a5ce4ec8e3cef0c6ded6f5258d881e2953e67f39b69fff341a50c2b5c98ce85162987d24de9921db0467b7a3c59bc28334b210306f698bfcc08169606795aa7283c4a5ee0eaee56c112b6ce461f598dfc86fffa02264719b2972e7202524130a8ac18a42ec09fdecec4291a1e425665b780fae3540a0409d5ffb18ed596bbe4dee36f51b6b97ea3959aba9907f3b5093e1ee298951ff0ffe6f603c50b3dc31abc26c0938db65179bba92688ab01641885af94392e500301380b99217fb7534e746d2ca3e30a2f3467361da15db5501e654bdec14efe1f03271a7417db085beb582ca7d8579cdd4a635f4c707db633d8edb21b6348f58de403071dae3ebd8665bc33c5134dc525d09d0b8381fc9baff903c26a1c9baef66a9e021e8f269dc0519b1de78b1a230c956dd8f9807fde2996faa1784be1f60884025203239fc8ca134d9512ab2dfddd02f25423abddd5592722f2335ba0348743b510d23df8498370db8a6692a39302852d6e291cf47ae3e49f579ed32ee57d14c5533931a3e2f069d6adea45b4c3b45c49796a12185e34d946d3f9e47e173370f560dc7e9f541f6a4ea3a57cc88d517b24ce2ea4199ad8d41f3fb583136953ae11af01874fc90ec85fa82f092424b85f2db26f94eddd1089aaf9607cc99efff8b9c4ff8ec22303720c3d747f525ce91ab77365870f0c41bbe8833d878e94c48a910f04f49f80aaac1d6cb7735d3474ecd2b710e5fd154e258fe513b882c4bf11191cfad7ce25d120269cc998106304cfee799818eb5155a32b236fea416eebce4fdb56cda96702dcbdea238f38d04060e2ee4a0158a3df95ef0962eb8105bb2fcb3869b85fab78d60427ae907c189a0822b1e8ed324baca4d43ae2793f344d26ec89438141f6e364590baf96eacd8bda66691fab7b231f75884b8af28afb2c80e8636f4070d9d869d475482b716a8dd6f162a8b2bcc3802a755d81d947ef71ba4744df3270bfd15f294cc21d5feeeab2abb8baf4b8cee3fe5a1801783ddbdfe847faa9f5a3cc9d37f019ce092b703e096859256e20145d10892edbeec4c86e328683d7f2769d004d6537f1662170aa7830c561940662bdd3f7d69f296744591933a5e2092aa7b92c58d169da453d1a206713a230042646af11af7e41effe49984ef2075ffb4a5e4908071bb0ffca507beb5e6294f88933a2a23e6ff0680964a279aee7a98ec2c6aa998af751601a0629bafdb2c9b652e23baf86cb460968bc19c6b3ff9dfae670647b7002fb9adc075e03d4b31d6bfb93f9f5fb94946a524b352448845321bc142f56a6edf67242c6babfb859ddb43dff830da2fb2142d658a7800932118619a00acd062a9714e97ad0759283598f762797a4921ce3e3509602b5ac100a33bbba7bb972bab8d9ecba8af2b8b82fa2bd535d7b91a0b7ccc7836722875bf23121a80fd238b043139f082a242461563cacb0f22236461e9bc2452d5733940f15c25425756a3ab61c6ba23bd0f58d5d7dcd14a70b73e0976ed269894774eb79f96e13edf379b2531e7e29dd4fa8f80536cffb13751318c3029711a8294ddb26c65078744992375dde770e8db4ca104236dd0900ce80a0a5d6bfa0b2f0ebfcc26921a28a6a081de0fa699fd895ecaf8f9ae3b26ff52fdbc6017d6a4d6cb05a5a0d29e8ad2db970ac3ae12dbe290c30f775221c1e45e8e433e4df109ceb473eec52eaae18c61c346c5e8529b591f6f067c8a338a180e2a3f75afc7bafffc9c6d22bbc979ce1b0b4417b384cb30f71c067fea36d4431338f6521298fedc0d04f3b7bb73c300485712c0836f407b22ce386a78a8544a877dcad65736da1d110707df2c1b85493f4476b769a4d581254b08d2e694f5511e34a7c00f34f6690e98a5c964431d86762c1f056ee8244e3104497fe9a9a27ab1cd2361ff3a612b713301bccbf5cd2b14ad221dd85a9db24473391e564dc93dfa633947956c550311a560aebe990626547dc41b54321c5b6169563be667f0a2b1c8975488df83dfd814e2d8c6f29d276c19a013abb3359df9bf21190ae7ecce5006c6f00d909b49ae03866d6f77b3c9b19dcb30b14eff86d98555470ddea46ecb6ef8f2ac84f20e80759a807179ebaf4b91bd40b52dda103bf9cb1b62e6bc6a1b822cd8211add3067c218d160606a1bcaa40e7a49ef6a4e245ef07f739b3cb04000000000000000000000000adb94bc3eb7a2fca887fb170f11c8f720029286f3fdf20e9a42a0a3a5598fa981897154c9abcc2e82fc1a0808669961213443b7a2aaf88f5cfca14d2b128f60ce5a8899517e33834bec888d1a517c576ac7603926323dda8fca3b88875b82686000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ead7ac26c0d64224cced932cd9e33af336a5183956484440b238f8071d609c70da2df9ff83729821d71825e00f136f582e333f6663f30185666200a8cd31072513b8522fc1598748d60aadf58a23da6b677317ef27bae86d1e709e31783c15d0fd404775f8a471f55b2f84f1a8005ea80741fba9fdddd1c05fb9c4766ddd40f032e871ebf46f4b36855694b2844e3187f14348083f50ef82e436cff06028bd69f030ee495aa649a56e4ef2ce7502c81039156d5ad3c4f6e037553a19e71950bf3530a03c5d9e57ca3444b44ab26f82c737435cebc10f51917264dc4d66abeec2261646c7061423ac0a80c11b988cf38791660f2e2ba58ba91f8c41db35977beea1855022bc5748371e58c7110906cdb40755a0f60a7f9f45973473fe89d3066bb4f9958031aa4b89ce4eb15151b5a66d66fb37240df6e435ab4a7af08537c5e48b2c57a85032dc9f425996435074a62a61a87bfb07bd4d35397ce8f6e14ae6f19b9b5b32de5022ab840fe23474eb4fae267d51e9cf1705a740c41eb8edc3eb54a334d0f1bc70c03268be9de53e6d9be1c1d49743a5e2437f0fbe973ce71f25e51f14a3dfeb2660f5930e05cd16e4538a2b20d8c2ce3bb8886e055e7060a7e6619551c784dbc19ab56ae14b215baac40c2ee9ba36fa5cdfaad4c0550a4991f79334e7505368db047939964e106e6d783bcd685ba69c1bdcf18e7ba8b83b682b4079707a65167cf4b6fdd2b9d991e2b0e8ce3cdf4587f69868e089743d4260dc1e89e97fd69a39261f6b9dbf23126c030237ba8c88ce7fc18de2d4cecfc9141da5e1877e3fcce1ee5109ac8ddd96fa68a20f34b1afa749eba35e35cd3d47f72029e926d116e119c48fb3509cb892287756bb70437d0664a3d77a65188360df9ce77b4c0d5093c5f74fff8f380746d692822c79aacb25201bf277eb5398a450462684760249bfb4deeee939be88427f7c692d50cf7e920c0bc7939767a888bfaeb31bd1bd519013df5fc32a9ef6de6a8cea32f3d0403ca516bc420c93ed66cea4eacfb9b04ef1cf6f971f52b8a393c000439db91710bb62e235d8f172a56aaa0c164e86f6c050fc72b974445317cb1a0ffd04c33672dfe528a9f88e4834ad95a652611c074994eaab2c611b60e448a03051f70e7defcd02c1f1135df1532761124459b2c0627e36bbe5e43f576c65db0af6d800e801cd0cd9142679f846ff87c9e1e43367f196aaf8fb5f61aa9d70d2bf7b02eafc0bc6f18379e1050423013adec8fb75e9ea1b74dbe1fc36b707a052184922d520425f87ba309188a0a17fffe70f0c38cfa722ce0d4a425516eee086882b03da4496107d88d152c945af24ace82a15ae4e3ed25358ea26116d1f9bab4981130d56525a1b30764c36ce00dc87541d8d70f8a8e4464dcf2a069bc9970f88542cfbca601c60e2589114e9578c4d3965ab11f080a893e8de7c15a62f95783b22ca1f2a17bb01891e80133bbd6fd913d448fc02545a960e6d05b52e56512a693f691a07f926860909ffd823af751e04744ef74812cd544067509bd44821697529c30f4e8888f9a57abab68c4b462806e13d39d6573d3efa7f6550356b6e37e5e6e534dcfb6a2d6b606f96d908d202e56249d25910145f329c6d3e074a5ea74f295734ff318f12a1b7c63ff9bbef74c4909a5296461b14910fe99f4b043406b4cb6ad0f23357f2f50bef1a3228a3994eda3275637c130e2f448520f8d1f14249bdb8355b2e5eb9e1a135dd60708d832d957483d0680ffafd1b55a7d1b9b418b3523324a2d0f9e98d602d1a264c8fa8bc678d78c9376730e20b5733536ce621b48c0ae9924834bd772f4041e552d4985698ca75fab779a917559ef6be7f01723140c68fbf5411d9619d8690b2d6ebd828e976736b6983ea34a38c5f6ad5c61aecd1e138bbe07ddaa52e6d561197aeb134b96b32f0a020ffd5742dcbb4f7ee8c4ede3b65663ad02eab620a05d021ceaee1c57413c7753369a0b3421d576394bbd7a33e309f49165a7831f4eeb1484d628f2505e3b4b3a13eb57a07e7abe5dc60f64c7e3ce30b0ac10c9922aaf2476fececbdf711524777686a74e6702e88d7777e147d4275f9e9cd256f3e5af26589c4983a2b54fa88148f8b1947dd080f47048ac3b78d7836adb43e9f18ededda406bfe71058fdd8ac3eceb4bec68cce144d3b38e78f32a82eb20b37a31ef759c524225d66079591b2807365fcc19332493bc4513c0cb972a25db6ce95f2623aedc89c6cfc4ab0dbd6c6150413ad251e934c2beb7d84ea6397aaefa200150000000000000000c0a2680200000000d4a914f939274aea0c95f0571c53002f34478f9b6c2c2bc44cb6c91b796113749895108c28aa5bf8f822b3d6bee59be3f626a499f9eabdb363e65c66f646b57c456b0224c373cca40fe611c7e6d80569d59d8faad167f1b9e45289f572c5f3fa00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000388e04003684ec81d93c51caefcbe2c62f469340527037ddb222d095f98589996bd1b1448b0a82fdf93f7e986a62db1509078c8a6e85a71f2a6927a1b90c2564526a31faf02c2d9fc346ed4cbd49198c3744045188891ac9dc3d62a0a70b31aef6725343d6866c8c1c2eb0ad0d1536ce370e1d2776f771882c64eebbad136cfd030f38652b0d6d87d530ac11a0b866d022fe7def7dbb9066150e8c1cd36a73edb502264eeeaf5aeeadf38cd7415e1660f05baa160a84c602c7d902a32912e1a4e2220a04a8d8b18c4be1e4e667b8cfaa309502196abb6513d9a70b09c061f6604a9aa9a97193b2ffecfd7f77a055dc90703eba622216b91e03f859a8a0b956b6629230030c2530dbf7581cac1ba8d65f095e5aeffb64e0499047bd440718bbfb3f373a3b03179a66011e63620691994c33b54c1ec416c48424ba7a5fecb3fb550cf5cab2f6022df9db0cc76a3f3c3a950d949b8a9b43ae74eb502a8c259e4b4393552a6cf498030eaa0efd3b7459bd358cfdaa3bf06f8b2565ad53b818ce211ea7f79cc67d694403288b5a3d33d5f9c9eecd4c9447e571090af9d231ef3467b3dc5debacfa3a047e16224ee008af22a451124fbcd6377f718f8584633a92d07f1a3e9c5b9a845f1b66be8b537620c63a60dec91df079cb1c01bb71b304c81f268fe7e34c440626eec1b53aa50551744402ce42dac9c879837a131bc41e8c7602d7a06e23fae43d76b02fae8224a357d1915f105fe4cba6e0c7d580afd9fd95d77d058ae69257fb7529dfe9a192ec22484605642222f52a7138d747ce682682b68121f0ab155b8df3a9e930f193249e5a3d8ca130e5cb2b0a7a3ed264195a19d8697b5dced27893651d4b72cab4c22ab48f0808fd2c54780bfb189a637b73e7cadab87f8dc39039eb30715f8bfeaf7bdadb358768e17ed6de31ebe8415d67a5260a6758aaaa33c23c3702a49f7bb68b73c35206443825eac7acef3a0bfcd91595caa2eada1be8ab77e3db0a3b026ba7089560bf49cb0e05182b7083330d5eb4213f1680f16fe99182ebfe5d8ea75fa7ce10c5b96e21e4a512dfcf085c0447c1f546a793f8556f868e03e082314cfdf0876fea4366791ee317f3b2f9145b2b56ce4f9ba1eedf0d10176746bab100ebbc1f8cc09869f34b5e5555d1d3aa9424a96ac3dd60e2441e69dc4cd8ba354c533624bf65720a3fafca4ab143515642c9ccae3e05339dad70aa0987380b406c53acc4ae6ebfe0996a8e5621b6821256752ca7d6772e7877bdac5c8a1ec7ece05f8b18bd1563a3f9d30701940a41279d7b8db8eb6cf25763bdd3353f8456f032d3838bae3914ebdde5a05452be9b2dc46f37cf6cb152ecb2fd62c8cf4ee3abc99a926e96e07f057c4b154a4bc0d753025085d545d93e7da4652ba97edfe9f06708678a4eecd17753c36fe02682fa3d1d395176249bb9e9ae30e275dc61d056f4cdb8dffeb22723bc037916b8ed87c0eb11c0300a77f5ac0a98ac1ae3999f17f314ca0d7bdb1e813083957b72b1c14f4ea443d344d18c66d11bef6b88a3362bd0546950cdc3a457048ebcf3cd07b43e9f622ef3848684623fa0d29fcbcb13fb9ee094da2c68ab75d5f35d4df22367295a7e2beeee3dc4a441c5ad901874b3bfb940ac9f19fcb42935d6b0d5b26bd4a6a011400515ee7423de0fad5cb920f1a23bbffe590f13cbfcbb8f08168933dd7198079042a3c1becc79eeac78044f61b40298e1a5ebfd1443d80b0169294b4cf3815edbbf08afad68b02ae46c39e5584b0eefab522258a9997b71f7d0073c39a9ca9e04958fa21a666bb12ad504382978cb9607f8500aa478714efd56b9ed59390da35b77e7ecb41f7e0b0a61b85588fc13b0d33f0575daa00541875a26c33d0eb02ed3b256cda89f5d530aa7ef253c4cb4d955a657c37cbe5a17d162b32f61214c5fa1411ab64fd13da717a35295834043b558ff97eceb852cef91f250c25780d43b0506c7b57499b7324b126714c54abce67cac4134e5cabf6821224d0ac140e35ed855cf5e299af3447bacd82be030d92cf4788234f42ee5a57a45c6aaa13e68442c7e9d1d15c4f5d98cdcb47b4fca0645a97c0f703640ccc34c88149ce5de810ebd5b82752e14bc334a4cad473176099a9b584c1c83bdc610cbb5d46b93ac82b2b6ca9ec066930a6ff1b560d02c58dfebfe7bc804d2cc18ed45cd135e4430cb85781fb00442b836d6515a8e9c01d80c281ef1ca55deabf49b21560ea78c9d5898ed3efb713dae12d58380c1509915ad44efccf67fd52aa19e7090e1e5c6e391b5987a6df670d0c5ebcc8f79f98b01f4d1d94a7d1739afc9dec3245e2b4301ecc196f8d2f1afbb36fe8d5ffb59d9a0d162092cbdc0061f472b2975d4a973f023adcdcabe57f7e2143fe57e6ed85bf1305e94cf308024d608f702bad905", "6553656a51", 0, -2062089069, "95df69d9d87b9ed1d2b73a4103bf8749653608da093e6a41f2a28cf62bf029d8"], + ["030000807082c40304bc828f1b21712497a3c3c182672f698ca0e69750685a02c8917c91c1b0747bc301000000086365000000526500ffffffff45fdfd673c1af7cd2d4ef8e2f60c0813fb076145afa93f438b202763e0ca00cc0300000005ac6a00656affffffffb55dae2c23e70411f2556fda1122a2a425ba8d68bd00595204d08719bd71edfe02000000096363655153536553acffffffff0a743e84cc08ef7fc2f00e6a64f65778a4cf25b106f0faae740d8d07865a837f0200000008ac6a5300516a6353ffffffff046b6a5a03000000000089ecd4040000000006ac53ac65515318f3e60500000000056a6a515263aca792050000000007ac5100ac6a6aac0000000046eb11ea010000000000000000aab8950500000000690883ba90bf723e6335c618aae5fdee8cc56e1816259161903dd27d038509b46dbffcb6653db7effcfaa78081d3501ae4a94fe8e2a608d73a30b9b4ee38c58614cfefe615e1ac8126de9c8ef7d733d45c977fc694f5e4b995bd9f1655ac1f8300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c7cca0a833daca5c1bc6db60ed9dc26c0a21b7b6420121a1a12fa167d352df7eee02c9336d2aabed525e70960355e4a8bd2ac9698e9403fd69821b7676bd1214fb3f6d5b28930d67aa191f8825cdea034e88a7fde58bbdc486fa583cb82aa0a85ee8c4fa29de9dc0d1b4d2527c31bfe2b05825cb4ebacaf1106655b99310692d030416065cf49908ba06d8cab100522286625650daf1172e4d70a609f5658dc701021c224407d4ff4333d4ebe59422e5202a2873c2524c1a7ba9ca6d0eaaeeb925970a012bd74b438b2d4550a75077c1b880959532dc6e8a6d68dcddad356e771aac7eac0bbfb74c38a6db24b5185f3c5e15e42c5a48135c8173e576c095dcba996a5b021cc9cb8dc44225d3aa3f0c77e347ace78100a62578acfb4b1e9a93eec499fe9c0212ff22a5c2d46e5aab3b5ffcba3446bb367f2f1a8329ef749d08f4e18e2deeb2030210800368fe2196d768efc936b87adc9eca3e11d81b490bf0dfa4d35544ee63020fdd006daa64ba7738dbe8358bc9b87f4b467d45f9e562c6817d7be0872acacc0224a455f2e5d1baaef1bf37e62a7a1763e332905f51fed05ffdd200e93a7f3cc2ac72caa8cd120480be8025c711ac7eb371dbde6ef52d74cb99d20fda42920ad739bffe4406affea47db40a2903b53f7357e236f9e1d403003bddc317341e08d5bdc6437b89ed9f3e4f08977ec43f7ddbaee0187c6ed9af9fd75f2ed62b1929f315533604e1abc908008f4b9699bb9ccfefc1b976ebc2fd167819f0f757c9cce408c64c22d5d632f6019ec79434d76d8153eda0cef8a1475830325f997e78ec559581b21245c84db03f48553d3f62718714d31e9ee30618847aa1073d8add993711c3dfb67acd32a247b8d923b9db239bf2de9357aaa5a0f3743be6e422481eb54e3d0a60e4935b26b56fd9c246f63ad8d9aef0d3bc788b77d786fc07fd413a1817e1948e5470ce8d17ee0ffecd67e30a984283850052a9f9796e7f97c3aff819a685ec2ad22755e8ceef715e3eabef9fbf1a303f904c82faadce6571b775fa8a7728815c7d0b20e558bb851cbdd3b8abbd00d0c279c471d4b40fd5b60a11f3f83bee7413cab58371bc76ffcb1119001be098a34abe0f4ad3f32478a5530df486380fe95a71551def3ff03b92e61e9bc4de3b2e5707861729ce56c7a116049c2f050dd21144246fc058fbc80c148cf8d9a5e746221b2bb5ae18e216f98f09611b33c5efb207c269a2c8a1372c107c1eb49c246597e4b15653ff6ce3af223d423dce154a2e2c8c13a30c30c3e2eca60bb7999e0893cf8dbbffd28f400eadc0c08100c21598230ace52cdebcbbfdab06b0ab10849842c26fbe467ed92e492b3c6b97636051406e1f3d41a27ddcdc37f9755dbf31b56662e1014186ec267abc9c7e9f8a04dba124a0fbb458074aa9cf8190da4927f3a605ca44a58bb886e5868a2ed88237fd59add4cfea0a91a13039ad8b166cd98272a115aad4ce946d01316123755668829423f37a77f6c6b03ccc5af13fe6595c94ef38a1f955987ba21a1ad913595383cd21aa801c256233b103fee80d878ca3fb3fbee89ba331eb87e2124d11b1e71e968afb0dee689be2b90d8430f5f407baa64f06d5ba7aa00067ce766be0e5d65bb72fe414d80e3242b4458e4c3851b6cf6dd8070c3c21fd87d5877d3d34f4adca4f11b6b319e678078c06e33a9c709e548d0ce6953e6c11b27314451e2dcaccd3b7a9e422a2730dc9164a36c6bcc16c88d4469288635f7b8df01367df72535d57064c0414b343fda4d6520d766563fc0af9cf760bf81563e6e57263fec7d1b90d8edd326c9337f8ca232b24601a7a6ab6e157d9be74c2d7493d7c717800c9057237a7ce357f58458d938bd5db96ab147a80b9ceee1a964231fcb3f2a33f4cbe287ab35c1a9af1a331724c8ee30668d75384f1808d67d442a051dca70efaebf6ebdd1ffe480e87f0a59b96f4cdea2902608e1992ce60a99195bee01a61ce34657be26cb3fe7cdab330c2f521588a8ca21d5c70e1bac7c4720d2cbaeaf0d5c7e4c45956ff6257145e07808498f227745ccb097d57ef537aec35b43cdd08dcc2eca20f70b26cb0f86daa4bfcfcdc857d5576c148e9e82a7fbbb32b96ef5becae80d5187c1bf3c1798b740f029fb34c6d057ae2f9bfe2dbf9048acc8ee625f87f488b5cad8e5ae7b82f14a9d04179dc1e1db07dd60096ae857860ac6e74e6cdd96e029edff6ab1f5e30df272907629d8a7936913424bd913f7b142051f9adb9b03ba2ab58d0122301d461fa04d446677cda77268fe9003288a0725ce455e766b21b5f08638c1a22aa5a67a5534adeedadde93014cd04b07332838ad383064cfb2acd993994548e82632699839bb2638568a2fd6a7cfb52dffa63d8496462ba82d2c3676f7a002492a22285ef4583b32c02", "5353636a", 2, -260172855, "9c53765e7a966bef4362453874ea6505bcad36d4309721d8e32a2509234a1888"], + ["111ab01f012d9a0ae1f85423cab90e0f0c5ac4b603d93eab60b138b198bdc7c7c1541f30d50300000002ac51c40367ac019bcbff04000000000465ac00000000000001841d860200000000000000000000000071da46f81d3bace54fecea29295ebdd19ecad26238ed4ef902b43f795e009130a19908f3c547c8eaef13f88c69ee86c4efd66926daa502a0b434aa8064103027fb9bb8c9bc9c5deb2f1f3eff9bdf947fd3837be62074679047e8749229d6ae7700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eab7b5dafa4b9efe53906a9c95bce8a28e62606a185169a9aaec2c728a2c618b9abea11917219f62c9618d98d0050e87dd8bc948abd3f7c3e8b14a4f612d29617652a263417c864faffec335208eeadd46f63deb8e37f4fa926d0062386e8c501ed0cc8fd97d0537c39cd6a6353aa29b43eb4b91df67f6ea3dedd2e0a581b29e03046479411a4701de3e9cdf92d815523d8e1990422efb4028b9334eac87d16f93030d80986c4f0232c5eefde25a1c989775d00642743e8ae78ec7066f72af54a4200b07deb717ba8cd4ede6a9aa89e2c4bd08a4d32ce9f712edfca39edffb3fbd9358171c25f4d66ee0cf74afb8ad1b153f1580994601cd6234ba4c6fe583a609f2de03029cb3941e6791d3c60c4abb379009422273bfcd6a6ef8619d5699e143542b55031ae26472c85b9d275e2ed2272846d71bd81ee843e528ce4d7f7986c4f82feeb4021e23bb72863acd84e7744c2fc895d6b05e1a3d8b3d3122ed64b7f5ed0753bcdd020c46524e5fc4b501726564abd733036af7881191f317d995030bf3d7253b4c380317db8d7754a406cffe6f5b68fda7185e80d2ca62a4f3c4bc1f34b2aad3a96786ef9569f02a34e6b49023c3be1b2ab0c940b8b5f91e01c42fccc0ddec03e548787fc1abf4e5bf3915788cbebe1d840f5e13d6ad470e54f8fc38b543a0e0bc039e24f730d29227cbbeaad102cd4337131f98d40d1491161d08f4847feaa5ab4017d0172f5109edc1e331e1bc0a7384835765ebe43e3d86427284505d3a2a004c219b25a80f8be266e49a7529d97f12acf08eee9405d160c04777c38f3dad6657366ea68718aeda481a96a78d7eda212597cd46ea9c834635ee1b269492e641f74fe73695d7ed2a23368143e5e42992c7e6234ff09499d21282e2f9479991bcc36fa1fd68d024282aea3ce1273acc3764a6c2d7f17d4389b7423f7e50d7d7107f9087add65fe387306f82b9209b2f25374365cd19169eab9893ec27c1d0bc05ff6e59943cdfa4b29bb49624eea2f3e80ba659bdbd3c021a138cc3ddc1031912c78b1897e4adc7faec2550468519e79bffa33136d749e9294e1c1ec64d45003a1c3674a3556a9f234b2e9c223a4389dae3a36dc916a45c061eab4cd824d5a391919c7049807df24446fe1e47c7572f73dc199be69e4305b35a74455f4e4116ef988df1d12da7b5dec381a2e3dc0143ff334bc4562b39f5d52dd11f53e4c8d8e0efeeef956e8b9a007965d43b5a7d1546dccc3d8ded5b7693db78ee94296585843e68d0d63991ef99048439f44a5ec9bd490338310dc14151c789c939c33541966c811b70527454ac85528a6b682efb94e2461e9c8e799f16d2bfddb990d23737a82ec676836e397823508877dc28658d2dd2d9a4fb99996cd8436414258c146d8f53691b8cbd870db39cfd2b3123e0bf2e56d0cdbdcc856e7d5ccbcb39cd95cf042bbf5d0f2a3094412aa3f7012331908c1d37547dbc7224c3d2c8d78c5fdf46a7799837fddf7d9ac3afed700e65018937b112d91402ae3e97df5c6d7d2d22b09858d64b9020c1902915cfa24b3eb00cfa5ead62e79676cc337d73b00df0ca063d5a4f34a17006ce9d48c1e7526512c59a0eec94c18744f5ee6082583fc522ee9c2cc3d7a0174cc0bf42618f972824c73f05a6c0d2fd42a8ad5f4e295c27e3391d06b7465fa8273ac91f24b497f908019371160ebe3f6d58b486b67d592ab66716cb3b613fa424b1e65717ecb02a0873866e477cd64eb124e1f5acb74c14ffa1ca0e68bf23092b9694fefc7a7eeb6493cc90701086efe59649137d13656e19ec21ffa77ce826dc620f7f17b60e6863cc78e67a5413e15b33749cead118a080032bd7e8e787703403eef6111f8861a4fa2ecd79a139b95c5755c1cbbcb76358bf65cd7885101be75eaa795d3b164d40c1bc4d7e5e3db7f6675720b4db3d9949b7ae7ffd05be6da849fb9a70f69bf2e708662b60e027936b4d89b44f2eb46e85e8b59dcced4a8703b5f7b8f2225a0ff396a661f53dd3ffc470b6de45f1a54bf369c4cc713f0825fdc6040c1264b4f0928b6c20a99f01dceb321b7f7aac3ac0a04ba7abb1b69e07464637d6ca7752876e13fdbf0b349f7b19a8bdce59c542dc2f80a3aea0750294eec4ca044bc44758d382cacfa12793afb31a2f1a57240cd1c2935770ec0e8a117aa2a48a0424408a1e8837c37084be5832a2f811a3dc6019e6d6f3b6f6bb6e796c8eef198d0e78f1b83c8dc8af8c729f4ced5d3e8229dade6154bc63ddb5724dd3ee7298acf5749944b26a8dbfce2fc2990bf9d1b9957353f443ea922e2a63b0fb46d5ba7bb251cf0c403057760b96a2ff2abb36869e414b8814edfc8a4a7fe5367b8b3d5fc9ba5eaf198b5001acf48982a7bb386b42709c32883f5198aa36fff9263c17d08bd44559f0f1866808", "635152acac6a535251", 0, -2020339037, "da1002c217f22a8023791425b3d06656317c9b1d875939c41058afebed61a80c"], + ["030000807082c403018d98d169e994eb33b84b9fa2445eaa3ea41685e8d20cb28e3ea1ce86f1b8d5b70000000009ac53655263526551ac0b621414017492280000000000065352516500518bb49d7b00000000020000000000000000b373e20500000000776e5f15257ad8600032b282fa0586dcafeed05f0a17bc1f11ffa2008e2f9f0751cb37e5ea478107f99e710b8e881e22ba40371224d8e73e623f8c7b5649a588a9e58010acb6907ec820f1300bed1130dbe834336d9534c760e31748a315969e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001274e025936285739e27665b66e646b4d3c4d538c29a5cc4198d8d22f88e3cc99f642c2da347d95595d4a9144c8dd51deeaee97357b8264027df607fa76adbec9cbd1e4483a28e30e9223a04cf072dc8bff4a05261bc2ddda417bea1807c223b2b8f9a3fc88eb44e3a816e3cc6303b3d40dabca67fd73da3c0a7b5b27ca8a74f02071282da4bde5512d03291f48339264c9a7ca48bd721d0c4a0f2db931c9ef43d02272f2416610fbc69f68d527162474d0fb143ff4d350536ace96221fcc211960c0b0759214229bc2714baf5ee45bff3684f30073959e2f23ee62554ff32700ac51cb45c1845ceec09f90170e989459122f475b632bb6d802cd733ee0d018fb2ba0d0218c50c65907b1bf22ff6ee040978a71ac2ec3c9bedffd207d6aba7677c2d74a60317ceeb0619e542bcf68dffcbe0887a7190005d1c47b23c993690b894040a98a7022cebe52aab4129f2915e32cd9970acef2c81c2e4bdc687dfa202d8531e3d3dcb021fad8a38882c536ec2f8b374fede9861774826e23c296b9e7973ee1229afa048021057b75c550d4696852884e25b614bd30571ec8fc325e9bd1ec81f2ccc82a693541d6869a5ed7bf4cb2916167a41b605dc38217cd9e8d84a636eb21f0049a27bfb2e9b92e61450b9964245b1b10ca3baa25244451efe4144340a57a661c95dd71faaf518bcae20c5bbe760a156145ff9a6ec8fc886f619c7d02bbe0b68b9a2af9a7accf14cd829a884ae93de3a0944ee4b683e599f8847944d57dfc1cb59203966ed0912d51bfdb64da138e76ffc80828f95ede8ae2556d4519ae0cc88e6bc435104ab17100f7a9b2b1beea0cb9ccca6d3aafabd9e97f137494672e5a8995c4cfc63b2d9d8c09d755242193e4c236e85ab0bc14163dce257a2746b5b1223ce605003228ae82dc53d6380cfaf86ccf5dcd800368c79e64f9ffcc3c23bab8e3b5aa46adc1aaa81324c3121eeb532c49a59c3485d403e43c59d3606c1af92e60d295e519f9ec024a9834ff0d892b28d37ffe2dedfcca3ea99c9b2bd5ec2f72d890bee64f1a589d7bd34413a7369ad3f25683d525201b13866bf6cabe64d4dffe1fe92dfe571142ce77f1e595d07f385bfe0fca3f0b58d965a465270448e83829698b79829da9b7610c1bd527f08cb2f1da7b091c8061aef8e1443e8819e80fbabbefa0e99503f01e330a8f08c947a1ef97ec92472f0194b42d1fc16b924b4bfcc2713c263db30d5ed789b10f82e35548655836cb92790fee1c0cd205206b9ef2c276ca61d631a735c2dd9630f11937e6b56141d2c85c3c864f7a46f5d796c82947e15d8117d00ebd6c42f03d9ab6647ce8a6ab2ed9f83e9518833d47a3ad74293bae5430836a92ea5e84c22bedb440a3adbe9d2f9d72da6505c8f380c989bb0dd20233f715fbfff75153bb306b68c18216617625462cbcf19bd03aac0d5e644e7409d39217c1a7f51973ace62f8b5ddeac05a2293b7148f10de51cc862fb987efe14307496be6924394a71a29f224540e69ae1cd2c22dece5f9f22077ee287a7666656508d0c34afab111b04dc70842db2e95eeff7c4906d66cd7fa53307b4f554fc96deae511150fe4c3af5b583c3f03a46bf3fd392ae22091e67c0b0d6062ba8e4bc361889d98171e8568c50c59226c8486b810800cdc08297e82f9dc35c9954672acce1b6881c5b4453caadc6bbe6149aa40eb41fbff8d9c91d59eaa48f3576d50ff184be4272e15aa48267fcd26bd1653c3f0eca1c1e0ea30ba8de6d6d18a6da2b744cb11d4f632a7ca498d6e781e9f1f723aca802a2d679b3e307245ca8174bbf52af2d7f3498cf9553ddce097aa8da83ae5e1ca4c4546ba94ffdfa448653056be12ffe524ebf1c90c752da62e46008b151b345464408c4bdc4521032adabf2cb47abee536b8fa77c79014fc6cf011d7af45190c5f287d733554eb90d65103f3e6dd8c6903557c0a57cf41f7cbd234580f1b62e95db83ad72f22464ee55549c37205a894b6013dc6813a5919267703e7ae1479b1cddb5c8d1cf832ddd7136deb4b877ff14ea127a08839d8fd9b92157e6e85c9afd9c290f10f5c8415f1afacc391824cf12f4e76ca9df158c6e66ed702e1975eaaba738bb3abdeda75cef4edd8fdac94bc80e39d88260d2b3426ef9e9ffedc4e80aa55d66f795e42f23c3233dad8284238ea9ff7b355237d3d3a4d78c2cf28870dd28a44236ab8675f5eae06638b09c3ffd6ba7f22e21bc6e50de86f2acfe2745e8c55bbb5c3308e3f133415bb6e735edc248aeb95cdb3e883d8fef8929458a033010000000000000000000000008e0ba358e0f7ebcedc7b44c22f1a1542902ed279d3690de65139457b684330a2fba8e5232cbc1ef55f17ae931c3f407e162880fd34433bcbe01b4c7df2374e676db9d3c897e7f9aec7141640991b1c0fa750321acff5d98996423b3a97c09b3a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000871fbcb0c614811592146dba3b0bb3a2656a31ad2fcdec394bae08ef08c9e0b899f4d1552e95d7643a68ac7cac599dd20a66946894017158339d4cc5d24d8934032cc6fdd9bb051bc2a23454967e8a0caa86257e3cab85b83d4b445872430135bfdfdc5a57439cfb2e9dfb62ea5d51706a53ac2b2d25db32e3c7ab920a7452f70319aba92ef05124815c33aec8004cf9160cd436d6bac09f34d18cee0ab2fb5de80207c8fdf4a288b75f961458c44ff8ecc58f7fc5d6d1f53c235a90b00d04dc301b0b00285dfac200447c309f5ba26dbd1bd8e7001ff1362a510b31f561664e5e59be7ed95a1a138008bc64b4171c509c273adeff366570b59d7e5c7c75889b73dde603102c5d04753d0a48810e2951ff431688b50f23c7ee9a4fcee2179752a7dd6dd90208253a9c6003ae0cf7770772413b10adaf85ebc3c165cf2b08243ae31b12c77e030f76236c17f5740a43dca5b3bf485f3e90e88948f9cd84c7c117900c8a4b77550320cae149abf9b359dc02f15d9f3258f0f5a4a0596b21f2ae5d801d4b6a0beb7a0221512c0fbaab8b2ddb2744b1b3af826ad0259f47715759c44dfe791d1c477c34c4893cc3cd315d7588be970beb77a998e8d77514376d93ca268710be7bc0d7357fb5897e9bff88a7306512658c68668bbcd1d72ea7a6ab1783cfffec4c3699e144e4e58a18723c293a8ce7b974dd6ed752b40987be6afb9b5f89813a16b58f373f7bd5c6bc9b1c2f08000e456b4cbfce8ee9cde47a6b01d7d9fd7a0d4137bb33ec5bcd3185eb83b85ade8771bdf616d2e970832dac8c57b18f1e428415bd1fa78ebd87aebadc748bcbf356eb0fe98ce36c230fc33438a2944af911b0da9cd7304829b5354a697235164d19627ec7e0f452d11ada7801b968e71efb2bc85fa8816752443ff334cb531bf258b6fbce54937bcd27310cd3bcba53a2520120522b3353d40cb4cb7a179149368424f5dcd171ecfea35de0c8eded4aca95e7038f226eda4769427a4dc870d2c0f26a89540189351e43365d7d7e29ad2a8d292f96dac6b17ac1d1a1d5db5f06d12a06d147c696245875e8a0e0a92e5505a64e889f18fdeec046cc3f78dadcb1531924967176983490e823cff033744b4980dfa70b9ae50dc7df41651c4a501cfcd8e1bdc4cb6c213926f96904bf39d9d20775015046b82125a70691240c1c03c725b1c24965be5344f1d6b7148153c889211ea3bef43a04429b4c78d1c9f3c32a4caee53d8c59c7d31e78a54f94d12bd960b07f8c357fa1896e9a00c587838d90f1be332db3b86da5b2408b7be6fbbf23ae397de807d515518060a34ac28e1456b980f652a0db9801fd9900c2e6dd73bc617e13900697229164113074f75c01d6e768ff5d26111fd3e0dfc593c793bac2df23d4813c624bd28fa49c7f9269da8dd4d31d5430a6fd48f60acf3228038f569b9a1ce09533e3fd126109749746594808611aa3c2f8a36fa584ed270335cb19f7721953e8e1e90c3c0522f756d95b6e1abc94de1dc156ea9b8d33f3e595b1161802d22b0f85f1128138fa0805b2811f79f8bc6e8b1f6bea36d7df7a9c4a0fc3949e36a33dafdeb854aae54cddaf75b3d53040a802461865ed70cae2caeda9c870fa37c84d0bb704fb6272b0c4a2f25f7072160fc7681cd7c4ec145b912bc61ba6af97a3ab25849e7abfb7ad85e957a1aa734cc1355369250cedf3a74e0935ab96a9788ddaa97d4ffd913fd16c1a4a0f9899513de50499b2358a8fdd0be5b7da463fcbbd2b3a822065fbac64385015ed535278a8eb7cdae132362eff439e4caecb77eb2a6746f1381fab469f4befca329504702e40058ce2c95c49f30b86cf8001deff15d75b9a4d81567d02be61ff275e352c637a29e0ba340ed3ff4254046c1880608c76c4dd10237ac81576dad80a8001a07718303d03421cc85910ff5d59e15ce11977ee32be6f8cacf483fc2dc077d9e9aeda27428f2ef7cf6e2fae666aa5dd1b4138a723e836dcb21472accbfac8535f1ce5cdf46b4d008a9763daca3582b5c842b28977f53d82af1030997816f0802972c283d235e518a7ea01333d7c45ad07a4238d86b093fc47d255978809762b5cacadc6fdd1565e4ed0e8d54adf0410094792ecc99ad02abf528c9f5efc23c7d63cd83f8f9b13657cd5638d6a010e87f0dcfc909dce6ba109b7c0b5a7cfd8cda24e803611030d720a5001329ecc1c1294d878c40b7baa82986823e305c9e57fe58e22089f5d191cd31e543c1abd5a038d61d90a0244b6365332b965a05405ab04df0e24008fd2423b3e651c086bd9420a29835ee98a6fefaf733a327149bfc2d9fd3d70610d83d6e16becf43f021ce6a4c72eedf9daf71cf807856958f14a1d52c3d41b5c305798ccabe418732d40f564563812716aab84747c2dd79e34984fd03c0fb1320d", "ac636552", 0, 228952763, "e8b67f919ca93325517edc4332e17c0b5eb40ca887ab89e39f8a9d16cf17f625"], + ["030000807082c40301e330808d4b2899dc6674f6d262e93b8109a1c07373a8c5e853c6b03b032d204a010000000900ac51635251635300ffffffff04b4aea30000000000016ae25e32020000000003ac535381e58903000000000363630057dc5100000000000451510053000000000000000001a782a6030000000000000000000000004b85ec8c56d7cee641a4798290aa323caa5f0152a7ebf3cb10b5bdd741e9c1e8bfbfd135b7a43c17ec52f00bd15a40feb26f7ae033d11661a1d657d11e52d06b1a47d9953e84aff5766f23430d4b2d6cf4657fe74bd005da017d98e809f62b030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034e8a3fd4015dad88bdc53ef3c97a62e9402edf12d654ddef3e20ae7993df64c488966a2c046950b49814acf459a3cf8f9d2507fdf4e169245a95986189e2582cba232eec10e03fe7b4f7ccbbace19f657a177aee78e3d3d597c2f99ea2887971a670b4219628543c86f432e432c304cbfb2c18ef836262f1aa9fc32497145560329ed8845c89398bb8359a89f323c36015b7f63952119e590ecacca2e0e18a3b5022b5dbba7151102f2fe5f7a8e78980d1b81cfaefd65823a034da4317c84ba72e60a0204c5e89294f296e57bc1391ccdddfb81b0923b2be0e8452ab11789bc881d6c73ad47a05d662137e880c3aa1beb31195cea21d548c0005be6cd6acc4d2412c9031dcac4405d72e7a59d2ac0c46e985cd678e4a22f8dd36809d5548876e9cf69520301c5dc74a642e865721cb74d7177396ffafc8bc241f7d9710a725901dab385d7022c2095b2a878be78c7dd2d3bc5c4f69977dfe7c662bfd6a0a161b3e3fee7012a03112393f828ac6b513b2ff47960d3e8c661c32fcae9401bc6c7ef7d23929152b2021aae00a9c18deaeb3e7b343691b60e6a788fee9398abf32d8d82a6e057249941c87cebfdf4230f0b8f842a476a2030311c0119c4a93886867ebec028e244dd1c0b7c5b78b3b64dda0d79cc9f085247aeb22a82e1aaaf90bb20fc939c675f11eebd1418349b7cb4d166fd1deb2676783c5473e0fc54efcf2cf9227d0d73f54b54d264cbeb1d919abf00a8cad7712d183419ec7bc5da68d9f584de526006ba83100a7f064a8d0ce2dc8d358bbe985066889d577e56f819950e3cb29ee29e837a8fa4f46902dbf596c94166a03b22982f5cd406b90b2dff314c8fd5f663931f63000465aec73c34ab23681bf96b46c6ab7d309c1399068259dbe0a3dc2371dde25125316d506792a065e70c355a20d79883603a51a3d094add83a373a5308169b12c9b0e56d46c5a2946b1b5c4842a76d539f89751c0eb3401e6a7ab0dbbeccc795d5f61e44ecc0f5861cf1435a90eca193d59863b18583b24f5f7878fdda6344a2510f6a1b5a7c1681f100a2b47319904b75b415dde6b3f63147bcb05edd7f941a74f7f109d5ac98d6b9d7a76ef7455def0d31cacd3f939ba9d027126e3c3767bbe47dee817108d771033d33a007079093ddcd61e2d21c76148795695b0e95e713b2c75566a5479ba9de44414e7ae39567508c86ca18d54ad7f8d7e66aa67faddc9343f0bae700abff2a13b3590b4bcad5f3c64c6af05662165d01a74c5bc9be0c2d9d92d513d4c68b606ff3259e096492154213ebab75f02c9f9e959d4d8f3308098a0f19c907822bc1ba4a22b2fa65dbc315d7bff8c94aab1c6e5e0283405203a20d7bfbd3d8f38a739879d8614c1c0e26fc4c42ff53b333a616d854a93553fee30acc9e28877a8654d7272b66ca3fcd201af4d54c86500f4baad86bb839fd919b869f4310a184841ba4c34ce346dcd6834fcc152d9f8c443a699d1936dd6b6cf387316d55a0f6b7a51c46bd74cc9d50820d379ddafa025c2a37f39b2f7878c5894067e2fb46f92799227d10bf7e15bfd6642243b826f4812b52ca37e8d12ef218a04e1dc6e983025af365b0eed516521b2d9d057f803fdcebbac953cb49716ec39265c8c529536a34e486371febf187df7be42e8a76b35bdf137511b5ca388c2b7c403331094bbfda7771be0e10d142d4d2f88bdc05541353b885ec76355b47a2eb92c34abe81f8ae8707ecfeab8a89b7344f21de892fa757cf116d89e020d1398608cc67097a202b6ce11e31ea0973b44022b3db8eb41bb97e8925639683311fc1233b49f7903bbcda258902dbfff936297e142b76af8a2b04f2b915b63c7c8dd6f9d6b3c6ee96ccc777120d831db2c3c3bac6f0c8776aa995bf41ef0bcede06de10c6a3bd4b689fd633459b303cc40b41013f30b7e63366ce848d1710d8fcd2897274f7b762c01637e197d370be590b8f3c7454db0f0e4694a6d1bc501d145bc0cae883e46ba04a4bd906c3794172ab51dc134d85de22d3974017b8129afb6730c5ef1e25ba489c4110c9584b4533fa72759cba77b10a69ee59bb10e4e437746b918328bcee4d57b9961d14a4b2c1864d7ecf02f60bba6eddde2a2636fd9c2609ca4dea9e088f85c6acb72157d96b0ce73986463fbb74cb167301e355b302ef3e5e376bc836ff246441f17ccd73fa5edc393ddea648f326b3ce384410de03d4bc4066bd4d2203572fd7e761785f454600d3df75f54dbed474a01f398c9989e6e1dfafca34172ff83534dadc6be70d4b66845acb543b26d66e76150584930fb3a4e8859427e6a76c640f9b6b002083523687d344877cbc02cb0bf6af24da10e2f85675ef85138bee56d32c87db3b80ffdf109d4f261276d9cbef44737bc2561ff8bc765b4a9464f790aaa9cdcffbc0ad03", "6563", 0, 920978735, "011a43d55c4263fe53f7d42c64ef1d362c48b22e163c156cb906c9cc77f44c66"], + ["d5d4f3780259acc51360bf757820a4de9b15ed96fc5b0b4fe55373921517735bb3c850bd180100000002525203027a8063439676e7fdf771cd71d28521166b8ff4bb03d611b0ccce94316cae2bed40b900000000025300ffffffff0227afb6030000000007ac0051516a5265496cb5040000000008ac00ac6aac6365630000000000", "", 1, 1415274610, "d8025cfcd45afd92e8ea424f4eea6028bb761af0b7200bc618b37aaf8df61381"], + ["030000807082c40303ec471c2e7b091d57e93f09fb7056bce869bee120160df34d6d0ee705b050f4cf020000000453515365ffffffff895979a9c8ea0dc81ece71ca894747ad441ffcf23a5b8aaa34455fb23d4928e10100000003006a53ffffffff38f877035022a0fbef279dd16bd9a271148502d330121a7d0ca9c8566e9260290000000009ac63636a5353ac6a51a2747a7501dd09680100000000004629dc544dddee2d034f426904000000000000000000000000fcaefa5298a1373e7764199ca476b6d947412c63d27fc9eaa99e611956947fa4443a693455a88530849d1c171291a9f10308d9b64599285f092a547d90eeb050ec905f4b461e6b3988f9a38a3106fb988bdbb2a0217829734204789f8f6e2d6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a29160daee9e955dd0cecf2d83797c763d16a1e02a0037cb279fe7b6343a78f1eed417494b1375635a187c2759312a86eb99f20572837f33214f9da2f401784b1847d7aed252c4cd086aa526f8b9dd43852e38de6813839fbdd2cc5f67361eaf9eba937645bbc2a733877370d5c2bdf8bc00746de167bf6d0d4f7f7e0167aff503283e3c9fac618028f92d8dcd5705e64aa12574fd7e53e9cc3723c1a91899cc1c0224937d612a3b8ad10482e06a4e54f922986b1a05d8a65599ef7a1e29f2418bf00a06ff72466de6d49472d359c25b0c9472aa76b6dd72a100a6bdc53f01b9c9efc0c0c636311b14f726c2dd0e5812a7cee51a70c3a13165b63970563370ff11ad13031b7dc2c0903415627da77a80d37d542d9381f47cec094a9907173400bc3357cd031c9f4b5df56cac7151725c71e6c9cde33fc5b9e9a85a243cb71353aa530b1a57022177848f61218ad3ebb2d36fe731f52f0f0543f8d87b1ed8da03381a9e63da270319eb6e9ef3300d0ed85d4e3c82886defcf4240f79fbdfe9b02154be51e8a33e303244bf20e1636d63242875d39ff88cccb62add3358a7958de4584db8107fd8b04fe9b53d4363c68c88d7895bac345ff4ffa2e36f7f815ada6419180b10bf473b2691158da9913ddfb95dbc44bd4b3c494d08a3d6f1d762845cd5dd72012d4061290875de4994df1abbc8bdd6c5cdbe3a22ca4f7ed947357e5cac6673039f1dc39dc3cb8d8eaca9e438d2ad33f1b1d5e5980b9fde31e5f053489380b81a630802b3b196468d3eba98220bcd937d34954b8c2741b529f28b34162e6bf7972cc9c58ead5342985a29c905cbeb08010ead6a10bf5ef8ddc2cefa6c6730cc6c3fcb68bbaf2b23173d8c36d42acff7b0de0192f4286e6ba11637acee29a9d718177d8fe83995bef8a9ebc1d41bf2abeb59043ddbcd60322283cb87528c44dfaa9f2d32d4946b29b436961df2b8639adcc3121428aaf7396d459a582c0d4bdb811827d3ce621e805265c9c9cb9964104938dd28d2da0b697ae3adebcd9dbb19459a051aa573f5b1120f87e57120010dc174d4fd2c4358b2e095d0652d8c3d608f9df8db418f50f0068707ad1f3ed0c4a4c52bea079721a432095b52ed9f73b29f439116c8ca6c0e11aae66dadf4c89b59b50945714e91651b185040ffe98130138890cca38950020194731bcec8ff6a514fdf5ccf539d63354c53f5163ff2f2cb2286168606e6f68342a7bba9f2bdd5dc5be0dabc44bf642779ee1f209f3e10c1fa34f2984a7e5ad89d6b023d0d4302c88e2a975a6428e868f2d16fd1ac165cb242a9b52379bbd2ab60160971031a5047b89b1f8854ed2975db1e64ae1aab62d0c09378167674615194b4dc3662958a77e6828eafd1d5a597a71ad36a56bb30275bba02f24851e79b43c4e82128ed3addde6dbefbff581632b699d9c40644b111e53a7c91f4513664579e7a8589d8b152f9d8b185e2df0f063d5f9a4981bfb77d5b206dc3979cd3d77d9ebfc2d29279aaeabccf8ba47934645daba412528484a98d41e10c560c671443f5d92569cb32fc0872ccfcff0ea0ad2cdbe376e5c7a71ef00609a89cc38340fc70f502695f6d9528de42b2ebb89dd812428513c77e77eef025d2624a056407c8d0dc1d49ff47b0a464f599792ad60e1af1cc96205f3e7f5f63fcf218660e076db743ba2f09ffc88fe8d832be96f43287b01a53845f91ac39b18165cf004fb5d77ece3def0a591b8cbfe7034de2896f2635fecdf97475f91e4171dec709686fd742864458e12fc331e12e85ebaecea8aa775fe3707e299e90ae74c672e7bdb41f9b5f9873f67e94fbac3a09b7c95944a1596021c96aac30ee39330e461196ec917442d2233ad844847183f859b0c1049a3e8c6a85fb887c37fa255d36ea098cbed8be09458f6075677dfd76dee94e21f90b5e3fa8e7263ccb0f37e949bf0b395f746f743615a2cb63d2f859082eb26d8c54cd732360b03d9bc42c33ee50fc5f8742906258504bb12b261c85d80f70942a6d1c7041e328399e2b98fd5f958ec5423d89d5981d007455e950b6f505da206e5ce2dac20cff4ee89ebc0fcf4127a11205eeac9b836f783bc523374416da607bd783259966872e6fc0f6a7f668ca8461b3342d4485bbd1cd77004bd688e4c6ea08249389c6d4a137207d27cb567f7b1c6fa2fc8879847654056f91812ccbae52b631d87103d7cdb49d5dab4d96ba99ea4e5dc1bc3d2f65ec471de5a9d374855b3e78df3f4c84bc0c1c12fc59aa7975a0df23b01be8b596ee1d5be0b4f00000000000000000f525b05000000001657d5a20c2f4cc73d050d189991c9e8fa5680dfcbd4fd7162ad3bda6334aed16560be653f7e141f4d818fea57769ba9ba41e27b29f4fd146744ec9241bab21dee429f622b4c6ae52891a0f66a371c551c81706d8fd507f8331183c65c0d4ea1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009775ee1418ffd258e44415bcbd865beb607a894c5c61d20d7806b117dc98b54d51593fc569e38f195e8547ef3f05d38ea448baf7159a7eef737bd78651ca38d141975c0b384f451759a51368b676d8d156a4b886ca7870197cf1133d62182065c1fe276eb36fb73dd50ad727a0d454b20f048a07d9ecb93c4be96b201a5843e1030bc668d7e050490cc6e515da8a4fa63093ed293c9ce58ffd60263d556635bc8102213b730ab5da2ead39b58238d3fab3a168dd271326437f082eb57b8c2ca34ae80b05850aeaa4a1a26ee6dc4cb0433c7fc21327c6a0b24b638c68d7b8fdbf0c78fbf8053a3d708523addcebdc171b3cdce9f214e611abedc098ade07c33f0802ed7021371facb57e5d018b838ff5ede1ec9032d5d110c22b8b9ee3d27beb3387b0d18032c57099978a157e220bf83eb030423e76a154e82c9da6f77f3fe2356a8dfa3bf0215849788e889717be549d231fba2ba6cf0464bc141c9a6b5473ecd491e82d49c03098815965de6518f5d98bc5d773064365c7900c3596060ab3281377a4043e829032838874dfb60f1d59eb7692a926919de892e9ff0bc60887c2106dae8eba31b294cdf34bcc50741e05cfa6172a0cbe30663da888d8f37b872f0134e309c46befb5ea6270703684f57da43936f8988dd8625f5c92e7fd62a9bce3affc58b2af05a6fff832266831a7311298ea95cb9a697cd6cccb0e627a5ecf864e0a796cf226d2ae315212706dc8111a2eb3b43be1c56bdee5931e345fe6b3a3c1390a5528df216b83ab5e95fd69910fa0386f956d339ef921e2e7539d2b1edf069f2b1333ea9eae7d3f17f55653471f97cbb02e4324b0cab4a0204c55480c27a8e3cb6e2311022181ebdbf81e83d8c8c10a44efa535c51c3cafc4bb6ccb2bd77b70d07ac44f896df817dd3da75f956bf424b6f64911e791eab42d7813aa9a3bbe6e001d502456d747ac89393aca8a5c09aa23196f288f8364d6877b984d590f6e569bd5bdbaffe2e699d93e2f432b9d3e5cc09dd2db3902fc5278236550f85ef215312a5a4c2c07f25b2bfd80c78a33f8abb90290badb90b25719a71762b26517b3e259b7ece74cf55813b13d16aef76b6bb255df5bf9a483fd4a1ee3f51163f28e58c826224f8805b1678a775a74405f213140dbffa0922ffd5f4ac6f553f0e8ba81b887b958d9a0ef6805e03111f2bebe2c642c03170038c2a638fa68ac910fb942d877dbb08a8b3ac80e3f222e4053a0551a7efe45ac77bd54ca388a7f7a5002e3ac6df67bac4a4dedafa78a341a6c78a4f4247951295f20d598b9deac2ff8552b00df9f1d2fe8efd1de8ef512df74c20e88f0e39b5c6c0864f01e3e9e7363848a0fce7bdd1a4612536e1f47370631eb28523001e17ea18fef5d2508ee18919c2b8884c28f9dc7bf6a48975cc19ac29e555b6ca0f33cacfbcdde3839ae2daf5ec3de08f754a7b22b07721521ffba494b1f142626388b9f46f1797a2352ae7a9beb31d3f80a9d28f07cb21ddc6bef96d425b3ffa8ab08d7b30d44e725ff288a7d73b1926aba94baee8435899c5d264900f52e583829faee807f2c49f8d0469203f2b14bd64ed3af48ae460d387434328709633725e93c6b1a7a825902700d5de92abc625d8fb9a7dfd735a696865762cf89f9d6b84b0d92ae361b1d28894fb058d3cd1f2401418f52ab4c2ab7f901828e9224c5ea8a461ad41a573fecf7ec4d7e2eb023c18ceac3969d0850a3b7414db7fcb9b21d44ceb218bb972baeb8e6f6a9d394d18d44aca3535b5db55e33426a8503b2065ad628470272f9ed4651d93a1ecbc285be6bb59910b234ef3dbcef8aa133b6adbad8aeff011e6a336e190e6f199ad1d3937d3d9546616a5fa9e3ceb9ef708b7f528dcf7eee5f78715666d62919e40ce6f6f296203a032daf56fa5ade0051c9ee53a45d3a4e51912518a4544ebd442766194c7ff116e96654c07a372a39a7422ea13e42da9c249030a7be016a38dc9e1881ed2b3b9392e5ac9821b73c1ce6a7e246fa20ec9df6f27b74be316b2a9431e53713ae1c5329ad23dda70fa9007251292766f5aa65461e727ae65e4f8b8cc69a191c97fd1a1f1d2cf8a51ad41f4283d6fd8541d7b225a8ae7fff86728cd6a8f95e7766d74f5b0b086dca2e73723a5661d6f986dd0a6b19914708b53277b1c9f524c45303a05726f43d4468616f70dbe1ec227f7f67b0b9af3e1cb49b7efee37accfdbbaf1a7ee8a02b81e642f07fdd7269773a043ead78231b6dbf1a91d18605a08b2dfa83f99521836056ffff787b0e2f8ad86000000000000000034997600000000003db2f6d6044aa3dee272636b5755603b33ee15023a807773ddea459f625a2b7e9c6b52026ca525ade0588b01de34833849143ba00f9c6089512af18f13b485b57f4662270a146216281be22d6dd7c6cc129e3975504bd2cd084db38922e7b74200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f662fdac0bdc91ad93c58abbd3abff35bdcd4828182092166acb22d9ff3372f866660ac30281485dc2c41f32d65024354794bdad41d62b1e85a7b9ff6fcb0ffc596daced5f6829c74df4ac88f67ed2c8c7f10b518016bec3f618d5e976901ee6f6efb4c90cba5cca3c40bff44a8f602df1dc5400bee3e5af13aa22505ee85693031321c4ecb28ed6c898c52a4540416df67a34c80e01281d9d8f8a24a8cdb08e3e03230c0b040255705d0238cdc1d4a4e6df2fec14609760e9a7c499000c10732ff30a08b2168ad7968642777e29731e1baa6d6c291e1fa7d05465c193240978e8962b2dd77be01b108f2da8e619905d23df139444c3aada314f67e72c839f86993feb03166036a4828f7f035f56c6ab56e65fb54bde2f1c4f2006392f42b8fbfd5e3f70031a37a6c48375b8144a8894ee60c8e4ec23fa4fad1da2ec2d757daac0112ebc730309c272fa7d049581a5f4ffd83a87ab2213e9c4286b9d2bf062f7444c0aaa0c8d02069062dc14d0ecbc4883faf13160ce0e174ca3d816a6f47e66e8e2d7a36ee5ea0212765361bdb795e5e5855c5fb7d17388c98b530ee21814be2ad47c8b1882a6d71461a4d7802ac100ee6bd373ab600978c301e2eb9e47b9b213297b94081e50102bae2ac87e35f76288c88bc5d13b7fb1b43a611967a3c7e98194007aee63b6f28597b9dae04b7fa0d8c995034ad1fc608a379e4570afd01a96264a45eaa5753569fe7107a21a0619ccf7f3cc2cf721c0ca31f81c2458b90b1b81e6a14d9c98de8c5db95f1a9021667376dbfe15d09c674a3004647a30578b453db8bbe31256a6f080ff5f9f0d8ea939b14fc15344f9ea0d49d801debc65357429bcf20c9f167f3e7fa92420bc2ec5df6b07a20e9c767a497ac4e78472428332de90618359efcf2c7c1715ff03405abd9580401a72a14614d96d2f4574f1d5597a9788a8957ec5ab179bd126d6922aa87f58569966d986024340c54bca4574a388bfa8be79ebeb48c3b93bbf2234e0f9dc9a97e3be718f21a52c28b93e838e09d4dc9de136a0fd258283553e0e86ebc2d727a47a17508b1ef6a4fa4fd165943371e77451e9813f5fc9bddca0f1bab64b90e766adf85cf2e0fe10e3835652199e4c9d7cc2fc5a48b4025dbdb4dc439f47196e30e590d97f49e0657330952fdd797eed5e433538834b0c23afff982399a1a66d7261b5ef2b5e714335097e10819d5d0c7a674ab9841fccdb6dd9acfb84c8f416692812041b239886c486e211c8ab140d42892e1793d325679090ff46a79e69cf18f88a67d8b52cb478179801b0a06495f721cea954697038944441f3dda4f30ff9ea97c52d9f961d7382286da18250083705faacb18ea1ca559e00cd1b12ee8b61373b559446b4ed6b505ce09dc5cecdd5493ad4ad90a92c611ed517c1a30127b3ddb6c56a8b0bf836d389192c1c3cfbfc1ecab0d9e119f43e7dfc82c3382051eede0720daf59e16e8aaf4d5f3ff1ca18e2b112a0184c604a58826b296098151eb9614b232fb56fdb349c155b5069009cb44f2ae341322a0be2f678e75bbeaa071a434f0af16e96f812df47cf448163c90a9fb949b9b926061838fd941a06767cc3ef915197b33ec5f3250851bb8151a8e160af8128c5045794cfe9f345360138671228db2ce5e8d730fb64fbf08b05f4968722a9ceea4c8f27da0c558d6161600928e7a5d3b78e0c40e19fb036aedf32f6b25f9fc264416a2ec0e9f48b9418d2b37e315620f55c5513ae2788bcb88bbaf830c7b51993388f465d9feea140e7f29dead1210917d57d6c175ca2410830291d0d853703fad922354e014528bbb894b5198a50aa97bfdc553806c992fb14edc009288ea6f16a93d33630e05c2502c6e176e824de220e38644df6e5b9f5b4734ddc302c7af119a0909aa1b0c098d98b5a8f5c2172944a1dbcae398a2a6cc180612aa808e5dfb069934a766d525292941aeeba4d70ae59d2cc98739b9bc87ef39d2536e42f6c20e12ca4190579245d92adc0332653f317b409566503e12bece5daa076324d9f88b082a926aaa734a35d20d3a8275d0e75243b3eb6528c9b775305b00f07b5701d8a13c6f690cd542db74485ff5fcb3c12ad1d0bdf04a1a9030f10077019bf53eaf05072d2f8bfc952807111a04729a5dee1861de7fb767598a1e80d6f2ad39138208629fb83c813f13139c4713ae3441c8479fadd8075a742bf98a14f7c6cf54497587a291388ae710d76a9c20c65a033023994a53ae239fc3e8935545a65da9e48ce969b16fd96d61e51028924f34f63a948861d561622d8af3e34a8ee85f072e49e8a95cffee5e83c8d9fcebec7ea9499445b4659e5faec3fea046ccbe79f658de7d5d4f7577a79c428aacbb81da6e999130098bdcf3a02ded735ca30b941dd81e86de7dde213db64c7bdf855bcf0b", "6565", 2, -1271500570, "70a8a574dbac00a6d128cf2b0b0622e5686c2e58e0081debe598d14b2f23760e"], + ["030000807082c4030234f7901026cba6806fda5068131d6f11057a5f371ae7e28a9bb05d6f5402597301000000095265ac53000063ac65959134719791c5109f947404ce9bf4d89c313249aed6b05ebcaa4124c3b41ed8a042f24d0000000001acfb10b1e603ef6d5d0000000000056352636352a0262300000000000953000053515353630091bf4102000000000008196bd0000000000339945f05000000000000000000000000fd4e7b11532fad1c042aca24bd602bc57d11ff70f7e1a942a23177b000b41a25a83aa622e3b01e96667e405b65dc15ed496b1be7c3b8bb4473a5d7e6489290e1df73749f46f4ee0a9b227248abf48c8567130047f98aa2baa8d87f5be7b00a83000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ba3e13d2d86cb7d72459a589921f1b800d9afe244d4d37ecdbd5227f2b14b09f0812ec55310901fc25c06f98f8827a9d1773fa228e6b26ed79e1372c3a7aceaf4eaf5c4ec5e6c52820b584dc25a962eb23b4c65607220599b1fce3ba71a25597dd142117e69073cbfdaf93601b8333239f6674fcdfc36515ddd507ed691e87903266ec089128359da9b91043e0764c3e89ec8a9ee3661316a203526a144cf6869020ce052412822f02865017e86bda6b63b29f8d1920f545ef2992f1953be410e000a07ad78452b3426b2ab2f6958a3008df646a34ef24b75c0d658c279142237c722484012934cb599637cdd27e2e0e626d553a9472f6da7f2b7429f1cbc2bb2213d021658f548e641f9fe7547e2f72ee6e938e54f30a7e909795f42af37c825239e3f0216a8bae84d09f392497a5a4bf51ae230c4fd43da7876801f63f41d114db2a62b0227a429b18c360567ffd58ddf010bcf86afdf035cfde68a40bbff4a9c9417f720021d17fbae44e696d27fe094723e54ef3a804a6463c4adf2997d8d52e0758b156b030ff8fce55b973f0c9ff9e2dde2afecdeb9a53be0e20f982a54e9d183e4dfa08cfc0b79c28ae6f72942166443611fe653850cdee8cbd838aece77077e70e545df6bd16225553470b81d91cc1f5247fa0c73b229ba5455deb713cb15f9ac63dcfd51de60913b985969948d854337824566564ba49062dd09e09f49746d0264a57403b1886f00bf6d2847d789d39ea651aa2932704b84c4dea67cdf2404f1c2a597ef77d4f49718028fb05806932aa2071613056e40360de6ea193f6fd688391dc8d586c1f26a25f1923b9afdb0da2ff50f1e2c200b6243382ddbca25ce666c91b52e4f07aafb3810d421d210e68332ef0b1c5433cc2cc5aa8a3bfc1a540009951750207468bf4ec331d1dc0e68cabc09953106379bc686ac6f29034a4447e83d8f3be608c69b647be3e0433d031c00862a64b40db0b495ffd22860109945d5fb1cdcfcad7588c48ce7d6b60bcfec210e3e3922893f01c22436f64933a8a3a6faf9dfb5fe83de3afabf5645a58f17b2411a850825811d76c276b5902e0efedb12e6412c5d524eaaec47ab0c1fed1e77c774515a5340e00775b3f21f55a389cfce56e00b2fa30a185228e9ae1e9e08de107aed35fe92d9670417e94d51fa0cdc762b1e93a565761d32034e0c0e639786f1169fbb0c9cdc87fcc5649fc434ed382fb80f137256bc4c1091ddb00e426cee6a5c0127d55bd7c3d94e4330bbe4d65b01036acd308edf537e7bbdfe0cc2f32c310c69f74d94917b569f71c0c6401396d96d1c2bdb01189a6fefd178a596d4a3e2ecb70118a97064f3ccfee070b78314983d0197abf23b7edb35973be8489fededec4e65cd54bf3ff1af5d149a2fe747f47f43966dd88c4b4560fcd602d1545e3955ff4a9ddba09c3c0d3a8cdf909d3f33de1638cb4e80584bcd0bd4e48f1001e0293420cfd44dcdc73bb9e5f5cb3e65b0d8fc864b7f0542d9822f892ba48cdb2075eb820ef0a07bea81bd192ee04ee2a65fd0b367a8e44d080dc5a3235eb8397ae11a8663898d12ec73d7b995750c229f45d2fa9bf61176ce5744ce3bc0d2676b2ab8ae68451f09a31ff99878c348974917019651fd21a80cd5ead07b556bb31bf8f42f8abc01f398db6884b88dd9365a5e0718be4e6a373f8cb5ffff716052ae0a367984ba0b10c7cecba9ffb19629f1073ce1c9424916672b5282d8900d72eda272c22754220ec59fd8607e538447abc1abbc2c4c2a91b614ca40572d401bf18a2340484e408ed96c58dc6be84cbcfc7e46998a2cc614e58f360cdf6a040a4948ffc2f88909f3ce08e00c17c1273c332bb86a522d1442357e77fa269e7f51d3c949aa81b6663b0ff74bb9397cccbdc229b50d508534fce7f3fd39e67e90afb3a01175eaa63fb2f691b366ab5b561cf1ef483317fe70227362019c77ea877458f63c0691c1eb716ad5b3fdbd7dc89eca9571403c6f01a3e9ef2b41865771bc854faa8e33c3c506690f5a3fa11651da7fda3bf55f90a7f9913b07afb941a69e5d2b40b6c0c01c485b519e335e63f4c4147067b97a6eac3240a0fe31213fb5934b7d134095998b34c875aa82a4f40cf9608a998c2fc1c1126702794bec86b8f6b9aff5322883ba48d1249612dad9594b428c241606f8a7751722bd0cd17cf30bc1825a1891d4cf95ce669c38a3d56f0f7e8d04bd688162397c682649242a754a17506512fe96198612dbd4f457559fd11421b5855ff286d33a199e98bbe54d00ef27296500000000000000000869660300000000479df9f914919ba6ccb04f749e592da9b5600d282723e04569aa6dae99a349985138309f83c39bb395142c5d8e6ee9c3aa7443705fa73d2318ff28327db69effb1dc382aa4e65eb0dc3e644c0944185a5f63f361e3f17faf38cf5501efbe308d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e19de26ef438488c85c099fd91be859a1edb8b5df131008e6a23679c2cbe374512ced7d04bfa1d46fd8b0f7832fee71e4181bd118ce04f0928c1a88133bf089fb7bc84e995ec53b41cde3a2087bbd02680d367a96f20b9e583dec855edcb27ad77af85f8c13a4dc04bc82f458682552971951253d492a5496335f95d8a4c008003203d1c5733081c8fcd2817fd5b1c056daaeefb20ef54ae7a62f7fe34d3649154032b14975a5f0c526accbcca1e1d58f00e46a33e6a2e66e999b97a70323ac0722a0b07ba25c9ccede69165a972e17d713b42a5b4200a7cd7c07c45f7e4c4c7ba1bef06feb17271023f9ea57f4a5a6cc4f489f86c9d2805b2c9b05bbfed8cab41ea29020a82590611718c98cefb3b24cdff1079a2e33a5bd36a1c520db912912d9955f9020e8432bed05a7c23269c1ae2284d926f2f099504b78f9e5ae66f7bca6a39801a0201f94557b0622df226fea3016fd9fa9ceceb59c117434d65e41062cb2395cba90306e4929eecca9d05fb5c09966fc396a9ab25f4d648f4e0f434f961e160cf9d81020681671fb63b09103481fbbad9d3ec05fe13030c9c037b951082ce3e7a2e8b3a1698f89d21731917716bc71a3b19191453428e86e1d934ca18db772a258ce973df022ece85d35737dc49c10ed05452fd514accb2e6c697703da903ad11718f08888a01700d839f7664d9df69695acf0d5cf73b07066f04ab4443e0c0fd93c5182b5f2ffabdd9e498cb0d3801fa5a81dd7507cf2858c927e463bdc54a27e794af0d53027e956a1c96cafcb6a986c121bd7e35afc6596697686f6d17fa2534f8a990cc5a39280233ce182bc072daf079f3421107b319ec612a54a2a781bfb1dd5f87a28b779ec0a432a8d6a31bdb7c0b465f6b3c751caf840834b85e0198919be551e89cef78a18317ce34f66f159e1bdbcfdcd044a32efd4d71fb0cc63b40d14a5b3d467b7784913a1e865647ec1a567df9b86a6c56de0c96bb52012876bcbdde0799f5fdf9b9bdd467b44b176a1fcd3f3172cc402a2a0bdbda6edc0a872ff3d98d6093872601fdd407e3aefc0856d8465bbed6a2101eb4ba0c70f915b12e36a90345e26a9b2af4b6a61ca27c1609418c4a5ea9a22b96b3622e63495691d13aa6b44bf88cc9602d598bf197c8bdb7b37cda870052281ec9a48fc2200b086c171d23afb4525cceec218f5b13c1ad805ee9f16f19ee3c8cf672e25a362e18b907fdd5c32194855fc29ecb03d57509961dd07bb1acaad0bd2f710d30c82b1451d786a126d62d7b2dc337e4da995f672c23c05c49dd3ae31ef938f008867cab79ed35a8dd6dbd5fd3113b8304f55653a32b745573db74ab90c5e8d5f8d741c75d2795c28b735ee1c4f8848970be6ff13bd4b0b8b14e8d5c2a221459a15d53f8d9bdad089fd6d0c1d9fee28213277c5f23fa3b6f2360b25ae7f8cad78980ee2775b0d0b51356382d7776c1e5ec027f679a994fc33c04664a0007b0a9ef830695e3c9c0bef6a14c665fb5b07207d470189ff39fc88eafd481b092a175130a555268126a877f4324cd5720aef420575f704ede23207bb9c987423daf89be258da161576507a18075efb66f778e70851f82a347645852cef56d66cb44ab975ad38eef77997bde889f04e7fde2482ad5bd5ef604a38498829e5d9f1069738c6d426e545d2121ae06089fa7498f71378ea489536bccf07ef533b4c3c37a2896a44c5439ada485f7715afd7da7d940329d46ce7566be34a4848fe9a869faad369676b3a6fba5d2a9f25a3729dca76f08548c3fb74e4923cb751afe4406ffe33cd101b0f801e43417653bac3ff870add9a6b27dd6dbac34ca83e49889cef214bfdc4fd9803a75594d7220bff0417eb23da4b56cadfd63b1ebe40d10b7bfedf2093a0ab7064c63aea7138adc9ab792ea8204c350b84d37e6ce8935f49880cfb3bc64591b1c766682531f7294695245fbb0bf047cb4033a3048b4039a1f675b75b1f2381a6d6ab2c18f89437002aad8636f557f36c9a15fd8d6b6cf002bb8cad2cd91181af55d4e6330cd9d2f76d9bc389c6925967e1400561fb5ba2d83a4f396e0fae135e9e326a07a9bac3a2a6a63d7be21d5d5e807fe218efa153dc7892f0955ddbce6b8ea57c575770314dff718c8dabbdba406b5ca6b24448ddb9e34771c951d0bbe1c8d895a1dc1d1ce680ed8705e15fda301d71e75448b4c8209162f35c69f6d7cdc00e7a5a3b5cd1d9f321c6e90f021e5235202ee211423eb35e5170545d256ec4f2ad1b512a4f2617da7e5515047708753ac7dc5f2f69d0e02000000000000000000000000e7cc5e435d63d55c82d0bccc205a9cce93c4532fab4c54301cadb2cdbdb53577a849695d610fb806e73ac74aea03fde4e8520f5bb7274925e753cd0cd60b580ccba99417b58a33edf89c1e1cfefc52c98c8a36a97699fa333154fa9e3f8a7c60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b99b81a233edd3a6d05e8ea5fb4f4db53f891ccbb0b17e95578d06e359de0d0ecd3ede8af2a6053f226985a4c21e6b311fc3b09b3e94a2b691358021c0888b7ff842a5e3339b59e6516e3da80d7bd73566549b899f3287fddc35476f2149a2aa0a83c6d862c2faf4ee209ce4d9283d2bf15625b1fdd9ab51a1699a2b43ab8220315b943aa6f8154e0d716033481051c57b04d90734369f6cc6cb323b72a0b76a7032e86896bce11bf86cf744a3f6cef951f942f5c9ee5330f7861f667295a2a43ae0b02625693c261b1f11b0047553a77a355fe3f078a99f73c41f0c625990338a01b2ea8c889dc4932fef3dd0d67080977eb14057b473d1214d95c8694a61a5dbf3d03176dbbb76e06de90c3dcdc4e5dc4b9c48e2303fb3b8b53403b7102ac66895d21032b1e10950a6e893bd65e5c12e4f5a5121749655b274cae4a67bde08fcbb538400304c1d3ea7e10bb79f7afc97333394076a969afbf0f203f41fba207adbf1f4c05022f463ac0c2dc4fd58c667080e74e64dec27bd8d6511a377c016f22a5963dd4cf0201d8a71f4ff8b6aa442d52256b8d352d2783ba1e2e70116f70af86c0cfe693baa3f81692e9683a0cd84b3126e146086ade5ae3d625964a9bd13ac657daf9e505e931de4985c5448c6a4623a7a59d13a69940dc3a85aa715b21de3e162a0dcacadc1ab8cc8d1c05348352d549d4799b747dcfd9ef2af9006be404f61733127b3de1275da454205739cc305183d977a3cb4348310c554dce1df4d34ad281f8f0c3d1b5602fa36ce2663ecc9dfc26f7b80d3a129e94f331c2f5c3b0601ded7e68ddecba5fccc1bdf68a12d59cebbecebb6c607c49c4cd20f36e92cdf592916ad5f1a5e868a11d84439ada30a9918aa208ad01e4c84021bd0de6266f2d4a1a5433bac6d1002c95598718cdb856bcf457cdff756e000cee4192815ae86df7c21a24f7d5fac10da4b34446eae6ec77a5b3ffbfa6a167b89560f698854bbeba6fb413218005f8d53f4f4fd11c7beb2900a6a769b3c3dd97827b29446c49a6cc99948bd72314f9702af7cb8fb3347b8f7271ca452116e5a4c07916ad22855fc030181a91250b2bc9cd5ca0d93d9235cd9588e5e36727f7544c36c7b37e54e7c78ab74aabe2b10e5ab31b961bd8fd7bb822ce5619e95fe471ab778df90368000e840791e22b6bd3940f16ae9293f349aca8d480ad6bd57617312d5bc28fc5912d70290f84d49b7197dc912f44b58580c2240f442bd10b37cb6c2e08f25cd5f4774f4dc47d5d9ca7f6581d0f24fc379e10a267ab46dcf80de1124f1eb79193f54591ceb95aca2bebab5b60744ac23adbf0842a23bae84c8c0aa8864da3deb2555e71bac73bb520bfaa9c0743fd43fc40aa0bf2333bab7671a9b41ae8e30f6b81a44dddb4375f8e11132eac834f09089bc91f9c170ae7fba0824d35860a69609ea6c6a3b9daf9aaf5b815268e5ee25c4b007c6ab878dba589ea576cd9095fe82ab70cbd1736e4e17cd1c707cbba8285f785b8389dad28942f9e95b26314113e515b6fcdc43dfa3389c89a3baaa58ad16a44b4f8f594ab0bb2a2fe75d860977f46c3b18cb60a9e20f6020b927f4a07a3c83c0059317fb03d25a0a7b9d9e87eab2286d5f8430c585469cbb9bfcd587e16f96c46b0f787442e5d91d3dbea2e29d78e56fc051c66ccd33d2fdc0a606ae0aa6e6bd134bbadfb556057f1649676a2c26ceadfc6016fb290ea005094ab293adb9b950bb72b47cf65519f970a6d5679af744ce9db1c7f573673a2cf431c9a07ffda7e65c5194c8b9c046ee69023aab96d40154a2c20e7fec40b0cfe3f0953f4854927f8876b7886074346a2eb8f4969450601b1f0c4d7e49beb2520bdca3f572848601ea49b5cb761f8233da992abd5da56890825876c09a0fa90d71a39925c145469d2cdd9d5d7e8cfa01d929bb7cd6d70049b79c00ec085e82b74174c30c86ca63c7082987183de15710a4e5123ecfa7d38c299b3d037a189bf87810a2d2573e1a5fb391e52d916a56bdaafe9262824dff35a86abb34318df8a577ccd4e79289efb4d7f52d855e36f25039b3db3ddc686058ea5ab812ea2fb3ce5e9fcd1e6ff32b08fae5565530330b8efb2515d0cf9e2df0866d3cd09716bed73785c9ffe10338857ffb7dc2d30323c78bed8a0e3ebb148b24fd6076cd43ce78e6b548dbbd201eba734a52c67e262d96bf4278e30aac8c628b6620a23d4f77e1a56708be1cb32a93f67c3c0437c901dac970a1923679b0507c60149011f94bb0d5abfd92d394283c31c5e70250c4518e49ca0da8c81270dcd57a6a587f20f3ce685b6913f248646029b7f56cb4a79834e544ba1e5500d474915e438505ec761369de077a4c396e68893dbcc4a521865bf85e00b8e8a9fa878efcc2ad013bd6713009effa0e6cccc3bad04ad1a06", "5265535352630063ac", 1, 2076552670, "e06d912ef8c46f9db7db8ccdca3e3ba1b3eda2a33e2f0bf09a4fb602e7e8fec3"], + ["bbd44f5a0499b6bc99aef887f147045ed3f4e76fbb56aa792e66d44e126ed1934e60f732950100000003006551bb5b6ab8b5feac05d568851a0d5eeb04727fdd1f959ed131cb90cab40505a9776e3c865e01000000096351656a526aac6565ffffffffd7a15bc3f1175e7fc23fe72a506dd304fdd944c6d5e59a0b0b68d8ef65f82a6f000000000452530053632ba8aa62b1e58e00e30ff3c763e8056a1f0c7f5a8217179078f5a308cd660619c554a20100000004005365008a8505810123532d0500000000096551ac5263515251530000000000", "535363ac", 2, -256371987, "44e91c735220fc03057042c0f69d93b62b288431489103b36618937418859881"], + ["030000807082c4030293b3ac16a08328dddd335d3623019cb1469528f48036511a310797d93dc441ae02000000055100636a5303482501ffc6b889d107e22d84ce43e20231bc3fbb64e8ab8541f6e8e9d2bf2a2f8abd2f0200000007536a0063acacacffffffff040dcc52020000000007636363535165518d91550000000000065265516352523955f90100000000008d6b4d01000000000053ac5a443a48ec0303f28c9404000000000000000000000000201eada03a05fdd488492638e16c0dee3c83a2de0bd3e0f1cef4eff42a04425efae3a22515553ed2d85bd8161c2df4754d2134a9a5acd217f232953a4a53f82d0deb94a550da11282e1332a583efeef138d53670147ce8a7dc5f92755e9583e800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2813d09746672057d6cdb3dd46a18bb0a27d091762fe4e38896df1f7dc33f09d0e6f698c76981ea22081f65af420e8fe4c6426ce8f765e3c941fa29103522614c442e139b030a5a998800fa82ce13ef6319290681d27ba1950e15ad9b21cd55a799ee9dc9e1cff0dc072c58ec66f4b2b956c66b6e91748fa604b78562ebb8220207744e028d472f8345323eff445df94c4d9ffd50f83097702cbcc03d4b78c2e403305ec80ed2af1a816fa673da5c163343d70559d52de07f8aa67aab96e80b18a60a00ea233818b767f9abb455389da8950d98b4df347a8e0f33ea32009cac53bd2e18984bf072da2436fd3470796637f74aae124a4eaaba11bdb1a5d30a9ce87090031d97018cf3ce5883434463cccdbc84455dd8d38b0747aa0fec094abc0ec7871b031364dee729f4b0b82c27cd7142be9888bda57c2e5b9d830f9d2b8bc07d7e3c62030d933bc11517309ee7d757d91038ff5ff74f52b637c405d3d961004cc62476e7032e06772af378110f8e861211b3e197dd44612571f015ae8d2cc94fefee4ac2bd030c7e91050d92310e7a44c3d1c936bcc044dc86db411ac4f7f6615e1cf2048f7d77aed1cc474bde7603ff7a315afa80ba21a5c5f4920d27d75323711060f3c7b38cea1b01369205f4d96ac94e6c9d8c0c72dc44060ae54c5160c0fc24648e2004b0cff2074d0153b6ad46f5483e6016352a12a9619c674b5718e9187d9a6e6258b67c54384f2a63463d3838b95603850f4f96ff6506903d16f5808c80ebad2459ac10233356817af2eae583672f700dfeef6f3e867fdc6120736a2cef1cce0a4167c253ee96cf6161ec7de89dd824185e8d17f5f3652863abbf0fd01b5455f8dba3c67cf60c400b43daecc7e0dafccd3361fd15d433d33dbaa2153ee4066881227eee4a94fceb2551f4073c5eec6a12496056696992c148aeafcf059af85226630b0321f191793c9a69e079a9cc1cc94b4de1c817069c149cc5318178288f9bdb9726e2f8318ae31e0850a60af907baec45576f9507135822090cad52352fba049cdef5a9f6185b605a1e3ea01f10dbb98c55fda9188ee6e1da76526fec0dead9950d145fd97e82b7a0e67093a14350d25e47ac061679e7b46b164504766fba66cd759f0be227d933bb4f82fb988abe291436545f744deac0acc9d02dcbc51941d9b05fd0f98a91807c7cb84e3abff5d120922bad1f47771dabb5af2e7a44113eee6e4c9a7c3d8a94349463b6eee55ce2da64c0cb371c2e32238b8a8a81e7db4953638b5fb11069b283c26b5ae6c5d1dafa26466d930dac7e597bd8ae535d30da66c4f3d01742272e795941eac61eae8999f7eee48eb567e1d978ca9270b1a9a1b7e51dc870c4eddd6361fd7eca18da504af73975bcab527f13168a4d11b4a58cd81558e131f93750be91dfd720677cb5c8c12812a210c4cc8631290cbe2e3022734e0cd0d2be1ec6d318507be71b2a08a89ec28e7ed64978c3e1646a14f7ab531b67ae72605f2e25f77741c55878bb9632e571c8d63c3c610fd06adb91902bb1b1ccb481911fee1f87d4ce6984e76f68b4690cdf07b68161e8d2db1f07c3284bf86ac99bd9c16e4b373493d07ce463c6fb38ced7bb0b9df8269ff1f2a4f195451dd7e188f0c88fbf78b377c3f3cb8af9950ea85a3779194715654a5d820d634d8783ab5431edc0d7671a27b17d58a5bbec9c0f8400926e5b47d5f27595838971e2fd59892c15f671b3759c183b9a6db2df7d01f0ec177c29ecc35a265e5624e1ccb1c953929cd70b9acea5c2f2a075fb8983df1beb33229a6c1bf7a1fb17770789d421144d7c14445ff4bb6698f8d7e3dcc9680bb8a144c9022fd94e4eb727b282eed30ef4d134a6ebd58f8057b8654aaaf8a15a2ec4a55ddfedb6a8aef6e05ee9b2c388670b4f53ade3c3d4a140fb91a7e9533aa3d9965f4ca8dcdbc770dddc521f6800ae136d96a03272ea6f032ac550e2b00a43e522ae14e83a7797eca19c6ea828f87d3be3b287cd807fe1b49c7ac8e3ae3709d6a0d4ce51617bc60ff41d036bf68c52fa67e79a9b1384e2592f0f2729387eddad88e14194170e969184059bb2382dfd946ef7ad18c597e4f4474fafdf6beb246058a86c18073ffc7bb4e2713bbcba2560dd34ab57761af27f31e315fb24daa057ef557a1e292b9e7b14bc47a94f8832b79c17da88bcc8a1999dbe7b65a5312d02559a01ebca58dbd46f21d30c5a8cf664e5de52f4ca6316a185bef73748ec771d55f6c6a0c9c814f59edeb5af6c8eea24707667d19664aa7d23b0fd760000000000000000364c3100000000002ccb91e522e8399a31fb089fedacd5584536e0eeb8fd00dbb94b8cac71dd934cb7fdf19cd5945137488f405d1ebb6c2033b8dcb45e1aeb681007b88f8be4e968bfc48bea531035755cb52ed19140936a951dc5ab7b175880004f04b6fde879b2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d35a26c4f60ab3f6ccd9e6dab747bf4e1c6e17ebc51ae9dc4e8567b0d738c5efe436126c2062cf589df82efc2e848851dabfc470d05a5ac71cc5788a4b680f5e8bfaaccaf8c9c71cf13088562c8cd0dfd2ad334558523df8971171ab9c8948dd44c52870c53e047c7c8cb8953b3b26160f9e8f597e1d9ac5379c1118fb826a4031dfdfdec4e8712783b77211485b4fb60b43d93b2e4689367b4c1b906668d9217032f42aa3e9170c918341fc4c380b1a5583ee7193c6ef002136dea652e884bc05e0b02a8aad03b3a3ebf9f6516bf26105cdc5836696bc9fb134a5bf4a7f21f21fa9b06bcb2d5f7e0c3182e76060d5683e3baeb1708b687e6f3319df6f7facaeab3c2032e3d9e3ca44ba16f88fd41a0c828ffc0fa22ec9b1ada5e25a7ca66618fdb2e3b031d3a97e65d97f8bf77b8562beca46bebb7e89d08c5f82ac3ec67d039af8bfc51032b40c5267eb46074fd785fd4d91d43d3ddfb7e4e251b828597947bfc155052e303220de800472100fec9e7ca1f9dd2f9218bff01120e27cfe7de1887df0dc4b1f6032424fdb4616ad8a603f3a9a24ca0c6f2214344e42011a6348256992d0af11911e0f2163d8a5779d898f8e9bfb61173386380391b33b4e87fb719a37199ae0960ffb311d65f637181a97fd9a1ac6a66778de5f8254fdab9f2b33289ca6decb5f0a4bd936c60e5104b3622865b7d77e465379f06c18be517602db8a9a6f5247532ccaa1c135f7f0e0376f3b86e18a5f59a3c2e639c4b9e67984522f2bf26df6183e384226728ea4ecac7ea72a872a13d9b657a753e893d7c84dc47b90f12f6dcb86433ddae29e3c8d238568fbe581cbe387dd8cb7799936c2bd47c37ff8a532b653059a7c88caf440a252d367d9c98ae7923abb06d4f58af54dea056cd2651b08cabe8c962695a401b570039ff3eb3a869ca689a7b5915227fea21dd5c790795450155ba9e40b028b549666d8d1fdc3ae2f4d30dcbeda60f08cac68e541ca7d0d04afbd1a6f5e8b6d57ba0d80aa615ae684edf4b77ce535eb93ae52609fb02afcec23eac7b94a0c8286e430a460f5e3ea8dd97c92f6910dfa6cdf96d90982a07446337e8b465eab0f9fbb3be8b27606738e194bc8f8d03ff6cafd72b02e50c052f62ec860d282584f718cc9bd1b60e9cda562d7ff49de1a3644049588c4a82840624bd63ee2332348fc0fd6bb9a9bd5a93558fba278f71372c2db3b1b7dd8b0024b89eaf316e0bd95a21b5a89bbce3c0b6b4b1fa7cc385e8b896f93989e7c2412ecfcfde5b52b3117f20c709326c4ceb367218094882b26a2c6473d45ec1f8226bd43672a3a1262134a2e3bf62b2790c3b0b1fbc89346c94e02ab45c53893b7cc7faa6537223ab89b05072074951058b31f5b552705ca3afd6959f6cd83a8f3ac2861f096e44bb9ca24d13607aca4b3d6ff4320f689fc53502852d0b49fe5c5d72084762f01ffcdf4caac8f321a26cd1ae1fbeb51dfd748147ece02a9dbda56ea46aed177df8ef2b1fd2dff84abc349cdc0bd00373d1362e96d2ee103a34582c1b5d500b17c7d9ef406cd92ae07d4334865a170cd993d013fab66443d4d8704185cf7f03e5fdd400bf64df423d3d9ba8773c60924afd6f1f5b57237199762684767beae57c15aa7ac703a7e17ce3474b954f2222b7f9e5506e6123a5bc5a9f59c25e9a4538891462b6deca55b2d0a18211fb1168a1305b0673f38a4b9b3573eb350ff2b45148ff1964da1c295ece0daf96a7d2c6dfe4454068d39793373ced34b3eba1894c34dc549c477b50c8f59e8e6c7aa03029802dfd7448d09cd2bd00d20f74428098bc564aa75e270e10e19e6117f66f0677c8d34baee59eaa8219abf18d8e0d907964efb9e9631c341068a9bc494222e1758b5d347dd80e9609e1d75e4671943d6e55ad0004dfcafda3f2bdf1fd28a591e43a3aef6f8b305acd46709e42d54fd4a4067dbe53f7ec9f3c7f8f3ef69b176534725f267604dc544293e3b7105b32f9f266c8883414dfbac4e6ace790e1a967acd2b224bc9029b6d089bfd84da557cee8ae6eb7ca7606d0a8ddb2e86c2414699e25d1b77feea302667ac60918d01c238b49100986af2bd3f969178670ff0716f0bbef426a645ccce762da8bca5b04dd05193421553bd6d12cf6f693c715df14b9e50f88ac4c6dc076ce50f0874f0e930ae18b88fb10a546ff64f6253e860789b7117d9b8e7f462b8e1fd50fca4570881d3c88d20439cc0a324e7ba19bceeeb8f709eec938e8c84086c660c065aefc886ac47a7a1c0817f5f540dc6fe2e2f10000000000000000988cf0000000000058b934e69e691259c213688b9c7f041e7921a55d4bda0ac74ec8ce62fdedae3475514897b519451bc7ace86d15d03ac3f2aaef903ea26abaa2075c1c6e0e56e44d6677690489e0d2f5177583651e40b0c21e5704e429e90b07211e58b08dde7700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000892af30c4eff38c0060fa2008dd15f6d7434f254b585d525de490681084fd92629a1fd8fb5cc6ab0320adb35f527dff2f7f3cb2a7ac24d1834d3b219ca0a9341a5c2f608937a643d20d141ed4219d7a9a4e2ddfb6bfadb43a14c1271464f6562869bb3abcfa3bceb1440ea7f00b75a1a87a71f01cedb8e936de580da5c89c8eb031c96ac76d1a1d9b4a45157e08f36b2767dae0c7c4711363fa0c2b3d2e045afa90228f6ce60299dfdaf81cba4c8cd0686b3bd78ad4344eeb721bae54529b09e01f00a03ab5c251c4c354b9df0028d42dd0499335d41d9ce8b909b57571286077e8d18c264a7f7bd65321c7397ab2dcdb7a836b0e26607aa5d79b459a1618de37b8bf1032123ffc23cb84a21626d05c8a04781b172aa6ed5ca69c4c11710857c530e5eb2020d668bdeadad0e15c35fc07dd5b5d937eb63b49692b3a0cb345016b2c399626e030edff641aa55738ed2155e5a0af9dba7e15307279986c9f917c404fbb16e35050208462f11d51e0df893d1b07ead0ff85352501deae8bc261272c3ae5a8a3993740214a05f63a6fbf45163f512bc4973fb3e8fd8ae4f84fcbf3f16078b79f503e4076ebc6541779fedf408ec4f2a1ce42f2959a0574d557c559b7e173044f5bdd674ab732a3f9752c4e826410b1da8793e874d05f7dac663671c2577a23e96a932aa528c5d0c56e0dc384da42c2ae21e10e5dcfac9fb44a30288dc626547266ff51446013d072f28feb24664692aa1763314d3a1ad9f460e9421f1e0bcb6d74b162993b1367538bd7f1cbc911a7ca5c7b2b53d40801287eb710aeb35a047e3cea2009d6d156367e11116f4c9de9559c0bfa2c599b6a32c68bd35800017d0f35e1c270e8a928befb4f310f4a7320fe0a619d8056f101a2871ad1c759fb165e421970ee6dac8a900175fab3afdc7861c25b8296b410c4414d8e14bba97dc5db48991a2feba1993a8037b45368de0c2dc1a06dd35c873806bb92e481bfad6b78f64a4368bb6324cc1573e2e30c86bd73ce2370b60e05753840e662d32836cdd341dc4f2e0749f2145071cc7a8fb4f1e76b25020a8fa13a7cacefb85f90b56f9affdb68a71041e3ef25f215e277cd984f0b294683fd4cac5657786c52d07f230f6b8e337d69898bd2752cd2a4479dd8e7259186686d8b4637a1618b3d42b34c2c2b473b0d33f1e44757475ad1b842f07c1a74d9bbd0eeb032ae291f1588a55457bebcb1d118499de9d5246128f227be82ef709e4af92b57179af083d5fd1622dd82f61ea2b6e58a99c8ca3e899d148d0516b26182db3f7fcad863f655d3b394a500d93be8402e09ee2cbd9365fb81946996706becfe5e70c563ae0fbb5d5d911cee83ffbc2c12130ccf8ffeef884b670ca0401c88c6f8ebbf8d94963f7a0e5dfa0a3dd37d852d09861fa68d4dd00a6fe14cc714d78ac694336db2e0485f592c69ee3049c1c8293af5c09fe5508a05045e8dfb1ef676e9d7efcdfd646119de5a49f5b3d73293c009b882e4e2f1c8668ca4dfd1107aa9c75cf9658d7a3956629c20be2f571eacfb2ca32ee73ceaaad6416c582b4406241d8252a72d5b7e3bb760b44d47b57e62b6148c1372c8e2b054a6685fd2893c01fb7660cd3aa5b9095bc03e73390a42bdc1c0ff67b98a641dba28585f69771702ef9d8bb7d5334d0aa0998567bfd94ad5ce710497550651f8cfde9e9e3ae25a15e36be40fbae982942fe99f5b671c3eb71d578864c0688a10f73d7678712999079c2c62c3528d6015781b0f1805868f1c01004f8365a910440f2f7112527b424e24021093430be868e38f5112a418fcfc416e034bba70452ecd9425148148dc0ec0c15bf6b7dadb747cfb9f479f266d12dd756f732e019bd8f0e0bbd533d44f60284101445a0737c541a17158e11ac0f6d5c32fb037e321bb818cefd0a31a5096200929c3d2c7be1d6522ef6a58a0087c19b19d6328a7193263ca85847f79daaa7f19b5f3358bc8c0448fe7ad774a2fdfae92b4ea6fd5e441bdf9d012dddebd4c5890f9ec59d0cdfecd94d89637a8676ebaae7badffdf6c71b45b41d84af5ba684915f5eaa70909a8beda505fd86e85059bf6e19fbe08636c274395e2626debe4cfa4f6fd4d06f29b94ebe8716fb8a1b2c4b28372e53b9b58dbb7c6d8b50664e3db0f802181cac007aa772744d8ae84be63e7c019e9c09884d01dc8c5d734f2f9f0eb5fec9e934bac124113a951aaff8db46b002cf8c27bc72deb34824e55dcb68c3aa5db8e29509bab19728e2a0d4d13dcbe7400dca687157cc9dee12b9cb6889223b0128d5b2e62af0117a6881bd08d2dee009f2d1dad263e2b7d86efca9b1b82264d6adf17523e31e4f6109e74a3d4d29766a85d5fa223a114c589d8171c647128a860021ecae9e04868075770d3f2db7e0cd6d6e480289e541e058041f5301", "", 0, -623894374, "94311bae0245b0159ae795b1ee95c1d85e9c3657495e5715027f021f0fe19e50"], + ["030000807082c40302dc3674a8b9bca0010e470cdf42716ee3e14107002a5166b556fafb0832c7327b01000000055151ac6a5208c00b1bcb0ae85abd93dc9a0468512046cdd493d8c173cf73eb42fe4cc2bca58fb5d4af0100000000f37bac770202ccd80300000000002350d90200000000095265005165006a0052110de247c65aa9ee01000000000000000031be050400000000312828904b127e6d64ca1a83bcb6b8edde693c6e33724b38f28006f846da2d6d0c03fb9bed04251dc5f8f3e7136cc3a3cf20732b9b4d32273a4cba9608753ba3f6a1ce3ffd41dfcd51791a54ead1b20bd4b7f148e80e3df4d24b98b64631dc31000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001475654906c5420ff6af404442473c504b883e24a6d3c34edac7693aa664e1b7e45b489291af2642bb2dbe67bdf3a21fb3fb2531db4dfe1f08612730b2ebc101d883900295d82a5191a95a221cf7ab18219ee80d8f9bf07bb44512268aff11d24f07bc4d2411651d6058a223109cc3c9600bb7e58d441ebb4866869879ebaca40206c2d8ab1f5bda6e112ae0d3024e308f2ca28fa732ec8f81c2eeea07723ce6d70324072d4483033977a9813fc556ed9f90536cb5f97bbdc99f870ec8e37b7198010a08e15ca4aa8a026257ae6f834b3dd556096052bcc16f5c2c0aaca3d858c37f5f1246d17dddc6d274ab906801d6e5deef90a6e804400d9d1312292efeb7da60030214931d709370536e9d6d6640e017ba54cca3884e43448c6f737146ddd811971c032c15d9239c1d45ed8b3fb8c04d178c46b3ae29f84aa89cbdc95b87df1192a9500212dee546762116e5eb1ab9370148639fdc02f589cbd6844a67c9e12b7a548345022bd2ca8c1ab0b3f03976efb57c523c779fbb90ae5e4e7ee83c10db85cd6ecb45020ec64e575d5e98d820c75ce34d4a8a14e90d4b9f18e8e9309db086ad5cb947369849b3ab29fe8f6a00ca5ae856edb6961b8db82b90a2c83731d9a754f51e53b8a56a27b5aeca90833977473594a9f1d44fbe36d43ce9fa4f6f7de1dfd3e4698a4fe1058ca1e146a39da6ca80f65a41f7c32c1f71226189b756c5d629d524b91475de788277639bd27e062038f75e04482412f6583b44bec28a03fb9cfa39e8c5e22eb17dfb91978c682392d2a1d692c1d2f6a42f3aba1a3a15845d61b5d7d7f8e0e7be01986f529232a33673f698edd3236a6630f535cd3a56b4d8dee4834206c824eb8bf5eedfc96c1d0d5e0feb4c747c3b250fe33127dfd119b6792ddaac9a0c6689b90a441a8f2a0dcf1cda7a485583138e9049419d14950399ba4c551b1db224d2ab7937bdde9a3476f28c87f885df1f7e7cb6289e26d00ac8f2720e134cf4f18401c65ed1ea347e8043d4c6ba86fb04509383385c9ecf88519ee6a018e412f089a5f4622ed7a8699158bc987eb0233acd43bbd4d3cd8cc0a08dcde313f9b915866e22af1d8b0700746da07206604aae28f25fdb8d64d8713b6046c43de5199019eec527c8b5010383c4993bad7b11072c06f7bfac8341eaa94f80c1586bf41205ae3bb2c25ee1660d0089e39f547448e5d000b3b9232e7c1e76cc96972366ed3620befeda721ba40d11610f761a3efe62ad67414dfd8948bf4dec852bb6acbc74cf23a6449703a3203438d3e2121283f7ca468a5400aade6c2a124326781e2459b53ffde8955c48ce2ef26fa70486893755a6e8e5232f6a1510ec3f3a9fcaa87e3bd4eeb38b38623d096e04499d65f06da8138201cdfbc84648709c829c490fa239bc60f1da1fa5f02351e730bf2adcb87c4fd2e02d8b0e02dabea03a16f4ebdb9f53bb52ba9993940893b0fb35dcaca4e4f514308c6b82df95bf3b595c061156abe16ecd8b90f60861dc2dc36f057e0c087106b5e53ec6c33df2da4a9751db99128c39906f084cde9de9cb66ec749ee086d1f826de7c7f927032c9488bcd994bd7bd90922039b894cce0c8954a58ee9ca4ddf6a67b7ceef9890498a72bda3f6d6daa3320bc955a32556b007dc56b0c545b6948be02dc50dfec371740a5dc466165e2f8e0d7009bba6282b38b47385a4978a7fa510a29848231ef8384e0cc4cafff1abc8e688316867df4230a478a06709b9b8d30a2970107b9d63234fc3fa05415f96d4ca22ec7316b856db14d8cef7b08d1924af280a7b00ea5666714725bf4340352956600b0839ad1f4cc7b532f40cfbe3fbf973441a6b4d9f4add00b77fc44991922d418dde1124d32b11d476161696096d46f58ba74c0edc724dc04a919b27e78c9fbda2c70fbbd4f2682f15de54a36c0baa15e7b850d55569ac17911bdc5c36393d7571532d37cfcb616b9f10cd62e107e3066f8189af31f52680fd304a31ead477d39774b2b7dcddb7ce71144a2dc2ab97e458c8f52b5f0056cbe99a85aeec257c52220dd1f225d2b4eeb097d9701be1a2f4dc31fc83ea98ff6d79c70dcd34485dd8adeed2d216ac3d760075e1a4d4bedb081e90879866e4904a82ae959bee0a9a8544e62202c9d5d472b998277dcd1a23fa06f9369a01e217ece9e504c8b7a13f1af59cf760ddca07da1bf13e1468faf3b91084099020d8f1d1df4ca5922a37fd2dd56f726930438aa49fa0addc46d23921178691ff2267772fa588830cdd9f2d7a8fe066671b6544ef879ff610a54cd9c13adb1ad97b528534449a9837c6211a14b4cee1a37acde247de545d3a2a0bc3d2cd0cf6a95da7c54647adec4bdee63212e36c515a0b7cd97c2c2150af4b4b3d6e6cfa64e7facc2a08173cf5f51735febec6e51a4097559536707", "0051515352", 1, -1515639010, "4498aede46c9671d2e304c092477fe509744c747d6af47e119f143602fbc21a1"], + ["030000807082c403039c072a3337271f81fc8e6a2eafb6a84bf7d980699693371cf877dca4425f338801000000095353525351ac525151a2af307ed04fbe5a3f522517c4181dc4eab67cba2ad8abee4578fac9667e133cf5e40d1a0000000007636aac65536551d97364bedb39c77be742e78e185f23e38b2515932441aa330c91d716d9738b075e4a0d7c01000000026aac3af3780f0165869103000000000951ac655263656a6aac6701068bdbd297c402e46312000000000000000000000000001ef782a73f3416cd021ebd837ccb5d7c06ee2fed30d9e7305a2e9a48c1d4f3ed506cdac5538b11b19b2c29a8ff5736be5a094b869eeafd6560fc59dc61f0dea562c32d2f9402f26c4703a30910d68aa76e6e0c636b509a31522f64dbf70e763c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bc272d7a8dd6e0ff261d4c4a183f04a08b4ab28000c18f5d9cae3e42cdfec349e55e5fe122d0a7aace15ae121d2def17b836991fe66dcd99e42458b0903c87d2cf8811a6abc21b71bd96877cbdf4dc9f5045a4263846a958427957d921ad7b80c21f65ab3ed447575fd67c2bde2fd19704e77239eab5d1cf2ff82b25555602270314262936d863c23a16c33004599e06f99374eb3f3052c5cf6d8180a1728e6afe02195f8f51910a37469feb7fa5bbf81a84bfdcf74f301ba2b2b93c3568e6f3b13b0a08e598c38af5f6c9cc0d338f5e318d57c21f11727c18be16acf42e918325600abf49ef18ad93106e8272fb7d5c1c5cd8818378098a2b519d8db3255d4d64b857020896447a62904133e59c37d39abe0f958f0beaf9b19d5956d525c564c984fa3c0219fe13d201cf6d873b462903f7e63232e96ff1f92031d3a0260b4b6d62f9a682020bf678f8a39951527f4e50daab13e00c6b61e4239a1240d24162bfd1bcd8b06c0316d66c75ff95ddaab7ab5a4fbbc783f62e2dd3ce705b06c4e8e604d1eaece450031398d9652b125f13de6ae6b55bf4594039c720e2e301550110beac837c1815cd46e4d1457df4d43488811b3fc19632cd0380c7dd1ac40ea2a554027dd189968596b9c32a937c04b28ede18ace27ba3e2efdb2b8fb3f43fb3b4f356080f131b38e27063dcba61cd9e69717ad62240720dd46fa9c4d4ae65fe26696ab1bcb599e621903055470d2844bc6c9d5457cba6cbceac181cadeeb2131f8fe19d0539f55dcf1eed1c3a4b783d5d86264eb2b28da8c7db823abdf0a77dd15944fb2e17bd3fd684423e33a1fe472ddd85d62683c35c24cb1cd6a3f139a57df1c2193eba31d8ffca62c004058ab29797e524d85b8fc23c00dd42be1a55612ea89bb6b6fd98586a06f57c5676efdde2e1d5673599a6018493240983a8506cac0a4beafa18fb41bf8e8cd4887c51505cc4d9b76fb536b045a51b8ec6bf606e5058d5270eb34ce13a3f038a828a90872aea3d5ceeb9d2dc9fb4d6b665975a54114050fc40dd03a7643175726076c9be4af8113a8cdbb08743d528b15579c82b770615bd9eaeac46c6b9a957f5e5d8e65ba63c88ca1d0e852da6dfdbd69d06d5d1def076118019bff7674a6315acc3e121ab0d4f0df82e382ab0a8e5c7817e60c65823fe724ef08336951ee5ca6c8d906008bd90e250b0e685d975cc4aeb054a4be0fe9fe9e80cb3d0db3c483fa0d3fa3b17f1e8fe441d0fbe029fc6ecb6197e61eaa934351744c3276dac601e2c678fb057e770b09f8583d93924cc35c8f945dacda76dcb272763afbf073875f8b13c4590252165eb7f04d903e5e263a7b58110e7312bdf19679a1774c53a6e3f2523353a624f1bec945345aa741efc6dfbe7aaccc2e410cbc255577c0eda067b94f6135e1254905dcf5b7863725776f8b6b539151162412f20d60b8b04e5ffa7321bd80a5059516445e347b36f20265007e909ab310a4624707b2c329c74ab2b8fc8dd1f35fb133895e4a3c660e667609e938d6d46a7f4d29c195ad39950dc8a39b4d4118ec9113a92997eaf6fb07ce8435313a124b4707fe909a7f52b61e1d0ea29e04ef4962baeea98d978587e2ab20815730e5fd59d1bf47dc941b82733f029fdf2ca42cb629409e988ac75f8dde4f846da111f8c279a3a0878029127f5c4fae6db14dcfe00078446b5caaa21e7025f313d6516b3f9810ddf02e3ff57a21b7b21f57ac0d25292090fd418963f7580e54eeb798e9c0b69ff2f98a2b6bbcf480d6221097215203e39c717bdb2cf3cb06b5f2212bb48d5e5ef4bc76398fe1b30e46ba4cb256dcde1093146c075e9d982c495fdd9fb465c8acb84d1c7a67ca5774fc715d5132105774a70c1645d73a9c8aa1269f3ad65b20bed74defe093d2c2b3afc1033c2ddc456eb0dcd4870ec3bbb3728953d3b4bd4e41f3392bb40225cf217ce31ce8124d6d2c10157aadc57b8a8fe62b80fa0a176a07eeb726c399abef959459f6ec7a4db70b85cb5d21bf503264edf2b38411a780c80885baae6d14e0c3f8736abd686091423b878d3f0ec00679792fddf2a7c0f3f0750f8b19e5210ab1bdc3ae099161d1eab89f5a3b6b8499b9e88c9bf8bc687a616c6f13b1ab320ff126cea9c92d02eda03ba6591ca24c034e2b9565ee0ac9c335a132bffdbb2a28baad7e0bc84f0d3dc9c271645f69039820747416372ee9b80d3d7eb716ce777d41e5c0edf567aa2e2a438c9c0a93e49a3d36cce1dab159f047a0de34860651073f66936e2d4d6a09de79209d500000000000000006c47f4020000000071170401d5a33382ee461606a5db19e34b7a5d08906c2988d5f134eb46c8a409a632c93ea0b4f7414773d2f66897e78e6930cf02853c5646afabb9cad77aa39ad11d6ca04c2a39a0bd6b3f23553367860c8d39edb5f3b9c2c0e2810ceeaf06d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b6d267945df26ae75bc65da4745d41fd60e3ffd407f084bcac55ee872b9059b857a4c3c6965c164fdca17b80355bbf1f85a8cd36050bb5cfc7f733057ee40fa780ee2bd32ec6644cabd479fea053d7f1ab1da0b7e84f259a5ada7f0b934fac9b4ad017d62b81a262993289a59760e47f1b55617d39afdcc4e8740793689504b5030a6484de488a0fbe2972d54779427ed3ae34aff322e5428b7e32fa56a3116bd302271105ef82200880da7d800776d09f6dd5191c2eb0339a76264096430e51f8260b07ce51b817f21367dafb97cafaec571764e974668a7ae61f04e554b424ac06155c01fef5af8eedebe7862e66f0f1f2b2070ef53ad79bf997fc7613777791668a030db3c351a3f4a5a34fdb25a93fd8b076ffaa01874861a459e60eba9933bf4b130309016af0da281d8d22bd18585a0815b475be5b52a8745b959158ec2c2e178c80032df28fc70de0064d18a4b1c3fdfc1e87afbb0c5c85ff9465f2353fbc3882a4bc0220677a58e88c384c6caa4c658ee274dcc1d49b74abc9669767130a4b4cd53bd9031e6e033612fe26c22eb982c7fd7aeb3a751b3e47990cea4cd1fbfa024ec705ab04cb3c1db5c5941c64ac925ba5bf1f2ab01ac8a149a06c4d1c7c039abb5e44ac36ad4209f63fc5f3d053a53db18f9ca27b4e03557a8783145a54429915447374eae68b57f16750e6e560e035693122127aaa9140fea5562bc817314d4c068b8c962859301543cbcd1dba69ddae3ff77ed1d35d6d127f53105fb9c38855bad1b81d14000dce48d6ca7c9fc84b2d12efb683934204d67e86ce58958f490ba9a717a92f6dc53d8183473db5e3afb369801f99dc127e01065f14177169e39345deb916a9d70fa87a1059c00ad47eec73d572430d09dc53c805dc4c657642aeddea25e87ff7fd55d54844ec05ac8febf5607a449cb3991b3c7a1553203353fc9d22a768a5ef97c09fb192220203c5115c79b159ac1d54b533b213f4cc33d9a34e6fa9afaaa98e5f1bc724b470effa755b9883229988ee1e830e928622235f16d876aaac29f3b350d114f43832d28f071b22e209c6a6ec24565bda53b3b3c8a1ffffc38abac41e309517e35aa52b435bbe851f7d06453b53024c6ca561a6077037601a0a6b1cb22017e5dbface1f57c3aa718f49771f8513c67a6fdb35a1d298fb0ae6eac679ff330cbe2825ffc5d421e448b7b27e8263e282353b87f7848fe550485a781a957ae2c4931d1ff22b1911b9fcda2a151c459a88b323b6821aa08c841f3c6d5b26c1a4aa588fd25d50c21c51e8b40dfcbe9350e97b1e2ca1b59df4f97f3a9d7840e8335754e01098fb411ac1c67db175e4f63b51fbe97b1fa087ef00fa76956abaf868b4a501d37c913735b01368006d1c93f27800d7b1cc067a97bc94fba9f3282fb7c70cc136a983bb31ab5a69fc75f180189ad2fee668f8a4d0cc05d2bcc1c50606ead565aa99f440727055c19188bc71ad42ece341bb0b428fd4b6ac46ebcbfa2c5e415f6a2e3d322b9927b71d29ed52b7b6b02e61878be5770f72630db259b92fa40c7f8739e8ca771e954a0ad236494cca1204f4116816d3d020087d23dd6e3bacf5340ced075f0a03d46df0be56d40cd41ecab2ec798c57b5a76119e6655ae2da3e916dec3d419cabb06af5f3c4e3efaaeb1308e4a24d42653887696748fd289848950d62614704a20c644f9d174899014e24754d4a158f5f0d6621e1e19ed607aaa8789a89cb9c7c1161f0642e4a56e23ce381c512153991d98b8a00a4b8717b11fa6c8f714f0199433d68b0027cc83521580dc0db92cedd5d9e2714db656cefc88848dbd6ee6fbd9c9ae9e387c462699a1db10dc51032d4c0854ae4bd6d68ac3c8b3467acb53a2d5ec974232045f50df2857ed908c25ba35058367ab3dff517df8d4150874bb6fe9b7371d5a3bf53639b2149026eacfa016ceef0620fb0249ac3a2280b8985d81432b9aa3b63d75ca825e06dbfe8126a59a1acd7bc2448a587dbe7b5da2a72db6867e43976ed179139ee74b34d63428446c1b76ea229e0708af7271842d758e6bcf0d527849ac6eeb0fe12a0f24ffb29210e5efa81e2cb53ebfc6e6d6439b33b735665301197211311e474d15511c8634ea8b8e053479bb174d0b8875697eade1a7cc44be45608fe89deb0fed71505c6a48a299df84144486ca24cb5f549a035950e60f851f1e804c1caf9a415dca1bee9e0a6fcaede8f8e3e390cd97d6ad81ef1c2eaed7bda25aa9aae97299e9a18d39118896f6680f839035823307bd62165b4dfbd25ac1aa8a61ac69a206dbec2b10deff8c911010ff5e7b66a2827cd16848b854ff56f7b130a0a47b3c411af68ce4ce9d61a6a55db21c423b5cf13b0ef9f8626c2b2af85a11f3fe277c579ebf43c2d14967490b1f2104a111777c3b603d5f5cca82703", "ac526a636a5365", 0, -2120326453, "0e1edd52319bd616d4588477aa407a159505178e6b68872065fd490d2d8398a9"], + ["b9333c2b04506728f74c38f7d98c605433ceba61cbeced113545cefc788d243e4eaf2409d702000000015374ebd0553d4a1cc004555cd3190d185f74473d4fb27114d5d567112e3508c6f2119d222401000000001a54e25bbbc3d2d63275ed0c5869f494b77fa852e187675350bbd307d6eda7631cab623201000000020051ffffffffe187d220904ed3c9f141f0a3c9c95c58040ed20edbf77c40b2909dc6ea76e79e0200000005006565ac008fab87fe023c090f000000000005ac00005363445afd01000000000100000000000100000000000000001d7058030000000073460978266e65731761146f0924f3dd6f8f9692d190b972eb345c6c891c85f2c9e3d32310f030f300d11039c7aef440db2aeef9e1251275bd5f5666d43e20dd0c8d56d2496b89b5b6ff4c4cc19d58dc9ab1836f04fb086c51535717d2d026e40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052e82645b34e236045c371d66e296aea387fb7ea4119ea4cf12ba428424388762761c48fba0b28ce2fdd6c7d61e3a06945425320fea24b2c516b7c84e6bb52ad7b87a04da1c0aee5c05c730594561c02f7f26308ca7b6431b52d51d151aaebd8fb23268bf4e084c15d483a642950be15dafd7e7a62d11ad8e6f91b795444c3900326961634cc039a0c6bddb454c4b3b08e9a71532d4bdc7b7470272358b2896b150210c068eeca4cdc2b2737ae6cef4e916955382622278ee408ea57471cff5ef8ed0b076193276f3d7f5e72c5576db389eccdca453a143242119ea9730296a49351c06b46f44a727166ab8126be08c81dae0f3b7b11e744bf39b95727667d0244ebb7031166493427bb85bfc995b6c20261e9b27c4ceffd9161ab2b0d7cf7a10cf97163030316aefb3d7c24c7d33830ba78e8dd4e550d33542d0c013eac749ab780cd6eeb03063679f3a9c819feab94d5d96d4293f635f743b546ffa4d11039149f2c1149a60206c853e9c14ebc6a6ae6988ef5366120dca4ecacaba06bb33655d08f628c5c68032d91b0e6327806a7a46361d1edd247b48db2516273ac7e5aa8ff9ac5421cb9c1703610d68675e2330f1f012299b79030d6e972f36be895e7e62a5a011d53509048864a89f743d4cbb069eb5a84161b0fe0196fb0292863bfa964060bf9eaab4b7a51a4621d1a54119182aff3c8a6978dd3e774ef3b348af4079c3fb55a5873a2423354a134b588367daa1db235703ba639a9414aa7056fce9c645873f185402ff8dfd41de945dc927082db9937d8b61cdc7c27ca962f4cc02dbd0600140283132e6d913020ce375b6d829a76c6412ea86aa105c4bb5ba6ae853ba8dac6d2a9c97425f47db81b865d693b961e4b21c0c5de5749c46ed9ab2862133e5bff314f3a6fdbe2d82eff850ea340c1549718eed660447c05cf9f77f02e328bc04218b78164692a18bd96eff42b55a32514c5d73e350836a8c00be21c2427741e6145e5f68e62c0f8bcd23c7c9ec20f8297db0035177703d827443a206a6221b33f86b2275ede6230862c88246cb372610813cceff5735124c10a32fb85f6433701cc49065de9f170b03180780d35de6a8c016eee96753f5985bd98dab9b0c37258c1179bfd3e28b274ddeeede6cd7f3645129949b9e79bf6b69ba9ebdfd2e8da190afecbc2c69dea695f5b42e2b957a07f25875dcf321046739d7c4d1cf2425bd8e887186f334834a119174e481da7ec00b6255ea5d7977f2dcd6b89377e15b81b8cc0acbd2a3166f95cebebdc29b01fc148ff9d0b0a3fd48fb2b2bcd1ba069c2c0ad4c2b6ac766efbaaf4f41737287248307823c147ef41e11a47570540f6a60f477c495c24014605d9db13678b6e5e38b9b1b26edb8b249727b01949fa1dac0b945093114d8b5d8eb88cc92aacdb856caeadd2f3002684e347d88117be8b015fada4af6b9bb75e69f0572251b11de625b6f93a2350a341af07fc14a7c588be3178ad7a638c2ef016cbd6c06424d1ee2ac2e516ccc75e31b8b2435463cf0773685d949ec849a98bd1674ed8ae084cef6977739cd96c2acea9856473672bb404714589892ecdd1566f3bad17c74995c05e09871bc40d5ae12fe07906585c8fb4880cc8479609907f5bfb93a293b5c8bedf00e9f3db7f443ae2b56ff2809d895d77c6579bd4eaf6fd173e561ab2b520e690b5356fc7fd3708e65b63883ee07564238098f079026d485b101ba3051e5eb4626363f2f75c9b166cada8450b5bc556022dffb6a2202bbfcfd72c82fef6fdef84ca1597b843681973639dd772256a57ed728802d41e034a72fe7e50b14c2a062f54b43715a33cfd7908c40b9cda07a30081236d6b788d2199fa6bfc84f65c6f0060265b35f7fd43017717ffa3c7cc900fb66265e3aa55f0348a5c5eb76a27eb5060998f509d1c83a829435afaebb231e63995df52ed644b74cd3089abd04c1b671f61439f9b9a522e752e587e0fb923b2d51134c4d4a97145d57e3ecff309aaab2712d271f32b5ea99dfe6442904f592d1703040eedabfa0bc1799e67bfefb7b4e5d42970733fe408befc1dc8e557c66d40066376471f0c4934c3a0ede0a94dd0d9ccd0b1eddf1695c631c7b7f15b5b31ec11175b5172c356c33d82dd5bd95a9db4555f9551058a905ab2a40679a59daf80812662f3f42a6e3314cd52bd594c9a83986da95003e0955161bc3649d32a91f57c673280a94d84aa1c385eabc988961ee45299ebbe327ab86ca233b177669d6034e20739126865ccfbf34f7373d1177dd85a8669b402ccd942377adf818c80c858240c81523a967d66eb66c105f34ebb5ad7f40b7abf19a49c6f2fb57ed49bbe49c22a6e92b47db663b02213b7636fd38377a85559fdd443883ef0176857eea5d44871ab4bf455d53533ad0bc222cdea814ddc08", "6a526aac", 3, 1815363895, "858fbe83ac93dadf4a9f2ac2edce5342c154270e54c98340550d969f8a596018"], + ["6d19d44d0370372651f0cc4fc167177b8f5f6a22b460ebce1a37611f7c9065c6e04884f08a0100000004ac5352638f9b385f6897d8dfc63924fe35055176f8362209aac60d51f542d52e35e872012e19cdb102000000085300655265635151ffffffffd296a0fd4b2c5b5a43e2182785160333a24f9f774699ccfdbd220f91d2bed3cc0300000001acffffffff0247ebde03000000000553635251ac19b5b203000000000700535263526a630000000000", "6aacac0052", 1, -2002156524, "499cf005416714c3a67ae981568dcefa12381f925568099d435d793d5123271e"], + ["cbb06754041986622fe4fe28f2dc44970a2080f8afaa0987570dea019d136c5691648067890300000006636a65635253df61de427ce74c3b05b9e869ce0934b4f15aa698c5e7faca196f01c34190339067ac386803000000055300536a636e15849e9cfd2878d616c592e9febe1ee6255935d2447f0bf8bace7b4c2424d36653c03b0300000007ac635252656500a9bb5439f73cb391730526102923769b96f634596cc3c6d1af6e14119e7587f4c90b4dce02000000066a52525263009a1dd62802843f02050000000001651378d9000000000006ac0000ac525300000000034597490000000000000000000000000025651ff28353cf20c5675fa7f5ac71f3c03a5f0d4d3df5f61809d25bb5ee5bcd73df5db12dcf6620fd045daafa502ef81244a0dd48c61e4f557aa9d9e1397175780508dda87d22a6be343636e21ce8fa45d3fdbd9348b88dd01cd328a98804d200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff15d74058056d640e09235e597a2d208ef8d6cc4cbf3dd26351fd6d38e5836eef85f6da8f985c491ac6376f198832161b96d33d53ea2b3b598195f5e914725df045bd9cb6eb8ae2cd3f5ee322459be7cbfc903a56245e8b6cde30a9bcc165da2d9842241cc9f5efd77f44535c1be26e856c1e16c5c7326fa2482b40e75a2fd0020cba5751736f92cc22d4c376088d3e1dd8fafaf9dc3befabc70e38611a9972a6032aa600c53f9cf6f2b4ce18d67a224e673fb970309ef973fc128c96d98909d5d10b002995fcbad943d0d61b664730e10cc6aded3e779f7ea6de030219e3c7903c2b2c8d29a2ac85c4ec6fcb3f02ad38dba028a6e98cfab383215b4e412a9eb91d5503196a372bdd9ec26641e8e267e58031c3897eb41eb757b60ab36a1ed492d0027403088349a4b09fc5aae6bb038017ab8cbee01f00112e1bcf2e23002f7f29df28c60220e447f6fcca876a062668de8345e948e0f8550e5b788f0431413c933c9db4fa031bf97f9bd60259be0783735744c2b19d03fbd19014969d96052817db46d5d57e031514e13ef8acb3db3b9a816cf4f22033316bbd55dad8419b74a0dd206a3c92ee0691a70e8498a810fde2edb15dbebd2c694409891be70d1e69d14d890c73ec6b6e3838d26079556f2461c9f5a1d7be4cfee1691c35e4633d11af1bc247ca4f847f402bcd1201e8f561c00e45651e99c4996e9424c470bf79ddcf89f86215d727b4d7b2899b80ac3390f0de45cbe330eea0199358b31346a5ce1b2edc822821e419c7f1c27cdc8c7b60d6ef265214a576f840db1763a9a128e9681e70ea4d64195634da8a1b76ab66e6c26f840623e5dc12ba670c2335139f6282d305e37b4c4ed2cbda78f231eb604d448a16415fa9f4f9ba2b5087ce75ccb31f76a2f1b9ca1fc008a21a3ebdc13ce433fe16159f1521f19291b19a3cfec375972e15ee5e8e5ee8066c1375c97b18efc99e34abb5d751f4d261ef40437f37529fe868066c854294d3249edb768bc4488f09663d8df0bc8196b8571767df6f1ece2ba4838656b5287dc95bd76edde9d81759b7b6e29e90a8ee3ba7a232056190803f4824509727b0de22a2aa0c18d697d9ccd47940bcd22d481114b5571047b7a53cdfcb0a550a5f61de69685b3e06a2bac92c2765e78863da630c93a509531c3dbdc4a50921b00c3664f0f1778e0e2de12144de98defb9bce64e0b3487037d9e64ef2d2cfb835abfef7c744aa20816eb57ef0f2d2a684d245fcc44afe00984f4b944a3662c163e297068de51204905e2b287be6acc6b74d5fafc06097c70433353ce8d2d5ce38390a36586b2ef43d7934703258e3f56de032be3c2b48bdb5642842bbdb0b7d0b76a871c9d6bba64b6a0a7aa4688e092f2467dd6daf8e59d79ad8072f82786880d39831d86793ce9ea544c35b582f524fa1957e712df7dab7c067998e54c37366d19f212cd0c95597776f6ac632fa55d8859ad762176f07c841cae25c8441365a1abddf59c2f203a4ee7ce4e528e85843c5f6f42d02dfc82c6a8574d56843c9d65b304c1652756af84822278cf8a3d955968233440ff3540229de027797ea851064bf555b665e5cddfedc3cb6c689ae12d0283e1e980f7fc8f28224f598d455d25ce99d9c78bdd64c66b014eddf0099eef3f741b453d0324b64240a32650edfc0cc2dbf57e42fde1206280fbefa0192fae3d5eb6a28f09ed390534cc44afca1da18650b0a547e50fea9bd57c2de85fe98b7feac895d1b89eb4c8e7c54f049ddf02910fb238b2f5897d6d81db3d8aebe80860639f8b76ac644d439db913c5f25a78a0f889f76058c009fb88e192f678591256018b84fa58c1b92d965080e7b437e09e35be775314e4de30de56c318c2a99cb659238e6d7072a8c480006faed64cc0d82bf57c598a5c608ebe1cc20407df44dbc0bcc4ce8cfac0cb1b6b1cbc88514eaa352ab5dbdbd2198c5841d7813929d79697ae7f04e0f7c0a22c8c1fcba1456469251a02e338ae662491903f7765376f41de86e25095eba95fdb58e6ff21d949ecd3478c9beb754216a5e3adb260228e44cf1c195df9d2bbae0186f0e4adde1b6aac5c02cbf66f81b3c38e5ee56033ba7088d61af1d4c0a75b6577ef02e65daa08ef8d151283d65691db5cf165144d6b31f1ae7a7df402ec6baa2044fed95ba1caec962f5ccd71d34a6297800878c227eb8a5cd33dc34e724c099439d144f100565f91ddf13ad05aee82e4fdf54fc57f98ad8d42cf9dc243492c33bd50a81af11530237cd59113b151219b2a0d300d2729b775412040000000000000000000000005daa8b6789aa2639d98e0df4ecf460a918a28d867169508f6fbe691c5af9ef3570ade8e3af10a43a9442108b06867306e6f094b830a3243359d0c1690e486476bf7185e49d53162f8eab3f4b8c3637a275ae400bb78c17fab3fb499b4f3effbd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000716b5f044f7ed5b2c996028252bf3d80222415fa1185c4c133bf3b8c64ce85c0a87e893304aabb872e73d0026df216c1c818fa3c7b84023c36257663001efff721e03a1bbd5ac0c1e7bdf241fc017d8c96f0d1178546b6ee5cf4005d0e652f144d48829f90fcd7f14a14bb046c97400911073e69ebfc20d9262fdb763c38d916022f0cac366c8e5307ab933634038be0d189c27432c23f877b4af3b88e7332e9ef02218da60ea3f252192e260a96585ad669611f39a77cbaf69fdff966d7edd5e86c0b022fb65828161fb1e37d93b92059f46783f877e93b6cea65caa905374472a13ea23c84bfe29f781473a05e273acce18144f37ba1bd32d90a19e42e3e041cac3402080b229094358e2623bd1a64f7f060c9e6e36dcc0a7bed0896717a39528b06ca03202cb57a4cc4eabdda9e65bcd73498604bc7022224e18478ec8e138561ad092a0226b072a6370fca4b73bf83c20503270fedfa72a8af863ae24dc4bae0a4f110f3021bb2ef9240953e8324c63ad8cb358107466d03913425d2f772735acf75e55341030369bf7e1ec205a4289f286a7a5b86f6c16ebbcf80ffeab13e566014fac93690e870b18b3c9f28ea2e598a3ef5c08c85340ba1d526734dcf533f60a212ee7ec4664169352ad5beeb10fb5f40872702bfab6c8f3c190b7488e3912ed4ae639525ad4e31d58d9a86251ba90427113d00de7a2d2d4e3e609656cab5ccf0bd410ff875ab39d239aac029b8640e88f1ac78c51ffee047e54ca8f0848622640584e3009ae00894a6b02509f4dc1ab295bac7a41fb7e0cad113cf84f917b2fc0b8d41a72acd8de4992e34213b6c67da52709d31e62a2fe9fed17aa4e8209fb7785db355e849a75d4c882acaa16d722f7d25f751517bbe66149cb4378607ae1bc94113517eb407511344cc8c2cbbae5ec4011a0ead64c03d28fceddbd26663bde3f74e1602543cb81cbd4ae93d855ce84a1225d3b181390da2514e09ec14727cafaf5dd64de348fd6e6d5ec9a9fcecae1a2754099b3ae21cbb580356476ceec65d837d07b467ffbb69069a716f0e61fc45c4c82ab538cf4697789febea78ba04290f996f094b0d8aca4f9d2694b6db10753dcb637d5cd63f1e7d79a0a6b860863ab985e0542be38f0771845f91b2572c0daa15cb81f1f0aca9df2d5d0f3472f73819c676d1776d69ea331e36bc4f1d3e798f8a2d1ce02089000540294f8e9ab69a37f6468a494a5b2c85f20c9a0c3caadc87eea1593936d00d53a82f2e7cc8c250a8e04421ec43fc364b181e4faae7d1718be38f07598033eba281d730e7d496ff59c3beab5213cefc494330e6955eb231a4b9a111343bbdbd22a289ac48bb204f50249f5d203df73d1d2c9999126d6893eaca504ac8c38f64d7be50c88d34925d37137400ba3800ba497a72ddb362d4adb7f9784aa07d7bc4557898af9b5b6e5189099ca790b32a9ac3b87689b0b15be76c1115a8a95aeb073850fc2c2d1614c3b3e31403aa2b65a2acc1f0b67e959e1dee7594b13ac2d630dd880e02f3d09ab5fb55b82f8d657af659ca2a794e5151b8d14ad5781da1e59cadaf8b4f922b425f67c82b143dd15bee72ebbd73204ab14b5f26b4b858ff70c9b88f2e2771b919fb7777020f7debc95c6ade59f863f8dc039227bd6e8a17e6d86d81d8cfe2ac76c2114c59879cab50e31588a60a110a5aaf294759f75b33a6c666241cbe9a4dffa8067f540604d4b8d19121b3767745d718ffe40907fc0e678c822a710b578b6a5ccf2eccd6aa9f388b82770d9259112faa1889797df3d2be8c725dbdabeae38d0a91d2c61ad93c2825306257ac759c8860e368ace4c8e737e3ffd549fada505a88b48aff82d74d28fdb86b461794c76d6844814afb419c0b932dff7e8338c6f95f872611bdce5762f4552b7fd7e17f91c58482b48bf13190c18279bbcef1295ada305009df41d75c71a829e564b6be29459012eff84dbf64d9d38844293207025311d08cfc613103ce679c0152e85133a7fc2c8fb59c1cbb77fae6f65854e51b9d95c3bf91934c8e36207fb4801f4e8821192735bb5f2f67e0c4d028532bbb741e3c3104c22eaaba4b0ebce4a9fb7042328d87ad96624c24e4fbb6589b5fa71787bd8bf43eceac2247f3128a6c83ee8ca0d84d377d32695c468af98c7717d0968a4aba7f534fffbdfb2abc483b56c47a46e70d37bc60db47339284788abd9b15e109d5842470fd6e44c2d6e679e4cc967918706cb912a45c34e6c527e3b6ed1da7f56ed5b57250f29cb33b6e1e9fa30d40ddecc6c6860000000000000000a0ee6e030000000084a13a6c0553a4573ad0a8399a0348d103b66b65967dcacb32e76d45e12aca5bd1151f1d8e7e4f28c832792c89c99d3b64b1aba9c0a4e79d730a8e7b888e76f037e94274584ca749d653ccdaf93887d2f801d16654bb36203776533cb5d9e75f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001deaed7d0d3fe963caccc4b340c1972d06d624c53c28d3a0e9961ed1adff41dee657061bb80862676b62892586366058240698dd6823c374894eb174afd96f5c3ee67aa5e2ad290715b95af2f8ed447a972a5e501e04cb58171b6085fb152ef9b38c4d2cc035ae391388ce548dfe790b7af98850741b5b19e021d73227a769e9020e4d130a271f3028c9ae1da4f9726c24a4e22752c0586b4412bb3f86ed62d01d031e99b1cb3260e84ebaa3d4a184bc9bf86ea2cf184ff0b9881bbff7c04ee04d200a02af124a4c5a3cd8fdd7fc978b6e32a7230e9b59f8e92b4b7655a8e20c83c18145ae8ba0b1732fdacedf777a5bde892f0e7ca2a5b45d9e5edb324cff3023588e022da57abb401c0b28ef6f6da98b73b7584107b361ba22d6bc0f0642c79023dc96020a7eb7eb8f11ae3fd335a86cdb07d35839b97f687996f8b1c63dc1f6b4b06b52022e28bf4f712fca961b56ac5fafc2965483a247c0a042c907cc18dab8784deb2e031492ec643c86abfd3355efd1a0fac6622c0b4238650ae13d0ffe1d5f77b7e1360209df94b5469b085d856c9f7374961488e367c5146c0474e773531fcc3f13aa99f84e29112f1c731c0fef5aaedb3eb328ba952d6eed2317f4684b4e7a063cdcb76ffb434999a28b53139028ce7d464a08f72c54e7a0db0c7f8917d80ba3637588cdc907559e83bddcc3c4c2f58d04f285707d492acdfd0a5f01d5ac803db9e2e01d4b49c079acc7df0f714c7f31cddfe7a46134482fa274215c7580d6b3740af0a0365c3a25a2e2e9cc381a1f1057a977e128064f0b7d7f66d620a9b11ef810677d4c8608bae0d4e9ae72822eb71bfd351ff0a2ee9b079ab30a1801c4b8f5b47ce10be50c335ecce4c5990551b24027ee1a8e87f215440e6f3f590bdc2d354c252232770f0649e89d1bed62451bb27c056bb72990ac680a38f80ee037e0239c613438acd0a5088b33e0241ffdd01c65b0bc257d28e21e3dff0dae4a33397524461f571da9dee8df436e5b8bde98fe6c5ba62e9f67d4076fcc376f56825e305c44932cd2eb448945df3972cdcfb3ec25dfe2fff1d1d13251d16da3994a0f029cc3a7d93244a4b0099dff006d19fa28e54f101db362e6be80ef224628a6960649b42e8d6d1e21a5cf18bc0c98597cbc3603e8c14ab62b7c53e72cd43064040d5c5632d9e5d15f1c90d28938e01375484d65e9a589ddffc71f2fd944047a8f533243bddaf83d00a7a947a6a9de18c67f61c716f26a42aa0d0eeffe335512b12d25fb080f0e8f7f3439fe6f859ad35f9e4800a2d609a3f551d208e8d92801dafddd594788729012211c6a6b933d93ccb71d24b98fc8375e211ced4f15bd1984c74c3ade9f2132e1763a54bcd192110617438564e44b7b4a1a4edabf2c70923d362958cef4f7cf18b138f9c2c5ab0adbd579e2e4302960c2fdcee7df7b2ba6579945613b30008fc622ff0373fb84a87b630234f95878dfdb48c07b2354a18a01e1be26d6344b34ece4742552002c42f606a1fc42ad6f3db77f7f27292f0a6045518dde45e1a539194c8951e15eee0e4108a4ada138f1d7cf18f93db57cc643544489b917846a3bc37e8de2ab53a93f9813b011813cafd7eabed78873b45ace9bad5ba77d19bdc05abd3893a3560c9d3ca9bf9e490c255863b9e63bfdb37c475b5c913b03865ead447e822e9e87da3cd4938f0b0366460e4f7eacd274f7cf8ffaacfc5250eb973393976ae205d5b77da919c1b2334ea47eb945f8e28f958f3453cb9fb541253f28de2c307be8d221e24d992f34ecef3a1435bf4862a09658fd787435c46a46a9fded5155ce30a268381ab3d10e79f2c1965fd02b38a3ddef5fdfa979460a2351cf0791b1038d0a74f7e6af4aba7240fccc0d0682e0ec3bd1fc466b3c5719c6e968b43b24799d745b58257c9ba26cbf3cda247a0ca1599f29b3aa470b54a650f9b65da59abd241a4ea4e02c25149720975a0e9fb6601e8633579365df461e089e6b7dc44b316c41cb5f2b71d9ccc8412f606c51cb9008bd53c8a2a87a70920b3fbd81acbf74f10f75afaf4b6d02a345d8ff0835148e382a68041039fe343ac906ccf4b5088a0af8042c33958ba22f3bce0c71bf32b2720e32a3555119323bd928582d4e36987879253ae4d6133d6482bf3e0deafde0fd9381e4a60c669f44f4f665796bd20f3eefcae5dc4282fe12848765f068558f96824641f9506381b05246f3738df5dd018131e253bc033cd0415a493ba7494ad42ff7abd02ef61f781558893b12154abea9bb2d2f65d266dd357d007f09f15fa4f19e27f17b17b58b0a28c10c0ec424f37b568a0f064c5dc4359920a7a41c84ec6bafe0617bb7e4711ae2e7569158229b248ffb0efadb984c8ca53a339dfbe68b67525b2ba8c1fd56bec58794babca8b6220ffe91133741ce04", "", 3, -417884945, "269997c89c6f1ad339b329aecfba9dec74e3f98835d512230d63f22d39aa5a96"], + ["030000807082c403042f399ebe296c8b91dd7175f9cf01f529918c6ae63e13a93328b562af98605ac00100000000ffffffff11c4b927f7131cf8208fab2cb1a59ab882aaa7200887151fb33a6775cdcb6c4f0200000008ac006300516a6365419c4615c439adc9f47004ce43f129595360adf842b254f79f5160c3da6a8e4688f604ac03000000025251ffffffff00f4043105065c25f24d5cbe112c2af865bc674c839c03f9fe39d6d79ff7e05603000000060000535300aca6ba268001459dc5000000000005ac655300007276257000000000010000000000000000a139d90000000000e59f7bbaefbd78c385d8716ecd182e6f2c63ce01ed57191d625c378c607eb152cc5df0b1893fba67a4d180eec53d7939d2a607e1c61b2fa92ac14fcb2eab4344c721cb544d30086c13ab1066a592de1e63527b1b86372a5d2c70621d165a673e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008106dbde43e6e90019a08e28f1ae4d5f3f7a59800cf35421cdb0037c6c0e9c97141ce5597dcd793f646815e9a770c8ba8a87ebbe7dd7605fded29220c1ebb500722813123a9a65481b2b2d448ed54cd33b5f1502e729fb62911705c86882a8e5f2bf576f59d6e04f4f1961166014b24b931a416cd00460dc47cc0ea2815a3343032faee9c2fe2393eb8a201c68a55412bb1e0b4ea8ae21fef0115d481b12a6fec5030724f4ab8b5a94dce679e9d4668ac41e11858c8b2ea4be9263e950275c54d7ad0b04d60952a8c8ba891dc6a7be5156e292c41b33d98974369afe4f0d2807868ff34b5299320f2519876e85697c8486d5da46f860f50c125866b00e58229c48f82103186008b4d398f324eb9fa77e59ab0cf7c570225178f4b757d72d375187e9f8ae031c0248368ef5c74eacfd1cbc747c92b1b7dde6a28bedb6b3b5ed3b4c59ac9318030e38ec1d12c362fb69cf80a5b7f2f8dfb8599cada4a4126e6ddabd6ac32f598b020a1da90b0fb6f229d9a7953796124de52f6e3a35b8dbcb26f58a09a5f41765640312d5bae3fff627d374fe1ac983667f396db97fb236371caf7362c09483e7fdfb46c6cc91c44c6e97b710c550a0f11e96ce247d0a881328d95c3e89785320a1574f234e8109db8cc4f3c49081e7e4bfa836a98e0850f7ed5955778b10dfc827adefe644ea291379352f531c24b86d075c89834111618ac47327fb4707527833d7289421ace4daf4cef44d3f6eb5b319138a16be7121a4e87dfb0fa1612f3e99fed3e9567462b173f55b1c5e52a46e39499fcc2ffcea4f7c7153c660c4cf255c0ad0d11b3b6cb923cf4f190e5bb3784be677511fa41ad198f85632659fe60ccce6c0756bcd70f6d0246fda5b408abdcb1c177eb502b00aaa5b8588cb616a21d774d1fc1526f938106e5b5cc143a812a7acb41e733afa6b32af87ac736caafe1a71a41e081581322d1c2bfb59f676f5887158e2cc7cf066ba98f07e4eb7144ec79c949895399c7be45afeaa6ce1e0272912bc9a21338b89110db0605bfa21c1ae48a04b7319954865b198489711af1467b3451d5679ce8919c1ee43e73b8be126733b83f86cb0611e7ab47f74c0b55d6efca0460b879e890fb1d2ecbbd8c5cd6a3724bc25d30d89e0d576f2feb3b8a9fabcb1ed8d8d216aedaa9c0f16dd299c1258af52a959806b3b20591769be5958b0921d4f12ed00802064039c7cbf513f1a0475e8375bc3c3af7c0cf6c2e70ebc147ae38557d051c08f1023069be962e9d4840aaac6fb77cf11d2b146666de928c7fe3b086eb038b64c3ad661cb3f5b93d752440f7da2a2f4b5fa91fb291789658af854b0e178511bb11468fedbe98a60152cabdb2dccc26b71652ac573a46a8b0aa674bb24d3a71dbb1110f54208e838d0c15ce2550ac6c78728dc0ffe5072085ce6bc2a52af56b3785f182f476a4ae48659a9081c3a5a558c4467c4c21d893c8ea684e8990d7f79fbb9f0d51909c29b0b3bb8c94380c28b7352daf2f8b3314879aae1afcb0e0890691e8bb861c318afc2dd358f2fc03274910878c64a530e58e9ecb5fe14190848f5556e1bb1ba654c92e5db6f78617665991eb8e19344b30f4357d0e3fbaae3177659e4cd6e96980d53e2fe293c904f8066387e5c03e444dabd7fca0972d08a14b21011a00278f1e4f23fd4c9aa8284b3764c6a53134f19f440cfe20d5dd9690b79c5d710f773da5e5d56981934e2c8962474a83e1ff2acd53f942d24333943cdb75c80fded87d5eafb40cbb071bea5814886fffb4d03502c0850dc6220c7984f6760ecf06b45ae1540a6a1b916b4712b7d241819ede0f4ba12afbbf62620477ddb557b84b047cc939a60a415c7365b543295d81f483ca94017eddc3a9e2b571b655064f72a3162c3f0db9f2b1a2c10b2427425d3d3c2db3bdd705ac53afc17687df5c2275b26dcdc573341c326ef488b5f968764432435f613d0ca6cb5c57b75bf6ca086fb803c9e331e14489f1cc592e80aa799536ca4d497283e1dfb270c2dfe896586ce359faef2f179fe10c57a8505ad6491804da061b2de9756efe35818b7b7b2d2e2c985ccce6747fb3d7ee502dbe37bf8b5cc3ce3e1f90d3c857e264de9e148b3a663e633f4e4ea20d3c32596918f37e2fdccbfc4e1a7097b327e21c7e91469dcf16c6781c5a34ba63b9015108c4a34dae6a3bfdc11930537866ca36239f506f7ecdbc8a309e77c5f318b5151f5ba618f2ea7e01f12f38ff043048ab60f099215a9b484a075d42d71a4828a877706973758eac5716b79e62dcab97971b2160f62a20f01f672c475e274554e7bc35722efeaa43993a336f768e46bcc4dad2e5e900584e3da96e300de0600a86f8aa4ef7b53f59ae4e28be10c501bfefb0d1cf7cb0234aff18f02cbf2b3c9837d1ae4e1672b640ce9e10cbc0b", "526a", 1, 1452916809, "2c8516815547fe6e0c470bc6931947b97e9d1693f3f0423611a775db169a46dc"], + ["030000807082c403025ac2d11fb0ac10cc60633c9c6cfb1dbb6cb8f5e674f32603258dcc5af5219fe70200000002ac63ffffffffdfa3f525487586d3e347659d29040c78109e4aa982cd210db60aba2f9a04830b01000000096363acac6a5265526a6a1e4e5702fda2b200000000000563006365004195d7020000000006525265ac520018f43e220000000003b2684a050000000000000000000000002ca1dc07d964b1fce9ca2b75c683dbb415d0b7ad486abd34ac7dec4208e69406e9e450c34e7159f54e8965e0978034cea4985669f5448eed83ab0e661bbebc488266626204c863387e886c1868eef26596de9dc66df3b9d32d2b53a638bb1e1800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e9a5281abe56e3dad7201b9bacdcd13d572daa3de83e8ab7f0f9b7bdf8a56277868714ca6b4dde2e67951107a5e0f679b585a08c13a4e395a4bace5cba6384a309a9502dc85048ac6859abdcaf460c299acbe885ceb37b7e6c7854db63bc57478005944410b2ee5bfa8bd0a653a4fe0d55a560479af23adeaf1e0a1972d648ac03071d610ad9d61973413f4242cc0a853b02c0516673b60ee1a9d306bd392a412f0225e5b0b1a41704df4c43c63eba5fbb6a82cd4622b9c865abf5721d474abd39ee0b060f11c2b45e06256994c55e1b15842bd16172eb49c511eeb27b44bcfd1e678cfc008fdd9a54c4b2942d03732021046963d26fd01b51c71aa5cea4e69ab61a0f03108fb336c47007fc299ce972686edc689861479752e2d2b0be980d651748ee4302231d16bf4414f059d044341d1cf2c105f08613b220a201140e741afd35d0d8c503208a6dd2216ea66f62bdf188b588f4bb9b4e45c2d40b065ca362b9fb77ebf784022811472aba78aef61494137faaf7c68e3e31b15d20bb07ecceac478cf85c3c7803044cea972a66e0c44e3fbc7ea2e83ac35021bd458d8a570a1899af39a4521197f649aa3758cb7cbee9a41872426d67edb7f3ca9aba0e75178fb0ce835a999e090bb39308ccb72e3fd31b6d4667c209ba9fa428ce5c87c26042ecb558e8cc1bcc6097a1859f59adb65e27beb4d71cc115b5de51b161007c532de1ee5deb64f6c827b51bed18a5073668670b2cb4e02537db83b518f21ec09286d5868f929b3712738f83b0f5b6a3390513820764b25aef66ecf73fcc303f2d3b80d2d24997f649149c6942d0b5334a703f1ff968126c4c5f03978813248cc269eb6a2a3f10cc2cdb32649e4fc98530a4b34b522e6ffd9603437c81985230e4917a48aff66f06644efa30ed3f13e505a11f3deb46f28a0c0520b1ce0ae2599bbbfdb444eb78a19bcd9629f5808cf9da17545b8ec2ab2ea761d91133ea7fcee92bd6dca787ba8085e3e1c81233943fa3a196dd67600c34d08d0a2b41fc77f4d648359698943a0983d4f222cbc80d7f370849a506931a0c18b5f7be9cd02e93e0a489bc40f8f2af308783793be6d7cb37dd5e33341ed95267b58d8a496fe4870045e67bae451c0d20891e54b7e0c64e25859dd8de4f21bab0a27c79e06a7dd533ebeb326cdf8bd0d803249dd156352d8df39c0ad8ae9a8ee9f798e1e0078c5ea36d8284579b13b83c46959efbb7e9e055efd089e6a7d881eeb26b1de8803d41a282bfffd14b0be2231829ebdc992a0c3a8aa6fb29c599629ca62c543f10cc72584fbcda582ebec8e079b2903429e448dd62d9888a54da5b92b6d43d31ae8e3390f60ac51d63fd8472b3ae4f4f1946f1ac2a804bb0effee7844222922e57b2507ec30f5fb3c97e74c5bb020be5ed35215bf790e205a4fbd30d2d679b86efdf680403c0cc005534d7e533569d947634c80eeb4a637fe7da432af281168688a525c3ef503edcf24765db69a3bbb1159492ea37e896fff7cc84985b3439dce22a10241f4797d0327c01f0f4688e9ada994f64cb92c20f342e9cf839c7bcc51993cdf4b4495f3fcdf54a24ca243e279b1b52c8cb7430f2026f5af902b09f13b7e04a1889707e34f558be78098ab7f1ce28b133e082de35d587dd899c83f46f974e57ac059386073adaec654745795c5465916797ea8d9ceb1d452c1de5e422541f4bcbd46ce324cbed2ffc7c303c96873b64f2038b7f8a5c0cb954b23768531c71bc612633425981e303ccb08a9ba4ab53bbd5e5e13be557b995d0c7bf86defd2af88bace8a3c236aa9af8df4781562a8a17fc8bf7fd46ffdca60fca921f11ff8f1d4cadb55f31f9e844f99f9f6f77d8dc7f99164f3ed653dcd13adc6603d028cf8dfc197b9c6bd4d7c57f8c865c9f182f4c11ba1b9651df25416aaf777631594e5e17ebaec129caabb32f63f6ce034f0bfff48df20f2aeb2928633eaf28fa71a249b78e9a18285e56ab9d760f67d810abd6797f2d55fbd72e799629d4595426836c750935704f66c750b443d0179f4e195cfbbb6ef550682b01abcc1d8ed5a98b9423f6bf51da6d9d333991803cb07c4fc10aa18569dec8b227ff993278d26b94c6ebed87492583c6e00c7a6416d8929cb035a6aac5ab0379af155c69ef785174e4a18df6d48e36eec7663c1ef64416576cec9b6321048bbcde8766977214a9c15bd62d75c0afcf595314ecebc845d268241c83d33edec98e842b413369c8d6d2382d5cf1e8498eea84832630b31a1b3af5fc9828923a61613d10ea440000000000000000340f2a04000000006b7cd52626748f82805e6ec6bd190f9a4c354f97526c433789aafd1392fe55c6384d30f165c51130730ea956443870edf777bdfcbdfdce38e18b675449049cb9d4051d2b12e6fda7a8fa64cba47be62dcaea114665a9a5e32f22e4ec53ff56de00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd0f710938ce156731046c911d7e39fe0aff562c93e9af4f5e19a0668f325aed2a1ea507c29b694cd2274e71be688bf5252e7e56ea932a3564bcdb94ee015361423a505f222aa6017bd38b25455eacf7ba1f0db349c9dfc84b592fd8cd11858d4e7a18ce7238b6100bf158dced502464f5784a86e55cdb2ef1ccb39ebea07a41032a07912781dc088c85bc1726940105326a214fda31bda5e9d975c9abcb25e0aa02200f21a53e8f7fa26670fd13f0c78b63031972b62535a97bc7c8715e35d213280b00b8e151a63b6626b6358c4fa94ec52178739c156e97c887c7e1009a5cbe935cd22ca9219e158587f1255a77af0ac8226f3500e004e9a9a20d95f7890a06b5ec02146e16da0cceab97b11cbaa2c315fd6e1a0f7f7dd61add1245ef1b1a84f96385030f0d24cdc3d374730d5a0a05edfa47f2db14df13446734a868daff4ffdddfdf8032d150c37d14e9d2104e11241d6e4aca25110dee5e14e5efe0ed571d5e9f53212032ae8c7be82f1dd3d9b13759c93d070dabeeb5932298d94b282c6d0f9f4cf2fbc032bea1d389e272392d1444accebb5182f146b6749994515de12367def25883deeac01dc58f17709da31816ef23573ee02b1fd56694f3a7a153efe898866b5e571b9aaf8a88c31ea522ad7bfc787a25ba456d0f562fc6c2502befd7f8f4ac34bc4030c7eac87b42981e71c5c5971f35a3946815a451b8e5c998341b25f3150b45fbfd64ca4efac377fba596e18441c7f85eddc6702fa957cd0bc79952e01358f1322997fd18f9cc165178d7ecdc52ee173b092d796b9c717306ce8de7e8f2b680864dd871316bb07a12d4acf0718f266cffbfa2ebd68243796512e002f2a1e84b475eaced5cad615dbaaf221b3202aaac52f3e75d3616b96e081d4c9da41c698a7a30860692ef893c1d9be4a59801a16b37386d5b2ddacc5aaed805e40bd91fe8cb5b31bd91a31bfa883d28c270e67797e1edc78585dba6df4500988faa19fc23d9cdbcc8d9a6b088257dc6c312ba008bfaeb10944a0b27464561d7d932c1c65318b4b02002ebd3dd2013b19bfecc5782faa176dee652df6c6e39c905dbd216098c6ed3220d45f37174555ef02689cff7c798d919b900de4a377cae67bfd947255a1919168167939789ec0c869631c7b013e4db727ded2851ab47c562a8c0fe1f8a238cbbe3c2452d9c7c564a002d26e3ac484e4dc8930c8a8a748c1b417a84a54ce50c37f951ec9e25ee6c0b080711064dbd1d92f71dc50e9c563f3635a79f316e5374cbeb820d44994b63860e6e2773234162a3fdbb467da8dc52bf91605a2528b6e926177a00ef48085b0bf676181c25c2ad9cdbd262810abfdda135fd9ce53ba57c554278c3f42c17e2aad71d7704f043a90a7d24feab2a4c824961955614aac1bde2040376d061c9386b54f0c0cca3b7bcf39b6fa80f7a0b94022cd6a86a609621e143d51f3bcbb5c15293a4c9f096c0ceee1d4c7d87183204727dda91a23b29d572ba46f3e6be8b14d2c240705f71767c7afda16f4f718d7aca417a8feac54d2e4e825353cb61e66217187f9c0c7319648de141b8159e8f42dfb1fd4d543d2eefa4dc151d2ec1cd8e44b48efef54c2c9d58f89958a9bc73b897898bd717092d636bd94e97c151845c6d5d4fc3b5f3fbf46ce90784e36161427d4210f6799751ff4bc8803ab5745e68fa560473d59f909929d3b8f17e0f366a8c05315cc27dfa914a4acc32a896523dfbefaba5e8b7686eaa3a95fcd91f175c5c1ffbd1ef5b4476dd966af2649ed925988b67488d022cdc62ebe4fabcf17a74a54d667e777c4315a56a60d05b88a444a8adb39800997e25cf08341ff88a05ae63ae0170df73d669987726eebba2e54b7f74bcc41b337c1b1014260be038e306dacd9a8d4d32316d227bf3bae29b2fbc8ebafe8e3716bff6869f6d87adacb3ae3a3062ebc01bb88ea4d8327a1fa77b443ed07885a960522994aaaa3545393771004c3d127895b8c4bd045d641058543ec0ee82cd308c0e7e8a9768fb47a704407234efd747ec2e612c7abc57402261b2293817c7a4a1a9f26061b0da5d9f3a7d6436d3c733d313e87beda89a96b76258f0ae449ecbaf552fa1f600a31bc08e397c323e5f50bcf26ad533316df62218c92dcb5af164dc18652ef01b9f4c6a1b18e0da5d0704a61902ac7857e367534f87fa7a8737742ea76f234550b05120b5df7d2d5273d2bfa409195754779deab968473bf15c4a485cc35ec55e2c8dfa853e91ee6ec2af2d54457154eb6935be05dee3b5c890ed9d1a8000000000000000059d9b50400000000a6cf8a91609c417d8cba690e3d553c867424ba5f5f5f3a6089d6dbaf703d2a5f4db9bb4e8840dcbe7bb41310690e9890bb6bed7f625c77911a1937df5a0166ab9d442d05ac708be97cabd1dda57fa5eca4672ccc5699037e792d88eb6a37c4430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014ef1d6d111bb86bf6ce6bb3fea4ee15947e8b655410e06b7f4395a72b59c556b56239dba24a8fbc38f16f5592bd3b33209fec20a41ab8256ec9842822d239977b40f62acdd9111c2655035b81107b6ff9244e5c8dbd07daa4e61ac27b64d5ad86c928fb10521f221d673d5956ca54a3efea63abc2a34af9bf928dc144ee06c2022829daaabb6e9b687b029228d203a29d928b4f5a03fbbce489dece82febbf60603037437508bd93d70516d2112e0ae9ea2ef69fc213c60a5104b8aa7b8e9c58cbf0a05b2e7c1b31a13eedd4775cf5572a71c2c48f565e2c1881f821e11687e5ee96424b66e8f080a079ea97dbae4a35e19dead33316bf089b3b5ecc685d412a1969f0300092b7a8319864bf3521110db754bce50301e7e45845dbdda469f672fb881de032455961f4fd6308e8473edb7a7a9ffd02b07e81ca93a7994e3aa3fc781d7e10702192c738fb5737f442297fd721843f360d29c4613b4cf1dec2eeaafb161f54af6020bf7c37014d71085526694f6f59f35ed350e2e4817118fee8df560b8c7a74827032f5493bda52d46832a3232ffd1ac2bac5690e44a4b7e3e56174f10d58331ea76a5906fa115da5284fa92439c9c6827799183761f22a5fac82e320ba83c2d46fdeaec741ef396d20a9ac82cc427a9cc834f2c194c11b2a3c353af94d78355c0ef3c10e45069e7d2fb814de2758aa088f36fde154d054c2ae333c5ddfca6d2156e65020f9776b3f9a67ccf1db16a85737c18d25f08e58a823c42d17e26b3019e4136e275b7bed80ca4a6c09423caff086bab15d1fadc4b2a0835107ada4d263affde5287ba4a1a6ed6121c2af8f356e72ec5a5f74345460f0db4dc17435695508c19584a71328d307b0d03048559ec7a3c17d09dc9343762478009fc2fb00643669cd3615f1db1a3a2a93f5eee991a35ec7ce4af9a4a55c81b57f35b61f1d2450c431f7ca8c020ad3ff2e869f4afcb358bf0c2dad957a94ce46d2e7df30327e3f2b38df1e94239defcf74f970f50768c38b953cd5cda9868e4c8b2bc49282f45ccd9ab27963637e2dcb13d84e43f9dafd65774cfa5767b074b2339460da5217fc5206771fc4ed4821ef518e1e23a61f62e399c3e6942368959392ccf0ec696d6ac361e34551480ead76a7b6d641d288c07cc1a99aad2f910568372e85dda17912a8dc0a000a94ce69597fee88a4135d9dc0af7320787f16982c7c2dfac8f70d634b1d9ff633387dfb0d3234e414bf53b217550e74e81d1ff97e3f3bdc30bace2c6425fe999e2fa2a25647ca6ad6c038c8c476744c84e00e2ac26f03dd3924b8071d0c5843c61a2c0dfc77b49e5f2b96d9ee8b2fbf5c7edfd994118cc9478ca2a5b4c23cd078fcce61e25482ca1f79b354cdb69af4e7bc28da6eca3e2d3e79b7739407e26abcece1ae254bcb66859cd399fbec21fcd3bcf3952758625d66adf23cc8384a45025b815d0c75d083a865ee13f0631cfff49b925ae2e5e8abf744c75087092e9a1560eda1fb8391955ef46e3dbc7f6e24f650241fe156cf91aad6c81a079925cb33092d1f0476732428c2065646e30324585e29aa98ca4b8b5a27c9174889a1b61e2d1956ac97b7bdef91c4b0518ca29abc1c07bb8fbce5105211aa0490480743398c8b5e79203a7d1d9d064562fd2658072b8afef54faa4c4200271c988c59970b35a42e43efd1a16dd23f7ae189539d6733a9ebd89831e207b10090f7edadc97abc837bb58207346ccc8a235037f5fee32e50fb44c4c3612ba4b4e49fab1d61d51a516dd02e6907000e0814c00e2af560d5cc9283930263e71be27beb13d4479039c680b2e17d8bc53685b26ddc41c5d98e89336939827f5e6f4e053bdc43ca5a7ba9bff6630435c93ddbdb9959c4ff282c850bdac5dac4cb2fc7a2560b04002d7554ce1dc8330092463c425583be7fd0007edfffc2d39604543ff590ab2a1d46d7bf69290d2737ac1d5ae9c77a274b81af48b90aaa7a813df5a79fb287c7885ca0c947dd75aaaad7b06b6fa4ddadd79eb4100619055ab7d7936f106a445be750c38d7824cfa862cced9380857bbbd77c6e447cbfa0f3e03d26f38860e9ad7a4ae5ba6618915c9e843fb021055710cd2abe9a0252d3cfb4424ac4c8cf0ff55b8a03958fb8123be3e3fe7ff406b6993df2c80af443e790a0c7106991b7add401cfa19da1e578049f6f9b9ddc297eb5bf163e552bf869ad8f77a049454f3c88a4c3209bb1204f85464639bc001d28bbd76252a03a44f274d66eb7f372ec1515064c5cae2b4c5f4cb79f66b51dda123b4b6616f26ecd4255de715ae605ac9c11eff44fb16e8679737083ec393cb619a5330c161a2ade3873da60d20cbedc62729c56ed641f07a9f04242931b6c0b423161effd69c24b54f30484fc55938783955283e5477ac21b729c1923a28b5400c", "53", 1, 443127662, "5f29c715c58f160fc639f2617d73af13771977385bcce56aadf8e35142f146ae"], + ["030000807082c403041953aa7d978e4b3f0c852f071b0caaacfbc38168c3932acbbb8f892a94aa862400000000040065656afed8a9d790e456daa3bf2faf1538e5e02fa1f0117f889bc39812ef7213d2f2bc3242462002000000000290527104f3fba2426d92752648244b5939569b6b8904c5beca9111718d218132406c290000000000ffffffff8bc2548af3b2a2e21d0850238e899b15736215db7c31ee5d895db7f9804efa6d0300000004006a0000050d4cc0042caf1f03000000000663525300536a9480d605000000000853525263650052535c5c68010000000008525353535165526a45d24201000000000553530053520000000054a9f4c2030000000000000000ea12480100000000177292ae883724105f0a7250d23d67d89b51c56cc9060d6d7e9686a2c199a2e61c5edc455f533c1cfbf3b9459a498fe4694c2cbc8d79db5a666d628a3b0bf94eb6b4f8c64bf836834dd5054d090b5e99f8cf32daa4c08ded2507b19466d0756e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006190d26c0cb167793451b451bf29174449ef0c7d2d34903c387ef540fdda3b24baf94c66fd365092ef320d001ac30c2a86fcea38a06292990abffdb6a0484261a16a60ffb47eee8b74381880b9322777c4b3ff674b701beed86cb13755066270ec71297eb3dcf97de39d1582c3f0ecf8a1d49ddca363a55190962d504772e2b5031668148be863ca8cda810493fc74f554246b3a9f91ca53f1ad28d2f1ebcbd842020ff4404b97287be73f87e92f0542cf2ec6e9e05d770288369e928346826612180a022c2d9654c4f50c4fc94e1bb63ad705679c99540b155a9ce40ad50226e3b1dc90b1990c99d4056cbcd72979f389714bcf69bada2a8391c9fce2ca45008435ab0214564e3d979a1d060e622ca0e1dd50e27c1f9b4d0aab2f8542bbbfca64fb4f4b0327d7e16836c72d5ebf5c7cf1f66bc2ade17f6af3540576b16352fcb4f31b866b031e78290c2acf339d698079902c26249b3566bcced59e7eff79dc2f1757dc2ccf021c76f25271aaf7eba2c991de6416e77f0627026b3d2f41598f7a9dc3748ff8f90219213d3e1f4f4b36c19bcce01abc2441c705873809575f475f5ecb19a0f328765d723fa9594376ddaa516a5fd0a7ffca67f8f25458cd5cabb833803a9c7e4fbdfd85891c6f93f24d983c1c04ba17f77ba052b815a192667db72f228062be0ce556558e9874af009629c5c01d42d49e97531b18ceceee0a0e6780b01e6f48933e0b766ea3414843e43865a6691705bcd4f89dff9bc3eef23336f9cdc4357ebb07848d61957c4e42a8c4f6d57e79315fc8577f019e204ac5f9213e55fb77f84f767e80c4f07d08b20ea12d9f1f9e469d5ddfe9c26b792167f7142c0a9991e607ec4b24ae1928d93a5fb4aaca6274f64e1b0dd65c17eba09663c58c0f3db860da09605b6f8dc5feabc89daee68318b76d228d4b48cb202c638e1c4016eb4f2138114874b94551548803ce4ac457c652912e6fece0dd3f201133235c2bdf2bbda20df73c208c97e49224824b14ced9f635475b95a7359659469ce5c9472a3df1eda7eacae850a345d97070d6c1573a8dc957fd65ed43b9e8214dc2eda27292253bdc153cb2f9848be28fad7014e90626f098174b712140af6198b552db01177ebb2460efa3e7d30fa0ef465d794713df595969a41415ab61c57c4bf81d4d76e485a8702c65683adf2b7bebb5154e88a8b407fc06919e25b41011d77b6274fb5aa6234e5fcef6a42d64f73b0d83a4607a8f1bd6fc75e48ed103a0f6c8feb151f5d170c3f821d42fc584719c5e5227e4b534003740a1df98304177d91c8ce25b19fed1cf3e7e0ab54f1b947aeec66047c00965013ae0a3c60064fac77928c75207bca09f41f0f2cb3f18a1822ed5c721d1ebf9536794749a5f26b1d82adc3c7f7c2196125191a0ba189c09d50a1aff8c88fa64e2877c695a1cf1503233d781f41b796d6d76989ce9a0fc7375a3e6a4de541527711d197717af684469566ef1d06b30ae6b6fee54b12b493c4d1161af951aeac9a0e7b896320c188205c7e4352c36d89aa0f8b7ea73db5798d040eb071c6458b2c5876519faaf0fd2e1a19c90622bc98d0adff360f6b682eb3ef5d97535f43ff52423e7b6b3ee20463adb749e2e8ea6938071f48905894ada6f5f781183d97040f024db2b501704fe9bb20db9ec9c1f0b19ff582779c6c2a53ec6df05441a9ee1bcefd049ac21047f77a815753ce2a9f91cae8f146d668f18ed0830aae66b094c4c56c0495f60420c725d24f745fc950ad1749bcf4662954f4acc509cd42b86726b1084e8fcf8ef51e80fd84792f0f71d760d35430576c87bdc2cb9a18bec98a5af4afecb4d183760076d1ec0295283ee366d5c1e95e32149771ffa62a88b40b61470571c3bceee77e911ea99229bdb448d65b2a2bb30a28f839392ee9e205a33ca1be708bfd4ee183265adf821f9f14cffab64708d14fc2dffed925e72d3a19009f3d47cde0eeee329524ae1c1a39720b48427b699b12faa7edb94ed5f6f6256d145acef10247296176d9caaff821d9c2e78c5f88206cad48acb8742cb0bf3d674170a544fcbc2de234ca0e94e4347e23523450ed96d3926a051cc53d5900ce3db0d05b2c2077e72e0f749c5baaa97cecf89efffb2d920a099395bf87633d67ad28c079ff737f5c5346f1712997349beacc9582f7466fb554aa041e36c8e3be226c3800502e6e612690ffa05174f4581a199f0362f471a9b54b099f9dab312e71029cc1f312d51238ebac0e042e53bcc41e77a210570dd0bd768f09f53b534a5ba18cf28bc0000000000000000000000000096aaf5b562ff466d2f6099b491ee19ab69da5ecb7aab36b92e675041142c3bfe78798c11884cc8b40681f04a4520612282133679c521f6d6f4f2efb7dca49915863adf1ad41c8f0ecedb7e84fe319efadf68acdd074dae0209551f71b62208a2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008eba2b4382211685558588fadfcbb7418f7534b5344712b0daf0fea42906d8d829da932d5da2b2013bacb0f918f690e28edaccab1a75ad508fa33dbe370a1399d09c05f34cb8b449963ac3c8dc244e59b8d213754a3ba73fd68495c47142b1bb53dd128948a890e0ade0d2859def78e73748b6006824828e044647e9b42eba37030b8edcfe14c438cd7fd43af30cf751bc47415d5c52b33632864f3cbf711efc4202126a425dfc6ff3ec408d5c7681207e4456e9271213ce6068a1094cf80ee3240f0b026f9c07ce0ff67c0718c7025d9cd61ba0e4312c9db6b8d84777b535ea4bba5b36364501412617389f0c890bad155439ace19a43f48af40726b2f22d7d7421d702187901b78e794d78e7c52076fe06f327ab2927563a534bdba4b7c6868b8bcd76030bfec5c58052dc1170331180d2b8efa43a286cb0a43385cf3ce9c53b4542aa7702288f5f985942072a7bfdf60c08a5f29b0458acd13bf12256637c211c198d49eb0202ca131f268ed80696928a47ad4a554fad89dba01ece6eed75e2123b9814b424031b964dfae9d470771c29b51640de07f8e0280b4bfb7475e24876fa84810b972101a70ffcab3848c91e51a31a18f0f45f2f3dc3c3bc8d8c9afebaadc4e1827aaa05cff19815d971ba3d85ff2b36621a2bf0ee9cd9a857def20d099fcffa5245209622d1245df361ec3ccf88833d84ab3f02590bf04ab76bb960d2946bba125e1ae5a1eba1d199067de9f58abc91f56a63159a778f624f10f7295e43701745097d28d7e752a1764c8d10c2a65a2aa196997dc09c04f7b893fb04dbdac10a17b2d7f05f56ce48a78c4c4032985d39e48b56603ca4ced1b0d6ad95b8439670ad676dda345ec2ecd726172f0887eb5c90b2fa9a45359e59b6301d90314cc6f9e7058fee9e1096a4de98aeadea1b6c39a430f69274a1d84f063a783ca896a97cffee09e1399e6e0d7d46db51f55517aa9b3148ad95f3c7a3f4007190b153a9e6060faaaf47dd63e1f3bff4374d64e425b9cf89a5197fb79da238e9d7aebd260fb4a271328e242ae5689558ed9aed044c082210b63decf0128a859d6d82a68074402b478307cb1f2aa195329ff22dec1af1e1fb5ee19a1ca1d2de3ce9d30392cb925aaf46b3762e53b38cc62e48bc95bac3f4cd61030a99252f675c0cde6898074b1b6631dedbd3053c9386c5d7438da28ffa61041fb81ab3515cbe75a968ef781f53dab2620b222c518d3474bdb8e926759706ce17ae3fbc01a04df042b2c12cfddcde9b54940123aaccbdca1209ea6dda0457f05642254576c0bf0c249204fa6bbcae903fce5af5a3d5c665e694dd3e3807877e733288aba05f9c6aab354d4b5a215abbbbbe8a1431936debbc9d787851df0c6e7cb78a6d0aa42f70df28268418822f4695ee886dd7dd378bdf8ba9a3be6abd7f3f56713ca0a70c07e8b68d4c391f3928f9e9a76489a7df121d885b7b83c6da4adcbcb9a250c5390e8250b5aea085076be17976e3538e2375db1a1726a9edb392cec147a03bcc425d8ea8d6de9dba511cfe567f054ababf32de810b20f90196a5d70cde0e225ef3368954440aad150c1aaa4ec53d36b5021e3aa37f1bcf410c3de45cf6a707a9bd009f7086e0ab47574576e341553318933b692685142f63bda102a6121a601235c2a8531951ea75c230196cb5e28d627d208a549f11f48d4a5214f5965d9367a40d461d1852813ccd2c91390cd405ab045bc3d6881727e4ba7de14b75225b7cd2dc4a3c121d8c6f1827e2ac50e2e650bc83610f3342422c24d7018b9bb7efdeb14082ef89d469d51dc59ccbfa0d0c9255b62a2737839a4dfe39fe8b4584fcb78a6293db856da2c72bb3f0be7878b06d264c9b168018c1cd2e66c9d54a177af0c2ca4f3e20456d0978463af61f3441f756bc9ce7445983033c4e9323977808876b9c3c8a96db7ca00e8e4bbc538236d4d583d02fe30da60ce24312a4a2c4eab133899d1342c10e78308fef37fb86ffb3d9a8ad8bd5b58c7a447e7a6bd87aac951d699c5d302d059f90b3efb2b9f27a875ae3863c2d96e04746d7b02a6bd61b7907af9040a1d3275784d046c561afe1ca63d788ff61ea72cbf00dd6c825120b9cdc58b01275793a581f98e3e730bbe6b47ec19bf317ce1b0220775a86bd18e92976525d297ece0f082d184316ca1ee98b3e9843dd21dec5e17ce4c4da63c45f5c4816c7f306981b64ea760e10c099c4c52bf1a6a8dd72420cf7fdb16c6b621b8ce348059b1126e82c552057f4e55e12cad6628e106bd2c4fc5d8b9586cbb2020000000000000000000000007ef111c330ac2146dd05bf58c768c6a13acbbb251d22cc473d91d7527e9a51f43248deef7ecb93fe01c966f921dc72c79b40991e5e477826c7d5afe6999500c53fbbd3bfc85b768e77a3a63406f48c8862553d12ca130fa27b53957eb248cb690000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000047c1f459b36a5b89da9b7bbae7ab2486fa53f11d64d53a550c9655ddce1bfe67db6abfb74f8b44121e413657cb65d504b7126b2442a31a7fab6c401ad7796619e93284ad6d5b575a58fa7c71f973a2081d7983ba4831fec1c00e7013177c14927820afcead1d2bba812c8978c754593f201c4389f161adfa8390c6c6fe019dbe0303259add8dbfeb93e199ccd088cf6ca543ac20b9be1fe9cd3270f22f861057f7031819d6396a848a1b1cd6cd0f21497ae700324bf1f2673c196a93c7b74858cfef0a05e8807045a6f4fb1aeb8d3e1d2dd3f52995e6015526d7477c5687f3bd87765de6410fe46b07ca81184c4bd032fe9f05c092a0aa9adbdc213f6435a3dce084db031b628c829e13828f00a60b72916ac3f620d2fe232eb0c7e27f99a26bb66b9358021c9e65568ab694fc1ab4ccf098d6a54d44b1a0c13f0b12c5889f95fc8ca56d540308e6a28497b862cfdbfe8edc4c45d80c423a5fc594a511a2e9d9e213ed1cda0b022dd1723a2f171487da422f934107eca83d5de22c8c3572843af17d163aaafe9f03245a50c3a238efb3139eff62bb65b4397809c14ea10d66cc527fa91a1bed99421ef8ee47243dc09a28d94b940cfad0ae218622acb4203a74dbe8ee2b20ea184481b833bb5693d6cff6dd799af38313ba6c711b56e7be96a2dafe046e8e145bcf83c250cc50dfe3144ce591c0772feafac8833b967e6f846aa64b969be3809500fe65b752afd6ff0c74c15d329dd635178e8a60034b1f7e7f2f8f1bbe3081d2b3fa8ee7054e07c8dd86148809f3774f9e23cc7f564f9f2229f489bf8649a62ce36594288f8d22ebf920e462f1cfd2c00b3ca71cae4130bf9febef2fe9c50a79f6ff61c78b2e8e02ac3e082b6fd4d79e83d4c8614f9f201f78c7591c99db47e436f034f1f357d78e5e2c6275f4a8f1318b7c8557c7fcf25bbe040dc900055244d4030a7a23f8481275715bb533c2de19e0989ed4c7ac25b43dadd4766cac0b5a89442c63b8167ee3cd3cfb1cb3ef86f1b1b1317fdcacf202a2178432eca72c039592bbbabd127087bbf8530dc384ab6325349fd86e6d79cd5e69f0a559c555d653eb93d70c553ce915f66fdb8b8cd9d6df675c76bbf18b0675636c4e584a9417615955881fed0a35169a0de7939c42f4ddc57e9e84305c1f7b6c1f95dc9b6327f19fe012dde9617c6aa32c7c44f5499b9be43bf00dc6182eca86cdec5738792b1f0b0e49f3596a1fcdd06edcd112a978f104a1bf7ac664b8e360294abd152f31fbf30c1eb01604afb7a3bb53c6a3231e43655760a861b4cf7617cdcdccfec40a950cdf492dd78b35834388a11ee65662b7572e81a3f5f4493977e32d05cd1cdbd8b9954a5721e19b730935681de1c4c8574c12ae7379e8a80965ac79fd4a3e91761e06c4e97df41b6d3f497b77440fca1f1fd4aae7cebc4143ca62df9dd19f7649c27c504af1a8f84e7ac54f7294ce394719aafe05ca4425a6ac861c56db32cee3fbf76efc9a151aee0555f172350b1f1051e8577902a585a4e510bbd0cea0bfc6d98247213deed887467a04e37213d68a107873ffc9c098cd8248b412100a04a531aa80cb8897360b6326cc4ae9e0dbf054c8bc24f949b586af7f54add2d663a57389f18bd443e02d96c984a6d0948826ac7dd651136e9e6f52a21b4d5c15608676613b28a551df2a3cad223b9b15c2f5713e8cbbfed885fa886224b2ac8a377937370cc551eba8d652546687257faab303b1b54bf96c3e6b4cf0384f3cc1e55fe3061955d87396127df8bf398fb201a5a22dcdc1e1543aca5a08b9b8c49614c604e60bd913e71c25314d55315b6a53eca39c147f50577e5f883c4ef4038e03de355e194c0f9a7383498ec6908ca413f84d983b5e54a1558fa69b40d402a6a147cd2e3660745269be3dd16677ce8d1017746f2655215a5f88dd39f5aded3fac3a51f9130b5b4299b78b13a4c3dd0e8db8394504c67aaefe0f784638edad3aba12935cb2eed1bc104d0b8a675037ec5dc13d1aae198dabdcc69d66e8e0458429768a0dc0a028c06cddcdc63f37cf0af3ced5f99f9577e1433db17cd2931bb758425cbe950407ac7202fa538d882b414cdfe99f42bd3f66b7725618145a9eb86c82564528abb96b0a273a0a1c250155595752aa3200027dc1709866f02596aec2442533703c1875541292949bfe0f1d4f2bf31dfd3c914ed09fcc27d9fa1d891dd6e6c01615d02b6d1684b54c21f0b4a74b9d2c77b750851d53bae2327986c6ebadc7f90aaaf25e426e3f1c9854bf942171ddb65482b1ae873549fd3b5240d7d736b940d379e12061e03e6d60e8d5a9c69f32645687778e7c1b738e965f96eb55ac8f5fd4c31473a037d73fd77d9f390fc8aacb7b68b4f6dd535178a3601dfca6023be1829c1537726f19ee1260ace688783900", "0063656a5251", 3, 353534307, "dfe9e21d979424ae8344199ceaad407b99c2d53669145f4b13723da3f816b90e"], + ["e70e086501789a2e60bb8d0cffe9b16a73de7e3a9bd738b36b31bbb6ec63e212ba64c383db030000000853006352006a6551ffffffff04407ee0020000000000ba5d54050000000007520000ac0051655720350300000000009986eb02000000000165550b721c03e4421003000000000000000000000000dbeafeecbc24e54ff4d4b08f41fe5033405b6ec0f434c9f64a4923044286a01fa53423c088aee5850394894a04679375621579f2c812ccb7ea9840e9bb1d013995e0e3fa457cf956176a0e51c3c3101b28789abea0102cfb5904dba8fff4440800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ea19b3f5a6907a52690da4af65764464f441f3918093b142f5a0445f33394abcf7008ce3180214ce44266565f75421b14f41b1040b63f880af97914527f6a829563d45f64d1e291d3d71a27ebf7a516a927cb9614f06b68b1cc2fcfaddb8e1a31f0512f4bb83c4bd324b282116ad235cc1b06d4ed81b05e2e1f43bbce29e84ff02129681181f31738bbb85980d3f33970a35b9ebbe3dc477d28070cfb9422e12ed032f67db1f2dd95f1a3fe31a7b3064d35a97b2234de71271cee7979928be1566e00b08c625bf9a5d696c673b43ff4ed3ad04bbd2341596bd2fb58adad715479d2539b4d39fa915daea881dd181455d7727d5d6717f997caef2beaba5629e0605fd42020593b6ce84115ac21a8e4cd229a5b7fc66fb00a0edc81212c9edf32b066abe02021f7b071bd3f94d0b6fd95c00d89ec933db5e73c513691bead16c759eb0966167021292666d8fb32ff89e52bed34cfcbef267e0bfd7b1b18d2ad0c480dfda9d653902304f50137f77f8270831e347bb7dde4ae97c602b838791003d372b9a5d702b550214309e23aa62c13ef3cb811e9d410c921843f73bd80697ddf88ebea5d8a1202ac4cb9dd72f0b5dd9f5acdee4767f71bdf33aa5501d588a10b3594328e3549a428b7b913b3ba3832d8f8d0c222b5b72c5011557e4386d35a7bbf4ac622c1a8142d96dcb1afe71f74f747124d51e0252c965976de2c20736a0d5a8ea69162c6c3080a7aece95a4f2dae878475af902df2dab51d98c7534010ec504ccfbc023dc756d398d9bceed504bcdca172110425551ca4db8c50a4052933ec738e40b149d218079a5eba67efd9ba8fbc31108065800d9a80442e44a805ebb8afbf379f0d12ceca60cef2f2794ff400223e25299f42cd0f3d689a0733abac076b21d348472218c5e2ccd27782e8e4494d9a3877e2507d23b41afdbbd3f2b6089c886959c308b45168bdaa4c3bbca397b6c3db67fedd80c06ce53fc212e4e686f3e14af9ec788abc420007494b97859d88574a04ff7a29e798beeb4f3022d209f6bf7bad16a69be8a5253b97f98a281fe4f85b90aaec19e3fb411981ee023ed7d04927af7a726382e15cfda88c912d41d376f50b097b59322e2d834266efa31978d885b9ced5a4c86e44b85356835f443a4cf1d636672a375836d5ce0c939800a222fccf453c6620e5a087b1a6afee098a2aca5eb3767c5141862e9dab69aa04997fb73068d9086d01d92a3fcaae36f4e453073bb2a09051615a511cee7dd561664f63731dd619efd60c1bb7bd7b12817f7b55ea42fe8d9e13ca5b6971923e16092801ded1992a0bb0317fdb5263b30452861fc3738e050657c0f0ccf28dc44e7aa45fd3f81f676f4dc3f22be51d293925e29dfdafb5a8ac7792b4070e104abe64d0fad07a7668ab39f48b8347800c7e85a8b4d0aa28ac122028ec2c84a5cd59955c8eceb16b7dd1c199644ee1251dd21d07505b56c39b1f7bfc34bdaf479f1c918258d42761789a58a4e67147268827d84a4f6da3c0b0fc38738cde7d0e93953dae4119c8213efdbe5fac7302f3c60ee07ae0f3ec39117648706eb9b3f6aaff589396f2eeb7caad3e3d459837f354511e41f62470ee0fbb6a666a4d6dc2f451a8838c8ec1f15cee3b202da909b4bd73899c958025d3535366d8b095c4ceba5ad511b5587891bc099e1e484cec447021e57c9ed67901bf96cb001098cd992679656517f73e02c773d92cba26f2a859a997afb9a76cd6838688880f821c1e2bd000f905c3739bd7e471a505f6ae63a0a71c84dfe8f6ebf9e63daecdf99442f3b5b76d10bc1bd5c8e735edf1eb266d6b63ba07d54287887a5867e98a2305d2bfeda0f97d8face07ee161c7c5e506a783ac8b403d87acd41453dea9c747a599e399eb6e2474d0d864854ffe298e585cf1e5e219cb1e69dbcfd6d8970798d8adb26734896024163ad4baf8dc625efb093734cac6e06957351e5aba782b1bf4b9733fa498cc95dc9255f0500d1da5ad863b5e9b56be6b5b5e9a9602bf4796d41a107a85130fedc58529ebbdf847add160db51982e4895e814340462d32309f183460ae73c1e48bec1f8692dbf5075a2885f206e4e2b952f3ba52be808225b928ab76c674a97bafda8c7c7fb5a8103cf86076940d3c36c3d364665b2646752f991bd407da3ce23fa15ab3b9a913c151517ec575462800d50a87b9bef147dee811d351bc2d3024d16ba2f55cf0029f27e0259ff8635430fa4113c9e38c0002d6c035f52ec94f80a9402f3b0ffbdeab6aee1c0a95598b93dc9098319300000000000000002a480b010000000030d2fe9d68fa485041a608234ecde3be35964931d4e7a1c1911f2545d280e75b41de98ba190c892970aad8ee54914d714161495e58cc95a0a296cd8345adad9e97c65e20e8b5c31670e02b0cab656c8fee18ff1b48e4d15965188b552c6765390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a29df118dd18fb99a306a5397f7fe5e008f6d8c55bbd85ea250fc1dbe9dd01d5afb2294554457941132dd29e044b1bf60c714762a4de84d9b4292ac567de7186c8270e3f4f38257704b14d9fa85353a42bdf5ef3a57a6aa47e676ba52a87f067b29d4c1e0554df3fc39c47c02dfc70397f79c1aef95aca0cfe112c9edf9db302153cf8317bd8363abe4245eb253628d068247ecb4ee569a0b354b6eb759aa1bb0315a8403a4819eaeb95d65e8fafd7ca132835b9189dbcd1e9ff336b0f42b455870b0740142baca3edf0e9c877736da642134e633652abb93812d0ca29d494521c701230c5e8cdb304995945e4a291984dd96e2aaf0966bb75bccbb42340a315678a02077f70c0c1f0aaed207fc17ba5ae3c00171f539a7e8ce33f3802e02a875bdd060223314b54fdd305995a2643aa150e100800a1f31f3faa3f87ff3289a3906ba0ab030ce5c31ddb53a026d1f2c0e3f1bf9314a899dfac656d5ce32d2ea1400943ad4e0210e5d2cb009f5fd0054717559f3e6dbf0deb206855673c4942dc8dc1fcd021ad0327f0098efbbbffa916c968dc56642cad0763beb18264ca251941f35d5993f88516c9800ae28733e994cf3b300282bc4ffa2f6fe146f426f8755bc8cd0e22c246ea857e57836763f5f343b199c63b02abc7b448ced1135b37cc0b91f1769a838adcdf7565f4099054c826f0e26e2063bc05704beeee16ca8b56d0e6f3cadb970ce9d5a4503917ffee5d72868dc22035ba4273402ffeb1c8678fd2b83bcdbf0eaf7943fad2a1edd6fd32c92b5b6124c2d789aed6874dffe491d5428309f0a67cdd9e0b2c54797698c05a06b7acb6e8c9feae7181d7c3f42e70cf7d0b79420d02509eb9704bb38fec20323a23c67a78e76e3facde8701a01e561dfdf7bcfd34f9d9111900b5bc9a0609c43911c40140b64c60947e3e0521a6afb08bd33d088dc74445909d18f0f68f7ce0bc960d145d36a86bd6c00de615c4c95ece89666916a59b83ed33d2738a04ac96be8d798fea700d1a9ef50b5358c6c95c961c67be2ecc7aa204a1eb85e359cf52867086981df2c1f129f3e23caa5762644aa5a017cc48f30c0df7f90dcde11bb8266cf440ee44212f1173876938be361fd31186fad293198d1c4d16305543d5de826260138f6b3df1033920220b17438e97d72b683bc54fcf215bcd352937b354757950cc6c92334ff23784feedc7e2390999d0d359b37b60ec6f9abfd856ce98534ed458d646c23e6148301682cb1bd43eac5b3686be0156b692671f83e5ae1738aa1158744e96cb262379568e348bfa1bf423340e6f7761d9b6fa39d308daf386d090f10ec19d9e7f2d6a2b391c73f76698355b792c4ed50866fb4bb8f874f2ee349acbd988f5f09362dbc196432b7b5c7ac0a1a71e71bef409450d4e82dd2abfc6f005f8cd4c77875caea5752abc908f2a593f496e6f86b9b64cf9d1813e232211abfa963fa2b2b3da141846f11ea4e65c5a7f248af71632c85b65ae70a7ed797629d78339b5f0b484d90ec07645f63d8dddfed4d69b48d0968e37a1acdd92041229110a29b9c9150f9810b59667071c82971ea1c6c2ebe505c89aa6269e6fa31cc0c943795eaf70d4bcb96341322f96eccae8012e8c6e5460571c7213c79aa055982ad5979a9414aff08b7754adf4605dee3aa1b6ce59d9806a6e783ccf376ae02be329efec2efff2f89633bbb99d8bd46775b8ce5d050b8423b91dad10eccb135969fd217bda4815dcf61af4ff981946959ee6d9f6e1a8de573e76f70dd854f29758ea8309e31bac7874c5f7fab902aff7e428fbf2c78d7cacdffc1f33234caaee3c3741a0ce7c49a1dcbcaed50a0a272af8c35911936ba2d3a8aa0818e96509c91f237d4843c76d991902c2ee0c729288983712b11851315bae195ff187d2704eeb9244938ff1bb9ae59d85dad492bca85ea871b1d780831cb91e989f9d13e02f781122cb5df4e4b83735e94538882be948405826f409cb0f58f60684a3b6dc68f9427ebd4b859916883ca36beeba0a2b6ac5f291677cb34a9d02e468c1fdb39317c601ba4cc7966ca070f08d1756b4fb78b9973aa1a57bd641c6a3044ac614713f5e6d008c7d0d737add83df2fd33814e91ebb3bbbd3e1aa0fe9486be87895932d0768804b48594c82a71421e739547a837c5095b2c406c7d699ed18bcedb341628bbdc5ed4a1b2de87bd003ce03b10e5586e144dd35f39e9569a8d85751c3ebb570b165ef6498f587e0a66c875ff3029b9fd69ab78bff34ad0125e0a9ac54fa8b73c19a60ba2684d901000000000000000000000000d584296c171e24dd613edd72baee8563e7e03dd165bb334083550e1e68a9b0a8a4d465868fab1240f7ec4e7f0c826d390b21e0eac5552344468ce59f54524d22e2426197c281fdba6b2e048a5407d293a7530bad5bd1a01a0232e6754caee2b5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c1702874550bc0cf3f2c14a63bce695a97099e3da58a9fe6c6e0c00bdf4842a8844c08351d36c6fc267d93402ca196627d226d44f016050976e47d49284a36e3795f9a597f43e004acac5e44f38eb4ee9b03b4dfcd4e64e9a980271005c253637b05397f26eaeaca2863ea030a07afd8b04486325b0c7b70c8ace490f67fd32030b5db7dab394563f4c34c9ccfc1dc4ab2ff389747c3357102b4bc1c0e8736beb021f9b8ab824c4ce557f43c2de442a9a30efed65a39e3cced2baee441834aa6b0c0a036469a8d77046d96a8d20a2dfd87e6b3ac4b39cdbbfad012df54e4d32d57ea2f77e43990c514a15fd09852dbf62a959813e6ee958e5babdff74766e799320480312ca77ed148d92cc743a0ae7f61f7244ceefa54f52529abb2c5a2f8b6cdf32200213aedf961c92c80758c7653d8301671fdfea71dcdff303a28733d764fc2a4a450213a1d7a2f6ac3e615ba7aaa02987511ec3f94f696ed1971ecd04551895e994be030d35df8ca59362e71f1e37a5a3526d98b33a03f7111d348ce210c41a6df29a26030f51dcbef26bd04aa0a77c398b2d5b5dce371359dfb930f6eeedc21ce07a2e8819e8130a9e295ebfe373ca26788ebf85612138068b581f9e29050403efc81da74d5c588581e17db3d43184e8f117fc4cd55f8eab9f0b9c51e5737cd9b245b0139a980a79d807728d940b159245a6f57e78301fe7832deee0ac8c5234e3c0ba76e6218c3fe22b5be887d152b9707f96d023b40a0182c070ba37c3881e8570a9af4984ce38f64a38fc88d0366e45aa01f72d086dbfe36522c6981f7cc0e347c20a0227f6e7aceb2d0ebef0c8b7f0e13468ac6644b400e2b6262d0b28590f8c57434d093437fa3bab6f0f754e437d003398bcd324279db0042bf30c17317a0ec34810277526d9e015d3667b2d650c3025c55a18edb5729ba49550d5ca7de15e2a1b751d7237ff3128226e3459ca99ddbee16614e20a280aae846d3e77f146c0c8b5cc3bc4fd4e0f5197f981032f69c6e5a46b8e137ac88a2e766280b44b77df6ee2300c654470dfe6d0eccfe6cced918cb970e219291b5e56a57ea3eb88f2a5847f037b7d2bfd9414e70f7af72f1ee45df6a33a8079765c90d2e2fad7c18fb58412fc36f254006fab804410094a06ed57a18f094586aa826fda6061bb84e79d5230a1368d81fbb5eec0f5b2c0993184d514ccf7b40797e298401f6b8d68cee0a7ab92fc7da09aff653bb6ce2eb0b02225a1d8bd28d40b1a642649941354303d52d9ab9d90811ad0d96e921d6c94f5ad481d60f7e19bf0a441d984e4e8eea5778bc3c28f5f9e84460f6784328dfc5f1ee7c8899cf56c34ac9777d8ba93498eecdedfdd3adfe9a55570a62ca60b5d59d5a5d12caaefe1baeafc6da1d266f96b04eec5537c110f2d85e27f5e9783626dfa16fcee1dc6472e164734d2fec98cde5d5eed029a9cc9234121a5321774a2ca58f4fef63075f82dc460cb360ed486bdc41142ea43f54f04e4e938721f86d1f7245e897d3c3f236b6aacfb1632666455d31446142f689b70cbe563e920fd0bf69c7146081e1a674e4d5099bc6728d95e7104675a11ecd5792a761a653a90f9db035a5be539fb0dcf4c0dd6ab0458ce5a1e56fef30d80b4d1dbd08dad6c2103c8ef1057a00eb2d39bc986ada6405ee6c72a1b5ed23ef4272df878abc5d860e9d2574d3c9fabe142d466bc5c9d69fe8499bcf1ce1535cfbd04792bdc70372d76651b6f162eebb89cfc33bba072a033d616728c6d964e235841c60dcadc97cb402ceec69b154be13a16fc31ca2316555aac6eb9d39fd63aedf442ed9ab4763a3e942a6ae8770f2bdff836bbbe4329ec7a7fea4c6abe5c87245fc07fdacb4ac7dc0d62bfc8b3cdf14c207fe61153f9c075b4ad70a6ef17fddec4b0884e7c68682379760df2bfb4a889a008e61c97b98a640627abcd475798e517e803927a509dfa88d096d1dedfed7cbddc33b4c6847d2de8538a78ff1d7ec9e425bc315a7710cb9bf57616139cac079e3b62c66fcbd8b30101cea0ea8cde83e39bbb014566b4328f34c680abca74713f3dd085dba4eefffe3e35dd18ba3e3b8a82f347dd31f2fcef2afbb293ba26ce7565494f01509c89dbbdcb664de7dc53737902100ee0aa1cda82d40acb672a0715505d39e5379a7e102f33728ca9004449c25872f20b677bfe17c7f47fc5e3bfd7c8cd9fa8cae71a01b1e31fd63732ab39a6bba7a0b4e49bea50e8c166e34dd94b819a37ce7ccf4e68524f01342669c6e8470fa5ebd8f1d1f2ed603b687ed2dec51d72cea55010f0f8029cdde5543b82ef886d5170bf544980e68f76c4113d4ad8e735cacb0c46daf0aad974e48d010dab7e0de94226e07fab83047f5e7aaf079ae8efc298319d325cf126de72f9e2291d42f28b0deb9d4ed68d6ef94303", "52acac", 0, 948374926, "2adf36efa27080e554ee2578b462114e017b744fdf560080c214571ddd91f4fe"], + ["030000807082c40301b223b21bd5881969cf50130bb0172e1233c1eda15a8cc62a76fe882f69530cec0300000004516aac00b9d6430b02458a9a020000000001001e5b33050000000000b0a9b962511135290200000000000000008a577d040000000029e3fdc3d85aba0f8e559dbb2f3a8e3e98f6678c5e831d725f7655312eaca2caf9d3938d622d3afbb966bd0e84c9c6839f8c2065c27c34c475ddd8d3f33b3e3dca1efffbaaaa4749134a44134aaacb343f1879a9cc12f395aecb5d26f09cf1480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000031ae5a93d9ffe5c617a1aaab25d63c1fce5ef262d4530e95e1150b9a4a039785f01a876c5efcdf21161d904a9c0c5d8dab06c5166c200b27e385f8add83ecf5e462ecf6b6df05a3fac2ce9b709799d28f66db31c902ed35256f4b035d007a18a8d6be0aa3eb622ae0450eb5864aaac640cf9098ebd57f127b0fd3c00eed9bc960319f9a47906392ad148985f3c993523b61a0cda39e661c4ff5edc4e60c2b8939b021047528a738ae6af7d9796c5e3590653d68c81dc7de64e9d305a41b0b7a7c3e80b01540bcb9efd7511c3decee5b9427d9788957e4403839d2ba1cd095cc53798e60b6c495282acf12d94901d8b026323760279ed283ae74e3bb91bdedd7b6c16f6031bfad03373d3845a08689680afb7c2eaf8af230da6270c53f5e8fe07d786fd35031f14c2f26dbdf640e256d0aa6659ba47feb8ce945e2f2cf18c3c11d98c0dfb3a032dd2a9908ad63f4d5a65d711036465f5ecaf2dc5e20122d413f5a6fee9c255b9033016595f2f492d86f72c270da35f228d3eba01ebc5d6861da22b0f138c3081cf02049ed93a877c8634e0bb9c37a1ea1df4c5e25d94f1492be47db337dda226a737a72f207eaec7618b4bb3d7b2aa3c1856204705d784d67d9b7be98088d949234c79f5940911909798ef8adda60bc0e730a8eb2f670df53c7f3845f7b42c9c06e1dd9beeb17e71f07e31483d19978bce4f9113a7ac0e164ec4118ce44251185dbee230898cf82c904aeca718016ba98ba804b925e900474d04a6813650d0f392b291d8e4c265a9337df83602e2bc21f6cd15fd22b7d235d06d9aea0ea50978ff6f0963a252172396d105949cf0a02f2c828ce6ece8ed3d22e6b2f6fb0abd72ff463b2d85cff40202735894accb978960329c207d07f42799fdd0136aef28cd1c8a40ed21382755d43897bbe54793a122e110aaf1e937940c48a24d8f2f40f0fe12fc4e0090b01fd17502610d589d85446d5c7448cf9dd16cbef9d71864cc32ceabf11c54a6e30e2b90bfdce0ba57b1e15999dbbec83cf600571b2a4a77da04da676e198676226c5287032d6c33837c5819c259aaa355fff56bf255dc11ae38e74f2eb2ddb9d74c9a7b93b9031bf2ae849f1edbc7d851ad9a75daa257e4c0ee0b2128c0fa64f5570bde487aeab57206f0584e6e3f34e6abdd4592ee97606dbd665b8bf1ea7d542b57209f16edd4b5d077635af7b7737ac0349fc706a57466bfc46239a5a9b06afe7a618a453bac150044cef32379e306b39fa5ae53789c5e3f163b5de0a74759567d95237ec4b904a3737af9c561bae9e6ba71a1943fd5e28b7d963d7b9997547163f726ceb1101b98d230652163b58419771b929ecf27325f7265c735aea2e9b737c7a3f98c967d42a040cb7b974609691967d12c7a2092a41bcc9f98072c545c6e3f5ac58cf99597da7f6128a967a85e5d6a408d8599173e2c42952dd38dbaa6c21638ea66cbf0537c86f6f77cf979d4396cc236ac4c059d653f07df09b46d5af0bc1ec29b4e59ec25da3c90ae6d21836f138a6dc93cca30cdf8f0332eac787626cbb20f82e30f4564eeea9b400c64fdce6f858b653d20b4dfe4708cb9f0fb865f74f8870330285642f81964cb9cc37998096f6ca471e097bf6ba3149a6994c4abb607166c3ff9702c39ede1835dff48c26fcad04f86c747cd899e4c24a6ba9e1516229f0837ed7007746f4cbe1e736060ff1dcbeb4e66f4a6619ca4f648cde4699ea1bed9fed8e29b7ae8470eb61f841571ee408c65df44e273cc12731f98067391232472c1611ca3bb1ac0d305444f00d74aacead7821eda33173e1dee40afc19b75f0474ad21363ed8836887bc54266341b1cdecc413904537a91767863ed031e3f41b99e538ed8143e8b834b0d79669d1ce7ae26ff0fdd32c86f710b060496cb6fe5ab2857bf66c79a030e1d74791cdd146f78f1da478fc05420b083e823727be640966d02828327ae1ddd4f626b5a790ae0f2d919a9546a05d100cfc760a8d8c36b282c320c54d026ac9c40a3e34dcf38357159df1aac83f4e213538a920ba516a6033e8a960848c45ddea54eff203e99fa1ef56d3cb4071b4e89a5958ace7008bf12a509e3ccefbacb87a3478f625a351619daa2d987c56462a4bd42952a83ceaacebb61868481180682ccd6524d28b747ae4274a5729bb89d233e0d255a3d2655f0df5f3e5d087aa5811b4009d2e88936826497dc6a0e73497a621c6f867f7ac6d529d469722a39c81aacac905d01981fb8ec6cfe1341b835f57edfc37d49884707aebb6fdd4311f70000000000000000a5d0da0500000000a60dbbd6010737e1dea90e11385fe67636181232516facb8fcf2428299d0c6b69eb5c4b6ba430849280f67c7cbd9a4057223975af07ed98c8d73164b011e125889cda8e2195810fe9f4d018774e78cdf8a39da57f96dac08684fe28804ee3f45000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005592d13c29617b2feb94e779d6fe32ba2f626c060f7a17d3d00af7227c6276d78b832541930e1a0e5f04268df446916023a74d44914fef1780b5a1073af89944d30f3c55daf9f3ac6696a00a33b73bb47b015846ac55e2aec54f8597bf2bd4b9a5589168f2bc8e51d5a63f70a6c5cd6f0a99efacf87c898c3290b5642f85590c03152da555d4550ebeb964e1669f33a4f40a09286abc94d87127dd66a195fd98d4022cc9aaad0f28eb8d6ddb8fcbdc4cefaeb8473f21e7a688d5a00ea59e8f9ecf990a07e5b555cabaf2751212befafa847c017491a2aefd2685dc129686c8eef66df39ae5fbf2c541d389d31db1291bf9499cece43b0ec78b15ec9d4c5a495aaea3f3030fe7f25e25eb3bd5fc550b11b2d1b43e5dc513ff0cdb0d999ea942d9051fc07b0202bce23f7edc4cc9ab45f1243ef64ab3347a5be43abe1acebd055331aa88e867030bf3dfbcfe6fffd7021294894685c6f1ad74f5bf83247e6f374e02da48d2a05d02259681461e245536f6a2bb7a10f4c4a031728c5bb39101d7ad6d81a31585d35b0301fed323718c859a5446b2a2f34f06ba2d6916d0d2260b37c04e30eebf44cc389afdb25e152229959d647587bfaf82ca1c6eba89d9e3379daa6233f0620021fd5a767f541047ec7fff955f09bfa26b71ebc0794dbdec67ad4b1e5d4182cbd10fd07cc559bedb9a43120b1618492c02d64316700905d646f20d7cd4b2fdb114dddd6cd72ce34c063a9d438e5982e5f10d1ff1c92325c0da843bddd5f4d3d377846e1a30a462fabc7e5984c96036b73fdcad2831a595ea916cc50454f02cc227843bc92eeef056ef92895122ec3f81e172404ca4f418cd7d42341d60d56dbf3aa40f73866fd01a4bc6b2a54039e6c0999f8decb28d8a19f0e34f0a8ce4c772aad54a803f77ff8b54e7d1a963998271655b9deb976172d1fa00e8dfb18be975fd008e967c0929b57c4856658962578ee1e2f9f1b66158ec372ee04b1536e1edd2aa1a09d72a3ee96f72e5af50d65bbb3ffb13b6918304caf48515dd19a3bb3246df486ab6073d9f6e095485d54f037a8339092826044354aa0e070bb46fc68ded7859d508f79dc11642b6841378c7254ea016f8314d48e88d655488cd079edfd1d140428b7c0bc731e156aa38e325e77fcf7d7407bece45b8ea106630338fb64db57597fb6ad300298bb861b60b0652995f4ca498fcf8a82331515d7ab1ecccd3e91a071e61eaf27436b600c891b79a9f1631eaef3b5fa21f648b58a1ec57550f33148c8bd8eda23210c9d42c09a8c5841b857f7cdc9201e9b87e3661fe98783e6deda7234e1efcf16f6694c31732b93cff13ff5459b90c392b079b618174f6441632a50b304e7df5dc6fc234f6f4465fd9043e405f02760dcc539acb452efef9db8f88c07e21996d770672069527e31fab6db49806c2d4056125dc9f9f321dd76520187457f0ca9bc0e3b03e12b8d5a27c9bd16a28722749b17e6ceea25dfc227974102d164d40f351a52e02e18d2ecee74227a35ee68f6e3cf333bf2201015b96c94013861fe2380df32795dae61b7eaaaaafb1be1a26200af474aac4b5e23116bd6aecc3571a1aea9c623dd11bd79a8ad57c541aa12a2976ca114c7a43a3430ea56c9ead83965c1a57327036d040f25e98bd3d26ec1ad95ae44e99d7245646f2eb9c32884bfc9f4d325e0744b3f1627b4be2952a2e98db98be34e5bb485eb12fb84dd7922cbe57ab5491831eb265fa24c901f73d46a81ded4a345ab15f77a04690380c0919c21e44f59023a17257823e9eb34d2a78a2a363c0362198d4a88b4126001492d8f54c7f24616421615fc7ba9e31b8fc18fbc2c60650f445491fe0dddfc7dc01b4d5f53b824b1438bab36832fcec678b5a7b2f87501b4f8d52594e0d7d837658bd832dd7ce889e8a2f8a18a8759d3125b568f7e09bbee081e0a2824b030b9a20a928006229185a05f8c9ba06a2e0c33e01444f4d346a88fa22f19719bc5f08c85c76afc58241e916b4e685ced9e66abf13957a63b4e3a0d8d7a456103db8c00479543ad0ca34dd0290e02e111f4366df8627fcbd13d5c9c04c584efab416d08b5185405007a5f3c7cb843630841a6d43ca307269aba2dfd76c458657500160f8becd2edd3057f04c1b6100e5f3b9a9a35d15a9c037343409470d3c48cec136de207c89f443ae06b11539d2ed3312d0937913220a78f6b698a25731ecf0719001ccd71df3677bb294207ea8e540a9622d7a91c5d29d394ceb01f0efb9e1db722bc06382c4f52fd69e77cd33a2def2c73677215ddfdbcdb65fe5976d0f58b3bc598a07d0425dad13161029e716e47727e05ec26ec107d1fc7911cb88d69f47362bd44c519c370b32c63d9cc5722a3868446e4e94e3778ce671a7514fad1dfeca5ce0a85f979da8b7b696ccc423b605", "635151", 0, 2089465780, "f9a3ef9d0cd1ee76b7e401113bf2bda81af9bde104b3c6265a49e58d0f0e348a"], + ["641c631301e1d3f4298846296fa27fcb0a4fa19f7d80053272cfc16c37a2ff8a98a0277f6302000000065263656a0000ffffffff042312b60200000000045163ac52a27d66010000000003515200a5bbef0200000000046363526326b664010000000007636a6a52ac63000000000000", "acac5352636553", 0, 1492925181, "d5dae4f660587616630a83517d74c53f7dd633dfec2f56b08147eac37f5887fe"], + ["f63687250112adcb84b21a056acba36f9ba760a8971b6d5392652ec26a93a6d2323948b8dd0300000000ffffffff024260f80000000000026500d015bb03000000000565006a65ac902592d700", "52536365", 0, -1593759497, "515a510cdde5fab483323bf1894c8f59294ddc10bfd2a117b81f69f18a55daae"], + ["030000807082c40303cff6ac00b90fc588e5288a1b63b02dcd9b1da62db7ff598bc806fabd4f2a86250200000009ac5253006a53516a52ffffffff98af629cfa00e5b64c1a3ee2d44453ffb52d6202529753bacb7a6d673c4f683e02000000095200516a6a65520051ffffffff80da121003148817771fb6b40ab307f981d102322b22e5d9fbd5974c60f3b2610200000006515253520051ffffffff02595ca6020000000008ac6565635252ac6a5d07ae0200000000095300536353655100ac02fa382b0000000001e0b8e4020000000000000000000000003c66294e8732be9f92435d23958c50b09c389a5c603e197ac58121446b869a6030def15f900ba7a78d6e58723a3b33683bd88cec1d4d43614155eca587498f3fa4722c608b311d3250105bc3f0001355e0e5db30707319bac2b2edd2a213151a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000163a518b2c46ecffd1e5a5e32d92202b196647fc4d8096e349489dfd2898bc1bdd12cffda8d2d7075e46fe7f0a8a7e01448db7a2a85c9172fdd3b06d2789076db7c362a35257c28446046e6c8f5a46eece99ca5d4347972a31ec110f261cec3fda5d6b567259723f94f9e305505e8aaff52c2da5c24406074193dc708991d1f0329840be01f0c7e1e73b72e525d359f7a2a98e414b9fac4d5b2357a95435881c10207e4fa78e1633f5a2c117ade9217ad59de17d13b164542508f6715bdf9509e9a0a04c77a58e5d74eb469899a174b625ea663dc6a29a14d153a07e2089aa13f0d81fd275f727de896eb63a28d8a58e5f8744e5665c188b67751112d16caff5abc590302730348a6d624c628a5a859aacd44b0e9b30cbf077ff506bf64261e0324843c030168d3311c9aed837cd0de29936a4d3b9c85711a07fc2d7fbaabcbe1969040df022545f21ac092f5354ea8574d1ada9e9c7e07da953b3344ebf6f7cd6db7b631fa0216394a7361bb7ddcc36142b7e92876c18eb86e976b161241ee6658af938833c3031eacd0de39303947752b4641b2471181833aa1ecdf1f626c0e94acfc97af66cf6bcbe79f7af9d1086528687a8930d67b37b3904b9c6de9e9ca285f94238c732de95868fd19506d938457ad82769aeab514877aeca6fedb1e64c66bc4985efaeaaa230e86039dae1ae32112f0743efebab7bf483fddddc4ac4bf6af85954572e01214439396abc02b41bf769f9038359f687de201798c2811de0c987348dc6bae4d120caf389fd2cd76a790a889fe974f120955bc58c49a9d4c76521dead316bf66d2083cc61820bc34e46a7e47140306a1dc870fa0c74c2d65e4131aeccab0e9c5bdece27f84a11da3b1dca6c8176d98a756bf2a1c2953cfd4e1af4cfc5d430f3249969301598fa4bb180a131d24db207c3b1a2e5487a9a9b8f982521e91b716637a2dcde75304fd0e44784577543d835911b64812a307aa11898280697b33e0c2c2cab7d4d3f426721db6e59ff5274368da9dddd7364e933349839ea2c386d437ec489f4a95dde66a0dc4dcff671472878e4d7911089d350b7718de36d674041a2fd2ace6942390c60d442e57fb89f5fde696b565d6b96f96061812979309694cbba5c45d68a80cfbea13f2d50f0ae7ebe93a4899789f1399926064ff69df02f47e92a04822650234eae2a597d522d3042ea92d0b39244be8a1446381f6d3ab130e3cf80a9068d3f1c3eb8dbd9d564dde830cfa1154f39d11f5eeeff051f1b25e7af07e89ee9eebde3e29c679211620157f53fc32d9fdb6d12e705b2ba9c5962ad24acb361c7d053d51f90179e3d8e3ac5e9ba09004bf57eadc00c2ca6a80a6376af000dd851aee2703ee302bac10105be75c31412ffcc9a262bb64e328650f55d12af967d2c76fb4d4d713f0f95aa45094e78ca308470766a54402007a382cff1a1ae6ed63f0ac78021755638a6bab4a7bda32142e41d1063153217cc00d025a6bc8eb650792b47d734f0c620decd1c79be8190049dc31a7febecf45e0e05aa641d894aa7d267c183e516690e8f818a8c62438e92cc69cfda93c79da14eefd03be8deeb9fe72553a0de7e448d309d78939fbc3816a1083eb0d46f3e8ecf43f3f440b6fe2b04e407cfe9a98f2b6f232136298040e416f38dde6382a2b3f54a4cd356de2659888fab2987cf11e8ebce133e266038d551c93891f579e84116e64b89f1b2d3c5ab97edb3347a99e6224ce50ffe5e9b84f07e59b21169104b0eb681defd2fef61de81791e5886d4ba7e464d649e092dcdfa345f1751bda19f0a133dae2dd49de9dc00b6f60a78e7239c97ad91b63076f21452ea98f05a2490f41179a39432988e590843244a49b4ebcc37325f42499ccfca856ad6776b56878482df0c15d045c4422bc3ee5432708b7f04afeac083ce6eefe5e954043f47ed96ae5b1aef2ec34ea1605dd006f34b158a7ba206e3c7b575295884fa30e71029e5f5348f754906aa50a2701f547bf11e80974d84043ec74dd00e23d7b48a76d7ebdf8d9d9344727ffe20378af7a8613438c85e5ac8584f92a70d35aa4a133ceb78ea5694c681e956819dcc997764d5c61ea7367f0d41ccb229207237cb75eff0f2ced69e4bc7a808d9571773717a5ab9e1ef5b0660d2b264567642e5642701aeded42cd49e33f1847ddfedd92cd58483f6f691a3282db2df1d52cba1285739b1d2255325f11fbf97fb590048c1f547d75fb88b8d4bdc16d8db94793d13b233d5b6437ed322a40f64b3bdc0125c89db472163fea7e2b65a0d782131d7518192b3fd46bc2f758926b1d103ecfd8b136e6459ebd333d1b669322664fed849e70e85cb2f62cd56d098241278a7674f4440e25c4ef6578e28dd705909399acbe808ef5a2d4e55b91e92d58c78d532dff576de335498a05", "ac655300", 2, -979495989, "3fbc30e8e867e37fab2dc2b79bb9ed4013ff512c58a8056f0c4d37ecd66009f8"], + ["030000807082c4030428fb5c58def105d96ebf845ad4151a2f2612ce6da11861fc82445877f67e90b300000000086a65ac6a0051536affffffff5bf6778583b290a7786431cf476e5eed43322aedefa446b115cf304718288f9402000000096552ac63535151510035d493bec043c8458b999a8a2c6dd5802a9fb58451d264bb668fedbd4f3005223d0fa01902000000036352ac6c1dad08dddab82e0686f7eebd2ce8f1fe53032fb8029025453c4af4807b24069f72907c01000000056aac516300ffffffff0155ad82010000000009655253526aac6a0053021e2510000000000300000000000000007000950500000000f16f6f1264767445c85cccbe32068c189886897d261e18f73b4736a797b41ce5240f0dc7fa64891160e895616cb548f5f956b75ea1fb10ac47589223e5a0c6f3e606e51110afaa3a5e1a03e0723cbf6df758f81c89f4584ad8d1eb631be3bbab00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000119b27182bc53bee67e43e5869005764ef3f10f461c7c3bdf21105869d1d4bb60d14b3cb290707d6c9c75499328f430b1dcd49465bcbd239298f6c590d5fa1773b16ed26aad047a5c0b8e1135dff4fce1a75cc47b22bda936f77384181fb58255813570d35a1c284bdf6283884545e1cc49a4e3612eaccda5fb56cf99628ff6102278b25add3cf19c56760291330b4fecca477732de14910fe904f25d38bb26ede031bc1c83ac8afb5a6796bd9d5bd3d07c655b0f21783fe8f5a0cb6382adff392980b08ab813734cbf5298bb6c0d289ecbd7e06bd8e40b6b71eabcecf1b1576ae2f4c38789a965ffcdcff64b5a063150801807489b3489b2cd128ed8e18daf0e1a8740224a70802992f01b88b00c897f54cf7919145b8b69e60dca569b582f92505bd8603112f958282c7f67f2ce940f6bd889336ee84d959d04a4c23ca16c4ade422264a0322963bdd53605b0a061144837e13b69d847c2fa1e5626bfd580d4d3f33f3e8b1032bcc183a6ed34c248d36c7100432f6550e22095849cf9f8a383c0c3c69a06d21021a8b6c49c0c442332629299ecc5729b4396e5da90d5ee6ffada121eb9d28cb3392ae954b5abc83a5e929688efa38a9d8e13189468820ee01a6f4fa0c29acf787622bf0819acbbda02fc4d91a0cda8548b4c4e2cb24fe3d3fd91485703c7f0385ef16b1b70924a477d41bdc394936166cf3eb3981f10b1ae6816181cf706e1272b95aa66f607f441936790b4ddb67e6551a866becb3eb2e04faa268f95c74c80f9f537c62f6b2b28087cfd07ce53305870a976462ab29e24a33251d9f36b4dc9444b2e0c733056794a80f26fa6d8fcf337efcfb14de0c176add217dbe8fff815c3f503628725cd9ab2eabbb3ccabf4d5391eb61820d657c56582bd458c2bb5cde1bdfb18fb9631ced800de4bb1d319ffe8bd2e53b0f874b0a94048c09a6540cb9e04611a8b280e8f14337bb65b69ea0e9aa07c04f521a5ff62366bebe2dab76b7e0a61810af73d2eb881b615ec8238d93aa29bd639820bf48453bcf649d5153c87cc61e85a39854e1408672223ae259d1955f280abf24c0d0809ffc088181b592f78f89f65aba78528cc716ff5191d125bb80919e069f3fb2e1ca7ada62ac12cf074b4c4fffb856694c9ea73bb964cbe36e49d4f96ff7a939cef696b2399083ab787f7e18b39b202338bcd5fba1a2cbec0e52b6c093f085dcb3992a1d44e5fd650ba4338de945820a0bb50e534e81cdb19024a3a94d86f3f3e314714a60aebf5414d12634832f2947f32910fbac4b617753c49be1a02a28f5ea630feab80f22b5ffd6ef325c39890bd1c47717b3c082c4f6ec731a4493e08dad91cad1bdc844abda6ede5016980b618b84f91e7c0e331d9512688273262fa0e9f05850f183ff44f1dc31dc7b95bf73aa9c29a15ead653d03328c3ac73fad04534dd60cf4ff521ff4c0881e876a1c39f833842ffc78cb719a413ba70baef38a70e739726d776c04b27101651c97c7458aa36aaa95d48e765f48861451e86022fe5cc485156ae3235f931aca02f75d2e4e6a90a0d6af60d7fc160898ce70d2149d8ec9a5a1ec9605928c6932bc0bfe961c34df554f9c6795e9faa52b729040976a3dc28f917f634f61ed5f55c1844736d65872f5b436bb880efa0cb6dd28d0a2cf03cdb8bca15dce1d498037d1c9f452f77bab7675ce0b462c57344e7b225fed5d376bf4b3548dfeae051ce1ea26d5f872f2d9a9b26f4be1a5a616d3528aec9f02c52cc7e0bef9963b2217a4f29dc050356e691e000f8a3faa21954ec7d47000047f548041813491d305b3ef24fd1dd3019df466d270a7a569e38f3180d54e578e18c8c8021d2d5523131be8c91fa336ab269433d197df37119616bf838a85a23825e79163d43a1a9188de006f44e93be7f010bb4f0eb25c8c9e58452c3ffb9d27dc3414942ac040251debc5e787435d4e9ef6fa2345cc799ef872d9c8f6ae749028473264d6434d47bff35872d461532cbef4606ab7629e608eb72500145225135e69d3f8059116d0dfca19a10ef943f2f3795be1eb7ebb7a643e4811a8c0a990ebd5b04f924ca2b49c1496ceb2fd66296735226d479c925e9752610bd52afd12600ee9d46806c681f858139716da1f24a666f8f065f7b5a338fbe073beee7d18e19d32f476553b49271c8a625574ff18dab2412fc7a929614b4830585623230b23cabbffcb704d9fe82c4efc8994feb0ab803ce687fbd3bdd4b5da5989378a5143aa8a30d4a8a15a11b21ac8560e69d1f4925171ed634498b900000000000000009dded104000000009c35fbb4a3e976f38ee3baa11de72d1d7d005ee64d805dda724f4efe856cdf8ab2b0dcbd5ef3223096ba6a8d615a00ee44a15895fc435bc3d3a732fe45634d36839757f407bc031e5fbeb58b1c927f56c300cd765933dae84fc636002cb3b0f100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c32c03fb0a2dcf91cc73eb29b669b0cf153a155859b577c34296bdac4f6261c256e684f0527fbf66f90c82a05bf6b8271b1a428ccda8f45e15f0bfc739ab3c6f2c4c0d61a66ea9f4736b892102419e368d6dabedd11f30df65d97b97e3f561986505a80ce1d53c65e3c3eac830fd7cd8af0f7516a2dffc447230d02ebc87337d0200a7b028177054ac8abdaec8177b2d424d95661ae7a2ad557dab2cef52ccf1e8021f07cc7258fcea3812e80a99e1ef7f9dd09d800c33fdbcf18bcb8cf24f8e884d0b056fc453f6d6f5b0ae466816bdffc24938f0c61334ff86b839499cf465f4bb1085592d46ed8bde3c9f8a819af72b49fb4205939da2a4a49bdee3aa7ecf073271031b5cefd5137b02526d8089006c694fa3ca72bee4f451192fad15326e8e54156703073344d96c06923e8b723171dbf8f6933915c1cc06026aa1beb9f02a8330340a0202a1202aeee9687addd9e4f719a61465af939abdb5d46abf70ecad6853da6d400325615c7bcfadeb604018d24ef1e3b65e327d3be30292ead59fb1316fef0c05ae032d8808a6f03c603a7eee39f28bf43b43f0d01910a07e300db5d6d8915d3da70631db86aa2c6a2b23f76a77ddb3011db2764e47782b80ef165af0e45287de0d5e340ee7be17bb0d5f6f8f7b0fc86e9120ca215de1fec4ee114c37694a351c5bfc9dc6d3324ff199626f59df10f19da4941d7de30053673015a9aa83fb9e3d562fc79a64b1e1f8b8182b66838aa07bdc9b5024fbab47c706e696a96067a19009b3815d30e70a7a75e26ed4c51676942e4eea9c83bf44159b8319a7ea063288ca06ab3f2a3b6be32a9fef291bb264ad66b79dc3c68343b3e426ce8341c626d8ea96b9eebb951a5cb6425283a66e5743d3252483f529a0b0cf6ce1bd4977b8e73205bd84544adffde7d58c7d4611aaa5d9288e00d824ffab8f2c5dd1f8ec2d7c96f44f7d7818f66c6674502731134a63206867d14c4d29c14c25cb39796242a5965a448c977666d5209d13231bd549495e5e7415c51fc23d9b335cdf86b26fbb5f77f8a3587509a7940a461b957e3eae5e3642f0ee21718750288dda5cf6786c6899f77c16297fb59f0a08603bb6d6e4f6dbb1bea288b39941e69b498572809cb6bfe5e13930f3751ebf4c6fa9dd9d64d0db7afa6a3eeea2239aaf2a5ec12ed2a0862cbd62f74a36f27a3ddf50858f1aa183ed0b72ce87e3674d50348882629042b0e4dd4f08bf21c6d92351f4c1ce388a8f748f0f0938ecae3f3c28f85d0b563c2bdbfd9bb55a30cade16fb86fbbce6c437a8496885380b6de4179a301aad0079ac15e335aba79609d885de0b995ca80dfbfd1867e9d4f7ddbf1c206dc6442fb4761282da8d2773606d8c8eb1eac359de1fb6bf7832b250b3ddc96c18df456745fde5911aac647afbbdde0938a0db13df8c66e62771a3e6add0a034e7b022327ad7bf07a44871921670c3c1ce052a8620fe10ee44a869e17fe64e33cbd1b8ff93972eaf9298b56bf220246e8b09a6a1066ffa54579bc729435e0a1cb41414137a37a5a14f0f1710dbf77ea5ec6d31b15e1512470324683b84fb5ffb217c488e54f78c034917960dbf0ed784d2c70d55c6b293183316b8628b03d6e99b7cc016eb4f94bbb049879c4dab948ee078ad0183c94e065f4626594ed36bf4abf9b6492555905ce60b4792d982ea5f9197132f1a0aa0fe39357c4671561c40eeb44333f5bd8646514742af461f03a98479717f7d241cbd7c02e11f687dd68fd32847ab796bbbbe7eec49b463e6f187d35dcb93003181d5a75a9119547159f5cba1928c28a39e978fbf993fefe498f58f549fc584d6e781ac97e001cf0247fd4ec1bf8da34e241bade0682f5c7ee7660e978a728968a0f505efa895a4985b6d4168700ddf36a92bf959b1f6e350a4dae4cd1ba07db7da55b499a3cbff50aa1c6800631dc915509ffad89fb31bcfb5aaf50df96abfb98eab836d49280091858f569422672b5bff9891a77d954927fc14aedec97f20da5f4f15bd4a799513ee12c9ea107b59fa52517bb4ccff8dcd628f31cfa9ce10382b5629de3c93eb53d839cb17f30c48a300ea2bd6a63d81f059561f5bb0a75919f9b34446d6e85f462b775feba07f1f0521d3b2890108951b2568f474f54965362bd22a23d8d9e3b305d9528fd7fd1a118d18a419750a4d06ad6aa65e0a878958bc7cf6a2d0b46db1b9286cfe395c0fcc0927da81314b0e82eb95883cf99b2a0ecddb74918eb88a39477d9bedb513b11d9182e42bbd2d77fd807a127fce7774f9c7650000000000000000963aaf02000000008135354e7e55543bd8e1fc81fae21ff4d00b626bc9df0b6edbfb55ef989c60261d3333fa5c127486aab6edc2156d6f489a51a050766d1512600aceef53d4175a8b22b7c6cddae4c1d65c20aaa40477c61c67ebb12f8441b98db2b270b0da529d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000047726b31d7dcb8925278bf97cdd37322d23da3a7f109780ff5a7e856410a49734e1e5c8f141064a6516888771e8284e9ed1bbdf68dc2d7c658a0e8c3a2e756a763b7b98ca6b923d1e7338ca84b20790beb06935b910404da7c80851967a57ca06f495e4a253441ecc2b8094f5f58bb501fcae3ec5a1cdd55255cd1621a9d2146021c105c70de0d1534d5a7b015eeab78e43bc24cfeb483c32954064dbfd575cb1c020c0a5f8e26269623cb9011a2005cde57d5fa54f440311933999bc19c7e8fc0620a0825bd61dfd6c5b7c6c69dbe47f002152a79c48248a0fb43310487a3e486a771cfb9a1826c08bb48b23fe7bce0ebf05248555d76f24cd4a95235c32a3be3825602293508ba1d8f3c77ecfa91b4a9565dbb293f178e6a39002e75c0b2dcd848e41003030446d23e53d08fbfb5cc9618f5ae385f8890d4198a21107305922e75e27f180224122d4d69c8f2c03a1f59b4e30700074dbfd9cdf2c240da29940678057779f50223374fc18206c6d02db728deb26a8ebd1373e5b1279d77555c2c29b9167bb82f031db3c9c754bec9e1d73db0a7be3f1167d5471d651bb7ca8fe025e16dc1ef52d285675970b119ac3a7e70b9bba39d2de91201bff573965acb400da4d67280d350c405b06d0a7d38266ec10f9bbe6c3339e04325fe5c02cb6e2a292e64b328d12e9a04b4b6ee41f64fdb8c9526a0df0c919158ff02567a8572fac7decc1a4c29373057f2daf687af85467f39302602a63f9faef01e902e56e8baedcffa6b95e425653269dd789b0a8d015df66d0deeec4eafacf4b5091f49559467358b45a36a096db592de5d3140edc4421f2ae6aa679eb98fe09ac9a1ea8683505acab5d2c8591da5461ecd11a185a1e9f3ec0c240c9111296153c1b8993d1ef47fe2c57ded80c0e19224841c802e4b8877bf44b257ef5377330e95c6366a49e36a6963f17853a6baaf5a3285f3d10070dec33a7d1e4c00a0258f5e2a48ebd59edc47beaa4ff8d03337b34911b67d41f808d33c609981b68bd07a19c9166d55eb820cbef73e5f0e5412b8a33813ffbff94a12a25d708939d85d95773f7209a4baa6bac58f45c9b75184ba84511fedf99f81a6415147db1c266a38e13946648d6d8749de346d13048934472886d85af05a927858ab434a500302658e49a890925bbdb822a103663744680cd349931bb376c5dd38a321d726f9e09d155c7778bea1c59f76d0713787810a9267120080f980509c5891ef9a56af3411620b1fa709db2d29446be35602a2e254465f9ec429597cf2540846c3c06594306235ae8ede049152ebc1bdbd8f46be7fd8e4b682ffc898e77436925729e7d70b10a00fd9e1aa95e77a761115911512a911ac3521704d135dba606c7d57b3c847aa924e9aa2b58fac56d5afedbde8a12fd3ff132096fda5fc261f8f5b1b8a34f7a8fd1ef89d47787984aa8d783497dd6c8c0b0ef2fbe91e2f46689b1db65faf662ac9e24c659c9a4d4d4647c488c31d4de7a80a5ccaca1b2928fa54577797a5c37e1848a6cfeb1ca9f48971919dac6ce21d8d75f7afbe3794b9488f0f761965b904acd3624c6d4f527e46e9bd4661a3eb1c07dd5d708fa8bfb1dfadea90edd392f39c44903c43225bbc8320861e3215649b4b97dbf63b89ca9a82317d20697d1e828385e5d96b959ed687f2ef288638bd497c0f1023339a27ef24ee1c52a2a43864f02a90daf6657c9bca80bc8aaad21f46127e8d014a20d0af23c35f80fdfce1baa6c0b9a432c332767250ec846410314fbd69421ead815f9d3794c06ffab1ee8011f3f30b0923413f8aeb97f69a85ac9c9b270a3af39ce7325469701b4d21ef6a5e9e2f98eb5ac5a24b484205d391e4c209bb26f323acd70bed6f2366095859153b779529a080fcaeb2ef2b580e0c251688bab1aa5c7581999cb762b30a7cb09f1bef5b19579fdbd30f526d91dbe7f689a925033021a66242cec416eb73adda8f1ac02c747aa79ecd825bd13a397477278e61e65105b899a889bfd7e8b16df4b4cd46118bbc7cdaf802f1abdc3f0819f1d0e51856ee88075f087ecac1bfd3cb6653af2619ebdaf7acf95939cccd9a29467ecdc8810b74b0ceee4a57ba8c42bbe666ff07cf4319f1361779b9769f023b9b539fbf29be05e4a07c1c7b601b8ba0a8d06063b9688d2fcec756bffc1395dfb7910fbf494571778005d496a464b9982a010b8896cc337a401cfd257f08d8deec2e8c6023f0c5dff046f59b0d12f4570ae2a34a9c3104d32548ea45c22af2638e2113fbf4014dfdc2e1e0bad79b5db6eb25b0edd2419c9e5ec37ad8d68997f2f06dfd3b5833b9b4585f32366a98103696b84e5c516950d3a28ead009e39309afc2a7b134bc4dad8aa0e3fab3b4580ac15de5dcd396e0db5091b8d0d1f9e82fcfc0931bee9daee119af7716afa0f", "53536a635151516a53", 3, -1636258823, "97c576abda16be6fb79ad1f493c8d957e122665201dfda1eaf41b05abb215db3"], + ["ffd8907003f4439c737addc24e52a10bccb29bbdf8a54ae39e51c6c49f66fa3c01696894ba0100000008ac530052006aac6affffffff0a6a22625b5eec41fc0ac959f97aea96f09c6352cf55fd9de4dfd357bfdf0cf8010000000153ffffffff3e360bfc7ebf0cc0c9428662067c42947a15c130c3f2fc0babb7d94fcf99868803000000066a5253630053ffffffff02cf3cb00400000000026300e2b58c0100000000065100526a636a00000000010000000000000000f6178702000000008ce20c3b99d3587170ad3fad0b3f711e3aebcc2209f8adce390cbeee400abe26397819001aa478910dcea3c84af46bab8a81728ec20110b5b266ecc337a39832b208f2c291d1da1316432f86460ccb0f59c2533f232a2fb6c76ffdedaea1a13c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004f0e0e04f62d4800ebcb36cdc2b697248bff780f0130c57f8a2fc03ce77cc549b485fde09c942d52783b45c2f68da7fa4167516d77d2192267df3bed6318536463ef7076444084eae7a9f1deaf6a43334420a80dd5490fb69c84e7b06af15cbe91cc75c3bf1a9ab644a8c90d9b5ddb74f71e3f4c942a8be2509682e7b05e15870229e6b5fda2e30793e1d02ea28ad74fb021c7bb6eb116a48e6d2293cd9a055fcc030ced5abb4b1ba396a8a9b6946dc60f30791e775ee618b697013733531a516f470a04cfe655df642373d571131aa34c8599199fc51cb278f48ffb1534581e434244923de5663a2d0b49e28a50034b69d2ae4bad3fda3bb3ce99041bd07210c7d41f02135ab0a9491382f25496c9ec411f3ad0b92dac88579ff7d171942e78a583fc2d021125f9b553f9f8dc7e0983c0a5cdeb4c713ca62d293918f08f6959d8f7ef064402122087b955e021f5493fd2c5685241c1889ffc822eff48ea4b4ffbd2a6d1cebe031eca76ad5d83ee478acbbec3beb21b73d5022603d17dfcf8bd66908e1f3e5fc1032853516fdc23af8253f471c7e152daf10ce8c50c638bfb8cd01586f1a90f3e3c921c5beec25ce019a76bc6b8093f051a9cff3fbe0191dee78e1c7ee63b83c7b97461264a4f8dd788b958fdf575440f5ce5ec6a3fe07be565fc6a52e9de6cb55481bca36006c5ef4d41d372aaa8b72ebdc73bdb7e05ec6984a66c1ef2727ca60f0dd1530714ba2a6fb77042adf9377d2bbd0d2097df7ff74d04453d8f7976b3857d3e6c1251addee91d95c97d60a09f4081babaeb473ac118a4b98f0c2d5c482d3bb95ade50c79ade5c85f23ee850a19cdf6e0526db43704b31e0ad7fb6293ad76e17c0d620bbb7e2b06ea7c63d6b625ebb5d7cd00988af06095625f351124143f38d4e10d2d1b877c7fe8bdb3bd3fef2e9a8f27f1317c5085def828e9ff15685f332fe1700a22ee082a3ed9c54c4064520beb2534556026b077f8c3b3ce9855d701f969cbae607c806516bae3b10fd80181b92c03565d4105ee1437a10b5f3a31e3400659332c199e250ebe984a8375bcf9803116548f4dda6695e9a0766bc1c1c20e5f3a56173b4f632ab8fef9be1004e1bbf18377d2e42cd0683aeabd6aa99ab45685ee4062b7fec86168debb5bf06d2572a6dd62dde0ff4e59c30814029b2783677780ad0381020068ca2aeab5836daf63dd9444368913f37109489e6e057ac4aa075fdea1f5c38eed5580afcf96eead513c910daff6e4a7afee0e6c1bdecc6abc5a40f67b1e1fe70389d92c1e453a2f7e7db2a6dfa3a0544753a110f1ab48f9637a12d27de6311899aeedd9e155a0e4cc45c0d989b6ad2bc11a60321d7e75df26d4e75ea764514cfb6fc3a989149da1b12e3ff16bb3efef2fc500c480dfe56d290b12b9b38fc8ff31e7f78cd068aa6334077d97e484076ac5d4a470ead88843c6bd3123029b3522a7ea94d11bae52bc54df46e9023ae51685318b2391d9bfdb3164aa209943d025ca38e4c12ab928eca88e32e7a8e78370fe59d284ceacc5bac2bac2a41b9e2ede857dbd0e8cf3843edab019158ce34728a0838df3f03c34e9a97d050fd4339bd8e90c2553971168896ca6b248629ba26f4a922dafb3b53ef68f815528c40511382b03daa944da778de301dd3dafd65cf25c83b16269779e21e50f618faea6b5b0c7ad34c9cd5425a300f829d89177ea854641ca0f0f1cc443efcc6a2a2494eea81ffbf80132e4d01aa0f63301b0b50df7457405222962d7de63c3140f12939af47cc0f0739bf3f08ce25483f54caa16ac85ff91bfb73611d478839ccbc077b14b47873e54df72ea1fc8f3c4f66a1601035ff903f3160b42cf59684f98cd33640ae3a6e4b9a6d0741fc31083168676897f8096a567f5801e46d15a414bcf5abb1e9e4d8bf8a9bcf453218e059055d8f2af65b42800639b11f20e74164f3f51702cfd77ac9cb76b24a97b1ed96ac46698fcff484c27c8744b07447b2abec281eca33466c08a83036e031f5c3f11d67f5475dc3005991a3196fc278d1832221af1236673d385078bc9afd79f522208937c06d3b171cfb1abf65936e4359773abe3d2254093baa772c7c0732f8725343aa2413c8b1f5e898e81fd60685ecc2249229f0bb89811f61353099db8ad69be27874525eec3f8e9814d61d5a6e0e4f73046412db689d8ae5e0565bbe131d970ad34c1f7fdf791a7b4283207b4e3dea45c15db7ec12e671c6fda88fcfcc698f02a186f785ec6352c940cab939326b0cad9515b322ab12d407296402817d18067e7ff5de2f8233845449983dec9dd92c3cf11188bd69f614a13fed359e6692f2d543b60367f1c272648601c384322d08a75912b18c28e41c40e4849bc4748c3bfaee718ebba6b9840fefbd43c6dbcb2bedb2af34bdea30041edffb01", "5351536a5365", 0, 942676388, "d370df3ab4b2f05a4c0c5738e1b192cf4726a329587f3fd2ffedf07be884c6e5"], + ["f9e6b46b03606c2e01d282c5e65e820c372519986aa54cb63005007e5345b4e8237147c8c60100000006006a6a6a5253b256d739c86be430ff568e08355d3b57890522784b854c3fd22bda7282b65f5a745ce476020000000600ac0051005146756957c567e90eb7b4382379e44c290e62db356d76e603f9d0d2418dd742f5a99f915b0000000005ac0063656a118e6c390401d2c3020000000009ac5100006a5351ac51bb337005000000000165ad95a4020000000003535265ce29f3040000000007656563006a0053e259496600", "53ac536a51", 2, -1457217317, "ab083c9e4f2ca125bd14bb670a76df10c174a0190f88ff69413c7b995d2d1670"], + ["030000807082c40301afeaa2fcd3398e5414b0947ef07a70c9f1776a12409c1f16f0ee30992ec9597202000000076a6500525265636d0f08ad01cd100f03000000000852515351636363ac5d4597690000000001fb19e204000000000000000000000000af00223f58c89eef7ffa4a5987c6fff64cc1958a34daba6d85bdf5495cddd523ff4ac70d774db09f16dacac6cece932d279f5d00e747f44eb965583465025e18f7ba41278ce5a82c120f524895e42669104f49e793a280972673ec40f191065300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e882fa0096e690b7a4cb386049ae0527a0f7bfe5102e0d8439b4fe7d2fd3740173c2d7b8145503134a1f659beb8d1ddfc81af9e29db705802c0391a06ae6951a6542290629aa6bb2564ee53337a5675b22cc66975400201fcb3a4019c2a50cc2d828fad328c8ea3f2400ee81e42c93e0b741f8997d8d5b8b4f6da75f8b3730c6032f1e36ad1b8bbc316aef15fa11dc09ac88b8f66ba83dd51baefd4c76856cdda7020b51b89a791b4f79d28652730a47d28a59ea9e07bd370a7f6771d974ef3e698e0b07543da6938c107f1bb89926a766ce1145a5031ed7b16730aa87c80e5b3ab5a9c84ad8d03a789a8a61857517c2373d3f91b4710fd7f24cdc20252c67de4637ba03045ae98837010c60136f0ada77386b4fcf82abe82a967c11efe2b60841b1909003068501224f30103fcf0563ef99052b568448ac7e29a2ad36c2f92736344779fc0208a785667189921c1c5fb347a753bebf2d59ee20d5e77cb9585fea7dbac4e5d0032a1ec4ea3b9eba7d868fbb26381275571a052fcf518af960d20dfef052ba6c410327f6bf25bab8110aa897ad0465ed7135513f971284eaf287980d02e681b22879587b299ae7e025dd82bccbfa9ed8461d57651022e10332f3b374486fedff9c4c875323e25b332b57e417e417d90771d7f186895a6e7fba9b791f1d55c05abd114a8bca24c20530e9162a7679747c9cd00d9929ef595ea9eaa6438af5b76375b3b7fea626065b15df9f21d75f4536fafd6d7765da6ce7c43bdf8b9149f4727c9e5f57f01e1d4f58348364bfefda8a4ddb10c9a5174042588da6298d31840f6f68c96716d968ea6cd70f68e5b4f8b425fc2c06f4c2fcc68e7010b0fec9d60750d8687b4afa29f89a7352196f56bc7350f58e8df469d2ea843f9e2db4ab80d73c998b995112e4cb1845d53b5cac7dfe5004fd4e29e87e83c7fd798ae3bf316b20f4c0688834f854b5a216153cee2439551e8f712f670efda0292772bdae16c618f1aea03bff780b39816714c27a84d2f1966684e0426faa62ab475c1f7e0145da8f4487a3dcceebcd0d4df00c99b8f57ea913878acb4272ca7313f06c9c69ce542d1ef0120d87e082035867190ae9da551f864f796c12d96cac91cfae64b1f00160e29d38a3f1803da2f5eb56e414ab32431d0dfc64969e59f2333128223ea395834526d3b079a0bf4ce0ed81aa9e932556877463a78c1e9c4ad230a6e13c269c3d18a2fb6ef836e6d2aaef4eff3ec174f706722e12abb286b9b8b639eba3ca47b38f1cfd0de53646fe114fc1664eea0504221237f6e0304db6ee28a3825ae772abbee39057c9d9e0606426c38c63b598a04b4d5757d09524d2e00b560bb8651f92c7620083ab5ab43e2a57ca0dcacbe0f698439d07361e16847f21b442e31e8dea19158a7617006a4acdcc28d6434f6a87164647a4051682a089192ea9fcd3f5ae4aba23df05554e5d7045acb2e1f9060589bb37dd597cbd47e4e48adf68b14b4d39b2e20d75399ffe4105fecf75087de65793e31ea3d46794570142bcc082ea877e72a37e49aec50b197c66d93118260cb19760283acbf3a18b7590bf86607568677a9aba8a04c8013af79e47a3b0e24ee6cac739cb546b67288d732a217113e2e2fc489dd5fbfa07549432207904f658e8095b7729b2d22906e1b592570d175952bf082e3d2eb0faacdb24e565ada7c235d4a80c5f486a1ac3d4389308bea7eefcdc505fe8502ea6e60da17cb79182ef9e25ad39dc3863a3b39ce541a7e9a871b7d591ced112650b20a5fdffb4e98d775feec5f315542fd253a9ef145a7e6cbfe09aafdbd7ec8e75ff345851e1473d4abfc37c89459cb922863432129cf3bcb0643cbc5bc6f861fe9d98a435c2d5163ab983311228a2bd23f7ce1d46c085014b2296246027849ba3daabd1f3685f849a7542c1471bbd0ea5df0044377669292244812c251862b168a271420ca735710995adfb9951cc057766ea0231adb250959efc0c492eb7794c5a2021426e2f24176912f55774fc9fe32c305270f94a15ed3def7ad9ef98c18a63a44f833d703ad9e48ae5c5f5f06f70ac6c372347efa8fdace35dca1ebb7bee974a6ff0993dfe701b042ceeb935a3deeeed111c07c631dc7c7175d3f9f62e81022c5e6e2ab5026761fdbbd6f54a5f6834ec4eca86c4de1bfb5d9eb17d13fb6c5aada4d0272551af8ae9c629915fbb00bb932b1b7fa065c545cce36d8ac5b898f5d5eb5a86579a20fa7fe2817ab661a906e0e483d8c7030be3487df9e667ea7e8555e2fbeeb1820c4531fbe8bbfb217a35613a0e2877fd0f5675955d5d87408a6eca39e819f8309af7d440661369a09c0f94be8555f48d28eb829080113f5953547b2ac7f9565cb37a9031234fde9ae8cee00d37e3670817fa30ad9608f5b2e372d232fd51741f04550b", "5253515265655153", 0, 157408316, "502cf4a784c4852ff0255f4bbc103588cee14b94f936c46e82a6285d8d72db12"], + ["030000807082c4030245a141678d93249978984593e0d27572d06e2689026193b75ebdd0fb9c24a2c2020000000451650065ba6e996bf3b72d11a6de9ab47fae1d49b17965dab89d526a1cdd94977f144a503b75b59b000000000865ac0063526a52538fedc75d0456f8bf01000000000035137e0300000000026363db63460100000000076551636552006326d7d3000000000009526551ac636300635129c048a489c61ebf00", "51635300656552ac63", 1, -927341002, "872a3d504ec7a4c0ec77b14b2930c87480d6784e2cb6bc0343ff6aa21adae4d9"], + ["030000807082c403020167ed2aa2b4cc4d6ce13f933e2029ba32fc64787b1bc15e28b2767f5c950e1f0200000005655365ac5214ede714fdaff1874a1fc0ab7e7b43008afee285e939c1a74fd6018d52544bb5f2d0645c02000000030000005b27365e0265b47d0400000000006901150400000000066a51ac63525100000000e2a764a600", "0051ac6aac00", 0, 1002849087, "033b79010c11d93a09eeb153946e611cb0cffcc08c261ee8e5f1f819580f5863"], + ["f15f8123048f582df50ef5fa9fdce0aba22417beb6879ccd2765b83f042c67a55f1f34448e01000000056aac63ac00ffffffffa44fd3f90950a9c97e0f0b465eb299c57f34263a52d90e68b68810b414327fb20000000003ac655204ee37767d8b515bcec271c1fcb0281bc238ce4d7109b6e9eadd3f0f6bed7e01e921d5440200000002acacffffffff08298ee1dc8c80017b95139fbc7656cee5b176f75b643ff9fc456e4d3141b27a00000000026a6a4520a63b046cf08b0400000000086552636351ac65519e278c0000000000026563f926ca0200000000025163f7137b0200000000066a006a636a63dc26b8d40121eac301000000000000000000000000cda7fbf7a302614a5b58120a7d1d8229cf2f4890a81122dd558501d4f9befdfd5148d651d645f5c1eaea2c9f9276bef08fd0d1299ce10581fa38772eccc7ef166f2ff36f32b34399b3d9005cc2f68878d45b144704cb1300c45d13abec747937000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007784db025e5e6d47f51f28e6b00af62a14d7f69668258e65ed474d59145421b75ca0a1cf1711abb7e560347276aa88d0f69fec0b22d3ff0e3c456ddc5e285738caa328deaf98b82c667b05cc2f78cba40f6f0a319aad8dad413070593079f6f56e238ee190a215995958b3fc41eede3aab384b0f3475ac29befe287ed35c3dc4031adacde96695288c61079a31b14da4fa1be0d3e91209ec8127cb8e6fb09142af0201c6c9ad092ce34b5f119057d11b8ccfa61a66f1a1cc00a63a9631a4b58f17a60a0675172aef35cfc8d5f335f4a7fc67365dde3cc87bb3e52a7b6f8817714083c0d6736ed70ae7cc76e6185d617c1aa3e762beedcfb7394373acf5b284269a41c20321d97edbd2185af29667137a36f5f82672432a3d0cda500b15c2a0551931331902037d0bc89ff56d97aba66a6b77cf9a79b258dfdca4e0774a4bcb47c288a81b63021d08ccb0c5d377f9048c9a9d5d7941b2f5b612faeb8560f4fe9b7ce1e00898fe0207b685217e5f731f8fe18ac9d497c4bcab191f5c8e7ce4cd03606f0c3a5b65c80227df14e8980e141274f024700b63a3f012b1cf2ba5acdfa6b2a29c97da9dd9e330e925bacb27ac328f5b5016f588af61b1e720b4d5040a2db430c3d9090db7a360579ee3b964004674dd3c50398e0bd7874571c0ae6bd00dd1b329b01d94d39876e7fd74c48138de5880ec1dbdfef406df1978037199afd60cc72ba70b97196338a50b1e5146af370b77c303e68738f2952854e35178f77da44f77593a048cbc373411349cf052a3e07bb9b2e775f306d1e675fe13926074cc804988556795186f1fa32111b5cf150a5e67dbe098f6385fafd776ea8602d34b675572ac11c83fa7433ec258471e9cf9aa431410979266d65d9004ed3d3ad3cd0efed9af121e90e85cdfe5a1a13704e87513da068eb0df4389f211d38cb509f834eff2399bd946348746467096e5e5357d6377dff97ab248985456b8616d031980379b861394ad99b2737de91d20a1da7f68747407c12c24743bb4a53b6c15260a4d3f675e463b03eba1e0f2a495481a14e4be5f0ac99ccf9d6dec9d14b589ece2aec40b81bcfb9a1f15e065a50a32c501234043d6fe5c756f6c1c662ac2a618a7daf409a51e581f96feb8b8ac08951076c8ca106abffd1eb43011c7ce9b11c74c411a2da07fb41f08c2b5c4af184011cfa821bd1392773f138a79e0655a3f6241f4a0c4fca29f2bee4b862b8845b8b9db6ab332ad42e12b60f9c029ba94bf3a5f16e3bd6baf22506b74a0fd0043784f1fe10c768a1b31924beac03b583057b8703eb16d899f222edc343b545d7505b309bb92298a702e2fd51ba39be01b33c09f73f030a338b08c363c714ee17c9ba06b9c81b725b375967454677cbfac41bc8ea14280a6b10bc8dbaf9a1c8f00be7cb62c1b1437ab7ffd485fb0d190bd2faa225e737dbf1e6e368633de2a7c0e7d474e00c429a586d11560c3793fcbfd256a48d3e54c6d5f7f8d0147f0e5ea429687f361e2b14852cb48c1fa6d0740f9dc45b8be1717becb208141156308d90ba131b52d756801364ff01c29ef1dcf721a18ebb3e062cdc6c6325db187ac25ab69b62f0e60279f0de09f12d7657dd1412d7aca59f05b893904706602fbe9ba429ba120837be53a73478eca7f442cb9b307c4a59b933c05bed76221aadf85069a9cf9e4c6e19934e0faa1db5001e181dee31aa0b397143e703d33ac3877d6abdc639035a5acd7c2d8b824869600cffbe9fe8d636306209af8de8351807914803e2cc259f865d38f61636f68bda8a5343fb269ba29fdbdf655d0d20dcad8f8dfc38bda3867663c56c7ec02a0fbe53ab3e28d3af1e0a90efdee7aba9b8fc2376adc28954d600a99ce0658ab93ae416359c53e59226197f8324d3169c5ea876dcae2f14711b27f9d8f78eefadb00ea6a33a6e6965146ee08a64f50d8af9af5e4e6e1037ae02d8826ff1784adfaa3be662f51fb48c900d2ac915bad7b3abb5868f7f32a52b94d18bd866a9c7da8c647b0f4ebec9f3d1b0c60f44ed6f42bbb5a824528ee9b318104b7d5ceb00414aa599c2ff03de58a5701f006da576ca038c140d7028f06ca96be413bfddc2f430dbf00bcd39566f9cbf523fcf10257537312ac4e1df1ed6239255eecf91eea3a0606683da9bf6992252e61b98c52069be1a624fdc058014cb14d83442cb48fae5f037351e8f1212005366fbb0ab3d9146f3dacb4b22f6dff4d01008684fe092be2564685601027c76ac83d3d52498f126dac2c51ab2e23db1c722fe956c9ef703394cf08ef5701bfcee3707d60194479dc6f2de0782d234b685c4d9f5de6500e5d5fe8629333fac38f12b442410be6ce113c8d2f24c772b9a6c82abce9676365930a4dfb665faa89caa6035ffd00d6e0bf17ac823b14897c85d96894de3de307", "535253ac6a", 0, -994397550, "b35cb8a06496928df98099c8f39cf5188edf9c0d2528dad9450447470567311a"], + ["48d4f15f014862c7387b2ebd0d85b6b5d37113002490b60aaa57c45b1c53081d5d4c9e71c701000000030000acffffffff03d78356050000000001517ecd2304000000000500516351514f2f1701000000000500535252000000000000", "535153006553ac00ac", 0, -1283359962, "4afb28a77657a37473826b248731b692dab3766ca0c7b0656a055a88296be2b4"], + ["d5b09a0302d54cdd1691f727e6068fe3ee886a4f9239b6de144bcdcfd3fd77de0c4fe315210000000008535300656aac006affffffff628598866484dc9c8eaa2dd6b9b7e88ece7b483eaf9f8ddcc9b841485413e4670100000000ffffffff01e0641f02000000000463000000576688a102801571010000000000000000000000006f973972226b631a3c3892d13b020195b33e35306e8192e1da65365ea938bcadddc469f94d11fa4cda38e7efd2d67480802d5d702463eddb5481c456d970351b71a14cf025bb82111d386923478718d384edc435f14547cb756e80e83cb8848900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c64e254ff4b3c2088cb487b97eb238416ea7203c22522ca2b3a4c93ba3e2983458884c2acf68150baf43d44151bce5958651b0d54bb4f90693e1d899851bfe7abd36178e0437820bd1beb193cee5deb14a5524b22e4ec0b57c6562edc8891ad9ade4a05939910622db2eac0cfa3b45d90092e128b972d2b9182ba2d7947c96730211f44e9dd38f9ba09d360fafae6b39c01fd57d6b6b1e564f119422658887fbb2020f1a2f817360d4cb9bfecfbcca116e17b467f8131b0cfe9562545f26a4f1c4ef0a060d93645a5282d75914e3ac0ea73c0f0fffd1f5303526c3402ada48bf1c29c41afa148df98dfa0ce1b50af77d434795c8bf3d806f771e71c4266344ad65253f020f8882a6015a408fb8cac64e4ceef3298813888f1f1e7138cbf4f224037533aa0322746bc8febb5a0c376120b468ab409f47b8a32144297c7c7617437d6141582f0215fb3de7ba233c060d1991f5f1a6e94506445f96b70bb917e0552af8f791430e0327eea09edfc32071bf17c0ee73a1283b157559c99cc58f29cef8a94517bc3427030f3f8b78a7139d00e71f25d49f09d8aad0ede942bdae3f7d4f9fb10a4a681d06f6c0d9c8a785ee15777f0f67f66238d4346c9f635a027df8dc2db5005b0d2e323f8acc67ca452a653f52de46094680682b98a382a1cf4b4e2981b4c7d208add642f8c06072e6491a3a9241ef3291aa673350ff4dfcd7d190e30c012db4f09b6c079c8f7a89e4e94bdfef54bde03cc4a3e0c30676248caa6438500e5bebade8e501c5f36f8f8f972f18385bb766ee97a5c63fef806cd52d3692e93bc96c62ac1ab1449f187b6ec22a648c1751e820603366a4995fc226dbac28f450df3eaf7fd1e8af48ef3558f3a65d383bc84b0f298c3122e0faed14b15c308ca5f074f0ec448ff88f2cfca5adea9fc41e3d6346793ecae937cd8a96f25c1296b3fba17fd328b1cfe0e49ca1f4c6f7f973f4a71e78e5cb24c643725bc238c604dd893ad1527cca3e5fac26df5cd91ae3b4854626e3250ce6fe197b7304e653831a1b1d47840644f2ad1c1fbaa2e782271ac2a3fc282a56cd18b12172fe9b4c4423c989066fffaa6f6c27af5fc3a0531f0fd8d914e9387e3635b68c0ebcd7ef674dcac2414717ea9ee28a0b60b03e2cf56d91a8fb165d510a85715c1cb97696b14a96fc6712149afe10cb2b675723f4f23f7f131380b3ec328ef405c39056312b6a4b9eb4ae947a068834d1ff8fdafa039541ac0f1a9a68117c9c2449b35d8ab06a6e4e6f34dd45adec46faedcaec0ec4804358f52e0ed2a90d3a9fca6485f405f44a92a00cadc52c29adeacc8dd5d2e799e0117abb90688415e3f2e2d9b43b800c1d46165e4afabb8833153ae93d88fff5cfd76d905a5d11cbe7ab1906cfa3ff998132ee4b08c0dca09c4cdbeee0309b09a9d2b90a4bbc6eae170f82d783fd29622a4e9caa2fbde4c9e4229b6a6b081dd35ab280501bfe11b5ef1612f36f2753412a3108701f20ffc1db42c90251b137787308f15573f87beeffe4847ab58acdb9a9456b7b4144243066a8863a489509c6d98c8a26e4ac1357f26369062968f4e9385362a90ae8fef4fc2b8df6a9cf11236d18e7d7f7ebc09e4b2e6e93e62c5a9ba374917f0699b3ac0813e386e291789f29761a4fb93d87eb2d0d6c6792f10c1c42555f074e8c7f409fc624e3cac54064f1963e1e4ebac00cafdc698fe676b1a4338a84e787605bde27c017219fcbf49564a1f7eb8f67f9e6d0c084b3d5073572147280d7b7b04b135047aa12efc160e76eedff54ec6f89f517a8fa47f9a1d021224b78a774e6d161c6bdad4c53a1875636af032c81a05b11ea1599cc43e9bf2648c98c1cc0e8f434a4e461d521ff1d1ac2bd3957d0a47a30dac9c2d78111754928375c78ea8f0708434cd261583b905c653fb057df9239a6aab8a6bb46a7106ab326dff6ec7da1f10bd2d87d5cef40b0f2c1016249e8fda7bb8eaa755097972eaca96fead122bf59c443a0ea1e7a6f696b45c3cae1f3c28523a5121b6d0e3158d2eb02cd248888e31bc914edda30fbc6fc8d8f0c17061fd0dfece0caa6455c9ed4c93c71636e765991ae76de8aacb2d12453b2285f99189b4816c7a8190490c1ca5069375347065589304ce09ec5e2ad6a71ab50d6a0b4c34acea0cbc1fa78947615ee7b3a02ee3fb251b72303ec53487a0c00251c4febedf10eab76dea98dada2c524ec34242e1cb57ae294256ecdbc29fb5afdc8d2f1329f5f91f39af0fa89d67f55d5fac48d319cf9fbb8247585e7cf4c9bf943af900000000000000000306c980000000000ed8b19b2f11215440819e60914694f2a7ea4605b3fdf37100d1a97e8d594975d9e97d72f9b319b6c906b6bcb4b29e2ebe30337c5014661a0063a7639520fdd036efffcc2474f6c0b0f8540adb94f9aec40a859da1772037bf2053583356daa1b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075675b59bc13ce78c579b48c59f3498f0ae599795d941059967939d9cde6a47c5d96029ffab911a6ab48a0b8ac5e5a87c870a6028e4b8770cd77f8db3c1c6a997c0fb398fd900ba9c9ba3aa2287054015f83929ad2b241807dd91739588fe23e454200669824ac0d15e3384c1b3bfebe4925cfe840fe527285fb9775085863bb020116e2be14eebe61d12756ed22e4cc79cb05db30135e3f76f70841a3b18b05d60224d9e146e110ba8465d3d703ff8f7e7908ba439a70fadc0b1a88aaf6cb2e0dcf0a0252aa2ae50bc331e5e13490b772f27cb79e08d1b66d8ccde99be2b465f0be997d4d74717ebf31cefdae9972ed14f82166ef364c06dec00292d1b59a9e0404e303115ebc8f5e3f59665bf85856631225f08dda7c92537830e83538b361c9dee14f03275f9278c298fabbde6d68a6ea6a182b2f25b8ee57de28c5afb44757dac3b490020f5dfaf6ac6f3ad9d69ca70d42046522e8f72f8c7331d35cef1914774a1b5d7f021e07966770ee83ac4d1fbdf66e2bb3c8733cd5817be9e83801e3657759c2c51f0214f9e7e1e4bd7def12bab41e82267be6c8dc01a5e630af9f4543a16fbcf7ae3480e51842f171e0de1264d3a97cac0d65d3e81b79f1eb617e4f507e235557611cbbb0d9b6f1e3c2b25ec5ffaa3adb890ca6db8515ff49df11a496f4fbb6778c4cbfc2e2ba5ba0194f3abe5fb6cd7361b293fa885925a7badde11e5223c35ef96105c5fcb79095b19aa2fd34ff4d5aa6197ba08eb5f2da8800e5270748529985c0831988c6efffc3823b908377f87361d9734907fe63eab53b16a517c30d93b6e48e35749cee70f61043e38dd19f4cd88a61d552159957adfae0feb286adf5c8732d32412105c658a2e6a037b38647ae8b06cf0cd843b680903f944127b9135a39b725663f2b135b0e2a027bd01ef681bbea65209cf29decfc30c3971b0a915d24306386834b0be11bc3a70471cf0ab387ae953c3c6f10414ade4fc44d8703b6fe64d42535e7e491d87666ebd8b9d6e16f606a60f12b4347746e5a07fac1038f8251d05ef473924220d67ec1ca65d1d3094afd6d5863045c4ccf5c55201e2f9c44645a074c215a24678829d12481c4e173e3fa9b580658768e5e81a3155c0404241b58a60eafdee10eaa1b76cd03dd45d45fa3307d522d34092214741b29761070a76efed7501162c550656d529d9f327288182fdd6dc90f405a0c1bff25729ebbde0cabdc556f9922aad51540aee674e94c022aafdb05f933ae9f37ac4a045550f300af77c755391d15ab1dddbc63385c297101ec1f3ccc7806258a5e85634022272185623289011fdb26f052b8eadb2109e77744d19b4dc87e23b92ac82a2e53af0d328afb793760763d05a04dba0ca5112eaa3e994e866680bed9ee0c94c06713476dd0573bbeb45c2ba0e2348095ce440b9a4707a7c4be42c434b7c2fa61725e071cb90601272819502f5ba9731eec86571c54b4c58a74accdd08fede66e8f9bcad6086ddd4436a33cb383c247060aeaccb5d99792cad00f469ef97d6445d78434b490035f70bdc6fed29cdd44ec150b33b093de6353d7bf6029537b6d9b47dcdf5f9099e1097feda299a7048edfdad2039bbf1f776853ca0b306560cc2d4f5a89543e6b9122df76329d357f7829222ed77c71c4d6fa4a76fcd8c32a6729bb2709fd0a17d0e6ac0cbc67519f784113f00e40c4a8fa8a2ee2d9e367f5981b1cb3b003bb1411604b038425e4dec9a5ab3e674b820e5f52e488639149dd15698d5b4f66b5ca65dc4a75659736a88db65474bc85df01c87492171f4ffec7c502bf502f42a0a252bdc1d564c950eb2eb628c2848146876eb7735c28c7f3926b9d98c58118b969f284c0b9fb2264d9e2aca6f88b54f7d985f558a2734d6c722b2d0c70d61deab900961628e1bb102239e040f89368392c115ab9470e2b938c250bce53560d682b4932e06dd8bf31bef8df2110c16449fdeaa890ee99f3b1ac166ea119072a7c7ecf079b85e620b6309a05ad7520317a522c07c61fe40289da504088ab98acde017fa08ab81f71542b2f22eba9646b93c2c79e9762666592a0225b6ceabc10fb60c9ec5d9d4a3313dee37f723c33a92df85432b6e969bafca96ccffda6d0020aee011dc8321e6c1ad5ec3ad27f3be3baab5b9f061c119e7eb36105ebbb937c2810577a41a881ea8f432c63ba41475447eec1aa9db9162606f2d987fadb2965fcbb8a040f493704db56599e587efd763fe9333e26e7660a629dcd9276f9b5078d60e2ae755f4e0fdc3afa509ccd7614af3493f0a3a69f113a1ddcefe3b7303dd80b5d90372304f69a9eb3507111a7be17fb353fb51142f849c60d3e0ba1d6cfeca66f0cf41a1c6988fc5d5803e0147674491ffa9f222b64c3831051ef9dbc4f85e19f5f9a83d5d3f331a00498b80c", "ac525252", 1, -2064367891, "4f56eed55e111ea5a2e52972836722b33b161739d8eab0944b810daa1bc8e1d8"], + ["6008ee3804a20f64df705b842b76b71838c69bdc68da6ba4c97a00b007e652c080496848d2020000000200acffffffff126ebe476801a1091783abdcaaa4a9443fe8c95a8594abbab7f76739ca588fd700000000076351ac51005300ffffffffc3ab927d9d9e2eead9753d2204615920b98ad6f5c0954c13bc2037a92cdd193b010000000400526a51ffffffffa2f0dc7379e62f50497a53c94672ee8fc5af1b9af40453df1efa08047459d55b030000000865ac6aac6a6a6a65cc42eb270446f9fb03000000000252659af4db020000000001009f8b2e010000000008ac63536552536a6a325814000000000005525200635206f80a1701000000000000000022938203000000000b7d9d11ad4ce99271f9906fb4189189afb073841242f1032a72d84b9597e73161c28e6cebf03e2bbae13c070ecf8faeffc5e60408533499bd91c20b39356ce0dcfaefd94c9ee2fcbf1a3759f57aed4d790261926d5d9f1d4eee2f567151583200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000445e3857069d100fb66e3fa2152c0d8fe3184a4cf9cdff39ca46c9aeb6262eadedb83b600f139b0fdbf2ef0768a0c710c006e6ed3cc593ce19ab8cef08653fbdeb899fd10d3d9785078af2f21cc88eef1c450013610775669891a15c971ed2ceb0c8b17d6ebc0e2882796ad9fcd33a81782a6c3d2bddd9835439d749a31a45b00224aacc71cfe12d09b938f1a0ec45a6d0625916e09cb4d2db267a23e26382fd7a031d3b734480c97c9388944fb4531667bb0cfb87cbeffc6ba0871f8613cfbc7f290b0258db03a5075a90645993efbe6a1e97969b7c9c2ac37dd81d4bbbd37ee0781baec6513a0a17c62ab7b207982b713831eebaffbae80bc6458858918265ba1bfa032adf53a92b9da7989d667486e63522a40de665679c264cd2b03eb3b4990ef32d022d85569d1e9ca98412b96bd6b0f12b97cfcb6e16f3a63ebc63e85de8c49e683f021318a2f8ebbc94a36b59d60dbe43f71c0117a07047688e8934d295d564f9e74002076f7129445abb3a817f0c063da7ccb4ec9f2594fd640ef7ef9f8ce4a441ebb003091ce25cb9c82edb1f497d529789b368ab27e3f9fdcfde9f613c1794f9f2c70f4fec50e7b82e205129a5c952044b8a56663eb3d107b1bd0d9ac215c581750580d50f681d424d6c3251b67360def85b1f3c6b82b80cde710eb6292be57e9a160e74c5d39288f6261ba5df3f371052b7939a2352bfbf8cdabc4756f4ae52281f18544f386eeab0d8ad79dc09e83e0e4e9a615190cb9061111a1dbd017b7ebb282f8574c79dbe81bfb69795375c1d4637ebe229e32fca0ddde792c574ebef7771b1cf74b6daf6188c1b9b6dadc16c525cb7edf234ff95027fc37a8ebb1a34eb7312379235c5410f5601d1f9ae7a39b63fd8f1eb84fb097a811427943bf9df7aa442cc070b988a6f7e117053f01c21c8c90b99b6034baae869d76fef9ae22968921bd63ba85aa2a70364863ec999537f08304f0349bbaa2f6fcdd363a5543a52567db9800218ff9806b7b2db29185b97a43c00b85c69bac45bdddbf5985e04977bac8151e799ab9befe71b465fd366f3d963ae797c3ce7490953b08961bd923ffe242dce557de14cb6476a886506f6a1693ba62ec82f2d700955b5e13bb7839c71e2eeab50c3e1585bf641e99e3b0f1ba0be915a0640d291868e14b388b33572bca9f6dd142b699fc74a2f70430f4631fc98148e68660a0d713a3ab277e0a6adb14343ea233f009d432873bc94c0f4c7488aa52230926e4e993b69338e306af1c3044ddc3600e9e9d88337357be7a724129693a07febd446f9ae7a0e40fdffb6b2e2e41f311ba5649c515c517fdcfa891cdee0e20a94ea3e01209f96ef5f289805e957e0961720de1c08e7f76260f26cb26765eb6d0bce1a89e7450345fa96d33f8f39165104e4dbdffc25590653154ebd2655217c8221b5d43e8a0024a7c7fb28e85f68b53f9d8ebb2c1fbd6947ca71eff4f2595b1a7f98c3d78ddf1974bc9f4a9293cd495724bc1b3fd77d7018000c330cf942b44254e6faf1b315359fbc9369c23bff6a7fac221dc5d4a2f8453dfbcc7c1d9330002ecaaeb014047df9139d931775402243d46b3a1ff5541dd9caa8cb2bb0de33439d3312ae700ec0d912407f6909cc9aca4489737fa42cb3a10c3c0453fc13673d71f3a5b26ff070c0222a2f3ce8945b41aa31e6fe199cd7f9dc1d1b221471d217535af4cad02011b38bd98d2e229fd5d867456e164531806847b77ebe788b94a4f07674a3c750bf07061f529d149988ceece2e7a42499b2a14d0eb750df8a919ed88f37b26a3d573434458e38079ff0bae9e0bf520bfe2fecd2a24fb2e5dfddf26ff5d590d79a492e8dff52e72912e4074b6f50ddc098e15f30b7f213b8dc692015771a863bb8a2277404957a39faedd9d452227aa6a57971c79e58f92065e260d7a8463437f6fbbd75af97cd65ea6a09dbaf49125a992e9c0ab01545da3b344fd841e867eeae49a764fb047ad2ce65d8ded5c0cc71771dbe6220e24d153bee926cd39e6e4f94ec4b0ac3f98bc3e4bf232a1193186447293879288068d5b6e8786ac5ea0822221d4409ff35ee0107a15dd82be7cd4c747b6d8ec3e18152c8814030a7a974cdfd98d56b78426128996f575ecda6f1d142287da5c07cd9f62c5d185511c7d57f55f9bcf99009bdbcdfc9b7f204d102904396a610b51726939f4599a8f9b1fce505f07d0c5a700b3c2a59b85b5a8030d16c2c19a38cc6c78a1c5015a9b6b4ad464f19140980d959b5d15d47953ba9573cd7d22e31194d21f6396262a7bd1b6162956b51a1f4c9f30905d166d749154d5d5273894fa816c42b03f5b7d78443bb39594e51d3836d9782cb13b214b4083eb71465c6c926b6a47b6c386589c0edba9f2c5368fb981726402d55ba54dff4faf7c77548023e2b5cd907", "63ac5353005353", 1, -735250881, "e68381293eb0152134c8664893604eb052b5a3346735404d366a33d33c18b405"], + ["f31ba739022189afd64e765c632aa6a97c3854dff2e6feec7d12b9d554300e6fc6d6f355620300000001acffffffffe9980c2c64814f763acf1e06e45038c5c913edc356b9abc863fceba04dc1fa3403000000050051000051ffffffff02140467030000000007515253006551acbbc792040000000002ac52a5f79222010000000000000000749de00500000000c4454ead632210ca18fe18ad6ede65bec93c556e77de39fb985967eb10b05774f19f6180afa06dec45f8b6a6ade89d0a2189c96812271d45fd50189a3693db95e3b300fc0ffa077167ca9c4688fe61a1ff415f24f668ebd1df3388e922cb789700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000429389701342aff59eee8115237ea4f210bf1f74dd3dcb49f539f080f00ae26bbe965ad22a039cf8ca814e6cb4e7531f4e2315a260b214a453ccc60e9a809899b49bcfbf2da731011616ff0d0897e6fd9b03bdc974db78f4c0bbc7e92a3305481bdcd572b8204dd2b41f3ca741b56ab6d26a43a1a7452261b49b2209886a2108032d1d68cf27b229d2510746eccf4c9be6ed4d0b86e59b5727ff87d7ac81fc1ef20208bb68fc4c6b296fcceb6edb8ecf33b3184b8f4d59f1a3d3e90c4086b8da368c0b0023e0982a51dddb089d639607d441f758a67038102bebb6c6535e1f81baea972b6148a1686d4b9acf2c5e7a884f5775b663a2b32955b96cff7f5218132362aa031d0900be59c2e13efc7296ec34fce34ecd04804e2c51ca02e242c8b334d1c54c0304ee0d41b21a975426397ca8b37d00066c2b631f9b89729fe6cd26600a81ae59032a3dd654d378e188070c2ae093a555520e3670bf293c127205f5d7fb70eeebad0220ce0a7a6e0a3532e6a4663311187c34b78cb8e46230beef93062fb4e5e021f602246e1cde872a2df73e225eb25e029f2d48f0c979a466df7e9c7a910222a178a84b6ae4a22d59e8b44eac337d2382e7fdc555f356e332d8c9a9eaa131ef2aad44dd2954fe59424725e36b0f1e85eb1664b66f0182a0bf09a1c640409c8af22a7424348a0aa1b97b7bc90c960ab910dc376491fdc3f2a440199eb611a5391beeedd0b97e507df6a5762c389a3a975dff57e2c7c8952060c425fff8a111bdc581b00787f316096b90ef86fb7f573e17ad96ef5774c84db63d3cae18bf9680f007aa25f0b53d0c50438642fc153f436d30c0c01c72c2b5266bd4a3906092e425d3030fad00e20019e76bfbdad9e357a90900b94f1aa0df231fae32c05db354e625fbd8f91d5a8f21f787bc184466e23db48001742892b6fe862d27257c160e52bf8731872d4a67e17f4e5b5bd006aec4a47b98426f21d764ed25e16dbda67be03a03cefb95b0e8d26fe171e0d050138068e6ac1d4d9c3cc123135d9a3079c4464ffa13f31c53d6dad4e360dbf72688a9819cfe008cd1db6eadb1c8186d7dab1395eb3c05b2f5cc11009e42c19259af6f7d69a18f1dbf71bec38f63576ff84323d33cda1577b92fcf90a97eaf4920886f381d78b42666ebd8612ab353da01cdf6cd57866acb7be28e78cd84594187bd1a10e34361a38ab5a05a8c3e25631d7e24dc592df44bb415aaf8b07aa0c2744de1be11651b13d38fadbf41d25ad792593bead097a6e0fe62595ed839188191c97ab8cc2959f5d93d0752f3a20afdb0c21d0e0575457ad1c12ea1158d623b520aef9e9ba7fe2d1f45beec8442fad389607a6128a3c2125104b476a3974b8d97b5d9fe11ab681e1071d730df2d4d19d98864e0a7413832b77d6a85c40c68db2af1f94b563704b8cd8f013392c331b3358f4733a2bba01c3ab9bf94144dd3cd77b131cba15e2bb0e69691bbe1aac6d75e6f0988bf525cced34826d49069781dbe8bf1dd5f1b0da7e8a11fdb7a2316ae1feac6c59746d1f2821652b3b27772649cd74766b14b09a1d482a3d96c5b5cb73c871f57f38a1abae0256af2b5d0eb50bec398899680322d2ae2e57c2753c0bd8d2e85544eb23e7053e973a854cf905ef9dd329d4578532478a1868e6b2b0ea10b705bc5574445ae5250b00d24a47857ab1d201504df205b7a7cf24eb15c8d5a0c85b10b7be82d0d3fc9b003a977c87f0d936a0e6b41c4d9a5b873ae12bddc6a74104c3e320b24372be490e4d96ecc0c3c0742b0deebe34a600af7a75c025f274b5ff40dfc30644918225041df87c6fa6258ff852b6e19e2eb5f5193b670c152404394f8fa2ebfc92104a27c5c041430bca45202605edcfc6934b7ed23882e473411fa627cbd2b5f68a8bd1ad98c1ca0fe39142332da65f871893aaf22d0d9c51ce39b398abaf3ab7522d94f805b1780b63116aa3b417a0e05866a66ea6f19caa7925fc2df238ac6aedbdb6355ad98bcf7f305cad4b7c25aaefca86cc5147d8a64c853153265071591469171e114f2a9a537b79486d3d48f96907ed340a9f08b757ba2441b8b77390fbd4b14251f214bbbef7954b80ac9aa0b24ef1dbaa7b0c7fb863de47248689c96a21cac0082a1c83d056651aa9e94ff823d937e8e10b4dd0d8eadd34ece97e77e65bd0395581f4ffbe80872c405c44ea792167f5ea044e8da35f526dfff4b7050ebb565164e90e4a5f347f43e7a327ad5c4e7b93a1bc13a0a86232aa93a9a4e2aba6747bf1868d5207a1e069c4ec8926caa7e3f886dc738b854eb72b180b821f87bc005353ceb82ff30403dd0c41e6dc4e062510a7c264db933dc74550a8ba9d28d29df3aac3ceae250d89aa1332bb3730133cf4c58f532a18ffae8dfaa9f90ab48dacd8c177937d72bc59d0f270b", "00ac6a65", 1, 169717943, "1fa342f0f90598de8f0cfbadecca6a774aeafeb8359d757fa561ecbea466adf5"], + ["030000807082c4030195d94a78028684d08d544cbccb56b709589e83c951dece1d489822fe8676257402000000076a525363636a00ffffffff0409f31a00000000000600526aac5153eec9660000000000055252000063885d3700000000000763526a00636553c502e802000000000465656a510d540bee77e0b5e1030000000000000000c49c770000000000427b5c86980cee9f60f094ff79fe14b9e40b5e5e3831689a8e454456aab00165f7dfa2eac3be31bc8ebb765e35a2aac551128726f44a3ed416e4d2a14bc79956f1a9b8f8018afae3b229e5253efb1f7b5f9724729734fa27939352861a2c223f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000983477dc769f2cbd3b359d7871ddb50c1984e350b0407690b7508fa0dcbe61b28c1fe132706f2960decf95884fcb5ab9e3c520ea5485aaab95e552836089de10272915812a6c1023a4a1ef7fa8a99139f5eb6fd7adf1d52bd6ff5a9cf6d602e12cce7357a8f69b56007f39c3144dd46f8cf2e3e95b26c170235daf9af155d055021601b41dcca78174c69f8163e2e24714f614d71885d8145422dd8bc487f19b94021890576f32aa863de952e8b0aa12336e9ccfe371f6e74865dc5825df2944b8180b00475e74a7921bdfcb40efa282cac7ec463a7a5fb39de38ecca1c41b8e4d3cb461733cc132b57868fe4e5b1192dd2afefce6ba817b254a4fec3b0bd3717864650211ac283abdbf8fb0aa29ce46c91869ca8c2691d1200b29fdd51e08781beeb0cc02224244a7fc87a4e86785588f9518228dc1fd1565205be1967887d1be9aa6fdb9021a5e0e8181fdb839dbc1cd0b3b651bb9fb3a4d80fd5fc90866b8e0025b0f55bf03147b961b960db55be6fda68e89301fab2446120aa3122b41b53c571eb646880e03240b445de27944ac5a57c0c6b09a05782fb12c0293bfe466f317e9a4f7f63b388c98e79d3de6eaf130a289b01bdac3191bf409863638087e1342c807396917e99b7de980a4f0d0ac702f1d6cd14fa1f5d2433621ef588cd711114fe99b51f0ea2fb7173a75719d5ee348422c8e79d2e07c2685f6b42f639862e14eb6903d1b51c4db92d0624aac9626dafd710aac2f28619a2935876c344593360b269664ec342c1a6294ff0cf5319c0f0bd5036c2a03cfb148d6880137c7d203a1cb580451e52cedcf1dbe3856f221bf6d6be6b6cfcbe4dc788da0ad253e96354c6998c35f857be30d115166d31ca869ae7b8874540f88540bbf4b58b2f582204568013656b438832dfcf9e65be5c79a65d79a39e116f03a34d94800f4bc3ce2f45d5ce03b6eba278c12ebaf94bd6df7da6c5a7714de07f05b5d0014f422abf1884af8afecfebb608eaae8140f9131ddd4e5dd2581a41c781b59265805092cef952b65f6e023055afef5d59f84eee43a39d7c96497fa2a62906f8841df4c4557d0381d4f6dea84aa85370730cfb97f6c4573accd16ca1eba9ed7cce2c8441d1e280911cb6415f64bd3c61b429050025a5ab8fac7ce3beaae392f7b19132d10f59f1ccd36e9919e248dbac8c548177519132e54778f30f6c61ea2441505999708a6f6864e2a32e372396f0a89e91f0cb9ac6b541432e3c7a6de4f7a087d1bce7405aca6bc0a92b64e529e6461bcf31056b1375c4063f668f51cbb28636f23d56fa37a1c619a71e60932ca4e1249eff30713fe22647c270b6531509924e9db4f2fa499c2007298e561262a9d38be418c6ffe7bcb505153a936e7535976aefc93fa1b34f7ba1db1704c0362e10cef849a5c366158ad1765b85c0681dd5ab415377aeb436a2ed54c3116c974237b878746c5f73c55fb56b378bf2b00a5eb2ea2f1e7c2f4c47f61d66265be6ff02b3e57acb4458efdd79265e6434f72eb05da25bdd6a11c0d58b6315c9a45cd174122ed70fb61546afcd85aa96cbb4a6db49cc530dfa24724c2ba3c1af3e554c82bf434a789aa8a088304a529ff266fe7d40ffe67d3c0078958725629a0b482b42f8a6704e7af8cb0c32b73b001e55b4e241079ced9b95c3c1d70616660b91e41faf7e8945e488163de7c2b8e687c3a55e23897829c5a3e30dd5ad12bef37038ba58f17f538b91bd5a6ba066468bf0ba86459dcef84a394f47d8e0c822c3ef13de710ff1601336df53bd95adf5d0219f7b176fbe4315ce06b3a295df756c16ab04e7f07d3647b1f59b42db7f493cf07c379408d9b13d4847f551e095d87db088889126a6bf1e835133b5dc59ee5c385b9c4ab673b9efdaa67bbcaf5f45af32213f0eb99bd277748cdd7222963cb751c87002b8eaa51307dc0e737a10954ec3826dc73b33e053a8060e0c8b2eb0daa51ff508601c5b24702f98fd8ce464d5093ad575d14968ca07dd73eb8cdbf24dc6533182dc6e4d492e7d6ad51613b54851858a92ca97a6986fdad8d0aad7e998bb10fb89ee3046c09f5775855015f756f8608166b12295e75d2b813cb2f53284936b6822a4196a8facdf4aed7f7d02fd98b214179e564c28b38253d055b493100748bd168f87923a01b39d1e6d8d351d0ea09a37ea2c51d1c86cb0b87ad5ee7c2561d53fd588994e7e3c572e4337be3f09d2b5fdf5e4905b0377a1e2710cf437d9115995399249d19feda68d0f313ef45303146db15e75d58256cb7cc6e0bcf000000000000000049db220000000000673c0fe43c6214bcee02a2fce210e6aaff849f0dfdaa61da9a575f177d0c8feddb1a12b558dc94ca7bafa3eacce3d5158dcab52458ca1bc6e6edd903d95086325621d4e7fa39bb4412b6619869c90cb6e843aa9173d7bf0d866da27d7e07299b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d9f4f4fb6d6da5a9d6f6e88bd0ea9d552123d4bfe97badae3df8806e072a42216cf992bc865df2ee19cd9356a09441a2489012bd59d284b2b948d58477435918d46335f8a18b028346a41c95960b3774b815cdff3b86cb2e56f3e78d4dca0972d4b49d05c61fe0b95d8fb30c6ccd648c0e742c7e774adad80bbdcc77e4d890ba021e5f683c769c4d67cf5e6552b12a38d688c1414d8dd9c3fdd96f1bbb6d20df8e0210c1728550697a1696bf9d06654ec6ce6ad740b9730a876b6e44b3cf7f6a72f20a0405898e206f20023566483785c25b416cb8a1099566cd6f076ceeac27c231f79d70d80862000f5185a53e7f7d4c7f9ed43159564ccd6149024d926eff5718a9030d01b35c75e0840af27fa0163bc9da1d2ddd9f559ec30e9bfbe51c334fbe5fe702226dbd16b6e20ff28567d9b25ce98158e8abeffea51dd9aa658663df6118c338022de8aea20354e80d8b94ad479c94f6c0be5301f66c32bab15930a7747ce28dbd0214af6ee8ee12c25d9f4ade769ead887fc7375dbec557cc12dccae9f4ea05ba010329b63d5f521f5b89e3214c95296a001a5db5bf336d9ee15a67fa98c966ae97757eef01c1414f295b874a98ce495f16ce9172b76c38f64c63c1c4ef1703bbcbae18eda10154d8dd168dc5daf17e7c09fbacd937ce14d51fe204b40d38923a6ce6f8d9afd3ea91c0f16c860b4e6dfe5a2580b6e5fb2b9dece60164528ee103de969414c1ec0ffc780382760fa679fc47ca5ce68de033b85845994f2ae9127ebfa8f2ca1a45dc58775cc3415881424eeac909a0615587600a21715dd15bb9d60b1faf4f250106594122739b0143b2880eb810220ba34fe48b39279100eb9a4898f3f2c4727aad3b67797ffde961242032a00419fc7434cb32b7d1c90203197f4995606abccd5d76e50a99c534c02b0e2dbeb0a622bb8bca0352fad075de8b799c3c85f2b3cc3e2d4400617ab7a1e0f0cec928a4bcccde9d7ee662baa4f7a1e44ed45bea09d3d4dc00fcae57edf91f3be2e829a62ff829ec9e7e61677012b3654ed8392ffc3b41dc1255d1437641dcfb0e247f2b8e80f7731144590b5e83fbc8e44c34ce23bfa142921944551a8813af8ff05b2dfa4089d6af4b7622a431bd4924089a11c04eef3ad2f3506c9edb24406a795f5045688ba03f6d97aa43d644a773db83ea8b64b13b25632966d373abae7be9ad275590b72a0ac55e93ee609e9ca534f5a0ed859938cb55af885ca12f6a79db3168ed2d641b35cf572b56ca51fea5b05d25380058e2b819ac6324ca60c7166d0eee16e6726d1ea377ba4f91eb19deec920d76b846c04d025b098c325b271273835331012fe21cd8e36cd4cbd86f8dff6770b406f98d6a0e30f603ada365d6e12a33ef0aa5f01f600526daea2d7dbe9ed65d94a9d091cd4177e935457a80d95a5182247e91318fd25a7f04d37855acdd07757f7af182f2e7f0096763ed29a64cee7b345c795543036047464f7cdfcc9a11149cd295fe8d429bbb1c9b0465d1eb4af2027be970c1437f322ca378f1a2f92a6aa217f1c4a1f0e0231f28beeb895610925769813b68a3db36e7c097debc62df543570ab394c6b090a7494267ec89fe2b29cd8bb620be7f28ad641253dfe5dbcbf7dc4667e8ad4e0ac0f95d2bad0dcfcafad2436d0ce89e054166e1825b4c9adab04d46af4010322562d117744c717598e647d5b1b2b05324fb7a721a01f2e18b385b3658374c30163eecfacac000d666e1ac056ba0d4a95b43b24669eb6ece8823785b0f858cb13745d2f28ecb4ea9944a6826e21e2e5e09971122ea0f23ddc68c661fddc8c91fa4177a5e260a7bbd6205a713139e038e86965cdca8d5e4233ce1bbb519b0c074c680f417b7adeef2f48dc6d19dee00c5c1d09c589f162c27197b1397a1e4da19c750f8c48e8d75ec8413c49d4df99312a23afb71b8e8675b7d6a87044cd22ee7256394cadde3fb3cdb8793aba4488002fe94d5dcbab17f177bfdef80a684b5fb0aefcff6c03f0b098de853545442d2792ad9152173e7f4b1fd9b2026da1d66ac162b970920f38c17bb50bfe082f615fa7fa894fdcf64a126a049e6f33605340a3ef4a249fd1a7eb4c25423978bf0be83a60a3b13eba61fcab706a26f3b351fb8953ef7e81e2dc79e90a0d19a5fcfdd281d4eabacf1ec11b875c1ed3624e0d2a442af8f146af8220d927a4cb4a748128835b9f930219d6451081f516065830e66a702d3a3b319b4933fa4125e7c455426aeba3bf27dbf51b331f487c2d6e8813b6ccb02f811e00c6a899330d58000000000000000000000000006407df8cce4615318af1e4e93a33cc10f0abd6b1be87aab60c068e8434f19f33e398b962cc71cf517f51886173aafe0b8bf021e5dc70c98b3f2adb56671d053ab5158d83254aa562b2fa55f069c1d1f6a5b560f49a9475c0675a708ad96a889d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088b5d2333ed876ce6dc8b5b97687d747b843b6145d7dd819eb2a6dd333ad19017d45df945163f67b65bf6c329a8fe419cbe75b0be6aba2823b16dd0ea139c10ec35615aa0831bf1df9863ccb211b07a9870412d1f09eacb17423ef7812557862f808b04d647c10fd6f2b55868fd0df818ee1926d425caf9407967226330015dd022cc9fd3aad59b18d0289dcf9842d640d00ce97311c0a64ec691014103aa0e98e021eae99f338cd3a331b7cf5bde1435b10202b7acafeb7e6ee83b6acaf79ddfbb20a08000ffbb6a380350bc1737b455aa659d6613310f2b75967afb1179d2101ef0c65ddef01fd081c06301f755b75a36a9684822d55a8e4de385af9ca14fbe4c3d00217f9072c2d01220a169ffdf55a4bc5bec47211499ba4690aee055ab6cd43f0aa0310fa91fa808bf030701ebd09834a2a382af7e94fb30d12eb9c248c512fa305bd0224a7cb64b2d34851729718ab45e1091266d6d93ed45359619dd61db2c4555da4020bb385eb8fb99104914f5132c9271dd83997fe2187627cf9f7342a13b3c1bb390313e3cd74e061bb1ad281b1e7344e5958c02373da87c1c82ad29350620d38e04fdaca7a42273ce0fba0fa9a60e4b60add0fc74c6674b5cadd9311c8e6353ca7029522ee5ace03396e8ce5f9d233d4b6ec4f76f06e02b30be8b24539a22ee2e7f4cde3bb6c97aafc5aafeb110c6bd944d5f6c0236f6be9bf860a94a7321c6e53c24514cebc4cb35ad30dcc6a19ae514808ebbca67fda958a61b342343aa0641ce9a3bd09a8432853e14c236bc7d68ab758d7341296a92a0abb5adc2248f548f6512f114c21327466557e67331504f3a2765b0a86ce0b0ea0d4a55f8f9afe97bd1ce2193e44c21cd3bea3f1f7dac5f934971874be8c5c7bf3f84d27d7f2b86d0e68f2b6c43dffdea00c85682f799c7b7af0a6104d0e652d4f236f102c67d1ce60865f0497a18a54b0d5a5bff018419e2db29898e19c2105fff9056729a950b66e68588f278eb438cff0e6e36d784f3984dac2d905e49de32ed55c6ccd7ca5150afd7c978931e18227bf4fbbfceaf02cf210d0c1c3976b50dcd6b2ecfb96919545b19fc8e01eccc98c591ff7a32cc90f09ac9b4a914ea68a904bbe876de88a16186d4263b9ab6fe1514bfb5bdab7782a3bd5edf8c9d182923040e401a1fa2bb067582af047001b29746eb00201f5c043cb55340eb3be870a9db3f4ba70daffcbb92bbd0cf5f92dff6b65dccfc7dde829ca0e57cb2d05cdb98882b584735adff1b7759a1bbc09588c13cda95f28ec770c61bec4060b2899cf89b3df049b7a6a272fe55db1f2f7b936a7dcbd18a9e50b541856fa3a55334904427e04340f41d98714cfc684763472c32858da66572ebc4818fe449d3bfe1715b262ef91b2f32354233d0faa51c236a6a157b34678b295aaa3823ea83d2e2d196e5ade0166d75661f9747607642b298b17bd20400b0198438eb765256a3903b24845c73facedb2b2968c5a1c56518bfe0bf8f5f6b4b27fae24a21c39ba9bfa644c4ca6d6bb803d0804ad92d3cd07cd7071302ce566127a3909f3d20dd8982577783bdeb4e4b672cb344c29826c05d473486a5388e0c6675a9d8b9ae8f0cc8b98fcff3ad9f7b3c2103f2d94f1d3014552173ffeb701c9db83726132c241849a2fe5f9e93c4284ceca0f6825198d813eacd627a838b77904a971effa9d2555a10d06fc6c7b0b8341a345caaf050fd07ed3d352aea1ed6548aed9cb1694baa21f162175c97fd6015c98e25efd6b0e76c8b736eb52e008f94b98bd96a4f2fae0d428a8cb1804a37dae3b038ec841848902c340945e657759bdd00eb861e291fde3e2f8a173a29d086a370295764e4cfd78525bebe0fcd9a8000713d6ceb80eba7a5dc9c8c1653127e0c71b0b097743702547721e4c317646310313924102d582fde825980c4d8413f1c902a5d49ce5ea905d1b62e0bc20eec2ab0e1d8cab7f12ba955f2567ca4823fb3f367093e72e440c52e6354b64ac7526e8d0e02ffcec59e1f660e0b23fdb0e0206317bf60f09ef36c0e05b8e7a8c60a06aecc62ebb48e63ad60c3994c1945c8b294e6e8bd62c4a5fc950898c0d6cfd0b8df6dfa78fc1dbe0063cfd6daca8d0a507702eb84bcfbd57246cc76609ebe375b4181357a72a9f73d29c045f96885b52d68b04c168b7348eea89d46a9be61d17cd275d63415c54e59e8d66d2b9bfa07d8bc958bed61889464744f87b2a19451a1f4412015938adf4e43e44315a85ce0d58c20f08bdaa822c2c76ade300626cf69f7d216529d22a146c26a6bca96436e374964796780e0f2f1ab4294bd5541c1c07db33b4359556548856c476e2764638972b24130174e622e6344ce496dbe561492b6e0b72f135e7f1fe87bfb680f691c04336c36b60e5089da9dddc373fc1ba1aff380905", "6500006aac5351", 0, 152517674, "f078cc996904261f8eb4faadbf9be3a1054d6ff12332714b8804ecf060c539d8"], + ["a968771101634e9255986926067f299dad8bac7c794fce2e7a96dd556b17a6f440ff5082a9030000000652006a6a5165ffffffff03a3beea04000000000079a5310100000000056aac53636a9538f604000000000023ecf74d0100000000000000005cd41c00000000002e419abb5365931b86260bda553b07014aa990cb6c3bf482a939883be7e89048d6396d66d2bb59325470b52d943b2156aa6efb9ef3d130389cec17cda232c4549de3c6445bd8304a593e7983fa6e87ecbfdffbebaf001517b188d76cff0f9fde00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8318f96d4c1b69215f1fb772d3cb6e3b3e113642d9fd6695273bc76fe9b9ab0c90cba13092f5c2ad115faa32748a4b2103c75d0422ee6a86ddc713f4ef5df3791493e42930f69b1e12edb1b018d64f3c88b8d1efa9895987e5230fd066871339ae6998660f4646488f6999400850ef1137ee36d7dbcff9da0652a7f626ea15f0206032dd9d6ec49032522cb5e642cdf93fb2a1dc9a334912284d00aab846242b80200ab4a740214dbcbcf061f8ccec85098f42a9745f04c700994e2fd30ad1189fb0a010ff723a4ff146491d5a50ac4c56d9ef9f9a534beed94271f79ca11105c1efc190a629f1cf4a025360fb404b918fd3fa801ae556bfe1ca73d3569e801b1faa3030819ad8706a77c1a4d12b8d630d146f1355a58f53c824dbdb08d128aabf11daf031493d3f718faf34eacfacd0058f3a969d1643941fbee5c7ed84e51929c53075e021dd6887ea759e89be46910dc3485fc56388758b728736e595c05e6c3e8985dfb030546665f2eb76fff45b0fea9b20c8dafc3d0e65114800cb800bbd2683b84a74f02253458174daf06b62784b2f7a58e65b16428b2c882a2bd76119dd46895b49c23381603253e07399c16a7600a65bea088981ee11f277e20e374ccb0e264d222d9263d22bdf2a4c4121f3e7a8256174620e4c014833a3a940bde6a27c4e51709e934bd9f9c4d7ad12b449003d21f06fa3f4047e962c4874c61efec67f5f8f0e4fff8335fb6b198aa343ced4ce987daeb96427bdffab83994616674c94217af850efd109effca51cd820e240cbe81234c1b14abf323c1ec397b5351eaf48e46633777c1d75e77e4bd7df62d6e1953beedbf4e93f0780002f0b7e9c1ba1b9ee349ba16912fda9eaa73fee6aeae2c9e6fc989ee84eb34d8939e33c409db0a46b3ed349a2437ae8412c878faffdcf5ce6a0f9bf7395ec2972b46d7e5c2b2b0d880afd696f8ec2f47f0b8dbc6b9963eff2c5515953d73bf6f34200d4b919ba5e4356c62674955d1d666012ab814dc559ff2922b06d51f8d3dd943d34aae3a1c69af46664905e5f3caa122ed7fe4c424702a7f34d3755d03449613c0507b9c934d9bf4b36b117f086ad1ca8ec7121a450fb96ef0297784b487d7edb3e3316074d636a3925c8f60748eea567d1ec3e7744706b0d65a2a185c05d90aec63869b74ed97ca127901c5de05f3305c9a4526713bc8b1691feec0e366d853c4277a3c3aa8b2d59191d0470d2420725b309b1834ec7afec919f6b80562c298864f4cf3a52f9099571580c02f45fa95bc2753906908de9c60cdb20432ee03fadb257ed3c1af4ae745b3a162080d5de2b2bb998989db9caf78ec095a4181fe4a403b8708ef133c694e4c5875ec13e5185d24aef0cab9e4b7ed1b473dbb5218b731aeb66f000f1a62bf1401452120f60373feb39ce1f5a665e1ba8851db68921cc7db1f6cf64cd60fd3e2d1caf2a2b4c27907108148943fed4f4ca0a86fa4d16e8c941b24ad4fe01a75a143ca72b6ca343d49b8ee84c90eecca3a7499bad7d7cc9136bcca1336761d0fb4b5a21cc2b9a835698198b4f78b0e469a99a2e88bc26ef45ce6d83cdfa06526959a20c473a135b14bbed810dc572a639b05f746ca71ae510bda43f00c8415574aff656d6ef7e85686146208e2ccfa26d0d4dc040ba45c3fd7a2ad871f1af68f3d54100cb9612041f1450a06763f60f6d8eda1ec0fc1d41ed155f5fdc212349e649a52a8fac0d9a2c8fb961a70fe9797755dc7f0ea903e06a96648969e88a2f6996ede6c6a1d66416ad66ec10cf5fdf80f09eb826f001a152a4ebd222a617bce28e6c7788eba4553a5342b48e49102b0b02a2ec8b0186f79f2416699c8b223af44fb6480c41906530ce2fe43a569707ef7a0684ad888f6b1b80382958c7eef5d36b155e0a89b93ae8192ed3df252ad26de72934fb57000d43bc268e161b8e950524bd9604fbc34869d8d6d206b7dd3f03f8905b808f67f6c36de174886b1341483a20778c9ac46311b25be22634aaacc4e6d6692f98c6fe3a055b6ea7a648d8c91940458f0c7b5ecb7bb923875db9099612fc14f17ffda165ccc9c072586fa26145992468fce0b3202162937089caf72a0228e85c889143a6968e7ee5e702ca3a97bd88520048a9ee571183291066d7aedaafa1cc03168137fc29ebda3d6d4433a1d78daf045a34e8f1058f32214593995349d25e85ab6cae92d82f52a581816947bffd5c1d43e1040ae99ea521e596023e3d0e22cfd3e87ea0bf81e09dd3582e29e65c7e1208c2acaf4aee70969cc3fec0b9d24105cc915a686b07f891e0700cf2c4dae2f93af30164bc4bf8610b7be26abdb767107ddc4c364e07b5c156217ce63c373317b73ee82a41952efc552724c7e2c52e0c48431702c7bd05c07ad459bb0e67d0ea63e1ae5c3e7913eb303730708", "006aac5153", 0, -943551585, "0154b6af0fe2e3b611a29448681e555d953d777a1f4be994eaaf0c867d8a2a3b"], + ["b73c651704e976f4b030afb12fbb91e2c7491eff78da9081f876e2f6185034f222cbab273100000000036a5352ffffffff847bcd6b90cdeaa9f9b9037212ead3bba6d28444daf5bc46930b65bb170d20de0300000002525390fef14990c71995d4709b97cacf45690dee61e8dca723d357608bec83b190cfc0080ac10100000002526571a96c6d9ffd34160326e4ce717ff950508b68306d47ecb09e818af443f32c5da0439ec20000000005ac65ac00531ab1ff5e0252f52403000000000153dcb798040000000007515252515251520000000000", "ac00", 3, -1700621042, "76a9e3281baae93a08ce29a188794ac563a016a3b70a19ddf8c0411981c59ffb"], + ["030000807082c40304c914787693fa0dd0e89caa80871881eee2b6357365e0d639674226334fc95bc3030000000400ac65001bc0f1c74696ffccdb30aa81c2d175b21cd5277f91d9249231fb89dabb3a29c59253f80e010000000900525163525200636affffffff84e7e4c290b6b3586665fb3c26b5bf1e66afed0dcdcaa1661bb83570884ff81f03000000040053636affffffff21eeb8a26d75bcdf8caa3fb1ab6f522f18454153949a9eabb002275190a781360300000000a86cbc79039690870000000000056a6a5200ac8f9a1504000000000151537a800000000000036500ac000000002b1cfb17010000000000000000660c3c03000000008b5ffd0170feb104e257a2fdf5ad7a2e6adf6f0da99c803cdbae270072b2e7362ff0899647c16faba5cd846a865f1bb1bd6f6bf2024c6781dd7e723a218d3bc9d5b6c366e39c74d1658c1885f1f7836f69026321c11bb6634874d78f2b9d7f4c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffbf3a8b01b7373ac40032ade5e16649243fdbbd4061d3e8260d3dbe61e1f9301d2f5d7f8c35987ddda505da488c79010c606f917f368eacbc9e2b661107df1b8078fb49646b77b8fbb388e43fef1c983882050f7badb518f9fe0b9094ede9c8599e338830fdcbc83a6d25aef6728a04d2378c6330e21c17fc6e640e90ef70f020ae2189d4cb32136c52f97e76a8cc75defcd6351dd73ac7773141125b2fc2995032309b32eea8b8021ab6137be13f039275baf1bcee2dafc5e2c44989c0937e1520a07df1ee0d18b0db74fc97b61f69e3d29817755d49b0e79bbb27686e990de462fea262a86984d950c99c04d183d8e042471f899dfa3b56a15d3118ec02d099011020bd0ac8194c727f8964a3d05a8583c24d9aea241208ad3fadc5d849417815b94020aebb14a6525710e67cb55d9b6078b50aeb3f958525accb9857198ebc6922ea60308c8cc8cd09271163da0d17fb03a0f70ae45a2a049213ffb837255eb1e5c577203248f5d03cb4542295623c67123976137e06943334f5e9d7b11ba06a79ca7b1030201092d33e79bc3208b76e626dd2c7f003654a7393748b1481128deb335c1f8ed3acc784d2762c10f501d79cab9db4a2e096b179216d54ceb97e1cf4e193ad8977a90f739212f12e7ccb40f57676e2099a0255d75ceddb35db439017d721caa6df8e77351b8720ec48ad41faaac70a104a5d9b1d748cf557111ce123d813ebbc9f0c3f0acb817a6f2f3d029e288dae9e97bbd9e7f5a3fe7270ae48ecac8fa928119810a39da935f093cb53a5af1d1b5bc6fde9e36c160fdac47c99a8decb07bc9e22bb5c77129664fec79d9e99e279f74a9c9e9c33a7e6abc55bc88932ee4b15b20ab803b3cb86ae82b71bf5b4d844652b76fdbd8c1c0ba60316f5c759714a8f60b0e3a66ed2cdef0cf23496039048171b6a591e1275fc214693d416f3d33f973b96224d2fd9c4f124dd544b2ba170a9e75e21cd8c6d442115c0c09a61099e6cb4826ee2135e035bcff45731f96cc84e17601486a022ebe4513effbd33e6869329a71f53e9ad0c65db6671ecd7b67799d7697c0bdbadda6907712d74c7b74c0d4ca6188bb5976d590f709e3a7b3e08162233257a227e5901240fd6ef2aa2ef2967408c36168525e6ef483d7c30a6e05cebbda21babdec70a94ddf440722fc10cc778c8176853c277cceea359101dff4cebe65388d6b4c911eb0c58a2282199ff31909a58e027716a32b322b6d0b521a7d66cbb97dbe26d81567b11d2bd0670c6eb719a61fba1a583b6bcf462a79ec9f7fbc499060f5b70fe96116a50e4792b0969e3f3e5809ef7fedc37e4c3083c24c916ac706160c32c8dd3b9093d7f32d1a8ae1a469e4be97bc76a805a55fb0bc5a1503e55024030999f6f9e1829cf5df236dd3f4661dac130ec4554f256fa357266b67d95bb746cd5ff915c60a04edfeb0168dd8e0b8f27e6ed089e035116a2e3cca51b6cb585b9a687c4600b92f1613a51026ea958af876d70d87e3e3f37e5abeeb4d4d417841fbc584074359f21a546ae7108f65e1946501d8013116799a38f4abae111d9f06bfe42fc66c094af360c1eb6f925d7c061673a51cbed76a90f9350d184a7175de280a1e19a5ca9cec2ee82430c4916ee23b894eb9cf44087b3180ece4e88136cc079937066e926a2e3a85c36b765ec200dc8a6ad0ec2167c6bc26458e95a20d5bdf0e38eccaa57b2a872b0c3196fee07262046f6fb32a1d8a20ad4ceae8da10064b55693cb873cf255690e17a38c335c7865412db7151ce12a70548b9d5a4c167fad9c81bfa85daa80176b0feb2a1b3b23861c57a5db39a570fb1bec7973f6a0191238aaccb58d1b74461490c74442861e0b43e546c37921fad5d46488b0ef6031419ac37017b97b685f1913221d49cf331b748b32c3ff3721cc1c245d95299295d90dab1efe92b141702a3554994e5f9c3382cc0d80d5818311d9fff6e6a619dd03d6b62df38516b0f7799655922d543d76e71d34a7a493273215fd073fa7e8c1768b6e42e94a26b644844d475e9c570bcf6c927d76bf3d013a7d371130c3cf527bea6b60f000852dd9c7ba519b589ae9b66faeaedef45b78f24f1e30a3ac0d8b256407f5f9437102e9bddc2936accc7c3754fed768a44917fd571e2215eeea5ec4fef094c6de7e2f06803a00a83472a26740659c765a695338c2e5defa7dd530b4dcc098cde116cda6b4f27256cece0c734b81d48f14b93a15a22fcb2f3be9418968bac301bd866564e8be0450a8278119f785a6bd51ad5ee89257f1eec37641c65c298ec59030efbceeafbb41cbb44fe1893e8f969a9ac207d42a2dd61e409b755b911acc612a1e7f759b7bee9542e54bbf306be04ba7dfe86419c254ad12d2309c52c9d85852233c73754a19aadd0bd4c812e108dda2a8495763309", "0052655153000052", 1, -1039718550, "c20f4d3698a5d602e127f992617d10cf25dfa6c106c00bb40b59555e71333bc6"], + ["030000807082c40301b9ba48b4ce9ec07b72de39a0859ae8bee1edba41998c46b42dea36e05bd279f60200000004ac6a52655c34c99c03919dcd03000000000451006a639ff7b90100000000086553636a655351655d00d502000000000651ac63526500ef6436470000000000", "ac51ac65", 0, -2023578091, "272ab4dcb556b98f62fe5fb378629609ecc6e22031fcfb6a4b104fe08f0e29d6"], + ["030000807082c40301ad1cb16ce7de80fadc20aa21baff18e770bcd34cbdaee7b4d75c3b9003aeda1c02000000086365636a0051acac5dce93c902c378c9040000000000ba138401000000000651516352526ab17953d60ef74bbe0151f201010000000000000000000000005e2569b42a01d604304438f0443e555a45774bae0dd601b7853a8e2ff701bba1bdc0d49a56cf4cde0f357bac41c0833461ec38500bdd26f505298701cc669e120baa50137708b6b0207d9b5702938dfd02af0d3b2b883145032d00d796f580a600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e19fba33a0a92cba52cdb860b594191eef9b34ab8b6e20bac4dc182fb1714c9f07b6474729ebe91fa616f78829e18b53ebb6ae12fdae66c493426536ee167f63b8678547764fc8d540593f14b95f40ca7f56d59f14c089af1facaf2b7facbec03513942f079bb08de3edb3002dec0da83c93a8f944929ab6f497b12fbd7f4ba30316468416d2ee24ad07561364e0ec47d33575bc2dc850eeb80ee8917ea9c71b3e030208bda19170d77bd25fe3e38ba4c32634e8c59bff3560a2acd458ea213b6d350b07038d7a0513cf5f4f0f7634a965779f384b7ec5e740faaa770313338107c2e792701c423ac090c1f848e654a41fbb6c96c85ea6440947d79f23201c61714f37021d5f78b3c4f731358956f3430ff8f2720548ededf6070412d0b4fc0b03d183b202171c9990c53048d6706b70ec68b7f6edacd4e41b2265a07864343a2aa1400c2f0308aa3d6e08a0ee4d6f38035a40f61a8eb061272ae3c3ea77b322df383c64f0790314de5302af891cbb9066476e9868885261b7e5d2d5545816fea066b5b434c94b020f93b12910f8c489f6c0422564497fb4343ad4471b24737b95da02eec6212bd1bc848844e50e43ddce5654bc8cc074a54ac4e0180ced5483ee4367a1cc983a1321a69eafe2822e9dd266e037950810d44dc409e74196c02f37c9b5b886a4846ad8b5fd8f362de96205dab682a53f271952370240fc49f5e1cbc94b116351200a30b43ff7179bc94131d142dc1e8ca40010d293c8c26a1281b954bdc5f5e3f1f9a8c511171bd4ed4588e7d904025b304c85cb20705a3eb9b4c952404e07c9050b61e7b88eb38b114bc72eddfe1dfa4f40d242182d312cf932564d74a555b65765b6c0e5f8fc5b5f27424fa05ffc7e140a5721a351e98965387bc35bccc60b0f6e4ed7f1922a1906f4b54705b136a57ccb9ef0cd842be253a4992dd5c0f23312f2644aa1dc43b8bb43d4dc814cd438214786917fb16b9fa55b7d41638903c00f09eec09a6360d30a17294a3c49528c771d2033c5adcddd67297a3092bbc81ee89a7e1f982b8f500e2f768d4214abd13557d9a13e5914d9f6ba9145178977a75c5d43d9bcacad504fd15591b2eb764a27b867528ffa5294738c128cd8085c6cd66067092b3104557e952af2e69f2ec8b2d4b6116f82aeb86c6c928835b196ba7265d33b672aa5d82fd8cb301d7f18d79603318bd5b34b642f711132c50d1455940e07a7111103163adc2d7b1369eaec124bfce9e26662bd9675c89a15586f99ae18556caabb9487abc6b6a3e4e1ec41e475643d485ba344c27f8be53e0ff303a4971a00c20ac0f2899c9947418b72e1fe9acd9f01c43b13a0b1d3bcf6d68f21f86a3aa7352666cbf358ce315d00d56785fd71b2c891a0ad9b6bf722b1c5b57b2eb43bb707cc48d6e8f7d85552b4041f8b18fd14d1dbea859b47264faffa02d2417a0c87545626ea84fc82575baa39648867acf36bc2e02f514477016872fa86e3bb096e3fc244ffb9635120abdd1c32072f8d6c59353228d3a22317fe462f10723e2434f46134bf5290c74987a420c8332fefe3fcf63901d11caedb0a6312b30fd8dd4d05395ab2a9a982694eb9cf3c67c045d7a0f44ab022cda2ee39a29a2158c609c581da4278cbd3811cd003f1885ad35dc4c3dd6240b9f5e89cef160618030af1901987981bcbd5ee1318f60d0ee6dca07baa74037a4213b2342c933d1fa16ad7580eff3e6583920fa5f60154cb3b5893d2b0cf82566dd737be5a77bffa54f672fa7af03c1cd5e4e97919f7f55fc88200f5040fce02ae4375cd475f8a38d4a93d6e165ee20864fa93284707aae469d8c8d642dff83f3dc9e6ebd61750d6ea21cff81465aae1d878518615bf9dd3ce375491d7abc9aa35e79888632f647687328e3608a43bbaf0c1a257506539cb5b93c77f36e2b5fffde9d1d7fcf7a2fbe136f7201fd0f936ef30cdd17b160ce3fb7d82fed962f6784457358b91456ff41a2e7357d9c8088881a1ea42811076f3ecb14b586db7865fc02ca57d4ffaf840360477fd6fa3cab8191fb1ac9fec7f0a01ec541bd9f4cb04a054745d484e32f9c2b67ef7ddbe3c2534197116f4ac5fc9df79227a86c3a171d690cfd4f9984f3ca93b7075231d66b4dfd0ed05acee0e7078f9a16c891e81e581315e4c132af17fd26930712558f595e5979b6ba5795eb0f09c57fdc4067076313f66a545f9fb5eab461036b14070cba230cbce47baad65a62cc372114a80388e960314079676b8794a256942ad3d2fcc836ec12ecee386e876a339cc739489f16a822602b99363f7a4b21b043d460c406ea8c81157f2004ba46477cebf174cb981906750147abf230cdd7216c8655236f33ea0a2fc73730d36bdd5670aec2c4b5ec4f5bfe9c51049cc968992c117a6e0e75519f8a7d3d59bb47400", "ac", 0, 145871548, "ae846913642fe9096c6d28ecabaffd421579bce46cef07774b9f6b99fb088c3d"], + ["5b32dc7003d90d03629efc61944d638add7ff73fa03429a7c88410c9f85c6f4729dc1a154e02000000025165ffffffffbae04f7fd48a122996992c25fcbac6d58600185c4b2f18b089589281657faed20300000005ac65ac65acffffffff56be94a4c01fe31b3989d30b6a32a246a8ca9a25ba86db4212bf4b93f01767b003000000096551ac6a516553ac638871071702a00014000000000001632565f40300000000096351656a6365656553e126f5f602000000000000000044a5ca0500000000b547761145fb02a7095b00534b0ef13d35950dd4aa030ebaba340a570d134848cc1b57e70873ac7134b643a8c62ccd0943cd57c02b5af8a69275e884e5efe327eda861e7485fd8d759b77b873e01ab2c286dfbe9ff5487c8c59a6f7d0f81de8300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d7e3886e263042ad70274f2544f9e7c59620c9442d450745f2c1adf2ef6f71a02b49b56ca8194faadd433159bc78b1c6845bddfbadebcc60feb41bec283997c36c668d43285cd09ddc1714805cfb454eadb762d6febf4b92482795f2fedb2d530b284573c64eee307af5786f46124779dd1967faa129fe630b9e554a04983344022221482bc804d34ad240e2f5607d82bf2da432cfc9d8512d42418ed4701f4f73031cc03d89a98fcfcce66af69e245cde4309deb0189f7efc63ce8c48c6d4ee25040b016504abec60821b1af8f8b84fc0146b2763954828b51f9596951e674ae4958f77c8e1726636431ed45ef86df4fc683eb2e91734bf9729287376b4e8070c6f350300304a7fccbca6947129c7e2232d7d9cec7b680a7825d8f459f311aab5a64bfa022bc89a9797f33f119ddaa1113756ebe095ce2e31d1d67a20b5d8ea0ff18f73ee032e17b13e242f7288d7bba7b454aab664b24cf76bddaf53a50ccdba4a9ee4c028030a55ee32372fc56b13e7712df8a2ee4ed054bbade1822ae4c751d92e6a27ce3703013dac89352574e85ef14a7e1ed37b6278d507d9ce1744dcbc9380f6fabe719cdad017e6eefbda0a33502fd483ad7a69b790259a3446bf1fc506212faa3be4d0eda58a311e10051201223775f48b682923f1c13bf0fbcb4718e49ca03c5bc04b7ac1bf93b95816576cdc80983d7e07f4afada449e65eaa2807a180b3f7fa17b455b1e7d6e3080bf58b4cee2b822f54bcf0d0012268aa6e2495a187839bc7a499287888984dd76094ef48eda632cd8ff04b8a481137b17fa0d46f12d26aa537b246dd656df215931e509fb128d8cc99d46fdee05aa4037a286b33aa0590369e2c5812506fcedb3173e3e3c2ffb235e1170f00b587418af082493ed8908a66eff729b0d6185ee3a8d960aafa9ce77d1bb15049975182f9bc7b0e7989e42f1349110d1fafc9efdc73a53194cbafab7e088330f2b6889c3095fe02914397f4e963a132b4f47eeb45a4835bd6e1c424e5ac7462b98e25af7484980d07d8f28d313dba82a96efcff34760ab1b4057ad671baa7bc682c00b3554b414f585bbd940ff3574beabd8c297a2b236d2934ef08af894ccdb33792858767af54c7b3c7b7c12e0a7c4503f130ff39c87c16ce90722aaac695df51e7e89ad9bf302257b34c75eaf5ea382255747847e80c4de8580ffd125c197ce3526079975db5c08ea085e5cf55c74e11e0c6e0b5e2c67b82adfd334d4c2c6115a8d0486280119db866f8b9aa1fd43570aeee250a568360a10a32b1aa44ac32bc459bea7cab17fb924ff2f8e94746fba2b76971d657884beedd32290ddc10568b06cbbcc34782322809da8dd5d1fd7fc71ced65637a14b43a35d01623977473ce1316934d80af882bab329144a38f7291768c19210b58188168b72c0ca1d7af7513afd94d2f5f7d63e314e73e47c7c9c65f6cd37c1ef7984eac7c3cde05722dc3bb343852f36d246552e3b312703a84036b1cfd59ef93cefadb1578165c1b31f29ef143823428e27507bedd1ebdf976d38a23000762cb4d0b81e69260bc1f89dfe5e586efee9f2bdbc380dbd0964dc5a5b70e8ada956aa4e74f65098937be0f10494f07d1dd1454d5de3f75f2a4c430fbd717ea9f541573d77e996c4017bc1f38202a05bd5812821a0d71040e1e0318d8bae4042021585621805bba0fa05a4040d2ccd1cb8ff1de72497055ab39f65425ac46f23070d434bfdcd23d7e8501e3c88a668ce8cf6930b28adb0f2ffd7e3ecab345f96af9104812030ae7c7712c486c8a8755354ab6d7d768e9d01f76d44c20b2325f23457f231eb7022b7e33f4b7723b5a40f0b2ffcedca7c1ddec9d879b16efa2feb02405d2d658c78bd3b45f0b73afd73351f40b480ce5b946e4c88b8b928491a4e89a2184cce24f40240a209c5cc6dce528ba91e7bd3563df7ae2b74931a6db38620d7573ea905644b61d1b86bd44aa61f935f07d202f4779346b6f0ed7bc0fe69715bfeebdc9428376680ef489d7f71d0f77f570fa175a707612d4e0daf3965ac467285d4b620d7feb600d94e5cb4293c9b6145876b52092eac91c5a3e95ab8568e9afd489647ab3f52570d43b3f014b8fc368a5d8a97ac0232a48650395cb0010bca37eb8faaecfd3ce985235e819b08c8cd0cc76a573d3f0693ca504494031670a687058114e6a27ab4ab6841dc180cd4c693c6b902d13162bf58885f6b826f7ad447d88a59a1ce7a780a61660682ab195c612b6a81c00a20846ce9e95607f1c4752ee3a732fdf9bc4c6bf1d4ec702000000000000000000000000bbc3f1f0bd8cfdcdb2926b8f52b108b510455cd68784338a72f25ce5c3ee47afca000d33dc9640b27efe79cb3c0e3916a30dad15c8c7547d7b22cdbbcbbcaaec31594bcc1e42ffeaa7e39f274d474278674abdf089b17afa06582e625bca5cc700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c7027a114d3fc91c7022996d3f1ee825820f7397bb31384d685417565533701733fc978d63af671471859667647849d21f8a37a5c8dc9787e8d1040fe16909af9ee2bf7e6c7851bd6dc667cf369091542fefe5ed3d989cd72ed1f29210ae026d3a0075105c2072f42f5974481dd45d4595b20b81adcf1b2910b4188409b6e0fc0308154b3bf67fca2abe3c281ddcff614f15b30b8f535f4009752f1111b84b696003123a276a5e8b057db666250773216cf8f8456d220c96113bd361f6191e21591b0a0573d871a0fc8dd55990f8791cf6638b5b9fac379a0f1a72c65009d80254a495da11ee2924ea7f0f2d20f9ae4e00e97d5309bc660bb2898b2de7e57ba0db29cd022c0278e7c7f4ed6925588c54e72e4ef3a5519d8dfdecdec1d2fac8f60ff7c355020ce89ee8ecaaf0d6f0dd2cefa30ff4aa3fe14118775319c2a6d2037fbe4db6230207e31574ac2d80bee6e9cdaddf185d571cc79eb407e72f2a40dfbf1da5a3448903208b9438deb665e2f421d9ccb109794feb8ff9458a5e8f02353452c1ce2f393c032d9a65964e3278b4eadfa188d4789b6ebdcbdc86cc60eab8a15de10f3d2a55619dc04ba579bfebb925286a44331d6e318531951aa3ba7a7dafad2d2bdafeb1377eb0f53ae2fc3a4050e76012dffde70e87e95304813c3e914396ea88e9ddb5ac742b058b01a5309e4767caeee426d1280b8275ffbd8401d955b2aea4baaca0e52d935dd07c6a662244160d5265054022f879780162bc152916b533f037dd10521308d90e9680b3b0938f5b7c4cb810ceb0969157579b3f8a1ca7412f158fa4efd5343e18b6de66b631293c9af3c1020f3057ab990b5c6a37f1bc0222f973d2c5fa43df64fafb169052af4c0c1525a39b21d389f599d728cd72eb6c33884756043a01b57a485f734164522dc01245ecfb035deb2de77bb1f63c0cddb3b9f470435c8c0af8201cd831c5dc7989f386e82004a0db67481a36ce812a12e5bb5d72598d62ced168ae0c88906501c8fed7df6ff025b879f159eeb4f689be244e6fdb397216b360bdc12bba9454fe0dc9d16cb79225139896f39d08fc43412046d79c347658118a491858741f703f6d7437ef6ba3cc6a82893c7a14d76b49bdc38e2580ad577eb40c1f1c445f4618fb0d14ddecbb19b5ddf2cd4212489a48018a982d13d91c337e9c568cb3be2a9f31607058fece5463203c2ef969cb78ac54c1d9a000e950cff0afcff3bba14ff6e722b95395e1dcee60d36e22983f9b25871cff743114de362aed86bb2eb69a4eea11a7ff9d59d6ffca67fa64132894fce8b2b5932ec2cf7fe2a8d9ea58d1d3c1e3e638597497f5eea5b23d5611a2668ace99c1e00e68ff973becfa8cc19733e8bef95bf96e5b8adf1f714c7a02b607d92262d08d3eeefcc23bdfb00f4ec3c8bc600487dfbaceef7431042a4ae8b2326ad4c35230f8fb12a7cc82964c9af945cbb3ee32655b322263764ef4222a2e6e8cd9eaee42249427ec97e0e6e4172759033212b80bc1a0c2e9610e8766e8c0974002bef47d25f804481ecbe2faf2a11ea53f62db59dfb882071c26de61ba5d0ea05ff21dceb3eac6c66bd11b8f1e44a69d43e90af2db29cc0e1106c42f2c0bf7273e5ad407ab199b84b5239be6a41efe5027741bfbe3feefbebd51243a13663201d49f57ba67e3e2748e83de552c5678e5b806b7f176d701876c33c482d9e9de8b3b97ce6341d2ca8c8bb4719af5d8d9b6718b84f21e6ccbe05ed7e422f436302ced14b3e86958be6bf377174cd339979d37301da5a5ed23489970206ef80ec29502882c3da924b916b6bad71d70997b8de89410665e14b627825d76af5fdaab453965a60c6570c5822a46bbff9a2b4ad997facd128d4b1c1172f5225496c270f7a1ec78f75340c21e8ca573f7954bf567ca679a56637208d30c861d90e2497afe6edb585d4223ca7786abeea42b3c84f458ef747ebd56be739baa87872673851817460eda4270aa0d9ced7c617a8300195a3a254e4adac5cdbbdb2ba6dfc7cef8820b29168eb5126c99a4cb58cc6f738eb3eff507193096cf2ad507b5c58fa4b07abdc59e7947c13d8daa43400770fe9285dedd52874b8946c7e2a1d92276e523152b3970187163a94fc58de01f41a5eaecb3ed2cedf4932a397e48744dade3edde92fa431c2834aa8b510191200f4706246e6b544307664a3121d89f7881f68dbf7cdbec4c3dd13df2f08e7231f11b9a64820ce295c13d7175becca2745964552903247cec4efb02e85bb2b3c1b8994b88932017e42eb72e9aa56a4a4b3f779e6506fbdcd6839cb79ba24a01b4712df72ef6219ff9a95915f938f03c672cfcf9401d9f3f88d8fb43b4bd497c60ba47ee7bf5506eb966a295af435dbf5628dae0abd75f88e5b03de9064ff33464be53961af2b4eae1d203", "51650065535251", 0, 1336680212, "0b09db9c57c617111c0081e8b09603291f29b1e4523407fa9223e93ea5ead733"], + ["030000807082c40301a9bb7f1e95c67e1e2059feb5b41bcda0a3a39e38c1e7fb4b0d0abab5f0584f50010000000453536aac64bd9e5c01af73ba02000000000751635363635165000000000000000001836d3601000000000000000000000000f6106b2d074104f76788d446e0b1930eac3d118c4c2a4f9672ddb930f58a7b5f39627ce4431b1effa8bd9746f3ec7bf031a8fff45ccdcc1fcd0166fd8c7f89ee52dcbda4a43210aa69c7d11f6a34cf9fc539ce47fbc52e6ffdd8ef2a6663f52800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a5164af4b27828f0d4398adee39758e40320a5d25de4df462dac40068633ef2e04e5d6b957bdb22adbd900ee472b97cc8c4494738601f49c07eb9e7a6f788cec2047e828b9e7c915cf4bbe59c287bc80e1270e99e4f0462adcd1d3b9b13599be4c0f950c124bc018e3905186c135baa7c6a616f11eb2896ab7d75fbf63b774fd0227b48fa7eca611dbd7b72566a49fec156d25cf29253fcc9c85b20449fe642e670212631fc09ec400440396ed21994ae6bbe018140e96b9cf88ae10b914a0c593170b02afaa731627a05533d94b7ea73553f44b565e566b0819a5b687671df1805c9a733b6025199a3a05ca22ee4a0dd990730a06ac5caf706be77b09ace894ffcab2022be7a064ac6ae817700dadee2e8a9e88defadbe7a13ec57b13ec9307be751cb002056ebf101234a89d8729164cb1b2eedc8db161b8371cad7fc64e1b289297a5e8031efab618118f299e15b0fbfc73de7855140d227d588ac5fa3d473c929f9bac7b030b5c64857c6be25bebbb541b294ab2f6336c4cbc684dce0d848a53968161069b021f10a87178a82d00aa0cdaf4d6fa4fcd6a05135213183694e6ed0b8b190c02cccddbb9e921aa482ac9a91ca4ec182be40571f25f717c229485651108f45da4eca0756e66cc843c4ac48c7cba5ad6645c373347959002f778343b4993be481001f1c6f576f0087420d20871165bb701161ea0cf4775dcf1a353a4338f3d63e8043d830e9b21cb77fff6e8fc22edec5b58ea55c6e70818728b2874f4d991d7bc75dbeaa8f0301ea67b70a8f2f2914479ecc7d61d5cfa3b12d124b3a00bf6a250a2376c0281e87d6892902fc6e41898727238fd440fcc538ec9b9d97d759552e48304835ac787bbb6e3fe3b875292d9524950380cf173bdeb53c023d6854a6428aec8cd6162853c231e2ba1d4c368b36efc204ca6a200af65a162d885d088993e991df956bac1c56e8d34cd8525e9964a7a274bce2df7458f7e82ec952196d37eecaa0f3ec157307acd112733bc49061d4b402b8e500da3ba79960ca19bea73a8af605497fbd0cee4bb4781fccefe668dbc9d0a58991754ce92d429415e2fe274c40f7e6c3e997d78716797f566ed30253f743b2c889a710bb7502fa6134367037dcc97e100680b9113d204b5a3484598ff0cabb6d741964c07cfa03a8a4abade0593d6e04c400a2cc7725dddb68b6d9bd71aff77d77ff553e36ae88959a53c7db382c129a5b84aed119b54acaa45051725a2c30d6f7908b2efc47181656fcfe6d0615ab0cb521c9dfae5239435b4796e1e787eb0a03a6f9870a1c317f3c89034a6562131efc3e338a8b6c38d80a4a2ee9faf51de897d0ab139a427e71932386f9d8c90b4570ee2b3744898212076ee279cea5e85c6ec3845ed1bea80bb2191f22a4aaee046af0968c49878fada040abab005d774a1cc8e0e82fe432c13704c416b37b50c766664bd28502f510cd4cf0f50abd345833a2ddbd95c11768db7df54a10b833ea58e0509b2f1e8718aed977c2c5727f9d21e64cd8f4196790bc25fd17362cdaf76b4e5e9d8890939b53d44f06a0ea8d918377f0d16b0cc12393f3c78a8361bdb5aba794a3a8a314ba836ca09b388c1fc023d040faebb780a7bea02805d37365274cfca4818fb400fd046ce03574bd5e792461d03bc341a45e0f92def2032a17add0101d217944f422f7588d8e27ff5ff88d0f73e47564de3dcffae3e5b6b466d9237c4b8d6ec3ae9daff7042ca37765c31750e17fe7ac98de072b3d3d325b4c049ced0886ec1067f2c1f0ac7d1e1ee66c4701daf40abe28c4a6d7d3853030e551bb25e490fdb008365f1d3491dbb0f62fbc319a3a5d0a866eec0fc884c65e1a8ab298905c4e7a88574c8299bc5e3ae18e5de3c2f71e078f8560f3e3e6c51f6a12080045cfe2aaeec7ae87baf14786d6dcb29f8d60f6ac323feaabd67a69abc604ef315111dc6927f241f4f9ebbcbeb24b8e0620806e22021758727e8b26c31c0cb11433761ea32f61dafcc5ce8e3f76b9242cd91fbe3bf689e2d6e99764b92d7b228e6fb9e0081a3ceddf80689695ae7ef5175b45c822b639c089c342118d34d84b14c2b8d8bdcbe1a59f9056dc2531bb7ac4ad8b370f54d0282c71c1aae25d3e9e02e9ffa4e7df5615330dec0775e58f86a9a64394cecb176400b0e91010f5d9cf209b52c38c10740fffe323217df948bcdc2d8866ffa955e65b343d7fba6ef013cdbf434ed4028bb6c0933abddfb52d717657f623387374e175c9a2e792f2abefc3944bee45f4e71a3936bc63915d4b25f1af19b670abadb2361f9139dac1c36e94c5c24794ea814b3b6ec734936913277c723fa47fb059ddd3a8442c0e9357f6354819c23dad90ccc081d6b99e079aea8c160cb7cbdd8369481f173efe2d69af7e00a5769444d744c04b3448700", "53526a005351000052", 0, -1914054718, "89301751211e14216c8e3008d7aa4a82672ca7d9af4b2d25e8122381e2377d12"], + ["030000807082c40304863b78da0a8b922a4504a161d77fc830af416feac9452074ef05917336f1097303000000050065acac00679dde0d55d1329302fb2d97688b89db6d0149cea1ad511f844fc052cc550fde8f29d3ef0300000001538061b25c9f01ea636004cf8957abd03bcd7f81050a2b1dd87f518945f1c8d0614a251dab030000000765acac63635251ffffffff146e2a575d6a47dead47b18d2982b60158d12334bf540b4d50bede3e12198413020000000463526351ffffffff0199548c050000000001ace4fa448600000000010000000000000000c35da50100000000868c639a9e0b29d7aac967e8e6499d0153069ab2ab0c377bfae980d57bc02b2c514fa1ed09ba00af2d8b27a1e716b94802c702119761727189c78ae1cf4d0415c14f19d376d9235ec90ef8221e7e443b1f74c6efe55b88f5a58962847b85d0f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ef3ab42c232b68b6d6b00a71be82b80ac72f9bba69807caef7a9b688bec160eabb512cb1cefe84b3fc97bfcfc76e157066dd43edf51d375f09de7260c59deae7d64bd616cf7cf025b8c30bae13d2c49cc556692c93e0a3cdbe4dfa79b575769fe61af91bed773f56c23cf216b77a414148f593c8a78eb5e03ba456ee9bd71d0f02109f18219c684b6f8ebe2bc026af4c7ca899b20da47246bf78c1b59176651c650207b57a20bc6887e15cec43419be0f9a88b5010e358c1add04e976c646b09d03d0a0082149ac63d4e23edaaffed088e497657abbc94fd4b06ecaf1eda7d8fbe32f3d455256d5075ef4cf2083d366d88d6870baf5d9bf77cf41482746cbf0a16b9210225486dd434ba3f6260bfaa7d3766e9762909726f1b0d360ca2a9d4417b97646e0322ac61b936c93b1f5b8983f5c27f2fd4f2f540b7faaa19276d3eae05a9b41d950225f8144b1989095e83101db10296c0973d8c288eb388f8e12c684a9ef2c868e903299d563639f5747e3de40e385c333d7fdc2bbb9b6f86605f15e6f11fd68a90bb0316013ec9bd5ec53047bce0952869ae3c652de9c81fb70ce89a4b1b457717fa41963cd236e6d8ad32591e2b649d284bfdce72ce072114e826640ed0acc6218e7540662a92086ee96966c81acaaf41060a7f31815baa11bb21ffd794df4da957a0d1bae608cfaea5ef0832b07ac596988e0221597b596aa869c375bd14359830bc13f52d924a23023275384b3b9ea0f60d01c5222145a0b8bb114fc2f534a4c894210e608105cce8335da9943cd53e2c303d83cf7906532784072b3eb7fbfdeb89ccc293bb895ae45294eded5f6455d4a3de787ff108e772701875a0b9876e7ab611ea031f979e11292c197163876ac9c3f8dc0d1ba36760e9c2b57cdc36791322033ec5c09af02174106d2497440db9710ca5a02273ce2f7e944bb1eed423ad247b9b1a251638f1535a4972fa4089769b29ae081efdd5fa7e04b10fd33f7857a1bd69a01a881dd16b5bef201e04e843c2603dbf15d7f06fa92b164ee5752029570fcb10c25b70bb35a12373f1b094ab1bbe10b57dbe0f65a72430fd9ba296aef0189894701c94907ca9100bb2cea74d7e257e725e97faffabb9d0efc45634795ac57191a7685371973b1d766a49ea2e6f1bce03e6695ea890cb6ae7bda052248f93aafc6f85ef6771be98c2a085def843591f932d00602f30b7a52602b2b96617758e093b1bff0a6805753ecd0a8a6961acecfc3ad6d3e6f99a92849213ced9891ecaa56ad5abb0c5344ac4d0bbfb98bf8acf8f0bbc5eeebc44a29f04618018a746ed2c682601702ab1817e8987f03014daaf17d90497dfa39be712e6f87d99df0e4f604d646b479323c0154ca34598594a70fee782fd11e04300a16e09bfd28bcfdc97a62b95db0ca34789bafb8a615e4fecc725bbe7aed17e3993e015962dec10fa65c3a707e2aede0d68667ba18a8f113f31b404b6a33c6aec4569f414cb60e580797dd60e436c161a3dde14b510ecfec4318b6d6a170db4a01fae661cdb23f996b844a4e25d46db6189cce05ce55fb3a71c5570653730e69a4b165d0bdc57568e9dbd6e3baf587e349a20032569286c6eb605f8bf12f9c46a43f06666e967fa6b22dec2bfdbe8498be1ac7e0cb58db1ff3ddfa6e1bcb48160286427245a655daed15aa6c40efdc72cad5278ade06798da8000423491039d9428cf301e27d123e1062278601c4481d8dc7d02fee9d7e85ac4c9c296ad2e93eef51794f013caccee7883bb2a26d674f961c7b418858dcc2c22b1e3820cf263403317c36037b7a4d7b6a528c74bf415e0b5c43a3950bed157d906c72e12b497d0f6963c8b4ab3b8bfa00a9335a74d54557435b6d55bd642f6923b152b7e57728a199ba6516a2e0baf670796792240edd5751d4db66994c8d4906acb8ce4dd32fc86d3f8bab73d8aaf98d37e4487f627fb001315ccc4667e8568de4a8598adb01734d395eac761fb54b201bd9b8fe594f11037e8b28cb692483b300efb4f08ec9fe36c6b03cd6b81aa14e1692573f73b4d40dee2253a5679c8a6fe141bf93b4fb56019037cb4f857495e249bcfc120135711a648792ce148c778f82397b59c3f74dd65b903e093039b02b1de07b093d300c0751996e7b721489f943f2260941e7d34a9f45d8d8aae0cfc470fec23b9e49e6f075aaa272b4f195f241b6d33b516bcd9f66d3d6deabab2b5b2eb656f62129660eae1805fbcd64fcd84c0e28b6675f2ab7ee511fc21d4841dce44632e7d42b4a3368af02906e77241a7976942b8503db53c36b01d4fa31a378e03843f03e69b9a975de24e73e5edc33aa9d5b4b058cd5d7f49e51df8b1d51de46883b1b750256e23de0556fd4ad882757c1ca68e3f312939230761f9066ec21d15f24cebfd58cba0a4318279f40c", "6a", 3, 975266797, "e81ccdc313857e1fb639e11edcca9c65b07884095d0e7c8c6e4258ca7c8ae283"], + ["030000807082c4030240e30d74e703f513a895c7bd743b8994078962686a5e322da4da1084a8873f23000000000151537db523dbb389b385559f549229ad82f0acaff67c6a4e075a121ff5c2cac50df9cbb3a5000000000263653765038004bb893002000000000152174c9503000000000265ac249de4000000000006636aac636a5355879305000000000500655300526f80fab958f5233a0200000000000000005df0d600000000008bc75338ca68061e56059b3a25635f6c5c7fb273bc221a42688bb5a1806c8a7d6baaeb124b322e99c1acf7a8c88622808e4206c6d4ab52de542a5e79fdbe982eeabfadea4e0944e89829798fd4dfaa74c7cde4c16a72154edb323bb1e11b36c500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000407d2cc1cf16cb5744175ec471bc949238ed95198a0006c1b9d0056da09083af1cf39f728e00fb06626091952c8f7983f5af6f38885ee2043a445ecebb478cf2a85631ff2f06b465b93a2eb7718a102243f6c0755e0992dde444f89a99cc88892b350601807792c57324098a8bc3f263f51614f569d5e9ab00badade87f9b37a030445010a5cfe09adb45d3b62e927f469fcef764030cb2fec6dc2555e73ab9e9302079f8d1cd556e5cf6efabed443bb37e0ae4e5225772fa77eeef012486dc8dd160a012d411ebc651cd6490d355fe8a9a9d111a0df9ae5c1f4b75dc09624d20e99b9c98ed08d3fd6a5e7edf21cee59615314f7d291b47185f85eb700df82b37ba581030b8981f21b1b89e2c7782e9731b1f9c241fda04ab57ff2d69a8a6fb20c2d7f6e030ba3dfdb8b0861f9e2b1ef27b4c42fe6a87d2cdd594b3746c41dacd5a6f6ccb3021c27e3c723f36ae239aab5562b162b7d033acf0b4db4c6b9710932d53bc6a5f2020bc34926d447fe75ded756fe4ae63ba84fc86f725adc990ae691a48dd619d0be0315146a4c29adeb0bc593007df84e3e695a106da36178bdfb56e0b1257befa2537ffd617bea76d294bb1698efd83e5940ac95b3faa1774207b51f4a6f879ea8e7251a64af526c15d0a57f61994509ec5a54a04b44b757c67baac39865a1d23dd9750d98e61ec17eac020dd13dbe689287cfedd8ed9a754764e59ac2dd870c1b008bdae69258cf00414c48e4157f5598ccc82aaa100f1426bd1b88c185f421559ddd997b90241d016f4614a29a54dabfbb0e7f20d06e4168f1f73c02738f939c0d6bbdb504140e47b29df9031850db1ab7e7256d1adf3d72c9a2e23eb1783e2ec67d372960eb88efc9e39a9dcd5f57cbccbbeff4e61e09eacb612aa7f63c17baea8853d04af1a91a3776f91b4f91a5d70e05e8fa39cc0681be6605d7ad09cbb1f124a0a302ea3fdd41e5408f7402833de25c6219c5c8c3295d83edf7a8075f51c08eca89891f78b922ad36a83fac77674cb07643549d55043b13551cec70e918a87d4c1865a926afcbca8c594d83e4ea4bdf25a55bfc8939f79260b17c2ed244838e8ffbb932e787629d5777582c1abb8d5ac043b7d34a371f2ded61e2d811f35f62e6f69e4b6118e95144391f512e8e889ba931258d2162a4008249895ac1078412d609f2dd78058369e4bd72b93102208b3febf820c4d5b24fe3ac5f0c28279c4bd59e0d02e29f303a30d76d333ccf49eb2b069562135fcb0ee75ed1fd8d66a35a8a996ba7d2c73a722f5cd01fbc45613a7ef1ccdc71ebf3958df68b6ca7bb3ed291a13dd7a04a15183e19c774fd2f5521acaf4bd2b999f3087a840804fed8ad3e5fadf475af4977e9337577346773ebaba2682fe3554935b15bcf592ed009441b959ddcfdca43cc2ddd16bc2c5432c6584878975a69ec2cc65349e88bc5e1b2adcb135eecd2dfe894ce011cc5bbed0031922717f7494e0415fd4f41205b8d4e52ff1be7b4223086611c5a3dd103a058b6b7cebe9439e6e93fa51eba551d3f10ef413800ccf88694b1afabb25e3b4c7f91ccea6caca977c7c563357ac4c65198e49baaf507f40e7da1c58405823e86be2925a87b47ce67b5e3a6daed544301ef1a21e0401a1d54249a2fd65a4bc823c8565f624aa0ffa0b4e4cfada436c417bbe84cb4e4bd5d25fa6d7e81f6b1f3759d731bb89086a66a5915a36645f84a3a35fa396b038484cd96045ce54e77657d98945b3faef60b0d7efab75f125359f1f96d056338fed42ce1092afcf096f5463facf0cb7348c627fb95954581de0545e166f9e4d492168e7a7d756a6febe4944e28b877b9bb283b58c9b40bb6243c056e462c37303b297336a777b70fe5a2e48099fc92663e6e850e641c115c63e3a419f402ad93071c0eb1853b847f58b5dd81ecec651a6456ef622259ccd517482a57dbee7a00b1c0cbbe50e36ca3d3b8771f95ecf8b8373d6f31e9b0868b4e7584a2a6ada7efc9b4e7e86af7e878559e13d257de9156fd082e0fec02dd2f8106a31664bc5d2076ca580783a9035838daabee2d8f7b3e84f27f6eb7ffe93179617c555743d0c5e08016e0afe0828407988a7b528eebeda49476b3338ecf0380958c79f38cd1c8dd01d51be4f0d8699ef39e74e6832bd29f191f3c32ed0d85aedab244c4144ebf97422a3732965ebcf33d15bfced193f9b48158f287e468f2582673beadd0748a5c1bddfebf83f9475ae0fed4899374ed4f4beea3c63db53c4a4198a1aa9f9651f9958c2247919c460067cdb1cdaa0000000000000000ccfc8f0300000000bf7655ae0a81edf19e314cbbf174ee5ccb62b1663364965d29b614dd0fc77e3d6d48eaf05b5c1d30cd52dab741baa2ad040bb9c06048bb1729a7d517f445bdc15984780f9cbd14e97ac82bfad0bbe23e80070d36f01f01320019318985e57233000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002012d30e5598d467ef31697dab6b03d24c2a1961698b7b6e6e13b8bb02941bf3d8437f23c3253ae97df1b0664a0d2fc4a9d386bd9b658b86e91a471c53a9800bf6916edfbe4b4d2146f40e6d35dd031f379364b323522e153c17b8e1c24fcebd621aa1249c9db6aa1c0f7a80ae4775ab63cbbde28a99f355bf774ea651404713022da6dad515ffc6e0f4f3dbfc4a4ff7a1535b4ebb3b05d3c830871e840533b41e030b3576c4e3600f74d29d33d4cbcef516d64e45219e01054abb90efec0a52bb330a08550890031004be82913b90c043549920d6c8a4ca4570e86236720c74f44d55aac24c1688247694bbcf414a1b3f042ef3ba3e9a3d0c4d8ad5bd04be4a38b3a103210df1876a94d494ff3f135bb32069ec6556a74d889a347fb891ae5767c012e70323383a877e33b489b86961b4be85a1ce5445667961154d67cd601b2f104839c403058d6471f80c41ea37f0ca233e8333f1eff16e7d6bf6ff16f1ad679cee531d6b02245171d4c5af752bd95ac73552dc356d63b6ce212bdbfb81bc8aa772cc7a7a94030a774af35cc39aa1d3845836fe8d52a371d4b7673810c90aef736e0bff21fd50a42e076ab67c69d062ed13d65c371867ce47e0acb45730766ce28f468de88f0c938aab171847e15b4d180b6b769f1cb6a30820198e7b768273ee0cdd9993c66230c425f94f334ee700ea57b77c574408d2a4dc65d0ac01a9c86860dd32bf5e93d38b0aef224b94f6689794c4644956383b39a22dd9a2cd3dc1daf2be9c36eb9b9bdf084be276aec2b21f8dd22a1fef18d8894efc8509f2b6578dab036cf8494e0d7f8ca3205312c2e020fb39bad4511619c6afdd5a1d44a81a822fa91afc8a519ff0797e10237d2507f08cac444ad3e6d4c36fac5970719165d61738bcea484c4fb120f3a931213f5e2f555a05dd5ca617400b690d794eea5203be93b2ac3dff4d80a6591844c4696c2c51308bf5c6a509e97f9a8b0a35d06307cc067d314bdac927e3c639ebb35bd72f5423b54148097bc90caadadb397b87d36b4c4f0ad46040ab3e12a6ad37a57a5b2c9eaedddcf9700f57998ee022a2bf53fcfd7937b012c3787db20233a5d74ec64345d0f52e86d139d91ac678e353553ad78ae0bd4cc328cdb6f0779a25acbc30b0a2bb6fd55bbb8a6ab618bccf5527091a4ea6054873d06b813f3e33115e8e9dad01b0b1851052a65262ed0f264c61e38480824281aa3d3d2817247f038b078c7116b95579a5a62d9c4d6143291910dd0558c4572c3bc82c59bdb0fe5752dcad20ef48239f59af5d395c9f79480a1cf5f683ebbddb68991cfdd5c3059b17870a449d4ab44f363418cb9c50a8c19320f9ca4180c1f75438a6904e72c087d5116c62cef556434f5a43bef6a9b029556779c36636b2e7c217652c89edfe6ec019718aa3249daadb90f9f68d6f2ce6ab8dc0a57e239398eb2cbe16dd74d48b76d6bbf08822f9c1055bad5d0a69f64158c450bc9987885a8eaae54f2eb80ef090e1f00d43c83651f2dfc1434070fabe4ebac972ae8e3a7b54f5b8091f8f811c9e432245d9569621438113f72ef97627021292a0d1c0655b038f8784ab055a5f7b25cb334c8a3d6c9f2c820c9c89a1ae7ac6c0a8322fab5b6043c258a0abca9a1c34543c0ae5c43677e47d34f585ec4911838a72f50dae9783d2340e17d63681a34fc925aeb5a008a4ac8ed4f07ed4c2408f31ca358207c6671d0ee8743808bb7175d6e294e5ea7f56d66083750ca7dde7b23a2655026ea569bf976636678ccddf64d6f492ff1acaf8a8e48c98c4f796aada193807a2ae72b8163bc2af24cbbd75509c6d8d638322dd26588ee760cb4342a53327147eb8a1901a3fd9248cc41f8af39d682225d1259c6c603884fd8622fd8281e0976904a3e2b96532f293e9c8e5a68b0e3b59c669e942898159604cedf298a0b40695a6e50ac14f2524f64e3da78e414fe261b5bb84ef9925faa547c781c12906d99d0298bea61c0c5720a0e2dc0554e25ff198b56f78c70761bb0afc480f16a794c40e88e9d80f4965fb841139c71c7366c9a642f864be7a5612eddeb020322263e038cbd42829ad772e4a82fcedd4957b638436f57210226e7b12893203de3603102b51232f1dd8d9f6f78c589902f7d252f201eb810101bd8b94a86ddfc93597afd5f7c71911fd82b2d247eebd5e6261906d6e067e2eb49735c83c93341e5fbf48fa0d6762264b6c9664ce7eb1e2e5e14d17086cbe8249e5332f96269781c6d30a83fc952b3a8e4d937b7863e5f62381d40aba2af543c569619bed3b00dfb9cfab16c752874ad2dc6e614ac7cadf5f58b22e16fad7a52a788a03e9327533926632dafbc9a9f7f4549b6d5d381d97e4f27e4c9660da8944efc0dfcf5e5246cda8011db6daed988ba5045503b1d51a961286131f3ecc0f", "51636300acacac65", 0, 1814192179, "3c3328261a575c3ae84f27a9a067d5fabc8bf13d7a76d95c0507f3f15f6df943"], + ["ce6f8476018962431f4f070bcd80ee5bf382b02efb5043be77a885bb7292245788f75fdc670200000007520051526a526361f99c8d034b126801000000000652520051636aa8326d04000000000865ac63ac63ac00001756dc000000000008acac6a53006563510000000000", "65ac5163635165", 0, 1159448175, "d1c8dc0bae676c21367b3564c974a5d054682d101b11d094affbd2e6b8684a82"], + ["030000807082c4030347785e519cd9846056fa9ee161926835920accdbb7ed6242acee03c2b3bbf3f500000000056a535265634bba9a4ba7eeb63d57f5b05997fb096dec0792ef04244c82ca045a7b8ab96166dfa3847403000000055352536363ffffffff256276fb5cee6e5dccb744a0b26871d2e9fd99289a5964253a8946c068efea430200000002ac51ffffffff020ab16e030000000008ac53516a00ac6a65abacb804000000000000000000c495c88000", "6352636a", 0, 1575258685, "d4499313069bdf8efef1771bc3e7c14acfadd42fe9729bf632eaa91161aea61f"], + ["030000807082c40303a3cb3d586562d07ac7c4c3cae833da41634c17e77d73122494df33358e5f109d020000000700520063536a6aba7764c6670bbd4737130ab018c64dc011bb94c6aece42552a46afde58bb37bc01a70e090100000005536300526affffffff5850ccb41efad498b220a4c06fc432900954517b8a6f2fc043ceb72cb073f6b60200000000ffffffff01bfdd1f03000000000263ac0000000000000000020000000000000000737fab0000000000d381f26e7c886bcb5484b8e83c0122095fe8e00232f617b09375c0a662c0ca8491e1152eb211e5fa390add407f7287f34cd5a755968b3c0eed6996d2e4fde8e04f8ca4f31ef1f84757f259f8a1a4762e56bfae37538cf1dd337129721e2a37e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096133adc6b608e8e02afd886fb8b7d19f1733c4fc07dfad0d17b4699d4c0d58a787182dffc319ecf2b7fd5e5896c6b9b5ae149b87c70c3ce3f30c3d366db283d661f1f37709204d509ca74e8579e155be28542b561f007587a1171ade0dd7d66093a270fd60a4b6fc9d5e80d2a4dcdbe4a5d8354233d33133c4e7ec4ad733f5a031ea2a591b454f91367547b66b6d1d89a1e7efd644d19fb0d9e0c48900bac2d23030ffa930caa80050d9f4c900e6f86288f15d6bf6bc4d88d30f0f4e24fb38c6ee80a009d3cf748843794f1d59292b62b42aad2eba3833c445f72e1b90d55d50580cb0073c9845efb443d9d6a2383cbff259bbdbfbb686f44b97c437f461fd7f11d50030978bc32b7c77626143bb21b20e0f5f5398d758c59ee2cae06e80e196b66080a021c92a80e280b064c0b6cd2b50a9ae2ee563a7fd83862b503e90ebeb0b38b8e920221c3675bd50e3cc0fc34f60dec7359999cea657dea43173385a6d5a7733de8760305013974a2cec353bc676508101551dff0f0070242f285bac76bd874b9318a830203ca688f120824a54bf8c16ff2883087942e4d395add378c1c3f4085376802d20565e8ef7028c84511c8213bf1f20f5c91aafb8b17d772abb31019a540e1aee0aa26e81ae1f5142f82dc97fb6aec187475f9b59afa7b5d72948bb31b4be939da8f4ec3c1d2059feed740e148d265ac0a1d99b53bcdfd98b9ea058a7426d900ab88a627ebe1d246e193365bab29a3593e76dfeb97a9ae54e21552c7f16055df7adac31935802a5b9339a736e57bcba06cf5846e662a8fd8cc6b8ff377feb728537ce69574475d4a9882c0d9aeb6b736c3d94e7cc19071aab0337f677f032ac2c50b7086073c41db20d5b6bb6984ed87926300f297fba434731845a5c2d345ba7e0d79588a83e70873f87b8871aac8f027fbf2a56c795afa146c8a2f74c78277c3df9c3a7fd3d3cb32b72162ca7d237609f1c6a869bd2f113b39d26c394cc05033fdde727f0311efb3f3bbea123014c9abe7c29660781c859648b9c052b48deb683acc115a9e25fe1904e5f888d9938c41a36616b5d7ddc05de3569dc0d9fa76718c554eb66d7bbbf2592405bc657120ee63a51c0193c6aa57b06164314c799aa3d834310fe273c26a823b751cdc9d38aa3c3d667c73a1730b8a5e7f57a0264e53c3b6b87d35e6f20fd81421044c4bc16f1e3243710db6ceb49f489018d206c778257620476493a98e332676009991ee0e0265ee5aac123d1ac23602f5e481ba6b5e030b87eeab3dbefe3e9d56c6dc304261b97c88ef91f1f226b963a25bb253230343173bc8cce6900d31a630051e4f5ec8886748528fbb82022b240a5d2f0a51b16ade9aa3d7de218ead1da391b2456bb266439a3cb8a8da3a3c6d59602e6188ac46365dbb94d79bac23b01c5c76f8fbbab04d1fb5f40aeafee811143a9acec3b179181a95cb1fa34b9fd9d000c043826f8057f12c4f4f62df29513d987ebbae0666ae86d8306f6300307182452b6a8772454844847a3117419f22a33d57b5eb2d319d1b233f1aabbda339e730eff0526594ee5776a419dbad9a01f6a7e3b552b7b703117299bded1c35b4345b69d3ebaf00249be5a54f65d41bd4b0962a51dec70f1229b9570d6518a3f854e13f045ec135c86cba1e29aa5d44ad1412ecd78fd3e214ffdff6173b129e71da824f0a5333b60240a4f4d57d3f667fb5d7f056343c1ad502649f853913ee57f161217a0a5eae60bd0ecb17f35402c065439fe1f18bac50cd8df033ea832749e59575b289a6dfa62925743b8f3efb630248fe631459242df45fbd9af996f8f32590bd688aee08f95e08974e22ffc80769ab97c4928d92052f6e0f5c76e32e79ba966f4bf0e4caeec2cf4fd8267e863977e20e67d337cf110726889bcda6a89b5ea001e528c80dd83701756b184293c75996c96fb54fa3ad671ccd7b4582b0d8382f598f74825e586a89e47e4cc13bc31a28350db1635cde79de585c74467e9848bdcc1396f835652d891c0bf2380c1c91fadbff88d1bcd85735383a02afa8075879ac40a3dec843805d70f91b35702adbf4cb5c0703046a3ccce2fd7bc8acb5beb0326d2076b21a5d83df3f67504e70f969b39333b324362eaff57312b1fc1c161b974d1b4063549247ccc1b897d7ff81cef9cbaf9b4bddc1d7057f5277fe70dd5415fd82766b611ac477ed8d9b48eeb5681db4088af3bcfa58c9957bdd41108896a7d39fa74e79bc8fb508d0ee7eb4204ce72e8a6e194fd77720c4b43e649eb3573706f4f24e139d720400000000000000000000000037c266a53c196b7c8aec44508750c41d25574be2eb8e9e909d2a52dc5a93ca03e73bdbc3eabe67b626847d54f5d5668c363f7a94b5f2a7468713013ec29cab5db50b7e66f7e786698de7510b57fff41b3f47ad6c8a027dfc415ad8b9e7eead7b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a62f7158745a4658b5558f649e138bc3ce2d215bb091f62a61fedf47808a06919ff2f09b3dd4e8807bff0747c32c34270ef78cd4695919128c167d36f835446933211cf0deaddfe25d15b1a3bf9ac023329ed7e5c4d997b9fb6c896253a6f40f612b61fa87f614b45c28632ce3e386e3fdc96385b1e4c0ef04790812e0b54f021d3db5cabc6af1dcc945e599293032f178893c6187abdcbd9c642296c8cce46f032d94cc390ddfd7a75ae0e76cf6831006632b846fb6f41d7a7afd13cff976d5810a08e67032950dd0b2bd45d9289f0a8498883c286d25444fa52c4b29abfc552eeca0f55ea9f6847ca1ef5b303c76704438fbdfef3e05962b463f7ef16f0a519a0c03195e604f02ee0dbe06fcdbbe3877915ce7ac3fc47c060f2b6718b81eea8e8f06021076a98eb05868baec887cf92c501a3479704e41df9ba4ee750167419a801c9503258c5ffa64d5f30c2470504dbe89038167c1205fcc44ff1c6d02e88fe3c012f3020fb4c5febaabb90b80a88af6e04a41f518cb31279f37a56b990cd6fc107473d50213015c9d136960bef5bc9e996a65fccd0c628e8410ab9fe6c3f8d1a7b5e375b175cae0ec0a482230e9babea3fe37b8c4920403dd8ee2bd8e97dbc5df966b9f669e03cb0672197882a3999bf3d86dd3d9dd17c63de9a3e9ccc562e685120b3bb31ef259cb370f78b902159671d9276fc9aca01f7a3e28b0f07b1d334b637979ad4f5b21467b1f22a47eca26a1f03c717e0ec60e9853172adb353cbf5f93a5a555a6f190a0e64d1e88a4daa7136408786f6b2d1253c80eb6eccc6e0b6c27ac4cf775ef5fcc32fd17027ff8f7dc5e71810d2920d184bd9ede1f7ec0598ebb5bf30821eac2720ff9338b3cb6168378926a5cecb6bbad45c04e2df4ac755fb5284557c235688a4187f4bc74e533096a0e69faa308600b911367c1cc80a2d28655b587330e5d479600518e67b78a5f02e1d484276c43ec47af7b690fdbab041a081f66095f15ce1b8d187faced1f2427080958fa40d1bf85acf325025e42ba23290e8c45cb21bc2eb37fa2cd863960446043e4e9b53bb84121dadd65d714c9de0115cb08bc7ec26b88bdf82118a6fb525898259285e499df68e75567802262ee50f33a636968cd98dd073d68d7db6dd3506f8fbbba1c1f6429f4128c0f921c0c7ddd0ff96c08903bc3021b28af1f55a7379b1ee22144c534951d05731dc219db60bcae8830f14ed57593606528ae8e3c05360951fa736bfd9c012d08e3aef47aebbe0f56ab7b87cf525c9a873699abc1e32165342f39aa9d58d6402924b9320c263eb81a1a2a327289ea99b50343b0339209e985a0a747dc9a660feeb9cb0b4769b9630f1ef5d13917b55d220b8004272eb3f21eaa8aba2c3e812959f9f5a9bf3225e98dc1bbd9ff94d73926b5c151a640e78b03bcf4f84910d54e62b9d11a106cb0dec34ff9a061f6247238bd9ccab128ea50f3812366abdd074c2fd4d64df7083ad44dd01ce2a2e620c6f8ea8aa40f80e8b3e7e2af5730be2f842f46f8ea5825cb0f188b539e274bd524ea2fd4e7f3f37925e145b9ac2c0cf4097b0bc377ed9c02efce9660c1371b255c8898330fd8a901e89c335fb4520931bb04cc7abe8886c0b4154d3ac917d74eaa0013f54303216c5d46acf94655149bd0bef267f92cde4c5c3b2ce01653a0e906c0911dad90bc76f488806913c0fbaf31f24570ddffd3c750a3d1a9a602059b63e8016f34bf2a74bf15d6345f13a8e056182f683d756b800787f8afd7e5fc971cbffe1a2e2ac29c0a5e1f76f48d8279d24733c479b8b2ad2263ff250c39b4d4cc1a28600f3325600707fa418bf91016388ba71edc8b7c71584370b30caa53527a8943e4a6170c826eb1ccda73944fe5dc5f63224cabd6d59ec78a70d89060a6e24b5b3c588bc76ef9e855cc3c1bb51c1d4fb3470d73a2f83e4caa15b7390bdb5fca719d55b43b783e654a137dd07a03c42c6cd03da23564f9f835d407e20ae9b3f72b9306e4501b9bd88eeab2ab5e634a311dae09a3fda0999615a8b3a049ff33fecf88415711e7da7594238e7c9982ffb7d3ecd0bfed1ebefee8e8025405280e79bd652e3ce3e660e227cbe13f510ee53203fe73fe802852854cde193316e58546a9efe4a1c89c7ce65a7f876ceec01e0f72274a1695d6f9df103c3c40a2279b547b12cb421a9e7c99aa7d454daef0424fa77364460c3a6f88059456684d5e837339480dd6918261009f8305cd7e3dae99090cb1ff6d489f7deb43746ba0b1a024524494a1ea87260a3f7a3d1f724726a3fd55f987412b0d4928fad954a7bb2fb2281436ded4ba0c926022d2028cef17b4a30af7f8e5486b4b8f8fb868e32a366ac8a93c230cfd1e53e772b38dee7826b8f10dd9eca2a8dc0c7bf2392aed6162f49c180fb6039b96a408", "65", 2, 778055595, "367985851d713fd970149431e927946daf3663169b262febbcd269e9251257e5"], + ["816b465e019502304a374871e40ed138e989f56598b190e4abdb5466dbb3144a0a23b7d7f70300000005530053516a56e0d3b504b425970500000000065351acac65635a97af020000000007516a5151ac53636e6bdd030000000006636a656a656314921d010000000006006aac52ac510000000000", "", 0, 965875676, "4fedbe84a0f400e64e43c0258f7b63310f90fc57312c1dc2da6555db7ac6b918"], + ["030000807082c403011e336af2bd0b165ea09f5fdde35c116fe11bc2a60f7c3c6f29a7027174f4ed7c030000000563ac655251ffffffff02b76481010000000000a0db77000000000006656352ac6553ac8bf83d0000000000", "6a6a6a6a51", 0, 158105416, "2df1eb42215e6603db7e8f685b133220815231e868d1f1907907bdd29f230dda"], + ["030000807082c403024966f491eeb548cb9fa7da77a24b71f44861ee162d77ee48237ab8c64117539302000000066aac656365531a52d8a7a568fa4dc49430b3d35c6da3ba4bbe1cfbe8d771316ce09dedeeed5e132123d7010000000951535351655165635398bd4bd501ccd64300000000000351636a000000003ea6d56b0389456103000000000000000000000000ad58b48e5c892a268d647abb2c68217cea803c614fe2231e0aefcc2f8aa9afa044354f8776d907ab734871324a724551bf4f0976a3f4a8ea6a00668efae9b806bf57d8f597ea596164776403db121b94f9c826f7b32d5f6b8d41cb25578be5a4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bca297967ee2b117bbc50d4b2e336615f2461a7f55ce257e8d8b07dda6a7d032ef1157c45f4cd99c816dd3dacd29da53cc913e132992014ab44695f7bebe3a70804f725fea69124bd4dc04882947b755a8997ea74de9ec2df878e87037ed185a3d55af2b11ffb549f41345bcf52c9fbf9510694cebcf70e17ecae09af251a680323368c0e3fb7a9545c44d3828a8615bbbc3139982ce06f8c70ea0d5560aeea690214a19dccd3bd9accfe69c3b363ddbe2d0f34cbda4e638f6b38c9d8c586cc61fb0a03fbf4ec488c46769035c4ce42ddd91d6202f442911c93f8acd993fc32c692525141b3f90f6768a6ef7dc8f1412f8470b5efc7927a37402530deb48feb9b6933022924316566f648e5a77ff06055a275321f701c97eab9856d5df74ae703167d74031362e7c15de013677694c2b00dd857cc0266cb17f5559432e4b4862df7da9e9e02188b9d5d84c55f57496a02d84910a28942adcf16445e8f5549c1c0560f8f0f7202016734341b6bb1e6945e908e672f174fe160911c26d7b8153d8e0afbc1aeddec0322e56b3bc680cdd42fedff60189c5c733d0ddd0b87e5972ac45da6c6d1e60d8cc875c86dae09b59c570d4e51ca1248b9a0e0fae621b94e9d0506936da1b38dd61376798ac92d51363f1ec1db581cfa7cd1c525f1768398bab1f68cf65c155670a2f41b5b1b3e776c08f86501351b4a2b98c9ab8ed7b8b138cfff01a2f69d21474381ee1e5b95abd037100b3e50ee577ff93967d927d7de8bda15d5261c30e06efe518a9eeb1053f618f995e49995541eca952a85b2590b92e52c3823b187e0eb90d4d75df158624c6dcc1656407e314a207d6e196ae5b6d777333a542e539f386d735b602992f47d343ac66151599de16b7a4d3862ef6733b3f8d48def8fd0a187337f989f2a8916716ee6f547f7cb772cff889c8cd272ee4a9a62709ff76218e85ee7ab3923753cc55410fd3de6a2c231e9ff3301ef115b3858a670909b8c469a4933dd7d26f85dd8059c58e5176aedda96ea6e726f42afb7b3a5130f812d73e03a86d783c693df40d614ea50197c6c4c1670128c1233965c6e4190a3bca92e3ac2c8afb38f7b11bbf6d6a7f03e04797897d7602d4fc5a6a08e30829806234b1fee2b951123c02c77048e94b6dd3cb71c9828b73b7014bcb4715a79be87b3fd3540467f46ec930ae722b01c4ac17bb9307f76d315e5c659dbe51193bc82984cb5d84dbdeec1a0a524116bd7a1c29a987ca2edb52668542e82492ca5db655f3058ba483ead36d43f02799fac37a13875d4ce4390838111c85f4c958c0b0dc624baf1e35ac2711fa81ccbf55c84fc2354364f68b905c38e0a9af3ed561530bf0325a6554584f1d07e708f1cbfec75b5715a0366c5269afdec2d2502b9d4c1f3423918bfc33c4a2cfb15177bf86714e47ec48580c81ce96a359ccdff0b5a7dcc4e769ecdbbb2632bdfc0abdc9bed73a2638abd6c197cb4af447ba8d0027a473ac1f27704fe90a922881e15eb225741c767fc641e0db48b9cedbc05fbba051e905d5f9e97ec17387c9bb862c683f3fa6110a42b7248117d3f1a5f2e5b7065a0550d44641e39942224e00824d15884ab227905048ce17583199a146c4a5e7982f4425f74ca0d44cac925d1b9fa1a86c8b7ef212a3cd475cb102c96abc63ef8afb3ec0212b32325a156b890dcc5679499a83093f2f125fdd5cd3e699a1d800069f9cda135015a8c6e49099de01049db473a27808aab5620155afc6253b1bdb33479ae7001fbe9bd1c575e7e53f7d25b35429f5327bd589ec6ad4c8697139e8a30a4d9b2c67ea89c19c592cfbba5d24305ec52567b4e64ec553672c521a72bf5979c37c2a1b4c165cec225efd2efa5f7d6ec0ea4410706829b654a1beb13bd5fea8e8e688d80584d3021d451d8386353b60428173efcd3d8091b01d0bdb6d562b0b857a86b413e4448c6cdc2583e997b3a48e0b429f0017f98fa3f43c0446e41e2e022db2a7e8692f74812909df6e0dd969aef8358ece9c94df29a2283ce554886c0ca73bc7e913bc862203ea501af105c9ae69fab8950bf4c9919a6af95f8fa50c3d7cd2265b8cb3421cd5138554b7b8000915e51c6de97a345c252c6e69a728520ceb520a2068c591ea1799ad9a81457f541abbaa081882e2b716e7fcf031a2b11462841a01d187232d25ff3b575993025cdacd289c6a107fd5cf9a6c258768e15a170cebd5aed2510d9dd09816a6fcfcbba3291a75c2be106bcbda2d01a7d4bbe1f6096312b6ef8be4ca8383a3c2a8a78671a738e956500000000000000000000000000e62523afa1d5a05b642c4729ced5c9a2e525971372b4773d29cf59c888efcf9bde606b72785a59b164ffe15bda0e89d6538756e2fd827e1d19f00287c77ac36878a0a0fc71ddc347ac9e7daf60ad142286496ac59519ee6e5d3db4ee9e7adb3f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a69d9106ff8df01625c589edb6703bdb003dabbcd7398c12c89bda743b1f2e2954f03227ab14ad8062dd42ecd22651ba5c6b8ba0e11e9df877295d9e238ac247c9bc5e3ad202af1994acda2d290613ab599b66c77e77fc66341b00cd00305b30efcbc10c9603499eafd3edfd318108b6117b1d7cda29593cacc71ed1d79792840203c0ad7ae4844edfa4688db4f2fafc4f76becd106088b9b2f5e17e53d0b97d17031f8bc23be3f4e0e7d36a6d1f4c7e784b6ca0325db75fbcb19c689ff9289abb2a0a016e7cbc639e21cff376a5db9aaad5c9215e761be25610cc586cf1801ae52118b9622e2030ca702706cf6ea2b35511e7163d5a0d67b63e41bbc50cab6e672b38031debfe1d40e9dabc2597e12e9d6040dcb4e91ff8066964a7620e00312164a7e50222f42a340839c8ea5f8ff8907bce068f2a6d73dfc4ce8bd91d7a1ee18b73043b031efd8b34794d91a7f31a8ebe896e895ba22d0fc4092fe5c2fe31e29c729ef915021762fdf5b84d2b9226a5f35d912f00ba12b3025a09bad85778d50eb1b0f34edb030ea1e3d36e995b1f5711864b6bfc6dfdacbeb762e1a183fe30c3ea90d63fd81cf578ddc6de4b67a300030b17a51940e3a80c8fdc05b36f57b1ec8d31e6b2db63b02e88ce90989fa98c5aa61bc7703c2a8a5b030ef9d4b268a2c3edefd4166012ebef7372ebdb6e262c3dcc27b806b844ec1176211f9237623d0168522a9fe14b23b2b3114835dcbdbf1f325f531b8e1b2dd50d18609bc603967fe5cb63aa7e750e29fb3c24e121e453d54a2da7c5664a1324267248564d41dfb444d7218a5b2f649eed2c9a250fc55b4bac89b7e4cbc1aaa41616866ed34e778c2805082a802eaa204ec720fab5945104b4293bc226f4283696b994b9f34bcd5aa22167f9be17061801581b40f269019d8df2836342ee6a9f628402e1341dc49b0333f91bcefead29df2da11eda4b19ffb805a789a22a8cb251271ef1da91a4c4da2d1787a31c58ab39befd2c10390a0070f224fb4d9c5a3a549cc93555b728e1bb4c9d7df510fbe16015d1c645a84fd1b3ecaa00a50e5085160afa222285ab78a129b7cae93566a20dc53f335b1f9b2bb446825d1e5c965eff64dc1553246e338f10af4fc950de186288583c7036b52bea84e8add77ed125a9b8e6a10d605ee6424d918580045e1339d2b5edaab455039c71d6b28104b39e2712349321098db4f5a0c6fe2da15362c54643b62ff1d2f759ad3b32fe1b05f6ec06e25b3c31b72c844d97cd3199187ea6c60ee3b0e9978a07387f400f96902e904fce6d032996238b1eafb0f7f16ccd02dbc1d817882499fe15ab259326617d10ecbaa2c3e019bd291ced24d3a1f25e791fdc9c3be0e0ce11bb22026d7a6a445c0f09051fb0fe74e30fb9f8639b96c9cc83f417f4777966a100d105e4cc25c26f660ea01ded0ddf64447f9b186d27699a6f38345761af9f8bf2a280314f5345d37b3ed47317eb9f6a82f4a60b5705bc1bbca996550e2fb7cf79e7f682484bf700cd67653eacc31ca8c228f4b4a030452e0244e68abf63f86e00d7985ff64466828259f61b0d3b6f17bbd7b7fb3c76335a8b668a878159ed191725b24e453918ff50b0135ecd0a25908adc6933dccb5952273af9f11de45b73f531e0ee48121ebacb1d177fcbaa8bed24a02b1532a0891b6d9cd9c71de1f64e12735f1bda0d5d5fe0ae0ce975a34d423853f44b3334216448e21b152740d121e266409703513538fa2e6815ee181f081e2c2c352efffe0304f8988e3b09e520815c3096d82357355f75e8049b045af775b8cd861c97149cb77515c399898af604915d956f4dc75a0201b8ca82c524af96e9ed7f0cc16f1b8696b942a47b65b6dba179ff6cb3d005cf97935253b0b470b99f4b81be2a3aafbfc05f49f0bcd45ccb5790ba7629e38656754a08bb889b4ab776be7898377b7093679eb1232e2c9c7c7b571ade3168bb7b62f66443d57928a95b663162c59fdaff640d6c4148a6e3dfa3a4acf00471a96e5bf1e040ac0882bc421d3b89e0b4d35c9cf6b976edfdb3f6972ded99d244302c353e5be9cee4eda28eb6a72c2ce0e76cc3830f8c4472c90828c1e21f074d509ee0a489e506d02ded7cf9e624694b92f9f7f38c454dcd4f8b9c4611c366484c47cbe5fef4e9a081f7c5f4fce3f1cb1096302a3176e24d83a0f3ba7ca24ab9f4a92bdcbf1f879f0a90050cf428539f335568372cf5f05b3fe0cf6c64405c7cdaddc164ac88334d0d06452aa12db40fe5c3bf4d8766c0ba6d5eea7bfa2cdcd7b06ea4040000000000000000000000006039a663b33a35d82160657cc7043853ded2246768010cbe16cb6a1aada224429c76d23483cb886edb9145923d233c3bce2d70a2271dbcef322afe8b308986934870fa34af4314eab0941a56ffc2e464c861262eadec7e40eab4088bb720b6b20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023a1ff69369140c2774acfa2f89e60879530235190ffab1d40bd5a4c10e1447b132a913c51825ca19bac8e6d7593233526f9f6d19f483d6be51676bbde6a60d6e99e9c7f5f13016dc6b898f27ae59597c39b1dfed83dd4bb233c389b8ff199a51c2b7e8b7f7015ca44ba1e0d3c2e1fb1d1cec7acda1dbe58f119ece7846f8ba1030d024cf524b0f9f2b6cbcfcd170bf4887f35e6a04d974f0f740d244ea7ebf9ee030a7a354d66c79e3393785e80b27229dc4812ef53aa868f8dad06939a8d5cacb70b08b98918a2df99127e7512d2f6089e4959ef3e8d268cb02b060d9de2c077907576d3849cd6860a091dbfc2604e7ba456873df0f2e44c2e81f0c031f4031e982a021073a86b535ec99f1a9e3ef8b3783e7bb4bf7de54ce7b7884f9069868f5f49ba02071f409ef3613754dee1a57cbb88d9c5b702d26953d576f12bf037cf3ddb5422022b8d2c75504119bb192fadc615d99ec338c75feb267c4016ec1461dff3f9a626020a7a022ec7661881145e08c978fc8ddca8685186642e05a9412dff2c4058fe25031ad421b62a3b4c5a880bfa2e11be63779b310c7329d09d05401c0107064269d6ecb748caa3e0f1190889efe84d45bade136356bd4ec5cdc4ed6b1dde24a4b57f45bd634f17cde6278e0ae2ac1da927cc66b01d4e17e90dd8019b913816cf7f2b9a25cda54e0e1391e4b6a73feac22bc489ec05857b4085c68aaf491c0d0b41d6dd2d6c8711f471654d235c5c310999254e539a7e6314e9b1a860180f8e9a3a05d49bd93c21f0ab2095717950ac6689ec88d85d2e38cbaf7930f79011ead6b60bfe53d3e770ef469a14699006bb8e619c4585776d7b721147a207490c2d0641f125bcaadd2be4efaa9e7b7075e0dcc45f543c9c3bbe9da887a0b3ecc301006b6277f8e3a7ce0e1ccae01761263c73a77f3003b9ee79346df857992ccd726ff85f57a0f78ccebf1dd9aa1a2e6691f0c313ba02c04d93c761e3a06829c443eca528ac1feec0792ac20fc33ee37e554fd70aa0ea6964088f9dd5c6f54908fd11fff32f6792e7fe9d9df7c12732c0895472988947174ea7f41c03222aed8329072041bf3aa914b6f5b5e6b31bcdfeeabba13d5e7b1d41461f6a060361cf9b3e21ee0c2395fd650d6c5fc521703585e950fcb0dfa01f6695df811d27d0a4fd4b80553b484787ff7466f181da4de59db2725646a5e390a5541dc5c67098d411c57a9a360b62c62fb3869720f056e358378a257d4e5ad2149037597923f6029d526e9bbfebb076421d57caaf7a5f7b5f66575cc54a2131a0d9f960a67aeb499aa16e962db642e229fa45f77709311d7aaa9ccaa68bbc84ba91d3d9c65e01c40f4da38c2dd6a78fd53d7e30789d03364fb30629441edf3ccb84c86ab93367b630314480d9b8165f947221fb9d9f19e5d4c2cb555ad5f15311a8b3bfc815ffda64b1a1b6a0bbcefa626a8ecbb56d15007df67ea6cb0064282535e2f672f234b9bace4ed3828d50de28adec1e3ea8c3a0a22b4a6dc5b23be62d86bed940313f411621401fb380d5730386b1374f21f7608692034c485c014bf7440a1209f2456d6f022e7257540ec5f1032e8c9e23a2df799ed9c86404e1315c60977b9cee225fc0f0c6dba2c89ac4575c3ef2661a4a4acbee5bba29b35ad679a664e02899bbd2909e532d13d0b64a834cc240c9a71713e9ec863a015a0d4c287129fcfee887ec55b093f9a79b44f558291659d03b1fe07f95b7b80a28540529310f7424629ca60263238004d7bee1eacb3cbee8e175a2f1178e413cad70a5e0edd3260b3144142d8c1f9e6e6ca55e12a53ab3d3065d0360bc162cf04dee67f2d6c414c33ddaab058ab200b5a72a6a195c7c9d3289bbd48ba7090ed2402a80715fd4362f41bd8446b606700ead4e857c3af7e21ce267d38f5e6c2635ac4a7c31a73261c725e6f4a62b72fcebc3f5922cfb2b04bbf91334d23ed2d0eac40b9fc16bc7ed40e5b6138dc7f9f88130e225b34073175b085f316d5fafc1c58d379e2a5c25c9631557a9eac6574e013b19e6579d59edadc25c9581bb02f6676b41a339fdcb3f8fde2fe68d9f15e0b0bf02f0f4ca511362c19222d2e02ad81fc6004b7705de50bc472932d25ed93859024fd633b0eb1aefb0b9aec2ef7f1495fd9c3935795447328377322c658ed49abd3adc2fde4de86996c46b217f6557729394750e1fa2b206ae4ad0ef5a623ba150ebd5d98c2f213b56eff3cc8f92f72fdd6097c62658235549fc19510e627bf6e2af4ae904d8d00d38dab2e87012b8ccc9cc5c97b143132475ab68f9049b0133349227abcfbf46bbb0bac34ec31c05c9ad16f85c08e05f773368bba3816c3fc222ef36e9b4b888379d801d6b01e0b53763c5747a43279e06c3f5f0fd08ada761b5e3a6d0d637bf8c875f5c6699e8f5c8d40e", "53", 0, 1937199825, "28d677486b586b5424dd9a9d74e67555b68e1e261912ba10ca3853342cf8ef0c"], + ["928c2d05012f207996e4098c81e933f7931a7c22b376fae9b78b44111a338f6b170925253f0000000001657c78e06c03dab19f0100000000016366a739010000000006515363ac0065e1739e040000000005006a6565000000000000", "63ac", 0, -70492488, "c10085e5c79b5ec51b01cf66f3e7cb4f5d34d70781603bef15ab35474a4c92c5"], + ["df03c22a02882e5aa2bea31a7dc42f044771b195f7798dbc6d476e1bbaf8d6b9c787c050bd0100000004636a5252a7d6d8aa5a62fda62cf499a89189555c9a58c84cb5053d50148ea71ce4056cac6fd01c6200000000025200956cc5e801d92fff03000000000363ac0000000000020000000000000000e286910300000000ab44d7fbb6b24c2bc3274a0cdd2732aaac383ba4ef8238cd8af15477b07f0da93de1e6a95d2bff6cdd03f6cf44b23be25f394b5960d7a17784c27a3c2a7fb8840f3a39042de9f4057cf749f209c365f4c2c3ade1a77781fcf3eada80ee3e0228000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a013fc969917a933ff6f61fe399208d0705fda5cb171e2596bc43a680c614dee8c1c44a8509b8b6ca6c9b70a3a1e95dfbca959e74122549b63d8ab2e0ded85c912d777c7b44f8d4c1754bb4d13d4b2684d6a9696f19b1641cad574b5ddbe93f87148723749235e251fcc874a24a64df7d33ae3d26290518bbbbd2f9b7d197a40210cc0e76e5381c8b3192dc62d13551da62b109e293477075ef5d80d1c64f63930316522785485381bd441997744735c6475cea7731c46aebaf0132d44f159d9cef0b079419bc2e34a7915c6be22fab18ea742f19f2043dbb334c10ef055a4170cde45d1e296153cfa59a94c9703bffb3d38275418e2b5576062b64e3e9bc55fe7eba03143167731fdc0786097ee62f30998c9149d626bfc2dd366be054af83483e99cd0311817892bb609d8bafd71e5a95c3dcf83d566660efd9d26749ab4be789c74e44032ace8748d96f16ef6c4fa1dc53dc4771cdbd524a48f6daf6a4b636373aecec84020ee976027f9f788b0f7b2f77dd3de114b24ecaf561475a0f2fe764e41efe4f030322f7dde492dd9d88ca7c398d0ce6e737a398e3974358c9a2c17358db481af51462e5263e225c7dc4d3ca831771eb3d3102fefc8dd5227f0c2c42ab0e2a87467eb37490cff17a43ea858b631b3a75a6feb7382947f82e8a02176fad5c8b0e091fc38bdffc879f8467ca4d0311d7eff57816fbe66810fe77aafe5cef992d5ecdeabd195ed1731b5ca5d0dd321ec488fd6f43be44e91fab00557834934f4b9a06d5c86bb62a7bc757927f1c853e80c5f22e5570c0d69201e9fd2c9bdf9581151f28a135a05117f79f85df4f261d50b6142b9c9c0ba5537c4694a4bc24e321f674948b24a441afa9f97a2ea6e76e62e1e34f63f3bd18af41df6e25123417b95ce05db903f78ba0775e1fd6d3ec5826a6ae72f9b9806855df8ad72cfff8f590269b13c5e7a614f524031cfd8466adbaad05b323339dd3040382b1d19ac7b7b90c7b9214077d367ef65b5f5034f6908e30174dad987f8df7e56d5cdd4f2683708d648123dcdead41f6f51c4b83a7ec67c90d5260926d6617be39f95e0ebd6be86b9ffc1833137aa95102a4bc04ee4275cc3a3a4786f14e9f481844b78c955f524a2b6a1ceb6de6161be4b717abfad35c79f0611e4a2ed9f1342c3c78951f2d28339f352f5ce1480cea05b87b6b8f28d5d4bf08e3701836c3939a7aff005979d86051fc859897d6aa8437c275d6ef2d0bc43a1932e600b557e95880982d733d64e2e279b24f25f755e926b093500451df61a6761e0f6d9b4deb6b0f678d21cbd47d57e08cd850d076ade5eea6e7f4e94bd08cbf5fa1e5b598ec3e1c8719826323d481173bdab18b35d3b6ddf5f58fee673e11f84d6b0eb0ec5661183b7a0c32967a9b31663dbfc703757acc562f5137936a6c360196151f1c64e066ce2c44c92c883eec7dcded8a1e01e88311d26a17e2d277032f963f7091ddcb1c1e7d6a508c6f551fd19194ec06c8f273a55ad9852fc751b8aedcb0fd1a1c7bd85f3455bad0bd71e84e9bf1fa78a9f1ef528c1ac80c8460ebefb6c37bec76e4d6cef6a7808b33b719bee8fb2d8559928cdb32a2adb928b62e7b1d7d206723692b5905218b2b209c245d32157fc4472a332fa0780ddc3d1acb3d33e5002876c2c25456421261529bd8d4e042d370b9b3c66b66b12d454455d826ae052fecf577c6629f563859dbe1b1a3456806d55a9d355d1257479deb088cbdd59d7730122f52d85627010af2c1aa39c3c3043e4d2a438353aa24577d6d35a1f367949cb9581bc4a35ad2813a01791638e7470b49862d5b71c966a1410c783f85c9717e08052dd05e83b6862dac5eb5cf8778860794e8b5a7e382990ce277197a39702658a14a8002e79a309a2e251073077b51ee14a5ae7c5a1507242c75a4d3ac6bc5751c6fd71aa4b66621e2ca41a007efd2fda74493fe1e766701ef210307feee20f9664f5bea9e4e73565628968b146f458067d3f5d1b0dcd264c7f550c85ffd1d4e238190ea0e3b7bfd1f2d28d5d40d41dc3f41d9c0f3ab1dc91639554b94a2f26c445ec0a80266af4bd92d05dd90415a3b017a12155ec48aac64905799da4bc2c96def4bb506c92767803e1cf2856636f741a23616ca63134711daccbb1db8296bd894321b2866f90d2cf0261db450bc9b3927d9f4592c5e722c0e1719d1ff1b21c819f48a9e326caaa83e6aa22c1a8c1665bc71a9309a48d431b3b8a7956038c9aeaa24e09b14016add06433742603082e8fd73df7dc03689f51b0ebd0a9a160000000000000000000000000085d215d3560b9f035036624b91fa7fdea5b40f5f06494f93dd46a339d2fbdd5d617d407d30c8a622ded71f0d48f9648b88bdcd69f7b3d866045ebf2a9324a56f4d1172d7f1be4de0f995a9b56623dbab8e62fcc4767dd27f38f68f579c07833b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000224a6afee41028951a9c216685a27f6ade9918edd171944606250142a6479ba48f4db2f577a2ecd67a79243ed151e7e723fb87c7cf174df4cbca30f2a18be05de91af2caab34f7c49485716356d85409377c78b000e43addc1282e8ea7c7ab29e2e47b6f437df0848ddf9c566e2dac2646407ea14ed172050316d7ed129452360229ddef4af965b47850904f49f3afe8bf43334e600d3bc31abc04671acfdc445c022e2e60aef30d8d1ae95dc2025ad7179a6f6fd98c9e7569e1ac4e225188c1331c0a08c5867987dc4f795b3194db65b6be390257269b175a04dc8a1453a755f7dd2cab12f99214849ad59ce93187ddaf7ac954edd4cef84548d1007a8fc09aeb4b2a0302cb07de62c3da046654d819e6d5a300bab09677212dac40b9f3df90546df23d022d24c87d02b38a8435f62a092d9fe0fbf956cd9978bcb7855ada2972cdb015720216b979787b7ee056f9b86c69d496c8d1c4b4641cb044fbcbbea024370d45dcb00210769cbc814f46ff65f6689f295576fd86766477d11726341c0a5a9eef34e0030213006633cf7be78750080bdf17b9f215cc1821ed0ec1c848ac75b7eb570d0ee4f82416d9fa406c24c0b73c89b5dc8f334e58af6bc8f5f38c0fdb6fc329df8f1a8239b06faac8b6d4389729042aade87b44846726f21f9443786ddd01f7ef7b51b4a23ed7b1802e24d14e4c5bc50b258734a46d685c7b6864b011c2babdf7b88a91e9121488b62adeca8db6f234c7eef819c88194487e7d98010fc18ac93dc8e6172a18c894b1dc3b81b01226160f2f4eacdc03e69b26d2b5a2c9e8546e5c8d1d440abe56d06fc7d291ae9d7edaaf4c2e3df72a440ffe837062d91e6badbe36aba0487b24596aba000eec127985946f54603a9fb0b6b56ac7276bdad4230d97cee480ee3476701f42c82eed15d390ac4b121632e54ad9b62724d8d3803a3917fee9cec9d6f8031dde399fda1a2b429b145250179be20f538d6977a4df2cd11288b7954b73f8bbea798afac994a4fcd1ca3e0a26ad5893c643446d007d5f053cdc69ddd4b2ee5597eb6b9bffb457080902ade42128faaab13dfe334f2b6fc3c2020d2251615c8e07cad95653a02150c38be7f5ba7df273cf0d9169f6cbaf1d725e3c619247d19057ffd3f5aa87a57aa625f766db94232450140b0e94b6b194b0b27f27a333daa897d86bdc9539bfd34ee9a03cfba1667be4f9e4a264f6b68a4f04885620b4dd40927cdb7a2b5ce4fd2c2f547084771b1493c5b0d60840e0304e00b269c03e6ec03cf3defe0824ac11ff6cf9899f0a89c1f65cb7d4b5d16088935979bce9bebfd977310487eeb1156ac3d2765ffa1aca2421a473eba85958898f77ffc6b3d363616d7bce0e7196cdea6bb3827a9ae8d6ff8ad578abaa8dbdd53ab286faf949389815c70cb195c17eda0d126ee7c617893292df09db266314b4d08f8683b7d3e9a5a30ab85fa135cc7dbec1c79064c3d51880c226ead2d1473c81dda3db495718f25cfab44dd3e11c83770d97b49c76dcb338cd382222c1b513b0a649eed10314cec73c903d70767f18f593f0f5ad907ca4de19878b69de28f50c62e1932930f32160cabb655f17850265c2c61628d7eaf7829ff5034f7b29ce61245c2d26017a449feebce1644b6c8890ae2f3db808b8ebce8cedd70175d119395e1b978c24e56630aee23337b000b5c8ddfcca93f9b726829c0df46807568401aaa55244418478c5733457772b57f2d460decc4a6c373ac08b940a3d972ea82cf88a09faeba349529e207b2ce29a3f482688850dd059f1ab1c38e820d3199141d583861b1f68b2baf022d1f7fa3631f2602d119f59de38622559b09df90c4cd76b1c782a7a45fad55941c0d9465d3577af27d8592941335dc453cb2664d60c000f590c7c1e1cef3747a05591654c48186aadf4d26548b5dbdd9f71c6659a9631bdd110cca991025c4ac614ad51959159041d6f96cba5db840c63e408fb18446265b14ea83b6b61d053e9368f88ade29e87d98e0f249627391cae47b6cd86a20e677687e70402bacfd2a634598b4c00d64976c80c85839eaddf48a6f07fb17331db846b8fd8ddf6ce703a276c4fd23804cfe4d9b393ea328c98592a6c95b8b1f1bd9bea41c6e0564964fc42ad227b1069c2c4234f3f2dc5469fe5d2127e2b62f113fd8db698f4d5ba1cfc69ea45f1d2db9e4644612832234d3c298d51a920040d77bb0993438fe0085456360e78b633bc716cb486ead6ae05b5f13c684c9a2755f1f3b421e482c8e9d4a5cc42a661fce7bca03931c7c3fbb7761c66e0f5365c273019470ea24da1b4025f09c746a826b767de542f420d3117a33ba2304e233a9dac9e1a962e1b304a6a10b131afadf153a356a01ec578cf745e39a2616f7f0934fa7e775a624342c8050498546110d8b1d9d40c", "00ac51536552", 0, 389849693, "afd5d9e14175882c1ee9f4269027aae3cce361626c58395ed08e4391045f7587"], + ["a1c4cf3d02c0fc0239942682a6344b3bfcf9cf9ba0bee688d79019bc7200838ee14cff9a600000000006536a526a6a5356634aeaa1ffd1ab50a3a5e73fbb35ce4e5c102b59b44316d796c5e270a75a0f4b2b398d01000000085351656a6363ac511f5b7db8010f57c70500000000026a510000000000", "635363", 0, -113093599, "016f0b77bd440cc53571f2bf1e8f118c81b7f882c3983e6eca1313511506cbe8"], + ["e313a84301ff9f4ffd6499da379245b1dd210d88dde114c91cfbcecd712d9f06bb352e50f80300000009ac6365635151ac6552ffffffff029f975f03000000000263537b8415040000000004ac636a65000000000100000000000000004d5df305000000005c762083cbf956b86e300125e334da124404f28eb83d3c12cac9c8dd962029388b0ef203f75db5b7e53be27156891ec012d9c220fa9b536b45c9eff837150acebe703eeeb964f275cb03d49ee7add22e9284b70f218fc9d3a5bf301cf049994800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f3a025705c523b951192da531ac4309d5f0a02db1bfc843fd8bbd7f98acb1a2727215bfb4a8cb93799439c54f4566751b06a45129e51b728b07e00463795e3cae43af198ce10fe08af340a0be6f8b878cc1feb1dd364e5dc158ff70e2b2fd7f2a93338a25c9a4689efd7fc304212e206463667d2a23a66bc947a313aa05b27330329c53e1bee32628ed009a7f650f525dc1f67bf369edac400ee020203a3b58768021feef6f880a5a430d947c6d6f8fd4b63a76e131b5ab20619b829c591bee011930a026d35b6f5bb1d7a7e1163ec3f42c599f4d0154be36877bfdfedd02541830cb090e153e55fc2a2ae797a38a27ed4c36903927a731fd87b4dfe976be0361bec43021296260bbf0e42cc1f5177279c05a579580f37ffd0758e070edc3882721642290302db826d4b9b14c8f3c3a3e5ed8abecf4147fdc217fc6ee8d98a00a1d52bf32e032c8d117ca70109d1187a71a853b1a0e0c93aacf2710993f1bb5212353e95843e0215bf26f7dc1753ff441ae128e16c579aabd2077d3e1f6bf4260fbba7802c14f8022b64ffe34fad39c1f029834d49b192d46aff64a7c9190f30ca0ed62de4d26b5c2b03776a6d866b0edc2a713624650756cd24bf6011146aff7a303534b641b6ff88794053f8a8f187fa72ac866a5cc36d8c2df3e86bf1bd15825c7c5e79ecfa183c95dbac340b2e44e76661626d514136871b62cab5660e23366797920f7b71582299fbf18e76f36ad1b0fe7c45eb7e368e1705ffd2a85adb4b8163eac9b0e309a2d1e3434c1e869f9f33a0d8cea190c3af95e2033f699269c086c76fd990e970a2e9b04d33643836d9817e2179879df0cd75c0ffd986cce67187e242d9e3a5cee81662f80f71e76dcb5f238808352a92a99eaf58674e4b99377feb6d8a606349fd57b50e69d48e8589ca22d224fa5e990325a6efa3e56dab253e4a8be3d23e5faef8e1813afd0c513f2e48ad0cfc8394c872c6d288c85a1d8b4291593bdddbdf86468c1f058cca1cbdcab284fa6d214cda97666390675ee0af9b672add9fd3140ec551b28c61ed9242af0df47b84d41c7a9cbeab837837a94d935438a55c2d99fc24e956c4e2d549e3a18e4bcb8a93b23e5a87848fbd5866f7644b36af7b1edd53216aa841c58d5e9f3dcd57ac91ce3d036c3b9daf5d14a2c02dd891399f9919a293a637977e4fd7f4cd776bac209f30d1469916ebe5e0b4d5286af4fb2a0761520c112d80c9d9e542414371c77261b2165613f6cd751518119882082cd4a2da94e6dc2003d78578156d4390362897b9515bb9a5f18b1dde3edef29eba1bb2ba207e914d29b73c8b7b662c39aa69faa932b3db7ce3c280f7cfcb6ff082e0a005f2403bcb64bb3bc7c894cf36f37342e5b7cab0773dfd6443c59b3be45fafae03ba03f22cee351a545ea6555875fc21f3b568165c926957ed70761571bbb9443aa3b7ca13106a47a3c92639606d473ee136b3686b57aa18e8917313296922d634a0b4671b07dc9aaf5527a4014a159793bcd73fefb2395d26880ec0b1f6a7169a0ed81b24c299751f86e37689d4831e22a5deef5354f52aae30928b7e40e905ec060d598f84e716a7fc1cf4a864d4fb61285b6645b8cc1d27b1ffed8ff0345d414d59193a7c6aa3f82d6846ec4f480b6c0b181514167561845466174a7cc31ccc28c7cd1ebac166cbc6fa1e6e49cacca5bb9aa79daec7c4d43933ff444ef764085c65d2a1f1837ee7c2d64bb84f1a62dca89abb88bcb683457ca2b270357a6aab6cea5cebbcc2764de0e228132026f6e09095975cf6dc23a30930fd39b1f874ef9689d5dca7bd2e324e491498f354b685332bbbc6e45d1aa63e540b69e82daf185a0ce2f28664579dfe4e6ebcdb5b645bbfab29af6cba73edc4becd9ff1a8daeb5f65ad42fae54bd84260b0acd8787fa83eb392b72216671800724b54399abdec02d85743240946e466bfd38d2fafc43350484a0823c1b1c08717c1a5ed272f0881c98c01f6ae0f7b3bb24943550fd808451d29f42657a7f23f153ec2f09252333d74c07df7b91ff0f2a75da0f922aac832d6f97f0c78f4a21caa4af8e282bcda6241c38c8c2eb4f50b60da10a91b693cb4dd33b40f16ee58d54967eba62652cf12894da5e9bed449386b12508e4335acfd20769b48a8cddf9f86201f7cecfbbc116f42a3fb22c62a8eb7cdabfb45ebefbc0f4cfeee0c13dad8fd94315174ed0b9db529f6b5f4f5ee66734d5e95175bdee81004cbc52398633f2c0b0c7259c80f4465fd92394946521681542ab5bf7ff059cadf8b0de63bdda466e63d3924c6d82200b90640f3f97f1ce9fd26c58961149758180f87b71d4299ec5f414b730b1932d44f88376f8c52c73495c07065e440dec8b93bcd4b48560d3514fb54d6fb400b38fc374c8a393b12adc2145c519945040c", "5363", 0, 501567340, "7907932af3fea21b122f96a84c8886e281f56ee548fc84efbd029f57f9107c37"], + ["030000807082c403027155546a619dd0cb20f9d58458834564084a56f7c8fd1b11a4d2cc13c5e7564202000000025200050cedebb6b6e4c58d564f7f6a01d29f5be394331dfad5ebeaf744b0204f626d48a38bfa00000000005e5bbae504a40ed50000000000003d4baf000000000004536352acbeabd302000000000153152cad0500000000026a5293185a330fdae33200", "63525365", 1, 867093779, "28ccc0d68b1542da3e1eb9de710a5d33583f9906dedfb20a647c23cb6ff57bc1"], + ["030000807082c40302f3008871dc6ef04e8db36d47e85a83123dabc430737c749bc5f820ebef36642801000000036aac533ae1fb41d413761f23aea84aff4af3b467e5f2294a57c35270a730b3c53b9c4f9e791d630000000003516565ffffffff02f0ddbf01000000000500ac6a00ace4243e050000000004ac6551aca2a159a7000000000300000000000000009d5283040000000096149aafd37acb7a42614851631f2a73f723c13e8dab10f6cc7e4dd4253b831d628cfd35e76e02a5574bbcee059d3299558062ba7dd0cc21aab608e41e400584605d5975a750ef8aa8b5c86513ebd7af864d0191870b30d893a527b3133b539d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000089d508854b8d5df1107cbd8e16a99fc2cb5cd65e0420c71692ff1b534b3ff4e091afcfa8c5be7820c049c5b48234f1af9ffa39116acc7514feba3840b996d3629916988b0b70c3e278ac0c304fc7f91389cb4b42dea30710a80828efa7974db7d450b4da71efd6038da4a03f3371b1ad02014d0b27701531770bfd38a5f18cbd022146834b6308160447dd2dbe89062257aac207cf8e075856d226530e1c7b93b9031aa6e69587d0eae6afc706fa34b890ec416edd97c772505a00af4b096937c3af0b004f33d2de74e7a1a086ccc4cc763d78ee0b04b9c2e508054fd792e268c139f43f15aa19eb1276507fad6573c082356dd9cfd1e1614063ce32b414944a48bea9021c081a40a7930be486bdfede2ceebcfa973da9639cb14582bada501c89be8c81031d03f291180bf2b99153c224e222c50175d5c27972fffa593cedca919b8d16f503227c4ef56a29e174e6cd7f73fdc0d47402178e9f0135334d5a4f29719e5678ad031798424ae3c754cbeca072f7f39dd462ae7cc2dcdcce8cf1b4386c2e80af9e2a0310cd719075fb2c6f89335b151b03f7f467a5928b076460ed1f88682ffe0709583ab8df9b5b4aa1e7a1379c50240af449b6180d594646e57f282359d53cc44b87369bb0c2ea56e800ce17b1abe02e9b1f568ea8eec6d7ca379687ff38f13ad35f88b3fa075d747d2a7305ce4db33de27e6a8317fc714ee5caff56dd87a81bf7040ce74884f92b60e6eae7c1da334b4329c49811ded635057376e9d0f3fd919e2f8e83c5839fa83a49c5c281b4fbcb8ee006a0bae66bcf5816591b475be78ebc8240a480c974d279514d132fbce2194a22c04ec7d2367b3584ad8e00217ca9da8977f99bd5ad2a594cfd64db05265f38dbd6e08b645a6783449508615312e408fe45aa52794539366796d937c1b107284d67d3b599a5e4a870b2bcf7bba47988e9f0e388b08e23383f89b7856b118be612a93cda2135251e54af9b8c6ec8c2e70fe5470f4ca8b519e5e1e109c2986de38084c401f81b7c4708b9fc7a016cea0649afe2a6bcd214e9d523a4a370470cb6baadd522fd5098dcf3f81ca880c1c18f30c28a629b96407053054206c4fb41fdc799bd37333245e2cc2d74e35c3a139bbcfb704552057499b9a767a2e0b340a78bfbd98c6c64c220a411dde3e08473f4df57f1fef874481a67ebedb0f0e1d8230a22c29780397d5def6e1196afe5d7e9703a551a75a933b718f52111409045b3748808d138d0e138f7cca41d5173f49572639a91b2bda806c89622de61a074d6fbffc259efbfaf6126abfc6ecec94dfd9c59e7993553733d7e57abf0f7c14bd25f72581c2135e4e64e93d8b1b6a682aefa96d949de32a052dd1f9cec5cec72a0bfd77e47848c7c6b502d959c3641fb9ff00e3d68aade893c81c0c40d9044186239f058a30323640da65927ad6c62d23272372966e747c4ffeddf3954f46b715770fce5dc40a37d2082fe85a2d85b8f63ab77a228fbb094859dbc2df413c832ae8ffb8e66314ee3bf020cea9a4cd807a5f49f10fb783dcc7e65031a2785593226c0b04f488e91127b42925dd84f971f530dfbb0183c00a91e4c0c915c5fccabf8dadc4f7406b22c33162b5577d6380873e45022aaa00dd2c41d4d84b30cec51c56c221e7666114c04de704f3566f32e3d5e87cd4f6da9bd65f6fbf780ab9a6892944b5d8205a2e243fd0e5847cecf3557eac348ab02315fc170af8566fbec6054c9601e89d91964acc37f99a7f5fd1ab5de009159a1eb57aeb0cb8cf5d1eec56bdf56ce9fb4757fdf8a9f58607388a643ed4225940fc6c0b6c3be39645dae67419c7c377446e454789a139b85bd565cbc48901ee1b08248fc49d2f13eeed84de757a9f182eebd4a1012fcf84900823d8a99bf7f01a67757600a55b99907f46f24334c741f31f410420578df19fe15b5536bc0bf9e70ed73d89bb72921ca7caa7ec01291db9fcab4b33acaf2f1f52f110f7c4bbfc9a1c462216c615cdfda0f4e2174e0a7cc3cabbd2567a9527ea61ae26623907f7aca8452a9b98d384d46a0997e752798a4c9fb30a74893aadc926012323ae22eac875c5cf86dd5535cc2c0aabe3420be474c619d05fd6cce51f4290347ca5722e7c8f4a0a283b407c93ce5fcd0923d5c47c4ea1a41ee22d8a79733472fa6821a0db0ceb23fcfae7eea71f3e80838f97fc0f229d267ee47e78e5faf7873a4abea08c5700a13fc9b95cb460136c0523ceea31baa3c3a7b75ec94935fc0ad4c8bfef43bb0ad8b984ae60d09975a8028c15fa367ff02000000000000000000000000a34a729ba62111a37eb14167467fd8942e807a51397cd50db323516026bffecc2ea7a14dc4bf0ed0226ef5f4a2b1870fa15e65223628cacd09efdec132e5c2eaad0a8411d6fcbaf45a11bf5323649b495037ea699f9f2c88aea590714e12dbae00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d120fbc73306d87e7ca4218cdd0b5a4a1808b98919581bc9b8098db4b78f16aa580ee7cfd12c56ed40bd2d8e9e49de4d9b7f14df07082a1a12aaab102b49d59929fd76c655518be246a2f9561625619b736e696e290643bfe26342a87da309e6ad957653066757f1f2bf1d941a2a97bfeab144e33d701f0ef16563c11e9794dc032f8bd1a85fab8e55eb31cdc4cd32131a656d9c6102438c42aa6485496953dc620226599407f46e4074b3981917e08eb4dd257b2f137ad4f001ff034cf1b57413560b0869eb2c56d23ac6de1995131ed50639548125e726c785f337756ff82519e5c0aadbbea417b29cf7860dd845b8ea79214b3f4ecfc0aefd35b55688ea699b4a6d022be325366e1edb9b255ec24c7eee01222f17a1942349c9f11df45991365f34ab02114168f798ee3d7cc2529a8d6da9fa0e890c8e5449f6ec0c35312c488143cbfc0208e68735c1eab66c2d929dd12db61c914e604e59cd60ace914bbafa8b78105320326ab431904f47034291096f952e38249f89f616a6376435b22d1a4999a73073c021f779593f9955af7b094c4e465e11d8e203b72673c861269e19b197c5e6734906a37fb0561f74c0926c7d64b745d89e865810e834e624a7159663653f75f8519d2a662c8b7a755a34883cd19a460c775dbfa1ca744123dd61094b213d66491918d884ea8d9c50232c94d47749f509ea1af82ee770888c10f6c61fe3bb215a8c26c5a94b711ccfab46b95878b4a1e118d6e13c0f81180f82f346b363255b195848d624aea926437ba2cb9dad2e98e64f926843536096285bc7ae87ac4a6662950047f32f5da1f1159a50c4def22328c3d4d4f54ccee6537b0a7e2c88f8d97caa1d03c1e89ea50bd531c3c73a925e52eb3483fa7fa77fd0cee2699a271ca08a65d04912c42bd7ce74409d175df5bca3282aa19ad0516accfbadb668c215aff66de7a1f35e70ab032e4b871590d15b2ca2bc843830cc275c1719f21d23be284fdaf4425b0c9ff1885e7a9b85555886a9974f7a73fd69ebf2df9b8c1c2e898fd436f667f712023b2f2921aeb748dd5fdc73e07f206a336d7e22802f3b479dbf5c1162e0f999c7dd4c5b964c9d42d1d05a9004e59bc16f464eaa864bc17c0e45add87419e1b08abeec8e0f6659b670b34c1129355cdace42f19081707488fdd5c598caa1465eb45f1e4be85c0427b3f624430d529fb727faeafddeaaf98b383d1e362e9fe22b29152efddee989ed951c5d5d9a4f74052ecd0642d8d327c810c73d7e722134606d7bb515d906184a3cc446a74f409a1566d88d12af2efabde6dfbf65c8bc19fb8c4af00f0cbd617eb7fe8b6e3e3620dfb66005f0f5a9f63d324da4525401602f95cae626ab8d65c3deba2609c3b003752c3cd51bd38e76a9d39beb463b4f3a8a101b59e36f5a947a3ae161256ac56b0a578761f84e2590a1d3a6866163de1c92b3dc127384f5a384bbe40c7d885b4dd1a251faa24d0b8f56706c844871213fa600bfa0dd683c7f1a3d54f52cd9980fbc4c3a5c7d94d56a7d0bb3caa13121a6134591d6fd17c4c94404a269366d3826829a8500595e801016d8dc691d60c3e9a8374c8181d2c85be36650a3fafea568f204c5369ea67403fa125de75eae8823376a42e553334a0adf64f6dfe449971ae19cd34fa24663bcb723ccfdefeb7953f807c5ae1de887b372127641e98157376f70573db0e8c6fd468016b1a7be87588b032b6185033d40f65966f9dacaca519518e6288ff281efdbf25b33157c259ae6a4f64d846d60c24f3c0bdfc2e9f2704b919d834c20c4a985a3d1d8109cb35b981ee9b68b8e601b64c50aace7d44aa8abaf547b2fe25e9852e82b96cec1b74a53659960fbd62d401ae7ee86a70c48e3f23dce9698706524ca384a110ba2f10d4e38d70108c47e0057b1b1c58fe426626e8aff103b75a28cdce1b2d7325ff95bf9e3799d345cce7f4f303806853e221c0145a78e25e124e1c90c4759b1f3e5932e9fa1d3140aa483952f50e4a4d8f0a5c536b40c9cb904815fb7ef128c5694a9f68c5c49093eccadf8dc3d46fc7c9104e876004dee8510fe5865e41a16503de70936244b98123b569b869ec34713746fb542dfc174a687703a3a7773a27c520479e69af70effd8db80c6f4b3e07b80deed62a7ac78e7204c9d92544bdfeb5fbc14b08376db5a0c37928f5a599c24cfbebe80d98a2b6c7d9ec530b1dd4509423ff565725c7bcfbe5fc970b0bad970f7c99eeac8f51ce11a44d07d880882bfc11f1e88e2781de76bc3dd5f85932aafb9500000000000000004055790500000000da9894cfa58c16d2c3e64aa04255a7322313f9b327c3d35a0f34c17d83f026554d57ac9d4d4c32844f75f6b1959096bb17c415511dd0badc7d2f5500dd550ada9f52be0d29700e2f36563687174d1305d2356881356815a09fbf8f4e817bc6b900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8fc55dc124510e019a66597ff756ad57aff9d5b96057ca85738e553e1a125a1cd82d8d620eaace98a11e8d2960ec13df57ef8b85ce5d76231b66066fc7878718ab37efa59cdd2066bdfb0dc1664c4dbca03f7c5c8d90311094ed8d66a20eaf68c91071356140c3c522f390ebf9ab7c76187c2d44172eaa1058da111e524678b021a300e90c59bc87c1cd72850c98206447ab4a8ac61c0cc8e32cf3261e4b8aa310215c5da8ae2abdb2a569f5084babd52c34c359951a2a2a4add01c85bbf0ce60e50a084173827559ae8be1d9287014567da14b50a174a1a58a5de5e43be0bf6cddeb3c306a1cadca914ea2c7b6dc8ce1e66910cfbffddad74f9788dcbcd84026024e022a9490215808b53472108590e9f387fbe93ab474b7071634cfa3c8ecf4f60c1602227d6cf52b3d88368e97795803766a1affe1d6590a5db004c10d93318c691b240312111669417a1d94f1ef2838782c2c1a0d1eeac3dea2e7f0560b5f486de5b9cd0317c6786d0a6cb0c6d68b49e6ac521e52ed9ce59ea41606899eebfc32b6744ff60224876cc3c99f41c06d7b1e87590707572cfcc0a5da7a0bdf5495ce715a915572d38747f9e71d1194d2f8446b7e04b2853033dd2a3310c3bbb9c21fdb87bf7e02222f1e64bd1e4bb0444625a03023e134195fbc1686f6a774f250696cc3773c2fcbe033119c4ee22e365ba4df3693acce1e1c9f0961d2f6ac544b118e985a03cc1420b275109b54d1bf9d28b5db56da7a7f7385b6dee015ab013c2d6ddd3ab5786b323510a2f214bfbd92bf2e30bc05ad16b11b0c01760749da649f9fd1a3377adaafd5ce185e57a7587389a6ba7e1add6efb3ff2a24dba6acff296da1459eb630bf29bf76fa92b1cff5f48c6f17aaf86f9ced099c33e57364caf0f41b7bfa64762d4911346d8da0fafcf35c5aa1b4a36b825a87650c22cacc19b81e8d5a93d29a7378609721d9e60e4ab5205b5352333951e32c285f8599b7bba969877f2c644b0c8e85764e18c65a0b10165bc5ec3c56578cdd4f60ae89dae86670434d6fce81246d8d44d71ee3ec4eb015379df42fb5a84ff2f420033d1d0f4385ed662f9a116c62737cc699db7375eeeab176e990af1395ffc3b21b88780a59adace5f8b9043e4c1cb55b1eeeba04b7ab1fc886cd74c56ef8c99650812ed6bfdddf176fd9329da5167b05f70c9974e1827639dbb73d43726a7af62faac79ffa8cf21e3cb1b6512db289766939fff8e4fa2f70af5a6b76272811b5830bc429786e7feb2fba526a93d72f86962733a77e6ebd94af45f5b91e65dd44acb0bfb875354882676a0dd7014ed1f230f9fe737cbdca69b4bc372c09865417502442fe359ca2ac3e45c1a0ea5550e42e2b840f2045e76894b8d2feb053557e0c5503198773ada9e8e195eab2895fd42cfb104a4a02204f8727aa38813b32a58b5e057494122417921a6b34ca1bfc5292186d25d2d80016b526b68a6a323105fa7afd393b365fa55835c553fcc60778fd6401b92d326be2c16b5bee5cca7b64f7abef6290281291d93df1517bfe3c0755302aed8813f793b3badacc89eefd241ad59edfcd87c7188ad29d6d4da43a083f85cb9b3eaf2d0537122225a537225d67690c6c02f0a8b25fd3f33eed770ace35783091497df623c645f24515bca8a499027db977cfd92e32c7f24f79d08c3d9b5a766b53d4a60f07d9fca5efa092c695fdefa8d8d9387bc70fe6500710ffee745b35a1dd065a950b84c132998cac865043a3667b818a2446952a3b62ee35fc16f17a711a6ed487f306cbda888b36a272e5277ce98373d6f5c659dc0594366276bf4443bf4993447007991a47982dbca84fe24e7976076042e6741ccc118c0a34032e4c8d850f1ae1ea3a9ce6f5f66f9236984ff335f016a9fb6fdc634dc87881feabe4da3a63272ea89452c73b6887ef1340a9a93c6fa5f91458613d09524175214495651b027be6b04bfe6ec6437cc94383d07665b3faa87cddbff43625822af13cc7637ca2c00b985d66469c60e2680c9844fec0daa86aa078773203b2dd2f74d8eaa69971a26d0792f48db1ea2e15e08730d131721e43cca64688c55c242fc5c8f2d2e0bf7868f5b723db873972e1a805d990677b5fca1f973f352ab4695757ff59cbd7564e6d4be80750ccb21ca8842fe594b6e5e459a82e93a7d266a18efc12746193555736396ad9f159ba6cd130e88d8b32593c2456771bd15738711ebe384d6adee0338b615e9a79e527746d05e24cda525a8a63775534ab3ec8c46091067b1539711172d413a0642e22223d2350229cf5d96e41ad4f4e161ecb8e6474a271c555690e028baae181dc275f3303fdcc1c7120084f35af322644f56cd8e0818d11254384562c742b35cb6abe2dd9e98b2862f56d6f63e6df49fde3b68c95f3cd69eac6f68930a9f03", "52ac51006a00", 0, -24310796, "1aa1ef591aa6da973e5b1a0dfb0aa23af7c136e4d4d4adff1762c2837c7532f1"], + ["42689b7f025ee6f8fdee363085d7d2afa91ae36729c9750be316729624a98da3127b8ea22700000000096a5263005163526a52899872ed2164574708467e9256c1b4cd898c49c3f5755cb44a7ea53cf59647bf778453c7020000000753006a51655263c29a70310409b0d205000000000753535251526a6596ee7b010000000008636565630000516aa3d9c90100000000066aac6a5251657acb7800000000000252510000000002868fac03000000000000000000000000316f76ba7e69eaff00327c565312f8fe5507a505af022fe0b4eabf122924072b6d04fb98269107252879a38ad62982026908c4a9ac2f7b4b4c52c5dae1b056610f0b866e47976d3398d05d3d7f34a315a010f373942a40dee087e6bca6aa739a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f6f0eadb02524350b42f09fbf1260be7e4c1190a4d5affa60fc69afaf21dfb1a53c94d3f7fc988ef131ee470e25c79d4da42b5c58026148f13268282be49d1f00116e5c58792bd809d5e0e4ac1f5f38b1509d290d14725d78846471c2be65151c536feeb6ee9fd548bb590c6af4ebedf4d66a9bb84059379c14a73f610069e0307ecc3a85a55b6dcec36b6c8a4ff7ea410991fc6ede4ec8a83e86044f15a9b36022a506e076fb55f44567445343e71e138183dbfe374e9e4a5b0e41f7b7e4806980a013dad6a17fc0230e562193632526444fde7bf59126253442d3cea12596f6c7308f66872419ae4553404613bf6cc49fd21742b002bea852a9bce91a1177f6e0803246a0fed7411d03471e414374982da53c02d65c21695ba4953927f63ed7e0fba0222330aa03e6918fc595e567bac29f00f1f12f22be43dba7db1f0548f428b036b0212ef2abc0b343435f0ed656e9bd0dc70becd1764a1c819bc7b6e59fffce91887022af084ceb78b0bf2cdc5b8c97b66a7a494378f597d82c2c900bba8a31c16967d032741d8bc52857cfde5ddd966c5f651531db9709a87ee8e649d3e21c307bd2cb68ebf741da774fdba69a37a45a09f50c73196ac4d8030f69e2033f0e79ecef82187b6c72207defda3f814e9f434e98a513a2f19d08975551a58afdb489aceaf366baed35e742bcd03b76f4d13a2d5753d4e9886d8cb8f4dd2e358445c2c6d23a373a053dcf71ee9609e791cca486c14f1eede5aa75b169977c5160e3ae0b8d48f5854379b7b923aa6c0cf4732ac4f1f926dea4eadf4a303f32d0a6a3b973caefc6b330ed13669a65442b0b44a1a66a3849d06a5fd7962e236583fbea7000f4c2f0b3a91842af2e87997c0adfa8b4e611da8663e75319791059146a55bfc8586113f70f8a214070a2ccb69202dcd3818d7b921f0055f2d29c8ba8b0cf92383d96016f078bb2f04823264fe6a42dd27204faa542b5cbe53c742aa4b636e2c9f07c41c7c56719a96b7853fd7237e3460fcf963bbc1143154f9d29e22a6d3a2a37bd61d4ae5937ca4596173473fa1936bf2fd0ef899532a792b09569a58ffcbc427e875c9fc8d5b837467a32e3fa69e41cb029905139664702f03bfe003ebfceb16c3fbcadceb8b91c7306fc81000e93b5c0e188ac4b1ce5d111e69791804537dcde190429f46e02194a737f7c5b37d785aa2226efcaef35f1b7c7f17a58a43201e69d8830a5438124d2a90d87dbd8ef4d454c67bd08d4a168b910dc2d1ac0b97e837ad5129ccf88d9520d134dc0a09b35695f963f47eea63ad35ddce93099339c706295942661bf8554234c48dda53c32f045e52ef524f2415ca1ca85f8277e5c1d70f07819aa1875413b858c4cc8ed1f037ee0db7bab6ab0ab7d7760d85dc7a33660b50d991b3e47c8c69ec56f606df961a8c0210a34bdd0c8fc0b31f14ed6fc80871fdab52df6f7b261aefba987d0d051a9cedec7918ddcb1949426c9b83fb990a9ba3ad7c81ae0e769b4e69b7478bb80cbdf547691a27eb79e6441a1baa30795404bbefda334b0b949da2b8b51860ff17f475b20942fdc5d2997142e5784def57442df274c17d3135d520b7faf14919c888fe876e94c2aa8d1b38101b6c6b8b33e06ad7b3c0cbae8e019b2f3439ae867e8514492d7885d935f326634589293a78fa26f16a33cea37516e2e0cc6642b86962e1f648b6a43e369e0060f70a7bdb09d398dbda10499bcd976f6b383a57ac308db6110cce91ab9f2b75dce890e54c7013ba9e37eab7e8a271ebafad1e589978418311f76e45feeb2fcbca2b5b139cd2a6255a9ed5850b176d5a1dc8597949971ecc46642c73fc09e8b3eec700bf0d9845200864cd35cc3bf5e1441e3f18976e36fe19bb64e7644b803914305dc903436b27f95a461834b95f53f452166eca8302413b0d1c024b7f1a26af799ca323e7bd54e35d7a927e42837526f78e2e29f4bd71cf0ef98753405697e74bf63aa1fd40ce3abd494750912104c5dace1bc36f0fe2be5d6a1af647d46dd7ce5206bd2e5d62f76aadce49928681165f74e71c289fd9f3e108409006a98549f67ce69851960aac48457ece571e48e7412237b4b92d89c37ff2a21823580d8d008d97e1b495a3851a25492bc882d1e18d749bc30bcb418d04295150c4916ec63fdc943b8bebeb741b4dcc2e17ffe9b57709067da41c3d6d7f4a82f4ebba9259b7ec6252508d97c71edcf2c245611b6b848ef3fd5a4a959d25960b892dbfe4bbe7d9f0beb1cc46b0c44f8b225d7524a85edcad1fd3a583309f9302000000000000000000000000dce361b7ea78f98442a2c04adfda7f3ebd5ad6fba433140e3bc2504b3339bb5d7b7b8c6b395f7aaee7689bd7b8ae742ff2a83a1002553935274473ebd2eb24b50c0e2fca640f7a6c3817ede25e8fecdde691038818ab7d2d53c2c12ac875e5bd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff4bbdde3b3f7acdf9eaf19f3434093baceff1c88106a0cdcb5a5bd605a5845d57deb8d610c227699ca29efd5dbced9cbd7953c38bd69f887a87d7087fd55193902b2bd109bc248dc7d457eac61acae2fcb952fa7873dfb616123f270f5669d6ad8d065239b51c2ac263eafef17466978b3fa4613ca78fc5331582cc14f544720313bc1643ee7662ca9d4ed6a1c3c6bbd2c067674a5657d5927018b2ec6ccddc1702209c4b5bc18f22022dace225703868a32b929a350d398db45896d776f76818f80b085945eeaf08a4b6b4cbfceab90b52334607a6eb757650267e7aab0a51a37ac2e27d292f2ca56c0106c23bcbb8cbfeeff6101bfbeec4f13cd3848dcbb0dea96e02136c92d6dbd0ebf3f7f33df60e7cee5b9581700360a784e301dcdb484c99e9380212627fd2a7ab77eb53f266091384fbfe454b03b0d53909a57bc187bbeb51e32a02259e807a43d03014f568465024f4fa93313ce78889c71a6f8f47fc257f1b167e031dedcefa03907b51fafb59588be5067616ce0bb363a55019b2982c74b6ee4389030251dd4e4071915ffc393ed95ebfadef91d7098cf573c2fb745ed0eb1bf36203c1e9546f63932ea15087722d456352ac2283b92896c0585ac7b8984228bf27e10c6da31ee6739f2a36c206aaa713d125ec5e91a557369619625f9e0ca3f0911e9748b3f464221a1b05721f7d455a4834b3498b8ff75a588b15ab34de6dbb4641bc1809343016e5766fbc13678a2f51d44f896633c8be46c2c2cdfdf47fefbc87694446a0b9d242c4dc6a6d80ccef7efbeba54d824b432bee1a821cdf3da19625f9f0689df739ab976e3581b688d235fca0d0db8955355290e7fb8c2a19b350ec0e1cced54ee3dfcaa3fe5d732f6d437fb18f37e59d69d5a06eb312d6d75d3bbb4a40fa15d5820ff5aaed7cb3873cfda9faf8908d493a31d6b25af7de2a106298f50fb655c1c22d9b1d2c561a629b0814d7633f59d2b06d020b527d4835f073e496ed3b721ec4f78405feb01f1d6740072df89edeeb075b4d8f9679d580ae905543fae18d66661122644507eb7a1e74f52611642b62165cf33cc42dfcd38acd3f05e03a41db1e5ceb16b24c4936b6942cedc6ce78cde67f1115e695506269bfaba908cf2ab98fe36677dee7c3a8da79ba9d353c19de8d75035ccc9ab0c7287784e66abc5805f2bed2d0ce18b8dba17340b22ed1c7e566430618314c97fbcbd1b2ca49277382e6c7a4c0a6614f4213b398632d2c23eb0a2d208ce0843d159a09b1df47d223c1eecb6383e9cf9e8c11886a292defcb65c0e57208d5ee172a27a443ece73a634ec435230af26d6e391480e1a7a46112dd511b09f73e523474fd15938ccbe86fd2d1115f19bde8804e414aa4b4b6a8256bc033ac36895fc7df25ad6fd93dbc6a7bb2c1ef32d243dbd39c17d310169a1ecdc507f45416e7ec1b29067db3a9fd6b7bf9544453f8a012aa3b3983eea3047121e07b8916f2d0a78a45938714e7450e2a1f210a035b8159d53ae5d66ba34ccea42dd6388ea6b01a14e90cdbac8c54e3cc717ae00d1c139c4c11ecfff9f72cdc875846af8d35a8d8a1f317f5b23773b2e623f33a24d5c6d314b94962c68c37e3766a76cd5d16c9c5fff4d2a8223570bc5777813734a44f9d4413db53489a38a9c6577e214a95564e93f152bc7c4a8304fbbdd9025d3626d804006fdf6367a35fb3116b1aac9fd75c317ab0899e8f1f1c291bfe8f67c23915fddc022246d6d2b062899eacedad585f16b2a768368e7c9e5bf46185be4dd8239902edd3381f00d66115eff8b8b9e6b25d48fc3856c3db1edbe79590462f3d2e911d063375daddc239e8c5e63bda001b82b3b90ef13b91c333881c167e08336f1cc1a8db593453d5d95b7c268218af3fa975d4012e62f784d600ef28de6eada7da1b9154605b1f4f9c40b05780c7dafa405aaffda5221cec33cc83e787fa55576f87a3e2e2913cb72eab2ffc195effffc79a0af64447a30555b9e25ca7501d124d208a1c230e5e392497243617cd2767c5dcf1b543d4dc3e80b5bce0ae9304f29f45bf2c1e0dece1069c8b1bbeaf65fcfa009f40e5ccbc6559c331b1a4f4affa4e7c8257408118d7d0f66bfc4de80f34895bba37e261d7341ea007ffc48be8b5311655d49a746472474cd0162640b84a0c67a6a8304077691dd3208197f7cf7f45c8f31cc5505063d8dfec6df60aceec1d2603c41e96ca6e662176ec85aaeac86ead40f761fc1ce029451fe090558a1ac77dfe369042f64adc3223dbe851fb36e85e774b4806c131b08c744b3304819524884189986b3ac7dff8d09d8a0c98906f06b2caa9cfe745c06ef7d22694574092f432a75314df13a0d1f3edc58f58fbf740ca4a518eefd8acf6263eff317e2aea7c779fc2b5bb84d18837f95014c94787ed8faa3d06", "535153ac", 1, 1465094118, "197e3aea153cca6615f974ab1c1c058baca8a76b164436d202594bfb098559c0"], + ["03ce5c36016226e86c97e833bfae411b43cbdfac1c1f5b2eac4eb689a12570fe1531c138510300000009ac636a0063655153ac80c2f43801217572040000000009ac6a526365656552519b50bf480189c550050000000000000000000000001f05deec952874e9d9fff9d3f2273578bc55a01220476af124ced8aed877bc7298e6adb70ff52b4f1c46cf136be6baf92847c0b25d5345f74315e36f419541aae076d21369dcb5c962e6136342ebd11589bcb73eb6b1a535890f1a987ca3cdb6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002be9e856b236d1d8fae25d44683701201b49cd3fde172d10d815a3306ccde0b1eb1e454b4bb528756a7e80fc531add568b4427b9428807f8e4e0641f69a1e666953c1153e79cc05e09d332f5e0e8a8ab243d815b27f54ceb2aeb191222c0f0737a91b24a0c3305016353bc657969dd71f0caa5d8413cb324dd677c18ebdf346f032482def9464b8e1c4dc079d2fcfd385b7491ab063bacb40b39e91488476f7c7f021094abb7df4c9a6b5ecd02074c8bbc7519918f130245cc8afd5789d90b4512ef0b048e00b5c97665ba2ce7d666e5b37dfa42759b527c1745dfb5194a776879f3f6ee208fc1fc9147d2a9bd2f00a948315a1288fbe26ee5da6fab47c12d839542f6031aca6959ad87a518671ea21b0d87ae4a52083d8ff69ec680760f43ffb9adf9a3021bf642a8e9e8d41faaaf3070529e41a976eef51f398a14b80d2d40099935cff1031b7160d33f56dbebb1f95b5bc38ab1d564d6bcdf7c0a3fdd6948b07e7e6297ba020240c247ec2391975425a31ba50772abf23880b9ab8f90fcc62b49ab248240c103151e1913835ab3c16988f855cd295d8da553a8cc7d5f4da0575343f7bdafdd7a115236d8e60663593d37adc63f8f0f22222f443a52b353639f521203a2978407334896245989c6090b134bbc205c7c1aaec5f62a404fa80cafb03b8fad18a946577d82e7ab6249e418e3f716e1c5bc33a2958651d74fa5e9da179d3745be4e60329052e7ef16def3a2d792d12d8449159d495adf0ecf212d206777588bb65f7c1da84467d033921623f650c575593ae33f203284520f536640c1ff9d9954848417d16a2bc4278c912783134a89600a4358ca177dbee9e34af4807dedcac4395f76b350454943b8f6bb9edb67fa5c87a6082de9995e3208c28aa1904da8de31b7ea705be8f45601ad2e9c648869c6fd930a5eb457e2fd5cc3f13a249e1ca11b52842739ed9aea97e7d2fa70965bfcd1f8e089a30c92b32448163f9ddf11d821b0d3e1324c002b7ce824f6efdd793bc72c8f404b913a37e2881571b20eae8af6626c7dd84e390590187f12913cb8441ce3f53aa96b1c3a4545aad6210d0c0c37a23f7f1e4fea550fbb9663dc51eabe7ef64580f1276da870a7e21572497ee66d8783090861ed15146e51b8cf831ee5648173a019cda477cbf51bea8407032802bf18af45738237bd19d2aea82d48389ab5158e4b678b694ff09aef4ddb2e91dd447a67b534117c8e107d21d11bafc626e40923190b9defeecb04bc60070338bdf33199ed9267bb663fc0efdf7a3edb8ed02e942aeb7175b2cd4abea988a668bf10f8e1b394924a86960c9305d7152cc504d080b3585725e56ef9be2d9f9647954a4a49ec7138e48324251f450080ee88a73a705d9429d621d7c7c9530c2e3fb6d47a5bfde6b77f6313a731e83f2528e1a38b6f25001f7bf103001355e77a5ba79224cdc9ce5fd1bd259d5dd93497a55146b342faa3c66f30ffafa63d2c922d03b0f8715d40009f0b6e89d986d987817db7490cb3b4dc7001bf5fc710ea4e59bb333d129d7128da352a9dfdcd68844b5f203ebb912270a433f7b6f12d45fcaec543cb143e6f8603b904582acf99cbd5371d8a811b1450443d22e95a2555b1062abeee21b73821b6eafff2d400654c77348e9ec72db0362ca30585e34d0ee4ec6e8b8ce17a98e37f1c4ac7ef4f8b958c927ace4bc253d13c3665565c112c551a4ef5311d32b2a40f43d272b2028b2b2c41008aaf89a3c523f0f4f2e6e58fe5e8a2f9c3733ce6143656cb2412ff7361cfac2f63a56ca3c5a35c359fc8cddfa20d5658ba5060a98de2de61fbb0a369fabbff709e4207b8df24608f90d576fcea9b12c0bec59d2efc42af01aa6ef31080cd3be80ad21a26da22614e26bfb16d1227687ffd938853a653485180f72e8104e7cef21f89b3861cf70c2940851cf2c02bf086c49d6ad554dc7a244d9f7a94ed730be9ab2b1e59f88df18d2c8da1ce865ae923b4f0f22adb8214de10a516afe048e29eb79c9acb0cc3b08cb8c32f3046574ee628590d1cee971194a5d071a3585c503584861ef3ccc8dc55de0ec9e98ec9c86eac8d7bf21cd92514289f1b5cd21ae96db227f17bf9f6e8c92a5e9bacb184aa65eca5ce231c497eac0cda5d5a9038a3f4fff394ae3d15b7d2cd31ec363c4ec4b53abcad2e5e0106c0dbe9725bac071b7927bc9684177a1dde1bf34442da2706c49db5a716c37d003232ffdaa4f9e40972c8318bf9dcc7d52565d76f2f2298bd93f257235e843a068d9141e3bb53abba8f6c5101e6a222c32a2e452509c2e3192ac1232a309c4aa57456d1e0d8440f860053a6978fda0baf8bb4e48693ab61d979b09a0f81b471abe087e51694056d3b808d69a95aabbbe4c008ed0457bc6181b19e8aa2589f5463a4e691c01def1c4607ad06", "656a656a5353535251", 0, -646376177, "b852db1e7caaa8afde923498134304be69c347b6f9d793d70e90fa7a79374145"], + ["248d010301673cca6b9ac14b423c1b3723d45d6e7f00ba037e357d126182e643b44001253f0200000008ac63536363525251ffffffff03aa884602000000000851ac656353535365ef1b830100000000076563635263526345050b050000000001657545551900", "5263", 0, 1768826249, "9896431246a1c07bcf2bd79e653bf0f62dd7ca38dacab5082553e4e9ed46a072"], + ["2b6cad1301ec109bfddfa3ebb6f1c17ed67b3e9f3e4d9f25746051f676aa01f26a4455685d020000000061350633024bef02000000000001000b080c02000000000265510000000000", "5153006a51655200", 0, -722294687, "6ff7c5c62a68d1ad0f4672e67f80d28b260708db573009aeb50b4e3750e399e5"], + ["030000807082c40304d33c2340e260eafffe6fa174532e145498c0ffe794e7f8d2f8bfa35781628002030000000752635363656563bfc896712f43e23b8790aa965e415b7491fe2002aaa7b849f2b66ffa030c3803c2f98e8a03000000036553ac90c5e64b3b1f724759dad7261b4b50a514e64e5208503b344fd4f46bd6b8ea3b89873ae40100000007ac6a536a53006ae7c82ec5fbaaaab4f8bd20f50ffa253d104481eefcc1a029b4091d0b53c3141e13445b3e01000000016af32899160469341f030000000000cae5f4030000000004ac6a00ac3dff0b010000000008515252ac536500512f0b5d04000000000163960aa0ce8f91221002d7036f03000000000000000000000000598ea350718d020ab7dd1b542cbc804fc0b8a06a5bd39125e4642c180eedfe6486c350178723aee891ef3a77b00c0da1e04bed873078b9d20d9fb482e5e9f55a37c547f031304c6120fc72c191c7f15ac047c0587ff0ac894453cd1afd8a1bd300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ddbbbb7f4f7777180116cb26cc19705c48193054b33968185764ac7b05e6cee7dd245705a18bf5d0dd64730589410c275b332481e19e45dea8eba3ca8a304bf9aa55707a4e89b28e40343d6541481f42c6dbea5f811a119120827f507fc751c4368e5927fe93511a1c577bbcab87f05df55d76298eabb9e6b4d0214c6cede7ed022e676fa070a4136b5c8242145a51365fea914e8a5fdc3d4af3db4b8894e0f404031bdf80cb124a96e8673a53f4c447025e9d8bfa29b15f0ffce45ecd09566e5dc80a04487c7e1758f115e84537fcd2bef02e1add294e81aa5be16b261e4c614e789f8d341f20742abd9360ce4823f6569b6cd473d948f8a69f76e1f3c9cb6ebbeeec021bc8e9d060414ab30a2c4ee2f03ee74d0e181ba071b41516171c8f0a0e0243ea030830fef851318d181a6b1d34862ef49d174e02ce21d841de0d006aa3a0c39933032577fdde8b787b38715d556e61965805d0ce8f8de0636a4df10842c400c0188102169d8309569041fe763c914a3f06e2aca728bb019d8dd70dacb90d583cff72ae03135897998edd3e92cbfba5368c398a2408939d9749d4c70e81715a07d80654398398a7d2b10d2384861d9e6efa2be1365e9c931db64909627dc26aed87d21b6852e19bdda767efdf29762e58c7c3d9e3d6c3183cc84a0f08d697807e5d0f65372d647b3c3464c41265c89f019a2138a50c2fd1062df9a0a4ebcc5eabaf385868dbea7daf0d2da6b872cf3be5438d606a974e69bd2e6c9d18f581e054a1039d3ce0f60fa9c81412d0fc1c39eda4e35460871e60fc362fe837c408efb7e13eae8544da836e00aa045014914c79a7d8e25d02ce6a85dce434e6039f65be7c91df88f0159eab6a4c88381b64d61c0e54e32a088fa5c8fcb03e766f036be0c10ef74e2332f21f692adc0b1725923f7341a29181ce76f1f91e1dcfac9920859d5e005352eb8779732c23220432dd940763178fb8208a7ce295470aa4cac12707c29a7876748f5c8e66d4080240c0c993385963a738447baa2ede0c255336022758d636d0ef14a771a401b67ee7135c4e2ee4101af419333133d2383c3904fd55b8f357078e0e869bf0992cde4f4a0405e12c55ea16fddb2127ee16b20d371f9c0a0d3d0a3c36e90cc3709a0bbfc302fe0ed0b19955be9f65002bfc1611cc7f4b3732a7ce1b2c9fa8d5049eeeea137d8bf1bd3236c79d4065e368469a7099a0ca5d89abd615be5f0d6c1667e397808c1f870b01bbca8be9bd76a82414e2abf1ce880e7d5b9796e55effff43e35a6a71c2756e4db498aa64e8d2d2bd12260a3a0f52216ae9b4450cbefe39615ae2ca2824940cfeff2ad4eb58db6000310f9d54774a4cf72dcb58fbeb120e9b40b3115e50e0f5b7598155a80157bae56aef2b5c67455c62c3c60fc56cda277b140b8a94fcceb3520b37d1ea1af976550b64e20b569fb093ba847e6a869d638beafe0197ecf5220a7ff8c12a671a84b5140ec4db66c31ba5424fa850b7955a77bf9394563b9c7c7b48d17166f4164b580f887b1309fdf3df0d28a15f158902a7a78f3b6c18599c5711df610859252916b899ca448f6c5eb4d527b4a8d9c463cf56ef6d5629d587a99536f4737a0755c211b992475d1bd092f47f46693a86ace4b1832a74fa23a440a01735877e93d6c4602e2dff2557f7ed11ee0be69e5d81c1f96788204efc56b0c53ff9f66d2d1a979395c6e97d033e3f6d1330dd3fac8595d19ddee9fddc440c05a59f869f1940723589690555a33c557c2b09e4e09cd5d9ec05a7a19c720b6a9fe58b081a0eb67ea35d10c8c358544e92361c510fd6bce08a8dd22f59c442f4bd672296b6106e56cdec77ba4c67d74c8a4499bcf8d3d796b4afc98ec31104230841d46f416b5d8bad514eb1c13e7567f53a5c0653e94c3ed36b0c0ba3832f3fd470f415cde6c45f190c0a522126cb71414ead5f59af8a5c80eeb7ad68c6df9a12351cad68179a171f0217857d767646bd102730e6fe062d5ac2524cf1f5854c39edbe5da4d6a8d07ac31548cdbeb22b89a78b1129b6d611cb92f984ea5df2a5aec2a8e53a8e618c6e56e32b9d40f770fa257a641f0c50dcf357628a996cb5feee0c076183f53d16abc4b6b0a08e32eb703b4bc17cd20b6375fcc09e6057a36cdd4342cbbfd66b795ee4b7ce554cb25d7136b870f4cbbb32c43e8123bbe7654a2ba67b4bc85e0be1503ebf1e6524ed5369230e86d348ee3c70b77bfc3ba73374b8348eb0c22a1d2bf7c1aebdec86f8ed229bd47c71bd13f2640846d094b1c51d8dc686b4ce02000000000000000000000000e46b38a2402611db7ec9dac82c59b8e189fb6e2f4487c9188d57565febd0491195c74f76cfc5d3e03fad08db10a20be5622292c6d2ab4b5ad98410a5c9cce237ebf3a5ee59f51607473922b3ee7bf7428368d96a3368a427235b8e395f7f7440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b025ce99bb9ab720cc90ada25b2141326931e83a4aee4d34c6d7d180942eedee2f62cb540dae9ce590c3244ca8d5060b6068f0cd36c6036a57909caac85e66e6971fa9e765291ec43b3f79a9032a3463ed890510ae8f067b41c2e824e5a31209dd4532862c42b9d7825e8ed7dc6ba43f7be3055eb1db6761fb8ffa0423ec2f40307d5a039883f66adef196653f14ee5ea4c244a6f68981eead3b2612b2bab82a7030431fcae6a6070c17c847c0079a527412e31fb71c54db5ad7a4f29d8037d69af0a00c8644fcb6394f26718b23d3942626e5f8262553e976a66aebe78aa8257d6acbf2d4f323a2a7ac0e97a1a621b9b5c4e04ac04b40f22a1525a6a92722089f58d030608ef17a016d0ebf742b328b0b8805b4e26abad11eb47b662a79814a0aabe27031206b229369735b718522d27010f6e9b25aecf6c988f9109a2ee2c80fd2949df031b769253cba0da7a52121fe1d974d8b4f90a58575aeac8942bedb7a4014367430320ff3587a13d7377da4271c4f8e920ce30ed85beeb040003c213fa1804f5ee0902144f58af8a94d7875ba2baac454e3ece42b0eda14fcaf236a8f1a10114554b01faf5e2c3646a4d9bea3f4de8cea0cab042128441c96ce8c3d69192a3cb2a3adb81f071c9fcb66e43e0673a621d449756a41975bc2ebdeb058169993906c7a47d36db8461f87fcd5d3720a907105d0c60718c14a1ee4fad4694dbcc23e2db0bcc1896d4abf18ca001a9772a9253a79554d8eadd8578233c7cb7ea802953c323c9cb8024746791cb03d1b6c15475869673d1cfd3c28a3733352edbf5fe26e3f1ad0c09d8f19f0ce97027c61f793d40360b9dac95fbd8048f8ea64f523b1bc47a3ef4cd9f97fc6c93e4c6eb392a784409c5365c78119d0bc01f12316868c5446380ddfec829186f963b127a8f85429c90f571637359d919f9c2b2bca2456506a6ce71ccdb673db71ee57c21ade95be1636ec8db15227af403145a364087d947e3fc27a9e42406dfd1c52aa5512f5b57dd584054d5a673f47186ad7f14de458c060ff063e8aef2b5150f9bb5bee60971307cc1cb188bb9f1bf974ee00675141400bde6868928cd3e2aa91375098e8424185c8f222a53ee5008c3e0e0cd4f85eb0fe73d47512e50b167adf9e2932ed052d4d6215ada69a29d828a46b3ae143396dfe17dc98b091137b5f819cedcc0465ef7557143078b1bcbdc19b14e7826de6ca921b58b876f437ab17603e75f938acbf8020ffbea2c8739d8c510f2925f7bb99108819959a5200bffe06a0f071905833681d613e0ba414f02c4719e0d7decff6eba2bfb294dc23ac30e74fe6273e755649cbe207ef700e3445e6f5d8edc95df41a3f419d29f2e2b48dcd4c230ce1abec3a0c169e77a60acc1cdd6427f6906e397b0274903e14d590a882dc2aafc445f815420a41492486dae0ef56d06b5fddc0f3f3dbc8a2c11d1b1e781e56e4324c8c426152632ebd3f14e98b9087d2ec056008f7cf9485fc58733eddfd94918c1ed47b4696111c7f453d618c6213c693799936c8cf9de59bbd104ca877ad4c030a95793a7116140efddf3a6d698b1a85cc2e47d8e97cdfaae6867d1e71e5b1b3ef711008d1c910cc9d61c870726332ac2c35c356b2abf2540602f511e4cbc0f9895a1fc16bd7c324f8d4ed3000b64d9234cde4249a7fa00f21da0a38e53b003d62b35b5d723fc33a42e3874bdbd49b4c05a0512f37e8efdbb3f77177c34bc80bcd5d4f002ba9b68a84b5510b1a11ec81843a7ea4f6507e3c0a0c3df03277f993d209ebf9f1b5c0bdf0674667a784ea72412eb1c628d6bfe98371ab595ca1e35703e21997fcb60abe37e0a0de7432a640bb536b5cddafece6b941e0bd1e7beaa6c63381b26036cbb692880d60ff42a1021ad03713128e8a9b0efec41aca36d95889a89c31696aa7988f7b3db5c217994192282805b6cd8e1c6ace87865df34e09f818e58bcefa3579f85de1fa9a9362feb6da3ead864b40b642163de8612b1e31c654ad7268f91243c6b016a375da92b45a9d558495e25a819a9588fb2dec13bae6dda4805fb57e8ce126688deef079b13fc36d0826f34e35a10903eb7ab356dac5cb6d232df5a8f85d96a58a57219c06e5867619739e6a69bb432ebf1a3f6a509327cd11b4efe7f9c5609197a734f0a6511e07457ef1ea0e3295e209556c47bd86c55ca0c3852d70f4b2e3c0b9c67b92138b72206b06d5e60dca8c6217283596d251a23bb92469e18a67876b023abda56fbad04ea60ba444ca04512f39cc631cd535e587c441dfb96b6b662deaa78feebeb92dffecb99a3f2606273cf92d6d51b2a81cf0eff172326b4e81cccd90a3e8048f017111f75784a3822e6f886c66f64cc9190a378b4e50722f98c27cf558bcd08bed237e7641b4e0a517a2b57b9c02431ead92c02", "006551635152656553", 0, 657317308, "8baddfa66e2da9beededc7bd0311e7c07bbf6bfb76f885c946da11165a060306"], + ["9d8c005b02df44ebc76d8236fe32f8d8c29dc22ed69dc9c235bdfee6db77abec3a85b5747c00000000056500515165ffffffffa8d4577a65fba5b1873e7b1ff740f6650c23dea2c51c4e8e4b64b88c276616970000000003ac6563de2c919f0159c5e30000000000060065005265ac279b10ad010000000000000000d06347020000000003cb909aba87bdd61ed7e256447d7a304a6874dc88751577b9bf02fdf16f2330356c9a273f93dc2a4e8a76ee1fdc930474000078b66dc767832fb8a52fbc31f9d72b7d7685aceff79210d772ee508917fe7f1effab66577d2aa8180ac6f063690000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000048a98c02454e8d0324273e80f023e99c3311495d3e63dabee1a520d7fc00510af40291f7055ebbe36c245f2f884ca1b73a0b5c064e54bfeae101c2c45ac109b8fd0c35e1acb0c70629f0cb4332c5e841b8f818783d7c4bcd3b2517eb4edd9c08fc7746b31fcefe8ded9043f82a31a3d3bdd2eee1fbde79fe2dae5ecbcec4b2cf0222692a2e89b50c11cea9213acd621d3f367eba76e458ba6461018bba25230a2f0311e9c27b0954b0ab897ccaf9c0c716dd0081059fd8e766f7554ae1abe234768e0a08a5848f2174860b94a765097b728c09fe4d9dfdae35d33727059762d7b524bf5c1ecf0b8a674a6e16ca306be04aa1ea479e469d63b38059f56282f78a7210bc0312ac970633bddf6c3a465789e2ab49a726111f8ce3f1e6fee8a2bf2f8a18e5b002227ab6df1cd3b3ead39aa9c1dd68b8ab1fd4d78497578c6a30b1418ebfaa9b140210d87701fe2933fac5fa13704b9468d11339faa30ec03d0f0ae50c9c45eebfa9021767289b09d6eefbc63eff6a7d31c250d3e1fa9507b6e695cf2b2e0de8a77c7003305e91b2ef96f5289c782534d7fd9bfaa89a96cdab06c30b97023691cfcbec6f49956957fb77690af4ae28d9066f84c0e06278cd6d1563802a0776e6a635791b3e50527f3cc9f4058a6ca5565a883cf6ae682ca6fc80f951380a7600340e1d3fcd322323caf1785ab0d96268326c11967e2f62e154d3394df591d6018c8bc22fa0863661a0d9b37596a4f93c53dc72edb1229f00210953d76844be0fd6c5630389b5136cba3da255537ac797dcf147977731c70adb76b69660b851686302af4b4fa5ee91f28b99e7d6c141bc2c2ba20846b3c126d230eb7b286004b5d2e3c1d9191baf422aa80f03f3c943e349f762f1369ca2f68f9999e08876faa3cb92353fb406a6f5050df44ec1eb891f3dfcc67516bc6c74ef4411eeeb9125d785c0a9c9e1e7b59556a57d659b6002bf4e1322835f9c844bdc8e73b9dcda18e60fb89f9ecff39ea1b31db35ee96736c896702538fcc2ac651592a17427bb9310fd8ee6ff9b874e7257bd4eeea5c7e26d5c369e863cdf40b6b47f00805acaf4f7a47ce4df7b8be966698d9b55a8959f3a3f7c7d4e5cafe0fe1b6554c4358780edfb4b92c2923bb933ba052086a2b5aac5ea6f8d748b684162e4370d468b7042dbb0c41e27dba2d644767a0a0c594e94e85741d9d3ca87628ab0ae13a98bf460b12c864cd0f6bc5ba362f64b28fcee6923e4a7a3d38a64e43fb9fdbaed0250c96f192b874a323048377b00856945fbefbce7628f1d1439d83878dff366a321a1f39e3d5dbf94b8f9e581a5a2ef3823591fbb20641a1a4e0ba4646efcf070ac719cb9d2b59db2ab3ebddf1e17b9f20b1a32eb47254a30b18b536c51a6dc7c6737852c45b332945ba2098439374e12ca5535d2aa0a4f9a5dc32b30e65691fd222b70e10bf1bb7f5b178c085493254e288c8f942f0d3c9e93fba1c3f03f506654783072e44b9b191576df0dc55c6fb393e47db7ea3cf7d4489d70654322e0e7a9ec81f67f84da02901491254329251e838076151398167d05be04eb03618957b4919c75aa7bb26d08907f1e9c1bbf8c198f74bf8e2b67964420c16a6706ade44bbe90b0b01b9b9ee302cea0cb0dbf4245b0e7dfeec24b8744b2419ec04db25263f86b3c765c2e7d7f37bec33e9cd0284ff2dbfdbbf77e11c9e801d0eab04d64247ddbddd1dfa078e29ede69c612ece4c0f600fa180ae3d590958a41f68b142d988ebd325d07a57e55663953acf58b3f9a3fb96f62bd639bdfae5ac4bbc4bc4a270b917469c767b6fdc40bd64cbc340b5dac47ceb56dc5f28f3e4975a5d123b879ddc291f3b42fc6d8e318a8be0314d0a59d863b32de09272d766baedc2ba6342c8cf2dead6db1a5cc0a6e1afac01c684e52b9799ba1390015bad35be756721156034323967935ead4cb2525ac7d61783423dccc81c7a659575869a700c70de444c9c8faf0a6ccc6f1bc1577717ff9b67b96821ecbf6de7ea3fd1cae378f3b892561993d19ec9cfbc124a839312bb79969215d6785204e15b52b31b33a9ac63676f9c97768bb6379c55729fdac9afd41d794b8d97be2fe638fea5c03e97d52029143fbb27ae4036efc0aa960d5efa60486288a0d6ad9329d52b317d1555d4efb0090b2690e6d7d4d3c9077235e623fb965f25c661f4614326f70e754e315f87d3b2f706ef117aac4b8e2e89dfbd43796b4271d8e16c7fa4e6b6b3f53c292e17b35b536b683460434e7d359a7507293179f1d87ee420dc47d1745fd869e12d1ae384277cd3fe91464f238db637578c550396f5a92fc5b4adf041d9a57e9b9ae9ae36eab9248d3c683a26419fd27c01305cd76c5c1579da1142a967a28feac0dcba9034c78aabf297f938c2d4921b47a7761c2ea61a24f302903", "0051516a6365ac53", 1, 201488168, "8e0e369b7105c266c06e991bb7c6580ba1749fe9863c3fda69574d23f957d6c2"], + ["e43e304a037f0ad97ddf1f6b33795bc1681f5480f61be3d45f3e8b714acaeded7257b2ba33000000000753516a656aac0030a2563d83fb21d65b07bbe79d9d800b2dc120ec7fc0cd301cb732e0c82d8c0b3be22a79020000000965000000635100516566155afa7011647a4b2a23f3aa19b8f6fd917579682f0c887efe0892d0161691c8b9118500000000026a65a107ea8104c3b62a010000000009006300536563526500bfb2aa03000000000953006352006aac6aac67eee400000000000800636a6aac6a6351b2eaff020000000004536aac650000000000", "ac65ac63ac", 0, 2117499319, "196055b1782aff32c5fa7ef35ff1a9e17fa99fd26e9e3742233b049e524665b5"], + ["030000807082c403021bfb2a9b33f4486201a0e24720613403bc7f49e358893f78392266f31661abe6020000000363526affffffff2ce7ebf3130eecada61199746f7efe262d1ab50e9f149e1ad7ea0a77892f49050300000009ac5163ac51636a6552ffffffff02d5d12b05000000000653636a6a5253140fce03000000000000000000fe7713b3030000000000000000fc208100000000001e6b74323bce29a6ea66e28778d94b3ca9861e937e70860bb8404cbb4f6a1ddb911291b7a9a6314978586ef80f11bd8be892a5dc166afb6f226d8c8d15dcfcf055f11333f526b3fff70209ca277f4befe6a69c919b370d99a11daa451943c9ea00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000253f4d99e8883d23057ca57245eb42798a3b438eabcbe0b0d89ea7a17f12c1bb63c30674580bfc400d0e59082df02ff50c93eebcafbe4ab90274416fbfaee3e11ed0cd0ae27f621f6267be1c96be34149169d598d54c1ee016ef5b3e359b0c9e4707071123cb5a7a911ff7ca3b9a5511fedac7c2dac66105d68fd5a45549cf1e0205ea4cc49affedf85b23702fe5f450a56ff728dfa31517e62cf314a4a1404ab303122bef2432000ca8b9daf0a1993b270b270309785f37a83a8d1f5816e2a852870a0235df1c8839bdc8b10d6a3fac0e40c0f333a9780d3873d224c89962c4af60dd9ef243b993c176d57802b60b36a57e6ca14f01d985db5d9966d21f89eaf86946030dd0043362207b60396c5e2d6eaea745825de3337f8ba38f168baf93a91ce68f0320496b448f1418a7b8847c02549dcbbb943cac578abcad108c568c3c5dffc4b7020febff0fa0740a2cd8cfd8c27822ddf1cfa467e07263fd70fccfe9a1916471e7032016e561b9d080fdcc9d5a04dbd03e28adf9e1e6351ccc869ab94efc3d2595250214f1b9803c3e13762ed350285104de7086c50f8ac4e278c333c6d5cd6741cc0aa75ae33ff9a43823070e89cd12cd125e077d324b81a4c8e89bbf8a5634080faca481aa40bb994b47df2954735bc4ec72f1d1e865f82f67822d94b034937bd5deec13dba785b4e1c89a15383270ddfba3902cd7e0965c7e5d03e8b67d563be49c801e03ac48d01154f373fc6bdf43c62eb82ba8f989a962727736d5f68230bfa25e30826689a2050748577a42eb4bb3fc7fb434e6b42b180f3d92860a320a63bd1c341d2a4f871d84da9f39f6467860b9720945d4441e549337da6234b934f16b0b1b10144043cc20479bf791321d119924108ea292b144ec16a5cd885a5903a5e6b6899ded5419d9cd30f9ca8c8e58b8751c566b67473ebd536a058bcbfe77f402150f8747f462f52ec3fb54838dfd4fdd78a2df34febed0f373afae73fc1599a764cad107cb55555d0f6cc133aa70de3cb369dfff6f4d27dcc08d026cd4f4bdbf0f7776d47d5bc0fa0c7a05995cedb15b1a45760760172fe545e25f2bf9ddeea8469bd245afaf283edb3e6fef8d2e8337b5220ae446d1412b76560708a7608f65e33db342ba67a2491dad7eef5ae745685cbf57c2d261e371318d882d1c79615113c1c8e045221e4e47c4ee2184741662fbee6130d2fa4f87744dfd20553f796945948d6a3627eeffdb370336995ffb2416744eed642bf212d8af67374cad0acee8993850de84f0825556c0a1ff77f949542181d8e8e1a06590c67ee5ced16c03433d471c125ad4fc6ee59e46f789d601e1ecfea1f29c0abdeeb110e9f32c59049fe5032ac1c7a326f707d5202bc4424b079cfee3b93ea80737ed003f2e0586a356dc9d2553c630fdafcf74f544a5bf902c8093521883ea6a3ab7b322aefea3cbbf495f02c19b91d7269bef3dcf756ac268faba088b2568d6b3f340c8e1fd9ccdc8d534fdcbb029007c38e4d84e9b5e0149ab5465214f7ebe4a5013c46a9c5a9f8f87dab52f9f443a2a89725903f173a49ee50bd55efc034d04e81f0faec296b828012a7d5707303d30a69e477f975b2d03fa2868ed997b8b2b28c65673a38257246c82f324d42acbae0bb3adec6eaaaf074081948ad0a1ddf247c06819f86b464f16e8022da0b3d30c02921464621c322150ce991c1fe1a66570c5c46209ae8dc8fc0f90f69402de912066fdb7b455cca08cc46a5487c186a9c1876c078ff1077788b8e8375cd36ee49b47782c50469ac28d5539332770acc410be941c6e516e1479a3ff3d2e39f273ca65117d5f5094346d1489db100b6afbbe15c6013c72965a23efd66a316a25d15f3fe9dcee5917b0f94d29ea73733bbbf782383f14c3cfaf64d5db15dc149b0a130a81ec22237ded48597af2ddcd2b9090b9038aaa961b270f62db772ded25fd3761f438ce748cd217169794e3dad9ef97aa3173386af24ca40b3cab46a27d7b03feb47fc448a48cd2dbe5b97cec021fe1a048be49c0285e33d8cf15ab2dc10a67aa9877517970a574bc282f4ae9ad94fca1a276f0ffb0ab16dbef9f3a947f6286d8ca2f971c413ded99fa149b540e9df40f1c9a9cbe539e1af40ddee6aa88b1a2e9d5ba0ca443330b7dbebdedf6afd40f011750c5d09d8f6af8c003bdb5754be9958fd1f3948705073e11fd9f3abc3267c871b88d8a6d1f45537daf79f30ff4429fd4fc07675e5288b671ba850e74d743084c0fbe63de622f196d6abd9948b49869b5d406ffb9a3000000000000000072763f0300000000ff44876b0b680977fecad54173569ab85f798bdab8247d12ca9a6cdd319ddc280b5c1f732d77244364d4e07ea2cd8c36997b72cc5bfb107b5f3032a67b3ff82e5724be91506bf2ffcf3953bdf5adff9ca1e34e34b195a861aa8e8b8fa29a4b77000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e54ed2d8c4728a1385e67e20280575a038ab197ba01c76340a69a1ba46a24076795b185005a1e327b9a5e875c8d2797dfd74a33251d392accc4c765b0e591313244c62f1157300ceb7f8eaf699aaa9b58e38d76c268377d7c30ac4d4bc594626570779589a022e63c4c753ac2d665ad968eb3d3e022620fe4aa4bf2d368f52802128dee0830f1e36f8bdd3423cb8e208945a8b010efc40e9035bc3598549282d7031a2f0b4d96b2549d470d6c8f1101b27ba4b08cc15d79788f1be26c6a63bb90d80a0086e68d0a4439e3818ea294bead76cf261495b415ed8438d7d44d9b016369059aca4805cdf3801ddc928e1c3e5a81e9a0779cbc682a5ace190abd171369155d02073527f12f7cd55df015642f21a6dc359c65ff1babd66125986213e8b1a52a66020d22b46314bdc2d596582267ec31994faa7aaee83887ecb01458a44220f4e00c020858871727c12eb8e5dba085b4d6f294b51103d79bf3a3fde1969cf9b046fa83032485ae266b9480eea38a25325b28ca6c5b750aca2c94ff1c1094ca8a4859c615020db80886f5bad7c980ed0451db38d2d3b7fba17d2c8bbc2c1ca4a152ba4587116ff4df0a47696f7d83ee5841285f3123d867e84434d3c01d23b2ce949e8489c3a5fcf408544d3780a508327c1583b3017fa0fed501cfdcc600dc7bd38cdfde7a4366032365c3a8997d2acaad3d82bb2d152eef42d07a20232c81d2f3b804d7c5056d76fd690aee32b42f285edce508bb7630eba25626b813fd8b530ef68a294b7bb4f2a154d7bf5477d2c7bdbfbd0e0acd25eaed8b50b19dc46584331517bbc7f66f3849e2ccb4547e3578657cf694df1c5a588d448c4b050bc6e52f41279b51dcb4ce9eb115ab15c0e1e22ad02a05b2fa306cf385aad0189c720ef76ff65bc379d635146f710f2b05859ae5d048d7d00ad09c1e5e5574dca8d5f1dcb2b1cf5f20df277794491c713f671f64e1fdb7399ba5d9e188a91cfbcf7305ab93880642d2f8a37affb2d0ded29f54cd4347dc699214e2f7e0aa75dfcdb11016c4bfaa36d12251d8488b083b7662c0812d058edaf87f7ab9f2c217406047bb687c3c3b6af9f264d0570e5c5f7be63e47735874bbd610c0469acaf31986b3d5f59c6c557a9f834330c65689610c1826be2beb4f7a87d6780f344b39cc5d9e6c85b0069a96e795e6aff1774c4f42d3da44e5c88f490a82746f17308be0df45d01e98595351bdb9e959da3da9b61a3f6c02a217b6ff15db5881f3b52bc23d74c9d7309b0193913472b2a24c528c91313fce6a765d727a78118b752f03d264b5233e0999e8acc8e3fe92294e275650f40996df6c11be9bc9da39ac797763c79d621dc4a4ef671018572e892f8144258f2f69474f27d7ffb1b853cde29b174ba465d8ccdf14ba45261a160a2389acd03b341f3f40f0f6b9cb78170a1d1c0f84553401bdc662cdd021500ccdc79aab321b9c00533bdfdc919a8d4d513330ced6f80e05eb96000b11aeff18fb6a90c7203c11098b7081d5fe962305549ee7bc02e619c0b3cfbd56705c8863c8a0f02b0ee0c30a73c9959b9dc9d0cf8a12ed6b2015c46a4081bd0b6955770211798b56d8a21e697a7ee1cd0553e6a276ad8aa35ceccc3c97a8d7fc241b944b677d1e21a7514b3a5725c71b3a12aaa7e69ab9706045f42f16edcfa70c47bd6514abdc0c7939b6d6775a5d6210ce69f1bb12f9bf8a238619415bd0a006ca1ba64641fc3cccdf82911ad8888e582d2fd32c26e220275fc0f352dd0b46ab4f81ff2c9c11bd1ea00255f705ac8b21363e045c2722e1d1506be8dead50c636a189644a3104d40d184472635526609a19b96f146046f337c488a5d3fae34f144413dc2614027bd982a1f1aecfd5e15d8d5059eaf462b3508ee76d358f1e06a82541b02c35fe5e8a8dfec358f747cc1b47d8a7a3e1cb732d674dce9e3fd110a87db5f5a895a3ee8a3d78998f856bb379874b11b023add8dcfcc3e058461a3becac84feffeeb2ca9da6d15a04cfe646e1716613e4a79f6f2781dff6d0aca222c144bcf373dfc2d9aa918258bfddf26fb5e3a795f9faa6395fed7d25e4e3835a4d69e8eb362ebc909727325b6716e4fdd81782d5b10f688c003b6345c99078c2525566ac66cf8f146c6499aea31962519bfa6227b34b2c88916c966270bd0c4c468286c156262f2cfa72eafbc23d73ddf9a92ded016be4261b44cad16197d90c476a4a2fcc90642e1af9c5d95591a1858bd32b6835b98c207550f09a168316e9ac8ce613edc59646d96a78ef2f010cd3887f00000000000000002fa7530100000000788fcb00691fc183fc460dc72cb0980a7c9b2bc922ea8963e679095bcaf0b0c5e59e6d4befeddf93dc76a105cd70b2c178641c3603e9f5b299fbcd16e225ef0c6ef4259e1c7a60bbcb30ef1bb75ce199b17830c371398445577f5cab564d903800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c84ecf28a2f6730290e826c4b833a057d2e79be11df48359ac112ced004ba1b9c15ade670747e32769ddf5d6a05e5962299fbe513176a3fa538783272eb1224a71b18cbb89a2b62885a6eb2baa10f36f53c60fe5157e8bfc3fdef1fd6ef8459d82c11f976a758a593b0f8b567088733789e4dcdd974fe4b1a7c8d016bc01190e0218caecd9985d1441b585ba0b7b0b3c40ae3a396eaf7948b31dcb92838e7938a7032fc09e5258e6cda50f8e284c389c85500bb625fc0ef14d3f24f3f8e12b9a3ea30a056c0c0d1127ad4a1593ef2e64bb6ab00c155b0a6b8684330da22789fd2cf5f48c9c1444606eab3488323b5bc05626e837fc114c7022ce1026e888f067468a70020d6900e109b2bce471df1580ed0013badf3e2170014842fedc1dd5a922b2db50021cbf353dfc5dd1485bdaae259dddff6797f9e423bb19a0f133ad6c9fd9d8c6c803270ab1b6472bd8ba3a2335a415a3f5fa9da126e6c3d3a2ed8608a6c09f8824b2021be231b90e77796e76c01ac9170acd1f5ed852056f060f8acd80f0ca753f7b480208723e6cb27f3ac3cd8779713db93dd360ba57bbcd4b5b1562ffe1fa0ec0c5987f11dff3ed41eda598b85afddb346276bffd18e423cf139f7f6858a9f8fd5750c4963462fd705de2914759981eff4fc08ffdd49c70bc52dd3be187716f66774d86d4849af308ffcee3c9fed067d914fd7605707ea33c99b851f568191d8a69ac5588817837d7c67799843c6c1476a7defd9451e0bdb008c8ea567d1d276e24efbffbdba1c5f263ccaf01271ba0f662f919230cb2369827d549e390dd37de39c5006004145b03b0c6e8edea5b5e526df2ff6b8929484ac565ef1b58bf681a4d0540d48a12a422e6a19376523c55bc57e1fe68b1a62a5a795e895c3d42e8c834bf8dedfdf11f7b70f03259b2f0cef24a30e3f544c7e79c894637bcc8bf49dd87929149037344e799d61936cad5a5e9c14e2789ec9f0f1c016db9835423d1b5fc790f2383ad7b596ca8d44efec9249c79f78d9f28634e7282d916e743f1b52bddb80e1a8daada1ebe94fd2c496eaf31c102cfadd34b99ed00e35c158ab7255b61cb965278459f14f746d4c983306562bd9a391244226b00f1dd767dada5aa614c4eeb610c74a86deb0c0b5f24ef7085c53da67f84ef472917d18ada926f1c6c5ac31cde953e671d86090ff19f9aa72f8491633b313d51fe371569e31ef5ce30bc7a6b1f3fd888ec092864a38e325852d5150bc6adda7e7bc21d3140d59dfb96bea867b46a62fc13a9bcd264b7df0d8d99118404a485b9e41a3b4c230c51b81ea08a63c3e9be4331a8d7d2e6f9f4326f47f9d39b3ef35604eb9616dc780158683e34fe060d6aef43881daa9e27665cda4f7787c79ea5595afcc7a0515e2fb092e77ad43ad02cb1f20e7ffe4eb75162f555c33d6f10caf2c39b74bcf5772608bf6778bb31d1b21feb1689ab3288f363185d0527e43bf8e058e1db5ca1ada141d1bc8e3e97ecf615419f7f0248701ed82ef563b1dcf4a94b8612fcb99a6ce31b669486c9a15bfc0d3163e13f715ea85c11fb6f4a6d5adf4785bac111620916baf65fcdbbf0c27b783951a1bdad8e1007f061010a5723a7bdd6c7413a5969f15f74daa7342f069901464be7019786c34f07f9d13e536603133ea9cac3a93e06ee28f8d1c4e6d910de4851b03c820c66dec9bdadd8239f60a6a8a83d124665d10f964d04c989cce99952dd31dcd5f5b931edc311aa6cab82d9d06932a0ce893042e7dbc9ea8ddd1cd12efd624057943ce8cb4b9cefaa98f4c740de9c24c07f0273e7ef585f39eb9e221f291c79c9f1781876ee12a53ae1a0a1af20b1da4a7b4d47961ca74536948a7f52f044eb18d9a57e08864742eae7c0bcb734637abd1fb8505dbbc0c397e1425924a305232f62a738efa4bb3ed52233a947dba5cbea90834ffaf6347ca3ee99e3296a837ea1755edd051eb7fab888ad0bf90c19b2150a40eab53ab3893097d5144740145f674f0b7bb04b23f6478b34096d6af7c7e9126e21d615de1e91a341eee158031251485c4bde62e3c53c053d05affc83fad2c888df06bed4b1b938119e5bf04a626cd9353c029da5abf7bed895a325c72fca0049bbc90bc69b34f4a8d84bd5acd3fb944a25c862a66fe6a4e0c5e699510074ff760882ab8cfe043b9ff0462c9f322dd766a8ec82dc43c1ff25d10a6fd943510945edd3659aad82569735aea9b6bb110d55c52680aa9605e6d9e3dd794d009e64a9de852da3fd465e25856130b82c954353f2f8f9d7dae82aa44e59a82dca927a49fd811da0b8a24f36752d645a02cb75ad263e1f6932097b4bfdde233775e58ce1678e04a2efeadd2345b118019b29a2f78e920bd64386668f59f7f1ea30b55ca36702b332bbbcaf809627beb52422338531a622b72a0a", "6a51655251ac00", 1, -1258661535, "ceac83d6edd17329cab369cb5f7cb97be2719fd8d15884c87d9310b697022c3c"], + ["030000807082c40303dd6f22c18aba407e1f9221b0ca1bc8228bc976f682eaa8d8fe3581c9015e91ea00000000001067048ace23a3ade15215af94dfedb5d14388e2d758048a5fc5f7369e586d9e9750494d02000000056500525151ffffffff669207bb0ee2322a6a1706be30c84c369364f9e3b957d064f34325f3b5aa5a4e0000000002526afb72760d04cab9b0040000000000fd1f2a05000000000965536a00655252006a7089c80100000000086a536a51ac5263515f1118040000000001510000000004dec15100", "636a5251655252", 0, -2141732540, "9d8d43af584144bba5103f801d3e2955aae8c6e506413bc19ab9504648b2d907"], + ["030000807082c40302461b561b6295e3ebbced261a6c636aed9e0ac088c49fc33adeb0a5c22c5dd76600000000016affffffff9084276c96f5a2db30098477c7d5cf779cfeded5c9d057d81c895ac977b26b720200000003ac5263a33d3ef9022cb3160100000000056352536a538cdd220500000000085300005163ac6a655d762ab43cd80cb8035a44cc010000000000000000000000001d44aaab2412286679fa1e86df8e21d9a55c68e3f7ce4134f427505d5274a00ceb34edee56b0997475bb273a2a8c3f8d3ec1125b5714ec7e2441edbf3db634e614219e13c561e16e670dca0e83ca02cc0c1ec86a9a710d02dd4362e807ab17a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ccd28ed3730cbd46c2e976b5a9b4f8695cc45f4a60e06fd5b97dd28fefc6ebb0baa9ef7d8a96044538e68dc212a6cd745a9c1a8e2be5456e8bcbe7e01de5ba93bd46b2e60102f07f6cacd268e15388c5c98ad46487e05b4c6acf817c15577f924f0924ad1792619898229de6202e9515475ca18b19f1204156e9c94cc809f1f503066d3a67f666548ed57c83c5fd23b2f0b2e664a8234136e522092941cc3a3e31030460f132c04cca78b172e69d26ddc39bef84458e30b5c2ad18b9d59eaa6aa3fc0b04118b28e78397b99f0987c96f36b61df7907df32481d7f323b73749c62aae21787f1d5ddba88485582767e24626f367d0f121b5acac65bf8bc2fc9f35f25ddc020299cfc19448a3a8527689d346a306e3ddfb30900699f7ba797cffd02bc928490201c65aefd41cc64771966b68b913fce3075bfe28d4481a0b35d894e1b33f5385020024d1fa87a7c9f7675c9d2d2a7d6d0b7aa7501e9b748c9b4fadfc35b3dc574d032c6376b5eb6b92aa8df876bbd38136667726198d924ca4474d99c12728e2f6090318f5ca375cd29162ec22b4300fcaa8f95a2d1e8a0e73ebd9c5c23de917ccbca06b001b9b8035a98152ba3b33a2fdce1054f5ab5062c2980f6b1f67802871a8a4b1030ac88b72409006b943794481e687f61871a1a22e8cb2287e4b4178ab66620a92ebdb9d721c6b8973b35d66b2e5be8b7e3fdcc60424d973d3b175e67aa32493d70ea5bcc5273708501bfa037813dafb03a47f536c00e2f73f1da7522be64c5f0d018817dfe741092864adc9ddab5154b44455f99ae9e212154767fa7e2fff1b8ed49b622aa76041a4f23e28eb555d8b61739676403cc584d0681f2b68fa18ce94b58dd3b6c7861fd3365e45cff6cad4ec67685e4da79e254cc098b9a6b4f65b36996921ca2e28e0774cbcf71eec389735b9bed91923d47b1b45b808d37f82f7a69cc95c5284e3f1d738ad9d15e1a3a4830ab9b48aa016d2c6d96010c119a3c78ec2e367cfe552a3b77235ae07f2e3e9578718f8ddfea9a1eb3950dbca6f95cf4710d7b5e6a02748c9bef2f698a8e1b4a699fa6dec08351dff3f3f8593afae94c548a21805ab3c097162178ceb48d13e9c56b811f29a75244705291b850927381fc548ce319e0ccae94a68aca434e864613f7458dd093d6aab569df99928e71edde0eeee83ad22069e1ed9c5ff78e35d7368ea809061117569024d4e5b96afda96eedb2700650cc3208eb4a014767136dcaa9d50935aff262e9bca0904a915ed0e44e6f2606d4e228003ed20e365b19d8d5706f2b207454cc1f4426048c5ff3470b5c0c3f401851938b4e59f550e54f24e6694cb12fd98cbb7f1f728de11473fd89b522c6bc9f0901cb260b1f461498eae7dc0f339391ccb51b17dc89c1b5e2daccf7eb87e9c075c493aea0997e991df3f1f2ef094bd06e16ce084f8307a93e3cc494f64c02db1daf5cef5159f3fcbb35237f1f3725fe1cb6d7b1bf7cdafd6639a6b6af7bfa361e618f266e493e45d80fa4eb013b5cf7d0d05e5364c8bcdde39da1f3489fd2242df98dab96daa0ad046bd70ef86b59d307747ec11408c822851dc33b1d325d47a892be1b96cae56260c175aac39bd0aefe870a34de9549fefc8781908e6b97e499a50b442e69bc4aea5408d0dd956aaa69667e2858d8f40f397c6559086125169d4fd67b0f648d6affb99c25e72fd85b62d52884dd69a829a202d19845e963e2a2f588dee0274d7589a466e44cef9a5f61c80ab5f5db989b218c0b08b1c97c706414c51cb7b7b8d9bf514ecac86263f25a0e99cec6741dbe15556aea86e6f8098928c7db780f57230f7e2720d5b2dfc3b6ba60cee1e973daefffae8057122075284b238f597e3d493ce7082d86726071a38bf010b2802eb8dafc8e18319eb58d3b82c9d85a9a19ae554680877d5215d1b0914616cd70c36477d16fe6092856aa09475f40d728725190f957f9dd65296702bf6a2c430c0004c2279db5cfdb651239da3cb921e3255c3b9ab9ecfbcc3f7adda695269d68add73c0d36930537a3ac52ac2ced9ef1a0d597b31178b021cf49136aba3cf21dbd8e737f056aed2449647456030e81af9a5fecf999537d56614abba769134cdb44e9239ac62120d0b5a6aff8d717e99a2541a0a36483ca79b4856e814030cff20909af2d5a28c510f6c072ff717844e4729fb4d9c142a04795580b528fa76fe3b27131138c6ac0caa18d5eb4980615c1bd8e1ac1936d338998aa4c35428d675b694c21348b9b071f3a792db7503c40c75b50a38fd000000000000000088fca60400000000c82cb5a81c05781ceaa61eb6533168835cce205b2812edfcdf6545d3fa36b5f25cd194b240013f21a720abf05aefdea6c2bf344cd64dbd302c34c376b6efd79c1e42251714f0c5ee978d9a51c4b3f7e13f600fd967d03c82493f185fbc25e3f5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007e4920126d58fb8b32157bd693525ff42050fd9c49cf84421fc5d6c0781d0501b680ef608e9392fa098ac021e564b3775d8713f9bf6c507cbc5eae1c035f6767fd67d588d9059a50f77a0c61199e5dc6fb4d7e083032317d97e33644f496de546719ea88db15d5efa701ce65334bcf1ff0bb83b10b8a6f343141e9db9011d045022c2b71c6dca24ade819672ad2329619d835d8f42e1ce40836a4144974c616daa03268ed7a7dfeef5cf74d9609d4caa2fbf8a39057ae531f572b7d8d4c574b5ec410a0404ec02121c374a69802f5b6ebadaa8e84ea83097ed47800d741e0ca6083fc11c936ff90f12c75f4ca7197013653dd89252e2829b5fe753e174418abf2461720312d59eee6e658af7a48647c1e9aae38dc12c3a53cb2a23a332ca97ea3ccd50b3032f3f2e9bae09af3512a22774862ae4eb9863cc07cb9d33fbe67390a9e1a43cd403212338f09f8b9c8c69849ca1be50d9b87b7edde3010fac5e0095d4164332c6790320db781e7dae9ba30f5851b85610d9f407eaf06db653f6f1984d405b0809fd810208965b1894fcabe6bd439f6b3ee0387d4cb0a350ad323bfd5f21af78446f1756fe9bfd38e5e545356073a3e79a976f4220f366a4aa623fa7be50a0866d28be64900c6d6e04fcc7de5e5edfe6e1dcefc4327b76627cb9fed1a83f98e597307377252391b477f59eca017d34287e3823c218044b9d4039d181e3fd747e350263e1e73f935ff9735cf48a0d6dc68c3d100faa1c039c49280cf40c874c7bcb404528472a7d003a8e4a7dba4b7193563ad6f7efa5e7b97e664538c19604e430095abb12c94a0cbb099ab9a66745f04ce61d9f87e4b5529ff1b170880d95b8cc654981e385ca0156f930fe9c99ed83e800a46dc23de0a7c8a1d6c4bbddd867e1e82426d252658d4149439fc92a00469ba9a1ef26780d1c177da2ddcbf2896c25eab7b08c728cba6d95c9cb69d633a694f3e793d091eb6a5339075fb8e50b654cac96eec8325ceb999fd726e8ebd8d540f382a2d0763588e935913f3ca22a05bc295a526690b23609d3758c55f614559c8bb4f7fa7191572cdc73cd7f754d9f883dcbc9a2e93aaecc55bec6e31e58807f85f03d1944667d6418cb02bb783c0753dbcba34f618962b60d23fd44d7f8d669ccbae164549b55b19e49e37f57de03a08c09eb5bff2d6e4a9772b464b9c392739755f738b538234d2f9ed1e1da93a36d32b382b358e6c408a1da6da9c9b20c149cf16128994c8838a7ed958dc9ea5df0f8c05bca6ff30fef2be8889c250fc3567c60b4cdfd68b3fcde4191950cd5df21180a500727cbd7a84f351b3bdbcbf6d9213baafab4cb7646adb6b69b168666a7f3be899ce7dddb1754cc7f2598a8ec809a19dc67f6153bd0189fdbfd5e36382b6cb9be4f9fa6ee4f85934526332485f6c0286d06129387e6092c9ea4697e26bff41ff0bd6fe40cd68b4cbcc1c2d8ec8b2df44acbfc530fcc264c4ba045cd5769af163185053c9b0d3c36b80e5e5d87ea4f6ffa6395d58e21b6b1d070c296a46d33ec84b6ebd82c790a2089be68918bed15453c3f51cd044ba65dc45a56830efa432f1a47affd54b9ac403059ef8b145563551d60cd80d7a59db9c5ee7094e60016c34169c382ccfd54bd1b3fa9a226ec0173080a1dbe0b85992a309cc42aca0574c42f4cf4a95cdde7481656894161cfcf00ba2a6def406acc2a09eb3b8118e03b9c34d591a1d58fef5e0d953a2640ccdc99812cc1198642da4a692e2b401175781a06e947bb8a82c18aff4c71516d115e4dbbfe38b143dba01a60e311c58db5eb41c7794a4dd0dacc992aba0fe1fe07fc5bab20d1f5f488c896b0d2194f83296f574c7b6037215e527336483530102b69da0cec2b5ed98ce532d8a50260aab0a579f8f599266c04d629931b03532724693f10d7472da84feafa5a810d4bf1b77c08779787d2f32e21ba5f11eb762b0224fb42151f978c9f75bf21cd57bc9773c2bbcb325aa402a1e9f327621294b4ca32d472fdec34db85405f01755c33daa283f12a6f8d9281ba0fd99c6beaed58592dda159e6321cdf82a06b2a494a7944cafee1e1ff06e811f2b9c9c1b3dff6c412cdf102140b1d893d0cc25a2be90ec89884a4adf07d910e4599851338ab0dab009f6827c863c7458817e087f1481a0458f80adfbbdabd0d005cab81cdff080ceac7dd2c77e10178572a23d624fe46e984ca54bd9882ae8a713c444d5fa5f77ce3f348a75372e630ae2155725ea5e2d8b5c341861fa247a4b16833f1c4683a47064ce5ea28b000000000000000006517d00000000008b5829b8c834258fd34dc89b06bea9d9cc567f5441ca2a9a51b01389edcb6818a68638d0fac3bab9161e71a39770d1403ade00c098739c61f9678877a5eda92b62d8b51130d76fc1ae036ed6ed04dc6a9c8c323efbc98e971dabbf2ff47c6f29000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007c6511cac86d4ae8ded1432b977a4b57fa1861645d6c1d20a423573517af102ab28b170a58d4dce4709daa657d8ee167a81f215455f44f404d91686bb09d9afe6d119641315e3d93b4f761e276bf1fc882185783272c73881b6ceaac2efae9ffff970776552f3972b67f776d68acac166ab305e2942d672abf106074a899c4060225e29df76a0474a6608a0ad211b72e0c403747f83e136dd3933082c05070e045021c4780872f83dc99f57f6c4ebe05c4e2fe4991bef8cb995a1efbd7e8bac299cb0a08eafc2f0dffb0bba99c68cc056fdaed14650891a40eec9707c1aec9f80b1edb885ec5fb7ceea5ee42f69900b83655296d1fd1601caac296db740030ba48103203078b94280bad9b383b7e475fcb6db8028590a624c2b834f7d4093cceda4ce3330207f00d3effc3f36880e9221ce2d897bc90a6a1fe0e9b26bffb5a2cfe0cc8f5610315f3f0763539c6626d78a212eb978343c717e89891f33b6a304ec7ca04f4fea90309373eadbc006343f7bdd48b3a0fb7ff9370cf7c6d5b78ec3c51dfb49b105d5b0308962eb59d46c496154bd1e80522023b395c91447c084537fba41d768d27367e1a3e9ad84bdc3e5c0f5cf5c0cd7b28e2cf923c0e9eb6e70793a07517e3adacba9b07323e421996718912a4265a5a931f5ca63def5b50550d1a5bd8f0cfc1d490a7eb8f507f77220a3475b97ed500090e82cd0b02e2e16f85b0ad2f4284d71f0d02b8caf3ed1aae559bf66142cd67607e087e4323c6168af9c516e04dc8bcde978665308e11eefd520cb81c2346a4df0640b43f8b711d25068b6450ce24812c24637e7650db0838923b92ab96f0051b1704d2c45187e13bf71c6c189e09909bcca61f06efc4e12adf2decd086fb347b6c2b93217f943a600be9b611a2ad2788eb6ef4d78facd2fd87530db7f24c56f8b28649cb80334022fac401ea2f24d60fcb908bc7f4549fa0180bb24c0b0482bc11042d3603f67b9a0ea69d34fb51c9ddd5f6f453a7adca68236ff78f8cc90ed605dcfc0defffdf05e4619c0180eb6f091353a6ff8e48562cfbd16124255179675bb7d8d2f9686b219ac98cd4a89a930520be0d956ef891f1289c3a47aecba047da3ee770fafe8cf3076cb0333ba5b5194afa321c320b5f28e5cdbb3173990be54d8ba2bba2dc82c577d5a858dd2b63551da6b11b5dc5f78bea82fca6620978ba46927fe4b682ac89654152b93e669787626ef47d456bc12537bd1c8f452d00de7f36ddef8445e9b03ff604920751808fd57e9ae2ba290886f260433b75348c87f11128fbfd01cc4c10491366e59c2e536249137c5ba8ed9c031fe3a2e06f7196f7544d1f26e9ac04ef528d289585683f7ada6d07f53036a3cec9aaa0e5a459c9113e785fa567f801463bd8ccef32d6b21edbcc4fb0c60fdcbcf333f41b726863110de5358655faec7dd91cc0065c70291272e4369940666d48745ddf1c472c1a7e3a4a532713516bd38c55ce165bbc8e1a49402cd27a85c6163f4f1750e0290e2adb42912ee9ad20fdd6fbc1550ecf64cf56759dd58af8e272ea19cf4de21cd75a9433216f6ded2c141fb2e9c6036c209a24ad373e140bac426d0d485f8ee57e1523b983c4940706f7655e47024f97ff5014d15c52f6171e459f02163cca77e5e2442921c34f28d5da8ab5fbb5fe01cd1291775576a5f0ebd4cc576ea2228ee15cdcf04a332b8e3474afc816840f5061457a9c5ec8636281425e3164328f856506820cb6333eb5f9e862ef29966a0a058d49dbb2020b20324aa4a8620766fd770e5c24b8a47cfc58500b2a10fa892f9887b76219e18452303c676d972055172359268d978617fc7c33eb1f518488e63ee4154af46ddff700dcb0e9f21ff581ef515879daef55512dec9e32bbebe06838d890e94e11a2bafa54253692f146baa3ffc083e518255957e0db63407855eb0d092013e65a6592f9664715203b22b5d690b4197cc1b6ea3c9f0cae8189a1a9e7be44dbd684b45e6cc8ab8351b124384b34266f55ad4e6185e12d26491a11d959fa11e72b39bf0d1db486fd69c17073f4837da1a91345c080176cf71e3bfb3d4d5ad492cc2e9c11c9f5441a83480b7c18b3bd702a14fa8ea00de8307736cd15a942379aba9e7f4d4b80d36dd7fcd2c4885c7b3e5d1bf19a48b10f16c67959c069f3c065e86d8f44886bc98a00a98f22ae2f055b82da06d8fe6562e9a06a975387c4758127aa5f8a3e3f0f414c0e0d9322a97d927f0b8dde4736fb1c745d40884c5857054799f8b56df167877baf4d9b70eebc2f10afc806fc65b1e4ae5cc2fe3ed3a0fcf1dfa5ca9ce1e58de59831db53e19ef64c706f7102277416195396d8cf0315da96075803e14f342d54b69b5298f78c4ebf449adec5a3737e71a2e18261b76d3770bfcbc53bd10fc43329ca10aea6dd03", "5165ac6352", 1, -449094173, "751171cb6bf738ce8fa49e9023cf4df5ae5cb00e7c13b35ae60c5c00068f07d9"], + ["8d32f309045512eb43c624cb4f073ca8ea370ba2ab0ff99d9b73f4c6bd04e4be8d3e38c592020000000251655a08a6392f9b43448cb388b40eaf0ebcbd4f468dd66fbba785414635c3f5abe084eb00a00100000003525353c57fb9dd90d233c6408b2698977b19e68733be11c58eca67e2e8062544a42aa28c707e880200000003655153274926228d438f9cc07740765a80eccd321b3fe646da007a3ef37c6089e60c39650abdb802000000086563656aac6351acc054a02b021674c8030000000003516552aba4b7050000000000000000000100000000000000008a2c8e04000000003a0307e4a6e246a67b395cf55e17e332212f0eef7606ce0b19b755483cf9b2a21ced741c2584b29fcf5226036c8590d08af5abc18d179727b23fc6effcec7afac02349fe506815c1b1169113c3ab20e536c24d0bfec75dd97935a88845c982c600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e4825d8e4c8529047e529ba2d392e99915cceff7771f9b547e1b1466e9fa37c3c6e01700d16eb34a80363eacef45417960f10339f3b0672351be2c47f7a04cb176e556ac1a423721660339266bf00ed5e4168d912a81cec0e6ca9c5fb797bc70ccc4ffe1cabedf4e6d63de9918434b144e8594dd596ca8e9e702e4d7a2cc9460030da10c1591258ddbd3166c42c7d58932a8f645c07acbc3e6592ce5409fff23320211080dbfd855da1ffecbbcfa18d6a59304c726a0a21b1a2411e675a2262302190b03794c7e04d67e36c7ff20ba26f94005da6dcb226f655188190fc7545f6eb5420d13f7a14a2276e5ab7408aaf0dac8896b9c9eb1ce871b8fbc7114637a3c085e022e9a0d49dbe1f54172641392dba9c5b48a1fc2a6713cc8ae54de9c0b71d37619022cdef34f4e38e73c5f7bd45b6664476640175f41c68cae6095a6058772253ae703144ebe874b97d32161027705dc3d3b7902982e9ed9ff0c3fa42e1b03373e0afc021c024e317b1284521fdd2fed288eff379f7221c6abfc5949b6e991218725463603141f8ec5bdfea8c64d02390778a7f294017308d8301f8e5cab31f4408846e81788f84891d41b32fb9efc394bea8ac31641155310eab661a77b4afe50180eaab39a225240122540f45101bda169c7a2994353feacd28515689035d347f7d17a4d0da96927b47eb0516e87fd0942f84ce635ad0b4396820f1aeaccc831b60153862065e16606d48632039bfb1c9149eaaeb5a44cb9407c0b099f283b17ec0e8dc1ea42ceda9e4cc09287edd54669fe94c15d1b0d4d8faf7bafd46007db548b42188db94c7803cc86e75dd9a62cf57c40bcf344ae6289413b75d2670f078b30ad4d05c7ef1e7251c44277f15ac4fb5c3dbc1e3265db72d7112701d45ec73be3f74b78f5785b0ef19ec67d77001deea66dc0be69a1fd653016d21ac12c977367e42b4e9497ea1ee3e8b13a8506eddda6a042ee053514a3b0b9f127a6293492edf6ee492b3cb4bea095d68ce30c6c24da4be91223cd252e80f68a8bb8a8f76ab5d3806cf060bdda27ee2be4ae0f2eb4ec0e062ff854fe6d646db4b3669d982163accec447f237ed237bce9f55d204cb011d527bf790ee6431174d7bcd647fd1716a4ee062f75d65341e49e4fc6ee3641766b59070692640ba9850e0e8b37083697e5f47a96e16995635a173d7ceeec8a7cff85a187fdd562c6147fe962bbcad30b39a26c7976274f30824dda501ec2d4ef071ae92a4be2b080fede66faf0b1f9e8245822bfa81267b9fc154a206383345f478dc6eb03694f6b7684fc1565375529acb8b2f902ec3cd823a1831baad143097ba1c1820ac0dd5d244979f46c5a83032bd441821042d8c33527a028d82b44b55bfad083d7b947c66642e593e5ed704618d4e31cfbb9f88749495705a530646b9771e1b9256e9845998e7acc519d178ff4e782166fff7e415f01af70614456e1ba3cb85b0f589f2d584fbdaa9ce8254cf51b5ba960b1c7b578f6b51d1758242eadb2059038920291963ed4ecbe88ed0c7876ca405520f2dfca8ebfaad56c3c2c884e185413ce9033039a48add278cae3eabec85c0db5fc290646b6fe826ce33b154ad43a729bc2f64b02bcf77bc5b125c9c9d19837ac1fe804383f2b74cddbc72b3b9ae3e850048673acab7f6cd48b27c06e7c05a106da4b0299d30063a7e99d92d16703d53e77d00bd737fcc89cacf61246f66206b54a2ccb08f12dd82dbbad8ac24a4f597907106e62350dd5b7bb8b60ac7e48e00e98f294d2b1b2b6239b9673315f26141c949ed19d168a191890c88c3a3a63a0dcb1303030b173cbc43d690b44455d976d8ce2c7599269bf6d7ca2cbefce30b42888f73f72c3a8932662059fb620166086d1aa0db3c2471a9ee1d3632d5ca2b6e153ae9dc7d12d1c7f823c36eb019411debb2fc6369636cf16c48c48c42828bdf789bad4736bd104b5f8058c68d1f3719beec489013f2c04ce09bb95180991f1a3798c66851c791d5934964bb499a6fe39f89ff9e247e427d1f10ad5db4309c498bd55b91ac3e8c22bc8a73834ab0513d1f58a335eaec77dd66a874ae0257cf8115235b78e58916a2fc43b7638b2ad13c08c5e41f923191c15a92f7cdbfed34a917a8b86080297a80eecf253231af5d9c69d0a0b26417b18aa759ed663f7cd0193d55a8c5429f0f40258907efa2b4bb675d3d015d44e0afe77b43d63ba37e103aac60f7b236e179c1db806454792b07e01d361dc74f5124aded53b8969c5cbf7e0dbd911a76cb9bc492e1f7c5388989ebf5adc021ab383d0b5e8cc15a6f0d9b71007db2d169a386511b8222405dd762551da005cf8c3f42079d142a212b9f6d32571dacdceb5f8fafd20dbbc54a1561fa44c1bdf266f5a60a8b384cef9eea77eee2f1cfc0797238ab6203a5b6c706", "6a656a526a", 2, 2110609730, "7c76433c7802ec4be39bcebc9c0e4942f6313b1e8f5a039c58435296d17d0e96"], + ["4f4abd18025f4c80c8f482fa8146e4114a21560422f1e69649e7c60d08813c693e3eaccb4e00000000015280e734189c718f44bff3696ef0fccf39229e9fe6133d769f68aede88ee3708bc4b669095010000000953536a515100525352cd48b21303d24ca30000000000096aac63516563536563cadf3f0000000000050051515252713135000000000003635200abdb8dc400", "51", 1, -1561790416, "e249a8db08c867ee7ebf41ff8ca9381efb8b2e507cb825e0f5afc406a7bc6e4f"], + ["030000807082c40303979efe5fb6171475ce34d295d9613d2a19a6c7b4e8dd80fc7f310b4d780a66460300000003ac5363ffffffff97b142e8964a5b83845e186663a56c601b89411279e78e496c4830b11c4196db0300000000dc55d62d3deafe19fc04b59dec5d9b1560f4e58bc79958a1c003453420c8472b2e737ac3000000000151655c187f0345ac690400000000066a535353acac26c96c02000000000553ac636351d30889020000000001000000000027c8f5ee020000000000000000867635040000000069b6d2cf847b0f6e696f07ffef606d3487d8fc57b686bd19f373c6ce1d994a745fc5a6e0cb09f8dece124e91b036f9f0e030d817d16fdabf6e72e2bfec72d3bdc6bbc16c15be36027df79d0e01a264b4a7e2d8cd42284a8253f3c2b5b8d3ad7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d0650b0bf866e9ee78dd85f87359437afaf29d84ac175ea57ddc46d5790e6349e9717aaf31b17b30bc1abf4cbe2b2df46bf95dc5cdd95c0b024590ffe7aefa6a37324fa519c3b668d9296a5fa49498e17091fbb1e54859f1e9b80080541378c4204ec7e21f840aca0f8d8820d124e52d48e4557777d8ec4dfa346160f142f913031c281fb6fd12c2a7b6f3fc5c4a7fe9a0ee74e5ce4451c7a493dec92697d2f9e9020901ecf02d952428f16e0c85bd0f9a545647ff441b11abbd2cb02e08a3467e860b054fa3212e082495ab328829d8a8271e70d5278722c726753dec6e8ec90232e30c3cdcbc83fc468b48b9e2744cb97374454d88a1673e2d104024d575b317a3dc030f08050d2e5fbeb4f374475a8bb6a878b6a84cecb10e3e3472dcc7270f68edc70220a6c32107f324aa8730b3dbf32a3f3315bffaf5c04439f7062276402faf0338032f33347bfdc26b422bcfead6f976e42978968baa621e02b2ca6085d26a866cca0325a7916be2a25523aaf607e5f8ec4ff23eabb1d849523a2524947ab7fe13a6a20207916b9df7e91b8fbdc08b7f5915b701a00025e4843ff2a08c39f03b66c199d6e55ca2677024ce55cb9360195eba98ef64806a9995433e59fd2fa74d62158da3f270a9d787035acb3c85008feb4c43c48a3dabe56298303bead4d66e485ccdd763431b62654536afc8b9b36e5a6810c014b30f85fcaf39115fcecc3c4e3038ea4408a62737bf3f04dfe3c7b494bf221f2db34c8a6c708abd91629271c8a37ab13666fd4be05cf9c51150e19f9293c57eb399cf9dc038a01f0b9fe0c2af713f9908a12cd6a6ae732a63de240dd356a0c97836c0ba7b73b209a54963cd2f304edc54833dad2622c8d1685f998d5d9568613a94401a361cbd8e6fb20e680cb6389074fac49406232f9c6841233bf6b69059444b201a53d58b46013b7849d91243ce7b633ddbdec177c621e7864e9fe8770f3b08ef3c173cf07d993eabf04c9570e9024ee44667d028dc825278f923538b3964699a6f3a74f5c00bf65ff340aa6d0c86acd4c5b772aa4a4764674f5a9cb5ea874681eef238e5a646f199b4f6feb7b94c61c748f374ff3479c570ecf2152e2ef9b0546ab343c7f63f4ad6119addbb8c6584c877593870e8cbaa168b9af907ce2c3c52145c1fd2e73e2b3012536959711a681f755ef36d7a7692d7378c16dd8f785e0326b3a2671118d4289e4a3264864b80d45c904b710e3f68a66a69ddab00ebae6610d6fff5d8df54668b1f669fe33e7b45fbc96b451bd0330a0850c2663ab0b0c9fc7168a7d01acaa0412f8917c498653e5038274ebacf87f1efa6cde99acc3799945c733b7f01511793cf617940cfe9b26fb4e7cfa3e9e5fb1400a275ff2923c7804476a75a9f885f2bd68cdc628c6b94d46d0f07e8826ba968555f3171292d5e90a2baa4d5bb5c8525b4857bf170a51a6d89874e27cdae9f66f16056be1f1f624767cfb567d1d0fb8c933f93183ebf27e6edefcbbfbb936b481de5633a7e1ded150ba76f1f1c5c5cfcc0d4f3f0cd2880c4542a4c5e87616b3ad9e0e6b32c30e83b8159798769f704f9bd248d8ff0a5930fa821709fa6ab4cd9c74dcebea8fa8c0ef52ed3c43acdf1733a4414137e6d2d76e1807683f34e77b73ca4f99565389383f756005a9c1832e2684ebb480d40859510b05940d43ae7f3b1812f2e51e9caa74a7b5c0716af77487440e7d88d273d96db861c386da1582682c9b7d52675a77744cd1c652588fff81b2da2ac8b9a0365154604302e0b6adca06987cab0a367dc2ac11a1ff0e68b98c4cdeba0477bf897e1ffd94b3fe05c4b90b3e789bda2c6134a77fcc0715814981b926969ef4cee9a31dd9d65803f022c707a230b88cafc0a527f044c69ad701433241d260d0e6da56a8313742352f90d13e0c9f0cb7b34903a1c92d92ef868dc67e522ce6fafed55e3b4d46427c3e75f48b982fc7487eec3990304630126800f050ebc6bf5065399e16068b0dcf265034286f1978625c0003d0d9ac7e147350af756091740823068e74bd871bb36dfca85bb6bd313300f7e6025d131bfb3f415fcdde0f17f0a50a419c645414c51dac69884a4c0287f65d436fb265cab70c0809924ca924df59ce7238aca4b55a43b01b4e0461893f5763b2eca5de751a29fb4e21395f2f2485e35b4f69d897eaa080a64e296b871c32b03e7a6ca0a1b6bf52263537462d789197fd25cf97c9ccab9a6437deb1d48980949428dc1838302aae65798c8e0ee8f35e9e61bc4520cf6269a7030542798fe000000000000000023ac240100000000a2d474a5f46b680a295cd17ff9fd63abfbe73afa50229583b52011d814b4731f818c1823023dfa7b8d8e9bf51f9a15ce45ea1ee079b7e30e379905e510ac65a915dd7219671006ad023c0800d51af53624a6890d6199ebb841c449ae21ca8c2500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029b3849dc68eee0d3970c6d90f6f84fb0d01acc8485db63637b68e521580e2e0bd142ba5314d1e09af6f1fd826ca8076b6e8d977f643106c72ef6619a33bc3e03e4d062f68c8c3ec940287e4c6b82addfad64baf9e7ba3d2756839354628f8f2fd469336ea7c5fe03c1510b88a07922ad89ec911ad8b2bf41d510709e023bf0030a8bd6976483cd627040f2812e320e2d4b269472c0ee0fdb7de3cc40233c15760330228af3b138cb33d2e892d8a598d67f9f44d062317920be3c67e7fe18a7bea50a0535f2d44a998b128a83295d75890d9523efae82aaf666eab7a04a2c8b746bb3eec1acbe7778f248121a1441fcd3731054f29949369868296f57e36c6bd12ba5031770d0d2fae9ac3698c0c4cab91ca308b947c673392564b25eff367e64ea3a950316f153728a6411426df1a6f3a3d005853ef3ff072cd1922cf86137cb6d5dbf2c030a8a768ecbcb3ad075ccd43e5f30240b2f9f75fc94271cd7ce779455957d3e270222ea484b03633c0109f1e8f87da90a0d4d0ed4bab4dae070e5b8d981552cb836020c07f4fb5deae30412242bf482685d7294aadde644445aa3937f9ea20898301c1ce3f0d7b82541b0f01aed2cd808dff9cf245e88b80f50d4f3ae2dcf91b0bea052427ea589dc43ecfbc5f4b91abd6e51387906bf259aa2ec08e9b8b37a3cee91405ae27a1c3558e26af5d8b1f872d90a4d42ff231d390a5864bedff78c275d34da9f119b5d14f70b92d42d8b5f37c2a80ecb28780b95e77611f902b085c561523316d8d7c4b4b918a18eca0476ea12ea5a8ece27efcb17995a97d62155b5cc77135a8e05310de850b6ea885ec29d0bc8885fdfe11bd9215d33675618ee88c7130fc6d67612c3f3a03853022e4493ce85f811451b7f0d31eb9a1c7e89dae19c898e27ea2c760ce07ef73890744915d30c932bd9dbc6f6720b31d9b6b48f1fa4010e1d15f1972401ab220ce4cfa5635051fa54e25aaddf90e35731026c13c6a6448824423f2e0b251c8e1e5a083bfc5648bfcdaf4d13356fb9729cd42c1b2fb37d783f03cb978f3ec17b34ac1fd9114766de9522dbf36df2b0f9f2927144160f1c39e8b8cb40979919af0fef957a89c22c60878fe95ac6820c32fcbd07b39f846ab9f36afb09830186242aed1b594e9eec61c2e2a46bdda6d6d53eefe49a4cf25959e0ad4a072bd7ced49e68726f08443749b61022d2d418bfa17ba1a89c8b62b49c41edddf397eb090676aec3c05e5c37e32323b8b574d8d65dd926b7fd445bab235d8751cd57d03eb650ee2b04ab7af15055a4175ff77154cf4511bae07cfbd6c873c443a7bec5137c569f7fec77e0a2bc037ae7d7d60a8b1eb3036945e420be9b545f1f829ff7dcd9c7d1f629d615849f3b8626fe6459ed7f29098cd3ff46af3a642e2d43f002eeb53f0d8ac28e3e00ce307c149b178b83eb2d47473445f9e31c49395722007b8fb1d92003dfad360b78f3bc24a1db95fea222bf5f4b21d94d75e7e67760856bb6489f4943ec7354e0c0f50a85cd9727c80d389b51eaf18b49a118e9cc566e0c0d7303a4c90bb112b1ff9c8c899535cd2e4a1d9329b77dfed05f36af3f1f1a943487883e1633e939dc9b26f1cec2647015a736c2afa8d87ec5b1b307f5face404f437837a471e37d560fa0bd79c2233a6a9849728cfbeffc47736cf0491d62b4b0b65284827d260e8a8060b898e6f96c390c1acf1f27cf5819bd1e9b6788005c88261ba30df0f6ba4116ae3ba2a4e4491c6120ef600856713cd65b40d9d9c5f2b7e1b82759a94756f796a2da05b35b86a9762fc07de90201b1ed6b8a79b5e2d08a6c8b3a6cc0ce5a8c2871d5c9b21892904df3b7c6cc158bf590f3b126c1d9be7d279878bf078071115383cdd4a947dbae71742d1622f670477fe32e0f55fe1a60f71bddec7905e263136a88989334e087bdcd473e803f21f4d0fe96c83b770ef5b8d0cc2aefc1199dc90eb5305fd753d403803a128e502e71584f3ae5ee611a234fb3b8a1023b384dfaf6abc1d0ec95489209b500521efe4eb073f6b992e3bdc500933a3434f014b7d1a4541a80764d1255ec34a0553b3cb7c033e18afe5a615a90af53292677bb2e789ace182dbb429bf30ecd045eb04753aadb9b3d981ed443cee634cb3cd14599f62b92a8ab32dd9f79ff3995c04669cdf8c2783e1289c42a7562ca898697e1252143131df030b94baf99821a3d9fc0ef5b7af453da94e1d490d1d06b0685afaa3dd2e7d0c975ed85f937f2819102520290d8e9308352d40e2a93407773bc40a0dcca27b16eb5e0687ace46b3f62b5b5cc0a167ca92c68808a8a708e8f5868f52556ef3af285a67ab943b89922a95b9fa55d0a11a08f2551878453c286c76d4bac3920a941d2525c9aeee939be5f0e9e9c071d87f32f45641d5ee0f0fad885991e20a", "53510065636a656a", 0, -862881980, "a6ff71aadfdf381b53f275af4834a527744094a8b4561bc99ee24820009d8dfc"], + ["2c3f1f15036c61c0791a6e91e00ff4622d0afd7902423caa77d8158fb8cf71381e392628dd020000000100a9173e6d50e9c0786b76985fc45b464549fbb70144c536d4e3599f3ed985b8277171bd150000000004ac6565acffffffffeaf7804b402d3ca8fa7a9ae655f144310d6286c3609ab33e163c71c9553e22d40000000004acac6a65dc0c2d24027130fb02000000000452635253f3b0980500000000040052ac6385ce1777030000000000000000dc7845050000000078b4a9fbae2df458b1c87c576e42e89f8c17a9500ed631a955f2bfeb4be06a7c04897f0419c429192dcafd97f413f3a8f3e1c2b1e90b126e4472ec34260359fc0402b06f4e1efa213f6a0ef92d65fa06f2225538cc1987db6d0bad369dadea670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d0a4c05c12224948927d9481f0a047a2109fe14d34c062b36a450dc85ab54eb3145595d71e844d70a9721ca0ccaab72f3f513acda35892ae1af76d829c2c92047cb2fcb45a00d9a03ef92320bb475a2dd50f90d68e3cc04fa0213139b73490938f8c328132744ee886925370c7b8c68ebfed5c4b6a6fa42b5c7e5c825eaf3602288bfff19102beac144e68df2e2d5ecec225d290261f601d33ed99fdadb9f96c030423bf05ff6fad781972746a835570c092400bf34e3c49804f3964aac269b0580b0913ccfb194785d1803767e6d0f3b5ca2438c2d3565da8ac6e04e085f91d33ec920367fbd45677c7e54e5f56f06379de09354d4782e0df88cd3b5391a9e5d8e10213343af7aed1220430c373b672be0ef2978b49466cc42b5a8a5cec63f15eac0b021416689b422b41316ebc13f558d6ee17dbdfa8ffd4be967666c20cc1260aa229031e4d69e0c3d21794de2f74987e69e83d65521381e07a7fa3b414e0fcac5a79590300836186b88723f7893b0178e61a75085965e87554906ffa27020bd124b9e03b0210ba2ab21f59d3708205a765b2c2cb0dcde7d2d5d1d69c45322617f5a0bab80bfee84e774e882a94ade6d1743256e164b8bd09fc430b607dc5a0cc49e90bb1f0a86a1f0859b5f7504df8edad45c3c8fe9bac1a5c15765cab600ec484a25642bf247e1ffdc083130c310c93d1c96d448cddfed6cf19345da7c90c7ab8ecdbc52282a004d4ddcdcc65a0b33e511b11e1bcf7e48fc150530963759d6a16fdb4dc61e59b6b8e9d2872190ed95b5e275bb5bc50ac101adaaf7565ab0b7cc19bf46289f7ef57a30db90e045f4b743a5503e725863ec929829bc573b68f6ced55ecc73adc412df2a4858a818aa657f2e4371eec88b86245011a4ab8514ec620b89767f61de7d7fd5f142d1b8429f9815ec6c76f4e30d237210e02565c8e25409944d669f96aff93f5ba1a03dad2410567a8d449ffb94c85ca65dcc2e8e0c2ae22b85f7d3b2ee6f6901f897f862571c7cf167859f525f26c66b2b78297ea9c19f2bbf8f826a83bf3c9bb8786bbf6528d34d05cad0a7dbae8a759913ab274988330013be2bb9bade108da263f2c804b6b3e99a105824d700a189b9afceccb8340f7e8cda920e2db1d735ea0eb56e04c16df4fecb43de05019079d4f7517f29ed5d274e8f907216bf77dd01afe79df366baf1a2afb9987e4c71373f7db206d2c580748ff43cd7f2cbd3b571aaf1838ea72ecce6b893a01efed91e3fe0d8d36bd40f9a3bf6c29940aae9b0624fd80930c7443cf6d0fce3cdb6f0258d980e4c025b8f92542021c48936d2887f79fb2665296ec378e0cde139041fac81365cbb82e5a2db13243f8f3eeaeee5eb5a794f6bbe119bf283015904f07a8f3e1f7fa2b353d458f6152e0f34b964911aded7c5c0abfd9eb60ee00600ea4fb4ad42591d9618a7311e6725b9143d3aa244f7393bfa6eb7125cf2b14b55d32d9e5a11981412ad3295d83d17f2e8a05a65bd111024721f325f5a3cdc93a27b1743cb73921d5f815ff8cb89dfb2d6286f4e2a261d684c4638fe7d8ca074d1cdad578924a7ddd0ae1268ad19586eab1e5b2fc593a68dda3e52cb5cf650a7488110cdf63286f59cd60be9677b90da5af4d591caad4a8b1a4a54e2d25e277c28c0098ea55d9a45155b228e0a00991aad56917688b400d45568360f792ee811c2dbcb2542c7a99e7ff72914a694839dd37245c6f8067160abe612e0e77335120e993dd5496fbaa4a19a22d55658c40c8ec289316717ea03833a61e4f6455403fab99c64fa786b78df0ad26c9f9b66eb317517f33327122573158b60f1bd74a9ec979ffaf8cd192a543b3ba6bab2dd19f861b5fe2a6732f4b149f2a2b1267bbcb6635a98537beb23044fe8ac0545c2ee44c81e1711aeda595792eb3f1251c169dd2974905bcc119d62a92353c22e346a3ef49ad93f54ab0e0bfa083d4c4349c7be1923dbcb7806797a1f2b5fb7d4b9ceeac8772a070cf2b40cd885006cf15529ad7d61927bb4482a3dcfbb144d42c505c4deda5ba50eebc46a6e5b9e381130a4e8e33d21d6d5cb4509a5efb439d5f396a95c7a3b1a76d2c1bd8c5fb82d63b3e77adec688c5cbb0b6eb5302394e17d8f25c8a47859df30cefd15530a397f80a00f9a06e111746d7a6d384f41c22f7ca2e6b65df9bccc39317fe0f9350040e8441a30d0431a5df8a8037138d1d23112db36f73c55853e9213ce28395cd223b24535498eef5b3a491bc0a7e9aa2687a4e71520aea1a5222e513d64c841231e5f1fd1b182cb0300000000000000000000000034a9f42f954dd131834a7b11293c8a95b5ea011ea3c5bd7061dede58e813f4b9ae6b913da7ba7b357416ce490a50d0e8e8a30312ad227c21e7a8dab2f5a362eb2ef0ad56ce0957e1288c330cd013913bc86e847dff87867ea1e30e8cadf3eeb800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8922dc51113bf08ea48a40681b713818af40cff45177182c42499d9c792905b21eb793aa4e29e96062218011064424e92c98af386cd2cf9cec1f5dfd411f2e68eb1055281a3a9223d1b006170d6914f5a98c26558a09a7875be607c5be9d8ae24878f99326afb619f620047ebb7d2af6cabedebbe30cda76b788be1d309d76702058743b0818674cd7dacabea792140c10aba48586f2ae999b7199e56b3e7c08d0304c5ebfcb91cd210022adf6f7f3af9b67479eca46fbedb298d87fbf6517908d80a07f1493b0e3c91b8dc72570f0cbb277defc184fac9d58db536b0b49429fae45d6a1a120a7e2b016af7c2bfad4c4335feab06c62537774bd451cacbf38b75b3e5020eb3773452f2a2044328c3031fec85115ac15a9c0af0d0f0b668182531e5859f030812c121da8f7f6cc12522d69433724bd549e02df2098401a3b32053d27daf7a030dd314839367c8d7af55ed7b81c37bfb3cf3558f4cde46b1154f8b421e61b0e003117ebbd5f9d010ec5e6399fa32789f9795453db895097a8d97df2ff7399531bb0323231368739493c2c1a4bd3bce3650953ad00946b20066d5f67741620aa4a2ab05fe161193e915baf2a43c52d5807eb59248c12b47f9b3501756697cfe1272c184d54fe78cb9b1b1b584d1f9d803e28e5fbea71ed7e8d96fb1fb42a0255470f5e4dd9c91274976a2cd091118539b688031be771e66525bac07627c9b9ee5071fffb4d7e99273fabb94462369b2772d2361906ce97471b3f403f901591a67a2ca8033cc0dcb28fa97478ab1b6cd51dfe4636e3b50d23f15802e677054b7c72d74cd855ef2b7aa5821824b3fbacee8fe3777f630befdab09b036cabcadabb271accbdbeca718dfec07cb86773c449a858aeed6f74ba112e1724a9ffe9519000c12d7da2647b732e8c391c232977900ff4ad84e1ec84455bc05d3d0e7183cb48915d39036abdbd7e2014eee88e87bd16b30365227aab2f5c04b4473a01660cf1d508358a23a9487fa0d8265e210974c6f7ce33796bd796d943777e521e9d10c743093e6190024596a9333e823084153ec9e76465830f03618d384ccd4bcfdb1e9006286a8f398fa5d90cdee4b44fbd5dbcb600dba29f6567cde25299ddc0ff67ab497f27d64c35d1ce4dcef980670bd5e95ed61d5364036f551b892cc3a162a51a330496cdfd2d6d708730789234655a49001d8e973689852edd37b92d2ea3f67767f4a15ff392fe03c5e6086887dde0a84f40eadab4078a76cf1c0641d13b11f5f4cf93889187fe563379e5c0db8da8b42ba9e866971ca9028600a7bbf0436abf494f52d201eab323e63b306aac8edc97ae3f02c08387d51cc9488553ed90c4a5a63b12e72101183a5fb375dc116a96be4fc469ea57f856c3f11a21c5ce0c0dfe34761f3ef126aaa68a22e9f09ea799e9ba98164191c8443a303b52fcd341f35ff76de0a9445ac4c1dbbf5dc3bd3c311e92e8660bd583ccf5ef586fd46d362b75ae6e6f4420772eedd83580b5cdad1732435cfe8f75cfb06f72666c014828d235b7c352d107afd0cb802091334542a8acb7ea104f6af467d5ed43942dc1275bb7897a5849ed2e43eed1bc47acc1609cf742fd9a67b3b981a6218ec0932b1ee8eebdac9af101c88c80f022b6543e453917741f9a55c07fa475d8990b3dbfddd4611104d8f1d32992816c2bb21270438d03415457b52bd7c6badf9c1f6f7596697d2837f1f4b1c98e35d6367d98b616fce8f99c1fece4e6302ac107d2f05814597bbd45229c9864de2a1129949be3657b9b6f9cb4bf2ffc68292d9e63678e9154e211b0613750566da557f40baf210f8a6d6193d406cabb67fac7b46ed574923cb2e39481e10687528ad4f31ac4aac36365d02f535a2a42c7048a59a03cae4fc125576c0bedbb1c23ff91c7f1e3ebe2f29f106a18f3939243b5644c52c81e35b5115e1eae4bee7b265347d79f83efcfac924bf8ea0c3fabb53d8c9290db3d282e0e263ef182e7955cc68fb0328f713a6dd7271ddd08994f92fa711d27f80d95c69661afd6ef00cf41e4c95bcee1916164b8a9b3f5e51eb4248f88d33d8b1bece8db9608bebaea4adf498dcf167ff87cb2eaefa4d27619804b9106ac70055ff216b2ba952a64e1c7a8bf43f08e087d035540fa3592c15a04b393f24f2eebc1be9bc4f87d7d2ad7d65b4d9899fadcdfd924a01d32fd4e5b7b654c4fee29adfa6c63be5e1058ad5003f561e3322208cd4731f3e026c603be5a86785dd4ceabd9fb2121e58d9ea9ed37ac06845ed21a7c91265f0aaaaa52bd5030000000000000000000000006dfd899c871a8bd7115cea8e761161dc5bd132a89be15173979c3c06a5321e9829e0af89e7ffe70ebaf8c776f0e0c92d11f860bdaf07986180273022cca9ddb14fa0f9fe4301ee544a4797ce34063f3c7b992c3f8b7bbd867be69e6f7fb293bc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000957383d1147b61962ab6b6bff1606cb80ca9f9511a391fe31946d7378ff2e00bccc469cd06d586c9d7a21f36e8674ec205edc7b1442cabaa995088f36899c4243a1c8f8c02a9d896c8a840bad00d879e479c45bda52456a308a8b35c86ff1aaf372f56a5cb34a704188fd7dcac0d271a70593dac91b08c9a6c79123a0c6e37da02293cc90b40a49484a87111af31530808f9c99142f7663a09c6c55f1a127e267802222e68ba4f5052a63f12af5919637736c153bfacf6f3b0fcdf35c0a59a271f770a061398bb4b0ef6d07382dbe738730d4615244edb1b6d3ce927acb31c766143c6270ea571ab3cbc2bf72c612eb07e791e6decb1fc9c6a5eda0af01ac721fabd930317637a323999c360ba178dae31fae627bb8c3e84895684dda9a99ddd615b6bfb0306bf3ec2f39c2b945b0d8ef59c3d34cb480aa51d57628097637a8a5f045a2ccd021e96374a3403d58ca334cee992f9e74dd82ed93c74e2e4472364feaab2c6d642030532cb6ca0041d96f59869d6198ee09675daeaf50386d9fe5100a226a2966080032fa6db898d0e52dd3cd5b14fc2741f09ef482850a74a5dd7d6f19fd0f6e74272454851085d490bb80d48f1acea576cd1b8902169c515c3772dd3a2cb1bf5a9eb8f7793f1d908b0050a7cdd642f714830eda286c845b685d9367fb3eb8768fb7898ed10a70d2686c103a3e9d65564b0bb8573ab3644e27c486399367c49b6c133f11daf11eb2566aa2b6b48a7fc8629729a9b6a757b8fea9c47b51425f38eea6a72d3d3c94da343debe450a536ef78381207f356a95212dcaceeab14b0600d954f46ef6dcd97ec30b865df2cdf97b9ccd94e3edbf1acf8882f9daec2bdb43b86d8efe628856b3da0b588184d6a6471536148a8403629e90b537b7fba85952240aa60c1496524183b1263b1722398441b363278e8067f49fc0789d4b2a619abbe83f78317bc4da38de19abca7196a6e0d2870eadc3d7d3e4f64e40deefc82e5abce9b34fa06dc2b899859d102278b875fa0eb9d13e589eff5ba370fe695a06d26b31381944b5fa8fa35228698a8d99f8f1ca1f39faba2aac50f8cf40560c4d2e4c50a28cb9e1b4c2e789bd1990b0f7893ab66ff26b141e670096d7ef02e80e519a71404c6bea9c6a3dcd4d27ffb5c47903014e21fefdf5edb04f0d55cd6345f73008a8409d6caeb6630ad38a9aaf1e3df656b7eb04811bdf349efeb465fb019272572807728fde9baa7cb70d3fb47dfa4e04df1e01faae9c31cd6b5da79649615cd8be87a2ade10ad194dc814a4b107d17a5d41129d0838ec4bbe9a731f5b87835a50ce2065e03f555c707bfa00eafb8c183e8b86ad84c07b88d176e92fc1b6862018e0d4d804cf056864669ad00eed47a16f379e09ab89dbbdef8384ef84d3c26f33d1cc168700a4da99a2e1cbbe8644489caabf6a4be2951c1241257a893daa253fd8b81b5b8b9c266a5af81775f37eb1d8e8e5ac0ee6ff2b458ceb59d5ace8918157fc0477e1631c8b0ecfd13ec2d0c177b629758975a5b1ae13c4b32b166397376f0932557b0257fab3f4d9ac1450d85c7e5dff74d9aa4656644f1d7fe86c91f851dcdba31f4ca46c770ea0aaf4a3519ae36cd5cccb575938709825a1ebd8d1d66221d4ce750b3688e10bd9d2e3dfeecc6725bc5e06c657709a6c84777a0fac6369e9dbcba5c68ebd3d1843ea3a18ee9e30edd59159a4f2debd2d723ddeafd6bbbd6c1112e93e868e4fd0befc352a1e58fc9802efbd41c25bd82a54147b8912843ec07a7f6a3ddcd134bd73fa863735f36c822a429a63d562f8e31f86a8fbf5eea4a145e0f680053ea7b41f50afa4bfa31b37ca966e72081d3ace7a514cf6cca05a945a9296cb77fb484e9f4f4c0f5d55d44861b37ec7607f44fde8d3b9977d9e774c8340b969ce793b361befc5dd03478edd65b1b08ed14ee7632f356550f2b4353a4d86780adb071fd44d548938a9b728b3cc6e0af50bbbddb8dea3d59728a34d40ec69a4b472cf6af317411c0cd6038e2748f5c306a1c1961e5d47168a82981e2ad392e81d59f81ac41e5c95ce4b5cf7d9de94e9b7ed43ae14211e68a721563e7b0c8ed6b2726e832d8ae26eda443ba84b258d7bfff1bfe8ba0338ebc0c177e9752401adb59d33702e4bfc6d703d56669ed86ce4c50413a7d635d549f0cc25308ba100c770bedbae1c30f94425bd9b1336d0be26899b27ede87d61d001966c8a30ba8cdaa5cb7b35d04ce62751bc1a16985b11f5dc079de07168e79e41bd6f255b10dcded6fadd66f36f053209c933aba47b17da11a3fe998e11c372344705699711a0d31eca4940f013d7dd8bdd5ab17dfec378621d301219b34a817e3863479befdee5da38f67260b688f92a1339550245fdc682976c2c06f7423de88a571e6e0a6c761fee66c387da0547cadca09", "0065536a65", 1, 1081782396, "d9d43207c1b7796cbd7b5d32612a3ea770a7ec31f38c34294699a448713cf43c"], + ["030000807082c40302e227e492a98eb1ee758bf5d09a38cedea29c9c6db0935169132b849375c90e930000000000ffffffffd3c73d759b9d81d015fe2e542484ebf033217daf98e8a66d0fbc9e44adce01100300000002536307e650df04c4d592050000000002515221795b0100000000085165656365536351df04cd0200000000045300636556e3290200000000004a4cabe900000000013cf8ca0000000000000000000000000094944f6bfaedfc18671e5e3071d263ab655d8087da4c2ae9c6f26261018772b6e38bf55faf757a868e2d321f5eabdc887d0693e7415bf8a80e4db5c8ea56f9ab29bdd51ce957158298d3294b927eb006f9cfbaa4ce23ce2eb5805d64c34e636d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009fd5ebd7c7c951a07f2c026a31a5e17c19c17a0d3769715302538247f38a9f7af7ed70f0d99faf85c424ee91bd3d12bc693f4e5ffa8df6dc76fc5c385a9daf87bda6a3d328bea0af0ca8d763ffcdc00c5ac92517f643601c8e5528afa07685f695175752ddbcbda4119f53b80451d94858828421f11a1e316618c46b9e63818d022deac08b1fada04034c139d609862867d9f08de823b758ddfe010862e6c5c06e0300d602786b563958941d88c0a1ba84c5ec6e1cd0457a7adb953c7695ac300cc20b01691a261f9d9a7cce16054da215cff2941164345a81ee804425ab9df10a937c57ecea1bb70d23e85a991d7a8b33e016ac0754e276514133704f489dfde4221503197a1d04919d603237e7ba26341ad8ea1ec4b4d5ebd7412844fb1fea598339c6032a7337269ad5a75ca87dee309747eb82648741310af442bef93c4743c2789685031747a195d0a522f9e2174739cd60bdc3ec3c818c1822485c8491befc52a078d90210062eb57ade0182c37870d815bbeb08355da7d82d6301b4bc0fe40c956e3969030994bcb392cbc53670d7fe89cb1a621bd883bcfba6a18a89629fc7c8ee320efcafa7329ac5fe8fa84173c859275166a84643801d34885c01bbe2539daa7e90b8ab819d1ddf92c32125a19f18aee025620d31d1cc549f4144816babe45d9a1543e49fae8c85aa14978e1bf5be575f5c727cfd810ea356aaaf3e7bcb62f417e480cfbecf07bccb97626fbacb1f1e9a47197586296da2c6d72ae21a9eb63966661ee4c30576ae6db83ff3afac5d8803246a28c3466be123cc33dd6a8c3990bc80fb124a3d08f1460ad1af3ae5a6fd6da924f8995b84b4ad4f46df00f76b5476b12967e4fd25fa3b87e5ba030aff248a7d353a25a3f27bcf3fbefd3fafca55f53192d84a54b572f47186316a8e7f99fb71c4024620629d716a412a2ac7f9b00266c3c9ddd101bcd7a275b09ac4ea837dc4a96e293214681a48e14b7f5d01263771ccf7075dea93da07dd3c29365b4c74a5690348c1f5e2e9babdf22857e9041b99764198111900ec0215539fc9c60d6cd144391c4358e70ad0e797288ebe221b8785463ce486e10ff06fe949151936c3d0164a612c52046b56c4702a361239e4821ecce66ec2643257e3e7ad79d81657429db386f6234b824f04a5bbc875057e8ba26660d0e72eacaefb1de44695ea2844c7e45b0e5d5173c257e745b91d6dc1d53c0589ef417189a0b2969baf0f6ef67c3a05035ffb50296539ccb0c59ee57c00e9a5796b553619539adfb228e540fe4343acdcdb47573bd16743b29fd0b8b0b06e8417bda168aa539244b401c6e63290d70add6169aa10acad307b904515c9f2db0a7c4300ec26d696e2102b7719d634caaf51ab3d8d068e03e2869eb618d3c692f495b32602af5fb4c64cf18e42eed8faa6a6e3dabaab3f32979372da2ab51c9d2c6bf85d803f1ee1d59ed676ec72afc76efc62c698d58d8cbb2fc174946a327148a7f2abb97f379746cb51ac82b490059302a2af86c3e953ce083a745257ac9ee0556dc89ce5e26809d41d53bf70a16c79f7f956417bf4984562565e040f729f26ba592e254e1badb09074e6c57949bc14437bb8e44ec2925214167008c37cddcc48a0ab6a0402a9ea5c26a101887336e556c91399a994ffe2159428086650702c72b3bf44877c4f1aee562303100e36e3a2105ec38bd3dcc6e58614ca731c666de480e62af0ea94385c532bad3aa08258d6171d814192cd32bc2d1083fed7dbeaf6519aef9a8465f9802539ed2cf2f6dae9fb3f48ff87c13c2bab5ddef52c1d476e5650d9acacfdb83891d8435db88308e3b8f6f5909dad298224349e4796cc3d0b33ee3cf1f23f58f9207a329877614c3e881888bc622e468e64884d744a405ce5c86bec625a4ee7216ac62342551302124f432f119bf37a567fbbf62cbeb79f6cbf7639464ed3c28fb1dd90bbff9e33e2a3a0329e8b7050a4d8ad5dfa98d2883ee82004cb754202893bd3a7d95b93882ce2c7a3621e8439372b73f15b592722fb1bab60fba538ee88ff027e661f2ca946a74d78bc9f628de769df40883bef9a1ffd4bce50ee5c051e846ee729335ef6cf7c471b7af08bdff201f065cd7f1bef5ec676cd42c87f2e7cad05985bf529fd42dc13b49adcde6467c1ec35705c51c02238a5dca6d7f8d59255c26c34aa6384d8b226fc662648a61a8f3db964ead0add234f5ab84dbfdf26df4294e1a3457795e2824efe6a0e0c50b7e7c378b369baa7c758e8846caec8f3bb16702da6a558337c52ea0891a853cfd4e43b1308826abdfc74aec6b4f5a2b4b0a84ff5b8bc9229abce47f4cf2f0e34bb3c84fef83d77f9619a76dbd2ea5b606b379f579aef1dc9683a69133abf2225b25949286bbd01cbf3f0f78d53b212841fb2c70eb43ab7d00", "650053525363", 1, -67580916, "f2f7fc02447cacfd94d121494b1e7d35a61df4bbebd7925c365941f7b8445962"], + ["2d41733502caa7ca925ba8981e3ee9e45fed3d9e2d32d2ff7f7f3403b740418330e6facac4030000000665ac006353526dd93ac771636e6225bf8fe1ca9241e1ec0cf36f34853e9a7de88357cf1f44a9a421dddf01000000025300ffffffff0279657505000000000565536a0065fed75e0000000000066a6553526300c98cd6e202919e4a03000000000000000000000000082b27cb48181dbbb191724891fe4346bd29b20cb4e8e5030a66a7bbf980dec24eb281783d863d957bcd8ac88fd90c2ddab6efd07b11fb9afde897b07ff25114df121f8acaf2174ed120c551fc232c940bde330738db8363b2e6500ec9f005760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066025f49076cb1b371c7ff953ef83317279191c6494ad3f4f5e3a224a17ce549088d1690979a80fcd59d798cfc9fadf61ae38eab60bdf4eeed028ca2ee01c2579c6892e03cdc6a6c06db19dedfa5d27404bfb80d919961e49d5c2ada97301f0b639c076cc2380621d86bc5373587862dc178ddf0ee81f8f8df37b44037898f140207f007c7dba16eea4a2c7c7e443771f4285af0b5cab40a3475f7c6eadaaaecfa031125ecfc317cefbe2dd000ed01f51f3dbb5db246c1fff26bc0df63a647687d4c0b0793ae940c742d7686d739e75749552f06e2a69cffdd276b8c0f5ae89ad141d55db454f747abf4abf2b62bc575e920ba6e6307c4d0a3dfb2dca243e756ae7c19020a9054070cc3d39971c1ec651398fa65f766ba87e22f122d99b6709dafbda7260223f2c95b8d1c09ba4105aedfeef229fb52d45c52f7c9c58a35acb78538424e4e032f7c70bc0e388a9563240178d52e7ae61a961da47ad1eeaaf93bc74ee55f525d031ae16452e7e794e753876f18a9c092f511adb925bb655ba9f2f923ed513593bf032ae73e3e0f0d0659f5b4cd09454af71d6ef17bbf03952cf0072f5ee43cf055b9ba27bc25588b47a1bb4827a148aeea6919ba391649cdbba2fa771f3f137a101b4983193823634ad47e4737500b0f0cfffd1f94bb27673e012c9f603cf2f1ca39c70fde757a6c477d49149d0aeb2879435f19d8e922172e962daf244ef14cba4d323a43eef6fc26a3a5e4a4c9de4e6cdb375c58f8e40885fa9b5f1547bf4af9b4acd4dfbb980f560071bc43538d9a91026e849958058e56bd5970c2b2f80ee9295b0c34584ffdb169256e68ae7c20e2a36769a762b1b33febd7e5705bac5074e3e2768c2953ac08219d43e826fb3131d233ced7cccca8188ffc37b64a6a48c17e72e71614e061339f122f6a0b6ec9f9fc82ae757370ec4c56061f0df3f14bf721ceb79d70ffee2628f1a3689793adc1f1057277d198e4aef750ee61c31af160fee77ac129a3831c6e1d98cbf337ef133ea8633d1caeb8c1079ffb0f9babc1cd25674934f4773c622f375c69f7c17ae369cc645b6076833f0af2e407d34e7baa686e4b2e3fc898d712e4c0f4b0b0a5ff667c1b7108003859049d42a1be422ec49a4bfa5f35337d5f8928df77980211b12ca23b425fcb1ecc3cad316fa97cb0d6f328c7565bccefa1c9d3d01ab368da2b79a6baf582739c61a11b864391c11739c822c62afdb11bb86e5d477442165c42c6b8c09a8d29c1336a1a156c6d822a1e9a6658be941fc28beb6e65668b793830aa57e39ddd3f9e0942a272192f60c4a6f892daf4c52d19bee4bf48b4b212112db0d4cf4fa7b586700cf3c22f509ec9ff65e11c014a7df9373fc7e9928864433e22b33df70645af0246de314eb1fde9359b54291181f3c095f16afc13a91e114bf51b5ee87279a6d7a6a0f88747d61edd21f8ead6042049e7f0d719d522427caab79c38d66ac468376e3a460fb1c08001220098370f0703dfa6af10f19c66a1f51c30ae7e39901715f36954fbde1f921aed73738d061bb77a2775e2787ad09beac320aeae50573364607d070d2b19d882a655d59273041aa1635bea24ba7550c9e480c0b678d8c057568b14d9bddc2a65676ab2246ace576d3d02a0a42df51bde07af3785026fd641b0f7e78a0dc4fc55280bc8277b7e2671d9c50c1ae60d6aca61d712b264ba9b323ae66e3089a39eec49a1eba5a32625b90a4e4c4c061c040cc24b206c364afa1e0f4b0de881845d777e1413bf2152a5220d30943dc7fcbec5d0b30b4fddc599df20f8c24c2f7428698387532cc48ee028ec0e02236f6cf870066cbe6d8f9f104de4f53c97201609f838f1579f4c766d9257dca2696cf07437b16f7e6a2689e1e0b49516dc02cd141772f81fa9f55f2e73808db686016636d5afefb9a216ebe4c2948fd481d7e94d4cdeafa20b75f74897867aeec3f199e3180e40c45d2ad0b3f1497cabaf52e5c00bc57b1972f249893f927f1323ec2229b9c57ee8184797995bf5b171491845c8f3807714a0e94d0b2b3f35343de72e18df7f6432c174d206ca59176fbc1fd91f6c44ea953d40146392edd40a9aac872eb658c92858bb2823cfd91dd3889977d77ea3533c2b131b81aa5361de14f0e9b3b6cc11d3f931a908a5fdeea2b4edb4a6cad29bfa6a2efa478ca4840ac4b917c3767ca798b855faad3094b9eb7cc7a360ee10af9dbd4d78eec7a111608bdea2aae124969ba28df07c01f3ad8582a6a6a7ba9e259b5913b93dc660e89648a225d70486f7655d49a00100000000000000000000000086f520f42af30479fcd8366105bd4ec7f8a7d7d3ada898c6cdc4b690e6d84a7e2e025716d011a9a54ebb3e0c4d400ec68d49ad1d5bcfef3c1bb945c665b9dccdbf1b68e403e0b0f5f868774c9f3f9ce244d334a2fffa98f325d36f7ee2919c88000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003daf6bd13228bbb79f676e8045e15d869b1aed28bad1863d6993932ac952dfcbb39e8d2c6e01d4a26e3a696fc9945c45f17a98f05fafdb3cfee4640b876d8c9f26d74768b38ff52141183998a9e4de68f4b5b949c56c68a46987515a5564cdd357efbb31fe1c783f7b551ef921b41d98660c98616b4a3dbbdb1543bdc1a932df0209162456ba18f4f9d4627faf88d2d3f700f7e70f771940d608163edccd999cdd0211b6b38218e0a8e6425ace76afdbf30c1ada89a244e4ec6e5fd3cd95a63514040a08a42c40a660e60878a3f8eae678ec3df9669b0858616cc5f820afcccb79a8675c7f844f21b91caefaa9ec785e9a576ce7409048765a4ad445aaee51dfbe7e5e031fa6c25327841573f67b2a39fa2f3520b98c26b0699d8ef377f2fd7588e31f7602015aee4e61c36d46ad7a222c87f30733f818e96869fe153f252cd68c7ade5d740222086efac32bd9f2a7afa5f005eb9f49a2bed694e3d03edc1dba261fc0a1147002132e7406b81bae2f5685b8d0c98096fd6ee94cccbfa188d165f034cdb393e175020606411c5b8711497062b9315483b73908ab2dbfd61e45158b385203f7d5c07a0082302dcfa3cee4689b480b4b62b2d3522c185c6fa09cdc7a03023e3fb3dd1636365269d7b9c5a22c2cb0b2b32d41cde3645e9435c6ae8f3630f46701104c73e72cf37d4800d0cc3a040c0edb449d7798cba3d8f50f54a03790448f0257c8c6fd687a4b29b8ddd07b053918082a82940d850b3d9e513d2565b39b88aa8dbac73d7c0b495abb83d5330672a364276fd043a6ff92f4361cd1de77c295a219ecc9e3550c6198945388ba54578fbdb880c4f55e2397018eb710474cd412121342e3a9a471b829e9a38c4e58ee90eec5f5909f60801f374a4b8e9550d49fed90a52032053b48a955988baab8f528b14a237741718b20e10aeaef849b3fed90ab746c381797d54d9507b3aa030a529e3604724592a47ccb636eee890df80a4f0054a85d97542c986f5b2d994cb60070dba2aee8858335cdaafa26ca82cd15291201cf0a7a7d6e062f1d41752e91a2128ea2b63cc776ad989c42c041de2723b8e66dba1941a4b48e16f0153793ca39c5010fee412fe3fabd80558657865d42d7457e7d7d2648f252a4c958e0528678fe5642ece630c66f258bcf16093d9f5a356c8032a75dab764a2e9eb6b8a1718ced92d601489ab64b2135ea280049135dfbf74f4ee00d90295acc9e51900da3fbd651760062b062cf6026dcfbd5c2d9ff8a8afcd1f8bfef3bd27f520464602a6b4c244c9fae4dc4a6de639158d5326951e4868e549747520a6881e67ca073278449e0dbf9cb61f89c8a3a2afe4854798e8f312972161049347ab6cadc9b371b94ff106e260dad9e5eb85898938aa9448f2c4cce9bce344d4ca84540f329792dcc872e531f3e50d60cf4dd0c9a3f8fb7f00fe2f82829d006c58c71c66c1c61a0454f4846081595ea8a53e371b8aaa8e419a82791f5be0ce7c12b467dd8ea5e54c5736480fbd0157863266cef89eae1a2aec4fb5d1c8c61374f4cb26f3d25a790dd489b4f3885be2a06e63bb90b4fa53d34cb8c7288afe30d8a2c4dd1ae791ce5b63a9f372b9ec92ef5f6d6d6b4978d64893208ed43d116cb5cad1a402a939110a5dad542ac764d4f7b220985eb80057dae43b8e088ebfe59390389de2566080219b139ef9ad8e8e23e54698564be2c9c86230ac6133e00faab98cf923ffbc8047dabce2dfa6a1e3664c650bffe50a5f0d0880a80b0bde5fd934da020456b157e179e8fd6a7f96fe0dec48b7c7fe208896aaab7920745d6f508c9456daa50920bd90bd4f9df4c1b2d9e7ad4a275621393702dbe428ad77f6d903c848617a3f86253095f0eb72c0b753bc57d5897b45459d1186db6f662d1d9f04515b696a28f1afed8d9b1381e4284b54a6c89ba400a1b96c6e770672484739b6dde9e58ab367b7ae396b51981ea6f3868bf965fde90132c2ce16c4fe8452465567f0535ac92532ca2a8a891f5e87672dd6bb491b3282304c2141bf759196500cf020aecbfb467c62433ba63c08fd8a5083f9325976134731369953bc37e604373a63a884df51de1cdcedbd1ace9e630aab33e3ab2e29faf18d64f3bf2995823bd5ca0cb319dc5b8cb46e0fcec3e7ec29854a574f276e0418eead5599c128ce3e6b3fe65898b7b8d3da80dcdda4c7c7cd592136df93bbaa7494b26e95d38adfc70e4d9558222ad7c0fc11625b613ac9c59b941a18e4d4bd1f1e0e758a776f4182b42310488e708b7357032ea3af1802903b23763f7fbeeaa1a143f3b9fa7d6bfba5682f84b3a1ab3a2f08953dbc99685a1269537e9ff326bd812387a21d1fa5e7cab928541ed1d6b291ebaa633f10acfa33ba5f8d41a2cc59ce7d1d9f8f1861c85f326536c77c85d15edb0d8ec0b", "ac515163ac6a", 0, -558688080, "ccdbd7c021cbe480c5cda899747e321d10fcacce02dac643609cae281ea7dbdc"], + ["030000807082c4030145b3e2de268417d817ae0d94fe8bd70b3ceb6d44a65ca9c360a5a997b280cc700200000005ac00515365ec8dae3d01a1354e0100000000046a63006300000000123eadbb02f18d6f00000000000000000000000000dcc739ad2d434ced35510e3963c62bd7cdfe13a39ecd3307d9394f33e784b74f3c145a7548fb31d99eebf03eb7fcc52db40b58af3882d8e2e029808803f15bb53b85b0523c3ea2cbc27b8d36d1b4e174979df13bf0797f058de16809bc949ea800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e9407f0429809f0414a3b064e04ede68be00e70fc4a755763910e77fe99bf86b69fa0fb72be3c1431335c948e4948add98d728c241bbbb8463d1546e0c7e7b06a54e5ab4e714cf157d02a22a30075780165c4062f632d75fea043cc01daf288223afbe20d30d486ea6b6e1a2ea7a68e155e5d9eb90432a639cdb0ab1bdd7c5d60314730d2ef6649583401d843ce171e891650bbe21a80bc37bff735919bb83890902160b345feffee001df8b3a76c4072095ecc53a1979cd131c91f35976cb7980ea0a05656279f7e476020e037e1b7f68ccc0b12694eb9c566c221a38624a0d8cdc40b13f3d0afbb24b2d1b78bca290c111bda97e8e5e8c0f44106caf8f59eadc7a8503046e6b9935a357616088cb9afa6cfda52fa4b8c7ceaa59626f7ed292a3723eff0206e7cf7478e8cae5778432d336d652cfaf52b1cead6de5de31a4501d8ed80d5703217a6bd3486a08959c66d30df0cae6e0901c5e4f76fb4aa783796d291fa22a3e03257eff35f5dc50ca1b302989c8e0e00c3378fd8052cbc374c2916dde58372f7e030e11065672866404aa6411b744cb3b2f998064a20f41ef98c943514912fdfc04f18e22d45fb8e1509edeb3c8b23163c13b96e3d505022a74147ca6077968e3e0aa5c739aef3c102d6b5f90e2eccb855e4c6df3d00c8719c23a60dbae1ef29699fdb133a098fce3bfa8d839bf9fb798daa4288b678604132fcde9d9190f775b033428b00c0a1d686835f58bfb4a8dfeb6be65099b64c380cd93540ed9862fd2a93765d9b0a1c436dc87765c9b0de08f5e03511df41ab83a98dcc99188bbea2b0951f6a57d931dc9dbce7fac4f27e2d4e5d4e0bb07114a37da5b1280c2cde741316e4034ac14e9692bf32ca1db4023dbeb41e7b291193592ee1471f4e3f7af689fcbdde9c039d3c9cb8177f56aa75c9f0eaabdc95ca62a5bb1b22cdcbc7a7494b86f73d66303b2bb9f844d08068162d0ebf8eb9a4daf7d7f0d3f6fe5d184a2ea8c7a194208724e0ee5e7c059c918825f05f57ed47f5fe502f00a5f1a0b65d6af2a1b39ffcd5b609513f1dafe8162f306616b504b95cb9b425e2aaf0d63c7e3475267f3312d53205ea05024ade7f4cbdabcde0f97be7c4030bc6e89418e5ae55ef53c362be9a51a26bacb9654e3789bf0a5b8919e5a3d402a8dfac33f689dacd0a5ca0f4bdb99795e0916ad38adf7094a7331f99e0af9c8befd6d7c102b51fa8bb847e86868e6a1b25a0c5eba1ee7232ef3de987fac9537db88ab081b03dbf4176f2cec6b2ac91219d4914d8e4ce9f41a7c1334c15fba68f157084023444dfa87b73ada62010e621257365180ece816af17c2f9dd3c50c5842788e2a25b43c312cf43a4588e14bccbe3b4d25e086e4d43e67ea6344603f479415c76341cf01fbb92add0208f31791aa0c5e10fa9473871cc325912ea46ad1ca8c4077c3e092bb1314d41534f0ab7d8d030739fafd54a3cecebbed4d69301aff1359d756ed34a86f70f2b8ee4ad9994c93e3a6af383107a554876d07b696ed26b39fd0d83c0d00c914a7e285b2a425f56a74294e4e121c088ce814bcab421b5943afc9824b9f90283324a53481c044571273e2a246e08b74ef78bbfb1c5724a727cf26df0825031ca564993808416dade0e518fca98c834b4f89d3be856bc5711f1e72fbdefe14a56a5228f9bc3941f8a84d482f52af8a3e1c3037c47f5bf5e88df9a1651b6a26edaca0c3ce95cca2ea8b0f0494859304754323283d9fac288e6c03d9a41e06826ea37407beb7ee0b25de941507cb1d207a69a8e961bc242c9d8943f33e6f1f66d46bf075b253f4ef09f09e623644dabd97e3bd78b928cec5b4fcdb0787164820ed11125a6d0e041839da85bf305469d8640f5ffa80d9f009c3d0055ca955af04df0f76be041abda4d9fa8c3adc60334432cc370760764524fc086fe3cf2854a7ba823722854794a15929cb224ee9932791057c8092a589df44bb866ac1226f5d31c4ea6cfd07899a98007d9c2aed6d4a98360d06f77f1fd5350988e39e025255a070d5269b6279f6403d5ce53b438c65fd4f126407af77e9418c4771fb4c46e9726e0bd863d4d5582bd0f3b00d04122eeaaae036c7ed0ee8c3339c92abf3b5466e5e439dbee7ffb7109b5fdf0c28c293db4b02099a0d7f3c0176629ea3471d6859a6af4f16a38364fdafcb930b6adbfc8d87bc1c26c6538694f0375b9c135c7fe469ed5050401dca16bea5ce2f64dacbfc48fdc1cc8c39d48e6647456160be8849cd55357aa2625b8fa2c2d8973f7bb7186b1ac7a4fb30200000000000000000000000017c3f7606e64a71a3b9673cf6d9dec5520bb0688fd602ed297bdc9fc1c45a9066484aa62c799733d829a75a7513dfd636f3597ff4ef7d53015202c6d7ecac29297c9b220242b948e1ed81562e42b1ab3fb0bd5a024094b024de08680cca84c64000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b89a8f95b06b555a7625c63df07794d207541df46c08a70f25a94b2193aa85f9f3333c53ea62b518120f0e05683762e7f9a2605f4a5ed908318a4c99c1a535b119c3f0bbe47d5fbfaf6a2dd431b1a2ff43ea403357d318db0280ecc7f286ab7182598803697db52e8a5027c4bac2e1b70a48d3267dfa8ea5dc98934f83a8bc3020411cd18f0c152848f471d4cd2fa474a6df7930cd61c04844aed8a1965368f31032453a8b9152c330c647ce2a52d0119ac0ba98d37ed00b213da48ace7d81ebf030b03c191db2a5d3e432eea97602494c06243810e25ac823cc3cab9ce2c945b332872800704307c69c9f7a09e62be9321dcbd52089de89447510a2674e12b4c5e22020a2ce9690734f6fbbc897fbdb05eb14354ff7a4faffd8d6d4b2d37f8978ab5210229457e29467f765304bf6c4ca35b9c4daf0c7e91f15b1910bb3fa9ac83924b69021087333538922584ccf70b256d041d6fd08c7267b92c1b666c48dd5533575c9e02202db7ef2f792c758565d4e3183145d8cc78c460f362575ec78eeed67e670fed021823a06e4bf540fe26176c5aa0470192a56cd22602dd0ea694ba86713eb2478316f5ce872104d210f121b351677ddd3c49ddc395cc5f71345d35b414a807bc9dc1db77330a7152373d073bb59a676889c6bc5414ce183027fc2fe4d4a148e51312c5df37da619c5d01434f472bc20353453ab741719e3797c4cfa40e397762810f1c6595a1cc4bb69a7ac32107db30c15b85c94471d6cb4f6ef5c58d56de6a94773b60521175ecd0f75f08d992c1517b6609d706eccdf92fdcc997bb20185faa11b6f52fa6f9f6bf366412c30b9edcbdcef9eb1ef60f63e0497ce60576ed2087bff50de7c0442e70a7de2fd134b05ef0ea73ac30fa229b214bb006079a46b1e8a64b91073ca355007cc317ecbedc1fbb74cb5163afa97196b1db7824a03790196bfa56f8a17baa388463642c400004a186a717d6fcba71ad855426963ac72dad6809ad38f86af126979784a74bf8344a8fbace94be6b76801661f8a8c61a1ddec4cc8cf3f38034ef5a36f5bdfbf53e397b3c765901a664b9cd776e50ab2e9e6eca6d8a7de4840167923bbdd8dbc639739ac1d109ba44f04bedf57f00ce95b3c0e5a7b580245b311987cf288ff2541e9c31e7576e8e4c825b668586a142deaf970f90160ef3fb72ddf3068a07daa666ea8afd99e6b6016880e3e502b5bea3e2de2662e5d146bdb20e1de16d4912e1bacef63433ee5a8c561a4e3c4952b6367790012be6c3e15e23df7882b07468b2a2bf6eb3b565e85d14dd042164f67f4d366085a83446ac928efd1c113a06f5dca2ecfda08b4396f2547377e999977ccd91d21c8acfc5166090b08efa4f8eaafab3534b72755a50e94fbe8b16ca22f313d77008841e13ae1d136a4ec62336204a93664d591ca418ddd459dda8ae995fd5f262e0cfb1febfd7e19d0535da45f03f453a5df31fa80d6740eb43770003a1c3f6939638949f4cdf1c965ff6a7fc630c15515ad22787affb0ed50e3051b6ef7a6c176c05343b9c298611a69cfa2d60e3b5e185b726e1ab401db0715122fb788eafdb08adcf7007f6661b81b5c4b9c73d1907e73ee175877169d9739b0fc08a9911d0cb2aac45ad062b34269faeeeb443b6b7865e40a89eb2ad5e9c20b7f0ad0cdb60947566dee3a7e1b7e5d20d3203ecd1337b4fe027983b7fde376c57c07adb8d910d68246e0aa152a7a52dd630f35f987e22e2cd67022e93529d44814abbcf2ff43e95e66bf6a486198b35b71de7c647771e2a597842cdf67a3ed72d257c7e6f9d07717ec4285960fefc09a81ee11541629703edce75718a7498716b4a688c50a39324a376812c177b37617de764b0215d499b6aef5fab4ad61d887ca9e2effeb7353b25eaea6aca72081e9336ed0a159c445cc550bfc8a24b1951f9498c29559fbc74ca61cb9b94f95ce8684eb8a5471b746275c1beadc2820948e63096ae4067bd7a39a9021250bea082dbc4ce0c5c7b70b0f31df638695965e410f75fc946ad2de81cba9d4193dfd02da326bef57000fa0edbf9ec0bd4ef4ada3b0d42e3687e99b856016beeb12d6ec523f07e13e3a38c3e4db6ae4a526c0e92129a686904eccbc4b3922d008a1edbcf3d2498edf22287b62f05a1f6022b35aeee095f9e3eb72ff900461537c277da2dec03f95880904b906f7426268708e330d80f47ab3d4a46a630bc420e4459d1915cfcf3c04cad8a956c9a74890fac16d614bceb5742131b0fd779c1cab986fd65868d7192024d3e8aa4b1b69369812d25a8b2797b7f43e4c8cd69d3f6a070ff6ed20d194a87c9872aabe20a2eb1c2ade26258585021f0c683276ff1dcf8c3ba1c228da43c9e56844ba1962cda93371543105767909b7780ba09f320597f3d01e4844e5936fba72e01", "6500ac526aac656553", 0, -135270863, "7d4dcb038e201f9f3450f38f92d78f05805962ee75bb2c6c94d82fd56b6e8c35"], + ["030000807082c40302b93c29fd075fe1ef5d16f6b789d4e3a7b80fa6789db8ff3e101c8c57ba1caee10100000002ac6313a87603c1fc0f48c95041334b3c7ecc4bf17c0809bca82a9aa0d8d17d1426c4cce2f44e0200000000ffffffff04b949450500000000016aab83e1050000000000581145020000000000c1c2350100000000056563ac515221fa35f100000000030000000000000000993d740300000000ad1ea26285e344d9c9ab36445d5a439bf75f9dfb7b15845c29d54e0c1c0c2572730f52ed7a38dc85cdd2a75eab9152b35d9f48ad1f5849e6af6da293184d50c1b307e184b167374893ab4ad2d3928afe7dab93b23ee823f21e89f772d752c0eb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b6aaf5681f3c6c614606ada89b440340d067045a85b0a69d20f580efb5f429a90d327b2d71aa237621f86a0417ef2659fa8e23b00dd7f229ce93370b88a88ca89631715a0a36058f19041dd08017f16b6c311be7f939486b2840e7ff21b2edd4f882f6b9bc74e38d5c3795704910c98a5aa96664f78d70f1178f077e7acebe710320ba235e93587a4ff3e69d55f386528311198581941186215546050f727a7ae2022dc5b1cf3e69c021d401a1f06fc40a89729c6e5db357ebd6084df1718f6df34d0b04b2f978f3cd90d82bb89a1a40ae5926a5cae2af8e83ff10f88a58cfd6d5301af8fcfdaeaa7a4adbcc2cb6345049cf3b1ff9a4dd2dac99cd65dc956c48b173a2032ef442adcbbce3078a8220fde188cd20d0e570ee1f343227ae536a24f15c625a0216518a02940cee7ba8d9046499dc8960e18e1373cdf9cff51b394f55fb1ee80b031040ed77b23e3936820dbb5417324d6d187ec540dc73f24c16b13caee681e89402028b51cea9dfc81e87e5a1ba38beea88489a553815b96f7d1d69c9630fe7a53c022d61303fcff7911a601de9e86e2feedd72bbac45e948c2114fe4b799122b0af149369bae855534a282cf89db1b0827d95ee159b88cc25aae01df19037f56886b25b6732efdb9352ff9096459f7716b9825e097a5ae8f7ae2083300783646fbbef45302048c988a9e82de7da939426ced13a065abc24c4875657dadd3d7a1fe5b37c9129e71142b1bba28c570cd709e6d06a8a9417bbce73c8bee0f5e339ff00bdbb53351813d8b5d43b3837b8636b6f6e4f4f742d58417f7654bbae5bc93679c190b286d79a35c5b51bff64beb7b8611c1a0898fc7f3caa4822becda5e91baf5d64118d0be4d805147a6a9bb22a3e8e8c253b5975eba7d3cb64d33ddbd7c0f09bbd4213b1c30084f531a036b4e4c65a5472525184877b11cb25697eb692cb45cd207872273ccd12008eed213725170fa75ac19dd817db85a45e5098c0dcba8153de9ec5e990e7b388c3540aab1b92f40923f68d12e81853d180bc342a528591c16e86ca75c120b634ea4bdc0d51f5440ff4f2b38d38506ce8bf2e85638f9bf7f6c70da4c085d0a656fc038579c1efdfaf4ac4633408610d008e3dced0e9a6521a7181a02e9ba5f4f9ccfa3092d8cecb3c0f2d0ad95f1963a1a753fc3faf6b0ec824ac234fc97af4faa051d6e0f0232aaa48232d2821b9d524e15756e3dce498dc676a5d7d0c232d8571c4a27b9d2c093ec2c42aab32822a0a9d43782166e6e71534595e3b591a246126665a298f07d03f9101e407e4dc0e98efcb45c0d07acf8b2bb02edfa0942db77a74f3ba3903cebb18581c5c932932f75fa564e5c4505d93040258f3ff73c6183f7cbb5a12a27dbe27e3ea67246088e40a327f4ca45f499e5a87cd977ad9238a24f63c62e51b4c8b3f4c87b765f0212483f31d8bc6d9928fca7c38260d5a0bb2229be1422a51f0f2f98d7ca227801fa8b799003bbd2dba404457fbbbf76165df2c101800758dc2ae2a283eb4e743eb79ad183581af1eb0e9946951998522bf13b7fd253b9b580d726eadfc4205bf582f53b67b78d02e00ee76124768998160b9c29daa4362db1a37ee80e6c7cd8c16936d85c2b7a0b01439aac9f0cb8f6a11b4046023371c9ff1b313c298865c4da5e30233216a6b7a7095d8fb4751ce166cb35551a50d88f7c850d969901e18418460cb0220caee231f9216a4de218f9c513c73af75424e412d1bcfd6252caa25d2247c7f710a116e9f451df92a85a1303d3b95261f8f3ab1c4cc0b39269fb2d6808cdb008b852b59fb926c57289b2956e6339bc293ad4261f3f7baddeba4c94df1c92ac11ce03c68125f651c9251308ee7549631a8d759e912e862124816404df86077b53418f785c545f2b48bb7fe87d93da74d69802d001b99f51993e090460d95cc7c28cf92795c6db528ca4b38707889d3f8417f37798b95fe07206d3231171d60709fb3389427fd5e952b1435fdb862eca88c4dcf95e038acc177589b088717cfd96753d64ff4e0ab7c32f54a09b74ad2f6532d3477e4601b1ad80e211a94598596becd8cc5cb00603b49e3a5bd71406c414c084fdb7233c6721ea18aa94b8040105a32cb12c290f0e87f0a030ed0cd8d85509384c2e122cd5b3870cbe54c1a0c1f1f0c7e1b57b2aafccd9305de1f963244c03a89a26b434675e7bb6db072cecb09335a762c10eb272830c350d86636b27cbbe71da699f32c693220c299e0f56124d48cdc75fcf0b065222f4bc355125cce217085b1af261250000000000000000f087a60200000000dd33844fba233c307a483e29cf36f4ef62adb601a1268c0b97760caab69acd66926307c980d7538b3bc866312f7acd1c55a337ba14ced372838eec9157d57ecd629c45d7358b54a719fbf3d4e5a967aad0a3aafe2df665c41a785c2128f77abb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000067aec7838b8d8e3398b7ab56cfe912d66f5b90b924161251ed83750a6f230772923c1dd664f502a519eb8f06b116155a5a6c6ce6d59821d858568a42b2bc8e0817f37e4e4aba74047c9b6aa4d169b02a35273ce5becc95ac5da3147d161e020dd2ac8e61d1f36058298f6a5d72e0868ed22dfb4b052f603599469a63e9c34acb0218f9d52d6e2f659301c7cdfa5604d9247856c514f3a4c6953879d55d8d9030250212dd446aa0b46394e8d78660e6b36b8bcbeaf1c4c1522347a2b2ce851a3ae3940a0513b75f45c32188b2edf4adef606751c187a27bf32a856f1c0174a3174ffc65d9d6089342aaf899baa30d5fff610e852f97439af50fa3023e01ae3e11c8d18a030366e1411c93152c047c8a4eaa5319124af1a19df052ca0f402f4993f16a18a8030dd9fb1687625df2db13c9d3a22d980e374f4de2d43423d7e3d8974d6e8353c6020892315116db7a849f6104f69d29d7411fab866e85fcbcbfe85d41a49e5d2d2c0302adb076d1956fa6fb8ce667cbfc6d8b06987110c784110373a4b002a911f3f60228b27c2ed33fb29803b54f566e4855f6c7f3318aff735c420601f70062b7b997e9ff73945b0b3ffc67cd49a1b65f33d67b912fbcacc97a36f97a3e812f69c3f13a1e2e64d1b2de5dbd9475e097f2ba20481ef19fa643fa9107bf95f77596a44a3d22b95849349139a002a2f023c11696085dc4b6833da19fd47e3cf755d3763792d3d7300c5cafeebcb620a3c4e7395385384a8a7e3f7f087fd6a10e6c9227db59339f1b4f4c0b9155d397ec4b352b375c5b20a341cf56dd0813ac9fdac5805f8f80e16ca932c6dda748aba8ce307eca8a649a409746020dff687f0b00b585ba8b8844db1a79adcdbb28fc9fb9a545b087a187ef2e11c5624250282f4e23940c4f82e36b40ed63c2b033286f9ed79373c42c4e3b2f87393cf6acd35c515fefc50f690b14484b12d6e2daf215bf3ea84373116ab5a5fe64a2c3f26528421b4b7c5e957c794bb1435743ec67aab01c64eff9fa586c5b0acde92c01e7c8307852b49c4dc4632503d88e36b6380bcf816b803355d94999a68e77e742c0b1137cf257ba02ac87fcd0fc8cddd1b313f3775cf8e7c6375ebbdcb3dabd1b04d11344fc077e296e4c94e3b44d313fe506742746610445d8381fe01d4e8aaab1db85ad295cb243b9633e9087159db28257f3b20874bb632465123dec552aeb87f52d05faed33a8a67f53b7223cd04e1b6701e05d6fe756132d4d2145e9b82ed507bf22a37d8381935681be9cb0c8f5101ce6c5de0f8a2d1914dd734b09ff31ae65499c5f61c72d7ea5d9001cd17caeb3bbf57baf2ca6d1f69e0fdd28e1c5a046e779e1be954014f7560ae6a42682b439e4e45b68ab4901ac5dafc56c9da82955b83981009f5b06ba13070060dac47f2b03bba600fb805489269e27a39ad78d3003e617a71100aa39162e85eeda949c7fd45f8143ce952eaf96754089b62dfa53396d0fe5d3a6dad8d917e6bc51aaf62457441ebaaa53ce827b7a50b1e21a46d9fdfc9f0e85c8b47351ff48cc7726359e439c44eadffbb649c7e57f983204d72c121250c6831fd4b781921d0c992141e50e79004d8a821a2554df7704aca531f9ab12401496f51a081cd9cd9b34d19bd4ddfaef7c3525fab8affaea7b80f7eb2fe642e247a8192c8b689a19088b7ff730c49c490d8ad57507a838f143fd6ae76fa1503556c0a7904a33a6cbf880ca854a4dfaba13f26c3abc9a33a38ef81349c203bf50beb26cb70dc7375fad86b56d086977b6dc115426dae761ace69841afb1ef3b7977856b43b93ff3a617191520451d32b95371411c306ba00a550da36f4f0cae9b4295ca58f144f26a61dd89efd5e8c7e733f10c9f5ddb0d9b5c59fe52d79d9f15c1ce805d69adfea0de2ce832f1af8e2f90e019414623363b6e4e90350bdbbbac246550d091006dfa999a9af9c73e717a0779f9003f9559c0ab9e1fd94b76af37c073c286b7a3f435c1330d747bc5fa3276d0e48058c89a1e222106e4279d30af1bd0db9b6c39ee98649ae140cb526594baebc5d3440d747a9b6f32daa51a04a88d3c9c7f59e01efe9d639f3321354eb470d8800472a67778ea324fe773a3ef5d444758219618df461db29b20a0d89a47e788403b551142c25372761d4ee75d7aed47262f7f715f880b8138aa8fb5cebe7cda4d1523a2a1fbfbf1025481454fb5e276c809209a6144265d44fef1204c761fd7d4d521e84bf9bccf6387c4e2964df15c29ccdbd59fbc38d622d597d67814720a5d1f55441a020000000000000000000000009f1c35717633152269245814ba0381a952f17cce76f0b3d4b9cdcd0877e43a5e55d5614b10120a1e08c11da3efa2a91673fb3845a313d6a53cce95e6dcba1ca54615ccffa77f9a87f7b5c834b8cae27597cb6982038c205c2517821d68d099e2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009fc9a643d60fa40c68d8708db724328c52ee5892fa7dead42e0cf190561ffcb1dcc7a5f11b61f3d7b0b5cd36b996a993fe69de208c43ccd6097c1951f0e057bb63fedc90c614d8216279dc55377eea032f6d397c7b849ec7d0405f537d6cbc4ef1f401196234b9131106d151e9d75e67a6efdea18cfc16f6bd3552b1c749f4c7022538026394deb39d59d59868cf368d75fa447d6704c6005e60d1f16d111debe703000b8a1aa1b23aec5585a90325d5fb97afb7a10c859ebd390db5bb657e140a340b04605a88a42c2ac88ffb21c4f6c20711c6af52293ee5cbc669632e23a8553fbcfeab00c3a49e6505e7af6ac6eabeb7ed521af2184ec359bc55811cbffcb9352b0209c9cb56d754b15cc8fb8eef16b64b9a321a27c0d7269821debcd90f6be2305c0300044234c05b831f9e690d79dc4e16804c2895c02a471b02bc22dbb5b2bca4eb02189c329d2f9953c72168e13ffb13431a10776c2d1fa445e9bb5a92363633980b031c3afd215798cd2d79282ff65235e7ee1969dec39f6580f01ab7ed95214689610306248d60caca9db8c520d58b6f29125a9021d3b8ddbf5d33057335011483820f6d3c5b58ab6e0abbd125577504a6c696402caab88d8fd5971f9d73a759723f0c9094a9c9a0e3310b975f83ab63f22343de99a86ea0dca31da947369adb6531ca7b5c5bd4d7d0bf2bdc87f28f31688e68055a0cb6573e44b958bad2e507a963d48c1d15b1bef3f3de9a4d8909e6615b4b9b8bde5b04f0c1a04636317c12bdd1a173c838e2d80111bbe1b15f974f57a33a0eb0053dc48864b4449502fce00875538b454250c7ab2475aec1fa599273c295b29df18dbe5adcbad8357e67a2c16f7086af1dabf0dc29d7488ff58af76aad2bf1c08927146a78be1ea50f1b18ef11c8000597d50cb91ba11b2e1a50683eabfbce9c06d5daf259d77055b7e63fb81c5cd8984f5ef0874c103a7c48319283da561925d46d7fca4aea8ec49654cf0fc71e214376e1fa9a18bd55ac366e4def6f51ff042ad64d39f20d42a2efe364fadd3bca64ee48b08dc4339cdeb9ce229fa040cdfce993d654f599912654e679bc4e13df1d5f789a67c4674a6ed3e84b3f0b185dbc4597a8e789ef3466c07426df60b9667f7c5bed02477977e2242b115034c1a8129d23b21d6e0fd8b9f648af4c01cb5df58ee56638ddea08990c9da5968f91a4afbff57dcc921a02b540ac90628f43e055ef9b72a21d9ed837e37c3e79c9c03ac320237b30b11e2ca7780e3afed9acd9673334b34974bc43567ef90fe3821d7d393d5c8fc09de21e06ee90050588090ff8015b1433b0a20f1dbca363d5ba25cb80b95d709035360c56dcf0c2ec256a419ff54b3c8df8f92aa54ce6acf7ce42c3a8a45acd9501212535f27c4cb271653ca26af336ca6466a8ea9df4b283bd915d8fc9e9cbc1aef11f2153529bb321bcb48cfe2ca38d9d90409fe792d06102278495879bf90f5304e56627ac6c6a8bf0cbc333df379b551278b1400caaaeae157b17bb5e3f53b6b8898b928fa000ddcf0fbe527d4c22f4f55f9ec9940b33afe58390d8366bf211d0ba3136c33d71085d724058aeeaad6f8d6635e62a59d744ef83d4237c56fea1d8b8ff7deeb06df031fe246e19804dd66f8066b6b3428089bfb4289c65dbefeb7086f97db261235bfba4e5ef03b8d21c8730c24f369cd01f20850ed5e7776eeae39cfe39312b121bd10b48e6134e97f1e5221b87d2b508ac5454531e7392929c32259015870612b458de7f208d039a0cc3eaeb8cf92c8a90016a629fc378369a27024e39fcc8783660ab7a4438daa93d40ca39c0be0007e2f019d70bc3f3e10db6fe7071c915a43de7f065ddf88c6daf0773d14880e2452dbe2953f342b9cfb0b07ee1b60ea170a76fc5258bfa03c759acaa39c9cd07e7e09da517817ee2c82d05ecf5b6dc3af789cb58c9a36a09e0077d7c419488af31cbd128d7ee187529255798a095586b7264a569d7de9ac32de9077b94dcc6d3d09c8c2635a996ab9de7b686c8cbc6db0d7d2d8cc9815b258b56e8307830bed7651d939dbb37a9e5bc2fc031523c3a2082144150c05db6349691fc80c648ccbe1c8b38636341cdcb7d4430d486937794464532ad731b09be5b74dba1797fb1d39e66bd75c74932673094ee747458bd57ab2aeeee741f971c9d8be7c7a89fa4c41b47442f7fff06139d43c2f21b4111f3818b8134868775242c6a22ee526c8dc7a7c450d06441946c0e53172c7bd3c0e32ba6f66b4263728859c4a9267d34870deab128eb2fa54bfb4dd9d25c9e3a9494d5ac3754999d2efefb76126579fe8f9bff50b28007cddc6e7cf525b39d182dd03a3b982831b9ae7eaed3a04ef6e585067955d689e3d8a48d7fbd4c56158f8b8291cb61099f7f89c7b35b55ea3d566f00026a6eb30c", "", 1, -1864769365, "296dd33c87ff69db8d6183c295d2d9228583e64975f54e6afd9c4990b6de6aeb"], + ["c4156d28020126758ef4eec8a347da25a75990c06c82c6bdedbbadc09ce332f2c6542d4d3801000000036a6a63388181a8395ceb0efa067b6785b686848e9d3aef8e1c4e1b38c2c3386694b37a5736304a0200000006006363636363ffffffff02b9c425030000000006515100ac5352308b9e0100000000015100acda0d0100000000000000001a70d30100000000a7be4363b1d57228f8fc4e7cea2b531693c61885c1ba0b06307a1175d45d3909a03e03d686cfd4a73f1cf229e425e6e1d53d29077ee122f9123aa9169909f32e2767d5f5d1c7bbd1d9d585bdd82cb59ce516fbff3e8182f9250bc537302649da00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000169e181001e8696495a2b08cb1fdf932909d9ead792b6d2023d202828431a444cf61a1c2929c4380eb3d9a40a5d0224ac193c02f4a231a1881b80dac5b3f287f7f5604453b8f1351b4a97f846ddc3ae6ea72cb4b33e75a12864570d66b47b10e476d120dd6547b8e4681935e7863c99b1b5b883acf1c74c18f6e54237bd30080031d0e5978e2207728220bbaa8386bfdd38238f0962b71eff295a078f0887d677403058e6d946da91d2e5f688ecec21b657f503889243342849cbf98e5bf31e42ac10a059b4801016179ee82280d15c0d78f44bcb52e9b02d4f8bf0f845e34aed23cd2e6d34d106439875873d09c9a08285c6276bce58b29148fbe3624b70ba835a4350225e489ab6ee2f5bca928745bc7e7e11b94ff9b1dac3fd6278940b6aacfab683a0301c3e6f80aca8fbc963f8a9559032a0db210fcf6c0923512f9427bc22cce2ec0022037774b274dcf47dc0ba8793773b8dae71d92dea71d9a3b64c72e88e51df6f4030863828b210d2ad21f849a926e6fb1dd7117f5ead3d64e8f8bab52723a326f2b03192e3751dc583e23d74255ba3b4d60513cea7d830f450320eae329afa4499d594deea618b177ba240a373859822dac2dad0d9d97e37fd7d0263789b735c65977dbdc3e1702ec230d8d63b68dfdec7c62cb4d9408fd13bdf8f3a00e67203ed32056ed8841537914da21efb5cfb85f99c2dbf454e726a0d82c6d11a8d44927574583c32ceb6c9e8261e9eb803c6a75a3a488498ec1e5dcca08acbd5ea51608122e4b4d4d3df89ccda4a10fdcca7f4db460e5daa0c10eda59683ac22c1dab8b76ba37a933d8181d6302e8384bd775347b6fbb613032f0c4b9af86017a0bebe7d2aad5f2bc08ca8101a2c98ceab876dc75fce6557d74f95215ae4e802c6213fdc7984352284a1cb3aa5e3966d72ac57a74845ba33b0091104eb23f21d06c97b3775e0b81464839cfb79a5ccef4741c149123b95ba7038718dbd10ee50d0f15ebd816202c697dc9ccb41a593c4361528ec9f0b2c42f908f45978d92d1ad4c9ac2d320693f33aae95fd05bfd33de19eca66bf459b9c2c7efe8b7c1fca7cbcda658e1a10ad2ef75472b2e583fd3ad1b3c63c4a7c863db4d345e16161cdf1ce4c3e77b599e3400e2355d5338ec12540a05ea7dd651492c85d968ef7da447ae54435867739e58db82e8c3133efcd0b376075bcdc05638f89c1ad9089a1db8bd0a078f982942cc02d82aaca7eb41f42abbbaf09a1a691909ef218626b919685ad2c06e7678d6566a8dd341df9b6ccdd11b56e46f6396f30e6420b875160483666ce26103acac13faccc0bcb0ad42f3179ae4b803ef72a3dd934afdd518b1ee2435de19b3b49aa7843de29f1cc5ba17102f2a7eeed3eca836eaf5633cc5acb5ad5e2a6928246c2eaa836964610127fe2a6b827ec3890cb62708d4dc6087f637c016846b189e8568dd6adac90d88bef7518cf0b5ab7fc5d8006bba36c8c44b680ecb7e69db22d529d332b8675fd5e831600ffd5d1b5d066a4497f4002baa63f13a3051b0de2b9ab39d52af91aef6ca1b33e112db2c653ba1ee1216088b7fe391cf5c9fa37097f8def3797404af6864d3d43c824a5032d1e13df8584ec4f805bf37fc544c709f9d3f883b4b734c645fc426c91ec45a05504db0daec146a5394bad208fc552628312d59598f0e371f9cbfba0f383930c2c001daaedb1b5fc97a15f9dc81de6f72c7d7aa77a5366422dcde94343876aa654de36c3bfaf760c555e921a9842971f3e968cc5447f6972de031d6372a9c276aafaf43b43080266d579980c7644dd3739c1225c41110273f443edaf5177bea976d74f2484abd26d038d512ae370c07d61669d317276809920967bbf1407830cb3f39da81c6b96e178c513e80255f33c0fbb18fe8f2ee561013a036566a39f1bf182fe6e46a9778f7ce5d476af4e08726fa704e3972c8c8f60b1726eacab0444f11a160c7d8a65db24a8d74a55aa5005db5fe2fdb481cd954482f2d8a98d84ae6cbc08985c51e6595d13f128d1aced19abea7116894dd02e33c01a81935fd3b88c52d57737668b1bddb6179c257729f2bcc8e88e1ac6862cbc358fb55e8b71b152a56dee9b6fd2680f0297898be4814441cdd6cd243fec3b6e31b12c2e50cbd406089ac96a66a52d28cb7415d9b872c4f071aba2b65d3a7b18c05342a83563f5097262215cc9893edc066c7b24a1bf5cc1b28f6624ec87f1463aadef80e2d0a376c4474177b3c54467b4053d9fab9d96d3809617c741e424df002ab47fad7a6733f9c6d705c7f2797ee1de28f384e5367051b9b338809874cdbde8ecd2a79dc54dc8e049304de775917af1bc00771cac90b9f5c1cdf1f4ada2ba61e4825d2134aa3dba1301fc96c2262dd2b0de7e02fa18fb0934367f55d4bdd404a84d70592552c0b", "63", 0, 716681394, "c080df47a0d35664f8950288839b3415818497ca5bbd16e11e4a7be3b91ed283"], + ["030000807082c40303afb5b47d67accd148b207e90bbec7a6691dde7e02b5bd0e8675a15fbceba3fa5000000000200651d0a15feaaa8d7127f91b14beb2251e2a6892149594037ae033ea5199fbf007693e5953f030000000900526a006353006a65ffffffff03f70005b619aa74a21ea1255e08f7c16bd458a6581335a97f875e71a41f3f7c0200000000d36b95bc040b704a0300000000045263530085f2ad0400000000004dbb3204000000000752ac6a636500ac11b2b3040000000004006a5153118c03e40ef814ec01802e2501000000000000000000000000edcccfb8b61c0a24bbcbdcea5da085b44abecb85a820f1d86b97d47c7ecf52cfa822225d5f4c651af656cc27a08320a078246670f2c9f554a7e50b97ccac2fa59536d752aeda22824d107b8042cfd02ee422313271dc021f4217ce18a8230dc1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ab41a7d99e9d82bb88b9c5fdcfd91014b341bffced109341d9e32a0b54a6f6da18c05b0bc0a545673080989261b608b08cd9de0f130d98300d828be00c78cc02ddd5df0c42530a3b27fa67535a1b38452b71301db38da0fb62d2b78e251d1a144bbb1508c5f2bd60e1df041a515daad621b77fdf0f5619cdf30fbef8138edf50309faaf861cded2664908bc583b3bda15cb814453e24d196d944d546b566d71bc0300b8cda5689c353b6d3c3bb0727181f5954d7de6a514724cf10dbb1fd31974fa0a06aeb8e0ff3ec288f45a50a73b36e153166a17315ba6c48e9475ac14a8950dbccfab76b005e9c2d6f9ff9ca422bf0c039cd68aad834e3e4c44df4eee5fc5f4f2021134fcc975e0170695545d1540dc5c3fa7b2d5de8f60718c2a88078bd1a27bae0314bb2e9e56f54217c8366c4328e4c2455055fcf7692adf1e6890829ae1e92c07022776acc56d031ca83a24e03c46fd7656b2d9fefdeb0110b5b9a3b002f32a4ac50207e4ec94cba4f5427d6cfe3e66f1ede59ab8fc50c9124f40767f3632f270a6f5031365b200a2a7c1594edf366c44fdcf822ea0ccadd3baa807a425c0b024e47ca3519b9e50fb3b5a3e89d86d82ebad0bd3a19a491a80f6fadba95f446d8fb37b462d08427d8ad6b3b3dfb168b4dc329b9deaadd348b82ad8461a4c72c54cc89cee1b314b93585640d8a635571108c1cf45f06006c74fee36021a7fb3b81f2ac425dab3e5108093805c6b522b16b0c33609f83ed0cf99810b131e7831f267dc9ad05a14477bde5f79cbda4413a27464c8c578c03faafd86079e3bfab0104bcfe8da231de17c5a0afc01525907aeed5cee0585919644109ca5eec5f29d1cf4508fe640c2a9817be4d6e9e0c761751fa6e2a956796367120dd015692757e6dfe7cac8ef11f7e9336c5a5e3b7b9ee61030172d6ad1cb9554b7230cc29df9fd494679196f037e2e3ddee545c848117d6edf29cf21499d6c43abe42e62833ec95c84e635d46a5fbfab29ea2a1ada4243ab4295f75ed4d74fe83b9828a916d24a34f2379547ff16c44b09d842900e091a2b1f9a2d175b3d7c12c148353eec196347f8ed6448d64ee7323f2c2885f89ebc385f97fba3ecaa6043a47f438be7136af28e00bb7c0f07ca8f35025dc90c479365929b66143d1ad257ee1217844ad79ad49fef998f6340ca1be13a37527f61f03e6dc962902d6db7f7eb70a63055c949f6432b780cb6022ec18fe1d4267adf02bff536002f6873239b9995bf96b3918eb42133e33fcfe3331e7b13e08f7a596eafb718fbbe351abc2af47a9b79b319aa553b78e335cddc48867bdf7225497a9eda984d225441f80209120daaedcdcc78a7a568238cec0f146713d94edf43cb63dd033f6211a8e84417d8addc0af51d9d9375aeb0eec8403355a399de0d508f77220c0191c9979db29638c0376a270daa0cacd2cc1de75928eb82d59678241416b0b3e25b2b57970dbf8dafb9165884f246165e3d073f4b656ecb4dcdf4d58f78517c554bf3293bdc313038b51710535a588432dbfaad4fb2f7405b9d54148090e6533f1813a34831a017f2609d0b47013a97bc66442ffe326dfe34802c247b8e017eb8cfd9140cac3e4aa3a3545eb28462c1f9df19c60c9d65b2f2d10b7f75024d05779caf216901464034fbd9a4a84a2c32f2898ad9875512f9c3d812c3092532684bdeb2d832525dc3a1279dba656dcdb281a5151c4bbbfe104a6f7689c0416a43caca06e1a37e9794ccfd1728f1bcf205f45b74cbf920954ccfdf28510b7fa0a31044654db45b6f3584790db9f5898d4a81b49aef8a2ef6415450100d03a655ba3061c0fa8853b8be3bac62d9d045927a9797a3632f2262efbfd8f67aeb6e3344f2d3b6d62541749efaaf1703d78323996ece1d4246ae9a5a4ec6a3dfcd07d3ab5242c1e3c71a5e69f9837e9855d74169d11fd2c9246145ecd841f83d4cbe4fee9f3385e8500d6bf8559088dff80177a52391335bc18f176984aa1d3f7c65d6f292d7489e6fcb377ace63bb4506f3883db3e82d110406c71ee5cfac72ecd724eb83fc16bcde36e01b3c76ee689d3fe4d00551b0bca6ce9bbc6183eb66fa6443061f3438c146be161edc0fbdd1fb20c10bbfeaf38632c690813a1d5306b6d76198c579348fe061bef030c3169a1627d3508776ac746c74d421878ff0dd228ef7690bed3c55bf21d4dd680b7dfc90a1bafd65e5065f734c1cf1cc117ce84ad6d2954b5573604d0b65b6955e2d4e1310f9298dc4b3b508ce7936f50aa42bfab3ee71cdf81ac83021c7f0a7da7979b896023c23d3d6c5006d32a4014a88b7616531e2659c30f589b107324bef6723326a50f36b44c2312bbe00b85e24c07feaf571ac6ad04b844245de4fb9dc56b58da9946d211798f48b5ac7bab8412056e14d19cccd083406", "6a6a655252516a0052", 0, 1245979144, "6f836f9d130e50e35ce6bd404f979bef4622470f06c6c27f63fbd1ea5d1351a9"], + ["030000807082c403038ffcb51b49f28101b888390e6b1c1ae834df9a97b44f8a12dabf622d0d6fb44603000000065365ac636551ffffffff7d7098734df0a39ff46457a4b633315a02805778f84aef106322631a6eff45760300000003656a63ffffffff712fe8f56979b380eff395fecb7bfb3abe7e25543bd83c81d1128800b4a66c7603000000056a52525100a6df573a03c63e56040000000001529fc8950300000000055251526a6a4a12eb050000000000ef66b1e700000000030000000000000000cbd4b10500000000927ef357fa7ff70a161ee3de3c461210a39d3d022a59a24b3fed14779b6bc3612a2b04b1a72521d3054454dbee5ed75593a1a0bbb72d29838e3b921513d166dcd7b335050648cbeadb9f43b26a1bdbe718e1cf912d67c9180674c915c0bc3ccd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a014dcc3e983885392a0f3918e0493576e01be010ecc49da6efe96a0d71248b3c8d3347b22d7982e3704e3582c5e9aa5856b844c86d5c18d652f87727dd9124606f616635749ed206fc573f51481f1268d631e7be5915ed1851c2d853dd281fa7bb9c3ef1cd585abab88df13ee2943a1f12136f36d16bf3efaa221aa80bdbf031841d07f4ec73fa405ab0a9d56786f955a729a3bbe49d694085aa5a7fb7d25fd030341d2462da20eeae72c911388872a2cbc757a6c3a7f4bc4e501224ae72b96510b02adeab5949663ce306dd486374671d77fd4eff955a01c900dd86c29de94c4ab1a34597d52610fe454839f5e20860fe7d366d57bb8d4c64cb6db263c4f7cd97e021894397a3645bd9067ed7a0de85ca3c0c6de7de0a61f37c4aeebc8db1b040c70022d0f2b0e7f89cccb64d6de7a98114086d34ed3cb9b1524d98489844b7013367a031eef1518bf49e92d50616628bd49dfcc4a715ab9e56c2945a05c64a309a0fe8e0214ed26c0085ab7136183a17fe93dee44133799a769294a6eea41c66801dfa2d3032f1bdbcd930887b0cb17fb797f80a8934cde3ace33e090f53920e6bc731d1fbac62c802cfe3692b4342c279f7a8267ddee92049020e44f14f6d139ff4e5cbc14a9b90b18f2da2cd1ef3b401dc98e180fe661150ea36b87a54b8f3ef0d740593644d70a6170a4bb917d1075c1ca9ad9e01191fab9a12a7f4be442f89ccad63c028be913a4da4a768ba821a36e26b6f54cff76524e78c67419b48510fff345e3668440cd094674211f839bf0292ada35187936cbcbd0d247a87279ebb9e79a92b404ed53fb2fcd81ba19154de70d96d515ef6572feb8ae6a0598303322f3802ed4d4eda5d6de156f142ef261e2806dfbec9abb06f9d7c4c38d419639f1b909037c67e221a921625d9634d5d20e44ada33ce56b88a787fdb0acaac77cc5b28ce82b5dd7b90584b8c89ea083e415aca17bb3b2949efd2a6e24e4a49fcad6d2efc28325fabcef77bbfd9941f03ee21bc77b9080e40f3da617043aa4af8209850fc18b4e929e1e864d2a587d7d0eec5f22fe44d56d6618b70495412df321b875a28614482384b25fde23a05a620128db6e32ed28638ac56f2265cceabf9dedc2f220d7d0faca43a540d0f7a0c54c8f05fb68c816a88f097be544ff69c3cc4261aac81d958d395cfc12c25bc0aa0b2fbfed68a52f6c1a24c2784bfcfe5b4e3b390237ea7e28b6f47cdea2463b0a5208862ada10785bc1a228f6003989ec18a82dd87da6a0bdd163e99624bee01020950bc61914a86f43f433c1f4e66a71e37de6d5565ae4813fda8f8c389978c190f52129ca1459b8ec31fff84d43b443bafb03eb9fbd45ba8474a9745e38ee0e0d5dbf8a8c9cc270d3f9668f48b551a8013303945210ea40351393772243c9e3a9eaee1b57ce2645f4ae0853c211d84389d5196ad61c99a5eeeb85ee16d051ee2f3c8ec1101b0dfcc0a739436e5626a709c6f995c883bd4f9600e2b15ec55c56e38ba3003c5e54017d459773d178de7d2e1c94b80ecfd98065c9851a0690876c51b32950c348b0ea9c00dc19b0add6b061dbb511f787db621dd8e82cf2fc29847c70098e13ebf6a2f2b4c3404a1a7c4b9c45a07045cec87e0f7ac772dc366cf459383c6073278e7ee7dec39d70333642eaaa61e50e0a0339daeba323c65818fafc318e0a4f7da5fa5fd088b8f0cc1bd8dca5c22afc8ef3bb3bfa1efbf80f2e0c3b9f2050116e8a8387c3c3a36a82ba77ea5cd15d11db2591e5d4d45e45c48b546805648d280d418d7eaeb731884b0390a99e0199a9332d68cb90a0e1b2c7abf27329612305861963ec46af42b2b8a4df1ccbca70a12d884e12477cf445468243e5c181bc42813239fd71222b47d47ba0dc793a9c11e12f09cd2bd8df1398acf4d218206f2e1270d262f6aecc63967571e7a79a674ce155f25d9f610ad92e0cd12feff66c11fecab0788eb9ecb4afd96e27f91007fd98936b37717cacb1f7357a883ee8a2ef1add41d5ed97d5526c8f1b4d79d0c3ecc32bae982ab07e8d24740339923cae4f14e1eeaaf0013486d4ca9d9d2bf81ce6045696769b7aae448bc4354c3f69d040a26ed5e069fb3d5e1c318b334e9993a951c2178014787e604db2a84bee4ee6ae144316fc81095555176895db64e235f0fcbbd40a9845c9c82f86a519048093eaaf0649301e727b5c063e65954875f8fbfe21f90affaaf4c7a8b17373c66b9d02b30e64f249e600ad7cad6a560464b66cfb1428100e8d1daea1dbacf62a7ad0c4523f2e7e1af40500000000000000000000000057d9fbdcad470b87284d0972291dc4f0e0a3d1a54a83a3fddda16a98a583117b1876aa21a7c2c5b1c266e5ee3119bbe8137d794d66794fc58f0a373789e1e3478a10824a349b57a5a6a8927115d57b9d05f17fc743b505a8b8d610a5f6f1ba6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fe64885e9cbf0a31a3169b9d599df2918aa5efa35ba0fb7d53c4b8210b0dd77ccda2559317eeab654dfe0fe24705520acc144d761a55ad89d19391600c6d9f8d0d95de19df7d42652503f6dce0ee08030b87867d9574abeef2cff5bc91b134f3a612f43103709e51cdd5a85d8c64d277bedda8a551986327c3f58ab8265fccd9031ca4d0e66b1d49fb8aa9d3c1c003b9593c1fba7ebd492dbd6be962256937336c0222b8c0ad4d3c200378cecc519f05553ad414fd28f2939ab3eb95483a2a2bcf8e0a00b0a8399d95d360df5e62fa7914e476f767f971c11fdf8f168a0e42406e3d5c1b8706ac9c212845bb44924684ac4e3e17ea4269c8cf8c60b4a3e8d4d65f448703032c704bcf09d900c6344d0efe8a0e36a3f11cbc051af55713e0ce30c4b93106032a9be7a580ae3b280c684b173f2bce3a13b4eaa4e6b56655d05cdacd3671eeda022bffc6e631c9b10c758edc2591b20b5008a87dc6074ac57b2ad0a999613b5e57031abfb737d33e27841a8820e916f16b47fa8ce8db6074ffc851a1d1c5dcd15f510207676bfaa746d2ba75bf495a6f2150efcab35943ade2809bd6f375a9ea8f34f379f3881c0d39338f05b358ea25181e7eb9d90e46076005b145e07a60b20d22aeceaa57844d347112df42f5a07788a4acc393743968064a118a9ddc0340e595cb6de5363bc505c573b20b0bd785a179d9e3ce328858478fd878212717fec035635aab396131618bd696738591798bc60c4ee0e84d451384ab34aa1ed63cd10ecb73c84fe8927c723a98e4acbf463fb12c473fe10faa3435c7e56067ebfd952e03c01a7378b1465f19c9a4efdc0fdd323d90f6e05d7d074f99f853425ba7d3e7f2dd7697e187303eee5c1a8c20f4e5a55bca638abbb6c69aa92e004ad85f9e9b0c14855009f3ee786f226f5e92ed722a2ed5765fab8382a25f20e4cfdb5bf9ccf9a54c982bd9ed73bb78a9e1edafa639cf6f0d68c8f76f94d2bebc2986578c3e91b4928083d67af95192539936ee3e0a5f86bc196060ef87b63867d030b5537de49a2fe4a919517b3ede27a93e2b1c5ac81e5b7db0a03d766b6128d2d60d0c60f8ea88a81c3c7050379139792f6e37f395248570f96301ab6d947bd412ed477dd87dc519eb9fa6294f3698d63b5da1503f40fc5fc0f47e155cb7f5d6e97dd406e90220fddf2206cb35bdbb2485e1efba81a7742531088d211aa7492235dc65dbf0379e19f4f7e7be8c80c5f06a7469f6d33d37c50988aafbd0ee3fdecdde4d9f36423c6c739e40a3e56c29f9c9d1ec65438fa784318ce2d30acab68a4ca4681c84992fc04a02f29ca26b6d54962eb6eb6409e296d7291fc762f2dd81a3d1eceb585a1f08c19cf1bdaa907a5b9ae5801841b36cada103a6b58ba459162157feb73697ca941d2991dcb3cf7ac0e561da8a0501003ea5fde0c59b25ff29f2719830bf7c0a756fac5e6a3dabbe1d71b58d988884657eed06d2d85433248a1845c409d6298e67e841594ca9792f11012f895899fa6194d16ce662ade3e900f1c163c6f71a8033a655a9545753b4dad0e034ea84909b96aaa22ef05c2016ea5acc4b35978fd9715759a28110db9f8e82ece3795677976fd6b83081e6f723f318c7ef2543bd297fe6ccf1804f83fb0503e8e77e884917f14139a25d52a50a3709c357e350ee699cad4b80a41aba46accec4b46aa5be2f1875e51569ad290e0cc91cff24e44037b6b5ca3d399e74a97abecf387a8070698f76a7367dce9067af1c49ef02d81eaa41c6dc69c4a3f5e7492d32730e578b82e00caed4f3ce9ff8cf7ea8e99e3094ccde9ad4df5251fcb1d18973b12ef16f2990c8b9d976904d72a1786f942ead505fb7c72705317e521e29e03c143c9021a9034b476b2e4e118adbf6785b2e4f78617b66f353db971e93d22fc08ec169603ed6db40c5352d543dedd7f90cd1081188ef55676697255ff8226c7b71fa52916b639c2f8ac53d335acdd40a24de3e08181ba71842cec6a07434de408e3e5e1960766895cc6960ea246f1e215a4e96a1733eb3cfbd3a31f14a40eb7ab73c40f67514dba0565052c8335341829d226e5ee73456ba182ef938a6c1e444e7a00a9503f244d8d19006e5a3b8de2aa170e61a5b53411550a1eac8e74b727dc338f4739b39be44aadafa50f54f9932c1ecaf8a9426e3aaf46bae9e5cd085f40f56903ddc27b3233bc3a595bac8fd8adb49274a6f65b8c3dc8cdd0e6738a86199bfee189c31f6efbe98ea1112ad9f8d7b121e76ea78d92fba129abf99786592ca74fe06fe00000000000000006dc13a040000000000ba61872d3b6a5db63f9d7d9b3648df56c6d2875b9089e3f36a7a2d44f347b50a4edb766636157e67cb2bbaaedea54fe43b74d90689ddedac5d3d40dd1e34c6a506da1379bb550352cbfacdfebb287cbe97edfd766d76b8d6e24310c5ba58ae00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a43a7afca00b38e72ef87649ffb4f7b97b8f6fe82f5adabace782811a6a17275b0785f96432c773d96545187d5e2898df4b8ef98b2090eabc5b8c17e6bc10c122c20b01a1c64d9c85462654e8ed38139656f4764036278922c732b77b767ea2f6ea7c9da91e6322de03dec23362979e93491c7e2bd2e72b8a9886e405180c638020280edabf69a969ba9613e8f9ab4ff50e89cd97e687ed3ac94cdb19456c13ff3022934e2898ac255d1ddb6dfcb2b8b8f03f30f19ec3f68552eef10be73ea3e2cf60b03f70b9e19c85310a03c01178e90da820458fd3930855095cb2c29f70c8e8d2f1352253aa6f848edb4e26d76878e243b57392a8c46b1bb161381f843424b0ecb03133d0089b17476288479cfa84a05c6655bc4881908400eeccbd17b885ab3011602047c93d74cf7f9f1addd456bf4612eae8fc8526d0451779d262443adc98574ac03276ef5d5afff976ef198b319b1bb04ff9b485aac0d1172bb9ce93191fc552e39020095449f824a114c8a802eae32179d85189bffdb8a17132696fafe99e8fa7971031dc33fb56ad765d670eaf2b89869e064e6fb5c580c4e1310325a5804acc309f2b99e8ee0545f69a1ea39a4fa4afe3ed2679a8116c3a42bf2852b2b620d53eefbaf4f8cc98c20953f09d5257b379bfabdf39f0ae2bd36dded16abd7d0900837c725409d01d8e8b93c7e37d784644383a8dce6866d772a824bd367e7a685764b8bf2e9cf446a61a01c676cb4cc675befc337f73991fc592cd06a0bfb7c3d739475ad9a25da16adad3f8518a1ef287dd8ecc678e651153cb27096681df07cbb5ed64197c5666d98bce5350821bde17ff888a25c7c0293f0c9010549231e533d24bb2b99331f4786db0072704147bfce4621368fdae2ba058d65240f4e18f12a0761612ae339a77beb4e48ce5bdde9f22e44c3d3967f66ede189a7d3408c900a779a51585001f744374af503285d7e480a613f4519d229b1773136325085dcc7ac5c13cd15b4020d116fd2d3c554fbea4155a7f2d87b1d870f5c65da86debd66b730295eb32db448be2c815606b8ac49b6e9a53cb2094aaf48e524c0e90ecdf6c94af7185c2bd06103d143924e72f60d9d52048c28d86a10293b5841489ab6262ab5b9519dcf1fe4f13a334cc9b4f95453734422dcee59a557e96d3c773d693f020105a7c76817e9addf0ce50801717b856434d58d188f876ea1acb70b77065f546f9f79b686091b2b51ef393da8ce5f26335a629937dcfa7d35a8dd6338895024c6335c2101a4e5998bbbee824b4cd54dd4582b7bcf4965cfbfdccefafb23fc86dc25233ab1ebacda8bd7d32810393e0b627fd55dbfe9607a40918b402b078606fd8d1c3ac9921b4e12774ae1a841c79b9b626fccc79a52ee2a38e919818edeb1dcc96cabe4f27d5eefda2caa173fbaa81da69d9f7ff019a5ffa0bd5bf3d45f8e9aa36cd739d5f6b87b5514eb91a14023808cb68c9de343eac7eb7b1cdcdf3f5a665702e9e65ba3f0e73724bd98a9ae77003c489f14fb31dcab5677463ec95eb051a7bac425a50a01418dad99a984d4194fae4d348e1eee56100f2d62efbb35c61736bf30eae524550ca318a1f2677438233b1680d6898428af3ed8b8876b0b140e72ccbea7016dfac24c5e97268dc656f7ad8877860bae96c7429d40f76f6880c1f39ce230d06d67a1d62038e5655620ca3ddf9d18094b49bd05379d81e361787d7f990aecf2b856af1768fad047eceae3ff24ec99a9bb603d3119b48541a424225cd6efa48d6d3e360636ceeeb449e5b52b306fd078f69ab5150d0ffc15f361d548f53ca5d7cf4ab195b076a31dc25a0aefc4d4787c7c5aedadc61291f88c0f3968dce945389267948b7099047b9c4b3d5ae7fcaa87cf1dc31ed7f90a55b82b96ebd78d6c9d4bb39855c4a437418d762ac9bcd5538ae203fc9321396d24e20bbcb9fd8966b7d48f2ff13aa7f05ab8c755c52549102849b839621b7021b1171621e86c2e2953f2136de63e72f3e4df7987948ab9909260df1503f1b01de54af7c94297a8f675c99c75c2bd737260f072bcb37b47c7de2ba4e581775f8fe2c0c9fb9f6b5fb9ed0aa587682f13f0327b77f328ef6ce8310c5f989e5bb9524f613869452839a506e1e712c57b989121dceba14c158a53d3f3d9f0a1eb25088fc0a8baf3ddff745877fcbac13bcee60c9d1b1c37d492cbe1b1a4194e7845c2271a625d11ca53039fec0118ae674ceaf6cd26aa6142b2200b2481e5a8678d9cc3c106b804be1469427983c9345188ecbad1f759043270d99076bc397bb8f093e26b415dc133d5b25f605654f4f6ef76cf67e8d511736cfc992ab46f85080d87025592281bf56049e290f5dc18bbe028b7685514378f67f5f770c33e73a3db3933b247100231ae01e88902aa7255e68b9c0831cffb08", "636a0063", 0, 1681192472, "2ee2c03beb995d6d7421fce405587d7fef7eb8a8322f77abe0f4cd2fea913675"], + ["c7ffc0030277db6c493049b3f6b6ee12083f04aa36000a9552aa5d84928e04e5ca7b402c71020000000853ac63520065ac53c953d18b6352fcebbb405c6ed2f3f4186bdf8ad471eff3bf24a5e1a4da55f054758323790000000007516a6353516351ffffffff01cb85c10200000000026552000000000300000000000000000b449f04000000000609ccaf7312b098c7b59404e1c82bb0f75299da4addba0649f4931a4e3bba54de788ca912b1042ae608811f38412ed80a19638f35a05f328316b0f1b279680958a411a32cc1f68070478ebf095048c4aea4e44ed711404075a43d007cb9852e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e236889a6a76bf71720618fd73017b5cc1c5810865513ed32d0c70f511b1597a99beeb4ee04670e8d8e09fa8a222df55c35d2f0fba9d9df621ffb2f7bf219950598cb241055dce7bf854b46a7e81b7109ed2580b44c6404e9cbd760c2d357ead6dc81cfec9171acdc2e7ef087f43a6acb1ac56ca8445ac25748ec934d1ccee0a0321d4126ff8b8c5c45e7b63a47b01c8e2e82e518c12508989ffb4a9f9f1a64a960223cb1eff999d27bc368d4ffedcf49be55071a925e67a65857269ac6cfbb942090a06a2482cb9cdb5808d882a708d3b84c8765d17c1d3fb78f9a25143f2ecd1f18a78ac23e4d9fa62c5b8d2b4223f5b6b8b6e203c5d0fe27f19421ae07b710877e4022f8c2a5175f7680e40288709683149f2ea0cb45491e86666ea51e2082137cfc50219bc274dfe587d4b17a0c725b24f4d0b31ddeead2d10adcb01b7498f1ed1fbfc032bbe929204aa16bf29ac982061c19fa8ce24d40d8577153fd6e4375264df813b0327170bc5fbd29373d4ca66daeb734a86831b2a94e5984c18eb60a797ade652db0322699ee096d0ff217dbf2f8e3b8cd0258b34b662704603dfaa3bc75760df964de24e522c5eab904b6ba507c68195ed2c67cd1812a821818fb746b1311d403805d916b8ee788505d4d1f5f79a5f0154ad2306f3bb18b9aad8cd5164b8c349e72c9e74ecd0605f952874bca6578cf0eabab13de90b45a4973e85fb735deddab3088a33c813d3faea04c4432e869217e0398d6dc75219b167094c36b80a205e067fb303ac04e4b7b83476cefad6c70a6b66225930e464cfbcaf733416e88c5df6d792f322c7f71867f94d991660cf1d472045a0e9f4bc4cb5e8aa3cdf0377b787259142da5eda52f59cee24d2fa2b130649ba7c339a32ece5223910038f00345bf9fb3e23ea4c2f43292c3cac7563f91e87e7a24c3e604b8ae60a9a0449b8835ceffcff957a7ed84d26f4fd31b3bccd0c13ee9178d3050159346906b6a6470e3ec992fce594b1cf3e76cefed1103859fabfd3183aac1b0bb9823642a37c0fdd77f21cc079f63ce441bf51cdf644f4719e4f09a407167d0bd41d87d5001da496ab1d904afb55e9c355f9c0a86c9ea47cbedf82751087fa8465561742acba5492d08b342845457e41699437d5214b7e642d84c7c3f8cd20f36f72d30af7f704998d6f6e03ab5f00af6260704b2ab5e171c6df8f4a9580b18dbfa8396c68f2f8b274359ddab890c19c5d5e0e62c89668a992f92d1040cd38be99aaee4ef16ae9c654356895b8718c4951426c7ec24ebf965dae35a58f3bfab953a7a49e5aefd5baa261dbbcffbdd0fba2a1a49e7753817e3f85dbb678dbb3a100f6240a17016601073338d99eb904b2855964e3d6ead86c51109795b862f0ca780fbf44043bf951516757e6f349e4f4b6fedf6936fc421a374f8cfbc98b2e555521946899c4f644ff448fa06857c8a76679da691b6460d7dba6ba4d54ec8d28f8faa548483d5d887bd9a76952aecd4c2b89e561a22d6a3e898cf65f96758757b79316dc1d09416513af21b3b458f778f86d814ca8807f25402703a7954b8deb7574079988bfb1c1c34cfd58e7e32571407ac7016321d601bc668e249e55045b4fa1d9ac9a9056503e8b1de603f3503a814083d40bd1ac7440ffc2b8e1b7b1317403500061bd4cb96bf930cfa37ea95f4b5715beb82a0009b1e4c4dc559f66926f64ef789a9740b54f7f3d2f9da959105810296e0708cc5d966555181bba3239a5c2de7ec18df4df3deb9e1a20a417268212b1bff4d2c854b7acac6330faa33e333a52540dd6e719c2fe920ba6c0b63861886d1fb118e9941f5295b0705113fede4051e89c10a436883245645fd7cd524d19cd306bee370faf79ddb96acb97f03a11b430423d6c8130e80be3f5ee39db0366023315ee2312dfc5cd0a76bf2c526f3ceae17c734f2d93d7556cf64a52eca4fdbd28cf09c014ecaba69a73a1494ee5b427c1f510c565f6ef837ab20f309fbec95733402db81bc56f06588d852ffd79e41e3dee6706d04fb71c0b25b660c534ea86d522ebc500aeb8507d0041a78d49ebf24c0a5da3ae52ef8124694d52a8572300c8f774d5df39c12280525641fe6b9067a7b473cf5c008df8d54bd881f3a318c5272865488c14e2b388b98fdb2ce427e7b3bd8f1ef36412dbc3149c09ed31ca600d60a8f637372841af46bb22d7f22540a4e8234e938e51d90b8131930301f6f62b74c652d9cb00e13abda89ceff9acbc302bf775acb9b8ee5785f162ffe1ff2544478942db9e08880d000000000000000031e6670200000000e30484cdda2c05beee5622167d77a16a78dea3005b2f1d3840a2c8dee8f6d17e2ddfa4a175ccdfc6c954aa402418b8e1f3fe9a1cc2a0d747a44f238b5a54d6bbc540883fd86b23efe9f5f6353c7c6272ef30021be98f6a0d2784ef4ebd09a2b2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003fe645787c3703d7f501c2f492ac9781530f5c5baaef1584b67ebc2d323332d336867d24fc263e68a7cb813f5aa9b33e53a44680d8fdf477334d3862efdb3f30ed2a3f92bc6e10d1cab9293796efdc1a6780ce6c09580b3904100aef82dba6da399f72e53abfa7733fada33aa7e647e1f64543305bee918ccb83f15fb1d3cc3a0304736be745b5716442decc932d9d2f8faa54a26fffca4fd585a931289b726cc70324d745f43e9fc16f544ca06a4aadbb839aba5798874a7f293dc0be5e27c792960b020c2648195c23eb85a9ed73bb6f5cc1690055eb74028f9193a26cc9ff82759b38146da4e69c3a32eb8a494287815294ae39de984a10fcdaec28e68ff3b3caf003303212116fc82d3ce2fc718766801b807f13600db93e076195cbf29146f6b8400314f92c02fe9df0a7b0b78eb38ee2a91053c4616fb98a41ee2ea5bc54a5d11c250312c08bda3394d797daa5ccaa1cc6f2b55fec1d36773b0fd8c7826943d29fec8b030e5b8b28dc734868e600201b233bae9fbbeda9730c15afd5de23a1a244d0fcfb0327e1346acf15c89f05478569fd4d26f21a9de9e8f6954de7396e9c805648c4194089a5a9323d33e2c93000d650f9a79cc36a689711690050c72431e76fcd1bdbb81ac32c2bc58503ecb8f78bbd4a8b19284c4a2b933ab4d8c55f02fd01d81d36f3f8bc9387d4458a10ff80e71a3d2c50804ed40e7d4444c09b5272658c2342b30481baa53913a1715bdde4ce5cbaca44ba3663c5216b6629690c054eb454643cbb02e3eafc4cf1706f6fefb33272e84c726b5b7959597123363f5d52a0ed940609b9043238dea8aba58f20d342a982a976d0d87d451e5461b399a288cf8d587d190fab9b41eed2da8699f7c03764d314c8768ec77dd1f140c1cd4c711d22412520aff9b8e11f56180999ba2f5a355ae0a554642ab6f4be2c21644836b7b824c2522e2ce92a51444b051094d4ad1afbe2cff1547904830f176af3d8d924f5cdad29e9ab41f180b9adc1a01249eaaa609aed12d478657d5babd9f493d4bc2b7ef44e69971c92a3e32079e5c95fb76ab5df4685096433906f2131c67444a8e71ca37dc17ed712f84de44693e2fe3ff60fe3ca5cf5384bf74044626a4a2863d885437df21556f6bbf961b4301c86f9148640b7e57279d9479a13364afc652b2eeca392d1055030df413e4229288522dd076b7183989e3b51d586f0e5a2362bc3ca5a9abc61960154f93576b2d6692ad1def53ea9a4e765eb55fedd919102a87cffd7d85e1845b1906d840375ad3a7320fb9853f05e00aa4d4f4930a9e2842c2fe25e7a9ef785fc7b4d9931269f11e0fd9c5e3538e8cbdeee3b6efd29bfd5815a801f05d7ce2ef33eff9b45f46fb092743e8d37cddea15dac5006e93c8d26257cec69d6a354e537ca86051eff77ff2cc4c103edc1664997e9f419e698cf1633394678e8197be0e8aaee03ea609d2d48b0f91da52a4466c9c0366ec595f581c3a0cb1fe6ba21f56963ef8685ff3cca447297f8453cada19f523fe5e0421635536cd65e7d9420eb070f8b156cab7a8479da916b8ceacf55d894ec511a1bfcb966ad766cad96e9e684981b183a1d4e3fa26d5b584d4f52543634dc39e27b084516abc4d12aa5f48a6057720b1d3bd01be5cf62614ca3fdf241a8058b064add9f453c885d4dfd0a07b3f334a90c9d45de33d4d958d7c221925acaa2140f8bf7ad3e1eebde9fc1d0839475f16f8135a7fef26c140e1021cb99a7ab23cdba775376d9071c6632dbedad7f3ae47215ff197aadcab2b322d53527aa12bdc1a839d4bca44140816cb5fbc0ba3ede684bd6defb5b3e333cca2e861bf639d7415aa8b8f8d1f0f9bde6ca5f03aef7e49beb166c1aa882f7ade9d145e73cd6738b55379b94240e66046163644f6d2591bcacf774782b479ac4a95b220b86c3a2613e48919137f866a1d1fed651f907f196d13cffb9c5742c0596968f16e2a85e0b9796629acc3f6123afbeb5a13a2a396ec7e57a8c2165ff041d7f83703b33a3d2f19ecfb7b127af4c108aafe98ed281f7dbdb064f7e05f0cb4760df68446bc6d942dd817eb185a3d6f6000c9585b91e0157fce9a5cb0b2454403cee8a82e35b9de858bf9ea34ba90de3a043f9509e47ca8914deebbfd3884be6a1962c6f74087e15a2b8a014d8f2fa66eb5e17a5c30d224d0a72936335d2b8e5e5992213af86c70db5f3b81738df481d695bed878683c6f8f9379fa5c54d57dacc05fc73bb6339b990a180d2331aede3389d1fd92ce8ae0c44d6387486154dd4730000000000000000b5fd5a030000000036c4718ac3d43022a6df945f5d9182fd04cf0497039fde06cdb30bd4f453a7b12831200eb943912aa670ff5ea80b151750b55b1167a31f37eb82040c0a12ba95def7a22a431ec08105c059b5d8c0a0ae70fbc62d209bcf434964f64fa38c3e2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000db8426f0e3733cbaa4c7e0d9e4050070fc3a8bc58ba4e4ce489b52a618e63db04ea988cc011834f372c4553d09ef4e86fc3304797c5859c30d6d8afc50d7935e4045365fe09661686764d18eb961dc70352cb72e595be5a21731ae51c97c97be58a1d5acebe0dede1d62160144bbb4d865b3a7a0cc156ebd451798d98a16e1540229d1db466d518174d32785fdce6c7de2de5cef0ebe8ee7460c7a49739de864870320be5dd6e9a80098d8e3c5dca282592614e4256d10a072f09a7b75f816b6b7d40a0551db0ce961b40808dbb9f2c21cf449a812d350926bf2e763706cb5d033c3259a5d8e1a649a7d32a36d4e13c45995e82ffa8ce2a0b3cdb82982e70490b16eac022d27122556088ed8fdb48df5f6e3cfb1c21519bb476205391dc5a0e153da587e022bcf72f6e4f466aa45429cff03e860cca90744452fe089a8b1f2e19ab20e0e8a031788a20cf75630050e88a53e1a0b99f04def6bc148838c6f5409d9730b2227d90229a043c306266002af3f9b31a09734382a6159aa4a947f4d8f49001cdb80b14903160030539f40954fa3430f5086556ec7a41df146c3d92a566208c4502ac65c0f1f2a8b3a5ba8c7c58315db2eb1b84b6670dfb949bcd5305da0f54e31e29abd144e55fac91326e8a4b4ffc52fe9ee62c67015365451a22711cf8e66e9312549b19716ce27c0a0f7170e3658e8509507902305865cb32fa101ee258fcb14d285213da444224a09dad7e2cd95c106c4a698d1f873a21a9459e2618c332a46f5cd91dcafad8161cdfb4d1ef6babd4602ffeb96266713ef86722cdb71d76e594f06fd357bb0ed9bc64a8ed036445565659bace73795052db44e71dba2bc11f029697ca898beb5e19225d0961cb58989f9d749e67773b64fe92f74bda951c5c69aeb20d24c011a6ca001a9026f604e768a025b43233f72c1113a7b1a2d1fc4a9958d57488d81a8a971534f01ac3ec7f16615be9d3992d76dd758b18a2402a44da938e856802d2bc8696fcb5d40a879f59fc8cfd0acd5a874a34e93ca7b1c4df1a3d56187c38e308e4e267450076066a55675359a7036f3e87f98183364a4da24d286fc78b013d0ff7032d3707f99b81b8cc0fe785d49e676fd420a39e27060a3f0c684b3f53f5c9034656b2149d30bf2dfb3c8d166554b16f7f6941597dbc84ff9ae19250d49455a7981716ea557eb04dc496829abe96cd3534a6c13064091fb55506d9eaa53d236f3ae5aa6cfe8912388a739c3e9f78004bc4d20e203f972b4804c55d9a12188159cf159a8320a6ac31dde32bc514fff2047659dd76712d90baeefaf2ad11cf7f5a47af2f831ef3370a89eb50c0ac6661b544509e4c6c1755cf6fe8a7fdaa46517bb54d0ff97f05fc10c67f2da2abd295e8be7cf732c970de78710779a431fc86ffa12e0c5b8071d8c7d6d33a298a2a297014b10119ab5804fa69b095664b0bf9d3b4d2f4fb9e16628316df38be87f0567dfdc27412145d27fc5e6137cb38fd10056278feb1f9ebcdcff8c8d8e15df44b9e7087979ca1618097ca5a6ae6210fa69174cb48d563daf2bb69e98b1b943874415cfdf72a89f4981e263e0c3f06bdeb18d827f4b177034a8df66fe87e68e7a86a196b4b4d1a1147df6ec11d49ec56b1a563901cdf392ed170dc2809276d73010d49e0548a40bb4f01bce33b569c2fe27960839499dad7405fd8100ef1236f515129edc99afa9002fb168901d5f37efe9299ef4820505aa5d7cc7df763ed55f17deb4799d00c7dfc3aa96f234112ab256a19f36983f722466f355f420902745e52dee257eb65e0d0ad0436ee030c4e34e2c922e0e57967fb2655f31bcce1b00aa826ad225b988a792d7a8e2da318617f44df1e1195cbfa9bd3c67ffa7dcf3a892113a161e0caebc84d3088f00689fdee603afd819867e59ad09de75c81d7bb2505b47ed58e29dfbc36e02bbc7b82908bcdafe61891471296196cce6d7b98531a08b0dbde6d03eae4b9b622b05cfd1ba3b9f9c5244f74a555b2584c8f7e2214239445469a1f6cfaab5fc3fe346a407b2f5d2710ed00809e11b15497cf1b0dfc56d223720a6edf5f7fa80fa4251e72e691e4f9240a6a1f09807a0225e79792f96c92712715a14dd14e843f30a6b9732f81dcf534974cc7c9f19f4903fb1efeed493ceb7d092272ac56c655501c23b985eb129876d232243bfea4ff1d9de9fd415d520bf6f9b134df4fc01f0454f2775092d550b2a67f43d06e902e64b56e163ae43aebaa8ce0d4c45a8ce0ad8a655ca37e67b7a94796d622070358e50bbf3d38a8f84c54b22fd66f819ea2d65f61d62ee4f78a2ff4b291e0ab7e90bbf06a452296fe46dbd80c1ee479f036832e8f0467b08c03414a914d18f0766d9cd1c74e35dea8ac6429a70d3b8eab379b0dd57066ca3869d0fc7ceb6249d2bdbabc305", "ac5151", 0, 1104836853, "bfd576459463db362e13a854488d83d3a9cbd37d4e394a8f3cb283ded48f585c"], + ["a6bcd85a017bd509f0aea493b6c282bc2a09d2cd715479dea3764a77e4f96c270b0b97ca28010000000852006a525100ac53ffffffff042154be020000000000d6b59c040000000006525153ac63531bdbe601000000000853ac526553006a00f1950e040000000007ac6a51516a53510000000003dd6110040000000000000000000000005e7b28b4d058e3f8aaa9649165f322964dab636db6b244c33fccc9731a77f70e33bc26656f89b85e1d7f1d42e8ce9e4ddb731667a434907447e1ac6c7b3e8260423d1b5f1e7e8593a4fbbbb64859875cda6206971f64cb344ca16990e809d45c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f0f49f2ed663c8118efd74d6465687716f0f6954d6df6ae2330b67f6a38364a94f135513a704d3458af1cc62a4806381c677840301e64b99b77693bfa8084eaf887318cc9831aafa882da558c5b328b0a58148f875338fcbf20574680f558266063c218000a8b5f4c37871ab1dabda7e7a15d485df0af83ec1cc4ffb997d60d02216514a5c04ca1e6ce5e9e181f9b017d4261d7c933760c33113c295bcab615e0031cd147ec6384d90d6e9ea0d89f8c3d371f574973fb2d9d574a782a187bf22b9f0b075138b8deae540125f8efc06a03d0b744c9eff100706f647c891e207ebb0574606e12e475f62eba95cd49cb85f11c5c66c9908996d54d6c50e3e01ce45e927a031c97b61d2f481b34b8b0c797545a13c1f3cbec4de0309306d4511c32f7865f20022cbc9e74b8edc2ae93991da2d51a132db106c35c887955f31bd95d9243b9379b030d3a6d6a4dc31caf2685c19a72224d6a903fc9fb594f5ddb92dd76fc3ab7321d032875360c3081826154c108d4b316643b5de86da2cba8d7919e0c51c34a9d2f22031a0363c75e6d194719f73ff45a016d5231692a60c144f145df454f5410d8c91cc194cc70f7669e71a9f30cf97b490820707d0ff8f3194cbf16a81b8df6cff5f82ea2264e8104ed3314cd2b7c8920e0a8fa278df20a4dbcfb53ef725ddf94d70460ed6eaac2d29ea8badbce473a9471f373dea41a1e09ec66529ac3fce9cce143408f999305140626cd33f5f07160bf3c4ed7ac193762663c259aa511a4ba6ec9d6b7b555493d4a21a796a3eeafb575ee2096535a8e6d542963b4fafc16d601e2de26e7198a75b553b2202a315eb68ba479f3afc581589a9e5c157ff44987ce0d0e6f7d2cc8f955dbc78a40b77d96f1b7016d3e40b436a41b0a40e11613b32dbc59b64918cf97542f5bd72714ce37554c58e70da64f103abdf86e1e36a9d8448356d82315d1d0207306607c8a1e0d8df0049e594d5f34636e380fd62dd4965a5b69977085e2947ee3c9e6650416809ad16949d8858ae05f72eb733d2c1ee8dc41b2be43f66cf352558298526c45c72185d9009ce1bd4bc1c366e6366d7ef949becb19778746fc8bf35775486ef60a52b276e2e063249755298585d1477aa900ca19cc12c2d507ce316d3a4b1bce123d24c3c835ba9fa7aefcd3f272e85526b9d7f71a113add79c9d01d85e4528f675c4ab948e440d76935d78af8de459e912b8ede72fd38a6074c43c99d664d82c10848249bd2a2ea953bb0911ef4d465668d7c86a42f6163cd9feda0175bfd83bf879287d1a3803049436a6829879a0a5650b76f2830504d6e5206188feadf82880b541c6fc7cd9080b9b90cd075a951fe24862b0850840c0d884ce9f59810b6aebd10c4c037c6d276238fcf724cdab0d33932c63db72e2c4761b6a7090adf22b134c8cec276b8a61539512a4ceba6d6bf7eab0246bb5be8aa95c064dbf00d09a2251574474a89a7a22c91a5106f4778cf9018db52aedff37105518d67f3b224ce5fe69e10b3a9257d274a359e278c3968dbba8e210ea08fa5604999f65c37e5707224da2457dd5a30d2edde7cedbb09e31e65902dae3fa9d43fc3adf9bb1f96311b2c962acfe745f9772cd2e882f26f7db53b842b9998bc08fae79b9563f418cb9e6d24686eb800add9cbd6906bb439c2cdaaeff0e983bd11698e8c77adaa94e3f996270afc4fcf7d386f14c4d9d8ed66b18e9ce68ffcf8bee3da31e718d29598d26a41819c32bcee6558242fd5a2b41c116b21b275eb3c296822e666575a53c7a18b4c49beef4e1b5453a49b06c704f0166a7e544439cca6c74e1903f719397105b87cbcb446268c18730c97790e2126d9104b055b36cf130e9036ea79dfe1c4e40c97701fae0eaca4139ff030642dd6a455841150101a87c1aaf1b7feb182411db3d857fe3f68ed5f797866c50b70a4a0dddd5afc8bf6588cdb1efa05f91f74dc402d606899f45c438a2994fca4045c257a7d6921156a0d8b027a0f2a39dae8073f8df3b5c69de83c2db1ef42daa493d7c32d694a6d5ef357c9d0fd01bd112f7dab6f79110e7b9788e36d962299cd1522cfa0b29722cd0052f678b3295e86ead09536e317c26512fb427482b0e8cb4fc8841b8893a4050a0b984bc2e9f85517c447eb593a59f1cffcf948e9a0ede6971bbd4aba4cc75635e6f8ca417ce0c603ac0d28408114669d10ef637fbd36ee859e50a015dddb8d92f42aba230f8b691cf3ca745a711b3f0138f281143f85252ec6e3b0686b3674eaca018f3361264db338e1cea400000000000000009c36ce0500000000bdc6c7a5c09f09080761d9c78180bb0a49a4bfaeb8c7d7e60db08664e75ca99d46aa03575d6e9ec8cfd467cca5fcadd0348bfdd295f345dbe3b7c2dfaf556f71c6e8667ee432b301de1442132a8f73f5c7a8cc6f6561972061e78d54a5252f8a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a65f04ce5734b3185fba7c2bba1cb84fbe0eb8a240234dbef211f47eeda9e8632ff4331f287cbe5f093597348a3a2a3c761ff74c9c9f554f2d43a5165735e3ded39c70fd743e7db4e32527c78b0e5355c50a79e4e6c7da999ff2bbc910f26d4c396bf8c67e7de2468b6ef5ea0ea6ce97c59e2318ca08e7a4b975ca836dd27cd02243fe8b9509eeda9cf3ad7d378648d2bbedba288d921f8d046c96267cc78d1fe0206b364657a0cd7668e7bf1f09f47ab756997d496ef9e4877165b50afb5ddac410a022ac9a6dc40d9f913131970c33351c5d5d6dbc8fc98bbe82a75faeb6d0fc04e0966f0f7fc3b27c09b1704e78d8d9427fc83f8e5979c8e3bc3569d69b1172c160215e3b60d3e6925f735b062b567e7aa97f62f7ffda016f1a3ff1f89ff22c0eaeb031b68bd385a50f0e49bbd5526fadcb76ee64d4287dc3375497c3e7ce717ee068a031fa508c14bfd9417bb096a23f3fb2d7f1fa73fe2fa4d05a8e21e20a17c5c78f80223b6be93f7b13933169794169e87108ec31e08e4f312869b99ca6e52a491ba69030d32ce0d903feda9942184e603d04cf7c2046e68228a9200cb26fadf0b857d3ee06a0d1f9b9fcb337d669d1e0d5b5fced469985d840e1062efa5367f2c46955acb482f004c035dbc9f66e6ac22e275c3f116c9b473cc5ba653e1e50db2330add732e903f84973cf85a185c713a6f6d3e7f41d0278e70c05a7c5ba293e3c675f4a52758f2eeb9e095f3c5b3b55f04a045dd29e3e6294841c5344460e0246c6b0e7d9fc4a48b1d0f7258f4b4996134aead480cc4ee15b6696a784de7d1253f1a714cf3c1976f999fbb0ee46caa1f26f61dd08a3ec2146267f238e9b11caad4fe51d3c92c3ace3693eda6e9f27c255e65d1d01ccacfd8b84eeea5eb6f7bbfc0896eae7c8240e244f65213cdb33f31b227aa0ba0bc8ec77c7abc7d4deea0336fc750b8886d73af44b4edddee66eb4974d5a7f1834097aebc6899789216c2c9a7c179865df5fe42fe459d6dd8752419c7d82ae03099cce0e7890fb55a4997141550e2bc5a0c2571a8f1213ff9bfb86339e46e38f907394038f0275d0dbe4dc555ce877d6fe7aeecf2bf8a2666c61fc797cbd089ce14df444b3d7f261b1bf59b088b0f480c5ed6cf64599de8871fb24435d63bc067ea06db34e789fc57b53d7b5bb1094391fd28ce5a45444790ab581cca1dbdbea0327678e2976fae0784827e91184224fa4be6d28a26b11f8e720bfafbb1a1262fb2508f0ee519118f250c61c00c3802780b5a6a21aa6484e5bfb45b7618120edfe38ca46e1f2dcacbe515cc2840be35cd82db41fb92b128d1dac7eebfc981d5278df7fcb5214a34c9f44241fc1ac114dc3224968e10114b18ecd0f3d344fbd132f079e484d5a7878a629a8255203afe720711a82220875d51dc6fa1a30c42593133923aed8f8418cdd263a7c88114fc432a0fdb5385c0d051ec75b595008529de9d2a09429a7bc7167fb96c7d9914c6285121ab0a61143297615d14b1001298e99d7f0b785614430afd6483bb35d3373f07fe8a32090eba6a72f03fe919d040bcdc0d418cf2a98cee1a5afa359fc190252a44c06c0207949ea644453db7bb5cbc21cfdc924df7f8a4196ad35a6be860ac7f73ce37e01f200b4ce81f9fc1001e701ac8e68679a2fa1e22e413e99e6bb27578d72e42ab9513a0d2f5049263e3d2009c9a9e9ca6a4ee185eb2daf620a06f6466461a990f9d47af2d5fdb4e9f13c4dc36b8fb8ac023c5ca117e7882bc3d2edad8a2ce036b5e6fa93373a46899abe1274fee7634102b08fb698aa969cb4b2732b0dd56518737a15fc2dc5a04c74b7ac3efa19d9b95328679ad2b73cfa302bfe535a52c8848654bb6f280712fc05ca24ff961334c5e6a49b331e0f5e1b9eb346f1fbe6b3f9be8229d05a41372cfc6c5709d4022e8d920388b5eae8b836eb6f9a229b64a184155bb04784d2f3cc6b5d03b86a899491ecb15c5b05a67e31c2c8b97bb60db1ce1ab05a950655306a1acee5b77f157efb0d61da5e5397fb63a1dbe38e4997dd08900768d43fc64be57ef8fa8f8c069b0620ab96e77da8e5b5070b60404c354c80dc4374c658287a9e848c7ecf6fe5162683609a50df6889d755cbe54b2ad9207b019019f9e6a7adb5e2ca4a59fb5c1b8bbc3c936c7bddaa96bd3aa26c751ee314acd3672af8787df9624a07a7e51b03254f2608c7824038064a988dce1dda2b83b99d9990750a0a050bda76a98d50db0948fe5541de5df8e51496e1e004b3d35ef830c21434023cf09ddc561da1ecd00000000000000000000000000622a2fd37bf10df0f94a19ddd6bcc1520e910d7f0f50c80b9d550e51f9710eebb5f8ef36cb1ff7086390d4fe7bb0a890a41d41fccc7409053ac54663aa74d05d604760a9f7effcb7ae19d440a8cf29f267c228a262dda42777866e35b494adbf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b36bd9a615fc24e2e982c100a72527f924764c7516b1602f3937757c4525ed435d0acfc827a0deece7279f4517dc207f61d6f64771e53f15918bfa0b8359784575c89b527832d6bdff820744a5a029860e40aadb79ad3531b0b70c79db4f2684b8e9ef070a69f5993aa60b3807a1cc8f96577fa680dd04491403822dace681302243e0d946c0c09729a7cd6d0b2004229aa33ac9e5888b04f1f8c7452260dd18a020fc8b314cb45e1124bd2855f799c1b1e85e6a7e16eaab2da75ce147261bb1f950b045dbb3258e8bfad31fe3cd3840db9fb1b63483b9941733a391491b64c7b140b6d81c41b8145e8104dabd848e95c31e08a2fb32dd990be5ec1c6424d0704d96903015df3569449009c4e157e38eb631743f62a0ea39a6be5ab8f9141e29cf0ecd70322111470b60b99049f580d8bec71134833fe80781988c1c66ddc78aaf783d81a020dd68aee00ee78074ffae9a5e443a7e2596851004954aed43c73139efdfa2b94020922f51dbebd4899365419e1f2dd7fc3f492e75dd11efa952212053dc8e16d0f031c4b2de59ce9ddedf53dcd2ead766b2f52f3138e230ef548253a5e5433794fab4465eff5658e31b27a35e287361aa639597aa5416b8921eeadb8451e3629349a3f3300f4efca8f6292fe9f0527f6b4ff4e31f923aada8a2c93cf716abf6d414294cbcf65d66ac6d5cf45e5077eb5c8e06c58cd921befd8d5ae6e62d9ce63dc09bd0f8ab4f7fa65bbccd8c8733e396c82bcc0fed605d5b34c46e1231b95292cd4994547cd3120d250700b4092791b29f4a14d41ccf8576c5bb99de070da777c32cd363fde0de625daaa2e4124f420f7af9bc60bbeb9d656e8ba61251f4ff334f32f24b77a6fbbe30a7586e48e5486cc204fb143a028785b89ae6eea6fb5a6a2014952059be422dc54036f85182dfc56f8d1de362a963a39f316964618419a74cc1872239ff075ae369d3d9c43ee0251553a69fefeb0482d1a3fd8975ed76a427cfb5bfa69795e040cea16059f6a8ded4ca05f797f889bbcc8e10e702e612a6a9784a5ac29c83fc1b8cd3ff46bf9789aed28ebe8b9efc0a6f525f0a56af509e65ecf05b598382e4127783c6ccffd5c5da16bca36b34daf69a38ed6d60ca6bca28b449669abd8541c8d3184dedbaa10b2574f7dcfec84601c438308661ac44943cd8561b59328e1790f5977470dd51908bcf6941c234c71eaef1f4544ef5a787b5e515f5e124e0479cc3eebe759bae1be388d534b2b88a8d57094e35c72c88eec343b4c7e640eb97d5444a4c0b485926b730b9c290c1c99484744afd394b1eb358fbbb6b1514af1808e120d7ac39c09cf7aafd3ef58a63779b86968c79bba0ba3f8e4e72415cc9b1517e4163bb9ad8dd83b5813bd37c7a1256d4c26396c4b0051e0ab120d0db5381570ec8a4dd61816f4f429d12ec32192073a08d5b0b23076eb88c8e278d4672fd1865d07716d001af0f38e67b3c9d1476f52430ff764e448366f58277c33fe0d6fca19fe49db944f42345fb19b040439eb588277bd7a491756131e5bcaaa215057e42ae7a4ec5899eb1ae474e6c6c2125a59483b9440dfc2eaec5928c51ab8106083afef72e8bd74998c7ad1564dbb15068251497dd96b43530b1654d7c8971b234905a1f11a6206343c4c35156e3e011264eb3183a8576d77c39cf43fcd919a8a9a1c7246cda2883dae85d6215ccafc67f800699e366259daa5fa3fd585e8f0e821773020bcbcd716784fb9f24d07925e06dafd31f1c0d668e33ab94964c2b162c911da55b8084d6cf04bfb10dcd366fbca4ff26327c1907ce9f0d6bbf5734eecf274fa6d80a63a9c494a2b4e56439cd308bdf788832799209654009f79604bdce92c5e3b363e1842fac11e2125be977e9f3a16230b9d392023d2bc2016f2a0dfe3a9a07e822978324596ad4b59bb323c582273cc1eb4fc70fca52d08d63031cc5117a4f8615e88b48c368aec7f6607c4303b4d270ee22830b1644c07e5a290ef0dbe18fbe1f3a49101e2a8aa8ed83af839d43cbd44589744f2d0480100567a4aef572b45e8647970c7471fd219c8487254f711e5e696b6ab4dd871f9fad482958d49f1ecee151db078ee62d1064224e1cb0a61fb4a31090f36b1f12a31da68b79dd639833c30ed0b90d7fdd65e5ce92c830432a1e665b48766042fca2b46e646c1a265d3c908bb7f6c17b5eaa6be072dd4c9df58844a0afbf56934f0091bab1a8bb6ea4d3d78fcbb86d3b60ef6ac7be7cb3eda87b9af5b13bf828dc07178d881c897e218a8e70186c76d7ecf8b4643850f5cfd48da4541421869b3f31aa7e5fd01dcde0504c13e34d1f6d8d774fb4dd7d7992a9c8d745ce82dda465a635ac55de2ea7d75947827207337e33f19d134999cd2e2cdebe9b95d8415a3a1adb9543507dd5a1b1974a6185a5e0c", "005352635152530065", 0, 1384987576, "11aee5007633cfc8739a8417a2a9c8bf72f9b0a334e2b82bd83ff5467a148760"], + ["030000807082c4030393cf05d1230e57a9d96a953a137c7b8e0ae8662094c0590978849171ddfe8170020000000100ffffffff1b2fe9a55979fb49cde8522e816557a23d1367bfba0b95d6c9b1b39743c58da30100000003636a51f1c7a3971f4a4a1018074609268dc32d8615cf2a689e2e368b48e4687417fcd0d3980bbb00000000026552ffffffff038e1ad0040000000006516a52635152b476be03000000000032cd2202000000000852535251536565650000000000000000032ff20703000000000000000000000000edc0f91dc1e645025ede4385b64221461cdfbb152c383df2df1020b613eb7d3909ae5d906f318ba7119e32c00bc3a007df8611c02844c35f7c8e5e25a3b80848a8a418108aa70aeb708a9c8904706b20f3a68874177b4e444e2bc1069e48a971000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006c7397253378a6b95c436cbc71eb13d259bc3c605bf0113d0c49b55fac311f6f7e950598ce1e196c44f344391c78b25f95559a4db1a5499ef6f804e094faf88b1be97f0c7a46d4988919cd05768d7fcb6fa10a1e168d4076f0116f2bd716dfc417a8412c869de9723e35acc785e7998565a1d6a4b681b7cf6be7d0cd83093d21021500b13b29a6e3e36deef2da1da409ef4165c44f05c6c6f6548e09f93df00ea3022b94b2f4c5d37726d531dc2e799723c38ae2cf076a18c045c555a039b68675460b082210768c5891f7461c7234fcdccdbbd261e1d555a7a920a78d849d9e9bd3ff7ab3708ff6df3e8427310aa33a7ce1edb9cbd2bf42a512b9899741e2ef907732031e934c86b94632f276d51353dcb7b95fca18ab0ff0db85d4faa6933ca481ca12031048c7db80de913250facb102e9ca21e33c9e51af7b39887a1f089f0b8ad4285032b22eba918182c721ab2fc7f520f078d8f8955780533c706250aa9dcf580e48f020813e0e0a0cb869742f31b6c189b26094f7d2fc04a3764c0564f9cbf5310d8c40329c750bf30c91003438cdbdaacf6e29f1554a6478ae5af79592e63d22bd4ed4878dd3ad02d4f792ef7d9ab5066cc73c93d4e184f529766dc204b2c085578c97f80cf167e65f42b7e1f6e43c2ad4c09adcb3fbb87d7cd1335c2b88226caa3254d54567ea2b6502f3284067d3af47ba34d452b09b11030cac9679c4b3c4daa9b9a038ba25363385eea91a686e86abd2256d130eb4cdcc63fb43456894b643c11bb309c702a7c15fef845b9ef9924ba1bfb0479275fc504269d251aa4098c000692076bdb9052bee78bc8105a4efe8b375b10f2dcda00a5002003a42bc3a8e554807bcfaf269e0643b23d437efc60dc7c31106617e3eec21ba0a42de181785db0a4a737bdf9212f9394ea791974551b96309b16077c9cf48ab6b02b08bc27171e64ada25dbc6918335d699ce40fed0822f4ec7ce500b0b88a4de999d9512e4765806fe5ee0ef9bf743b7f8acbc06174b8b21816df02aa3d4e7ee4c8e6a578dbc5bd4d019ab7c09828a2dbe034bd0675f0737864b831e27f3522a3201d58d9c60944590d9b5147cc2480459acedbc8917e122127e262a2475a4abed9445c5c56df9d140558e05f5871887a78217b3bd06e025f209d6be2bc8465909347cad61bb86bb0ba16a847b81e4797d6b990883f30f50fd20800e316c9290b27e78c52cf68cc6c7b3187461d3cbc0274e9cf42a730f59448c99dfa71765f612a6a494291f115fb4fe46812aadaf9748ce542e6f38abe3debf55330b265aa4d3b947e41c1fae80a257b8f426f86321b0d02e16aad7348feda7f9e10116e2593611c0beea32c01e33e53a542e519683413bee5eb9401b11bce176d4a4a2e0ccd46ab9c6dd174f91c2281abda776f9264eba2043c0ec9fb632a2ffdefa97693fad7c31a96c78e2834d8e13386c451297b40587e901c9119a7b3d532e08be113c880e20c6096f50cefd1690f3b7ba8f837b510b290303f6a4e7fea41f107bf1aeb2e88789ff6946be3f849293b8e1e6652e0308fe6ac5ee98a180fccc22f299629fe31c2db8e688910b8b60ac7d018583eea1b37e51c741b7d5a3fcd4b78a9f9b70a35ed03e0f072c1d2696394d5a642a2ecd4e5b76db3b72543c2fc2e395070d5463d2362d02616c11b00ae47432e658bfd93f8a4eed5070e7b9fad177d5f7b893f7c8dc432af811cea51d390e23dcecdc666ecafae905eb7020957038884f4c249c893eea128b4f638f69a8ff917c42719ea9f55a0f0902bfc51a165d0aa078679ab107bbd8c56d8c44b7ad33d8d063769174d18d41871424c6bb2f25d74ba501164ba5d36bb92335398e0fc6e6c847788e18af6ee0343db844f34ecfc55d2c5d32a486d71f148f9704a8602e058c946ec36547fe4377b6cb4c594efae3d400e31d99311c692d9f7430864036253e806add8e04ef11928e3a8eed9eebc6aa623500d5e0b224043e6061eb10cb40716a50dd7a2aae43ebdee63a1291d3b200b438b6b7741ce0b738d85a1bf923b49b1f03a10b11ce24cba88c07b6d90724b77469446251878b937275b8ef78cfd8324587bb97cd6e6dde670a69cc90f2ff5b59018b963aedf1ad20ffa41136ed50b28b93952e5e975ec1d974c34758dd7f8416e224022af43bf05ead616fbd4cf6a87b19d5fe26b30992a57b19a2f816ef1bfce33feb04217a1d3e39ee862dfe788cdf5331dd2fce2b9ff17a1cb192501c684dc71a2c55d91e1a22cd078fd02015c2bd29bd658307eb80ff0eb851c6c020000000000000000000000002faa3a5367f77da7791ad881331c70ad9d01957971d381f8d2e8e2dda1c135d942c91db8f62d693a063e4e00e68fcffc3cc8cf2cf3567cb24accc0d0374ddeabe0f4395f1d29283edde6c9f0646bd5b97d9d54cfc4631941666565a6cfa8486b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d3b7470714e1581d4b4e26db727e3d50c0f64e1a4aee08be548d4c1c7fc03a2cd2be88949955013a531747616b5fbbd456b020ccfcf88e6114dfd65c240883506c178cb217f837fb7d0707aa489916ef88c633ff5ca71038347dd418cb8e3b02fcc5a643892ed635d3abc1bd6b645a671b57756c2a9e7049a0f0515bdc612a7030819c29cf61c84a903fbcd66667d2e1d20bdeb71f6c4b5a76787219c5d81102803291fa91eee21d8a218ef68ee8cc370316eb13137715d40c2c9c58cdcd81166110a05939868330d66196407824eec33630d380684fd532f4840ef50e65d594115a320de66c2a242d699c5980ed91dee3652d7ee36cf65ce05399afecb38d9fb60da02083175de6fbdcef9644cf166b3dc55c1caa624ffd7f7d2dde9a47325e47d2bb7020c0af1ce26c78777d9fb1056a8a0f43f69b95b3136f2ad1cc9f837fa8df32a1b02271d070273a09c167b2f92f783d15b6571f4f35ac3b6b897cba16e65e0f8a960021f3cae1b6e5db48e491bbf48c7a87d04404fcd4be7fd820ff5ff4bf8c253ee0e02088279c191370fa68dd1c1f01961b091bab32b1ccafc31883da709f9753af0b015cad1f51665c2b4ef284cb178a8039070a4cf9ff472d4efd101df5d2855b08dfe4c12ab978aafa7fdf6d06b9f164f8f52234989b4ec736dbabd1a777abdea5c0b3c78a91c7ef5356898ce1ba0293f74f866d158c102af239289636e275940a6f7eeed34a9eb6467c3d70fb1794d94856d7575928ad9e77651c0daf22b0d0a7d4113a3875e1c436f5f25de3d756f518973ab2448df34c2edc2826716773312cc10c23c8c18bbfebb1c32495fcae6ea1851d1e7877061b31e25005f1420e89a8ea1c2041f7fe5ab82be82df83e10e0eb91423347dcd183f0226ded8d58b7bcb9e15f215e6a74d8c586eb79481f5a3f6b86ef8d2e39f6217da73280ed8dff302f6811b1dcdfa0bebf60b2a2db593f58676d8ea8804c601ecf6970a804147ff17239df9dc22a8a8205d77fcc85426e5a2e696a9fe00f8c2c2400a06ab9c7b81f3ffd4c4fb66f94ed89914cf3513079b60c7e3796b01b9e99b1b9c761aee32fa3a3529bc25cfec5c11044ccfdbe9e9916d0eb7e18ab7563c09f0efd5499fced4d96013066559ee6b01fbdac33542385cd83796ea11324889d47b67e43c7be81893cdb6203a2ac39942c71991bcc50cd382745104d238d3bd9a7a4fe968acd8afe70268d4d19155395ed168c2ffaca86ffb2d90a4f110984b2e6ae252bc297b3d054c84f3ecad1bbfd34eb7ca8f8435669ff1cb9cca76eb4254c59fa23c96db3f42ac37d010460b9d71b14fb3686b0f2459a785fe06a32a3eb4e188d80316f649f764a34b301f657b3ee9b2d23f12d5535ff47f4b3367427181ccc6594f2d91d48e929604951fe1840fe5b4ec497310ceb418980805777fe4bb277594c9586d58b35662fdc09254e0ec201432057c3e29cb7e490b274ae328e9b62427acd94f9b29aa4251fde1594d6c8019a41cd9dbc04b5100d94c82971e2be9615ad2531587138a31b2fcd8883b40f1254cd75ce8c92fd68c2040d13e3c33bec0c70c08e86eaaabe42f19370e3317702ab90e36146a2423b0203a58ea0bc73b3947e73f7a12f81a41a9ae0c3bf7ee1c58919f62f0af85b310274172c9c05af6d81a6d06248cd99f3f857f4cd19ca8491a8a333b1b3873ed3a74637f7a0c6448cdbb88a1ea00d3416a86369c51b1528af67a56bc4888a75526020b1e6710f97ff19bc64cc3f2736380ec89d0f5eaa00fa04df64ea33303907e7e3eb652eea347624ef93861ad295bcd17682dd4d7c7fc85f9c9d91706e52129cb7dda39f05e4e11d3282710fa4e568efc5531dc1259a0cfbd737089a6724a3d43411553498b733474746495f1be4d1e130766de1148183723fb54b474163e6116c23c4598e824b6ba90f36829053546fc4be32ec1b69fd98c71121de0dcd9c78db89539c5362a00d1355bface7d80d120c03efc4398bfc0667189a84a39c4f0b7329a644ba68a34b89cd14728a2e4e839a7206a6d1c68f35ea1a85cb0c4e3549e50b676de7cb226192a473936292d83c78e5e749fe8ebadcf73c8d6f74dc2fd5739857f6a8484f1cee4986d4356637f5decbc434996b925189d1750652ce3318eab6b4f3be3890efb4c8cbcbed8023786f87cf2bfe4e943f886016a0dc3ad1d59608740b5f0f53246db7149fa7e00eabbcb2dfe44a898a9d0b2054ce92bbae966543641c055fd9e3eb48cc03ca32b07cccce3af67bb1d01cd0b509a8997ff1d5200000000000000009471f60300000000a9c169a294f9b70129d2507f42c1d98ee853cbc953acc912af4835b1c09d76c5be072c1ca0c482e3e6505870a993441223a0d1ff05bfa09db66ea0b58f696aa19ae53635155c2ab1db986bee179f6dcb274cf65111d93914ea3cb6ccbc68228900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fc537d81bba9442a0872f2f65c11bdee42f98edff2431c662b2a0b8a763583df38a59d6914d7beafe7f63f760f14857a958bdd8a13ca5b5210d89d21557077731193c64ad82987bf0e2f745cb0950d78ee5194a1ffbad883456f5732c594ec7c21ea08edf7668f6d69babbc1ef95586d2f1fa2fdfbbfba8a428b4b9c0abc23a4032f31845f7558647d0df52eef7a3e54abaa1697cc1fe3855aa57ee51e2b54e4de032c124b38588e79fa543f858371090c58afdfb479434fd89c144f64e1a2115d000b062d99d8ed283ce6efeb78b2cc13da5ada9f425edcdc4409bc520d8198797fd3c0d168af3e3767031586c77b624e6a99ecec7f137cb8a7bbbbe9ff7f3f92a912022be3dfb545cc3f29712145ec706f7de2832c1807c359f897633a9fb1a9ef96390311720f918117be735c5cad600aac2be8ea2085a8dcd0ed03df704e315bc542e402284abbf1d0fd941b8a1e14fbdd51d7abf975637a66b33df06325cd01a41aa9520318a9b9ad470d1022e445530d3cb12ad98fbe2c35b1288ff0665f440216a87942021db385544dce7e86707a8766b70894445d47c6681e3c6936f08a37b633b03f4733a2a2d071fe6cae6d2cf9119daf3b649ea8d03ef89996ba5cf7522693db8837aa26274024453fb514dd4bebc08a89bf2cbd14a9cb842bb4f54be0e79c38a433901e00bb93e949261de3f3ca7620caa3541fe47bad6b857835b40222347cde732b021b35db2b8acbffc5eb3dacef12f3e2f503427b1dd961e7e59134f76f435024be684e6609293eb5631dc7f0640425a5937e8baa9d35a77bc658a956488944384d2d1d5872f4b5209638fe121c8bcb9bf0254c8684cc995cafbecee18ce9873eefec18c483463d32077f7d01b361dbac89f31827e505b3e04c8686d25204113451c3217d0bbbded87f16ed6ffffd7b0dd336e144a295fc8b3ee605d38cd19342fe28af6a0cb9c3d040deb66b725113b62e105d90ad03a08f1375ffb6fed58538e12b6542f08d5c2bbb7d1895e941b583612a047a4f348d9ee1280aad8270b7c785a9cf04b2cf1874fa8e07999b57f9426d77b60b0fe46ccebad723c9f26e3fe83a1f0f58c7030153828aca2900d4f2092af82002beae73d08ce4df9a466dba100e0c939c4fa783879e9eca7b3b4190dc4b369e9a244ba5995c00ca8beda3ab9b554c9493169ee6c30d0bf7ddb8a531d23f7a22d342632bb99171b91ab033603c41ca3410d334dc07ca9e57a8498fcf90f7d523188836e7a8a377fc441bf785603311f5c45037e559f47f6cadd953449f65f3ae3e3a1cb72f2d0f55cb135f3d837f41fd36e39738041d6789c26dde9ea00f86ee97f9ad9aaa608c8cb92b1038e76ce22d1e51bd7c69e4c88913a60935bb028b4ad05ebe2a6115808aa5228aaac2942e85016b1f550b0d0a30eb0285a7392afb056c8e2a4b359e1934978715a52af318a9e91045e5b301419149752efe22cdb95179ed68a8f87e795b991a55d92654dac4d64797a4c2417e41847d56a52e254fba86a0857bc6e15a264cb4d05c16149c24dff887260744b56f4433eb60218f01c9d713575ea6e7ed7995833c832f094182748b727fe4b940bd9808353e41c31f9567cc91485af0aae29ebdf62e6be98fc60f6ff45e87de1e8154f6ece4aead4ca976283997327201718d8e11c75eb2c5e6f927699651aa7b1256940429d0de3c9e974a1d823c6c311271b3ecdccac4639469e69c22103b824dfa6aadc134efa71111ab224dcf90399d37d5960f91e795264967dfbaa18224c949db5c84c82ecc675cda32e363755fecd988d85777e338b7dc3d1a1150f304300ccc56dc6b2baa4cab771e2e3f551e00cf35657b96db35b08fd1153f698fe4e6b96d4ddb4ea559aa8613540fe42de6d7ae22c8c72a380003b454253e065c5c374a54b24c05418b37a23db1ede360cdff8567d517214512c3e1a91bc16c21aaad00124ed4368668874d40e00d48ec3625bfb9f7cd36adc62fb6cb319637a838511d142e812e17396d90b2e5ef09efb933bf4aefd7885e2c65420d209cf426bb06bc4b14be9f4b73e3833c6b687a5c725e09f2ce188be3cef74fad4f0c8f2c9f5dd334ad2f59ede5d8b349dab2834bcc2b670b712af2ed05d5b649121862298e3ccab0aa09c9de79a455bfcd3a9088b7ffd0e951729d1df9181cfaa0397068f09ff36b43f561d7e002c990d407cce4c7ae47484f26fd34e10466200f05667d7a429b46166e29c0f2f1117192d0faddb28220109157e82414e3aa1096bf5ebe705ffec4e6b8558279097b576c75944b0779063245dbc44779cde1592b79e2be26cfa4421933db1f3e623199a99ba3ae13132f0e1c0274c6a3f54d5a8cc2baff7c41240a96f3ce94c1a754ec22b1f7fb31aa799168e746e599cca032b65b58926515a9801bce1b03", "5151515252", 1, -2016405598, "f59828f3889b9657840d63c25492eb704aa48509ca1864c9fc312fd36dc1808a"], + ["60d4b86f04b46647459da06067c35636dac39288fabafaa463f7b470fb36bc2c584f651b4c000000000353ac632d4f70faf29e347dda425fec021b55650f2dbd4a916b7d443a3e956b161a0e636385ff21010000000100ffffffff43833578dd53f52398ea89fda542f0e88db0707d269991a2e4b7df99387147130000000009526a655100636a6553ffffffff18579f498aef1724ac1e51c63deef0538354547717c53592652bea7d6cae1dcc0200000001ac956e2ac001e592190300000000045151656ab247a5f800", "006363", 1, -2057479642, "4fb6be2921fba3b97d501f6eb1a6b0fbc0a95c14ecef8aebe9a076423dde9b76"], + ["10288c5703834cf29b0286bf94d353c90a7e3b88b71eeeaba401395f47856733625a0e3576030000000165a4d5d4d2aee9d6e0838414c7841155e117d19eb4952fe94a3bdaa9fda77bec2208824b91000000000653000053ac6affffffffa0a69676ea453e5c9bb80745a10496fb68a2f8401a3714b58080a175d193f28b00000000060053ac655165ffffffff022ca9c3040000000002000075c09b02000000000665656363ac650000000001000000000000000003800b040000000013c674d9d9b6caa052b0231208ce042bf2f0e07806d13b0c38e2cb67890f989af5064d395548c8dc446e8fe283a3c3c08af088a0b9a992ef52c3d3fbfec5756f568a114d2cc2013dd4de707db13684d6895085213e6d217814dac064503dccea00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b05b28b10e78fc5bd79e48d3d90510867547ea7aa6d91c7dae1ecc30e8d2ad942e2b4b7a3066635bc884defc324ccdd00cce59cbda0e10fa18b8d2a68606af84c4a34d0466eebbf0006bafa09de6686bc83a35def8f2e048ab6077527098659db4557076a07d213f17103a9f417e9ad57c456b084d57150b33ad4817fdf809b80205758c64e68c6ec3ff6153cd6528dd8026a7f748fcf7d4d792772d8555dc0ab802220063aa0a40301569b2ebc3d9348b5a054a9183076f62f457da43137051cf3c0b02d45707656b17d2d2ea42e2e3624a393ed3ab9117adb4b84d9d1700b782943fcb01d874830f1454d344308ba9b2ca7a74a5547f8d8c345c8a2a64ddaa15ba01031be8ab5a69181161497beb8eeda229fc517c195210f7e8da3c07fa9aa197256b031cd52d146097d95152db88ed63e3f8358f9024acac8c8028ce53db15514559480205024edbb0548790ee6c8c0c196c48c6f016869ce6705c0d6ff948009d1e255c02095676aa64941a706beb67e397fe86f3b7ad287d65356e4491ee8cd25fc08707030544e83d1bbf25c0dcf01877e2c3e2877fa9862002e9295063c8bffe3f2868f0ab7f5bdf3d81c0d223695c8bdb547db353dd339ae7430670ab0943c06a99198de7756fb9fba7bfc06825efe8b9976d8d3a6e92a8cfd2e3a9f349f6111432c25faa58f2ad4444a9a7d3d82cdcf8444a11c16f4f706a4e5092992a3a365195f6ac9cf5d50fcd15588191d66e92c2745372968903304f16818c3c8f5ecf1d41b5e27b3622b8c33cc58bb6fefd116bd8631f05a7c4bd84baeaaacba437a9c92ff82b4fd463c5c7dbd5618e79c33caa445a8048410e277b18b71f49f923367ec4aafac4124cb34d116e5da42ce7264a094c10c015939eed2a5b0002d859c70519092b6ecdf97ae1649af8a826393f19bc60f5d17993bff85b36ab1036e503f13372d0b6592223db47d683d7456107c276ec13926496bb6dac38f6b83bb567dbb437b22a5ffebd29245e8e37f42d179f62745d7ba174f8581ff59562cd3acaf14d78f413a24d5f50ad73445362f2e1d21d11986d0b3ee877c49123bcbfe92c0d4349895537ca9a280025e486b40e4457a249bb9f07048329abf9c858012770d82224ef286db7dbf9a9a5fefa037c291ff86eced13448db44de75c1d096deb7491f376cfcb05393c6114f9efe14059b4299b0d1c99b4a1c77295faef0af65658dafbf38828bb5a1da20dc04ab25b59704716c4f32220b6efe6b94189af8fc85ceb35ec240ca4838935fedbab5be1944ffe430068ff24d672c1bc354135a2e46f1c236504f31a75719b281df963b059167a2d7353f90b1628212649ba838584aa56dec10a30f5ac97115cc078be7a71c5592e9383055127a32bbc1a86adb34ce8929a2d247d655ea601bca62756cdbc5b93aeb1b671fcc8dda3f83a194bcda1fe72ad7636c3028c8d80345b8afdefd8205181236e496c5469c152eaa9eb333ce1c43e85696cc902860b6f84ff1f12bee2b7a696e1f60d43e26848a82dd7a065f905e51771c6c5ac81bb0a7b0e013fd066e4d783dc25a208b24a1c8ebb2080947577e915e7083d21e2ce1c6e5f5760d538e441c52ad82e0f9bfe5bb88b028287e1bb147b55c2a763b91039101b7e4cf2478577628fc128a5d4966f5681e3def8aa1c5e1f4cf41089b5db8f67ae42f3d5b8756f3093c27820f8c29e4f2d28db319075f0dfde973a8a333d351636ac475cb1bf22a83ef3ed9cfa0b4aa2b9785b224d846e6d3a38746c9b9fdd687b22e4919fe69a888aa5463bca092f85f19de7cab95c11eb26d1f186cc27301f507e4d90f1a09cc173e20c197040d880dec5eec8def6f8719b8f4b0671fd9d054e3fadc69164b00a666bad9f95891eef6640f7d71693d56881b9f23abd57607d08e141c5b6c1963d3925c23d51d27473c70d5e16ef1cbe43c82df507644c9074dc74f20c8f83a8ab29d43c995a40c2f4836292eaea0de146f9856ed047f889822948cf53bc33e9d7dfabf3bbb537083e9c16344285a34c7f1d4c9fe9ce0243fc7879b7bef8f51356cce49526d0131232d0c8e7359d7cd4ad47beafde2d5bbcddac1510bb3bead69a75ec56584d360922de807ed37ad65bd0ccbd04261b53f4b28ba6cbd4865b8f20539c3d039b99f01c301771ff5a078dde0a95b733c629d3628819c9789fbbf5f7bd7c460237d09fd35c240e4886792764855ebb1a782e1d412724a7e24b867b3a0c3e4d528ef65f1381f6193b1cbaa0440f8c7bff312ecabf4a7cb6badec0d0811e2c06b6bdeaa526142f2f31ee1e6561ea0a6aa9bf59138634957f89e17713bdf85a64273438f22311e04511e9bf12067b481b6151e7d118feac09d10277f87a2a52bd296bc1cc9a5f740f1c3fe1e8b325a6907259d353c351e4e14961d079edc650a", "635200635352636352", 0, 1247706242, "cbe2cd78202a170a5e413433602577877956bd7637a13fb7cdde18808bc9143d"], + ["045e720d04b2e1e3baa4182e2499dd7e570057cfaa14f20d8a90cfd2132f6dcfe9b87e656a02000000046aac63acb2b42a59ab6cf6749995e310ecad321b47bc1ac49bc2f3aafe4d89c916cc0714d88733d00300000009516353ac6a53535263e0dd6499a80d4e93e6632c90ba36463aad347b29fab7c872d0ae0891d32b33e7b4e88fec030000000451630000ffffffffcf23dbdcea5a7f6a9c5d2f1c57004681c5d411df41066806069220f67fa88b0800000000085200ac00536a65acffffffff0438216101000000000153489ae3040000000008ac5163520000ac6a0c6f4f010000000005636a52630022b3f202000000000951525363656a6a006a0000000001c7972a00000000000000000000000000d9d9556beaeb38fcc0729203479941316c3c856df2254ffb6c1659ff07e9a51daee2be7c3e27923e55dcff18f43ec7556d29c6cd1f213019c58b4d26ed24da4b6243989e57922340b80e113f02ace304b7f87f67968a97a570c4f4d5e64685c2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ebb629a94b0719b09766934c746de6fca9585b0b2a6ba4f7533eb949114330fd5907a05ba51807d1ccbc3fd32abe1e54bab2fb3a7cd2a0813fd615cd7c5d7f70282a8aeae28699695e9fdd59a8f27f78fe2601f62c3f19c23ed7074bbef486c34ba62d64cf8d94ce94ba2cfd563a77251cf59c51233e5c99559e989c16d4f7803081a4e6e81e56130f339e2f50f20c2610d28e20be0ed7922f3820e3ccd5ff07f0310091ef34a752186aaf3424cab5ce18f36960306293c0f7a379b2c97f7dbe00d0a06221a50ad05dbbcc9a08644551b30303fafdf82ed53ea9aec4ef4e641bcacfeb4e27ec63a5a57b6c3e2debac8891aad5b6f6aff585affb55fe6cb777dbd27590324fe162ce3114cdf79365d4b7ed6653aedde31975b1bc5a5a30264c777f6dadd0230479ad6bca608f2122970bd66d5f18f9803ed34220232ef516d04dc1a0301fe031c3160df336b803cfb8f4c31972f76f5ed703434f4dd57814558a8b526c323e0032c7a0b4ebe37d513ad171af1fbedf754b045df11a061709f51eb9c353cd942560311d554c5b7316e840f44f41d77c2dd56db08e09ed14e1cbb2b423649e4be3f1033cd5607d596b58284e2aee965d78cbf0ed3abde66f0d1095ce9248aab0d8d3bb277beb84e5fdeb128458f6b20b40b5181bad2ef2016b0d3d2313f1eab2dc9a7675f4aa9b1fff897f7c499a6f0929a0ccb1d06cc0f0aa312b4a3426a39c11f6d9a71d3be21577b452064b21976417c2ecd3fe4edca05186a30392ccba53d58e55c89b9c8d74b8362c52ef6cb656746d55989d72347583ec45e32fc6281ec6502c5675509221c853c6ff15817866e72162913d7128e6a4206f4bf94021977cb0a07724c14b919e6f852ad274a0a639e91a724d27d0f9c40d439f596a938be9441c840fdf2de7b0ef2a5d624e752c5128833d1485b32a72e6e7e0790d4e1914b23266988af02d1708f0b494f482f0a8751908b5670c5f911965848bd8eb623513af27298635b7bb214644bc44468f39e71484e3d16fea5d08a0918c7eb2921b88fb82d5dc13d62cd0164a9a32d10b4b1e7720c4be940e844a3c2a2d25bfc3fbe74dd30f0a765ccf9bde610bfd95a80751add3cb15d9204467cbef538abd46646d2a7ad1f212cb920b6dabe3e11651fefaae04ce7850854beb90751eac958ddbd616cf8764916373654faa5cfe78b470dd1652503eb6291ca305ac833d69eb6c2d2f75096d6aefdaa6b381d62758335109252ff3e3bd9169c508f13d182f448936329b10b86dae33f9682c1167b093629bd7d459e5b41135aabcfe8fe378e99c0e62d43e9ac5df33fb975d347bcb657437b32b4736bc8611ec9d70ba596400cba6f61dc0d85d5f21119f95faa5168110fd642c50dadf9609573470c96c461b018ea75330d46ea3431efc66460c564ffbbd62993b2316a1eed4aec341f97fefd440a745a9eaae839d11db613362c72fd088cc365ce5f6ecbd9c8aa87c32e83a5210a9faeae77a058c71f6f5d9b0c648688989115c90f8ae31c82d624088b0179d6d5f79c7bcd74466eb7eb2b6aa825f3f875cd3aa511212ec2dc547ebdf3b2bc682225c1fbbce510a1caad5dd1a60a3fd7c59ca8cc332fed96feeaf50496ffda1b56d5ed1adcc404d9514b5b02f3293d41b8abf90d75a9cd56a99cc7e4ca488a5a88858df97630df52dd9c0a41cd6df62f6a0983135f36d0afead72547c898b111b2d74431a42e3059c4cd6627d82a4f927c42f48c54d2877ecad6236f43a4542fa581459fa3c9c202521d3a2ae7542e33cf03707027f662cb15ba08df22738186fbcd6ae73d2a89d3f3652a0e1ba74b0a39327cdddccc33a923375607cff59dbb6da29d20603c83e79fecc488fda7c664e6ca71036b952a587049dc6a7eb2a44e57162df1d4a48b8b67e9ed46c8f3a29575da18f2ae98e805949fe577f8094793326aadaae356a8c85e3447b20302b8b462094251f0031bce158f5f9c338687f11a7c392e1c1170ec55f7cefc1c567dd3086c097dd33100d4fb23c8f67b9053b284e751b8e67e42f9d0c75b7296f199aeecbdb43110fc362414394f6e097296d26b3f07d63e8176f99d211cc5d8100ebb21b4ffc6179e334f8b4350db6b9e6dfdd918f902e38b4b9e2c3249751a284335d4eec693a243d25e7a1efbd5a9458126ef0c7a85caf9cff684c7fa9ff7be0f84a958b686f4468d7d00380c77586b56a8a256950a5beccf613e10554b2942bda68cc5927c2bffd6111a69a6930fb758fa18bbba9c7502f198b7c9d315ea8367ee32f764d0ba996fafacb563b95a9f8fe271ec971ddbedc699cee49f0489b9c86ecc39dfb45eb2abfa5437a2d5279145fa867fd19decf828b37bdb90d3f3f2f88eeb07b5304eaa9210c5daabb80905edc6103730dfade5353705482e771158242050d60e", "526552ac", 0, 612626910, "9df73b749160cb1d5784083e2e065f474679ac5b05d9196c562898ba85f29698"], + ["5dd2094c02ec05f027949f6e2ad88570bf2cb64eec9bb306c23cf1503633ce09473a0b6519030000000165ffffffffc2641ea628655ab826c97490ae6575e5fabb3938b9eab6a9a7654efcbb6647fe02000000000050190f021402080400000000025151e8d3630400000000065352ac63ac65b58a57b2010000000000000000578cca02000000007af43e3166048e7cad4cb11fc426dfea9175cb908fa85adbd468f73e39be2c5636b46af9c730000f2830bf87fd6b8c07a9846e50209e3bddce0b40228da733794a644c22ec6201386638e780c480d24d4dafdcc605b632a87485b3635fdb5eb2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005245afed75a594a8f1c4f91a112b748dfac18bfdebf92977bc50dc699d73e06fdf6a184a667f74d51c3a844d832068e46e77f971a1c8d4f9f6f25a87f73d6c5748d43fa1c6ba6b117e70f2ce0f8f6ae3638aa259496364562cef3b203f3648207ba99344cb2747df5b5ac205d6d66716209be90a65ad3050841305bfcdd59482031c51324a64d2971b29bd83fc757cc33e67f6c1c5b49f9b4d707f0d5550152dc1021304dcd0f2717f3accf13c2169da6d8b7da36f76675a1d62c4bb14f5639c8a7d0a0632fc864e383bf6ab08e8fd23f8b3ed55fc1a7a124776186e861c5da282dbd33559dc087f3cb83753cd421802e8bf41bc77366b7cb34f3e80205b0af1cc78220311660364ae4cc7e21ff77a4e2fa3fb90c0757355e1aaaece2165d72d6f9cc5dd020049ec1a851be6289b1e08d177731a1d794baedb3a2ad7c345562e4de4d10a23031333247073ff8fa235c238a27f6e3e596ff5fd28b0561f74177f4971c0c77e85020b77f9fc4a02324d18f74a75e05d2a0a05eb39d77ea954607f9ba560f7fb2d13021b05194fecda920ef0520526f590a70ea7f7097f887c43c0a09b95c26eadab492f9760f3d3808a6889f8b91798ae87e81517a3a7de3365aa02eac416842e0d41a73bbb5a7522af7daad45b51fb43f254131ae6dd464f2d05eb8ea3f6f1c21b9e4339a00d760413f107ca5185e2f33faf8bacf457928e343e5d68c0d35cee6f53b9921b3a8a46996b20d2e614d6458591566c051a471aabe4ef7514312cb79be7b8c6865eb139445f888fed2cb099a8f7d606b97b91c5fc14c83c91d9f6a2813dbfe4f19e272f6de62bb674f12b5283a3a99b09ca776e69c870eb19f6b70c862e310065889557bfe9b677de94b928324df02d755d5b6800b3c930fdc0526e4cbfaf185d8fb762f86a0907d1f86772a22200dbc9934499e3da1fb36e1f375d0f56da2ccdf88c9d91da02ab4a6386cb86d4ed7a9798352cd8e4053bdbc4319beaec42426a772c92bef97c0f9e9ad0c6ca4119ca9cf19c9b771d0e0ac73726b7450cefac436fcd97c7b536208f92ead38523cba50d80ad09cc096f99e4b1ad00f9d95e4effe8a4deb83cd56a0fc022a07a192acce63f63200172b842ae909453201e3b6e42edcbedee1eadf1a0aed83fce478323e4746611d50a85676a5a2c4409ba829f7b0fa4d8d8e94c017f3846c98706ddf7e8a8ecb27acd6d1f83cb2d62b32936342e2f065b79b7766f7fa55ea7fc5808d5ade982843aa5853cf00b0f475c0abaa2f9e17d11d0e6524baaab8052ac893b42140377136a62f668ab94c2911b41196cc3b28f6ef94850eee594cf325fde6a64b368eea5a765bd2a45bcfa2c6b41be2fb7b31eb943f9e62b2cf7da2c6799f6d76845fb259de05c77b715582b7a62987e327c4bddfdbfc1beea9e53549c36e0ff987e479c32a7fbc875c1698752bbd29e21566d466857f4fb38ba106c9dc790fce71c751716f910e6b908a860ccd99c73b836fba9d951a8dab5cc0ba7ba703571abcd34c00af6079ab82e1bcac7be3d897ea9eec9f3a80173d7002e368634058e51be20e72a0c5a0bfdffe55612555e8aac2ad077566f12cd8b2eb3ff75fe5f4bc14282e7f574d5bce754eac9c774cbde497954b1f56e8d77caf46391eb4520af344fa2626c5cdbee38f3ececefa7b844f1f40da1532b1d7cc9861695d24ffa9eb59480dd03b1454d6cf092c463b04343ef3900ee4f6e34e31ca92df0b7cbd04a5c97a838dd366fd04eda502f16830be9410dc78b27e34bf6622e67546b23ca9e04686ae8dd89c94823c82b1073b4ea2a9c26eb292f78c68d59d16a1ddb624f054223a181be357ab90c2969705f92d3a3d04e8b4fe653747d14e5fbe6ed152218e28f3208aba495df5aea70f4cbd9939587a76c2921f4eaa55d569271872da657e80def2ac5599cb5de05ba9a4ebfca86fe6ba02a534f232b28a8b3075b27c4496243f487929305e3b4d151a256a29efbba799fc02562fa834dc4c4d57258b17c6d80286518c1a4d518611fcb96e7a5e2abb41eacf0ee57d588b8ae82fa49254134bb2e5f5a50bab69b1c851d683c061941f7d1ad64210c7d21a9564d99386a6c8827b57020a78905fdbddac9ac4e2d4d94db5ab1999132330eef5dc9e4125d7cc6e7b79a1cb176db4a3f50d191676fb73d3a8b09058e5ce1a3a691994baf0bcae8b685ae05226747d6698d29ee2b68e57c2614bc933b63565cf8d67b0ce15fb23d2bbce44d1ae6ffdaddf3de34120fbaa4fa19d184676e4bb89c849c85d487629f8680a7bcec9901fd2a82d262575f0ed12bed0006ba15914b67373d3a37234298c88e769e15d0fe90257a037f1d8b9ab6bbbdd5f15cf48d78877b2385a1143a6431ac733b6300c78b22992280c06d0c2d6804ee04bcf3bc749e6431d5a18701", "51515263", 1, -893801797, "bc32aa08b2735c946d8c88f2d3662530ffe7c73b88bdad51243e12bcdae8a492"], + ["65813c720455d313ec4d8074f77fb5670ab30e4cdcb4cd20b41b60fbefec5b5ccf4a0415b60300000000678aa31c362d3a93dbbf3492ff25e392d3b9cf735b55d3997d27fb789869920b4bacdc580000000009636a006a516352536598898658f5103ac249888cb0fd3660c3c47757736f617e75612e2c96b887c4e581a77051010000000165ffffffff57b576f28b59feb607fbc98e50976574f314edb7635206bc06978b16ba8037da020000000663acac5263518792464e0298980d03000000000452516a0027fca1040000000001630000000000", "63", 3, 1796291103, "69fdc980921aba720feaeeebc96d7a0a3a642afb9f9abbad502db9502d077199"], + ["c8b3024102346e547130029fe8541623ab9bc8413e1ea404499c0afdc0cf07c399b53c094502000000085265536a5363ac52ffffffff1bfa319d2e1c08d6a78c5e15cd63ef9c010f377341663e4e85db4ce57e0177ef0300000003630053c97718be04f77ea705000000000700656552005252b43fc10500000000096a515152acac6a5263c4c00600000000000165f91e2201000000000253510000000000", "520063006551ac53", 0, 122318710, "8a82ebe3e2138799a4bab22b954aeb5d6475f935c8925a0d9b2a53689a028562"], + ["030000807082c403017b2be0e9e5f8dc4351882f704d8f5408ecea397c0b3f3554ca3c7965c2c4c7710200000000ffffffff013d7419000000000002515100000000b13c9272010000000000000000de9ed600000000004ba9c2e54981116881ec8b7965f07bb225beed1f1f988b79ea94d6024f1d35f124cc501a7db84c5efff18724a7b70a68fa775d7d7483410f7c70f137d716e58252f7ecfc9514ec0b5b8a48ce768dc222f0709f1ffe185f93cf595ed342e481950000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045e6d8c1f9fbe3ef44adfb6bb71a78402cdc16a89134eb718c3ca8b41a8476ce99f3008151f704b193e81437975787bbbf7922eb904e6af1c8247e60ce78fa8f181750d60fa1e4182f1e379fa3cd6e12d15e0e2b25a17ae691f83cb01cdbe4d6a5dcc29075fc2d38d4db1e973bf42fd1f1858a48d735d6a9a1696b144605f04502239976dd319a3ca81d4f2d85935ce234d2b79969df18ec2eb6dbf9a07728dc43022629188cb2ff4743230c88b68ea770269dc89ff604e5f07f339630214cfce4970b02dea89e95732751121493308ca8455991f76ea19166684cd5819ba02e325d4c804b7c0baf0c887d6951a80bb9c9fb4e13f3f410965cfe6e644bbb0ac6c903f0022b96cb4b8d4ccddd6ad2cce58f28164fa6ea3b19203b491cfd0ff224944c214102027bff6e8d85cb036fd913c4ccb81cbb989da5aeb875600e62f4d08f5ef93065030d0b80ae4f593d191d10645609c9b7ce9e1e25d9a568b6f517f92c117f9ad1590307f890bffaea1cbd9f2d8ad6328aab83755524eb7d6657c947cf69af69bd54280228123b007704b8894dcab24d3de40c615e21ca6cc983b3f866c22298538675ef7b480514d431555a55eacc628905fb379ea50fa991284fd60b848719565c57a6c93d3551b53a2841b996582b96f4516ff55b234ac6a76afcebabaecc9ffd4ae34823909d1be9d5d733c0ef6f1e89a88266df0a7a3d0e03a8507b07cca98f8ac4d2db4b13af70e9acda445fa213e313f0070f9f15a1b1c894c557f41403c90c1d1c3461fd08fa329b02bd665f48c09e15978baf5c105bbcdaaf0a9138b7f26b12876705887d8060eeb3842bc4d2744fedac20ed89490887dae71ae1f1950538d35df91b05a7d366635d04e641a0dafe6cf0b7cba79f624c0f1732783b8255d0c103003f51ccc93dc160ef1f467f25cf9a171235b3bab24aae2c5aa8f004991643f3eec6bd368d57b00dbb06a595551daf7bbbb75ba5874defaed5a1eeaacb89592a93889d08f7cf211dd8c54d3f017e6c8bb7c7a345413b7437a51af3fb7deef178f4253f911d37d18fdab3163f5778a50e0ba6847a969a754621a320d35d70d376b2395e65196ca6c5115f450cde0380446bd17322f8d352783d69deee757f68c1d313c93ca994646b5cbe713112ad69005caa1c7273b23064666061da46872bfa308ec0c278274122b684f024390bc336cb5f05a716fff099055ae9a8efe6c282e3608bf97b8fa4b5ab38563a3939adb2f69430b29faa3cd3c116535bfc7526d3797c07b6598e6f5d470bcdec40b77d2180d7c1802047096f36ef52872e34ea73d1064a943ca18c9a08b9050695ab61bb4fda67553b909c85adc9295d00f367ec515362c8f69ca99f3300eacf6213abbc486f39a11c936bd0a43b52dfa8bcaed63aa207fabe59f808c1b3c1de60134ef5ba3ce11837ee82ae34286a4ff5a2802fd3a77999fc3b7975a272b27fdc966e0abaa27eea14ee13645443b8d4d68e73295d2f183963fe7c6e815f6d22eef165f15905555afc1678c1ad2327a8ba8c8edf2bfeae8690f20ee241434cac4bf9e8b19bbb240cdcf43d081a48a3a40d90975c2b9db7f1f9800e03dc80204087902ef665ee6e9065663482d2a39d2d26da374e6efc8283e3d805a614d89deb3e6809e347d71cf769db5a400d5ce632cc6335fca7f374e2410d4dbd2e123ef8498cddae21b026c4d48aa05d50cbbd1e1c9c1268368e9905dc90ca6f2273206085809802e1acd7df117861b4dcff785fc3adfc2bc6ca7295863fd9781b1a033dd21618d9a3f6bc0de070b0aeea39e37fc61e6f61451a098532fd136668c682cc14edcb9be411062af7fd52fbd89bc044bccacb6b4dc813087509a1f412404ea033dcabdd307f622ffbc363117506537a0b1a5425194e121737ece8f3d1d921492ffe9cc981d447417eb5925352c4788c72b9fe28beb27974af1779f29102961c79d351d766881466a4643cc747c9d4482763e913eab0111df3ae8589738cda7ac53c4c357f5751e1118f6dcfcad7eb9ab3b42cae4afc9b071db63c9892bbacca7dfa0c1394ae611c182c88c77a17be37610973b306ac89c64629f2d6785cda179aebf4bf7830d4541e8e613623624f59a1e9e264565e59dc6a7034d9fe14dfe06058866f7e7264f21b0e4e22fd7a0e1e5accbdef2eef61b30733b2aba6a210da46e9fbc7e0ae987c883a6abaa5fffb5bb225dfc397a48b67a5574f6d21c611f7661191db6c04e96920e22afcee56270ee30846de3d5266b882f3bede8bd5361cbf0f228eaf7e5edb18d0c20628c615e2907546a32a8b53a3ecb6d815ca2fe595165e304a2f703aee494d9ae8e57e629668b24c00f4e3e87a1405f1e68e7a5f2c20f94e3e41b590dbf344a593a025086775168582a328463760ca17161aec2f3754de3f6b09", "00650053", 0, -1934303442, "f1bca49bb163408d00c331617e4adf6f40aa5fed96fce86f1641d7115deff2f8"], + ["030000807082c40302b87729e5c89d75be6aa1b778a0404af547da9b46d680ab0b17e684532a9d6b1100000000056551636a52f42b9f21fa29ec6232e30a6799c209912b03787ee2560618eb7ffa57b79a6559272a059b000000000300ac008feceeb70256445d050000000009630065526a65006300c54d2900000000000151000000008b40b24803206ee30000000000000000000000000067227591961ae8b9a830f61cb09b444325375569b46dd858a79a4ab9d0f147d7cca2668656ed5485b15dc137e15609c88ae6b6666955b2a812e76db2e31ebefe3edda574a581c402b4f82693a1db5bdb1cf80192035c3029ca4b9c222566bc9600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000821ba9f088d8da35234699af1aaddb78fed6db2d48cd990e1cbcbce75b86d74a7723a73df2c9339a00a5a3a217e729c23343f8429c5cfb6f1dcb25092991ef750f3258c877e9786c34dd9ed371a3902a9c57c539d3ad94cee38b75489c34a2472656d55f7c2c543299acc31c208679db8314ed4f6692ea95a6af259e4b8dd637031408e885ed44aea5206882f24f6ab78c25529159c826a6623de9972079e71fce0224463e777bf303967c5f9270ae78e12288e1f4151cfbb2ce5fc009fc26c3d7650a023003d42148400f203d53fd1eb079e830c3eb683e5c9583431cbf55ebbc5c769ffad410b790754f03f16817a59bb429ef9d14f931b3db8f0d96c4b3ec3009930329f70d44725fc79364caa81acae973b7ad69fc1d17afda6fc4386cc7ecaa23a302025fe9126cbbcc1759bc74b9eca2e3aa991afd05cd6c77fc55b7e2881f0a051f0207704e0d0ae3ac338ba810787e691fd55f52b52942c68cc7cfffcc92a79f83c60309967fb7b8325e8fc9504fdc3ad9ca3fe5e7ea87c320693619f30953efdc163603096d04fd2927759802f016c666237b30e0206bb47daec657d448248204787aaf79eeea8246140a2d213cdb363de47dd709c8b8c11fd83dc4a24a9aed27f99eaa06a1a3c1655bbfbd56b347e424574716eb7a4f8814cc4d5418093ac8e48da3d59f9b9e8244b6486ed5a1d8d1ee4ecc4b16cf5024083b587c64521d9831560ef0045bf70c96cdfea7ca4b24041c56cda51774b5a17db133f77a6222076d6bbe81e5159d9fbbba376f3110466e4beb16d5bd7210b43d195fb1985cef72406efc6afd8c5a25d845305694098fbd3e152e9b671736f6c0b41f0ed0b2b8c2c1b02bb37371e50d72aae00e42520cf09535df40ca59bfa82c8b971b360362f2068dab2649c2eeeaa1bd6c6a1ae95902bd84262afaa6a77d962b75e6cd09f1ecfc8cafcdd7ea2935ec5c2230ad91357dbf1eafdf4ae9b9b966f1ea120e5b2adbd3a263d2a07521bf8b193fcf06f3ea53e7ba4eb328cc1d67373c0ae84f2198be2e1d8c2567d14315a746180b26d28505113c4fb11f7371eff18ee718806792836b90bcf5fd32edd3e0d0de06b7957d10e8e27dbdb17e3e20f8505640b3cc38be3c4ce0d0aecb808ecd312fccd3f0bc8d4315169f7c913edf639e342bcb68d6c353dc7837a46996704e7e2e50741a5eab8cfd6d8ba9611821678b44f6cce0ae18ebc176a2e20c5804fb926f403698d071326e9e1f777c8a39ba9b4e651963597d055c46d6329e8ff965f5618660f50c977c972b7b39a3c6d3390833edc4dee63e1445c85b2ae051f815c5b28afe5dd1ee17ee4d48dde973904698a312b4ce859bc94e1d7177a0d396a9edb98be40128bcbe1b9d5cca58bb416ae957dba4d306e6b9e8ea6d30596cd24b9679ebd84d74ac277e06f7f844df47d3bf2d3581a43feb666184c167b09605ce47c4a2c16a2fdf618aa003ab85f5dabfd526756d467b02131930393b30b4f55a709345fd4429581505e86b97d7fae346fafddc27be6d2bde32614645516cc3005c9069ab1e5374e9397498ffbf54eae59464f2fe8d3a0d2969c51fac1bcd8e0c57091e81965f913505775219a7af5bfb30620ca0d9a0bd0052f6109ccfea1cf41cb5b0d66f84f6d92a64bd6d79cca4ee8db308508fc0707864fe69e0df89cfe5b727b74f392c87b11676f3e4563eee36f9744a7f5ce30c2e1363270606491792634cddc5e4db51ce1a1ff817e127a1c3581d0cc3b00031fe68b7a3d4532ac0ee0252e2b175d2e1467064c40853208e4a9efb80237ee523a4565a3bc45b9c00047c6aa434c66d90518783e28544be282aa6da715a495a7f3468927e772a4ca6baf7a8a25e7dac691dda5e3e1cb7fd7078fe19183504d299d5e84903ef7aa41f41f19c04c47fa6a2c8f69040c4e222779c94cda81791ddfcb0193140ce56627627ce3eb3e4bac923eb25972d9c8b529efb50f2b31a4e485363add19b9130c89d381d41d9b46e6702899bd70a57b54714f907445812c8f65da5c7b7315f2f48e96877f600f532cb934083389b686ed8504b8c72f8a7acfa611936b6fda14ee2a3005652c3356488e1e87a52a451cec2bbd6b829b6cf80ee22d64a40dd8c8516f4a17925f0275ce603f6e2d0f0cf13afeebafa46a0f90e16b0573b33b368ff5eadfef7662c461e779f2d06d24bd5649e4ae2778ba50c1c03ae83f87e4454d3b1c69ec8680a412e922d97a1ec2b6ac330f78d9eb6b3a99b899534d1d4155d03a5b35ecf198a19d92e5bdea530bdc8875ae949040000000000000000000000009dbed12cea685bd641016154cd79d2fcdcce807a2e852a9a4d6f0e510aa9851c9ae04ec2405f0bb4a1d6f04b5128382a5a2da18693d30e633b67149f0f872c028da4ba352aa9633f42f13286f7c087b9930aa22b017baf201e5870c09ab731d200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af9e28a911821b5805089326b92ccdda769fdd088b5c1f9d1ec58eb44923cf955a36935195742d91af07319c4e7df7aca19f472cf280cb8384580f4435467be5aef186f2c5fb5b014aa74156a26b8af76e70bda92ba701c96f1fc4b35baf4bcfad976bbf96507d713222e9dcb676a294cdda8f55ba2372aa9d2c00c81eecf74d032efdc38c27fb106b531a5bb485cfeee742c9928fd59e2827f42fc62e38b19bd50203bf4450bbc3d4a22c1c18d5b82ac0b12b1a1c244defea8165595e6e9b2ced750b089c08c0c05119e9f05200d73fca4e03a30793baaad8c26d4a190d927d6080fe5363bc2d8bdec9bc53d70db45d1fa76625c054a0bbd122ebc9e486a10b5105ff0307721ab0da055fd2f98ab4c87f004493ee79c1af17cbd51357c784fdaee5aa810300a36a75b20992fbbb91f9d2632d16ed7428fa1f7a5cf4e0d43c91c95a620d5f020568ebe55d75f3c14af4cfa5ad333067a22c29cce52f2765e0873313f62cb156031e48bddbd2145622809b3946fe2e6b73e9cd785632a98116538e66cab42ed2370302e856addcbaa86c1e9857d7387e88c7d136d1d21f0f5ba23315c98e16968963277b6166e5618f9c0302ad0fe6adc46956e9d6054ae702b943ef677418abdf7f92944f68cd769e9d8387964512860a76078826793d2fd3cbbcddeea9b5db78a4abc7f47474c5baddd2d65da2e356aca2f007aece914101c3f077fe427fbf632bbf77907e71be20b21550b479527a5d8e7536ecc7e3cf89e85bc14ccf315a43509306a399941e075b63857c36839892a32ff0ec1ee7209d780503bee5b8feea0def255385dbf518ebe6d9c1341025f53b15c5e4af4a2fbccf8fed32ce38e9c009f998f6e976b691d2263270a4cc63f37cdf5d01fa9109ab447f1c9ec4cd897306539a070779ae9a971bf045368fd3bf33e5535bd81fd58ae6b792d959373ae6f260e2db2673d2be7c73672d589cb0e0887ca03839154d2fda6727e9897ae4bafd226346be1956c829cd56cd35fb5d8125c94f0b17d20edaea1287c2e8a46aa49ef33f02276a31678bd5418d2348ecbad7fa68de359e2fc2bb76d27694641a9fdcb6cd185f36e8f18db257056646936444bc12d7da78b35ff6740aaa6ec7311cf4207ce8eaa0b4e3e82c30041b0712949e2515aace3834080019ef1a7154ffbb5a8d275c1d4bd16b6175522f198fd132c1fd3377bfc21595796adecff1bc910844316bd2cab5f9eca6acc169f8c5c730b4d4716c2da30c693fa09766ec8451846f9a8479e05dfe41f040ac44c32b2d116019f6846682a9d590b9e4437422618548fa666bec040f8884bd1f3a25bb8edb569058ba1fa56a799905d1e8a46b4f298b531ef9ce6901980f4acf6813330244fd7cf6d8e424f8ddbadcc7e2f6920ec35a71ccb0a10bb5e963a93ef5bc5317797296d9ca9ffc7a6d113aa94a286cb33f4df29c1efce4559977c4cebbde42f1266849055b769b8d740e5adf4883691a9ecb83457f7ab75ae1e5368da5cb78b8fbf2f37cd4afa732a1507a75476c2b65dc70440f41ae4142a75e900634449f2de034287e2bca631a0b6173aac4a58eeac321ffde929506eacf993ad090b729097bc61add3818a65a51878e215de2da0f9dad38cf22394e6c325df2175967048d37caa56af5aaee5c2116eec7d7bc4f0fd9503f648eb9e9af4722e5ed72ba3e753dce2c83928c64a19cd1dd82dc3b9607405e53b28c24234e2058aaf907f23ede6612e484c2c33bd37372500af3512d81ac253d5e47f37f0bd777c71a41cc31b82931d30e412816b167a281fc029ac499cf7bff362ce2b2074bb45f86afe029ca05611581574e9717b8d492d24b3169f629a0c284521e1041a55bf2f6a58375e3d71a60e379b0b9917556ee8384289b4b73a6c74108bbf1cdaf8cc6d3af2134abee6a7bcec373583b4acff7d91fe401c43eb939c8c33ab03b73c271d7a90ea59c42cbaa7c07b4f74238e0cad090c99015498849e9db0d8627d5a35e93716eb7bf87466be66950055c7da902892eabbf9ca2cc06559b07cdf5698112987a21c7665d6e1ba8e9c1df13f9f2d3426118a16a7899eb2ab4b36e2c5c77e78769559ab3e244a0e9d60c6641258b746cd57acd00a54ddb27ed2722e57350904c44518e403bbbb85937634db7ace536f543581a77dd7d63b3e886e1ec7a80fb570bee5c8ad27c1562c8ff4b9a8c2c6a4e0f888317055b899a5fcd6a528b453933ce94216e1a9e5763fab81c5876f1122b6b3c7b037802e1b1bca3f0c704bf8e6eec992d1e1c6cec660000000000000000dd58ab0100000000a4d63883132abf00efa80e5a523ca0d9801f22c6e53b5f264b7781ddb30f405aa7573d9004543d9b763642fb6f4c845d10f3628e108a9482e38ad6233dd902b928e991ae4b2e0b76ef5447e03ffecb0693c2971955c4af5c600c2978f16e726600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c3908f7e06a0f2e6355e57845808a707ecc2534971524313bba59da34f7364fe9e975175a1bcae8a9bab088122b312d7fe9d48845ddacffc447c6f00fab8a2a10cf779b78e2ec889d505c7da2472285f9440b34e08fb3686b5451689d8620ad5e80e3ecfe4fa768eb1f3c1e2a40476e7b2488b00046cc41c936ed78e25e3b931032c729ccf70b20c8264144d60c8353d1a9d1532e4af549200d9ea8ae49a0961a60309934d3de5c879120647ddaffa5575a9f022ba219afed9bb6731035b941908300b072f7e0a70fcf071c72ded6767013319707f5e228581a6a812867c7ec97864cd173f47ea55348bfc2cdaee18f2d613fe3c644a8ba5840ee1a97b06dd4d39e8b50219d035d7bb33a5daf7cc56124accb8a5b7b49828bcf2a8a52ddd33a7f23b63840323df12f4797a1b1e7494225882778685b86aaaef5658c5aeb7a12dcd20468a7e0303b22a5a20fe7a0d7e59600d9bda0230d7d58f3761adbe62606a3d3bab406689032dfdef47b9561a955efb501316675a66b66f625e94951c8f031e65c52a8dac450220bf6b2254e0c2c9a2ebaebcc364410c0f9fbe844a664e48e1ecd59529ebbf324404b0e47709ec3fafdd36eec68efc844bd066dd9ba529d1ff1b3b9ca559a501044673d532fae1260afe61613e2a44ba886e5255dbdbe8baf0d368cf615699eb0e3b1face1aa42f6fd1a264c148aecb9f659362149ae2715a0b175c6a4900bf73677cbd0cf3b510135e530bec8d88537a3535e72f9ae92aa9d14f1171e25c244486118e687cc9a8009cf6f0e263cd6086d4e7db283708fee365a2b4d3b3048af25f68a80aff096e2ffc5364e1226e05aba582d8d9fcc1f315dcec48bfec44f62db3bb7ff1a01396fe74f1dc737faf01d5d39e53a2fc6d8fc8546c37132d85ba2270c989e520860cfe7ad6c2683c95d19debafece62ae917aa73736dabc277d25e1932a99a8503d052e6842b09de517ce3eb0a7ab471e4a846d8373075ccbe33c9d7eb6c9ca490b6175f44f464104779404b5917b1dd7ef7a46e3db627f7802d8bad834d00f3c94392911d9a12aa1b112ffe9b4e51484b1c8135f6586072726cd5c6b2af31049dbf917a64f763f754b80690a3d401f26e6090bee24b1e0711d8eacf8c6424ea8498bd806df70d1e31af059c216257353b253bc92580dd7d3533c8ab77f4c6a1b5bd455be8d454f67654708afee5b193c29d061204f93a285697b96d8ae3e92c5fe98c106ad2f2dc627c47954e036cd04212b3183d9cc2eab8ad3ceeabd41957b06c3fb99506b6f1304cbbbb1c8547fbbb689e6a25bb8e019242db3ce46a594c47e51612379f7f99662f3d9107c9f861fb6c03866c37e645f32db3c81ebffd8bb32d9c2af58d5b7a0f138c871e4dce7a005bc1b0edefea09437c6c4f9bcf2d32c9cb3504257427952ed79dcf88f47e15a8d31a76c573a912efe3691b168e8a712253383305a814d4a2916ec034a07a6272125340624102659c6f2602f372e2bd581e57b0bb16bf6b282ae41975f0ae6e53245f83c810d52218c68d81eff30785123a1163cc5cfeea387eeeed55f45e895b0fa42a39e055b5bac750c12cdcd0d88ec78891f8f866dadd08dd3554aa3185c8489f0c999131a9b2c049dbea7214920c958b74b04c4650db44b08388c85a75c2f812e4883e8184cbe4eca58e230cccce4aeaacbc01839960fd5ca21f17591b3fd8d2d773916ce96ffadca9cbe8c66d0d5454a0b6203e33f2892de61424f887b21e781e4e7ed19168796698358b789d42ce0ccc1e1a9d6f82ea3cbb98a0179dd5d81d2e54b93bbc64ac1dc65e298d5b8cc78f6cddb9b604e5c914df3b191fc6cc101f5b7c85eb94f6be78aa1dd525a0e36df481b85bcca6e7110d0c6abcc76c8fe50b0c5d205546576d1c11fc37afc7621070ec9d81768e8fcca54fdc302d371b1f26a92c146d99e9118d15f6201d44e9051d09de59dd66001ab4d5d786f416c0da6cb9b257873ab9aca852fc25ed435cff700a078a9c17946e70f0047e4e6af8b0c93447753708e107fc9d0eab63cdf3dbb19f9953f46a5a1a7a880097522aa6daf15c0ea97fd329c1f433b0d3013f0036cacfe2e8fb281c239384a5ce9648b3df08860a965dd1310316cd996f2324eaf30bfa1f055dec77e7a2ce6fbb1913d0d7d9ce778f0c8672d48a9eb357cf55081698c4ffb5a6166ae3226ff428bc0452d6ad25b3a6b0ce18e4f3d94ae5994f92b5cce4e41e0d1814cc6c69286ceec99e20729342cc593a4818c2e9edc43b67cd4cc2a338d5fd21da116aa7a8291c0cf1d5baf43028cc3cb12a03063dac2243cf32bfb6d8caa58f5e2b2e14be5e779343150189cd90e4f65672f3cd6f801afddc6e4f95bf80b26f34050172951d8a4966842dc79042e6c0fddff258aac26ae2195f5c603c6eb08422ead1b08", "6553ac00ac5300", 1, 1552569636, "55428fd9026c9f156ba610383acbba1b50217792170795f79072c9119322dfce"], + ["2584b42a0456187ead17b2d92e39b74939e6978966855a5ef213a544c851dd87a4bd01d512010000000751005153ac0063ffffffff306f7fd929ebce7eaefa0db685682797090f6eef8cd7fdc9a024c573deb07cae0100000008630063535300516affffffff7bff0cc9d48cb7f7590170af42df2d49b65e84d9cad87f733001626e6abd6c7502000000045251516affffffff752dd671351009ed15e4ac5e711badbcfe66689eb1155a86e53370a92df1a72b0000000008630063006365ac510172b22a01a96ecf02000000000000000000030000000000000000cc68fc0300000000849a924f8db9d6bed25f649b81f8d8495a9d2857d55cb622cd05f77a3a35d09172990f1b49a26ba8daec8701d40cb4907ea3a3a66166c048190d8c536b3686e5474214247b3e8978c74acd17ff8aa9bac8d550b18921d0d23cfab4c46c4981fd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020980c52d14a38247bc7f5b7d5f7d50607ba99ac069566e2b7f47082a93963102e7a2fb2e8d85c947700cbaf4d3afbe8ceac9e93b73292311828249f2ad8860159c12c339fcc2ce5cff8ee4b8b63a7ec77e9a2f90e5a6dca628e2de8f1716acf79495028bc7835f8155de24e016917126d2b8c0bc8e5a0072e7683151fc79b1102177528d1e7fd126195237bf81c8606ebb929737291bb72c8b85293f682c099c6022425c49968a07c7a97a95d6f3d7a4437ee75914169d2c9c470cd56343989164f0a083f4e0e57fa364492f1f22ae5b60b634c995005344938cb29842dddb5a82977550ddb21039b90c3efafb96795375b5f56b7eaa616d638c838a6f50b09d6dc3a0210c3367b65715ac38d206ef8d460f91d42d21d1ef0613825e03f41c6462edabd032b57ecfd1641fb48a52797c2238a658172ceaad63501718d91ce2294d686e9730225cb9f62a213c957873dd2d0ae5340aa98ef5aacdbb96a6d0671a9f49ab5a88003251633efd36a15338c01b3c35d23e6d19bb310a7882a4c769eeeeed716ea6b640305277dcba0aa61a76208348dffc727008217db3b1516fc3665682ceb35cacefccbacd27a2dfa3c363d72c35094feed7fdf70a12cabef15ed1371651ab9a9cc64927cc3e51a9422f92a75c14bfe452cbb17415f9f0efcc52d5e432ffaf8ac024bf6f62673973dc990420ced0874c5f7928064445d9fcb5172bb61fc283a2a3483a4c2c1cfb715d61ec8fbce8b2889fb9074e79db9b45ede60926737908dc7f638572d18a3c5ce06e26b64201862dd3662b1447a4f3987baec7b136c75dbc88bef7f2d62f4ef20e5959ad54ca59e228671dac0b46df176de0e22c314e96ab9dc44de4552ec256c4ea40facd91fab40ad7c1a908cc95e56d0c9d4961b86b64d39014415ddebd4d42ec3800dc37b6c5ea52c1add0b875e810eeef1b9fdfee1af3cbfd23cceb0c71e5985afb131dda79676de45cf62db7498fc8792d587a548ce9a27b862cb595245fee79fba5ae0a058a07c0fea6331787ce7ec0fa69dc7c053563c57f8395a4365170f22546b0de14ea1b442acb0f6012bf7fc30e6e44e9371112c621780daf2ec586b54035fd0a9f2acf3be1550afc68fb5303abbcb083e16f889170a8d0f56c48d671d33ccbccd4f4b11f8fdf47c8acf5ec968fc608f97f49364093da3105b73630d75f6128fffe0a9ab77cd0140d8dbc8f6bc093114df237aa11416195809c020a398c630f5549d410f178e8eb468a5a72690eb9b71f3a2a7121fb920270dc9c29e774ca6d74666a902b066d244c31d30af1aa82e2a784e2fc9f64208ab8a88327e306c0313cea5cf495cd13df8e94d9ba6bd51743719210aa7c999957963ce807f1bb9475dec9779bb24721b86e4e82f7ad9ccc75cd0d26257973462a27847aa4da31fa8d8f6d3aa87f8f81ffc051154e6ef5b435a8ea13dc6e4dc796203e6243d6f31560a6a73d4545f5219376dadcd1a30cc675fdc95328b51d47e420f3cb0bc1c4a441fd4daa2f4ac8f987fe7b276d8dc65e6f47936896e0d7a6a7b1b487ff5e4f2fb4b3d10240376059819c7f9b84e341be80cf4b76a05c1c86cceae36c8400889379e954dfabf9f88231712fbaa0f5bac62266458c5d8f982b85b4ea65a3e327366dffa0d9462950ff434b6850c82feddd0cb79b8194bc70e81253f3a68ce6a6b3403a62e400d78b84dcd35088b42a726f72d535fd9019dc17147534f3396907c3742d8a823997c055cb1922eacf02272cf4ffcdd6069f2d119b85f20cf3172a258cd042b589937a3979d352cca236deae6685b7f29bde7b355cd8587080e2673b1723aa51fe6fe17e2cf3d13142e86920937eccf67bfc9ea38b2196bde231df5eb0bc4f6168ed2c4236be18d352a813d4580a9aff39dc25e5a209d38633da7c74b02c603f6f2d014f9448a3bed7bb5f61d9f2f56fa833acdee8b6cc8e910f073a7efda34224318d8979c45ac962f5a1aacaf69c14540322f9b68572002767e36c77eb45cc2b69536f90b9ceb41c6fb211116f659fe4c13a0bbe4cadd04dadc4e319976794fa18ad03f2cf8474a1c8d4bb0a6b9f2270fd36a70df10926d39d1a0e9850862f2ff3ce1a44c4e315fb0a90ee02015ad6f3106d99efa0c81ca1f3f03b98fe4920bb918e3df3e361a51c082822b6f2090a3966342eedae739f9b9116fdcf3835c7a81db3044ee18ce94788e84876c90c22b56d93946c2a1d7cbfaaf6ae476963e7de885790cc6540058ab0db24b17b11977cc2f143c3ae54e37de93a606af396eae86dbaa9cc77202000000000000000000000000a68926a0597b35fb29a1088476d056081384715ef957b0b461eded90edae2a38a950537cbdc65e2dab73d9efe0e78ce8cbc4caca5ebad66c4ad3a39f01839e50c46a929ccfcc63f42b2caf2df4508c2f40eabdf8547090d0c3082ace7441ee79000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cecfaa6f3140d8174bf1db101e64450f6ce2d6691010ae90db620cb0999f7f6a77f9d57c6c0262118f6acb70fe5074cdad339cf350751ae266624e2b29c142061675308dd78078a086cb56f54db1513a9a9b2066809bd791f8964233fe6cc62494ec76819f378eedeed2e1844daf0d4277a6727c7e3a27d061aef570ba6aaa30202d068bbf14be4110ba2ef85956729e5adf720ecd34365e08b32eb62cb4d6b06030e78a43b2083a372fe1c729cacd9ad0fa637fc07d424f2462e5646b85d6b01a50a0432617cc7206abc4d804ed9e91d8e80f90b64af5908212c58797f41102678748ef619b63d092e9ab71b8c8c6cfc7be1847d6ed11949bb0b9799b48aa218b9d90314416963af9aac19905cf5e0a51f2b9805600d64348a96c4435c2ffab80cee30020f107e02a6cbfcd165f0dea5cf683a14c7a563b8b1c3fd464c4bdb804ccf3c450208c81e4ff30c6ab3c82b9eae92851724cde55bf8992c792e51e9c7aac3406539022079bd733e05f86b4c8fe4955ddafcd0be77da62659fe4553e36ae5759689af7022c118ee2b1374527993c1e454fc987db78abebcf457c98bde8ec0e036f2816a10d76c2b9109f788a3bab16f2c168a26ea7cb2cd64a94cf610840f757c8cd27a393d0ed9c7f82401807baae3b05dae4fd0c391d37b9379b87f65f8f2f387a7a7c037ab2d94c84bf60b41ebef635d156a89ddf90bc9bb47de27cfd992273cc81187b5ba24f7f6ec17e5d45fc030b749ca557f27b0e26fdc47b1efc696a133a43a2456ca00adc6995f56347904d248ddd51e3d8d279cf3f8f14ce407765ecc53a3e6108a96bab3b29bd41c988152e6d2b8ca702fc0564585b4dfaa18002bc59d2089917f349c117920a5bfa9fa55333e27a0126dc214771d2f7b85e067cbf5f04d1dd5b068c9ad894b5cce04318145cf3aaca097bf4f156f5af46da2300df542248343b3d8c471aae61ee6f4937bd08a8629fff6decec59e1dc99d2e517d53b7260452261be7df0d70bca16a4516facf4441fe72072b820602aaa3004ab7dd1639731e8e76109d38508d3f267c55cf04b3414870e3f6513e3f70595efcbf2e9ce14e70ed5ec54b9869196dce1cea01376647af28ee0d55441ccf9e0d0bbda4f6bda60b4bd8f22abc8bdf37948f0e0d998d214411e8cfa8c03786a1bf109a6c54b4eb028a30fbedbabb2526fb438fd4d6ae44de60524a97f7590a2b28e2b8706c4dce5a8501f38d4f323e8870694884823cbc294fc86a176057098f670c6da1bcb0de1f34a3980acecf72de27cadb688f018c77d6f3d83547427f41a03aea3723397427e6c0b98c76147c20b145ce83bbcf65fcd520628c794c34b8de57ee0945147db314b07bb60589aef5faff6ad9936f2521aaef425f7145e81a2602e7dae24e81a24d74c96fb06f168ff08bdebd297e0f21bb22732b7917e02bfa04fb2001bb7dedd1d3557b63ce2c67ac859635c03f0e79b030b60ef31a700b96b63986bc22a3dd5e64ff8f6aeeddda901e81804c497abce22060621e4a4460d1a9f10ca8862b4596a3831f4eab7fc21ef723cdfd244cdfd744c48c5cbef37ec73cc518a70f01e8f3ab321c66ac85d9739d9227393362a59ba5f5476da6c1b1f73d098c96d37e44ec75cf6b5c013673649ac4606a3cc1a72ea7c787da7dbbfd6a6fac7b6a914327ca1a62242981a407a259e18fab96ca3a4ceb1863f51122024c28c9af9cbd072e22f3f0580691c087a2e5dea08181b92da8567565be84e898aada4f78e62d5927d0fe1357782f042027e549fe5398c47a6905d2b7448e699d57f121e19698c3cf320f1f370724bf4280bdd210a82ec4a9e9f3e36c2f0c79f44f852b6dacbe4a992ffe381535b5ccc9ffdda3ed39d477041b310b7fd738fd96c0726ea4657e256dcb56f0b2609371f0cdb827ff80868d880ff059ed84f8b5e6a816fe6fb486c0b3bb81eafa07ce2f20d9d400b51069137109b3d2fc5216f9681599142a4260b4f27f07e8eab51c92f54d4a58b9d7154240dc673b5abb615998866da551df3f3d1191e5f1bf09f301780d806ec5b15a364fbf51a6be6ec249e80303f03fa0108555c0dd6aa447770e0176cfbcd51576adfc5c698b1e096da25eaed1101b48c8786533ab7e115431268f10ae8299c97e6a613e5f50075aef7f5c2762326a86c2034ccf8d9166e4e1ba623a8476943141a68ffad259def8d92b0c649878cfd474826ca6d40e47da074ffb79fc8e28d5f6e340963abd8e60a5d695ecdbefc60aab96689ba86beb623e1e0a280d308e0a3654d2ae637ce040000000000000000000000008f2bfa9202e1b049248feeb6808da74b54070954991723cc31597307655c476c78f4b364dcae95aed98355642b537c68eb46814b80f82eae9ea3b1708e5d25f8c897d9b40e02ea04de264035a8ff9028113199ae0a7fd899c24b1fa1b092e91c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001884a83b06b9d04b39ed838ef07075f91151b31a96f4073b97e0a2ac965e0ff4292f3e7e12ed6212df3157746b0d9b6b74ba92a791af66e84a68e8fa6a36c84981966655f4beabfa4195ded07e44027d8bbaf91e16d64a1102efb4425b4992137df99dd1f28a2165033eb05a865e6d69a6e7fe9a80c2396705bdaf7fe0806bbf022532637cdead0f2bbf349f677c22c75eee498e3561b101a44d9ac9a0090ffdba0225619719d6d7fd8353f4277878ee15610fe8d3121af91599047beb2a27ef58f10a0435bce921efd141525e9942b44d55fbbd16fd96c00f5b6c2c6cfcb8a982ac16d045d84e215e2c9f04e9ce98ab132e2d4efa370dd0c072e89e6c364ceb5097b6032916c41aa5480deca1364cc45c392045f0fa893390256f828e9290a6ebf3cb150221cf5c0ccfa63e4decc9966ab1914eb5ec4d5035ad12ca6b5525cfe7ec520c0e020c3c7f43ba078ae329ae9d49340c419ed112d673130046eb5dbbad438f9a4268021b79e0bcf74a60e5348fa2266af4bedbb2d9a7016e558437fc3f566bad84a5c60215379e7aa8caaf89a9ed8aebc082fa62b0a3ea830f744bf6149c40c63fbbd360e5f1aac8e97dac9a4ab3843ef7c091f627f4e6915e144d448247f5d89c05d057abbea784b4006095b550acb5b7ed7154021ce17ce3b349c2f601b83c2ae14bc61457b323514aeccefe1c5d45b2a6c13b30d470cba4ccbd62599d995b57a5d08af930aab056d743da486cbb7ec9a25e278adcaf6f2bb298f79b7646da8dfb58d271a3265c6f91ee6113c74fa2d4010c88a3a54d91c5db61e1f9d27ccef5c70987e4a255ec14b8d0cde4100347706ba04a52ed26e592de92db1b54263b2cfb463fcdf68fe4c9a08e0fc37119c2f02fed25cf2057010f86e69fd5529c7a6898174a1feefd85751631fdb8ae1682ad04b11d9e64a3bda04ac789b85bc559b3e911a1611aad982f1bacc3ade200dec41ab800269a3d8bb73f7fe5360891dd8cf8668a9f0c23f8987a53e1fda249d0d5fdca8a66a92b688b8c4aaf79998dd94e0675f9075072239b3c2fa32f21380c8385cf16809c5dcddcfb71fe8bd7dad91446ea00fc13609068a2aeaec562e92ea8f2aad33edacb04ace15aed334fead6bdc154d7b20fa00ec42b1330e210a942a21bf1f8db659c6a4dbf78a656f8b565ec8db0e7a2a1f1fa21e831f10e3eec747a80cbd614a9060c6785319b809efe4c8579ed3f0cb13aa052457c9d1963df0a8c638949d04c3492fc123c27a6f9896291eb1c76d57a1e040fc72ee783e5f81cfd5ce5d1dc691e2cbdb868efd6be5ba8965fac7c251275b6de9525309fd6fcaacc89cc2f229927b521ca68c996a4bbe2386e4577cd83d82a82f69da3634af645d08aa0ba264b745cc992cc593539efb5e99f38702659ed65f303ca29db46e884ac0b3a7a6cfcd3e24a371dd7fc9f56369f6ead46cd519aa115529d80071f5d13b81e7dbabc2195528eee15111bc0b31d16912e6254f413a68db20840480e063cd8fea231332b1ff10d0277c6088bdf90213138ab0d1d4524cd2762e3b99d5daf5b85ae31d6a848782a5e8501e5fa58d942aa8a9e5ef6def10dc9ee007ecb381b0f27509c31eabe10b6db4f0690d6bc714041b102dda1893e817d4e8f0906a06c7e734c5fcb373447286bc45e2647da298f6dcd31c797174fdce6970a1b9109ea33a33bbc19e57b17017565ef3e901c97d1f857a0eb4f1fb888657492100ad95f2c8aeffd9684716fe2ca8909dee714c4c70c24dd75966fd8f9553a42e3e38a6b77be4897017146d2d575f2c4ab6f206a9dc881e32e43267899639175b9aad2dced87ac11582faef0cce122969f955bb21d9b8d8c3b1ec7b8ba6f28ae9075db26d3c48b57db295d7fb082d7ddfce5d20e3234f5d310de6304398a81d15ff7194090b097c9e185a013a8b9bbd16c1c4631305d3b035d8b5dc8a8d9ee9456237d4fdc4b0e5d517b025f97140b7656c005c5532d564337f317d6985ee93764c9cbfe1c813efe51c3baf3be224fc1e4636621b46b8666a5cc9079ddebf8ff260102962d47e6bf1184c6b08b29ff0063fb3260bd4f9f183b11cdf03a95da06542eb5f2589e070b431f2c0d4f2292c98a99ef64524c004b6c6f15d7ac734659f4c0e8e18b1c0d4e4580da126c8e42e2d79de5fa39db7915a1952163e888a4aa4f7f3bcb7d4c615e70b40c1ba0c877e01cdfd6539af39d091615ee57936a42358b3062d1f832aff5bd2d32bf13c6c593be081ce588271b6a77a7739e6b1360c42b76687733fab4e4ef9cd36413b041753f4461e5385b1be3ef30b9e92bd98ec8b67e3841b1570f7f3831669b5e79442dbb31873e7bf4aa5bdd14edd7e198459dcd8f41d039e0c5e53850506f495e469a931964cfc17885f6b4b83d2ecc88090112246e8e29fb93479808", "6551", 1, 419363141, "536a340405a1e68797029b8e2d2c0377df46d5d3ce84e78d037a2729f2075f66"], + ["030000807082c403031c6dbd7226b8e4ddf8842451239943072a1a17a1c0335e411315a30329e880c80200000006acac52516352ffffffffd90f3984ab87fedbfcc2812acdf3391325cc3e78d7aa988cea9b1bee09622c350200000000ffffffff09efc1d9dbc26910a5d3dd343cbbe510c447107ac312874f389f1ec683ace97d0100000006ac65ac536a63ffffffff01cb287a010000000000000000005bcb11f600", "5352006300ac0063", 0, -1925464276, "776a71b725b6a4ffadb4ced0a9e900f735b706ebade3e7cb1e6c5b53f686cc8e"], + ["030000807082c40301c72c5a966f5263cbe60e244ac62fbfdde5545b75a76eb332ca75cee5c8f5480903000000085153635151006a63c739f9a70186d37305000000000852516a656553ac650000000000000000030000000000000000ec258d01000000008b52b1c66e00ff267e73dc28e50f31deeac0e2c7e94f6ab0a9c3082cec9efbbc6f30b37431964fa62ba446c57d584803dd2e718f26e6f2304f7976212761d43d3891e8cc07abe2e8da18c38d1b5ab95c5d8bffbfa8c2ded3c7a2695bd90b9d010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035146592eb9f750a0fd63cca732be79afefee32fd99bb176d699f2982ce409762fc8ee80be3d0a34697bf5d8b479a325debc21361ae82e415cbd448624645901e087e14f0b410e651d9ef7d83f951e0448928ba7927233c64e59ff096f07cbac8a25c458ba2bb2296fdddb50173cc791aa7c5f1dfc7d3fd0db0ceff4e22fccf6021d721415242adc872ca766bc528b113a05d8e99343ff1ff11d66887e441e18ee02102a1c4f277cd326ff2bdb6905141b82361af53b6fa2461a33ee6ba07abbd3940a06a0ff919d0520c17f5311f167e7e1cdf0aa2d7ad1ecfa5fed1454ddebde123501eb3174c268efb6f78fefdba68a3ea1d4f50a731ee1d5f5cfe643bba17e0afd020c564f6b1c859e9dfd03f74dc9f270a13693baa048bc3ca847ce84683c37e81b030f4066603c2769d0363c5409baebea169d5794ddbb4deacf676d9e545796d73c032447183fb60a772ba71d964d24410118db34e3093b9ca3043eaf0893e46bd4b7030e76eb94b7071b698ec69f07550cab8bee1dad3ea5e713f928f1896bba37f1c502233a8da2a5089c6f0f185ea9267b4b7983cc153e5aab40c6c651719198cf214eec620aebb6e2f973ccef9b125bdc25d04fd7512fb1c3068df7bc60123fc003d6600976cc1c90b302dec9c300197793f5808fc095012ff56e8a88bf5235cc69c13aff600b164f499cbb777822465cd5f14b55010e213144598efb60a6db0d43253cfd647d037d6e6dd326c7af8f7276b56bdb76abd6de3cecde3c83c97266e4ceed3011fe4a0bde5db0291596629ce2edbb8e60840646ef12d600b2c6bbb5abb0f69caed0115db03340d80ff0c0c81772fdf1691a5d0ffb8e81f447237da985530b4b1fc22f6717976200a9c1c0163669fcce3a558b4d245907646821c744c982a77eccaa3b3ee1b9ec89698cd11797a3b9052e610bc4331acb702711f6c2678714ec3016a1410b63bf94d0695cabaacd5b1a3c12896fca0363e847489eed85b1eac87a6d75185ab5ea03bf576e7ab15d0e1cfcda62202f0e2e79509836c1384ea9be5ef36d6fa94956ed7d0a98f53a32707299e3b7f2ea8ee6630265c8de44c0a63dea7eaf04ee33be41831b120141584e5ae043b00433f096599f7c75c47b14aa11dff958ca281a667207b3e1f17af33dc6c791b542c6c4afbf9564b1cfc573aff474e642bc736a388d9f3c347407f8b73b0c442800e9910ccda1e9be9ce21c133245673c9d9b1a0bdeda6b3d9c8a5e5cdd78b922e13b0b698e93f55c5cebdab64f99cd31deae0f851b4e6100ba0e73289d8600315d15db3bcb8bd5c52db159d93489cc7f7b1ff489373662eab7a9802297a9818aee4a99715e89214ceae1e6d5ef1fd7b29efe9cfc2c8ba737e8de592ce353ec7f3fcc6f4427f27af0ce4793d5a3899a9e90f41665b3c55c22286de9eb8c257f8a098acca0b6b8bb0816ba4de3e3f3ce6ddd7b4d4df07a9c2bacbdeddd93d34e7576c40803899666bca03108bcd8989a3e05a15220c8956cfe53a36d2dff2e5efea071b48e13a344543fa145c9d17ed88ed7d42d57396b7235e32b5cab6de75d09b91ebec8f19f2d3d43144059c0d2480476a37f3c59755a5b3e3a9cf5b2db1bd8ac70c3c0fa0dd76745f5fe74f807b206e1527367caf6921c9c6504b2c010ad8dca8da179be6c4990f6271df1c5f4263cab016a0b8f84b676488cfdd7710b9abff19119962dd495fb0b94299860e90faf9faff385be05825796216f3379488f5f79f64a7afb094a262f01a0896381d8a16760bb42247af678faeb01def4fb0006aaff126d74ac406af8e06355f8fb34f891b441baf2d59330604f6fbb90b4a0567e8c05b2e9c1591be0ec674498cd9e162c733d56b0b49ed16f55e3c6c3d6698213221f25da7bfc746b8d1492c66984a01e05dd8d9f9da41a44ee58d87934b8d08cfa329bddc53ee2773dbaea8bb0bcf3a0197f46c68de2a5956e10bf522c947932b78582e2cc1250f45a53b20faa65aeb420244abe71493192b060aec7946fceeede234cf30906ee444f8bb5b65b263fd9164da158c9b382ab3fb157dc5104da8b9df97b5ef2db259c70c68720a143539666681e53f84dbf58a297c2ecd9037e918589027bfe608e9c0f3bf494ef3e482fcd5f07c6c4d99ce438f54055a61702588694d6235befbf31cf1ce6b25f07b30e47bd3ccf3a5d2cea1d80a1df1574e2d523be91c6bc256abf7e0ea8f2f79a0bcf3e2b8ef6508b6a6bed94659488fd4e823d48f49d3c3893765d8b5595c60f31961d992a78d9621ade534ac6a9000000000000000065824d0300000000521d17f144843c69e9b8481a4fd14460a94b118edafa723aab9d325aeb9cf3b1a3525068f90a4570c8f2a54947d7463e0356284a4006ca376d7a430ce40c5eceb7b6693b7f94c69c87bba9e845439b797a45fc1205edac2efd0d4c90e5a711f200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c9e207a4cdb23f8d79f6ceec65fe66ffc30dd0a0ace05b71dbb025189df9b09b69d6b3442661eab02b1c486819d6f618163f2522d6996f8076e3f9c83625d71d613dc1b8924c072c11e63f5e3f26af1615478d283d42c6bb0a42b75bcb8a99aa56b5fabc5495a3510f702eeb95019c007b7f66aa4867ed3e122e163ff326a840020d3a415db172955e49907dd56bc0eec367e34baa184b9218943390e88951e6e70328cd0252adcb0892b3c614dd3a597a44f52655b6b7f546ddba3f79c152b6db860b052e00b08ae0f44def84d512f88026e7d28e0792e80ebae8a43b5232a8a897f8e573d1725e834bf847082a557eeb556e1fd77c7eff0c3288be7f337839b8432002279587f390c889c9bf50be71186c8ae42d717979d1348dd83e53ec79efe518980203dca4cb6fb3e3f820c80fc0bc76d45c275fd020b1426f480c399ccbb5ef941a022ec930eca4c4042130a16732c9b7232e1a1d9adbe4080bef9d0ec793befd14c3031f6621bf3cf5f7144d655c4588718fb813c015b0bf4e4c4733d2b53e96c07f92031b5c4eb43619a5484fbfdab2ab1cc26fb500e0a63899c4a6e7345e0a9797e82da53dc853c7499f4e4caef6720cc53c0d3e7cd8cec309c8df21f9ac622c048c6cfa73436bfbef3d63015f6a356d9a01e68077919b427a90e5f8b59af27d30acdcc0815ae960c99d63216e5ea97885953ed42550cec2e7c609c40b65853d12a3ccf783cbdda92653fce96606a9d246654dbf9e377c1d80c011b6932fabfe9a32c53c6c74e52064b79de11ddfb5b9370b5731d0d3c8acf88b32bfbdc48ffc80d60adb903d8daf35cf927b1b56fb6604d9dfbb25f640345dddef43057a1da883b52dfc461a17fd165b16a8bcfda97bed27927ad316aa6c171d43939675848e0419ab05b4c475f5cdc187bd81c951453f7d4e61669bf9b20865643421996efac2f194472cf1de153197fe0a8ecebea574502f54a4715a8059e4fcb1544e4f89a1aa06e6c559bbd1ae3dbd3ed726b06787928aa490e105a3fcf9a374b253e692feae9ebcfe917a1b3a83f57eabbef3a120de74506d5b5448d0627ec41e42ece99e98ddf16dab301dc37d7a989dcec173b782dd1ecda3cf3f6fa13f669761ec31a8b99c578dacb6b8e3357d41ffffc80066041d57a66f05ad55d1979059e00b5dc5eebcbe411d9bf18600c726870d67d8ea644b1d7ea31fac5da17fb966060f7d60f6faac1bdd7fc894e5b281733c0717a07e8657e9f5d079ece6a70fcf41082090842ec60aab751d48f38a8bc23ce9c5e2eaba73a13261a1a3f3ae2d5759b148b5f86a3c64db0bdf9121ff94bfa1cd8377c1017365e06250ffad8558dd797eb4d418c5a020915cc7adbd247f1c6fcd889598b1eb936e91881b3b474ff4a3ed14cad77514f77c5d907f2d98d2b85a14350e7617d694ee1721f8c53e4f217a3a9273e60c565bd145d1b1e49baf431c8275f179ed5bfe050c2560005ada553c9ee5d5077c1dc2bf604ee055456d87a408e360da513f85f9be72f5fe37cfe130d3d6bfefdb24b02e7ad5d6edb393ee3270873be49a282197b4314b20808483e67a3775c65ef62b0122f712cd58d298dc1ac1fd68a2ab6c3c596c3b8249df86861e5d38834e2bba18a04b2fbb66f6379e60edb42dc168b04c50a993c92d487257453e4bce64272d005353051e4b681d4f39b213fe788cee6beea92bce039f8ac55780863b7ab5c562b994249ecc96b4d2074a831d63c54f391e4c1e589705873466cdc8433356b177f6490521340914a20eadd3e3b1d1c3700d980ca0b641b3d60262a65da2baab1fc6633f6b9c746f3eb8f3aac288ad1cd29bdf013aadb233a34846b63cc51870b8a5a073efe7ab2f3f57b52459726895d473ffa807d2d92ab280fb976ad2e8c597f2e874b98efb9735da0cdae70346ec63e13c93e0b5900a26fbc191eb0be61d4d0a5641f574e5a5d0ed0bf6c550253feb206bc5e8228993d8369ed24905e9953db0009716fd69977b58995a4e87ddff9591e3634241ac9323b866fa4500eb92e8e98408e41d56a59c0be97619ed184bf83c140aa9fe0a8e1394a0ec7abc9e89fd27891205ed9bef50772d626ec177ef18dbee5928a3639a4e138abacb3ddf43ef2ccb1a53c99807af5d87b2d7d47347676e5bf3ac4adc84596b87ce76b6b4bf2247f2af5c8a9da03396f0feef9bf9f92272ca6eebb4c027c087b305cafe07d47dcf34ae1c69f3d429c1989860dc0acb97bba1e2c55411d6a53b99d4e2d012ad6351dd89ab6a5f2bfebb5037dff0ba820000000000000000d4b6f900000000002c723c645e729feb7935aed658a98c7e1dbc0b9cd3c3e06bfa5bdcf24532aae7c96004dc92521796912567daca788fe280b4f0f84e70bdea68f2bf138b981baf1a559980bbe87eb99de159d8e54185c3d9e98b526d30fec493b5269c35bd968300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b589e41dd080f3fcf04118a5a53f2d14e1a6d914b81d8c29498d2853d31632afb99aa12b697fe2abd47d8727edbad59a06383bf8079dfa0dd333d9d4d40650e0e69fde4868ce9bb993560f145970930495d0ac65d16426a9b0171f9e284208ac540e6d5c10e0a3c42d3f030e808ec5951dd3717f86070413b761831d2d02a92a031371a8db564d2de86784a54d08edc30e29d5d63e072a89e5098775c6339cb7dc022e54b13ba784ec31fd8c164ee6eb3c515fc0dbeb36427f2ed9b80b53e624045b0a02cd3832e31c161309b8247cf3d8b9fcaa37eb7c0df39e69bd895262a6a355af37c3562977ecbb909b7a374c5313f1ea7184026d5ab985c9dbab43cf4d10c8e003216b62b4f4aa51fbcc5765ca1911dbfb19b637f00ebcec4347a1a25dd21bb602020888496f2a996053dae602758fcd815d8eaf6423f1a532aff8bc49a8a38081a4022ec1f6cad0cd9ee3f86710bae3955a4efe21058142323ddb725c98daec69c058021bfd55f365bb63c22f2078301ac9fd4c24bd7cffffaacbd309ac6e432835eb4602046f49d474c8823c308a714f0e525b7ff31a85dae298b61657006ff43d4c60347cd27c78da60a730274391811810ea45c0d77a9f325d1588ceec30319888794b33152f362b481cc7f396991959f981f044542a916acf5a6da17cde0ac23760b1857ddf860215cd9a4bb065f7cf7af6d56e142f1dd28e8a574740b0ac828cd522e1f19019ec1a080fdd818e2bd53f2a4036c1592915782ddfa945356da14069fdcdc55222306922352b8629a9ba58de280044c0c33808a75e5b459f41bf39ccc22f83e03b15536ff811e49a5b47e06c1b56115f6492fd3582af017c94b37333bd0346646c232faf859a0c00e3a1bf76b591a7ff3cd2afec7f1ecef880ffc223fceae67368e255c017abc4f33fda752b7b77570170296d315b4b54446143a5884eeebe0b552afdf8883c520ece62bb55c1299ddf83c0ed20b4d4811c3e53781988371136ff60cefd1826ee7aa33b452400017021a6e4884963237410610e53b2396161fa89827c605a40111625068790da789d7e3703e2222842ead5f770dbd49f7c3cc72637fd4ccc2c740fec9015949eaf3ea792c0fe2f2e172dd6a7a4e55824543793bf308463ede547958bd1808d41b14b9b5ad8c28025925812e2db74c4655bdaa8694f5f4c9f3e28a12b9dafdbf2c527c7e383a94e3512697bfafb51182d168e30799a4bdc4b98d96b0120491e7e819f2a9ae7db69e998ed21d781a6e89ad5d8c0a87e33cc473216cbc65cd435c203acae7f25e577fbc01dcf2db3cceb102bfd06143e085ff717f1f50d371f4607f6c80f1b1f5110cafa80273884f1a4a172d8a19eb5e3957b6cf7644f53b01a9b5b86532f2ee8d7ab3b40a64232e454415707f5a447d35ebc21f193b9cb1d4e7c451e2bac1f4c7000b0e3d57f5232e2cc0855f572fd6d59c4ff5ea5e8fb757573bdd0b4737af417e1e3a19b9e81396cb92d7519e286444c91d904382a02e9d9aa1358aa8e499918dd585897bc697db568668559f403cf783b2a2d7ee08f9d0b9a8c94fb1038ae7cb31e21edeef2d3ae834975c39d9e2d944edcdf7dc8a14aea72a4c785abac2bd51a69c13005047eec1447adc94600d837a05e6e6dedc637e3425895cceef4d93047ba4b7f4df4055ccffd35ec15f3f57c351bde1516b52e645358958e0d863f0eb386c705993aeeadab74c5d5f7ac11fd51b7045edc13733b4d74024cc21fcdd54356a24aab523b69f21f8bc166c039e15ee6c9d9679614b719e01ee648a5cc2c4e0bc6a3e629e8b29e841f292c9a38d3a9e9a6d12f1c5874b0e1eb868cb9992518949c14b298621f70d7de8d5b91f8bd3cd541fd37c0dc68ed6692bf803ebe4610d49bf28684797fa63d04607b06ae1a54c0857be18e64b2f58f5d8bb46b4333ad348a5af2486cbc5bdabfb4e7464fae2af71779047edaa19a69864a0ee0ec9891f2a8a9264e2b5a3facddfcba86633fe7fe71fedff3bd97143e03a4d2ef1312f7690876e7968e861c82affc676e8eeca65e690ccab2285138eaed272616933b7036dc1c5da66ab7f0577008a967d0eef93460573e18f5b849178fc25ba252ae71d09884bbaa5c1437353a7738fb5a97c7c482de4a21125303fed2e571311fc756bc881dd030577698f9d0a79f8c87d305d3c063530d830c7cde74f45ed3b755d702e6785a7000c1768711b20c328a89950838b8c741759b9dda0c4bb1f817797407e19c5863880cc9049863849827448c6933526c284c495c52ace4f65116e3a277a7bbec2f90794abb25bb931dcd2ae23e9d00b50f4026408dae2ce70f478032264fb38f5ea043213bec8880259a19603095833d80bec7720a830b2c97c711020251903450bfad65d17d3013ec96c0531f8ae0222a69c5f5c905", "", 0, 982621459, "d7e360fecbfa4c34cd6fda5834591541c70bb77e7b60fd724137b9101d3129b1"], + ["e53bab1e043a00fec35a0889b44076cf629207e9887d93b6d7b15016e8b133f0f222b2c3670200000002acac6a241545ec8eb4c1b37f8591d21e7cdc43960bba0fedd69379682a707570eeeb5731496002000000016afffffffffbd780447bdd8775e555e25ae35b4c08ab4c0f78b218d4173979b261ccc055e9030000000763536352655100ffffffff55013800dedef788950310a03c72fb49e844bf55efd03dc0d4d483e70c64543a0000000000807edf540260e904040000000006ac5251526a65a989df010000000004ac006a6a0000000002000000000000000039fb4201000000001ec90e5f88f7a4e42279490bdf97587857b4b4e419f4dc22899bbb28291a6d7928ece83889d23612c607d3386aea57fa3c7e8bd2498e6cf966226bd2aad5b42979454c916c63ec23a35f448cc46cd934682bda55a8c19932aa336e894dadb7b7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006ae4845c7acb64006f851103f0ea0a4b7172175b5de7de532ac961562eca10240efb481d07ea42f7d9b61a10002492e00eb5f7988537ac2a60c15e04c273dcc164d1a0cfd55929f354a4e614e1a7baf787aca9eff7751374369b2621212875b47d42dfba7287d4d11223712d423eefbf28922fcba3682364ab21306eb54d15a1020b587d39c99b5bb7656d85fe55123cfccf054d1eb835ddbff7682b859872fdd70318ccdee41503a51afef697891edf6e173c33d68ca09dae209407eb68f7bef20e0b0133435ed2be2e2c9e238cae6b26b5b2ac6bb7e9437970a914cd4054e3086a664b99a0fd0dff21b2a09fad7b6343814977e914b66eca4b9d3cb22cff7ec9789e0203b59b88e7a1c84723b899a6f20dc07a226c7cb3371b03975be6cedea231743c031a61be46a851215eec8d7585d9645db0c26dcb91c378b189d74cd0335670074f022834dd46832dfdd68d2fecb1a4350d2eaad4fa1f9742fb40005780e29392c34e022e10ec1976a78a0bdfe85e5bfbde70b893602177f1884fda94c3c9ced01becc7031325dbf95bd9fae181bb5f7098a907894debddf313cb2903cf6979336a00bb41686f7a1a6d9caba638ce687e2a5da3751eecea300a957296e99a5af93fdaec2b661d9a130f16cddc4514228badc1e6b6473aa32f11b32a98947a2ad486830ed36f0e9b4a58ad0e4c61796626424f256a039e870c1d690feed704147dcdc093e8c337a84fdbd815c4e41fead5bfc05b32928936e078c171001c2c2fb2f61038f404f285d31eecd2cd594d1518eae08130d67e3c39c001654ccffe73a458ef51ef7c3a03e968454be7274bedf6caa513cd95a2ac01db29daee7138de6351c38dcd5d7ef8f0d3a77b10046f93610147e3c833644cd3fef7b306fe4dd20b840304d3ae4e666b3fbd8445930c0a3598059cd1f0db41a7e498f8f2781b365e18fb40a9e6dfa6ff1caf5aa08d2af1fcde6387e7b2b9d7e571180ab0ae29f1766aacf85513a51f80b9ed3a10cb360681a0811d802d85033dc0c88856f1f942fbd323c141b8bdc997ed01c451a2a23c4d8d10daadab4547cf613eea9835edca01d47e70ff7b7cbb9874e22c9ef05be6884334472bddba6e54df526a8f3863dbf99c926ffb8e9767912f9ad777479d7a4432a7f71d722417bf7956b45db963b1dd736564752744ce416005cd6dcdde6dd33897dfe0ccfc806cb2c831aa6acb17e3752260592417a384d65c2b4f50ea9b0d89daf435887dea8325ea9e7ba736bffa6be37ccbf70255740f3a50b2ce58ba5e54e1d19461a299be35726eda2fc9cd45e5d83ee858f6bc27ee23fec81c1af4669c2b6331ec495e4c303cedbeedb1b882d9253bc53a2440e833d134f225fa33b7033ed6b2f4ba0f35e30a76f13be08c041239f2d731bae2366a053f360de8a1bdd3c735053165c4ae8823d70f45d98b6b1d1fde80ad0dfba26cea963818d4d42cfa0c16a3a545993623fffe5d6f8de090c41ca993e04b4a9a552defbc6c5886365ac6e4aad1b7460db2c522ae67692cb43237b07e59d581b5a056973d242265585e8dcec33b0ae655b0d40c183c0dccf4b6fc130d07f1465b60483c496450b5c8bbb7724496e833c62ba64bfb2fba457d3d777a0187e452820b4e513ec7cf46b06f4e69214bcd27e13a80795c3d294f6d68d2dcb6ace6e586655feb5078aa47e7928289fd22e11e9541b12f974c6d02b3abbbd9caefd96bbd5c95c3fbda02965bad76396f6eaac1e445a77242d9f4513194b17a008a76dbe69556a0cc1a4ef2b1f543382bc18031c3b391fb1f8095af2fed38f4503a317930958c67110c7c95ecd838ada65528ee8e1a22790e634993737b44b54a38defe2f052f39f5f3881d9009fe99867a8df9ca77e6c6a4326784fa73b12ff8700f967448c21d4cfd30f1cdd944a86d69a58c36acc6e7c952dc5a47f2b4b9363a96037a5a5f1c5bcaabb042cf5af59a9c74d3ba60106960a02ca9facee7aeaa9ff37d1d86f4b4ba898fb4120cd664bf5f95b398b2aea4c2f7c7740d2fb30ce6510d30404a142576cccaae31102c9ff7983b56b0d96eaf04b7bc3bc530b891a9481bdce4c1f42b650fa0781ec962b82dac921d8954ecec827d7b2957280e468de315d3247a88f716f79faf27ca4398a11afb1cb437d4b59d371bcd030680f9fedb6e58fccf9f74ae1876cceb228ec6ab0f908a00320635a939fb13e94875410d68420730a1e3feb41463c67c2a9af7927db9d9384a30504b267cdc9d8defeec6aff1c8febe6c237f3f06bad9c0c7eb1deec22e3d44030000000000000000000000003f6d3c94ed6c249b928535bd8e2ca6e2b3d812c39e06caedbfa8660822010de8e184ed369fe5ede73b2c152c71773a6840e12bfb243f948356fb1de3b4b391aff55004f8608f911e14a57d31c4e52ef9dd95feef5db347ca42ba7976f8d9f888000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007914c3e6c9f0cc9980487a533a9add875ae15740af3e596bb51e2a93d6333011e79df499d498254686b7e52a83e25675618d0dfdf5faba07c1e1a3c150a6024f401db05545b2278eae9ea9c7208032536d0243b94a7e27c0d7e57780e2d3b61ff6ed2d2e7d125223a9944d082615adc282901aa86d8d37adad13780e9fd31e3a0210a902f56c85a05f9ffe3fa7a1dde803679fc40df7a93a2756c1dad2ec8452a40203f9993460e338f7cf3d76b9b8c07372f7a15e818fdbc66f5426ece3550f82890a01d0dbe3ab5e37a69f40d72a829264c144bf7215ec969f3fe8930fc808df89db293df5fbc16eb44054f130c13b7d7c9238a5444a34fce59606c3c6841a87b743020977562ab4dc35ad40bddfe8cf2dfbd27220ade21bbf376ea0534e7d5c833aee0310cac3cf9f59e3d00bc887ff12f0c84fc0a0b50a9599eac9195bcaff294ad4f8030e4efb796a25f98a066cdf31ca016d1530619741ac946fdec6598236b3916ae9021fe725725ea9b8c31cdd192144912e8f8bef3d0675bb1de5d976e068124d77180219aa8a7492a1e3fc85580ee7cc395de19cf05e46f64da7c336d6ec75cc1a6eaf2597c9c156b2180039f087ce2a14c6fdf652a0dd9b4fbb86baa3a7a455b4a0ee6eddb5fa204102a21481ef324797349b397288210528a74b8c6d5430ab497339342723414269f21230a90d94f613dc6428cdb92c1a12340a33588677eeb69772af6901810bdf4b2218b4ee07eb9f69eb34190db7afbad3c0fd666e8a513b8c8c0071b617cde3d5e6d07d8f01b3c71f542573354dec5279e361ad6f086077afe93ed5667afc2c80257fdd6a906c61a5f8a794b5592c595eb0f692ab02e7e3d2fdb4a93f3853b67c2f9d89ed3bdc55ccec552b693413c86d74ebdd3148ff588bd09b781a705efedfe6e1d0c3f4c192c3770bcd0e14d5e9d2f9000baaec1a0c63b41cb13b4825131c7231f5f82e63c9b2e504e994eb729530643d195a42561295292160bab9889b4bb42e898cb8a63d34e816d01828586e935871b2f8eb4016dac6200058a5805ba6ffadef2a00224a4fe7244c41e01282b748dd72095b0f4005b255361412ef8d1e339033adbb75938c910c263129c3089ef017472b8701a2f689f9cd9d712f849957d787f98d8af785ce361127416f473210871a29fcaadb3cf59029dd7605cea2931ed00a7f9d6396890c7af6797cf8b124b461d3a6c92876270a535c8fc7fbfa75cdbc1ff118a704e7802efb9a5c444f0499a7d89f14b75068339331733196f2834d51d4588cbad046b21e99f2407af26012f43ed75c525a660d2a256187a074c92fceb34a5d99be0cfc94d70b0850a581b5bc39ab030f2c19ccc22950dcd016845b688c95eb094ea08110ee7eee019f9b7f4970d66b8c2be003b961c22b9890c1aa27dfe81dd19df59df099d39847a2ebae182107e55d6d5cb5f46512c5a4b32e7dda99ff5d5452b54f727708c01601b3698d0991ee020de0cc62d03ff5cc2b85420d1cdaf17e7e4c6180b2c718e81d0cf6c67132f2df11e15c4f4f20510634ad7633a775b2fe37bdf8a2b3aa3f2e35a2b1d99df1458aa7fcf5a9b806ba3b66cad976b2bac5ec3ce762b5e67993d6cc9a877641219622e46a8bfd22941d56eb8fb801041110057926ec521649ed10cf2abbe6966853f56a2767102af3a8860bafa57b7e7258e461ca53b71dbd6d495e9c68f48a8947532046531f9122222775547081b9c04bb5bc5b3a1bc0a7964cd8fb4ed66bf21c943a1c6e2fc8428786dacb218f9f61d427e37f3bf421dce72db2d40771425c1450cf2d01a8e40e48acb1b4d7e9521c5f3e4827e3e443f45d7785de246f35fb9fc52742350f84d1ae2ebfc207d0cc1686b04cc52bd6ef27a5111a7184d99f896a9f8e52d7ab02852f06c293d845c03329feb8a78c8b7432c0e3427ae8fcb714746cf8223442a87410b6762ea8e2817a6c45f9782de546bb5dd42069679993b891104704616858e96aaf26460864dad1d7f1c439fdb49bef7ce4b0604a418d98ca26e2380ed85a30f6e082a35fc218040b6f60e1c89b98e6086230ee5e2d49612b2f2011c574a540c2069c05b3fafe1b11541d16339c353c2320765121e0b04563d754eadb97a884d3321370030e89c7f3a3c8587d7d10fa1de0407b6cbef005641c04b031cd43befa60ff293c808d1fd977122f5abf2b0103d45623fb27a8feb23109e04e28ecfe2929160f82f3fa71c1a50fbc4993a186813113531e13a14093bd7eaf8d5a0bf42a524d569c156d40767e75959c8c2e25de726ae14b698491f5ca51e94b081b40b1a59a8eae60e4e58b76a3b24b6d45b164f932c43283b10fd09347de9f5201efae3fdfe5e2ea3babe8ee9cfcaf0a5f082ef5113af7f1617418d53f89feda7a2137f327e35b628cb870171a64da08", "63", 1, 1405843030, "b582d2a56468ac990946c9ccd2ba51ae643d04f4c832d8b2d5d795a11f5df35e"], + ["0b489e440393dee39e6c08c933943cf32883bb8d2a9cbfcd5d7c94946e0a0fed366c6248b303000000046a6a006affffffff33f6dc0626fc2518425065d18ce80dea1a70dc0f1e2286b69c46da7b7b4b678900000000016affffffffd99146eafedf5308ab7540d6a42e0b8849f153c570459a317d876fd6dfba8df5000000000025c931c1048315eb0200000000086551acac6a6352acad8528000000000008536a63656500acac7deff0030000000008516a65006a5163534fbc3e0500000000090065ac5165ac6a6aac0000000003375a08030000000000000000000000005c6b7691d04ffdf82584b70b76eaf2a86f9f5e45a547c0562488c3c82aaeba950bbd97c6ce32d719c625ea59e0d8dbf819d7e885248898c7fe541932db4fbb9edae89440b83f16819704e0bd2aee8fa2e3b99806f15236e46a009ac3582ce16c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083048eb42284249425f2fa0246d2c30fe2eeb82e80ee9842a685773bfa66079bd46c5bd14a7b98cd0f8bea871108d524ebec0f9473dc364bff5fd07c7ec5569322a671da1f09c58d17a56d9016933edf794d77ca66daa3f37308b5b62c70d35eeab2dcc22a3dc0208504774dd5100b04863807656f20646d8855d847653b2c40032eed67f1a7c10a7abed405ca7dec2c6e73ac1e6b7e33fbacaf81db43e054b812020ce957a73ce96752a3f25ec5059638f9cec34b285cfec325509224ddcf65d8f70a0621afe3424ac9b50f3d0933cf572eb400af35ec55a35efde8284e549e712aa612e14f41bd3da7b5b9b38676e3b56bf4b51fabfcc37599a15d69f87f542d4b830222b09e909b8824f7cf07c16c4ef12e9e503e6b3b28963c5feca3bf176a237cd902224c40abe3aab1f5c28add2be797b6f00f528c717d4619f3a764f549b9bd646f021ce72dd992b9877d3a50548571ad23c41367a60eca9c2135907dc8c3ca68e1a7020b3f21ceedd0dd83b4c2ff3c76f90632a0b4ecf7381ae22528c79e92887bb5db0326ffb2e370a573b8df0fc0711e4caa3b3a2a4c227135a92fd6b8431aa55d722310f23ec4a0c69215db2fc1a94f673061d1a16ebcd5363090e0fa64a577605833eb0fb61383bbaca092a2fd0b4496fa5a2fdf01d71abf5b05cb932b4328b4a9373c4a9dc806e697b2516e9a2b98310e0e56ee44e4386885d530269db690232d4458a5a2c6876ca4699b3e8d458502bc215ddfb72c0e01563427ad7f7eaa2e1c7d6ad36d6cf0e3e6b74c8bcec27a5f338e958ba350f7999a068a60790562f5dd2a0aa33a67a0d11ac2e27b5ec7172f01a927ee15501819534aeba568bf22f6e4acd1be2a02e71ca3804a78342e9a8ca8c1243bb665a88717a19dee0f51b739987bd3d628fd4edb8a86ac641d9ede670410cfddb4bf8f539fec19a6c2bdb3f51c03cbc2f5305ee8a6306eee3b01357d91643bd14ad08e056287b3b188d44aac5dbefad6b1982378aa8bf5fe52642b71d1a65830045ea7e2ef43b046dc2e6a9acebb51df128d90dc808f384f19be013ae62f6411ae7291077cdc6d4e90004d92f371fb0bd906ab84860f6a76b9cef91275b966a55ee6d34a1e5519e157e5c227324695d922296b33bc6bbb696632d101ddd58dcadce21b93156beaf6c9f0336e0530c2d110a81c2a15a7c6751d68476cb4c01d54916790f4df47a339fd7c3d110fa1f0748e616fb401acc158bf4b17430a2d848cfaf74102197f8b5c3c315d52f0be5cdf8420c608864d4a7d7ad552c6a397930b0dc620960117a70c43df9dfef78e11c19ef8e50b0bbd3ca051b82e34a92adb4f012167ddf906afa20c7201ffb25412cb48405b8bb8e067ac08139c59a9ba6edd2dc1fea941010ee63f787ddbc031c64391fe5eee33d13fc3b3f42e541a0002d691ca245db484b573b9631568d2b903525dbb232fb80c6fb88b8521437a36c53fedcc37ddefcc3695ebed4b1e6ba404749b43cc8fdeabb5f69c468e689b1f44c598d45eedbe11cb76a8f67937a9504a41680aa518616c56b962e01a9f0adf4f2fdb65c22825cb4523bde1c22d3d2ec347ae968ef55a811da3d578c852178a2dbc63fa9450be412acfc3f04f55afe17abdf8f0faf0685e41516aedce6b6956de5fac08e4047a2415f7e77c24ca93a57931ee2f90d21d7888c7c63bedee7c8414fc44321de0fe86492c0d656eb6ef0345f4a802ca3979d5213ce6682543cc19ed22f93636ea5a886aa85c237dd0a7b124a35ceb9df716e651326985672a7a3f64fcf9dedef229c253271f686394b5067ba0f3942880b574b8f7fa8938f64432a4a2deb295989089147a7d8e6e7a5b6b7ed388e65e3509fc8290d2cd76d9aade42ddada163e8312d287c5cf13547ed8dc97251ee6db42ad22760d0be5e12e0cca2df14d959f1b80b0011462f05f2ea059bb99e4583480d37dfb2ff95197b20c0afefccf9600f279fd3fa4cebfc2683b897c6f9c4fe838a0e480325d3077ef98b3f79c540de32b15bbbba309e2ff5e09d1f7e992ce435799fd926d3b636e601b4b0804635049daee6aa325d4d127a5dc559d86b882b135dc52fb42e696731d19c1913ac79547fdfaa087c02ed723537a313d077aafcd98ac0c405ea82ea1b444c255ca284d29cbc7d8daebc377dfa671f3a201870fd6f9643ac65240efc32aa87dec50208293f53ff06d30aa0296dc36c3eb8a673e6a411495f17c3eda7622355ac2a94c75879bbb4b48e8df1ad35fc349feb63e57eea87efc39325239e35a55c950600000000000000002828e30000000000758579573f357ee62906f50d0af22d1210759971004d2a8b9129f7483a29dd9185b2a02b6d906e1ec5d11cf472dff7da86b305866116f2834e51dc44e62a7f38682f9dc71b5f8479c993cefa91ab957b4c52a0811dbfcc70f085874fa6e594e30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074fdd88397c76a6d255ae4a5602981eabbb162d2d27a85fa235d82ed188ccae3d58669169eeacd5090e117c5f8ae61da5bb99e3fda614eacb0914f2cd9bf1f70fc762e629519432c715be01ad340272143fb28b413914c35990d6c4e4dec5f97ca2526a9dbd125a1b48e166e7488516b801fcb0d88ed46e4f3723d44174da6b4022af9363e0d53153461ad5f7143a59bf95b819900b0e0dcf7b9359ad9837ec315030f8934d1924e5cf9a0ecab85e97e69df88ee9a7c8e10855d2b70a2d6d5316d2e0b051ab64752d09563c04d558a103b158f32911c3ff92b7a896cc465560e044619659dd951f23d0abf5652536df51162abc646c06cec7810ba7d854ccc5944647a0324e689ab0c7bb0ec6a75d49cfedd5f3496011b5efa88142750b877c317c42c4e030708d8185c069e7f8956ef6002d1fd9e853ecd7adea4e424d91bbe434c8069430219b5b038c23f2cffdcb65dcfe9d1b2806e60812e00e7696819ef2d0632d5184e0220276b6cf5086a15c6b45d25797155ba70a4635124b72ec523130206fb4ca9fc03281018024a61ed444c38bb5d15c8b5d966db405104d9a98b870b9a168bb22b99cd67e57e0aba7975725772d20297139ac739cb209f5f689f30c33270d516ffc9875440d8c839f8c91dbf93320bbf89603f4b7e258c1d035bb168c4460a6f6fcc7beb34a715f2aea26d1f9564f58886d54abead24619518e35f2ec70e313b4a1952c71f3c22a49b809d68d00879a9a70e720a22e2febd428a76848476a301292814d0e460b6a1e5d58aecdcb29b099e1a4cbf97aa3fb546c6eaa93d500c64409209e07e3efa5b99e793223a3da4e85a234addf15a3e10e3e4bebc00fa4d5d1c7fd08a0d3e9b8ba4610ee3b3d90039cfc81b14586fbcf460b9a4eec45c0bf93e44b4f555109242d910f7073f6c8daa0121ba4eb9821c04e3bdf5e02dc2b601c8f641f12294dd8183b5c12f7c767d636c665f77d02fcdd3a9bf1da8ac962fba9367d6230cc5d1c49f6c257a34b38bd39e769053821e2178b32fb81dabb23a1fbb2f96f7695fd3fa03cec7b142c846b04ff7ff61d0900e5d2d1e99140253af5c4540567e75562545c19891f6f875957e8c34b0f388c09cf998cdf33adc2286e6ae703788a560eb33161a00007c1004e8c0b8ac51dd980372c6e92f41225d9e8939631086b3052b99172c9dcb484bce9d965321a982425424041c669b0c93341288d7872e5d49b27ba0e3364077478a6aa9359257a0dba7398abef17d8bcde879eecc497dbb3ab070de1a6b5e6e1ae36a7635b61e243ff5c2e97d6b6807e7778cf98d4f4431745a93caf5894acf323492adcc12be6afc936690fb34fd6de944765475bdaba2cd69843eb3d144e8564d5dfa3de14a249d8251a7e6487c2fc1f5f5c49ec0575eef33876634943edac18ca4bb72680f943ced57f09bad4befb232e7bca6accfcd5b9735cdbcef9ce717c4ffbf836b3f3a8db3b3089af9e03693c39efec61818c007e5c7db507799930d1f1c4f403476c4a3eedac41e4cfe2636f57a877a35282fddd29df9540d68b1a30570fcef1cf500f2e937898ffabc77147c47034259627f207a05747c787113682b6c4f4f3ec78c8c5245ffbd44008e3a6f4ad68cad934e4b4e0f758e62744211e0c30e44d34fa68b7c773c3f54ba72d38e3b760639d271618fdba669076cd6164e497d8eb8c30f61542ddc2bc1f8a5397493ce4589543c592eef8094cf6ebc0fbda139567ec51ad35488eddcc6220115b86c214f832b3d00a07c60dea0cc439cd53425ed86622a17a1467a5e63c47b2f2e4e15c62cb58075d48cbced8eac954569770a639fdf9aede3ef055e965a77684c2d9e0727780753711d541bb2b154c7b3c413a6c050711b4d56fe6ada4e9d145338124c3551e7f14a2ddd8995f5c774203d8e99f0823710b5f3bb8de4e7f802b4a20f1e59676bd6e6ba471e00945fcdfa7e86fcdb32a04b3af2a1e0a15e51775c6e581abf8731589592b9b726ab7666eb7d2585e281a75f9497252845ee27935090f59802ab8525b1e00ea06abcfd4171a7ba9a5bab9ffeb312e0ea4ac019aed95d2749216a745e42055e803f13de198786ef4ecec8f8f637c1f1dc2cd36045cc12e6fe720228b8d1533d4c8f567423385142cff71b3bddac63200d3d17eb6a06835928f9a649519ab6bf8ab5dcbe1e0e84189eea2466c08847b9ab9e30b28289f4937bab01d53a581d420c25df3ba35dcc70d9539ae7261268b2de02aa25e27016cd44e5fdb3ddccdc79880c2ef4a3786041f54c9ab38f68030000000000000000000000004cad4237b07e59773ebbe67ec8cf38e9c84af7de47cf755ceadca695d00f1b40287889f0afc8aabe2cd5a19a54eebd8b4e37502175018f6577ca0a67da981e1f3f39732078e1beb34f8c4f25e3dbb6ad95ab02a8741de8c59843dc3c141a22b70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f2fcc484afa99fec8fed3c6e883fa8cb4d1f62ab77c7b966961fbca98d7dd1e0e8037bc5ad5022aa2e844a74efe6b95bab369ed9d8335d86f3ddfed4c4dcbc26bd19d9a1fcc82995c9f390d4ad34ab29659828f131dea945fc080a4207b6120a6f201875c0204bba53c4af47c96079d110384a2a055214ec4ef6e5b13b3ac3030b46874f5226c0f0ad8afc7058deeb6296cf45e5f3d38f684a75684d6540412d0329802c21967f19a62ca60336609eadb281124cabe2f6c1ca48ed5b01ed6223750a083e18ea7c5bf9e97d70ee6d4b13d5cb509b95540e6d65dd9689ededa5f3d4cc17e14b53dbef0eca38a6565e7f747edc5c011484f518b58467d7076781f0a1d802088ca9e3007976faad9eac2dcf20fa7ed38f8fb7287b3b5cd02471ac03e6f1dd030a6388b12cd1bd7a96f4145e08b56cb9bfeb4a15177951009d537ba1fb925c2202163ffaca63e7e939cb66f62a50ffcceecb08ed4e1d02e9660eb259b464e77eca030275f6582787cb77d46d3bfd84116561c497352ac55b91c8e18df44916b283ad0210ea3bf060f2d08645e1301936064035734f8717b12b657278ddd1f7eadab4c81e67a615728c1ec1baad49720052afa991152347c88c4dab3ab046a6cdc46ee10d5582c35b65c173880b8f477385f642306a258814b05f0c722c8c1ca35c34e370837f95bf6406185b9c47c388a16af11451d629b7090db737387f49231630b13644babbf5675957b7e7d665cf7aa375c48322af1075258bf959c4f6932038cb652dba9e5eba4ae6746384593eab2b5532c0ae6daf475aadda6bd5826f9c6656011063123497524dcdd7495e4da964c23cd5b1bdcb0c21927cecd2b20462e2b7eed1c8f4d1071e55b29f6a24b825436fc038db8c59583420e0495c8d83374d00ea9486be31e1a8f46fc5f506ec03ed23e2eee8b4a56f07b1befa84438b711151930282215ac194932a1c9b7ac391f5d361cdfd0b1db58e7d20b35c15076bd201f5c84d32c81b82b2d2afbb15be4b0f03dd490a9ce7e979b328c44d1bdfaafd9ffd727619c4d1b3abdc386157ac0f9d3226329d115e2e10efc74a06b6b555c523791a1f0e93ca8fa43987f18264fa5598857c05382119dbd2215162d57cfb7c3409e0f3126e4d9a1d9194c493c108c75767fd5400e76bda53241c82b65c15a87af0a9dc5c6bd2bfea903f243c455e14b6c65c7471a2654f012a32077199c277d3553988f64f8a4c43278d2c2f2c8300bc7017293ca52bfb01e77295713e1d6e794236ca1850bb4cb37a47c3e80705498cdeef372215389add63ee03d499dfd064868d8c9ab5b92666287613f196356770b63d1f2786fb07c1a6453984199f0dce94d20c49072655ce10ecdbe9d67768d0a33069786d69f6205852f30a993a447e68fd2caeabde451b76124fa9fcc7f9121a07480a75b8b0db4e4e1f3397694b971195911011f30c976e87708fdbe0340a2b78bf93b007ea91a4ff668a4a3d2ea5757d220719386dd022393b4caf0ee15c9f53a6b324650aa4ef69f137d72a687cccc6418ad9292bf22fe453fb26cbbe59b86f93c4d7c1a727670b0b6c7a96df3bf864a29a8bb06b43c136cc75e95ac565799d69899912573a6f4ba485c56d208c698bb5019a44302c2ea9f6bb3e53b972a9dd8eccdb39e5ede2b5e8c12ee4c110e420e3d312aa54a2e022c2dfe2720ace43df23bb7b9fbbb519580bfcf0d248b2f8aad31ef70c24aadec1947cbbf8425de0a8e7fa560824dc2034e29239fde7f0c8763bb08e6c726b8ca99b37a502649f2fa2c4c8594f0afe84546bd9985a11e81d3de2ac725431fb1c951976f64f12d8c25f4ee072cc533b5ad7ce9b551c3ade7b642da208d5fe276eb7b71b727106c5ced736e4ef5202d59a0f0e6e8ee44519eea42499cddca3e19c750b15c08fdc9bde801a3f5dae4c4b0337e66031ec138cd3129fe458a6352bc536fa7b21bcf3f997c9980490271f583fbdb2ca0af6ad1f5b4feae0c281a0dc0c1a9588d27efc58e66d9ab2f72195987b62a7b2d6bf32bb80eaaae67150c3601d8c0f9ed49be4260fe6dad57a83406b6eca28c7dcab91a6c9363d134a465d488ac99b6e8ab3073090555dbe7f9a3e8344e0b76dd89058347fd482ad66a55001770165fb4970eb4fa8865c1399ecf37947a1c8dad1ece4f37b14e7d98efb683cc990450a791a03f6f3ef5e5ea3eb6aaf9ce3d032ce35e1783236b761cb0bc9b64624da8e7e78edcde62dead4883d3213f8dccfd23745aec0351f1553dfd6202f606cc45e92127e309c0a311f4b11772c46acfd86a08823e514566956537abffa3e4c31759f897fc2b162e9a6744f2775d528daf24b7d2e85c1491366d43448582ae07aa024c1d87e45eabee5a24f6d1d8bfffc102a888a928be654211fda11593daf54d05b28c8d2d303", "6a006a", 1, 1217623205, "72f744daaf38b16a94783a4daabeffbf4e4252acbe963b5e0b33fbf28a82e443"], + ["0bec283a0299a1628f0dcd9363e923fe29c5495761f50db4922e14360f55044683cd2d391a00000000045363ac00ffffffff8293f4204535d25f47bf53ed9f636323344503f50961565be65cb0c27d388a5a02000000096a6a51526353ac5300ffffffff04c988430000000000016501cded020000000003656552b10713020000000001acc2a39702000000000663ac630051514c64e23500", "6a00006551", 1, -431155489, "917539af29cddfda028077c3838a9e6bfd23f8d43d87d56975b1eb344bf66870"], + ["030000807082c40304c1f58eb3206a41a7f002d954adb48538873cfb75679095f49b1bf0c175b9860c000000000863516563636565524b9cf844ac6736dbf54db5f5f69bacb583164329868d4581527ad305f7d53fdcb7e2381300000000085251ac5263005353ffffffff9909520098efc2536d7daf9f652c38e32acc10d588cc8a9dbf3c1bb8fc2962430200000008535165005252656affffffffb77b88ca8a709939a5632d8b610a24b165475ddb6b1e9576b1deac2922fd6a3102000000086563ac5365525365ffffffff0397d0320100000000025265741d0b0100000000086a526a515265515104cb4802000000000165f68038625865c18f021e0dcd030000000000000000000000008cea4c2bc88a8343527df440304d2884ce3ed823596f6408ec32e0195c00162099c4bc14519bf0840e7b818baf6978e038d619779f9bc0715038779c80492bafb719dbc4f02353150d43d41f0c8dbbd4848295ce04a4c2375ef669b20d082ce6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002aec6b39671c4baa7d4cca435153350f9fea1e12d3ab178c48138e374d1e91dd3c0997f4d4f9d0d42b307fefd8d34e1d4330423f0d16b2fa62fb64d88361c170e6607fae24ee96b42a50737821cad4180170b04d6de7ed89361da2789703547543bee602209050d27dfcb0b70231361cfec31e9e88f916bf18109cb020b0535b030334a71ba0b594c885e3b2fe125a59ff74a39ceaaa324063285a78ca54a02fdd022d892a23d3088af7df6e244aa0777fd31a90100ad2641aa3377bd0261daa48280a015144e559f97f95c02b0681c59448570575e934dc48c5a7614d8781c117cb3681cb8c925c2f979f4334d6c4db8b41f2d23971013ff6460e4cea10b8f7dd5ed6032a9f7df359a2a54bf3a5c840edd9deff0e332ef9028ff894c7d3eb64adb9208702194f2033d7b9a7633a549463b231069b7078716e0357bf5fda43294a2a454e87022cc1f94f20712628d85c502e998e71f687031b85e755b631a7824c1a2321fe7d0209184c2f7d87ecbac15c353ff615dc205aceb710fa368f9d50c724b89eb6be850203e92248339a6ee6cc191a4d0be19bda122949c310944e86b2c2d90032483069d33ff27381e69a964e5952e5427ac254e15b53303d72cc4951fd0c2f633fbb6861bd98b866e883ea15bc8dff5497ea7f7a4d609d8612872ce14e2e87a52e5d5fc46b0743baed74ca31cc9a31f69ae240d7d4585bc0aec7f9cc39fcceb5f782189c3d2fc53aa8c80c60a3ae5ce32c811ce3b918697b25aa3d397d8d82f758c6c7ad2920be833a9b73e6e7b5e522e557b9df4b14370ecf4c10a9db7e7902ce5f5b66759819148364477b7dff30a343f872ef988fec8553490e7679fac9ff1e190c35382cc5e6b58603bca7c94fb30ebbae0d68d5ffeeb6ebba433dc4fd0b740cf98d1ac92a9bb280da03b8c4cd6ab3f87c75818e1a33028aa07f3c796432277cea3ec51955c54c2bc628dab3285400d345ab665f28f101a901976629d8efc36030cf750ac363ac1929ea98f7f38785e9c2b33fdcdd6f0268b71807178493d49b2bb1418c58eafb9aa1c81e6e2208bf606ad07d89f7d5735089689ba3c34817316b813d59edde3e882a63858f04f741ed5bac166a14ae194b2a370fbaa75644d055b35cfa48fc411bc66edeef36edf1f7f55901b8dd2d7926a1778b18260e89c2651f2dc347388000b37a54d853f8263f522504f592728e8c324a763e03f68364efc14dbb1333d89b9c3beaa9cbcdcf963a0aebbd6201b7b55f875f1485d6dd0bb3cae7c544ebc1a0c2da280952ce7fe0f82288d5234dea8a265216d11327ae1779997323e5bba48f9184097a2d5b7c1a19c211385e6a6ed6e5de701d8f4444a0955ffae777e4a7a8d4cab28574967aa127e73adb490971ef809c4b90958602ecb7fba56c4c6467e11601f14441b6e43962179910e9389cb1ce4b9dbc60068a2840c7a664df0c92adc0a2d2e13855d07c75939247ff6832a7f81d3a02b22fa9641c0ced9b1ca518155f2b2c42adbcd9ca5f6d07b2dc2a3887fccc44b6e8eefe1180e27c55b9820a42acfd0951e02f447d7eb33c7c37a6aa59645e40c4b1821ffa9faad1ff3e371168cbece73efa59c573484bfc609d8dd91768ae8641384cc1476e6e15cc9740ec8bd3ea2b6f822898591cf0265d214952c99e34be1482dba2ad4168ea686b1af3065626bacf0627abe5f5f6124f301b0803d9f47932ef539be30a6d9997e2d966f88c5081ed564a37647ba9c2701f929107ba1d080ab488581797e3acd81038cb1249cca67bc1a0c757a0dbdc0e962a705bce6dbc09c1c4d822e3ad64cc9d9b6cdac9fff6010e0b284a57a1b3fcd1326073b67fcbabd57819c4e04e889ba8c5ca7d671a69a7f50e420f0af5969d78ef54b4267d377af5bcde542f5f7f70a8d3c57235bc7738f431f8253a071c531b412d9a25a33af58fe93326461047577c6023b23559b6df8951736736697cea8490fc9d59ae6055971bcccdb933da7534799ce4c381d4162d103e4f1b62a6ec868bc8dfebd4ec6c2d1c21220c5282972130ea031179be02597dd167287c7651897a4fffa1164f96d504c79d9ee9387c5cf421b6fe9207766a54674138e7894620ff0fa5a54392cb9252625d66e8c7e286e334ad64d2b011707905a0da7394ed8855aa9f05f687dd71fc90ce8f1a5c8d2db039bada2d002694ae4f2efbca9855851e07ef94798289c32245d2e0b1b62d9b8007d29c4a763cf3f7510b4cbd3ea42cf3b336c48765b3b209b56f440df90e02425b6538e60d83bfefa6cf2fdbba74ce270200000000000000000000000073e02f36993ccaa3c0e4f8c5fb6af53b4bc9fa4f3c446dbf839ca5f8419eac6d13156d36d666325b23d7e9fd7f4bf314be97da150595f30150dc629d7f30b628cf82b1bdd8532f43e189414aebc2e51678da681b727138fffa25cdefbb07a37300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000835ee44ac1343a744d2747660824f148e56d69d7a010d17596dc5f8863aa97bbb486b0343520422e5bae5b596117c3699ac5910149b4de7f01fd7be8beb213f0e14106e5a182e9eab0c96a02642bf0c937af739355c7a83a2bd61dae6e676d86a2dba666bf1de80da66365720afe2e028b346ac532db8cd7af10ae2179ee255e022431fbfc8e5bc39bf0eba277e2abaed4ab495a9cc08320ab772b1857b677eb3a020c81983cfd1a86badf767944b0e5eeac79514da1590b07e11c1701c9902ce7bb0b039f57554e9871a1cca161d06a54066ad763fd7031681e6667799b8b424f04f7c39102621521a48bee1eb4304aa04d6cc4861dfea873f5bcadb0c88e4187d180031ba90c824add1efd36852533ae8a9fa2bbd39b5b9ef7f5e4a37d3489a72f14620324c50357ab8c5074cbe8aea239d78b5999f1743436a608a0a330f48dd8414d3b03241d892d1483773610c57012b6c3ef2f84f4efd1b1fc84da6aeeddfedd5896760205d50872134b737e516acc0310bbe477dc5aec0f6bb54bbcc55744082b0b2f650323ff3910e72d914c193fae6307047e2d45a0a4acf90fe87db871e0e792b909d5fe86399a3afb99c3082eea6feac3ac9f18880acc8d629a72847637e11de6ee724ef496bea761f0fcbb4d94a985a65a7b41a82bd2891969e621b1e4213fdf45b98d56a263237c5c168f35e3884f1989581b502c4aac337ff0d20d17cd49cc8f288b7e8c530058e9a836cde4454e023cc49c55619161d3ee355c1b6bcdbec9438b84f02bd8242a2348b295923a513cdf5c01e24c7ed647fac2645ba8ba26778bbfad109dcc74f0488a1273bb6f265504e0f5c41f1c495ce291a0e095780e7e2ee9bb53a757e9911b34ed396d949f18ff22dd7d7f56a1250ca623b7c25561d50220ec2eff7669868c9581623db7f99473cc3f688bf98067f39f397112c5a38bb1ae2d7ae87972945010a8f839e5ead1b305f79bb5dbc30353f15b8a4b161f3e9c7803653c9aa07cb98031f35b7fa840e3cefd9108d2f94eddccb54e106ea044ff340647271a6654102eb1be15d06e86c4e44cc6881933f5657f5e57569271b8d8643de8096b668766077ba630f786df35296d1c225302913445399b2aed55f57cd514631aaab5ec9fc9f13271a65d0513f0bf0dfbdadaa24085c05c84ca18a1bfdde95d7ed6954947d71f9a63ee7c3ee69c71273a83d8fe5a46eabac99b41cada054c01733f575164af4cb041511a2b2117d21bb99fb9ea897e6b5fc5841dc089d228d573414a0aa869ab947907d2260da8e6d6c7f235dcd9012f4c391bead7149951342aaed07900ab2d49257929a99da4124cab62d9875d0b53fc1284d8a7dc11da2af5ebe909fd85fb28a97fac712bbe75cb796f276c7f68127260ffc506b2c7fffbd9fc08980b15a15ef488695143374a123c414e425d0b2ed5298170707c3eb45b9178d45b292a36ca7c3ffe4de8caa345e32925326b4b3b672c46cf4f8723daa20b291720e66ccf27e4651eea90d8a501f2fdcaeb5e866a4396e1560357e8bfaa9ca0aa0818281ee17f5b2eb829463550a5f1cae4427b34b39173da2acdb13b119cc8b45e77f123d8596672bc3227132bccf753bf4f83369ed1b3600c059fe397dca22bbd86ebd7960ad9a16a333b773731f5f61be7228cd10594e64ab47abc9f4865fee82e748371e74a589bf12a3b1d0f412bd98d08185274083b4f71abc0e804eaf28853a25d8eb817dfedba795c2190d328371f697c7ac76b37e045b46d8842012561e6becd0ccf3e1c9004758fa6f5dcc604d2ff91079728b2d00b3d43ee0ebb162cc6703fd6c3f13a801971408758adf100e92fd33fe2708b8b2a4cb9a0ccaf6e4b68bf11e3ca9cb95a63060b05adb66619d8d58b61df52f237eee3b2e1ae6a2b8a9c96e1977fc566937d69c8d407800953af19cf9017937948a49ef315a5ca1e95c7e8074f47c6e151ad15ea3ab08aabb0cf377a701a02bae0a6d130e37db2e0a1ec35bf57fcf31aee9022615e143c13284d739b8d3c624b11c16879d5567614fc325a2fc0b9da7a9348820029212a57d859d80e72f180b158b98dbff398c4f5e45a8e573f978f6cdef696b3d9b736cb136357edbc2d0e0b93497c006a326435b28210bc2e89c605af07d122e4f12d7f5f5f817fa284487d1eaba7c3c8acca5a075764f6a8892db0272ad8d2d32649bf5b23e05679e0d469f15391cd58c72b2cc31ca9fb5a626f1ede4cdcac739169c1e703e4a90813b15eb2f5120a1c11d863cb84ec785fc830b7ea80730504f6a6d524bf7b963314cf5a48044ed5b02d689f853aa4c530d232e82ab1a54bb19678fb4e319bdc7289ab8a85a8e3172a140f9c25c75fc1f1f75ab065a2f8b3b4514e8b136fdb041257ddb82cd5878a96d1c87e406443b49796fd800de206440e", "63", 0, 536404369, "f03956f56560651635da2c821a6ab7e9efd802925f33dcb5a66ef19bb66d047d"], + ["030000807082c40301b3079bdd90105a16ce220df42f55e8badd3f15bdafd39b85edc13a711729dac30300000007ac52ac515300ac8ec6f21803b41e9a00000000000500526351632e3bd302000000000951006a51006a516500b854f0040000000005ac6a510053f3bde7aa0000000002f7836102000000000000000000000000554fbc99162f3ea0435054798073add1802a8a2e54b8ab572511bd68a44e00ea3f3853daf06141533168bec823bbe863343f65c7679e9eeadea7537495a74833ce423d95c3a0b20457441cea4cc626b6c2d3139683204a8c67f6ff09364360c1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004777890946f1e8b532c98ba0778e2ac21d2f752bd8c5ddbf020fab929646f0d0b84b36a17b8f85c798e1569dad8c16b85b871c40aacb3194c5c434e2d8d34a3f47e9a1c6778a16b88f7ed2ac555bb254bd6588320c4e1a10c555d95b9361f71a4e53ae4a81dc75e4163b759e5a308df2a2034df4bc72be38ed1ce8620a029ee60319353be2c941e580ae5289a30cd9c511122dc3cdcc5bd83da43f60b94ee0654b020b86b63acd7cad441bd76601c95e3fd0719fbf6e9fb7a150e04837525542361b0a00583999509863b40b158287cfff2345989a8feb45b1524bcfea854ca18251d9142bb83cad7fe0bd56a366f02a68e7fe54ffcbcbf89b157e480205569db3857102227cd6667d0b780868f3c084b343b1cb8d4af07056e27a73defcb1889fbc771a0206bc378672b31109620603bdc2e0068116a6408cdaa5c37e41b28f01d2905997020c8bcdbfa4b048e4a363977d8ab1619ccb85acd875e45f58928cf3130ca1eb3f0201eaf5a4effad6d747cb0366752d5275db625907a41d8093a3e94d769b1c8f01022b8751855e981bf06cf3d685e2746f86b067494f1984604d2d8415d3a71f1b29185e21dcf69545e51436fd3581eafa196d0e0cd552f2a25697d87e275c2faff59c0a770cd6988464146f52a14b8a833d013a4149501fd91d935d38ac21e6940ac6e23633b06d59b9c14318cb092c3a42edd3449aeb52438d4c59bcb4fd8bd68f59d88d53c520f72074d0169b12dcb82b40dd4a5a031a091f03538d981cff00b624697509e90d1fe2272231a196609471de8f14bf765e86b6f30a96dc7e77affe60a5d2d8f0f895ff6269e86ce4bf5f2038917c9084327f5723c53c48cef0efa8876a8e3989ddb41f3b73c0eb926220a26be85f4fb6dec1f4e6781255a830b1c3d7dd443d14de152727ff8dca8f6bc25e9d1c4b46dd595f6a787cb4c374b78e4ce937187b069602b37c69041de9c4320cefec057fe94d366fe523f0e199405745868d6d771e62d607a35d6a4e2bc9ec68c32aa46e573a4d6186a4dcfe78e8abee25efb4a6af9763e7efd35495cbbdfea78d9626e6084367056e4d0e57f9e88c50246a8d7fe8c54ed455a7c770456a2c5b2592a199a397b48a999bdc283d7936ee4580c0ab8c71683ec63189d39648cb60b47381ece5723422366159bdc62e38a99eec1af7e43aced7f8b9af6efd14317e10efc1a6c90e5cddfb719b5dc859cfe086c8e49dac28538c957592f208f1edf49857aa4a0fa2dbe779f105610a1a0cbce9b5436187cbec05e8b51bb9cdf47437b0afde5cbc97837ca36743e2bf17a4bce095a348eafe94ca056e741591d63ebcb562e6e61603a48fd07f9b606c41dbfed699e5a1bf839f42c4d67274ec61776ad6c39f1d71fa27862b5f7c106ab7af81df77b702f3c741768bb771217afd76358b90d19b4e46dce5eefc9ea06328154ca142594186c919fd9c11f5b8a4bebee1ade861f561ec899d991d6e0c4f3f56c6dfd12f9303c3f6087e1d0217d5843ce13fb44eab3072aa85903050c1d32dd2506cea8975b0021753c3378e303088f2b56cc0ac8f66c7b61e4f524eb6bf4821da049caf37937e2ea8df94155674ad951869cded4318ba4130ba3ac7df68f1c1cb7a22181676d4ba499b356c410799a8121bd42f61d763e7acd7ab3c93c87768be9033a96e853c4af4180c123d4f14962c7a6871304a563667f5669edf8fdaac7fe1f10302bbf301ee92526fcc84cea65599939f5857b04dce99f64af56ad121ce5c9db92b1a3d5af4fa7d229d15bbaeb9fcdb636b371b6eca888f81a09cea4aaea16e9ce1faa9519587f0c4ba1b392b2307649f911c65ff545e02c1b9cefec1780743f6d47a9d8ed11c1bc8f19f8c0fbd04a8f70aa2fcea2257d981202a283d5f9e1f3031ee5d9b6627b14ba20523086d18ed0d7091cc8e5db4341319c15809ac2368263d9f29db2956a1890e7248c09f2c8e9b473777ef7ac6b6fdb34876858885765a66028991a2b192615d2036e28eea971928119b5db7957535c1a2e2be1fe7d3601a89c07c27db66a811658c9fcee626f306ae628e655b66f45ad7e5f837b5287a747f16c2f0ce7865d2414eab7137ab2280447bb17b1a33fca2f676fc03a153afc6b63d2bc33246ab74495a73489e08081b1a6b7d71f8d6c2f844107c2cb467e409233f44be4de7f29b3cc78969b1fe878242d38f93bcd2dcf0730a165902ca9c62428acc64a31d6568bad997345c7ae5684306bce68f18c6b4c2130b8285d5a526beb6bb215c8fea1c1b0aa765016600000000000000007f0699040000000029d3ff579def44089df3191f126c6e0924bed1e6d58a680eb278177f1aaf3de6f78beaad81fb837befbffaaad3824e141cb65155784fe67d7367655de0192b074fe9a1fcaf7a7f7d5bb49627000762b9d921f4d31b95fee578d7a5629e165b6e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000089cceeb832d1c782e55719eb2001b428e8f6ccbb70ab335168dfd5f3c16e3ffd81e27bc88fa52af61a1137c550f450cd8f70241c976ec50045dee0f33133824ea88cab39eed962255068a3e24a3635db0116764bce0df2a26d1c4db7306dd347a3947d3e13be7365298ac90d860bed5ef583dad673ae8f8fc1615523e480d760021033f6baee96d0129f843dbfb3114041d359ae4d930f063f10d2082d2aa9eb04032bb6e6aa9fab6ca2ac4ce3789feb3d671285e6287019b9049e9e8b52f11b188e0b040c2a8ef1e684716ad323738332afdf664c62617d821c7a2a5988ecb00b2ed80e094258161198185a2e8d3c276cae6d9554008f6bb12f22b3dbe8d2ac97a6c1022b22958132e7725c6ce8f8e4dbc1d95cefb12a065d422fa63f1ca2fae48d32d403280df6bfe70866b4c703847fc7c8bee57424067d719a84e0a07e29622a0c5202031283ca9d509e0c6abfbe7369dfd3b74509aaf4f71b82cd4ea11176e94ab506b10304583e51f52450a991fd1e5c487ec79ec9e7ecd9a1c64f23da05046f3a85a9e2022f60c936a2433e9935cfb1705c9f913de391317d10923712db12f6009afa97f8afaf55bc8365f68cd4b36516eaef10783ecfe4339de7bed8e9966c479bbd14053d7b1b87bcc1f4418fff4fb3083557d36bac91fe37b82ea6a6e32b37b2a85a33dd5cb8951bf3ddd37e1bab01a5b66c13a9bf4f0a9fad8f3c9e3405259cfc16dde2f6275478aea5f2232dc148fdbaccd02e401e27069dad8451d8182bce9fe1b983e77a6ce083f0e1ef753fd4f1cfbaac658fd936b30d9ce310900ea532698ff661a81eba87ada4713ecdd580e86a16389c7a610e70273fc60b0c93f1c3f8ffe0143c86cb0d8ea2c362350744810352f723b600c46b2c35b638568ab46c911ab2494e5d49a806860f98792124de5288750857a2bab00dde779e4623628338ca130211908a2b160d454bda01dcdb474031e80c1a2d18a24bfd1906191299c81ee3b663888d21ded1aea51d26e11b252b2f88caba2a7b5910f4bca821416d765b0a95b5a3235dbf24845a8eb54d07ba3e6c2e23c3ee69c99d846d6057eca3213d1d40a84260e904c54650683396d3951528829fe75ef599390a231580c694d738fe2bd92155bb1c8fbcf7c2f4d3fcab775572e9b97ecd7ee6fcce8decee685ca2595c0d96d00d73119e75604c208914839df45b93bde38cb348c85736cf20eec33fccb517a6b97eeb2be6190a17db23376626e567debb035c3cc81d5e27a0405836a7e57c0761e312a052681eb107f79cfc9f6bbf72c831f0e6af9d29ba21b7fa98b99413a78f0f3e3d9769d41e5a3e4baca7ac42fca025d91302200bdac43198fbb2a161323d01bcdd6db5bf33aa0886c57e18cc159e313bf1c7dd09632cc11ed204b0d29d3773cd206fd970f0e261e8d877ca37c9315eb69d37402cdb92870b82a99a06e86c83a972de62d5693887c8ed42f72aae151ea57a5a6e84da641786162fbd198ba8cfe7f8948405893457c5c9aabd2215cdcd7d0e8212637b1401307969b37eb45a252c219e3145f8486a897509699c88faa9af5fb37e8a9bf749d949ca79d5e3f5cc0560909eb4bd7b382ec36e8b3abbe15631e54018bd6295be7e6c25cf0fa2a20d2c239fa06567d91593dfcacaf3a979aab21693ee277d25b554613a9f5923651cc1c72081067963a584c6c10090c271bd20cae634f4dfd964e0d29ec8797e66afd539ec418aafc5c8590fde75a9bb06c80b55b0a5ea790fcf4157dc519c9f2c6857894e2b37ac6dbd486072486bbf99eb18891f6534b02323d742f6191c7d6e3fe39ac1e63ea05b36c7927d7291309f2bb3602733a787a59f5b2ef1c60b4c1c5911d8c61160a664853c745c2a742bd77991b4b371949b032221fbc72968ddaccd13b76a06f0da4301fde52aa5a1b252c6997b53150e054845c3ff1e614cda367e6ac8def374482c383b13fa2c827bbdbd3e0f44a9a88ba758c6c0ffa688627bb02687448cdee1ee518236088a04ca82ad260e11f846087850b759c616e1a57b594f5c8ca1845bdff90d180fc1260251710429e6454e05a650bf410f0721c18f5d919340f50d2958507b71c4cdd39a6360c514613f122528f7839c59495a3d2335813024bae24f20c77d215cf81bdb2650fd784efb38979652c32054f387f03e0bb322faa2b8258a5b946091c76bf03b7595607db34ed0dcbcf01a622091d8e2799305c5a1ce0a1509d4ee121c67f3f653caf9947cc8428c8da683c6c60cb544086cefb643cd24439f7aff7a44a6908998ec5ea2c62a7e0fc24a98d7692f84d3f7d155e5a895052002bc8c713e8d612baa8d160a1df76853a24f85bf6aa442a37522ca83afb3d778cdaa8cecf7e8fde1914cd86f5fbc351ac3273c719a817805498cd2785402d05d8002c88b03", "51536aac53516a53", 0, -2015926386, "c6d898af3d552e75aeb0346d3bc35f3430fd383ee396d1cfded4bbc125c231ed"], + ["030000807082c4030353b43a4cc3d4e5f2b68f230b66b03154629b7dd8dc1467ea004a146580c4258a0000000000ffffffffe77cd47726caae90c55b7ee6d604816ffa81fe640320348360478623ff7239cf020000000765510052525265ac8dc1bbf74017ef504e87ed31a80286664a71a3b3272472472e7b5b60f113869315721403000000020052ffffffff0420d0be00000000000765ac525351ac000a908200000000000453526a6afeca6e010000000008acac6553acac5253b7c3ec05000000000763acac515152acc76b136d0000000001ad1a38050000000000000000000000006a77b412a37d625b69e552382ad4058dd686e9e13219a6c891e3cc572cfa4df22f1693f00278fd29f5cf11da66f50534318b3b92b12d9a2cb4748869aa39b53f3e8b5a23eabfc305e3ef748981ac723e6585d1950e36e4e69cd551b50fd75ba50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085fe70d646a56e655a10f9d0b5e6f24a25bb35fc424eea40b6d0c1d2fb6cc90024a0de3da883582e277c0e660d92c662cf6f0714a1719fe115e85de6ad63f16fa801f6c9ca73d4290f567e530812d255410e0fa8932e36fe7663343586fba0511fcd643ce65b8ee9601e1fd2911681733fa44f270536fdf25910c34f7e7369f10221279c98f8a5ca2e3b71559bbb4bee18bf14092369cb3267925979127151081703194dbc4df872461216d3237e2c49aa8d4491e719199dfdf99e364ae1dc68ca1d0a04a52cd87df0ff785bdb7c97d3804c9cd1417aca1c6f72215ffcd19a9d37d6d2dd727b050f5d5fc2dca02297f45cf20decb161e9731b50bc68030f857faabe110327605a853227ab03fd7f6c6b6ddb1864a79d3a9316ed4b46ab9f085dc8eee77b021cae209fb55dc9919a12773353a48e6220c760712debc1e774d70086e9c0bd5c020aedfd4b352c22e870c71fef4a2292e517c839a653eff96e0bf1d59a4a4425a0030ef283bfb2272159785505f982e1083b6c6f8776d33ea27a0897d7f429e8bf30032e7ae16bdba16b0bb8cde3b282a9e5e25f79d38ae320132ff27f8160d5762bdec3ecf2da4408aceade41ffb43bf666328b0b86b0c539a678d124cf8e280b8331f0578aebb364636096fc156cbc2d330ef4180a9db0b32b1046571db067b6a932d83aee6c4cbee5fea41f20ab4758e6d23c753975d2b3ed9aa249de32b574a7ff43dbd5a0c9d37740dd9d1a9735bcf96ad31967131ea6f43bbd84b5beaf55f7c9fd120b43c8a13dc20bf936d6df652b6b2b11494bb6f8b69e072369f95fee00bd31a08def0559cd5ff7a2b932af911ef7f80cad85b653fc911e1a6bcd5b6f087acee39438e9a43a183adef4fe3d5b8d2cf026ec0057d60555515858c51fe3abe629aec9687ead8dce5302b7dbcf9eb8dea9f24977a70ed310bffd216952941ddeec6c2e51a941443a59e806ea54d2eb2b58e4361bf66f78823b9211291dd6a735e2c711d719fbadc181b35e736290928d7fc4cd96d7e7aefe571994c16c3ee207d34540fe0c024e3079e8c8a8f90c7abc79fbe2ffeb2465b1e2cd8f4d9176cc1f24c93dc2a38d12e9cee3346bae3e123eb2c28a3abe0df869b0e5d6b77d5fc92e934804b4840570cee1ba086174663777fd16905d793ac328949fe92cd7ccaacdb547c23311c5eda140ceaa29d8813770eec8be00b70143a586024d2c216c60d3805889491cc5aad3a718108cf24799912c17a12f48cd36c9baba4c4e08dc7c522882f4445c967098d01c4bc82be0f7d4806dfa0004096d3d5567489c5d900b42ab70fad1f1587c90d940e621842c303fbab1fb2223886c2eeb116766f1bce7f6b0eed032f040fc0128aa337cf0b350f41482717ce0c9ea1cdec59df1b866af9bb2aeae2be0cd9f31d48bae23e4b7202508367ca92d1973ef73ed628ef9db0d56c79973e8d08f1ac811b60888f90320e7606e4c9b819254d70906d54fa09da458c71fb5224e471cfe9d16d0de645dbbac613fbd206f542debfc04ffa279dff11c5985759245828fd40dfc8c3feef84b934d26ea81b675d2a6d448924ed9359ebbed67e6755743b04cd3f06ddbf923f9a965578642170d6c4b9da26a7254214f945b724e0ff0202a3c1de2ffbbb333bc66ef8ad5b4316035b0f0925ba49f9cf37200d2eca1f2a82089c20ed2c2040ff32cceff7c241b349e45d5990d80a7009e82a2b9d6ff680b053bfa7442fdbc8103374ff2edad0a92f30a26270573fee344f2d211ed28bb3ac1252b53654e611d85a45ec0b23de09c748caec8e966edd3482490cd331f784cf722eb6db65c309e6600671d14cf519e7592cb4a06efdfb53c64b494ce7ad1ca28f603cec618d21873393e938e13d7a17580c1e168e2c5793c9557fac33c156cf6ab780f5b2133e11d2704f634c26bfc0ebba1cf4d554719b9ab12a6401ad9afee7cb2299880662acfaa4406db9eb97ca8beb0c08a946fc6a504fdf6a9e9a0ea6e6da1d28cded0ba63bbcea925cdfaadfdb9a839cb20e5b9fdbc1104616a8e8f0b28d13ffcf9037decb7505f097cfa7138f2c189f6c9e2c406ceb3fd17628f1bcf4122353767ce2f2c78926121ac1534069eb4f372112c3d9534eaad5a82054edfa1b961e4d59997d5ae40b60c1a6e34bb2b04337ac291cf31f2125649a6b50e520ce574a93075c5bbeb1b67023565a5111511ce55e2444f5f38c77755140e1666438a5bb68818d3445ce926fee581369e9a1185aedf3f0a2d42a39ed04b0cb3f5b656c6a1688f9236d59526555d0661650a0743f4882fe5757fbe954876a4b79cfad262825d8519033eacbd8f64e796115eedc8eac1ffbfcf27b8ff80f834d7dcc3447755ca9ff75d1d87f4f137eeff756b471a1faec48c18ec4a3f6b3e14c7b1fb8f302c66034709dcd203", "ac51", 0, -1538484427, "e776eae5103ee2392d36d6e51566c2c79322723d0400f5048ad92277cbcb9719"], + ["030000807082c4030303a8ccc8568ca899406f648d850d5d3a6fcc3549889a5d80c7c9b48ebb717235020000000463acac00557a3244064c355ef33b4de9300431a88e320f91fed6d6a6812ca6573b4f7dd68b77948b000000000465636a51ffffffff786bb5e0ef7e2e13f28079fda9dbc238f221ea2089cff5e45c7066c536a6355903000000066a5163536553ffffffff0453e9a60500000000046a5251acf79a210000000000056a65005251cde05d0100000000016ae9f63b020000000000000000001df61458020000000000000000a11192030000000015c96f4e69ceb02e792ec5581da9c34bf3dd45a9fe8d81485cc14773c01eaf94a39ec129b3755b917daf7cd3d1ebeba83e84c857ffcb1c9524c666001bce838758db5635de6923bb02f5804cc880b168834aa4e034580a8f4311efa4aabd25c7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002933d964e26bdc2f0077ed4a1d9de5f2c1233c5a5e56e31b4a5b99eb6bb623b751c63dc8c1c9d05ec711aed683da7bc398e6ed8511bd2d9a144592fd6758bd2a5c60e1c6433733001245e920cf2dc8ff0720ea35e20ab002c5da97763534ee9b0fd84ad8fb22ce1d3790ef1c9047c5de3897f7adfd48477b5fff387afb7736cd030979c6563c94311d57b3353447c509f8110c24f102c5335d003a2cfd0fcc2b2e022926957e8bbafbac9b85a2b976ce37982b467181be50b9f1b84bf002da76d8310a04ab9cb0e205bc7e7dda8f6bf29657ebd8239c6c59e0b82fc5982a73e3d4f41277816ca4edc9c7722f39c255cbea46ecbcb7855cba23a28373b36aa56b4b9baf0306b39cf560a259c490a2136472b461c5fd6f723abdbb90521ebafc06de1b640e02235549cb255a6876e0b49cc1c9e57dbb4de7f4ed02f05404c0ba2ef207773a1d030d6f2ba4ff0393f0061616d80034ad862049d9a2434844da11ba61a47a0f53550328496d39db8a2e082139bbc58322dae8b3fc1f5f5dca7c2e01701171d4492ff402051f2eb8cca31bf992ccf9bdeade028ba489ca1c92df7c6c04e525f57388aff33a97ad262bdb8a33f2f4fb2b2980a8414d7c4307d79a9c99726b4064f671af5da40960da4205a1bb9c51e4d32d8d55da230aa3c6f69c7b2016789b07592dad088787d8d8e1a1ccf2ed1c70cac251b62750a7df6dcb154c2592747529cd5d2e69b9a5209394086fd48306aef1aedf8502c47e7f050f51d46f9028aecd424d0fad4aee7f861bed151c4743ee586ab5ad2abd23d85662cc3c62928846137928a0a0a601b815d8d104ff55d1b5bedeff1495ab2b41747c49c6dd152b7b5700968e6d61ba2178ae2bc5158f73ea110f32138175d7bd90ede4b4817ad0983335abeba22e1d7152328015300d0b0b5bccaa8c63ef636e0612d595d0cf9659453d256d2c5a10f897875818dc5765880c5fc31cb24ba2dc7bbc38a133d17644c8e0b6a7b2ce27f1b5f91c1ca06798543ae728cecb86ae4c35032dbf482e90645fdc5d73a44c4d758618761c18af58f4c642e4cef16556e4d02ecb54d3afd7eb2e7ebd76bf5f40816586bc0b685695946200d27f62182a553450478a0353e2c3bbfe0dea48fc40c85f688bb0c9943c81b59546d6130c1f94918612dd70b9e447537a698cb0d7a910b59b02d68e0ded926fd54d84370223ca617ef53d688a0624a90cab5bfca05bc5f494d69c2e3fe0bc88fc7b1b281a320f77e36d61d933ace52f807148d49a768dc1466224b969839be54220810b5e92e68aeeb04bacd789b4e9afcb47cc52cca0cb8addb159dbd93f6c024aebb5807583d14d44270322a84888960f7a054cc98aa9b2c780813c2e7e42844d1e3c9565302ac60b7d297a7ee5cec176fd77a0d4163124aa784a1274aecc7fe777f44374554a749662188a526196e9f2a674352935b17282ac45725c4e2633859684a2425b36626e88e0338b465e62d2abc440f551803884a0c562b31add8c93feb898782abe31b8684a1faed9b49c8c0f2eaada2dbe4dbbcf3b659936d42fc1b3f914784d27a759d8b5fc89fd23e3c08c694e430aa20e56608d2b2102b65b6caa1afb7e15201d18e19af136b19e471856849b0cc4d1281ffa7e7b6e8d2f190dcc88bd30088520dad725740ec27505164edf862d36ba24368f0f2ece9582c23941690e2c99f3f10d73ebfe853c302aa643cf19dc2fb085d882f5db055a9d941763388dde557b623233b522f12af53bfbb2d5f5d9a3880396b0b893550496c9ed90f736c1052e0b6397ae0df3822c7f711a3b8d3ab0d17efd5e889c992e0d956a1b9b7e80d33e6649229ab4f70a1c79a1dbececebb8ba533e94721d07609183c2eed020f30b0c7d0ce9951a160807e9d8385f1d3776d437a7ec1416f25cfd08d7d6c6f5578788ed98f4960cdc68ca58c3f57b195c6ab96c7386a70111c526fad4190659ce284af7a23462c710e5561ac48203062863342844ff27a5409af5af3a4687993b71a676c8ef179cab446a7f60edec4f192ddf644d8d8226e8eb4d06fffaf1c0c82cf931becfae4a2c99a51104000106f1f0baf14f60314b70709f0eddd0230ad0ac783e5b2db403fc2b7f999568e3fdfefcf406fc67c74b0aecf7e26479294056446eddc684c3c4f2dba8d13ec09223aba7f63c79abb3945138ab6b4d070cf34c9869788405931ba79ba034955cce28801e5a0ce6c0fb347c5c826049b71f8f090a47f7559890e929ba65831677889f14b3ef5fad350329d29d741600cbdbf0e000000000000000009ab84401000000005b23eab4251260068e75e82dd406e4ab11d7150ee7a08e0a7ed8193b22a8310572812799dcb5ee2697a8d66beac9fd1a1ddc17f50c25c347737c0cd42b56341b7cc26e445d9c5355a2a60f4ecfc5d955ff0893fd594e8715f8467bc39394785b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c014acec6d89e90f381e2638a861fa99f73c7eae6e1eb2de90943d036842a8b13dc247f12598c4fd80cf5d6fe8b177ae6b1a647d927eee68e8ebd6ae8f973ef946916a47555c02467c5b483ce7ba08310e9a7ea2ad85ee358f9767ba242412060595f0fa427c367b17d62e6b08b4def65c311178b5f915294c7f9154ee655213020e952dd89159e477673de2884245178eafcc1630fb2009afce07573b76583050032efd075c9b8d6182b0716c4287e344f73bd4f497d0b14859aab103458f2afd8f0a04d73e8c45597f28d71df8babbda16076b4c9b4a09e102612d5a1fa81c353808ab4aed3d2557de2e809bea24f9e95aeb844e285bbf2b12dffdd89feca524b815022caa02258c2c20f6127867cfe24314e3fcce3390c1f0c939adefbe518d931f2a02147f593dc36e2a1960c694b3f8825ddeec914dcc9d229b030b8f383d0a6c54cc0321cd3e0f40b75ba658819eb65f4d3d32b05c2dc3d1faeea0f67d1c5edf949b4e0212a727e1147615fb4ea6c4d4dcf6b4ea62ae4f1310567176470b77d61a433b1c020b9a6942f43f41fd59d6891894ef476e370a30e25fe1029c1c92bb1062acefc7346b340361142a642679765ed4494b3fadca3f8dc573b10fee749f3839c203a0e94ae116a6ce53ee36920650d5a9e368f211a57489e5628fb982c6276e5ffe7c36df4a18e797f35118f527e4665eb778e987bde7f4fe643b4e38e743a51c630a8bd1ee833a2ea8094818c189da4fb89dcb9dc96d3e571119e69a71b09b31f1aa2289a3e08079249a0bb750d19f6cbe110801d1a1b2c96ed96ed9155ebf168afbecb869b6d2dd425d7b53a55835959acc88728a36cd39dca742c0e719a62c3a3b23dc2d0bd4d5d91dbae4b474c8988f196654b164945f455bf9b9e86992f31306cc52d1392b23343b7fd99366c6fe1effe1274aba8744bdf86cf4956c76c381a255094e4176450d9d4343f13c4dffc3d18da0e0114829cc85c24efa2accb0e73aef3c0ca80046b2781b6b9a212d1f698b3d732a3b7f5011fb713d1b6df0001cf3174b23d2b57001c5d9f50f2a98e1698b6ec37d9023f67281fcd0495b3b29a68d1d96eeefcfdddad6140d40fa154ce0afae396d5c10d75b7b2dfc95575f7ea42bb814fbfecc3083d87ff1e10022fe7439ef22ff9944cf65be95cf0f9700b651949f039a89bc09ae82ea7475d41fdcbbee26ab936a17df9ca5d76556e6778be03a8c77478daa4e094514d8ce9eab9702920cadab6797b288a1d5bc05dd1bc88d9bffc8ba0f71448ac584a7e090de137bfb68222c717c42ff94deecd574efd58ac4be140e882e3dc15236ba19f8ea9a2039f2987df7d0f1858cc9a9d47baf1d97739c0d24b836458fa62ea43c3466598480f4bda38a4439dd3f4630e9889f9963d8c33834aaeed2d3f83cb95d14164d1945deb3fc8da57f8481f80b1f77f89ab5301a22964b955237141645ffd7faa0533def46b2b363f68bb9373f312527dd95a4e04f1e5a137e809c69430ffc2db496ea61d6adbc72544c07f196165a8e669f428913b7e30ef7f9a5e4b90034102e8a42d7bd510dccb3b1b758a5ebe356a71de1a5949405382ed578529ee2c81603e3ad8f594186e6743e1073062a7e70560d57db1a3e2a49439b2d628b59b994c81e7373ad1862e3572e91c174336274fd7c15101e5ce22b38508b64541d60184ab95763ac62a27aa93a2317e3c9a38b51256fdcf1284600f30502cd35f05c14759a6194bc152fe5281176c19a7384d1fedcd55d628d6b878da041bd359a9fba2e73653e57667e1ca3a03f3bfaf2bbf7e6ec3adace9b2fd067dba0badbb74441be93a43a85399df3ae72eb75411793b329f18cf76b488a24083772f33792a51d9a552021741a01726445b7130b607a21ed17871814e82f44753fa08cca6899defef07a21d717b0505018f5e1a8c8c184e8ef99dcbb88186328917eb48ce01b5394b97e42b09b4b47575c982579ebaae7e22d6de14ffa39e50fdb1e3787edc73bde2ebf824836248fa79e745631d30b0349402f8459a61cb628e0aaac00e72f536101bb058bc5725c6c2081c1262c22a0972466fb5a5b45de7439e2fde35c152eeba67cd94bfc8dedee61ac45e050e7e7dd8ba799975fee28b7f790ea1ba72b1ed080b9c39256bf2675ae1106bda4310fecd2ffa5078c3e135fa42f8745c9cf6231797e2508a4c78c56d3ad45f94b3e04804dfb3055c566fe0e81bba53f987e79eebf77374939bc9263a858556b8480548b88c5fd234f63a3c2b156cb5fda2cd8b839b4c331117cabaa1d4cac5c09dd0502a224d866616c80ff3ddee99b521e55e2d399811fa391e698eae74a5f78bcac02bf19ca628f1abba7dda3e4576e600227c633c0dff007a56c8249afa52e2225fc948cb2e92e26240ae7c45dafa22138241f0ba908", "63ac516aac53", 2, 42175151, "4248c8ab4abbf1f7a8f32795bef81bbc352ae4c582664629cb22c8b5ea4aba0b"], + ["0a97c21203650da81a413affe76971c48c5a9035748b8f0fc12a8163ed53dc2d30948750a90200000003516a65ffffffff72341663f2a58218942b88240832a61514e3d0a4eb9f90169795451975e3c5a0020000000153ffffffff8f16a9cc16e977e81819e92d6df2804771bd97218bb250928f9c5b6a90a2d8a6020000000600006a005251ffffffff01275ee3040000000001635cfa5604020000000000000000e2b51103000000002edc60bf57a1f179501de2aa352aa53cb1530fb4dca5f9489d380f0bed8557f1d43aefdde9db29fcce64eff50abb43c8fcb9c7297f653edc871c3efd7dea08f3597decd3728ac6c5394aaab9925f763a942d8ba6d47174e20bf73f60704d129c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bdf8f28df482c3aa4af6f96fd7a1df095313859d9dac0a36731485701826c7666f5ee7c11319adf11276796df30ea6c90ee0df6167f730f8c0e5e9bb0b6ba855887161f52500dada8007be5eac647a02e13cac180871b3d50325de3420fb28f7fd9a53c6c690f26bf400d69fa37d22905409bcc36c0a832bf85e8e46b18f2541030ef55bb9cd7d47a08023c6a5f93dcd1507f865f2b085fc243fd4c35d3e59ef2e032f7abdc8a15ac1e5ef88fe11ba5eca92213664665e04b58b04af352bffe8d1920b01f7b2cdfdb84cf76051bf8189b1ae568b268170cafa76ed500a142cdc6085d80016d843419a22574017e6e67d19e71e737eb7463282f3c3004768cfe7388787032259a8fac283e76f19d4dbb9e03720bd5914dbc7a526bd8208f4bf21ae5fe0b103165fb0981d89e778d6b1a6d87fe5c0c9f56fc0408d911279f789445936071e72030b698c078c2affafed28391f0b38d7a5926ac221d1b40827e808a4958fd4758f030292f569e16171f739fa646b1f54bafbdf0f0cccec0bf2d5c21fc6c802c598b602306145e20b7d9945cd213112885cf60b7c5aa71a39e396618ff53f0d43f2471da827c1d42437c5c1dac59df73479f442ddb6896028779ab8a715f816c04d2123b4366da33c515280975e1719361eb820850818e94e563d0787af5ae359f667986908adaadc96946a512abb9bff0480fbd3401f64465c08e6525a543441566768f7d5d84b9083c63ed4b551ca4c2c9c54ccfd77c96eb5babeb4f00ed46d6930fde60e86efd23133ea60940ab7516f5d6927e9b04d7d0f8a065f34cfd2df832c86afeed700aa164dec352c4185cb689b9a7de544257c5da23a2db9f6e5ea9c4636e416d1b0ef1efb51d324e8dc0dec89b01fefc30fa469c0482b026b3c102150a2b031a87038b6713b3106a5ee5f07b3248f9c44390883ecc47190196e143fcfcc14685955622fe25aee2ce7acc8389ac54ddae30c9bfef7508600cfa81c76c5b0f9565ece44d9a653b07f59bc6e76101a7b63beb48a03b5cbf97fb5dd59876bdc356420050911af6d7788bcdba99bd4d2ceb12b56a8e3676f43beaf5b6c4c49be2666ea805fae085707f085edffdf9489da85e86a3cbfe7f805ea14f95f06368de8ab08a6dc6358c825989a330026c8e236e82de36823fb3f3aba58a2a16a31870875b7c0e5e2be62b9530fb605a52f8288df4bbc62afa7bb00163fdf10764e9f891e12652813a1c1af54d3fc0cdeffc9dad2c12388a1ce64debce0752ea7b18e1e6137fe3c867239f6360146c5d6d2c295e1c74aa0cc0c9e2c596b43ba50d6d3f164a55bc30db12265330d64cb7c937f66f210ef0408be56025f7f41d7d2068a34c5a43a76dfe08d8f7b8ff24e90e70f5bf22ab646911af19deaf88704f117e8ee7dbbb138dcf40952ba191745ca4a619f84755c17d55345ccc7a6c70dada3d0daa1ddfb821b042938b3308aee9379ce4bfb4054059c000c5d95b171d6e85dde0ba048a4c2925f02acdc014c62be3d3294455668b00497961d9c3ca9e1897398045b55076730d8aab825b3485f90df4d2f6e083b6212aa9010ef9eaa09e20871c81cc06f827a3f59030f156c3d92b57d220c4233f0a9182a46442fb8990b19f2cbda39bd168dd961a1abef69d2a04775b90075b6d05bcded412b53222d72303cea0e09640db0ed187746d1b8af4c22f6299402e1a3f4971947c5abb0c8bc3c7faf0b22330d892b1129205c1adf42ea1cfd37b90730965ba4745865c7026bc8dece8ab3c8fa5a5121a6e8ae2c36f23f863cbd8d5662b0d347534821565d4707702523eb22aca15e894abc3a0691028dbfbf3895ea50927f79111fdf0a05605bab4d9db03c5247898846a0c5fb04cef6f63307ebd935319a8aaa21ddf47e5bf3424997374e432061cf15080cdc6c740ed3afbe68ab4b12cb7bfd34cb384669d883302bd9465fce76f910344bc523d13108067f2c47c04f4bcd261c88430446789963770402e49a8e0067d624f6343691b7ec784e0d4959ebb1377505fa6ec5ba35234bac7efb6814912651caaa4726ab9f9466eb9c7fa0fc61b14f758d1e7b7af96da561363d85d6084ab3f1ec480440d1656dba261b08aaa653cdb100960fae4192deb9303bf9d56f9e8e053475fc2aa880e4dcdb7944f3cee57af2b5bc6e447984484cc7b4abe2b32de596a9d4161a80a49b0145cad41da163d22a424fa554395099fbf7771d6b1a68a85d2777e83c94dbe42b46445572f6f0a154cc338badd16898fe66195661e25a091403b3e2b73207ea0000000000000000870eea04000000000a5609abd0e63282a0080ef2c2dc072ad9e2887a712301c4d4c8def858b06fc03d51b3489cdcc7c6d57d8ec640ebea5394be01f7a1179eba2eadc3f16e496650bab1fa74449421a67f1be8be57242807dd24a6b206d4a8d3475e793ff6757bc300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000219f6c952d0f70054d8ae78c9b118e0147799942281eeb5fd191bee59a8338044bf7f98773dd17b6412fc571f7d36773b98b45d91a246cbdbb5a026100b24abb5efc47af6fb3c94587cbd624b4292b5a416f03599fa4d1ee2e159e2844343a64c1b24b9c4eaa4c3fcc2451c729aedb6dd210d49bbee37ee0db7b6285ef8e8c0903231df0b65cb27be682dac6e15e0d027929917afcabaa49daa41054ad50966dd70316d1f83c250d00ed955de33fb9c05c51108e8f7a721bf81f788e5b71985852660a004e360e1633e459559b4b4706935f70454b57eacce29c9a69b3afc7c066257ea76822b5f1bb6318eca790bccd9088109ccdde2a64320f2b86579e08abd52d570221415539d30df00f626b66f5e87d9f2300e822e5c35d75acbab1caa98c1daa1c0323e550e960bbef700b76b89a2e254af755f5f46af54a7f0ce3284fd268d231c2021ea883e9c853e1387a7e46133b7666848da8a1b00e13a61b70f3008d1fddd609031688e1fbae6cd9ca84ec257635752fd113ee82654ec2d66c840915e0228fb973031c4a1bc8ff1abdf34294ffb1cf73690de2cc13fc095faf0e530fc6f854c35b651432cde22a6cbab9079b97e2e83f29e5842e5f41c1f43387a389d25b2f53c94b81ccc3a0c1a4347b9613fe0c7151b6a50a9cb3b41594c3fc2d1026b2404f090a49fe1933e950042d5b29fc40bd8fca3c2c1b00047cf59d7c7d994ee33871ac1c3ef5d090d3a1a86064c1783b0861a1923d6a658ad86f65570ad470c68e437dcb9aeb151851ea98faf4d297371b1fcb1c2ffbdb74c6b0c5dc2fa453749af8d1c6b91c51bb00440c826f07f7a4fb60362bfdcaf9a08be0bcf11f0e1f778dfa2bc4d016891799c52cdd32d05880d9308c6026b09aafb9623f7221c21cbfac0bf59a056467c03ad3b7b78d6fcb1dd2e8ed396b912a43ec243d42a6cd4ca1561bacb49f750bf1dea65d62427941283f9995cc9ca64df4b1720fa9950736ab3f553b73fddf0aedd8a877017f7eafd73f11d14b2008f3fae327374fecd596ca51a4a98c8f12f065e5521e48cc179bfefb8c5ee72caf11add3af3ffce8c6a46498fff34424ab1292d66138e39fbb720319554b0dc1129a367400cfa5bcaa4ab39d5a279b38843dbe2859e77512c34f4737fca9843c1ccf94603c13f1d4d27dccaf8c6d713fa1a2953c812b550d6ce296de6fa2ac175c0c27ea3001c87f97607dd3c47b55240cdbb82cd5c9e3e4c8de7bbca8aff98c1fb1dc8f7dca71387b89d88cf9cbc740e944a061a82f825ce0f17f91ad241b384ef6e8b6ead659c0357b67517a6f8620ea613b5cc50522a4a39ffa5e65875e6fd6f1a245182986ce1d9330efd237ccf85d751b8e158613341da2630f692a3674c7de744d75fc45bd335ba077a674996e142f1eb94c15f626a89d09cc54ebee45e14dd284d37a159291e418c56d06a554c37a3ddfaa7d425cceaf1adbbfa72ee8e97718f0d079a4123174fb3481962ed3459fd805c41faa51b50b4b97a610c3a58bcf3731c57b230862bf3ab8e1182811da296f4f97f860bb644e22058095554ea1962f9f5a78537efeac9e1d699e1f46f92f08b9afb22a7af567dc82eb18355cda18da801ba8adc3dbe63cae21d2eaabc8ab3d76ca4b8446fb4fd1ce647970aed3dc418964e5255946d371687d2b71fa50409d9da893c7422748611e93a56b6185f28c46de225adab51e554453165f8bc475f95d84599b938aea20f99893700040d5fa7448a195f7a49d12b0692bdb7198463edbd85fbb72986cb361f4f561a845f2797573bf9fc42eb87dfe22df91c0af609fa0fba472812a600a641a8268113687bd82b58ba784ae9e01422c59ceaf59b22ee46da3f0967f9f7a8c874b5679cebb9dd8d497fa675687160293f1a9056161edabb66d9605336226e1c3c4eab6e7d28084d526b0e86ee667a7897b3a996e4b60afd297688f2c506c2e6a40f1d7fba77a6b298508527d31a21ecd61e265ef7faff6463ea6635a1f05145d349433f2329d6d77111a7acbd9b79736884299f83ad594393372f39a103ac1610b8b7b4cc991c778d60473fb108b10f56d64c54453876dc889a9098b1e64f41f8962306f7a2f9f3f4c18a6cfe9d2dcb0efd8c07d3da55ee253e71962ef54cc27653613f251f8d98613530ea7c2f09680a204d774cd2b4af033f3ae334b9dab3a630619f6bf13e224c913aff214a7839ecf29f0864e35957f7a9fdc4b736d0599bb145216095e9433de19970a092bdc3adcc0555e203c42de18e81e2a9d5ef86f019fd56beafd0d8c199daccd5e3ead5be76671c09d84bcb9dc9d7e8ded210617c68b53415d44d4a7e2e3620aee17f91a71e5202ed50afe47029495299345ded480534be5d6a5cf865885fc39422795fbc4c1beb45ae8f325fc9a9568d7e3383204504c00", "", 1, 153873995, "9dc963558e8a5fb2b5bb0f35eea42eed3d228b8015b0230a9c894b5437cb2f86"], + ["921ff61e0317883ac25026972280692a2fe4ad3be07ae65509a9d1c47da3bcf520b0556f900200000000ffffffffeebc9086ff431df158dde1aa42f3eb5b3085f44ec22632cb1893376bfa6dd6cc010000000251522eca9086fea9cf2591d30e2a54c75cfa0095a807112a56cafd1b431737083ccf2ce006d7020000000952516a0000006a5251ffffffff01061ce0050000000005526565515298b3e1f002b287520200000000000000000000000054160612cd12137294b9d05ac9642dca61f5c66c1eec1283d3a032fcda95e92bcb5def1edfe211208811443d4f74f5e3ed33ec09ca985597703c76bc9e2c581060f99d11c809263776a65bb96f60e419a59469b4bcf84f79f54c3cb1adb4950e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003a9ce873ba214c722f8bd0a04b4dacf5652813a32b0086f731a2f124cb5c48faa5c9169c9f2ab8f7e9e4c58ac427c1b4ddbd3b089da7cbb79378b99442c19622d50cb42943e4fdf8e505bb67747c6780dac96bb20313da98c024a9bb45352a3eee033b6b6513833332d1787b1b156b38ea21c0ab9f5e55bd566b7f30afdab4c10202175e16cd295c25b68785d18e45b2ef62961101cb4a4c316251dc990a0144340309fc891927d708101dd0791662d515aed35f285939bf0e4ca23280b9d32d8d350a0427a44494d3e0ceb1a5bfc96ef6f7f0d5b540a6e6f53cea082adab932e17729c4e775f4930860eb9f78971bf306cd84e7f6470cabe8e08197756dc11d597a1f03099bfb7403765672c8c0e38d442c58fd5580d904686a3e70ab67502f39e53ed8031e7faceb5b3b94df97af8d01dee963c7a589e7bf7f7e5d41ecc31581b1450274022cc8ddf8e93c098c86d1bea23386103ba0cbea56b9c12e62866ab90a2acef38903129e7c03098fdbc24f6a9feab491cf0472b07d2d0c95ead393ee2c78fb7664010328091ce80b8af0ffd29250b41ae4d5c2d188aedf093603fa9149de64e51427cbbf71584b28fffada013c570ffe416eb7700daf053d12bf3690024bbad2ca3245e8bb96161fe34127b1d9a9b740af37db05a9ac94a8f7a3a9b528a9ed82e3c72a4d455feb7b695be53f2d023b60c73576db41414c27ed500066d4d1caac33f202dc2556e5f3c10ca43d6facaac04f9f5767df8126e512f839b7c13bfcb0f0a0ce200520d58ef15f374492fcb56c4411cbbe531f8fc98df3528a256c22777a3848399473110488ba972551c14e22a8ddb9d3170d1fc0b7297ba050a9775eddf829ead84b5b310e3f8edcf85e0892057604ebbd99f6b25742bcd249e4cdf62cd9ea4dc58d0fe6eb02dc9267c07bf9765c63edcacac213f4d69ea21de29c6ce0caec13d6a7f1831b4785d85360e464b03d1e5c23b9a558e74c98c666c8a2b3f2ed863359ae1291c9a0cc7e273ce79a4e2e729cb1df581f7404f82a9948e8edbad396e1929acd3ad579d30c194609b8fce8474ba0b8fe12b110e341f272d8baed1a8cf743d372907613b4787bcba4b6d864a4db5621347135af62f11b82976813592ab44a640445f1a303ff4c5ea591484568939f6aa6b9cee87818febca361a0b0965bb98b9e93755b6dee4383c3a3aa94d79e3ded1c7ac499182e7ef29b8b0866b6a686ed6d1cb125eefea7f2dfc089467fecb1d94af9d6578f9c2f9754240c76588f71d3c44790bf800068d1fb0bf07ff003698eab8fd714d5c0568a18a0f45a8e3af5f977e6a7da4b5e8c04d22bee7953331c9fe96dd42965b566e71b7b9e510fdafb45280c92345e9f8aa70421079c76f492872bfa58b499bb77c9744ffb946e6726935e77ff212a8eede49ac4834f085069b1dcebf9ba0f7525919c98781c0f721ea9bcd4fd05fd7ed0c5a6e0d7352eb8a249bd628bf297da272ef1c58797b048ae474ece215f9f297c438034a434ae9bbcaab4600cd5c64598c7bcb81f47068fcc1a273818b148be5cbadfa2b558aa820daaa5930ea320a5f102861bb0dc0ec712227623d991b930925011e0102a1da9594b3f93d5a0fd4c31c020826717c56247df8e0cb4a8dbf57a2c8ce3da589fa931405821cd353d817863a09b3a2b437c2c0bae7056e1924ac7d0ef539e4f84c9ca58e51b2ae888a480d8b574881ac74c15c9de334dc5790a58f2817652211f7b3e7eecd846083e06679902ef4111e7149d94c4be9475c818d31903a8743a01456387abc9fda80aadddbf0da6ac4ff4bdae1cde40d558395de8f3ae846932043394ec2db4720b7789e14d51806f20fd3fba33061f1de5da777db00c1f6bbfbbb9b66a294e91419ac6fc6d189581c080315e812958c8df7935a801d3734471a45f228469c03c2a5f9f93ae3dc6208c22274c714cced4db65992b70ffbe9f99a66ba303eb32bc36e28e413ad40e971d732e84d85246deabcf025c7d0352035c6ceb7e6ee42796e10b8b03b5c51940470842440e67a5451b3624402f4579df7ea27842d23ca3b44fa1cce112e47bd07001f68e66a4f49a6797c1f363045448ac64a218f922817fb743a9d556f43b365677761570246d8e6bed9f3427fdfc1fc387853bbedbb845f6e1d312960a7aedb1b7b65b3cf1202ad42987572c1eef5b6d3133fa7331d831f5c3de5ac253cb5f405871905fc7d9d6e787db8cdfe37d1037924fceb1fd5eef2944a069967ffb120114d8fc5f81d893cdfbadf9bc327b27a7ad2c270000000000000000792e3a02000000003bdef696c43011eb00db5c7362819c1e4eee535b9d863ea3e8e3cea0a97c1480d25265192a1122f6af07e430aa3874d6dbd0c20fd1706b8c3a4ee0fab7d84f0f852eeaccb070cb51db8be3cd003dae60664758e8a94bd2a8526dfddb39a70c780000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034a1461e511945e4933a7cceb8079971ad7b71d6c26c90c79ec688a320bd3802285209520450c39d944c77ca31500cc5fc4ccefa0a0b33e4a7a81b1998347c3b54a931e565f2733d4c6951dcf9993a7af42aed04c37a327cb72fc8b488b40ed8e3c5e4ec9b4ee258763bf5a452887541aa1a9ada62bd513233b2d8fe5ca9e01e0229727fe166b657c11ed4fc6fbfc4996704e6d92dfde94bb90e4fee447a645142021947d30a5ed749aec1d3134f482ca9ddda1adbef8165e5f65aaebb4e9df257bd0a075593c7f0075e4612f6bb38c1a5e579ab7651700c9ff5f5ff8a981e95d0e01ec5855b80eb0f9d514a8705c6aed4264ee980ffebb80b10e1e9db677f709e792002262dbd6c8b7ce2282781fffd55f6a20308dfc036c765ef64a17ae7a670c27da902062603093ba3d9fbfebda4ac57e668ac10a7b3e3a9732c89e6c65aaa77ce4a29021ab55ed50e01e97d90c6481d18dff5b8e7d2a4a1a6305aa8b58fc2848ef860060209cf60c1fbcc786cd32dfb582bac4dade03298a765884fbd2a5fac1dacfe4418020028bb6010b0e0cb0b9352e68c7f5f9a846ec6064c100b24c36d6ddea71f6d918a8fd15e0443752baf5e8cb3c23157439fb2655f0e634c043705297ce3f81e3b1c3d72234b8b1babee1bc522e795d4c394ddbb488919d5fb6abc7910a3136eda9b10a553708ffd6939472a81c0fe18d1326c47f785d0f5667fb794debd47eac2e7a9bafe448cc282076b8fd860432ed288c53171e7782242aa1d0713184e102a31876240a303a59c80d13e82283f94dbc2052aab6a329ef452615ceb72c7f0d4d7740d1aa425159d00e8befe860ba46f0a919a5d5da7366008f1a698b35fd519124955148e1c811d9847fc394bb78985605c406c52e6412d84dcccd86730c0198b5d2f8d155e81d5da0d3adce872d61cd0dd6b0c5aaec29d97e92a63439df2bd67ac652cc49539bf85dcabdc4cbe3c6687d84947cf3c8a241157f1c7a848f390e7f4acc0b093b0e18f03abc376eb0b8bd1122aad65c752730f49c295b48940091c08b29bf6c695a181101d245d7ae71e6791455fe41fbeb5cf0f42de8711b0fd086debe9dbaead1a345998199511e0401a68995d8cc1e4f3fd5f5c86134a6ecf1e651e0dce684ecb3085dba41c13f147cbeea6fe5fc0f921f83906fd0b4c1b27aaa475f747fec54986393997ea685276529995aaee444feb90b4a59bdaac32fbb84ce1a5bb6265e8023913a357b01c8966ed9e0ddd87f3fb0b4c3e5ac3d1063de5e019e7d6b5e08833b618f58d6fbf484cdc3fc7f90091e379ec7881c78a97e8d7cb5037c97b4000d3993140b0d44b4aa50aed559477b66c60eac298cb16dba5ba61f05eabc110e822f9ab9b13405d4a816c0ce3fa8ddfe560645f113398e72bc2f085cf5fe3391e121e6115895dfd20aababdbab9f7a133ae33e711fb5f46494860d72224c7fd06e0c8002965bee1e2f594072eef6897db110d87e56895399271a97a567562f06a0d124b1ddbbd1b21175fa6ee5f81b573063332ea487816bd25a88a13634a93aa4cd69df154fb80011ca85a1d0ea8db248b7cd4a7f0670c89c1cfdf1cb37e6f8e6fbb88f4817e5c1dc86882c931c44be897acd1b0bc690555381b9a7c785a7286941d3957dbb528ff970330db2954f84b84d5da8482b753ad672c8591dc36341823f656013a97ef72329a48390ead6620d4a76c7f3c2b9ea44d08f1e392f72a696c776053b75f6c21ad73047e4be1eca3b9112040d011ba4adce35c5612e388befef785b5ef82c8c4269ff80d1f5f1fe8e313dc2b53a7a73d03751a5b5db7d0aed8f7adce1428c040197a3584c79ad4413597e751da4305cb9e802ae4dfc50d9a4bf52c925ca5a58ad24435c7d64c46f59ac3e6fc1c9c6ee43684bb3dc30ebb77f154bc48162e4088781d19e377950748be8cf84fa65547ed6004274ff7fedd749f37a8c27e62e7922a0e322eec5197570999a4c3de384740b2e0f3360d945be2970c882b8d4b097053e9ca4b9bcc50193e62d68cbe3f31a049d66f9d0650d1fdeaf44ec56d16e8cd7c771addea87a4368062a7e139a4611b226003d120795758f496969a29a2e90c963c904a739fed6626da4d7af00088b6dcc1adbfedeb4b7b425888d285c40fa5f5533fc9a0746c84b7bdacbb5bc36ea3d47eb1b8decfacef642f423a2223f9c46d7a06377b444513072be6eb8bc852267c65d3990cca0fa2acf402f489e6f0ecb6bb64878fb4e7133c094aee7c69eac20400112e38365d651bb52c0d0788a7126e9580e8ef3eb4095319beea253d712f274aabe14c3f4bc267fd9c651911eded2a5ab1652679b6393ab4fd77313a50c4eea1c4201da15940f7be5432fead3847a49a0bf2ed2a7ae5c7490c802805255b0ce9c3eab4e3cb365162d58ea20ffaf7760e", "ac635263526a00ac", 0, -830375959, "003118766e6a6b68992379bca4b46f0f8ce4243c2d1ea7e21856c0c223d998fa"], + ["030000807082c403033f608084191c68fd16396b6343e2687b51b7e91b201b6150d0d81b2fc26a62650200000009516a52ac65ac630063ffffffffb4b58b17a6ea7db0b17806eb6eded5cdfd5470974ddb45bdb34585ae0cb3722c01000000050063525353fffffffffa37d3491d91ddbb3d48e8b42ed524d164b01361874580cef62ea4102ca02b60010000000200520dece52603a60d32050000000002ac6ab921b0050000000008ac636352510053630be29e02000000000851655163515100ac00000000be9e134f020000000000000000c66d670300000000570ddf7b1e5dd920a90b99554bae7e8a5d3a7f770a1e7904e5ccc1951ecab697d690c2df17347d068c56f5d56ad88d4b149e5cf549a711a763b6c424e42850c7c64e25a5b8ace477fdc8f3afe31d9b0ec4ff54e759e2bfacd83cfb20dae1c6d60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072ae710da3e4bf4d904725e26e8faf2c54a716d5fcde94a547b60c7d278f7fa4bb1d647fb1eafdba705ac3bfcdd909869ea20f1e90eab670c5a0fc379f2761be2ba62279213916bc28368b32f94b53aef485e954f202310f5f3028bc678b03c0e942da72bdb12e520fa5f4caf9708b4d7a43e34ef2038a5c981445d31feb0559032cef24c7e5bd531d49c05b77a1e72e2b7a1137ff0256244f6c35c29916c3ec11021be17d96922eed57c0abf2ff22bd7c7eb98093487d65f60b5946b90ee91bd12c0b01eb66f10f973c5c16625c8c74e66199ea1cb042679961f09df2ddb718faefa0cd437b97faa90adb13524271bffd60597e75f825ac1ac74e03e4a72549d3d91402144dfd77720b28b954fed38e8ed94f5c62ae191699dc91496f178207d1f24868030ad83ad03341c629b643a95f1ea46f007be06a108737e4a387215b12175c3e34032b6c6607eada77ab0114d68100ca57243f7d65da79a24a0b7f45cf39814e46160211ebcf43f50ef90e2d0fbf720f7fa4dc10c52365109eb92ca7aeae4578a2b76c022192a04338470013e62d4c957c84400392c9f563a97f3b3948326fa7912846be39592780135f218cc49c9274476cc22c05dca84387ea1deb8466b6494730b0286c119513926150fa4834c37a3d7bd989d6866213cb4f3000177b04a712b06a33dfc7d0e4c11ff80987569fe30df48596140b54829971749fb9187b2473507fb23a138cdeb2e0e8d99cc2b9974b08ed5e3de6206fbefd8b9793179415a016a2db29ff2bcfb27a007bb2f2c045b92e283cef46426494182bd9d0563b08f6357e2b1e136e52de890e31e8900cbabbd9ae6786d51f91dc1e2f68204e54a09b366ed5476b9855bd9554ddbc22917f6c06a73cc9bcafd39b510212487fe8e4fb031c97ce0284458f70a853e66f278e7b0f57e37a5febf016ad1359729456da4e9db3852a52cd0e7084af820155eb4fc15f631f9c4b33253b43ef150ac456a403a1665dd67c1da3420106a1fc4eb87208d7e0296d914226b0e279838eccad63adb2d237e3583ad6f60ae98b53ae43bb2d70e93128caebcc80948805785d921118e3c940b5f94ffaf7f91588c967895e9e886136681c4348969829809c2a85003e5c10180bdd9053e8d4bc4fd35dac216d2c1f28e01202536b6495977769edb5d628c56c4e01e486e8d7312632559ee0dd2282f5dd284859d1b295e893d209ff4b28d524f5d3688d86daf649121eecf235c696870a6b23ff898a5234be5a1b30ee67ac40faa1f4bee37f5f81e67b4f686cc1369dba1b724b511c945ee6d993f4c6857b7d926e07084dbc67ca93fcf4a09e0350239445fc423def7535c9709dcc06c38a1f633b062bac38ca403f51695ae28e52c995fef98cdf7fc8f2da3de0996cd3d1a8ec687f11541a67c70459703580d4b78d3c2377a1d57fbb67f09ac75a522d4bcab3c6b1a2a5c135d4e08a82f1d6fbb4f79f805b33ad4ec07faded243c09e28d675446d1021e84852e8a3431293574dbb3241643105a9428b49a06e7a4f230c27ee4d67de1241f80df940305d50b85717f2d8e18ca17a0f55dc314eb8b5f075fd10c8b66d67239f78784d7c0fe8c2cc90d4ac8df1255fda418ca9c50fa1f265dc945bbdc8a55f800aa6b271296485fe5364f59037735308b8c967eaffbcc09630c69999efd6e82d0e3eb7e70c4705bf13b7683651c995760dca8dd1cf933aec0a4cb811c8d946796f30f094f34659f5b4bf3a3f848c7ec80fa6d31b426d0f3026a35ae894dccc090fac88393c75b084edee5516b67776fe2f81b7a50ededefe14f5072371c86275b7d84603cacc1648bd48465a76e8949ec1de3ce3af4bf455f9d3cacd6bc2b610696561a3e74588139472df2793a1933a5a8e70d98fa43f1a91c5539962163828a5119086d9c11647bc7ddb1697edc57ff31b8c7a4ad9c9940a59cd6db412bdf1e6a809c7e84e8b7a68a2183feb0709826c64f191aabe945c3bc5cb18bc306a355858f13063305393112a8f3103b9282a98fce3a7276dfe9ffe960044175415c5071e8e0cca281f8647436886e14b9a388124646ada5390c9e362457e5f740733f7b9700388fc0951fce13bc5000a6a3620ca917a1d776b2f7fdd28da27d96d8c22a042463317c108cacf043b4c48ebdb17fdf947a65ca950e079c823298d19614c4955489ed6cf75a583df539f20c957a9479d8dfd630c1c54afbce7bccd70321b84d260918f68e4157663c4780fc07c52ace580a72f7feb17ea7dc633d7b3852f9241ee9a63bbd5791896b000000000000000090abcb0400000000bfd8a8e05eb5387481530c0ee1eea1bc5747c3d603e9589737367ac6a3aa258185eadfe436c115ad17fd96609d8d8fa5788818d4c50b955fbf2ca40ea2b4082d787e1058878b7bb69969c052675390b9e7efa4076dd473cb158d11da1295d8d700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ec99d6c14ef32705feae28df5ed5317ff82bfc23a5512e7bdf9566aafe63dc804bc6c4cb9cc0038d232830c91e6eb992a92d4adfeeecb9beb02e701d1fef158934fb16cde252aaf868e4e0fbb6ce2a53c419a0aaf0333881d6a5935bb766052d4c9ede393104d9100b6bc922dc76a8086fcec69ad4a2193ee458098d4a3947260314ced99341ff52bfcec8590145f4a519893b2c9fec0d5a179e7bbbce5a414e5f022c7e3bba4ead9a0d7e4d006bfec46fe100472e5b1d43fb61d70cad5d3540df810b00a7497342cff29d09e8d4f81669870e5bab0dc4d0e228f10f6383708b12f9e0149cce74f37d8a6a4207bb7ee40b483b513c7c7fd91fc5ad24e55d8478c1180102283ed4bdc38a2644e1e54761f9413a9d1ae0d1e8686269b430064a0f94fd35ba0323feec9544bfb2350a569c6e28b3dc0ff9ac4d0f3bbfa64f1a88fc895a147f6f020a8cda2a757825db8051ada2dc1e9719591b5719aad063ac693cfaa76d9969b30312ee4082d0133ed2bbe880d8d14ae080cd2799046066beefeafe1594b6d13d6b031796f1cdfd0cb0d0484a12d31dd09658e93af6325803b3dff90cd48bd600b406ed81428c3267be1874e2b050a7604f44f903dcb92e805e7561b6844d4f49d925de86a5d9d1fab16181a9b3f7ed3a0d736f023c397be2b699ddb0892ab044892aa0ac53b1a6b86379d216c16b91360b3dd8f91f8701e85c1010fc42e80e9e87e4d3e3bff626c1f65b725b233963342ad2186ab9948c09010884a55cc228dc85da85743560bdece05fa310b3245b3bc7ccb8a399e6ed54e064023030af8871d7a128970b39128b46defe96bb9048a3909d712fb6a2afbd86f87d91eb20088a250bc14f0c7d804494b39d67acccd57854616a70270852d56d7e7e5928429004d2b0f01a82e5834b9f76ee8bc54f9354cd52238fdfc1ff6a57539434259762dbe0f2b54b127d7ddc894bc4e02d580e7f1f1858da68ba8f37560b82df570c5a3fdf9544b01241c4e4437017fb6cc7df9a23698cd85d1c69eb7b2eca06ce1ffef86070c8d7ed744ed4315ea05d2e8ea4538131534003ade974315a4cc52906482bd3be7d350b51de566489fd121aa6ea002d2b8242b8752e7ff30ab94be86fbd4b65617a6e45ec0cd7c823e774992e9aba51ad28e631ca789b2d15275aea346e0ee15e537110a1a620bbf39bfe0684cdaf4c90035cab45240727907031502a80f2bb921b125d39be71e3a15a72b0b6c24d7b57c1c28605ddb8434d2184e462f6e9c754d9a187fc764a6ba90ddfc07b9003c3e03aa5f9c613fd882e3cd076c1657f028d7c1fd0c021c8aebc7bad104c20edf6f71a2b5e2da57bdfece15ed0a435cf522b997008c6d11c5018fdd93777432ed541740a1a1c2b759dcf20da05e4323bdf0331aee38a2b1d59e1fc8841b92cb4d9bfa902450c9d9952981900d6cb8472004aa389f0d71eb8d5f662ac81577cc45141fb7fb07c2b6a73e5182279926f2220fba3cac71a83afcf87972f93384ec95b51440c2423c37247fad1a6a1215f065f59fcfc8d8afde8b7628fa78cc23c4a41fd8ac5a90208b5c3a2594e0196c5dcbf7479a60a34b262486d11ded36d2a5e3abe18ced0021fe6a47f4e561eda864de5103895bce614083b39ed52c99eb6fb9c176c066331b185a315922c706ca01683a9e677d3100d52f1b6c0532c2d752a3f9e5006e226d660873266ca2d1dc2c649c4209e6cd1c427885c86f639f8a17fa589288c97130c09f9e39b02494c18b9960e534ad6e7bca8eba9e9db3451f8a5cfbf1cc787d903e29bc55275c71d393498508a31a1ab643d6427935bb56784e9dfdee20c45c404d8e86f626cdefff6bbdbcf4f5b306ac72880784a8af5dc2b592cfa5caac3938346d25314858f4c6244616f27f55868852a19d99a5444aa182227201e87e312c185f46802aa9b9712ef39e27938fca7cd2408f90953389e0725b0daab66eccea384c53eb9fba6ba7b98d69eb08b15b69acca973fc50dcec0a6902e139e576790547ef3ec35c41739b0326a660f66f48787a50fb855bbfaa620250d568b9e16172b64d911026792726de86b9fc3acd537b026543cdaeb5656e406c5a36a668f68653514ac849b1ec86d572fb7fab3fa81aa6a17966665ea145560201b7a0b3882e320022acec3f17001e152e0a72f2762de755555b4ce84625d3b12a41fe70e309894acea95153f2a53910d915a2d4aa2d265f3b82b453954aaa4c666c2ccd56bed6a1554201bf702d7a00a41682170c5c924fd818c31d7e0ce361c7c5bd050f800a59c69188a2d940467e2dae3af0433c91675aa2ef467ba6faf8a98de32ff3b73d80fe9f024cfb18b78566dcbb7e6b954ced12059b9a45cdb92d34d4806b6f736f19b0da35305155361e52f6b11f5c7c56d783741005e8c9e82e79d007", "65", 1, 65387835, "c03bd4eaf1f64cdba295fd319424d090f7bfcb2bd70994e79c92f057754517d9"], + ["030000807082c403030e17798f5794ed17ac8893628133ab0e9206ef596c68abea1496a0f1257720b80200000003636563ffffffff68ced25e9065264030ea9c90281c5500fc5f9907abe8fb36e744fcb2913f952f020000000163ffffffff51f1aa006dd38f56dc0188ecae07041f7e83afc085d142083ad77e0aa72cbf83020000000251655234bb890226d709010000000003636500af4e220500000000085100005152526a63f9b5d6efec99ab7002dc358d0200000000000000000000000004000185288791b353c9d5ccc979f9ccc65307eb91a7938bc96d7bc865590157e99c6604551be2ba91db80586dcfd7a3880aa45afa0fd5214521a3a5f07745156c5eb61e094725e24b5268c5405c9ec71aa076d1d44006147e5183255f71adcf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008af441fe25a416cae266325801ff4271ff1094bb838ae6ab7e743fc5ae58fd60d82acb7eab1e3b59e5e6df8b69d2afe9c0cd6eb20fe09c1294dd24e6e06007a35b4c7a9f6a3a93e321a93695e6725a6f3a009093b2f279d0b7a9fb978b9f0e7ab9d2f2138be974d6200f16d592a9e6f2e542c85868a1df486cd9305fe46b3554032aa2bff4007281bb2932ce0c13f15bd6b9ec7f807ab6cafe2f905867fb21efa6022ed0e618b0c9adf40d539fe82ecbb648d61da388ad41116febb8181d485892370a08e554c08f44593c5a79d54b36f9d6ff5ee2901816162ba7ed9f84b24f3c6d574cdf5f850876cfc789ef595b700d52e10270393d2878b716e92686fc30c6319b0316edbecfd137a365a185f2333436478f0069fa6bdb27fca9290b2488580cd3560215608ffc2cf6475e7d84410e5c20ad7123019223d028e94cced6090e4f19c68802016b25a4be38162c5b13283ca6532ef02eac9575cccfbe8de093cce2c9f73aad031ff4e850e99b53626e1306ff3dc8f928c8676d3dbd4844e2b546a72a7e1bad90032166b72b692c02e07e58549b64d1a779fa8d464237856a3c1dec7a76952fcc5d6792ada74c32e13cff3684844a5d429509a86d21b8f390196849e1df6c8cc9d83ac983042f77f95f8d8ac72e54d2888a4327cefa6380ad8ccfd66ec5f09c9dc03520ece971de674ed29097182594bafd5eb1c43323492b15d74e41b975c315ef25307cc64f75a18f35f02ae163a7120ab635515975837ca7297404242b332e2429bb9fefd3b87e724ec27242cec8e92ac2e288b1a0f01788d701c61eb30b71536cb1897ca54d3c98ae01ebfd4419ec7646e80cd243c3a4615afb682e514941cb46d6996f3fd8daca3aad28202523c012388e04b477af1bd4da781b2286b524b1da4fa8e549cb3c6ed4b91125d5fcad22834e495ba5c8ce8d96f688968f3b5d0067434dae0ebcf179af75c89846afa5c237793be39c649bf02ed5b8ab820b535e15b7e54b3c576129a5a065ed71c5f6d434ce4eedfec7043e2609f0a308f05dd6d02ce012af1679d6e1ad8c50855f0c355364242e036ac551d2782d16c7bdba3e478e8bb67dc8fb70b21cd4029a8df1b70777384d8df61fdc3ae15d9770773d0d10184fd316ea8adc6c6325230896cbffae46e5fe7c78b0b1926e5bc779833b3a170515a6119c7fba0ce384aa6ce6345ead7c60c9f241d7aa51c70f625ec9c5395a9212f8e4765865b72b00479e90bebce4c2145c59fe0156926bf211952026c1bdf24b671ef595112c360e44d896433c82b911a5d898f689c61784ca4af552c4f1bb01c765a1355f058da455b9aaba63876f01627ece299be407a03c34f80ab7f7db554e8de69c1d8af3c93b8a02f53881d1a6e94f92f84dfdb58b0ba0008e16e50f4b360d53e7a1f1bf508f3af6a4b8a7694b8b3e94834e7d8e0b8641aaf9a511f8b5cf461c624ed2422fc86355b91986ddbfd23e50ba020e059143edfea63bee8add8e242ce7f191e338fb880f0d76d20ecf31fe9ddb2b692cf09d1953a2acb305a4dacc07f743874f41be1a0044fdb58955f384e1c0e8f7bf99bad8e1792175c77c8ec09868d5c7e97f31fa50be3d0630c343118b3a70a6608d6af4536ec13650668ea861e02bd0741dda698fdfd8232e4f15da3581ac75bd7cc6f389e2059a535f66a8a98218a0122f9d687d649aac9bac76148b744a7dd64c5d81327b0bd65d874b44866e770823b64cb1465e7500a5ff5479649beafe02bdff57692bd83c7db4389f83b74da6968e7e4de532f0b306fc23e001fe37b93a9050e2c9b7286f76afd707d59d352732665a6d3f01b271e0ad16bd473211ef03136c640bb207e01a212d4b6e2ecd726b57eb327458b462a02f8b2098c9f00a6b0a600a67ec0b77d828bbd2cba1d6288d34f9e494497863228f12e11fbabd68ee8fd002c397f87d90a43d771e926265daf472345d062e749921a7679481a45f90e463bc79b604e67fa799207e6267aab4d3c4bddd573b359ce0c38a0a7dde9aa3993bd782cebe00e4bff7c0dfa053754be83c5eaf0b68c30a18eca0639963b335f5fe0982d97acbdf1e1e262bf30c75b717822ddb5118453c008702243b8e50e29f379eeb6b471494493d3d23ecc5b5500e3d6871ac12695a8732f0a5f0649fe2b86076c15f30105fe97f8a722019e8dd4cb8858036d4c3c6cbd3835ac3ba279db6920f697c30163212de4a826e11793a825f4802abd747faf9ed2ce4dde31c9d0b2edd5ecc1ec282be3ff3c8d5346997ed678f781bac59772ba67501000000000000000000000000fa8c71da785ffada537112ed5a0810c79a7bf775712ad44e1b759cc3f4acc5bbedb9878c4397a0d8f3b5cd00c4693369f1ae8cb1c948a9bfee37266196243fab87a62b1a336f054f67553fee6fe75fda906595d5d01d4e0563b4f24ae98091b70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082705d018976367cafd10fd153a8bcdc105e807e14e1a50ce31d61a8d6bde17b4a088e993a735215e7579684e655391fa72276b055d5668a35728b0069630e256dbe76d8ebba2e429cf0b6ec54ff4b1b63a5602b4c00271c0fa170c0137d6aeea75a09379be107dc8eb31f07434c3ccbd4da58e117612b15ff98cd766cab00bc0209ed273ebe3693f66ab989b113604044f85adc4c6db18f61e491cdfd826f5296031eaf27252775a3de2c21ec71834647ace33c195bff2fde268298d6bdbef34a400b075bd89e22e2341e54a62cc5e6df6ae2373dc39e68e956e7ff57d4565ed64fcf20daefad646e8700dc362e25413552bf2756134eaced1cbe76c6e9f0bbf7e3f2021e3ca866353de02b6d6f8785875bacf6278bfd85c9a779fbc7dd6e949fc3513c020608d24aeed9d69cd71a3824fee8afb2b215da0579d8cd04a7fdafd586de3eba032d7f47bddaa7eca9f1a35ea4da188ce0321fab821e953d25ab4e91f3898e0dbc031e54beb63d05079519fb555ee7ae78eef93068d01f73bbb022fe3e4e4db2ebcc02289783c3cc1bb7ea240a330bd8bcd090944da42168bff3d1dea496ca5e90a6a563ce9b94b033fb6d853dea7baf265797202e4eaa3c2db575942c5deed06909b25b07d3318a3d542a9951890cb7f7babdb75f81d7d2e92572f95481d39fb86b0e3494c34f66dc986fc06bde18ef35de948445ed455875418d29aabb2320dc85c58c8c169907e797b7ace3a2ca2c3ed53d67ceea97e925058901cc2fe02167ad328bf6616e8c4a7e854a42f80477e14681d5e91883eacdca9914164eaaacf624beddf4cbba9df162e12d47faeb4693b01c2d26495ff5d5891da3edae5210c63c27ad546b32ef8c086718682c8c1812345b604bff90f39a2bd3b31eb99c9bd56acbbebc9fb66f509130efbd9b1849401c7ee1312d5e165ef08f8f8e30e1c0e31221c81ac530ded87df3a894a4026fa178efa3316b22dfe1b263b4a62e769ad8f24378801ac4687b06ec000f5c07feb6428791744e3c5eac3b88bc82bd59195ff26d2d6a028ced3c80ff9b1fa25edeabe1ecb9763e4f0e07626faa43b84b5be96c7fdf51b5b1c88b62d4b4b8693bf04e8f9700df129408983c429dac9b51b1e630be42de54ead7e37637c1b79f753654151105507d208f671339fc395157d97a842bb55d5af77934494d1a880602921d71b0547177e7b76a7521976a779db1a1b10f43926b4c72f23656c4d7a22f63860bbcee3a55534d661b8f172d9a0b150d5376d873e205f1700cea759c5284766f3513b7bc326d9aec8476b36fc68d05d46ae26c351b7c3c0b06e0d4b759a4cd4e1a9fac585851e3ecfdc5f310e39e7ca280aa4efa735bccc6059c6ca7e296d6ab7ecb2fdfdd0a886f567931fd6bce7323862aec8eb1958765bddc5054291d011929a430e220a6cc5d9f8822ff972ade049b739cec2390553f1e5f45d4a7e57dcc5520d99f73df416b3a4b5a586f43c5f00b0b1919017402aa6984558986275010633631dfe5098bde15d61b91906e8b8fdbb15a2d996ca294d9367e337261c65f3d8bd463342d05cc33b41e881dca6645d40941647e924a9d9e309a6447e49979110536c42dfd466f4db78f824d5f2d60a7124f0c1c0c724d74fd57f5cf278e5743ffa8a394b7655d670181ea980a07346aa7dbb59d12d2a1fb153bea07a4abcad530ac32dfdd32f97997c265fc55d184a499abed6be5a1fdd88d406a56bf6b973bcff9c72771f3216c99628a843cdc5a5d037f20cd8d9771a7aa9189d74ad3260bb2739c85f9eddb1dba5ad763408fd6b0858281352e240e0eb944be0ce6f8dbf295185f4e487024ea6623cbd1c9d3d7c0083ef82c0a2cc5c3cce09b2e4b4feb9d3af1fa355e8b3cbc23131c9de6f1ffacbab83d1ada16b108b6321e4b348854ec78d4045088e3a79d5906a8309262a112a59221d44270099469090677754de289f4e378e1012871fb746db8ec4d9a7b837bf1ce7289d609573923755c6e9770155e2f16adc8f6977c405120819e5428d2f7c1641f419b78baae39d1f83bb22b29e98856fd1f1cf355651cb436451b2dcd8496e467caee0211cc733aea0b5ba9f84e3af78cf6240fda7e97dcc7a1f0ee2789210ba65ed713377ee49caa3a2fd380eb7aaa1d4cb672d0efc504fd821d73727292bc157dc251c2e8651833b093fc626a307762956c42fd6d0957633c6b6c2de1653b20e73b93b09393903396c32b0479fe56a3b77e392f8a39dca03b969b1fbea7fd0c4177e0497d38c596079d7de318c625e7ed7ffa2bd4af9f9fcc7b31ed694e84f8bf08792098a550fc1e2e0be9389faeef511954942365b392d9524406de8cc1b8b16e363b193a5c58c208147bd865dc2f6f66fa6b3aa1cd100e0a3acd83a3f8425b30ef303b552c96b82ca27db6ff04", "65536563", 2, -1219933221, "d23885924cee2137176a8dc9dcedb41e7bedb1831e401ec4e6dae1c3e02b0fa2"], + ["0ecb863e04500ce1feef5c2f90aad13a6d556931d9c0ca768fb78af95f48ba5cc505dc948501000000026a63b63fa82c75496237f833eccdcbbbd8dfb919340a3e21a8d38b73a4720b27ba19d16087430300000003656365ffffffffb80b57c69b3e48d9fa17eabcd3ba0a0b92c8df9f0c2d632a730c973ccf722a6e010000000853acac00ac00656affffffff4a85c3559ffd68d7c58ea264b89604250a3cc80c3d072abde9f2f8dd651bc19e00000000056a65ac6aacd3e86a3104512b0004000000000900ac6a006a635365650b60000400000000026565e2c026040000000001518627040000000000005091b31a02ae1b2505000000000000000000000000156bd6ad05a3abdd6699a03a61d80c46e749e6131e7c3c962ae54e0163e8bb2f948f57b75e7effba19d7dc57742038c9d38a2c9457909e7c2c0142b8431b0aa30ead64daa0fc66da592e7f25f74ae8becc7c737fb6e9ecd0538f6cddf23bbe350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045003565ed57a1179327188bd8c523a22815f8be24477c44ea72f91280f56222834937d2fcb85c80ae8f0a5fe8d07b27183e5ef1a3e52da3149f41430cb39a959736b1679668ed5a9343e881efc200ed494067dbdf84db7ac89c130a4a2604daf1312fec89496cb40c275b5f05650b9b77127f291478b5b979da8b97ad40d2470306f25b4890d37a1fc11de5e3f48a006c34209dfbfa87344f8068697563917eb8032e13a747572f6b6ef540cfb8b69f1b5fc12afd8c70f07b56602422dced9348ea0b0034460898b28b94e10e9f7529f58e4a3b773a305d826a20b11f667d535c910b14cda0f2603104068e6b5a6eec2d136bb3cc4c179a45e02c1c5329ba0e4f594c0217b2960033b341264fb32e7955e19977de751726a56d1f6789a7b448deabe2ff02137d18b72d578bb99dc64fce44afecad3e81c23f04de240976ca28191fe1f2ee0310b34d6a89232301694a3a0ff8dda9d85e4adbdf2a927534e469ced9c68e450c0314dad989b8b16cf9bf94a74b619e755d74e4751bfca6a213026d587fa665ca8e0222db03ab6392cafe33b3ea18ff57ed0ab5ab8d40c7b7b7f11fb074af41cca0253d986547114dbe5ecf9c1f04df44e13ff930b59ad2e102a0f81be3c182dcbae6a3e8c3aa1d40cddec53d7d5c1269bdaf5e77b4eb94c2b66bef821c0a8c0c12cc614e1a99a8497d61915bee2f351195564f4ea8f4670c9f120b28cbc4a94f4f717c0ff1324f71516090b35e8afc1bdc6b9d4503b431edf36638bc8c9f66412e61333a2adb2e18557d8da8966ba010942dd65ec82f787c2219187e8b87c823e6cc8b1802820a73fd318e913fb18911a28929611463cc045c64dd1a85b8efa3333090d9c578f256329851fee77436368ac451153683caee67e85deed91340ff1d5aede11eb75b89587a1a196898490d7afa2b38d725360bb1a1bea7fedee3eab2cea42f05fc92f5dd800dee44a0f81a53ab46c20d9ad6fc7ccccdea24f7c56a70bb258b4716a044ef2ba2af97b919315a56d3e3caca783980a7f103e73bc78fed92a4a56cbc3660e8aa0f171d47ea137cff1c1f0567f12bc757e689af07bbedf1396561c9d43b6965404b7eb3b9b0cb7769145c5025c5fb7b26900d42496762b60df931e9955b04e86c03f663a81884d23bcc03b41ec54b84c91676b1e793566d374ed22927f939309dead6a73d10a17780f1d64fbbb312aacfb95a2b1f97d4a0496a3da4b683a3d29be897c80e5479143a8724a13dc6d361eadfa0e5205e3631941068d5c76e0ba3b870d5f9d884642144b8446fd4856859e5119845f2451dfae5d85ae8cd16a820cf81be9c7ee58d18dc6f1cc3ae2b87b502c22ba69048597bc80bafdcdef610e3f4c461d2140c3434f51a00050a7f3a2609382bd7ab5cb9f572e832c8137b381c82356b20d13e837fca99cca053937c171bae9c7e03fe3df63df5c6ac4d8faf6c57eed8b2f8245f69491e6a7669c2178d5f64e5baed73529c4e3542194bfe64e3b11a2c7a39f10c49b6effcf184f635fe931210836222e7310dc7feb6c6b484a47884ef53cb4ba7a45a5a09b63bfd4c43b94025f92b0b20369fa1274502e2012d3909e15ba7da37bba9830c494a246c618d32ef8f49055c6df5c0556f1cf95fa7ce43888d203f3ccd40d7241c5e84f0a3da79ee5dc8c2c8d4cbfb0b68720340eae25334d947952f9653efcb6b2d962853eb33703f8890a8526953b142be98049d37d08b6ee38b0c897787f9f990c16196af3add61e03a1db2e4f898e278a328b399eba2c036dd0aed1e3188b00779e5f7c19aa34873cd4367a000c167f340026ba4da7e8b582e648789506fb3f1c66dfe56b10b8182b72ad8cb6a777c88ee9c45c46ef4dffdaf3b109620534bd5915297f5634023912f4b45fa2bfd84b8c80ead3afd3555e169a9d40cb73f2329ae839867b7c8640a6dbec83c15393f20bfd386e689c41e39ec70446bffe26497b0bd752dcdd5838c58dd2a6721c3c302df9796ebfe6030438f214eb08c3c2a4d053eb6b842d96d063aec7cff188238293cd42165dc6bb952d3f5496c4bb37458b5b0512bd75df8b3395f1e1539dd7054071beb5b601b200972922648f29292e309a36133ee58d37e2ff7b263bdbfb7f06c5492d76dce47b77fc83a70420b84e5a8aad0c620aa464f0061e6c6497e7c0e69f7773ec20f77694b7e24ed160e975a8f97306065472ccffdd6bbf071e08ee6359f1ca62e5379065c6e89707a07774e29ebd0d2c632ee875b1a5901efe41257915b0579280a3cdb94c8e56a0fb80000000000000000f935ac0400000000dac3ba6e889c3a310e607fe3b9ac368e72d3be597145db37c7d3f398337b190a29c6c255527fbd82ca758b3aebb2a698656da510cae9d5be23b373a2f9fe870f4e74de92a464e0a3165ae7a3c828a6cc14a7141fd6c93b64cf6580e37461e740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009efe5467364a86ed3cbf1d960f9d4c563f493e7513bb81fb2c4b267182884391438213fc42686cb6d1d9033293db1aeb70c80f548613401d7a1c8a4814d550840d7f4c010230acd40626bfba201d67b0ea62359eae0fae28f2d044154e5abc7b50248cf0192113f7f1c3bbb9c2b257b2c331f8aab5c959c7e4a430dfdfa8d84b02180c21999f7f23f010e0ba4ecbba4938c1ce9ac8f53cfdc75b7a6cb669bd2f89022ee46eb002dde0702fc76e39663836421a9b5a2355a21e81534499ae1ff698ac0b02e6bbd4728a79cfd2894c1372f1347ff3323dd2aaefe3c9604d033b4ae6929603f0cbfbb0750c1635085dd3595f4a6bbc94ba3fb5db8a48c7a968201d0bb094030e01d1d0afe0bc0d69844e4a6de99723d09e623ca47c5bc8116b6a23e306eec1020e32159608067e333131e5b7076ec65e56db5ca6a2b090578691bc15771aff3503096d24646a6781fef4fbaa3e02e69ae7d1e5b5365968d783a0b1fc3bc908c5a6031a2c53ce92a8d9f790cd0b7ead112ce7d2809c0510b4425b49934108067c36f902096c8287740c8c95b3bb36ede9015e6189ac2940cf152991b9936119d95f17d969a71b614086ac26f516a3d98d98108195f81f8ac46549f00f09a63f377e2bcc8b1feb8ee657482c307ee10d89814bcced8a7c8a23a712fb09852ae38d2f2a1c7b84a9f27ddc88c6d35a5251de882a942982d3fa0c9e6e21883c541dd08d56be6370a3c645b9c4ef6be473c5b0b64eb30eb877f7a84b8b10e09b4a96e8faddedc93044f35541baaaea6286582f0e984f2bf3528b058d662eb1fffae64e480f2801e7ea136fb4e007bb92bd21f3c0a1d4df3ee6179f11682f8dc1fc809dd197e03d16ba595f3c45c1739b03f38cb3f1475981ff406f2f9f2b05de7ead2d5d88cca15c87091be9716affeee8d2326b8fb93a9f9e127d357972c25d033a34925d13ee650c9150b855afce51e8c2596da1baf0e8cfea4f19f4e8142dfd3f673a851e1e59373d6ae16eb773753768277fb7f9d637f1c461b1b0420f54dd71208e20742e07f3fac3f06880f838448584db283d72fe4c07b9c2a2050b7cc0bab5e5cb45441d33fedd5e9f184be9892dd867e0ae058b330449634c119a819e7e4e25d52fb216bf62ea2a2b76ad90a21e6afbd98a570e4eaff7f87ed1d6e0984f20c020fe9119c57a5337aa198cfc183b8fe165b6a94d5a87e795bf9df2fc5b5bfe163172fef77de17d256f58e823e11fece067ef06e02a49bd23bb1addca9c8197ff4de686eaee930003605ac697754d1f5fbe7759b8de2a9aad095e7a50b39a7d4d475232eca13794c141f67f8390c2e3841988a075a7af2a50c4deaeec29486df2d9b6174850822f4e411da20d3881e0f4875e7c4af968d033fb204f192ba94ae58ee756c6fb2e097797dab67c3745eef40cf46428ddf30ab2ca238f44e35827f8624fbdb7f14b45f152ed0ee7de0dac662ce70412929fb43409651442dfcc298fb96953e495162d1c672bac644a3d70cc597adee8c3b02403a927ac3c5ead1db6482d62fbe84988220e880a68ed6d1f8d474702853385eae8199e093f814c65bbe2e793adfdaaf0558fec6b7a414cc9a339b472e5fe76c395468d87a92a2d8a367bc0954c2463715eb78120894717864ede44bcc87c0e991b5793c7a73c920a79f00fcd3635775399299efa2a088d978da994f09dff185b19da1a6bc6aa764ae365fd01c4887e93968c7695b5f77c7e5e59454e4f4e4f37e614755d0cc6bfdf1dc46a9f69580e9176ee94d3e770fbd3a4b4af643752d83d2d206e4d79e571a7f17caf24b40939e37b9b16b936b3a7c404848b572701d10d57364ba4dedbad4c41a6319ae7c7498e0040f37e63593a37d967a966fe007d174f7ff1f46997a65df2b14daf57445bf6b6caa2d2aca5c4be1c0118b5b7a5aa644e25bc6b91ebaff2a27197c77b78b0cc7681f8bdc2a590914f35972c047c1b9d37e62a53baee0853e146261cf789be5cc7955880dfa76bab09f486704584f975a529f005d5a1f2afd5d8c37ba2ab2139287915dc397b1f375a285f34180928b134734104fb3206a057cbeba49733a97fded08a9bc404907f7aef74609537f40441ab2f39c3a9a77ab340d77e71104fea6113f53757bcd7f93c61a035ca49a5a532f11702b80cd4b8ea00569333c4da27d07c859adada08ea4d77db7f9a2782235a2bf3ba9289b14c89f829c44b11cb363343ba4399b79179f285fb3e4d3369ce98686fea5cc3045d96e1726a61a8478e954c9b435e9192eb946ef53e7170919122d6599ab464c0240e27314bc558d2c5f71487f0f057e785e5adb61b10821a72124bff6cc18efde7a782899116377a1de61d7cdd1b623e055b1a2d249e64be02b4c7fb5ccfdeaf11bc45ff4db8e650f0cdcefd1ce542cee0c9df79fb01", "526aac6a536a", 2, 1654129253, "e9148796bf9da53afa5c23bdc1ff81244dfd8c58b0d30f3c2e378699a791ad8f"], + ["4c11711a0129b01f53b6c9b6ecb80915f73343f45eece5e0bc497eed8a39cb35f80d397940020000000465ac6a6affffffff027140580100000000096552526a5200656a530f7b6f0400000000086a526552535151005c45942f02d9b76c010000000000000000000000009f53ec12add5f16569b2f01fc17bed2444561879c695705fad0abdc7f9919d86ea3c821498d1c3201bb92c242ad3414fbdcbfc399a440fb08be18eb3c92eee27c9bc7c0175a9282143758352f2c7eea0ea9dc57cb791cab0a83ccb1f9e5d5d6300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000396a0a1712fa06eae3105739c48691d8ef08959b5bff18511806ed31d62c10cefc1bf3a463484bd227d02c731962711bcc4d50039149cfc24692d01e5c62b57113fa8b0a2c9d62eabfcfec3b4fbe018d73e42bcc1e2c4b7e3a80bb43e86e2a3085c397577093f61fd4cca955921ab9dfa949c975e440a66f8a89109bd2ca084803191d09cea8765ade74e30497bd06280a44b34c61ee33a566963b652214bcce42030c1da33461c9bbe7bd62b8f7c49999475adaab45125b6a4c7aefc5382669241c0a016f06f1f17ab14bd1004ea040338cb68d56e2d87c93cefad2f2084f1347621431d3d36dbeb03d9865407c00c17b709d58bd7a646961636c145f6c8166f4868a022f42d201fe815286003f9916692d1e2623f835edc80576a7253832b20bfc50e90316894a103a36e69d00484e80d471d8a87b2276717bb11409832a5910bb117eda020fefdc385a76159840d8dfd649359431d44444914c92fe0ff0b4f35adfcc52b6020b66fe380eeaab8f72afbe5c0a3a76a138b580d092f00b085e504522a8c87f92021d3495ddbf25ae826e0e8635b6ef8e31bf759da3d47dff10c908097cfa5a22de41c60222691beb382b393919a09778ac98adb7b21b064cebc9420bc2106f4ab21807992577c5f76f369a1c8dc08b5f430a0f9ccb3704e55b08db54a72f19b04510688e9dbf70e17745b2db1b7ce9191962cb730a9a1a286627485ca08e40ef6268e06a7e044d9c007f3414cf0dd106a21e6b6d0e5181e5d85d922ac6f160a12373271907027a84006b8d44b899027970734440228ea4e754a32bd137799db563d9783033ff6029f25e1c1291a218ab7efc192c143b03207f561c7fedf24f8255919cf9c4e725ee6c2b998345dbfa3a5e7cfb37b3306319f9bdeeef9b536c4fac65683cdbcb69601dcbf77c440052c39306764aa88a7178115fa8b134e686933d9d726d3097d2e5c6340a1acbeacbbaf2037f4432f14cab8459eb93489479b3f32c8f6546340ce1872b9f8c3b2d59d4e7309745c840618da0119b9797f7696b586b84702eb9991af80a2059f5cc39546f8c2d0a302bd5d2a2726998a135718b9c6a9db85a0929dcfcce4dabc1d7e3515eda6004b969cbaf4cd92e95fc64a0e67c747c819af33d18539492928a4793b3a674f7faa082ef245abf230937131cad3edca8ed940bbcecabc8b4efe9622787411dac7c819dd19e6a33e9167982f992daa0d89a4ad757af4b9468c16934ac56d37cf0c54906ab08707e686c7ba765225c8629d0cc5d13bbca3178e3a4cf08914a97f7b17b3a2f46d16dbd7a19cf34cffd29c0fdf09f25438e08bee2bbfaef716c8f21a1534da6afed6218b2cf06ec2da2a8e1ecd41544e08adb306e3c47434c6e8f1497127c72eb9b12fc6f68e11fc4ac1a7e7f38b63922b04cae87f3e7afa6a0ab1d9d41cda72af70a157f962aad22a23fb8b99a508f9976572d0b4bc83a31df6307578fa8bc1a778ff3f877c611431b1afacb2d3db88561eb398bd3a00d1595a61034e70a6c557be3adf0b24a31b066d965c4214d3cd6be6b6a39b61d54f526c7c5a733cfa9685172fb6a096984efccc1879bbc7a861328317cec16d950745eed98d069b285423b041d4b5f3c0f947e329721a2589fd32b71735fe57e90e4f1ef1b065eae8dca0221f2fcef76a0133ae5501996fa85868636d7f4f78cb564998063eaa547a057b8d2cb2e4406a9ecdeba94a4323e36937dea56b8ff04fd2dc0632d73ac4fe7708efb1f878867c2754dc182e9cefd06edf0cf496641c1d04501f69e035fce134363d0439760fd78296b258fb3e1360061ce8b1d2c41a352c4d8111a1563b58e55b5de6d1b03c3c2bc94f5284ef2b9974d24e02e46917732421f3eb130298484a9a6b9750e8e08931671790ef5dbb34c5e14b00f1f10f17b71160dfed39d6063651a5b8d7b5930a4d5fac418bc0952988605bb4f668ba1d9779bfc1dff9dc0dc479d149faee77a7a09677d267f7cb01fe7d7d7bba305fc02260d6f29248a4f1d106c162e7bd6833b7c78675175a66aaf24aaa66ed209e51bd50ddb41363862342e8173f2232b48a19ae5305b4a62461b4100a615cc1c87ff8fb0a4763fd84873d54d201556672a893a654774bd1ad7efd228e677f71af2ab257629a36100048e77d3ef1c61e3bf0493c7132bca09f31c8cfe93869ba4baf05ab2a439cfeeba393f58ed313bd231f146feceb85b1ecadb9d9a221b8da74bc8b0e81da08672c47776e799c753a4557a9666041db5f42590bd2750e5f21f410f75f8356bab517805000000000000000000000000eb3b2db07270b349d9149fe4807c1cfdcb52eddb263e61b969223f10cf5c13875608098e1206bd6d11d78b0157d179bd7b228ff37856052603da9ce866fdb150c45624062d851520e6d857f0f889701fcf8ac84a4f2359c6fe3d0a0c9efe085e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f73aad56d44af201e0b3dea9599b33caba6d46b473daa2bbc5dcb7591f7836aad9549d4fde8a75d374c9f2fbb7cb9f9eb1d1a6fbb9e21bb22c43d7231ec8a292caafe2318538dc98d6861b0c5bb558af23bf0a8988d7b8bfd8f1ebc634ac248e77ad22a8c246f7aaec2580d3c692973e83e46cb56d6cf708649ebba7de7d340e03057fef6db29e866a731a28e7925169aa6bb702af7b7481eae7c77c376482b17002134d88b1e6b4206d80804cb50b9308d7e2812f317907a4ba1d06853da24b58a90b0157b84650c4bea48b2831a4f8928efc154ba25f6211f42d8b936c388e70d30921e46363d2050561b16ccfbc4ca8d6e0cdfb3223c875d7f86661c45786d3568f03297957497b0aa7c542621ba1c0338f88d8b05bea30e8be820b3ea8b290adf8b803273f544c1899b99e2af90a24bcd4f431d03bd701c54f81aad44b9bd2c82e5c2a020245140ae19a8f5ca4bbc59f9b7e4f5810087c7d3f8e652f4e0525c4dce631b3031f7efc7e140f0eb7729528007d91b24086b5eefc1a870321ad1ad7cb25b3b927020acf40ae5ff9a96370fcb345937c7d95603af7d26f3741c9de97bff3d1f5e574efb7e8ecce2a415ac2d76b986cfe5c8b695a5e5957d5b43d60df133bbae65b9cc7c9734fb9e8b5bb7ebed892d36655e185a98231f9640cd3065f4df026644974a6d96090b5fe7f7b3ff5ddaa010ddc88184dc7124410557bbce67fd664376b500161f9ac5096fdcda28fded1a38b42b909a812e064931aa750d95fc0920614e3566422420d6a0149685c20d898995078fc3927462a6e6a0c63230a9778be7359846c81a574f739cbbf73d9d2b0c806e56d19a1fa0feb09354efaa8e44d010e7bad1e510ddddc5048feb371efd71427d5ff3126b443859a544e62232df90920a483d923a6e612b7c56f276d7d8704722c1f8ce78f66da0814a1f26001648f092ae3c3fd85182ea548ec48dc631b9549bc5095f73060fb9566c66dff0dc97eb4a72bb3c596845ef8a4143dde6753e59bd4f912c7225fbb0da80a7640b024b6cf6ce51bd239ccb7d39cbced5be3668fee56b5d443d40e5cbd40a84ed10242441515428bf86b24736059b139a51e7434ffeb43cac5d62f4b22e5c7d193371910fd40ac7606abcafdd917d774afbfda380f5240f256aeb1c1c199789994113492d8891fbc51743ca397fe2e2fcadf8a2946393e55dcf889de5931cc96bc9df30c6199e8fca300a55cec7f023b3e2d93a4f896d5f6121d76de796b8ec807fa547e149c151fe74837cb4ec63993565d3476726934292b05ece4cf935684365c0c822376970c348fa50c4bdb9609a8d6d8d4cc1fba30230b7786e7f275368eec30d731ccf5902aabcacc5b08c2d13983dcd7b8d8c8bea8b75be07cc287985e9eee979cac77558e40d60752b583336e4651b5ba72cb1e3d15dd04b2020a827192997f58281aca17dcb696280223daf1dc78a7f0775be0bf9d63692ec9294b6d2108a8f66de68c56809a1abf2b965af422b2ecb450560bb8b5e1d1cf93b1045bf8c673df041e60a089d55a5cc27c3f04170a66f6772b228866f219a210e6ed2967a375b7c6492be487fdd3965065bf45eaf052639c11b0c45558b3cd69fbaeac906b94b8a65684b1de20495d8ef0b0d4ce2eb310cae53a3b15091075e7a404eee71c0f0c40afcde407be50ab9052ccccad6c007c8c5b90611b82428c0380db50625cdad5daca5e0cd59ff3088990c9fe83d905ccd570d82afda7d116e02631a59b153b9619d5bafa512e5d205d506373c7910190785e3160f6e51a6d80accfdbc8f1c20f75c68548413243029a92d605b95d9514fd791bc6f8b99c2a084cc3f811f61414fd346db1d04df949426d77de976fd5bd62916532672b58ddda6fe3dcaecde7a6a8dc35cfa392a5e351f38029b1693e096abe36c4bbf603f35e4ca45e55ea0419ae5137e307c15600669edfc43df8bb1d6288b35877ff94ad37913946876b70560b965a5e93e9e11813ba2205324e149a8e38275ae5b9c4e5f6600dfac3a2de4ec05339d981f3e619321f8c871ac0eee39e16b7a8564e0d8c9bd9e146474582aea3e4922aae8ef6295f3fa0d747c5938a9af76a2c938b04a1a9fb802439f6966bc81d58582e8675ccc633d31e597bca76a2413490cabf5ce0e4ebf8d54e59e94c4b456c3737750206d3df8ca889378d5a72578ec78fdd7c5b48b6dede6481e497d5bda528f198537430f6bf15c4c6e87b9e1f6aeab66ecb1468e4c989351b80b63577ae4b7c3fc75050100bf94dec8f396ec77f498f857eb3883867a6c34a96d516c99c8346c084d456067573e6569a2715f638a5aeb771000b553a03dc3b64f77dce9ade827ecf3539289285dce0a82a1c69b9b07c6720402c389ab9c076956f377ef6ab7309b94ed62260714d53bc690c3f0c", "ac5253ac535153", 0, 590162905, "5c54b0d516bc05826ac4e0592b4defeb80ec0e4c9685b3ae03622c13c52b3e9f"], + ["030000807082c40303d46782a8253384333daf12a7a322127b4d4def71ba7cbabca716da50176a6b9d010000000465acac63ffffffffeedd8882f2ee3a1a08f16fe8ad729ec054750d8afc49a2b57c1ea6b6130dc9590000000004535351630f9bd91990afb45dfb53bba05d3b013616e503b5c79edb6d89c2019d23ddef657d292a7501000000056363ac6a523bd16a9604986eec05000000000352ac52455ac2050000000005006a0052009a2cd600000000000263001d5a4b0400000000020065000000000000000002ec9324020000000000000000000000001d028900ba566e23d836cc56c416ebdf47959fc56f8f5ab2299b6d13b695c0507c09228173610ef8433882634052fe8da0f387c7e94e7cc2980c5240a4bff13f399b62ab9e92a9c0fe1a97174dbe17ca3da600e2362bd0bb02c5f6f6400c765600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000201aa81b9c232473ffb8736706db1d3a52159dda3f117a38002b99cc67b083b88f04d4601d7c51f4ea35c8b2bc94ef435076b8301fab2944cba86e6893c60427bc92c7f355e2e0dd37c1301bd0e7c6f38c9b680fc871849c07ff95c5f738eb4ff52f39afeb7efcd60e313e4174070c516d13e9769d9209e6f88d8badfad5e294030fe80750b56fdcff59a7885da647d1ce7889f146f88a9b62aadaf78d756bb171020a8c372a1ea2b8746d5be26de8a835163a1ef6f59397d09d80f7256573bb56230b08f1ca9f396b723223f2537b31b41c051c21508ba9dff347af31640d882fd20d3807d66b1176e73cf2e451a921b63b9c993001ea4df263d99e47888fd441d1ef0311e101f7943044daf355e91670cfac8a3ae70ccfa316eb2fb24772b46218dd1b020249b2221c15cefa45888e55f36783741a4b3762080e4ae73e849bc5ebf7e0ac030ee8a0d7b2351899036c06ad185e96e3de0cd9c9de2d8d2f60076d68147fc8780200f6a0724d691807fd236b8ffcb8056f5908926d038015ed64b78964dac94991022227f3fa8ee23532dbd84581b1cdc8338b743eab320f74fd4c9a3cc776a4b93814cb978368a392238214a18c4af65dad1a027779911277d261cd38bbad2e37bcbe4f406b1ffbc765268eb08d5340ad4b4e0492ec455aa125c5d9b96956c63c5bf91b9b9c262dbfa533d9feb0a11e2ce82c47f27ef45db49f3df86e13fcea12ff3bda65b053b2c801efad106df9acdcef63da275e1bd3c1f828682381b16eaa6f08ac070b3b72c4fd9e93deb6b1ae15aa53a15bfc5fe753e29385ab9eb47488e009c4fc59b54c0f1eb3d87253ea57b451416329b0482b66e1701b80b8c31524192a57ea5f8b7ee746dd7a1d1b63570fbe61924ff4d7e77d0ac211c8b47dca41f5b524f463384bc4547dd9fc3ea34f7b600928db46c620ee5bec7f869e31ed142ac047faf0507d854b137b85c3ea3d5256d682cdbab0860dece0c425c41c983f8d26005889a9c02035b0f8f94486edcdd83c19c0402e65f3c9989eb8faf0928c5674f142f0847ec7c2be60a8fcb8b7d0978a97370fd2e96e9d662498581d65e95b179397e1a79ba074d34ae8a8e6275719485725cfda6d27d7554864d8cbaca8fa38dcecf4efbb8d1fd11618d629dc63c0c50d675ec42847ed09504f7ef1ede3d58ccbf6ddf50ba92ceb66a5d7e185b791a49e9432c2440bb48a52875603113b4122584c2c3c6ce7b1ba297b329d155c70dba4325c21e20932375bcdfe8c3385b0fb91138059612a6545b4fcdbdbc3de3b07c3e8d19557c5e55a61de4ee20a79a14f3f0e9d1251c4c9071570d603ef3bb783928ceb4f115c907b93529bb4354e5e14f1b6174247ad3c20d845607e38ab02d3e50af6f294f57fbfcaedef1ee9eacf3d7af4d6df2d8a434748f41ce7997d4681a8a06fc63fe9675261f50cc63b89453559ed8159fe2bd16f42564df7c681973f77e87d5ba39c062fab1285731f32f610ae0a725e54783e8bd585e5bba5727404d09ed508a6a00d7a26bf454e4b96ff116a0c3e730d4b8345bc0081221ede2cc67e6d39578b2007448feb2944e0b524e28d4997e0b2b215c6964b1dcf7bc5d7d6e841bf92bae2979cbc48db981c43862e33f350e91b6be7074436179f34f04de92631003f873db48050bccc72a8583fc7a62609d8b1e91b3ab02e6cbfcfd738b4563d518d79f06d7d6c7c238daaa47e019570bbac13c376cec2c1afdfb9173f89bada0f32dffb8cbbc9ba7e6a8a2644346857fd979d1451ef328c5820365949929d91941094f55c088f0fe632a34e0376a0b5d5511f6b50d1080f0608fbfd3cba296b511f388014aede16b2d687ac449f7c66a6c1a2561dca2e18f5db1cb6e87669746c9298088d91852ca2bb07bcb73fd5e0c1bfa68e13620940afd402ae71e6eaf7d0b7aee8e7cdc15afd7098f98b5244ffea34c447fd6287ce13b6dfa051e409a1f900bb9bc24119117645287001e6b359a4d2f4a12022f396797afae4d7f0332690b6960635cb42f016b91ae08ec15e16764a833726ce82cbfe0dfd4e101e7381dc2fad40a348ea3c2ef37253c33b912ba30c2bf50fefd461911fe68158103601b17ec0595db8d91e4c11a3f0f76961e83eebaefebf7dfb77a4f0d28dfb30c3bf9e4cb7be1effce9e7ab72240548b56507edb2f00c35e88c58a2739c48b5e4779de7a02a7715e91334bab2a549f049d633d85047eb2f45babcbcfdb89030f3a2ff811c5cd4111bb8b65206bbde15c0ec8cdca19ceebf9f79c12f243988f9145d4823801000000000000000000000000f747d9b8b5223973b2394f5a7f781c6f64478f15351ca3382a7e2f652353f39d5f9fc3fe4998fcc15a24f8887873b7983c1605fba373b7411d099c28326d3955702a2786eec6633a6da4dab378eaf2245ef242257076f68131d2bdeac6a3749f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c18d70d04c1eafe1802f7073cc677ec996b01ee0d00ae5af0f8032776c890ce31743b747c74911dcb7c5718c6b139241b4870438466bcab96035368e43724b55b06e6d316eb2e79f9f783f95a251e4e9356d4295f1e6fd6a6ceedf9172b5472b7ee769ebabbb14d50b81071b83ac177cefbe2604ed54bbf9546fe87920dc92b0304f52d2ed44f9b6456918fd84e4c945f3c5ba4d2489364a533a95eb31eb4d97803252318ed9beb14a2e1ee28ddd3e36b182a50e95d52af12dd13d00de1477c6e800b08f0d94d867ab96771b8ed69b72bbf9e1f2701e0a1865eead8d52983ac2a3fdc50c664c238207d8bdf582bce57030f2cb21216b9445c95740006d3759556903102187169cdb24e3ccbeead6af934d121ab94d0e693820af4d76c3ce286dee0402202248c4c346ffdf853554af1226f865661f6d08910dbf36a74cfa73962e774b9750226728efa633e61b08ba5afdf70eecf489c237b9b819165de32ae11296d7ad45f031983c16707a99354b556f077261b988edc3d441784c4d0214a85a43f361a80c702112efc83c428335ea8cfb0104f326fa6d96e5f6e41e44c271b41c13cb44b79dc57ded6068f79e098ae2af74848c7ece533f0b0720e97b5baf2cf4df826246511e252755725ed6709581e090582e2ecd9ef03161d766b1c343086ce3c5f986ca889815e559e802827cf15c5125357d8e510feea24db9fe30bb8f5241035bbdc52a3bb65a7035dcbe5153cdabee1c10f002fd35321df975ed4ea175ee83af9fd5ab55908273d81b5973b0ef9dab9ede758690d104e11f249a04a2045c8f1a5a0f883378b8fd15e431a66f0bc430c6b5eb5212ba3bcef49bab735eb0cdf63f7d291ec6d738d2402186a9e45ad44b474336618df4b4d9a542348081ad9329ce2b8dbaa4e4405f4138691b7dcaa8fd0d6194a008e9e87e8b66140bc6d0a351b3250830f82d54d161b4ee2bea35f1eaa19890ae89c271bdf4793a0df701baf05d9b750943bf73e25f617c720a31841c7a1623ce09588526d187b61fbbe11d013c5727e43aca206a2faa5894b65197b7a2e277e65be9ccb48a8d94a45091971a59edb31bac8549d7fb23beaa561e18465649f4a677ee7afdac6d6b98ec258654d80d5cb7d231f5c792b0167c189be9dce29e769412c051e688dbe3c0ea0144e06285451802ddfa7f94698456cb81efc417973aeb30cae032097c355b3d6bf1f977475b88c323f85060cdfdab9f5c9f96fc4fd8e4732f8ee36502fa6efadb4c7953a28f0641ccb744fb13feba3bebd3b701b0f26260ce5db1b2ea5753e0f8e2da6135835aed3272b5cfb88e26f6fb8e201d6af8b77b2be1caaf91eda090e1a16998e3b414c1fc08b8d0f488fe76e2e406f4d02713a8ce4bb17df331aa11a0b0654b780aaba16e81d087c57a8773d3c426b326daaef3e78ebd9c0964d01c8ea2eaee25c5dc0f2b4da384d60b11761488e87c1aa56d11c122fa5319b73f1cf41c82fcc87394b23302c724d2fb8e3c898d9d0c3eebac8f1a75f23facc4d954f8a0290e394fec4e676462259e74403d3adc3320bd4285790c567f40f8c406943ee54854f75c618c573a815964f4d9867f6e5c0fa022a8fe087d76b7aa0945785ff657361897194c8922ce50a20d08ab3ab2660ae5b29dd29c3adb7de71261fb5de39f9f05a8ce8f5b06a7bfeca3a905d2aeeab103ed454f5dca73a7267aaba7893fcfc63664d515fb916367396c4c8a09e737b8b74f3b2c82999e3b7a1acfc82645dfcef15c8fa26e485a5c98d93aa5ce251cbdc6057e400374a05f42afcccfc36b53f6a57d9f6bfbeb5c560a6658526bd1617c6ee276fb9f161841da9e8bf8d2ba4093e4def8429620b3622907e9e081d4e1bda4194e5f50af9ad4bcd83519b86ff80779b291547d89dd430982cfd6bdfc287c7a30d03ad2546e8fc0b6bd83f124e91aa87e68dd0ece184990d8e112adae79003797fb79c09d6d023703da695a2bff1a0dce3bf9fff54db262eee49ff2a9db08ed4d6a9449f183b5611502fb777594b9131603eda0f5f87e272fc332a812a8340d1807054983d64943d14c52a58b283060b75433ae23fb785658ecd746c54a0337053e04212084f5cbe6a5352c4c00eeacb6dcecd8f14159a6393ccaab8315c9082fd541500b4ea8494d77d32c31cd7c395a6fce76b9514b894df849e3e43d8ed6788774ca0fb9dc812cdae25c63e4ece38dfd3fff3f8dc56c842599b4658ffe35b8f90b78168c28ea66ecbfd9961e37dec29e380dbc84e8096d5dda9e04852aefc8a8c7a6bc83710dc7e49ca5b5726e1925c471c8fc9c6785e3b11279b1b514b2ad72894c16944453e11daab73e497148241fdabe9bceba27d82d58225452a593f0993baeeb58c8d702c365a005b4732bcfe6343adf3b10b4b38dbb8eb6c8890374e8705", "005153ac", 0, 1961892261, "10c038da3c183192c7406222a1ce9e63fa74cda0fc1c98074341286b8375a6a0"], + ["030000807082c40302d8356cce2fb0b5a6f0c2787424accf9b4913c1b17acd7cad73ac6bc180fe412d02000000055253525252e2fd14ddfdbb052e02783a095a2a3bd7137a7ff72dc07f005a4d45a9456f351bab86a868030000000263638ec9b9ad02dfebad05000000000552516a63516fc2120000000000045165655100000000000000000272d40d00000000000000000000000000c3512176ea8d7053fd49044c7b0952a8f4eac961e419c792aa928727343cb3aee56620d0b615db32a808d8b7f0bc6ee3f1b2e763e85930e5985e6a10e42c8237711a09a07b532f56f1ed233a509c687e5801d8a304ac8fae359b0f15a0f81dfb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c3d0fbd5908347b018d35d8420ebfe64813ef72c77bcbfd6c23544c03f9a9909e8a85e9c87c3a2a38e3f816a84549712dc4a202d9a931032a6625b95074946e21e44639e821d018df4ff2dac1eaf9c44393f10a1aba3a070d43390255df4aa157019a4b6588dac5fc442025033254375a19a6cf4935aebacc4a681a571d5e084021ce74a10591cbd2138b99d53bb9664815d218000dc67549df93213fd368b7a5403277d7a6c6c7fdeb27ed24aa8c4c996ae17242cb3cb8d72520c1702e78a4fe0bd0a08657ca868bb7c50bd727fb961052eb8feb80b975d1dec963cb479ef0d6d77276beed1853189d8d7254893fcd2ca108006773067a08907ec798c3d16b9551d3703017f7fe2cbf396e3e8f22413e4db57ffa079cc7c093149b11d793093fc7ee7260212848ec662ef5d1a744044689890fcda298e49c5336883be397cb728440084850305a81f1528cba880ef942f84300952d338de3e120cf98b5b5cc810a61824d8ed030690326d8c90017803c21fb02c354a6642fc0645ae2967374902f93a589e1d0102056682b0e18106983d5598e7e23294bc9cfceef989c42abeac23fcafaacf196e03f31b7b3ed8d9bd3ca8f59fcfecbf242f121e564ae6937f4f8b22577e22428389d127b9555dc40aa0ff17a758bcaed37318721180288220787bb110ff2c7b08817afad900d2443bc375b7b5946abcce0984b89b072762756efbe9542a6ea95c4527923d1bcda36b23781f5717669ca6d21c982dcac4828d9113f5d3344b7b9c48c16f90b4838d27c7be7841391ff1fc30fd038260453715d2ba3795351848ddebd5a9542a03d17f7a4bcb39f240d085c648adf93bf63eb4277f06bb635eb5bd3c599f3337605cc17e9a37f7b6f177bba2a832287f76672e5bd23a1b50d1b8cd01787eaaa2d828cb1ab685a3e53b84edb5803ff5129275e59ee52f98e796a14197c7aba3a19926a960e3c0ce0a67b501f3a454508af5cb228805546e6df156d4889321d374ffe046691eaf1e24d897cab29cde239b85445ee9ff09b4ff8286d7f93ce7ddf6e0c83d080d498ff2b3b90eb615f53478b912f61df6b570d954f948966a7030b8a976edfbab44ef47fcbfb98219575c05ca864832304aa497214688682ea66d84ae528f10e7662b838037a89b0d375416c589cbeab2067275ffa615e03ee1359baa59aa53994bcef1ce6277e1569a27722acbe3df8a17dee8c6edd4ce42f2f3bac88f55e346e4501001fd4ba43ceeb5398d4ddc08608337903891d6173229705bae9c4c14730a6ba8b3d28c6eb8ca830d266e35ce8b90010a7a5db908ed4f0a56945ac77bad214af79e96371c1df2217c724b00a883daa24bf84db76cd20a27d4b49a7c2597e59d891c7ba502ad8d64ed05c10e9dbff3bd271cc462f155738087311dae5402c08be9e4ecc19c3e366e367e7ab1aa89ff5ea3eba85936b62380e46dac0b0b2fa18569fe57849dca30d199452f7dcd47c28e4149d4dfd49f51ca997b3edbb426ef5bea275cfc8ba7ad366d439d30eeb8ba578f7c8166e3a2f0770972dc6a58348aa6574599a2c13a74564996da2fb7df3fdf4477d0574667651345330cdd0d4013443a62ac4aa0c66c755695ba9238a8abc7d8d128dc8e435aa7e8a0fc4a2723f071ba024a6b298d53506d18785c4b32f0d6c0793f7088924619e69d58b07f0efdd98577f058578003f0026f05c0fea22269ba393fa5c111ec4da6399df98c29a4f2b006d7ef8661b5724847c3b0259ad22ec0a7c65fbaaedc9b0dba4ae2d161ee79ba68dacdd2a26fac0e86c5c10c112d9e1976a37b50c674cca9158a328e47998d85d1c37bc9c183e1cb6f1de4e0683351c014a3317aed1b00d34a063e4ec6e6e93b9dd3b3bfd168e9ca675bcbe88fa14208a44f4b46a7038761f248847c9d3f8bbd04504a92138675839023e945e666a2f9df1ae390d26103d5a75fa01443808c635a7b6723fe631c39fd207020ff9648aacd8718f714b97bbd9e440b203fcacedf76a40c226e179ab32cb2230f5e2736a2762c01ff6d87348b98679ceb6c077b1c20013989050db1bd247f80511d8cd5366e351ca0a21053b41b1681d2e90b2478283d8b63361de86c0124434ab3ba39c860ebf93a41d94c8d395fc7e4f0dd9880cdee0c531fec201abafb7e762d3ae1ea8b0af1304a917a7d14666df3d04a7b60d3881802665dd6251eeb55325b028ebe60d2a98d8d5f1551c4846ce308c2269f331715d4aad2c03f52856e930276e69a59db17a6b493b5aa2bbe2187ee1d236ac02444614df5c2ff010000000000000000000000007300d9f126dae1ce9ff1ce49fdda266b12886d2bc5c41a5eb8c6ea0e657d082f0f6fcd4c04322faf7517288fc4be24d23e4d1f9532effed8bda4969155423a32c8806b2779ca2b4ea65554fe2a23d791efa046cb964d80744b5efad6452cf171000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d6e8f07c474b126b934d14bfa7b51cf7a17c339f627f70742ba631c9d1a89fd7889c757741098a6fde07221f6b3132776650a5fbb41520144f6fc7f61c62be4832fc837b9b5f46d3f59f821bbb011eda66c115b1bbd4044cf21d817062cd70362b613c0090662c973697a28156e0ac80da2b92e2313d324f26e13129d938f43021edd96bc90c8880caefff2468aa278c840d799da33bb995f5058f9441edf9e580329083a0eca3270e92286df5fc2cd22633ee4ec33e4343f764a292d62827096930b04b6ec459cfd0e9e68a13cf34eaaafe93414d04c6debbcca5f8106883bffa0f4b7c4464ccc30445977f798d21415a704e9e44e361bb3f90a647a5daba33bffcc02064279ebaf97ca6497f13d844c481f06bb1447c8e8febe3d79ccf643ad91d1480208312711d243bf31b40f08d6fce179864b64809ef148e3e2752a9b2d84459d2102102db66a734343155dc579e13587fea33345fac95f18b54d842f19431d5ea17f030f28bf31ffaf54baf07dcdbc34f772a087f473ce904961227fdfdd7e29c29f6d02155ec6b4431b802bc71c29ba9a32450bacb77971b2839b40562c1ac4d623f7142a1cd28c55cf1d447348992e06d9ecfeb1ae3e597b4e53eceba2e4ee836daf017fd61c1ec5fb951162ab38db965c04bd3cf06f5e1f20e59d542627263a3cb91906e3b28357cd201ca92ee6901c9badd2f66d2d65af0a50c27808459e8d93f711bc5522d78338e696f9d027a70c33632ec3349ab7b366b6b444eb3babea8829b9e9a26b88304e2dcec16018ede2bb91835a473054b5b1f0aaaab3e837cbb277debb78a18594531ccbf4886871c973c2d11b7fdefb71c3d36d9992e6904ce3fc7c6b5d4ad1735cab42976b3cc127a7e09764247ea39ecc06a1ed9b76830348df2930f8490a9b20faba5251fa4e63a1e1e5f79f84f148a605b6da4023b9fadcf35531e5b7aec4496cacff50f313f0fa4d415aacfb6394726c9d5b6e18ca0bc931e277770109a31f30b744438e740759b7f3dac46ffe1ed25fcdd9e5fe1930a42cca585329cd2d3972ec05a197fba2fd697d8eb72b3e89173184e35c6578bbee86ad7d5ec34fe2ddc1755c531023c0f241fb776c4be361ae4c045e5fd24c1ba1329e301abfcbfb1188f4aa088c7b00ac0a4cc3ddbe94eae156860e0534584e0635db58605c490b94049274e2bc650fdcda7016bab95612e943d80529600e366177670eafe714f914dffe73d316390109500c58500dff81e8d208402c4c7567c4242cf3ba410ce6536d50176fad498be0095389db07711b2537cb1a6b990a025f0ba4a6d6e4214a4cc4ff0f962b983bb89a54f65b0d0f0fe46c9604a9baaf2b48e0f8871ab92c97893ea8137a89b8f44a8281b02a5bb93749b8b66daed39ec8acd8885383a6a6b10eee32404b4225ddcaeae9a55887ce4d017cc6e9335b8a695b14c2137210258db0f4647be843aa456450a8684ca6b95f6a9d6ea078133e100e94a92ecb31f2c5e029476775bdacc6527a02cf65f4217421f6b1129c338427f76942daab74395b3e9642d969c7a3eb02ccab17d230314d19123fe3c2bc2836b08230ebeb7232dcdc0b9585d1fe3ff8d87871c56bcab3bcc4aacb8b57a54cc32425ae0f6e1c4c977d2e6d56dd044ecd63e7b7c986ee02ea8525e54c68c6cda562a7613bd85a19d35ca63f5dac4fa990c1cc3ab008c264aed4f46c0e28c46469209e416c64686384992351a98819cb9255e1fb4d5f56ffd900f7c5b64f97232777cb52e2df2fc6aa136bae7f166543015b722ff258a988c284d130dd615ba3fe904032aa520a832472a4b01c129e266948bcd7cbd3c01717717c4c8340357031b17d3354f2f4d97158c9e337334eb9ef79bb6351898a092b14f70908b2b0f305b4ffc500f8930982de85cdea03b1a301521ecef69139d5070c8ac726904b898fc1e44012e475444616ac23aba8fc03b1c0bf205114f5b46e81c777d37a44543469382f1897b22037a6f162e8671ad6d8264823e506d5839cf0a5c3280006dfe3d02867ac66b161d52d08abc2213d8a900316d6b912ba095f919b713ce8c9c5cb13c8505e3b5adeadded4af0394b73dd02d7c191b04de620e0a1c775405eeeef51d13c74d0290fdde2c5368b5e4b5cd35e9e8b8d1c1ad41cc92572c9f21e97d65a417b98185ee8a3e0b9ab45fce93ddf6a4941fb8d07d8e3c1965df777c1ff5ef58f8582fcb9b0508653031b1b63ccb7345c1f0c52ed97bf5431cb7b4244fed28c83d1946cb8f6cc26dd2dcad476bfd10200dc797ffe5fbb872d6f59f92c1694f8c083716c7715a08748d02b30a45333f0ff462aca2660fc5538715fdd5f823f8b5801e2ec5e31845fc8592d9c3882acecf8a28928540976cc00cddd8357d7da192dcb5ea95048efe28f2e00f3ae1fef5190211fd0c", "6a5353006a", 0, -1861803510, "48209804e28ad1a343979e1a5dce0ed14e4ab271b996006ee4a39b176cad39f8"], + ["92f5db7903f9bb257764319389eada5054f79898a63f4e96b770dd47aae92b0089cf3c5668020000000565ac630053b4e3ce3fd883ca3b9e5797f4d04d683ce88513dfcce3c7167a9e31c05aaa863f854239be01000000046352ac63ffffffffece2b5e93a3e04570996ef66730c37fb903db95ff34536780bac955baa7ee42f030000000165ffffffff0277fdbd020000000005656351636a1fe6ec0200000000065200515153630000000003248c4b04000000000000000000000000d3c7c89e8f36123521a21c85949524950b428feb60ec77a0448d60829304fc70ec698a8199c9649c7d9ebce14637c2aec7765919566e02174e0e2d82613f00819db937b82bb34f72f438859495cbc71292707b1637ffd8a85827e19f511e4fbc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f92338e370a55287da17270f46362cd314f8f299947b2e4b20bb8e93519745ab76e67909058bcb535ac76e93d00d52f6f69caff8161d6f0a7ae6270465700daa3e046b02a96961972a71ec5364d19e122b096abcce08001c20cf2989e13c5d319f8e8ae1de798e3e4ad95cce1f3b2406ae62a9bca450592b2eb04b98d1d71ca002210590a77847271481bf71bce3397ea0ca55a7a5421867198bdd655c1cdd925d031730f1c9ae699a54f02335611c24554492dde97e9bb767a3e4605ea16f44f98b0a0366f7550342cb621ce86597f1824d85e7a09c279de79b3d9d28173f3637305e6a6e6f79cb0db91461c77b83c421cf1f2161a30329b447ce08ec13bf0ef2bfba031744ce631b25e4afdecfc34071262091e6fc00027c954e25298e627afe180e62031781eb62eb50c9de8f1427ff63cf4760661e05ea9b33a7498a95acfd1390b81e023030b39fecf4a753af79b9e3674134c889489f3d2bbcfeb141f230c29e54b2650205059394bf3dd0a4230c31462971961508d497b418a93e0755941302a372dbfc020306eb12ea8160839f639b1d21aebeb30bcff098c9bfb04d2edd1c4d47495394d7e05222a0f5526a75a4ad04470d6ffaf84f4bf1ff9a43d5b4ed6dd8abc0a76138ef3cb983d090ef22f4992cc5b356a96a2470af8a81b1157961d9e69bc655a4138f0f3d971e84d18b3d9974116ed661155e353b4599275a951d5e693adfbcdec5366b04742bf6994c7ccb8e23eeb4c993566986f249a0c25ecc776b31a90278c9bc54c15ee6b702ed6e0380fdd3212f54cbe3def219a6f7201b5040dce4c419b5382cd6efa70d05ae965aaa4ea7fbab53587f45a534189addf8626ce9a798fd1a30fe3fcc0ce1196faaa4c5d42b3ac7af8b7a9ee682d089fe062cb2f5ba8a6d9cdeda2ac341d83088e4f9f5a124255244b7bc85ac8be47164e19578cfa70010fd18e7a4d89a9cc29d410ec78d267d78da03e54f763eef1478fa38f54c32c398fd123894a2e3f8ef515155b755b28ff4c059ba2938ee79afeb40682ddc50565b5c9e017c925ff6533a457253e827625accf66b6a0e7f04bfb5fe0b7a01a738b2f83ed4c2c26fe00b4557ef767139955ca3cd83823cdb35f058fdb0e2bc4b10c47c8ad8802b38eca96274317afe2daeeb38da196c431ba49b20153459edb3a302db5c578bd9f4917f32d60af1b765d68742868aced17838bb8903784f20fe6b4575dc8c71203117b864f5dfbfc5d10d199668623e17b78a4fdab8aa1675537c82dc0c30061dffef8d6ca119cc0fcc01a4bce595e3385bcdbdf8a6ef7210c3818380e3e6f49ed60c0fdeed9f8fc586d86cedf3433d0e00f67eda1f4fa5e6b2397a70e46b29c46046893bba167752fd508801d55a8feed7e5369babd8277d7ddbd8e6f6183cb6d08327e48c4198fb54f56bf2f492e34754658eab94fdaf002676cdf94d0a4b34f2bd075ce03425d8ee93e3f55b1910b585dceba8f9af4b346f8e9c090f16f17cd09cee0aa00103336f761c8d374ba3f8bb3cca53efdc12622c34b0986ac20e1c645dcb4edc213258b68c122ac12daa08f3c087af7081cd414795a4dd29d2f69b4165915b2f66fadc07944ecd1ecd842c2becd936c071ce05a89ae75b4712d0360bfafa91e98fe4d12b34c15de7cef4028941daf9fa7c0ab5933112e00d5dfc215d777a25df44495f2e877828ba8c3b4070f6b74839ff2b722e643c5f874aacab52976906908c1f9191b74f0d20f090f29341ce4cac3ae3da6b58336069b00440bdf0e8ab2541606c48281e5de6bf80e00ea3f5ca1f161b06a2d4d299c8784fc271a985b5f1cac322d365f9aab93057147f454e9e1bc3d5d3671b824c6c5ad819de13aca1e94f5cd6a91672b9dd31dc88747f5f6192a1d9a828dccf2ba50a3b52c5ac807d51d3a9d9cbb78c8e6c2af4123b1636e6802710158a3b0848e1517b464e2f5c4b7f1a1e6412d2a522ab860af090fec481153acaa6e961b03da29a7116507dbd316973b7aef7a8f4b295589c1aea4ea8701fc5fb0746e041766027d8bfa6e1b8d852d0f4c090f622111bfa905a45fdd699b9ed9afcd0c3d84451a34433fe5c357720ed3439b6228c5c536e153031839a5499e466a8b244cdaf2dda3c10c52f79c5de0b6c547fffefff6d57804166972c2b70d0d27ac32b3547085d5ad645b97e1c29b8ff7a1f92145c81598ad841104dc5ab3ccf41dfcc03ea60fd058746e73db78f1cabbae3fa7f831422e759a35979e485a09a52234e0def84ea505fb2e2c433422457345719256183000000000000000029dac60000000000b77f0ab0665c61597b2d5eb48981d8841912952f0c63c4b8f8bd7cc333dd1a91fb7f071547752c32f7500cded54231cd8daba157ce3c05b6befa40a00bf06c48d2b36a72d95f8df73c202ef9cd7cf3ff04fd00330606303d08a5930a952c63460000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083e985ef2c5bf3253ee113eb7c487307afed7a88ad9d47f8a91e99b4171e94c959f3ddea41c418e4afab7935e82dbc169f282b5ae9e86ef6b57d0db76c6dd6c1f9cd19873cded4a0fd4e555cc42a873620e8eff507d5a6705f24bd89f9a6e1f594c5016ced0083855dd5a1134e7f9b1b5f81ad0b67d29ecdde08b5c8e912a89003271b4f85ed19bd172e1b95081e685e5a324c98fc01ed2fd76d6f3456f0a80ccf021b659293b784a7132a88112a7f81c0675b40507857434d5519e144c2b7284a1e0a04deef82ef0bbde3daa671347855a85921cf4b3db3ff7da8d60e609872b6cde48514c686d4a279b066d72658ac5d7c3906ebf2545239b5ac1d502adb539b492e031964ab7edc91d74986062ab77dd9b192996e1fe51719b1a9a8627d09f1177cc9020ce4bd06139d750d47c7a596672f5a5c357174eae1e8c5a2b7d36d09e619d6230327e767eb907ccbaf0027450239f1a72711a8c32a13069392ac4062d48ad6f5ac0218c1628372f4372de9c759611b45a0bff3ad6f4cc4aa98c7a7574ea1a3c2ac680325011c1530e9c393bd1adddc0a797b32b879419bb28c50f8c3405e1a80fe22dda52d286497a33386e986fe8610ada0ad19e2dd400e80baae5fa9baed352a6cf034f54f7012ce3e501ef0f47a13cf9b232e533cc8a69ea78f86244150705d84c276a172209882f45024c0980cc746c75dc6c3c2d52d631a3c3bd2a50062b028c72cd6aa3764e876df031016f52dbec389cb496cad58489cfd3f697a1e225ad9507a04991ea1f8da87cb8f792aa317bd5c081adb628b35c4062cf0663ec0357222efb0172cb8d5e20c8eaae3132c72e20eacc5a2495d943e14329cce06431a362d398bdf4ea51f0d3213f188d979d9bdb675863aedb6d569995e5474488f37043903ee18967050acd43ad5622304d6cd06ae6bfd661192d92625add82721e5e5b2489da91174f608a0e4fcf213de2799ff591ec9a42aaaf5176c109fe8652654ed530d52c01612b4077639eb6159b4c3b189f3784e37f87dbb13b9a34c4328db60099786e8b60d9b85c549a783e9f77c9f96466e48ddf3373a9481678446bba8d44362800923ae1effd3218214647904ab9225ff00296d6b4a7846406638e47d19a1298f09b49d9700d1fe4b56c5768c44f9be574b845a5158650b79e2b36b3ab853bf666e3c705fece5b927b391d93068a0fc68366c324e75ec9fc35b36dbe8363a1d16025e0f95cf728d76ad13230680d0f0c4bbdfd962469853b05c39610de6df91607315640663b65ac78062cdfc2f9e8df1f23d0f88cbf12805e9f555861f77eb22a8ad4782fd38117174c218ae9544f67c0ba2509785090fac89ba4acbaaafb0b37102b7cc15eba8032fadf9d6d39c71b2d00d97c499300e8a4bf0f69b1531da2fc82326a301349af693371ba7c302cec893702c368d308945f6b10202fdd402f33e41c0a0a3399c03e29b9fa143925827f1f7182cfd1e945e1fa609383c7d8bc973877f8bc902f7367a496bda07e3289a0071143cea61d02a9b6cd316bd0a3d56d82c152c3ea3998d0c75ed7fd659738d1bb401411d41c8b715c91db5957f537f03ddbfcf8b5eb6b6935c29f22e4ecc0abe78f2f9f402a5f79ef7784f00777acdf6266d163eba101972f42a3feb4d46848a375cd5d770877e33ab15c4a440a625a63a3c78a13c261ac985767df4d637227b55dd4b11d7ae04650f53825bef53442df5c87aa067532ed90755b11233c801f454d0870296a9da2ffe6392c8eacbe80dec31473f9305a37554749f528001e95e7f3dbea8371e2aad5f5b497d2ddb8e29ea2803b9c3f25a20a21a21346fe53cb5ea887c2713649b203ada8c8c77ef80c12dc03349a66b1e5305106a7dc5de614229bc9f6c9f735e08d2ed96d4de96e52a6a4ab71348701b2665bc174b50c0cf901e863f63294a60973ad82e154d844a6c386691d4138f812a94f3456b789696f2e51d26cce4290ea16b78a2a51d4bc2a50f1a3747820bf9d81eebd9f5332bafdf265a5075745bdaa6b4342934d21c3131909963a106b9e1d848c782196bc70d4632f0f22400fe6dd3dfcead7545d0490c5f2c27df78b5d42590cbf75ca34c700428e1f6cb503e5002a2ba2a35f423b215cd45cffdd6608b99d5c4eb37b001fe68591fa2461f1e5d3ad5e03766f6ec958c27c7393202b139df478f55a17ff823300196cd006b8da43f49202dc1d5b9f2a333113e9418aa28dbcb1b35103ba615e250710cf100df0fee110fdac037c7f12630ffbc51970f8f6f20fc044dc5a300000000000000004a13480000000000a118d4af559143bf6175bdbf9b246ea3196456352a1cc3e7976a05713ef0722a6635f570ea7580177263a3ca9d0e530701c5c871a94532812e8fbf53e9531ab3a3bf8d4f7f81d13f884c553d97b55b04d0fbe16ce545095350edcdf8cec9d4b900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f514a77e9196eb269ad70ed6f6f8226007cfbcc71fd806a99071174d5871e5a123692690ccf0c8cf75145a155358a81abdd02c697ce5ed13c21a4a97b12939621778973ceba4d846c898c9b90e301f41da4d384ad6af0a9bf81b5fe282128140f078ff1620d6103c0095b5322670524deac2cf6a9110c2dbdc418584b499b669021201ac06a3cd2c28d7205307304cc76c358ed117b8a42187c9a0623b04c3d92c0216ae621872ab83a9f85b7b4e3fd2bb8780f39bd98046f6bf4e9e6adc6196ecbc0a054374ce3b54ef25f7ac214efb457d42925954fa9a03dc9d48364a857aea28f6c7e270c0ccced867677a990c77795d4386b412ca2ca5dfe07d8770e4adda4681032447db81fe14acce418d5bf2cf14dd311b0dd101c61023926da873bcb4403a670315e7d27897a78f4fbf881150500b8bff6e9ae981ff63700a38846ede949737d6020cfa5becc44a7c7967ffc0b655de7d84c8cc8c17fe8aed9ee88ccd7a72962841031d69e13706ddc45089d062deef33ef0ab97e21025e0f4f3817b975f91d13529d020650e30f0a0c1f012490767643484249711c810201accf5cc99a09af9dafb873778e489642a23eb789645154765d9e5446aa5105e3894b9321094f2e2e5b0f74050283637b5d5e8a569aba4dd70d9112ad1a9dd258636316b1a28828b2e027f7d55550a0f9576a53f02fdc5de174d696315e593fe1d2abd80d32dfbde5ce7de31dc392c0404ba0f8203db39dfa1cf054f33d289a5b4d1cad2c4963bd967ec5565223c20c530b67b349c0d5b60864ee5c175df942044e9a1c515fe7f90435c39f506b773977a5fd153dd88ea9ac4358f8cae2d35ef4ffc6cebbe40fb7dd90643fa4af8b0819d34d97eea474c106de035d6023811738f926d1cbc5604163030a89f36291d867af41c1ed49cfcd8c1212318cdc4a0a2fcc5a80eef95d85a72aee7cb03deba120ca6ea3c14160590ef286f549f7ab4e48b8301775d7e1dacd1572c86b7ecdf69b02cadd50792ed72a0348357e54468dcdd49996d9d7f2d887aa5f20d6cb3e2cbb1fca34be3354e1481b69aad9b90c1b72e3dee4e89b697869673a7ccf70d5e0bdfce2d1a085f82f88ea3bc33e75ec83373b64cec6d78635943b3f5262ae23680231dfcce1f17aedc7eb49df49bcaed86cec24e04a887e9f15139077065190e43cf3b404f7e9f1c3e6442fbbe9a0f9aaeb30f0aef388581e9be4c25af72959f7f67ebc6ea31af6bb1d6ef7199af9cbd9ad2a88be1416857925300dae2011e3e96a7714f5d126533d795bdf8e29939c1efe8687923c630eb2e6088ca2105aab1d884c6c92ec420e3bbe910da6791877c4d53266eed50f63b30ea160339929cc055f4c80bf79dd86fe8b8bc53db9bddf1c5180006210f7cf50f9383d3d902c0ae4c12ac8b0c441af3a32734e687f579df322e56be400278071b30d335b595b086fea0f979a5e6a246430d0230115194f38f6f6a3ed7497e569786a94d5284adb875ab1c5b7e0a9c4fce7cc48d64ba19152011e71d94b977459c944a03bc5cc9b3563abd0664c491758a0d557734f8ba2ff98052d36cddfb6c0c97e5b548fe2d05c2c915772fb321c912aa6468517a52feaa4f21a35437e3e550a2652ba0892ef06531298d973afec7a6555948a96f1e9178aee9d370cb57fcf6e48086acf919a44a68837f4e1895dcae1a3ffaa614650a97c2e71ff35f5f28cdca3b246a5ced885efb178498f6b46677703ddf25529df96e489728c3e4f131d24eeee02546021d058c9bf5efc618a4e9c02b86d171cb06b4473341dbf6b96302db2b652c14236f9277222575c289edcb52b18c83c967e3748766296c6135975911fdd27a2f801345ec56a21b776c25b3f37409e61a433395798199d1887618cc8a16078bf7bb1640fdf8314d704cfcc4b25d7f7908efef752780349b63c22c30b21b79e7388d951d7d9deacbaf0091c22b35162d876131f9d42e92ad453527574190369ae210260a1b1dd5d31f648ebe85918d3f423ab21e73bc073a6b3e0ca84263cfe99cfbd3a5a29ee7ad12b2660a63abf574f3d548c42be95911a8a8f65c778dd4c9acdbcdbbee26f1368d5e0adb582a2a0323ed1b1481ed014b598f2907cfa35ea370787050ca2d992d0e1396abe8a13089dc4b8abfbe5db57c766ac833a37200966e74acf45b1120a2c811bfa55ea6955c89f137a8de8f48f2ab5bbf50466d54ab2b6af32d73a87de929e4ec22a411600a1d058861ced85b488dd452ffb35d372c12160e9a1657b1275d93d3103c18905ab8ff71f352f98a646892019899f99ac59a5cc1178ee12dbfc70168ade061211f6cd685ca9287f65894cceca90ebf154d8e4a213bdc6ceaa819f3b2e9b73253b2c31561d58233f849b40d97acb45eea4e715b5fdaa0838029118e347d2bdea7d7a01", "51536a6a", 1, -1884582293, "3289b801fdfec111e4eabf7dc078af78d00d1d9207042c2c6fd09da5774c85fd"], + ["030000807082c403030d5918371c3dca29603fbaf52f3162cbec36661e03c90ee08b4ff156e0f353f0000000000300ac51ffffffffe56c542e79a72a4186af0875177ea412193a3a441d7263bf568b9855aee1d5e500000000046a53655346810e29fa27e066ba5004548753a0bf8bc63ad3fb458032c7c73bcf37faa2b21bb1b81b010000000152ffffffff01ab82b60400000000095151515263ac636351cd68d44e000000000200000000000000006eca500200000000b019620d6b7d3cc849911c674c32492930a19e6a758aba08dea0a7e13182cf00c930b4620a9919cf395adfa31f8a96e75ea11d6dc8fc97d2e7b570e83c8690cd4b9e99a43c5e4eb826688b6c8977e414a3cd17dc8d3e3aa967420531de704de100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bab2da5e1516d1fd7fe38f0b9436ffb2b7cb4c0c93d23c9ba617f13d31ab66173c947898ecc8abededcb3c6f7901d0ccbcf033b63739b0451905d2834acfea8fdd27fd227d1eb90113459b087a5cadbc66d6bc8bab96a5bb1376d87a3239c535b1d2b31f932c96b6a32f90ff745b8405e773973e3d270ec43d0b46f76b0e57850229042d5b3cc493cce342fa1bd14f20d8ce5030479736cfd2154717b523ce1f610321bdbb926f736c6c2c7439a18fe126c871430cfe766ee3aad65a992666cb7ba90b0677f7972c5d193566338e3f7da333d890954de059d729366a9886ec33ff08134fac4c5eb616aacce65a05ca34b9908ae331a89bf489d0f17c7bc1b8742309cc0320f6800692c39b89f7bf3e4236214e0879e19b5096696762d5bb9c3e46c2f83203230d1d360a69a1692af7d32b9aefbce345eb71d1e016cbbb4c8cc895d2a41169032e8c6e846183b9815dfc5031272ae14a0bb568e9f27136053d506c738e8be32a0317aad2e9decfb4d1fcc9c33a8c3386b7a84cf21e8cc94673b6f173ad0236e640033006a326de768f59c4b8128014633b0fc9f83e6abc4413960a4541c72a45590afd80d0929053f7fbec8b341257b1462923bc6a378c74e7110ac18a2c3b22406d0630fd54bb00879edb78f637c374bd8078b4045a039e2795fd5f7e6e68e27c947f283d035d2b51479bbe4e21a7db82d0f2ce05f4a32c0ef3c4e13a5ec307228d21b2417a30f3d126f89bcfe11b9b5033d6ba439d743a3e12a093cecf79b53f8c42caf41e93e618e17287a53f2d7c9487e3700affcaebca19f60eea43d347e967d657401f96df72d7ade1fad6ec4e0703cd8e68d7e4d0565234dc1bfdb9fabb5da90470de87a367cd5883783cdd9fd3cc29c4b83b03212c1c5116965019bdb40cee1b759409f5e145721c522b22f7faba2ed04dec17a0a39959bf44ed6084b9689944e6eccd8b7747a5ce56bdc374fe257ead5bca4e2097989b7ed2d837e6b133e46292d11eed2e577b766a8039307b51d4ddc34de4ba4b4549647b3a79841a5d494dc490a3d1fe78c86f5965f3ca309fb98a3ebdb5ffed1781f6421c196bac2ed6207a0c8117f5a3aec932c2832f7fb7d4aa8d4c99fe251bbe8de4dafd9f320bba6c2abf4bf1c97cb28dd221c304ed32fc435252d7f452977ff1db83c6d3a4c7acfe68d1d17ea9e1398c98b3a16b1e771fdc66eae2df871e6ea1ed30901498411e67646c47eec15314b326ae37a0a322c3980e39d5785ed0db356420ab66a79b47e6ae3d55cfeaedb4115286843da0f6a67d31c58d90282ada4ca8c1c8c7e5e795d794618dbd6f5df8cf91b94b4417e2349ab424a6a6803e672071fdee0f60d0b816c513e9fbd09d69147e3d783ae0932a925d95b45200df4baf04597b56c64cd72b7f73d008d76e8ae744883850562d9550336124092e1f355690995121b4694c8b41481b6ef064fe24c753eaea734289f4fdeaa6fe89127b2325018959b50bc73903666cb316caa2d31b13b9a9a8eb8f5daf981224362fc844fc6f44d5595fde3503f4c6d1df453886f2be6ee7818893b1e58467d0c115a12544a3cf7031627b6324982aaf7fd5ba01a56a5f0f4a96ff1e6104a39b96d259f12796afde13d72ced4579e10b91a9c8ffc65c27a04865a284d4fac32f8049ea7cae5a1dde8492e347ea582b5fa8ce92e519e6a75bd11c3d825c479ecd9a511391e03c33e2796daac2639af375c99958e3841625eecf4d9c578cc786a5aba533bdff94189c3e88534b05c8ae2711f03a6d0cf97ff38a0ac88802ba509e6f59fa9d72609412092501064830038768c0b47609eb85a74d71528ac1d26586450dbb51623a8c3a0ee4ad79b0ac3cc5825e66c6a29399fab2a8029396367e6e3579781ba77b2cb9bf786212720f4c41537f6a702e33fc44ef7c1d177b6ec556e66390da46e6edfb08ff6e4df59e49432dd74b97ab5b2793f21161757ae7a840ce93ada22a47f12780c73561ab5342abebb9b22916c8d30381d439d321ca44fd12002785d489905b0365c0ba66aab77dc79673f98b79acaee2377fd3a517fd718450a7cd85c217783ee7d9e08f30ea2d5480b00ac8a8ae4c0c004ed89bf4a35697a7ff75ed47778249c72b4b9a5a68fc93967ef6333e394811214c5f749a5c5921c897abc0b9e40485cd92d14151c6cb24ebfed9d0a630ce1577326051758adceaaac2512a6d887c596ba6c2f1ddaf353f3ef0bed9c409a17d9fc0d07156f5d65b96036b2436359c2adb3aba8148f021970dd40bb9536901c2b8263700000000000000000f3ecf030000000020e0b4b7cd5f83858c9583e48ab27ab1f600f65811182f9c70a3fba4f50294c2e456768a701bc62b8d4b43f44881319ac474c34ccef437c461558db33c362c8a2c7debcfcdceb5b1b2e48c240554420e6790c643504d118b340dfc11416511dd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b9a03614ecd3a6e9290120c40d53ad91c58c4b1775c40814d29469918be4b849bd0e2769dac4c48acb30a1514f148ed588a0c045bf5ad309991e9ab865fa699fa5b0689e15a1a3ff4be01d0837e19d2753a3f12be3d09e1d3e56092413487e2f7cf26e099dc9730d1262e89717a42d178072b5709d7527ab572a36850f641480228fc64a69b4c1e0fa91aaa4e55911b3a5ed850a72491cb05bbcba48e367eef2d030f08dae0f7a1f881c3a3045f75f7390e506e9035a10fec77250b03a9de88fca10b058358fdec13932f410ae2c64281952943be6c1166262fb69a66e6d14dad7cd32b04338d0f9562dd101efd7acc2e8616859ad1f0e852195e127474177ac4196202073a596662d917f9f73b0c89bc58407b8447e904bf06a7c3e2a0fb6bf66280070221b1529267ba529b24fcc6242e1689868f27f0cae226f519106c567a6b549ca9022ad307965bd4539c187d00dd9c1d98219cb321856ba13e9f51ce220bde42c248020e4392b2df33c11fde7a87d0b5778361ea4b5ea4b176c2a93f2cd25c51fbb7a2020dbd6464080bc4adebe4a7c5af46470529abb0eae7407b7386ec8d6671c9d38c2bae5f24c3073b2e1f7cd9f978d9642390283f7cf581b3b373c668e92a5015d62a353991af29b2af57383432cc2a41ade550197440ee706d034120723144db9c8040acad69c642df09cef6e0b9c426d8ba20434f73dc362f5f8d6ed4fc6562592e0b7ae8f0df43ca27eac0174246f906fcb57921dded5cae9340853c865496fe8f421ab6d6cfa2291eb7c876e488d8cf8010eb13b48ead36782d556e2b18af5ade8b015dacb428c60d584aa2e789e5a1e9480b2b662c3c5517e089ff82844ab0ba45ae41fb38c85aa9e6723d67c037a47c844d5dfee888a5a4bc1d472219842f5570e2d5ab98e2ed845b87d29aec679bc42d93a517c44e4e2e402998d1e55f1bf7169fed46f0b3d4bb8e4a0d8a3b53992313553c2ad8a739c682bd530b9d0ccb3f74cb7d1adbb1d45348bf44725a215a76e65fe50e11fded864b0ff6e7478d954c4282fda847e1106ac38738130bb011b0590de3c096f24fe553763079c923dc973bb4cf2ff25ffb8f1097991db4b7bf2f907398ffb25a16ec44c4621d6ba1bf6cc59b1e09116917a92e5a5500dda93c3162cece9db10c433e8ec904c4351ce81ed856a33b04d5879e7798c627b0ab1111919780a434ac2c6d898f943dfa28a6f96d017b9a5dee3e3530ddd67b3141f09e93e9aaab71f240d30fda4d2e29e1f040c5054416893d6f379348140b7b1c481da44cc74206da31a10b29932b85ddf3f6149324f6c6dc440654271353e4607b7c5b45768e922f63e38749c48c2c77885adeec0f96671d836fdfdcba91b0d348f67833923b773c4e494042f1fa8e3ea75d170b24680574905b5b8d545701341d3e28e3901cc3218820cd731201986ce9737385ee260c3ca947b8c585d44c7454ddb272673627383a5048dcf79c6122344fe3464f415bb831825c5edde2758634fff7c20ff8727b6adcae7b8fde8315e2a1dbafd5f0b6d419571141cb8a8d072a6c47affe3b8eaa68a003d574ec5a2a0924fbe40da3f2bd206ad9c378f55b0ef3487d992477c7ba78cbeea5695aa9d9440041cce18fd3d8f293fe808e106a882e3b0a424283b04d89b8f8ec12fb6ba95e2ccc1d028b69cbd66604d8ff8b0003b7811f1422720e69376e16e82a73f82d1dbe5f550d133a6ffb50e327545375870f96c061d0bbe54d2beee792c209c37ecdd6f97a510a632e0454df9973a08b6547de069bb8c1f7607ea8b43ff411a04896632ad9ce0c8877f1645ae1bab46f92b1b1b1a5483a87049fa2347f493fb92c16898b2387bfd7d86afbc9eef663b9d3c19f7cb6e3a531dcbb78929116aba43c233f34d1720381eded44cd23a43f46241c98328bd1fce138686949d04db45a7bdb3f3ce3d6f9a54c2d910f53974c3b272a0561a6b0332a5e3b2e443496638df1f658d2e92ec76c048cef007b72a029fa4efaa17dacf16a507224e51a1bddc9602a91a910e70dc99d1d9b80b5bc53cea723ec374217ccc3bcce0aef23c6cd80e63a09cbe5f932fb0d63bcc80e4beff8c4708de0fce0110680ebfb664b33fda87f62f73d9b8394128af94c52615f7e59cee4b41e09e118b8f1ab89597b05397784ef963693c85cbaed854f612b8612d64463fa1e3bc289cb820cffd11e7e652fe4dcd24769e611de102762866e5b2d781b87abc1453a02165a4e405e2ecf51d98e4d8910a88e438da04583f91fad5d01f39a65695ede4e4d8b4ee42d3d39c26667b708873b6717840419ffd5678b96a7618e09b19b7d8cd56b68cace641dc7325acabfec6ee55da97373c11cd49b90d2afa0ef8c2aa3bc07622b6d71b4da768e998cc4b4ec5364867a0918669e9742dd9dbe7e0e", "ac52", 0, -67442654, "e6a9d0b1b2e2ec551ba469a6ba2c2cb85f5d08d51a6e1bde529236c98bc59585"], + ["030000807082c403031f550a1dccde8f01af6c6225f3e6839d944b241625bc8596665891c3cfb1767f0100000004515251ace85f8d1f085a5a4fa3a8869842ffeeb30c9a2a45b9a09ee9e28628e8563fc992083560d00300000005ac6352516affffffffb0d27fd646aa5d3c2cbebfe4af87260998ea3b05f00490fbc89da44951944afa020000000753535165635153afa5e593035435e600000000000400536aac6890590000000000075100526a5365acd72bc90500000000076a6a51636a655315dc6a1dcda86fd20200000000000000004adc97050000000015fdbd26b9a3c09d776c6519cb714b23c0b9bed431343b8bca4228989e9af04e9747da1f094b9c182da8da3f8051176bf3db987075f569c03421cf09013b841a109c4c3eb2c9bddd20d8a6fd274bea891f1d9e0bfd8b1474a9b6dee067610fff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016beb788a97e77c3947155707a65664f91479631a66ce35f5b25a327cf2d4405f8cc0fe03288297fe26a366157aeb6ef105610a28adcd4ea129c0b675bcb807d1930ef2d4b0144c49028e4c7bb267258c2dc93ad48b7c4b258c8bd876529bd3e6db4f62d56cfe007b35fc28994c0abd99c2009f684eb33f8a5e4a139e7cc28100301ae82e4f811e5edcf4126911662a88f0260f01ee1652b61a8d595a787bc1655032608481527d34e0e98969454f595198f831950cbb217de4ae547e87e4a3c59e20a0483b3450c4a6fc39be7137eacee6b1f9c1931894d98a734598c50aa3a8f3396def93575fc700c20775b69e866aa43c4322200d0d6576140078b79c1802d91ed0308429f1f9bcfa0e1863bc4b62b56fe276508e494e80e1630eee4d0b99717ecdf032884cee8164779e4c7db99f4f78fc76e59275e0761039ad8da9707fd45e7731b022638a5c993a0d58767bcbda2e89f3c2de95f54fff946c2dba320d73c3221235e030d1220d6a7ddac379fee2e9fc4183083ed0d36f222d8bc97af78caba9b26cf62020456ad72424d0db8946455685ad3278db5379d28288e6e38be0adf6b81cb78a1c5f0a944754060bf8ceef0a9182ad64d224fe24b15d9d20413f44f7259c6cba0cc2673e4b926865af6ae2348dd414398ec17d0fc2bd1c57e19e7ce03e88dd4e8a31a7134c0360bc5475443c5a3e16d7665cc83624ebd3f154f24fd6d92c8f34ec2c58bd063355cda927b3e37a952e95a3e2d22bbc8dd875b93e220bc2efc7331aeb3089e93b0aa25d0d99c7b7af6972f64509e8f6dc04a6ef91f25f257f4c9721a302915b69468182cb2f293dc59892a2140c608bad2f0a91bc24bf1778df7dfd9489ab453c16e4cf7e1330b25e98e49c74e568572087fe699a1ebad483dcd65492c11a794ba53f5da1d6b9fab185ecdfa6330a7b4e67af8e286b8f2930bacc45cfbe8abcda67d21350c3ba6be0398ed84b2b50801d5cba20f32b0baa0bd552a84edec4e7bf49ba15af188a7ba003aaab38052807728c8bad8cec9a4a420a5a97da8f65dbf7ec5b5d3f0877de9ad263f2be99f7e2249c7d54d1e3c491b5670bf685cfc0b4d0c24110748ad95a327251a6855a34966bbc966811770aaab7d1818c84c6d7d45cc7721bccd07b8b70fdbb0a467406983353f7b2d34a6cf99351b0452dba40012cdeb1d8133ed6993902835df81f2405f249464dd13eb810ad0114a5aa608ab3650d109a6ced810229cd3f42761d1c97d21676b0d0ef131961cdf7050b747d154fed3231904e27ddfb13e6a4ccf4b3453c4c8dccecc0c4a0ae0f7e5b5817bcfd3e5aff18edceff98f22372921dd8866c8367b9d5c82a5d3263acebc7244cba4fe306e8fba3f2d0e9127ed21571922e0166e08b359c9cf28fb920677b7922bfd1f675df8ee631bf03c48fb76fcbfca9057383ee81db163383fb77a29b11b964286f64546afd71370ffc16d72528f6ca3ee3f3c354bd0a7b1ace0c6b217bffc12ac982af1f74f8fc2127182a595845e7037e4504e91368195d0f3a167daf840745726b25ad16254d7c3feecf2656c39e9aad54e4653c5abdc0e56f07301cb900eb9d2e0e2f698cf9df84c5d57c7ce2405ac07beb4599459e424170e6be013e9b66db8a4f992a12b18c44661995915c9320cbe790ca5634ab22d4e8c51ee16ecaac7a38a35e566cfefd4eb5c16b727c46e0beb95dad9eda504646f653ec11190b5ed6bed017e4d8f4e89b50fe3947434509637e8b1b56c44b08847269897ae1b4fec5ea430c94f278d22f7edcfb1863f11a4694571f336e08aec70c649e82014df4e24cece6e0d20ff05973bd61cbf50058cb609305bddda4495c97c228a827e70a30d8d45879aa479be9d0a9a1c6c84563556962dfdfd93c77a398693e686c9f20f46be1616f136410223c1c7df484608129216d4691dc40f12df035184f455062c7af19cbf61fa5f3602b2e074ac7519c316fe3018a9a0e54f7c922dfda669878045a67d424cc82b562555e4a53de2356019a2d4b4740b3cadeab05eea30272c9e111deca8327e3bea6256590cd383573cec70992b0407d66336ee5e6031e8d7dbe77a057c4d0209eae29ad7605a4cc4d31bac4af51aedff23466012d6c4db5b846892dffcd3d933c8a70a044afce5544a23fabf10aa8ca70155fc5172f885025dd885dad517823373c11094a8583b9d594829ca9ec03c1f20ae7041b683fa2a8a898dc89b595c7258d0853f396b80393d97750d6e99cae30183caacf0cdeb49fa141c3d6f4aeea112fd30b489090000000000000000c811b10500000000fb1b3985ffe663e90cd133961478cca69fcbe9cf2348a88deb6e91d9fa65963dd41c45afb27b38e5aab7eab126cf6ba145aa1d0bfb7970697fa0221b3d1ecb777214f95072e7d1c5970b572d5ceaa86959209c4757ad3b8b87fffc9d9abee76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1149a92a0bb8a765d7ffb734f6813dd4fdacb0f167570d05ed18db0405cf6dd8685499d0ec65c98825a3753a6dd8896beab45e1c15e251112ce3df46ed4c93f9549b58ae76d8cec20797641ae9f4a482e4befc08d6409e13db4ba618866734b73db8e0e0e6875fc9dbe67e35fbc423bf01421eb566493222c9797a84c662902020ed31dc0a3b5fc891299aad543ee815a6979b8fc149125566619468884757f7a022e37c4e9ad074029f3990bdc2d09529abd4df678c70194e514989d4c7df5cf640a0484b35be6104c57589dcfb0e1e9f6d2eacf9bca99535f59e5f47e6f2515e670e6a54d23b56b1497eace5f031cb57f9c1b8ef68d2a3844edb862b438c61d03040303c3fce79bfc415806b19e4e52152b049d2ee436c80015551ce8cb52b4fe4de903145e8b3dca867aa790e4c68c35ee6bc6b4cd4ccabb78e7852bce4df40e39d6a80217645c50aa25ed5dc2f0a535e58e7487173e25ceedde79e20091a7257462f88b0313e4ba859ed2c0ecf680149c064bbe4ac38430e9d87a62457fac38e2740e1d4e0217291dfae24904eb91a32f011c107dd8831ddb5602c221930af92e202026c38359a8f20a3ada57dc2e24a8cc92439dec1f93550fea58ac57a58f37dcafd16d42c14e8c3dc966618b77ecd737fcbd41d3d6225b64887dc72a42eacbfa7f520467bc0c7607ec322c9fdef8308a2d8700aee71753c4de50d3d5fadd67f8c7e7ce7af0eda3dd41c4724d58c010dc4a9b7752d97603a71f094628a39dca65be70afbdceb5241356dbe886bd7e48382a01fffe0e247477d8ce804910ae3b7c53ee2df0671cbe32adf5c9d447602f10461a0e358e6b4fef2d8cb0224d54a9d0eea93289114b83bcf1e88291a9f7e1d20bcc3b51dac1684dafdf0cddd734437bffd2a4c85022e3d95e8901dd77ce697c0a6cdaee1a5fbcb56fa2e06589925d34f6ef4ce6962cdcfb6bfae63a69b0161fc98ec49591b9db4a2d8ae5ad903872a3800077bcc9fd3d2b6911cf0f070dad584b2a750e0fa550239472521db02aa2ad07299f8ebe864fd89109374494b3b3488a78588eb4165aa3dd12e3c9ddf5a61aece4ec14885618578cce249a04919cd6c0846293fbee7d4a90225a5a6c9ecf20291425db03eacec741d1d2d313ecf7d045a037561d56bb9564b83aab3b4e3130afb12e9bbea91d43be5104a8641286446f965a7c4c2cb6881828f7a44f11dc06930f4afc506eefa8930e19a2279c0a91479eacedf69c67115b88c72331115fc26ee0294ceb8074f5ebb4cf0ea93529873180d9d5a5e09e25548e395d580164093fcb569fcec0f82694ca59c7827937dcf3e7c3ca1d6615cd7710578bf482c20e77c8b02f0411887cd5b4dc1f180251109dd9a10137ad74f890eeba2500bfc783c009b5ed81324f77c41fd1e0c0c8b41d6f93ee3fd1bfb6dcfc349972968d1dd6146453f23c2ec6d2c55dee8a52e10071481b96995878c4e7cef91e7e8c78eda08a1d3febd1ced2c1a1faf4f113f8324b74b4357047332bab01db358ce7467c40c5e8bb2d9f9e29a633d96efcc5d5a1807857d1e1aca2b485c793e3e4c292e28764cad22748eba6b8a087e1004aa64a780823923b6a2876016068408a766e3e524fb16c41584d4000b6bde1958ac806064930d0a0a54b64bcd670dff41c10283fb8b345a2e8e71c840efdf962d24d5d2787ff4300ee39dfdb01c1fcaa480dd499b6327a75afc773057b391142d3c390fd5d59225b09675ba2b9283d0d090059820800251ca5d843940834d7e11e25aaa8d0c16686367193c889acf9120e9fe899dcd7d744ab1f5427b90a5748ffb30831d7f6c29613ad2e639b303e61824795126631e4fd9753eb459997b5a72a8ecbdc6768c5f251e884599642354da20fa021da8cae73521c5aefed5cd40260c853e274a9431b289e417e52c0b147de5a6d28c8b1b1293b802c5eca16b6d2bf59c70d7326551596cf27aab20c7a074d69c2491908e4d584248a50091c0fd223fbec13369b7b01b4e8a009f11e81400724328cfd9b384e3557c5011bca8bfa8d58abd91d3b98f58e9c4f1503c5e3ad15c2308fbb8f9f5781837618b0eeb7c822ce6902b9bc69dc18f05d8e6d1966d2eccc751609ad4549971c7e957396980b2d2d0df6c1757b146bcc91739f4e8868b20b7964e18c0163f89dfc8db39c7cdb58866c9d577d71f49a3e6dad2baebe2b2efc43dc840c336e08ec1e31989147aee29ee484c85520d64e228af8f04ffcaa05788e6b6cbf00e92773e9f67bdb3552290a0a48ef14f31080adccff04a8e9ed98b057169db7a132d780b02d05df6667fcb8a64b56b95c96a89347c9de2bb3287381c2069ffb23e05de63c00759be6682d54078f0bfa7e7a76a1d7c91ab97b4f7fe8689410c7e0ed10930bed39c4c42bfc7ddf342460aa202e0e", "516a52530053656a65", 2, -737874743, "4dc999d82d7f077abdd3c4c7afa2e4bdd1adbf6f7f290f4118998dda009c67da"], + ["030000807082c403020436c11fda1cff413dbec6221271e36d4f619593a0a828f8fe9dd21b26b12da7020000000153ffffffff64fe35c4e2773816c1120c88805b226f7cbf6f9fbab1f3ca236b1976218961ba02000000056a00acac65b7c686bf01339b730100000000070065630063006500000000ce370541010000000000000000b7ee300200000000c960f810fbcabe14c7e0d64b3e7a858a0c4d1b1d9a344e8b3a97d1070a2cf5bb3126445233d14b592057d74575e8af074941cb3b4493fbaf59dcf421c4e81479282b091ce2f3fb1f429c9dd53b1aa91f9879fb99107379cf37d6d5f5dca256ea0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000095c7b53c380514238628b176bb08be9b6557e529b4e9c05d0223dce782f091b33156d4610be802ba910438e465f572145dc4ef78da861ef27dc3979ab8fc486917fc395137108953abcece9561c1906cde83ae222c78a1070ac56b68fc7afb082f896cef4295e9fb789bbff241d1e67da441302291becb3886d4c1311d2ce33c031fc33437850340a67b7e96dd189d829cd4c828c7618488e6d26f3dea8679a5a30217666c9f6b9e0917b60f67f7238b980d73e3be82347d1cee169521a86e04c8500b053fc1eef1cbd358683360c4c4cf56b9986a0a8311ffe837987c573949952bac10c868ffdb804a45c438a5780f74f9220b018a2924950004351b0a29a720b760021a57c0d13d1762fd66e73607690b2be3e46652ceca5579934a35af30ee218d35030e2b0fdebbb55169aaf4bd9369d7da4ce5f024b1b0ffb8d001eaf0e2288dbcdc022d97d52e766bc7385bce8f73ec9b24cbb8f790f3820509facefb89f7850a6e1903038b29d02eaae5e14d7a5a9a586c0dce54ca45853f4243848c6bea8d914eb2e20203ea52a308600725b935f804a3c80f6fe5372c2f49711dd542c6333dd8c481f354b0738a7fc3c7281c30e0437ed0ec2a1237decb6c38533f01cf75f693711edf7d917f81700e3fe96109ef3a19dda2f2e6f7c44ec909cca2a71642e3ad2dd932ff429c8833c9c3933c3b231e4b9525eded60e390705ac8e5210145d36971cad4ae66662dc071d2610f140e31634599c57063f2480767914efe20564ae76812cc9c55ac62d0a1b094337551328473705e46db3d7c3e82256f5eec1c9480812089ca850a282cb1f22955b4315263121a58a86f7bc54f2a6e0d4d3ea5028ec27992ca64dc587b2c9fbed804bfa769ee5034f89e533d3676602919d0b1dff94f85a224be84125da5fcf1b63b31fb9817b606c1a4cb639a29cc99717288e70cdfb5ba7bc5f00d66a98a3942ba1c4487ebf46bdb6abee023dbae553b50770a74f7c4812e2898ab5be97beaf8aa49b0e22887d1eaa95d558574e1413cdf0f0b31b06451f7e3f9b9f2901629b96b56cf488c6ab4ca5dbb8a70aa06bb1e68803d23290ec5128e99d8ff76a0f849bbc66e8a15e0c8ff30c1a8ded3bf4b0e43e27ddabde419070d0e62f297d24daa48ae3cb471b4775b31d90a0252a830d04aa9983dfe070ff892371c7567ac7604bee789276a834342b61afba01035fd1520ece64d9fcce4ab100c1aa12cb6d502b6d010d0c3ce716df5e0a37d8b0e8e8a009cb1c846331896b170815380863e9dcbbb2a23d8dc7c1a974ddcd3f94c185e9fdb0f340436345b7154f0c5adb4a026d301f560e5efff548163208a4d172950605063aa3efe2675895241601a4f2dbd8cacfae0f18d9472f16a23fdb22c09ecd354a96ca697413f9dbd016b195c5640bf9eb5a850c9ba4cf174ebf0422d2ed0845cedb39a61de358287173c88191ca1322f920d02c3b0b5a2e1cf4d584c543591fb0cb1511f157561146264c502bfbbd20a67bd5c29938dccf10d7fa9fe116f6e4802f0eeba91e20342eed0bb47cfdac9564900644fbd5a6f7e629fe3581b058d5a8601a5f3f09dd000306b1f6ce1f105477f43225dc3431566bc567e4be2e87be8c1dcd2e162e01b6e46a11d6a20c9008e07235dd5a7eb6f8b0748990fa13dd3befb6f62256314e3c66ea9c4aef1787a3f73eee8126c5667e8dee896239a36303783e56d01e58c1392a8f54d4f9f6958f3e7cdcd1b92155065b901e7182f232994e8f179d426ccc0bda2de01d514df8d087de1a706fc328653f8c65cb57128bea336d21e0563ab966a9961f0e152588ad086aadeca354c98ee73937b499f978528a4afae59fa9e600a2ed1e31e564ae4788c1283d4839cb82034d56d25feefdcde1410c556d64d198830de1899a1dae871254c1fd057eacaaa4b0bdfcdf001896ba9ae336f68ccb5d2d234749ac54cae63ef42b98b664a10a1b478376c8b74d01a05f17bcd15afe7a4b89f5b9ed484531f64fc77af1d44843d76aa876eda5ddb6e65af2e3c9fd296a895db887ff64601c1d9a95df652ace0496d1121eabfe027e679dfd2aa4f076aa1ffa6f01f597dbd22a9cecb07efb38f2899cd21efeedd93daf5c1369e7a67db4ddf9a122b5a78a5a75e478c495e1ba1ebaacf66968784179c9408c5a6a2954f57772b66d48b69039317f5e6cb9f43c9bdb18f87b060cccc37609f9db6ba827c3705319a8bc36695d35645912093a230d27b9c6f71919f5da19647a80d489297866488b20d5e5b96a71965651606714bc3ee6e80b655abf10600d02bf59e21ae89bff4925301b3dc8edf3ab3c9bd6ae6169f09cb20c4cd66bd71d3cfe8029b3e43ad5af8996657ffe78f1e20cd1597b6aa66578e7a7a0cf344e74244e3d875a41a9c74f476253d16809193180b300608", "5353656352", 1, -394093438, "8b398c609472ede6ff0b4c38af73d3ec42a09fe3194735607dd0ed405b25a3eb"], + ["a2c17e0b030ba1f8ee1c5cd01805560fa951b1f7d2bbfecabde8ee7ff9b2ee4db07a6e8dea02000000025163ffffffff6bf4826538bd931404a76762540d112a5664d353a2a01bf15c4ec9e2f5591a8a030000000153a15adadf227c03b6be2db2bda97b4cfc99b4ea34020dfc39c2ffa0e3fe0858ae23d0c1990000000003636565ffffffff0234fde103000000000263537f350a010000000008525152ac00655153000000000161ab7700000000000000000000000000f7756dfe96f70f41c90d2ec2f183de7d9143ad31413de8a692ab8674331fbb8d19bd34d3bcc87b156265ca1d4ea2049fe90045d401a7e2a57bdf345663752249571cf220e9d72751242e587e36557d5c3124799a91f23dc4450316ff866e804f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004ba636127dba2f6281864965e09638c3990f97b7bc8dcdb03408158570d116ab4468ab8fd3da2f35161946ecbf5d9846ffbb2f08d6eadae7f6449d53f95e4a5f48475d3c96de9f7d3213eff38654d32d554b7d3bd07266533e83184f2ab42ca8644097d4a61540ce959ef0c7063ef8e1905f21f957520d51e9c39fb0dbddf8e032fdd5bb6e3b4f862ef9657b64bfd29367dbd63c2395b0c8654dc63bdb79f9bf40317c84da99c49792ff883ff3dd116618e7c6226695c494a1f205cc78071fe3b330a039f97a4e0617c507cb81b8e65eab65086e748068d0964bc15384e9bc32999e760aa41bebb55f35f6a850fa2d863cf45eaaf7fcd3cb62c51c015dbb5948011c60206718ac7103b1cc8b57052b07ae723fce74f80a7cefa408c567cce789d2ff080032d909c37cd2d125e5ba86a3c97e6f07e732a4bc2289b6a3fb3115f0b7b0774b603042b3dea819551bf73b8c2ee51e1f6be73709597f0f7f0b519bcb5346971f98b022c50564d1f396e26145780bce84179e32b993c0ff2e663e0f76df69afb2941f1021232c92980d3104e3f26bb2f8190e974930fa308bc1884404c7f2af36e736e507aa0770edad5cac333db03ed7d88d768aa48f6841366f8f2064f71d85f293a4d3097f8587f206f757af38d3753938fc8f5c42bb4011d96582ee1eda7e2803ef448ef595203b8d9a47690256ea23a5240085622089ad5e1ca9a7e048694b04575542c56c2c12a21bd79be6ff6d83be3d743dad6b98941d6d1a808084404cae032849df65435323187333c66d01f61b48ee62105a3b1bc0a85d2871d51e16fc90477504c11205859f1d118c75e4cf585ec1598a03f4cccaf714f3ebf0aa0cc79d8ca55320aaa556a5141de590643bcc12b8295a8d6edc3b2bba49f8627c98d83f419f95218a0e129d3a7d09eb01011a5f107e3b7801e00262db11d8d1dbc5c874132b77306f80e1b022ddc11bcab62782f43080ae5caf09ede513c27cb02beb74ce0bce6a9a9ea3a67628fdea99b7f370af92b3952d27157b9e373864f842bca23738518f656d52527a5ddbd7c86a00d78d67feec6cc942459ce3a45514351c066ef329904202478fdbe8e8fe41a0e6d3167d700e73e25739a2d06346bdf161585e2a1b1ef687039e6b0c404c3cc105a7447539207393d4421792b90733fc3798d5eaabbfa74ad18ebb353ec10b40dfc1b5ba4233e0b4b21acd35623a137efa0e6d5248b2ba9a239bf5a5648edd9eb918307fc2dd446b755e40ad3102133bec39713429e65366101227d8cd731eed503bf1358bae8297f82efdc4eaf9f8f909db4124c94a2a75623a72c344392bad66808e26035f60fdf925f607f135533fe256fad38e389e22c014e8d5aea49187e25fd11ff1ec8c5cfc8b18fd761a541b9c332a1db6df684c233ee8a84482afec041dbe7c6e64e5080d4fb37be722a4d996bf2be62c13c79639ad2a7b8f849887d1d2f45b83e2d7f1a1c7d825eec0d4586ce8064bb902bccc29bc0cb49753989e8c22218fd035d3f0b5d2841393adffdbcc74901c7b3805a88ede8e189ddab0adc5d3d4893d9e89aaa174bad0029504e0e48adc2d01e6df5059d0203f5fe93b5046fc1b7485ff3841e611ee71693449956dc43609aec43fa71a8fb478451bbaacb869ad193e953b9161e85e5785ceeba60ffaf8587262893bb71f882158bbb602606949f30841f4bb50f694f860a7c6d0e46a8d0422432bb1711801e19c87aba989c577023139c505ef0071ba84d5cd5ac7b94a0ed99d80955b3a647707c26377b3445904e04efe8e236f3c7fda745e2d4f4e9727d4b86b42c4c14641832214c1b443b02ad926335b4ad04ed9757c3e497991311883063c14feaa522fabe87de0933181f77071ceaf4a1de73903bd4c93cde841a266bfb12bba6cd0f199824adeb3aa282369b5660c07f70eec21f04fd07a965cf248ee78713f6ecfba1f7e22288920a2cd08cbee367f4d0dc497ad7347eb4053cd5c7b59ff3a4326cfcdd889d3427deacc26f5afbdb8b0f29da08f72962906d17e11902497a0bf17259b53643736e5d9f039d6d7ca742d6c3cf2556a1cac78f24b0fb46d850f47c01264b7b216e7985a6a4921e2e677b728cf3c2dbb78295268868c25b0efdf568eab97ed7ebfd3302355a79130f55b6a8da595b9ffdf0ceffadcf2ea0ae45b1e18d9ca3cfd8201366a36211eed23c71ad71451701c7dc9cd2d89b2d7b6edf56179ecd560c27ffbf733b3945ebc265ee7257ed9cf4537c761c2bbf0de0d97be924c54c50544b43b08971b28e6c4a36f1f4aafcf1d06b7909d8e1d8b6b5751214f21a105655f3b586824d24bcc911ec6b75fb93ea3d68f245e69de9b638e8cbed546cbb67be399483902c4da16e2200dad3a8f89c41b87bae30c3fb5f54818a13fbc56e6b70714b6443f308", "515351ac5265ac", 0, -1155137881, "f432c43d014d1716558d50c079de9821b09274fccc5946762089734309792f28"], + ["030000807082c40303c380277cb6a00c6d8c7e81ddc7a4cf14dda0f81d56699de88f7235c5c7e9703200000000070052656a6a6552ffffffffadf2cbad7be0a7f6c09b3f217fa8f28018c34df6dac9f095299b9b43faf73fd10100000000b0ed39b4f38c6f3aa3c3af0d4e9f2b86f12fc4ac8aeb44e62f9c1cdfc1078504d39490820100000005510000536a3155e77d02b8fd2200000000000451535251840c540400000000075153ac005151630000000075d8b15d010000000000000000253f5a000000000071f4caed00f0947897b87418dd09c7007faf316e5c5d6545370e7a8270ca1bcb605386f27fad244e49c535a879eae03831c6dd2973d6b9c350ab4ed6ab7aab278bfb4b28d7eb77a98a99539a9156ff8dd6a4e3525ca0f45e6b5d1cb4f673164d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b97fe2a20c410c8009dea4994c3b9df62155cc57ccde5f3c62af609dfd610050fa07584d910d910694bcdb7fd7b0be9f7058eea635aa9740677fd7113f7d5de20c64ac998f400c902b13a9f97c22367368db468c6fef77f6ab8602b7800d96a684ceeaa87c016341ad399924abfd124fee5c9a6793ca7a50fd62d92d161238c022e4f9116a33ae34aea7fccddb1097fa1c33b2aaba895fab492f6f7e8f34a9fff020e1e017c2aa79fd95a5b0f1942c7c71a8d141669f7c46a08286196b760c5dca00b021912756891e489b46e0b82896132ecf4b579d0554145bdf6881a88e27c502e8afd9f53b1825b49725df1abaa5c89aeedc6dc75593a4c089a364aa8b224fbbc02049c5202a79cb576143dbbcc72997f30f590c04ff672c25bad14f34a25d711ed031e6c6a82da59223ef0931a3a43fc8dd5e5b3c49210f1bfde9cce0f78be1365ad0201933047eecba381aec86401bee444a35b8d461f8f26b3a10669b0005eda3143032403081a37c8e9d222e2b9ab41eb4639a45628ac13f757bc2a33a478f7231ec402292acae6c9fbc09446632fb989fa4718583253e1f5f1efe312895908f342fa6c59ed8b0e13298c663fee1e943beac7fafa8530801cbbd43f9b3cf0d30b4621fb2977e079520ee97d691cf000e6c7c01d3d8ba92ccf47cd7993aa77bd89abc406e5b55cacea9a7f0ec166b5bea44b478ed928a0f83a85b831b25f51c9ff14ae88d8ae135de194bae7ce941fdbed7e8ae131c81a084d4d7bbdcac6807822cc38f6389f38fa5306f3da644567124699431e140587cbac3441fa96c70272e0484ad8e85de02410d672cf619a8ef6ed988d12ab96eaa211c330ca1797642711a230b62bb41385e4d4c83ad93ff86589ecff77a3e17c193015c430db2264565fc554f114a490d324ac97d6df45277fcb5d8cba622f48f2941acbf13c6589dec14ec6e427b71b62a01d126b833c6f39191132eec59a3e372c1996626c77caf1494cde3ee46a15454ed626cd1bacdd6809f968edeb16bbd2ea592a1cc766270e735f9106c4424de7b54e4bdf73202da364f3fe7cb1bd7a0ee2f64778e0acfd984e0060d6ea9ddeea65e01544000e08c4baa34abaa7bced20692c68cb9768a24890ea46d95543ca8d2b5acef803e8d86a128ed01044503e341682287f4b2c1be5994a679a56299d6f91615d2df7e560ad1a601b6cea510a10934c7720da2e0f38c50b1c15c49975f20e82727e45e20a562fc2806a4092f837370d914b7eb0dbfd20f227ecbe3f594b345ca8bf6b3f9f5490294ebb0b449935b329a80f4ca5577c1624d342e49233656b87c4edaf9980f6a4a5f26c0b2d01f190fd23ab817544bef138538d3e07efa1826636311c7d5b805d1e0ed1071a655412e892e169c53abd15e63cb630f920f98e6dc93d0c6e4f59335d0ba45b1d524d6a184ac0bdb246352603849dd7e16bb6960e6e2080cd7daa172b571ae440f9eee8ea6ee060fafe1a0359ba35a28fe110f974b84ceb2883b5b98704b946b330dbe9c52d615e78a9e88adfb049347f3f377aadf664989faee7046bd6476537f664ec1f8122ec8561c38de97c1efb7654f463a0b925faae3f3afef50c428cde400240470c0a9afc76c3f68bd227a7979321b66e63c81d96571d0427b1ce8bf246ca1b5196296b798ca82404ad0f8acad1301b2390829842d835c5806578f8069c660966144af7c338d026452e4367f8ff186a934e2a09d58d15565d0ef7e1f37a97f3e7e92e651e6a76443959c27731229603f396c6f27df6ee1b2c80f09e8cef8e0227e823607511561350f66ccf07a24e3122a8ee9aee5550024e5495d3eb551db8b86b5c9dc569055534ec8b8862bd1f9823fc644b81936aaf6b79383f1ddc235097df4003beb3486b62c6b6ec11e68e382ea7a489af0454e07ed8cfe8115d4bef3ed294822e06aea333f0edf4613fe9681c0788fe42d9718c2e58e0d23022157a9a0777f656e99857083040089833049d093a5becc19feb8acdc270221ec6ce2a86ed1ee725c0ec6dcb7dc344417d8d5b194b320f518d2c6e9b872830dbd3158d53c23dd1f9376b5bb1591423b2802520de15f336a780efcef99bc4091402cb1b35f58ad5180043027d6ce627859bdd5f907d71602fa29ee10d247a5cbf0fc04a112765df09ee7e6155eb38afb73cf56bd60ec824a81e5839d19780b6ac8fe09488e14ba9ee3e73f709976e2a9153b4e8fac0efdd2ff99d2e5e3314bf1873604e8507fae11bbb207afa9d247f67988a267b100d61a4617afc1c195821952395aae51e7e0568cc73a00e4356bbbe39372f4e148f83fc6866c1bca2b129f396f2288ce78e83cdc006d379a6d5799fcf7a7ced362c675afdb965fb16773cc034dd92d065f48ebef3d4c782269493cef8783e162d06c533bae286c9ceb3a606", "515200", 2, -832650420, "06c5b2054173bbfd085356d17ebf2b65b3e55b3d455ddd9c1e7b7ed7639f761c"], + ["030000807082c403039feee03dac456fad1219ecdcb32ceadcdd951b7609cf1482bd22436d5e9eed1c020000000552000052005e5d648a3b37c9488bd56ec2e21137af92ddef997bf08e23e80008cef7a713fba6af770d01000000066a6353656353ffffffff4b6ceb35304f074f3e53d3b72f8995c344df18d2bc3bd91f3943751b9d035fa70300000003ac6300ffffffff016f8c380100000000096a005265650063525137adc8e100000000030000000000000000da6139000000000029dbd590e90c006f14c432af4a84624430d0aa5f512b1f443d0565a8e782a0f639414b0dabd3fd68b1b2bacec72bdea0e2fe590fff0a13c713e2a5560f004381e26a43d5e3a45b23f9ed1efea0a7fe33e11f26029d5332a1580809dfc2ee1931000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007903acc964a1a9336749fabc7198c553b17862ca23e164fec931c2b85c0779cd91972cdd1f6e4dc04271cb32b3af476273cdcfb99f0a6752fc86da4e8d9beae023aac4a9cad9705fd0b17a7209c80f90e77946f856d86ef617451586b1b742762a1d30648b6f99f0fbdd0c22a67b7878bbd077814835c93adb45e991ec7ddf3e0213384332330bc1b33bb0b336e48f8c16ebac1330110668e99859b5aed5b0a53d0321b724208930be0ca87e2eba9dc6805b1161d0557a41a94fa60b2d49689462e60a0217606d7fc1cd6e97a4e2cb6b2843d252a7ca72dfb7b433f043cf8d1f47dd139bc177b40231d5eaa614a39b6da9428bad76db59bac229abe7b4af2172c8329d030a39a949e1367c08bcfb6761e19282d2fdc1b974596c3fd6b2d0c54194dbcccb0311042c2b79f902543e0b04fb1a465190869c432353b6d3b0aad502483c173616031f9bc93b7cb510404bfe488296426c0b92b240903dc8e04d761fb883eaa75b58031fd34cc44a1f1898c848d13df9d5cb127fe99d9ee4cc94421594c7fccbf18b240226cfbb111b9f5dc5e4c7e51cc4ef4a871acfa275a85350b2ba747d1ca044e5dba22f7238154832af3678d8bc22c7ce85ceb4b21c47999ed03777e2ca2978d9579fb14c5ae6430c2446558df72edb66ec583c2d62f6b4849f9ae8c080fdf72ccfe336fd9fa06bab827af16f8ece7d32e41c7448dd0734d40f2f7cfa321194c9025f45861f280d9c1183f4359a877d0f9b53d7368edfb53975168882ca4c4b5fde028a6e60ed8d3be1ac72a689a1b091c888274144798ec268d979f20dbc4447c36c53f9b7cd25b408b4f150c8b932538cc8a28319823b09dee3ec29e5bb18bbc8c44996e9035f18945e0f06e581bf242c73f913cf9932928fd8d91d72d2cd96a73e07cd9a25db850c403304bc0c572acefdeb3f68508144f75da9bb0c17c0940d745b798c35b7e467d57307fcddb09969fd89083d18a65d61f2f672e1395f85f2a718193f0bba0be9a50e5e7959d88299bc12e3fbb32f54aa8e72d05afa8064f9dcf20ee7adf23a1cac9a1f4560133c5686e7ea89bf063c382bf2406ce7c1f8c90d20df1b65a8776d159b44cc5f0ebe40f5cb816f2b9091fe68ac2e9fd286c4e75dca922a1f058339e46337ec06f4237a603d62c4ff0ad1523ed9a366c6ead5b277fb0ad82f4b6a108469859cf4909b71f7e4a95a6e638647950487847f45214fd31ce616f6272d86914eda5bce17b3943d8a88f951b396a0d2f01f85bf5c35e34aca06afef2a6d29e2f9cb989bfdf4b09b1e8cc76801427a453aef4faf1994e7d1008b8c2e53ac0696ece863418e19e149eda8a8caed3112e81f52d140627edab4a97744f0f0d7accb7a9d8178d6ac5ac04dc95254065589ec16cf19809145213f262573bc2f31a089ff3488672842ff92115faf5f1e32ba8165290ff3e9a6d1c44686ce15fbdd784a2e61f9ce265c882a25184e7493e1c5dd33a0b29415fb9974a991dda9894cd0a6737ccf8c5475515b3db778c52686b192ff2e1db7410d2cbc93b51b504e6a4b1ebc1fa60ee9c618ec1ebb15ed4723451c03ee56a1208412b0d3a58e9a43ded4179d4abdb18ceae7f5a4f9f54b840ec07afe04de39c7b4ddf712b7196e0c3d53a50ab5d704c571424b2b038d21f925191b4b39e072d3498ee6cdf3d924190b75d02adee722564dd68131af58017370c2bd8956a1ea72565a7f49e80f3499181ea96d18a9ba52166ee9db51139106b07b93e6f26cccbef338c61eea86ae97141056c8135a1a8d1a0a0dc31f7c04236e70be7e07c5a4500e21a5e42f0377639782266fdd2643b9ec52c426ede322bab7a1680bde70049bcd3709b4dd9d4bc296169476a42bae82628f80a8237ddfa363861553e60eea9060f7fe61023c22098b4b65a334bc34b80c0173e4e0a865685775b49723b5cf46af1c6d8fdae3de770a0a5e38e390446f98bcba11343e889598aa8c1317c7a91589ca56ab7151161858886ecfdc1d0ec0cb775bf593525c820d74b820655d7219c76a2e7e66b6a04375013add1143fa495a46b97034d5faa2b1456c4ffaec6d8f879addbc32e6f1dbf5f33b8f1dce169525428943b7697ad605273e895e35d1272ba1a4189d81530545b6b41ce73fac7d7b235f0a457b92d0d02f67c749f990a813c13031bbf531dbbb3b0d8fd7c738c720b2a502fd2eee5b09e4ca146995cb7799bc1866d00e0ea26995d12728ebbff43c70ccd4b569dbb7dd20c138c7e77097fb0ab72110c3e749ab3e38460553efd0ea78318fc31df6040000000000000000000000005cb12fcef9ee75dec43dc8a8a4bc1a90769e07ca650f8916d9d7ad7852bf6ee855ad2491940158668e67ab63fdd9156ab832410a603ca81a11a0fac8b7a3c038de2caac4e0cfd55e960426754afdc641a359f7dba3f57c0ca93047d9ee55b19d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cef7ff4780694733fcc5fb95c8cfac544701907f316a6c770c1b2e7fbea32420c1cbe4c4fa7ad89a330e377cda87b6f9b06320aa704dfd2d1c29078655f58ad99820cd2935bfd5918ee6d10f4fc3b919b70177ba54eff87920eba99c68157e30f4b7fef4b589b44bc0383dc936b88c554c932fdcf28adec2c3d36f7f8eb70d2b030cbaec0ff33a147af14d6599edb32a3d3c73d9cc79bc1fe5b62d96ea1781e70202235b505ce6b82c99010e6b469f14b0d80d6e9ac7398eb4f40f051c705fe07c9c0b015b650f80dff095cdc90f0365aa86e9b9a6907523805147f7610e3f2c69abcf66a9bc9a134b3f907f468cf5b5497dce0c11638ea2628b0a574435086e89802f0208f822d30a932d48fea406911b86c57ec4831ab5937d3925a438e6a0acdc0eb70310822f922d8e4abd1be98a939c0b2778e2178cb33c8570c6562f91df7e415b9c031350ff4a3789707dc5586d321a8986dee44d776caf51f68a6c22f36bc6b44d22030f3bcf00b2507e5dc5fef9479045522f4a5edd10b6eed54cd9a8c93c0c21755003234765b45d6bbd27748626380565d58d9f9bd7c635e453f78381af900f5862c8bc9bb736be67efbe85328fe11fabef987d7086c97788434b2cfdfa8f0b2b74bf1276f8b9165ce83371bdb1a4df9e101eae8af5149c4e10eb0057e65fea47c469abf97d3fbebfc2fddd9755c7aaf71abffa7b72da2ed0ddabff0dfecdc8f98a18c2788d6d0a008ab9a1d5db2f10b8625a61ec56764d0adda736ed377676a0616f6f2b9f653f468cb6e78a14ab3948deb03dfad2b69ae6edea7b26e7787c6dd334d7136dbeb3c8506887813cdbc9b01af9aa63d3911671f72a4e2543d1b707126236696dc2dfeb3b0992490e6e548cf8262777cb10b3920f77eda93c5dae8e9ea16143a9c548b1d28381522c5c60f7eb351cb1aec21c93aca13ddd26cf8f9485a5cbfdbb0a2c0cd6d758f8cd342b2325877d0234b1a8af745e17122821c970360c0c7d9ff1a4ec216bb44c5f0dc9db38a6eafc30640c77a58b8d4478d226cf53851f10091d02d411ace7d18b1b35d31b8c7998da9d35d0bd8dbbdeb5aba17221156669f9a0795297207a7e06ea8506f92cd9a880167327196819482efcaae67605f5f0d2276387ffa0180dd5bd16baee6809a90dab0cfc37bffe9d56e5362517d7c864c912b916439b8ead9d0ee023809632623b17be7c1fa906c586dea49b8c69becb24d151beb0b4943e661eac4d388ff26a762a535542fa075c4b2f5c952fa6136b33bf223daf7ab43c1317aa6ba6a19e39e86d9e0e3b9f28befbcaa2907cfa44cd640a4ea481e153a4dceab0c75327ca958e7bff22b29e13406e10b772c3c24d85629b0ef0645b292818a782b77de87c6dbe2ee2e7ab9c3d7a6daaa158bd6c62ef6e3802e61719273907f57c25abb54ea413878d283b1604a269bdd4f19a53ec2fa52195bbac4eeb57e225a8bfbd352cfd3a8770afa13611fa77b7f4e7b567dd28c638d792142bc6de90dd55f22b11a01e1de61992d8bb24b51c3c7a3d031fd36720b60d7c4f3738671e33c4827e57a8a612bee0ccce4a3e7f09ff756992e421551400f0e202e2ae85dadb6ce53f7c0472ab8af8e17e93428a783c9ed78fd8e7e5cbb15c8f04c28930add2bdf9c77f69e357e8b19bc1d69683a3118b47c5836e07e1227ac200874ffa61239762f21654da2ba4c64a5774e39e4331e8b54fdc28c5c67f4ed07fbdf0387ef9b516d9c56471bbc4c2fb88cf44f7abb170bf7dbd87b0945e2fc449d65eb57957b5de6864a99fa9f435fff515c02f135fa49249a3bb5bf4b50511a6ab7ca9b31e68ba8ce7f240e8557c5943409f736e3bc09d625f7f4f0a926f0309586b462651c0951821251440e9b3520e6482a2a5201e8a2f6fec1421255aa1773bd0f7d659bbb581eb902bc80d7e72bc98b531d79dd71dbe20c78297ad5326e06bca2a0aecd3915bec8457381abcde439c51fad7b7fcc6d4f577b6fded30f44e554f9e899ef5114422f9919da0fa6677a9e2898fd2de7800abd5c9e822164535a07caaf01871a9379f66b004738831378c865a36c1032af8cd6a96b3977e746dd5d9263515bb1c2a8eb37f64d29d28ad87ec77c86071627e7026afb5dab6edfe21e4ac35574ae9910a96af1980cb184851330bcaef33a74e90d966906e44b50d4d9ad04328bfcf74859223386c41034fdbcd1f37b733312db9e45c0254996cea103f3ad0b1a8834f3559bde8b0a3c23357c71e98aa228db04cedae89ddcebdff7d13dd4fc0838c643bd4b5000000000000000055ba4b0500000000e302f50a8f61648e7f70451ada98890ebe51193a413c5d44691e47cd7f15bf23396976e3b2b899458f7c2fbadab6beb485ff1b6e1b73eb7f73925bcec62cf00502139a34bceed94439e8504901cafe1d1779287cd4ef1d5dbe48f839b527132e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007bba3ba3f64cbe6e184701bb8bb4f41d3530e110b5d5fd2d609cf832eb318916c4d22ce267202d966b72bc48965662d54bd3938b88d76a2c861c7f81b6e97f599671117e55e882f363a6f505db0bb2710f839eed3f231dcb44861c97c3b6ac09fb80a09420826b5cceed910e1e0602bce900105899de7e4995139789fb15a7ef032ab2877f7dfc0d3baa623b1eb05b296954311354b79fb2eb5b2bb406b786b596031e7568d6daecc0112067e1eb9bf85b3c9ed845d9057c465b190cb74ccda772f70b05e34b987cb1feba39da555ba692f976a495253b0acb95624a6034441db9aeb78ef160c06c06c5bd7661fa30aeab6208cebc15ed00de3536b3b74b618425d46b020ae25ff2397e53ff0b8cb98716287f1444aff4a0a32c8d7b4a1802744f3b062f030f0b034777fa6ab350ca75487c204669e3977716913357540b9de46112c6f5e90306331fbf23680f573d247d91cc1bd45d74bc31497ea3cdc07dae5e12bb5043fe030bfc02d6098d34a6f47df727aca9d60a0699e6a8fb999380b13d9a3c93739848022feba834cee4386582db73791ebf1632e630556a33e5b836724926246d24a7c9a25934433978ae35d2c6875cebed5bfbd518c546ed239157376902bc2e7f2521dc12057f3d2e5dcfeaf9b0b4ec56ffe0ad049c13deda23791878a6bd13cee605dec49e87f98b98aef1caad0a2621899fe5f56e9962a1441ee70ccd10349a522fca89c6e557be3203a320c4077ec73d18f8659fca1e465c0ac55bae1fe066a90e0259228a7c25b28af206ba6be5541d6e73110f661b6e0250bdd60b915ba22b323d2fec3e4e223cf21bab54a66b8f9d24afebed03741e7bea9d494d2cfb60f6efcd26240b814f6ef796696d4f07ece38f8d6a9def0a6fc4550befd428e012efbf24b0f9218ca011b44433737305ca2059e88b46b3a4cb201abbd6ebabace2aaf46b04b5451aab27bb058c11e61f527a72a10c84d805e90d101d34af5cc7c3abb2056ec0e8a91c92529c565193da1f55bc0fefe573dc1ac85416366a971f127d14c4a3a6335c95a2f7aa7e5638bf6353e71d7fa6387132dbbe3033b0834fee6cafacb583030537291aba4c90cbfe3009156b9f639412934b80c57d9ae4fd46099fdcf755859ae957409501d0ef41d80f1a3cc05e0e8d471d3d5f7e08afc5f10eb3b093f965272899189246cbdd238b6a7b1e76eaac0d4f7b7e6e7329633d95f5574ab91a4296ebe326e55d92a062bc6b06df465b68604d95dac7e8e3670f4e8ae5e3c6498791667a97b0c79f49edfbb918c3d89f634cab25ec5733ab619e5e38673be7466db3d5298f0fe6bb2a3c772e1c136070328f8af6269db143c9dc63854a803558a1f26b36a8beee91b46429ff7fc9cd8a73e304de34b008b20c5969b123042424acdaf23a91eb2e5e4302e73c0dd81199df631f05215d54be9a5f0fffda2be8f1000b84d0c00f09843370f6d1b2be9582df3ee360f1f18212286d4794520d9c63c9323ca247ebf4e344cb08679aed1d470c323fbc9acdbd1469d8c97e3709ee0b62c5dde2446b61a5ab89ac0aa323a9650fb485a1a26b2d84df5bf5deb0e55aa0fc75a6b2bee3f885324e81b57be8e982f3132e51a10ace783d41961a8505958b26f26dbe7b361cb6b1eda82ca9bba7129d2d7dd45850bea79e675185bad660cc95d1aba16335ead227caa10bcbba1e6386f4aac96d0e4b310786b897741cd9169a4268d079db35e767d6ff51094d8a31c2e008ab25c9a0916fe5276fae06840eb8beca355c270a4ac4483c352dbf3023ea7d6789bdc112d0c7263943b9d4b33f647b31c0f7c95a3c311a09f015b2936deafcf4d3f967ac229f5a736f37e9d8e5449e837a5e4ebfd505925aa9b77eab27ff57d6670be85984d1f11138aae3ad1ef993f65ac5d969c8fb389291b43cab1e0252024c1928295cf4e5c162239bb10d12e87d3d539c6accbf30e880ab39386a31170e45bc32be2722f2576cad7325c011d09123b504e87519049c927b1f05c4cd1fc4b97e74bd2637208ea7692a4d5cdbb014e1eb5da84d945778843d9fef7af87872d07266b093c934e7f021d8b863a6cd48d010b2e7935f2750514feaf9af53e8db0f446e13f64e02bbba3465eebb5fd8441144f76e341bb6496d00c36772a6f60ee79dcbea4aea3b59829af2953081b412e015ec0a32f54c871a4243c80675f69e8d4ba6b6d061d52633caf4ffa36b853eb4853845aacf803258f26e04846d2858d88b24e3bce22d9f087b748b833f6be7ebb111bf54d5dabb20a2b2c066010f4a7aac6469ff264623b6ca691582118fbb624219c54388bf00017a845a4a50e998346a9dce817b3b9b595d93c72353aee12cc3849cbdb5dbd6b44bf98668f320d8ddad7bbde2e84e367da645b3865408044e3cbda2bdb4e2089d091e04", "6a5352ac00ac526365", 1, 289338202, "eccc3f08a2a31cb9ed876c92e213341f6dc4890e50a2e85d5ef5debaaebe650f"], + ["030000807082c4030305dd6a8f969983bab2ad591d67bfb74757d5931e5c5e2b9263d4f4a9e5b866fe030000000651ac53655200ffffffffca47fd64244e715e35be1d451f344391ee81ab68483efa0514d10fdfd3dcb3840000000003526a6ae3cb17375798d2f8bf1b6aff3e24d94eb7de8eadadac39458d0e19ddaca740341d2d4aa2000000000953ac6a510052525165ffffffff03600c5b0200000000016a2f5f6b02000000000700ac006a5152654e21af00000000000852525353535265630000000000000000020000000000000000a260eb01000000007fed2e7517c750655d2e3621663f859bd1e1f4d6b8e9c03ff0560443081ac0a106883f1992879f4d2a73777d63abaa532852660dad7fa1850840097ab3e6b13ef9a5f45154f413ff47673ec7d72fb3fef0a9e2c985fc40d93ccaeeb8c7b3a4df00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000896732b292b4c8c60d0c3b58299c1fa7853aa1b4d2390768a49b93ae0157ca1050b10f654c4cf7cc5afec6c97f713fb66c756d51005f0f4917c4929af0907b9a1d7a9c43d16c95d846135cd3afa0abbeae04999ac02c3264710cb6d818c6d4b3ba53e141761e066838863d0a3783b7e4342fa56f86b26dbaeeec5ccab6b10719021dbb5e51d1d3abf896f9792573a221b5a317f3134aa956a054d58937825e6923032fe1625fd4b24432d357657a852c07c1e21a88c3d183ae4f27c0c5546d369b400b05e471f8ab3131c9b8561953dfabeba4bbed1d0ce563590e41af8898e1ce58b132c636dba15338a51fe4de12fe4bb3491b262d8b8d612967102531ca3e7826170300ae6c39c23774345f33f4c282dd15ae6313c63708639a391b8d702c958759b8031f723f9417697821c5725f82fc1e92f782768e67471b262b1d238a523dd4cccf02237e434531d2bb4ee13489844f883aaf149c78f76dd7d8264a3e45f383834aec0316715b3b821556d5fc460773abef849dba7205fcb439558ce515f53f027d6f5002221771a2168554a751ea2db2d5f7bd78c3c409ef7362c93596145405e46f8bbfbcfb475d5edb9ec9be5d87dd0d169bfc1c9c740a9d55b64813051e71113b53646d3a4464ea14794a16cfa57ccc5739662370af0513b9e995a1b23df88391cd2b1ed6f9aa6defe578b01122428b572e51a1ff274223491d11795c6919482c931710b35b8ab63d39aa838a519a1814b52b65c9b2d99c9f0dd4eb2cbe67449ab5bbd73dfa732db80faa480e2b7e892f7eade0da9435714a99c721f97dacec2c01d132fa418eec503f1378e5ad4a566d7cfdb04aee85e910914735d95e371da5b2a722f11f151adcabb5d2b82c30982923d7a4abd83f8fd26511c38783f2122116e5b3e57975e2adc73b8da23d3447fe34d5ed40fabb109477669ae0f0743f68e41b5fa20d572e74c002ab276400826dbc5255a809628fdaa9dcbda533196e2c7f5c4e69d9125fb326cbafa718c6a54c2f462f23ca0aab69dad88767b1c616393f663d506b721f3cc88e73494ec12f40702c53a4b84ecba31fae9647df389725eb21d91836e0a7512c4227da6cf2b66ac62771ea2b5134a19da2c524e27dd593ee1c3c4bd4c56e003ffb330fcb39eb3fc0311e0f1700350c780411b46ea5a942fa251680520fcb391f66edeb5128e7482698b551248fd4b4c39d26c31d7f6a2a52ec6a678e5b0747bce7f909237b7f29a0c5038338c9307b051dabd35b3455f07872e3fd3881966b69f1a2e1bb5fb898ab0973a69fcdc1e94025ab473d0ac9a8596fd1cb0af93345ebb794fdde8c3708840c78e205598af669132b312813f7a80ec2dae5d7f7c06cace962f5d25418d8d93e3326ae2232caa50115708e16030a059d62a124b7325309cedf365d4e9f8c1ccbcab83194d501e82e9139089cee4178b692a14a5523d32809e10fbc32347709dd85f90235ee4e1858c99128b63999ed03e7b957125bc08fd7bb5758386f0ef3ed543a7fbd717ed3f99485125426527bf11303a8eb2b6bc6510234ed70eae91faa0ab8acd9c98d48ffccdcc971e5fbcb484c72a4cb4f83eb5e84d2e596d819feef3870d90be3a8f9688403ccc57e882650f8c5acc1748d19e31da6fa79521daa5625042c1ea36b2bbc6cab05b7599dc66ca7c63b6dd94c9800a927c1cec97cf206c3272df8683ff617c8c26aec94a2e745015672843e24c28995ed2913db2f8999c9dbde09ab9d0bc55861995ed9ff40c48977d966292dc6e0d516620b24ee7ed794729afdc609966c5645acc29032d9c0fe943737ab06898ef6217c9fa305e2ec13bfce4b35bfea4b1a705065542d72c5c8f8d0a2acad1ec056fdd7f7b4374aa3354cb49f9d9ab2aef827a5429da8dbfe9d2dd7dafdc4f96c23f0729cbea0e5e156cd497184273f49fa6a5cbd310fe47fab8813e19daf19e353c758757a0774b15d34f1a63a43a9f158f1ed4942cbda56b0cc80d19f6fd186070c58622d09146ba3bd0ff99d5b6b99d7b892cd41dcef385e25f27d495d09482db4a40d36b73f5af4d25aabc36f75759d5081755f749aaae6c2f83e04e1a0adc7d63b73eb0e6ec561159125f0a013a87381d5cadd6e80a21ef785c9fb6046114ba55c9436f0f40096ca7cd907193c5c15a96e9d9a80af27a9bcefbb5d573d8a2cb1a7fb2cf7622f2357b7d47c601473fa5bcca8f0b6fb75895ce4c89e6b5aebf2b52c5e1d1e8e0d0bbdf2472607dfbec37be08ebfd8a4d595516fef51573a287499dcead6619807db28d5d82c030000000000000000000000005cc571010a643df9eb297d04c43ec8a266df811f46d2f1e2232bde795e9ce451e28da2f63016de793b2cf99eaf374c4613dbea47d5bb8f8d7123f34ebe33531d25ea27ab7a97ff275743a4ae6edaedfa9c673f0844e33faec86000f4cfc9ab0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000467e72890966aeaf15774624ff7ba244eccfbabef59737577840c9f611a1539db81efce022e249a901caa8456cb17cf6851e7e35aade1eef98b5162e76aa0f463529b085edd4476eeda606bae4cfc3fe97be3f7c7ee623fc39f61fcd24a8f25410eaf18c70a92e6574b4dbb847184a0382637f1f3c77591e6d247dcdb157fe01030c206605560bb5d3cd63d2c179acd05a7ad7df91e4b0a4cae0fa25fabd7ba0060319c993840e8ccbefd4cc8d96e4f0ae936192d0bb12350a1e2acec97904b7803a0b03ca6eed28ec0ed7db843cb6e4a98297347886bece90baa19f006991e243f41a709c5b55450804433b99c6122f89f15ff2ccbb043daa78cdec72bd38ce707bb6030ad2b4e073ce8bef61e25d73753882f9990fefc61c5689678cc0d586521504bd0310d2a6c9c8971e52f5ba346680e45e2b06db0e809a05188717636b616c9c9df7032c69aecb1fd7070431ca6c117a68c12e7e1e45ea9c9929d6d6370c4519b5d4d0030f3f5c8b374c7f10e867ab1d98370b8b67708e656feb83f345d589f7dc244ac0030b472b0c4bc67f0820f59a32da2aac397856769fffa51f0b2f51a3b1d6446fb7693e6a87f76987066d406a201d76ae312baddf541fc81061488b75edd980dcdfc76846c1bb6f3e5b4f6ce0fd855f8219385006e5ba73730b824f1ce138d206c737ef59b29d70bbf3fd4e3476515a5a02ad37540c5a8e79dce37b990f193d075224566d5422e13bcdab9737462174423e703125f32b4634fafc6fb8669c4b255d78e210823532dcbf71fe7ee8a33b90b0c6bd38684e607290c8878bf78178179c7827e5b7ed52699dcc62598204778126905239587b797d4669ee0f906c96a267aeda6a3a9e0485a2fa2b3a40f5c44f168830cca3c9477d564bd6fdff4106556de65d02610c7e42bbdfa282eba0f16e063bc2c89ab4b4c64c47332a4bdf1510ab06dbf76cf392e058f367de58932e94272784cac2d9014122927903cfc23a415fabd3f6ac24487f3da93af01329204bcc0cf222e644ed65590dc4a59e3ad4ba8ad4810dcb9b495625b77bab2ca52f6fe1e3a0f9c0f04b6678ca767a6b57fc5b0ceffe958627e09e0fb46c4adae5801ce64ec6c7d866e38fd1e2803ed7fd7e708a485cc2c807d1977d1bb1ad6ab4e771d1589fd860169af34b9b575ff207dc90bb7c8e3d87528860e9ff0ed0f7fd35b38f65f120f500a63e9932a788bddd839ac10cfdca705e2618ca415a422aad6bda4fab0ad88672b4b0af2914eb71421c2e8697fbc59bba3a7e99c12023055712d370dde0953640848e1f62e374b59ee25bb489bc09359fc9f4c68049944439049cef87bd7109dbeca175d565f5221887a51397d182b063687e00872fff3cd7b0db87ae605f06445e5d5591693ce61f777b517127fd61a9ca79a2596f858e50c070a032f225a41290ee374e869d3376b661dd435a74de4b7938b6169c171fabad3b2e558209dc59c1959f1b2619be32a37bf954677c07ca58030399ff18ad46e6c99182ef72e39fc01d8b499a4fd9414ace8c394dc957611939ddeca044f6c4428f240436b2f5637556403c3fca7e9ca4756363a49ecfea51861acf701ff6acc2768d72c26ce5a46e5af15e9281a4b48f5c9692a61a74154d31e2a2b1773fab28af3212a548850954f13820f705f3348f6ad65fa0d8a8fa2b9b622e27772984d42ac2640324eece6d752f1ecc77f4308995c89a9f853792abab9037a640c6daefb501aeadc76c0a5ab25083cd1c7148d5c0d54d4c9a82fd2cbfe6f10f2e2d3ec8eedee85f021f1442d5161ef1982d7d63117fd8e2606b70350dfa301a32624035736698f2221e9b76ec591141ca89be49243dfaab8113b0aa58b90d529a2105e80673956f9afbc676c7cde9311bf1f8a913b7d479cd5f620fc80d57e9426cee9c7b8a0817ecb304f66ab77e4d60ae81f5942398e1025554ae6bdceae1ee5936696fe3f4debadbed9f4ff2b4d6c973c1f840b4afaf25d0c1a126549d9846984fcc51914d3544a2af3eb9189d709f1498073588ca39500a0f43959ccadacfb4d09e1491331addbadc6213d7df5a81c503c3acc2b8048ebbaab8fbedfb9089197474200880fc3892ba122a8fb87730d33327b700d97f8d87eab66e4abc679db9279f81abcf8c6ab492613926ea443e2d65fe8fe15adbb9823a7f9e50620bc9ccdc19bd9a981e0b685af79a617b8e129670c704fc059c6fbec31bf6f357ac7769cf1ff9c9e3e1d93eee629191f06f80350d8c7e2a76ef8336d6441714b661466985095c5eece24b1862c2b6746613dde5917d307131438a5ca002b2171eda4a091a8d6e9b586371243be691c4112b02ce26d9f979d2b50bc0274fe54fa5e7eef13952749ba1b25eaa6cfed0edcfc75606721d5e72e90f5d8855c6916b5fa119273fb376b9a60c", "ac52acac5265ac65", 1, -1596436324, "1fbe212f95169c0243b7c0c308fbe9490d73e29a15bded4c91fe23d0571f7332"], + ["a7c8436a02992d6fab1cd5f8261c512e7f00b0c8f8a5c7eb7578ecdbd22340add55602632c020000000365ac51ffffffff1588203354bb3b1aa6e01fb1baa157f157dd1169ba0ff87f680401d43a57b1fa0200000002ac00de9e05ba033dbe3805000000000963510053006a6a535211270e0100000000036353515ad4850000000000096a6a526a53630052630000000001000000000000000089dfef0100000000ee82864f250722496a42158b7869183ced0fe5d6d2bb6fce161103510a919d5e881790f3d9ee3392ea70341957d9aaa833822ac88ec763d8915cbc50a52229373ee99413a2f3fe7d9c5b1250c864a865573eb4c5b8b8dc715f3d0b3348cec7950000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015bf8027edcbd76e7b201ad71283ac35ff2b631d0f284009f9ccec422af1d4fffafe304264711ca706090fc3ffc56e9e64cfaa9903d980495168ff73e85fe362c5324e1a099a708bfe3f77d8e3c69b8e481deed2e40f0d9ea0d73faeb1fbb40a30724374ce6d99dee7de44b34eb9fca3245343b8427293c384262d5659f264690202f23dfee5996c360f27458a71d44ed10477cf635b078e852cddf7ad9b0842c0022fdaff64e3460f278ae24cb5081e52df73fad4cd1d7d806736405063510177460a00f9aeb9f7fb958be590a24efe7a85551c14cd90230f5b9d146d501e29720f9586a390d87c7f17717a699c786dcd8e47dad2227656d11ad50cb91c2690801ac80208feae5ea579a446a9110cf1bf94b2f396c3bd3f88a41e6d420c582afc1b6021032c112e07f74814f9c43c7043a669b2bb9929c05855c2138b7963cb398c3f315e021f20e9be1b474d9d1001776b3eda3d321eba368ddf2b0e3af7519a6655cdccf10202683d27be9c7a4e626b357fefe57e0f2a665fa232b6ab67c418832b29fcaf9f0209cead8b8a77116fb7a70ea9695c797b76321b4193057c2fa1f889b49daf7fdeb0ee8cc9727d681dfc0fd24f2135cb560ba7f2cf156726d7ecdcd1e4fb12f080793456b44a0773f8692cd0f4db9a17d94bc71ec2ee12898d7b091efe8b4364d3bcc2dee5d08647afd91b32c0a4e44eae3f2a7cfb8473ce892b132565d77d1f6fb33918f9ca7412085fb846f883c534247da2faeea78495fea9ca1301b6fff443604ce11bce151266e2e8a8eba76f3dcd522803b1a9f334aca58876a5756a52eaef088491e5313d58229b024701002c509084b81de9302b40ac4285f44ef56cdc74ecdcca5511a3ed2423595d9a9d2d8edb70215d2dd2b8d3438e4a93e90675d69ca023da5bfa000e592b869c4c5c8ae02e4f546e75587b3e42b9c482702d40e3dfb93b36de41a5e8c79782449f47b9507e20ff78f2925cd50f13443d6c83ba977a37b0cce28047368788b205c20a6ae1623bc0eacb327f95d2422e30695b776b508de03092fa5e3cf2c5715dfa75288a23fa2013c1a72e40784f70c54670ff206e1dc540c128b3ccffee36dfdeb242cc8236c7f04f592b1901e5acf91c51e873f07be8fa072fbe0342bd8732f6f5bff3e373e4b7a6c4d7a6fb5b7d6909ec85c3b53202ec6d697430d569bf5d095b1212bac39f972e83193fc55ab58e65f542d62d19e5cdfcb7058440001ee80d2086e2edf4f91dac2d6fcb273609827de57cf493d6bb63a6924db0daf213246ab7bdd637f339dadd2988c1694c0732f31ef844d96efde38393933075242f60f623d21d158be83266260b00bbcc5efbfaa325cf952aa0dfb6947abe91aecfb8c4ad6e5c7afd89d93c2993d74ff72e9b4f7ff91b93b3d16fd5c3f86fb6183ab32786dfad9384790c9530695ee4f022c606c6d0ff3f9f6db24204cf1fc933b66bb409176b17e4ca24f088bbf6465b054b091ba9eb1de77a38e827a99e0cb5fe153b970563d6786de9cffe650045d2e882a3fca81b3e2b07f0b330895650092ab51a139dfe0b2cdc4f41754f114390c15970026651d04368f78f914e7b31086b9821a8a4f2f9cacb1ce4669237bdfd811fae6bac4e36750f6324818460858d8db8ab3a20ca8aea8c96c03f67f4415392ec64472ec1b11a5f3d2d57c0c2e90a73ac36834086ebbc7ce0acec62b45a6be604d345c847ea81fdbb6dbd128de6d508597d49b8b19f511b0f2ab7698d20747d6be13bcc3f09fb387cdb6612db2b35bce825b4289c12d018688393c015e083b4085c96b5ca73262a8dbbcd8b44e959cd67c11ae2a23b1dcf3aa1c9738bbb85161223b895bd8182fba1b68a7291ce7136c23bd611233fb2497315ee44a1df57122443d16afbbc0de132cf4641333d985c77fc9d8b3918492885b888152c79ae136bca22a7afb4cb3b8dc881de6a9d456a6533ae57a1a949586c8f2f71302eab55e318171d89e8188575bfff982f84d1ba2ab575c618b0c861445fc1663d371d4c2838865e4be8b282d9536c10de2d458747f760350d2df783218aca2dd558b2a95f07e0c361f886ee3d3b52dee4433cd21fe99cc86e42ba034b9688826d23895c7e9a76c1f81f5d52cf053e43c21aaca01abc0036dc0dc229109a47ce6648041650ac0e9fdffc5751d6f1def2526ce4d66da93736e8c56119961c3e57705f536ff6ed2d18deb67142b72e5694703e7376a4533af7aa69a108adbaf9cbbad72f908ab528a0f7f4341159a0d683fd9b0319fb1d6718860aa746ef3141adfbbfbe7aff4876d4fe581f729a159682bbc0cd87f0cc4bf8f77803ceda30bd297185637a9261dc71c2be82d99226402ea2d944d31f81bab6f14ff5d6470457ec46ac31ffe0db794f9147a71d57aea003f72313934b5dc389d1b702", "ac52ac65655151", 1, 362522668, "1494ff68ab98f1a1dfaed41a593904c88eebc4f8048a8e2723c3ec4d8122f02a"], + ["794ca12304db39fcce90272e4cad12646a6125e6ca77391a853d0f26b328c014c4c125148601000000055251526353ffffffff4f408c5168b5dfe807d64e2a6e6d282993c64583100c18e72b3df3606ecb87c8020000000352ac51f75e238df1164d027303c3843116f10c3a7d323e20c6efd0558fd7123d0fdae0797bb382010000000152a39431d40d679d4eecb8caef717a1c921a3dc4cbd7bd18f770a1feda8cc465afe062e136020000000853516563510063acffffffff0230af76050000000003005151216c64050000000004656a006a0000000000", "53ac0052ac6a", 0, -1748581836, "5553d3d6fa42a7373fd8b30975e8adbc28f2156881038ba70c360b908a1dc90e"], + ["0d58d55501012984351891376496e88fe8d7d4cea8462eaf61cd12f2c6cfb1b731e4bd0ec0000000000652ac510053acffffffff03201000050000000004516300639e1f790000000000006917eb05000000000000000000025c2be300000000000000000000000000debce5241ebb30fcc386e41fbfa84015328afc9c7c922e43e2044c2275880dbca43fa87c1e497f69ad0e93c3449917a250beaa2979072e9bcad19e301ec9ae217628c9e21106ad2ed60ff73c4fee0e63a371f81e9eeb4dc026f33a12c7fd090b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ff90436deaf5fc68b61f54ee30e249171ae5fd10ef17ec24f8427f2432df7c1a246918ee793d9e6a0047bfca99b79079346177c810244543c257ea5da445d299edcaea244cd46d703dbb6200bbfc43ce89f318e0f72a8e2636880d35ca637b49a49c374b39601a87d0ce2bff141281477f748fd1984a229a9453eb512681eab0211e052d8148ff998edb2355557f039614ad57e15882784d976a14e084277c9990318320a4aa589eaf68855bc61d9dcc82e1dd0f827db309bf8a4d6836d6f773d9f0a03dc3e2b0764efd89c654d77f868962a0f5c3f76edcc79ba3b8109c0e280415f9e893afb36ef6183dbaf6336578f1077be7e9de3568c5729ee10d2f873b9dd4d03132b26f92c25ca34d2b2547f39111e10851bbcc8d95c8e529a99e6d5fbe2b0000207262845c2edae0638c4e76d8f438e63d270bfeb0fe4d7fa53a5db192c9607ea0311814056aadff1d695de554e6fa59c38fb1323c314b37cf16310c35e4cfc358a0217e80e7b1b65eef7021ea82de526124d462f1163d088c5f3215966a895e6db19031f0e008ea3214d62fdb820591ed3c4f02a1cff65a1d9dccf4afc2a1396ead86661d0773247777b835de40960f0a9b245c2c0f268454d83651f1083d32c357b0d4b674e2db1383e7360086f2314c21ec045d2d5cb579237ed2c71b80c4723166f1c18e2a12cf61438f49b626f0e299dfc33d6beb52013058ecb4057343026f58c342e136f8539d81535128e14741736fa48bd0c58cbdc4a4c2b1cd5269d254d661ac5d086986c78f7e9e64fd278be00112e319cadfa854dc1ef62a9b174809343dde174d2ee8e99bee7718f721a74d714048c1e6b2a312e81315ee51845265df2cd451d8a16bfbcfd483027139d8a67bf9311ef1ab276d8878cdc0b9d2fadc00a084e5ab342463d739fb96f82acae43d4b33b34595ae09a5b0597031d661120651758921c98e5b991088de998d9091ae2d8707367abdd4d59acd3ca7b23ed7ea585ebb5a40c0d5c238fb38bf1304809f33eae4d77aebd3296ab5140cbc04c2d7256a1efb7cfd6bc5128008f6f058a65a6b37f74d51030310c94540064d47e893bf42e3b69bfb8cc9caf34e44a228c114731067d13d98e8962f5e1011454c9557af9e6de72b37057a8186287cd9a48ca1997614088288ce9eece5077b14910fd297d62723d96b4211af149ca3d878481df5a1d4b74e66dd46dc6e6f73d566e8df1ff9762b18ba866b7b4dc2b2a9b122672e2fb2ec13b46147abad5caefd619c75857fe7c4294a66398dc6807361a650c84d34c85db6a9aeeca12a4be3770297a95213a2b2f3a3be8103f1e374fc589d5a568d4ab18e4effe75d222d3105fe55ecadc681dcb7f8fd3e19c2fc93cfaa3516be89edb660a7eb9badc2e5cde9430f2c1e38793e50ee9328d4f13b2489691f90bc11a4098ab2f82bad6d2846ebaa051ceacfd4e03d7457ced9a37c1a2d7b4336332ac8396000aa6c57ed04b0d846e70607b8161adaf7a19ad2fc7fe25adf765bcf251fbb7173cd635436330d80aa1bcf2c75936f1c76a9c1c533b2e574d63397c3a224b1b9fc634771e6d33bbeed8a60d8e5dd6cdc0e1e131c490b6a50d1c528557d88d684456bf2461fe09e0d0f1240e5a2f408c486edc93abf5a2a8c42b8c1e09f2e146a4508ea5be94e1745a58d826a40e8ff8c00df0b7fb9591a5ddcac680be02bb3906f3da61eab5736de29ec536f7e0aaa432278cc75de2b40916477e3b9fec0558d9419d323ad0b241625f2766007a9308fb5a3fa6a117cb4b4500ab0374d8dffd802b4f3c58bcbb6de944c4bf6f4804f11c47f592446fe73d1538008ad03eaf2ed64cbe43fac19d0b3426c03f5abacd1cf5f0eda67bb54661eca3567d2aae0d6eb9d897b9e27de6cb24f19a373fe8ba764b93e9a82e56f22b89b632d2d642b84742dd95dc3c7287cf0dc7a2040f5550c858de924f1654f9fcffb928642a32cfeb59765ba165aa315375947ab5b8e4fea78d97d3910830895efdbad6891e443954cb20ad8ab4721a1c98f9974c485762088f968a23f9586a62f770f6e38446726f58e6dcb5ec48c0d85cf648c0b3614a7d048fd5548c635df63bddc476194a8a16c6b07f832b5378579f9bc63fc3ed0dfbf90f7749a75fea62da68495f85f4b9cdc7e5d58fa78b7c393ee2d4b4ef75abc458bb87d0ffea5ce1eb4a644934c24aa06252a7121fdb6de684c197f5b79c57d88bade9180cfcc66f7464503c212597d56398f03ddd23f4f5fe481bb11a45abb3ccb875ca847d4aec781cfc0b9b410000000000000000e1b9560200000000b4be56e244715bb07a683c7de7e4482440d035691a081c0eaca3993cb2637195caa7f34a34969d6975e2166cb7bf8b2df92a919e78063b94ab83ee4f78c26d959a8444617b7a1ca8008a6ffc300dd9d816fdde2c6443fedcf51f387ada9b17bf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005d7720ca1f44c2ec698013ddb9fb79dd0839adc24143a33870e39a2a368d74f4ce199c12807a79caaaa4697d0c6e7f64d14e0c1e2b59f608797e5db0fb2e1f756d5a1900bbdecf378a9f72d825910043480495db8579a37dc7a3a2c4c2ab754d944de1e106bcbbf81e855a053f5994a1145328351b02a1bdb09c41c1f597339f031282f1a469da6103cfa8a628fe5c94bfc32729a2cf16efdd6aeeebab88edd674032cf31233f075f8b7a8be9d1432ffba92652a539027bf81029a52618320aca7330a0679d7e4cdc915ed6c4f7eede749824ee3fafdc1e9ca2cff2e556f3eeb61859e63fca7d5a2288e278eefe8944aab077067bc841b6395f49116bb26ce873c41ba0222fa96e76497233d076bd639ed5e8b9e1ea741951bf98691f6b9f53910d510be032ad505a8d89f7b2b37719e7fc95bbb834046faeef9c190fe2d9c050ccf54db88022a4cc3512ac9b796a3de2070c7acc65ee229e32d6db2ef45f051bbf93ae4683b031101c98d7ef5202c0887ea38c3a7cc2da9a0d19c10639bdcfbc4f7bf353503a60216adbab575d86259781a3db0e357b159216b2f4169ffc263fa748fd82d7e323c13bb81c5b3fdd3eeb9dd6558f8b2bb386409b9042cb3286d7951505cf107c35443fadd041ea3e8be54f8ae083d1b4b2502f79e5f8e3200899e3067712e678205d17cbdea9eece7b8c133aa8af23073d6753119ace685b494412051b5043191d0ba1d1ae5835609bc276ad5a460583d82f428d55db9d62a6c4ac88eb0bc485f76088d0e834d6d9779eb71e6774e49b55e9fff339863faab70e2b95f5cd1f1366ffed525ca5a109959aa32f607f900cc00de49bd9a4f974f66bf844263c98dbf68e51c16b2ca296524d88bf7612de9a9d5b6e47d4b5b52a3b731616bc396d695fe19242326ef5cf8b27f12068371d649beff8c6448d9dad53933564561c101e72e784582efa5fb7397f660b27eafffdbd9754ee68891d2796a9e0d4e616f485ffe681751443dcc2e57580576667753ca43860af61a6f2e32631a1732d388e59b39291a5bad97adab5d702d6ddeb5d59059d66237a20654e9bfb9b06a394674cbd92e9beded6b220ddad62eefff484cfff4ad8104ac6c4c3fcfeba346904b7010426987469ac06ec094363086b908812572de154562e9fdef5e13d5d7176efdd9c1e89d3a11e2d0e64ef0ceca580d7fdd10f2112331e560ee66648ece24ef854729ce620045efc0c774098fe7e9e40d9895dfa208b184266ffc366293ef4457b958816d2a98e53484081dfb7400adc198e531f888d180aa1912c9a73c9b1e231f05e8aab5d48ad7dc802b4ab71945cf943bf5d46a6f8d867ee90ae0d87f3c7396736160bbeba30f18e9c8c0809fe7548db39f044ad9ea11115b57cbb328e0bfc73fde21c036605a6dec8ffaa2d32142bba83bc493307aa28ec7fab4bd871102a65e22260f1c9a26215ea020c5c0fdae8758dc6f452d605026379603feeea796aa7f516b03fa3d30c3d096aaaa14afe98b43a0c6d5929970c99eb7a6632b6bc4475c48dea03c91d5a3412efce6603480d85be61ec2f0ff15b35e4481fe3b57c1689e61c1d135671f0b9736042823ccaf6d1f785602c9f9d7c47f007e83465179b09010d841f5b9e014fb7f5d105896148275a26bfbd8ef22c2aa350e1fef1533ae8f1e89e916a59ab230d547e32ab883b845f0bbf51c9a041c029472f4938d91e592d0d84370668f5537f77b4c0bf90d74d5006c7e56c3f45b7201c71aa2e186cb4fbe627f776c7d715d3b9bb7407c8ea475cdee9667d168d4991de715037d108685386ba7e10596abf18deec13e3dfa74fbb06cca18122fe108a2e0446ba44d91a0a58d8ca12e3b3cd0420d8db19df5c165ec3ad8e45769d229d2581891019471f05b71aabc4100940813de9f2549958685809b74b33333283cbb22cafb56c57c7b19a45e03e178b06804f600529b9c9397670b1d8835ff59a807505582141fbc8eb5f8aaf5fcebf8ebb15293a396a118e26993ab9b905f5927d0993c0358c7485603e547963aa85fa711435e3bd9d2abf78af2d703c42843875d0e6ca9c5e30832b826522036040b0313e82df80c9ee89e30288dd0a5b3a04e0937ffc5973c57e093b2520c24c2fe666be66a8272847d177deab5faff2f1f38c58341e61ec568ba87a1005a79de686d443c937ae2fd684c28539bba9cd9074f55e26c1e4a69ea5c3ea432c8dd6f61065814c6da06fa8e77423f83ace464a5b45be31923bc6635faa48a0a56c9bd6f50e5895af7fb88e68c0043480867089f90418499c560c93c20ac6303969766234b52dc0564ed403c7ee3e023562f1a3d5227a12c4a62cc8e1a747eec44d8137ccf7d52aa12814d171cbe422b3f783ca425a66723835eb8b0b8415a65f2352e891125b7dac581acfc302f06", "5252526a", 0, 1829185311, "f244edf8fcfe38a887a8348cf689cdc8c5f4a516f45403fbbf9d9c3888b82807"], + ["030000807082c4030478b9b915d2f6c9374764ec47ee1c653f64d31127c4e3dbb7fade5356271102e70200000005510052006affffffff3753241d34ca06ab0d1c25f33b2293c39d831f8c160d57471184d1ffc976363e02000000095251ac53636365636affffffffd8a5bb623c152d205fd5818f548fda39ac814f22deaf7473d96dbb719ef91bd40200000006636a00ac5153ffffffff37c28f8ed42658af7c8c3bb10f7a5655e6a311ccbd9f518c911b3e4feccb2d240100000006acac6aacac51ffffffff01386dc4050000000003536352000000000000000003e58699030000000000000000000000008eed3383f4ca0df91fbb473e76d923fd671ad8f0b8084982c5eb43249c80752fca89eb68cca4b83bf2a9a59abe52a6bc7ff0319afab73ae53bb3377893ae403d246ee2a04069c5fbacfd8c034673e9e8ae38453fe2aedf08b0ffeed0cf6061e200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bec8cad5133e947030ffc6a36ccce34c83be2ac15daaaa9386a57535ad04f9dca9f2b00144aea4c34bbcbb9cca145f3642630dea1d2fc742d0c207da8b4651304ed7d8d129503f7c387f7c192f25e088c4e75865574239b8771b91296499dec85cbe969a1ace117019589f8e24c30f010b40be8142cea2a21c52831926e215140302bccddc9f6f795318484a21daa84a37f67e344a6c79329eef4d3ccf254c7e71020391acfd60e14f5268b2943dfd51496bfaa60a68f7cb95e18c3a30a42033ebba0a0581fb4e4c0795abb7dc071c4494fc0e9968624a388a44e59934883bacd9bcd9a3e642baeb40d37a560fa2661f9ea8f310edfe63eab3b2e11fa3667a74b872fc0225f1255b40dbcd9f7cb085ad2265f259fedcc764d751f7a4188e88367abb4548030df82b701bbd07a46e2c11d7f0a5737d3b2d1007da9a637acf3cb0985d907f29031c893a3e9e34781cab1cb1b3543e93dfec083036973f508816432e7e7389b642030f53e632544723573db5e59f201b2aa195fdb5a07ab2bd54bce9b87cbde931410302bd69f175160a9c2a9f0fa47e329408acc47325db294deb50b1473dbd35146e2c2a605d237974ec81e077412d8b2ad0f9cb0fd324fde524884dac921a9c522e3f69d52268f36c50dbadef2619f914fc6c6f448c7b0efad436bb9cddc44f83497815554bea3172ba0916e24510d2712003f08aeae03b5c273603a1f8b3103ad3388a732a9030d7f97e7708149c01f4514b55afbfe6a1758c6dafdf3b6e29ba79dbc5fe207a3f697ba3063f38ed98d5e7788d88b8fad1a0f910857edcb08ee89d9eefe84b196b70152a95d78bef630587081b008d954a35ae4ed47b44107ed11ab7ce0d4a7885b6fdcf16f840a3b6e55cc599dee8ab79e0c02dde9821a960f098aeccac4bfa822279c9c87a0919a6c0354b2246afaf01b88b2d0ffb25976c32e0e9254c92c48ecc3e989c05f8dae6b70b592c28479e91d75b78ecd321920de15ce4b9debe0ed7ba56a70c67b1e79a0094f193e56acf70698ec26e207139225b5da328d0c44ce93a6ad377bc527ed9a1fb6da56475a1332714a77e0b09053162b02510026a7d37906059424f65880a6b6fa47abf472aadfc969fa3f9fa1837154e5db96dbe91b8f7010232ce3cf7f45fd28e88ced1d7ff3b87a01ee365c6beedb6e25a66db2eae5f2e8b636d6de38ed1fde90b7ec54fd85b2edff906874e65a20a6ff59fb6e54b1543466eba0b3738afd44a1b8bb5d041415e11b724a32b886447e4df1c45ec4f243e6d1ca7e604fc8946ee192fe2312531847ec7e120016970298c01724a5f09211746d001bd90340bbadc1adcde07c12b67e2bb1d544209e62e6a8112f495f7884c01bce2d61c7f7212bfaf8a45f4c7f0a08cfb35bae5b02867bd0dbf44b2b6edfb9a0432802a0762f9fc1dce8604d2311140625a5b05451d7b91f322d91454caa867b7a426ee0ae632e6cbf16db24a74f9e65853c3d98fa142d3ef82ea8ad8e235f20c946a38724dac8e8c7d4e66e5783aeb9ffacb1eba4c79a82908edcb43a9193e91fb654688fa1c72c18a87dc5c39c3be1219184d0e70f4443890f465ac4cf4a915afb68cabba6b21dbb3855a525d3039269645bfaafa7372cfacdfcfd301b9ef3bf7c9e999ad8175559a8f0e0f4e2c94b238909f20180ae84f19674868ed4af7662c2ec59ade922c82b1a3752b22299530091ee5b0bae424243cc6413ee19b69c9c4bd868626a24bb9752573dc7b6e15e86fe2c7078284515ce041e112f1962d284f80ac9e7139ea51c52f84d84050064925e659c223d587050a7ee010bdbf33953db29549518ffe624b5840411f712c6d5dbca89854e6a9226199958a7c7677f1066fdf24e25fdb367fe076a51aad7733ef834fecaa58e138aff27b179765d22b59a80497030e257b9a5eba880c8273159708b569a56a93f154105feb49247b5f1d5c1ead2c8596481c07413e742ae9b87db35741015098c96c0208750e4f795d14b58ec5494098c34410fb639b4cb078c667961c2d184a939589817ec9ccdc53e33b89611907b86018568b75dcde34336d4d740de991205a6b581d39a5ce4e16d3cbddf2c78762d3a71765dbec4982935621353d44ee4f9d4d7f14e3c936f5db32ea606a067131d1e58e2f066e6ae442ae4f9f14d13cf2f1e1deb5ff73167f6749f7332492d48d58ed7858c0f3bb153be4f2b01c4f9fdfc46db84c907eb8d50a907b0c835a25f1378c79e68e365022793e841396c7b16fe39a0b93e99346c11b9ed0b1d9b7d88d9500000000000000008e8fbf0300000000502676225c4ca62fc411449c0b208c2a67d834aabb89e4c2591a8fd1df3419982893612fe5543a2e77b4e11a57a00581176314d9e2c5f7a5ad12c5be08e39e76a92897eefd2e91b31c8196e8d4edb7b5f5d8140da39d7ed3be1264fbd791b3a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000829de1628311ca8fd453d81331a9269afac03135bd2a80923a6fee26c1ca43b8d90cfb9e1be614b8d3fc3cef2553a6e82631d19f7c699fa040f40147c915900600715714620e4086d3b8563122413fe4372bd4e5029d05cd059eb895100c004f7b3f634acba4ca58752cfbfb891e7b06e3f70767676e7959243e2322dc217da402263d362879300536cee59f1c1865271b78edc86315dd455f91f7b3ce824b14750323b8166eb96fed2c5ef9f1490e50f5c5a922159c64a53db32c762695d65431320a038ce354452b9c9fe493d22db4e9bed154084ea7ff96bd9d1936486531d635f7c01756a3fe60637e98f225564e670c3eacfc2f039dea3b0accdb509362f5f2ad02042babd86400ed9e3579f3e896cb263136a0ee6b90cd3c64cfd9aca0dcb7d7d1031493aad6ac1d5e1cb3c086c1946285a1fb9cf2c00751466a54ca0a3dbc280744020dbeb2b3f440d47bbcba6034c1caf776cd2748696dfe3de00ac321e67e56fa510319307310814e507e9090ba130b9cfaaec1695f175447fbc0e51d2e120c050abd0302da241a15b5d61fddb400ef7f01dd74ba59f5788ab41fa467b23afcd24e0ae12fdb54dd544f249fd611c3e93feafde3d4cb7e5672b8527dcbe1c0b30b849133f38a8114a703f95fa54819127cf71bee73b735aadce213cce99f172726f7bb0e681663a23e35782e9d46a190c31690646d73dccc356bcf651af72ef87e28c71b2e06bca4baa3c3462776b39dda3c267cfd19121230ae436e30cc64f20f629fb5a6e6b74c6bd5b063a07995d78b4131e576382da015dfa72df8746ae38b5b706e2a5cbc64c0355b9292cd83e1d0fb1e2d16afaf6c1eec2a22e02153af1e841ce1b3a31303c489a2f7bd68ba7507baca314662f95b333c5fc2b0bffb17f9d57fc4c1e140c4fe29a291277c57ae180b689a7e0205c61992c59e5159a904e626d32b84ff260337ceacadd04c0521a5ca18287bd0f936e4f488e7031a7071ee5b609fcbdbfa6f6f14be1385c23a30a7ca2d10ea61af115021ca6ce961d9d262042c70f6b08c89eb3f12729f1827d076714f6fef4d84bd11ce556452795fe6cfc52db1855ba4c29eb42e7f1de425e8311d711a74e6f2b8ed99d1cfc316e85d23e76b90929da7d86164ddacd5b294ffe2d99d6733f460e77c97bcc6e7334846af6a21aab1ad5e49a18508461f1877f3886e341eccee4665d5f7fd4a2e32e606a0b9c0e68760cea88b73d13a6c40cdb6a72c7f6cf397ce96d4c2face68a4bec62a4fb6412a0ffdc87e279a81f707f1c459123c24fd43abbb8172b5af0fa5ad02d358333ee7a243b7967330d228772fcee4c2d1cb7c10a8d8e0812fb4591eb8a8f34d1f8a5d86fe0e8390af71d6a9ed1ad5fdffe0e73051e83d7b13596c7e089172b19f083f87d0ef62fd6956eee8b07e3f0f91e4cc7374d5802edef3b7d99da3d796660d1c0e57fca91735ea0d7d405b8ffc450f06705be1ee9418d6177b482219c4e10f9ab56ec2891220bda4e41c8cb6d2f516a657dd05e622f741521fdbedd13d68a2b26d61db38e6a7e4a397da10fba17621d8adeb82bb352e17f9ac45702befe343122683b9c17291fb0e76965a0d8bd6564afa56eda34ffa986451cc3ac6dd7199106bb289c35838feeea166bad04faef4eb0c30a5dee817f8a9d84cf32039f3aaa42f0a441d72a9f99ba09483be6a947182ca3d95f2027284ac3edc0bcb8de65b5966bfb963e8ff899a1c42beb9f9004f28eeaecaca261e2534239f4b9d40fbf3b7fedd8a08e692d733ea09a259706c95bfa361617a415813bab7a96af6e9ac56489e2508f27d918295feb96aa7e0efa135815366e3bf3a30537e6eb961946947ba4437217e2b708baede6844cd2db8db4f8e18cb0b2941fd724cb56931d243d1163120d4d6a48177c82b7fb0f5a7bdec246dcab1fb47a10cb5ee60bc1689e6d0b9c752638fb3cc1a5696ea980c83c99f8ba291cbf024cdb0b2c5fb0a1d053c5334f63866325e721a18979b1615df60d1376d0810fe1edb6b59c38c0e029848f13d8a0e2f2b7f7ca584171b9f47dc5dd9323f33faaebd408c2f197f2ae8316cb6fb62b8b5149cf7f2ae5923bfa17662df1598d9a22df937e206bbaa3a374a3a32a60118b78f560e9cc9272e69847f471319c5299b98c8501655d7204996c5787c95ae1c81076a99bce2084a4f74b08419e51893b03436351d0099a2b98d616e1f08e94639c11c73e8054ec406eddb4cb9123b2e04aac51c06fdd10ec64a09cbf9668e37b49108ba0e1425c132c39db11e7cb700000000000000005e4654010000000064e6a4740e4729d866716a65785058348ea8018eae47f57a32b288ceb0ddb069721122d1908ec7cc14f02ee3639bc626748b103b6aed8eed89627786515c821b8cadd043ace2179a9440d811a419e8cb79e4e3090a542ea616328a911a2bd6e600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f41d4e1706e9edd736ef5d1c8d4aad9a74b5d27f98b08e5802f6eaad37288df394457b24bf986bfc930edb0cbaed9a8aba1b0966d1e69710ff0d0104d4b84751821b467ec933dbfd2117798d74b8a06e38ae223e7f9f16369e2621fcb9a4e93909e7cd41ef7fa2a3eff7906a26edc9d31173d8b255c1142249042c21f9a59a2203165e088b54e2d0a865d76f0ade60d911d80047fb8429476fcbec202c2620e11103152a6cfbdb708144a417260f4e0d299a4aab9c88935c8203daf4e9f16480b2490b047a86e7f3c4ebd60986e0ca5af3f7ba7c9e7dd45264da83aaddb4f14781e682bd0a55314d73eed1dc81689b6387bb3cd0ac9d169d2373866f6627cb871901900224de5e2ca1441baf54f1a11827006675bd76380a7a1e9c4a0607e143a97d794402076e83102e35f319b7f591c1546e0b74a101ab49304844f58d162594da95e81202239cbec6c77efbdaf77297f2aeec5a589b7b91595b0305ee527e5a7ea18ede36031e952d1d16292a231114cae0e9f5edd26b57177a314e7c8feb77433e72d968e50302601db1a6a3080e80d1140198282c852d8b482ae7f111c3da56198d7cf0142f9ee0e16c013c33681940280fdfa652d7056e09530334f529424ecf11b92aa9999c25766e6fa3e4ac35a6c52108870b10cfaeee1117349f09318e000ad377224865ca53127d1f84bb8251057534467300ac644f93abec7e440c48e4c1376c6fc9fd2ae2928aa5f5bc381c689fc7c8c101e0eb3cf96b52aa224d4cf02923fae775f60596fabe137483503970ffe8ec6c9bf453cf9d571fe38cc964d98ae84ed05438325a4e290f40d8b2c264712db00a36336e04c1c469d1fda5c4e3c0a47eedde66c75fb7dc783ed6778a4b478c9c87c33efcba6d3ea6ae196201b962032fae03815a0689386c807c91253a2b5fb10a482ece2d4745a34b5340cb88a85627454867cb21b6973253865756ed11c47539bb7d65cf58dfe1443e99f0542432172109b3409ae0c58f5dc47aef2622a3ba8c731a772de146b13db993c454dcdef86bcfebb9dcb7c57c68ccd44baf0150ee0a1d56a0564eac092c045115ce8a2327e71612f0060668b11b5c467f4a3a66b270cf14b513fbad6fac4d8870863bca150446ddc7bd1262d7bfd9c826453100b4174338d112817081739b55b8cf10c6353fd91ef6b98a9acfc1b95a9021f0539d114180c99c18204153615ff3b5df13b2afa0bd4c9e2366431c3e621ab27917097847c4774405e1c14be204a5a710a07f8fc94a5668db28b5270712d8e8f5f9fb7672eae6cac7c994d0df2f4a1e73e4fd639feddc82ced44032ce550c6dae652486d63f03f54e935ff19193b8cc8ca8048f0a310f7b41aa9b5df6cc2af07a94eec32c638e10e18cb3daaef3dfc0be8598db404ba4e0c2229349ca46a78a1b4fbebff4dd94898fc3018d9e7fa63f038353f42b8a1a8d76fe7195434893ba656e60b94d7546c06e10a8220722223af30873dd4145bf38d534e63ba06fa9b1c755db5dacd922081dd40593fbf8ab8a3a942c298605c82afd7ce0bbee4270fcf93d778c98e655f4bf3a87a8f09fa6d551587589e7755e4a50c49022364d4ada4c594707943feca1fa48df8432dfea8dac6c7deff29b30ea0c27f5b4c3c3226130063826763c060bc016873dc774a25fb36eca184a7b2bf09f79b1e25b42cc6e7f6eaee8f4ae6c475c0e6e7d5b82ad9ea63083ed4f5e216c01668750d7021a57c839fb875bb3abc116f488bca2e269a167c2616324c31a104b3a54f4b50cb564a6ca39f5748c0f9680d4a8469e1c18e5e32ff1d46ffa88ac285b74230f751831d4e1f7e2ed5b877a8311b561b5b4532858dbeaefa64b66e363214f3d6bb7dee9982c273269896e8491ae0c845193bbdff0a5a51b6ff311221e7f7ccdfb11d375d50e70451cbd64ea98a520cc5d215234f4c797b349ae7451dc6e83659a15c9e6708f65ec00f17651cde2f525f0364625fac0d23077d95ca403c9eb18d8a64e450d8dc12e234c5408642e56ab888b0037ddb8943345c84a991b59d3fa15172f0846f04ba361672369e1fcabc97a94a46748a3290ae98c99f9bc86b7e38e1932cd44967a0f4fbb3dacfed044fe6a7ac59ea969ee1dc3a9127a54167f173573c55e45f3b35841545b7bf011a37e85c15f2c63bede2ad3c311b4e42321d806e04649a5e79fc430f352fe6be81e2e5815b937369c12279036f781b33817d1925c7830e7327e350e534c54d0b37c8af797e2e9eb5804a867851b692cc42cdf2ef70ca52a5ffc83ad24e61b728bb9e513858f52c670d4d61d6b2cabf90d0e7b3172646172564d1a98cd2710ae83eb9040e946397cba11de2ff9a84948de523322aaa3986afcb05d9a8c9b8f0fd77c3133a97312dfe44b4cd30623b7c031ec4fbd26d73a16352ad9aafc03", "6a535363", 1, 1185061483, "cbc682482b8e7ebe00c1d56867bf6c06d292659616750f93faa32cdd585cf50f"], + ["9696f23b012c51c97197099d6a25e9a91bf69af4c14148c21a675126e8fd54c5e0abcf2dbe010000000465006a638c2c0e150334761101000000000351acacdf724a04000000000865526300526a0052af643302000000000453635163cf1d4f0b00", "6a63635300ac51", 0, 509805746, "ede2b24c29e8e50784e01801dee43710599f387eb3903239b7b130cf45db1b5f"], + ["030000807082c403045f31e191dbbd06983e4ec11fa139d93bb45747d8b5480fd98ce8ffab58d69113000000000251acfffffffffebeea0d63a6be379248a9cc4d53f1e79ba486687c55580bed8b6f2d0b1adeaa0000000000ffffffff2338323f2656963a7f65df712e7dc2044a4cbab5d0a3f204d1bd90d5255e50d90300000003536a52ffffffff76f2b039bcaaa16f9719df86ef8614776fa76319193a98e1577a75894a0aa05600000000025252ffffffff049f530203000000000663536a65ac65ce6a9e050000000007ac00ac006352538463c20000000000096a635363006a6a0052504b41020000000003655251d37fb492387fc6b0010000000000000000a74f890100000000212302a321765266e09f2fb73692132b8c67c0fecc23a9986be74558e2a5b217c6017928d062155b2f66303fe6a9a67d636b895a4685ee9d09f2be9c068dc9f675b9574036655a19447d357160e7e2eb215385a1972bf1dc9fa2f8c01621266f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000702963f29047173f66f39d2eac2cf47d380f002ea09f98afe92bfd6e6943355f8fb42577632100cd9f9f46599953f8ec4583882d62540d7946ec1e02eb170cb1c2640135339f1fcf38ff741f64f692c47e06b80aea5606a4c5994dadf84dd62e1a770e4f6c170b29df64baeca5c333d84d8e80b88a0446eae1b1ff42076c1cb1020d625ed540b19cd27caf3dc6cfe58a630670ffc8e3fecd0ad4c2b1fa773d4e7003103882e8bec799dc1fae285d9062d38f79c464f56106791ab23981b891e270100b08e51213c0c2c896760d2a3f5ed38f6b675b67674546b992e2ba4788c1a1ba1ab7fa9b7925de009c83e699fe41c07aaec2b09611318f98abec32f026c1c792f3031ee1b163d792a190988d8097de30fef30fdb29e0b006ab2602e6a6bb9957cd8b021ba6554c4f239835b379121f30f70ce714a32ed4dc2c12153ff2689719de5f69022342d5fe501660b6ec6d7bdf38b62b1996b11bcf2a2ff5b97c1208177dafc2bc03081fcf87f13244d2688f6863f6b8b12e6b43b11071b2439fdf34a0d043335d7002067e0ac422b5f2d833ab22ef34becb3eafb1dc89ac07ad641a5260ff1976b18f9f303e6426efcac771585d2c8c3e888f9f1c55437bb59b2ea1f3547009619d13171c9d772a049d53c825e4f38891ff8b030179004c8f1d9e3e8e2ca772ae49637dbed8769d5611b87585942881b9b98d52701327f8fb52066e4719b07237d79084b91dfb9cf27df595644cea72b91883d2ea446ccb940bbbc30c4b3482c6f0376c3d2a9a7691c3a2f184890f639fbf16d240dfb394fd31b3b1bdc0f97e6471fdfe4debab7f5ad1871ef0e89ed516983a79d46e51a2706447f023214a85b7647e7e450b9828978edc9df38abb72619c7abfd40f1da85b5e0f8422836ba0e0c15db8aac6a38c5a39e45197ffa08dd6d326139439f42cc03d59f3599cb7768d379b15d3b986a3bb5b8b14cecac0a4e3210ffb431a41250f348aa3ab48d6ffce717c8798ec66d2f9523656ab37c569d01879d90a6043f2252f2ac6468934687a9124ab4a5e4a42917fe343c27636c9c9c3762cbb203bdfcfc356b1b133686dc465459518ba121ee7eff63a8eff0b76a5910a56bc1cf9bbb781da625a5d5eadd1be7170818c62db3bb64a6a2d79223c94b487f755a48a94ce9e3a879480419a17b7d1409fa094bf506878bff2bad59100cb0ae36ee8d21a0041fbb81fffede06ad07509cc76383ba08c91c587511bec84a35b68e091e4d67fd432ba8139cd06b636335f0a98504ea79817804a4cad934667bc5a096dd85f846d825a7eac68afd741d14bb707edcaecf7b8877204591854be83beb09f96a46466ea0421a4fedf82d613ace87c1a6b187c5191cd41ad03ecc9550ca3015a9262acdcb33c38a62ff15f6e9c268fbd5c0c449dfc20314d25b8ae6aa324db0b4f92ede07fc9eea356397d5495e8de374705fd29c9310595e618755a7835902ff8dc53b6e98cae6d7fafd6abc29ab72e362a62c854f8b127046958ec3ff815c3dfdf5c59d1df1d5d792c2ddf84a3279eac421ca5b8cc35fec862f0382068cce1d944245cf65058b858d5a4afa5340041836e2b625bb9c3f80d475e4037da445820bd7e50f176b78e390fa5a1d69986f486b5efaaa3c615223b019a77fad13ba8dacd38d18a0832e31e5617cc4ea178f244f2dd9c22fed0fb91e7113aa45fe1cd030ed90bf1aae91fef0c3978313c4f579381700f2230f28d3fae958978f7475aae04dae007b22e7a7f3a960babbf9b76b68f7c9e46387652a08b00ad2ca0ce9f9d69e27955cf4dad39eb2c0809d5772480eaff47e6ac5d6d02b622ce4635fe1092c295c7523c9f00900d69e4e2846298e1a6a0d2b07029061e42931a812d5688fd30cd350079f56ab863188ae1fa541c0da0422ce064baca169de73555abe628bcff2a3509488b02f07ba19f719376d6d45c93d9b991a964e11ffef3c94ca3dde20970d4ab5ff962fbd1f670ba2932d5abcf9fd18c763f4238539a7a70e50fa968d9e838dfac66bda9c752db39b936fa2efa2f8a89dde8e15c126657ad0a4018820b69bf5d397797e5f6d9e77deff889ba8224e42ee141f110c58603985443fbf0e4f985a3aaac92609c431d7ca3a2e7452e57de2d4e4ffffdc4434a3bce2b078b09acd7f73ee532c28a7e63a59805cfeee4761655434c6b24d7190bb8eecdb2428cf499bcfa88448483c4a6ec6d14fe5615df2d3b334f976fb934d83fd1daefa0a61675cfef8799364be8cf1a87aa133bdbc0f063b11d7cfea10c232f61a8ce4729ccb9756241e0735cd4e5419f8073eced3fb8431860588adce3e95305adad4d20965978f4fae6a7c63f27718bf86cc0c68aef62335d104da42827f9cc56b05763d7cd07c4eadeff63a6f90c20961fcc120e4fca537128b8166b741802", "5263636353656300", 0, 1455348102, "e67a4842ad42650ca9363a88fcf2d61d491dcfde086a040c55f59340156f628f"], + ["030000807082c403043243bd56424cf243ab27346fd0608f774cb1f7232c1261a5463c41c14dc1ef5001000000056a5100ac53ffffffff0e8f726021b25f9e0320934d1d50d0904dbfcea497be3c54e23abec4bb4d79910000000001ac680701098cf706bbb32021aca3b2b2faa548eeb79d0a15183c41d4b0b2aece18d033b9460300000000ffffffffa41e223b5bdf7a233d519d897ca1d610b9b3a09c830266198aff31115427bce602000000025200ecf07c2502a4cd62000000000005536551535205c758040000000006635265ac65510000000000000000030e021f03000000000000000000000000a554b0ab8d34c64680d5593b9f87ea4735cd268c1a5b9a0519af0f85a54c7eb1c8fbad6b80ba2ebb6806e56dbd1f247f56811f2383f2ecaffdfbea5489c2fdebf1c5fa756d0fd8ae961c91630feab8df8b2a4b2424d38f30d0943f5c56258d17000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1e00ef61a30800cc88460c9372bdb352251750dae899e9fb370d79c13e7756f8799a804df074fac25263646bf53b23e11551475533b474bcbf674413ed6ef31acd574c57c0f7487178cdf1221ab25a823624ea0a20e2f459a4b3ea2fbfd8ae9730769bc11585e11365b6814efa1827948e1b0aaa864a1f7f65efe05c340b0c032634e1e9982a495d89ae5eb9efc75c7c4d6e4db82ef13955b2a49e33cc9dc8c60215c950a3aaab19d5b19097f1cfbbe6ecd93ff58b3c5df8d9a8f7498a9cc41ee70b0456ddd586786d672cd46b1f8c290f97e14215960dfaff61f691e5b4bcaad81f00f0c656b2a560b7354b964d14d2c79da143286093ac207a7b3af5020a3019cc0213de5d872389c8ac9d30e15d2de16dd8ce37779f850eb9b67e0c332ebcf92661031ca29e9385a3ff3fbad38a03b3f13f8931ef136caf4882c54988634be7ea029d032f19b3f7ae309f19a886eb5ef2273767d7479006fb6328a256455b3062eb1b530304bf4e049f9349dbe7e68829b5bd90b886ec68564decb103d8b080b9b0060629032576614c8595ac1f7117138adb1f44ea3e16fc0ecd0d8baf8e8ccf29781579ce6bc9b1f8a0068b97963be85bc7376415eb1cc477f8d39919786025197977f7f4217a5899e99c347a17e848c38e74ecffbfc98ba0794744fdbbabf818f3ad15bc5621ea8171e6503d25910374b6975b608b6fdde143a482e6ebe3e56795cfef97ff54c54ab3b79ec0e1ac192e2f02643ce276e984b255eea23fce42d4f123466acd30c78fe0b45b73ad30f7799f1f114537b381d3620cb292bb0869f71f0e1f9ccb0791632c4644c2e0c38e080334475e31483810ad3367f53a2103a9542ca972ac270048bd6cd70461ad9dd81c9136150c3dc4373a941f6aeb8694a9160869a66ac1335698c65f43ea328bac9c5c038b56605418ce5c812e2e7f244c299927f09a97a1723829cbdac270fffb67286a2ce8efad7a1d06996cb9a6b7e6599f9393cb61b9ac6be5ac739660ee1c42e3cbf67d01ea5aa2a87f754e8e18807de6ff2346a548e6ee237012d79598dd3bea152d375a288f6c1504ef51886c9cd15f75eaf67a7b798dfc411ceed34ee95fb93e66002ff1030a8ce226a7a12bc82b3f004681300c9f9072e4641a9969b11e33f5f076b0ac0a1b8fa8ef64431ed5192a0e66a4416c41c0b894415a8cb4a0f2dee77492b680e8f3c4f8c82605947acda729ea5eb06dc387e8b5eb5d56f606777db9902580585ae2fb8334d671f88e177f22980cfdda5686afa3591bcae342274afebb36e87cae106f280fe941b1599f36ff60061c833515681546f506f5a71c58c6645486cbca1e682ffbccb0c81cb9a9cedec82c98e2d37f83e8fe2bdf24669c77e9009137288f757e17c8d5ac0867243be3c07db99e5980d126f3315eadc0faf05c60ad4545d98b43ce8c916d82f1d6a163cb2346f4b13b2d5b369d2e89a3170aa3c37c5a868b9f360536ded71860ff3950b234163d38669aedb4e9dbd1e6488acdf533c8b86458b3c980bb90a2f8a50c4f9eb07122f9c47adb9adb5339271fa6b3988a4d1b06ef6b5d564e7d53b0076a19f79ece5f132123434148d185dd4ced78bfbaf27fe08a283eab9044315089c836c7e1b6967a40484d3a576c9ee3543e56c6d10db586b3d6348166937cdd80c250d2b398565f0f0fc91ee8bf26817af72794c47cf63700b8b83ec2929ee6fb459390b3bc96328cc4cc8c6e0cfead3be32e66add8947c24c3789ff059878ef5a996c07168f71a3d4d501eeb2d2878cd138804c9ebcf82e06038247c6daeb164145d8617c70213befc9aa203daaa6194d653314e6f75eb16f24b74ad9f4bdbd0053bfee8b21743a246fab4bb5dab94dfd0452a6b384d3bf7069791d21534baf6ccdb8135f365cf1fd222c84396bf4fa0acf0428528b992b6ee96689a780a9764026092afee42bd53c3a4f8267d9922560377260db83c90a988279fa448ac27da43fdddcae9c5c15fb74544e19d95f463dae0144be60e455d4d6271e87a25b362b3ceb035a3285f857a1d2a3df42a45c05c135a275094badcd91ec09e54b4fb096c6357eeca7bf5a4e58ec867175e6a81cfbd4d8daff7340bd9125c3b19bd3cfb90c46a024da2a5b2f574b3e9a35c069b75e5b9bece30b7bdba1900b9e258cd3f49c9f4a55dfa67c71cb785daa681d605d62b1ed1217103ad078bebecaa6ee9fbc255bf37dc7b1035de3d3c2bfe5c8e76263a366d307377dee1f7e00a3b0c8b12c5c95a3a6e9ed80f74ead4b5b84a6c9c8a11b98c3efd1100000000000000000000000000a35a0a117f1ab3c00f52d441bf57eebf08c8086c14fca9bc84437eb140374afdcad5cb57a06ca24924f68ecbfb7d6245a5dccc812b6c78532ed814fd732441d6a813f8a160e960ffae7862260f117c7ad1d863c2ca26dd32beaf424720a0ddec000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000310f43790c9225b25a628bfdd2f18028e0960d8cd3e0ecb66ca3041b0c306c219910135aa05c0ae8273e29239ec63b51995144f1be6f4f50e8a9d9f575902b7d5388042b9c2102782b582779d479f3f209e457fc0c561fc56dd57dab0c3c97dc9cb2b276ff96ac2c801b6b417bd3cf3646de557f1b168aa52cf2c5d719ccff4032ed34f36581d7a3cefa9d52393296aed14de2f2f8dc52971ec6afcb8bd64b3b90326cb9df6225b01f7c506793ff88bc2179e49c2787c125dbbfa4a36b101519f230a080e1810d0b82d8d09a03636cf4e5a77b925f45363d04b946f7483a2057a50f2e43b76fe4e9f59a7fb30579c28f3e204e275d2686cee3de2e568c5457e214363022805311f2418d825da8e0b8b68bb4fe3efbd633ec5cf253ff0a0c11c9e2eda0e031e7fe9b6a3a8398475ff394db5e08af44dbb43df5ebc27344df284f1de3fa8f5020c6cc45abf574eb7ad757f343bfd9107723842345b451d80f07e6b038cf766d50319c227e1df4e1319c097d022f997e3a5ea8e30c1cc9aa681b7a05fee440448fe031f060f5c4aa07156d5f2a76a00bf0b2d697d9a7cc34635821f424bef276a4b03561b2aba7726700182fb2691877edfea8600e9f9b660d10b5b06cb61dcc158bf47bd31dcce8f55b1ce9c9a376d0afdea11b903860ae47b937bfd4acf0b9594831b00732e9d53a906345410569e1dbfaf6ad06a7d064d37789819627613b439d6698aaa05fbfa216a0e7be2b08adca04fb7d59ae3316933776f67556c5edfb110bd9caa6ff267e4bec75fc8142a994b5d46f210a89d703eb0bc3eb656b959b9427531cc2a8b9df7fbb79ee08dc2c382c775e31d655c0478ee0bd472713732a42925e430004c568302779c1af56978d5c2a3f67538b6945205edb244799050908de8750bfbda39819d4a732aec12d9c5209ac154b015c68105be4018053011ea5f12736c9efda341704c453bf0a1164d795b838841102ad8477cb16f0bad01cb2af1a595c3692e249c7fa844922b72108b56005737bc9afa442846942638ee23a3aed0592936a475265dfc7f247753733886247d467af8ea751eac2dd1f6557f05a2c8a0130e5aa20d650ebdd0c9ac55149c3199ca27eb76ad05ed5949d37c672038b026d3332bf74413d286eb7a723697e12a5d40308097f6d71631cec1bd12e066bd6bf24e350bcd6d4d2b116fc3e5d710e3784fc8d8e4cf401091bf0be4abed9346b1e23f53ee2c1a5465747db6102926193c0003a74ea76205666348c8b974030631f38919637db6f62cae9a9b61b46e91a41db247311337de414250244c085ddbb28da43d12993bdcbebbd440f2aa0bc7ac01db72e7da7b47326d003da7d43aaace464e82f66bcad056de10e839f1182b701a1133b752771c2c816c26600321a2fe6caf0af065120e16e6f207ca7a2a9770b4eb4bfced10b5fe75643abf72b4dba6b66f6c13f7d6f3fa8557cdfb581b14c0beaf0b970ec5eb0a9ccd7d1253a1a6c3136fe02fc74bb62c0756a810f762a0ef0254fe2ac7ce115516b341bcac060542b8ad083531173aa9115137745405ff4a65b217447ab7137aa2f521c26216c84f50a1a416de21dc219dd815759657e6a2192b23d304635984a840b0bbb71250377ba737f1add5357f4fdaf889f2097ff2ab3d9b1c67e05a638001c203323628ba492ac4467ad023b6a5b69ffd4939cb32404e3c536c0d6adfe2f87cdfe308abc4c198d642758dce849042c622cb735952cc3dd2d6c3799141411b7af4035e7b4e42865fb92bf587818916e9794dfa430d956ead3945c4e056c52ec3a7c235117d8c2f1e637d7080317cd9ca0510a9b1ef948b4e30c263a5890470976a4fd40c1d7f99dbc6962774a746c77a1af3bdfbf26e0fd8f2c19dad2221e00f6f335e9b629d28dcb97e48a630205504b3f7e9a3420fac7d7de8f0ea73bb296f55dfbaebc2abe756bdcfc729d6abcd0fb95d2eba5da11e38eb6465006c54009641db59f1d864d8ec4cb9f68dc46c253f8b4b209cd60ac5add74e80fd04522844e480d6beb490c990125beca8c32c66799aefb661c7f92d80a4aa4530c60bd9186230d2a437ba5080ef103cfceca98a11ed858c912c1296493f63ae8db81bca56ff06b90fafe41b39078cf43a9df4840d2516acd4283cd9ed692b321480e5205a48755eb25ebec070f7750d23458d872b89b43afc06aac9e76fe9fc1cfe380b2ed40452972ab3cecaab2a87b1dbda82139fc193e51ecf090c0c9f0bb4b435c9108a663fdd598ede41278cea8491d1c763c21a91d400000000000000002a7b1a00000000003d181b76f776682a6ef431665a6c8ed79c756adb48d99435ef0ae820371f5f9a7ead8e5f3c0fd524bd9fa376c181d79b6d47a5b62a1820d4c35b22b445675127bda75e0d002f52099a351caf05e6d63ace53db947172e831515f2b376466f5ff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bc01ff256ca1502e376992cd09e9efc54b51eff698bd9045f2ecccb1f4f89699ab9d089faae71c3375cbfafb23a8cc756c6b7107ebdf4f06c9f2511da26d6e0a1e6c3943c9fa6dac9e483519774f93c9ea2a6b095fa8eaf1a6495ffab84f9067e320252db3f797ba912240a0c558bdef4101855a7d77439d2b62fdb399cf11f6021c9aedb251a5179a438f664ae1eca73ef712a0679e3679d42a7a43670db2be2a031add096dc33ca9b80584d958cce8dc428de3522aeecd05450e4f5e5e35bcf8480a01f49e806d82c97809d8ad62a2f28e17418e0b1215d0f0cab5650faddcc9335bfe1540463b6d27e15c3f9dc0ef425d1463852c853f2869ca9dfe7dadf704ea400320ec139ade14123f421e1f96fed091655f57f2c09d5a32aeacbdac05c0a55ab90328fed00f889db9e709a36908ba00a21b031dbdff9710d416d72696ae2fea38be03039c17242d6c05a4efdd9d2ea764122edc914ef877b69b980ef267c3237056ae021c84ef1728e48b21d6850969d4a8a59ca7de6a73970e90501b7e40d16415975d021916bad640c1d45d76f8c065096b1d7f5fd598b571cc28b261916fedef13ac30e0d56c4e92a65c9f69bf805dbee29b8321a469e7c875845764bc0656deec041bb807a2718b36707bbe76afd0d64d6d84b94c3558290d5d8c587f90de59382df74ea3f9b09f540372af6ddbcccee40791982efdb9829e34829ba3094f21860b9ea584d1bfec9e4a98d53133d84083d5c879ad0a00a98bf900162e8c8f7d1ed2f13352c10e6eeb141fb942def78fb5725ba6620b85dd3b21d934d1846a8b667495fc7cde3ab9e15e32b5ce4c8717dab8d060bf8fd5e5402fb97eb1396d461e920633fd8f86ff4e8e0d2f364ab9c835f276b9dfb6bd968a0dfb85a272e4bb48315232761f09ccbce862fd73ff600ff9311fdcf1e44aa288fd74f8729eb747aec17c90774c5a8ab26322f0c2433b5e01a9f9c3d8125d790f77edd25321d40990e07501f027312b5e006f20e0229af1ec293885f5016f45ea383610637ddffbd9b8cc2c19d6399b23c35c1763157b6df5b672337a859f240cfdac9d195708fa42a568b26b758709304efba6619e36277640955e42ed06f753f4392afab1595c505370aa2293eb68197d40de7c8151582df4104ef8200e0d0b5290e1ec49b7f494fd43d48c70dd0f90986b486517a3fead5ea70b7deb29a085e5a0ed71c6a857a9254339e58f132020aff87428149e363a7cd05e62cacdff7e91396a9ba15969ff026051b9edaac2b87e73b85c30d0256f95a1288fe3240a6bb9a5187d19c658505960962f75590a5a6d612319105f9aafe136ceefd0f52cb5e355753f63a813a5f4fabe5423d7c14d925b5759c34f4732d72f6654d5f5558417d86248a8e31836c7b3eb2b0d2964d16746ab6fe1bdbabb9188f5160e4c21da5889e47737342abd9d3f3502a72dbb6c32daf99959d17a58d0f8fa068e768b288c982290a5826b7b6140552be570c6164a6fb86decac9460b97ae0281d34a33c4ab6d844ee49d788e1dd30fb0518d880cb55410c034e71f97c857aa366b1b8be7db5216fd08f045c409702eba4ca9aa895a5662789426ce3e55492d067ff2bb1d387da007afade7e946904b3172980ccda5c5cf491dc3e25b3240b7954e39159db078d10b3924e458a4d79e9fca5a9cb087edfd0731f97d87c6c4f855aace04024b7378f7e17db9859c821c7e50209719643b4682d977abb381033b99382b11647b6f105c70d02e9c52e19138c8708d773676e2117e8db3a9b13f7a1bd11cfc84c5a71d238591782c17df3f05f55e090e6b82a792bcba2ea8e8f1cee667250f5d513b2df7521d7a11aaad37c7e3a278aa5ab3b111bb076ad787439b9e378fb3d9fd193125301a65f8cfdad858af60c58deec598246abe82b9985dddcbb65eb3e0de6365d674a61f6f7140e339979989677d0e05a1a3030271a129ce0bde590893bd9f79f98ea47839f8557ddbc55944b6066e0c4e879a61ad3175a7fbf2866a7488d4011ea25b8a3d6f64fe86d6da984d1ba63ec1b60e0503d44e0a75b530ba9cc2e84cbfe8a4be7c8e5d88a360a8a26955cc12ba962a79bd81f37781bbcd58025900334870622044f87d4f251c8325f8efee22aff2129a9c5fd0dce2f4cb6e158e243d57fee21d079d6e0ca5fb06ac87b9ed3ef0305558eadef20d0fdf32b2d0e8651fcbedca575bed1eea497d28808adbb2587681cf32e05dd9458d39c04c786725b298ee8fb2ee4614c6b4b3d02cf46e511888562d1cd4f6aae7e4e3a844d5dea5f44a827e766a09fcbc8299aaceff2c689f6ca9ee401c3af566719b573ccf7eb717f39ecef26da9f3ac21289bce108c88323ca2c3229aefdcc0a941d1bf703e98ad2116781f494c8496280ecec2f41aa136c5735cefee73af808", "", 3, -752462647, "8604a05fef09d4c4cc633a211a64618b2cfb2fa844b7c55158f6663f0844a2c9"], + ["cae9c11102c6c64934578274b74c0063c9c6d54ebd630417bd79bf246a71c11a54997edb7103000000046351ac6affffffff1438181f7ece0fdd561f89482dc7129c85f748cf7ec0fbafcd637154821c69b8000000000953526a516a52516353ffffffff011c0d4101000000000452656563569f1a180300000000000000007f77b001000000000f490817b914a34a81c949e86b1477f7a7beafe649f799e549a661e63ea18a53e6142cae1388d032cbf03c2e74893d98a2c8cd4aef7b86775762dbb6ebde81a238400daa0caf4a5edc148a604268369a9929280e015c56d6f5e21c09babffcd400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ec2f1ab4bf4ab382cb46b6dbadeda6dcda30726b29b19286fda4f1a11ad37ac130c43baa988b99a0e6f4285b1cd9e9d7830c3fe7e0f3a1d4995de7ecfb0c494acec760324901d099ea2cc522e7ed4792cd29e0935fef1aa8af76ba44a6a6f51f69485c6cd2469ed6ced71605f22780ed96b0aefcdb1a47f525eb322a33c989b80319b11da74033ee927d09c04b88d82395b439523f1a714e9b00a85b106959166f031f169cf489edc4341d6e141ab5cc3146d0b32722dd1c4dd012fe401c7766802f0b02329b4fa031da62193efa81981e450d51da16522a029dffc27e55b746c5a1286f109325f56637e01822473ac25f5305d31de13d1210713fe7cd1943ad453cca0224ec2068af49569b4cc17a44019b4249e8e581473c7096ef4fb747757829c0750309f216c7a06db7f7a39e68dcdf08a35f907fb0a6b25e526e4a8fa838d0457b4a0320e8ee88ed9b07d90a6519ce5becdbd2c6acc95246ce07cd152481636af1ea6c03011a91948954b811301b3077152f1088556ad28bb345c11a2e75b6442dd6162e0307fd11e28b213e9a06f5f19916066da32ac3552e4fc72e97aba678f0c57807233b6e6d7fe1b577d65d44f10012f64367405d27537436671a04b2cbe1402c8d3640115f3152107c037d7de9e088df0341b479557f267297c5eb7f37a8459d0486843ea8cca2b7906643e4d482ab27df51528a5537a843aad482e5bc750546126928eae024343d1481af6e8f2f24b811ea44b5c69f5fa55c50e446d59b7854d86bb6b057a6811325a317ff1ef6292a99ab9cc049f77c576e9db2e719680a9e2f030080ab1fa332d00a974bd9ac7c7086ab135c922b155d65ecde1e8344eb5ffd80d8084974be82d24c4d40937138840383b3b5eefc3ff33d003f99c770dc53e36ba98c51ee1c00f1bd138f3f83d5c2e9e85d46e7d36b944fb4bef040dd371ee85f41c943219596251110ab0ce7a237bb376cb23ce598ba8d0dff83694e8e22a6377bcea36184fb52c1db2310fa1119a3b76ce797f064bbbb5ebe19b48586831f445a08ef9259d057ab753e8f2a8a80f368dde1915d3689c3cebecb55171e309f363742a6c2d66c72f6e1e6c4096b2a9f207eaff41c872fa4db53006dedde906f6a02d33b737a47c3ea275d00cd96be15d423be5aaf6ee8a575459b89dc96396b89d10ee17369de3dc0bc149afe94765dc0eea90286a6be1de70dc4b94211a5797b1bcacc9f935f89f452b2e992009b45c2bfbbf536c545de33cbaae3cc4e61cda5edeea5bebb33b147af6892ee24e540959db2d5ed9953fe0eed00d4e5aa3c8bfcdbf88cf2ca88133aca07a44ccf45e036795ba5dfaa37a50d1f0bbc63a7fc99c329cfe7fabcd72739b7c77e7c1f90636fbd30b093aaade39f9066337d4324ccc50ac166a3917ad62d1c98660b9e60275c7a96da9bd88686404f884afe8b3a562301f01e3c1fe61c8fa2c98d82a43274cb6b0de8b6edbbc97090c8adb26f3ea1be02a0ac83347525d7548ffa82119fc77173d6f23e0ad7e3f4d9e410c49cdf62382cb33e754d948fedf673d871ef47f875b45edf13ba48c0d36ce39cfe7142dd4ac5d873a25f001e31c2526756a847c719dabcd74080e51997f52eea4a5cd778f458718a3100346a020effb8ad26a209f53258efbd339dc6da54f34339c6b25b9ce010a74aedb865f2f3c167a077e8ca921e18272a8d54e1e1d9e3f176876eb434b3b98b6dba8e6cda6693d8e0ce82ee21938b119cf014b518dea2f8b7a60108b72138285e304f45bf73f49eac568312728ecd93d6a99efa65bf56ff22ab2fd4801b3f15fad84f18c5bcdb96fd1b8dac45256b07b6eb1eac159d7550be3a22d681ddb4ad54e7b1d7184ba46eb48889bd56f9ee3a95393cae70d0df52138e5f0b54e126fe9ac33622679da4cc41374a693cab7e2e197626edb3a1699b85e8f653edd0c328f67934ddf1d373cad5f916d935815dbe0667b635cd34d68e82ed466f2e6279f93ed1c32089c64359b1dd19356ae0e251c2fb973ea487956b6c29b571f11b7578f91d811c7e40ca21d7264138d5be10c701c764b5f6a71746f9a2a90542d150ac3ff9cd8968af322943991fc672df1f008ff4a75f417e54f2bd7192294720446cecef1b2b8020ab969e8f37dc4d5cc342501fe338568f95fc4b8a0316a5d080e8794cf1b1dc4951936d62b278687581117dc362d639c9012c9581d867070f27a3ce5552a2e278601f37f214d598076369e410a8c0e4935866e9459d36f02a085b5c18b26d6988dfb2202bdc4421a6d55f608d050000000000000000000000006166b1402ad3b14946dbdd9faacd1fef332914fb97d95d8411847ac6ef402e99423d5562e312517e66aadc38760a35706af9a0174ec1aede5b1abc4c62740e4e6d8810cf69b0ba047626cf8a408aa980bdc702ed2a7e876485266f4ebfb4734a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003a74b9a55f2eacd75be9c440d73330797120a893b018ed6d2a18dcb14f39ad34c3d21266f42b12443a2a30e8c2662f0d77bc896ea71fd8803adb3b66d6aa8deaf2638beeddc4974bb8f627ee94bb3267bd1d45241ecb962170fca0acffc7ee55e279111e2f3dc278b6d37c69b2f8791abb84012836f8e5f2bdba7c2932f944d021c9d12c21bb9b88b0a7dfb503ff5242f07f2130121170ed65ef3e21bc93e0bb90208ad225e4025749a721c6858c59f48734ad086222e867a6a9d4662dc9cb8d9b80a056521eab2ec67554a3978666f9aba11a6770504c3a57157e72420b9ba6ff4a687038338518d36cb2735ce8eb74d523c4c8fd21d269d25b707e5af7ebc219be70207228db4587c4983ce7ee9bf3e0bb7031e0371870fa9a4f1891e1387056a700b02044bc39d98949adc37319b13ff4b862a423eb8e17692cfbfab97333c504639d4031fb759b86b2fc8f680891d037c75a61bf4b4257cf6abf2a74cbf8f9b1237c3d903220b66db450bbae80f4004c24a2a64771cbb36114d4e426944ec3947e62cef5f032d90f24ae07d5f010a2ec54d25e5d04aacf1e831fd2e8b7ff2b8123ed36c4091b4f9c0df6c1b2431c03197ba42a4c186e50965f85a4ff18436522031a8f884c827a28b666344a71b41cc18b852719bb8825bf0dd442c397031d761331757cbaf49be2d811737ea01d78631a92dbcc9ff5eaeaee9d668cd3b75d99f7cb8c1c2aca369d7f4f7eea88cdde31a80bf40a1517aa600170bafa0ae3defdde017a0f18653d0ec8007a37510050ac55bdcc90fb74143bf04a4a3a6f2939694709665e83871eb8da769b81fdb730068fb861f572f2819db54c180c8203186e9ca17c99a1d0d382c7dfa79ff1d921d113780b5f5de31602f2b7b61bb0b6642b388d9ca9b1283bf2496570916c46bac58e32b7bcd8b1b21907f1704d7dc320931571f5d07ba29f20355c70073e43159d3512ef68c86146ea946407f72db50d6d3b3b3dd2cba3ac044b067c620747412682eb2bccc5b0a14c5115508a72ea87acc21bc5a1295633d755672f6d3d957219b53eded849db78f963e719986c812247870da61a357440d1f6973e87d806c4e49f9ee54c4faae07cad69f911725be8f079437a8d22f6ca73f76befa28f22449a75099b45a9be99e3496cd4731e147befea0f7c3b3df44a00c3f252b54814b7f816ede9b6203aed4df2740ffc0d4db0313cfa765418134023c844ba449d3e48a55340ccc747223e6888a3faa3bc2b63ef386c3a49439e56896672acdeb72557ad0d445419ae1bbfcdde04ad4fa5401a69e10fc52d858adb41f28d115460fb7961785e5f7e6f00443e1d2ffa17ba0619f50776c6f0b8e611a5732026ff70d74ae4265dc477db243fab153a9d13128ef918e4866ab5ec144a3a8e187c5d95b86465657c8d224a3825fcf2f28878b5f2725ab50ea7ae28b44dd357ae17f25a6f7b7bfe6397852687e745790a45b5d3cc0c1483aada72795664b026afe878c8884b7bae17dc5006a63c92e2d5aeb79116df19222d605989dc986009e1cc1a281e1565ca88e7094743f0c14679f417b5d1a80e3b1da35fa69d2d3610f03fd1371091d2afe127d33e611ea01868e3544b63a5a4913100be9d2228a3cba311a3dffd611518f15165fcb1f8a1162f3e9bcadcd13eba67ef0c61b6e327fa578cf33cb74d95b4d9b5fa931bbc776503aea270d17c10535bc922f4027eef1788af1c849a86104c4a2e9c3fccb8406ce11aec07be1087af1125e4e596f38e7864dc641a4f456d0e2bc0f8c71ac1c13c7c06ee00518ec85e7856b08b070b3b71f519557859f413da167b7c0c76964c3f634f0d9fc7b262c390fa59b7ec75822602b737e98b34f4ba0e01ce9328d2eca5b5d0c03503230264ce1d3a059fecae055083e6f325a7714df95b7269e564bea2f8ace278dd5ce7d42e47e568b0df45195254c562186164e8256397580dd0943016eaa717c9ea669f258fe1d7387795b4e59ee3e9bb16f821327bf40eac1a57c4415f3e0284ba6bdcdbaaeb8033f1d77fcba841103eae87bab5186b1513a9767e69e0e1f47280ba59707d272811fa9f6f11bceac578fe7e5464288dfafe0936dbdf6a44e8071ff41339867cf41ee22211c57c38273a50af57d3f06a7b7d182478eeefcc3c341dde18a5de7b019b3b97732fb3bdf93630c32b756ca34f2f134c40e432e99c9715c9b463f83e46a6c20ebff059fd2c8ce0f610e8c70c5b6ef7d5935a5f6ed9037ab197e5b29651f82769262f5004b7b3c45721eb8f6c2e2ac0500000000000000009cea290500000000ef5bc8f69c26caaa6c3ae74af7cabf44b8fb7236b421caebf588cfa50d33b57f04538f5a3c9d48eb34bc3ad831f97c8b53b5442d8a0e05d2a50ee19c6b6eb070d0c15d205fccf0b08aaa3eade6aa741607d8598399a295973a6ac5ba1b74a3f5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f6963309c75549327dae34100de603e3b6bdce8822c69dcbead1d47932e783250beb5f721ccc4d70768def43290a26c1885a86903e64b87374c22079583d278b798a6c798cee06a5704f7052489e5560762d313527b595ece865d482de0676b8032557b27b5f262cbfa40c799aeddb59bd377941402e49be56ba44503dc2344021cd9c3a46ce6695cfad4310de0fb636f81fba863813370bf4b2ff867974e60d30214bd2580808e2322509c357fab5245a6775c3b494d586459237e2521b23f80ba0b081dfd7c685ce945c6d572f819bf12b92549d82e7052a475e66c91e294a75d7d1c8906320d4e19ae4ef5bb2a57ce5a4528ca1fdf359b7318d22fd698ff63728402064ead90aba250d882938f9d75c9d37699af878be6061fce6199cd770b67ee7a0312f50f909a004c98ecc7ac4c7abf39d53165ccd05ba2920c5a40cd2b1a167c460315fa7de456075d8e49891515e094061db92842b31a501d50118d766a430957b5021e08581dc47ad41a33af4cf7633f0bb738f425e0b8c8058ca9edb9b6050321be020dd79e41a4f29590f4798b80838cd2b7c32f27312bdeba2db1b91488dccdd6b18f8be0edf5b7148e23ba5be3b42b0d6444fa2d2ad0bd09ec473c8cea8f8852a05ec5147abc1cb934d6e1adadab30374094456947dc4aa318e27d2f30f9fae77f8dbf67311cb6a793bf60af5aeafa5d969ee6003fdc222e9528e39a84ae492ed9b6c7b57a8c7c24466b83d8cac05f770fd8d16cdc6093c418c5666312c3e4bef2c7fe952364b52fe6ee83e453484ab2a3d95bd681f8871410ed13c9229c7c1ec4f8ba8f82bc34ffe7f4e943cbe58180c79b0c2982e13d3db0fec998c7fb4c3475cffeac321080542b56703e4065d174866494fc091577a5202a72c74272dfa36741b46da9eebd72be8add0e1811a2d7564282ba4ff53cf23e9bfa0789e34485950ab5eaf50fef25b74a826898f0219747488a5e4ed8a6eb7eaa066a66d28e4d5b7b6f7eb4647397a682d214f6c8108988e110991dcb03bb7fc858fec9a555cf48faeed7dab4c647e9936c8f6ae47dcd12d456fb9779ccd374bc15f95c7ecf9d4c7557943f85e114c9ae373dc0fae7f3c54e5bfc87b0a6631f6251750a6130ec870c799c143d749e0eb0873aef95d6152dd4726cb5cb6412cd984830f54b0756d5189f9bb9672a34fd5375ab334868c371515d0f9a3da25a5c681ebe4971754e5ee694e926791c5976438413eedbdc0786eba6091eb47fe09ba70c87c1b5207df9be4b206c5b7985e3f01218127fa63cdb35db30729d6994d751224d3108d678e3e7209e6f6ccbb4604498da24d78e092332d318052ef371362f28625b0efadda33fce511764c971ac02aa059ec317abff87402ebef511263f07f4f67aabb4703468e39604cf1f56b4dd1b45c50fe84a3f02447b3ed8f9403a6a81c441252920b234e6edd177f4cce0a6c9202dc043137a907a2c0bd76762d3b75b0fbb2dd9387c748a5b64b8d561987b6ee6d093b8d406fd7f9a96e34e8ea9ef39fb96ac266865d9bbd20ba03ee95ad5be2137f7fecd27237e30e833efa4b1db7ce6e12fa32f073c186471a273cafcc54bc959fe78539f735a844d1fb942c039b3175c5d27221b6da39dcd32f6eedd8dcbbd20abd159505b513e5f31dadaa4c5d457b3cf8f2d529bdea39a422369756c213333bfff930b12d2b5d71cc1d5fcc9a37bd9fe4efb3f7cf08ded83833653f000e84f43ef193e3821de9b842175eeea1c103504b9b4503295517bc3a7779c0708602176fad265f12039bb41aff4f39a7b7d31b42d474e5e868896ccea51260446e05294165aba09ae62ecffb3978731ce812e048fbf2309aef1fff85c2e8822a5d8cbf9693d9e148f1f1d0c8dc4dfe5c29a432e1ce57368a233a862f56b577f315ac9b9321365380a8ad8cdc41ac46ca18bf95d46a9ee2de4b3056504c34a64d32db91b5581c17b97d5c7525531c00cdc1d325971abb9d6606883f056314c6c9cc7280a360f470933187946b06a15165c4ba9e224b40367501f37ee905241527ca72654cfb120d0fa2a3928e582d17ac74291162ead26ceeea98800f8e1bf44d197efa1afb23158612a7e52498e776e5884510a402329af22d7016eaa4ea1ca7c74b2777bbea340853368288e868e85eef769e94194b0001bd0d0b4908295b6dfecb02482aaf3c977c2b81cd6b3a9ef05b685f06758a00716976c362718716b781c0caef2f4854a7cbf9172e50a57bf1e6ac36d63b37d1c0616dc94128db3a2d2577e1a88eb34e940a88a4fc9f976a0966aeaaaca146e422940a6bfeaa81d0515c1fd6bf089765108c6e80787852229c401a4cfa4cc85269591610f3c3944d3d09021a88024d6c67b80c504387699b0bbd1c5f9a71f6f67cd070f1c8cf56474d870bb72ef96d9e50c", "0052", 1, -1525758058, "818a648a13fb7a66fe6a1668773eeae0bf8619ef66200d5521db53e7eff5281d"], + ["030000807082c4030155aa002badbd96184f801a1940ea3d663efc3e97b923e4bebce99b0ecd6c50f203000000096a53530000ac6a6a51ffffffff042ae1ef03000000000153a27fb704000000000551656500001d766d03000000000765650053525251b29d8c0000000000055152526553a4a138aeef4e340e037d694d030000000000000000000000000857d6af41cb03c60a45f75a0db696cb6fccedc520a690b25cb31242c325691152e546240c2f5b90a2c4506981bdd970ff3bfa77f6c3b8be9712bd33c6048aa35e87d11efe53ff840deb521eaba884813efa0ef5575444ca72f63eb19b31fc7e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000992b66affaacf323be7891d87678d74060cbf35e4f05fc64ecc4de4305024d6bb9e5d524a3d446f213faa4b2d8528ff604b674a4d49efb488b711874f3d11f8602270a7d12ec83cb52594038be52758c7bbfde5826ce8246b7710c69ddd13d8c4fde1474c6a812cbd12b32d2c81bd42a092ddec96e1bd90731976894c9e5fd0a032366cfb8267948d008c5c822af4ca01a95ae0bfb78505ddc3075b04ddd996db5022924c2649b505fd779e0e26512865f70c958a1dc920f8c87e68ed5330320b9340a04bb20bde2619c19b607c46b362dabfaac7270489c6c3e11988c994081c98e3adbd00bf9c4f08941df6bfaf4e3eb07108fe00a293e4b6846c674442cda203abd0208fc79db8fe83673f60ab4b97ba42892911035c2a82131862e688da1555ac3080224d82111f0792c2305df9bb2fcedb9a2ebc25396d4c8fc439aa3ba39568cb162020473748053780ba87da9f10bd48c0c92065cac3a47001a71be7dedea86c88371030c65f0ea85e7a5360763c706a94b67e83ec11ab5d1c2b61aff8f38be004164b8021f7a58d60de36401ed233d207c02de923c536486c8ad838c13822927d7ce6cdcf539b25e136e2ec16926ca5aff0cb86d62e328f9b283e036fcaf68638429666c0550038f04fa27d576c5cb352497876f3a85c18602b878db495f0fb608f6dd5e3fe586a964f83a114882e6b0118a3e2383462a8544fb4fc0c15f1376907e2dd82e3b9413205f8226b7c9b0d2caf2f67dd766b23940cb3b980abc4e084fcd94d495dc6ea92a054203c3e6c2d77c2e59d3ef92dd56340d2fa59a9934fb8d9a4e7d6814cb9ef972ab349075f3a1a6dc334673911b45d7dffd353cb0f746460b43ade164bbf27240cb05b50c26e61e3bf9ae203f4f0b04290b965c0e0e2240eded550c2e8ed0e5b7c6b8daf0000e289f5cdab8a5bebfdcb9878c113dbca101483f84e9631a8e9c4ecfe659d07c8a872355942880c4c99f0b44a8cec14ba4b0e55907fd46cfe49d696f8852d11931d0655ec7811bcc75fc9e671bd6d116389657fe13436befb8dd814a4d4a5f84dd26bc0ea68d07daea484f9c44b89377ea2fbd4712afa0a5f40a6d03b796de4529f9fac137325254634d1192451b500ffbe283da018c9336eaf0451491c3132f0260323e6db6f48ee627b3d6116fc1688930b736622f50306e57d7eb399a6270f6a52aa93b7a317d4e2e15a7af9f44d721ec65fcb663252ca16171fea3502000043736683dea8adc87d682ea1f9a25f9b2567855209c417f7af3861fbb2f0c47cce82f784bdf7eadd0ed93ae85592415dd9b136f7ef56fe07a2702d74dc65de98bd16607c342be9baf6db4639df06ccdd12e159eaeda112aa320ba9fb3caa22ff4235e6c12e6a11df90675f8ffd8f706a7e822cd337e8fe17245f762fd040a093b7fda27bf00dc09f0cb56e0de2c33fff487c272d9e18fd805c48ba41bc9d05efc6321a952bb00f911feddbe2d5acac117ca5a7923613df760056def246161cae2a728a928e0feb2dcce7814df8a79f286e7b80cc2b9617063acba4d1e77f93231d2caaef96907998ab4c013e583dc75bdb830686a75db90e3dee09d133523aa248383ab46ac5aab04b9c7930543d128154de413e7b6a616348658ea2761dabcccb33db21fc564ff6148dfded980fb06236abf7d1dee22ff0dcca9f4e3dc7fad27b4266cae0027c0b48380442ae2eb527ae0a20c5a5141afafe8a42ebd344ec521b4ab66dac7f2a947d2d82f21776399829f8ca13921b2ee82add74c930476126d55963e3118a8d7c8cc922e77b3cabec2165aa9381cce841ebbaaa1e44de1e8dffc9df5f2a09e9a529c96d1ea4853a77d646bec21dc6d707327fa881c40b5ed839e2b570de3c70213b9003e90a0469ecd602d7ab6f5cee24429fd6bf48f74c1a2ebb21c918f2ff090fff3a4f69135433b79d3a9344a4b817295167f7a2e991edc42becf3f644e8500281181be77ea35821d61bf21e52df2b880ef104cf5df7c7dad43d48146742cd3e5a4432b0e2060b1b50eefaa7252fa988e03a8b1e70af7e3d5de3be0948f7df7924ce855c5786ac28d2d762cb54c25f833ad1002b8583be394d73b18d00872884515e6905d1d905349b957ff1a2c9cd54c4137ab971d3167ee23d41459636c6db87b1dbf14373ea1f95c83b51f319e492436bce7c1be765bbe08dce9b17b3f09244e9c5d8d8cf787d37f82e9afe758f33cca9ae8368ef6ee1e58d1d863f42adb83153c285fb42fa9bac0745a3f33661212be549684677621a3c712afca0b0000000000000000cbd5ce0300000000b3e297bad5826e463e08fe8856b6f6d8ba4077573ff62d2a510ef4260f8fd77c1663466ec5ae6181787727b89580470209864733ce65cb44adb5008eaed6c69bb06908155847ea8e5b9433fb1d3c3e38d98a88dbb44f8f5d4bdc190ce60b9bff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045effe3e979d66c535373a81fb92e938c499c379d16647c230e585d38c367510483fac0768bcec322fa32e6b1e9968ab54e0c3e316c63ec4f38957b064b4ca92846ec93924d9bee3dcde3bba74dcdc9e3b88b0e59d5a6e97050b8de3dcce6a17ed7594cacee5a3619bff7e4bf25e1aa88c02c4566e0d625cec7b0687ba31071a032026b07c86cb340b7b6be8539074eed0adcd5fb0463e4ebe48497b877540087302073ade9f9acf2be1b4129f0e9db53916365d7152efb864443a579f0081bed9480a00d4d8883414f6206adf73228ac50b3a49c77c1916bff7ff41eb31364c5ec634c5b32c77d80757e45c287be35eab22047b7f8d62d0fb05ad4e6bb1777ec4d0de022549e204fd92722d3611ee436c9cc35891026ebe1c5ff663380ffa46359ee00b0318bf6f303e07a42fcb61e5a20554b896d31d014deaf1560490242dde43242dde020edd20e310e4410ab655897a5e8fbf17fbc55d9c41e28b92c099c9cfad6f4c07021d23005240139f713f80336406886a279a123583b90274d9dd41b6e71df7e2bd03049c656123aa070245fa562fb4a43febcc5305fc47e72a297dd30cd1d00e03e7248b8ba61e47783686c08745c79ec7f67e8e83ce1cd0e2dc269913dce13a6ca4cca6c3eb38230f46aa6494f3fa4db641946bc8751211cf44094b24353514efda33e65115113f28a434599e764286624662c0042295f935f9fb5e0d019432d3657eaa1ca0ee868c2d3d569f2d06e565b6887cbbddb087a1878efe347d35e2c2675a8691a22d12b622d0b0bb6d691d252fb240bb8e6422f610d6ee374abaeedbcc6b9e57135afc4996d83f3a16c59ecb3603a9bd6aaad9cf3644a176d8ff704bc561c1d3e201918b502dd5dd5277ce3e75e036d6b9315d7c4ed28a9fed96d8747d0087d87f8aaa896280d8d1fbeb73fd4faf94ee51f98a03c7e54d64df9c3500178a72c2b37eac59513d036cf25453a1798d1c4998e6cbe6fd8033a7f7f73f8198f0b75e6f8fb152fbd56cc1632d3eaf2a0c2614060a073c864777b8b6cab88111621220486b37cf54c083c2e36d2fff36764360c6cced2e9042d5073cc06689bb6167c219874c104d60d2b507119642655a34e5d8244480d743a0e6c447f7155d6fb55dd425bfeddaf59d1517da1f7cee21a39dbc915c5d3ad3cc50d31ab9b3da3f8257913da677338af3b461dd001f15d2c9ec919a11db73f5f12461a9bd3525ef1faa94e52cf12862597d9edffc73d9c7238afbeb4efed18b39f52eb7cd204159c6819300a44bac29d620c5a6511e7bd08789d7250829ce511b3efda2a0074d4282e0b129a81ffdbd8791dc7537b7906b081a45f417b0ea925677e69fe1cad628cff029ba904467f7a88b3de46d6120bbc4fb81117f5146ef29d8dc4991ef96e52dae85808b0c1835afc3a5a48a7a62a43048acffceac5a84242425d16a3469a8b8034f25f612b2fd74e0c3ae08554ba52d0afa8b45c30b253959f7f38e607bbad927ad4e22a8ce9d116c6ae0f115e17fc4cbfe43328969cee8847ea8e2929adbd0b7ddf05bf43a2167f0ee19fa061eae25548c77cfe7d483934735fa99a74aa3d7af6cf742338d1555f31537bdb77f6ffbf33a646e0d3a348d4fe64edfdd82abd8adca9085ff7817a934aae7467b74f6096bcba283ecc113c9e49b1285c51158690133f2dafe7a0b256ad42c04545949d7c91d441d7ba8aeddb52840ae6df6adea9598468dbbb45cd277545580532a380b59ec99ab379c7b8384aaf4b47883b86b7d33d739cce98fc3fd9fcbb44086c80ef47d3b73b6fe10ba51ed7c2d474e17c0e0d3f064e3ecdecbf4ff6ea8f013ecd4aeccbfe11a1f7c88a225282b742501e7509980a29d402812af11c6dece9312b790625e06981c5c7f2ec9df936bdb3115229c90a56dd4a9a96a9280df4ae3fa2f88dcbbf386139951b5193e452f66d2be64fbdd9a43b5fdb3bd0190fe78cecfdacf875fd7db0faa90667ae203c1384f1f1ab082960ae3b2588b064032c1120376f986a19a789c050892149c5f98a68d383b5eaddbee479eace8011af71b10f114da59f134b13fb7e13fcaef7c0f2c2e6bb5b27d9c89d9e57a3de07877342255779de7bae7bd36f5cd7e8267fa8403ffdbcb9da1d393994ecae3df5f2d90d065cab8d265ac5aa9606ba0dc67dbbfdc994968a0ab3acc37317d726289e1c0479e116ecf0338cc1188377270c46262e336bae59e3b7c17fe488abe8a3cee155072be2797b724660c564582db7e06a334114e5e650e24e59d219c1e52d7f44c856148c610650100000000000000000000000080ceadfb63b418289333a0d80f90de498507cf2b31d424c354e3016ac7f55c4a66ddaad20be524b4b43db04846102ff82333c6295035a42717093985466772303d4a8ed3550b21a0b45ab0b8bda6871d37b156bd1982cfc99f0fd010bf0e8b6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a9335956f221928a3069fffa3461047cc1f524a01ba904a753d42de46b864bfd05b108300dd6dbacc2f877bf398de8cc90260f0f0ae256b9710cf6b42b312e7e1aa195e8c860345d740677fb42dc99d60684476ea6d81b832567027f3aa7a3fb42ec91c5c5c38ec80e7ef2c07fb559104ec7511e5dc74cdafb58b61783b0031a02240a03cc9272b3ff4d9d6358fb5647e22b3b3c4603b69aa43667140a683f27290305b0f155eeb9ad56d1ae975b8ea8839518d851f680807126ee0223626e8ed8d10a0906391c56e8028341d145205a1f81f7046e288bdc8abd1f01b2a8a3cbf7fb2aebc3a4053f0f13d311511ae2f210f440c13b6292fda4252df60e0a7e7cc7a7f5031409d9ae11570d5fa9eeb803d64717dc926405c77446d8d0179535d4a427f9e503203c772ec34617657270e83db9924e3f90fde4c99022ab5c1e6ceb4c8fff1b7c0309bf9f3f7684ee437b08fa18b8e976941c7a18fac0a38a3bd1495cffcc2dcff00302d56e086e2b06c1001bccc3d76af5520c66583abbb45af625d184638d7eff4c030d325dae85c5317f9be7efecaf174ff5fc62a1900b586bed633b60ec2b89fba19ce62f1c4284865dc3feeeb3569914433ccfad58493b333f1a87d4e00f97f882e80d4b3242b0283fcc3e126adbf5095491908d3fb809616feff8d20edb2cf70f4b465064323956d23662b09967069d5b7f7dfe5bdcced4171453674c47ed599585c83367b97c10fc790b8b04ba0644181a26d5f07d51f93c8e1483f7b330f70ac37d664253a302ec926568ff751639b194b594b6c28423216a7d0b637286f6b51332dc75ff0d2a69c6934a9604a2fcb772ed8870097ecd982a2f82ac1ee6a97b361a0fc9a2c3d93ff80834c8073896048600909e4ad15e50f64b4b3e6761c01131122c23067347371f808e3934ba905126a41909dd5f975c80e74801e0ba564b4f2a6ba0a27364c860e2285e058c62dd3c92901a5542c4514867149d703e8ebda062cbd584352c5d72c588338b05401c394e104703d941087d336137029c6238bae2e25b87b60dc2c0b50493a52c4f51e57680d9e4c7e7ea739fdad8c98aadd174df3bc4fa6ee801c38e7c767593cba5ee22690b86cd7bde14318ec36c7dae322d5dad0aeeae7c25c3178442cf760801fc553d002efa9af9879fb2469485bed630a4b9847b6b0c0174c04affd268b86b235bfa24222ffa714be6e430a13e732a66e39e0b657f44cec537f97356c3f5b36cd5da612d85ef1fd7109e33140e4e8f836d3079ec4c33ad5f97cc618341478e42e3dad269ddea28bedd4d03103b4cf3359db7ae2b8d9e4b4d5cd870757772728668a688e297d0d944c25ee7aebef1b555f13386439d568ba9aa4ae33f77480ce9f3fc60a51aa83799ff23246c0bb049b41dd4d73b94475b6f091105340d16c460efb1ad1b73d9b41ff127dd94c7eaa1eb148a64f5d7690ed027d9fcd82e9e6255939ccd88e5811ea619de69fdea599ea8bc5b7c4e713ab7fb9da4d4e5189ed1785ee7dcc571593d5fc8acf098af4df47e41b937a3a3b60ba1a8b67668668cb81f2a03507eccea76b47c9d297b96dcb45bb7166e1c9ba7ee49d9649f695f66e3a60eb9cf6c4b4baddc2e5afb20fdcdf0495a4df758e0c4ce8eb601fbec3646bed30e39512c0daa568ea916e7044497944eb03cac86e4482734b94e449d8497026da4f4f2b2134a2ebad57a5d3bc01efbf378ba9274e4bf04b83ac6fe8f337975f6204884cd3011ae07a2b6405d3a1ba08354047e4ab86a30843aef47e4d73f6fd28009e32c4b778a826aaa705b8c4d83bc084539150f8e3c562ae771de269182b3357f630d40d4d1203e1b21f5945e070bc5437d50b5146256cafb0378958a97d61e4e5a4e19e4be01472e063cc841d0418dd8159cb155bcc8b35dbdf43822cc89e60fdb5d6e6e1046eccb034c91ce41ade9aab4df54a1d341d2d752a594f2408eb4527b87be4ad2c4f229855f4fe95f8fd5d4d324b7235c08fa60653b5ff1cbbfa75e4400ed4fbfafe1a9b7b044dbfa591d10016f27fbf2806fe85c1ee5cc9c4196ea8a2075ac233d17a20029ef0262ef9d8fda3eb27e0f998578866172015fa7dedbb7e25a3d08a63151b57b21cd0e5140b2fa7e79ba4039dcb613c3978da7e4eaaccaa39b4dbfce79b2caa6ae0ff63c36d167566df7e4d2c5d1ffbd648e83c755e8d40b2df6e133535433b8f17bc8317d2fdd3c5e9a65e174a919b319d56b1a11f7f09e48c9363a9d70358a60c08bdcd7f639d64e08e34259399908019b3fd22b2e0baca5fb7b2850930b8da74ff1086ecd6dd45910e7e5be549a999ee7d7187b6439e2d94c794dc156c184036e6d4cf337952c9f6426b335e5ad316245be8b23af1f3a73f3c67fb1f409911ac1f9b452098fadae1c06adcc99cd4b1db6c1870e", "ac525353ac6363656a", 0, 738873910, "30f9285bf94e0ea2061e7468bcf6df6ce045bd5a580b33743b54af400c6628c9"], + ["af6d3d5b0412d72e0cb3b2687ddee7992693fb6c8a8367913458a030e1beabaa7a62c7be2700000000066aac53526365200eceea4be0ea25b8ec680ef20f2648e96179b61391b5541bee42ed49d82804f0f9264903000000036aac51ffffffff5df5312394ecf49bdd3993ecea407640dce0b1d7328b83bbf7a2188ca5c8ebec02000000026aacffffffff7aff748c75c4a5684abcad20549860bc85a490e3d22cc4cf7ca75e039bee2de7030000000152ffffffff04f1949b0200000000025253c45b01040000000000eb4de000000000000165134cb20500000000085165525163ac53510000000002a53cdc040000000000000000000000004d7d97647b08b2e344f0fddf98ba8185b0696b11a40b569f2473cb2759e3f2128dae2106a815d0cbc84db101d1fd4673af936aecc6b9b1eaff328456502aee59460bb372e2d1feb26d30eb747ac27d487a37e36d7e46715182d15743d7afb7f800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e28a5c05c8797d15bbfdf6767c60d5ef5b512b0fcd3e1d59c6a16662837b8f977e80e5c4ed1d2c8c33840e006beb687a28c1f39b63fe4fb49ff021056b4560790b3de0f99740854c037b03224d3a8a18ba7d60c2f5431e334483855eb36afe8bec68c3d7025fc146109b0a087dfd442c319a5954a364e41251f1d2ad12677b12031f9448658402b44ecdafe8b54e57353b2fff7c615ed0ce96d68611f62286468c022d7e1c997d8d55b1cc7a8fef458b0a98f8d1b808c27c40f4ced0bcd6f31e6aaa0a01e50856e89f74efe6acff5052a9b00f4d8bd4b1220c8cdc13671f63d09b7e478d95d0797d0449cb47d343bf59175c658b4c68189d2a9809aad1f91106c281e702173da46c1708ad2e7c5142fcfccd4958e1e5dbdb0d738322d63f2711a321f186030d0b7c39dbbb805da3b876dd4f87c5a0c8101ed739d69cd976b18c5846b0160503188595a32c2e42d111b59a253969c47111ae5cf0467a7a9c76b21b1f69129110022ed31a80cc8d92ef3d8a7865d7b08803e5c359ecd84db919967455c3c5934969031ceb69ece9bbb398ccf30bc82e1d9e5554ec4d5b66ab1489fd975e7b928f3d80a0256c1657041b08800c66c1b2a1d94a639c00c24d08600ce25522abf049b69ff4175fa7c30f5654eec0dca68613a18b2b255fdb767a538e15a20fd15b0480c14016222c1bfa3dedaf1682cc48cee605979482f02f53f9fd27fd8dfd8332afa66aaed38995accf741665c065a440de1c0380bb1ba7f3bd2d40fe8b60f0e2e6062e0c6cd0a9d89e64281e00971af14b52d9fba9cff7a438cfa497b6c7a928f9a870d68af07de56f43e6a11b8c8b4869481951e9b30ae071c0e7fa1279edc20f5772bdac17e636d8bc333f7144ad33f343321700727a5afa18f573b79d8b3a526c0f4a242c6f1b8013a1cbcd48a0e03bee0c4af41831c2be8bfa75868457c38258799bc7dd95b445bfa87663a993d5e81510cd6b19ce4d1825b27a2575604b07a5dfa338746507b23d930ebd1988cf3989715c1e27dc4f3f594568e267e73349009c8f4d8e8d5a6c25781378eedf324ef6869099bf42980b82d5454cded10dbbeb326f24854122a953e5df29e8123e128bd6f570b4f2cbbb1a3964e0b2fbc88bc1ab3f1330f35fa6c9adac2201b8e130d2ecb587b39afb3ca682b50f8676659ce941dc67785736975ccbd570c1da1888c4f9be0c596355a6a3931477a0f497636cbe6496ae17fa3435d32746e229ce851e82efde594f2eed31e47a500f5b326d656d8fcd085c24de0b2a4c71b05366cc2e67fbc9fc7a07253337b62a78720602b9a725d6c7509ae8329b891d14d0ca86f8b75a1d5083b3156122446c5e14229a1d8b6ef9ecf4336019762090b0528922883b6d34d9a4108915bc9c8eece4d38372bb101b2482facdf3b8c3c23e74f8f3061378a02733592cfaf76951d5e8ae54c151f7a9464684abeb2f00c662669adb311c97a840b2346ad5d452c4b161d52bbc7c14307b82799bd658fdb275b3132ec421801eb697e1518f9c7f3b7329d59462cdfd674ca3bcec2009a3ff6b2d218bb69a2bb705a2450505b962a9e38eb6123458d9047a2da1256787e47d33bc062b03b77833fcdbb6c913332036d8ea28a6614b2c52c2075558da832dd9089d25ab6677a10f370e3a4c3b971ee5ac9426bcfd7dae455e8b0a5a280152225a76f00066128e020619610234047618b310c5706e7a60cfccc6d6b627acf9a97b44fff94e38de00d98dde55dc0aa0b962003662e83e51628f7f989cd54f74e6e85fff7e0f016a3d44063e9106aac39f960f8ee4bb17814c20780acb3782b2375b3b7e3e029d10101f5105545a5e3b718392e1de011737fa6f8f5dd06c7cd5349d4f9339e377f6d7c5cb5c7cfe34b7938b6b4fc4b21294116062d199a262bf4978dc2174f07fd21d7018fea4b8499fd137c253ce7e0a798f7079e2f6d6096490db2b62427fc56f851e284367f8d71e845ed6ee0c15bab6f671075b2efd44d2c9c97c5f8e8ed39ef70f6002bbc50fb04cbff6b6786485198e1e6ed0d114b7c742a816a834df4660710506510013052534ec0ef515319c587d61817a168fd6dac13095edbfb6d0f3edcbc95d6304a202a83e859c2bd591f7e514df274f7e5a28e32cb62d29a090987894d4f035f3963a1a66f9cf150e506bc18574ee99d95078ea2509c7e8d1affe8619a504e507c443698543611e514f37c1c867ce48194246d5128d2a57a6919f3776f60956ffeea1b1ca5b08e1a43e1268148402caab497a70c2e9c61c927f910000000000000000afc2760400000000bd3a5985fc7543f860bc033911742134429f327354011e958faf07e7617ded698799bc7da849d0bcb70b9cb1afa834720e3885bb32ce5fac5041e9c274d46509cac6351480646db3a88eefcc1d949fb3227952381f5546ee7ff821f67e471e6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d7bf52feabd645cbc80d37eb725ee648918357884087c0dce44713e7c41e2a6773c617eeb035ad8b1b5a8a8fe6ceda24e1708e9b1e0eaac2eef0554c119f6ccad5adeff657031bf553cb79185b7172ccd8d1145a9593e0a47632b55c35851048f7546cd43edd53d6b3cf0b4165082a4078ff80ca52958bf3bc77b8bd9af3833e0209d95a894698502d8c64adb914ec699b5354b2e137b87055a9e1b1999c6735cb0217286ed488ac2d167bc673a803e6826a73704494d6e00cf99fe18cf1d7256c490a02519b196d8e403a779fcb8fb2ec7b662e3e4e696b29d1386df377a939863c201aee018ebdcfa717bd63fa8891ce2be77d9aa67fa887b67af77a70136504d99f0313c396e9d5c78ea9ee6aa1570b3a3794a10e6cfe633125bcd0f98a58458fc50e021fea4406a5fc29e46315a513a13571fe9f5fe3444613a67569add30c75163cd20225920023439146e229dafad56c020f499e2c6904cf23196af1696d13839218200221e2abc7c06d38837ae88ddff8619fb0b6c8ed2296e05a0dcdc1f4155ee58d350324b967fcf87d6ac1fc6d776bad1b9135daf9790d5ba58ec4d856d5ac2fb5cd2e63fe84f0a5b995ceb325ae273cff8c7487cb5fa54ff63527d8c274efa94cb0574a18554f8bfbbfc2b8cdeb0ca6ed0d523bc83f43e7b78bda504534215fd4f2927991947d2d0d6a20f6e3d9eabf517038a847173d5a082a71ce5447b6f07e003d23346a352a643ea4e8dc19c6d0edf48ca2878d83b3011d73ff7620575bb8a3bda5578056883a0921912dfada7f21409c63ea9578428a001c5a0ee561d0ecb5c5e6a6e63afed6f6560262f43f0e77dac128f6348a85eae3b0bd58a4322bbf4144686a84d389685734be2dd843d50a209ced11c72c6b7d6f79c9cca0a5de85295a7795863c5c25b70639275707019c4d148d0fb69c45794164c2a2b1fe0048e5c13a829e144c40c1a5a512fc665c752553e678e6d74ce48b1c36441f22b5357ab818e332dbdc2edda0aa367b522e1acdb8daa248b40536622c8dcb0536be006a5d7d1282ea8f08f41f16b36eb691228d7787c9ab35556ce0342a04371433d34f2e3b7cab98a3fec4ac60d499705a93c103038798f30b08fb2ad65faef82917e3fc18e3553addcc0dd61eedff8db63f118884cde3665df2435a7385eca72d5b8485d75de6e2013e020dcd66f15cfbcd56e7009dde92be4041b8f595c7699def551423a1a7fc31da83d42eaa14508aef02872581a31e8a0732bdbdd41b16782a2ca0c7e4b00b5e1913d2c3900071f2e454aaf957a0561a783ae999da5727a34dc8601699f459f49c3a469a63cc5f8da9121bf2e3602aae0bad3ed1f934d526c57ea1aaf01ded10dbecace09269e6bf8aa1a43c29fddc250242cb18f39213eb838c3739e7407d35424aec0924271f941e4e8440dfc96b3b01c2ab27384efe7631bc6d8e5eefc3dd891ed0c6b0c8fac66550f79967e96c2b80edda01e9024cf2994ec806bfc041b447f903e0eacb5f39d1100ed2392068e7785700ffcab5cd97feff3d885f0b58d24b0c316473500b1e65e32d8fdfcc340731dae1264ecc66b4989b73526d71f3c5fc921b92076374fdac24e686148d8de8bcf1726b4a7d39a13829d682c57af699977276d2eefccdbbb6e778c09e7c52848cffea40b06964048f9b45892758a835d412ca846cd17fc0ee42075ee2e3e994aab51fa844dbf268b91b42b1d905cb40f663c437b03b661bb9a73f48802853e32991fd1231899638ed4a9aae25f83058992c5a2c80b3d2af71bdbd269dc4564ee3335758e3f97a2ddccd00094826ecdf1f57c41323bb6c66c262f0b1d2a7ef202ceef6efa73beb96c3608b1c21998a22f1040d979e45d423b68665e7edd261109bd844df8298e51fce949a71328da0952269ad22d0900b1db3c1c8805a6d5d03933d434be136b61d9aaa7c38a49417a01aa5b1bc0d730863c6980a753902a1841f4424c2ee2300caeed9836a0bbf4788110ce7ce7d2f0c2839fc2a7d04de49c05412a70e381c92d37b9acea139bae48179b24402f78a6429964b4b13d8c7cb2c0814563ddab7e1bb84b6c4abd4f209627aca35e4505a95135645c79b1d4976b48a8080043d079284a4e0bea227785697e62c4cd15ac3b83a9b7954cce386efd8ef6b9e6b83667506407808181c5412995edfbd83806fed6f0c8f1744e1b2b660e813349bc18f9754daa243aeb2103dd7b3aa4751bbb7be5fc9c7f625e10c7adcac1611a7ddd500f98c6cba327452c03f762d6654290e61e0a039f7e435aa8f0df8d7075ba878cdf723baf5656dc9675cf6f76501302e959c58e29256722f43ee24cb38078183371945fda6799d05ba0b69f41792cad80f053c25c6fedf443641434c92069c52dad98c410e88465e225108abae6665ad00089e0ea9890a", "", 3, -1676373295, "df3214ced4ecac15b188894cd9e79dfcb5524ad1865386f65d76e67d3e45777c"], + ["ff80ca1a0244f6e21d58ee50b3fc0043c4618b88a7a335414512ec9e0b1c91c858ecbd2dda020000000451655251011c1e88000199291ce0b7e1e3291219693796f16c4e840367bf0a87719b4adc5803136b0300000007525352516352acffffffff034e65ed03000000000365636accd63c04000000000763630063655352a2557800000000000752006300005152b9f05e16010000000000000000e43e2e010000000069c80f76bca6d574cd9439d55f10a78b5455a0bdfe09fd0767db4f84d5507ca6949abe81fd07d724a7b61ac71feaf41e864623f958bd9bf7f57c976d66758dcffb811a854376351d62a978f96ba9fac67109eaa0c93075aa8854ffb88748cc2300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000648ae957f42d4bce73009557803d8025d4bfeb6a06ef126fc62843f7e815c146d47da2f24763f6f927dbf978ef68bbcc3a8cdcc97e49397ae36d0e941d36eeba6d8bd176fdb2b2cdf730dc0225c6a9b6e6e389c5f220d797e7d150015adda08e131c27e1f9c07ee388c7aa96af8f1de36f91fe6d49b1c1d4c36400e7ca4c82ce032911cab28dc4e71e5b8c6168851dc8e4092e594d9d65a05be6079dd02f751e08021613a329b57e3942b25ccb0381046de5618e516a7e34f5d5752848c0b52a89720b06ae0e7d7787a023b8a611aaddbf83254f8df573c2b36e08e068b348153bc896a049dbba55f41f97c885c16389bb5b89cd55928b737d1b3ae36a9ac6de4461860225e52f25b6ed3333e1fb6347bcbe17c1e1440af819bc9a73e58ca65b767a69730216d149e397aa66235408fc36ee5c55b3ecf7e543c36c2c8acec586e4c57ee54502085227db29f2a34ba7ef30e429c76c5e42f09a6c3bd89e6e4dae3e4be5c7b5e80303ae7520b2157921a6400be40ef732e21b8f1f9d8c6473bb03c272c0be62435f030d2978226a1ecaa054177235d810c9967292ba4ae2376ef967a1ae77c20ffaa4f6c32df2e53aa80a3c3599bf8c8e6406875e0b9624cb9e9df92df85eb080f3d8867d290fa63368a51eacab05d71e4b93ede8a0fb5fbcd56dcd1f759ce15c3891ff60aae8612cafa112af1313b28a803da76031671a26d403e8aee155496dadf0253b0261411790510f1719e8d7966c347990f62bfec169f9eb08714e2bfd0696447c56ae5c60edb619a3d9aa7493bac381154faa251185705b47ae7cb6b6a37c8b3fd5bc0906122a51b49c762f293c1cf6b0ca6ebf84e2a8a28bbfb26a529e8dafe9f7b99ba25ea129767e1a200badb3772fada8c20eba13b942c203e38b78428186bfd93f17e4e0b50a3df94f03aa31600706b7c3433e04c609fe83bdb8cad9475af756d5aa37d54f06f5499f8f8908252d6e59e2e848c276be5acaba8550635646451b6b6a218d71fd8e173fbfd0fdcfc63f47a5ff51cf73e4f14c59b80874e3fe17ddba8e4cff788b4cd53f56c1e0bdea5bfd691636de0892c3c88974e2f4a46300a67603ad3923c59493eab4a29aba5fb31cdb6633df62049f891150677858c1ca75f1862ddf8a32e78c68015b87881b17510b3be4a484c543db6ae57f21346b89fe49fa37d922190c372e88bdaab432b6e48ba8124a766e83e5d8a16c8d9e3d14eeb8fdce291b6608d072882da0bd49a8854488fb79ec30ccab9ee54b6c1e38add4f439b685731c95990e7dfc983598d3d00392cb0a8cfab36b4a86fa0852b5b322cbe051fa82b9543edbda96376be2f42abb935598f4bdec16db430fcd5e15e1fab1cf23fff5e286f79157ba4778ec3ec42b1e1121de1ccf65a91926bea06bdb832e1b7a6846f56d9c6a595ce97837d2b19f3b60af623ddbc289eb78f9f6800b2db7aa660827b02c1d73ca7ee901b6c768814d2f9d46c323c0c933597fd3cea36b2224d581e054b1366bd83ad41110b6def480321c9f843674f920eec142b090df944c559b6ca8ff24adeae02f638e9ec9708115899a8a62cb2ffd19d3a814997e9a198fe8f5fde7b7b30ab8bf6c633648d1f8ef599613760b286ebc606486126c5a4223ee00ed91982fc3bb29f3ce4c2f47514a6841d2c34df3ddee8e4f76f8ab69bc0fb4d72f414ee467eec9d4533d1268e316a7f7a2ddf508656eef3ac7fd00d5e65ac2e6a393b2769e32cfa8bd7702cffe68ae48db780614258b794ca934a7603f0559ae82ec7f9b3cb142ef0b11e9592b084a19eae1ae121f26b6f554c8a735d29962893ac321ab368c916898deed53172d5a13e8d4a449c9684354092a52cd3c26ba48f1e82d4d01d0853eae85c60968b775d5d7769d931655fda6db27052e36dbe6cae252f23ff6b1ee44f13c2d197377204a039ab47bffe33bdad1db8a1f4bc9b941194773d28a247c0b3d31e5e6f11a4d21e2b85f735617e2a6ed89bcfa541f9cbc6e1d2fb1fdb7d1d95b4d8853c7d3c1629b6a0a2891b5dd0028611fd673f0fc8a11a1d98b5a29aebeaebddc2c5345eb42405b754b05452dd6f26400f91af33043832a1cb75549ce7a27c1ae845dc3bc5a82fc9d9467596c36102168fd2eaa5245d19477e636fea2daea3390bfeb2a620f47cd304ae0b799a7382851033d265f7d99ab704ec8be199993486c1ff371007e1dabf89ac912e6a20f5581a0ab097e44b7b8c8c0a891537361746f1212b22111ac43f1497e49464e02e9b1ae2c8f698e957cca01f277e0ab4736baa80b74e5c8e7438504130818f55c94349f49ee4c0da6754924f05d6a02832026deb856a3dae77319689cd310a998878a04b9ebbad6f3a1c6451206a56cece8d59b19ca60c1644a3f89824aef64a19f2b696cb8a0219c539abf34e999fc0d", "63635152655165", 0, 604360391, "ab9557ef7d197a6e3b26a79bdacf6fdcc6e6c0a5e409b56bad48cf1fc219da76"], + ["030000807082c40304187040e04f761bfb5f1efd2f42e461ed4939ccb97d7a918477638e7dc811d2f001000000025163384fa1cd78b5ff1763753791c8ff31e7be263df3b2b3a289f717944e31a329902f33c4f80200000004ac635351d147353c3e131ecbe666ee90e310948d5b21fd72c79071ed6ea5006dcd7a4755164ef61702000000076a6a520065ac657f80363f6021223db3b80a197fb2fd8da33ee6f54e5e98acec2849b517b94106ac2db46300000000008a44128504b0b7a20100000000096aac63526a000065acf6243a01000000000553515263004be62d030000000001ac2b92f801000000000900006351006a51ac52665ce3d50000000002dcdb7803000000000000000000000000152d02e1e6954b230dbe34483fc4f7e563bd8e11a9fc215b93d8ae826b0c3a9c8388282c21e17f36db6f9a8e790e4090a0c9abc81ffd8d066882d034e85e2dfed18dc05d62d0a9692169ead7e93bac387ae85d0d3082dbf2b88694cbe5ac57d600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000374efeeb4f994f26ef9600694b9345bb47c88828bae3bfafd36994d37cd5a0e3a4f6f9f17db7dd5c1be2ae3093efded1ded98532a9b403e41b8889ea3f8e6cff80a53a816edadc0a030619d428b558f090e1f10ef8ac0b813d2ed62bee8945b800b0efbb83ab052ce443663ddfe7edaf3bf09b62a0c7634d2b6f2674c9411304030e72eb8c9ca06dc4f0de19cb18ba59c330ddf2d191c187cd38e2e3555810b5fb0302756bbf3124018ccc7ab3ea7f97cd43e3fa6b4a9438e8b512ef38edf290474d0b046a62cd9a3bc42e6f60194d33b02a39a5230704803b4823eb94f59d7c07841ee758bb93639ccc2d34dd6621137f47d74a0d86cf1f1639f9f1a5d19bac8b92ce03293fbd694e7c41b29ca12d4389bd94cddefa7a53aac0252f606d9c0319057b70020c1d58c7989727844ae778bdb651eff7e49711c58527ef6e1890f919886f0edb0324ddc1e5a5432b205c7b90a1a8a36b9131221edde5e59aec915c87330330000f031cd082ff4c4deb3400837e0ba63e881eee6e77a98dd2d66a7fb49c00f3f7d239030e505dd878658b05d8732654c9fee346ab18f7b5539b0fbdd504f815cad00463db001f0a6ea7fb430dafac613bf0a804f6ff145ff22d921fe50f327135afb713472f593559b68101b0560bde221cb74d24a9e72c33a7154edf4dd358e65f304f57da0b318738918852ed41773a2228e0f0d3c65f51661302c33db732c447e9772e39b1f16057abc1ccc510ff59fa22af1c163f833a619c3dd6eb63a8ef58a22cff5deee82b5710dbb4b9d75359031db1675f7fdd839ad9d3a65fd4990bce6e3c2a2518c4956dad549190c8eb52806c45c860e0f960ee7151647483d60a586a2c5ae1ef36df07098ce42e7e64534a18093d16768e9e4e799b3c795fc4138d193a1aa3173d53168bc501fa45dab12590d5ffe89471e4830380440852c6d9f58a4e61f510a4fb2fc50575aa18d8648b3659f4be2f1b34005573e29131b51f94da993894e67560086c7d68eccba68b3e68c2b51a59794ecf4f959455b6f3d2ed8c6488c42ce101c09676ea2f6e090cd147ac83af879cd64cefc6f2197025cbb929a94b7af36fc078dbda0c32fbbb723164968d94a48f2e6cbcf055e80190eda91b04f9bf7cbe7e18a96fd9e26b4c527280180cc3c7efe722a04ba80cd810585d484fe89d884eb1c1be7eef637c8e41dc0460916071eb7fb80341fe03e69d8bd1ed9259ca31d9e1984fde6791efd8d6c54ee964ee38025875bec0d03ef683c47051669143e08faabc111a8b9ef715780076f0b345f17519b5beb76e7aeef61867d1b751ef734ad1b75bb820034381765ffa2e7685fc64150dd598d0a3b3849bb50b499642395ca777c76da65cade0af564f05cb538d453331e786cc5a5428d148f5d7179f9b3b212f20de66fcd077fbae1666d8b2cddc80cbe60df3e6532f917453ca3783fd0524f486f872f17e14fcb39b7076d5489c3acc21c479a63e8b396218e1cea79970bd1fb2799140f814cfddb6b5ef5a93768f7cd538b1376815d6f72e8f4aae5c3be8be59823d1fce39c6abba569f4292d1d77df7922a46e241864d0c0e4813f3836590e3af1bd7cb09768643dc27410aca589ca539a8a31e57b611e66cdde061e123a66600e333ec9911e6b5c4ff2db95293e4cf17a1b1491386174a2e561e411eba2a4fca647f6afebfa13c0a249d1687cd23619c7aaf86ebc201ab96b0e7465db523109a301ebed5143e8448953ac230a0db3f6be9bb65ab1196c72edd88a4019e2b6304127f124027cb2379a9e63c81ecccc35fa5e6ca6360322d1e7bcf53d5443a12bc8e02c5fc6501305ae63d456a4f1aea30634fe2b3eb60da4c839c8682906a6f46cf48a8b907475ed5cc15a4a67836a5852b22365de80e0436191e2a0548b4e09471d50166ad5f95cc6375f52d95356b1b400b70244a608d3aec5c8471d7eabb9a9ad1e95cbd989cd36a344fb3d8be89c04f2007375ba557b6b6b80874e3191fdff987c91514c2aa594bb08561744f484913c1733dff93f92be9f5aafd6e11bb4770366baa653ffb208f06514fd055fa1bbce8ef847d24f67d764163564f94b591fefe0e6940e7724386bf1e081aaf7d1980096ace3335048865d19afada46a6ce332e5cd7dff583f0810ebfca6512ee44386d3350dde556c3b441c625ab8cbc4ca0beb425dfee105fde3aec7c2327c9dc28b29731a1aa0e329b5bf2e1cec7013cda536616ef3e25dc7842acae12879027d68875fd4334d0761a08587ae098ce04d805607473dd933b907900000000000000001b654f04000000007836eedfda3fa7298327262cab6caaadf3ede21598d5dccd15f351f06ff10e4028c7dcaca63018c86e829aea62ab7c310edd881c6881e2ae49ef2d7036d5d0e302113e22e5bb54cd8ef8e8775310eae7bb9876f3632fb8cdd5eb6516e6f987830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087721f4271f679f0b9681c7703837e79039e5000a1eef29b86b609172e573e0ef29cbca5917322593b3a2bb91ce8e4e53b5dd8a0d8c579797df28ae5d0a19c8e002579c04dedd0925cd621a08784ed66a2857f9134d317289b849902d90721c6585a87e9dc3f9ee503fd1e6649f0729620a45db941a36a554b48314d6688110b0313872a94166208fbeedef9f3be14f5cbe21a550b9acab9885df30c47a92d489f020a61a1a29c9888bee80dd4c2b06ff95dfaca7535168641d12cf7331dc9e7ad240b0863d46daa1800a1a072287991a1eea45085865fa86b284b48ce58d45b52c972992e978b209de855ea882e53395db9bfb904cfb750b78a47c033fee3642be0650315fe6b337a3be7b06de18ba045f8291a7409689992a1838a4f2341875946c45d0316895b95f288732d87791242ccf4f15190e3a70baf46b50cb30519b5bf801476031f64ce738005f458378c2a4ea6f9858fac3adce9a94c2ddd3dbcbb2db65e35a40316ce4c6e6538a41a0c759074a4de9729578b38e990224d46afb15b459b7f5406030b06aaa1208b63b0f1b91f3708807dcf03a6a5bfa37b005a97d00ec3c6f4d27b5fc67a924b71a43d11be3aa1705edbb81c0b73fb390cb421112c8c645197d5e24748547bbccaa476f57041a8b7a527a95d11d3807c24356031b74e1c6496937ce164d36856bbabecd0b55800e4103aa9db15f5f0cdc0d5b3f72ab27aad4ba4ee9a355a59430a6929c873d9f114e49d6e8fc2d96671346dab24248a4aeec730bdad150968024d0869fea11dfdce7e517e117b6789b6678168c4e29f8740b0f3a24069a3d16f4c43f7da256c1b2e5a1fee386a54d59c04c1fd5b4d960d530850a5396c167d77b04a3b80fa41792dbedd95353263fde1a1fce57f925bc1a9b7f3ed81a045c1a255b84703ad1254f72439723e8993f72e7ca56f3580c1ee06a8f748f08cba4645b8dd2ac6a1436b498b87900ca991c0a31ca1ee9fae7125d2716d76687be24d7e8e6c08ec8fed23877abdb4412e5514612279cbf8ce4f5314fe0ea2ba07bd1e350fb2b745989b7894289aa5c12fdfa3ba3a96999d7d483aa6e8978338921eb5840c59d37e0c6546a503a13ff3dc9956b68a58f2210ebc96410e7b6764063be8a7701a2aa4cc21c83692cd2fb19c99a1fb7185a500920414845ce2ea165e53d79e673ba57975ace06f0f60ec1d1ce492ea96c2285d30a14a27fe63430a768db6886ca7cf0a07568561b19c6247b9532f6b399efbd8644e3917838c9d179e292f2018c7b4fe5780b0012eb63c755c0cb0de8b7459e246e4d21ce95ffbdc73c5786788e7fd68a2d57471e69bab2d06a642b5a12e88d7618572e6febbde894c24e468815e7467c13f519808a919dc71868c6528aee5a6a641bc2112cb1aa12841c41b61627786530d8b71c2ad0fefbefbe973c42c030f88aac8600b2b15853a3738a29f8c0e05f4a25a6ece6a47be96c0e9edab90629a43b4954d415bd6c149c88e79b0cc13480fbe4e90565feab9a9a57ed19c54ddde1b41ccb3dbbfd6ce658166fbda1b3a05f770f5c9a4dc224ea1a899ef6d90dd221cab8d2fee38a76534545fc5ece1d9fa5d1ab2f3322027ad4b5794aec65357536a9b79916e97e7a00eb2c941a6d547bf56620d333af590b9e3b7165b18092a71660ab573b83ffe2a7d1cb00cc9e94fb7890328010cb6c0b2a6942fcdc533725a7a21f31268775c61916ed3c0d853a3096fa3225de3b0c2fc137e7cb1a733c4dcc1ef7d2991fe39f29b8a56d35d4797971eb39419ba8425e5351ae562944facb0a36708423ff46ea00878b1b510479b1a44ef1c43f1b291968c4b605dff3f7e595ccda8758aac76f2a901342cd90d47c877b3598fc3efbadf8b5f709be6e6b1277022e96897782bc776918ea75a4fd63838935d1ea76c36e56af57268bd8789c3f71edbe83af246555d83dd753abcf3eaa5861163a618ab6ddd51df0a133fb81e45ea258b7bd75dc89069efa0be5f8302569b1d90760b902c5ed7a64fc8ff65200259502c7a4ec29d5468dfea94947e90e283264b8fc3448b0092d74048cb9e19d6e270399b4d565ea0130b5dca24dfa96697071e883c1de05af34a94a134d6c44f7f61149271f8ebb72b490741e072c83a830c8e8e2bf6eef9c4fc33b1fd7e4113efd268781297e1d648e12b38ec0ac05d758e531f37ffdf02f843f2cfeee368a59f03aa1d212c23422e5e1e2e6ba4d8c33f7d25bf32ab5c6dc2c2b5708ed5f74da801c3a1264b984b9b6ad4f48179b4ebb45ff612eefff534ab6bebff63b589e21e7a14dd02b32d79ac77d2a191e8ea3999e202847e7a77a3f36300dfb530ecc16c3e2bfd9b30a91b14555c44962dc41653f974d0cd936f64399fce3a94a58a55e79e31d5160a6765c7da9fd35920b893fc7bb5219f864901", "005153", 2, 1183617490, "ccf08f90e2d4a2becb043a414db48b7ff20c422a1b1d78bdb4b20ce564cc6d4b"], + ["030000807082c403033446fd4a2c1f8c326061c6b23f54a3640e62f82538c8e4b3dff165a364ad62c9000000000800ac52526a6353acffffffff3261850efbf155fc721a35112af7f46bc35a8748445b3fbf81ae9827aed70a95000000000353ac535137a8c83fd72dec9c455a2ffc03c0c453c4d1e3d5658b7efa1f71e5439a017208ab5501030000000951636500636a635351ffffffff01caab320200000000036500530000000000000000012d82ec000000000000000000000000006790b0bf23183fee85cf3511b935c83b9119155bbf239fa47d1942720280dfde4831c2c5a8dbfbc166ce68401b4a9bbdb1188d2511c952f2f916ccb21d761e419b501ade85f9c3562676e7927d6661d09bd537029b8379466311d523389ae06f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b54942da9769aa656b7441a873a6da7c47fc52d18a1f313051e5bd19a68279d2e60c52c85d97117331399f7073afcb42da38e4ebcb7e8dab2d109b16a1835c75981d983c07102253844f44f4936d40d63f76db74a6960cd9f15364284639d527001207c3ffe30ef1c0e2015e2c85c7340d5cd321287eb24e86cde51dce09325a030da2045990d8ce49ed4c88edfeaa31f5dcb8cec346125abba8852ea62dd36164021946af402226c82c67fb3ed2abb7d4041072b7f9e5732ba61d8527c4b50ce1160a076de9c083398ec47e01ac05ccf893c794928f4fd50100616a86417d553a6e31b93d671986cfe2c8e452e2358f434196d4b2081724fdd6c994825c9baa0df3120226979ca0ba3e5526a567d70fe634f4eb8763d39942fcaa1450643c1293da4fdf030e12320b962f649dee0e5abd042cd2cb1cdc2b514082c8bd1b7b9c74545f6916030122ca9d0dac8b07daef09e9e4d445f094860bc70812362508a09ced4220cad60210b63daa221b2de1142c53a067ea0744572ccc33bc0dd76a3e50b03db4d7cfba020e493a099c72467f532fcd009b413849163b22680a89c93d01d22964cfb274c454d8031ef43a7ca1cdb625954ebd3b9374d3e66613a5164e3230b35a98c7314978cfb7d0d0a85a094821d9e0610df814871cd2ac9f83d1addec0bb4b78a6793b0a9579f5456d37c12746aca35870890104ec3f8260f46e0d166b623aebcbc0d1b6b7a170f59999653398cca776d3d17f6d752aa13c095128abb77a35663228a3cb32bd2f0909694f0d4dd13597941681c14251d975ff282689867be2e02b51f24f90de558aecc1ace8f6a1a71d7c1e7c4a72201eab9802e20f4ee27270de542f043f7b7ed615e03b124a9cedd063dd6325fac5e83f32c21ac5d7019ce1f0ba1fd50b0c6a5958c854b74d5734f2815a13d1feca320e7c1c65683139acdecef694ab8c27d5c807b81ba1b5fc35961e309e0eca11ba7d51a0ca1dcc22024a9731d01e0719136c9c96355ab06a3f141147ef36a6f53871ac608c96802e8f699a0ca062cf22de0bc26134763c1d3ce33687d947c49ac572f05a45dc475d09db1284ce67cdcee0a751a4807066426295dfb7795f8afd54acd1991b594dbe66969e9019b8d34f6f4594f39423b778e0b65c44212b60ce9609ce03a50543beff4b3bd4fba00fc9470efe9db1b9abf2a34c119673a94b9d53e2d3091e2689075af831b62a65eebef80e4aed0a4f4585bf448609d2e6a28411349ee6c5202ed12fcf80a079d802a1f0fd03ef3d9bf2ae9d97cbe705b45f5a8b20d7314e3c844963a3e8930aa2cfeb7eddfa6adf9699552493fe91b426a9f501505081371ff72beb63d1a3027afc47250315e001f65fa31075125c252b8f09dcbb749080c8888fe69fe07a0dbd36de1dfcabd9553a853f582ff784d083c5df9c86a419c183981498089989a0a7cfd25c1483b447e510c76d5045959c94daafd694a6ee066936b9494dd774b3b876a934f133d45be4caea5feee8d642f4aded05fc83ec5753508056af32cfbdbc66e499c1d58c231e4466d5b75d67fceb35358d7383ce5af5a9606b2c1fa1b3b24c2b95f6f5e9d20ad78668f042f926a03a941d2d5105e6e80ff371c1b721a59d547b2abfe5b17429d8f8d2f518cc88e9837b714bb149115393a1d56c4e5ce1d4024ae35c569b87b8b51f86421c86791ae3901c7080e8ea4610ee85487b236470bc0473b891e8e67497b8c5a17a589e368783f249f3d7c4f887ef1bc69d1d9502e8f78d16e6c6ffc0c1268f502e63ae245871ea911bf555a9bfa59b7b2ec27eb066711db596ece599f6ab728a0d0a5e48bfefc1bc0f318b76d042f55b9c402f8ff2782d426354b53e86b218d549cec674a48236558d00ecf09ff599177f0cafec6b2a3ab2d6eb58efbee917cd3e339cc6f40e5231b2c883d7cab6a77fbdf5e06d40b325c11fc121b57b68d81c936119707f4a7f2ba3cbff526a47c7a7ad1831599d911df69f0fcfecac8b322ed422e3dd10523a53ed4244f8f61a2734280b6dec55705528d0cd25015a3d951cbca9a848dfa4bb8808ea024ea37492fadb8531abaa9bb07ddd5e454baf897c45f659f77704539937593dffa67a1949112ef0ff88f4579ef6f2a18ac80a55df65b0eae659398b44433ab628a0afef686adef54c6e55a96432afe6192cb9128edb224a3a957ccf74e88c36708004a63fd57cf0caeaacaebb5224a8ed42e60a0715e8b7b2100851ae9ce0abb69fce03b9f425c1f9b062f1c97c3f8f31be9d2eee2b482f5ee69665b92d9d7b18962b0abe017d44f876719077d1856d818db54e6bb1cb960910dcb44c9368aec28508a380a83c1540ba2f401d49d6bb9f75fb803ff846519a928fd7d9a1fe5bd4951cef147a6d1eaa120dd68cb709c9ae8ba99db4f4e6309cf70b", "6aac63515251", 1, 1130282694, "6823d4154db9290677f51aa1950f9beec1c6378c6203625028c8d7f2cff6ceec"], + ["030000807082c40303d69cb8ae36588bd6bba239a3962bacf31ef712948460d9f06dead409cba81ea20200000006515151ac6a65ffffffffd8ae81085a04eef745de366bc8911ee6ea2448aeaf21ade462a6c0977c39fbc50200000008526a6500ac63ac52ffffffffb63af7754e56d4e0d8740b5cfb5c155a74c225f3ca18d27a8e4c11cff77e064101000000025152ffffffff01686d350200000000035153654eeab87a69ca72a003118a0e05000000000000000000000000477606f844e0ecab75b18530ac6e4bf0b59d308fa56a7cb60e4e21e0db9d3894fb063fbad412ae603a997c5820d39d82cac1c3f503987db9c5f6ddca677a0f0147bc9706cbb516b6dce1b3c75ec1f961adc1d8ef812537bb3a100f01f3e86cfd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b3187b49986801d8f91bc30323ddc4384d24299674ff655cd7b7ae1dcc2ede30657dbfa0ccf5a887435e708518a16dfa4ce1f860908d0771b5f170845ab3d746204bb3a243c09eaf49f192abd551b0c643a30ad0b30d119e9a238a4508e65135e64f0ee1541dab96649e086d6bcb83b6976a4bfa10150ef9615e46d4d0a409f0310e618fa090c2d94aca17ea9c51ee39b24e49e014a550eaf2ebff3aa30e268d50323f7ba72f02fc722029b672626c620cf93c35b862a239cd3af993dafaa10e1d10b00d317c4e75006da6c2d74163e6668f172b0855df49e4eac0e4e56ad6409806c470ea4c1ded7c2939316df416271a61d789e3477a4b3c72a669e3cebe460ed620222faecc15d02748e69b822037d582b69e6ff597c82585dba53745036eecb10a30315e014a5e6a899475758ee292c18df64e7e02c913c1795926cc2bab0094118c902027b220b9849c7e5d7206a9e8de2c97c83768b61650462a9bfe34cef4fdf33af0311433f6797a923677b1a1de1b0f28e8881d41dfa87110485cc348bc2e958c542031ab273059932471d615fb7415bc85c6902bd51a4fd8182c883fd3daa99aad893653a3e0ee970aa1be9150e738cf2a84660c01517b16d78d805959a19d78a5293edb4750d4b7cbf590f4d6e244302d5b07f5a25cca8bce0120b3167fffe02bbe02562144f39ab37ef9251c27021ae6d51fe6583df06030025db13c25d5b2711b76a58171a97fa23db67a962ca2c2b9774005159bd6819348a7b69d443cc8eb4dcdb3cd51177d107fd924f1582e3a615572a0fa256049d19b807aab2776e7d7fe3d03deecc268689f35a61823e8ef7dfcc6ea8c83b0e100471e198ad1d926a8c003b4d695243a11e7317dbb4cbfddf6c24f111f866d6340776a9119aa8cf4d925dc24c501359a560344946e9e15e8c9f195d21c0aa9d017629f1ce6c5a4de19494a612e7725a75193d905f4878200fe03f20886a294b135d6331e738d4052d413e12a30d1b3b96d62aa78d59f5d4f92456998278631206cf1a233c92c9be818f8e59c96b0158a0ac284ed65149685a70ce44986a54153d762b5863dea80689b03be253a8ea54188c6ae28696a4abf4768666b35040a1c9fe5fa2316d9cdd994f2336b0b37141461d17412f4cccc8158352d27591dbbcf281d85272c6186f19a161b901db03b859c567d9ef18369c7a2b6312b9d2ed70d3f745cbe82aca5dbb777ca434a58df038e94a49f3b89cc40d715cc49b2e4a7446b7a9b507b0757b8a6a9ded34de83f93abff5aa416a3b509a7f0ce7b4bc7e7b5ae8c2da7fda402d56eab2da83fda399850e9809f2705fc318c6ef0f005abae35fd5a433d40776022adebb0359af0c924912001aefc14737039aa308a807652139f85de341de538e8a9be32c36020498e9898543d0c72c5e0134234119232075d335af51d041f811bb539c44534ce8258c1eff4a85d40466dc9db7f0c3440b80902b0acaf0c11fa2c15a4c4b32fed4a610600992dbe0745556172d91560ae32ffb26d4c3f3ca421901e51763d8ed0142325cff953f5280e8852614d6be1279b56bfc39188548be425923b8b2c90e458b93c9e261115082556844d90540ece6685342cc94646ffa6db6e5fa3481724b4148442ff58c321855139749f8df36a02eeed1e7b1ded2ea4a679f480f7f12a42439e9c84343b4448d2ea8e0d8bd2f8c5a911b93f42f583422d0802169ec78d1ec6b3b7a9e571534512faf435e06cb5d537a51bda4a7a3f63bec759111def2ecefe89920f1176d7227e30b1730b0c99b11c923ad57b291038ab4434a2df40447b278c269cec3681eb6b6501f53e96f01dc815eec588c1d327dac901a840324221a18c299d38064254588086bb7efa8bcd6b7c6319e10c71970b5f7d439080905eaa01147e6c2ebda760b714efb604abb33fc0582ba1427c0bc338eaed1c222482c5e4dac4875246c6f2e38680e56d599fdbbe197e0d56eeb0f004d043348a96cd6122cc9c1957dc1209edc7b4794bb6c10d7d09d4c76086101ea0e7fd8d93072e8b03199228e6be053852a82284a6927372819130985eba9a943fc9c48da20f2c0d7dc7d3a6f965e680cff08f7bd1b057b3bbb294c929c18dc82e27dae823f2e33128a625b9720386af96416b5c45d45eb59db48942dfd789424ae4ce8df32eed5e8ce93515bd9f0bdf532786051e5552d289417d0b08ceb7f24db0ed6e4793afe6237a366bd0f4b8762608d8df55364f197fe35d1c2a3aae45c6f6b80bec3f8f6e43d0ba2d16fc31b4883dfd416736347010000000000000000000000006517881ab91360983e39e3bc00928e05a17b8d28fa701b1e275b522115760fbf353f66c3964cdada279f495f824af3fd4d1151402d79e4a13aa9bac661a81edb0d2f98a12a5d3249ab9762e40d7dbf887ba9455d7dea2f930105181c8fb2b67f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063657f8b2d25c9be0cadd13db0326642c47c617281977d5275523f82786230933da8bad669fddc0585ce23dcafc62e7bc2621704fcf5035d2045e3b451ceef6f276d2fcfe18afb2e1420e8f8dcc4832497a59d40e3a6dda089366b1d5a1a35987af2a44dc37ba8ff7e85374e9c70483e689b15240fa3124a64f044c62bb6d04f030b0cfccbc017bcc441cc8515798c9affd45305aab00a63014d33b281685d8681030a4a86d5fc6c60dfe6cef4ef81ef55005c1d0bc79b4d4f724225f3c903de43a10a03ab3059ab3e3155ed9e9670aa747ca4fdef5fbc663ce489da1700ae6253a27d7b1d07fd57d382c6b798d7a0e5d9690c50e492988108b4cd04c5f1186c6cb17f022d0ef44680fdd0728edbea703edc6d4a0338ece04857ab2e709d29934be15a3f032964aa7a554c25b04fd0457a39df97e0eec20b222b6f9334e36bccb3d2fe76f3030bf6ac77a11fef4f3ea9044f8d5293031774d7ee6767a9f0f85726f5641a7fd903093bcfe48ee146e942c1d67b37119317aabfe29faba9a5a65db1fc63d8de518e0324c07a0e65ed3f2e2fd1e4c97864606b7c0b164d588dd2f14855851f36851b1265e17ceaa5580dffa473f7bba61e97f03b19f580bdd99a7d2a9c666f7e8f0ff880d521bd62cfe7c5529ba83350e2349b5f8ff8461529aae2fa6d9448ad6af3751b984dbe0af3c0b461121bcf75ff4dbf58d788d1fdcf09f249215b54ee34225910b5324b0e7682c082f5b14294574b35520b0b8cf3c8fdac904e4d01cd7bcae694fdc5bc8e89631de124ac1d83dc1c6ec5ad049c8b978d2089111368ea52c3839c2406d151bd370aaed6ad761612a3296b7398001207b5c126d79b48a265cdf64f0600751530d4bd08ac3fbdf725ec4284e6a43aee4cb1130a9fd647f1b31778727c7716f6b118b1c171a8323c33617d5c81faffb506da48cf85619da0e373ccfae51255f3a76caa9db011bb84a8dbb2fa18d88bc27a138443f8bc7b7f68c172668db9d9608e17952eea7d2f7be1b593b6afe52a95e05d2b4212a8b9956a1f8b578257e7650a1777dbc98470a332d5be1938464f1d8d8ab8310fb62d2e597cf421b4785187bd6e834345ce6b5f7dbf1fcfb309728b732964d79baf47b8d76c0d3bf28a3f36f16b6be684fdfb06307bedaa651c18e7b05d44413a08e126cfc98bed6ff929f4dd0232a6dbe2cd3d40b8b2cfd1bef1dba02787dd2a11d6c82c8710f65a5354456b1d3fdd5ee81f3f7332223b9d29ede39cc10dcd189a67249244c63e3a0a8b1b6668f9757a8f8dc0ce0be138b279208cc5cedb58143cd6719e57d37df74899f876a25637dc0873c87c9a6d8ee555a501b29949c8ed2e71dd0a04ea1f17280138d3962d7924585abc031b04522cb3c0235ef9d39a3c1068468ee9bca387736afca688c2d7ea6001e590ce83abb4db4244bde5dcaa2667772e71c1939727017d66108a55eb43adb2c139aa0c4328964bb6790f6edfd49cfdb87a294887b6a53c6dee779b57b47962974e21022e48b0cae4c74f07540955af48f1be1d76c8f7a35985c246c07474117bb2f3efdc11e07646d411e145a1746689df88fcc623bbfb74eeb6775e0d9c3e2345aa18036fd92567e34c3c9da9dcad9789be442dc819e81fcf52c1993f3780d18e53fa030362fb796fde26e43e7d3fe078fd8c09cdb739afb9d3af15f83f0eace93ee643d4812809887e90bd1efe8825971faf3bcd4e91f501327be7df9f90da6b77811d58734c7cbe8168050cdda41293567a257ddfc4941dd51eca897a1b67120b8123a930a481cbd0051a9b7eda3f28325da3ae74abd419778e0b1bd0f247a775a785d03069950a7a1e8f9e15e883206e90df894c6693f51363e47938420a167d9c8ac5f6830e51cf2e6eaa5dcdcee7b33206da201cc8b4a14e2252f26e480e828c36830b999c609e70341832a4700855345196865da5511a6c22507a018f3d74e0d612e18a0abc9af8f048e1859694937aee0f1e35961784001ea17ee7751d7c113d8cf2b726b39e7ab4f4a502831776c0d729febafb9056eb83c256c6774f9ae2c3ad6cbfcb79d8955121fb54a211fb0a53f32bee2b635c8fb2d24a4383d1529fbae1f7b14f72643d260fadaf74da673fad210d7cc43eaa107e2689734aadf23dcd21fbe0ca0bf3ce097fb97d847dec0ca534a4a8b27f81f75fe21155d37cde4450f973d951b10c3ebe31a2535f0e101496c834ab7d1323cab4694159d1e57d55676e1da86636be060aac449225c9026e88a3e624ed186fed081940e40e93b319b8cc0000000000000000e831010100000000bea416398057f6eb4b085bc866a440f0d35c1136a17b6457eca4042fbc505fc196f50d87ae52f400441a7540fdfca796714289bf362a5bbdc5aba81a1de085b1529a76275af93c5f48adda342970cbc20ce459f7f5ed961fcff2102cc593b84d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041c107816d76c630a645cb073a47bdffebe461236f2ed9d76c0835d7addd3225d638c5ea043bc8ca87809ab71bf2f2aa88dd34d79f4d6ea9d8fec34f5cfe4c3d18073e61c32691a30c3d503d38b5dd27f87f31622a279d0238a13fd3e92d162786fd69e5ed7e0e1fd9826db7e6263f1f12e13c2c4cd239c54c7aa2b4cabc05d4022cd512b798a4ae33e46301d9e04b650e533b68e44555c4ff176c59b17d92bc4a0302137b83120adf226c322d2a539b280158d29f2d60b3be3d60e79613afe944c40b047fccbc97c7b85981bc1f45a93677a06e23a629ce3056c3a03666397a4b86c6cf8a694eb8d9fc14adece71b35f5adaeb5d6f86de3d206a72c718c2d91eccc6a0308d01151b486cfc5282091c372a41d3d5326ba936035ac285061b439b4f2b2750316339ed13601ed4f159c992b3695ac236bb58f07cfb7ae58e686e339471f025e0307e62752e1a250681428cbd85ab72a7f238d20c676c11b92e8a411b66b67aed3021f20f8fba8c5de7d8aa2e919718cbc2106b978f07dabd01895ca25b9aa3371ae03126831c9c65f604e2ed5360c8cd2eac90438423937aabc44dfdde33b299dd766a011cd012dd74bd9c81372b1fbdfd27cc719008d4b1d8f6c99b17e9a4cec29fb65f093482bf40400a8d3397678d7afc0333a2cd39cde90fe54080745419665ee500453335338d4aa36dcb11714b39e65b7850e0ef796fb5dd865da285317e1057c2c208ceec8ac9f22976f114e1563f478fe9f40565bde290a243c47e3087e1beaa350bfde43096d7355a23992566aec3c4d4bfdf4464a5a6621eb0b115a13222a76bd7e1633879113d4709d120ef02941791ec4de69e95d50a6ed2c911410c0eb00a1ccbeab254ac1e3121175c19ff33fefd560ed26eabeea36c56b66e623f4e51faeb848b27f54624c0e95afa199afca06d9ffac7cd16f51c4c63dc64bdbaff3dbf2c15de773f080646009f3ba69ba2a5f4556c69c7da1f6dfbb35de98ede6bc773fc41fdcb97273a8c44d3d09229039d6d37f73b5f8fbb3099804b89fe1f3026c2d8b3e8a080a65adf0991bd0b5ac83f8f55776fb8c824b1389e4cb8619e402aad77628445adfff66a1f8427dcd55201b5d2cf7c014f001f38c7c2d15bc18946fad8de49133338c12b7bffd39daa62bfd1d111ee3c9adb29237105eafe989d8774d86ef53afdb3f752601223bea90a8139199a49d32cd7d309a722da443b6f2e5b038b52df16116c0a4edbc5f9c49d5d70914b516ebe0da490473794b24508ead6d177525de9ae2b842581f181f8efc58a935850a0be309cbca8bb0ce855a89951243d99e5bef17ba0f1e56fbfe0253364c4d78ab6c0c9d70cdf1c2859ff7380baeb316b03a553626a1c2ff457eb9f199aeb0eea963253d37d5153ff74402d518d2939bb4adf3d51027f7af32f3e65c44e91303f2a663f1b633134063ffadcfbb48f9959e2e68fff0ba80a73af3ef20c7f528aecc74b0aba51fa1003d55df7ec3c665db2c029a45abe196e2fbe5f713a43010efeeb2b64cc4f600c860f84a37a3844a40fcfcba730d88dcdeb704107cfb7c635616b2aff3fa3e2509557613d09d5ee9ca10be45d09106d947b2a4503b8d3659f9e7f70951b4436165cf2c9bb0916181e9a660afcd82429b2731b1bbd39efd1cef9416d8a950835f3e806c96114071e233c8ccfd68c5e14400f9378de097608dad3165d4f44a6eafb3fda22acd45ec7b39b3e002d79f8cad6374c214948b62e0c2aa8a0ece9c2ae1b992b471419552292e182d16a8cedd0f09c7c77e2be49afe1b998cdbf53615ed378a39bba7a09bc3332854f22be223f4e53694520b67046dbff56fb1af1f6ed9629f12490516d3ee6b6414bfb03869af35ddbe7cbec0249020232be49d5dd88c72fced5621dd16136f1ec71f57327c14c8ec4814b3422687b4dc19d64cf26e71d05f1b11c909a44c8804aff3233270db058cebecf600e5b8451b68f109230feb6a5f304b74d5404630bce72b53969d16b8099d24e583780ef042264e590364ae7322972587f0263e5c3b5dbb892992c4a6df76e350df82bf2270271c6ba4159656404e7f32992820934d27c2a0b1db9deb5c43b34ac69795879232ff88ca4fa902075b1aa39c13c7feaefd90c09f1fb414162a7f14a4cb245145d2ee8cbe62a17356a1a724346f5013c58db5eef50044b6af183067876fb9d38a6697a1639f59431b89b64687952759ba2ab225582649416448a7aeeb3e9c6ccf1f86462cd593530d2afd9114d5f2fa51bea3ac6d42a23f6d89746230e744b11d7049cccda6d8c94713950b5964f55acf9e91ac05a56b439c755c24deb8c2f1617422b6f1230bf9b93353f7ec764adfa5eca6e21183e3b6ab426c66763fe395c22a6aac7ac2e64f8db8268111cc1e0f9ef748993435eb5b0f294be107", "0065", 0, -2129456816, "08ac968a7ebc129999f6255ef5f79b925d9df8e60f4a521e2be3de3f38fdf882"], + ["030000807082c40304c3edff512c3211078f3592d09b2a164fb25f4df4d40cb32b8769ce5f3e8040aa0100000000ffffffffc0be5076d63b94ba3f18fb532ea34738fcfcbc91a03444f7ad9594b8d1caa0ce00000000085253ac5263525151439dd81591665a633be35ccf3116821ed6a0e594c063284da5a368ed4d72316cbe07b5f400000000065263ac6a520003bb5988b52563f2d6bd77c304d6fdce05624d94c2fbe550d2a94b1b2b10fe3e6de9f20701000000075265005152516341b7b83804f7cb7b000000000006635151ac53ace25fc8010000000005ac63ac6a63ade0bb010000000000aa07c70400000000000000000071ff1d8d030000000000000000caf08b0000000000417aa33d4194808a665e557fb9bdf454369b731631a584c8b8059771dd6b055c15632d4ecb3203a8619b20f5b8fce98c654cf3eb1cea36f3cd0e81b6252fbd24b2ff4183395c482415fdd8401ab6bd9bc192cbae128fc11a8000d870fb6487a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006ee0e7fa04cd958912737516b100825c10b146cff3f53bfb5324b5ad1c5e77020ed2cdff5bcfa4c0d5097b10caff25ac6564bb74445a16606e608c3ef73f689e19f161323be91e360e121dc74783c0338ae6f70db668d46345e20351f3fc89d91477116077e5775a11a23c0755d244334da97fbe0afe6d9930c040a14a8cbb42032a490f8aff0347d256e4062ef20c24c99eab68a17e7eda7bd9b850653dee9c7d0322bd382508445fa0612593e50bf97a4da5617b9810b75d4086791be88384a3540a024bc576c199af80bbcb8156eff79a63d92a938cf8c7bc043b66a55c9f351c8884a63bdc33e0afd6cf0356e67dcb4738eedc89b0a667c1fe93d5c9c80c2eff9a02239a288ff0e5cf5a519f6ebe8df697bd391c74a64f7b26a4caa71fab9c233770021e24ae0bdae0b6acf18d38007001301575409ce9270c714c67ba861952224baa0212b1b77d21e580e9369fa105686a0767252b5d675cf8dcda369757db044afd67020ee781ab7613d927f1e197c0f9291db3fe321a000680514c6f795d89891400e60200eac7d76eb347f4f5b6d03c11ae1373eea574380a3c68c04e520347a3a5eee78048652de729bd8442025645e0ee5a914bfcd84ec65a436c97183c88d886483a230b692fbd9f85ad35db1246ee5277b0704b1e74e5c2a75e08aceb642fe7b47ffb91aeaa596020a187346a8a57fc4caf6ccfd12a195edb9c0a2ea02fc25ea8f9f9365f0ee93d381b3620a42c9ecf47537bed03c9614b943118db7c8b6caa9c8549de73804f74c4e0675ae0330fe6fb452a58ecfcb6ebc9c4093906a055bbe0a8aec4347f542c0b92d269532229d453df8aeb4cb5864ec961a661b10802c0c4757a21d94183025d05c25a58b8da04ff58c49b5a7b05aabbcaa5608e28c445cd6495a40de770aad41dae4e731ffa1a1cfc6a394bf3d83ac33f22e00636d22c4fcdf3332ca20531f310bdd3a9bee53f04534965fb00c33c4c58a8ebc2f4ab8c5f2091db9628859cad86c2d9c52dc19f831e01f2da97977ccfe27f5395790ab2278b2f2b3593fa4948c4bcfaeaa437c0d68da19022f19a0917181899b1220cb08a26af950ccd96e9937aea3c54231531f603d5040033f4b307de3b55306e7b1c995f2565264b37738d74f8f6abd72b03e4a02c83934505ed2a162fe15c67037b69d49f64b596639d5d17db1e9475d09c58a41deb6d4b455e3927ebff35da1af878b9f4f51fac1689bd622861ec4e963b55293b9930c3eea7e6339d4d1307a12bafea17fd3f9063f2f4abfb7a4bdfe5b6b22f8ea754080cb26abad1400a196c4a8571dce1d201bb2bfb04a140f956626d248f8182bb2ddf5239160a8b5e98807b5be51c3e6893247fa19f1e22391e908dbbefe8b8f3ea7aaa175c77d620d5c120073237e0d38eb62540199d9f770f21fc9db7b0e851944bb6c4526c3c9faae166a08edd5a1e54d734d3d37699a0b42396f9b346538103059d860250f3e290c70f8060a0c42c4ed59825e26deb6d5547e385a4a3e413107bf3deac74bda14e514d25b5a51b2fab09dd9a8cc4ec5e816fcd20caa2e1b600adbbd7349f534a5c62ce12667eba60982b589d27aa2d9d7e6fffbd2e38322b5d6e00c9bdb4eaf58b6bd59d73045829b70c77fe981bedfe5b9ea270e4998a9062f7f457391f8862a7a14a419154ba77599d375a4fdf66a604fd09fc3ac7951bc5f23fe9cc614dd5865a569edde2655d86a384acb1f47a6c6529a5d4caba53ad47ff1c356c7b8d578f514225248947e12d07c9736c857c4009266529330f5539ebcc765fbe02ac88121cb41ef959602dec0d57dc207024761b55b161a8f9d089e442340e70dd2b9c65197d6cad7cfd7cf7b50ddf5ff68cd7c3936b7aadb2daff27b55f7f33ebbfda3e1730a14cdad19c40fa084e3f9bfb048d819d3d14c07800897acdb6b0a884f947c7130d7f469e91c8050577087862fc0fb4b1ff7f3a7678ebb0fa3340eff507ae94a8172cf94ec6141466ab7cf2c4a639320ea27b700602359570a2a278300e85dd1b389171d1b5e8768fa436f754e4ece74162b53d928a35d9cb64c4df4e3a082f1f610cd8c19573bb25d9f3b21289d78ffb12315f1be73d3ca1a5af908cd8a4f68b04dfdcf8f54775207ae2efcbf1f1b9b2e2891cd579d9f8617d45a305e28e3f0c83307f91c186b9a7ebc625530fe11decd170fbf5f17855c60ae813ffd99d553149a0c4dd3be4c98a5db8cdf3314eda8f4c715dbae93da8b576711f73024319a2f5651367c6fbb9047a419a939871e6330aaaf6c61742f2030000000000000000000000001f63c13708a27bc29d8bb5dee2d1610d51aa955696f760a30d18c8508b0539c981c2b75a39a57c9d432147194c1955f4e4c8b47b8e1f9e5d7b54c0c43dd601270c583c1d976e94e7c7974020ecfbf7e3776ad847c1065483d4a9002e4ff9c250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d06e7f257adfb0ff02a39c2b476670789def8a78f3f1b2399ffff241bb52670fa739c978edb25a459ba73c621ad49b67bcabf7dbb0df3cdc4321f6aa828a52800bd0624a3e0e95ba13294500d72f308b425e50cd9fc3cb92c79918b85cdc0468c719c5ff4ac36562fa3527af6e64589e268fe4c2cfdb625d53efa2e155f3c4a022a339c100cac6d0cb99ccfe74c88dbfd4bb15eaaeafaa5bea774d8401ce61984022586710d5e6bbeecdfba6bd45ecbb8208f72e6ed26ec95dfdda5bdcad538aa770b0282916b3399ed8b72a539ce3296f92141a4d118feb138adfd0558092614f21e40e67299b5fb4a94f3fbb59da45c8caa9a0b016708ba67dd6ae0cb4a34d9f4af032da705576350c222a45cceed772d032d32e0a86472ed24b9e1aecb07060e58b20227fed6973ed188f36267ddaa6986deeb792cae29884500f87a34c63bf2ac70cf03298b615de5290ff74c0946094775d337bb4633a8e20c74feda745886d315f13e020f456d3766738712e54827a8879ced83bb9da94daa515825548cb371f8ec276802197cec015e8befa6d71f40a3ca2986e1891fcfaf9cd426413ecc8bc6ec0254c74350a134c12988bcf615bc98ec8f00b947920d1b803702e24ec225cc99c506102ba17d6da732ca03732efa7043e97702f36eac16dfde710050b431399caec6a1e4d817844c73de7e63e9bfe2efef02e3ba4b0cab3d91cadb5e9700492c4f6cf8427742b792d529b09e6e1f9fc404925e6b7c12ea58977af732c8cf2f5e0721fc001c2eef19185e109336175ea34df257d8e5756fdbd11680071ad00c655356a2ee45a86e63178ec131ef57f951df2e841c4299a442034567717d3b2c4dffd9f3176bddc2bb1c5c39e03d015d004a73d72cfe88be880e83c702188dd7b15e1fab9a407a7a6a29c97e1002e4308d088bf78f35614b63845715d9792c0c05d2f7011a956381f9ac2190c8ad95b626439a7b5494304de02b5b341b40d6f00b8db79dba2c9bd73a9a982a2c14fc7e7851826565a65d82c19a05881203181d34cd923a40c028bb39091aae65b6e8a0e990a4d73259229afde7fba11413f44fb2804d40ba22d7928ce10ae8fd71e4ae322e76c0430155013dedf50edc8f3585bb96f8b920969884112538eaa5302a44c7277bd6ec3b5da71821f6e9904879fb58a610d6282b4b66451e7e6579023bfea307e6dcc1fc3d1d2b8cbb3a82593d368b25153d308068ef9e1b9be26a3dde8395ba4ba001cfeb37b57bfb06b07fa44b83906030409c1c0fc140a610fe024c6fc5391e36aecc3ab9b1e91111a71600dc69f37c64a08474ede04c6ec41dbd7d9031e69c90daa637de174560d8aa25c91ec5d5d7b206afabee1149194020d1bc6ba56be0860f924dc2093d87660b44a85985b1b7faae9d70200b472c591b34008c1da56725b8e4f10de824ffda078e8ccc07a08f7f808d1a91074491a8252b6e73b9f250a9d38ab0440e914f405a99bab7dfa6f08c30339c903aeaabcbf0adf8df34be66dd2cf354cae3147166d0b7983b7f8e31554fe4a42d502562545df92be9407334f050372f4c00e275622940e6e0f72875396d4253f33961cba685500fed459fbb6f9b74e32744bb280a542c58eaa148110d8c953f797c297f83004ab7c5330a383cd7cc3a0b9b1cef69e336834b1d965ec602f6398341967250ebd3d68be9d650721e5585f8eaf8edecfbc44a9c90344da9dd0c9e6654804b3d09e45b2ab65f7f715c399a6a9c88d5f941b28f93b67625b928470499b83e2005965a77e3e9a26d8a8acc2277bf2054f04c9b772c4755be58f286dbe5aa36d98ec4f45797a1f34784e294634e7db40279c589ec405b21c2406d1096920b1ea6b5253c0e015e11591257ad52dd7f7772c977401ec00d65afc734f0461b516acef2f0805ce7ec21550556e1db4a5a1a1db59a0fec5434547548211a130044ff1ecd6bb7bf6bef499bf9b65381a09d6ff557033ee94702a095bffba98d703ac0d97b7676b303d75c469e3c78db6334cb63db3b07e24f3b6fc6628cd10714c40e77dfab2f4e6a7ca236d106498dbeeb79c6b19e0bdd735fc47cfa6d07b53eacf50528ee0ce223d80ee88c75d6912c9209a95cc78cd5a609a03559b80bada49ada735e8d918e867833f497fe840b9386fe94cc43a297e3c18715f806e0a127cb0793cde5435a11905be26c0ad5419ff357a7b84ca59f56fc278fb55a9df0f429e3d58fdd241fea71e1bcaf614aa79dc9f3f07925831556ba93cf47dc0c36d136b751869d882aa0d2244e1d7be20000000000000000bed2900300000000c0d583573bc2f7bcc31ca7dab68cdef3766d4580632d4a2711914f94ea5e1b579979a083c0898645b424095c239b3212feae7f871cc5aaebf7b7da6ada6dd5006134e790fc8013513baa04156b9cbf5fb45ee9d8807c012ca36eafaceeeb1fd3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006fe94f3dc25ec6bfaddf1f90a56041ef917f6985f92a3ab00f07d712a3eb4a3256284d9a6f1e4d5d406bb5237b27901c776799d3b451b6b076f08c1fb45ba2be0f4fb523712739fbb8a23fbb8fa5f7968f68dc420143ba39f02d278b72045cb1e9055ddb88761dc9ca6656f82d7e8420f4720574524d6c1382239fed4a4b3723020bbaad329665f01d3768b88759a359bb57363f882a9f1a25ff6ac4e63bad5d280227129d2cd0b6929d30ef123b72c3ece2a78ad3aba87a99bf680d17c49d7f07270a029a285ae9d92f0f6b33b1ca5790381b0ebbf96c67f9d95f6c34d72814439c37c34b61b53c337bcaaae72142642e5207becfa94ebe623a2a08decf852cdefb30031d20ac377235c767384c3446580cfe415daf565cec7d22e4ef645e079e938d62020a53d3ce4bf6903b617b730cbf88e560baeeb8f70a321bfbef0c64de5ca3fc1a02023d2931feedbc3bd8f0d5b79c6ae723113cf73edd09e589f7415bffb3bad3bc032521ba0757bfb87709f06ab9c878f264d73f7e3ab664f97eaf7a73d3b4fb50fc02250980d75c0e860e70ba03828aeedb7b9e42a67c5d3ee7a7fe713236dc8fd838c114eb3e5b1920977e5cddfb9cedcbd6c5acbd41df2862a0e347ff63612ce906612c95cbf2fe991ade784439125d22535019349af2576e6c536faca569431726f22e136c772394eb1209dea5420819a08156edd9efbe772ac5df54c3de368a78d496c54747f22883c76457ae57bc5be08e4ee87695ada849ce572de189e3213567d4b618bb11aa3a13c01b68c0dd58198155f7aa559acfe71ec200bd99ac671ec1a2937282536cb4bed14dc44b3af07843b1aa8fa1ef9724e3eba8c9a123f36bcb7dbb11375a266e68598dd37cfe88accd9efc1612c6c5552e23875aba831d9c6ef098ee804c2c19e8593c3f8f348ad054027d5d656f69c04c7884ec09ee40f6037ffd96797baff6951d55de4ebfbedfae70d0950c3642cb7f296d8b53635f8b5cbf04a721e92d9eba10dc3420d394129a8b323eff1b9547a7d7b01a68f8a9979e019cb38158c332253028bfacc66cb8759804c3fd935c9c8c644ab3d1a339b99e3555783d024912be9eefa1f679f6dd0577939f4963209797b3a18f5ad75de5c14d4e2b7bf486bc12c60a264a9a4d0f0b902fb1a097220df6ad53acc8db97cc1fd5e42cbc9933c9c64e596e1f2c962b07aaca3bf69d52765c07fba63e6757e3ec4302adb0e1ecf93776c070c99bfa3528d447948b4be078824d255c81e0b8fbe3c093852500e4363c382537657bbb58e09d136a5ac247c92e4a4f556387dfd1d30b2cbb664905e9e36e2cbd3a5ed10ceb3ed4eb2843cb7a06344e4fad6d24b490d4c8d0177b4cff1db2df84de9fcfdc637823764e2b70627b942be1b51a78429681ffd6786829aacb8abd4884aff964ea87fa6052be015e64dca38cac9c2147cf3d1d10b62eee973df6d09d19c505090750f1936949b4132472907b60d48ff29112a4041a3cc5e998be57446f68f7ff3e4586fcc7b7f0570024af6130e24e8b74a8b80d2e92d5a423730ad5f86007fc4117bbb1ab8dfba27f68d3eac74b86322472dcaa882094ff222c0b8abc09bf06a0e33a9b5c444fac9f407287ce077f98dbb797c9eb1da542e806d7fc49300eaee538f3fcc11ae2b5249fda5cad2fa15329fc583ca283e8174452945278e42694e37cf66044b7d2c761197b752cf47df67aee65c6c2220c32c9ccb7e784401c7b18d19242a7c4f544024c2a7c3e1072086d8c5826a533b147e44398cf87675c0b222c2982db42650e8faafaaf9026006fc743a2e1edca6bee2e2bbf6d18eb63ec9b931bab02fb5a6c0079696af2f61bddd8315f315cb74edc7a98d5d1cdfb5fea1a61af7db10d98e606ab6774b20743e450eea688db02d72ec281fcbf4523b8a88688722a326fd9466b85c6d81deab14545de900ae5c1bee601db18db67c2c10cf7a66edde0fada22013bda0a8f5bfb8bf506ba08c0075496097f305e1f19f74dc3db64d8de64289833eb1d86ff819889004c4af799f36fa30722173d9c9816f2e7c0c40ef1b0bc9f7987471f8f98d6807a4ffccef4159e9ac97e67d036d8155cad98cdbf9ded62bdd94b262070fdce7328891a179b029b2736ea2e0659bc1b39162e41959d86f7ca6f330495134b1e64ea336433ebe2d77e1faf1aa99e07481ce9425ca08f30d4bb95588370a2b3ce68788ec2ba39c674868fbc19711c90f97463b20e84a57817bece8348d4f79a33b56d38a94d9ced625b6281884b950ee21cc20eed9b16686565a534d825c9087a6bf61825b5ad9a3e5ba6bba1736076ca22478412d9375267920b04dc4a214fe3bb486d79b62ee2fbeeca3fc357996e47507c0e2138cf80c24614b04725d7143f91ee26f8e360f6913ba6a702814681eb3b8c07", "526351", 1, -1991775465, "2b52dfe01600aabead035aae8439492cb70ac3a056561c148ace9d17404f1885"], + ["030000807082c403046c0dfc11e6ff566bb1f44924486c2e367bdadb05d4a8c4ac4675c0c8640b005a00000000086a636551526363530925190c5a950799b1504be0c26989f4374e231f8c62dc16700b53d945715b03a370c09b0300000009acac630052006a5153ffffffff19d63fb5337d20e6ae3cd422280a10f5c5e5e8e78d0280b7aa6bfc228beb69830300000009650063526553516a65fffffffff3f238105119150aedddd86172a651e64a94ff4b26eb978c04bb29a59162e7460300000009636a65515152acac538daadf910277197a03000000000865ac5365ac5363536cb1bb0400000000016a5bf91fc4000000000353649205000000000000000000000000884d868f115213e5aa0aff8ae5c800c653358dda549fbd0b8a239dae24393a87b13b74fdf03a23aa39b036e6c4c4780e8c2d61da70c69c6f5f6dba5355da0ceafa708b2d8d6689900bc813eb0fc9c343dbfa7a4258caaabfc4f4f4bb3ec7d3e200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4f66c6fdb3e78465dfa182f2056ae29f315de90c460ef3bcb9722ebab5416ad4244d16975b1eff907e78b989d9b0df1836cd1e57b47810192b5bc9e185a7a0e53721c035d8c34b0eb478f1aced1520f5e1385b7bd1b1f71889ebf893a1657c19a12671b3cb0a52a2cae6872b52d3e97bc8b7d2ad630b0bfc6cd1148c3f28aee0201daa65142e44fd3ddefe229724b8b26ab6ef2bfd59ed690672ab665b464a37f023039529993d5e3d489ac7536a94bd7b9ebb58d50acb35fa450c8d0ff2e1a468b0b087381125f0b09fc9c97dd0defa99c51d1ddcf398b73d58cc5b5815c836143e6fa4fa37adf770f729b95bc10a607f603b3da09f13bd9c9b94eac09a79675273d0218a1a7e8f12d9491d77b0f91a9f24a55f07ad17ec55d6634e57c29db1b4beca7021c284bc51711e6d70196cd0a1cc39dbee415f5292f042b14f272f4277eebec1803272a68be3051c984ed909cffa515a1fee18f23c4555305a940a39ee4dbd602420309fa120f414ef727aa92f9b084345e01385c21482bfad1ecd7d0375a03874ea8021f616e78145f080585ea5abc45ed0d1624b3b70529adedb081de85b8468c2de82d1bf8b6d0016fa04e658bf97f146685ac2e5cee370d7610f67a57ee7a88646db1918453a62140144931b895ebd793791be213de49960394a3c54b69cfdf1d4bed823274f028c6438b18d0f24cdbb4f9b91f558cece56130b48cb78771e3b6f12c118c5bbe32e5f5a43b8cce653c5bc5d9d02e3401b1ba6e90bc38fc5e1a15d54076259af3ee6067c1808f97caa581c3a6cb0f1839d070e5b1a27ba39c5e61484821c29b513aefc912c0b6ade437667362d56c486fc24004747638a96f26c4a35983b2fccd3ddaad99cebb0b90797eeab5f3ee466ef1fd3772640c53b67c0a3849d8b9155dfd38820902dcf9b89b57754b3ee4a044f37a1c8d12fae57a2254933a94d3fdf6c3cfbcc21164743bea7e2f1d6cac3d650039a4612944616dc26690b33f189a617a5beeeb4d921bd01039224d54e6596c9211cbc7751ba71d85e1d32e6baf2f500cbfd8fc3f0884700f6a3333b12499cd0669c01639bc28b366080bbd20ab85bc47bdc135c9f9ce945e8fe1b6b108b0870014f8c7aa36d4134afb4213587145ada6840cbda3df7151814f167bfa4bbf89942c2f8a92e0d1273d95b94232b06bca3014775bc047de46437b27e022857d145e5861eb5e22782b37963ba581a7f1348e858dd3ffad4d13aad862c70ec381d94bbf73ae2e141fa6e9a752655edfef5edfaea13b0765dd6d3f4daef76177ad13135bc2435695300fdfb0d95c3871eaac85f1b530828c972004e686a29093aa723dcd97a4fc2941f6e4b6b13715f0ec879fe46b0d480d715cb229977eeee6ac4b120a43cb1f924c31c189275dfe204f032f02c3af9e2f6aace9d5df62188d171ddb03c44f1a0504e641ada72771ef2fd22fa28bfac5c52a379f9bb821b19334b9eac142c797eb78010f70110f3fed416104d1b095168fa224ad8d7c6ddd7a440eb7403da0bb4865978c4eb7dd886c7454bbc910f4ad683e492003f3a8ef317e81dfe17bca682ce7bb86165df04574ecdaeb2005a66bc0864097ef14e70e7755aede943254ed99f1e456c55d8b3420b743ce6833c988beca3d84b5675d58c69d8942b4b1abd18943544ca3cde8f0fc9cc46a84b6236a0dc3f01fca47837f92dfc76ddb9007176257c9729536da40219c6059861314ae1140cdb696e94e616fca1e6a84a418adfb6a4df3b424163da12da00ba877ebf91f80842cd6e17c7a07bf5eb0a1cda5955ef2ff2f77090376db736aa016dc12c06fb1f977a4e8a08314621b1140a2220e51930c6c420e4a22a289c04a30ea3d6da645142051d9cf948e506a5950e9feff32d4094d1ea5ebfc50423b77c5de6b4c03c91cd98121afd55225fbc8306c77304a1fc38798313b92e020e20a121d1346831a17c0b8d6b09b8822c3db8e9b561503efd9a622567a11563e91df2efb725897d2a64166c50e6c41c674571e832b63c5e987e3418f338b23274947ccb447b00c22b46496eb1feca3df4f4c35b63cfc27293e1700ad690173db31842837d250059408e7566339e03209a6fb8879f729469f01434c30664a291affbbc220cc649cdb82a5eb9706f2625c41698b49c3925ce9226148fcb2e1e710399c3c7c5aae911b46372294ef560cb84b9717653e26145c7b2d2a1626edb83c97743b47997acb11cce25733746db76b2c3d4526d5b0faf548b25546c4f22c52dfd899cc3128f7245853cf2558be0000000000000000418ad30200000000939fce3ed857ee2efbffacf0a96983adb714db1a8f40bd6721dc601fda12ea2339198cbe2d70d353e548b369b8b49006f17c0293573cd6c65f847c91f8c1b4de983890e4b44a346796cbc6ac88cf7d77da12a788fe3f7903373e632aca53882900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffa11620d21e0cffc766a02c2a2b27dc2dbeb9e47e56f1d19b4c2670bffdfa4d8f55f481a7b73c90d9cbda502943a465d977700e5297235497f0a19c374e26e59efcf215e8d2ce4d31d576babbd3e480da40d19507ba314f27710e0f77b0ab3c17868689bda93898bd5ec169be39cb72b1eebeac63616c8331813203307e4556030032e2f163c92f9362e2e9103ab8b87803459ede4d7f4b462fb51f2309b6f7270213c5ae869d79514b4e1e752246da24fb1288903ad7a84cbac90699b8a59111420b05241b6c2a40078f44a2aa325567d0e0ced78febcc9dac2927b5dc87f0f8d53e9e4be09049ee937a675db55c1895576661f13b0266755f0088eb8fa471991e710310fdf23a2f1b65df0d57372ac654d62b294ffacf8d5686d19a4edbe55f6892c60229208f683ab1fa97c0de60e546d7f239a467497a9308662733feb42b427b995002095679ea7e07e93d8f49de494df14f14d4af1d7b969fd98453e5b3077a972127021a040f83ef3598d85c67d2d5793a6d68b756aba66892dc70a3a60d977229757c02149e4f1cc53a064280f1094c79755ffe331770fb2220f789b72a53bc2f3396882ff8239542cb8a726192a5acd1a0bb94896ff98858072262522d3247d73ccf8dd8b49c80bc1a4acd36d8f99a96dec24e109f3bd0ff508eeed5ca9398593c1053382aee4a2dabcdebdfffeefd3bfd0bf39837ef89e919691c3cf8ce590ec997a1035cce592df75acb8004b77ebc3ab3dbd7dfa2da56116b1cfb2b249631704e4cfb16bbc6ec4eb6cad19c1f9a92108ef6fa6a8d685f478a2d70ccb243da4cd5df4d328d638611b7788753d0c4f1f80438f606d8a3710e4a545a44a7e2e0dc3b2f88b69195a93121e65a804345da279a6ea8722fcaf04d1efcd865d499aca1dde895ab37298a9f1d62c0c74529bb8c82a7bd1b30a155c77129a497b76c14c55f19b57262f26b2f8533adcb70e631983f525cbad17e8f5c7c78d849d78e5451c326505fda9806bb756b5dc9826e4eb3069040c2d0ead2ae3753b07ed301ba0789df6ade66d559e75b76565ff73c62b8746833e1a4a54ddf5179d3cc73bcb1a8cfb595dc6e8250ae9aeea88f3161e327479a8950f914bf18ca6e071f48b994e67b7fd89c68813bb08ee6d263b9d5dc4d347ef28c305dc405c5586dda329ea5dfe53affa913325c6a28ec6fe675f5247c38fea5c6d55fd23fad07491f46f95fbced95a1fb0843d082da5945882961dc11ea7b8818ec30c569d45b8ef53734f635f4cfebedcfe6689e0c86a459145709c9d57e8fa5deb6d23398e2679305228252f9ec8d581d6abe7dc8305546ac3509f3dd93a0295a51a4c6112a4c1ddeff68e9f1ad3f0a5d8e58e4f6f4de82934a3d60b2b1d296aed4d30d9b301eac33932ea2cb042b3cb1b9af5a0bf4653c8b96d485c6fd57a404119e021fbdbc2ed23085360640299f467be65f6ce8f86083a41b92ddc33afc53e27566b542fab1e9d4d97f482db5af281fa8e04b183dc2357fbc18d1cf3eb06280d0862dc743b51b4210bf1f6ba694421f8334669cfd7d03df484cb4893b4fb36ac87b1651d846afd9c8cd6625653105685fde6e55872a75f3adf8d8b071d9d70a412fa4a07edf80879c4da83ca2d2451845b4d2c60259c1005f89a6b4b5f695dea41741d8c606da9821ce49f1a654db10ca120d36ce174e5502b3c6c827dcdad5f4a828b620e701b6a9c5e75a5788ac5822d019a64df6eba3529344766c02d2ee802846aa8a68c779379c53e212860b03810a2858ebf71891d8d2aa169771968f63ffe539fd846de0a28e5e2e94439d5bb5da6e1cae9f345a6a19b12f20252003adcdf24f53d900a659bcdac0a6a7d26ff6c66243fa46b35c39113abc839704f9bd271f85ca429e6c262c4121471444460dfcce5fc892266b820cfba4dae9cf79255e371c3e07bf0b96dc33b53fbc64b34bbb0aab0cfe22b556364d1de9928a9724d615095467a38eb0f87cbd7ebb9f41590005270b14ae287aa34a5fd471f0401106badba033757b981bd25e3a4c2759e01ccfd045949a515982067b6b6ede63723a5be4ebc33d02a2c96e625d75a3eef65b083a66856a43974caaa48f227c499c5766e6b67941710c112a203a6e4f33c4ba70cc401d321bfb629c9ad3a57466e8fcf259d1e29d71d13d23f34aa591ab52a5e5da1bd236553c9c584b728706a5ff99bb9992f1b54dd4d9349e8264272ca9b34aa88173fda703791f93bc0c65cf3c0fbe0142c995c42721f1923fbba6506363148b7148e56594fba24336ca85ff6202000000000000000000000000ee375153af4e78cb10a3d0ae4a133bdfed155595c93ad56fb1b056421f64c2eeff8c48d388654bca498edf773f7da0dc45429cbb295ec7491aef7d9ae56eb45ba48656d418e65b9ffb390e46a7bf437ea197f07349207dfef0b0d5eedf4017a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d343d84a6f4d0312b2d95e5153e737235226488cdf5cd2ee990f62ab265ec7a6cf2ba6bfed75f766a5c47108cacb89ede51264e3916f1c85e2738b1e3b320f94ae911dabb620db3c330f5126b9896f3a0532106f82bf98c7ec13aef551c564134a017b225288a1bd6d8ea436bd3d43c4080fdaf261a479d363bb340a739a75400208f5c5f6568334b6d034130604c3c95cd888721ae78fdf44936150c07fdde99e03139ba37326822068bc2ffcb7ad90aed410748ae9ee905cf8d6af2921f4ed13170a08871232fccf497e762bdb357fd6939f782d4025c87b11db0eed25cf6f8db0eb1d604fe5873b82e356983cc9dddff30f36c9215a68e3bf11d930afcfbe24256103003b4885ccd882041df18baacaf95aa08ca800b02ecfe0674da0ec073f4ac948021437d3769886c980a146b28cb4be16188a020dc39e0ade60dad814d3d1ea53f502275e26d40b92c2df2999f4f71a7f9efd315da873d02f553fe2d5136444a0ddb3030bd88f5c99d6c8a0fbb98e08fcd46d887f57228672e404ad564bee1564f724a1031cbbfc191acf008a903fa5366b3b39938cb820dbec468d67278b6c540f5cf0b2e732feefadebd257ddfdaf5e0d8f8b02573b0efcb356f47f3754e0183c830620e703a5c6b51b38cf2da92917056eb1a46dcfcfe1a08a3be01c0a7f60c291f22b481033b650d4763f7394da9934ca70b2f388164ee1235e65c17dba3e49e69cf1379d86ab19f5e093070c3d26b0f62ed9f591e26a0ce0c4ed13cbca8ee96eb7349c2e9e4dd1716a650545c4e62261ada1a500c835738b0e56cbaaff19638472dd5e8c8432c988aac01b1038612e5129192cc23fef7ecdcf94b577842b32f6f63f7acc878004167b894d489e2363cf92f5a2811578a738284ab1e3c10c1a0ae3bb4526c42a8c54b0ef582ed3bced293af2d19279368930e6bf95978973c07944637d9ed4901d259e09d11f56de5bd8e0187556bc9bffb132a9e103d1d43ed3d9e49aee82b856f506989933fc5fd1c4ace5f93cacb8412418458c462a7f15764f80112a60195688174d6674ffe5ffcb880adf7902cdc915039cbd35abf30a857605ffa7ca7a288432e9973a2af775ab41dc4dc872038c2ebd4c1e88c0758424223669690dd6b777ec45ca201f35882b5278ac45d802219abfbd86edf8ff4342cd9c592dcfacc623dfb7259c40837cc8ef6cba69673925cb0eda2edea50f72067309523cc1ece3781dc19813415dba61dc2dc7e2273e85ff239c60247cba85942bae1db9857d6f55602d26d50855ea59f7b5e710cdc48fa86af634504269939c5e5e1d49f1e7ad58f0e7fcdcc64ed9e351da1c3c6678e5aa4d76c057cbdfcde22700bc23374d72784e0a0d932292a817d277357af7a346fce455816cbb769f9be96ae4b56ddccdfc9c7bae0b1c5eb11c93fc739dd109b58ca77c098e69c4bcb7fc39fc44dc6f708e96bd54f63f985b4075ac62e1ced4f57b4f8fcd3f552a258b4920a11a6c8a501ce4cc26894d278cb29331d269f1a7b0cd0a80ca10ea5cc8fd3cbde398a66d1becfbeae35f243660672b979351442e0da1d890f85b41f437d99073a3e0ddbebb0127c9ed4a0bf8931b371956554e06cd56e533fb4d78d913bb70c2acfc4f9834c21f1c886a01b5385b56560be59b8a393062d10da58b457ae9a447153b5b65ccdbeea9dbfb241c45466eca85702dc32093598b6094b43497c12a8ffae06e40f54fe39ce074662de3471fd521629d202f21efd95c53d19ad5813d4013e0381be431f4f5ff4c61cd575f0a1071b8fb695ea86b487c9a1f0e26a11ea11d622a1691c1ba4d6349caff0887c3ada436dc6ad49717c04b407ad1b7005a27bae4b4bb906cc622c2245a9af78cf712aa0aeb553e597b6d7e942344d5e8194acb99333d8d00f8bbddaf5e0f35af58c92f06082657880efaa0a0543e6e0e62a1dc160a21cc58a2760e29230914392f43fa305b4a76932af3a8ec8150d031664ac16e150bc4eccb62ec8523e20df3db0dbb421eceafe27d6be8adfe67f5e4dd3a0a25bcc10f81bb17aa5f5a29b7bed54133e72e38365fc40ed9270a7bd48fb958cedb16c6390694a87416c144c8542ba5650d6a3272ea58a2c40573ce0bbcc82d7c5dd5caca626f436e820875a1f985a9295203468c63da4c7185cd49e7da02555d93eb3c269011078fd3436b4c052a18e2070ae3afa8421c1db739fb0d0dabecddff2b83ccee3f577cf53c075c9c8ae7b3fb18bf4c82f2a3629f570f522c8c919aa109073fdc25be92ec81f67b621b49612dd17799ddc32ad2aa16286d210d8186ed1b1ca930483a0eb1666710410ab621709d85cb403cc6988861810e385506e6ac18571808d469db371a7cd019b5b13860f3c090a5f1df7a0b095f1a35c5ffc5b466aaa7a671333215aad63900653dc90c", "6a6aac516a51656365", 3, -1767500385, "36571608beca9a9c9ce5afcea487130cb47262a9212934465432bf14e71e5fd4"], + ["6c0abc11040ef2c84563de2bf8e1f729769ab5a12f2cf3cb0f4f0f6eff80378d588c56112f01000000016affffffffe3e3a26c7acce730762cc0ad0b16049704f72ce92a53b97c20b21cec856da5e903000000025200ffffffff47edbd4cfeb44172b713ce43497ba68b6b205c2f44317727f9e5500357e95ad903000000015398331ba9dabe20b95ccdc084f192c85cdcde623d8428054f8a3793b39e98de3edd7e8eae02000000005bc46c1502131cab0400000000046a526a0021249f050000000004ac65655200000000030000000000000000ce76f2030000000064a365e380d96f6f3738ed150824ed0214f405c3f460aa59f232cffe4871952024439d571e11f8768473bab758c1d8d7703b21d0ed10fb3700389c09cb1c2433018f87cea3943476e80b90b5383753b71fe34f6f6ad5ead57d64678fc1e034cf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a55a5a1c50058e5b41f756ef9d8659fc0b986fba0faf533070f27188a0cd851948163d4739c84fb3bb1800fbea488a19ea55d843ced5dee7816422985f5db0a15352c2f3c317a4705be2b787e857b9c2812ecd62d38f442270696ea58e0dcc4b216d2de622fc9826cb40fdf419d9553d48aca6dc7a24f278f5b2c3488533502803050dd323ae37a7ef19628b2ebac72d556072f7c53717d503e449b62a0f69910e020491d8a39749710cdf93dc2f08defc120d7ca4b4bc49c568801546711fcc51f20b007ee28787e7229a0a8d2a965d2172c1641f69e74fdbc5de5b48071efe0f03a7e8dcbbba22be312f44dc41d589a579916881b9dc1a879e06cbfd05e4f296231c03008a0e3fbdde66bf3b0558da3ab18e0c7348ad0929e5386666e1d55bfa9fb5be031f0da6f145b738999608fcb862e5c7ae6fbcaeb2abd2603b883336060483712a0325d292551a36537dac8ab9d67a949a3760f7257c35067441b330eb09deeef9c6020b601c7b433d1161ed15fdab4abe99faba381b12753eba1024d849b30962147c0200ec711f6508c7cd6ab979590c2b2db4dc71626e01cec067141d97376584339c41824a1469ad824e5ec56454d3baa8c8084938f529ab0a13ba06d8934c9c54179b116e2aab6be3ca7f187fb33edd4e5072e9202d1cd8dfaf2525e7e1c4731823ed56f2240fabc2e9652622aaeacd7521e1815912f3668aff65dad62947cc71ee951e35fd4d5506c92fddb3e7c0e7e98f0dff453fa23236e765c7a99538bcb730f90e24139de8048d079d54b8f49cf387d707d6f3f61b667b8620afce3ba08956119f0f0d619465389dcd0e61f40b1e0530bc84fc95d86813631509185bafd43d21ad24ee515246e8a5c35e73fd627676d237ddc7df489f774df35ca7da19e32111cca8a894dd1caac5d3760e81b7f350f33d4a33b10e52bccc3ce757bf7522b747d024278bfe84f4c2ed05ceee11fcb453c16de196d692c98419fb3b251720db620be824eeea016b2c0511d006494e4574d31c32a8fa1802244a97f8140b9337e80f8892ce4fe4723f6126d59749e89fb33505752aee37dcc34aa875003bc8e64473b3e2019f2e3d2a95ff856d1a64ce441ac58bf0070024e2515222610cd535ffa0005e270b7c1bfb242b9a4a1749cb937f50773d10f04484e4d6350c22f72250459815855fcc3acff0b5c0161794cf3babdeb5eaa538dc29acc87627bc7414951852c8d8a545c895b400a0a9a2f11c36cfec674884dd73b5156268ac1750233c17c74d0263bd34348a77e78cc9e70c2c8b2e0226a1f15af7e35425777f5516235d4e4e4eea7761c01cfdf7ea28ed3bd9dba4f8a74eb24dde3cad9e7629e86404836a38ffdaa4dc7c98ee22f3c97e0e7d6b450bc4e309c591198b0c4cd98ba5b084b6cab4a3ba761bef7e9126636f92f0798f123d0e9c578273bbaf91adfcbb9af56efa5c3eb8ea76fd919cadf78c004b6129ade74063ef5eec512b3490cd3b893c6f05a130d80dd8936779c8e02091d33e7c22c4257d903f452dc424e39a499314eeb514e739cd5e22ef641f8d1122f04995995b900e8735ef829a7017c51f74a25985a5c4c3a024e2553117e5a5b374234fd32a56b82e018bd1434b2c9fa6c5a3aed80317a9c4851d80fb8429b76e6ba02b57ccdd4a33677f4df067e048f44e5bf5cc4c5abc03fb85b74ae8b6202fe80f779e0c9d4e17ad94543231cb9a70f8b7a2bbf59cfa38ca1049172460428b730afac1fa75061bd322f334938117b678aaeab21a4e47aab1cfd2c684def10da1463de49972bc41a90363dfc736897baec6d9e842af88ceac2cf6a99d93e4c909fbda843ce19612d36dc77f71dc5fbf92872582733979c0704e79ed3eff5cd4bbbfe4c0f1e47aada31ff1812a425913d51fbf28ddd5096e798a06689aebee050efb1e35372ec5db257e21133fd25ace63d6169949e9beb72f25f116f91eb476fbf972bb10360e50adb9701d06f031121034276f2d8ca8e56d75e8697562d663b3117d6b786e8fba33561b6acbbad28118b07d9861bf25b7e0a607bdcdfa6322c1f0cfa1c2dbc1ba763c116ac411138f857a661f50fc8520850a966a663abe5dd69a76518ccce3fd1d6a2a6554e217c317df4147d30667eadf32a209487d0450bab5ccab84b798c23e3b41e2feab260a2245d93135ae1c24ae3752d02e73ec1868a04bcfbbb8632577102a2ca3ec21e773b24ee380e35e77b661982167e063c92a8b7ad20df98fde6768cd780376e0e93a2d4df759256531d7753a81b56c2103d8e400000000000000007b108e030000000077c8207151b1ca5d3c3ea975e5ff33fab58d2e25a1bb6808a9f19a4b4562d2e2d65b982819fe1e24b14cadf963111ba135ba98ffdbb9bf6e8150e4805f32850580bf4317ab922ec45318594bf539a63c632175a17c61857d787f8732bfe05c69000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b684dff33739d11a4f790e656693773d2a5097690dfd24bcd3ea5401168a11f1fa2bb9d4cd157084555eb4a34efdb10a01d2091ac19aa58aededcbf56c361ba765e9c0df47ff8de7cef2be353b76775a52d8002125a06ff91fb588072905ddcd68203532056131913ebf64820bcaf5fcee58c5eae6d05b314be0b341babc8f6032a78b4bc7ec5332b6a6087a5ce6e020631fe96b7da1b453859a6dae7cd1ccd0e0221fad45fc80b376517b79e7f6e6204c11e3d52e0af473e605c81f4a539c21de30b0517d0de3dc1b512963c3be832a7e07fb5a3c755e7b3a4f4ca225e24c2ec895099ebab5debbfee02d0bbed5a55409b811135a630a0436698a8db85c047d5ade403184c376420766786edd701f27823a0e3e094848598bd09dd251808669d12056c021a78c46bef4bc933874a9babab68ad2284915451b94e4c2073a5721c5ff35a98030fb730ea4a92668569e2011877172e56a9ac0b545d90b4c6f83da05e1a973196022ca18f96ca82674ed2ba52086ff2db3b23bd680ea62f6fa18202fd0a154cf0e8031527f9ba6a76675cf4fd84a67c62ef87e1385ec5c2ff4ab794af26ddfbf4144da8bd8f41029e24917c60b5dea48993edec3ce6b657cba567bae6f35754390e5b83e75f8794a50093f5e83b8aad716a4fb97fc437865bd5a0fcb6145eada3227fed66941ca9bd2a6deec3caac510be937c0da01db36ae60dfafec29bc8785895399d304cb600385f76e2bfb5d27cb2366f303b7e8d7a4d8ab39511797cd2552c317e717ab839f7a89670a69ca62fdd319159924bed7292cf64bc25e7d7dd255d47988733aad6fb165ca1299ccb7831ae8cf37e2c4d613286d339c63fb649267b9f1b8f93aec5de78b25591c2db8181943d7bce63d05d7bfaae480037e23d944557a55d16df360accadd8f917a7fd03dbdbc7ade0a1855a8c715a5c7cbb9ddc84b259e15d3736078b5efdcef6ac16d36acd3fc6a309d1cb4a785b2445ca8bf236a37c455333f286cbce5ddf878205a673cc5701b93b831149e1029e278fc46dfa53ab345858f03af268768307f5a22b036e6e29b2e348b57dca87d8d1fb77614383a533448099d0cc4866f22f210c1e76d8d965ac5a4f132a45f28bdafc4ef6af983a458f3a73b62d8c11df563ae559c34a2451fc17e4dee18dfab40c03b3c8966a7478bee830e50abb26f356a6aed935e7a230b496ccb05ba7fff4b64c3e034051c3205f480c09eac88f225779f901d02756043c6aad6d5f5cf19e0bde8abcd501a2bacf38c8bbfc10590d338f2f1960075b1fbcbeaec8e70b4b940d0faf7174e4a708079ba9ce0e338b6581466ad79ace4cb3b65bfeb1c6c6d900529331892707b0e1a413e76a5aad48a3c66083efa8e4943048d6ac0e489c0e65541e36dd68ff471cf2d89ece3627b620acf17bc7279b594a83f69c9ce25dfb1380e59ee7bf1faad1c0f3ed4351ef398adcda01c764f61e3ee8ff203f6fb65505d4eed79c5f9afe38ca32ef3f877c0ec7d7e888874eb45ece31cfbbc1ed877e3e6ecf2278f3afaadf0aa6378733dd99cb4377177331936bfefe5114a0591b681f994e2d83ba28f7920e29d905831802fbf3a9c0c3e3d3df59b2be07a0e8ab2ab25e7da3c416b309c48903c31b72ecc3b9e0d4a67e4c5be402d05f674b2ab3c64d41c0516753e9424d2f5bcc2bc0a52e011ed6c24666f97935a818352db28b9bc8ab217214aba82fe26e76d65aefd7e3a9f7d0d5aba279649b91ccade94de7c18aafb29c95461ba44289f4b0e255db0e7c644c5bd1f9aca5a996e40a3fcc56ad4fa94f2aa003a2007c89621e388df1709f7e47867cfca0d4f08d718587e2b8fefe166b2c91b67dd5e951afef2f240918033c55567171b8276bf3723e31ca2d1359d2082688778768b28458bf1951dffececcfc4b1b52d940debc60c2968004040d4c485455fa8c6a30c0ffe67a0e13d66d1139536ad60d6ca7ae07cf8c05b1e03f85b0cf924725a6db0391c2646b0effa9688e894e82bd15adfb82428a25283fc943e3efdf1407202b3bac6f29a583ebeabee00f59795fff9d00d2bd7f221a60ee634323fff63bd6e44c9b148e4ee417fdd4b3a38ed15d552b38368d5d645f834d89b7871d759f711569b0a6205c0950894695a2d04ce3254d9002e82781e58e8673348fe40b47fafb097631614d69f91dc61ad5f74b9a4af43b6c81d43b75d0c912d15cb5dc0804e61592bc7b5943ce09e0f94533c5ab9842ba49753b2976204cdff4ef11ed5528a43f27e405cb4e891c65b860c13afca6600000000000000007bcd4304000000007cf626be9fd788d9dd79f6a49e56c7a80704eb71ea1ae07941b101b6ee73d8db7d05485dd60925d32391c7b6fd067f266f068cebbb644063db7bffcf1a4ad58a95e7285d8d4f17d25de9ba95246e3a59050ced66eb510a0c9d237ab40e91626e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003bb65264f205d029d43121b0b2cd2209243ca806b3c5157a3c2016ebcae4fce835fbca2d596c2f29df8599d704385038ba6e74be4c37aea9912ce465f6a8478bc4c8afde606525d9c00ae276624134ae8e01f154e50badbc20d29494593e4b190a371b5c4fc4728b2f9b1c1489fd898f44ba64d9f454dc8c45254f4111263dee020fe9bba9407abcb45db4cc2e62dc0f0a930a93257cbef84fcc3ecb7d9cef44c103215c695ad1feca44073274020c36d2692ecadd677244ce2cc766dccdaefbd02f0b057f198bfdc7cd85eaf6a268e959a9aa5fffe2af8359636809fa96dcadd28c25704cad06b9d08b7625dff814ae70307b265680abca0f13ee23d62e5b7dc46bc60316eb24e8cfea8933f9bdce63439b99b37bfdcc2e14933e3976043bdf7edc1701030cf0b5cddd990b7e016d8842084fd7802d43ae81286e77d4fd2f13719251b4000209a3d76774e4bdf50d18096388e4f98a62d0a074b5478e8c58bd842503a65f7d020af179f4402616683e45a48e50f1dea3fb833197e223bb1661c22abae579ec1d0212a396f3fb50209f3680a65245fb19b7b60b0dc8de14d31bd24beddf81a3d348f2f2e74132e2ba641b0f6db88ad056b7b494b847825fa4a55c072238136f6a356b7b47ed90cd85ef8c2ff9c2f8d3ae6b2e838926fbc03dbb9977f0694d2a2b7d1125c7880b7d94500dd20a7ee6fc9acec02ccd24cb1edd55296d08267baeb483e151d0ad4bb9e34c30c59b6f83b6e0ecf42abd3486e1c5b6b6f5c66f732eafdc3a8bc61b3401ecba62d2dd270870afdc34fa67601ba0239eaa52cc8255ff07b7eb864ddba8c00a4f649204823abc399fee93ac835504d794679fab3ff086d809f934b199515b1cd31d5a1e9003aa64412f87ec1f54745bad5b6b6bc97cf3a2778de19734c12fd66911c14863143c6c8011865fe616d78e283b05f999ffa2561667133affdc6e7a882357aa9fba89637a76fb93f9677ab4e8f4bd8d14b12a9505b31805d5340ccecfeb4b91ac9ba58f1ef15e7d7276614d50db1134d58073a5f3d4934c3d7b26de7feda2f1820b640cb60bd8118fbad3bcbd10e9d0ebde2e8aa3fb0455b1e5c7794d60d8cd80fb09780886fd08854b28d724a4bb05f903e1b78367e06d5b904444c8025bd0ab1cc19bcfce71ebbc5eb5a0220d4151567ed8dd4a261d4b6f4c787bf85a804e6311db266202b9acdf184c6f44fd3fb705c9a730df2f08f317e3c1da905889777faeef7630f0a117ad8362a215753c9502cc116a129d22fbdd63d6c95641b666f25e2b5b66907cc89636b653cdcdcf79ce0b7f5f176b7d83d8cb09e1ca38c21d9d57f9fb6239402357fb6e0493119a894f63ef2b9844eb4d008a6fff15831573ef91707c4eca434aa64d80b6067b07e92d3de496c677a4c48ea3a6f5faea2fc2655c6d3debcc65168f383477a4b3dc1e18678cf7c6e5ef8ddc5926005467672156e3153e35de2586f059949ffd336aa2ccbe063ae76b6a0748bf19ada0f6233925ffcefd2025abf72bcf769596996d6051dc20c474e42caff47d08a76340c92d70b43a362a18b5b3c03c1a3c70b0aa849009fac2db0f7fb0a964c2524b803bf0301e7a343b6a36c56b2d3c83e71f413ab308dc69c2ef1bbc7a9a760ab25d5f557ac8ef2ffd77508fbb177589816c5bfefa90220a7ca787fa2aadfcb10039208d39b8aa90b2e7f0e5a675cd4a6253e84e96da521d29d28dc83fc47edb82a5e41e374a9921d7602627a6fc1d574fea77bcceb66515da7edc91639fbd6baf0408111b9d7ca5377f6a602ced00a1bbbf38affa71c88e93caca44da4a2c9984dba412b2936e763150bd1f3736dae1401c0e088997755e7ead7944ea7b6c678a346a8ab852c617e98589706f8e1c257aed05a987da6d6b44a0f2b1551907f09ebb34078be65619e62426154dc3d8e6698ab7941ba3e2c525154d94590bfd1c1a659dc85dbefc1abdf3ae2a6eadab171603d60a5ce6daec7088aa011b72783ac5403dae9ba30f16a3c03158bc211e4a94ce3ed506d8f129686d66e2f8fbf1922284e878cd166b8cb7f9203a0898791440fba47c1ecb000bdbf41a3efefee8e2705f65515282c90b695be98567fed87c529a6e365675645cee17720c8d6cbb9577ad38462adb3209bd41534fb7d57e154b8d842c433a6a2de1c1a4246c17763a00e1749847158c932bdb2d9ad833dcdbfb6d4dfe14d6dc07e35653a204673d3c6a56d833aa4d5c2d2eb9fb3b5da93cdbf550ebbf83e0e4c63855932b7b552bbcc41903d9ca6f3a60fa82cbb56ef9992d3b617538129b06a80e7513c889d646d3dc92aaedcfb56177cf640308604c4d66743392cf564633d910f37a7b4d503a2a8db87759a0576ddc8a9d02f727be675b03fd1e7cf7bdba05f3d1c4c3b21b3be926aa5436d2195d6f5ac501", "636a6a", 3, -2142735693, "7f94ffe9a2a16832885b254d93b8ff38390501a4096ca3f2194c236288dab08b"], + ["da83195204ecf00e5da5b832c1d25fa68fd710659c9e8e40ca61804dd8d068232ef1213bec0300000006635165ac65536dce7097737f7a9f5cfe3ff6bd441a7d788eabcf23e11364d85c4b311b348c9933edfb970000000006ac5152525363ffffffff54fe8f6f0f7d791a987dc6a3998d2c943a38f22aa84fc1d492723061242875b80000000008ac53536a6a6553acffffffffb6008c1c68932ead3ae1d9a12bf1a8531e3c3f2352d6e26bbb930aec27a57b12020000000100bbe81d1c019ba3100400000000045253526a000000000200000000000000004191ae0100000000a72d67a48a89cc817112e3fd0ece9f92a871fcf835c277731f5844f67c4ee8c21b904f3c8011100b5c4e12cf155ca90f7ddce750a536aafc188527a05f06a305f173830548793943766f3e755a901691d24b8744e109ab3abb026b97d2abb15c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d968a4af53072f2c169872b955f05fb0acfabcf6b7d2b5a9ee4b7ef56ae84389721c8bee5f14e265268f26bd1435ad8f73d20bd3bdc428fe985565301d83502f6feec460fb2ef4024b7b0df1644dd8ff28e604f20127b3162ae8d813a31c67c86e8208063428c48467e4f04916c984ac7e62407a9c0218aca2d4255f31e2da6022667dffd68c325ee382493e9f00c6e33bec69e147686ca7c130748d09cb0f93c0204f8c94f2a37a364587b53cbd8c744876ce47aada722d0cd7da737a4bbf2f8b40b0833fed4de64ce874daa3c71c3a18880f2d1d17fde0106ac9657e9c44950894e592f98f58d021bd4a9bc24879f2fd52b115fe4d5591c062a068c0a82e1c3715d031dc0a4e2cabfcdbc36b15eb86226db6c279c420ad437a3a13618d74b44a02007020fdc763f1b60aedb4194104345fb1568370f7bd1879ef7a57894866c450099230316bb68af6485121e54d68de6f102e15f8b2aeecd9e4b0d8827ce4580194a7d7d0320350858dea4cc1c5bf73eb73bcc41a400dd6584800a8e6098084573202dbb47022b21201b3ad534df1384c5f4507209c1accfcdf58145f6e59eb26f1e0fb29898c7c9d399e32c176eeb191d721f412b99e478778ee0f4ab84577af7dcf856b952be9db5078079320eb8c0c6ad11238e1a0d73bd3bfc1c9d9311db555bc1c7d6fa174e37a2df5cd234709e027d2d2b39f8b62975d72669f5ef59704c5014b5d269e7af94dd378e743d055937613d4c3ffde461211a71086ba5e7d01a8b0379d8f87ffc1f42603bc01decef893ea5b65821923bcb250b108045b4245ef692da35db0b32f37dab884c4a999ed42b76e062772ef1d09849e549d02d9426d4536aefec508db9ea6222635842f412a28fdf856c615388a36ee3c66750fa10fb3b09eaefd2db2c91d543d03bd94ec88900b40c472caf2287c5b5bccffc428b6f4a2aab955e8aff29c1db72f5972371e139c85345fbf71bfad45ec99bf09e6f51f397cd606b9a2c2442976655d2e14538646bfdafdcdd8debecebad74dcf3456fba8609012f30bc757f14e3c4766dce8f981e2bbafdf825e2556adc51c082890b86c130ea070da64fdbb7a497aa31e9c1c9660f47734e6fd18fffb0393d271602483785adbc0140868d011a6796dbcb1d934a4e5acfd89612748cddd3f2217eef6aeb0e389aa53396571f8b69d2ac219ee6bc47c9e02be5ce5309575e1231c893e2b08f53baefeb796da6200fbcc8b2104f1b3b7a4691d977daae0657cd74bc76defc4c92f936cd37f16441daf87162d598371c512330d5ef08181b7e057b4a1789c7fbe0621f336bc8efc55f490439d04b2af63203ee22c62906ee456005ec89b3fdd4dcf807a16d43632f7a61876b8a5a4794aabbce7663a67536c41336bd3cc5f35b423fe3b8fad47426a36320d045bf0a893a92dfa4c9a2f1dd6179e90119ab11495fd949c2dc5691674e291b25da06cf9ba219110cd1309cd617812f5ff89b25cb4dbe898ba3b793a75d2720778837a4285e30aa5074a3bcd0762f17531c927ea89ac703b20258e5017eab60c350ba96c78e8d490c6695d4bb6f655e8aa1dd34e851d44d1f9e495619198f6931a110f19bc2136442c9faa01cbf114debb53fa9cd06872018041b13d978331aa0264d9a5d20973ca331b83de256749850ab5456848018fc4577ead18eb49704b8333c157511bf11a002f410b15f9e64376ff7419cd05300b302e15d1b1ea4a0a8326128207fc8bfeebfd66dd834cecb6db5a6c95a0995dcb4422d01861f6d72a48b53e255886f7434559d3d2550eb495d58170f5f7ab1d4b00de1f6d9363405746cf1cab15716c6223a7c20b86c2cb9d5516dceac61617dc1bcb788592192e5bd6e1b32dc6ed470c612a70f2ee224cf7833e748e781d4f895f7ba0c6f76cd39709f510cf9755bd57e65178b9f6cbcf2a8fff7fcb86187928a87a569ee4372bb334fb33cf41dbfde6d1afc855cd3e66df428e2f3f0160a576d14c5d1fe78b6a7d372d57e08a8542827fd7259944c046d766b021964ccbd6f9dee9ba2da545720893484fd44aa6693eb5ac1eef90b23951977d2f55395bb23245a120a1ace5019f85a1def88771d24887115f744f3fb3109dfe6bad5b339c99f1250524739abf6799f3748613c5230674261c07728f6c48e91a93210b133b36b06a48c180fbba4cd1034b2259f60c111ee1c1fe1751eacc8b346d19f990177ce39dcc265136a41f5ec7cb79c66c1287901bf38df2b3f3186b7469986d0648f2a5a63640e0022d244f855544489014c00000000000000007f89e5020000000074c9725952b56eb5de1016463d2ed0401deb9642d02997ce83a4cf6c6a37786300633c9801d3863d225515f8c5653ecabd027df3c4142029b931f4e92d4f396413ff1e0c9d5eb7ddd607621587373bd33e5894cbd3cc8cf736a581bb8948320b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f57d0e698ebc842e73937ec3d3da9ecb4337e56a959333e475f7aea72961d88bccb839c3e4297af5a1e9079a76932131ac45d8c13fb1d0f8858166bebe325cb3729f4ee882f7c0275fd1102684d7dfe3161dcf82e2e198fc60391378d5a8bdf3600114eddbd2231bd5dcabb483055f741c0310a50e78a487afd49d7b74116274021d9b609a88194db15a85530b8cbf08780d1a903717434b11c4b652a9ad59e96b03287eb3257723d1e7c007e54e4ef7b6419568ba0fb6bc26980a442ce302ca4eca0b024ffb3befa6ff4c86dd87355e33e2569d2854336041c84708f296e660a2552d3329159410602fb9d5f5182f3ad356ebeeee0d676511ed6ffcfb942221aac521020c124ff52ad38b73d3eea0f14ace82e018340175a8e16dbfd21df9444a9cc73a03148d8a6b0afba9a5d9356f2ee567cdfe6b44bc56dadecb1804e6e5639fcac43c0225acbdaf2e545019463d6acd0cc717929f29a07335bf4a1cd9f77f501083291d02148b7521250022d7a7138a86e88cd900e722e082a5119da3fe05349a079a114a032c16a44238cafd198d8fadc50eede847cfefb2f739f592688089f3cda94d7a1b556b66290c26220386a1bb2c0e647ca896b73c4767a4cf56ce92bbcdce91d7819e577241494d0d900544113f488209675db8799b7eacd842db8534342d6d4029b8e2d78565c8e10a2429fd397c5a7e0d2f66a58f6a72c6d38c846c86cb70b15af9d51f895d8a680d8d5da332203c5d71798f860cae38af8176ebba1b0726e761e741e39396f0e424be1e6dcaadad960dfb5f09be14b45cd2d53b3fd85bea2c9e1923fe25eb6fbeef920726f2d664ab2de21c8118789b6d8b6ba517b9644320b8da0eddab4f0ae88008f28856c327f9c911fa757d46c0ce3094ee59da5206b415b21a7064fe3cb2bf96872427d9128f37bceea58a7e28f2e163d73ff68b8c1de6b4c1f220b4e70616f8c996938b60ed38010bd2e5ee4b1c1ee26eb583c5fe8aab01f84c1d9f226aca5db2f6528e4a83d3768c0d8880a1d9f8d2021bde385ead54cf44f1556b57b18bb368c9ff2f3eda582610b0428d321376793a3a6c44028dc7027409aff7d56aa100591a240460fcd288804e1307ff5796c24e3e0d3c567fe2d39128381048b387968c0d22bbf770faaddcaaa1ace94a4bca2296a7f92e8ef51c3a269af79e00ded2f5d1990e340be85fcd1334c8b14b92dcca8b77f1efd3abe2eddc077dfa53bc5d96517a15215826b39f4ff3beb08288c12d3fd6d3d49f4c6ad9fdafa5d0d4cf999ab965da450672c7e0fcced8cd77eff3f239f17859a2c45a633db10e017db2fb75f77ae406327095367b1e519819d4b1ae2ccc7e2d07232245a985cb36ae8e41ee9ffe384109ffa7048fc4283b25ea18ba94ebfd98c41c61f6994bffbb694261dbd4ee046d6b287763f0def56a0ba65208c428182507f1d62c2072cd469a616cbfc0acc58896cedb9b984858ae66007e6319d806be65c1c3a8c241df701f1ed59eb78f0c9e4db0475c92fa8bf183287e102729f1fe146da2e08248438be977ab2ec4459e895f7b9afc76b9f5162cec1ff4d707704926a9aabf8193f9d97cfb7d455d642b471a9bf30abe2086276ff9efc9b2843b942713679c481c303428d20a9a264825f4a4c93ea1b7b50b5aa5c0e51da9f233983b5625d148ffb9c11c75765c76b2ef6e55fd2b7e4fbf6b86e47acac4f13d7f31d62f546a464ad8c4728afeed08acf0a3f04d919b0c639a1c13031094660e074162fad914f6e6d389d1a54a156d5970ded715c36eb0cce0a372e530d2e11bfaa9c3bb10e9a9d185d32085b678cf7f3248f2904fd982e41f156048014c9e7b11f0cea66a70f373bedb51c39e4f58ed6e8991665f97596f2d9d6d573fbc94eccecd2c2aa82ffda5646cd82c6fa9af35f17510d2b905b0f05dd4a6dedd4bfbbb6a8e70196ef0e1f08e576c04d054b3724ccc8e5bcd57e3e5818aa4a9d48be2be47b2aa8d15219fb09330463cf96ca10a455c50b66bf17474de857615ad1991e7928e2bbcbc0a7891957cc2f5023409e744daecd53a813cce6a127e97d4dddc39a89c9a4bc7e2689de90f81cda92215d62a9ea3b1887d7159d04791383690e2003d0f0aadeaa6fb0169a40b0adc76692d607480fc156901d9b039eb0efd5d713807880d758a1d3aee451fab5c795c2d0f9b517cb76bc8b147c1a15e813b05419757f20044b9226f85560cdd882b2f364c499cc969b1ff78379385003f910a97dc2c7fef84b13c3e3bbd58927edb6b3b59038d9ca84e77e812d0c11c5bab4aebecf9514268f7e844ea8f2e81c5c97235746710f440b26a74658707de955b0f11477f338ebce9e7d5ff5af0977ccf78625b9629c862ba74eb75b51d3d2f69cca8c5f242f0d2eb79a981c84f946200eecf86b29661c9590b", "ac", 3, 808115694, "40cb9b881ca8bbc92e379915694de2904dda67152d693c9313553c00d63a1584"], + ["030000807082c40302ce1f264bbca43b936096742e094b5cf9ad7ab9e6c4f3f60f0edd915442eaf467020000000651636a6a5100ffffffff5fdd280fe4132d290db1da92e6576fec26babc688f0be10a2fdc163c90cd04d10100000006650000516a639ea9a0be023dad0e01000000000553006a5265d0f29f0500000000026a63ee77393e0000000002000000000000000078118f00000000009e3a495b3b965b7b7f85b838e009da4a4f1f96e3b8f4b939cbe5679d1ed4628544aaabd1f77a58a716b8e269b422e74c7239f8555bc1e615f4b59c1dcfaaabdd765f8529f54454a54436d8611478fd3b9c07083230019fcfdb20799acc54346300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a9028a7c8206497168a2550fda71d48219577da6d6395dc0ece7c72b03fe09e97590d63f35b996a662fc2d0ce9c9133873fbb9682baa1035cb79b58295ff804ad0a1daea24e27485d632b221de683d526fa3690bd664900ecbaebe3fe14d4236f538e6519fa31f241f6a5bf71cf76d1204ede9fa5f1887927d2785096c4263d1021a87d1858dabedf12305c8df9cf8bee0184e60f579df03d7ecdcf09de6c2562e022c81a07919e0aacde64f28f73552b0b203d5b589b3c61e580ae28272a3767f1f0b073ce542968594b39a3fba107a45e0a62518376d1f94a720b73c79f25d4e9f2ab356a0e00d2e3a5506dedee0e31a056d7e92c3ec4c38ceb1bfa5f7a5e8620c1d022004f7a4b0be4212db7f9e3e71c179b20d18ea6c6fedbb089d27339b7f65544d021a3c68d5322360bae9f7c66429f48378d8bbbdbe682d09a5aa3fa6ace9f5e14a020a95eb696753617a21685795cd874fa3f105a5d0ffe6c9bcb1ff99347656ffa102305572386bebbcf7556703a40ee54e37832f45488e9f56a4b69ec84a76f6caa9022ae820042171c8c8659b206f5c12c61112220c6d215abd2a2ea04f28e6fa39649f5aab7cce29e51a8c24e7259c6192895482ba5a8503ad9395a9e5f1057e260adaa5653e4355d55e4af522f590dcf5ea27a8681f0a50499a451f253e742aea5a7ff06b7a51495081ecace3d43b1402bceb94864c52490293464da6d23c6e3c24b8f24210aa468403f472afc90d612394a74a9b196163c600f2de3a0b669554610c7405b44b4a85d8cd3d8174cbe7a1eb3dfe9a7a12a0aff290da025c97eae3fa7f776705a810888d69bf3c7e83f597580b8318283f477e0d2789f08e7f48f16bca2bf31285f10ab0eb446c1c74d82401c6dc1115d47ceaa4b6c130790c5631bbe5cefa7305842a48000e0f48152eb30299ab94053d0808aef1a9dc32e9461d3219d995ca02c643218405905fcd195fad72d6610e79bfe11c7893102bfa3679ba1a612849afada7d86c818255eb406cd394abdf85ab68583acadd1d269113231c097fb4991af0ca751f090bc426978b96288d216674c332266ad54c5e6bfbeff17a0786bca7e9531b9eec47a2509efe0fab1e414d6ef22b6af0db281aaa59215cb7f349ec72fe060b25407797a539d991690a536b17e009afb9472d5ea834ce53fe8fe0296b58d9646548c53f1a66b94eb01436c740bc970a9fa00e872b34b0fa09ef2867cfecb5d16a23ed2e0226054f27afbe22845121bae1039b456d167a864b947efa8001284ca54615ee98f7b467554addeee433ababf73c3e45db98b17796b5a4f519e8d32b4ba2a51639027969e6260025517698fcfa3b23d6b930bb8b6cec5d317e3ef6b16ea77053250060eaae986942a60a63bf0093db864764f14eb916b9b231a8cd25d6ea21ea9cc5550fce3512394f4b6b65796b7d8a74b15f15745db0ab0fbbe7c51105bc1c291e1f93dc1c58d728bd3c4aacf6eca16edb8e10575ea6a460d183eb34420f0f8a5efb45024330257803b08b41edd8390377002f01a3a6a91a93936e92be7cdcf82aedcaefe1f75447bc98417a2c7a7c1af322b0a4fd16bc9ec2d558d5bba96ff0906cd11bcaa8f9521207baea0434b1bc23a1781d4c64e8f88f8205eed2275f24679bf744ceb200f7178d35cdfd65334bec609e012dd3f7cc2b680228e4c3ba535e92b45dd3ad1bf6f9fbe9e23b6b27394a3f0191b1d643ee1085a50c5d1e514f9c0eb8c97b9299d60ca9954133dbb4bfbd2270a68e43a83af9698af5b67f743f27a2683d089e8cd6a4d12dc650ce7383ccdb92708f4a57bcde4218c6b26172dd92cf9909e43fc86339f92c25ebf1485871146999ddd8caf16e92925f4b8ee55b185be786e468721b393f9576b92fa3a71e65857810314091b27cb09a592e9b9e872f6ef68c2d37218cfd0333d6900fba6e167e52f2df0b6371d54f8f1d88878f4c152d1ce30c88ad1adb314c662b096c0dba00faed0897456d6f08f241a7b0f098c5f34fdfc7eaaea190efb3273ae3e42c04fe0d59d389c80a5eaf9c6c7732fdaf5ac6992f92d4d915921c0cf7de653795f8ff6931ced698dc8042ddc4a30a0af22f0fe865c560cb5bad421d5f8bdbef10693eaf702f263aff284c02d1d88e1316181dc90cc294239d57b115cf2e15643faeee51e8df5de87d8810b9ac2bb078dcdda36e30e9d14f90bf8a278f94cd9ee4ccdf1c5b7dd31e42684adc98fd6c3439c7b2cb62846a367c5dcec1b9be438e2cc060636e8a591f37852bd1bfdc7ae3dea816b5480000000000000000cdc2b2030000000055c3667ebd73650fb16288d6a30cf9c663b6ded424e33810ff00bd99f8b002070e7e29118d93d2adcf366528a8fb9f7df2a06c8d6fcb0c5377a83f11556445030fa6d901637f3d6c610e4819e60056b5f9dc23bee8db464f06429c3dca5694e900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a5026560d9f357e46ae4b0f9414863f4315c47cc7c1939774babe2fcaf92a76927477f159c958ab5d50391efa60b6a0cc8bf36ca384900befceb8e2049ac3ee1dd87a90e38abe476478e8bbfb2b3b843294d1f939097dcd93d1777ce1fab362b2422bdb64e2fcb5662e4bdd1ebfcdcbf43bbb551cd3b693ae879b6fea1e9af680209b240086a4a008def64f56ff9208e6e14297bc69988a1e57cd10c8518a6e674020bbc5760aa425af5bdd22832302d886b25afc57ddffd816ba691a6ff727cad6d0b0478c1e4a9fea5682b48a60dbe53d4a0a21a4ed7fe92cd63cedaffa23be1efdf0a2d6c5b8a16bdcdf6960aea468f39b3e3c4499564a002f7308f72ad892be0df03274ee85450223a0f042750a4a980d985ed63338cc817774d5cbd1b9c3e331b59032813cd74ffa66994f0f82f9fad74e7400f4acbb14db385e25107ba824048fd2103283e4ecf3d0c46044ce84fe79366f4af9b9a557c6cf18c032c4e151a457d4e68021a4814d04b1075f61e692917f23b2c6141cb254e246e70ce461c8ff71324f69e030094b4c12208131d8649e838c7103a5458f9f7fcb3f6501601d57cfd88e151d1496797ae104c38bc10017bb5efb6577e1088eee541d6adf5d4a4a7dbb2b5b84dcc2a4e6a1074cccec6188c3d415a510e5b09a3648c121b022ab0957876600ac837261b7320e63ee01e248eddee09f32fbf1826f7195b5b0598b9547178f3925759ab243cd7a379d6a785ec908f7b5fba3cd4c755e5e81121e88bd9b5e490dd15eeb9c5842381655315895d37d94093eee0bbd8850eda9da550fbb6ef0f5a4a532d0f48f4deb730a71678872fba8e3eaf06ba198a7d51fe805e978dceabf7b6f5896f399c25d50d50dc6caae04a5df8edc8eb5216f838e570db567d704c5cd28c1e241adad9acea3c6f3fcb511869cdf272cd04148f89ef0f533467f52c4bed975194d32481f569caef9728a93e23e1c708a7b2e286b5e53b136fc2b8f54fc53b6da0bb07f9d8e78c9ee28bac8014bc17a8b388fce3685c0f8fc030d4b30aa35f4139554568cd8a154e8baf3f0d12b52e57f1d49b9f11970ff4b56a3c33958794af6ddb594395bbac4d73c4bd658852971df279434d7f2ff72a8f0a0ea5b94033ceb640ad76dfae5043bdaab94971af03a5326edecdd052358b64b85b6a41c2bb8acb83807a6b2b7e13567348bf223ae8fc3fd6cb264cc70c3248c3a09e77a1c2942c94168ccf72443ea2ef797a388e30e7f3dbeaa66ca43430f81d3d11f3f555d747b476cd0b8a4dc0581ff7f9c0a20d791520ce90eb39237425e486018389e71f7994a930306caf6ab8c73eb8b7d567ba5a32ca7da08841796729bdb6f9394a462b37357e737715f320bffa846f130b3f5e2c3d3f34919354ce81e3092d9e1b7125f50ebadda1f569f1014ab38413335ff223134ccd9c2e825bac1a57825d7e8a4bd736543a413b927bff2671050384628dbdeb7456f029a9df5d1b82f1e04dca4b7b9c42ee24a5d4dfa23a15473c4e9845e7b9bb8f8d9e7520c5e35ca0a9cdaddb2d087061a22ecf7065bcfecd5e46350a8756c60f61e4df149810ab5b31baf7b003627d36f194032da73ac912353f1a29f1b8b8c4154576464764fc798fa0561f65beab75acaedc3b8ee95df2b65ee15412bdb24c5434af41e2dcd4b4893cb4a384a012633f8c33d3de503593f386842a81e4c155383050d2a75c5e02e4088963a44f014c45ade36d980a59dae8ae6a27bc9c61b12027ba66bfbf928c42ced8b9fb73da139d48d5ab96732e4835ccf49c2064559101b44f007d5bd915a47731921be198c4844d3a7c10a78211b1ce37c6e67b0a2cb53854caa95b9d6aa6b311e3d1c27c426fa66cece53cbec38d9adc4f06ff27b55c9b41d45db870d6b6abbff763dd7df20d00e36c2f9b72b87422dd3ac4a7e931df237437e546e3ab4c621ba1283b70f2ea4fe6d2744fa74980da735cbc88a4ebe7e10c4e98d3a711aee39313696f7029a6624e87314829a55638471eb12ee97f430bc5202669efc2446148d04b88a2445c5806d2364655e81af3f06252898db76bae8df5addffd166c43b69fb17cfe9af9726823dec95e8bd7474e663ef41d496766cd96a42a5f9debf368565ba6b5099be5cfb6577b086fc5702da90273633184d5477a53bc1c6a7a77789fe4313b4433a87a38fbdbc40e00042b0a289144610d3d66800e063f188becb23a70e7f930fc6f7ed9626b5c4a1b182d83638fd22100fd99a666df5623577c97c71e469f48cd7484e56d415e3b1882490304cdedfa7817140a62177b44ab3ece84ba2e75949a8cd25295605a3fa241fbdec38cb2f5a1cfb783cf3a19121732bcd2dd6809da21ad7231352f8f6fef7fafa5b58c1837a56759e93479a72e8f10a3218b4924f5327e4559897a3e2d4efead08", "526365", 0, 871267564, "07d62fb3eac6a45573046ecc74004ea3f3704e1305ae5d7e22738044d7f59601"], + ["030000807082c40303a0736fa57dd5ada504ef8033282ec3b21683d9a11bfb886e387d0f9a7b1bf0ac0100000005656a53ac6a41a1394d26deb5408eb96aa381248be154e70e659b5190fdafd2a22acd252c824d3a8d07010000000763655153005165fb5b9f62cfb084b4a526f7bc45c93109aa0b53f948b85ee875ea4a4dca2e25169af1c80703000000066a63ac536363eef02b1b036f9fd1010000000004ac526500fe5ee10400000000096553ac6a00ac6a6351589fd703000000000025af1a3000000000014e9b160200000000000000000000000086047b91e65a8b5e9d7f2414656e45ae4930a3fb26fe46f472c4fbdcfc5e227ca08037d6e7ff9b61c4d7c6f3c56245a0281f817ebaf29f3d926e91688bb483080f6aed85e8092b18eeb345a2dfca80c3f93d8774f39ca73cfd38d7e8b4dcd9b900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000743f852ccb10ffcf8337f5cf35894c868bac2cea782e0d11d2283779f71a48b2224a5bee71369c97108225ddfcae5f777b8e446bb84b9e0573bc06a315bb6b029f051e13f643e7c1a12744d98ac59214bff151f56c1415d6cb55fefc411b4193920345ed145fba66d5dae2925c34fa11f3277092a810f8de076e4c9af17df54a032ad37351d0ba111de9517a1b9ffacf9978d09439fd1a89bd727bfc46d04990cf02182371b5a8f2919f979e01927a76e5805f4e98572cf0e93689105b8316eb6db80b080784174d7f71e860ca98b61aba8f6aca9641d031a34ba57ec6e9f564bda3bf1067ac8c1f0a80401c0af8dc69236bc1aef10e5a63a97d066b9a5b2179112d420321b8649028da0256a84f5f4d81c9082ed9a2c5c218964f4dbc9e0dd41c5f19a6032cd4020c0d583e91fc80b95c4743efdc69a929d0bed6a477739e0b879fa4a39503295299f6f2315e04e3b57d86afdb8afb9df629075475727df895b5e8f40d6c6d0202cc298561a6e1214671ace81c8991f233acaca9a8302d43d54a79a1f35285a0022296b9ae39664407853e319c85aca49c5e4866ee35c51b4153b2e0460e4b1e0a9f801c2dc62c17bcf3bcbc46146d74b86073f4f3ac8008354dfcefaf041d9caa9eac58f938b0cbd255e8fb3a281232d62fd3362ecad6bca560fa5792420a7d5e3b2c58bf79d2bbf7ebdff418ad9d4ba6e033a0a9f2fb52190c5abfbc6c87647e64064c29110883acc5289029417608d880c8dbd6eb4eadb9d63789d6baec4060f291b7812605405155ec820330f1cdb061d58fb14fcd6ac9d03646ff129d2c455da0cd807afdbb1a343a8753b0b28f010ba97f2251d25632414cfeca28fb89d7baec974927e9be1be6912427792d2ba3fbacb7862bcc184d2c791d0b3b5d1b3730474c4166cdc68709bed5c6eb4226d1ea4de38a400869cbab79eb3f3321fcbf8f09ac6a2ec1634bca9de61d1b96184ccb33dadea6d0b4a4357da57211957f2300a940a92b1c77b539bd373b127cb03162a64ec404d11b010b4bbeb9e4ce701a37f30f9b730cf01b1b364e6768015439e70c00e7871f359f7f5715739fa079c56b39a1d49dff4d771e7ac12de5acda6171dd35a029fd0b213947655740645d4718fd72af0fe57931852b5b399d0fd52021fde561782dbf594ee79ebb995d1e4e38a8263095201ae3a7f31f86dd9243db2f9ddd04b9a8d4b265ba8a21f48011de2b4258112afffd12c7d25fa9556b70becf0dea844f14b034eb7f44cbc13bc61fc8421aee1f11b824fad8259f3085abcaf72998b42a7de149727f6623f951ce0fa5bdd370bec6918bd9a12e8a8109327897c3ca6ee97e5c0913aec13216ccc20d06e9f3b53f0f73aba01c94648cf94de90b5ec172f2ee6a54b7c981934057e8bcd3e19934556d4c4c17386e925103ba64397f53cbdf797ca4be11b83872187c2d55b03b5db6f03f6b686bbd44ee906879bbd6f805b79de1658dcfe7b10e74528fab8f607d5e5493172401fe416b1caa2252954fb1c5d987330606c469e093538688e9f54469b319f3578ad3103c9c23e7b28fb23927285da9a2855ec1543bad015bc012c0d92b3ad564eb4b3977bcfeedc46733d6443625eab998f40453c568793072a8992a82170bf8b79be14bfaa98706cb6c9b4d05c1d20f6385c0428b9ad0019a44741b62dbb5283f0805b0602f435529d7875db1cbac71aaa7c292bc700b25eb92f2769eb3ba63a4e88b19b9d9a9a7516a1b9e026fb210d6d69c3a05cd5e78956f1e9a81cecb0a63f68dbf78e3b4e40de1debca0f02db961624976102c60312dea1ed2689d3269714fef0620671446bbd4df94895b0e32dab6ca7e34548c8fdce3fe02dc42027c0a9d31f2ca1c9184a28dbb84a18f8efc11b3164e705bae29dcb9a5b3db7699218bfb3b3b43ada679a24295f80ffc1dd245f15e52c6b1fe6279a642ef4c2217c11640bde6beaa32e97d739b00d4ec319c8f99b51ab6a9dff18e401940660647b03d6b73566f0e9dda2e3dbab0e4b884929e7c875e4febd486f0010da7280d2ec94a161d9c2992ae2846efb96e695df7a35328881e7f8a3ece7672d5180369be673c6ef9698ea286962d49c5549ba87a4a70b7761ac0aeb25c0af40fc15c7a3583a1beedce31eedf0af44ef963fb000721fdf9886752e00c6733809eab1c62ba7e1ae8c2c9737e4043b2e9ea2f6fe5f9330bbca3bb935356529c3e8f30f74609d18cc6edbbf72edeb362d3aa3b89ac2f57ccc47b78e56390f5ca7f794d29ecb4e011b6b44fa446b004b3daab8da91a426e02baec7eefeb5b6b9f7a5964da9985dd9d998abd000a378ae40e4afcf3da617ad9fabf47ae2e15188ee267bee3dea7018413d341f6069ff82f26b07fdba18125e508a764d190cb7f0ada81dedbcb0045a14c6f843753fae00c", "51ac0065", 2, 1230493620, "464c5cd474bc3f99b6c212f925167a926bb7c47bb8415b4f12a5e61430b1e3ef"], + ["030000807082c40301cc8e5b476c1ea66a372f9e0756a581fcb5ac167a1d4a770903365705f550503a02000000026a65ffffffff02d1066703000000000352535312daf20400000000026365c8e694cc54dce80f00", "ac65", 0, -750754052, "771d258f19a8002e7943de99bab283260800d5ca962d1a0e04923ae49606ba8a"], + ["97710a4f029afb2bb01df350b75400ab11759e4dd8a29da11f2a3924b0586d2cfcdb556c7c02000000025263ffffffffef2e83f2a7bf6bd9a3b7f3e9f53b657a3edd2f9cd0ad5a1241371dcd6e3be63d0200000003635252c91c078803753c350300000000026a53169ad90500000000066a5151635300aab9700500000000060052526563520000000000", "630052656352", 1, -1910805984, "253a7539cd6c931424344b1306f3d9ac4c6b8b8ff03cb7537787a3033a147f9f"], + ["030000807082c40303a86787627e86d55c22344c2fea4c46f42cfb2e6ea29b18d6be94d82bd481c4560300000007636a0065ac536a57cc15126aee9e6e4339bc09580a9ea00f4c7b6a5eb0e7a9f697df2335e72e6c856674d902000000045351ac527029df2dcd9a8084b66368ad69f53bdc0d9b576bb2b04f6a4827a05dc3fd7d2a00b876a30000000008535200ac535263636b93c2dd044d5922040000000009006a5251656a0065516d7aa30000000000055300005352cd7e8a040000000003655165971e830400000000075263635151535100000000face3c24010000000000000000542a460400000000aaf55f31546c6b2e41ac7e6fca70563ac267ed8dac780023a00c6da0f2aa211ebe2acc0320b87fd040635cb7ab33f9aae1c2d7a1cf5be1a13de6f4939016c789c428a3eee78bb6e178cd7287c479de17effab2c44684ccf695b96fcf26bebfd500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa46299e471a3e6a9d993650b35724c686e2035d53b5360a73f56695c7b0ebeb11ac6cc89fa4a317d047ab74c52cf2248d49474caeb84e7ec18d9418cda100d7dccfd7174cdf25ee1aafda7b204c389878bb6736804db1b171a4a74cfd2c390d9f69fd2451ec496451574562f87ede44eb1a5290aeb7469c0a8f2e2fb00c3702032b6c7a4fe43ba50651c05aa506ae928d10de92a487fc3ea9bdcf112923806e940319cb933ef931fe211f8c9d5b7711e9f2c37ddd724a51664b8bb520589c5d02930b07dc3fbccb80632b63bd77326819592e9091a129d40480c84171fc57e9b553032c0c8d1b1e27f8ab907884d2daa3d1da97bf4c571192597667f81566728e5d840211e336b2d4ec6bf70767c12232d6ce3a629cd15b58317af6b7bb85b452c5662e0224edd0b179151bdbe89e9133e0e597a3d9ca3f1185e23bad7e004a29528a7ad8031a4a33105df81a5d07b00924e4641c3292c754b204a0908f844cacebf9c3e168031428bc19c61ad2b3f1278349e15536320088fab8eb50036cbf3d432716321894021ed3683057b28147b0fcb6f0db0e62399ad1c91d2e551e8f01fdb76b3f3731d33c1eda04c228d015c89e1604138e75b2f0fadc51e6d3bc5b9b55b6434065421a20b834e24dbca2b18a7bb1a11e994beee97deaae086fd0060831ce6a0336cfbbdfc42bdbc1112dbafe943591bf69d41f14a5835673403aab23a80a6a9726bbb26515bb06b10e6d09d0a38ceb806ee9424e2d03f8649add218bcf8a87f47471663f8cbd99fe851cb9ad0ad69c73e05defe89cf0d9a1c36e82d4666f3d37d5eb62312766b28a759fc66c5a4e44bfeb06d13cfe0796f3dd40328d5de1179d1a7748791e1b62aee44379212b34ec2b1384ab0cbb9440e31e5782c4424ed1a280ab14cce1ef559662a9f498af361fe857d7193257dde723bc44c33586125fa36b33ad1f60e34ca1923aa08e78403a229935029107e5f3c8b48e32e815d2e2f8f4bed3d70625505723c55cc2b45b93302d8533c1f951e38d2fdf7541f3b23388c9efb4aa63b1ae2cf316ba4d9288bbd0f43b897fde516cf1d387b4267aec139fc3bd744944de5dbf6b61932c35f54d34bcb0f417006206425ebb500fb9a3f66d0e035b76b047fd9632ca5ea33c6bae7c92c015193fdb771a949c182d417979f6b7d49b9b25e95acb324b58151cffe5ded71dccb6154f063a61a2fb917eeab80d21e039f2215710398367ef6f83e1e176ef98058110850d0a627f4fe3506249cc3afc2b3e937f86d76f10ba063ea92d5cbefed994278e89de4f8c5cb18bf6db431454dbd1196222bce1496514e1e428daa0778f1eb28d58c730a2ea4c982ca7399a342cc8b467a29ad901678368d5cbb2d3cc440bc24b451519baa0376f845ee026939416f6e7d152a88e8533fd70f3f9d88eaa547439cd95c52d5d3cad38a7663b7ecef542d5d9af80c2fe11197962a21a03e7ac5d0433ede3fb6984a3421e3eafa049973fc2c13f059aaba5fe7a63a3219b13228e6ebc3e5c1f362bad51707c5ab1c40eef1172b69b7c73062b7f82bf022d7fbff35124f5a862c9f55d1602731b8b608747d0f5f903c10f801d297b6098e4403bda3c9dd325d6d1188e4507f8c8c4cdd219d1a2b078f08a7c00924a3be5ee26760a368a60c4a0c70fa32d8a85a02cdd188ff56632a88a7123eaf02cd47220d45bef9ae9d236174818525dff79185c9b79d7a6081dd97f2e8c515a281b6b298ddc30a1c3d26f4b51e8d94367bcc8ab884231d45f81994dbacb67b1e9ae98dff9a24d08ea3c74d34738b8611ebbc729bdcfc192075753aae60c1f2a5f451eff9c62a07fd0a5286bdf6cb1d20aa4cb19f31e6c198bf1a45c01b0c31cbcf98b60b5afdc65324f304c514f7fa31ee6fcfe41f542059b668e31dcd980cde4af853d536412beefcd82aafed51a1f7947bc66a4045927afdc43dcdfceb34938642f23bee5d81738e9e87497e3b68a175506487b12233d88a92e4d3cf6518e9a33b3e708a1a7e93a8c8cc00f4d69ea73b207b0d52793f6930655da8ff54b9a97574cb94bb01e05543f421dd7f2fcded5d8098ee57693ffa92db0f3400c250165e7740227bbc540b4331a028fe721b73851c3c11096256c487b858e2104619fea6379acf541badcf3c41f55e857c0ca4025aff243d944add65a07101b909de8fb27adcb279897c4643c0b6155ae9067ce73fc5b35d836a5642ecaf20de468b6630f0c748fa3415c981cb1ca1add98040d33ec691eae9b5ca0369a719502d5ecbe323ad755c2ee1646235eeb248b91b78023ef379713a0d04a02fc0d825d16d408aa70a6d443b0f7cd8b2776af466ef4b191480bff4a9170e2cf02d1aa402ffc776986c6fa23bd1e3c598daa2bfa8940c0e43fb89d8a5eda755185f976e1a2b06b4f8f54071f0d", "ac", 0, -1010377713, "e1a9e380389130701ab0c15884ebd55cf80e0a73fe75efacfedc727d9046d260"], + ["030000807082c403012fc7dca3ef5bac44bf19063e865b8806a12e70c13554b8bb07102bdc637748aa01000000070063535253636affffffff036089010000000000086a6a53636a520052d8599e000000000007ac516352006353875762010000000007005152536500510000000000000000020000000000000000ccae790300000000bf02c6cd42018075a9da9b0de495188bd46bea45db2287ec0f95106826dc225042ce4da7fe2a5e07d493396437062ca747dd18a6f83778be78e535b002eb2e0f57dcd594b0159a6aeebe15fb4338209e5dc352e0697e7eb3a03f64b4071fa45d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040841e98b307a2b72b0d2b35231ba68cdcad7cdc1785ea9cec54f82dfcce84f3b15b8cc887eed23f96ee81a3ff54915dbc3289e0c7c06ed58403a7de9cc4680917f8797b2521232bd9c9c9738e9949b16c52e6e7b4669fa6cebbf25cc76a292ba732f38165e53ddefd92fe15685db0053c7e49b85f2d3b7ae86db41763a43e1302270282aec190c46c02b75b43423ba24fb1debddc3c0a4b52c75300cf796309190215990788a509624cf7ff02a884dba6e35c0f49cd72f8e6f828c75c54e47636180b03d8fe206d739f12cac6b28c1b01811f957faf06a424d1c38d3f571b2af0113dfba2242094cdde527d13629e3575881c905f0be5ec56aa8efd8cda5657bdcbfe0327c2108df5d33c3fd01fab82ebd2c6c26a93ba42d2ad1ff9e9775c0cc70d215e0315807849d9909cb62f3eb74a6c221b6137e0ebe000044640a0d8ca9831f5395b022275b2cdbc8ed08277480a50d8a6ac3fe67f06b1167514b9678fac77cbb884a30309334944afaafdeb7af8d2decb3db991ab7a1731d0fbb4ad808189fc6de48dea030d50b304fbd40b34a014ec2f985c212803e608ac93c4a6ee0b5eae152f3ec1cae9a9a8fac6c1fdcfac6a4d1d3553ca4d985bc8324f77f7e16763aa391d697af101f1735e64cca95cce6076c965ff380e88206bc4bf46399058a4626910634627a6404fe1ccc395a0b534a1b5bf824761af14e5949e9aee12ddea0713d217d7489f1dad5646337ade84324585877011703871d4ce85e36a4507406d9c86f69dec23ccd5936c0bee262b1bc0461722e020367f1a8607d01a56e3927343ec083da27fc6b001403ea82b7641707f2e754892a2a5aa7c1258622208cd077c2048211a413b94d5bbe78b2011c9f7668aa3df1e66499c0892962f856a3efe2e1b27412d636fe413cf9c916ed5485664ee8ee6fd480a647ae9bb5d2e71cf8d6201d502dff9cecd6f9a3344118c70417670cde1e3d019bce0dc5efe67a84f52d25c6534ce8b5297df9ca40212cc9692188fb297761447676bb2c2a3859be27370fd4274477cd63a0663eff50e28bda83f73c892a75de4a9c005db2f30d18d687d22e7d642f12219ee1147d0b13eaa8d8885d7421c3d0bf5cea2f30e74ffd2fd5039bf068ebf16135543b937cfacf5d068a5c69866e4ef6b09cc9d293857fcc96494e1cb26a2dc2a5f7b43e279487debbd53c7927a357faa82ce8e9e84ba5108f838065a4010b0513b83b40c31cfcbbc47daa834cc4d85cf685cb13129feec2debcac227795d71365560c6f9320503afd46d1d2f487fdd0f51ba6a284b63cc2a027fb807c8e2f53570b8242c7da5e2b5dcc7bc38a5fca8d2c42272f893b9d9c6154af682e98124a22e1e6a9c2c98ea399775b86474125c863e474967f31c4f0c0040702fd2792173cbe2fad0cc72cfc2fe0791cdb3c6744cf7577c1959391d8a4e30dca925d4fd979f04b48d62d1245235be7ba6ea2bbddeb9b872943cd8f0952478e493414196642c6a3f8a92b0d8d562de8a411637a0bac6de0a24436dab131517a7a87bd8c1c62e6efe9b99820b3084cd578595a13439976f3f67d920f5a08c9a022d4e5e91aa0101b48fedc8587c3115e024158a706f9cdd701a7a7729714c813ddd31ea93e3c87ee642d6bdaef7d4823ea91c8cf58b364d373dcec48111a8ad2ed70a6dd2d6686e976e1913784f0e224be398900a65dc8f64cc393276a86334b59605acf8e90af92fb7910a5947aee54b41354b666c1f68870185d5cde873f878456e5432f4a60ba132b43e08288963ecdfa87fec825200204f1a55d372884ec8a2622700dc1b6bdac91274bb445cdd3128c107706aa6af2cc6a28d7b0f5641f82a75bfa90e99c02f05e24540d3c213f1cda80b82abe69b1192cc92d2837a9f71bd3eb7d2f583e7eee1691ddfd1343fa9c86a62175dcfdc34ee77c8c55f87822ea975c9604929d080bbcd5ef3f7c4dea0c25f1b18f8303497cfee6fd4fe3570e5423c727d6074deb3ad58f4f9e1b6687565a1189b8df98a37f8a1ebbfb4b7d9290399eae578f59d43bd9e31a4305ee528c7c6f8fdfda1831562f7b668fd27a8d484f91b9956cef844492ddacab01420640acb8feb90526880dcde4bdd6fbb4e22587e58f00aa42daa005d66e8aabea30523b698ee4940954191467e5990567d2a18f747a14ddca23ac67c600e5d156e8188b9e4197c8d387b0f76358b7005e448b639dc78544c9266825562199be3bbdbbbcc10b8eccb923088cebcfd83db57a055c6cbb5326e3c8d9ae921a9a8c88926efb6ac190000000000000000c0204a02000000009a08418bdb593e2764fef9c6025fd5fc76c51e146bd2ff32506d3214071a5ad3065e8c798bdb144a7b29d0acf4334c45f264a58ff427937e7ff7883b342a64b0a9cf3a629a1d0c48906ba8ead8d5ae4f1e1bee33d1fe03cddbdc44d8ad866c120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006c1901ef622e731bec2555c170ac42fd5af85935c954deee1029f97d1ca447504a625c657ed81372d9e3ca61f02ef7ed6505c0222f096d37daf26b4cd8c119f6ca15c3bd7e0e85b71e219b993e67a59f5853deef0ebb0a4ffaede7726fc16c9a27ec6e3c599111e946d8ffa34a54071429835b41e1c3cdea177d2a09fdeb4a7020c6eb6e2bb1ca51063999ebb6cb8b0c5a9a6ef36c72c7f784ba38d2cafa90da1030bbd15d6e5f273768eb0217818434d4154336c0497ca2bcc3df427ab4a5fc6840a04e2e422f2b2b36e87be0aee1c806b537e7e295012241dad9fa9a94cb7b7dfcf5a7d4d4a3e6c178e7d716d5e22a3316a99ba8efb65d1438d87f52c8b7333497c0209fbdf8ca9d0d46f53a09ce47d474341fd9777bb7bf2cd1fa299a11f8643b3580316958ef5dfab8b0f1d002e3a2593ac2298b122be6fc7005a859e13ae51ade3a1020dfddd4085c8975af7656d51330e568a4e43fb3f1496c4e75eb884f2c9c01a9c02137f7d0b97e6e0eed45e90aa22af81e6485ea3e0a9799070b6f93840818e23cd03136ee94224ed82b9ea623e23c260c3a454e0d963cfafcbe8cb45f89cf8cfb40b333944e893b8b64ed76d28544ab098abdb66384a24af39b1d6c5c603a0db3ed868a4d40aba2f7f0b3f4b937ebdc617bb770578b33e55c38fa396fef85579d5489533a368b5239d750658063fd5b3be6d0e1cd0386a1f5e0c64e41b2d0c497c38aeea1c44a9cb6de0b35e131c220b948625ea01c0c01ab74a31f925bee1396315135bd107053f863d28b71d58c2ef35deee9635a52661f1efafaf52f14911df11239355cae749be8fdf46e505d5783e6668aae5aa371e8686153869d3921732c6fd48a39222b22acd0fce2dcdfa30ca08519968558186b136e8e20249c648aaf0695ad72a0e57e913fb8b7ad8b8e845326314b2709b34ac8e98fdf08d26b106f1f2a6f7f5d006d4af0920bc45d7864ad15677593650cd1a7755bda718224712c9d2e5e7906923c6cd4458e41e7b8eeb0f0e398aea61bf6a165be50de6c46cf67071c951316e1106f8b39fe9c893d5f267134823349fb8ce918e5d47db57525c50cf67e79b2f1ea26b4b2045d30a188022867c2c11af05a173c63ce828f0427ab6ede852077fa7d2338df9a8858c7c076bc4324e0f2eb1b37003d1274a1dcf4fb39c8f5b3912833026883f50606cf4b10476fa334811affa005b12195eea3551707ba4b4578771d24f8afcc6a0a692f61c71b1dec879f2c9c5f0c1cc3e8d9bcec4bc0d78d2066d06bcbd23a22889a4f9f6aded5c5e6e87d6fbc8573c3335ec386f3307bea085e854e665e9de3759aafd604e2d1e64e771b9fc6b6f592023951faad7bd10789889f320c31e76db1f54ccafa8a0b71b5be6d180d86e0502859d162e19b5b813aeb651cbdb0260ca5cafc90f6ab7572800b904522fdae5504144a87aee577f5306465b1d31cee8f01037c885e80c70746f2647a8f476947e343905c43a6ecfc16362f18b42ac9f748689df53a1110ddb643aa690a062bad268e8a29901b1cf755a0bc5ae498dc3ee136aa6d58c254e3107e8a5290fe0a2a36b619f300f0be72cf387d24255bd2de1e7861f8a01995652206b9c537cc8fc8660b8fb63d4d8f4dcd5d9eddd272cc2b59b6c4b43afc882ee9c338c1f9f3c3a2d8115b41e72e9484d8fae60281e02169c218951513176b069d0b61269545d51fe17b1007f642f136295dd94884d43e3b3d4534496175d2f67f90cfb208fae98a105bb3850b71b16e400c3af1b49798c113455b7b25e3af114441e2c27a4414779ebb0f99726b76878486477cc9f58817867e2e3d050ce1e49c702ed691494216b5f5a9189fecabb70d402de2c601fa684b134b3fafc4c9e59d3b005abaa44f3820d8203abf69ecbf8f1fab606f662e6d036bcb9155e6fd7cfb1edf2a6c97681df755236dd77e1d752b477a4aabfce985fbb95bb6bd1f3b0ce346ccc67b6cd0f48642c6f8dd2adf99e749e266d4c1f6cb7e5a870504396152ff1be2df9bd2672bc18d591ff40bd69648f852012c9f27e89eacb008feb60548fdfbf56818b690221cd987df37888ecdd32741f73a13526d600f191d28d5bce097db9e9b7619c78a5419cf1aeb5ee96e55030933c4ce3ce4d4a8efe6bd8f0d932b787bcc9cec0f090fcd3fb2e095b648dcaf90a815d0e604f07532ceca1c1b5354c22a01f23f0feabb7f2d22252b5db21d2375317cfcbd33896d30e804b28f22c4830f2fb7cb1637c2509c1125604d7465b66d07f5d9ecb4abdc5bd702d09fb66d4a3891f0f35326c4afb87a913b832436b9d58391395a2db1572981118e973d52d831e6c356a3cd7c80dcb54c2235c625c93a4fe3d474aa7a5407a5fb3724df607b0859bebd854e0502909331744f11b9cafe4c291aa16d7f601a334f903", "6a0053", 0, -1172486978, "02cc5a6441d23df3130a6ad385d68b80c367b537d1679b8e44404b742263fb74"], + ["974c5b160116299a967005a2dfb9b2f55754031d49187263f8c2f4fe21485bf09ac07f5a850100000008ac52630000655152ffffffff047cf650050000000008520000006300525187a00b0400000000076365516365526ab5559c0300000000003b109d0500000000020053adc9643a030000000000000000b16b250000000000aadcc73fa8892abe5e1a9ed09ac9ac444636cd5fa0663822aebe82f89a8dca3c94035e98ee976651fcf4a0467378606ed7c3f88a6512e2398dd1a51036865ed54ed330797b7f00b6eb642ea2d8f7fd2c7a2752b9a386cd93600420d3e4c78817000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f4e0fae68d640efeb18cf5313e2e8eaf9e12842a2ce406c8f4033e70a32a2c017a567e4af7918ab6b39a0d90f729fe0303725e7bc7282e3ccc1096c303fd98cc8609775d7fd4f42cf3f0fb07f622e0e628ff1654b524fb7ecb1b981e46a86332bb88918841dc7e7c26a7452e34fc04e89c996a3995c113da76c4595ef9427ae021c1a0c6117dbb022908e044238d578f25915df1acf7797870d03025e76e5f2df032340551f431e0fed86e42b0c890d2810d18f3a354fb678dbaf5fd1877b5215240b0227032bbc7d7e80a4807d36567edf3748972c5b5f0aabe404d9c8902db6b02ae84fc8a1bb4a679c5198d4d9957bdaf41aaf79821dfb3ca1a5c882fd1c7a669802013983d1b7fb1358a0121967b15a33d22bddbdf74b5b99476e6d47df8a8babe803181664cbd6e170dd8679c74f2a42c25a1b3232dae860b12c60601105788144920224303e1543a2792c7a57756caa8bc6b4304358b3a8cd78cac1b1cda695c746040317b7ad960d21e3e5090d91800c5f6a5fe023984e261f771c2c421337b4e6ad27031e38933a38447b2c64e20b836904ed2ccb3f34ce139d3adbc720627e2be6bd90392edb1af8b64c54200ad511f0b3130f813c6dacc349761c4f2d7c8e47bd680137cb4867b6cd9f466918f3c549cf88ab84dcb0afbe103ee60a3176dafaa8e55a1685f6ce0361e98de165aa828891d2285bfbb2ae7b2a879b10927a751ba96ff13600c88bf1663f5387256c66456b1dc2411591a93c3eb4cad51d3166df5cce58339172b8cfb13dab832b0633ac5c4ad362a81d69013ef13da18f7188c02a2c395ab0c4eccf31f44f6a67e6443f49da16444411531af0007bde53d05c1ce08f3d69fbf32b140b804184739f366687b795662fe7b69e2913001d59c291eb7635745e84a8582626f4c2231dcac4ffe923527924a34dade3eeecd4e8e5a9000fcd32671a482413e709e177fa351dfcd97d679ec433169180e91d7d00308a4790450316310473e723c7d94ac1848a917eef96a42611fe2fae1947e3b72e0113e2df8cba51777f068266916955286114e8d6258cee02e3530ed42c483964b9681adc8b6fea847fc8c863d22381907f6f69a4fa400016154de7814c234883405ddf59fd1dd2f85b05a6d0d0a7c17adfbe142495f5dbe93c74df25544425cbc42d450c4693f92c7cd6f4075c5a104bb1ee76aa31c1a05d0ab964fb9c07e842b6442146f436bb3b26908fb523a77bb7c835ee857602e9311f64c8c93abe51b3c3ee564d37a1ed25394237b5c6e4c4683d7bc99975b4c85caeeb1e0ad030c693a77c201c0eab28f8a058f25d77ece25a3e2500e12abfc2f4dd6f716a934600a39ce7edd8f3c9c5246ea50d0f5dbe468d672f192f9e1ae6f6d745bdae9278ca701b5cb11e17e08cd0a3f86a4d629d676e9b3aa7554b53e5defdfe24e7377b48ec98cfb02b21cab5b7a99239d0aa1a8da940f0028461848120f4be3a6ec645545efadc20d070958b28cb6dcb95f372f7271307a43d7ae225bb92c6aa21f191d2af69793e95ea7983d91e3943a7f39a4a9d849364bc615dcfccd97a16aba31491bf100afc5a8e6bb0d23cc660779642b0bc5436e8faed5760a070626dca07bc52285c74282b42e9bcd85555841d51edfdad8837112dee7786cd500b9f29181c54f182dafa506654039decddbc580bb3ab68606d555b796fd527fb9dc24098ddbb078d2aa5397cde2bd30292bf6aeef2bf85e583898aef470cb8c6ff93dda90612c534ff00a5c6be26dac0f9c946f868bb5b1781a7f76703efc16696701c94cdf739f9f0412e0a213a63379e4173d576a65f4b7238d152aab692cf9cac53bca89fdc15ea7c8d7975f42332eeec8f1da38ebbce72c188ed6539e030d6770789c14477855a53d4bae27f462c3880e578834a5ae190eda83e715ddab41f66f89b30a29386c8ec68a38b451ba54c6b5274a4a7fee2e41308f981b31751e91f3447a809aa3a361eeb47616355ea1a5b5e1788c734f858de780c0a5353317457af4eb7cd2c97c5d17ba62798ae962a73bd26fa32bd4bc25e01da80f76474bc18526191a9f553d19ef4265e2b0da6454adaa6c860567fc13d38d2793c20eaa2e049a1640bebd032a9afd014331256df92df0f89fa66c9d1f1169ea3f1d2216825b350be942bb7dbe87813c49c05c936bae0963b6d04ada1ce2c66530339b4fd144cba504fedf541a981efa2d6fea2f9a5ec4addd95cb75fee4e9041f30b397f1522d7ac2ff0662cf6cdb63613de32ea08c360b767bfbd5bd97237e11e3c218f050000000000000000000000007c8450513042d0e66ab19b360f9600e59e9c0eaef326c9b53415422849f6a3d6d49f16c2366493067ad7b99ad27df8b24a753b80e5ad3d888f0dbed812cd8c3a6aaba53432851cb7dff36a160b7f917ba1fba781c1fae8ac7747745adcdc26e10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028bd5d18d5f3af2c6a730cae149f0078be8c04d072f58642d2a90491d3cc325a26b55fc950652d21f89081e1cd91604cf28b4fe9ed1caf7a271bc47b082f4e8ea0488cb67343a51059ea06ccdbf09d9b15a8e5cd9a93039fe1627e0ded7fb3ed948f3002a5929d14053ba7c5fcadddd967f1ede3dbb21273f62f18092caf98a4020284b3f4f49b0597495fc8363cc5708de668c22ac20fc30f2c10f0c1503e9bfa0222ee57ee4eb8a623c1a19bc58af5d145ab1c39d57f08efb9244d465eacc8e8920b06d0144d1ed79f836a786e001ff207d5b26bdfda0a4571d6849f7fb9c6324642bf1b1e52c44faa930a28f6d736d21c31b7a37531211dfc3b6915d9c5790236dc0216ff0f86cd4ecabe5c30ca7a6fc1c59e5e69d247ce8d0f10702360b26263bda70317614efecd1c33366a419294f10c6d4fbc38b6686ae65a45c49583a617f60ec1032305251ef7047c0f33fa9496dd5c70afd8e9a9db94cb6a25dfb2af4e67e6bd2f03188625c4a9cdbecbd878f30b1879454e3ad04d5fed850f9505f7326b489571fe031ab9986160b86d4eac7f8deb007ab37fb1f2dd0e2ccf0676f7a8a9ff5061676fcf836dbbe05ca22cc12691d48105f766a0de1dd3d6a1f95e382ee7f76c1163b7c27b5e90b9965f8d47ba80180ac2ae2260e499e8cf4d2083b1e9e8ba4f18f599eb51e6475210d0ce7719ad1a6700a266a4156935fc09caa925118017cfd63ab65e7c2da2a15f25417354ded70072653793a70c0a2e6a7f269b18102b1549b524d1b8f71504ae41c7d90482a92c63289ebeb0463cd9088b15e179b50c5b1cc494081535ffeae302dfc5e4fa69f0afa4e3bbacdab6d791a5838aa70063bebe5d3f9355a801318c4634e15f0a4f4b896a393a941155ac0f0968d8239ce95393f57f7c55f83cbe1050bf2cab9657ef3c49740815a33da35c568117270b198b92929bf8ba53f07cfa5aae50a5b7fb3cc3638c3f9fcbe43fa996ed70bfedd60a1806ff3387da900232e556c74c0f873aeccf3a5c8686fa29d6e96f96247a9333848a8259a00fde293e0f08ec42a393d5041e3d59f72c06e57fc97c8deecf76f749427b5095e84953a6c1138a504716cd6c84ea6b05bed930603ebaec3f6f5cefdd407ac433e52af6317ff13456a924a5b690d87032681bfec060a8c7a3513c3d6c60d15c5a6d69deeee878e7c8abaa34ba9a9d4e52e167004372ad78a28d763b2a0c4147984c22ef818056e0c9a7506511272852cd1d70dcd53b99b44d7c4412884e9a787ad4f55fb78df0d80bebffbf75ca9e3a6d1a365a7cab72979d1651470e95b5b2f64581efe8a1a4df9f324ebc708c00bac68ad7dd014bf2df626aa711332f5ec81efc2cb36ad27c2217e432f78e6f2e559c7e09f724c883d714034c8eb750ca8758efa04dbcf564421a7616f667ab050b0aa20fd222fd53e1aff193791f1db53257a8081fd3b2b82553af367da8b830246341303494a3bd428b9739447b13bde87e19aad1d301e4b835b183c9b220497aea519efac51d3795bae5f1bd1b65761fd485652001e82dff352b8a6daaf30635ce3731515303aade0e9ba709b67f40fedc8f0f5ee7b0c539437e60567b9c4f25614710d1fba4eafb9e05f9812a5f574eb87cccd5f987a6c80e008b64f0308d04af93e78b4d844b0dca5fae6b67b6bb88a155fe411ad7487d0276a7b6adaccc429362fc2f0095770db559699cac8e6829396542d39d464917eb377fd0737fdd187d560092b6ea5d5a9b345718b80976a43268ed649c3635228f0073a0848c36e5c81c161a6f8cc6ccf4b6b3558c29d9b4360e119bea30ddaaeb459cd684576581c5665b991c99cb7fcb52f86b8553c6993dddcc631fa9b41587b7fa3e19b4086bd0847f37cd31abcde222a0a7933578d6655affe28785648c21039aff9bf8b4ca4fdd3ae5930d928856ee99e1a3c0789cbf1fe59aa9001acee5c9f911267f78bbd01c7be2413f934fb8c675612ff22ad01ea9e2020bd7b9efa7d1ee3006f9dde694330373774fe6e1e6f5a1a8f0d5128eed9a25be4e945c75b184dfa7a6fb662543a381f706f630e5d197e32434604f98e8881effdda2c92b523e0cdfe25d5fd0ac29ee596ebaa355ed3b299dc75ba33f3478a465c66784e9656b68690d2a717904c50166c13fce6e815cc8ff5099111ca9a09be81067ecd2b75aa621b693279ab2ea72afbf15e79c309ef08f75039e1319b14696e87cc2c720db3cc29935f0171d30c4fb7afe2d82ce4fb10a682b01a1e7a256a2616225393600755650fcdfec18000000000000000047212b0500000000e0d7d7dc2e1cf3bb350ad0222a510f2ec0f97eddba86088c4bb72fc7dc994fbcdd420479b32f47090fd50b67516c3875bf86dd70b9dcc71ab2f7b0510221eea7e0750a2281d4d0724b72afea7b09e9ee4a0381409ad825a2b0202f887d8bc138000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006ad05a478b69548c750868ae9e798544f75eda15bdde8743532f7a52abe58cde96f799943aaf8f641db103265e5fe160f18f5babd42c885c1f220dcd5d0b13de79ae00c3bfff1088d46bb81052c4e7910c0f593038e0ccc7d5d5d2247c2b8259b109c493122fe2e12d32a9a7cc242f6a5f10d50de932776eae8098a24792294a0308f6ce29adf7b37431bb40afacc37a9e6243668c4f3d694888c2a0aad85b2f92032559cb7985d60b848c36f535fb75a87cfc97b74352c653314823dc6d2c4351240b05c198c1185a20ce106c6c17344b0fecd9fca76ae72b65438b1a5f84d73be1c82b3499302958becbcdd586f8659fc3cb4bd9fe007e0c0f86de5242308408a988030fce58c4b5971c8a8a9131a2daf99d98b94112dec2831b73830c8c282a172ba70202dc778a75097294f274b29472c7f23ad707ee3b710e0e837ac624f57bb32a4802020501986593fd75db62e3fd8fbbf7ea803ee5a6cb8b3dad0e24f45a098d9932032b00b3bf08d08bef8806c6f692c93dbc241f67b2b0553360a65e2371b8b87b25032077cdbd735dea0916c189917f3867b43357906e0e31d284af13f5a8dfee6ea2db87c9575a92b66f6408cf4e0cb272654db2f1aa6b88e610192d24c56ba39c4b2323c28eb28642d07b13214f0936e08160810bb31629e84f34144e731a8f5dd04f69473f2442484387615a2c6e5f69a1659274ce9d2c8afd5be9c7d2391be41595bfe5c56555ba0248b633529c8e10b5218d47503a77d3a24b9ce516a5df3b69ac75c605f977f9360edd7c3c22fb123ecb071957384dcc7d8bb58e7ee8d1f2fd8dfedbccf5780dbaa429bb9ad106df82f2ded0e49ac8741f7c750963898a72eb4dd2d612d24aac3a1826d4145f5b33163f985001832892b58355a5cc95772c4970c4c9d22d8bf0f0536c6863ce14e093db8a769cc4d58cd3f069ab296839f94652444ded5b4adfc9dc0f27289b784a158d13de9d34f0d503599e04971ee7daee0c65f51aa42cb2403b7434bd897c229ca0381d793737ab8cfcd51289af3e84ab7cb1bdb570b49837b9732ffab7c993b366ddb23895fbdd611043fc3035bc704e04cea7ac63fed4aaf06da277642e2a3f4f4e88dd24e9cf64532863dced6560ba4f54d0e531bf1c948961690e2eeb7b79e03f4056b8e5c30b039c511aae9c3f69a4b7f45f009e1c792900ffef0c9d59b13e09f30e7e5dc5f6859f43bb4afea0e42b38dd845ce7764c3ce62dfbae00ca03c9988178d6914884308a1c5b811345202c547e1cae884b1146a86367ca954060793719a226d0ddd7aeb8d31e5daa6e5162150207a9ec7fc6a5062fa4284897971e0f0eee328513f57271aae2c361f9efffb4e68ed043bc7a7b70fa02eb98d5920d55879275fbbb65617c8358b26e2ada5c5cc90433718b7af9168b91fd464dba5667a4f7485b60bba208ccf6f12ff1fcaee53860a574aeebdd5a6d8e3cfe3adf5e15108494626b657ae20dbdff45e0ca407ac8927c2c457efb355e2b7d9b08f04c73190bb927a588769c9403dd984bb9fabe9f03de01f4c6a929795ad6e3cc7155bfe02a73e1fdb9c18d24f05bb164243d0d2734387f7dc6557837f1a866b838d3d1bd0aa2d58dba9dd7b4694d7af177ee3e2249da2371364c69f0d6b4be7ad9177574ea5ea34dfc585cfe6624e9a0b14e7bc2690c48802966897d5ea8ddb2edf814b488ec904843d2f4b80c177db7ace5e4e74ce66d94334729e389763e3d1a69a3192700b7119b89a61d8f47f692b1e9944ca16d7ad1fbf2235ccb187ca53bc595d1c6386857e1c7de6a3c3a46daf1fb106d9453eaa0d8337cf499c3ca7fe34dc91bb2954129471a48da29f8fcf575dc9b693a0af33077ce2b5ad06b4ff6ac6c320d2fa6aa4a4e543c8d67e0e766b4cdf716d324ec0fd9290db4a09f258d6c5429ee4bed59540a335bdd156caf24cf7ac9546c1dbab9fd76cf453afffc3dedc5f87dfa9568e6c4bd8e5d8a64dd9c4b82179c9cb9fbea95c99d2cb75f2eb3365d744e93016a6422df7e268070b0ac4b1280cb8fe453354ca2a217a523315522935123f46d9dbff5f28d535bc2bde672ed7d6da747b7353c00fd2d469a68105cda97853ae47de1a52e768da0d1025d4070a6608d7be7da2537f963fd94d2902a367291a73cfb9426d60dabf26adcf226b7072f4321dc3e8d17b01743b96215778d362f0b37d2478024f3b08992aecd42e0f2e889cd29a24ea570227a48e55ff9b0051b1516077ba9de1f41162c9e6720e0c4a467f1aae39b7a3bd09a475f8eedc1915e8dbf02f72fbbb9d45fffa89e46a0c474bb3b42e2fc8a386c75a4e436fd0abe96079b96d063d75b04944244be19dabec0a838e9abac6102e5419867af450a1da0a8cb885e255a7f8b39f478b924d6465eaf2d52e51e155c304c87b2580e4c07", "52525253", 0, 790908008, "23a59e4969af2d4685b3297bb099b649b121b70cb1b48a85c1f27a5e853239b7"], + ["173ad90a020819bd02ff8d930463c944bc4228272b1ba86335933ac1591ec183d41eb7714f02000000066aac535252003bbe077520231d8e5be3bb0fa7dfddda89342bc1691b378cf7ef995201442e6ac3c783310000000005acac656a52ffffffff024cf3eb040000000003005300b4951b04000000000551635100001afeda0202cb656f0100000000000000000000000061e4509a79c315f488b4a4e9a55c3ae980e9c1c19d742e5fe264e49a59beea9bb2964c847476bc46fc65a825b7b39ca62f006ceab1a2f6eba33cbd931da343d48742020a0eba5da01e59aa0b00c9065044c753ffbeda5d795f9681776bd645b40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082ef840e883b566a2fe2580a136477223ec0ca1c0cbc69a3f4e1cdc8ee85e9e173dc49a2a11992207754d68052f851fc9d46ba23b0fb6019652ee79c9cb4f46830acd0ad929bb7c63f9a512f836007356e6f8242d053a924b92a7994c674156897d35d332077a78588729b478698282083f9d9e0b25932f063cac08e2d7cf53b022c9d47b930ea7c0269e6e820307d026683c615b8ac68b7c2ce96bce7bbec897f03081144a414352d6965ee96c50ab6696fb0cfd610c3e8cccfc3acee841381c1330b01a0af6051f1d165596614ad5d57181365d884cf5eb5ef546a1f03eccf938c0b935e033a23c2951b3424e943ae587ec70c6acae9a0f5833f51922d2aac26b30d0320a54cfa10665b268614c0c205c8edb2fe6d73ef54233c92c5af16886f7ce852021589901b8202d587f2e25e2c3c97e10efe070c063c672e8d5ec7e87304cdd7f50211f8b6381fa2aec43875dcc57676c7ce582ae19677015823ea72276e3ad6009102263e6d8215e46d96034008a0308217a735645164d1650ee4ec4cb1cca45e64af0206e66aa7edfeb63b1bc4406d1ade9e91ce8f330b6d5a44a335aa55c219361e684389fb6a8348d58de1e65859bd7c18f85c4106dceea287678f07ea80c454c321771b6d887f7aa57198b3777ab3ad4fe1c5ad533ee7055fdebe2f476ebca852cf1287659bb7591ff4d05a1f19624e9dcbac1a40a2bcb27b02a8719b146cccfe8c79babae0c91503a22abfe82b29d1d8e625050334690ec7fbdf0d19a7e8da7aa297559d71200679611ebb2fa49e07a316c31f64abc29261981c78cefd348ccccf1fcc2e4409d1f34741f8204911f10bc7c4151efb6c8de639ac6f4b488a3d76160f62e5aed94c7a14f1f9b3567dabacefa3d212aad6ca2a24cc716cdcd3024a3435bf19caf05f1b80c67ce63e5cb6df068ac336f121c44c5d1463cae52619dcd7be68f86fece517c8501de9dd38cbcdbe9b45ab52e51c0cbff8b4ecfb3100af5f6d232dccb48247f9d1df67a073f28b1b1ecb551fac8ede4fc050fcd13f1862b78a19c38d25efef702aa2620adbe350b8247ccc06b292ff3c27aa2a2eba0861b5e52bfd145ca14134bfff7d53eec287d24d9fe16c28f83bd2a58f37dd45c89f8757d5521a822f10ecc2e34a788271f17d547c1f640ee670ba6c798f7561d8fc9c09fb0ecd010aa4ab7f38d6178130306c21b00cb0e205adebbf474c05b53f6bdfa87cd36f15c177cc1874f74c8a1a29620d4857e66577b4c2d173997f744c45b36349fe7b9ddd0aa4115806e4eb6ef615f1aa56f10a9577b8ffff101e8b4153c9200249e9650c35a5b7d38f59c10c23aa46925d3593573a69ef4bc1d893d1d5bdc08ecdd39433244806d5112ce606d8eec6a84bb571a65e872bf4898fc21f6776b1fa7c2f090dcf09c09764983c9f010e3937bf6a25d4a35161d2f8bae0f5b3ce9a49a1e65429761ce42b23d1175ac95cf7e048db685e627d2efa8a8eb174b6d0a87aa7cb39c44da1ebb8b6e71cc042390f755b45350c255cd63bdd206a12f41f3d98bc8d54fe79550413c11293c80b9942bf85eacca9c686346d3d1a054338603a5274dd7f0390e0e3c1b96fa964b637d400f17d4e9887d460354dd017e7892b3568c7f18413c755de66e4e1dce87855a6d972a1740ba7db59613839632e0db2206a8f56fd6fd5e30a34a712928d15c53de7307aecec0e7827b85d62685314c78bbcf53878d8716fd48ce9ef57f9773192ec8398372ca3a55a3bdd1f6bdd5009ec97b38056dd147b41d72292c972325c977f243e8232d90991d6624f5ae9f0bb9e750e52bf33460b54236286761b428d146f48b486261ccc750367661de610e23b62a9c49c95d83cecfdefcaf3aef7ff081bec72466d17205bf54c10086c266afc46868590cb507f39d8f307a7be218cba67e07728f07a1ab19cdcff7d17c5da6b0d47adf2c13d54fb3ddcb1ba254c77cd438453b62968f13d79902d253b639c107b52210bb01ab3408873516d31fc1022bd993e0e43b7a4b1b8735ff6805ededd48758c094cbf877434efbe0a75ec78e091cba261357c62e88e9c535a85f997d90e9ae0f5e92d9cb341e9eb484cefe6c03e6d8e571c161283e463003410847047cb7a87dada5cdcb88522c7066c73f5fff6d2a1e3633d5492da4818093efcd7900b588c0f41f3841935d9dbee984c08e21a1f549707b8de9ab0e1e7519f4c4b1597e6fbadac46d9d1357987ff7058ca9877679ddacad699a1dbb79d74ad623b0be0741a19d2bde6942db52f15426213a1410000000000000000954a310100000000542a6ef742920fa47d0fbcb82e5143879aec5b2f518a2a6a2aa96c660436555db430423691815865a83935c1b93ce9c0b0737570dab826cc3df00708abd82adff7b704afe4257d787373eab227a63205c4c761f4a596b57c3be3a44519df83a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ac14388ddb8858978345267ffd4c2cec7a7de4955a447d4e8101f6cddf03601b044d318515b2df2d4c2598cf125686bf31904385c0f144267dca2624337131f9878ec1d5fd7a66ee56ce860bf7a66f274e1b41c0b06d98e7ca90b9ee125d0bfc93b43e895edfb605bc42ede34db4ef433eed12c3a80538b543c6f0a93057204a022e87628020842e89e3e7fa4aaca5c57d1c6ddab3035de0f065af69f726cddf54021fde42bb24475eb155f39dacd8e047fe7708c7f1b55db3432b7ce0a594ab072f0b06fdc7512f593a639d2db3b8bb164824f681ed3a30cd23bb6b696a091664d6a6f1f5ba09d5e058663d576ada3a7c6294e0a823ac45f55952e04e11dbc431a0010202c9b6d684577a35b537b112a2adcc7bd6f996332cab56283c5c252fa50317cd03102083bd1fcd067738b4f0f02a01c089f89d8af230e8b53d38ea96e1fdeb41b4020ec59f13e5beaa6c8ca56aab6c8cee2c50e0f3cd129a9fa8954260800566ab1b0216a6cc76faa30976149d5e012d4720a79c9748a95c986e3ad426719fb6e8948d020f170482dd738db293db710604e6bb0c838ffb606c525ad78e24df8a4508e3b454833a258f2b0c511a3e0634b66cf9d9e75bbf823b1c826f80ad84a0861afca966522ddbd8b4d12021c8b1c99ceffd85b3737bb557b5d9bde60852f4f25d957cf17c6f291f7b53dd8745ddbb1e5385db529ef3fb11adeb2738392640367f874baa36e9e605bee828b16eea55864892580ad9f4bfb084832487678b03bdf2aca79a185a5d2abbcaeef8df26d765b1aaf66d275d93fff5683f9278d729349dac182d52effd6c546eeb1e7eb8bcb4b20b30120b3706f2a1ff89f49ceddda732b2cc9388bd3c55cdf06b0a23c2c59d9c2d6141fbb78a75be45fe037e8fe69eacac5b193c24083f36d3c0fb9bb063d9b53dbbb532096091664d8b940b69debe5fe14f1f667ec5649faad473d21b136e4377b796c6fb2e0fc39e0078a3b877c3d1a7033cf2fac629e1c0b8b464be791895b86ff6b51a235c1b49cd45764ff1765dd83896749aa42f2ea4dfa02f7cd96c67ab9177eeeedfe362a93bdd79a90879102a245cab57eca30fa74ee259e10cd779c759aa0a3dbfcfbf2867615e5bbcdf6eace33019486b222e72d8f97e53deb87ceff97cabf008027ea935811da66eb2c099d1760bbbf49220aff53beb75cce60c6b8d34120ec35000a37f8b6cc56df689e757326514a0c38d082ec0b0006f150cad2060bde417b3475da66489f00c21f7a34862bb396fcf51d5f22b8219b8882e145e278416d23ca3f9e8a368b718cbe2b38bdc0df2ef1f0120e0e0e3e25ff24d1f4efa762288964c6f4dfb56ab86c1fafd95afa252518951669d2a8f98fd156a396331569a48c1ccd941277590dbee2424ab5d4937caae355d0755c8d0eb84053f203fcc1b3232367864d888c53fe6235f2de21c465ddef32d8bdbac0c8531cf67f88de79ed44c6661cb3b4a4bca65969a00d708365c6189c2b26997bcccd61f6bb4314f7d46ac3e0e8a407d60e3dfd480d0cfc24385ff58717f0b8222626a86aef238f7ff6bfd0a1a5c930afb94783394767762d20b0a03f4f52ccf8af1efadd2f50398f070ec9d522f6c2210b7ab7fd73cd2c023fe437ff749fea1f82a443d752fa339a9be2c68473d273d5c3c505bd36c0dc2428ac74c8d105f499fa03e1caa8e4f49b3c2217c869afad9e39b4cdd88790352612752269f2d7c48133860bd7bd9e5827754d2f746f01c7c33464ee53c76d59db7ccf2326e2f07f266e0f8554a93ceff99b1f23ab66090f4794fd94417d279fff152d377ecb130798a8d52b2c6c89e703a074c0390a32b32703d85cf98c40537bf0d0bc278264d71579f84c9c4d9adf5d0887531cc16da975ece94d2f3c82036ea123029e194185081a4d3df5ca9d05c154949b94b1eb279cef72f30b68ab6427671975a0ac4e4e21f8c4a690f818bc4f51edb21f5c2ff13f7e838dc666c31384a17b107c5442d5ce2acb3a84a46d7090552ab1a17a8ce434344fe7d740bba963d52ba5e784213b76760885db932a796f62175a68a0203a5bae5243c75a579f6c6a9b48805628f5fbe60bf971102b9efbd52c7e462a327b017ed7accc70d5b44fb58c2434ba2a6795f9eb5246b10edb143af0e9a5bbd5c08b0a341436325caeaa84468f13453a0bc9fe668d46266d006083103f76a3bf7cc93702209b41e107a103a725adb3fee48c9a40350fa6301853a1c665114e316881b28734fc9bcc24c347b88c1871eb9db00941bd51856e8ec4b7f5296f867ee4bc6a8453963b8990080ad1f67e7e87425c5e88fbf214c1c7565e711e48c4c7e95a0e87c3a572d54ab007eee7137393fe04073f3e9db8837acfb5c8e7a67ab19a9d768682f9fdb01062854805313339d9b773875aa74711305", "630052536a52", 1, -722499343, "7bfb63b5a195f844863ee699306c87ee5e78d969d7127f5af933a1b7fd2469cb"], + ["030000807082c40301d89345e1bea01418a5ea3c443682babbe9a81f3ab6853ae7a794abf9bc880cf3000000000851536300516a00008e97741d033e86bb0300000000025100d95295020000000003ac5353c15e6d01000000000853635365535253acede8094deee9adde00", "525151636a636a", 0, 1351671606, "f07493ef2463b58d472faf851d77b605a210c0f5d7cb0c97849e3aa9e4cba925"], + ["ee445d0e01cc2d58133fb7b0553858ecb1d037bdfcd9eea3516023f33907b746b331db2dca01000000026a00722df6db03ac03b000000000000263ac63d738030000000002636a8c9c2f020000000001ac0000000002726d2702000000000000000000000000b9f468b3b6c1e4ca64895721290def497ff43b3d02d045414bf1591c4dc701572a4235d220baf025f6fa6e3e55b6001f90bb55ba5bc9b8f2956da0b9d0e7c3be5d1c43b23ef68e0ad72add2fb554b4ca534ba356725eefb7232cbc1f2f519fce000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000276f2580ba93118bc4b0070eb360189a2be3e6ac0d62dd1453bedf6c312685e85cb050d46806a71cc75d3ed75645aa484fb4fe4a68965dbf7dfaa0daaa821c668dd76e05804ac18eb0ee67c2009a778ca671127bbf782fe99fcb9145784ae28cd8a73de3636f711423d031154191d7084d3af1f04a93689b15e9bf6ce385018031333ee9f86852dc8f550b56e94c6288be8ef843365b1433b5d04c64a84d83dfa020fa3a856224b5215ae9d3a6343c9eb0a4f0619bfb670c489898b056edc5ea01b0b0885f1a0843664e995c0b130c1262069afca953c511edac7a62a9567f0b99515b03a2dfc8e9a8443accc88492ea9298f07a78bca6557e302f50c54a21e40b81a032b49412fe5c21758c3cb7dcd70fe6494e8fa32471ed9f0caaddf0bbfc48d50a4031eb237edc9dda1e6971b3b3838c537d5e5b45717a5fb14a883ad66e21e916f91020d3393b999d91b4ccbcd76021d6a50c6f486fb009a648d69e8d1345e6214398303175f188cbeaef2a21f649a2ba365e831c0b9e12796f1771c516e19a6c7072891031d7a9a08f36ba5a844cebd4dc7c77e4b623b2fbb80149bd4ac696818346e2afc580273b27b089f34d203f1a74a1b1d2846751d7bed21bfb4605183474ff008f24bfdc137624e9e24ff47e870c8ddbb91d605a66b07a209bea703e69f2b452dd7aac68af664e3d1e8a3a430ade030d67f251104baa37d2a949bfb5df477dfe26ffe349561767311a8f84c1f5ed90188099309056258be147c8758002a57efb296a6718ea4d332f3d383b1a8ed9a265e34ace5ac6fc11105e10126f6742b4836a35b727208766d76cda16f048e1ad2efdf6545d1406091826ee568fd9af048b58656d9d4731d1fa26c845062c43730a7e281e441cdf03914d1caaa1fd086cebf9477b65a395227ce15043216ae700d8f6339ce6bd51e06b14fa9247062d1b63695d479447c07c81dc47f8254d1e868a08b5b5d590b8ca76a8d0587e93e5c232ea6d28d941c6b420dcc34b096115428d2daf77c843ca809640f71175201ac071a70355ff1143dba5a67794a9cf8f92afe4c27b498e4400cea925ff2b44e33aa8cdba474b46ee93585c9dd8587283fe47deeb0181d815e47ef39af963f7bf608ac4beac6be8e7461b8a85be89cf97300e1b14a1e6c00f1bc9cd0d75364a1d10db795feba848023d622a08f90f5487806385d071aa19a1c0cba409c5d7a3c53f6848f978366b4066a728e494f851ddeb6b3f6c25b0823b671f07bdc03982b2ad26b60f9ee22e987492bb9b336f63ef4b1ff17da78ebe6ee09011614c68fe883f0f260202e9e0119cb4e2253222bf59b07e1772a35e1a385c53e24aa193e6b178a541428b511bf1412f171a3031ff2b45708eb2744101bcea4c01e3d4e5fdb9b591086d08a6515d3e8c25e6ac6609dcd7c8ee09d4fd7682b7fcb5e9db4557809ee08d0bfaf8ceb4a79a40c85facb3e7172e14d1af41d64412259a3e61e7a63615e30fb89dac1f1ac36ee93f1f366f4c9f0e2df7aff0dd5a14aac33f4844ef33ede22759d6595878cae25ca6e75179a1994bb94800957fa6a195f14b426fcbadb15cfe9c4f1ea5fcb6a8f0ab651005e19fb645de6191461722a0d210882588ff7884db999d5bbe0c8c724262592ccbdeb4b3148fd7b550220fd6e7f8f1214afeb3bf594355fc46e7bcdfa2644a2baa7500b59f46f5b892b01824429c3f3b69af8e6e3300e70644ac0c21c9e0c095c0a256fdd5a15dadd69433b4bfb08abd09e7f70bc7f83c5d86d1235b66801aff14d0d465b3898b3b75c778bde2d7f07c7b1ecbd765e5f78abe4b51494b6f6b439835a495de95358383dafea252b198adf65e5131427815167f215a2e9eb4bdb41128db7c8aa5463dff2bb7910a32d27cc1d50ccff49891bc67b86b2a35d2634bd64c32a3556eeeb31c24574eecde1f649872cab55f4decb02380dde4d8aa0b58875cfa64c93feb1e16b8fc62f2f5cb9fefc67afdba9b3b927cbcfd8c680cc82519e26edb1cc7d66d105f13c84ed329ffc14314ca9b6a4561ab732b1f33fa390b5651cfd48fccacbf2020a108685d81c56f6c549d32be6e1c02249a33d13b8a5d1ab73feae86383f20d04248dc8eac9eb110b3e0652577a568230f46843ec1eb9a483fa73a6f8d724cffca608d8579546bfaeaf072d9984f99c53966125d723a37d87e11c42a3b2249f1a93c70d61c48d0d9a45ea81f6e50519709eca90e437b6560588bcbb324bcf33077d6b2a3f2366567663a09c8e81bb74bd0c1109ac0208eb8af20023d90c6d8cdab02000000000000000000000000879043c4ea039a671d4f56683afd070b962520980fab459c9aaad19e76ecaf00bea62c0573f5c6cfcda09948e9e7593dc35c02df41894b3400279a82ba8eed0fef78e70e307253190603ed1537db7d3671cd047f0bc786795bceaaf471673d9300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c8b1f900f9c8858688f986c55a5d01dc396512e9c43b7191f9cbe5e46c381a1aa0950ba12199c68bb92e5154a078e8166c7a5fe84ec689c9669a70c57cec8af36a85807924ade3919d6147385d3ee110fd1d05872404eb5e7f916f5e1e64a3cebbc5f6c4027ff6c843125eb9acbc8dc0664f55e88449eec2a702ed1d8121fa3b022c9385d1e09bde7ce57ec762cbe69d046e3ad52f5c1df3515929a592d6f050e40300a31cd46d07f62db0f0f8636aadd1a4298adf851046539312265e49e7f328fb0a03c9a6b9fd49dad66e0a088345e6d01abd0e460d06683280c77d42b0f1f6612b8c3a9d7d59b4da6f5585394a6b204b93eebf599d530541cdff98b348bba8e6500328ca9f463c7d3c4a32fe763370a471ebd53ebedb16ec9fefdcee87808a8698b103050772747a6231409586c32e802bbcb1710edf4c77c8614f74916514e1bdc05003091d1425bb146067257761f96eb411685bb8e9beee174417405b956e77053c77020a3664a003fa7482616d92096baf4d955b87f8a96200970756882b4549f2a71703289f95a10b1a54274799f5623bfa57e15f812fd063bf0c6979746d415235f33ab439e501de06d30e85eedf8be31cc9c3f41fabb767aeeaa83a9f759fd6e6c445a7f749c014764396d33a0649cdea730415d0d47c6574693f6942b73d90baa05ba21d913275a2877335d97e70e011d1a9045707ce485f3d75dd3aee32a82ebb827a9407b731ae8612a5d1c15c6514e40b90cdcaa8138f30194c2d7949dc6a6d8f2b03acb26b28ac4778f210c94574b6bedd660db60487289ffcb7541020b27016b5ef92faaf8281ec482e34b95a602321b45c9a623a676dd847155427ee798449640ee945b71c5df7667a2f470981544adcdad8d4d6e5713aaaab9ffc59df58798b849ff4def7b1baa7373c40d45c248219a66c094481eb1330de70dbf03f5c6a6ca13a3f00a4d2b01b0f89585352c3e0c69636572fbc30e2ff663de0185444193c933bfc2bf03dea75353168017087478f30e058c147d5a57927db7bad8b652c4811e4f09e30a8612aeb511b7dd25580a652368f9bb7859da992644dde9bc03b11577c2666d3749a252d4fc561f165c032bb43bf5db65562e771c30effc88a5303a33fac985d8f592aee3928f6a7f19f6a1a398389af34b2155d9ff4ef0a49857858e3390a63af9c42932972244d5319ed068ab16beb8766ea040342f5f008f877ab41085f55bc3db6ebba4326cd5de1d7c97831692084fe0b158cbde4553f4444391fd769bcb34d77a5663272f183930ac62e54055ca2b7a319c8ad1c8a53571a056a434df2d08d778e893307dada064dac0aea89a954f4506c08b8a0204f09c3f79caa66460cb2ed7cdec33bb92d8abf0d1c537ea9d774bcd6cf274847dd632dc2a9f19673f098d904bc5a49a46d4b835a7a594645a2066ff54c9e428d8a239dac77c01cf63963cd403105145b32862909983fce7c45d888c3d5dc70beaae68a34cb72c38efcfe1dbcf445620b3f9e9fecb71fa086d9f8b5c3abe069baa78ceeeb1b49f95e436dc41c4173959156bdad3989acc90646a356767eb2cc96e16b2fbef7886fc8bd022233a59375b36c3bc529b87c819eb24e22166687d61f3def957e77bba6083e24c4e0ba5d499fd319753b8d208c29dc56ec13f0578350bf261abfd714bfc16c88389179e407f91ef32bb9e83d62f632b3540c889fe4d73f037cb67881d008b46f29044d7f9bcba0f0e3bc2d628b825d38d1b4628a7b1e776ad8647f72928c211079077d2f40285af0273b3e73c210a8315fe913e3531809042fbd901645946b244a59f61c1dd72eccb101bbeb0ba4ce72f0197e85cb31e3502a6326e866b9eab8491fdb290c2bdc670f549c610d2ccef686c54360b4ad37533d0ef3b661db18bf12f58c216d7b39c5c02a367e348baf90060018c1423bc909e781bd4a5f8b18d734f98483a4d9ed4d91e13387296f5193da5e729d6fd331dd6ae115b01ef3bb046dfa659f4e40e520dc6147dee5516c4fb335dc95fb9608e3b260e95f46f32a5e8266c8cc9c6f96886f2a089d7ebc600ff0b1ba45b82870995fdb8746b5e91feeeec1ade5fc00241e6d51d42499c2b878073b666d27b6408bf641ff580731c7f3a0222eb1e8c5558067541653aa85d4752f1bdd209f33ef468c276398413f81ce7469286c62724b15b5cb236625e4a8f4a4c3bf4cdac476e9f9056accbc1d9385c6eacbd451036c1e818d2521fc5a31a8ac7d8874dd655c4a610ad2594a7d334b2537d46ebcf27779b37ac1bf38fddc0251e475e9f233b77e63a31a6c4b8138cb0a7377e55a6551195ae00f2f0fed7eb2f7cb9548aeb6183488b2a58c66e56dd0703e320047511dfe8904f1dbf848a4470d4c1e384f705ad757328c5e50c438fd849b8a8a91f8f277400e", "", 0, 1951588020, "6738e7a53efcae5567ce70c44f76e6ec259894815ae656e94291c12b227daa6b"], + ["f314591f0347b3e249e48b530a4333957fd1e27ba3c227b7a36aa3306cf2be38f3e9259c09010000000900ac526565ac515200ffffffff4b170635abe7f250e005a73d1db907968b5f5ffdd833515a8452106a9daf13560100000000ffffffffa9a00e1f4bc6473e960c1ebaa700d7db08a7c343101083b635cf9a4f7b1378e8030000000851536563005151ac61a397b604928a580000000000096500005153ac6a635316f0b50500000000090063ac53535151656ac5d2de050000000001523e48a401000000000752535351006a51081784ea00", "", 2, 215765995, "926c023e285d7cb5596d7c5fef1d96359b84bb9788fa0e5a37773f73e7aa673c"], + ["f673a66f01f2f8e6bb70e18c465c1bd69a0e503bf900e5d36f9a06c7abdb6b5ea5c488ba18030000000165ffffffff036de9a5040000000005005151006abf7a78020000000003006aac8aceb60100000000030051520000000000", "6565acac63ac", 0, -616043844, "f12756faa9ffa36bff0c1e57d8442f1bb47b3f0baf564341dcea5e76447d4c0d"], + ["d3a85d0b03d059da2d4d76f5dacb1fb899e64812b51d5251f3f829ea000c4442aad8b527dd01000000095100ac006a6a526565ffffffff89848eb9b84d226d7daaa1177967835066c201a33c66d781cb2d64a5dbdb04ad0000000000fffffffffa42ccb5e72d5859faf870dbca61e6b17f8f5acf82f2ce3fbede7f9ea2c302390100000005526a636a51c4dca19d0269948b0200000000076a53006a6a6a63278c18050000000008ac51ac63ac005300ca864d6500", "52635152", 0, -1308867735, "a0759ef84d7d84a2fb762a800cf0fe754c343107e97a9e180d33d913bcfd19d3"], + ["6708991102817c34b863188312fc8ddb0e5dece103c75d6707564ea2046066501e472a12be01000000066aac6363006598947ea421233e9cc94f50d029b2befc01040fb6dd58153087c96e1f1ed9fd55817a04830200000008635265655252ac52ffffffff02b95d6c0000000000020065beed6003000000000763ac6a6a65ac6500000000020000000000000000a3858c040000000005352f6b61689d88ba9ba15d8fec546c7c90e3058641e8a83c305b712af9f923c2e22894d6ba1a160b7fb1c834f7fa9d1f50b02cf1892b6be21e4d83ff76d56ea52da3dce22f9f3d0196c5c8d6e7fcfe9f1a7acb019adc08bdf66e99595cb79300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c4c0999f88540a47237beaced4cfe2a716962cd0d47ff76c712196b47c60869dcf50749f4dfad6d3966c522b4ffbcdb2a0782025cd294e226efcb9caafe320f78d13a3b6ae209223d119e5cb54781eee3d2cfafeeec16869fed8664864e160c262c24daa53fe2499f182b3bfb76e0b9a989ea6bf4b7ab822b182f2d8dc259a6b02120ab9d7e767930296d6f00790d1f9dc63857afd30d50e04821c0ea2ea0a72b5030881e57bfb44995bdbdc444ba0034fce77189a46eb8d7831a18912c9c7e4d1470a086ea46e0d23f7f818fedcdf7bdfccbb5201fbfd616515b229053d3374864f01110f159b07593f71efeee427fcec6ced40b5a8e9408d4d60edd050d9c5c0b96d0216aacec2036106f1f45786e9471d0d9a7d0a04e6f59c97629eccaac3f22a096902139986d6b5e9ba24be47504c41ae975f38a2217faa343569cf4f039533a2c2cf0325c495d7b941c6e91debdeb9fc607620d5c536555288363284a46a10a5c3eb100325f8e47fade8620564bf70c6df950354d3a70eff9757332ce20ea4998c8aaa8d0213f74fa958c94a5e11b32787ca12c65c377b90d657f3966dfb63764eeae6509d2d511aa3869afa193d36d774acaf2993421877fda1e5595ea95c0d622c131070245a7f1a5f70a60dcbc892c8ba4e7a83fc415377ad052fdaa8364390c78fd0261244e8540fbec5402e60380e85058521952199422410f4dc6e370dedfbacdd904f16e099620fe511fd98e4ce1aedf93fa1dcd365320d8d2a72685290be0b336023fd165ace30f86a694704bd86bf25d91fbba068b7bd9fb1121ad349bdfe3f2f6ed250a3b710c843f29e8985cd796ef0fdcb91b1a0a05af74f7dbb5164715c9ab45bc871f1b333b45767f1d20c30fef7a9db68c19aea39d74b90a6dabb0197bf4c8678013e5fd803314e433ea9c3cbd0b2ad049d14b866d7ab9c8673cc17306e41fa222760ee4f14521e1984ef86363b9a5a7cfb7b03ee94113fbf49b2704fafb7898592860293d0832697048ea6c46ca36cecb2e24fe8914ed7ad2d82bbb577290cd06cce00af982c79a3b5d4b7a8d60448c34431b1a82778b86c80169d0c12e86e5e7395ba2204ca90199f856c41aa765bf32a96ca2fc558cb533db25408c3ed6d3ba9a2b0aad65699b0ca20df126325c73be301c381147c459b7fc7e54a91d634538aeabee80ed7800364b24fe1589349e4c8333c82ab796a185532183886352cd950943ced4b67998390e5f2397b8b10463d38f0cb8aaa9b73b515cbb9f7acf1d952c4a8ebc07cadb554af8c0fcb627de76dc8815177f278dafa202ad678189b10d98528a2849b5d821cc2ce221c8303a65266330a8b089f743b5000c3e2e3d047a90257fdd2e836031c106bbcd3225368ed609d9c598005d03519f27761394f357bd74c365e537c59d592daf1371fdc84f0973ae5ac9a74abc5ee7c4367b6c191fc555159cf40986576e77d9b292b9f3c30d0ea2bf3724b5bdee38f4c08f72d2cf45407e229322a3b242bd18b1c40b5b3d5e9a0680cb3f39700edb63bb97cb8bc6e3ecdcad583ec05bd63e13f503a2cfc1ca863d9f25621d1d03f44abbd4cc7b4bb3cf4fae2ebb1da2f34d6bc74a8f12ad121fca7f1294190930e12a9341d4be80ac6f3b2d20688f8cd1c1f8c580704e6cde6076961df2b1aaf0dbdd2a1a7b4cced3c5b592fdab2d48332642647e73aefe884fd36af047bdcfe00f783c0b577465ea18f10d853fe40cbff570a3a837f27be6b9e2283978c76117e26f4907dae9e9671e51f86933d78b0a96be5f31970c230bca858288e708bd66f2c4bfd153096ced09e6fb680fa4b5b543ee8d93e08315d277ba8527719e4ee230aca66081fe48432c5996eb8a313b871310e0ff2a796eefa7ae067dc0e652106c78a8bdf838ec71adf63967ff4865f6b9473c9cbcbe2e32ce4f7e5aee827c45d0f59640f8bdfb151f693d88699cddd7493eec79ea45765b17cc70ad9758421efcb2ed407a10ff13e1e7888ff000ba71e9952c9c1a5d0c311ca51eb8289179234c8aefa8c6d311ebc33c03d6ab9b510591e6e25bd2dc56e148d1cfa6ebcb6459da38436ac7cc79f7196678659f7df53391d03962a94aa044d8463b6be221cc373d78d60229681958df343424bf31314bf6b456016d0a556569d9d676cf95751145cca3d1ecd36938d17b7b13f2b16062a48060c1cdc80db96f1f5603544014ff70612bc2eb7492d406b1d18b9066e9762838345d595166aa5704d1fee10d75c2e763c757113d37167804673aaa12b2491f788a4b9920000000000000000a5cfd600000000004a5edf806f2811db56a213a33f0c2f2d313bb5672384347d685c0e9343ce8390e6928c7dfb80f9c298be604e7dbb550b6f84e4f00d5f4f8a38918ed057e465644d60c935f185ba7c1cbcaa3d9c85754d95e1752751728a61a7e675acbf7ffa9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e75aea73ee1e4a9ebbeb2d99d86b1fcdb09d5d63739996c41f9c2956aa31303316e528cd2cf07368122d43f939eda623f70baff1214da48253236595caa597b609fc9534c17026b895c029d2cc8065bf4a86d2b66a52fa9e98bf4f29eeead866f4d208a3e63b4890ceb6cd05d787e3f9dc21c55ea07e76fb83c29c0a5b4f9bdd022813e3a41e59b60c935f49868a1f61eef8182456223a018d775f8b34be88ff120310152021bff48f1891d8387b8c2e75d6a0e910d9ec513e264a34dde8e7ee075b0b03aca1840e232605f4529295ec440298a1f0373be3b592145ee1ed86edb00d47db98339a6b2f29e0348fdca67bd7a5a9a6ac52bc245b1a25affbfe01bb1739e90221ef442d3ce45cb16d004e8ba1f84d167275c58f75e150298ce64f1378b8fc610312e6d45dbb7f036928b526fc5f3d2dde40fd249fdf082b31b2b845a787fd02670226888136a6d08906ae7261f0b444fc63be22203da2413fcc1415316fcd1ffd4d02133327a0ee564dc93b62def0ade887bfc0df021763fdc1bcade4b52216e4aa2c02220dfedb5ada99458d9d48c6750eae4ce4e45f768fed500dbec93335d08cdd8f446ac03e2eb6ec0d5b60435f9a30e1ac1fd8510f8a2b583ed7db08cb0e145ef6ed5356a5e40623e1637132551799f33d876e2012a1f985f4cfaa90528ca7e82f5b7c7b8e362e69e72de4db25446a91b8963476c33d72b984bbacc6e02edcf879c197494047784b1a9a53b28472dd9898bbb8fc3011dea9b6932c01e32a9a1c3cb91e3f62d9d8dbd5baef139515647366c892feb13dbc6044130dfaad5429003fff89dee7ffcfa646be192ebf2299b0430fd691f27ea2a7cfce4d240dd6c2588ef775c82091e17869db73598c388ca907bbc5d92be90fbbc813f1b6bd77edb44b378e89f3c885fdc4ec1905fe1eab2ed94ba846ff9ae05113bb3b0e448930c3c122baf558c5069cd96e68afac6ef75d4eb3aa0834886dedbe34b743a979af618e7facd698e96e3a5e6facc307c521408a55385df82470b14d7dfbe1c4ba9ade7df2a706e87767708963bd8117d577928bf53e365a68a1e93173fb4512a3090c0872a23d7e8c4d129c33b9e8ac39302d5851b8492138e192d0e526442a15f6ddecbb6c88726f99cd9b3f8c9381ba7332d76d99159fc479641d3c0192a22a026b46807f726a872f9d7049598aeea87266b82429330a8f32ede832bbfa9760fef4dbb1d6240771e2696b1e507bf5fcab4d7d61ca43d7c1913fdc68e68dd931e41ea2541161634f94885252bfa7c7388ea35b6901f257821a6ee51e8f3c6c56a3a35a0dde82363fee1f895906e7d0b7d05ebfaf0162b714e809acb0c984f2ccd4ea5728e359ba90b159771ba4e46cae581ae92c1fe775440e55692d130982671a9de7b81a8d4ee9d46c6631920f7b50395c3a0876ac845cedfff6b119903a6aaed53ced3d36efbe4ecbe5086ddd35a2d453f8c51445f7c49df1b1a8676f7cec4e231fc0207a36ee6525f4c526a9b2ee70023f47deab85973e9bda5fdf7901d08326e5bba1af5720df27ff841e3b62dc2d4f539be722798698b5fac5f34499b6d75fc6a90001222521a2cc0e4254c5ae02117051c413b7cc875890265238503352c3de10df0b888af5d4f358c277b438c8a12ffad855b358b944ca8bd5475b4184a5f23db4afa3deaf1dd41fd278925c441e23ab8c2a6318605f791c75463c89a82045bf6cc43f7a07bf19763602eaf6283a17649ce808c1bd989f859bbfd360ec515677fe1f11e451ae47864949093a2db26afbe5cbae4da1cc6779df315db1d79607bf61dd72baf56013f7bde2d52a46a22f99c30ab1b228ffd3969f861d32d0e32dc09c4ac2847fe61b803d6e1c72317823c7dd9038f2c9abe6ecb285b638216a4d03abffe9f0b013e61771ba64ef1c4f3cbe0cc9358e073f8a04a63f2fcd0c61c8800beb3bf7a8f20c0ac138123033b5b465f5574bbf7e8f8e9c7d3c6e11273528f4b91133904ae0bab1c622746f7999c2b3510942ceea467d43ebc7901b10bf71b6736a433ac8a212c9ebe9aa179ebdd95d5dd500c4933a9c3406375b4ec8da521704a6145bbe0c31e34aead5b7ee2310e9323c21a1526f5933534db19c695a0bdd50b3ac47337596da1b96ddf92d6c81993b543af9f892d01d1eaa3f5c4a524bf10fb161a968d4636c1167874ccde02bfb17ab9da989e787f608b83a7b4660f025efd298b0db3a6ecf8f004dbf4d24c01872bab467d6da091193a1530f5e2449d468cb7269d5a81a1e19eb9dfb4db83cc475fca49569676b76a91064ada9e89624ced7ef9a91265edbb9556ec49d0ca01177685e509ed86a2421fc1204114604d20f29534c2d7c2ea059419c19814631da2d63362feea3c97f2e64c3a137c3c7feceba3d773ab587defe90bbf44649227a0b", "52ac5200636a", 1, 2015348980, "493653fabe6216df7895b3a77e0ee524ded7d14424e4cdbad70e00bddd5ce398"], + ["a5d934180221188505e245adb7f139eabc9d4f47800f6adc4c5850ebead1e4be2e50e67eae02000000085100516a006363539ecda3ab31bba875d6b7b9f06ac9df9d994a0660ecdc54dd8bc12e015b3bd0d87e9d8523020000000353ac65ffffffff03aff1b40500000000055252535351099d23040000000005ac6351536a41b4ad0400000000086a516a6352acac5100000000030000000000000000d44cb00300000000d84f21627d0e51c43a374dacad7020aef215ffee02cb4c4c84b3d21758f1f67d57c875e144bb1faa4e033851272f7a89ee41ef343f94b90673ca98e27bd9a7a2daa702364f5b23a5bfdc4631fa3a6634e08469346ad13c20570ac47dfa3127cc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f6755d8ef38b7bb2215cde7d2cfacca6e524406928bb84b3090f361f426212619d23208760ae3eb8e124db4d5d7e5a4673cd53531226ddfceba5ef087561e5f55a9ac5c2de12ab68f7ba5d3d4732df4011002a3087e37916ecb90d09422517f18978f7f848d9870c1748e1fa607667f3ac5f80916b6e3748cbfb9047a4643877031507ebfa798c6c06ce75eb8ca65b7e21d5096a9467419da72f941145f5feb5940222ceb6be118e60b15875d0bc2cb081878944e5a6312cba8ce94b217e73900b6d0a07cfcc0f418fcf8fa4c6379e0544ca29ee7191295d704406fac365614d88a94b788fadc9ba7018e8aab745d06f293d4b261fded59a660b184f71d979ff9c57fd030f4ded16cb2e43046d12d40e25d86b39c0aecee3fba4cf8bbbae12766619b44a030e0ee45b73e0bcb1bd246d5b4bec242f0f7c5abf89c19474eb3cf8919bc8501a020857756c7eeb10cbc7f46adecd7c76077c156eedf129513ab8fdda2dd7cfc400020d60fd49af9056815a2a782c836de880c7687e991ef94a2c01af4fe81502dba30328ad748bb4be102b816a481320a79e8c5592666031b144d65c545bb85da8d8b8ec1a8b248efc3edbf78f65c4d79a77975789e0793788a99a1aa27cdce01d146db40c6ca17e9dd9e1b5091089144579a68268e937ec7222b52fd3b02f2e20981351b8f0a3731ed2ee708249af5d067fa48b754f1c2cbeaa2bfa26bea9372cc7c4cdceaf09a22cff1d636aa011d3ed470fcd415090d0bde042d96ee0be6f38d4181d521524b92cf5bd5d6431eb90e04045ea79ef704e0f39eb0c152c703046b8d57d500099c29d0196a528d8641610a17c1ea10abb93ed3a24419afe3cf70aae584bb0aa41b183e86388298a7c1d47ec4621509f43d980f8104e334f967f686690e963064177fd2291aac4f5ff3ff048255c3d386ff5bd793a19bfcba892603d1ce5a1f20f466f621a3756839f204b6184434374ed81976f482c7ded51c53d7a6073c4deeef8e1ee5863d1f06e8f50866724ce9ed24281d44cde2fd45595fc77176ec829250b2b5befc85af7877be385853427da641f661dc0ba345300511c94c9606d5b49eec1345965314b0d8c83fa272d2bb14c851920df3c096c799517147bd70878679e73c33e3021851483cde10d242932fd249f36ec2ca3b4e70733ac2cbcb00410f2490d27fe7ec50abf54ac3ee7fa1c57d95cfb8f839473d2d3012652db76471aa748319e9184b5ed9f7a7a1bb628178860e86f0ac60a55de9ae06660136ffb08f9ab2ba3f238ff9d5e5abade015cddcb508a6ab7fd8206f6075fa388cc057a009c60b8de3dbf2b6348542b9e2ca43878af2d835ddf6a36bc796164936cbb7b3d6cf582efb9b8934aedde6d4ccaf23dba69dfb8fab2a21e998f9c908c140ba9bbec4bee82ed791832c081b031699e23f2e0d6ae2252232eca4736833ff846529bac614e99a837659acfb71d518196d5d661da63c55ded927b8bab971616cda2d1f6f4be602fc0c624b1fada332abb9bf60517efa5ef9356f6c445fdbb213f3ad987d13bb035926301331eb38c576767ec52c0abd43b4ae2909cdaec28f69345f89463115f31c93720a6883fd6020d059ed2c2809683bcdc40984bc4f10f99492a9e3f67debce3a79a0ce87870a43df8adb7fb5e051c622e1b3ba55e4a7865cc9e1049881a585ce34ec440a218fe64131ca19b3b177d9ccad0db98445505879fa88cb5b0e0d443ae34603c2079c35c7179957bc103658863a5c2ef815160b8f1f09a122e8c748c50d00712176f4e01c629f3b64b0153fc2ac6804abb0db5c0ec2e430db3afb93b9357d84c39bf3266d7e2ae9cde2d217b8b430b34831839780cdeefdd9cbc9adfc9a2baa3ceb9c7c92d791e0854282b1653c93d5bb763650100d3accb7b1cd88827ff8c0e6b69d531f663706581f0b581837dd42a883b4983d2105906f0710e5b187bf586c86e4b0c190dde68b5965aec1bc283c5ac4380a704b0a0572e161eda66ff002a8f6c3514adf57797c17cf799fe3d307d36571637474c7e3aeed0e4d0def9737a52d6c118e6af10f2c11b793095375963b5d89cd018b508cd287e71bc7c825686a8e4aa06f021c6f906bec41f8af84d7d7000ddd4c46a7bd239ca94731cf21319da2234ae428c424483b6cfcb135e79a10aceab1b9f75f0553dc32287f3306fa9c4de620a2da51d5bfd5b2d0852dc78cbddfd1bb01e57441bbe6055b6bf9f1abe70fd90d1138ff9444add8ed78fed91da05a70f2949541cf1c1d4e4069a519ce907727fad0000000000000000cc9a5b0000000000e010ec99d8bdc7c9b0f80f3a26e764a720b1a6aeed211328cacdf4b7cb87f479e87778390eea69fa1dac9634c024874a2401b6f01e9c06c9e2449e9b640fae0daba18b4f86abc04bb969f1975d7fa4d09cdcbb46833e36f103d6a6d051f447d1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000506ed7647f2502be7dfcffd52e2fa08e4889b43492a1a8de1824c4d7e0e2173f8a2860ef7525c6af0bf8e9917bc3da1155c10972555210240a8012d1909f396f95c2503df8fa18c09b8cdcbd86463660d793840cb830f8460ccfb08919b5e789fb23694f65d607515bb4bd3adff3329883f280330b5f3932a27400ca69b31b702145ec08f130d4f65a67ac9480f206e0017b76b6ac6703d18b2205cbe5e5238de0310c312f6aec3d41fe79cf9b48312faa7c167559e122609f66807a2200b9744cf0a08f1c07edadedf415d2b0043b3d1521dd9ea42a95f869944d1c58a6254d51579350361d63dc06fb58c88dbb4a6f46d491e9ed8304f9b64f6a602b72f9eaf3fe10303180126e831e939aecdfbf7c7f1514877f6406ab67a9b5def9d5291715ac00c022744c542e0d69e49f69ba6ea0da88863b9ab59508550f4f89b7b390a7d12dbe8031cd8fb0e84de797e442ec21881d341b19b233306f5e8695e7c3b1e92d05258db022c7724acf879b89c790f8da191f9fee90b5b1751b64d4747b683e8baecceb5c802172cf9f561028383d5376a77309694add154613727f9efedebf9d4ba46247d9e5756cafc9ddd1a3f3e2cc68f5611e311ba67189ebf2d467cf1ff6ef94cd10fffb104e90e963a4d501094451832dcc3795ca8844aac48b1629ed031d51fb49a377691354c0a1cbe7a45867c746ae636cedaaf0d7224c89d654d759896ad314be9fb8c9fb4f393ebea89ee818dc00cc7c9eaf4fbc3c1038c1160647799e5510d74a51988ada1f7290a144b573b587e6d65ea56ea1e081f7fe53f62ff5bbe3dd533b14dc514f6f4f9c7736aa02f7f34fed3807bf55da1b67b63b5fc8b91e0b6083ca6283e495e61949bb877fd6cb140a3b546d78cef07c88f40f0b0cb8340bf0ee239bc9a836a6eb31630e4f9e6b6bcd8db564af64a941b36cced28cf21eefd287edb4adcb6cdcf2c3d47e6837ede4ec2399f3953980d507dd2e51e7e028b5c5330ec68b3e6cc124c91d77c9c64d5ab86dac2518773e4227377c90db85c2e9a9f98a94cf7f84f66efbc750a491f4efb935503ec056f0186512f624e4df236fcfd2fbf4f6f5b593d4cb4828fae66eb690e09b9bb396284acc15283187faedf0c6168fd0ee5044944425b7e77aa95658567e0ca971ec6f19e6035e6ce92147680b735de603409d6f5656a5b799ec8de259419ed3791dc3078a858b20c55b2ec526de58b777df9af190dbe0fcfd826df6f4ae89f893cd456282fca6bbe5e0f1347af940de22748bf5d566309d3bf48814b5ae8d1086ef0d434a8cf3ba008b686ff1ad16bbc7e8a2d6cc6079a20c41417b74595f07c58c0877f00d194c4fc303e58aa1db58d7ad0385b4163fc68e7773f444805cd49e84c03773b0d6c1f101f65620dd82bd80f890a07344d5551dfd41eaa5a2718c4a4d5721772dc943baf884cc02e264cfa44907ad71a8c3ceb5d8371089d47593acf40267626f2ffa2b90d630fb477b875184d99ac4d06bdee1a922386c6b8531ac0316b293882af7edebad731f0f9b4ea97abd63ffbf484deff35d269ddd8ee44a33fb5883dac4f979ba65d179daef42acb71a77aadc3e1761d7b482e221d1fb79a692dbc420707a82345a707e059bf8e0a1b420bc68627ea6a29dc1553bf859e8b8f8322078ce3e27cb18b6d0bd2cbdc83440075c40d8742ee24de1fc83ffabdd850dfbb6322d711e46cc176cf850758cb6a7909d6f6e47e054ea20dc7ec83b283c6c4eefcfe35467962781005a636dc0763a7ac64980df7c54838eae96c7dfd4cde26556b87fdff94a26015bad30c2af47d563a3c125125c381ca63b33da5b3d42df4e72d65f5c25ff9011be89f0f9cbb98a08ea35363feb3fc9faeb5470ff596c21a18bbab594f00bb2075ff3f0057ebdbe391ded24d5c7241a1085f27dd4e9767bac331e235e2a23fe0faf79f606c418c5d96aa7da975589e1b6993e14a1aa0923879ab03298047cf4e494008597df5faaeded2a13d4b26df55c1d0e1376e5c97aa05e794b0864644f2da572cfea52fa87a383cff9925993254ed4b3201d6cda9c8ae38011909b3a8f2bbb6ef0455790fd690fe8072b729deb85daec75b52cd2f7a9324d1b28b164edf0f75bba1ea7693ec7402a8b0c81f087026b9625ef64948397c47fe7bcffbf19b723dd73d893152edce8c519b6124e0966b681bd615f59717f0463a85f265ffb59994641927d89b9982764aba0e3e9c892a115a98c12ddfd1594714fc76f58e4f7bd65afc97584b311025863a0792cc1d512233dfc600000000000000008467d8010000000000f50537eede3de389fcae15b8726c93723704a783e211cccc52f403d274cf097b59ae07db58efeca110ad8aeb41f845f6f5a5f2eabfe0fd9f5e65590bef3ca9226250fc6c364fccf9f1c709cf4b9f08825d69a2207661807b4776c6d8b19f1c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c7df3ffa2f8b5e35b66e038356906a5c93f5a5507f2fd8773ee588083907dad78348e300fb3f4af3dd2241688165e2d32a8b89c28294ff7887e654741297df8025228ba7f629e7be620e07db29d6af4de2cd75a3ed685ec08cb9beed2891fafcb7f2a67354b02fe03e8d7ce6c13828dfac1e7a5f44fd8858df9a7eb31bef5d200315da6d09029a709319a2439c47f3c000246312286b62b73898da5c882bb31b36030f13c516119733a50d8ff430897afea263125c8c823af43da64b12cdd3d274590b013bd98e40ebebd86ee4f71b5aa3b9529b0ca6f1e7c566316864e27da2947037fcd88df255cab61be03940eeaec8116d0f29940dfbbb9c9177f3a3fe9354060602266543b7a4fc7428f4f2edf0214cd73d4ad73a95b4168d980544db3557ab6ae9021d4fed651031bc782c39d50b3be0eb42bb37b855843b9e3c35afb86c718887d4031018318ef01efc743223d00b25d583a3417f96890e45c7520d1620153a53b0c1031dbda853dd70d3af6ab8845fe3b7ed49128d32add89f6b140741c6ea91540c550219b63f87a54c48a85596dca08db03f8eb48d48305c4c8130d39eb6265502b0789314812850f5ed40b8bab870c627d7681c3026a37f67890b58f601497c3b2fc87980a451d40edcf9bde5809c71980d5c13f42facf3247b528fcd8f53d0c5bf283877747f2dee20c9bc3fa173310f0f7562a27b4a42754312cf2c84a7a82c719ad8b68306ff454733a5e7efb7dc131ea8d66c1e63c3bd0f0f5ec38d96f861e01779cd835c73a7f93d942eeaaa08d7693acea766d20de343db9282d9655ad8113a7dc093745a59212ed45a91c30c39009f72299f6fed8241ef4fc90b732bced26a7247b9165c90c9920edf04e97e7e07b81fa0b30e66d11db3966da0f55ee23b31442585710a884850dfbd0ce363a49fb0cd65ddae84237b6f912fa5dc87398fd20cc781b441a5cefa6153098d1fec6d0a03bd448a8a936f76b53786bbac4541f68bd81661f72652a730e5559325ac394c2058a19a9f97a9fcd73537d2681b6b4a1b442d41ebb023b388f026760b7c277ec0a44a35bf4f8a065aa373d97873138ed99695a588042602836952daa8b9469d964f213172757e90b3e9cf307c9c0426bde5c649a5cd07d714a25942bdca1f152a1263176e2e93c70e61ba41659a034b8a4142d8fdfeb32ce2701a37c773fab1ed66b7cda7dc7940ef5d681b2bbe48136841104ac349bed7913b6a2896ffc13945968bc605fe08af99e06d5bc50b1af768e969aed3f5a6cf99fb620abfe18d19ace1e341d9ea5ac44aeb32cb358b60eb18db9b081ef8008fa5d21189168ea86323af74eee60a3327a9dc1bb1910e44c7639edf2ad756fbba6a0728576a9377a0b83bd69b1bd71b1818de3960f0406a106ff67464601656cc3c367c12501ec33a84cd2eaab682884f1ce852c8feb8c2068719fceaa6d7db6736196dadc5bb315ef72ebfc7f1d8d84d8ec169d1eead89b869f07ad2272efeccacf5eccd32ab7a0e06aac848db3bd12419e1a21fba13d4b9a80e6516afd18b33fc57d78e9fe59796702bdae14b10dd844480f632cc8d1a26415a93c499fb683883f00800e4a49b35695b419fcd36e88be0b897918bfff973f02583c4fe7b29b353d1addd87e076fa50c41a83687decf76737e5b0d4a67f67d9166dfa1e912ca54657ff634de5e00f54bea8a65d2a6a6d7fbd14555fb2e860e95753ec32b3c66a2c8954ffd63be302188bd464c589dddc479c1ec49c7ef08b2b9ee1bb7b357857c481e7648565e94d805a91f857afcd0f70f017b4a0802fa8da44c061846f1a2d1320f30893828f4bdb1ff1157437f7c0aada8cba138d74057b0e18a35a19c67108af6f0908ed8a4732cacba06bc495284efbd64b6ebcf325b94f78ed7ab8b90e86915dadbdf62dbb2d2140f164adc6249b8001a86a7e152f6ddfb2b879a37739b2d53e68b92439b411df9579dfbd3dd90de7e1d6b29505be578d3476b073835a858eba37409a3a5e7fad6272e05b059a64732f3076bde37ce511e70e26e252450afdb640339c2ce58a1475d0cfac88203b0938079b4031de83f773b2b885a8647f9852119a01579443c03110a95c6a80e3b6f74b5cb84294b5a5caaf6a9340e63fc20f860f7f89a46005d12ab81600ffec15fa023ff25df569986c35dc53540261e922ae9d40f8cc063f34abc3042801c9798e7a837fab0b018ec19fde5a2f7bd9fb3f8d0ca374101adc386bd07309a743801cc2a0287318a42e67151e30753998f3706fd80a2f6bc16832106ac8bab6d8bd1c4d265dfea007c267bba4e72e568b7f04ece01461a9d58a0f5a2c07764f8a339708d6b170c41fabd3a8b62b1290553220a4a4669f2e2d4903ce95a4ee65dc370e623346c1a3ee4125d7c7f70841d1e1070601d542ac6104", "525365ac6a6a6353", 0, 1820897368, "46c63e6b9f6bce1592b71a0cbcd95cd5f69a96cde01445d3096acc613db50580"], + ["030000807082c40301700c9aaf602605a10ab2c710ae502aacf603d79e60921b4b108b8c9060882fd800000000056a6a536553ffffffff02d6a9c50400000000095251ac53ac53525353b750a102000000000551516a63006a8a8c8f1d9d94bd01f4e0e005000000000000000000000000d10fa1d6cd91b8a33ab63a5bf1ec72d54884997094bff530ea1c7898585de9a1d6ec55931a5fbf72f65c5c281e51e37d4b06e1ed75e56371cfcd92ebe0175099d719d07a64cfe5d941ca4defc27af585b70bd8ecc9f486a7ab9b745781daffdb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000872a9edaa513e67e97b095ab9f6f2d81daaa125772b4c032cc61a9f22b385cc9d1ffb2fdbc407755e5b91c15022f98b59ff46868bd1fd817d468b6a6cdf5e5a421521f8aea1ccd93a6f22c9a36db8bbec3e9342f92bd0cce46c4748de94ffec3e25f22ecf69e5437c12c3051251653607bfb41094d96030a7104c46aa755c43b030db512597a6da31a56efe2b2c619d3c2f107d189d4ec4e8ff800dc1f3948743902023e2279cd957a7a45afa2db0daa2eae0803304288cc454bd3f5da49a4900d860a06ab858bf64b0e902416d218a8f68eb30c46540aed913e782214f268fcd231088b8529dd1b022fa35e783aab8e5ef369158e970bfb80061eb3e1dd8f6516aae00219039c61d30f7c0e9b6476963203a10effb8d5603c2f5b5bf022601661970d12031e68c24021725fef095f54a0883b799da96388afa2aec56e57784164953c2a7d0208a5df0428a68cac3d96463a280f3f137f2305bcbe9102479dd8fd0f2e70dbd8030065ec1d1231c5f8895de9c2204674819cf3609759b19f0e584fcf52a5f491d50322104259629d734778b99114bb9297ed61cbf983261d1cc5fb0f416cf23e952da9ac3808e35cfe704f18b7b9afef3f7595cf332acb3b2ab8a0a7a179853d53557187dc9040988a80b68fabdbfd7a9e2eaf346dc6d5ca8f511ab68ebc8c2dd9281ed443c274f4b3c2354d017130fc2242ef5a0af399418fe0c3841357a430d405d7a8aa9fd3eb7cfdc0a06d04076c069f5982e246d76296342fd0f0e7628133c9bb29724bf0e40208b5824d8a4a5a5dd83b88eca985763f0d01837d374ca8f605a7d23302401a5c9b40fd44843ac9f997c4247f26d19764ac7f4c57c6783c763d9ff92eb00bd6abba89759161f06030a1f72d3eefd5ece3d35db282a87fe8f6c5edd3b743a6911ef0eba1f1c52bc3dff7a1067d38f3ac048804908111c54f63df293b4bb96b018073d20f9a8ffe37cc6db2b8712a32e6a0595cb344b664e46e7e72e451ddd51f03105a4f967bc83dbd132955f0eb4c3231fc0393fc6830b599135518d24e93f90035d5b4f3de479597f23c910dda6943e58e34b71ce8de2b781efefb5fbab5460db9c4be10dbdbc6af73c1d8f2b280d17cd453771d48dd5a88f4fcb256444dd20caab668caeb024c0f78a8cc24d0384da16e125b092931b5509bd589c94ed2b393e963cc7a4b066e031c894efc78ec960389d062d69782bc28b43975d09ffe7560b02055a2f7ab54b7ace61549dd018caf3db1bec8ed75da8e35fd3b51c94a06954bf779b210bb9ba1c84d4143429a53a0564052b1fc42a064bf795537f0b104b9bcdc3d59dfd110424af98e06bd6cc6098004832ab0c41e03666a2cf37da9864cab704e483cec920e2ecc1c355f1eab5635e455df9d10c89f8cee927b7cb3dadc57491fcd5c9bbcde17eefe232bea4202738e682e6ec4cbf3dd6c4b025853ea6dd58cbe08fae2c7220467943d4e3321c2f7c51ced8429d50a4e751f13e24f7781f7d9022fcbf57b8c69967db473848f1e4e6c8d8af712cc434cc22afe0c02c5964b19fd8c33320236d85fdaaf38167d5b22ecba057edfbbc74f3769d1dd9da61bac2d86bb510b06f3b0c0809ccba2cc2fe56cf9af5b24edeaa0ffbf25ecbde7bc3686527831b735a629c2204b73bda14ef3cda7a0f61a11a257003b9a2077bf7af8d997ff1af598ec745904734911415feedb12616c77fdb74eb2139c8c7492e6b7947ab2c0c57d15bd6331771e59ed30ed2e562c6490ec78648177fcf78f3f18a7b97e495d3f1eae2ec136a511dc9eb24243efb2c8cb489942fd75fb1f1a80486bbf4129e5710e5c3dca321ed769e5fd1d6ccad87d3d1dbe22943001e5b3b80702d538afe65e058dd911e7a5982d6d684b88ec4071c6acad1acab9d66c874da7f28da12114608248c88e8a2089930872b9113f8e572e945dd52f386001150bfb8da6e8181868de91e26cbb92ef9fa7ce18df6c4947a6cda5c7997b7198f6db28cc2d2b8db77f3b930ad257484c27a4028b96301de1600f9916c6b7bfe1a66206f1f43df702d5d80cfd395443f5d338c1b340a5a77d6c2d96d8d22dbe10fc8f9c0ffd55206ba440dd10205318e725ef779bde138d0f18b333d3f3b7ce5fc30788f007c23cc09ab8465ff4620e65d0a1a7227ce58c3c636c2a92a625105a6d8717ef28544fca7a9d7d7ced1272a20af3a7d553623c994a53a4676dd1eae5dcd2e2588e9051f1f40fa11caaa5b176d74b75c371139dfd497f051b72297ad9d3e10435894c3b5c5a2da2f9d793495b699968ba6215965462c3b7a7417d955aba213542597de2af3dea97ed326f464e9ed5ae8452343ac986527a8d2e4c2163515b3e2ce69cda730caa1749b033dd2ac0b7f7228c676c0c726f45be8643516c6f0c2bf2e122b9ed54f0687c2803", "005151", 0, -1191423958, "ffbc74530e9a3bd6855645559c58a124acbf809d521badb2a9929a7713d9015b"], + ["36e90061034b7c735c9a09487cb15960b70a2a5d94afea477422410b1c132956890d5c81130300000008516365ac00535165339653b5b1da484bd3d28c82f8cad7b23ba7e0fe0fb320c9955ddcf2a62b389149baa4880200000004510052008995c607d46271cc7be76f8e23ad8aeb8dd87ed6801b10e53de8820bfa37427c2967f70302000000086563acac5252536aac04a824039b1a3b0100000000002e408a0400000000076a00516a6353ac5b097004000000000000000000010000000000000000a7699c00000000000f2292634c46c04df93792b89b8280af5991121f5927b17cb6123403a79a934d7aa6ea1c9eeada51df708730d9ab1dddce977695744274b83d494d051b0600367e82d75450a4f11987a9362eae0efb20535e3312f3c0b89ccfb40b28edeee1d800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c96617e2fbb3005b303733dc8f46a21c1dce4371155a0b29cf583c0ce89f18c690a35c2f59a9724ca2e9f88870a6d4ebb6181622d3b1f0d986791801baa260ed547a11b9ab8c6a2a8b51ea077ced9709ed32d5b33c237b8258c45e1e4e9fafbf106761f7f9b7be03455fc142c555da9cef67ac2f24b5fd5be1c950466bf649aa0201f2ac27c9e9e935625f5152d4f6c1adf8d0229ddccfcdae5bb6a35f2065d1b0032321f4300ee861838a1237c443867c9d5333bb90b946e0adb204a11a2843d0750b06c30526b55284ef430b6680e60d17f467dffa0e5aed906cca4d24504490ced8c2a597d9c3ddc7760952563b48ffb432cb4413b71a6484052346914dbeebe0e9021e60790a226fbcdf0fba7bb90ec572f6dd4c4386711ef88b434c16096586985d0307a2e8f43fbc136b448c8a8834d4df41dd91822cbe75d314de1748ffff9664a1020b2fe27309499e38e8e239e42bd8378d6755c73f9c9a52d5e269ec4e21ddf26e03206bc2bfb9bb512328ed9772de1e715d6dbf0153a38ecffc43926d141a1111e70312866910ffa4f31d9c095e756d64563306a12e29b2e8a1c37cd225b1da9e32f0e205ec22937f63fcb56a7c219d0b279ca9a9ff0d570980f2342d53536c0265591872cc51d83c48155c68a937bc06d365ff4f8657ad6f2736e35274dacb715e487e33cd4faace8fcc59dcb245032756f6fcec36b82f2f5781a89c43aac42b7cc4bd152c2f994fc97ff9b2209bbbcb18f3ab4f8eb133afedd6b82101b380b5a26773fb5b8cdc864db78c88753faffa1b22d08511be490c26e78bf6dbbaa7939c6fe5fb907173b32960ec08d86efa2ffb95cdd397bcea376bb78f6aff5defd017a90df32eb098fd34671bca74c7dd5f492485853954ff0d56294f87e92c29ef361ad2c347b56a2953b906a912617d400b20b8d0524dec8632e805ea2998ab60694abdaebda4e97b638d14d44de6c3829fcb7c1098c40ed2798d4f60d3ee284ba65cab2f7c968a97ab02ae92c4a8520c49e13f1bf350adf1a867d351327da6da51bfec81e6343ba4cbc638fa65e9e79d80b5f458293b22c5cccc00d331d538da3b5cafd3449b34ec815ab35bd1bf877b811a8380f1a104bc105c36acaa4ab43a07e585db20d59e47b7fd49b6988190895d153a9bf079086c3f216fb5715f49b79b64b317b61b531dacc1d2b80e6c0d396d45057811ffb0830fbb2bf8c6d97210a61ef1e95e56a54c8b150f35d881de97dcb49b61adc46fef8c826f201992a7e5c0f78300f913bc69b30c2636ba9d2c8e9d05fb8f25ea99928b7173311fc63c187f58f1f40c8347aa5dc138e535083d51a1a831a4280a18636041c5f9282e4537c6d6d9c9c417a618f3adf5e15ea3e5de477ae589b8b7df6b53f9fe55a06d2ead951f0b5e64d42a0f3d3f4e18f343dd54759dcafdac5fbc4940db5342a6b70d34bd8b36e2b2545a00c87a1b0034d36785fb0d60a859d6cfc099db0f3008e29aa7d9f1d6b57c4fe0bff22ec5ddb2f8b4ab10c196f39693dbce75f2556363cb108a108f0df106e5b844f0daae1d95388d727b45740a2659bfbc1713aa1fe17778f34bb6c01acf515c74fe34f8ae7fcb8aebbcb26cf404f354eb453273a6a613c039f0bfbfaab5b4a60873e9b6bc8b23dcb3b7650d8efcf2a7b7fd338b008b7d7db9ad6de8741910676f506e9670f633391b8f35351370e6c580fd7c973c46258805d64589bc9d3fb2360f675a3f31e2c9a757083e7ef4f4db59cdf75544af4fdbadd36fe23eece5ef021c73940670444d3e4e3cbfb67941015aaf1797ad05ca032e7b2f48486d34dd32513901dd8268806168291a5433f5819a0896888215e87bf10fedd45036a9ceb2783ab8ceb1dbb03dc0ad4e8f1bfc86a2542bfc3907b7109b509ea99886c60b8df1961b261f7ae74ac145e66387dcf769f0e7efb28fe801963df78bbde4eec6edf74ab45ba739f0dd75a5933e590112fae1627184d921070080cbc4f398817856d719bc24a8eb25049dad08125c4222aa89469d6a27023bf2a0c1e10dee249f004501ee483425e26fa26610fb2035a3d9577f0438fa31dd7b209dce8b3682994e44ed32832edad8da84e0ba614a0fe0454d01f9e0eab22a695ba55c514d533187662711a618b60dbf70309e746fd783fe38063ca3264be01ef8dba82bdb705d1d66f0cc19aa0fd655b2846a21c80a079a378542baf740e9bb0c79d9eee4c3f736c7ec2735b4324941237d061067b5458bda1bc9e686c216ed4e982de8cf8f74b2230b9dfa970313b24072ae901b4b8262fcb7cad5b366ec941834c2e904c554cd68901d465133b3e55c4536c52090e19f01b1a186839408f792a55914b6d1f29575af57df4cb0ccda311411963c41c665b6e00947116195ede6661eaf0e5f8d04c4fd4de10f565d2c57090c09", "636aac510051", 1, -1889338686, "4cb6d3910a04da2c21932b1479f2757ead6357f819369392d61ad99911e89145"], + ["030000807082c403045437cd0db0e95382707869086cd52966759dde1ff17dbcbdad5bbb811a7d74a80100000005636aac5200ffffffff8c4a26f2313640f292f59be43f7a921c792f5e2858b4e59dad6a50aa515d32910300000000e6858c79c1f38cbe3de06b94abef7613f470ace0de6024617adad4f11cb3c64d968718fc0300000001acffffffff9bdb9b6d6665a28538fd83f71c68c160d83635226baef422ba87b7b82c5c22ab00000000076a65ac53516563ffffffff011a359e040000000003006a532617c3df0000000000", "", 1, -679737577, "051167fd9601c37822eeb5fa51ec116fba5ce7e0324cab9523b6afea4e5b8590"], + ["8ee13d7f0223d62cac9e290de58b39f874ea82dab44f37c076a4b8ae9b54df15776fb3722f000000000100ffffffff0db8b84190262ef9c20f911da11827aa2a6cdce74e022a1f3094a44153c70fa70100000007535263536aac52ffffffff0413bf6f00000000000753ac51ac525263112a12000000000005526a515365acf3e004000000000165e2c325000000000007ac656a6363005300000000013d2e7504000000000000000000000000be597b267286f38fab7e9d2d50e36b1f4bd5795f1e3eb690ac50214d3731a12741e2a22c6c654e7087f29e735d561c5da7e62eb3ec97cb32f03becc8e797fc263723546a462775da0e5d8ccb8c116a9dfdb71530fefbf2b6df16012ac0c02bb8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b288b035af4bb9c439bc3def943f893ee8d12a473ca449e62f046244d1647a7e06d68a7ee0eaf8ea2bfac5b2bd7f7bb93f693d4b898ac3228c71e6463a07bed40ab644ce15c737001289e8bf2a794f005d51d16035acda0764eba75cdd266049af17b0b42c4d28e093bec7c154d7dea823dee7b1435aa954d90bc7c79e29e2a020f606d53f7ad9db810c3a436ccb6d25b54c0be1b34b363d631bd1fb597c27461032b6121a13a466831db9454543fb1aaf69b50940dae6e375af4332ed72dccebb90b01e3c411effc4f0da9683817d6afd7d6525a58fa7f9da1ceac803d465a8d0882897b9684f777c2f20e1ebeb4439cca5c35f7ee99155805f2b51e5d75be3ef47d020809cf60f9fe830c9d0cc99fa27217f3f5dc8e631124e6032976ca2b5bcfe15c032ad347b2e0f2f74ad4ddf43face72a66dba8ddfd44f0fe4cf6bbc22dd87d8e0c031e61081132db72515549144dda6f782423e58ff3386297dc986bf6e42ce01c0d031e585ede4eac7188190cac32cfb2ee27fdada0a6507f11e7f51697da7cefaac803241790c245fed7b423484255ce4aa1ac1e2d1334d0dc5c47c88feeed3c17cfe4a6e71582046f15a56a79a87ec06eb32ea9224a71f8cf4b0305c02a9b725d2588426529aca46fe8f998c04da20c1737e418c9cd3caecaafce10ed3e033ba61101202907a3563e51b6bb4b49f4d721b9267cd7bd80e0bdcdecb5fe7e5085022cfa10fc43f146a5122222d12af31e1f4fe324e84cb39d51e9dd90a82ec28df894a9f49c70f7dd09480e82511f19061cf96a021006c842e6259119a6c4210dae8d619e84b4844e608ad99bd6567a7f3cdd610da5d34daac26fdd4e1fafc6eee0e521209dd79fcdc3a08ae0a442b2432fb0755f3d774bced9045fed61d6cb2572e463b6a574d1deb4fc363037288a266b1f6bb0339135bd5cde3012532aa86f4c2a55aad4de3746bfb48f02ce00756cfb5c702fc09e7013fafbc971f746e4fefa007d475502d70dfa466a77305fcb2c4af8b3bbb397c5619743a14e6951fa8b5aed4dd367519aa245700155e8d2c4fad62d2349674673644ec2df0dbca2df4e7a0cc7139fcdd03122635341128dfdc0b9db52934e7e7890bfaf24498bc8d3f01c8c7e0dc31b103f4ea22e4628cc8a354bbb8a1256358460f2fc4eb0e940684bb2af35210a7278acd4645c9e2c651d7a1feab401371cca12844c32cb95cf9fc2c7ffb85879f22d22d30e85a34bb0917eff6577584ab07855d371910fc87a4b441036f38d19b388d7f5f430910c2420205fe1557b3a3575a32ba7b78e4c817994f315c370eb73fda09e55d8d0385ba69a14d034e29997ff271e57e988febfd67a8bd13444ff1eb69d0950ea50ab08ec4c82463bdb2f5ea1061c0f83d01b3b096591ad3f67c205d1fbca6a517e9fc7929ce2b67f8fbd87a5cfc202cba6c7fe2f851256b48aa621829ed6c6447a559bb5b0d9800ab97201a965ba090140c55557dcba4b3f2e5fd93cf035181bd620f62195635e467b3a56b0d4c015ba68c2f82d535394ca75d1fdd9fc9ed0e9dfda14fc6e61275e58d58d5a24d653813497cf3f18f2dbdd09b0ee96dea69aec6a8df31559aed70879eb2356eace9fd2f5c61566a138c0dcdb0717d49e85f19e48287aacabd3a9e4650318811d7db38a27b5c6a36f4dde0fdc1ff3b00a6213ad1d41c427f1a30872e0b7bcdddaa39db6ca504264b02dc4f712f9e23d39511f24bce8562c82b34819eff3a422276b42c7f25b09ef102be2ee3c7dffbaee45a73cbe3e0f1b7d047190b59389b1a3b5505350b457f8d249f4e9ed45280b3ded1cd46d17e0fd35a1a110adaa6be9df9bd6084d7945f510012965ff6e69b6562df869008e60a33a7ce1e57a32718cc54ff5b8a4f1896d799ba7bad105f1e8d2a7c612f6e648f1e85151ae39b561f570e42d9c2e03737762376bff230db1f5e26309e09b342e4832f85055eeebd8692ea00863758797338e254c69f1cf9ddf3f796dd3f4f54e0dca8d3e973716e5bf2b398938a13f246ed391af81e69908d5a71983f4219cb7cdaed6e6a45c0a1e95ce0e7bb6d5aab2a90ec105396a7256056fa7bd7787d63ed793da79608d8b045249805f0aff8db9ecbae7a265bd96f756581744bda4327c601724cc8a6b784d01465345933e9bc5cef5ceb2dababa18e959531938f2d9b9614a4bfcda757e70d2786e132a4605a60f11a907a965576cb28ded328dfa26f1787f1c009ab1aaf1345c7f9316615ff4e4dd2ffa4a52bd23fcec957b4ae4c7633057fa6d6bb03c9a291c3a905f774201e8026e75141ee9ee440fb0ea08082a646cbdc71fa3fa4e1604e0117bc2981d841d494e52b5dfe92573bdf8f5ce122502f1a0a2c8c1850d627f4238c002e9a9d146d72a38581961d790e4a80675a48d8f1b212bdb81c309", "5351", 0, -2129220502, "390f2ebda9b090ba580b1235ff4ab8c150b4b31d040234af252fd1c355142c08"], + ["65a3f834028a1b0efaec22eb1e792513eef6850516fcb01ce66df0c101033d0019cd5a6b5402000000095265535300636352acffffffffab2633aba05ad7d35c5dc8718cd311e564bdf891e148b3a491a74d14005f171e0000000007ac6a0063ac515200488c070327214d050000000001ac3d02ea04000000000465636351df89450100000000016a0000000000", "536353", 1, -1978627126, "cb9e83c235c76de64b3cc04975bcd16bcb29d58945d0daaef26e1c9a75288bbe"], + ["030000807082c403016d3496382976511bd3c5fbb9d921adad8e7abea942fe7aae612373bad50b5bee020000000251002f0e2f41040620d003000000000465536351da9347020000000000c60f89010000000006ac63535252007ff037040000000004ac656a51000000009104751d00", "6a65ac6a51ac", 0, 188031827, "09679f97ee894a00c961ae37d7104b74ac7f880d78521eaeb0edd5c1c3f5d453"], + ["eb98a27803808afc979a0a491ee05b4bd324659365c66fe397e4093842818fd75cb111882300000000080053536a6551ac51ffffffffd4c834bd3d478b3bd1cc3c451d18d8fc733fa9b349509dd02fc08ca0723ed0b7030000000963005365ac65636a53f53ab0331a327e6b5a78b8da0703ec9b7457ef6b6695f56b6ff26f35ebfb27b4b806efc501000000076500536a516300ffffffff02e6c2a802000000000153dd7693010000000004630000630000000000", "ac63", 2, -1584587241, "faaf27f48b4a91f2b539fa0c7ca60daeec960c31918ba7da0286dde21df6c23e"], + ["9862da6903e9535110787e01eb6514a449e45d864317b7708c47326c21ed3e7628a200769e010000000800636a6a00005353ffffffffa64096d3add4eeaa7b3cdd0b2e821dddb382daea1beaa7bc5f5a135dfa25ae9a00000000096a00630000ac53ac6580e1a4e9a6203c2ee6f038dee5f781f0f96300519c7b0b4bdbb17efd3e858176f4d6102a0000000000ffffffff04abcdec020000000007515165656aac525969840400000000025165de7bda0200000000085300656a00006aac3e853a010000000007006a5351ac53520000000000", "6500635100", 1, 1952637042, "1068e7e7db663989c2dddca45b94d26b74204a7d837aea4e94256ffae10a4496"], + ["030000807082c40301bbc70fcd1dd910af3cdea1d5d1da60b82f0fadf2e95e8acb2039c0cf1c2ee98402000000025352ca0e49f603f14c5701000000000353005202d50e00000000000953535152635251655362dc07000000000000000000000000000000", "650051acac006a5152", 0, 571605632, "635d95434bae619770f7f4a05fd0da3a4930b5a959af68ee9f1c1fdd7456dbe3"], + ["c0c5d05402cc1f41821d06dab65529bebb5a9e39d6caf8d6038f785c6929f4e166d10a45350300000006635251650000ffffffffb19c3adca193e96720f6741c8a66acdf3c59252271ee3cdda094817a0e78513b0100000005ac00acac52ffffffff02a4a98900000000000863ac51636553ac00fd56a303000000000700ac5100ac656a000000000248eab1040000000000000000000000002ad4e305f21ce309dc807a62e6634ee24d252b207ab5d4eb3b960b49b3cfe80e209cc6105e192a2e2984e0df487ea2a79fc2ac7870a1d9e95345be50bcec0df9e680c5232686c5852cb19c921644d6776795d51de6e5e6292a31d39b8ae5598100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb62e56500f502632b1c0c3b4bda66952c2fdf94d3b0f662ecc5f99f551f52e179b607643e169be6562bbb870b417e3ecdef630094f88f12bcc3a92b20dc501196236a6099001868c228fcc4d4a6620b7296943a0de2354a3aaffc5717795e49dc1d8825015e69f85be6f395d524f7ebc56fb58b7bfa99a548db52806d6ef3c021342fd2cae8224d0fe6cc55f3fba9e91de7b28dc265942066d0f3125c3a8ca4503118aa1ac83ea508a9548038ca02e81923e8407665eed7cabe3a4c2b39a75db9b0a04d84f73bebdcee7b4a234bd78404e13bd99fabac6d8d76e407c7d36b7a37a21c2ad76740e562724a6d69184cc7ee4659f1089fd97de39a9f25fa261207ac35602131fbadfc910713f412241c36312a205ace378f948297ee2d5b599785c66b71a021314876d988c96ce953bd11272af370d9626f3145fbfc0ff1c210b5b3b2d8bbb032e400b48d50650bf91932fab82f0577ca3b24dc4ebf6612ba1ca4c7c7109550a0301dc779f571b1d34ea6bc130e42cf5767e91fa278814617da6c3bb6f64ed06a7032c396a1279730130ef7be85d19e1adf1af284662531781d78c8d296ee1094b9fa8b0fc0fbafae4ba086cdbbf55298c79ca621e236039b72d6a636e62389eeb10bcbfb76934c01d67892983196c3f7cdc26b63044c81dcc479798eb937211847cd3767a702ef8d3bbab56468ad71f5b8edb05400b1eb255e3f4358d7283469937762b961e6e9d47b4a23fa03f483e54073cd3488d4fc745f1fce88c71ebce197eb275bda017cda016cfa64d7ea2acd653f29319af5e36fd42df2bdb820b072f4eedb442fb12f3c1b1a82cd77e272c201326e0944acc453047a91340933385429bdbb29a201afffdc8e3b1a08b212010718c98fe6951d455240e1d8b09da1a480ede26e1ebd95989e0b61c1a9635498db043a81e3cb53aa4735c8ff5ecf2da171de7b5c5c82025be915451024bc5aaa7cd93381c6a2dea0f9949ac3e60444b241c8bc6a874507d35fb72766ca84c163abda1fc338eef8c7485fbcef8aab534b3ea49acf54693191fd5421a72ddc2b7b71d0ec2d6e49cc5075c4114881e0d37e954e8c3c61b5c52ce72493b903506f10b55a1e04a15d9e89c8df88a5b5581fcbfc7e3e52bfd418a7f44dcb1e314bb8a92bd054b26ffc43fd6ea1834ebcbb4cf112d0807b79285a7ef975e79eccb2b2b2e0e3bfafb6865f070a798672cd07bdcec235e7a5062d3a2eee01a8633c669a52f5641cb7204e488c311ef3651e42d84a3efeb4fb5ee1e742c579a263c59bec3d239aa77e883bb4630d011e59787a49ea9c11f0dd8665ec325cbc15ed08298f6b0fc43b5145e9ab8a95c821b49f7cd9229e07a11a4494d4e75906d41bb796dea7b3f2951a3461b063c8cd3ddf0c5ef1f6be0dcfe44d5faf6cfa50d7ff7f4e9411a969ed68bc75ed12768470c52c77eae1b4d013d287087011dafc7b019d77bfe2083f720a03a3403d76679c1e8a32918f11931fe20671584d706f369e86d23c978ddfcead064bb5e1719f33618fc12cae8e89a9aff074772e9fb271f7c132af8e01a484baaf98ed809f73e1b3703c4f2ff8084b3ad6d3a2ff8b813f6e2ff03b68a2b9bc373ea3bc8c647a5889ca97b90f327922ded6119a84db570aafb2bb18690714ded899b11e9923b96cac3fdd3d63f8f37c1717a1773c9ed599ea6cee8c8a1d8f8f9c6bbd7be23c4ef170eb2c2cd5971f560fd7ddccf2268e0765b45d232a6ae327445120437f70c604c6b93d05b6ddb805bb03b88c0c209077f0550d3383071c63baac7778efc44ac7da8f84c7b4d17bc5069c6475b04d9ea4c98f4822258c7952366a8bcc72a556cea54edbf438c0a4895f48417e55302815496876b9ff18a29ffd37f78b6643b6db9296b24357464e4e041e42dc28f788bdeacc253fdd3d221313eb0e27bc4e72e5d31e95e2b8ebbaf4cf79eedbf37537eed4f91b0525dc7f3d1d2834f50009b716c618f64ca53d999551e4ffe2c8be6fc1e166b6250fb60d14e8781d98ff5ffd49b26698db6db33743139f8886285d1956e51756c675f7e7c056eeda1f12fc5690d65c3b8786f3c2c4a063db05c6d04a5235e4b2598d073e2d982ca1ed1c11f20ddd356aa95d5fc83bb51a41cb6b2beac7b281284d85125a2469804e5b7f0adbe2c353a6d9edfc8e45a9970adde67854fa1f9c0019434d6b8f52e2a07c9e5ecbbcc85643272fff597dec0098cd5807a1c0a971baf03222e1c2461a169298a6c59724efa53510dd7cc025a1a02d188d1a6bb2385ef4a6750276800000000000000000d6cc4040000000013256ad5989b98135c971befcce679420957cf4948914490c69ea1718e34cdea261e7e4908ba067b18ce45495f20fc398db37057dc9c507de5fe6bd6b0dc72925f031b83f97960395879a49e457db2c830989eefbbae82779f6da645b6bcfd36000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005f1565b9c65c7de4d57f58908fa365547919b302e935663b92aa9449b1c0a2c0105ad151d12df53668ece2f08e1933850223765b02803d6710d9af9bad165de9a5f4560a5903168bc5e3f165a2d299dc45e8b2298d261fdd0129d5bdc8d89c460e3df8af90a633c490c85b851f660d38f6fe26a81bf7e25768384a3daa0e98830302c4c27a276ebef50c58e683f69b5888e3d4d504f4c8b8d9866b20f57e8c2187031c1f102a6f149baa11ad8ad00db0500b22748ecedab3e2fc16bff411f05f54160a06cdf3a080aeaf6de0bbd930524615424455f37fd02d2bb4b80a6a2c825d6aba92f94810fbbeae417fed35dc570e0db115a5745d74f0bb895a6dbfd3d23d5cec0223186e5bed0191a58449400ff4db0d3ec3211fd86c730b81a84196cb1843707a031596907939921b23dc44002fe7d97e9083cba351f9ea1fdac84b4740dc6a8baa0202fe548bc375cda21d94d074dffc4918a5c95d5ec0afa66180a9f0a4d0bccc03020f41f8f6cb9ef851c7918f874640861033e676ed3b758f9e9f29c80b828da32403006cfe1ee7e3c630c127942c573c94af32a775664052ae5ae3da583ec51c6702d1a1ee65289ac3e64ed88b2629d77f057461ad2d259213dc7597f746504ba68bcef10b3ce541440cda3e3d0f2b907562e28dfb2fafdd0419c93f5405021564e6efabdb1848bc6e4d5470f44146f005c2c5c6bd0bcbd9096db6b964066483b022f8d29cca1a948c19aee6a286bc09841ad5d058c35815bc55ebd93a306c35228f08c0c4d419933a376154829b43f67a723a79156935dd5f11b45bd55be2e65ca0bba234f14dcea1eea509cf1eb5460be5527b5423adf4b7e8f028d49add5e5e066356290645e76e43950f7839b4ce5b0ea9c6001815db5875b0be4e7334fa1145ba0c710ca350522b16b423dfdf0369d674cd649bfe81d662e22cb6b93d03ad1f8778175427069d48d6b0723d1488d2655c9f3bf942ff6847ca3ba66e0761bfd4c84f581bbaf35d7db6c17f712205b0eb7e45d9a82fc4434084a110e873a13611479fbf1ecd86d582e54bc5e1e159280675dec3c86656f4cd4b17d7db362108447e37f99d00c4b4d6c094ac543fb0453440be11382531c5bac0b60a183da5f76e220a24271b9a31de4f97c86b7f05e9d33bfa7065b5c8c77833b0b4983e257f0f02fc9829c2bcdadaf73dff192fb0e19bbc6aaa64cdd4d1ea4a211cd734c10d71bd7786a5dc9989534033ff2d90335575cf13149ea2a74bc5c67719a2ff97e1551e385153970585b27c264ca587b7f6dfd588061356921cb6502cdec167716beff580c1d9d55b076ffa7cf430b45b575ba02eada8ad566d72c7069c0c0ff39b4bc9a6692027a76c75044a9a545794ab120310aa8010a2f9e97b6131afa48a294afb5fd0c0c57ad8e3f18e96fc4b9e0eca9efd7af65f872a9d8c71d1308b01642136c9d4796cb09679005fac29c2dcac35147117c17d94a514aded1e11efd4eefe84bab931f9b66af7e2ed9d96362a0d1eda6dc03e1563791ef99076b46566c95fcf19dd50b2cb24d6c342ba4c38a440fca77a33528a73ba005fc749815e6f5d7023eb61736c7db2b55652363d61a258b0e9331bfa9528096ad3d6433ef1e6eeb57d0a143bc964ecafac520bd4d948531709718032547c76677d0f9f9981d1d1a0db651d968a56a9f1cefe172c2c908771276e17982cf32f9e80e79553f2b52dce8faf59645fb64c6332217e0d3d08bc9eba3abecd913b774e90329db5c871ad28b4bfa6cb68b2b004de4039bb1b6fb63ce3ef668728861898a13e6891c379f7f9aef0cef62afe12ba091e68c8b38e02ea29b480289d10d9d64efdbfb36a8ef4e56e266716599a23aed9ca91813af1c3c8862c20a56f307c48d608e2a13aaa12a1298c99b5af1f0e78cff174809498921e9f2a5b83032631841544a7296fe211bce495af8dc13af981a1ee9a6f3ef6237ba398cc872b6c3386b3c4fbd257cd9fb388ef8a585b04fa430557cdd7e967048519764ba78cfc649bb73333ce5ac1ea26312df684abe998862a77fcaee20453def7fa4d07c09115742c993193924fb22c8111325f0ca29b904dd2993da0cb76809eec49b5dd699c1995ee7ab230b19b5b4f418dbbc6869b47b9847d20e491a2e48f5eb2aa96b40b5f89ad2d541149a02e3f3566e3de1899382481fd2d36e166f89b13079857cccb7c9100bb60b90d2e768c40f0d4e6eb13dd25c457a0d923c01f2b26f42ca3fb94d99bb3d9b86b1b2ce83d21be866ae8f5ccfd1c85978471d887f77fe7c8fff135ea9ce11d0f44a7d1409ecd7b4d47b47b3a2542bd691f38aed96bb9e6075db0e248893293c4a3d6945506c3d94de8182995eba8fe690cb853495e7dc0cedec776b8389cbc952b4d0cf4318b17bc6f4222c777d9e18de12dc5b31c04", "ac6353", 0, 1017031101, "55c7e467da4be3da8f21f7e2f8dec18c564091c75b37071164832059b769e9da"], + ["b6e6564702699fc4eecb0caa26e1c51099036b1702bb7125c70c2ea1762152ea00654296680000000001ac99be656a721ade79533540e9fae498d076ab7e3e3419c0a9aeb1df1f56f88a70ba50df2d010000000165e15fc8ce0279c2b405000000000553636a6a5380a1ac04000000000151000000000200000000000000009f753400000000005ab6e4b85f19e89e4e69e84094e5f8458b6ff9f8ce128b3088e14db90b240fadeeca7d03d1867e66c326da3baa8174eb599c5c4ff650658eea5d121479531a31cd6012b130a1595ce1a0e007e79e1882ee4ce9fb8536c930e9d000c8906bceb9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004848d62f11d6df441c51d6373a600e20fb417fc6c0173fc5a6fbbf37f1ec2edbf25b0ab79b69fc31b63b09deddd65e423a5dc9ef6c27db7cf359208a16092b248bb47e56fe95c27554bd4d41098a168c3bc019036c4149a3c71431f56a19853a36b01849cd00faa2ffbc8806253e9301d3a46291f83b38eab7beefdf8742542703072bd00b4c6c771c221118a68363bc975d2718bbfe1eeaee9b26e797e2fc4e45020f562ebc4fa1668d2a90fd604724188058cae9cb96c7f3cadd095d9e411041d60b05192b046e0aff803bced82642270be85e43ac36ea20e0a15c45b8750bb576b74b8b0826e91408cc441b88b40704adc970ae23b7c5f4972f8648386a4d45e30a0228a1597320f4c0ae98c6e4e0a7c48861a5783449bbe0af3f5d990e02956e4b7b0310c3af90091ff99662678dba5d15b2b998123b07360cce898ef567fa3943f29a02120ecb01d3981ad9cbad1771006b6cd36758d5d6019581279ca8f0245c081835021ad59be1a9f9ab7092630763f67e2d268c0610357ca1501584ff508f1610a596021b4a41f4d7324dddfba967716d346b2fa620bb96a4a414c1a11e5d605e2434f63afe4530de01f19483724f8517b6acdb0d8664f80f307f93e16136148fdccbc46641ac60ed0485fa9cf451e3ad6559785785a55ccea4c8198584e85441731c9a8a739e378ff89bad3ffc40219eca42526ff41d420420fbeaa35bf3b1a11a9b8a8652c971d558d50bca22c50fec7957be88d6b10527473dbb11e29fed1bc3e7dbe01f56d893a994f63ff234c524b0d47d40d9f2e76fbd3402836a42eded28ef4c16a747bf65b4327fdaff56f6409580e0feac875c5eec498256626c2282f0c3f6a021c4d58eec9f48f3df36a1a034822ba900672f5500d8e5211d300036695872a29dbc8128a061a73ec9e804c2355ea7eddb5586935b610628365c7da3f779585f1d192c8de58a34a47ba2125c22a67fba4c64f1fe9c188f1c8209cbda689bc76533905ea31565d50a985a9903543cc95ef0b27497aa09fb6c846c247d803c808e5e779a19255150afcec0563766c98060cc236c79e3118f06f66de2d0fdd1f4a24d63425b0675c093cba306ee4bf73a390457eaeccd3a5671527b24b70e1bb692e6d43c90c2ac3c30a3178092ede3e0810b9f28b3a3e87e1ec5c38ca4d576cca5e39cad9062ca27592e2542d2126338740429d8cfb5a4f331eb1c8ad714b44ec12b9a23225650513e96c9b54d9cb4bed9e4df2ad6d15f613a997835ec63e80d2c4b599cf45d31ce003ad1c7e94ec2828dc3c584282dee9d94b89b9e9bbb2e4387ee50fdb6fc274b07d44949646affa92ece58d06089dfac1fbdede08da89da35596bc94eecc4561e0c47969d6ed85a78536676fd9ce771290b154e951e88b4f09653cab0e9e537d6f380113781652d888b6bf21fb7220346b9b3c56f99fa5a5983f305eb574f1fc519953965b3fe59806fa4fda22b39a8e273c97921ce50efc8f2240ad6800bd72e42c06cb744295e0a912f88c9a04bb2e653188452f5c10bd502034ba81fd35091d203b9480678f9f3afd47ac2250d4e9846dd5227b4401e3104e16d6c9d5a6c5820384ccab3b9bdc6af8af35dc2e3776e6a65391c964284df1614e33a835f60f0d60341fe62a550e41474065b21ea05ce2c4eff4dd254135760abe51f917d8143d09b7ca1e3bd2f76734a7159b1330c91c2baed165ea607c1b6e3a5f57988a18235c10b453bae58566268755e9ffab2c0d795156ee367a73d79f2874d9cc1a093e5735ba52956bc1f5862a2d259b43fda7b8c1c58ba149c2dbea0aecb1916c08c8556b62294dc58b01a7dd11554f10594537f55e073909499769081fcc41b398b51f9d1e62c716c17aea5fe55d7a58d037345b691d781c2be273f831645dbd9a28bd7114e0428c06d9ffcab9bc045eaadbaf9e0c63decd4df547dd88329e89baf87790ec6c3e6f3a4cc9a3183531ad792f36f5f53e36fcb0e18bd3103d666c6bbcdb7930ee92ef089334ca2ff2aa0582db19d3a0c8af90550681d07df838fa7c77a6fe0a591d371441e57f04091745388fc8f2ee6d6e7033c3425d438701045894606f91a5ee28e45c166d7dbcc0c785b39ae691282910d954f3a7d502eb10c8f7a8e9075845c09455bef95ac96f23618ca40ec95a146e8a10e2e2ec01e40f2173e14655a997c7d4d3bfa47f2537592dbf5b598fd29694145fe4a4862d3a02bbd68f50c9ba1e51789e74f0a23e9b74a6bd844f5aff1845944899d5c2e3e0079fdb3efedaf1ea3ac658ea324f2c0500000000000000000000000062ae286fb3956a6a227a3e83556330e1b949d6174bccb728f87fd3f753e35f52edc01025e7a4227993b137412deb58727572b22cd440b26e63e23ab5ff43e585c5e50c3d100a6c7557e705978486602e1986bc397d2012e023a7cc5887696fe60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ddabd2d8b1c8bb6554afa0c218ca118f629487736c7cce84e0e4ccec90641d79fb334dc9c0d986bb85eeb6b0869492628439347ca3470e29a20cb25537cdeaae08baa6b5a37c89de8b823105f8c0e5807463f9fc21bd231266cfc93e55e770de5636edab4b130ca2c0ce8960045b86ab08e9699572351d0a05c7fb7cb63fa40323ad25446f4998bb668144e19122b875388639b85f9dabb08065c5199720f9310304db8318b6150af09cb8dbe413a7d9a57c45a7e120830490c83f6ca0b2cea2b50b028b504c976b01291aa2ce90457af6982c11a46644753bfdb0bb4c138b3cc1225345ac82abe38d69d1260a8f40e061942de1e573bda3ea1545dc126bc8cb7ad10218a5dce3f3adf3b7271cd3c7bc0b9c0e097671e1e070be3fd38cd35b5bab9631032c7a43797a9b68e7cb7786866dab716e7f82ab2ec7b4184696480ddf88985936022918a3324f0f2a422d2c4e32da4283b3735c96219827f17e9f848e98687cdc2f031abc49d366f5857a95690cf9bdd367814af64dab41fdde403974aca8e697473d022809bceb66e510323dedc923fcdcc780fda2b534976ad11091d4801a9635d6d6b9f13f63b8c90115eba2a3c804d8bce70cb73b0c2c78913d4a5a1085ab28db61c78474c68ac910d25ad6fb554fca65b8b1e3fe7721ecb04010a41b868b3694200ed8257716d7ca2c51844e88c41d8ec95aa38e8eb1bf650b74832a08c226223c9d957d11bf4183392f95e54de929c510ebb9a3efcec65154581308ee92563e89a5e77a953dfd59a9b993bc5f8e0df2bf1d7a5f75f66ccf11a6b7366b5646a857e2b45252cb48a48b19dcff77bfd82397d4457bd637b6a86234331e6fc16b1cdab9acd9901ab4a2210e2df7bcb0861f8ccb97495bd29a8f46778b8590cfdddea15ec7bd9c8bd697204ff340997b8dc29b7717fea8498f3546ebe7a342cb5645b134d84ab177971befd28ae141f2dda50c89ca67a11f41cd4e1815b7edb1f3f515584acd45113d3d29c4b81880063325512012ca13aeefb6f4eedd7c8e199227b2481346ff33d68de175eb3d41dac0b16b653a871f5dbefe79da0cbe0e2da74d73826c562ba6b06b9bcaf8cab53617c1df015db09d87fbb0552d7858389b656097a265da400b53d711c1b5ee8ef661a0b440cb406c5d0629c6c2cc3d8d2311468151bf50ffe84788f99f3a89aefaf5af9646299f2b4674e019c90d4d20612ed751ee961fec99040bed88f3c80fc84c34a39bf17d0686a77fcba0d4d0ef4581275352516e23af51a6f7eda9139e40f54df04120cf0184f3b53c021ece32731398fac46ab08ae65277e014fd06218a20f315711ec675be8d66877df2728f3606a2341a2d8567ce2da78a76ea9703fcb94df04c7ee26583c0681337a2538cca83d5411a7b0ff512a559edf877d9a3dac693acc3943c9db6d7e229c38bc8f161596bd60194fcc1e9f9b75144d1b48369e8270faf5b30d42fbc04acfa4eaf18bd6619e7fed0f0c28c63b1aefce95aad362885e1f88309cfa17af12538decfcc65706e072b6bf77528e8ece518ac970794a6f56258e3de52013726785f1f7401b122c8beb489e303c8d5446f14dffd6e16d5a62ad3a7cce372ce0010620d5d0b79dce1295739619616d6ec2c7cad887a0ed7a2ffd0c88b105948f6703ed2700523f68eabfceecdf6e927b715628a8139cc6ce82f6e4b9557384218183f60005841c274d68942003419fdbe0e581dff6e7240250e59422259baed25d5c54efc756b00ec79a6747a151f489e948b6703013416ee12b0533fc9bb98c834cd425d17db7b2ee6b6ff5476c81e6b7571b403d0ad7a26ee0da31346438bb92a6a628b686c1da18eac5b4ebf06dc8c504cf5e6dc44b6248c1a8398202bede8beb241f369894fa7a2dae9678bb6f5ed359ceaa3e5a430a113423d6e3c1bc569054f407f195b96b6e11c82b1536967d48851409fe150303a2340f0fbd2c730a7abffd1f78da55c5a1aa0722e614bf522788d2703673fa3eb57f2ab1398484362f90ecf23d2eda2f0ff74e5fd0e6b77a055ae9e1d9d919021c65afbe29da7b6957bdba9d77b47d266cdab4334c79dca7d69953e5fcdabf73490f50702172a7cc1c6db729abe4a185bced5452932d78ed5e3a05a027f47e7eb07aa7002f46e0eb3791be3a1fc624e92aa702928211e2dc19043370559cf3ae7b2868961959aae7e9939afd9bd1d721a4b24042f3db77204fd5bbd2af666c978d57cb71ac732bf05d7c847cc62cce5529ef502528748b5dd7fd5f7dad176ca3d5c1c175752128d3933467079e3f4927fbc502922c7bcf229588d4d274a097c93cbd25ae012e620502e709e5fced126dc449f615442a9bac1082564408cddc57429f49ae1a4b28b7b6d4e97a6dc893864312e03bbacb40156686160483cc4f3d6e9ca02", "6a", 0, 1351501209, "d135e60ab299fc6df85eea0f58ef4ae4ca982aa9edbd4ab683f29c47caf2e5cb"], + ["030000807082c40302783028683ba940e0c1f5d7be23f2e2be478b25a8c2c870f60b93e4d2c08eacb20000000009ac655251516a6a5352ffffffff7bcb05c7c873eb900c58e5ad70d83b6955fd009186ce0e8c2d60922cbc4c9c83020000000153bf281be0021ee9ca040000000004516500ac2108e103000000000900005252ac63006300d394e5130000000000", "005263", 0, -1740347357, "928f1882265eb3a2ddfa2092fb42b799ac8b08b215d3b4accba84b46b86602d1"], + ["4a25b56d03d5270d8e885a2608ab09c5985be7964bd1ec8ff9043af30fca0fd52ec87b45d6000000000078b372ff2b652323dd598bf525ee523168db08f4b39c4cccce2ce104d54a286e018effc001000000025100ffffffff7d510a46bb185e769490f6c2e74bb1be2ea547b80110d62af7ed272e6dfc91700000000003000063ffffffff038f84ff0400000000000d4c090400000000056565515153359905020000000004526551000000000003b58c0602000000000000000000000000c3334dbbe38cdfd5641cefa65607f9269def2d2791f2a43a6cdc4e5737f27bb3a619f0c294a74a4bb698a9ea653ca08bfc3b3db5b30eb3155587e013bb5ed1d21dfca76d22f37a22086bfff55e51155bcdbc884d3e1af11ecb79dfc313f45f4e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000616404e4eb45c9a334d4e8afbb9bedacf1ab7e2d4c7bb3b351ed5ff8098f27c26f4eca05eeb508f5d18262bab883321710a6ee45e5cee734a59a8522d3d58600e9ef93460b614e47444e26d3a76556b3fb15699ba1abc7d9bc546d05e1be2516977549edc575b5fc171fcdb1f47624c52d46f134bc7aab77e620c3cf7ddc234d0327a9bc454a718702aa30fd47e14f525ebadd20230d1f1e2faca9834400f38c9a0205b788131eb09a169aed496ebf387c6c710671cd1e93eb6a9c97bd8a93894fc70a02d5ec167645d8ca0b0014c3045087e77a11e1778eae41a4ce661469c40385d2ab71355ccd79e46f702fda94869a62a8d5afea3b04b1dea81c2c9958167beb45020de3b9946b6ab96a6597bd01893eb37fe29c645eada302a672f505cc41dfd52d032af7f1786ecb3fe34a7a4faada8ae3995cda97cebff7e5d4b423dae2a019d2f203210084fc25925471c8d6b7e85522aca4c9ea34080845e0f2fdc8500a6f2111b4022e327238a53a4dbbde4449aee066385edf66bb8a3b77364ac658b8d03d92285c032797df24e41911b614be216dc66a45f42bd6ccf2599542bba47987e238973511f7195fcc15a40bd592f6f4e9c9aaebff5c613a4d0ad4eb0e1f5f7c1781d74ae5db04b03b3d421c45ca3b6d9e762fc35817c4bd8e2dab45be8a49d956db7bffc107939fef3aece9f9d521fe669455a1ade92db8946a07d3559ccba6f8832da4b7488dc59dd570091373129f94054faa220aabf92fa5cab2cc93dbceedff5f4de53f4fc9dec93bf60b9fe0ad6f2ecbfea1b566658ffe61c27433290b10b8ea201541fbaecf8ab1f21f4f28daf96ea9a2df1f9f047504913984117229289c4a8f1062decf207a06e2c5fcfce0583675ff4b8f409378d0b2e04580595d65497dd17d9f2201757665c585b2424db2b786fe866e9a5d789636e179d04ae9cf4398471a459cb5cf0cb710b4045c9eb166bf4d370a83873eb73990ac630c99cb282541e3b37ec8b766bcd1bd1e657b439db6124e4c8668e60f67a520fc0209db74c700d3be88c78b50300b8a3159c9dca234ea7440e7ccfe3e58b438cb54e4e14bce135728f07a03d2c606fae60fc1ae96732153be9317420f1a90f1e5afc1c878a6fa77c4c49a1488a18b355bfa2e2a02d0c6377dc4087ff70fc7ce76bf1aa3430c0972880c1d8c23d4903b6c3b91ca8f2eaac2f3f71653b2be069447c3b186f4390bd24226d7055bb897067e600182ed33de6ff9c482c6f3cf8d4c51133bf88bb5db85078481773b0011fbe6876c4210fdd0437942ebcc29674d6e214e0c1abef04516249fb6253f5a85160edbc10900baa2b445dda9b8d53eb454d86def7f3800ff2bf5bee6b8835f58e3d7d9e8816cf93c39bbcf367cd1380549849d9b8c13c8f05e5371a8d0ef53184907773f504c9cbd8787b401185a89e2aaebd67d16ba6dec753dfe1c86c37584e67d14518e07cf463e5a0e36913ff6bcba7f52676f2aed4ba75259fef22dc885bddbeb0f264a0a5c9ac65d1146929c6e9c9f3692a08a04cfe3395a15efabad8dd3b5475fe88d4a527e0715f10afa83bfdc185390256507650d1bb25c291ae57ed684d6c6720c2effc2f3be350df18f5ee1f4dbc3291a0de86369915ecf6d26faccb99d4bd7af017bfa0bf7c8359d598bfd6f90dcad334e1436af54f50b90563f73f30acc3e69d58b09d5afbcc72c9dda32c8ea1f7be56728a1be5a973ab82544d642f3b4a61764a571c9c9e38534bed9772c34e8f7ed21bc466742c1d56219f5633a89ed3d84d3b6b4f3ca422ba78cbdd0bceb7f6e69aabd3835d118a181a8e92a00f743a125e1ad447fb78217f6d363b24b7dffc9a121f9172e40f29db498d787ac8939154728a3260cc7212e08e2c54fc4915fd3492124bf2d188b737fb99eae37947a92d5dd7f200a8c3cdb40b653376fa65f929496d72390872573cb3045c2866c053705a83511a9335279cf27003ce3212aa1b5b2f4d79718ab23db2bb5bc3c9410b7babaf21e4c8e251436ecb6425c4d69221b1e23059c78ba082b4a06d197fe228c24093e2b8c1da04dd73ecfb3fbc6e7ed71808144c816db04a7894349d07bd024243071aa9a973bada336211734b5bbed3caa7085412cc3ac3f77a056c5a04d9bd4937560bf260f8bbcd868680532848b333b7191442ff760cdc79af874502052994ddc1d71ed17c399e63a745dbca3c6a7037935adc34756234935db468d70c1f6f5ab42e1952eeb9f67fdc8757e926590d9740f29949a668f7a410bd3aa1141a3e540fd2a860000000000000000f0628104000000009e1efb0e2b1a06e7622cff2bdf5fb81211ae985d60926e9b8535b860d439b95b4a997c141aca813eb36a7cf2bb2464c951c21ccb7f517168ab501e9bab9c8fb2588f0011ade7eb2be264ec87c0f73a7de2eea4cae42a6d9012ea8b42ee1f800d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c427938211e871c3da16a0df22c523429f631d3575ea59e2de2a5c7c7ba92d825c518f453c048e3ab5b1859892462b31e639d067cd7f5fdc96730bed57cee1f8a61fb0ff147a134f28728f4e42c406501fa5a1ec0f227c918f022c784fc50b9170d0e439ff06298bfb09c2e6011886a2d47566af858f27b533dfe7ec66c5ab210310a44a9cd84c685d2d4db54e1f414990529062fb6e0d1ea72a5515a61bfe91c7021cf5781f51ab62f18514606e9f9732d432685ae77a52ed204471d74370db8b820b057a16bcdf3e0ba68bab3b43ae2454f162b6b2fd5b01da82e627ae3839b323f36485a3e9f1f641181afb7046f74cdceca08ca3f69fe94b817e7c07ab7fa13e8b030d3a3e8ed46ba2eb28f0e94898942512c0f7d6ba8df138ca69bbd16ae4a7f2d6032acacd48ceb493855572b7e2911c01798aedc40619de97c9d1699cfe38dc0a1f0217182259d2462c53b87ae83173c8547f5b4fc6eaf95c6fc7411773db30d931f9032d820f30df9a63e975715859e196b1a16b5be02cf1ea078da884736bd40013e7022bcc5c02b09ce42fc020a0032ae3a76de39255a926bd5522555d6983613ec4abd117fcdfda05ef7f79084c5f79ff69ea578dd33fa880966a2334483babe1d9644c5fae42e75b6232eebd87a8e28acb8ddb4bd242866172d368edc3b29e8c98036aebd9c744caf77ee4eec9a0b2fa13e070cb2cd2c4a97c78e424fdc4f87d54fc324c3d41d31cca003f817bcb055c4f902d2235cc134409101b8901d3be656fa9f11b614885d9503ba7c42052343cd30552d03a4b2f98af879396d39ff6a80b7348c3b7b06541d76b1cd66da314547fa316e6fcf8372c59a4fd1d06fd5589d2b751710e9cb6fd0f1df438abe2b6e3a1a8d9228ea0801b53a5dee6545490e8acd4b486c49ffe0592924840db2ea4f50f77516a1bd5b410b46e28750a1cbce7f71e1ed84d68eb4bc3a97cd394b9de98a810a66345d42c744df2c15cd9696797d914c99c9d32d4805ae9afd6b51e0859efd6f6e57d114ac1456bf7544b259173bfdd6bc2b8a308ae96c7638ef7bd069c4b445f63a25a3d48d8f4abe293e8c575e183e27721bb4c15a7763c15133a74683a150286db581a4b585c6fcda4566ae5270d6342985fec00c7cf49388ce5775f0deacf8511a641525bb2789bf9421a577e211f1b286dfb17bbe9d7f3ecded2807b43f03d844dd58a544216dcdb29387f7b46fa8b54ba60fd007e9100745336147667698971322d8e4eca1d48fc1c7b78fedc4915be64c4f1491d40b7c41956e8c97737ecc2469fe36fed40b3d273c2d9c1dee2e81c7e8e49b95bf011f0fa10e3fb550b2cf78e9dffd92337634c4b7aab9ccc30efc6c52d30c6a16da883753f1b740ce903eb3e276907113a2e3c4097d106da3653017a8e63fc93d3d8d5281f6e9fabf5ad6dc34b7510abe54fe32629c87285b7cc74d835ffd227ba4d03ced8a757293beb717f44a026ef9eee9546a435a6e3a7fe22c699fca44c658c25adb2403ab6880607ef277d979f0c26bbd413f0abc6d2786d105d8398fe4e8986cc99a9edce3d59f1833a81f97738169410644dffcaa2ca3a59c530a1332c8f3c6c4717265d9dc1f1612bc05addb52e4db7ff47dfeb902c1ab57fcaa6c124acf84da10376048d06c7556694adeb89c848d84784ca32f95ae793978369354da9fe7df0bfd829d85e245d870365a4f4a9952703ed23c53567b512b177445e8d6e14be10a02582bdd0149c256a38c176df530d2504625cdf6468015a487f44ced31b447d6d674fd27e59cc86615fe75785061f5aa44559c1fa48a858dd3c5d03cd3a2880c8c29de9229f0c145a236475b99586f8363a86715072893c0a8d57e3c48cbd4c5907f55695062455840b476f4363d48f117209e91f30a2adf2b896ac76ee9f6909ebeaae53ff2ae7aa66cce237cfa2023801d011d7b1fdc788a803af558c1fa8c72343f997192c7d3806bac1de5882d35305bb5ef5b3480d00fd902a612d8e87be5427995a6b0e4d2246dda0009a3863e93debf11e06c40a7a1c12b8e7beffd2cd3fc2fdb929c8d381db43e0d3681bbe5be64d4392c7af742f5a851c19059f4aa72f0ba2b686a541ff61bb554b3340b22b8ce1311efa6f501f01e40081ea36425e38e1b00b31bcc58d36ef7374511fa8b62c48ae177f77bf307b80943e2c0636fdc911d4d24d0cfcb881dd938c54948dce8841b73a6c5b4e288273d0349072ccfc2c90332de63f192e0c45ceb4a376472f6c4e22216dd3f2369c1fd583329a68cf7406322e0000000000000000fecbbf000000000089d8374be648e6712150c092249fa5e2009848a4eac2f172428102ee427340208bc748d1eba9a1c9217afe457e53591dbcf6b075de32b98befafee3b0ae8737630ddee511bbbe3a8b7b553e32db462dc077c1c68ec7a8401b3f22e71d16dd2970000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069c5cfa5426c0105a5f2f9721efdfda6a0a1652b41ffdd901b617519a42c287edd4d9a9fb66841ed8e4a930eed002344200f5b40cfae6e78432905545dd2ca057ba621d536f0e61a854b004989d0379e2f2868bed509336f6563aa31c0e5bdd8f323ce350f446896b03e9b8ecfc66ee871cde4f0dc57d4ded56b3aaa8dd9218b030fe6992eade3ce3d3ce241d0894450a4306290c1e36bbd5916538d0a71cc11c60305d862948ed28b5a2c5595b7789ce30194d80ab957630b0c27434918d522cfc50b05f5613a48976118551a633664308e520b0e6c6ce1bc1ec36824b61d200cac3900b74fb9ef533fc3ad8b1a3e3eae30b21ce617df76d5fd9533e9c7ad2919ac2703173ceac0178e220b60f8cdf01f51a538d4b9389fa0c7bc92ce056fbc36397cdb020ffcc31bab5faf681d410a4aff5634b0ab0f9b038b428ecfebf19cb794454453022c5df61065b62b732b7b91b6c4752bf5bc76aa78e697abc6a757c47d507ff0e2032a1216e5729cc645f3ad20fb2ec5d7cf44eb75bf566f9a40061a4ad0e29a6a830315d229d33ebf8a95b7ce1851d37bc6f326e8c0bfa5867c87b6f5759b6c53c55dd5fa8078fcabd3a23b582efb0f6958d852b499895aeaa7b3d075a72b920e1232386601d57dff6bb1f875a4a6c23be2b2e5290bfeb4fa622830613488eae81f51d154ae13e3137cc297b73038ec5f369a6741e840fe39e59d16fe14cfdac7b39078414778164a867c6ee13e7af2e82f09b7c5b003555bcb5c3c42d5d6d711ff5db93379ddad2b06f166efd0a65851f21ba43e5f98e2061ef098167745b9aa2ba908e4d5af1200e179a791ab69ba9681ed830a52a2f7761a0b75ad62e4e864fae7772375b3dc094710e9b7c326ded22d0b0912934e6babf9187d7e39fc034edb6fd7b5c773b7ba50649f9a121449e063c2669729426cb19d155bb3ef7772141eaca71b97a651dad2cb7e6d8aa06051339d3e743dafa1d13d26ae1eded0d6d3febfac0de594ac4d6cf9fd954cd51f3b5f7f01d794de2ce6ede15c4df9cb0544bf790004395be519a7c62c60e688a658023ccaf7067d4b18d3a94254dc6f862cdefc2108a8b3eef622426b36c873ba2a5af753a49e016d56d33998020fecbe3240f42a2839cd70c712b2a1fae199d129119e1ff4303aa5091cac157bbd41e8793ef1dd9db25747af6ad9b458cc9fe68a67ff532c72354cb5a68ede47bd84ca29b11c6811a256fc981490ad257295d8bbe37877622dcc03fcfa619d5d3865c5ece45c9103d4adab8993c52df5574b2bb8d340763c871933600c0e401a623cbf75d9783b4f412761e787c5b89f18206368ca910ce89444b922e83f011c61cbb42cd67e8ae45c99073e92864e31e4f84fca49fe10bd60c1fa00e69c0aea0c8609babb101a0c8a1fdb78deb1545dad4dcaf21d3f9478c1f69d5a6ab29a96a20bece6aa57ca8cda632efdf29afeceb21dabdf436d0d74dad6173c30e09e8209fb33bece4d17ceda1d27155bebf433e6ba31fea296b37a885b17ad4f5634cf25b181a6824ce5ebddcc51858b72566165ac0e19dda8a4c52972b96b3640cbdd401036cfc9320b69477ada41c6f898ca62d712cb0b94a8ab62898ea8721de1a9e46b54b6c0093f28dfa2038b0acf8f066e60d0e10407db96a498c1c7944ad87185cb4d402040e2946affabbf0e830d9ad841e5f01055e3308ac8aa61aaba404e820a8e59d57e664c3a43217ea21861c01fea207933a2577919f369df16baabe8d9f65d41d3766537c9f308af4b210338d7504c815a6531bd69f0531da32e87aed2e6c584e920424b77783eb4135a895775f627b4e23615b73b3b464512d8345d3590d883f123f3ad639f6d875f6f6a46b652e8ff91f7d5604b9013038baf29a722f6881b372d5b4da566bf759d44429b6abbe426c635662b2f9a6e7d35980efa29a611f38b36aad820a6ad0443228d26e91d9e1da2f391d1ac2e99b0516197dfec25fdd7c047b68cec413ae5cf7b11e1cc3f685a821557838b4fdf25aa7888c7c8b6c7aa813cbebcaa1b6952660ec7a041f36e80ab48980186ed02d2a48afb5dfc874bae36cfe8658727161fc6daa4856372b1135aa165227973688102ea80b93475472572ff42a6fd842cc3434985f0a974a31aa007441013de6f3448500d1ce9a67080ad42ab96c8e2b1ba3ea4b3a1d5a2741d61d15967439e3d1acd6259788c4c0fc3b63f34ed6d567987cd5aaa2bc1a6447eff448c77b9b75c9f6362f08113b8abe3f91f71edaeeb655da7a09c5e1bbd8eadbef836acb6adf3b0fe9ba2a66250abfeaaf024a5401eac87a1fcc208889fada33330e7964805108ea70be21337ad4587952326cecd957c8d7f1f99e6e69da8746e94bc6045d569aa3bb45f0b84ee484f808e5f5cff1709c272a548aab92ebc9eeb78ba0b", "", 0, 1675862421, "d27aca17a69d6be958e9240a988ef3e22e22d52de8211de7ac7d00a1833bf51c"], + ["030000807082c40303c65559687f938e97b303f8741f3dca85ad68ba0c3a453b31daee51d41b40a71501000000086a635163536a0000ffffffff9c3c1086a3a8e9ceab240a31de303c014ac66db8d2ee219226b26b672450e00701000000040051ac526ea9ab0b0da9e6b379e189e053853c72bd8d051b791096fb43d8560a7d098325f9a0b5dd00000000036551ac604532530155fa4202000000000565ac6a00517dd5a8180000000003a4f180000000000000000000000000007e17976359fea036ccc648a276d65f21df0e7bb7142687363b239c42b5d8f95ea43f8c78964bd10920fc296a62cf256857a0a7297b11ba4f9cea85002d527bb56f1a46a6204972b5baa54289dc0bf38abcf76704b51858b17b64907a1c82975500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b45fe3a8445760e8686e03598b847b794ad711d526bd83a1aa814551ca97feea132b09c3522523dc7ee17141d6ed58fa4470fa4cd6117d0a70870659f8274d8717b3155eeae303eb6b959fa6c0daaf1293f272e78bb7b42f0b3bd6a6cacda45472339f1227dbc1d84cf2017538c2ba22c55485e3977f8238078fb37737e19107032eeb2da463a4f3bfc922fdc6b38bc51346f00e7785cf5137c19513389f670b81032a08fb7e4390d7532259ee8e70c1839babacc88bb9dda4cf5b87608bf44be9fc0b02cb2df685d276ca38ec9fa7ef6ed87b886b9010554774daa8983c9499fffc507c725d1c4acc5c631c548dc381a586661bdda0a5de0fb87c54a1f3e68c94145e0302163e051a487e24ccbbdb28e60ee93e8c9ed89d3e69a7f6595342fbd1b1f9ac030fb5abaf7c0731ee8fbc15d3492c2c0e509fba29aefd4959b3189a325a82c6900201189a1011c501a3f413c95738fff43f417f0599050c9ae3ae2ea36ab2774f7f020190b4116e9f8a0a705cd94a15791aadddaf075aa71b3edb0f6b953cffbf5fc9030e18234bc92b6476a0f7eb0dee825f2592f964b2286cd581938306807b39f2a649f69b63d2c79549aef478ebf94541d07f1923b7d49b8e5d34658fe03690e08bb98370e5eb5c4b4f5b56b5d16a2c4106e65d0c43b00c3d73239f01cff306d189b2195393cf69ce08a04fa4190d54b9cea5e627c5e6a20ef84e938fdc2524bebc80e2d84250bfec2809c53751df15448de196ced0e6e1b18cdc5dc12109feaa64a89293aec39424886759f37952cd0a31f85f0ad37102bc93e72130be06312b56823e4e3b9135c09fd3e7a339385daae4496c43414f44519c13f3fa9297072646b2afa6bde6620646a03cb874cb6cd14337f437339bf3edd2b4e6c754abf096185deebb33d8597f2ee844a7acbc72b34e8a0061dbfe47051609d0b87491236e98e21a88f713cfd64fff6bafca25342bbd9ed1d5d793a100a6aa43d8b313038a940c31394ad05457baa96b6cbd44bd8472ed10c0f4e75a4c4eb4c60d6893aa9caf93880b8b12a790b8fc43cb8cefcaaa0635a86288f2d2caedc83da6aab6b36a6f5e42cfdc604ad0282f8a003d1f22557bd2791969db1a7ac2434f553c695aadf63ad9d16f274bc8ffae4cea286b8152a0b87a074e411e429790a6a5017db39b64aef9d19bc59bb3fea7b369ad31e2a9f8c59835cbd339dbca4abefef525375c7642c5a08a28d0335b834a66dae55151f09be26cab123737e739c58c91d0ae5521e23f6e74be62f0de1da66c912de083cd4e2099ae814e1898ca413a042aea9fec396551403fba8cbebe7c95b6ae3e9d86a9a96163f3d607a970a2b63bf5c56fa3f460edba4cd7bf76a6c753b0576b3bb532b9503e75f0bdd3edd99a6034c59c4d3be14aca2658d8c16c1b86d720217d953c92b64e95976c216692fc0dd32370f76d278f9216246bec0047c244e0fd03d56ee8d7b9b2c7bb4bdb90db429e9c4fa4c34a02ed2987bb236b89a83ad61b27ddfa580476403bf91513ecc415271130a96e40d816b154db8a09473248cd5279bee05c23b1f371a97b7e5b95cd4fba0029c623190aaaf5a6e16e01abd6543970e867d8dbd8b4ac08e14e4009b4e18699c1d56cd9b54160602da21770d367e0506b5517c65bba3398d7fd6a75fa7c47a07551a41189eaad8ff9e59f61687e7a2b0e1cf32dbda15049ad1538981d53346c6fabe3126f4118751bc633dc7d4a51def3753406ebeca0d2103bcba7010f691a9bf251541d59de7c849c89faa176eed709a78770fdccde3ddaec7df824d73abc2ca69fddaf6b2052aadf257e1e09f011b52a79d2a5d83a449ec8a1ca2d6f9a746f4ebe4ff5e1257e16da85616222b8af4d32e2acb76958f77cb574455067359de97a6caff314c35b44d1844de36e1f18c93cbc59a9820f2bd06dc349ec5758718083272b1a737f4fc2445a837f4c30ca67ad201a449208f47cbcd0b33789bc8bc6171d19e6e41d4d190c15fd90fbe85bd8b9c254f6344597d6b256062cfdc37f84326df72c17ade4868cc068e6503b1677c39f46b403cfea78cd4bbcf08005cf685ce69e05869d271a38991883f983ca2a4cd78fcfa227a18378f3fa3dc8e25eb32a0fac4be044919bd76c04db4fd6610ac208b45453c21e337cc609c466a150fa458b5dae5fafb4120dd0497e9aff92c1b7994b96e8235d996d2bc6b13c51fa338685b508c4d5d49661c78d87d3d0cee39bf45440cada9111aba9a9d58a17e9c98e36c29a4c48e9885d2823fdb4abea520d160000000000000000d68b3e030000000051bb287a40fdb056428a51b7fbf3bc80e7dc0527880570eec7c6a41eabfe89b6938af90cbeac53b843e1ae2277a701aa3d10a1d8086b785df1258863958a4de1f8d00fe6dc211b54a13dad1664724935de1c55757efeb0f526910d808053cfe500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fca8e32334cafff4622613f53048181e752dc776df2bdc88b32e33ba526f373383f3ff21c4a91f8e2eef190f6953e184e89d4e82da89416a26620f568fc9d37fa9a7f0f3aa722bb0da6a06e299062b9ea4606e56827e4f865833ca7a923ac8bf19ea1a9963fde4af73ed592afa5111230a83fa855ff33506a883855d9cfefe1903052d52cd6816c580ebdbc7a0959bebfa509c5341d768bad0c0632ac4a09a4470022e71129216728e4640577bd0202bc2dc2902385ab3ffe08d9484e4a7577204b80b03c86a40e3a3737ff779e3d8e4d0819857728f3ae712ce5f9a161baaa69b542951dbe3fbe0a9f9217d74cd20a6b2107ccd73bf7f2daad4ec9c6efbac2069563a031ff3a3652a2aa6752f1a75671e2bc5316cba582993e8f0361034fd79121140e6020e458b025b1ffe71fb36c07ef56806bbd2e41d794e2a23d7a6b580931d97992603090253b18d10d9ead023a5a35434e579151495c0940d52312e084a119192fd5e0210b459270e86c333bd428ab82e5e0a77eca3a114af7327e94fbd7fbd81ef9bc70323c3754e9f92d533f3856eb19917d3bb537cde000862343ddb34e7f026cb99d106f6f064304bfc169f0a5b83ecbdb2a1dcd9c9dc08b2b56cfaa09c91ea6bde89d401401120fb88ad88d73fb3445df59335ababfa991a9178b83d5a2e1c8db1d1dc7d2736f97c806f970c3c9f7e11d484c1f9bef8dc59a3fb12c336219a2dfcaf4a2105eb6373aa50dda6ae57edcca3a548ad06bb29d507ce0d69d2f4359957bb219b1d5136caf23aca9f20d6df2f0e0d781db86876cfc589a28e4512156d7a4a6856ee1a8ce20f1162113d3b79ee4fd1b2e30f520bfaee1e89c83216047fd20e610638aaeaf58ccda45b33fa34a20588eb485a0228bf2f2172ed0435fc7e01cf55d53e5388506b06226f223f9072d8e9239f48a68c51aaaf7a48988ce6c9d131104cdda7a4d513a34ddb842abb08674a6c7f00c842941ae557ffdef13029282342afb9a70808ec9c7ce4cc726e3ecdeb6da0848cf4cbbe599d59c4b1c06fcf15672dc8204b9e122efb7849a3f0bdf6ae445bcc450a9df2f33b265e4d661ba00c20b3e8a32b06072b5705affeaeec736264140f2f3f281d14bd7fda2ef423e234ce3e7a3510cbc56e8ce42c2be41c6c55df69ae9ddc36de217595380c1a0c351091dfe2dc37f3f7bc44d5e328a6119474e99857d23dd519e7cc6b99beb25bbb18c310dda614d7603af33d1709145274b887bb9f615a0df33bc74137b9ddb7fd0b4da180c7b2436e6e3e9d69eed7fd99a468b68f0586f9fc90f1653599628c1497d2c69dcdb56ca25d402fa30f4652c1d3cb055db37aef5f4372cdef096cb9f2bfd0e7d7e64e6cf66eb6d982ce25e206f810bfc55b03ba9d5441284eff4dfdabf506b6fb44a98e0cf8802b262e4607d7141ed707a3f6c43938edabaaf3cca9b003a5f5ed43b7e58360f4358450275404565668b945d189c36af7bff947d9ee890027dc66728612cf76ce0763024b69236f4620cbb2d14e31bc6c5ed88ec47e0d59fa31e7a2a44653af9553a264716a804866e883a93e146bededc83daba4414ca31399b68100a9593e24a553c41236bb07ef917fdbcf6fac7bdff736b336cd16a468cdbd1edc50dd98a024541b6b93a37e7861eceea667d3efd5536bbd44221e0202c2b62af75dc573896ade5bab2f48c2140ebb75cebdcbe92164784c0f40e1b01de7757b026fba996617401ed5b5f393570633e135d47227874de3af20059cad069ac8e65a7c9b7050e89df8aac0d71c2a967789ef1dd18532be17e55077d35e48c47fb8877977eb4db90504d5eccdf3ac0b3cf3e2af095d24c6fe917e1472a2ff8b15c38f0da0f56899139a8a02dcb537152192a9314d8880af35d40068bf8e16a1e14e314933d13009c513c8c55c4fbc349e006559a8b06b600b8c11395857cf0ba899c9dc71e2a125710e03268a051f715d69bcb1345838b710e620c31a7431e3888936094dcbff3900b05c83834ec6f107d59497c9459a9e4c0d4afa24b4726939949e6d838e19829da4182c9de09cfae809d4b1ee34545244dca9169d789680cb0bbdd37823cefb824973126239dbe4d0b97be2fe3fc159a02eaf6629b7076d77af85763f9d3e5b67282dffa4e05c12e8af49c1bc971fc15a82cac2689ef2eccd18fdb0e7e85a08dae6aad5dd565bca5d1e0d7d564cce84c18d88f8c834c64a006078640dcd96ed8d18c6e1f0143424501e4f2b6269ce22254bbb52d194f9fc78cf1d00095a6ac8d021feae36f06d392c9d330100000000000000000000000003376a63c9d441c8cfbdb7a00b2eee326dc1ef9c4167506f4b65e5fd85fa3a6e3ade1badb21d6932653eec6ec22f61db62c762c294eb3e9905f8cd08d4914d32224bdeeaae0e64a529e99c926a4e1fbab285cfa73d0c27fc8cbed46f521c4f4300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000706b62c6268ab69c11a62931b9e5ee0990bc06d904b0278d56f3c1f1b8885b278ce4ef5235d711bb3b57614a4a5d0c45b99f3f7af7cff34da5bfd323ca7c32d72910616e7bcbe242a96ec388d0ff097ac7417e55a37e54dc8a86fbe555fa91b0167ba2365c1bfbdbeae2ac4eb2a252fee90d5e90a4a8ff5936ad638dfe41017403072aad78abc13ad91270b0bd0a688f2af8cb7cccb4e425f8099e1db0af64a03903213068c4eae8e1a947915fc4595392fe25e3e418a4f420d056e37b19f5536df70b076558e3a204bb2fe9a32046c9534da33ef7c2476f0210350786f4b5fb40b2f648c2994819f704782475dddd74ea7583fe05cc94e9cd020fe09ab716ae938f0d022d120898663842b34205e90940aca5594984490b9bd88f740ac50c1536d29b4c031abba7cb8adf6b710a9ef86350b73324df18c3827ab1f491d7d19cf545d9faa9020afa20319463ffe2ee7b91e11c6e36ab140a11d8e7cf600378b444d819af1fbd031755ed7d5ee5daf1d236910849e2f861ca95237a52ee0f53c748d36c815cf20e0305e3f3fc3f9938f3f2f0c1dcafb90afb63e869f619645a6f3cd4a9f200f17166549ba3ff2782af2c647ef2fa60c44d76c407519b91f6cb457966398f2edb87671bb9cf33965b8892c766560a18720aa367ba8b30f778f97e29019a86ddabaf689db137a50f06d229f745dd9dee7e466b73e5b03dd9ac774f23ab61ca811b3213af56ff5e85b176e8f2a648ce904520bd58d1422447c0f2c84fc71d53a2fed3761101a5c802e80b8a99b9452898e2f35f9d0d800a574ad7c1a7212785d1f1c34ee2d605364475d7785a8541c055ccd60af9a6503d5f7ec53aa951cf04d45532908d73b8f839e55cef581596f1caee67413afe018f50b217aed743d42a690978ccccb98726afa6d1fe75f1e8a6df27ca936872162081818f655fb1dc2bce16dccea86e29ff9023590ba0c07077879d98de53d5008f81338f3e58eb6bd0388b5e26a1b8061a9efae74471ac8ea0f7b0b7fa9c94f045a30652a80476fd08114c58f1932c1f7faad54f933b93ea23843c2c87beade7f2d1b1ad98000d1e54bd0212a610742b0b3af568807e81c5f3296188ccfc4acc7bfd830721ed82b7167e9e666f43a78b0048f8da7e0bad7fc99facf244dc4f4f1e90b056fab36eea5a45a3e0206a6380086e2defe3f10c89bab4cfa43798faca9a51ff109a77d75c92502226474266d0550b2999fa5ed8f2d00c852becf060400b97236a68aabe6def2a6c2116499b1395e0a1ecaa2a19c0f586f4323459220b9f5be1deacf73c8feb105d008aa0fc06951436b01328d922f6d38d808b2948616519b8106824af7ccbe8b64bcfbab35b4242f1e32d978f7291d2ed36261c3214f7b287a0bba4ec6fe256ca6a0793f04d38292212328d0da5d45dcc4ce8fc81f8b8f129abbf6d945e5d7883a49b31d972a45ec6a6673621af51cefeafecb34fae75cd5832da547eb1680dff64cd0eb1b5e4417fb124581239a8d47f1a8694bcb11ddd9675081f801a41cd7cb8fc747278c6257fb4954b365b8b0c6aca68e307c8a6f9a09885a05b2a344954e408ffcf85bde03920a405b6308dc80e4663d1ee822d0b75dc2faa9a064c61b635a2d2015dee99e8b1a54cdd116c9d758ef8254fe8ba99755ed36d3f0858625f3908279e0b949ba9657d8970d13b197e7ee80b5c9610f4eff00459a1a85817aa86b52726f06783b266c41c32ed91235fafa7c7f593c91135973d411ecb5aa10cf8fb04b75938d38913e1d0fa8d48e06aa1dbff3096461f31386be0e621c2c41459326a305fe201bb14284b46a38f2660a5f6b0178a3d9c47ea1e3f017b4f0dd7d2fa7ec1b2f8bdbaa26180da886dc76cebf1b590c33bbdab013e671907125d30fb2b08315ab0826a0b3b694bd27db86f88a9995a352ee84777d1353d187f69f427492ec5ae857490cdd651ddfba301ff9d3b610e8c90cbca5b40c8c727d4940d284ec4ed3721978b5b6846bf6d7d88065570b74bbc49660a6e57ddc1fdd7635b4904e768b86efdaa4f31b542eb7db3bb3cf0a03ecc9d6119d335277bdcf83f4a13eab5492c3ebc50a85e3d76e3ca7365903ad0f906120515dcba8e29fcc095b4f8ba3c1898e6ae46c6c5fc60f417f12296a9bcef5b65f2dbd75ed3941cadb21d93b131511200d64632189f30619a068b76190ae4118ff91800fdb39ce51dcf23605e3155c0e4cd8f35ac9eb66fd3943c00218a02c54acc28e052a5234afce534b745989c64c164988ecb3d42391954fc46c4398fb0090a76b52c7c1402a0d272c54ad18a81eff45e7c5741600be042b69efa6774e000c034a195813c1f641ac37e0e29b5c01bdb25541e9f2946c671c1f4b611abb61545d327d0806cd45bc50e1d1c79c8611c9844e5e1f01ec39daf5f3554100f", "52ac516a51525263", 1, -47445915, "f79e2a7a2275be70b1dfa572010be7e10c769815d870ebffe4ae3055bb046044"], + ["030000807082c40302e72828d38ffd1b546e63ecbcdece672b2a2a220e5fe0996cfbf55d0682513d350000000009ac6565516563ac6363ffffffffdd2ca0dc8a1ba5404d837605fb6b517740341570078d5f001a64c126df564a1b00000000056563006563ffffffff01a9de8702000000000563516a63510000000009a28de401afd18c000000000000000000000000008407b07dd4c5fb99c9a8acdf1133e7d30900074186665acb5ee595e1cd7fe5453f2335bcedcebb8c1a29a4d75ba33ac8eb1a0bf8df40389f56fb7d9a70a21b524c05b3574f1f1f4c18611e86293b8c657b7fdeb4f8388bbdca1648da216c046200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a820f9e4918f45556d0b3150b0769b013cecae7451c92d16c07f01ab44962b1da101870777b4d7933005846d7ade3f583202ec02a8e3fc3acb55617a0aeedda3f5d289df3104f25f0448e10323acc2d5856f5e663881476c20c163118b4981178a664c9a4b6af82c48717daddbf387ac2e0a89251d58a01e74b6ebdaea88c6050206384181d18431f44345390e9e073d0d348118438b8b09f9d1ba50e2329326430228eca69f2a985585dfad44ff6fea365bce7252d5f8db68bf057395a60791ea3f0a0538c11ca9c7837385be8cdd5174401fe849b51386cce4dc210ffc464a2e6cfbbbb7ed8cff541dd943d2b772d512489d7836b687f2ceef2952289b77b193038f030a81c87c4391f79421ba10a6862aee87c043c5394aaeab59eedd26949b61678e0309851eb9959317cd8ed2aa5f5dca7d8fad0d8d4837a2f25e9d71ec92d06e506a021a39a9300d571feca28328911b9beaae33eaa24c1e734068441dad149e4110770204a1e517f00d600c91ba8fced9ba59035e7f0cd574512d68100b072890017117022590fa4ed2ca8344f8e06dfb9f6c6958dd59144239795519f2cb2f5f9d002b9b20ea491d57f507f7841e09a616d2f99de9c9b96b94f02c06b61c87997f9e7eed7dd773fac6fb1a7a7dbfc45fb89c06481e885577b73c4d33af643d674b9207df714a156c90f045033dbc9a412c83075d7492007a23a3355428614d968163ebd0a54926c8f7391b7d8ea79022df0cf7b88c936a1c3eb30ec0c12849e87e52391a027cb0f459236ff3a1cb0f361eaff6b4508fde925f20ec426142ab8f70ebf9c72bb6af1f28b7d02bf55e8ca5c27cd3e602d4f663d29052292605ce7250cea144a23064f233bcdd76a3162d1bd2c46aa213a0f7f00ff1c2d3e4ab0c184457de268dbe16ce0fa8147417da6713611d99e5ddc985cbfb2ee3bece4c8b7a72383a1204d794afc4caf9ac63c9d9ed148af6101f082faa2e0b8b20a6b7db85be878806927dff01ea617e965c02324495fc20caee14b0d568b9b4a510ddb447d8a22aa282377d2d262f3ff1ce1e91bf0f6e9451aed0ab7ca812491b6e2642b1beccbe17ac3cb672e665f27a8565dcf3d1d41c691ddba7d1d31be76935fd771a6ca8d35c6a2e1005fc9aaa0b34e150b1e33c017a50de54f27800ba5d2a35f019b7b1cdd172708a92799ed541332a3771cab6c41331ba7bfee113ab4b0e4541ff8d4595b9272a253a39b8d1c76fbced3c04eb6f8be2f2899b014d0572ca174dcf5ef0b499aeee9e5ef21cb0c00bab14a081193a93b52537f3241d04a50e3874c958b6099591dafed640c11d76e2436b8fb8ea3ddde53a114eeb8c5a58e97476ea664c41b2747405b24c1a2ab7ef6f4422f6cf315d6ae96ab2bad502c1013f30ce262ceccd0dc3bb070b546829459449b0e3a7e0dd498aae2815f12a9f1ebcb1123e0de5dd0fdc789a8cb4c30010950d49fd2522251a07eb705cbaac86712381b928698571227dbec865dafa77ac84a9b6d517faa0dff4dd5ba7fe06b2abff281179dba64a38f53f1d0205c7387fcdbbcf652a7aeed3e1dc659e09426433fd0a943ef3ffd51ca82eb1bb92e7c46a659504399a0516540e58ad2d4f069d9cb0d5778de17eb743a635cce51bc5405beb95df6254eef128b0ca00839f19d9acbddfaa593e6c3ad151cccdf84918d8140cf81ba19d8b430c94478e1154d5e4cf9bb7e7e71a4c7ad802655af8fbfd0da2a5fca4a63875f7ff0d8bfd2f9aba0b0d452e21164d0d5521453b8d782910f91f15c858d3c96292c740f9d8c5c0d978574b5451b78e16f607c8fc9a90334a4eaa8de5798a74280ce4989049c2176dfa78226ebc21d0ead06a13c11c1b1d11e9f4abe5b8ad7e40e4ffb803383a03bff0cf6113dd1befd52e8ffdd57f72a9520c8de6bc129207cf3c5a3a125c906ad24b149969c231a20c1b9d403f2f5d39bcf5167a249612fee01435ccdbe756207218dfd1e9bc7337a77dcd9ab1bc8f383d340892114c3c64edf3146fb5446467f95363ca2eb8f17dbd54b17363364b9164aae17def8d72eb207088ef3c465b0c22fcfaf9548f1847d683f469b5583da335992564a99d09c5a88fb4b89892fd6e56e4d6d30a2c4947fa6c04bb8de0f56bf335052f7e1026d2bdbef56ec608b8aa20ff6ea157f321a8692278d38a46872e40fc4969f8307c361eaa5394f3a69a8e96ec0a11768ef903858e6042f97309c9c1a49a82f5c01ae5e485d48af8ee94b8e11cab9e3c1da64796ac07436bd13123d63ed43f60740ddb8dc9a4bbff72bd8d2fcc5d9089142864ce15c40558ee950660046e5802319dea7ed940854184307d460c18ddbb599130248c7358c6b31ea4f3e6d68467c022c31f04ff549639f6096c68e0f1ec00499910503a17d13fcd2685cd1940b5cc453e8f2d9003", "516363ac0000656a", 0, 944003208, "d6787e547912c8a2493890c0562069b86b58a577ae5905e4b5e387efed1571e8"], + ["b6a09b5001284972a8d31ab5e901224afc7159d62deb927579af78be5ac223d513690a24aa010000000600ac536aac53ffffffff0191880a040000000000b9f3df2903ae261e03000000000000000000000000147f2f99284eed0b971b1109339c79e4b06a1854b36d85de490dd6cdbdc064d244cb6b3878d820eac5894b40dc4a9743ee9eedce47aa9b963b88a36b73d44f86ce78ae914abc37c8d6d6877e29dfa81b1ae719c03b43d486800567984bdc0ed800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000966c9be848099d874f9e7fd8ff5b81cb240cb69ab96e02846bdf612e30ef6b55e64585435637c9fd04c13dcadbb6fd42941441e2822593c4ec77e1856a0cb08cfd536d96db76205e1fc7ab7881311a88e7817ea52488a5b12e717bcf0bb0438c358220f9c07329713a31d389fe56ad0ce987e49cd61da0cdeca19213446f37c30205bfba4b8cd2b259be4536560aaddd9e4d1129e441a057f7028e49ee7420f2be032c8bb61dfb38dcb50206075362714c609c52664f6140e48670a0b1f93b2dc83c0a068650815d62b97ef3d61eecb3a26ac7efa60c362a58b19c9008130c371fc9c8a58d2e8674590ff1a977a91e2c363b8075ceb5ca4c0508bfe30f9b3123385fd7020cf6bdd2115904837820e543b2f07539d0784bf4f4e28e72ccdb1b2620653b7e021352c94f9d0c47a27fb55867fa5065da9940cb2928747af8b1e8823d9564e8af022545300ae87da1f4f786219fe4d4537ba7a09cc28b20f6eb68867641a36a2d85031391d46dbc1712c1ce460657408b037047ac67d01e1855a2702f7630dd01e5c3031819e11f283c4cda6b7c3ecd80598c27b63939d4307cb9d01b92197f6c5790767d5d88140ec4583155854bbe689c160a4b2efe5f1f24ae6066b7b67f89d37d6cd422a19a39c6623fbca24ac6f09abb255e403f454cce04bf25dd818b3ebfa3689d6cb0f141e71d5efad5452f432e0f9516c67c1b625385f06b967ddb2e443585f71e8d78220c92ee6c484031992a14b61986b614e5d65e045cb556619bf63a715fef7fcf2b1b59742c5e6bfc0380dc114c6bf4718375838aec2e61aa974de532ab4ad76cbc62067c92937fb261a836b213c487c67fe5f08c5f6a268c2ada0a82359dddb1e29a636e4d82f8d7c36dcbad2adeaa2fae649dcf9b806d5329417cf63bb6f0b0600ce5b597a20c2ac2c9741c142fd90091f6da4c9efa3d644182523bc94719083c66dd96416f8d2bf73cafc0efb5fe1c0a6d5c1e04cedcc85db5fe766f44d11cd7a00ff94fe089df63fe15c2182cf7f291de1ba274bae299915506581e742c402b6691a56679ea7b5e294b0ee213fdad6b90adfe1e63c15025d57e45fec7ca271f24d9d0d12d27c50a53b682020f92a371374804fdfb1a1b39924b04104627e694e830777d637787a69896891f028a70c50ff05992038b2aab479a77014c54934638617fb1301a7ae9a03730c72bfd119feafaec6ac5bba32042d2ca664bb88c6823679c64741c318c3c6e5cc53a472913b8f947a7cbbe4932bd7a7badea587300ce6244ae963abf8a1ffd9414ffc7693dd50cfada87aac31a9d2643c2d05a4cae5dfa1231528ee0938613461161b45ac31e416e43280b1fa7f16397fd1acb5890e46c13459279c6631f9dd464b5931764d7e54d2469cf86e436fe84e2d69465b4925d36bb3841ed4867eb6744e1c30a40d5e7de0a7965821d7b55834aad9f1f27250d342c27a995d1cd6a062341e2365e08437918b9b74d7eacac71ab026238d6513510549217680fc4682e547fb06daeb5c4a2ce0939597dae96d0a213c3e0bdb10f82d6f956b50d1f03bcb332903b3dd7652f27e7203b839be9ac45890899f5c539cc7c510d56c03ac733346589f4b598ae7a7e241163f794cb66b8ca7a37ddfd1e30ec9e7c6adb2a205508314abc05cd5a5c2b8e77c046108abaf5aa1eec0ba5b3ef005053a5e1eb646b811f7d9f534b3f6d0987f9f14011205aaf16cd9baee4606b221bd8dea85f746e81c3f44ac949722bc42865515636f98081e2dc853649a13ee4926a1672ca50c2d7eadc3cd59cb1a6840cfda9e9e92befa39f30870c88fae1d117d5dd89d604ea313fd1b47aa3777e03425bfbbd14daa83c968c7f26c2b887bb2d087124c9f0cdcda4b160db8fee48bffabb22dfe750917a2338c666cba8909db3387a695b4e3c16ae366fe3a3b63d272010eebf3748779d3c32f293e3163c0dc547ef1e073da6517f3352ad5afb519d826f33401faea4780ffc630ad0e52ac203a92881080a3883c83ec744a1a059d33f98560c452820f150fd4908772a0ec7aeed181e42f61a6d1ecdbafe16cd0355c2d55f798c32a5fa5eebd65ad0be01660d59697f204bbd9f6b817f79ece3b5d6b0e38468c939edce84a257276ee873461ac4136f87771b597bdbb1a8f12718401acb06fa478470cdd591050c7504f9de0de85006b5ba0c27cdaf58a2f169c093e80be44613a18fe7c62a31caf5d14a66045d0672d07a7c006407f126efecc0f3827fcef2b4b58c02a195ae72d88384bb28a581e10e3c8c95500000000000000000ce69a50200000000fa260d7ea8d39897ddf506cd869d6a3a9b7ad3328cdb94080670aca847e6fd3ed060da028fa323ee0d78c71af127fd29f7cd6b7bb641afb15bb3966cd6103ef0b32981da49eb7b99ec2978907d0dfc08529a33b68a3d7987381a5545551252cf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006db7518c5786b12aaf89b37c76917cb4370e92b7bd6c26f274b95190adccecb2fe06b461a69e0c7e3dccecda761e1f09ce7d28c63c47b5d9ff82406692da0b4a031760a5e910c5b74980b0b9163137c440eed796aa0dbbd3caeb647d2ffa0aebb7142f77cb8ed16af3349d2d8f3942a6d9ce4e0b3c0eea80ccbe5d0cabf0d3980215743e5990be33252f4295f1db8ab28ad3d1d7f1932a221c68ca7dafd418b08e0225d89d798d269e72a7ab35e84541a8552520d4c9e01da4759f858fa88cec16940a0781ffb6d938c22715cf71bde119a3125f457d3684c1a72c8aba12060a54035674120d1622e7f06863557e391e192241fa5ec4da775cf90514ea013e678fe79c02112f0067f4fdf0feac3da4ffa502dc4742da0e983bc2f34afc8dc1c2e3fb52b00310b23fcada301b1cfc1182d1545c0eaceb2b560b579cac2ce2418bcbdfc11e40022c908c2c1c61c1f2e08f67e116ad08bf3fd3f5b68a2ff410abc18064d237d6fc02127bf1d627282d82cfd04926441e5feab1f355b62b9bf7ec1a7cc5c9929eba6c03149bfc3d5a76d6ec76db503f3dbeb3d3735c0a215143ed50a0fe2023599c57d840541310fa892c77d7009b1f96c87052e367760f047bc1ead334f0ca8b84b701e5c1d8771517da834eba6877c011c7f692f90dc136850c51122fc4d706fa076fb804589ec59c8196c9b9eab647b877ecedd37ad0c96835aa3a2158c4bb5e590d30d60ec4782aef823296412c4545c34d0fcb7e40330e06f0c32b75c56ff76f215f8fd7e4bf322c6eb29879f8989f719bdc2e7de21f3464ac4824ecab85fc83a7689b19cc6936912351f678e2f7fe3da2ff67833b8f2d43d4ce0866fdd0fbda309cce070d818bf7a233b79fad1d77e545abd53f1bad561aa145da5c5aa62d99c964ce4dae9f01bbdc914e96cc478cc3cdaed672455a2add47b359ae0551e5510184a27516cef442077fb53b4889d46e76e8598dde04f9e7b27d01dd4b74869f801e093ddaae49e04e3cac8c072655f67ff811639e4714cfe685968b922d701361af515c5030a38e63d753a89790d4b9d8302a2e79dbef4c83b3e8cf53678997ee911ddca8f0dc103fedeba4962a06a3b6580ee6acdd2ed3d81889d184d31e9abe4a2405c10b94f843b738dd64774c2e9bdb1443df5b99cf94fa5d493e4f4052af7f30eb633e2f184d80dece9d1cd4908a063e61c26cbc87f7aa2157ed90ece1e844e4576a1c521f8258a5990ce7ff2ecdb91148a5aee7df70e934bf4a801335e53c5080f25c198d23f39d771fe9621009d57373e8d3fad718954faf27595429ece7a8288a2679e8f902ec179fedd8144ecce8881dcaae57021dd0db23fa83095b3ac70d9a9d68c3e8faac335cf3867f8cc59690a057fe2938f122d87a0d8d8f41ad5365cecdad47fd4c7cffaa40e0484ed3f60e1fc9c4837dd3136629790835f2a9d39e9e0229c1a952b1944621176fb91dcc77a93db78f6aba860117b01a9ad2ccf474ddad445793186dab24e8d6511de098aeda7c70b72190958e85b02d34b772b37b0e2c14da9e0e59c7262c57ac295d0bb94815d19822ab4b150763958a0a15d25dbfb01622dbb8826df40f9de3b522afbb681485ea3cd84d298cda8eb02292828850d1a7fa1be602f79e9c3aa5263fd6e221df6502f55b4c8625b58e2a916ef82725f8332f8517733185d79201d8d803b90ed44852c00ca3c03eeb7f3bad12a3df6922703bf16b0d901252a16040e94ecde1f933841d2dd2de48d479e09912f58f14cdc0959623e6f708cef03e53d1766eb3cf09586f4df0639b3126f44589d1ee42a6912d8c93ce90e6b484a51b924a0e2d001b159bb373c73b93761841712a92da5bd8155c385695e4b6e520ab5ce4808cb68bef49a43646700c2be9928ed62c6eb22db6909b3dab1c2d92b7f4223ec25ff3f0959de83c4e177b04a80d824e036b6818cae74848f200b3be37e00927db5da624f33bd3d8332e647467035693bdb2e2177d3932ce2d907684740c929f559a81b890624bcb82474c4d4a4dbcf69c81882c1de9a7cd470a021244a7151b8e30ffe14b2e4c405e595f9f9346d927ace8d29e57df8a6310e1b4e1912617cfce8d898d5fa5f0230555781d0a49e6960bf3d0c933d980998e8077ce4a40a37012c16252dca4b702b917bf0826a2cf507c5ac2ce3ff24ef4a518361dfc9210de43393546bf331fcbd22c14a469a49b98e7d19daa4bc368bcf2278350c9e3023df4a4114694f1f596b60341e406a40d117051d3e14d87435b116e0f2996ac92ccc46245030000000000000000000000009f75e8a3fa50e075bed5b53e37c4adaaf3a58326dcbb27dcbad3c1ac167d9d807a303b9281cab7f7a91c39b2522897f8d5246707aa4379ca0e896c3368d0c15b63c590e5b3be50789779fa8098738bd8985cbd904edf69cd6ec79c2986600e35000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ebb57ee7ae82a6ee7c58d506c787053e700b576ef4649e5b3ff9f05b301760122074c690043fbf362f52ea77a48a6920ae88183efa5256cdb6b3bd57ca13bcfed8264b648e96ac2fef010a1177d1abbfbc4505a35cbb339bda1e6aa5f6f985aa8a4608477d8255e1abc85d7f3f5951f967e72da78c08a7b89570fb760b53b01021c7b3c71b9dbaaec5c4957e06e34b4c3560e6686d6b56c06ba01bd65fa1e6357031d6659d954a45c40f36f256485757b0bd382137673922666b0fdf956f0f3bb3d0a07b61691d5986471874f8c7d3fd63489a8d817f2effc4ab2d76eeb603968df568d0d25d99920f8be2aa760d73e60de2c7e525eb2f94f7428bb594cf903b857950304a755716c2a336cd9a35929fc5d1b01a1824eb3c5dd204a9ef5209a461e125702050ea69f79b235545b2df874b705423ab14e14afe6dbf4c280467d2233d83f9d03044f99cc89474c3c715133fa79c35ba8a5d336caf96223cfab1a973dd4912698022a09406157f545830af37132a46620a99d90da79acf1035dd97cb3447bc40c4802201f0b46d5684804d79b2a8e38115d4a0ab1ebef1873f8c1f37288421e8a0adbe3364e07e1cc97f9d5e962ac17c7ef178fd7a2aba46006f014c6b876102ef356904b2413a66ddc63ad8994964b7408fcbd1673b237cf3b1876e13aa2a59971a226b85bb6d543159974cc590f5f90ca767fa4cafaf36613f0aea4e670e9baf165557188528010ccc05ea94570ee9bec2214991835923f7080ac66a0fbf78cf775f948803eb509b294df5926867756a6d67cc6fffcc975537ed48cc769f3e2f05d1e7cd17c19538bd2ae583979b08c14202ba52087baf384194eea4df83ee922e2d5ecec2c8f547499e589be6e49ac986d664564d928db40ddd012be33c92fa2d17ae2708c9d815adc0ef64fc9badf44c1c4eded95d1e75f01a9e1d6455c83ad3947cc168ce2b8bfd1c4a5484fc843a4d744ccb78510489449f4cf3f40e8b523094e895a4e82953a9137c23ba009248f8d52df28cfe259e018f6e8099f6461356424123a59c680d56fed4525bb4166003fcd9b44815aa4e126858e392baf5bb511948634cce0b0861d0d2902fe08d9a3c8030d041512e4223cb5100066fba2156e20b619e07eaa29909fc8fce82bbd0079ad7eb4d61d09ac9c00364c99d679076633e870d06a48937704f361d0a0c0474d32a7cdedd49fa54cdf46ba89f331408461c61345c915eede4f7e02fe1120405f5f5bd2dc6a88a64b31c017c9209f7d16be8d04dd5c447f6e9f593ca9c8d1758f0709c2a246687d90a87c6801c7ac90a8c0bf4c16096aaea7c488eda812251ef2798540c8c10d1afdc2783cdcc14f94c748e3c4973169a705ad945a05ee16f29c9bc07de95fc9843ad92d65f8062a86b84b50f8e67bc30fe219766626bb51dc30f6a37273a96b56b2ac637666da6629a60536841e0833adcc06587321b1572ecbdbc3c5fde3b081873ea2b5103c8ff96d280acf07c0039e72f40a104065cd7b2d45830f78313300500455d4d9427b60fe79c39fd31b148d8e20e7b47fead4c766cb6645683707eb9377e50c86a524658c6eaae446f549d31621cdf09942042e89ad5df3d79d5b5c9e4bc02430bc4ffa856fd77644e51fc89153459e346e64c1a708ff5f72889e10c67d37e6933fc4ce447d13fa87e79b470f445e180ac11351233d9034baa9bdcaa1f20413d5e2f070f977a727d6aa56dae09466349d5cdc6486920538b97d8b4062842429cb33a812bc19f01efa1bbf8579f9df7dda040f52a1068f8a99ca778c9d34ecb252412815a6e8f1f45ac6d6443964fe00b2ba209f3890fc7dc731503326dadfe462281f435834451ada28b418804a296927a19f207af529306c045d3a14584b4ac82df15f69da352ba935fb9ee0fe44d47517cb1c2d0c8bb2052053c67c98a223c74c09957803913187e4e5227079c16b77c79952cf6a34e739860f82a2426513636bf9916f79366a4b86310a357e881a45c1a56483b58fbe35dda5103b4847e331915773abdc65660ba4fff55b230ded76cc2bc8e4e18f01cfc64f4bd143899204c7436ff147c5556370f57bc6048d74596f03313380978e7dd39bad641ab2138bda46d76623bf5dce603aaeef4e0d9e7da54ce2ea898b8f2a8ccca4c718c7384d4aea6a8d807a3f83e4da2fa6dce3b108af3f5648a5e78fcc27e1cc7aad82774077502500a8f2dcdfe0378daf6c6b9c46f5683fd2cb40812e2a53a53497a4803dcb2d190618fb1ac4680c8cd4623683696938699391bcc391fafb70a4647654036279d039c9eeef92e08dfbec80b98375c6dd0c5848074183839c3d4f870320833b7fa2a48675a30e49ab9b4f01c24887d1409da0054f10b8cce729a9b2d03df28496efbb5a5028f6802a698fdc705b89becb01479506", "515352ac", 0, -539634820, "f4f36e67218c2205b615f456ae0f5b6f9165dc19dfc5cb9e74576c7583e2f870"], + ["d26d4c6e01e69b6f3df922e9204e7f38339475279489b0a11776f9d21e04bf58d1f4dee809030000000465ac6500ffffffff022d7ae90100000000020063ce628d040000000004656a6353c20edbc400", "ac636553", 0, -697333523, "23b673207636ad58630d63f088e6882bc935bb28e71e1de01cb6f6e879ec339e"], + ["a4e0fb7403b92b81dc46ec5f72d65b9b31dbce391bc3da460d34cd81e1b43b41634d4827d40200000003ac5152e55b199d6b1c3967faa66e8475fd5726ba59057c76fb51b6bb42a6d8a386e6c325ea798f000000000265659221addc3606f8edade5e981b720ae51ca05d462c474021bdc8cfb2b358bf7b02b84339f030000000753535263acac51ffffffff02582d660000000000076a526a0065ac006691d50400000000066a63006363ac19102f2f010000000000000000e2c83f0400000000875259e7290289abd85287450b0d336a815b5da8ff5e3b870134e91c8f1708ba398a70883fa18eb28989739935d6077cc9e8421123341cfb61ec7a5987ff340ee27a8ec0c0a43f56d3fe45c42830045151aad7a6c9668353fefff3af93598b6d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017b0d6e500122357535bb20caeea69b5fd81114cdc619bd9a63460877882e9ef8a239c4bd677e3991df0f5ef04183210f0c462c2c87365496bb685b630f5e1b6e496e7ae61fe955472ac6a8899a5d1adac6d7e925cb3a865008ca6353fe63e36617bad90bd91a1261eeca8127c4dee834872f5c54b04871e7031504769bb55060224a631d70301be8f9ba204f08f5beed9270285de513d8e3b3d2fb2580ee90a1d03095436faafee2b7418cb464b6bd70e28718e8272d3546924f6931bb7700f1ebd0a0886cdfbecd7e9876b6cb18e44b7d465a4888069524e44c97a4c69e252d6a5d1e883bdc20474f150ab654d320bc1dc775f8f3c35019e30eb90e8feca27be8295030eb0a89e6fd5eb40c1aa2079f1a466ecbd8f08c636671297dada5529918edb2e03205e4d58dbde424242c00befc4059b71431ff9ab4f2d9f899d749c7b5059ffea0325928fcfff575e852ffef2251f6ab1cecabf7e38f9549d3a4dcb08e53e457bd702160e5a9616f011f56dfab79439a980828b2d078ddea079813cdb762de7731f3c030ea6fcb481039f4966d425025efafda2c483b169b750a2099f756aa57233f91595ebf27e75c4887319b6a9c315712e555e702d7e8a43d96bf0e1b75924757e1f7e8e2db6ebcc84a94721e2d3056538d08697a7fde55cd06613727a5737e173505221663f53689c3ced2a1615dda3fb639cea50c6f27e47016c85ab9ac7b297161ca2921ef105b86568e3d68a53c89aa49548d0f0631ee55a0e58d0615721d1e06f8cd517416d6a19061e4af79bd3d2aa6000f7a3d10b64073fc3f4bce697c934277d87e0d6f4b0310be34bc00eb88e35e4672c24d9b65b14df315f4f0b25c13790dee4f99c7b3b17e39bb4bf87ab7137fca995d316694fab7982334d7c0be3e67dd7d0fadc466b0afd0bfb667c21b3b3acff492f81d7408c7229d645708d0525cc3bd2f79f56b57e3397d2b034d9c7c3203711a1a2b9b1fb1c4d3481a73ce39265aab0f4eee157e498faf372f1a76725b16b53c7ba6b20a5df1c52c15fc2268285cdbc577a607190db5cb2a2f3c509a9049bdd3934affa81fcb673e27b623dd4c89fc26f9ecea3e5e17034258312405e0c0a3958ee8582b1878922f96a00beb49314ac962b6da22b0b6534567fa95eb182cba785e5061b335f3ac092ee273f8844b5475425c5d7262cccadb87032f9230d844d57b5cb666deb4ad2e44dc97dff7605e3400f34a1b6bd355e6c140fbad69a643fb5be58c03f534b644c29a1c881abc4d1d7f4227250720f43df12bea4f99a5f05d1341a479d3c2dd58b6d34d572a30823d92ebe2f5bed52009564a4c87be6d86c58a09209293764071ae291aa1779e784da6b01f4e7bc350b5d5ea59ea8ee19aad0fab051a5ac01f5625bad8a967b89056e535f66155d7b18a19567dfa1b3f574f0f4f59245173b38a53337bd8ff2bc48805ac6fcfe2d6a4a01c7c2401a71436381dc90b2198f1e468c57ab1cf08ebcf03d36f4bd3830fa42c4940616deca00c7452bf5f924cfc79a94845483fdb92056bce7f67c16f6b7eac9a051db7b7c077f89c1c29f6dcd75e737c499255ba1b199495b1b81221a57a1b0fa6536f157c76243c59926d76bcd7df677fc4aff510f4edcc275564d337b9f61193ce904933cb003a804dd31b0fd7ff8b8dcf9cda2b4bf31109bb4c7e6ed0f17d741b09197b70120cbc8770ef292af94b30e25dc84276f69994e098d1f81c8d08a760b3419907d26976069772fbd14edf61c99e0ef1a2e7f8231f601aba1739ca87d81c2937b3ee55952fc22a0021de9d58a8b0c515a7163907d9514e62ae76c552aa232262bab146b474042614664cba36cb62b5dd75d031bcbe9894f5720faf3b2c52eb56cb3044ae5df335a1bebd1bb9b3eaf89f0643f4aebaf15ca5169756c6267a3c464d81fa6deb172485295569ab15591e9069a2fac7975c65abb777e8846357f61791dfff54816132d8d0a96a4006883f77b1ba80b3c5ed33489dcfa97bd88c18bab352b7673e541625fb27334d9265930b084a443b5e1dabf8c25267dab74fb3b8736c6e2ca42a01de1b157b9ef986dcb53072ecfcf08136a09cc04c09681711ffe3b5e93244ee60e7ef56945efc49104cdea052e68e296cc5962bf79e48c191df036ec8e43a04f1ad1f7e56bcc47546694566f2122749cfc459d5a1d92a1d8028726fa84e208595af9557238782662aeb353692ff5a0646163d94b06012eb5fad8c09ab5f70fc0cb37a43ca5607e3b87c4c16cfb6a8db187b1ec75302fe2b3a8091777c864f96915b61d826407d0e03ad27aead7fc41147713ed84a68089a9d421c1e77f098c3cf641e542a8189d20d31f7b0a32ffe059c6e84b99705fccdf7003c0a19a43e03c7214ce6e63dd0e74e6af8885acdbf5b5f806fa7b8a4298a9370b", "5352", 2, -316574488, "dc8a4b3748bf07a6694274a638f0350d7c938ca268998e23acf556601b38de56"], + ["030000807082c40301493ec0a084efd0f30ebad1879d8767c0cdc5c00f8741f6edb25f8bac5d55d5800300000005ac5363656519b4aaf2027c6e5e05000000000252510ec62e030000000009ac63530053ac510052000000002b7869a7013b1c1204000000000000000000000000f0cc8a038ae00e0991afa699f1ae8760d0cac21681623ff1a09e2f07eafd8507ee6700c5183030cbfa823f20dfde9a4f4e00ffc5eced38453266b552dc3bb2b93e81bef7ee317a12ef3dab7007243d3e75b15c5071950e2b286621ebc2d63bc60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044b4804449efddcf341f12713060d755a0eeb20fd3f922976b1b0a9d09964c385971b348a2425620786d52982d47d300596384603d8c1dee9d8951dec3795a12f999dcf1114b60bc8058a6b8569accd0d1f77bef81fbcb1c85d3e4ba313143c21b543bc268148cfa99380e98ad90593eb781aefa41f87bf65287c38f34e464ea021ded596d65ffe8c3dbcb21c53b68746ee1946b126ff97defd39a0517142d321d0222a49563736fb6aa6e0d7244c00c10e62aafe23cccba8cf079e3ea31dc875cdd0b039331bdfab7f9940bd26181c52e1d5022603c298afa269a9b7cbe2752baac3c03d9399d959baa983b688265066629bee087f12cf1ad7b4ea4a6f66eafb45a090206c448260a391bb4220b048f2044d65ffbe255becba6dc3c70b97983d8dc855902058ad44fa1c7929f0c1ebe173f2223224d71017a81f13f43e7865b604c076be403208be4ae4c2d00aaa0643e07ffb9ee69284498d0b328e40f7fbbb97fe769ae8f032d951568c48c9fa811b988843c7738b46347d8f27e5f0d5fe1b76fd4a00f284103079005afe2c10cd92b90303f9e0f93509a4487138e22fa16bf0cdeb04d9c0f7211e51b2aa1a00292150887f61a5d0830870552794b3229c6cd6b534f996b0c64d7439948378b76cc1afbe7789668201614c35ca90f51f887fa619628e3a80eeab9a28bafca30ccb7e045373bf0826d5333e909de1d1c160c613dc592236dc03b0f159239bf71289ec7e5ab21faf668bc09a747b251c0bfb02eb69e9b9e255e08d933ad8be6507526a399902bbf4876f4b72efb43271a17e9584bc1cd12ed1a0ffaca1073447ab4be3bdb58deea7522ba449d34e2e869f88b74808de4014103231d1bed22b5f576c6d86831f972e2712af704c26eec22d7df4663d0bd9a22198486cf563032758d28de11bdcee33220212e40bd1d52bc9d0a682cc041e5bfe8b9f96c53afaeebb1887cd690707634dc65f227b0354ad994ed8a08a9d06b1903ea0048271d2e791688f47634a7c7687721e9216208d216e455d30b1409e5d3a259e81bfebc7f5055a1096a828bc4df7de8c3da980ea17bbd208ed0480347a63689ce053e285c8f15df96d39d42f2e98a969dc6a6c482694c96d4ddd90c1efd14586636220261d7256fc01cd64a077ec160c14006007eabfe69dc90157bcfb13f93b9d5d30540d25758f32e48364c7274f52aeefc125eaf064f4e07302ec6460f5cd4c04b4cc9a3d324c9f8dd2d250b5ba69c0e659fcf203cf5ddd4871b9826f3ffebaa2e5946969432f64ec0b986c058f6f09bf45fdb8d0f04f1c65b5998d861c9c2605b8427d3fd81b3bd6506dcbd620dfe2c369aebee8598bc9fc2c9074dd4e3a5966f1a4bc37d2e2d62f6db6e94a69fe852b08c03c7e18fa1da9fa701226578476a0b22933ba3d7b387c0c4bd3c8719ca239c64f0c4cebff865d2412648eef581ff9420b6c0e0a2bc1d0399b3d34fda4c9813728eb5dad64f7a37780c309199ec074ae8bcb12b18769455fa60bc09be57c202d9ad0db7b507edc73903b6490298d853b1f6102101fff4e454d67a69875ac1eaf04089f76763e8fcf8efba604e4827c2b4fb0fcaad2450f0cd52ad767767b96f83c07ac6a5f534b0812e056b9d0f5515f0f0e145269cc9c08359862046dda30466e233803d148e157c618960e42f449bff8e9caa910d9f5480bfffd1fb52273020b3f89007a4dd85fdbc647abe861addc3a2dd9bd838ccd032bb1e48d2412a8e6e7ef3a61278dde9857539ca07163a44a06041568ce434b6340bd7e3cba584dda38afc9572620585a1ca372be026403730c1bd20833d696ae316a54425eddda467968fa06e17124af49d04a6255ae401758edf566e16b1165950ec4b746a43c4c9f4e76cd6dceef15cbae3b68f0667d93bad5365c56b18caa81d51d33da533ffdf0cd4c4b6023e89984edcf0c1b64f98ee00f08be513f48a8c5dbce159364de3aad22c847fc043910e4b4d4bdf06402c43f662192a76bc63d30e9548230ec9ebbb3bd34fea60b0c89fd26205e051c4780332b22ac43e3882cfeea73beb8ceed8375f94359be4c30d8b4dd5d2a422d58995352647902fcee9402f2890ca1289effaf26d629bba2d6bb6545df3aa09d59b803a8e38159fff23b6e635b665ab4cc9b8d3ca52117e5932ed8005bced27e7ea43dc86c35d7e0b812a2e1c566bea240207de7a163f6d3b9d6a2d07927ff559ebfccedd0df1a26cbdf03ed3e96a6e746823b9ea8cb87ad1baf7f696e7dfdef335472290b59d954c4097f316d4e4bb05e60758b4049f90797fb4c7ffbbc5944450c711175d232c7bc651d69668017735f9b7e2e761813559349ab533511b78782570a17a7e851eb3961252d4357de1c27dc887ce76e36e623475662f41351a1283ab2ac6469b924d1f4d9f84d3b34b06", "515251536a", 0, 1243876810, "92cbc0b60a789d3b7b31733a2c83b2bf635ced2a4d03cc730c14714ddd98c168"], + ["6b329b4d03c964f0bd7b99513e94d4294c75ac932c6a64d567303da9d007a47c02e680a06402000000026a655aa953a0bc22e2dd6561b071cadc5868e3c37b3d3746d4ada23929bacab1d114b2cee67902000000025153ffffffff7698c832a4fc076bb62e135753e0bbed1119a399aae0213fa3102d72c6d379810200000000e51471150487686c0000000000025265e9c67501000000000853ac526551525152adb441000000000000b0cf4901000000000365ac650000000001d0265f0000000000000000000000000008dc2c70b3578ccd7d6fa7e427f9e074510988f7b5bd548cb58a6c85d9f4a9bb200b62c3f37df8b562c03f5a6bbec165fe02dd66f413228900a25d1d3a9f993c974f02130ae1f6b570ce12caeaec70da4d87258a01e831fb7d1e87d0cc48cf0c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e8735d8c9aa3e2e2dcb7894e6ae9e93935b87e7c81d1c28093b85a475cca5116c0b295fca03aba3ebc64eb64e4c99ac106ed83142e12bb7135d768ba7caf4b36b9df1f830c748b2f4e1003888f8186b89d0a8eab0857372294e1f9ecc1c6c0ff89a9d752df82ddfa1feb66e3f55bdddaa844fe87fc7161074a751005c20a3290308e4ab9f61dda0df4d9881a046dccdac873a7a8d585e60d0190472a9a58d6349021ce65926ea6fd40472c5e96392f6524aa56000bfc93e24cf25bbacab7354b2fb0b0250cc8c6da1172a4f7297b3517e18efe8a146892ddbcaa6ac79050f1ea07f98daff486cdc6f19d5363d504573a4fa6128393158c696654d3dd4db1306463d5e021ec988e5b32816fe66b487a5b310b4cd0913c947efea8cc8b873ba427a2138e003064431350c9d587361620a48bf345457d8842f92c5a41a2878c1bef28c431a5b030c7b0326deddf629c5f0d7a5c69fe61fe185bfbe6d0657ed3dfd98b70a63f4e00201ab2bc2b25af165aea241e4bacd9d9febd9cc06d3f0e50c12a76f8180fc5d59022dd592a212600550f347a807447b438ee22ec3ac4aa8fb03248d826d97448931a095aa5708c31061a81b52f4b8a061ecdb104c990c7142e54bba48ce9f4b8def86676734a20a85ce81db4c82b63ba4f39bafc4534a9eee6edbdc7128b85fc88d34bbacb36b26bebb7c5404dcc83569bae67f39c3055902300dd071d910cf63ceb731dc5164c858157648fbbcffa83a6866e2fabeed58ddaad5c7197aca25e8c104019714f5eb38982863e99dc164392c793608f22389a21a533bd241f77cbb769f576f271de743a47a8b6d31bd4e0365c7e82bf9134e89c980ff2cdd6078e5d8997064ee54e14783040becab4b810ee52ef22e441b39c726126378e16fe66e98032fa162a94901abc59d3abf3dfd7965c7275c6749197e5f6319adbc753e1f3239f09b1f3c12fbdfc630bd83104e59a767e3b4996904074bb6b67e7b40410a06434c9ee9f4389db7fb8ad775afd4d952575d0157728d30493aa9cca92817bbdecbe3613503d457b06f7e1ee86d71f776f194927dc35f96fc8fef18d19910a508cb5a4b0150e519774eb0c8d6877c9a756351809b538e1351df7754f6390755edb21cdc40d153b1d1ab6a19d7fa46aae4ab060d860be6cfef2309a7aa1a6e250383767fcc6d6cbe5049f6c08be27727318149b9067a33e925569d9bbfa5295bf25f8f8f8aa5c2a60319a433343282e4b8834b47ffc8d85a454a08842898a8538cc5f832b2b7083034a7b62328786ece70826eae07a16ff37b810cb997edd3737831a525b1cc7c1a705fd286f4232bfdfdf9a6a4a6230079d612d7032bda840c45ebcf62cc48f0a3a46db4a98288914a2e507a247249a2b727a65130a621b95193f2f47f3a0d423b82af1e00a4d81c419b7df8772c39673fc6497482ae12b1ad39343e1e0fc6e40802073b2e076996528fc72b627af855d3ebe3b6c108092dc67713a41d891dbc54d7ea717725b697f3a2ebef27f75cc4fc13c57f7f2a728d8b9aa45b36ccd0a15d38cadd2861c1a1daea09ba226f64de72fd453f8f1b7508570e452968fa341a784932682a954d2285dbb1fbc3bc74117a380e1a58676b460656118a04c54bcc106e8b1f351d3fd3f51c1c3129db155d8f632d80325ed5ac7931d43efc3fdd4f465a35f170fa53438a7974ffba2932244536ba36becb696b94c438c42cf571f6babbafc1d88f941bd4a6b21bf02daadf17248522cb90e2896fb96a482e93ee8b83c109a4c84f4069af11288531580462b495ab59b26ca6dd1646265f9c57f8d8ead258b19a2529c8817f35b8b11143a479444f0c5f1d5e1494af60a13ebe88c80fe8e38227692a4fdd28c60be975305a8fbcb8b0604a7b8c3b7aa49543bfe7f2903fd00e6fc1c368a76e1d916ec197f46c7fdb2c0f9ee44a9a7e6b25797f4c2e6ad442d8e31aadd77e20c4ba1941be8014a8cd5053e773c56d26003f652c0d6b3c511c1ae190598c462341fd36163623c48588bb16d3a546863ba75fb7101d3791c8e81929a1b7d2be77eec78bb0b35b42f244f9225c402a5b28409c5dafbefe926d3dbafbc82e9949211cc9ab0434693412f74d81427fd713ace916065de3ed6eed894b61658b92929a30e50f70c2e1f270cf888aaaf4f72259a45182dbc78bea2308e95d772e71244190336e2465e5d719c15415e1fb2fba33877d796924500146210b074a0053e3a8e74df3b0c0010736cebc894cb12b91cbb4bded925f8007709f1564e70d1d64d4a1a690fbc88ad9f2a3765eca46e147df148e3025be2c1eb6c09fc498c0d7beff765ad139d08bcdc10afa7b4cfc2fba9c31787d3ce7f5ac788f979d055062dffb0e56ea3c3e6913b527d85b653149cdac6ab424b2841dec6fb4b196131fecbf715a09", "63ac656a6a006a5363", 1, -1953052847, "6ce7cdb595e1f9f5fa2c0fccb1145ae7d073c78b44fae867d6fcc6db2aeea34e"], + ["030000807082c4030197f2b45bba2313389bbbb3dbb29929db9f698b5559248c124e171ab0bf979cf5020000000265ace4f5328f04ff630c03000000000252518fb00400000000000365526ad78d2b0400000000075363ac63636565d5021a010000000008516a5251515253000000000014e9319d0137072805000000000000000000000000f4803c39d71243bad4bdbf097928791cf2613f22f38d82e58a12361648354185e3165a2011d3de1f11702619e9f3d78a1918ab7c75f4c20dc760fd1668856b7e7bef749b7bd12e1a9038020194e9db7bc3fd1234bc57132bde84b4e07b4afd9600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fd4c081b17b9e9cc1828c72bce3426701b564e4777695fed9a47e4d62406ac08e93ad59f9b4fcaca6b4b3cfd0269f437e9782bd0f44f4e515ba797ddb5439cb2616627d77a18e88ed1879351df9478381c5f059244d1ff329d7bbc13c9ebcf87a93160cc067effad7fd7c8c07e99353d13669a5c0faef9b1dda22ec2630cfc5a033044bca62a58ab17f9efbe2139d75e375c1dad274df65d19be582cb41d178bfa02162e881a23ac5a153476fb552b0d12943be8d86da19eec69599749f68b4b39550a038c15bc9142e583be163110058e064dfd1276817a9d811855848fd260b9f406c038f8a7bf79e1c61913dec9ef18786f89f845a7e99dc1536a18c137a4bb93530224adf7dfd1638491a9d93bf2a8ae34ff13ab42af4f54f41db16037024c4f373b0329bc6a8a289420cbfedcb874f23d16c66b2e6075fbc697c11e54a668612ed40f0217e15737ce50120bd2e011f419bdb087acb71950179a21bf4dc3a558a2cd9d6e030152cbaed7c5d444a8766906218ab38f5858344bb9175c9f3b937b590ec464c3031446935ebd60fdff3a56473a995b4af3a5f8fa3f1789781a1dd19c636af3f283f88c2b603ab3fdeef7f02fb5cd5d61e7e027fb7678145ee88dbcf9f2e5aafab7cf7b1c3add4b73e6270f17826774be7ab3d749b868929d6c023862c2e7a92c47fee91ab57fc0c44c5508b0d401bd2b9b2d07a87a123cacfa0401783da5deb403a114c18dc4fb473521e5a54888084e7b1adfb6b4c471ebc9daf026641195e2c72f978cbd8f4197f392af1678435d7255bcaf204d6cb322e834ce95b533686883c67ef58a413bb0e900aacbbfe1d486b93760122964ce3750c7f3b81fd52512713e0a8e7427dfa96deec52140dc2cf531f007b7f52bc080ee611418cedc6716651b3d24be7bfcd730af69e215da5e70573ff47e2105f852a2d6f78843eb8009ad3dc8e237d6820f1c25f0fc077b696d700121abb8772baf6884a3d54d3db3edfcd2164a4df5ae4f54a8ab337a4155a67eaf19e1a7608206fddef902f6ab88c702dc28ef197474ec9a30fd84db69d47b0234377ef0853638179ddf23114b3169ed0efafe42e556fe7e63a8486c7995ccd333ca13062c56106d7df1f98a7345380cb986d80ab4d006f93c0687e4f89e3968c198976eb173f07067ffc1ec8c4359d2ac5629c21f4e70aac123710c7d4ad2411459fbca67d57783bc5cac5a61e111ff1193ed57ac3050b482b40dffb4550609367471db131db9dbff708ae612b905a93714088cb6b9c0356187e193133957d78e6b72cf4f8cffab75f70d1a71e3ed11365373ac17020c1f78ddc67a26b4837288df2880381ea1c5082ab3608a1158ef4b294f409c9c9b743c80bf9a3096f835f425c09e6d925ad538cc1795468597fc3d328bf3c9314cb96b64989bbe51cd0ef1d0483baac791388452e3e6e8181e8e39b9ade174d55a190c4539fe7210bd46b2bf1ac57648610eb0a26ac794147b03d55a434526842b1db0da06cf290466c52bca577fd062e1093bb9cbe59587a5c7bb81932b2c13bc1c72cd6b067f4d793fa6f762700b8a6d808a089a476860bb9e3cfd41dc57048937e020c0e470a6e9c610365af9ae83a1e2e1cdc79e88a3480cb55d4c47bae28594ca9f8d97b835b359009ee7286bd37a72d828cff9f9f24b60ae3f5879c3380be2cf1c4cefab5abca549b7810c207b3c16aeb62baf9e4de91139ef42879a4413f2d3d83a0f2925ef8556536473b01f13cd583cb172f8e0be2f061d707f8dbb837840bc4d5c54bc7067aeb249e35d6281ec1802b8dd81ed8a1325b7e4d723052b125a289db2589e7fb2f9eab3061db6daa685e147f57443016de5b38b4d7f7616964f8784be468675e758dc9eb7c15e0116a08d0da0becb49ecf41386ddefddfcd130ac24ca0ccff509125199252bf30659295381375a5c98ce0b98cfe6830d5f428b9ddb866e4e6336a952a3001b4e6f4dd4dc2e77d75653ea9bb613000b051f0d93dde5e1407c04b0b7d6be10939659b08c44b9a95983352e1c5059b34be640051f27cc52a30c1e4aa6121596e5995570e4a3b318797a4f95e383ae24cd838de73b17ce2b6606eb52bdb4bba9922ff6b93c4c2af11217626ade0e2181cfaeb842fd732eea817b10e655718dab6d3f09e46a4d83140eddfdb60c97b9d9708a78671c29f4f5e5e52af0834a8340773c0103ba6e283a536b0d112041edce4c04e41e8767bece592bb847ececd4b46f4d2c17f8dd98cf71361d5fb0bdddc72a7aa7a37354dc209baf96e81c2469fb4dfa4717333c96b961a356bf3f51b058c31e1f77152cc38a037ad1e76f6b7c91801dd26b84fb8e1e8a16ddd5ce86b76103bfcfd490e3dc187d179b334a0a730d42edbdb3261d7477b16c4f76a9a2f180d414c6d96c960a4d43031a75800e", "53ac6a6a53525251", 0, -1654691573, "d64593b0e6543dd3b8ced7a5c33b915b634461ceb80a3fee7fd95ca41f6aa1aa"], + ["6633dd0c025fb33bf0ded59389030a93c3a83c570257267d7b7f2d3d80e044975bd6ff244c02000000085363ac5165655152ffffffffdd9b4062ef8f0ac5cb192d3e8385c5fd51df4ae667ba210c3e12d7d289b3852f020000000452536553ffffffff03186af4050000000003516563b5b1f100000000000363ac6ae502ed02000000000353650000000000026bd81c0400000000000000000000000083c08c1bc7b6cd97be9f23104d52b7bedf9f5812b616ee48c1f5047f32d8cf505242436f65effebe8f367eddb84fa16537a4f4aa21b91157352ffec76a408bbb51caa7424818d65586650ffbb37a84e3966c2279c279e08ac6d62ba66e82c6a400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d219c48f7e29865593c411e4fdcf3d6e4259b06df727b9a9b6b3509aaad3a2ed0213772fbf47df458dd6c282b35074ce40a2b1754fa4d84f59562c3ddc14761a6ca30141f7ea7efba08dc7208784230cb74045748aa1d6bea5d6c35a29e0a7a4d22621c9d9474c19b832f81b980fd91499d88f2d4580d33b59b9b326069e02fb020fb6258a7a4eb9fbf2de840dd6585606021bddf7dc76039b41d69d20566aefb3031466188438b7376882f87fce5b0a8d1bd9c864bdd1624f65843a1ac5e03562170a035e947e07b1e9e8c0c3aca3bd50f3b98cbc8c36f0f9ffdbd2ec5de7b8a30450ae36e6798bfc82bed869be7a511189e06d69be71f8f1c3d51f0578c51334e093032474cd217c194e65b2e15428cdf0d6aaa29a0eed0ee22aff2aa3a4a829ea1f29032d0fcfb362747668483654775bd6da09685e29c4d80d87cd7b09128619a3f80b03052bd90ef2d65cff85d054dd9ed84574497222d62e230ede687d5d64bc05ec9a020c4a0d0761930c790eb1cc33bae1a4938982fb07766d221b3f6f07a63f087949022fb97ca711fd8e23706411e63fbb14754658916ca32ff37124f00883232529daabf1cc665269022882ccede39530ad3ef4bc2fbe2127f67426b6efa33f9c2a1353a682f9c73bf5b28217464a42d23ca1aedf73978bdd2a8d4f8e0e7ee87cdf5f92afd96e1d2ed6206d9bccb0d93c2a106fc8e02e6bf88e15aed75f3532bc810de0adea438fba8f6b4f77433bc9a496f552b47936ff5873c8a992dac7f61b68cbe53269f6a174c84745c25d5322d7da1dfc12f7bfe36e291a1722899ba33a2dde8f29d29a23d978cbc82a19f4b8ce0b7c6ffc65c1d904246dc565a348350041e9721f264cbe0fa54531ff297a8b819724ed53ebb81af2d6229ca584d79c549ff9e58a65e295df1431a92f5fde54d76f0a3d3944bc4105e3c41b42b91488c46748718e3b42ffa77f68512c2110df9737a0b40464b4959c858f2df32fe96fd1d010fdd5c05bd210a4f106adb44774aa5620be09f2a45d4b99920e4fa3710ccf2604762b0f70bbfe2601013daf08a56063df284605f2df49e09ced1b3ecd72d5859e1faacdb3ec737dab792fdb11d4493f9c1f61bdc84d5b80e10ad1ceebbd4e7eb9b8fa2ee2c49447894d518942583fa83f98f9ca25ee1fa165cb828dc8ed8351034456b9c7498672b8f0f7b6e9dc9fe25be59867e5e29306c9d7ae3ac66d86e504bd178bfb7ad82df015347d4c34e3bf55928f9b7fac66d3d0394ed569509fadd969ef7c4608303a2a68e3531d2e9cbf9ebedf5b02d76948e452c5baff2ff070498895c2e5f07e9bab021e0a9c5d1124a3f3607a9cd7c3dbb367ed14188389e3bac2e64e8e9865716c43bef20caf78a45f371b5da7e4be999601508f12810b8173d0c0e8fae13f197344a5797dcffc6fef63fe0831b1cd6b6f3ea2e009003b12a54a7c6ba0f669ef33ff9f4624c854671d72df2751f1b06c68609c672c721acb96ca431b8f93068274abd2d33f5971e368c7d24f0ceb61784d76e4b0eb533a1622d064d0dbedbc683794cb5519657cb2380d58b72bfc07f109dd24831e3293e3789c077bfa399cf002371e9a8986f60cda040ad118914a54b42493afa7f55cd02ff743c9a08b9ea759753e13ce1289aff67654132b4bcec0bb3ab9fefefc79dc1404e654a0a4c2ee8780c027e32af28800e04586edbb006b2c2817e94f82b6f7f86414680386eaee1ff3e5a2b0a1ce9db40f2e7d4209479a4fc99bd91037e2155daad2b67e928520c49fc8acd5cd57aeb44faf31837c2aaff1bd3091a3799c38dac652f69e5a0a28fbddae20af96018ffe50b0e295d0e2b767e4a4ac2c71416a741a4e6f3b5b205653acd7dfc05c1ab272cbd00192650e73452e50b72ac8aaa4f41c4fa071d03aca2cc9e2da8ee9ea19434367f3581e8e6f3f782d842c3d1b6d3bedffd17398572f384f5325bc348a1a2f8899acb5bfd9cf1ac20631fd89f6073d7eb4fd0c506f4f6ac76c83682a96252236612eec49ad1db425ccd2e971fb6ed72e7bee5c90cbe96e77f91ba660b0a195040607ffee63def070efc42b31c189dcba7b8a2c3a7ea0f054d8fc9b3fca4f29240387fe23f520937faaacd2d79533d1af119cd62dce454cf3f8590761935510d3813ba898cf7d99f76429124dcffecd8d76d70af5d21935429798e76d59109f33584af5bd1247e6a1d29e735cdf86eb372025898ac6fda159cdd0f4dbec0b3a18430fdeaa8818ff1a2797029775bf2891f0b0d1dbad4eb28bebafd3f03bef77efbe0000000000000000265a100100000000c9f42d0764d790ce669093bd7b0043b58dce1b8200c599a5902b4919bc6c667b1bf5f7e54f994a4bdd560cca7c882b7175d6071e30683777ffdd9934142019d9e342bbdc3e0931c440130ad1558a35e9a55d78ac4a9c59f8c608e5f83eaef4b9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005766e1e8194e81b1e21f52a742df02d8454086411e9d1c57ca12dcd0d75020c30c246fbaab97df618ddc8862ddf1a6b789971de6e94be4f22319e1ccdebb201adb496a1b862fa9e262ad1a4bd60f5f796519dbdcc2a8d1222f3cb4d6e9656fc976a16785b04111f6db4006902077bd5e32e78bfd5b64642057ad6d28910a83100219ca9dbbd4d5f02d30dc1c6007b9d5d89a0f2fda1152cce8ce598a8dbb10780c02217fd97ea0065ef4aeecca76820eb6b30ec29731fc274616d96ddb9a22fa8e250b039982ee6590267334260bebdcc1af237e62bd0a991077b4d4c01cde157d9295d416c5ed002daa1ca277bc15de89a19d9f54333b24248eba36efd3c1f0014e900225c2b130d116682c5c30dd939b22763501a45f7afce8bce0665d4056e14bd11e030a56c4b72cd9452e0fccafe200c93839b7bb3a388a80bfcfcd1985807e375aec020f1bbd9b366df0701b9bf23b145a3c3afbca9a8020618aae837f54c1592f521d020a7ea2b7e3fe5e01e802ddf47f6547e8b4e7c3290b06ce5b8461de3b50ab104d020be0c044ba0ffc2008d8f8a8060a4e03a050b1420094763fa43812fd95e14b70f5c0a4f3ad1e5d4c3cc974a581db228284434dfd237fa394a6c98d01bfd90e7aa48419cbe3d55ca4920780f4f09aa064be90d441b6f5458f3c76cb7d6045fe4aff5133bf8569144b278dbe006d102683f770f63b8b9880304de8df727e39b4ed05317ae55a33e5a73c179868f8f4c6710a56d6ff94f17a8784c28121196d1733b96f9287b1b2b81383f4398f45c79a6aaa4fb82ccf9d9559e990b270574f1496fc95d4998db1b648903c7cc0b38a2a80ca8744b19f73e3c80e5546b1d885c4fe48d105f092582ba15185bcd99f2b322a9ae0dc90a861cbbed87b29d0b3814d67d1a6bc960fb7856cc65a9631fc93e51bb847f6302b80f5ec048a3499f6c4cdea892a34e995979c31e6a0a388be94f440d67e799c4547b1e6a3f4da21579f8fd7a786bf71c0f509aac619bfa5dc3d9d34f8dba764935e5ee6f10788056f2732b7b6a2f950ccfd9e2fc7d3218f9fada580fa138766b4146adc89a14c350ec06c2c8ae6d2472c98c3768cd442d433afd39dd46753b7d2bd4c37455f0d708087bc93da9141d5902d67e85790fe865ec39a1712817a50a1dc0d8aa63bfb68d6e4735ce8a2c2a0cf1ea1651fb485c364dc6c163e24be011421291f69b25f9c487e1efb5f86718e0888c37a19a6c131253b6b7a6a06d1038342803c9294e371b21be7f852fca3ca156eca614603ff8544ca7b8143f73acd79e12d6d2dcd33bcafbbe70bd6c39b9f1d8d26d85a5db880968143cc3ec24410408e12a691a7aaee79a2cd48099c72eed183b42a7dabc5d88d256f7682a3a63d5a144ee18709a4adec87f9aa9e5889febf41738a5399bd691fb69b48d15ad8270a2f205eaf5d418f99af714ddfaa72f0730b8a7ce76296cd519d6a1d731bd6067aecd0c815ff036375b36b873c3b92c60b423f9f28dd041af69b83c6c78a5ed188685492e3fddc041c4a9d6f96332bc4c430a746debd1acafffc6d228c927530d274cf93193dccc771b6547f3179f3736ed133b084d4d583347e605d2150139ff8220437dc1233ffaf6342dc7d229fa6f773284260c59b984a2c952b4a4d5cd7d3e638aad130030a625a96c12cd836addc497f98c61af7507c15a8028d11401cc8c2c4cbc12779edefc6d6efc6dc1ecd5939dc99b772510a1daee3db01ede8316bd93f783d8c5efc687b4647c87d6e2133f46f0efd9270a0d62ef02cebadb82130d421484c9ecf764cbd51b0a0a4906676dc279cdad23084ac24149eb219182855935d4a3478e0d60c97e41305d422027f6e5de88e1d232bfb1217af80350444e6c1d5798755231c85b93df4279046d2ed49cce62c9879f3a7de771bbb07b9cc9f547f81de0e9fd9ac5ffdc780de05024a99a74a0171cc1538bf9405c7d5232a432fa77d1920659989be736a29ccc9afca25aeb006750241cdc91495c95ef8542322f45855f4a6644d0295e3dee599b3d1742a3397045fabeb4c0bf6c4a57b36f3d0e6d5a8e04f074a86c49f36ba7c323137511a0668786648b06d01c81f7c32696a84392cd6a040cf51fb6cdefbeceebb58fff83c9a966057e2e77a91a02ef7154623e833a4ef44c327b5c6696f5da0d9092054c12b83e9b3d439cafadc5a03c9de1c0bfbe6ef39b464a0aea3b0cf072bdc37cc5fcc9b51a1fc5f37ca69c5755ab5ba8127e3b4250c717f7a2ed8ea7985374c0b5dd8cfa2a6d996c346dc8a373099e882da41628332c98d6438ea8606946ec8bc437cec87695febe17862970591e5b40aff5e3e7749e5f8f099b7513b27d1269306f009abc7114e3e04c531dfe8ec74b3107449f16046f7cd66dec74e4eef6c94aa6cb572eb8aeb916a0a", "6a006a65000053656a", 1, -1349569807, "205ebfb60bfeb0bd12b296a28bf238f97fec32fc7664471f9979368baf227aa4"], + ["393240120453f43a262f5f78763f60f4f9dd2f3dcbd5310ae9200d8f9a543ae5c6b69b3c0900000000086a5263ac6363ac65ffffffffd2378dd6a3aa20c8d4ab5ea14184e9b855501965d0063a6a336d1166bc1bfe82020000000700636352635363ffffffffd1e160fcc742b8f5b3fca34c46e22285c5e702926c4bf428a2ab48147b4b196800000000025351ffffffff84fe6c70b0ea1616df06007ce0ea37d715e25828b28021cf507cd8977172b8ab000000000563ac52650003cb846701339b68010000000008005265526300ac5339232e00020000000000000000af5bff0000000000573e2c54fd796a48bf45e2fb7431608141955f506192e43a061bb156ee705df1fd42fabc040aeebdebcaa46d555299ad28fa7b3ac6de0750fa80deef5e6e2e1898df792e12bb73c7fc66a55c5ccdb5171c80fc8a100787b6dfb9c8ec58e5771500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016ae87a7a61644f739629085648821712f212c4e055e2b0501db37c80c2b9c913a706bcfdee5b005d74621fcb1e9543e66f2c09b963a55d97319181d8982ebd348a1e79be843a6e46847135750bd4f5e75cc17eb7a53b8cc9b386a12c9c654e6cdea242cd428a59187aa492269d8897caf692a2aa3ee6dd0e58498df5671b9702249d23484d16c035be904cad73b7136a9a813376bd7dad1b23cada7f5096383f021b964b7b3a144fbd4af09a114cb9e20950751032cd836ed1a5ffbfc1ec7b7f840a001e236a905c6b657ac0910beb893df7cb70ea9d84379ccfa9ae8a5a0246a5ca54432f157c9e558bca7e7d53eaab7a28c3c55f8c5b0e6339055841e873e6eaa1020c705e9c31e91603a5b16870b66f8ab4bd4db3a66c05ba8b0051e18aa6e2f2ee032d04834c64cdeca176b9d5cf98eacd233d442f3a4ee42e55a2b3ed6b46e97725021344ddacbe12b963918cab3426b9927603d41f49d2bcb103b95bd1820430e3ed0208e4827d9b306adfea501adb722393e575003f54472aad2c5c8f7066f40b5a4d0209f296163f483a4685e98814814d98bef4abcbbb72bfb2533b779cd94230bfc2f88c0a5b0c7f3f99dd27c7e09242f349bde71ad16e098e6a02aade43b80a080e7377de1e27863f0c3b922dbeb69847d1d81a7fd0ca6dacbf2cb8effaaafabf96df5bded17dd8649c02a35a40a2d053f8c9901da4b2e35b41e2466e126887e5e6673e9afb7f4f743707a15c9458234a9d7916f0cfeec8902a46744650a1ac7fc9e963f93016696467dab861a513ebca6780716ce8e65c8ca03a9b6f4bda2a4b009fdaf479d0280fee2bb21cbc45cdc29a280682a0fee0d55bd1aeb0f5f20182e793778db8c10ef3ee464065fd961b380ae4d165a8a308cd78a4cc3e7237fffd0867d6af782c29672464c116f75a66ba833a3e7837a19570451f977cc0408a631501c638e3e118f29f6edd9699f6518e1e3d48a3ca38b4231bebc3f173335e0b6adba0fbee8a4b07abf82966ae259b2a7bfb9e6a72f3ccbda84059574c10baaec61ac6ae5fdc0097bbcb5d41c5470ac711c4bca4e882f66f009f417e3a619c5aab3db68ca64a7bb04510dbe0f0827ab771c887d9bec01dbdc09f6e9e3c717e088c7e6eae7c1ce639aa0ac9450010b25cb89afbea162ec10a024b70be228d65ffb6af5f39e8e4dd0de605e337bc2c0923a81e8c8c6a01a3fe3fdf7bdf39238816916743a5c2a0cae288ef11664ceaae05869fa627e70a8430d18327119086c2d036d7807dd7797cd6570b6eed4bc5ca50549bc4344e923d0c4ed3bf3e351101c037fca75a415a77487f194a8c505b4560e92afea2e92088340f0e1dbafb10c4609f056018bd2b3ad75c4512d07201c1a905272f998d896919ed6b7e08f51777e1deaf36f402874a47f1459149e8039241ffc52253fcbc37b5e74a63c550cbec234b20ab8909b76005e1e99751e67f4829ee2f39438c230b8e9eda67303b8cb60ab7d9d02bbd4b4d921a15759875030f8737d12230b07f4b5ab7b271f2ee20d309e66addee24e15e1dd8b10b38fdb08a98dac12b6bde887ed6bbdbbbbc7d7927cf71a1e8162507eb8a1983db0167c409063312747544179a437a52bddb185530a43a3af912941d42bc0252417e668588374269f27a833b7137b258638730ac6cdb885ab997995d554dfd7cd8af90d5710a073917b204ec438736d110382c9ad45c450137a9ffa9433bb0612c81ece4e4726258178edc41925c5c829915610d335f3b33a72af586b29736d76a8055e35b35a406cf992dac3cb0688453e48f471a8233511d503f2ece91c0787dede89b81d393544bd2f5f06dcfdd23009389e6d2f2860856c568bd0b69fac1141c945b7fa9b34c72501d9e6d9a1889e7c98aa14e417b2caeb291ec396db7c1b8b7d6fba78e497358738a067b3180d69bea79cf4fe38fbd35019d46a1e9222a72a4ff4511bcdee6b54568482e3e02e21a84270680dd738749683862dd9e36635a3341de1bb53d9f394925849a4692c4a1d818dc54eee2298e197accad7724dfc43b366e5e2fa9b71b74f8ae820fe4971604429c8c41d09401e5f7752c273d9d01a19c3f703a79e12558824a62ff79f48e9bf57cd2b25bf9960d75353849e8f8c344a5ce095f55febfbfaa4727ea09379628f8c8b5930c6b7da115e5c039ef0aafe152fd873993e3561790dc89fc21e34cca1b0bee851a3f39e8d1325de16e1ca9b47e5c7b8320b2aae29d6a9145dfbfbaa52b32c5fdbee1d3f82bbd36615f22776a1a3ebc810564450000000000000000e820020500000000f23928e6eff75025182c05b6ee5d4385e171e2bcfa8d2d1d0f0f6c1d8e7c9f9dfc40acfacd56c4428dcdd720414ad04904d228a635e413887e232a98f37acfd8acbab442beef0277dd2e24344c7d6ac67a17af81656244e34b051d8470faa67800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a3d1cae291673e95cb1ecc550d16c6d182b276edb43a4578a0ada1e6d141ba18d8ed8eb6f6a18a24b59481de0075fc502a4199dc1fcb05d1527d104914c3126ee53dbff0a953ff3e2b0bd7aafb673d81dd5a0defc5f8f0023d1670c632b31f9f90834482ac8589c76f8911bc15124842f6d321fcd68f8e27708b8f6c29bb99420203a5bfca5c6447f1953396a80636fe999f49a848cd815df737db4aa7f3f8ef4f02206c7126229b8be8ab86a1d1677f00a8e643dbf8b2ce1a4b2c160daee9b0da8f0b046731050b69522e94c43d7e3b3e578246f226b4b040ae90054356eadd39b56d729d93da4ef95c47724cd3cefab7df2036f3663766eac0e562e99ca0d3a6a3490201b0a7d454d00cda762ed3488e30e365572715b099cf0577c86f4ae7aaf763c5031798f051a4911a2e9fda739312f4a22173ac09f29aeb1690b3418ad7d66f664b03247318f2dd0e8bfe6273cde57a2c2062d5409f5094d69f1cd0832d975d60af170212b50d267e42cd4f36a6a8c3d5a514e7fe3c08ce13ecffc7935bc7c1f3313b94022efb943306c6cd8813f531294f96b95e54f9ca767c1a23c8b71d85cf6ef856b9fe62d03ecb5d1b8513920c3b0008477b22d554675e697074381d30f1b2832ddfe214b7311ccbf1b261e00d2058d10f1cca77a46ce1cef9870cba920d4951256ac2612a6e79a94cdfe096f904e6e367fcc415b926ba5f4d167c8122d8e004751eec42c4d9cdccdaddb858e01df444fa56c43f19c63095552ec7e14d66cf8a2e3c3f67dd49f30fa5ae34f340319b73f820778812aa3499d965e807f27f239bde2f9442824dbb3ffa0dd7ec109be08d1489abec83be0e3d8cc527985ebf27f7361257388039fdcddf00f62d8db628b03fc19fdaf731c73095eb000206d493976ba69b796fc66bfb289ea772b4f0de31010f85a0c41535784284c9466cd7fa87362377d3a1893f394b5b938ab1334c08dfde8ccf7bdfc5ef10716fa642ee1b7c7faf3816f2bd6199f018c6b1d62a08b3659d80aeaf41b6ad5e7309d7335cb2397d156814b341ab7435d8adb7fec4f3a5dea8fc0e361680ee9a51475d00fdf94fffd783edacb0d5888f43e3d9118f1a4e6a2fe3e18ce22c4fc8884a3f8ea1c080ed992d8f6fe6b8f60cb453b74d8877d99735c24de07d506728880976bd4e155ad3e24c34f6a023d925c082d28566f0461b48058eb51ec460754b742fea824a74ede19b8f58e1082e908b60d07707b7c503de5cba86be4a2777e3d80ec28d0aa865db1a1870925b2e2b5aa62003692816c6ddc52b9483ddea59bd02fd21436e64c930e6df8390ebb6f57780d630a85fc3ddde901e2ea8e94431c7eab464a0860cf294d58359cc0f497a2dba18627f6ee973ec1153b0b98aca5dd1cb791ab70e449837512392e6d4ac5853a5bff6cf76a26cc0b576d7c99dcd42045b75cf1cc2ed7307c38666af8894e7e87f051357299223c2486cd8bb8345312d673ee0d5cc468c021330636ef0ce19c4b3b696eec874c9ac2a859fb1182f60594e4be2584f034fabad0ee34e55c8c9e16bc9dbd243f4f8ba0007875984fd0437a7fa9453ce7491ccf971ee20fe8d62c77543de4fd78f5249d84f572a1b86076110f2ed230fb6dcd4875e4acfa3659d8c7003bd0045632bc1013001d03aa62b1c192d819873c7a62ef3dc5a37f310d1e1a03c6f14cc666f632026cfdd22ddb6482ee6d77fa5fa39decbb24d2909e85978434b6d338127fc2bad9d2f21bd01dcb04676dc76d02babf3c60540cd550d4d02cc9d18b69f5dccf52884ebfa9ff544e9cce27d78f42bc9d1afab106cad97fc7599983f4bdf9dee1091af0e5f92e7971dc79d3910ab32ca43b0b4615a09a2e413de1cf9e9f3ef06e70c52fe9c9826287138fb821facf79f4b703422e530a044d47fe05640ea3dd50d5ff67c2d1c136e220e6c64d6f5461ed5a40c0559692532f4ee78a382895e50638ddf84cf51fb4c7981ed4a7f793861c32e715ceb330565823f8e0d76307be73e889f18154130dba19fe413f47bf0ba5630e7017d877aa0e3beae2f1a6aedb30dd926f79f3a0cdfb817145f8725c8dddda69aa2f781510cb8569d34422c66dd6c295d70c36e5aefe4ddfbe88fd55e42096488dbd5e09fc850c0e0a7cf3237142e69fb8be96f19abca3c574ac066335c982934c792a6602fb8957413e26e5ba87e9643ffe1d523f1cba5968b4325c506599e56ec41645d5cd7a04b22148407e30c3ee2e6d5cbe48e6c438848878106c715d52cffd23cf3c5a78fe7d7f493f0ca1f544e2cc1aef152ae99433d95e15295b165d27f9ba7eb478d7aeec57c3e5f385a5cda12514417217a281dee6a3ea98882bf602d4d73ee6d45b904e12d47c5a865c67764253d6dbb38803960f46258da5a9a9ed1fecb8e493c838b653ceeb88d3b4506", "536a6a51acac", 2, -51290375, "8f98466b2afa5503185f6b1b53b0abe79809dbd23094a3a95c448d4e12a9b169"], + ["b927e16104882bbc31cfeed938887925d361918e9f3979619cdd561312bc7aa7f540820269010000000400636a52ffffffff37be35a53c8956c27343bffe3f39d2e5e483b7615d7f419252dfdee35b1eae5b000000000153ffffffffc92c4d77cd386b26c2984932233497870ccb8f21b92f257f749e1b3b9c79390c0200000003006365a30349bd62e8d499baad2f387bd4235dfc8a59ad82025de40e96867f479f5055cddff760030000000024d9e4dc03f92b2e05000000000019ea1f03000000000153de49680300000000036aacac0000000002000000000000000023b6cc04000000007b941c1a2d507e7aa2592f1f7bf15f88a9a485d08b50e64c64a8a28570d1098f4b2fca17ba268dae2c956e6895f23074fd0b8aff61eae5173b34e465088691d732141405bb6da45c0a11dce50852a8154989baf7de53d5a1554681ee8e98ed2f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000092b012b24b22b3512dbc3ff24ebac62d1db7f893cac81b168432cd4380578fe5e933c1563064e590184cf107cf6700ffeaaad804b443d3998de7f9bafdf34e2f5b3ec9046c895026046e2b6933f9a63aabd8afbec21b833a4db8552e163fa5afea57abefdef7a525de6eed7c37f2c5288087d1312881e287f3db38a3c9f04f6a031c4d678c8517df611d2c2aca36fd3eb232c22c62c9137f5a8e024ecfaaf4382202006d06d7e4bb90d613691ff277d63f5b995c22889e2c7c8db6eaef3fcb23b27a0a02373a25c554c646c90ad71d56c7544a69d3359f713c7f0c30d7f8d271dc8b5bcd9bc614dc11a2ba2acaabf371d5253b0949cc75735c4af36fa64b4ae8987a5c03222cb29a2ea44337663a070aeba1d2526ff9df7e9d7867e08af53f06b827d6ec032d2ed42440769fad2227ef12ebce788d5377b47c374da443047b9d506c61d42e030472f35466854bd97ac8eda7493bbde8efdcaad0700ef915076b8e4265fa7d07020a59d69483e5a40bfcf9604b8b6e375acf8979f79ba210eb415f739858417731030b1a0fdf6cc1f98f51ec0965f159526499797c864866a8e13344bcbc1c63bc7bf9c9ddac295573f37c29d34ee6a4da857de2ac74d51ad90f642fe81b0bfa0a509f81054111607555a8e10a922dfa4f04dcdef1748fa6871ba1a5dd50de337d131cde7a852a4e58afc74120f86b54dfbf8ae389bd7620afaaf633a7b35f21a74123d4f7710094abd0d2bcfa53b6ffcd8e07774828a5e3fd45d18b1f0c4ccad337b9b5910c41e4d56e4c6fa2f3db95bb6368f6078cecac781d0f367c0f4f25fcb01ba1cd6dc4b99721f90e9f5925bae8cb9b6014efd1e23815c133608ab5fe13c2e0a65edc0f95ab9104bf45a79e40a9d55ae70407e563a41d9ac6474bd894c5dd97b39c907cccca949c916152c6104d151d18445ca0092a5349143f46d7d89566228bac253d3873e77693e1f74ffef3df5d7438bf68afc7e78c1b4334c746c05742b8ce2be35ff78eed13c382e326a3bf4e0e6f93c83188126c2f8aa04cbe16821b005dbb0a900d6f62027604ac9f8880e1d9f6943164e0d1f8123224b88172c779c3592356f3ca8ef9d6e3fe6e02db46edec8d0c05b0d73ce61ca15e11ad9fbf540c277c2e8bbd57f4dfa57d0645e98e786bd6edb01d1ec67e2afb979b05485c9a4e44e6f760473687a0d7eb83410d36ef59a51a59a57d20d35792098e8a4fdb4be8da552d6417f59642e2dc6f884b2a13eb2b5660cbe9b6093b9594136c12b129f698e1e477c142af4b8ae095a3bc742459c8be458771420a9025e22beb1e9ae70ae44d67d263c21cadf4ab7d262698b8d9044dac1b3789a34b3febb377a988209244fe4419d5f6d446a9d9c9b17577287edebf616afc66dcb570ffa5a73090c9709f6beacdd736cf3f433d67f71cf2df2c21cfbfe4d75cdb25f122aee41d1703eae9561db362f26fc6e0bc2ac50a318482256a6f8e3a16baaafbb973ebe9cab5e16b52c4b8922d2db5275ac70b19841152d10cb99466dfa3b1e654f4b2384c26dcef4425c6865a868bebbfc88ac34cb570da56dfb1a23316ed92e1d3e0433681b595b51a4632c6b18ff8d71d9f82aadd3bdc3542a0c83d055fac4bf608a48816a932419c90ea43531d3d0e563f494ce175fb4fde3d1764f3b39fb7e63b50fbe5dcf904903ead5b544b6c820cd58c5e5ac3f03e86572e1283a1413c1f09c513c25e30fd9420bcaa85685b0a085e5018d9b0c7bc36ce7e237a92f06b1ab02c50dc0b55a0ea360ada2af50beb39ef17e41ba6b05fb16891345462f6bf3f80814ea24c43c04d40ac9f7d6b72dfd59f1435111cd14a434a5eae3e229f9a6d29a1a83f2924531a92050776703ec1d37d2c88302a1e5ead9d2d19ae625d77416f092e076e59966b61af53783966ebff7768a14f2fbb9bfd95899143456f09f0c60a1237bcb97945be3c630ed60acfbbd7a5e4a15f47d85ec3eaf62f836f71955fae0715173572ebd05bbc57f4a1091d0ba1935b2de560f7d2fc842344a3dc46ff2d99469bcdaab97f1ac8c2099f650bdc01308d39b2143be9644309447692792e2c34e6995c4a40165556a8eb1d9be62ecbd25f0daa358b0c068914204138f89abf93efab7ef1dfb3453c0612a8dfb9ba00f9d16a173a3af7f592faf4e70adc096abc0062198932feaa24e864b93c8f86dbe3f91858721ef78475a15d4b5340ace6f3f2502f2277358397e010c0f7fd3c0031b7bb0111836986f778c920eba9ab779b4aba6d5e4cee9d0f5be0068725bc89f0ff250000000000000000ba57000200000000b66eee59ad5c9cb30e0a341f103f6dba58ce707d801096be7b947e4ab09fa401ede9aff97cdf256f1094333bd8c70cdfde35d8600a019ed8e7e5136c0a647073f8aa455fce1045f406f646e785d8c16240def1b6f17e22875375f482dadbc8160000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000078600da8f1491749c1df73c6aeb05e8583f5c8cbc56a70813be126edf09d52a1992ca9dbfcb50bee6d80dcadedab1e8afad395d2f49d1a96697f46be23a4db5ecf733eef0855cd7d1b36c1b4fda9fd3c967f77e23fe75d5e05bc2b84aef6a081f470aa0ca0f4ba63df883d53d46362d7d6adb1c1984cf7a6865865bae24d1b92031afcbbb93c53f5fc9d945c7ca28bef2806dc95f5baaf356cd73716935622bf6c02089c2aa3ef7978bb2c696cbe048d94de5912d792e9fe54bf71618098b80fef280a073eb563448511dccffb73bae916325f6d5f1da340c91d6ff71cc08c92700ce24d9d9d3f1f1feab721d159d58504575042aef8a6effb28375ae8866899e0d3c80212eb42679aa5b7df6e14a68a39bf983588b1e0f10e032cbefbd25105cfb5d0c6020a4490fbe01dc691305d461fddd65be2f0d2498222cee3c4b6ca438f60471bf2022fd05316cdb52563163cf2340f5785396ad6df8186b7e8082e3ac899e305557e03123b1cebe3e02f42c01bad5181487a197482803a68353dd92dbc09f5ede53ad1020cd70287301e0f1cac02065e7d7f1e587c0f3363d15105c3456dee34b7695c346a445329ffab3fa2d80b58e65c7ea3b07a506e00a7c8e39b3b001d579c831f31b5a73d8ac6351d3842d10c07e6b5d1118b51e8b8aeb712759145dd31571e4de3a2d049fdaedc49fe41b4a5e9c7ab30bc6a1bda2570cd68f69486b04ac7aae4410936ed7d545c20081bfc9f4cf1dfba0e47f0ffe71ae0e806bedcc92db75f068a62bf60617b33dbd5afc475cd86ea980fa17d2acde1a90330cc73945eb583a20645edf223ba61054191cc3431a805b49dfccc38a87c316b99996110ae1894085f6ce464d720a4ddee848684fe05519e75f5fd6cbd67d6e21256c222e173be4ab8d333074d301e6b35c2b63ed5f574ecf7677a52605de32da1a2e521c1df7af1caa83d9d0cc744f8e7fe04e40c2d68f8b3acb7281d00064a4828e5deec6157132dc2f84330c643f20e0850b01b89b20c30b9d766e562490930c73421fda481f6e5fb5c136ef79050cfcc430d879fb5c4e78b6117a7af5c7037971d141d996c8ea4d702169b6bc3bb70dd2751466aa4d801c37975746da7fec1f99c1eca6091a6045ea16c1f05df899f7a9081df5b81a70eed117134564eb9c71592fb01b9da7ccd89639b0c0e8ea74495017051f5b4425fe806751ef54b701d5a6a348333097a12372195fca56e18e9be721d1e0500e56fd12f6fc3ef4d43211c35c417ac456905e479c9305e5b8965bd6b98cc2b5496a548b8e5c571d2b79655f40f1588be35ff7967e0f91c4c8f3ef4f06a2207771dbfdda0f657de9283c49efc3ecbeee754d96e00ef1a51eae61adfc2533a54d6deb364cabf0bccef932f856456041126c91378e64b31746364cae77ada9c7f3cb5de682b2a03307464c362b7a47d1ef1064acea108c0f5f70ad9da9a7a8afbed358163b3ac1b9952624e4d29afafb6333cae414f2003d7b4ece41c3070f5549cf2bd6a6f049821ee3b2ca9ec69356f76b937e17343d5e4f88f7e19d40ca5b9526c14a0a0ed8028ec1a5eabc41fb1bc2bb25664e5c301d642a35f4ce83247d578f34fef00ad19c1a12d5ce0641f5e7e333c601997e65e7b0f05b4f056ecdd25234d1e37347ba07a88a700f649b27cf2e7b55917b1541e93db547ac5df42b71ea21d855df6f4cb984ad802d124eee3b9c6eeaf025a6757556a2cdb014c654acc2f73fa61a2a478f0d7ce3efdfbacd0037a5f3731108f27ec1bcc55945ee73ed17be4c62618383605b26b7439cac246d1ebb617a74037d6d635432e370b0fe8bee2aa842209ef93d950fcd9a6fbfecb5e7b8fe42cf6e0649644d4978f8b0bb5dd7ef32cea34165c94327a99a8a121d4395e58f8cb4ac6dce6c19f487bd22aa62078df3664c4785c5afbbf62c6ffeb3fb037c82d740699107ca29141308958f74dadede34576b92a29e0847696279ef5a228578f555f10b13ed45db6a1c67155ed702dbb27cacf84f138182075ea1da4e91bb1ce4c0fc76abb07e880548055fe45b42e25d16f4e0f8282913fb4ce1da5622b391271041a5d05193709f6437fa3c5713aafb2d448cdc50ed059c1e3ca4a1ee8e325e50c9cdcff2a09faf750994260fd649737f645e1330ba018d2d7fee4c09dd294210c6d9277f198039647134cb6cb17f26d9582ea28e1c6e7cdc285a5293375e05a042647e9983f3330cad4b6f9c1cc7f89def9e3939985d615df03d6a1546e5d4ff98a8cf1615514ec32743597123b167947722cc42303a3dd2bebf95f577ca6cf36d7c14b8e801037bbb1e1c19473287126636df81df8b3267598bdba91bac1e86f787095fe32db6463c4c1ee5960cc9f562c06c7aa7843a92836e19d6d05d2f17542e013bffce054c233ab15f3a4ce1703", "65636a5153ac", 0, -1216581211, "48af4464544099eddb0980a4e6944e82c1cc6ddf738cad9eb33c1b6bffc39c34"], + ["8e9bf26d01e78a2affb026f32b10c6b36f2bc3c5a25c89066674919c2275e221bda1f65d34020000000451635163ffffffff010b6abe05000000000453515253000000000357daba00000000000000000000000000536f6563a12210fbb0945bb97a3841116e6483ba4e419ef0595ec68d4f83f142dc2af892e239957ca9ee905569963b1c74f573aaba90641b0d0416981cf4c11ac9f09fabaaeaa010e51e4ceaf32dc8ce5ef6337abdad54717acefaf92225335600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000179cbd5cf4bc16743b8501f79c686178745329d4fd38e003d227fc5e42c3f9714671b84dd8f6adc383d841af38006d773f9a76da5ea01e350f550306476da3b805b5856a9b4ee6ecd949b073f19aaea002b0d0e51a884485e2ef92ecbb28b15577342027547047dbec60be24c9cb6b5aff9b318352fc11dd68af0db459c38bf00315ead984fd4470b11f2455007fff4eec4b47f08f603e9a1e1955d0feb799e9e10326ad4401e436ec6cac24236dfa5d21cfe1ffae64e84830d4fc6cd74070133ff20a04d4c1b01f88362a42e2399bdff64a4af357592843dc046497f6ffd91949e48e25206147d23ead271cd5c3b37ccca774309a977063422b0c39d5e4afeaaa5f8a0322aa8db8772051b2065eea7006481855987deb6d42e8c17fb70488387fdc1aef0320baca05330967fd85114f12f5068ffe9c912a4cb5b9f34cac14f28da4692a5f030de889614b23913432abe336772f8f4f5257bcd22221701b285d6548bef0d29c02113a64b97546321d854b3d4806dfdac68e5700a48691cf69139e33c13a222c0d0215e4647b449343a0350e8dbfaffe90e8b4691daf124d5bf8ca6db765c5e8e3d52c8cd1fae48812cfd31c486e3c5c95af655100e0e0a2464b3308c66925f267460f4d5a0f42bc7af434a8cc1046f85c303b048e60dbcd258cc99bf5569c8da081bcd6a3cf7747ba9a74440b40fe3b8f02364082d86fe7b24d1c1d818d43cf3c72551548fa04b9751b42ec54cb0a00508c4a927c9ed35a4a475fec45aaa9d5ce9174f1ffd1dbb24f014fb3e790fe611763fa91680c8fbe7528ed0367d98ddb7cdb9fb2b0ffb3a518260e643360f1b45ec172157759be027a586580cd9840c1a70f350ab2ad7f9cacdac29a703c011aac4dba58af05b6756c58f87a8523da6ddce22a0146c37f964380a44eadd5eddff5307feb4047f163ecce3f97053bf1208f61a09f2e462e735c157171acdeea5c7a0d1dcaa0454ffa60c5cc8a61838acc522d049d7c3c3fce98a209befe6184ac23643173a8a8f76ca75a9d5eadee94212eac569a04cf3abd4042e082362bf4dca6ea57916e70a67376023882e8941429b9f370b6d0da5d0caa00000827ff144f64077e154b24989bd0ca478bb0e28d8fc68c18443ae393eca0cba38ad0923ca60ff717038ae1055894439ad47d85365bedfee877d5d87e63a456d9b9f53a8a734bfb3dbef9db73cbc041b5522b1e265fdb37d1811e2bf72980fe3380c62a0ec73fa1294f45ef39bf8d2f869fa24f2226c493f800b1020695da1ddf54b9d787bdcbda322bef031a4808f874d414df933ccff9fbb435bb6d50c62821b55b49f9ce0c51eede2ed6f9f4a96e2a91e381667fe2d7d861710d28cf8e8b4cc9c7b82439c0c058a784a0b008ee648818cea7d50629f62833b5d5328c08dec07260f0da7af1d1ab23709f60b3ee00e11b3d0e48c746fef6725ae98a887d295e55777d85486aadc3c700076ec87f1e965188a4911384a1092dd7e833b9a05980b1563c0774121a175df75147b64dda17a58d0d0571d7a8277b8411dc1157f1743ff92c90ad0be64aac867d4d03cb6df33790152859bd788c9b279c9407a59ec3b0f72bbffb4d83160a7fa47a2123cbb4c12ed6876087605aeb69cb62607f3ecdc625af66d5983a355a72a299880197426f26a4955edad2516bce71d7450b0e6fceb6461311cc57da93fa853a9badc68cb13a198991af04e8037d5f5efc10b80de66c45ed71c18b922db0128e0f1a0424bb07d09403d78b60532ae2441120307efded9be067a6b79dba0beef72a9c9b2ba97f47daff015ff672f3a7f7d95134a778cfc3b73a9d61e10a3ed134226d1d490c0d84c1512c41abeeadd886b1f3ef37fbedd5ea469f4ce89d2cb06dbd8bac0b0697a7fd2de09c24ed08bba770d8b99a3758f7b809153950f3c393f6f25fd2cbfc9e015742def8713d047919baf429b1333107e89d433ec95dff8882c99e484d08754b5b5eb404277b108d2324a345595a591cbdfab37f71264b8aa2ac3f011f23a8be340506b61dc72e0d021c92fc137f810e432dd9a04d56a9ce67ac15420bb0359a9c4b188c161239fa91f15c44cc92f6cc2e10b7d92a98a93135f55d4616fd209e3d4641670143039b6cb8852eb409be7095b31bc12f77194c9f0b7389d6924975870ff43748fba45f90df9ee5885bda345fe164889d0ce92555f8b102ab312dabd07fc0103db139eae5620fb9aa28a350c24295c532b3b171d724df3a097bcc683f183a8e407a13b212cb35d64277635ea18f8f2a081dba67df010000000000000000000000003b322cfa923d5e7b50d7b24b8394fbf1f45fb83e2ffd8bd73fa4933d4e90f99dc956d402339ddfc33bc30e017bf575404f5034b26123577f41b4e2f0375cdcc2e39e7001ac3136dfa3019070c0a0b42b2e6561d74e3fcb142189044343737e30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008f93e8e24b2f3fae8459a43a8cec3ba7788fef294470b18904ff9f8b94155dc16902ab882f951cbd994b795919fb49e3e23cdacd2185fcac25180144425c9c6cfa9bccb69a03cee537fd26d67f2f44e0a908b463c0b8e3cb149d3ff3a0aa2e415a79ffd5992d409f02dfd03e7adf38b0cfb4254a151f5240457095d96761d3280300c9fb3c43e6cb54f49e67eb43bbc0bd9cb7460d415154ba080afa5e005697830220efe61c78f60c6fa3075e8dc2162dac967a29fcf5253d39b41d8924ec3e59730b00126a2d4eb1711936c5467028d8169c592ee61249a74f3908da1168630da86d3d403593445f49af525126d5691228c9a4340b5a057d49907ff77f1ae964699b020cc8dad5d82e0799a15149e03eba5c55d5dd0106355b60787eeced125eb8cf6b0221adc53257f5fe8a0e077cf95bda280819c582b2510ce56046afacad4af0fb88022d3b7d386a4826fe5a5d916bcd6ba39f6cfc13c350487eb816fab3358fd109090314880b0722c235fba2e09a92206fda596232da47461a0adf4bd1163dacc96220020625b9aa1e7794062eadb0df4a5402460b2ee88c21a9242d89a4472437d8eeb8021d5ceb1904695eaa5e605e533c1235538073908e18f649a000a53087c60ca745b5e0da61902440e9ac8b03449ae746143c9ca5571f575303b127a3e06bab8b4ed7f637d714e3c75425209288a427057b50ec6ad1e09d1b7a0732174a09f8b2542243ddd5e70aab6288adb24f5fed336776576f26cc3f052d35812ea832f72e5a3927006cba737d979cf1f668c169363e48315e9c7daa25657780442ef943c35ed5f9ca19b33632e56ac1629339b4a2c79e05c450eb43ea53c8942335750db248ca962ba94e1186f61932a33884508ecb82030d4f50bdefec949627d1b86a77d78255486fdd883949eb2617a6d578d801cd881540c1c8229b114aa734b3b3bd54149f9592c2d4b34a4b7cd5ee95ab49c60217e4b5933877d360573958ab0cb47a1a8564f195d9c2c4518336b43fa54b988d27496ee9d57f32c195d33038e00bc2fde6bc8c6dae83108afe8b81ce0a09163c1f58f5bcf298ce15b9d12490b4f20fb91cfe18b538893a821fc901b6f6042b0fbb42ed4c73883a5e6e130cb3d4331235b4ff276091f552fc9d94cf767013ac7488742d9ec03fd07201c2c727a81bdd82b33cace27c16880a25282059104fa8a4a07b2f8c0e459a06939053c35815bb8ef84712b09073694895a908345943c6fd41730bd154d9b55a08a95de72f8e2442d591d7d6dad3ca7b572409952ee795402b8a939e4558353525715cb241c5960f9e74037dba773808d2bd88eb649158a2b4d0ce7fbad1a8c58312e372f088d893e692f821bfa5d38b8b4a12b5e3339c68bb7a65f6e1c5f3f279519b9e3a74d8029416e4a0cec7ab502ca301faa60e12dc6bbe8172be334f153493b54ed9a4ee22a920891e105a79c835464945ae9365e16b42ef57a6d6762514fe5554b5c4121da5c8473aeae6d5d09439b808a165f5720869219c3c724b9441499590b818ab8969c248c033721e4fc1e3144fe5b6aaa7b412d556c9cdc2ad5622aeb64c70e9fa6b14f4168c4b75c2c44c125ac3a5a9dbeefbd6da47d6ddf4f47baf203402cf9ca6472d5dff705568e46ababe115c6dbad8c4a3978db8617f29ec5d0c995045fc80458f70e35b880701a5da00005cb696bd6d200052b802c384e38d5bdfe27c1dbb66d52218073c9b634d9c031dbb30f586f375c7e9cfa9f87b262489573545c5038a9faaf5ec0597d18b9f6de776db434a0ab98245a269a1aaf4a691ab62ef7f9daca93ecd94df569ed4b9b8628a1450ca2e1abec874895adcbb527fb4304117117de15a80e3b1236cd87dd183f3f48218302484cb2de837486ac46b5ab98caf8b91870776fe9d189b78558934f2715b63736e0565c345da267fd57d499a6690e41ead2111d633e465f1a54bf4a3da5651c3a5c9048ae45522d0c18a103f235cbe499375ba45762f7683738b842bdb8ce0d7d0dee2083d3e95a72bbd14b5443c0ceb956e395bcc4bf6da7b1093bc40c7d762f88d81cdc7f941a90e0637ff7ad8292913ef88ce84d28cae97fe2c9c639304360a60a88e0a297b4a07c7260fbb41c43128a6aa8a6618c7e384b96a9a07a097404f1865ca07b8659f0242e624606551cfea62dc1867003234e8cff0b52a86e08e28025fb68d21d27d64578ae6bb207146df62c99b86d3c1545c78b5fedbc053876f1612c00fe14d4ee79d6b91a154f5731ff538f413e0627da0d6bad41206f35b7600000000000000000000000000deb66b39c5e27f5c581a623a4d5a5f22bcbe97d01797d92d9448d477d8e7162436c675754753d45d601ad09049bb2274ed179c1be136b1b2e26e55d7ae1572c4f1753afd9c23a8b84442b948a78b4aaf0259e7fff93e9a5fcc532b16113a2fdc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057fc30723a13f8775fbcfd9de93b3204b6546b3229fe80cbaf73c2b0ae29c057bf8c7d93a2b4b6ce9ff73dd6f569a2e1ff095570f9e95f13199d6f48423f438d4917aa8567be351e460e3158d539075f94f7ba745db27cc3fe7cd1c47264e62eddb089c88b5cf88ac164505ab3b344e59526426b5555842d7752bc208a40b726031180c4615556179928d58e6f837774670e942f2ee1398967ffa90409aa1efb5203016b71d208bf85a923e7df49ebebf8db25390bff687dbe02fcc327281fbaccef0b010ea13fa5ff4becfe1ed1eecfbea144bbb91a071570578762c912b5351d89381a27cbc490bc3a66cc55f29c32e87f56f678fc9fad3a928f7c65ba04b78f09f4020b300668c8b6188bad08b14202c9f6ef46eea29ff66e6f37cefb846151dfcd4c0300edef758e8405f56393b777f6f5c4c11c629c86fc1bc1bb93307479dd0d9b220318f428acb6b94dc22ec1a17eacfdb5787397d6f06b61493d0e8499d21d719a4e0309fff9209af9ae7ed33275736db66727db5b0a0f37d6f6469cd06d63d42e75fa0206e40807c9cf7b41e45aed67ac0f1249c7eb902014d95cff7f85b87e9b49125d703bd8c04d569766ab41c0df470cac328f449322d7627300b12e477b5f1575d0f072d5ce6f8160c4e2bb457e1cb1f34da75b84c6154391cf6ae1aaf4bbb225d99bb1053a995bdacbfaf47e5044c1610fe139ab4c27c5a2de8f387395eccb862d2965c8cf40cb1a161451e76f6dc5950a67615ce228bf0ad96a74bb6c79ce6fa0a5a6a1c8942c71c1d1929d621820676ede008503c8bf08e9402924f5632136c404c46c9c0163099c73e5903f75e9472bf3554f23d031b95e018cb91a15ab3dd82489440bdade524eacb8bfd39bddf0445c34b9351f5736aa88063d240cf0b74c2b611f0fb892e68d4ce72d685d8298e39894287535551d96e2a26d11b5a645c03bef638c1ec48de7b10036aa8fe0b9434591ef728a5548adf47544c507012efadd68f064286bda3f54a9aae65125db6dc9a0398e62099929cc5b5f08ee22f29d243d990f922b40ba3ca91e2fc2694c221efb481ec2bb9f7d8a2a34d09c542eed6889ed2c83e0c6d89d95f43846318c6dbac7e33245bfb916ac7ebc70dc87469b748fe8883a0066281555e6e1e193efe1094a711def6118e0d70c7e5df01e36f57e41aa6ae53928f7bad92f1b70ac6d19e887eb7b79706534769e2079461b183233cad920281bfeb7690ae18010e331abf53652d3e8a4d5389b3c7181257d12f8d1f33bbce41fe992cb0a4333154ba03e56c7783fa11f460c6e6605de0828c3d42b823507652ebad57f860ec1a4cdc28d6ffae71f70d4d724a9072b724ce2fba716e8058f5dc6ddfd5259a4f65c923a5cc1ff2bedcb7e7eefabcdd9f4519b8b2f9231877e5a3d3c4f014f727b094df92d6d4046cb267aaba0f9fe0127f9b16aebe6ab0a2ece436df8d69b7f984a866e8c3ffc1a92bc76120d5ad329576b6a8249a6ef48cf2aa98f62cd504633f0d176000e3cc677eac16daaac6696ddadce62ca0855bd227531dca6940905a1c4416cd781e5ecdd0717b79ab5592750cf720f7eca3cb602c46fa6113958330afca0f827894cd2223392c7e81c95ab713339b980988cf70c8c788817ec69032c6d689473b09cae039a249af93b05fe8f00af8cb396106ae52e55b7349269733d5bf1d23c900e7c5f8f5054af6d15ac9aa34fa57dc9eae83f9b54b7ec67517a319bb74f44a9091886cf15a1686bf1d414754f17487da5a2b5d07559660c34dfc53ddec87784a28c5d618a40b9c1a59e58ea9b17bf61b10517647ba0b9d637ceafa7be6862fef09ca8128ff89a3c485b5f75cee17e0271bc370f1368c4b035074fdf5299fbf4c9b067e02c66d659c1282e0de80737cbe51fd747463586aada1da8c29cde1173336741d38f506c755baffd4f9a26302396c442226160bf7b82ba65a3bafa436d84985d88e6fec3f82250121e70a06d3efc9a27c6b034178b0beba91713c7c9461d4f076364a2fee436cb17e025f10247cab823a7d454896bd12ae24287a25bba3aa2ae97552d2d72205d4491026ee88a48475a3f9967345fbfd53bcf3b00f72fd2e8dc6ce2273f295518db94fe9657597d1dbaa202c8fefec14de8dc5ba5219851512ab09e5c9f4d1895570a505206626f98f4749fd611529f57e851e331e34e253383ccdd1aa08aa9d1fab9ac475d7635a70980e494c5cd5b90f9722b92458ac03dc91522ac627a79dbffe2047c7ae50047b3f23e84b6907beb42302fd782af67f4a3631829cf4810866ec6181fd1512bc590b359c4fe510d9968e0841a83f5df7ea7afa9bf6612b1906a823b3f91a645e7d48ed8559f4ceb23324917edaf019d5e748fb0b489ea7c824ae207c04480a37110f5895b4701b73e9039c75f8ef700", "51655263", 0, 2093713635, "4d67867139cd1f53422ddd8ca73551cad09042d5a0c032d483ce9b10ec558b99"], + ["030000807082c4030301c59e0b644f93be62660a5bd0276f6f7ec0db62558a62a4b9e56777f84805a0030000000563acacac008b269293078ebc2563214f2a8c853bfa20e7dafece994c6395a1f0a4b2d63e701c92487502000000046a6a6300ae832a4f574d1c54931fdcf3ef1eada2886db3896af1b92b307d11d38b1b501a2db6ca17020000000665655300516affffffff01d3876405000000000863005351650063658e073e49764429940132e28901000000000000000000000000f3e41b8abd9ad29ce2630b48f7682e66fcf11fd746b310cda097c75f1e8181a3727d24d735a60a178aff7a4be80c46c4db20debcd4a305ef1b87c1823051946ed5d2c3dd81b3d8dbd56752199ab0c9afb46b18de42270f30a8125601b2fe2f050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000056403bae02430ecb72af1e8dd9b7e8e88fd4284ad83d4cbbc5fafc065b22eb1b13dbc36e8e1f18135aaa46e24de2e47a9985c735eb5d70a9bafbb83b9d24604e405f4506b564b56be02fc1347cf3b0877db910598232e0db2efb8a6fef6c090a642bf1338d937d1a54e4188460ddee4afad69d6fe92031fb6de2737ae4fe72a0020ea0a68248c7d221eab0d34b7172ecb535568882a178ef09166be6b71de541fc0213c0efa34a9d77d74c4640e16fe7154dbcfdfe967a0291b7200beb4a8fd96c600b02b030e92ec02ca3084c1ec9e345e9e4ddf184b9c3bb7b78d99c93cc8b7f5df8d496da11ae08ddc1bd542aabb5d7b1ce0213305f9e58eef14a544ee1754fb5590208124be94ff570ce2f9e520940485dd2cd546dcfee2ca601465180b85200afb70327b7e6404b87b3a040e57b6445e3c80d52b5a2956a1c3b61390e2be6cc65951c032ea9406410ec0fcd99372a08e852f897fb7f4bdf9735f0f523683220b682224c0303fcfecf980d612e019abbb6f20e76676f4a980d8702ca3251358fe91e5a40770325fc32c798dd2df9b2914fb8d083d13bb31bdaaf88530b83bc93cecb2fd3e8aeb27c02bd7cd708d01fa4e690fa7e138ff05cd213a4d3a471a0a4471b12fe0f507bd7eb6e0d0f6d1e207636ad4e52379bd87d9f8dc3b122b486653d04d70e598c55de73caee4b341fc1099bead01eee9dadc7116b4445df2a5d51c251a9c6c58c4806c63cd778cf4fe290354f2a9bf618288c5df0016ff4111bd1275494b95dcbd4032152b7aa572306f9794111e6446ab5d22b5a7df5ea2bb226b8f0ccd2a028c60a57a51968fa64debb8be73c29a8dc46deb70ec02201a5a69777e8c6b37df5fcf41c35563612fce1dc59b75507fe2e3da6c32778fad833a013ebbab6526495e3e5075062e2a6be93807cadaeab39786413a17a26387c9169e00f075853c6c0e2d52c063ab8aa512465be7068ea543fa994dd12a88011fdce2acd0651c6b57a29cf2c53c159f8b91569b224a953dd2eb336a848613dbb3d79b1806867ac9dca09309e81e49bade92176e7ac45ae61f041fef3ba6f4f4c6b00bcedd761d05fd0b662a313497ff31baf6fa0ac43e87ac1af53b685264134680b660439da5435af1c65d0ac4570a8a87183ca766b9f11b4dae38d1ca347472b3f78f86cf381127ddb25835c562109415ec933a1e25935a742c2a96783be19b58aa17864469d952ce77ae9ac84b370d3f03354593bc197ef56bbe63c33d79b2f16d884486dc13f8068eaf9a2acce98aee9797d8e49b0ae1760fb07f2424648a2eaa7a794f04f282457b0c10a50fdbb14195d38b94b5e1bcac6f92e4db777c18f08d81ebb236bcfcd12034536721650e3ddf0dd0e963cad6f85f806a03ac49229b9fa5b5ab781c381e5ce8ee70f3e5d4c74ccd35d5d601b2e0265723fccfb66b830c924ae594a55c169ed8a3e8ef036751554e7292cbd9e14d8fdb281df3054af02eb550f8151ad3cff450a719cc390a83a617a1405658d0adad01d1a8a442270fcb739da98ce597c5c7ff3db0bba7635b3dee5e955241b06c5704dfeaaf97b276a5944fba1256c65967ae2bee4bd81a1422012ff41db234e08302d44fb49c00b070863c975eef1617bc8a26f6ec1e2757f6aafef2e97ce3a4e3c1d6c724d4f0194da9f4641b9ee064885ffed537e9315bbbcd6aa0b2547ee0458b29c1324ce8678d3160d07f0a9963df42a3a9d93c6c8a2f027c04934c9d4a33f5f477db1605653fb9c4a89fccad70841b266c9a1c51d895ba0a5b3c041671a1b7051a93b0c74b9c6c404653757dd2e60ce770c56a28552815b11ab73d044c4f3fa8f7d19c6fac53bbd1a139b7bdd2f06d7622654e18e7cb1741c6e5df1938fa26803309299cfc52dd844aad25a34aeb1625967fa57e880d90089cce06f9a9079c7422e011a72533f2faf96443936706374621c6f0b633f3f6760789ce8298420a3813779bba46b46d93e67a748241e8eaef9baea7061bac3a66702a7cd291c9c2938ee5eca6a6b99a6ba69784a504867feb64abff76dd4c33e23e1f1da0ef17973e97c25cb9ac78da4566621976ec7cc7e0c1d5ce5840008c98ccc2e2d2b92140d75ee19b28131f5b15a5f9fd498e9f91c26e4bdc62a9e6de18653e7f333db04dff7a19a5153cd177e71d524a3b09f70593c304d78e982837dce54dcd16cf0d5a890f2ebab34bba3148bafe92b90c79d655ab4573ee202cda191e6170419c026dd0a447bb8ae339e8e861f23b2da8f9c77d0809532806e8edbdfbc74d5a82fad5b1f4900ca42adcc1108d578212bbadb10f5a4e201cdb391d6403c84d7e5a297f6d8c889380cd4aa9cc17f5e1214d3a746a9447ef5f0b46ad94d08452e9d989d17444ea4a8e8a6dc1df23c82b01c4aab3111fe28c66476db9219fc8fa45e570d", "65516a65516a536353", 2, 1429609186, "0dad95cb6b91cbd29b93b06c8a731c698af62cf1025b4eb1ab3d223cbbac7ad8"], + ["030000807082c403024db20a77f7383b3a8f0b2a4d731cb229250ed1b438df1c2dd90002052e0d7321020000000751acacac5363000779237fcc4bafb65e2051811c18f2c3e37b8c403a1acd429dab9d45f38408c17985b6b30200000007656a6353ac53acffffffff03623ef700000000000452006563e0eefa04000000000363515144b97f040000000009656a6353006353ac6322f932660000000000", "630053536a", 1, 858978262, "714a380d30781241903a012883ae0c575cad54f566983f35c47154f0f289da3c"], + ["030000807082c403035f09d063d0b40b58ac9bb9681d8a23ad2bdca8b33ace87da0d0c359df5ca2e35000000000852006a52535253535f4d43705b49bf8c2f203089c0b3aa9f298a5fa73f8286349e3aa3a69baf4cf697e53a690100000000ffffffffeb980ecd84b32b485e02e182743ab788d17914b683e17db9419dfc1de84ef4b60200000008acac656a65ac5351ffffffff028b04aa010000000007ac6552636a6363f93bea00000000000500516a525300000000e8a666a0020000000000000000949c2a0200000000fa31c20a503bf33812a7a0304d321f49184db12b442b26dc7074e45dc8ccde4f518f63a18ac016a8dbd831e00b702160d7c57d6f0cbe0f58a988cd052ae572badf6057fc5dac2e8744d113acb528f1f5c2b131331b358b970b796024a8e58e0900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000923503860251077db5be1a2efebfa070d83747211430f53c242142cde7fdc8c3bec50db4d50df073704b0cdcd462c8ac4a02a548cea3a9d8006d0785337aa6578a36740e05b0450431027c925367bb4e6d04b3bb63dab82fecfcc131bd1a3c58ccd9ebca1a1dbedb15f4a82943664277fffd4ca060bab7dd17919260aa925fb40228c66d0050b973ac486dff92deff5981154e4f7ab92dfb024d36012aa7ef07d10303a1bcf17fd771afdc389d2716b66166be9e985390891eab7c579f08a95ce5fd0b05c3edfd5e96dfa1b65f385c4e2fd0bba3c972e9cda9d88f140d69dbb2f5ddb2cc0ace3d9e92ff827968bd2d3b3fbf6f24543002ca36888895d6ab0a3fa1eb3702245fbb01a52e73a1d169565dadd7b645b12b785500644f26c0e13cacea6761b602264073386ae0dba6e360496d7a66c8c28cec81da52a26a550287c91b2e882e5e030def02adc7b1a92879623fb4159f22c9c2479ac076ddc4ad3b8df653f87dedb302117769a538e2c308a37eea12a0dfbc5ac4c03c66cc75b97d0a0d61865d459a060221de8da9beb8f2154feb1b93719ff4a6a9c489fc8312ee132b5463043024fc60f05090dedf18dd3d6e69a8eb3e043735201c5e39debea65b711b6ffd85a525cd1160a67a9a2e8c381ef1ea0b385661d9a9c1f22b05b20fc81d83ef0e300d50a85054547332f182bf56c132bfb756a8676814dff2e49845278ffaeecd185b0ef04a7339247687ec9ad1c9ac22da5bee9225d736d6e24098873d36017d23fbd1820bcdaf70b734f09dd2aa090a82c2345d7565576611e107cd0652ea8508fd96bbbe0bd526303815c5b9042ebf4d98a1f54b4fee97ea75ef9ddddff0243a5b689c0179545bafc9f66f6081891446292edae9030a760b4d09a1d3514a68bc756e964f3873437cd224f699b9d2a5a02e763176b1d6de89213ce7d2dfa48a54d3eb30428bfba5aac098476cb78a27d02e948d7792b344a6a6f61f2a4169049812911d34695725a035d16695b8bcdd2e2f08e27d50d5bd3ff98607233755ac5590616a4231277f6c61ae3b40ae2dcd3cd96e6d23742c9a3bc39c135a37c1cf82947f748da07f910e94152513720d8d4f920cb96a73517553b865cd82b6f71e096a80e30a1b7ce60ba1e01350d265489738cf9751c7f720fcc8fa28e81044e14efcfde7eca71672721e19e1e7f1b3ab7ef8feed5eb66de221c9edd7a6fce08f957126640242ebdddf1b25e93f0643e1060b843dfb2bbe15ad9cf920132cb6610997f142f1e96778b0df604184b0d10e0880ebe6d9ef89e1f99b8102e9e29cec72828d41b74cb7ba0c40a8280b054bfd4c98f6faf5cc42919737dd5a0dd9f37cc483f172368ce9272d850323827ec3fc19415b49b0867ecae2e2231d4ad0f974c87fb4b9ff7da9ebee03e6dd37fd61fd87f77845305d283a8ca520ff07c0b5e6cc9d20eed8a6cafc02a59428b8f9f0426442ecc445d7364f57ab566584e5dfc566a387db0693d6489e76b9de7e79eb578df5ae13bae774d5547c6d6f7e401c9f0229092488fc492764e9fedc4b015264f68fdb3dc9a2975c3e3b3292d5b3fe769280f31def8f02015ad308669c5bad3fd0156a093844f8e695618b4525d815e5d9370a77e0cfa4c8808953da4497cf9dacbd6d171b175f262e97ada18527a2bd2b65086e36c8b306b737007c625a7729c7bdb822db83bdece5952287dadfd23850cef1525240ac16b9085a5377f62a1485c7386025506bbbc46335b8040b7ffd60de87a4b4e6c71c95e0bfc79cb7b4bacc2db6266b5c3f51601dc600102433471d96b90d263c037e91d1e93d49e3254881cf820c131c79dd9efbeaa8a19910ece49b84e82404679e8d1c6321e5ef3951bf6c613ccb84d69d0d73961111f8000419bf4884412eae1254c7258613f446080ba73f1eb58d41f54daa29dfac5eff32eea1969af3cf7dbae172943126a63f2b2f3cd490d89b798b7237949a02bdb2fd60ac96ffccb1b9827465bd416425c419fd45914096aa0496b9c112fe73291f07034f4dcf28927a60949f6aa8989f5c5d571ef8e811ca86eeaa3ffe4a8ad60dea85191cc1805a890d2297437fcf72ce77d623649c9ff9a550a5f907588bcfa9aab7272db2d4be164b8ebea8e8cde99eaf4bc49929eeeee9841adb4f6ec61db59d78d4746f46482defa70ffa8d79b1affd9b48112df1b8131f35aa7772457a5fd75ebad3149603fa30707fcce825fde8a66444d8abba4fd431817ba1afa991ae6ad400227b5e521cd0fccf026e63afc2676a827da7888bac4a79020000000000000000000000000294df22446c07ece8e44a81433613bd9a831bca3cfaee23480f6beb836271ea43253938c457f770b683b31445f50019bdbabeda142bb96c3c5aa2552bd3d26714066b45f9816084149b4fe092b2c471831c824ae43f829dc69257b90c6ada1500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000becca3c95f6291c2f5fa38bf7985d7b9e311f05916826a66fd86aca61d38230d1619cbff1cf012f747e5daeb6264da5a5f6f4c997f84d562cb14c572d9af6bceecd7708bbe90be1c8c8224d3ce38cf058ceebe7e3922047ce83495fd6a94be356b1c831dd423c363e8273df5d3b73568040c6aea300036bfe42bca3287e4793e0205de0d0dfa7af26b653e85f323dfcf85c4781151bcbf6164b8d684799e41c3970225803f7a934450048d3c748eef4899e3172f6c1e368730f55efc9b5478af31e40b020c530e8e200f0b6358c1715dbcea8b728c7fb5c6e476d6cdffea974f3f34b3f12ff1d8b97f6975fba88124d49f6d1cb473d1b2465ea737002e121e2591152c021f6082ebb1e65d76cddf5d72f979f56cecb08aacf7953e37d0c4a7773d9008fe0218a8f93e82495715ff1319b61c58f6d5061cf4bbd422a6925ff6fa809cc6e718022d4dcabd00707fe6e34644722527ea4c01f1a76f4c9fe899849f1ede2c879d9e0306793ad6647459ef05df140c7282661e340dadd4811934888ac535eca88af0c70308838e721f08ad86ade49d222cbc98cc0647cdbbc167375f140d2316e7773b6e2e11ef6f89b1facff43cab5370e9f6ce7fd1c8bc24d97c3e7e3bc29e324bd283a1670bca2d3a754815f7705b79453452ecaa7c352886cbb9d4af318e3a5b9495ed2b13eedf279345fd1b8b6f7a7227b85c4e1f5ee58be63c3e4f27cafdeae3e31021b1e82f8ca2013da14bdd9a4d23cc2bf2ada28b729ae225884ad3e835cf2240c03099961739e4c43c9ccdef105867064a4b98507d65e4e1dc85f030b5b4d8b0930d1c6efb79b6001d70a75e81e0579ea2fc9ad7322cac45fe59eaca596cea4f34e17a66c9a58c69f9c42f23a2ce8a7c53f1571716705d6a25fb69442c6d3b17c605fc9a41b556045d5a74b265b91ba4fc408b9c056203cf973f7242245787ae756070ac2b4b59ab7928a9ad66efbdc7b63d82512ad74fc852baef0bc11f73a12d0259d4706e455331dbd20f015ad8cb4960cc3797f0d3d5e726084115cd267061c98b9c2663baadfa2c347e1d32557d0ac45c9e60255e1a0f46ec127c907acaf8887aa3f63a5bb43f197ca589e2b87b6b0abb43099e9aca201b10a87a4d6f3c252a0b82e4d0e653318c7cc18147cca7ffbdb50431211fe0329807dcea28a557cf92022dc8a6c7bbe83f056a300538d879659f435467ee288d038e06276bc84a099ef84f9ed88742cb2227ae90401712d6d990388b32e4b8290762bf49cf42a824282f18917881fab91c95a6ec5f0b5367abd32018fd8ecfb7630098150d4cd3c75f14c554d1ce13e5398f3030dd00eb8e3cce5fcfb7848e426fa76a35a3f4980cafaf88a24ae80267b08cf2fe37faa0929e746ab720975470d260187675c08a03fe24eb1f219bf0eab4c9aa73e6c958281f645c6e4cd34c37a5434817f108d0677c2faa30cad13e51d4ccee51aa7c55fa2a5bf41e5ad975c40eda36e957de433c47c3b8fb621be86da84d766b0626f7c7d74525377d860c7e77009c6961249797bba699e8f41ad36107a8d058a1a1c547d9076e2db48a8cf319a1bd55bcbb295faf53b1d62c00e7ea8b2d26098dd606d57a5ef298b95ffa9330c7520fd7d2fc7678f92e0b4221f655e2752b69e3a9a1fcbd478d4370f9939517efd9260b877eca4f7bd24f806236a559325c27545b301386b80df644dd902d0823b2371ac94e6a6bc8cb33eb71463b729f192ad07cc337c30f88bfcf2f3a2b471089b9b4355a76dc95d784f35717d70bf96a2cd17ed6788f7470c9b6ae6f1198e594c06d01976a1a6dbec0c639f9d92914b1f7681a77315d441b3d47c43463549da2583870ea8c730992b1f61513a2838c28917d163c952dbeae21004c7ced8350ba25b82be995904aae6bb9c805b449b94bf91cd2376367518f6ec234942091a62b5fd6ce7ff0524fe57b456bdfc45eadad67375e419107800642298ee29b3bcef495cb74ef8c1ab09238e55b330be64ee73177f13dcadcdce35dddbe12dc4845b6aedf3fb825e89de3dbdf7b8e1d504dfd42637fdbdcc9d7e9cd40a86ffa98d206745ec6b08b1e9c5189a28ce3fc3426e96318372bd8c30ac2822feae883559939551ac086248e3657e931de6143b5ed02c8601d1428a3fd95f36c5dd07e49d84c4378150cb0fc4da8a1254d54449e7d039aa6672aa47a8046d040b82195c1fba148c5639444c2f807db3a2e882ba1117d8ed7acc223bbd90721a667fac3e40c4c81b4f0c4544b5522ae2fb4a8a6702d4cfc0c6a7e1d6dd843ebc56dd9b8f1ebbf28b184debd39214c1cbd570e77cd68e170befedf9c2566112d58ac7363ce36bac73ed5b8e6c85836840d451f216ec375f02d9254deccfd3c982ca07bab7b8d262c2ae52c3b48f964ef4d728dfc2b01fc75c32d4c05", "6a630053ac", 2, -1361619687, "f6f4699c9eb8c4ca663f70ac68b8d89189f5808879bb984146381d856193f603"], + ["030000807082c4030269f0f46167658885cf8b3a241d9726f0baaac80925354130212af788c14a060b0100000004535251acffffffff4e6e619208ea62a5011185ef5ac65e6b81d2d27611f462f820c18ee1f798c96f020000000200635e81ed3c01d48a0e01000000000000000000afc4017e0300062c040000000000000000000000006e700cb9cbed9d5b8f9b7364dd032bbb5b9407624e87e23a67752972ed01d6bac67cf3494b9502cfe0b7caaea9e0e39e0115962faaceea23bc4b83e9e4b22924304469b6fd2c56d875f98208bc2f79e4d63bc4a230996104d9b7bd5757542cd8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004b5a3bbbfeebbf3c09213856401715c6d25f4b3ab910a7d5515ceb9a150c33098301e1611886174655761016e0c19573bce3eb7f620847748bf1b5ea46911d8062b3b27b315dd34c03af1c7770897f2eae22d7ea959e4e43f5498c688be8ad10c4eb5997cecc6324e50f1747b773574147ee716917c4eaf62033ca32c0edcdb2031022fce50d61dbc48a5f877344e97b8733e93c4074f0450a36d86c40ca281742021660a822692ef4a1dceadbbb95d9f1aae463b18e1a3da1697f878f058585c2d60b047371d49b8b81922a2f46b0dbaa02e6df85ea716beda546e3cc6a824cc72fef1ddba554f4d777694c6ded2948961b3e975c888a4e3c93c31f0648f3a4099fa10225fc0919e4b3bb9277f7aff097f526dc82fed252bac271feee607e4760903f260321b2eb0d8d6cc43faa0ca78bba79fc05a81c59d3f5b075119c114e42f3a932080215b53c241d38f3946eee05142f0ff5788db894f831a47f44c81e0f7a276d5f2c0212edecf4d7addd734abeb50646b5f8d6f98cf2fd08bfc84b792f933e7ec7ec6f0319d5d946ec4045e96b1283f8406736a761fee8e53dfa265dd0319ebda895d0d4a92240bd8f5d49914f58b8549257a188989984bf71c75d3f390a57066129caebafa1a1ea16c2b864f1ee992af32e6a89f2714dbf09426a83fbd0d4db26fe9a3c397eeb3dbb899375ebafb37f0ce5d63149d1dc0ad6518c4b72ff868f80ec36c92d4c654c0910d224b2be7bde5aea5dd221431c06eda1f97fefda501e8e7a0ee20d226420bb979cbad846fc573909fa83cb20331e5a6f8703254a7d0d0f07bba37acd98d84e814a0bf9fb14ba2e4003f996f979ce44c14b07ed474032d378a8b75c34f39c6e2213d0ec98abacbdf2d585e4b1c198759e2bdea3ed6549f502eeab336c0f012d51c2f5ee4d6e584439a9d300fec0e8275e5f38681fda0ec201b4434a611233d89bdbce27c5cad2e887fad63de3bc5c6a094f4e1a7a6f3f0a2674d0d10bba530ec5b7ee6a97076ce4616fbb40db0109d024249fa4a3389b48cc6dad3f1f17aee1461be7639841ce48a9b56066c371dde95a49fc601121dbe0892c1f46e4a02f286947ad5d879cea75ab7931f0a58df1eed2aa62cfd1f4b0dd90e1f93dee2147f5b248ec206954a7633575f49ae441bb7090caae9dea10f292541bbdbd5d33107503c1c4f5541673d16dde1d05d39292e239901bb0a465dcff46c5f3d6af6bb29d1d18f767dde4d25a33e99767d95097a14cefe00e7b3934ccfd99cb172a93ed52132f6f368152ec2b2537108b655dde2c01e28e816761405914413d1631c5c5b442744ab9af1d89bbaa865eb49d16a85387e7fa9416baf711fabff0b866cfcd962161258187507607e7e5c1f6e3e82db7b969c4e6880014c9449a3c2db2a144cf05fe90022f41101b0a3958608d6267a62edf56f8f32a6cd814cf6445ded5d1df42b764b531c1828a78ff53440163a62ffbb2f63c7b6621ff2f6b5407c51775c662380329cc8fc5a1e0394f99c41a11b9a5cfdd2b22db9b0252d9fbea695f0286200ef646c7372ba58a0cf5f0abad62e2617bb96eed86cd211f6ba4fc60e130cd3a3501afcf7253801e01d12b1694ea9abea38894b1e99155bae2ffb90fba7adf2abb5a404888e873a56a4edcc322c07d34a1ee34da81e815d21067578beeccac6459a1a0df0d73f7973e2b67c328b0a1b11ed0a07ea43686288cab048da6b2c58ff372ae78fa09a15962b44fc069d1629f1e7d6ccef140b933170beccbe9183cec6793827f6e829b33ce720464949e1d93c1801a0c52c55d33414aae20281634fe42ebe65c0601b0c0a51982406283c5006f2bf95c15aa8e276928dd824a78231b56c3ee09649ec5657fa78f5245d87156e7a0c0858e41c05b7d7ab1e3337f99af2317cbef0be4dc923ee58d268a1068c3bc0f617d651e6d1eb1f68d679b9b7d428abd2425938786d6b3c1ac2b1e221e6744735aa079f6ca02e6916eddf35f391657e0be5abd2d267515cb1997ef58579441fe35113d125313debbd64a9f98ea7cd3c517f9d3f163c5278efb8ba57bbd3724f1950c1b4b233b988c56266be2f0b7b63780308b7636c31d25235b43cce9320c466c702f33fc88c0cd2945117f7d11059af181b3e3b06605b9644659aa04721ee613fe99beaba4360bf4c61c274ef0d246a5d7bdc6971cae06608e358ff715189edc91d57df03d51cae284b81253d3dc80693dc5ff78fe1807a38f4476dadad1eb1355dcff85f7dd2234bcc2e2b9c2599f716ce72313bddc00ac79dc0be705000000000000000000000000cefa62d525d4cfef3f70f1857281354e5123d7def665b93bb0ebfdff8290f01378ea868948677152637ff077d35fc0412d9135cefed8aa5dcb91d37867c8cd238718c6c84c3ef92f0532c07f0f524902a00d0162b454a0c79110a321a332842d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003233529205f265d77abb93938b55dbd6d8542e24b4b8dd5cc8054e2844f80eee84d4b41122c3edf106ee694c11a058d18458466dd162afa03d0e712823fbf979bc88bb4729f34d39e1f5b13ac551848fa26fdb1542f78897f8be4aba4bcb411782745d39fd902e87b2f5d181ec157efbc4bda8c8acc5ea5ff720d42bfa0ccf7c021d6f1c9d5d32ccda8fcc6c12a561bbf3adb368e02e9d3933404e5467df40a7e10227186f9426b2ce3002bca96609e171785b86bd1afb8c8c566a168e3caa38c21e0b04232c7d4ac507ea4a368dbf681c7f7f399b1d68f4d212cba35f57608e1f8425b666b30cfbc432112b65156af47536fa9245ae2f0d6adbec7a127380ed25f87b030375017e77969e8931d7e93f9c44ade8421ec018f1b8567bf04518c96e061a10032ec8c8e7b8e45ef96cfe8da0cdff73a0857e19766b54244bc0cf6c3a6587b826022a5ec18a0a957bdad637e6f4a4f24ea0e22933c86ce1fd26150d1c45e281acc302087c3184eb938778779722306a576ccd550806b1519ecc9b7abd96df80cd70c3022251caf39cf73bd797a3afd8147d93a8a661c9238c0d393158973162254f46254f14cb59f64dd90b78995b64c68e7a0824dc33b3bf8c502eb93f58adc185c3577d2e346a45ef42bbfe73ff9ec335f4c2fba118311f8a5495739c10721aa54a6ecb6ce7633a0fef5fc866bd313ee8c12e1da62389dfb4ab14ef17b7ffca0766432921df2ed9b7e4c719c4f44ed0cfdabe8dc590bcb2bc8b817eae5a0099f4037a6730d1c0ab6a5176ba5c689c8881526abd07f0494c28c8d2efaecfe3c5d49642ae7e15a8d0d2bac8bf5393bdb05176a6c97e92039d8dcec7615b725aeb59fbe224fd3c6715e81de2946f9957f6355c7e679daa5175bca472dd0534ea16e0bdd1790fa891ce4f835ea957bc9e8876dfa1e9b6d100c944b2d1158cbbc059af1ef08a3949fe3cc45fbda7357840b076820fddef7ba27c3fde9ba035d531d2e785236435ca6f6e48f7544e69ba5be858126c9200902b95d0f89149745e6874d8aa2ab4d83d8850434199759734e0ce71adaa55a7a1946c56273f187d568e8d0cda8bafae686e31cf8ecf1492dcd5b9869f249c434330504894b12dc0483db14062f6b05163548ba0790ed5bbf759128d835ea454e04a1ba95f648618483e57e7c9b486ec78e07edb5f580a9eb9da698c26bb0bd867c2db3dba622e670f5f5c93ac12db16608051c4c3006fa488c38fcacfae2d1639dbf018898e0964de55f2b44b6e56ac9dee1cdcd5071b8fea1ee01437160a946f4f19c0cd61dbb8f5e09073b25b1a316143d2849b6f9c7d4750ead5c955f444a09feacc7e35988e07ad81f99fd9a43f55a14439c275f35c817be938dc762dbf2a12bce29d46bf7280125a41558fc92e92721d6d8266cf5ae449bfcfb7413dc8d79a7702a1605e5ebe4ec9868bb540ce212f629196a1ad08eb8c26bd2ae181c4d8a0746209876339ab38bd7bdc731282c9ec952b6bbdb7593d16cd339f6c44e10527640e5d8beaee30e0e6650df12ca131b2409d28a5da4954a4864b8c9ad683c1df6d43b12963d2f884b5a8e52fb37069d3633a224643cbd6a70d98afca3b7491384fcd0b98d9524d37faf40b273994e02865b7a4d3b8dee0a67244ddbd924a881ed1dfda0565fed7060090fcf2881cf28acdfffeaef388276ca86bd37f806774405092554372f6324cecbb9667299f9cc48abd51691d9b3a528e39cc141f2bd2ce16feba9073dbb39af5ad3e8beab1a06cbe6a55337cedd6696182c837aed1f0437aefbeb22007f6d95507ba81b6303901de4d41211a54c7dc96c9bcaea46fb300a13d4dfe155cf6ddcfb60537fcf771f933d6e6e087c750695a5b63551ed18ef153bdeb82e6efb54d56af08f565e22a78ac88072744570edaeb6293742aa24c0982964d19cfdc0fe35df2fcdfffe49893a847def3ae70d01cd9311b927b206fed52ddf834f117fa42fc02e8652e371fd8adca337390a236afd0d4e406f02a1b0447bd2184693c035fea429c87ad6ae32b95b53c12174d7638229d3b6f7383c41878698354a18267103b74c643bf85ee689d4999081fb6c10391c2481f60a7edd41b601602982aa5df2a45efc2e9fc112eaad22c0690947b3506e369f8c1ad1d1e954215a6551e40e5c281f9d6c4b1cb6bc434ecc4385f437cf33bcd542d9f88ef067fb9fb0bbca411c4dc55701d04767d1db02f531213d9049f4351ddd385e0db6cdbee57961bf46a339d6ed04140dd3fc0fe37e01ba83967f2b36638355ebfb3bd00000000000000000000000000bd737a3c20518c8366cce5939cc976bcd089426d0204fc4a6f9593b3fe8e8e60cb70107af7e34ff096bd05d12c5a293498a420db3177071cfe60b3f400473a182d64d53e1366f65e83c4a34876c02417cf4e5a3b66ab9718c9f3af53e6d0d1ba000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d154afcf218b19a348766f49114fdd00bd44006c35177f215ed5bbf42c1e7f6bc293ab932a2fd683884d2b86625451868d6520bf0bf8d3f12f372b86c1cec47c9ee3a89cd9e87a7b58a4180e7abcb6659fafe147e7a6fc88aff6687e0fbbe709b9f5f8d4e547b37aef8db8eb182617457f688ac3efbbc12498834deaa7aca960311bcbf4edb6148fb59fa6fe7b9e12112b2b8731d45d6ccee56ea913e04c59d3e020798480ef1d9168ad93b1c7563f57027276765461386a4560f5b728d83ada5130a05cf45218f237381ceaf5c6e0e6e7866c5d89d29b8137727da080df22a3f1837eb962dbc7afceff6a572bf0b1ac17244d2b0299b63e7ef8af0b3da6c96aaf273022546c332c326c02b54f9d8c8ab70623524358e5a93a9f0ed1a46d788448a71c10323e569192b004ae4eaf37e019e0028935a76af2e2f8db54265c3b5adc443e9d60305c4e6715f2a44fa2b1fe04edc0119b7e4fced0e28de4b8d1f43a01494532bcc02265a79b571087e275aa70aa000e50653f6ab56d0be53be63024dbfa3ccda6d6402259e68001bf82662fb39324c14d1f56f3527d3d9bac412208c39a1a14ace83d01b4d15ccc5fc827f295c7350a95bc5ea4d4c51e6a214a8ba9ab35f605973e92bb552a22fc694dca2578c9b6a70e14cad5d2909dcdaa08d1a724d0d8484f32a0915f81221fad24251e7703d12030c41e43bf6ae271e9ee8c0e8923e4809539b57bc59c2b72133a8865d15df6d3c8c32bccb8b450398e7a0226a8bd46a35c2998ce5ea822b9231cecb6b00015497376482e911fe00bcf27dcb891278a3fe7927a206cc20d52b9cf935bf6633042752457284a0fb37142b120cca2cbc5376f969ca7dfa7b54f8e4f934f4cdd8e1e67c1244460f9ae0fdc5841636b7f7766e32af8cd60dfbcb748ab9ceb22cb623294c232dc934981a61a1b77d1cd8ef4cd750ef9c4e0a95bdc1a081f1de1104dd8ed8d3920347ca6c2b5c1d1e4d143e78f6aeb66e293e8cceb27941c5739266b4c1c199abefc08077e2adf0336c7b74708ba846fcf8280d06a43e24161112e9dd1695c428a72c14cea678d3c92acf1a6180413495275535ea7519edba2c2768cf1c4c82f313f9c16650fcb241058baba89ec08787ac8e4b3b62039e45cb65ffec943df3ba41a12297035fc1bc6997ce9cf6c1338ca30d089446bfbca010606dbaa6dcc7ee2c01a73a38640aa643cd0ea4deaef59b4b3fa525bfad236c711224b7a9835e8aa902881e96db2eacaef073e1b64be5534369391cb5283c402168df4c491564ff06487762b4688ebf6545092758f9fc8fc49e142fb1135374a2f9c4c01805b56570fcd9ed55a9bc2b314f9cf5f798ab7bba0b10146a478841feaf1e3b89662f8f10537bf9bbbe334530f6013455078f155cbd48080bc7755027ac16f29e0c8db0186f9d029a4a212d96d0fe468d26f90ed3c9d690f0a1bbb94b28d1eed8559f4e03748f053c0ad6e061e9860a0c119ab8a0c7281fc1f90ba792149c1936562ba83ab21f0e136fbaa01ac6aa99042b1a85f1684d4d1af88338d941d763dd1d03ef36e4efc8f20c04e33377542e2396a8f7b3f50f6b7aadbea3424cec6879b71fbc62a6e882409ebdc53269b2087bd8e68ba360858186b1b9c9d084d36fd5406a1d69ed09392eae2021072e3bb15a031ae667ac535fdd8ec5b806a940e8178e241351c059777e5f88f912ca1ea95581231d35089dcba22d276546b5e66c7312060b3d61fa72ef472845b953aee60bc78259769e40649ff3372f0fb7b2535dbaaeffba6dad3e414fcaeb9c8d957f5c50671edd5786b93142df1fdbbdb2ef499c0f8220435fe09ccd1035020ca2432f1824a126bbc365146b42b026f96c2be37f5c5d9241dfe0a62579622d9c79be0fdf6ead26f316deb3ad6c459d36fb62a23a4f835a2e096f799b750c494c8c6c3fe24d9deb6567c6c6ebb0a025783bf1ffbf38fcd3c864af240ebbbdde4e0f3328c06e356e0886d8132ae0c150c43ce4ba3bb9f2b1a4e3a971ee65120ba8011d7883c96879b9e3c142012d872e1760b22b34919bdc7ea4d22cf93b1b860404c06e0f787d1f3fa62d6b70e7be4a2c2fcb0ac72a09074afba04873b8f24c2d5e72d7b58cc2657179dec36208ad42c50b06d4b605df88556d4a61a0be5e1ffe54a375e4f37f9b7a0f965d25f74628eb61dfb8e1f34685c6ff25709bec8cf9d5e85b623e8d95e71b7375232fe3cfead3d8f7d0624fd37df0f35674459c9501e8876aeab44c27bd55e86e6cdf7aa9832e4e8c0e70c0b0f43bde57bf9e2a41d278c7938234aec375eb2308cfbeace739327376da28972b80092ad47a184e198acbcb86367d5251640d2ad74e79bb7fa7c91c89602ff40fbcbe223c98a8752245911e867de0aa1e4061ee7bbf073088d67437da3399cea36f07", "655351516a53", 1, 554079247, "8bf239fc2dbb32d00b9d1c9bb89ea3d627506c799c8595fa5502f1a0d9190b43"], + ["030000807082c40301f486242dce735b1e59553448e1da77d7a3a2ba2d467ca7756a672cb8650bb27700000000004fb4409a04549c9a020000000000695502050000000005510065656a8067830500000000056a0052ac514de10d010000000000b35283b9bb210df000", "52635365ac005300", 0, -619888487, "66a90bd3bb799b50779eabdcb192f5bc02bac18dbeac68ea16025f1d52a8e81f"], + ["030000807082c403042364a1114e98ea99a820f703bfcc76e1fe1c58c677c6de65b36cc07e2d8f15600200000000e394918f5259bf0f3254ddd5f13ab2de4266698b97c1d3d8bfc14eb9da92136aa5ae5a760200000007535265006a00652aa1c296ba1f1b755caa493334d095ab0c4bdd86a70940ea214c561eca86129932921efe0000000005ac65000063ffffffff9b2ba8f5742c15ef80254c2252e92b3d34628394fa3a91ca0dd0be8d217c99dd01000000025165ffffffff02cf5ef30500000000046aac63acaa6d9303000000000865636a65516300510000000000000000030000000000000000fcd1470100000000c3c3a3dad6b42fb625575aada2c5d36dc4f7a3fa6b4430a32e91f5d085b6934d1f9f331e3cfcf6501a25f3c884580301204a848c24482ebd740ab8dcc1386900910923dcdf2791a01fc7d57031c2276743c457486acad624e90ce51481b470fe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b39803b16ad341e8affaadc0ea1404d1b618bb8bfa113e80639361b00f1d8e146c79767e0d2929184f68ef5bfd043367a636bb1f9da62b97843d74428abf875535e03782b77d08f75c8a4fc1b4f1c7c25f462e6f55686d3cac3b2a72f2fb931539ccf3c7731740191176fe9d033bc1fbc19cfb570b02ce537482a28e3b42470313ecdc33b2cd2a671de80d467a488ddea6d8dab3c651588493cb0e4ca96962860305f0dcb749f56d7d1d638e0614d79e055cd412d7b99bae9c53db2b18a467f3860b05e1e2e41f53e63174da97ce1b0c783aae54e5423f6dea5b167787544b202355481b6336cda1e3f902f1643bab4fb2bf90bf984ad39c01daed870e00dc4fda6b021d20bbf61957d1ae9566d800310ccc5b1df039c98bf41613a310a347a90babc10306bf376eb33e770915a89fa7c9398fadfc22d6ecca1f8d8532122648e74e72eb03029d359effe8df497ebd77d29e65e0860932e84a2ee0a3656fd7d5700767794002028d3adc62dac259eff520f6a087806a3457b63acf18a61b65204c4fcf747d63030d9a70c58effcbfd422151bc6e716c8ace66a12eb73a30c74173687253dc8c6da38171181f9244ba9fa1fb395e49632a7082035c0714e28ef6efa330f49a505695c8667a368129eeae74c902df3add223757e0a3ca343c4a15ba8a216e2fd5b2d9ecb3b51f740e494b060aa881a1ebef04a2f2f98fde3904e30babdc31e41d86b5cb9090c0f646d106c34e23c8048affe0e5c8b4b2f4490f52d1b7b061187f0e4fdb37fb6bd44eb4f684d458f8133d04e5dc946955b26c3485348437b2ec42ecc498bac446a4d9b9f2699cb9850c9ddba2a2a198a650fbedb3cdb5ee70f10115b4e3d86ee92d85aa159db6a856bf80f757cabd8b1afc7209ff2281c3c66ea8a611e8f65db995e8ea1697723aa33571114e6265546de7f4c0d2f97cac79946435c978cb03cf9ab97520d7e307c2c271e374f4689ca23498149ce3f0b127fbf28b0a20729359cafc49dc79edbe694dd02261c99e543ef70fbeda8bcc309423faa3184bb1f0e07d4072333a71922e6d7276820befc6bea5e69a19d3225001bea33861db1193deda5f539f5af47149ca2a91afa4e5c55f6676b0d3dce589ba34d37953f5fc6ec1fe7c8a2e5e7f921c5c394a7f2c82aa7a5f441aa24fbc113cead560401ebf34f0529617f75f5e6c3c40ddef072213535fb9f868e2c3ca3c61e5104e0c096b3c39a4f6e453da4f80efa5ab3a29727073c7635f7b5c2acb76bbbf3bf4c721b598dbc9296436c5d727dcdad1204baa8c4472ef034e43614d216f04d14acf30dcf05b1b7cb073e1c7a39a5c88bb28d5c13001d9f9d7d5ba6065b3c608c9b51aa185e6100d69e6dfcba26ea548bcf01c2cc45f9eca1d970fe9a63a33fd46b76f15ed891012079ecc6b9e0e569da45c3671e889feb058662a4662142180c3679bb3be729c934d32c84b5f1a61972e430dd742e896d04e145bfc422e9b45490e503bc9d7ed6d29301fd4a9ccb56fcb3af13d07f6a5e48b8f4d6250837647717d05c2cc33f34371f7b8596c9cc906b03d10e358b830ea127d6d82310b045c289c763f225bd626c6dc7f6bcca8c363066f81578939817bd8a366374864b298549bab72c14657a66e55b41a9a45bc8c928cf0c1c200724f0d2bbb53c3d15218c1023299159188ddce2b1d2df4274f0e6db096769e664103b0c73a52dcb2c0a6168cbfa65cfc74d5731a92a40a6f213f11cc18592232bdc8477d686ba8be598d10b5829884c3a27da4787b61ae9f1142202436af898a6c4710269c9eb731fb3b85c48b1cda489db886c3a545e62eaf75d29d8e6a58c1161d5edf93789230c9704a7060b58955fb4b5b38a818adb9aaff359b969f8ef60a3814872d75a1d8627043fbc268821a693adbe79ae88f8746a5c90248bd3e71b61a00c65469381951832fb6c8d3aa1e949ea4d782c9f22b2ce36922ad2d4b54ccdb0ae896265aea2216376463392e9ccafea5997675daa38f1677899528476da43ede9f1e15010935cc5319dffec33b2de3756981455bc4396eca0b109ff4841215798b7e6fe88f36a6b22b901d3b9a9be3076c358b692c8d812a1b242685c51da1622b2625b1bdd5436762a01a944ec57917cec0f353d5e8ef5a42d08bb9f201e7fe1f73588c0554bbf75d041164d84730b7f3a37b6ae1338e3bca73fd50e684127fb131080f749f650ecbaf654b4f0c307842cdfbab3c926525e09a53264b8441c15a403bdc70017054e36b67b4d3d9650b09322045101307d37ba83caf3d0200000000000000000000000091dd6433f81b446435bf6072b1e6f3666d40959e785c008999dcb288442e4cdad4b99763b303bdd08b113befb0ee222af075ee2340684c12d8ae82179c1642a12bfa85f5afed4e4a7d597f5d6544455e9a2093f34eace256832e3a447afab15d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1b6eee14d54f65a16e897c23c284c4ad01c8590b979f35afe60bc403861141611bf04da47db9e1d62a8c845be4fabeb95589372c649fa45f6250cb84ef36b1945020748f17f78ec18143b1cbf1dd3b54a9c3846cc2ffe2ed74c4f46feaf79a39fdb454a89b6a9596a83c841d1eee00a44c4abf0ddfec9fdb53a67b25cced1d9021d4937a0135a2678a9184534eaea97af05670c43feee61fcee6b46d9d3dec87502154f485a95db64f0fe2e0bd677eb3e215dc5bb073ab15478f797f4faf0a055fe0a029108ba4fd8cb3e14e0582b7189cd8590fe0a131435f8dd394739f9784cd93a34d529421716815cb59257376d14993867a6b079a525918e7077a747c2c3595c0313b493b0e84dd295c6bde25c0520212a82f26cb91982df49eb31415e4fe761570306150c37a70ce27b7af527241caefa9f080242aec5fb5cfc9518221097f41b25022a5a631f701c71d7647845d135fd3bc849fe919628a3f9248541947af3e4f64c031f1bc6c36fcacc2194668ca5323e746a51e2c724664af932fb6682cd46f2d7cf0226dc2e46d60867a5f1f9cf728f7c5016bc2a0d57ba8aca76a9e6f33af3ab52a81c45914dc72408a1c9911563890939057071b0703b6870404398de0ef08816684a1ad7264ef99d18cf76bf2baa678fa05f9eb72c8a8c9031c25d6bf1184a154644e9a584d284bcbde64ccdf1dd1c9b3041407ffcf4b87a5aff21ea718a4ec3c507e1ab6170836186f21b99d10f60e64d1902de6f5060d6ed860b166cbace6e1f7b247fccfaf7d68e2b9a13692cec9777fd2ac5c1627785039b0d01031741150ad52baf45fc900a7ec59614da50ed25a54bff05ea2f3ad10e40d40365b78e026b0ac5e34f58dca721bb771241b246d830fda65a9704cadfc2a82f35c339df69616d111ab4fe618c17c78a7b0b2d051bd1de7ca0ba1b98fbab8f62429273084709f502d708f686f062a7742891d8d4aff593a7f3e7ebe6d136a5d587a182be7c846c7471af4a870cedc71c7cd1900f85d4fc3a474e8f6506d7752bc42594b44a5bdbf88c08b2436bf52a9176a6ffca836963c3ea9a3cacfb88dc0a3d8cd57257695a4d95d9861c4ac5e9df8d6213fd5785dc2e6c999ad997fdc78d63352265f0de18aaacf6dbc5581924cd3d06c2bb47e60dab5355a4fc52ff4117a2c99a28891aa527da2f00fed18d8d170f19ee01f849bcc453bbccbfe972a587df20c8e66fb76ca0989ddc1ae31a1294462fdcb5ac8a001f3d36bf0191af6b0c7c1c43ae17df1ee0808783a07d28946f9a92644fa625a3d43903dedd9cc0e242c7288b258ea46d3e30128371a48a5ab187bde4e1ac640aa478cc1218d0d5f01080d57a46733aa7fd63dbed0bd6b4bae849b8d42cecca1611cd822e6ee01cf000194675b581f815cc315c937818e50d98d8db7770b7267465e82dabd8583f590de7d1e931d3e854429139fa2bafb93f1aa97b06572a918c540526a1521238483335583bc3ff2316af46e51c03c4231ece9e12a935c9fda39d89f107aa26092aa7b0683a13a47a0b86b409d7344c405018b292d5141cf9d36212536753a5749d65eb838adbc9306bea463822515c3d37590031cc47d6a896b28ca66cf8162fc3f8d84ede93abe250fce5afabd8b717241be83eaf12e06a8b8e5b8f869072b958549991c9653c500578b8243d5f29ae7d73a415ba05649104c875df97a2af0998b9b9b5aa93af48ba8e766197e7f2ca9df47f7d9bf43405a7613b9a6661879cde3e4dde34c7351720e1770f414f7a760830d8fcaa5406b1afb6d4919c323343b7c6da3266f77d88bfbeb98764119e50a177e4f2c50e71d4dfead8de4ec24f0f2a7a519ee89934b056c9f8569c919833a2c16f45b341557010f066639bcfb0f9c5706a997fc3e960988b9056ccfb956068df3c6cddeb7a78ae793aa0465f4f9ce9534c6fbc63699f783c9b6bf2a54e8c5e3f9a5d8162346a25ca957e3bc9255dfe480c8b1c5b161aa048a0bfdff629943f8d1092a74f72967d629e8f0984164105095d7d158e1a3ec43bd485e402010e08604ef05d7d697050590e9e777bba13f844a2b9866980896f10ec50e0d6fa27e7f65c69586ddf997621ecf37d67a5b5bbf83aae029ea605440fef52c01612705e7a3004c1fee994771dc1418e1e9bfc8ee89d1da183c05598381018c0418ce138ab6c00ea1b404ed4cdc11c2ffe46435542bacd72966cefda9890cea5d2001ec92f462387c96a0194b62d75119071b163e5ed3d20967c63d91d2b65fad34d7e8c0840904265c679be700000000000000000d310bf0300000000a0592c2966ba7f7d0d1b80f4f49dbdb955921b35deed1b26ca77e28994ae725f27a674a119c866ed3322df18a82850e568319b6cbd0aca1ffa5056c7ef3285978ba8941e7936ed494d6df31a2af9792bb144b58259e3ffbaf4e688fa46421ae000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bde906152b41b6316d693b44e6aea0214ea26224fe1910fdb0963ddee27d5eb9c1147aad836f9886c27438c5e223842ba903a88e7f88fe9af79da94f8e883bdb3757fdf592df0f4588466a60d6470929f8ef33cd3100c198afebfb9f0a93ff3628d50b1f33a881d3be349554ae928093928d6b31ecb7b7b29efe5b6bb6a1c392021e7ae1afb41ba750361c5e39c6176d43d4411f91b4b0e96f8148cab5c955b3eb021b943f4bebe9d4d1e4534a691d1f876c5ad083a516f295a8595b71556688e6880b05ef0e45eb89db4a17b9f942f066a572a8f0936ed360b14959bfe35d12ad58d30c3174250beb82d5d1067d4201bed3d7059835a8cbe1963103dc08a8afeb19bc032258f8047fa1ae8464eaf6ebcf14e1e13b2368b2e326ffb79f0e75a92c6156c8032b368d76cdb686080d80cdbaae9197eabd7f93de95be7b1c6c3dbb6337c2fc850328b743e9934063c6380517fd1d8bf48aab6cb2ad95785d30a504bb61e94ff71f0202dc15b4894654dd7d61ce30b62583e5ebf230d289be3bd2b78e4d75fbdffbcb0201f0762b7c7832690494aebe31eab3deec4bbb8f1b6db59f39c05728ff7d94c8a86b0a33a575f96bc546ffdae3ba46bd864fdbfa1b03835b6478106eb54de3e1d3b86d39b1f1dd434a7f799c2807cdec62df1fb1f0fc474fc1e3180fb9acdfc321afd11e03675644844ed0f7f99b6586068a29bbb63d2909c1dfc2aaa400c25bd3a14fe758f258865d0d8172fea112fade5eb685678b8bb729e4c06a76c89cdaad6c8d69586dcf839c6b11415adc51b082c3f8a2f322b28bb02609ecd8b09f8177dad72c8a8be4102ff9f78bd62cd639f4ef5cf072940932b9e577887508db429a533a9e625ac0dd2cc6564c6bab2f6a1c049a174b6541f637ab28b557e95d0857ee6613c386ed72b12c0ddd32d26b16d316c6c687911c99298ea3d55978f04089b11cfdaea9ec3c4876ddaf6d9c5de937221a8b972e2f53794e51aa338a3940b6a84c1cbaa721521bfefe9d411f2cd9a9d7fd0026db10161e5011042af386b6c571fdc208377fed045a0517c4231b0bee73d146cc3f0d8e76a254dbfeca5b5ea6014cde82b56721c6a14e2515b666524b9f2e794ceb8421807f701a6615cd41efd2524a1e9a0fcf9f5669b4032757264d7598cf8ec9959e7c87be487066e952b452894aad56289010ce3ced398a2587cd75fe234fa1b37a9b0490da3a29b4e2464fc38ca70b1b0c21a82a223cfbe6b6288ec90cb4483ee5ce60ca224f255a79674c833e5c459514ca97fdebdc685da10159d5756df585d14fb4ffa542a2cd24cb98a30d9040a6488b0f28911df3dc5b1e3162defc695975b9187a1a55810bac882d946a1f64ba219627cd14310e28b88b8cf4e060de8f0b62d064cf39c1f08c0f1414e5bd6f6602a5f65ee793501d4e0a4228457781f2a6b4e889d851fdfc32d5757b534114101eb1a9e791e3ffd83e844f93f6bfc2f2a672221141eab69edf9e69e70ab295216aea67ce9ec91352b89f5003a8548387fa6d25fd4deb4d35a8d2986fbd16ee8a4598894ad6f4f88afb8205d29302c283c1bbe5ee7bfcf14d52583944ac779a9c0912ca8dc385cbaa42c4340fc6f65a1085abf525eeef7870316d8a396cbc2665eae25d9af1516675a6db4bc59972c76907b796293ebd4c6d24834a5c5ebb94a06f103818ff999088b21034a83df930b0998a553c4792e90881bade8e88ddf7dccbdd56a3f3dda3a9243db199683674df3d0b29578a8ef9f654ed264e72536534dd481fedc18d9f6da5bafc1ad93186c65e998d7af1f60db3033736d93320c9d649bdc1611342ed1669541482cbb8cc009b6338c3c2dad7c869ea979d1fe4cf99ef7c652361dd8863e510306dfca7e27538f337f42e25aab9ed8997e69f147b08e38210e918b27569fdf16d421fa9768806205bb7970bb76fc60d13066ed05aa134ec56543c47993e0a6b22d5386340a36b6fdfbbe1f81765bb4afd56382eda8e0b23ba1028313a99c0a70337a8acde67da18551aed0e068f2ac35443522d7b09e06ebd17ade744c2d5bf78d94a0a01a4619afeaef7278bff748296430ea5d62b5988dedf023efcef8283dc333eb34a5e868a0251e4ca3530c7892d99ef4c14bf81f793f3937239adebf410534301eb3d828b95aebca1d4c9780077a770a30acc79c2abbd04c297285bb785deb898b23213dbaca386134f575e88bc0c7a95e50b85578b3926c30244b94c251eaa95bda5b08afb89726c6db594f00ca279df8b309ed84fabfb794fcebb1637e36a61800a7ab65737741e286a1b53138dc6e67778942daf6ed45a25fd50443101e2dddeb5e772232a47f2f0061d7ebb72a4deda2e550b73e5bff95dc9ff237b2f1095a9eaf47cdc19d063ad1a7f800f307dd2cc65d3051c63f87219e05d5c0b", "00656363ac", 1, 658439980, "2d720de6710ed4b61b7eca7997b41e39a8efa8232ef949eec0029fe32e21bbb8"], + ["0712ff160356f432fcdf9f2a67616616d4c7ad51c2398fddf8da4a0d3c49111cca7b5c1cde0300000006635200ac6565ffffffff0fd428ca15b31b131fc2c32f421130273999270bfce103d6a64dba727639c240010000000565656a52acfffffffff5e30a1c0050e7dfe8e133ca6336308c34779fa331a25566a80bc81958c64e830200000009ac51636552ac530051b9f6cd2a03d37037000000000008ac53ac00006352531f1d1701000000000465ac536ae2aadb040000000006525365ac535300000000010000000000000000a2c49505000000001d5ce29a6a86ec14f222fecef8bbac3d650a83fcafbd97cf5d6b9a1d56d6605feb6e91c9f10f0e3adfb36f0e2e6582516dacf3240e8593ea42125bbc2c6e205cb124194963f2622990a3489b6fcb91bbe640027acbf3b08b817024bd04498dac00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000322a86ebf45129c33ef87d856b54741588993c8e4cdeb11b4cf8b90254a51500cc42d086383cfc74625ddf3e8271b697ef82ff1795ea11e5ef6a3ba4e6aebf240880b99a7b57892d4df95ae7120529beacae245f87ff7de5bc8af77085053581338917063f22fd7d758a95d654d6c6d730ee4b1f5f0759d711b2907fd7c086de0226f11061f4dca64336b4a104ac81d8c3048a3d72d6fd90f96a9ddbec093d097502004dc58ea2d5f47aeb916d1e737a60a4764a90f3797f3dc0fd4610a8b1cf592a0a082515f90cee17d907c936a00802717d9ce6d4da2bf83659c72892468bede35fb67abfda11306b923e21a2c987a732d9ee59bb29322bdd2af17480a5ddfec746022a3107fdc6af002c6e73819c12076360d5c3f1476a000891e1443bb79f33a569022595c32207509256bdf1d5ee584161400dc8bb4e950e74fd0c1cf30cd28a77eb032fee3747c5aadde9a5d79203da505476fe3a4844a66886495404c040ac126cab032769d177caac7793c6764fad44f7747b6e230ce83df1a704f14b77fae123e12e0211df9e3dcfc7b96d0b1e02db425eba3537253f1184a8bd6e74dbf2b7966a3bb78079f4d3f062e50ea2a56580e47429b52bd3ae7ec208c8cdb52f0d24a4b4012a93ae68c6f0aba2e3fb5023db0a16376b6e6ff96fcfd98f6828f1facfe72112b77d0a4654a14b45291c2b60b7d28bcf04c6080413f70af1dae2d2a10ec291f8bb838eaeb027341dbfaee9e6cd32960efd0a7b8dbafe6e805574afd1869888e43cc377d7bf77c01dcdc08db011329f6ee7b329911c39372617a93ddfdcaa4f7a2dee20eda5e9933b39488905d9f7c814d9116b94f4d9b6638b4d7ae5ccff6eb9976b343383030b21478a189a32050ed272e4d07a9b3287f89e70d545103a806400cd359cdbc8f72708164207a3c7722a2b280c0c300539a96a23dd8d06b2dc49589916e9f68703fa924d207ed728e053bc3a5b27dd5f57f51f4f1ed5eae1af13a757e3b30f7c9bb02ac5281e04d37e7eb0d8b1f7db706d75744371f12fb5123a78df97b80a315b7bb2c732b3da51d9be2388f2589bef3c7a062fa8ae4b2b72542e2a9e8291a026ae74fcfe5d182bfba1a30fce05d5948a7f9624ed6a8ea20c133ecb88388c4c1ef1d57d0060d3592f2057817906279089475eb945ce899dd3d6e1f5bb6efae027c23a3036e55ab24d25d57641ea962803ae2ba6956a75baaeb535d090e979ced51917d4b4c5974728456f53b1fa15d7921a653bdf150c7e39177b4e31d01ec2e4e6d02d190010c57253beb576b83c11a6b9d6d15d2808ff72f63ed1336c65938348ec4c9fa6ece6ae2ce1e4a195d78df6c1416c042fe98e38bf38a5dfbd9a4b1a4a51443f93f4f9e312d27d5022abd855640dc15833db9584740b322f6b0a87d1b2888d4ac12298d9cd42d77610e22e10071e8e736296b41b1e9987bffc8acf37ea94a92899ef8f6b9a92921275145385c96def865a9a3ef900367532d0cbc66b4a1127c31ff6bd2478544a972d3e871824d75ec408017e71c83b02bd0349c9a770c8248750124e26c03ac7cd55ed4d3023e28a8c5cd84f548d864749fe49b0747998f63ec62f13eee37256c2f9be38b16b17d70f9896a9e0009b74215e30cb5649b7ec5e401952b939c9026a4fff846db04e9b98d61721513735d3cc61c8231ab9a86d00157d161764abccfc381663e5c7766f1e779a3cde615b849f6a3a54208eaba5e8146fa323dda6678fe07496384cc8c4d6f68776daf94607aa67a73fda2488882cc09250a7f77d8db5767c38edd05ce4d93b9a81f685461923e7dd09c896e7e246cf8b380975a54380c476a2faa52f949958e233cf91a6a3a6ce8c0cf863209359fb26b8da19f838609ec0eb9f0a81428eff285be963ed01b75439bfa10054f18a281af1876b516eec2736d68cf9b457305bb8e1e0e501513d9c9ca2408e09996367334e602eab613686ca813ca5ef4b8274552d8c1d1c3b4fb4f29df399b1dcc2a45fc0d60ed14ba90741ccb4a95dfb934cfe9e2bd46775fdabdced070731ab8a8272ddca3b2220cc1331683a6812520e36f62ca832143ed5341490e6758cc7e72ef7bc8b74d58b9b15c65499b353f8d0097aa940fb779e535f14ce53cdecd3e66ae29a15695226863258ee0b9dd550b81a0f96235897e1e3bbb7f72107aeb7d6b5f9797e1152b95c40121813202a7c2d27a4b9c7b8281f18a3000873dc0ad2202dfe88bd5d73cc95d7f64cb911309c3973afc63b7f73a297ce92dca389714d77e6ab1a5ebed539500739de65e37b96e11a0f2df827fe8d3663224fa89abad9d9ff44cb3b56e5f3a5f4960ba95a0db55e46abc0bd1d64fa1206c8fb7c7a974d14e83130ab3e3cf68330398883e4bc64d4eca6eecf73baba1b14db91644cfda3c4c3aea179a836a007", "53", 2, 1586483607, "8f8f08b8ff13d922af3587bd831c8fc8cd2f24f164fbe202ea21d795b5cb3c01"], + ["030000807082c4030401b17e79d111ea228a2ed7e1138701684e71a14cf0bc9fe8b58382d758fb090101000000096300ac5100526aac65bacad6d6ebb72fa45ca81596e02b7454812bcbbc110ef5483c9b3e29c23137ef1e07d5a00300000003ac5153fdb2e5539fa3f6e58ab31fe3a9e9caf19f3aa7f1f75fdbf77a0a22192e1600fc79f2ee1e010000000152ffffffff6334c3a1dc59d069872b97ff952f9b93ac20e1e1baab618870f6b4d150d8f96400000000046a516563ffffffff01912c8c020000000000000000006d005fad00", "635163515365", 1, -604429145, "7728caada25b147056cd63936f8f7a34768112bfb340650fc088412b69f510fb"], + ["030000807082c40302b27c23a55d7f680040d937f578cca9bb6aecaaacbc1fe529dbe0b1ef44a32b72030000000465515352ffffffff3286de7764303a9b9acebb73c2a55777303de645ec701f778131dad7b7e9f1280300000006ac5352656a6a5de024c9020c1cc1010000000000a8e6fb0200000000016a0000000000000000030000000000000000b90ea70200000000de58905b491e9cf9ae15074f9530698b067e36aad3eaead5c684bbeec06f8ac5a46dd3cad214796c924d669e860f8dcbf1061c24265e7d34b51d79b66136c1ccdaee2e92545f49fd4a424dd1a6dd98c26bb6a96c179f0108492f73e48f9e2b86000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e7e1c5bc833e2e2e8a226f75fe8998d035638f6ab76ae131bfd539e7bdf15c943fb29c8e5494b26eb75c253730bc15db569ea734e927f9c43580f90c383792496fd66f5ee583afe80ab00e8388d9f3f796571677e95f19f44fa2328229164f18f48a9299519c20aac958cffb13c6f14c5d3b90fd075a7b7428ac6cde5b9b0201c0d310fe8937bf77fc66df3652e93f2394f5ba0cf7c9cd78dd4887cfe44735031c2b2e297aca9ae6ca07a9b2c0e576200963121502626bc8327d77316dfa7d620a03dca4d9749037939a1812209da71db709fb922371cba3c62759d713267e8d14866dfcb3574323e615db5abfa40c6c1cba4739ca20a0603122fe5f0f0f099462022c13b603c53fcf2f62de40d1d329e6742faa825d3d56e5d1b5e70d987872ec20032126934dde03adbbd06abcd179ad61586ee061931fcc7430aa30ffbf51195461032591aad7a8574e0d8ab59c2b3ce327d7bfe03ee1013c20ac695b17c938430928020315eae5ecf02e981ae7ce0470ed406ea09832881532a795162daaf04a1c6db302166ac84287c5f8c7618cce9abfd360b74e04126dccf5a159b1779b2cf1b7e25fe1b519e8adf865d7bc2bcb6f2ad6e8bbcba73ef83e7abc017fc76541075820d298fc16f7379a7d1842a231135c7c073cd503a1f8f0222b5318e3a56587973494c7895d1ce469a973af6ba14c05bed56cd3a68af2ae0f960d1d0389e06191d45fdb813c873ce1129b95d6e7b538c9d455ba73f02a260bcf204d525f4169ad35f1687c570d8737f8046691fc3399c8b5745588a256e9e8854f5b55ea9c2b6838fb35f07e25d6962282cb5f117d9deb97dc253980776b50ffd557423ba5a8e53ca8e75fd98a7e2d3ebaff97156496199f3a5a53ea2eb82d519a7be1f955f3d6751e8783546bd2f38bae59019d0c74a7b68c49502ace44beec60b903b2bbec650094b12af2d56b955a77625f21ad0fbacee34b824555749100df9e9339f67baa0562774afa45d83f8d44eba58cc4a2ce0f3914da64be66f2c4b92ee0bfb0b4aece90d99de796b72a9b3f79d45c3a397f6e5f9aeb7d35d06e81e59e175233ad99d56b13cfa6824a44d5ac3a76286f23cdbd7b586bba9a97cd4cfbcefbaf4499502f02f59d6d80212e921107ad4e26c4ead4605a8f2671b7948fa083ca43b81f72f671694c7af689fbfdd5b71835186d98a0d34a607ab2193882c5de08b4b6351486ca86660ba06cfaa80ab955b3daae901c5cda9a52ec33c8c1336f99492a7742d239ff7f5e087e544670d76e82ac01ec662259c738dfb277d3243da141f5986f453b5d283f727c03b59683110a5fac31461d20af113f3fee9bd749264b76d7929bc07157449c572a5360a66813d4cb29b55ab1da5eef5ef2dbd87c31451b54f8bfc9055a09a17e61d135cccbc60a6fde70273fc001501e34af64e1c28f74752e56b2583a2d74cf94f4a3ef37fedbf8c2f7536f1ad317234f8fa27146c5c7824955c58b09de196da523ca49adaddf326dc0570e65b334625fbaa0ae723a4f6321a182cd7f74507cc80555f97e53a7da46f825a0fccdf8fad490f6d554179b19c8246fdfdab22fd39960779ab7c3fbc9425e7939f3208b9fe6c6231d3af6832153a21448b12a227ec0d4329f7687a436a7a67458310248ef3f5008c360b975936e0d36552a7cae3d31a4aaf21bc0c60b1bbf578b1cf9a44e03613091bc80da7872faa538b1a8611b882b8dc56d11040cdd542febeec85abf1e1a3e134966652822317444251d9396f06afd0db496f59f2274efbd22f0e1e129caa6c97f2333cde0a1d347668fd69a7b24a28bc46938747e7e56aa3a1f3a2eb6f9bf6724782e6d51cafb3719900cc1d23586953d3a76a40389806144dc8e6b8a3baefeddbefb5fa6709bb28a6d6ca8b4cb319faea6e2d0644a227c8b6f1fa98eba2b54e4595947c06d84a94affc84f00f735b23052051fcfb800135f409628a27f11928ab73408038dc5393e76c27bbc8aa7f3b5e900a4065c76ab341009318f13942f5f144eb111f6de22be47dcc3fdd736d919d74fd465538ae10381e026c2ea1d8bc3ab9e262b2828382e3ea606e973debdd8b1a9ebf705350ca2868fa2c86f0253fbb1edd97b1abda79aa6ae5999fa2b3460693e57d8b7ceb1a347a5dcac5a5958a7d9216275ced3a07c26c99799f2ea12050f53659ce58d63657de417730a6fc7a0088ac82daab928050c83077b6b3ff1e808e3bbb7a6035ca9dcc7dd1efc25ad94c148397b5289b7c2c437f1354079df463785c34316d7411b3cc7fc030000000000000000000000007e6438d7d801c4c64952dd807307748e9501681dcbcbe3e768a3b50dac79016db8d1c5cdf112b24363aab2d7091903c99fdda5905d41449d1bd3bf45ae453314ce1509720e387b912d461731b233d92dcc22d6b4e962dbd860611fce4618086100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4d39f37e0754c06a8c59176192a6cf4ffd96cf418a75da53486f5eed17f29fc20381842cdd636311a3b325b980e69ea90137dd9df6900854fd04d5c87c68d48e478912346b644f266146397ba107a18a2d0faf90b50bfc2936f786e23cd6f785b039e281db0192b396c348d6583507f129c92e9eb2e6671a60798c445b85476022c0d004131a069e6c1a65ef052a470f3d1c415d876bb816b3faebd6eccf974520320d54e5c5ce9176e0e4cbb32e2c759a6e83a2c3a12dc29ce83591158d47e8ace0b0808e1f9292f7fcb2a3fdc7e2c5da9a63dc5ab4384d26f0c7531b2b872ae815df27ab8f4dcefd58023610a88a56833c9e57da5a245c8b1ee5255d8757a09ad40031afd7ca2e39d3df1c24f8831f98a7911fbe1043ba1e45f03d8a50f4440f539900229f90c374d5b243e18f073938456628e42c5e7b54648eccd749ee0aa9c125e6a03161946c68e953d80fbd073614f4edf340f2cf6c0600d9fecda417c03167833f2022435ae396bffde3aef7d98408e01d654fee6e4b381c914b304a29242d2146359020c68f1b7bd7c87f7a8cf80d471e4c756c58d28404ec38d1f5f3b4e76220dd8ea7b66aca9a1c683bd57b0044d4710998de619da159d3833bb27ea9244555daa73ecc56d2f3058b1bdf322834c0a2c72930bb247c70d4f9010f909a3bacb22d26562c0c75b0a76ed055612c435dcabdf1136f6a4e2b85b3bc35f42d3a9d7fbcc7c6f6b1f67a6a923f7d6a4795e73cea79d51f1bf6839b60ced88383d6cff3098c57be70bc97568f1d6c2382d82b283ec1963718a6ec34e9fda773449873f2363cf62ce545ac5619a655abcf67e3b7f1195db581996fc1081f5743520a1d816905348963c8b981848d43de0d1f86e1e308e20e6b5d4eee8f613579fdbc2b872ee6656773949a98ec3d640a64880e88a64f71830415779678ad8bacd679c76883d1c595e80a180b1b6af17be00e9516cc7f60c8bfff61870f57904a72bf0c950e9ff60a203885df6f5672d5a4ea7b6820f1fd529f1a1871f1c2af97ec982eda03176c87cd29fb7b6ec300a8d1fa5ead3fb6d08ce3e8fa0e1190f689edf79def19804a8005b95ab0236610f708d65720d0664616846ce01c8f0718afe7d669e4240dcd8223b320e31c7cfdc98fffd49ab77a9768ba885794c3e2b29b5303f0f7316043a2ecdd2caf82bee72feeb0f09ff7900bfae9b526aaaa201a725e731b885a0c328e1aaaf7cfe97eb788fff75a750a8d6a5898a611d7fbaa44ffb62e82770a54767f50cf3dd5274caa0f6c0ff86d29ab105e50da5769fbf7f9cb46b4ffe0ecbaafe76916ed4916126b2594ac90f188af355b80c38c94898f9fe5bd023a0c3983791f48ea81a20dd19d2169a32ae60b5700477402c53f77619e1565cd6de9bff2cd5784b9374220438db63d4b675de1bc1934b4522c85281d7e7304078858356a5ad640364be145e829a29dd78d0c74fe84bd407f560f037029b3e8fb9b1177329cbe3640ca1fa5155c1c39dfc9acdd66617be04172addd0863d9561562bee49200a5e4421b3ced67bd8cb6cc3d38d510647ebcec3d9223c4a7d6ebd1b4f92369175b90b771f8acf4702cdaacd9af408d95b16a8f9ee8479925bd2ba9976f10e1c32dd96a56c1f81c0592fc60165ec20163d7a0f30d611279ae6b69c7ba219adb9937a4ba439eb37441a70f0a35ae263f0930792ecfb6a80839b5724448aa67028e13dd1cb18db18e05a97240eca0e4aecafa147bae47a9089ff42bf2b9e49b6b75845e3b165febff5cbcc73a6e20402af51e25d2a16817d8372a09ae103cf0fe404c64dea0ae254822148c5ab2c1d5e682e8220a66ed63e947251c667ef88bb814e6f618cccae40bdb2ca15bc57cf19fb1bd752e041963fb2f69e860c4756832b3798df745799156ab52db4fd3c5a84ab764d83b45f1fcb81abd0ee27b070f23f69682f0a12bcb430334324147b6bc24e8c2941d8b76cc03c7074defe74afe4623bfcc13fa2bbd210586cabe6f345b309b5c54cccd83d2029a8063a3916503b4aa0a7503332b12040d33fef8f68cb082cc8f1182b50361bddf3a093a975e54ce51639b7ac7d5633e78c082540cfb4e227f7c21ed24f63f70adecffc801dbb049d334e4fa4590ae0d3bcdf90bab48e316e1500b7fa4cd8baf1f5a73c8f6baa4472800e4b430b3d6c15723bf7d19be95db2e875a82221475e7a3b5ec597db4ee01e00b1fe4f94d0d6e1adc626d32ea9d22f3293a821f93e7c21f687b9881bc99350046dc05bd7cd3a3d72fb7333f3c3deffb2c9000000000000000051d1070500000000d09eed923a2f5a5fb3b0763a02707bb7ca68c594d00e42c19fb417a5f6c05dfbad4bb5cd43e2b3a72d1004a93e2ea6679ffbc0da710151a88e85d58da0ce4609a28e4cac1b0e49de39d4f8f56c348d482c198b3a3c5d9a4de704fcc906396e7e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075872898a807ac74e2bb72593b40b6328eb48e218f22ebc64fe3b39720289c42e7520883888ce5aae48245a08085044d6f9e6976d87f4359989cbafacd954c4d6a370eda40371e6da3017aac0016e696fdb9d6c0794bb911c08f5fc2cbee06399ee62c5ab413ea81a51131adcbb30023ee79b2c59d8e5590d69181b75472dea4032de5ee001394499cf50e0d6449b985f889126947c37cc920c277acfdadbfcde7032509a56d47dd34176aed556aa2e70982329eb9a78f01b73c4fd6a1727c515bcb0b0406151f189d24b1091b53f38713c2be8bbaa8ba89a3f57fcf5a65bd6023bd06f66293c58edb430e8124f4b70ace1cdf89239ab0df9111bcd827c51250216bc802279a3d4a1887ee3a5ea4c0350db180a026e636d3d4835bec733e9ad3830541b602052f6d787a113a5040b4e1e7cefaaab7719e8aef03fba289e59513b1b91b9b7603165820aa16d5a4ae3ad3fa9f69d4091fa68531adb15eb8a8c5dc477a2c80adaf03258c9d9ad44c85fdb7e5abd6015dfaba1c6cca989729f2e03e81d9697e51268f03046d72f43471279e8081b5cc1a73cca9b34ff6c99b8a3bbe7ea7b538cb18adc5a69fcef7dfa3a24c447fa80abbf98192085cc3dcf4e66904ca16bd5a1d2ce0e1961de8fffc6de50e6d8bb780462818829a1630b18578f66d660f68423aee63a21e1d29c9b1d658f7caaa10cb1fd20d035bc0ff45a826ac73d6da874e68b64a6e9d393f13c804c052ef33bc8540712a071c5079261fd13816a48c39433cc5dd1e4e7afeff48c4bf025057b72efffe495b45495c5afd0de7ba22535d71b99328a9abc9b8d18ce8405a9df9c73b497da6bd420f5b32fb578bba99d617aa8e425453ff896d8f07f4df99ef463101227a72bce57011166bad2709647cc1af13fcbfe30cbafb99ec5e292462daf0e39823331051f6125e09a684bbfce96bcb37a34ace309cb92265e352ab24eca8382e630f1e3f2117c2a152a553aba7d29989d24e44a448c93fe531a5d10d4ae0ab412a4c59d221a1a93a7bd5c1566cf4fe8f0957c988a9d9a12eaba44df86ecde5b18951c77749d3d212c6a16ba62cf2251c8ab3e0e61a2072c3715d027a44dc623fb395383d4a6da5fba0d8a473769d56f6e86cb740781eb93a56adbc5afc23d683343b06c0cb9519ed469ac5bc807d06cd37aa92350906a419726096383500b76a47d4cd7452dd2b40deaa1e93fd4dbe0c5e5bfbe4b9b1a51f5b4bfd22cd52a952d206cd82433f9956b421b3a5e421efb4f33f301df3922fbfc610289dbebaa0a4011ff0278dbc64f72399085c38d97e7b60859c1c513a46185cf4cdb4c0c74905a245b02ee02d81e50a7c174f7a487deee89e23d34d707c9cf8e4f2d512e9115f0b726dec08ee765a7bf0fcbd266a675cf5798fd260ec5215557af48a1ee766c1bfae1c155eb9ae6a22c6731685354245d482ff0137bde1d807a6873330f205f7e037034a5b8d6562aa9e40652238765ee29f71a04254f179e31d843c245e40c95ec7035d596c3dbf72800bc2ca0dd910096c686876e71749325dfb411388416c860b8278beb0fcbfb30041af91718fb0d0e82db6a4c80e0ef4fdebcfa7a6ffbde0d66072f62240463e1be6d95f082a92bf546ee2f0d7505f0ad4d9da43c338e1720593bd806d0513e583b39db36ec89e8e62e2a316b5cf5ee53313b584b2229a5ec6a26be57d6abce5216e78536458e0e721b6d947b6d9f32286232d5b409857c0711dab564e21cd191827fd9910799518a3399fdc2daf4c2931a6c7ce21a8d4414a242ea42f11d2bc18bb02d4a7a349de6df6e20c4f09a7eb8d0321da4a5fda2c41e5eca0425cace1bfd4fdbbbda1d76153c3c191a97faa8ab09f26146ff571e3c8224bc3f7b334b390b1120595cb71b43554bfceac4205c35875e0bbba6f7aa4e8fc6c3b7328a19fc9cb6f35fe341a71b58044ee0a5f383acb1f56124868ee2d884eefbdca1b256e49c5eed1cf9c2a0d5a279e261681bf264654bf667be7f9bfc33f71c4b0119bc93764e8a80a6c8eebced0f987b73655a3bd7b1ad12c4baec621ec713ae8ff948892e8b7911be76b96852e74a28adc1b91777cf54781631f58eed9b738f9738572970c541c280dfde59feef104d4d42f6bc04c86a24ada9f1f0855bd0e8aeaaceace14289834ea00ffd9c5f4ebe9f9f73afd9a56762a6174779c88013ec21f9c7f7adcc314349c2a37ea20d1e5f4155508d453a91448915e950a71f36a05e9768d4f70a35df755e30da8a0079df74cd5b136070e9ba4df7409efc7bac6f4bf710f465506a51f2aeecb882f03127236690f3156f2678045a108fd7bb76eb55b3c225db2ff4a100d5b14291f42e4d61e42f50469658934214ebf97c95dfa7166717ba075b8a6f88c776a2c3b0a23343346dd28dde76d8314531a7c695609", "ac0063", 1, -541223137, "3596bf878a4c3600ae55608fee815c76bdd388c8bd216d2ca685f19f9d218a0b"], + ["5712110001d711ac543fedf8c7403eca0b21f1aec513c747929062a28101de3a2c23ef370f02000000055153516563ffffffff024f406104000000000100cc395804000000000863536351656a6a650000000003ea2a7e04000000000000000000000000b676da69b5baced9c3add8cf2b48df3ddbc9a047f841dd889bca86ade748a4390670fdafd24eeba17c40fc7bd731eb4ccf957a7c3623889a463abe23b8a79a6bda4ca751796682c04aab17f82af814299665eaaa73595c9ae334531b7c1d7fc100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e474d9a10168f6955e52e34b8fc0c3a5fb91e408b05c4446f27bc295c6482a70f306f37427b69102d35753ef4163367829efa2dae0d225f24f7adc6e656e3f9e183b03eb0585aa0a0bb544bd6dacf9e2222db670bd23f4cb6a4d755e90710a54e9bd807eca6eff10ba4276ba65727780c907b35e777a8bb00967240dd36a85c903108744f41f4c082b00eab5b15315ab21c0049b187cefdbf6a927ac07bb397402021bfe7ace0e49336c913de6dfc1c35ee9e5b6fe07c4b1ea2bb462b8d7af8a17730b01ec290549f7036e121aaca47e08c635fa3b6e37a3f7b6a42db99ac70c3eb9a41c7d17512c48a6037c57f635628d281ba36333fb00c30c47615ea1c7b521f3d80315e5e275cf8d4089200ab3261bfac7b49cc34173cb540ee2405dcc6dfdd8868f021efbfcf3864248e6c89d43ab9859c2717b1725057af89ca230b9b0ed73cfcc9c02250f779f4ff56c6e815f52e7d9120a89b32f7985e7a3e0c6514809b4d510e1f8020a986df7d93b2bdbbc64c872327c282409e16830a646f33b8f879f551be57e6c02116597255506eed401ddf33d167740e5bc6fa120fb748c79bc60ab51de8be607a17716793b98978d0f27eb141764f6d0b5ce69ec64792974b6f289498fc78e9ceb33243294dbc8da383bd01782b1d3917632b8597b5a539da1791d112c706d2bf0ff8df92a76b340b5be774419a5562a4add36892d8194af4ce4ba7dc7f2aebc526392c77e9169d889544fed76dd55aa97ca0dc818a55d7aef9bfbd22cf01e3e12edec9a5214a9b774d07d602ce19981a4c1aec23456fa64f449f44257a0033ab28f745b3651b1955bfa674cb90185093aa90b1f86a1858e7dd27660a00552b79b74b7e9bf6f37c8ba60aabe56b15f2b7f0076cd874bbaf12d6e7c604536d331a3a11be9f5966808d55d27af0d8465c28a2ca2e37993eaa5d41666030bfc988d2bee90585b6bef93b208a275dc4f4edbc1db283906feaaa0bc900ea255d01ee2675158e0cd43c50a6daa1449ffa62b9a2a3434d897f55a5a8f33b008009e9cc13785bf03a0df2c817ab850792addc1623c308ccc5b68497483f0a50e2be79cc5db660f7a7fc4664205b616425d505cbba2cc5e89d48f7b7d8a83d49a57681b864a094c752087b5e593b6844edb95e399032ace78c640ff9b598109516c68310b87735bd938610bb0aa57a54a41d17aa9d25bb5bea45281eb5ed4c10bdd2acc30035b66a9b196bf3ad332f15cb68f1a280e2d019c710757c4d5900978483a278c485288a06e3b412cf6bfa5e2865e4f2ec96ffdb3589c7d764e9cb1da42e51d7fe9130470389e5cf7c3b206a99a1bf8c31303e3c5b89a84930950fdd8732f0b99a3abcc20a83231af075f7a4001a253753dbe23b4a3ce1299b40847d4dcce7195d61f2ed046e766fc5f897f079ca3b26250b54fc7c5ce2daedbabea0d2de6c3f71037e57ea3cb27ddfc1917803ce0f3cf3ad0145409d1eb5761805ff758a664eb4579c406d7b051aa4c41149ac4fc2e71d07ba1d6e633409e207fc8d317b7350233e85e58be11f38fad5a01405ed77f33a252232403cfc7fc17faed640275db0640bf6ecced13dd70ff4f0f1030bd66a7996d0e38b8777513d3fb3b6e6a1c4423949658335adce563841d1f1048f225e75c664d52eb467a98a40d941f75a263787b55d533ae78720f3713a7a5f10f8da716918dd3379ce4afa53e9b9cc2fdef5d3a153f463a0b8b7f5340a58f681ef3c95bfd71b8e36f8bcf9e04ce2906f9c8d4a94a45a0347324f31de99239c11d7d92602c185acf0e153cb8543ad9b36b40dff57dc0380f55e32bef00fc8dc24217cf07b146023682360d598b9b9a6debf0ef51b5337d5703ef187bbd0a1bca3804d5344c6415d571ff83630d371e2ee7558df166396681eadfdc3c208329b2ff466b577181a4308403a0a745ea5cdc03aa4ffb5bd4747cd7eb85f271f3d0ee83e14967c066f633b694c8937f73d59567c66b51276e6c793f40902103e01c0cf4fb3e8646ee3bf5815df4fff8c74aa2c9e74579b349dbcb2551b1f4b79d435e6162363ddf3cb6bbd7c5972412e0643a87bfb4a25471a6da27bcd436e16f0c68d9434bf2832dc12d3e857522f21e23c4f24baff6ae131ae48699fdc6ebf201651385e92cf71f1aa331f29ed27139431d3fa1174090a898fff8ab14f7f2e7e91c51b73ee7984b778f200913ef919de3ae1268b88e046d2a8b9cd77f1ce332323fb7474dd45d46a038548c5b8109d0069a20c2ed4bd67ad7cee3bb4a9662894f34059a5b192f00000000000000006cb8ec05000000006a2436a88f4403d0c803cc99236d49b7d10f71e97c478ff3957542f56286da31ce756d604823ebdd87998678b07c7f3b98a43df0634eb6cd52cc451b9e9f2b5f948814c441ec7c0126b678d7df3a45ef047fc17dfe4ec9f6b93bef986e347bb4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007e73bd0927f094cf321319eecac990bb4c16f7792d093cdc485c3080a89a78816183b94f4e6c791efdc2d6677e9dc9385b426e211b8b7da302b4e823730c3a51d21d399e99d980bd9fa99d4accf44061dbdda97d9ce624d1218fef7ac64b83715f211810a4b5fa493175aca131ce35737fd64c2b04f653749ec6f3de68e844f00317826dd02dbbfdd6608b0ce72b56e19b30394f1ee19c57fb8fd7a83970e788380214934915ab5428e098814c2104654d5bafc0b37a5eecd29a5dfdfc0df42111290a05210b50636eff77bbcd97ff252271ca302afdaeb8aa4e62242ab1968ffd7f23febf588dcbd739e0b43e16aa9fb55fc9a41574e3c9dc4ba0e9aa67c322672a99030003ff39451bd3ca00b192d243329b08a82f87b3d3377be090a7ee1ec68e6473021e8b9b147ec3b7e0ebfc7198b1d77295c767e829bccc8731f0776991f32f1309032acf4ad8965932d40867eefdcb6a107dbe7b653f2a213e7ce7f119e8dbee3a26031cdecc0a313327479b69c6fbe67604416f97b9dab3be291d2b773952301d42a5032d96bd8fe10ecc886cf5dd61cf7b3924616bfdddbc75622bdec77bce1788a268ea0963325b7f05141c3ea9d9927a53696c322b2a44bb81217cce5c9bb21b8f39e6dd46a5b2217d902721a8915bfbd1ef2d80ed61bc06a34530c5bba96e9197bc531dddf0a5f88dbfcfe17c393b41d3ca3402d98f92d95904b1afb4e608a5e77c0d4d9d3568d8d965393cae9334e0497159bd81e88be0041ffe777d58b2f17363989977f10b4ebed41feff3cdd2e6f9d9c0c5ac7245a0320abfcb39be1efab044cd9a17153798fb58ddf32c5acac5bbeda286d6f10a34d12c9b22105f0c7c0505d53bf9716e2650bdd498ef24dac9d95844ad918d721f1e2bacb28804d1eff19ee37b097a10289ae83f7d82e22c4b7f2712103e48244bccb249bc255523ab783fccffba247b873f048b7c83e66c8af118b3c9508003fe096cb5e7c1d18fbcf0a0df2a4ea01497f0b53771fac46e5318eddec793871114642ae0c283fc0d273124ffcbb4742fa64490a78a44c0994de152ad9f3d7a9b26fe8817e965d205e9505ea62f4ab8b60af73631c85051fce16f017554591df4bc7a923bed8d2187534b9cdb720d04b8551d75769af7a2b88e8b3e001244756e19f6cf5d4a704f6aca7f96a0fe327e222bda24965b2c725c112030689272bc5a4e569e2893b200ef64e13ba4dbdab59b07ad56a9f9c4d644759fa40f31b6281ad4ce7f11a0a1f4d02e67504604ced93e3be1d919b7491de9f979d9e23776bd8cc29e2f341286fe669b8e31da9da43f562b020ad03a26f6b4e089064479b3d96e544abc0001a7216f3f9004dc38decbcd9fd88cb66c5ddbdb7c3580fbeb222398d8c1d989b2c725100f51b14e2bec8aa4708d30a3fe8f68a6885a92121079fc8eb31d110b8102dad6d2451f8c79a68c09089e8ff9a02765d1f2c47dbf2d32a841f4f7efe9194f592e0f517d7cab797ad33cbe4b18eba4c6ae7d33d288715051028770ef626248c6e0e8a6506d61b375db5f45fecee71d42a8d6636657a3d0c7bf0302acc2faf490fb07066b3bc42afaf21307f90de01c68a38a87a2c33088cd3319d033f8e34ee2f3419ec9c0f9f4eb9577208416e5acd74103338c913394eeec53a4c6464cec73ab72c9dddccc4bc48735f016838861191b86dad890217f21d68ac1d257c6b521002880f784c346233ce9be829b60cb93e14ae0cdc85f48ebc0667e5531d587bf1ffbde83463ae37b96ea879e7f268128540f7d9ac102b052bce7446320d76c26fd3ff9e760d3079bcd251895d0efd22fdc43da5042fe8e3f8c6507f75d13d601ad17a577f5fe76c7bc77f60370f470676ec48d71b3bea4499fab8408895eff3037db5f7ef4d1987a64b245bdc79b9def91ecb836bb0c6b5634624eace5ae05bfb19b33714ea4bacd9693b46dcd05bef49720dc69fe9d890c79c7dee8a33151bbba0eeeecc58e57bece45fc7ca0814d05c5a6cf341da2c4966265cd49c7be6f0f0c5d966d9d42780d197271ff4f504e6acfc82603530dbb6c5524ee395ff410d92381a8f86b9c5e6e4f386a8c72f187cb8813638623c9c10c2b26c81675338699c68f7ed0667caadea36bac7ef806460086278513680b1173949efe05f5f1eab59e77cfd2217ad2dd3c564143f5a91fe72c484fe2f21f628eaa0571910211ee2d40f43b947c9df2f39e83502fcf4a6d7475c66d9bb440ca817f6ed70ba0b04e4e79a7bb2ff1662a3317819f8fe06b159f81f66da5e8252b275b03000000000000000000000000bc1940f8814c151c5d6da21c6054db1f40de475ddc5e1395b81283363bc3b0c2df658daa1ed214b4237a86a372b6735da4b2fef0478105b2ec0d309c12e4d217356249dcc6cb3efaedc835c80f5254c203622aedecec3fea475462fddc8e2e8300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c2a288971e6aa9563a6b3c4851282cffa3143525d9654af98ddafee7e6d2e437daf61415a4f25242e2f96466450b772a5a8780a649c3b5277bf9cbe67fd47dce9d6bc3ae485afd7dedd0bcfedde5601d7aa6570ae927f811a991983d8847cface0f10febfb37bde24dd6938b999d442a811649a81ea802692cc7d3d8d5c62647032dc984caab55a893c3f5ecfe495136ce70aa5edcef7b1df4dbc3f4acb7358688020958224f523f717ae13da9c99cb7f83298ec1b6494770b835ec60e4e5d46341f0b04d3eaff4b526721045f1f03a0d103d71d1b63b6daebb19a05fd741015670770aff270e284eaaae321df0f9f18e72750fcc0e191725fb18b6736c11a46e09f430326c644dbd452f6d3e80ecba361ceccddcc035c26611b191ccb82446f1e80b77b032f0a3998ef3a91d0290109c015a67a79e7be55aa7e1ae99307b62270d5b41c85022498c1d443a540fbe820825b684770f539211c375d0f09e7b1decef8de247dda0326fab34bc7a10ca65d013136d2f0e5ad1fb7fd32d8ce226b7be3526c6385ff6402187d39b0e6fedd82fa3f2dc822c5db41f7492af5d2183d46faa251208db7d9ff8ca250377b8f5cf415cb3563b64f0df93a64fbbe1b43d25606f059f2323ed1f5fd9e8855c02d68d275978980601eab9a3bd397d7accaebaec0e511140ef4490116be3261c5709db64cca1d50ccc92e2806b82b032e42f747927ad3a76c383728dc69ff21c24516112661473c2bcd5d8d7187b408e3cac22a9dc111c29e1f0c223737e91ea46805c4e7d609a42da9df81c50aff458ef11d567e7a7daa087adcc4c949b9748bd02aebdace459a8f51cdf1e30a906546ea9329a76286a279ff9385e0f0ac7cf5b3a2ec869483e36655031cf8dcd90d249ea9077943599489c51cd4f5ba68b2e7a1a316a14a764d1cb997445034682fe63fade7f241592de484203ba78cb3cefb53030cd27797f6c1194b06b4adbddc0e9d1c57c2c39fe395fc54db76f434fd1327803f797ef8bb7a4ea0011619a13af7553b78c43b390f633a9e9abe58c4df96716b23a90315b02f3f865c5d1f50aa19da39badf88ec159ce344d03f0e62f77a81d209dfa9d4ff5ce532fe8a7350fa4bed82e38e92e4cda01d576351a08875aafd446a32b72f6ba18ac9406a2b95d7f35d42654fb6fc9607dd4ceac6c10b6fb850ebe4d8c0b7b6b2b3cb0012540c6ca62a5814914c75ec25f8f220aaeee9af1caf79577b9a5c18999a4192207abb8003255e475276fd7ed8f3a7817b278bfd98db68301f26eb3a4bdf6d1718984009a2ac9b87a7261fdeb13c98f47ce6291a340bc5e2c34d423fc73ad561f535d2c39f1484aa482bc254b2c2730a49195ded29c62b346c9979dfafbc068bfaf42db6404cec60791355357ee134e7a7f546a02b297815bad755473e54d5e988c0cc9b114bb7162c768a3f97d35221f3f23a5481555d8311ef530df008dee1d4860fd59cc3d46a8c0bfb1013b629d94ba321082ab10128d53decf736f2f3949bb602f80d9f3f9dc221ccd05ef033acd64bc21ab4487f5cf88c3df7cf840e9b8fb675e02ecb6244b01780d104a0098b828456e88998e71408c279afb35bdd536a8ac81e712ad7f6c58d273e29da28ec4a653bae52e5e349137c1317a2e13bf17d84c24360aee00912824eb99153e052fa5476752f04e64c9f7ab73c80b8835fefb93cdeaa967d1ec591d0c0e3fcec83cf458faad27b8c5dd50dbde3083e455ccf8cb4f63d70fa92260431a839506b5d40e59ad90c91915f0b6ab84f42337fe75d660fa5ceb2eb6c911efd15e5db7a9658c8e4af522ade81793ba8bc4a001cc669093207b2831dabfaca45b550ddb4ea6c6391283aa24a78b332f92fddf411dd906423e9bd193031d8d519695d566252f1a9468a46b2b75b622235740677bd894519f8d6b5911ff5eab8e5eea0a6626a24d2c29f029c4dc86391c25a88f81cc2da0a77734cc59a660ed380164ea38bff782fdc3fa7ae3945ebbec146240d812523a3678e48833f8ed649471f8ef104f141f0dfac41be783313950d170869c35ae5b1877e23d0df90b14224993f901052b53f295dd3b900b968b28697da8b4e79f5c1490a72dfab6c6b0a7b013a3a65189634b4e984a1e48fe6c613fc65b61515326aecf01a91f77c508313eb1a234351663978eed9776da0627330e34098e3de3ce6f3ce5f1652b4733286a3e5226f816748b73b7fe33ae295bfc2803b23410e3144ad75b1aa4f82d425612fe428787b80f9ca479a2eacd1772dca9123237002f0f7bd1681a970c818f1dcb22e59030da817c4a89dca0a8ab5bb17acdb9d2f9be58a9339946a06c69fcfa67601e3d8ea71590be970c112639c918d229232fb841696bd5146c5a6daa7a236ce442250981c085e74199502e4e1267996ff919ab43a04", "636a51", 0, -300159779, "7b5b48d49e5fe640f985fd3ec50e4f076c1016383b7ff0684da29145e7e7bad7"], + ["9832e44b0436af19a2733057bbb88176757b86090985a6ed4f2f5648d2fba8cff0398318aa020000000300535291216a6a23e8a31dcfad16e600e33924c9839e886387c92188bc2527a1d177928db586dc03000000026a6a0ffdfe701069d3538da179c164c6d4fb17e58ee6ad8e9ed68b179aa4681a016302b6a8d2020000000251ac766790dd17f23d2b93fb6e6be8ba67a36e4044ea376451bfd14c2678afc71cb74c9f3d800200000009ac520053536a53516affffffff019f38ad010000000007526565656aacac000000000279f90001000000000000000000000000d57e3b26611225a84eab1fd1a01c4d2f82fe75d5f3167c17569bda05229afa910da35c31801f643ee4e2efad2f01999da8ad8287e06b11d119bfd9ed033de6bc499d7324fdbc8d65d39389c1db9468213538baefad642d40e14c25269e195df4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001faf4f659abe501ef144b0869de59925c7870d5ca2df60da81af812adf39420e0583fc3302865fffa5df48ac3b0fb5fd65f7e4d7f2e2db375b0a51e1ae1b7dc29aba441795f4576665399238197e05a09164db29906259864c995c17dd1fe2519e440604c5304ab1d1e0596c75b31b865fd77d06cbc017e90b7fa13e524c43eb02182457318ab51ec911e7d567591ea9773fd6bb0a982710a5c66e55874ddbca450303bc3c75e39781c489314556292196a5afba1690a2f0fc0a6afcbaece29aaa600b006e02e8ab902cc10bfde64828323055d8d1de28099821b1071e2123f64fd00aab5a4c604b57f672420ad56bbd0e0c4d60e42bcbf3b378dac230926df2a2bfb4030140ba37fae1cc5e05f88a2b1941e0e48573231b12f6d820228fb95af185cac10326d28b071bda873d62c2ab28b74b5c67c7146c46aeb8ea3a9904661b968e085c02157cdca6b27f9c2d0e0ca475f6ecec625a49c84fc75ce624889ee9e4a4172f4503214d65f70639caffa26d5c0d4d8ec59b171aa6dac75827fed1ad54d3c03e95ae0220a2892de90ee5be5089fb285743d804ce59b393d0b0cedf40c88abe209b8d0553ccdc4543762ceb117aca19eb2841b8e9031b5f6cddf8836ceb322570455b41cf03a74592f1c66c3077159d84cf3d5c9bd02719654623fc9a1a3c09857c817df98068320a3662d549b176c704050073590b5249968f7a4aa08c59c642ff4162d9cfd7c9d2575aaa76c1be1a6b30981becbc24dcb6fa34f2db542e2d246136d30bec680121d67f3c99a644007512de05045ad551a7c663a71616957941530af6429f6591ce7e68055a482bf57e6a0648b8af3f2a845e909f3582c2afdd52e9a6fc4519a02a5e73ac7a710069ba8457333a76acdb2877e9811b092c139d5e2977119c05c2d773a1bb38aa11ec10ce8028cac58198c75bb74b95ae275f9befc4ff493dcaa1a4265b2c70ac33e471b168065740939e64e38877e141b99d51986bc5209c75bf08ca4fb660f67ce83f7589436b0d3166ab91e92b678093f560eac949cc43ce7ab878538c19f4558d5d2a80d015f152b1fe46020119e9c1f1566b96c9313dac9ae33ce88254ed773592a8d8c1ec1b6050c2ce2965d71b416abace3a5d45a52d7ee655f8f5fe75a929a9be1fbdaa439a0b08d5a3cc36d891d83e8514b1a477edbcddc52bf15a559494201562c125e70c3932ef3561b4407a1ad50e8535ac237860ba0ec512323c4a6687f060d8a3ab3eb86247d79b49a5b5b7578064cc1b3612cf7d01907aabb7590b822bdf41950607c2952ffa800971191d2ba746d40571a13fc48021d934b6646a4a4252c7ae055449a39eaee4845fe8ffbd3647146b8a510097a53fc5f8af0d3d203537ca1d2424729f2205c21157fc262b544b9f6bbab88cdabf47e9b7f3c0b94c9a638ee613cc97670e5b65dc46e691b213c88cd5f23b684dd25c2939fe00591b6532864044225994389b5f1f72b508234c35198865036838476ef204fd67a35ecd5650032660bb2c681f4e44d72c40cae0a38ecfd5c837fab09a0a982ede7c41decff4f93df6e4743a40507e117594b12c443a8ca2b2260ad25f15ff0c0969e852f524cc9a98b1be083ebaed55ad6f8f864f49cf90475d9abf1dd26f897748fb5b09b627db03d6daeb73647cbc641f719c00b1ade541cbbf06615161776194f9eefb22e15c96673a438bd1d1eb5088a2b581f07c508b15be9e6a2aad596173805e16ab03c91af4c651e2844af70ad83e60e9b7591dc02c5ca1190c2cef3afc7c48a4538bf7b6ce5c8718b6332de942325df34e8a273d305aaa97bb29c5843ad7568ae0eb2a1a8f5cf8ede922921c85e2f840f07fef1c44903aac63bc7b6fc1a054f8a8e9409ed79514920d2dd1c022e10eb91774bc50fbf54daf4b6c92544725fdd87e6a105b9dc095a27d7a8f460697460c94fba96ea4786b3fc301fcea0efbcf0c4877ba2bf3d18f4a23b691c88616cc4bee5e768d46b8329e2c25884c700f23f60b3376a469dd38c3533d8efce6c71edd8700ce156f7e7ce926432a985ad852cae5d76d04a015ddb23cfea20e028a5603a5b5d2da83994cbabfba0267dea5a3f352cf2f628104fc257b768c8566f4c33dcd51c8f4f8c1f75e1f393f1d2e1fbe813eee6d0e1f0657ee0459ec2141cc6be5f93b2346decaf8cdaa21834d48e978b85c62d847c20d02c1ca7049aebe03d12387b26ba9af6b0bd741d2b4e84bcc223fb3dd07eaa3153c38bd1ab466ed58b68db2b6c8fa84b598a0ba8379cf97a4cd181926f8e029510100000000000000000000000077c8dd96391bb24cbdb00e5dcfddeadd31520d3ffb155ba331560faf94b3de011226432da83980b497ff134dd08d99efda122102a0fea7ccc2f9c00b0950c93f79b11d00c59860b65cdb9d08397653249033d2df99a803dd18d847918ddb44df0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041dd2adc98b4a6c591c3b6427605075f831bddbc3aceb9d3e57c00470d0d4b6f6fc67caace25a034e3a33349dfe555db8b38558922cbe10e77c8d08ffc04ec3288ca597ddd1bc79e9e3cf56660a4c131c3721ccb9b00575191a944bc5a1d78f246e2b73a66f70e901bafbfcc3b010e511937133a20a9e4dba9ebdd48fc51d4d2022d30c0c0f1d36a949efadf6e8b25d6b0a7701433507ae8f52ddcf9cb07fda151032beebb9cc824580175ab8e16867e4547d375cadb774c336160dcacca997e54dc0b01ebe7aefc04931df335d0ef52215bb127436b8797e2a2f2cfcbeb388af2c80e38c57c05e469689c549b0aaa9dee0be2567321164a1ea7a0919c9f2d4f95aaeb020672ff7fc2d7d7032a37e5b65ad524e4bae45efcae16b1ae0f3421167f3408ef02095b66123f64dc59ff4c7de75fa28e03f489bebe87e760ccfdf6eeb465176e5b0214e999e425b45a09f682fea44cb00212710eb3146787622ecec6770ea4c8f2fa022431adc717a0304c5c2b36db18824470a627ddd1737c816771c78e120adb19c0020e9637445224049cb7d515b5e8873142275f82577ec140190feac998b5c8f3b18fed1d783ba05cf5532dc612f9fe8ca5cdd57885590771fe8ec94d5308c7421c22d309a7854fa25647023bbc3208ac4e2648e1bab035abc6cf13b1e4910de331cf775d1320d4fbf5a09d0a1cdae726fc99544e8dacc8da56732933111fd2e44711d3b9371aa3c0940e8f4ca3f985dd362ba6bde2b348ad1147308beac5a9592737f10d4099f83017fa14c0505e4a1efec48b27426acf1e8e504067b4e5e45ca6c35282ea52a295028635a60ef399b35382cca7afb13edec6cad294426d0320368b4a37737867a7bf5bda56987ead9b790b306f3410ccda08b5e91436bde6374c6493f9e19eb14c728a79a1f8d0de9255e8fbc021cb0b10e7e7f2c464e167bb87f295dded08d596f1cacf6500f85f11f51237b8730a1718b07be32c17ecde18c663411a1d9ef5db07f937f2df500cf22880f4adae68d33b9af48ce723254178b28de68f08fc1606dddc15abbada49433abcdee0ad0fcb0587a9e7f993b61c4cfd0a4985ee20e68b0ae6300e4a965a666f125482fe97838e606aa35b17fe2766b23fa05178c1e16a1b1045bf7e7fb513fa4dc8b32afaa13b3ed4d491e91ac83895eb1d282a88da37ec5d90388d94d5e9b090c4e822acbdfd2165d4d8a226352be76d684813dff9b93b36ad6921d08ecf7917b27f69a5b15537c19af8caf25e2a19d00667ac201b4d19ddbda63d7030829fa34270170e57af5f408ac960b430338e52419f29187b0f1c22a2c362596e7ab56b23ae92b11da3b783cedc8401ae8793709e8e948524e1751bbc035f475cd59d4c0286c8212ed7afc556f73baef46e863891b26e64a069228f904f66a0b079c1c5f76ca569b91a0c93c76b6909a4b67f04ae5d7e9bacc7866e662f0934696d774ae416e8a6b1f0ce153edd832325ffc8e574812c1bece0ed20dfc6691e33d22b955aa73b2cf08b7e529c7d1bdd5ad6abc2afc4075c020c8e93312712c236ba2de4272b348e0f53242993a3ca47d9d6f83e48e0d83d446d5b59780aaae6e09bbdd18fa3c4258f761354f1d90096c0eb92f663d8acc3f87ea77f4127551d60902cea1ab20f6abca7f970600b553b6c61db85ca465053d199b0453f3cde8bc08991e78919a930403594fe6ae9bd0aef80cea43e897011ff467026d619626c6ef6e35c19c6b11932a33dcdd67d0a59493355f1c588ec385750345cab41784d6d6d3543ad050bb541b774e32e0218e211d1d7397eb2370c78b8b81a54dfa1cb06b9f36dac861b20a232d6e748037e0fccc28a6fc73340fe445d4e003422c8da938458629ab0e37fb04d8a433e85314bed43697abd536e0144a7ac296f1884ecbd70ee777f7f49b3ac65fd23cd1b60c20868f5dbffb925548f388e47fdbc1a4c9a3816c5ccd2dc069ed2a72578bc2fa8c7df2ee76ebdb0008ba13dd3f45572c9c886ba2a74d9751a5d844c165f375844a9e5206a210659c76ae3f59f1804d275a359d4a97ad3f1e962af47c1d338bd31fc9cb9366d8a78497de82d62ea2b48bd488435e230040685c9cf82815313a87007e343286fded07f6108dc2fd45dc4dacaa7668b2a749a5c5f49c2295913f00bb391770a3de0afb2ab179d01acbf1e77cecd4d34802d96124cc70996fb14d6c5d08e1cb8aaab540ffd4b8eb42890aa3cc97f72a9a5aa68623a396e22acebf32e8202f6fcee0b36dc527f92ed6a30b6baf9b4e2d79f06d372ca06c27b303dcd01ad262623c71073691e3ae18b121d1aca717a465012ad293d5ee0659c36ee9595d19fb92103eb8b9eca8c2507f9509ea4e7d33bb74cf6fe0a17ad2811f2f07d466309931e240ad32ffaadd15d0ab3e5add82220090f", "535252", 2, -1720568688, "f6eb585a70ef0dbd8fb60db9cb5ec75c9149f8a34e9e925ea9a0e6b0f8c4ae39"], + ["030000807082c40304db4c192cb209161469da9cc9ea6b01b6c0c3c257638dda004735e4694af1c5f100000000066a6565656a658a244e940fcf44bce30801417c92e6113f18fa17dc3b4d48e8d9bfde845c1e5004f10b41010000000800526a53536a006affffffff22ef4705b82b684009c1543b4c66b39d5a8502f2e3f848999c5cc81ccba62e60010000000953ac63acac65ac6a53ffffffff4375b5c033d8e44a626e208a29278aa48116051a9e226cda8e8863b53c06830702000000036a0063ffffffff01e77f2d000000000006656352526aac0e10992acfe208f00300000000000000005cddde020000000011ca5d44028b6ddd36a3d7389bd32369f64aa628867104cebc37a2a1f1a5ca7ff4b8db40e0e79a48fef4d5bcf8e79204444918a498cedfeb5ebe814b374eb62b58e8d1ed8fb81985622ea73b83b71ea75435af8bedc9c95ebf8ce4473cb65063000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008e2a5c84ffbeffdc9e5d3e7d5c19eff26ec600bdf0b7f0879ef7523de48c039b91ccdb3b58f74dce2c02728c27bab675b1f9eba1c32598cd6d0dc92dacde05eeecb6c82dc76373642da86af1852445e4aae7c6972ff1b6f566857379bec7baad66f5b1540d9d8816b33937e939d48f60dbfbbb194d290789e6c5a6805aa23e7b0329afc81aedb28b640cd2b4930e0fac290ff7179a2da8a57a0fa8dfcc3820e7a00326816814ca2c989f0d6560dcd60a459ce0f1a4d33087f7bec9b2820d86ffe9980b03fbcd90a830e4944a834b4935ec1c6785998e4c6e7cafdadea50b4e33362f9fb195834221d0d75aae4aa775a43d3c997aafaaa04df06a999eb59943d9498df5021859a2382dd39c7fc0d668b9a7f06734ab1d2cb4a817bf41ca86adc9f39d140903238b6843dde58b9da6ba32cc07023ad0d4cad51d153376fa69108741eba5db9b031bcce773eb96725edcef3aa0c455b57000e774c5f277fe52f6598ea2311e89de032c1e644500088c33fd263e3e825dd4f70d4e85a216eb55b4cae683f06755bda7031a49c1a5ee02df894d9de2c042dfcbe5418c56b8aea8af857e99226ba3b7ff589a7fc33ba18e7d21e55402e7d239d713f77b90919904c2fc6d2c87b83dc78d13f0958fba50d5174154edcc9246b31236d2477e878adbef8e7134bd20ec6ef5054559249e1d1f6425349a4f406e0dbe2540626b4adc5faeb9fe6e77be71bf3bc089fe395436b00d1ebdce72eb5397c70264fd47d3052ff9b6c9651416fefc54fe73e6f0d30cf0813bc2a499f09a82bafd62a96625bf89c1ae4fcea6440dd27425f8cd929c3516588b79cc12cfb9b1c6e52d7fe1a9a24513b09381ecc8e2167dd5aa1103846bedc63a5190addec2b7ef629b2bef15c5b531aa2b38fa5a186124627b1ec8570793c9f065474aabe4fe4d79fe84d7a9685b44e9938c5a9ad003feb7e56eb555f15480eaf9e6e2a043386f3cc6dff11876a6451560079df0a9b7bacc6c45ef67398812e00566c8e1816ab74e739712f99a7c2998268a5056f0af6a5063323563a17735fe1d7568c7442fbf18d394a1f8fd2e112a636dbef6cc5a3085b8c4a205bef7883364fae8246b565bbd38dfc6dc5fb4038fa4160e16ad0e295f4ccbc3a3ea1f16e782870f7ab9d4c7b3b9943a93bf21a9022c0e2f0d00f62de2db67d11ac18e1bd6a55049908e5bdb3021b4fe0626150bde210fe9c9080092620a4ba97072169b5c1983b2d4b1933b947317f31a7467714e0f9d90f7e3548ce9b9f5b5f57062def12822ed74295f50730e99c5fb103421f9146df460642c7c7a31176171618a582369445d291ec8e63e42f01724d1f978bf29d56c774ab28033d1cc2e285c10be1ec7bdde8593ac0ed2b0853a4eda82f873c8abee930a86286ca03b9d1c65d1a29800470bd399b680a362890690044a7e859ff543ceed5e410861b475b33e882d47db9b32384f28af22d23c153e24764019be8a31b8b87d6b444f487778ce2198a9a7cd0f83f3bc5dea681e5ffca9fdcd95e250db417031141f11203b4aaf00fea576416050c1a31a41eeebd95e18268a2885d8ad9511103233bc8e02e6bc8e65daf7222d35267939f6aecb9df069e787a6df7464ecbb1e60d9a614c9ad25200f03227192872cb0644116915d2f7bf3a67cf936492fafc112a03c975ee3086514ff3f8b00ed004621becba941677c486cc825187e3ef343d0d2e78bcce9e939b06ce6c9c505ad0d46bcf8b9a4196a96b8eda20d2995cb0f9ec49287d3abb48055c49db5b65e4b709fca272fe27bf6f124c2dd4fb2494aca6bc31d966fc246fa9a4f4895bea4cc35a9c0e3beeb23009166881a573810422109938288022bfc03eed22660bd6ad9146e1d269da20ba9adda03dccfa959d7347aacefb21ee448ed75b9c49fe4be1ff1a264e643ca891b5cd666016a48fe918155919301bf9fc028d36ec5b67e0540335da47105d769cbef61f06c5db56658f2ef850d239bb6ed944be7eb5c5de4a26c39d978396e64b17ffd5ccc1d941351006d881a13ca2d319f628240d413a6f78735d6e4b8ee42e6d8cb3bf8415707711fc1dae43846a05ec0f15db17812462e94000578bc0c6151be97165d11a6d210c6cb106e76a2d7cf013289998804c47189b4bd4c6a6021f0ebf075d6a8f49bff1a537cfe6a5670b95f0043cdab95c33a09ff08eaac84a7be0270abfc114a8cdef0ea5fe94122e1047479bc56fec399fe80589664583d97be5b2f76fcf71f44219f0b12ae142a7b5f53621ae381510a13e5b803c4929b8edf00000000000000000000000000cf93bf29b9e0cba9b07e3649ba67363416403f4ab2f9cedb56f7a0df363bfa2f692af4794f2ff02643210a3286aa810eec1a46ffdaa55a28ac709b7f921fac2ff5658230a064a3fa19872b572de14a65541d2cefe9493c456dfddb50d1f337ef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f044b752bee56c9071effa5b9282d041211dc5165085a4fb70116df2b14dce65459075ca62dd7448eb9a9b71bda1dce2cd0973976e91f940c2f6f79fed8c5e2a8aa5edbccb04235de47b391e80747ec7b85594c87ff349269b11c345ec3961ea33d24bd837ef4e4c83f022d56f20c65cf426b82a8ff9395e20342c551166b8cf030c54567159ab13028500fdc4981a1d599e0d3e990596a1eb1642c00d751ccb440318f58bbe7e5d3bf1dbf50344e359833f6a527a6e9f841945f9b4bb775b13351f0a017f38ff3747ec350302bb4c243115235fb43fdb8ed72ca221cf8126d3c080819622bd7524f4d8e3d9ba02d62c284c4b2f5255c3528ceb41ace71f93176de11d032253c7bfc4b9da612f72d7b2752f35f4c9771f8e45f1d2348e313e6843bc44d1022773a4c82fba7533df7186aee4969a9b3a715acb1967c980c52066dc8c802d3403266d3e01e8b1b904f299731f67c5b1c5cf6fda9abe1e4ed92ee5ec93da49beb80324f472f0f22aa61b043a03ff3bf2a312e2b7711fe7b0789b2b7387bd8df41409030b2cced06b53bde451da404d3d1434e643e02bcf7c40aae17adde4e8165e19803175648ce607321e40499ac136c48aaf8090eefcc7ab204ec59b6153668149a1357e3968b5a88a87fae2ff088b296d5f2ba8c99ea00289e438e7b0b19eea791ee1acf35631c84cce1afc920704ca7bd54432bdf9cd33acc25d8059f2ffea64bb8d3711843586d2c7dfb23a15a4de7ebf42567d3f893ae1055741dad689911830651cfd84bad5f19ec0239fb0d9133c358f88a1a8b9a451c3f9304e2897fbdec8e956f75bc3148ff223bdc8d388b704922f3457029731b74dcbdf45dc62c1f01bee88c7a604acb04be5fd29c4ec42d6518b636a9fd40ab4c368c3a29cfc30cf764ddb22239eeb47801a39af2b23b53caed88ad3c54db087f125d83554cae4f1eb4dfcca2f43588f3972be022ba557c6db9350c6fffef7642a3564841fc567ad5562cf352d703d01e82fda9659b8527ec5bd8fc9a11c43209e16c88d7729079930ee25b441463a6afff3232f7d088d3df7e0d4e9293faa56e69a46562b6a9210b2ab50d1336efb6653befb257801877bd15846657df7235aef88880c623c57338b22b2589538a91c3df3a91f9dc76828b8e60c6b7baf2c529d2eef54e8c2ce657d45e262f272fdbce1aabb4ade7ca93cd40f3be3c27445ff42fca620908d8ee327f1dd89b18fc4d8d1eb13323a4cbcbbbfa6ec958053eef1aad958912b4adf5999013f0aa2d48627d4725b23b0ea21fba03da8a53b7fc432d7e8a954f519b94dadd15693f08e37af41c1bb062369332098c15c06bd4db826b62ff8e0f91f7f9d18aadcd809bad1efa5103cef960e433f910dda92829a0f6add2de32a4b6ea6e6dac63e2011d5d0935fbbb343bf5ac8adc32ad7aa46799c7c1e5877fc850602807417e6bc9cfd3dcd8515b1fe2730f13d23a6b52246a844c499dab275d36b26ae329258e6516d0d23149ee89ac87594153ccff0fdb1e3db3bffc65e69d43ebfdb9e3d1df949557e7ee5df8cf422790bc379c83034a932abb4b02fcf2a7b1c0d332200acc5c1ab33728820b05c402604386fb3a4142326bb5b24092538b8fdec91af181b6536085341db43e399d62daa87612c36ade7b2160a5dc1a2ef717743b28eee31151c77322522e873a712020683735f82ebd5501fa2de519cd53ee68dbae4cbf9b26ee79a688c127702e0233a848747d1b92a0e5af8c7dce2641aef8564b15ed2ec72f3dcb145d6ae1e51a230c5eb60ebbb5e70ce165eed06884e1d7379c10cb7176b53d4991d46d4ddc33bd1e2a8d0dd1209f43ad3f2c1a43bc0c220d90f617a8d641e4a8f5044219bd08d729f13a5871c75d1da74e3b2e898d1fa6fe01c492a0bfc1922bf821459f2c085c51de17a3c109fa065ca8a4378ee8f064d0a9a9982cc84458895c7481ec3dd8ccd354dfd59182f153da661f0eb139ca1b3cea024ce8b59e88382778375ca2db9f0d60e793caea5f35ee665b11c946d9f38585992d61de76a139c166f77950ab9468eb6be91be1c891d08673dd11e01b5ab02a9a6e3ea9132bebcbc35e8fb77929f723e6d0ed6e6ad5e1674578ea708ec27b04196eaeb7d811acc9fae96aeb1bd9490049d84f3756f74335a1df75aa0dd8e6d88a3de5fa83f56ef7bcdec7f58fd57660104a9b9ad452cbe0795438c32549b1b5041f699a2d9b3b1f40ef295f2a86f953a93b1ac08c44e1af4092e6ae5b9a97a632013dff2d3c496d391b98d3c9a4d24a6008a7cbf6204000000000000000000000000f1a3363fd47a0145102430a9add0c510a4631cf938e2d6e17546a92aa32906a692bd8971ec40ce1466d76877091dac530b7e9c6ee22c3a6b2bf4a11f2f04fa8369b5f842fa6cc31109a4376ffff4bf66acfd96a49444eee7fc9644f2cf4b46c2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007204f117fedd4215022ce17ef4e64a61ed8e6ee722fc71437161e16654e30d096d2faa957bd936ce69ecc06626c5b64f404daf65d712dec93a8c4653868f952f65941befbbf214daa785bc67dad3499bda16e4a65d7fb07b36a1de7e543879d51ca649e0e0bfd96103bb77b159a8e7a363837f1aff7ce749c82042996ec9d0140210b6dd0549126d8d88197ba28f085db2cceeca5cf293d9bf011dbfafaa1565b90229921b4899eadc2390cd4d2bc966d40dcbc6b17628c47ef24a2a590c44fed9720b0491bfef8de7d0b4208db0d0ed0d3eaf9704276545c223b4f286167d47a31affefca2162791f2200e8ea436570a78d7ddf665fda6b0e84052d6b95cd09e21da20307ffaa2a8b6fa31c9e8ee6862a81fba28edbe6601cba735ff7eda360ee777d6f02223f5f36b81a4e2a1a6eeb5466e63b13616a6744397637ca24d9e461e20a8ea5032e0ffb3bf79326ab62e596fc7072b9e9984c80916ff71584ebe2860464f4ff5a022e793e9b8978e2bb2b76de61ee71ca4061577fa831db4a0aedbac20e2962982a02078bec99dfd69f4431c9f1059ea3fd83bee60aad290b5ee776a3ce0fa27223f5ce8d830f302d4bf3c1e745cc9b814f14a56504fcc7917a7c7da509bd98b755fb60312ae62050b919d01f52109b19d1b8df65f13f8c5144ecfa11b70c3a96ba691fb53a2e984b29b3996306b176858d416b20d90a894afc64ab083cd423cce4807aecf176bfdaf6bd63398bc80fa3503171c4f96174d05a48c13ce0e5a8cd0bf21b9705d821c92dc1bb849e4063a8067c7fdf97cecc07fc963f73c6bcff6f5fb7fba8280d3da544f073452fd3d2aab877a91d5fa9e6ccab2b3dade4e5fb391dbea29ca6be1f16812c55cebe6472e43f3bf35fdda290c058b864828f3fa3286549feaa64d1760ca7379e6c914d8865efad6402f9dbb01b0c49664bea3977e0735787f2616c1746d52af520c09ee457e5be6a13da27322743647fd8b65ce2cf625607a80621506853e1a4d33fda8cc342bfdf014d2a0d867dda789c495394f892e013b5525823785a38218544c35ed1801399ed6a86e5bac50e804b52250aa275c0bf2ee1e9d286000d3b7106f28f5f1d079666f2249e8be23cd5bf4836c13477b0b01b7a90fdf06600d80fb006442faa847e3dfe43c014681ebcc0b72ee1f892274e52933bcb3ee682936e4602d5be414ce2e0fb5083d6acf575b37487e8e507caa9358b8ad1ae50a1b3a171adc445e9d2416bbc8bc15714d1e0d1dbe60cb0e92bb4790ea9e2197ffd117ca5ebfd1c88eb3c04273e0fe3ec446449c477b2d81c69d0b97570703aa04837b714291aa85e6cdbd1bc2569a3dedad78d7e4c10d735f41853952dd7a7391de52a6ef33d996400b9ded7a24577fcab047ac7fc1c11d499dd8d382017fa1dd964a05e71b14a76d149fa69285b917dc9de9b1784fcdaf107e58d39e5db251f6b8e67360e58dc1c34aff56f32e6050c90447eefa07a51d17d51893c308ce7596cb97899fe9a78573e6876139f7d975d3961f5231e1f68832d3ca7f33a508b7f7435f52472b3115d726ee6eddb17262091fba1abdc82792128fa895a52782f40e3c10fd3339ca044198885c4d325185d7af1f02ba34fd7e2025763f05159aa5ea6f354b8f3d747264a3bb464761d55e3a967fec1a050167589858560390e62907789a0ad9197d2939f7b7096833591f219526da32ef7ac0a8790598f59eade85b0c77cc4a54d8157837c7a7d2abce9474fd3c41dd977c353011eac6c8a9050ebcc66b149a6883e07f920625d41eaf954c17377bf6b744197638cc456c2b28c776d2918dacb9747f783540a882cdbc772de42c7be75b289593488d1293a73acd94fe39fd02640abe0bfb835b1d59fd552d97eaac356b292b908e2498efca809aa237b9d3622a98efb0fcc2c6d24d5f22d172891b03ac8ca0522b984cb1c2b7275470ef1679d9229a0f3a70f5d3e00d8f75a376c3fdd2ad895e1d007b806c19f1920699430aaff6b3287edd68aebcd768cc21cbf065ea4bad0c1632f570195c44bb9017a7c882abc9d1f2db772543ec9acc6f61a8657ff63e6849597a494b69848922ed8dd0895db3df72c725574126037ed4e358b6eeee424afcdb59b480bce7ef8cf549c3307c2de6fa422d959bb7afcedf040d55a2d5a873256c67f444c668487f89ef6b6803c96942a24aeb2e74b6ba793ad28b0ffe92fbd8011d861ea800b858b309a765712e071136891f92b6a5af806e10d52d73224298c22cc11a19de7fd58daa26eec5e0b325993e9498c76023e85d0e9772cfab7bad7929d89a9e0c0cf83a0a5b23d7a5b62fa1c02d078f34a454df32f18e31b1f8ab162ff5017f1e2d9ba3084318dfbab6cca0ad21b1d5ea9d19f0855436eae0591bf4c5ba8a3f5e6dec1f1a2525d5fad43c304", "51516a6a635363", 3, -571507266, "536670068a7e4da08f05ffa9db4c89e1e3951a1695dc2b9737e1b09fe45afc5f"], + ["1a79a5270344e502321b45267ad7068ee37364b8fc9ea27cfd9f5e1c5374f85fdc7e0ee0230200000004ac650053075ff27403d122175f197f485394d66acde2b2f82afc03bc56d0791cdf4df2bd26af74c902000000055251525151dc2ec7009ffe70fb8af2828825ec9c24032acc42eaea3596c0cd74b7f8ae2ed84c63e8d4010000000251acbf6c5da8011cc47104000000000053398cfb013efbdb03000000000000000000000000ea028dc19d03ceb62bca25d58e3eba99f5e8b1ce2e3846b284de1af4e1063b19a3ba49693ad54317ac2ca13d3ff0712d6ac663b497e02d90c20244ca95b7bc14b36ad7a12b703798449ff5a0936de0948e881ca5e0611910b243c56775e5bd2e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007bc20223348d3f54779c0577575fba11f1be75be90eb58bb710bc23c0a78d00a3cce66eb5563dba0bd0a3f343f86cc581693dfa609f26b97b17fafa8b35ec030432acd036f7825b1a32cdd6757330cf8259882ffc75d7eb1dec0d2da91cf83453bc859cd0029c52b09a5555c3adbe6fd5569b265feaf1fb5dd5ff5437d364bd60325807c9d6dba099700ac0c6d26637889c8046b4a5c671ea69c8c88592d7f1fcd030d186f6b1a4f9d44cb822eb5d2922ce7eb109b93a8330c0c917a0a3987b1c7940b087da52b32f2b0f72a60f37ee9ad366df3e26647641142f3979062d2093ad99a6c908835c67c56aca30a36959a7047c5dc0ce38c0588918734927183d66e1ee40214d1fc06aa092c725eff99f5784dd6d7a239f751a16c21989c4bb6093aab2ed4030dc2dba53bd6c30ed2d3a0d94665be143d8e560560e4e041630cb2a151dbe024032d57bd376b34bc4ead865238fb1743d16e49c9c98f17e9a73b692ea1bdbf9fad0325d12c27015c371a5d1f14b1703690f30d5c7230065cfb8ad8fbf4b5ea943ca303066c9fb056f46189ffde3b4396dc41de2c2681ce5cd01681885924c66159cb14464ac9d0a9d4ccecb37a48d56e72d6a8063df200819df7a2a40072b1f001dae3b4ef94aee59e4dbd3555ee0d10a3e1fd46060c76062080450e0b4b506246e16f9d9a43562fdb016fca6b046d7415d6b8f8ceb8da67ee98932df6a16546e4601b7424faed89a8ffc3d66bb80e6d2ce7ae84f905463011d579f8e8379720983d9e51142223ca0ce0c7e60c6083d0229af1051c261d9b21e69ed86f7763d5f6fadc401f4a5b16b9c7dd5f7b1e89d03ecb310c1fa9ab6de1d37e88d59f3de998c18a79406c15d6d7b7ddbb1b40d4ffa30bec883a264162c75e2814d6262f89d617637d3f9c8f3b1f744e4bfa0c3d254b862850786d0239b8563a1cfde5ad0ca5e7214ed64584a3881a080466a9fd41eb724ea31799338ee14a7ec5caad2a3ab4b52f7da3ba0b5d07c4a6e2ab0cc42b3b38b46be3356a8f1526b2960bab12256581f007186816e18da95138a0d98439bb93c2f08f16dd4c7b663b93b85eaf43dc0c95b423f65aa0be95247eb1b4119270d9275420bf83d258663c533ab63e3c7039afb5731da41406e7b670043dce6f00e30fc308eded1a88fb8c73c595f1d2edbbc346ab9a0238cbfa8f192216005728625ea523eba03f711593f725d3f25c1c381fd6003e5bb9d2b861fd27832fd14e03d4abd465b9751d31c4d8ba53aca86d657d1496fc59c11612b64aedb3d49c44e88a5ad4b2e23711ac369c6bffb28cab4fb9e0edd65c41df8ce52c1ce9fe66ca913c858c1487c08f90696e413c449252b4935dc7736d5d66de450447b0652121c6379afc3d5e2713cbaa918e6d275f67ed4a1f7a476f92d0bd6616a27a3f754ca272994d518637db3495ae033986875e36fae5b5e611fe0cc6d5a1814dce3ba4326464c226e20e93aac503b2cfeb0d15bcd0812c6f379b732c9885c4d40b23ccdd6774698c40f0866964733f158c4cfccc00ff0f373f9689aa613cf5176ed3fb8c69d6f55bf4e1e2e45d3ea79b41271ec2bc3ce6fe65c1939ad4e94922e4892fcdc72fa9d6d192f6becb5522692bb52c6f650e41bba5dfb9800fe017b5cbde55cd2b3c6f45f9f8fcb1dcc9557b463c5ea4128fc11f138872beb8f2b2c0025b84532a871469f7cf3899a5eb88617e2cd5912b6c81fe89effa6e871a18f1d4dae8cadc6ba78076d75a868a8ab9b3f8d9076e84f0825b35907be070d17eb1fdac7ef1e863cd7cecaa23f9667bf301c505efa4b21f5b2d8fc8fb0de44c5392283fbd96d6d886d458250ca79d021cc87dcc9282e38a88a7f33117a014f34c998550e3c55b52ab2f604f410d2d99839c38c6da76a3f97ec289dbe3959a0d2287a4159926c8367b24657e27eb559ddb8090145547dadde43a73448389d6c00803c8871402a026753d1de4c3598ef76c1aa516406db6a903a9af0c43349505532475b947411e1e5a6afc7d0d7f193d62f388cbe287510859ed8820b59251778c798f173edf2a69398b7dd53e6c4c5298f897a28adc184cf7401ceb257e8519dbcecff33301c53e67cc28b9b0150310ba5c22251e5c005dbc8fa84fa0d97a50c849c954a02384850d39494bec955da28c989de877853ecef4a730274dfa714a019bef8ff926cbf8a1d16118f5d1b8189121fcbb9999b5f8638175bf87e0629ed0840db20eea3f0999d878d0c100665fb705280749ab1e3166945914f45415acdf593bb3f05078e2722b9dddbfcae3e8cb0b48e86d159b08fa290872531cf9e7f5f7b1cca2940830c2ab655da394038a4b30c531c8a2e7eafd55caf03b3f5cb516ff9aeb9f3a80c0088831626f96435ddc5b8a1e287d39b906f6aaf28460ad0f5da7bf70e8d00d8805", "ac006a53005300", 1, -610973897, "81768fda5166c59576653a2d18203a8a0e1603cf1ea9eb6bc9cd26e3614d319b"], + ["1df84b39011d81c7c81b9125843fabaff2b420b6ec6dd82973481203506b95c933fcd56d1b000000000665006a6a6a527579a56704f71bcc0300000000015201ebe30400000000016531a6d8010000000002ac537a74570000000000040065ac0075569b780100000000000000009938a1040000000028efafd58dd785e0ad377ff8c045cc1e8792207d14fe7bcfb767d16e9fec5f23b3253d8bff87e3f0a960d07065284e50424c97c0e40f04b037119c93e583f75e695f5f3ab7e4bde6342f3b7a060db510077e33ee0337c65719221c6f38923fd300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e52ecb2390e5d375b1ef850ea69eadb95d3b90f33ec7b9954a014e843bb9ed388ca02bb82e6fa4e7aa3172ab8d7bba7d58e334197774cf6d2e23c372b13508f3fd596f20d37b77c4670c8a3f074aec3657746045c17ff120926ab0d7a8e3df761ffe72ae1602cf8d221707892fade7fce2327020bf9f11dcfe2556ccca6f8ff70327248d22a1f91c684b6aaf28654bb0710229584e2f6e82f81d043f15d931de5b031739c142321f5433b8fe18e8601fa3656cd29bf477d700e49607d0c2cea662950b03bb4bddba1d7af9a5faef9bac8d7cd34894ef743645e5274bb53e544f2bb4ed45f1058d4bbbcd9e01e1fd21630487629bd0a0825a66451aa4608ae40d329c16030820b5177c25b4a7dfaef289cbde5b78e90126d1faca3c58f68a468020bdb9cc0322851df6e6790b3d6184cea06377e87fe4b4e7c5f578d9c9518bc36df06595ac0222855cc03f66303039e83a48e3ad118b78421a8e4c1efeecfc93895fccd44c1e022307dd6333bc0bb129823373844710ff7832c6f1efbfe9ac984768b866f105140207a685d5f1afd97606bcb8a0dc4fdacc995522374da77b2f9bf4890acc99fca082a5760877831a12058b195b5d228082c1facee0ea8cf023f30cb85184486a69558fc1a8bfd5569289ea9a5af1ea2e5848b23e57ac71a91463700856d198d40f665e9af03eaaf4f177ef6713bea2800704f92ba1646ad4004c2ae7ec817217d99547b3502bc48dc34f22f0c2711ebf3b422e0601b0a2ed36fe2e22c06cfbe15dfd01970a2dcafb89fde7f317c93388fa551bec4d5c3770bdbc36de89b8ddcac5d54c269e364890138d1f46b49ca6426db6b0b069710e06ffae8521697392d7b5c570cd544777dcfe5fe9658dd3dc3a89744d7990cb694318c6bbd67b461db4e53b7a12ca312a03507ca0052bb1bbd703b6d402884278f02f247b357f2d613100b124e39381ff44c8d238c9063ed4b9aac06449e48dfc668990ca90cd89dbea9b1b09475299946e193f89348279c5d142d02a251614428d1064cef9ab48d8e3113aac356d58a4774fd9dd984180ca36d8d642334a7da7d78eb7459196afb4e401488f3dec4cc5b4035b318a4690112fe11ab14f0f246d0d8e747bd6ba683cbeb668d5588f185de4127d80e12a931f7d0a98a4cb38bc18845144786775360461a80732a4203100bc58d7f63c546156fb394111544bfc01a1c339100c9da14e59a4688098a4bec2ba25323016fa1a7f0b2ea1d1f485a0c0f6b0dcaef5840317b96782827b7755c3aef360d7844e2fa50a2a76c2256adfed8fb868cb9700b332c6c6c96110802ed492a3da9031a03a9c41a957592c94c96f49d92767b60eb833bf19c2c2907a064eb4a359b5a5439166b171cd8accee740beff9b300d1c31c0d3fd262cebbde5b1c82054c1a296bff670b24898270c1c3e44773aa74c28ea5cf8cc5a0a3266546f7a07cd09131776d877902374e185d1281e55b64145b5f0dc8a0e93301142c40937b50ea256259364291f81bea859deb4203791be5c9883eae2deff1803129dd22b644b66ddd133a95d4393544750e28a5d268ef5363b13f8085b6dae8a2ed385a70fe029e34383bf56eb48cce2704576f44d3e62bc07f1912c9e19b4346f6dab22e741571b84b10e269cfe1267d403ed690bb5fe2679e30770a431116259c444d7a0791f09fcc30a625523fdf4f3007070f44828fed3bc19e8952cf4753f66f523214222147e00fc7e9ce17f7ba3f2e8f83a83319ecee89e8c146aa1423ea4345bf77142232c6adbd9499c755ad7acd0672b380e706b6ecff25a18f8ab937856569a6489a494089864a97317c8caa8a5efe0ef88ad8fede57317eaae8370459f36f275ad7045e21cd47837fa72706dd431056ff30db90b7e41d66f207bebb083c7d2db2c4c495ddd72f75456c58d10d0dc46f62b8dc507860060425adc9f2dd8870478b285e6e54195cab412ef65259529bbc13f3250c0541b5d86bf79d37325dd7ecd123c1799d62f2b07721aa3c43fc754d28859b2b29cfffef9a6097dd72e56705096df54a72427d7d125d9a1b162d09283a408c0d7c05ce0ed2f46d831bf0cfaf7dc0cc5c709136e2c713adf66f221a2d40e680feec877fd84cfaaf20bf5d251534cae278ac17b8b92de918485f073a7490432c7239cc2f35873ba6f4f02f87a4dcf59f4726eaf20c876515f2a5bb821d7046a427f353cf0553f852b75d7f030fb427d4c88a0fb85ca745de7dc91a3c31fcaeb0b15edb7f8c85be7af45d0ddfdcc76bb576f6087fb9c4f1258e780273325102e9038369c5e1751c3ffd82f67daffd759e5aa4fbd1c393e271c73c1727897a987ffcbd2f3393c4e1e3153ffb506f38567ce8c99c29898b902523246b41ec94e8418f22529cb7cb923bd55982073155ec1499213c2d276100", "53ac6a53ac656300ac", 0, -748397502, "e9f38761325905fa74d3c8df0a4d3807dbc0b21667e0e745dba6bdd75d9b87ad"], + ["030000807082c403014b1c03f9d6bd384a4697794f937201648b259a0c1b89679e6b7112ef158947b7010000000153ffffffff03cd3d630100000000020063d45ee3000000000008acac51ac6a52005210929902000000000465656552000000000000000000", "6553ac00ac52636551", 0, -118115006, "47ec36bbf6c570fbc881708919817f87a7f7a3be7fd783de774e1f59f127ec26"], + ["f063692101f2199272f96b8e77687af682508875d5457e755fd5219056f8f2b2dd0a679bf002000000036a5251b86db3e203c9183e030000000007636a006a006365d08cb8000000000002516ac883da000000000008516a6353526a530000000000011f7547030000000000000000000000002dcb8c6ff6b53afc42015c7e83eef170b8ab7b4ff2b29ccb645f2daa9aced516ada7b114c54edd6222948445c2304e89adb58b0768e68e34bd22a30a9f7e5ac1e7eb273df33464a6017e8adec7ee89d159b55408f9ee43bf1975b3ac567fe1540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030e54e685fb71cdd79acd10096da8065d4871edce0f14254de1f98e5dd611036a41dc13502eb774bfc2f0c9fec6d3d0f2af7aaeb5e021b91e502df5df9af94cf075c2837331dacce18b7392238f471f8e5fd3ce3175f93e716b05e5c14392b6295c1f2139e545bfad5d4ea73105f10849195c8613e022252635032c8a9831c92022c6cae949e7270eddc26e39a0a66564ed7666aeec7ce1a12797df963c985482f03234b8e5c469cd95d134c14b6010216699f27d429ff2fae280a2b36a6b341b3990b062df1619986f8aeac14333c3cf1af4e0242ac5a377966ab92c8f453cf7a894762e0c5f12eddb665abc1c13af0d45d991f214027942fa94f1785791e59d2770a030707dd35feb485c0d0b55d65e95571774082f85094b7d6559af4f8cdff4a022b02246bcd0588421b028d31cf0b9693458f78dbea9e4570be4c29917f6435444260032839c0ed69b1a6352c48f58f472e414133d2a97c8951e246c69398b928acc9b0031add4c9b687703614ac695b02ac55c3662e607053fc0560450f9b11b3315b613020cd48ca68b6c9ec8827acd66e4c7b835b3c9cbc2c647758adf73bc47fbf42df14f4592c8f6b23f618c5205eb5bfb5cee1188bae7a9ea8f7a4965f5f8e68d6350d6910e3b84e716e1d195f6941fca863e731c8164934b993be00c240aef122d9782df9ce607675a7bf0fac95c3eb75c64e7a0524b61d2f19321919b1b180cdb445902c84978e8ec4b8a3f0c78454e3925438ba3f7d29df302d9bf8121dfe343c312944449b77fa0467c835d663a0b1077492b466eaf389aabaf9efa159f728791af947b27eb579859749119a141eb4b6de7f6d2de0b14f38a967b25fb73553d397b7fd44247a090c923bae4e1008a88b1fb2bf971d77a76d7e6022a6be71a81ab7b9a3f1eb6374860122572fa8ef368351c8c0b63151ff6c883d817671d5c557cb66842501a13e6d496f1d4a201bf31b94bd27e9fbe86ca602f8627b4cb0ed0140d1b08a7e464a36e0bfed88aac2b753322a6090371fadc1f624dd564c31bdfd1e18e3242288651356e1818b69a1b958e6b9f0fd2f3ef495bd98105b862dd6f6592b47de5a4969a3d911683f316fbc0714e50592ae0132b792548c5df2f15f3c16f9b342ac455fc59c00d5939658ad526afc925ea80e711f5dad5a1ef54e7f9df87ca519f67b604225beed7efe9f4d7d1ac6408f323355536aeeaa259ac4d868fa149433ef7b8ba896c8bf48035ab1f1cd715d1d1d4e435f23e639bb91058c46aba96feab797a2ecf84028b9afdec3a0047a86d5d43bd22c3c12af3f9e3bf51412fb474445f0143f9306b42ead51c6bc2c9265668efe6fc877107e903ef01c2fe09897f78af7ae4a8bf81a06142c10ab3082d9bf62bade097d296bc1e5d803a9c5936831e7cc024c04e0e2a49c9728bc00e08efee7c596736db84781ff7315ca45912928ed95ede2bb4bbb0c700c735e290e3e1289ace0113af2b4b42c27ee2542dd0f53558bc8e5c8ff2fac6eac7c7c8d196fd5b6f6db706e37fbbc46c3ee4074329d5d2dbbc01387398c6d64073ce1dc167dbb4a4ecddd990f67e35c58886ae2e74a4eedbae7d148d7866cb2d98a3193fec9051df90997788db68dc8780e0c5c062c87bd70800bf81a15f84391296a47a7171699508e6e12820d55752d680077378e554709872e2ff53377375de9a93ca614ba05b987c5b4a1a7126194e2f9a5fc038d9cf3c5dc383cf373918a18932c88dba4fe8207e562215ffe5c6588dfaa41702c2f99f90a1ebeefb661a1da8e41f935218c82377c59d63b6bf364a67c607c325fcfa03886113019ee70ec3d68617b424cc881f65f666d8a5f02ebee89162a4968b2a05747fbb677e3faea737bb1c823e153d942b258c9e913fdce10274e55d4570750d8d3527db072a260b33cfa69367a789ff0d97853b05c9df16060a048b76995e8a839d6fc2fb663e1b698895d61f92e5b7e34fd7830a0b8aae95fb91cc4739c1904aa08ae49bc73ae4ce54ffb2b95c6ee81871e091815940b7ee9e6e53c53e28fe1dfc039749fe538fbebcfa89c8bdae84e8f6956b8a9c55d0aed418f2109e44004b4cb459e1b5da5ea28bf851b7301d09512a58f01d0bc0035852847294eba588e0c8dbce55bc9fd7aa84e0a39347ba1304ebe4ef8734035b72cf5b79a9a6ddaa2cb353970f033214e6850aedad38fa8aaf984ea4856050b4ab831d2a983e7f4edf193de8d9b67fe38d899eb065aa75012eb5b26e33be143ec6d1c5d0bcd68c46ff0182be5dc67bb09c238301cf5206e273bb0dc36ca12baba1291f44a7b0d1d4f1a28d4fadb24cf75ae2e094919bf0aa1bd311975b9da5c13d1606005cdb24c30f633e4ffdee3f330d3a16470004eee60c4bd586505610bd96e554020e400ea5a0085686a201fe30166b6c07", "00655200ac535365", 0, -1150659085, "5abca6d21fdb7e8c451b7a48ba96daff2d47e0554a09992c2c86bc8cca400c6f"], + ["030000807082c4030315f0322c5c5133fb4680fc956ad2e04e297fa69d748d5ec5986d36bcf46eb0c502000000056552006aacbda687c241079af417dcce30242154c354ac4b8a4f5f42f6d7e777a188d77d5f62608e7a0300000002526affffffff0081ca782d5907279597a47be9de46105e8e8661a76c8cef068366d35576cc1601000000020000ffffffff01a9ed4c020000000002006a0000000045433aa802000000000000000096f0fc010000000052cd2b261d8b32f352d014f722c64752ebbb4a09bc95b0555e98d8c16e222521f5f95a690f29b60b83171bee10d0e73949dd03f9bae76003f73ecbdd874aa95cf0f03ea2e6e0e79f73cfa99d5787f770f52c0d458f4b8d3711d7337f2f74eb5a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000da72c16e22acf2eeea49bbb2ef3b1e1eda8c96587dfa2c2f565d9142311499b87cdfe168a5e86283fe6eae730baeb453edbfc1b36c09da1f6d6b3e9b571a90bc2c80c78198ad1ce44545d60fe839bc98c43d0271a039277d55faf7158cb9ad13220f27b5f70797c8f4fc28082a2a0f59812d09faaf91ab58c8e60ddd2de0076c0302e4ce62e7d7a56fbf864f5729030f083c57a5eb14c85a2be06277601a94660e0305e1b3cd99101fee5b4ff4834ff4cfc5c58af613b27ac9af571072f18b8ac3c30b02c97080288a1eb6957c71f7b08b5d3efbbff51a7ab1f30eacb3bb3043d584b5a76dd12d2484a3a9f33dddaab0d6f8ffb482ed3bc4e99e7c493e391451dbc95f0200e974176b928caf633b41642cf5ff29deb059ea7e680fe74244765007b0eb89020d412d6975ac1953ff8d6e00a1377456d75e0eb98986c4511d6fcf56dced1eb3031607d37cd3b4c7ece547b0406ea4cd7cebd31e43dd5930155347e93db4984e270314eaa5ec9c2b64f3d293aa8c716e4eb5507126d635b3c69bfcf127215833e8130329c0398913385ffa5cf656f5ac95facfe06348d6fc96974af9a2f779828204f5bcd85645b1c1b9ceaec6b7a8108baa927bdf8865bf75fcfe3ebffeebd67ab2f38ec898855a523bf9df1ef75626d5a84be78415446de2dc5a392b63f655f46d62fcc62750acc3525ebf294726820af2d2bfab22f0fd3e07f581caee8c1ac5bd4959af9a5514e7cfceee51dbf3863f22a026cb4fefc582d3b684f6b011883b82486ae9c8a127d93b8494cc66eb69b3573076a7827396d627dd7e37b62ac43cf2ef168859ef647b57873a6b18ac798c8ed6416acaffba2caa9bb589b74fd9d4639ac5e5d3e7996d81cadf512d5cf8cdd80fd025f47dc073600ae9252b707fc6bfc84561df261d94313b9010a31952c3e2adf13e25d545473794e44b30ebe449369ea82c93b0f7c948d9f14ccf688c796dcfdef1bc6f8241bad0cc102dcc67fff60876ebe662b6dac3344bdcb5aead67490e5462fb1e23f7d005433ccc654911efee7beac690805969d0a8e16bdcf1a37cbc570331b0407f79b85c85b1b87b9e11936cca547c2d68da8c4cf0de1f2d3fff03e5ec19bc8c41977eab8b09728156651f9c6bb4d786b52288d540081c6d5b8573bbd4c3d322aead62d5a5b3987c0897c001e0c429de8947fc17e29f8051aa69fd336085176a5660f79cf602dfd3e8118b75de240e1f007f47fca81f9504045d940e5b52126f3e51f365d1573b26db69edfdd49b2d7c89bb23ef20472c314acdec771d16ca18e2fda653afbff7a2acb1779eb5564467be7fe0a206ecd53aa3fd66eb7b3d07d43c78dd7ed7ebdecb09bde2ef4ae897d0d6ccdd36c85742abb95b8f5b8ed5a702fee095ea0c4d1e13e4fec16560ff44308e5e0dbcf1387c5f871152db1706d671490462581c6cb36b9a8dd966feb4a0f01852eae7e081806225c46222327e6c58ed82e830a2c59be66e225a5f4e372890d57317e7883e2b4670495d104e1de8d04152ab2e2e612cfc3a6c1c556b85d7a325797f94b1ad875069d1595adb04db4cef2ab976bdc917f0567c5ab3146873659800dd5f75860cebaf6d429c7119beaeb8cb6c04a9c6a3d2df377322d7c00346a20762106ed55b7599a15cf606b547232804e354544f629f4e8f5d63fb9a14872a6df1013fffde7ae6b9b277961b08ebdc0d9577657e1fb42df6e395687a7062eac359bc4b6967e46cc7fbfc09518286a532dccb1929156c13e0c46dd76b48fe43dcb16661cc19310d92091222b405b778eed95100e25734d79a6a57db775131a97dca41b6ec01dd963ce075b226aecdb94757c3fe008624209e21b1da7907838243e11fbcf2faedbb2eb3a89c858f48cff959703694288b0b361ca12a24cf209fdab02478d8223830f7de434ad34bc5ffe994d2b27a9ea8ca5ff513c4c6e73859e23482e28adf81db59affc2f9d34baa192aa751ddbdc2a01a4734cf3c7e22e7202796b8bd7b2b10a47e5e4b53cd0e78e86444b81ab0a0ad4dbddffbdba361d51b4b3a6b5dbba0ca68304f2a18f3b7017416ea55a1bb35cd03fc8a05f66ec0251a3ed9927e8480a723f1b189724576750a03677d284ed6f0bf882ed2534a6525da4f083fd2eadeb3add2831501ab55630aad22a640774191f89f3d52f165689d3e1bac33db1ff0a9ab458dab6ae1b0068c29054341e34056583a8186c87d419f92d9e204ec9de6bb0ee6f42941656d719c32f61e1d70c43e1623b9b7918df385624deeeb3f0a305019f6d54fe6d1362050000000000000000000000006276352b1bc3b1e4a258d1e66f7f6e2e7f6699fcc76d596871dd9b404a6d4e9b516c277543bceae10ae68513e7b893f6a505aee87e051306688849136d4804725521d7e4140c5d5144284ff1ab508f4947156bfa443713d32a683b81132ea47e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005e179345013363e137802330220b6bdad284027c901524ae79fdf933930d7d909628f0a8aff31cd562241f3702846a0e5f2e5a9f25a13456de615aedfed20c77ebefd023191731d4aecbb5d95dd6b98b662c905712909589b74fcf8a7f2a50f54d34c538a87600abcb56369c3f826ab290effcad9d9a71c787861777402afcac02103ea56a74f759dbc4c85e0887fbd70d6061750ae276fa782009a543ecae1532030fc6dfaa305e0ce874d85ace667151d02303ab187e2534ca86f6fdc78c79bc8b0a03100621b2ab5fa324da39661c41501d8ee8455e49d1d73118814d60fb7179d989e6593c3a6cac939c761f4fadaf50ee92bffa991292b632beddf66446e8ff8a032b79f518a969c5c4c8679c6861d331a1e96386bea8c9deed39251ee5c05932be020840faecf49f13692255b4f3c13f72a3a2543a2eeae008572c0222474ef74b8e020ea183dfca7963e5a46b3cecc051149b0a1998f63323a9c021c2f6da19c627a5031c6c52b56edc224de1aa0cc325a61263e9a9a2dcdf2e621ba5f74a6b2246b8bb02296f12c7a46cad9b813674472e132b310ea1f89aa84cffa3043c64a78a2ccadc60c60e416dace9755f076e8e3e2cd9577b49a35ac2db569266133ebf3cf8855bcc58237ee577617410139f46b481e184f31028dfd9e0993db2478dc4a718759fc08d7ecff8271118eca76d023511d831ada8321fac9beb7a43892c3835ce6b76ea55b409cfc5101b1d0fb518afe51a802d0b88779c162cf66e4c91c309e9dbc49476eb7f09b455713ab096170c77bfb164749c57c04b70a90bea1b44ecb906027679d63954551ede3b9cd4715bfdede08e5f7381e39d16dec15455f3ccb38abc55bc8f0bf6ca4d77db7c2348f2ed7cd279faf040cffa78a399d2934a27e5aa6f1e1a4e20ce6e7645e0515ebfbe2fc3cc72c7736f38706bcddaa3a33647c3838a2e2384c68e4b30f41630bb5ee621ce3f0fdc5707b6ba3935f43204ca52d8a9217b58a26ef97ff83707249c9ed0962e9d23a45aad53a541eb59767afa2206245ba501f3d4f37b0d4e3a8c1085526a5279aa97983d24662f93d18352ec2f786e864b816a8547f11a6fbf3969c4fc1791824c55470e688fa2330c7e0f1847aaa593b0d9956e25750e912c84585d36c5fc71aa093e032f7f71d4c6e7228eaac6e162ea2296f76250957a6179c843811ea6dc5c77bb05693b17f3b757645b3f6ca88ffab563906bd2ce46c3ce53bab7d5fa30b2ee993573a1771e79ee81b65fe75e19b4752f33e5b646692d5db94081766d7c2be346ae81ad727725dcb6c9b0f32f192d86432c10f306b9b6549850ff80d573ca35123f881f75ca10baf2a5bcf395284778687eec6cd4b65afe74ca6824bf6992be23905d0b4bbde18eadbf76297544048666ab6ff3d197c5c820ee3366787fd16b6c06d114e697f1a3392dc07d4397b645eb640592ac41a2e8511d536f8b4f6d3662caa0d90a3b47f687241cef6d23d182fc180f0b97bba95ab7e38b9f4c82d8c10ce5720b38714ef0b36cc98f5d52c8fb4df6ea6fc56fc74261f8cac0603135dc6b66357bd32c9b848100317930235c838387c820ee565faee3e9e0b45c970e460fa64ef6bde750f9992af89d4706cf4b400f8d4a441aa94243ea6ae7777b190db3c24ff3a435ec444e5c40b0a1978edcfdadcbb22c3b5f691acda64e191261f393b540deeb4cd5053fe9a3f2dcc53a06696d87ea482b4b3990098af0105caf33f0a823b32d61260d50594bb8aafb9080a1ba0c5499b99b2e1787dcb760efd4f69529d3b4635a7c423400b43de7b1b29a225ff296c38267a80033d073c853522af518faeae3f1b7276690813adfc81a1bf78ab463b5ef5955f024053efd6446c3b69565c642adf64a872cee608b13ff567835a5fca3db292268120cf1770e9c617f8a9e0353b6f39dfa01b781aaed18d4ee1d982bc5ad25970f22428817277fd588e74428e9a833d83080835805a66b41c06934595c1d5e04745608d6582b8a80d8114654f77bcc6729bf025e0f73fb27b0bb09f9dbbfa848e7d509d49d599e5761631dd4420233d2f5287516ba8f4baf0b7d11b6193c54cc86907605ffbb723746eb841c78bb0d6ad3e22aaa48a46088e19eef310b5563312d08828eff31d82f6c5f343c38c02addcd75d28b23a8dc1c242234d8985cd3ebcf666977131f814573d4b6b74c0b4e26ef5f5dc39004d6e610c2d30d634327b03547f67fea136e7ae001604872cec3a61935e713eb3cf143be517f9fa580d2fe9a229ab7236ff0f65f20ca400cefef9e5b6f4a12775876776cd8573b2e9297a0cd373881f72d969f57d117da35a6c06d9d92b7ed34d62c8a90a3b19c508b73a48e6bb3d5819ad658faff8533b0d739a0086558c4181b566b34d51c2bea40a78758ff1a5cec84fb08", "53", 2, 1471199915, "16cab4bc8fc1a3580232d1aa177c04c285674235a2716093b1b2e7e91df51a79"], + ["030000807082c403046d45b48f7d1512d7437eb9ad31c907bf1874b6c47d8a241e947002f4390c9c5900000000036aac511b24e1daf0d75fc53fd1a43b3991723f3bc5a5f80decf95619cfffc39fbd8e8f691e19d601000000035152acec248673d6b64f5cabeb29969ac0b69d2e2b92cdfdd11253326fcce803522d49add67745010000000763535263536552ffffffff5565504e46f3b892f54881f516d7d3f8ed25cf28373e76a2b96823402acc9446020000000253634c9cba2b016f8c0301000000000252522d00aa8300000000030000000000000000570fbf0300000000e523f4a96f4bf3000ffea51d557b1cf6aca2c01c896e1e62a9bafde98bfdf5711325b53cd4b99f00c9c9b8d270e8132074124850dc0595507d6d1ece228499fbd7d294bc1ed04fd6a63abbb80aead5de3cf5a934ca68b771c9d5702dec0ca6f30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000068bb5532c57711bb81ef4f5af43e096ff624cddac0d023e6882fb5a208281719215eb802a0dab0f6ee7d9d02ead9e2a49094fb58d77d29b9b471307bf86f1b6be46f8a01e43da2f00b9c2b0e082c49a3ede308cecf3fc93e4876568b02b37808ade136fe8103d9eb09ec95761a1c3d07d71edbacdb039a248abd32c24114e89902169c0c0bf4f4c21015a3d270207428c28e3b5822b69e09672bb0570e7351fd470315f356c2f7bdf548dbe71826aa8f1f5db666e8a4bb61dddcb3334a3717d051a50b03f7404bc4741f5f354879527df448e2f455f3f80a37cb044fa2aa3aba47bbceb313357ef457f68a6845cccd20c0a2f23150f757ba91940a232c8fdf3b589b5902229193f7bfd1a15886e21cf35cf5c18e93e1883a6326074b659a1d2c747734280322082109a060ae30ab6fa2a585eb6c7243e58111660ecd09e65ddf8dec7f96ef020b8a348fe7a9c0df053375406b07d6b1037e0a835d4245c10cffc5e711ec5124021ba03661d0b7bd8b72aa1d9229b90c1ee005f4c424c01b38b42dde6c5a91035503048ec14af8a2281c94ea1f275119fce0914d50d0125922d601383d392c3b994f82fe722672efaad31155c2c55d5d69e3fc04b6efbe6971583126fa6a40e18a9891d3b0a35681447cd11dcbfc69de52bf7bb6fae8837bd4ff326dac8712f4aa17be5083be59e3ba44ddc04c51877cf305cf79dcfeda83c1ff036761e23c4e2e53d5a6d8b9bf92dbcb084243502c25e01bef490bedef65aec53de3fc2d4900400f02a34ba8a5078e9c241bba6ef13e11be4a7c863ec44152ed0ae7386f6793fb89f15cbfbb6449b73e4b23f8df7c394e080b4cf13e238851466e8a79ba00101db38f12196dbb6e02b40fc785f9d7d00625b76fd21a95871adddcd8c6d4fc242e882e41178b26630a99637485c68db83495d6b13b33e19f95cf67fca27bcd44c7dbcce144377386c6488099f692a5bd615072f44d8a9de0ed8ed46be406ee8dbb4d678dc99cd8de8a728e987d16bc7bfbf0a17b052a367129fbffaa54db12885d7cf9e280d5db70802baf5177cf5c7a3ba4d3f26dacdfaf44ee3e341800192dec839f35a3c81cd7e62355b29bb7ca72203a739878dfb0f2315ac091d43ee147e627f76ea10fabf9efa4874f481e3f9138bf9eeb0ccc47904612707c339db1b3c8d50de02893f07222ef5775f2b2d796d637fd925b0f186f47db7d01af18435eb0ea55873c5a57fec5d49c2d26c1311cf4db0c84f010517ca9b16dde157bb9218740bddb7fb73f04c6924b79fb2564470cae93fb92034b09e6ed2ada76f0665a3e7682bd4717919faf4c640d12ad5f05a7074585d4ec43ba6b8150081c54cadc08739c258915853f346fa30d1a9430cab03c84e25f3d9597aab1b74b26af3a21830c41119ebbf17718e640f3901f2081d85e11be38637988c363632e406e68fe603c5e11c153a92843561c9d0157574bd37c505d907366652536850e1b7d9fe90d238c6eed8a25532a8d6afb250b3caa0c2c983332e66dad452a19a361cbdf3705c832ff186a0f8fbc34bc2b8c1e05a949ea5f9a23edcb0c0d986aac499f5072af6afe12d6d4e34ba610b81de20192829ad95b3c4041612ed2512f6ce860948e4404b6cb03cbea3cdb8c3dc1b1c7353301fdea09a9312e3fd39ef936bb82e2ee905a189a214e2a2852ea467d0e974600d62e6201eb6298cca1aded8c36311f49212f23b59824e43a0db496bebc02ff14e569540cc47d56c15182bf4b8bf41522e8700823ddc24c2eeab856198ee4ad3c6a53bfda9da68d06cd0cee10478e395a0dc9bede1ceaeef8a689ea391b5b101cec8de0160e119d65e6d698c9affa5a2d69cb7c71743c1b0c4fd6672f0b33a527132b354af1aa8722a438567a08e841f97b5e9d8011b984655f6b128fddd8b14d52aca1b422497773a416ae5664525439625c1289b191c7220cf7328da552a521d3bf2714921d483968dd522f8ce1e2e52b29a054561d1354631f89c59299c64947e4fe75ddc68700efa0395c1219f6160de2178aaa2123f40ab19a8f83d2b48b5b15f31b47171a650e54a7ac2a8fca74e2405e1586dde8cf802b959780b4899ba0e74eb50ffb21b57be8b0fa46ca7c30d38a73413f5a683b4a844752fa763fe89c9538b9306230edadf875ee3c6bc639c62d1b8e9e2bfb94af93a1417c6fc7d9d464f4cca93f6cfbce9930c4ebe133de0ab3bb5d066e9dcaa4bd2094b73973b0cb8b9e09000f27ce1f81b5545ef15e32f02e4e55f0de1e1d812fe1f88254154100e9f1fd0000000000000000e33450020000000072a47242d873eaa7e7f8405f43d50f608d1f92e00156317b5bf3f9ed4d4502f398947f0210f7d49b8207216977e7aff53b82318559688fc9d8e5f165953afaa26580d706ef96cc593d426dec05226392084967239bc120e8cca3f839b0ade9ed000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002aeb3b450404df34f7c8ca8e4d0aa4be9247725b3a5731c5051d71e9ed956c613a7ef6110447bb27abae4b320c2650144e0cbc09adbbc8a4461e085ed743aeeb85083d6bf5952d54df7397b680bfa98a6a3011069fd4fecd88cade787d123c062b2046807052b2744bd4e916698ffa388eedaa1622596bd5b342e464ce2a230d02011aaa91343c0f5a7af6baf21d6de99da2b3f06d64fb77013117bc2039387ccd031f299a959e4af0c1d37cecd1f5dc8344b92fd53c8be7be6cad1696b5be9d87560b0782689162815aa7f4fd04c98724763891c37ff6fe23a3601bf56ae7a0197c93d3e0efde90e6ce48182ed31a9d5692e0b8f54fe3945557881dc06006e1d6e2c8032e83d6bbaf14481cd66892372f5595118b166d7e0e10a0a389a22eeb1c280f0f031a84dc8ecfd24ee9b273b10b40981c8415ffede0699f14e6f1a45354be16962d0227fe11e852ca02d8f9291f8cbe96b3747a943405b3e96d1e433848072312ab0d020fb170d069a5e6ac7bc4bbea21fabe4f43bb9a60e54d6f58bc35ce37c78577e2022e55d2b1fb519084e707fabcf45fc6a337a9517c7281299ec7f9c85d65b4a3aa59c438d7a7315e0e01ca7945d996ccaaa4238202d98cbd84057b81f383e159db09519d0e7b7e621baf2a4918f734f7ee507e7e581e6a31232d7e4a335a9af8033e262ff4db0a7ba468c4c7a23969bdd1d22fb280fa82b3055819530e52e4e8a78aa7b18da31c2c82f2019065838f38ddf5b77bdb91b7c59b8b7316c3d38ceb88d21270c605374de51535ccfd9f46b8faf005335bbbf9d726185664d1be8d3b7c60b5b63681864f1cf2462360f766d3b383be87ef7b961d9cdefbae5d669a3cf75c6f465d4f62f4b54ae8396c0af3809a628b9b57ce5cdf58a5c8d51c6944450c30d1430b584e5e0e03444e31dc806c4259e63f33f9f16a433683b467b45ed221259ee48d7a13e6afb650aa63d4eb601dbc080a4850d1b937c752e6f5397da1324c78544b148678374a48daf99e18ac56e60a33a3fdaf22731d56f91e25250f2ef204e27226cfd041a06279252206962993b40bcb00aaab1155de3c74bb3d52274f1fd27341e2be49b687a8ba1519bea38b3f98e2014e1736e81be0a4d780f6e0eafec6ec49852f84ac7f514a91ce2883b3c6eb55c3c26db7aab545d869d7e2349b3a28678eb986293d153569381f491c08f3005aa6fe12984d25f66be64f82af0a834ae5da58a77528eb0c1307660eb67c80f6cdb2827a3bbedeba950089b0107d1a11b6c9aa37c0dbc86b85675cc19911d7ac103391785670d243231de325f443ef10b47209ef2c91fea7de96054c65630bed10763527a8b4b3f112c73822bb718440d5496d066d3dd1112b9e67b3c54934228bf48f6bddd575fd38b56e839a7e6a688ef8bacc783695fe6d1ec0e2497ed454b95a5e8c4df8cc0c9f5f1c8185e1412f101385fe9340a476bff8867a1418861727fac8903498fbe3acd2f74da4e163eddf73f2e5909066d90b63e1477f12f9e68fe1b982c108a74bc28fd5943c572475ad36680c9bf7a3170ca453b83b3c0dd8626ff69c5c3fa9a7cb5e2c25c113a60c2a9c755c17b68a99653c9d23e8fbbb4feb79b0c0e761bd6050e2bac3bf60b83f931effc394ccead3fa0aac7a593e807310230672242b2a33724896ec6f7838c9f4c8ddeb41cfaac92bb5099506c2c0dc6d76d69d51839f454d2ef3377ce275ccb3dd7f6e590b6042916c0786623c54fa363d80fa0f0339f38552b5834f8e67a404aef597b550eb5f10bd91818f2ee5f563136e0314c8d9fc85d17e4d656983aae11e2d6dfc193688c72949146a332c21c8edaf168ff0bb0bd554d97d33250dba8d46496a0aad46492626c01932a2c3e3e60e8f774b4b33a39f436f2504869de238adab7e6feadb0a4af4d8fa45264fba2febe3ae3301c8d18e24ef3e04c5e7d908a106567647500d46bfa404d9c7ed09865fed3f7823d93ec925cb4d019315092e4830ab10cfba8fbbc79453a7881db02b3fafe1be08d058ccdb566fe4872cf0188991c3105971548388a9d51f60d59d571ef3a614ca2223b0fe1b3a9cda31ad5a2226a0446a73151e06cae250d0870e59c1897837b669d47866738f521ad2e0e0f8e0d8e0863ff8c71b8d89e0987dd14b8b5cbe1596dc030e940a8bc805696e9a8d9977b83f3ee681061a22114df30aa6f616fe4b70003ab3276610f1c6bd3a42b483f05f80133bbfa28d6c69d6d1c2b51aba1c3f103523f01db16e39fc57b04efb2b809d61769b7611442e3e5c2489ef6a0300000000000000000000000005b03f930535886bb5e239d44d56f91f9967dc3b2d6f3dc859470a8c01be3667ad84eabf13835a9a024a3bffe75a4b39925d6a378937634862a41f9bd3623a45bfa9cebce62f93380b362c111a761bcf63e32ef8a20890b40b82c1dae3180f8f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f1f490752f2770d28f096f49f97050538cfc0fd4e53431d3bec87e4e7558a7bca3bfc5a57b8072ad2333d8f0437ac1b6740225a0975bff0f8d352ee685a9c86a5bc2b75d68afac3859a43a611e382185ced8b9d543bfef657327e65e6b148325b772779b2ba982d58cb4cdcc365265993c4c8e49050a4cc7a11d6db60c215b0103103cb39c91f9ab383e48d3bdba25ec6a4f506ed36344dfa809e74deb18a68a63030da684ebe2dec8afb6da9d9bae6cff1431a9a912b9087df4502cab0927c42a950a054563733d51bdaee4a222aad551f98e9a93291a83e20427cb421cbe397c995d13057e63b50308e29a1e908a51f1f69363fdd5430670031f145f58f7d8795fe2021cd61cbd981035eaf3eb06231fa536455f9ed1d4ff2b24eecadff581e16bd3d10325a289978f0c4a3fdb808951391b8fb633cd0bdd0d50ed8f4d7b0e52e5ea8ffe0310a416cfd4575b2e8d8cdfdfa88e69d7d26197bb2436a7b78428eeffebf2c091021990701ed539efefa8a536ccb63da64ec44db212f45fe1c7001596cbc3ba2581031f75ae8ec279d0260581c2ecbb51b6b911152b9c25d5da3a9126075d86a7d205daa3427e5f9514259e8cbf46cf971eb7472eb0b07b6adc7b5ee8a67be8c1f81a5c765920bd60458e59ed8e44925bdd041253e22e0619f5f17da3ca0a87525d7a5545d2819089e1444a1d67e2d89247c231b1fa9672bfe4b155934ee7578eb4469837a63a430e9b67a2527878d8eb5ae9bd09c610eaaae6978d9209a16140eb48be35f9a69a20a06525ff4059ad2637be6093d14ef7dd532e0f19b40e3dd5c0adcaa54ee1a04b25f8902d82d615a456d529c6cd22e036ed4d70de296f1ecb5cda04d02ab246769cba308fbf29cc45d4df253bd4c54c7c8380dab10d2e3ed38e88e95566b774cd2fe77a112c6604b35028bffc9f7fe16411956adef175ec2908e1f371f6c08b73245a7cce5e6b97635c7db3e6f2b48f2b98751c03da7d5bfb72a996e1f7da180ad74408b657f81a539e41d6e26e06a6b43cee40f963cf12aced00477a0afa6d7fd344eea6015b72431a90ad340185fbe09f52aac7afa0ecb6a1c8546daad2038c4742f3bf82ffc149292bce3670e6cccdcd87d73c97df47362465c6cc20a6aedac683d53087e5f5f5a263b58319faf40de8a3c27f0e445be384d9e3f68dddd64d2063df79c85b71f6ba1e2bfab5f14b2cf8e4705fa5e654465b1b4fa0ffda36934c1728e46d45c60d96c706cb7cf263ca6dbad89c8fc4020464f5bb7dde923ccd389f840ba3580440cf1a9953d1478239741d6e2fda051c6b3eb18ffdf87dd70d6536311263e1f1c5e0aafb7f5e213138cfe278fafd579b979636d54aa7e95426463b38dfa0b93873770128fdaa8c76aa221b8b62e5dd6df2b107f1c20a4e152595215b0b2668bfb86474a0a3ed9988d1cdac6b4745929c2a9bfca33a39aa2306c74fa881cb0cd2027673ec41b9d9f538b960122d3964f343e9c2060e0b9487f37ba192452dbc84aed2fb1a426a6c4f0de7a2c6115ff2c81b1c07ec9d0581d0e4486e597a8e324c66fb358ed090a6dbf1c0d2f71ed49ff5b8f0ece0c23bc4bede6af6193310df4fa9b81e6a946ee8d66741475ab2fab678451de6664f863dc25b3b8e3f30e0de5c9ef5db6469506afe3bc7a934aa32865d5a8e6f32c1a3cc895885527fa705416491331a16a857b746be7d4bface247ae28cc002ff79e6ce7f3902d8e986a86f3763a41ad62c131c319361fb94184f0749304f2daca741819d74073cf5c9a21fc7ea9d4a3c045258e4777d3692f07cb3d54499b3f4ecc35a4094bba9cbc2dd75b7bf99360d2fe4c2dda0b611a692c34c06a685684f57285d3d2feb84fe3d6872b48e894965e0593ddaed752846d962dba62bb33d6573463871241f80bd6b52f008b4b011c537adaba4fa9858dd8fc71ccc236043417fb1d9045ae2aae47d23fb773218052bd0639f2d3cda77a67cd3e2693855fafb1f6ef4450116302528178994ef5c3f547e68140551da7f4811ef6095e0057eaed98d6011fa91a313a124376f9a583dfb65451016f2278411921e8244d6c9dbbd69e5cc4a3c38c181ce3052e7eda49f3c7f84965d8bfa5381de70d284ef230c102ac4a5e85a34f6bb00c3cc3bb0c8e4cd96101f7fb153bc377952730416104d9e658f75cefaeae2d18d2e22f75f3df6b3eaa4cf984d94c271c87fb799815e7afefe1e51f433b75d778b69ab4b30875e91dbb22d5dade7676ceeab1b08817b9fa01ea1b704f43ec000ec3d2762d3b7ec351810704efdadde2614995b4c6c125d9ad0cce993b1b2f76be2d92820342464d667fb0f78628e288e2518c7ed338f4f86df9deea561b0dcc7182bbbf96d48ddf33cf78953a1bd0ff3dc5122ed9d7609dd07d7ad75c58bffb40d3942efcf8aff610e", "656a00", 3, -1514010366, "e477232b96d00e80cd80282aae4b471f4f695803e234416ff4313bafd5f63afb"], + ["dbb5e84203bc91e2b08eb1c1fc8f44c636e667bd2d283d3a925e60b386096353caeab1881502000000086a63635153656aacffffffff65308ff54adb2d2d6dba3a47400053b5a9bdbea402b991cd4bbade7e778b7961030000000200ac9587616fa48f5dddcb76eb8a2b97902d2ccd27953e86e961245aca9201914ad971ecd0d900000000035351632ad0660101039460030000000008635251530053656300000000030000000000000000205429010000000070ba961942616f4501e4473b57c5ba557d56992974db2579596e1afbeba20b5cdf1eb7b42cf8a6ff352471ebe2a6cc5c182caf866159be0bf67fb6ae4cb2b1ec47b2d4a96beba61f651caba60bfeeee54783181485fc9359fbdba73e429a15b10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060203b3254b058f999f060df3f8ec3ab56238def146225d8a7b1e2939da6cd4f3804da67bf0b9bf81f28ff64963db329f57002ebd653300a0e308cfe263834a20e58e01b627d9d98dbbcc362a5e805e4bbc300326f155f6907b0950afd98be8c4cc5d6af12561a0e5fe38ad4b26f447b10c58c39954dff41c0dd20d618d299a4032483abae99f5c0c09b0152390d49c619774c3caf8a58e92d22e0fecb7dc7f7290319d4e2c6070337a2b799db65296717f31dd8369d9a74b435cf7b9eff7e34d1900a02e530c25091a36a078bafbc379f3178e3aedb03737ee7a5b238c285e9447307f7936b6ad4f235a3f9555b4a2c0b3fbb9dca855c852fcc85ba755ca1d859e6700300bd79e33f01dc4199f0f423ba4cbf267ce55c129ff7836874c702a872a634110218bda37bc1565d8d3e5aab4133cb223b12a69ceb1ff11f5b812fa4f35841700c022b8ea1c1ce03aa3af0faec1aade0037b5e7707c8aa2d63929fd0eaf342e8750b0210d58da73d2f825eda359deef3974926380cd02919d8bde790b827dcdf62bd62030c8c07db8d3685768f3fd2ad11bdfc1cefe3ea8acf81b6c5bf0ee0f62dd97e96662be6e7ebd4324f4cec9338bb5762cdbce346cd13bbb6552325c8be6d80af45a1b88c502bb095cd0b913760d663d030b3dbf426b129e0e051e4ab0d88cc07943f77e3fdec416705d633b90da8b221748bb6662723dc5490d20e207154519389a7bbbe20a4e3ff5c03c28a9272a2face52ccf7e84f2c8f850067d416705407a1471aeb0163602fdea663f7ce5d1d469af1f3b64e61e4597ba69da11ec55009177ca85dac9b063bbf7e6d3141014caa149d60bd45d276e9431678feb807a54e69c39260b67e1999f73a9b55d7843775f2ad12ae16a85113802fa38e114a3d78d1bf76ab10c85d941ac3323800754976cf0db22e74499f15fe8d6b0f17638b4f790c1428bcc53122a0484219233a55759753d87f202f478846760a5fe93f0a0d277d16eefef0a1aeecb4f0811b50504020c92c42348841d0d8dedc8f8b837f17e5062c8c76cc29dc2c46884b629bd19889149c6dcb7c62971815559d14c97dd640acff799363a41c5219778a041fc5e8a85fdfec5e0e4ce190bf7ee7e806f6c579332110812c2aaafb37f92d91bc1e58ed7c8badb866cde1c6a2cd234c56119833bbff521df8d2d215d5404fa79ae6c128916d5d9a270c043bc26f744d3f8627578cbcf0bd82587717b75aa49d55dccc8c85258baf1eec3d0594f8ace091676be37be3b4fd42305b0867831ee3f76dfe0fba51530273104c72ed2286d54f0fdb7770dc45273a18df2777abb944efc666ae00f180edf717a89287fa2a8a90f5b25a3423ed974e42695376d310074bd4a9fe20d81ac3ae59e2d0b4aed6111185e73127ba5aa1f24b0987e40373072c7182cfa8d1a91aaf5b1c8fb12647213602d227c1d4efffe597be1acff7ba04d9cd963e6be366ab540240559dae17a3825257c5d002c409b6d0b8fbb25f5edbcf59e6c6722b7b8214515a757190be4aa758e829d9b757b4a1c9c5c2093fd88ad69b84af1a6f6f637eaa5d1e249340ac623c05903f63cefea47f63c3028f23fb1fe2dbe63826ad079ce5d36e3d2da272142613d2cef4252e475a2053d56a946dc7516586fafdf202656e1d1b1af3f77e36dea73c9e54e5aafdec5b4bab8221dd45d93eedb914eb1faf35b9dff428ae1c4cc8921f3e36d142051719c4a0fbec442357385516c9d0cbab33817c9d1ddb1213f5afa0b97abb7d7078cb8cea7deaca6be5e01df664f24d080675883fb9d0a35f13aadf83f3e652b4a8e7bb06ffc330d3a7dca755c508cae553743f2d2ed2199f1c4f7835fb5390de8953917c6b10c521fb4885d44b7fac32d104bfcb683dec7fa3019bc769ec677208825ecab27d609baf29614bd275cd49f437802067163633db0fc88b76d6c513ca227e5155012ca2585531681e5063118e571988439677da9ea5f8cef2c828c47db2498f3a88b11bb5da67c3eedd1b2477b5675a1a1514fbe52513ce21f383ea0cd3726726b0d8488b22b9472bb232f659574403b26e93f6a48c861d38df1b10ba123b7309b95c288c7a1e095a750eaa7f9055bf715e4bf650317b3e1c8dfeda137afad57e6e2bf7de117b16d5d625d8920f6ac0690f0d946c9ffa7e85ca033fb138ad04dc91add2b2e5c3c70996ad9f25dfc2a96d7962933d67a956eb80e351c842116cd54caed5c4d153cec1ca55e1a017ce81345e47a56d1de0f221f7e5f90a0b49cb1f9ba1d49f06ab0af00000000000000000cfcea8020000000004c5b5cc789c69255c93e3064e804551706802e3d8eb8274de46784f9c669bc4d836b1d7596a4c91c815fc4c3d9c1e7b7db5d0bb21fd4622975a1aae63b37a8dac6c40f2861a0cd4de51a573296c8f110ff03e25b63ab4bcf1156cd10ca62b1e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eafe4f8272f4d2080bdd1bfe457cd1c2ede5f844278de7b9f752ce08def102c3505ac5689b0345d517b2941b20322faed755576609cb50b0637ea0f2e6a2d509667c6dc27702cc6d89f0e2f56d787fd22e8d80367f73708dcaacfda71f471467a57c5a34d61cadb947b2c3c6af49c0842b2da6e3ee6002ab31b9483ccca47c42031ed461345a2638f1dbdb69a2bd954fa8c8f5f10131c4c04be22fc713367356340226e24d1744232cf0698788200a2f3d7411841c0457ae9467f878ff2c4ba24dbc0a01e2e1c2e330dbacb43a09f13203102fe3a69f1ed47fa5532dc571a127e2dbf0145db5da9fa4ae5d14255ad4fd7c571d65d99cf1195b5a9a0614051fdcb63db30220aaaa18c9f765277387e3e16ca5825727743024b93cb0243c37de882efeebd8031923d32ebaddfe43d5bb0df728d8b90fbc947c4c92390b64cdb8ca857346d9360204a383da6cdf44f40d02b029c3c9888739e9d77f7dec432ef72251cd7606c1a10225c7c0109fcdcec2b7cf2f8b6c48d08b0b007c94cc48f19ef097bb7ac60b40fc031a03fc8797ff4d0f18228816059dabefcc13f759728e09169ca1bab299c854141f45d6019597a4164fb3f5d1cb20ab8f5f9b8fa10ebc55e56e199271004727ce6984cbfcca1c7e822b19ada0943fd845755bac564e8cea112e320979aaf7d4a0a741463fada9c76151c6a48b772f3b3809a99a56b9eae827218f5c01df5f43815c2b2fb9dbebc00b09c6463c484ed528914c1c132f5c5a0c58353b5682a57770a6984908854c9bfdd21b2891ead02d56ff4bb09350f7cc449009bfdc57b607919f1de2ab87b15704ad4e30af4190db9ad678d64887fa05a47817a8d57a8fe6adbcdc7d90b97311472dab1f33b43ad64326af4c494ac307a3dcd9d91c4f18ca51b6268dbbe34e1d70823ee9c78afe0b2d1eaecc27d1f22674c91604799b493df06d6a5a5274d58bc29a864da96afce380a3339fd0d107d676c4b377e65391da3e78950d5ab83138db406110d9bce7c0eb8eff1bf4ff88aa09b1604621a21ebfa437506d36264e86cd368423281bc63769d9d6fcc990ec7237b8d7dbf14b06b038056a121b13082a1330ca3dd28c3ef9218b56afc216b91c3c487d3f28f3fa3c21ed104398df0eeb91b4bc71802bc13aa852912f470f726b0470d607d08c173cdd129dc4b7aedb0fd7bc07ed2d3ebb67df2132234cfd14fcacba84cc26ccb912ef48f0be43fe5b2ebd9de7c3608a2a77fec49ceaf0ced8100a173a7f3b2e951afa2116c57556f9a80557ae7c6adceebd7378619da41804f7d2766e5e8b6086f55f873eb8ed389c9b944feeedfc7f7e973f3746a2563b0b89067256b0b07f7205f5e8d9a653688e5452756577342f9d055e230a30bdc0d447705633ab7c61bee9abb31ebd1c1c153beacb97fb08a4c687edb794c2fdee273333e57474a66f05722d6a9fb526af4bda0e476428ff6f9974af944fc0ee294f2304f8ec13324aa71382d1c97c2ddbe1f82d24ebf9abe9902e9837543dafd47235fdeb1574833fc94f5e7a8789d766fd3b648efa3d66c29cf04fd26afc0770cbd762ec8a562765b63846bae5077c7f474734f8a30ea94e280b91820b3a9e69247aa1bdad0e7cf6bec81487d8f233e3e8264dce9425714ea83ff8cb97fd07d69b56ec1b4198f5e8a57a5ed3d14e09a3026a90e29c5d5a6c1195122d40c44a73e9ffb90036ddc287e56acaf0561dac8667b7aaf8f8aebe90e8991b19f2db62f9c7c1856ce4f9410e507184dd8b1bafe8695d0514ee8c2fcdd1adb9f79285b3cf8d730e6ca6f7d83287a2e5ea11f17acd6570ff3105ad704c99ec4d11eb6a97cacaa7434b5a8489df2f21414fb9fd2fe776d9ceea1dffc991037e13e66f3016205de2867f9645b1dfa71356dc92c136e4c529eaeb2f6eed4ea07d32b292ffda8a740f0cc8b654344ea0e4675849ad7bdd6cdb3643d979a83b39e5a593e5803926aa73b9e54c98f7a5b582fa36ef479b5d40fe015b0d32f1d83862a418de57cccafbd38d0d7da47c58c3076c1c00838b9848eedfeed9f8e53ec1676b306fb2c3c771bdb7728f32865656e57c2dab0d60e40ef4eff590b8c16dbc9a168b48bf5cb7b57b763f68befd0d3d2f0f25598f4c7e6c0ee02325d0d5d46be40a28f68f27893d356731b374d63a8d0712b3a5690bb77c36d59a2b285e68cbab4bc07ea0d576d7d5ad49362256c9620dd314bcb17329aaf6a59a4d46c3788ba253342007b356f7237932f1058b54cf050f01e7f327f883aad6d56d95cd7e1650c21df100000000000000003218cc010000000017ff60ee55d2b48bfd93aff75cca431501dabddff77e2ea25cecdc94475fe800595f955ca75b404e4164849c936afd82a422f1a101d588975dd1913b440a16e0961d62d940f026d2a0034b7d5ca8d94c95078be012a3632b70aa8a1c8088d33400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cf6dd828dd435b8f4c940ac4829e4b4dfec72281cf58ad3d28f4e97c567d13cbed44bdbc3dfd1656af53fc234f274f5351dcc498206246318ab3cdebdbf240fde714290b4c1554a214dccf1577b9fa2b458f9fa347b9733082f9683dc069bf67c7be0e5a617c48041e49e66a6fffcfa9066e12056b42054e7215723ee1aece40022673645b6af33758a4f0aebc65b8d067b3d9eb424a6b536d0009cdaf19fcfc0302187aa478f6cb1ac6732941e2d4549a44f476f8cb2c89311ab3fa42083b65b53f0b0059d959248b6171077a1777377ad97cdf9daa80ac4649d9775f1f2ee6bd3ef9e793d27d78b4e9ca56e1e53f9034790bc41c2ec572d97e15f34e803019d8c8f4022a9c23a4cf6745dc793954a59231237034422d552eede75e143a429370c5e5fd0309607701fed14cd9ba0fc7bc67acd3643b065f719be3d730321e5d99a2174416032c0ff0f7cbaec96d79b568d8d04e15c16b4283f99d92bfe43e254cfa90277995020f1a2664fe63e9752adde477aa3797c5492158f365d63100fdf0711439b4ae9c032978212215e8b370e353c34b57df74169ca790769ccab655d9549416b7f0bba5d6250af76cce9f82ed97f948ddb23a0ca1da9891d17c58bcf81f53afea17d80053adb3bb300a6346bb052eb65e50869d888549de9ea5691bdd6af2083613a7e75b5d86b23245b0c065e45c35d54d647bcdff65c3a4addc274f970959b228f7be54a39c50f57f25346998a0516b46c10508d7a2ff4c3df73f9b403992e76c0a01cd88d96defd77125d196bf8111e36efd9bf65d5dc0fd1b87c69b636e7224f3559cc825219dfc80d4355979fae872d3935b3a4822182120837e493d6b8ba81d4a52dc629cc558313421945a1f495009cf87c166c7d5b3693424da9b3f0dd9b416bfea74c1c518ce0df4aaa06317167a9a5a50c87a1611e0c5c1c0293d303b50e0a963106468eb80802559a76e369ef5ac662521978dfa047a5c5b07cf96347a641c678138750f2a2f8a8ca667562385cf071bb5aa0a017705428140e56500af9c909f15891dc478c1d5d119ac7062325430f96752d5769fa1f1dddce0c889ae1182bf022802dc48328bfa19b410411bc750b058dbd51d0da9487b8027b11c00ce6462b4d88bfa6b9d940ac6f893be5f2b927421c94ef833cb84e1af642f79a62834a241b2f40f225e1639128efc0a37cb288e1c1bdd45ba37d635eb5e6430b0ec0a006efac12edd8a6e6cff166231d220593be46eda387d540a2757dda7d7c5f02892272012d3b0ebebb2239053d3fbca8c344e7db53f330bb12106d9009cad2a298a833e7139b843fb5eb2aafbed8825533d98d17072310104b1faac45022f99d983037d5d4165319392c818f6962a025d6b37f45b28a30b3a2f1e47bb8caaaae02e3e6e5ce81cd5b951287d51cff746690a5236ad75a9ea6099555a5aee53598c3616d49d9f9b5848de86a2020e9469830ca40a39b67042f3bd71486eeccf41dc13b305c98c77d56b656b01a08f2a37cd5ebbaab5ee1fabebb1d1d38ce8b70eb1fc8bf1fa085688883206b3cb740271264468bfcb169158757f03be9398f22c220f5769538fb22ff96109fad2b13ffd778c53d99ba302f79b50164fc35a6c3c7452ae61826e12970fe1eaa9e5e0b6246a44fbddc8aab9662df075c54763522e34c6958c1fccbfa2e5b846ebe129225f184c9af2e43221cdc8009bc771e920b40b09a36772774502e44fc6cfe08590ae4a7cc78c047887905ce25fc986fded4d174ae320913df0a1e188faef98ae74a018666fd92311c909f37d523b0457cf4a9064c2c683f97edcfe6f9909938a8aeb18509c659ea0e194ca261c0f5ec5cdc8fa4dfe9af2092d66c81ff451c0293c52ee2f07dac709a446a16ceb07e7eb686cfeee2b8cce7268593f15822b40e40ef8449e104542f8698db7d77a32ef394fa3788ea5b8ed4de6ee9ede755119ef54d993a2550789dbe2266734df293596a248dbd3520b61ee95859bc24aeb6082edc03d9b3c69d30a525ff578cdff68b1afc83ce59ebc8c2c4b723dd4d7444a26ccb5a4aeb1e9c8ee2e965f2a2b25cc3a061485471e403ecd69a1215da4a0cb073d3ba2da14086407985ec0ba177f6c31a0cf096709757e31555922ce5dde435a7f7e9b975c6419277446f55eda42c6fab7e4b3ec5ff324fad7062382946d67fb4cf1c14a6a557ae11ef9d534246d67d096d27c0daeb1268462ae212eee6ace300bbb3755589d48b8ddd8bebbc49e3932e8327526c2b0253ca75049c8c27f92a13252574120bd299970e29fbce596bf309ac73468337da8ff789c88cf39c84b3fcb70eb38c5dc3b95db34dbaf4c606e83166aefb62ec8a39c3ceacde9cd638db0c1b47d653efb56630201e12b51fd9ef0e8a84da99329fa4ec18d0283d5bfaffef909030e", "00656aac6a6a5365", 2, -331585706, "5ef6e0e1f8b258c55e849f4238cba36da79f530f398e78b9f929dd71b3d2c80b"], + ["030000807082c4030247fba6b9c0075b3cfbb254b2edae6fa77de380f4cbd1b3aef0d51d6a555878bd0100000007ac536551ac635146ee6aedde8ff68833306c32432c8497e9c041747caedc6be084861d11c5b8077e96defe030000000651636a5252acffffffff02e4f4a70400000000070051636aac6300cfdeea010000000003ac0063000000000000000000", "", 1, 43885721, "23efccfd1506f139b3e60d9787bf4e14991d890c5df72f42e37a000b629f9ff0"], + ["e03fd3420285c24dacd7d9e822d61cc72123174dbfbfdf6a5b65b25dd84e4769431a77e9e201000000036a006affffffffdb7eaa90dfd003b949c2fd7ea88d7d1daa6a1856738add464850982e44bb5f0103000000025300ffffffff01f0403a0000000000000000000003791a60050000000000000000000000003152822e9901084182b7c9199e5de96649b5b50d3deb766faa78055c735b98e6515cd3cff0e1bcdfa9b413bbde3e04684aa6665b94d1da620d49c7fb67453973366786f122744e98f1546ec94626198112fb419c61362a0401ce7098e3fd87ac00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cf1ff53362cef4252cf74311a5e6a7681ea85d4a69316805d5d5beacd72041458b311d08b767332e4a3e2b3f12cfee6a447c8c5df2e54faa868c502172191731f8a32a178c0ad1a41ab548d2aad9077901f12d0e194f5beea5de5c1555712cdb9d9fe4c0144dff34cd7baf7f7195fff10b0007c2b8d934c7e6c1ac36b482d5f0022c385d9401bfa673eae8cf15eaf5481f5210ab2a8c524acf1cb816224cf0ac68021d86d81758c4bbe334c56613d0aeb31c491046a55cfb0a8c650a177dffc46e010a001cf086eda6c98e49e0d04e18759f7a99bdfd110123ad3d8c5ff8adb02262d225c2f39e4324d5cfc5bed89eb1058280db49cbe4c63a04d92d52a724fd4bde610225f9505b244c0f4912261115069a9397d2ae29af6b1fe7ab2440adc3ccab1c7303020fdc864668844daa6769b929e744ca6016aab8871fab19381811535b6141c40312fbb1f168fcccbc8549a4d881879c7bd9c105efe50589b6e726dc895e0dba3b0319b9a5f2f02259cc8bac0190c2b2d2ecbd9c2ce4d772720f840102d026b8b560021d256dd109e63a076e4d7d7388a71bcf17189d6f704ef6aef2b2cdcc8f1cc57d1eae6c9ed6b5c4981b83bc023e9751463c95fbd02885273b36d72beff4e0807c101c2d4bb603f3eadb54e4b3ab29a6fbd0adf74de85f7bb7c7db2ce01d683dd8926b5f04883dc688b1682c0fdec1670cf56a0393af4b913c062133341a9d7b0605b33f4833076e46f5fb9a113fd25dbe71772bae329e6865c582a92f3d53463b653829565ff24fa5c7c76ea939d00818a978cb20881d558ca4041816470af5b81bfbc46741790c7fcdbfc679bdb131f8dd95bde7c607b7b29456e929eecab0f8402e21f2806f2b9ff7a0f6037dc3d8efe96b68bad31b677045121ea30d14bb912a303f14d88629ef7d6342220a7f00235c999ef56669d7a41fefc6cfe6725d1397d8beb944502a3c8586235bf5d7cd6685b551f76545317089af37684907d55d43bbed0c001cfb88131dc9653fe0cecfa9a828f8a676e47cff570f5db7232e0a95d583be4595dcb3f27f350842f0858b900e7711b622b7dfac998fa9947b13835dfc0183b5b8c81bfe87550b677d5625342536d8a82c06e045b70ed9e66b26be46567a070cd43fba8cbad22d422e25dceb359b0a18ce6c473010176cbef97c99529d8e871aaa6494bbe72b344982d433e79786cf2c598b2e7dc91f0c86d6910e792fbca5d7d7e5bbd848ccfad40c3e0f52ae1a40abd0e59f0b4cc549e43bcf1290eef37f02416cce3a6943bbe857c4e217101a045cc146214dfd0170a976aa21a8082a1537f74b7a53b408aa5a59cff865bca0f2114d881e1acb41d929800c9c09cfc6b47f53286c77b8a7f88585e6fde88fc0e557fdabdbce3eca4e4264085cb3ee62f0139079406259ba612861d649cbd6717460028b105c0ea6ec5fc82bcc872d66cecee0f2bce3adb77b1448d06a01bb8cd7cf151a01f7d49987a80c98a9bf306b0ed05603c0cc0606c579d02f0dc3f6c07ffeba6e4a589bde7da8bdddb2486b17018c0e7f2db0f006102bddf1a751be12508d1699d5ca23d3c7bf622d6ba34ca163423085f6be62414a15e4fd5603bcce202a13cd8c4832ea868917108c23ddcca1cc64a1a446525d29d782574bbb15ce251277c123ce191b263bb8d8aa87fc1587065278ac12ea0ec70fdde60e7aa5ef0d80d233f796bbd29c5bf733842d4355fd5de22e4dd73631037f12ed400f426d5e17e199aa678115a8ba968c3abbe2fd6381938f3ac3209f70861d12ca8cd34615a0dc56853207059db89f26221f44b26026c8888f127c7685ae54780096b2c18ecab8525c888f6138c5e6f6b46de3e2bb8f61da491f662f96a56eb8bd48efaf308dbadb01ac1d4cbfd9dfa290e272cefc89b5d4a0b834bdeacce55514c93eeac5e137ed9a1487da3cbe4bf774b69a67d304cfd7ede3e293fb9f7039f9e081d797cc103e4df4ff35c82478c60a5952b50b1e71be69235c7964859d9f3879ea12e7a2e70b4b4fda91e00e839d016965c6a22af59ffb786182d40f5922f330e522b630fcea3971d553f5a75337ab3dee61dff90bc6fbd9ed957d24628e40754b693a05b6d1cbad78a862ad10b948440ebc967acc8dd9384d78a34b69ad3b70d701f17272b177e1501993484fd8d33af88cfe07090ff4e4345affbde4dcba0945d7a6b3afdea86af0103cde662c41a1ef47c395ae38f0683651847ced5174d51e10a2c4e1e09470f8a5250157430c8f1b8d28b29b8e36270b37d05954654468cfb899b400000000000000000000000000a163fd20a7ef43c9e5a0c14af01d02037a05b7b8af917e8914874d2dbc89e9a76850e4e88a398a99cfea0cf28fdf17de5e0b6beee71b2a5f69dade3c2b2adf3c7ecaa4e492d8701052fd7a60b5952a05ae0336ab396aa07b2fb1986dc785d73d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a243c9fbaf0e13d7ee5a04d382752941fc409263f55db1f5f1df1cb36322a6020f9a528edc0491423dfc70474340bfdf52cfccfec7ebd284ee6c317f2fe1e6ab327b045775327294810dd56cd35f377a6fa610eb9d5871b67f496d8510c416e5e093c056dc1fb4d2833a0676c55e07a3423e5aa52531ef5f53b40cbe99b0c7ba03008709988f2301efb9b7af3ead17969f29d8387d18027d6c0adc4ab18bfbf16b021353e41d508e4e4b9eb91ea2609e58a9e0bec8de89475d8ea5f239affabb679d0b026fae2672778a6d259e3fd4868e2770a2ae51bfacfbf149cf917c563fcb8f3b3733d637d248a1c1ff32eeb8d73782ae1c3d3643ed0c36cbc0e19dfd14e328ea021bcce69d5e8d9722a5ab15d7a3763ad462e9847bb3c94f6eaf9a32d393f87bbb02299cfbe48f8dff4e72d6152184fedb06150b260d720d33638fa42dd981fbbb19031766a5ebad5dc3785d99551d6248e869192228eb9be1be5379dfc5e986475ec4030c8f39bd3c1ae0b3c72cd6f8bf450d87713fc91eae84d75fe25ed0400a81a35a0220570eba33035fe6095061be61afc9e7c068d8fdaa02da970e7791e2d305e64e0d7a0a5f8c9630f056fa54cca0f8a63daba11713433cfead2f0ec3a6d23955c97af478b93e932fbb1d28c49689fd6daed46cb449c4e5378be9e089704e13c33f76e883d7bd19a3e71666e67a502520427b888a803fb74f6da4c423bb8c5ae34690f0901b764ca5b5998e8b0c5dae7d3179b7bf1489e3b75ccd5353bd14b70abbb3d447e3f3c70492f032b69e7daac4e10cca777203a06af3fc4a3cdccb5e1038160396710a79dc333a66fdbe26b4da0c9a87936194be8023b387ed2134f3f2b2390665d99ad942132a7950303c4743a489b56e4d303f14b23925052acdc944d60877c8abdaa0ea2ec7b48b9a7024df037bfe132331749a1964c697fd98c739cb1624872381dbe4d7fa8cf1986957e3b066fabc08082f27d11e83e4175c2d35342a0fbab8dd6a7e04951162075ce33a722168050185c0a4ba8f8b00bfdb011ea59958cd51895297e69ff9da1b2250196ca6a525bf650c408707ebf8e90742a3142347daf2c7ee885672fe74af841620ece8ed1a686efb8e69b6ff2b0178e56b33845b8b03caa92ac23ad4258156b8992065c28bf66b0de824b4d8350f899ab4cc344c1654f9aacd68038e8696523fd7e641b3cd4f45a176cd9dd82600d0a57983da8e8f0a160b7a2e7e22ca9b91ab1250e7b6ff05f06978fa2890292664c66d852b01ac79e49baffd012ad03b961f73f7a40bba503ab1442aeb3ed8d9dbb528df53eebeb0c66bbd632dbf6da991c573ca103eebacb73a54d711280759826fa845b2b3f2df91e41041d3d34f722326be8ef6e859b639eea737f6cc9102d39e4c35050ff8be7ac92d60946ce146727da872b1ac3a1e4fd347cf38ad3f104869958b4ee26096aceda6f4aaa634dd7cbd0a2f537a371630c5bb9913813527538f3de6d79b1f13e8c153851b604bed0c701c9084bb3639ddb2057fb5cf234d9f66fd84ddc6dbb4685413184d7c95e3b3ec5508bebdcf96c9f915718c19876581b45b8287a37ad89975e99324d1943ba661a707dd9c2e1d2c31c1294c436de10f9e26b9efaf7405e1a4aa1b05cff2a4904424f8f6bda58da8152a45415ecf7e39f81eac2c27f5dcae4427eb2657963e2283dc7001bae0f466bcfc367b8bc3fcf93ed1f9886afe9309f1aea3a5cb3864bbb25ebc790f2ca44e25a1cc2d39fed4574e80b070bb95ff8e6bbd6aa12d8af073b4b694a18941086721a5f69e8a440fd1f75189da75ff5083d6bffaa70e04bc36782dc3ebc718c82664544e9d2cb3534001f1382f1cc2810e5c30f416b880d3ca4924b2aa3c7d6bb51e963f84f239dcc3d10eaaca704dc1d515c8c846cf9911ef3e9570ababe64f1079a67f46c4cda2d9f7102e6331b9ccb409408a0b3bf5991eb04903284a98980d1d75a2cc9094c105c9b64d429bc3718c4e81cb47472f8e8dcec1bd5e13f0c0d62cbb9b6279496e53f71d71afcc5f92e4a1dcebd5dff69cc3a61adb85d6d160f1aec08c7293fc450f3f70279e91cff81f167af05d742dbf09f386375e5b90ac9287c39e2d30a15e0c4469d41dc906ba196842628fecffd82d5b5ed0007e4ab78e5effb1d98415de3c397a6b02ee69c311bd7b9b7901015d4ee277c59dfd09ecc4ead3b97bd891a90bdaad87f43a83a8691255188421af19c94ac9708659800a727cc125bb1bc2adb104bf8bbef9f3ed01ad344513aa88e9ce5fb64ec3295f1d35030000000000000000000000007f72ea2840cc7fd9d3a28062b322e12e3e7b4aa622a62033a8d7acc49567e7ea7949a33c2355d11ac81d5f211de0c0e2b7a991f543fd3bec9d1cbecf097654ed9e486482bbef468ab8c8fb89d4e1c91d3d2791bda43f602d31ff29a68d997b2a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000909a459200698f64bd6bb297dadaa11fef2d73039c6b2318cb4b0196693d4b46b34262086bee7edf7cbc38d648f7d3ce72dbb294a0ca3f1ebaec4de4c0970a2b0ac4f9409ac1eff2541fcf9d03682fff5491220781fd5dedb4654aaf75da74568cddbc2ebaa75c2adbc1758228f80778939209ba1b756826bb2219b61c522ed4020036de46ab254f9dbff8de6cdd1fa2f021d26b48c8e80cf56c0f495b12696505020d98947795451e3c410741bbb0436e0c773eb30f523a8828f88603ec79d79d3e0a07ab74a4314bb7c3cf617c49f9e3e43542c157ed425b9d5c1d1a5a81cbcedf8bda85a993b9e1b86d9a8f1cf3b00e1a0c9958053a5da3db881f8920aeb57cbde90220ddfa7887e3dca0f5d5eaec44c0edde5bb3a47de51aa824b618d2739e21539802299feb4c7ac163d8f5b81aee896a35c8f411d2e3275e55574cad0d2bb663c37902298c10357773a86f7af230d5538e9d4d6848e66fdca158df545db678b8f74daa03189fd7354c03666480efab29230a520556d2f799ac056649dff08ceec2584f0502182b491e4f699ec486f0e76e185b0d12dd7bfbc95bea54972195cbcfe69ccce5556ab4802c14079ac015a75356dadadb70980298ddbbc3351d77cdcc426b38610f55e73a71dcdd74c1c819ae200733367b7b9325530bd3959b89e27758e1b666acdb72159a497dd12b63cf05b4586ea62afdc2d55468c526af898576513d1742b5ab9bb5281936a9ddd60dbdd509931b89e8cdbaecbdeb32bdb513f4882a3db478e3212b356f96aaef2776ad3656f0c0bf6f896eed8aee8acaf1ff0f209f78f074a7e7e62e5cfbc9a1083d059c97aafcc720aa6cdc3ff700a0b8f3a79edcb5ccd2b9f2e3231b7448591c7b05ccd53f835509236354f1ad3a466b8e74cc85d7eb5e93ebbeecc304faf1999674117ec0e7aafcd25eb88922af48427c7403d24f8ba4396d08ecd89f4820c36849d5a3c9a47c5122a7fac1b8ff4306b7cf0becc52659b4a474e4098177ac74b6726b1a21712b700046d1bd34659b7d76fed27f94ab2f3bcfcfbc04c9846e1879e83447dea095597ec88da834afa30d10206bf812e393dc8c6f58bf0f28f57e82a220bdcc7a53baef0455acacdec94f63f549956fafd69af124694a72de114c77d109056a1f5ad44c4e4010d8dae65b8ce4deb08e2b71921c0814f8a0a9ebff2de2c1c33f90e3b13c1ff58e53cd9d2586de2322bdbecd55cbafa897fce5a02123df9fc09b38d93ca229b9f075fba4471363a1acf77433191de43d424796e3c103a29199fa2151faf1e4145203b63a3b74cf4e09f4d784fbf133ebff4c4b89850cbb34dd53b5675d18140fd623ac0ebf2b4027fda04cb136725072cdab8c1c0a44e9c849323ab8712cd7ef5274e864b7db580ab51347e0d0286931222d3c0329e0b7f953a73e95b5777063f4f21c996b2dc72c9cd8022aabd2f653e5d662c298dd5d185291607904f8f135c694bd54eab52569bf5d1b9716aa91add88c56c75f079f95f0239bd3d112a147da048dd966368fbe97382cd26cbe941c2615663babaab1b869485e805d7544cabcd11aea120b92ec2a0938276916e0622ab364c75e0eadb6c7a28938d96cfcc289f996b2476e2eff38651d32d5dffa66fb96ba2db8262c363448dae17fbabfa978c378f9c54e4e660c468a364b39a59722620963187687afb094ed51b862227a61d0a67310ced52d33c3638180d66e3b6985f12f7fe798d5a3fd939dea092b274ef2c78e2d37fc67621ad69767d260d10f338e74772d752e665e3704422b46c8e8917d4175f339525335e5f2cc30cf62e0a8ce75d51735c0eada8fc4ba33ed5bd1f06f50ec5fae1de530be9ccff026f67c74397423ce1eba0fb12d4cb4f0c31f0456ab8aec8151a29b6ef80ea3fa702065a3d687295cfc7e1c442b6a1990d211e130c641683e5c6819e9b7d3bf18df31267aed442377f18d4fc2589fe007664baeab21f7584808456deebb18ee6c67c26ce46b2b38a799e50dece843715090b943ba7c4da25dbc0428e8894f08dd72b5a3d10105c5f330ce9b0d108390cf53b5cbc842f386b048eedf6065a522fa2a14aeaf7636aa73372bd432f67b1a34d9615e5e6ea1711a666a05ab5f0f7a330f192c9cb0bf181c1a7d74b0a7c001e3a5e2302512ccffadb5dca0a681fad01a252c91534f5df3db587d49ed80a3aa2872a3109f5027bac2407dcf10ede76bcd3ee0e8e67f2ee2e43a6d687577860be5795bc1a15e3f6bec79240b649f726bf922269e6467a532e19e524eaecf3e83ac4830b3c0b57e65d4a6842063b245179350b3a52e1cf18afe1f2a4079a260c9b3412300f2a6a0b82f63fdc9a7aef3b432ac6beb91d1919147bb1d6c02d2f9b66eaceb1ea98c2682c3847a15052054d160fed17b18879c5dbdc74be180056d06", "535251656a52656552", 1, -834111688, "9cd0f63fb14ab2ab4ec6de48eef93128086f72a24b9e9fbf94e55bf646dea046"], + ["dbfe7572010734cdeb4335d71807cf9eb3d64366da190b66a39927151a60e016a239855cf203000000025100a2891c890197dd380200000000086363636aac5163512b3a89dd00", "ac515200", 0, -1496075478, "1d679be7a8d1c913fd938d59b683fa01e69e2c993a9d39a088772c998b2cf0d4"], + ["3cec891d0317570f5658525e8bb2542ad242aadc7df1de30c9235eec4aa70eda2242dd255c030000000665ac51636353ffffffffabe17a627cfbe008a7d0f92119028cf26142d3357ae8eecd234238071b5ae55700000000085265ac536a0052639f344669488b5a6b0393076eed8dfba8d360dcf7d240bdc9df38af6a23f93d33d7cf9e4102000000035352acf6f5476b02fd3cff00000000000200522811fe010000000006535352ac630009515d8e01db5347000000000000000000000000001418fc1e80cc1ec2fe32d2eec080c703fb30d18b4fde3a88872c9c844c46969e0e2e3284396ddfe08621392e3801750877d045bef255ebe79c472ecbe2b996b5605ea7b122313d421932f5313a25048e9131dcd0927b1c0f27e5ecbee8756c3600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000be7cc7edc16dc3255260cec0865d80c0b5bd921c7686d41de8eef680f5887015ac77af16b1bb515d2f42271d5d41cebc81f5b37b973088099509ab4fadd70b3ca1550c9fc124a23434b11ca67d5f997a2968f71a63f66f338b925f5ecf8b0bafe63bd93e9e52f1b0be10526a298121839e5a708e472081b1f5d9bd95e88b1c94032ca7ac98a5c063f7b01b96f8adf4bbe9f2e2eff272ccb84f189ec98deae352b7021c08b9c0d66abeb6805e8dea323dc70a273afcad7f145d89a0565847f17582450a071bd24a79d7f1c2f935719cb19cbcea9d4f338d24231d8f7edfd49ef4de8a19fcccb6bfb59e390c1c3e5467be59da800e8888d2c942977616880c4c28db4852031318b88dfa079bae11284608dd672553557c877592e8094de1cad2ae0332bc5802139597f6158596633c9ba872d8937a928274fd0c591059132d49d09501c91502022eb1ff9c1c78550da98fa244bcccd522575c9564f162857d5d617038a0d9512a031b4f1eea24b69760e03886f44fa383bb15e1ba2fb2a6aac2124cfc43971c61d8032dcc56ace1331b126171b4723b5d8e297d41298f189c2c946bc2b7f196a6ec3877eb74680c6eed586a38654e214e396839b3d04e378b79242e4751cd4544fdb9102e0d2475582d0ba558b9c3bc09f40152a669765c765c3ea0acdd36d31feae98f69bd4df29139383e2a1b4fce1b3ef695f6573219090b7c651912b80167d5b15fb605ecaac633149d5680132c9a8dbe8669710a8d441eb2a5dc1bedd3014bebb0f5817bc35a0676d3b118904bffee0b48e3dc5a83927e4e52b46ad0080dd1fa51d82975be54dcbb7e1a89cdfc211d48ad1d3ccb88523902a6b7f2740a53385fb97117137d6ad27a28129e5d543cc497535424c4035b2f319142aa3df5acc61e8592ff21e8d553cb61c07691aa48f640aef3ab6a26c2aa1e4666ed76461f0136f4333db0a468532f5393d9c670fe3632cacd99a385a18862a7a25321e89f5b456b1b07fb59133bd1a8c9db4fe9f44092cb0a77cf835b5cb39c6bea7141624fa25e2e1c1b8318dfad99a9b924b219f75f2cba01f221787323ff78b83de49fc69598e61c495bec597c23b3de037a9904975e031a5dc7d82f5e19d5cde3e7c35c3760253a309f3f0081cf1a6b9741e6fa4fdcb29d5cf29951a21c7a08fa940e8dbbee9e0eb0ef420a325abc04aec968fa49feb7e379bec6e522359ee305056dd45d054d7202b24010e2e59b036293070e7d4b346cc051adb57fdb32d5d2fa15868c5f330ee9fd265e55c95cfd56ecf8fc3a1712e9cf3dda37e0dc51479e850e16eaced1bdfa87e4cac4bd4ad1a09b5bca08fa0e23c330f7f8dde8f02c6a7c6afc02216ea00521ca7824f08fa688e5112ca822db78e8c04952c81c72ae6000510fc06b36e169e7cf1475aabd17b16ab92f572e3ff37c747c4838a5f830394ada4f703a673feb259f81786a9399351c7036b2b04db94df4d7a1ef27db9f922b006b0cdb1e5a3a9d759f236cb294d24d37f0bb54ec74537d824f9a460a985d66794b1488e8a77285600795d7fbacce8944457f19f77609a8f6c8067e4ac127ce638fd27f5ba4235fb968d34d154923e744ba74bf5c0f5d0815c30a7e292c078acec5778c8ddf9126fdb94a33e25b4361fac7d6fc9f07e781ea394fd554e2e55d6fb9d9c62ef80219e3d6dfc8184932efe7172be756c7a8cee293806f4c44b82da3b9709c2be6fd823746846ccf55f3e15f190bdd2eace71dcabaef3eca31358471021997b2858c219158d028a26fb99271f3acc141bc7d83612a488b7b1c6a976cd023d3bdd575c6532faac85897f07d4902cb9665794bd02ccfff0ed57f9f5f3827cadb811043ef43ceee0d190f7260d6f3874b010c548ce72507f059f9fe0e72a581adffb00255642e6cba37c24f6922a0666c45b0db41cf89decd9d093515b48a8ed2cefe279aedb9b68f8011ac9d8ad31a05d18e612c1ed531d9cfcfa5391c761d203347bd7427f25eae5efdddb6f6478338fc83dbf2e5206d4e5978eaa4881aa73d35c930b5c8abc945708b10444bc6b6ee17a354f40a43fb372499f73f79bf5b6488f06e51560689f10c28c6ebff5b7ace1a2af1f9d85de5df4e58b90c38e3a6535ccddf274ed740aaf849592ec46a7f02ff785dcc39c261df0a421dc7733cb52012036edf49ad84239c6a41fcefe87d1e9b68a14bba949bb244a08835676c2ca1487d13dbd786b3620a79bd6c8d31cd1b18972402d9aa74fa9883fcea22777f31e26d41c9477944ced698e66f403baad368fc75810119a10d581d318b4cc0426401e6f5521aca35141b6bcf21f323a5ae70f222db8d448134a565652f0622d90bef7ef6d393820086eae8a25a49ffe2fed40364796687032b81bf431592430d1391138ab4a1d850026e5e8cff78d4388a0c", "6a5352ac636aac6551", 0, 1380502565, "538fe7f781c41b1293988164a70a75f1ada9db38edfc2c99692e11ef16b09474"], + ["030000807082c4030224ce0bfe62e64644564ae7002044a760c6a58a0db1f827bc57f054e727c75e560300000002ac63b8e0fac22bc46b91d4562508c864433216f432b9857fb6e03ad690c6402554dd8db26ea403000000036a00acd5dda85501c0ebe9030000000001530000000092d9a92f018daa0e030000000000000000000000009fc95e35111c18058229a6a3a5bcd12cdbb5902bc9a47cd575c80ff2d4064efe4e8a6eff0026f9638138ca13b9924b76f343580797ad05589cdf7cfad81240860fc87815d990a5c810477c9057176c5e987861e6c7a2370743f60a0a13790bd20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027b976d2aeaef4a273194f1826efa60a78783c980ab286f4f08cdeac7c2bbc24a25ad6ed6d07b26c5a869d31bbefc60ce189a688f265e3ec42e7311d0d780f0dcc1a891e7c03ea37a05955c176ad775ca133c331426571acb3f6701548c88812b370885867af247db54c05af79d01aa0fbb5444e8b27438cd1d6b7639c21396602271900dcae98047bc63a7b1f73e817785528cd752c4484d2690b1ad5682c054d0321f0c9c9e8b8a939327b8f11cad9e7c13b87805e02de2c8a585d8609e71211ca0b031566a739f64431564089d948eb5f23681207b487fad9956d28bdde530da23c1f330154dfe156610142a3992bf078e66a2ee8c9def60d4bef6e4e1d1b6ee8b6020b84fa5ab7c7b3cbb2776a350a98672667abf2f4c44330fa3e9f33fb69cc84fd0319a9791c383fcdaf0df84a3e0b815032d2357dfcb9cebfe2818707d4fcf0aebe021ee997c6254d472e92091fb0085d5833edc571ed7c93f2966c048eb73d87a79e032247f0f2c9c6e8da474c13e15e20c6d42e6658e46c74bd1cd3abc9e9774aa9e6021f3496804d3078eeafcc36b57ff791d6b2e9c8837262828a5b563fd99f0e4c9d7592a359ae092c1c3b7c29f0e5e9e714ea5fc9bfe1baeeff58f60ea1d124f0d625752140a655f9e8cc6d4d96f72e2b37624b66da875389fa271abd0f41aa9ae49062e8de9cfe91af0434c7f7fc2a40645a82b4146ed7ff1f3f32c191e85f964adb8119c16c4aa43390fe0515b944ae1cf802acee1e1d5f95629ddaab03565aef0b6db4d6c730596aa4fdc53a6d083a31b5edea46b804710ac905d45214775ee838e58fac6e5750352ddfc358958db8436e840a40e32bebac82dc4d9ccc374a3cdb58c3da8b7eccde016d8eed8e2f125ef05e427589a88c2b703e2f6c4ee00ea30cfff449df24e9e9421d1a3d13885f571c2b01c19100d7aa138873c515c26cb239b22549bed3985a261fe10846fe9f171d16fb6b21af8b7e4a88aef7117a871b8abe84e98951ef95da1a47ad8754a3a9e94b86a6cda7e23644a0cb7bdd1a9148226fb6d31a0840059dc47c3c0dab1cf05bacc475c43d3f0bfa6e9512acdf44e17525d86675d5ff5906c3ea56e05025ebd505153071e7cecae0c0e7e6a267847a1ba74bc65f425100b636ebb973ec8e5b4a11fe76ca73939947963e1ee491a54c1984fdbd7b7341667581c841e90984647a92cb3d0a7ad558a61213941a44e402d2f812015d7e5a7b037fb5f19bafe75b4f04809f59da0d6292effed6bcc64c4dfcb8c82a4298b1ca8d286aea88254900cb8d78b36aa7c3b9cf7c36d41359b2dd27809eb59de540541a7bd7efd7bfeca8d1e25c81da7048cb6a0345a8c5d94cc51cd62adfc7ff72d9bdb41ec0b7c07de7b6fd4f94b202ab065acb6cb9e754aaf778bfffb93bab9f828a4238472c8b55ac0d9ff19cb3e539f0baac5e243443e66b076e1b84dc868331d91dd6688d9cb326feec631e7216587dd2ceb235a07f6f462f4bdbd4748db07a51c9bccb728daa1362cae386719b6eacc436e0a4ff4376f4056b4af845df3137c9518c9c6fc3dee1b3997369a6a0819df537f54ee022b21e008ca60ddaab088908108ee51e372ab97f910deba5e6f0890c0b1f902b40aa1fcad3869cb8e93e536e08d3e213b230ace13a0d54f96d5a1c93ae9fa52550a424aa68ec321770d49bf5087e5fa8b3a2fb126795731a5c8bed89b4efa8e6d749680119d26381830e4b836fc06a1eab44e27358011e5a01d34281d15d4958fd4c25baf65e84b5b6533efafd568bd3402e8318981d9247b9c7b2592bcc24731e1dd3f98a2443ef24b221c8c69a7d46b3803dee75d3353999b623da3eb7c8b12e08dee7e21fdc8517a8eeb0aa478773302108364de84698721d2c8e6d01f7c33a2b50701b63459e69cacb782b2cd4565b638c0b8741901a7fa08310e1a44ee1c2ba9f4bc2e4a7f42dc783f16bcb1ecaed1aed4b1605b5405870f683ffa4a359d3c34e05a2d2d715778ea9c8366b96722e3ab647d09c6f20b68fa8aa6d0842d4a34c6c2a2aff885e2ffcb7fb5e25563223e21c31e7dee27e5472dd486286bd9b264591db2ada94e165df4dd3518cf00f4c687cd566afd1193f6374cf13c349a2cfe1ae4f4a80f603a245fefd708fac9e740f6ff483cac655b15182badba850c908f8de065b0566c4e3a4684248f1d8c2d48d0719794b18523da5e4428ec69d14024d015353bb09f47b9219da36acfe2e217e4aa6a2457cfd977d72873a3c2a16689a41d0812435e2b138414582a096f305a5da49244201e350643295513782c0a9987079f36ee3d1c5d0bcf19a50e81b4d35efcbbc9e8aad21c698a6c49620f504542318beb53e67a6727454f265b26e9d380052ae860dc3bcbc5853160f99f1933d8cfbfc3bd054c74eee5ab9a7e3b824efc6b101", "acac6365526a5352", 1, 1548863344, "cd8916abf95eb28b176b346223b1a27c96cb01cd321cc8322775f82774fd2d22"], + ["ffc1137c04a446f4758fd8272da309ea4d67d032017d522ed5b97dc4922483bd405522956a0100000005ac5163516570a9835be18f61f81ead9ee035e6f68350f80ec546a487b88ee22b1f468b19d6d9230df702000000066565535365533f219390f3e4ccbf98940957826488c66c9fdb1950e2587ce9316a0fc0c3367e86d28ea501000000065252515352539deb2c7bc67af16dcee77630a2032b525d8db5a999c5ef940266d9c813490ee9bb63c314010000000451635200ffffffff019ac510010000000003acac6a00000000010000000000000000d8ff9604000000003945810ba74b2379086cc1bf92cc72b581c4ca92fc8b3544d76ac10a34a9851ca9efeae2a7d2518599223ad98a5122c079eba2311ca94b0d8ad3c83a737c4d3a05581e3f90d097e9cb6ec245f397214d5b4832be3d0ead716821190dc464836200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c56e5a7c6190a4d88ed6b3b54dbd4c60cd77e6d72530e411fde75f3fde7044011b3ae7f72464f31bf809ae2b3c10e6d729f1e8ca56900d5bbc2b277f0c7badf79c4c5b15fcaf5608e2e187b61893220eb32046ba028dcc103beff2f9462fc16c10fc6d0de44c55ac38a8125259443dbdf0a7e55a63f8e3af41ca05a7c3d33cd0020c40907e3e42cf8d0d58708524eed675d808d345d5251559c7c37bfebcbccc92020b7e5e919d21fe30fc3029fb6a44259d7ebf76bbf6ec884999e07df7fac775e10b049771ef8af1c838054d73d6b9366ab4b24757e20d3c010a2e160508a9c56dde4c33b934ce50c7804f28017a6f18dbcf1e6ed45937b7c1148aba94d1cc7c48a2021ac9d3944e634aa2d8602f09442ac08b417e368f55928c35e0242f996c0e41a80329dfa158be568b5a3dc69b2e4839abeeb6b28c9a2131b488ccc45fd01b155eea03292e3348de24eebf0fe1be3477db6a7ecd00307eee5881cb332112e63ac7a8f10208b38e9010a72bda5e5a71647da6674b22c341ecd50d1a0e70523b508453f67c0209d46dad7575018dc5727267b9563e1e9219d6e4d426daaab3d37b7c7d83c25f3292a8df598020717f971f7125a0902d5b02fc28cab4f3671dc0269d86a7c4e5c6843698d136cd4331c5d24fdad44062bdb95d7b527cff44a8235588778e23a0f27f5e3e9411731a0ba955947be463eefd8a07cfadb679a862bb156991f1b3e221d39eb7bdab868e56b04fd2bd6b95f8f1cb41dcdad17bd8da99ea376307117d4dba9ccda7e7508870977b7446655dc08b4eaa5d4bb759e3f6991b627e8a326686002234748cca3fe0ccd180cc5a34449c73fda69c76bae59234ddc4b10fce8155cf97ac73ef07882a23c3c63d27e6da36f17aad19d4aff79d6a185079c145bfde5f37ab19529375bb134907bfc5efcd98d7faa796abdc05a72ece7c1761b80257b55cdcbfadd77cfb6d0a9bf49d751cf1e581faf81968edd8ad9465c447509a3fc816b05e1fac5692c542a7693461cb6445288cd62a50d6baef5771e13517d8ed3228b70b1e764f35d96230d0e81420abc9bc1e2c373f1e1e74d857acc1efc79c2555940f74e7106535be0e0093383be8b3fea829daca261119537e4db3468da6097565e33fdb6d90adfea36f3fd48b83370c39ca7ac797a077473e18e9b65972ee400e670bfe2f43d7a1804bf9ccd9b0226c2b7a71030e00206f296dc885f995012ee48355f4f35a0098dc44045acdaa75a1c71916359ef8c5fd84ebd9059b26276b093dd807720f6720e229f2d28c99112c58240f4cdf69efbde837212f91314d9b25f4daf87b00189d9851ead930db655c34d4e771f1fe0d04c3c1d275f0113ae32da40c8e036cefd4e0764b489909220db038adf06fd43a2ad3306dd1f476652c22ddef73b803e2fbb7c1d5790fd7c3e954ff49b3046c4fd974505f94c310b2be9b26a816cfb266c27c6d52947959be709ea9ed5da5387744daa22c5c305c4a6989a7463dde6084c05052ec95d8353b40361eb8e70aa65e79f357da70fb9b4e449a7919f1b6be3e9085370903d0bf152e542b4556a90d79f62558ca2d2ebd4da05e531f19368df1b8ef9e5a7f9bf2c99a1995ae3e5f08158f93d730549c45c7b78f1fe19b2337046ca4f416063ebbe952931ee6fd33e3309a0640caa6cf48997630ed52b9c478c47b04f08a80eab8f664f717e5648a811d0f04310cf2939dbeacc32a743f9562fa8d8e97c7d0abd25bf9330226924699a16c1180ee66a8cab1f7c1140bb6c3bc5b3b4698d459806f222c13ea6f2865632cae882c290e0347cf07cb88eecee8ef51645ad38200fc9f56cb2933de82b75cf5dffbd565ac64391ab9055b03ffcf6bcf5802acf433dd4fdffc8e0197f707327361cfb6c09c6275ff2765c7fe932f1afa5c4c7d213fa37c817c0e66dd1d2d3116c9e9b5f903ebd5fbda3d933e409da5bd98eed8215e2b6ca8a69eeb557341aefd3fd0f721eef401745e75ae22fe6cf2fb35a2f28a73c360e896e225fbdbb3ba593cc1785b72642af86a0b37f66464a95acd4c2a67322719f46e3ba6ae19e54b6b82adbd1116f81a0b1c00df2b6e9cecc9b3576ac2933f534be9ea17b57d4f43b9b882912dc56963ffa12b63254c3dde91dee49971b3671745d9a200614ecbe10b724b56e4e752b45aae6318e9aac4e6fd47bb330e79e18fe769da48793d3a8ff576a1d495f53d116e6bdee601c79457ded36b51445e6006993af1fda3629a4344648fabcbcdb064a07a1070398a8f45196ad6fadfc039428d0e467954a3cf922594a28c2aa0d30de4de014a78d1e74d35a45ddd467cc0a4ace65908e2b68b5b60e6287b7d3d6a7c6033d64406740bcf5411d20fc9bd17e3350354c2522d91d854e2e77850c0654d22a995b642c9c77779a9137bcd8d2cc10d", "0052536353", 0, -536981457, "5f93b18545f4a746540554af387104e6c79ce47555cd8ca61386f62470dd03d0"], + ["ffc9973304724082e889931009a06a9c58f07bc0d43662fb7ec1486a5eec57ddf276a62e530100000008536a6553ac51515215449dcac0a9d1d33f9d648cbd9e5b34cf35e9999c664816e00cb7274d96c72c4c6c8f79030000000952006363ac516a636a77c81c87112d7c8f88f11b21ac2b2e6f79f367f2d593b592825c5eb3c71a8bcc12c201a301000000060065655252639d414e8d3dffe57092c2b250cb468f653efac618ea989db1a5a8273624f5104a1eeb60c00300000008536a53526a635152ffffffff010968630500000000036a516a00000000030000000000000000a75e7d020000000028012a22a72a4ddfdc911354033095018ac038feadd019ea3ab10f021262295a64531af3d00f8ac589eb5d45319fa32d9e9be133a27fa280918705084d03d82ba530283f0bfaf2af305279451068a9f287e9a9d3db70617eb7e95fdbf9926b41000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f426449851182684d89387ea111ba1060eb223b892395c7c3e435b1c2d8db6fde92e285a32446ff3485812fc6083fb3d9e954651a7e960213a067f059af12aa61c1af2a98efdca527c4769944e8a572b3e21b32f4cfcf94a2df2d00fb9f0cad826f72d74efa9cd72f66563ff2dab7dffe5b34bcaeeae36cde2ffb1d5cc156860218ecabec6334b19977e2d4e5b576b5b61dc1ee464a9296e5410f99e87c114d7e02049017d994e1580b3e524f83e4d25bfb898997ad1b73d6eff6ecf7fea92fdf150a0001d7dc25737c1276186b612545591845e93e314c1e73ab850432c336a0940550f3c0785b3c814e4f30b80d0dbdef684bc2560c2ac6583cd42be1f861550b4c022b81c24d61c7387ae2aa2538ba7891f344c9e34f1b5ec1d80d7063ad0ac045760227600a155b8fe92d3df7637dd00f1086ad0860652e4d5b3c97cede80b35d09e70302be08d0598b9689ddde86195adbe0bb62c0546d2b24a9eec657f735dab262f7021f918ae8bbdfc837730bc4b9b6699c6ea2592c025c95324edbbea366478679280323f4d7b15e8aa6d2fa2421d81ca7741eedfaca1cd45970d4d7e386aabe26c8df9265ed8ca555dc8f648d3e0fa689c800ba108e15c88173a27c547963417df65914f56edbb1e4cd4e3547530d752503e2667527270070481b8485034360d2043b0cae7885b8efc98c384db00b32f1f8232feb440c873260b392017ddf179ef19f7e8c6c713e408460681a577311d95364ef2ca831070c4cad57b9048fcd617059ac8eeef3aa2e30bf5a779dac3e51bd6de315f77f110c27d390e59f718f3654ec84b34a657135c1e10aac04e7886560fb2a7d7b030f968d75bde9b896a339ff0167b2006d6773d6b69ed7f4d6c5dc1d07a2d951f5b5d992a913049bf686b86756181731ca3a27ed2cfd2121df21720458dacab2760005ad75d94f8f1cf2b47d4b5c6df13fd3aa5dfcf4d0744046a3a77e7ec8ab527872aa175ac58a9ba6767a942a1d610c4261bb1693d1821942ef8d8431f955042f0884c0a08a1181800fd3dafe8d8b8d24cfaaa5cdd899032e9cc3b9f0498846776992ecc094bcb315db138dc5a58a8d575656f5676b2747385e6b581210c4873056bed883f8087ab0c08c9eb22cc1229c5db9b4de03b081ba25b661c11ad496857bd1ac0dd60c9d0bef5d096d6976a42a8e500ade7cc31a58c8d8a61f91a2fc30d587d3731d5a87879174c3aabd5b643317905d184cf1962406cdad0694ec680624c6dc0abd97699946a43e222aa4a7b8896461c0ea9dc1fd922c707caa503424ddd9949b13ac810b68e7524976646c5b06ac05e81ca34fb2a13a38f06d09379f0ac50bf2ab7d961c99523af86109381e649f2047fe73eb8ce51b4e50238c1c40e1b231debc00e9f7b0d061c4b5ac65eb7f785686495d857746c87fcae9228f184e2b76307a59e9fd739fe3b752b4c716942a3261fc5556590a4c5fca06bb20d9a303cbb6dd92d123d6489d1ef3abde3d9128d4a8ba164412130a9ed93484cc7f9e2277d067950a45dfaae276cd8ca0c9662711d064e7ff623d2f94614d870b131b6267a3c1c482bc5ffc79a7954b0cad893342e35c1d3d0a4447cb490ec343b840e233a60b51804996c517770e1b2e7585cb5af9d2d6b70f443a488083c6f39e19a58fea82b8bd5f600117fb707bb3e56f4128b2a372dd5cdc76f67be22acebb624aab8b2d70ac5f50c88f687b440cce80a0eda47902216980f20ec44543e6b10d3735371254097669f740ccee1886ec3ad80a210d662756a15a4ce883024f999cd3d28988b40a611b6e78dbac53cb6ce01a62a6cc50a020eefa4d925e551f082dd49f1ed1e6fa9521e587506b295f338fca969cf673ec65dcaebccedc0824315a897f34587932c3505cbd3965db6fee8f318522e2b0ad8cd382ffe3c488baaca6afa25199d97f39abb8bd7d16385e1754d72eb8f5ac27e949455e9d8bd43c2e17238425eab3e58541bf422448805c43954972d5e933140886b7219edb8f3a80f7098f088f61c7a9d46079ea9ec2fb3223ccfe61feb20995f7f4cd5cfbfc0352d59cbea7d19995262390893d9b9e12482ede2c956e8037c537729cee8cc0e9b862690031c8f5d5da66178fd13417dce32a6843ffb6b76ccfb3f6c9ecfeb402d80969b97c6f7fdfaa117276adba5f9ff67f69bc08143893d8bc5e9dd1f8d0ab161d8aeca0ecda92764b969c26251bca3de99af8e5a76a3745fac341fb497694fa0a957caad544002b978e92769f002a4adacbacf47bb4ed6641b0fe3b3e9f5c4c03000000000000000000000000b03903d27d5eb87030fc9a141c8e52304eac40a95a567c54f7e18848b1baeace9d268e3f28616649086077a7d2f845e226eb085c1774860175e35989bfd4cda072942c183e6cf5bb0dcc16f25b2975bc5f99b49b0d855c53794f73e3e7f5c9dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000781fc3e4576d536efa1484b4d6060f35ce20e7c8d851e5e9187ea94246c00c413e5cfc6f6bc9939d8f46ffc279dd83f18473f9206466652abe6c79e227b9ed087155592fc4314018c59b3e525ef0942e91df7555b1a31219e7d6555e30078a934ef3f58c9ef7e7675c98bba1a3962dd822577ad6e0cfed979e53edfc53aba08c02015b2db95310931a35446c23e35375ef6b4c82578e14af24a0dd71589712396c020d2b34cd02824e876044539cfa0d9d28266e8b6e5582b6adc6dbb8bf6d9f9f3c0a00f0435ce565b6e6a4601f7a8ff9586fd060d85954ca91d365cf1d5ba667fc10102e19c8ac57e1f9175e0e9e3604976624aa060a21e7668ee0aba7fcde18f44c022c650db58887b32c53dfa16f449d4d5ab14935a1cd3ded8bee7f648f70189e1102281fc1eca4ef054bddaaa20355e8aefe04eabfb34bde900556b99cc384851b1e0200c17ad8ab057da9ed50bb4654d9b4598ac723a0dfc76034314bfc6b793b0c2b0212231adb5b15ed73bce198f2e7f5b375e28427503c1b75ac577abafdd5040f38022dd7b439e49a4e2f555d8af24a6c2c3c9dadfa7fd0001ccff0e302b9e64c268826cd4521df8c96bc6c42b98ef106add5636507c6caa47d7437051e6cbff5d9b1c31673b71ea25b144cb3cd94a63501e82038c43447c75d5af532447899916eb253d5c6859d7582a881bbbded32d0a816133fe55018d211fb679894cf97c918e9d4d5c9022b2a2d448ef23298ee29e41ea69541302b0a7f7dbc2808ac987583b9af2e81a2df0e60044fbac39489520f61673ffc739857bae9a46865e6b077eb48e186847631f683d275a8286dea66f6469a2dddc94fef53b536c888c4dfc9a1a27d1ef70ca4d6d81dd5820b535c624b9693d3a68749ff21170976897c9e8967c6d1fd6f8a963df77b1117a1d3458d8e400d839691434dfbf4cc4dde851b2d85a8915b1da1c0ce77623b5d9940c3b08858a18c194b6789cf8dafd970640a830848833382681b334cb437053bddd9254b05337795c32fd4b12b0dc5f61f24f7d13083324c46593a5ade021d28d645e4bf8d45c7745ff7529920d1e7782827cdfe7ab1b904ed696d7f7def24155925a9aab9a64dc6db3eac4d9e9f5c105e09e815112ed5164f94ceb99eb0465f4e5d9ff8283701ce9771953515bc861d3bc1ea58c940f055545cdc8945c1b483d2787af5fb756a46eba42475256e09e3c6a568f537df2ff704ef348ca833fd792cf3090be2a415a403fde0d5b059f5245461fde20b79e61890f4a48cd40adee09223f75356b7f2b793a57c6a67b77b38b588183809bab92bcb615654a484698253fa4dc62b4aa0635b77efb2f2287048a5ffcae246529825259f50086bd376e1541e3f5c32a2821ffe3b8898ca6695140be14089b383fa0cc75b77319bbd5d0b56d7d0b8f81131d0dbd8a87364fa8bb77e1864d0cad2bb181a2ca2afe010195a0f791325d3198d77089c7177a7bf0f598efe90ae72b46c72e255681a8cf09fa80512f74903928fb0f1f7f791a5928e71fb28ee7e139f7bcbaaf68bc4185deb9fefb1fbf18f95d4209fffcb1c8ee08cd8e10ce4660ed8b47e0e8725016c37f7c9fb202b243b156c83f8d1f3bb08f7f0feebf9fb2b844ea7eeb5376d1159fa0d939fc8e9067a5adc4bedc17e5aa02d552e8de92e720dddb82457edfefe1547c07c76e919b880435b02be58944fb3bb5f32a6360efcd602d0c0712e84c9a061a3b910a82b7d2a9ce50f023e14b278afa991926d4b4f201b96f65c95b80c061f1f2b07ebc953ffc46366b55f2b12a7e924650d2e87c926f8e2aa6063c111b92d86cdd6eb5a34a3f9d3661d9ed5583d6ed9bb06df529f8db2b4d453ea6a4730457182f89071e039453cf655d42d5925eb44986b2d2219ec89932cf36e9a12bac5664afa0a773cd096bca356076f96f9e4710206923975d364debc1a5f15ac96870e46065eef1455b483e38a46f0bf775d08853c7a3095d3dbb893c987f2c12c9707e600b1c69e732c3e3653dbb6eb079e1ad641ce09050d39317cf06577e167a18e0b2e6ebef020ac64d82dcdfee9ef9a6dc47bb8db3d4c9055bbca0dc1c2cbb9e626bfc6f1c6a7842bc357b616e4dba5cd1b3de6d7d9aff4e4f30a2b932ca118bc433a0477c84451550341d4ccfddfc384b129833aa752295b99d5b80b81df589857fe7269a50d333476b74497f79735aea965a49cfc77411fafdc66bb2ff94a042d3f390972bc11e1f00ad2c12cdb401da6dd88a6adcd7d72b8c032e096209799dd69a6bc60491de30000000000000000280b9e010000000068f5cad81c8818ad91e23658e3820c52b54389a715a3df64d5a5329de335a3b52ea4ded028dfa97af831581bccfa89a500a75738ce043d8bfb48267ac00bca47faef9d640cb02611078895e6700b1078dc39d4fe34ccb8ed168ed06aa1beb653000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007d7c4deeee6dca1b2df1c6c77efaa99983107ffa4e22d05627e837d29f666ff244031286473bd26869226c1902f4ed1fab2dea695276ea43655430d5bd62e2a9f8cce9d9431228b974e6ea420519c695ab0b95c15d40e530942b80dae41158e59805e06501eb73db722e7a55b4ef3bb2da036b40c430c4e7cd1dbb336cad5b9b0321f84c6435544321cfc388b6f615e6863e1052a33bf3bb7e4d88a0deb2ccc5380324832ef94cc2038187ddb2274344770ad748a6328ee43b0c9d6181876dbfe2990a06b6fc3de6da11a7a5442f2b53b3cae76a81d1608af0fb674da6d12b3af4cabab900d73d5017bc793b533d7a00721daa9e83f1107780bef524406937271e3761032380b83e03ce0eb9396d9c88a7037d808ef439ff8c2be16c99220eee58d1b6ed022428c93457c5ec955eae89b29e6049fe5467f367f7161456c1ac331bfc9618bd0218b07ad1e11fa6fb396576c83a95d29cd51a9a583e946ddf67aa9e7dc5776c82031f9eb51a56e57d8c06048d7e7c294ca9a7fdcddaafd3801f687ab9798bc4a64d0219b958ceb463e7dea32854fed2197ad7c9dc5caa131bcd48fb6429834f1a4938bd1c97e8d71292f938f3b5703a2e9b6247726cde9a18820ed8e327205b55dc70e6c28b1e7eaae121bcd35126a11bec37785171b79cee23dd2220289a2e6e87fcb8fcb46050d033490b223412e95ef51d5df70cf1ea656e30cdb362dd634ea68903bee5f83d97fcba1a4ea0d4dfcc7a6c97c9f869fcb7e002290ca1eb717e65ef2553ebd9882eb97ddfba845a0668074473a52ff700ff4c506621bb3c34f979ff07d1bf64cfb0cfe645b42350e35e34a973feda96b70b9119bd485a7f6c21701e1e889e5c8310b8f2955f8de49cfcff2028b4e214adbc8696d14f05d55bc0da635d20f9bff77634d503de3e360604644e9a035e0ef318e40b37508316f3b3632478caf71cb8201334075d484e993e5580f77b591691acbe741d249767c6e57798bdd299dbfc2212ec4cb2fc31c5204eab85d535e9288c0320934e34390fe6947b11c84bca2b3f4920643c7976c600dcfdd63c55ecafc0674057ca856a6adc122d42bcb26a22d2b0d1947f7034734812624a32a45a83cc6949e73d2264bd70784412c605140a0cf149992232928df3069bdb56d36b5143bc741262f025f13fd121825bfedcf1fbd25117d96647b6f8a29e4134c605537505054fcc1ec634dde4a96c99fe872e6bfa00a8160b2337b2a0b1d17a86b4990a317f8a937ea86fa246ff46e58cc321fde45bb4fb5ae550527cdbd0adeded4ead8a4bf702fa920511573cf6941dc0bdb8568dc5db0bb66a85aac0244651ac0d8a3475a71f7c96124314be0a7cd66b30529381f44a9ffbb7418d47d015bf313fe25c7931205e51fdb135e67844ef874ec5072d3b6439d3994df65d75bd3c82946f06191a425902d82d10d20f5b4ca7ec54ffb01204abe06cdb4b639110544bb0648b878b5d7ed6fedc4b75fd052953f95f4bf18ea145b951085e59722728017f1df7161b9d65283f50c566defcf8c4e21b0619fbc6648c474c4dce3f64ea4d99caca11fa37f5e6846755b9d9b9d04a56372dd2176284d8346d73371a61e64e53590b2585049d462cf4e7ce953b22fdcf458dc68346e71004e7c149e6e2a5f3e50ca91db1e805cce998005446fd3750fd7d815f8232332c136bfea8c0958f2f511f6314b9e4f82da587a9ba1b908e8fd9b7513a441a89814c34a510c471f3c3271337ce3560c3c561eb13bb47690d391a50190aa7d653c58c9576813301c00d91f223ece10481af9bf926f5d4b6f1aed248c9a42f5bebf1d40f94dd13a462f012c8edc13445a003cb2eb17b3dc4f441db94b820cd37e4e3d0bac66314a8cb88644ae0cefb9f4958774b715bf1e51f2a38ceb42bc413ffa0fc259f5db5b542b94e64beebee8365f2b95746cc4115c299836cb1fdbfd9d35d468407eb34c6c490bfc41f87ff75c88ecc46969be64565de7ac974dbcfc44be405847b396be8439af6e17eab7e8598bfe46da170ec04d16a18dbc35e56376e8cdf4b08fe647608fb0b3fa3086d8a05628209f52be6959c59a24ea487b54e8996a919900250db41c0c165f5fc29f4084a8c4d9521f601702ae2b4d0c5846a27d1f0c17623c40f3811ca528ce2e1becd59bc380e50554740c04a7cb6107056c34d76c1239898c114761a9ca2b8f56d6f00443c7706784a8e2880eac0242efa5677675ed01b0215ab2a8349a64326b8cddad69c6eb95c66c8089a7126b03fe74afb6fd32fdc4f1c33cfaeea75ab05a9ac6e2f22debc1aa5e0b944294cf9a0a54f710dd0c9d207bc93150c319ab94af58c77bb7a5bda5a474778c7fb3b47b24c715ac223a77835cd4217ed34d2bde2f76aa77f27a7a6c725f3ce80f091c54211d685519f6f8bfd0d", "52006563", 2, 854964687, "0148c93891fd814ff24f47cc50bf3c0af377fc994f631a0836dbb82f43b36043"], + ["030000807082c4030139fce31706ca7b60284ea754fce137c758ab9ce2fb8737285ccd1fdb6d8ddccf01000000025252c4f33086014001b000000000000265ac000000000000000000", "65", 0, 1388787259, "dff6ee1cc09c826cde9eff8349fb56d7dbf429f96c48182e8192e7bacb52ee58"], + ["8a2f0e3801e2864e96f9e849052515cb3cae39b753ceeb0d7dc79460cbc9271a4471d7c8aa0300000009ac6a530051acac656affffffff038080ce0000000000096a6a53acac63006aac1f683a050000000005006a63ac5194dd360100000000045100ac5200000000010000000000000000467814050000000056a5eeac72010f33733c2d8139f710999ca376d6a81c5ba50b2e9f7f35ba6f55c1c1e393dc5b1d9390ea4ac87e504af82e7f20427c3e93d82d82819f026302e4d835648ba3002f451039ba2482393fb98cdacb6366fcadb017440b3804e5873100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2f9c0b3e589604a02f3d382a7eaa8e78b88616b596ba0348444e5e4271a89d92960001db93e35884a363f648fb8fd59ef6ad594a01ae6097cf4bc9e65afc5e236fe156c88b565b8e1126f78eab2fca1b432d433ff37da6dff0b2864326e448ca812a857556b576064e079286b36d84852181fea95fd7e8552f1b078cc95828c031f632ebbe77509656d8406d569f652cd62a8ff68c8ad40d8912fa2e9f8842e630321e4a266754be551ef87d4016e418af64ed7bd448a3d46a9149779a2b9338d920b01fe70fdcb6e1117521b7c628e4cc4449bb2ef53a2d85d394956058620e125af539be032258af55c744aa2075eea943043395c0a99a1a10a4138ccdf7f05b796032eb77baec72f3ce4abba586726571114d863cad923c685e3fb734433dd55f567031e354349e1647e59a18143f7798ff1fb43715d933c7b10e0b113a453741c3cec03031df6fdbe3dfe810d80448b258aa28abbb6c705dec3d4477f50a85523bb1e25022214bb1527af693f2aa50c5c192be51d6b3cdfa9f48be49af54eba9799c15781021df3c090a0f94cd1572693969eca9b42664d49b0bba03cbde12e493fae1a9ec5593a4339bfcda0aabc7d35beacd4474ae54afb33acb36f4f37ecda5fc2d4beed8cefda76053539c5ec35d4806227b3414ccdbe0ba836acfa3ac675f21c031dc5c0c0fae05e8576b06655fef25125e2333d799dfebfdcdd9debb3f3330671d8d3cb72d35b1fbe2b66faf07154c9d780ae46ed32aa02dba1c030ded13fbbc8f76cc2225156d783eeb26e0556b38e59da6c6ed63603824ecb2b91f7e8554ccff273b5519b4eb82567411577fbc01717e493cf3fcb7e6f6749b8ae2d469b946c8557227a9193f3d40ba94276a8ce026aeaee70ef3533ba2d68857126fe5b40735e4f0786cd8f0b1a46ac717445982cf13731a69b15956e281f22f4b7eb2b7131b421c1b39d83c2490575d42c706ae54b4434028341bde5b60e786ff85c1b733ca570a4e8baa9c53b2086ca6ebf61635eaa0bd365767f309daaada6985a4ffa45b05c00390a0bb8faa3fa5cd4f12a5e1682e0455fa263fef369e843662c01714d9e0a1edb207917aac7865f41a5ba993c48b1f49bbe653ae0d4d5e022f67340c59fce5574261e15656af3159c1cf6929506af7475cbb024ab5d1ba6b1e606ff7ba704b136c095f84cc6d2277595c3c7fd758716c3d5b34e8e163867f1bf3045d2cf0912f4cbd7b1e25659cc3aee817fb9d9c536aad07806523ba9111f9abb3923ecb0a200950b916e1dc4fa392a5d77e7ec7b2b896a879233a4ec1bffa9f48180127cca4b29702bd847a097ef5c0b2fdc36f362639a1a16dc621e8452c6bad4044620796765dcbfe38e4f3768c810628cdd85b6ef30d293ecd9bec0caefa62d9a6b2b21e27ca99abbfa334598850af0a34c7866ca93307e7275ccb16560bb5c643e576d4d2e1301bdef2b2b03629619b8b7aca57e09b5b80b249dd172f02bd82dd5fcb850c8d1c7fbd5367259149d50b6e10a0df5075beec435acd172b6fa8fed8990ae9f7fba94f28e6538944a2b4a5ccc8679a86f735404ff3306444f5fe1a1b6894d23ae6d143a65aff3d65e24fec89b78685909da708852d766c2b64fa7d1c3c469750efb63c807b013d829b6a71e8b2d82b296ac89561cd16bdb82a75a47a981c34d032966982ef22589b93c31338059c0ea1d561e9af1c23fa8563aae75d850b97a12bd11102719672f90e5eb673ee277d6c3cad064f3193f7d89e005e83e0f58a78bea5b662a5c4a2c13a2afe30af3ac954a9ae4ffc4f1a7b8b442ee6569030d527ecb5ee79c9c417c7e490cd10250a55b9e4a4ae4dfa89d84f8b99ab206b7f006499c6ec0cc5e66d3bd364307f30e6ea95e3754935babe995136b1f282f3d7dd2b6a779f5a70e030d1c4109c8babc94ee63c83c72e1724445cd44431fa17ce11c7ada24e463b6cd552c4debd5a42f9fbd87c2a5e3a94b0c47845c53fa8de74e44c280c1c3df7612ab7f93d6dca4cef70e17e8a0908955c1aeb6399343e544aeb896b6d21fdb55ef3e1092958d8a47a0e50050a596e23a59b752bc08ed5e66aa3086e392552fbb3a5aa14bc727ade99dd6075c36080d50df01fa30a71352df959945dbd0019952d3e9f4ed92d6105bfd90072baa6d6a65c5bc9555dd7ec768252bca43948c0ab0c36e03353b0a5eea13f5deb15c6a54b80ea4cd56fa087b7ebc95fa4947673c383dcd5832d8bbeb317ab5271e70d1e12cd269166c02707dd933f2805d1b8ec6740cff98b267e2ab823079b6071b861b47cb93018a6952e33a6003c361e684424b323d7ce46235afa1eb219f0e02117a75968028b896545661b8ea5997d887bfd9b625083eb4fbb7d8c367adc663f9f69bd1b1c26c1cbc1414a84f7882e1d31fafb67cafc8586f5bd0c003", "5251", 0, 985564103, "5636349c1e4145e67b0c8bbe51ffade5228cfc0d477fce658397a0f8b284780e"], + ["030000807082c40303e775931923c3cdd56225a6d3a9ff6a84ce24dda64e4378336098b5ea6471e18f03000000066565516a5263f4ad0ac4716bb83e68725c43d3e0693d6fac762983d4a4f76fa801070da76657f1994b8d000000000465536353ffffffff7712f736dd10e605f5b07dc60f5bdd7167ab16542f87100a0b82edf881c86271000000000700ac0000ac5365ffffffff013e591f010000000009ac0051ac6a6a635163000000000000000003dc2a320400000000000000000000000055316bd534e9c2cf64a0c6f1430fa679e61c965ea31ed96ee655665bdb814745f542a3dde5d1c365085516d58c9f9c603d9175d0e32b359ceeb00edf66829517e29a61dce186919796ae868cedcd4d2f86db131118d43b897a722a34f1342f980000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011c3116f32b8d09a762768bf01a65998d4fb55adfb0ac47ed68c0bc8b29e11bbea1c50da301f2abc5f253f8a18ffa81ac52f0967ddd2b48907a7026ecd3e8d3322582b0220d35186b135526a571e7ad0c4d2258e89acfb0a3ac1f3bf9f270ca10a68398519695287d34c584f9f8111e1891cecccd7a0734d43d78f2e46b657850212846733f4491fcfc4e02f6b3d727570a4fa7f6cdd41eff4646009106969be5b020f6bc34ed3f795962c2ae21516140bd0c067b89ddd2d7e48225f5b89f36b36280b0730c0b3e08fc4246de472a76a4dbdc04695f432293446524ecd1baaa7ab7a8cd529b0d34cdea5b53b3a179814032ed667a3ea7fd88fcd34220fb485fb9346100217a13e439fb79fe9f1cf72429801027b56b97ee14d5d04d4d93373ac3ef20f2d032fc8562bf2af533daaa4c72812b448329a7a1a225ef1fa952dd9af88ddbb58ca032e0423c64c6baee08772a97a4894d2ce006675f62f45f684b1684eaf0cf6173603256e090e744b61f2805bf4b72e338e89efe307773c742951dcd21915ad4a9926021c81265c54f3149a14341cd6d8755eab9b2c2ad2dc15a0a00d1e82b76082d756f5858163531fd08f34cf2f77ede0bd4b486be7b43df1a5e631b42e3b2c50a91538419ff790b6f76abe40eb672bd5c86736ad05ff57e67b6ffa404f1364d98e1843b99c61a30956489a4b5905cb4be17d44a52cbec82cdd3810b6964416bd898090122edc45df169128739dc068450c309bd325e6f821a2240818ae04a7bcd4b0dafa047a8f9bc3259cd9c43e89e08af005f7f51d6328f71b40719ff1412da964b50a9e30973d08fa0c3da7e2605248db4a2e7f99d7a26817ca3547cd83b0a1b6eac856427a6b50e199856be54680aad2fb006da930394ed48a4a93006d1334fb4c610c8d97db504e75b7ced5dd490a42a4984c0e4e11e1a67660e0588c21bbd267c1ff1fe6c7a40bcb8629f7c5f5a2177c89075b325473b240cf180d33595c5110c823cff2c00903fa57c9b882b82f91fb809c5570ec904c04ffbc90a3abe1a096ffb9c5be239d4796fbe7093df2f8c071c041a138f711d0eeaf33fc95699a02b713b9272aa68429dbac2f8b79c5c67eaf8036049e5282cb92ebd48e1e37c721419a7f699ae2d5e68c273238b661d6ca8b33482f14c06a86ec0d350c32cfc99a757dccff66fab4e6bd5a2fbabf424eccacc09d3f4391a6f2be748ecedf4b3c1b746c9498618cf0016f28354fb77b4ed672ec3978f04cc632e5d2b460418b913334d55129a0f21ebbd572940fe7443b3a626fc70b3a6ed3db2b8efaf2f75c49ec1cbaa40ad2171979edbc0ab9099a896d20bdc8983bda8134b8bb6470ce4ed2b7099cb242570ce4a0411d02c4f5b44407eb06ff187bcb2b42bf1741e5be192da93b2322f67c68ccc6495044fc1fef754d9974330f143204fffa114e0db3537b57f50d86939d73e0eca41410f608d7ad1475c88a6d2321f5d45424bb115e74ab620418db186d7e996c1815cfcae5c32350b5b38eb704084b673a703d1f3eef930c6ab8d2183ca380106e64cbae0b8d5567b7cb198b1a9d66a8a9dd0b456870e73e8fab34f91c7fa6528536f55542e6a9d2f487d73bd1b5121697dd337121dc78abbd8f4dfe5ced8c0abce4e055e08d41fce34962629c3c30feec801bc06e185129b49d615931a954c9a0c8bdb954cc535f031dc5db36548bb10519ffeaf422cc0ac280d73a14733fd1738df2b39083d63cea4df084778f0d3f7db736e9e2511cf4aaa443e70af36b03b11d732118b660afb95ca921f72336c12845958c210a002a23fb4775ed9e58bef950a05a0fedde471dc14a6f7af9a419e61336fbedc219c97f5aa1b4fa2aad87f2ffa87fdf8dcf0c0b4943ff0bc3cce1991b4be391d9a53976274886dca0f4ac75f22873ac382e7f2d3b0c2c5d09b282f4442e888d84e2c26265321ac5e7cb65305b19674b34574fb0ab6b08fdef5c153f1b40c400665882ef233234d48e8b1c0624cd27fbca3c02dcd6436eca9c0da4e078a5e5ff96f1eb02db275b2ddfe8f7331c0f5310f5c23c19106278f67c65092e0bd9428c485e387515a8af7f398ebf983dee709eef7a2fb4ab2f3af6f1cd085f2d2305d429066fb2acd4279738050edc848798e7094ae2cadf229f9b1b145f1333e0345bb11a81db23c9677dba6b898a8e140f5e2d95140d78085ddaeb3fc05548c53d2c743a0401e20ca2dda37968d18a162e3130b8479389394fc401c205387d4848e9a531fe1639fc81d5df3be39e97e072e11a53fe9a82ab0e33010000000000000000000000009fbc8324e1d13ce3da368d67d144e4be3ca7044f17dce6ac5849abc5ec6d3f72b5198fd9ea2e8ac762fc17da5c69a3e47a057e435bae3fc61eb152a9217d0318b596ad18c19bb04d546febe04c752f5ac27a5a4ea4b5dcb5186139a9a2b0c2b6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c5b1da4e1cd75f8c4b0397da03d2f2f4d124ce5662bda8583b70c4fddc5cbb5fe8953bbaa97f1fdc5c6fa4143aeefdf1a7dcd670919708d21647cbc96352c017de8486a3252f8b51ca5a05d91fd77526cb72a712280f4cef50d45634b8d5970b5d5ab8ddd301c453eb5eafcb5062c53415f0fc148a02a72a2c405f872edc2ff03085431f8f0469fa70742c9e1eab9c2cc23076733db54a0bf5b5783a1468ebf1002196795fd7fb608b2bb771fb96eac426cdca4fe8b21064c81e2b2dc460a3c870a0b081faf8d285688e56a8a5b1957b960703c82d1c1a99b27317037e9b953871e3dab8ce1eab18f556dfdb4667a3cebcdae9e0a7f0569145124dc68b908ccac584d02031db8dd2056fdc4653672bc5797738379e2c9d1c8a52685a47b65be0b744548032093ffa4ca5ad8b4c8bf4d2a230d3abf6b76f74c8524428bddae793454ca564c032a5ea90e5c8cd240d2785c07079d2fe670eb25e1312b5742b9fe8b95eae718ab022fba787685c65b29e9ec691408d15a6c93777211b4cc75a45e2bafc3a40f11700306dc3385ab6cf2751709970f8c6f183b1c4f8e5eb61060e30d478a3c30a4589e832e24d33087f4854f609a27e6ec6504d65b6cec868279d31a66e60e304985e93b3539d5cf8e0585fc93ca4ddcffd487a4f75f5faf9c372ffcf4e85249bbcd7b17882e88b66fd61d4f6a67d6d58b5f02e569e1b996e83f7b54dacd84a1ccadfe6a8f9ff8611dee8de8a146460d621dad8f72376e707eafbf2629a6dd971b9a37c3453dc2bf13cb1177498de8c3a4d923809d6953d404c827ac08247b17804a45e57748993439d44335a2149d8e554140fdcafff72f9033fd7f7b582719855f60dd26b7c07e5a5f4158ea9bca231fa38b29772a16683237ba361173fec25d0696646fec448fc5e4987efba9c0d620c3d9f1d593eb0906e87b3d08aeaa3bf938c7d5f4572d4e6d37f4ddae2448f258560bee7b71a58d1d9ac82ad8abfdf6ffd2e12b955520d6ca7bfb8ee61e1a7583c54a77695601bb8acd2ba1f213299c23316cc2815b8991eb3c27252e632f31bc0f13e7fd3ee202a492a664293ac2b16d61d1e4b432086b7751443afb3a86a4c3002e5ae49a07826f0cebd79dd882cf8dd78cac56ea9707b4a3e67d9db99256b298fd18920bfb6245b724f35f6fc6c9bc41c920f625922c6e20aeeeae52cd11e633c92ab66df6d855806e61fa9f3485e9c38164df66a1ee1d0b11fa5faaaec949067a9539025a1191589671901f63ca353c6d9df3f33eaa93bcace1e850ee755aa544fcee7dc9da46c63da0b426ad64664a722e5bf24f2ad502fd6691e034163edfd9674408ae3f805bba43546d20f215097bfeb76b9611da064e117dbef1d8830c3bef242364d8ede574f564471f6277f6676c289a4c06c22e4e7076e11a02effc7c42798fc0e57796cbfbd73081fe9636f5c199dcc7fd6611f1f75466d25e00aa13b2023b8dbbcfcfa511d3e0cd12b12f38326c048d611211c67068f1160c8b6ab1963752c0492b48932cadf29deadb83a9e3c9a65fcf585a33048108767b4eb74cf80c08b4265edc7761378a4741ecb34bfd0c9ec197967ee67471143fc4837ce3196db129d61d64ea03638b0c3cf38873f6dcf61737699f75518819865c91479e84220ae607039e1218bb4dc62ff8af4db9ac59bb8d49d5e9d0b98e1b8deeaccd9e0d998dc727ba1d024155154fa1c6b24fd348537e1a6391af8c249b0f6e0d20d6fbe6e6a6279fd7f01e517f26e259ab0b9fb828bf55727734047c5ba1f1a0949456ddac80e504fe0d36970b884c8bee2fd853dd7cc0937687ef9d4d83d2cdce17bf009c38afc4228ef3f71a52c0b4835329a569d0841d88f8a7ac632bd7ab50ee03005a7836c834dd33e3c4fd95d367177500cf664cacbaaa936cc84e38081e71490935819dac3fb24cdb54d37960eb43ee3e0ea7c2b13060d7b0347a8cd83b7380c88a468d7fa02c0299b2beee7fdb902c9fcaa4063c3dbcd5a65003cd30edf805470c5cf7aba357066cd6768599f48394d09f7505ff66ca73357f30b28f13f8d791365ad077716fc77b1389984172eaf9c65079197ebb76845c94f04e6f7110529d5a1beecbb6cbe4a6384d379590af2bcc58679cad63b2e5a1b61456d30d6b9620c60f541b7a81a61396a6560f93d8b2ef41ffb603217d3b26cf6a26ca5fcc37b30ac9171cd36b2b0c9b27e5ab391db608556fbe3573700b23cc23caae568abd1a0dedf3e4689a9b68e333d1564a6cbb3a9590d7aa1a8880e0cb5324a3db6ca00000000000000000d59d57040000000057baa6caaedd3285ebf9ad9590c6d4bfb5afa661657e328ef2d9d5566bf2a6c0ad51f844898e89a1248a403784df11d81c2780fe753fb4850fcc3713cefc009c6783244e63cf5ba7f9b0d947bfdaf829bde457244e095b6fcf00d4c5430a075e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015787ef3616f5386373587e50bc297669f6cd74583fb2e688025644fbe1d367f45406bb96b0b046bf1d1b31272e1ec8c71434c50560ce32b0e9c14e09613cca9ae679fd6222bb2d84a717c4f37d1e5fd13d163338e2ae43f04ba3fab8bd5bd0c823cf454c0f86da1e930081f44ba477a7e98596bfd2012ef029b6e5eb3444c46031f745754126f352a0a349d086cc656eb56888a50757ee0031d939d90b34ceeca031486ff809f452a07feda9506ddf312069b74fd62dd043b6e72d04adcac0a4edd0a021259c6c6c4e3b4a02fabf437fa3b4359d9bdddc21ae6c12b1dcf8b148ed85d0542805da6b85237e89d21e25b990701cc7a740752fe8fac427ccb80e0d09b4d021b9dfb43a216621cc3e348f4ab68a075986e959d64f955a94111bed393907b4f0329f0bdafe04ecc15735977fc94b156561acdba53a6bc56ef15bd37fc30c21f870209aa8253020893d7ea7058f50873fe93839d973e8946a2043f63a220234abefe021e60b197034c3248c1b5ed5f756bad4cc727f167698d2608f0d0b8669d12211c020df4645120ea59aad84a312496effd36673d77ca57144587782c80338b47471a73943cfe24663080aefb1233ec741bd51a97988c4ed32c5c12a9cfc0312eaea09f35e18fabf443017ce1dc488c58a8c150b619ebdf24989e3494436e238e478dcd88220eced89a650e6b909b6e4ec5f22d3a1999bd5c33691d8e22813f4b4c8ddcb8a358f67c49b0fee76909d3d5a0c64b8e880454db585bcb89327e5807f579ea8c16198835a0eced1ea1fe49f274b6c456d6a3c95d1e6670f44849258fdf31a22b95eac7e6d3d0496c79f0c0166c775589ab6e6df1ab1e09cfc07163c90fe03d96b01410b558d6a4454d2800b676ef764b507db4cc7d0dd85c3e2f2d225bc6997fb69215ecedd6e6d698240c83e3265df390f225d2d28d0b6da3bd24cc696b6e0ad854814165a1b13bf7557981515204008edac544e138b254100e41ecc6c654bb79c3579c5438153fec321c5db1b0055cd1699e2506c12a234727f82190cfe0b15d0e3218808a5fa413c50b21699feeef6ec37c6da092408c1aeab40563a31db3f7d12012d57e4e9facd03de613042964cf7e8f2068de23a120b6d47f9d8e54c566eb97416c716e37926662073fd7978b8a7a2207e37975390b8fa39e7724ae7742a48058c79015fa8e39ce51ef1bdcd1094ca7f9b990918c971836c8192b14c4bebec4517027412251d3164146f1edbaf4d3ef0e608a6625dc5615e34695b9047c7a18269bffe100d915e5a4c9a10ee2a4228ef60f5cb38ca0e3012813db358f0557eb302590ac40fa5484143624ffbc112835e33820f8941f8a03912810c3ce129a5bcdfeae56db184650e2bfaee7ea4c2baf7545a10526eb7241be69d24f7a33ad1081c1e686db9d5d98b72fcf90c785f678240262e8b20e6d4a9545ca82eb174ac8ce9bbf485790f89d0ad6bb4f8372fbd679fa5288f7b59609f1f8a5169c7f71f32207de583ee9b7f7f25739b6f321ac8897ec9c521ac10311e9c0fffa2e3ac706e771113a6e58e01bc3667a17e5e90b91433772ad6c1693d77cdb78dad4950a039e7566e31e067f59aa07626f58c419cd056b62dd14567c118044afecf5cdd88f10502ace2c5f29ccea591e344d6779031148571bd3ceb6ba609683315b24a1d7d106d5e7efd99b0f09949762b1f5fdf3a1ca478936006c0910383361382d43a6c73a2a737d149eb5ec8bad7d6422f37cbb744896fd43531adfd63aed6dc2347a6bf313a5c5fca49e5b9b605e51268569b24c33a1c5f69007cd39d01625e76a57c35a508172feca73762e955b14340968eed5405dcbf891cf4852bb715d7a91cbbe5bfecb734ba4dcf12b90a6528f0777e3852a21d692bb9b6d0de63a96822e98fabf9b0c13ccd9ccdcd450f7f8f37841d1976076e33dccb3ed5f1701265663f33715089baee502bf68da9fc63fa2a4633977a168ab9dd8afe5c3a3a4902ad854677e0e07b517a6ec609306cfce3a2dbc1f20a011be444c4d944b90dfc00c771e163c31e2cd4fa4480860690bdf039c1d43d72d32ac63aad1ada46e8b2ffb7d8b9657c89236aed28197ab12b4cd5e2f4c97af477d2f88a0839486b8ba971a936d89cdba15c9bd97f14011778b26b5bf3d912068988ca9406d1ec7dd1a9e4b3e477e547996309a757bcb957e1f7614c90f2f7bf95781fa0c72f8c3e7733f81a5cf70d56bafc0f36e47412e97d4110d062dc053f87f245410670d1e3819371ba62dfadebfb47808b54f9d1b079e8f60f53d95ba5771de78698261067659874a95f7f6959acfc8d6b0fdec4e8f7e070a03f02cb1e4aec5246c422d2a88220fcd01a5511bdc9ef560c6a7a51269993b3c38d94881b77eacfcb5f7b5fd5d398e51c8788eb9b5d59fc081c2dd77fc8c0b", "5352", 0, 1452504786, "cda609be1c2aac05c088e919c7b283586434f5a71148d663fcc1fd2e5cd6679c"], + ["030000807082c40304eeb432442c679b4ab0f56d68ff395e112220e4c243af440dbe7ce325625bf2a101000000026563ffffffffdaafe527cf53a9b086a8e62a39c8903baab581fe402533047abc05713fb39f810200000003636a651be36dbb8e4bf38049d0fe2aec866e3b38437b35867bff7926bd85bfc2a280071b20cc3902000000066551536aac53dc503881d048e64852a84576a2734f8fbf451471aede738afe938ba760026350cccdfab902000000096a650051516aac6a0060561c4201a52fb9050000000006536a53656500000000000000000001000000000000000074a6d40400000000d05c40ef631f13e16fdb6627d5357faec535a90b4271ba689b37d6663dbc3891c9879a9aeab62c8ffa8cc8a1a216942dafde634f0393c117efbe09ff2b8590eeae18e174af6713077140df0cb759933345bd5a6f2b6bd6fb0a2771d831a33f0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aa26f4ed98ba659671250c476293340f823c2a5f17381c77c719ad17de3120ae1a0414349a298e68958945a11817a5dabceea799b2dfb991ed2f6e8fd4a4f8e6c996794ed6594faba087590ec6390c00ba38a253f01cb6f3cf71341fcd8bbf2c493c9a9f864facc30410981fcb21780157aa7f45f7e5ceed296fd52067dc0a4b0303d8865167237c2d6525de3dc1595af35a34364267594cb426feda050bde39f50325e3a5ae52406eb78ffb204914cee7a05554706493a653bb03243dc3905703590b032e303a818c92466109db4570e98f10a92653b0f74f58c013baa3404dcb1f9ac04203b03ef78db7a13334049cf308e4316594ed93a7abbfa360387b2057296b031837d46e925485b40756fcf03b16d9d6a34734d5b2c4b023b2f6485f9188b275021bd8e180e72801cfe6b64a636098a3ba1913efba0d0384d63ec3bbee89f6e5cd032c5086e123f77f5d687da423a84bd2fff2254ac872f6a895c9f2c2d6b51f1c9b022c6ee428f6fbc585eb1ee316c606afd0e2b4bc68eb1d24b4d4b75299b4eccdc6020800c82c51edaa6088c4dad818af1d0a704284ebc8dbbe5edadf30d3016d23995a1e8a94c9f9b97dcb43c3873154dc2ead3ed19825f14c4548719c0a34728323893c2803d871628190f38f360f0fe465414bca8ecc57e15f3748d38de482618420e5b47e8412eac90e7a507665475f632d07d41b5bf8d9ad44799c1de66a0bb658e87b1ac5c12be6881b26f40c7cc5312a181ea1d3722317d956f9a110edbe36f70324283eb7308a81a66efc17b1cfd207158d44e48cb733cee4fef8dec967e6d472614a3888dd94dbe1373f683e28e17d3f90bd211919df0be23af107c9429103703d42bb6e423301bfe54ed75edf7f57b9b760469020dcdf7f54f70ec37a0cf991e3b18d05b6cd4c91e6998bc2424e743adae9cde0e16723b3e0857f1ebfc46a18a01f632fc59a8de7e405a1d4b1a8ee8e9922431bd4cd82955407f3c7dcfdae34007402839caa0ed41252ac3960cc188e1ed7e53281162fab44bfbb23733b6b8b22ad077d11251b939540cb083131b8ccc2ea94dea6caa5795e337236338bf0cb68439f55b688ea697ed8a9893de065b6550867c1cc8ae0cc361396a31d1017092924089d5a8ab787f2b8a29383367e6aae543cd3b198bdff43ccc7c196702672f74a9c7bf9fc1fd0de02100dcbb7ed2773dae8333b79a9480510ca709dd6e1333267417fa0cc75179016fbba44acb0419ad22fd3595b25b5df709f5325848b781c7809363dfe6a93557599c228776ec5c1ad0d64bbaf3ea00a716c64152e74476cfacb0ea55ef0959d3a44842a5d765747aab1061cfef91dcbe99baf1d9abf0782252cf08614e2b7b412dfe81eaa268a92d37b955fe797031edfd77b5e4ddb3d8487466d9242241df92d45004e01175bc0d176b15392538cb94f1b7e1583269d9ca9528160b88fe4932bfb32803f09e7a0f2c1aff2f8bd8f7357dc7905f6a16096182a76867f9eb510f3e45e6d0e655af1bf5be4ef9a867ad54eff178486503faa10835d01993a56ec67ebb731fb33603f414cf40c9f0cf657016c652828e42febcdee6f598f800b7ee4536db1eefe274a4609107b166a164c0f01c8d41c0e9ffe38d978ddaf82aead9b9793fa14629dc9a0e241bc85e16c9eebd6bfc71a3ad6a1d7d0905058c6791f1ae48fa80273ef03a15fabc509cd12439f143edfcbb65a9367230b35293dff5cc244321c7fc730ecc5bd953e90be85337a2dbc7f2ac99c9c6fb40521cc932a81afd3089a5e2243a24872a05dd1276cfa70f50792b174217e7974927a7d103d767b3e50e1351abac438a651788117908b95f8fe5e6e4b7f569061c7a752ccc2303440e82c6621cdd13fa48aa8b810c98cca8b58d66c4de2377243f0871885672e13f5c876eb1b95477feb41f765cde2517a030107d6da6331f7566fe879ef7d884ee3a62b9f03aaec67c3dd7803ad55ff9e1c5c0a38571ee278e856361d419a09ab65c9e6186cace6bbb1b784bfa38ace83aa508b38d0e4883ce3a1bc488c4220733cc19aa33c838b00c517efd551603dbd1aa84fbd9b9e9ca144f2b9b697a8ceaff7bd2fd379e4d830601931324efcc9f49d9f8b012b32b3bcd75bfbd869aed5ef311e33216ad6a9c123efcbfd018340f1285e9b3574b4f1833ea85cbe60d77ed7e52938fa64aa90dcc7500437deb86dc90f9ae6cf4d163451d068c9fc3d4ed2b3a22335ed81db487e47b984f5493c82347ca04f53f646c4dcec4431f92ca1418f9e26f9d045e8b716959f9aa18181e8be49745e395352b3d3a1522dbe3375f8a059b0c5fe499f9561f70036bd432b9732aa1ec14608f9c8268f9654dcd82555ba4f3f13636b0208d85b422006065277e1f20ea2cb7e9e580b6e649594b1551551e75e39d2ad0d", "51536351", 3, -14748556, "1d4165771b254bc654047f003c45e24ec7759f6b5f639aa98591e6ad94878ad2"], + ["7af6c13a04b962a90c67adbbc827e1c852ab8499c774b7f413ebc23f2eb4c74de96904b7720100000003ac65517459cf06925338c6e85f82348ae2e3108a3b501af375a2a7d7aa2cbc60c7bf1750209f4c0300000004ac5353511e9a74974f02b211252dd4a5e470cf056951122c74d8fbcbfa907f28e007883a5e5e2d780000000004656353ac202972c1de57e6d20ca381d6c353dc724867cf298f187754a9088c545d24c6f757b3873d0100000001538f23f77f046338a8040000000004006300ace87195030000000003ac5363c9190f04000000000965ac6a63516a525300da1f610500000000036aac6a000000000200000000000000000dbac40500000000b5fd3cce7d5f974e0102aee4d8814111f8e595690cf3413ae21e07f84c51c09af73974ca901b846cd469dce68fa69e97de148e9a0b8a1f98fa8bc985264688b69169657b93bb14f08d6fc077fe1420db1469aac89a146303ac352d1a43b259f400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bf8a0376e5d515175353626591c931e32c3e906298474fcc632581b28c5d822d22a25ed591207bd8bf146d76b8bb7429cff19e1ba05f233f6ceca5a530aaa1ca20959a06d0d68241d1c8a3bd9abf0df3b760e633eb7d48701b36a0c8be8333e4c93b28ad3e869f85d1915c97074875b5ccd5016eef4dc4ea7d9cded102724d9d0218b8fc203cf867c3d10eefbe117da9a5292b733d8ba264ba2ac8df2135e3ff5d022bdb7824cc00c25ecdc37e905dff79e12b761d72d97431af2ed09371d3a95b710a01bded2de984669199702aabbf5ec45c4b900ac2bde9b21e9f1ab3cefee35871367082ed9998609e73a21ce7001da79f86649f1c766f8d5da802621936064c14021c9e0e50c0ebb8d996a773daa63b0b63e50cd79e16998d3799a41fcf4fa3089f020cbdc1a52ff542b9c6a26e82dbd42d8a1bdea13153684a60e70571bf7b2b6156032d4bb7a5044afe56df21e24be640af96769672606a7ad8e9c792d6a18bc92cd7022e03583da4d5e028ba3c803a8771f967e8a52da88b24cb2a167f01d7c2a27e7b03266e67167d74a6e877ec5f3c1dd0d5194d4a2e0efea57db9f36833943b1e02b89953fc273c7213295058c0361db9062261bf17cf38ddd503f19b223220c69a33956f472067586a02a53ae6a9cb655589a863489fdc46a0d91c3e4c2c8dcac2ef3830c4da2cd9e1de0437f92c55c54f6341e330c4c484cd1b59ac008a5707bd3dc5898deb685544e1c7b5b63ac190f0c6e8165a48d9c69def711792832f44d23172bcf3707d9b301d70f8492748fa7cf1ef6dc638fed9d0c4f0734d87b4d343ba4b6647c6fbed2a2ababf47bfcac91cb0985b42fae0cca5cf75d4ab11f44f53580103e6d6ffb9891bbaa8050636e318c5f71e422e634385d44cd57bfc873baa07ad66dfcae1dc62582736f30c48c47a1206a1725200524d6554d6666c465ec7a98745cfc3cded68dd34109d29813c8c63a113aebef95622cb07e663fc178f9b1ffbfca1a6b3fd5626033c26ff7c50bfcbcb09f1afa77cce2763d3f175816dc4c582f09d60f7c7077ee1c00f37f99efe0664eddbb54473250d306100d9ca5ff7fe602ac441054c82c1c0c737165ed60fc771b47a8f50a08a12bef6ea57d71207e3b9389546bcd1178889b40d21d9618a8f35794cb2d885f9a6824d1bc46caadff8178e52055dcd4cdd28dbf9d30131f2e1d96f7cb2803794aede6a016595cc127da3718ab0d08557f569541792ee8702edf74e058d99fa427daf6697d1c41da89efe611a06b15db55fa2e856d5b4ce518c6f531f572747e64a72068f5f331c3aefa1fd52cb9713a554db9fedf8a396ebd395180e6c1fc17d1ec9aacf94ff0e7afa6a227e378611e0f974862afebd98b570e5bc7918993116a5d9bcaf298f45ad514a417cd14dd07745129e2d9a27f5b19de45ef9fc13c5542a32ef8d5c65bc00537488cffc754264e016f0d93ed55046ad7e1e496642f396453df1fe5d9580fb899a44248b44670e270fbb94f091016df4bf1c6446cb9f516b2972f88b5b565dada656d802491fa0a6f1064c99e26b9caa49eb79708d8f92d8d54952f2bdc50c1dcf2852dec01c130304cc68562aed9761d53797de47c48a5249f084fb4ec263dbb4b5d6b91c8902f100087acf544e8c4f3f05e6c8967164f9078c607d7e1dda615cb4d467c84f599193682261a50165f5da2797116e8326fa5d817b61b01efb702ddf6835efdc3ef9e98ec995928aef64ac8359796386e6ee7e192fdadedfc598ad0c34680b6b7ac9dce66318afe39b225ed30ea385100ad07f5701d68d6755231443e61009f619339b775b332b109ccf86352e5e3014358e2e67b91ad680407677b8a38de16fbbc8e6aca21b46eb48d1ad97131fe2467c59dc810bc3dbf398944e7a10753552cccabdb5e38cb7d99b5d177974ade815258de2c0b20a6451870f3365776929ca7b5c8e7394c2fb279af4a5ca984e81eab7281575504cdfe13a6be35accbdbf64480fd58f5e452c48ee21b573ee08f77c32b25433c517a30ece0f06e17b650d0073117989766cfff494e7369e04b60b779fa121539d7a210123b684ae09b22674ed69522af67fcb6d72de7a7967be00fffe01470c24526740fec151f121fea1fc675f0dc8f0ad4dfab3babededad7fb88a2977e7b2d2a7c47b55ab6ca9beec65afeb8d5f5e0fcac14647eeba8608079961a546b619ac8ad19b2ff762aacd710ae3e6a8bbd4599e2a96e94a2786fc0eb753865464a04ddc9dc824e776ecd6687485094294ff82cfa4bd23541b8680292030000000000000000000000007725d874a54580c68bb7b742802efa1e168d6d2a8a3a51955cf255065211e264c7c6503f33c2eaa37cf93f7dcdc4511ffce1876a2652c27fddc7ee52de7a3fcc269efb21a1ac5810ac8aff80deed1d957d89025b84d3de424bed952f20997d82000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006adaca5c6f27af2d5411bf9ec5a7ab28c2987c9039b6ddb5f82dcc0850392d35cb81ceadc4cec7eb9f887449cb5ef56a65e888768e3729cbbaa8c534fd0041e24c6ff0305aa74c38a0e4989e834617c1aed9c282ee2b70db636ce557bab4227205131dc2ee35a8dc52f45ef0372136286d6b93f09ba72d508e432314f1b0f13e0202da989d27ddd64fa45614e3c03e4a9f0923e63bba83b7d4c4323ce996ee07f703131497264997b65cbead2b37f7180a8d951c06de5ad2d4602bc8b4b5320cfe7a0a016ab26dba52b404f6cda272de9a6bae118e502c916b47a4c3e4e91847fe5f6d42c80ac7bd43f37d80eb6c928473a6cde2d4bb9b9514bb9f461a7e1a680ff9b70219594f12501a26e460833ae73bb3913a54bd61f96335eaeb457ee6cbceb26fbf0312c743548e0c9d33949a7309d36de419d32da57a8f44e7323487b32418737e3d020d05bf8063d21820f5f1b961359e2398bf834084d8d7d937daf79f49841957d3022a7a22e5daf38da53a95dcf746b55d4e33ee1f8ecf14ebc1eb2fca18f285747f030a85521953bb1e3baf5397d154baf7409b3d84615e95435f33b4c8f6821a22863fc8228b7b24aff22e0a28132779a6598b7c7fcc78328e398983b311bb04971d1a9d73b616e56a55f5814cdbb4ad4975834f45f50b0b8a32e9f34121491f09c0f1ad8de7e7a5f08d0167b90d03f5bbe3cfb952ca3f290d7dddc6804290ea21bf45ed209fbc223ddb02f2f6e62ae6279846b4b2597cc1ba8f7db68a01081c54954e95c376a1f52b42dca6b7d98a01442744c499315337508cac5c6573cd239b0a8b11ad50d4a774da74a7262113e17329b48e9be71208b23b764c1e6ad752f6bb3116a478c82ddb4b1b8a570c5af40e0268e8dc51e1521762f6f81af00fad10418b592a2a028f9dd6e793af4b2450fab26166e6989f1f8a7bf0e8cd80dc4bdda26f6ffcb4d74ef7bbe80ec37e84fccc8c0061f24520b06cef0f04e9643762e9a343dbe5f4cf9649a75a875ada0acc39f007ec51d0986ab6adde235904fcd748fa5ee427c4b876da6f16a6023ed746e2056f40b2b627dee0c2c2593f5411fd1d6aeb90df6ab4fad8f2c3ba9d910f7972d42778c51531e9ac67628b9c0b1c07736eef5f43e930613d18aaa1328950f86ddb717a8e8bb8326dfe8508282eb0a93ee0fbeadb200df159adc7229c771136bf6e8fdcab16824e2926566045027962f557d80972364f7b20dadcea0d3b4b0cf710e1717baac78d4b77d5819bab8c5bff61e536ec24e8b98a29ee2c5cd2ef9ab80cf3af360afc54628b5bb7044f9531a413f1455089be1a1297d6a21931f637c74a0b517185d6b7b3bd7568a8e6391d5ae5c214f6da785978a1cd5207f47eabe183f0f3e2fccf46c1f48b2e1d957196d7c674e5c60c123722a2d23016e8669105c257b923f234751401f4cf6eca94b3e75abc9d6f13a29172733269ba6c113aecc6f772cc1179c19e0dd04e642567a7cabe6185acd1239053a2b6c504baef118479d3b7fdc96c81f9d3dead58b505db3600182b55ba90f6895cbdc3a7f5fa189d971d27a956a43d2dd12831bbc6fc098cc374d077ba55c277148298689140221e0b2ecbc7d2152c6b44e9af2375d0e39a575ca1de75bccec7a73ce849c32d4aaaedce46e04344c12b1401d66d2b4289184053f4de4d198b0955328faa2dc1d66feb48aa900318f4364d7ceca6f5fc46a5e55432c937d4990c144334a5400e77e4985159af04fb9cdbb15487b6e3adadf457e36859fb1e539689812d689393958ae9fcc17a2e1dfb852b07462ecf5474480e011e5f5afb3f1b536fb3ea4024523fb4ea375fbdf48d2eb8ed465cf115f479efdffe20111ada9f2afa468d5a5317c007205ba383bb2c5b5433bf2c94c4ec998d31ac955a444f5f6becda805fb9dc200bb79565bd6409379764e6eaa91f27dee415076cee10498ce1a9a77a6447c3034e1211df24683242bdc053a114e70c4e1828178f191b548a0704214da158ca31f4add13e0523f7f9be5a9c2f1521275e6770a64d36e154a341212171e8d6def95cf2f2d8cf44fab42cad66a61fb518f6f8eebfa8dceb8d6cd4dce88ade1ab12fed637b100edc9e5cb0720f2256cfe93e172d8375f55ee96165508f12750e4a6b0577890c112b984030c1a148dfc772e5e3e0c9dea0502c2443feb6f84d1fbce7aaf943f63e727bc45ae926fc36a5a4b5c335d0274e7c8024d362c2b837e601d1799da95cb1eeb3e2271a979362c546e56e7143aa02bf5568b976e78b56c2ec159ac24a43960de5b6e7bb9e82e85d49c95d7ed1c202eaedc4e52b93ce3b2a399be9c97762cbad207224aac5dc361f3f7d58d6030fedffb901387f23598d8876f390ed6cda4da48e475b18182d44f2aa426fe5e348bb643433d990487901d6e68986dd0c", "5263ac536553", 1, -73179230, "998fdf680fa7daf9e8b038b9409858771c2dfb92162c58c82e624b00f8ac81b7"], + ["030000807082c40301c1e7f574fcbfd87608e3a9a3da1efcf434899286d417b2178c3aea3c60834ea3010000000851ac00536a526353ffffffff023194350400000000056353535165d9a7240200000000050052536551e5dd3c020000000000", "5251", 0, -809257030, "81d1ff9b165022ab59331833b8b7ee521b648634deea45c8a4d3d521c2b707c1"], + ["030000807082c403022d40065a0e13584c6ba56628b7beef94aaf42ecd5305eb7736960fc977a8ada30300000005516a6a5365ffffffffcc5b44316bb1a9436dad0799dd05eb81a602c64b70e58e4d0c63fc4cf4a46192030000000563acac535382150709037bb022020000000007ac630051525152d8ad2c000000000007006351ac65655230c360010000000000094c770267de7422015464d30000000000000000000000000000733b68decf6b573bee9238b991b10078e549c82986a57349b48255d76a43754ace314f33fefee42c7abc39efc87f2f81f5c3aeed71f9741acbe1bd05c9c12b5d263683d44475446789ea8987023fb2adbc3e5d16cbec3a0474bc6a5f5ff30700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000defba1c553b1b15fd6bf41db399ae0acbfcd14820d21aba721f733ec941cdc48f3c129bf694113d07f029e83a3f1346d837cf6d0c591fcbcc5d70f08f45c02f2688f272a3dbc13b8f4bdf8c906f8d59efc94731daa70725c2ce5f1876be627de0cc8282b64362fc0892b9a774f90b5b6bd08b050fd5e0c71d1d60495896553d6020152a499fd0dcd22b5ab035e17c5cf94951db005791fd28e529e984677b7a188030aa5320afa84aa8af112ada7db33a23d8f5780f9c6e7108a97ccaa16203833810a040d298c3809c807cb8daec5d43e8380c6f936978f2039707c3e67c2530f2e54f6a0afe8fadb08636e5849ed6d2ecf91eff020ab1c2637214a69d4d70e01b388021ca2efc00c8a148c3d078e31548f63151003be33a391450ca6773c54aece5b080228def0c7293cbdda6ac1a91f3c8f8d01e6c5e603b7c454d435f94404c145b0a20302a6867bf3d07dcddd99e2eccf59c92014fa5175753b41a9ea5ee74f5653522b022297b65f8223b1f064b725d32816c86cadbced2eb20df10475e12e9de8c764060226e59530c002072f7b2835bac3c82112a7327139647dbf1e8c86987ed2a42024b4a92bbc8d72a44e7015c3cc8ccd6bd2f885b859c429d117469a3fea0d1f342d39e199a7c2bcf6953eafdd2506ebee92d4af1dc0e3c3b77eecc4f3c74afee5568feee1f4c8d66780bf446effa8ea9da591ff9c757cd5faca2efd86d912a50bb136e107e576384cb284d5a40d30b390314454017fed44ac3ebe496912c356c81e1cbc340c706a950446613ae6ddc64c4351eb58a50efc336ca22e01ec9df39b820e409d714409167cda0d83740c5df1fd359bfbc759fb097f733484f6f34f968b2a2be9d02d08160c8dad74c6e09ded40679cc15d74ed3ad2e82218bee4926755d10c0d8f147fe364c08be2532078b7ecf850377d4451306f5b65c6342f82fe17161b8d751bca440f26e4d05d4caee4bd13c10ac00af2f01d1b32d844118069d77df773e16a39eae611d5206f379918f023a7c6401ffc90abf4d76396abdfb10cc79d2052d6fd01c52e9f8f5a95a617b8bec4e1d4dd212035da2a00f0e0d7e55b29e5e8c9bc65516028f91c1e4957b5b7adc6e8e77c8f0dba6af2ec410f95645d5e4c0368306db33ccd441a705b304093a5a25b9956261a4d292d67f6ce9ec3d477639c327c38b39bd9bd7126d2a936321b3df3905b5f657a64f18cc51cea5dd8e2bd663ae67758bc1bbf67c0b59aeb5a504c017881cd3a0b430e56684a281cce43fdb6e2937bc7abffcce7d40b24e1c510c736b31a7b006860162a3df545befdfe5934f88c0598ac7ebdf9241d9b827c7e7d8a97e12828bd6baabeed8a3eda74890f70bc5eca91e93d561820e9b4263afd04f960831fdbe6a057751ea1b1c41686168e872867ad58cf00acd4a62e15f4117930bcf9adabbe6961bb48c532666b883d2cadbb896f5db446a538286265f7d3aee12bcb5308c87af6b3bc0742748f6107f40aee1640d3ace4bb03c01b39650d34e61320ff0d88cc3aa71213e79033d60c1df72e5687c02c5380d87b3f549f82fc85c3eb4b4bc8999df139b901a809953d16f1797b3d4af0166e21bc2b93de0a809eafcfe3dc825112caa5121e8e868d71913212ca1998708e07ab54471725f485c6456279e4dd07e260e23e4f34679f035cfaf87b597c118be5196fad2607646191e09e08ab7ecda920f2b7a8a2ff85cd7c95984585ed444b0e60eae9f530e200b3f6188f9652ad3503a2712c2fb6597b975a325d993bb77624d4aa5e530c64d9452963e953de4d9db5430a1ffd708700d6e1c204d351760889c0f84e730410700b4dc334a1591a0bcd4e5c4101a4e27246acebf3859e2374fc54150b9a044e9a8cffaf9557f4e604e87ab798546c558bee5aeb46d92fa3e6e5cf4036507c4efe972b9c3a6e6dc183c61a3c8bf9e16b88fd4eb3e622756f5371fd1e362f19690974b904d2030ff11a8511b5b86f5d28a33ad18461c5d73f2ccd8287b4278916e7a97f61a9f206adbcb504e9a1e4434a29fab4438eeee71051ab70747f8059e4d2906d25e37978cbfe35988bff12d26e44c9446e33a52c552742ce9b6a440ed37cbca674497d644f3874865e45f8a98ab7fe7c112616e1f577edd321813c260c268aa33c0dd83fff564491dfb6e5e02caf19bff2ae82bda95caea3c01e1a7f8e1745ba697a17d55755bdd0fcf77b400b86b60e946097fbc77a3a4edc49f09adf68a565cec4318e7c317179b57c4e3ebd19960d0b3de1194b21c28405928ae90844d236140d6661780a502d54e92d24a6ea6cae4e64fe46b5138742f4c5225316a4e651bc2260d682d5199092fdcc47b3f25b7de7e52810356e74995fd5564024f7301afe9c44b19c1ddadf766677623a7460dccbdb20e160d1140a6192763f3400", "005151ac", 0, 494386571, "e33107acf90709e792678f39213a1040997f66a46629bfe9b19033b66ffb9138"], + ["ef02272403d70ff232a36fd7be423e716efcdebf37edb72c6a4c87b71360a0cf11f273a9af01000000046352ac6a50d42dcbb741e7da1839d8a22041b8b933995507a53dd08407038bf3e1a6f50055718646020000000400536a53ffffffffac57d5d834d042dea251386f5c4e7ef7a82137167a9baca545b8a083f72657ee0100000002ac53b0fd12980290de2d04000000000500006a516305386d0500000000066a525100656a0000000000", "6500636aac", 0, 1949719647, "6614ac92d17018a0bb92616117eb3ca58fed28239d97004a9855fe66bb0302ad"], + ["030000807082c403024efa66f2847ffa3aea6bccf2db064d6da5ba44f091089354b3c79a1333990cf10200000008526a6a5300516a63ffffffff07027b6935ca9140eaa4e54c6b89ee9e72ad26dffa9efef6d3ecf01b33c9e36c020000000951520000516565000077fd68b40420e0d2030000000003535253a5d070050000000006656a526a5151565358050000000006525165006363563cba0000000000015300000000d3251eb10200000000000000007edb3f04000000007f66539b00a1077911339d239a6a368690459987c422fb9e5568fd363ba5ed0f46ed471f996deca10b1c1d820a882aff89463065491a982506f92ce8cbb04c9dd30f358c32f1cb6d90b582252b59cc089590daf9ff1e157613576f3036b316d4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005286284359b823b1f839ad304b69665ab0c55f29de29a2e7e106d4a9e9025b881d2ec800698b78a056f7ba2a10a9abbd204b6a1a794372cd85cd24959e56d6d30207c6c985faa32d144e3a0eab9d0e839e270b207b758004e8f3a8b73e512587c53b480b0d95a713a0aec0fee9f36d139fb4ef93882a53ccbb6c77f796fe57250208b98692af2b9461a19c78a527c0a9e49c0e4dc904bf8557b01b3470efb828620212439cf35cae375380bf5c18a1d792b5322adf0dae33dceb30c0d059155352860b0184b37bfd929ce309b2942f832e5153b6f1457659fc4134e7a24a9e1ea7b2508fd1a17d7b3c6f8d999660a55de432c18ed300c7e46c37253f72b9e66bded8f202117c31d2ba52361908953b2dfd44acb11ca51ce284ed07c773255d3ef0c2d129020f90b8f9bd9c6a50c7520e974c93942b5e4705b295bf95e51d6b5a9002480a7803109bc4d116c807b7625c3ccdfb9884da5d6ed242c75b99ef40bedf7bf1f29d9b0218160ec68df7563cb4361d72b30163b1145806c5b42654cbee8d75da456be5bd022f7cdd1810e2917e71e44c526a94f968dd34bf7598c79b6974e71c0e89c15eb00f9e90fcbcac59a1f037677b760566e1969a5b775efe31ca64f14afe3b10547acded410d01386a4e14f51a73cad185ba9b8bd7ac7f4b90729856e16cbae7eac7ee46434246a627932e9d232dd34826fad0f6867e8eb25bc48b875f273154719fc626b1347ada2aa4658cb3d3446e93937c73067300543c34af15a107ba4f247e0bfa94b52b5f1ecafb3afd102328ebecb68ad74ef58305b3fd8ed4fe2484019c9f851684bfafe81843dc4428b4f246a308d4e9f8c1adaa2b5d54f9c41e269f979bf1992afadbd2e51585257ce8d4b647a452816ce4e4fc19d449edab130c713a3eb4257847cb6961baa21690f69371d4c9ba83e82c2400b3d41bd58d6ee13decd6460e06b326394902442a845a47382d23478dfc6a6c39789295f04d6a44e7dd72b18bb10822587b415aa853e5dfc2055ac2a8b0770156bdf948e2a2d5af169feec048ce083c120fdfb5c314c475e0e8fce60f6618230dfe077af354febb14893ade7c3a217913b855af41792598fd1a157befd511c9133977007305d4d91118a65b26ae401aca6832c60c0620cb4fe72f350819a5d421cba2c845041a7cf02ddace39bec257b60e6e4ca55ec2d364da7cff96a554090faf1f6faa7947927eb6295e49606405c996cddb764fbc1ce73a73fcf59b4eb39f9003c6a5a882d66496ebc646da459e3355c36502bc0180ec891b34e55787bef12bd802bbc59104bc79517442893d872fd6c18ed8f0e31a7eb1c6719c9d2b5cd043f75b9931509ac6459ad103d87cc389652435dc3c6546ee1832d3ae2e78b6cc29d612bd285e5643fc898ab2b5497623f12fc9c5664a4560a1149c481edb22aa5da8c403c867e51e66b3049b2e5eb85c1b5980ea4b2f12cf306db170517dafcf1591251b513878bd69ae02289b4976669baab5711a99571f4f4d1edda82ffbe6d3969a7aaf7ffa887e32d29c06cdbd970d4f4c07ab9c7b6344911bfd8a998c936d09da50322a3c783a947439d0797ee715f530f5ef614a77a77ba5927ee18151ca196dfab2396cf00840141009159a4e0290eb6f11e2e5aa4d3aa8e6032e94c1707a9b82a4f7c1f6376a2f9cd92493414a98e53209ffb088922f41ac41cf3cbaabca3f19330df52ae4da03cdb1e6630073e99a1faec2a70cf38e9c2a86dae5f4869dc5e314899c7087fb4f4b19a44cc6b0aebec9761c6e37575f0e285bfea2e280f2319552aa975787fc0eaafbe1aa61714f6f3a9238ec8ca99f802335903d37fa678c4f7bfdddd7f5900045edb022116153d1c6ead04aff700426110608eddcfcf0f66ea06fc03e8cf3ffbdf44f0b2942af56d823ab1340756c7f86c0dfe53c9e20893c999c4727c1572e2b6c8c9b39e662c955bcfa88b8c7daa0e481e6630b68061a05a2362341444046a8725e5476891cd1fb46da4afc011a9451a3797032569e1161b60f84a847cfc3654978a99fef9987a7c4c47663725d06a2bb8132d3ce3b8c2a779b2fa40605835dd0a234903aff4d97f565e718a48485e80bb8737a269019755a5b1ccfdf5a21936b78e684be058a5656e9b7d98513e22865d232618ba44b788ba07e9e68d778c5f3839bec34a32404c7f13a50e1d4e446eba50a2aa4cd82b46c0cc4bfbd6c62358bb4a47b904899b7194728a824cc04b608d5a6482ba55e497e030fd8c316accb7de87691f4cce855307823162d5bbb0000000000000000b993e202000000003e6bdd765f97e2ddfa265a4d8225d8674285cb0cc99f0e7c03d096de53582e0389fc4ee6329edf36ae6f59c6be119432ca7f063f5945fa30050e3bf75aaa9dac9480572a93b70da77685046d270f03f90adf12c8e9f1344ab8fff50d4eca7ac3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c1e49721b772140bf74366d880fdc6ecbd798010a55f13b92ba4c7db6fd6592c399d0c17e8b18abebd9cd7728965ef49827fa5e0b79db597e4c3b9f37aa40ec77219f12932c0aead018bec087e2c4d8272a400606a1d3b57094924d8494750cfad56835dbc8038ef61171021543a323c6a44721326efd4d8933ec8af279811e022b2ed1a3ad8638c0b375d6467e11d02f8b04fdaf821d8467ffe54648829a4b49021a84ce143ac989a4a1ff1dc0a875343899c0c86651f66fe3ed8e18dfbdbd6c310a03da4a20a9bc8dbfe1f36fd776065fcf267f786e00b096ef84b8c8e0373c9566f5f4a5a29a4c486e41c7d32accb53a6fc3cd137c361f250fbcacbd2a64bdc0dc03014cba2d4ecaa1a06e53929b50be734ecd078387956c96b7f64bef1ddc13c0f3022ded7598781e65705b2285313309e9c6ac30515f2b41d36ac638d725c84ba8c002022947f6f158f29a27a2615b97692c9f03cd9705312b2bdcd264135d2e5e51170205e5d2382fc2a297b9767f2942593db8a095c94f9fa0340ab4da399bbb29e4d0020d8626b86e218ad1708b9eee0ef698ecb86de05f4bc928d20b73bbd92055e9d1fcc37b414849419d797cb756ce557decc84750dbc9a3c1715162fa1dbccff2ab1846ec70b9dccd9a12327e466fa045b30cff2889108bcc0fbaa073c45d09cf4b32f826a48304b931e4b75d973d880bfd9ab452d384b6414e99170e2d5bf15deb7accd99b4c98aae0235e741b590a2d007dc8a57f1141a5a10220c0b42fffdc49c76032d051d02dc3d49d38a75ca2e64513ee592476d7b7974ebd27e62ab3519221911f49e5463e358deb3c85f872abb60147996fa0b7f73560a1b58ce31889a1f7ee4380c8ecf3ed480d2905ceaf384114cea07cfbb24f2ad34f12ba3371b45b0e6b5eb0aad67608bdde0570d2e57fc626fa7e62271a583639c74689781bbe222f77d5f2c9e4171e8672d1ee8fe00b413a79b1fec7eb3dbb9ac4b8fad43166d27ef0d580cc9d2ffe96a486b0d2551f05c64df92b5e3f23a6b07327eb43efa47c82fc0f6f1828fd1bd87298e341e5bd1c5f833d22341a57637e865dd5267ad98c374552bfd5c4a5a1468f3db1285acfbd72a8d0df3199688e9d9a840e85c8fc84c9ee81b332b0824f6d37be7cf46119c4475294fdd658205d3b88363f821d675aaf6abaa44c7e6d8d0d95e877881ce4ba8bfc8f8ebb6fb7e17d392220fad396edca6af652103f931680c43b7488401d902aec094d827763c92c426f063e2a5712b14b7159ecc80ced83248fb898da28bd40f7d296863cce5cfce85172db3922d561c2b3fe6d4441bc7ed44ed2f80304cc38c7340dcae14eb870a72cc5bf9f74e20d4e8b1b5076a65d14d638b2af898a4cf9ffa64613db23736034840000ef0350e2361cc5699ec8dca287d7dee494fd4397c6a779961cdea738643868e41087cb58625959446dfcc9ec47c13368f8c7c7caacb353ec75b19fd843c60df5b6b7bff6455e7b12e91cf9dabf372a991de2ed18f5e685e6490a68152f5fc0d3b9d3a8dd590815ef52ffc0b7f6afa03db880f37c27a330a203e5f8d6bbd7a3baa75336b221ad4c6bee7c6461db9f25321e005378a8da18ed6fbc135676ec5ce69fad4a803a370557c751de7c5fe137d766b43170dc5224ca3f477caab3d12d0fc70bb07c89d44785fc230f332295feb59e3404e505e48ca8eee677712e032ae521cba8c2cc78fb6ed6f46e01dc5bbd5d2f4e9ae753ea6684ca0ce14375323d5026ac4f8ec1b5e91a30de2ee1b2eec9fa42f851d7c83a39a8d99cb834ead0c06a7940d583e15c7c7b46cbd64126a98e5f4702cf839f99f5d4d5dd1a9503a1bf9a6ce7e6fdc7361721b6ed395dba1a57328965dfda01a9d0f77fc6a7886d8433a6a37f6abedf605c85ec80ffd59bb797273dd0721b299452ed9e9cc5232b53cc6a4c29ef692d9402caaa18e7bedc6731b32efbf75296a69b99c2e0dda34c6d9e1f2372eff4cf5934efb576707aa83be6c5a3429b0872859543b723cb6365e4a3b1fde2f1853c3e835187f016cd7f8740105d1ca21f35edde42a3da653b4e47cebbe1b93dcc26add060234544b95bcce5864ad6322f18524b96c785d2057d2588e1e9519710893e561a6523316bb8f51eb15110882a01a9c8bdd85403cbebd639fe2d800aba6d46737bde349d39b0c560c0e8f3edbf63f6de6fb3391c645437645fdcae17d5208be2ac8864bc4422606a244f22e24b5cb7a1cf598256913bbd3fc78fba4591359f7ab62c38fdd21c502f2bc6d819ff5c3e005cceeed4a9540b760baeec2510da216125c6c3450f96548cdb0fdb374b16285346d31103e244c3f1ec4719852aa5c87ed109b8be0b37c92ebf3adddff4ea919384c4e650b9226ebb9ba3d1eb43329916bac45b58496864b8d32c5c757208", "51ac63", 1, -892992888, "33bedddca1c36a200163a1929dbf062d37106af9f48ca67bb05ad5b0c4e56ab3"], + ["ed7f4b140352c8b96de4ab97d298a7cafe2bf73e453f080bf297bbe48faefa63421d270e3200000000046500ac65ffffffff6efc1165ad424a36fed86405964d0a38e2d962c20497945c6ee54f9ecffdb4b801000000001dcab766d35cb237b53ab6e19749c1208f369e4a818ac959568d956068d0e22179747d52020000000151ea5aefa2027c68430000000000015221985303000000000753636a6363acacca7c99e7033be24e010000000000000000000000004a54093df1492308dff737ee5ab858c9b120af7bc6f30499f9ed38ac7fdfbb38ac507ff2a2c93af6bf1726c7d014464e232a0bfa3e1e36dfbb07e8b6cb932eb4e1f7d81dc7d619a438baa27eb5b6bf073ca2b31eb0c2e842c7ac72b0a1d78ef300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a954952b5f8fee8a4a8b05402109c8c0202ece253a27c980e29f4cb5e4838571e1e06b5bf36ac1da5a6c032716037db6b5cc8c79334725353d4cec8dd6f5b9653fdf659b7bd85b31604697968e7680e1dbc7576e4863a58c6dc5cb9bb80310c0ac9a066b1a240f323c81d7fc8fef5a526cf67a755181e792749887fa88b14990030911ec8bc5dbc60a69fd31541587c5f472478fb9ff65bc81f374984ce479787e03241468814dfccf7593a10dbd7c9d9b23529e769809a9717ec49f6dd127c35e320a06734cc99b79bfdd656f2a918b940f93c0efedf80065d08ae81b60894519482e00028b51b1ec7842e072d95c4385b251642979fcada64be993dcbc8606549eb8022aa4f57031104f5f33ce50730b3540bef4e587b9a05b6b84bb77b73dd54081270200ba77b1e1200bb68b126bb06d6b1b54544f08b808dcffdb27b2480a16e8160e021d681f71f783acf01703814d3cc1345b369171569f3d00c645b9382999c11eab020ab0f2570b222af24261fdbfc18ca9e25f5c0667f623a532fa9035317e1f808f02243fb9b741cc504d1ff50df04048587c97451c75dee554091549b225b71b75575713e96b9b16a7158938d3640d7eb8fd0ccc3f3246f8f3df2fc413d96c4ec4cd02d2d05154b428315fed2421234d263982e7075a13a8f9918e3c2b13d9d814446db91fb9eb104a0cb13c6e4bc5c5264a14fd2b3146ea06f3a38b5d278de05d4c00b500c9d8c86f8df0c6aeaac5347ead4282976321b8d700fc31b40a4e4fec5888e06f1a6127558555a7ee8829583e0ace93cd63d7943860aa368b1892de94f402b87f2ae95ee21781a5ea6f0c3c4f637714cb2b5142f2cf1693e0722088d33de56e20983db3d583a4e6bc4ac45becc5db8b8c7e81919bf2c74f70f4535f96bec0176c4f586296c785cfd23bc5adb91b7f7604754a9d191f89c77e15a5d25ee3d2fc0b1a9ccbb36b838687aeed943e76b2c63c32d031c7bd3b34a85baec37012343ee5418cf8ccc355cde92ed002f021b8d1e3f445d7f0eae057f82e959edfb45a73349aea4c57ab779f04aefffe963472681b47da315dc46b4ceab2d4ebb908781946745fe29b54ec89db53dfb8c2373080df1f357557a5d564a055cb51976eae65f99b5c980400c91e9e0fa5589aa3c06ee5a0e8a62116dde4ba561160a99b7829197d965c2e5bfb90ddbf2a86d8e47eeb37eb9ba80dffadce7737f9e5c1b3e22f625df3ea3bbe6faaa429f2d46ce032198328262d226d8e576bcd0687192d7527586c93e12074ef73a7c4bb14afe7eccc35500979c1c9cd0f964da617404e5f35e5d354a7c2e44baf9f4468083c4ba5c35dfc736c03093bfcd7685845e14fc2bdf3fdb5d95106d1b2ced1f84835d4664a77979f316ee2c8d1c4d9439066b6156c94634480a4f4b488bd8e04309ad988789d436636c4e72605e6a3d10865a67057b0b18204660e9ae9f01530a0d7997515b415e5319a4a0bfca33a13e97eaa92650f952c2d31de572992415ab68a3056dc94f27357410ea02ba544abd54f3c6e579285cb3284a9fb33ebbdda87df27a49fad8fcdf1b5aa0c649af6bbd09559bbf8aa71887cdbc8a8b2ca7016b8d0dc3bb34809e7bf5bf02d6cf958698b461e8aca3b0854ae853803127d2bdb8495d578a79bd4ef9030a35b4d9771177504d886559e48a81ede02718e0c8922bb2d938d17f2e6176c6fd6e730a8ba44bce399e064bd6f1d3e2855c36174007082c1505fd27bd8e7e63372e9d3a013cdefd1a12a64af31088fdaf0eef71f075627ba2ccb724d385f5f8a11babc7d9d35bfdad382a5f3dba9b72b11401225531e46289888de6d2b71c71060bd867e6d899acf5a714efb9510bb8aa467afb1aa9fa5445c302d22cf686338ef99ca40a9bac41c3088544ef8681dfe17e64325e92f1dd849739a85868ffd9d8399f99883320ecc0e628c9d91d322583caef1d8ff27b54076b03a26b9fe62e5af135ca93944e8c271ffc43c7b3d25b9f0dc2c9f715d7cf603280c1571c6284ff42ccbc05f873f8d8a5d39136b3fd6cbd37730431cfa20ebfd6afd1893a4016ee1073312317fb585a49b52165c5a05345201d9e97f4ce93c3aca3c669c0022b8b7da07fa4f5de61da9582d384d8920b3d8648229ee3c38e93239c99541bcb4c36a7d9169c51a137f320c958b9bfed81fbda9ec3391406dbb8bbbc4bca6442d30e22bc235e4807bb5f3a4605e4250aebf0513aec83e11630aee51ae78a1cc72e9f754f5156e7360c65a8829ef97f33a8145e508b3cd473635c63e47000000000000000033200b0500000000721fa7fee282593f74f7a15582b8d88699dc843612e8c8f09b17f9280cf74f67f3dfbfe08f3db2ccae02d26350c589d69b5d4bb0de0f3f29f3819791c15664fd17496f407d779073cb447c6f7052da9113987f156e142b9ef14e68dbc0deb0a300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000db90a261ef836b62d12d823a6401e754e8b44e889045c8fab7c70cffd463e12d390a99a5f53b4638a67ee6bf21b692d3a444ddc58368111a359214c257d76c77d6d7dce54d071c58b2215eb797ad41da14bb1c230bb92020a7065df16efbe71e566c5230d6870290323c371110072117a92a59ec2b3fa209594466df5e3a39b202284267d40703b5429d8ac6a8e3d391b0f095ac6a8a15f51545b583417e0a517802298fdff15140146f5e4acca71b9a0f3dd559a57d1e914a59d951954285cea9610a021bb3b55ceb81649e8aff7429bd7f46e59f240fc847af1e6a55f04bfa090bacc1094b7225478354c51353239dcac9e336d8ba6d32d25a032920569b27afedb6022559bd8d7577048423e5b563d70b7236d7e6902d5d522e8c0f4caa940bfa31850308eaec782da599e05fc6ff9d1cfd4b5cf5a6dbf6e333003d3f8cb1f2beed6951032e510426a4edafaa44d123ff41a0569b81009f04fa95bda238d563144173dd860301fdb6a27ea7c22e1d86fd2e1489cf8e5937cab95fd5a4723370de5b2f90f66a0224b6ff7f938e977bb4fc59897909c56181c53b42cd8fbc491a64d14e25e6de15ed8294be9603b24d1a2d6ebf7f5426d7043d5b935ac065132027063d3e75aed4d9aa686f21b240c0d652d0a0be33edac44ac44f19280f9af85bfdf8a16cc64b5acbb9e5e7e3565140c354f79d02bcaaf500f1b4bc5a5daec4e3804d398e69d389b0e91ac46973d26772c49efe858b7c750f4432b9799d702fbc6d74f728ed81f3db542c30c3b5463c4250cd80c372c1706fc2bbeae88aad986e8b655e67c044d8e202af5b51a800bbf5fb250c954e6caed8883d8d9b299256488b50db2df39a60649cdcbe5850734c2f7ae4cbbf489c138ced03edb5bf8e7e13a1f847b96fa4962addc2b9c9927f853ad780ceaa82b9dbaee86cb43e1a387ac50011051a8cea491c81dce3b4e29223301b3948c4ce73b7703e2833ca5159e07125aa630c6ed36e30c328992cb1b6abe8a0c4af62b3c4cfe33c8e68229a1d2357be0fd050bb2110ac2094cd8f0bb4cba58c8dfc44f60948559e748a7f69786cf178b68c860feaaf698993baa6c765c418c5bfa0360b45283f1b309cd4831eb58c907331c4ffebab04992f9db817294b5c79743538c52c30855b7f9a213c68f8bd023061335bd0053390c268dc9fd57e94f241ab20af8e249a17eff0e60051ee33e77c7249f3afd8d400fcd9cc4fdf03b980b3b0c83714d8a809c5b3c4430e8fc3a69db87842184542e884bc27c6deec8e6e40b48607ece3079041fa050735e0c3066ce0d5aeb35d88b5ef4bff3c303b1a9543276b0f89f418c9c2e8426d5b0ce229d9a800fb66f4f82a729fe25fc2989247e0773a0626e388a34fd49e0c0794c89074ab4d12e65efed5173b25205ff4629ade5f920a796c2c6d8f0df51d409c44c6ada1919dac4418cf4d617f29804ff41a879e0a5fe16dc855cd46404e642bd6375e6279758d074f9c57d47515f4dc58d9d9b8af1c73061ecd14243b9f91399c8fe23bf34ae6eedea015f9d9b27f56072191beb4fa38e5e839180e061abf489ae82e51568ff57fe28978ab32fbde4ce7bf908a93eb95cb47831a84eeeae0706678df0d0a6e9e46f3b6c445c420fadb6ed2057bf6918492de699f0f01a67914d3295c8c8ba43af60d89ee23d452eeb3326438b55fe25a7e7bc8e0427cbbb22b70636741d3352aaa71460a12848d1fad0573fa33948b670284dc784d9b5aa074089ecf3eb860651e5cf9cbd4775f3a9ea71cf22cfab6dc1a971120c7e99b6b9565a934d3fbd640d2eb9a66e29b36b21596c106ef7a063611167bd3ce9c1e06ea6c3a497ddfec901f2a95eda1df23c6fac7b8176e82e8500dba7b086833af44820dc81c6e5b4b1d8a35501ce05d116ad7427b5443c9442395fa6f37fcae067040d09d342d75a0d0187e3d284622135e257eb761a4b7ffdc8ada5dbb626e5ccc7546d843e2c915cd0f8d99f931be2dbf7e10fd895a892cc66083370a841cc13bded6a4ff73297fd136671e3ea054ece6c072a6005e4769496a6eb6d60873febb4bc418b00208fd3daee3714c96750501d5bb24df3b3470d30db6f7a9f537fd0ea85c8fb6ce861ee5f73c30c7c9e257d951cdebe7f3e1e8551fee972a5da2ece51e4c40ec8aaff917daf0da262d2dbb6ca522fd9861a4be25518b6874734413897394b7ebdb49718484ca22a02e39745f6ea87d5a0330e09b12313e54343c47b5df914405be6d172aaaadfebd4e960a171a4ce2ef2878170523df4000000000000000051f8520100000000c9f7631c41b4c143a5429f2696f12a0eb6f47b32072add846d03b170c1553d2a512a3f7c3a89b6b00106ad2c344bda643ec9c7231854a3b288a2f3d005a44d45e4233a8ae8dd6d8736029e671314dc0521bc3bdcaee26e523db43e5b13994aff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ab1724cf44397e065b8d8e003de3e23702777b7f0411f8858011dfd205229502d23cbfc12f07672da45b6884ff91f8f50e0b153427189ef3b73347dcf79341c5c9a85d4500f67dacaad8dffb500f5d8bb38fc3af20ee706b16a6001d84e8fdd7fa000151b08c0ad30b567b81b7393befa5257e09e95854b431563f0354d4a38032c16187a93e4d50e764f6a482773d0ff5370c274cbcf8c48404636b9fc8f80330215f3a17063c91398452e1f834a151c96e707078103c99784be8aee1b5d7ee26c0a01d729387f3ae4daa60331263116b36e6a5558fe3b5933f82c573a0d388c358429375652ae4b95b799442f2f5eb881aabc4073a95cb8e56b877d4699314f0910032e67eda8d26eb80646a9117f87abe36054407058d32a5ce4edf2f95686ee56100209b3774acc9257da4a2bf7776e1a48a2ea97e495e00d25d7bca8b905e6d95ce7032dd9a3cb1947837b2062ab24d4bd25a383edefbd084b7fbf2a254652a3f65763022061acf66f272f8e1dc5502b900e75cc747ea1ec39ea693bb47a6816e79c9884031855a9fcbd88852bfad2c7c74237d8c971a003485908ec4d64382bca455a8f429904aca3e4bc17b967a9d3d50c2b90521fc4789e42832acc5f89eab7232a4cce91d78604194dd81a2c3ae075ea5753932b264fb472812b74e9ea1e9737265956b7f205adb917b7100db6613e171c11eb6b753875bb8e0535d95bbaf0daea9e6b4227b68dfd40595c11fa01775c27292d280a6d6cf980559e79a1092c10e66c37c157d9a2ef63d8154c7aae3f0e74255d7be54657f87938a0e161440508c515ff26d42e77d4ee87549d373bdc1f71307bdabab7743584640aec045d173c56081b589382d4898047c6348667f0c5512753d7069ecd88ed4376595f79f82f23ef36e749cfde16dcf36b97e76c59315afb896f8c082466bf8978455f40564b72e52393faa897286521b909db50ee6eddaee99d69e0cd496250eea7cb5148188f6e6f286715b89d4d6093c4500aaeff8e6439b65f302a00f5db4bf5da3502886b0bbda54ad07f550713cf4fc63d083b0e66e24a80c6349a497f7dfd628dba4ffcaf1843372ec779591d0e043ac522cbcece2105991149c2b2a630413acfbbae2e8115a192da6ae02b89bdfb4186f524a0ce41322723341e0c9ccca57b14572633d8f45de612c1f97c06d8cb6f6ab6593c1a4bc46c107b2f188bd503badda224fb63bcde1e4f9d093229b552b09e20c58969d132cb91a12e3fd96e18f8479fce66554a0dd35ff2146be450c87b5bd92ab53334cee32bb6375c1d636a319e19b271fa0ea04546475ebeb3db79d0fe42dbed986682c5f278ef73868c423671752b35a698ce4abf13d7e20d0bf2c9da335b83d197e15a8ad9662157b3e3d1875b080d653398515e3f0a54c918eb2b296b3b2b59343d90b0b31f9fb1f77a0f3e8866af48264f97e581beb62c419a99ff851558ac422500f396e375aecb0df99e79b213b478b5c3d6ae97937c6b25a420b50f033773bb65a55f3f97c05913b4a7b1f1c2518304ad71282fff3459288c3a8e480ff4045d42d6e4fc6947b764d35714da5647076429be2ecfe5fc5af18b29a3b1c4ff33ee20d98f0d1b33d9c51e9905684e2698fdd57e7df7d245b652b9bca0a04a700b34f225a4640e56c8d16d77826bb141eda3599130ad0a976b4c76b89c05bf6951b8ad233d4f4b4dbf499f33572fbb727aba0e8afa8f2f112c813afb8cbebfc7e2e91de87b164db41064839c40accd0d483709648c08202e74e0b1908b6a41c7c59a97224f1be25c74ad2ece3287337e042ceb9ee18d210c200401a0252fd7e3c522804e0ec9d2165f2d220a878489a4a83f8bd0316f2e011cae28ebdfc01a26beb99a56deafd9ab2778d9e5a860ada3e5a193dd81e85bda49d2a2bfa7480fcb996633b5d5b1d8cf915978732f62ea4164bf857a6bd6a567b54162cc85d6fd3933dc4e7d138b44597232af19bf88dc8926c0d183dda88728239cb7b69ff15b0543b5c88e027c65328d63885917dfa03ec1e7edea587de697e02d913e822c105e5fb732e80814b1084bced1e23d2aac5aaf5b43d7715e79719086a642b1003f3384dbf6a5fe462720529ddfdc0007a84f293046cf500694f6270443329b1b3f5ddb1bf82246e2c3e22c7c5fdaf399879c9a5387e69f8df2c71255aab37abc072af447316f51f14879aba3be33a4786d973be47ee65ad4bcf64ef781b8fb838ed17155a23d6726d876e10a9910a62657540f49aba69b9ef196b012a378b9d4da0288641695a1bb81444caae54e0e9c3eb4f45f30dc37da0909dd1b28cacef95513435ee60979ac1c2f8305880401d1d2eb2e4f4d05fd3a212a83850aa2d688908ffdacc58ed575e978dd6c9fd61560ed36b6f8961e6afdf85833150f9595465b56881e07", "acacac63", 1, -2077872966, "c8ff42f61991ef7b798f47bca6c8be6ae632ebe4383324d584814791eea113e8"], + ["030000807082c40301bc18e648f219541d4df2939f06320f8fa5d003dcbf0dbc5b5a46c20c7aa9de710000000006ac53526565526f93734d02fca5b4020000000008ac52ac6365516500e747b9010000000006655352ac6aac36b47d06000000000100000000000000007942060100000000a5f370c6ed4aac00980e1735f200d6231a0283e916e06a386ccbea3cf1017fe85f1aa5ab1a9d209c19a6f5799b4803f9b4c317d310788e9167227a519bbebb8452b86bba6159147a1dfef856888a9d2cb1d75524b982bf954f9245a1d14ea50c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c24a51ab10bd9cf3630decd43021aae332d906bb27dbf4954ce6b31da97157ef8aaefa9a19037df89d99d0ac001a23486f2315216378217ed7c434259dcf3d974089729d8622054cd626351a902075db5ee233dc30ea8fbd70165d67dcff05c53e9e41bcf63699a19dd5b82123359e86efba5a73f54f25cae73cf5d9db3578f022123e3ec59576d5dc7245ccd7a5f471fbd1db33b2e5abe9dd4187da5b4f9c34a02293d8e89077382b3823aed27e3f88a5e17a68c400b7a46aa9dc9e4c5b12bb67a0b03ee82ce621a8e430aab3a1410a24d1ba63d40aa47baf626fce04080e7b334383e4a9233a6c8b3bc0c930ad6bab8d6d043450a66b3052863185d421f5b49c661022677df47e920c37b93ece7a4b384fb824751789931478baa8679536a4587ae53020027a416ce2e3826b5d4be73ac752b5fa8a5c2f2535aeeffec88114897abbcb10314be328f64768f32c41d430727b22b6be4628db3cc0ba13d57100e84f3c23e340315ba4d0ded29ddf338edf1055833589fc4e3b75fdd6ea006d39f9f96d84eed49031b2899630cd55dc2b58f82b47011fc972a23a10994bedf313dee3d375ee3066e692bde1b8243fd5cb5bd3fd505b88f215c1f46f62b71056657d9529897b84f9b72fd46c7d17b99ae14834c284e1d51a81e1237823bba621c93556a5504701a9dd03d5dee6de7116953426e9e423cf72c9c7fbb85f0069aaf3b2b7deede2233191e41b869d9fa851f58acc5d7a09d384164b60a46346fa8811a5f06ab1d36ca907c6fac729062aa86f12a705284f3ba634f0b5980f1616e349691d66348cb02cb032268a8733703d2d39096573f3c9779532bd6399de318cf666bc0cc897255ba3558b84e67c758b200518513a0df8deacf95096785734061ef3239fbdd86e7b8b7f37bd8ba59c09a75244bbc70d233cdb4c177c6d06689da28a9cd2109a42d15dbc8ea422fafb9b2ad14e8f6db4ca53da1e49c747cb836ba394fc89b8e11ed2ec7e310de074797a80cb3602584b9ea0fb4299b5b5966adcc1a5981280307c5706cab9e12c6b614f2cc920b74dec147240ae2c5a6c067e82decc00f88429a7f6d3d8f1fafcfb40bbebce55fcbe2e0e8fb2cf3f6e440a84147296cfa71fa91d24f8c1af4cf98426ec5d21dce15dfa89080acd581d2b46deba2fd9e3d81ddd999473585f801ccd0f1dd846ca1f07dc13740c5d99f8bef2dfc31bca93a187388ce768bbf9abd10a636d9ced22db6fba81eaf41e148709da181faf9a5c24dba97ed4cde3ace54500fd44a06ddb1b3326f937f0cce20b2f0fc67d6a36beb07fd89ce74e94d40f96557d0da541189e1bf448cba947a5eddc1ad6bc445bd7bb582110eab828aedc3e119c53373a4054a1cfb65ae2d542210a50c48365c4920f086caaf563da82a3ca57d479d78cd63cdd38ece7edd636f1a713cc8013336e51489ffe7b99c485c0eb28ffb7759d5f55f74b7ade55493f4f02cd5526b610eed21f69011f42ffbd4027165b2d9765f816d3f6a1baf82d68e450b12108d810dc45d1b213effaa6892464357c91c489d5d49b8fb506e3c6631d705b0e7329991b38fa7f92d8872f1e2c6aaecd59b8c1284f37a736f67ffb4b00d31824f70fb0815e1f8720aa2ef523dc0dba8ae7e918e18eacc5940fcb140b11c219e5bfac1bc08c1ef54afe156db603aee909377a058dd124dda185f08ccf7c4dfbdcb1a03b03063329e687a17e5e45460b2b912a6bd6281e89f21262bcd8e865a301a5e6ab987d796e5b2bde27887af43e57e348a361f2afefbec89a8c7bd9d2148b6382b36db22be878f2d173eff0b9574f27f1859da47eaf302cecf71d0dde06c42c84506320522ea4d014c242d91d0e0965fd5ddaa616f478af2780b45b01f7000ed4ccf2553184ab670e336b2371320be3d33d639f67705f0b89b54661cc23602600312acddf0df97bdd92bf1344197c70be5fbd418a5546b947152a4b58b659afac8197888ada4f51b5b74fe0397792cfac550589add06e5169c288908b995113e8467e779b8798f48803d6136734635c4f8a1fbbabb1031d180d03c580b9a476892236652ff45291b96e352471cfcb8d370183b93fda86bbdf2e58a899a30aa3f3ce6b44d687f4a09d5b5642c7037cbbe4dc5a6b37cd78eb355e1b02cbf221b5f350bbf5a39f24565d4b795c1f51402e4f76496b684bed8fd47f8e9a233a1730ca3f217b4213dd456f865500f3877b038bd10546e68aae827d3457b10e23fcf971fd0095c9aa3b785b452dfaf7497cee2b721fb4ac2b8e4d8926e36f53fc99930a2fe2276e8941347833467f543dbde3e4fae3c9b99b1776ea823083aed930a18941f938331ad8e85ac697ce161c89bed4ead93133b78aab8a3289c024472185b55c472775617e3bded80fd203824fd734878a9db4c5da270a80c", "63006a", 0, 1258290660, "1ced8c9aeecb300b8249bfdcba1fa18ea190783d75f9245a756652f58e60e16d"], + ["04932b0603896f3ace8436ff23ee3d8b5c48091c61e034e336e324a793bcbbad2836ce53320300000009ac5200ac636aac6aacaf334e320543be2424fa01ce3fc30520814fa6eb369618156f2697f7309f5006f3a83c4003000000046a52525318dd88b3f644306e381d611826cb9bd6bb9e20544031fcccb7c9abb913d6ccf1e0fb8f0f0100000007ac535152516500e2d5d80502316ef5040000000004ac65516ade31f90200000000016a0000000002799ab10200000000000000000000000035a5ce3f659c756e8ebeaaea550aa8fe120e6a0ca29892e05428139d45b9695083c917c8690a8a644a47ac3d6c03ddc256fe0d856ae845e81b569acc4c8383dfd76b6663714e0e1c9d3a6a8f34e34720bff3f68d1d66d2500ebbe14980ca480c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021758f1e746900944a76235ecd3fd272fe689a26f49a815d439d96418b3c2317ffc7968585ecc0de13bcbfc00f9b59159f2d37618302271dfea386626d83bf8e973448f15fc10d30c0f538548f03cc713201380e5005a9e51a878b1b76226f765726dce1a801f3ac5b50f1b1edc6a5a35a8554ec4766d736bfd44a217182f032021a19f64e16ea8d76f8864ccba9709b7963e84b230dca2af6f9ecd6f5561ed64b0202e116a985a009b587b7e3d8f2742e2b864b901ea10dcf44ec002ea244010a8c0a08b402785a11678a6746912c72a268c21f1ddfcfd14cd09be6466a38220bf0c0845793f2b4e9fa8165eead6b7bcef2223f0768f5f195b4774014077936424ffe030e9dca98bffefe1e2b5996165618b3e4dd4a2f5b7051e12cf0752b42cf587298021241a8f01c734594ad9b21ce21f9d94221195eecab6bb0170569d70b2cb5460d020b8e3713be8815cf0189403b69ca13842c0e796b6ae623bc879fb3ef283db17b0300043469fb3108b2c6ff0d90a4091c3ea803675054bc15d1e91607e24e62b8770228f2982dae0af12829527e57564902c39cb108afbf9642e08f5a6b74849b74c32be646187c2d7a68ec6bbe422dfd0ebda2b17430ca24bf52a154968684986f6a32228a311ecc26e4453cf0329fa69b10d8dd39dad4547039a522068f0d34c8fc1d34cc1cec75f7a323892aa9e2578a1a997c01199e7711765390faca838c5d33919d055b8332f8585266b0a5206778644151e8bcbc90fbd2c61e36a9d3d9f11c85fe609edede65c5f8ffa948b489dfc21dbc85f63b5d4d0d656dee6fc5283aebaa6fd2e965237fd5d9f0128b871fecc11916d85eec5364e7d412d9d73df924441283b9ad388d48369c30c74586d250e36bd344281409a1058271496fbad05ee3d9b3e5b98f0be2b002aff4c5a055fa154efed555af939cb2612705e9b39284cbaacce9f1a11f9c057492e3656788a46e8a889e104e66a35b7a1825889d78cd4f7d38a54094833316764103c4429061abcf8ffb081d91f43f98ff06ad07a6f9c8b73750eee5747bb513414f79c613c4ae6039954bab92a570e57b21caa98f73bec43e74a94ac9ac4dd0c7143ccc5167c1a1a776f1354a785022876d6ddfbeea7cec9cb7120bc2f2c04689a1215d101ab46195c50b6f50aa0fdad671b794bfeb96801eb8c47af335ef928c6989b46b1f95cf2301ee8c8038c9a78aadfe79467a6c4dcdc9792f5825b41ea6373ca3eaf3385d2326231237ed578dcd728449698b65268669e6ec0fc177a79678cd521e401290ef44bd3201bd7d8a7915735b0962cc8dc8065ddced41b5c27023273c215afc3b2a2ceee1790560b3bebb215ab2c34fac0e344c0b9fd10b8639b92481c24951a9fae016fb4b0b69776330bf62b98f6d1d3f67b7647ecc1697b2f7c625e8a1b3b8bcae8a7e5496befd5589a94eedeeabc8d7e1716263097eb5e13884d748fee63537d516d15a102e4f8cc12d9f883d3978964ba267632fb0fdba9d49032cbf01a289bca2946913294f9684fd541b25a3b6519205d4d6d5ec8054fef1c134cdf51b00bdec63160fbe80b5d583362d2c2d674204bed046e758594d0086e56f7298abe3156bd5ad8235fcc5afcabac79f765fe5db431f91123bf12d01f97af68aea4867d18ab232bedb36afca3c66bae142a1e86ddb54ba72c30002181f43aa124e95c4f7533fd83c1937782efd0b57ef3901258814d50f615db419a038c696a6f82ddacde62c48db151ebdda4855757fc0828da296d766b3fb1a7decabb593306ac03ff136b4f6a5cc4a1080c86043dd34829253efc85d929a5f34c9eecef4b7391466c0df11d0b5b52c99ab1bd628de966e05d1ec2eb2ef4cdb06999c9cc11ec7f0ade69bb9d81b52a2c5fe6f6041bb1a7910975b66a1d98db0205b88711e15870ca9d877208082c54d84e9b6472aa4f58c61a9c8baa8928be04163a1344b002be0a5ab21fe034f529f59781018729892ca73fe5acf18b3a454085a6047ad19984f6d63fcb9da47b169bff5e437ed849999056129c1364cdf2758181c43f04399c55dcf879dd254d7410216c0d1ec48ee63d5e6857c7e57b4e002a114a8865275efd418fce813f85b35c65431b9855d850806972b70b9ce83c73921d17e149c5bcaa326802ed7cdae5501367ea58caf0e8c32e810eb5169031b620c296116af4ff8ce192c5fa2dd27bc246e87ec2f7ccbef30a4f7c432ad6a806ff5259e837ab0542c987cf6aaa6d738b9606ccf68b08f0ecbb67fe91192e7b2440448c567a989a3d37a7ef604000000000000000000000000753c3e2dbec4e908ca6c730deedeb333db0b66e742ded13fa5f3548cda1489c8990624247758727a424fbf2e3d47f74f24386e0c9cf3cc17cbb5a018329b5597ee85b9514284240095cd5d6af3ede26117d10dc0caa62d0048d11e9f81706cf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d0517e571259ee06091e64b794bb535410d20dc56e998146a90a16e1b1341278b136c45a57b3d76861e4a6a4784ec26f9c6b68a49d2a507e6b01d9afcdb679bd5690d716286247852677da513724d1a38a65b5eef44f73b69e932902c73e8432f8730d01064c66bab0875795a407d9e13cf0e7cc585f4b7e264a87b2529675a0304957832d5858528aa44b94e89b8cd5403b794a2fe18acc81d8997775922919b020c8d6066f4ccdbd34cc55764208797558d696d448f215bd89397b9781ca2e3190a08e6c10572862628b9783495e6e23ccc05ee70d1696032a0aed78bcf0015e3020bcd4420a799fac4967d5c7a9926d1273efd8b476e526b8814fa93cc1f5357700202f970052a28237b1a5dae349fdab3011dd8bca33c34a571d62c795ece3e4a27032ce5205c81920199223798d0d10953b1f0900097cd75e3497b3ca7b2c2a6670802001697a5d7ffa6b42eb2b87b2d8750c128f07e757c1b60582e5fe33fee7ad9a90311b7fc493fe02589d37abdb2f09a18e25cbe4787422270a86f4e99d20f146c4c031af931f3d79685855750eb31b111e6f8a86f8f6a64822720c07e210456ac277b597016eac24ba1cfbe618ac2052ec96f63ec3a0c6dc3582149b47343e5b2dd04eccf4d69be9c5be28ceb45f73f291add0ec1dd705394f1628be433b217b3a513755f08b70fdae76d70a9fbcce0f0e3adbf96fe8d259b99ea9768d2921fde2fbc18ede0a1c1a72467e1ed0e12993bf23be5274f0827baf01e4052c0a6719ca6426600c4c17387ec3e4d3aa8774d50a7610b3cabfe2224a14cce0d49531172445977c2f6f4422c709a433eed172e7d0873b0092001da5598d9433c2d1878fb1f8bc85edce2781641ba096340d0ef0c4950528cfe11616c0474013db3197c6b12b3bdfeb4185b719ea33adb58978dbaad1e690b5d2f22d380b9db84b27224378d22e16afced4454f0a9a2ea193a7e8fba6bca841e97da6eb19eb3368039e61f634ad2690b25080827fe083bbc82a47cd353ded0eeb822528e953b6eb782e3ba20c233d452bf79025f61a2917603ba0d6150fcf331bb9b62116791546e36dcfa359b4ccd8b408357c5a8f9529164a650a19d93d1ace6ebec628dc7b4247d8202208d005c71f35c0eaa199258052c7cd94cd8c771b82d648af42e409be9ea07701988b153b421759e2008da38b04951c3726f341b575c37702f62a4d2e6f5b625a4b2a25a180165bbcc4566e5377b273ef2590eb480e365559a088bcbebeecc138afd4772d82c55a802f2e727076f1ebae73b407198645662483f3ae044a91dbba68955fe591838e0d9c0c6da9af97bcd702bbc8812994903def738e7b9435f97433c9ed7620ec83b32b6ee8decf2cc03b38374674ffb6f9388405d83606e8ab58a305ec5c4d226ca0d64b341d15c5a7bc7e048818ab4cd8e0eb40f3dd344663c0a76abac28bf51868f72f6fe5864d3be8fb7fd6a113e1b8b8d49b891906ac2efc5f3fbe7a9ee045168e20d72cbee0259234d42527a492abac4dabf8641e1f53e95bbe0ed776899c3e1d4a49d03f0739b0b9246f4108a12cc96afa8257d9f45607810ae1c3ad63f2111d48935aa4569f5aaf909a50f74e1714ae53e87c754503ea665365dbde98a39a353c8e5c90b15766cb844d3463097e169f4e0b0476be955dbf4b7928f262c56e2630116ab9421fe3cfccfa34e9b7c2a3676e61e974ab056611117ccfcbc8d557f84b6c4f69e46acd42d55fe494d86e5e4805b6440152c3a94a126b73a3c9782f080ca06d18612a2872d61b0343ac2a2e6c58b884a1886553cfd651afc6b49c81fdbc869c837a295732ed85cddabe0a9328b476896301b0d2a459af949c60c9f5ac1c5c43deff7ff0ffd35065bad42899ad2ac352eac2d588543616edcb3e4e0fc84b9fff3c6cfe7809b90d9bcdc96aedc6ab65c07333985c6e25136a92b9b8ddf4b5e9df1d8d7d0e4c2ed84d49da15ead589466f193ce278b002df0871d3fc2495e3f6a27b66b2a651cca00c6b0d5da27f581691a97eb436ed090af502e2ee9136a359faff9c0854d0b763fa7228e71ab864f5a119d8ab4be4e1e37952d95661a77ef10abf14d838439f4726fcd4a9b5637358171938f21ae7e7789ba3575682a1d8d49f47bb53d85ff9eb53775ac8301091a57d96006479ffb1b6ec1cc28289892e4f3735068e3b3b2a783a823f366236f6a094d48e31c41441731acbdd3ac8f1ff4947c238ba8907b61d9f38a06bc81fab347b1305fb84be62e42990519bfffc81fa28ce3d2a2045abbb49327d2c03a5d277f74eac7e3c82a5fc85d81a0ba0891d1ad77bb49a977cb7f0f01b2e284075c6b4abaf1e70eaed5017d1c1ddeb1b8337436b62111473e5a40550e2be60c727e728171ab6959ca6a691baa97c32337a264246ba6d53f886e870d", "53656365536352", 1, 1499264036, "b0cf3757dae4ac24b50b3a06391e80a58f4695857a892a0660b71408f87ef8d8"], + ["2220864e014c15f10442d0ce593261e027bcb2269b48f8417787f6aa5d003785bb451c75770100000009ac0053535163ac5100ffffffff01cb1a56000000000006635263636553494ea84c033bb1b30000000000000000000000000011060d67d12d8d6a92fab420b3cb8641f21e22df6501f029ab187c189bc1590e50f1d28abba9e3ed6f0d555bc0a1f1da43a1561c216f87e612ce086eb69deaa3ff195b67138c681a367ca4bfb2d390de23a0a89c002da7434933f33dd57f14c200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003611f5790d815b2b8f0267c32fbf555b8d6836a56ab5670affe93d3b3f899a420379c8c2fdc92b341dbacb8cd1d40a9708cd071e86ab2b95d8df68348050a919e4dc6821d32ce2efcb6c0517f4768a666cf5d40641d4dc7cc27990ab0e1f328d3e6d3e410b019afc732aa1e768c6036c24f5636eb443b28c284c33d2330012032f0fccf81e9354cddce6997a5aec9e58f95c046f187f8f72fa21551a59e4e1ea022d20ccc1657f954606742a42196fb394113849a325fa48523ca28dfe48ee52560a02f75fe6c33ffbafde2b0aecc90b532a58d20eb5f15a601eab25c190490ace767b17cfb881cc1af3302e8456116507db92174ea3338be54e597edfc2c76bcc8e021cdfd2af91b2238341f1af554cf243fd7460ab71f91f39e692e04dbe1e7a0204030de125a5d37a9b1a661be3bf28954efc11fd58cfbe00bbad76f1c902ad7bfa510310d224b8cc0859998e42bd359693b958562b135287cfa7155eb05d1d1e821d5f020e35b30f479a8c6f8383ebd23725336266175f3798125f3dc59c96f3e31cef7203052b5bcf98a22887680f8dcde56c3165114ddba5d4923c6410caf15322f9a92ecf639e4b93397b8430c522928f1fc2f15a295feb124d45ccdd4e06ce0cb2708ca98d6f64c7ca390c784cfe146937cbfe387f1b37b7f7fd6318adcbb9d7195d6defbaea65e007815a956be76e94e0f5abda3450c5c720b2368e38d92ec1ecf934462a752dbac3321c755cd167a729ed92c5c6248edcb78967565c38db8c6ee0eee350d87c39e954108647f6a4786888844c08fdde9bb824ba45b216665fb32547dc969c6ac59691df4cc47c78ebb1c970e4f01864660eba0d14a943dfe20b81b5289c55d4ecd1567197e67cbc1b71e547b1ec23910cf94622f390ce76febcd988a2a27709e3a3a346973265b12ff12a30b8ec9ca021df54645d83f4ac16d5dcfecb9467aa1e973cbddc18d87f4d73a8c079c019565e1c574b4af7145726c00c7dd6462503cfa1ca4f2c7397768f543c48f50d1dfb37f1b5b000f78486bfe44fc9a9879bea3f348d7f23950f7ba028f3b7212974533899c39b515a8fa53d261980fbbe76cc337e0d92d37430f983b068d3e3fc5a8dcc10cea4da8f109ebe695427112ddeb22788acfb39f41f4f73a7293e43fdbd1044714940087f3a1930f0df79426e2e1c909119c5dc8b7066868d95251ed95ab1dbb583b8d179222c414fe16ccc793c882b4349d7b23141b45328f609b1f343c7d843641e7241ba17edced57de3da1d335e1ecb275515dd7c8604143b6f0e3c3211418b9b3d7207809882d0b1394877cf91f23485dfa3211da9dbc0d1f167d8db0839e18efdb9ae59dc8d9b1168f64b387f87c0388c23ad0a2a121986cf2b5db24348cee8ac85276585be8e69e669c765bc848d2a8dfaf7bd6dfeee90297beec1a1af8ad4e9c458b176e27e88a341c43b15ebed32394a5a3f100defc0b824acf364ab7e9bd08a06fbd7c42e7bdc7a704effee645d9d0dac26046cb66b0f055d2c64aa8586d7eced7b66008eb36f6f949fa230da11d121e2abbca4ac122f6349a4c5cb011c25c0fd70c63fe3bdf475ecc4649135d60792ee80bfcba8d6736ca3c86462a624621e09149580229e2337e66ee1688260fd80e15f56b3a04b06ba42fa04aec672583a201cb4f58e4827efd551f66e67d30d1d2b8797f0e5eacc03aa1da2ca34085a0cd1e80613bc05014e9c3d3ff87cb647f022ff715b3238ec6e61856f28f7cc3ee8663b3b5d61a7cd88aff9b79628bc6fb1c072d3aeb7bdcde141f27da39160905347013d914a695cb8a618ca65e6904ebbe1fa47ea465517f521836b53f4cfcb82e072419e1817b699e39d5cd298d39007f8cbecffa80d8d8970f852e1ebd0f9f377029a4b50d78d541061e6f7a3fe00da79cfd973b10b79ccbc4734430dc14ee487ba0587ccb48500bdd422f85ed1a9644b8b045087ab09863a83a1b12a1001518e4f690d7a54e848ab272eb9d4e56fefb8cd927930c9de872e0a23530e6b4c67a42351fbe4b87f174dff6c18fc4d3a5f7b6485e6b87356866295c640b1eb1b89615e540b2de3eafb69209398e9163bbff96a19cdc90a29aff21c24e2713d306d54b94696b0e6651bb61824d2d7b99fb3bb2e315722acf731a72a21681c333c5aa09edf3e2139d9968752b0306a16fa122525dbee4b197d7188e83cdb380b2f43e59b63ac9b1879771811fabb651fecd33cce485bc4c6f342a39978709eccb4efc7e0e3270b4a06f4656442db4ea79b58c295ae632e0d5cffcc45d100000000000000000000000000c5e78e03f6c919c2b0aed6aac3e5858aa6e9c7229ad660d67222ffd0235767f1a2b16715971bf26d9b76974ede88ef1d557208c8c61eb0ef8ef1800d99aeb8a049d831347b2e7e107e95e2d5cfcb6c488f6e6559508711701cde6162f9fc7641000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f1eb95d135c449b3511f5fb91893a2bca9cffa12b84ec959b76316521ca53037e4033624c7fc1c2fde0bdc8c857d67dad78feb5afc6c73cd0087de7cc46f22ca9d4f79127a57839b03d04d2bfd1636f8f01898c143204c29aa4e1d06897beb5a6c56c6708b4cc2226cf694a0a06b0122659d2cc8ee03f3214bbe8468915f2120223b73be0404881fd75d7d083417288a6681eea7f5d06b84b8337f852a8f06c2e022ac687209611edec38b5f8cac69c132650a9551bea152b4a303eb928c76635e10b06cabb2d5c2bf32711ac447303868a8960bab47b3760fc088ec6613ca05ad9cbc3a956794ce61c68d5c3c0a6513d99655ad17d21c9c94d4e9f11e277e988eb2102028ddc780526765ad2af6049a8c1439360c9216d0b250b2ccc206b7354e9518e0330644c1074c009ea27df05fbe77811e879c2e498d42838fd75391494ebcb0bdc020af8a6860e24bdb00e2e069d7d2db5f044d24ec60abf2dbae5d11c3541abc56f0214e253a544a6b83d884df39c237195d44f134e35a8e0c4e9ecaac7f141cd2845021b3ce68b9dae73ec85bdca80b9690df986afd23af1064408b378c4932a5bcd847798b42df1a899a98f4803d3fd9ad985040aa775ba1d308b1c6500cd0fc23e678a0715dbd6a4021294ce446b62ce7b32748c7173dc20cf05ba12e4c429644e30d03f69ac6807e0a4945ae30baf0d075542ce1804aa4681beb06af1d0317450c5e3b20580a8e4f119f3abd45bd130051434df27fdc7624c8aac20dd34c3da7e6c221f4c251d7facf3fa928a2e1ac51ebb7c4252164d087b145d73a717f5240ea0703f4ebf26e4c7c8be26785a4c32f1dddb9362ce94975384f8be7cc8ad2dab66ddadbb5f6fcb52aba8dd8290aa7ac005f2df5628bdbd9371f7a98e97c2f88ab560f60635a17a2468b162f6c1077d5d952a646e8aa417785ef9d6d8582dee0c3f93350cbf0b2227f1c8497cfb7098d72e4a33a8a6e8017deed203e733b6acbcf884edc4da366627300bf4bffa5c360e466622818dd337edf13184c551ee17d8cfbd799a11543ec53f15f58fba02cfc70cce7a62452a73a46fe9e72f34ed2f92f84739fb03dcd0ad2c1e34d3d6fdc2a3123b1e09586e5b4136cb31ca05d6d6daba66cc35e4440e6370e321a1569f60edd6b3ca5ee92dd13d9e4c0d9a90db3af29bc81c56c773722af801283d774ab31872940b486e984473cbf60cb82802b13b752f6aa6a02c8ea5cb23b7b84d5176dee151aca1caeaa580963a9aa57d7c336871b18f898b409d42a9d7d0eaf33f5626c875882004351626fc3e113acb01a68800b73df73382732d5cfeacf5256050f2dae27d15a2eeae7496f410121d8c18b40c23125d0b3d477ed4593739b424bbd9c394eaa5dee7a83e56ade426a4e204cafd53ae71d5445d9d5de40cecad040eaed8919045157d31994af71c799c1f02bf7fe5da3717a0d0f2c0b11ac24c42b0053eddb05d8b57cc8b983b07a7564add118af5bacce5c2ee3806b4399312462eefa372b2027e703a404430d79e6cf586a5b89c0d2588ae41362accf198f1cd7f2505679d9463fb9c2fa70f95beacbeac73fdd9c167428cd8c5aa51cca39629eaa444365c765f9d1ac8b8066efa2098306673d1f485cc6dad255064836f7d264c6865dbbfc138edb9f79a8ec210dfd39bef33aca3ef27447d3b7ad89d8399bd7d9fce42b83c528ab5de629aab762a6e1a29de32a1cc1d11da4af2824f7a84cda8a72c80c9fad500e5f6681a2bef7dabc0380dc5588adfc07899a84fa924af8e77b229b7a8d5b030c2692f5a9e1fe10e24d43efdda853bbf77e2d74870fde42970c378525aa58cc2a29ff62382a13b8e1f65a647128ea4904caa097913308ccf645018359738608d89376d9f0755422621a4150dd58512c268130f91530538f8f16ab733f8ed5207dffeaeb83137cc19fa5e31c3cd77053f1f9f1bf4a43f5ea6ea86a8d6a027d68cf7c46397225e1c516f0cd0cc37c2a1c62424c010545d3674ee10f86d121557a49de04581b28088c55b985e982b0507e419817ac222e7a58df95cf95d2a467132f711d7a4976cb4cc7579e7275e4c776004c9bdefd00e51744eac783a8303f787f67b6749964e639f429885b4a7fa273143f8d1e449f08657a3fc1584be9e2ad064fbb0324c778c776796a2d77e9b65512b9afb40d92e48787f5fedcb9889540fe508331d17a2e1bf7a240f34aded203d7e3a83471af42c060a4578443615906bb99822cfc8c5f8e963f53584a58346cf0d5157c83e6bd13b210058bce70ce52e010000000000000000000000000006926c5ec0592dbd7a63262be7f2bb1d0357c8b1891f5f7de64d75311c9baf269b4bc9e43421c626dd9cc44b5ae4db8df6ae8d4dc389f510b85c7ca52ec15620fa7664d067aea9984aacbd4368e66cda6b711b87370152d6514888712d9dd50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023c6443d38200af4c3e59cc125a234a1c895caafe025c245297949ed97c782a363cb0a5ad57700f69597f2acf8a995db2aa992d90db25eee0a1585bc293a1b49880a3d0c3d9bc9ad6bf8a8295c85787211cdbbf9eb2a1b60941a817b27e6581968248bc3487633bb27dd08f50626e69547201e52a5bc00952b87f6e48f7c77cc0315793c479ddb6f97acd6aa21b28a6ef957bbd27f08f4cabcb54e79d7a029b31102292908a4abb82bad0e76ae602eda918c3d93ac38fcc80eb36ebf325077af642b0a02c25998e08a6168f2f6464fcc6cab3d44fd48fe151292e57cad25aede56d19d117109a80187c55167b402115ed3d2fb1ac5b58a0754fdf70eb6179ce856e276022e59dfe1851bd2a9ec2c16cb7d78214ed2bf250f80eb360c90f822098ec80ce40319e3ab63ac17d70acb5177d790d85cad2c67ac19ac4a0e2c47074841bbc9278d0212e9ba10e10c1b6ca92cf16a8aa23122fb35d22f1b0f0c08f80070fa29019269022a3ca4aa455b70ca6d474ee780b5ffd7f85a55a13efd0e56014f1c8118423f30021878408613229ccf17f477b455ba51c17dc1a854acd7de27b04660cff932a8354b43b9240ec76cb8213c2b940ea3936fe64e1e8c6a294b1fe9a4acfff482090f916b318d045bb277eae8fd46652ec670f1bfe1898220da39255f479c5ce9c9c39bcea6b72e2cc2f140f0702b7152a4e0c04c2614b4b4777ed01c7dd06b30a1a91cd0947ab2a0ffb623e7e8ba7bab62bcb45dbb36e546db092840b8e526ff859ac4737aa64fe4eb140cab90080956a64db79df974c9c24efbe4d2c69a98025b5f024c58bf65f8437dbc9d3a60158782c5f8c68f946ee6e5b61ca165721ba77e332339c9d6d6cf97ba9806defff9c4c84fc794483dd11f3c38caff80a61636d769a6005c4b8e098df242e785785ea4c880629c7d2dbd83a14ed8cb5319c7fce77a6cf363aa6db6e60cdffadb0d48f04238d6d179a77da8082f13ac81253c431de02b22948e26281fe82165810549da80ceddeb2060cf34df807eb0bf882063ec983729fddddfe71bf8d9a84587b225a45fc90e94df1a69a133efaf575900ecad48902ab133a649ab5f2d04a2ceb6d45ce580bf27637cf937a5e306b6e5ae8d43688ba9f337c0654ceb1c5d625b95938d7c180b3249be5f459ad64a357e087124adb3e07ed30c7073037b52ee2f12700d67c8661f1d7ffa1ff71d63c947c44767d55d52d4067b1554f2f53c00948f2a763495952214c9e6b21d4f382e93d7d66f54653d3e4337ba25c637030320dea440d1a068a5837590778e5be9ed251e90e57c2b4ae8e3ec5e57eb43d4c9e9c2b0035b94a6a91f745f00f81f890fcf754d4304b92a35a28b04aad764e37e233ce8a97183259fce782e53cc0930024a2a46a93cb2181192f06a2a608b9c2dcbbe196e31f95df524a2cd1c8efdb1d7566c1bd0992fa5b9ec3b77aa75a8b6c82beb4653e40327cc4e1a6c583c5c824a6bdd9fe5c32182e022892845c0066f8f618656584c08d0b9837e578b5f88ba6d0f44e3eaf13d36d849a834f0512ac053369b82ef037cf49893de50386c7dbee49ead09a591df053d6cb5ea0ae4712de6d4de1edd65c4472f8595330e8b2d99a78b6322cf687fa3169eb763e710711eafab4aa49d6f5a918eabf7f3470100e6e7c2115c2dfa6580fff0282e080ec426da06eba852e1cb0cb1ec17374963f87fb103bd54cb8081d386d5107278408476ff210bfd02ecc1f31c09910eec52574707c93a71e6619d76226da550c9a19786152170739a9d863b2f16b0e5da81db9c939d9b0a66d99b67ab924f9a742fa81eef7122c1db9ff66384ab1981a1c04cce9c56c1ac9f16f4f6fa4c54c4c9729d134f1886cdcc5cb6244ddc168a5d694a1bbb5237b11f121a7fc50eaa5d968a2cf37c847d93ce3d49468266c1ee0cdeb9e14c232f3846d9f00b1fab4ea0113cbbb00784fb22554b9e5fa13287c40bc59b6f77ac9a5c6114789ce741d00172b2a10864c9460e8cd1a0a5659744dfea9ad08cedf7290f3f33da6eddf4c8ba0be00ba1cecfad7162ed3605ef4b851176fd06296d01e0940220a992bdee582bdcf500d09f407d9e3217481acb844dc2c95d908078e060c8ea5c78e1d86234e21bc7d83b5f3ebb00a17238ec3811120e55bc1c56d4dd42b979190966a52a344e77a20a352bb2f340dd3cde6cec72398c4cc29a53aaa6bf70c820248639accb23425e66295a24d25c7308f3c7acc5dbeccbd8603d41fe8ae962081192dc320767dd15493e305dc8a5bd93a0734e9541e1d04727256ea19cd8efa755c3089840e1c4a217a957337a106c35120c20d49fa8aca9e20b6bb266e765a747b236fc5e3fd12cdba1d72957d35daa52eecf14a02eed3aee385ca0e56017b07bbf81ecff77be308bf4bd586ccf965a2207", "6363", 0, -568939357, "00ee8af8a1f7d8db7ab80096c89ddd45a18fa5a8bbd16cce0e07133aa82cac9a"], + ["005fb27b03b10de5bb16d37d0d3cbe84e5e7847e11ccd97eb7b801554b7d01191a7557af1e000000000500ac53acac94626ea3a761d9bfd78dd9cb8339fd4fadc55ddf991d8919069ba94a5be9167f81833fb20100000000ffffffffe5b2d1994bd7c6629205c484199b37bc4cdcc447652de158cfe48461973d223101000000066552ac656552ffffffff040ad5ac0500000000045100655379206701000000000252630f8710050000000001ac3b1e2a00000000000252527e9b52ff020000000000000000c0a5b60500000000380566cec4a2a8251aae7997870f23874dd0dc2d58f4d7bafc575bb0362ad6a1e61b82a81e41b75f77ad3afed2f056174cc85602a34969011d73fe636d2950cfcb9fdc070789ac606c81406318bfde387595dfae4002b30e78ebeaec2228cb31000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c6be29dc2325339948b7f9fc1718f48f094fcb4bf785c8a16506880dd373f6ad110c03cdc85a841b7ebf2f563bf56dcfc50aaf1ca163ad9e0af290a9eda234528dca9f442d396b4696ca54b249cb123feff8e83467248b193c9459fe9533eae1d6192560a14618de59e52257447e680df5685e3bc34d307f3dd02606951a24c03142d933420f5841e47b0fce832083aa393e7340b95654dff4caed99794063aa7030df5b4411930bdc373c615ab72512f80584b0bea55d6fcab48a72b382021166c0b02fa4c44077800616606ec7dd3c6e6cb7616463ca9de5885c77fa70aa39fa4cad42b23fa5f1918c8c2a256ec0a7bebf209ffe9df86d7c7b4f0d2ece143fe0bac0223680ff58657a1ce06de2059a7cb8cce076e5b52f3d4d36003c7fe0f0ec49974022656c4111b65ccd9601c2c389f3fc4370e512f0758b1b2f9bd897f56afd1e2a603248aae21ab8bea481ce8662d5f61c43b6a6f47dc83534a28ab7d440420b1c449032a7fde333c223a3f890e3bb8f5b3091b7e35fd593f8a8ed58aa97f2407167902020621e2bbad430ed51f5901b9c44975f03bcfd49b9ec82f095711de8906fb1c2d4ab86e7c6e36b3ccf7168a06a14ebffd26a6ca86fe1f85f62f62d42d6885f98bb01abe31c79a7b1ca8ac279e219b5b4fcba15c2f7b5bf2c7f9f8b1c0e51eedd04dbbd08d90958f088862fe2bb1db956ef6f541f72b218c748a38ec17b0afdf78235fbc85ce04e576954cb4bfa6595ead247258f3b70956c1aea5b1874b399aadc55df8789dfaafce7da9a84b262ac3be88d63d2b4f32860b5d031f6fd43116b35db61b531153627b43eee76475b34bfff2fcb7614f98ad00e5ab5a14115cdb369c1ee0a15fcc75ccc0563ee49e882e70867a630ed550fb97d6e66afbde0472adcf81299cedc90f48dcc5f0fd1fa3811fdf88560081f00d69f75d8ca5a576919624e044f3be95cb3ceec23c1bcf59db2e6a21869fb2f105bec9fb6290b7a3dcdb45b9c00d900e5c62a9b05ad362847f2154dc0d08b4244a571dc41bca04681baeb23f41c75d0c87b3619ce671b5fdef2bf9c79a2ba80bd692620e1c02d9835e625b00c97b6a88b4ff35fdf23172c92369253f968ccc9dd87cabfff118f2914850492d6fd11f22faf9044c1212d14d7d476ed722ad62161a2fc885c24a8a383738417b9b23d6ebc553a0013f125df7706a37a20141208de3977af508346d4496f4d8da5801b8fab60bd9bf0586739f519584b8d14c154434074ef05bf6bc84370789742a8ff8502bb728477ee421b3e265ac65b812a0d2d3ef610fb7d7448fc55015e3e6370733cac9cb7ec7c8086264f2807fb312e803be888c30145ddee70819e17aaddf75b287e91e77ce6d7b60219e8c367aaae7a50d1228483493361b3bf3c9aa1151a2526675cede57cc14a3c1c84cf239a69d546549e0186e71a0403ebac9df273043e7e4ac8252b862b739cff0cece26cdaef8dbece973bf6114051685b14766d5d47b712052d8df7fb3834952707ca0e650e34a302804311031f1a30586c19340f466cd434057c64f388c68ff25655600729525389ad51f097450a9b16739fbf4f8f95d9fd5d46c51137aa590cecf425cc2d1c1cc1657147f57b36a1a2abea0ca82e705c2ff82648dcb4cdc63ba9504c79677846082d3c2591bc3a172cf8bee0046f8517f14787f9b75f2288e9a09e4e85f622c02a893c688752814424086d955f3072d78a4bf04319c4f0a38d4d960bba9e14cd385238e86d78f99ab4d2dd5bb827d418af01b91730d9d01f6c39fdd17eba743af9bf404e3fd63f3293523055412fc5d00e924c7e4bb515344bbb3c6f7a6e3cb81d05dee03ff35f543e3091544548f46a7ec1ac4e64accd08c52108c619542da7eaf35ccdeb7bb7fe16d47525e45c7bb6357c7a11bffae696cb58423f3652ce3d5f1e23d2ac92a6a7a90eb1f22c9f5557f64c22ae1cd5d08222d7cadf017a3f5f1946e480bcd3119ba5662478ff4a7bf77988d000fe6217cf5296bb1a21492ca10d0e7d82f7421a02d8c00f718a8b23cffad9d02f11e55e89277b8d6a7b69b3964f0b8218c98f2ce212fb878d4a0ba4391a3a088d8ba948101a3c0b39d50e73f7d22bdc1583615c05a8b073ba90e8724114f184d216183ff26b022652c3e08724e10dccf966d0bf888ec811280169b2dbbcc7c1ef90201ffe7db47a7089f5e29d69f7bdcfa9b0d0605d5300a89a213a5ab30cdbebd8002d66404c8fd4bf65dfb481c6ee1966c717f1c8c13182017691bce0a69808f2e00c0ed377d000000000000000047255f02000000008726b345097dbb9886e4a7e60113564d878408ab096a3a8ab7bf969c0065b7520d76bf0419ae8b5328b0541ac4791122db15a6db984cdcb49c2a22dc81d3ff7be1b8206a4d6edea5af14abf980c2d122f47b98e5c263729e7f96d6b83d2ea65a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008740b96c6a26c7083e8f63b25346ba024c45ffe520ebb5054a280a2667fa1fc23f4830e382089caf838b5f4f5fb35f75ef4320ea7f5a01adb86ba41d3fde170f300d893246a106f0c9d11e8dd3c8a805bf10d2ac2a1b00a89d5016d08aae5959a47eef3853a8f0c7bd85adb857419f188599a850599d07b997de1f1a35b4f2090210b0b226d1ee8f1169d43e5ce8e607d3bddf62fdfbedc32a32319addffcc30af031950e9b9de1d78d3141a086dc929d76c49bee32ab6e2253c4a1701be0399d72c0a039de004f4a6edfc8c97ec02cf2d614c089eae6abe02f9397ba96d82bccc616ea081779a75bc94df526f63990603e4b03a1210177ba09d7891bb623031cbb6b30218ebc2c02d9d23d034c7db35839d95b2675a7464cf3db732ffd3c111341d12ef032eb02752395d002ed69e51d8782d9701d58969a423f238ccd3446d7a00494212020753c575845af217f3b8d4875d07cd6eb0d89d661015ff59a7915ceef4b1da85032fa4f30ad1edf30f9a3c3d9cbd67e6fa5f6e76f23c7222625bbd28b469792af503155d8a1faef869438737ed630396cee96f787403cce1f0f9bea3234b062c7eb12ab32bf5a2e02cc9f8c362701947ae4237a8f3a8a7be6aaf21d913ebad9364e2e1015f7aca809f338a10ec10af2309bf1d033432a5467d4adf0d38aaed3846cd3ae0452d21faa3432e796844b1dc044c5213cf4fbdc7b2b906dfb927049de84a667cb5372aab06daa97fa1f29786aa9dea67cf61ff4e3fbe46ba6929fecc9b9ae68f9e0a495912618cb9aafff880762dbb55efc9b433dab9611994c30eb569ad742658b9161a67463e8454963950602a66b87907788a50e5024ea2770458dee76357cdc2b1353990cfb231fce7866ff837425900720333a403621bf5de541b880a77f2d107dc7d275155f44925d989fb2e094775ef2937edcca69f2491795ab5d1115a0371b8ba3497bda6cce804591f9abbc30c90ffd035c88c14ed94eace909c1c2d91a6f064d5d56755452f594dfedc8b6eef52d58ad466c54b98a272545462246a440efb1764fcec7cea382b8ccb81472c50db7c07d88a65538f543825bb4d7be3e9b730a1a7a85140b16aa8ac6fd758bf965c9724c7e9a9b07d42363b74f966fc660db4e253fa10a2c6eb8e4a4812553f3c5a4eda18469660ebcf67a0db136101c1c005690dde76d28928c34f3d2ac3e53ad7fe4297bae9da1c59370b03a7a22ec307fa317b2a57b3ac3ce6475f5524be73d62988b2418e80fa7172b6ae3e305e82a71b412bfd311527ddf92a0f194ec5e906a0ea1357f76490b0f0998ff1fc7d89995a228c0ffc5d285e7ff948ac536da8f04d121fcd106188f3a429750b46494a4751a0d3f7edeefe009e3aac379f81f16aa1846e9a6fdf7d45f30d573d308f9448f3850ef56cb2d114ae975e11b1dc10da2fb4c3e70fce2300317413e9d200b8327b613e8663c3d64bcb0ade4e6cd04e4de4a2f8f2e9d431d563411128956f82a925ef3ccbcf5876116266c60fd716180d25aea66290d6ef88198203995d0f77e50e898fa78aed5dde9986e2f3921954e072bd911010aee08f85d75f079af86fa92967f82bd081b6fb05b67fe01ba617a79d80000ea6eab8a36ca7b93a389a32bda83dc8b782c2ab91a0321ce9d90ad3175569ac9d51b700a66acc99f4aa38d1d8cdc6e04f4e2eb0b8a0c1e216ad99f2c88c52e066f485a4c84269b7caa5d6adeb993712a8824b4def57f9db6fabf450e48c7c99c3811dcd4677295cc94e1d2c355ea99a717f52ee25acddee173ba095fba09db1665110dd1f6391781548394b1915aca5cbb6b3fb16c6f493dbc339de968a0529019c7be4a380b53c5da4b307001995858207ede06502961590146fc52d70d82764e6c8a8ce9efa4f778522d7ebc2c1acbc382d43d1bac39731a3c43e8b6c2cd03b89e263a5e493b860ba3eee088fe5b8e92c9a0ee4451751b9a10a707a1c3fa826bc060d1d725c9aa3440607615fd6fb669573443bd2086341447ce4df0ca2ffa4f2eecf90edf679c6b021fdb6436d8c2ca7fb9c4fa474571b7341e50c4387e980086fdf67a6a8df2cfa819fdf8dbe4862bbaf17b16b81729b39915689f1eb05d21d84c4dd2ac9ac239f51cb76adbf05730035384f165f5dfc559bc90a1f11df93099ceb5bbe5c2f290a776ba23e2c6b160e4dec3daabc11e32d5fc3e19ab3da080082d217aed980d6e3e4326706078dd0de9e8e379a95f95877c02b2a23256f76cf3ea713c970e3b49d81bef491a4e03dff16ca3d7b970a525e7fa4b69160c8ea4bb50c505cbd7bfdac3b2a673f11e7bcbbf00e12372528c4c14c68db7fecc22204a0a298731377def74fc603e73318e84c9e072cd2dbaa0f1ee5e6b4f765e51ad0998d2a1fc7456e3f59f95a58a111dbce327de1aef6dcfb06", "51005151", 2, 15336553, "4d03338e8a88941c762617cb23ff42842d629435f6c078bddd828221c41b0c69"], + ["e2fb7816037faca9171bf1fe9107fbcbdb8e2db6cd54f9e39c35ac3cb38a21c0f4faaba08e010000000352ac52820875f4e7f50aa2ff4ecd9ef33fc8c229c97c4257603c62d998c420a530170b6154857d0200000000ffffffff49b63bbe9bed7ccb2cb17b15469421a843070a96bf74f72f0418d72c7d979b800300000005ac5153ac53d6579944049936e0020000000007acac5251ac6a5171a882020000000005516a63535164f78a0300000000035265519fbc3e020000000006526353536a00e1dd6b1e030000000000000000a6d38604000000007b497adf6fcc109f03105d1a8e3b074a2890824f727dcbc877670178bcd5709ab80a0ce66faff5413745ac0c7fafef8a6a4513c2a516c804dd758e5c27982f8b9be8737a6860493d91b5982db8f1fcf8c3abc86bb050f6c040fcf9ae913da35d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000409557fba74ece85ad6167bb4fb9615a9ccb2e88d870c61cafd8931778277b27891981e8d14b71436a455ee38e1fece27cf14985e48ebf4929e802655090b77a86030fbc483a1b73fb8ac74ce730dbb6beb4dfe0b88b185b76e55229ff1377e318f29dc90ebdf0b66f8c6876868da8667401439acabb6d19c3b3b9d8c92bcbb902076d3c42d9b7b83894ea3e85bc9801c2e802a56ba2d3c9e6fab961f7cce8bc7802247149d3c947ef01da81f25d2edde98bcd3f54e57d02e166191c1b02bb6b56f40a07d2dbfef427b25535bdff6aabac25b2d53b13dc7444cd89111905f9fa106089b98a985c29cdc0dd3ff4cee03dac33b895b7f26c610e57eebc485bdb7032a7b902079c1b9fd63a4b996fcbb8bd52f6520eaff07d48a7b48e32b3d1da350321288e0218f7221cc090ccd61ca0c1da2d5f69c4784811cef82dbe9a149ae5def7228c19021b47c7e95aeeeefde6a79e4069784fe53291ba1fc8912dbe015ec01916b81267031a76d7a2fec7b5c6a0378dfc41eb11138aa4f9dae83d17c7c54cbeb30a734c70020bdad415eb8dc5e9b43cddb2a8548652081db1cacc22d5e4622be0df09c16eaf7f2317d2bd5ee6fef506dcb46276f170443be8c895eb21bc9165916c9da273b3c72cf434071418d4032ffbb36092216ffa40e8c954d61127290c8b2af5c8f7e1f603ad72084dd52fd5af8eccc330076939493d8d6223e13e285f335bbf14afa800f32fc5f05bb4365b7d6e5bda5fd086863dbfd1b3f95626430257ee8ef6ef700089ba437e56e10ccdda0349133d3502e0664984920bc9d9fe94627f2724483357b1af24bc1606cd02e1145a75b05428fe4899d4447eb5a2324748f26f1e97300c6ff8b5c87ef55f0d200af7300454f17803fabf17e91f23ce1cc5eecd5012ce698611dab5e816c565e075e30274ea4ae6b3eed56b9dfc08c8fffbfc62a6d24ece08882748981e5f4fb2b1dddb1b77b3bff02e6a0dc6a42b52d66d379453a89374aea43fe0141fe042dbac3c2f9bb27f8b5614105d5c97e019e0b8dad4a849ac88075400d0f53f8dcf64b877d20b8b3760780bb5519591f9664629006b77a738af156e06b8dfcebcc984bcd6f5f5a1d5492e6686012a033af5178a5ff68698a25668a1f4c35d5d4c31b4208cb3304dde824cdaecaa896df7368d4916e9dc8e1317e68ba34354b34652cda364f13e949a23de8f35200ab0a283182d8070683fdc7af70a26d8694595841a84d08744c7b676b616e45b88865c4c8f6854253c753a445494c1fffae278feeb8609af3d0050ae18d7de00094798d33904c232ee960e441301ec48caca2aee3e63ea8c83295366964944f22aa7751d6cb36178254618d503d43a74445a6fd89264903c50661101a444704a12d2ace5083af60ed8b48ad4c64a72a3e3767bb188d6d17b8fff64eb6964631bb1d3ca451425e1208fd2090ac01de708aa7e207c73705c6ba56a8e075521267bc8db9557f7ce96ac86442b6f6fdd7ed78be189fb1e33027d58d4a61a7dd438214db8c4bb9692b11c2e2d06e1837f58d2fa70af1b522fbb54d447b7952a5fd00b415ee5eedc476bf5d0f80b8edfcc637d1fc74a300390f10b0ac0d631f65d6b8a0296aebcba9b95f5d416ff91bf9ceb8d2fae9fae9061cc029ac743bbafa55c179fb15b831ff28082b6200d1c63d38ccc7ebcd133873dfbea625535e3f704524be4fdb11067d82c8c93a45701529702b5fe632096ea4102b9461340f206636fa00642fbf8e321d86b24814af33b970dd4b2a8564e4b8fffc4de8787067ae2be592307a8db8c4665265cca9de16aa95100c856a1d1bf65729eec533d439358e982f01077a6944649496c781f147fdc7b3aa675af8882b88141cf040fd3768d97fbe965d6dd63bc92e296a692be91beba9c0d1e805a3ca0b700f3e8e11017a89deb599711d1ef7a83d3a44d46079271c3db8e95130f0764c1725603f46c5ae48b1dfb67c3191b4834778860c6ed7bfc0757c32df27158ca4dd6608a26b644bfebfb435910d249d40aff8357f973ad62d8e9362de21c4b12c38def222ad7c423fe6c2804bb4e7ac0a7d73b7128aaa1f0e451916c279f5de7be79b35c3f93caad4eca4623cbf9a0f8e96175dae1692d8e9e5a2d1dd19d49538ee4fcf41cff98d20393c9721f246d00010098432d45554c302613235dd923a1f6fdc969d81fd1c5a2c64a72b6e253b648ac7bc11ac8e9d2373f636aa4584f6370a8abfeed18de2b285ac69966d601f68ddfe4a6d0c909e1c39ec50e06b3f50996ca8abb2b4ad4000000000000000062d47e0200000000c0852b83d14540bcd32fd08a79e40594194fc57707e07790f2a90d84271ecbbdfbdcaa648293a1e9f31de1acd22cccbef5b4c423982e773482c41cc74b013bfb505c8d5d4441c05989b4871de7dde9b92cb5f91d286f93a450bf9eb2dd3c7ca700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000059b9af62c491de88a15fd5ab9f8818996ef7715aef8cb7def969b0ec073c5e10327d0a8a27cfb881df32ad5fd638668bd43525f55e7d14814c6b01319e113d88311cf53860f613ef7d08dcd4ca1ed1743f9dee6108c41c8b4f84a6996803b5171bfddbc141c16555da1903bec97f8b1a612680e8323e7417be05d0f468f4e650317903cb795e4a619ae694088752278e7d9d2bcfe6f5dbdb22a9892053ab1e22d032052eb0c654f5287058166ac6ca62ab296db8f8bd679b1d1252cf9139bea0f440a0098b10364bd50e2ad8c0c3880b5e3af2a8721432385330d994c7ffbf5c303e639c12b7ec5972fa159a899b85fa9ab2764c5fce46e6919ab7840200e02ed76af0212e3f34cc4e8df69907581c876e918a3d126f3290622ebb45ffc8a91b59fa79803008837d1b7ff950cc732c73f4c6fea7d230f414bab447d0faca3a23289a5c6a4022c63ef372b4b1b9bee86bf6352102522ef43c975ad4f417d9609017580160fef031d1d7a6241dcaaf2ebdd2d8e5c4977684270d656368be126d5e75c45c64087d0021feb4910a90c119b8ae4820643f649255137e0d8a06bd269565f1311acfe1c497c23960077189c066df405a3711938d7799a03c3803fbaf2f08d40248ebaf5e987ffc2ae985c353e7cd12dfc2221e72c740cd2b859d92dfed32fd11df20e30ad6d05cf06a6af9009b55f72ee424df2b68a0c64742fedcc2a1b6cb532eff6bc1435a927dc9340c8ef70a2e46a832e49dbd30bc1935bc15195a1454168b0c7c8f0ae2918f6540e4d6428efab5ebcbfc5d1cf18d2fb9e8cfd5a6a349981ce4e123153e29ccccd1819be437cffba67d6823655bee600ee28478febb25847d207384ff8f2813be4d0e103f70032b7ac7a142c16fe92cc80bf3fd8c0f737221a4f96234521870ef03a323f3bb69f433e66af671b26d929e9184d436893c46bfcfabe8d485daa538eb49e199b4c3befac18bc7e22becf0691a5b055c9863b269a23c97595c0816fb870156f81001ba92d0128264e079903ed4caa64624befedba681040d9f8438ddbaa8cbcd843938f7dee98b5d2a8864d3799fd56ac9c295b3909a0c826777d7b50bdc98688e62658b6c38760e74bed6f751cf151ff8fd907a5a29a3ad82f98de37995821ca5189dc9ba1b97f7e70067219ba7e97dd58fe39e7546f8946491c746f31fb9e08e3bcb6dd6b6f6623867c6496ad3edac493c99d9b46add925b75036f07ed07f82bf148f5376dd7eb84fc1eb5ce98c00958457bff2698374893f85402361ed170f86c578e8cbb85243395591530a63ce992192ed4f2d907cca58f7148a0e18511dd50c5211a5dde87776bccd42b8d903f2b149db5d808c16253459d66cf8d92650fe8e5098d6cbceaa55c407cf547f4a1b15000710f9c6398494567ba8e065fdb31a032c49c907e1b2d63aad2aef6f1270e5b82fad2da4a0938971bf0afdf509b035eece3befd1924d944e305f7e07fc1e7d6403e870f3516466c73152ecb11a43a8f3855787c9215d7c429ff38e9f56eea9b006ac974a85256eccd68839c048063048ee30fcf4f67210a68c9a3f27ad5b161985c297d5027a8b886081bd8b71c53aa6f2a17c80b0aaa59515a2995bb60d80f2df348af28eb019796acaed41482741f14977cd043fc6dd47ad01855e795df50b9f41997db5c85a1f80159ff85c164ae8b512dd42aaa6676315c880eb2a6048cc06e8dd4730a3406950afe6953abe56b10123bd72f3de7b7194263285bd493b197b3cc9f6bdb95cbe109e6406e87ab5222763fa223fa07f1ee576a5bcc3a501f7da6f6670d8665f0fff7065bbebecbf7ac5bc15a736846e7b167a0278175254880412a1f7c76aee1f786344741de34c43bdfe8dfb48f7d8bc9976de32e92635122c68703556617358f2e12cc41e685bb46cba2990e9e82798aea9a8e1f5fd06566805282499e408323dd196dd8e132a0bed8c7c85e32652b9ee5e95569a38479e76117fa7e97f7e61a76a56cb5a1b37c68546be5d35089e08c89cc93ef828d7a331225a0515a321fb4e0c80f612d1a57b1c186f1ebacd9c0c4e98387379feb1491fd811027dc8a6aee6bfecedc7347e307b244a6b7ba4df6c829e635982463032fbd4e465ecfbbbc5635eae29dbd44a4bfff225ba499cf553e28f350f5f38916ce14e665fd2dbf8ba503f9ff4175eb4d7766255e7318f1f711a38210f2fd9e3005e7846ec57207f45f57b7b2ee2ffeaec4cea18e578adff8e2525905c36687ab4c30141ab4aee52e36260a1bdc5a334d97ab60b4f730b0a0000000000000000b6ef5b0100000000dd6c1cf0776805817de92841f33e28e1b6a0cfe363001ddccee4731f7986bad372de531702a7f6029ea3cb74d825aa57d4adc34d7d5738e2971f136a4521f79816ce49970464946df2945550d1553e71f71240b0b128580181cb4c69b4e895e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cfd8f55bf25fcc48aae8c612528305a13f90fa786d7771e651beb01f56a9974ccbbdd79a0a08ce4e795f4924778a3bb3674962e9c5e292d637691bcba8d1efd5f97d26b5ce77174e9688a38956ffd5ccc2898113ead5c17515372260a8e4c581729fe220b161e932e4dd647c208c62aa930099bd361ad60f3ff2971c4859b998032cd24edf2aff2032fb92dcaccb79f0abcf4fc95d2639ebdb03a77c66ec2bb92d02057b6961a38c5240f71488dcef449ffc3c633113d76b426167e3f8349f1e9e110b0300299973e2657d05ae3d46490275939e74165b005add956b3d298b5a25cef69d88fb649671423a451a8166395581e7c78ba66f6e9f06ba2825b27e18de707d02248be30124a66f25af71e501f9efb5ed499b4f7d1babe6c3807cc1016ba13605021310d7999e98d4e39ce477ffaff92d99efaf8a5b50122ecb6f1899d0cb831e94032bfcc240226d382ea940bca45ea0d66bea9cb6b6b346ec4a3fd435fd5174c35e0208f21bc8e1dd55f1615e7f8132a75ffcb4ab4dd469c111e3b883651b4273637003011c95ed9b24f928c48c1e5a850c5513173fdc2afc70c75ccda97a9fd40899872c8a7824901a67684759e6c61ee16e9aa684b5941d1211a8f657c1f616e2f68b02951f3ec06f30d86c254016f253fc3cd64380bd85dd7bba649ab0d4172840ff3c8204535b56e44555a9e6a6a2046025d0a2e736fea56a4b74ef82698fd3dd0a0240e9a10cd7b6f0d04e356cebb11e58d90c8d94940586d6cd77d6e356d682d2e0b2cd0d59b50d41015537133f571ef52eae6b5f40e601ea97206eb1ff7ab6a640e25f5bd68dc721eb911e3eeec18476305905154e709d35558efcd8b609cffd13a3e9c406f571034fce8b0240c639314d0997e77ce94eea4d9748cd42509196d4c70d2b09a43f448605585eabbdc08685cc5314ca97ff05c1415b4f705ddb98cad82b684445c9bd0c632a3dc724a8ede79ad4a06f0ee2c7468e21bb7d448fb0d8a9dbca613d07a482c0bc2fb0b5bd44184b23db8d5696be65954948f7caead31ca455c14a964c6cf589deca31bc885c0ef4fc8624ee324b2468cde54430373af09cb08945d5f3148574985cd6790510505832030095ab0022abf2626cb770ec99d57294f79ad50b10e6489152bcb6e74e8c3ce28f0654ecc3c5e7cf0e38c92fd3ee63abe3f3ec2f2afca527ff1d306e80117e6e6f387a722b56c81b5fd9f5c33a7c91fd9b3c80e8216e2561f082204f1c9834cfaf30c0c7ecaa09508498896e52fa00d5968fa0241fb4e561135f1110cef491cf5dbb50f4d2d423b7f55ac1c1d9877d468fbed03105fb4b8839d6d11a9e7aadac4bd91d78ff67608b743b3ce746047065e4855da0de5aa57ed3deb504b4ce2237775f495bb76730f4dc35f69226543e60f4db8ae4e71e9b202a0ad9982c2939e562539e22f7335e77b0e950b74e9e85a99bc21732924c9df502cc37982c2b1ab1acb6e24aac7162c78a996dc65d771dc863975c3079b8555013ab2ee8ef2f491599b0e8ecde62ecb5a1e380bde1eb45ba2bbe274eb5c56836be6547cb1b761c8e1726f132483db4a984767a34997f02b6f4d3f8b24cd314f35d42ba0f8280195a4ff6dc93e6d8cf04f1a48f8c77932901c9077690f4da0f464a58a9a62088c6be6c9002b3add3d2307cb7532b6c18d1767fa10a187dc2c5c8513ef1288d17a11c437899b937d61fbad4ce3b59545caad894578dccc95f967c7cb38cce096e0083806eba95c57388d944c88d1f328e839f71ac172f82b00927749179cde185b13a9bcb51b1fc1aa4fa1d91436ee0ac6335f57b81ccd3260cd9d95d414626b268e160f804a1aabec066b975f4257c09a8198e0527176c321bb262cbfc6b028ca40cd232a56133e097a3ff6de883d183eecd2fc677f44b8649a513ec67d7fb55ff2be83b4f3829c4b5ab13787d291c5ff28dd6384fc516a53f407931ceb70750b921f145d058a4a5ef4eb191d6862a17fe938117c1a1bbe93a46e0d87e0474481ea870f869777d21d63abf4b35f6e6c77bd9d6bb17a1d4b6dbf21e0a6877823efb775204cdfbdb8bf9fd6916c9051db6844722b97b987d2ab19e0c50996aa675a241fb26a404b344c9155116b89a93821664141905fbf2e04c5e102ad29dd9ee91a21dea423ddc9b2165b22ac1fbee83d638b9dfbf558d872cb66b6276cd4f0b155b665477eb8a90304208a4304f8fc7a6f90008b976c4825e008e99242d11216444c9a38e52007a9555fb2dccad764d7d514e07ba9ed958c4f9398b4d85af29f025482b39eca78034752366eaf94c4185e61e202923f39832a93418080cc3b6bc5179ded213b0d0747d26c88bc0dcc1a3dd68c266165bfd4b9ba5b90c1f8715d6f411dacfa31d9d754dec7b698d0658af82ec18cf4357665f36da9c129eb006", "6500", 1, -2040868206, "47c00cff81f5b3cb68b3f16bdfbce66e3ac964df03357ef1191e603f145d9396"], + ["030000807082c403043fb8aef31aa48ba4f0b0f71b62dbb33a251f61085321fcf782f08c7e8c9c6e09000000000153ffffffffd4703d1ac51ff50d6dc906896c107241e42dd7dbfce196aa0840caeb6c9fe1420000000006ac0063520063ffffffff6db9176f51a0e70232df94eba54c197e6aacc1287ce5c5b020c93ff2dff754d80000000009006a65ac65536363652ba6d77f2386db0663457d51e42ae10fd6d16537c632350ac950987dd5f45a06836e2f69030000000965ac510052526a6363ffffffff02ff58760400000000056352650063ccf66c010000000005ac525352ac00000000bd1d8cb900", "52536500ac6aacac", 2, 714631551, "f74f5b8c04571b07b70b3f84df2e2ff482fa76b5b8ab336c611e38f22d6d3f60"], + ["030000807082c40304f79d8615bbbe14bb913898bf371d6e626f015776f7e7ce681be671242974cae4000000000751ac6a5263006a55678886e1c85aa6da7bfc8c7ac8fa26af6f66b2b18138584824dad6c59c44e326fc1ced01000000070052536a526a53ffffffff09c603f59ef6f9144bde1d6757087c9ce80659b95561907b7128f14464c990ef020000000565ac53ac63eea828f1eb11c23182816b5cbc49a4a9ff1139eef034798c4c7212f508f46717aada11b001000000080065ac53516a51639bcab20f01ea76e60100000000025152cca13bc80000000000", "51ac", 2, -1044115562, "35a4cfcfef2143d78bc92c0bcaea4584c830330f7cf3b00499ed331917501d77"], + ["030000807082c4030154f4633ee271a674c8feba643ef6f7f36ff56f41b939bff8672120f2e509cb0400000000086a5200535263acacffffffff03c43c6600000000000056484b02000000000500ac52536ae48282030000000000000000007643eb6c010000000000000000ed7e730000000000c41bb2dfa15d9b0ae856fe1727f664fb127b08801dc9e6c738c50378c01f2662ffb362e6c709b786dafc73ad84718120350b51593399e6a3adda4b4bd98fb645101a9c6d2e047d4420514697c032e49fe86b43d82120407701010d4b7bd4d69600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ed873cf75bd7ed050a52aec4c7a4420a5899cd0375494de7f7c3ea32429f66bd84ea90ef5e9226b9a8f07d5a4a1baf667104a27a798b13c6170186b31bb806c9dc1b774f32b6f38cb3e77c2425b3bd7ca20822f0da2f3e77845418341b92bfac9a01f1278140a104f5f5d472bbd1381bc77dba0f5df5a0259a602fdb8a030257032ab1166e32b542b12de0da0867501b796ed7996d0ac85ffd5d29af489562010f02214455af1c7108474275f4d4ef4ad608a5017e256ad6602bd06e0789a6686ba20a0133f133b91af83b183ce31c6b51a3888d1423fca209854b8f8d4f72565653d9adf252d26b00c2b6e5db8afc5278ca499e66be03f73502a1b28b6e7dc1964d610307eb807887ce05311f930d8ec6b5722343f7b3c30eddd864154b43db1200a2010304d2f01c6956cfc42669a8d0e73da96c9c36557df7cefd2541fe3c1be3e6d56302172f6daf87bf7aabee62e7a226c778f6642924f2fc26f379b504eda7f7512e50020025e31b91bf815598297676a881caadcc66d016594f9a0041ae1e187692a923031671ed4ae469615f1423022d0790f7b926afcb899965052c1ab1c02a79bdf0d9ca19fde86b4e6b4f6cfd4e430c5bc0f54aedff13b1c1ba3c2f3058e1f1cf60c1f0f913c13522f1c695d187427d6c0da2419232ada413c4d5321ab1595b3cc127a3052de6e954b232c161886411550d1ebfb68271bfe1b6a6e9e9889092f05d6b4342043c62f7dd91f0072dd107f941ec18393b7051a3a1282617634c59c5ac967cf626d2a8abd88f2a7afff712d31673254c9abebd346e708a70226223d8459c220cfbb2de104ea1385256587758707d2984583aada80e521ddaa57fcf33195a44314e92d6c10133d46a4f2bea050f04762474c6e4e9d5db830bfb17c2b088d394e0ffa220b551749026d9ec30a97b45358fce43f935b4364add8439898af61513f70f12ecaa6ec8ccf1db6700e74582bbf1175f039d256f9913d0147aa299ccc614ce356b2de944ce023ccaebe85bfe933c95f831f99b1b150f81f195e50d88d237ce7a5c11da638f7b494b7183018de2f47823dcf60b2a4303109d31ab88920614c3ce34733555debaee16041ce121bbd85831539ab2fdc05fef10214db760ce6a45da8dd922a8e4e032a7a07027cc6bd123fc714b14731b64b4264f0945e3e0dd7805aa61aad39b338bb614a7da3d4eb5a8179aa373ecbd9fdf97808b39236effaa79a916c5d8f19849d6512880ee20b901c973b6517bae90d9414bb3bf2fd7dea71b461092423145ad4213b8d1f6f7af6bc868c758aac6c81f6a600cf6bb2513143bf525e2151fdc741cf725cf1fb76799af18aa271b687cb216f02ec2739b83ea7f6f797c9e7775583dab036c093454b79dea55d9743a88b6ea2c5df892b8d1db58499556da0e616084a610030e5442b7be775bc0635176a8d171ad86fc5662a258114b4e01fddecea11e84a810e766ef9260fc5590ad86b25fa7b8647607e0d24ed6dfbccc57dcd94164f58db6c29bd02bd4388ea27b2d14023c62ca8c8af9e63a5ad9e1c9a8474e759ae23895ebd05f1e41b07daca777ace0d0b056a97a95ae598132743375a382ce4195ec512657e0566bf8721c7da9d008dbc6ccfc32b843f221d09affaa94cf2e3f0190fc6371a27d677157ad19b163dabc563a2ac3e71e2eb9e79835981506c31de68a9b7d054f0324d1f7b6749269fce296a760ff6b8f1a0f053ec8ff586c6a82bb471f9b5d18fa977e8ba42871775a9f606dc8bd46736aece37f09b2e3af3d24b8803430b39b62c21657132352c5a5dcaa6e4886fe15f8b1b337c3a3eafde04fae3891833cf3938fc405fd215b8ab82d4937ce9a4917f4daef6ce2a86464593dd8d58f92b26b17d417feeed411d821148315f5834de7f03bcbc10fc886ab63aa7118d157c29eaf20dd654acf04302289ee995132b749eafe1e95430cb6e2c9433fd3fb34c92aea77c9ca7317a07a0a5ac50beff72c82c1d5b0c56a27f6113ad87f6fef0d7144ab42bdf5c06e3ae9f8eb5dd88cd7a4bb1adc3f54b83f783a70a452e6a94100401baf3af73f296a06bb06da30328dcaa399c4a528b088f974c49dcc438ee4d8459a45599d65d54f6ef1a88419cd147499b62692fa758000f28a54f4c48415891f68cd5ecb95188ed2981da42eb7981e247f8e766d5dedc1b74892bd41f5c04f094306a0e7f92b741c820a8dec796af61707921cf206eae9e157b6fe7d1132740e07173e3afc2489a0bfae39d7274c56560400a59d17b80455fee72770210680d9dcf9ea4dcc6ca2245969d1b929a0eba475cfd5fc24ed2f2a4001066a5e591050258342f8e82423bf7667e62362fa288437cf03bfbcf4b9a9e7b7cfac5f8b29643afc19027e5927438d1b71f88176fddb97d5c9738296e76c3f7e810e90990b", "", 0, 469432155, "ec1d33586644d32d91e1e9c3c9fe73a5b25f57c600eaba2055f3d876aa5df946"], + ["c5e18e3804d3d954f1b6a67946a1632a5df20fdb45f23e0d7f185e8ea3aea9625b9dac4dc40200000007536363636a5200ffffffffa08f63dcac79a9c7fd3defbf7b320232abb94661f6eac78fc83bdea1dd476a930100000008656353535365526affffffff966a8fc504559e6ea95c0e94da65dc0b0861274b8e7d957af820311086dd224901000000076a65516a535252c342976be7efd72527bd581adefdbb6332fa4334c3c0d7940d2e441b4bf9955f0f6539cc01000000066353ac526363ffffffff03d14d97010000000003ac51634ae3250400000000066a0052ac6a650407e30300000000045365006ae465e1ad030000000000000000d744bb0000000000371ae7c76495c5a5c5f3bc76ea83ca9f750fe4c7e9227571897a38818b40f3de276932b736e31fdb622e991293e98870b8e7e12196fc09f6d8d9c85f45796606c4604f30d72f8faa4bf116f33b93eb753c454b7385411f5b5cc7894704b2f4df0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009443afdf5f1eb9e1f18c544bcae4e6cdd1c950058b3543c02b26e780b98b402aaca5cd67ba79d7288d6ef694950c5ff744769768d384920e267762d7de5ee3d3e2d4d0367961fb7a8018afacbbaae4a6f1a52b9fbea3fab0bdbf8c1d6dcc5000ef403186493ed58a530afe1e45ef4f9e7078aa4188d9cc05a3bebbef6a181530201273dba59a229afc933d4a891095a51105ae7d37fa4de244f0920dedadf759a021cdcae71a465bd6f8207366b341e2e809f81b71066035987236b1d16796b6f4c0a08f29470045f232e2356438b726dadbc5d2d71b84827d3764151a645ba3776edfe7ae0c484c2bbded6a4bb5f4aa87d94714f7d17e999810de758f184a295ba8a021d006314412034521dae062a41484e5f3749290c89ffb53f263781fda76387ae0213460d8f238ed57664d13e70450b296916c9e5ef4e00701b4fca230362b9d8d0030bb020e1618a8caed6276c7cd3ac99dbba1ad2429c20e184c2d3fc48f4c0a065022297085ea3ffa962e0d642f99713c345881ebcb9131a09b374779302d3126f6a0203a17c2170e2d8cfd330cb35c598a7c31796fc14380b0df45b0303330088a96f40f196e16b3c55ccb4745991204d181d844ebd44c1643501ad1276f10c7b5061550e870bf7aaa021d0afcaa6c0006b54eb55ecfaae1a9723bf6dc17a90c5e55db144bf8a0e10a57495090e2a9882328650d6b4f3f2046551814a5e60556c13f5bc08c837586c729c80ee5ecd0a3bd8ac60a7f2ef812858966f72cb1da5a40c61b4fe98a9713bf3a6215b158c433631097d831bcc41dac6e1132a0e87b58ec2a0ce8f7c6e66c2b99fb4902edaf90b840bfbace43406850e42ba822b35511581091be2e6380775447980733e2a191fe95f94e1c04b02d905f078eeb51a7a7dc024a8b56d6d00d6fe462c376bc5ba39aedf012f98d9a70c1e49da7d25768aa74bad1a9fd625b82377dabd35233ee962eb2ee6c471eb6b17d50d30ea51b1edf7dc2aebc569dfa65e2051294fc9b78aa7c9f65820437da2c8255ffb86d8b0442c83687fbe5fefa7993086837298dbf986c2a7226d16353c83050b6fbc03f13b94a6d184a59e8b350a4559fb36bc69a3d1c0be6d6abab26adb23ad450a8c81980ae57f32a1ea02284e17d84357bb615f56a2690c449f3de8a282f746c9f41b391514c5784ffb704080bab86236d83593f25261c02bdc92e85c1919b9482a48e926960aa2b78ff6182c59cc7dc481ae75efcf8ddd57c929f8ba29d1e99b6111a8b82cbbd12d6510744ab1089c5d1c40a0c558ae1f6c9eb70ea9165e7ff4ded7df59153f5fe545027b713d1d1494f1e686195d779ed5353061fb8500d4fd8a09109db341905a6de538971a51dc724f54c21ba872aaad352432cf11714b0e0d6627b9e4f58f789bad442af9f7c0e23b9fdb2ce047fd6a03fc7e139e48d54db47e31efc1220d18354e9ce127700b9d45d4ff7dffff61eaed62594eeed9819ac29519e5ff760c108811f88e382266d4ce975e226f2ef0fe684abc96e3bd32281b6a90396c61aaed6e02af89fb49d14e398a1e1fdee520e6c6212f5c418b1605b1d0e8b53506e457993fcb43042f3bee1f8976503f9d2bcbfb3a6ac185f2e39ed360a81099742ea837faf9f4414fc54b530c0be82e9ee3b2cb1a427c084b71139b13b0154a52af24238ec1bf43cc3c7218cda9eba8aaf55251dd8c75359154b28685e79b914cfd2db16bdb35afaa5358b2580a58cfa70c8e6f5e5a294d3a81d686ea3ad47afec675b80d3c27f78e279df2067040ad854229ce7545a4eeb3ca4874468a0fcbc407f5845181dc7c789345027f26a055e2b846fd52c6354574068a0a4c20c5f4d4826f9957bafe6738787becdc1921290b0317c2b98d00e2d9539a78c6b8b8f669548b4420da83275ce56e15a160af79ced56bb649d6f61cd07830bc9c0e408190404dc7b6fef1dbf75ab29d4999e660dcf1858ddd8380245fd914ccc95ec4bd3a751516ffd3001cba201e87711f09198f16dca09d7f9887a83f9b11a809ddf8f20519e7b3a51e176b74e06ca3d40b1b9e70058e5c88869d8b86c52302175046b1eb11da22f7ea3e30fa922f49e7061437b5303a1f92f81e3b47dde03586fbc5867b136e072eb0bb573bce4839cfdb2871b9aed0f819ebf0a9dc2d35e6ad5dd837eecfe1a0842f5acdab68d6078c24913decffb0602f841e12a93f013fffb2a35731fb066188bf2e1c7667ef0a28f480529694e462b05a902f649c5231591b944ea03e1ee2a1a0a7ad9a1d61addf47a45073a8e5d3f602000000000000000000000000f34771c6f287ca428e4cef532ccc54cbc1b6ecd06b7c0360ddb4990c2cc62dcefb65250ccd7d9c8baed9c8de453f444ac1a7d38466e8b5645821f400f949100dfa7509c09ae97689bc8d134f9e8683091c9b9d85df254bc1d2470a0cc358856a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cbceffeed2ea21dd6d51c52b3737da7d6d7e64e657afa091a404cd2f218b68b07bea7d154188509ab86c7661a2f0a8e69a260a476820340d24767b170de12ead47c8f8563f60035994aa37fc1c55885c004d4f528bb20252c7aa8b24fbaaa4e23257ad016b57fef7e999ff7dbcff490b2e42e366fb98178c224fc6bcf243ea0903223bde17213d42317255e7923e896e2d0dfa66a96c13d6f55eb0a99cf6cac788020dae36af4b11d138e42553fff3efc0b0960a46466d269773518e20375e6a57d30a08741bfd84697dac599a3f41a0222e85613f20654bd36904960dab925abff46166b98fe3039c64f6d9cd18757ed3e64b68f7a978242e081e6b1c45c066f16d9b020542f3f5f820145b4029e4465b18ab20c97ff47649f7c904ea1332b01d0afd4c03248e15c32bff3f7aa69455357d9b594139abf621ac2b098778f5e23836589a51020d4cd9564864ab9d57195a2eecbe4e6acfc0f8b2f24de0deab8c3f922237ed750220f8cc9005bfd716a887140687a62bc953cccdd54f55e1e74ade073cfc9985c30322f2be75c8ea07b796afaa7efefd2eed4f94aa06a8d7377738d724f20c3cd7519b4870b6464e19358e955c486348e91ebc239c1bc7d75646cec9369283f813ad04b5a9da2bfe20a2154a2bb1aa67b6a188e1e3ebc8e88e66acc9cb12b116c9beb711c97628bb0d25c02406c12f7ffe27ddc9d8747e2e1c85d6b3267da7005cb55065f5bf31ea2f121537ec444049575af16685c04d3dcc90af9ecdecb41dff45bd000ffd636d891ffaf56dd92925a84fb4c9fb873ea9df87f2c1d2899076d0e946f812d3845d07d65637cd7cb3359027f646183fb798bd6d871c24f740d9c9586f043e8a421292f9a1e169c0109283a167b540c270701591ff5fd11eb81ed0139fe1157c5dadc940ab29e1187ac4df44209239f868563d6e63d17a2684ccd317aa6e875778fcdbeed1af66aa23387bd1866b9ac5534d2ea499e01d07a53906ed13e3146453c555923c2b83bd6d4e8abfeda003a0f6dcdcedd7dd3e180df510caab580d978063b420560abac1d833b93eb0888f8806679c95c819e7c62106dd0825c9f7730f91a01731182b59664286286d5cfa26bb34fc1878a1626fd222c8bc7d0b37dcca2a4f354ba858fb06e053440eae689722ffe3a110375e87a9bc9239d09a180a01b5791ac6f14d2f7c75cf351ca7a1181cc313a62b0431d6c3bb8287f8eb12d4a6ac2763ba76ad3e32dee3d8c2255d11749344601962c3f7b17dab066143f95e07b7923044e3f63a5b6ad4466e30731aabaa3366fde9b4b491ed0b3ebaf2df709d79bf2e37906a202ba80a874042502dfc9d87c9ae8141ed31c13780647faadea4fa8fcc18f5f9e35d03ed7bbd93fb7816cc126aedbd81de44ea1f9dccbf745dc0829ed04c521758cbc50173df50fc175dd6a6ace9095c903dc6b6664dff2941ababaa6c057f37310d6894983f07204748a336f45a9e5a0bfea2fbb935a50d25eee1245d73c455164689025c0650c42fbd1fb50b8ad6026eb522fa9e13efa4a41ea48663e9172e6b09b28cc4c60c535f5e002b913681e322b69c3ae4b71b9528c8173ef8cbf0d451ec2087a769f3ac46b123d9dac97a67031078bb3161ad44011c12a6afb1df510bd28b8358af67f91a75280579d191e54c0af6545856a3883772e1a1ab446e49843b47cb48810532c0e5f859fe8dd982c51c6baca9e59c2fc5fd7c8a0e050a0bbb14acd80f48d354ca74652e4152fee7e1710cb5e228b7821248d6ea20c811c0252da917cc27af57b91c1ff9d9d7773ea37eec07e9db1f3175b7a86eefd8b4da94100b047c09f45295518c2e0544714ed150e6fd80deaf9554a5a0594b09de87bbb6085f7a2e28039f1984d4da009455db40593a37bdde4abab15edd5fd24248ae2159ba5375bf70e191ca5bfd34c4a875cdd2d5e38f6ebd58eb90c06428ae6c8332624ae1da5b48ac21f78b5ccec8b4a8e2c7a18a10d63ca039e5ca49407b080365d30123aed1cbc8b42a31d9cc3085ad634192847cb4a185389209f6d41e54a9642af85fd895f082cd5351bda39b4bba757117f6c666b968772ed23215849186be118aefab519ada3b0cb1da594066c65c661d600345aff7eef07b7f819a682d9156917a68cad0e38d26d14e134c07520b8eb17f51df04f7510066d3ac194766d777ddd87c299e401ac1f66c140197125cdc6987f2720130f5046df0586ff4fbdb0997689a3abfd403798fa4b95f7ada89dcce33739a0735b534dac454eae1e92ee847c2426477e14f05000000000000000000000000b9470f30eace849e3e76e5473d7b4b3fad05bdbf3b873334ba323a4c0b6d6b5cfb991055f144797030e8ca4e05cf55ac95b3a5070c98dbc38e627be2eef0ffb4568fa09a61bea134297f2867c6ecbb95802f209f624e4c1974962f9b9d595e4c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fd7bbadf9c2ae72958b47f59cc3cb7fe4ec323903241349315d2f20cb856dc96ba8d8038185ff1882218bc7d9c673b73c9f604a87a6a92bb64fe8514b69f1e80537a9611af0575ce65cea32045385cda1b53257faaff82aba7a6de8b4f948ad401244a61ab08e3118a0c6ffb61a529b1a6ed92ec6bd342dced669d932733ebe3020d6dc64458d05c0dbe7ffadbbf87c3b6c5eae9db990e58f3b3e89f9ba8c55cd203054b1e9b87d6566600cde4f1483965651eaffc0fae17c05dde76ece6fb9c0f6c0b02cfa3e36f86b5858666437931dd55af57d23ea5b84ebbda2aee8fdab0925741be2456ada0afe68ee9763ce17b8f859b603bb84b386622a20b358e48fdb8e7e9020688bf1cb409a493eb8a6bfa5a1ae17179fea046212672294406aae1dc86ed9f03053723fc0f1d9b9800bc8a4df06ffe1fbbc0df87ce5ae0e6a2a7651ec01a0bc4020eafa5d092a314901af03d26809a5e87909e767bc5a6741fc0e2cc9f3fd8ff33031506538a5883ecaacfb3872ab62648d3591179457ef046866ae7d630c5a32a10020a6774b93f9f3d11ff5fb1952bc5283e42b04f7b4e1832098f2cf1e9c86b9662bd606381991041b04f7a373282610a91aa459947d3a1f30c835b62fd81238dcf1cbeec0a9e030b7ba47d6797062e288917e7e2e766e5c532a2645850ddb9a2f3135d808b90bde84645b6c5e4bb6bc6acf0278e91606a498febdbf8a76f077e51d4b1ac6325454d5796785e73b7528b81072a92889e3dbb08c2c476e167ca2436c7d862acf030a771d32d59ea100a447d2771539c3f06d34ee09befa4bb26856e1f98edfc30a12bcf4f05dbfd28bb996a3c70daa635cb1bad3607fcc82bdb4d3546f5bc4fc2fd044a49b5f819a7184e89c17ec767fe025d3bca8d0c08da2ad7cb7464e8872190a08a6bd9cc1231f01657571d6ceae8b93f06a9929c6136626ea689648fea7b7092a67193e395d0ede420f5e8e1ab4cda3f57b312517d37d005d3b192ad7bd18d7f305c5fa2f06d4b81f26180a60b8616dd7ae31516cd85b9a92c23f9c6602f839a64e2a36c0e6faff7ada3492cbdc71ac88ad0e308fb05fcfccb04fb87b3f9a9be84b29af073e96cab8358f8ba5722e982375e481bed0150853b46201f13743184b182b382a7ef626d31a941c747774ea4a1bb8f42a4327fbdc1402856e45420eac08ff2a754576fa8f023487fcf6fca4e97b42f8403b8ec2f65c145ea6bced373fef52b127d4a04d14037d7f78b5efafc139b118f9ca5eba53024105ac299dc813a6ee16ddd4c3b2783e5a1df3d865c089f6c0e503317062026951f2a2a3b9bcd38228f6be84ab7e16d14986e8dd2f208959fdd0ec806c3dd7fab64e7461a455d3724575181f67f4a40f28d7dfd588277fd4bd74bbff8bf189723a52fdd86173d062497d7a21db81d3fce6f9ad4b055fdb525fbaa8e79921785615e4f3955471f7dd4bc376f75ef97a55ec0bed07b06000e11802bdad04f6c64ad9404e1e19a6f2689779fe8d73d2f5578201aa6b1cc786a094e83d3ece180707447700eff2f5770aaf2496b71ca4456ed62637411b2dbd74d21a2699ae7669a5686dd42d4f0021a9d90cbcabb32406f7c97264d9e07686189df66240b5b351fac327f82b98ccd5ccfdd625e8a8ec0db1a58c7d78fd94975bcaefe1cc000b0fbfa76733780b1212bda0d6af66be8c1712559e2f677cec8f8e85cdb3b55491ab8979cc082f59ef86df4b40b36c17e728158d249bb4706c169acd3a33af6e31c8657c06f61f2a4b54fa61d1560b015e793e65f544cb9b031a4f2ed41513eaf6f86940a34f6a7a414d8250f29a3a51c73916d350bab276d24ff8d6928c27cc0e5d1dd276917067446c5cdf005d201fdd534511f60e224e4a42208c8570ccd2b0fea3aafd2fc0f134a58d4327c42db5e6e623b5e944c1f6634785fdc2cc056c143f0cfc4df98400324487b62cdd3dee0e40f94d1ccdb1d2a285c8701a4ef7de8e582b101c65070696422a64732d13cd1dd10b37c840cd1dc503ce92b3b7a63821acb3b387762d9da02c25b88d2e21eb69adf8d73f499a05d103cd2a647e4100d7fcb793e5f5ebe1bc43dc47dbb0dd5c06300c79b6f5b91a3a349f1d536dcb9351a9a3af18f5a9d69e96b2b2f863c423e3fa30eee6bcc673933e0c5f08f5bee22cad7a1ab1f0ade0ff9d28d12ce30b734decb3ea8d38a6582150640cc1541ad99f137078892f46a899d8096efb83325951b2329c0f18ea48084a0d7c9930a59d9a4f9f36d4dcd588e35ec80ef47df7078646be6d307c48a9a8357ae7cd5fb357851b3605278b8a006dd637ca9ab98bd971dc008c9f40a7ed94ce8914c423c4fd9b84579c86290d41c2ff27a6d730692fd7e9ecda97ce75621f30e5995e7d51a6b85edf5483eda994de8d999235a48d4752dd35804", "630063530052ac63", 1, 83222442, "102a1014754c4018fdc97f61f0943003b6851305746b0038c5f2ed27335cc64c"], + ["030000807082c40301dbdd0ae62090ba884efc3004c47f21ba2b21fb7029ee72b2ebadded5e28ae8a901000000003a546066033068cd030000000003ac63acec603703000000000800005151516352658bd446050000000005656aac5200494907648019e509017a947d00000000000000000000000000a0896cdad7461021155e3a2a369e8dfb812863a35874289066b5fb139cb6920fb2c9c5264a0d374879eeb00f92c903ca9069188eed039341e817563a2560d607db7a68ce06202f917e2522f7ed0565f58370671563c2325320922a3b6d616f82000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f98e30fcb42639f3cd6b13eb1e7b4a743d1f213f930c56d9e47b8482cfbbab92477bf62318af34386288467b0450bb56a8fcf2def3d7654da00a1a0351da2fbb155d51873a24978a2b4f760809484ef7dfa6582cc2d2b7f494358d2c369d3fbc278b6f1338aa74246e620e770d191174b002b86b21dd9b5beaf694f3dd3efdc03228f7ba36eaa57bb258193561145645b1117d85ab52ca89204074dc3e1cfdc72020d53a12f99d0f730f56024b0e5da200cd795f23fc4ad4aaba2ffae34167ef6200b045e6d2c692bdf188974507824a98050917c1e51e64f499d39a3c7576cdd86ce813d2e1dfe24e8c07a248b15fc68d1b1beb2e2668f176bf87cb97308243815240325e633ffd8f5a375b636466216b735153f349de83cb8996e4cee32e4526cd40a03059b0264d194d46c4746a20a06d350dd2e0aecc94dd62fe67ae2e73f425db6830216f0348eef50408873a60fd69b9b311a5eb45a9c5827fe73c49b753466e7506c032dbee8e2c11a6615d9eb08e40a756bab74868dc9f9a55cca51f135758159dc5603137fda6541f803d9abc738c74685bdc89006addf4555b55b17706dde9bde107b53469f55e288db4a465b4edbe02d4f617346d67ed04a2644addbd1da08093519dc73bcfee2ab59c828f4a24d22e2faab3fec38966d36b98bea5b02bcec0ac562b3c1c9e498dc84017c5de4e5176e4784f6c9b14fe6603c466acbdc407f394a1813364f225bd61d1093076186e55494715a8eae0cd2e0be1486587ba64447c206e14d8d18f0c52e93dbfd5a0c1fbbf17a951025ee9cc19639e78f7a6492fc1a11c22dc2783d80addcc7da707ccbf748fc63960354b46c73bdd85b372e730e4ba954a1a82c6eeaa42ca6c136c52d401f2043d642ec9551561bd2f19446156c5dccff95db29ad6f1f966f84bd140d16f0430aaf5435cee1629093904067f14d523421c3551555c4c425860de63d83361662300c02909e8acc2869ac391d45c8a33a1deeaba17d2b07cc90c058077be6d24ba342e77e57bc09ccbcdd3df73729737fac0dac0f54a970e6b0684fe3642a717a461e0975687fc7f243f61816a5eb1b05327e3f9223dfdae311f95601b265c80b5e4e4f3630c8ac3d3ecfc62947ad3d81b2b4e84537452e7343dc9655c90d9e9b87d9389d1a2a74147119295b2163df78b97c234b7befd33000016d3331687d5192be3955153387448dbdd775805792406d0d033b0626cda43d665fafd5b1a3233d4ed7e9cd15154a67d411b8cb8e5ed4fdbfe7a2510e557c0f7a2a7a37d65f1ff67e8e0b870ee7b3a8b8d4e1360fb2c6097d7aa59037ab42fde2ff0a16bfe0935a63f914f9e717c5ec93dfa2db0fd6a46cea25d021ee2f42038cb6a3ee6099682ccae23334fc25725b85ffe1ff1211d2159a4a396c2a28e34542eebe27fe2d7787d27b98c4ec265d33af0bd5f8cf9fef4cc36399ce67096256421e236f581bbddfbe2cf3af6009dff50d141f2a496925d1955a136ba377aca173d92f1ad60c7a90e6a31a8f8b6ce9432393fb4fd86527fb5d31250097894993be4826ec65272a86ad7c291bea0f0bb0d5d9b2e62e79b14848bc3d9082f7cf06de9e2709a7d21c4f28ee3358f7902f95e0559cf73e64c5ef927257cb353a5f507b2eeb0efe6e18a4da466f8f480da1909bb52bc1dc3d26ce4cfe31407fd1c902f24c5a606a092f3657561be19acfdfa178405c1d60ab39bc2851a0ee4cc67d2f5a597c4f68eb77ad0a55be80f464693e5c5092a34ae6e1747eb191df1fa077cf84ef7dbc9e96a0b36ad823b5639325d073b9016a38b393c6e9aecf7e6de7630b3c627fe5be75c309c68b4512822bb0379b375c27912a7339a058859d4678854d98c5a6e3a99c7ea830a19e3337e14b4f246a5708dfec3c0fbe15875cdc4d25bd6f6a5d2958ae1d02dbfbd0b0c4c41d31cd091ff3a7d9bdfea868633eff31413a791e6d10030222e9d133a451787b6d5d4fab03cc49606adfe4c7841c946984005f6248cf912c3ff0b8600318b232896088f35a185fe32bf6aa6a5ad8d62e5eb84001fd84853296b712ca6e0fce94969f5d18de85b9b0b450a977c9896f41c85862abcaef14c919bc2ce70ba6081d6557e7eef304a6ee20d1158a94199a6ae84a84369c2ddee54c184d31c5f17bea75448e6479293d8f65b5622611919e73ead67ee69bb6e2a2d4be6fc71d2fda2606495692ed8cbd522352da871af5d581d64601d5ca65e6183dca94f4a21dba9906c0f66cc01f856d944097aae27460d7c1f251bbf0a5739da61684fe2595b3079fde154ca96a1dce9cad2dbb2d11571c3ec792dba03159d5ac48c804d15dbbf7dd194c36d26b85bc7e3f7de5ad234e7e95844e3be75d4bc91a7d315a223f679cada324e21e2d5a9ab752b6af427e56cfdaaa6e41ede8847fac6203", "", 0, 1500693994, "afebb5557381ca8619b4caf2ece0808347b186139ae9beae94fa4e1ec8733055"], + ["030000807082c403041e8bec36c2d72a9514f0cad1ad0862150f2c203d492cda483dda63c4fd3ea1a90300000001523131c0500c7f965ffd54d0e466d4f30030f357b7289478cd14f71765e138366f27f7e89f03000000036a53acffffffff43299b4123bf12003bb7b3d52435efb69a6e335c72dea6964532fb1e82696a230300000007515163656500acffffffff24ea31974988f12f9a2b3f116582aa56b0a2c01a053eb5b443b5db29821adb4400000000076300650051006aba44835004d0ec590500000000096a63635252516a0063caac49010000000003635165480687010000000007ac51ac535353002d51870400000000016300000000b05b1b940200000000000000001a308200000000005a62d4de496d0a71d2e0ca147cc438e029b167564026ee58d92bf510720483058d2ccb0acd61f90a689158af80ef426bb6ded3774d081f9b9e27e788d7f0359f3d5a863fee5dea234c46314f45bc65638c8e8ee6be55e816c5ca250d507a690c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f3b404bd4011da479b3667f44450b4ce64fef6b4c77eaefa8ae2e46c1baf3f9ad78b34d5d3a5ff16601672f0317fbb73dffcac5cd6923bfb9d0fcc5e3cdb37b3d2614ee1f8d0ee45fb6255b2e6e5bca4632b8fb40d334ba3baba6cc2515edec20df2ba69c940681bda4cdc062bccee5e0cd9b953576b86b28a602d77ee89b0a002037b88715b7135658b333cf6b7b135e6da4f9c914cffc19363bd775c6bddc06d02298518427e11894fb8d48ea09094e1f6ed9c1b975750c2f1f7e6cc709df228520b036039c09f7f291a7c7d0522b96b41b6fb4747f807b4fcd169a908dafffc0b61e4a07aa3c16954e77d393182eef93e700fddb287254eeae31f87e0616400e2bc0302bce5ec349e07de076791284b9ffcbc1ed5399abddf031b2c6ebc393b4c180d0200558ecdcbacc94e7e5233a8b16633a122befe0c3c0ab3c53b766072767a057b020f578f4264446d5252ee55f8ce75caa2bf1197e176fc93e47fdd0921ca6122be03218b37402de7517588e2bce18dc34afed6a6aec08e1293a5d1998cafc8538d09022f364bb13d1133d48323ee484dec99ec9bf0ab93b1d58df2c0b75bcbd46ea60bcd7b27ddb247de8c3eed8161c7d6522925e0889c6eed6f60d3b2326232d9203e7a837af5992e78ee538fbc735750b36d5fb17779495fa7a52d032a1b611ab7a098feae2c627971e6b6cf9bae1c580c0d97469841729bd942d888cf430620a7e3b50199d4dd24da92a4df89600ed26472571bea608aabaf2cc2d0f3346f3d8f6be8b42cbdd3111a53e09fbe01f0e1c4aa8e57c8bb59702083b6a3f28287ee2a544f03d8bcab36e61454f3f834ef668ed7d4ff4b87a6a7d5414d7acf4d913008991e12c2570d317550def92193cc85ca33fc4ba8601f56d59b1742bd7f756dcc536e008c11d239c1205c3f39b87bf36227a799c83f44f48ff6348b34539b0c7225b0a4f68381d5f61a66283fe8587639e7c53934acb23d70cd3f9979446aa57c1dfd8363d01dd0a583e4c45c4f64f28de8a8536f65f8ab85637b1a23b9dce7ab5d620b68553b70f347c6296612ea31ca643a5bdc58ec53e6d4b5181871c6e548ad5f69c09375b5cd7b3e2f1757308907649557ffa77ecf0af6e2c819853fc7cf2f87cbbd18ddd4638fad23bb196f961f00b23ec161c01719d1b12b77d4a174154840d2d31036328d6ab338d3aa8a5b73604d1033609cce537fdffee94ad0aa34432ccfb27312518abc1f60b45b408012f3d1f6da9da29147fd2d492c6c60c51727994258283e7d150d2f4558a0b5497ba91a4f886711e6edf7127578a000dae52265c309ec5e5b10878f9dc44673384cb25b902a7a4d57015fbbbdc6f11c48aa32e6df3f17709291a2f599e25014e258c9d413a4101dfc77ace79b4c84e166bbbe1a300775187effd4f45b4bdcec9566a0122680a91e9036ac91aca9a50d40e3f9b838713e8923b2962a8d052414e9639f98620a27b65a8322cd86854167a59056f28cdfded525b83d39b1f7bab414dec72e5845277dc81354a78c55b81b1c562e1121cd4b9e4b6126fb210f5fb694bb1fba9d6d64c62868ca4d54137f449e994583989fd8bcbc85e21a39f72e381f78e6d9ae468c86236b53997d8f5e8f538bbe26d860c27b5c42af6ad765b7ba440dbaa9405848871d5b3c5471eeb694e9c3b972a0d8d85e9835a7c78237a3d07db2daba8b8de5617c9d04a1db1df69ecd6cf01957f5ca72c37cfe51a76cbff500096874fb430adea7017e3b9d583463db2a9057e47db1c29ab931d031774f5b23b23c2e2c51b6c489b5001ac602b664801cdea68d2fbebe31bc0d6571ddc844758ff89ab5bf314fe725d10c3110ec0cd71111a509a02b9bd607d43f89fc65a656e756670c4cb6a3ad7d5abc318de9b8c5d579b250398fff1ad98f564744097024df791a0788b0668971b916685f4cd73a62627071da0550ccb318a2dc10e64167449a8c666872b6c87f90776652f61cb62105e122af8b642946429495409ed330b19373725aef03479ff5e374927cfd9459f62e3ac301c30b56dca43f309511b4983e3960a8c8d90cffb6a632572b82412ac0e762fb472b52712eafc3bf547454c6e560e19bf15c409f8a6e2c65d1ccf4631e9c0edb601b43628c16902b0661f7e0e334daaaf9c9b544ee5fd1e604a79ace0b89801e3afd4f41871fbdc9b1fd0fa927b1ee5c8c5f72ebe0484dda5c7410e65540b77da174bfb4697f2b7a365cf5e32e88f212f5ac897b09e5341d254e581949fac8e30a1de26e0426b1891efc7d6682fc7f0000000000000000880e370400000000d1c120e2a8f3e927c82fb9937c17836f617b1109e7b85d8e0859fc273311d652170657b7d6424d6b6a63df14a3fca731a2051178559398b9921b4779fb8271a9e26d1e3c0e78f4062605b7f92e81b162e0d8f4e6ebcfba2176b81ab299c5bffc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043273cd8a27092db143ebe87247e70b2c34899d99e8fef5ebb0e70a7c61e159e7d3e928e91cff26c454a6db78aa35ccc054ad8a97927af3daf29a433aad3180f17cf877b05cde9c9bd952b70145d78a15f807fa553790d075ca1f02ff244a5748defcd1a22033098e4d4b291807e65dd25c64029e600a46fc4d47cef9664effd030bdc2c0cefb05b4ca19eaa7348cd25f37b5e64f4754b00cbd7d959c6f0ad224703223b1b88b60566ecc30fbadeda7ab2ef4b6e740f7c106ad8e1efa762ee1ca5670b0682c64005f04a5e0d583777844656cc6ab52342ad632f30fff0a9c57a6e56a2381b79c39b774a77dc61c439b7747f946f448499ab0139cb1bed968c287efaec02051ed67b59137b78f57324d20a15c5c48d2c5a1051a44e7a4a5bffebc9feba21030c36347d33258ad90d4ac08aa3e25dbd4ac1982dbab7509c21c81fb91e08cd30021960ac5c941c8eac76400b6ddbe798daa7bf655e68681444d4b8f447d1606c3b0202be9bd269a4755e21d95a768d6ec0942b9f21f92c05fe3de78f5e0776890d3f031f041371ed23d72ff958af191e085d62ff57feddc6f26e0e322458a2c5431b1e49ebb2d9e488287cbb9022c6f12ff45fd5ed94227473c89e506b87e49baf4295dc6aecbbe3a2ee1d25526e56f1abb84a3ff269c41c2b16fc5e13946b91251d7cca8511e71aa2d805213d53bfc6365a8c33822f939c55fa76517e5e9d3f7e5177d32fac66e685a69b7cb451f223852be3ffb437926b8ce423ab5eeebdb8b67c70b3453ae59cfa19085e12c905b378813cd565d5b73b66edd737f7636cd2793db13ec0dce0d283e0dbc4d8eb5a90f247cc2313c81fcefea49f56f95718ffc308e7498c277d621066e675eec96a8bfe42959d3d210f3315cd2279d9c96a08063c625af637b3f2a8aa9b5ae9ba9c5b62b145b2a00e4dd96a9cb912d2a2a549eee2e1324c9b16671c955e07e81ad6038d0eb1549f8915ab186314e7d73c5150c098cd59ad4c61478645f62a5f82b52af3afc2bf9601fc58a9412c7171e85c09eafa4b83ff3c7565fba188bdc11504d5931119482485296d90785cb843be4e12b248f9268c2138576d9791a0e69bc3dad0cc09eafd1a92e8c10dbc2a90e52dcfd724738a95cdd051f40b5778e79ec0cac190af024df5a5ba76adb3bd7c45a91efa802274eb6da97cfa5308c05380e6ec6e1ad86d85c10022d808ab33fbb709e51c91cd5e9de8c154b2a6315c33260b696521e49dda513ebd689223c9822338f5c5e5e64cf656a122e3706c3faad7d519edf38e6450c7db280f3879766c2b9e5d7d3d0a861a5205b546a95617aaf6d6a83064ef8e9ebb79d9345b905db58addb666189af0df43b0cc14d673f6910babe9325815b4c62ff5b35dfcd664d50c9c52bda320251ddd4658040da2914ca3d63b0d7faffb01a3a0e18df1909865c48292345012f94a31cd918bde2f9eb78cace935c4b7958386f24f7c557688b8e83283607a06af48394466f1b04f4b4137724b2b038199d8f7a9a263838fd663b439584c6949866d26d7ea2fdf80eb1bb1bd3831b793c61ad27afb524cb5dbbbc9c25afcdd2eac0ab1bc10a82af38738a4d75bc69fd5adf2bb3b51509d256a64720e1451d08e28c541361da9731da931ef17d5fb3f653f3c946b371ab2608e376c0a2c2824f54e2a0ce59c7d535caa289c6083625e7f286202ace19b19acadbd474e5b5f9a2748a5590f0cc89c5905b09e38b9310866fd26be36eca8270183fa860578ca100887532a2cb41c99cf89007f69355e1670414ae0d89048ed0e859453aad34bd116ba5b5569fc1c7dc8deb894739f095c31ef9d2cdc997aa79c26558e7a404dc864e1233db47fef68139f6b9b697d02d812f8b1b02942a42dc3cd5f88d1881daab3125565b3308d1d2292fb2840dcd847dd360e6207d4abb5df3664209ccd1f1e2bec93e66f6b72f77980651b872479592fcb254d912f84c6b559664d4b9cd1a5dbfecc2ffd61da2291fb913c48b7070dc0cad20a31799a108847d8d5d9152b650d7f94b25ff89364c29bc3088a58fae9a7ebd109b0828268e63c61e7d3856772cb10a6078edb9fe8f942133a6dc6e1088339994f1884034cd0ee4a1669297c0bc2eb56e1186163a2bccfb73ae0c5a05f49e4204e47d57890b8e9272f0fccfd8cd370b5133221b1301d520b793684c520f3929ca55cac7b062a059d513e8e9b0cf17c53a144a2f6685b842f260291f7cdb2026bebe48b4845f2d1b51c82523107d459880c509e72b7af5e3487832673844c5c8dc21f7c7c82c517cb4c7e737abb2732369b3c16095150a09cae8fd29ccdad27e5fa8d15225a25fb2bc414d4f3b999c2bd8d8410becf2aa7a7865bf0e671c606781d3d9338e1c3373860afaeafc673ed9f1d12dafb93417416db3e5fdffce37a0c", "51ac51ac656365", 3, -845202804, "60b2ed69b628d671404f24a4172c1284afa1f212b73fddb96c453d41559e438b"], + ["030000807082c40301ef1f92c8fa17c7c718ff3a3e6723a76fcceeebf72297d2c2870444ff324b6232030000000953006a0053635300524f584c5b02afd04f0100000000045163ac53b5bab701000000000853536aac63520065000000001601c67e010000000000000000c8191603000000006154adf4242ff7215f2fb77d2c85bbb651619ff17ef0dfee238d8894b8bd903da85427f016bc2f5b6c522d2c477d011f18532ae4d6c9e37898e69fe2e23dcccda04347d2acc9dba8e69c1af692c2647a2ed1e02f9f36ddc4b8160cc6aeb9480900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000553065ac432b5412c5e79b587a59dd7f443840b0c9d154b2f4e4ec3a5931b60f6e431940806c6ad34f9fecc11d796422d9b477e2aed7594ae34127ea099fdb16dc60f3edce75e9fa94eb8873e5dde24a55cac4fa5146ffd6f6357d3b59be8631650a57c81e37c9b3cc1d69f5471cdc55867567da42a9f9616f84d64e566e0cb7021a197630199c1f5cac9463e76ff13f9bdf63ddd1bfdcedee4eaec25f15056fca0315c31e96802ca2869c887d3fd598f2ef5e01eb3d067a566193a5703f87733c4e0a0631f5e56725b18e5034383d7747ade3c51978a379d10b74ae0522cd45c9e6c9ee1626c3180dea97682567a9fe33080635b2ac8ec544756bccd78bf652ac7b7d02050bb8689dfe41090daaa40d0df189b160ad30de0579db42cd68f92fcb4fd108022e744bcb805be2ddfb05066da49d5260f49e1272dc16b0464348e8bab01fbdec0201b371eddd0143133a2961d9c248ef7d2e0b8f5aad9ef0051cc68690d168d12d0201c1520d4cf56f7a0a1e45e24b2b48fd306ff418e299c46cea6867650d8a1fb9030797fd5cdf8ad7b5a093a5b2216abe31e68803e957fa34f3ce33ab158b3da874790326ffe769e078daad8d26425374621213625e9db486e8d3700d7b1ef70d57ba4cc8a069bc9cbdcb52f8b7ccce52a82c1eef5a74caf4663f853a06afdb4121ecdbc26e5d06e05bb24fac53e06102decfc31d8623847404809ac78bdb0e89eab80b261cf630b2ae6a697a59d65b9856f85fe8bfb91adca30f5babb10a1aca1ef3980d22f4a5f025e3cf0f188386617c94878b0283095845eb8745465f5a53b2c389dd97a0eb2251d323fabf05485033932933def07be83443658011f66fc5677fe9bdbc241ddc10889ea8a4d8ab8fb6a9665adade038e25c3cfcc3ebfe454f894804f71dc0fca63377b480c8beb36f835e833185d768acade13d499515d80272c4fc227a0a2e4e67aaaf6a009a3da1ddc0b75eaedfecc596e9a4e6a98fa62adaef5392afa2347b931d362a5c9154eb3c1e94caa460c9e7a317ac99b609f1d78f3bfa73b1875b8a15e953ef8d0739d0506a2248f8772ad0e93fe2ddef8d181f70d2edf2900451a8efbc76fd3c807c806dd1e7a770e82fba15ca1c121a7bb6514e9cfd314335883dfaca59e212d2871b852e1f26ca999d6c38189eeb6de8e16642227137d2a466821d121451a68928538d4a88fc679a434e0efb1845e82d8dea47d987d8d13a4ea480722d31406256d2e2944c906c3da2f6603e3e5f655498b6489639cbcd4ece38bcedf1a3391f8387c60e7153fa1430e910a211fa1f864c56ce10042449efd0b3a26bdae25bd8b633061fdc627e51be624c6c43e8fba4b8da2f6d2689061f70413b38678cff9839dec8222ae881d3d286fe767a86a297dcbccc9dea1b2527cd16c520b11f973da3b7a8bbc3ca12f1f864ef8f2a912b2a8c54b5b65dcc17446165694a3e1ab898203969b25a5542c10b445448d731ab9a59e822701026cd163c12ff96ea485268e8755633d8a3255a41053edc1481876e913bb46466ec5f38523376b5728c39aaa92768a6cebf15587302ce8a0ae11b955ac4808789562ce5c4296404e1ec59cb15dd34f49ff09e0c01e5c3484baa0643a0b1796a8fb0aa16918de257b7be5d4400d34c3e193392ee8d1e025d6667e37bd770f66bd448ae3992ec2b84a8f608de375be222a387fd9e9c2f130905e7fb76d2925e691b7961b0688101504f6c685c5a7dfc8617fdcdd02e50573611c354e66aecab5dc0e096f419905f98a16b27bad4c74467c2f827e5e3b45a9f83e3dd9daa04ac0c57f62ce4a6e8fce23282c489757cbbb7ad181ea2e9fa012d80aae7a0989dbf193d8d6653b0c08ccbb5f6df8cf6e19af08cfba804a2787cc0f4b99ed5a49c794f08f79854c374a5756fb176c583e48b43f9e5cc738475ed7a9080ed9e8cfecf9eba1dc9f090878ff94ee80470228c811121d9cd85c53e76ff07199f0e2ef55fa0e1bb214979f9000d5b91c9286a850019aadcd6f1cada40af1706fcba70d019ad1ed5fd53f3c2ce655a18cc254c1a5b120708f4fa89a56f239e888230af5087fbc497594f27e4450c82628dc0e8eea7965ef0fcfb59afbb744746e3871c4cb143027f98fa23a45a731b01182fc259bb6dc1d33937853729d3e79c2d155ef9bbdd42dcdb12414933401269df7095794fa9800982eb5145871332eaee5aafea3d971e579e74c421e11996f2cd01d2dbf681965bd764ff15e893a0013707f9398565266e719d4a9434e41f81df0e0e41136bae604b2dcb22d674b4228297b8618b6182d9b990f6fcadde89fbee850cf084d8e3c8d7853ddaea9bd17fa053b6f3daea5870bb39a016ad1f8da04e6233fbf6dcfd4d8f90a15249cb264ea9878a12401b69a1855dad6877837e09354a9318ba703", "ac6a6563510051", 0, -1582715751, "d853c6e0bb141cb9e8a36810d97fcab0a652cf282c11d596e07ad6f4a823742f"], + ["4cbafb3e03f0bd92457c372bc73068686b25da7fa0f4b1c51410b9f2c6c5a1a1d53ce3a9a40300000007006a520000ac6affffffffb309376755f6dd24316a2794b7b90cc4a5bba8cc0c88c2099a8df788c0d57de10300000009525363acacac526551ffffffff3f0989f934e3ba4332c08167b3e68fc7fa75bee92143475ebff4575d12e1b6710200000007635100656a6300ffffffff0174bea403000000000665ac63516a6a0000000000", "516352636a52ac", 1, 1465589836, "83b819e5049ac9b09df7f0326983a3041614edc0cff1f09f35536bac33b09c05"], + ["030000807082c40303f79ee9820a9438c6d5f90805d41334ab9c2cf264a0c6d81fc20e10dd3c1609a0000000000163e54ef7baa35c12e96a6df46363b3ba03077bf5c7e60df01528b5ec66d23cb0727016dcd5010000000400635263ffffffff8194488f55c4d875b6dcd06a1755f6286f28c3c05521345d74ff56b45491ce2202000000096500ac635151656352ffffffff01487931050000000008535152636a51ac63000000004e71a28e01a1e5d1000000000000000000000000004656a4bccb87c9591776d1c2eeab78dd46f0d5c3eb115874bcee6f10569ab04def42bf3cf23113feea488a6d7e062a68211c5d70776c048875f4461263dbb99a52df944a64c9e89b37d22758e385e9ed929a1f1a2bfbc5b722c004d2858b2c2600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000966a5471bc4ad03f50b93956a88db8961d7437f094c92b12b5ffcba6c4eb5c14f643e357bbadca6da7f41b2304abbc758e8d764153c09393ec797f043f038f8961afc95cf6a6a2acdd2ec1bcb78946e1e63a268988ee1c977f4574aa8c5ecddb272d4f42b8a39cefab5c2bf3b52b605d095188dd3e3c7e244feb6681de0815ab022ac20c5b60f952e3c7da243438e9153e781fb4ac9a3b411b76be1a11ac88c3140322c7572c6ecc726b707cf877af65ec828b7677c8feacc19da520d9ffb9f064460a05e4d499673abe1ea10c469ba018c075acb6c48e1719ec60eeabc22f841498cb5c8c7272c8fa1ea2792ee8755b90194b86a5197e512b2c923b27adf0526d2805031077cdbb994dc4cdd1681bfeaa674b9dea459fd41d2fbf1baec530c445410e060303171ac93cb40a3f407d19f7d150c87f5266a08c92bbc87a9eb5e023302631ec032cf17ad506081f592b12360753d9ba744eaa0d456f591b5b0f1e4d953e18982202271ca888e8f75269e4c3402d01ae77348e2958335018c6895b922ce984552a0c02159c4c72b9a6a92054486436edc07e7bcf8194982deb5a169adb47301a20457ff5698bc5227fe6c42e9f7bd414ce426823784ae041efe8a799cc416ea79239033f75671b1609c0587e7a4834644c83a4025f9ce240f042723f8b0fa86bf53173c6814c4387e9145f94a0b8b45267f18ec287d72c1240ed59d55cfa3d9bae8f921d6a7864cc7ffc2e4621aa1616c7102d7bfad0a849b6a2c6ef5c1236b54e4013a6b232e11cc9e4ace57dc9139cfdf4a488a38bed611f92573463a13b0ec734e540a62e0e3d76dd34c33822db3deb49cf555db3d8059a080a3d0d862998731604ad5619b553931f8842834a4809ce5879f631fcfa03358e7b0b89b960d1a334a78337469c96c9b60139bbb364611bdc2688c203ac1895ab3e8e35692343d56979361903b91f78c83e594ac2ae5bdc254776717493fdcf4193ee00ea16f53bc68ad1b1d4308e773d011fef224d486cae8348fee4e660cafe71e37a7dc0d67a92163430eaf5c3fc901a5b840a0982ca1e1e7a0e7f67f5a0dc24e31807241561dc7832bded416727c846807a473c782b5ac94bdcd427b69ac98e8f5301475c08bac627307837c8604112a6214e578919c63e5d3defe23a072206328c10dc8fd4e6aab29223e9011eb3a0365f87f555852c5383d06d44d4ae88a69e205f3afa387802ee61bfa026784b326a511904220e14e6b3798fdd8fa4cae9c2032caef99a257fd3bf9855b0826a133a8ac821e5c7c6e729cddd33869e1528c415f7271501fa157384a447f99d36c45f0b4159458976279a2e88a47a89dc40055b42aa76db07f6276252a19d0afc7a58fb49995308a95125406e50d1226acfaad103b837dbb7d3c2a4dae968fdd0ad8c4112ee3893b0699c616d7574daae5aff67a02f0ef17b898fcfccfbaddf6831f3f191b86731d8d718a8ee451f2cb490cb3964a0ab02db1808f3b3a92dd8578c1088bce37e73269f165c10e7f3f45f3915be561a77caac3bba7e90c3807c04de7113c43ac2e4b18e976da734e0304e0dd281271bab77c17d36228fbcf3af262cb92911b3b59d9e58ed229fb5a0910cc3c3a8bfb9e39dbd492c3adaedac8b69f84a164a8882962e59a5969f37671f5d65d1158274695bcc1e2cd1153b183bac796d20763a2bf64d61dfbb9308dfd17dfc4bed6f96a92aa2a109afaae019215b8917b42af12af556b328306876b833407ef3e5f84cd654df354ef224928649b0ca34a9bcab9b1561c952bea8d38d53064eef13dc23bb65ad1b13426e1745c85481b4aec54b9c80dc8cbb3af11f43fafb5a0856b91a4d7951f3392d7fbb4833e90d21f3bc8d78f385864ac21c0fea350c371896dbd5660b9ea6d2a6dfad081c43711971c52e27cc2e68063763f74203db3a5fdf55210fbf05559922add1e828a05f53fea17cbda52a9b40215a304cab90a7b184c2bb7af091cac7c852916c192701dcb9329acd8c50b03428c269c2cacfc1310e1b1054c4c543ee3b1298234edbd00bcd886ec8996a5984aac6ab2ea8d80e74ecc7c930c42b5938fcdb974e58f1282db928302ddd76227c2af85fadf1b6d90df4b4372af98c158a7426abeb0ee1b52bc9988dbdcc9e3748c2f392df4ff903aa1213f5e601fb6a8d9e5a07be32ba7d6916354d8c7d49d29c30af2f747cc6b18e70f6e93e961c1a3b27dab02ae99fc4b52b85eb7115dfe00356f364ffe81b8bbcd3f5d8bd2c648420ffef7cc08bae1e9997d82e86b2f0b3637605ee952653ad300855aa85f6a533cafc45d6d6d345ec34d331be7522b9a3b0d556913e2ce406097d56eb2061fa84a5388b7c610a42839837e388fdbf8aa346e479265780ce1aac898cc7c1ca4ab8524444ce013a1c61012e6f96b79a650c3d0d", "52", 1, -705419897, "456eec0edc5627710ee37d4f08b1bca665f2b8f969b4ed5e05d9789321b41a27"], + ["d691075901859f2b2c85bb1bb8582c81d391b9400985448e67111977105588426bc7df9b41020000000365536affffffff0139ae96010000000000f563b75300", "63525365", 0, -1380350749, "d6fbc8ca6016c55349885fee7a35237542f5a218f38e7681545dd38481ebe1e6"], + ["f374ba3502977767b7d4704554844e8fa0727bb970487fb13ca7d38508764fdbb7cf2827980200000005636a535163c7356c1a9a74485b4d7a42f42d959c851e342299a894bcff2d6142b806987e4e5a7e77db01000000016affffffff019ef46e020000000008656a6a6a65536551961a6557030000000000000000a8b05c000000000031d8e7cfdfe65e324e9a8ee33346bc45c1aa93833b571ce85011c4fe9fffc3b100792d6b00a15a232eab988526e2fb3fbbfba050c9243c2ae94748f7c8602ee8850e9b21410648d6959e7e704b9ebf5d9c8ca6661d7f6818e72665f461bc9a5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d347b5266609a6fb3451f1cd1ecd7c290e4ade8653794e5c5bb908c61f246da342beb740dc8e936024ffe126684cd3b814131cbd2a00f557084bc5f8b8138aebdee3bdb4ea306fb3b415e6b75280783c77d91e09fd15887675c7d382f29f6c7bf2c1205aa0410f5c9feda81decbdb7cd27b28c7860c6255b5336f858f06171690229a482fb0d38dc2007a8aee2690aba38996fa2140e997212ba6fb9cbacb8d4db02268b5056c768d6cab2ae8949e468b6d0a0d0d42d7c59b9ef6bef25c6ce72bf280b014c18a4dd619929e63fb9eb699bbb9d2059cbf7fceb65d5282edd5012060c2a4ea1ced760b7eced84b71a22a7421960eb7ef843b58d82d976451bc31df436fe02128578eca32a438bd7afc5ff3bd728ea14cb1f75d9726c6ee91c1dfcc53dd8c60228d643f26dbf984c9f42b636ff191a4862109ecf1d76b21b3d48f148fbc67a54022c4d7ea250e4f7dc42968db726b0d57d5103f9ac41a3e99048448d4e2c87f9430316e2bfece2fba843fb6f1991de52a4cb06a36e12ff44d60a09ee953e1337420302164d59ee6433ccebba3284d0cd85e3b7955166989de7f38d58e1100f710def14578b05371261d274c5b17cc4d1eb4bb38766bc49a6a805ae6bf7e25b5feabf78526795f1083c0b33b135537a72b002aa2637ff949bec09e6474f3a28a6d857febe9500c0e36f37514f0dd57e44c1f63da44507574fedc6a22c570f8fc7a9007e076ffec8c6de7f0abdf8dad969e6e721bc4115df8fe63c9e04ce5febc647664744a7f3aa5cb2bca5058833ece77fd4a312ec593c19be5e3781cba4d3bb170fc7c0e4f35299fa6543b09b59d4f049de0d8e8d45d28902cf369c7deda41d32e7c2a248e0c8bf7e8db85564c7f1574c53dde367472b382967a111326eefa42c2017e516cf158e42e349e6c322ad65d34858a2adfd5c88697bdd472ee240417c8b4c3e72bb754af12537cbe881adb856aeb465ed2c39beab147a2bdc5886abafae68b069dbae1c8f556bbc2d1c0be28f6f56bec67d016e029fa334b2608245ffb9535230df54fd5700b3577ba84d8af9858a03adb98e6de636276aef6a7a87096b0b21bc1048d99687a84946e2b3485935fa5cac3869e813b8f2415c3eb5e94d2c8bf2cc0477660349c9942a8eb7e97cd6b458091ef847dd8e5e38ff71fb3bb36aaaae422a114c8761827bac10945ac7fa680e0025f18cdbe201d298ea4188fc2f687f5fa21f4719b80943a5772461510cc8d41b89766ad831572b2cd13b6577b753dcbdef8116e6e768759badddf5f6db08bd64971d65fbd76e499df85dd070b325390153382ce5df6199339ac76965bb05b41cfe534834a57b0fd78053821b86dbc165c07bb1d9f604ea3b41f1dc023a570372859bd4248345e49cf01489b718dcf03e39b20c05eab8250644d21ddc5b4cb23973ba77cf9a396807ccd7517da8c7aa24ead0fe4707ea5deb4c9f07d381d8546990676502ae274a8e2ec39b8b7f0f4789e1a813d1aaf27e2095379e3d718894f11e436c1599f699c042112476c7792b845c35b5edc107d66368ff6b364af5a809baa45bc8dd17403ea29ad4be52e2e3f47fc792948c1642251b39f1a045667dabd2446d9156fa643230da83bedb1c8def8ba382fbf23bc2138884920bdb9da216b2f7704a6c1c69e2d11e26d1cec9f9e209f42db375ad9abde81c4f1316f0c8d68e54d20d309b8f6d56dd0af84b0318eb2c96f8e51965495fa9b4e31ea64ff510c04256220c7dbea12cb4abbf77b93d7c1fd67278b14f3438512df10e856d5fc227c42424d1c9741f12d3b2378fc1d7d3e007580d6108275cef0ca63ef915723a7884997568d0708d2fea78b016fd215bbaca61502e6d937dca6e07ac34b560c640d9fea0c12306cdc30fe82c45078a49d834b829fbda67563747e80dd28b72bd2b3152a871820ef37924c077ec3744312fd094240818949104ba10e20825d6141de44656dd948a4c3b53213fe81121d5651f295c3d4f404b1d4be93034c0223e85433efa9a4f00da6693ca1a0a74e62f8cdf32f16ff4f7506b4d74e7543763f637387e7bbaddb5bfc97abd3df6b97b7f774414dffb1d8bd5d36bbed6e68214f05b65d5b8d98768036f84d65a61e0a8a536f00ce1741790524026a1ea7fd2efd38f462042088652333e97252daa22aa7a01be9dd808c871b7917d2d18d72f4ac967eb64f08ab15b4e638474cbf136b68c6f04b9d79c7d135d46ab0737fa8f0a6c5821bddb71cba956605b30a57287a22d506c065d58a8efd8f4fdb37ad1d2e3f600000000000000000e014f02000000002b33d5027586ed37bfb8cddcddfb0c79a73e71bccad24b3cbb822a5457396586ecd95beacda9d01b5b374067883140668d26126388979a516613df54a06f63355a3a559d5f52c1f0bebcfcf18797610d4a959ab68fc41eb61241da0f396215a1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007dc751439ae91b179a76f24aeab5c29e975254d8500e01fd2a44190fb300793146d19e835cfd465d2bf01c7a47a4fa528406f6e1b7c5b1a7153930c8fae0260a2180c7883ec3a455e6bcc9d0d25acaefed9090d1c01d689c904b97b1ba65b559bb445936e81ffa17cf7df2e4f684395d40fccea5c1869f6ab616acd3ffd060cb021d3c470b907cbc1fb4552fe847b703a72dd3bab6cf22886560b7bd7439f08e970315125ea45cb4f06797116e5bd0af29a125bad18feb324ef7d866932a32d98ac20b02cbd892b668ac6fe599dcf235d300cfc72d9f61353502c456bc4e5b94d40df27688ac871f02e6058ce47673397ab83f451688be278f384052e0b984edfb598a022a4c097304d583f21aabe82c53a62efdf89d405656f99e33063edf5e92acad250209e1e48665e44e4e030ee0d938e3ee7d71f16c8d0e2df669e9113e7e04253f5802269ab28bae8de4d8fc7565b1b4215363356bc7c14e705bd6d2a99467edf5d9be030f8e977e8c1462078cc5acacdd2e01cc79b0831bb82eb17e743dfd5a23c035eb03227ad33a2bbddc0a27c31375390609d6f41772299e61d2a070c395716ee86d67b29a99cc5c3ced249de0d1bcfd6830f15983aef8d0ae30fd81519de36284622f69a8dc3db12cefedfa1f39416c3d66ccd0c18d7de866f946222061ff6e576c2b87fec7bf30fe2edeb4d49b8c7361284f7101b6ef299939e0162d607a8310ea33ecb541b0a45bfd2e0c5baf48389404165551d95b4d55b28c1985310b1535f07f46a79c70cf7b3ef11b0a6e5d2773aa25eebf7546b3e6d62203d7013608291a06425603f29beeebf6610fbbae585b7de19e1802d8c6faf052377d062b63bd44083d14a610266ab562409dc80392da91f6655adc4354f051dec318bd1d55ab6d7e6ec631873981ea6fb0d7aa0198e386656c99559cd56fdfe8dc6ee02ca9b65131e3e3cfb298116f995f19dd3e38ffba96bddfbe7da2e64f191bf3b02bf9591d86c640a4a9411980436b1d165055cad90c2d1d71a0f39842073106e0057cee946ad5cddf760cddebaa04b27bf8cc4f1404be1aa3627da8eb83abcb2dfcf34f847a4516512dfc3f6f62ef987f02302de6ae554acf2fb3677d38357e58e28db87739bc0bb6d7ab5adf09e5ae346c24d4493a7f9ba2b91510474b7f353e1c37251bde873a7948c6176dc3eb3b7ba2a7f972e79329d950acbb2576bb4993b6b38390e768c1ce000c8c2dd1c8a9eef782679ec0ac643fa784a1a4e866334287b7eecad9671381b5c1066e44d3c62fcf73c9074ad1eaa78f4a2524da7d6147243a62bf735a5a3114a692189fae87e744f8f03f4ea61bd757e9b5704a0045f0e70dd860de9a4a872a29553131b0b0db4daf9f9d98552d2898fba02977b25810b9c0f7cef0b03c3a53663945baa90a5391f910a12829cf83a44d8c71f69209fd39fc5391b1374750452e690b910b209959976e4cab09d2f37ce95e4d4c2618c0bb9b8f5a09d1635c9375feaec60440f682bbe9b99094cb72d6d21ad514b31d9ea9f0123f7cc6d5c7ea16ab7eb34e9718e21352fa5647ce5f7eb82c68a903522d9b9c09d7a2f3369f62972b37c110e680c7c938f70272e13193d1b642c37d1cbf086193da4bf62aecbdbbf31d040d3fa89ab53d8767543dada80278b7db443f11121ee982b06347240eb994f6b1e4b2f051852ad640b09d4c3d564527a88911f6ae62d61ae1aac19e5f7ae72f6396fc715344eac20c18503a7ee59b2aabb4f9e17d7e48eb58d6374408e91fcc4f157b18377dbb8ce0508b7bb10e51d101e19c0fa2261b1d88880390816eed5f43e5acb9b1a7205b08299f9d4d982d5d61167c7ec74c77abc5ef1c2fdc191981300725d8f6386688c0c87bb67b5df56ccfaddd243eb849edcab6c81793dae348e4f160799f2c332d25567e8c2e4084b7a83d0f64a4cdc170f12a83e20a9f8741372a0f0184f2aeed7c74a953297a4ae789883bf08fbe06b8f6455c42a642b8b2c9c8f0c06e22c423dabf59516d6d37ceae2fedc9b9f4450025479fbde171bdaab53d5cbc34d56e6ad8b5fd7b58dd00ccf91ba53b980f77d415f60dca326a014bd2ed6f54ea6b78154ef2347a905335a78beeb629e5cb0c17653a68e0067989b7e76c69d347964967178a40aa479e1fad29982e1c1237549156c87aff654d43c9b2d1196601812016ffafc7aa20ad3ac2aa2f768d34ac2f8e45b2da3376fde24855503548a4f32865366126c881409fbad6a61080426be7a8e0984cc9b88632c5ae646bcd1e1b70cfec79ae000000000000000019a7360500000000339e7f951abc7d51666bf1ba96205f9731786c2674ebf363487587f8948210491cdcd1b5f89abee4920c730444df30363b6ea0443f093d14c99a77cea636544e65d4d43fe6cc24ffe9944d5d81c6c02a114602ec4595bbc762452b95c44139fd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065f7707d2903c76ed9867b1657be838ad57161cfcff5697176b97f7b40669b3dbe2e408766cd8cc59f7300a071c8606bb32287ba20d8c2f7aac3489ef4813a236c5cc50c63ac8571fd98d55ad993ba1dd70e4d410f5dfe425945c4e9c8b754bd066991794526d93e7de0c6e8d0b12bec4c4154ef98a6fe71010b91f8a736b45802193ee38df5587ff0dc83d774ff33e15608cfaa2f8ef80342266b5c1f956458f3022cc28202b981dd70d929795800632aa89e626810a660a0b8cdff0b8574c9b9b00a06ee78e29dfe78144c0ea048e97c5b5a6b253926c5444786c963b037b2f3295319da4470d6ddbaaca2b982aff980bfcc66250909c1ae7ae566ef701248e5273b0315196c5e67c08bf7d83c3908f2faa0f8b0fc00d5ae3ddd8c2f3cbefdc88ce3d30210a26f9044f39be33831e5ee632b1d6d6268ec8a99e896a65e52279b186c2703031e9a7fc3bd8ac34f7b6cc91ebc659898f0f48d271923c6379f3afee5e4f82ec402178782ab9a545a06d233994afc92a1b9f4aaafed2daa71452cb09a561b20cda6020fc84e0a69074bf17c628fe3d06d6bdff219736a5a9f2f78a9794dde2f959cebffc33beaa52b748d386af2d41716b11e72a81443cb96ed4b6890d7e76533236e44b189f585ad2d01025422ab2f893724f39fc470fa25c1130ca7b893a492b1a309a9ca500775be64c779847a8028b04ba004c2e5cca09ecc19bc828bb7c465e4cd13d6dab0c100fec19b727c98a38cb9eaa3aee3a5fcfe9487a709ce54f4c62a5f34c12b2185e78ca9e86b3ab102faf25b1f71f2911607452d251a05e66b9e7540629437c0237f84b0db5eba257ce854e32f8cdcbf627f51ad82195cc6dec9667cfb06a27b65a57a097672a00add4312c2620c434d9561c174417c598fd44b8aa75cc277e5e880787c8048d6bb6eca82eaaf7d2f1712fbc4f0d0ee440158721ff7cfe83d69929097f5069424be244efe077ac415a1b0d86331e9a63cea475e3fbdd383f909c8fa54e2d3dbc14123b157ebf050cc29717ef355a0f1d0f16a03891c8d4da9cdf6d0d395363ee9b0b649f2dfcde9274cc5dc2d8d9ea9d588156fe472caa50d922bd577ce76a2895484a9090e49ab672d69526af284598409286e20b92a59f32ce3237694d6e0a7f0bc2ba8b812b0b26179af0cd1c945e43866a8548c681449bd9f23c52434a0354f668e9cf9a783b36921e0f0610ee4634b44b3885d37f1b73e2a2506aa8610e46640614d71235928fe24d3b883faaffac59dbdea05b49a5c506703887ac2a9223c72924fbff8555051742d8cd23f1b7e7396ac6da725c931d6cf778286f9bb16c2323159594d8af7c7146ab3295c77f4e68722e769e4a9e6d693ae11c5474d62f00aeef67134040971390ce639b0ad2f4db5ab1fd3a503c11f3e4e559f9990692839cf5f563be0cf41fdac0830349a41211115e6d06f6e9bf78ebc4f77b1bab8120fd29f6abdb99a542e9b4bb04fc6a3f712fd4cdddbd29ca8e67e290df6ca2a929c0bc53dd32ceaab2135574734d1e290329d69e8b18946f96a317bc98979274ef690f759851a5fa635d9aaf0478ee6247f48de34a9722fb3f6b4950c74433e06c523871a6b33c4b4b8a005c509a777e0bb9fab78e0f831eab63caf92f3295e187c81577ec97004b3289151fe0edadd4ef332c4c6d4317c8043831f0c54b11778f57700fca7d67c2cab68b24cd9f8c5936db8420fa14698f72254c8c581ec72b82efc32b2b58e78d32194da3ff92d355c9a8778307039bfafb09a5c2f94e373fcbf668e508c67b1274e06eded7870f434a0fc7f219d4a8b50db4ec18fd83c11d72f870dbaac99d77da65fa5fc45eceedcd85274109f09d06ee5a08eed58f69a2a8640e8b8bde11f51ace4d9fd0fbefc7bacfb5686d755422dc255e05eb6333d5ec8fa458be848bf667089e412c55ebd622dca064b534ff18c94a5454ef294d8dd3b64b07c462c591eedf54c2c802ce1ab6d1e910a517f42390e2365bd881ab82c034835a537687132d02ff0456dc48c5aefadf75f8232b7d74fb759e57c0e7178f72bf399b455e2550f50eddb168d3359772d7156fa9b92da1d672e41c6161cb599226966fe16361a23d2864d52f4321dc9f90e1cfbb803bcc7f61c2cf1d999e4c0864c7739b2d877d70368ef23733644405991dfaf1c3351bd32d6493e70ae3425d30ed07cbe86978864d4a32d72f9bbc84f28af79cd551fff35307b623cba6427badf5f516e29e26371998ee01485763d84f7d24ef21505378cd5bb417f4028630caf038e488adebf04537c998259311454c78b46b19fd648e84aaa1bb131090ee0ad44c5a070f70244c8a42a7fbbe208eee71c5331aac1811b33a01c9136044f87e29cf56c0d143ee0cd86012c22cc3ce5b95125b01551c2ea8aabf07fc67e63c19dae0d", "516351006aacac5251", 1, -948977876, "069b8342fa1e2ed98d1779a1e4ce2da9dd50cbb785ad8976f66de06c7832582e"], + ["030000807082c4030494bc817a988068778498531fd6ebbfe91637858a8fa2a369c72355c82e01a96b0000000000ffffffff50a7aff65388d4a0fe5e995543d1d58c71970a116c7660f7be9f4c24321214d50100000009636a6a0000ac525263ffffffff49e0a5ef9c885638870224fce94ff9cfa0d323f14820a86b72b4f9e23e95fb2a0000000005ac63515351ffffffffd9cb8b426d3cf8e3932da1d1fad1e08b4a158ab66b14d87eb8ce8058e67c2a430200000009535151635253535251ffffffff025de47b05000000000251518ce07e04000000000151d9da313e695f848003a5a98b02000000000000000000000000a38d22276ff7e8db78e3061cfbfaff0e47b3d2644040dc62dbaec5314a961ca22d5704bf628698b4889a4465360385ded1bbff9a08c77bb11ef822dfc32a6ae4918ea78e5a78814cfc7f357f737178ba42a58bbb6a69c93b32ecc4951b4620af000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d4ebf242b6f789a64f3a1b9d5429d466668ff8e5d3192ee57aef7c0847e6c8e9d8f2a9818b46bcde9ff5808a59486152e1eca8231abf8bf51db941c48e57a959aea55c39e5ff3459b421ba10a632891d7f9704546ac5cee9af8d13ae09d127e020c9b00bb29b7f8f4d52da16b8c4eb5ee6daecdfb17283e197c704e230cd1a00222f7f5e88e3a869ccfbb49e7418becec571507c17ee567815510d9cb52832827021cd66d8678190acdddce7bb656ec9cddd86674b7ff5cfaef9754bea01fa47d5a0a00c643af3bb9876f9897fcfe5a747a0b861788e512fd3c1c36c5bb5ed7679f50c570c1d42e3c95b63233dfcd399055e52373e3f25cdf395ecf7ad55a0fd65b9b031b62cee492644f6370f0af3fc6db842a975d1a5e92fb6dffcdd416652ffccfd80204eb2ce6bce455aa45e2e5bc4d6fcb53ff7e20afa0880f160192105d9eeadab4022c69a4320cc78d65812b990b71ce326362acedd93d0370fce6337532a82e7775022101e832b58a24c130f0652598de21b75d2b525c54025f01332c22ec051a093c0219005548773b282586d928b80f8e02693042b0ee41b4298f447a80eb91250193eb8f96916e7d7de1d5f0b856ee538c35d815502bea3528a3b15e923049630903253d6f25fb54e281994f781ab543d70f85366df6985c6f7b22512812dc70daf93221d1d60faf159e8be8bb500c700e28bc332b4f794b1156f6199dad69810e28e2e4e946fe194a5cb8247f31e85414caecf5cdc5a61ea6114246347f266995092522983ef0e36d10ee9dba158a0c7a6d4e6cf5c5b39d80ed54307c9d05c165625001211dd9faf833bbd335631ec7fe19c7b589c5820e516e22d6e8bcba6eb1c1098c06dd4d91036d3a117e035878a3fcd785eab5874953e6caf1fb1fb661bb3e502cbda88331f4a8037e52fd514465d39281f37ac6b4e94d1f13a628b66525180e750be9623cd995699101815192514102d8475c2374fc345ff91ed8a5d7c67c5387de6d19b9c460bb91d4c2776d2b0745ef5638198a13013e962fe892ce880e1d2d1c15c8ba8726c91d8bf40db4708f12b3425e4763c855214f35073d60ab8bf933d849f42e43de32c8fd65adc0bacaa15465641c372ba76ff7b944c7618674bd0ed34197b0d49ff5ecac1ffdb9af575d5393c5b92dc928905cdd3fd581d6066a6439ac9b3030713d1c4a14ec72719de77dbb274e8e59fd21c1b457b2bd9dff639ff8fa8c369a1235feafa34f5336a310b0190dbba3ba0f936be7cb9e6a4b27a1223a07a0d061ecfb8e8019b55753ad7377c7b9d534f8cf927aa4f6aa07e62f37dae0e0f85a93cea08e830bd048c5958c9eda159d21e75ee581ef3184cb562bbe3a0f4d9e3d150c889c4648152f738e93e9d7cd178fe5ebf9b6cde62ebf9b3e61ab5253bdf1cc699320a794abd92932b745076d39316f3ef2f6d8124b9ad5b3af58a38478296e9ba21d8433483a5361e2474eb5756c32234c6d4a712cb8377fe3eaaeb0fb8e501fc291e8e0db4b4b9b66bb0aa266827c350ee622320fd12794b6217523cbffffd569dfbb370ccfa0abbe0113275555866ec32ba236a1221851072d2c439bcdd1fa8c5c68cabb3b95b3e0326f15f0cb962d4a27f1bcb020bf1f23619268193483d961b2a968d2d5b32b18b831b15f93660e802a1b115e9014596a0a1883742ca6e1c84eefca13b0f8cca1a15e64a476e71efa0313becd8dd6d39b5c1a57abd71a15b40c78719930e8401b1d7135c2cac2d68a270b41272626051ffc0be8b602126769d379abd7d5377f92465e225a06d1896682f533cdd4290411374a113b21b1acc0a097552af50f94e0cdf21fcdb2ebbce274dd352663e615ccd1f8cfeb9bd2c53944157438fe3062cc0ea5d736973f8b20bcc6b4bb23a7b225a627aa529c7ecfb50415c366a699aea9e8f06c8918a6bff823aae1b951e3da5009d5b352c039cda07ac0cd096ad653d1ad5bc7243277b6e9f72c185ef4d93ee24f2469efeaeb3c8f4add35e0c8e39199f9e9e8e1e92aa83fb829b8b4a4222910215a991408fcc7aa9c199aecb693fa63844012bb3475524b565eff648e4e448763dcd27d307e02cac583392a07f66b64d7f958e61dc65cb16ac284ca31c1dfbf450a06ae7de591ea8747d82163de59c4048aa8221be2bc998dd1725a4fe07a9d0e3bd142da6dd8ae3fd5f160a66a36c519743748b6f49ce675ea2804ab785237edbe7bc3272c7d8e616d3e9a0846d34d5adccbe892a54d6df3f63628e6429601db53b1d191ae0938e637b900ecba062ecbde0a09010000000000000000000000001ff4f7cc40530d6a66d2cc2e6c77ff3334ea40c219096f02942e1742a73ff65259b75debd9c6983a1088c0ad5a02412eedcd0781ca9bfdac4b851ec05f9f0b01193f5797583453975a41a6f532a886534bf8256b9ba2fb49d71ed595e38ae6bd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b812b88c8c2fba81ec736cf45ffde7b12f82355f5ccd678b9b8a096af8067a83196b1380479e930c840f80642a51da6de42b365ac99b381d9bd5216c371bde60c22f747e8a04c3ae2480040073fde4dc22423801ae0bea3ee4fcc460f3d9d802e5f9507e2d7fbfd3aebd9c53e5a98a453e02db70219659240e7d2fed6f13d3dc032fd38dba620528f3870195a1de1589da7c9fbbeb97832a811ef869dfced3fdd30212718edeb579fe6746efca72618c5008b1121fc1f0999953f5fba7508544691d0b0755cb6d307cfb367c54d4789c681cf458797e463c59a286302279f544f8bb109b7c4d8c3e0af6d5976d556a9b56a306422fbd1efcab8c316dc3fcf145bb9f46030acb647f116c2be383b58e19c79555e2ea8ab9869945b762eb6e663a66706e5b021d35a7c0da31e546aaa1ef8154db2b77e017bed81c5a0fd115293bd01d38c32f031b37ea252704ebdd75f8d93e4892b9c96477080f235b676e04a83a416eab377b03119dd8eb7750833dab44bba63fea43355be75328270046f96c1c0ed02a31b3d0030a902553a71612b2567a4f67f76ae52145552649a57072ad97a092987dab18fa8e048034a94b6efce2241bc66db437287198cf00c5f4e38f3807d42b28b19f915ed9a16a790280d49a342ba3c37bb34eaf3ebe015a2d531e53834e29d251a9028a8649ac84f2e5ee966a6ec750572907bfe3aa0713d638b9264836ee55814c2f19ca7a095be1a91c7b1ea362d09d62e17e997c3bd08ad092c107aeb325e4d51c94d550ba47ccb745dc5aa719b7b9744e55038c47a08eb754c382769f79ce77482bfb33c1c14e4cef9f83a8c21f12043350970dfba1cfe8207ee65642732bc32b322e25456e2ea1433b4ab61752c1a927ea1a8cd1061c76c3520311c632ca8bcbec1972b829f4013c6a51eb94f32ef4e22449b2f35becd1d082cffd9765edb8662c20014d2bfdd5176045296b96436468240dc84b01b3b7e02827cde2488d19c8c25f93d2aa9e27aa704ad38b7fe7ce338d0cb1d8b2a1dd3f7bac65db6dab75267bf66784ad501cd364b3d92e90d11f9cea0683d9b29b1df41c398aa3d60ff4dd0f324f68af3d2ae1a5d25e5fd96e18c1934f917f862b9957f700e0b09afb036e0897e77556392512aa58977397727b89fd09cbc6076296d57bce6adcc8b891f4a1ecf0d2416342219e7e19c030859548e866065b6e89c9f247dc8d164f5da227e0857148cf09ff86b88cbddde22376faacc141c30b0df88c669aad8c878d5cf00d14c62292628ee1d06378959723884b377d808b7feb31c274e84085c55f9adcfb4d147ec107aaabb142a94b046a0fd56d5119a08e3436f512729000ece361e336b282312883fa52ac6a4f9c5649aa220f01a16ce758099a7318e2cda01fd798970775c5ea8060b1403cb94761d45a08c1813b00c3f59d04ccfac866601e7ca9ff39a0344e1e7c0041132fb2e3ce3ad6e223c4dfa6cda3027dcfbffe6ed2e77da375227caa16ef89b56fb1c5e308416fc67c0386bdcebbd2ea4dd6c852441e8190927a357ebacb1e1273566524494d9a9250e05d6dd2a74d7a10f8b29fdb680ec13fb2fd9d3aa5e42cad92f5082a1926c0fd6e39678870785a3d73eec898a2f200b494581be9205e3f5804bc87aa4acad82b94d13b56ffe7615d3bf91bcf9be6255e61ee1016966f50db0731cc3c648fc09f59621e738c9eb7cc782f5c9328eacc44688fa6431a2bd2ef40e2688e9b96ecdd4ceacbb27a2bd7b3523617b2ee284efa137ff7c4727621af8b85e229df2ac1924ddbf54eed0814f40bfaf1c9915248935380f050fd51088749304a187d5df66ea9a4b771eaa0b65098f8ee4d6094c902d20068bf16ec1779eebd9c55ad4360cafebbc0262ca58ddacb8a78ecaccf7a369379c4b60e469a45c9a266e78a5bc9de2a0e146f29e082d0d9223f99ac66edb4102d5db2380d9a298a0dcba1b907d4c5e91054dc5be5c7da3c79ec6ea70e4544b45f41757f8acc2b96e113957fdbc052bf78db15f5327dda19a7395d9b62afa170fd8c25c60f6fe01bba52533b65854cb41819dc056fa7816cee9cd27bd489d06517f6549e0319d8455fc73e0cc42921ad2fd41d9d9fd34e25cc381eeaa2e01520b60ac0f0cc1f750043efe8c41a49e88b1100ff51de4e2a4e21ffa0b4aa686177516bc89c5c5909acece73c32d4a646b895925e37509025087750c359650116fca30d47f2b8020159bc6a6d73ac987cf90669bb86afb0aae16db356fb975b3b7fc4df6a81938d05e8f2e0ac56d4e25f5ffbcf020000000000000000000000005ae7222cb2148ae4121de8ff321480956b937c50866c4b61cc18b9c7aeb07e1fb09320087a9878dfda3889686c68cf9bef98da76fec8dca3fa20a2753204a45f0c0bd9102153bffca79db05928a1dc3216d5ee7148a460c6a2afcd4d2b93147b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003859cbe415099c598f18094b39966a8d9ef9afe7dded3f2997051d48651c056e63b8e13ad4ceaf58cffe211d7c6bac994177ee4be458a6f451e0b3841b941eec39a195cd0e523e21469fabb5d385e416b37d924928930a416e07dafb3c2e1074ef0c75c605096a6678c615f0b15b6910c0238afbe9d374009b25bc2516c05db9032f983ffeef25aadcfd8a0713827c1e329abe2304fde94479251aff5f97c660740317e6a88e0564376fec4cbfd4ac92989586159f20ccc89210f5e2c5a30a6a06760b03ee5068ec7ba8f03398f446c143cb4a352968e8d504e9c37c148e24ac7a70ae9a9e53db5bd5dda1fa0e110a0ff55bff28c79e1045a43dccbb7a22110314411b020214be553deed7c5fe18927f47eb93147c6ca8de0c20413a90abd96ff3dac37f02051874b725f96357974ae32c761cc18c65fc305fcc75c0f27ccfc14f3c68b267021a8bdd4b8a3849eaf3a3f2ec38d6ff406f2e181ed364fd981de7c1224a0e87e2032d9db5a03d35137c05f74646f771cf93396174926a191af942f9f87ddc8d912602266cea40133b11687d3d2bad0f119eda4240c67cff1edde73849cecb3fd6f4bfaf7fafb91d2c25f174060c71bb5d6bb07c6c4c94a6ea73dcb4ce908d58fc8f1a1273532d4f2e10633b23acadc67acd9f43367fd5a5bd3ad0f5eee9afb6c78d9fcfd2f1ad211e5d78ecaa2962e9e343e8b79da13a96e1288a46af6b6a1e2c613550a5480d834440b41816ec8290761797ba029764512c7eca9db6af79a23f9ce1a691a58834183805f5943c8f3edb9955868c024f3cfed81d1a3727282c8a21b8de00582c54d05d4a6ee56f9853c696284cbe71e71a0710434f68d6a5b7d1a41793ff25b0c38edddc3b1f838235a7c9776658daa08b9b11d70e693d00981fb014f1918192b43f25e7fabd1e46792dcfccd48f6a298723dc47456a7c4cd1940026a7d56910cfea148be51fd1ff47a652b83efcb7cb801e9c87f691025525ef7f841f6ddd0729c4dc2593c02e58bf0e01ba1d5c467634374e4bcf50524cc9ddffc9ccbaad989c6140a70dedb1b51d599cd3c14065e2a9a158d33b69f1555a2cc73f1cac520571be84146ea5fc0e55a6ff6fb494fdbdff2f55adebbd7bce926739460d4d5d42516254751e9a28e9930586ed9e3c1bfda5d9a46359078697dfab03b31534d553c3fedf19f7f9d9deff304a2eaea1da21b6ea67e8af43a81c551ce43dafa5f0fbf828c44980176e967db39be1601e6ebdcd80cbe88548ce0d13b5ca4f1f3d47377f8f93497aa191b9b608be2783e25154eb95a1335af9e1271d1813cc1d46cd566720bda6a1e1216ee447dc00c0a615ec88d9169e7a9e6dce15ad9fb1910bd4918d53895380ae155d9f63fa74566b0286f745bcb91b993be53e884f362e15ce898bb5dafb9c6501453d93427c95a661d24dfbebb5aee29a647ca5809d7961f7fc76bf127ed48f86a2ec109132dff4166f8ccc1e317e0352f9e06a52aea00b4ada602cea459596a4ebc87c415d097bac7761bd565cbdab88ea5d270cce2059070f4a963ff74f19997273ae29f7ba8da3193539ec5c9e09ade1684ecfaf798f873481f25f8181c74bd581691dee203fb005b4fbb485bb57bf82e2200c9a23a381ef4ba1cf6f813e24559a552ce02ec92e00c6f5f52486ea9901d4efc81f4f06e8b3e0b0d8ae9a16c0752f731d8f7b5ada44ad04397a74dafaed0435baf8865a0b60fc9858896d2888a374fa860a13cd0d96089c61875f6ec586919185562a25de94b5da9f5d3d3ac87e342c46ce9de5f8c871514a6d10cc9b7f13e6acc7eca72c8a3832cb4899523c63b6a0f0b2a7e337ca9cb1d7e312613186d008ad2410217453c3e5ecdea5432a62ce3fefabeab4e1c6c3de4cc73deabca99c66b8c52b09c29d9164f98223b15c3fa9a4788c39dde89a3e5f403dbfb83db078df287f03186e57e6a5fada8f4c65cf0643eef28defb179baf8fbf752559217a0ae71206994d7e11c918b9fc966d89770385994ce029dcf14c28c0daeab26fd720f0d2711add0ba5f62841fb761a506346d2375367deafc61d9a709c99eb4cd1309279cc20f61975fc44e0e413c70433ea52b80c6e66988767dcf6c755f948165d673f6853653db5adf84278d38d385023326e5d5ad18e939561dbb4c5c9cdb47b4b9a937084d8676ae55d5a79a887a53d587c510328101c0436f9d1da72b1ad7e135d4de025fab92e1c1c8ac883d5bc52821db5a63de15ebc1eb8bbb37b061f5ff539a623a18952697f37ee224fd4510adafe690249faeb13a956c580207e364b96a6ef9028fd32b74eb287ccfa7f995ed417c64bf8d2360eb3b77cea75097ca2434c43238899b66d6075b0fbfc11b830a88bbf4480284d439a2331c01cde823db491534791d9542a5fb36c5c48f53c69991d95b02", "", 2, 123707252, "cca489b4986b67cacb9e0d7d680eb72f415a0bd7c880198987e9be63adbdfd5d"], + ["030000807082c4030194639fc3c3b18fbc728e29188daf3d7154a21b651434a46d68713839ef9429e9030000000152a2e1293d049e234d03000000000451ac6a63138bdc010000000006ac6352530051b9bafd0200000000036a005242aa1502000000000400ac6a5100000000000000000100000000000000001a95170500000000e3b8253c732606fdd73dcc0f65e2c553f2aed906e5d7d4c80f5be33246dd037d7e0e5cf6d5f6d3fbf5ae517cd44c27c5694b0787624eb6d839a350111b20710a9e21a49a676276844f22637a564f4b294b0f74bfe9601976ae2fec1310aa08e600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cddaaf033dddaed2f4777eefd19548d68f4e9bd9599976fe987551f91ba1d634eb648d4d451e7e75842454effa7fa7a3bd7d9dbe99e26c6fd8dc934fe33e0f3df927be5c8d4a6af94797a17675e77fd54e7ee6e5cf76c5e277fabf535cc9ba7ebea0b298244e4a221816062cb8180ce18f831bb06ac8b8bae1e48438ab039fb90212a74d8ca6e7a9bc47fe3d6bd2b85742d3473b2bb9ed2c5b90bb02617e923e320325d5ea0872c84362019b95944b411727142940b3d25aaa871e20d38047fd9aab0b028c2a98ead2379f5b8435ebcc383c1d6ac2fe72f9bed5f732137078b5c29e7f2b18538d2091178fef493f8b191979523694a101ee88eaa576f0249a0935fbb6020766c1800363f85e80b4e9ba9338a2b73a6b1d9b2b36c86ec116a61564199928030c88ca178fe0f3bd99059c3de167798bddb8ac5ff3e012b6f65076ee36d0a3f00208bc08d139e5bbcd28bbfc8e6d65ed434d83a01d411deb48c61b4cac5914a00f022b51a9c0f025642d8583245935003a7950d0ce113484d4c0154e56d6344fe04a02136eed19c993f00c6b4decdfd87d5f318af465cefa568edcf8e997fe6bd73b5170865270d563a391a15d59a1432655f8b23b7c44f3803caf413b6884ca52f6aef037ee2b874afb8da76df7baf5f5ef9037752edb3cd8b6e1eb8bc3e66d11c4aea0379d6912311aea87068939e6a2d666389b6f551dca61243a80eae271b4b8010d3b6192434d6568fd7f1083394b1a0a9b671ad8102a85185021d17be0174e992e126a1c182a5f627a4fe660cda2dbb734800687a24bdc5b4ef1ad69372c06361f89ef600170556adefe8aa76d0368873a1ecf0f6129a73288062540b409603f48315b3e3033fe5bb7fa1b9c8f72cbbb4a06e71c951a0b6b0b524e7885f0f1022ff68982bd54139a6d2fc64b316f88ab9db96424db2ec5c2602b44b4111446c1e2602dafe13e959db16fcc73b9d49aa7bbc33e2ecd23ba776597800de9448d41d4503938ff493f0a5dafabcfee871a682a25605451af6893fcead9859846420146574e8847dcaed64347a5be791f57e2c32d71a56a3dcb86ac708fa39250b1303eff4cecba9c492eefc94a573616eb1a2e1752cb3e821316a9266f112c4b3be4951485b74a7fdce70d0c3680465db1a1aa8643eccba2aeaf6534f569bc759d7087a87e6b09693276536a8e36f2e7954ffbb285b5bea3a95f2c9e70e01f4598f02d47e3b57112e2440951102dbc75cd14786423f4e284b2f1f45bd32beede74c654f9580b13855327f9104039385d644e134b15eed20c0c8e83debfbe063f33dc873d140ef612c91d57daac2e436443f179a7cc5764cf854ef0ebbc5acb1c787cbfdff0c3973bd18f0e08a6fbe168df0ea5f486d050d453dc403c8d2f647b7bbdfe34c340568707e926d9e837f90bdd76eb91dc86162f0c1d1418291dffb1333a27e00520000b0c7f78ddb61203e21d8c0ec8315213163068a0ab3bfd083956dc5c93bc654bc88dd56f5a7043c3b42429b44efc6fa98027c1f9282568f47b4c7d5efc33e78d86becfc41d139e6c082542f775a005e722312d6b22888eaa28d7b96666378ec63c4cdbf8045c0d4563410150553bb57793be4cd6af756723bcb64f3009b3000868035fbb7b3ede62f2578021f63e161ddce27a63404a634c21a240b5149bf978db21e2bde24efe1647f03ff7505eed39fb88aa330382e143f4e6142e78e79222f3408081feaf9655e9b949057c63e668cc933223b5677d5f69af332f4436ba3e3f4afd66e8146888739fec692e78b4e8419e5d66d2c0eec197788a5e7a4a79ecd7c7b5c57fa685f4226d874efae128991fe790d995b749528ae8cc4f2a0278a1842c06869d3100be6d69fd1ff827310a988126e2960f07326632ba9748aa3107d31e41afb56809ba74e7cf9e63a20a506aea71348c17a00eb1306f2dbd743c70f04d982c1edaddb1438a7e8cb701e77a84b61e8dddd2d2af7338c6cbcd545f31ffb4e634feda835bbd4516e36cdee57ecc4cbf367dee6bfcc1a24732ac5de6ac0f7813f385f68dd228939bb4f58f6b2a6e9689f89e6abd18ab246f6134f16120cbedf44369937588ef46a1ce5fa5e1e3bdad176d098276d4d62f81f8bfdd0cbba50f54001fab480d90f1eef0f5f248c36beee9879b26109a340ab3a7cbef8f8312029698acf584cd7784d4ed219af1ebb8f27bd5a253825c38e9fb7d25b4340d81c05ef7bd95fb7511d647b70d258562d3baead0198f03cc90b265b45d33d50b4d0db062f6990aafafa9d3e120b2d7aec382f885f5ecd35fad83546fd3212d050173e8a65a93d690fdef10c476b1bfb092bd2e775740550f8eece4eb806cb1b6cf9f6732704b81210988e8f1bc053846d98ff232efe0fec1c9fd0e7a8d83a174f3ac30d200f84a2e7822b7370c", "", 0, 140092036, "cc812615036410a37b77d8b3931a74b0e7119f17dfe420dd4218fc32e342e32b"], + ["030000807082c403039cd728ace6a07ed1e717bd7e0a86301d8a3bbeefcbe6f3de46ae9bf634941e930000000004536365acffffffff2f5810e316ed519cf973d6e655e3f3da3d3460643a8ffb7894b43a0c139774b603000000056353ac6a00cdfca3cc57de7ecd0eaea3290eaa5218de5e0f7267121f97bb7285fee5fdf203d8fb381b0200000005535151656affffffff0203c57003000000000551525263536878890400000000016ad0dd5beaa783a81f035bbe36020000000000000000000000007d63a08c4b6f3e51a5310699c3d27454a81dfd039fd4656c9c630af4f2656dff658785b278a7dec25ec1a321819ac9465e63fd306ff1319a20a1c89c5abec8a21697eb9830f3e28ccbc58cb87a65ab278bafe7c108e31a8f370e04934dfcf305000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006ed85c8ddbd66806a03194ae68c6e0abfc9241430146229a3712dde4273cebd6341fbdc8b93706c1b43af7c45e723f26726eff82d7a7f0e579d43141aee11d37172d38ecd34d0b8e4f4e3f87c55aa818742a452f3cda5e02679c9e01e8af041b354ea503c4bf3a4ddf538a5c2fd895690a83e893c5aa2249d2d85f75cc955708032d885fe268c25064ef6f2412708f254f121f94149bfbe8dcaa140501e0071277031c87204843ea15e1071e5397c57d722624617a52d81ae875a9f28af0e24979ff0a05bc6509a5715bd446b82d1f2dc330c70c59530b24b6aa9ed2da7036cc9c2b35772355245626e4dbf64e72c2e73b40e5746dad529cbd345706898266fa3198c9020d5999577c24efa3f12da84d380600b9ba099020675406e633f7dcab20655fb70220a0217acf6e276a698ef4e039918e445a2af01d773d78cd64db5b76a3bc2257021bc8ca4497853ef75557438888a8a8a5af74ae987c1805313e69a8fe2e5b784b030fe0cd0559d3b187a64f44ab1a45c0f4c182eef0910e1db3d1254e933b13d9bf021dbd499858afc3fdb79bff7a540527ac93f90c9e484cc6c92fe6436cf6a620f198e8172e3f7d4a6a21c34bfe5bf3c58dc567d3471f0b1fd2742884f93add4075537a3e4ec072c4db0c079f09872eb4fcc694ce68618410755adb95f7fd68cd0c323f4ca220af43bffc6a9b1aff8cb165090ca9bc44d34197ec3ba8d516804624ad1565800da691e1b0745361ad12729fbc7cf0e359fc4f97c83d00d407d3426ce868ea702d8d9301e19546000447b027b24fac50b45838d31e8d66fc76e8d06e9e253b525c5c8938a2d7ccda58883651ada323f89b5b8058d5fdc17a64de428aab65157073cd9d4a489d656261e6e3ed1a1f78a9c9b0f92aca0257723670e5166598238ba6b03529e986df828310be9742f63e6482694026ad8e2beb06cf7d8bd6673a8baafb8a3daf868597d91998f27d987fc0bb77b1ab4154877ad10fa50f55022335d32e8071a51c590ea05be4ef0d6da9a635d5296b8c981c4a4d0d316ad924daa1b9ff244e4edf4eacd64ab025f052b301f9ba9f4641a86aa245370ae3ca294535c12728169b5523947dd217cd4f78579f70b1062c3a26aecc04dd2ba0982c1a200d8775bd74a109a92c55f6328cfcd0178574c04346f031456a7f5c58bf167297765aaab56369f47ded779298dcbac5fe79f26b5b8025c99a80156157ac1f991d1733a1ed398c3343ee095063d44d14f5aeb00905880fec46f9452a3da3afab5c2713bac1cbb63e63b9bf02aa26b6ed7083abd49c68f193e5e0e5ada8e6e3291498a65badf8755eddafeada09aa91226abc902214f7680e7a9fc9b7bf2de6ce6d06c269a0d76be670256a5ac079d2852e8875fe2b4b1c168274690fb90b923dcbbf8e0ce3e515692c588969b09e0a0b9ad3c8d310dc614995ca5c724f5cd2e92c2f7a5ae08be984bd807f1b41a4621429c2137d40b50c6a28f0301acb5d8d9399c5ab63cbae40239663c50e208777798c1419bb8cff90ea94db08ef966a15373572641116d3faf142695fcc748df1b29fdde3a224fc45a3bd18bc5419e5d95c19ca36920745368d2874ebf271e84bb9038a5473b273f816459e2fe382b4da2478b7eb3910d2bf60ee26efd38b28dde5f6bb6ca17f4af3d4041dfa2925b5bb6418055a1c0088c96f50946046f77dfb245ebade62f16eea2523c89ec75070fd0dd90fb994b2ccf3dfb275ca2084d2865637dac00365fd8a55734dc7ccfe615406875d8856c0d2460d0e09c9426df64553fb769ec7b85b831e595db292d04b425b6c1b0044114d2f633010673472781093909b6cc53296fbe46d534de65ad31786ffdefef13da9b1d6df6d21b7165bbb6f237c37044dd0b15a339ef9a513746c6511496e7d1c3ca402727d21da4aabf706d8bbf5ec8240848039d318e76c8c9f5c038f323d3460e0c05b2dd18fb9c781a34cc504d59e44bebeb90ba35f8de5b7902ca7e09db3eb112f92fb85022ba2a52e7304a7c26790bd2829f08f9fbc2581f9908757d124d9c59983f7e6d9165ca0f85695c17169fb27b739131380c0a5dfe35bd5d9deb1532cc05592eb3b10fcf23ff5329b129b038de61e5c327f2a2f16e45700c1559e3e8942a4cb47619497548f9a8eb0794b583c5b6129700271bc0ab2ccabdb1e25f7b7d69f78688e339eb72b406c0052e4f88d113b6ee375294802c03e96fdbdedcf53197774cf4d091e6dd470bf41039df2f4e01678d47a54bf13b159496fe3c980ebdb7cc986327f86b194cce103000000000000000000000000fcc2b0cfe1508f7b9a7053ebd310aa516655adf00baad174a24de6abef0cfba92cc4e2286d9a0fab83e471135baf2dc15d4074306970b507ee8d4c76da5361939681c1266d95e8bbe3b4839a91c8ef0a852971607154ab1bdbc8f41576284aa1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ddec4d2f7f6e68ff6c79eeedf43dabd2f43a280ccbc460bd10b12c7c4212569852654f1b57af6557a24a0668129be28bfec6a36d6912b85d1a9270657d8249f6659b25f9da4dc281e5fb10dcff430151c7991881303f919c00ca69259ab83046efc82873e15005637e06e0adf3cc71cd7928880ab35cc603a935439c68a31dc0208b0d3618621003b3785d8644cda2cf194924aef11daefbd7a548bb29f19b0c2020e8b681b1aae3921383329d0056226087198d70c1ee1a1ffc0b81636082357580a03720f12d88f8ecfeec8dc5aa7f6f00d17e701d45faf8ffcc455a49de67ae8016e9d269a804f071a4ed6670ffdc33dbb7b2b1211f62e757c445ccdd2b9d73e9c021631140df93dd0910e42ab6df99ae4c50d088fe03e9066f9977dc5dca9ce49460203572a3895146295b3e15be988967742d123bee4a69ca755794f39a0fe22a7fb022ed3c7506d1041fe27f5405e3e67b92e184d3f33f06486e4289b2eb252dde2ba02204f6ee93207e88127be8fbbf6125beafa79d2407c1bb1af7f4526ab60a93999020689dc632e10476741f6a2380a5e1f1ec35bc6721c0d45243d25dfb260ede62c050b1049751992dc69d0bfbf6fe62e3d14757de22534ba962679ca982fbbb27990d347573b68472d44deecd24331e11f12cd7b4487a8beead6a6df2ba2e6552374f9d0b1995feddcb32d7db9926d6e01701c95b98f7cbd190c4eb8e18348844bd2c10d5f9988ce9b1db0dc7eb72bc1940dc6d5625d36400a67bcae99259fc7db6fbdc2b696ec520585e38bc454cb49f305915a0a98eb2700ad92627dd372035458c0c854c970d01e18e6d0f67a5a9782147bdaa74e25ce77efba27853031459eb0a7db49f1a18eff463bab3c66718ed51fab4af33df6d9d98966dd02dd59eb39196785d5081172fea874ebcfabc987e52a9f1cca3afe4ee664532321508c6cef018a95d608a2a10ff31def22a0f025c8af042fa5bb66a27e47befa0d294f80e315e3e2ecb45cfc0ae07be1cd2b8a38758fe892f3d1f31e253c11ea5410ac80989dfb2d6a3f0553a8b559e83898755f6c047b9ffb8b5712602d7f08999909a85a145183ae37bd452c4004e70b5fd80e51ee3a3de04f900c9fb3e59395d45986bc05b181776899de5bcc4540fcda1143a052766f4847a5d7b6f413fd95f5cb0f17851bc30cbdf2bc9d2edee3c6d835ec7e0e08d33c2619ddb16e6d4d59ef6147c4c6ce92ce73ab34dc3a20e8e842676d5e51c973a2b0b0636fdd691888dc8425c9ad70eaa591886f28dfd55f0e346b4c6319eb5896d8f03b2c238fdd840d98328fd0d894d1b79a091bbaff6c812f20d3e693e595b0656a1b5577b5b68b9dc3109e69c2463143d0ecd68c3684f2cfd64ecd514d04dffc07c028fbdbc823c35ccb536b6fde68e3b0d70086d9c20cf1a11c1a47a4498a378ab0f745e4fc69a2923b7db6c3098e939ad2d1aa2cf9bd270eeac28fb65df9b1dd14e714e7f5e824f01967ed5429b1887e3d47d8b8ddd82272571d81e62d5134461bd17f96213821fabac6b4758152d1467c617c7bf90d66efed92744c1f4ccc7f70eb70d612c4c0fca1e8f420f3738d2eea0bc4ae70f49efafa9554dd0798c784f41aade6dd7dd5959431e8ef380b47a69e388c7aab779ef40af3b2d0adecb86e88dc4c7a8b8d74a167e94e9430254ca63ead69c03304a778d1966c6215be4315f6117a80cb7c171f21b48bb262b90f93af5f3f8d705d5dd5755ba65959537d4a4f1f447c7c1f5a16b217bf19224a732eaec728b572f2938c06a2843a03e3a5e0e4b4452a37b2c1e6497bdfbb66e32e70097a4edd95ed56f390eaaf97b782393d63a28180555f15717d055e3991ff32c08d861390d69d998d096bc3de2b86e0d871f4b2e67e56a749a7fa84cd0c5db7385b5ce1eeb4f25b5241d8d5c85cc8b15372fd3600dbbfae472cdd906234cf28e36ad4f8703496b84838d2209a1cbf8a3ceb5a7adb2d0fd43a07d89f6f3bf30d285a4c3fb6b7f6e4b5038e5317c2a7447acb3a09f16cbbf3035133152c45d4a31bd3874ebcb8fa121c55144e1677d2e2d24c03ed72dc998d28f48a8fb55939d9a384296103b2081d8033b24d1e240864bd3b2274d24c76aad8d5d7cefc8765d8f093b28eb5e0b26e1064b108575f1b1e6b9893c27d29ba663d1cc1f5f4bdac71a94ede6f4913c358726fff0c0bf330d954f5f563aab7dcf72f10fdd891e549633e8358a15d6c345e9c11e475b56042b0506451fbab09dc7b6dfd80e8c13e2fc8dade4fce3639467733809d9c6f0000000000000000c611140400000000c8987573ee6db1a8102969b9d8fcd5f40705540da5e31147dcb49eb05566f063760b05364d46f75f4afe4f950bd93cb7068d00db0e46022b74389097b18bd41539d92c28116adfc3c9217b8ae57d484be57517502b89437262b3e1c1d879c502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d79714b76c46420652aee7b5167fe15932074d692393a42195f0adb165ae026c6f564ff1c37d990c5f2d74bc781adadb255b87b9ed8a068ec422be5f0a1f5a6d85c4352c9ce943bf319fbde1efa1c3f937ed98f2e111147bbcf0ec108ad3ca7ae1e10104156f52b22a72db9455e995f446109713c36f48a110be0054696e3350211a53f396e53b87c4bece03304872db1cb990ab015ab8e8ca1fd1478f9c211fa020fc9eee2dae1357da517e313f7965abf9a25a8d960073c5b7781fb50ba798d090b02f56b29fe18398fdc808f53d939b227b406139a95590acab12668d3682a893a9c6f3cec38003dec77e9620cc72800cd2be6c421dd788b2bbe6c6dc553c8a57002183ff96a800fef6027fb443b47d694732363087ed0b79374dbff46dc7d844e6f032b8c58f7e5d787a4d305678348dd2726202ac2a406198774b85854615c69e27d03056293ea4c30013346f81175e6d036d4ffad577740155eeac941b35604392b950328f20b4cfcc2a99340b6d474bd1fdace265e3f91a10c80310e9b5b361eae29e30316149f4717e8b1855b5c01f2e0a7f8686f4a2318fac5a4a6b072d4035726760b1178147928deca348b6cb46506e5d04e59a38e0876372a4823c901833ef72c8040b7200106b8273631773439d14c3ba7996fb7be25e6d1466193391ce611539ebd73943db1e3cdb3726a6cbf272aa9dfa40f1d0193daa362a32e09767489d262a2e1f3fc8d3ee6f3d7e977999e4b1dcf167cfe218bf7d8002c93cb3aa1e317d9969f6fd350175baf9da0cea4ecdb7f7554cc8cb2ddcc1e1c03bb2fb7364bbdb3729fa579a6a49b3ea79f4cf39e87a2638ced64efffccb1192a16c71b4347e1dba870e2c274f1545e0c6488efe734d0857ad71258ff84c99a34c37c16c8e302c3319fbdfe8e63f53af48e09e094d15539239dab8822d0ce0c0e525690627f1970163870552dc2132091b12aa7d28320a9055c7a2c8fb8ee501b765310b162de0c93051d6f51fdbbfc66acf34f2aeee4d480c37d963602f06f994839c020f94f38ba23d02fdf7994efc97c5b969b2aee046beaf50fcfaeecadc3fcd85da31741690b74b84dfc98f56ad4d2658f18f8c0e9798787ccae4d2d7be417c3710335a2d0c6934d283387f31ffc5143dff5bd12f9adcbe513a3f2c41d0b0afc9d5daa08f9bc0e32797a7d943f5da272a870b33767919d0f003721c10d417d82d30f1363cf6bbc42997f513e526dca2e591a5b8578a0438846a04402ea7e7700fe3c333f11b8b48adfdcc4bea770f8379e3c8cb9115db63bdd0c5b646bd925a44c31848bb7e60322c4fc565737a61a5449f16fc1da89dcee11cfbe6fff0bd4b841c55e143c79f5959957d529e389530974f812fbc4b104db9d818a63b3f8edc44c78c5d1df661e41f6bb5e5aacb2a10c2fec54e72c040ea4260937f727baa1a61f4b49d834d6f5ca0a2651707276714af421d0c6ab5e9318fec38522c44c6e3c95e04b9b9d8d373c100ed3d67f80845d4a67a750f7ebbe4e5d3a93cd3cd820fcb01b2791f49b3ef5befb421b165c7fa00f001b60249a5d0519462d97866702878feea3af0c5d731ed12633c1c2ebe5d9fb356f023ca470b0147c0c48480ebd72e2ff8b9d5625c2950229ad4eebbe5dae4306bea4d659261c87c07414d1bd60806b96cd7d334f3968d2ca46a546bef836ddaa3752231c35ac1ae3dd26768b089c3e187b88e221a67cc5729b9f80cef8efdb21803d1a55ba071cd578ff1a2319f68f6f67aa24336d9a09ab235f51f305e2778a2af53b5decffa964268026f8ad23af54fc0339431a3049de52343063996ca3b3b4690e15c336f61a094747b13e7620723d27d321ed5bdab916c21496e582deca437a27a124572f04ff1b90de86ff2b6d06143701ad2ce8e4fa940bc3808dae736525f2682a0c42ee084178305852c40e361ffa19e2c2c74fe8903cd4013aadbb8a91dc3f95a0957959f6d77c3d33306a467e1c975f719d574dfe35ac0138daa466ba0819a99a6665a7a67cff661af7663bb3e342d532720947b2e2ca48c50e0572bc5d6eafa4f9ba4eaaacddcad5753961c43111d5f4877d0e4885c9818135b40641334001ff574ffb2a502423792fc4ea418630f4bd365c02dcdb66f31e7122ae60839d75b2077726cf38c5391ac354fd389c218162cf4b56903389f5bd525454942def50f74c8552779f75215020f69d4c59f9f8a306c7bad9f174aecafbd8546bcc95ea662d49cb6f6d8de6ba5ca41523500e3b33a83a37595ba0aed24a9e0bc55caf302c584960804a44d0f9f9f31f7bc0e8631d31c3f632545546b40a08c4fbf9c4745bc2ae7931c016a8d65c6bba7890668ba3fbeb9ff10f29715f711248be334597a091d5f52efb0f9fb1814e8b6a745f01eb68174dac058e558de139aa61cfe10a", "0000acacac", 0, -496813093, "6c8404ca664de89560c353d93cf1053d50f43d55e5c27f48be16d01fe156e7bd"], + ["030000807082c40303be1a180f1ae6662ba8627eb194c8d0aa8c0d2b3a572da6c4efff725fdf731bf501000000015292b84054e8930311aa4e7e3342bd3eec201f034fe973dc81ffa39f925a64467d1f56ec4b030000000152066a4f68663856cc8023d469bd339a7a3f4a2aa79e3cc5a4bb86feeadbdb9bfb75f4b0360200000000ffffffff04245b63010000000000e396da020000000008536552ac00ac536582e544020000000000b591e0050000000007ac6a526352536a0000000085c9476801cf038b0300000000000000000000000080de8fee83bf7d2bf977375ee88e963b4fa9b5d44012a6cdb154a32c6550e49e0923c128e70964f52e451ab189c2d1b0bbc3899208fae9afe60849cba125211585a9b053245ddc4e5b26890b42351b44e98d042f098d432faf1ee3fb19a4179f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ec597446a8b42a377cb6cf9f81f53f7b7a5d929488bd64481b1b660f060783413531fb7189b3b44908d492df43436e8662eecc75cf6921ac95b750ae69ec3e842f06a5fabda6aed5efbc729aedb87db13c230a18a68192bf30f6fa2717f1ea2f2191e7b21796d00bd14cd3636d1db966f71e1b42a7b44f6f8eaa7f69545c02cb0304e90897a951ad4acf9614b16b16b3f3d44098915f8254fe92cf52650772065f020d8ef2202e60f414aa5b0c45fd440f1975ae9b8ae118014b94deeb81ccd60a470b08addf61371a2b2b064c3d67d6ad0072726415d8d2c54c13a0841a2e2563974ce6f114febc2997bd9977ae5216cf00cc7eb6b9cfe27b4f89ef8c4442864d5526020ef0cbf609eb63b406a45415c9e5d850aa9e22b9d34ac13d63df180d7879e8320303617cdbbc133e5324da8129504718e3293a62126e0ee252c07f8cb80a143966021a52c69e935ed4482feabd27f5753cab822a06793688ac63dd20d03498b026390227f818cdb39497eddba2ef16d43dd17c1b86c23d4770cfc53418ecd947953a8903206278cb8365ce2884632fa057c8a30c4838e8e191b51e449670b6238aba264d3213416565f4247c18650838d0abe984f737e5773762e571804046ec4d9e014c2b1d90d7b478df3e1968d985059675a14e668fd0f684d039be6afba54916e15264519ddecaf48bf8092b805c8f58d214f0ca9a716666ef2e7520c3235df1a8334a57f0434cb49f94465342d645860938e63507d26e9f045a41f9b612e732c52425d24c12f8faf8bd75b972a157f4b435dfa0244496fefed32471085e28ddc83852fb1937dbf941d5439419d457749cc731f76f1e8cc164f0ffc28c79cbb4062992e0868cd744f603cf9458b8bb62239e95f984b94042b9df64fc33fb02bfa0f1363efa17d2daa8593b304da4c68a0be0ec1da5f1016d85a12441cc46e32e16b59fc8f7dad3f5fc6a20c95e6af69c20f280750ec9c7acac8a8478addc15701f6b331aa89fd1e926115f3df4cff0fd4b63990b11c9b9b8894eb08f0da9e5084dee1f33b5ae06fec288a982f55b17c0a03266946907ea5add767184ed2bb2df9cfc3384b2180c51679a15c3c92849c29ad54b634c0ef524b42aafc2eb4409e881f41969a4caf8d7fb87a0bdcd270ac8399dbd998d4119a1e977a43613faefb965aa85dea41702ddd6e7db03d12c8671def938cdc4b8d5af5111ebcd93dfcdedc24fc14187fb9258b7e61de269a08a890379027f0011dd0ea6c4125fb163667aec393b2f2fce747779357182902281fc25c7ef167631302079636ac9360e11d9a42ed592596ae0b24d08c9d163218b803a85280995b8759729b22e1d0ccda2a4e93fcc41f4b62b31f54eb36fc1c5fe88af599280e7efe46f42c6ba9818c1ec27d1b7814ee484296f5705ff47573a7c2e88c93d480aa2c697b77bdcfcfad9f3841b5cdf96e786563ebc87f7960919b9f4c8daa5ae47206dd6ef087f94e565235bdc40ca7172896060a3d74a69d26e52d0a2fe5fe50f393a184c667dc4b338c11f472005c061d4797538f8cb3fd6ffc1ae803553431e60c0050652eb2ec442b5a7a55e01e2e20357b92e64921f2383d979c42c34117b692a2649c36942f2ebf2e76c3ca1de0b354be662559353ae2647127a70c6cbedcc32a3fc0aa20bb5798177685c2f16dbd6a860c85f0de4925f96291396854decf02672e96a639d43858460eba248c5ead9d4b4a991b254d09a0d6c53ec3d09e0f21da217869ce8d8ba53280089faa50b9645129f1ee742896859b30c86ad4d352163223f96119fdd3fb495eeb6c3366a5cff6d69576e800410962f657b546eb179702ce9590957fea3c8364cb4d5b166f182bc52b56c6747ee5db0bb15c3c273559802760b3f45a0c29bd0449639a1932180af36fc5206450e859ed5212bf749518f99bd67dc6f2c922af18b05ffb0a36a59724d95091cb77ebbb5b817f0b46c0cd504f9c41bce9981def4d105a7b84cd09a09a3b55abed844a1cd915e6931b8c3f6cadd1093ff9493282aa1b3de8f1592f5bc6f302b1aae464b15586a3cde1e99ab4915d2754e925fd5fd3f9c2748ee0644f24947ab7352215b856f95ea24ff08883efc315f55c7204366d13bf984577c146cfcc3db80793c24f4875b5fc4e6c142d320c86dc51c65729a52fccd137669e1b9d9516f71862e47863f140fad5375fa44f1f9820cc873e043505c5f7b41b91b3c2adadd0a5bbf4209e1df5a5d4d686e870d45251ef641da3edc16d640207b52a79e2f34a7eb8fc53ffaff841b86ae779bacfde8bc9f6788a62156d9e4a614103320b884cc6a11a2f0c32d6cbdaaafdb0aa9522f55d6d30a28af4963fb0a6bd6f426ef1f9d3ca927a3add977a35772b8ea2e498df8f102827b9b921a3172e675425ad0b1a6acd139e0f2d48f07", "", 1, 1370611179, "38d974cc4d3124ed7c043aba778db043b3429c2d284498e0b9151e34e3a162b4"], + ["030000807082c40301afcc13c6610cd86c373d42b4443f508dc8d5007febd9e862d5d8a1868b5abe940000000002ac53ffffffff043bf0c1000000000009006aacac0063656551a721bf050000000000c5d532030000000001515a504605000000000965516a516a0051656500000000558fefb00200000000000000001a2f6e0200000000c15f018c4a2170bd7a713f05cdb10a4fbcc0136620621b4f8b53b23689cce0b9912346fbaca5c032858eec72ea41f3f043e7aaccd59e766bc9df5625c2ac42dbd409b6ab181968ab0d747ec5e0f4df750b6ececf8307c0d3bdf645e93a29324400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de47ea2cc6993d9822aec7bca1d2fa2a330eeb462147bd2ed8a0749cee3e102eb091b251c83b579a96e93f32d5af465983871960f4c627afab074893e4250981f29f4fb2209a043ea4a9ccfb0d9559a822d7715b816a635864c3d531d3132fdd699292947162bb22675dce7c178ef41a229928501ba83df87dbfa0bba098c28303003cd7b929246597051d365bfcd784310090640092fb8d0c8c3eca05590a6197032affcf3fe636831307e7bdd68b84353315fc01a0ab15ad27f32bb10b225b464f0b0876041433e917ad08c6f40d247342836d977a2d091d4af24d1021ff6fc8460f40d6e5c1d2f69ef3f747804555c13836c11ce7a2dfbc9a072f605abdc5def956030e292f72b94faa1429245874875374b03add688a40412c7d6b32920d2ef1cecf0329a24fd34b8f35a42ef6c53b79aa9fa75638fc07bfebe0cab8ab1db9d2bdd8f202217b3228bc8ec3012d389ca1b422e8ce40cd94c81d405ba88ce0efe69893723002301896ce0d1bda797a53bd0eee5896cd816f36d5c1bcb309a54e015287ee70db0318cf1c053ec8cd280f3a1700c8d158401661e2fdf4e19d0530742c68cf59542722b25ae4f1dbba3bf04be06186f8ffca80351be3883db9cb7eb13b118b49eacb366f003e046ea71780b76c47a5df648ffa5c9818a155267817bab6c60a11ed8f9be013426a25044364bea1c02a079b560b07b756fd908d013d15f61aa94d2a96f4fa50fcd16b8944cf938453a945fcfecdb6b18d408f79f441ba1d14d6845f7953fd3f932060465a1123d07a1c60d2f22ee6a9cb690971213e13e41d5948db57fb2c72b413b2966a9023736b73249984c97c6e4bb08778c508d44eb54fd08639199a11b7b24a0821170927c3e0d7bb84fa2aa8f8f6418a18d2e5b37fc1ed70b56a125b3a52c4e2e522fd758bdad3b426bc4d6295d29cc8fc5abc37428ddb319ba41f72240cb022cde1c4e5f9ce9fefd1959466d6e91dc26811e34f826ed1472e83ae175d2d9b28c1f3f9f8e2d6ec54698cca2654808d04d34e65f41ac188b65612ddf164ce3c6feb14aefa9350617557bbd7a4ec79ee565cdb701c788068c1dd6e95f3d6a3a545a98e904a71b181dbf0f0bcf16108df2ee94ba4a6529a3ec8f7461af747a7b14742a5babb0237cf94ef1bb8996d80713608d1a7a475678e0d3b59ce6ca7b5355106961fe76ebbb11dcde1c44908c3b914f926d7fee972faaf58efd4ee9431376e65e8c123f16dae9a55c07ad5b5606a72b5ec501b51c987e781756505d7cc26432ea64a60f10cc01caee80a611ea73f2ff808a06d26ede84ff9414ff91036bdbeb5053deb94fe4238d19d4059c861572e209093fff843dfa5e375703a983cd97767f6544d3b09e252b1d7997ffd7d13cdc69b7b6019e4da228c25b766ad4f0ea11c9f808380236b3655af0d7cdcd00ad229528b9542937588b6a83ccb2c78267659ae19620e53c22bc992ae5af67ffff12adbc6765deb3267a98fd6130f1b15f081578a12196e1452f28849177e6ef7fcafba11b18c11731b70a809f1de852fce81f51263e9a62f90e8122924ea74e4bcfca679e049239b8c0ae7e83e6aeb0ddd5094388a0681218eea3271b4e3f37cb79cc211bdac504e0d0c6d2277a8f155fd7a121e09137945c19ec3c24924d5cdb15b1c64e88d1268114f26e5f8fc449aa9944d138c2fa7491074c7f458169ccac50c16241805624a2fcb6099621406a11ff2c01183ccfb1ec07411f5b5205a5874eb20eb3713bb88b95ecf5ae44043dc847f6635e8f35fc914757706bc206776aeee89f8231811e69e1185af816db4f33cc60e7931d6c9e2baf8b92331dc265d0b15ff6823e1bff59319fd7922ede797c40124eb0aa16e420f8ea0537aa0c01290e6242ad771bb2943e3ea144167d92b866915af1abec1d46b9d59be9768b529798f60ab4fcc580c3eb066f94c571e6bce16dfbebe4327a8cb80e9465036ee97ef2433efcb06787586cdc49a84e40f5ee4e346fc084dd8e5f9f2bd6207590cf864bc7bcd9ca264b7011c08b4008e77f90e4e0034009a788c76cdc89267ab1495c5110f04b255a01dd26b580d69863d1541e29769e266ac31a234ae46a84fdfb155acfaef7cce1a221b1f959ea5831fcdc39a57a22805668dbf44a88b267793693a328b5e8bcb57f4ce11d4e597e302634fd4e748349df9850d26e84405d1038007ec7b9a41084119de7b9aa2018c7b97c646613bc95702a955c31805ec8134b585abc2e40a6170f29489187f96a95352af027d80364cea6d455911630000000000000000b734ba04000000009ff03c9faed4f1d5b703a9ab352c7f556737b21934920d0fcbd075c6f40306ae61d57cfbc0a3c9437b0d670f79c62100ae39ddb12c2e8c83ec35d8cb1ecd5d4a8045ac73c1cfdb250f924e7a3c1e45101f8fecaf440adb2aa23c131abd9ad7b700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000801c146dbe829e92c142868bea3aca17ffad20bef335ba6cdf97d1f22c000ed130d6f7d69692e1a6cc4c754a98ee74ce3fbfac58674bc37171e78fc27bbb4108065b6f42be46537cc0d4a16ac8392a37ff43602bd5f38be502286bfa9b902f56f999747c404fb45c485e1b91cb4bd75eb1179816395ae7af036dfc75b62dcc9802053646cad9e49957f6a0f3fd8357cc3de95a83004f149e3f987290a49f01bf1c0220b0ba16ce02700eb46273ada9eb4e52d4ee170cf4a8f7c29b3fc618671bd87d0a00c16352c2ad54814e51d5c1109c782fb46fb70c4ddac3cc7c62f076bba166ac98e55640da354a5e39b90fedf0641bf9a5139f8b5d7a46c066b9c4cb31ca003b0229a711a2c5d27a53ae1e9c3dbdae147f83951d3917bc8e253a8c8fa4b1f93a4f031a53d595532c61b8792c5284610340482a82c5c393797b7f8684de1b974b036e0220d74f1b4c77eb0246c6373c93955ac40b6fccad5fd0c64dbee6c20077d019d0031a81cfcd561c3d1a894c4e418da5885f240831e6ecc4028105354ae7b0a360c90323e2436e3949b615455b2ecc155a537d1dcfd24fa431adfe90d9815fb4a822a00f24a35e55780e00fcc6830728f6f54cdd402edd62fb1a479a00660b11b9e13addf399a4d29c65d4ffacf7a270f6c25c971337582da32fa68a6aac22d6ec4ead58aa3e3f68e55fd3072a8ac4ed0b2911badc48f1047b71f8f3ef8b8a3cee18c268949f0fb4a1257f8849de1cdc98422468f7d17819d581eb9979638e7580423d492be3b5753d8340002b0029ccdb0c49b8343d8eba95d9614f033b819d713ca3b6bde36024e6da19a984eb702f71f3f1ffd339f9bd79de25370bb81e00837e63a3fa34bd52df0b004ae350474a6ed21734a5efab900fa66b0fa32da2673b5fc4beaa05fea2ec637ef4235a014bb3509189569ac70f4ff52e5b5afe8511140b8ccb2ea9caf775cf8a8f7327779d03600567ef991442357faefe52fe5218f9e8c68f02f358ca8a3e23cca66308d4f4a82ce3ba2d297a78b1343ddb9dfd8c0da45a71df54ba647a63488df1af0335c7a773db7f93a1fb415761cb62ad774dc0383bb8fc16d299b6b874c8de2d8fd365b229020cf64cfbe7deee56eeff15e3784067a86a3f41a6bd2591ad2123c322ae1a6c2ebb158e5b944f23f70e1c7ada9bbf790f5fd8b9158fe623742cbe6d137b9be23b86acda4d26a726e115d0bcad3d5d46f75be5d266c2dc080ae8ae222505473ac41acc95fcc4c067870a3972ffe7cd3a2709cdcac54c4511b55a2071de034e232a635e1d4c9c7a02598db78183ffeea61b2ce3e866c4b4705f2f3a0ca81db469b9918e05a32437a3948e1c34c40dd97a18a0adfcd42cab45b5f5f7b915167970ce018672a658606ad3e74aa426cee5f6568529a141dc5ecaad0588ed6fc757a6839dc405fba32700ed97d815ef9ed1e239653cc71a7fc72650c9891225d589f3cb894e37b4282943b4262d9d9ffff0d27121786897547f79aa73561e794b1c6be3f2aaab348ebbb5cdcfddb1e58a41a242aa80e8c59145bcc2ee6c9e032be3c1035e866f0534fbec6b55496656aca235420b8889f9d35893d281fcbd09059eabb79a07164c30d98b74788b519b1c11e546f3dfde2a086de2088f88b2445de4d608f38cbc2a60d6a08bf40708f1c37d6cedd0197a1c89eef8b4165fdbc16ee11cb04509126352ef8138bce708192cf23263a9c0ae1dd1c592c344ff7821eac88185c3a91bbc7cd5154d1516ce55087086ae8e021f2f96bda01872deda7205146c4d3864a97ada112fcfc1ec3dd8f1b1cfe1db00a3799e3b6544f79d00b903a139510aebeec7f246da8c6f28a24cf24c47d698d21e3e39f4ecdbc1ecf7b2cc2b76d4c191b4d4e092a4ceba4854833693bfa104a21d37db2e1a3cf2695a0ddad317e6efd5a2688fb2e3b55afb1d609836e1e83491574378592de5f5c92bdba76555049fdd9cafed25a8779a72a07b589887e05b8c92b3bd524adb44b66c7b243c583a7eee02429da64bb01384c372cb597e127ed6253103eb7978d6daa94ee14aaf6bbf992b59246a8ca86544de9840f74341512a9dda5afee85f57d5baf301ac4af15390a835852a254ebe85a7fc43aa0470bdbee1c69f1bc386f3a75c0c88fd0fb31f97e32b6d7ef04e8df31f4b81a0e2592b2dcd466086bfbcf1978a808aad189788b435c1eb1a0c8663a85fca63643e47b4f12428a2fe8f74d42d7db380c8fb8d33094d44561050969a4ae303176b433c6a662371e356634678162010229680501cc64da27e316aa4cf7e75055b7935ddc7be843b3dbea9981c9ae877751f79dd63610b14e78a2de5a98b3107b69bb8153f7f62fb7f49321c6e9f27b41bf240d427a7fa0d62f3823dbcfa626df859b6450d26c63a8fe1386b067a3cde3a0f0f5b0e", "006300656563ac53ac", 0, -1139311931, "56b873f4ee526888a75b4e80e921b58c75b0ed5db4f791d4b9838b6b10026f8e"], + ["030000807082c4030294f7fe0e2f8a96679536baae25e5ee58a7e0a44ac287d23a952ce4b78b99cc8e01000000065253535151008ecd47736f5068e028dfc1dc6abba0dd1617cc3c3e2fcd519e3d9a9a1c5e3d46fccbc31f0000000008ac5152535151ac52ffffffff02db813e000000000008526365ac535352518e69ba00000000000152000000000000000000", "63", 0, -1545143406, "b9fe89712841909407fea3a267096b007d57241ab7c11c5980cc4057d01cb233"], + ["ef22956304678de03bb1e0a616dd0a1d182f60f9d768135c67274c6d641a1d38fc2da8dc4500000000026352783399bb4a8f96b56bff7ceafc31c4bc6548ada550460a42499352671a26b1fa29a4f64c02000000046365ac525c6e15f6e7edfe28948c62a64f9c9efedc5541337a6a41070de588c9765e3b6fc7eae5bf03000000026a52ffffffffa412a3a5dbb42e65adb79266cc6ffd368e8bec17a7ce151a0f2f1b9efbce12480200000001532d4c6f4001c1565201000000000565536a5263000000000300000000000000008d10a503000000009ec8b13fbc6a114c3fa99a08d1d921e970ab491f9cc9ce6e60c644b13b5502913ac4cc2a06c5fe8f949ea8b8dadf7523cb55702783503fd5443ddbd6e4ca8c22cdb9f5be84568de46d69aa63b9ce142e78f39b14174d8ac92c46a4be04afe20f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000357f962b7f8472edeab325fd4f4ca2b4481c048e3f367bd273575ce2856e27ee92ee5573b24e7c008f73c4167e8e2ac7e0226b4b7aab35a521268fcb9db873f8fb95a1844c180fe43ecaae8bf1ca4df8f147995c668b3fea9ac646b54b89ba8e88b9964d580c4320c28f5f3a9b03a1c26edf56fbb5daf887967fa3be340886ef021574b0fc17b7ba04f8b65548bc4fe2c701c637bf5803304e04369288d5adc50602273b1598713d93968852f5fdf2e2e87753050ba87de197f86fca3245abb29ca70b071851648773086638e3ff360106e950cc4bc6bf8a381faac51dc7ccba1ad89ab3057a968e73b3ed5ab6133ee7cfaaeed5d2f903b6b1cd8e4af68243b6e29aae021c515168d6660dc3486b02ab43772232d3d7f543e017e304a72be847d7c4c8e60226f1c6f65885d4bb5f8eef94ab8129aa86d12804ab595e682f9d02554c5bc665021892762038fbcc69571d4d85d534b427deb6d20b50d15bde63b11a2d211700a2020a87dc00aad143feb42bcaaa643cf8a7490cb8a87edf71e1b8764c50b8837c59030e5bdf68075da0622d6bf7fc27ed9b7f1d011d1531bc00429c3a5fe3a74a478b953878dd06b1c0f4b87026f5a42f6722ff72a907aa42885e7b128c6aed64ccd60db98f5ef061870b10bdc149d0088bb4c89c9c202b7d3b75721c746da01f11e88fd79da2f0d76ee05cc1ffcd9f96ca1654f0be3c5bdf0e6c87bf0a10b87016729049ed544bf888aa90c6713f1d82822f09138913f8bbd2cf098c7aaa7022bd1a665e376188e20e8e699d2c1a59bfed7bf6243ac58437900f7f72f4763bea003b6089b1547a0255758efad64c5fc4f0f7ca5201bc6bf7894160bb8617b5c79d0b0c8d751c709422efdd8571576aade986488832f416ff68be9ec6a64edf5ef06eed2d37d7ff5eef1d1ee123cbdf847f97bb23c3bd623029cabbd661a228de25d96fc6682b9c12fc170b4e875df1bd7b3aa17beb3fd845491b641882b0c70300ff69af2e8ad1d7945e1a8c5fb45d3f527a5ac8b1f94cb72af3b18f96dee00fc8d614f89f7f30bda0b93edef170d1b6bd37a4c472cd1da429243013c9778ab906b18b68a042b2cd2ab9f63834d4c9f3dbd6980aa67df7800755959b936185952c9e98ddcaa28765574c22ae6c6c7162cd677ca778bae6e4d404e7380a64ffcd8f8dafd63e611fbd8b0fde11b2716144e2595576c575b9cf797d1965c78862af5eb8423d9f77be025b52d284a04297dcf6265d4d5c1abe92b3b8af1efc854f1ff93bce00644fe06a971b0911e37fec9306bfcb4bdc609e45c32430602cc46979714a696fb5c80618785d6a5607aef312b48cef4aef48c4e55061d764f367314b0359718484b3ce74e48ab98466c7eaf475bb33070a728f04d2645b5e05a9b4edfa0f764845d8108551ffc432097f61211dcbf08a7eae3e52629252ccb295cbfddee017ece43b5382ba68b140d9b9722ebf7d346a69f4953b3855cb8ebf85de32098336e65d1dadd19c786e42d23b94e6dfe96e29c9177bb49eb3005e03df4e7a8633a9b3e13d0649659114d5825ac02dfc556b4b1592871e510243fb70656610c9e9464ec923c62fde107b645b03c1963fb93ae53bc6488014df5ee410fd02a5fd397bfd4051d4f1044dc7751d129e9ce25c8c80f82d29f1f934cf8ebf7e8af5eedffd4df0b2a2fc3d6f63ff96ab75253f95518ab905ce6118a1bd7e95bdd8615f01ad8b2214e69d8c273c3b63ea589efd98a8484ac6fc60d5e7b3705dbe7856e19631bab208408514a9a53c66a63cb47cbb2e0e03aaa5eb0676f0263a227c8182b65578fb23917031896b8f8d189523a437848e38c3eb4c57e8c68606c7d6f7e89493da079ec0042cd6de31395806d527bda7ee08d0317ceaac1653136a62b147f5ed5e21d6405da07d5622db7bbcd3454d6915d3169547b0fb6783b7192525392f515cbcc9c8d8f8dba20ff424234d53070aba590f920c0c8726b89368ff8f154757159f7ea08c4687e7f320f51a108b7b50b9e59da364a2dc68225c23531331930c34f35b291493c26fcba13f114577bc040ab2564fe45f2d90d5c23adcfa6dd2a9211326cd71b4298302dfe526be02b5f8e9ddcd02eebfeb046251877774cdcd560667ac4a4da870b576ff82bcf2c78f0fa182ef692aba9eb8b60f51ff88596d50bc468b97680c4cdee255a5fdf3af8625efb3ce3bc387753d0d7d3679d3d0a2af04e5eeacb125aca4f323d5a0098ed1b777c0bc9e0c5369e8ed86a3e94c95b3a0d5155826beea357202d36bb3726ac9e8df0000000000000000aab65800000000004a569e81a08631091a12010b06d5ffd0d192bead833a683c122f4d056ca097a0e218c6ac03e733787b1699ae5a4d7127e95b4c34f4a526d3a782ba6bb310b9ef3b89d7644a8f9661a05dfe8afa84ff343697afcab475d2bce8567df69d00b4bd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dd94bab3eedc9fbe82d4ae03ecb5e5357cbf66a83af066a480e4b954aebbd56f2e2aa27593cd3c9c9d2cbebad94c9933a18197c687de08635b01673ec84b51a24f14596e41a469fa557fc0a373f0218d614a206738656e9ecf080170fcec84743e4c13e598b3835e53a9e0cedd7e98923297e1b878a4cb0a9faad579270dfa2c021757610651489f514680d30fadcae79afe3f9f829536f0ecc0e23bb35eeaac6c02278d6d319032a9499e4d8c8760dcf0491ead05e261215c66426ade5028fc599e0b06c9707c1f3cb7469002422dd103211aff57d0e8a8ade3c4b7bb0b9b385e3ef1500c92aa8f449bdcd8eba3642483c05225cc7834f0d80c08c1dfa4260352c6d80223f13ec83ca60f654057ba80096633fb3ffac89aea7bfda0d981cb5a7bed2a0b032b6b71f883e5f80ae7ad4a65670bd9bd5041db18b7b0c9e1b9474cc7dfdd54430220257082330fe648761f5249cda19638460e238e9b06e1c64ff5dcf5e3b1b6f7032de0e971123b5232b3f3abcc14453e46e3d458c88ab8456cd7e69d4f8ecb24e5020f7afaa2cf9f029a4ddca43a36ee6ff0f1c2ad4a717137a29128c2a6bee08a07642ac744ac6a7ed4e92011f067511fb30bbddd1cbc55098409e718678cb1016aeab4a7751e07f143f0e7cd4b24a682976e3eff2f62fd7d2a2be1844b23a8dae3617b2f3abce1a107bdfd5371c4e9cb3a61032bc37a75c9bf45f678d9a73aa9e1416acaa12ccb087d6d8802fdc305c576c2b3d6655c6a26c29f37c4f5b2749826b44f85ef814b05b5fdf6956c47cb9b6a6d4de24c7064be01905327c081ce4fb9e642101d87b04ed46f7fbedfeab666af935424df9155c16cd2cbc8b92de2f569c6ac1f1763c0b70f631d09831149e642a4eddebd02706293537ec7f72ec7fc74752bc89eab52cfdfba4e1d7fa4169ac6e87a648f424f9fa043299f21822b29403917a6fbef40b77f4b74424626492d702e43e3282a6600e9cc0704e4786fe38a21983b1190fd4fb9ffc5ff62681850a42fd214a0d8becc350fcf027eea7c24ac7b41d86c4bfc8dd4c5ae5afb56feb47bd4617b3fb9524fe22434da6a6efdeb026dd2b138a56fd581c0391583ef2e0a96fc7eaeebec4d8722c7f933c1d778e77db018866a5ffc328e4dd7fdbbe56306713c644b325d5c0122f01ddeec83aed7ca69d7c29c0be9a03f2c405e38d0ba33259f9baf79dcf506bdcbe9385005d41c703c35aad35b3a8cfb0199e2550e1310aec047f9ea9c61b5a8e996ce15ed27288c9b18412cbf9e48b6c5d7f834ab159ca1c48d26d549ec067507ba0bd9f1c6305dacb64df76a70b04bfd401e75232e5b16f1a88b7aeba730fd11cc53b873e9049153c0e2384700142fd2360477e3f508bdd279e717971fe6f25f74a0db3118d20b13de43fed680c13ed7a76358ad1e314ac5af0a46e67ce2bb2453c1d21ec3bee84f780ba5f875fd04cf23948fd2a1a3b553aa8e2e80c911986a6462ba1af2e198d1131578f29a0cc163d9794b510fff86e8d7489dcdb4edf20cc6c3c34b3f4833e205da95f7019a01f08b822f682642433389fa3788ea43ccf323c898c9665c1771c5480f72aa22d83d8ddfcef35e4841566e5f22cb1eaac4c403ac2c34a8912b2988e10a4f6399de91350b1a94d980bca6761940a77386d1618da0250fd7b05c0ecedca1d48b6a4c93d183fd3d4d9395cc6f7ea8a92243d170da1f9916d57862accb9951487a5f6315600d4d9f6ca932d58843e47c2a503b7a44c6a63e1c86d65611842932137e6abdeba5292463f6fff9e4a2d333e003f11c8a2b4ed2eef90d19c97fa2531f7003cce59a6cf4c77e00927ac6eaf5f0288d0b6d9a69c8002befb64b8a4fac0a960033781ff57264d4164fd00c0392c155ee583e720993b1ebd1bd4c480605ac4b835cddb36d0b52bcf9a16956662d7f66f4d717831cc3d6c6839a4a30842ffb3108d33351f11607efd4edea510eb3fa1ad7753964028e69cb7a9685714736e2a7d4689fb45ed95c9a4ed432fa41feedb0edd88adeed216dfa2f6773852fbdab49a2e1431cccaf4b749b0556b2c1a1fc49bb604b34f55124a9859cd93b6b3b07badfb394c01a4b115048f4158786cc1e8788ae8fd75b50e407049c657f57148f185b56d34d4f2873f7c81ef6b98dd6650c28d12543775fd732f2c140d446ef5cc36bc0a26a35d2f0cc71998b60cb012f481d4ad2bf780847d1f2d96347857d470e52d960b19e985a98108f0033ba5d0280e03fec7cd79fe72c3fe0cee7c52a91fb33581bd8a4ef3af36222790000000000000000955b8f04000000005a5a3934b2947c449bb9de64923ea03581a20fa1e5d1199e30e9d72dff2cc4c82495b092c3272508466ca0ddbcf753c130abe92e3f77f3d1d6d15fc1312e8bc8dd9e9241c50e0eb480b2149a76030eb64ad84aed37031f8901faa6d221dc49a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000680d323386e1ff2c8aace10a3e5ec9d5878e38521be3be5b7f455cbd4a623aab509098b70372f4348d2826b5dc08e4f0bd7d1587be917b9e7b5ca2b1d00707d3b953662f30673d582d05a106e30323c9d2b37ccf291282fd1647e336f7b44f67a348b01f2ca2ddc695aac01a32fdc74b96266435f8061b9d416608d79e4b6c3e03141004519b2dc21eb09fd70441535038b48ba6f6d52bcf07613fe51fb5caebe20326caf21fc5070315c79aad20b5c0e992637d389fba5aab54d19524b22f3fbd6e0a01129628a619d50a83346c9fd3ec1ff014a476c3c450794be08c4ff0a503fb644d4fbf8581ce2d1265b557d3cc5a9b162e3438ae43ba3ee7579957fffcb7702a021d0c36d34e935bfe639c408c8ff3437e8cdeef81291083b98baee0ea0d82b26c021de10e36c0d243aa183a44c64fdef9236292b63b9f1f574ff5928812e9d85208032d03703d80128d15a51236b9e6ea07dd49bfb718e7c9f49fdbc657c8b198e06d032e87eda710a54a58101c44625ece0674ae62705a129fd15ca3eba3bea01e0346020ca4b2d2723c40a20aab115ca967c3ea5c09cbaf7a2466d33abe4bd59329ea0e4747753b5b8fe46ebbed9689641f559221dd66fd12ac14bc20203ed3b53d9c00cc3a885ec0d73bbd477738dcee2c2d8a5c019194977dc2479890b1da0df1f7cafed3fc5e36edc3a6aaa2607531b8725c692f16ccc530e5dab283e73e722fe53c01fe9927747c07c7a0e370b1ed01d09f414625256a8149725418b9240f5b4e3c2e8f1cf30912b8152abdfaeea6936d7d4ac8b4d2e4e89e6e3e8c06f10a2b5a8e73c7473279199d98ad18e32d11d670c100b2fbb1ede6ce9f984eeb11b7f33bb4910587075377586e5322ba42b2b37ad84dae43c3eb43e882b6b6032fd12af38f95c543db53335ed68fac0989f3d2b898a9569533eb3cf210b718ccc7b9298b7b012d877a27c7f2c9985c8617c57f13c2fb468a839fdb7cf2ae86abb64b1c2271e9ee50134cab4428c694bd2623fe3d428328036915f0477b4b38c35a939ddcb38ff9fdd998a0065480c9dc7457a1768947f5d6ecf2d220ba905ce10b36c2eaa035f6fdbc61b5e9f94947d1eb89657ffd998458adf50d9c50df2a743e2206a769ccb95d50a05533a54110b01ed204ab97de6842c0547bea5b7c3a4dcd7994f35dda369d8ef7947eafd277947a248e3f7819a12793a05b16f67b9b79dca2fe2e58feba926bf35f7c427037ca8ed6dfd942147a0125b30415746a771f98a674379e90da2594e1b7aeab9e9cbe35c1e8ed6a05862839e83b4215f5eb104ae091c4f9420d26645fabc142d5605fe632e0c3d72cdc38e719ffacd3e4d313fecdb03d5e1d961f2ce1ff107dd7adcf3defd6b034bcf34e8452b40b40365e14de3f0b2d8a487decd4ec46edbc236ad67f35f5af4b7591a18d2a00113eb3d953298253cd359d4d9fa7f4afef3f7f34c45150e1038369f84a60ddd68562529ffdbef1f6ecfc27c0082d2311cebb01566ef4db5d942f440f2d92fe0806b7c2c05c3cc239eabc5543e2e67c7cf560467bf02a30175a81ac7a8c4f20814f6eaced81cc18a439bc0b3a46fd620a32953ba99a0c8b3b28716d1190cc161a72dc7a52a131e189553a63c05496abe5a904a7ff2ebeb7bafb9b79bb2c5706a4daa71c6e3f28cffa984a7af398128ee7c92a5ccb8ea09bcb622fbe96c51f283d220d4dbf42e73bd9069282d021923fd771e7a9f2ad32629a1ebe917906d14d547fc67f1ff339e87b6520c24e5c0cc44f0cb1701fdca4f54e9b05a941df718778c31c7d8aaafc7a0eba4a3525674a1c9f8ba7f0e90af166a040ce1caf436133decf57add3d9a8c093e13d405a8af52b645e9fb10fc908b35df9cb8243db4d449b887a057a17e1195b457c0305d2217048e6881a2de0bd186144679ae33cf5238d6ae17162e9344c97d63fc5f98d11e853c63b6583bad903d869c17369f046f741a3bff678c859cde1a2de487db1595796abe6e96c61cc0ded3f64215f17e64f0c90908a3c4456e7f392f69b52d0a2a2be8c8083600ec622d99762b9ba713634445c48baa86b950439b9edbe89ccaa69ef7438a1d4fcd378baea09b65079663de0600184e641829a0de226c2971fd3b86a920c0cfaf4e2ca01010a4437073fb37ab2d04aa0b6c2a669c74569c80708488c322fa35915d6766d742cfd604caee5d3d6dbd141a86f1d74a46d778d967b9e84e9376978d9a9c774fdbfdf2b4db9c88ecb9641f5e9057aa22eff77b28cfdb6668a64f804eb5f7ee0d0206c9daeda7d130f58a812d330892e030dd2705bafaf45c184ae0e76541afe464635183f4b7a73ddb817e6677536cc48df28ffe0c5ebeef24179391859879715d5b38fe8ac023580882ccd857411d85e2a2df9897ab0ff6e8bc5f4bba6bac59e946e08", "5152ac630053", 1, 1957783220, "82addde5f1de6a907504d51630df771ae1b24245722a68f5349e217a0c84f0d6"], + ["030000807082c40304df600ec8d062128e30a85ca55819e58bb72b94205bf6857a789c54079c920a820200000000ffffffffc3b515d71bbb432f7189bf68c0e940d2ba890057959b9082bd5171f089f8ed100300000002ac6586e8261c8ca791646745e0b830c1ce785ea45d5fcc5212665c6bafae13a6512a2b2330ab01000000026351ffffffff26c1352c1a4bc0301d38d03daa0618bf2b46442509daf5341a42a4527d549a190300000001acffffffff044f054402000000000852ac63ac516365ac8430a80000000000001a88e70500000000009ceb4b020000000001533f27ffa88564e73f02bca954050000000000000000000000008e8bec4bba9871dfabf1ba7d75cd1cce6e41e1ff36cfb5de55a6ac5273f68cd130246e3346b02fe4a61eda23ff5452056e27356891ad357140528280ab80119fa4a9267e6b664e5cfcc1764431e5f9f4857901dfcec9e5e234d89b5103080b0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c100b3c7763d913f5872d955067616c8d42af40da8465e2d49101a3835cbb2e4f4db6ca3028e88b669befa5b9da5c31150f186dc35237071529434653ee05c382667c137dba745b39c6f9c2c980b42f53be0ee91415fc9304954d23d7e8a7c0bb7d804c57a0566391565da720c62ccaa62fa2dc7b03b597653ee3f7127c73f43032a148057c5bf1c6fcc0c6ce16ee5761ba193f7d023b2b681bac325b4e084284c03267904e4cd88cc2e1c51cea924e9aa7098cd99e55cb6865e3445b5fde7e1cef40b0541e1b3a56da7cabe2806d1fa3f987f12e41711cda2807f6025b21b60022b8333da011670c66b158139f42ca427ec6a9e37048c7717359fc735ab00d733d513030f79d784eca337e0fc867ac307c8e884807af55552505f465801e743a3eaedd4021c779878d31cd55d923e894c63f1bdb6c0809b62ffe3d2dec38404d368fa353402030d2f2b56a681c8789db93a6d46d6e6cfa71bb2cb7c352a7e84b9d18cda61370200f048e5cb271f0d9a533ef83c554e9caf16e6cde71a07a4fc2937ecc8af3680021b9d13cdd9c4c78119b99f55d95386f6da4f2aa3743d7e3db9cb03fd6c1b520c07c2a1d63a3f921a1c7acb729b3b3fff4a03542145c1b0ec65f600461590cdd2ead00aa8a6f17789881151a7cc943542500faf10beb16ec9edd0e1a25d6c7cb5f044e1e1f6171e9503a1cf1af736d6b1de48702e60821f602835c4794f6117da46a52b53b7e12e519ef5657ef45ca71b8275ba346130dfc7ec16ba18956d8fbbf3ef54714d16c2f71256573cc5e1ab439ef8c3c0596dcedbceb7f3643fa75cb7d9cc2291e3743cc5604566673e14a97d3b140f5dbe34b93ed32f53ce71b541ef3ca9e05cd1ee07cb1b872872a1914d04560988cf76b79d6f8c538ab14f1215a6ccb0756f10f2f8517adaee9b7efa0804b8e3aeb0051ea98f0e87485ab3f93b2df3dbf2f9e363a45e4a8600ae9be7ad5202e147d9000f95502bca775b713a8301b72c293f71fb55279aca3fb87ed11a8b50657ef8722db9771fff809ef9debb43f9ec90900d095443f7801fa40d0468864eb44877d787ecd25a6e445ecfa7ec3bda234aa4f8f634f6dbdd7277cccaa03b695e684ac868026bd196af24d2faa5ba7fe8f64efa6f99e6d13494cbe74afd3915f4615c6d8507d9bc948b8edc4fb36ceb1822155cc7bfeaae7c594e737ce1787a51350d5ea2977846cb68ee0cb4a7e8b02ca4ce536b6d5ba160440c7c39e40ed9f2bb69b06f078d95c1518523dad8094b91579b678f33f619f26efb7e2c7d6ce28fe89111e2a6593d93700e6331a3148fcdac38f6250d1cd07843ac9afa6b6fbf02a7f65e70142b7fec1bd25f3be3774a0fc60a7de4afd2eedf436723abace6688c8ef82d0bd58eebc5f29ef8575db362514f0238f40427ec1afab15567b8de187e1ff325bd56a3603c3d6c43913a91f92295e2de000b9ebb6ef98f0c2a304d6fed082ac03e67dc3fffcceec17adf181578791ed912aa834596720c81eefd1d2ef34f8d34e5418211eca23d26303b7781bd889a5071021fa216321fc7e81e161ce1f2591b00d7220239989f10c1ffed837e31b38f1a977bf6f8aee68ddb264c7324a01da8d5927be8c2e2ad510c934b5f4980a113c53ec45eb671187ae256327a5c93db1f366392171d8e46f92e4330fa0d81200530f162853b82a5c8e67f7c437ddccf9394971ca96ef55bd5c79a2435b547360f74deac2511a82ab651437993bedd1e59a1f864bd8f2d6808a1e2e4a546058ec44a04f9bc316cb5779ec93a51d46db783a1a40f524275d4ff6e953a456ab4935eb2cd9049055198ba780613fbaa1e36448e260b9e37b068027a196a2f291ec80ebb6ae98c23434df8faa99db7f93d92669cc599d9510a19b4f448d93f41b2f8617e0cf1eb236927943754b62fb62a131db983961d5f1cb1b0ff97e3360afb7b99a0b773d5f190d4d3ed9c01f923d5ff31c9aaa513492568926f64fa06fd2a7c2afa25f4603ca43ccb1ccc976cd413bb5616f8e4b098b0084b4a87443583b19132224891e2514c35a0b7cf259d9875d8ccd0447c4b9cd4acb3e0e17f05ec82e1e4b4a123620e56c997b5671684b66c1d53d289ef751b1de183a11f683500cfd1303db15a0ecfb9b40f90c051bcbe1104412ed26a892c813b8094c5a7d824caef621f2a761f7a22763b4ab93e093fdde586bc3acbe0f8fd5896e0aeabbaf6c0e3b81f181d5c486d0eea24662ea6e07170cf04a4076bfedf1ab7b8388c42f4ebc9fea882af68ffa8ac9cdabd41d12b00000000000000003830e00000000000448876d2f98fa58533357188450e0937505a3c19b1864ee59043aa5f35c2c9e970fad26e50a6646501d984b60102c6154cb385045a06ffa0f6d4bebcb4edce028a13532e122d69ec4ee982a14a5adcb8354e8cee90a6d24cf5e5c14c6c52463600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000726543b89162356de8acf85534b0f95276086d1ebdec7d31efab3d2ee70cec0b312524ed02a18ed276f5c7bf91ee771affde7f38b7bf73da99bf70d10f134e7e5535a7e72a6702d7cd8567471bd73a120afbd215a9db5e25640f5d29c13159c2801054ab921ea415c90950b986877819c52abf900d94affdfb8fb82516e4f7c40211b29a98baa2e2eb855aae033d8cc1720581ea8f9d7a837b87455df699f565a003192645a69fd347641ff49050b0f086f23477eb267621409fe74d30e57651503b0b03f88bd8a1a5fadaf0728d2380a42ab59f2316090ec8054b5d1f5b168642708264a975db0eb8ecdbf13d8677c562cb884e8c7d15f1bfa05bff1deb43f2462e81022870cbc203322e0e2533714f12383503ac299493fad431a672b62ba7a16bcfb10307c769cbbb8e88afad6be2c8de0fb633d10589c90fa87c9433a0afc93ef2ffd40205b5c03255029ce02783ce72e7d51ac41f754a73fd0d01e31bb0f8ec1a68690b02013f015abfebcf7d5a8fb7760714f1732fb777539012dea3da7656e201d28a2503116f66ba7d07b42f9f830f328d6dca49c348c676b6233aa51c92bcd8977ac72c065d5003beb4c3d95f7a0257279ce4f236fed7615faa97ff4c1eea599fafaf1ea987eb407c4ffa37c6c4363e582132dd8b83cf7daf9a1962ba37458943e058ccd162ceed6569fd1843a06c7ae519f441b39c61e4f0e2d77bdbf2d4857e8f1b5f45d346f2183459a7a3cbb77d6bb9bd640765cb0a32bf33fa10b848964c26d21800c0fc761fa945535c421600dd5a8477f4ea6c75cb6fccb3a1e16b94a651343b7c6cff1a49033780e45caa563386f2cc361c956f8489652299639645475ae459bddf72acaad48fd67d6d5455fafb057e3c38624aaff14aae6494cb2df09b025a853ae4bb6b6eea8fcf5b5c15a6d31bbe32b453c684d68c7dd7051d520755355a561520a40b2ed9781ffab8171f75410e750e883f1992c7c766392a427de0904e96e7ec0393a4a05a73cb63bc0c33ab82b697b35c14fa2679d7fdef5bee1e9ceef73acab5b8dcc22d5b8fcc7b6af81bbcc9fa0885baffabc95b923dc87b779736d161b92d09649689914f1c8622fc3a33a0133687969ba27db34829aa462c26a11ac0f684852318f29a4fd950c6e5c70aaaa65d2806b864ebc921be3bb4d6a4e7d6b1c034510c8c12da52681bfc2db4a61d7d628b16886abc0ef6bc0bc285f2d8c41173588d56f8d1f2edc3be0a8510d6bd2e2d25bfa57985dc45143614958fd654444b7284c803821ae816574141b4c1ad5c495794b99e529f3666f60b29e2fbab53908ae7d0d64ff832329177fce44e7ae2da121dd1fc413844fd7f4ce32468526bc41abaad184104d2cec410b1abcf9d98776bd49fe445852e65eddb28a047ea94592113ee34905ef1acd6d9fc06e6aa45928788bdfda7d3c928586680ed0aa7da14c8427e776a0bbab60a11c143e97bb1015ad7a88d3354570d6f3f390c041c24e27b9ae0926a3086497d75c4812394311c29b30af9c56161939c50f29e664418454da0b2d48ca7c1576da3c6af4d5d50ed1df4da2ae9228a751f867df44cddc5dc91123cf6a3c4fc2d60adcb2166e8451e4411d74950a5798742ab17be8d022ab9823eca320b532b9b9ef0bccf219617b36c58b970278bc675700efa353a54f624f36a161d0da9a52b0893040d569a7b54f090de0d34eedfecb9fd8e9b517415099c46224e649dc780837c9252d3cc4c262874c35ab9566847eebc4cfa3ee6377266b81f86985c2efa3af3d273612444bdd6e0f6a15cdd146db66302e20b79ead61929fb1f8b67b96d2e3b07de28efed4c81169b203df42c531a5e05722c57920882bd00dce2a889533fef2e95d0797c0ebf9f0c8d8891ba22a5a4203061cbd5574830fe154debeb93b4e72334ee858fc2c2e20633d222cf0b1a6cb5cd72a3be44391e410031e1fd7387552ad5b626db155f8bb135e47e93aa73f62af9bfc62ac46682b81c81eaf98fc5dc4518fd097f803925d50aa551eee3e73234b0303165a43a4c6d9263594bcb8d1efe4a68e43d06413d4a2dd0f9f3a934098a8292b273fa971762c29e9f6b20dbd583e6c2cb574d723fb6e2a6f0e19ad68b8c8a7daead60373f53bb1277f41eac00cffe1ecf80702e1a1508a003b7f67b08af2a1568a2f47c2e1b0f4c258b3cc4e622ccb7a99cb69b539cfcad5e3d6643518eeefe04f00f3fef309620110861c9f89a86cfb63dd68c8756dc40f3ba83c0b614f840abeed1a98388f0ebdf0c5df2402363d70e8f2ca7dfb9d2a0a3c6007ddbc217826364647da057d2a742c60a735d083342816390e108fc5b282bf07216e1555be6998be49ba88996fae6b67b1bf928a637001bd830a0ca54974c0938fb980aea33ca9e3c8b1e053132abfe56ba0d912e7d340a", "536a65525351", 1, 1130665708, "7993ebe61bf4dcd3723d20a527d624ba66fcd3aee957e8fdec1e8eade9c807a9"], + ["030000807082c4030487a766978179d0f3d1c23794940d0830b0e70373ade8d0b60804f795dab73bab0100000007525200535252acd5fe9e6a2a6ab768c89dd41d86a7d153e252d599ba7b56b516d4b29c4e3467b7e7b5829e020000000600ac65005263324a23ec0405c53cecb01127b1766ba2a42f4ea344c6c63bbdd9105a182ce1fd0fec3aea0200000006636aac53ac00191faf9e914972196f78316eaf6d7c7d29bff071ef348ad6f426a9f4cae0fee6b841284002000000045251006affffffff015d0e8b0100000000035265ac00000000754ccd4c0100000000000000000b572901000000007955814e514d295858dd96e67964aadc694848a77c4627400655e18e49c55018ab139a0f5cc22dc9d242f131d74bc658563af7f90295839bf3f0e2d2f50e8cb4e22a6f925b83a589857c869ab600bab6589a67a7d46c25409da69eb3f7f584ae00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cef3bcd721df970cceaf51a02829a83a3a2f4f58d97ee3bf3db9ac7fe0d07943b3544645a3d9fcd4e6889f610c60be9798cf35f96dedcdda9ca5efb3242af680ca799cf06c926e44c4079fc02b1dd1fda38e7905a5526eb5c355250eb66ae6cc29126dfe3e3056621a1042b98a59dbd8845b39df06bac81c1835b889c431073502199fea301967e3e3e623d8d20af0cc039de7bad4af9a83592e6d4bd6d16c3006022f00a84e87b953b64812d0116f61df7da46400915eec2b7ef759c401429721bd0a0132355505d7d18dd72e3261c9bd020f2bafc652eef3d5b47b0e5c3f81d173ba2e6bfe8a3a05f0410564401539c4005a143d5c338b55da4706c8973c8bdc3ad90225dcd78d8b40c88dcd18a50ba243c6dbabe6d96ad35067bc5c485912a5ada2b8030e11014f7f555fec643dd3d09e1c563a1417e5f0f861d0fb5c37b23f42446ca70221bf7dc02a0ad1d692de34e4dbdd379b0930b4a0bbed6dff52d282391c8807dd02236a94faf8029e3a5609f41594b8a40c3a91fa4b7e46ec33a5ff5896f095529e0204ee86733551d62c4c475dad3ff59976d7f33085158459e838411bf1d9bce38d8bc00ebd5c0478e6e715f927fd337539c50ce320cfae4722996d4555ed0afc6760b9f2ce1a20818d48574a6cd060675d4b182ec76888d72d4c5c9b657fbc92db84883f916e98ac7f29c9b16cb37a648fee251470658ce613e457b8273de67657236d2ca33736e09bc598f4552ab662420c3ebbfdf8f9bfc4bffe0fec98ecd3b94dc9b82ab0ca914612e60a11113c9140654a60b9b37f93b889bc9a937cb43f3a5d15d5d870e43b79d9e2c1ef004bb0458454a62ebbd6be759c9157cd60a68bf112ca4defce2ea61f7af6bd228c0a78328c35692f213bf9dbbab6803a3aaa565576c3a83a85ec39b404f32e5f4f4b18bc116e9ae9c22b364956331d3a5ff90dab1e25681dc1dfe4d1be3cecc3ae0385c384d27648860e200590743a1cb69561ca27b5e57f556d75e36871c0044aa78422811e8257d34cf5e6b7f0eff10e6dd08910b54a6f5b6b31332abbbf2bbdbc7af07e3b8b4d8dc39973f1628e57503d43ffb62c0aed08bcc47203bd1c21d82fb7eb7b02df8d5ff5466b21b827f53cda6539e37e95c6820dec4dbf2a1c622ed88e1110be73445e51a2710bb1c05156cce8a23724ec3b7379334e2e2ea84a2298ee0b8a158fbc563a320cc03cd0e5c53a1dd17eb5148cdd8bfbe6f5814a5c41fe76283cedbb6f38c1b8446da95ef9c91dfc42bc3a50869f1c494b58d58825ea76042877a8e8dae5e603ef20948da84f3abe0b51e81d559ee75a371b5c498469157349a5c18fe6c0b9c450b607aeb0d42e6575d1457676fcdf61b9e2f7fdf3ef112c092960a6f2385bf2038cd381f3d906dac2af3aa5b9f592bf836ff1ae008eb0bd410cc92cee57a17ff67c72ce489c72da59051f483bcb0570d5dc92639fd931747e68181cf6d3fb919b75f40e9b4e37b595b10de504cad03184789deb7d13922dc2122a450cab6a6438413afbd6dd07c751ddb0f1c25adb920d80f9e997b33afdb22ffdd7295d8a3e99aff032459fe7036c7acd863e1551f4e32ad754fd5666d696af7ecc65069c49961ea0d19bf6854e9f7ef34b057bc6273ed24e7ef564958fe6c04472b80464936086064c89b299d3432855159a5fe09ec7fef8070c0b0f0ca1c80a9a456e59e3cdd6c35391f44a74c11874b98f0026771f8a35a617072fa2c858b7f990a54ff59f5baf500fbd97e286af3de4425c938da7dc405a2cc2a982dcfec2ea4e13a89f7b87cc7fb13bbe3998eab04f2f11f25141638b94ca59d637d22b47825170507eee358b42573f5a97e4fadb7f07637686cd8e6f5d1a086c4adf07dc526e7a3e6747ea8229f9d6fb464dfdd6dca3891f4546aaf41fc0a5b202bfbf01a6064261a8028e7a880d4c7da12c8dedc5bb43fe588516b273a271a64752f8a344e8235bb88d3b6c90a6ddcdc0861bbcc834fdc004564aa904366af73331015767459efa2469cbf7165cc3f4f2a6190b7f4c20f3a5542cf0301d4bf44df759a2e0becf7db70bd60521961858b5b5d0ccd82e0202467c8c9b80124c0d56cbc1dafd1da1a4a09c149046fcda9bc864332027a6f0645dbc73323821138b34203069d9e195a8220e7aa03c7b07c09e26600ea1f8fcb80e2c5e5d067c4192b179499919a0095a30d3dc7c0ae62f2792d87bc793e52f8d5eedea60947d4b57e1ce7995b5ae4a22d8e97bedaed0b8d83f15f62b7897dc0f4275fceffbc06f84335d4affb584df62fa55f9c37c89a8b04bc0ad300d37cc659c736361f9a48225d64b86358565ea5fd4fb4868c5d4893828719454cff1ad3c8b67d0370c8dae90986bdeaa0c6d44458041c095338e035c0579ad2963075433113c5539d9337bd3210df708", "516a00ac", 0, 1653689908, "d94fc1ce52ab499c58eb2994f41d406cb5c09ac42b9bbf15902439d193dea5d8"], + ["030000807082c40303b94ab5fae517ac7f407648b3a28b9f5ad0d30665e6e5cd00f4ff458ed6398c9700000000040000516affffffff4c22aaff6957500e63cdd39653decc4a5a9c5c38d6fcb480fb18f1815ea4cd3a03000000056565ac5352b650598d17c26e18a5cfa0c95f5ac979db1f02ebe58f57ada2c895e452383a6d2dc6aef203000000066a6365536500686964d8048c387a04000000000352acacad7cde020000000006516a6a52ac63f88c7f01000000000653656551526307ed94010000000004536a516a000000005892b78a026701d9010000000000000000000000002f520e974dab4346e0ddfc405092c19671dbbc5fee4eaeea5f4a8f292562ed7a4a9b6b2351b32fa84b145934297652606717dd57c6231d5926ebe458ab2fc29015347bf9178174c7c9f993325986429ee6b1a6dfff19c53f7357c41825fb46c4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005a8435745017d45ac30e4213ea2e59c51a21d98d57cdfa632c170af319c7f141f3e07234476644c50ab3865cff540beaf7e7a044336ca4609e8b8858aa9680a4ab0fe3a6173f10a7a73765fbb0dc927932c5ee955d277ebe5da42df188896f88afa312dc20ae422a577e1fed441307bb8f66cd7cde2bc03321540ad1328778f3032d9c8f23085b3ebe8c3602c532d9be2f34aafa065cf3f7727880760c94144732021b60a0f3ac844b8ff7da93ad78244d06694cc3f6557ad99a65e041f070fbfeb80a00602565da5263a1c8d62b3ec7dddcbae159030d01a199e31e33814624b2663037eceda380c4d8117268f52e51e5776dea3ac1304428b8ee002bbf78676359eb0227a0253412390a4e2614e4cdb46609b89fbe3225e0343fc57012d8dc66bd8da00220e2146dbb5b635f218a787a8a9fb702f690d57c67fa6d51a35b6b189686ba70031cc5cba0f62d17ae6a0d21e824ca59ac65fc8d66c44c382ee525d0a255657fd50328b6c7e039cf815b1c2993b2e8db913cf6beb099be7a28837c491554b2081265032ef306566e8d2011fa17112f2ce22d9bd60232bf5e35309282b78333cf08f89f1f36cb6798d2fcec6bcd7c289fa52f7ca7033583040153e87e05e9f0c624b2ec045903eabef5aecfb3cdb106630388339c45bc2f86b985c35a0a00f555fb54157f193a8819df7d3bc82270fbd96577a84840ea521e2584425fde3475065f812c7e5aee355ef239949539a03991ae51a61db93e2680d1f5a71fb11f59f9eb62b86947cdf112a1b6ac6eefa10c7b2898289bfb549d316a3a43b325d8e259af0aa1aee54430d83290a8eef0b55a67b2aa0fbdb87d26e13e8dcc3b9caec9cedee5ecc7b255e4dc555864007afca35105e6b32baf305299940b09e82a6bef645c3d15192e738f9a067cb7bd07866e8c366eb6046f4c97ce9436b13d1a9d427176389c308ae70df06c86660d26293e452c5ecadcd752c390e1b56e0760edb02dbbb87d35c7799217ddbc5e4b182f40460b3080de22371d4af2f941898bbac65957d48e18c399c554b0b7b1d654290622f9ec3c3e0acbbd721490e35455cfa3575585402836c7a7f4f2f26d1925e57d964f3612a4836f42e99a17e3c6c4c5cce7e3b7200e8b1388fd9f88e52f7e74a50ed90a6c99a90298b3fb50f74c5fbe984e541f513e694f73c131afc9fbc780e54dea473d889bccbb9cd44704c92652bb7178ff1a98c8ca294a1ab97fc887a99e9a178c993ada63861ee9600756b2a28e9cd0c2d7e48171bb85934a7c87cc46b84a5a1b56bc585bf0a2dd2608eb0a1b2914545fbe2f1d8d924f98d7961e9f1f0c79bd6d56a31abe34925dde4032e23503ffd3c38a9531bfe39be9304806bf0fb6e655f7dbb570d2e08a7b694f98fe19a771985864d3e9b82f5aec2f3f9ec120695f87ec5f8b47567f1e1862826a3b964f0bcfa3a6864aab4ab247bdadd2adffb4879e343c2817eff8520aaa7200eae77b9df75e1dc568021a1c222ddc163159eebaa0b63870c7b201656c89de09acc881dc8356815226a18a444f0a12af8aefad88542b1fd8b6f6a0f3c2379d5c3329622ac6670ffbf87b4c8ac9b53cf92ae5b3625328b06abce7f4e43a18e23ea5efef205aaa958c4ee4d398ff06a9bc27cd9746c25436961847f6595a6e101a9c138975771fd3260106ed11d84dc634cbcd935dc96f7284b8b1e195cde66a04a2c3ab9f513866d396b7a9375396cbd66bced0d4f134fecb18995ccdce55b0f9633773931ec7d9c3d33bfac195e1e692ed615f0b736e3883c22a3b2c39bde7e979f2056362717e8f59910622670e61d505e633c2cd99bd997ee80be9b7854f64cc0aa17ccf0686f7f389f8874206212e2f3a7d657e344924f1ddc81179422f990c58538cdbdfa0fdd32a0b2a487d170ce57323f53eeaa663bdda75479e3a8d2ae523d1d8355e3b300a2778bd1d6742993c9ed9eafbc66f62a8a0b48fcae788a29eadbdff94e526330941b337183fa7daa8502754da7746ce1cdd1be8be82afa61a8b125b52235e3ffc78fa817078a706fdafb6747242710a566e4489bf23eddd17f83dfa7b2c9160f0bfd4f222a54e2658df02e3d001516f0d45deb06f6522ad2f998485ed3383e67fcc921064b73edc955d7ee14cebc6636d388bb385c72687cd23a05369af567f33dd5d15b48cdfbf6994c7952f7fe41f8334a408c284121687c7f077901d0543927859f45f3a6fb7abc636cb4cb1ca2af0a8c7e51d68707c69579f33cc710681da73c730f13b99169e51f370b013eedecdacb94900000000000000000000000000f494b661ea13779d4446edd222689dab4c03772cd0437a1ff2ffc6b710bb7202338593fa38ea3c4eab2a43a7453e9ecccb411bf1221dd7a589f0b09557ac741e96d761996cdf219c639e7a99cf6413e5a87aa27bbd5504d1143c4f1b6581fc7f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c5d4b296feb2efe3b1d0e71c43c22c19ce28735c3828d71da3d77454d5b94cb71ac96644fd9fbc3184c09dc8567b3ed2c908b20341606df67f366183cbbaeb79bc6bf3dbdcd008abb07b2d3ec73755e93973c5c696ea4f348414f1803facb730f0f2bdf00cb6c64f51ed6feda617bdff9eecccbc42b4236b6c71ea1aa35564780203a21ef109e2efe40bb2edfdde21987ee4ee5d0e3fdbedc868d1bc5648cdb97c030f29adc77c2cebb3e8b8103ed95b202fc2e3c834d8bf9289b86712969de6b2380a033a76fde285785750b9dfe91db24cdbe8610b06430d151bb8486565eb9d48a82d02ac34c52f8e67ae8a52218e7b90962d4544c59ca3e14e420e853078a9941a03228dabe52594e9ac629ecf591c5a06eb81baed2831d6782afa2d876aeeb1a58403009edeb5ff235ea00d9c69ad7d3d2765e22ced2f1b2a2c9caf26bee3b80bc53b03170b03a0b8140bf26bf0df3cd06b819ded5a66d3ae2acaf7cc25567ec875e56f020dbb01d8dfbc3a27917ce7ba8f4167b2e7d48ec5f848e7ed4779458078e6da210325cd93beb1ad4bea47917398f6f90118f5a3d8871c9e501d80d9f2dd444e8271fb72d1b1a2207f6b0686a46d25387d016cfef0e7e911f97f953d1cc6a50eb9b77ff8ef37b2be956e6e535e01564bb80ed1f9032e3005484f78a0712cc8f770ede56d30e9a24f09e40984677bd683c81b1a2558964bd4eb0072318c820d3f3d54962a961bfdf2db88c59075706e1f090ac537b4b4ab240b0f28c3b1173dcb4e3c86b194b170a143e0bf9dd6c89411160008305f73d979dcb172ff910e2ce55515c551c0ba75a169c8ce07944647ab941708342dc61b4e77ba80054e1950c09f0c75da07f54fd362fbf85c1f9e98f96ae3759fb580b27d9c759b6aa9e7714f046cca08fbe0cd0b67d5992c367abf0e5b9c9e1cec92445958f8cb537c0b0f3b655e697cc51637620e38885c7dca3a670162ca11fe83e1508a3eee2db45c0acd4328539e045cb0dff487b14807db966913f7124ce7a8005aaf655174933a66c218cf4b67ebb0ec22dc2c73173155d6f8ded29acf14785dcb0d9a3811816c3f80cf89f0662d0b95cca798924fbf014d7a38403b56ebb62ad8865128e5786df86286909a3fcb33769988a6b1cef266317658c2c90b1f11247114b561b08fadce6b518ca47dcaedc61d1c8d4bfaf9c0559e24805ec1dfb8828d031a03d8d35dbe15f3ed4e8dda8171ac062262783d34d344150ce69b4f579241c792d22baad84965d79cb91ced002b7f8141225eb50e966ae87030790a9a23bbfc5bcbbcde6b211f5f424b009d83121a23b8c7002197114304efee43a4dc4787c1f8503df4251fac38ccc9f2a6f4c23848753b8148b954cbc504203f8aa5683f100a4c5173f7a6d0e993ea9216fea55bc61ccaa818f9d0a85ad237b8c6cf9df9ad689bc5bf344a8ee6ce446a699473eba123cf959191470e0d0e6afa3fc38f497cba2c5e2f0126fe840ef8735530562d65763ed23a8b6748712029d5c275c889591e2149a0f85017ecbeed813b42ee485fdb58272bdd33f0433885e78ec2764c88e420f03870534de20eac56e46c79ec5f57bb537d6c9878a4785c6a3027e5e38c58b487a08f53ed69dba32e85d9fc72f5e43d3bc683079f68ff700c3f885b3e53da4bc97893d1e0af39addab5c0a6ca115db23abd40763598f1668a38763e5141fda3dc8bc34b98252db8f6e9d526f555f5ab80b3c0d53e3de3be8881337b7bf952ed8f9fbc5423cc07d1fecb8ee3f55232ecc5c70c2f8fe843809f8b89ceacb107199de5b4eab4b727048c1a9ff98de41fba830753a802adb5c571333f1d976b51ecd9aeb7c11a9d859e3c4550b9d566eece4efe00c7044224e57b28bf71067653036e9fda89219d49da4fa5530e64b1b89159e535f90f518a7a36c8d3ee659900bdbf22b1bad6cb92053c6abd51120c417494a25f98ee9664aefdbc4f273aeb8dc32cafb2acc81abf476190cc0ac04ea3fa60c7499dc47598fa9dfe2d4d77dec947633d3c0e7a50c91a0768f5bfd8682e0eeecde6dbed2a1a672d96aeff9d43ce2203ab2fdafac3f94e569683a679065a20934f6176b4528268dffae064a2dab30c27624af9a6206eb278faa8084a0ad82a4b522bd2fe7f9e8222ef9c855c5519f52b3a8a9e832d766103461109f237f1189b6ead2fb7581b68b6645705b4b100fde1b7e93619518eb6454fc716401eb2ef46b02bbae38ade5275fed669b713a3f1c934f6997ca51c9d375fcbc0f2299fc9fa5af9eb102ea250f018c18317f0fad8d9094e5c2a0690213d94a9c0086eef30b7a79156e49733d3519140a60564704b7e0a6eff3945f9db966c387bb9bdbe584f86e1d44d8d74a9ba133db9078c6f69cab36217ec4530b81168191b0a1d15c81b5fc75ebb13254a06", "52006a6a63005263", 1, -689221829, "2a046e60d198efaa156c01d76c0173e4e7aa661d59c65400e0e356902ebb49af"], + ["856d632b03d97cc36ca833ba6c6b41025544f4026a3183d1cd703d694f8a0dcdf49a8f79ae020000000763516551ac0065ffffffff3e5cc683ff548dfe7c75f1116919d94c6ea33ae7a5485230fe1882b8a15157cc010000000853005165510065acffffffff94fe1dbd2dd303b9a0b9bdca91a9a60e570dfe045430e1a15d3eeab17820e5aa010000000153ffffffff0285902c03000000000965656a636aacac5265bbfc9c040000000008526a656a00510053b8103a5a00", "acacacac", 0, 2082278063, "88dae8242e5b0a78d45f10ddf95484dd054b54593a9d628089fb4e7acd2780ea"], + ["1ea2ed0c01661b35c43204da609fc7f20a8b13375306b75a4ddd7d3d237926c64b29eb5f710100000005656a005251ffffffff0437659002000000000100c705590200000000056a6565526ac4159405000000000463ac00acccec2a010000000008650063acac6a63510000000001bf888b0300000000000000000000000028211d5f772cc74dc6d508135082a3367bce010bfebccc5bf06f7bdd289bca7f24844b3f3c4488c580bb0fa028e20628948fbaf90e882b704b2925b05e00a3673dd93548926a395d94570341a7915006394beb7117a93f689c0d520fcf525c84000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007c0dfc344408b7e67889b81538578c24bcbf6cf56bde92f093809b8a819a642fb3d6b44ba007f806b6447c256e63fea0de381b787a7df16935962df680a0e26bd9cc3028ca6caa9ce9402e2d53b8071aa187e330d09ec89db39eca446a47a9ddebff76daf74b1f4cc49c5254cea8921d491b9d0cd55330aaf941b6047cf272ff022672efb1bdb703300d621eeb279e81678c3dfa04e176465b57db3b327d37d0450203befd08198d0563a1f01b94563196beadbeaa08913bc55f1edc37e234e78c0b0a03504e45e7d8cdbf01e9821fa099d9e0c61efeecf94b442b9190839babe77b32da969c75dd6c4d2b0959d41e43d988d8157389bbdd75891419a2cd36d8bf7f9f031de299bfb2805bd2f11e1a396135dbb2c6f0a2d1ad236e25073b2af15bace7a3022940a1e54e558683e0e8585ccdba300a5a9daa6bae7223a232cd876534ca332702067abc6d02c4c2f83052ad867e51d994caf0dd2280af656739f4e75b31c094f90316348945ff615600913201d090d9f6de671d05add42de8a9d42a3d9788c508870209d0f3698278d8f996fc6a4c2eab3e7d1ff29f32d021ecdc39e51a690c86f395beadcf940ced64e760e08bf37306b693812074982d4e99c42fbb4bb37124ae9be14923dcde1443a80957ada6d78bf165737da372e4b91eea77256b1abf4c1786ff6622cfa2f2346790f24562475e7580eca6c2f6c612ebec3dd9a60fe67ddf7ee39c033884fc5a3e8aa4d4d2cfc9433a1b23283f0fbdf036b57cf3f1ad1b3d2c451e8eda8c4e1fe6263738df67acd4484e497a64940fa25d8b15598be643a6f9476ad42eb9af421ebcace1b2437cc46b7c9e804ba5d4ea254057ad866668385f77b5e8c582d38cbc5c186f26702d19e277fc25e36c14b817d7725fb6f11545aff38f04888d26f5a557ea59e24d40764599ec5d0612061e209932e41ac89ca9453036c3220431911b87d082b802dcad040fda1335591dbcd4962f951247049c6289f23f039732517b0f07ddfc0698666789cbadd6c277ac6d13bd4b28c596c3b0788ec278a138ad86cf73a517a005100f260d54a2f2c16ffb4485bb9d5b03237196f6b4f5e6a0c8edb04131a2d30795e32d7a380c6557e6be7b8aa087c0e5632b4fbe623dc2ab91514f1afcef21edf2a09fe15dc994770365bd3a291c6b3fb673577ba26ea8d236e31f5a42c508c87e2948c26ad9b1a8941c2fc64056b1dfd171db277419dd8b3ff624ee144c55507726f81229a730dd9af2c590c2f1c5689ad403f69dc93e90e48253374e337a623ec678deeefb1ab4adf412e50f9668ab5bf4b843ec205d4aacf038537c8d8702122abc27279caae6fc52f9465ba9e200d5e754aaf3f9aaa0286a5d7d5b0f58f6d8a413c82471fc27215ca98ea730e7bacb41bbae29e2729c0cf470e19623f76ba74593fba2fa138a4b5d7e1b29d4de134ff9cb4f56d29563480f8310e480881c8fbeb226ecaba806b4ca6d70edd79a04329d914658aed2ce210085a6f77924461eb48ac809882195e69e19a663eb70c2bc637e8b7db010d8191c9869467de76c9e0dd74df3fd5dd84a51ed4e6f7a631dda66cf191589b02beae83e3e8714bc543c588c9fc507e00ae7d51c36804df1909f7ed148ff2e396dc400b09db61be8b4f6fcff9c2d789cb2a300d9165db553b80f52723b0b196dabdaa3cf958d7b0228a33c8252e6168311b6de16ac591c6e3510df1659df791ac7c1161fe8e6667988c6078b32aca8389ee4ce45c59b9779546cf5987b40af497f30301a2aff75ae516a3c8162a0e55e2b7c9226624876fb3006a954d428294fde309c3dcd68e67dc51dc8701e0177531b845b5ee4e5537d1106ac447b97581687c87cfe5af439d1f00de2bbad8c612f5054fe12b295c35644ae32ed55212339f61fabe2ecde69d5f16cda2466560b21e921742e205e952ce327c0ce1a6b6d87d5d6eb51e3da64a39b5b11ba2c0d8a9f3d376ff1d86c8538f468b46d42b2697ef6c308b7177ca5eac46d573e793d5e367b3e92e58508bee830ebabfb5197a98c7d3bbbd7b68b0734f6c6c4ed15f3f5185b20770cb48f7523012d75bea72fbf4ee242495e90c1955ac69f3fbab6d4121074046c0e02faed77e79e27ad1bd61574c0f1f30c444b40650c65987d7665659906214ad61e5760014d5f48392b4ee8480c1802b6df5ed07f6476a1eae967199485a64ef9ef3d6eb84460fd471817620f7d584475a8053173467f7b2fd4482f0c9a46d9404dba369f1ff2450c78078dc6d863558ca11a5fe0a3db81edac79637bb68b837a2beddff24edc81fb0bfa3f7383253383bea8b2294997486b94768b584e45f4677ba708676d0598879278c36a79e96a96d841cda3c78dbfe15265f9ae9c1cc0b26c0622f431506cd96d41d3802bc2dbb21e7151c1698c3eae00", "0052525252ac53acac", 0, 449901703, "c1271b94dfdd97dd61a327e1e80ff95a2743bf061e389c5ad7699f724b734d40"] ] diff --git a/src/test/sighash_tests.cpp b/src/test/sighash_tests.cpp index 13d3dd226..3f2c9ecbf 100644 --- a/src/test/sighash_tests.cpp +++ b/src/test/sighash_tests.cpp @@ -2,6 +2,7 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. +#include "consensus/upgrades.h" #include "consensus/validation.h" #include "data/sighash.json.h" #include "main.h" @@ -93,10 +94,26 @@ void static RandomScript(CScript &script) { } void static RandomTransaction(CMutableTransaction &tx, bool fSingle) { - tx.nVersion = insecure_rand(); + tx.fOverwintered = insecure_rand() % 2; + if (tx.fOverwintered) { + // Versions outside known ranges throw an exception during parsing + auto range = + CTransaction::OVERWINTER_MAX_CURRENT_VERSION - CTransaction::OVERWINTER_MIN_CURRENT_VERSION; + if (range > 0) { + tx.nVersion = + (insecure_rand() % range) + + CTransaction::OVERWINTER_MIN_CURRENT_VERSION; + } else { + tx.nVersion = CTransaction::OVERWINTER_MIN_CURRENT_VERSION; + } + tx.nVersionGroupId = OVERWINTER_VERSION_GROUP_ID; + } else { + tx.nVersion = insecure_rand() & 0x7FFFFFFF; + } tx.vin.clear(); tx.vout.clear(); tx.nLockTime = (insecure_rand() % 2) ? insecure_rand() : 0; + tx.nExpiryHeight = (insecure_rand() % 2) ? insecure_rand() : 0; int ins = (insecure_rand() % 4) + 1; int outs = fSingle ? ins : (insecure_rand() % 4) + 1; int joinsplits = (insecure_rand() % 4); @@ -187,13 +204,15 @@ BOOST_AUTO_TEST_CASE(sighash_test) std::cout << HexStr(scriptCode) << "\", "; std::cout << nIn << ", "; std::cout << nHashType << ", \""; - std::cout << sho.GetHex() << "\"]"; + std::cout << (txTo.fOverwintered ? sh.GetHex() : sho.GetHex()) << "\"]"; if (i+1 != nRandomTests) { std::cout << ","; } std::cout << "\n"; #endif - BOOST_CHECK(sh == sho); + if (!txTo.fOverwintered) { + BOOST_CHECK(sh == sho); + } } #if defined(PRINT_SIGHASH_JSON) std::cout << "]\n"; @@ -234,7 +253,16 @@ BOOST_AUTO_TEST_CASE(sighash_from_data) stream >> tx; CValidationState state; - if (tx.nVersion < SPROUT_MIN_TX_VERSION) { + if (tx.fOverwintered) { + if (tx.nVersion == 3 && tx.nExpiryHeight > TX_EXPIRY_HEIGHT_THRESHOLD) { + // Transaction must be invalid + BOOST_CHECK_MESSAGE(!CheckTransactionWithoutProofVerification(tx, state), strTest); + BOOST_CHECK(!state.IsValid()); + } else { + BOOST_CHECK_MESSAGE(CheckTransactionWithoutProofVerification(tx, state), strTest); + BOOST_CHECK(state.IsValid()); + } + } else if (tx.nVersion < OVERWINTER_MIN_TX_VERSION) { // Transaction must be invalid BOOST_CHECK_MESSAGE(!CheckTransactionWithoutProofVerification(tx, state), strTest); BOOST_CHECK(!state.IsValid()); From fa78211ed76c9fede76dc846ee73c9e0bbea6859 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 16 Feb 2018 15:42:04 -0800 Subject: [PATCH 0452/1062] Add test to check malformed v1 transaction against Overwinter tx parser --- src/gtest/test_checktransaction.cpp | 62 +++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/src/gtest/test_checktransaction.cpp b/src/gtest/test_checktransaction.cpp index 704be83ef..11e2d2024 100644 --- a/src/gtest/test_checktransaction.cpp +++ b/src/gtest/test_checktransaction.cpp @@ -704,3 +704,65 @@ TEST(checktransaction_tests, OverwinteredContextualCreateTx) { // Revert to default UpdateNetworkUpgradeParameters(Consensus::UPGRADE_OVERWINTER, Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT); } + +// Test a v1 transaction which has a malformed header, perhaps modified in-flight +TEST(checktransaction_tests, BadTxReceivedOverNetwork) +{ + // First four bytes <01 00 00 00> have been modified to be (-4 as an int32) + std::string goodPrefix = "01000000"; + std::string badPrefix = "fcffffff"; + std::string hexTx = "0176c6541939b95f8d8b7779a77a0863b2a0267e281a050148326f0ea07c3608fb000000006a47304402207c68117a6263486281af0cc5d3bee6db565b6dce19ffacc4cb361906eece82f8022007f604382dee2c1fde41c4e6e7c1ae36cfa28b5b27350c4bfaa27f555529eace01210307ff9bef60f2ac4ceb1169a9f7d2c773d6c7f4ab6699e1e5ebc2e0c6d291c733feffffff02c0d45407000000001976a9145eaaf6718517ec8a291c6e64b16183292e7011f788ac5ef44534000000001976a91485e12fb9967c96759eae1c6b1e9c07ce977b638788acbe000000"; + + // Good v1 tx + { + std::vector txData(ParseHex(goodPrefix + hexTx )); + CDataStream ssData(txData, SER_NETWORK, PROTOCOL_VERSION); + CTransaction tx; + ssData >> tx; + EXPECT_EQ(tx.nVersion, 1); + EXPECT_EQ(tx.fOverwintered, false); + } + + // Good v1 mutable tx + { + std::vector txData(ParseHex(goodPrefix + hexTx )); + CDataStream ssData(txData, SER_NETWORK, PROTOCOL_VERSION); + CMutableTransaction mtx; + ssData >> mtx; + EXPECT_EQ(mtx.nVersion, 1); + } + + // Bad tx + { + std::vector txData(ParseHex(badPrefix + hexTx )); + CDataStream ssData(txData, SER_NETWORK, PROTOCOL_VERSION); + try { + CTransaction tx; + ssData >> tx; + FAIL() << "Expected std::ios_base::failure 'Unknown transaction format'"; + } + catch(std::ios_base::failure & err) { + EXPECT_THAT(err.what(), testing::HasSubstr(std::string("Unknown transaction format"))); + } + catch(...) { + FAIL() << "Expected std::ios_base::failure 'Unknown transaction format', got some other exception"; + } + } + + // Bad mutable tx + { + std::vector txData(ParseHex(badPrefix + hexTx )); + CDataStream ssData(txData, SER_NETWORK, PROTOCOL_VERSION); + try { + CMutableTransaction mtx; + ssData >> mtx; + FAIL() << "Expected std::ios_base::failure 'Unknown transaction format'"; + } + catch(std::ios_base::failure & err) { + EXPECT_THAT(err.what(), testing::HasSubstr(std::string("Unknown transaction format"))); + } + catch(...) { + FAIL() << "Expected std::ios_base::failure 'Unknown transaction format', got some other exception"; + } + } +} \ No newline at end of file From a99ca25a5adfc520fff84bcf5156917cebda7d54 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Sat, 17 Feb 2018 02:03:34 -0300 Subject: [PATCH 0453/1062] cryptocondition transaction is standard too --- src/script/script.cpp | 23 +++++++++++++++++++++++ src/script/script.h | 2 ++ src/script/standard.cpp | 7 +++++++ src/script/standard.h | 1 + 4 files changed, 33 insertions(+) diff --git a/src/script/script.cpp b/src/script/script.cpp index 3cb3f855d..a78bd7e29 100644 --- a/src/script/script.cpp +++ b/src/script/script.cpp @@ -223,6 +223,29 @@ bool CScript::IsPayToScriptHash() const this->at(22) == OP_EQUAL); } +bool CScript::IsPayToCryptoCondition() const +{ + const_iterator pc = this->begin(); + vector data; + int i; + while (pc < this->end()) + { + opcodetype opcode; + if (!this->GetOp(pc, opcode, data)) + return 0; + if (0 == i) + if (opcode != OP_PUSHDATA1) + return 0; + if (1 == i) + if (opcode != OP_CHECKCRYPTOCONDITION) + return 0; + if (i > 1) + return 0; + i++; + } + return 1; +} + bool CScript::IsPushOnly() const { const_iterator pc = begin(); diff --git a/src/script/script.h b/src/script/script.h index 584fefac1..800289a15 100644 --- a/src/script/script.h +++ b/src/script/script.h @@ -176,6 +176,7 @@ enum opcodetype OP_PUBKEYS = 0xfb, OP_PUBKEYHASH = 0xfd, OP_PUBKEY = 0xfe, + OP_CRYPTOCONDITION = 0xfc, OP_INVALIDOPCODE = 0xff, }; @@ -563,6 +564,7 @@ public: unsigned int GetSigOpCount(const CScript& scriptSig) const; bool IsPayToScriptHash() const; + bool IsPayToCryptoCondition() const; /** Called by IsStandardTx and P2SH/BIP62 VerifyScript (which makes it consensus-critical). */ bool IsPushOnly() const; diff --git a/src/script/standard.cpp b/src/script/standard.cpp index 71838853d..c304840f4 100644 --- a/src/script/standard.cpp +++ b/src/script/standard.cpp @@ -68,6 +68,13 @@ bool Solver(const CScript& scriptPubKey, txnouttype& typeRet, vector Date: Sat, 17 Feb 2018 20:45:00 -0800 Subject: [PATCH 0454/1062] Read hashReserved from disk instead of assuming 0 Related to https://github.com/zcash/zcash/pull/2931 --- src/txdb.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/txdb.cpp b/src/txdb.cpp index 868d3d4cd..9a23596d9 100644 --- a/src/txdb.cpp +++ b/src/txdb.cpp @@ -302,6 +302,7 @@ bool CBlockTreeDB::LoadBlockIndexGuts() pindexNew->nUndoPos = diskindex.nUndoPos; pindexNew->hashAnchor = diskindex.hashAnchor; pindexNew->nVersion = diskindex.nVersion; + pindexNew->hashReserved = diskindex.hashReserved; pindexNew->hashMerkleRoot = diskindex.hashMerkleRoot; pindexNew->nTime = diskindex.nTime; pindexNew->nBits = diskindex.nBits; From 5b383ba7f466e3afa24ee04bd854950d4148ad24 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Sun, 18 Feb 2018 18:49:04 -0300 Subject: [PATCH 0455/1062] enable cryptoconditions spending --- src/script/script.cpp | 23 ++++++++++++++--------- src/script/standard.cpp | 4 +++- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/script/script.cpp b/src/script/script.cpp index a78bd7e29..c5eab8ca8 100644 --- a/src/script/script.cpp +++ b/src/script/script.cpp @@ -227,21 +227,26 @@ bool CScript::IsPayToCryptoCondition() const { const_iterator pc = this->begin(); vector data; - int i; + int i = 0; while (pc < this->end()) { opcodetype opcode; if (!this->GetOp(pc, opcode, data)) return 0; - if (0 == i) - if (opcode != OP_PUSHDATA1) + switch (i++) { + case 0: + // Binary condition should be less than 76 bytes + if (!(opcode > OP_0 && opcode < OP_PUSHDATA1)) + return 0; + break; + case 1: + if (opcode != OP_CHECKCRYPTOCONDITION) + return 0; + break; + default: return 0; - if (1 == i) - if (opcode != OP_CHECKCRYPTOCONDITION) - return 0; - if (i > 1) - return 0; - i++; + break; + } } return 1; } diff --git a/src/script/standard.cpp b/src/script/standard.cpp index c304840f4..4dadaff56 100644 --- a/src/script/standard.cpp +++ b/src/script/standard.cpp @@ -71,7 +71,7 @@ bool Solver(const CScript& scriptPubKey, txnouttype& typeRet, vector Date: Sun, 18 Feb 2018 23:59:52 +0200 Subject: [PATCH 0456/1062] MAX_MONEY to handle mining chains --- src/komodo_utils.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/komodo_utils.h b/src/komodo_utils.h index 617e9c423..9f7384883 100644 --- a/src/komodo_utils.h +++ b/src/komodo_utils.h @@ -1587,7 +1587,9 @@ void komodo_args(char *argv0) strncpy(ASSETCHAINS_SYMBOL,name.c_str(),sizeof(ASSETCHAINS_SYMBOL)-1); if ( (baseid= komodo_baseid(ASSETCHAINS_SYMBOL)) >= 0 && baseid < 32 ) MAX_MONEY = komodo_maxallowed(baseid); - else MAX_MONEY = (ASSETCHAINS_SUPPLY+1) * SATOSHIDEN; + else if ( ASSETCHAINS_REWARD == 0 ) + MAX_MONEY = (ASSETCHAINS_SUPPLY+1) * SATOSHIDEN; + else MAX_MONEY = (ASSETCHAINS_SUPPLY+1) * SATOSHIDEN + ASSETCHAINS_REWARD * (ASSETCHAINS_ENDSUBSIDY==0 ? 10000000 : ASSETCHAINS_ENDSUBSIDY); //printf("baseid.%d MAX_MONEY.%s %.8f\n",baseid,ASSETCHAINS_SYMBOL,(double)MAX_MONEY/SATOSHIDEN); ASSETCHAINS_PORT = komodo_port(ASSETCHAINS_SYMBOL,ASSETCHAINS_SUPPLY,&ASSETCHAINS_MAGIC,extraptr,extralen); while ( (dirname= (char *)GetDataDir(false).string().c_str()) == 0 || dirname[0] == 0 ) From 052f0068008a5f6db587551bfeee1165cbccc222 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Feb 2018 00:08:02 +0200 Subject: [PATCH 0457/1062] ASSETCHAINS_CC --- src/komodo_globals.h | 2 +- src/komodo_utils.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/komodo_globals.h b/src/komodo_globals.h index f666d9c6f..6c2e56f5b 100644 --- a/src/komodo_globals.h +++ b/src/komodo_globals.h @@ -44,7 +44,7 @@ struct komodo_state KOMODO_STATES[34]; int COINBASE_MATURITY = _COINBASE_MATURITY;//100; int32_t IS_KOMODO_NOTARY,USE_EXTERNAL_PUBKEY,KOMODO_CHOSEN_ONE,ASSETCHAINS_SEED,KOMODO_ON_DEMAND,KOMODO_EXTERNAL_NOTARIES,KOMODO_PASSPORT_INITDONE,KOMODO_PAX,KOMODO_EXCHANGEWALLET,KOMODO_REWIND; -int32_t KOMODO_LASTMINED,prevKOMODO_LASTMINED,JUMBLR_PAUSE; +int32_t KOMODO_LASTMINED,prevKOMODO_LASTMINED,JUMBLR_PAUSE,ASSETCHAINS_CC; std::string NOTARY_PUBKEY,ASSETCHAINS_NOTARIES,ASSETCHAINS_OVERRIDE_PUBKEY; uint8_t NOTARY_PUBKEY33[33],ASSETCHAINS_OVERRIDE_PUBKEY33[33]; diff --git a/src/komodo_utils.h b/src/komodo_utils.h index 9f7384883..231d1a3c4 100644 --- a/src/komodo_utils.h +++ b/src/komodo_utils.h @@ -1535,6 +1535,7 @@ void komodo_args(char *argv0) } } } + ASSETCHAINS_CC = GetArg("-ac_cc",0); if ( (KOMODO_REWIND= GetArg("-rewind",0)) != 0 ) { printf("KOMODO_REWIND %d\n",KOMODO_REWIND); From 5be9870f7755995cdca31d3a78d203559c23dde8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Feb 2018 00:11:38 +0200 Subject: [PATCH 0458/1062] A comment --- src/komodo_utils.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_utils.h b/src/komodo_utils.h index 231d1a3c4..b4b5297e2 100644 --- a/src/komodo_utils.h +++ b/src/komodo_utils.h @@ -1535,7 +1535,7 @@ void komodo_args(char *argv0) } } } - ASSETCHAINS_CC = GetArg("-ac_cc",0); + ASSETCHAINS_CC = GetArg("-ac_cc",0); // keep it outside the assetchains hashing so KMD can do it and we dont have two identical chains other than -ac_cc if ( (KOMODO_REWIND= GetArg("-rewind",0)) != 0 ) { printf("KOMODO_REWIND %d\n",KOMODO_REWIND); From 28b946127bb9439165f26844e37a160ee0f33946 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Sun, 18 Feb 2018 19:35:48 -0300 Subject: [PATCH 0459/1062] make IsPayToCryptoCondition neat --- src/script/script.cpp | 31 +++++++++---------------------- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/src/script/script.cpp b/src/script/script.cpp index c5eab8ca8..5069d9152 100644 --- a/src/script/script.cpp +++ b/src/script/script.cpp @@ -227,28 +227,15 @@ bool CScript::IsPayToCryptoCondition() const { const_iterator pc = this->begin(); vector data; - int i = 0; - while (pc < this->end()) - { - opcodetype opcode; - if (!this->GetOp(pc, opcode, data)) - return 0; - switch (i++) { - case 0: - // Binary condition should be less than 76 bytes - if (!(opcode > OP_0 && opcode < OP_PUSHDATA1)) - return 0; - break; - case 1: - if (opcode != OP_CHECKCRYPTOCONDITION) - return 0; - break; - default: - return 0; - break; - } - } - return 1; + opcodetype opcode; + if (this->GetOp(pc, opcode, data)) + // Sha256 conditions are <76 bytes + if (opcode > OP_0 && opcode < OP_PUSHDATA1) + if (this->GetOp(pc, opcode, data)) + if (opcode == OP_CHECKCRYPTOCONDITION) + if (pc == this->end()) + return 1; + return 0; } bool CScript::IsPushOnly() const From 6263d4023951ec1ae40b416e551446bcd273e1f9 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Sun, 18 Feb 2018 20:38:29 -0300 Subject: [PATCH 0460/1062] guard cryptoconditions --- src/script/interpreter.cpp | 5 ++++- src/script/standard.cpp | 13 ++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 94727cbca..f203ccf85 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -940,7 +940,9 @@ bool EvalScript(vector >& stack, const CScript& script, un case OP_CHECKCRYPTOCONDITION: case OP_CHECKCRYPTOCONDITIONVERIFY: { - // (fulfillment condition -- bool) + if (!IsCryptoConditionsEnabled()) { + goto INTERPRETER_DEFAULT; + } if (stack.size() < 2) return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); @@ -982,6 +984,7 @@ bool EvalScript(vector >& stack, const CScript& script, un } break; +INTERPRETER_DEFAULT: default: return set_error(serror, SCRIPT_ERR_BAD_OPCODE); } diff --git a/src/script/standard.cpp b/src/script/standard.cpp index 4dadaff56..308f4e085 100644 --- a/src/script/standard.cpp +++ b/src/script/standard.cpp @@ -9,6 +9,7 @@ #include "script/script.h" #include "util.h" #include "utilstrencodings.h" +#include "komodo_cryptoconditions.h" #include @@ -68,11 +69,13 @@ bool Solver(const CScript& scriptPubKey, txnouttype& typeRet, vector Date: Sun, 18 Feb 2018 20:40:24 -0300 Subject: [PATCH 0461/1062] guard cryptoconditions --- src/komodo_cryptoconditions.h | 13 ++++++++++++- src/script/interpreter.cpp | 6 ++++-- src/script/standard.cpp | 13 ++++++++----- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/komodo_cryptoconditions.h b/src/komodo_cryptoconditions.h index d5e643c91..3cfc15e12 100644 --- a/src/komodo_cryptoconditions.h +++ b/src/komodo_cryptoconditions.h @@ -1,8 +1,19 @@ +#ifndef KOMODO_CRYPTOCONDITIONS_H +#define KOMODO_CRYPTOCONDITIONS_H +#include "cryptoconditions/include/cryptoconditions.h" + +extern int32_t ASSETCHAINS_CC; + +static bool IsCryptoConditionsEnabled() { + return 0 != ASSETCHAINS_CC; +} /* * Method stub for aux conditions. Unimplemented, thus fails if an aux condition is encountered. */ -int komodoCCAux(CC *cond, void *context) { +static int komodoCCAux(CC *cond, void *context) { return 0; } + +#endif /* KOMODO_CRYPTOCONDITIONS_H */ diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 94727cbca..4e03527a4 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -13,7 +13,6 @@ #include "pubkey.h" #include "script/script.h" #include "uint256.h" -#include "cryptoconditions/include/cryptoconditions.h" #include "komodo_cryptoconditions.h" @@ -940,7 +939,9 @@ bool EvalScript(vector >& stack, const CScript& script, un case OP_CHECKCRYPTOCONDITION: case OP_CHECKCRYPTOCONDITIONVERIFY: { - // (fulfillment condition -- bool) + if (!IsCryptoConditionsEnabled()) { + goto INTERPRETER_DEFAULT; + } if (stack.size() < 2) return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); @@ -982,6 +983,7 @@ bool EvalScript(vector >& stack, const CScript& script, un } break; +INTERPRETER_DEFAULT: default: return set_error(serror, SCRIPT_ERR_BAD_OPCODE); } diff --git a/src/script/standard.cpp b/src/script/standard.cpp index 4dadaff56..60f059ac3 100644 --- a/src/script/standard.cpp +++ b/src/script/standard.cpp @@ -9,6 +9,7 @@ #include "script/script.h" #include "util.h" #include "utilstrencodings.h" +#include "komodo_cryptoconditions.h" #include @@ -68,11 +69,13 @@ bool Solver(const CScript& scriptPubKey, txnouttype& typeRet, vector Date: Sun, 18 Feb 2018 21:48:58 -0300 Subject: [PATCH 0462/1062] remove test file that shoudnt be there --- qa/test_rpc_cryptoconditions.py | 47 --------------------------------- 1 file changed, 47 deletions(-) delete mode 100644 qa/test_rpc_cryptoconditions.py diff --git a/qa/test_rpc_cryptoconditions.py b/qa/test_rpc_cryptoconditions.py deleted file mode 100644 index a93eab86a..000000000 --- a/qa/test_rpc_cryptoconditions.py +++ /dev/null @@ -1,47 +0,0 @@ -import os -import subprocess -import json -import base64 - - -inputs = [ - { - 'txid': '9b907ef1e3c26fc71fe4a4b3580bc75264112f95050014157059c736f0202e71', - 'vout': 0, - 'fulfillment': { - 'type': 'preimage-sha-256', - 'preimage': '', - }, - } -] - -outputs = [ - { - "condition": { - 'type': 'preimage-sha-256', - 'preimage': '' - }, - "amount": 1, - } -] - -addresses = ['RQygCQA7ovCrVCHM3sSkDQjjQUg5X4SCJw'] -privkeys = ["UszeEw39HcoeRegZb74xuvngbcQ5jkwQZZVpAvBp1bvBhXD36ghX"] - - -proc = subprocess.Popen(['src/komodo-cli', 'createrawtransactioncc', json.dumps(inputs), json.dumps(outputs)], - stdout=subprocess.PIPE) - -assert not proc.wait() - -tx_hex = proc.stdout.read().strip() -tx = base64.b16decode(tx_hex, casefold=True) - -print repr(tx) - -proc = subprocess.Popen(['src/komodo-cli', 'signrawtransactioncc', tx_hex, json.dumps(privkeys)], - stdout=subprocess.PIPE) - -proc.wait() - -result = json.loads(proc.stdout.read()) From 4f0da23b911db5b9426dd9ef1076681552de459f Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Mon, 19 Feb 2018 01:22:27 -0300 Subject: [PATCH 0463/1062] integration test for hoek and komodod with -ac_cc --- qa/cryptoconditions/README.md | 1 + qa/cryptoconditions/test_integration.py | 78 +++++++++++++++++++++++++ qa/cryptoconditions/testsupport.py | 47 +++++++++++++++ 3 files changed, 126 insertions(+) create mode 100644 qa/cryptoconditions/README.md create mode 100644 qa/cryptoconditions/test_integration.py create mode 100644 qa/cryptoconditions/testsupport.py diff --git a/qa/cryptoconditions/README.md b/qa/cryptoconditions/README.md new file mode 100644 index 000000000..6c8e01d60 --- /dev/null +++ b/qa/cryptoconditions/README.md @@ -0,0 +1 @@ +Integration tests for Crypto-Conditions diff --git a/qa/cryptoconditions/test_integration.py b/qa/cryptoconditions/test_integration.py new file mode 100644 index 000000000..a47b458e1 --- /dev/null +++ b/qa/cryptoconditions/test_integration.py @@ -0,0 +1,78 @@ +import sys +import time +import json +from testsupport import * + + +def wait_for_block(height): + for i in range(100): + try: + return rpc.getblock(str(height)) + except RPCError as e: + time.sleep(3) + raise Exception('Time out waiting for block at height %s' % height) + + +def sign_and_submit(tx): + signed = hoek.signTxBitcoin({'tx': tx, 'privateKeys': [notary_sk]}) + signed = hoek.signTxEd25519({'tx': signed['tx'], 'privateKeys': [alice_sk]}) + encoded = hoek.encodeTx(signed) + try: + rpc.getrawtransaction(encoded['txid']) + return encoded['txid'] + except RPCError: + pass + print >> sys.stderr, "submit transaction: %s:%s" % (encoded['txid'], json.dumps(signed)) + return rpc.sendrawtransaction(encoded['hex']) + + +def test_basic_spend(): + block = wait_for_block(3) + reward_txid = block['tx'][0] + reward_tx_raw = rpc.getrawtransaction(reward_txid) + reward_tx = hoek.decodeTx({'hex': reward_tx_raw}) + balance = reward_tx['tx']['outputs'][0]['amount'] + + spend0 = { + 'inputs': [ + {'txid': reward_txid, 'idx': 0, 'script': {'pubkey': notary_pk}} + ], + "outputs": [ + {"amount": 1000, "script": {"condition": cond_alice}}, + {"amount": balance - 1000, "script": {"address": notary_addr}} + ] + } + + spend0_txid = sign_and_submit(spend0) + + spend1 = { + 'inputs': [ + {'txid': spend0_txid, 'idx': 0, 'script': {"fulfillment": cond_alice}}, + {'txid': spend0_txid, 'idx': 1, 'script': {'address': notary_addr}} + ], + 'outputs': [ + {"amount": balance, "script": {"address": notary_addr}} + ] + } + + spend1_txid = sign_and_submit(spend1) + + assert rpc.getrawtransaction(spend1_txid) + + print("all done!") + + +notary_addr = 'RXSwmXKtDURwXP7sdqNfsJ6Ga8RaxTchxE' +notary_pk = '0205a8ad0c1dbc515f149af377981aab58b836af008d4d7ab21bd76faf80550b47' +notary_sk = 'UxFWWxsf1d7w7K5TvAWSkeX4H95XQKwdwGv49DXwWUTzPTTjHBbU' +alice_pk = '8ryTLBMnozUK4xUz7y49fjzZhxDDMK7c4mucLdbVY6jW' +alice_sk = 'E4ER7uYvaSTdpQFzTXNNSTkR6jNRJyqhZPJMGuU899nY' +cond_alice = {"type": "ed25519-sha-256", "publicKey": alice_pk} + + + +if __name__ == '__main__': + hoek = Hoek() + rpc = Komodod('/home/scott/.komodo/CCWAT/CCWAT.conf') + test_basic_spend() + diff --git a/qa/cryptoconditions/testsupport.py b/qa/cryptoconditions/testsupport.py new file mode 100644 index 000000000..166d98d14 --- /dev/null +++ b/qa/cryptoconditions/testsupport.py @@ -0,0 +1,47 @@ +import sys +import json +import subprocess + + +class RPCError(IOError): + pass + + +class JsonClient(object): + def __getattr__(self, method): + def inner(*args): + return self._exec(method, args) + return inner + + def load_response(self, data): + data = json.loads(data) + if data.get('error'): + raise RPCError(data['error']) + if 'result' in data: + return data['result'] + return data + + +def run_cmd(cmd): + proc = subprocess.Popen(cmd, stdout=subprocess.PIPE) + #print >>sys.stderr, "> %s" % repr(cmd)[1:-1] + assert proc.wait() == 0 + return proc.stdout.read() + + +class Hoek(JsonClient): + def _exec(self, method, args): + return self.load_response(run_cmd(['hoek', method, json.dumps(args[0])])) + + +class Komodod(JsonClient): + def __init__(self, conf_path): + urltpl = 'http://$rpcuser:$rpcpassword@${rpchost:-127.0.0.1}:$rpcport' + cmd = ['bash', '-c', '. "%s"; echo -n %s' % (conf_path, urltpl)] + self.url = run_cmd(cmd) + + def _exec(self, method, args): + req = {'method': method, 'params': args, 'id': 1} + cmd = ['curl', '-s', '-H', 'Content-Type: application/json', '-d', json.dumps(req), self.url] + return self.load_response(run_cmd(cmd)) + From a236c673fe6fee1464b967a672afa43904155940 Mon Sep 17 00:00:00 2001 From: libscott Date: Mon, 19 Feb 2018 01:37:54 -0300 Subject: [PATCH 0464/1062] Update cryptoconditions test suite README --- qa/cryptoconditions/README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/qa/cryptoconditions/README.md b/qa/cryptoconditions/README.md index 6c8e01d60..d14ab5b7d 100644 --- a/qa/cryptoconditions/README.md +++ b/qa/cryptoconditions/README.md @@ -1 +1,7 @@ -Integration tests for Crypto-Conditions +# Integration tests for Crypto-Conditions + +These tests are for the [Crypto-Conditions](https://github.com/rfcs/crypto-conditions) functionality in Komodod, using [Hoek](https://github.com/libscott/hoek) as a tool to create and sign transactions. + +The tests use Python as a scripting language and each one should "just work" given Linux and a 2.7+ Python interpreter. Each file prefixed with "test_" is a test case. + +The tests require `hoek` to be on the $PATH. Included is a script to perform a complete installation of `hoek`. From d17b8ec6a2cb6e86c45b443eabaff8c4d2aa3572 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Mon, 19 Feb 2018 03:22:26 -0300 Subject: [PATCH 0465/1062] use a fanout tx to create inputs --- qa/cryptoconditions/test_integration.py | 48 ++----------- qa/cryptoconditions/testsupport.py | 93 ++++++++++++++++++++++--- 2 files changed, 90 insertions(+), 51 deletions(-) diff --git a/qa/cryptoconditions/test_integration.py b/qa/cryptoconditions/test_integration.py index a47b458e1..0bb004aeb 100644 --- a/qa/cryptoconditions/test_integration.py +++ b/qa/cryptoconditions/test_integration.py @@ -4,42 +4,14 @@ import json from testsupport import * -def wait_for_block(height): - for i in range(100): - try: - return rpc.getblock(str(height)) - except RPCError as e: - time.sleep(3) - raise Exception('Time out waiting for block at height %s' % height) - - -def sign_and_submit(tx): - signed = hoek.signTxBitcoin({'tx': tx, 'privateKeys': [notary_sk]}) - signed = hoek.signTxEd25519({'tx': signed['tx'], 'privateKeys': [alice_sk]}) - encoded = hoek.encodeTx(signed) - try: - rpc.getrawtransaction(encoded['txid']) - return encoded['txid'] - except RPCError: - pass - print >> sys.stderr, "submit transaction: %s:%s" % (encoded['txid'], json.dumps(signed)) - return rpc.sendrawtransaction(encoded['hex']) - - def test_basic_spend(): - block = wait_for_block(3) - reward_txid = block['tx'][0] - reward_tx_raw = rpc.getrawtransaction(reward_txid) - reward_tx = hoek.decodeTx({'hex': reward_tx_raw}) - balance = reward_tx['tx']['outputs'][0]['amount'] - spend0 = { 'inputs': [ - {'txid': reward_txid, 'idx': 0, 'script': {'pubkey': notary_pk}} + {'txid': fanout, 'idx': 0, 'script': {'address': notary_addr}} ], "outputs": [ - {"amount": 1000, "script": {"condition": cond_alice}}, - {"amount": balance - 1000, "script": {"address": notary_addr}} + {"amount": 500, "script": {"condition": cond_alice}}, + {"amount": 500, "script": {"address": notary_addr}} ] } @@ -51,7 +23,7 @@ def test_basic_spend(): {'txid': spend0_txid, 'idx': 1, 'script': {'address': notary_addr}} ], 'outputs': [ - {"amount": balance, "script": {"address": notary_addr}} + {"amount": 1000, "script": {"address": notary_addr}} ] } @@ -62,17 +34,7 @@ def test_basic_spend(): print("all done!") -notary_addr = 'RXSwmXKtDURwXP7sdqNfsJ6Ga8RaxTchxE' -notary_pk = '0205a8ad0c1dbc515f149af377981aab58b836af008d4d7ab21bd76faf80550b47' -notary_sk = 'UxFWWxsf1d7w7K5TvAWSkeX4H95XQKwdwGv49DXwWUTzPTTjHBbU' -alice_pk = '8ryTLBMnozUK4xUz7y49fjzZhxDDMK7c4mucLdbVY6jW' -alice_sk = 'E4ER7uYvaSTdpQFzTXNNSTkR6jNRJyqhZPJMGuU899nY' -cond_alice = {"type": "ed25519-sha-256", "publicKey": alice_pk} - - if __name__ == '__main__': - hoek = Hoek() - rpc = Komodod('/home/scott/.komodo/CCWAT/CCWAT.conf') + fanout = setup() test_basic_spend() - diff --git a/qa/cryptoconditions/testsupport.py b/qa/cryptoconditions/testsupport.py index 166d98d14..c33a611d2 100644 --- a/qa/cryptoconditions/testsupport.py +++ b/qa/cryptoconditions/testsupport.py @@ -1,5 +1,7 @@ import sys import json +import time +import argparse import subprocess @@ -31,17 +33,92 @@ def run_cmd(cmd): class Hoek(JsonClient): def _exec(self, method, args): - return self.load_response(run_cmd(['hoek', method, json.dumps(args[0])])) + cmd = ['hoek', method, json.dumps(args[0])] + return self.load_response(run_cmd(cmd)) class Komodod(JsonClient): - def __init__(self, conf_path): - urltpl = 'http://$rpcuser:$rpcpassword@${rpchost:-127.0.0.1}:$rpcport' - cmd = ['bash', '-c', '. "%s"; echo -n %s' % (conf_path, urltpl)] - self.url = run_cmd(cmd) - def _exec(self, method, args): req = {'method': method, 'params': args, 'id': 1} - cmd = ['curl', '-s', '-H', 'Content-Type: application/json', '-d', json.dumps(req), self.url] + cmd = ['curl', '-s', '-H', 'Content-Type: application/json', + '-d', json.dumps(req), CONFIG['komodod_url']] return self.load_response(run_cmd(cmd)) - + + +rpc = Komodod() +hoek = Hoek() + + +def wait_for_block(height): + print >>sys.stderr, "Waiting for block height %s" % height + for i in range(100): + try: + return rpc.getblock(str(height)) + except RPCError as e: + time.sleep(3) + raise Exception('Time out waiting for block at height %s' % height) + + +def sign_and_submit(tx): + signed = hoek.signTxBitcoin({'tx': tx, 'privateKeys': [notary_sk]}) + signed = hoek.signTxEd25519({'tx': signed['tx'], 'privateKeys': [alice_sk]}) + encoded = hoek.encodeTx(signed) + try: + rpc.getrawtransaction(encoded['txid']) + print >> sys.stderr, "Transaction already in chain: %s" % encoded['txid'] + return encoded['txid'] + except RPCError: + pass + print >> sys.stderr, "submit transaction: %s:%s" % (encoded['txid'], json.dumps(signed)) + print encoded + return rpc.sendrawtransaction(encoded['hex']) + + + +CONFIG = None +FANOUT_TXID = None + + +def setup(): + global CONFIG, FANOUT_TXID + if not CONFIG: + parser = argparse.ArgumentParser(description='Crypto-Condition integration suite.') + parser.add_argument('komodod_conf', help='Location of Komodod config file') + args = parser.parse_args() + + urltpl = 'http://$rpcuser:$rpcpassword@${rpchost:-127.0.0.1}:$rpcport' + cmd = ['bash', '-c', '. %s && echo -n %s' % (args.komodod_conf, urltpl)] + url = run_cmd(cmd) + + CONFIG = {'komodod_url': url} + + if not FANOUT_TXID: + block = wait_for_block(1) + reward_txid = block['tx'][0] + reward_tx_raw = rpc.getrawtransaction(reward_txid) + reward_tx = hoek.decodeTx({'hex': reward_tx_raw}) + balance = reward_tx['tx']['outputs'][0]['amount'] + + n_outs = 100 + remainder = balance - n_outs * 1000 + + fanout = { + 'inputs': [ + {'txid': reward_txid, 'idx': 0, 'script': {'pubkey': notary_pk}} + ], + "outputs": (100 * [ + {"amount": 1000, "script": {"address": notary_addr}} + ] + [{"amount": remainder, 'script': {'address': notary_addr}}]) + } + + FANOUT_TXID = sign_and_submit(fanout) + + return FANOUT_TXID + + +notary_addr = 'RXSwmXKtDURwXP7sdqNfsJ6Ga8RaxTchxE' +notary_pk = '0205a8ad0c1dbc515f149af377981aab58b836af008d4d7ab21bd76faf80550b47' +notary_sk = 'UxFWWxsf1d7w7K5TvAWSkeX4H95XQKwdwGv49DXwWUTzPTTjHBbU' +alice_pk = '8ryTLBMnozUK4xUz7y49fjzZhxDDMK7c4mucLdbVY6jW' +alice_sk = 'E4ER7uYvaSTdpQFzTXNNSTkR6jNRJyqhZPJMGuU899nY' +cond_alice = {"type": "ed25519-sha-256", "publicKey": alice_pk} From 57e6ecda5a33115e3481ee542e642b19d3dd4667 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 21 Jun 2017 23:53:01 +1200 Subject: [PATCH 0466/1062] Implement roll-back limit for reorganisation Closes #713. --- qa/pull-tester/rpc-tests.sh | 1 + qa/rpc-tests/reorg_limit.py | 86 +++++++++++++++++++++++++++++ qa/rpc-tests/test_framework/util.py | 4 ++ src/main.cpp | 25 +++++++++ src/main.h | 2 + src/wallet/wallet.h | 4 +- 6 files changed, 120 insertions(+), 2 deletions(-) create mode 100755 qa/rpc-tests/reorg_limit.py diff --git a/qa/pull-tester/rpc-tests.sh b/qa/pull-tester/rpc-tests.sh index dfbd78f9a..a4f3f91d8 100755 --- a/qa/pull-tester/rpc-tests.sh +++ b/qa/pull-tester/rpc-tests.sh @@ -44,6 +44,7 @@ testScripts=( 'zcjoinsplit.py' 'zcjoinsplitdoublespend.py' 'zkey_import_export.py' + 'reorg_limit.py' 'getblocktemplate.py' 'bip65-cltv-p2p.py' 'bipdersig-p2p.py' diff --git a/qa/rpc-tests/reorg_limit.py b/qa/rpc-tests/reorg_limit.py new file mode 100755 index 000000000..3857498ee --- /dev/null +++ b/qa/rpc-tests/reorg_limit.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python2 +# Copyright (c) 2017 The Zcash developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +# +# Test reorg limit +# + +from test_framework.test_framework import BitcoinTestFramework +from test_framework.util import ( + check_node, + connect_nodes_bi, + initialize_chain_clean, + start_node, + sync_blocks, +) +from time import sleep + +def check_stopped(i, timeout=10): + stopped = False + for x in xrange(1, timeout): + ret = check_node(i) + if ret is None: + sleep(1) + else: + stopped = True + break + return stopped + +class ReorgLimitTest(BitcoinTestFramework): + + def run_test(self): + assert(self.nodes[0].getblockcount() == 200) + assert(self.nodes[2].getblockcount() == 200) + + self.split_network() + + print "Test the maximum-allowed reorg:" + print "Mine 99 blocks on Node 0" + self.nodes[0].generate(99) + assert(self.nodes[0].getblockcount() == 299) + assert(self.nodes[2].getblockcount() == 200) + + print "Mine competing 100 blocks on Node 2" + self.nodes[2].generate(100) + assert(self.nodes[0].getblockcount() == 299) + assert(self.nodes[2].getblockcount() == 300) + + print "Connect nodes to force a reorg" + connect_nodes_bi(self.nodes, 0, 2) + self.is_network_split = False + sync_blocks(self.nodes) + + print "Check Node 0 is still running and on the correct chain" + assert(self.nodes[0].getblockcount() == 300) + + self.split_network() + + print "Test the minimum-rejected reorg:" + print "Mine 100 blocks on Node 0" + self.nodes[0].generate(100) + assert(self.nodes[0].getblockcount() == 400) + assert(self.nodes[2].getblockcount() == 300) + + print "Mine competing 101 blocks on Node 2" + self.nodes[2].generate(101) + assert(self.nodes[0].getblockcount() == 400) + assert(self.nodes[2].getblockcount() == 401) + + print "Sync nodes to force a reorg" + connect_nodes_bi(self.nodes, 0, 2) + self.is_network_split = False + # sync_blocks uses RPC calls to wait for nodes to be synced, so don't + # call it here, because it will have a non-specific connection error + # when Node 0 stops. Instead, we explicitly check for the process itself + # to stop. + + print "Check Node 0 is no longer running" + assert(check_stopped(0)) + + # Dummy stop to enable the test to tear down + self.nodes[0].stop = lambda: True + +if __name__ == '__main__': + ReorgLimitTest().main() diff --git a/qa/rpc-tests/test_framework/util.py b/qa/rpc-tests/test_framework/util.py index 20267521f..f3ea481ee 100644 --- a/qa/rpc-tests/test_framework/util.py +++ b/qa/rpc-tests/test_framework/util.py @@ -213,6 +213,10 @@ def start_nodes(num_nodes, dirname, extra_args=None, rpchost=None, binary=None): def log_filename(dirname, n_node, logname): return os.path.join(dirname, "node"+str(n_node), "regtest", logname) +def check_node(i): + bitcoind_processes[i].poll() + return bitcoind_processes[i].returncode + def stop_node(node, i): node.stop() bitcoind_processes[i].wait() diff --git a/src/main.cpp b/src/main.cpp index 062507d0e..755b58b8a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2631,6 +2631,31 @@ static bool ActivateBestChainStep(CValidationState &state, CBlockIndex *pindexMo const CBlockIndex *pindexOldTip = chainActive.Tip(); const CBlockIndex *pindexFork = chainActive.FindFork(pindexMostWork); + // - On ChainDB initialization, pindexOldTip will be null, so there are no removable blocks. + // - If pindexMostWork is in a chain that doesn't have the same genesis block as our chain, + // then pindexFork will be null, and we would need to remove the entire chain including + // our genesis block. In practice this (probably) won't happen because of checks elsewhere. + auto reorgLength = pindexOldTip ? pindexOldTip->nHeight - (pindexFork ? pindexFork->nHeight : -1) : 0; + static_assert(MAX_REORG_LENGTH > 0, "We must be able to reorg some distance"); + if (reorgLength > MAX_REORG_LENGTH) { + auto msg = strprintf(_( + "A block chain reorganization has been detected that would roll back %d blocks! " + "This is larger than the maximum of %d blocks, and so the node is shutting down for your safety." + ), reorgLength, MAX_REORG_LENGTH) + "\n\n" + + _("Reorganization details") + ":\n" + + "- " + strprintf(_("Current tip: %s, height %d, work %s"), + pindexOldTip->phashBlock->GetHex(), pindexOldTip->nHeight, pindexOldTip->nChainWork.GetHex()) + "\n" + + "- " + strprintf(_("New tip: %s, height %d, work %s"), + pindexMostWork->phashBlock->GetHex(), pindexMostWork->nHeight, pindexMostWork->nChainWork.GetHex()) + "\n" + + "- " + strprintf(_("Fork point: %s, height %d"), + pindexFork->phashBlock->GetHex(), pindexFork->nHeight) + "\n\n" + + _("Please help, human!"); + LogPrintf("*** %s\n", msg); + uiInterface.ThreadSafeMessageBox(msg, "", CClientUIInterface::MSG_ERROR); + StartShutdown(); + return false; + } + // Disconnect active blocks which are no longer in the best chain. while (chainActive.Tip() && chainActive.Tip() != pindexFork) { if (!DisconnectTip(state)) diff --git a/src/main.h b/src/main.h index 03b0464eb..534034b91 100644 --- a/src/main.h +++ b/src/main.h @@ -56,6 +56,8 @@ static const unsigned int DEFAULT_BLOCK_PRIORITY_SIZE = DEFAULT_BLOCK_MAX_SIZE / static const bool DEFAULT_ALERTS = true; /** Minimum alert priority for enabling safe mode. */ static const int ALERT_PRIORITY_SAFE_MODE = 4000; +/** Maximum reorg length we will accept before we shut down and alert the user. */ +static const unsigned int MAX_REORG_LENGTH = COINBASE_MATURITY - 1; /** Maximum number of signature check operations in an IsStandard() P2SH script */ static const unsigned int MAX_P2SH_SIGOPS = 15; /** The maximum number of sigops we're willing to relay/mine in a single tx */ diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index eaaf6bbdf..dfe7b6a64 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -8,9 +8,9 @@ #include "amount.h" #include "coins.h" -#include "consensus/consensus.h" #include "key.h" #include "keystore.h" +#include "main.h" #include "primitives/block.h" #include "primitives/transaction.h" #include "tinyformat.h" @@ -58,7 +58,7 @@ static const unsigned int MAX_FREE_TRANSACTION_CREATE_SIZE = 1000; //! Size of witness cache // Should be large enough that we can expect not to reorg beyond our cache // unless there is some exceptional network disruption. -static const unsigned int WITNESS_CACHE_SIZE = COINBASE_MATURITY; +static const unsigned int WITNESS_CACHE_SIZE = MAX_REORG_LENGTH + 1; class CBlockIndex; class CCoinControl; From cb580c72413c42ee26398f98fd553a8b4cd7f64e Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Sun, 4 Feb 2018 00:35:41 +0000 Subject: [PATCH 0467/1062] Add rollback limit to block index rewinding This will prevent users from starting their nodes if they switch between software versions that implement different network upgrades. It will also prevent users from using the testnet if they have more than MAX_REORG_LIMIT post-upgrade blocks, and the upgrade point is shifted in a newer software version. --- src/main.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/main.cpp b/src/main.cpp index 755b58b8a..43aac0d18 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3826,6 +3826,26 @@ bool RewindBlockIndex(const CChainParams& params) } // nHeight is now the height of the first insufficiently-validated block, or tipheight + 1 + auto rewindLength = chainActive.Height() - nHeight; + if (rewindLength > 0 && rewindLength > MAX_REORG_LENGTH) { + auto pindexOldTip = chainActive.Tip(); + auto pindexRewind = chainActive[nHeight - 1]; + auto msg = strprintf(_( + "A block chain rewind has been detected that would roll back %d blocks! " + "This is larger than the maximum of %d blocks, and so the node is shutting down for your safety." + ), rewindLength, MAX_REORG_LENGTH) + "\n\n" + + _("Rewind details") + ":\n" + + "- " + strprintf(_("Current tip: %s, height %d"), + pindexOldTip->phashBlock->GetHex(), pindexOldTip->nHeight) + "\n" + + "- " + strprintf(_("Rewinding to: %s, height %d"), + pindexRewind->phashBlock->GetHex(), pindexRewind->nHeight) + "\n\n" + + _("Please help, human!"); + LogPrintf("*** %s\n", msg); + uiInterface.ThreadSafeMessageBox(msg, "", CClientUIInterface::MSG_ERROR); + StartShutdown(); + return false; + } + CValidationState state; CBlockIndex* pindex = chainActive.Tip(); while (chainActive.Height() >= nHeight) { From 82e6c354304e25b50063071ae2c864b7104cbfd6 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Mon, 19 Feb 2018 15:16:14 -0300 Subject: [PATCH 0468/1062] test with invalid crypto-condition fulfillment --- qa/cryptoconditions/test_integration.py | 92 ++++++++++++++++++---- qa/cryptoconditions/testsupport.py | 100 ++++++++++++------------ 2 files changed, 128 insertions(+), 64 deletions(-) diff --git a/qa/cryptoconditions/test_integration.py b/qa/cryptoconditions/test_integration.py index 0bb004aeb..87ee59825 100644 --- a/qa/cryptoconditions/test_integration.py +++ b/qa/cryptoconditions/test_integration.py @@ -1,40 +1,100 @@ import sys import time import json +import logging +import binascii from testsupport import * -def test_basic_spend(): +@fanout_input(0) +def test_basic_spend(inp): spend0 = { - 'inputs': [ - {'txid': fanout, 'idx': 0, 'script': {'address': notary_addr}} - ], + 'inputs': [inp], "outputs": [ {"amount": 500, "script": {"condition": cond_alice}}, {"amount": 500, "script": {"address": notary_addr}} ] } - - spend0_txid = sign_and_submit(spend0) - + spend0_txid = submit(sign(spend0)) spend1 = { 'inputs': [ {'txid': spend0_txid, 'idx': 0, 'script': {"fulfillment": cond_alice}}, {'txid': spend0_txid, 'idx': 1, 'script': {'address': notary_addr}} ], - 'outputs': [ - {"amount": 1000, "script": {"address": notary_addr}} - ] + 'outputs': [{"amount": 1000, "script": {"address": notary_addr}}] } - - spend1_txid = sign_and_submit(spend1) - + spend1_txid = submit(sign(spend1)) assert rpc.getrawtransaction(spend1_txid) - print("all done!") +@fanout_input(1) +def test_fulfillment_wrong_signature(inp): + spend0 = { + 'inputs': [inp], + "outputs": [{"amount": 1000, "script": {"condition": cond_bob}}] + } + spend0_txid = submit(sign(spend0)) + spend1 = { + 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {"fulfillment": cond_alice}}], + 'outputs': [{"amount": 1000, "script": {"address": notary_addr}}] + } + + signed = sign(spend1) + # Set the correct pubkey, signature is wrong + signed['tx']['inputs'][0]['script']['fulfillment']['publicKey'] = bob_pk + + try: + assert not submit(sign(spend1)), 'should raise an error' + except RPCError as e: + assert '16: mandatory-script-verify-flag-failed' in str(e), str(e) + + +@fanout_input(2) +def test_fulfillment_wrong_pubkey(inp): + spend0 = { + 'inputs': [inp], + "outputs": [{"amount": 1000, "script": {"condition": cond_alice}}] + } + spend0_txid = submit(sign(spend0)) + spend1 = { + 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {"fulfillment": cond_alice}}], + 'outputs': [{"amount": 1000, "script": {"address": notary_addr}}] + } + + signed = sign(spend1) + # Set the wrong pubkey, signature is correct + signed['tx']['inputs'][0]['script']['fulfillment']['publicKey'] = bob_pk + + try: + assert not submit(signed), 'should raise an error' + except RPCError as e: + assert '16: mandatory-script-verify-flag-failed' in str(e), str(e) + + +@fanout_input(3) +def test_fulfillment_invalid_fulfillment(inp): + spend0 = { + 'inputs': [inp], + "outputs": [{"amount": 1000, "script": {"condition": cond_alice}}] + } + spend0_txid = submit(sign(spend0)) + + # Create a valid script with an invalid fulfillment payload + script = binascii.hexlify(b"\007invalid").decode('utf-8') + + spend1 = { + 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': script}], + 'outputs': [{"amount": 1000, "script": {"address": notary_addr}}] + } + + try: + assert not submit({'tx': spend1}), 'should raise an error' + except RPCError as e: + assert 'Crypto-Condition payload is invalid' in str(e), str(e) if __name__ == '__main__': - fanout = setup() - test_basic_spend() + for name, f in globals().items(): + if name.startswith('test_'): + logging.info("Running test: %s" % name) + f() diff --git a/qa/cryptoconditions/testsupport.py b/qa/cryptoconditions/testsupport.py index c33a611d2..aad64e320 100644 --- a/qa/cryptoconditions/testsupport.py +++ b/qa/cryptoconditions/testsupport.py @@ -1,8 +1,10 @@ +from __future__ import print_function import sys import json import time -import argparse +import logging import subprocess +import functools class RPCError(IOError): @@ -11,12 +13,14 @@ class RPCError(IOError): class JsonClient(object): def __getattr__(self, method): + if method[0] == '_': + return getattr(super(JsonClient, self), method) def inner(*args): return self._exec(method, args) return inner def load_response(self, data): - data = json.loads(data) + data = json.loads(data.decode("utf-8")) if data.get('error'): raise RPCError(data['error']) if 'result' in data: @@ -26,7 +30,6 @@ class JsonClient(object): def run_cmd(cmd): proc = subprocess.Popen(cmd, stdout=subprocess.PIPE) - #print >>sys.stderr, "> %s" % repr(cmd)[1:-1] assert proc.wait() == 0 return proc.stdout.read() @@ -39,9 +42,13 @@ class Hoek(JsonClient): class Komodod(JsonClient): def _exec(self, method, args): + if not hasattr(self, '_url'): + urltpl = 'http://$rpcuser:$rpcpassword@${rpchost:-127.0.0.1}:$rpcport' + cmd = ['bash', '-c', '. $KOMODO_CONF_PATH && echo -n %s' % urltpl] + self._url = run_cmd(cmd) + req = {'method': method, 'params': args, 'id': 1} - cmd = ['curl', '-s', '-H', 'Content-Type: application/json', - '-d', json.dumps(req), CONFIG['komodod_url']] + cmd = ['curl', '-s', '-H', 'Content-Type: application/json', '-d', json.dumps(req), self._url] return self.load_response(run_cmd(cmd)) @@ -50,7 +57,7 @@ hoek = Hoek() def wait_for_block(height): - print >>sys.stderr, "Waiting for block height %s" % height + logging.info("Waiting for block height %s" % height) for i in range(100): try: return rpc.getblock(str(height)) @@ -59,61 +66,55 @@ def wait_for_block(height): raise Exception('Time out waiting for block at height %s' % height) -def sign_and_submit(tx): +def sign(tx): signed = hoek.signTxBitcoin({'tx': tx, 'privateKeys': [notary_sk]}) - signed = hoek.signTxEd25519({'tx': signed['tx'], 'privateKeys': [alice_sk]}) - encoded = hoek.encodeTx(signed) + return hoek.signTxEd25519({'tx': signed['tx'], 'privateKeys': [alice_sk]}) + + +def submit(tx): + encoded = hoek.encodeTx(tx) try: rpc.getrawtransaction(encoded['txid']) - print >> sys.stderr, "Transaction already in chain: %s" % encoded['txid'] + logging.info("Transaction already in chain: %s" % encoded['txid']) return encoded['txid'] except RPCError: pass - print >> sys.stderr, "submit transaction: %s:%s" % (encoded['txid'], json.dumps(signed)) - print encoded + logging.info("submit transaction: %s:%s" % (encoded['txid'], json.dumps(tx))) return rpc.sendrawtransaction(encoded['hex']) +def get_fanout_txid(): + block = wait_for_block(1) + reward_txid = block['tx'][0] + reward_tx_raw = rpc.getrawtransaction(reward_txid) + reward_tx = hoek.decodeTx({'hex': reward_tx_raw}) + balance = reward_tx['tx']['outputs'][0]['amount'] -CONFIG = None -FANOUT_TXID = None + n_outs = 100 + remainder = balance - n_outs * 1000 + + fanout = { + 'inputs': [ + {'txid': reward_txid, 'idx': 0, 'script': {'pubkey': notary_pk}} + ], + "outputs": (100 * [ + {"amount": 1000, "script": {"address": notary_addr}} + ] + [{"amount": remainder, 'script': {'address': notary_addr}}]) + } + + return submit(sign(fanout)) -def setup(): - global CONFIG, FANOUT_TXID - if not CONFIG: - parser = argparse.ArgumentParser(description='Crypto-Condition integration suite.') - parser.add_argument('komodod_conf', help='Location of Komodod config file') - args = parser.parse_args() +def fanout_input(n): + def decorate(f): + def wrapper(): + if not hasattr(fanout_input, 'txid'): + fanout_input.txid = get_fanout_txid() + inp = {'txid': fanout_input.txid, 'idx': n, 'script': {'address': notary_addr}} + f(inp) + return functools.wraps(f)(wrapper) + return decorate - urltpl = 'http://$rpcuser:$rpcpassword@${rpchost:-127.0.0.1}:$rpcport' - cmd = ['bash', '-c', '. %s && echo -n %s' % (args.komodod_conf, urltpl)] - url = run_cmd(cmd) - - CONFIG = {'komodod_url': url} - - if not FANOUT_TXID: - block = wait_for_block(1) - reward_txid = block['tx'][0] - reward_tx_raw = rpc.getrawtransaction(reward_txid) - reward_tx = hoek.decodeTx({'hex': reward_tx_raw}) - balance = reward_tx['tx']['outputs'][0]['amount'] - - n_outs = 100 - remainder = balance - n_outs * 1000 - - fanout = { - 'inputs': [ - {'txid': reward_txid, 'idx': 0, 'script': {'pubkey': notary_pk}} - ], - "outputs": (100 * [ - {"amount": 1000, "script": {"address": notary_addr}} - ] + [{"amount": remainder, 'script': {'address': notary_addr}}]) - } - - FANOUT_TXID = sign_and_submit(fanout) - - return FANOUT_TXID notary_addr = 'RXSwmXKtDURwXP7sdqNfsJ6Ga8RaxTchxE' @@ -122,3 +123,6 @@ notary_sk = 'UxFWWxsf1d7w7K5TvAWSkeX4H95XQKwdwGv49DXwWUTzPTTjHBbU' alice_pk = '8ryTLBMnozUK4xUz7y49fjzZhxDDMK7c4mucLdbVY6jW' alice_sk = 'E4ER7uYvaSTdpQFzTXNNSTkR6jNRJyqhZPJMGuU899nY' cond_alice = {"type": "ed25519-sha-256", "publicKey": alice_pk} +bob_pk = 'C8MfEjKiFxDguacHvcM7MV83cRQ55RAHacC73xqg8qeu' +bob_sk = 'GrP1fZdUxUc1NYmu7kiNkJV4p7PKpshp1yBY7hogPUWT' +cond_bob = {"type": "ed25519-sha-256", "publicKey": bob_pk} From 456c9e72fd848cb542e02a2c37fcd4d9138735c0 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Mon, 19 Feb 2018 15:39:05 -0300 Subject: [PATCH 0469/1062] simplify CC tests --- qa/cryptoconditions/test_integration.py | 70 ++++++------------------- qa/cryptoconditions/testsupport.py | 7 +-- 2 files changed, 20 insertions(+), 57 deletions(-) diff --git a/qa/cryptoconditions/test_integration.py b/qa/cryptoconditions/test_integration.py index 87ee59825..ee266dfdf 100644 --- a/qa/cryptoconditions/test_integration.py +++ b/qa/cryptoconditions/test_integration.py @@ -8,87 +8,49 @@ from testsupport import * @fanout_input(0) def test_basic_spend(inp): - spend0 = { - 'inputs': [inp], - "outputs": [ - {"amount": 500, "script": {"condition": cond_alice}}, - {"amount": 500, "script": {"address": notary_addr}} - ] - } - spend0_txid = submit(sign(spend0)) - spend1 = { - 'inputs': [ - {'txid': spend0_txid, 'idx': 0, 'script': {"fulfillment": cond_alice}}, - {'txid': spend0_txid, 'idx': 1, 'script': {'address': notary_addr}} - ], - 'outputs': [{"amount": 1000, "script": {"address": notary_addr}}] - } - spend1_txid = submit(sign(spend1)) - assert rpc.getrawtransaction(spend1_txid) + spend = {'inputs': [inp], "outputs": [nospend]} + spend_txid = submit(sign(spend)) + assert rpc.getrawtransaction(spend_txid) @fanout_input(1) def test_fulfillment_wrong_signature(inp): - spend0 = { - 'inputs': [inp], - "outputs": [{"amount": 1000, "script": {"condition": cond_bob}}] - } - spend0_txid = submit(sign(spend0)) - spend1 = { - 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {"fulfillment": cond_alice}}], - 'outputs': [{"amount": 1000, "script": {"address": notary_addr}}] - } + # Set other pubkey and sign + inp['script']['fulfillment']['publicKey'] = bob_pk + spend = {'inputs': [inp], 'outputs': [nospend]} + signed = sign(spend) - signed = sign(spend1) # Set the correct pubkey, signature is wrong - signed['tx']['inputs'][0]['script']['fulfillment']['publicKey'] = bob_pk + signed['tx']['inputs'][0]['script']['fulfillment']['publicKey'] = alice_pk try: - assert not submit(sign(spend1)), 'should raise an error' + assert not submit(signed), 'should raise an error' except RPCError as e: - assert '16: mandatory-script-verify-flag-failed' in str(e), str(e) + assert 'Script evaluated without error but finished with a false/empty top stack element' in str(e), str(e) @fanout_input(2) def test_fulfillment_wrong_pubkey(inp): - spend0 = { - 'inputs': [inp], - "outputs": [{"amount": 1000, "script": {"condition": cond_alice}}] - } - spend0_txid = submit(sign(spend0)) - spend1 = { - 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {"fulfillment": cond_alice}}], - 'outputs': [{"amount": 1000, "script": {"address": notary_addr}}] - } + spend = {'inputs': [inp], 'outputs': [nospend]} - signed = sign(spend1) + signed = sign(spend) # Set the wrong pubkey, signature is correct signed['tx']['inputs'][0]['script']['fulfillment']['publicKey'] = bob_pk try: assert not submit(signed), 'should raise an error' except RPCError as e: - assert '16: mandatory-script-verify-flag-failed' in str(e), str(e) + assert 'Script evaluated without error but finished with a false/empty top stack element' in str(e), str(e) @fanout_input(3) def test_fulfillment_invalid_fulfillment(inp): - spend0 = { - 'inputs': [inp], - "outputs": [{"amount": 1000, "script": {"condition": cond_alice}}] - } - spend0_txid = submit(sign(spend0)) - # Create a valid script with an invalid fulfillment payload - script = binascii.hexlify(b"\007invalid").decode('utf-8') - - spend1 = { - 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': script}], - 'outputs': [{"amount": 1000, "script": {"address": notary_addr}}] - } + inp['script'] = binascii.hexlify(b"\007invalid").decode('utf-8') + spend = {'inputs': [inp], 'outputs': [nospend]} try: - assert not submit({'tx': spend1}), 'should raise an error' + assert not submit({'tx': spend}), 'should raise an error' except RPCError as e: assert 'Crypto-Condition payload is invalid' in str(e), str(e) diff --git a/qa/cryptoconditions/testsupport.py b/qa/cryptoconditions/testsupport.py index aad64e320..5b00f8218 100644 --- a/qa/cryptoconditions/testsupport.py +++ b/qa/cryptoconditions/testsupport.py @@ -68,7 +68,7 @@ def wait_for_block(height): def sign(tx): signed = hoek.signTxBitcoin({'tx': tx, 'privateKeys': [notary_sk]}) - return hoek.signTxEd25519({'tx': signed['tx'], 'privateKeys': [alice_sk]}) + return hoek.signTxEd25519({'tx': signed['tx'], 'privateKeys': [alice_sk, bob_sk]}) def submit(tx): @@ -98,7 +98,7 @@ def get_fanout_txid(): {'txid': reward_txid, 'idx': 0, 'script': {'pubkey': notary_pk}} ], "outputs": (100 * [ - {"amount": 1000, "script": {"address": notary_addr}} + {"amount": 1000, "script": {"condition": cond_alice}} ] + [{"amount": remainder, 'script': {'address': notary_addr}}]) } @@ -110,7 +110,7 @@ def fanout_input(n): def wrapper(): if not hasattr(fanout_input, 'txid'): fanout_input.txid = get_fanout_txid() - inp = {'txid': fanout_input.txid, 'idx': n, 'script': {'address': notary_addr}} + inp = {'txid': fanout_input.txid, 'idx': n, 'script': {'fulfillment': cond_alice}} f(inp) return functools.wraps(f)(wrapper) return decorate @@ -126,3 +126,4 @@ cond_alice = {"type": "ed25519-sha-256", "publicKey": alice_pk} bob_pk = 'C8MfEjKiFxDguacHvcM7MV83cRQ55RAHacC73xqg8qeu' bob_sk = 'GrP1fZdUxUc1NYmu7kiNkJV4p7PKpshp1yBY7hogPUWT' cond_bob = {"type": "ed25519-sha-256", "publicKey": bob_pk} +nospend = {"amount": 1000, "script": {"address": notary_addr}} From 36d8b2efbe6203b0fb2d8e0a316c425d34fce406 Mon Sep 17 00:00:00 2001 From: rofl0r Date: Mon, 19 Feb 2018 21:21:48 +0000 Subject: [PATCH 0470/1062] fix build error due to usage of obsolete boost_system-mt closes #2304 for real --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index f9c0f1246..b5630309c 100644 --- a/configure.ac +++ b/configure.ac @@ -720,7 +720,7 @@ AX_CHECK_COMPILE_FLAG([-fwrapv],[CXXFLAGS="$CXXFLAGS -fwrapv"]) AX_CHECK_COMPILE_FLAG([-fno-strict-aliasing],[CXXFLAGS="$CXXFLAGS -fno-strict-aliasing"]) AX_CHECK_COMPILE_FLAG([-Wno-builtin-declaration-mismatch],[CXXFLAGS="$CXXFLAGS -Wno-builtin-declaration-mismatch"],,[[$CXXFLAG_WERROR]]) -LIBZCASH_LIBS="-lgmp -lgmpxx -lboost_system-mt -lcrypto -lsodium $RUST_LIBS" +LIBZCASH_LIBS="-lgmp -lgmpxx -lboost_system -lcrypto -lsodium $RUST_LIBS" AC_MSG_CHECKING([whether to build bitcoind]) AM_CONDITIONAL([BUILD_BITCOIND], [test x$build_bitcoind = xyes]) From f5cf215f71a2477070314b2eb14d9ba4fce63e81 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Mon, 19 Feb 2018 18:24:12 -0300 Subject: [PATCH 0471/1062] extra tests for failure modes and remove CRYPTOCONDITION_OVERSIZE error state --- qa/cryptoconditions/README.md | 7 +++-- qa/cryptoconditions/test_integration.py | 40 +++++++++++++++++++++++-- qa/cryptoconditions/testsupport.py | 10 +++++-- src/cryptoconditions | 2 +- src/script/interpreter.cpp | 5 ---- src/script/script_error.cpp | 2 ++ src/script/script_error.h | 1 + 7 files changed, 54 insertions(+), 13 deletions(-) diff --git a/qa/cryptoconditions/README.md b/qa/cryptoconditions/README.md index d14ab5b7d..d93e8e266 100644 --- a/qa/cryptoconditions/README.md +++ b/qa/cryptoconditions/README.md @@ -2,6 +2,9 @@ These tests are for the [Crypto-Conditions](https://github.com/rfcs/crypto-conditions) functionality in Komodod, using [Hoek](https://github.com/libscott/hoek) as a tool to create and sign transactions. -The tests use Python as a scripting language and each one should "just work" given Linux and a 2.7+ Python interpreter. Each file prefixed with "test_" is a test case. +## How to run the tests -The tests require `hoek` to be on the $PATH. Included is a script to perform a complete installation of `hoek`. +1. Install hoek: https://github.com/libscott/hoek +2. Start komodod: `src/komodod -ac_name=CCTEST -ac_supply=21000000 -gen -pubkey=0205a8ad0c1dbc515f149af377981aab58b836af008d4d7ab21bd76faf80550b47 -ac_cc=1` +3. Set environment variable pointing to Komodo conf: `export KOMODO_CONF_PATH=~/.komodo/CCTEST/CCTEST.conf` +4. Run tests: `python test_integration.py` (you can also use a test runner such as `nose`). diff --git a/qa/cryptoconditions/test_integration.py b/qa/cryptoconditions/test_integration.py index ee266dfdf..24792cc60 100644 --- a/qa/cryptoconditions/test_integration.py +++ b/qa/cryptoconditions/test_integration.py @@ -3,6 +3,7 @@ import time import json import logging import binascii +import struct from testsupport import * @@ -20,7 +21,7 @@ def test_fulfillment_wrong_signature(inp): spend = {'inputs': [inp], 'outputs': [nospend]} signed = sign(spend) - # Set the correct pubkey, signature is wrong + # Set the correct pubkey, signature is bob's signed['tx']['inputs'][0]['script']['fulfillment']['publicKey'] = alice_pk try: @@ -32,8 +33,8 @@ def test_fulfillment_wrong_signature(inp): @fanout_input(2) def test_fulfillment_wrong_pubkey(inp): spend = {'inputs': [inp], 'outputs': [nospend]} - signed = sign(spend) + # Set the wrong pubkey, signature is correct signed['tx']['inputs'][0]['script']['fulfillment']['publicKey'] = bob_pk @@ -44,7 +45,7 @@ def test_fulfillment_wrong_pubkey(inp): @fanout_input(3) -def test_fulfillment_invalid_fulfillment(inp): +def test_invalid_fulfillment_binary(inp): # Create a valid script with an invalid fulfillment payload inp['script'] = binascii.hexlify(b"\007invalid").decode('utf-8') spend = {'inputs': [inp], 'outputs': [nospend]} @@ -55,8 +56,41 @@ def test_fulfillment_invalid_fulfillment(inp): assert 'Crypto-Condition payload is invalid' in str(e), str(e) +@fanout_input(4) +def test_invalid_condition(inp): + # Create a valid output script with an invalid cryptocondition binary + outputscript = to_hex(b"\007invalid\xcc") + spend = {'inputs': [inp], 'outputs': [{'amount': 1000, 'script': outputscript}]} + spend_txid = submit(sign(spend)) + + spend1 = { + 'inputs': [{'txid': spend_txid, 'idx': 0, 'script': {'fulfillment': cond_alice}}], + 'outputs': [nospend], + } + + try: + assert not submit(sign(spend1)), 'should raise an error' + except RPCError as e: + assert 'Script evaluated without error but finished with a false/empty top stack element' in str(e), str(e) + + +@fanout_input(19) +def test_oversize_fulfillment(inp): + # Create oversize fulfillment script where the total length is <2000 + binscript = b'\x4d%s%s' % (struct.pack('h', 2000), b'a' * 2000) + inp['script'] = to_hex(binscript) + spend = {'inputs': [inp], 'outputs': [nospend]} + + try: + assert not submit({'tx': spend}), 'should raise an error' + except RPCError as e: + assert 'scriptsig-size' in str(e), str(e) + + if __name__ == '__main__': + logging.basicConfig(level=logging.INFO) for name, f in globals().items(): if name.startswith('test_'): logging.info("Running test: %s" % name) f() + logging.info("Test OK: %s" % name) diff --git a/qa/cryptoconditions/testsupport.py b/qa/cryptoconditions/testsupport.py index 5b00f8218..e6025c0bc 100644 --- a/qa/cryptoconditions/testsupport.py +++ b/qa/cryptoconditions/testsupport.py @@ -2,9 +2,11 @@ from __future__ import print_function import sys import json import time +import copy +import base64 import logging -import subprocess import functools +import subprocess class RPCError(IOError): @@ -34,6 +36,10 @@ def run_cmd(cmd): return proc.stdout.read() +def to_hex(s): + return base64.b16encode(s).decode('utf-8') + + class Hoek(JsonClient): def _exec(self, method, args): cmd = ['hoek', method, json.dumps(args[0])] @@ -111,7 +117,7 @@ def fanout_input(n): if not hasattr(fanout_input, 'txid'): fanout_input.txid = get_fanout_txid() inp = {'txid': fanout_input.txid, 'idx': n, 'script': {'fulfillment': cond_alice}} - f(inp) + f(copy.deepcopy(inp)) return functools.wraps(f)(wrapper) return decorate diff --git a/src/cryptoconditions b/src/cryptoconditions index 89325dc29..7ab93ba86 160000 --- a/src/cryptoconditions +++ b/src/cryptoconditions @@ -1 +1 @@ -Subproject commit 89325dc29391f473da75503105a4946f2f96fb76 +Subproject commit 7ab93ba86174efa32da3dac8b625ff9e1ef05fdd diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 4e03527a4..e0c2c1d01 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -949,11 +949,6 @@ bool EvalScript(vector >& stack, const CScript& script, un valtype& vchFulfillment = stacktop(-2); valtype& vchCondition = stacktop(-1); - // Hard limit fulfillment size - if (vchFulfillment.size() > 1024 * 10) { - return set_error(serror, SCRIPT_ERR_CRYPTOCONDITION_INVALID_FULFILLMENT); - } - CC *cond = (CC*) calloc(1, sizeof(CC)); char *fulfillmentBin = (char*) vchFulfillment.data(); int rc = cc_readFulfillmentBinary(cond, fulfillmentBin, vchFulfillment.size()); diff --git a/src/script/script_error.cpp b/src/script/script_error.cpp index f1aa1fb40..41c8a24e0 100644 --- a/src/script/script_error.cpp +++ b/src/script/script_error.cpp @@ -67,6 +67,8 @@ const char* ScriptErrorString(const ScriptError serror) return "NOPx reserved for soft-fork upgrades"; case SCRIPT_ERR_PUBKEYTYPE: return "Public key is neither compressed or uncompressed"; + case SCRIPT_ERR_CRYPTOCONDITION_INVALID_FULFILLMENT: + return "Crypto-Condition payload is invalid"; case SCRIPT_ERR_UNKNOWN_ERROR: case SCRIPT_ERR_ERROR_COUNT: default: break; diff --git a/src/script/script_error.h b/src/script/script_error.h index e84268977..35c8fbfd8 100644 --- a/src/script/script_error.h +++ b/src/script/script_error.h @@ -54,6 +54,7 @@ typedef enum ScriptError_t SCRIPT_ERR_ERROR_COUNT, + /* crypto-condition script errors */ SCRIPT_ERR_CRYPTOCONDITION_VERIFY, SCRIPT_ERR_CRYPTOCONDITION_INVALID_FULFILLMENT } ScriptError; From ccb128503efa55d3348d8ad5b913dbb8d7b942a6 Mon Sep 17 00:00:00 2001 From: libscott Date: Mon, 19 Feb 2018 18:31:39 -0300 Subject: [PATCH 0472/1062] Update README.md --- qa/cryptoconditions/README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/qa/cryptoconditions/README.md b/qa/cryptoconditions/README.md index d93e8e266..2bf479ecd 100644 --- a/qa/cryptoconditions/README.md +++ b/qa/cryptoconditions/README.md @@ -5,6 +5,7 @@ These tests are for the [Crypto-Conditions](https://github.com/rfcs/crypto-condi ## How to run the tests 1. Install hoek: https://github.com/libscott/hoek -2. Start komodod: `src/komodod -ac_name=CCTEST -ac_supply=21000000 -gen -pubkey=0205a8ad0c1dbc515f149af377981aab58b836af008d4d7ab21bd76faf80550b47 -ac_cc=1` -3. Set environment variable pointing to Komodo conf: `export KOMODO_CONF_PATH=~/.komodo/CCTEST/CCTEST.conf` -4. Run tests: `python test_integration.py` (you can also use a test runner such as `nose`). +1. Allow peer-less block creation: set "fMiningRequiresPeers = false" in src/chainparams.cpp, then build komodod. +1. Start komodod: `src/komodod -ac_name=CCTEST -ac_supply=21000000 -gen -pubkey=0205a8ad0c1dbc515f149af377981aab58b836af008d4d7ab21bd76faf80550b47 -ac_cc=1` +1. Set environment variable pointing to Komodo conf: `export KOMODO_CONF_PATH=~/.komodo/CCTEST/CCTEST.conf` +1. Run tests: `python test_integration.py` (you can also use a test runner such as `nose`). From fbc955c49338668eaffb1e161825c2ec5e1ed010 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Mon, 19 Feb 2018 20:45:11 -0300 Subject: [PATCH 0473/1062] use public github submodule url --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index 0c640d62c..83942a053 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "cryptoconditions"] path = src/cryptoconditions - url = git@github.com:libscott/libcryptoconditions.git + url = https://github.com/libscott/libcryptoconditions.git branch = komodo-integration From 85b55ada89d71b7d51cd23e556677bbbfe1104ab Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Mon, 19 Feb 2018 21:13:05 -0300 Subject: [PATCH 0474/1062] use public github url --- src/cryptoconditions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cryptoconditions b/src/cryptoconditions index 7ab93ba86..e48284938 160000 --- a/src/cryptoconditions +++ b/src/cryptoconditions @@ -1 +1 @@ -Subproject commit 7ab93ba86174efa32da3dac8b625ff9e1ef05fdd +Subproject commit e482849382f36702fe083c5604dd160f4ebaedd1 From b0f8c83f9530fb6c596b20a4a679552951da7f24 Mon Sep 17 00:00:00 2001 From: Matt Corallo Date: Wed, 26 Aug 2015 18:15:04 -0700 Subject: [PATCH 0475/1062] Add failing test checking timelocked-txn removal during reorg --- qa/pull-tester/rpc-tests.sh | 2 +- ...ol_coinbase_spends.py => mempool_reorg.py} | 30 ++++++++++++++----- 2 files changed, 23 insertions(+), 9 deletions(-) rename qa/rpc-tests/{mempool_coinbase_spends.py => mempool_reorg.py} (70%) diff --git a/qa/pull-tester/rpc-tests.sh b/qa/pull-tester/rpc-tests.sh index dfbd78f9a..773bc4cc0 100755 --- a/qa/pull-tester/rpc-tests.sh +++ b/qa/pull-tester/rpc-tests.sh @@ -27,7 +27,7 @@ testScripts=( 'rawtransactions.py' 'rest.py' 'mempool_spendcoinbase.py' - 'mempool_coinbase_spends.py' + 'mempool_reorg.py' 'mempool_tx_input_limit.py' 'httpbasics.py' 'zapwallettxes.py' diff --git a/qa/rpc-tests/mempool_coinbase_spends.py b/qa/rpc-tests/mempool_reorg.py similarity index 70% rename from qa/rpc-tests/mempool_coinbase_spends.py rename to qa/rpc-tests/mempool_reorg.py index 041de831b..ad12dadf2 100755 --- a/qa/rpc-tests/mempool_coinbase_spends.py +++ b/qa/rpc-tests/mempool_reorg.py @@ -9,7 +9,8 @@ # from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import assert_equal, start_node, connect_nodes +from test_framework.authproxy import JSONRPCException +from test_framework.util import assert_equal, assert_raises, start_node, connect_nodes # Create one-input, one-output, no-fee transaction: @@ -49,16 +50,25 @@ class MempoolCoinbaseTest(BitcoinTestFramework): # 3. Indirect (coinbase and child both in chain) : spend_103 and spend_103_1 # Use invalidatblock to make all of the above coinbase spends invalid (immature coinbase), # and make sure the mempool code behaves correctly. - b = [ self.nodes[0].getblockhash(n) for n in range(102, 105) ] + b = [ self.nodes[0].getblockhash(n) for n in range(101, 105) ] coinbase_txids = [ self.nodes[0].getblock(h)['tx'][0] for h in b ] - spend_101_raw = self.create_tx(coinbase_txids[0], node1_address, 10) - spend_102_raw = self.create_tx(coinbase_txids[1], node0_address, 10) - spend_103_raw = self.create_tx(coinbase_txids[2], node0_address, 10) + spend_101_raw = self.create_tx(coinbase_txids[1], node1_address, 10) + spend_102_raw = self.create_tx(coinbase_txids[2], node0_address, 10) + spend_103_raw = self.create_tx(coinbase_txids[3], node0_address, 10) + + # Create a block-height-locked transaction which will be invalid after reorg + timelock_tx = self.nodes[0].createrawtransaction([{"txid": coinbase_txids[0], "vout": 0}], {node0_address: 10}) + # Set the time lock + timelock_tx = timelock_tx.replace("ffffffff", "11111111", 1) + timelock_tx = timelock_tx[:-8] + hex(self.nodes[0].getblockcount() + 2)[2:] + "000000" + timelock_tx = self.nodes[0].signrawtransaction(timelock_tx)["hex"] + assert_raises(JSONRPCException, self.nodes[0].sendrawtransaction, timelock_tx) # Broadcast and mine spend_102 and 103: spend_102_id = self.nodes[0].sendrawtransaction(spend_102_raw) spend_103_id = self.nodes[0].sendrawtransaction(spend_103_raw) self.nodes[0].generate(1) + assert_raises(JSONRPCException, self.nodes[0].sendrawtransaction, timelock_tx) # Create 102_1 and 103_1: spend_102_1_raw = self.create_tx(spend_102_id, node1_address, 10) @@ -66,8 +76,8 @@ class MempoolCoinbaseTest(BitcoinTestFramework): # Broadcast and mine 103_1: spend_103_1_id = self.nodes[0].sendrawtransaction(spend_103_1_raw) - [spend_103_1_id] # hush pyflakes - self.nodes[0].generate(1) + last_block = self.nodes[0].generate(1) + timelock_tx_id = self.nodes[0].sendrawtransaction(timelock_tx) # ... now put spend_101 and spend_102_1 in memory pools: spend_101_id = self.nodes[0].sendrawtransaction(spend_101_raw) @@ -75,7 +85,11 @@ class MempoolCoinbaseTest(BitcoinTestFramework): self.sync_all() - assert_equal(set(self.nodes[0].getrawmempool()), set([ spend_101_id, spend_102_1_id ])) + assert_equal(set(self.nodes[0].getrawmempool()), set([ spend_101_id, spend_102_1_id, timelock_tx_id ])) + + for node in self.nodes: + node.invalidateblock(last_block[0]) + assert_equal(set(self.nodes[0].getrawmempool()), set([ spend_101_id, spend_102_1_id, spend_103_1_id ])) # Use invalidateblock to re-org back and make all those coinbase spends # immature/invalid: From f5b35d23059d8b03a01c250805cfafe29fa55fce Mon Sep 17 00:00:00 2001 From: Matt Corallo Date: Wed, 26 Aug 2015 18:58:17 -0700 Subject: [PATCH 0476/1062] Fix removal of time-locked transactions during reorg --- src/main.cpp | 2 +- src/txmempool.cpp | 25 +++++++++++++++---------- src/txmempool.h | 2 +- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 062507d0e..ef025420e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2457,7 +2457,7 @@ bool static DisconnectTip(CValidationState &state, bool fBare = false) { // in which case we don't want to evict from the mempool yet! mempool.removeWithAnchor(anchorBeforeDisconnect); } - mempool.removeCoinbaseSpends(pcoinsTip, pindexDelete->nHeight); + mempool.removeForReorg(pcoinsTip, pindexDelete->nHeight); mempool.check(pcoinsTip); } diff --git a/src/txmempool.cpp b/src/txmempool.cpp index 5f46a80a0..d39b71621 100644 --- a/src/txmempool.cpp +++ b/src/txmempool.cpp @@ -11,6 +11,7 @@ #include "main.h" #include "policy/fees.h" #include "streams.h" +#include "timedata.h" #include "util.h" #include "utilmoneystr.h" #include "version.h" @@ -167,22 +168,26 @@ void CTxMemPool::remove(const CTransaction &origTx, std::list& rem } } -void CTxMemPool::removeCoinbaseSpends(const CCoinsViewCache *pcoins, unsigned int nMemPoolHeight) +void CTxMemPool::removeForReorg(const CCoinsViewCache *pcoins, unsigned int nMemPoolHeight) { // Remove transactions spending a coinbase which are now immature LOCK(cs); list transactionsToRemove; for (indexed_transaction_set::const_iterator it = mapTx.begin(); it != mapTx.end(); it++) { const CTransaction& tx = it->GetTx(); - BOOST_FOREACH(const CTxIn& txin, tx.vin) { - indexed_transaction_set::const_iterator it2 = mapTx.find(txin.prevout.hash); - if (it2 != mapTx.end()) - continue; - const CCoins *coins = pcoins->AccessCoins(txin.prevout.hash); - if (nCheckFrequency != 0) assert(coins); - if (!coins || (coins->IsCoinBase() && ((signed long)nMemPoolHeight) - coins->nHeight < COINBASE_MATURITY)) { - transactionsToRemove.push_back(tx); - break; + if (!IsFinalTx(tx, nMemPoolHeight, GetAdjustedTime())) { + transactionsToRemove.push_back(tx); + } else { + BOOST_FOREACH(const CTxIn& txin, tx.vin) { + indexed_transaction_set::const_iterator it2 = mapTx.find(txin.prevout.hash); + if (it2 != mapTx.end()) + continue; + const CCoins *coins = pcoins->AccessCoins(txin.prevout.hash); + if (nCheckFrequency != 0) assert(coins); + if (!coins || (coins->IsCoinBase() && ((signed long)nMemPoolHeight) - coins->nHeight < COINBASE_MATURITY)) { + transactionsToRemove.push_back(tx); + break; + } } } } diff --git a/src/txmempool.h b/src/txmempool.h index 426abe984..cf242ca0b 100644 --- a/src/txmempool.h +++ b/src/txmempool.h @@ -160,7 +160,7 @@ public: bool addUnchecked(const uint256& hash, const CTxMemPoolEntry &entry, bool fCurrentEstimate = true); void remove(const CTransaction &tx, std::list& removed, bool fRecursive = false); void removeWithAnchor(const uint256 &invalidRoot); - void removeCoinbaseSpends(const CCoinsViewCache *pcoins, unsigned int nMemPoolHeight); + void removeForReorg(const CCoinsViewCache *pcoins, unsigned int nMemPoolHeight); void removeConflicts(const CTransaction &tx, std::list& removed); void removeForBlock(const std::vector& vtx, unsigned int nBlockHeight, std::list& conflicts, bool fCurrentEstimate = true); From c944d161fde7bd9e7d83e58c13f73778377b1ac7 Mon Sep 17 00:00:00 2001 From: Matt Corallo Date: Sat, 5 Sep 2015 21:40:21 -0700 Subject: [PATCH 0477/1062] Fix comment in removeForReorg --- src/txmempool.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/txmempool.cpp b/src/txmempool.cpp index d39b71621..e54403dc9 100644 --- a/src/txmempool.cpp +++ b/src/txmempool.cpp @@ -170,7 +170,7 @@ void CTxMemPool::remove(const CTransaction &origTx, std::list& rem void CTxMemPool::removeForReorg(const CCoinsViewCache *pcoins, unsigned int nMemPoolHeight) { - // Remove transactions spending a coinbase which are now immature + // Remove transactions spending a coinbase which are now immature and no-longer-final transactions LOCK(cs); list transactionsToRemove; for (indexed_transaction_set::const_iterator it = mapTx.begin(); it != mapTx.end(); it++) { From 5aa165d5572f161ae3027bae60d4b276e28321b4 Mon Sep 17 00:00:00 2001 From: Matt Corallo Date: Wed, 9 Sep 2015 14:54:11 -0700 Subject: [PATCH 0478/1062] Make indentation in ActivateBestChainStep readable --- src/main.cpp | 64 ++++++++++++++++++++++++++-------------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index ef025420e..907dc440e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2642,43 +2642,43 @@ static bool ActivateBestChainStep(CValidationState &state, CBlockIndex *pindexMo bool fContinue = true; int nHeight = pindexFork ? pindexFork->nHeight : -1; while (fContinue && nHeight != pindexMostWork->nHeight) { - // Don't iterate the entire list of potential improvements toward the best tip, as we likely only need - // a few blocks along the way. - int nTargetHeight = std::min(nHeight + 32, pindexMostWork->nHeight); - vpindexToConnect.clear(); - vpindexToConnect.reserve(nTargetHeight - nHeight); - CBlockIndex *pindexIter = pindexMostWork->GetAncestor(nTargetHeight); - while (pindexIter && pindexIter->nHeight != nHeight) { - vpindexToConnect.push_back(pindexIter); - pindexIter = pindexIter->pprev; - } - nHeight = nTargetHeight; + // Don't iterate the entire list of potential improvements toward the best tip, as we likely only need + // a few blocks along the way. + int nTargetHeight = std::min(nHeight + 32, pindexMostWork->nHeight); + vpindexToConnect.clear(); + vpindexToConnect.reserve(nTargetHeight - nHeight); + CBlockIndex *pindexIter = pindexMostWork->GetAncestor(nTargetHeight); + while (pindexIter && pindexIter->nHeight != nHeight) { + vpindexToConnect.push_back(pindexIter); + pindexIter = pindexIter->pprev; + } + nHeight = nTargetHeight; - // Connect new blocks. - BOOST_REVERSE_FOREACH(CBlockIndex *pindexConnect, vpindexToConnect) { - if (!ConnectTip(state, pindexConnect, pindexConnect == pindexMostWork ? pblock : NULL)) { - if (state.IsInvalid()) { - // The block violates a consensus rule. - if (!state.CorruptionPossible()) - InvalidChainFound(vpindexToConnect.back()); - state = CValidationState(); - fInvalidFound = true; - fContinue = false; - break; + // Connect new blocks. + BOOST_REVERSE_FOREACH(CBlockIndex *pindexConnect, vpindexToConnect) { + if (!ConnectTip(state, pindexConnect, pindexConnect == pindexMostWork ? pblock : NULL)) { + if (state.IsInvalid()) { + // The block violates a consensus rule. + if (!state.CorruptionPossible()) + InvalidChainFound(vpindexToConnect.back()); + state = CValidationState(); + fInvalidFound = true; + fContinue = false; + break; + } else { + // A system error occurred (disk space, database error, ...). + return false; + } } else { - // A system error occurred (disk space, database error, ...). - return false; - } - } else { - PruneBlockIndexCandidates(); - if (!pindexOldTip || chainActive.Tip()->nChainWork > pindexOldTip->nChainWork) { - // We're in a better position than we were. Return temporarily to release the lock. - fContinue = false; - break; + PruneBlockIndexCandidates(); + if (!pindexOldTip || chainActive.Tip()->nChainWork > pindexOldTip->nChainWork) { + // We're in a better position than we were. Return temporarily to release the lock. + fContinue = false; + break; + } } } } - } // Callbacks/notifications for a new best chain. if (fInvalidFound) From fe5cef05559504d9450c77ea29f13d1bdc099ecf Mon Sep 17 00:00:00 2001 From: Matt Corallo Date: Wed, 9 Sep 2015 16:31:20 -0700 Subject: [PATCH 0479/1062] removeForReorg calls once-per-disconnect-> once-per-reorg --- src/main.cpp | 24 +++++++++++++++++------- src/main.h | 2 +- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 907dc440e..0be08f21c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2419,11 +2419,10 @@ void static UpdateTip(CBlockIndex *pindexNew) { } } -/** Disconnect chainActive's tip. */ +/** Disconnect chainActive's tip. You probably want to call mempool.removeForReorg after this, with cs_main held. */ bool static DisconnectTip(CValidationState &state, bool fBare = false) { CBlockIndex *pindexDelete = chainActive.Tip(); assert(pindexDelete); - mempool.check(pcoinsTip); // Read block from disk. CBlock block; if (!ReadBlockFromDisk(block, pindexDelete)) @@ -2457,8 +2456,6 @@ bool static DisconnectTip(CValidationState &state, bool fBare = false) { // in which case we don't want to evict from the mempool yet! mempool.removeWithAnchor(anchorBeforeDisconnect); } - mempool.removeForReorg(pcoinsTip, pindexDelete->nHeight); - mempool.check(pcoinsTip); } // Update chainActive and related variables. @@ -2488,7 +2485,6 @@ static int64_t nTimePostConnect = 0; */ bool static ConnectTip(CValidationState &state, CBlockIndex *pindexNew, CBlock *pblock) { assert(pindexNew->pprev == chainActive.Tip()); - mempool.check(pcoinsTip); // Read block from disk. int64_t nTime1 = GetTimeMicros(); CBlock block; @@ -2528,7 +2524,6 @@ bool static ConnectTip(CValidationState &state, CBlockIndex *pindexNew, CBlock * // Remove conflicting transactions from the mempool. list txConflicted; mempool.removeForBlock(pblock->vtx, pindexNew->nHeight, txConflicted, !IsInitialBlockDownload()); - mempool.check(pcoinsTip); // Update chainActive & related variables. UpdateTip(pindexNew); // Tell wallet about transactions that went from mempool @@ -2632,9 +2627,14 @@ static bool ActivateBestChainStep(CValidationState &state, CBlockIndex *pindexMo const CBlockIndex *pindexFork = chainActive.FindFork(pindexMostWork); // Disconnect active blocks which are no longer in the best chain. + bool fBlocksDisconnected = false; while (chainActive.Tip() && chainActive.Tip() != pindexFork) { - if (!DisconnectTip(state)) + if (!DisconnectTip(state)) { + // Probably an AbortNode() error, but try to keep mempool consistent anyway + mempool.removeForReorg(pcoinsTip, chainActive.Tip()->nHeight + 1); return false; + } + fBlocksDisconnected = true; } // Build list of new blocks to connect. @@ -2667,6 +2667,9 @@ static bool ActivateBestChainStep(CValidationState &state, CBlockIndex *pindexMo break; } else { // A system error occurred (disk space, database error, ...). + // Probably gonna shut down ASAP, but try to keep mempool consistent anyway + if (fBlocksDisconnected) + mempool.removeForReorg(pcoinsTip, chainActive.Tip()->nHeight + 1); return false; } } else { @@ -2680,6 +2683,11 @@ static bool ActivateBestChainStep(CValidationState &state, CBlockIndex *pindexMo } } + if (fBlocksDisconnected) { + mempool.removeForReorg(pcoinsTip, chainActive.Tip()->nHeight + 1); + } + mempool.check(pcoinsTip); + // Callbacks/notifications for a new best chain. if (fInvalidFound) CheckForkWarningConditionsOnNewFork(vpindexToConnect.back()); @@ -2764,6 +2772,7 @@ bool InvalidateBlock(CValidationState& state, CBlockIndex *pindex) { // ActivateBestChain considers blocks already in chainActive // unconditionally valid already, so force disconnect away from it. if (!DisconnectTip(state)) { + mempool.removeForReorg(pcoinsTip, chainActive.Tip()->nHeight + 1); return false; } } @@ -2779,6 +2788,7 @@ bool InvalidateBlock(CValidationState& state, CBlockIndex *pindex) { } InvalidChainFound(pindex); + mempool.removeForReorg(pcoinsTip, chainActive.Tip()->nHeight + 1); return true; } diff --git a/src/main.h b/src/main.h index 03b0464eb..5b1d1d092 100644 --- a/src/main.h +++ b/src/main.h @@ -514,7 +514,7 @@ bool InvalidateBlock(CValidationState& state, CBlockIndex *pindex); /** Remove invalidity status from a block and its descendants. */ bool ReconsiderBlock(CValidationState& state, CBlockIndex *pindex); -/** The currently-connected chain of blocks. */ +/** The currently-connected chain of blocks (protected by cs_main). */ extern CChain chainActive; /** Global variable that points to the active CCoinsView (protected by cs_main) */ From a4b25180682d6dddf02a9e7f2b51eb6f1ee88f6a Mon Sep 17 00:00:00 2001 From: Suhas Daftuar Date: Thu, 29 Oct 2015 14:06:13 -0400 Subject: [PATCH 0480/1062] Track coinbase spends in CTxMemPoolEntry This allows us to optimize CTxMemPool::removeForReorg. --- src/gtest/test_mempool.cpp | 2 +- src/main.cpp | 13 ++++++++++++- src/test/miner_tests.cpp | 24 +++++++++++++----------- src/test/test_bitcoin.cpp | 2 +- src/test/test_bitcoin.h | 4 +++- src/txmempool.cpp | 11 +++++++---- src/txmempool.h | 6 +++++- 7 files changed, 42 insertions(+), 20 deletions(-) diff --git a/src/gtest/test_mempool.cpp b/src/gtest/test_mempool.cpp index 14b4d83b1..46b0a6d12 100644 --- a/src/gtest/test_mempool.cpp +++ b/src/gtest/test_mempool.cpp @@ -83,7 +83,7 @@ TEST(Mempool, PriorityStatsDoNotCrash) { unsigned int nHeight = 92045; double dPriority = view.GetPriority(tx, nHeight); - CTxMemPoolEntry entry(tx, nFees, nTime, dPriority, nHeight, true); + CTxMemPoolEntry entry(tx, nFees, nTime, dPriority, nHeight, true, false); // Check it does not crash (ie. the death test fails) EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(testPool.addUnchecked(tx.GetHash(), entry), ""), ""); diff --git a/src/main.cpp b/src/main.cpp index 0be08f21c..f9abccb46 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1188,7 +1188,18 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa CAmount nFees = nValueIn-nValueOut; double dPriority = view.GetPriority(tx, chainActive.Height()); - CTxMemPoolEntry entry(tx, nFees, GetTime(), dPriority, chainActive.Height(), mempool.HasNoInputsOf(tx)); + // Keep track of transactions that spend a coinbase, which we re-scan + // during reorgs to ensure COINBASE_MATURITY is still met. + bool fSpendsCoinbase = false; + BOOST_FOREACH(const CTxIn &txin, tx.vin) { + const CCoins *coins = view.AccessCoins(txin.prevout.hash); + if (coins->IsCoinBase()) { + fSpendsCoinbase = true; + break; + } + } + + CTxMemPoolEntry entry(tx, nFees, GetTime(), dPriority, chainActive.Height(), mempool.HasNoInputsOf(tx), fSpendsCoinbase); unsigned int nSize = entry.GetTxSize(); // Accept a tx if it contains joinsplits and has at least the default fee specified by z_sendmany. diff --git a/src/test/miner_tests.cpp b/src/test/miner_tests.cpp index 6dc4da7c7..770cdbe76 100644 --- a/src/test/miner_tests.cpp +++ b/src/test/miner_tests.cpp @@ -285,7 +285,8 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) { tx.vout[0].nValue -= 10; hash = tx.GetHash(); - mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx)); + bool spendsCoinbase = (i == 0) ? true : false; // only first tx spends coinbase + mempool.addUnchecked(hash, entry.Time(GetTime()).SpendsCoinbase(spendsCoinbase).FromTx(tx)); tx.vin[0].prevout.hash = hash; } BOOST_CHECK(pblocktemplate = CreateNewBlock(scriptPubKey)); @@ -305,7 +306,8 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) { tx.vout[0].nValue -= 350; hash = tx.GetHash(); - mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx)); + bool spendsCoinbase = (i == 0) ? true : false; // only first tx spends coinbase + mempool.addUnchecked(hash, entry.Time(GetTime()).SpendsCoinbase(spendsCoinbase).FromTx(tx)); tx.vin[0].prevout.hash = hash; } BOOST_CHECK(pblocktemplate = CreateNewBlock(scriptPubKey)); @@ -324,7 +326,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) tx.vin[0].prevout.hash = txFirst[1]->GetHash(); tx.vout[0].nValue = 39000LL; hash = tx.GetHash(); - mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx)); + mempool.addUnchecked(hash, entry.Time(GetTime()).SpendsCoinbase(true).FromTx(tx)); tx.vin[0].prevout.hash = hash; tx.vin.resize(2); tx.vin[1].scriptSig = CScript() << OP_1; @@ -332,7 +334,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) tx.vin[1].prevout.n = 0; tx.vout[0].nValue = 49000LL; hash = tx.GetHash(); - mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx)); + mempool.addUnchecked(hash, entry.Time(GetTime()).SpendsCoinbase(true).FromTx(tx)); BOOST_CHECK(pblocktemplate = CreateNewBlock(scriptPubKey)); delete pblocktemplate; mempool.clear(); @@ -343,7 +345,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) tx.vin[0].scriptSig = CScript() << OP_0 << OP_1; tx.vout[0].nValue = 0; hash = tx.GetHash(); - mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx)); + mempool.addUnchecked(hash, entry.Time(GetTime()).SpendsCoinbase(false).FromTx(tx)); BOOST_CHECK(pblocktemplate = CreateNewBlock(scriptPubKey)); delete pblocktemplate; mempool.clear(); @@ -356,12 +358,12 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) script = CScript() << OP_0; tx.vout[0].scriptPubKey = GetScriptForDestination(CScriptID(script)); hash = tx.GetHash(); - mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx)); + mempool.addUnchecked(hash, entry.Time(GetTime()).SpendsCoinbase(true).FromTx(tx)); tx.vin[0].prevout.hash = hash; tx.vin[0].scriptSig = CScript() << (std::vector)script; tx.vout[0].nValue -= 10000; hash = tx.GetHash(); - mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx)); + mempool.addUnchecked(hash, entry.Time(GetTime()).SpendsCoinbase(false).FromTx(tx)); BOOST_CHECK(pblocktemplate = CreateNewBlock(scriptPubKey)); delete pblocktemplate; mempool.clear(); @@ -372,10 +374,10 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) tx.vout[0].nValue = 49000LL; tx.vout[0].scriptPubKey = CScript() << OP_1; hash = tx.GetHash(); - mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx)); + mempool.addUnchecked(hash, entry.Time(GetTime()).SpendsCoinbase(true).FromTx(tx)); tx.vout[0].scriptPubKey = CScript() << OP_2; hash = tx.GetHash(); - mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx)); + mempool.addUnchecked(hash, entry.Time(GetTime()).SpendsCoinbase(true).FromTx(tx)); BOOST_CHECK(pblocktemplate = CreateNewBlock(scriptPubKey)); delete pblocktemplate; mempool.clear(); @@ -401,7 +403,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) tx.vout[0].scriptPubKey = CScript() << OP_1; tx.nLockTime = chainActive.Tip()->nHeight+1; hash = tx.GetHash(); - mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx)); + mempool.addUnchecked(hash, entry.Time(GetTime()).SpendsCoinbase(true).FromTx(tx)); BOOST_CHECK(!CheckFinalTx(tx, LOCKTIME_MEDIAN_TIME_PAST)); // time locked @@ -415,7 +417,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) tx2.vout[0].scriptPubKey = CScript() << OP_1; tx2.nLockTime = chainActive.Tip()->GetMedianTimePast()+1; hash = tx2.GetHash(); - mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx2)); + mempool.addUnchecked(hash, entry.Time(GetTime()).SpendsCoinbase(true).FromTx(tx2)); BOOST_CHECK(!CheckFinalTx(tx2, LOCKTIME_MEDIAN_TIME_PAST)); BOOST_CHECK(pblocktemplate = CreateNewBlock(scriptPubKey)); diff --git a/src/test/test_bitcoin.cpp b/src/test/test_bitcoin.cpp index 1badeba33..822474235 100644 --- a/src/test/test_bitcoin.cpp +++ b/src/test/test_bitcoin.cpp @@ -106,7 +106,7 @@ TestingSetup::~TestingSetup() CTxMemPoolEntry TestMemPoolEntryHelper::FromTx(CMutableTransaction &tx, CTxMemPool *pool) { return CTxMemPoolEntry(tx, nFee, nTime, dPriority, nHeight, - pool ? pool->HasNoInputsOf(tx) : hadNoDependencies); + pool ? pool->HasNoInputsOf(tx) : hadNoDependencies, spendsCoinbase); } void Shutdown(void* parg) diff --git a/src/test/test_bitcoin.h b/src/test/test_bitcoin.h index 00aa57ef0..db9245b7f 100644 --- a/src/test/test_bitcoin.h +++ b/src/test/test_bitcoin.h @@ -47,10 +47,11 @@ struct TestMemPoolEntryHelper double dPriority; unsigned int nHeight; bool hadNoDependencies; + bool spendsCoinbase; TestMemPoolEntryHelper() : nFee(0), nTime(0), dPriority(0.0), nHeight(1), - hadNoDependencies(false) { } + hadNoDependencies(false), spendsCoinbase(false) { } CTxMemPoolEntry FromTx(CMutableTransaction &tx, CTxMemPool *pool = NULL); @@ -60,5 +61,6 @@ struct TestMemPoolEntryHelper TestMemPoolEntryHelper &Priority(double _priority) { dPriority = _priority; return *this; } TestMemPoolEntryHelper &Height(unsigned int _height) { nHeight = _height; return *this; } TestMemPoolEntryHelper &HadNoDependencies(bool _hnd) { hadNoDependencies = _hnd; return *this; } + TestMemPoolEntryHelper &SpendsCoinbase(bool _flag) { spendsCoinbase = _flag; return *this; } }; #endif diff --git a/src/txmempool.cpp b/src/txmempool.cpp index e54403dc9..b9fcb02f2 100644 --- a/src/txmempool.cpp +++ b/src/txmempool.cpp @@ -19,16 +19,19 @@ using namespace std; CTxMemPoolEntry::CTxMemPoolEntry(): - nFee(0), nTxSize(0), nModSize(0), nUsageSize(0), nTime(0), dPriority(0.0), hadNoDependencies(false) + nFee(0), nTxSize(0), nModSize(0), nUsageSize(0), nTime(0), dPriority(0.0), + hadNoDependencies(false), spendsCoinbase(false) { nHeight = MEMPOOL_HEIGHT; } CTxMemPoolEntry::CTxMemPoolEntry(const CTransaction& _tx, const CAmount& _nFee, int64_t _nTime, double _dPriority, - unsigned int _nHeight, bool poolHasNoInputsOf): + unsigned int _nHeight, bool poolHasNoInputsOf, + bool _spendsCoinbase): tx(_tx), nFee(_nFee), nTime(_nTime), dPriority(_dPriority), nHeight(_nHeight), - hadNoDependencies(poolHasNoInputsOf) + hadNoDependencies(poolHasNoInputsOf), + spendsCoinbase(_spendsCoinbase) { nTxSize = ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION); nModSize = tx.CalculateModifiedSize(nTxSize); @@ -177,7 +180,7 @@ void CTxMemPool::removeForReorg(const CCoinsViewCache *pcoins, unsigned int nMem const CTransaction& tx = it->GetTx(); if (!IsFinalTx(tx, nMemPoolHeight, GetAdjustedTime())) { transactionsToRemove.push_back(tx); - } else { + } else if (it->GetSpendsCoinbase()) { BOOST_FOREACH(const CTxIn& txin, tx.vin) { indexed_transaction_set::const_iterator it2 = mapTx.find(txin.prevout.hash); if (it2 != mapTx.end()) diff --git a/src/txmempool.h b/src/txmempool.h index cf242ca0b..ace1ec502 100644 --- a/src/txmempool.h +++ b/src/txmempool.h @@ -50,10 +50,12 @@ private: double dPriority; //! Priority when entering the mempool unsigned int nHeight; //! Chain height when entering the mempool bool hadNoDependencies; //! Not dependent on any other txs when it entered the mempool + bool spendsCoinbase; //! keep track of transactions that spend a coinbase public: CTxMemPoolEntry(const CTransaction& _tx, const CAmount& _nFee, - int64_t _nTime, double _dPriority, unsigned int _nHeight, bool poolHasNoInputsOf = false); + int64_t _nTime, double _dPriority, unsigned int _nHeight, + bool poolHasNoInputsOf, bool spendsCoinbase); CTxMemPoolEntry(); CTxMemPoolEntry(const CTxMemPoolEntry& other); @@ -66,6 +68,8 @@ public: unsigned int GetHeight() const { return nHeight; } bool WasClearAtEntry() const { return hadNoDependencies; } size_t DynamicMemoryUsage() const { return nUsageSize; } + + bool GetSpendsCoinbase() const { return spendsCoinbase; } }; // extracts a TxMemPoolEntry's transaction hash From e52ba51bdaa0cb46f359935c52b667e02c32d191 Mon Sep 17 00:00:00 2001 From: Suhas Daftuar Date: Thu, 12 Nov 2015 15:54:17 -0500 Subject: [PATCH 0481/1062] Don't call removeForReorg if DisconnectTip fails --- src/main.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index f9abccb46..961d1adf1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2640,11 +2640,8 @@ static bool ActivateBestChainStep(CValidationState &state, CBlockIndex *pindexMo // Disconnect active blocks which are no longer in the best chain. bool fBlocksDisconnected = false; while (chainActive.Tip() && chainActive.Tip() != pindexFork) { - if (!DisconnectTip(state)) { - // Probably an AbortNode() error, but try to keep mempool consistent anyway - mempool.removeForReorg(pcoinsTip, chainActive.Tip()->nHeight + 1); + if (!DisconnectTip(state)) return false; - } fBlocksDisconnected = true; } @@ -2678,9 +2675,6 @@ static bool ActivateBestChainStep(CValidationState &state, CBlockIndex *pindexMo break; } else { // A system error occurred (disk space, database error, ...). - // Probably gonna shut down ASAP, but try to keep mempool consistent anyway - if (fBlocksDisconnected) - mempool.removeForReorg(pcoinsTip, chainActive.Tip()->nHeight + 1); return false; } } else { From 233c9eb63538ba573d228696e317f9ed3e214be3 Mon Sep 17 00:00:00 2001 From: Suhas Daftuar Date: Mon, 23 Nov 2015 16:06:12 -0500 Subject: [PATCH 0482/1062] Fix removeForReorg to use MedianTimePast --- src/main.cpp | 6 +++--- src/txmempool.cpp | 4 ++-- src/txmempool.h | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 961d1adf1..8cb6b9dd3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2689,7 +2689,7 @@ static bool ActivateBestChainStep(CValidationState &state, CBlockIndex *pindexMo } if (fBlocksDisconnected) { - mempool.removeForReorg(pcoinsTip, chainActive.Tip()->nHeight + 1); + mempool.removeForReorg(pcoinsTip, chainActive.Tip()->nHeight + 1, STANDARD_LOCKTIME_VERIFY_FLAGS); } mempool.check(pcoinsTip); @@ -2777,7 +2777,7 @@ bool InvalidateBlock(CValidationState& state, CBlockIndex *pindex) { // ActivateBestChain considers blocks already in chainActive // unconditionally valid already, so force disconnect away from it. if (!DisconnectTip(state)) { - mempool.removeForReorg(pcoinsTip, chainActive.Tip()->nHeight + 1); + mempool.removeForReorg(pcoinsTip, chainActive.Tip()->nHeight + 1, STANDARD_LOCKTIME_VERIFY_FLAGS); return false; } } @@ -2793,7 +2793,7 @@ bool InvalidateBlock(CValidationState& state, CBlockIndex *pindex) { } InvalidChainFound(pindex); - mempool.removeForReorg(pcoinsTip, chainActive.Tip()->nHeight + 1); + mempool.removeForReorg(pcoinsTip, chainActive.Tip()->nHeight + 1, STANDARD_LOCKTIME_VERIFY_FLAGS); return true; } diff --git a/src/txmempool.cpp b/src/txmempool.cpp index b9fcb02f2..570af4945 100644 --- a/src/txmempool.cpp +++ b/src/txmempool.cpp @@ -171,14 +171,14 @@ void CTxMemPool::remove(const CTransaction &origTx, std::list& rem } } -void CTxMemPool::removeForReorg(const CCoinsViewCache *pcoins, unsigned int nMemPoolHeight) +void CTxMemPool::removeForReorg(const CCoinsViewCache *pcoins, unsigned int nMemPoolHeight, int flags) { // Remove transactions spending a coinbase which are now immature and no-longer-final transactions LOCK(cs); list transactionsToRemove; for (indexed_transaction_set::const_iterator it = mapTx.begin(); it != mapTx.end(); it++) { const CTransaction& tx = it->GetTx(); - if (!IsFinalTx(tx, nMemPoolHeight, GetAdjustedTime())) { + if (!CheckFinalTx(tx, flags)) { transactionsToRemove.push_back(tx); } else if (it->GetSpendsCoinbase()) { BOOST_FOREACH(const CTxIn& txin, tx.vin) { diff --git a/src/txmempool.h b/src/txmempool.h index ace1ec502..913682eeb 100644 --- a/src/txmempool.h +++ b/src/txmempool.h @@ -164,7 +164,7 @@ public: bool addUnchecked(const uint256& hash, const CTxMemPoolEntry &entry, bool fCurrentEstimate = true); void remove(const CTransaction &tx, std::list& removed, bool fRecursive = false); void removeWithAnchor(const uint256 &invalidRoot); - void removeForReorg(const CCoinsViewCache *pcoins, unsigned int nMemPoolHeight); + void removeForReorg(const CCoinsViewCache *pcoins, unsigned int nMemPoolHeight, int flags); void removeConflicts(const CTransaction &tx, std::list& removed); void removeForBlock(const std::vector& vtx, unsigned int nBlockHeight, std::list& conflicts, bool fCurrentEstimate = true); From 34a64fe0a231bdd74f5284267869190ba9144f72 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 9 Feb 2018 23:16:55 +0000 Subject: [PATCH 0483/1062] Remove mempool transactions which commit to an unmineable branch ID --- qa/pull-tester/rpc-tests.sh | 1 + qa/rpc-tests/mempool_nu_activation.py | 119 ++++++++++++++++++++++++++ src/consensus/upgrades.h | 3 + src/gtest/test_mempool.cpp | 3 +- src/main.cpp | 19 +++- src/test/mempool_tests.cpp | 56 ++++++++++++ src/test/test_bitcoin.cpp | 3 +- src/test/test_bitcoin.h | 6 +- src/txmempool.cpp | 26 +++++- src/txmempool.h | 5 +- 10 files changed, 233 insertions(+), 8 deletions(-) create mode 100755 qa/rpc-tests/mempool_nu_activation.py diff --git a/qa/pull-tester/rpc-tests.sh b/qa/pull-tester/rpc-tests.sh index 773bc4cc0..59455129d 100755 --- a/qa/pull-tester/rpc-tests.sh +++ b/qa/pull-tester/rpc-tests.sh @@ -29,6 +29,7 @@ testScripts=( 'mempool_spendcoinbase.py' 'mempool_reorg.py' 'mempool_tx_input_limit.py' + 'mempool_nu_activation.py' 'httpbasics.py' 'zapwallettxes.py' 'proxy_test.py' diff --git a/qa/rpc-tests/mempool_nu_activation.py b/qa/rpc-tests/mempool_nu_activation.py new file mode 100755 index 000000000..f54095660 --- /dev/null +++ b/qa/rpc-tests/mempool_nu_activation.py @@ -0,0 +1,119 @@ +#!/usr/bin/env python2 +# Copyright (c) 2018 The Zcash developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +from test_framework.test_framework import BitcoinTestFramework +from test_framework.util import assert_equal, initialize_chain_clean, \ + start_node, connect_nodes, wait_and_assert_operationid_status + +from decimal import Decimal + +# Test mempool behaviour around network upgrade activation +class MempoolUpgradeActivationTest(BitcoinTestFramework): + + alert_filename = None # Set by setup_network + + def setup_network(self): + args = ["-checkmempool", "-debug=mempool", "-blockmaxsize=4000", "-nuparams=5ba81b19:200"] + self.nodes = [] + self.nodes.append(start_node(0, self.options.tmpdir, args)) + self.nodes.append(start_node(1, self.options.tmpdir, args)) + connect_nodes(self.nodes[1], 0) + self.is_network_split = False + self.sync_all + + def setup_chain(self): + print "Initializing test directory "+self.options.tmpdir + initialize_chain_clean(self.options.tmpdir, 2) + + def run_test(self): + self.nodes[1].generate(100) + self.sync_all() + + # Mine 97 blocks. After this, nodes[1] blocks + # 1 to 97 are spend-able. + self.nodes[0].generate(97) + self.sync_all() + + # Shield some ZEC + node1_taddr = self.nodes[1].getnewaddress() + node0_zaddr = self.nodes[0].z_getnewaddress() + recipients = [{'address': node0_zaddr, 'amount': Decimal('10')}] + myopid = self.nodes[1].z_sendmany(node1_taddr, recipients, 1, Decimal('0')) + print wait_and_assert_operationid_status(self.nodes[1], myopid) + self.sync_all() + + # Mine block 198. After this, the mempool expects + # block 199, which is the last Sprout block. + self.nodes[0].generate(1) + self.sync_all() + + # Mempool should be empty. + assert_equal(set(self.nodes[0].getrawmempool()), set()) + + # Check node 0 shielded balance + assert_equal(self.nodes[0].z_getbalance(node0_zaddr), Decimal('10')) + + # Fill the mempool with twice as many transactions as can fit into blocks + node0_taddr = self.nodes[0].getnewaddress() + sprout_txids = [] + while self.nodes[1].getmempoolinfo()['bytes'] < 2 * 4000: + sprout_txids.append(self.nodes[1].sendtoaddress(node0_taddr, Decimal('0.001'))) + self.sync_all() + + # Spends should be in the mempool + sprout_mempool = set(self.nodes[0].getrawmempool()) + assert_equal(sprout_mempool, set(sprout_txids)) + + # Mine block 199. After this, the mempool expects + # block 200, which is the first Overwinter block. + self.nodes[0].generate(1) + self.sync_all() + + # mempool should be empty. + assert_equal(set(self.nodes[0].getrawmempool()), set()) + + # Block 199 should contain a subset of the original mempool + # (with all other transactions having been dropped) + block_txids = self.nodes[0].getblock(self.nodes[0].getbestblockhash())['tx'] + assert(len(block_txids) < len(sprout_txids)) + for txid in block_txids[1:]: # Exclude coinbase + assert(txid in sprout_txids) + + # Create some transparent Overwinter transactions + overwinter_txids = [self.nodes[1].sendtoaddress(node0_taddr, Decimal('0.001')) for i in range(10)] + self.sync_all() + + # Create a shielded Overwinter transaction + recipients = [{'address': node0_taddr, 'amount': Decimal('10')}] + myopid = self.nodes[0].z_sendmany(node0_zaddr, recipients, 1, Decimal('0')) + shielded = wait_and_assert_operationid_status(self.nodes[0], myopid) + assert(shielded != None) + overwinter_txids.append(shielded) + self.sync_all() + + # Spends should be in the mempool + assert_equal(set(self.nodes[0].getrawmempool()), set(overwinter_txids)) + + # Node 0 note should be unspendable + assert_equal(self.nodes[0].z_getbalance(node0_zaddr), Decimal('0')) + + # Invalidate block 199. + self.nodes[0].invalidateblock(self.nodes[0].getbestblockhash()) + + # BUG: Ideally, the mempool should now only contain the transactions + # that were in block 199, the Overwinter transactions having been dropped. + # However, because chainActive is not updated until after the transactions + # in the disconnected block have been re-added to the mempool, the height + # seen by AcceptToMemoryPool is one greater than it should be. This causes + # the block 199 transactions to be validated against the Overwinter rules, + # and rejected because they (obviously) fail. + #assert_equal(set(self.nodes[0].getrawmempool()), set(block_txids[1:])) + assert_equal(set(self.nodes[0].getrawmempool()), set()) + + # Node 0 note should be spendable again + assert_equal(self.nodes[0].z_getbalance(node0_zaddr), Decimal('10')) + +if __name__ == '__main__': + MempoolUpgradeActivationTest().main() diff --git a/src/consensus/upgrades.h b/src/consensus/upgrades.h index 0c5462c2e..6a9173264 100644 --- a/src/consensus/upgrades.h +++ b/src/consensus/upgrades.h @@ -26,6 +26,9 @@ struct NUInfo { extern const struct NUInfo NetworkUpgradeInfo[]; +// Consensus branch id to identify pre-overwinter (Sprout) consensus rules. +static const uint32_t SPROUT_BRANCH_ID = NetworkUpgradeInfo[Consensus::BASE_SPROUT].nBranchId; + /** * Checks the state of a given network upgrade based on block height. * Caller must check that the height is >= 0 (and handle unknown heights). diff --git a/src/gtest/test_mempool.cpp b/src/gtest/test_mempool.cpp index 46b0a6d12..c0d2cb874 100644 --- a/src/gtest/test_mempool.cpp +++ b/src/gtest/test_mempool.cpp @@ -1,6 +1,7 @@ #include #include +#include "consensus/upgrades.h" #include "consensus/validation.h" #include "core_io.h" #include "main.h" @@ -83,7 +84,7 @@ TEST(Mempool, PriorityStatsDoNotCrash) { unsigned int nHeight = 92045; double dPriority = view.GetPriority(tx, nHeight); - CTxMemPoolEntry entry(tx, nFees, nTime, dPriority, nHeight, true, false); + CTxMemPoolEntry entry(tx, nFees, nTime, dPriority, nHeight, true, false, SPROUT_BRANCH_ID); // Check it does not crash (ie. the death test fails) EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(testPool.addUnchecked(tx.GetHash(), entry), ""), ""); diff --git a/src/main.cpp b/src/main.cpp index 8cb6b9dd3..ba1edd183 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1199,7 +1199,12 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa } } - CTxMemPoolEntry entry(tx, nFees, GetTime(), dPriority, chainActive.Height(), mempool.HasNoInputsOf(tx), fSpendsCoinbase); + // Grab the branch ID we expect this transaction to commit to. We don't + // yet know if it does, but if the entry gets added to the mempool, then + // it has passed ContextualCheckInputs and therefore this is correct. + auto consensusBranchId = CurrentEpochBranchId(chainActive.Height() + 1, Params().GetConsensus()); + + CTxMemPoolEntry entry(tx, nFees, GetTime(), dPriority, chainActive.Height(), mempool.HasNoInputsOf(tx), fSpendsCoinbase, consensusBranchId); unsigned int nSize = entry.GetTxSize(); // Accept a tx if it contains joinsplits and has at least the default fee specified by z_sendmany. @@ -2430,7 +2435,10 @@ void static UpdateTip(CBlockIndex *pindexNew) { } } -/** Disconnect chainActive's tip. You probably want to call mempool.removeForReorg after this, with cs_main held. */ +/** + * Disconnect chainActive's tip. You probably want to call mempool.removeForReorg and + * mempool.removeWithoutBranchId after this, with cs_main held. + */ bool static DisconnectTip(CValidationState &state, bool fBare = false) { CBlockIndex *pindexDelete = chainActive.Tip(); assert(pindexDelete); @@ -2493,6 +2501,7 @@ static int64_t nTimePostConnect = 0; /** * Connect a new block to chainActive. pblock is either NULL or a pointer to a CBlock * corresponding to pindexNew, to bypass loading it again from disk. + * You probably want to call mempool.removeWithoutBranchId after this, with cs_main held. */ bool static ConnectTip(CValidationState &state, CBlockIndex *pindexNew, CBlock *pblock) { assert(pindexNew->pprev == chainActive.Tip()); @@ -2691,6 +2700,8 @@ static bool ActivateBestChainStep(CValidationState &state, CBlockIndex *pindexMo if (fBlocksDisconnected) { mempool.removeForReorg(pcoinsTip, chainActive.Tip()->nHeight + 1, STANDARD_LOCKTIME_VERIFY_FLAGS); } + mempool.removeWithoutBranchId( + CurrentEpochBranchId(chainActive.Tip()->nHeight + 1, Params().GetConsensus())); mempool.check(pcoinsTip); // Callbacks/notifications for a new best chain. @@ -2778,6 +2789,8 @@ bool InvalidateBlock(CValidationState& state, CBlockIndex *pindex) { // unconditionally valid already, so force disconnect away from it. if (!DisconnectTip(state)) { mempool.removeForReorg(pcoinsTip, chainActive.Tip()->nHeight + 1, STANDARD_LOCKTIME_VERIFY_FLAGS); + mempool.removeWithoutBranchId( + CurrentEpochBranchId(chainActive.Tip()->nHeight + 1, Params().GetConsensus())); return false; } } @@ -2794,6 +2807,8 @@ bool InvalidateBlock(CValidationState& state, CBlockIndex *pindex) { InvalidChainFound(pindex); mempool.removeForReorg(pcoinsTip, chainActive.Tip()->nHeight + 1, STANDARD_LOCKTIME_VERIFY_FLAGS); + mempool.removeWithoutBranchId( + CurrentEpochBranchId(chainActive.Tip()->nHeight + 1, Params().GetConsensus())); return true; } diff --git a/src/test/mempool_tests.cpp b/src/test/mempool_tests.cpp index c72ec4c36..325789572 100644 --- a/src/test/mempool_tests.cpp +++ b/src/test/mempool_tests.cpp @@ -2,6 +2,7 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. +#include "consensus/upgrades.h" #include "main.h" #include "txmempool.h" #include "util.h" @@ -156,4 +157,59 @@ BOOST_AUTO_TEST_CASE(MempoolIndexingTest) BOOST_CHECK(it == pool.mapTx.get<1>().end()); } +BOOST_AUTO_TEST_CASE(RemoveWithoutBranchId) { + CTxMemPool pool(CFeeRate(0)); + TestMemPoolEntryHelper entry; + entry.nFee = 10000LL; + entry.hadNoDependencies = true; + + // Add some Sprout transactions + for (auto i = 1; i < 11; i++) { + CMutableTransaction tx = CMutableTransaction(); + tx.vout.resize(1); + tx.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL; + tx.vout[0].nValue = i * COIN; + pool.addUnchecked(tx.GetHash(), entry.BranchId(NetworkUpgradeInfo[Consensus::BASE_SPROUT].nBranchId).FromTx(tx)); + } + BOOST_CHECK_EQUAL(pool.size(), 10); + + // Check the pool only contains Sprout transactions + for (CTxMemPool::indexed_transaction_set::const_iterator it = pool.mapTx.begin(); it != pool.mapTx.end(); it++) { + BOOST_CHECK_EQUAL(it->GetValidatedBranchId(), NetworkUpgradeInfo[Consensus::BASE_SPROUT].nBranchId); + } + + // Add some dummy transactions + for (auto i = 1; i < 11; i++) { + CMutableTransaction tx = CMutableTransaction(); + tx.vout.resize(1); + tx.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL; + tx.vout[0].nValue = i * COIN + 100; + pool.addUnchecked(tx.GetHash(), entry.BranchId(NetworkUpgradeInfo[Consensus::UPGRADE_TESTDUMMY].nBranchId).FromTx(tx)); + } + BOOST_CHECK_EQUAL(pool.size(), 20); + + // Add some Overwinter transactions + for (auto i = 1; i < 11; i++) { + CMutableTransaction tx = CMutableTransaction(); + tx.vout.resize(1); + tx.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL; + tx.vout[0].nValue = i * COIN + 200; + pool.addUnchecked(tx.GetHash(), entry.BranchId(NetworkUpgradeInfo[Consensus::UPGRADE_OVERWINTER].nBranchId).FromTx(tx)); + } + BOOST_CHECK_EQUAL(pool.size(), 30); + + // Remove transactions that are not for Overwinter + pool.removeWithoutBranchId(NetworkUpgradeInfo[Consensus::UPGRADE_OVERWINTER].nBranchId); + BOOST_CHECK_EQUAL(pool.size(), 10); + + // Check the pool only contains Overwinter transactions + for (CTxMemPool::indexed_transaction_set::const_iterator it = pool.mapTx.begin(); it != pool.mapTx.end(); it++) { + BOOST_CHECK_EQUAL(it->GetValidatedBranchId(), NetworkUpgradeInfo[Consensus::UPGRADE_OVERWINTER].nBranchId); + } + + // Roll back to Sprout + pool.removeWithoutBranchId(NetworkUpgradeInfo[Consensus::BASE_SPROUT].nBranchId); + BOOST_CHECK_EQUAL(pool.size(), 0); +} + BOOST_AUTO_TEST_SUITE_END() diff --git a/src/test/test_bitcoin.cpp b/src/test/test_bitcoin.cpp index 822474235..02a3a50d2 100644 --- a/src/test/test_bitcoin.cpp +++ b/src/test/test_bitcoin.cpp @@ -106,7 +106,8 @@ TestingSetup::~TestingSetup() CTxMemPoolEntry TestMemPoolEntryHelper::FromTx(CMutableTransaction &tx, CTxMemPool *pool) { return CTxMemPoolEntry(tx, nFee, nTime, dPriority, nHeight, - pool ? pool->HasNoInputsOf(tx) : hadNoDependencies, spendsCoinbase); + pool ? pool->HasNoInputsOf(tx) : hadNoDependencies, + spendsCoinbase, nBranchId); } void Shutdown(void* parg) diff --git a/src/test/test_bitcoin.h b/src/test/test_bitcoin.h index db9245b7f..ae528d682 100644 --- a/src/test/test_bitcoin.h +++ b/src/test/test_bitcoin.h @@ -1,6 +1,7 @@ #ifndef BITCOIN_TEST_TEST_BITCOIN_H #define BITCOIN_TEST_TEST_BITCOIN_H +#include "consensus/upgrades.h" #include "pubkey.h" #include "txdb.h" @@ -48,10 +49,12 @@ struct TestMemPoolEntryHelper unsigned int nHeight; bool hadNoDependencies; bool spendsCoinbase; + uint32_t nBranchId; TestMemPoolEntryHelper() : nFee(0), nTime(0), dPriority(0.0), nHeight(1), - hadNoDependencies(false), spendsCoinbase(false) { } + hadNoDependencies(false), spendsCoinbase(false), + nBranchId(SPROUT_BRANCH_ID) { } CTxMemPoolEntry FromTx(CMutableTransaction &tx, CTxMemPool *pool = NULL); @@ -62,5 +65,6 @@ struct TestMemPoolEntryHelper TestMemPoolEntryHelper &Height(unsigned int _height) { nHeight = _height; return *this; } TestMemPoolEntryHelper &HadNoDependencies(bool _hnd) { hadNoDependencies = _hnd; return *this; } TestMemPoolEntryHelper &SpendsCoinbase(bool _flag) { spendsCoinbase = _flag; return *this; } + TestMemPoolEntryHelper &BranchId(uint32_t _branchId) { nBranchId = _branchId; return *this; } }; #endif diff --git a/src/txmempool.cpp b/src/txmempool.cpp index 570af4945..c69e77d05 100644 --- a/src/txmempool.cpp +++ b/src/txmempool.cpp @@ -28,10 +28,10 @@ CTxMemPoolEntry::CTxMemPoolEntry(): CTxMemPoolEntry::CTxMemPoolEntry(const CTransaction& _tx, const CAmount& _nFee, int64_t _nTime, double _dPriority, unsigned int _nHeight, bool poolHasNoInputsOf, - bool _spendsCoinbase): + bool _spendsCoinbase, uint32_t _nBranchId): tx(_tx), nFee(_nFee), nTime(_nTime), dPriority(_dPriority), nHeight(_nHeight), hadNoDependencies(poolHasNoInputsOf), - spendsCoinbase(_spendsCoinbase) + spendsCoinbase(_spendsCoinbase), nBranchId(_nBranchId) { nTxSize = ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION); nModSize = tx.CalculateModifiedSize(nTxSize); @@ -283,6 +283,28 @@ void CTxMemPool::removeForBlock(const std::vector& vtx, unsigned i minerPolicyEstimator->processBlock(nBlockHeight, entries, fCurrentEstimate); } +/** + * Called whenever the tip changes. Removes transactions which don't commit to + * the given branch ID from the mempool. + */ +void CTxMemPool::removeWithoutBranchId(uint32_t nMemPoolBranchId) +{ + LOCK(cs); + std::list transactionsToRemove; + + for (indexed_transaction_set::const_iterator it = mapTx.begin(); it != mapTx.end(); it++) { + const CTransaction& tx = it->GetTx(); + if (it->GetValidatedBranchId() != nMemPoolBranchId) { + transactionsToRemove.push_back(tx); + } + } + + for (const CTransaction& tx : transactionsToRemove) { + std::list removed; + remove(tx, removed, true); + } +} + void CTxMemPool::clear() { LOCK(cs); diff --git a/src/txmempool.h b/src/txmempool.h index 913682eeb..2cb2c8f05 100644 --- a/src/txmempool.h +++ b/src/txmempool.h @@ -51,11 +51,12 @@ private: unsigned int nHeight; //! Chain height when entering the mempool bool hadNoDependencies; //! Not dependent on any other txs when it entered the mempool bool spendsCoinbase; //! keep track of transactions that spend a coinbase + uint32_t nBranchId; //! Branch ID this transaction is known to commit to, cached for efficiency public: CTxMemPoolEntry(const CTransaction& _tx, const CAmount& _nFee, int64_t _nTime, double _dPriority, unsigned int _nHeight, - bool poolHasNoInputsOf, bool spendsCoinbase); + bool poolHasNoInputsOf, bool spendsCoinbase, uint32_t nBranchId); CTxMemPoolEntry(); CTxMemPoolEntry(const CTxMemPoolEntry& other); @@ -70,6 +71,7 @@ public: size_t DynamicMemoryUsage() const { return nUsageSize; } bool GetSpendsCoinbase() const { return spendsCoinbase; } + uint32_t GetValidatedBranchId() const { return nBranchId; } }; // extracts a TxMemPoolEntry's transaction hash @@ -168,6 +170,7 @@ public: void removeConflicts(const CTransaction &tx, std::list& removed); void removeForBlock(const std::vector& vtx, unsigned int nBlockHeight, std::list& conflicts, bool fCurrentEstimate = true); + void removeWithoutBranchId(uint32_t nMemPoolBranchId); void clear(); void queryHashes(std::vector& vtxid); void pruneSpent(const uint256& hash, CCoins &coins); From 838e7a29cc21f9d44b385805bccc08ab328861a4 Mon Sep 17 00:00:00 2001 From: Pieter Wuille Date: Sun, 3 Jan 2016 16:50:31 +0100 Subject: [PATCH 0484/1062] Report non-mandatory script failures correctly --- src/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 612067d89..23ff7fb34 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1846,9 +1846,9 @@ bool ContextualCheckInputs(const CTransaction& tx, CValidationState &state, cons // arguments; if so, don't trigger DoS protection to // avoid splitting the network between upgraded and // non-upgraded nodes. - CScriptCheck check(*coins, tx, i, + CScriptCheck check2(*coins, tx, i, flags & ~STANDARD_NOT_MANDATORY_VERIFY_FLAGS, cacheStore); - if (check()) + if (check2()) return state.Invalid(false, REJECT_NONSTANDARD, strprintf("non-mandatory-script-verify-flag (%s)", ScriptErrorString(check.GetScriptError()))); } // Failures of other flags indicate a transaction that is From 8cb98d9105acf4f32412b5794064d07b9ef84605 Mon Sep 17 00:00:00 2001 From: 21E14 <21xe14@gmail.com> Date: Fri, 29 Apr 2016 23:45:20 -0400 Subject: [PATCH 0485/1062] Remove obsolete reference to CValidationState from UpdateCoins. --- src/main.cpp | 8 ++++---- src/main.h | 2 +- src/miner.cpp | 2 +- src/test/coins_tests.cpp | 2 +- src/txmempool.cpp | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 23ff7fb34..9b58b77f3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1684,7 +1684,7 @@ void static InvalidBlockFound(CBlockIndex *pindex, const CValidationState &state } } -void UpdateCoins(const CTransaction& tx, CValidationState &state, CCoinsViewCache &inputs, CTxUndo &txundo, int nHeight) +void UpdateCoins(const CTransaction& tx, CCoinsViewCache& inputs, CTxUndo &txundo, int nHeight) { // mark inputs spent if (!tx.IsCoinBase()) { @@ -1718,10 +1718,10 @@ void UpdateCoins(const CTransaction& tx, CValidationState &state, CCoinsViewCach inputs.ModifyCoins(tx.GetHash())->FromTx(tx, nHeight); } -void UpdateCoins(const CTransaction& tx, CValidationState &state, CCoinsViewCache &inputs, int nHeight) +void UpdateCoins(const CTransaction& tx, CCoinsViewCache& inputs, int nHeight) { CTxUndo txundo; - UpdateCoins(tx, state, inputs, txundo, nHeight); + UpdateCoins(tx, inputs, txundo, nHeight); } bool CScriptCheck::operator()() { @@ -2278,7 +2278,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin if (i > 0) { blockundo.vtxundo.push_back(CTxUndo()); } - UpdateCoins(tx, state, view, i == 0 ? undoDummy : blockundo.vtxundo.back(), pindex->nHeight); + UpdateCoins(tx, view, i == 0 ? undoDummy : blockundo.vtxundo.back(), pindex->nHeight); BOOST_FOREACH(const JSDescription &joinsplit, tx.vjoinsplit) { BOOST_FOREACH(const uint256 ¬e_commitment, joinsplit.commitments) { diff --git a/src/main.h b/src/main.h index ebdb48515..130014bef 100644 --- a/src/main.h +++ b/src/main.h @@ -337,7 +337,7 @@ bool ContextualCheckInputs(const CTransaction& tx, CValidationState &state, cons bool ContextualCheckTransaction(const CTransaction& tx, CValidationState &state, int nHeight, int dosLevel); /** Apply the effects of this transaction on the UTXO set represented by view */ -void UpdateCoins(const CTransaction& tx, CValidationState &state, CCoinsViewCache &inputs, int nHeight); +void UpdateCoins(const CTransaction& tx, CCoinsViewCache& inputs, int nHeight); /** Context-independent validity checks */ bool CheckTransaction(const CTransaction& tx, CValidationState& state, libzcash::ProofVerifier& verifier); diff --git a/src/miner.cpp b/src/miner.cpp index 6b239c3d1..84a6edf6a 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -296,7 +296,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) if (!ContextualCheckInputs(tx, state, view, true, MANDATORY_SCRIPT_VERIFY_FLAGS, true, Params().GetConsensus())) continue; - UpdateCoins(tx, state, view, nHeight); + UpdateCoins(tx, view, nHeight); // Added pblock->vtx.push_back(tx); diff --git a/src/test/coins_tests.cpp b/src/test/coins_tests.cpp index 2779557ea..383616ae0 100644 --- a/src/test/coins_tests.cpp +++ b/src/test/coins_tests.cpp @@ -745,7 +745,7 @@ BOOST_AUTO_TEST_CASE(coins_coinbase_spends) BOOST_CHECK(tx.IsCoinBase()); CValidationState state; - UpdateCoins(tx, state, cache, 100); + UpdateCoins(tx, cache, 100); // Create coinbase spend CMutableTransaction mtx2; diff --git a/src/txmempool.cpp b/src/txmempool.cpp index c69e77d05..5492bc4e5 100644 --- a/src/txmempool.cpp +++ b/src/txmempool.cpp @@ -384,7 +384,7 @@ void CTxMemPool::check(const CCoinsViewCache *pcoins) const else { CValidationState state; assert(ContextualCheckInputs(tx, state, mempoolDuplicate, false, 0, false, Params().GetConsensus(), NULL)); - UpdateCoins(tx, state, mempoolDuplicate, 1000000); + UpdateCoins(tx, mempoolDuplicate, 1000000); } } unsigned int stepsSinceLastRemove = 0; @@ -398,7 +398,7 @@ void CTxMemPool::check(const CCoinsViewCache *pcoins) const assert(stepsSinceLastRemove < waitingOnDependants.size()); } else { assert(ContextualCheckInputs(entry->GetTx(), state, mempoolDuplicate, false, 0, false, Params().GetConsensus(), NULL)); - UpdateCoins(entry->GetTx(), state, mempoolDuplicate, 1000000); + UpdateCoins(entry->GetTx(), mempoolDuplicate, 1000000); stepsSinceLastRemove = 0; } } From ffda7e01a5f6f5fd9f268554d72dbf268c872e72 Mon Sep 17 00:00:00 2001 From: Jonas Nick Date: Mon, 30 May 2016 11:43:53 +0200 Subject: [PATCH 0486/1062] Reduce unnecessary hashing in signrawtransaction --- src/rpcrawtransaction.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/rpcrawtransaction.cpp b/src/rpcrawtransaction.cpp index 48a30fbd6..8c9d85ac2 100644 --- a/src/rpcrawtransaction.cpp +++ b/src/rpcrawtransaction.cpp @@ -838,6 +838,9 @@ UniValue signrawtransaction(const UniValue& params, bool fHelp) // Script verification errors UniValue vErrors(UniValue::VARR); + // Use CTransaction for the constant parts of the + // transaction to avoid rehashing. + const CTransaction txConst(mergedTx); // Sign what we can: for (unsigned int i = 0; i < mergedTx.vin.size(); i++) { CTxIn& txin = mergedTx.vin[i]; @@ -855,10 +858,10 @@ UniValue signrawtransaction(const UniValue& params, bool fHelp) // ... and merge in other signatures: BOOST_FOREACH(const CMutableTransaction& txv, txVariants) { - txin.scriptSig = CombineSignatures(prevPubKey, mergedTx, i, txin.scriptSig, txv.vin[i].scriptSig); + txin.scriptSig = CombineSignatures(prevPubKey, txConst, i, txin.scriptSig, txv.vin[i].scriptSig); } ScriptError serror = SCRIPT_ERR_OK; - if (!VerifyScript(txin.scriptSig, prevPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, MutableTransactionSignatureChecker(&mergedTx, i), &serror)) { + if (!VerifyScript(txin.scriptSig, prevPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, TransactionSignatureChecker(&txConst, i), &serror)) { TxInErrorToJSON(txin, vErrors, ScriptErrorString(serror)); } } From 2d42e1a993b98ceb92323a8a555243676e3795f8 Mon Sep 17 00:00:00 2001 From: Pieter Wuille Date: Thu, 31 Mar 2016 14:51:29 +0200 Subject: [PATCH 0487/1062] Refactor script validation to observe amounts This is a preparation for BIP143 support. Edited for Zcash merge by Ariel Gabizon. --- src/bitcoin-tx.cpp | 3 ++- src/main.cpp | 2 +- src/main.h | 6 ++++-- src/rpcrawtransaction.cpp | 3 ++- src/script/interpreter.h | 4 ++-- src/script/sigcache.h | 2 +- src/script/sign.cpp | 5 +++-- src/script/zcashconsensus.cpp | 3 ++- src/script/zcashconsensus.h | 2 ++ src/test/multisig_tests.cpp | 17 +++++++++-------- src/test/script_P2SH_tests.cpp | 2 +- src/test/script_tests.cpp | 29 +++++++++++++++-------------- src/test/transaction_tests.cpp | 6 ++++-- src/zcbenchmarks.cpp | 2 +- 14 files changed, 49 insertions(+), 37 deletions(-) diff --git a/src/bitcoin-tx.cpp b/src/bitcoin-tx.cpp index 9e81a14ec..43fe5f976 100644 --- a/src/bitcoin-tx.cpp +++ b/src/bitcoin-tx.cpp @@ -421,6 +421,7 @@ static void MutateTxSign(CMutableTransaction& tx, const string& flagStr) continue; } const CScript& prevPubKey = coins->vout[txin.prevout.n].scriptPubKey; + const CAmount& amount = coins->vout[txin.prevout.n].nValue; txin.scriptSig.clear(); // Only sign SIGHASH_SINGLE if there's a corresponding output: @@ -431,7 +432,7 @@ static void MutateTxSign(CMutableTransaction& tx, const string& flagStr) BOOST_FOREACH(const CTransaction& txv, txVariants) { txin.scriptSig = CombineSignatures(prevPubKey, mergedTx, i, txin.scriptSig, txv.vin[i].scriptSig); } - if (!VerifyScript(txin.scriptSig, prevPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, MutableTransactionSignatureChecker(&mergedTx, i))) + if (!VerifyScript(txin.scriptSig, prevPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, MutableTransactionSignatureChecker(&mergedTx, i, amount))) fComplete = false; } diff --git a/src/main.cpp b/src/main.cpp index 9b58b77f3..b5fc26496 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1726,7 +1726,7 @@ void UpdateCoins(const CTransaction& tx, CCoinsViewCache& inputs, int nHeight) bool CScriptCheck::operator()() { const CScript &scriptSig = ptxTo->vin[nIn].scriptSig; - if (!VerifyScript(scriptSig, scriptPubKey, nFlags, CachingTransactionSignatureChecker(ptxTo, nIn, cacheStore), &error)) { + if (!VerifyScript(scriptSig, scriptPubKey, nFlags, CachingTransactionSignatureChecker(ptxTo, nIn, amount, cacheStore), &error)) { return ::error("CScriptCheck(): %s:%d VerifySignature failed: %s", ptxTo->GetHash().ToString(), nIn, ScriptErrorString(error)); } return true; diff --git a/src/main.h b/src/main.h index 130014bef..39bffd286 100644 --- a/src/main.h +++ b/src/main.h @@ -371,6 +371,7 @@ class CScriptCheck { private: CScript scriptPubKey; + CAmount amount; const CTransaction *ptxTo; unsigned int nIn; unsigned int nFlags; @@ -378,9 +379,9 @@ private: ScriptError error; public: - CScriptCheck(): ptxTo(0), nIn(0), nFlags(0), cacheStore(false), error(SCRIPT_ERR_UNKNOWN_ERROR) {} + CScriptCheck(): amount(0), ptxTo(0), nIn(0), nFlags(0), cacheStore(false), error(SCRIPT_ERR_UNKNOWN_ERROR) {} CScriptCheck(const CCoins& txFromIn, const CTransaction& txToIn, unsigned int nInIn, unsigned int nFlagsIn, bool cacheIn) : - scriptPubKey(txFromIn.vout[txToIn.vin[nInIn].prevout.n].scriptPubKey), + scriptPubKey(txFromIn.vout[txToIn.vin[nInIn].prevout.n].scriptPubKey), amount(txFromIn.vout[txToIn.vin[nInIn].prevout.n].nValue), ptxTo(&txToIn), nIn(nInIn), nFlags(nFlagsIn), cacheStore(cacheIn), error(SCRIPT_ERR_UNKNOWN_ERROR) { } bool operator()(); @@ -388,6 +389,7 @@ public: void swap(CScriptCheck &check) { scriptPubKey.swap(check.scriptPubKey); std::swap(ptxTo, check.ptxTo); + std::swap(amount, check.amount); std::swap(nIn, check.nIn); std::swap(nFlags, check.nFlags); std::swap(cacheStore, check.cacheStore); diff --git a/src/rpcrawtransaction.cpp b/src/rpcrawtransaction.cpp index 8c9d85ac2..f8570dbfe 100644 --- a/src/rpcrawtransaction.cpp +++ b/src/rpcrawtransaction.cpp @@ -850,6 +850,7 @@ UniValue signrawtransaction(const UniValue& params, bool fHelp) continue; } const CScript& prevPubKey = coins->vout[txin.prevout.n].scriptPubKey; + const CAmount& amount = coins->vout[txin.prevout.n].nValue; txin.scriptSig.clear(); // Only sign SIGHASH_SINGLE if there's a corresponding output: @@ -861,7 +862,7 @@ UniValue signrawtransaction(const UniValue& params, bool fHelp) txin.scriptSig = CombineSignatures(prevPubKey, txConst, i, txin.scriptSig, txv.vin[i].scriptSig); } ScriptError serror = SCRIPT_ERR_OK; - if (!VerifyScript(txin.scriptSig, prevPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, TransactionSignatureChecker(&txConst, i), &serror)) { + if (!VerifyScript(txin.scriptSig, prevPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, TransactionSignatureChecker(&txConst, i, amount), &serror)) { TxInErrorToJSON(txin, vErrors, ScriptErrorString(serror)); } } diff --git a/src/script/interpreter.h b/src/script/interpreter.h index f467f08fc..1ae122065 100644 --- a/src/script/interpreter.h +++ b/src/script/interpreter.h @@ -116,7 +116,7 @@ protected: virtual bool VerifySignature(const std::vector& vchSig, const CPubKey& vchPubKey, const uint256& sighash) const; public: - TransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn) : txTo(txToIn), nIn(nInIn) {} + TransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn, const CAmount& amount) : txTo(txToIn), nIn(nInIn) {} bool CheckSig(const std::vector& scriptSig, const std::vector& vchPubKey, const CScript& scriptCode) const; bool CheckLockTime(const CScriptNum& nLockTime) const; }; @@ -127,7 +127,7 @@ private: const CTransaction txTo; public: - MutableTransactionSignatureChecker(const CMutableTransaction* txToIn, unsigned int nInIn) : TransactionSignatureChecker(&txTo, nInIn), txTo(*txToIn) {} + MutableTransactionSignatureChecker(const CMutableTransaction* txToIn, unsigned int nInIn, const CAmount& amount) : TransactionSignatureChecker(&txTo, nInIn, amount), txTo(*txToIn) {} }; bool EvalScript(std::vector >& stack, const CScript& script, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* error = NULL); diff --git a/src/script/sigcache.h b/src/script/sigcache.h index b299038da..0dcbf1c59 100644 --- a/src/script/sigcache.h +++ b/src/script/sigcache.h @@ -18,7 +18,7 @@ private: bool store; public: - CachingTransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn, bool storeIn=true) : TransactionSignatureChecker(txToIn, nInIn), store(storeIn) {} + CachingTransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn, const CAmount& amount, bool storeIn) : TransactionSignatureChecker(txToIn, nInIn, amount), store(storeIn) {} bool VerifySignature(const std::vector& vchSig, const CPubKey& vchPubKey, const uint256& sighash) const; }; diff --git a/src/script/sign.cpp b/src/script/sign.cpp index 75e6c6d9d..ff38218db 100644 --- a/src/script/sign.cpp +++ b/src/script/sign.cpp @@ -17,7 +17,8 @@ using namespace std; typedef vector valtype; -TransactionSignatureCreator::TransactionSignatureCreator(const CKeyStore* keystoreIn, const CTransaction* txToIn, unsigned int nInIn, int nHashTypeIn) : BaseSignatureCreator(keystoreIn), txTo(txToIn), nIn(nInIn), nHashType(nHashTypeIn), checker(txTo, nIn) {} +static const CAmount amountZero = 0; +TransactionSignatureCreator::TransactionSignatureCreator(const CKeyStore* keystoreIn, const CTransaction* txToIn, unsigned int nInIn, int nHashTypeIn) : BaseSignatureCreator(keystoreIn), txTo(txToIn), nIn(nInIn), nHashType(nHashTypeIn), checker(txTo, nIn, amountZero) {} bool TransactionSignatureCreator::CreateSig(std::vector& vchSig, const CKeyID& address, const CScript& scriptCode) const { @@ -263,7 +264,7 @@ static CScript CombineSignatures(const CScript& scriptPubKey, const BaseSignatur CScript CombineSignatures(const CScript& scriptPubKey, const CTransaction& txTo, unsigned int nIn, const CScript& scriptSig1, const CScript& scriptSig2) { - TransactionSignatureChecker checker(&txTo, nIn); + TransactionSignatureChecker checker(&txTo, nIn, amountZero); return CombineSignatures(scriptPubKey, checker, scriptSig1, scriptSig2); } diff --git a/src/script/zcashconsensus.cpp b/src/script/zcashconsensus.cpp index 277b805e5..80e92300f 100644 --- a/src/script/zcashconsensus.cpp +++ b/src/script/zcashconsensus.cpp @@ -85,7 +85,8 @@ int zcashconsensus_verify_script(const unsigned char *scriptPubKey, unsigned int // Regardless of the verification result, the tx did not error. set_error(err, zcashconsensus_ERR_OK); - return VerifyScript(tx.vin[nIn].scriptSig, CScript(scriptPubKey, scriptPubKey + scriptPubKeyLen), flags, TransactionSignatureChecker(&tx, nIn), NULL); + CAmount am(0); + return VerifyScript(tx.vin[nIn].scriptSig, CScript(scriptPubKey, scriptPubKey + scriptPubKeyLen), flags, TransactionSignatureChecker(&tx, nIn, am), NULL); } catch (const std::exception&) { return set_error(err, zcashconsensus_ERR_TX_DESERIALIZE); // Error deserializing } diff --git a/src/script/zcashconsensus.h b/src/script/zcashconsensus.h index 65e40bbb6..ff13471c6 100644 --- a/src/script/zcashconsensus.h +++ b/src/script/zcashconsensus.h @@ -6,6 +6,8 @@ #ifndef BITCOIN_ZCASHCONSENSUS_H #define BITCOIN_ZCASHCONSENSUS_H +#include + #if defined(BUILD_BITCOIN_INTERNAL) && defined(HAVE_CONFIG_H) #include "config/bitcoin-config.h" #if defined(_WIN32) diff --git a/src/test/multisig_tests.cpp b/src/test/multisig_tests.cpp index 6b189a6b5..3abd1558f 100644 --- a/src/test/multisig_tests.cpp +++ b/src/test/multisig_tests.cpp @@ -48,6 +48,7 @@ BOOST_AUTO_TEST_CASE(multisig_verify) ScriptError err; CKey key[4]; + CAmount amount = 0; for (int i = 0; i < 4; i++) key[i].MakeNewKey(true); @@ -83,20 +84,20 @@ BOOST_AUTO_TEST_CASE(multisig_verify) keys.assign(1,key[0]); keys.push_back(key[1]); s = sign_multisig(a_and_b, keys, txTo[0], 0); - BOOST_CHECK(VerifyScript(s, a_and_b, flags, MutableTransactionSignatureChecker(&txTo[0], 0), &err)); + BOOST_CHECK(VerifyScript(s, a_and_b, flags, MutableTransactionSignatureChecker(&txTo[0], 0, amount), &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); for (int i = 0; i < 4; i++) { keys.assign(1,key[i]); s = sign_multisig(a_and_b, keys, txTo[0], 0); - BOOST_CHECK_MESSAGE(!VerifyScript(s, a_and_b, flags, MutableTransactionSignatureChecker(&txTo[0], 0), &err), strprintf("a&b 1: %d", i)); + BOOST_CHECK_MESSAGE(!VerifyScript(s, a_and_b, flags, MutableTransactionSignatureChecker(&txTo[0], 0, amount), &err), strprintf("a&b 1: %d", i)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_INVALID_STACK_OPERATION, ScriptErrorString(err)); keys.assign(1,key[1]); keys.push_back(key[i]); s = sign_multisig(a_and_b, keys, txTo[0], 0); - BOOST_CHECK_MESSAGE(!VerifyScript(s, a_and_b, flags, MutableTransactionSignatureChecker(&txTo[0], 0), &err), strprintf("a&b 2: %d", i)); + BOOST_CHECK_MESSAGE(!VerifyScript(s, a_and_b, flags, MutableTransactionSignatureChecker(&txTo[0], 0, amount), &err), strprintf("a&b 2: %d", i)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); } @@ -107,18 +108,18 @@ BOOST_AUTO_TEST_CASE(multisig_verify) s = sign_multisig(a_or_b, keys, txTo[1], 0); if (i == 0 || i == 1) { - BOOST_CHECK_MESSAGE(VerifyScript(s, a_or_b, flags, MutableTransactionSignatureChecker(&txTo[1], 0), &err), strprintf("a|b: %d", i)); + BOOST_CHECK_MESSAGE(VerifyScript(s, a_or_b, flags, MutableTransactionSignatureChecker(&txTo[1], 0, amount), &err), strprintf("a|b: %d", i)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); } else { - BOOST_CHECK_MESSAGE(!VerifyScript(s, a_or_b, flags, MutableTransactionSignatureChecker(&txTo[1], 0), &err), strprintf("a|b: %d", i)); + BOOST_CHECK_MESSAGE(!VerifyScript(s, a_or_b, flags, MutableTransactionSignatureChecker(&txTo[1], 0, amount), &err), strprintf("a|b: %d", i)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); } } s.clear(); s << OP_0 << OP_1; - BOOST_CHECK(!VerifyScript(s, a_or_b, flags, MutableTransactionSignatureChecker(&txTo[1], 0), &err)); + BOOST_CHECK(!VerifyScript(s, a_or_b, flags, MutableTransactionSignatureChecker(&txTo[1], 0, amount), &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_SIG_DER, ScriptErrorString(err)); @@ -130,12 +131,12 @@ BOOST_AUTO_TEST_CASE(multisig_verify) s = sign_multisig(escrow, keys, txTo[2], 0); if (i < j && i < 3 && j < 3) { - BOOST_CHECK_MESSAGE(VerifyScript(s, escrow, flags, MutableTransactionSignatureChecker(&txTo[2], 0), &err), strprintf("escrow 1: %d %d", i, j)); + BOOST_CHECK_MESSAGE(VerifyScript(s, escrow, flags, MutableTransactionSignatureChecker(&txTo[2], 0, amount), &err), strprintf("escrow 1: %d %d", i, j)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); } else { - BOOST_CHECK_MESSAGE(!VerifyScript(s, escrow, flags, MutableTransactionSignatureChecker(&txTo[2], 0), &err), strprintf("escrow 2: %d %d", i, j)); + BOOST_CHECK_MESSAGE(!VerifyScript(s, escrow, flags, MutableTransactionSignatureChecker(&txTo[2], 0, amount), &err), strprintf("escrow 2: %d %d", i, j)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); } } diff --git a/src/test/script_P2SH_tests.cpp b/src/test/script_P2SH_tests.cpp index c8cfe2872..a04d57b76 100644 --- a/src/test/script_P2SH_tests.cpp +++ b/src/test/script_P2SH_tests.cpp @@ -44,7 +44,7 @@ Verify(const CScript& scriptSig, const CScript& scriptPubKey, bool fStrict, Scri txTo.vin[0].scriptSig = scriptSig; txTo.vout[0].nValue = 1; - return VerifyScript(scriptSig, scriptPubKey, fStrict ? SCRIPT_VERIFY_P2SH : SCRIPT_VERIFY_NONE, MutableTransactionSignatureChecker(&txTo, 0), &err); + return VerifyScript(scriptSig, scriptPubKey, fStrict ? SCRIPT_VERIFY_P2SH : SCRIPT_VERIFY_NONE, MutableTransactionSignatureChecker(&txTo, 0, txFrom.vout[0].nValue), &err); } diff --git a/src/test/script_tests.cpp b/src/test/script_tests.cpp index 0f3ebe053..ce63c9b87 100644 --- a/src/test/script_tests.cpp +++ b/src/test/script_tests.cpp @@ -92,7 +92,8 @@ void DoTest(const CScript& scriptPubKey, const CScript& scriptSig, int flags, bo ScriptError err; CMutableTransaction tx = BuildSpendingTransaction(scriptSig, BuildCreditingTransaction(scriptPubKey)); CMutableTransaction tx2 = tx; - BOOST_CHECK_MESSAGE(VerifyScript(scriptSig, scriptPubKey, flags, MutableTransactionSignatureChecker(&tx, 0), &err) == expect, message); + static const CAmount amountZero = 0; + BOOST_CHECK_MESSAGE(VerifyScript(scriptSig, scriptPubKey, flags, MutableTransactionSignatureChecker(&tx, 0, amountZero), &err) == expect, message); BOOST_CHECK_MESSAGE(expect == (err == SCRIPT_ERR_OK), std::string(ScriptErrorString(err)) + ": " + message); #if defined(HAVE_CONSENSUS_LIB) CDataStream stream(SER_NETWORK, PROTOCOL_VERSION); @@ -705,18 +706,18 @@ BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG12) CMutableTransaction txTo12 = BuildSpendingTransaction(CScript(), txFrom12); CScript goodsig1 = sign_multisig(scriptPubKey12, key1, txTo12); - BOOST_CHECK(VerifyScript(goodsig1, scriptPubKey12, flags, MutableTransactionSignatureChecker(&txTo12, 0), &err)); + BOOST_CHECK(VerifyScript(goodsig1, scriptPubKey12, flags, MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); txTo12.vout[0].nValue = 2; - BOOST_CHECK(!VerifyScript(goodsig1, scriptPubKey12, flags, MutableTransactionSignatureChecker(&txTo12, 0), &err)); + BOOST_CHECK(!VerifyScript(goodsig1, scriptPubKey12, flags, MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); CScript goodsig2 = sign_multisig(scriptPubKey12, key2, txTo12); - BOOST_CHECK(VerifyScript(goodsig2, scriptPubKey12, flags, MutableTransactionSignatureChecker(&txTo12, 0), &err)); + BOOST_CHECK(VerifyScript(goodsig2, scriptPubKey12, flags, MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); CScript badsig1 = sign_multisig(scriptPubKey12, key3, txTo12); - BOOST_CHECK(!VerifyScript(badsig1, scriptPubKey12, flags, MutableTransactionSignatureChecker(&txTo12, 0), &err)); + BOOST_CHECK(!VerifyScript(badsig1, scriptPubKey12, flags, MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); } @@ -738,54 +739,54 @@ BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG23) std::vector keys; keys.push_back(key1); keys.push_back(key2); CScript goodsig1 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(VerifyScript(goodsig1, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0), &err)); + BOOST_CHECK(VerifyScript(goodsig1, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); keys.clear(); keys.push_back(key1); keys.push_back(key3); CScript goodsig2 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(VerifyScript(goodsig2, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0), &err)); + BOOST_CHECK(VerifyScript(goodsig2, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); keys.clear(); keys.push_back(key2); keys.push_back(key3); CScript goodsig3 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(VerifyScript(goodsig3, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0), &err)); + BOOST_CHECK(VerifyScript(goodsig3, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); keys.clear(); keys.push_back(key2); keys.push_back(key2); // Can't re-use sig CScript badsig1 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(!VerifyScript(badsig1, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0), &err)); + BOOST_CHECK(!VerifyScript(badsig1, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); keys.clear(); keys.push_back(key2); keys.push_back(key1); // sigs must be in correct order CScript badsig2 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(!VerifyScript(badsig2, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0), &err)); + BOOST_CHECK(!VerifyScript(badsig2, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); keys.clear(); keys.push_back(key3); keys.push_back(key2); // sigs must be in correct order CScript badsig3 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(!VerifyScript(badsig3, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0), &err)); + BOOST_CHECK(!VerifyScript(badsig3, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); keys.clear(); keys.push_back(key4); keys.push_back(key2); // sigs must match pubkeys CScript badsig4 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(!VerifyScript(badsig4, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0), &err)); + BOOST_CHECK(!VerifyScript(badsig4, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); keys.clear(); keys.push_back(key1); keys.push_back(key4); // sigs must match pubkeys CScript badsig5 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(!VerifyScript(badsig5, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0), &err)); + BOOST_CHECK(!VerifyScript(badsig5, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); keys.clear(); // Must have signatures CScript badsig6 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(!VerifyScript(badsig6, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0), &err)); + BOOST_CHECK(!VerifyScript(badsig6, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_INVALID_STACK_OPERATION, ScriptErrorString(err)); } diff --git a/src/test/transaction_tests.cpp b/src/test/transaction_tests.cpp index 6b207f643..be68a054d 100644 --- a/src/test/transaction_tests.cpp +++ b/src/test/transaction_tests.cpp @@ -155,9 +155,10 @@ BOOST_AUTO_TEST_CASE(tx_valid) break; } + CAmount amount = 0; unsigned int verify_flags = ParseScriptFlags(test[2].get_str()); BOOST_CHECK_MESSAGE(VerifyScript(tx.vin[i].scriptSig, mapprevOutScriptPubKeys[tx.vin[i].prevout], - verify_flags, TransactionSignatureChecker(&tx, i), &err), + verify_flags, TransactionSignatureChecker(&tx, i, amount), &err), strTest + comment); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err) + comment); } @@ -239,8 +240,9 @@ BOOST_AUTO_TEST_CASE(tx_invalid) } unsigned int verify_flags = ParseScriptFlags(test[2].get_str()); + CAmount amount = 0; fValid = VerifyScript(tx.vin[i].scriptSig, mapprevOutScriptPubKeys[tx.vin[i].prevout], - verify_flags, TransactionSignatureChecker(&tx, i), &err); + verify_flags, TransactionSignatureChecker(&tx, i, amount), &err); } BOOST_CHECK_MESSAGE(!fValid, strTest + comment); BOOST_CHECK_MESSAGE(err != SCRIPT_ERR_OK, ScriptErrorString(err) + comment); diff --git a/src/zcbenchmarks.cpp b/src/zcbenchmarks.cpp index bb51cdd6c..e91231967 100644 --- a/src/zcbenchmarks.cpp +++ b/src/zcbenchmarks.cpp @@ -277,7 +277,7 @@ double benchmark_large_tx() assert(VerifyScript(final_spending_tx.vin[i].scriptSig, prevPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, - TransactionSignatureChecker(&final_spending_tx, i), + TransactionSignatureChecker(&final_spending_tx, i, 1000000), &serror)); } return timer_stop(tv_start); From c86a1cb86ed2d850946ba17d8736cc511b317c71 Mon Sep 17 00:00:00 2001 From: Pieter Wuille Date: Fri, 15 Dec 2017 16:38:34 +0100 Subject: [PATCH 0488/1062] BIP143: Verification logic Includes simplifications by Eric Lombrozo. Edited for Zcash merge by Ariel Gabizon. --- src/bitcoin-tx.cpp | 2 +- src/gtest/test_checktransaction.cpp | 2 +- src/main.cpp | 4 +- src/rpcrawtransaction.cpp | 2 +- src/script/interpreter.cpp | 76 ++++++++++++++++--- src/script/interpreter.h | 19 +++-- src/script/sign.cpp | 17 ++--- src/script/sign.h | 5 +- src/test/multisig_tests.cpp | 2 +- src/test/script_tests.cpp | 57 +++++++------- src/test/sighash_tests.cpp | 6 +- src/test/transaction_tests.cpp | 2 +- src/utiltest.cpp | 6 +- src/wallet/asyncrpcoperation_sendmany.cpp | 2 +- .../asyncrpcoperation_shieldcoinbase.cpp | 2 +- src/wallet/rpcwallet.cpp | 2 +- 16 files changed, 137 insertions(+), 69 deletions(-) diff --git a/src/bitcoin-tx.cpp b/src/bitcoin-tx.cpp index 43fe5f976..e6c53e358 100644 --- a/src/bitcoin-tx.cpp +++ b/src/bitcoin-tx.cpp @@ -430,7 +430,7 @@ static void MutateTxSign(CMutableTransaction& tx, const string& flagStr) // ... and merge in other signatures: BOOST_FOREACH(const CTransaction& txv, txVariants) { - txin.scriptSig = CombineSignatures(prevPubKey, mergedTx, i, txin.scriptSig, txv.vin[i].scriptSig); + txin.scriptSig = CombineSignatures(prevPubKey, mergedTx, i, amount, txin.scriptSig, txv.vin[i].scriptSig); } if (!VerifyScript(txin.scriptSig, prevPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, MutableTransactionSignatureChecker(&mergedTx, i, amount))) fComplete = false; diff --git a/src/gtest/test_checktransaction.cpp b/src/gtest/test_checktransaction.cpp index 11e2d2024..ec7f45342 100644 --- a/src/gtest/test_checktransaction.cpp +++ b/src/gtest/test_checktransaction.cpp @@ -74,7 +74,7 @@ CMutableTransaction GetValidTransaction() { // Empty output script. CScript scriptCode; CTransaction signTx(mtx); - uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL); + uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL, 0, SIGVERSION_BASE); if (dataToBeSigned == one) { throw std::runtime_error("SignatureHash failed"); } diff --git a/src/main.cpp b/src/main.cpp index b5fc26496..b43bbd9ef 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -784,7 +784,7 @@ bool AreInputsStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs) // IsStandardTx() will have already returned false // and this method isn't called. vector > stack; - if (!EvalScript(stack, tx.vin[i].scriptSig, SCRIPT_VERIFY_NONE, BaseSignatureChecker())) + if (!EvalScript(stack, tx.vin[i].scriptSig, SCRIPT_VERIFY_NONE, BaseSignatureChecker(), SIGVERSION_BASE)) return false; if (whichType == TX_SCRIPTHASH) @@ -1088,7 +1088,7 @@ bool CheckTransactionWithoutProofVerification(const CTransaction& tx, CValidatio CScript scriptCode; uint256 dataToBeSigned; try { - dataToBeSigned = SignatureHash(scriptCode, tx, NOT_AN_INPUT, SIGHASH_ALL); + dataToBeSigned = SignatureHash(scriptCode, tx, NOT_AN_INPUT, SIGHASH_ALL, 0, SIGVERSION_BASE); } catch (std::logic_error ex) { return state.DoS(100, error("CheckTransaction(): error computing signature hash"), REJECT_INVALID, "error-computing-signature-hash"); diff --git a/src/rpcrawtransaction.cpp b/src/rpcrawtransaction.cpp index f8570dbfe..8a8442697 100644 --- a/src/rpcrawtransaction.cpp +++ b/src/rpcrawtransaction.cpp @@ -859,7 +859,7 @@ UniValue signrawtransaction(const UniValue& params, bool fHelp) // ... and merge in other signatures: BOOST_FOREACH(const CMutableTransaction& txv, txVariants) { - txin.scriptSig = CombineSignatures(prevPubKey, txConst, i, txin.scriptSig, txv.vin[i].scriptSig); + txin.scriptSig = CombineSignatures(prevPubKey, txConst, i, amount, txin.scriptSig, txv.vin[i].scriptSig); } ScriptError serror = SCRIPT_ERR_OK; if (!VerifyScript(txin.scriptSig, prevPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, TransactionSignatureChecker(&txConst, i, amount), &serror)) { diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index e61b4bb49..bf3313f5c 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -232,7 +232,7 @@ bool static CheckMinimalPush(const valtype& data, opcodetype opcode) { return true; } -bool EvalScript(vector >& stack, const CScript& script, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* serror) +bool EvalScript(vector >& stack, const CScript& script, unsigned int flags, const BaseSignatureChecker& checker, SigVersion sigversion, ScriptError* serror) { static const CScriptNum bnZero(0); static const CScriptNum bnOne(1); @@ -828,7 +828,7 @@ bool EvalScript(vector >& stack, const CScript& script, un //serror is set return false; } - bool fSuccess = checker.CheckSig(vchSig, vchPubKey, script); + bool fSuccess = checker.CheckSig(vchSig, vchPubKey, script, sigversion); popstack(stack); popstack(stack); @@ -886,7 +886,7 @@ bool EvalScript(vector >& stack, const CScript& script, un } // Check signature - bool fOk = checker.CheckSig(vchSig, vchPubKey, script); + bool fOk = checker.CheckSig(vchSig, vchPubKey, script, sigversion); if (fOk) { isig++; @@ -1052,13 +1052,71 @@ public: } // anon namespace -uint256 SignatureHash(const CScript& scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType) +uint256 SignatureHash(const CScript& scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType, const CAmount& amount, SigVersion sigversion) { if (nIn >= txTo.vin.size() && nIn != NOT_AN_INPUT) { // nIn out of range throw logic_error("input index is out of range"); } + if (sigversion == SIGVERSION_WITNESS_V0) { + uint256 hashPrevouts; + uint256 hashSequence; + uint256 hashOutputs; + + if (!(nHashType & SIGHASH_ANYONECANPAY)) { + CHashWriter ss(SER_GETHASH, 0); + for (unsigned int n = 0; n < txTo.vin.size(); n++) { + ss << txTo.vin[n].prevout; + } + hashPrevouts = ss.GetHash(); // TODO: cache this value for all signatures in a transaction + } + + if (!(nHashType & SIGHASH_ANYONECANPAY) && (nHashType & 0x1f) != SIGHASH_SINGLE && (nHashType & 0x1f) != SIGHASH_NONE) { + CHashWriter ss(SER_GETHASH, 0); + for (unsigned int n = 0; n < txTo.vin.size(); n++) { + ss << txTo.vin[n].nSequence; + } + hashSequence = ss.GetHash(); // TODO: cache this value for all signatures in a transaction + } + + if ((nHashType & 0x1f) != SIGHASH_SINGLE && (nHashType & 0x1f) != SIGHASH_NONE) { + CHashWriter ss(SER_GETHASH, 0); + for (unsigned int n = 0; n < txTo.vout.size(); n++) { + ss << txTo.vout[n]; + } + hashOutputs = ss.GetHash(); // TODO: cache this value for all signatures in a transaction + } else if ((nHashType & 0x1f) == SIGHASH_SINGLE && nIn < txTo.vout.size()) { + CHashWriter ss(SER_GETHASH, 0); + ss << txTo.vout[nIn]; + hashOutputs = ss.GetHash(); + } + + CHashWriter ss(SER_GETHASH, 0); + // Version + ss << txTo.nVersion; + // Input prevouts/nSequence (none/all, depending on flags) + ss << hashPrevouts; + ss << hashSequence; + // The input being signed (replacing the scriptSig with scriptCode + amount) + // The prevout may already be contained in hashPrevout, and the nSequence + // may already be contained in hashSequence. + if (nIn != NOT_AN_INPUT) + ss << txTo.vin[nIn].prevout; + ss << scriptCode; + ss << amount; + if (nIn != NOT_AN_INPUT) + ss << txTo.vin[nIn].nSequence; + // Outputs (none/one/all, depending on flags) + ss << hashOutputs; + // Locktime + ss << txTo.nLockTime; + // Sighash type + ss << nHashType; + + return ss.GetHash(); + } + // Check for invalid use of SIGHASH_SINGLE if ((nHashType & 0x1f) == SIGHASH_SINGLE) { if (nIn >= txTo.vout.size()) { @@ -1081,7 +1139,7 @@ bool TransactionSignatureChecker::VerifySignature(const std::vector& vchSigIn, const vector& vchPubKey, const CScript& scriptCode) const +bool TransactionSignatureChecker::CheckSig(const vector& vchSigIn, const vector& vchPubKey, const CScript& scriptCode, SigVersion sigversion) const { CPubKey pubkey(vchPubKey); if (!pubkey.IsValid()) @@ -1096,7 +1154,7 @@ bool TransactionSignatureChecker::CheckSig(const vector& vchSigIn uint256 sighash; try { - sighash = SignatureHash(scriptCode, *txTo, nIn, nHashType); + sighash = SignatureHash(scriptCode, *txTo, nIn, nHashType, amount, sigversion); } catch (logic_error ex) { return false; } @@ -1153,12 +1211,12 @@ bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigne } vector > stack, stackCopy; - if (!EvalScript(stack, scriptSig, flags, checker, serror)) + if (!EvalScript(stack, scriptSig, flags, checker, SIGVERSION_BASE, serror)) // serror is set return false; if (flags & SCRIPT_VERIFY_P2SH) stackCopy = stack; - if (!EvalScript(stack, scriptPubKey, flags, checker, serror)) + if (!EvalScript(stack, scriptPubKey, flags, checker, SIGVERSION_BASE, serror)) // serror is set return false; if (stack.empty()) @@ -1185,7 +1243,7 @@ bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigne CScript pubKey2(pubKeySerialized.begin(), pubKeySerialized.end()); popstack(stack); - if (!EvalScript(stack, pubKey2, flags, checker, serror)) + if (!EvalScript(stack, pubKey2, flags, checker, SIGVERSION_BASE, serror)) // serror is set return false; if (stack.empty()) diff --git a/src/script/interpreter.h b/src/script/interpreter.h index 1ae122065..103c94d1d 100644 --- a/src/script/interpreter.h +++ b/src/script/interpreter.h @@ -88,12 +88,18 @@ enum SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY = (1U << 9), }; -uint256 SignatureHash(const CScript &scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType); +enum SigVersion +{ + SIGVERSION_BASE = 0, + SIGVERSION_WITNESS_V0 = 1, +}; + +uint256 SignatureHash(const CScript &scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType, const CAmount& amount, SigVersion sigversion); class BaseSignatureChecker { public: - virtual bool CheckSig(const std::vector& scriptSig, const std::vector& vchPubKey, const CScript& scriptCode) const + virtual bool CheckSig(const std::vector& scriptSig, const std::vector& vchPubKey, const CScript& scriptCode, SigVersion sigversion) const { return false; } @@ -111,13 +117,14 @@ class TransactionSignatureChecker : public BaseSignatureChecker private: const CTransaction* txTo; unsigned int nIn; + const CAmount amount; protected: virtual bool VerifySignature(const std::vector& vchSig, const CPubKey& vchPubKey, const uint256& sighash) const; public: - TransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn, const CAmount& amount) : txTo(txToIn), nIn(nInIn) {} - bool CheckSig(const std::vector& scriptSig, const std::vector& vchPubKey, const CScript& scriptCode) const; + TransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn) : txTo(txToIn), nIn(nInIn), amount(amountIn) {} + bool CheckSig(const std::vector& scriptSig, const std::vector& vchPubKey, const CScript& scriptCode, SigVersion sigversion) const; bool CheckLockTime(const CScriptNum& nLockTime) const; }; @@ -130,7 +137,7 @@ public: MutableTransactionSignatureChecker(const CMutableTransaction* txToIn, unsigned int nInIn, const CAmount& amount) : TransactionSignatureChecker(&txTo, nInIn, amount), txTo(*txToIn) {} }; -bool EvalScript(std::vector >& stack, const CScript& script, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* error = NULL); -bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* error = NULL); +bool EvalScript(std::vector >& stack, const CScript& script, unsigned int flags, const BaseSignatureChecker& checker, SigVersion sigversion, ScriptError* error = NULL); +bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* serror = NULL); #endif // BITCOIN_SCRIPT_INTERPRETER_H diff --git a/src/script/sign.cpp b/src/script/sign.cpp index ff38218db..95778cf68 100644 --- a/src/script/sign.cpp +++ b/src/script/sign.cpp @@ -17,8 +17,7 @@ using namespace std; typedef vector valtype; -static const CAmount amountZero = 0; -TransactionSignatureCreator::TransactionSignatureCreator(const CKeyStore* keystoreIn, const CTransaction* txToIn, unsigned int nInIn, int nHashTypeIn) : BaseSignatureCreator(keystoreIn), txTo(txToIn), nIn(nInIn), nHashType(nHashTypeIn), checker(txTo, nIn, amountZero) {} +TransactionSignatureCreator::TransactionSignatureCreator(const CKeyStore* keystoreIn, const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn, int nHashTypeIn) : BaseSignatureCreator(keystoreIn), txTo(txToIn), nIn(nInIn), nHashType(nHashTypeIn), amount(amountIn), checker(txTo, nIn, amountIn) {} bool TransactionSignatureCreator::CreateSig(std::vector& vchSig, const CKeyID& address, const CScript& scriptCode) const { @@ -28,7 +27,7 @@ bool TransactionSignatureCreator::CreateSig(std::vector& vchSig, uint256 hash; try { - hash = SignatureHash(scriptCode, *txTo, nIn, nHashType); + hash = SignatureHash(scriptCode, *txTo, nIn, nHashType, amount, SIGVERSION_BASE); } catch (logic_error ex) { return false; } @@ -191,7 +190,7 @@ static CScript CombineMultisig(const CScript& scriptPubKey, const BaseSignatureC if (sigs.count(pubkey)) continue; // Already got a sig for this pubkey - if (checker.CheckSig(sig, pubkey, scriptPubKey)) + if (checker.CheckSig(sig, pubkey, scriptPubKey, SIGVERSION_BASE)) { sigs[pubkey] = sig; break; @@ -261,10 +260,10 @@ static CScript CombineSignatures(const CScript& scriptPubKey, const BaseSignatur return CScript(); } -CScript CombineSignatures(const CScript& scriptPubKey, const CTransaction& txTo, unsigned int nIn, +CScript CombineSignatures(const CScript& scriptPubKey, const CTransaction& txTo, unsigned int nIn, const CAmount& amount, const CScript& scriptSig1, const CScript& scriptSig2) { - TransactionSignatureChecker checker(&txTo, nIn, amountZero); + TransactionSignatureChecker checker(&txTo, nIn, amount); return CombineSignatures(scriptPubKey, checker, scriptSig1, scriptSig2); } @@ -276,9 +275,9 @@ CScript CombineSignatures(const CScript& scriptPubKey, const BaseSignatureChecke Solver(scriptPubKey, txType, vSolutions); vector stack1; - EvalScript(stack1, scriptSig1, SCRIPT_VERIFY_STRICTENC, BaseSignatureChecker()); + EvalScript(stack1, scriptSig1, SCRIPT_VERIFY_STRICTENC, BaseSignatureChecker(), SIGVERSION_BASE); vector stack2; - EvalScript(stack2, scriptSig2, SCRIPT_VERIFY_STRICTENC, BaseSignatureChecker()); + EvalScript(stack2, scriptSig2, SCRIPT_VERIFY_STRICTENC, BaseSignatureChecker(), SIGVERSION_BASE); return CombineSignatures(scriptPubKey, checker, txType, vSolutions, stack1, stack2); } @@ -290,7 +289,7 @@ class DummySignatureChecker : public BaseSignatureChecker public: DummySignatureChecker() {} - bool CheckSig(const std::vector& scriptSig, const std::vector& vchPubKey, const CScript& scriptCode) const + bool CheckSig(const std::vector& scriptSig, const std::vector& vchPubKey, const CScript& scriptCode, SigVersion sigversion) const { return true; } diff --git a/src/script/sign.h b/src/script/sign.h index 13f45007d..fa95c06de 100644 --- a/src/script/sign.h +++ b/src/script/sign.h @@ -35,10 +35,11 @@ class TransactionSignatureCreator : public BaseSignatureCreator { const CTransaction* txTo; unsigned int nIn; int nHashType; + CAmount amount; const TransactionSignatureChecker checker; public: - TransactionSignatureCreator(const CKeyStore* keystoreIn, const CTransaction* txToIn, unsigned int nInIn, int nHashTypeIn=SIGHASH_ALL); + TransactionSignatureCreator(const CKeyStore* keystoreIn, const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn, int nHashTypeIn=SIGHASH_ALL); const BaseSignatureChecker& Checker() const { return checker; } bool CreateSig(std::vector& vchSig, const CKeyID& keyid, const CScript& scriptCode) const; }; @@ -62,6 +63,6 @@ bool SignSignature(const CKeyStore& keystore, const CTransaction& txFrom, CMutab CScript CombineSignatures(const CScript& scriptPubKey, const BaseSignatureChecker& checker, const CScript& scriptSig1, const CScript& scriptSig2); /** Combine two script signatures on transactions. */ -CScript CombineSignatures(const CScript& scriptPubKey, const CTransaction& txTo, unsigned int nIn, const CScript& scriptSig1, const CScript& scriptSig2); +CScript CombineSignatures(const CScript& scriptPubKey, const CTransaction& txTo, unsigned int nIn, const CAmount& amount, const CScript& scriptSig1, const CScript& scriptSig2); #endif // BITCOIN_SCRIPT_SIGN_H diff --git a/src/test/multisig_tests.cpp b/src/test/multisig_tests.cpp index 3abd1558f..229da48dd 100644 --- a/src/test/multisig_tests.cpp +++ b/src/test/multisig_tests.cpp @@ -28,7 +28,7 @@ BOOST_FIXTURE_TEST_SUITE(multisig_tests, BasicTestingSetup) CScript sign_multisig(CScript scriptPubKey, vector keys, CTransaction transaction, int whichIn) { - uint256 hash = SignatureHash(scriptPubKey, transaction, whichIn, SIGHASH_ALL); + uint256 hash = SignatureHash(scriptPubKey, transaction, whichIn, SIGHASH_ALL, 0, SIGVERSION_BASE); CScript result; result << OP_0; // CHECKMULTISIG bug workaround diff --git a/src/test/script_tests.cpp b/src/test/script_tests.cpp index ce63c9b87..9a55e30f7 100644 --- a/src/test/script_tests.cpp +++ b/src/test/script_tests.cpp @@ -237,7 +237,7 @@ public: TestBuilder& PushSig(const CKey& key, int nHashType = SIGHASH_ALL, unsigned int lenR = 32, unsigned int lenS = 32) { - uint256 hash = SignatureHash(scriptPubKey, spendTx, 0, nHashType); + uint256 hash = SignatureHash(scriptPubKey, spendTx, 0, nHashType, 0, SIGVERSION_BASE); std::vector vchSig, r, s; uint32_t iter = 0; do { @@ -640,21 +640,21 @@ BOOST_AUTO_TEST_CASE(script_PushData) ScriptError err; vector > directStack; - BOOST_CHECK(EvalScript(directStack, CScript(&direct[0], &direct[sizeof(direct)]), SCRIPT_VERIFY_P2SH, BaseSignatureChecker(), &err)); + BOOST_CHECK(EvalScript(directStack, CScript(&direct[0], &direct[sizeof(direct)]), SCRIPT_VERIFY_P2SH, BaseSignatureChecker(), SIGVERSION_BASE, &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); vector > pushdata1Stack; - BOOST_CHECK(EvalScript(pushdata1Stack, CScript(&pushdata1[0], &pushdata1[sizeof(pushdata1)]), SCRIPT_VERIFY_P2SH, BaseSignatureChecker(), &err)); + BOOST_CHECK(EvalScript(pushdata1Stack, CScript(&pushdata1[0], &pushdata1[sizeof(pushdata1)]), SCRIPT_VERIFY_P2SH, BaseSignatureChecker(), SIGVERSION_BASE, &err)); BOOST_CHECK(pushdata1Stack == directStack); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); vector > pushdata2Stack; - BOOST_CHECK(EvalScript(pushdata2Stack, CScript(&pushdata2[0], &pushdata2[sizeof(pushdata2)]), SCRIPT_VERIFY_P2SH, BaseSignatureChecker(), &err)); + BOOST_CHECK(EvalScript(pushdata2Stack, CScript(&pushdata2[0], &pushdata2[sizeof(pushdata2)]), SCRIPT_VERIFY_P2SH, BaseSignatureChecker(), SIGVERSION_BASE, &err)); BOOST_CHECK(pushdata2Stack == directStack); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); vector > pushdata4Stack; - BOOST_CHECK(EvalScript(pushdata4Stack, CScript(&pushdata4[0], &pushdata4[sizeof(pushdata4)]), SCRIPT_VERIFY_P2SH, BaseSignatureChecker(), &err)); + BOOST_CHECK(EvalScript(pushdata4Stack, CScript(&pushdata4[0], &pushdata4[sizeof(pushdata4)]), SCRIPT_VERIFY_P2SH, BaseSignatureChecker(), SIGVERSION_BASE, &err)); BOOST_CHECK(pushdata4Stack == directStack); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); } @@ -662,7 +662,7 @@ BOOST_AUTO_TEST_CASE(script_PushData) CScript sign_multisig(CScript scriptPubKey, std::vector keys, CTransaction transaction) { - uint256 hash = SignatureHash(scriptPubKey, transaction, 0, SIGHASH_ALL); + uint256 hash = SignatureHash(scriptPubKey, transaction, 0, SIGHASH_ALL, 0, SIGVERSION_BASE); CScript result; // @@ -793,6 +793,7 @@ BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG23) BOOST_AUTO_TEST_CASE(script_combineSigs) { // Test the CombineSignatures function + CAmount amount; CBasicKeyStore keystore; vector keys; vector pubkeys; @@ -811,19 +812,19 @@ BOOST_AUTO_TEST_CASE(script_combineSigs) CScript& scriptSig = txTo.vin[0].scriptSig; CScript empty; - CScript combined = CombineSignatures(scriptPubKey, txTo, 0, empty, empty); + CScript combined = CombineSignatures(scriptPubKey, txTo, 0, amount, empty, empty); BOOST_CHECK(combined.empty()); // Single signature case: SignSignature(keystore, txFrom, txTo, 0); // changes scriptSig - combined = CombineSignatures(scriptPubKey, txTo, 0, scriptSig, empty); + combined = CombineSignatures(scriptPubKey, txTo, 0, amount, scriptSig, empty); BOOST_CHECK(combined == scriptSig); - combined = CombineSignatures(scriptPubKey, txTo, 0, empty, scriptSig); + combined = CombineSignatures(scriptPubKey, txTo, 0, amount, empty, scriptSig); BOOST_CHECK(combined == scriptSig); CScript scriptSigCopy = scriptSig; // Signing again will give a different, valid signature: SignSignature(keystore, txFrom, txTo, 0); - combined = CombineSignatures(scriptPubKey, txTo, 0, scriptSigCopy, scriptSig); + combined = CombineSignatures(scriptPubKey, txTo, 0, amount, scriptSigCopy, scriptSig); BOOST_CHECK(combined == scriptSigCopy || combined == scriptSig); // P2SH, single-signature case: @@ -831,41 +832,41 @@ BOOST_AUTO_TEST_CASE(script_combineSigs) keystore.AddCScript(pkSingle); scriptPubKey = GetScriptForDestination(CScriptID(pkSingle)); SignSignature(keystore, txFrom, txTo, 0); - combined = CombineSignatures(scriptPubKey, txTo, 0, scriptSig, empty); + combined = CombineSignatures(scriptPubKey, txTo, 0, amount, scriptSig, empty); BOOST_CHECK(combined == scriptSig); - combined = CombineSignatures(scriptPubKey, txTo, 0, empty, scriptSig); + combined = CombineSignatures(scriptPubKey, txTo, 0, amount, empty, scriptSig); BOOST_CHECK(combined == scriptSig); scriptSigCopy = scriptSig; SignSignature(keystore, txFrom, txTo, 0); - combined = CombineSignatures(scriptPubKey, txTo, 0, scriptSigCopy, scriptSig); + combined = CombineSignatures(scriptPubKey, txTo, 0, amount, scriptSigCopy, scriptSig); BOOST_CHECK(combined == scriptSigCopy || combined == scriptSig); // dummy scriptSigCopy with placeholder, should always choose non-placeholder: scriptSigCopy = CScript() << OP_0 << static_cast >(pkSingle); - combined = CombineSignatures(scriptPubKey, txTo, 0, scriptSigCopy, scriptSig); + combined = CombineSignatures(scriptPubKey, txTo, 0, amount, scriptSigCopy, scriptSig); BOOST_CHECK(combined == scriptSig); - combined = CombineSignatures(scriptPubKey, txTo, 0, scriptSig, scriptSigCopy); + combined = CombineSignatures(scriptPubKey, txTo, 0, amount, scriptSig, scriptSigCopy); BOOST_CHECK(combined == scriptSig); // Hardest case: Multisig 2-of-3 scriptPubKey = GetScriptForMultisig(2, pubkeys); keystore.AddCScript(scriptPubKey); SignSignature(keystore, txFrom, txTo, 0); - combined = CombineSignatures(scriptPubKey, txTo, 0, scriptSig, empty); + combined = CombineSignatures(scriptPubKey, txTo, 0, amount, scriptSig, empty); BOOST_CHECK(combined == scriptSig); - combined = CombineSignatures(scriptPubKey, txTo, 0, empty, scriptSig); + combined = CombineSignatures(scriptPubKey, txTo, 0, amount, empty, scriptSig); BOOST_CHECK(combined == scriptSig); // A couple of partially-signed versions: vector sig1; - uint256 hash1 = SignatureHash(scriptPubKey, txTo, 0, SIGHASH_ALL); + uint256 hash1 = SignatureHash(scriptPubKey, txTo, 0, SIGHASH_ALL, 0, SIGVERSION_BASE); BOOST_CHECK(keys[0].Sign(hash1, sig1)); sig1.push_back(SIGHASH_ALL); vector sig2; - uint256 hash2 = SignatureHash(scriptPubKey, txTo, 0, SIGHASH_NONE); + uint256 hash2 = SignatureHash(scriptPubKey, txTo, 0, SIGHASH_NONE, 0, SIGVERSION_BASE); BOOST_CHECK(keys[1].Sign(hash2, sig2)); sig2.push_back(SIGHASH_NONE); vector sig3; - uint256 hash3 = SignatureHash(scriptPubKey, txTo, 0, SIGHASH_SINGLE); + uint256 hash3 = SignatureHash(scriptPubKey, txTo, 0, SIGHASH_SINGLE, 0, SIGVERSION_BASE); BOOST_CHECK(keys[2].Sign(hash3, sig3)); sig3.push_back(SIGHASH_SINGLE); @@ -881,21 +882,21 @@ BOOST_AUTO_TEST_CASE(script_combineSigs) CScript complete13 = CScript() << OP_0 << sig1 << sig3; CScript complete23 = CScript() << OP_0 << sig2 << sig3; - combined = CombineSignatures(scriptPubKey, txTo, 0, partial1a, partial1b); + combined = CombineSignatures(scriptPubKey, txTo, 0, amount, partial1a, partial1b); BOOST_CHECK(combined == partial1a); - combined = CombineSignatures(scriptPubKey, txTo, 0, partial1a, partial2a); + combined = CombineSignatures(scriptPubKey, txTo, 0, amount, partial1a, partial2a); BOOST_CHECK(combined == complete12); - combined = CombineSignatures(scriptPubKey, txTo, 0, partial2a, partial1a); + combined = CombineSignatures(scriptPubKey, txTo, 0, amount, partial2a, partial1a); BOOST_CHECK(combined == complete12); - combined = CombineSignatures(scriptPubKey, txTo, 0, partial1b, partial2b); + combined = CombineSignatures(scriptPubKey, txTo, 0, amount, partial1b, partial2b); BOOST_CHECK(combined == complete12); - combined = CombineSignatures(scriptPubKey, txTo, 0, partial3b, partial1b); + combined = CombineSignatures(scriptPubKey, txTo, 0, amount, partial3b, partial1b); BOOST_CHECK(combined == complete13); - combined = CombineSignatures(scriptPubKey, txTo, 0, partial2a, partial3a); + combined = CombineSignatures(scriptPubKey, txTo, 0, amount, partial2a, partial3a); BOOST_CHECK(combined == complete23); - combined = CombineSignatures(scriptPubKey, txTo, 0, partial3b, partial2b); + combined = CombineSignatures(scriptPubKey, txTo, 0, amount, partial3b, partial2b); BOOST_CHECK(combined == complete23); - combined = CombineSignatures(scriptPubKey, txTo, 0, partial3b, partial3a); + combined = CombineSignatures(scriptPubKey, txTo, 0, amount, partial3b, partial3a); BOOST_CHECK(combined == partial3c); } diff --git a/src/test/sighash_tests.cpp b/src/test/sighash_tests.cpp index 3f2c9ecbf..6a3b2e855 100644 --- a/src/test/sighash_tests.cpp +++ b/src/test/sighash_tests.cpp @@ -160,7 +160,7 @@ void static RandomTransaction(CMutableTransaction &tx, bool fSingle) { // Empty output script. CScript scriptCode; CTransaction signTx(tx); - uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL); + uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL, 0, SIGVERSION_BASE); assert(crypto_sign_detached(&tx.joinSplitSig[0], NULL, dataToBeSigned.begin(), 32, @@ -194,7 +194,7 @@ BOOST_AUTO_TEST_CASE(sighash_test) uint256 sh, sho; sho = SignatureHashOld(scriptCode, txTo, nIn, nHashType); - sh = SignatureHash(scriptCode, txTo, nIn, nHashType); + sh = SignatureHash(scriptCode, txTo, nIn, nHashType, 0, SIGVERSION_BASE); #if defined(PRINT_SIGHASH_JSON) CDataStream ss(SER_NETWORK, PROTOCOL_VERSION); ss << txTo; @@ -278,7 +278,7 @@ BOOST_AUTO_TEST_CASE(sighash_from_data) continue; } - sh = SignatureHash(scriptCode, tx, nIn, nHashType); + sh = SignatureHash(scriptCode, tx, nIn, nHashType, 0, SIGVERSION_BASE); BOOST_CHECK_MESSAGE(sh.GetHex() == sigHashHex, strTest); } } diff --git a/src/test/transaction_tests.cpp b/src/test/transaction_tests.cpp index be68a054d..9adfd6e28 100644 --- a/src/test/transaction_tests.cpp +++ b/src/test/transaction_tests.cpp @@ -424,7 +424,7 @@ BOOST_AUTO_TEST_CASE(test_simple_joinsplit_invalidity) // Empty output script. CScript scriptCode; CTransaction signTx(newTx); - uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL); + uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL, 0, SIGVERSION_BASE); assert(crypto_sign_detached(&newTx.joinSplitSig[0], NULL, dataToBeSigned.begin(), 32, diff --git a/src/utiltest.cpp b/src/utiltest.cpp index e91a796e3..15a88e678 100644 --- a/src/utiltest.cpp +++ b/src/utiltest.cpp @@ -47,7 +47,9 @@ CWalletTx GetValidReceive(ZCJoinSplit& params, // Empty output script. CScript scriptCode; CTransaction signTx(mtx); - uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL); + //fifth parameter amount will not be used for joinsplit signing, value arbitrary, also arbitrary decision what to use for sigverion + //This is just to get this merge commit to compile later will remove sigversion parameter as choosing sigversion by block height + uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL,0, SIGVERSION_BASE); // Add the signature assert(crypto_sign_detached(&mtx.joinSplitSig[0], NULL, @@ -131,7 +133,7 @@ CWalletTx GetValidSpend(ZCJoinSplit& params, // Empty output script. CScript scriptCode; CTransaction signTx(mtx); - uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL); + uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL,0,SIGVERSION_BASE); // Add the signature assert(crypto_sign_detached(&mtx.joinSplitSig[0], NULL, diff --git a/src/wallet/asyncrpcoperation_sendmany.cpp b/src/wallet/asyncrpcoperation_sendmany.cpp index 7590e468c..a1200e30c 100644 --- a/src/wallet/asyncrpcoperation_sendmany.cpp +++ b/src/wallet/asyncrpcoperation_sendmany.cpp @@ -994,7 +994,7 @@ UniValue AsyncRPCOperation_sendmany::perform_joinsplit( // Empty output script. CScript scriptCode; CTransaction signTx(mtx); - uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL); + uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL, 0, SIGVERSION_BASE); // Add the signature if (!(crypto_sign_detached(&mtx.joinSplitSig[0], NULL, diff --git a/src/wallet/asyncrpcoperation_shieldcoinbase.cpp b/src/wallet/asyncrpcoperation_shieldcoinbase.cpp index e0d4a1861..61a02ffe9 100644 --- a/src/wallet/asyncrpcoperation_shieldcoinbase.cpp +++ b/src/wallet/asyncrpcoperation_shieldcoinbase.cpp @@ -369,7 +369,7 @@ UniValue AsyncRPCOperation_shieldcoinbase::perform_joinsplit(ShieldCoinbaseJSInf // Empty output script. CScript scriptCode; CTransaction signTx(mtx); - uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL); + uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL, 0, SIGVERSION_BASE); // Add the signature if (!(crypto_sign_detached(&mtx.joinSplitSig[0], NULL, diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 0d652cfcb..62fe40cde 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -2840,7 +2840,7 @@ UniValue zc_raw_joinsplit(const UniValue& params, bool fHelp) // Empty output script. CScript scriptCode; CTransaction signTx(mtx); - uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL); + uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL, 0, SIGVERSION_BASE); // Add the signature assert(crypto_sign_detached(&mtx.joinSplitSig[0], NULL, From 157a5d0d9cd2530109218bb34b2591d207f3d567 Mon Sep 17 00:00:00 2001 From: Pieter Wuille Date: Thu, 31 Mar 2016 14:54:58 +0200 Subject: [PATCH 0489/1062] BIP143: Signing logic --- src/bitcoin-tx.cpp | 28 ++- src/rpcrawtransaction.cpp | 17 +- src/script/sign.cpp | 303 ++++++++++++++++++++++----------- src/script/sign.h | 34 +++- src/script/standard.cpp | 41 +++++ src/script/standard.h | 3 + src/test/DoS_tests.cpp | 4 +- src/test/multisig_tests.cpp | 2 +- src/test/script_P2SH_tests.cpp | 11 +- src/test/script_tests.cpp | 96 +++++------ src/wallet/wallet.cpp | 10 +- src/wallet/wallet_ismine.cpp | 15 ++ src/zcbenchmarks.cpp | 2 +- 13 files changed, 391 insertions(+), 175 deletions(-) diff --git a/src/bitcoin-tx.cpp b/src/bitcoin-tx.cpp index e6c53e358..72efd2282 100644 --- a/src/bitcoin-tx.cpp +++ b/src/bitcoin-tx.cpp @@ -322,6 +322,18 @@ vector ParseHexUO(map& o, string strKey) return ParseHexUV(o[strKey], strKey); } +static CAmount AmountFromValue(const UniValue& value) +{ + if (!value.isNum() && !value.isStr()) + throw runtime_error("Amount is not a number or string"); + CAmount amount; + if (!ParseFixedPoint(value.getValStr(), 8, &amount)) + throw runtime_error("Invalid amount"); + if (!MoneyRange(amount)) + throw runtime_error("Amount out of range"); + return amount; +} + static void MutateTxSign(CMutableTransaction& tx, const string& flagStr) { int nHashType = SIGHASH_ALL; @@ -393,7 +405,10 @@ static void MutateTxSign(CMutableTransaction& tx, const string& flagStr) if ((unsigned int)nOut >= coins->vout.size()) coins->vout.resize(nOut+1); coins->vout[nOut].scriptPubKey = scriptPubKey; - coins->vout[nOut].nValue = 0; // we don't know the actual output value + coins->vout[nOut].nValue = 0; + if (prevOut.exists("amount")) { + coins->vout[nOut].nValue = AmountFromValue(prevOut["amount"]); + } } // if redeemScript given and private keys given, @@ -423,15 +438,16 @@ static void MutateTxSign(CMutableTransaction& tx, const string& flagStr) const CScript& prevPubKey = coins->vout[txin.prevout.n].scriptPubKey; const CAmount& amount = coins->vout[txin.prevout.n].nValue; - txin.scriptSig.clear(); + SignatureData sigdata; // Only sign SIGHASH_SINGLE if there's a corresponding output: if (!fHashSingle || (i < mergedTx.vout.size())) - SignSignature(keystore, prevPubKey, mergedTx, i, nHashType); + ProduceSignature(MutableTransactionSignatureCreator(&keystore, &mergedTx, i, amount, nHashType), prevPubKey, sigdata); // ... and merge in other signatures: - BOOST_FOREACH(const CTransaction& txv, txVariants) { - txin.scriptSig = CombineSignatures(prevPubKey, mergedTx, i, amount, txin.scriptSig, txv.vin[i].scriptSig); - } + BOOST_FOREACH(const CTransaction& txv, txVariants) + sigdata = CombineSignatures(prevPubKey, MutableTransactionSignatureChecker(&mergedTx, i, amount), sigdata, DataFromTransaction(txv, i)); + UpdateTransaction(mergedTx, i, sigdata); + if (!VerifyScript(txin.scriptSig, prevPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, MutableTransactionSignatureChecker(&mergedTx, i, amount))) fComplete = false; } diff --git a/src/rpcrawtransaction.cpp b/src/rpcrawtransaction.cpp index 8a8442697..42e162b08 100644 --- a/src/rpcrawtransaction.cpp +++ b/src/rpcrawtransaction.cpp @@ -654,7 +654,8 @@ UniValue signrawtransaction(const UniValue& params, bool fHelp) " \"txid\":\"id\", (string, required) The transaction id\n" " \"vout\":n, (numeric, required) The output number\n" " \"scriptPubKey\": \"hex\", (string, required) script key\n" - " \"redeemScript\": \"hex\" (string, required for P2SH) redeem script\n" + " \"redeemScript\": \"hex\", (string, required for P2SH) redeem script\n" + " \"amount\": value (numeric, required) The amount spent\n" " }\n" " ,...\n" " ]\n" @@ -792,7 +793,10 @@ UniValue signrawtransaction(const UniValue& params, bool fHelp) if ((unsigned int)nOut >= coins->vout.size()) coins->vout.resize(nOut+1); coins->vout[nOut].scriptPubKey = scriptPubKey; - coins->vout[nOut].nValue = 0; // we don't know the actual output value + coins->vout[nOut].nValue = 0; + if (prevOut.exists("amount")) { + coins->vout[nOut].nValue = AmountFromValue(find_value(prevOut, "amount")); + } } // if redeemScript given and not using the local wallet (private keys @@ -852,15 +856,18 @@ UniValue signrawtransaction(const UniValue& params, bool fHelp) const CScript& prevPubKey = coins->vout[txin.prevout.n].scriptPubKey; const CAmount& amount = coins->vout[txin.prevout.n].nValue; - txin.scriptSig.clear(); + SignatureData sigdata; // Only sign SIGHASH_SINGLE if there's a corresponding output: if (!fHashSingle || (i < mergedTx.vout.size())) - SignSignature(keystore, prevPubKey, mergedTx, i, nHashType); + ProduceSignature(MutableTransactionSignatureCreator(&keystore, &mergedTx, i, amount, nHashType), prevPubKey, sigdata); // ... and merge in other signatures: BOOST_FOREACH(const CMutableTransaction& txv, txVariants) { - txin.scriptSig = CombineSignatures(prevPubKey, txConst, i, amount, txin.scriptSig, txv.vin[i].scriptSig); + sigdata = CombineSignatures(prevPubKey, TransactionSignatureChecker(&txConst, i, amount), sigdata, DataFromTransaction(txv, i)); } + + UpdateTransaction(mergedTx, i, sigdata); + ScriptError serror = SCRIPT_ERR_OK; if (!VerifyScript(txin.scriptSig, prevPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, TransactionSignatureChecker(&txConst, i, amount), &serror)) { TxInErrorToJSON(txin, vErrors, ScriptErrorString(serror)); diff --git a/src/script/sign.cpp b/src/script/sign.cpp index 95778cf68..033813bdf 100644 --- a/src/script/sign.cpp +++ b/src/script/sign.cpp @@ -19,7 +19,7 @@ typedef vector valtype; TransactionSignatureCreator::TransactionSignatureCreator(const CKeyStore* keystoreIn, const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn, int nHashTypeIn) : BaseSignatureCreator(keystoreIn), txTo(txToIn), nIn(nInIn), nHashType(nHashTypeIn), amount(amountIn), checker(txTo, nIn, amountIn) {} -bool TransactionSignatureCreator::CreateSig(std::vector& vchSig, const CKeyID& address, const CScript& scriptCode) const +bool TransactionSignatureCreator::CreateSig(std::vector& vchSig, const CKeyID& address, const CScript& scriptCode, SigVersion sigversion) const { CKey key; if (!keystore->GetKey(address, key)) @@ -27,7 +27,7 @@ bool TransactionSignatureCreator::CreateSig(std::vector& vchSig, uint256 hash; try { - hash = SignatureHash(scriptCode, *txTo, nIn, nHashType, amount, SIGVERSION_BASE); + hash = SignatureHash(scriptCode, *txTo, nIn, nHashType, amount, sigversion); } catch (logic_error ex) { return false; } @@ -38,16 +38,16 @@ bool TransactionSignatureCreator::CreateSig(std::vector& vchSig, return true; } -static bool Sign1(const CKeyID& address, const BaseSignatureCreator& creator, const CScript& scriptCode, CScript& scriptSigRet) +static bool Sign1(const CKeyID& address, const BaseSignatureCreator& creator, const CScript& scriptCode, std::vector& ret, SigVersion sigversion) { vector vchSig; - if (!creator.CreateSig(vchSig, address, scriptCode)) + if (!creator.CreateSig(vchSig, address, scriptCode, sigversion)) return false; - scriptSigRet << vchSig; + ret.push_back(vchSig); return true; } -static bool SignN(const vector& multisigdata, const BaseSignatureCreator& creator, const CScript& scriptCode, CScript& scriptSigRet) +static bool SignN(const vector& multisigdata, const BaseSignatureCreator& creator, const CScript& scriptCode, std::vector& ret, SigVersion sigversion) { int nSigned = 0; int nRequired = multisigdata.front()[0]; @@ -55,7 +55,7 @@ static bool SignN(const vector& multisigdata, const BaseSignatureCreato { const valtype& pubkey = multisigdata[i]; CKeyID keyID = CPubKey(pubkey).GetID(); - if (Sign1(keyID, creator, scriptCode, scriptSigRet)) + if (Sign1(keyID, creator, scriptCode, ret, sigversion)) ++nSigned; } return nSigned==nRequired; @@ -68,9 +68,11 @@ static bool SignN(const vector& multisigdata, const BaseSignatureCreato * Returns false if scriptPubKey could not be completely satisfied. */ static bool SignStep(const BaseSignatureCreator& creator, const CScript& scriptPubKey, - CScript& scriptSigRet, txnouttype& whichTypeRet) + std::vector& ret, txnouttype& whichTypeRet, SigVersion sigversion) { - scriptSigRet.clear(); + CScript scriptRet; + uint160 h160; + ret.clear(); vector vSolutions; if (!Solver(scriptPubKey, whichTypeRet, vSolutions)) @@ -84,62 +86,142 @@ static bool SignStep(const BaseSignatureCreator& creator, const CScript& scriptP return false; case TX_PUBKEY: keyID = CPubKey(vSolutions[0]).GetID(); - return Sign1(keyID, creator, scriptPubKey, scriptSigRet); + return Sign1(keyID, creator, scriptPubKey, ret, sigversion); case TX_PUBKEYHASH: keyID = CKeyID(uint160(vSolutions[0])); - if (!Sign1(keyID, creator, scriptPubKey, scriptSigRet)) + if (!Sign1(keyID, creator, scriptPubKey, ret, sigversion)) return false; else { CPubKey vch; creator.KeyStore().GetPubKey(keyID, vch); - scriptSigRet << ToByteVector(vch); + ret.push_back(ToByteVector(vch)); } return true; case TX_SCRIPTHASH: - return creator.KeyStore().GetCScript(uint160(vSolutions[0]), scriptSigRet); - - case TX_MULTISIG: - scriptSigRet << OP_0; // workaround CHECKMULTISIG bug - return (SignN(vSolutions, creator, scriptPubKey, scriptSigRet)); - } - return false; -} - -bool ProduceSignature(const BaseSignatureCreator& creator, const CScript& fromPubKey, CScript& scriptSig) -{ - txnouttype whichType; - if (!SignStep(creator, fromPubKey, scriptSig, whichType)) + if (creator.KeyStore().GetCScript(uint160(vSolutions[0]), scriptRet)) { + ret.push_back(std::vector(scriptRet.begin(), scriptRet.end())); + return true; + } return false; - if (whichType == TX_SCRIPTHASH) - { - // Solver returns the subscript that need to be evaluated; - // the final scriptSig is the signatures from that - // and then the serialized subscript: - CScript subscript = scriptSig; + case TX_MULTISIG: + ret.push_back(valtype()); // workaround CHECKMULTISIG bug + return (SignN(vSolutions, creator, scriptPubKey, ret, sigversion)); - txnouttype subType; - bool fSolved = - SignStep(creator, subscript, scriptSig, subType) && subType != TX_SCRIPTHASH; - // Append serialized subscript whether or not it is completely signed: - scriptSig << static_cast(subscript); - if (!fSolved) return false; + case TX_WITNESS_V0_KEYHASH: + ret.push_back(vSolutions[0]); + return true; + + case TX_WITNESS_V0_SCRIPTHASH: + CRIPEMD160().Write(&vSolutions[0][0], vSolutions[0].size()).Finalize(h160.begin()); + if (creator.KeyStore().GetCScript(h160, scriptRet)) { + ret.push_back(std::vector(scriptRet.begin(), scriptRet.end())); + return true; + } + return false; + + default: + return false; } - - // Test solution - return VerifyScript(scriptSig, fromPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, creator.Checker()); } -bool SignSignature(const CKeyStore &keystore, const CScript& fromPubKey, CMutableTransaction& txTo, unsigned int nIn, int nHashType) +static CScript PushAll(const vector& values) +{ + CScript result; + BOOST_FOREACH(const valtype& v, values) { + if (v.size() == 0) { + result << OP_0; + } else if (v.size() == 1 && v[0] >= 1 && v[0] <= 16) { + result << CScript::EncodeOP_N(v[0]); + } else { + result << v; + } + } + return result; +} + +bool ProduceSignature(const BaseSignatureCreator& creator, const CScript& fromPubKey, SignatureData& sigdata) +{ + CScript script = fromPubKey; + bool solved = true; + std::vector result; + txnouttype whichType; + solved = SignStep(creator, script, result, whichType, SIGVERSION_BASE); + bool P2SH = false; + CScript subscript; + sigdata.scriptWitness.stack.clear(); + + if (solved && whichType == TX_SCRIPTHASH) + { + // Solver returns the subscript that needs to be evaluated; + // the final scriptSig is the signatures from that + // and then the serialized subscript: + script = subscript = CScript(result[0].begin(), result[0].end()); + solved = solved && SignStep(creator, script, result, whichType, SIGVERSION_BASE) && whichType != TX_SCRIPTHASH; + P2SH = true; + } + + if (solved && whichType == TX_WITNESS_V0_KEYHASH) + { + CScript witnessscript; + witnessscript << OP_DUP << OP_HASH160 << ToByteVector(result[0]) << OP_EQUALVERIFY << OP_CHECKSIG; + txnouttype subType; + solved = solved && SignStep(creator, witnessscript, result, subType, SIGVERSION_WITNESS_V0); + sigdata.scriptWitness.stack = result; + result.clear(); + } + else if (solved && whichType == TX_WITNESS_V0_SCRIPTHASH) + { + CScript witnessscript(result[0].begin(), result[0].end()); + txnouttype subType; + solved = solved && SignStep(creator, witnessscript, result, subType, SIGVERSION_WITNESS_V0) && subType != TX_SCRIPTHASH && subType != TX_WITNESS_V0_SCRIPTHASH && subType != TX_WITNESS_V0_KEYHASH; + result.push_back(std::vector(witnessscript.begin(), witnessscript.end())); + sigdata.scriptWitness.stack = result; + result.clear(); + } + + if (P2SH) { + result.push_back(std::vector(subscript.begin(), subscript.end())); + } + sigdata.scriptSig = PushAll(result); + + // Test solution + return solved && VerifyScript(sigdata.scriptSig, fromPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, creator.Checker()); +} + +SignatureData DataFromTransaction(const CMutableTransaction& tx, unsigned int nIn) +{ + SignatureData data; + assert(tx.vin.size() > nIn); + data.scriptSig = tx.vin[nIn].scriptSig; + if (tx.wit.vtxinwit.size() > nIn) { + data.scriptWitness = tx.wit.vtxinwit[nIn].scriptWitness; + } + return data; +} + +void UpdateTransaction(CMutableTransaction& tx, unsigned int nIn, const SignatureData& data) +{ + assert(tx.vin.size() > nIn); + tx.vin[nIn].scriptSig = data.scriptSig; + if (!data.scriptWitness.IsNull() || tx.wit.vtxinwit.size() > nIn) { + tx.wit.vtxinwit.resize(tx.vin.size()); + tx.wit.vtxinwit[nIn].scriptWitness = data.scriptWitness; + } +} + +bool SignSignature(const CKeyStore &keystore, const CScript& fromPubKey, CMutableTransaction& txTo, unsigned int nIn, const CAmount& amount, int nHashType) { assert(nIn < txTo.vin.size()); - CTxIn& txin = txTo.vin[nIn]; CTransaction txToConst(txTo); - TransactionSignatureCreator creator(&keystore, &txToConst, nIn, nHashType); + TransactionSignatureCreator creator(&keystore, &txToConst, nIn, amount, nHashType); - return ProduceSignature(creator, fromPubKey, txin.scriptSig); + SignatureData sigdata; + bool ret = ProduceSignature(creator, fromPubKey, sigdata); + UpdateTransaction(txTo, nIn, sigdata); + return ret; } bool SignSignature(const CKeyStore &keystore, const CTransaction& txFrom, CMutableTransaction& txTo, unsigned int nIn, int nHashType) @@ -149,20 +231,12 @@ bool SignSignature(const CKeyStore &keystore, const CTransaction& txFrom, CMutab assert(txin.prevout.n < txFrom.vout.size()); const CTxOut& txout = txFrom.vout[txin.prevout.n]; - return SignSignature(keystore, txout.scriptPubKey, txTo, nIn, nHashType); + return SignSignature(keystore, txout.scriptPubKey, txTo, nIn, txout.nValue, nHashType); } -static CScript PushAll(const vector& values) -{ - CScript result; - BOOST_FOREACH(const valtype& v, values) - result << v; - return result; -} - -static CScript CombineMultisig(const CScript& scriptPubKey, const BaseSignatureChecker& checker, +static vector CombineMultisig(const CScript& scriptPubKey, const BaseSignatureChecker& checker, const vector& vSolutions, - const vector& sigs1, const vector& sigs2) + const vector& sigs1, const vector& sigs2, SigVersion sigversion) { // Combine all the signatures we've got: set allsigs; @@ -190,7 +264,7 @@ static CScript CombineMultisig(const CScript& scriptPubKey, const BaseSignatureC if (sigs.count(pubkey)) continue; // Already got a sig for this pubkey - if (checker.CheckSig(sig, pubkey, scriptPubKey, SIGVERSION_BASE)) + if (checker.CheckSig(sig, pubkey, scriptPubKey, sigversion)) { sigs[pubkey] = sig; break; @@ -199,87 +273,126 @@ static CScript CombineMultisig(const CScript& scriptPubKey, const BaseSignatureC } // Now build a merged CScript: unsigned int nSigsHave = 0; - CScript result; result << OP_0; // pop-one-too-many workaround + std::vector result; result.push_back(valtype()); // pop-one-too-many workaround for (unsigned int i = 0; i < nPubKeys && nSigsHave < nSigsRequired; i++) { if (sigs.count(vSolutions[i+1])) { - result << sigs[vSolutions[i+1]]; + result.push_back(sigs[vSolutions[i+1]]); ++nSigsHave; } } // Fill any missing with OP_0: for (unsigned int i = nSigsHave; i < nSigsRequired; i++) - result << OP_0; + result.push_back(valtype()); return result; } -static CScript CombineSignatures(const CScript& scriptPubKey, const BaseSignatureChecker& checker, +namespace +{ +struct Stacks +{ + std::vector script; + std::vector witness; + + Stacks() {} + explicit Stacks(const std::vector& scriptSigStack_) : script(scriptSigStack_), witness() {} + explicit Stacks(const SignatureData& data) : witness(data.scriptWitness.stack) { + EvalScript(script, data.scriptSig, SCRIPT_VERIFY_STRICTENC, BaseSignatureChecker(), SIGVERSION_BASE); + } + + SignatureData Output() const { + SignatureData result; + result.scriptSig = PushAll(script); + result.scriptWitness.stack = witness; + return result; + } +}; +} + +static Stacks CombineSignatures(const CScript& scriptPubKey, const BaseSignatureChecker& checker, const txnouttype txType, const vector& vSolutions, - vector& sigs1, vector& sigs2) + Stacks sigs1, Stacks sigs2, SigVersion sigversion) { switch (txType) { case TX_NONSTANDARD: case TX_NULL_DATA: // Don't know anything about this, assume bigger one is correct: - if (sigs1.size() >= sigs2.size()) - return PushAll(sigs1); - return PushAll(sigs2); + if (sigs1.script.size() >= sigs2.script.size()) + return sigs1; + return sigs2; case TX_PUBKEY: case TX_PUBKEYHASH: // Signatures are bigger than placeholders or empty scripts: - if (sigs1.empty() || sigs1[0].empty()) - return PushAll(sigs2); - return PushAll(sigs1); + if (sigs1.script.empty() || sigs1.script[0].empty()) + return sigs2; + return sigs1; + case TX_WITNESS_V0_KEYHASH: + // Signatures are bigger than placeholders or empty scripts: + if (sigs1.witness.empty() || sigs1.witness[0].empty()) + return sigs2; + return sigs1; case TX_SCRIPTHASH: - if (sigs1.empty() || sigs1.back().empty()) - return PushAll(sigs2); - else if (sigs2.empty() || sigs2.back().empty()) - return PushAll(sigs1); + if (sigs1.script.empty() || sigs1.script.back().empty()) + return sigs2; + else if (sigs2.script.empty() || sigs2.script.back().empty()) + return sigs1; else { // Recur to combine: - valtype spk = sigs1.back(); + valtype spk = sigs1.script.back(); CScript pubKey2(spk.begin(), spk.end()); txnouttype txType2; vector > vSolutions2; Solver(pubKey2, txType2, vSolutions2); - sigs1.pop_back(); - sigs2.pop_back(); - CScript result = CombineSignatures(pubKey2, checker, txType2, vSolutions2, sigs1, sigs2); - result << spk; + sigs1.script.pop_back(); + sigs2.script.pop_back(); + Stacks result = CombineSignatures(pubKey2, checker, txType2, vSolutions2, sigs1, sigs2, sigversion); + result.script.push_back(spk); return result; } case TX_MULTISIG: - return CombineMultisig(scriptPubKey, checker, vSolutions, sigs1, sigs2); + return Stacks(CombineMultisig(scriptPubKey, checker, vSolutions, sigs1.script, sigs2.script, sigversion)); + case TX_WITNESS_V0_SCRIPTHASH: + if (sigs1.witness.empty() || sigs1.witness.back().empty()) + return sigs2; + else if (sigs2.witness.empty() || sigs2.witness.back().empty()) + return sigs1; + else + { + // Recur to combine: + CScript pubKey2(sigs1.witness.back().begin(), sigs1.witness.back().end()); + txnouttype txType2; + vector vSolutions2; + Solver(pubKey2, txType2, vSolutions2); + sigs1.witness.pop_back(); + sigs1.script = sigs1.witness; + sigs1.witness.clear(); + sigs2.witness.pop_back(); + sigs2.script = sigs2.witness; + sigs2.witness.clear(); + Stacks result = CombineSignatures(pubKey2, checker, txType2, vSolutions2, sigs1, sigs2, SIGVERSION_WITNESS_V0); + result.witness = result.script; + result.script.clear(); + result.witness.push_back(valtype(pubKey2.begin(), pubKey2.end())); + return result; + } + default: + return Stacks(); } - - return CScript(); } -CScript CombineSignatures(const CScript& scriptPubKey, const CTransaction& txTo, unsigned int nIn, const CAmount& amount, - const CScript& scriptSig1, const CScript& scriptSig2) -{ - TransactionSignatureChecker checker(&txTo, nIn, amount); - return CombineSignatures(scriptPubKey, checker, scriptSig1, scriptSig2); -} - -CScript CombineSignatures(const CScript& scriptPubKey, const BaseSignatureChecker& checker, - const CScript& scriptSig1, const CScript& scriptSig2) +SignatureData CombineSignatures(const CScript& scriptPubKey, const BaseSignatureChecker& checker, + const SignatureData& scriptSig1, const SignatureData& scriptSig2) { txnouttype txType; vector > vSolutions; Solver(scriptPubKey, txType, vSolutions); - vector stack1; - EvalScript(stack1, scriptSig1, SCRIPT_VERIFY_STRICTENC, BaseSignatureChecker(), SIGVERSION_BASE); - vector stack2; - EvalScript(stack2, scriptSig2, SCRIPT_VERIFY_STRICTENC, BaseSignatureChecker(), SIGVERSION_BASE); - - return CombineSignatures(scriptPubKey, checker, txType, vSolutions, stack1, stack2); + return CombineSignatures(scriptPubKey, checker, txType, vSolutions, Stacks(scriptSig1), Stacks(scriptSig2), SIGVERSION_BASE).Output(); } namespace { @@ -302,7 +415,7 @@ const BaseSignatureChecker& DummySignatureCreator::Checker() const return dummyChecker; } -bool DummySignatureCreator::CreateSig(std::vector& vchSig, const CKeyID& keyid, const CScript& scriptCode) const +bool DummySignatureCreator::CreateSig(std::vector& vchSig, const CKeyID& keyid, const CScript& scriptCode, SigVersion sigversion) const { // Create a dummy signature that is a valid DER-encoding vchSig.assign(72, '\000'); diff --git a/src/script/sign.h b/src/script/sign.h index fa95c06de..8aaae1663 100644 --- a/src/script/sign.h +++ b/src/script/sign.h @@ -27,7 +27,7 @@ public: virtual const BaseSignatureChecker& Checker() const =0; /** Create a singular (non-script) signature. */ - virtual bool CreateSig(std::vector& vchSig, const CKeyID& keyid, const CScript& scriptCode) const =0; + virtual bool CreateSig(std::vector& vchSig, const CKeyID& keyid, const CScript& scriptCode, SigVersion sigversion) const =0; }; /** A signature creator for transactions. */ @@ -41,7 +41,14 @@ class TransactionSignatureCreator : public BaseSignatureCreator { public: TransactionSignatureCreator(const CKeyStore* keystoreIn, const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn, int nHashTypeIn=SIGHASH_ALL); const BaseSignatureChecker& Checker() const { return checker; } - bool CreateSig(std::vector& vchSig, const CKeyID& keyid, const CScript& scriptCode) const; + bool CreateSig(std::vector& vchSig, const CKeyID& keyid, const CScript& scriptCode, SigVersion sigversion) const; +}; + +class MutableTransactionSignatureCreator : public TransactionSignatureCreator { + CTransaction tx; + +public: + MutableTransactionSignatureCreator(const CKeyStore* keystoreIn, const CMutableTransaction* txToIn, unsigned int nInIn, const CAmount& amount, int nHashTypeIn) : TransactionSignatureCreator(keystoreIn, &tx, nInIn, amount, nHashTypeIn), tx(*txToIn) {} }; /** A signature creator that just produces 72-byte empty signatyres. */ @@ -49,20 +56,29 @@ class DummySignatureCreator : public BaseSignatureCreator { public: DummySignatureCreator(const CKeyStore* keystoreIn) : BaseSignatureCreator(keystoreIn) {} const BaseSignatureChecker& Checker() const; - bool CreateSig(std::vector& vchSig, const CKeyID& keyid, const CScript& scriptCode) const; + bool CreateSig(std::vector& vchSig, const CKeyID& keyid, const CScript& scriptCode, SigVersion sigversion) const; +}; + +struct SignatureData { + CScript scriptSig; + CScriptWitness scriptWitness; + + SignatureData() {} + explicit SignatureData(const CScript& script) : scriptSig(script) {} }; /** Produce a script signature using a generic signature creator. */ -bool ProduceSignature(const BaseSignatureCreator& creator, const CScript& scriptPubKey, CScript& scriptSig); +bool ProduceSignature(const BaseSignatureCreator& creator, const CScript& scriptPubKey, SignatureData& sigdata); /** Produce a script signature for a transaction. */ -bool SignSignature(const CKeyStore& keystore, const CScript& fromPubKey, CMutableTransaction& txTo, unsigned int nIn, int nHashType=SIGHASH_ALL); -bool SignSignature(const CKeyStore& keystore, const CTransaction& txFrom, CMutableTransaction& txTo, unsigned int nIn, int nHashType=SIGHASH_ALL); +bool SignSignature(const CKeyStore &keystore, const CScript& fromPubKey, CMutableTransaction& txTo, unsigned int nIn, const CAmount& amount, int nHashType); +bool SignSignature(const CKeyStore& keystore, const CTransaction& txFrom, CMutableTransaction& txTo, unsigned int nIn, int nHashType); /** Combine two script signatures using a generic signature checker, intelligently, possibly with OP_0 placeholders. */ -CScript CombineSignatures(const CScript& scriptPubKey, const BaseSignatureChecker& checker, const CScript& scriptSig1, const CScript& scriptSig2); +SignatureData CombineSignatures(const CScript& scriptPubKey, const BaseSignatureChecker& checker, const SignatureData& scriptSig1, const SignatureData& scriptSig2); -/** Combine two script signatures on transactions. */ -CScript CombineSignatures(const CScript& scriptPubKey, const CTransaction& txTo, unsigned int nIn, const CAmount& amount, const CScript& scriptSig1, const CScript& scriptSig2); +/** Extract signature data from a transaction, and insert it. */ +SignatureData DataFromTransaction(const CMutableTransaction& tx, unsigned int nIn); +void UpdateTransaction(CMutableTransaction& tx, unsigned int nIn, const SignatureData& data); #endif // BITCOIN_SCRIPT_SIGN_H diff --git a/src/script/standard.cpp b/src/script/standard.cpp index ce50e3aad..2747b300a 100644 --- a/src/script/standard.cpp +++ b/src/script/standard.cpp @@ -30,6 +30,8 @@ const char* GetTxnOutputType(txnouttype t) case TX_SCRIPTHASH: return "scripthash"; case TX_MULTISIG: return "multisig"; case TX_NULL_DATA: return "nulldata"; + case TX_WITNESS_V0_KEYHASH: return "witness_v0_keyhash"; + case TX_WITNESS_V0_SCRIPTHASH: return "witness_v0_scripthash"; } return NULL; } @@ -68,6 +70,22 @@ bool Solver(const CScript& scriptPubKey, txnouttype& typeRet, vector witnessprogram; + if (scriptPubKey.IsWitnessProgram(witnessversion, witnessprogram)) { + if (witnessversion == 0 && witnessprogram.size() == 20) { + typeRet = TX_WITNESS_V0_KEYHASH; + vSolutionsRet.push_back(witnessprogram); + return true; + } + if (witnessversion == 0 && witnessprogram.size() == 32) { + typeRet = TX_WITNESS_V0_SCRIPTHASH; + vSolutionsRet.push_back(witnessprogram); + return true; + } + return false; + } + // Scan templates const CScript& script1 = scriptPubKey; BOOST_FOREACH(const PAIRTYPE(txnouttype, CScript)& tplate, mTemplates) @@ -316,3 +334,26 @@ CScript GetScriptForMultisig(int nRequired, const std::vector& keys) script << CScript::EncodeOP_N(keys.size()) << OP_CHECKMULTISIG; return script; } + +CScript GetScriptForWitness(const CScript& redeemscript) +{ + CScript ret; + + txnouttype typ; + std::vector > vSolutions; + if (Solver(redeemscript, typ, vSolutions)) { + if (typ == TX_PUBKEY) { + unsigned char h160[20]; + CHash160().Write(&vSolutions[0][0], vSolutions[0].size()).Finalize(h160); + ret << OP_0 << std::vector(&h160[0], &h160[20]); + return ret; + } else if (typ == TX_PUBKEYHASH) { + ret << OP_0 << vSolutions[0]; + return ret; + } + } + uint256 hash; + CSHA256().Write(&redeemscript[0], redeemscript.size()).Finalize(hash.begin()); + ret << OP_0 << ToByteVector(hash); + return ret; +} diff --git a/src/script/standard.h b/src/script/standard.h index da778878b..30ddcec15 100644 --- a/src/script/standard.h +++ b/src/script/standard.h @@ -65,6 +65,8 @@ enum txnouttype TX_SCRIPTHASH, TX_MULTISIG, TX_NULL_DATA, + TX_WITNESS_V0_SCRIPTHASH, + TX_WITNESS_V0_KEYHASH, }; class CNoDestination { @@ -92,5 +94,6 @@ bool ExtractDestinations(const CScript& scriptPubKey, txnouttype& typeRet, std:: CScript GetScriptForDestination(const CTxDestination& dest); CScript GetScriptForMultisig(int nRequired, const std::vector& keys); +CScript GetScriptForWitness(const CScript& redeemscript); #endif // BITCOIN_SCRIPT_STANDARD_H diff --git a/src/test/DoS_tests.cpp b/src/test/DoS_tests.cpp index bf2554875..271a37260 100644 --- a/src/test/DoS_tests.cpp +++ b/src/test/DoS_tests.cpp @@ -151,7 +151,7 @@ BOOST_AUTO_TEST_CASE(DoS_mapOrphans) tx.vout.resize(1); tx.vout[0].nValue = 1*CENT; tx.vout[0].scriptPubKey = GetScriptForDestination(key.GetPubKey().GetID()); - SignSignature(keystore, txPrev, tx, 0); + SignSignature(keystore, txPrev, tx, 0, SIGHASH_ALL); AddOrphanTx(tx, i); } @@ -171,7 +171,7 @@ BOOST_AUTO_TEST_CASE(DoS_mapOrphans) tx.vin[j].prevout.n = j; tx.vin[j].prevout.hash = txPrev.GetHash(); } - SignSignature(keystore, txPrev, tx, 0); + SignSignature(keystore, txPrev, tx, 0, SIGHASH_ALL); // Re-use same signature for other inputs // (they don't have to be valid for this test) for (unsigned int j = 1; j < tx.vin.size(); j++) diff --git a/src/test/multisig_tests.cpp b/src/test/multisig_tests.cpp index 229da48dd..db19b4ce0 100644 --- a/src/test/multisig_tests.cpp +++ b/src/test/multisig_tests.cpp @@ -313,7 +313,7 @@ BOOST_AUTO_TEST_CASE(multisig_Sign) for (int i = 0; i < 3; i++) { - BOOST_CHECK_MESSAGE(SignSignature(keystore, txFrom, txTo[i], 0), strprintf("SignSignature %d", i)); + BOOST_CHECK_MESSAGE(SignSignature(keystore, txFrom, txTo[i], 0, SIGHASH_ALL), strprintf("SignSignature %d", i)); } } diff --git a/src/test/script_P2SH_tests.cpp b/src/test/script_P2SH_tests.cpp index a04d57b76..3b99fc740 100644 --- a/src/test/script_P2SH_tests.cpp +++ b/src/test/script_P2SH_tests.cpp @@ -2,6 +2,7 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. +#include "core_io.h" #include "key.h" #include "keystore.h" #include "main.h" @@ -106,7 +107,7 @@ BOOST_AUTO_TEST_CASE(sign) } for (int i = 0; i < 8; i++) { - BOOST_CHECK_MESSAGE(SignSignature(keystore, txFrom, txTo[i], 0), strprintf("SignSignature %d", i)); + BOOST_CHECK_MESSAGE(SignSignature(keystore, txFrom, txTo[i], 0, SIGHASH_ALL), strprintf("SignSignature %d", i)); } // All of the above should be OK, and the txTos have valid signatures // Check to make sure signature verification fails if we use the wrong ScriptSig: @@ -203,7 +204,7 @@ BOOST_AUTO_TEST_CASE(set) } for (int i = 0; i < 4; i++) { - BOOST_CHECK_MESSAGE(SignSignature(keystore, txFrom, txTo[i], 0), strprintf("SignSignature %d", i)); + BOOST_CHECK_MESSAGE(SignSignature(keystore, txFrom, txTo[i], 0, SIGHASH_ALL), strprintf("SignSignature %d", i)); BOOST_CHECK_MESSAGE(IsStandardTx(txTo[i], reason), strprintf("txTo[%d].IsStandard", i)); } } @@ -332,9 +333,9 @@ BOOST_AUTO_TEST_CASE(AreInputsStandard) txTo.vin[i].prevout.n = i; txTo.vin[i].prevout.hash = txFrom.GetHash(); } - BOOST_CHECK(SignSignature(keystore, txFrom, txTo, 0)); - BOOST_CHECK(SignSignature(keystore, txFrom, txTo, 1)); - BOOST_CHECK(SignSignature(keystore, txFrom, txTo, 2)); + BOOST_CHECK(SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL)); + BOOST_CHECK(SignSignature(keystore, txFrom, txTo, 1, SIGHASH_ALL)); + BOOST_CHECK(SignSignature(keystore, txFrom, txTo, 2, SIGHASH_ALL)); // SignSignature doesn't know how to sign these. We're // not testing validating signatures, so just create // dummy signatures that DO include the correct P2SH scripts: diff --git a/src/test/script_tests.cpp b/src/test/script_tests.cpp index 9a55e30f7..d089816c8 100644 --- a/src/test/script_tests.cpp +++ b/src/test/script_tests.cpp @@ -90,10 +90,10 @@ CMutableTransaction BuildSpendingTransaction(const CScript& scriptSig, const CMu void DoTest(const CScript& scriptPubKey, const CScript& scriptSig, int flags, bool expect, const std::string& message) { ScriptError err; - CMutableTransaction tx = BuildSpendingTransaction(scriptSig, BuildCreditingTransaction(scriptPubKey)); + CMutableTransaction txCredit = BuildCreditingTransaction(scriptPubKey); + CMutableTransaction tx = BuildSpendingTransaction(scriptSig, txCredit); CMutableTransaction tx2 = tx; - static const CAmount amountZero = 0; - BOOST_CHECK_MESSAGE(VerifyScript(scriptSig, scriptPubKey, flags, MutableTransactionSignatureChecker(&tx, 0, amountZero), &err) == expect, message); + BOOST_CHECK_MESSAGE(VerifyScript(scriptSig, scriptPubKey, flags, MutableTransactionSignatureChecker(&tx, 0, txCredit.vout[0].nValue), &err) == expect, message); BOOST_CHECK_MESSAGE(expect == (err == SCRIPT_ERR_OK), std::string(ScriptErrorString(err)) + ": " + message); #if defined(HAVE_CONSENSUS_LIB) CDataStream stream(SER_NETWORK, PROTOCOL_VERSION); @@ -793,7 +793,7 @@ BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG23) BOOST_AUTO_TEST_CASE(script_combineSigs) { // Test the CombineSignatures function - CAmount amount; + CAmount amount = 0; CBasicKeyStore keystore; vector keys; vector pubkeys; @@ -811,50 +811,50 @@ BOOST_AUTO_TEST_CASE(script_combineSigs) CScript& scriptPubKey = txFrom.vout[0].scriptPubKey; CScript& scriptSig = txTo.vin[0].scriptSig; - CScript empty; - CScript combined = CombineSignatures(scriptPubKey, txTo, 0, amount, empty, empty); - BOOST_CHECK(combined.empty()); + SignatureData empty; + SignatureData combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), empty, empty); + BOOST_CHECK(combined.scriptSig.empty()); // Single signature case: - SignSignature(keystore, txFrom, txTo, 0); // changes scriptSig - combined = CombineSignatures(scriptPubKey, txTo, 0, amount, scriptSig, empty); - BOOST_CHECK(combined == scriptSig); - combined = CombineSignatures(scriptPubKey, txTo, 0, amount, empty, scriptSig); - BOOST_CHECK(combined == scriptSig); + SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL); // changes scriptSig + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSig), empty); + BOOST_CHECK(combined.scriptSig == scriptSig); + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), empty, SignatureData(scriptSig)); + BOOST_CHECK(combined.scriptSig == scriptSig); CScript scriptSigCopy = scriptSig; // Signing again will give a different, valid signature: - SignSignature(keystore, txFrom, txTo, 0); - combined = CombineSignatures(scriptPubKey, txTo, 0, amount, scriptSigCopy, scriptSig); - BOOST_CHECK(combined == scriptSigCopy || combined == scriptSig); + SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL); + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSigCopy), SignatureData(scriptSig)); + BOOST_CHECK(combined.scriptSig == scriptSigCopy || combined.scriptSig == scriptSig); // P2SH, single-signature case: CScript pkSingle; pkSingle << ToByteVector(keys[0].GetPubKey()) << OP_CHECKSIG; keystore.AddCScript(pkSingle); scriptPubKey = GetScriptForDestination(CScriptID(pkSingle)); - SignSignature(keystore, txFrom, txTo, 0); - combined = CombineSignatures(scriptPubKey, txTo, 0, amount, scriptSig, empty); - BOOST_CHECK(combined == scriptSig); - combined = CombineSignatures(scriptPubKey, txTo, 0, amount, empty, scriptSig); - BOOST_CHECK(combined == scriptSig); + SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL); + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSig), empty); + BOOST_CHECK(combined.scriptSig == scriptSig); + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), empty, SignatureData(scriptSig)); + BOOST_CHECK(combined.scriptSig == scriptSig); scriptSigCopy = scriptSig; - SignSignature(keystore, txFrom, txTo, 0); - combined = CombineSignatures(scriptPubKey, txTo, 0, amount, scriptSigCopy, scriptSig); - BOOST_CHECK(combined == scriptSigCopy || combined == scriptSig); + SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL); + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSigCopy), SignatureData(scriptSig)); + BOOST_CHECK(combined.scriptSig == scriptSigCopy || combined.scriptSig == scriptSig); // dummy scriptSigCopy with placeholder, should always choose non-placeholder: scriptSigCopy = CScript() << OP_0 << static_cast >(pkSingle); - combined = CombineSignatures(scriptPubKey, txTo, 0, amount, scriptSigCopy, scriptSig); - BOOST_CHECK(combined == scriptSig); - combined = CombineSignatures(scriptPubKey, txTo, 0, amount, scriptSig, scriptSigCopy); - BOOST_CHECK(combined == scriptSig); + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSigCopy), SignatureData(scriptSig)); + BOOST_CHECK(combined.scriptSig == scriptSig); + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSig), SignatureData(scriptSigCopy)); + BOOST_CHECK(combined.scriptSig == scriptSig); // Hardest case: Multisig 2-of-3 scriptPubKey = GetScriptForMultisig(2, pubkeys); keystore.AddCScript(scriptPubKey); - SignSignature(keystore, txFrom, txTo, 0); - combined = CombineSignatures(scriptPubKey, txTo, 0, amount, scriptSig, empty); - BOOST_CHECK(combined == scriptSig); - combined = CombineSignatures(scriptPubKey, txTo, 0, amount, empty, scriptSig); - BOOST_CHECK(combined == scriptSig); + SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL); + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSig), empty); + BOOST_CHECK(combined.scriptSig == scriptSig); + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), empty, SignatureData(scriptSig)); + BOOST_CHECK(combined.scriptSig == scriptSig); // A couple of partially-signed versions: vector sig1; @@ -882,22 +882,22 @@ BOOST_AUTO_TEST_CASE(script_combineSigs) CScript complete13 = CScript() << OP_0 << sig1 << sig3; CScript complete23 = CScript() << OP_0 << sig2 << sig3; - combined = CombineSignatures(scriptPubKey, txTo, 0, amount, partial1a, partial1b); - BOOST_CHECK(combined == partial1a); - combined = CombineSignatures(scriptPubKey, txTo, 0, amount, partial1a, partial2a); - BOOST_CHECK(combined == complete12); - combined = CombineSignatures(scriptPubKey, txTo, 0, amount, partial2a, partial1a); - BOOST_CHECK(combined == complete12); - combined = CombineSignatures(scriptPubKey, txTo, 0, amount, partial1b, partial2b); - BOOST_CHECK(combined == complete12); - combined = CombineSignatures(scriptPubKey, txTo, 0, amount, partial3b, partial1b); - BOOST_CHECK(combined == complete13); - combined = CombineSignatures(scriptPubKey, txTo, 0, amount, partial2a, partial3a); - BOOST_CHECK(combined == complete23); - combined = CombineSignatures(scriptPubKey, txTo, 0, amount, partial3b, partial2b); - BOOST_CHECK(combined == complete23); - combined = CombineSignatures(scriptPubKey, txTo, 0, amount, partial3b, partial3a); - BOOST_CHECK(combined == partial3c); + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial1a), SignatureData(partial1b)); + BOOST_CHECK(combined.scriptSig == partial1a); + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial1a), SignatureData(partial2a)); + BOOST_CHECK(combined.scriptSig == complete12); + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial2a), SignatureData(partial1a)); + BOOST_CHECK(combined.scriptSig == complete12); + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial1b), SignatureData(partial2b)); + BOOST_CHECK(combined.scriptSig == complete12); + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial3b), SignatureData(partial1b)); + BOOST_CHECK(combined.scriptSig == complete13); + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial2a), SignatureData(partial3a)); + BOOST_CHECK(combined.scriptSig == complete23); + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial3b), SignatureData(partial2b)); + BOOST_CHECK(combined.scriptSig == complete23); + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial3b), SignatureData(partial3a)); + BOOST_CHECK(combined.scriptSig == partial3c); } BOOST_AUTO_TEST_CASE(script_standard_push) diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index b89111458..ee4af3007 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -2775,17 +2775,20 @@ bool CWallet::CreateTransaction(const vector& vecSend, CWalletTx& wt { bool signSuccess; const CScript& scriptPubKey = coin.first->vout[coin.second].scriptPubKey; - CScript& scriptSigRes = txNew.vin[nIn].scriptSig; + SignatureData sigdata; if (sign) - signSuccess = ProduceSignature(TransactionSignatureCreator(this, &txNewConst, nIn, SIGHASH_ALL), scriptPubKey, scriptSigRes); + signSuccess = ProduceSignature(TransactionSignatureCreator(this, &txNewConst, nIn, coin.first->vout[coin.second].nValue, SIGHASH_ALL), scriptPubKey, sigdata); else - signSuccess = ProduceSignature(DummySignatureCreator(this), scriptPubKey, scriptSigRes); + signSuccess = ProduceSignature(DummySignatureCreator(this), scriptPubKey, sigdata); if (!signSuccess) { strFailReason = _("Signing transaction failed"); return false; + } else { + UpdateTransaction(txNew, nIn, sigdata); } + nIn++; } @@ -2795,6 +2798,7 @@ bool CWallet::CreateTransaction(const vector& vecSend, CWalletTx& wt if (!sign) { BOOST_FOREACH (CTxIn& vin, txNew.vin) vin.scriptSig = CScript(); + txNew.wit.SetNull(); } // Embed the constructed transaction data in wtxNew. diff --git a/src/wallet/wallet_ismine.cpp b/src/wallet/wallet_ismine.cpp index 5482348e3..7d0236bbe 100644 --- a/src/wallet/wallet_ismine.cpp +++ b/src/wallet/wallet_ismine.cpp @@ -56,6 +56,7 @@ isminetype IsMine(const CKeyStore &keystore, const CScript& scriptPubKey) return ISMINE_SPENDABLE; break; case TX_PUBKEYHASH: + case TX_WITNESS_V0_KEYHASH: keyID = CKeyID(uint160(vSolutions[0])); if (keystore.HaveKey(keyID)) return ISMINE_SPENDABLE; @@ -71,6 +72,20 @@ isminetype IsMine(const CKeyStore &keystore, const CScript& scriptPubKey) } break; } + case TX_WITNESS_V0_SCRIPTHASH: + { + uint160 hash; + CRIPEMD160().Write(&vSolutions[0][0], vSolutions[0].size()).Finalize(hash.begin()); + CScriptID scriptID = CScriptID(hash); + CScript subscript; + if (keystore.GetCScript(scriptID, subscript)) { + isminetype ret = IsMine(keystore, subscript); + if (ret == ISMINE_SPENDABLE) + return ret; + } + break; + } + case TX_MULTISIG: { // Only consider transactions "mine" if we own ALL the diff --git a/src/zcbenchmarks.cpp b/src/zcbenchmarks.cpp index e91231967..c061fd797 100644 --- a/src/zcbenchmarks.cpp +++ b/src/zcbenchmarks.cpp @@ -252,7 +252,7 @@ double benchmark_large_tx() // Sign for all the inputs for (size_t i = 0; i < NUM_INPUTS; i++) { - SignSignature(tempKeystore, prevPubKey, spending_tx, i, SIGHASH_ALL); + SignSignature(tempKeystore, prevPubKey, spending_tx, i, 1000000, SIGHASH_ALL); } // Serialize: From e005ff83ab2b44ebac86039123689ea96281def3 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 31 Jan 2018 14:41:44 +0000 Subject: [PATCH 0490/1062] Remove P2WPKH and P2WSH from signing logic Separated from the previous commit for ease of review. --- src/script/sign.cpp | 80 ++---------------------------------- src/script/sign.h | 1 - src/script/standard.cpp | 41 ------------------ src/script/standard.h | 3 -- src/wallet/wallet.cpp | 1 - src/wallet/wallet_ismine.cpp | 14 ------- 6 files changed, 3 insertions(+), 137 deletions(-) diff --git a/src/script/sign.cpp b/src/script/sign.cpp index 033813bdf..790d03b63 100644 --- a/src/script/sign.cpp +++ b/src/script/sign.cpp @@ -109,18 +109,6 @@ static bool SignStep(const BaseSignatureCreator& creator, const CScript& scriptP ret.push_back(valtype()); // workaround CHECKMULTISIG bug return (SignN(vSolutions, creator, scriptPubKey, ret, sigversion)); - case TX_WITNESS_V0_KEYHASH: - ret.push_back(vSolutions[0]); - return true; - - case TX_WITNESS_V0_SCRIPTHASH: - CRIPEMD160().Write(&vSolutions[0][0], vSolutions[0].size()).Finalize(h160.begin()); - if (creator.KeyStore().GetCScript(h160, scriptRet)) { - ret.push_back(std::vector(scriptRet.begin(), scriptRet.end())); - return true; - } - return false; - default: return false; } @@ -148,9 +136,7 @@ bool ProduceSignature(const BaseSignatureCreator& creator, const CScript& fromPu std::vector result; txnouttype whichType; solved = SignStep(creator, script, result, whichType, SIGVERSION_BASE); - bool P2SH = false; CScript subscript; - sigdata.scriptWitness.stack.clear(); if (solved && whichType == TX_SCRIPTHASH) { @@ -159,31 +145,9 @@ bool ProduceSignature(const BaseSignatureCreator& creator, const CScript& fromPu // and then the serialized subscript: script = subscript = CScript(result[0].begin(), result[0].end()); solved = solved && SignStep(creator, script, result, whichType, SIGVERSION_BASE) && whichType != TX_SCRIPTHASH; - P2SH = true; - } - - if (solved && whichType == TX_WITNESS_V0_KEYHASH) - { - CScript witnessscript; - witnessscript << OP_DUP << OP_HASH160 << ToByteVector(result[0]) << OP_EQUALVERIFY << OP_CHECKSIG; - txnouttype subType; - solved = solved && SignStep(creator, witnessscript, result, subType, SIGVERSION_WITNESS_V0); - sigdata.scriptWitness.stack = result; - result.clear(); - } - else if (solved && whichType == TX_WITNESS_V0_SCRIPTHASH) - { - CScript witnessscript(result[0].begin(), result[0].end()); - txnouttype subType; - solved = solved && SignStep(creator, witnessscript, result, subType, SIGVERSION_WITNESS_V0) && subType != TX_SCRIPTHASH && subType != TX_WITNESS_V0_SCRIPTHASH && subType != TX_WITNESS_V0_KEYHASH; - result.push_back(std::vector(witnessscript.begin(), witnessscript.end())); - sigdata.scriptWitness.stack = result; - result.clear(); - } - - if (P2SH) { result.push_back(std::vector(subscript.begin(), subscript.end())); } + sigdata.scriptSig = PushAll(result); // Test solution @@ -195,9 +159,6 @@ SignatureData DataFromTransaction(const CMutableTransaction& tx, unsigned int nI SignatureData data; assert(tx.vin.size() > nIn); data.scriptSig = tx.vin[nIn].scriptSig; - if (tx.wit.vtxinwit.size() > nIn) { - data.scriptWitness = tx.wit.vtxinwit[nIn].scriptWitness; - } return data; } @@ -205,10 +166,6 @@ void UpdateTransaction(CMutableTransaction& tx, unsigned int nIn, const Signatur { assert(tx.vin.size() > nIn); tx.vin[nIn].scriptSig = data.scriptSig; - if (!data.scriptWitness.IsNull() || tx.wit.vtxinwit.size() > nIn) { - tx.wit.vtxinwit.resize(tx.vin.size()); - tx.wit.vtxinwit[nIn].scriptWitness = data.scriptWitness; - } } bool SignSignature(const CKeyStore &keystore, const CScript& fromPubKey, CMutableTransaction& txTo, unsigned int nIn, const CAmount& amount, int nHashType) @@ -294,18 +251,16 @@ namespace struct Stacks { std::vector script; - std::vector witness; Stacks() {} - explicit Stacks(const std::vector& scriptSigStack_) : script(scriptSigStack_), witness() {} - explicit Stacks(const SignatureData& data) : witness(data.scriptWitness.stack) { + explicit Stacks(const std::vector& scriptSigStack_) : script(scriptSigStack_) {} + explicit Stacks(const SignatureData& data) { EvalScript(script, data.scriptSig, SCRIPT_VERIFY_STRICTENC, BaseSignatureChecker(), SIGVERSION_BASE); } SignatureData Output() const { SignatureData result; result.scriptSig = PushAll(script); - result.scriptWitness.stack = witness; return result; } }; @@ -329,11 +284,6 @@ static Stacks CombineSignatures(const CScript& scriptPubKey, const BaseSignature if (sigs1.script.empty() || sigs1.script[0].empty()) return sigs2; return sigs1; - case TX_WITNESS_V0_KEYHASH: - // Signatures are bigger than placeholders or empty scripts: - if (sigs1.witness.empty() || sigs1.witness[0].empty()) - return sigs2; - return sigs1; case TX_SCRIPTHASH: if (sigs1.script.empty() || sigs1.script.back().empty()) return sigs2; @@ -356,30 +306,6 @@ static Stacks CombineSignatures(const CScript& scriptPubKey, const BaseSignature } case TX_MULTISIG: return Stacks(CombineMultisig(scriptPubKey, checker, vSolutions, sigs1.script, sigs2.script, sigversion)); - case TX_WITNESS_V0_SCRIPTHASH: - if (sigs1.witness.empty() || sigs1.witness.back().empty()) - return sigs2; - else if (sigs2.witness.empty() || sigs2.witness.back().empty()) - return sigs1; - else - { - // Recur to combine: - CScript pubKey2(sigs1.witness.back().begin(), sigs1.witness.back().end()); - txnouttype txType2; - vector vSolutions2; - Solver(pubKey2, txType2, vSolutions2); - sigs1.witness.pop_back(); - sigs1.script = sigs1.witness; - sigs1.witness.clear(); - sigs2.witness.pop_back(); - sigs2.script = sigs2.witness; - sigs2.witness.clear(); - Stacks result = CombineSignatures(pubKey2, checker, txType2, vSolutions2, sigs1, sigs2, SIGVERSION_WITNESS_V0); - result.witness = result.script; - result.script.clear(); - result.witness.push_back(valtype(pubKey2.begin(), pubKey2.end())); - return result; - } default: return Stacks(); } diff --git a/src/script/sign.h b/src/script/sign.h index 8aaae1663..5ec0f0b0f 100644 --- a/src/script/sign.h +++ b/src/script/sign.h @@ -61,7 +61,6 @@ public: struct SignatureData { CScript scriptSig; - CScriptWitness scriptWitness; SignatureData() {} explicit SignatureData(const CScript& script) : scriptSig(script) {} diff --git a/src/script/standard.cpp b/src/script/standard.cpp index 2747b300a..ce50e3aad 100644 --- a/src/script/standard.cpp +++ b/src/script/standard.cpp @@ -30,8 +30,6 @@ const char* GetTxnOutputType(txnouttype t) case TX_SCRIPTHASH: return "scripthash"; case TX_MULTISIG: return "multisig"; case TX_NULL_DATA: return "nulldata"; - case TX_WITNESS_V0_KEYHASH: return "witness_v0_keyhash"; - case TX_WITNESS_V0_SCRIPTHASH: return "witness_v0_scripthash"; } return NULL; } @@ -70,22 +68,6 @@ bool Solver(const CScript& scriptPubKey, txnouttype& typeRet, vector witnessprogram; - if (scriptPubKey.IsWitnessProgram(witnessversion, witnessprogram)) { - if (witnessversion == 0 && witnessprogram.size() == 20) { - typeRet = TX_WITNESS_V0_KEYHASH; - vSolutionsRet.push_back(witnessprogram); - return true; - } - if (witnessversion == 0 && witnessprogram.size() == 32) { - typeRet = TX_WITNESS_V0_SCRIPTHASH; - vSolutionsRet.push_back(witnessprogram); - return true; - } - return false; - } - // Scan templates const CScript& script1 = scriptPubKey; BOOST_FOREACH(const PAIRTYPE(txnouttype, CScript)& tplate, mTemplates) @@ -334,26 +316,3 @@ CScript GetScriptForMultisig(int nRequired, const std::vector& keys) script << CScript::EncodeOP_N(keys.size()) << OP_CHECKMULTISIG; return script; } - -CScript GetScriptForWitness(const CScript& redeemscript) -{ - CScript ret; - - txnouttype typ; - std::vector > vSolutions; - if (Solver(redeemscript, typ, vSolutions)) { - if (typ == TX_PUBKEY) { - unsigned char h160[20]; - CHash160().Write(&vSolutions[0][0], vSolutions[0].size()).Finalize(h160); - ret << OP_0 << std::vector(&h160[0], &h160[20]); - return ret; - } else if (typ == TX_PUBKEYHASH) { - ret << OP_0 << vSolutions[0]; - return ret; - } - } - uint256 hash; - CSHA256().Write(&redeemscript[0], redeemscript.size()).Finalize(hash.begin()); - ret << OP_0 << ToByteVector(hash); - return ret; -} diff --git a/src/script/standard.h b/src/script/standard.h index 30ddcec15..da778878b 100644 --- a/src/script/standard.h +++ b/src/script/standard.h @@ -65,8 +65,6 @@ enum txnouttype TX_SCRIPTHASH, TX_MULTISIG, TX_NULL_DATA, - TX_WITNESS_V0_SCRIPTHASH, - TX_WITNESS_V0_KEYHASH, }; class CNoDestination { @@ -94,6 +92,5 @@ bool ExtractDestinations(const CScript& scriptPubKey, txnouttype& typeRet, std:: CScript GetScriptForDestination(const CTxDestination& dest); CScript GetScriptForMultisig(int nRequired, const std::vector& keys); -CScript GetScriptForWitness(const CScript& redeemscript); #endif // BITCOIN_SCRIPT_STANDARD_H diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index ee4af3007..3730430b7 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -2798,7 +2798,6 @@ bool CWallet::CreateTransaction(const vector& vecSend, CWalletTx& wt if (!sign) { BOOST_FOREACH (CTxIn& vin, txNew.vin) vin.scriptSig = CScript(); - txNew.wit.SetNull(); } // Embed the constructed transaction data in wtxNew. diff --git a/src/wallet/wallet_ismine.cpp b/src/wallet/wallet_ismine.cpp index 7d0236bbe..5e144eabe 100644 --- a/src/wallet/wallet_ismine.cpp +++ b/src/wallet/wallet_ismine.cpp @@ -56,7 +56,6 @@ isminetype IsMine(const CKeyStore &keystore, const CScript& scriptPubKey) return ISMINE_SPENDABLE; break; case TX_PUBKEYHASH: - case TX_WITNESS_V0_KEYHASH: keyID = CKeyID(uint160(vSolutions[0])); if (keystore.HaveKey(keyID)) return ISMINE_SPENDABLE; @@ -72,19 +71,6 @@ isminetype IsMine(const CKeyStore &keystore, const CScript& scriptPubKey) } break; } - case TX_WITNESS_V0_SCRIPTHASH: - { - uint160 hash; - CRIPEMD160().Write(&vSolutions[0][0], vSolutions[0].size()).Finalize(hash.begin()); - CScriptID scriptID = CScriptID(hash); - CScript subscript; - if (keystore.GetCScript(scriptID, subscript)) { - isminetype ret = IsMine(keystore, subscript); - if (ret == ISMINE_SPENDABLE) - return ret; - } - break; - } case TX_MULTISIG: { From 722d811f892f32fdf973ea3f5c53b16e1ec43c7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Tim=C3=B3n?= Date: Sat, 16 Jul 2016 20:57:42 +0200 Subject: [PATCH 0491/1062] Mempool: Use Consensus::CheckTxInputs direclty over main::CheckInputs --- src/main.h | 17 +++++++++++++---- src/txmempool.cpp | 9 +++++++-- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/main.h b/src/main.h index 39bffd286..df11c39e3 100644 --- a/src/main.h +++ b/src/main.h @@ -339,6 +339,8 @@ bool ContextualCheckTransaction(const CTransaction& tx, CValidationState &state, /** Apply the effects of this transaction on the UTXO set represented by view */ void UpdateCoins(const CTransaction& tx, CCoinsViewCache& inputs, int nHeight); +/** Transaction validation functions */ + /** Context-independent validity checks */ bool CheckTransaction(const CTransaction& tx, CValidationState& state, libzcash::ProofVerifier& verifier); bool CheckTransactionWithoutProofVerification(const CTransaction& tx, CValidationState &state); @@ -348,6 +350,17 @@ bool CheckTransactionWithoutProofVerification(const CTransaction& tx, CValidatio */ bool IsStandardTx(const CTransaction& tx, std::string& reason, int nHeight = 0); +namespace Consensus { + +/** + * Check whether all inputs of this transaction are valid (no double spends and amounts) + * This does not modify the UTXO set. This does not check scripts and sigs. + * Preconditions: tx.IsCoinBase() is false. + */ +bool CheckTxInputs(const CTransaction& tx, CValidationState& state, const CCoinsViewCache& inputs, int nSpendHeight, const Consensus::Params& consensusParams); + +} // namespace Consensus + /** * Check if transaction is final and can be included in a block with the * specified height and time. Consensus critical. @@ -536,10 +549,6 @@ extern CBlockTreeDB *pblocktree; */ int GetSpendHeight(const CCoinsViewCache& inputs); -namespace Consensus { -bool CheckTxInputs(const CTransaction& tx, CValidationState& state, const CCoinsViewCache& inputs, int nSpendHeight, const Consensus::Params& consensusParams); -} - /** Return a CMutableTransaction with contextual default values based on set of consensus rules at height */ CMutableTransaction CreateNewContextualCMutableTransaction(const Consensus::Params& consensusParams, int nHeight); diff --git a/src/txmempool.cpp b/src/txmempool.cpp index 5492bc4e5..6b3c16f2a 100644 --- a/src/txmempool.cpp +++ b/src/txmempool.cpp @@ -329,6 +329,7 @@ void CTxMemPool::check(const CCoinsViewCache *pcoins) const uint64_t innerUsage = 0; CCoinsViewCache mempoolDuplicate(const_cast(pcoins)); + const int64_t nSpendHeight = GetSpendHeight(mempoolDuplicate); LOCK(cs); list waitingOnDependants; @@ -383,7 +384,9 @@ void CTxMemPool::check(const CCoinsViewCache *pcoins) const waitingOnDependants.push_back(&(*it)); else { CValidationState state; - assert(ContextualCheckInputs(tx, state, mempoolDuplicate, false, 0, false, Params().GetConsensus(), NULL)); + bool fCheckResult = tx.IsCoinBase() || + Consensus::CheckTxInputs(tx, state, mempoolDuplicate, nSpendHeight, Params().GetConsensus()); + assert(fCheckResult); UpdateCoins(tx, mempoolDuplicate, 1000000); } } @@ -397,7 +400,9 @@ void CTxMemPool::check(const CCoinsViewCache *pcoins) const stepsSinceLastRemove++; assert(stepsSinceLastRemove < waitingOnDependants.size()); } else { - assert(ContextualCheckInputs(entry->GetTx(), state, mempoolDuplicate, false, 0, false, Params().GetConsensus(), NULL)); + bool fCheckResult = entry->GetTx().IsCoinBase() || + Consensus::CheckTxInputs(entry->GetTx(), state, mempoolDuplicate, nSpendHeight, Params().GetConsensus()); + assert(fCheckResult); UpdateCoins(entry->GetTx(), mempoolDuplicate, 1000000); stepsSinceLastRemove = 0; } From f762d44973a2cdb615da2f92df0f25807ded9fe7 Mon Sep 17 00:00:00 2001 From: Pieter Wuille Date: Mon, 1 Jan 2018 13:27:59 +0200 Subject: [PATCH 0492/1062] Precompute sighashes Original version by Nicolas Dorier. Precomputing version by Pieter Wuille. Edited for Zcash by Ariel Gabizon and Jack Grigg --- src/gtest/test_validation.cpp | 3 +- src/main.cpp | 22 +++++++++----- src/main.h | 9 ++++-- src/miner.cpp | 3 +- src/script/interpreter.cpp | 54 +++++++++++++++++++++++----------- src/script/interpreter.h | 13 ++++++-- src/script/sigcache.h | 2 +- src/script/zcashconsensus.cpp | 4 +-- src/test/script_P2SH_tests.cpp | 6 ++-- src/test/transaction_tests.cpp | 6 ++-- 10 files changed, 84 insertions(+), 38 deletions(-) diff --git a/src/gtest/test_validation.cpp b/src/gtest/test_validation.cpp index 6f603eaec..59a466588 100644 --- a/src/gtest/test_validation.cpp +++ b/src/gtest/test_validation.cpp @@ -71,7 +71,8 @@ TEST(Validation, ContextualCheckInputsPassesWithCoinbase) { CCoinsViewCache view(&fakeDB); CValidationState state; - EXPECT_TRUE(ContextualCheckInputs(tx, state, view, false, 0, false, Params(CBaseChainParams::MAIN).GetConsensus())); + CachedHashes cachedHashes(tx); + EXPECT_TRUE(ContextualCheckInputs(tx, state, view, false, 0, false, cachedHashes, Params(CBaseChainParams::MAIN).GetConsensus())); } TEST(Validation, ReceivedBlockTransactions) { diff --git a/src/main.cpp b/src/main.cpp index b43bbd9ef..d5dbe1e3f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1347,7 +1347,8 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa // Check against previous transactions // This is done last to help prevent CPU exhaustion denial-of-service attacks. - if (!ContextualCheckInputs(tx, state, view, true, STANDARD_SCRIPT_VERIFY_FLAGS, true, Params().GetConsensus())) + CachedHashes cachedHashes(tx); + if (!ContextualCheckInputs(tx, state, view, true, STANDARD_SCRIPT_VERIFY_FLAGS, true, cachedHashes, Params().GetConsensus())) { return error("AcceptToMemoryPool: ConnectInputs failed %s", hash.ToString()); } @@ -1361,7 +1362,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa // There is a similar check in CreateNewBlock() to prevent creating // invalid blocks, however allowing such transactions into the mempool // can be exploited as a DoS attack. - if (!ContextualCheckInputs(tx, state, view, true, MANDATORY_SCRIPT_VERIFY_FLAGS, true, Params().GetConsensus())) + if (!ContextualCheckInputs(tx, state, view, true, MANDATORY_SCRIPT_VERIFY_FLAGS, true, cachedHashes, Params().GetConsensus())) { return error("AcceptToMemoryPool: BUG! PLEASE REPORT THIS! ConnectInputs failed against MANDATORY but not STANDARD flags %s", hash.ToString()); } @@ -1726,7 +1727,7 @@ void UpdateCoins(const CTransaction& tx, CCoinsViewCache& inputs, int nHeight) bool CScriptCheck::operator()() { const CScript &scriptSig = ptxTo->vin[nIn].scriptSig; - if (!VerifyScript(scriptSig, scriptPubKey, nFlags, CachingTransactionSignatureChecker(ptxTo, nIn, amount, cacheStore), &error)) { + if (!VerifyScript(scriptSig, scriptPubKey, nFlags, CachingTransactionSignatureChecker(ptxTo, nIn, amount, cacheStore, *cachedHashes), &error)) { return ::error("CScriptCheck(): %s:%d VerifySignature failed: %s", ptxTo->GetHash().ToString(), nIn, ScriptErrorString(error)); } return true; @@ -1809,7 +1810,7 @@ bool CheckTxInputs(const CTransaction& tx, CValidationState& state, const CCoins } }// namespace Consensus -bool ContextualCheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsViewCache &inputs, bool fScriptChecks, unsigned int flags, bool cacheStore, const Consensus::Params& consensusParams, std::vector *pvChecks) +bool ContextualCheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsViewCache &inputs, bool fScriptChecks, unsigned int flags, bool cacheStore, CachedHashes& cachedHashes, const Consensus::Params& consensusParams, std::vector *pvChecks) { if (!tx.IsCoinBase()) { @@ -1834,7 +1835,7 @@ bool ContextualCheckInputs(const CTransaction& tx, CValidationState &state, cons assert(coins); // Verify signature - CScriptCheck check(*coins, tx, i, flags, cacheStore); + CScriptCheck check(*coins, tx, i, flags, cacheStore, &cachedHashes); if (pvChecks) { pvChecks->push_back(CScriptCheck()); check.swap(pvChecks->back()); @@ -1847,7 +1848,7 @@ bool ContextualCheckInputs(const CTransaction& tx, CValidationState &state, cons // avoid splitting the network between upgraded and // non-upgraded nodes. CScriptCheck check2(*coins, tx, i, - flags & ~STANDARD_NOT_MANDATORY_VERIFY_FLAGS, cacheStore); + flags & ~STANDARD_NOT_MANDATORY_VERIFY_FLAGS, cacheStore, &cachedHashes); if (check2()) return state.Invalid(false, REJECT_NONSTANDARD, strprintf("non-mandatory-script-verify-flag (%s)", ScriptErrorString(check.GetScriptError()))); } @@ -2237,6 +2238,8 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin assert(tree.root() == old_tree_root); } + std::vector cachedHashes; + cachedHashes.reserve(block.vtx.size()); // Required so that pointers to individual CachedHashes don't get invalidated for (unsigned int i = 0; i < block.vtx.size(); i++) { const CTransaction &tx = block.vtx[i]; @@ -2265,11 +2268,16 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin if (nSigOps > MAX_BLOCK_SIGOPS) return state.DoS(100, error("ConnectBlock(): too many sigops"), REJECT_INVALID, "bad-blk-sigops"); + } + cachedHashes.emplace_back(tx); + + if (!tx.IsCoinBase()) + { nFees += view.GetValueIn(tx)-tx.GetValueOut(); std::vector vChecks; - if (!ContextualCheckInputs(tx, state, view, fExpensiveChecks, flags, false, chainparams.GetConsensus(), nScriptCheckThreads ? &vChecks : NULL)) + if (!ContextualCheckInputs(tx, state, view, fExpensiveChecks, flags, false, cachedHashes[i], chainparams.GetConsensus(), nScriptCheckThreads ? &vChecks : NULL)) return false; control.Add(vChecks); } diff --git a/src/main.h b/src/main.h index df11c39e3..ae90c2903 100644 --- a/src/main.h +++ b/src/main.h @@ -45,6 +45,7 @@ class CInv; class CScriptCheck; class CValidationInterface; class CValidationState; +class CachedHashes; struct CNodeStateStats; @@ -330,7 +331,7 @@ unsigned int GetP2SHSigOpCount(const CTransaction& tx, const CCoinsViewCache& ma * instead of being performed inline. */ bool ContextualCheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsViewCache &view, bool fScriptChecks, - unsigned int flags, bool cacheStore, const Consensus::Params& consensusParams, + unsigned int flags, bool cacheStore, CachedHashes& cachedHashes, const Consensus::Params& consensusParams, std::vector *pvChecks = NULL); /** Check a transaction contextually against a set of consensus rules */ @@ -390,12 +391,13 @@ private: unsigned int nFlags; bool cacheStore; ScriptError error; + CachedHashes *cachedHashes; public: CScriptCheck(): amount(0), ptxTo(0), nIn(0), nFlags(0), cacheStore(false), error(SCRIPT_ERR_UNKNOWN_ERROR) {} - CScriptCheck(const CCoins& txFromIn, const CTransaction& txToIn, unsigned int nInIn, unsigned int nFlagsIn, bool cacheIn) : + CScriptCheck(const CCoins& txFromIn, const CTransaction& txToIn, unsigned int nInIn, unsigned int nFlagsIn, bool cacheIn, CachedHashes* cachedHashesIn) : scriptPubKey(txFromIn.vout[txToIn.vin[nInIn].prevout.n].scriptPubKey), amount(txFromIn.vout[txToIn.vin[nInIn].prevout.n].nValue), - ptxTo(&txToIn), nIn(nInIn), nFlags(nFlagsIn), cacheStore(cacheIn), error(SCRIPT_ERR_UNKNOWN_ERROR) { } + ptxTo(&txToIn), nIn(nInIn), nFlags(nFlagsIn), cacheStore(cacheIn), error(SCRIPT_ERR_UNKNOWN_ERROR), cachedHashes(cachedHashesIn) { } bool operator()(); @@ -407,6 +409,7 @@ public: std::swap(nFlags, check.nFlags); std::swap(cacheStore, check.cacheStore); std::swap(error, check.error); + std::swap(cachedHashes, check.cachedHashes); } ScriptError GetScriptError() const { return error; } diff --git a/src/miner.cpp b/src/miner.cpp index 84a6edf6a..a59856c60 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -293,7 +293,8 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) // policy here, but we still have to ensure that the block we // create only contains transactions that are valid in new blocks. CValidationState state; - if (!ContextualCheckInputs(tx, state, view, true, MANDATORY_SCRIPT_VERIFY_FLAGS, true, Params().GetConsensus())) + CachedHashes cachedHashes(tx); + if (!ContextualCheckInputs(tx, state, view, true, MANDATORY_SCRIPT_VERIFY_FLAGS, true, cachedHashes, Params().GetConsensus())) continue; UpdateCoins(tx, view, nHeight); diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index bf3313f5c..0405b8fa7 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -1050,9 +1050,40 @@ public: } }; +uint256 GetPrevoutHash(const CTransaction& txTo) { + CHashWriter ss(SER_GETHASH, 0); + for (unsigned int n = 0; n < txTo.vin.size(); n++) { + ss << txTo.vin[n].prevout; + } + return ss.GetHash(); +} + +uint256 GetSequenceHash(const CTransaction& txTo) { + CHashWriter ss(SER_GETHASH, 0); + for (unsigned int n = 0; n < txTo.vin.size(); n++) { + ss << txTo.vin[n].nSequence; + } + return ss.GetHash(); +} + +uint256 GetOutputsHash(const CTransaction& txTo) { + CHashWriter ss(SER_GETHASH, 0); + for (unsigned int n = 0; n < txTo.vout.size(); n++) { + ss << txTo.vout[n]; + } + return ss.GetHash(); +} + } // anon namespace -uint256 SignatureHash(const CScript& scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType, const CAmount& amount, SigVersion sigversion) +CachedHashes::CachedHashes(const CTransaction& txTo) +{ + hashPrevouts = GetPrevoutHash(txTo); + hashSequence = GetSequenceHash(txTo); + hashOutputs = GetOutputsHash(txTo); +} + +uint256 SignatureHash(const CScript& scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType, const CAmount& amount, SigVersion sigversion, const CachedHashes* cache) { if (nIn >= txTo.vin.size() && nIn != NOT_AN_INPUT) { // nIn out of range @@ -1065,27 +1096,16 @@ uint256 SignatureHash(const CScript& scriptCode, const CTransaction& txTo, unsig uint256 hashOutputs; if (!(nHashType & SIGHASH_ANYONECANPAY)) { - CHashWriter ss(SER_GETHASH, 0); - for (unsigned int n = 0; n < txTo.vin.size(); n++) { - ss << txTo.vin[n].prevout; - } - hashPrevouts = ss.GetHash(); // TODO: cache this value for all signatures in a transaction + hashPrevouts = cache ? cache->hashPrevouts : GetPrevoutHash(txTo); } if (!(nHashType & SIGHASH_ANYONECANPAY) && (nHashType & 0x1f) != SIGHASH_SINGLE && (nHashType & 0x1f) != SIGHASH_NONE) { - CHashWriter ss(SER_GETHASH, 0); - for (unsigned int n = 0; n < txTo.vin.size(); n++) { - ss << txTo.vin[n].nSequence; - } - hashSequence = ss.GetHash(); // TODO: cache this value for all signatures in a transaction + hashSequence = cache ? cache->hashSequence : GetSequenceHash(txTo); } + if ((nHashType & 0x1f) != SIGHASH_SINGLE && (nHashType & 0x1f) != SIGHASH_NONE) { - CHashWriter ss(SER_GETHASH, 0); - for (unsigned int n = 0; n < txTo.vout.size(); n++) { - ss << txTo.vout[n]; - } - hashOutputs = ss.GetHash(); // TODO: cache this value for all signatures in a transaction + hashOutputs = cache ? cache->hashOutputs : GetOutputsHash(txTo); } else if ((nHashType & 0x1f) == SIGHASH_SINGLE && nIn < txTo.vout.size()) { CHashWriter ss(SER_GETHASH, 0); ss << txTo.vout[nIn]; @@ -1154,7 +1174,7 @@ bool TransactionSignatureChecker::CheckSig(const vector& vchSigIn uint256 sighash; try { - sighash = SignatureHash(scriptCode, *txTo, nIn, nHashType, amount, sigversion); + sighash = SignatureHash(scriptCode, *txTo, nIn, nHashType, amount, sigversion, this->cachedHashes); } catch (logic_error ex) { return false; } diff --git a/src/script/interpreter.h b/src/script/interpreter.h index 103c94d1d..4b37a5c76 100644 --- a/src/script/interpreter.h +++ b/src/script/interpreter.h @@ -88,13 +88,20 @@ enum SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY = (1U << 9), }; +struct CachedHashes +{ + uint256 hashPrevouts, hashSequence, hashOutputs; + + CachedHashes(const CTransaction& tx); +}; + enum SigVersion { SIGVERSION_BASE = 0, SIGVERSION_WITNESS_V0 = 1, }; -uint256 SignatureHash(const CScript &scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType, const CAmount& amount, SigVersion sigversion); +uint256 SignatureHash(const CScript &scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType, const CAmount& amount, SigVersion sigversion, const CachedHashes* cache = NULL); class BaseSignatureChecker { @@ -118,12 +125,14 @@ private: const CTransaction* txTo; unsigned int nIn; const CAmount amount; + const CachedHashes* cachedHashes; protected: virtual bool VerifySignature(const std::vector& vchSig, const CPubKey& vchPubKey, const uint256& sighash) const; public: - TransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn) : txTo(txToIn), nIn(nInIn), amount(amountIn) {} + TransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn) : txTo(txToIn), nIn(nInIn), amount(amountIn), cachedHashes(NULL) {} + TransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn, const CachedHashes& cachedHashesIn) : txTo(txToIn), nIn(nInIn), amount(amountIn), cachedHashes(&cachedHashesIn) {} bool CheckSig(const std::vector& scriptSig, const std::vector& vchPubKey, const CScript& scriptCode, SigVersion sigversion) const; bool CheckLockTime(const CScriptNum& nLockTime) const; }; diff --git a/src/script/sigcache.h b/src/script/sigcache.h index 0dcbf1c59..7181841ed 100644 --- a/src/script/sigcache.h +++ b/src/script/sigcache.h @@ -18,7 +18,7 @@ private: bool store; public: - CachingTransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn, const CAmount& amount, bool storeIn) : TransactionSignatureChecker(txToIn, nInIn, amount), store(storeIn) {} + CachingTransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn, const CAmount& amount, bool storeIn, CachedHashes& cachedHashesIn) : TransactionSignatureChecker(txToIn, nInIn, amount, cachedHashesIn), store(storeIn) {} bool VerifySignature(const std::vector& vchSig, const CPubKey& vchPubKey, const uint256& sighash) const; }; diff --git a/src/script/zcashconsensus.cpp b/src/script/zcashconsensus.cpp index 80e92300f..eec42a00b 100644 --- a/src/script/zcashconsensus.cpp +++ b/src/script/zcashconsensus.cpp @@ -84,9 +84,9 @@ int zcashconsensus_verify_script(const unsigned char *scriptPubKey, unsigned int // Regardless of the verification result, the tx did not error. set_error(err, zcashconsensus_ERR_OK); - + CachedHashes cachedHashes(tx); CAmount am(0); - return VerifyScript(tx.vin[nIn].scriptSig, CScript(scriptPubKey, scriptPubKey + scriptPubKeyLen), flags, TransactionSignatureChecker(&tx, nIn, am), NULL); + return VerifyScript(tx.vin[nIn].scriptSig, CScript(scriptPubKey, scriptPubKey + scriptPubKeyLen), flags, TransactionSignatureChecker(&tx, nIn, am, cachedHashes), NULL); } catch (const std::exception&) { return set_error(err, zcashconsensus_ERR_TX_DESERIALIZE); // Error deserializing } diff --git a/src/test/script_P2SH_tests.cpp b/src/test/script_P2SH_tests.cpp index 3b99fc740..788ea44aa 100644 --- a/src/test/script_P2SH_tests.cpp +++ b/src/test/script_P2SH_tests.cpp @@ -111,18 +111,20 @@ BOOST_AUTO_TEST_CASE(sign) } // All of the above should be OK, and the txTos have valid signatures // Check to make sure signature verification fails if we use the wrong ScriptSig: - for (int i = 0; i < 8; i++) + for (int i = 0; i < 8; i++) { + CachedHashes cachedHashes(txTo[i]); for (int j = 0; j < 8; j++) { CScript sigSave = txTo[i].vin[0].scriptSig; txTo[i].vin[0].scriptSig = txTo[j].vin[0].scriptSig; - bool sigOK = CScriptCheck(CCoins(txFrom, 0), txTo[i], 0, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_STRICTENC, false)(); + bool sigOK = CScriptCheck(CCoins(txFrom, 0), txTo[i], 0, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_STRICTENC, false, &cachedHashes)(); if (i == j) BOOST_CHECK_MESSAGE(sigOK, strprintf("VerifySignature %d %d", i, j)); else BOOST_CHECK_MESSAGE(!sigOK, strprintf("VerifySignature %d %d", i, j)); txTo[i].vin[0].scriptSig = sigSave; } + } } BOOST_AUTO_TEST_CASE(norecurse) diff --git a/src/test/transaction_tests.cpp b/src/test/transaction_tests.cpp index 9adfd6e28..fbbd8a24e 100644 --- a/src/test/transaction_tests.cpp +++ b/src/test/transaction_tests.cpp @@ -147,6 +147,7 @@ BOOST_AUTO_TEST_CASE(tx_valid) BOOST_CHECK_MESSAGE(CheckTransaction(tx, state, verifier), strTest + comment); BOOST_CHECK_MESSAGE(state.IsValid(), comment); + CachedHashes cachedHashes(tx); for (unsigned int i = 0; i < tx.vin.size(); i++) { if (!mapprevOutScriptPubKeys.count(tx.vin[i].prevout)) @@ -158,7 +159,7 @@ BOOST_AUTO_TEST_CASE(tx_valid) CAmount amount = 0; unsigned int verify_flags = ParseScriptFlags(test[2].get_str()); BOOST_CHECK_MESSAGE(VerifyScript(tx.vin[i].scriptSig, mapprevOutScriptPubKeys[tx.vin[i].prevout], - verify_flags, TransactionSignatureChecker(&tx, i, amount), &err), + verify_flags, TransactionSignatureChecker(&tx, i, amount, cachedHashes), &err), strTest + comment); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err) + comment); } @@ -231,6 +232,7 @@ BOOST_AUTO_TEST_CASE(tx_invalid) CValidationState state; fValid = CheckTransaction(tx, state, verifier) && state.IsValid(); + CachedHashes cachedHashes(tx); for (unsigned int i = 0; i < tx.vin.size() && fValid; i++) { if (!mapprevOutScriptPubKeys.count(tx.vin[i].prevout)) @@ -242,7 +244,7 @@ BOOST_AUTO_TEST_CASE(tx_invalid) unsigned int verify_flags = ParseScriptFlags(test[2].get_str()); CAmount amount = 0; fValid = VerifyScript(tx.vin[i].scriptSig, mapprevOutScriptPubKeys[tx.vin[i].prevout], - verify_flags, TransactionSignatureChecker(&tx, i, amount), &err); + verify_flags, TransactionSignatureChecker(&tx, i, amount, cachedHashes), &err); } BOOST_CHECK_MESSAGE(!fValid, strTest + comment); BOOST_CHECK_MESSAGE(err != SCRIPT_ERR_OK, ScriptErrorString(err) + comment); From 90285e7b81b2d66bf48eb0055c4e3ac29fcc4994 Mon Sep 17 00:00:00 2001 From: Nicolas DORIER Date: Tue, 16 Aug 2016 15:37:56 +0200 Subject: [PATCH 0493/1062] Unit test for sighash caching Zcash: Modified to use P2PKH. --- src/test/transaction_tests.cpp | 84 ++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/src/test/transaction_tests.cpp b/src/test/transaction_tests.cpp index fbbd8a24e..1502043d0 100644 --- a/src/test/transaction_tests.cpp +++ b/src/test/transaction_tests.cpp @@ -8,6 +8,7 @@ #include "init.h" #include "clientversion.h" +#include "checkqueue.h" #include "consensus/validation.h" #include "core_io.h" #include "key.h" @@ -15,6 +16,7 @@ #include "main.h" #include "script/script.h" #include "script/script_error.h" +#include "script/sign.h" #include "primitives/transaction.h" #include "sodium.h" @@ -555,6 +557,88 @@ BOOST_AUTO_TEST_CASE(test_Get) BOOST_CHECK(!AreInputsStandard(t1, coins)); } +BOOST_AUTO_TEST_CASE(test_big_overwinter_transaction) { + CMutableTransaction mtx; + mtx.fOverwintered = true; + mtx.nVersion = 3; + mtx.nVersionGroupId = OVERWINTER_VERSION_GROUP_ID; + + CKey key; + key.MakeNewKey(false); + CBasicKeyStore keystore; + keystore.AddKeyPubKey(key, key.GetPubKey()); + CKeyID hash = key.GetPubKey().GetID(); + CScript scriptPubKey = GetScriptForDestination(hash); + + vector sigHashes; + sigHashes.push_back(SIGHASH_NONE | SIGHASH_ANYONECANPAY); + sigHashes.push_back(SIGHASH_SINGLE | SIGHASH_ANYONECANPAY); + sigHashes.push_back(SIGHASH_ALL | SIGHASH_ANYONECANPAY); + sigHashes.push_back(SIGHASH_NONE); + sigHashes.push_back(SIGHASH_SINGLE); + sigHashes.push_back(SIGHASH_ALL); + + // create a big transaction of 4500 inputs signed by the same key + for(uint32_t ij = 0; ij < 4500; ij++) { + uint32_t i = mtx.vin.size(); + uint256 prevId; + prevId.SetHex("0000000000000000000000000000000000000000000000000000000000000100"); + COutPoint outpoint(prevId, i); + + mtx.vin.resize(mtx.vin.size() + 1); + mtx.vin[i].prevout = outpoint; + mtx.vin[i].scriptSig = CScript(); + + mtx.vout.resize(mtx.vout.size() + 1); + mtx.vout[i].nValue = 1000; + mtx.vout[i].scriptPubKey = CScript() << OP_1; + } + + // sign all inputs + for(uint32_t i = 0; i < mtx.vin.size(); i++) { + bool hashSigned = SignSignature(keystore, scriptPubKey, mtx, i, 1000, sigHashes.at(i % sigHashes.size())); + assert(hashSigned); + } + + CTransaction tx; + CDataStream ssout(SER_NETWORK, PROTOCOL_VERSION); + ssout << mtx; + ssout >> tx; + + // check all inputs concurrently, with the cache + CachedHashes cachedHashes(tx); + boost::thread_group threadGroup; + CCheckQueue scriptcheckqueue(128); + CCheckQueueControl control(&scriptcheckqueue); + + for (int i=0; i<20; i++) + threadGroup.create_thread(boost::bind(&CCheckQueue::Thread, boost::ref(scriptcheckqueue))); + + CCoins coins; + coins.nVersion = 1; + coins.fCoinBase = false; + for(uint32_t i = 0; i < mtx.vin.size(); i++) { + CTxOut txout; + txout.nValue = 1000; + txout.scriptPubKey = scriptPubKey; + coins.vout.push_back(txout); + } + + for(uint32_t i = 0; i < mtx.vin.size(); i++) { + std::vector vChecks; + CScriptCheck check(coins, tx, i, SCRIPT_VERIFY_P2SH, false, &cachedHashes); + vChecks.push_back(CScriptCheck()); + check.swap(vChecks.back()); + control.Add(vChecks); + } + + bool controlCheck = control.Wait(); + assert(controlCheck); + + threadGroup.interrupt_all(); + threadGroup.join_all(); +} + BOOST_AUTO_TEST_CASE(test_IsStandard) { LOCK(cs_main); From 6514771a44cc069f4fc179babbd6a5bbc7dc0c43 Mon Sep 17 00:00:00 2001 From: Pieter Wuille Date: Fri, 26 Aug 2016 18:38:20 +0200 Subject: [PATCH 0494/1062] Rename to PrecomputedTransactionData --- src/gtest/test_validation.cpp | 4 ++-- src/main.cpp | 22 +++++++++++----------- src/main.h | 12 ++++++------ src/miner.cpp | 4 ++-- src/script/interpreter.cpp | 6 +++--- src/script/interpreter.h | 12 ++++++------ src/script/sigcache.h | 2 +- src/script/zcashconsensus.cpp | 4 ++-- src/test/script_P2SH_tests.cpp | 4 ++-- src/test/transaction_tests.cpp | 12 ++++++------ 10 files changed, 41 insertions(+), 41 deletions(-) diff --git a/src/gtest/test_validation.cpp b/src/gtest/test_validation.cpp index 59a466588..508616e8a 100644 --- a/src/gtest/test_validation.cpp +++ b/src/gtest/test_validation.cpp @@ -71,8 +71,8 @@ TEST(Validation, ContextualCheckInputsPassesWithCoinbase) { CCoinsViewCache view(&fakeDB); CValidationState state; - CachedHashes cachedHashes(tx); - EXPECT_TRUE(ContextualCheckInputs(tx, state, view, false, 0, false, cachedHashes, Params(CBaseChainParams::MAIN).GetConsensus())); + PrecomputedTransactionData txdata(tx); + EXPECT_TRUE(ContextualCheckInputs(tx, state, view, false, 0, false, txdata, Params(CBaseChainParams::MAIN).GetConsensus())); } TEST(Validation, ReceivedBlockTransactions) { diff --git a/src/main.cpp b/src/main.cpp index d5dbe1e3f..b5dac6595 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1347,8 +1347,8 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa // Check against previous transactions // This is done last to help prevent CPU exhaustion denial-of-service attacks. - CachedHashes cachedHashes(tx); - if (!ContextualCheckInputs(tx, state, view, true, STANDARD_SCRIPT_VERIFY_FLAGS, true, cachedHashes, Params().GetConsensus())) + PrecomputedTransactionData txdata(tx); + if (!ContextualCheckInputs(tx, state, view, true, STANDARD_SCRIPT_VERIFY_FLAGS, true, txdata, Params().GetConsensus())) { return error("AcceptToMemoryPool: ConnectInputs failed %s", hash.ToString()); } @@ -1362,7 +1362,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa // There is a similar check in CreateNewBlock() to prevent creating // invalid blocks, however allowing such transactions into the mempool // can be exploited as a DoS attack. - if (!ContextualCheckInputs(tx, state, view, true, MANDATORY_SCRIPT_VERIFY_FLAGS, true, cachedHashes, Params().GetConsensus())) + if (!ContextualCheckInputs(tx, state, view, true, MANDATORY_SCRIPT_VERIFY_FLAGS, true, txdata, Params().GetConsensus())) { return error("AcceptToMemoryPool: BUG! PLEASE REPORT THIS! ConnectInputs failed against MANDATORY but not STANDARD flags %s", hash.ToString()); } @@ -1727,7 +1727,7 @@ void UpdateCoins(const CTransaction& tx, CCoinsViewCache& inputs, int nHeight) bool CScriptCheck::operator()() { const CScript &scriptSig = ptxTo->vin[nIn].scriptSig; - if (!VerifyScript(scriptSig, scriptPubKey, nFlags, CachingTransactionSignatureChecker(ptxTo, nIn, amount, cacheStore, *cachedHashes), &error)) { + if (!VerifyScript(scriptSig, scriptPubKey, nFlags, CachingTransactionSignatureChecker(ptxTo, nIn, amount, cacheStore, *txdata), &error)) { return ::error("CScriptCheck(): %s:%d VerifySignature failed: %s", ptxTo->GetHash().ToString(), nIn, ScriptErrorString(error)); } return true; @@ -1810,7 +1810,7 @@ bool CheckTxInputs(const CTransaction& tx, CValidationState& state, const CCoins } }// namespace Consensus -bool ContextualCheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsViewCache &inputs, bool fScriptChecks, unsigned int flags, bool cacheStore, CachedHashes& cachedHashes, const Consensus::Params& consensusParams, std::vector *pvChecks) +bool ContextualCheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsViewCache &inputs, bool fScriptChecks, unsigned int flags, bool cacheStore, PrecomputedTransactionData& txdata, const Consensus::Params& consensusParams, std::vector *pvChecks) { if (!tx.IsCoinBase()) { @@ -1835,7 +1835,7 @@ bool ContextualCheckInputs(const CTransaction& tx, CValidationState &state, cons assert(coins); // Verify signature - CScriptCheck check(*coins, tx, i, flags, cacheStore, &cachedHashes); + CScriptCheck check(*coins, tx, i, flags, cacheStore, &txdata); if (pvChecks) { pvChecks->push_back(CScriptCheck()); check.swap(pvChecks->back()); @@ -1848,7 +1848,7 @@ bool ContextualCheckInputs(const CTransaction& tx, CValidationState &state, cons // avoid splitting the network between upgraded and // non-upgraded nodes. CScriptCheck check2(*coins, tx, i, - flags & ~STANDARD_NOT_MANDATORY_VERIFY_FLAGS, cacheStore, &cachedHashes); + flags & ~STANDARD_NOT_MANDATORY_VERIFY_FLAGS, cacheStore, &txdata); if (check2()) return state.Invalid(false, REJECT_NONSTANDARD, strprintf("non-mandatory-script-verify-flag (%s)", ScriptErrorString(check.GetScriptError()))); } @@ -2238,8 +2238,8 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin assert(tree.root() == old_tree_root); } - std::vector cachedHashes; - cachedHashes.reserve(block.vtx.size()); // Required so that pointers to individual CachedHashes don't get invalidated + std::vector txdata; + txdata.reserve(block.vtx.size()); // Required so that pointers to individual PrecomputedTransactionData don't get invalidated for (unsigned int i = 0; i < block.vtx.size(); i++) { const CTransaction &tx = block.vtx[i]; @@ -2270,14 +2270,14 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin REJECT_INVALID, "bad-blk-sigops"); } - cachedHashes.emplace_back(tx); + txdata.emplace_back(tx); if (!tx.IsCoinBase()) { nFees += view.GetValueIn(tx)-tx.GetValueOut(); std::vector vChecks; - if (!ContextualCheckInputs(tx, state, view, fExpensiveChecks, flags, false, cachedHashes[i], chainparams.GetConsensus(), nScriptCheckThreads ? &vChecks : NULL)) + if (!ContextualCheckInputs(tx, state, view, fExpensiveChecks, flags, false, txdata[i], chainparams.GetConsensus(), nScriptCheckThreads ? &vChecks : NULL)) return false; control.Add(vChecks); } diff --git a/src/main.h b/src/main.h index ae90c2903..e2a386e62 100644 --- a/src/main.h +++ b/src/main.h @@ -45,7 +45,7 @@ class CInv; class CScriptCheck; class CValidationInterface; class CValidationState; -class CachedHashes; +class PrecomputedTransactionData; struct CNodeStateStats; @@ -331,7 +331,7 @@ unsigned int GetP2SHSigOpCount(const CTransaction& tx, const CCoinsViewCache& ma * instead of being performed inline. */ bool ContextualCheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsViewCache &view, bool fScriptChecks, - unsigned int flags, bool cacheStore, CachedHashes& cachedHashes, const Consensus::Params& consensusParams, + unsigned int flags, bool cacheStore, PrecomputedTransactionData& txdata, const Consensus::Params& consensusParams, std::vector *pvChecks = NULL); /** Check a transaction contextually against a set of consensus rules */ @@ -391,13 +391,13 @@ private: unsigned int nFlags; bool cacheStore; ScriptError error; - CachedHashes *cachedHashes; + PrecomputedTransactionData *txdata; public: CScriptCheck(): amount(0), ptxTo(0), nIn(0), nFlags(0), cacheStore(false), error(SCRIPT_ERR_UNKNOWN_ERROR) {} - CScriptCheck(const CCoins& txFromIn, const CTransaction& txToIn, unsigned int nInIn, unsigned int nFlagsIn, bool cacheIn, CachedHashes* cachedHashesIn) : + CScriptCheck(const CCoins& txFromIn, const CTransaction& txToIn, unsigned int nInIn, unsigned int nFlagsIn, bool cacheIn, PrecomputedTransactionData* txdataIn) : scriptPubKey(txFromIn.vout[txToIn.vin[nInIn].prevout.n].scriptPubKey), amount(txFromIn.vout[txToIn.vin[nInIn].prevout.n].nValue), - ptxTo(&txToIn), nIn(nInIn), nFlags(nFlagsIn), cacheStore(cacheIn), error(SCRIPT_ERR_UNKNOWN_ERROR), cachedHashes(cachedHashesIn) { } + ptxTo(&txToIn), nIn(nInIn), nFlags(nFlagsIn), cacheStore(cacheIn), error(SCRIPT_ERR_UNKNOWN_ERROR), txdata(txdataIn) { } bool operator()(); @@ -409,7 +409,7 @@ public: std::swap(nFlags, check.nFlags); std::swap(cacheStore, check.cacheStore); std::swap(error, check.error); - std::swap(cachedHashes, check.cachedHashes); + std::swap(txdata, check.txdata); } ScriptError GetScriptError() const { return error; } diff --git a/src/miner.cpp b/src/miner.cpp index a59856c60..3d7a67329 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -293,8 +293,8 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) // policy here, but we still have to ensure that the block we // create only contains transactions that are valid in new blocks. CValidationState state; - CachedHashes cachedHashes(tx); - if (!ContextualCheckInputs(tx, state, view, true, MANDATORY_SCRIPT_VERIFY_FLAGS, true, cachedHashes, Params().GetConsensus())) + PrecomputedTransactionData txdata(tx); + if (!ContextualCheckInputs(tx, state, view, true, MANDATORY_SCRIPT_VERIFY_FLAGS, true, txdata, Params().GetConsensus())) continue; UpdateCoins(tx, view, nHeight); diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 0405b8fa7..75edd4941 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -1076,14 +1076,14 @@ uint256 GetOutputsHash(const CTransaction& txTo) { } // anon namespace -CachedHashes::CachedHashes(const CTransaction& txTo) +PrecomputedTransactionData::PrecomputedTransactionData(const CTransaction& txTo) { hashPrevouts = GetPrevoutHash(txTo); hashSequence = GetSequenceHash(txTo); hashOutputs = GetOutputsHash(txTo); } -uint256 SignatureHash(const CScript& scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType, const CAmount& amount, SigVersion sigversion, const CachedHashes* cache) +uint256 SignatureHash(const CScript& scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType, const CAmount& amount, SigVersion sigversion, const PrecomputedTransactionData* cache) { if (nIn >= txTo.vin.size() && nIn != NOT_AN_INPUT) { // nIn out of range @@ -1174,7 +1174,7 @@ bool TransactionSignatureChecker::CheckSig(const vector& vchSigIn uint256 sighash; try { - sighash = SignatureHash(scriptCode, *txTo, nIn, nHashType, amount, sigversion, this->cachedHashes); + sighash = SignatureHash(scriptCode, *txTo, nIn, nHashType, amount, sigversion, this->txdata); } catch (logic_error ex) { return false; } diff --git a/src/script/interpreter.h b/src/script/interpreter.h index 4b37a5c76..fe97bd63c 100644 --- a/src/script/interpreter.h +++ b/src/script/interpreter.h @@ -88,11 +88,11 @@ enum SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY = (1U << 9), }; -struct CachedHashes +struct PrecomputedTransactionData { uint256 hashPrevouts, hashSequence, hashOutputs; - CachedHashes(const CTransaction& tx); + PrecomputedTransactionData(const CTransaction& tx); }; enum SigVersion @@ -101,7 +101,7 @@ enum SigVersion SIGVERSION_WITNESS_V0 = 1, }; -uint256 SignatureHash(const CScript &scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType, const CAmount& amount, SigVersion sigversion, const CachedHashes* cache = NULL); +uint256 SignatureHash(const CScript &scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType, const CAmount& amount, SigVersion sigversion, const PrecomputedTransactionData* cache = NULL); class BaseSignatureChecker { @@ -125,14 +125,14 @@ private: const CTransaction* txTo; unsigned int nIn; const CAmount amount; - const CachedHashes* cachedHashes; + const PrecomputedTransactionData* txdata; protected: virtual bool VerifySignature(const std::vector& vchSig, const CPubKey& vchPubKey, const uint256& sighash) const; public: - TransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn) : txTo(txToIn), nIn(nInIn), amount(amountIn), cachedHashes(NULL) {} - TransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn, const CachedHashes& cachedHashesIn) : txTo(txToIn), nIn(nInIn), amount(amountIn), cachedHashes(&cachedHashesIn) {} + TransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn) : txTo(txToIn), nIn(nInIn), amount(amountIn), txdata(NULL) {} + TransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn, const PrecomputedTransactionData& txdataIn) : txTo(txToIn), nIn(nInIn), amount(amountIn), txdata(&txdataIn) {} bool CheckSig(const std::vector& scriptSig, const std::vector& vchPubKey, const CScript& scriptCode, SigVersion sigversion) const; bool CheckLockTime(const CScriptNum& nLockTime) const; }; diff --git a/src/script/sigcache.h b/src/script/sigcache.h index 7181841ed..134b72a2d 100644 --- a/src/script/sigcache.h +++ b/src/script/sigcache.h @@ -18,7 +18,7 @@ private: bool store; public: - CachingTransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn, const CAmount& amount, bool storeIn, CachedHashes& cachedHashesIn) : TransactionSignatureChecker(txToIn, nInIn, amount, cachedHashesIn), store(storeIn) {} + CachingTransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn, const CAmount& amount, bool storeIn, PrecomputedTransactionData& txdataIn) : TransactionSignatureChecker(txToIn, nInIn, amount, txdataIn), store(storeIn) {} bool VerifySignature(const std::vector& vchSig, const CPubKey& vchPubKey, const uint256& sighash) const; }; diff --git a/src/script/zcashconsensus.cpp b/src/script/zcashconsensus.cpp index eec42a00b..6a85c79f6 100644 --- a/src/script/zcashconsensus.cpp +++ b/src/script/zcashconsensus.cpp @@ -84,9 +84,9 @@ int zcashconsensus_verify_script(const unsigned char *scriptPubKey, unsigned int // Regardless of the verification result, the tx did not error. set_error(err, zcashconsensus_ERR_OK); - CachedHashes cachedHashes(tx); + PrecomputedTransactionData txdata(tx); CAmount am(0); - return VerifyScript(tx.vin[nIn].scriptSig, CScript(scriptPubKey, scriptPubKey + scriptPubKeyLen), flags, TransactionSignatureChecker(&tx, nIn, am, cachedHashes), NULL); + return VerifyScript(tx.vin[nIn].scriptSig, CScript(scriptPubKey, scriptPubKey + scriptPubKeyLen), flags, TransactionSignatureChecker(&tx, nIn, am, txdata), NULL); } catch (const std::exception&) { return set_error(err, zcashconsensus_ERR_TX_DESERIALIZE); // Error deserializing } diff --git a/src/test/script_P2SH_tests.cpp b/src/test/script_P2SH_tests.cpp index 788ea44aa..8be86ce73 100644 --- a/src/test/script_P2SH_tests.cpp +++ b/src/test/script_P2SH_tests.cpp @@ -112,12 +112,12 @@ BOOST_AUTO_TEST_CASE(sign) // All of the above should be OK, and the txTos have valid signatures // Check to make sure signature verification fails if we use the wrong ScriptSig: for (int i = 0; i < 8; i++) { - CachedHashes cachedHashes(txTo[i]); + PrecomputedTransactionData txdata(txTo[i]); for (int j = 0; j < 8; j++) { CScript sigSave = txTo[i].vin[0].scriptSig; txTo[i].vin[0].scriptSig = txTo[j].vin[0].scriptSig; - bool sigOK = CScriptCheck(CCoins(txFrom, 0), txTo[i], 0, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_STRICTENC, false, &cachedHashes)(); + bool sigOK = CScriptCheck(CCoins(txFrom, 0), txTo[i], 0, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_STRICTENC, false, &txdata)(); if (i == j) BOOST_CHECK_MESSAGE(sigOK, strprintf("VerifySignature %d %d", i, j)); else diff --git a/src/test/transaction_tests.cpp b/src/test/transaction_tests.cpp index 1502043d0..160110c54 100644 --- a/src/test/transaction_tests.cpp +++ b/src/test/transaction_tests.cpp @@ -149,7 +149,7 @@ BOOST_AUTO_TEST_CASE(tx_valid) BOOST_CHECK_MESSAGE(CheckTransaction(tx, state, verifier), strTest + comment); BOOST_CHECK_MESSAGE(state.IsValid(), comment); - CachedHashes cachedHashes(tx); + PrecomputedTransactionData txdata(tx); for (unsigned int i = 0; i < tx.vin.size(); i++) { if (!mapprevOutScriptPubKeys.count(tx.vin[i].prevout)) @@ -161,7 +161,7 @@ BOOST_AUTO_TEST_CASE(tx_valid) CAmount amount = 0; unsigned int verify_flags = ParseScriptFlags(test[2].get_str()); BOOST_CHECK_MESSAGE(VerifyScript(tx.vin[i].scriptSig, mapprevOutScriptPubKeys[tx.vin[i].prevout], - verify_flags, TransactionSignatureChecker(&tx, i, amount, cachedHashes), &err), + verify_flags, TransactionSignatureChecker(&tx, i, amount, txdata), &err), strTest + comment); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err) + comment); } @@ -234,7 +234,7 @@ BOOST_AUTO_TEST_CASE(tx_invalid) CValidationState state; fValid = CheckTransaction(tx, state, verifier) && state.IsValid(); - CachedHashes cachedHashes(tx); + PrecomputedTransactionData txdata(tx); for (unsigned int i = 0; i < tx.vin.size() && fValid; i++) { if (!mapprevOutScriptPubKeys.count(tx.vin[i].prevout)) @@ -246,7 +246,7 @@ BOOST_AUTO_TEST_CASE(tx_invalid) unsigned int verify_flags = ParseScriptFlags(test[2].get_str()); CAmount amount = 0; fValid = VerifyScript(tx.vin[i].scriptSig, mapprevOutScriptPubKeys[tx.vin[i].prevout], - verify_flags, TransactionSignatureChecker(&tx, i, amount, cachedHashes), &err); + verify_flags, TransactionSignatureChecker(&tx, i, amount, txdata), &err); } BOOST_CHECK_MESSAGE(!fValid, strTest + comment); BOOST_CHECK_MESSAGE(err != SCRIPT_ERR_OK, ScriptErrorString(err) + comment); @@ -606,7 +606,7 @@ BOOST_AUTO_TEST_CASE(test_big_overwinter_transaction) { ssout >> tx; // check all inputs concurrently, with the cache - CachedHashes cachedHashes(tx); + PrecomputedTransactionData txdata(tx); boost::thread_group threadGroup; CCheckQueue scriptcheckqueue(128); CCheckQueueControl control(&scriptcheckqueue); @@ -626,7 +626,7 @@ BOOST_AUTO_TEST_CASE(test_big_overwinter_transaction) { for(uint32_t i = 0; i < mtx.vin.size(); i++) { std::vector vChecks; - CScriptCheck check(coins, tx, i, SCRIPT_VERIFY_P2SH, false, &cachedHashes); + CScriptCheck check(coins, tx, i, SCRIPT_VERIFY_P2SH, false, &txdata); vChecks.push_back(CScriptCheck()); check.swap(vChecks.back()); control.Add(vChecks); From be12669982b86313e76500908400bcc98f8c2a97 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 2 Feb 2018 01:49:42 +0000 Subject: [PATCH 0495/1062] Add consensus branch ID parameter to SignatureHash, remove SigVersion parameter We do not need to be able to calculate multiple SignatureHash versions for a single transaction format; instead, we use the transaction format to determine the SigVersion. The consensus branch ID *does* need to be passed in from the outside, as only the caller knows the context in which the SignatureHash is being calculated (ie. mempool acceptance vs. block validation). JoinSplit signature verification has been moved into ContextualCheckTransaction, where the consensus branch ID can be obtained. The argument to the sign command for zcash-tx has been modified to take a height in addition to the optional sigtype flags. --- src/bitcoin-tx.cpp | 33 +++- src/gtest/test_checktransaction.cpp | 14 +- src/gtest/test_validation.cpp | 4 +- src/main.cpp | 77 ++++----- src/main.h | 13 +- src/miner.cpp | 4 +- src/rpcrawtransaction.cpp | 10 +- src/script/interpreter.cpp | 33 ++-- src/script/interpreter.h | 14 +- src/script/sign.cpp | 59 +++---- src/script/sign.h | 14 +- src/script/zcashconsensus.cpp | 4 +- src/test/DoS_tests.cpp | 7 +- src/test/data/bitcoin-util-test.json | 2 +- src/test/multisig_tests.cpp | 36 +++-- src/test/script_P2SH_tests.cpp | 28 ++-- src/test/script_tests.cpp | 152 ++++++++++-------- src/test/sighash_tests.cpp | 21 ++- src/test/transaction_tests.cpp | 29 ++-- src/utiltest.cpp | 10 +- src/wallet/asyncrpcoperation_sendmany.cpp | 9 +- src/wallet/asyncrpcoperation_sendmany.h | 1 + .../asyncrpcoperation_shieldcoinbase.cpp | 6 +- src/wallet/rpcwallet.cpp | 4 +- src/wallet/wallet.cpp | 8 +- src/zcbenchmarks.cpp | 5 +- 26 files changed, 360 insertions(+), 237 deletions(-) diff --git a/src/bitcoin-tx.cpp b/src/bitcoin-tx.cpp index 72efd2282..710d0082f 100644 --- a/src/bitcoin-tx.cpp +++ b/src/bitcoin-tx.cpp @@ -6,6 +6,7 @@ #include "clientversion.h" #include "coins.h" #include "consensus/consensus.h" +#include "consensus/upgrades.h" #include "core_io.h" #include "keystore.h" #include "primitives/transaction.h" @@ -70,7 +71,7 @@ static bool AppInitRawTx(int argc, char* argv[]) strUsage += HelpMessageOpt("nversion=N", _("Set TX version to N")); strUsage += HelpMessageOpt("outaddr=VALUE:ADDRESS", _("Add address-based output to TX")); strUsage += HelpMessageOpt("outscript=VALUE:SCRIPT", _("Add raw script output to TX")); - strUsage += HelpMessageOpt("sign=SIGHASH-FLAGS", _("Add zero or more signatures to transaction") + ". " + + strUsage += HelpMessageOpt("sign=HEIGHT:SIGHASH-FLAGS", _("Add zero or more signatures to transaction") + ". " + _("This command requires JSON registers:") + _("prevtxs=JSON object") + ", " + _("privatekeys=JSON object") + ". " + @@ -334,10 +335,27 @@ static CAmount AmountFromValue(const UniValue& value) return amount; } -static void MutateTxSign(CMutableTransaction& tx, const string& flagStr) +static void MutateTxSign(CMutableTransaction& tx, const string& strInput) { - int nHashType = SIGHASH_ALL; + // separate HEIGHT:SIGHASH-FLAGS in string + size_t pos = strInput.find(':'); + if ((pos == 0) || + (pos == (strInput.size() - 1))) + throw runtime_error("Invalid sighash flag separator"); + // extract and validate HEIGHT + string strHeight = strInput.substr(0, pos); + int nHeight = atoi(strHeight); + if (nHeight <= 0) { + throw runtime_error("invalid height"); + } + + // extract and validate SIGHASH-FLAGS + int nHashType = SIGHASH_ALL; + string flagStr; + if (pos != string::npos) { + flagStr = strInput.substr(pos + 1, string::npos); + } if (flagStr.size() > 0) if (!findSighashFlags(nHashType, flagStr)) throw runtime_error("unknown sighash flag/sign option"); @@ -427,6 +445,9 @@ static void MutateTxSign(CMutableTransaction& tx, const string& flagStr) bool fHashSingle = ((nHashType & ~SIGHASH_ANYONECANPAY) == SIGHASH_SINGLE); + // Grab the consensus branch ID for the given height + auto consensusBranchId = CurrentEpochBranchId(nHeight, Params().GetConsensus()); + // Sign what we can: for (unsigned int i = 0; i < mergedTx.vin.size(); i++) { CTxIn& txin = mergedTx.vin[i]; @@ -441,14 +462,14 @@ static void MutateTxSign(CMutableTransaction& tx, const string& flagStr) SignatureData sigdata; // Only sign SIGHASH_SINGLE if there's a corresponding output: if (!fHashSingle || (i < mergedTx.vout.size())) - ProduceSignature(MutableTransactionSignatureCreator(&keystore, &mergedTx, i, amount, nHashType), prevPubKey, sigdata); + ProduceSignature(MutableTransactionSignatureCreator(&keystore, &mergedTx, i, amount, nHashType), prevPubKey, sigdata, consensusBranchId); // ... and merge in other signatures: BOOST_FOREACH(const CTransaction& txv, txVariants) - sigdata = CombineSignatures(prevPubKey, MutableTransactionSignatureChecker(&mergedTx, i, amount), sigdata, DataFromTransaction(txv, i)); + sigdata = CombineSignatures(prevPubKey, MutableTransactionSignatureChecker(&mergedTx, i, amount), sigdata, DataFromTransaction(txv, i), consensusBranchId); UpdateTransaction(mergedTx, i, sigdata); - if (!VerifyScript(txin.scriptSig, prevPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, MutableTransactionSignatureChecker(&mergedTx, i, amount))) + if (!VerifyScript(txin.scriptSig, prevPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, MutableTransactionSignatureChecker(&mergedTx, i, amount), consensusBranchId)) fComplete = false; } diff --git a/src/gtest/test_checktransaction.cpp b/src/gtest/test_checktransaction.cpp index ec7f45342..bec9cdd6f 100644 --- a/src/gtest/test_checktransaction.cpp +++ b/src/gtest/test_checktransaction.cpp @@ -45,6 +45,8 @@ public: CMutableTransaction GetValidTransaction() { + uint32_t consensusBranchId = SPROUT_BRANCH_ID; + CMutableTransaction mtx; mtx.vin.resize(2); mtx.vin[0].prevout.hash = uint256S("0000000000000000000000000000000000000000000000000000000000000001"); @@ -74,7 +76,7 @@ CMutableTransaction GetValidTransaction() { // Empty output script. CScript scriptCode; CTransaction signTx(mtx); - uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL, 0, SIGVERSION_BASE); + uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL, 0, consensusBranchId); if (dataToBeSigned == one) { throw std::runtime_error("SignatureHash failed"); } @@ -352,23 +354,27 @@ TEST(checktransaction_tests, bad_txns_prevout_null) { } TEST(checktransaction_tests, bad_txns_invalid_joinsplit_signature) { + SelectParams(CBaseChainParams::REGTEST); + CMutableTransaction mtx = GetValidTransaction(); mtx.joinSplitSig[0] += 1; CTransaction tx(mtx); MockCValidationState state; EXPECT_CALL(state, DoS(100, false, REJECT_INVALID, "bad-txns-invalid-joinsplit-signature", false)).Times(1); - CheckTransactionWithoutProofVerification(tx, state); + ContextualCheckTransaction(tx, state, 0, 100); } TEST(checktransaction_tests, non_canonical_ed25519_signature) { + SelectParams(CBaseChainParams::REGTEST); + CMutableTransaction mtx = GetValidTransaction(); // Check that the signature is valid before we add L { CTransaction tx(mtx); MockCValidationState state; - EXPECT_TRUE(CheckTransactionWithoutProofVerification(tx, state)); + EXPECT_TRUE(ContextualCheckTransaction(tx, state, 0, 100)); } // Copied from libsodium/crypto_sign/ed25519/ref10/open.c @@ -389,7 +395,7 @@ TEST(checktransaction_tests, non_canonical_ed25519_signature) { MockCValidationState state; EXPECT_CALL(state, DoS(100, false, REJECT_INVALID, "bad-txns-invalid-joinsplit-signature", false)).Times(1); - CheckTransactionWithoutProofVerification(tx, state); + ContextualCheckTransaction(tx, state, 0, 100); } TEST(checktransaction_tests, OverwinterConstructors) { diff --git a/src/gtest/test_validation.cpp b/src/gtest/test_validation.cpp index 508616e8a..db382e96b 100644 --- a/src/gtest/test_validation.cpp +++ b/src/gtest/test_validation.cpp @@ -1,5 +1,6 @@ #include +#include "consensus/upgrades.h" #include "consensus/validation.h" #include "main.h" #include "utiltest.h" @@ -70,9 +71,10 @@ TEST(Validation, ContextualCheckInputsPassesWithCoinbase) { FakeCoinsViewDB fakeDB; CCoinsViewCache view(&fakeDB); + auto consensusBranchId = SPROUT_BRANCH_ID; CValidationState state; PrecomputedTransactionData txdata(tx); - EXPECT_TRUE(ContextualCheckInputs(tx, state, view, false, 0, false, txdata, Params(CBaseChainParams::MAIN).GetConsensus())); + EXPECT_TRUE(ContextualCheckInputs(tx, state, view, false, 0, false, txdata, Params(CBaseChainParams::MAIN).GetConsensus(), consensusBranchId)); } TEST(Validation, ReceivedBlockTransactions) { diff --git a/src/main.cpp b/src/main.cpp index b5dac6595..28bc4acf5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -758,7 +758,7 @@ bool CheckFinalTx(const CTransaction &tx, int flags) * 2. P2SH scripts with a crazy number of expensive * CHECKSIG/CHECKMULTISIG operations */ -bool AreInputsStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs) +bool AreInputsStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs, uint32_t consensusBranchId) { if (tx.IsCoinBase()) return true; // Coinbases don't use vin normally @@ -784,7 +784,7 @@ bool AreInputsStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs) // IsStandardTx() will have already returned false // and this method isn't called. vector > stack; - if (!EvalScript(stack, tx.vin[i].scriptSig, SCRIPT_VERIFY_NONE, BaseSignatureChecker(), SIGVERSION_BASE)) + if (!EvalScript(stack, tx.vin[i].scriptSig, SCRIPT_VERIFY_NONE, BaseSignatureChecker(), consensusBranchId)) return false; if (whichType == TX_SCRIPTHASH) @@ -886,6 +886,30 @@ bool ContextualCheckTransaction(const CTransaction& tx, CValidationState &state, } } + if (!(tx.IsCoinBase() || tx.vjoinsplit.empty())) { + auto consensusBranchId = CurrentEpochBranchId(nHeight, Params().GetConsensus()); + // Empty output script. + CScript scriptCode; + uint256 dataToBeSigned; + try { + dataToBeSigned = SignatureHash(scriptCode, tx, NOT_AN_INPUT, SIGHASH_ALL, 0, consensusBranchId); + } catch (std::logic_error ex) { + return state.DoS(100, error("CheckTransaction(): error computing signature hash"), + REJECT_INVALID, "error-computing-signature-hash"); + } + + BOOST_STATIC_ASSERT(crypto_sign_PUBLICKEYBYTES == 32); + + // We rely on libsodium to check that the signature is canonical. + // https://github.com/jedisct1/libsodium/commit/62911edb7ff2275cccd74bf1c8aefcc4d76924e0 + if (crypto_sign_verify_detached(&tx.joinSplitSig[0], + dataToBeSigned.begin(), 32, + tx.joinSplitPubKey.begin() + ) != 0) { + return state.DoS(100, error("CheckTransaction(): invalid joinsplit signature"), + REJECT_INVALID, "bad-txns-invalid-joinsplit-signature"); + } + } return true; } @@ -1082,30 +1106,6 @@ bool CheckTransactionWithoutProofVerification(const CTransaction& tx, CValidatio if (txin.prevout.IsNull()) return state.DoS(10, error("CheckTransaction(): prevout is null"), REJECT_INVALID, "bad-txns-prevout-null"); - - if (tx.vjoinsplit.size() > 0) { - // Empty output script. - CScript scriptCode; - uint256 dataToBeSigned; - try { - dataToBeSigned = SignatureHash(scriptCode, tx, NOT_AN_INPUT, SIGHASH_ALL, 0, SIGVERSION_BASE); - } catch (std::logic_error ex) { - return state.DoS(100, error("CheckTransaction(): error computing signature hash"), - REJECT_INVALID, "error-computing-signature-hash"); - } - - BOOST_STATIC_ASSERT(crypto_sign_PUBLICKEYBYTES == 32); - - // We rely on libsodium to check that the signature is canonical. - // https://github.com/jedisct1/libsodium/commit/62911edb7ff2275cccd74bf1c8aefcc4d76924e0 - if (crypto_sign_verify_detached(&tx.joinSplitSig[0], - dataToBeSigned.begin(), 32, - tx.joinSplitPubKey.begin() - ) != 0) { - return state.DoS(100, error("CheckTransaction(): invalid joinsplit signature"), - REJECT_INVALID, "bad-txns-invalid-joinsplit-signature"); - } - } } return true; @@ -1148,6 +1148,9 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa if (pfMissingInputs) *pfMissingInputs = false; + int nextBlockHeight = chainActive.Height() + 1; + auto consensusBranchId = CurrentEpochBranchId(nextBlockHeight, Params().GetConsensus()); + // Node operator can choose to reject tx by number of transparent inputs static_assert(std::numeric_limits::max() >= std::numeric_limits::max(), "size_t too small"); size_t limit = (size_t) GetArg("-mempooltxinputlimit", 0); @@ -1165,7 +1168,6 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa // DoS level set to 10 to be more forgiving. // Check transaction contextually against the set of consensus rules which apply in the next block to be mined. - int nextBlockHeight = chainActive.Height() + 1; if (!ContextualCheckTransaction(tx, state, nextBlockHeight, 10)) { return error("AcceptToMemoryPool: ContextualCheckTransaction failed"); } @@ -1260,7 +1262,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa } // Check for non-standard pay-to-script-hash in inputs - if (Params().RequireStandard() && !AreInputsStandard(tx, view)) + if (Params().RequireStandard() && !AreInputsStandard(tx, view, consensusBranchId)) return error("AcceptToMemoryPool: nonstandard transaction input"); // Check that the transaction doesn't have an excessive number of @@ -1348,7 +1350,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa // Check against previous transactions // This is done last to help prevent CPU exhaustion denial-of-service attacks. PrecomputedTransactionData txdata(tx); - if (!ContextualCheckInputs(tx, state, view, true, STANDARD_SCRIPT_VERIFY_FLAGS, true, txdata, Params().GetConsensus())) + if (!ContextualCheckInputs(tx, state, view, true, STANDARD_SCRIPT_VERIFY_FLAGS, true, txdata, Params().GetConsensus(), consensusBranchId)) { return error("AcceptToMemoryPool: ConnectInputs failed %s", hash.ToString()); } @@ -1362,7 +1364,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa // There is a similar check in CreateNewBlock() to prevent creating // invalid blocks, however allowing such transactions into the mempool // can be exploited as a DoS attack. - if (!ContextualCheckInputs(tx, state, view, true, MANDATORY_SCRIPT_VERIFY_FLAGS, true, txdata, Params().GetConsensus())) + if (!ContextualCheckInputs(tx, state, view, true, MANDATORY_SCRIPT_VERIFY_FLAGS, true, txdata, Params().GetConsensus(), consensusBranchId)) { return error("AcceptToMemoryPool: BUG! PLEASE REPORT THIS! ConnectInputs failed against MANDATORY but not STANDARD flags %s", hash.ToString()); } @@ -1727,7 +1729,7 @@ void UpdateCoins(const CTransaction& tx, CCoinsViewCache& inputs, int nHeight) bool CScriptCheck::operator()() { const CScript &scriptSig = ptxTo->vin[nIn].scriptSig; - if (!VerifyScript(scriptSig, scriptPubKey, nFlags, CachingTransactionSignatureChecker(ptxTo, nIn, amount, cacheStore, *txdata), &error)) { + if (!VerifyScript(scriptSig, scriptPubKey, nFlags, CachingTransactionSignatureChecker(ptxTo, nIn, amount, cacheStore, *txdata), consensusBranchId, &error)) { return ::error("CScriptCheck(): %s:%d VerifySignature failed: %s", ptxTo->GetHash().ToString(), nIn, ScriptErrorString(error)); } return true; @@ -1810,7 +1812,7 @@ bool CheckTxInputs(const CTransaction& tx, CValidationState& state, const CCoins } }// namespace Consensus -bool ContextualCheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsViewCache &inputs, bool fScriptChecks, unsigned int flags, bool cacheStore, PrecomputedTransactionData& txdata, const Consensus::Params& consensusParams, std::vector *pvChecks) +bool ContextualCheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsViewCache &inputs, bool fScriptChecks, unsigned int flags, bool cacheStore, PrecomputedTransactionData& txdata, const Consensus::Params& consensusParams, uint32_t consensusBranchId, std::vector *pvChecks) { if (!tx.IsCoinBase()) { @@ -1835,7 +1837,7 @@ bool ContextualCheckInputs(const CTransaction& tx, CValidationState &state, cons assert(coins); // Verify signature - CScriptCheck check(*coins, tx, i, flags, cacheStore, &txdata); + CScriptCheck check(*coins, tx, i, flags, cacheStore, consensusBranchId, &txdata); if (pvChecks) { pvChecks->push_back(CScriptCheck()); check.swap(pvChecks->back()); @@ -1848,7 +1850,7 @@ bool ContextualCheckInputs(const CTransaction& tx, CValidationState &state, cons // avoid splitting the network between upgraded and // non-upgraded nodes. CScriptCheck check2(*coins, tx, i, - flags & ~STANDARD_NOT_MANDATORY_VERIFY_FLAGS, cacheStore, &txdata); + flags & ~STANDARD_NOT_MANDATORY_VERIFY_FLAGS, cacheStore, consensusBranchId, &txdata); if (check2()) return state.Invalid(false, REJECT_NONSTANDARD, strprintf("non-mandatory-script-verify-flag (%s)", ScriptErrorString(check.GetScriptError()))); } @@ -2238,6 +2240,9 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin assert(tree.root() == old_tree_root); } + // Grab the consensus branch ID for the block's height + auto consensusBranchId = CurrentEpochBranchId(pindex->nHeight, Params().GetConsensus()); + std::vector txdata; txdata.reserve(block.vtx.size()); // Required so that pointers to individual PrecomputedTransactionData don't get invalidated for (unsigned int i = 0; i < block.vtx.size(); i++) @@ -2277,7 +2282,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin nFees += view.GetValueIn(tx)-tx.GetValueOut(); std::vector vChecks; - if (!ContextualCheckInputs(tx, state, view, fExpensiveChecks, flags, false, txdata[i], chainparams.GetConsensus(), nScriptCheckThreads ? &vChecks : NULL)) + if (!ContextualCheckInputs(tx, state, view, fExpensiveChecks, flags, false, txdata[i], chainparams.GetConsensus(), consensusBranchId, nScriptCheckThreads ? &vChecks : NULL)) return false; control.Add(vChecks); } @@ -3721,7 +3726,7 @@ bool static LoadBlockIndexDB() pindex->nCachedBranchId = pindex->pprev->nCachedBranchId; } } else { - pindex->nCachedBranchId = NetworkUpgradeInfo[Consensus::BASE_SPROUT].nBranchId; + pindex->nCachedBranchId = SPROUT_BRANCH_ID; } if (pindex->IsValid(BLOCK_VALID_TRANSACTIONS) && (pindex->nChainTx || pindex->pprev == NULL)) setBlockIndexCandidates.insert(pindex); diff --git a/src/main.h b/src/main.h index e2a386e62..d868f032b 100644 --- a/src/main.h +++ b/src/main.h @@ -306,7 +306,7 @@ CAmount GetMinRelayFee(const CTransaction& tx, unsigned int nBytes, bool fAllowF * @param[in] mapInputs Map of previous transactions that have outputs we're spending * @return True if all inputs (scriptSigs) use only standard transaction forms */ -bool AreInputsStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs); +bool AreInputsStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs, uint32_t consensusBranchId); /** * Count ECDSA signature operations the old-fashioned (pre-0.6) way @@ -331,7 +331,8 @@ unsigned int GetP2SHSigOpCount(const CTransaction& tx, const CCoinsViewCache& ma * instead of being performed inline. */ bool ContextualCheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsViewCache &view, bool fScriptChecks, - unsigned int flags, bool cacheStore, PrecomputedTransactionData& txdata, const Consensus::Params& consensusParams, + unsigned int flags, bool cacheStore, PrecomputedTransactionData& txdata, + const Consensus::Params& consensusParams, uint32_t consensusBranchId, std::vector *pvChecks = NULL); /** Check a transaction contextually against a set of consensus rules */ @@ -390,14 +391,15 @@ private: unsigned int nIn; unsigned int nFlags; bool cacheStore; + uint32_t consensusBranchId; ScriptError error; PrecomputedTransactionData *txdata; public: - CScriptCheck(): amount(0), ptxTo(0), nIn(0), nFlags(0), cacheStore(false), error(SCRIPT_ERR_UNKNOWN_ERROR) {} - CScriptCheck(const CCoins& txFromIn, const CTransaction& txToIn, unsigned int nInIn, unsigned int nFlagsIn, bool cacheIn, PrecomputedTransactionData* txdataIn) : + CScriptCheck(): amount(0), ptxTo(0), nIn(0), nFlags(0), cacheStore(false), consensusBranchId(0), error(SCRIPT_ERR_UNKNOWN_ERROR) {} + CScriptCheck(const CCoins& txFromIn, const CTransaction& txToIn, unsigned int nInIn, unsigned int nFlagsIn, bool cacheIn, uint32_t consensusBranchIdIn, PrecomputedTransactionData* txdataIn) : scriptPubKey(txFromIn.vout[txToIn.vin[nInIn].prevout.n].scriptPubKey), amount(txFromIn.vout[txToIn.vin[nInIn].prevout.n].nValue), - ptxTo(&txToIn), nIn(nInIn), nFlags(nFlagsIn), cacheStore(cacheIn), error(SCRIPT_ERR_UNKNOWN_ERROR), txdata(txdataIn) { } + ptxTo(&txToIn), nIn(nInIn), nFlags(nFlagsIn), cacheStore(cacheIn), consensusBranchId(consensusBranchIdIn), error(SCRIPT_ERR_UNKNOWN_ERROR), txdata(txdataIn) { } bool operator()(); @@ -408,6 +410,7 @@ public: std::swap(nIn, check.nIn); std::swap(nFlags, check.nFlags); std::swap(cacheStore, check.cacheStore); + std::swap(consensusBranchId, check.consensusBranchId); std::swap(error, check.error); std::swap(txdata, check.txdata); } diff --git a/src/miner.cpp b/src/miner.cpp index 3d7a67329..d87205c64 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -12,6 +12,7 @@ #include "base58.h" #include "chainparams.h" #include "consensus/consensus.h" +#include "consensus/upgrades.h" #include "consensus/validation.h" #ifdef ENABLE_MINING #include "crypto/equihash.h" @@ -143,6 +144,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) LOCK2(cs_main, mempool.cs); CBlockIndex* pindexPrev = chainActive.Tip(); const int nHeight = pindexPrev->nHeight + 1; + uint32_t consensusBranchId = CurrentEpochBranchId(nHeight, chainparams.GetConsensus()); pblock->nTime = GetAdjustedTime(); const int64_t nMedianTimePast = pindexPrev->GetMedianTimePast(); CCoinsViewCache view(pcoinsTip); @@ -294,7 +296,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) // create only contains transactions that are valid in new blocks. CValidationState state; PrecomputedTransactionData txdata(tx); - if (!ContextualCheckInputs(tx, state, view, true, MANDATORY_SCRIPT_VERIFY_FLAGS, true, txdata, Params().GetConsensus())) + if (!ContextualCheckInputs(tx, state, view, true, MANDATORY_SCRIPT_VERIFY_FLAGS, true, txdata, Params().GetConsensus(), consensusBranchId)) continue; UpdateCoins(tx, view, nHeight); diff --git a/src/rpcrawtransaction.cpp b/src/rpcrawtransaction.cpp index 42e162b08..2f89529de 100644 --- a/src/rpcrawtransaction.cpp +++ b/src/rpcrawtransaction.cpp @@ -4,6 +4,7 @@ // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "base58.h" +#include "consensus/upgrades.h" #include "consensus/validation.h" #include "core_io.h" #include "init.h" @@ -839,6 +840,9 @@ UniValue signrawtransaction(const UniValue& params, bool fHelp) bool fHashSingle = ((nHashType & ~SIGHASH_ANYONECANPAY) == SIGHASH_SINGLE); + // Grab the current consensus branch ID + auto consensusBranchId = CurrentEpochBranchId(chainActive.Height() + 1, Params().GetConsensus()); + // Script verification errors UniValue vErrors(UniValue::VARR); @@ -859,17 +863,17 @@ UniValue signrawtransaction(const UniValue& params, bool fHelp) SignatureData sigdata; // Only sign SIGHASH_SINGLE if there's a corresponding output: if (!fHashSingle || (i < mergedTx.vout.size())) - ProduceSignature(MutableTransactionSignatureCreator(&keystore, &mergedTx, i, amount, nHashType), prevPubKey, sigdata); + ProduceSignature(MutableTransactionSignatureCreator(&keystore, &mergedTx, i, amount, nHashType), prevPubKey, sigdata, consensusBranchId); // ... and merge in other signatures: BOOST_FOREACH(const CMutableTransaction& txv, txVariants) { - sigdata = CombineSignatures(prevPubKey, TransactionSignatureChecker(&txConst, i, amount), sigdata, DataFromTransaction(txv, i)); + sigdata = CombineSignatures(prevPubKey, TransactionSignatureChecker(&txConst, i, amount), sigdata, DataFromTransaction(txv, i), consensusBranchId); } UpdateTransaction(mergedTx, i, sigdata); ScriptError serror = SCRIPT_ERR_OK; - if (!VerifyScript(txin.scriptSig, prevPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, TransactionSignatureChecker(&txConst, i, amount), &serror)) { + if (!VerifyScript(txin.scriptSig, prevPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, TransactionSignatureChecker(&txConst, i, amount), consensusBranchId, &serror)) { TxInErrorToJSON(txin, vErrors, ScriptErrorString(serror)); } } diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 75edd4941..beb16ebef 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -232,7 +232,7 @@ bool static CheckMinimalPush(const valtype& data, opcodetype opcode) { return true; } -bool EvalScript(vector >& stack, const CScript& script, unsigned int flags, const BaseSignatureChecker& checker, SigVersion sigversion, ScriptError* serror) +bool EvalScript(vector >& stack, const CScript& script, unsigned int flags, const BaseSignatureChecker& checker, uint32_t consensusBranchId, ScriptError* serror) { static const CScriptNum bnZero(0); static const CScriptNum bnOne(1); @@ -828,7 +828,7 @@ bool EvalScript(vector >& stack, const CScript& script, un //serror is set return false; } - bool fSuccess = checker.CheckSig(vchSig, vchPubKey, script, sigversion); + bool fSuccess = checker.CheckSig(vchSig, vchPubKey, script, consensusBranchId); popstack(stack); popstack(stack); @@ -886,7 +886,7 @@ bool EvalScript(vector >& stack, const CScript& script, un } // Check signature - bool fOk = checker.CheckSig(vchSig, vchPubKey, script, sigversion); + bool fOk = checker.CheckSig(vchSig, vchPubKey, script, consensusBranchId); if (fOk) { isig++; @@ -1083,14 +1083,25 @@ PrecomputedTransactionData::PrecomputedTransactionData(const CTransaction& txTo) hashOutputs = GetOutputsHash(txTo); } -uint256 SignatureHash(const CScript& scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType, const CAmount& amount, SigVersion sigversion, const PrecomputedTransactionData* cache) +SigVersion SignatureHashVersion(const CTransaction& txTo) +{ + if (txTo.fOverwintered) { + return SIGVERSION_OVERWINTER; + } else { + return SIGVERSION_SPROUT; + } +} + +uint256 SignatureHash(const CScript& scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType, const CAmount& amount, uint32_t consensusBranchId, const PrecomputedTransactionData* cache) { if (nIn >= txTo.vin.size() && nIn != NOT_AN_INPUT) { // nIn out of range throw logic_error("input index is out of range"); } - if (sigversion == SIGVERSION_WITNESS_V0) { + auto sigversion = SignatureHashVersion(txTo); + + if (sigversion == SIGVERSION_OVERWINTER) { uint256 hashPrevouts; uint256 hashSequence; uint256 hashOutputs; @@ -1159,7 +1170,7 @@ bool TransactionSignatureChecker::VerifySignature(const std::vector& vchSigIn, const vector& vchPubKey, const CScript& scriptCode, SigVersion sigversion) const +bool TransactionSignatureChecker::CheckSig(const vector& vchSigIn, const vector& vchPubKey, const CScript& scriptCode, uint32_t consensusBranchId) const { CPubKey pubkey(vchPubKey); if (!pubkey.IsValid()) @@ -1174,7 +1185,7 @@ bool TransactionSignatureChecker::CheckSig(const vector& vchSigIn uint256 sighash; try { - sighash = SignatureHash(scriptCode, *txTo, nIn, nHashType, amount, sigversion, this->txdata); + sighash = SignatureHash(scriptCode, *txTo, nIn, nHashType, amount, consensusBranchId, this->txdata); } catch (logic_error ex) { return false; } @@ -1222,7 +1233,7 @@ bool TransactionSignatureChecker::CheckLockTime(const CScriptNum& nLockTime) con } -bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* serror) +bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigned int flags, const BaseSignatureChecker& checker, uint32_t consensusBranchId, ScriptError* serror) { set_error(serror, SCRIPT_ERR_UNKNOWN_ERROR); @@ -1231,12 +1242,12 @@ bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigne } vector > stack, stackCopy; - if (!EvalScript(stack, scriptSig, flags, checker, SIGVERSION_BASE, serror)) + if (!EvalScript(stack, scriptSig, flags, checker, consensusBranchId, serror)) // serror is set return false; if (flags & SCRIPT_VERIFY_P2SH) stackCopy = stack; - if (!EvalScript(stack, scriptPubKey, flags, checker, SIGVERSION_BASE, serror)) + if (!EvalScript(stack, scriptPubKey, flags, checker, consensusBranchId, serror)) // serror is set return false; if (stack.empty()) @@ -1263,7 +1274,7 @@ bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigne CScript pubKey2(pubKeySerialized.begin(), pubKeySerialized.end()); popstack(stack); - if (!EvalScript(stack, pubKey2, flags, checker, SIGVERSION_BASE, serror)) + if (!EvalScript(stack, pubKey2, flags, checker, consensusBranchId, serror)) // serror is set return false; if (stack.empty()) diff --git a/src/script/interpreter.h b/src/script/interpreter.h index fe97bd63c..7d4ed974b 100644 --- a/src/script/interpreter.h +++ b/src/script/interpreter.h @@ -97,16 +97,16 @@ struct PrecomputedTransactionData enum SigVersion { - SIGVERSION_BASE = 0, - SIGVERSION_WITNESS_V0 = 1, + SIGVERSION_SPROUT = 0, + SIGVERSION_OVERWINTER = 1, }; -uint256 SignatureHash(const CScript &scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType, const CAmount& amount, SigVersion sigversion, const PrecomputedTransactionData* cache = NULL); +uint256 SignatureHash(const CScript &scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType, const CAmount& amount, uint32_t consensusBranchId, const PrecomputedTransactionData* cache = NULL); class BaseSignatureChecker { public: - virtual bool CheckSig(const std::vector& scriptSig, const std::vector& vchPubKey, const CScript& scriptCode, SigVersion sigversion) const + virtual bool CheckSig(const std::vector& scriptSig, const std::vector& vchPubKey, const CScript& scriptCode, uint32_t consensusBranchId) const { return false; } @@ -133,7 +133,7 @@ protected: public: TransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn) : txTo(txToIn), nIn(nInIn), amount(amountIn), txdata(NULL) {} TransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn, const PrecomputedTransactionData& txdataIn) : txTo(txToIn), nIn(nInIn), amount(amountIn), txdata(&txdataIn) {} - bool CheckSig(const std::vector& scriptSig, const std::vector& vchPubKey, const CScript& scriptCode, SigVersion sigversion) const; + bool CheckSig(const std::vector& scriptSig, const std::vector& vchPubKey, const CScript& scriptCode, uint32_t consensusBranchId) const; bool CheckLockTime(const CScriptNum& nLockTime) const; }; @@ -146,7 +146,7 @@ public: MutableTransactionSignatureChecker(const CMutableTransaction* txToIn, unsigned int nInIn, const CAmount& amount) : TransactionSignatureChecker(&txTo, nInIn, amount), txTo(*txToIn) {} }; -bool EvalScript(std::vector >& stack, const CScript& script, unsigned int flags, const BaseSignatureChecker& checker, SigVersion sigversion, ScriptError* error = NULL); -bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* serror = NULL); +bool EvalScript(std::vector >& stack, const CScript& script, unsigned int flags, const BaseSignatureChecker& checker, uint32_t consensusBranchId, ScriptError* error = NULL); +bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigned int flags, const BaseSignatureChecker& checker, uint32_t consensusBranchId, ScriptError* serror = NULL); #endif // BITCOIN_SCRIPT_INTERPRETER_H diff --git a/src/script/sign.cpp b/src/script/sign.cpp index 790d03b63..0fe89ece8 100644 --- a/src/script/sign.cpp +++ b/src/script/sign.cpp @@ -19,7 +19,7 @@ typedef vector valtype; TransactionSignatureCreator::TransactionSignatureCreator(const CKeyStore* keystoreIn, const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn, int nHashTypeIn) : BaseSignatureCreator(keystoreIn), txTo(txToIn), nIn(nInIn), nHashType(nHashTypeIn), amount(amountIn), checker(txTo, nIn, amountIn) {} -bool TransactionSignatureCreator::CreateSig(std::vector& vchSig, const CKeyID& address, const CScript& scriptCode, SigVersion sigversion) const +bool TransactionSignatureCreator::CreateSig(std::vector& vchSig, const CKeyID& address, const CScript& scriptCode, uint32_t consensusBranchId) const { CKey key; if (!keystore->GetKey(address, key)) @@ -27,7 +27,7 @@ bool TransactionSignatureCreator::CreateSig(std::vector& vchSig, uint256 hash; try { - hash = SignatureHash(scriptCode, *txTo, nIn, nHashType, amount, sigversion); + hash = SignatureHash(scriptCode, *txTo, nIn, nHashType, amount, consensusBranchId); } catch (logic_error ex) { return false; } @@ -38,16 +38,16 @@ bool TransactionSignatureCreator::CreateSig(std::vector& vchSig, return true; } -static bool Sign1(const CKeyID& address, const BaseSignatureCreator& creator, const CScript& scriptCode, std::vector& ret, SigVersion sigversion) +static bool Sign1(const CKeyID& address, const BaseSignatureCreator& creator, const CScript& scriptCode, std::vector& ret, uint32_t consensusBranchId) { vector vchSig; - if (!creator.CreateSig(vchSig, address, scriptCode, sigversion)) + if (!creator.CreateSig(vchSig, address, scriptCode, consensusBranchId)) return false; ret.push_back(vchSig); return true; } -static bool SignN(const vector& multisigdata, const BaseSignatureCreator& creator, const CScript& scriptCode, std::vector& ret, SigVersion sigversion) +static bool SignN(const vector& multisigdata, const BaseSignatureCreator& creator, const CScript& scriptCode, std::vector& ret, uint32_t consensusBranchId) { int nSigned = 0; int nRequired = multisigdata.front()[0]; @@ -55,7 +55,7 @@ static bool SignN(const vector& multisigdata, const BaseSignatureCreato { const valtype& pubkey = multisigdata[i]; CKeyID keyID = CPubKey(pubkey).GetID(); - if (Sign1(keyID, creator, scriptCode, ret, sigversion)) + if (Sign1(keyID, creator, scriptCode, ret, consensusBranchId)) ++nSigned; } return nSigned==nRequired; @@ -68,7 +68,7 @@ static bool SignN(const vector& multisigdata, const BaseSignatureCreato * Returns false if scriptPubKey could not be completely satisfied. */ static bool SignStep(const BaseSignatureCreator& creator, const CScript& scriptPubKey, - std::vector& ret, txnouttype& whichTypeRet, SigVersion sigversion) + std::vector& ret, txnouttype& whichTypeRet, uint32_t consensusBranchId) { CScript scriptRet; uint160 h160; @@ -86,10 +86,10 @@ static bool SignStep(const BaseSignatureCreator& creator, const CScript& scriptP return false; case TX_PUBKEY: keyID = CPubKey(vSolutions[0]).GetID(); - return Sign1(keyID, creator, scriptPubKey, ret, sigversion); + return Sign1(keyID, creator, scriptPubKey, ret, consensusBranchId); case TX_PUBKEYHASH: keyID = CKeyID(uint160(vSolutions[0])); - if (!Sign1(keyID, creator, scriptPubKey, ret, sigversion)) + if (!Sign1(keyID, creator, scriptPubKey, ret, consensusBranchId)) return false; else { @@ -107,7 +107,7 @@ static bool SignStep(const BaseSignatureCreator& creator, const CScript& scriptP case TX_MULTISIG: ret.push_back(valtype()); // workaround CHECKMULTISIG bug - return (SignN(vSolutions, creator, scriptPubKey, ret, sigversion)); + return (SignN(vSolutions, creator, scriptPubKey, ret, consensusBranchId)); default: return false; @@ -129,13 +129,13 @@ static CScript PushAll(const vector& values) return result; } -bool ProduceSignature(const BaseSignatureCreator& creator, const CScript& fromPubKey, SignatureData& sigdata) +bool ProduceSignature(const BaseSignatureCreator& creator, const CScript& fromPubKey, SignatureData& sigdata, uint32_t consensusBranchId) { CScript script = fromPubKey; bool solved = true; std::vector result; txnouttype whichType; - solved = SignStep(creator, script, result, whichType, SIGVERSION_BASE); + solved = SignStep(creator, script, result, whichType, consensusBranchId); CScript subscript; if (solved && whichType == TX_SCRIPTHASH) @@ -144,14 +144,14 @@ bool ProduceSignature(const BaseSignatureCreator& creator, const CScript& fromPu // the final scriptSig is the signatures from that // and then the serialized subscript: script = subscript = CScript(result[0].begin(), result[0].end()); - solved = solved && SignStep(creator, script, result, whichType, SIGVERSION_BASE) && whichType != TX_SCRIPTHASH; + solved = solved && SignStep(creator, script, result, whichType, consensusBranchId) && whichType != TX_SCRIPTHASH; result.push_back(std::vector(subscript.begin(), subscript.end())); } sigdata.scriptSig = PushAll(result); // Test solution - return solved && VerifyScript(sigdata.scriptSig, fromPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, creator.Checker()); + return solved && VerifyScript(sigdata.scriptSig, fromPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, creator.Checker(), consensusBranchId); } SignatureData DataFromTransaction(const CMutableTransaction& tx, unsigned int nIn) @@ -168,7 +168,7 @@ void UpdateTransaction(CMutableTransaction& tx, unsigned int nIn, const Signatur tx.vin[nIn].scriptSig = data.scriptSig; } -bool SignSignature(const CKeyStore &keystore, const CScript& fromPubKey, CMutableTransaction& txTo, unsigned int nIn, const CAmount& amount, int nHashType) +bool SignSignature(const CKeyStore &keystore, const CScript& fromPubKey, CMutableTransaction& txTo, unsigned int nIn, const CAmount& amount, int nHashType, uint32_t consensusBranchId) { assert(nIn < txTo.vin.size()); @@ -176,24 +176,24 @@ bool SignSignature(const CKeyStore &keystore, const CScript& fromPubKey, CMutabl TransactionSignatureCreator creator(&keystore, &txToConst, nIn, amount, nHashType); SignatureData sigdata; - bool ret = ProduceSignature(creator, fromPubKey, sigdata); + bool ret = ProduceSignature(creator, fromPubKey, sigdata, consensusBranchId); UpdateTransaction(txTo, nIn, sigdata); return ret; } -bool SignSignature(const CKeyStore &keystore, const CTransaction& txFrom, CMutableTransaction& txTo, unsigned int nIn, int nHashType) +bool SignSignature(const CKeyStore &keystore, const CTransaction& txFrom, CMutableTransaction& txTo, unsigned int nIn, int nHashType, uint32_t consensusBranchId) { assert(nIn < txTo.vin.size()); CTxIn& txin = txTo.vin[nIn]; assert(txin.prevout.n < txFrom.vout.size()); const CTxOut& txout = txFrom.vout[txin.prevout.n]; - return SignSignature(keystore, txout.scriptPubKey, txTo, nIn, txout.nValue, nHashType); + return SignSignature(keystore, txout.scriptPubKey, txTo, nIn, txout.nValue, nHashType, consensusBranchId); } static vector CombineMultisig(const CScript& scriptPubKey, const BaseSignatureChecker& checker, const vector& vSolutions, - const vector& sigs1, const vector& sigs2, SigVersion sigversion) + const vector& sigs1, const vector& sigs2, uint32_t consensusBranchId) { // Combine all the signatures we've got: set allsigs; @@ -221,7 +221,7 @@ static vector CombineMultisig(const CScript& scriptPubKey, const BaseSi if (sigs.count(pubkey)) continue; // Already got a sig for this pubkey - if (checker.CheckSig(sig, pubkey, scriptPubKey, sigversion)) + if (checker.CheckSig(sig, pubkey, scriptPubKey, consensusBranchId)) { sigs[pubkey] = sig; break; @@ -254,8 +254,8 @@ struct Stacks Stacks() {} explicit Stacks(const std::vector& scriptSigStack_) : script(scriptSigStack_) {} - explicit Stacks(const SignatureData& data) { - EvalScript(script, data.scriptSig, SCRIPT_VERIFY_STRICTENC, BaseSignatureChecker(), SIGVERSION_BASE); + explicit Stacks(const SignatureData& data, uint32_t consensusBranchId) { + EvalScript(script, data.scriptSig, SCRIPT_VERIFY_STRICTENC, BaseSignatureChecker(), consensusBranchId); } SignatureData Output() const { @@ -268,7 +268,7 @@ struct Stacks static Stacks CombineSignatures(const CScript& scriptPubKey, const BaseSignatureChecker& checker, const txnouttype txType, const vector& vSolutions, - Stacks sigs1, Stacks sigs2, SigVersion sigversion) + Stacks sigs1, Stacks sigs2, uint32_t consensusBranchId) { switch (txType) { @@ -300,25 +300,26 @@ static Stacks CombineSignatures(const CScript& scriptPubKey, const BaseSignature Solver(pubKey2, txType2, vSolutions2); sigs1.script.pop_back(); sigs2.script.pop_back(); - Stacks result = CombineSignatures(pubKey2, checker, txType2, vSolutions2, sigs1, sigs2, sigversion); + Stacks result = CombineSignatures(pubKey2, checker, txType2, vSolutions2, sigs1, sigs2, consensusBranchId); result.script.push_back(spk); return result; } case TX_MULTISIG: - return Stacks(CombineMultisig(scriptPubKey, checker, vSolutions, sigs1.script, sigs2.script, sigversion)); + return Stacks(CombineMultisig(scriptPubKey, checker, vSolutions, sigs1.script, sigs2.script, consensusBranchId)); default: return Stacks(); } } SignatureData CombineSignatures(const CScript& scriptPubKey, const BaseSignatureChecker& checker, - const SignatureData& scriptSig1, const SignatureData& scriptSig2) + const SignatureData& scriptSig1, const SignatureData& scriptSig2, + uint32_t consensusBranchId) { txnouttype txType; vector > vSolutions; Solver(scriptPubKey, txType, vSolutions); - return CombineSignatures(scriptPubKey, checker, txType, vSolutions, Stacks(scriptSig1), Stacks(scriptSig2), SIGVERSION_BASE).Output(); + return CombineSignatures(scriptPubKey, checker, txType, vSolutions, Stacks(scriptSig1, consensusBranchId), Stacks(scriptSig2, consensusBranchId), consensusBranchId).Output(); } namespace { @@ -328,7 +329,7 @@ class DummySignatureChecker : public BaseSignatureChecker public: DummySignatureChecker() {} - bool CheckSig(const std::vector& scriptSig, const std::vector& vchPubKey, const CScript& scriptCode, SigVersion sigversion) const + bool CheckSig(const std::vector& scriptSig, const std::vector& vchPubKey, const CScript& scriptCode, uint32_t consensusBranchId) const { return true; } @@ -341,7 +342,7 @@ const BaseSignatureChecker& DummySignatureCreator::Checker() const return dummyChecker; } -bool DummySignatureCreator::CreateSig(std::vector& vchSig, const CKeyID& keyid, const CScript& scriptCode, SigVersion sigversion) const +bool DummySignatureCreator::CreateSig(std::vector& vchSig, const CKeyID& keyid, const CScript& scriptCode, uint32_t consensusBranchId) const { // Create a dummy signature that is a valid DER-encoding vchSig.assign(72, '\000'); diff --git a/src/script/sign.h b/src/script/sign.h index 5ec0f0b0f..1e9bde118 100644 --- a/src/script/sign.h +++ b/src/script/sign.h @@ -27,7 +27,7 @@ public: virtual const BaseSignatureChecker& Checker() const =0; /** Create a singular (non-script) signature. */ - virtual bool CreateSig(std::vector& vchSig, const CKeyID& keyid, const CScript& scriptCode, SigVersion sigversion) const =0; + virtual bool CreateSig(std::vector& vchSig, const CKeyID& keyid, const CScript& scriptCode, uint32_t consensusBranchId) const =0; }; /** A signature creator for transactions. */ @@ -41,7 +41,7 @@ class TransactionSignatureCreator : public BaseSignatureCreator { public: TransactionSignatureCreator(const CKeyStore* keystoreIn, const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn, int nHashTypeIn=SIGHASH_ALL); const BaseSignatureChecker& Checker() const { return checker; } - bool CreateSig(std::vector& vchSig, const CKeyID& keyid, const CScript& scriptCode, SigVersion sigversion) const; + bool CreateSig(std::vector& vchSig, const CKeyID& keyid, const CScript& scriptCode, uint32_t consensusBranchId) const; }; class MutableTransactionSignatureCreator : public TransactionSignatureCreator { @@ -56,7 +56,7 @@ class DummySignatureCreator : public BaseSignatureCreator { public: DummySignatureCreator(const CKeyStore* keystoreIn) : BaseSignatureCreator(keystoreIn) {} const BaseSignatureChecker& Checker() const; - bool CreateSig(std::vector& vchSig, const CKeyID& keyid, const CScript& scriptCode, SigVersion sigversion) const; + bool CreateSig(std::vector& vchSig, const CKeyID& keyid, const CScript& scriptCode, uint32_t consensusBranchId) const; }; struct SignatureData { @@ -67,14 +67,14 @@ struct SignatureData { }; /** Produce a script signature using a generic signature creator. */ -bool ProduceSignature(const BaseSignatureCreator& creator, const CScript& scriptPubKey, SignatureData& sigdata); +bool ProduceSignature(const BaseSignatureCreator& creator, const CScript& scriptPubKey, SignatureData& sigdata, uint32_t consensusBranchId); /** Produce a script signature for a transaction. */ -bool SignSignature(const CKeyStore &keystore, const CScript& fromPubKey, CMutableTransaction& txTo, unsigned int nIn, const CAmount& amount, int nHashType); -bool SignSignature(const CKeyStore& keystore, const CTransaction& txFrom, CMutableTransaction& txTo, unsigned int nIn, int nHashType); +bool SignSignature(const CKeyStore &keystore, const CScript& fromPubKey, CMutableTransaction& txTo, unsigned int nIn, const CAmount& amount, int nHashType, uint32_t consensusBranchId); +bool SignSignature(const CKeyStore& keystore, const CTransaction& txFrom, CMutableTransaction& txTo, unsigned int nIn, int nHashType, uint32_t consensusBranchId); /** Combine two script signatures using a generic signature checker, intelligently, possibly with OP_0 placeholders. */ -SignatureData CombineSignatures(const CScript& scriptPubKey, const BaseSignatureChecker& checker, const SignatureData& scriptSig1, const SignatureData& scriptSig2); +SignatureData CombineSignatures(const CScript& scriptPubKey, const BaseSignatureChecker& checker, const SignatureData& scriptSig1, const SignatureData& scriptSig2, uint32_t consensusBranchId); /** Extract signature data from a transaction, and insert it. */ SignatureData DataFromTransaction(const CMutableTransaction& tx, unsigned int nIn); diff --git a/src/script/zcashconsensus.cpp b/src/script/zcashconsensus.cpp index 6a85c79f6..ec494d966 100644 --- a/src/script/zcashconsensus.cpp +++ b/src/script/zcashconsensus.cpp @@ -5,6 +5,7 @@ #include "zcashconsensus.h" +#include "consensus/upgrades.h" #include "primitives/transaction.h" #include "pubkey.h" #include "script/interpreter.h" @@ -86,7 +87,8 @@ int zcashconsensus_verify_script(const unsigned char *scriptPubKey, unsigned int set_error(err, zcashconsensus_ERR_OK); PrecomputedTransactionData txdata(tx); CAmount am(0); - return VerifyScript(tx.vin[nIn].scriptSig, CScript(scriptPubKey, scriptPubKey + scriptPubKeyLen), flags, TransactionSignatureChecker(&tx, nIn, am, txdata), NULL); + uint32_t consensusBranchId = SPROUT_BRANCH_ID; + return VerifyScript(tx.vin[nIn].scriptSig, CScript(scriptPubKey, scriptPubKey + scriptPubKeyLen), flags, TransactionSignatureChecker(&tx, nIn, am, txdata), consensusBranchId, NULL); } catch (const std::exception&) { return set_error(err, zcashconsensus_ERR_TX_DESERIALIZE); // Error deserializing } diff --git a/src/test/DoS_tests.cpp b/src/test/DoS_tests.cpp index 271a37260..7641b8b2d 100644 --- a/src/test/DoS_tests.cpp +++ b/src/test/DoS_tests.cpp @@ -8,6 +8,7 @@ +#include "consensus/upgrades.h" #include "keystore.h" #include "main.h" #include "net.h" @@ -119,6 +120,8 @@ CTransaction RandomOrphan() BOOST_AUTO_TEST_CASE(DoS_mapOrphans) { + uint32_t consensusBranchId = SPROUT_BRANCH_ID; + CKey key; key.MakeNewKey(true); CBasicKeyStore keystore; @@ -151,7 +154,7 @@ BOOST_AUTO_TEST_CASE(DoS_mapOrphans) tx.vout.resize(1); tx.vout[0].nValue = 1*CENT; tx.vout[0].scriptPubKey = GetScriptForDestination(key.GetPubKey().GetID()); - SignSignature(keystore, txPrev, tx, 0, SIGHASH_ALL); + SignSignature(keystore, txPrev, tx, 0, SIGHASH_ALL, consensusBranchId); AddOrphanTx(tx, i); } @@ -171,7 +174,7 @@ BOOST_AUTO_TEST_CASE(DoS_mapOrphans) tx.vin[j].prevout.n = j; tx.vin[j].prevout.hash = txPrev.GetHash(); } - SignSignature(keystore, txPrev, tx, 0, SIGHASH_ALL); + SignSignature(keystore, txPrev, tx, 0, SIGHASH_ALL, consensusBranchId); // Re-use same signature for other inputs // (they don't have to be valid for this test) for (unsigned int j = 1; j < tx.vin.size(); j++) diff --git a/src/test/data/bitcoin-util-test.json b/src/test/data/bitcoin-util-test.json index c23befe23..3e9874157 100644 --- a/src/test/data/bitcoin-util-test.json +++ b/src/test/data/bitcoin-util-test.json @@ -53,7 +53,7 @@ "in=4d49a71ec9da436f71ec4ee231d04f292a29cd316f598bb7068feccabdc59485:0", "set=privatekeys:[\"5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreAnchuDf\"]", "set=prevtxs:[{\"txid\":\"4d49a71ec9da436f71ec4ee231d04f292a29cd316f598bb7068feccabdc59485\",\"vout\":0,\"scriptPubKey\":\"76a91491b24bf9f5288532960ac687abb035127b1d28a588ac\"}]", - "sign=ALL", + "sign=1:ALL", "outaddr=0.001:t1Ruz6gK4QPZoPPGpHaieupnnh62mktjQE7"], "output_cmp": "txcreatesign.hex" } diff --git a/src/test/multisig_tests.cpp b/src/test/multisig_tests.cpp index db19b4ce0..a7decc94e 100644 --- a/src/test/multisig_tests.cpp +++ b/src/test/multisig_tests.cpp @@ -2,6 +2,7 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. +#include "consensus/upgrades.h" #include "key.h" #include "keystore.h" #include "main.h" @@ -26,9 +27,9 @@ typedef vector valtype; BOOST_FIXTURE_TEST_SUITE(multisig_tests, BasicTestingSetup) CScript -sign_multisig(CScript scriptPubKey, vector keys, CTransaction transaction, int whichIn) +sign_multisig(CScript scriptPubKey, vector keys, CTransaction transaction, int whichIn, uint32_t consensusBranchId) { - uint256 hash = SignatureHash(scriptPubKey, transaction, whichIn, SIGHASH_ALL, 0, SIGVERSION_BASE); + uint256 hash = SignatureHash(scriptPubKey, transaction, whichIn, SIGHASH_ALL, 0, consensusBranchId); CScript result; result << OP_0; // CHECKMULTISIG bug workaround @@ -44,6 +45,7 @@ sign_multisig(CScript scriptPubKey, vector keys, CTransaction transaction, BOOST_AUTO_TEST_CASE(multisig_verify) { + uint32_t consensusBranchId = SPROUT_BRANCH_ID; unsigned int flags = SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_STRICTENC; ScriptError err; @@ -83,21 +85,21 @@ BOOST_AUTO_TEST_CASE(multisig_verify) // Test a AND b: keys.assign(1,key[0]); keys.push_back(key[1]); - s = sign_multisig(a_and_b, keys, txTo[0], 0); - BOOST_CHECK(VerifyScript(s, a_and_b, flags, MutableTransactionSignatureChecker(&txTo[0], 0, amount), &err)); + s = sign_multisig(a_and_b, keys, txTo[0], 0, consensusBranchId); + BOOST_CHECK(VerifyScript(s, a_and_b, flags, MutableTransactionSignatureChecker(&txTo[0], 0, amount), consensusBranchId, &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); for (int i = 0; i < 4; i++) { keys.assign(1,key[i]); - s = sign_multisig(a_and_b, keys, txTo[0], 0); - BOOST_CHECK_MESSAGE(!VerifyScript(s, a_and_b, flags, MutableTransactionSignatureChecker(&txTo[0], 0, amount), &err), strprintf("a&b 1: %d", i)); + s = sign_multisig(a_and_b, keys, txTo[0], 0, consensusBranchId); + BOOST_CHECK_MESSAGE(!VerifyScript(s, a_and_b, flags, MutableTransactionSignatureChecker(&txTo[0], 0, amount), consensusBranchId, &err), strprintf("a&b 1: %d", i)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_INVALID_STACK_OPERATION, ScriptErrorString(err)); keys.assign(1,key[1]); keys.push_back(key[i]); - s = sign_multisig(a_and_b, keys, txTo[0], 0); - BOOST_CHECK_MESSAGE(!VerifyScript(s, a_and_b, flags, MutableTransactionSignatureChecker(&txTo[0], 0, amount), &err), strprintf("a&b 2: %d", i)); + s = sign_multisig(a_and_b, keys, txTo[0], 0, consensusBranchId); + BOOST_CHECK_MESSAGE(!VerifyScript(s, a_and_b, flags, MutableTransactionSignatureChecker(&txTo[0], 0, amount), consensusBranchId, &err), strprintf("a&b 2: %d", i)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); } @@ -105,21 +107,21 @@ BOOST_AUTO_TEST_CASE(multisig_verify) for (int i = 0; i < 4; i++) { keys.assign(1,key[i]); - s = sign_multisig(a_or_b, keys, txTo[1], 0); + s = sign_multisig(a_or_b, keys, txTo[1], 0, consensusBranchId); if (i == 0 || i == 1) { - BOOST_CHECK_MESSAGE(VerifyScript(s, a_or_b, flags, MutableTransactionSignatureChecker(&txTo[1], 0, amount), &err), strprintf("a|b: %d", i)); + BOOST_CHECK_MESSAGE(VerifyScript(s, a_or_b, flags, MutableTransactionSignatureChecker(&txTo[1], 0, amount), consensusBranchId, &err), strprintf("a|b: %d", i)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); } else { - BOOST_CHECK_MESSAGE(!VerifyScript(s, a_or_b, flags, MutableTransactionSignatureChecker(&txTo[1], 0, amount), &err), strprintf("a|b: %d", i)); + BOOST_CHECK_MESSAGE(!VerifyScript(s, a_or_b, flags, MutableTransactionSignatureChecker(&txTo[1], 0, amount), consensusBranchId, &err), strprintf("a|b: %d", i)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); } } s.clear(); s << OP_0 << OP_1; - BOOST_CHECK(!VerifyScript(s, a_or_b, flags, MutableTransactionSignatureChecker(&txTo[1], 0, amount), &err)); + BOOST_CHECK(!VerifyScript(s, a_or_b, flags, MutableTransactionSignatureChecker(&txTo[1], 0, amount), consensusBranchId, &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_SIG_DER, ScriptErrorString(err)); @@ -128,15 +130,15 @@ BOOST_AUTO_TEST_CASE(multisig_verify) { keys.assign(1,key[i]); keys.push_back(key[j]); - s = sign_multisig(escrow, keys, txTo[2], 0); + s = sign_multisig(escrow, keys, txTo[2], 0, consensusBranchId); if (i < j && i < 3 && j < 3) { - BOOST_CHECK_MESSAGE(VerifyScript(s, escrow, flags, MutableTransactionSignatureChecker(&txTo[2], 0, amount), &err), strprintf("escrow 1: %d %d", i, j)); + BOOST_CHECK_MESSAGE(VerifyScript(s, escrow, flags, MutableTransactionSignatureChecker(&txTo[2], 0, amount), consensusBranchId, &err), strprintf("escrow 1: %d %d", i, j)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); } else { - BOOST_CHECK_MESSAGE(!VerifyScript(s, escrow, flags, MutableTransactionSignatureChecker(&txTo[2], 0, amount), &err), strprintf("escrow 2: %d %d", i, j)); + BOOST_CHECK_MESSAGE(!VerifyScript(s, escrow, flags, MutableTransactionSignatureChecker(&txTo[2], 0, amount), consensusBranchId, &err), strprintf("escrow 2: %d %d", i, j)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); } } @@ -277,6 +279,8 @@ BOOST_AUTO_TEST_CASE(multisig_Solver1) BOOST_AUTO_TEST_CASE(multisig_Sign) { + uint32_t consensusBranchId = SPROUT_BRANCH_ID; + // Test SignSignature() (and therefore the version of Solver() that signs transactions) CBasicKeyStore keystore; CKey key[4]; @@ -313,7 +317,7 @@ BOOST_AUTO_TEST_CASE(multisig_Sign) for (int i = 0; i < 3; i++) { - BOOST_CHECK_MESSAGE(SignSignature(keystore, txFrom, txTo[i], 0, SIGHASH_ALL), strprintf("SignSignature %d", i)); + BOOST_CHECK_MESSAGE(SignSignature(keystore, txFrom, txTo[i], 0, SIGHASH_ALL, consensusBranchId), strprintf("SignSignature %d", i)); } } diff --git a/src/test/script_P2SH_tests.cpp b/src/test/script_P2SH_tests.cpp index 8be86ce73..209ff06c9 100644 --- a/src/test/script_P2SH_tests.cpp +++ b/src/test/script_P2SH_tests.cpp @@ -2,6 +2,7 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. +#include "consensus/upgrades.h" #include "core_io.h" #include "key.h" #include "keystore.h" @@ -32,6 +33,8 @@ Serialize(const CScript& s) static bool Verify(const CScript& scriptSig, const CScript& scriptPubKey, bool fStrict, ScriptError& err) { + uint32_t consensusBranchId = SPROUT_BRANCH_ID; + // Create dummy to/from transactions: CMutableTransaction txFrom; txFrom.vout.resize(1); @@ -45,7 +48,7 @@ Verify(const CScript& scriptSig, const CScript& scriptPubKey, bool fStrict, Scri txTo.vin[0].scriptSig = scriptSig; txTo.vout[0].nValue = 1; - return VerifyScript(scriptSig, scriptPubKey, fStrict ? SCRIPT_VERIFY_P2SH : SCRIPT_VERIFY_NONE, MutableTransactionSignatureChecker(&txTo, 0, txFrom.vout[0].nValue), &err); + return VerifyScript(scriptSig, scriptPubKey, fStrict ? SCRIPT_VERIFY_P2SH : SCRIPT_VERIFY_NONE, MutableTransactionSignatureChecker(&txTo, 0, txFrom.vout[0].nValue), consensusBranchId, &err); } @@ -54,6 +57,7 @@ BOOST_FIXTURE_TEST_SUITE(script_P2SH_tests, BasicTestingSetup) BOOST_AUTO_TEST_CASE(sign) { LOCK(cs_main); + uint32_t consensusBranchId = SPROUT_BRANCH_ID; // Pay-to-script-hash looks like this: // scriptSig: // scriptPubKey: HASH160 EQUAL @@ -107,7 +111,7 @@ BOOST_AUTO_TEST_CASE(sign) } for (int i = 0; i < 8; i++) { - BOOST_CHECK_MESSAGE(SignSignature(keystore, txFrom, txTo[i], 0, SIGHASH_ALL), strprintf("SignSignature %d", i)); + BOOST_CHECK_MESSAGE(SignSignature(keystore, txFrom, txTo[i], 0, SIGHASH_ALL, consensusBranchId), strprintf("SignSignature %d", i)); } // All of the above should be OK, and the txTos have valid signatures // Check to make sure signature verification fails if we use the wrong ScriptSig: @@ -117,7 +121,7 @@ BOOST_AUTO_TEST_CASE(sign) { CScript sigSave = txTo[i].vin[0].scriptSig; txTo[i].vin[0].scriptSig = txTo[j].vin[0].scriptSig; - bool sigOK = CScriptCheck(CCoins(txFrom, 0), txTo[i], 0, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_STRICTENC, false, &txdata)(); + bool sigOK = CScriptCheck(CCoins(txFrom, 0), txTo[i], 0, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_STRICTENC, false, consensusBranchId, &txdata)(); if (i == j) BOOST_CHECK_MESSAGE(sigOK, strprintf("VerifySignature %d %d", i, j)); else @@ -157,6 +161,7 @@ BOOST_AUTO_TEST_CASE(norecurse) BOOST_AUTO_TEST_CASE(set) { LOCK(cs_main); + uint32_t consensusBranchId = SPROUT_BRANCH_ID; // Test the CScript::Set* methods CBasicKeyStore keystore; CKey key[4]; @@ -206,7 +211,7 @@ BOOST_AUTO_TEST_CASE(set) } for (int i = 0; i < 4; i++) { - BOOST_CHECK_MESSAGE(SignSignature(keystore, txFrom, txTo[i], 0, SIGHASH_ALL), strprintf("SignSignature %d", i)); + BOOST_CHECK_MESSAGE(SignSignature(keystore, txFrom, txTo[i], 0, SIGHASH_ALL, consensusBranchId), strprintf("SignSignature %d", i)); BOOST_CHECK_MESSAGE(IsStandardTx(txTo[i], reason), strprintf("txTo[%d].IsStandard", i)); } } @@ -265,6 +270,7 @@ BOOST_AUTO_TEST_CASE(switchover) BOOST_AUTO_TEST_CASE(AreInputsStandard) { LOCK(cs_main); + uint32_t consensusBranchId = SPROUT_BRANCH_ID; CCoinsView coinsDummy; CCoinsViewCache coins(&coinsDummy); CBasicKeyStore keystore; @@ -335,16 +341,16 @@ BOOST_AUTO_TEST_CASE(AreInputsStandard) txTo.vin[i].prevout.n = i; txTo.vin[i].prevout.hash = txFrom.GetHash(); } - BOOST_CHECK(SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL)); - BOOST_CHECK(SignSignature(keystore, txFrom, txTo, 1, SIGHASH_ALL)); - BOOST_CHECK(SignSignature(keystore, txFrom, txTo, 2, SIGHASH_ALL)); + BOOST_CHECK(SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL, consensusBranchId)); + BOOST_CHECK(SignSignature(keystore, txFrom, txTo, 1, SIGHASH_ALL, consensusBranchId)); + BOOST_CHECK(SignSignature(keystore, txFrom, txTo, 2, SIGHASH_ALL, consensusBranchId)); // SignSignature doesn't know how to sign these. We're // not testing validating signatures, so just create // dummy signatures that DO include the correct P2SH scripts: txTo.vin[3].scriptSig << OP_11 << OP_11 << static_cast >(oneAndTwo); txTo.vin[4].scriptSig << static_cast >(fifteenSigops); - BOOST_CHECK(::AreInputsStandard(txTo, coins)); + BOOST_CHECK(::AreInputsStandard(txTo, coins, consensusBranchId)); // 22 P2SH sigops for all inputs (1 for vin[0], 6 for vin[3], 15 for vin[4] BOOST_CHECK_EQUAL(GetP2SHSigOpCount(txTo, coins), 22U); @@ -353,7 +359,7 @@ BOOST_AUTO_TEST_CASE(AreInputsStandard) { CScript t = txTo.vin[i].scriptSig; txTo.vin[i].scriptSig = (CScript() << 11) + t; - BOOST_CHECK(!::AreInputsStandard(txTo, coins)); + BOOST_CHECK(!::AreInputsStandard(txTo, coins, consensusBranchId)); txTo.vin[i].scriptSig = t; } @@ -366,7 +372,7 @@ BOOST_AUTO_TEST_CASE(AreInputsStandard) txToNonStd1.vin[0].prevout.hash = txFrom.GetHash(); txToNonStd1.vin[0].scriptSig << static_cast >(sixteenSigops); - BOOST_CHECK(!::AreInputsStandard(txToNonStd1, coins)); + BOOST_CHECK(!::AreInputsStandard(txToNonStd1, coins, consensusBranchId)); BOOST_CHECK_EQUAL(GetP2SHSigOpCount(txToNonStd1, coins), 16U); CMutableTransaction txToNonStd2; @@ -378,7 +384,7 @@ BOOST_AUTO_TEST_CASE(AreInputsStandard) txToNonStd2.vin[0].prevout.hash = txFrom.GetHash(); txToNonStd2.vin[0].scriptSig << static_cast >(twentySigops); - BOOST_CHECK(!::AreInputsStandard(txToNonStd2, coins)); + BOOST_CHECK(!::AreInputsStandard(txToNonStd2, coins, consensusBranchId)); BOOST_CHECK_EQUAL(GetP2SHSigOpCount(txToNonStd2, coins), 20U); } diff --git a/src/test/script_tests.cpp b/src/test/script_tests.cpp index d089816c8..bb363be41 100644 --- a/src/test/script_tests.cpp +++ b/src/test/script_tests.cpp @@ -5,6 +5,7 @@ #include "data/script_invalid.json.h" #include "data/script_valid.json.h" +#include "consensus/upgrades.h" #include "core_io.h" #include "key.h" #include "keystore.h" @@ -87,13 +88,13 @@ CMutableTransaction BuildSpendingTransaction(const CScript& scriptSig, const CMu return txSpend; } -void DoTest(const CScript& scriptPubKey, const CScript& scriptSig, int flags, bool expect, const std::string& message) +void DoTest(const CScript& scriptPubKey, const CScript& scriptSig, int flags, uint32_t consensusBranchId, bool expect, const std::string& message) { ScriptError err; CMutableTransaction txCredit = BuildCreditingTransaction(scriptPubKey); CMutableTransaction tx = BuildSpendingTransaction(scriptSig, txCredit); CMutableTransaction tx2 = tx; - BOOST_CHECK_MESSAGE(VerifyScript(scriptSig, scriptPubKey, flags, MutableTransactionSignatureChecker(&tx, 0, txCredit.vout[0].nValue), &err) == expect, message); + BOOST_CHECK_MESSAGE(VerifyScript(scriptSig, scriptPubKey, flags, MutableTransactionSignatureChecker(&tx, 0, txCredit.vout[0].nValue), consensusBranchId, &err) == expect, message); BOOST_CHECK_MESSAGE(expect == (err == SCRIPT_ERR_OK), std::string(ScriptErrorString(err)) + ": " + message); #if defined(HAVE_CONSENSUS_LIB) CDataStream stream(SER_NETWORK, PROTOCOL_VERSION); @@ -188,6 +189,7 @@ private: std::vector push; std::string comment; int flags; + uint32_t consensusBranchId; void DoPush() { @@ -205,7 +207,7 @@ private: } public: - TestBuilder(const CScript& redeemScript, const std::string& comment_, int flags_, bool P2SH = false) : scriptPubKey(redeemScript), havePush(false), comment(comment_), flags(flags_) + TestBuilder(const CScript& redeemScript, const std::string& comment_, int flags_, bool P2SH = false) : scriptPubKey(redeemScript), havePush(false), comment(comment_), flags(flags_), consensusBranchId(0) { if (P2SH) { creditTx = BuildCreditingTransaction(CScript() << OP_HASH160 << ToByteVector(CScriptID(redeemScript)) << OP_EQUAL); @@ -237,7 +239,7 @@ public: TestBuilder& PushSig(const CKey& key, int nHashType = SIGHASH_ALL, unsigned int lenR = 32, unsigned int lenS = 32) { - uint256 hash = SignatureHash(scriptPubKey, spendTx, 0, nHashType, 0, SIGVERSION_BASE); + uint256 hash = SignatureHash(scriptPubKey, spendTx, 0, nHashType, 0, consensusBranchId); std::vector vchSig, r, s; uint32_t iter = 0; do { @@ -289,7 +291,7 @@ public: { TestBuilder copy = *this; // Make a copy so we can rollback the push. DoPush(); - DoTest(creditTx.vout[0].scriptPubKey, spendTx.vin[0].scriptSig, flags, expect, comment); + DoTest(creditTx.vout[0].scriptPubKey, spendTx.vin[0].scriptSig, flags, consensusBranchId, expect, comment); *this = copy; return *this; } @@ -577,6 +579,7 @@ BOOST_AUTO_TEST_CASE(script_build) BOOST_AUTO_TEST_CASE(script_valid) { + uint32_t consensusBranchId = SPROUT_BRANCH_ID; // Read tests from test/data/script_valid.json // Format is an array of arrays // Inner arrays are [ "scriptSig", "scriptPubKey", "flags" ] @@ -600,12 +603,13 @@ BOOST_AUTO_TEST_CASE(script_valid) CScript scriptPubKey = ParseScript(scriptPubKeyString); unsigned int scriptflags = ParseScriptFlags(test[2].get_str()); - DoTest(scriptPubKey, scriptSig, scriptflags, true, strTest); + DoTest(scriptPubKey, scriptSig, scriptflags, consensusBranchId, true, strTest); } } BOOST_AUTO_TEST_CASE(script_invalid) { + uint32_t consensusBranchId = SPROUT_BRANCH_ID; // Scripts that should evaluate as invalid UniValue tests = read_json(std::string(json_tests::script_invalid, json_tests::script_invalid + sizeof(json_tests::script_invalid))); @@ -625,12 +629,14 @@ BOOST_AUTO_TEST_CASE(script_invalid) CScript scriptPubKey = ParseScript(scriptPubKeyString); unsigned int scriptflags = ParseScriptFlags(test[2].get_str()); - DoTest(scriptPubKey, scriptSig, scriptflags, false, strTest); + DoTest(scriptPubKey, scriptSig, scriptflags, consensusBranchId, false, strTest); } } BOOST_AUTO_TEST_CASE(script_PushData) { + uint32_t consensusBranchId = SPROUT_BRANCH_ID; + // Check that PUSHDATA1, PUSHDATA2, and PUSHDATA4 create the same value on // the stack as the 1-75 opcodes do. static const unsigned char direct[] = { 1, 0x5a }; @@ -640,29 +646,29 @@ BOOST_AUTO_TEST_CASE(script_PushData) ScriptError err; vector > directStack; - BOOST_CHECK(EvalScript(directStack, CScript(&direct[0], &direct[sizeof(direct)]), SCRIPT_VERIFY_P2SH, BaseSignatureChecker(), SIGVERSION_BASE, &err)); + BOOST_CHECK(EvalScript(directStack, CScript(&direct[0], &direct[sizeof(direct)]), SCRIPT_VERIFY_P2SH, BaseSignatureChecker(), consensusBranchId, &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); vector > pushdata1Stack; - BOOST_CHECK(EvalScript(pushdata1Stack, CScript(&pushdata1[0], &pushdata1[sizeof(pushdata1)]), SCRIPT_VERIFY_P2SH, BaseSignatureChecker(), SIGVERSION_BASE, &err)); + BOOST_CHECK(EvalScript(pushdata1Stack, CScript(&pushdata1[0], &pushdata1[sizeof(pushdata1)]), SCRIPT_VERIFY_P2SH, BaseSignatureChecker(), consensusBranchId, &err)); BOOST_CHECK(pushdata1Stack == directStack); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); vector > pushdata2Stack; - BOOST_CHECK(EvalScript(pushdata2Stack, CScript(&pushdata2[0], &pushdata2[sizeof(pushdata2)]), SCRIPT_VERIFY_P2SH, BaseSignatureChecker(), SIGVERSION_BASE, &err)); + BOOST_CHECK(EvalScript(pushdata2Stack, CScript(&pushdata2[0], &pushdata2[sizeof(pushdata2)]), SCRIPT_VERIFY_P2SH, BaseSignatureChecker(), consensusBranchId, &err)); BOOST_CHECK(pushdata2Stack == directStack); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); vector > pushdata4Stack; - BOOST_CHECK(EvalScript(pushdata4Stack, CScript(&pushdata4[0], &pushdata4[sizeof(pushdata4)]), SCRIPT_VERIFY_P2SH, BaseSignatureChecker(), SIGVERSION_BASE, &err)); + BOOST_CHECK(EvalScript(pushdata4Stack, CScript(&pushdata4[0], &pushdata4[sizeof(pushdata4)]), SCRIPT_VERIFY_P2SH, BaseSignatureChecker(), consensusBranchId, &err)); BOOST_CHECK(pushdata4Stack == directStack); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); } CScript -sign_multisig(CScript scriptPubKey, std::vector keys, CTransaction transaction) +sign_multisig(CScript scriptPubKey, std::vector keys, CTransaction transaction, uint32_t consensusBranchId) { - uint256 hash = SignatureHash(scriptPubKey, transaction, 0, SIGHASH_ALL, 0, SIGVERSION_BASE); + uint256 hash = SignatureHash(scriptPubKey, transaction, 0, SIGHASH_ALL, 0, consensusBranchId); CScript result; // @@ -684,15 +690,17 @@ sign_multisig(CScript scriptPubKey, std::vector keys, CTransaction transac return result; } CScript -sign_multisig(CScript scriptPubKey, const CKey &key, CTransaction transaction) +sign_multisig(CScript scriptPubKey, const CKey &key, CTransaction transaction, uint32_t consensusBranchId) { std::vector keys; keys.push_back(key); - return sign_multisig(scriptPubKey, keys, transaction); + return sign_multisig(scriptPubKey, keys, transaction, consensusBranchId); } BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG12) { + uint32_t consensusBranchId = SPROUT_BRANCH_ID; + ScriptError err; CKey key1, key2, key3; key1.MakeNewKey(true); @@ -705,24 +713,26 @@ BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG12) CMutableTransaction txFrom12 = BuildCreditingTransaction(scriptPubKey12); CMutableTransaction txTo12 = BuildSpendingTransaction(CScript(), txFrom12); - CScript goodsig1 = sign_multisig(scriptPubKey12, key1, txTo12); - BOOST_CHECK(VerifyScript(goodsig1, scriptPubKey12, flags, MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), &err)); + CScript goodsig1 = sign_multisig(scriptPubKey12, key1, txTo12, consensusBranchId); + BOOST_CHECK(VerifyScript(goodsig1, scriptPubKey12, flags, MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), consensusBranchId, &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); txTo12.vout[0].nValue = 2; - BOOST_CHECK(!VerifyScript(goodsig1, scriptPubKey12, flags, MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), &err)); + BOOST_CHECK(!VerifyScript(goodsig1, scriptPubKey12, flags, MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), consensusBranchId, &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); - CScript goodsig2 = sign_multisig(scriptPubKey12, key2, txTo12); - BOOST_CHECK(VerifyScript(goodsig2, scriptPubKey12, flags, MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), &err)); + CScript goodsig2 = sign_multisig(scriptPubKey12, key2, txTo12, consensusBranchId); + BOOST_CHECK(VerifyScript(goodsig2, scriptPubKey12, flags, MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), consensusBranchId, &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); - CScript badsig1 = sign_multisig(scriptPubKey12, key3, txTo12); - BOOST_CHECK(!VerifyScript(badsig1, scriptPubKey12, flags, MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), &err)); + CScript badsig1 = sign_multisig(scriptPubKey12, key3, txTo12, consensusBranchId); + BOOST_CHECK(!VerifyScript(badsig1, scriptPubKey12, flags, MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), consensusBranchId, &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); } BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG23) { + uint32_t consensusBranchId = SPROUT_BRANCH_ID; + ScriptError err; CKey key1, key2, key3, key4; key1.MakeNewKey(true); @@ -738,60 +748,62 @@ BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG23) std::vector keys; keys.push_back(key1); keys.push_back(key2); - CScript goodsig1 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(VerifyScript(goodsig1, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err)); + CScript goodsig1 = sign_multisig(scriptPubKey23, keys, txTo23, consensusBranchId); + BOOST_CHECK(VerifyScript(goodsig1, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), consensusBranchId, &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); keys.clear(); keys.push_back(key1); keys.push_back(key3); - CScript goodsig2 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(VerifyScript(goodsig2, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err)); + CScript goodsig2 = sign_multisig(scriptPubKey23, keys, txTo23, consensusBranchId); + BOOST_CHECK(VerifyScript(goodsig2, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), consensusBranchId, &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); keys.clear(); keys.push_back(key2); keys.push_back(key3); - CScript goodsig3 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(VerifyScript(goodsig3, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err)); + CScript goodsig3 = sign_multisig(scriptPubKey23, keys, txTo23, consensusBranchId); + BOOST_CHECK(VerifyScript(goodsig3, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), consensusBranchId, &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); keys.clear(); keys.push_back(key2); keys.push_back(key2); // Can't re-use sig - CScript badsig1 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(!VerifyScript(badsig1, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err)); + CScript badsig1 = sign_multisig(scriptPubKey23, keys, txTo23, consensusBranchId); + BOOST_CHECK(!VerifyScript(badsig1, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), consensusBranchId, &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); keys.clear(); keys.push_back(key2); keys.push_back(key1); // sigs must be in correct order - CScript badsig2 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(!VerifyScript(badsig2, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err)); + CScript badsig2 = sign_multisig(scriptPubKey23, keys, txTo23, consensusBranchId); + BOOST_CHECK(!VerifyScript(badsig2, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), consensusBranchId, &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); keys.clear(); keys.push_back(key3); keys.push_back(key2); // sigs must be in correct order - CScript badsig3 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(!VerifyScript(badsig3, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err)); + CScript badsig3 = sign_multisig(scriptPubKey23, keys, txTo23, consensusBranchId); + BOOST_CHECK(!VerifyScript(badsig3, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), consensusBranchId, &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); keys.clear(); keys.push_back(key4); keys.push_back(key2); // sigs must match pubkeys - CScript badsig4 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(!VerifyScript(badsig4, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err)); + CScript badsig4 = sign_multisig(scriptPubKey23, keys, txTo23, consensusBranchId); + BOOST_CHECK(!VerifyScript(badsig4, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), consensusBranchId, &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); keys.clear(); keys.push_back(key1); keys.push_back(key4); // sigs must match pubkeys - CScript badsig5 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(!VerifyScript(badsig5, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err)); + CScript badsig5 = sign_multisig(scriptPubKey23, keys, txTo23, consensusBranchId); + BOOST_CHECK(!VerifyScript(badsig5, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), consensusBranchId, &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); keys.clear(); // Must have signatures - CScript badsig6 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(!VerifyScript(badsig6, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err)); + CScript badsig6 = sign_multisig(scriptPubKey23, keys, txTo23, consensusBranchId); + BOOST_CHECK(!VerifyScript(badsig6, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), consensusBranchId, &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_INVALID_STACK_OPERATION, ScriptErrorString(err)); } BOOST_AUTO_TEST_CASE(script_combineSigs) { + uint32_t consensusBranchId = SPROUT_BRANCH_ID; + // Test the CombineSignatures function CAmount amount = 0; CBasicKeyStore keystore; @@ -812,61 +824,61 @@ BOOST_AUTO_TEST_CASE(script_combineSigs) CScript& scriptSig = txTo.vin[0].scriptSig; SignatureData empty; - SignatureData combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), empty, empty); + SignatureData combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), empty, empty, consensusBranchId); BOOST_CHECK(combined.scriptSig.empty()); // Single signature case: - SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL); // changes scriptSig - combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSig), empty); + SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL, consensusBranchId); // changes scriptSig + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSig), empty, consensusBranchId); BOOST_CHECK(combined.scriptSig == scriptSig); - combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), empty, SignatureData(scriptSig)); + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), empty, SignatureData(scriptSig), consensusBranchId); BOOST_CHECK(combined.scriptSig == scriptSig); CScript scriptSigCopy = scriptSig; // Signing again will give a different, valid signature: - SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL); - combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSigCopy), SignatureData(scriptSig)); + SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL, consensusBranchId); + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSigCopy), SignatureData(scriptSig), consensusBranchId); BOOST_CHECK(combined.scriptSig == scriptSigCopy || combined.scriptSig == scriptSig); // P2SH, single-signature case: CScript pkSingle; pkSingle << ToByteVector(keys[0].GetPubKey()) << OP_CHECKSIG; keystore.AddCScript(pkSingle); scriptPubKey = GetScriptForDestination(CScriptID(pkSingle)); - SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL); - combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSig), empty); + SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL, consensusBranchId); + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSig), empty, consensusBranchId); BOOST_CHECK(combined.scriptSig == scriptSig); - combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), empty, SignatureData(scriptSig)); + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), empty, SignatureData(scriptSig), consensusBranchId); BOOST_CHECK(combined.scriptSig == scriptSig); scriptSigCopy = scriptSig; - SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL); - combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSigCopy), SignatureData(scriptSig)); + SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL, consensusBranchId); + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSigCopy), SignatureData(scriptSig), consensusBranchId); BOOST_CHECK(combined.scriptSig == scriptSigCopy || combined.scriptSig == scriptSig); // dummy scriptSigCopy with placeholder, should always choose non-placeholder: scriptSigCopy = CScript() << OP_0 << static_cast >(pkSingle); - combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSigCopy), SignatureData(scriptSig)); + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSigCopy), SignatureData(scriptSig), consensusBranchId); BOOST_CHECK(combined.scriptSig == scriptSig); - combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSig), SignatureData(scriptSigCopy)); + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSig), SignatureData(scriptSigCopy), consensusBranchId); BOOST_CHECK(combined.scriptSig == scriptSig); // Hardest case: Multisig 2-of-3 scriptPubKey = GetScriptForMultisig(2, pubkeys); keystore.AddCScript(scriptPubKey); - SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL); - combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSig), empty); + SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL, consensusBranchId); + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSig), empty, consensusBranchId); BOOST_CHECK(combined.scriptSig == scriptSig); - combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), empty, SignatureData(scriptSig)); + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), empty, SignatureData(scriptSig), consensusBranchId); BOOST_CHECK(combined.scriptSig == scriptSig); // A couple of partially-signed versions: vector sig1; - uint256 hash1 = SignatureHash(scriptPubKey, txTo, 0, SIGHASH_ALL, 0, SIGVERSION_BASE); + uint256 hash1 = SignatureHash(scriptPubKey, txTo, 0, SIGHASH_ALL, 0, consensusBranchId); BOOST_CHECK(keys[0].Sign(hash1, sig1)); sig1.push_back(SIGHASH_ALL); vector sig2; - uint256 hash2 = SignatureHash(scriptPubKey, txTo, 0, SIGHASH_NONE, 0, SIGVERSION_BASE); + uint256 hash2 = SignatureHash(scriptPubKey, txTo, 0, SIGHASH_NONE, 0, consensusBranchId); BOOST_CHECK(keys[1].Sign(hash2, sig2)); sig2.push_back(SIGHASH_NONE); vector sig3; - uint256 hash3 = SignatureHash(scriptPubKey, txTo, 0, SIGHASH_SINGLE, 0, SIGVERSION_BASE); + uint256 hash3 = SignatureHash(scriptPubKey, txTo, 0, SIGHASH_SINGLE, 0, consensusBranchId); BOOST_CHECK(keys[2].Sign(hash3, sig3)); sig3.push_back(SIGHASH_SINGLE); @@ -882,32 +894,34 @@ BOOST_AUTO_TEST_CASE(script_combineSigs) CScript complete13 = CScript() << OP_0 << sig1 << sig3; CScript complete23 = CScript() << OP_0 << sig2 << sig3; - combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial1a), SignatureData(partial1b)); + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial1a), SignatureData(partial1b), consensusBranchId); BOOST_CHECK(combined.scriptSig == partial1a); - combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial1a), SignatureData(partial2a)); + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial1a), SignatureData(partial2a), consensusBranchId); BOOST_CHECK(combined.scriptSig == complete12); - combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial2a), SignatureData(partial1a)); + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial2a), SignatureData(partial1a), consensusBranchId); BOOST_CHECK(combined.scriptSig == complete12); - combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial1b), SignatureData(partial2b)); + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial1b), SignatureData(partial2b), consensusBranchId); BOOST_CHECK(combined.scriptSig == complete12); - combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial3b), SignatureData(partial1b)); + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial3b), SignatureData(partial1b), consensusBranchId); BOOST_CHECK(combined.scriptSig == complete13); - combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial2a), SignatureData(partial3a)); + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial2a), SignatureData(partial3a), consensusBranchId); BOOST_CHECK(combined.scriptSig == complete23); - combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial3b), SignatureData(partial2b)); + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial3b), SignatureData(partial2b), consensusBranchId); BOOST_CHECK(combined.scriptSig == complete23); - combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial3b), SignatureData(partial3a)); + combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial3b), SignatureData(partial3a), consensusBranchId); BOOST_CHECK(combined.scriptSig == partial3c); } BOOST_AUTO_TEST_CASE(script_standard_push) { + uint32_t consensusBranchId = SPROUT_BRANCH_ID; + ScriptError err; for (int i=0; i<67000; i++) { CScript script; script << i; BOOST_CHECK_MESSAGE(script.IsPushOnly(), "Number " << i << " is not pure push."); - BOOST_CHECK_MESSAGE(VerifyScript(script, CScript() << OP_1, SCRIPT_VERIFY_MINIMALDATA, BaseSignatureChecker(), &err), "Number " << i << " push is not minimal data."); + BOOST_CHECK_MESSAGE(VerifyScript(script, CScript() << OP_1, SCRIPT_VERIFY_MINIMALDATA, BaseSignatureChecker(), consensusBranchId, &err), "Number " << i << " push is not minimal data."); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); } @@ -916,7 +930,7 @@ BOOST_AUTO_TEST_CASE(script_standard_push) CScript script; script << data; BOOST_CHECK_MESSAGE(script.IsPushOnly(), "Length " << i << " is not pure push."); - BOOST_CHECK_MESSAGE(VerifyScript(script, CScript() << OP_1, SCRIPT_VERIFY_MINIMALDATA, BaseSignatureChecker(), &err), "Length " << i << " push is not minimal data."); + BOOST_CHECK_MESSAGE(VerifyScript(script, CScript() << OP_1, SCRIPT_VERIFY_MINIMALDATA, BaseSignatureChecker(), consensusBranchId, &err), "Length " << i << " push is not minimal data."); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); } } diff --git a/src/test/sighash_tests.cpp b/src/test/sighash_tests.cpp index 6a3b2e855..f591b80c7 100644 --- a/src/test/sighash_tests.cpp +++ b/src/test/sighash_tests.cpp @@ -93,7 +93,7 @@ void static RandomScript(CScript &script) { script << oplist[insecure_rand() % (sizeof(oplist)/sizeof(oplist[0]))]; } -void static RandomTransaction(CMutableTransaction &tx, bool fSingle) { +void static RandomTransaction(CMutableTransaction &tx, bool fSingle, uint32_t consensusBranchId) { tx.fOverwintered = insecure_rand() % 2; if (tx.fOverwintered) { // Versions outside known ranges throw an exception during parsing @@ -160,7 +160,7 @@ void static RandomTransaction(CMutableTransaction &tx, bool fSingle) { // Empty output script. CScript scriptCode; CTransaction signTx(tx); - uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL, 0, SIGVERSION_BASE); + uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL, 0, consensusBranchId); assert(crypto_sign_detached(&tx.joinSplitSig[0], NULL, dataToBeSigned.begin(), 32, @@ -173,11 +173,12 @@ BOOST_FIXTURE_TEST_SUITE(sighash_tests, JoinSplitTestingSetup) BOOST_AUTO_TEST_CASE(sighash_test) { + uint32_t overwinterBranchId = NetworkUpgradeInfo[Consensus::UPGRADE_OVERWINTER].nBranchId; seed_insecure_rand(false); #if defined(PRINT_SIGHASH_JSON) std::cout << "[\n"; - std::cout << "\t[\"raw_transaction, script, input_index, hashType, signature_hash (result)\"],\n"; + std::cout << "\t[\"raw_transaction, script, input_index, hashType, branchId, signature_hash (result)\"],\n"; #endif int nRandomTests = 50000; @@ -186,15 +187,16 @@ BOOST_AUTO_TEST_CASE(sighash_test) #endif for (int i=0; inullifiers[0] = GetRandHash(); jsdesc->nullifiers[1] = GetRandHash(); - BOOST_CHECK(!CheckTransactionWithoutProofVerification(newTx, state)); + BOOST_CHECK(CheckTransactionWithoutProofVerification(newTx, state)); + BOOST_CHECK(!ContextualCheckTransaction(newTx, state, 0, 100)); BOOST_CHECK(state.GetRejectReason() == "bad-txns-invalid-joinsplit-signature"); // Empty output script. CScript scriptCode; CTransaction signTx(newTx); - uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL, 0, SIGVERSION_BASE); + uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL, 0, consensusBranchId); assert(crypto_sign_detached(&newTx.joinSplitSig[0], NULL, dataToBeSigned.begin(), 32, @@ -436,6 +443,7 @@ BOOST_AUTO_TEST_CASE(test_simple_joinsplit_invalidity) ) == 0); BOOST_CHECK(CheckTransactionWithoutProofVerification(newTx, state)); + BOOST_CHECK(ContextualCheckTransaction(newTx, state, 0, 100)); } { // Ensure that values within the joinsplit are well-formed. @@ -525,6 +533,8 @@ BOOST_AUTO_TEST_CASE(test_simple_joinsplit_invalidity) BOOST_AUTO_TEST_CASE(test_Get) { + uint32_t consensusBranchId = SPROUT_BRANCH_ID; + CBasicKeyStore keystore; CCoinsView coinsDummy; CCoinsViewCache coins(&coinsDummy); @@ -545,19 +555,20 @@ BOOST_AUTO_TEST_CASE(test_Get) t1.vout[0].nValue = 90*CENT; t1.vout[0].scriptPubKey << OP_1; - BOOST_CHECK(AreInputsStandard(t1, coins)); + BOOST_CHECK(AreInputsStandard(t1, coins, consensusBranchId)); BOOST_CHECK_EQUAL(coins.GetValueIn(t1), (50+21+22)*CENT); // Adding extra junk to the scriptSig should make it non-standard: t1.vin[0].scriptSig << OP_11; - BOOST_CHECK(!AreInputsStandard(t1, coins)); + BOOST_CHECK(!AreInputsStandard(t1, coins, consensusBranchId)); // ... as should not having enough: t1.vin[0].scriptSig = CScript(); - BOOST_CHECK(!AreInputsStandard(t1, coins)); + BOOST_CHECK(!AreInputsStandard(t1, coins, consensusBranchId)); } BOOST_AUTO_TEST_CASE(test_big_overwinter_transaction) { + uint32_t consensusBranchId = NetworkUpgradeInfo[Consensus::UPGRADE_OVERWINTER].nBranchId; CMutableTransaction mtx; mtx.fOverwintered = true; mtx.nVersion = 3; @@ -596,7 +607,7 @@ BOOST_AUTO_TEST_CASE(test_big_overwinter_transaction) { // sign all inputs for(uint32_t i = 0; i < mtx.vin.size(); i++) { - bool hashSigned = SignSignature(keystore, scriptPubKey, mtx, i, 1000, sigHashes.at(i % sigHashes.size())); + bool hashSigned = SignSignature(keystore, scriptPubKey, mtx, i, 1000, sigHashes.at(i % sigHashes.size()), consensusBranchId); assert(hashSigned); } @@ -626,7 +637,7 @@ BOOST_AUTO_TEST_CASE(test_big_overwinter_transaction) { for(uint32_t i = 0; i < mtx.vin.size(); i++) { std::vector vChecks; - CScriptCheck check(coins, tx, i, SCRIPT_VERIFY_P2SH, false, &txdata); + CScriptCheck check(coins, tx, i, SCRIPT_VERIFY_P2SH, false, consensusBranchId, &txdata); vChecks.push_back(CScriptCheck()); check.swap(vChecks.back()); control.Add(vChecks); diff --git a/src/utiltest.cpp b/src/utiltest.cpp index 15a88e678..4599cec3c 100644 --- a/src/utiltest.cpp +++ b/src/utiltest.cpp @@ -4,6 +4,8 @@ #include "utiltest.h" +#include "consensus/upgrades.h" + CWalletTx GetValidReceive(ZCJoinSplit& params, const libzcash::SpendingKey& sk, CAmount value, bool randomInputs) { @@ -45,11 +47,10 @@ CWalletTx GetValidReceive(ZCJoinSplit& params, mtx.vjoinsplit.push_back(jsdesc); // Empty output script. + uint32_t consensusBranchId = SPROUT_BRANCH_ID; CScript scriptCode; CTransaction signTx(mtx); - //fifth parameter amount will not be used for joinsplit signing, value arbitrary, also arbitrary decision what to use for sigverion - //This is just to get this merge commit to compile later will remove sigversion parameter as choosing sigversion by block height - uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL,0, SIGVERSION_BASE); + uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL, 0, consensusBranchId); // Add the signature assert(crypto_sign_detached(&mtx.joinSplitSig[0], NULL, @@ -131,9 +132,10 @@ CWalletTx GetValidSpend(ZCJoinSplit& params, mtx.vjoinsplit.push_back(jsdesc); // Empty output script. + uint32_t consensusBranchId = SPROUT_BRANCH_ID; CScript scriptCode; CTransaction signTx(mtx); - uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL,0,SIGVERSION_BASE); + uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL, 0, consensusBranchId); // Add the signature assert(crypto_sign_detached(&mtx.joinSplitSig[0], NULL, diff --git a/src/wallet/asyncrpcoperation_sendmany.cpp b/src/wallet/asyncrpcoperation_sendmany.cpp index a1200e30c..b69bef0de 100644 --- a/src/wallet/asyncrpcoperation_sendmany.cpp +++ b/src/wallet/asyncrpcoperation_sendmany.cpp @@ -5,6 +5,7 @@ #include "asyncrpcoperation_sendmany.h" #include "asyncrpcqueue.h" #include "amount.h" +#include "consensus/upgrades.h" #include "core_io.h" #include "init.h" #include "main.h" @@ -337,6 +338,12 @@ bool AsyncRPCOperation_sendmany::main_impl() { LogPrint("zrpcunsafe", "%s: private output: %s\n", getId(), FormatMoney(z_outputs_total)); LogPrint("zrpc", "%s: fee: %s\n", getId(), FormatMoney(minersFee)); + // Grab the current consensus branch ID + { + LOCK(cs_main); + consensusBranchId_ = CurrentEpochBranchId(chainActive.Height() + 1, Params().GetConsensus()); + } + /** * SCENARIO #1 * @@ -994,7 +1001,7 @@ UniValue AsyncRPCOperation_sendmany::perform_joinsplit( // Empty output script. CScript scriptCode; CTransaction signTx(mtx); - uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL, 0, SIGVERSION_BASE); + uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL, 0, consensusBranchId_); // Add the signature if (!(crypto_sign_detached(&mtx.joinSplitSig[0], NULL, diff --git a/src/wallet/asyncrpcoperation_sendmany.h b/src/wallet/asyncrpcoperation_sendmany.h index 83a976af9..113f11f49 100644 --- a/src/wallet/asyncrpcoperation_sendmany.h +++ b/src/wallet/asyncrpcoperation_sendmany.h @@ -73,6 +73,7 @@ private: UniValue contextinfo_; // optional data to include in return value from getStatus() + uint32_t consensusBranchId_; CAmount fee_; int mindepth_; std::string fromaddress_; diff --git a/src/wallet/asyncrpcoperation_shieldcoinbase.cpp b/src/wallet/asyncrpcoperation_shieldcoinbase.cpp index 61a02ffe9..527f810bc 100644 --- a/src/wallet/asyncrpcoperation_shieldcoinbase.cpp +++ b/src/wallet/asyncrpcoperation_shieldcoinbase.cpp @@ -4,6 +4,7 @@ #include "asyncrpcqueue.h" #include "amount.h" +#include "consensus/upgrades.h" #include "core_io.h" #include "init.h" #include "main.h" @@ -302,12 +303,15 @@ void AsyncRPCOperation_shieldcoinbase::sign_send_raw_transaction(UniValue obj) UniValue AsyncRPCOperation_shieldcoinbase::perform_joinsplit(ShieldCoinbaseJSInfo & info) { + uint32_t consensusBranchId; uint256 anchor; { LOCK(cs_main); + consensusBranchId = CurrentEpochBranchId(chainActive.Height() + 1, Params().GetConsensus()); anchor = pcoinsTip->GetBestAnchor(); } + if (anchor.IsNull()) { throw std::runtime_error("anchor is null"); } @@ -369,7 +373,7 @@ UniValue AsyncRPCOperation_shieldcoinbase::perform_joinsplit(ShieldCoinbaseJSInf // Empty output script. CScript scriptCode; CTransaction signTx(mtx); - uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL, 0, SIGVERSION_BASE); + uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL, 0, consensusBranchId); // Add the signature if (!(crypto_sign_detached(&mtx.joinSplitSig[0], NULL, diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 62fe40cde..90651ea74 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5,6 +5,7 @@ #include "amount.h" #include "base58.h" +#include "consensus/upgrades.h" #include "core_io.h" #include "init.h" #include "main.h" @@ -2840,7 +2841,8 @@ UniValue zc_raw_joinsplit(const UniValue& params, bool fHelp) // Empty output script. CScript scriptCode; CTransaction signTx(mtx); - uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL, 0, SIGVERSION_BASE); + auto consensusBranchId = CurrentEpochBranchId(chainActive.Height() + 1, Params().GetConsensus()); + uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL, 0, consensusBranchId); // Add the signature assert(crypto_sign_detached(&mtx.joinSplitSig[0], NULL, diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 3730430b7..8dd52a0b0 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -8,6 +8,7 @@ #include "base58.h" #include "checkpoints.h" #include "coincontrol.h" +#include "consensus/upgrades.h" #include "consensus/validation.h" #include "init.h" #include "main.h" @@ -2768,6 +2769,9 @@ bool CWallet::CreateTransaction(const vector& vecSend, CWalletTx& wt } } + // Grab the current consensus branch ID + auto consensusBranchId = CurrentEpochBranchId(chainActive.Height() + 1, Params().GetConsensus()); + // Sign int nIn = 0; CTransaction txNewConst(txNew); @@ -2777,9 +2781,9 @@ bool CWallet::CreateTransaction(const vector& vecSend, CWalletTx& wt const CScript& scriptPubKey = coin.first->vout[coin.second].scriptPubKey; SignatureData sigdata; if (sign) - signSuccess = ProduceSignature(TransactionSignatureCreator(this, &txNewConst, nIn, coin.first->vout[coin.second].nValue, SIGHASH_ALL), scriptPubKey, sigdata); + signSuccess = ProduceSignature(TransactionSignatureCreator(this, &txNewConst, nIn, coin.first->vout[coin.second].nValue, SIGHASH_ALL), scriptPubKey, sigdata, consensusBranchId); else - signSuccess = ProduceSignature(DummySignatureCreator(this), scriptPubKey, sigdata); + signSuccess = ProduceSignature(DummySignatureCreator(this), scriptPubKey, sigdata, consensusBranchId); if (!signSuccess) { diff --git a/src/zcbenchmarks.cpp b/src/zcbenchmarks.cpp index c061fd797..4b17e57bf 100644 --- a/src/zcbenchmarks.cpp +++ b/src/zcbenchmarks.cpp @@ -13,6 +13,7 @@ #include "crypto/equihash.h" #include "chain.h" #include "chainparams.h" +#include "consensus/upgrades.h" #include "consensus/validation.h" #include "main.h" #include "miner.h" @@ -251,8 +252,9 @@ double benchmark_large_tx() } // Sign for all the inputs + auto consensusBranchId = NetworkUpgradeInfo[Consensus::UPGRADE_OVERWINTER].nBranchId; for (size_t i = 0; i < NUM_INPUTS; i++) { - SignSignature(tempKeystore, prevPubKey, spending_tx, i, 1000000, SIGHASH_ALL); + SignSignature(tempKeystore, prevPubKey, spending_tx, i, 1000000, SIGHASH_ALL, consensusBranchId); } // Serialize: @@ -278,6 +280,7 @@ double benchmark_large_tx() prevPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, TransactionSignatureChecker(&final_spending_tx, i, 1000000), + consensusBranchId, &serror)); } return timer_stop(tv_start); From d55e5e778b503b66e04c93f0c8492613ccbb430a Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 20 Feb 2018 00:57:02 +0000 Subject: [PATCH 0496/1062] Cleanup: Wrap function arguments --- src/main.cpp | 12 +++++++++++- src/script/interpreter.cpp | 34 +++++++++++++++++++++++++++++----- src/script/interpreter.h | 31 +++++++++++++++++++++++++++---- src/script/sign.cpp | 35 ++++++++++++++++++++++++++++++----- src/script/sign.h | 24 +++++++++++++++++++++--- src/script/zcashconsensus.cpp | 8 +++++++- 6 files changed, 125 insertions(+), 19 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 28bc4acf5..7540ade52 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1812,7 +1812,17 @@ bool CheckTxInputs(const CTransaction& tx, CValidationState& state, const CCoins } }// namespace Consensus -bool ContextualCheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsViewCache &inputs, bool fScriptChecks, unsigned int flags, bool cacheStore, PrecomputedTransactionData& txdata, const Consensus::Params& consensusParams, uint32_t consensusBranchId, std::vector *pvChecks) +bool ContextualCheckInputs( + const CTransaction& tx, + CValidationState &state, + const CCoinsViewCache &inputs, + bool fScriptChecks, + unsigned int flags, + bool cacheStore, + PrecomputedTransactionData& txdata, + const Consensus::Params& consensusParams, + uint32_t consensusBranchId, + std::vector *pvChecks) { if (!tx.IsCoinBase()) { diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index beb16ebef..f436688f4 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -232,7 +232,13 @@ bool static CheckMinimalPush(const valtype& data, opcodetype opcode) { return true; } -bool EvalScript(vector >& stack, const CScript& script, unsigned int flags, const BaseSignatureChecker& checker, uint32_t consensusBranchId, ScriptError* serror) +bool EvalScript( + vector >& stack, + const CScript& script, + unsigned int flags, + const BaseSignatureChecker& checker, + uint32_t consensusBranchId, + ScriptError* serror) { static const CScriptNum bnZero(0); static const CScriptNum bnOne(1); @@ -1092,7 +1098,14 @@ SigVersion SignatureHashVersion(const CTransaction& txTo) } } -uint256 SignatureHash(const CScript& scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType, const CAmount& amount, uint32_t consensusBranchId, const PrecomputedTransactionData* cache) +uint256 SignatureHash( + const CScript& scriptCode, + const CTransaction& txTo, + unsigned int nIn, + int nHashType, + const CAmount& amount, + uint32_t consensusBranchId, + const PrecomputedTransactionData* cache) { if (nIn >= txTo.vin.size() && nIn != NOT_AN_INPUT) { // nIn out of range @@ -1165,12 +1178,17 @@ uint256 SignatureHash(const CScript& scriptCode, const CTransaction& txTo, unsig return ss.GetHash(); } -bool TransactionSignatureChecker::VerifySignature(const std::vector& vchSig, const CPubKey& pubkey, const uint256& sighash) const +bool TransactionSignatureChecker::VerifySignature( + const std::vector& vchSig, const CPubKey& pubkey, const uint256& sighash) const { return pubkey.Verify(sighash, vchSig); } -bool TransactionSignatureChecker::CheckSig(const vector& vchSigIn, const vector& vchPubKey, const CScript& scriptCode, uint32_t consensusBranchId) const +bool TransactionSignatureChecker::CheckSig( + const vector& vchSigIn, + const vector& vchPubKey, + const CScript& scriptCode, + uint32_t consensusBranchId) const { CPubKey pubkey(vchPubKey); if (!pubkey.IsValid()) @@ -1233,7 +1251,13 @@ bool TransactionSignatureChecker::CheckLockTime(const CScriptNum& nLockTime) con } -bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigned int flags, const BaseSignatureChecker& checker, uint32_t consensusBranchId, ScriptError* serror) +bool VerifyScript( + const CScript& scriptSig, + const CScript& scriptPubKey, + unsigned int flags, + const BaseSignatureChecker& checker, + uint32_t consensusBranchId, + ScriptError* serror) { set_error(serror, SCRIPT_ERR_UNKNOWN_ERROR); diff --git a/src/script/interpreter.h b/src/script/interpreter.h index 7d4ed974b..6f1408dfd 100644 --- a/src/script/interpreter.h +++ b/src/script/interpreter.h @@ -101,12 +101,23 @@ enum SigVersion SIGVERSION_OVERWINTER = 1, }; -uint256 SignatureHash(const CScript &scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType, const CAmount& amount, uint32_t consensusBranchId, const PrecomputedTransactionData* cache = NULL); +uint256 SignatureHash( + const CScript &scriptCode, + const CTransaction& txTo, + unsigned int nIn, + int nHashType, + const CAmount& amount, + uint32_t consensusBranchId, + const PrecomputedTransactionData* cache = NULL); class BaseSignatureChecker { public: - virtual bool CheckSig(const std::vector& scriptSig, const std::vector& vchPubKey, const CScript& scriptCode, uint32_t consensusBranchId) const + virtual bool CheckSig( + const std::vector& scriptSig, + const std::vector& vchPubKey, + const CScript& scriptCode, + uint32_t consensusBranchId) const { return false; } @@ -146,7 +157,19 @@ public: MutableTransactionSignatureChecker(const CMutableTransaction* txToIn, unsigned int nInIn, const CAmount& amount) : TransactionSignatureChecker(&txTo, nInIn, amount), txTo(*txToIn) {} }; -bool EvalScript(std::vector >& stack, const CScript& script, unsigned int flags, const BaseSignatureChecker& checker, uint32_t consensusBranchId, ScriptError* error = NULL); -bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigned int flags, const BaseSignatureChecker& checker, uint32_t consensusBranchId, ScriptError* serror = NULL); +bool EvalScript( + std::vector >& stack, + const CScript& script, + unsigned int flags, + const BaseSignatureChecker& checker, + uint32_t consensusBranchId, + ScriptError* error = NULL); +bool VerifyScript( + const CScript& scriptSig, + const CScript& scriptPubKey, + unsigned int flags, + const BaseSignatureChecker& checker, + uint32_t consensusBranchId, + ScriptError* serror = NULL); #endif // BITCOIN_SCRIPT_INTERPRETER_H diff --git a/src/script/sign.cpp b/src/script/sign.cpp index 0fe89ece8..1aade8477 100644 --- a/src/script/sign.cpp +++ b/src/script/sign.cpp @@ -168,7 +168,14 @@ void UpdateTransaction(CMutableTransaction& tx, unsigned int nIn, const Signatur tx.vin[nIn].scriptSig = data.scriptSig; } -bool SignSignature(const CKeyStore &keystore, const CScript& fromPubKey, CMutableTransaction& txTo, unsigned int nIn, const CAmount& amount, int nHashType, uint32_t consensusBranchId) +bool SignSignature( + const CKeyStore &keystore, + const CScript& fromPubKey, + CMutableTransaction& txTo, + unsigned int nIn, + const CAmount& amount, + int nHashType, + uint32_t consensusBranchId) { assert(nIn < txTo.vin.size()); @@ -181,7 +188,13 @@ bool SignSignature(const CKeyStore &keystore, const CScript& fromPubKey, CMutabl return ret; } -bool SignSignature(const CKeyStore &keystore, const CTransaction& txFrom, CMutableTransaction& txTo, unsigned int nIn, int nHashType, uint32_t consensusBranchId) +bool SignSignature( + const CKeyStore &keystore, + const CTransaction& txFrom, + CMutableTransaction& txTo, + unsigned int nIn, + int nHashType, + uint32_t consensusBranchId) { assert(nIn < txTo.vin.size()); CTxIn& txin = txTo.vin[nIn]; @@ -319,7 +332,11 @@ SignatureData CombineSignatures(const CScript& scriptPubKey, const BaseSignature vector > vSolutions; Solver(scriptPubKey, txType, vSolutions); - return CombineSignatures(scriptPubKey, checker, txType, vSolutions, Stacks(scriptSig1, consensusBranchId), Stacks(scriptSig2, consensusBranchId), consensusBranchId).Output(); + return CombineSignatures( + scriptPubKey, checker, txType, vSolutions, + Stacks(scriptSig1, consensusBranchId), + Stacks(scriptSig2, consensusBranchId), + consensusBranchId).Output(); } namespace { @@ -329,7 +346,11 @@ class DummySignatureChecker : public BaseSignatureChecker public: DummySignatureChecker() {} - bool CheckSig(const std::vector& scriptSig, const std::vector& vchPubKey, const CScript& scriptCode, uint32_t consensusBranchId) const + bool CheckSig( + const std::vector& scriptSig, + const std::vector& vchPubKey, + const CScript& scriptCode, + uint32_t consensusBranchId) const { return true; } @@ -342,7 +363,11 @@ const BaseSignatureChecker& DummySignatureCreator::Checker() const return dummyChecker; } -bool DummySignatureCreator::CreateSig(std::vector& vchSig, const CKeyID& keyid, const CScript& scriptCode, uint32_t consensusBranchId) const +bool DummySignatureCreator::CreateSig( + std::vector& vchSig, + const CKeyID& keyid, + const CScript& scriptCode, + uint32_t consensusBranchId) const { // Create a dummy signature that is a valid DER-encoding vchSig.assign(72, '\000'); diff --git a/src/script/sign.h b/src/script/sign.h index 1e9bde118..edd913d7f 100644 --- a/src/script/sign.h +++ b/src/script/sign.h @@ -70,11 +70,29 @@ struct SignatureData { bool ProduceSignature(const BaseSignatureCreator& creator, const CScript& scriptPubKey, SignatureData& sigdata, uint32_t consensusBranchId); /** Produce a script signature for a transaction. */ -bool SignSignature(const CKeyStore &keystore, const CScript& fromPubKey, CMutableTransaction& txTo, unsigned int nIn, const CAmount& amount, int nHashType, uint32_t consensusBranchId); -bool SignSignature(const CKeyStore& keystore, const CTransaction& txFrom, CMutableTransaction& txTo, unsigned int nIn, int nHashType, uint32_t consensusBranchId); +bool SignSignature( + const CKeyStore &keystore, + const CScript& fromPubKey, + CMutableTransaction& txTo, + unsigned int nIn, + const CAmount& amount, + int nHashType, + uint32_t consensusBranchId); +bool SignSignature( + const CKeyStore& keystore, + const CTransaction& txFrom, + CMutableTransaction& txTo, + unsigned int nIn, + int nHashType, + uint32_t consensusBranchId); /** Combine two script signatures using a generic signature checker, intelligently, possibly with OP_0 placeholders. */ -SignatureData CombineSignatures(const CScript& scriptPubKey, const BaseSignatureChecker& checker, const SignatureData& scriptSig1, const SignatureData& scriptSig2, uint32_t consensusBranchId); +SignatureData CombineSignatures( + const CScript& scriptPubKey, + const BaseSignatureChecker& checker, + const SignatureData& scriptSig1, + const SignatureData& scriptSig2, + uint32_t consensusBranchId); /** Extract signature data from a transaction, and insert it. */ SignatureData DataFromTransaction(const CMutableTransaction& tx, unsigned int nIn); diff --git a/src/script/zcashconsensus.cpp b/src/script/zcashconsensus.cpp index ec494d966..dbec305fc 100644 --- a/src/script/zcashconsensus.cpp +++ b/src/script/zcashconsensus.cpp @@ -88,7 +88,13 @@ int zcashconsensus_verify_script(const unsigned char *scriptPubKey, unsigned int PrecomputedTransactionData txdata(tx); CAmount am(0); uint32_t consensusBranchId = SPROUT_BRANCH_ID; - return VerifyScript(tx.vin[nIn].scriptSig, CScript(scriptPubKey, scriptPubKey + scriptPubKeyLen), flags, TransactionSignatureChecker(&tx, nIn, am, txdata), consensusBranchId, NULL); + return VerifyScript( + tx.vin[nIn].scriptSig, + CScript(scriptPubKey, scriptPubKey + scriptPubKeyLen), + flags, + TransactionSignatureChecker(&tx, nIn, am, txdata), + consensusBranchId, + NULL); } catch (const std::exception&) { return set_error(err, zcashconsensus_ERR_TX_DESERIALIZE); // Error deserializing } From 132dc81f7d0076e32e9364466624abe90cb28cf5 Mon Sep 17 00:00:00 2001 From: Ariel Date: Wed, 17 Jan 2018 12:47:08 +0200 Subject: [PATCH 0497/1062] add blake2b writer --- src/hash.h | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/hash.h b/src/hash.h index 077155562..06fcced0a 100644 --- a/src/hash.h +++ b/src/hash.h @@ -12,6 +12,8 @@ #include "uint256.h" #include "version.h" +#include "sodium.h" + #include typedef uint256 ChainCode; @@ -150,6 +152,47 @@ public: } }; + +/** A writer stream (for serialization) that computes a 256-bit BLAKE2b hash. */ +class CBLAKE2bWriter +{ +private: + crypto_generichash_blake2b_state state; + +public: + int nType; + int nVersion; + + CBLAKE2bWriter(int nTypeIn, int nVersionIn, const unsigned char* personal) : nType(nTypeIn), nVersion(nVersionIn) { + assert(crypto_generichash_blake2b_init_salt_personal( + &state, + NULL, 0, // No key. + 32, + NULL, // No salt. + personal) == 0); + } + + CBLAKE2bWriter& write(const char *pch, size_t size) { + crypto_generichash_blake2b_update(&state, (const unsigned char*)pch, size); + return (*this); + } + + // invalidates the object + uint256 GetHash() { + uint256 result; + crypto_generichash_blake2b_final(&state, (unsigned char*)&result, 32); + return result; + } + + template + CBLAKE2bWriter& operator<<(const T& obj) { + // Serialize to this stream + ::Serialize(*this, obj, nType, nVersion); + return (*this); + } +}; + + /** Compute the 256-bit hash of an object's serialization. */ template uint256 SerializeHash(const T& obj, int nType=SER_GETHASH, int nVersion=PROTOCOL_VERSION) From 7245f32835c5d2419fa4692b8873bacd08fe3b10 Mon Sep 17 00:00:00 2001 From: Ariel Date: Wed, 17 Jan 2018 12:48:10 +0200 Subject: [PATCH 0498/1062] update SignatureHash according to Overwinter spec with help from str4d --- src/primitives/transaction.h | 17 ++++++--- src/script/interpreter.cpp | 72 +++++++++++++++++++++++++++--------- src/script/interpreter.h | 2 +- 3 files changed, 67 insertions(+), 24 deletions(-) diff --git a/src/primitives/transaction.h b/src/primitives/transaction.h index 28347d6a5..654a68b8a 100644 --- a/src/primitives/transaction.h +++ b/src/primitives/transaction.h @@ -383,12 +383,7 @@ public: *const_cast(&fOverwintered) = header >> 31; *const_cast(&this->nVersion) = header & 0x7FFFFFFF; } else { - // When serializing v1 and v2, the 4 byte header is nVersion - uint32_t header = this->nVersion; - // When serializing Overwintered tx, the 4 byte header is the combination of fOverwintered and nVersion - if (fOverwintered) { - header |= 1 << 31; - } + uint32_t header = GetHeader(); READWRITE(header); } nVersion = this->nVersion; @@ -428,6 +423,16 @@ public: return hash; } + uint32_t GetHeader() const { + // When serializing v1 and v2, the 4 byte header is nVersion + uint32_t header = this->nVersion; + // When serializing Overwintered tx, the 4 byte header is the combination of fOverwintered and nVersion + if (fOverwintered) { + header |= 1 << 31; + } + return header; + } + // Return sum of txouts. CAmount GetValueOut() const; // GetValueIn() is a method on CCoinsViewCache, because diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index f436688f4..66153477e 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -5,6 +5,7 @@ #include "interpreter.h" +#include "consensus/upgrades.h" #include "primitives/transaction.h" #include "crypto/ripemd160.h" #include "crypto/sha1.h" @@ -1056,8 +1057,17 @@ public: } }; +const unsigned char ZCASH_PREVOUTS_HASH_PERSONALIZATION[crypto_generichash_blake2b_PERSONALBYTES] = + {'Z','c','a','s','h','P','r','e','v','o','u','t','H','a','s','h'}; +const unsigned char ZCASH_SEQUENCE_HASH_PERSONALIZATION[crypto_generichash_blake2b_PERSONALBYTES] = + {'Z','c','a','s','h','S','e','q','u','e','n','c','H','a','s','h'}; +const unsigned char ZCASH_OUTPUTS_HASH_PERSONALIZATION[crypto_generichash_blake2b_PERSONALBYTES] = + {'Z','c','a','s','h','O','u','t','p','u','t','s','H','a','s','h'}; +const unsigned char ZCASH_JOINSPLITS_HASH_PERSONALIZATION[crypto_generichash_blake2b_PERSONALBYTES] = + {'Z','c','a','s','h','J','S','p','l','i','t','s','H','a','s','h'}; + uint256 GetPrevoutHash(const CTransaction& txTo) { - CHashWriter ss(SER_GETHASH, 0); + CBLAKE2bWriter ss(SER_GETHASH, 0, ZCASH_PREVOUTS_HASH_PERSONALIZATION); for (unsigned int n = 0; n < txTo.vin.size(); n++) { ss << txTo.vin[n].prevout; } @@ -1065,7 +1075,7 @@ uint256 GetPrevoutHash(const CTransaction& txTo) { } uint256 GetSequenceHash(const CTransaction& txTo) { - CHashWriter ss(SER_GETHASH, 0); + CBLAKE2bWriter ss(SER_GETHASH, 0, ZCASH_SEQUENCE_HASH_PERSONALIZATION); for (unsigned int n = 0; n < txTo.vin.size(); n++) { ss << txTo.vin[n].nSequence; } @@ -1073,13 +1083,22 @@ uint256 GetSequenceHash(const CTransaction& txTo) { } uint256 GetOutputsHash(const CTransaction& txTo) { - CHashWriter ss(SER_GETHASH, 0); + CBLAKE2bWriter ss(SER_GETHASH, 0, ZCASH_OUTPUTS_HASH_PERSONALIZATION); for (unsigned int n = 0; n < txTo.vout.size(); n++) { ss << txTo.vout[n]; } return ss.GetHash(); } +uint256 GetJoinSplitsHash(const CTransaction& txTo) { + CBLAKE2bWriter ss(SER_GETHASH, 0, ZCASH_JOINSPLITS_HASH_PERSONALIZATION); + for (unsigned int n = 0; n < txTo.vjoinsplit.size(); n++) { + ss << txTo.vjoinsplit[n]; + } + ss << txTo.joinSplitPubKey; + return ss.GetHash(); +} + } // anon namespace PrecomputedTransactionData::PrecomputedTransactionData(const CTransaction& txTo) @@ -1087,6 +1106,7 @@ PrecomputedTransactionData::PrecomputedTransactionData(const CTransaction& txTo) hashPrevouts = GetPrevoutHash(txTo); hashSequence = GetSequenceHash(txTo); hashOutputs = GetOutputsHash(txTo); + hashJoinSplits = GetJoinSplitsHash(txTo); } SigVersion SignatureHashVersion(const CTransaction& txTo) @@ -1118,6 +1138,7 @@ uint256 SignatureHash( uint256 hashPrevouts; uint256 hashSequence; uint256 hashOutputs; + uint256 hashJoinSplits; if (!(nHashType & SIGHASH_ANYONECANPAY)) { hashPrevouts = cache ? cache->hashPrevouts : GetPrevoutHash(txTo); @@ -1127,37 +1148,54 @@ uint256 SignatureHash( hashSequence = cache ? cache->hashSequence : GetSequenceHash(txTo); } - if ((nHashType & 0x1f) != SIGHASH_SINGLE && (nHashType & 0x1f) != SIGHASH_NONE) { hashOutputs = cache ? cache->hashOutputs : GetOutputsHash(txTo); } else if ((nHashType & 0x1f) == SIGHASH_SINGLE && nIn < txTo.vout.size()) { - CHashWriter ss(SER_GETHASH, 0); + CBLAKE2bWriter ss(SER_GETHASH, 0, ZCASH_OUTPUTS_HASH_PERSONALIZATION); ss << txTo.vout[nIn]; hashOutputs = ss.GetHash(); } - CHashWriter ss(SER_GETHASH, 0); - // Version - ss << txTo.nVersion; + if (!txTo.vjoinsplit.empty()) { + hashJoinSplits = cache ? cache->hashJoinSplits : GetJoinSplitsHash(txTo); + } + + uint32_t leConsensusBranchId = htole32(consensusBranchId); + unsigned char personalization[16] = {}; + memcpy(personalization, "ZcashSigHash", 12); + memcpy(personalization+12, &leConsensusBranchId, 4); + + CBLAKE2bWriter ss(SER_GETHASH, 0, personalization); + // Header + ss << txTo.GetHeader(); + // Version group ID + ss << txTo.nVersionGroupId; // Input prevouts/nSequence (none/all, depending on flags) ss << hashPrevouts; ss << hashSequence; - // The input being signed (replacing the scriptSig with scriptCode + amount) - // The prevout may already be contained in hashPrevout, and the nSequence - // may already be contained in hashSequence. - if (nIn != NOT_AN_INPUT) - ss << txTo.vin[nIn].prevout; - ss << scriptCode; - ss << amount; - if (nIn != NOT_AN_INPUT) - ss << txTo.vin[nIn].nSequence; // Outputs (none/one/all, depending on flags) ss << hashOutputs; + // JoinSplits + ss << hashJoinSplits; // Locktime ss << txTo.nLockTime; + // Expiry height + ss << txTo.nExpiryHeight; // Sighash type ss << nHashType; + // If this hash is for a transparent input signature + // (i.e. not for txTo.joinSplitSig): + if (nIn != NOT_AN_INPUT){ + // The input being signed (replacing the scriptSig with scriptCode + amount) + // The prevout may already be contained in hashPrevout, and the nSequence + // may already be contained in hashSequence. + ss << txTo.vin[nIn].prevout; + ss << scriptCode; + ss << amount; + ss << txTo.vin[nIn].nSequence; + } + return ss.GetHash(); } diff --git a/src/script/interpreter.h b/src/script/interpreter.h index 6f1408dfd..7f2956eec 100644 --- a/src/script/interpreter.h +++ b/src/script/interpreter.h @@ -90,7 +90,7 @@ enum struct PrecomputedTransactionData { - uint256 hashPrevouts, hashSequence, hashOutputs; + uint256 hashPrevouts, hashSequence, hashOutputs, hashJoinSplits; PrecomputedTransactionData(const CTransaction& tx); }; From a3353b4e011be45fb961bb110e4f7c54f112c169 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 8 Feb 2018 15:59:56 +0000 Subject: [PATCH 0499/1062] Regenerate SignatureHash tests --- src/test/data/sighash.json | 1002 ++++++++++++++++++------------------ 1 file changed, 501 insertions(+), 501 deletions(-) diff --git a/src/test/data/sighash.json b/src/test/data/sighash.json index 8c78623cc..acd465363 100644 --- a/src/test/data/sighash.json +++ b/src/test/data/sighash.json @@ -1,503 +1,503 @@ [ - ["raw_transaction, script, input_index, hashType, signature_hash (result)"], - ["af8fe92403914ce455f5d35f120779fe7c008fa7fa628861b9561035482cb9a823a9ee425700000000025200ffffffff6ac130b9ab8dd61d2f8c47e17166b7ee59f375c35aa21e0681bac3fe8a1a135b000000000851005253ac6a0053a7c123fedba8e4362c1392254e6f26b56fa9560c9e660b8d48c8bc16214038674ce283cd020000000163ffffffff020174da0000000000010057a639030000000003acac6530dd305b00", "00630051656a", 0, -1077130669, "6da7e90d501b84e04a356691bf555418ad47f1335dbd00c4fd8d8c898cc6ac1b"], - ["7dc0be5c036d9c60065671bd6a25236151c48386c8ad32d49e2bb3a2cca3bcd8ea17cbf47d010000000152ffffffff1382323c464c5744edf34c1c592120d4642d7988cb3cf89bff83679fd33cfa03000000000153ffffffff0683ad8dd6ea82b3ac76c3f5f5aca398f1eaa91fa5f9e649f2d78df834b534d1010000000652535352acacffffffff0145e1a805000000000163b22180320334704c0000000000000000000000000017f0078879e2569f294959868f094acf0cd147358706b293b09808927fadb7d14aab8761e88d46ad584866c0675878dfabc196c0577887f533dee5ee6dd6aa265dfc65779328a38cb20fb30fdb5bf20098746a6c3163bc23963767a679854500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b40fb432f609f6d381b591c1ecf672836e30a0ed8d69df284287bf061fa58fa7cf5c2b2f84110a715df5f83be71d0ec9f5b4f0026e3b1a2c8e3e1f767f8c979db29833895e8d17cce112fe5bb3bb263433d0a1e1de342e2feac8074ca06062830139e58cd47fc2bed7658313b913dfb18356619e2730ae9b10c2f6c98356386021adf31dbe1a4054160b0b53ba47ba32f9c670223b05daee6c528ca42b7a707c503275fc8f9900e43f1fc6f064daba9baa50109f3fe7c3c0604965a2376c8ab0d890b00a5ba63dc4ca41c0a7b19cd8ba731329aff6c6ecacafc6d9b9084bd16b222ead4a43d1dc7c5456edb7d2c7d86af870da61899c3fa0adbdb6948afa3b33ca13602114bebf72df509f0bb2e04e57244789857b892b7e57d9af68c433c50e85bcabe03281cbe4390bee55592639407244bc0922e10a340b4e839fac30e016534419e6b02284a1ad62f3fedae71733951d5513fe3a3d427eee604a8806e1493dd4ac82a9f022353dc07d81fabd3adf7081f62a9a2fa9473ff20057e90e0f1d39d22a0d4891b021ba263a8868a1c50c99dbdfdb0131bbdf690234a66d710ee0c491c92c2c77f0a27be3252ba6d7fb712def9ced9af9ea4b29843fbf728248a3959b54cd891363a23fe5166e5ae8ea7b8247d705937d5db095d9b3dc916b4185e672b6936a57ae5ef2d56bf44ca146e5d7ce880656d69deeba45f43dfdb16b70dabf678837243cb0400d3d21c23a7975d89271e7000d2e7e1c2f3fbfd05ea4fc6a1a752ca94412e54d62686a5cc00875a077fd095c7cea57a6239d735abb09dee46a41bf55ad3089b1d02b621534cc55ed96b5c168a29682c3d4f8e6a5388fc0b3458b388e8ade2fdac3307f2a6d6c49c64afcdbe9ad085314fef6682669fb82ba7795d380dc3f9abf1ddf7c507528dfc7c722c3c7eda14d0549fac1c6812d4aef0b63102823d45c55d61cc5ceaab39f236a70bc9797da4f693f9ac30e2fdadfb05093949bf6de35abca7a587c8f6b0a8e45a9ff3864793644c83a89867914fa86da7c0f633ef7cf47e9fa33b001d0f5616e9ba2d11287ff245dac10f188e539030b99d7323a6ad95b5b376edd09f929b2ce3e69914b639a0e9314cb413ce6e078478bb60d736a37d31940af494550d059ac3a9549e62deab5a93fe7da8a0a5e09a5247935c09b06e5fd3a73facea4e963fd57eefe95a3ca5b2e39199b1df907acabb7ead6447b477fe624abcaa2a42b2b34cfe613608837c0e59c6ad57caa152a96f8d9dc718e0219dec20775f83240ec96b58d331dd279402d821c1f818e4a8c7e8435df6a97a20ec09628921c9405bbae77ce41ae3032d0cfc0bb98914043def407614896e6f4c2acd94f0fdcc75df75306a451f006b9733a5ccba232eb7aabfb75063d0e8c72f957c0c3aab5bbcf5123353f9671be0c248089233faeadfe37d92b7457662f130394bfe84656749e6bd3334709c7c82c5b40d5cb58e1c040088deac10e21bb2641fd2235a56428561d9592bb498247fa8a792b3a795ca284c18a198554b2f2a2eb9f406a559575a5251ad6faf5909c1de9becdc965b402da7801759f8cd7a22458cdb55e3222f1540b9f5a2cd5bc660a5ac6d2a53f1ded9374098016ac3367eb36094d8bc2bd20bed247ae17a53ed5cf8f9f6b2ea28c5bff999d8723d25f4caeb44dd2daa5cb40327b12d73687daa8818599148ff42df3bc1d03eef9c0a87434001f9597bb8cd6ba25012328e97f1faea4669f5dd348e78ccbc78c4cb76d9c2a5674b91749437897a42598836a5e444ec457fbb0e4c8cce4a2cb468a537d4c5ea3e1758a17da3958716df9e9f40aae2b6d4997e64102119cdcaeeb59509089b96391fb32983eec204bd0c4361ca04b944d72f1aa02b252b4e23dc85bd9ddeedaa8800c11d7ab30ea545e67c226e699e144be62eb35897c82fe8dd148e92cc74d3131fadca4cef4adc173ca045d51945848be2b3a26948f80d7934a6b17f1984cd02c6d3c9daf11a8534590e69241d8238880eccb8f1f0af39966f9ef2993f816ef1aba8e49d59aecdb9c003617eb32f0a64d4d5239b9ea2e5daf4d89c59335b9432730d34a29e33a2c3037df57114ae20c94a5853c1c8103c46dca30d4972c13d228d9cfb45394aaeefc4b21db485ce2a584ea31d3a82276ab531b2668dae2da77a4d10054559143e8ab5a300e528fab170f87899c57ff0e6a34c8897e70905832eea6266eac780c1242714dd1d0da3c15372bdaa0c3587616fbbdfc7e61d4677d6fe93cd52673b8a096e19b0fc5f55a9af2a2c5b010000000000000000000000002322c37109ca805d3c9d40b625d268e05155bee8cd4632dd8086c8aafc8e1bc473977413d2cdde5a25fad354892c1d2d8c16e747a08d8aef543dc0334ab658b811cd97b667a9dfa69b0b130e4f61eeedf75c4c431d46f901c229cfe50291528d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f403abbb15c9c64b591c423d7f524a71e16cf9ef71205772ba94b06fa09d560d5b27eac4cc31e7ef8c474fc563285039b9f07c18849f3ebdbc3ac3d4454ad1e0d6a08c9ae040cab300119f43c67c7e5041b1db51fb34b1c6d92875b98fb9826055ac48d7ca75acc7f212462ffb7bf20f260816b24dbd44be0e9a734f532b230302038159deee2c02091ff1f31de8b27d357dc16b24c13b75193190846dd3dbc4b70216ffc3fa95fe7ae2b80b0929687b300b00f14ba8ab8ff98b5757a0481c846e5a0b01b63ff5a69e59eb1e762232d52e8564df83d141c2a9c9a6ad38210d3c0f66d79123d012a97b813aa42af49d7cc9f09ea2e0a80a260662b94437b8c2517f0f150209f9cc78ce1390ba013b02790aaced8ab3de5ac9ce4538731d40ccf371e837d7020669101e529030270a9f3e0140924b0d0a7f450361731bc6f6b2490f9e389e4f0306a47173a0d5fe11099a809875a686bf2743d3a04d7776ed2632be8b03479f0c0203cccd7b1c83c671f0f5060a51cd17cd545253e02ccf85b1b34347263b1bb0b90326a177fe63ba6179fb1df8b3c96de5ee73e3ad0c844e314ca2cf64f25990e353b0d45c4df44f66d483ab1ada9a9b836aa0647de153a688bd78f443e83e74401ab8405b5d5f11a80c27abc5f2b3530843f5c96b0005b9db01175383b625dd3c2b9fff6667b90b14ffa1c38778e126f82ab2cc770c0d5aa91590e0c0d63241d73e5c3e630e0a99f13f30adaf69b976f17293bae88aa7a3d19b6b65182fb0fa9e78b963f2f599b29eebcf094cd5d6c92b1fe635fc80404c9260708995a61def8a7f1175ba31f6cbfc6a0bd5372fbd662e20bdae55e27bcda9850b448a3b18b7a0b4f232d49572e02353b5a48e3753833858db9fa0dc88edab8b2109f7db9d17e1d15040410fdbdcb9859945104fa6bf1fbaee8dc4b0641e8a9612d6e5378624e47e892ff1c3163b29a6d3943f8d1c5474869d86df625d2728feacab58fb57bbb1f72ad6b1069c9835bf5cf798fa05f611ff0790856b1316f0e4fb1ad7e9214187bd568c1ecf868e3aedde714cc9f48952ceb3aa7b32bd9b7e4cbe1cd1b5aafe67487c95b79c9bb433a0bf3657764397280c8dc109c497aec5c2e56ab7c368516ac0f026f561132a967563c09a097b4a4b7c3cc8c7a21bd4ae14ea0a8922e62b99443320b1b5bb14a2b6b6a02f4916d607d9276ffb02ae65fcf9820282f77621bc323a87450d60cf31445c64922a248b727e99562aa337aa01d1dcdc604d4c46acfb324040d0b8af4a585d56784b28be60b22ee99045cd4b51b51ee6fc69bd00793b8ef12484d27fc5133da387db447f8b6d7a79ab6c9e3f13166649f1a43f02debb26744dd88d6e2e33350d0ad7bdd18f3e00e8e4f07fdada947739e70d81be8b2da99b24a572e33aca0deb604ae16545b327dc6993dc628783a7d7d5c42f182818b7f55d5f1938bb4e21365f756c48f4a762f762e15a1bb0ee90f3f92f8d02e5b19ddc8bb7710d4a0c57d807dba51b9da9b75af66838a0dd1ce677be78e6e21ba27e7d7a28ae3af545d5b3a1b7fcb87c1bfc6fe50cead4c3d82f9e9836ae080f678204b6e4c0618072a2f84f96c73e929f709bed42f6cd714713cb2570446d1a94a9122ed92236b587232cb42b183f36bd1bcceaa37fb9d9ed9214b049dd7a72782d221dda0b1ba9d029f8e4c678cee123ce3ceebd106812674a0b7db28ece762cc5bb3c3794719160d86e9f99ea402c06e87b10206d9bfd0a871d2d5674ba2d2383a7b768b5d38cc41eb949e7c1c643d99074f16f150479f9e89697b057cc4921d4bc3a3660de9c1f20530cbd0608d227e7315a29ccd17db001be72d7f77c9e080831921bcf03ba2c663808ad0b205cc14e311aa9073dcb66cec7b3f52610d72122078b81689e5f4f6938839ced408e8e8e3f36ccdf6150feb40d2b91ede25576652571b7b8955ad51bb73456f0305316ae58696d3b1cb9d499f2b686f52ee67cd85e63ad66ae78879bc8d666d394134740acfb82fbc0b59a81c9c960407fb079a1ce1f214522d9db8d89355e0ad1619d4815e80af6033ea33b73e39b900942695029525af788e7c51f0c1345ef97f94d5f761d6d4273e90c74920e36541dba719bf6faafeca822790109157a64964d6fed475aec73c4189cb2a476e43256be94fb4bb5665f799ebb6267d9f9505d957fc15bfb49d21ca1864611ed77658d2b1276c8b16dc2936040cdbdc79b328447ad853de699df7bd42aff7b49471c89dece9e16f9473e91bd107339cae9f1b5000c5c460000000000000000c871650500000000a99fa5bf8acd97ca190951c6757f1872e0f2be4856bd07c65da35d2b0ea6b0076828b620b501cfd10f849d74571a82741aa2ac63a59fd513fe6851e560c857ace97f21795ebe9da35c22691d2466e86f4302a92f2425f8307667c813100ece2600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308fc0340ec2af4b70d148c38e062ba46eaa7773575304a2d1a167ad6e59724d6a8c29df049e79ad4a30f670e3276b7fdd98f255720c256d3b3540ab958733cc43bae0cf5120e54e703854f04c4f8913fdb38a076d6c60adc112d03d88fd1e137b0d8b70f7bf0db49ab96402269a97319552d8f41efecc806b2a17b22560866f02235df0654369f1faa3975399e0a3d0a4adeccfce6723d6d928a08107d39156a10319670d79dfd50ed9f9464905b91a8d0493a4f5420af26bedbceec557cf96c80f0b0338d83406d86f9d214d32065258e207530017f5d9efd30adc01fbf39064e6d396874f18472f90099fdd821874e087a79694ce3d71293cc4f070a72a23b1971302000c7be9ea583a7e8a4f189f6b04a1865ba23a37684f6adc16824c10cc85110c0310c714a92cba09dbc970a27c31f2dcc03c164151b0c7098a4b5d1f743aa7ac6802213eb911c32815291a531c1090d7ff8b2da0cc64b145101f9a8e0e5ad0417b0b020e13c4e8d86651fe02b28c1a37218affc8dfdba0cbdeba7f1158cf5d475debb502144530b9e0064f13801a76b1420f958eb0980e17523157331528a6a7492668421aa08bdc01e9279197a861ed1f0f4645ee914b0b1e82ebe57d9994449fb3b4d122cd6825899f945ea871c9f0edecfd0b6aa891e6a88f2f732b15097ad2194d28b2fbe915e7391332e47de174d7babe55e9c38595cc9dd7e962d78ae8c499498954077b823f7321f5ba68988cd802a97ff52f2c3b83bb1b101f4fc3cac2c48d2a8dcb82463fb8b7c5dad390cc0b08bd4195a6a7d6d3e8f7e667643b8e54bf34e663fecfc5bec3253f70eb562bc9e9020f9b9b36f8cf9a8d9548dcefe98593a97e1af4f7e899778e902da89425e87ff81bffee591b91b3cb54f4801381e9f3789548a477cf5176340475212b34c9787aa067d1e44c75f5bf97b2900ae1f69757563324224b4002fd2e0b64f1a34049cf12ed24d244b6fc5610dfb6ff151c342fbd66dca2606ec3b69f39be752e6b8520b1d59746fb535f16d2c43ee21106c1e9c58cac74c6b89079c0946dbcb9bb81dab94e2403dbd19cf1a6e0b36b67f47fd94b84a1a76b7cd842102ef5cce23c50d1e22ccbe54bc76954cfe7b9e93880ddf6eaab8567f23f1b0abd676e884a26c7dc8c51ff72ed9eb12e28a2a9dcf72b13c41ea3d399161af2043ce631721c280f3d94337ec9bfece7be1dade98e4c3a573def2109da254470131c9da29ffe3830f0d66828a577ff778d07ec98f03f787ce6c9d51d80e80b35f350e6704707e5225704bcb8a1d1ecacc8ff73c08a4737325328695a9138f6113819d637d6a9b919df39f9f337bf629a4650ed3808dcbebb2b26b2940bc08abc10fc72083ee6e833179da11e0ab625c3a31b6538cb1322cc28665d08e509fa2dff9752329ebbbc053f216656990f7100b39cf46967cd92bb5652ea47db2acf4882d84b1cc8b4a99dd142413d4681daf3dde5f13f9a4401087b97d85af42d5133b7195a682932f5bf78c2e92709450925cbf571fb9b0d6f43ed8c5bd1b415f66e5beb310b3003b9bb37cfe7f0737e6b255f05b1cf211ac1dc410dab1066ad4e199a0b38ad1ec371e3dc5a3873ef59a020fdd98d9f71e816bb090cb23ad9298f3d5aec22be74b42e0fd42d7b0313492db18e96c76e5135dc31d0f2387b9df97c050258d996e603c5e0ea7790cad19d6ddfa118691767bec64806a2430cdc88a5fe9d1f6dcdf1c15f74645793d6dec7eba3b76b67b858fde5400a925d6902589dafa00c538265bc7e5b4b6662c9241cc1764ee848e5b64bf482a6432a16410c6d587d3cba41fb4c3c85a845f93e990567cfa9895d290e506974828208277ca50528640f338eb2bb6f65d62676cd54477a92361a5cc408354c9d10a0eea65d4d6d1c32cc5b173ad789ff7ea74bc80af51211a2fc462427ed9d858c9da858e274e6747e48a17505ffcf391ee000a0b5f9ed372f20cd54410a45058440c1b2b764bbf90823ff9f06a0f2976b9e419badcc7cdbad492b5927a20df4c8cb68c1d5377063bc8cfe3362046543c834e2a7eb43a920b3a0d13ad1f4a86ad50d98e31a0fb5a895fc21e75fdb71b0443f0db806b931b3fe27a4aa182eaa6d5a1a6bf2f5f0a7f085abe937f81d63cfe4c838c86c786aa29e70fa9e180e1e47fd8ff2c10e2b14137ad5713d128d795fe223e7d9ccc5a762bad50f65010a10ec855408fadf1868c8a6e9328d1bd1586096a6db96a698c04a992258132b096ffd56483afd3658a8889f6d467578cf8c689519174fedca05ea8a56e3fd77b409a5fd191a05c6b5912a5c59c2b48f98956bc95bd36b30cc68f6b7b0200156c51c24b6bfe4160a789ef3b5fc29af2ea1e5bd6702dd7393f28fd7249f54253ab4c8af16428ae0abb5b22425fc33c7e4a7420c97b11d08", "53", 1, -395415678, "7468f2d20e3b9bdcd6f2440b1e6a87e4b62d708a87e13d16639fe5a4eddffab7"], - ["030000807082c403044e4f0d278def1db451647f061b38f55ff9bccebdcfd4567d0151469542e5f57e030000000451536300ffffffff1ebc44abc559eaa26871a75e441cbc125efef41dbe23beb76a90cb98849b3707000000000753526351510052e0ff7b860a9b74d122b6d508ad0fb4c05daf5ad65e5301dd4a3886a70b853e7365c4de6200000000055352515165ffffffffeecd88711f2762b30d100a684f3d5d41320f84918c153d14951647db9d6c35b401000000007150795b029c5eca020000000004525251ac9a4306000000000004536a51535fc4a0a6c90319f600", "536a6a51636a6a6553", 0, -1560453704, "8ce5500e74cb733fd632091bd3677a6f9f6e0233fcbe747223a53d37343e5acf"], - ["4df7471201c0343609e3f91d97d227404a66d1488edfe6527561bd8e1b2fca36688de1c89a00000000085363536a6a65635326d7b2fe035c0b86020000000005ac6aac63ac03b7ca050000000009535100516a63536565cfbcb102000000000553acac52530000000000", "52ac00526363", 0, 2100933674, "b3a242c3f6c8b9d1f673b51e1c797d0722127a018a688b8f0b24fdc4f66499a1"], - ["9bc1d07603cb402f2750e616406b7b130e24efb80e71e70d6aeb4309165196f4f5af262e07030000000863526565635265acffffffff5344624c48512f3b0110b98dbfa0b53db49ccd3db5c909eb66fad70ad143af7e00000000046a516a001b142f284fa3537416ea80503d145bf7796033e0e964a4a783432f5d1ce670af501960ee03000000026aacca8cb49f03ef68c50500000000046a635265ee4a46040000000009005152516a53ac526a6fac680400000000076565526a516300583835f2019513df00000000000000000000000000a10f85251d137afd33032dda51bf3ac06d7a3f21e794707d3637e12f358fcc83057319184cac99dd1d844a35d04f3691c1f33f4e650c1ba289c1cc133bb0768c35dac60eb65204affc983b57756b8d37ca2d5083cc8b1722335ebf087b561dbe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000488ee4fd26678e76fdae02be6f5ed1715a1cf82754a3299cc19b6fe2d0f29a52e434b02469e678c514c4c5e61b5abb03db8fd0764b12ff891dffff9f8baaa0d848c5eddb853866454be3e59e5c51a686989e90029f93985e01b0cadaf62ba7187a28efcc65a0dbf6ebc3144fb4e36e71f6eee1243ea8cb824e38c82e21e6b5da0212e20b1fc3fab0a5168ff14e927943538cc1616f2f7d1eff230cfab73ccc7473020914561e9c1779481b80073fc28fdbf5a931dc1efa1b368e86d245df5c9932940a0876a9c16edb7959b9b99ec342bb9bb5c2e2a62dec7b72a8aeb1b6ca6aa096e12b0be5275a2faf85d987a4a92a583bbe10852a8784195271929aad3df01ebc51031dcb8a023c0096d67dcbe97b436bd657857630d846e031b7d1c563b70478467d0307bd3cb025b9e81a4b6a69f3f4ca449d262c432a1e7c704b429a5d21e4789682032bfd65ad6aec351377734e108f2305cd3b1f846e2381daa9a8b4a555f49d44d1020ad49d53714107b343440f78c8f0ebcdb4ac811e431174cdbbd8520113b0491e0215de083ce272d21c3f2eb3db261930495c4065cf415a6fb2b4baa0c3184300cb24f29987d62ef8de6201b6df004032bace3aef27768c709921b3e88c51d016cd9a38f19cf02f7d896eec816b4168a95d8ec91b9187c141dd9a8fbff7f7db84e7866b1c044578e193e5199ea3f39d06fe25576918090ac6481b48c3e10e36720bf0191b9e4be4db9e475f0751860b1047ca809255236d24ad8814ba72faf2897b9a97fbe00558f85657d37aaaebaea7cb9f0e4f88591c999fbec7268d90b9aafd133383da1d9de3e2b4483a4ebf1ded8a39ea148c6d80b5102c93e65c5755df393cdd01a88391d8883b48f5d5095ca656982e81b1bdedd26f9ea6c9a028312480daf6dfa583730001ae71e087037c37ea1b6d66cbb6fce6abe0852e775c6fca69906b249d6ca977d3ce55b372f4a729f877e1ec2378f66043e3f8434020558fb4e5a023b5afb90ab19afb63635cddc20c4585c8e92c8bf93b33ca2a0e273c746be522dbb3dfc73f13a7b1aa773712226b7b48e7f39cb963221f467c5ebf51d02d03a7bba50230012791fb0f80f076b47bdd689753c2ea58dd43abbe82db976b1e581123cf681389e7ff22edc36285865b4c9fe92a3212a90370a2db42e8875a3909ac945b65b68416f7981a4a21293d006b1f44b0b6de9be46ebbddda1d343190f64d518320fead68284d59625f4d359f13dd380bb8a26a0606a9acfb9ce8a0c50d7dde3c3da0c59ea6148e3fde73e0799167489727a46f508869d74bf83aece8b414f818e0651205478a7af6d5524f1bef6aecb0430b754129e878b36cc31a7697cb02291a93972c3457585f274054577e08399e4aba34b738bd6f13402904ba97c230ba8b95c76846c2b0cb3a4497810612ff64fc9ea39da71594bc0eeded7cd66170e357d6d38d0c5b88f5fb22f2839e4c4d60e56b6318c4f5224e22dabcdfbdcfc2fad1b4d8358712392d59a19063dd925412b9068f1f5d8951da08061af6523857cd2ba36aeecfcca1ec7b2301e8f2cb274557d43aa153d5d31cf0ae27b53baba305ffc4bd1117099981280a82e73a20a170254c1e1357638a4f41fab956a6e3e767320940bf791ddbb6c23a2a96273d1d79783f4f73a317227740fcbb2eff873c369d9f835cb35f1277d17d321d9cb29cb50dff3c259193286bd4fe6be91f2bb5d1e34b2073a2014a4a0e9d7b343f62ab02e7784193af720a2250af436a20c06677701bdf1bff33ce19b69bbac689550fc9b82760110d5bdd69436f96ca584b8098a86e07c7b95a9d4bef3aa368e1bbbf812855fe4191c840c88393103d50bb3d1490d8a1a010b54d3964a6e1566a9d481e1f11b1c9f4d931c00e57f9d4c2c5203295fa3d10a770efcb9d1cd8d6d01890537035f5756dc05c45cdfba4bc373c9ccafcb0597e7f0ab53b4f7a1ca95ab6352a398fbc0c4cd804487386d3ce965f099511974e114e63c3c55140e729357b62a492b9d8887d3e64b43a9b992969558e2231123a56cf3025414dd3a155386d16626b5b3335d9e096e64ee2c2d8b335e3d649c076e185e549355eaadb2ece82a93dbd421c3b3b209f84478b6dad553a585f75e72d83a80d5ae14020ca5ab868f2e0861a735e34d08f633461599f72b9f9869246705ad01c6374e17115e949a5599f6567c58839f78634911256f41ae3af68ae706eda2ecebf384a3961512d1b737913860f4f872a53cb9bb71475f95ab8e805a7f2385b4d286d067615fcc08a07f50261220874cb813e1d374c36bb461efbc8ebd1694366cded9db4fc67d70be3b73cd4a325dbfa5d6a98c753b36127d9e3ce7cb4b2bcd31e1ccd32251925ee926f24ad6ef4bac5b4eb93b3f913fa1c40b93e40d56a55f9995d692256989f0c", "51", 0, -262673329, "70d16c41db0711e301c4cb9599c61e1a2fe30affc073eb7aba2c8805900f515e"], - ["030000807082c40303ae7bdcb35a3d282af38988fde53be6521a71101eee13a3fc89fc546e47fbfa3a0300000002ac524bca559c5d72bff8fd449d8af0ad97637e6badccefa7a7a76a91ace863c9c63f4f1d03fd0100000002ac6521835fde0d10780ee5c4f33f45ab43e9a33644d61484bc537e88dc88b77a0895afafd24d0200000000ce040cc404135b41000000000009ac5352acac52655300cb797801000000000100cea06c0100000000046a65516321f2ad010000000007006363ac00ac6500000000000000000352780f0000000000000000000000000099ee335b1a028f2cfb6acd04d963c482d25401408de974a611b8eca7da3fe37de6ffa52308d8cf45d89e81f0801a12c2e7eb805ae2db6052f341bf9a241f483bb330a447cdf102b0fd28703033dcf717ee2d7aa9bdd742c9c2a222236f05f3dc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004b614c279f9123aec6836da5620df5bd21505a4560fa6062c520d0ee63d986876ee15dea15e07d6d058ba7a6ab7eab90cd6bcf3182aafedc9e3936055d220c857a1ac5a1abee296527d11ceaf1e3db3f82894af6c74fc833a8dc1ebc5c67b5aae9286d95eb0ca19bb47455ba2a6950fa7d00fd02ff04984e45023be28af56289021496f84204b6ab506704bd1c9be8177d13d6ccc83a80af466463b7d5aabbe73c0228344344ffeb67b35647880e0d03b04e6c0b9239dca5764a9ee3dd33ddf72e540b025f59d3d47f14da252a17e913378a55f62a8458504ff7385aa7f98f8102d140c5d64fb739416d4cd4797be17176bf0074af19b2ab077d4631862ddb7f3a6a960312f1e451dbb9b2da50f1931654144af81faae76a4ade8076c1596d2cd2ec9f2d030a2fd786173b93ca6073903d6b3a783a72ebfe963316d1ee596ac0b9d7e0c5790326f8d5a0b9415c7cb3d7e8dc968231540afb2849de49b61749fbc6c9d1caed3903162e647e461b8550a00f34296e59b24f056bc38a0067e78cf355171a47a0a994021e7a8716370a4827c56beb0faa5cec1efdcb7bc16406b19baf656d002b883d082818483d88911a02047a2d5c0142e1b9d0d3800e7ae6ce1512a8f2c8799c15cd0fcbca3a6e6ce746abd70e130acc97b6905c599ca6364c869d292e99e3886b86e9849bf4d88da8ba9fd65bf31361a4e9cab0853290aace4886ddbb7675066f6b8de8e1d81bd8401f44852f2365719fc7b732ff5266eba3c28290f7087604fe209f31b98ddd86c5df200f576a10b57774d6f4f70037d1654e7773244c3778e6fb18f1b5e3b5b36a6e4ab892611eae24114e0d11cace356be4bc3ca88b51b2d878800eb8ab57d72d2ad197682a180383a61fb2371f8b4ef05ba29528bc3af4cc71fe6fc079a8acedc3f633ca78de37a3394c08a35c9de93655f87916b6ab6f6a0c0ed49bb877c5ab5f45b3c06e817381da32f963a83d4114aaa094ac3a018f3be003ffcd860bd08837e7ee67381a4d97df38bec50fa620c78d976ddb693547aa0e8ab8abecbd4617ebd9d36a2c9ecbfadd080dde713dd8a884869e55783945dea2e67261d66c9340affa46aef3e525f5c5e2dc4921e10bf12f9359978fa0c28be1b8ec569325a43b26b7977fe1bccc900ae66093bb63c96caf9a54ee145a51e80cd2094b97793b435d1aefd76891a03414b1a7a7ab8967b0256c9ad3f855760a22afd8fc6fd07505953f4c0ea13eef871ec669a2254306bbb0ea9037a9f1c08dcb40ed0522e3ba015b446aac579778fb00467673892aab4678f290156919a65197ad183bc4c9778f498e216245575cf3eafd7ad00f5c84e258f914b9125af4c6b616221c590fa6feed8bc97b2f300ca90435f3af64cf5c0dd09be6c1a7945aeeb1e3bf14f4305ffb456fddb3ab96c4f50adc89ea28c63e78cd78500adc279cfb5e85102e4e3a4a3878c30dd03838c83779a65d7475af8adeedcf8dfbf74f2ec833ba7d6e4242fba3b61e283d0f96c594e9b65f7cf3307099a24d06a1f033f66975e17d511f0422c376abeee49b559f6146c9eefd77760b1cca07429a324ae96abd796f1fa28ad4ad4c6f0f13383c1c54be124e827eaa97f31dbc29871418f3153ce2199efe6a275d2ab2c01688a5ed0a43c6deef38a0d70fbb029097d842d6ebe8fb91c36f9353c989e35cd0792548ba977c4d839b72b322c5c4c1d9df1e55dcf0bc21ade2ab3c3e0cc16672c94583f699a01be4c8dd92717dba90e09f0d913762fff4ed16d1b8930f3f6e17085bee882245b8aef6624242acdb21947550c2f13167a7026154ea675975af976c6f8852c74242fc2d12c2c5040de88c2361683784b1e34a7d2cc84d9da811012cdea71d1869bab628a5430298928c252bc1cd625993b36d10c398910f75b012a5a4f5f56ebbb803885848a15cfc5ae7578b6ea8a91c1e7cc600a4f7a26ac8a97168c2fcb5211622d51c52c3d2cddfd09f569f5dd78029467ac4b4521c536fae255754fd930cc863701d4edb669ba14cad5b0e625b19cb5255543a92c9d1622f52bcb74535ec5764c9a74df1a9f7e0a34945190e0d00e4696c9123ae47d9873d48de0b16892e4454954bdb686b7e958a064d3d93f1a89342cc0ef17ac77da686450fb5e2554ef4e840a8f7defa84610f1c7698960826eaab7df11a7e8fa0507addd1249851d79acb1eafb615767d73af16d59acf153e3da4fafca3fd8bae636ca2c9dcc46ff9100d620e00c87f96fe921eb1b2ebae4803bb80225c1dbbc8f7de0aa2e98ccc441100000000000000003fc5e3010000000016d1faad0d9742cc25239d22dbdfb45b0bced396a45b87b700503b9b30d25618c56818d1280116a152b42c6716331157c1a7152eb4141bcc808c1541ce0b346222c0a4cbbfe66418666937bc3513b0ba6c90703d2a59543ddf43dd0b0197892100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fc4b63d45ecc5d3ead962ef78dc97f65e6892b5b6da62975c75cbd100a5d32a8f197f31ef18b8976288f1a32064a18d4300c1a4799fca5ba00748f24dbc9c777c103f945de0169dcd536b1c2e837454acfdc391b6d2d9aaca69d8fa1f535f81dd83fdeb88a2e5fe8cea35085fe7e30a98bdacd730cadcaed51640979388cc6610227dd37dfbe0025e0c6110924428e88e0518397baea1ecfa3b9974099d94159f6021aada538b292f0415fb36ff3e4a52b0eeb59ffaee919afa3939c0d2e9c05bb000a06dbb2215692d2c693a2eafb9ffd30fd55ce7c687e43429a98939f539911e35bdff069818db228ea49ec9bf031171e74bcf0e545204cbacaf69a4df4640877640313bc51b0061ad2b9fc213977bd92c7a05c0f7b5e9c5aae04ccb6191f9df941a702105375bfe89aa94e4c8b020ea8e5e189f8da6d94fc315715ea0b0d5a0ffb3e84031b285da8806e1fe2c8dcdd08d6ff4462dbefdcc295bc14fa88ea2869ce69fd0c030e95780f72cd409e12d6a30897fd67c20e4f11db9e11d2d5036b04a5bd5deae5022ecd64a3af7cc5aabddfc2d095bb62f34c5406934fa275adb98ae0f2551c38616463e0295e08916d6213299474c6cdf12633b7caea9818957e9c9086514ec2865579bdf09d8e03a5caaf6f8546d0029808f3f7c39a27608a3082830a2c3189792af75c92cb4e54065925ff75ecdaa2153f4de9035fb645b33f801a322d44ef62267b4843c4e8b8c3aeae0a3c19e154f508e8aeb8a8eeb1ee025db695b452f68df1eb62928db5e9ab58a8e5fc251e1833b329756f35902bcde60d87eda5018908b02a578eb9f6d9f173239a5285a81434bba27ec179044579fcd232b6ca3ca5d49fe7e7ce9c5585d55fc64dd1b5bb9e596c68a5bd8aa8c3a413c328ff1030dd2a66878da31e6ea3472412a871dfd037af8130765884ae482f187676a49d79e7dd6068be9bb496ae90c5834c016c93e25a6d6e2e5c763efdbf522bd19b7a7a1ce007826270d0d3b5dfa70d401aca5d7f77532de5105f69380d4f3e17d05713b2fb9fa10631c4a489ec02af77e8b0a23817cbd2f2ea5edbf675f6eb2d773a5606572bc6c9399fe6a0a5b1977d2982b7156d6805cffbe9edf810adfa608c2385186285f0405236f716083ffd44851d07241324e32dbcd72f28fe64878e7f92dc90232b38ca9a22c57fed1202f395f928f46700e6152370fbac33d95b3ec86e57357b2b3d1b0e32865b37f3de85482bc27445ff419314698920b8a1189756888b65e09c48d603f42b2b51f863296a8df7e693c1d2eeb7828ee0651805ffbb3221a72a0275149c0da360e74d5b8245df927acda3a50cacb6222492f95d88e85935e827173f272ad09f104d6fb14d318cf69670b4a0a9bb1a2de3270416bf9bdb93244df670087f2552234932de5c0a8e9b59efce7e02c0c095e356906000ad0c5ec44b0e223a5c50f79fe048a3296add6ff4d1ef36bcd7bcf25d83dabeb58bed364e008ded246e7c17e83f5b32c9e8719cd268c40a3b62ffe2a3f62c2fb3defb6ad10926addfe664c64ed4bb05a0ae9a79ac117d8fb3f98a51acea5d62521222ae4deb3fc75af7a9031b4849170f8fb3ff3728023647effa80501533f83a3966243b3f5703833b123c4f33cde68cef471742ce12bb2d973205d4d6bc75b009228a0a21109820dfcac7d860c51588d25ee3fd80c7cf6a5ceea6f0b201624780fde9569189b03a6c14c9df282d53e4a9e792e595f1c3769d64c59f59e4cc9cb93b08592cdec611480b38e8cde0749574f09eb9abb2a636c738cc407de5be4cb784c4dd6d9467c0c41577ec767b4c4666fec22233d9f15eb3e9e4dbb8142e0df7e86420cf448efd849d0310d6ee5e800b03958b63d81633eb8447f75e1086d3011a91f57afc7934783408a25c1101fc4e0d646e6c24b5a74518592ec8eb9e84d68286d2765a9af6c4333846ce5b2796e44cf95a3c7cf18db791ebe86c64dc1e1cf230fe8bda1a68f7365fe20873c7bd75e86aed350f7bd113ec001e7c7c507ef98a3756823b2c7d5e56964aeb2f6f9af5c817d17bd1fa06e838d6f76edc81d39c26eb8da0dcc6b9e9160f385cea9f1ceba0dda120043db3d370a0595b6e18b54c4246554aa2ab5fae4d76656a9938543305a2e20d8087beb7885fd262191952924c8ba228ccb730d62742bfc66b29fe93b2766f118ec32ecc5d03fa73d9b48c36483cf0d36d3415766ffb87ae609aaf44c7598bfe07896bb83555426575e029582820ab6fe6334a44f1088f268d8e11bbbdbe36471d230ea3480200000000000000000000000085c75c8b4bb019551f3a67a029f364846df4ca1fd45c939b8aef1169d2ac287c21e0a4e14c3f19418d4b34f7fa589145aa1f2219294d4c7967e5c6d66bab4b24f81a610fb3eb1a3bb8cd926f2b1cf107a19b65cac519dccc1b5c0fec5ad4403500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e3f4e18351535e0788bd7f5186bef0199dd89b2b026fd2b85f10a1f9c4159a30e9bc732b7342e563108c34d7533e5a88f5084430287e2077743c65c6fec0a3215bbf254dbe754de4dcf25eb80732f9acecb9a4e1addba3807422414ff613b7b121cc3f3c25ba8d2d088844998543d5f84f0d015f166436b72c6b8c6532efb5020213e8eaff1ee09cd5bb5ad85a510981174241b2ebbaa1d9fc95fe66a4f3b633e70326a7f6d0638bc09567d994b10b5a1a020d8c69c993b04868e5781608623092ba0a03e3aec9f22e944b27b5bbdb403ccd49650a68ec4d2414da20ec1e1112bc7baeaf6670ed9a1698c2828ba61856492ad6f34603c22994096c62a394f9edf9b24003062e3cbd02e639d33a661174b533c503f42a002b560f69eef9e46d928e67653c0212bf91e1df56ee4ecb8edcbd8255f81628e132a73647b36812d1c925656fb29b0316df1f7ca86e152e1833b3b08409ad55fcd8da798358e6f8833bb6384dd6f9c9031c05708578412bcb6ebc50e8d7c1d4345b395a31f59642a00dac1a5876e907f1020c0cbefceac44f87f09c8c8c7840729acd7649d9e8be57e38550bd82d210541191f6a25241c9e847ec7eb033736adfae149630d88334b74550d8be1b43e86343cae2760e02bda14a5f6afa2c5deeeee8859d13116017ca9178d4e681293c22a344a736e67017f50a9b36c3043a4cb1cce36167eccc6bcdf951c80a0f2ea22c5be8fe14b222a9b19701fb16151595410ffaebfcd4e80226ac02ec26d926d9a1d2666d574fc52c372bcc144a1d46d86853ead2a42dc8463201cb1f46eee66249e5eaeb760e42a3da2808927d6390ae75efcd2f02238a47ff945da3772f8f78bbcfb5f7a8bd98522a61f288d077c2627313cf6f13d803e5ba09b6314f2d63f3fe1b7dcb0925c5e03479346077ad92b13b8c006207b9a526707e4199919386f77941783fe3308cbfc69ebf03adb4fa969f6aa7bf32269ecd553630777990b16d19dfc37d2f99be51ba951f9aec90a7040788d88eafd45476368518c2bac59e8e8b7a38570fd4030abb32568eb572819c91076a1a1d15d3ea1238449a7e5c95ec84e02b36ce0a7972453e7efa882093375539022e5db154f2b981a87680eb37885b3641b9210ea6401edbb3c457f6882d867f2aa08a6af23e8462fd8ab3e85e596dca1bef64109ab090070f8a3dccb24ac6ad5d6696c3f8839d1b6e996b2caf47c482cba58e724ed7a248973afa00e78e13114725951dcc3037ebdaeafec24ec5dcd229e207aa5bf4e62aa8de92f4aab2ecaaa41667a174046a0e29a73b54ee3d7c67fff7bfd3fc8722f4636d0a065875796b8b7c227ff519fe3ee856243ae5f507d184ac866570d18b34c3581510ed176954a089e6acca3e5f9b75d7a0523ba685aaba524a99cbe65b7bcb22b2c4e67aacab32ead1be753aff038801476c790511181c98d34c423d878dcb5896bc606aa63e358dc12143f6d1c7b02ed6a6cc27c13c20f609976014964063e40832a50e55487cddab7ce6218f733e9d8ed6f547b1490faf53f3f0f33068d6a0d7fff3f51272c39ca3daeb3b2af34d8b88e204901933af15a5cb95b930527214cadb9596f9977e2498338d6664b09e5964c534b7d62a88da5f8bdb9a2efc277e42a5b934ed3838415a9b38af56c19f983e5af6ae47e024fdb217459bf561a267c456539ea156bf61987b7114dbb3e99fa9131c66f2d236f15fdd05cb2ab6c64aeb6913a98f0bce28e81c6264b77dfa8921c43ddd309951bbe5dd53afcbf029ec564c6d22e0da8e2842c50699d469e0bd5aa577d7e3ebc194e1ca9e80645497178acd3d5e55aa30adcd0ef910febaf703f7cf83188b64e8d07152e3a9857b66bb1f462e80141d1607e96596b82bfbbcef2ed18caa827cca16cd8a618affabedbbf65994b17240d978f8dafd05a0353a88237a91c6de4a22f3b0c80419eff484c8ff8ff3f1eb59d16ba9250aea98db805d3e4fefe2af3573bf0a7cacc5cbd24ba8ee9fbca36748493b72454e3b3fc98da1ee2cb9296e7c7e3917c1b2b72c39a981f8ec939cf04a63119c5cb83e95f0d183ac79b0666e3ac8b69add76e453c3751d2a348d8bb3de52b2d567d96132780ce332c7f76e784b1ccaa653fc041ea68a71a962a292e47da46621a1d562ad5e6b543a5af992042787dba960352caf63cb602bbe2032c6794825950a76c0a14905eb0d623e86057627eaea3e76e2cf6cc91a36636bc50870bf6abd1b8c58667e08a6305d28a93060d881dd9e824ada7d69e3b885c5cabce2e767c2aaa5fa23c9f047f8b050902f3a75f1123caacf348c3e044a8e4621bc482f60a2a6dd28a15dfb04411963afe3a197aefa347075b40942940099245b3c11f3530e5a75c6220c915309bd98a6feb6641e95e52b99701b30939e04bb43d90c8605", "6563630052535163ac", 0, -1859524749, "35f3de71356bf8221a32ba18cf638eb4831e29a7f6c6e75da6e5c28185cc16b1"], - ["d1cf336b03a2d367caed796b3bd941066a0554c63ff5f4e8c72722164a3dc033f440045b8c0000000001632a3fe634d778b78f58fcd6c1c11e09228e0495510d4c8dfc08b2f64798fd5570f43b7c6c00000000056a6a526552ffffffff4eecc194c11060ecd7b42adbd7c0a1dbc620f61c79ffce90f61ccc198b6ee3d30300000000c6b203bd011cca85000000000009525265516aac65516a3fa348b402c5052200000000000000000000000000902c20d6f93a1d4be3b3c20a29df3eb1bb3e18d62f63415181fddcdca5c5fb2c95f71e28d8ca9a7ebf4d35522e6fc19e6df0184f02462f8e76163e555bf3c0a5d8cbdeceac35a09057edd3e77869223f3ac0729dba49e23a62d3781f5846583c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a25efba1d58d75e797483b3931de65fd8806bcccdc9433601cba5957ea73300217dcbb4cfd01392ef369f06227f9c6e95c2fb02d2802c53bfb624b1d6c86d4918dd9199ed58a389fddf81ccf400acbd5a4e74d4c81605ef439c84dc4bbba724b373a7ac218b441514f55f0a0e5759d04f87bc8bc509990217d9655da0430fc2b0207396bd63063507c60b327c0ae91837e02011bccdfbd3b345b4e6344d02b2c54031761c643d6f0d5430c1ab515571561f5c3dc7ac8cae01e77503031529de0a4280b05a264e4f50452a110d5a6131b1ae68f7c56d729da24712dc059aaa4407e7193fbf2197e263f224a46ea105a10b1ca901ecaade8162c965491b7ab1a84a7d5dc030fc93081aa84472144d4999c470214d8191038c8702b96eadb9dbac07938744a020b3117299059e8503b5afce48ab2bace84ec2d4e72cc1542309e594e2a88bba40321194f04659687fa8ed31133210b93690b9ec368041d8d8f8699be3a2bec973202029a311e564f3e8a91b618135c4f2f3cbd221a591a28c9aaf625b6cbd3cd66b5021f059296033f4fc806f49224c94260b58a487e452c572b72d7bb023f75fb336504bcf34b1fde61f86fa26b432f4047016a33cce5d488c7834008d79745335940efd40bf3a73d4b30a8921a060f0990bace601475b1a502b6619c0f984865f5782874d201d9d9ba9b9676407b16b62123304bbd880ae35c9559f5adc3ef45dd13486097598e6ba229e22efab14fc83c4240dd3f4d0751dedf0f1be0b3100eb2051c5f5b2703840936c0776c9066722afe80f6e24fe1991a072facec4a66c78e8f1b63a2091f26728072d432f6465a1c95f279fe5acf8d0caa682e10e51b3ef1bbd497eaef1bdc2749e1f18d6eb3f2b7ba8b93cc3a37292eb937b64d3fc2bc1db1598d552d26af2e862dc5974134d00c20a79c9bd3150def5ca4ea9380eaf9ec11e9c3ca314685cbce75ec267676d5dad81cfe5121c7aaf7d51f3b4e1ceaa8fa29bc1475c6405b3a644b709beacb63cee7d5b3e0e6bd19f5c7b695fec471609353d156076c04788d626830750ef7b81c337676c15e60d93e71f5d275e7464b25d136845f2e4db1258fc2b9c48821b6c12358a9aa16b317a85d2a5f29ab47e63a0f4198d7104d920dfb406acd7d4c08f738f5f33ef14f3761f754555eb8490407c727c503ad04c431efbe834f726e78b9c3a836380d627b62c13668f9605e58e1dd84d62eaf15e6fc5f2567a55afd8b2cdd2c653375b323da22079bcc08eb644098ae16b11c10f291abbd0ed6af6f8f08dff396b4ada25e7e57aa7ba8e69876f5b33757343c8af302a7441f642f5d61f2a7bf1745b80f3f3db0911069ef44017dcb88a75e6553daa5150d11275a2a892379dc5d1a90c7cb13226fbd784b554ac8aa9e181aa62cdbd57bd99173ee7d3210a93bdba9e9c0339609ac6cfa79b94be1fef325bc04c011acf825fffc4b761a46a605efb3a5dd117c4af082616144a84f085714ab4ab06788ba0aa1e4eea45e17a65ebc5f1f05af767e46abaea3e401b392b0ea140826d99f0b0e1cb27935c5571ecc767fbea401bc269a507469438ae7c5e95ff3f8b29201d6e674b3739a71afa8f2954bf76ad78dec53a11b30fc0cbf139d5e452433af95e70afc3575e61f5fd0014c6aa349bf50b8078339d788c1a80d77193387d433f0f94ebd24e8d00a33d989f0d5a63ce8215507178cb44f3458f98f517ee500688df9947627bcecf0ac94a251a0865eee1416ed240495f35d4e5f94c6e0b8a489d02ab6a7c643538279e8a79991ac14d2917571c435520992595641f691609da8a94236f871844a9ad3c774c266e6ba0d44b40f7344236a6c6402d8bf72b7aa1261382ac9ef4ec7e98d07279e9a014d48fab88db6b33b2c10be7b08af0d390dc7e887541bc38e710acb68a44068d15a92ca720d50adf246d011eca66a12defc6a258f3371768b60b4df4ce740f325434b1ac0f5471d27de26331f2d39700a3499de2d619d2af3a196731b2fec631edcc23859daf2661ae21737a7889afd959bcdeac43d449ea27e02c39668757489dc134123c13d70ab0a8c152474478591a0d4a8c9abfe7c4d492da1d053d8dc2ad2b7be66313b0a997fb5320471892fd75ca81ee4d2a892e93d396560ebcbd9da1eeedb998b3d9e5290f8b936ed408d9b32eed1fdab58cea80c908c851b251fc19c7e54c405fbefa948b447bec189b209919cdc574a00e2dd8b7fab3fa0a6218f1a81658c6c7af72482add84889ca07b59bc2ad91e91882b916d1df434a42231cbb00000000000000000000000000d3ab1523738dc2cb826796331ba8321851e5026b13808ef490e428e466b1d0edb968e4a63c30025acbf8fe811a96d674a90bfe52902ce5f09cf9c075df206197cd6af6708a2ae6c3190b10d4b112271c3f11cba70f7c4ddb6faa3d004e89c46c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d5e94640cb9e4668e45b1b60e007b6da9c299ead626528e49bf4dbd1636d1e7458d281c5de983ed81d1941d3b70af1f6b573d3e098060081f2cf51d741559e094d25724271247bda5d13e6d2b02def3be4d360b6c3f3a72a133fa857c9b4f05fdd1358df6f98305b747618fd4ff4f1cf99ebfad11c8ab6a81dcbb61e81433cf7021183c623c90290dd23958c909913f2a884a352e0c4745214c918c6cc06b3e89902224e862fcfda32a97ca212f400386abb027ceb1b46fe971a7bb71c6e8e27aa740a048203b9b8cd36bb0bc7c85d79fa16032f5fe8c8ab734aa267d2314a18f95f0dc69fd0450a9224448e7ff055c4e1fd6b536f6c17c747164cf3658545acfa011502172fa09d5421c04e43ca59b76550965b06f2975aef5c7109e0dc574a4280675e020a208ffb42a944c5381d09d31d561daecde47f3687c17b32d3c352c99cab506202282a68c3431a02785822060f4b1374e85032423fe6aca4645af00fd7e7deec10031130c1df4425374cbf59ae2afb6b3c58f89c49978173574c094893ffa44be758032705513b9e01cc6cd749c7663587e82d9d71330e9481c83a40e80bf0f94c4abdcda2931b8bc710c5429575c58848fe3ee89d45df2104473e642425059ddfbf219847ee12fe048079a5950b0243165994a570147bfed931aa456bd9ef0687c30bc79130907c41d967742c948eaf4f15411b8e8b06fb058829236c12cb00581ca3d466ce0d9334f3d0a78998fcb52796951538d74b66a0e990772ff193487d43ee04eb8c35240d3c16aa53a587233e53798ff1af0cf872938888d668f66c4ebc8656905508a55002791de35c85dffae08e308bf8ba0d9f301df1371df2ff4667dcfffc3ee9e409debb4b839d82143a92acf65db554d5cd71e212e416c04f02c19419e04de25ce364720fd08da784b54df49035251e03faba669256a1e13fff7570b436e52119812e8008c833fad4a0c78c10c0133119802ef72ceb91dda69a2bf468c6fd1cd51e579be6e0e5602d20dfda5a8d66cee35e9747f20343d0039836b01189e770fe0f621223e0390822f1d2df5cb6146bd6bb8de3f2a19852c4f1fa3328cc2d62f19c531d085a2959f85ccf92020f84446074f5d7b2d01e9bbace970980d1f301d405753a86cc33c0e0a208c2d06c4be49627b2380a52d0ef80279411e841f26188a468cbabb5ed4042aba68172731e2775b2b3ce083d8f313d87ef4150a20d89b9888d5f9d497d8f883cf7faeaf27bbeed789f384d4ed506ae39bb47f7274d2e8d116b165813216b79b3eaf6d682458807be0af2c66009a72720d535d2cbca1b86064eaef9c9f46835df141f7968e6341b30b4cfef105c1de7f715ea584c2625853fd0d9819771846aeb78e33b62213b65876d3efd0775d77cd0034e098ae5adbe36a048ba9801b65db750b89576c67fcd893e99eebb20dc760600a16550bab52b45c1707142dd0196713017683b6320772046a73aeb63bc41a552cc42e1172ce3e4ba1721c53debe2966a37bd78ee6944e30d4ad7f1203c2fa1e23fe0d0621dbb619c2ee658a72d506d604e4fa48d2c488cd8ce3c955f5266d475d31c6d9aa952cd72d34c419998d8374ee2168fd63284623367752232571aee63db4ce989c36512fe0ae62ab70f93863a54e7da74d38ea8a2ec3a8131251391b526f2a226dc09de277340a906484fe1a23cb55a90b43d31cca191c9f2bfae7b6d40e8bd0e45d5f46d3a2c85749646db5f5d6bde5d0a11ecc370089239173c4ee978409316f18ef15537ac8e81cf3f14086ec28380249233a2cabe1d47e559cc080d3d9b59d929af630e859ca8eda15a33b9577fe2d3489c3a60ceedfc2264866965113f061e26e7b4ceeeb12e55f3d5ed2dd62333d0fcc29e374fdc5b7403f4f973e356fec83e3bc19f1997a218c3f52a47224e827b37e48a03c89e93d8d2ff651b05d7e874be4c530509dc3c7f165a612c748ea308533c8489adefdd131b0fa6431b9deacf0d93fc35fc198368a78f88948262de3d66eb3ac656c25ef657821d53fc033460c306d90d46271118cdae41bb0bd0c79ddd9d78e30cb994b6f4b96f4897eeb7433543baae6df6fb5f9039fbedd21b801dae2b559e4039015d5087aa597db21bd9b602806dfa314c474f9a02e9666ca8f0d93300ca95aafaa36f101d822b0ee8638030b3fbdb3bff82e20f3d56a53d49d06b84269dc76c2df8ba158af3052c34644fde22d1f671f0fbf159cd7c7a39ab54b01a95f0d2b86de0dc4a06d117f508fbc61657b74709b0c9a9b7c9fc7e85e727fa53c209d150251e9780b4361f49b62fc40eac84e865f96a535193d2aac83c0432426ad85d9440c662a3ef90deb68179ad476cf1725a3c492aa4be42ccd6a885351ab5246b0f34042385c6fdd1f711516afca9365d8bdffa615023156c0e", "52ac", 2, 1425848865, "91db25e48556eccb130bbe8b7f0d30583fc59192e071b3a4c658d60b8d34225e"], - ["030000807082c403021cd7a2e8308577b557e0864ef54d849583b041a607bcfad2b83858480427d4bf0300000006536565536565ffffffffb8d439e97ffbb94f79156fcd2e6d0b27d41f522a38c3e4866dc0edba5eeaabbb030000000020ea22e804f5ed050300000000016a745761010000000008acac6a00525300637206220400000000016351240c000000000007516a6a00ac52ac4378dd800000000000", "6a5300006552535165", 0, 213345942, "5c886fe55eaabcc2f555751158d8b2687381b976945e35ff087c087e6598f8bd"], - ["c1915e300361006ab80e30b4056141e849fe8532bf43c4806723c449e0d31d34e1e32371990100000005526a5251514f8d9bd514b560cc975fcf63a95f92f466685b9c43e422107fd49db9b51f3652de8076090300000003ac6a5373b2b06c633481fa5e72ce06120c37348347b719de67f19adec64a2d7cb70b9d4a4c2f9903000000070000510063536affffffff04d3467e0300000000076553006a65005246e34102000000000452515263a163ed0400000000086a51ac526353ac6ad085d2050000000009005152ac00ac530053ef17906803000000000000000099d28a05000000003564f2202a991f7c76d5c84cf1102c31f2c65ba0a13abc0e598d4ef3d9adbc7df4c6dd93b89f4c22ed6161039b8d5b1e8c885fdbad05051701de48a64ff0d0b801f3d06ca44c22627007b1c206c3549e6661de4d7a972f8dec2169fba20979450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043ac22e113e685836b33085856f81d33b9591d1043ac4de0b71b8bef9a0b77ff4e60cc6ec19a502dc4616966cf2553e1a46e580847e26668e480dd218641465c12361296d47f91e6eb475b7ab6c355a598516c95612abba910cd770a5661bca4f896230199e2fe3b23aa4ad1d99da936b3557e25027c67ec3c00e634037fdcd5030db57c9428279cfcf23b3eb343b522a3af0631a72d2488027e94c5874ed2126b02091b0bd434d3c4d46e8f67f1b84ab218431e03f7ef02d9c49aaee4808befe5640b08c8262e22aa1835f6749dd6d632a3663f3aa17bd1e6e97c9ac8a69344d798f66dc30c7a9d1cc7a1c52b44dbb64735e0161f3de92125f200eabc2ba82f36522e0218ab4bc26a9856d26f88251d1d7769ad08353aff2b41e423cfb25012c27b7409032d2af05db14cebbd0e037afe3f2be41783b0122c2095bbfd05454e28dc187d5b0312ae26e1bc63d5f7f229c0ed9f35ef01d5d6fa9637965534c58fa2e51812879703142cd667c72864b62bd39d666662a2fe78dcf80660afad91dbb56105ccc1f15902143ce3577a3b8ea0381d7fd0b05a5fa4cbec62291ceb293cc1950da68788086fe588cce3086ef2b9c28a8295a3ec566723e30de7b83aca4ecc97c9cc265b15be50f74a478a2b32e53437cf75efd2c8c0199e82f90b0b6e91144046491f5c613f4c770c280b918482b41a9db6bfb1d39d3e0c046b88ab7ca58bf119c7e4b2ef03eb781807057c21e70b7163663905520be00537eba7fdb62e743374f446c4c5e1211d0fc8a211b215856b6e1b089984391b4cd376963ab8dfe3faf80cc4acbd42ffecad02f3ea4c5008cd3be2504b4fb1a6afa763df893fb8ef976df12dbe139327e5a2bdda7ae339f840c9d07ec0e2820187c2009bf60c3fcc128f932a872537acaead3cd11536b2525048b3947afe405afb625ce7b3c66b3352d0cd6cdcff9332a61fcbb6a7b8e0a0b2d0778f990a9cac1a30f095c86a1a6117d2e13d77bee763cfd72da948e39a1956dc08b59d1cc55fe0d9ba1517a047e85bb2bdf5235c2e4b655eced91ef761554aa260261b6620ce90808b1932f2616371b676b069c677948486bd931d56a46c3b82a847c20a24158d57bdfc5079d2902fab7c00eb5bca8f822c2b1ffc69798e4f30cc40696e1f6e380e0941c9aeae66c09b73cecbdd65cf6226c9e82a4e56724eecd595f4a198e20f4d076aa398fcc98d93bd72c8eff8038a945d9212e56391298747a78e4ec58b1359e51f3e59de62a6a084c02613384116b7a9b488de6ac3206b040a83e4758d9ddafabb8e7018a3332c5ea5a02ca805e82ac417e8880c49ea97bf90a5e32011927c55dce0cae4ecf6fd7428a7156bd81f9e37a95f25587acda036382230013dfb119e923cebe88d40a2290c334c84f176be2c80d310e8b207b208e42b87e0e2e69ee98a04a6402b9181ab2aea8c381cb8c6bc7c6e21258cd5c4ee33bff1d48083fadaa0c1bfecd3e55f7a3251d6999d2dbf340b605033263569ecaf8d31659bd2985996ceefeb7f62f4e0e904201e592e1ffdbd663cc495af11ec7f0bd8111e0ee47ea91625bb01bfc0fbbb1c334656ac439554ae311be75f36221e21c02960926b9614c2a034e7febc2410af7599c1b5977812d5df675dfe9ce6181862d57c564426ac7b21557a366af0d3e62f81f1d6dcecda0c5f686d91699a6d6f86ee8245967a6524755cdfa21e64501671cc821534078ab2117403c5b9b6f17fd29ca136926592b1115833a72c5fbe2eaa2c29c21154d2289005de183dc74744edb8158336cbc0fa845f9993843160390730aec1783fdd55aedafa53e927e7d2829bfb2696ae1dc992cdb1c0dfa5da04259c7b1b1def2cb5dc461396085bb4df5f715b014ebb97fb65de1ccf7eb6cb231459c35be20fe73a97ad19873c106bc100eec60d81a3df013ea3dbe329a03b9396bf6ac11972169517f64a227f3c704cb8d352b6e73d6bf959bbac781747a5057b593deb0fa90de50fa240f85f628e4eb03bed23937762a4c142bf6ca12f03dd6166418e1eb6f618592bb9c3717bd45f32821688838a4a757a783b4aea04686e3fcf2a40752e7b547fff6458da124603025830f2496aaa8289ec35f339b4eb75293d1c30c8bbff2412f685519633a2e9949c1efec6432f997d9b4919e8744f5cfa6554e77591699f0b0afa2a4d448fe777cf35609076f4e08f2ce7b0189dc7818d2a98e28e3208088273a61ffe076594b1db3e5f6637befe04b5d005cad073bbfe7eba0b50dc04186bba6730743d8742e0c23a5438ed6500000000000000000000000000372e33cac33155005a8559592bb92371b69c11294c129694a8fb8e92270fbab2d0644c39816d4ac91ad373c3f45b291d1c21764e073cb2b23f11dee8a599776f27b58b6112116043bea91a6612d7a455fabd5e2c08add0cafc3af20b509a15150000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000056a8643a265640fb316e656f527ebd58bc29aa4d493e939a0fece2191f7ce511c213559b2486f6d1a9d60a6c478e4d799153cb5ddaa430290799f7e891639fff86649ce61c3d9a581e1cdc811089878c936d9a8a7a6ee427c1a6cd8eab05f069d791f8074df507636bedafb8d92290f9dba2d7a33982518fea4c1af66b1691c10310bd9cd773b635bc4831928e318ea5790f5438c9d5fc26bd9a2969bc41ee0b60020c738de0c352fee5d9a5a504ecc63d873dad10ba8dec7cbb997dab4c16d6978f0a03ed7e67aa7255fe1b979118e2085face8fb26abbd383ced9263109eed9e99ba717c2896cf74f30b0a5d9cdeeebee7523e115cdde302c97bf0013063eda3fd3b020091fe91b415fc9072ccb4af271064e968df4a9cc3a34a7abd4911f722d18714020d27c7aca694d16ab1e84c460e46818d3b272dac3d5f725eafdef86334467c91022d194d037b63972b513e407bb2fd1fd5e987d50c6dede9f85138d003dfa61d33030b69633349e94c4e33054c5a6687dbdfa8cfa15303420e59b3f39c42fb463aac032559d47eed94230e09c1482b7fb4ac32eaa4793ee1f81dc1b5c18db3cf1c2ae0be289cad9bc7075ebd2c7fa9f2b2ba7d52439ea1891af4fd04d92d1d41cef40455fa994a8985bbc17ef41990752ff1e7c74f00de484013be70c7bacc21d469b4b2497d3c4efc227ca2fda67a359e72c60beb5f138f330cad3ee26d4b66f5489d8360e06bad0bd19b3d818c4dd4c30ef5c178955f426013f57b161f511aadaa41e15c7e70bd8a9fd9746bcf23eb9e70959af8843889bef0d3ed761e906fbbe2d83fb421cb57f95e90454a2c4cae0a7b87b4dd53d18b4e0fd949d5a77185f9d83d185e980bd8d0f4a57e20eb58759585ef74a34fae90168e7f20c2af9ddc17a0c8123dcdd3851c1c8844cb2184589bf5a66ac2532182ab486ed6441467e6438fc4829f03b39456c80e30b2df58df65238c603d29968bc6ac1e7eb42db0f6c3b2effe9dac678d9d05a1e97502f9803555c562b78db5fef4e221c78b46b3f154d31dae7f9c42fab5297e1161de4283d396551c7fbdcc1e28540868a6bcc58fcd1a545eb0f48089a6d7588aa53d2a7b821d4702adfca4cf25056075aebd230edb4af71be9e3fbafe0362578ad2826a6e8e3ffcc77ee28fa0b95aca2d4b8c4f9bf86d481df66c90af4d962d7dddcf8c7bd412846e18e27fad4a4197e360694eb685f31c4c50b27d8a253dadb12d3ce398de2fa22646f4eabbebb0e4f9b5ac7463d74a48ff79b1fb7136351381c4fa308b8c46a34d6ee2df9b1a9c74457def01c4d88a5a0937a4418e77f3b3e946d92e1057ac562d84623cabf3914ba747fe9ea58697f0895c20a88606a6428e4bc5fe814fb8a0333752219553b0049d3c47ddcf2d69fb43b3a7e53d6371f20f91743d14b940356e04911af499ff58820d1c70b855a3bc6809c2b2e6f5fc9c5f3f6036394d62c5bc8958471e1213172b5c19c5b9805a5869f552835cf4d8200f5f4e58e674a9b1e445e07836414f8d9bba17a50d2f049473aa79df3cf471b997a7b86023cefc8766e6395203bde8d7ad2ca72c522ca9915639753f34fe9142e7785ce4163f13a48d2e7a0c179f5be3983f496472ffb303e685e68f1f5726ac2653598e55c8c7d11803d0ccf4e98a742c0ad10609e7ae7b6aa821ac486b62af12615a27dce37048e454427afecc7c1c8d150fc6428daaf490c5d2723ea17e98e1008c118a00897446aef266306396e307e365917f87dae788a3b30226b5ef664da8bf2964b38d4cbc237e1a79f30af36ee92fe3709d2839d6816cf46868edb2ef4a0becad871f3b48ce5a49f9d690631e5506e4def871acf2c0222f2555f108ae7440485fd96894d1affc964064c0d3dbeafdeff4e77c615044b39116a0de13ea7a322fa8dfdc821c18a1bb4b5f8d60c09ac457f2e2e40c178902279cfb2a1344b3b2a777fafefc92ed839ea87204cb88f20cc6bf2afe125110059509828ae1606efc376a566c087d110095b27ba04853d29acd7ffcc6a57f3d96d3cbad8fe40b0f6f633c3473c08ca14ba2b61005e4f70178335c9a197164f55e5fd61b285b1c20b33a0c9f510fea0c7058cc54562187d4efb638bfa44ce0fd4bc44694494452471b7b6f8ae7b1cded5292be085356c2b4cbaf8afd6893613387306a97f490f61c1c2dcb8bfb773b1eda072177fea05b274d09f8a26724b8a1a8b1bc758d04795c5b7decc814b3c4f77687430ffbd24031f6cd3727ac0d9d5a94a631a867f3961530379b7d8f936220000000000000000e927be0500000000699c9fef61ace886beedcb85bfe41aff1a3a44f59aee5c8295b812fbda34c9141ae424f0797d0d0b0d8867ffdfb3086ab92db7c89517d1a1fabf44d8c46d51917aebb1b15f1222b2dbf6ef9fe755a939deeaf64bc5be7e257b117388be2795c80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041c697cde5a95e417c3e3d873715dffd63d0e9ca08ee43e726d1c668bedc4f1748675ea676da6d0527c6c449bfa4ed19ba51c7c2c2db5e1b4b2c41697f3dc53d76cc2bb417fc93c69608259319fad2360dbbb2e0cca07507a162409561101f88bb1ecaeed2f0d254ccb4aad2f3b8c3b963d0c75a545e5aa53d618181804170480215a6a96fcaaaa09e16f08dba7b8cc6b25cc24604cf14d8f51938ca937024a1f902134b58cadc38a4dad927400f7430aee41e5bf6904c88cdc14af85a213d49916a0a07251546063e22d9c64586c8cf8b3e46fea77e28f4ef87aded52881c4a1c3ba05a754f1e6c4bcf4a11efd7f86aaebc3a4363703e219bc9c75e769b14a2ed848402181d2ab61a8fe078341bace01e6342e06480ca97f5fbbe80a9ba64df07322c6d0208a7055c7781fbfda9c5abaa0e6cbd2bb87bbba82da50904d147c5df5bec9c2d0326f4a5fba66a0d94af13b74c497ebc1812ced1d8bea6d8b28cd9619ea362a2120319a54c773e6c284367f3861d7b1bccc517d74a8c8b36fbf91b89e43dcebe397202123ec3d59c4217625b9f5bf2ae719a9bd23b96ef8d6a56a263749fc4c19303c24b88f2f95a1637bf3066056bed7ac78353d0311b3db2826d06dd9b0221360373afc5d1e059f6b43b0e27ed6a445d573d67dc1876ed56d9c312ece63e0c6f364ce0beb5f5f3127408d99e0ac00d7f8773d56472b509e0e0c5ae83e1533a56a247c05f25ee5f0e73f98803c4d53bd92528115bbee13515524fc5d39111e24a95c0402c1109d7599f31422c52344902221720b6f0eb0aaf2316ab63ff59a03f60abeae07831a53eb9cec0eef2c3263580ac7919f660e7df7638b03df143f82132dfddd037bad7c22a03b79012d8e7c0220de357b992f2478a6a2648c848487ed6a287d9f45a6b0f2161829bfaa7cfe29b2a7dacf5305138aa8848fc28d0d8441749dff6bdbc2411d82616ffe454401b80ef5ba0917f1229e1dc69392af52cac728e16986c8bbc338803456021ad08be52835d56797b2a4d74151d4322d2fc720c597eb266cf1a76e1ea70323ea842403d5dcc17e2eb95f70133dd9ec9d8bed6bdbd00a54ce8559987fed4c38a8b5ae1fe583e1dfe5824a45eb2e1cada03f10fa488f47cef6f57203508802d9e5b1540b5a452d9f2307c40506d92053abfee7365d26553883423ac95a08164f0b0cef5721029b2f5628ca74dbf1ba168fbdbcd4083e9a0654985d849f441573ef8f4872b0507a0e67be0a30680f92347de10b96868a499fa0ad92c8ae22a2f559b1da493bbb4dfb2012345ecf3e259d53b60d3a586c325acc5313e544389892574be94e772abcdc43c07d0e6ece09d068b4070ab45333fceec9e0dba05b2f20ded354aa04f252cb1aceb1d291a23cd4162dcc6e9ea3e42d438b9ba515795be277f83ff8736d37237e14e80c166c3a2e56c061405ffc032c24ca8e0331077f7a34600fccc571072e067f2476fab181f582522b8d6810c0f5bd899a3a607690c34e7af7be96071102bc95061a991d8861bb96f230f7edd8a0b3c663322e395e92001b47b84dd182471f89a061e7d5b8ac5cc5b29ee967eaf4b484a73c1f7c292d467388a5e4572dd2b6f14a2c6fe408ca2d6a87d0ca08490579aabaf6fa83cd6640dc4615a6425f7df0d4b3676078a69a7fe37cf53641425f5808243a2ca7ec0f37d40a9d14eaa76fa7d4a4e8a014df43d743114aa0c29104950d31da1eb29755263a543dc895914e3c3129a22593150b95d794f4f96c2df2b8834da551a9a583ee3569abdd3738f77ab6dfcc0e6c60bee6be5078000c8ed039d69b3429a70bdfd8f73ec00c3cfd99dfeab107643a402946e5885d19e217a86491aeacafc5dc55a1454af36a1c0e59d3532defad9d65ef22139a92403bbefbf3fb0afea831687f36cf3e3db1cafa3b466c3cb918a597e4a555281a8897147225701f891d9d7e28c86daa3e4cdb5fdf87398b82cb9f4fc0e5181405638d71297306dbdf6801b5baaee755612ea4027553a154e7914e4208e007fe151035d8340edd8f8c29e939dc3c3e667473c518156f0fa803b6437720862ed7947b580d1eb77e8a3321ec192ed16ee02b3f5d89c895ee6c11a80dc0218d20095b39a2d895d704bb7149ff9ddd93d76f872f1a7d0a44937060c4fc5f5745b67f8f35bef70515aba13745fbc985681285a5ed6e8e33d91567c835471918c86dbc2bb800ec738ea818c90446dd423321e3c6b4b357b649638c7a4a92e416c13acd58cba4168c85128fadf33105e67b28e68d1feb00cc06f678b062637340d6e868c2c9f248d744a0c68e591503ad8c3970283dc2d7776810b6ee9e1b1e89e1926772a8021cf7c2128c2ddd1a15a27f0e3f33327ae3bd67a88f883ea202419f6103cc84ac7dfa1084c5455c5f700c4062f3b313dd908", "635253000052", 1, -1304925564, "f8047c00305d256b1b4593bbc5b276364cc92a45d0c38313d3c93347c4ac4cae"], - ["e6d2062004971807250e781e3f084a181d2525e8c3280c242297ff9808b58d773242a8f88b00000000007366a1b0150e6e4f4c164830330bd429ac9d9fea9c69bdeefc2cc003ce0e4743fd2bdd7201000000066a0000516a53ffffffff9570dd415ae4f5cc2b1c95c884901f39a15f44b57111c05e2ca4347c788f13260200000007536300006aac52ffffffff567d082a24732a14a7617531a447cf22a0aed5acccff12b75a3c5f927e868d1e0300000006536a53635353ffffffff04086f14010000000008516a636a6a65636a04ce5b02000000000151f401020200000000066a6565535252df971205000000000700636a63656a51b534e33903c98d13000000000000000000000000004fdbd30b09fed3ea940c103bc65430d56700ae8e153563f3ef34ec7b70ce97db7a9aba93805f1d4716e5a306f28abf92eb19c4f406bc7929672858719634950de4c76b8880ffeb940ab35773b7bbb268e97ae39d9695aa015888102a3fbb05b3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f7f1e9c9c16dbe9f6cadd0c40971f67cffd3d0a682914b3df0be490f514f7158af31112f3c78971fe9de3d2b5ae2a6e5cbd5e91312a86e2b57a319a9375b6bd9c35a6aa5fb4f2f514d44761c9b4b2c5c6ffac7ec382e46ec2aac80cb7548996813e54d7ded52cab0b11ac210f2a0cac214d852d44c8875ba73ec0973a1efe67020d1304d14db7249198f4ce2b46a3067c190dce73f55f29103fac49d006b67d1f03025e280c35a9b494453207050c3969aac781d0d48ee56336d0340bc6ee9f926d0b07a239957c18a2303cfa06c0d94e7186b60fe10f87ef9f579152f3b91cd7c0bb6619d9b21b5dbb6cc051b62ba4f8796582b6cac727f9410966db3ac39baa363d022a45078cc2e6f3b53bce6ae8552e38da32e6efdcf82c98d5ef9a97e37b89ddfd020a697181997c8a4a3781b94df6071cc69447ef34bafabedbce2c14a617ffc58b032c125e135e39954d2fab4d3eb9ff535a2720f156fec25b560f18416ece80b48703022e716ac90f6774d396df61adef43db36d1850bbb072d9b8a102c2494949e410210369cd33b9e949404372f1fe8e10da48c4307fe11e3bf84ae0b35da1de197c9559190fad804928a9f4e5e58ea61a54ac6d5c8f404d567deafa1aea2311b51d913d37cd5261f2e4126384e5669ed0cea9022df0b812f35ead4c48ba68a04e77082957121bb9cd1371ffb0af38fd4c346d9b46586ad5094c6d9e62423fa52def9673af241eb53986e40d5f3909c87c59f4d2048a19e9e18765221d04cdf5048c20a14ced7c4f350c3cb451599ce888201e43d1b832abc1336085b608d9d6fef89d947abc135aa4bcb12d28481f0b65f2ba109f48e54f105768e08c16a0a7de2ff429eb82e9103c2ccafe2881fff1b8a60ad2076f93650dbcc61d38dcd65a61cebf47191ff3124b573d3fe554a45f9d57f0a189c43ee42c2a9a1af9356e7bbc387576f1325ef20147a077226c7f79bef6791f1e88cff5fda89d0475e26dfe26d94c5ba4bc839a0a3736be498fc7469dede758e9472e3214ea0634d6d8f0632279caa80bb3b8712258eeed26e2129ea8806074f5f445ea25969961c5cdc18e5a49b7301f82a6b90a3af3dd598ebcf2f3e85f20af20f3fa0a7547e5291b2beb9b5cc44578c041fb353c60b31d3109c5bc89cb415cc0ecf009094463a46847f7473c766637928ecb890b75501ad2a163dae41db61b6947a903426800917c5831d07c6e8a41055c02b06e1fd7e2996601d9f981538238c4c14b27722fc97b7d050dd06082da72415f66ddb861b94e60b746f5320653da5c9322c25edaf98d35b58eb1a05ed7fdca077729d02b870d47192cfb5496881135043e7efee570ac10f876e49bfa6895346102226e410d8d7c913c25e3f9042190083306127338d310e9606dc623618ff78c9fecbb24f49038de9aa19558a2dcbc3a61c8b5d596ecc13ce29e75313a627dafa42931ed4550fad16ff9c10c6205b44c3b7525aec3fc8ad73bc3a594df6c5368f22fdac19b8243d0f1bebbcdd888fc8dc2302787d250535cb488bcb628cd039ac3b2e5d0a00164b5d4e54ef62fa3257efc023e64962ba4cecc6902628d6685a56d857bbeb4ece4ae3cfc577827bdc22fd1aa53bacab3a98fa5e5f2186fbb309416f914acb27369b7bdca0771bccf00de33b1c7e1fdefafc57ba8475854244575a880d0dd343e12d8c66c4933d964528a454be8593aa6008ff5dda674f6e0bcd6a97c31e4f6ed209920d1fe66db0b120209f42241cde029472950739210afd0e06bf5b85c8bc68eeaebded262dffccaba19548f2a4075d2f40761238b34178a45f23b3e939ae911292e650e4e66ba8d078ee1ceaa3cdf784a9ba1064ec343bcd4af13f6df7d61507d141378e9122ec05f2ec2485a74765f9aff9314d4f64f74c5b40eaf4745cbb927352db2cdd76185f9e32b1059071da8b1b893006ca45cef47ff71268af1b1e2c7dfb410f5f882b2a073c339bcae2a2cfca3050aa9f64a210f5d9827fbf401621181d4362de410f5b70321afb7b556811356e61cd7b8bd69b1df0c2dc187c052514459a197b8c4b9ea8d2a8c0ed45a554d054c6a27c6fc62604acd2946f21bba8736ca8c89d1b860e6985681102843c219959aa397093c665ca092e22a19f09532e657bdb872923eb20fce134a406bbbd3572064322b07a09f9ee8f207f6075b32416fb1a926b5c4a6194f9e34419fca9e709ff7bc60291a7f52338ce3d7ae382819e8519e253169346f73968647c2c77aecea47da6d728d982f121d62318e77540a1e16cc10000000000000000f495260500000000af62ca71f4c38f2e483f0a07e86c6512f45e19304595706a31a3ecf8c1da696594f0d799a80e9edd84bf3858e5dfc5820ca35137b1064af6bb86f9e6fe3076f389fe10a0b2d691d7404a88b92577eb5c3c3df6258412eed4b412cf32fe62266200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d175109e1cdd1bd4f4ecfb8c5a758633d91fbe8eeb4fec9ca777038a9fba3fa32cc0da6f4f3544fc967aed28a26bd065140f8be2a215c8c8d1fe9badd87d4305ce492118d7b0fe70638afc7dd0308ddbe3e977a945eaf23766d1f0b01f16fbd9a680bcc4dd1ce88d4d5cce23e4b35446d70d78d2bb06c9049ac44f7c05a22e610228a5d2d03b53549d3d5876c75d5922f4da643f3a31bd6aff4093304bfea63e630225877137e7af5e3c740411d4efa39aeaa64df41b9fe7d76bdcb3b750311ba1b30b0842b36db5b8aa3c17e2d437f754b92c6791d208036b21ce0b6dd9fc175d04d46f6ec82f3cfce4cda7efa0a3e711d3cd9b3071a17fdaab070d37581f0cc970ab02252fe6934acda8fd8fb5c887fa6999442fe0ed8aa82571d5991a2b8f9c4ae60b020bd33798cbac93a3bd7513f8fe7fe82614fae9f2bcac6c8ee5c57e71a0f8cf1a032f312b459fbfc327b82ebf5fde59e8a1cfc9076f94d170e9d01def31ae4ca531030b13724db8255ae972de7ac973d351261f9a0d5d4afcd94eb54b85168312973f021fb30202f39fe4c75f3c151bdf0bc16522a15768a3389ece82551490453351a3363c357031aaae36111880439c0969d3b3c9e865d67e90d50d846381b3befc1ada554d172b10ac8845803267166efbb7d6fd10ffb0efed0808acef4f9c4447dbfd32c7df9620aefec49a84e16b3789c1133c0d4ceeee91648ede419bc2a28fa20fdccedcbb14b52345adc68bcf0bee10c3bbe66243a29b6ea171b7471475aea52c784246912042a22c630203bfed481258fb88ad695abfec842848837969f2d3285baa9c6f7734c21708aa547d495fc26763824b80f4dcf8864860dcd5abf2d1570120b2aef7e83f6bf313ce9d8d00d118c975c49f29db2a0b529bde93239ed46d448e117c1f170b9f066adb9268d8dc80ee0112e5a13987ceb8101b32abbd8e2657eb4dce91d26d0783a132be01f336f112e06416a7f3bd291263bc6ab522abf1f99912b7ff3a5b16bca84ce9914a2cbffa5c8cba9fcafac7c35768654fe2ab2fe81e35a7606de487f488b3d6ed8ab521298af8cdba105b52d49b4b52157b7519161dfaf2881e09bc6d58371f332e5955a797ad19a53896a63146b4c8a78277dfb634667173b1fbf6eb3018adcee8c2eb2a1a01da1ee2e424992ca9557cfe39c7cd8be9ac58fc67aa0c51398242f611a00003dbe536e174cb3842b3544c6f1aa21b8ea7fb2711de5a76e1d157bcd80b6e06449f8314dd9bbef87b28e9338e0b58420784e490a6191ea12ff32f7e923e10748b6c5a0b6fe700a468c04e37e7c33bf44b3b162ea4123461c724568e2fff173041db71706d34052ff65fbe05de6306e401883b922a40d7624a31c66bc05a061a601e41bfffad24f9a3f2903b00d537ffb95d822f08e9c12752052edf7ed4e150957fad71bc3054bdf9dcde3e13f7e31ecb9813482c2f2f55a569454450d1de2bd366575e8971a4df64fb9beea85a868fd4d23acfc856afafd3fe9db17e1e68281ae0d6bdab57fe1c7cc7ba2ba6da4f0fd67f28bde4df40d498515c2b0d3a032c5a720370f7ec19361e5e83702cafccc4b0fb9c253a297b6bcf68ae543046acdcacd7ef617c2d3c4c0cd91341411f7f4f444f252fd6b7d9f41fdee9eadbd761bf082151259638e2f50ce13cd561e2821f355d93ecc507c86cf34b3592c00d660be71d62efe18719550e9683915e5ab595afa17d16ecefb57fa8701495c172b2ae2359014a2ffe04fe7a8547f69d696852d37e9d76ce31eea566527b1dcd37f92384062c1ed077caaaef5180c3017b14a267c768476d035f88595a82086e192981dea4b90131257cee0914560ccdd13c094248d0562d956aef52c3fdc07b97f566bac145225a6494f3915949126c49bc3258990c413bad015e63c4602e4010fab23a7a3343a5459782dbc6a1132687fc6cc43ca931d1d08347ed637f1915278c01db568e0ee914bd9525c16d2ecdf31272878ee9c134530c9a5d9f3d1e90cd0044d3de15968586a3af799e7239f5187aedec1111b5a31e2dd8536ef9d637dd714929b1397084a77a5110133e079d68b7e27f4d677d85a3ddcf2956a20f54a3290936b34b16fb04286948f6e55e79b3cea6dc606d26f93d9d05af865d22d276203e585c247c6781fd6749dcc250bb0d39de55301b48f829585a24d4bb55b9cccf3ce8791a67c1b32ccc66b7c2d361846079c3a108df08d3d16669c8fb2d320acd90c793bc2fddf78d54bc0a6eaa97dc2c6f705905f8916aa9587e1561a073fa348d538c4605000000000000000000000000ba575e89602bb512fedde645d0ebc3385587bf89b196667ef82ea0f887196c979135893f34164ea9fe4d731389b5de373a0ff7b4268cff3a90309f399df9adbe081c889934758cede1a30c6d5dc8e2876e7c09a9d480567a3cedd8941b3445e500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000db9276014ef1b0573971da2348d0e6e72753f06a7d72bf36407db6fb3135c87194dda5c0719744d3a75660b24c2ebbec15007e0e7feea9c5734f2ec42c790d0a1b110567fcbf5bd174a0616715d990d2eb59a70ac4a890ea1ddf1ae87a058080a45d20be31e844b1e9942617222a82f0cc3c82921b92d4da37b5ecc9a4c239e30201039106ca2c61938c2e9388ec12c15f414f1c354b197fada334c259a2af3fb3020255902dacee254bb6be786ab307a44c51211453b3acbe3ec698de51fff8ffe60a0699925c836e1e3a08d9d89db9387df30d887f0c339c5d24e93f68dbe3e9e6b74da5f1b63132fa1a64b06d15ad880490b00bcc4ec50bcbef72efa3f9502680fe031fdde170a28960443b4dc15c8d27005f33f0b38289279d7cc17b07426880ac4c031e38f6d4678ce942a67f4ac9f318729687700ec5fb92a4fcfce29b8468d0f9d503197759f076211bc61b7cc47681166638a025c3e22f43f4679922986411f8e937032e5191e6f51ac5da0cadbf1d67f585dd1988c8a9ed22563752ad0c6393765bba0220bc35f9653a5093c96ae372a05d364381d45b84f9b4556c8b8127dcd1d635db6e788c31084ab9cb060dc2705ae2a1a5e083500853d47881c22ae5e4e34b8de180f9e2d020a4dab607edb9d4f87963b8ad6c713336dfacf5065d0a55679fa4387e71bb31aef94d5222909c066535335f157810adde3b8378caa60526630beed793a7844ee609714f5810bc4bb469ca17b52a86a3e630e9f9325fced86ee9f9f691f330d03f14230151d1608178c3c6848dec30811b56f91c7103d640f8f29de327528c92f021b1dbb89ec05b7766ce07d432eb973f130270d41cbf3024e037aa8dca0069a55b73eb9b5d854a54579dc102758b10d85112163cc29291081f8c93ebdf2f62357d5bb187002c50d9c5be5bded30ae714dcd2d9e802de31e31a49f4cf129418d8b01cf29bfc544bd1561a8475c03e2ac23e3a774500e3bc8743b497cee6851f11631f7d04b8938066ca5c9f7118e652b99fe8a34d5d555cf11b90c9cacc773b319f86f84cbda8ed5f56dedf51a8cc688d9f33b1f3e594d46b966959f46f146d9b906ee5f820174871197691f43b639eeac514172579afa6b878897c59cf5e9d564c05cd05b7a18d2cbd6c203745dbe2a7b89e981add12450bd05d4198ccf0e8332755c470336b24d98dbec8d0f6298bc0757bd70af737b35751b7cf6ffc94e36e2a1abc06ab6c5f64858899eb4347c06132d299b7a10dbb8002f5b1113e29280e16f97bce3c670be836b374d578f79c9bbf767c613a2c24ce8e3297f9afec09f65f3ce48d2ca5e305aaedee4687353d635075b633a77c5bb47df366a64e09e27aa8db24a116839e0da7bcacddf7284346136b48c78b434fca32e77682984817da3888724c413ee853d1624101b9a4239e313390eadda112bc73bda7188a998f5e7b6644d1403b218e959695a470ba25ae84d14c9c79f84f2b2fcdb1d4cdc7bfaf56551ff14a8e9095c545f60b5fda7feddbc473b3711f4a01afbbf4cdd0c466fce209c4786f0bd35602ae0532987262394cf81c4500cc5052ad07b47a3782cc71ae8cacc7f1111a94eca1f76759672b05c3c9fd3008584997d672210cf61686962d58817741ca0489056fa20d0b2f8739080a4ec44b0ca53eaf7c01f08d0afe2e00dc00ff73f7dd18212da1946d50ddef0d99933f15ca5de814a73f8d5620340beb2e0f16c6cf8b7e37743b9b1502e549912e0790885695888bc2f896451eacd5269d86e0a65067a4b1af9a856a1157808afeee263c5b223e15d6e80fcb77d1114903ba7ce190913992ef060dd1e833925c390d4b1e3c132ecb3756c6350273ce4b2142986490d727200373364d5e09a720eba53e95c6bf73c077631d14ee9a229f319e129308cf4c60ffa351d797b7d8f4be47888cfdf436a17fd789c28df5ecd6085aa53cccfdf07a3ecec25bde3dbd75f3f42d380b37b8d557711344bfbbdb84693f35e9096931ab53217771667aab28d3dbe4e07d30a07457890ed0a21c6a0cb56150dc551df72f4e60e966db697c0aadbe6edad99388ca7a618c286c0bb77c5c067c2204aea8c5178875e932bf75750f1cd153da3dae3c8f15af1cc90e810ad1c98ff63d24b7a2845931a020f257385af1f7f077ca32953ed890e366cec74eccb2762a1b58d82308ff4b3a4983ce89fd782eb2e83eb74e68d113a555141cda923156359e7078b007f3af124ea8f467c1c5e4f75b85a73031d06ab000cd6e256bf7bc85900cdd1651617c9d1a6f12655f2a448fd2c67bed3b8588aff5e794f9da404731e5afba68d1ebee558aa8e4cbfbfdb3f024f07c39559dccdf80245c33fe00a4fef1f9dda88784dd683f7c77d5b48db73f513db04e5ca400a6eb392f6ce94d7b0cd3f98f42cc524202", "5300", 3, 1571146707, "14982e6ab1f9b3c5a5dd150c8a098a8e110c2f4a2a3fbbe6984d5d72e3cc26d9"], - ["030000807082c403012d5017a7ae26c78b5699d32a911a64104b95a7f456710ac9c6a2c167b39d9bd20200000003655100951c0aaa01b2189605000000000463655265fb644087e5a25d0f03b7e744040000000000000000000000009ca906e12e08c6145866b11f03281b6cedcc5213b3a3c8fe821f2aea571d1c42b639b64f2c5dbb0dfb06972dc9ecf971d08f6241abac84ddff7b5c366e60f89a3e856031b2b4b6c1d86edf623dfee537747ab43eee30387120c0012a0c8459ef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009000a8b4aa20858edf7e6aed6e58b7d01b5a30054e42ad8b2786758568995a5a5b6bc7c05f985874bf9ece5c103bd4915535f7ee6964146ca9c81fdaf2282baa43ad5b7674a9eaa25348ee8f0aad13cbbf52d62b3aabbc17d55cb32067f012660f7b51b5ff790f304831705c71567daaca588644aad8626ba3f126adb0dbb00e02121100c03ba0adde27998380f11dd163cd574fe60f8d3dd4d926727b145dcfdb03189de18407904d06c8c675ae70a5d70fcb0a8d0d88e0dea0ec4aad98b8e5ca690b042b61c1f414e0bb2dfa0400aa8dfd8f16cc875577ceffe592b7503b5b204a917a23ec31a9c25146e6fb25d399a49efa0c3c634c7336aafb843bd0680a8334430206104215519460e45faa1d0854187b291ab9aebe1957ab95ea76153d5ac2f628031123d6ddd30544fc4bef4fd672d2d314223e1bb15dfa0a9e6ac576a03fdcef190229d8d52453593fe22844eb48a65f8d193020120297170cab45833b0d43f97207032ebd4faeb52c5f275856a6d6d68e60439556b419f831cdd835e1958626b6d32203230c5f57efcd58e80f91ba7970d8032da23948d840d17ec80e0946c681406ece79f81178fb45ed2a6d7debdf8239428e70b634749a43a11faf93ae48662dc70d8fe70c60518d5944c19db933913f4f146252eabd853b25caa1c4cd5f0d8a98768bd098867a85a13f266dc6d531cd18ef74e84f144fd84e283414789c8e13b0796c3b650d0fc7eae6c4e722c41073511f0823373d55e73f3ce19cad18f30951a53fa05061edee783890f82805f035f6aa578067ae380024de0d40d8c903e27c992ed95c556400126fff760f0feefbce82c94ce442ddf266699b7123b53f74688c5fdbc7df003049f8bd78dca0ad8233fd2918bcaa6c4c287212de9734bc0989881ad55ade7366cbda59f83daa6459c6a6375e21212d024844db4c1bc7082123b92cd9e73dd6b863f0688cab938c2ac3e42564c4ac640e3096c46417c640b33a7a67fcd857a646654c2defa1d5e5b6f0fd0bf71c57852a981078eb581054dca65fbdfbc6f156b0f842c788eb87ce58fdf8bc87f26a3a830101afaf26b55aee5f27aa4cffebb63895e93ae1bee2cf269873be75b774bc7788cb5d3c5693804824583412371e1fb7118df4f7273bf08df2679a4426e43f95d1cc06c9bb5f1580f4061ff7a21db91d8f3e4378e801d34ee1b8fd11c2c8ace4043c21e838decb5f6a7291b4d0215f56d519c6ee962486130fdaba6b34c0c82b168d3ff91139559615ebbbd012b42ee4b4c7404ac790db212928f892a696d52f48a9b27a7676cea1c4be24b6f0d03ff74996574c84f25156e80f3af73a99361f0bec54e4da8cb1037b1fed85e4e9d712620818055d804633c1345b628b9f759b07790611a2b30c73f50fcc305f5b28fde529f18361eb3607af8f947f9ebf14dc98515b3fd03cb01652b8e8a0426ca719241448eb2d7d4f2e3c4005d5806f8154264f30f5341ef5d00f4ed665e1e5904eb822e04aa71b7f8fa6039f4574149f1558ebc876e4350cc18c39c30c3c25a417e1723a5e4906f8b820d4ccd9e16c52e0d85705901137fb2c4fbc5a43bc8b0fdf4176a13392e777986db1f60c471b1ee33498f57972b34ceeaf0e85af611a9c4e617ad6fbf61dc5c8e5a8d09910f03e88fa25134978bef0380eb3f767c3dfc29d3ea3a1277e2d5fdab8d0bcbadf317ecfdf53640bb3ac56744b90ab8ab2198838b752836d62c76bd9e86b4548737b3bc97185970bc3461a8b27cfb6dc283e4b939777e6b3eaba58e1e0f202dc396fb4f04dba72aadcdf1195e85854a56092ce9fd1ea4575a395d24582537f2106ee19c0a70871bd9bfd7ca1aed2a8f3e5daf5a5e0f80040de0e41aad6978bada360fc01a6d151d16ac45a3303bfab242fcd85195f72ead76b7d787a0c919bef7d28672572d8bc82364c23c72341b9669220463955b6974b1d7d5b80ecac5fefb13f27ce3f6d1e23671ecf6a09ae1829abda8e9bea4af65d0930f23607b94d46f600918341b230949147c5b42165fe5a5fa1526cd07e6b2b4ca620cbc4be5a904af0bbdd343b5ab92e021ee3c24469d97adfb0cd5425a53bbd4befeb09e095bdffa1cc285bc6ef4de3697f5d68cf31e0fe58b4a7dacd98578a78486b4f15007944ce402a12acde2a6dcd0d30a048cdc6a56cfa3774a2ada73508224ed341317d72b3494f36f6c65ee11879d0688757d4d1bc6326ab7dc2e1f8d36a9adff941fb6a5a3076a8ce934f2fd780f55fe983645a1e743120d11e9f19fc0813b564a9afc8439e050000000000000000000000007c54d75ef295f15fe7b65e7a1b10c1c553f5a7f97a621001854e73a66ca40ac2faace281ac456f94d663067f0d86accef37a5374c3d4d4ceca724beaa7dfe4ef5cab8baaecf35b4b290bfbf504fe523740e75247543c7867327321b66c0a048d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d2036570ec4f58789dd9dd3408d56eb29d2adfdc838527ce6b350f00f76bff5cc9a23946b4df90c21dcfd3df3306ffa61b33954659ae3d957315369afd10c57c73b7871ab21f31e708a8721e4d36c6e2411866de04a1de90948d2713c617cb9b121e146194ffe6e41dd5b156f27b245c89afb21e41044b5336fd323d02e3c2c502099c769d349f82c147c97884e62fb7a4ff9179ab5636fb509960f640fc99abc203057deaeee5f927c5c5b37eee5c1f15c6f91a60d046e138b52b34f42cccff0e010a03f17a5f02c9e95b5e6c8b5a373b77a90285d98145f5d0e4cced2e05a0f7b77b5c747b56b729faadf057c94328a9abb466ceb77c1fe5fd9ae589e527b4e2c3f802147aabda7dd151c52615e0fc15bc0bad313068c0d01a02b1badac836fd560f0c032e94cea5049f46c30d13be7543628b548074dd40970a41e0731b2041ae8babe9032db882b8f07fdcd17c0772031d1d225294f23590450ac467bf2378b6e204494703128bfb5802df6d0a925743de97ef7bf925fedb51569f3a64080d83d7686545c70214ad524be83a34c72083be5a4fb4f3d6a3bdb9513324d3983ff966f2334dcd16231f90d9024cd95b85ec181fa75293fe15e9f28e6315faefa817114d5b3a516b8b576141619938d479328ffc43a88f882f4f48b57fd9ca475ba5e40ce5b79f3457c1825f488b1718a15b0b8cd9afddd366c88df7091ef9ac415a9f950401b14454023105ec2d835d40ec362d6354b2f3231a42d30c0586a2054af01ab6dbfa68b33d22dcde518ee2a60d1bc1f4ba2d313945c540225e358a70df2f839dc033a99817d1c53c5a4b101f88bf6563d25eebc6192bf7932016fd4a058c574f8e5c2cb639b5e435b3f1d2e2adcf729ad909902734575cdd83bca78f640a75bc733c6fc8c932f625f864be172a7866fafb7f05851a67421387e4f8508e369ad755e16243da1507b322993a1a200f958a2cc3f9b349ccba026cf39828a5a6b38265b7cdf951eb4fb86d2cb075549bc6b589f75244b33f448475dd5173ee2b83afef3398ed5b5238ff1a25b13ad3730a20341a06d969a69e8f509728708cb8b5e87e2155e00c928908019cf885858a715668244b8644dc723efc37a4a58f1549a971638e7411b85bf54b59aa692f92574edc1ba6ca107b4ed621f8daa919e0885788e5d53be02672c0d38219e7b3c79c83ca95f1d9c4454cda32e1f536c55a1b8dd76ff151cf796b5a520b09c2118796d60ed2897c185a43e5fea0b313ead2b0f445f39b49ad47237729ccbdb097c225d6f1215a368d855a07a7286d7782be3b57de514926e7fe02f88cfa2e70fbd5613b130bf28c35679050a6d3d3ed88dfc6701493dc58a18ed3f7b661fe3b35448f119643f67a2830e14594c4fd371db0fae2fae73014dbcc4f9c8f49f20e57c0df615dfc458f04afc6368ae1a32335bf129405c9a4180806c6f044cbe9fa74d25c77035561c5507e5bcce9596177930b9719dce778d78ef09a512df017f7a8374064741e800caac15e9fc2668ab60557ed6381052aece1e1d0601969352b494bd4eca7dc6df9e7d59931719ecc24c2a85d49c69edda923083b0bf209dde5330cece20f6f4166f6883e4c5aaa077069dadfe5bda59b313f3a5932bbce129ef8ea8f0ae022a866bc508a6575a74a4b17b012eb4deae92a0fa9c244af5ee669706ac148f13e61b673eae41f806e1744db9ec0b51b06bed2537b439a4c783017e54fd5cc3299993c5e86dce4676454baad4f03017768b1fe33f3c60a53fc9c7bb9f690d4199e8f4534b949dec2db810259a6c6e5513bcee8135fa6ab34948b15f47b88441c5d63555cf9d5c863f5ba1f4728ea322644e3b76f6ad4b53a92898b0994b2667f25b1437703286791611a5f4c4f2a2cd817dd0ae2dc4f3c2c093554d518404597e6b944f33227dec2b303e5f15ec64b4e56da56fd8b7ef02f293f484af7a819ab5b6c4ce1d621c816f561c44e5ed5a28ed412e32ac2d1b22b0e641b7e375cd1c1ba2c7d3d9ae0ee83e93a46dfa28a4e3d72abd10f963ae645ce59991cb4df28cd2f336c0ac54710e1df8ee7c01f7a4258d15690bbb201e2977b242a80e1bef0278d63ab88cb81886c7e7a5ff6ccbb9f2dd8708e9604df3af08444a26fc9909bf0b50ad21755ab34815f4e98a8332716fe14234e8cb1c312050060fcb15803abdef39b1488366ed2188ba55800bdd291b332099b75899a471e6a1f40640296226a2cbc5623335bddb091015216bd25225d63864fd65e8d2b336430ce8489d1a8240a0d4ab10000000000000000bfa83e040000000053659b90adb6623adc27233f264a2dc3197ff28b2979fa280bf916fa3354b33678c6ade79a080e08ee3dea6b789f57b12292634e6b4885a637f5cafa1987cd71489f21931e79b4cac8115101b7ce29cf4a58e924dbfb97ad75c9ea53588a5c6a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e5438a18960fd5f3c48302ec8535ab2b405ff42993e04dbdb011b79d9d53cfeb25fa26a6e95ed13605922186c4382e098620a110defdff806b1f0f703121e996d301c94cc1220ff186ae65efb6c4a732769fdd43507059bd3e460be1f4100d5c393cef6c8b35457c88148832877c0c67917a31e71e46da85a5e9374c95b0a48b031cb85d36e5cbf647794a6289af5e95339244dbd9c0b5ef8a746dda363d02f8380317a545a8362cdf477a038ab7122422f23dcfa982d7e02931367bf581d06914fd0a07cccccedaba5fdaa8a672f595bd8c1704533c0b4e8e0f83a0686d277713633808b5a70d9428de90377595baeb9a4130b3f40f70c6598748c554ecba0a12d346022708e399892e82deeb046c67da410d7d1a51ef97b605a79c7ae9ca669320455b022a1e4f56b05dbafb04b11b45952d661e758d46c42b7304862b5ecf34ef7d5bd00326470e77058e3a85bd00497bfd68c94aea221010833a3283427c3728e4e25f8e022041f3b7b288406204095deb4ec2fa3e942b931337a93469ed0a2c14bcd19d53031c8969c633b40a7d3b03762a39d7ece948ea4fd9bc20a82a34d232abd903873a66c718349bd4a31692ec19556461592fbff7166e41a118f88d150bb33174c4336e7bc253b8f16dd40fc92fd2285f34455085992f9fca6244216ea8855805abd4f50f0769a9e0a942933ee08c5e6dad62ffe862b9712ed795e0d56f2cd7c57ecf3656c8e7d4e56650c76252f4391e0fabf6a1471e2875ccf5c3c7ffbec974bdd14fe08e97565cb340af04060baa528b09a9f0bc4962348b9d882f22342c7f58408f830f3fd60cb8f71e6b2be8843b913985e512911f75fa69fa9551540720cc115fb649c67867d8fa4d9307c31d350850d1e73c7a987d34abaddda49805b3b1c4cccbd621aae37f282709709aa6e59df030de0098794de1ab577eb2fec82f133fa097cedabf3c60f7b3262ff986baada9e2a2dc8b71dfd8009c62593f1f2861e5ecebe28095830602ecf8c87b599aead1e30ab59f4c57764e946398e7e9a5a4568db67ea55237afa10d1df617e465b01bb4d4a5046d1a58e65ff60e2e4433a6e9bc0aa4312b902f5bc7f95c49b362e3c46d000b6e33d7e0be29a83bc42cd4881afdde68a037f59c95043835592b063d77f0a5ccf22a9583d1ddaf745517e3055e72753ec8864b35598878c5087ec44f569b440d75f661bfb8198f4b8e4f2e2dae29da453e3549bb5a2f8a5aff73e32eb495e6337dfebabf2dbbd3b4c153fe21ec7c49b32dd2fa2f97067354a7737f6f8f2367af6f8f410ce7f7a854813c7843d60a9ff0d63c07a9e1a635557a84dbbc5a50ffa2d6e4df264ad5e6b7677dd0f7f4901392b7d023c4cf41494cf26403325d63df29c4aefaf8f76646e68dcf775189caabd2febf742c9c15c745b9112708a1fdd3fe2b417b5d3a944c624161f8c5209438396fde4b3fda1f0b093298c2531aef727129b3530173c389050776eb46917ddbc2698bf0f595c3fe0005db8de5e7acaab23b8cdf7a4f1130390a3e4b91635ff899c1d72bdcd1a3ecd9f995f2f10460bee3b9cf0e2b8fe64460133785b43c95ddc6e42affbde665356cc1da238fecbdaa5a92bc6b9c5cf06142f286303c412ee91dda8b13070e057232a9495773c47b0d5ac15e6b783ebfea486aa2c209c769dae588f073c1ee0a9dced5a057000ed95cc03de449fe8b5fc6da5e48d6757e3b8cddebead9165ad6add969f7c929271cbcbd4401bc42d8186ac5c9e2444c862aebf640d441b07f77845cd46b9922893cacd697bf9ce90702ebdb85626f0eaf5ff6b7d868f3231266bafba625acd33b3fbb20dabb09f11769d31524b75e2135c857d98da3019741c191ee02c4294312ae82da83639fbdb9fe01d8d6cde0ffc51bf2bdfa5b0fec6d9eae8ff4a8970d2fe971d139d28eb00ddd92f4cb968ef7d491e7a95641e9a70e2cfb47d3999643d4ff1de07866beb129d1de4fa2437042197697f873addb405993492ac2df58729701a855194a4799a5b5f6442281a41c3853fb690eec27da632aa7ffade25a36690f92632755c6f590c7b0ea2e0978f66e4cc5a144e1f404139a0afe2a1e44c3b7ebdfb40753599155dcb4b094f28a7b542dfbec669953d6ead6e76e7fd1961bae84c460f9f750e4bfa4e401a8920e9a541e6594c2d3b0676e088dd401157d93539ab2106f2e4c4ef98e34f8437a880532463be7e03b0e9220e09708215321324e0c39a0b0d3fe545a981221b94ef23470a5d12238e3d540bd4221241e6ce426c8b372a64a4c3abed8596ff327d1c68388a5b77c01f68c43e63bc2fef7d04f8c7f4e4738d33cdefed1449e65d855ea3bec59ca422822830449c4d063af307959e5247a62b06876f084834ee57bfbcf56e4e2ec163fae413a28360d9c0ffd8d5d678208", "52", 0, 2018432410, "9c28db347617261d4bc4c85774f57946095e7f1d194eabf764340b8568328969"], - ["030000807082c40301deb324cee36769a2b4ec215514d82af156965f9f9592d36d7ef681159376ba2e010000000963526351656a6a6551ffffffff01e84f6702000000000653ac5253515199e4416e0000000000", "51516a656a5265", 0, -1665486074, "734862003c4c86f30939cef4c5687a31d41437a09553a2152aa2a97a9eebbc5d"], - ["0551791103dbc491e9c90f43806069c0a89c894c85115ee9eab2d11f9d68e8cf609105ebb40000000003650053ffffffff2899075fbe57b0cab3ad75b01efd2caae4b78a64b944cbd53ccfbd4dcc5050aa0300000002006385ff353e00a675dc15f5ef9bf2ee2de479cbb3dfa0cdae28fc392c5875abc2727cc7b5fb020000000153ffffffff032330ab040000000003526353a9eee0030000000009006351525352006a5241bd5a0500000000066351ac51536375fd3b3603419dc801000000000000000000000000705b7a4bea2b78b93cedd4a930fb76ba11eb25b8f9e8130c643e504e068cb700d483d1588f4285cbb770fc15e937a50fc884fe96a85b5586dbe1263ede60c4bd647b5022c4ab5ca659573135fc32867eede095cb5366f033a4ad038c37ae6dd2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003fadc3b7e848534241f448a0a12a5fd99ef3e98ac58e18ee90b2c1b4e29f4cdbee850cca7a9bb06b5c330df89ca56f2a5db0d07d77d0a8320cbfa69309ebbb7923f5c9b023ce6b063728800c4131ce909e0b448160a8c464f78cdbfdab79417c64190ff153bb27f109b2e37433d2cca14bc3b6f30a51a10f6a5a56f9b3f2d748022f9de9e365f8f3432ae049b32ba2c78d2b337a5a96aac07180f755ae611b562402048759c9bf6de700c1a0a587f85ff22208e826225fd1f855c956ed33c59a9e180a073f32bad36fb417cf9676cc97f7c5798c25ccd1e4b0096ad24a2978a3af76c0b97345795837fcdec2beed6ebe2f809ba129503345c7833c298bcf0d7618461a0312d143b5f1e816e2dc141567c936d83b2ab46f8649c43a3ff84b3bbe6f33fdbf031002ebb631025edfc6532600dc5a4db175740b098c9c371d25d79c5c147f33730317f694f3b2c1afbdb2436188d66d186c35e691d5cebf7c33009da267624c9a8a022061e95091f3bb39cc075cc9038b6195ae231b0fb2195dfa7e00d55fb838ace20321f274b97e31a4d893744f3c4b0f57df8b6907f3dbfc40978dd42b8fdd03de53c9f2360adf3e805a2cbbcfefe85fd811791684fe4c65293848a4f1d566dba55a22cfefd1e8b462cf80602e1cf7893ecd5e91587239719c69e0fbe45729fd2a133b91b2a27bd2c3f66dfb7e7f80e861750d79fda2d6375da4104e52db58b7854a1c7d4bc2db7c1901eb6f11a175117500009cc18dc741b14ed6dfa093dbda755d2ba146e5b0c4f61cdc6d130b07184876adb82e292faf9ebe14ed5dc0c73e660129fd20a55e5a588f7e26eb5acd7262e6acff8826bc5186205a3ba9c690bc42c390fd2520e9e66bf70065160e6bd8900a7d12a42931a0dfed1169068840d2ac6e9c66180846e4d93be6dcd31d0ea2d9cb66cb1a3962f192c61be0355c7b8719f1240bc4822faf7af2ba43037a86bce9895a976ec20c97f3afe07c6f12cf88a668a904e73c5f496457512e1b663f378b8c62f5f5868bc5d9431bd2a13b9179d850d6efe29593be1d133de9f3f724bd17a4b3bbffc71c0dbc8a8b0576d327b18f911001f77c67c0840da3f48a579c177a83f3d112bbdc3210519fc7b314f373c82871f6149ac6a162ba2197b3217dbdc26c54831bf7234a3d3104c38d60d448f1c4624bd0edb472a78b78de32494604b7ec68f925c3359fa44c085ec65f8e206dcbc9e7cf0bb15834977ac27ce3bbbba2f922f356960ec2247b479b01f43f7a9050b0458f9c475ecba0b7e629760ae519317062863ae72ab290b8d8cd6f1238da2b177b705f3aa526df32be4a543b743995a2d6b01908658d6770d03b0e1e7d7e06d2ee5b64a94eaf56024b7f617dd2fe80995c3387d9eb19a4e5ef2c56609b673d0b12e13ce2d3e8d049c8a9fd70d6cfe3ae6eab8923cd0214a4356bd5b8a7a93e09af2aeee56ab6f0c27b5237bffe705a3414033cb08e5edcd5506309cc66f8f6e37357ff038baff75c3d6225230278cc8f96ea281cc8051cf63579e895297a5070013b00abf65d3b827950d2a20f4106e938339de0bfe2fb963ac203fd11335dfe4d6b07c465212206b9db4bc92d4ae678d37a6241303937c528fce828a112c254dd924889da89598785ec8e0477b8b58fb7b873b6b05455049e1645aabf952e6bf0aa29e3735a1d14d0b8fc94d5ce1ee0cc34c861189b6b8b28c62f3158cb9708cf5b705da387c24e9339b2473590b4e5fe16bffa65d592d9cc8541958c62da10f0adc3b270d8b6e6c759f1445005127e8052c28969401464e127eaebea52501bc81f82910c8e9f7518fae2619b2a18a1091dbbb6075cd6787ddaaa5eae650579e138166f6ef68fcf684a6c3829df7959e0387817bcdfce15aa11e1a2f9b6e8430d4cafe8fd37515f789f22bbda5882574cacd5eea22bebcfcb7ac5cc97ff37d0b678b236334625fc519ae6a9c603152b97eaf14cfa3cd32ccf770cd1e1574ced39ffef0c23ae48d77b11084b2219034808458874500b2b47a9a2ba625cf876d25ed8528d0bc9b45206532d9e7ceed60c692a8df29c67a296830c1e0eb32e8fb035ece43d31aa9958277d41672343395631670c1074916100c94c0abae109ff82bdf286da3a4929f7005cb9f1fb70be85905502b6113d1fbf6b53780368f4fd35b59e422103bd3e7267b3bc32dae7415490c442a322cb32059052dfdfcf4d540dab165479126534a2d84451211cd98b68ef368e0666fe0d8f04bb656a67e5ef75d65336c9b623c45942c03af43158cef3ffb95620030000000000000000000000009b7d656307534259c52751af1700216ff5fe3ca8392b3a3375fef26d89ba71e0cb14605afa8c9bf3ece0aa6a89aca7127061bff834e0786cd7f57f28de39d0a47a712c80d083ea526dca857b82fa9f5da19fe082f32cfbb0e9f9304f4d5608ea00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a6312d045793da121f4133b90a60887956d5581fd3b5eaa911eeee8b8ef559a6070ba005c40073ee965f699dfe413555128617519598372892a14e200c5d27337b7d29b8b9054d3231fc73dbceaf8d55deaca0d59d02156dbae9780b342d61bc119dec2f996e497be78683f2fd313027c6114b842535b05f42de6a971e422cf703043b3b63f649c74c27d0414fbb677e7ec2a8c4ee22920e25ed2e757169e80dee02199893afd5e696230467c27c378f35fad88132f626410bbbc1416b6fc96ed5300a05e58e43143f5184f5a6c52bb57dc1010725cdf98291db45cf3596b23967ff08a930fa006f23be198f66dad930be6e2921b1c5190039d9e99fcc93155f74c3de02032b7b98278d602d038592c5dcf4b32d97e0de9258fce2b00bcedd558eea0bec020fcaf93dd16592f078a9af73162e02a5051f5f923dee2d5cdac07fedfa87989b030ee441cc9f0cc00b4c8cdb3e457ff8a404a34eadf105af811509a5811f9c46340216931746e124950e4c1be5a18f96704fb2bb2d8996861077d172da1c2e75578c031ffb73caf6c37ad731648a4b6d3eebdc8f1d739c2e610713cb370becfa52b88d68d3537ef04d9b4c6659dc9d0081bf57eabaac3039392265d37a1d2a5c4894c3587de8ad0a5285d6d7a8083315d9ea9a16008f9ab312f8593ce1bc56d8017a052bd02dcec144764c5ee2921f785a45c0d7477fd43bfb30717d2ea8bae02634338536bf7b2e95564dc85c55188c6763a176818baafa0322398deb062eb6af486fe4bd72aed9a17beb18058e39f509f475faa58931c47ef080203cd5e32f5a545649a473bdfe046446f77a768d6e017a5f96b81e7fea5c3ded2d0b97794216eab46f3b57d5e33420210b17a4596a72385f4136d1c3108c400fa51539f7fff251353fe066bbea8fc57200c2888589e3beb600094fc1dc95568a9735f2b9a37f94ea9bc757fd4ddfdd344dbc1fccfd0336209d93728c3b0b246bece0f9d10d5b3f46ce5a1b625b2532e145f712b8a4c3652cf6fadc68176d47aa9538a7d27017e93ce7ee11c2e8b9eeccde299ffe47701157260b220bc5022e01e66dffb021df361b95f546786b74a99850d4d50dd8fc1fe2d56a86f3f8a24f13e565e9299d114d92f27c66af6301322d835ba5975ea79497be34294c58bec44c7884412dc8a1c33025c2f27a80b5d8dd724229c261991aa3dbcdb14e8bd6b7958be5f5f9c700406ad6318e8dd7676dca9fc36074ea69d7e7e2711bd4d38f00e00d8360b3e926fe9c52ccc1b724ac21bef882092bd08dd723d93661d346ca5616f85fa1ec1ec1ca2a59eda4463058d0b8af6351db6884d6e8265f72264a47609f603a9a5bbf64024b8145a4d62f4ed9a7d6ff937993406ebbca23d4d8bb617e8267f3fbe9cd2b15ed1c92175426310f533a9eb480f518b1531b3cddb02ff697b24bc4456a6c28a5d90aad605d979e4877dfac1c20801d80cfaf4b89a377d6bdf731f20029748eaed19865d58e81211ef5e906181c9968622eaeb31687e2a2f0c149c2af7e0408f106acabdd0390688259f59246774e5a33e73ee99bab1ce536ff1b020aca0fd4ca0ba1e4258d2fef31915b78397225417c65370aeb0d757509edde16eca5f8fdf5c720f3c9f1b49f6cd1780590618cde793e304a398ce9419b3172437fed8500a3f3b00fe2fe88336a39832992dd6ead9be19f8071330c9b37c8a9cb5da4c2d2e532c06efee9a4b0336c16cc2adac507e2333cf8af1197ed3ae4388a924060dd1342a3e2851b9cc863f08ebef2d02e0b30aa4a914c7ca967cc77763abd1508ccbb21836025f1256e7ec654e143c00da407757e79dc6392c2e0672f37839ffd0654549bd19be3832749ffb5f82c761a819dea50a33243d60bbb436449f70e93b95d3910db387d2edd82d9454f740ce0743afffb366dfd14d44baccccecfc1bda298cb6a5291fd997f728a2d345df48659e80994a6c10709eeb9c6754e54a13afab9042894a561fb295df491032ac8b995a3b623e7080702df02a7af82b4333e48610f3f5c60cde81f0b0c475a6582c294017dfd2f4c64239a132a1e1de3602995ea26c39779d21ce65df66f552d18af16a91cc0ea2945a5e06ca4c9bc2459a55c822aecc9d3f69f3e51e1a0a80b2c36b518a9e3da92355ca69f577c3a93e44f05fedf7e8028df8bb610855a485bc558688c7b578a7a576efac70e5019bb40797231d6b42f372d799e5aaeff2042f161848dddbeb5af48693d4f6e22575b8f58e4ce1738fd6275693daae8fbe4566ba912a97a534f5953d502000000000000000000000000f0369b9076a387ab5983e427408878f3149dd78aeee88c722b399980b8ede92f6b509ca6e690fe9525ddc662de9b2e88c64e582aa647e536fa01fc3e39c849488ae4d509404f78330d08e30212bb20a72b9f0b841be11107d13537c73f73d7dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000788438ee00d8223bb0ad2a863405aac5755a1af74bf701c8cc47431be606971495b7f0a8d3132d6b1087b5b235cc4c05c64914005cf0962233095954c427e441255c7dfd8f189faf83241a4c5374f17c144472e4a11700aa45581fee394befa5b79ff9d1cdff75f22d80739ce6bd66da15171d75aaee40d21c9568e4f6b8def7020bc70eddb74047da07199cda7b250f077ebfd86a3af599702f0ee17983cf40d6030d081a40b705139eb5166285b20b66c5bc6584dd06be6201cbe7a9bdc5988d6b0b04952dfe62056b961b3a876459409bf0851b34befdb3b94cb45fd6016fb26380d7cad2e5ad9ddc46aa8d5c7f6eb2006106614428ea9bed8e21f179526ac908d3020d608903f7e5c1529e42ab3040d0cbe3d211b9b2e13fcdb69e4ca17785ae157f03305b1d582808b36a7b68ec6cea9a7c3e3baca857c745cf7aa9e8534b2fe2c8f10308323c4bb0784f435c134108161670e71d781cd8eca5f137688c04508f024ecf021b0f19b2b6d7ec25dd58c71b314e5f2e02a9fd77e3e01c2b8fbeca5d035283ec020b9227a0458cf11a00277929b101e562ae3d354dc0119d71db3781c2b5d7f3bb5141d22fd7d07a68b59196ff2ade75726f5625c9ff82960e8883913f3c360aa8dc8b3f05231dcc89a8e6cafa3305e8a404811944ea700d4da69b9fdfe039631a7fe292c1a888c15166a14ed274ddab73464ccfaefe788240b065231082a74c69fdb10094fc8257b124c7f54c63f070b66ff6fa87dbf6ddb31b37a4655171ae1edd351df13c527e6d6fd8817cc5cb0a1e3b928579d7d499e10bd6a25e3a29dd43dd5e7ebed388351352f994bfed74b78af9252cd2b2b405fb9e7c4df837f756207ac82dcf1fa6e9711242a012f9ea1efd1c81d43f5f2d43c8b3f77fc0f276a62517b84d1e641e728d2ffb6688d44afabf51ed5f179d54e8afe301b803b72eeb586307b1a28a278ed1ff0b8f1345dd96febfb91b11cabf023784e53c1f0509f28759d087636d6d726af63dc9afae383c95a72dfa2e4561364fc186a971fc9ea9fc9406b1d4836606c61ba5e5f58f66448d32244551c06136f1233a3959214a04c39bee2fe45ec8e5cb112b18b209c48b7d7f21e09e31edb8cf29175cf8d317b5ec1b66e778cb31e5f2d7e0adcf84dbe8077d27778d759f5e03e34c6e3d83266371353653b82bb969c793c7ee68d04d08f539a6fbf1aba37c2303014f012aad740631914897ced1df9c03f56ea3c8cb09123f0674b8544a06a6aa0d9fbe42c505c300a410a2cb1512df3ab84f7c79d0229aa5cc802a6c8d6064089d82ed08e475f41edf00487fc56dbb9ce818da0f63265071b1e2eb281bd1643adbc2471e4ea0f326463e3367b3891384912b186710d23054261f699620d943e0d1f194f6a14e4ebf082c01cc3f8c1ad7bc29dbd7c3f9fbaee9ca54a8e019b22907508862d432b3860adc9445a9d59f248b29fff42db4c6119016c594c258329ab471480c0e319d03aa162cc7a5a0c374f65d0b3836b8110f8ddbd524edd4d1afc04a3cca5fe533c74adf598059c39659363483f1127943a91445383d31ba477b3791492924fa256472af5bb7cec5fbd504a7b329d2ba05dccfffbef4188a8a55ed990fccb0eea795d671b30b67a13b39f72238a62cf42943b970872babde757774b806cb7ad66a9a502de87ef078e3bdf9d56156c7f126a066b805091ec88744a925e4279934d41f842524ce586723607cac67bcc10232cc3897e6d2ae59202c00bf8a200e86275e47feccb3f6f3210a650ff40bb01e78d014d85e2db82318285f73dc03c7cb98e1d1b96bfc48692da249feac935498c9e2930feb5a13cdb54550b538b7398863a73b83880c4cc287b2dff1c42774562e45e672d5d31972e42d6489c8d99e3169de356b854ccddda09fdd9c19f866a7d729677064f84e00b2b9a546cc50dc7a5f6f1e956fc54f98dd742dfe227bbcadd18e6c5a0f8164b201d092a0338ce4f07855b42f1e4ebfe2bbb91dd584ed8eda69a3a056c781786b3ef16e67d35fda32f9ec4f2a991abbf68b42234c191e6219c9812df2da8887836320ea29e0a3dff44f9df65e79e5cdb32ac65496c5359eeb381c77b7a899c90771d8da8a891ff81bbdfe985f4151bb5cacba5504b7f6417a4a0c40a668ee751d1f53e3097aba4eeef08899bfd020781ae6a9aa1edeba7966907c5120ff09e4cc69ca76a74af8a4fbb6fe58c288a552894e2670c4b597eb5fb095d7be8d30889ca3a0cf29c2412623be9a800a78e9445d88456e00394e45726798c7cfde36fbd3a8c063d864b426a684fbdad6a38aaf4216fd9b1ef23bb6257a1d725d69255e3b275cabcd372f2e05ed1a9c3c2e4bc3f2679fb03c37c1a4d889918962af972dcd01e804055d4daa91628ea7938a44e6ccd94eb980b8f0dfc51c290b", "acac53525351535100", 0, -123431435, "251a5eb050b0b6f722da95037514f550ff34344828bbfcb35d05b2c31c281488"], - ["030000807082c403049b6943c67cad93d18e9b2e49958bba2310229068f5f8ec6e0e3b798f71446bcd020000000700656a51536aacffffffff13b8d724283bddbf443e86913d726a9477515296adaed1486c72b38bbd5508f602000000075300636aacac539fa92e666375bd6a28acc6293f8279a6782bb26802f0749cff73c17b0041df862fcc5ce6020000000700636353000063ffffffffabd16ef9ab11c510c07999737511194b2fd0a475ac9238f8e10f216544f018590200000008536a6a6a65656a53dfbd6127011ff839030000000000000000000000000000", "6351525100ac00", 0, 1281785322, "6fe168dceb9c81e7cad1e0274e20e287e44afc6edbff6e54b2aca8c384baf41a"], - ["38c81c7c021737903af5eb3dfef84e849f9610de5d3c1fece6da1b679db29473178920479602000000026552480baab1de809cc5ba3df18ccf52d9f2adf3af4f9f92ac3c00a6381615db5be1d3ca5838020000000151b459771b040fa097050000000005635353656ad9d203050000000008530051526353ac51d59a01040000000001632ce68e030000000007636a5252636a53435c58e900", "ac6a6a", 1, 14067726, "f557ccbe534fc484797ee6bf7a42396c0211aae6e9407d0c9c6369349e82ada6"], - ["8aa2ca28025f02ea90983f5e08f6b30498bc1ea867d0efe06a1271eadcb42157ecc9aa7a400300000006515251655163f5884e88a73ff63f1e2516240a9079ff6743254c37f886812870cb140310ea6f5f57afe702000000025165a96e647103485dd0030000000008ac6551536500006a07dcfc0100000000056565ac53006e5340010000000001537b24f3bb00", "52ac53536a65636a", 0, 1170681403, "fdfa080d47d4d1e3ac94878ae38c3f6f7571b1c41edb6d456fbd390a185cae85"], - ["030000807082c403017608e96d09e106f628dacf4bd141a67b6ec2dac3acbbb17a5ece69411572f851010000000351ac00ffffffff02a112770500000000095252ac6300516a536325322d010000000005ac536a6300000000000000000003ff709501000000000000000000000000b1124d20f40094fdb48f60feb9f5d545c02c69eb4e736eb0a359b4b77bdcedd5a9be56d955019a8e85f4d633ba793620cff9a50810e1b72c98718a92852bf7b663bf4a0f55ecea4b23087c7d2e45226256ecf90da0b75f0a3cb026d6d626cac4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c9f647e5b46528dc74a7d1653452fe382b8dd2dbf90ba97a7cd97dbb22b3b3d69e006c40c7b0a7d16a1b8b869af3f9410998d33b20fe345860fe886a4476b388cde57bdde7b64ccbffc881374cd223cffc4981dda5cec04b77c734428f817009b9a10ea25ba52f08f85f945c22012cf06f57136d0546aa16fa8b0a5d04fe090021cde4703134b00be83f200e5638c1569b95293c89bb490c81899d77415f028690219c9e8de59a323c171e3e74b23c013bf9051ab82be92f3e26c44f91c4fcf97e60b08dd7869dabf762277f9ec691c98a330a39b6b6c734dd1ae75deb7d2389ec8d47dd204ae79a5ecc13044bfa633784437f6d514dda3a359428962300c16442968030b80136631097fd9ca79f605b2c73280be1df78bee657896bbcfc703f4a9a9f703083f259e872c1d4f8d95d52d784808f2125f9d0bde83602af7960b9f937c2e7b030107a5f44d301e76fc7bb57818642511d003b77d276fcb317b8fdddba55abeb9031c0a800322fe0f2eb16d00a5afbfc448d559ad4daa75bebe99aff4a2176bebf702033370b7e845002418567e40d7f30eb83fe654ef1277b8ac593f9cb3080a9b2562f97cf41a0746ad00c78db413536f79743ba553b97ffcbb6fb7aa192d07b23348f75f2d16fb0bf402ec40bfd2dc90abe2f996e11d71754d8049353e991cf6cb61850de7d329f849be2be8d5bcdc24233f0af55760120f6473176e868f89f715f0fdf97143b62d1e2fa25ac70d9c0675e19ccc078349758a8d0134e4f30d647186b69d2262f652391552570da19442edafa30bffc88fec3f650702ef530087924ccf4cea92e88349765246598b9a326faeba96c1e35d9ff3add244e5ba22ceb5e64c60a06d5d382e5c0d5d22cd6ec49c0db26f1cd48888b5f93c4614b7d1bad6937d1f207019e1b6480e3101f9d986baba8acbe6933c581966fd92af5cf5f0c0dee68dfb4b024ff02a60a58cbdc92345407631787928a8b189dfb76b91e531939732f15cb7a267ff1bbe53156fd87f66ea588b2a53f9e8f7474f90bfb2e18facf41fbdc44fbe375c76f5719e85115ab8c290f5ae179579cbac6ca303d8f13dccb802870ceee655e93a4c2d4d32a464a25a314819466a039896578a1651b1779ab394498eb3eac58614fb2675b3a67d7f8dfc1d65826b9ccd49a2c7702800e2e300286f4af1f01adcfe0c832762af5ab06ef0164ba99d59250c9b2a0ed440e20b5cb54600023def7d61b8f582d872e4c54ceb24a942ca548314873d875b430818d9ba84d3a620c5625b8159b5af5a16166df4507d5df8417ccb3640c7a6be292a868e6cd66a3a39f0fd1fd64ff32de2a3cf217eb6cb845e20006dd71252ac61da93b5dfc1e56d264cda6ad8dfc80cc7735f77939651bd5ca2ddaf709d540fcf97c765dcfc243ed0e4308d96108dc9288f83f9b6047f62cfde83ff8392a6d1acd1d06231825000e6fdac25a765d4944fbe07f528fbfd83ba198203ae1378e36d3560de31dcc5db8b855a71270a0be46193cec665c9b26e61d71dd81074428c4e531b4a860444d7045e55cb4aa22b97ec4a191ad6f2280d50d5975f7128a3f606c077f56bf5c5ee271f37820b87bb55fc9671dc994715d338c89379510ca9ccee512fce89e13292226788cae49a57900dfe76c5706581fad033fab3ebe647c6e8c63c463c8b4d1515ec975f5e15ffefb097857a01df0ec9fd989cabef922747ea8bea02d77ff3c4c387f706d4db326f50809e81d72412697b34457ac25d500922732a1c8b78b7fbacb8fe7c9d65b030c5928108924306aa42c094340eb3fcc1906475ca055589b736cd1f7a294a88984e93fbcbd6693ec70da3cd36703f090183fe6261ab01ac8cd67db7e6bd3033203f5c50feb537ba95e2796793f886d43a7349de265bc1887e1d136074879c7d3dd0fb1df8e778f3b5f3c65afb882697c2839e9252e94f3abac6b494689663895718d05a6b15374e0e60b09cae6afa40c4b57ea72f2b32854696808b114b4b1f605369db8c6a40af2b56dfcc78dbb8edaa406b92c5a620bbbf20bafe21d5e1f213d477b840640ff687d8807f60ad1d0b281c0fd099f4d78cebb8de6447fa2b63705652aab930dd4db6ebad72b9bd834e6194b93be0ba57599474d80be575d8cb4d03b7a9783407b4f367bcac381fd00c35b6257c46aed4e1465c53475047f5a033a850dd1333fd3c4e7dafff49db6455b82937752705863b6c7978299534250f4ef50bde3330cd8e26388be3060a0993a450a172e8b9b4b7b640a931ce08b7d7052c89d03c65e2b7040000000000000000000000005af4243a022a4608a3fdff9d57a1b19e3347b31f233c391eb4f41004fc62335db27e5786544d3aae6f030113cf3b2bb4ee14c315e8d8e96c43f0eafdbcde83a550a0bbe497c1fe4cf85ff9d9d2518b0546530ad922a17cc7ca0e997cbfd4eed50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057864c7b89aaeafbb4a131a2ec4cd12d05948600c4882621e9a87f442935291808e43bfffc18f2c56d85c03bcaddd05d0a70d42f71c7bbd6a77d64bd8f8d27a2020c1240c07cf969e49cfe53ce7b0bed80fb22ce862fc2fcb49f7ca88441ed5b4ce2a1ab8aecdf63e9adb60044321e4d689f64937b14d5ee0edd94661e43dea90209e27fc35db38b92e938b95914331ba82e99b11fa12770535f90fce77cac9bfb02239b700493a2c183454be617d112e50f42f0c2cf8da5b97eb2fb7d776727c3600a08c419fe5125748f7a3a7462424840154994509cf61fc180172fad1f43d085d1c1e5c960c0a3de1be552f20b087c690e9970094aeb5dad5bfdd994ad87bcf9fe0229e90c7e3c240a8e602ab829feb388165ff06b3636cf79457128090f8118f014020516953f8fa50e4cca833a943d3240be16fe0d8b843648a2e582376afc03d049020826e21044a99ef40c5491b234be6149bc5ceb791fa3ae592245b0bfc970e182022f529566b2dc58f2d6290deacc155e47290f2134a7a2aa781d2187280eb8e5780205b07cb4c201c1ffabb829996f50f9c5f728bb608e59c19bbb29223a3a3638f3105b42ba690c69848550bdea488f8b4ebccc89b7e3cc1d80f2e42ef395299a44c1ace092a2d271885d47c0fdef97a90effc76383d0c6d6cbd7a798580c0021fcffc71a99d0e1c1fe1ea86ca58f84a06f02ac3dce11972ab7978e4daafbfc359712af396ec672017511e7fa08141479a36a63475211bdca9f8257ba88be8169f1ffe7f9533e72d7d254553a0c0e2e543dba493429dda77cdc9f47200dd7f172a40b8e3f787da1538ed4ed3945657ef59b01c8dcf34c359416f066fbbbd07c14a47b36b3d1e211c5ecef34540555b4de1bee24703ca9dd35d65b2639866fa172b05feb6017f9b64184700bfd1f3f8eae5986fe2c193b8d9105cef075a34177e0e670a67ac03ea47cc6acb8585e6a4b118657e27d7beb3928723dc5ec4316b2acde4a1725c3ca3df03d4f1c77a089c1ec76889a59f0a31e274e3994ddbe8ce6e359052640c1edc34fb4bb3361dd971aaf4eaede12b09c41500f1daf571012851f4dda4d0dad848ba9f6ab9da20f247a52990cf1d76b61e56d44f92a1e79bd0c5fb797b6d1302bf9188134ddc45377677bc766a71a5a8e6f1cabe0b4cb19a3e705ee3887170342442b045f0722e8a4f0df030f2f3c257927ddd22e03769a00f68109237ae375b8737b38dfdb672a51cc7bc54b37da45da230ed3d6b5345d0a4cd49ac1b18839ad978c42317ec72afb246314febb39a654e2f92d46630bd515d73eed5b4499a21c862728f567223764d9e06f0b9691d978d0881266dd2a6d64a01832b7f22207d22c716d07217595dfe24649773d4c3005b1dee5ae4bbaf5dbba1b88c65f204466bc539a17a522d78ef41360d64aea1f72ef6d1213de83651955a3e77e5d2bac380e36c3c9cf4f938f6f1953e9f8c9d609801643424d8e43889ef9666c498b771b86d5cc46af593d986372e830875c8b39113331026905bbdf5d14505ae3475dd60de662e9aabe9c9ac9f27ffb3568278c9583079402a15e3b01d46e81e6e5aa6c9ec5047f6060bbf694d17d6065238b0e80550969aa14f3a6a31d46077fb9e0dc5789cad0d34e3ae65b19838b76ad711ab6fc723e4977f5b70f160f4818c3a3a17347379d71e7ea307b731264d42c914f0e107c3c1e092cb767206e5572a0b76b84106ca50bc8390ee53b1085046c0e2193417d18e0ba0b1c781e9606b851717d62ddc67a3f2e7ef8cc3bb6ebfb11a108d093f2b51f27f0df804013d404cfa9334a2beee3acd1dcf016eb654c0c9c37e322735d4620d75ee13839180091c59d4ca5ff73491bcffe2c4f3a877f1b63f87928b675379ef2f42565f15155cb5d8cfc59b6d57a4c639d8d213c9d1ae8e701e2b6475c62b6e70904c852401f7ac9913890a49035895180d81fdb33aac316ab098f59c9bf9019349f5e570c38032800e71a4598d86315eccb40a795cdebcbd4f1acd29426307ce9c92109fd19697d392e9ba7a0b339fe0e92c052c6d2f911675c496d99f14480e7b44a1a40016c16c59036411d8e68248291034204987bf929392a9836151da52a171904dffda49a8cfbadbe25488a5f5cf34f52757c76c0e59c2c965d52db7dbac32cd091f62486ddf6bc9519cbff9f32d1e5806c0405e51e10e5aba2609106ccd67e541445a93786d7aef18042e188da5bf0af0e8e9ad7138f0954d2d3a4a2b6e3ac9fc28720a375b7170617b30175700099971fe762d45074020000000000000000000000008d49e4eb1cdc05fb9bc9c4c4a53c5644c901af3be2fae33d358d07c03dc3c0a2c96a9bd5700a610c00872f67653a4cb5aa86bc367398c5151289f9518dbb5f34592ee69a6fa98553724c8826b952e3129730e0fc3c620dda8978be1cfbfea20500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ea8da212d710422e468640599fda9ca15258779f6a06f7d90c436e9861bc7903a32b0d451f0bf97928187700dbb6c02d689007f85bcfa4b69dcf47dfa5c15becd9c7a725630366a8b5bfa9d0cf6af57cc713ebfa5b022b590ccc3c378329ce03a5c32da144109b60a1536a4920ff5f12881f1298052330f3169bc2256d1628ff022976074b285ecad8bd5b8716637c6769c730c664b857cb089eb9e73d68c5c77803168835e4be69f00b2bc7140fa4a4f9f8a03287404f2e4b1ba35fc55222ca41e20a043a411ee2ab694da4f54543de242339e1f39bcb1d1c414a8c0b025399a5fc265dd25c4632f3bd55fc232db2048afc565f509da1fc3691166c2c34aa1b6fece3020b1d025aa118c562c80f78f27f8fda40f2fb44151da6b83f7a5aa3f2da52300e0218645eadcce5d53740714aec709c840a526e1dcb23eff8f833529826c056bcd2020abb4716c4cd36ab792aa5a775c905e4a3c98eb27d38b0f8c4aa45fcb197f9a20216495e4c4e14f5845b951b1658ab44470ef5510ae87802673b1e36fda459bc3d0305880283919a697018d389647a9cdb95f07f473d774fec20cbee7b9d290edb9f9e51ac703e3fee006987a46d79f6d5f11293c3ed99806098c91e825c7676b86ff1a55ed230cc8779f160851eb40ac7e4366cf2bdfca26907f0e85e86ca4b4fcd599dda06e2ed0bfa5163bf5f9b597c3427bb170be6161b2af37aa528e0929c94de0e59b33417f967cf9cca1a2f68cd521b4fe32aaac16da272a8c531b11fdab79ec4ef75390fe6a16aba50662a12317aa0cf3cc605ea8c4f13e44e3cba49e7d3b26183b22623d1701ff43f349f9dde3eadb66c01347e4a415d69bce32c388d3fc5d6bdc6c3612b81bdc929d60d40e3a203b7b29e0c335bc170a796e9e6f07c6312286cc965afea5232a1bc3ba9fe63b25e2a28c2c1d0d6a87f28eef6024ff9a1da99afa8871fbc1c7f27bf562dc0fb3dd241db5895d1de2ed0208ff03f493d981a6dc7e5c430dac0407c381f961affa6f453e6f3516998485f2da44b0e7605f36067cf4af324b9da2616f69a70338b3442b8705955d3ab416a80e689e4fdeff61bd6e05137a1da16dc3fd5a21c61cc1f47e94eb0bd403bcc5e7ce1deb8fc903820543c6571d9432c687c6b40196c09aaf27c51a6b914d6d8fbd2796332ad7565bf02b25906277f79373ea49e6013a4c9cafa477afd7c225a254d4d43676c75b4e45b723c0dfab785032b879fde5eb93ab41e4888aea1da6fa4d773938542db4c60cc0bcf8819ba657be99700182c4705069d7aec27ad12a4538ec281434d8e34dd8dfb63a8e15738ab4ecf008bf3bc2ec99c6f91a6007f87cd21e1c7319cbb365af7abf0bd405a2b721d7b14e16642704488ec2772bff2a72056edf063dff27dae1d4ce1beddd671660be81a5aced019190b013cbd7013729255a0979149f2b04e70758e333f6b5568c1a8c5d78c58ee098a1c2f6f36fc1693e58901c2dd489d5155d256446b10626718e8b55fec9cc43ebc74f700648513164679cf0874b6dae4df33c939e14631607af01fe0f1687fb4f6c6b3164ad4bfb08dadd7e4e65e6b3733280c7e1ecea1aab6c17a08eec0a84c66e84ab28685aed298af7b31bde8a5c8b731ce5d9ef6a9b94b5ec2b4541fc353cf248cde2040f943d4aa775fae2af8789b8d62da482e00ee9b3a703d2207b841fe73195a958679e5f800e221b3f0cb47253c5ba1eefd3e3e6d2c069894543884dad3fff54cca537eac1321c4115b0f876f4981c33dbdda2cc48c65b73fcea04e7934ba2097c3f2fb1a50a31cce853a435a983c2b514bad24c9f48051457ea9b2a7ade665ba912e7e374fc0e69336b10e60c07227ce630995ddfd7d2a95b2d8ba486907aed5e07479957c1a1e39060a6360a0b6ec60a5c9aeaacd47b3df287522bc698b11efadbf47584131e57bcd8769e7805666e1dda05b597e83ec72b3cb74d971ae3eec8c75919bc78aeced11bd844082041419dcb057dfea6da073bf674115e22dcf65c8740ca7db3f1e92514fcebf8d6535d883e9fddaf0097d743be08af8df156d80915ad1365441f5506406c66f00deaa125a644be4f3452438bd751c925190fbcd2ce81265e1d94fff4fe7827680b613f505862c1132985992140e185d0c7c258146d17edd91736bf0ac689752c9a0efe6c79e4cdec73d81c1f4bc48d8d978b47398e9492e3f11cd24427165f1fac040931ffaa6fa6400d6fac005c9c4e54da796a57fcc3d2d5a60c8e6f3edf4834b3459166033392567ba06247a0cfa0213b39c868ecfc1438438368d1157b6e3208ad3f9939be691315fafab91eaeaffd6285581573a0a33040128ca677228caef5a8dba0828b013a2caf91e3c9168b1257ad436b294042d3b07dad18dff9c761c548c570b334b42f6b5170b8c6f0a", "526363", 0, 105899175, "c15e99a8ee523e193d12a77f1b36344709f109c42bfe2c4b4cbf6b17ef3b9464"], - ["db300837029015390c0cb72b1d157c278fb9023f600e15108639f5d127d0de1ba001945de003000000066aac6aacac51ffffffff47c39556369085ee2c2440c7712073aed23dab1c747fd379076c6c70026fe1d70000000001ac7b6e1491023b52f9040000000009ac5252635100656552ac897e04000000000300656550c2a1c801000000000000000048aa10030000000071cb17b92fba5ce5ccec0edd9de6bed567a76eb18982b63e5157985ca439a2ff470c447711222ec8853fee52a77ad81ecdd71d76e247efd1f071fef30354c9752a0494d96241d56eee6903af98881505086777d6018075830a67c0da305a47270000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064edf6e0e755a2b0dc0454ae2aeea13456928eea08314c550c75f603c40c835a6550bbeb9e35a06d940159638d71177a5903c268759cb0da489578e46ef2b5d50c1a6d5a8c2e7356de48ef8277c7d74c177da119f6e056d8b4f94474a286f95641aed84884b2ccb156356a66cbc5e6fbf9fd97d218b84f7887f07fadedbd5cab022da63fb26f23b8beb477960120ad0ca2f6a56b7504f8b0096a5694b43041d5a0020a05a1744a839960d61fd2ce2c91847da911f6eea15b6de06146bf3fe810eeeb0b0736b7c871c65c0d4f5232ce00a6ff684b7a4297e38d4da928300db729a9ed4dd5ebc3f4d7bd4c71e4d337eb9063bad38f7265fefb6e386feaf0a1a2df50c4660222ba8dad2e0f673ad687099b694a4b5ff32c61fc527c9ca1a992aefbc3d263e2031db9dd8f7c475cc58cdf1c02ae08c0145dd0ecbd23f4aacc380b7cc0d1a4bdd3031911e2ccca8041b31b5e2c9d53de01fa736aede5a0d3870fd3c6cd52547190d70325867aab2f8063c6790d72651e7f29b8e434c9a20c8d2ce4273fc3e81232a2ca020765534cb63862a34725553b66ba49b96e6162f61d385254baeb3a8c8506917dedb1444f3d6e23cab6ffc534a5e1a15b303e64aa21277790f537ad806d75810929ea26b47c75b17d140f46d96090457ea3f43c44878a1993ac9135b0fbf8b4efd291ce36e2caa231071a3202871889b880d0032c07059b01f08ca2385419a578eb5b20009f8ea9d90572f85cc8171c90645e22532fc5c3a2f6e6c807c5385ce4d428329f45ef5edf6d025f5a9754f59776e84cddf5c9b8d685b5562ffc34e9adef1e95762c70b2c0c3a46ac8371d2dc28504ded0ee1f7f26afb44f27b986189da3067dc78dc8ea88fc466ff763bc61b2914f87b6b94952630ddfb4ee8ceba13b9e7bf7d07e2674eff97ad3bb83fd2460eaa421bfd934eb6dcc6b9cd93fe25e01307b819f57cfafb228eb04137ce3ed5da2245c0f5952eb5e843b3fa6dbdacb954af805e598f884aed077340dac0b7ea71428a7a73c02ca5981d66c68eea38f58dea66023b8807b05436cc098e3117e037273f707e70d2153a187f028321ed5d91972b950f960b50ddc65341a2362233e5a88abaec546495be0933aefb8267ef0f45b62f31510b609f07eea4c022768df4833235a1de38a2bce467c05c8cc1086235fc1cf068c63a9c328a70fcb80d3e3089f9f5fcdad143332b4cd24cd7e08eb35f64b4e367bf90ad0e02ce26c47d4061d50dc1b59cd2ebf19a66fe9eec763d0c6e4d251cdf5eec218471f1ac51b4c15e75b77f1fdcc1df13058d7af53a147e39a67523e3ea2f3e1a03e6de0b1fb6d7fc84a0bd2e63f5ce938a9524c192f9e0841896ad0aba1e99f70a4d6405a393a0825cf8e238cdfa1117cd5f4d39d8298d69d1cef71ae83b38dbad97b1e0246750440ed38d2ab8bdfb9482b75e077763f27939118c7f1ffa40d16007d0a46f2d1acdcfbf841b757838ea95285e7d481b58522a7dfeed32b63afc357f4faa4fc919a5811fcb92ac0f759dbe16949234dbc586f9ccfe539773520c5dc06362e90b45eac5d113fee04557f867865f54d72cd107081354b45e4eece7f4211b52245d2269c79c783796771cf57698127a10989a960773f25c11ea490bce46ab0c5b1d3d3a23f9d0f6c104ab741abc16e5f09894e4492d97e139d66e8918856eaa292fab801bac98c5695cf033b6ddbae58b232cf4a3e8100db77a024a7180a05b26cc6ab4a76d457a30106701b6463717050a760da728b34645217438a5a2cb5be81f8826d6a2ced5bba7a697ccab19765b4f9876b2c7f1a7fc3a28c947923a856a14298152fd7ab97ed96b2c89e93eda99428957995f0db08cab22975f16d0db8baaedd21ab560e90a8e537121ca503da2661968c61ab3e60a783e26eed09bf82aec7feb578c7cfbb55f33498f59e2d8e5a4c9be9ebc09ce94e35192d29af22eff188e23779e6b97d56010c942195dbaa2bebba9e63020e2fe28d62c06c5a097968075c4ab2513ce00358525294e9099f77b82ec8f1568c55afcfd4013ce834817d54a5a2fb151754cc30fb093c98078075f5a774e7e66c6b562680b0a13ee8914f70eba2460277035ea17b249af85e1dacd177c5c326bc9d963e3e6a0eacc35d2079d2e1c9321869f6540c24589aa848f102a264647eddc1ce927ca02d6d4a013b40db3c6640c3113b5c2bb0b46846f93469c4279a1969051c210e8be305bf581a688cb02cdfb187aa5220af6c26b47f69d897f00b45a98ef5931b73ca2a305ff9d206ce4c42265eb952db289f9caa25f40cf8d44ba5c7e7c002be70464460f5c36c6e83aaa46755c1a7401af0becbe7ca51d2a2082cb37247e7524ceb996fda0f90c325da91a4a56aafbe695baa102cc881722451208278dc65a00cf9b7d8bf06b2756109", "6a51", 1, 2044544761, "9e6fb915ab40b469bd88edb9924d02d4ac66ea1149448f58c2811b3d0612ed78"], - ["030000807082c40304a74090fffe30ecb92c2b1771df056f4403cfcc64fcdcb6cbb3a55597dc9a5cb401000000070065630052535153f31e180fdfec76079a2cf9352b5862311e70eca02592caa20e3e25e7052574577d981f01000000096365535163510051520ad5b7ee4077fcf87d20cbd62d22374a8084eaec9334dc8253fee57bd07d3769ab65386902000000036a6a51ffffffff73e13a4a738907f5ea044ffa825fa4ba08862e19d4ffbf00e65db74e38f4349f010000000152ffffffff026c6668030000000005636563636a058bdf01000000000252654408b3ad6d03a37400", "", 0, 1121240992, "771a78bbca955c5c1513bb1c4f7081e34eae8f2567b31253576dd5e1136e6b53"], - ["030000807082c403018630ad7bb378f609ecb65221c11c96071c820adebfe100c0c885b543c480cde1020000000865acac0052005251ffffffff020e81710100000000096aac63ac535252005110642203000000000863656a6352536a536ec401180000000002000000000000000045bdeb04000000005ae881c5a86c843e346c43d8b9c58f8c9ac5181405e08056f63acd781d8ce7c74e9994adb8f709f830b88b67d6866d983bb8b3b25e6aea15ab573f6b2808f8877cb2724dfd6731f4352af1c316447cba6b2de8c855a41523be0ba00f0d0a407f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a01cb93d04e61606c05fefa0fe54eab7f44dddbc748850676e887a8ef3b3b7f96fc3a6b82cf80f3c1bfe307fd7e00ac7e94c8f135b3e6eafaa8b2174dd61c13462593b47b1c063d6326895259646a1062650be903e620516857999a76e0f89dc86bbc782a9d3adc3f185c3405849c2ef6f0600409e203e09d0b7b71ade40ad440216369c0cfd24d82aa8de286da9c43988152e861fbada3dd73ed7fb37b142903102216f2ac840d931cc94a48b14c5db2c5cc40e9dee45cc50f81a0e59c428b8b9e10a0421f24e72bced999643dd9c69bf6ea3faa5b996ff9c1337e519928ea348ca81ba470b287a4167bdd0bb2e5d0e4f37c7d240ae229b26b4cffd429779edc3508d020b26931c8275c98a3dbb8cfdfcb63c9755ea94fc33d89429cc41657f8a9cd1ef02055d3ea84ebb9e1ff820216ffb85cbd7cecbb1ffa9cd0d86def2650067fdfee502079e7bda7133c78880a24f42d42de9bdc566d95a90f6417c61b08e79a5193f550222c063074255d9e87dc181fe3c2f6904dba27722ef0dbbb0a1d6210afe2122d4021e7727816bb687ff08ce1757f5caef7b2e7d97490a1f33912fa03a9d2f221f2f3625ce4ed32062764707367501fddd8f769efdee845e5e564607cb1b1134ca5601295239638cbcd0bb538e1501abeaa1773446c0540fdbc1edc9f9e8d1f10e0390f2e8c70297879f2c8b9e1333423c212ef5bae274de4110e4b9fcf7bc8d18d9a80e852fff64329cbf4294bf267e68d124d34c5d4d296501120ec5131ae03ca557c3dd24b8df5419486ea6bbd5c2bc6398745f474d9247005189d0033f29f5d2568cbf6e355e154bac05afd913d8c9324dd86e566fd44770ddd63f737009c9070157f590c2cb04b3bb474cdeecf17aa94deb41fe1fe0db66fa814e9cf907ad06bed9c33f97ab5c6d43198bf77e6132263f91c811db9b1d014b97753a325830e9e00c5fac6436b47d169ab3dcbe9b63518a3b6231f5c3e45b051360a16b8c27a025a5a8d5cca96a7ba7a46a3f1d66ee90da0108d0d3c4590e976cf566f79c321f4f24e6a986e10fa3ee1251aeaab0caa7ed55fa084fbd8e1d1c01e525387640eeb278f9402c641cba117cb6db6c0c6ff9b19103d079a5914b85f71389c1c16b7f64f613fed1935f96a2cd8bd7089cb229d36ebd03294629f26ebfa0796c18f464365cfcbb9b730d2128a1117bc2a00bdbbc95acc74bd767614683069e5221535aa3a92ec1fa2321ce9d1e64ce0f88ba968fd6e63f618a9481416f2a042582facf3535f82e2b85585913975e7d5dfd178156db4712b4489db4c24fc4a282b1f4ebc86d635f02f41cbd2b7cf334acb7792923763be5a5ad23982e75594d73dec20cc597508fb02bc8a3bc96eb7c189a1733c741e5e4fc8a342e36abbcb5ed840e0c4bb137219d55e53bc1e398c577455cca0cf3fb7150660115c38821de9a931686bb554ab4d1fc3f7781429573507b5eb123f07902744fe313aff3e4a9bd36833e6c018c7c2504a85542171b7ee17969b1853c8caa839862d0752ce5b7a9772730898f9cc615296b965192382769089ca7725b18d5f63ca2e68b4e5b4e6686868e1045f9d90ca7d9cb3d9372fb8cf18b3f8d89dbf47feb2feaa41fbc3181efceb8b0a915342e0094b099b5dc771e11236869aca652cbb0e94f074bd12dcb2ce63214f50984ff95caedff6bef0aa1baa9543dd6856cfb8ee485ff153ce897893be4b07155a7cdf1e9536a934cfd411d5b1b098a655e0ff843bdc749fe1250ea175274463301b37915064c841f2fca430012c984f9f2142269e8953eea02df31ae07e8d634d2db025f344d0639ef6564cfdf081dd6b201454f13def6040a517d890d76265903d58fd5eebaec293bf18b584302c8399f8dd2d02017fad7cf2249d3b28acab038399bf796502b05f6238e1522a31121e079b8db954790dd7af9b5f81a4b82c6bc00fbb05b8e49d34e2fc7787dd52738cfd210107faac9f6f573fbc408d7a184c4ed6823523cf92816b8ed6e5d1c075c896ed218dd615baba0cfa2edcb97c882979e8f38f9e7228f16cbdc81174c1781ab221ffcaafb8527121d70165c6b72a88f6d45597719fff5636633169a46351d18cfa029d546f744d84fbd18caa28982da99ca34983e8be7d948143f242bcf6c2bdcc74b6454bfa567a05e882a5093aa0718d2f11a81c49e22e6feadb80cfb092747f02f75d725c38cb470987e5830d4700630f7d24c8255d3b0f37389ae398c50f9a88fb18bf78900ce00d8bb5a687ab5fec8e10c5f606cab6d71c82164614ce5ea02000000000000000000000000a6b9fe587d3ce836a8b99cc10d09a7bb58167fc18f357b7206defbcb9b7bdd27843ac7d1abaee283bbdfbd9da1f9481e7c16090abb42d9acfc60f5ebf0d0320155b9e509abb2443eebafe3b36e24e4d9da7211c1b334bba6ea3485a347d1c7d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a34d41dc988e4cc1063c94b89c5d8ce7246b263bedddd23732347ee7b3b293e555a6332a0508344134a7d9116d3407ceecdd2f2e887bff37b7b717dccbb659c6e08ede6525b195ed8aeb91c613332306db0ab0ca83b664412db1aaf5c46ae5bfbdff935cd64b6b059164f9e7852ccf785a51ba64ee57ceca25535f2f96e690cc0313a2140fc243c2d232a3c5569b47a2484de0daa9e1fc66730808f9111e3b91970309e84dfe1186d28bdd9e6112e706108f65e8eb9d86a4d62556aea838f664ad700b00848e3f5411147dd6fff7bd6830a1b5c47b8468214c439fb04be3997bcb92d149229f20943462a00ca0290b008668816cbb27bca2279985cb5d41ab81744bd2032095f4e611407ef7defcb443b11ad368ab3897ae3ea6998343c6f3e7ff9303b60322225a1fe4ba9cabf070e8f263c7d6aa1a0a9d675b4176efdba965bd44ad0643030afcf932269e7043826605a531edee44e0766304044431ef7ab0f3d1e44414cc0227cb1a9fb5006dd7d59eeaae4d91182681535e85fceb29e644a2a9dc44dc8512020f8a16bbbc78afdfdc0e83ed6f5df596ba4c51cd54047b2ed325a64f732f03026dfae46d54c042b7b847ea8afbda403004a78799073ccaed8ccc5f089c72500e9e36ea2fa4fdf2be11b256d2ae3679b03eee58ff4dbf1707494426280c0b4300c56d283eed93726abcae00b99252e0aee4b8d35a9400c67777c7ec75baa68a94f99aa65e6327a848d826315bc948fa91dc9880fad21d9f0b872bca520910eb7bf0940793095438e3abb50391e39a402d643d6c9cb8c920630a6b6c6573396382912f3bdb02f0bdf528d96f577e5729e582fb7950de2c84a78084b35bb07fbecaceadfd6597356b2d8a5974a4f923aef41733696381b6b7471309726182707f4a26201536a17dd8efdf52153d3eb7d150c064654f828309bc041060f75c29ba2bc90e4f094539f51253564869e358eea25d639d307ce59705438630ddd883bd304a2c2ca430e33a86c590ec4fa1b114609521af979d39040270e11e982eaf37f659582a628e65cc169af277fa09bc9d0d5543942c20f9c4851e1d6aabec8e26358046e15d980a3aa100b89ca394b627a0de060ce9c01d8cea63b1b04ef931902520297e00b1f6a7902b8bcfd5485172144197253fcf9ec2911cde3f0f7b6704e9995473ac41c6b29d018a8f8f9a03b943cdbe6c0f5b10258bae0488b42f7c03994cd363732b9c594f459596ec3b93a5245a812ebf4e06dcaf787192c99ac762495f52c8735a61020b11d59e6a6d6282141c23712d16e23417f8fcd8ad08341f3bfa465ccf423cca288fc09a37e575cf987739d4c4051a768fb88c328c15a6c2731ef5e6c70aa420788bcf2fca2c8185e0c573d95f05eb05d2850fc7ba97272b6fd56b54dc316e14364d61eb0bdf84ed93ee19cf17bdb13dcb7002caee7cd8767f6c732e040089311eef88a9bf53ec2b1dcf31760543eefadc171a1dee3175f735a91b3b6096ac1c763b41be5f7b410d61d3c931711cd32b86910dcf4a512aac87913cd48614ad7ad8ff0a43e4fc286e9a85ee4dcbd2cdfc9e6c0e367af8a681bcb88e895d8db65fb5caab67c6d25a491353155aea8ea6df6e2d30380bac387a0d23ad02c960748af149e31c832cb515b29a9d3d4fcb1d9255f8e42b84809654c64115ad9d6f2cb1e902d2874d52e159fd13bee20df9504834463d9b20a08a1b928dfe2342a795ae67104ff46587cf32318f8ff4fd363701c559d944c4d712a3273b387e332c1364f0d3694d19e559e611fba704cf4186e3fc1875a5293d0a5d5e2932e14f032a1453e5414453c93a3905e2b654f6c73e2721e620dd0e1e37d520e76d1f0df625fa4a92f7a59da4d2feb1cb9a49050c4323a3f42fa8895b5c2d22179bc6dbab7ea3832b0751b2891178c4891539a457dda07d6c088ec9408e8b809a0fd98e936ef52b2162a683ec79918560be6b0e3cf56fc84a4e30a6ae9255e2744d40e41887b4f12ddd99e6b9cbce26e1681a6697bfd8a5f2c2ab9831071cdcc5b403cedc5da2ce6783b1dad5499ec75aba404f052ee690fbffcc4865441a3d13eb81fd39bad2945c21823da56cd02e6dfefa97441e5efa8dd24416e9fe4b29273f8c2212af465ca8cde30d78d48dc84807212a368e3f6a3694151105fa286a0db9dc4654cd8738de2a14d6132e5e5efc7c768aabb012d83f7835f08d8515da3c5844ea137170597fe56c32753513225fcdcb4941dff2da7337bcf88dcfc968a24af67b4cbe666239409f1745ee4de383dd3949311299c68681eb978718f52c3d22697d9f2224c7ac10f7b2f5f18e5e95040608cfc1aea4d44b38e7648d1c579db4670fc681b37372ec5097207da6e3e01e67dd90624ae552598f6c077e2bf4bebfd74c056b3fac6c68796bf0825f9c7604", "535365536363ac", 0, 525818037, "72388729e16b0a460ac85eadd42a2f4a7f4df39d9aac3d7567919bf20c100e62"], - ["030000807082c40304b8cbff44a82fe78c93c734c92a10dac534912d7223095b3613aafa28ea8802f80200000008006a6a6aac0053636f72b20dca6a3972062dbc83b20a5253230fef6e9d5156e6a1f27e2c9e77ce1b14b61e3b01000000002a0621680c9bf70eda0b6d34d4f4697661a6592ff8ffcf1cc9b735ba7db73e26946c6a9a030000000163ffffffff1de553bffcad3978397e832169805bb1c1ab05fd0a464ef866ac1503a9e85c050300000006635351636a63ffffffff01f6a9a401000000000153000000000000000000", "516a", 3, -926956723, "3194ae0c2f10d77d81a2142ec53bb557f9289e582c9c921f7469c653224e47c6"], - ["030000807082c4030169f260b7e3967c9112df3da5daf94eb4d377ff6cce181f30e3f888e2f69185f4000000000452535152ffffffff04cccf1403000000000351656aacabb3040000000007acac52635353aca0e493030000000005516aac0063c0e1be020000000007636a6a636aac6300000000000000000160eddb03000000000000000000000000dbd1b39966834cf677fbea0cdd867e7856807d530efaf917a02d8682f22faa9b5048311420811ba34d4898e689bef619c69f3971b9782d4fa1be1d86cee93d4f8cdbd07b34c227e5fea64a436cd84a236004d32070838f5b04423b90e366b98500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dfc0171d07ee857fa8a56a305bbb61cee6736676374f1a7f9b73fa3320bd7ba1c7f1031e83fc83baf8c6d40c1cace8841eaaccc7708510d9ca67f348c4e0d217156e247f66b1b5c4321f82ab6048228902dfac56a9df8bf98b46bdf85c5275c519579c11a8251cc57ec10bdd021575f11a15226c1557fc54a48690b54eb3a0f502237220c7789a964f37d0145e9931e125638aad2907f3025a5230ad2f98e801000311f38333f32e16eaac01102d568651886283e41f32610ff5d8a740a6ac6c464e0a00f5f5f1106eddafc6c8ee112c294cdc26516ce9aac98f9f44a17e75c2caee2f1eb34b40986d0eacf83b19c07f158b0d872671756f0c7f020b34d494488174200223abb91787d886dadcb3ee457d88a8d4ea7a789c51a6a305805267565a2c7381030cd1a139d8b396506c08eff6d732d2dd8326f84f88f932b5545181b7dd61a74c030ac5da2e7a7426c0dd10987fc367f62e23dd0a56ef78b1db751424708c0c421102158e92efb9f568b244b60dec6220cc9e5f5dc1b8c3794bf4cc55e57200ddd29b0207a39bc95d08f97fb8a7bb2076a2b6ec72652a93d32b77e534e482082b4e846a625770f26eb159c75469614572ca69ca7d05528f264168e32a9ba5316a341d94a96d4141bedee409397b9c823eadc52fd4ae728d9e8c2174fcbd8f1883a0b33ec00db6eb3ac623b914b5612eea459fb31c2319703cf974aba739773104dc3eaaea68818f1d4cd121cb4e91a1e22342212381859b04359f08f6b1811f375a1fcd57650a26585e01f1bd825cf7bed964b3a6c7e25fd07dccfd3d22438defca4b74aa63e0b21cb49ecc009e618b8830cb2ebabc1eb522638075a961dda5b900207d0db67004db895844b623ca6e24b801946cba6065e9cadd4aee9b1f4f44b4bf7b544434c17e6b87685c00b40e3f7bf70df6bbc96135eedd286db33a11a984382d4b33168499efb49c160a30e557011cbb0a03eb8ce8c3d8b9a617160c8b77664b526cadb63e640c9d8b7d4c8cc004206a75ebacb3889d167f62677dde7106aa831546f795713d7ee9e6d73ae43588f5d68aca84d89869bbd6a5dcd558fe9eda178d74753194c1b7fa467b5d6910ff9334ad841e8e6f1d7ca58805360d29c7f3a5a0a26abc3b3e97bc57469582742282ca9a38d1c002a022fb12f90239ef3584e45f6a409f752134ad8ef0a048a28a9d1b72b180986ae8b0c4fee1f5be33b936040d68aa71d6b7791b7e35c102f1213431397f5a5a3b1906a76988c6f87cefc3583b01cb59da8f1b9151d54d6355d623818663e84c5ff477798278fa9a670e2d5d683145b866bf8f7b56707f16da1334041f69a2c9b50be5e24f65cd8f07abcd0af060f56330ca3d269ead2ec3b5715e92007155a2186cb6a2dcc3e11d8bb62afa1c305b1ac9d314e3ba2b7a0c32632892c77a4f495ed819c66de0e7069deeee24cf7c56dd6055ed395b17f84d1575a5e616c9d4ab3d93a354ab8ed7e564954ca1fff638a099b39a1497f2487afdefbde5bc15af0aed658942a91e2a6c20502ff037bf38345af58e1382a0f53866b9d3400245b62b85426683d2dba5af6db4aa91c6125a9478de9a11e290edb9ba7c05a27814d470ed7aaafeed7b1ebfbaf30c74e9dcb5d331eb29dcfbf024fac6795f508f7d098850547b0b0c383258f47ce4e81f43f60b3a5d3a061d17208b2bfee2fa5fcdc314951a3116afa87c40d482520392cecd204f3f9a61c229a861de8d4c02c394e8f547c332e8e3a5a992af00afa512b098cefada5faa1a62de05029995cb8224dbe753964db4e6fc7497a6982d4ad8f63e596ef9fec71e76d86adbbb638e2a67e72afdc4be500c78a40b0051a906fc7d37cb3e0aa79dc49a5be93b459f7ec8f113461c3044ddc3224602ae1b2997a0f5f70adbde196abc670a2630941b6c4ed24d3456314936c0b9b8ea42b2f6c6143a6475a57eef7e1549b04855fadd9b6ee4a1179bab36d05cf5922e40e83a4861794f31abd955e6c966e6263d74cac398d971d8b61e538b284e2e52da9a4903a8b000dcc54918ff5545830eb41e4aa5ebd6e6e30be6f49a4b0e0c668e121b2f33fd7bdbf224365fc2446072b08f2d4b7793ad7d17f2ac07bd37626d04a6c04180a84e9f2002a596dcd77702f923a816bec636de6f09909de03db35c5df22e256da8f19e40320e471c8c6dacd2e2bdcda070b5dcdfe9b75a9b714de042d76d890ddca3df00f1f4000163dd6dd8e6f11b6a55acc6041a49c13b189ddd02e54abafdbd8a35b370ed54403ffadce4c11a136ec5b005495b4284ae5264b63c678d196a329c9196a976d7ed9216ae5d46300c9225d523d4444a8e59a7d9432c237d0e17b358f8aa5868f032365f2b210bcc4177f6dca0734605a28ff97cf7616cd5c3db217fac8fe0a632e4fc0155509f786a9f02", "ac535300", 0, -482774287, "657441b435e8e2550a43d51d28035d59a7b94d2e3208636c0fa1a568f81c64ec"], - ["561d0d3c04798c66a279f66bebc7652331d4e6a098d743d8d0a67097953d976606d910c2ff0200000000ffffffff0b87ce52acecfd00e351904225ccae51e815c41fbf0e0725f5f92ec5a633bdaf00000000046aac5353214ec01b0e9222ebaf071a576b15d0e6ee9981c951821e3faa194e7f40ee496622b7adc702000000086aac5152ac5163524e8e10ec7b6aa89b77ed91ca21a62c1347b64b74719bccd0901c0de460e87b2ec1ceaced0200000000afc04281047ae6d904000000000763635251655300ae7a9f030000000004ac51ac52c4957c01000000000565526365516838fc00000000000652535265006300000000030000000000000000811c5c0500000000ea96a07982c8b43ee8f21a9f451f2c9851d00f3ac702d18249ffbb32625bdfdf4d9f8752404454ddb1f56abbe47187f4ae00f01f4557ff9546cfb49f9d0b5971b17f9692ca576098c19494ced06bbee3e2c57ddd4372cdd68145fa9ef4d036a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057ed6254315705195f8e483112a5536701549b4ec77beee6588e90e66847fedd211c150b64ad604faf48c10826ca1395a079175ffe5a0ebeadaf56a9adf93041daa9b71c41c0e040e7bc4e190ecf1f0e82fb27998941c44e6efdeb4145b6fce787b3b9ee776cb416de7826f42478bdb9e50044ef83c80a677697df41dbdf036e032fe026873c19c0ddf55e4da3abd1b993745940bdfd836062cd363cec0cf7cc22022067c35a4f5eefb75a3ab49aca54361f62a14a0bbe80b6dd9987e92049b5d8c70b065eabbcce51cd653d2f8da470262db59622b2ab72de06855a107d1ae296fa33aefaf6bfe080763ef45907789c4954a70bcb5a7107413c9d1efb61da9585688e0306d6517658f609a371b1e880a7c4c2c9ff2a6110144020c33f4f15a20a8162970316b02d09acef17f845f7990f0335816612d1151262899fd7714e92d3988c805c022a6f2b7d0bd4d1f597777c28003b7c8bdf1113ee6e227f5f631934ab93cd3fe0032277503abc7ea29546cef5681c37cf76106dc1c69182c0a24ece2288b61f7c5203028552b551e77d8ef9e444b40ab0ccf03b50bcabd939ac27a2c25a3ceeff0b5b30f40db4bfeaf44d86b2ae02b3b04e1b2f9da037c409b1630354612cedd1b4297ff58dd0a7944baae1220c877507fe12f4bc396faddd7a917edda72f1f4cc7f931b7388b4e6b6df60d347f0702316d244b6314f467d08b9668c464a75e98ad29a7bb94a163d9c7f2ae86b51b6aa3aea8c29177ccdc0cf7f9b228d0ccb10148b008782cab73b43b824e8313dceb2e6524917cd11e03e71dcf4bb2dfd807a3dcdb1346799fae7a1e3119a952ebef2f58240e2e4ff4dd36611594960e11456fd868b96499d3cba0b3d369b915c3c4e83150014841e81719454c2b6ca979684ad0a1c8fe4d730ffd40f24b42cd121420a29dbc7cd7ec7abeb0bb5c83f85a70dcc049b10c244f8ac012911edbdca0027571da7b769d965e196817ffba8d680ffb247ee70c519a8f6310b469c84daa9354854d6f8f5f42aef609e93d14b39be4961618cb47cbac337f89effbd172f98c177d037a79919ede57bcefeb2de2118e2e6aa00d94e6472f9e8bf465d6e901397c1da4ce21c8c4f026e6466a315963c909fcc30f5a6192bad784504e13bd81654904c7c2cb3389df7cc9bca050512e1c81da11f8c74ac11181ec37c7ed0be1798892799ef21d1e1e03161a7f12717f6fbae1f80c02319f6c8f22894aed80571d1a654cf6f21ce37ea75cc95941b1476791e7969e977786ac15e330b5aa640b5e0c6575428c23077402daa7ee3704ef7a095a8683692edb676eabe873452c0aced0726823112884c81827f34b9a31e2190a948683a52bf3ce5d8999e52af4c4026a0a0ac64bb3db6f6d6156d2b4539094a6cfec0cfabbb3396802c654bafdc006595167ab9b147f7024dd96697dd2833836a595526b94ecf29f6c37cd9c3b3b8b69ef5570244953617823cf12d999bfbf1937a41e9a258a169739fba5d4da428650c4583fbb5265b7ee7cde441ec7b0942adba06e006739379f46e3e9d04a37d26db04d3015f0d1bffc2249d49fa5534e05fa8429c0eebf15a4712d44ffb4f61f13299bce4ce4cfbeaf8d34bbc63edd1ce86db683be051e36400e6b0ef98fcca7ebd47a2aa0bcf63c8f2541b166423bee7a4a918c03ef337d50cd06edf1ae3614f68d1845280dd7a43255e4361c70586376ce2e5a48e281c03a0d9c1a07f5e05beabe4c1d796a57832e3afedaf6d5c04cfc9d15c9eca4021cc88f5e33aa5a0f3c505f4b536bf7b262675ea20be20b10db48be9ad0dd804732f3b8637c6cfbe5228a4f3c1728d338402669cf960e329c25874051d89e6a8ef58437d0898410e3bb17c07cba695b1dddedf854adafc472adc617499c7f9a1c4515ccede34b9cd27c7e93d35c4c6812e68081697e21263d483cb5db3c86fa1037cd840d1e85aa09ee56c66192ece5a78b54cd2229e3ba7ba3a1fc8216a2fd0d5c9bec8e98380f969265fc196b8149bbb28fdb8e79bd16f0439a90a57371b29ba14dfcfad4b26674d7aa5234287c9e92caa3a1bcb0e6bce844891a2e3836dcf50310adfeaafaaaeb96f9fa1ac51cbc4336c8702d94c6e3546102e4adff185227bee70b75d31fe4d03cb3d73c515fb0005d0448ec111ad32488d81f88514a07b18b964254b079a066f99459db08781115e683ff03e3cbf2a873082d049cb0fbf78e72fb5be05580d61229656cad3acfaf5cc0ea8c4ee4f3a8f600f9e551048ecba5bf6f4ebf735af29ba2ca4303aba58072040000000000000000000000008289065fe1780c98673488ef38104b0de68e7834595b5721f0741273d0e40d6f9ffe2ef4b177f2911d9239416d77e3d5fe38bb7dcf19dd03fc8e68bd2f3dd7fd1991748c98deb54576b08f2fccb69a4d10f4fa5ef1d3e5ec60caa5ed9d9ec1920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000078c70a05f060a68ac7abd943c4b18c31ecc29df6100af1c7992d2b9b0af7bab1d2cf9012af306615f9b550c2854e3cde48d72c0a3cb1da493729a5b868842a88e3e43e6205da428dd54f0a8c664055b30f131010e002f578401a9a9e8483f371bb86e5ff3abe017fc87533e044be2ca5528346f5592abbb0a800d622504c0b2e021d68e7ba371a3170f1826c4517f85ed2ea0d9c31c8f44ec9bb9a72034e3de8bb0226eb61b413bddcae2ba5bd569edca254dcd6f249e251718d95a7053b11c2964c0b02ddf0b77ef2ad9faff975fefd34759a00eeb6840574b1b0e7f78ef0e5bc5c693bea60c9272b0b31e90b0b885b063b521f9fa7e1a9f713eb0e68690eb97bb9410205e2111694f2d126552bc8093c8ebaa7aaddae2e072806a807ba9ff6062b3e83031411087f30e010452470a1f51fd8698356db213aa54ee3e5cbc0811552dfec33021b8bb818342c267114da747faa03261a5a7166e50a9fe5f8157fbeaefa3a7af50316e3c6b86c0d2e2fd21d22632d31fbac7dcca7feb1b1b3fdfd6f3d7b02d18e2502270bfb7fdd39b6184f1af7724719c5ecbfb6378e71e90f610085728ca79f2e0a4ccb5d7eebeaa563f27096528d660ee24edca8c329ba6d0be502b39079c17af9405fb9237a6441e3c45707152016346eca800f3bba7cf57260af14d935aeeea71cb2c492ba0e2b2b7a5b52495f93b73f5e8d6cd922611c0a7de2486088875650b86893e38bed3da9bcc33e1cf65e2d19be24092cc00d3474b3a022a224c150a53b8583df9de32b0dfad9431f98cdab5a2aebb23e0ddefc0778519b0e094f25d187bbc4b0a16af33728d71f23dfac4f0bd791e546336871e33bf080c53e6acf51be656def8fd1d10085517f35cd5f76e2c73a2dadffb9e1514875d9e4bfa272570723cab7c7c7d34b93423a7bf92e8843bd4dc5589147370b6a2ad5fa0d32f45d1bae83dfcfebd5e4f70a41570268ed0cba255238b4d3cd12b29951446e95dffa5adde9acb3dcc7caca912e0922b98c2933f6f456ce4231aa8e78d7ed42237bd59e6051fba0e64d2bcb1acbf6c9002db6a70b04d396f2c486d70b070f766c0a0b7503ef84ead391e34871b876e3699b48dce2768463ce6189628f3d2b31e79a1e5c54c8f6f2d827b5182b9925a32f633d352101acac730b8ee549d0a612ef428221c36b6fba36adcf5b4d7facc2cf1f9a117e2e1338927ecde00ca044bf1ab40bda8fa67c0ab91138b21e3e945d716603384c7decd8572e6560e4042c40693c3da94bbe71583bacc0e8d66d4cf3105d6eb452ec423c24743e6154ab3c5e933305cd01b5d5b51b5a454f90210918c70e86c1103a91d213655fd5f0f16dfe094c184f9322f4e7f4eec2e55a827a4e1757f7f50be2084cf445dfc70405a41f3e9c76a23dc6b591f54d0abd2c9593006fb684d25d01c553302e709963f12af7010a8aee272ad6632f6faa4657b6143e53c6998c7980d06dd0206a185131f209ec55d33d623bba1222891ae9a6e2d799fb03797a0af747c2995639a5ca4a5d5d707d20a5bb995b433774dd43124848511b98784f5cf1c05c36f3377c19a632142673df5964f6af810f26ea63e9bfc28a3a82447e883ebf40914f840794bb71b2a26dac01bf4972ab96afe5703e6b0dc98fa82fe9fa6a030daf7c49d4c6f10aa0932e68890cdd53b74e9a004870333e3e40d87043acffa15d8650c93dbbb8c13c7450c359932f47e7cddad4ce0a66d9604cb3491d4bca76a14e5a8213f7f61b37ebd02fc243525f58fdccf8506db4bdee789676a64e06b896d239a7653ddbca22af18e55a7d0aa1bbeee6e536bfbd3d654e80cf3585b13697c756e5cdd9112beb06ecf6de8bc579446de44129658d00fa74835d2e63817a8c21057a407a831d1865b815e40e786e6ea21d14236c4d6c3384e6c6939f254a16bb20fc34184d203664716e035fe2ee8fbd43a9da2bdaef4ae8d7eff0a70eb291291e4caadf809f3f8b354293e8f032d5fb3fa23ed1ed8e3b5501d200d1c7d9e21984c50d416de26bfb78d068515ff5c4db630ee3d2f7e9d7cd9e699ee27812c7a3fbb69afac18dc29e1c5b9aa0909f626be11725ffb5c3e3e0f5829d03bd101ef36f5dc82e5dd55f9fdd779d449e0075cafee4bb19a7530012ee635cd94fa1ad694eeeb8561dd5818a1616daa16762be7d31ff11a9be129e258abe1a285c48205d46e21a18e0f0ff97e5cc680e2850f5632d598b8adff61154bf75c151894caea9e8aee1fb17da808bf33e89b386bbb47e3d26d7ebaac67982c3559c31e6e66b0300000000000000000000000006bbac7c799bd41920c4311643ecb12ccf933e3fbc50a0d0dc437e97c5c09f39f5a3a743b82e687b112d089c5cfb75a6ec9f9ab195589031ca3a9e1b10fbb1473cac5b62121c404c372bac6dc0a3ef3e7823557358e34b78bccf8d5ac98ccd8400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000287a4a8e5fb5aa79c0039e5021da533462820de269f883479401dd3228cc864b489f66c56dd0e2168bed9ca60a9abc7ecdcb2bdc88b6977285aba66b7e1f562b6c224cfc7bd454138027fe38706d08c7ae98def2d3821891538374ca5721d2aaf8191a165a1ed3906a6a865398572019e5c980e70b0fc6c8fe6d137ac610a872021fe1173e5c8a87ce0024a30d9df902d58932172f0e21959749b8ea45ff9a968b032c2bd03ce3f871ad782fb2150a6b8fe55ea526ba2b952a41dd26992cd3032b2b0a065788528f478c11c0585e9b4548e7e0678876e4fffc00fffc931ae9a26f7a126c32218a9ea790d54f29261eb881a8e26ff6c3292d697a60751d0cea5d8f9fb70212d90b520f03c2f3df3c4d1dfc568b82d40e38bec9bf626333db11b165d143e70225595c06a3c33ca6c3ddac6cfe29a31707093d77cb7d20832f4a17d194924be1032e97901e66eec039934a15e0856db9342a9334b8ba17ae57c77ee66afa7084060315590fab79092b29849a89383ae57293b295be20a1bee8beb8e5eb9eca8664c2020b83f70577a105d7b6659b6677debe80f4450aa9b1d06a626459af776fa71aaf313bce416b8f62779d8769f2587550d5d0252984b8516bdaf7898be13b360c82901c547edebe56517913c68705fa945173f64ebca007051fb7986aa9ccb9b284efca3a2b6c4d09b210539bdaa80b4796dbd15c5515b788a91d41547972edb844911a8f33cf72cff6be2b395eee1bd05ba8f44e1045bb26b32ba0dece9c913c6cf1a79f9613420275ed39a224416d28d1c87de683acb049d4c208110afd375384b0b83c9d21114c1aae4ea47b07d1fdf72a05cada6c848b9b59a274d422b8a545f5354cf0093cb675417a2bba859eb7b1afd5c970718d50396a895b73ad7858fc74e7708549514d0e9d66bebb45739095a77d6e23de5417d5c87775b6a3f354485ec26a11fd4bd8fbc1441a87590a68651dfb8e959da4589e7cc91d4f46f58a1f3016cd671914c606d6fbf003560615c5a6a2f64af34c1f058d68171a12e5613a886287840999a407cfd4d1b1741e61cbeacbf232723186b9a33e02280314ffa06a129cbbf6da113ca1a133b258ebd85e285cc1f34b63c80e130c1eade32e784588727314d19de827802c617b424e0b9bd44eb896e965bb4aada6ebf7b007160f21f6d7863c092dfa10125b1a2f566b568443cb68818a6646d4fb7724d33480b367be3979a2741dcc643417b3c047e7a0123483904e85279c75dbd5337bbb3a0482d87dd4948a3de6179e12face5f628a96b2ebf78db24adabc17f2ffdf4e375278a9c95a6406324af9a2009b12240df620a5878e42c3773ae6da0a56cf81a1a55cc0489cbb9fa7c2a1abce9d08d6529d9702982d09b0af6c0d4b3430f77050169e90ed5d07728beaf7c13fd8f9f3d7de32641fe6ddb73f20c019e4a6f20a9713933fd5b0f94153fc4d7c85b7dc1f2e30652f18f86f537a087462c87c19409568da51d13ff38513dbb42eaa2042d1f5b31b76e9f307081be1950f93a715253602dd9daf3e026d8e8abcf77666edcb1b6e1cb0e1901c628e21e2a5b341879c8ab9bf1ac508e2f57161ba9a2d5d4f113f962f6d05cd45f3fc168f952e32b0167f3baf90f1490f7544d55617216eb63ee5c11fb740c13cbee804196395c7f1d6dd8925972587b343574486ca906413f5c30f692990dc6b05f02b10f2c6a22397ce0f3396e26f6ca8033ec3631b66aa697963718604d47cc24da81f22fa4dab56fa0deed0f58647a2e28a9cac700bdddf6638234e22e0ea48c8e106ecc530174bf844271d78957e903cf5dec28c836145e1213787418d3d3b262e52a2ee2640bf122c9ca9d7850fc636ab24c27beded2d5ee515c6a2bdabeb91e04bcd90c10aad52d1c52704c0a82a42bc5d55da4a77d782056bf28ff432c4624e2aa75eca3e2169c4ad18a0ef8df35e40bc77fd22d24417753c69c562324499ca9ee72e1635dacd15274af3ae4ff8cbe5a41a46bc6c8a27add862d0309a4f1f9d759e24f11f7c683fe8cfd05af76c7b47101f19100c8ec3de4d7548a8c42ba9a586a8746b16f22fd8a537a2efe5a99c67d7f079bd5e80507788ce69dc73eeb07de07b933204ff9cd1d1352027349a41605b116e5c3a87552b7c5d0f6407852cbcb2f83c80495df607ce9e7defc0fe6f591cdce468e337abc24ada94218d8d2956e8c0caa5fbe446e61f7ceaef24f90611340a57645d73bc1e51c50f100089f3eb23e24773c5285f7ece11a3f17d4499ec5e2ac3849fb896cb9087aabecd717d2b23670d5df6eb8c33f9088a2c35a3f1169e629d4618d5bfab826c3829403c82b5c1af82e7546dbb636787618aa5a1e330ff01334b309d9ce64bcc1e142c4a845bccb66e835002b754b3fa2b727cd548afeb42406413495c3ece01", "6a00006a6a53516353", 0, 825524142, "6cd32dbb03b68ed0ee06651c5ec0d340e7d8d220f26994d45737ba3e9d214494"], - ["030000807082c4030101ca6c6b47b926fa48a90daaea08f3c5077ced6b8fe2183f95d8264a904b609b010000000651536a005352d7444fd402169aaf000000000005636a525200d9c7e1020000000000e4a5402a00000000030000000000000000232b2103000000005f5b4c7159f9090a87aed2ab3562d2a3edf026618bfba7f91df0dff6464857f5e8dfcb6a751d862f0459e967d65e7472b3ecec3aa2a5d759a04778c33f4b060726a14810d37be71aea7675b583b620bef79b93e65db76f20bdf85c405fdea92700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb460103f0e909fae937e64cd6ed3dbd5fd51d9ffe46b012362345b1c827c2261e7520d6683a7719d5675b3b683e36b2d33c403d9579c187550e2d253a0d3fcbf5303c7984577fd3b5bbac5d4d242129d2a98a2f0ee39c51e101ecb9555eee93c661d7204fa05b85a1e2b7d380565b68bd930ec481d2737173610c03927aeb730211d84d8c9da8a334cd5b86446b6f6c13afdc8a03ab6d27178537ac4a5bd6f7ae02082904aaf9b397dc796541f910f2ddfb2149644073e8a4c5c588767c43d56ebd0a01ec4d0b7b86c872d0eb0df38f10839784ecf39dee2bc58ff929e67b4b87444fe8b86ed84bd21f00122f0a2c95611c386c77b92e6371904bb332a912bfbdfbb6031d18503bb2796656d54d8e9efdfae0ccae045c4a64de5bd855aa07d0d3215e58022f1e2471fdbaebe4e84dc188d5f7b70ace07cc3e23b6a80c054b6931f2486738032656c3ed721e8efd2dbb83b1e1c5cb7e3be8774aec463ba452ea30849140affb031a624713beb8f548a92899f8527bff5e317424f3422fe5c737695c8e67c89a82020b74aa9868da1328c99addb07db817bb5f246aee0fde9afc19801b6cd690c2790ae2edc053fa827f0bdda00f8c339a6d8316be0bc7b76aa673992b601a69012f6f4caf5eef664b94967af71a17512250362b29a4302d0462819e0941182c214ff2ea2a91c9332d33d4ff957c54b7d8c0c9fade3103837d76af5270a39055a3cc3fe0906720cd76ba0954b6a190c94fdc61a2715205f96efd56e56e2c0358252f811abba6f824ef66c97264c9de121daad2343295c29daaea6d3212c495d8166523f3fb20358b554cd6aa743e58b889c5ec967ba00a38836470bbb919c0eff5c23c716306e9811a3f3ce33293c683c9bd8103b5f65360aac69c37f89b5c9074e7b442cd9b4c8a885fac77647cff45f3ba9552a0409d1e1429f5484c6aa272dbfc94c569a6aa9b2ead23acf61d7984ba64026ec47aecbddb47b0e813ab7a220e42cf5a60e4b9e8c883c060150f39a63ed2d6a33df95a80252e47b2ee290eeba79a39411938e20f2267d7b06f20ceb36c46c27e69a3f0ee87de8841f22efab162f96701f4a568ef5ef0126d6c8e89186a40e3b6caacc44f697b2ec9eaf587778a16d56936b6bf2a2d995bd3ef77744a611edb4ffa71a9d2e503bb541910860ae2afab393b533a29b55dd5087b54041bc8fc3854efb845a6886cb721e6622202f9af94172c0d63269a309f3b221dff9796dd8d574b1927d4f8ab3edc994e1ca64cbd91f57524c3d94957d1e4499c0125c9e9ccc5873faa3dc22498c618f056fe4cdc3e935d8d58bc82d532d951ceb7c96469fadecc4c04bf6d1e970f185fdbd4863b5da7fcb75d0204fc5cd40bd3ecbc0b330f1e6b6a512cad40774c642cb0bd1cced4f227cdf241a3241958b60eb320b9b2b3c1a47612864c7f20676e4d0e129a04bc28f9bd711a6731fb26f776de5d60fa43f68cf899c12e00fb467b15d2b79d1427a2abdfd8c9e003a132dbe634439cfe1f329e13b6c9ca38caa33eea8de01480412c4d7d5f17b8963e1e2d0f154d99bc9558fde77e457d67583bf7cf486423557e6fe8fd7b278dd13a67e89e34fa9fe51c37144a27b096e9ae4bb8f8285f8cbced2b4f516759cd8e331b7958c6db3e464d0f918710b458403eb442fd9fdb859199688613e895bdf19d83ecde78fa105dee5c950d36d9f1da97ae083774ae3649c63028314608287d8a588380927271e997d949e14cb80f81e213d97fb13151654c5489dff37735c9584c9d8dc65b563104ac8b1b112ffc1b7b94d94dac8eed4a4a86279b3afca86dd840db4f6c2d61c8ad11dbb0f694c7a2f44b76bd90c104b8a6521c7a293ead171e7ef1ce09d4eab859424b38db17087b5dd9dd395d79149ed421c193efdc7ec10850ad47bd0267127aa3ae212d7d45bc4f700e3fade31e8b8c6583e13dd7db2eb6b933693c38a09e29c95634df1b7ded0aa2e0c416ae31d645134903e845f3fce30a6aadf1597dc1ad307b25c3d39c72fe51696e76ec58a866f0ca88e46f64a12c5343b50f2dc5bcdd99bb90e35163703f45410c9454add50ff8dd644eb5b2aab6282941bcf2b79e328c96e4a5ffa6d940f03a7409966303892041ecba42e36bd9d2f231c4fa5c1f307345e08765c370a3ec66c9a201db054c444abf81d6f90442384c676317c5ff94bb3b5e7e2bf37ffb7b6953ffb6e39c76f5ac69ce8a2d9522647b81f0429258e068bc43e9cd792e5e83f2b960caf698bce75378cb967a3a76c60f001b1d45b29d44a1967702000000000000000000000000d6e3b8df357b2f9cd6e88d7ea953766fe59d6af4ed115dd8f8eb322c5c81ab86f3bca4eb99a0ab763124989d9391d4326ff0981d3b7abc4a4dec2f515ce83fb206f2ecbd0520cbdb36ffb14a4c0606c6b5ba20e471c4013a839d148e626d7cb7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005f26c8d774ec4cfe372f43148e5fe8c2f0be06c36f025de937a51cdc97877479e8d5b06aeeb3903a5c8c34d988d3317b2de46c5accc24e2456ec8680eec5fdc71ff6d6ede53931be450956511e09a5904cc4391d0afc34bbdd04077d904abd403c533090e9fd920c7f52e2cbf3f5c8348910f1f13436d90bba402ce946260ec0031dbca91cdb521bd16593990fe3d457fdad7479c2ece182586919cb7518a5852a0212a2dddf3aad1bbc7a5c262647316ad6d386fb5fc8e544bf02269f28c0324de20b07f1805bd9ac1774e11ae353555484fd903e57802c8efd9ca0077e3e2e63cac808053fe8a637514110d8dcc81fafda35dd8b562e7b7497982bc2b2a7260fe47b021b0d79d3e7fdfe0181a4be257ea21861a10579975c60e437579cab43d8488cc60302006db8b0e7a3bafee79fec6de75631e2dddd3fb2f043b7643bc74685c09507021db59b0748e643cb6e0318f8a5948196634f6a97d1e525cdd7b43e352cef7a2702042a81f4de80d71d31f0be0857a1268427f8566e08a419a3046491c28e7b6bc5020e458685141b8dac9cf6b18d1ff34654d0a1f915dfd8d57b428afc0973735f8b67e387ea04a2754930047759c4058ece0873b51517ce41203bcb7abba3ccb85da945d86b9bc7eea9754ad149d720bdbdeacc2c7e528fdbaeedf3652ea1da710e41b5e2ced068f271411a1bf0523d8fddbdc5af41d82c86aa86a3fad83710ea6ba537a4dd16581e28f48d5c0b79d6d3faefadba621b2d48e9ea95c5610136c668fe4fecee39f0d67f27028e7a02267d4d9ddd4e44156b4fcd2e91274cec031bff2751ff9e73e432ecaa6c298982065850eb1c26bad823284998d450105bf2eb9462457e29ea5981b1d124b9ee1e70c91db77a2826765bfaa9d8a66e3f6dcdc61c387f1fe7a0a834c4353c57c05b294575ff9976c347b9d7f2cc21ba19dd153988573c258438e1ee1a4a41722f8de28877547813a9ec1154b25898fdda0a2ce1d1395f8e2c86076d153b824020279f21c4c9e2168c371cdc9cd58055b9a811c6ef14dd3a98f7f5436f69bf91d5380ce111d93fbf91891ef75a81cd97fc4565e1642b24e43c57f242f887a9a6729b6345304f71bc2818b8e82fa64f002ebcb312ce542ebf9d8ffc43c2233530d136d7d116dfc0de2b938ff4710ec289266b85e3e7b555ca322f5ede2512b0e0cb89eeaa76bcb201028494021523433d6f341e211f8593335e788bbd479a2449b047ff76898119971bf1354fad7ecd29d0e23bde8fb45c94b6999f5540b0f93972f469418160266f623bb8a575045484536c2fc1b2a464bc10889f71ca8389714d083b2fa684e352dbc4f274ad22c8af983cbf485383fc0d3ac93d841fb00d26cc040e0cc0b1bfc1e6e95f654aee452e88fc78b5f1be5ec173a296da186c70015ca7d9c5ee6920e2567bfa898ba03f7fdedd830539dea9825561197f615655851290028d1718866e5859f326575bc984ad00ca952511d5ec85e5220dccb5a148567bb7f1914955cad69109a9333d1cd844d936ffe61635dacc987af62a4d8693b8711bf6891d1ef4a2c290685e76c54d0505b2a1ae3c561adc33c572cb95c4b416965b9d9833472f287a09f93e27f81a058ddb19824d0804433df89146696738ca3559be83e755215fcb7beb01e40cc7ee1af73cbac3b8e85511629a8740367177a893228b731b604361b8e3eb601d2388dbe64fa0acb4922b7bd83fd617e5195814ca1b494560de657ceadee298af145985a9c2c7e6c7ef767acbe7638ab38b54fbbba6ebc1aa9a98e578bbf03e5c7b38450d1fbf3de29072d8119e5fe40431f78fbb067ae5cfdeba18f013623b4cdfc498d326a9ec7a9fb99ca6b833214333508b41e9ce396ebcb7eb15452372ff0320bbab8c7cc0bb728401829d0b342af09211ba801efc6aae98b97d224737cb3519d7f019613e0324ef1b060474c4ccd6ed4f3540fe0260bab3bd23eef863bb85ab1599ccda98d5fd4a6090f221766ab97dcbfa8c98d7de79e1be0734391a9699bb74bb36ab015a1522685cfc51d29d1ae0cb18efc5d81e68047004d0229803b8ba985b47ee7e290c9acc27d0864205ff0960837d4c5de138e5bcd1505d4f48e1488d641a63b238f19e791b4c3257eb33007438194bfdc32c1f54aeaa73a03e7bb479bd9470decc05964b51cb006e811548679c4e39abbb6173daea635589d31a9debb8025f05cf4f9da10ec693c36b189cadb011a2e7faca6a2602aa88a9674ffa5f85d4cbb020294fd4edefb11d873dbbfadf84f914b90000000000000000786392030000000041923a1fe63a928e3eddee375a5c7f6f0b0546e6a1ea9f52d43005d954198c08bcdbb8d2bb1d045c76c0cf862b56934c1c3d57c92462f6eeef8ab95d8b2bf0d8ba6212b43245e47a84830a88febce2ab8c60cf270e14ff0d3f86a016bd916a370000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046039133161c4aa4dc1797f4bedec101d78a081a8c41d7bf539d4f789371cf61dc9e1d0e84906bf1a7ef8a62e14d0dc010f617c1ca5e7faba3451d49be47bb9f1934cc9e438577d04d2b3293c1fc2a0b563c7654c298d727d63f7348313f416cc3af9b690cd41be0b9f89360a5f0585ab9dbd00c0e82110dc8b9923525870802022443db36a8c3bd89bfd60485353397b4349bc048d3e9f0c9536ac89830498ba0030d8bb7f5b5d812609c70ba7534af7ba71e8ce949a24329ce3f00590357e4a67c0b0395eff98c5e2e715acc0532d0b9641f2dc4220ab6f102646734e8c5907998b6f64d1b6e4f2f3c5383d75aae5d7a8478bc3a6e9ba8b731c5231102aded2f2100030ec81e4ad1e9894ec6da35e275771cab7be221606d6ba78114ed0c13f02a160e02067ce36f31853214532d16cac6a5dcfa101f83cd8c8fc0c3cf75f68f8dfa581d0305ef5b3ac42e4d58edb340ca7c439a0bd10b4439ee2fadd0ebf83051d2dbc0400313f13351114fa3c2eb69ac14a83ca2b3fc5333af7f393bbc537cb205729514ef021e906e22e2e2c59bff61427c9b8437991dbd45b664673bac45e7e06b42660fb97a03307d1e67359f34a0f7766943600bc53574b240b60d0344a4fdced3047d99f9410d99287a8425a17a81196411069fafcf38bbea130410ac83269a11d11bed8a89ef2c65eda4ed04a7c48cc24d5b3890b8563d8b843078b37578689fc4de6637c4141a59bf6f866c428e2b5042f23c629e9921d49f7764a887b676d7f9815bbf3485a136ac761c00ef5a0384c49dcd4f69a8a221cb9a77a7240bb289f8c371f8da47d245365648c7fbf19446ff702969706561bc96a5c97b1bf2bb0cccfaf5b0fc32c5d163b5a60115e1bb99e1bafa93827450ad2b40e0eb3aa92410304045ae16a6125ba3bd9d910525258fd1b4db0e0eef19062b3ffa6a1fdbf56022ecf859540cfb44b7bf269fa10a43004581503bb124465db6f0fd4d93f92faabf721466ebb158e378d94e031e4e4203ad57c59901da1a4a47837775e18d777a0fccf26bc319c5d45bd59c778f5da94e8704ca6a819f308dcfc4f64438e3da2fdb8527ec4c1c90049e4a4d30f127dff24c3d0083cadb21ca8cb5696e8d65df198e99825718a05ed364d8eab570184769a58e2e43fdbed04da8ba48d42d6ccf29c3338d17d2026e433eb6a5aa178aaec297df1a25edeeef3a524a1dcb58979ebee6dc5db405cbe97fd297e05b2e850df4092957aebab6ec0ee34c517871869ec8ed9ec8bab4489491d04cf3ed8ea0c41540e0ee0ad4c514bbc5deeeb22025b644be73b734a5fd97b55784ee8b53e454bacc48f4970885b151002c6c1607dedd3946983dc16a390439f82618874e411d2398caac576b154f142c1b2c112dc21e7346f11d2f9af9521880c4a53b48fcb7a476f98f6a614343f6f39a5bb9e76d01618dcc1327c97ed78d6a37a1b75b5a41998df4fc83a1fe884181261bfb17132d104333000c4f77f472f48d29941fdc9dd8afb49f778157baf8b0d5e8c717d81aa0779d3c218effc4e9ceba047e65e525a35a71bc1a2ffd040e708ee75851be70ff86df65ece94a479159ec10837bb2a4f5ed3c7e029b4ade9b91161d7f5e855393c3179f686b916c6f8883c52bf85fe8734bbb6837156a8bb4060196c172ec1f7eaed5d97031349149a48ce8cda9e1b3fd660453ed7501dc476023dfc641ac0af209231cba33810dfe65df15bf540f81ec6f5b613d88ed47b188f5f2dcca6788d4a6d79fa45e4bb0df46b8e25c66daed93b8ad5ca6cd9888379d8aa463816889795f7f9f6a177c456689714b57e713d108b2b385ab92954c56301c448ae6b395db5194a1ecc2963b54aecd6cc8f9539be3dea2ef1bbf3245fc5675227dac7165a8a0e8b2325d352c1ed4ccc1ab6f2c1d7ac2f540fa5a7649b14a0c418697aec560d03ed5c51075aca3bcc95e6713b4b86b0f53c6eb3353eada8da1690ea8aaca03347f75c8cab32d673ad0c59395c26b9a187728ecb6a5d248973646741d63f30db56493327e26cac8551c51462a31832cf7cc24f61a6adfd6b10dc1e016ab426854c5deb1c5a208d9a91ff9e5ac4ea3ac5bdcb21ea8b33e8c21842a900dc1a6655d4557328a717577d94c886edf567bf5176736ed4bf8e2df8c68699cdafea37080c51816e2f12d86cf97032255263e05cdb3beba469ceaddf94f093a98def72f21ecce44e3664dfa4838e76553b8b2ba1bb33b024987ae9e71c832966bdc5ed9c193e208e5eac072b0b6692d543558e707a3b64605f833d3a88baadb5fb028870e55d7e7d3329fa857a92901b8d32cf984291cf5c28d4dde4e86538409cd8ed388bbd687ebfa4a8e0072274e1ac7a1df1c310fe090fc785b727d7283c0a276a754902b1aabd67f26839e594ded116bb862eade9904", "6353ac00", 0, 29096817, "2ce02c0ba322698210fa4d7c83cf2dbca8d69b068b5a8009cc843c980e2ec615"], - ["030000807082c4030333e33e669c5e0d36c5bb45b19afed84e39dbc71a1d2da52c5d63cd2dc0ef96310100000001acffffffff885300a32c2d34b41438253ccca50dc69c40d0b6cffff4d33ad6eab9bcc63c9c0100000003515263d8e54c030329a08dd4bdc7cbd10d679ae2623fe390b1751842ec1358374d8db3cdefcf83000000000463525163ffffffff02dd648c01000000000900535253635351ac6534078c030000000003516300cdec3b20db3988e502000000000000000054fb4d01000000008b75a76d33daadd331e3183c15b9e1419b7bec04c5d04f9f8101ab292d3f8afaad05a223adcc647b48318a1504934b37d325f6a5b7e084e1c905f2bb3ff448ed6c7d4533a4d90862496de5ed636655f64e52f60d92f7a8b448797895ab20de7700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b316ec44f6b6bcc2c347bd2b372c8f15773c638cb1659d7b789455ac2081328f9cc23eaf50ed7a1f0d0c2b6d89a40b7254e9e7093a34347417a17306c26b864b3cc44afc251d531b0a5b94db520b773a0b18deb871921236729c727bf11c6e65b8ccb337ae9e523c307c089de6096480a33ec7a80be6f67bd5463f200364795903182e13414a29e4e01ef66a4dfed53fa4b27d9762413035776ed1636893a0e11003230ab9600e719030a072b68fbd1e0753a8f94d335020b39fa136331b12f2e4db0b002eaa02a73c4b95a2168bdaf94cdf8068b25c22dfd20b7a7f955cfedeed7b11925d30eb9a537f922b777af6b70b5e8e2ba90b4b6ee7597301e5740a185b74ec0224a0ac26ede085b4f665b7e6d45320daf23c6d79492e470d67df6ceeafddf547021b99cdc154cf832f00d0f9b415acdb639908a23e588b6dfe10a9a411c7b8d206030c7db7d7442a478ad72fd95d1b516131e636164550b1f02f595122a4d651d269020a0f669a5ea9850fd9d8f55e2ec7c88ad37e3d010a451cfeba685c5825f0edb50317edad75c12e18cd2bd011df6e47f31730fb60ba03f6365320a41930462efafccd7446861fcd80c090f4a9976ce842902cd7133789da0b11b1e1405944b6a082363c50a547ead307fb3176e95a59ad3578858a5517d5d24bf935294051d59a535d7faf7184e99a856bf7b9bf80468015a88e56a1e216fbdc9ad682abed0f5a0d893e66b59833ed525be95fbf8d5fc498b56bdea9657f29c5686c05f6580f0c86cb6099d82d3b491c7c13a8e863db38d364a0efb48fcd32b185158210b21fdec26af445c102f041673d6a5fd34295fb745e6b1511388b5ad108a27a187318e0a25c982a5c06f492f02217c23a0554c07b00bf9e5f14e69b4b19e2c3662aaa0844ac04bd9a4be70d699056ce34f5a9259a7b85db963a38ac4dc0e004e3bb95bfed9b4bb2e556b1f982c36060797f1393fb52bfc1f7611cf801aefcf18b9a92850bdf723c94f297d546f5d4ea72439bc6cf75ad7a4bfd6aeaa82358252d310d636c4e8d75036ded4884633cb6a9d4bfba9bd4e917bed386cc9e8c56eaff243c2a9ffa4e507c7fdbf672afff9ffe66f140c1a12acf1e14cc46ac79228aa6629f0d5b270653ee1139d99286be126ab9a712ad842a60eff28564edd84ca269aa2a1d71da9da2128a55e0e06161a4fc53709a0e00d4d4dd6f9d29965935895f985a2dbe7324621bc8b6bb6f57da1b4a135da0677826af469eb50f037c0f82d93b3679aed899a95350586b93b5b324cdee258549654c639a4ba2e20fe37841c5ed5e2637f4a3a09abff129fd1e58de0d8b27999facbcaa85e5fe6e4b04cebcafc0800dac7691346b45c00dce342cb220f9e9b386840d92a908f97e010988c720cdd7a91729836848cca652b7727ffcd234ec7514ac31774c96621de3aca88641ce3283f7d30f1728bae9b82919b57c7883ed5e189f14d01aeade74e10696d1b9bf380f7b67ea1362a736fd4c83c6ffa5f339f9c0ae5bee8597f30f36c0a0f451436a55bf06de51379a11c2aebafc595e2d44188272ccbd3f40892e4b346990982854fc6086c547073ff66a647e4b86beb9790729dcd6c8665da5e213acd80168bb9bef7f563b2c0631445df2dab3e9649118cca5935c029c61e97ebff7415bced7c7b758b8f1702b8bcce350934d4f3348b1b729b4323ecbcd3b0e121dae1422cd61f24bdec3a760b9b3a0b761e417ee36cc1d2bee5d223d4bda315726f6328446d54a6cec2ec284c9b571f19511b38d4a97f3c4c5bfd2770eacccc79823d91c9cc6b8266dad77cc3c2e6c0fb931da5f219593f790a102452e6beba6f85ae1aba0bb2a5282e7b305ee3e965ec071cb8a555e3e0e29249ce746e3f2e752b938be1059d683fdd6652103347b8917519d7453edcf701ba7b9fa66e765c026ab9eb33c2236749296cc15a7d1ba8039b826642bc78eafb64dee92faf14c528ddb3e5d5cc6b6320ce032d04c9849ed48bffe9430e61a7b2971e034d0c2179043fa1dad5b3575301237deb0c56ae21b16f4697c85035eeb6618cae7bdc0d3f43770c8e80fa68c1783d38298afb1c23dfe8a46d86b614f4ce61d5db456bbf63ca6ebc436bda15242d54dff932265b740f90ca4d46d080551271f90513358f993750a4e44fc58b691afb0bbfdcf3330d80c4d5235555b335786a20d3e0a42c1f570bddef9c6eb2c7f70d76d62261e42070ced39d275f42eea66946f6dc79489fa0e2a4b296b067d5604ce08c0ace09ebfe06bf3dc2e85797d348a2dc10c000000000000000000000000003b6a4e583bf956415d98f1c3153624459acb7e0cf8f0d2847de1efc78023c9b494c052f41c692bcef4b495d5ae9a0bdeccfa7bc5af539a9577065e318153ff0216ee954c269896c3e34283102d4648844886cf9630c800a41e75f74e526dce7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000acdb571607f9b6b72c3a3a2510a913fe508e43c988ac1131b46ebf9d497880074394b919e3b72ef2ce0d1ac427c869d0adb8f1a8c792f65be44621bfc85c7ce8d785395e759ab7db1adade0c5ab56f3dfa9ee81f37b12ba837817861d3c63109be895db67eec5a642dfcde5ed70fabf791f658868df23001ca2f1658e2b3e6800209388e6bf100de01fc2dac7017c4d9fb3a2d8757c8bb8744b60cc411287eefc30303fbf89a6d15bce530521aa92a558f825d68b33b4be736183db145790d0825070b08adf07cacd92c467516a50c715b74367a100d585bec63e60a1b4ac3f3f9909af23ac02c536f87c509e192ea0ff93c366465cef202edb0b5ddb385f2d7629fb8032502d8081b1fb25c420d4f7a9f19a0f438ab175eb1eaae7484fdce6b7cec4da0032adb9f6ea9f13b8ee2e5713a6a946fd1b7db44a34abe5b7c7189d8df71ddbadf030f3f521e112a991202e20145584f53f0f12cf9286fb846ab45dd0390154c968903182cf601ac5630c05f5a9255eeaa9de7c3c740b6b402ac5b7d880c1f8ca93444021c0bcabcdc770dd8e947073e04d29e9fa1f0207b30b26993194bcf50a99187ddc4805801eff7ed8821384ed9b2249f9541624c8f68b9b2c44dbb77e015bde8d648d39c2b598cd685fd39b574907ce727f9b70283fb8d2632d1b24abd94214314f1c43ec918c3df0ed506098497d3521c844b6716073210676891d9a4c70e1b3393a8ea5152f106596eb774d8377bc819c79fc97ee2a90dc0a635e3f6e78ba7b99c84fa005c6b97896f2cca55c10fd5224002a71b14a0d48856d30efcc3029612958f97b386ef26fa8efbd52a4441a0c4e0c09a99e71dbd8fccab7c36edefb47878eed7023446266545e616b9fd32b40bff2d000757191c6a5cdc14cd6993096b00e6b268edafeebce49beee0302ba1b8db0cae51224e737f7861d75ce9f690abe4b4c0502bbc41563513cdb5d8022ee400158ba8369c938f30db2314567550c2da9d6af4535958b969c5932c5233f83c568e6fb192fa51ed1757cdec291a662cb667c83b75007a7c8d6d29621d1f5037b991dbd05da70358921b1d1d38e10ade164de1b5fb33bcab451f7792b88bae6f92aaf33fc7c8204f04498a9ffed89af2f2d25a5cf19b8caa895d731e665670a214272b192cf85fb32eef28402b277e09de281148460e0fad8cd972361790e119773157484780832eaf9d8b83dbef7a100f41650d4ac5f7b3c462168fbad58198a39f884325af907dc2e9b9d7020953d226c5db7e4f3cf5976cb6b35e5f0aa6c29142876906e6080c7983a24342c93d8d8b48b298d28a657600543d7f75dd3865df348044d9c37336184f4c8fcb29534a87020c2ac23ce7346a0b4d6964f621cbfc109408fc9a6b03479cf7dd029f8f6139de3e8f57b7ac252281581f64fc5efc509bc635667fc8923d31eff2106ba9ac2cde81dae754406cec9f8b29964999a210699db326408a7a943193b5eb3436777e5158d200c7c4167d2a51a9fa93e316a085304c41b3a181f5c5b0e3569e22a054742159884bf80c498e974ac4c1040f3f6ceef8bf4395869d72c1e57218472ccb825c6b7a089e5be248b2a11f4d341a2852659592251de1b8b7290a12a692e95fc12641c1296122880684bb541ee7965f68e6ac9e4f25a015beac0ab7439e277a2bd5fe9922c4c3772f1c134db7a87783261df8e9dc1779addb0d803a594162c9c58bd170606f25926b081505a81e82a90b70e64df042145866183be4d78af927ee8060bee0ddd75f6bcaa692f4c1de9b869d6e0749f182f891afe40e093840bb88a4acc88fdab0e286633d27b53be8dd2c2cd704df9aeab4532b24d5bed8edeb669a10593c964e92095854928d2a02f1b1d1b2cfb9eea0cb196957d1de10b1cb23887daadd46fc7d22bce1d71e980789834003dac5452d59c22a698a5baa19234e411c73907f86dbcf6464b6c36fb0c80644d85758562ba4a966e3ad56d779372bf2cd71100869577d8df135bc6e566d65fd98ca579bfd0e0ba82a9d306a8ec24e3fc1954d1e6ff02098d70848fbbb1295ce19b642192ec25945ead93dc37e504f5f9f0d103d809e42721fcb76b6e14ad78634f3d4b0fa04ba1779a79041fd6137fbe3e162ab0bf72f846b5b156ff28e3a2bba2f4a64218446d4168abc37e9bc4917d2a175b4e9c725dfb013b0bca46d70c72f2211d915c1631caff3159d8dcdf3ffe332ecc5dab031be59c387ee7b1064bff0401bd617ed106f037091fe84d1a840f45619eef049283862972d8076085185e7fa985383fc6cba4d9745c7a7c057bddb0be50f65cb455b9731f42841786fbd965d0021611c349416f4dc9e4a0edd6b76175716d7d33b2d3104be264a324489aaa8e6567f686e88ab7d600f06f5b732d18d3a7a3d486613892915d27d0003", "5100", 1, 760059637, "297ec19ba03553fe398bdba9fc27abdb0425c7f0816a519cc856fb9838a7c291"], - ["2df31d3604a49b79b597156d1fc98a45b760690b021c15cfce93d8533103d56d55a87cc724000000000553ac6a00acffffffff1455377f299040b87952731a0adbd6ca42357a4f3a2a574059467c97de12db0302000000046353ac52ffffffffdf40522f6886d889c7fdfa264ace988d436fed2d314699d38b6576ef45be0884000000000465ac6a65ffffffff2e8d99511ec13fb853785c538b39a2820171bc88bf9644909d4026a17cb90bff0300000002ac6affffffff0249c8a10400000000030053ac2bdb52030000000001657a37620d01000000000000000087426e0400000000f8df940a99f06bf1af4917f69752ea810456a6a1f2229d0334b4fb29a04212150233bffbc74ac5cbe5413ce4d3042dce8ef154f79a72ac5bf6b66a6a6ed6b49d5dfd15d9f8a72cb9bfd2283d850f4d09bf8c3f9fe824f51b1c5aa9c2f9f77b6100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f938cb9d9900e2d1a1cc5a598625092feca377fa8c6c4af24474e4a654a1e8d134a8c491e9398f482c98057f91efa6c45f1bd49e1d6393cea5c858f26000ef4724381a8cc9499571d37488a1b21dbece2ad41a5b1acf90c116473240fb2bc0c87fd1de7b26828fe19d882d81f1d349373cf70eb479af084e6f0b9d6f987a9a82032055874a6ec3ba68108735d3f1d14465b4daff211729b046933b08ca1ae857cd021e96ceb3cdbf6f45ae1febc22335f8b7d7dad6fbb9abefe6d1fb608a9b6d41ba0b027373d531d7b3bdfb1ac49c3a7dc2e2817969b1bd2880d3d32c571f9e20add6261d272e797afd37e5703bdac85d870141b6e040ac9ea5799db41a3f4a1adae802109b6b99f1d53b89c4ac38082aa4fa1a96dbf4e8d250a81067bdb89453cecc6d021f96ba57cc0a9750a99cc8cf92afe3ac3748414f58fe7969fa0a03a0e70f2e450227d4f02aba814dc9f994afa7675ee2edaf87448a847bd1ce93daf6a6bf0eea36030b1fc5c8b64efe759c42a1a5e89a5d5a5cf7e959c7f97785d122e0f4db5426e90223c98b55039cd3ebb508c29de1f969ccb3358726838a7cf6cd3f4ce6c3f555db7e0eb1287e57e8c7f71bafcdcce1d5d17c81156167dab3a4caa0a677dd034e1fbb8ade50845f288f67764ec6b4dd16c363f67c247a479cf6afd6eeb52baccf4006602c554f45834c09bf13361a9f9d648c1d26119840a2d2250b8e3204622baabf2bc19355ff0076795dd7f68e9a7ea52d3bee39503e6ee8a464be5fa9d06a892985d47b4429c48f024e3108bb53fec8a9c87516814235647ced13c5832e314a6606a195cd00f3851d1c73d740fae59a3e740b96202d8e0513b0fcb867f867c7cbfe778342acaabd750ba098d4c86ab78edd7fd048d738a0bf7bd54d9bbae5e017eb6a5fceae52d00e81e4cdcdb48afbefcb7d7e1dd0c5fdb3fc233af6f88787a9c8bf6771f4d30752897c2735f674d2e38cced79789ea3a819fca4ec80026e35bdcc682f96ecc1966bbb487c803bf56a17dabc05d6a08f2fd8c5448a9aa1e2caa7acb5a000617939f57544cca2187cfeb14d06922cf3cbed6da415dbb8c0b45fbc4c4781843cff7d30421553b2c233f591fdad98677da9a1bfb786de8b2f9bedccab8da5407aec6e232deee12eb0d818e107ad014d785e301a41d72acf58747b79d6b6c1607f04d33aebe428e9d67272fb2a46bfb93885000d91a4f78c301b5df32cbb26afa9354c9558771a2f00db73fe1c8fb62a9870775a66a422a3557b391035daf9ce1fff2fa79fa17ac14685d340422efa5f1173c6c128e5e1811d890537db9cdbad3bf4285cb7f6136e435e2e7a9ce5a1b71955510d295e264e5b397831837c8b9012d55cd71a0f59dd4be2d0f9ddb2ae4e4cb44d08497b09a044855403797bc9ac8bae39fda6851a2b32ad7dd2be3ca7d7c08a052397116e9c43b2b41c2baf1e89bc7e9896ce98b6491468647ab79e7cb3d1a6bdde1de6f2c9f1ed50351d9b7262cd0f2f023057f13c8bdd308e67e72e3647bf03d245f8c8346299753d58cd7dc4ba6e73483080c7b37c868892c6d4cab8b2fb9c981712650ec69c95f1df6df97c5d5b94c066c4799d67e995a7c1b3df642d09a56a21b97fa253e305d7bbb3aa7191629055ec5f084936ac96d428b1ff071d04d313121822ca6dc5f171ffee35fd2d490a59042d530de8b4de2e1db21e5e678f2e5e92e939446939308ce4af50d2a843b32e41fcead20be4d521496421079fe8dfb5a795cdfa9fbda86fcb0fae8c86e440d8d244288809b1998fd77df9ce83f074375f92204d4a775d40471202f8aca5c7226442dcdcb7a8d4707186280a4bf0ed8370d7a9fc32e6bb1beea0f8282095b5ccb9f5e117120fc3be67a124a92f42c4e1138b2499550b822f853a2fb2ff26b5ecbdd84d2b443695307dc4a2f472d45fc55a41b1cb46161538882eadd26db96681b3b663ddffed6a7eca456ea9eb7b8c3b63e8a0cc07ee3ee3ff31bccdc66d3ad069d74595a18ae0b937995a63adfa5c03bf4f1560b5aacbda4b2ab78e1f6245b2c5e43422965440468652936a652cfc2def646175c7c6677ec027090026e8e84e2425683fc150d2c7706330c296dbcb9791cb551efb90ded7235c2d907416026e754db3bd15dfa64a39cc8432c76951272dc9a787eac3b61661e6f93241daaf01da19526fece8e18fa20c27b7a0bdec45381093a255311d3ad3c29704f5843d193b47e9119d3bf13dbd2a3750510f5308eb945c63db912626aceaccb88999d029ba7a0b81a4b66b956045879637672c11381b6fd3cffe94ccfbaf01e31a6d33293b49177031be6c48ebfc19625997957fb5a2cbd094497d61bfdfa490f740ab6a1e1f9b1d38b28aecad776cfedb27d10c5303fd4b7a8fb066b5dbffb80e61a3008098ac262c598ec05", "526551005300", 2, -1096924455, "56483bd229c1b768695d0a06478165407c8c5d422d1757b8dc619b7216bc85ef"], - ["030000807082c4030405b8dbf40a273e52c07e234c6622c521d47e2201bac787fc027760139779c706030000000152ffffffff87a084e740b9b8a137e46488c9c58a57ff497a5974d5820317813a0bc434009f020000000027f4d45d1d800b1644b534fa806d4dc681700522f616bf0fd6ceccab6c1024cfcc17f71503000000030000631f86211a9909a0bcc69bebc24276146abf5494c9f408c53f6bd68c0d59058c45dec81a750200000004536a636affffffff033cb9d20000000000076aacac00535163401f2101000000000753ac6aac65636506d303010000000007526aac5265516398b36b976e0ed44500", "6565656a515253", 0, -638258760, "25929be4131284ef3868f6aec264bc0b2dcb58b81465c1d9dbdb077d899de0c5"], - ["ff040e3b044dc5c145f0797ac20c65ceea71cf150ca59672e35f60288a5775b15778273aa20300000009005351535163ac63acffffffffb382c22390c6565932d9405746fe19cbdbd0725ab576e67a287f0edc82d983b20000000008656a51655153006a07e86273c3c76740319f113b04456057008873d72e53034fb4021d5b3b140b36c378256502000000055353655265ffffffffeb0c756286818b3bba950eeab301161cf184ccaf5c2f5ace35230480c2a1bf4f0100000004536563ac006b245f0477806400000000000151f996e9020000000007525353ac00536a9ae4550200000000056aac51525394de6705000000000353ac5300000000030000000000000000830a54020000000026752d7b0d3be2e1ef86eb99abed9fa71c6674af652a0e24ee96d7849df61f5cbf08ae33e14bec041f8902f89bf35f9cf5a76c48e65c109bf655b1d17368f3648ba287a7ed010c5cfa3df5f9812967d18c84527d335a792f103895f3fe1247c30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069db5ed0814419ab6264921ab6c1972065a12b989c702b0bf50c45765389bce17cb1320505789d27841a8b90f312cfd2d3ff6a2e296614358f878aa96b2338c56ff5e722f52f9093f872c6950c4278c4183ad827b6721df10f7965b3f8214b9c1443c7157b28d0d2227d7d40f87cda428a7f654ded0853c894090fbd4b9649100320a640f9ba57891f53184e4770af845aaee81d70d68dff65197f7be6c7b5c6d80226fd71936401828946c43553201c2f2cb4f46133b6b6ed161cbc1d257534d52e0a0358152fae38a4b046527d2d3aa78bb7b5ae555c91c5eb9071709248a3557d2dae3450735bae2e61cf0f0d3221bb066915ae297725defdabd5d01a51cdf3c0b80205aedde72523e7bc1c142a456c5a13654c929ab0ee56675157708469611f8e9c030900b8948801730e8b6886e10744c37005e74ec46a47cca56d2573937bdf591d021bcabca5c065e2b2c714779ea6907257e0d12f32bafd0663dc9d0f3a48cf33220211cc91cfcdd5219d2fa9542a3442abf770da77259ff253691995643d7dac85350323602a75135db2e9545c7433c19edcde64d8ecbaad124b30a44599516b56bf9a77aa53252f6de35676a5d61413a16107738adbadf0f936514c5230c105139bf1e8df424bbb7714cac564973ed5277305dedcca85a7d89f298df081b85266ec7c08375e08b48dc6c3fa8cecd94c529b1383bfd4ec847aa3d4023039be5fd64f555202152a13105e057499ed3c3a3fc5eeb9c67e0f4f0214223df1ebc2f74065bff2f7f1a751d3ff413f18ed1da715523b828bb372e96875ab63ce8c0fef0d6e64d97f58c401b0c8972a72dbfa58de76a5ebf1a62b8473b75d24158da0f774218ee4bf25956b23b62c1ff65f0661016b17b39bf2afe4f89f50d1a6205837f34b3038fbfecdb11a38617ec231ab6b21a82b48552ea5d895b0bda985fff7ad4fdb2328f1cbd02d0f023f25df37ce73427801feb04f7b078d76e7c8e764fdf709e63a02a2bfbb1bd3c30acaa91fe0495f168d0eb77df263e066e0292f2a28d4ba01addb73dbf032adedcc21dff93fa7a60c6ada693ea7fd353c4d4d089983ef3a52c559919615a62650d564e582bea0498bfa67a92a98023886a561bd934e2da2b344b7a6e069e374a3c0cea09220d8af65990d0fb4b8def7bc2871857e3c97eeb8c5df87a513c9bb752f341d9dcd75dec2f948ed8ccd5c5380dad121268d8ec6ad14bad728a98ad1041f046e48701510f0dbe25c8d438c5714bf9662486fce1f54c12c3312faa485e2a922a09f61dc8d055f6b440025f471252cbe69a1388f2fb898d5efea1078f725fa5e89c0d05b9b756d7e62a042c68ca3a332444a05ff1370452ed7e74fcb7dde48b26a4ec54384a7c462de946b3b62797e8017cc48cf38da507e9f74580281e5ebd889b2b5f1347d3d4c233addcb0edb459a51fa3d81dd8ec632a9e6dbcd975440e23b5951dd21200f43c4ee1d274bb1135e1dadaff3ef1146278242a8d176193cc4691ff09e60ac7d9bf6a47e4832347c5a2fe46f2c56ef46265d388c8a60c3ba32be704ac39c17b1159051cba9d55e8966faca64faa743a3d7a2cfed48005e97b7ea090c23a6a18517a4a93bafb9fddb6612e29e2db3fafe05aa0b68d23f01e7e1edbd5ecfd511518f11c14225b106795812e71c8e2f99735ac293d4fe4e6b5cdf64412879a0e9c7b48f59501365516cc9d094cea6a3cbe684d8e00231de5639cc0cbcf411c2a6714819c5872efcb31413bcc4cb113f6eb33db7a87bb950385e5ae8fa3c377c3615b67f43ede5aa934e0e469aef38558b8c4e8ad79f0570e00ae52e916e80de0ac8d94407263d32dd7eb19227e40a5a294116c8206306d007271d2ca139d59d605baef4e07499e4458b8e1333d6c0bc81e915c36cb2b88dc7e83c68d3ddbffa2a428c4619081ad142cda6dd5376ff7e714a90fb6dfd066c586633fc79bcbdf1aef02d1c9a1797bec958cf3cc7026efb18ea937aa2d482af0a9afa3e94fb393d6e211b11e0bbf272e80b0325b66e17eec9520d968679a45896a91819770477509b5aea75696f871eb320b00c91ec3b66cb7f49cfdcc9ba9d6b704f4f7563d419bad6b8f275a55aad5b30689c10b518a20eb742951312eb5665d540c5960bd86863b01fe879c8941191c7f2c944efe71c2a9557b6dfe46fa41c6327610ee0e10f139c17b68288eef75c8d65e36802a1d87e64340443e1a1b20dbafb2f4891cf4020740d93090ca45adddf2a6ee10d2985ebebeed269fb8df0cc2ee05751edfdad6e114e6e00000000000000008becb505000000008c674602f066b95655dd9dcae7369d1f288c41681b0c520b210fdff6f177f373630392763b721949727d5bd2027ed94dc0aaa17815f7d29f7a1026c7e78a3efb91961510297eb0f9dcaf3e950b0a7e922b04d5850b6517955c1c01eeffbfb5bc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d22963d80743013c93d37faa3095f3b464a5233e743b13bbe78c73d9823451b36ccee1a08977f6a95ca594d195923ef14bce0a392a7d181beeb9840910913eb6c5172b50212d98626e427e6545636f6cd2007c22996956db12f7a89366a4137ce6b4d5ae7baa3d5947431e11e12f2beb0f08d07e1b4766a49775e23b7f5fa7f0309004f1948160768f192307f7bcb6cc019d66e5370347f58cba35df98a2558bf021b5224781448a849b6741cf8cd6eb8b15193e2ceba99c29b6533121db4acf9c80b026dbfdcae2a2926efd5160ada69f611eafbc7097dc4ff07776928f60482cdd98646bed183a0a54bafa1ba4df7ef50ba9437dc2c144fe14f2b1aafa4cb22c3c802175ebb053c08b45ee437b32de6ce480486f2484c3fb08cc7ee8e8aca54f7ac850221fbbb8c1b5656c7fe58f00744d95fcabe9792a791a2b335771e4ec8622737350202612300a0af962ad4b40e0ab536ae55c8d80e33175eea6047b0b9868b2a0b1e0219b86142bf35452125eff3bffb4bbcc71b38e4bc6e040614af51bd9f191d6a4b022b083acc02dfd595577d3490d7dd1fccd76411743d3cd5b6b26326a7b1ccd40e275e82bb43e8484f4ef88535f1f1a6a022fa331f11a719f5a3a91d53da49f7dc3f86d47c7e0506d47e2d1f6cca001223229c9067ac7cc3f66d46dae3ed7c0af6606f2a75477e5c29732b9c192e09f6c8c75daaf1e5fb90993b940218a3d13117cb557285894b4615ebb44d3cdab4f0a0274d922dca658a3a9b27760a5e09bfcb162a5238e5666b1135af4d536c4bf9180b5d50e151ace5213a8af9184ff7447c8b2fcfeddca0f60a702f9ecb54983e7be481d92a2d9751a54d20b1795a3a9760df95fac635ccaa19da18370c913af725abdd433ac5a0ce60954e809436c10911f54f538df69004ab79e60f4eb1aadb45f0604c3d409e8dec94ebd018c02e6fddeb301832d2feecf1e5c7dbd3c33b628562dcdbb06a116af33f9f9413d9eefe271187268d744a7b058f86e349e74153aea226eca020a90b9c368c4f9b969beeaba3a028a6484efcea7b985535ffa636fd2ae16cb3f2759e49ef8e02bce586dfe935c5e38f6a1f8b1e5a74b5e6edf95d1a2526432c8cd4997ea3786132295198a32280d397664ba2d1b581c095f4a395532f611bf9e4ebe81e7c58cb1ec854f25f40f82781513f2f8fd27f841375066b1902343b0f044c9d00092630044f2eedef80bdba5b85d9b7d784219a05afcddfaea9bab285e0e73bb369d6501989cd4a6596471dff1504e58aada7f5a119017b71c70a0bd25e0b02247276a1bc5b7cdfe846969125b2946863e6acffa7e7939c0d123e7e6fdc04d518e4a61cdd2135b74007d7d3105ded0ee43d3feb4f0d8faca3e4d1e66a748fd0f504f99a9304bbdc71857706254db6239d39267c2841b5cd2df442b9a0c80386a545866e4c8307dd9b38b9f8e7a0cbedf1102d024daf339d6dadbf9b7ec0b7f41dda600f8559f6284e403df2b9af1cbe17c3c73ea9ab2fc536effa086a393986cc06aaa517e704b229dabac0aac8ba2cb721fa6d4cc7ff8227390900ddb6a9de986a1f36cc918c6f945639600606398a5143158ee03389f9cff60bc3112739b2b8d4662bcc314cd3364486045b2e3be230bf00c72235b32e24942268c553a8df76f345e333b378ad9a4d8f1c2df52d03c1f097cf612028cb8da4cbd2253428f38c950104385cef973b59359e1e8e05ba148a778f5e9dca34a03e24e6e99b11fbaef9a887dceaf4c8123ec9c51b75e517ba824b6f6701020d8bbe2fdfeeb087daa1ec748b8c59d7a44b2ccce14847fcafb760f475eef8b4e494e597ed66039dbebb6a913a8d8bacc59b99839c09b880cbad6880ffd1584276cf7f8e367686f4eb1341c8183deec95e7471ddd6c888ff661bc2f45a9a50b41ded0e1ff931b1b11b312d3755ecd49f5a40ee80519237773cb863085aaf8cc4053d7ecbce47283ee5aa1ca5480e46945bbe11406d9c5bb7d7d026bfc3d397e2d758b0e0fdde8ad5e23065fff2656dc634ca91f1f54a02ff226a841ec469e39eaa22bdf5430b71af3ec060c697cf7ac38f137a57dfa568ffdb2bbf7ec4d87f49296d3ac7d771289ae7c785350d540b6981822dda6d35820cf7ef31f8c48304ad29d2fc33235a29657da4602141822663f37ddd97524ef17f2eaa185260c328f48b4aaf1d92a3f8ae0ef8820a582198d3f86b758c6168cf28619d2ce6c1eaedcb253a8e690c532c9a3d5969eb9a0a400e90f0b2a897eb490a0970de58e528af48467670ba000000000000000097aeca010000000009ba0e5b34b50c81326fbd4710e8f038ffb480307ff48469df0e20084c6b0a228408e0e0ef459f231ca7a0689f2af3f942272e847bd4552d6909a060f382d4d88073b9971a403ba3c152b6b5a1c6d66e943157dcfae8c97afa9873f65bf189a200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b709879789fc57cd5d16921e27850ab1fe90d1cc3621ea5157a29135f09b660dc53767613b9a8eeeeb655d163872ccdfdc504b4a8cb54c2eb4a897d3c22fe98f5a1a65a66d3ec9c416d504254c293b6ffe6cb9bf4df4e2e3e4ca1e4d86c480a7d7bc6ae87be9a3e0f8c5e39158f5003fe50c57a24d1a796abe55da3abfe9f35b0313bc46881ad698201492e8e63cad258f8ecc42c0b2a304c58374214567aa0b67022364cfb7bf82864499fada231c48b79dc8dc6cd453fdad0ab9e270ecf4dcd6c20b0829694196090c39634e0cab2b8dd71c8220adc30dd7c58f47f3df2bde86b9811daed8f473a8b3658ccadd630c05c2baa76afdc1b43d513aa0da84d252609fbd0227ed37e4474fd50e8aab0a2702eff79811892d422d0828ccf1960852836c57ad032bafbc6c895162fc1428dd77b0757c835529e782ec8ac096e03b7034e3e2a0a10329871acaa0ff913e59da2c102f9d1bfd153419f2c45bae2bd8ac2356ccb6426d030201c50ad6bc23e8c9a503b24bf8258414c96e239e053591190e29b6c394a0d20307dbc81d816a9fe71074c07e1de18d5d36032035d782a5e154f349b4dfaa930495708c1ad18e38304bf6e93442daeb669f328ef22fdc62a10575ce7fcc9d6393657b34fe09dd03466871d04b09edf4880e4284a9aa29037e05c573f0e24cb54e7872e5d3dbfd28187696ed373272db2173a24d4cb2d51c673c1504c7397b2138416034252da6b20e4c4f55527762ce6a1c3039fec05d9f5f5639276592682b79165bbbc449c570b3374bda72778b7decdde6df38abae0bdfc8f780e73238e4f3bbba2cba43434498d76b49294f2df1130f6d1d691f16c9b098a764e6164950e15c9673dd6fbab2723a76ad968f9dc4fa80aad785ef9b2fd40a0d099ac4e4e97c62335e5928dfb689b64aa95f560197b923cd9e415785cb493bdc2895a6e146b4b69a1a8713af89f2ff0ab910bf89ffd98ec5e970694c958102adec0ff9b77b478bee8b00f75de598820a88a095639a312b89d09e7173de6f8fa9a7ce2657503d3887e40af00982135bb614d59ca1df0ba17e11833a51efac24f5420f7706a75b7233aeb0303fef683b3eafc2e3f303f432d81933ffbf70c2eb37295da77f3431b8bbc763c5e216963b2b38d91d6c9ce98f8506c7cebd89bbdf59d8efb27d5175290279d4855472ffeff6c0e358759b02d272b9ecadd971a57e2f80d200c1a22f05ce5573319122a2fd8feb2efc81cd7fd4b83ddabcb7afb39f5a5b42fd3c37ffd7dc8bb8ed0cc0322186a151d1ee4abf7d83fe84481e1134399ed1a685bc7ec2c40f49454104137755d0681ea8040f66a0ff9c6e095f0f325cbdf5be5198c725ebbbed17591024f86ab8ba7ef0f4d957eb0ac689a327f657c982d6c7903aa3b0a01f529200ff90cd37b74e2165b761dfc72df7a8afed3ab859ca60d33df33e7e05f00dbe5abc825168f1d73063b427f38c73e8b1e6231948b2bdbce1e5b161c90e30f19fbdadc6e569ff83e3bc1afb229ccad3120db9a2bde5eee106acf6bf731e54abceda64b9c265213c1249bf4e4ade4c98d4063ea76de2c205fb78b198a5515308210e725a2ce6075332f7708203338a720b31774050b8441f00563d28a0517e3036cb99551b2c2897546a93e2ef699944950397bb0f4423f42f406eb729ac52c15a72fab9995bd72fa51890bcc2534cebf4fba733a9167e17c4953d02c224e1b2647ae46bf2476a7889b3c2dfc815cdc9d6370c5cdcfc7c7976441f12a4c7006bf5e95fd4367f8bdcebec7892bd38ed4bd208593c9eac74ba199b62663026708a6f4a5352c8763ffad20c8fa8958650b3b3e307e79ac52a4841b537802a12ba6cada39bcaaf4e9ad455b604e7b4bf4983d28cb3eca663d0f1582c832e220bed7486338b6f876090e493e3a582e4f4ac7f234ec7155584fc99a51455b373adfee6f9e7538d17b3c08f5d1864294735d60556c443098d3167a9c06f585759855250e544aed94736253db0411355d1d5287817ca9a00225256a260f5dc6929813b4dc3a2369d0de6ab2fe19a94cccc11f370b3cb8217373542c8a768bf3f063079f30d018c78c30ec08f7e5f9e1825f4e3a4a2844f2a1c71642881e110e444d531e7bd8fd451c4b81c6ceaac840a0059b523457273215742ddd2a973a4da0704e889bc20f2715be0c621af796893d081b598591a7914eee0eeb6d7da4aaf50aec13beb70bb169b4b877a1564a93aa20dcfd9147e0f86e156848a657738f0a86154e2c64a7a2426a0cc73f726e275a1febd59bb6ea3055af042fbe60f175ff25c6f0064fc07e93f29e49c0a38315af1ce414e5f8f5d5a3e6cf0b697d7b30ea142f4308369547eed9efab2966916fecd263e709151fb7c22dba58a15e8a21f2eeb58fa83642f7bd8a70856bf94e548d51c08", "5365acacac00ac", 2, 1477509242, "d595534b05a9c8ebe6f8e9772c963d8074bf92cd06f2f35fa8231d3128322144"], - ["cfa8ca300135bf0250ed1a5b8b36da7edd8db739ec67a976a663e9addc12e1632a9f5bcb5e000000000865636500006a005172b5f4cb03b231c80500000000065163636a51533b675104000000000752526aac63acac2d04f60300000000045200005200000000010000000000000000a8523e020000000032fe61ab70d1a1a3d77c5b6e7eb5361cdae4f51dd338b32cac98860fe7ebde5f5d84ce09c13c41613297dfd2d35678531e7a8538689908ed5added2c167d62c8aa20cb1a23d6fdc2c98295d5fdc0d9544e19972563ab2cf31f80a75239accc1b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a9d616598df1e0575ba044cc7876504a055114a805e4aad02805c3a1714c653bbddf3b182bb1b053c7948fbe6eba80a593c1f9c8c3bd4bc3c34b2dc2d6b514b2cdcff1e5868b8e9ce020c359a3b2e3bc5e0821d407e9410386fcc3c4c29a8e1ae5f0a9d7df1a970126bf3c46dda034247667e6f5475dc5dffdfa04f371f9c17a032aa859da8d633ed926f32f9b9e4615a81f0d82b76e9f4cb83c5a2dc6158ad69e020365d23ca31c3c10b32611fd39b6115a1f8004ea9e572082722b3edd78c40a160b08e1264f24af7dda1d271efc30adf58e4efd55ee73b5c5a02904e43ff1f34e26a676c3cc2829bd2cc978b200d8364d2df008590762a6572537e5d1e1f76feb36031b3d3e4a2e8d7c72c5452f2e7a51b1d997e9d076a98872950e4f1c5cfbe031710209ec93e066c2bab7f4f9e8dec053bcabfc2721ffebc19777cf69eee3e564e259022801b216c8205cb60fd0f4960f0cd10ba8d47903e72d61d5f5b8ade4b3bb882202197d6fe3f363b73205113ab77d3befda88902e8200c93876cecd1b565631f0ca0314988bcfeab75450ffb77e4307a777e0360c28f9301a6f78932fc15db2751422e6e28a886b5cedd2f6a9f2f053bc9ba547acd3df5389fd13a08864f31ab4d04bd315b7da7774f8ef6ce6d116a9c151df6712deb5ed9b06083a340295ca90e0b979c5232382c44c01b46f0c6083a14065d8badbdac1c5e3494b238c7743104e0db3064d6de5b10315e505b255813b8cdf541d1bdce4816d23aa2cba2f8e871c0dbb8368d10a1bf2f20883de6214d70f8933c5d8ab1ac68358b069c8c6c5646b1c47456c9937ed6a2a6f44e1923ffe2a3043cc53c8f86c0f19b23522fabb646d7292614f948b6212c21359a2be368c51d427cb96ce88f04d5236925d036aafdb8f3f8901d38a5f8cf985206dd093ffe106807d051373eaa99bb0bd81989b87aede62cc7a8bf6dbc6b118eb4fec894d63c9e592e12af4ffc93528203336fbba22919a63c8a43c54b78f3c8a42ba16f397555b362c4ade89ec2202f8c6bec429fcc46605ec5d2e460975048d8fe2d3e8542d9e7360cd2f3f14aba24c9def413554390ff8ef8a3e3f9620d9a469bc6f5e7a81765a9a053cf170059020bfd7646f5201348644abdc2386954e345ef55e0cc3afb57e5ab5cd835b8190cf71453d52b89b9d99c18dd1c6157793d05ee304e46b551dad82ecb660fc77e9ead744da92ca06bf0a5dba74040d922ee16b14a7f61828e3e8f1a6f068509e9eb14919b8d8172d53fcc401d234b732624108fc2c937c76d540606dacaefa984ac486db5638be26a49c6cd6fcb6bd1d39a5ff60ff6ffce7beeca66e26d0ec59575083a5fdc00abc4f082f70669c36b84417d1c1fe90442d60983ab0d9dcba4403e415b500bd7868e6d9fa6618f32a7b8a2c264ef403997ad82814d87e75195d2d225b4f6b00c02c946f033c5619c18023a31c79c8526a8d61f752ec1a4acdefeda3d14d05346f2311dac6acc28623aee1bc124465f02cce952ad3aaf7cabe38be82f1d7f60083ca49c57ad055bce774c6738bab720e9ad2c56144ad6859ba22d89a5050f365f9bad4a94fbcd2ce66ada6364e1e37e607bfc86aa22d76374079b1dcf2065d21105792f03cbc187f03a55068b10d5f58cf3bb82107d19b504bfd79de7e955772b8cde3925ce6e6ec430fdd2f77cd8bc360ed99089a94da03e751d8c55c9d9ac0da30692b8e26de68f28d23e0ed0a5ddaf74019465e927d795bae9c5a9b1cebdcb8394ad25f8bc6b04f1f0c9787f3a9caf131ee6d1f428907b384b43dda5de616682d965325624966c4ca70ee5d9858d8fbf46634885f62c072b7bb4972231896171b0dd6b6c6af17c27cb20432fd1aac07f374cd7c60c46ebe277f310fceea98767405c4c17a947606c044b1aea708f70301442a3919f3eb4cfd00664f9a1d3bfc7fbd81b468abd62eeab2754791dbaa734478f672953384785c91993cdcb0830aa98230139fed7f0ba8d14a79d91ae28095db6fe7253e4186156f5a2685a4d72b68b020ba78ed6b1803793434f6a25e0aea834cc039554c582b5f56986a9266d341e717a73bd42dbfd581176e5313f3ce3de0fa581d3a85aa766e6b489b05ec81bd692ef55894f6cbc27929b4d4fb5bd67d101cc531d4fde64593b26ee339e528082a7740861ffe66ad60499fdba951d0e5c289f7b7f8f73c3f30927313c5638ed994e9efcc0417a028603c75f0adaa3d47baca99f6fd24424fea1d28ad8bf602c0e4284a0ffe28f5621fb15a6171e27ef2db84b041debce4efe7792e87dbdfa97d2b59ac59b0bddebe99f733aa6a015d2352c40ee8bb9df61ccafec7f342426d12b1b939129dca93978fd48ef65dd482fe3238ab51193a90b14002a1f301c807461ceeedc46ff48721bd95e158df513d830203", "6a0065656a005163", 0, -480249151, "4bc3f83e80a3babd80d984054dd62693058e7fd761e54fe390644a8f64b29734"], - ["f5730f2c025dd1f017cde5f0c97335205b544504725489125717465bfaeb447b371d4cec35000000000452ac6551ffffffff0cb8600e23bd05574dafe8d17a61779506f9849b37fad429c9c3150959a706b403000000026353ffffffff047466b10100000000086552536363526a510e600c050000000000676a940000000000016aabe6ec050000000005516a6a52007a3bc61d0300000000000000009edf190200000000634962fb0aa3486c95c9ed2ef13cbf07ba796dc581b628f78e524ffef07070cfbed489c9382c4e802a98083a5daf063a13fede0373397e97c035e7b8074001f5052d9f42fdb873bad7b1668bb1ec1e274f83290cec29cd76197382cd2e1030cf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052809f86d3830f4dc7f395c371fa8fc7312c98820ed50dff05e0e63fdd782c90432ecf9721d06486848c13ab69f9a8d600ba4357153ff6b966f13b5970d77887a25684a481bca0309c68b3a50bd4e93673ebb3cc6d0c0029b28cdb8b7857f1ca7012cb90d9fe1810de1ae594bc5b2587cbdf017ec3614b55594a8051b7f2bcb702036b52a9f1a8a10637d4f3205fb95c091792b9d4ee6009ab13a46d429bd65c3803130988ada4c927fa19c5b6339525deab085bd1c7d80a79dcf6f965d053eb0b250b07d23416b2f4fd80251d5a21ecf7f44101a51ae9e130a2a4bb9eee2540049e102da745fa1b8ca243dbb4c1f18789489aa694714dc6999f04c71de694f51e88e502294e68b708823bbde33705800706565c3ee1b83ccd4f25e3c550f3af542a7e85022086cbbb295cdb8ab8469f93928ced29e60e688fcf5aa2fa01063bc87a0e5fd00307e4bd2d9b66cb56073d0bb67b75f81d85e1cae1c44081831d8bfd7ddddd9586031ee7aaa19725d6f2cf4c84fc3fe8a5e4c6cf343e9abde5a5c4298d2e0c8d8683032f92aeed6af742aeffb6ee5335675f9faa4289c98a9ec9ab1cddadbe1a41b3ccc02be55a3b746576d44c410600cf5c8e298ece0f59639c1becbb2afca2bfe06572c63796ff48120bc4298687aafbd8c7563839141477840721a170e62fb3fd2e831b3df8ff9ce1ee8f5c9e476c91f2c5bbceee12d3b52ea6d33a69ed15c55c2c5aed09384d1c58668c0af3f503b7bf895ebfceda21e95e666df10eb0c3f6a9d52c18f7f425148dbaa2afb27d0c3b0960555fcffdbc3515a99f4ff2421cd007cb73e6d58fa28a92f81a8cddeca546d62574fd76682ee5aab0a591b44970f013c710aff3fd5c98377c6522918508b10ad81b58783aa107f8b66a547c90e21366e6a57187b06213d744ca809ded87fb6465985772bb08e86956947e9b6e3259227bafd9a5b3520f0cfdc86e51890e663ce572fd1e99e7caa6ba35d5cc21b5499744f7a184af67d67a395649e47016f4119c6b4186f58b5b72be07eb095a824ce65571b03e908190d21482320cbd3397641146ce6dc3e594772ce7452535fed9704ea0e7da3c2b3e0c8c854a6b020a9cf91d8f0146e876fa0a69ca71f29d8851dec5edf93ef10d8977964fe2dbe128d5fc8678952b545ae97948917440e735909456f283553fc0f80684516e4a3a8d82ee1ce913ae01049afca02bd08f1a38c9b883b2882ae0fbf04a400bd07ff1efda21c43e95331a97b96c9518ffe04a50cdd4fd2ee7d6fec354c0af40e49e6b7701cc2f4382f6aaee2d4f4d1d17258484644621af3876c13cb0d4abc1b408f7e3da6cf67050d9ad8f998ec9ccbc3cafc1d97fd3a2fd69c5e5e6a218488194f10de065237e57c8639133d70919f98f7989f21aff5031901a29059b0544f3701423c4f9ab90ad5a2d9cc99f79b80dc763214658344b6eaa24db5888cfacff1d680c57cd5f6dc01ff2dad000f2730ab32e3475a29f113d2cb2ed5926abbb5cc05ab82c52e96bafd3cfa78c9806ebb8ecae3ac8d9ad2d377df5cd6a377950e7dbaba95b86f7983835499e27dca5b1c5e1a36fe3e8ef284ac63319cc7a5fb7450cf68b71a56e89e3702c8e9810f73df963cda9dcba883386fb31240ba38f3123d9eff735148991b0859f2478316aa41d5272dd69b9df57c2a3dad72917f581fd0a4bc1297817087095989f724b4f9156561cb6972ee61e961b84ca07103754e405f489ae76c3fa268174ee5f6bd42a9956bb7568d25da832fc7cbddb3c09c80c954c52581334b84490f661a7ede3eba3a7affd4f6c0689dbb1e4ab0c3fa1046f6f7dc7ac7a8b34c2d16e3c22f298cb0316e5823fc4381ca4b4e1549c0a484b70611e65e84e96bc8ffcfcfd9e12033dac5077d584f3b1999563132dbe4573e35aeb651b8a56dabd58a173629ca920940d4599ecf5dfc73446bcdc27e13b895226c52cb6e9e0560f14be546c847b8c01320bb2ab807a51aaebfdc78370399216c9b69469ee9741307cde0ea7dceb06be17d2f95544f86981766ef843c6164f940d65d71be632a9ffe4c3c62cd18fa1b467dd6651bbb65b30248927088e9ec16bd6abab7b8f76698c37ea364392743a17880832162759f9aaf7660fc9b4116a304a4f3ffb6a182063f9edcfdc463e331c37c4a347e1db33dee7bd8b99ffd5e54447c3acfc4b1bae37cae96c9240a29e6175985bf16dbb6e4b1ef9444c3ed8c416380a0f074ad87fcce97fec804a71ccac9f97007b1306ff33966df3e01174433e7dd15516dc06780259000000000000000052b32f0500000000e237f1345cdbd0a7529aa9d9c9a4d3123e0538edc89caeb75626ed83bcbb7892b09fe852f2bac18c0fd61e4400b7fe3342b528056f8448bbdc63d2c5982e3434c27156191ba5e82cac319ec3e1e2f0c9a03e66e4cac244a1f114e9295592ca5700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f94ee2a9eedc4561d8fa1cfbb6a713787e5eaf3c4cfd563bb5ec52c3ed056ed0e39d8df2bb2a6180962685586514c2775998f1ef7ed76a067550fe8330ec6d634f35e9e35a87336ca8fb2be00b3195398d67a2af1f5a679dd99de9a379b0c6ea99e1a4e8f797b8a558b6fa80ed782c1a00ab8e56ca68eab4e52ec74526362f9702052d9d30d5ee97cc2c120c52fd7a48c389953aea80a766fde7637c1866978da20215811058b10c01047f85d0c052662ea1791447bf29b4978b817c1514c36631070b02c0d061f2fcf80f3f1d36b951134ed44d7781fe9c3e05e9e980fffddd547cb63ffde5057a6a08f638090d351ad09b1b1e1319cb985228cc23563384ace4019e021e3db325ea3fb3a31f26d645636d61f603c69f1e295fad2087f859f788a68fae03255135858c5725941aab5e42c8a2d1395990a0b933dfed1007ad21afc2d5234b030f487f339334e3a09fa0aec4a13adfd6dd7a8981abf1820b212515cfb4f33406021a6947aab212fbf157ead22cbe77b5f5b8fab8a619059076164dcdb142b19639030597a082f6cd352ce88c6dd82e641a805005b5c00b9e79f6b6a837c13c96d34cc4905b90bdb627f5773780c81cbadb15887c02502dbedfd31d475e7c7e5cad2c7ba7220de77a08be3553a08149060fc02302cfc7b3f9dfaaf484f9090f71e7b90d6688d686e992ef94e01944194e9ad6ac01e65bc260e9c6264e1ead472887b23c49694f66c6e4c49d4aebde7d80a19f6b0f5e6175b19a3eaaf0b9659bd5ce6c65f4cea0b541b63c83387892697df74f7e7cb969ea3bceff0fbec22389a56760550a0f7fa251290071521508eb18bd9b853f2fa19bd508a87d2ed41df45f9eea87682425020dc7280c56924ff175f9dd6c3bdcecf56b88c8d5872a3950b65c83ce0c009b4d9ac89f9763b6681ca9c53cb0a24a706a961bd4929525fe88841913cf2f1c48cb33b17a95eddf4fbb7819e8084e8a92b35d4f085d048b09b238d5cd502d534aac30b12e2a7d6e8a980f9fcc8e507c513b219ddf484f989036fd08bc58794448ef12754250d83d6f07ad967fffaabd4377685f6fb3c8ead4ab977867944cd1fadae90d40d37881e1d9cad7b88adbf949ab3801d4f1d9b730905408f379f08cd8d40b1b446c4c4d8ee77949ae92ba9628ebf58e267c712efb4d76434f3916433bbf0c7e8552ad9017da0486e4b1dced673979c61ab7c0b79d78c343d643872746a5e21e19b18647eb1d8ac12248f4e84a75d86d9cb605cc52b8253d16d4ad3b2b63d2d8d46e40a919e1d3bb7d368a1ee3d95700d3369212edb2bdfe545644f8a8c5bbc733da2e9b070505ecf16df2f6d500ea2f379ef77833da6af5a5eaa1ebc30926cb1945eb816ec0d27ea5059259545006480a7103dff9b3df14b9a4c665872588a387dfc8fd926d008c65af4e5fd03836e8d7736c0e8724de81e3914b6777fbfd0349bd7faf4a68719360afcb7d9413b6d6839ffd6ef708cf92617cb7a90c21f5efe54703c6e4e7db29f158777752d235125784d03b0f0f99cae64c414167015b0aa23a897d61c663cbcd285d8ebecc0b42b07f0dc48d3df0e89fa74893bc04d149ff4166bb976f14bba9f7e97e4a7305091a587b6313c68f300c81ae7387bb56126942ba86764d70f51e0bdd346e2693be56603d858836247b5bd851d61a30702e9d7e8c68da567cf0268280b7a659ee4d50fdd071770fbb1fc8d45615c631675b2856cbd4ccf7dc6534ec561cb18658cb680734e1f62134b4c160e248bc2feb30133940d445bbc6050e7cca9efde8240e85a3dc014381975d2f082bf8da8f4ad601e821ee0f84cc7140600c5e690a1c8898bc9487195215f5cc20457ebb0a93b303447168a1aa90604cc2731303ccebfecb5878769cbbdcc35d41725815666d33309809bc2b838f06e4e309a95ef277e3b9eca1eaa30e881d6aaf6b79614d5db6f3900ebba7516edc0da394e021d65f84547c4af0fce9118df2557d95b5e31a27a2813e3c24f5a776ed5d08eb031d3b6428e98bf326ef76b0085ac424f46f3b03df270a84ca34b88959fd65fbe6f5db24f52c27c5cbd7b5403d93fb86b7322ba9fafcd3cc188d6abd7ba85d6d95baa1a34a77d24bf5168793582061720e7be92e1c9d0be1bac7ca83b36dc2c4bef9c496181aae99e80b214041ada904b3ad166c5f43f06e653b1db97b11adf9bd1a9fef7dd0f708cf1685b5aaff12e0d63d30eee1adeaed5a9ec4a49a20a8b43a7db2d12ccb0331532db8e640977e60a7e3bba94f82a6f3fcc392b42d37010000000000000000a729190400000000cb8db852f04122a022f6c3ce4661024e2038540e4af6f8c699e8b04e2b1db809a9aac7f0dd8c527ba94f90ec02d34194053b3cd794dd43ab335af36a39cc833af379b44a07d8845149d8609d1830636ece980cf0b4712b4035909c40180f51200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091bf038eab11605b8120fbdc2ac24399961c8ed2bde06e8ea05d2dd0bf94cc835e79b684b74e4e0865a779a8661da7815c2f7f043a734a45ab312e6798a8de91f5542321c15e55ab20a76928371300e77a00924f64aa2997b7ed24c9a3a7aa1238bd9da193ea0d8afef2e4e81c70448006daa2e67d772e9f21d5e5c29be066130201f5693f98640de01f7aec89ec0ad9bc3d481d2ea02f2635d0eb4840e15ea18803062aeeefd82bc7477a16d4bd95ca3ce63d3ca4125bb07d10cda844ee17c57bec0a07d3146144435df55cebce9fd78394cb749020c439f325296872047d673a45f2af54d35d6eeda28295cedfb8d0146fed96444e8370afb5aa47130b89ae27608a0212bd072b860c349d547d6c2874ff0aedc443481de3cb3985829dac6762af419d0216bd51ac36e353dec3d6b30093337fcc2ab140ab181a812401a51126018ded86021941126ee4129bd497ae0cafbd9c6930cd5d7c9191bfc83bfc9f77b0be9a7a7d02265a4c1e473309d1cd72ea242586c670eaf8d00e1709981a82374de1f8f93f9b0325baba05c3183f9e786d5f589c2ef3a4fd1598e896bf1ff25014a2e55e7da30520eb7d301ab77adc871ef5b552c789dd86c6edb25a2392e0d71f3a9a7b267ffdf093a5342d7ff2d4cce0b9f79e308fd1c86f825783f8deae69e52ea821269bf730e459aed47a09875928a58b1272a9528990584b0a899ec52769966df1410b896b32d6581a44edf082bd0d10094d2a803ae86b3fb60f8dc414cf28463d3debafced91d37bf599bd76a6d555df8397a5762080e3f66f36f2e568a8e52d84d968f354eb877135639cb72bab1c772140bcca48aebf125b12ec9d2622e9f34433e4aa3d332ea7e5b2a59f23c20655193dc451c2f5266ec95e6d3bc27daf2911130dae6af7a479e4a181a9cec0d2cd11a9ac1c0544ac34072ac82bd648f800ffab37e146ff9432f08991d5c6cab98842786ea9b79da13a2260159a4b3b6af1f75738bdfb08400461e5350f689c4c6680bc4b0b8494c8178cfa3f62975ff38a59fc84017d8f012cdabad77f03d7f90338602d6535def68c706853e5101ee3f252e2c4f91fe89fec0aa52d00b54402ec948f6b5b5cada11abaa4ddb84e804e8ec8ed6de4f742934d93547baaa5cd0e2f7678ae1bb65bd31276bce3da1acf74a44236d217039e64c3a0397669759e0709650215e96307fdf0630e7602947c912c1451e2c3c9c57388238daa7b044445e1109caaeed8b120319e1881d3f2d0b6fc5d70889d2c8879b78425e57c54281259e36bc3028d11484ba387fd58bd8ea90268e43c9a7aceca4f532962108bcb8f1337556fb8d27def23d1d4328cb8b526c17a9a2613db4939ab6437760b12897a13353ab20e5c199ecd940352a7d74c6570e9a001e501ceb5ad4d75d804bccde13bf110ddf45dd9192560d58a97083f9d47bc6113d260e0ca5cf5d913ee12d76eb7130d8b91f20359e89f97f2dbe7aca39d6e1135c362f08e01fa351740ffa3adaca9f1a33d878535759a7746e9d2dfb86c7571ceb51de278e5f6d09ad473010579ed7aef0272ca325ed53166e7500a20200e410698e06cdf1f42a14c45582aec6925763ab13c8c3531ebb57a4cb0d12379526eb110dba40589c376c632a0127eb89bc71575ffe6a853ddfce57c24dd772e35cb2eec2b48be1c0d5f71cca32d98089771406142bb98850726a207f62dbc8aa04cf2da1e4a6e60f305c9d1e10e534bb52750842db9e4c06ca21334c8833e5c8658d3b4f18b08ab6ceb71ec8e9b0bbd899f207077f65418de74a9e7e81f0ea2898dae6a77b47527fe3035efcd9fa66a70894b662ed358aba6b7cd621366a73565f737bbcf86f729102f2d26990dd48111390f45c93ab8a5a0c84f88dd6b59da88cc9fd52b49c36fa1ab1b40be9dd31956fdbf5baa7434555d669edb9b8154278a3c970ad4833f5618ce6ac018880f163f4379adcf665cbd6140f79bd13e1cd17f1b1fbd165a89fb5789a91a9d14a6f6ed71a7310a034103446d3d53a14a6ca42564c751532d62f233bd25fd010f420a11b2dd87d0735bf8d9af31c970a8068de792a09cad93b81bb74d8884f5df9de960a760e3151cd981b061e1e29ff5018de35268917a759d2c93eb81c3a89362ffe06047b12e94065aa2a8ced1d7c56ce20ecf85616d26b891bc52d2a01c47524dbc6d2de24ce54566b63f40392fdd8e370990c0a981bbc5dea86d07b0fdc1267e21156f6f73c37e3f962d240c33acd4868d6424152c160d8d9a48c506f2f6c218a8d4e08bdb050c48dbdac23d3e47b0c9286051011f2d80a56811f24e85c57a704fd6b6087d53cec6017be0b37c66bf3d722994b4fea62114709e6e05d5aeb68373d5f7ad78dfcdb55b6d561440a0b1614a5902d72fbc81d1a33995a283590843a5cf8638b01", "6500ac5265", 1, 1946987001, "cd36ad611c9e60ad6b9350c6c8612bbec06addabc3319f06a7b0f22acd380d04"], - ["030000807082c40302aed2c79e1ca6e1b56509f37d401e5ae95533847fef13bd1028730b7ddfd7df550000000005acac530065ffffffff80813b205e396c20eb88e81a572726d290cd54a8aff004c62ff112edcf6cdc820200000000f7797d4603c92a3a0200000000066a005200ac51059c6e040000000007ac6a526351ac51f0e6ea0200000000036a00ac68741dd17965f2d7010000000000000000b7a02b0400000000b12d6187d0fcdc73d4326f8716c025e622c30ae954dd23da7fe32a86c32b26b96699a48bc4a1474976111914e43fff5d8b1eed137faf8561b1a5bc8bb738067ff825de124009da7fa78318c8019ad17e014aecf8868252ee5994bd4303bccd1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a10fce7a2c11cc8301dc09a24d564bb9e8f0aa116c7877c1502f33a151e9cc25085072c09a73f8b9f9b3ce89078e79d9e91f4a9217ba5a8b5454199d3c342b1eb4ad811e4159e8a48c18ef1e2cd5834f1832602dd9e7f94660b6d06815258a7b6c20b3e3a7891b4e9c7f1aa17ea646a39ea0d8d6ee1f04e88b403f7d7a2e81d9022e45f631f9567146ee9159693f82fc5a615e71c4ec761521c83ede05db87ab59031e3293c4cb14b5e152bd66e7c83d12def9178ff3d220f8a598e6051d4e49fe2d0a048680cc78919c12f5d76ec1e9cdfad12a637bab0ce65c2db50f9c8f4573999784e4c2699a6d4b9bad7d8612b55bb279bcc654a6cc32915590391ccc939256bd0310e3d2c353fc85206648453d2ee1b0baee0e3a3912fe0c630340ab6597a82ac8032017aa0bc401bc108441d69297af41006ee9d008f2030227d1711ff34ed3c5e20329cf3057d8e01e4dc13c3b75f5e121729759607197d0ee3c3b54a93433f84b23030edd04a57b48797722c688282a904618a17f1907da567f3ed00854da0321533c02166004a592f4c009f8e86d92415ebc32f89a6ec3527961830c5a3bef57e75edbb0de09096011b5fcde2d31c00ebff7ae414ba4f4f2b8fdb1e383eba7980fcf96095a3ccfe274c49570d8139930ba8e8480bab4b2baf79a1fa57563dadce0bca615916cc454ecf14e0524f5aff95cc632f4ff517f18539f6e18b5b265d64ae5ad98088f93075e42268153530788ee08229886dd887ba0efe21f749ffb83bcb9166afdfe68d7f1085cf2f003749ad1ca3966f467cd67dae6b051bd3561abed380ec5051a49d1f1f2e21decc3c5d99b5bb66d95b38fa2c3e366e769442c3ce3270147993a8d071b7dcbbdcadb725ad04fc2907af6c4ea721ae3ab603277fb8d6486615839f0b393d9e20f350bb9e0ac2e18a9159711324503d8a5911be9dbb4ef0f580162756279e16e895da253b09b60b9d1b692f09bfa51204b7bdbbd14e940c06af19ce63705fe0ed804d16536da89080344e319e7edd4e546829aa110355e29bb31d19a5df680a7f1f568859dc141b19eacbb8a6b7e57784c0b7c730196ec74fc96c19c3308e2fe353ae4cb2dcfb7880d01ea1b67f9103711f459cecf6d1f5e882534db76858ed9cb9b140861b79c2911df26f50a67f32fb6c844c7af96d165065bc89e33781ead6e2b9dc22bfd0635506937d52f7ea0d91417a751d851841fd3f7f2338fe5df25119e4c8e606c8b7c0dc219890599a065fcce97b6736e8921cb82611dd0ceb6fb378e42cec0d9bc445214d61cc17a43cb8f8c637788effbd3e385d363226f8ba090dc7e53ce8cfe78b8c15150545e55f858d0abcddc3d5e1e8755ac061e1639f453897ce451df50538da511d9aeb0a30a0002d848fae49084072e7bd63ac494a3ec841c907ca0a48adb3bfbce1d9fc27a0568d6bb00ca289a408cbc0d1686a582839c1d2043198d047d20c32ce78e8e02bca40fcdbfe19c509bdbab34435a076f1a92460341c131528488866700f2a6ce258d072bc97028bd5eca64857d00b4f88f44e1aa00e8363280484609e96bce79d65c109c137e56aeffcf5048595cc62435783331134035d8b2b61dde496c1ca1e66f5c15f6496e668c06d4586895a0d6e0696ce55435cc397df6effa2d3d301497587f43bdf39348acb6cef3636b561c4a61ae094bd1adc5205b98dba61413bcb70cc309f2e34eede1cc59ea9277fb5771e1297ccde6fa71800378e01d0fc0a64b38578694d7f2675b464ed1012fbf8c1e3b204cffeb246c9c0bc064503da8eedfe6214d3a6b7c8aee745842016ca2b76d48f8d77c7985ff678110e529b38938c36eb0a8355f13b7f73dff4574a86fd14700b2b21bfd190abdb8a785c0bc9157cd9e6affefad51a582fc115abe851dc4250d08ce82788ab53dd2d8e3edfd9823cde9cf932b81b790b2823f7782750982ef02c2c97ab6ae6b43f9f5363e6c25237646866b4cd82f4697bfd8025948bb7bfd9cab495f9e5a03e91d35fbbd8cbad7cafaa4c3cc0624495d635c634289a6fa25a2bc1bf7e4f7ab01030c5c916ce7ebedde8f3f14353b8ffae57ce034104958d76269e62bb5db3e8d72169ede9a8a0db7e5dc7d555777754ec8131e8faa4fa4d76310363b39be265d193107fd6797062af88fe0670d981678738b4bb361ef2153d1c360f760ecdef651093e86ae476d4a89f9b0f46dc4d44dd75e0da1d7a0d356b70de1dc51d70fb418321fe000c48bf7bd7700313e21e6add37e5cbf5ea86f9d2d7696a6b8a21a3a701d9d04a52297dfba7adac253bda1108ecd669c3713b988684fdc1c0f7d7a2b4e262b96bde3680211f12b046d6be376f61e2cd47f2d202d51766697acb955010c658bc1e2e69a45404e45c0818d7c22e2a60bbde73fa1863ebffdd5e887b47d0f", "52536a536a00", 0, -310549157, "3de66f01f791f2ffc306752bc500870776f51ffe644e3d6fa6a588659df7a978"], - ["030000807082c40303121df82a050bde546bb7179c1553c049c7ed4b96b7354725b3056c32875055330300000003516a52ffffffff30235d5436d6a12acf94dba4be4fa38cafd10b94a3f7d25edb5689a917b0da4a0100000002ac53ffffffff43a243d0aec8519b9adb20ff3a276e1c206b3d486f90c59dd4190052e7c5fb9f02000000025300f391348d047a8d99040000000004ac6aac51777a9804000000000400636a6aaa94c90400000000096a52635263636a656a9c926105000000000451ac6552000000000000000000", "51635165656563", 1, -1482703493, "611377bd9a1fefe5432289e56ed88bbc80fb6983c4a7a4c96bbba3a29111c613"], - ["030000807082c403019a9b787b904d4cf022786dcb89d5a646b74f604ef27d1b27d7aca75f06bf686a000000000663ac516351526938a9f104cccce505000000000653006aac650065662d02000000000753635252636a6a93fab602000000000852ac6300636a526a5a257f05000000000863ac516500656563000000000000000000", "", 0, -914045802, "a0e360335bacee6df666130acc3a8feb5415f45e867ed9621dd4e86b73e31a4b"], - ["2fd23c4303e3344fe7906f7812ffeaa116be0fddb0a76b3160d5bf7e5cce6e4713852d25b5020000000163c8c4d8cf3f7ce3316b19be96c2b81ec3e13cea578bdc4642b709866004d7f397a7b90e0e010000000651ac526a5200862cf856dbc35bc879cf7f396c4c976ccff883d7c4ab05362762eb5da533e7e669e44b04030000000653ac6a636a524f111405049adde30000000000036551517fe06902000000000263ac0f40c000000000000900006aac655251520007f1fb020000000001650000000002000000000000000051b6520200000000f3aca8a38b2a40213d675ecf9a4684c8a8e5e2b19fe7f252e8bac28e79e326a6a82aa4561c6a31bfb608f7c1361ff67846c9c3802a29f759f3e67c8f02dd6bc0c1df93e8430ac351d51a683272524919390041b2301fb961a7bc1eb5297abe4600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000db573b0ddc3c71b6c1eddb9c2781223641296903fe34f497e996208a9d76432c6ac45ea2d7454be5269ed5fafd2fff408f32cfd39bea61685c8724a2e5aa316b9acc42e635106be07d330d74a9aef4e2dd7f4b96ef4266da0cd19ec41fddfaace7aa96624cd3bd955c7df72858f9f7541e951b7c6f83d68830d30cc1ff52b2c60310957ff25c0c073dc84d4230d7c1dd81e3af47b9eb17448a6b9c934c63d124fc030d64ae6c8abaecc266d2cba4a8c3b34975b5cd4535b5bf0bbc7faea84d137d220b05037b121e9e7d8d4ec32d49faaa3897958ee0b4101fec583c8b7e36a59fb8209953a405db72d7a134d97dba725925fdbd0ec0a797a32b4b6fe3bad143c6148a02157bf63b8720be5c51c48caf235c68c486d95b44dde99e0745a373129eef8d760328cbf4b61dc537f8dbadff878230120de47f9ce42cf8e33a1fc52341f781a56b031f170e81df1baa2f07bbda3681b50ab5ead18893027f8cc0b85976abe1d2eb39021cd4fdb99b9b1a902902c963ad6ffb4e99510c5fa84a5e84888b9a711dd2fc74020b0cc0d7b58cf33f0399bd5f66b378192b1f206ebde188bdec562652325db83e7f48150ddb2f05df1c40a2ea280017e053b87b1add887ac54484c4794ba9fe4254889e6d68c0baf5cb71d7b0ee163bc7d7969ec7706b61c79aefb4d3acda31d50c2c871ade62e868fb2feab86802869910f9acd33f5fdb192c29015a3cb2ff1fda01f735ec9cc04e32e1611f1fa99f078e1018f3a21cd1930de4de6d836642913e1f9b988800bdb8fb357563258bbc59effa1b1bf84c134e843230f31628436dd9f5999c01f2cf036c2a1a960f6a7d78e8d764acef9afde8e3f4abd6ff2f6dd2d230d09b9a9a41aaa5bfe257fe4b745c3bbe1d2f9d592b99b1ef83e49a22f16627bb4728fe0edb0b7de9b9a9748567756cb5b432a43b7f3a2b80c89fbb33ffc534d21ddea474c1e9df85a86159e02e3fb2467440ed63f5fa1afbbfa1879ef9dddb6018825e89df41034c7730035292e553026fbe92a46fc2db59845864374ccfdc7c0e5693a1812519c8945faa75b070062647c29d46e8d3b512358d4147ef8890c149ed6be56bb5164abcdb26da0c2134d0d692164c9e42949a1c34973ced79c28faf8eed51f733a509b6b583cb63cd32b7a1c456af0c4e634d2bf87997a72b9d01e6bc976046d0b337e2d3aa773fd7b8de6389420a0850be9029139724fccec02c1bbbc4bd2468ff678b7aa5c21de79df8669bb40a8ad1cb69ac8fb988cc02c0d7864d5cd7574081626e45aa22681e83fc56c707a7df5aa306789f7de6aeceae9662a2ffb970396418cd7aa5a92236f24597883c3d524243743775082302541d36196deb04dbb3c41284a5c040ad9dd687e146cea78fddc8ed9f9b3d8c4551e2b723670badba6e54cb5497bd58a98abd9a9310310a20d1351216a66e48261461d377b50c4d05f7c3ceaefd78965d8b81edd8d7fc7b631a4ccbde394f8e98979bc921238ac6d9ae60af177c2de676ae18b9c5377ee4d6a956b003b1d428d7c1e1b61f6e9c41707d6b20bb58a0d32b5c381ca35b834c993cad6426e527f3c892ad6eff11cbbda355052e8afdbc356f8fbe16fc0555a797bd366a604430b942b3d1efd69d08ed232a264306076079877ee484a478d60418a1ad0bb786714228c013876c438638942237277683a47e7d8962b67fe7c570c55e291ccf21660969f3ca2029343c9a85e048cef097d9b6d1a1c7b9f7500f7f7178956dcc83bd14cbe5a07af2fd7fbb787a79de036fd8526c6117eee01668af1425f89b5701110fc58fe9da60ff7d85f8dab395b2f90826c76ddf70942468d815107a3558b92755e298aef2aad185d700436071871708f9e544bdaa5ddcf37b4de799b7671b5a9c037b1ae59e2f297f82c52f0c5424e0506c9d0e8432108883acea1eca36aebb6e179fa778eb47052dffdf9fd506a59b3bc286bbe878b575fdee5b5f70e7d7d791039ff6c81ec3321c99984f27b89831fb6cae1a0d9d8b9695769ad2dafd3cb82cf3a1b18e67835adecadc243e50870d95816d45fa7132557d5ee26ad881530b45d4cb90faed767d5a053e9752cfcaf11c3a68349c9a35b653d575d01b592867e715d5aa6adae1c518ca3f30d2209637514d40a5228552a28328c8b4e337bd481ac8d946351a6f289347d661b60d22096b11fde96b581fc3e970d3a7fb55ba8c1500b4eb72211994d8cd23854a29807c42d3222b36df0abb0e929d6537a8b80648a7395073f2f883a4ce145d4dc777d14850af0a43000000000000000047c9620300000000ba0c7d227e28add362f6f8de8b3e42f3a54890746f5d05ca74a933df767af2726df0e74cc871c964079be237c21d8ff1c9c5edd953198a4cdfe15edaa13b2c5c9bd9b87e74e54ffe4b877bf8b31289ae0eb4421eb8a02e6764f83e9ea2b1f80500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e9f8f9c7058aab9cba364e6a8030bca1bf9d6d16d2dbc3466d196216ad31ddcb2bbaafed703dcc2e0903508490e46525117fc4059ccabb29d43e645e447cb7c6c151bdee4fc80dff5352ab4d903f13fbe7f73de2d0a645e1da42328054a6be290f2404ede96f44c7c5d28d3febcfada89a0b760fbd647b8fa0476d2fdbdbac6b020c610b5c68d4f5063d62df9c6941edb6142419a3a72f2d22c536849a92bb37c2030b52dd490266a623a3cbb8f0e32595122a84c5651a1be5a226dd1e148980b7100a003735b99d213024377f048feb67657e30aa5a7a890cc57b8ea47dc1d5234e885be9592696ee221f87d7d118f885b86b81da36615b9ac5f6db1e80026210ad3d0307a54ed7a6862023e615eda228acc9cbd9bf3eb4519c3559816f390e2b6df631021530f1875b9799a77ac1cca9320572431c340b86302af7c0f4e7285105605ca70308eef4055155b720bedc70bf59dad2999683654fd6c1c246cbb4e6301eb3315f0202771a11eb6d0445634e693aced22c0a9b8ee10760a66dceeabd2dd6ebb39945032ef2bb08ca7db2775a8905c62d0a9c7b8205e07846ce102dd2ac2336ab9cbf796f9c715d70ad24dfadfa3840ee0a571f4de250ca3b2062551ece1a4476f4d177a78bfe1164892b7ab2b231bf75ad631c6ca1aed0c7175880735c01b20f9985c043e498cd25876783dc7c9a0075af288b03636887ce5285984794f716cfccc5639162e62c038a68956b9543a6c7874c069da81ffe8b36192c690d81fc7b47e05a1ce6b4678af55cdae08680baab33d4e0abdaec908634219d9de23e8a59a3731bfccc81dde14edb49199a1722c452ce16467a019b75b445cb14322782a4b054128cff0ee1c9657b3fb0cb1877c3121181eae0a48b881a5ff909f58105d2597a89385b046405fdaba05ea0efeefd7d463508726d42556f7fe45e3abf111dee3c30e9ec3cb5a2e7836113d0d1446d68f23ee77c3473357cc79c7316fe65e0eef8a8593625c29b6f42444cf49cac6f5c9770f6828b9d4dd8497c0a98ba465b60711982359dcbe505cf0780a339a00d04f1936523318e82011533778b396095390428ecc54d557d8c3fab559df4d7d49b21e3e8bc9f521385a401ca73c06f6a0d69d0c5579e0867a55b89731ef9dbf157246db93bf714189e7651f54f7f40a83328546fd50b9122a20431e50d7c59b2508c6d3958d56ab4a4ee10d075d60e2ae488c2f2c72ea5560566cf6a53411c85ce1d79020e6cec772fe687929d5232134f8a1e95296de2f27011725e1ab2b3754a03c9eb708607f730d78f09f3386ccab9c4b93b60253694cdab5da94f10d246e92c098ea4255bdee09e00d1ea72b38f6649018b8aaa6e27e7122f77b2a6141456cdd1a107792bdd4cbbf76cb9fa8174663f311334f9c16da4cba83e9698190cabdf081d6e6a514cc6b5ee5493502adec05a10a7fea001cafc1bb9a585f593d683a853d58319f84164a1d3169a471bf21c96ece2fa4f25aec651fd46a96675a1c54c845c624aafa294c0e4f8f15118a47ce03b82c7046c1b07c942f028b819e0f8c410f72b57c7a9f37947191539b4aff8fd0c82f2d73e4416419a66943295cff633cfdd82351fe0488c9d6665841d39f17a5e6a5cdbda334389f71ef470361b86dfac15ef8797fcafbb41eb64b6896e941475a0afc100ab289d496df60f2d7d424babc5c165a0fc0dd0d46bfd50ccba3dec18ae8d6b2f5aea420cc8f24d65b85de421726dc39d1657e9aba94fd9fb3def052cabba3a6971b4e5194e777734d6973085127cc879ccc4986d7fd919d703f5213cdf584b5cee02095de57269740268c286eaed7f025160743f75207b88a317c7e0c6a6c9c2a68e74e2a5262a523549041c3bbe934c8ce47c138f42b6ab3313f0b5ecccf5dbb6d4a25f9662d8b518f7324092957f5cdd7485f6dd9f2548f3181754d07acee575c9315f3c9a5c419c7e93e251e6d1ec6e20294fb2f2e67dcef8e0bf3f46ecc0deb24c86355f2899b24cb984ea9e806964f558c55401741bdb68d1c385e9876d3b6a376d236be6ef912a232186d65816e6b8f206c5bc74266a5d2218e72e81eae970d87970d781e0c07503bf902a066fd76415e67eac1b23be2de9d333e13b53d6573c73a1782cc9f6833766ee3e8cb3482fed95de825f23ad93cd5f7c0e18e09dc73963d00b717dcc11e55b94b25c0897f49a26e3bcc01f44317012e622bf113bdcd88767da4fbe4b3dec78915bc7b6c00dca070abd0f9f4f59378d2e0cc9f72142fdf689ae576dfbbec025d00f70bac7506cf8687fca61462890fa812fd0a9bc6da4539b687c750eb665351c35260000d9d58f060a473ac7a79a09912cae974427f1696d1b8673f0e695a3ebb7e26a566614ea5859f85be5bd762cad027e7747c83a89ec030c6000f8503d000b", "63ac6a6aac", 1, 396639463, "88edc2feadcb8873d09ff8991a9f76fbbe712f8103729f45af4cab36ea1264d7"], - ["4e52dd4f0438daa00a1ac71b47e532374adcc70df2bf1a3311d65b68d8aa57e38133879a3801000000026a53ffffffff887f8f05f4fea70a96535220c9fd9742b34f7cba1fdc1e2b39ead73e62c3c7e30200000003655151ffffffff113d5e16566f48df7a3bee0672b5c988c04f462bd1b6d3e72191f6160565e14d02000000050065ac65531ac8bc3c2ce5d747b8af5f92530762989a1fe88694f8a740b6c3f114e5ee4ce2082554be030000000552ac5252633d301f0c033306e80200000000090063acac52ac536a008ccdba04000000000863656aac6500ac51af0a5202000000000000000000020000000000000000e2c4d00400000000b528b0031336dac0d8bfa3af69e9430f2eb94425a4564b8c5bb5e8863b6becd74d124c1499cfd1cbbf63a737b09abe1e5aa7047a0ed6ba127e58de0a1d8d707164edb2e58966a060f00b6d7f0c6ca3e401a934e849ac016030872a4c6fb48fb400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cc4350096a6ec4193fbf2834bd0f1c96beec35ecb57316dd644e8fbf638c6477e71719b71149eb1a3ab7bc61084519dd84bd9578eb2043988e93fc42d374da68261fcc28155d249b4d62cb9c288ab03065c522feb542f6c4ce6d462222198779dbf147164ddc0c294bbf7e9203562b46dffffc4984e25d8e356dc58d66cd499e032524b5bdfa847ebb76ddd657e0d36db38a2e3ffb5bbb8e597fdc1b89fbf5cc70030325fd59f84505fb393409d21986a9e97f1a871a048e9595642e52e34d4da9410a03e5cd48dc62c8ec8743e8dd9d6515e10f07e39db0ed3c64907561d7c152bbf3bbd6f02a3034aaf6a0fe9b80f80c8c746d153765207dae88f1713c29435f79a7022f588cc480e07bf388c44ce54b9a6be8ece56c1521a9120e46863a05afc114cc03043aa45b388477210ff9b653972b15eaccea50b19e826d1445d52e9e83a1668f022aa03815947e2553b6a2dbefb16d2b20daa32811ddd9260ccc2dbe1221d23912020101cba7775015fef24b846e1a2532bd005cfaa9b4f44b037a39fa43f5672d6802164ffcb38b88ead551af79abb70c2a4e5f155c2ddccbe79da8a96ad85e116a687447582af112f0349ce09c563cf884b0eef661303fd6fc97b48542aa1a194fa67f77f6f92ba0e820cbaee5eb0d0a643c731fef86e2cca44e486a0e7598e0f2c823aaed855c905af849adc142c599de10893bc5a94a6f6d18bda0ff50e0efb53011075d3a6f365c1e9a9ae1f133d62277b4a3794667ec14d14086c934aad1d11a826937471bc38066b683b3a8188c9818ffc0bee5e8cadf09eea7e5656e238aa1aeaf648e4e61660b5b7164d3242934514212c50390f70798666fe9e644d22784f421df1dbad27b07730b59afba5248243b60269e7eb566b8e59b327d9733982546b69142ca101af5ba23a8a133940735a742e8684c3da0b2c4d45b9cb29af473977f28c1d4aaec91b303896427634e89e3d155f8381ed85257ca4247f2a58d20974d19b9e8af0da08f4c0328125ffada8a99c1d02d72008e120a49fcbc5cb7be0132723b9a27aff6218ef36a819b9b385141029c493c92c1c8df499f6825fab6441d6f484e1cb48077d212c65db0f058a01252a55a6c2c92a087addd74705877088b700a5dc49891bd3c0c5f2368f0a05fe7a355119c0bc206ee8d9d8113c549ff0aada08ac355bcd59b730f4554d47baa97987c786767a5768039c831b3ef3c62288c575c8c4de07ecee8259f754bb12938ea9f8f8bcda0034a4659dd36cb62c923e01c1e25278827314f61ed3d648803064679a535d66ba1b0e0657cb64b155397d200f784fd71e8f25b5cde58498253cc77a5415621f26554e5b507326011555ef78d6a816fab25aae96fdb826f8f3330a9bb4190ed59742f57ae5d35cbcabdbb58de5a65d584daa80e4241cd58ce2f21e8126fae230650f8b0caa02fd14f09f350137842fee5d564d004b90411e2b00f6eb2bd5cc437f4ae5b878308f0081a3f3762eb0ffdb9476edbd93b2f7372a9240f0c4b24d23210669158aa7b686341f5bea774b6fb8c18b6f079085a1c95d0222366b1c213ed858485c1145315cd299b4fb4e5af22fa20c0bab55a1d158613c5a9a303118dc71b4c1537856ae179c0963868ceba858dab0d55c8ae53f491a3613b20172a82e3bcafe84d18651b20d41d7cdd612434147f767d0cc06b7d46b234fd7192307b6800b0794e4b571fd9cb8ba32b26b9637f7465d1933e09a190eac6339b2d11ee5b1e70a84b3e6c706349d54c0ebeef993f63d3621da4c78ee01eb1c74ebf57552d7bec8c93f35221984c0661353abf429b082a024c71177f55a99b3f283b24626746786eedb26a17875eba94bbc3d8f81864e65195e61f9183c9dab3d4f1cc7cb0dc4b7764a4f6abb6a594605d8e0b2c13e0f7a792a88fdf6b80c88e9dc8799dde20ae58563b4f6c8399ba92fef994ebec60cc69afc5e0bc19b700462547aad6b285c754a7d79b67d839616e3372d8201b4eafe4608260bf47fafe6a9c29f9f4b0a5f04a91c2886cae0eb935066635f528f88cfdb2103746c7717eff9996f7abe1dfa86ee53ce50aa60f242b118891ba5c6221cfe2c77fd7857830c06d5d76b54958f8f4afc99533ec6c1f9f78023f03968885df3d86680a7b64d2a008fdada013f82b7d27cb7bed4dc7fe24ab590f4f5e30620145c736bd8e803af37db18354bcc314f3ec7916a49acb7534628562c092117b45bd24dfe159f74893c0f8f28907ac88ed0f4304e46cd3ce05c7d451c827fc9dea1bddf3cdd8488b00000000000000001a01d10300000000e27bcb58cac90edfb7d3062887bafab1d3a04681fb7c1beaa6d4d69bb86c01c4cd3a01e096c976ed33ee646618843fe9dfd7b1270a149388f7228cdd58a975fe3e80ed4aed07e68deb2d7a16b6f9aad98bc2a18e9d3d751fe7cd47b9c26aaf0c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003fb66690f7a38d0d69eef7482a457b6242c089aeeb5aeb33397334147235692997031b477698d575fbcc7b0bff1d32c39f729847da4903a4c5c362198f46c3ff8cd4566542578e6df4fb0a6d279a01723962eec98c19e01c2f84c897f1a347c14bfb506341a59854a1f43193e2b6839c2434ba66ebdebe3d5eb3447468e71b9d032ce32024ebe388aa257658da2f091991053652a7ec9afa4c81882b7e70abc623022c76bd76de53077708bc40f9a818bc922f0cc84ed3dfea75b5796997671d3e300a07e95fb899563822585b3b91a0e3c43dc8831776ce82fc6fcf67fa7e17ab3fdfeb88e1a4cdc551489f1af37a24dc5ed7618866db8768e819dd3ec8471ffa392c021fe3e36f2da6fdbdf663762b405d2ed4bc171791e80a1ffb5034cd2b388cd41c0318b96a28663df3b1652342aca1566214d9f9cc52f6205785b5f5d5f3612bb112020a466481f53160ff0aaf7d137d2ca7fb95193a238ab4e74552760bbb1f6b97bf030366362fac8d7d49a5a0a306efeda73008955601405531385e3b8a3ad087d57c031d5bdb956f6d9865876ac61f8da2ba0bfbd724a1bc7f1af165466c9ce54680b18272e8fc89880754c2568931137fc6592c21d40393173c1bd3cab9f741dc72be7c492c0d6711de87144a83ebcd45418c9019485948f484610c27ba938b9a390b1f0d58b8311252ab53886a6cca81a80f2c6b5b4227b9cf54736faa1afb49c2ccc436ea35f2e91b237b4a5cb5c34388dd5a11fa7bda50bf97d6878b52d84a6e24556ba34168786264c8c39cf38286a3a3e79bf6be297e60a26420ae85a5482c92c55815ad0f9e3017e8031fd87888589b4fccaae143e0a52e358a61704de2f9cdadf5fcfc9de14ae20c091d209ab156eced7e8cab056ba2c28aa96fef004cd793eabaa0cba75205d41d450587479d0b69758b3419f188cb88f8fc85fa94cd86b06eed3f7a5cdfa6eefd60f99cb1fd2b461665ff1001936f8a054ca758db8a62608c8e8a24b4e4e5d518b0381140186787f8c7703890b0ab2b10c246cb5b331df339cfb261217a102a7ae92587f438e90c51542ff26b71db10c1d4a2989d33a475eb72009cc902a74d7a53dba80053bf760bb93db8638853b80721a88df40a45d86dfc8aba71beb362ef32120227077f23949e3975fd7115842955e8baa5ac91d492c144c5281bd3ea6c4e262cb6ab07c92d067ec06838ba900d96a61f6b4b6aa4ed4104829db9093222f3ae4113f66b8e1b2722ba012ba4884d159be90f86eb976761ad7e29d43c3ccea188f11a8dd6be921bc6499d602c44ad733c67cfef4223847db9edcc8ed315c2fbd5bad402a0e97f91f726f777f5c66ec2393dc527078a889fd3e12cdd2a9c88d8e979d82d369aa35dccf84e431d50b5149dad68db77daaf67b779d8a2f5bf9735ca750eae13dafba11b753c8d58c895ac5ef7d7d8bf77ac8f1071a425ed958d056d6af2fd220d5c3eccbdccd7dcee0decac8fa4d00d26e04c2330930491cf493b82f6a406f85b22b9aa39820c27901942bb6d810f6ecdc2d38cdb43bc5cbd3b26aeb15a36439419570e367424efe708f4feb064ec130e511d50f1fb81baa2077cd832a6a821af8aa1568475bd5465568613b6629d922ae576f8b17e89b5ff4a2feadce55b0d24acb1719357e4c9f06531750b39d14a7f1318ed3b50051b4555b911e0ce328f52861ff8161d8647d965f4bafe85a41d280ffca5ff5674865e63bca8e116deb4c8c4f4a49b586ca1057d7df73e5a085808eba0d08cdd0b87fde838a50c48b3a16ca07d449bc99f3106a2b74ce268576f873888241ca1813cfeb7828d587a1cf0b2b938b996c139f2f496562d032f68414328b07d870d565c61313ca2e44c221316277fd4e67f0ffb00f835b35fdd91f7799076bb31cb445f7a61cf4e936db85a949d5a204f98f7ba3ea4b936ac6fc5989210158ec7a286f7942573fa837d438af26b58c77d74fd3630c7bd818625f97a75fef18e7506141bba27eca17cd232e7d8b20e96353e51ab9bb3d284654498e7dfd2d156fc65a0f71836237bd1697ee1bd1b92aed9fee58500e96916b62dc5f8612e2b45515d1faa0ea17a98b7ca9db1d7c478531b5cd8066e8a3d016ba0e6a470b932350ba8a8d5197155cfb396dcf46aae166de6812982bdaff43d00365cb5f502d996f22891e7886743bd8a5f2ec79a5878ef8bfd86f9efa5b1fc9fe7ed551f45e84cf53e8206efaf7f43e97a517f3d5ad274f759ba12b0aebc0d0b92351c7bae163057e281342c61f5e0f5955095b0e3ed5a3f56bb886958cb150e35c436d575f73f1ef566098b8dee5be2ea7ed5bb5b508e47f0ad4b2db124bf040c9063083a1440b15bd2eac5973456ad74b70e9889127bc93b62560afba61ef74ab3febca80ace1ee617c5b8ab618147521e1c002507", "ac00536365ac52", 0, 2074954959, "1fc4f2c528bacec299f4e47d9acdd190e5b3720477eeca997162aaa26ee14bd5"], - ["4641333601c4d8b68c367f652a69d0cad8419f638ef3a23ba59a308aad486bb08600af969e0200000006ac636a51656522eddb100427ee0b030000000001004b142d01000000000600535251526a82d445020000000008516352510052ac53961edd030000000008636a6a526a635151000000000339d2c70000000000000000000000000078091962975537a94f54d70367a4624b9ab50d02b9e0470be5c6dae21553b219b09d26e9156a38d30793c451abed150a4a6dc5e2b985493a4df739d9ca242046229fce70664e478a8eb4f7300481b45dd0a7150c3a570bc2546738cfa4173299000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002de5e154ecc9d6c12ecf54f20670cf9d02fd23a6de65d1fa01db19d64c39d23a2690c223b2605ef0249ecba7ce686c64d7da3533be49e45efeb0d564e49fb003f2125899723cc2c48a43c53feddd384ba0e8b9a7e2679664db6f19b5d1e2940fdc4aa16afafb7d09155e08acfe510ed1043f989253a9cc4253cf293f7c70e975030f403b3c663cd6017a0a88b3d3e9a10d8b30edff44048c3b1da9a882d4e5e5ca022e2e4b2ad2a3c02f07eaba38483e68173a5059d328bff41ca6982cbd064d106a0a022b046a96d606e5b5b627c9843cb56dc98ff406864952611dc4163bc269d31f9761cf2c9510957eb0e5300224431105f8294c017145563e4625e8d440ed77c70230368a6e1b4001dbe7fbab35bd1253452843245432c3e205ae2cf4f9d026858d0310b41c119c64c03a61d95f33971a13916a9194ec9e7a50b73c38f21f1c0062e60318ca4d311abd78368759f6c1688a389ed199f3fb58329e0f91174caec6035341021a9556840199e5c7841d66fa3866d70ae1a7a55d7182216d225f0a4ea1177672020be08c5f964339f7a38993938ae6fb38a4278f08862d984bfc00b43c0d61d5ad15e606deda6eb354132a2f2a6f4189cdd1be1e80acf131bc653517e6f7e60f581d7209c59fe113710b94e3cf17bb51410c3f0caf71cda999449d5463bb0900a908035fb97020c8288dfd798e403db0e446754b5a9fc956fd012e1b4009f64bd72c410deb929ba09e7cbe8a815794e742a3d7a3167f1067c2f2961b2224687d93924d9327294be7945bcaefa95501618c4638e2528e5c4a72e83d722ca79e8bb11d53d465db623d22d0aff3f91dda1602ddda98873aa45c46b11880a9340a1793600d46d57ae539716963d26263f937019023f19fd26d25e61778ed96288110d4f4a5c9b28c7e38a5359ff50c08f214981fdbd3bea27c0c19dea0c7f18e19e5216f833579d23ecdae9918f289b25a5e9e9c8d6b4642a597472947c026eb6ba571cacc9ee3e9976d5fdb615b2c19d2ac159152ac36d5ea226ef1d11f5875a0eb93dfdf846fba5ce292ac805706ff2b496e175f8ce4b5ae85f51ddf6438ebcc58f40a6432a88958a59863e23b82ccb9bb383467d13daa2f77be6d0b768f220755e5bc001d8fdc6542be6f086fa13d7957da2d41216e60e503838717c6f29f13997aaae430db33463383a043c92f3994ca320550b32b01cf85c29d4338f46e1053e534ca612328c1d411d63ba4f9427356a3ea474cb2cdfa70396377cc0d7b973b578fdb65c4102d49bc94ff029a34aec9c945ae28031cac0740c63a4ab035f3a66ad5649438ab99dd480afaabd52bbd4915966cf9fdd8a74303474c5c5bd19dc2f99fad151941eb8ca176ebc7c5ad0297b5b685f749aac50f74c5144bfe859e315dcd5a251a16727dcdc1d01c6b978afbd0c21b62183c4709ac61b4e5414c6a6340a62f40a78b6eb57b2edbf66377eccb6d3556a585a8dfeb1282c2d860234594bbe069f9b5651285bccae2e2e33276e0aea1b70e058c23337d01e7e89ef78c01b4a96f6b55e12696a2de1d91a8385bf90d15865fdd03782b4f774d0f3bee1f4c4059820eae8302d5de2c2fe1b1aad966894517b7abe92776c6c4070b6cbc98e21551d74cbec7ce8ca99f82f97d6a83fdbfd92a78a295a6357fb4e1b308295f8b0379df7cb46d7d5045a7258b8923d6981fe6ec5aa9f9cfe5bdee87477178ee0e8d8ae4e77e84bb2be0bd965dbf222c4c2b086c20347dd8ec2c4cd38a1f474bfe482526c7527d8aa1d95583801a3ef39b459cd1df39148808201f18e289b727de51a82c0cce4da88851f0603579194d5ff26758626b2860e541be7d1e0fbeed253a0a6f8e4410a5fb04527e9b0f28f06adad005393f7e217c420bf46a6e71516f880e68324e4442ea27893b2bff4b8204e1564c4c84edded538c83073fb80b976e2c79ee5d1f01d3b6c889293bf59270134ff06e5e3365ef8fde6640e01fc944405ac3d6522a93ca5bb10d572f4997e36ea7f3dd5b184760952281f885d4f720bb985f912ee9d4d4e09e92cc7d2946e7243fb3912eee8f52255178d5967fac9d528f8507bc6cf192519039325662294a7ace50f98aaf20e2a777d793e45f09fb332616244c5dbcc072486c1c0191d1ca11814485ba359ac568e5050b1bfea38adec9e85211338df5bcff582df0d9cc337c67274bcf842b38caa039476d9d72970cb5c48593cec20d07cbfd2d8fafa8d3348fe0752331560d5cb7f430df6a098c4770b4ecf81d8926a77763c2e4b0be6043790ab35927a03000000000000000000000000fa0727196d14af9b7c165a26c4aa7c974204f6915358cf77a21723b287b38c0751eb9fad9e92173f4e840f0cae91fcb8c562acd489ec33426320d49ef73c58164391ff74a26e6426edd65e3b12ea58ce15578a1b2053048e7774c990296eb57d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063c1ebb9d0c3c2f2226f6ceca4d26707f8b6f0581e519697f33891a521cf41a60f9ffed14fed5d77bdcc7913af21d20b699bf124f7a97aa19a2ee659245b230bf2dcad8dab704e2f0fdb54cb6446cb76dd8db19fd82c12450170d7f57177948eca70802f5bb3978904caba4cf23715565051f1030e152b1369d4cfc518a6e9b3022ba0988aa606c55134d52d74e3642a0ff81a7477bed3eb9c67df6419f09f9b730225657f1f4a7444b02d6c12fb41d5848d73a1b33ac5a944e79e1d6536d5069b130a01aff5d62a85e408b3ba5f336114ca0a8f225b47aa79f800acb93e8c392891466a9555ba9d6ec9357b6dfd6a4efce99d712a61bc7aedfe9a0c1039f345ff664e0318db9ab398d51ccfa4b22365092c985242691dab0b49b0d76a2e32a5c11dc1190228f65c84095fdc37b99fdfe4856d5d5923d0efa521b30d9bffbb6d974f54c8a5031dbd6ced3df7150f3accdcaf28e72d47c5581492f2d021d6d01e710e05143d7d0217c3e4fdb9928862a721cc1c236cf0636b878922a13da37766e808824284cbb20227d55e8ac0d3f57645fdee50f14acc0c885aa1d7a5af9f995427a46dba76b611b22486bdaa6e2098efab8cf3a92bcea310fc14c2f9fe029153dea1e321db91ef40dcea82c28710b2ddfad9991940a52b0fae2e1f29460179777b0504818fb91bf94d6bd179482203db8f7d5c62b00ab4f62d0cb32088e4367351a5b7d83fc6f86bb2d1b01c5f62edae46b6ddf646065a7304aa7fecbad2f93bdc6ffecc350919d787b1a00a4fc511722553f100d4465c057d8e886a997cd4136be17c77888c7b2fbc147b972efe0d676ae240f36447ab0e6ae61d2c564d465f3da78f2ab1288f7bf1c4b0e63744938cb60f15e93faf91c2fda4ad6d9aed6689847d4b470e95a371c7744e42381e7c3e5ce7cfafc2c4c584ab069cda6054957707b4e7082c0579736aa6145f5c0de6e3b68664dc159a8ec91565f0f4a1e1becf4ae3296c2b2af9a7f5fa3b613185b13d14a41fa7b1ac15262acfbe539ada532adc7baec1949710f93cf4bbddd9ae539122425dafe4492122b506b79172a5a4d46a132825b3ea756032a916e8627ef01bd5df946801d2379894cb0e63b84d6edd616475865c5e6c6d4c4bd361c046a0746269ee9cfd57ab87a38ef1d6e309c174ab044657cbe1bf31e8c8d7a182e2986175f76fefdec424e4dc14c0799ed422727287d6928181617d9f1570b359b34076d0c3a139f11e06c32bbd5f036544d31d7190f97d9060eb113164cda933be75644da0b9d0d38b4c98c0992c1550ca5ebb6a805cc5ea3175e60f52dff3409376a2d08bce82b490ae7d5bb9a3659b4106ee2ee0c0c7b39ada28f506f96fbb109757921c0018ceced191a900a2be6a6eb2b0c2cd81dced9a8ea6ab22430c483e43292d4dcfedcdd58f850daa78e22ae95ce36b19ce201c95d83ddcb954e2cab92fbe96b35bd0ec5e7f1c9685840db6089af09a3872c9b28ec427077df72848f1234d0c26595c7233ba15d148c5fd5c392b192d8b9b852c03525f8bf47f053b170f022877e41578eab78813503f88ffa522aeb6267d931b1d736db718eb551072b47018010534271d9d2ea9b4f275e0aac01223f7475c1dfcd1b0abc53a71ef483f20f33976bf365efc35f6344aae61b70379d39c01dce72c1c84c65d22bf48154b4faad8e465690906ca15982196f3e63d1193eb42d29087fc4aa007c109affa41194d44741be9cce9034c6679c981c9c8c57778efd8d5183a2d3f28ad314777044c49afd9caa6a49ca726e2ec738d397fe2ddc8aa3f397835e604ab866efa8e12b1383b6afaaca9a3317d698db0abc3f1a8b0de24153bb0f660efbd9595e735648e4d56127c948fddb07db0a3ade53f916f8e9258713e676ee96f15532cbc5437bde686d7d129c17ca2d816842594ee756af513fc204dd00f357accb0d2f6a29927393ed774598930ecf28b1c5abb1bea7e9aef44afe30c17106b2af4afe78e83b800b3b43ad0262c944bed23c37b38930600a497aeb2fa05f7b0494916bd3b1688f436488d3baffd29ac78e208b4437819865ae040b05dc79fd123f01f69eac938208a3ca76dd67e5b5ca1c364d80f734aeaab316f7a83909188cadbffdf75971f8ffd9b5cf1b0786053ffea512e8b6c5a55470dc152a143c1b50383289195a9bfe8169c582481a224c2c86cfc3bf9ee5e3711eaebf38e572c563a40365b53b103016109841c0cfc57b02e979ded441c21c347a2f2b5f69e1e9c593c9b32219dd8898dae5e92dbdf7b4a000000000000000015447b020000000036f52cffd42c691b5108ce59f092d9432b31ad7809720ed292d069957087a60f050493f4463c751138fb74d80ef6a0ada9d30ef5c88f5e23e4413ed7aff9fa4290a6c870dc525a0580eb92009dddfb2d5544aa291e7bda43e8560e2705bf201c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090a422fd240d9615569cf303a60cad20697710e65c2c2f04a55edd049de978da1fba7a1a3ba326687f9c518bff981425a2587bf645bfeaa1d20fb1b3f63029591b07cac3e85e4d41446fc0e7dfeddd5f372e810746962ce24a253f44549a9d61f4c6741ef20a309633ec6b8b4286d5a476283ea5578ad564b3ecf69de243b4b020dfe34d590d3faca321c2e4d790ea3ae16e13be358862a77ed089d524581a54c0305773cf3a86dd84112049bdb9cb9d34f07f5895f22b1a955cbc2a22d25f3f8e10b01349d71590ef95a090c39e68a5a79903f984e6d9730d8d45fb19b0265df9f1ffddeadaae51ce3ab9649ec846ba83349d958ea93eac1ea664e7eba5bb589e16f02119b1ef8bc9c2d23f0c6c704e58b7e0632ac880cdd617b42bc1a03cea7ebca0f022e13f38d57ca0f6fe238d8b873739a594b2815377aa791dc096acba10d0c9254030a4f42e30b578f05f474b9a568f00cb7f5f186c04e7229f6f48330d9e44227020303c78cd32b0972f2b14f54ca553b5129645d7d2b252f8b5288ad6fcdf3882e5f032704d507a6499ed7e13797086b341e57ff23c3e190288c64dbcab6b1721c84b125078a842aa431d155a93482e73d58b075364311a81a2bab2d8621f3abcc361810cdc6efe12c497120cbc7e60ed121c59d3c83feb4ad3f9c16f8d721914904ee4d36dd906039d468418cba2020cc3f612442f88723fd0b2fc1df0f89f1600c175e52a5ad51e99365a4b3076e1358e18cfdbc8be143eea970d99b734ec3f33fdc3f50fcf9891f02f21c07c01131bcfd86da4aec16ae7312ddddf3bdf5b36857f016716b4ac527f903ec3fe90be1261543ce554be24c5d3b710f40e311d2615626ead1c59afb37f882234bec447550d21d90448d69cec60d2dc2e0439cdbb8d20615a104348d84d52349b6358740ae15de7a2ba2298acec42df6a7cb1e383b8031f4e697563683377e09776d8bbbe22c62e81b01f063a87e0242add98b0cce7a7b7b91ea11f2b7b561213128d210faca1bd8acb5bb9ac652ae6ad20283b8877fc221e2cbeb4b2be2de8221193ba3c59a822dfe9bb827c71c43b7e1504c79f2bb1750e5d24b50dea1905af9047d19129a9fd17d72b1c2daf43af6be97c66e206f329ef87388bd9bc7f2571ad45bf3e4be2c83027def2896ca70048967e0d37bb3ab8b1bae7842f0da9d6f906a42b0bb2853f22201c1e960437fabf7de26cd02daea5c210a41e6a590ccca81b18210090df9f19ad2460de82445b67bdb4bdd9953957ff245d14279eeb7c8528cbadef1c4dfdc28bd7eb7fe9d95b324623e8de23698de6f359b2278597f0ec41302f5d7f623c448d68498958c202ad38ea6bed56c44acfaa86e2c2903b7680a1465c0651bee9f618a3edb030f4d8b10bc74aacd2192f404e88cf6d3a0414cd99fc0e088b65a8d4bc087f51f26af3b8a050d6b11a2d246650c043264f71b856721a8e2bde0ce8d27db670f5231f3b06b8e920069d2fcd9da9d4a24564f900605cd04914e9c82fe75033228c945c63013565c80481b57ac14f8c91a4b79f755504eb1b30f2311b0f691ed3f2f23329ef6bbdd3dd13363487cb98326d64f5fd480a869eee52e08299a3d84bc61d45b3e44a828ca4085b25b5e4120b73cce5c3101d7636b2537668b6e28098cb97360df5de162afd67d0f0ba606407a4d4d23761bc4042a7a5ef92dbd293da0813116b5049fece126d04bbfdc1eece7e32f51b0e9f1e107776fece0f9dddccf592b0d79e1b3920949fe72801eba7cc562d2bd02ada5cacc72352495907b69c7d1719249253b9615823db8e8d216bdef5e16d4911cad4e297b1acee6432b9e09c539f71a39043e6b9b94a2eabeaa0d6f42874ea74d67184234ccef0894945023fbd75c399f6589270dd7a2079d4c991b003886e6c44bcc917bf423d5e3747b643925aabd6300fb894158fd778d2e463624f8378d6bac40227fa68736002b7f4bd6666d15026f582393fe65f6276bcab7cbad925343ef483258558892475a8661e44a183b5634adba7b108dd31a9928b102db3746939574359c657a5634efa485ecbac2d99886568b445ce29ccae0113e1fa055bce2487e0edd11f152a0b05116511e9abb04e31af1c0778692a2e48d6b79654352467b730879343e97db606fa49acc8959e127b40a3653a53fd2e053347afec77464a76782dfce363a4ced6ef2a715b3dcccf314a07145f25a9eea82d5f64b30464d31d0cf3fbc399d806b6f71dfb589556a70d47e22d47890dfde71c8bc373d09f63ede769c32ef191514909e167db0e17842eeeda0f88b320b59d2a0cc06033152b45431528e531d72a2af592c7ef35090b9c6654ac751c445b04c4e2f56c73a0236f947558d435d5bb8b1d0c2451b12ed2d292ede22d16fa1bb17fc4fad96b48f3eab776be9750307", "6a0063ac6365", 0, 925636285, "282957a1db830d7987b1f7ad9d234c62276b83c4c496e8591ee441447ebb3c46"], - ["d5466b2b020177c2f69f45589609c9c3643b991c33f786c142ff564859d011bdee19403fc702000000085363655165520065ffffffffebf66881d73a3681c75c005cb9aaf99aaec5a0e95bb371e879a9ada4a95f3aa402000000055251536551ffffffff035fb2bf020000000005635200006a5293f200000000000152d622e90400000000076a52ac51526565000000000168aca2050000000000000000000000003f7593d8f5ed76ac2c0611d706c5374de52215d71b1f2785916d95ef7cece92ec6e640056b5dc8eb1ae5c56cabf38f43867d9f4e9038c22e11c2311daa41870ef2f03e59b08138d4076a54151a018161e71753b5be33e093185210de35071b1b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c68504cf581ef62b5f330ac134d2717856197ea2ad563f37c6381e8399438cac9be232060cb08636009ab0dbf96a75fcfe6e4f2c8f48d7af4eda5b6f0d63c1c5ffea766355418bee8636f78beb89cb2e562dc8937f7c5f664cc15278a1d6e4bb729841bb5194510ae39e555a68644b3cd0a360c91c9c3b62213a78b3fe27f0b00302f0a10381f4951e1dae52f0bb14173341417ce2f496687592c742b1be3da0190207f3fdff9a7a8b2018d68a0c48b642f944699448d9f1315834d8a6ca8a0257690b03c838c245899c768aad96297b37772ecdc63d8f260e9833f7ca5f07ee0fd1c59f7229fdd67458ec6255ac1ba706e138f7a6a2a0c22e3671de615e928488f1b6032e0490cd50c2ddd6e24700e6d44455647b78287f07a08905d0ee985a33bd75e6021e84c6d29033cdc54460bd445d123966bf84251a9fa248431058e4e7f6d70dfc0219869bf40f63c9dfbf41a35d180c8912ad42bed7a82f3bb517c43e019204924f021ff6c02ffc3898d11bc9e06fbc428d061824cd5bd2927f9637468a42c18564990313e320fc63a8e35408a59abaee7f6c3c6bf68f55f880c5f079cd23ee304a3a7055c551809d45022aa5f125060b868fcb7766ebef49c6db76dd462a11130b31b855f73d4dfa58141c62d37750d21de3efeacaac06af682342cd343032e776cd01ad417a24760f8f4b5e20530589252e1f608f48c6b11025f7b81f1d9658d60aa754aa324b8c73f303fdf846348371e94a0a0996b1d85d505d5d14300b692cfb45e62b64f12edc4095f02eaac75a0922391d1ea3ce64fb1d741ea13e89660075f75ef4fd1a769407a6a39108682346168bd6ce6d5e9f3bcf59d7d9d9352ece4e050a01d7b9d07afecb33c0071b18f3f15e6b2ab1e2da06caf8f70849b5be8af6dabafa1939a115723eaac0a497f26350841385f6cae4aff4f9d633661d1ad6da5637630f4f40414760f3dc8d002feb52b7e883385a1ad1f51da881a8eac4af43eb031067e9780415f8e7940422aacb6b04d7390cac8be576f36e2a8500428c60d484b19df8996d2a863aaaa1eb13c076cde6bfcdfc0ef31ccbcdb1ce85f9e333684e9b60ef1a7265f26d94dc771d5deb0258f378a1fc88d00a35d339f7d833a4c9e905e58fa83e20904199dd648c05cebc3011bed252343ba939bdc9e50341ecff6116f4f591e5219451f88058019ccb0cd1d73e1f5e1fafc3eaa87eae3e3eb83f3fd0c0389463037ab3003a6046a697d45738a12cdead35196d2bb76558b3fb62f18547a39f021e20e6482a37161a66f5f69bf837ff9ac869089e5f81ad1ed7ebcd6fb4f68099c7ff71720e8ae5643dd698124d1a24a97dfad938a3f1201d4de5dbf6ef84ac8f023293f4321bf71ccfdf25980ef4efc3b3e181705a8264036ad4d8a262256ff53564bbff8f22eb07fd0131195666132554f97176e44a0a1025c227acd1666d46e54faa491a1929242e142b8b1e47c08d49dc5ea9ff276a0fda5530ce93d75e77756254d4b7063880dc5f517de66ddad3ee946a83afa8232ff21d02f5104ac8e553c2f74e5c855b992423b11b2ab746d749a0f80b84f329edf69ed1fdff8dea3e3f97de517fbc6d20f18ab6d1e6ce3e6f29296fcbbc570280b18f5a68173f58d9349af43d07d1b0f52def51b91d1414f4dc6825cda75c2222fd57ea5a44403ce9fe85039517fb8d5f1af5e5291f45a3820d6d4352117c31a53390a0c71f90bf556a4d1584845667d556ea3e71691bc1bb7d09b48a904ebab1dc32891600e345803b255f14c16674eb8c58b097cdb2ac3859b82aa47389c44e0adf32027f5ea20e3e4874f95a2c4a64ccf5cb6b332019694fcb44eea2e80b3ed40acafc330505fb454834f4c2398a551a978f3477e0d385c8d57ad68616cad55ac6369fe8e1792e8365ed58a152a52847d275381cbd0ae7b96b6c49d9ab328f93f134f08ae345c90a4e7a0feb5fe4656da599163779d6a8dca2582a94c27f5c2761ef5247f13759f5fc6b5d06e9b3b4a075a9fe4fc10ffcd4a4dbc033a9ba796947ffe144c0655199712fce8f188cf9a13bd88ce07f4b7b8cf48113f530cf9b9a17b98b485ac5a64658115967ba49ad1edcc60da12fc38b7fd0546c1587f687ba2251bd1c5267744dfbb65488c2c637160c25719ec31630762e82f5b6f2d6dff988653635d037a2f75d5b90e6b40a74e7bd0cfb6454705ebfa9a943a5ad6a75d5eeb7cb159adbec59dc43b991bb6ae72e390569cf1d68518cda354fbecf595ab4233f73cbc45e46e52f21099376e5e068a9ad312186f6fa9dbdcfc937ee5ea76b62a3345ffc999a7d785a6c2d7f795a168d19fe83c9669257b2b45e89901ef1f7ccbe568cf088bcc95dbcaf64bbe4af98d57f82162490e8a699b167c4f12c9b923d5ad4bbd72d11a52fda32757afcd89aff370a", "65ac006a6a525165", 0, 345602513, "64938c275d53a4c34b3ab4741cc64ba2458685143fed94c9679c0cd3cb3d827c"], - ["030000807082c40303da3d24520e5189c60b267e8c36b8f688ad39b78918651c5f893bd784fcfd5ed302000000050065636365ffffffff94b9377155f6d5dd31bbe2a18e2b6fd4e1e3dd0bb2009714c8fc3a1e1cf86d2c02000000065353516a0065c41392a0851fe6646dc3aa4751fe2b57019a7ecb3d59fa8a5e4adbac515e1a3de6a1437901000000036300635315eb57029770ae01000000000653655163525134ed7705000000000953005365636a525251000000000000000002000000000000000040f69202000000004c19d779ba4ef09839b10f78d6f9f0edff3349df7d13ac8acde9cc87ed3718d871eb6f0f3ea4f0358f2c9aa861c1db04dc2aa8f4e9c3dc429824bd3b0982136aefb7e9b1abc26ff0db195cfe52eb4074d4e0f1eb9b4d4b240a23c1a911b6eba80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000037fe56bb9824db5fd93f030f06391be6d66dcab3e297319b9567b28314e83e8e4cef408ab5dfa8dce1d02ba3b512ff45755fbcfbd44954be68309c8179f2c47c14013563d85be2912d87f1b6fc320f10fc18e0ee7491d6a543890fd5410965a56f5f26cebf5725265819348b9cd0fa51218e161908da7b448384b6a664b30c79022956d3b6d6c9d6a8b44fd259986e76573e6a3ce8242f9211a13e905080f33ce2030223912cb71aaf049059ff48aae0f6a94d7f4161e072518d6a5d09def69fa4bd0b03966db0c575f000860d8116145bc0920f2835b6329965eb2d6d4b10f2f539c53937ca7d4d01ddea1ffcf9a1d605ee373a6b3607ad9567cc4ff3cd1da58aaf4b032dd3172c243ca9af8a17ab2b6f848352569ab3970aed5152e6ae677687e05a7c030a9087253cb90639a4614605d2044961c5cf3d2b93c9282ac1bce2d516cc7355022d6604127373adc5a1b926a87cb5bf68992fb7bff200119d33be2f7f633a598b0205709741548c519e82362b86439948a587bd3c13fb427e7c58e3827270b7d208031528dec02f16c9f2071e43780e5d6b9632ef9bfe4ebc7590d2279f05e3818ff846289af2a473b17c299ab379ab51967d979f940c4500fcd51a02799958241140f56d9afd7dd03e7469a6b1511d472aef3e972f9ca5c7ebeea0f03b90cbf7145bb41cbccd6d835571023f000332655758619c3ddb8b266073db0d791672112a17a8f00807b61f840dc733630dcf00ab0d938db2e132bf8095f7b60d62d1efb24baa3821feca8b963ef7c77cb64893c8274f3e3d11d5a8d5563160d34762f7b5298df974da243e6d7562e3090d7b3e8147429b77f0741fc4d9e5369a71f5fd202d39ba18cfafc1a16bd9d8f913714e870e17d428d31e6b29904f42a81e4f7ba33c95f7bb3c8ae08b8bbb429c76cd024ad253b27df3d03722b9a214435c419b21f624b15ce73158b8fe87bb856b3bf1cdff96339204922648427c883b126507eedb9edc3292c102a84f292fb5c9f091e2750aece79c0ff0384892b5016622f9a0a42ae228ca9ee03df81826920c3100284ad10e3341d19a488bc9bab2ef029e7c1cf4bd9640278fbddec440416f1634027c95a7eb2f90878bfbd415d585ce99507d506f4e8c8f2f53f572db87c00d15e3443e93fe02bd5aea0a06624377af2ceee628f5a333aa0781375296931fdd00a9dce902896eb73c3f66d694bc4e5e963f72fdc638b017ddda7688131c16e836400811d742b6c1d662e6e796adaf3768742163e296ecf9b543fd4af706890a1298288b6e052bcc528bc208cc5281512c92b6d986d4ae8f64016f859543c874dc008a3e42432d8c40623d1d8ceb1794c6a83f65c2c1b9ebe068fe44c48d43e5c6a26b9c71a78571b12dd8f5e581562c06db463c49ee3073f7538b06c63c4eb88d31e954c3a6aca45a433510632b7565648cc010fd3e5a7a8cb2edd19d3d868146e35946decd210c02308b8beac57dd47d9c13cfe75cf69677eb9e114e9e7f51eb82928ccfbce7c1804fed46a6e47471f2b06d8e707d83e7292c28b93e25ceac9b41ae10ba757f8e9432e3bcec301805889fea89e8e9474b5869117941ed1bae83305c49fd737488dcab94a2a15b5aa30da2e8463de8cdc7a4f973073dafbe195ff11aa607066d897614f97a62b76368063c9bdd0d2e884069414f268884b82da4f0b00c3f81b75d225edce835f5e77676f66378eda7bfb78d68499ee05d8ffd568d778ab219069c8de9c96492dc60b6dff9da438f466b3dae1a804cf6d0ec862770785ab4ae823338080b53ab6dc4a4d0bb94e012f698c67193f4085ee44af7326063006eb7fbc27b5fd036e79d1651b4df3049078ded8766b0a9aeb939ecca598d5c3cbf1bf8b03aa80506571432cac79a0060bde18489d503bcb3fb26646604725b9b8a88cdc6bb1bab4e834f008299debf0ac37dfb5059d7203b8e88fca241d4d7f9a44c82e75ad067677ec1c89cf76d8fe459afbefb59e16483f1493ea53edab92db22bc8e79a4120ae9a1dbe583db84162e2b3d50725e263afb36782e3b2b6846e47ef6f30d064d2bfd9e704cb062949055a2045b57d3f560a86dbaf9628653161b1672d2fcebc453000728572de04e92f7f1973554c35e1d038537f021107ccc4ea01eec6137e66dc2eddb4b6aedc03efe337bda806bf8ea721944db24a49f8a05733cf53ba4f28726f787d5d8527071a9deb467b734f8db1d60aa441cf7cfc7b702fc4989f8817bc54b18d7614903335376f7c4131572046dedc52dc336f510726000000000000000013d87c01000000002a9ac1a47384f1bb390845fa7cc1267cd367bd5cbb9e659a1cefbbc4010713410a5c1a9005658e929f36d6777e092d89f3d8a00577c90ab0ca9db039471920720e32936322bc1700aa5e8726ee06fb3bcfe3df7145cc95e2f779c3735bf3ade400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2bee9b4ca1ee14a65ea78fcc889dfd4f2f7deefa0a893c98e74e36168bf1e89e051e01aa1c51488ecb333830348536fd044808ef59d81f54c8350862eef0ba6eb5577e4e62e98c91592958b12dcd834d6654f06e09e7b1a2f34acfccb1029da1cd35566537d5734963ced7b819bacc50e390ab6ce9ce059bf2f9621eafd22700203da927c9cc750a93a172ba48cf63d920e2640125c00582b4e7adfbf50266e7d0326145afdcf0271d0aa40429faa314398eaa387d61799aff3dad6734fcff695910b00753889f8cde09bc2ef1f3749488ac25e8adaab0eab85a7c1635ad2092b83f9b06d06f42dbe29023b9dfdd2ee2800654e40cc7f6cd224bf52e17586572ae9350220b054727220c7f360378b8f3013e84dd686cd5246f9b2850e4a9de7116867ee022804399cb8b1aa1e01cbb0d826d6e0c1068e38bcb14952ed418d50b4f72ace8b030e7f5819c1d91d6b765b694c1b29c00149646c233b36cbe3249cc0ed4f9ef42b0302a9b0b4fa198a99cd348f399b3697318ab832b481aaf084e517b5636ae824e20301f0d809f5467d3193079eeadfe707f7d42c14da4a71c05ddbc974a4ee3b1d35ef552a7e9f1a231d634b448cc5cabe442767f76ced9b197f0031da17f55e86f120c4ed5bd280ad470060b16b46aa60742faa84de81d8ff7fc25139e86b2947138530a5fb3da101032a6d773fe4da28485e8aa025ace32eacf1efcd94b998f4a379a75921e86f391c77ee2afc9fb22e70c0efe119e06fad9f02605639c51a099f4121195388f3454465bb71d27f0d6d3e63d8f916ff52e5276bdf12a3aa86ac7ccc69d76632350ccbe86a5bcb32721b0ecaaa133e2575a5ec294e7c807cdd51303efdb4a3148f6e98410d6a9e17dd6eb1bf2674a1a179dabfefb950216cac3f94c27f8d5d43dd7733f077af8e0aed142186b60a4c9a530adab86d5cd4505c2945571f8eca2224a8ae7d54ab058de6341e1f8fedd21c7e02c49e8fc5dfefbc74cf5551afd5d01a1e0e6773f9057ecd43b14e6fcc9086c5ebab6d760dcd6b2a15fc9b667b6acc032580417badd8f4314ed06150712bdfd38b598318465b8fce64767fc32ec73f3fb960c8a663d321c5f88be5282309dc442de3b4eae77c8497fc78891e34a295c18dd2987f57f9ccdb6a2b21659518108d762a7e51aa3b7e6705f4e7bb4ad2793228648a05ab414a75bf88c3748487e8a403d3240c3c02e060c34948ce4ba56d40dad2f10b192788aadb025bb5b619d5872ae16cd3842fcf974bef9bc123fbb966cc9b04961fa03cabcf1979a89510a52a2e6f0ea5ab65bfb1e7813c53d5bcc4f481981dc8d7d2262ca00d4a00e97dbef5d015ea1b0edd097f573c3cde6a36cc46e9a7fabe5bd7b4c1c63f9cec75349ae7a4a4177f7c3c273061dc88b7eeb32120165168fc693d954360fc433bf360664c7f58f03e69c2e3cad7cba6dcc69f17bad72519ed71180010f33dd472ba16c9110aaee569917d9bb84116895691beacbddc367463451f93aa79b826f015be0c851e330382399f21bbc28687806f27ed42ccc96944a3a06bdb8b91f376d96479789c185aef9de1ab11c943583b5a55419cfcbec23ab967cb91961b138e9568ff87e906e674235c9114e72aa0c6ad48e641bfa02bf85a31203af4c64563b428c5735dbb67e18d69a5f3c58359400fb12dbc9f8ce3dca7feef4835681e37f29637129c51dfd8c1388c652cc29d6f0a7d9bf17f6bdf79944878e969199659c6a8e5703b55bfe85240991118455cfe88cedc2c3b4fdffc96111f74ca509586bad3907cbeca03c0a9ca1179e95b4616ca7e3c42f799b237614bb4cf31b634dc8767f86dc80c281e5a355488b2f3cd14e8c052c8f2077fd261218ff650696661468ed2d6e8ed8f29100309a27ba1cce63b8f544f086cf9d6ff6d6db42640d02f36992e9eb9970be3ab43254b809be13b7a2bd4deb79f6a3aaaccf8f8430f2368644c808b45f724677b86b14cd0c50b324c38301c0bd07c476da2a9ce24249af4a58401568697027532fc241c9cd9f3eccb1227b9ee585db37a71751c4b6b7caae8bb1407b39cae5c6925ea7c26f013ba3e9befcb9aa0313f1a17a92d7ffc59136b20c3813b0952cff46857096b1c8919f90d7655e8af30293aa61eb1041d8be40e859c1e2cdfa5ccb523cc75191491d58cb4691db5ef7985bb5189a6fddd431eeb25a7b4f5fad1e96971c6797abd63bbc0c2532ff5849161a840768e2615690de4eaf93c1ce92d03f240d05e0cf0b008e8f1ba467e7e0b8685f8ce8b8644f740530973f90403474b9a481f4d001c29b22f96f1edf95487fc5c275bf68052a8681cf41598b65c8a441eeff117359dbbecc9f3e178ccad89359a96cce321a203b1bc3b9b670e6e4e5ad9da8bbfcbda57eb8b888c3752dc9610385ddf6efd32b802", "51", 0, -581511426, "0c0e3440e40c474ee4c7ac035d49cd972431b5d540467d88238e818e3c8dcfdf"], - ["030000807082c403011af5073fbcf3e05586b88d1d29e5d396a8370f4ae0fd210615541a2182ad583e0000000000ffffffff01ebca8d000000000004ac6aac0053a0a3b89de01762030000000000000000ecbc5f03000000007c56098de8004a5dbbd6636822cb39ba14430491d2e95c3729dc1fb07301d6c11fe8d13c289e7ea42ebfa48c806d1ed34ef348e0f518fff487b20c97567fbd87690b61ae453c600d402d11947574c6fa4c0289efa6fa165a0e54c3ec457d522f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bdedbca5cf2ca58b40940cb68f4bada6f18b4e47a32c3743b3ac3114df721be743fa2230387e323601389093c7f96335d9f1ed28297b32e93771fafee40a28a7090b9ace868b4c9a620b3452e5e186e282947d7493b0368aaaa01d05b4927811e08ea48d3081be749cdc7ed40cbdbeceb7faa2612491f68c2796e5a5db0344fb03052cfdb0511d54fecf9396089d2f07ad0af496447ec6e29be48e33f880d1a6ba021c6f586fc11660d4875784fa3ddb218cc751743fa9a05fb19f9802b85594d4230a0347f07775942fa04c8a9365e05d94f6b5bb389a06922ebe256676195be352ebe4170b683dc2e4de91f4c3607925a5c00a89635c8378302a7c599959175e98c0021525b8bd2fd0a9bf9d560ccbc43db0cac108f2b3abfaadec4a134fd92cb7aa45032caf7086a641ef053b16fbc2de6e7b30d426ff7ebf87fc3228cceb1defc9aa4102194d3404622673e166589a4bacbe92eb6bdcd65d57300e4f6a4886137b59b88803015ddd9b5aebc3a2b9c58bd6b25e5cefcaee93836ea4c622ced07da89a5bc30a02243df17cabc3370e338d34e679f710e6b3b2466cc56588938f830c45af4602bc2198be77327acddf3e8215dbe1b6da1d12abdc6f6ac340fd9988a682ce4942200fbefa2a803312e391587bb18919ffa43188478acd42754a7fa8b3ed16fc1cc303e56ad8656983403ab1670cf1c6b2164c69ff34181dac48e71744703b6fff1959dfec7d8f807d449e7ccd505c5617acc5eacaccec3f5de9b11d690b1db267b419947478eed5e83a50811e28084e90609552cca551366a7c9c33224242074183fa8bb8c41974b4c1baa643dafc9c353c08fea817e3a34721067197ca0df90fa1296cb252f0cf51fed7d5c1cee19a37b5eb16b883595484c8ec265b328124a41b9b9fa3c28e89ddd83a6eced33e10d022f69b8267ef9df5c3434b0bec058354f0ff065d9234e0cc1727d10fcf06fe0078a8b4558808a4ec4f773de0ba0b6dcbb97b3cd0e8707a452d32a523c9074b750794760e7f7188fa1f3422219227e9421828814c8d0efe6342fe8eecee63df34beaeb6a78771f433b588323218f168f0c7b2bfa0c099741e035b211b570edb48cc4e35c8ebbbaca956eaff7343acbe14ec0b9a3eb9fbd2e015e72a9a8dc8567b2319bce1334c08c71b8226214ed3f117d62c9b9237fd235ff3e8460d499704b37da97e1f7848f5cb9a4049af513b7f2b198635a35b9a64bf2a7628311c16073dbb240d3a72f0fe7a56398f9178582845b2cc13a138d5a824d6d211eca7ed5316b4fc00c04f944709ddb522772d1ade6cb74cc920f0dc7e4aa106adfb4e43f33cb7aa99e6fa704a1db2d9bac7a0835ceb30707279bce64bf1253b620d8f81863a50d78b487b656f46617c466191844df60d851df8f1491561d127f13f9c386a77ff051b6f338605580ebff7007a72df39a32b71a4fa4c41821eec978fd886c6fc1fe03c84d6682fb2f231d636b567ea00b22f104a9c6ee51db45f9f571d2104282cc4c96f4825915f07982bbee8c2d129e77fc3a2be0205e8aa1028c5450f2b52888c92f1df9a2426cb2e200fc92d8da85634edbe7bd6e38fcbc2b5bfddf9d4f9745974e213fccdf2c69d8fe5505afe3836d8dfb5cc37de4b232ef4723dad6850c1b3d9b23eb93f8309e3e775b114741dc4cba16a6537e3c8c36e84d8bb2421373eed0b4400f7cef42b6cb1b014102b802d600e066677e260953da1c45e4b2d843e5824ab223ad507adcd5410d54bd13445b5ee9c01181cd804de96ef77d9dc7e5b8af23ff5513f3878e314b88a3979503bff1c4e7b1c1d1a50545340c75670966d5638159b6a818cfafb1e638ae70472b73d14e8cb8d340edeea3421e943d78757368424946ab15f2fc1b47e7fa55dc983c878ab6b51b07779d98d5e22037cf5fbfddfddaa2016f7abef6a923ee57efee25d8257f492c2005fc3d24c81776d059b1cbcf5e4edc611fa6a8df56003344d73416b9080773b7dc5d2808dd26de7890c3a5b36c8934e213c884c0e4584cb803826705633807f430817147ff4480943c85ee2cd53d34659e69aa4d4a927677fdec17ff40784c794b3a24053471cb974432085b8ebe72f0554ce1e7f3f3fb2cf164718e2aff80ace8b09789a901456d958e456e0201f396a6c81971c4e542436077267200eac2721347337912524d7f610da71d9a5de8e66c1dfd1fa31593470fc7548b92f5c1f4483ace90d3e3816734b403f64c6748227866f4321f382961688dea1ab6bf0fe6495d22e82a385c538b51b890000000000000000e06d610400000000cd63954ac0cb527ab179404b0031d0dc517ccc51f3a3920d53e4d4bbd1a2b4101359422ebd64b6d167b1529fd2a511a13e1fe2e8d83a3662802e3b0f185764cd60af9a4e7b3a0aeba7f46e07f61d3f97665a0950df92e0e9e411d6ffd6043c7900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000282b1a300065d3dd412925be31e2c6cf5a02dfe47c43afca18a186f9ad3f9062a9a5f5b0424044267e3c7ac2a99625ad391886185e9f3a571c28100a3a7fb7dadc51362f4b813781d3f119bb5d23b5226c04223507cb9879f4cae92ce3dedcb4886d04fa0351979105dceb267c6821a19d2b2d8258d5dbcfd25d5665f6c44050020a9c9e8936ed3900adb42ee57de802ea7883188385083873bb8241f413e33537031e189631c45d80e8976e3a0ad0df9f71d04cb9f693d9ba9e21869ca1c0707ae70a0754bfb4a13cf806f48bf44cabf901dc26c751e3c6fc363d83f6a96954eb260c8fb512406e7004f88fcd022d0c081b1d6b9800f5f9ff226a243f365d7432a9a60320ec3b566f283249291bf2a4a3f067ac5354d487829607194ea41f1244a9a01b0330009aae633bf340872adf4c6ddbecb2f7232c4930d9a57a471c0999403b04f902163fcc71564dd574e8d5d3f29ad4452ef7c847e9f571c21812d40bcf012a8ff40205bce23d29c8c9e7700831aba3d77607d86cd6e89a3edb827f6446826993d06c0223111c38b7b84bd9d6df6927a9af6c8a5b75ca4246a5a448a71ec93edbd8dfc9ef55315a782f6f1ad0fdbeb563f66f6b7165965eb2242dc7055ea810ba0de2edbfb9c4a6c1db66ab8ee42052130bb9da3af6983b59b289bb9d15c401b844ebff9dfd0c23d3c1916bbaa2f0dcbbe7053905156657e24aedae9b399984f6fb426940367d4a1d2a6f42b01453bae783f9ae11647cfe32403ef0a756c194c73f08efe454b0e0d9bbafeddb78c7df3a25cd29fa02eff80ec8023171763edaea9287143b95e0d6b2ac9844c2c7b6f1a41227bfaf4595367bd717756787dd5ee84e2ad77870015e219c354c4e1ca7c1db78a6555dbcdf70df371e31d486216e9e30dd73d4d46932fba8eca0b8c92353fa8e4aa78c226a940cb522e35a8a7c8aeab781af0ae7750b3d6085ccfb2b11d1e248c037ccb055f9db90dc07e6da4b667876615f048a1953328fc8297cc3a503e123953456cc946b7e0bd65872737f4cf077dbb3c8a7b05e73d7de8ac28ecc05f8d192de809e906443d0cbad32ff5f2651fc29ed198a8b69e4c6114e2f4e8e96c0660dfd3218cc56dbd5c4030ffef6d512d3651d8a7b52ff1da6d696b5c638c3995577b48792b431d94571b4509f294a625561d4dada594595e77522e6406a5be8e94998c03e4200ca1f5745e918d28b8ac083b9bf30fc5ebbd109dd52605a31d9279d77419190d284a812cdf2ec72dac9951c9e287b7005c8584a016a314fac0ccb1b4d74ad2bdfa9854211c85311348779be354ffab34544ccfd8ca46f32fa2fc9e8070935157e8b5e48cfdff7bb6ef7e94ea07534f1bacf540d5b6685a610203bcff929c0b5cd9041f8ac55c463ae61e9f9b612aaf49f16ca25262a74279dbe01981b8f4ad2c4b1e8c75f72f1e918594eb452434ba9ddc28a68a1c83969a6e43b5728d06ed2e4a7ac5725e872aa5a45897e6caef8893f90a8648b27aefceef1a1c87a6f5b0e678d0a8e4699f6971e3714a8d3d2300ac7b7fadfcfba544cc87b19786e3541b1989ba1bd1f4f2afae1cdd18b4f7e36785bfa373ac6a7fbab1ee7d691a8d9ed1f804805bb535222f2e77046afc0896668d6b79f9782e1f2cc867eb01512ac1b78ad8107f9ec913a964fa907010934492cbe4680e3bfb93b8f26f0297182b89ebc7239cbdd48962c4ec819632dcc8ce3cd692abe6378f67e3188c7a8401cabf03e5215889e10df6d0972cbb18fe73d98d03b6d10e159e38663c98361763d2fc2355d95bd32369ce946896f7e6685bcc2a04f323e065219a66a9fd619daf419b0b4bd97a02f3268870ea1603ba003033e60a08e2242d3546ebaafd50c6481a3680fd6cad2aab38b982ea6b7d1605f31fcc5cd9838ab01ebef123985ad6390ad47c3b2c92b38fde282c1565b6abffd0a49d770acce9bb9dd706c0c4def3c5d1aa84c5056f33480087b8d4f37b6e3284d6a7dc23a62392f49dc0033cb2e75d2308eb7593a45bd5f1d07cecccfa52011fe581082026a177a27ec67137d96ec4becde50bcc13639464800aa71961b3b29d8860b1bd8cec1cbb0a1bd82a1eb871082b1efc8916be77b722b74f6ac6c45bb1e5828ba8747ca5b1c74846cf012d03bb56dd68fea9c7b21c831138908225067e599869cbca9bbc97db16d156b60464f0a06f5aeb4939acb26f422350f80c7334af4214464180b5ddaca680f702a01883e0b0e9a6acb1f6700b9a9fccf6d8569e84d3ab4708293bc2ddac3de1891e360694900000000000000006be4580500000000db929d50e00b2af30125381527bc62e9bd13709158496b81476a75dd22326bc0a65c6dbcd7a4e845898908ecf90d86f12a9148b265c4ef5f6ae6d4f76ab41f5d63ad3833b455c57adc457eb10d789318cd9d515cb25792f7836ecf9e54f42ae5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007054cc606cc70d75602d75307daa361c77bb9574c5442cefa2f419d7213fb80ca647fee053d4e667ab8e70d97a6d3ba1c787824b17178de9c7e433a3f227b0c24a438b76fe45d64d935968cdb8e410de02394f8027613a59c9042241ee7a753b4819ef534655180afdc04b6b6dd4054dc8aec33ba8110dac9a68c9f0af22a0860210b2a3ce1017f06efacb62a5dc8a4fdc2fedb4d21bcc0a2077ab81cc7587080d03116146053af77d4ffc647fda1d7fb2203789777728441780c6e44833f31447220a0683a4b16254b2e0626a118c58b12e437502042ccadbf94e33ea11f760e14d3d901082c7f78a074c77b6c38d44da060b27ce95f590eb30753d533b878623c5af0219b763b4aee8d7bf42d2e665e0704379a9beb932f5fc2289de7c196228f1c88102184409aaf5f361fc5997b587b92222a406f80bb8830728b99777617ca6b9e295032dd00f21e782e9e8e8033f5e6a4c739cdc9af0d0fba9cdcdf1f947cdfefef543021ceaf737ece4b13bb7975326b0f55ad89d7869af0fbf55fdc2dcc8b188fd48530222d6514e7c67d54bffd8a1264fae71f1a63c6eb6654d8d80c1c76ce48f066ba2b9cf2a256fda03dc3e58438dba1b1b06d1279649b40460f070173da0ba2d18adc7c4c536a4712fac139a74c00690a85df0652f74d50e59a4943a3ccc014d6d457bd75dbe175282ad68b6c432f1cad2ee9b61862f5ac41cb7f922954ae31b8786eda35ea80931cd89d4a631344f36b6a78280a428f5e330793b7757c78001cdd38663584b78a772621cacb880d8812a61528ceb5d67edbf99baec97c8827cab00f7442fcbffb617a6ecfba622e9e221f67803fa980bec276fceda72e640a9ed0164c0418747074f52623133d7d23d91298e71a56eddc92c72109e5535f57c8e6dd62b193feb1ffa16d1f97f288bac14f89de1a2178b44b2fe6f9768015f261998a759e9afca30769c65e833632f12cdcfc1b35e01d66b94aaa76213bc6ffd6c9efdfd0b2472b24e3a2e0d1bde78cce8c54e2a4f19130343656e61d5e0c0354af47741a2bc61bc47248ea427bcd72dc65025146031ae40765db3de87b4c979c4075f38d5d45444aba988bb87e3930317a4afc477c6477587ac9603bc6bf64dda359891161c75d84b9f71ed2dfd149f1915247c281be37c422c039897501fd3d2afe99cb59c03f1e555514ca12782a829a80390988adcbe7c4a24a633cd6afcdbb6cef962f4ffbb4d3d5e2392200117e5514d9ef264d15d4a2522f4a6e68c97e37d2c298be308b83f08d705c4f5e4a6fa4fc68d867135dccc66187ad0942f9543fec237203afabe6cd9c308ffc0005f5ed6e2bbc3e5a7ccec28639a8da0c0e2dfe377353442e895bd461963c17b1417815a9fe8d7eb0a377037540062151b0c91837b2997c2102c8076000ff21564e9b305de23a90aeae1d9854ab6b5580746bcbe541624837731a5f2cf2edab3e346dc35392444507aa067abce734c6a4a8e337eb5cc6aa6ed93e9b1b0abe0717f72dea8891a2f733ae6b68bb81d01228457344b68ab0b9eadc156e613bb7beb81d2f334c8c20650550c378df79c792815e06d05fa9138ca233cb299536100ba10e3f8a3d8590489794650d83eaaadf710922e0b5f8155482e381e060227b1cb4d66a95ac78dd097b862eb3f97900c9b11a7be181eed1fa8efb205dc165bbec454389cb6405b13530f14d46c4b004a6b4f403711e3903ec9a63b545caaa350b21ef4867a2bba4be30f676522defd327bdbd9f378eee8c7a100c1d4ebb2324cf84453b36b1e1f7bbbccda44156158640b402a4f84ada09d7356bec80f1966dbcfc5c78715481aaa72d739419888eb736b66c39625ad55d9de87c533a8c3c7db86e1a9d91612834ff778d33b2f0c531bddb8d5cc814b66a8f6dbcc39f620750570efccfff7b5cf9b9934f405fb2b50bc2634e233e97fdd54d8aa8f0aff3f5ac850d7b8045d357f785a2f5a8a5b2addbfdc9f184f1a7e5cb89f618ba54920ea9695d0ed68690cb6a5232c1dece532a2d7b4fe963b95c288931fe792820c77da0396ef1c2153691468328f9a737632dc0ed617ef323f261c918f0a5663dda4761bcd2aa99a336f68cf0fc82324687525854b63801abe56f0b51cc54db8dc6acc9c2f00fe3bafb32863958a69002f2c38744ac6c419f23a792b8e822d6d551b13746465858e9d27f3a7ac804839f96f35e7749bf59f526b1a2775314c3f20f300817c34c6356df6efa171e662892cae209c30a5c6fad5b456e9f7a16cd6e91924b1dd463ca76de9bfd3ec14bd89d2373e0b89c2c50ab7fe7066dcc1470472ecaa07cca2e3be7be20262e5289ab7478b860b6e663e62a0b184fed0cdb49e69c4da5e2a3ac5adda9d9da8a2c0c30770c3e1fee78f23a80f50fc9e157f154e8fc043950bd1f38177770a", "536a63", 0, 135471245, "1d296b7517badd603a4511d102a681a6c77684e46d6229d67590559696f6d744"], - ["030000807082c403026a02eaad3bf1bd750dc2b5ab3755aee596aed0ea8cf463a9accf0c2901d09bc60000000002ac6a8c8cc93fd5f8c14b6c27cd14dabe4cf584abbf328dc68fe4c3d78e5a1ac1c5fc508a5e5302000000066a6363ac6565afdd109f03795ed0020000000000af4b39050000000005006aac63ac5ad3500100000000016a000000006d4d098603000000000000000099372f010000000014381d2d742317dbd017647d70d320d931aa2997df079c0d9d9b68e90be748751e28752d4e19656e3a973389986f7c3fcd9616b6a73636a0f97ea2b62892e975d9cc81d7eff66230cf48cb364779f74d35daa102793469a83090ed59725edecc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fd4190bc0cc0190a46ea6784432b5d4c74ab5b330e73f41c66925d67b7f14e5a33e26868af9fbc531e29450ad98d0109bed45b3adf35bc2cd57969f5af8fde0bda8be82dd71c9f1316b3de5f622b2d9df0e5cd5ff1362f32fff3cc99bafed2beda84fa2097349fed6cf6e2bf2cc1b96a8027a49518ce7a67e45c8b2d227a710203f567b29e940e330e59ee0754a270339a0502404ecfb00405df4b1a5aa0c058021035bfd46523c3273c559e836e9cff95e335a500d0eed4d6877e34806c7696490a071c7a39539a21edafa139adb0129536ed736328b6ebde064af43832ce8c5294d9c485540684759df279c19dea358e738cc11e77d61c27e68b71694aefad1cd7022e740e43b5877a3fd0bda8908421c04d69c67401c8d460afeadaf595574aff11031ce9e11e67ffe45ed4a1756c50694de400e7b581fb5c30d4663882b486d2129a022648029bc1140f1b275b6af72c250deec810ee298ab4ade7f86887d3678deb6c02082bd4ab04278c9af7f6cdcbe1de143e6fc00e6d02387c630e1440fd81fcc4ec0212451546ca1060de057141b1fae2f7214301d05ed2a408557a8a52e28682c49b369cf5d630e13f532fbe23ac013aad4f0f5078c526c80e706f32758cb5a7f2f62efc6ac8f52f7423fc2882a1fc5aba995bd761a948c51481d844ef91de5704d58e747da8210954364ab6e5cb1b415536ff62e82d3faa06005d63e09ab5b2d357c867a0f7d0f00ec958431a7b29960451d30f99827211a3c7ceb1ee03043b35fe22aa52b70787f00e9addb1c31274c573b08fb0acc3ef5e700aee9da6543eb5d0638101b1ac0a58c507d9a8f2b280ae5392398bd9821986ad5f47f99bdc667fbafab5cb25febb9f9c422ee93fdfd88f5cb01543fca542095ca8f8c0910fe1bb328aca0e835c0dadef1a7d22d8a96ac5dc2d4296e0db5d459d2e135d2d94c03a3d17a4653520395d60c62766a7976dceeb204fd0659004a6077c2cbf19497e29abf836b32e30b5bc4ca3ad5ccd421feb0d54773e0f4b0715c68bab1c07c7eeb0f2408e97ddb04ff93995704804e691b30c3b54f5a0483edefc1421a2f86a535bdca26c5b6bdbd6b5e203f12fc824dc86de7b509a566a2fc0b58ab747f8a0d56718d22113ef26f0eb46ef4565783b73cfb28d49bff98e01c92f437e528e2e83ea6c138a67a0fcdbbd0f6d75fb216bb72f5a5fc825038094c04b955b84ea75d72b87a5cd084f4fb50a89d3bf7363d04183349328c20cdb3ea58ba7c11cf9e99f72dccf4daad6257b8f039714c27f51c04d139cf8a85502e66b47c25a569a1fe30aa5693f3224e2c0b1adc02e21b3e96aec00cb82b044d617d9c2675c744771540cd6c97da6d3db7153d6f0be53c5ef651c34ecf404b1fe003b68f7c2cd2064c4832777e3dc4eb8df8db8e4f98b292eebdb49a6137f3718d070fe4ee4984e5663b1f0fe71e2621deb5b23a0c78a6f534202166b6bf25b00252f583f5b33c07caafd93b608a6404bd3064797bdacae842458b2eba84828ead58b8d4ce56abe5b81ab8d9c7f05fffde2d3b5c0e4cb9152d790952e80f68313075f3b774ca693e9bdbbedc9ad555c599e2559df7e794a605033325018a9573b81892bc29e33c0330cf438e8ed5c2f059571a74dcd81ea200157fefef6ebcbabbf0e736e4050d9b939f14e0149654825212ee7a1a1bbd09bc24284e9aef4c55609fa67476c723997330f9428c831768b6ac8e7ba21240e4a57f38dfe11174e9f66f508e8bdaa204d53b50ae0264207166e95e19f6e5d9c7780b0e329628410849869712df78e95d2ef9e332464092c5c4bb21b92a55a5211d6f77d6fb7d1b97314f7786fd3488f1758d904763e57b52e863db9f39a9f8e8a396164f41b4d7a5c1a2bb7c39c26a11e78e4de0d40f6e485c48ce1d700ae2ef4c6cc6b16e82fbec1b60c00465389d3d6125e641171d3463c6c99c37b3a1c92fc73ad4ed9e9e417960f26470b7dba5bb30039beef95adc981edf2f9b58fcc85927d77fe602e3a65848d2aa7bda5467b25b0dd828ed206bba9e00c64d62b5fa5805e472d257ef6b7085cb24f7b02f864a85080299d244c15509692d465c215fd6439f59c741e9107ffc56416357cf96e3130a7790c2fb891ba90078ebbda089454b1f2de85be8ac947a864c68344660bc4988ed8b00262aa52a80a03a8432ec6c0b454ea05f7640d602cecd0144f117fd7fb787f7c5f2309ac35654cb5fd089b1273d216be2c444e2ffc3faf2b22a583240c9ba2b5d0164f07c99e6aca8e4d1694fbb727505122b5b3030000000000000000000000002918fe5988bc08dfce2c767fa95c788c9b5044d24354d3e15f926ba2ee9c2b01c1dc35ddb3b155a4301d5ca98856c30a81286f1c553a738d567cf9b6f217c20fc609bfb8dabba216c96812a5364a4764aeb6b947ebf2fc4d51308e4fe4d5e25000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000be942dbef3d09889588ff44a373077172b6436ec7ff98ebf70793c667e691ff5e6f1a333ed71825f28ff7eb2b7c02c17f2aa402d6c4c6765ac1cd01001e7739ed81b1a578edc26df24a761eed1206cae36a2938aee64941076d875c0a88edd2f82b623145304f5ae53cccba69ede073555212763d13d6680f7e6f94d3fbd8f75021dd427e29a54ff541b33aae0e1430f418bf7dff2ddeedeba8d558912b26161f2031d7b4321668303f140f94726d21b0781ebeae3605e5e75ece09b3acf89602cdf0a02b35df7f6f48ed95aae6347d33eb894edf58abe47200a7beb2279b01d13aadf867d5746c6e7af6c26a4da52da19051c6419bad6e2e248c084aa18a942c5f594020d686a3f491081d46fa1315e82f9ac01ed998691c174429ba0b1358271eeacb802124404e8e884578fa95785744536f590a37d76b689d164b8bd7321dd910e6308021e9afd2706f259e931621e52752dfc1e76e664ec9c02dfe2acf5ab0be6dfc7f5030b2a83504e0a844c0eae43e37951d72a167a7c93f272f9b7889a7f7a42db6aa5021020fe16da6a9650ab3eba935e0626796a3ce2850257b08159f59412f587b99ec52c19a25b8674ffcac2134f9e9b2f4a6404e4258033bd5f88b4ec2ec1b03b98f84bdbebc473a847d6139d86657f6ad092c943ccc31489ce48d1c0f09b7c1ecb61079187fb8ffcaf844d1d898fd676c721e1aac2b9967c55c2c5f2dca29b6b5236741e681613b5dbd24f8a2de801e8d435e203597029369d0a3f144950aff8b0d9124ac1a0386bcf372276093fb211d96e05b87aa18cff274b0f5db3053a9c88ccc3cf2ef920ed4fc6bdbabdf9012ed729d6631a7be56480dbbfba9aa1d4904e4e41b8cf8c9ca031c8c7bc2ab23b0f48f960d00fa3835db936c1dfe2a8b6bbb9658bb3732debfbe9a160ec52ec9a983feed33b1104fe569f7562cb8bcac09b1721151dea7abc44cfd48f13fa16a17a2aa8e2d43eb9048e77b85bcec21d8cb2288b24d0e040c1743ffbc74f34f888850353a424f0d310b8a175c06d64db418ca138772620ffb6e939becc086864c10c479b321ecc43f5d4401981a9b5c89785bd665448f929c4cd23ba9ee3cb1b2ac83c13e091c250452c8bc3a3c68dc424a8e9f20c9da45dfe4c03fa9c20b24da01689938c7a8b19af5f79bac0c99b5e37098a53ad1540c249f7a0d9770558707ec9d75b038a77e86d25ee71e3fdc1c5626602e22553a36df04ca2b676d188407fff3d15eddcdd650858686e39f1b7f545ad32d357c151e2e1ff530a71edbcd22da8cd8aee7d5331feb9fb436b4b485ee4b2ed284744d759b2e97dd0e8629805c5535d4c438400a397400d7c7eec9b7518ee068c16aebf6aa76f7019fd9b4483e026afef7b6b2f4029259ad92f5f015d5423ebf58c6f140692c1bbc53687dff6ff104f35b1cc605c0871f1cc691f2f084eaab6dc2cf820b7649735457cb6af2e7b443d779822d5fd7ba751b9d48827f3bf15b31bc16575ad873ad15d6397e64953f7a1b7eb0da22462b3b8ab884254308117df7dcc48b62719c27cb4a3018b9e7f87d996f06d0c38c0659875444eb8403e35d1db6eb518168a9a75f41ab88018ad15fdf09499272096dfee0ed6e99b9d1dc2565dcdbae7d4f6df27a00631933a4c4598bd036fb1109488f1cfa279d21df443a7ed8c750b6576bcd45aed59d521c99364ae874d6a13a9e91bb48b1b2094fab931b383599032e0c2069f09718a00c5605d13d54e6dcd9a1edef27463e166f509842c6c043038358df4092e2ff715dbb89943443d3e18dd47515a1c55d7ab3bb509e583bdcbe35f5302e07ab6cd4ae49749cb1556d3ff2cab59f61f9823ea22ee80849f97feebe44b9ff61b3af9faa1bda607c520a090b837bc9550b9e055558a38e66ab146f9c85f7abfe6006843f53bd8906d1fa34bb22b4def64d33b43daca3eb1821a333ee6eb825c9cd1ac38ed60e6ca3c00d05b7b66df738481e789692ae1c657205d0d51a13f3130005477fd86ad9b98506cb5d2654b6a46684c113ecab1c58b498d020423f5cc4c2a7d046b0fca306409c259b13fbfdc87245a0b9393df3586c056bd8dfea9f2120a70fa464f2f4208fb8ee0e6657ab05a2ce00c2149ddfa71fb764f833a0133fb8fa1b052b8188dac6e7bb708c63fa6b36f31c9410d0a75f829aabefb8d8b35735cdae1f73c9301db36beabbe62f56cd1e13147774235b743d06127489f50bce9a9275bb4781c63d775f48e645454adb5026546f724992ec5b9938527d975df94e55e5e16c09490900000000000000000cfe9e203000000002302b7972959c8c39d631b48447d6e06df02da8d5c076c6bd8543ae9b367b2d60af70be87983593fad4ca53fa7b9a4f750b1694de1f076b074e82c6efca59dc71eb9ed585eedab05b546c72d8ea81fb283e3ac8fc6cfb39337994414e3d266fe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1065512bcd8d6150e0c6a06067cd989545fc31d7200690454c96437a21963903ce166a3a3fd59a921015e6842dbc2b299e9c4bf5ab2da5dcf02369a2c7fdceedd6b8189ca2c8d7729317fe27a9e4b41d0fde188029167697e7ac11aaa0db653d2344677165fbf00e2c2f24c431bd2f4daa1a44ca0ec580ddedc43c90a0346c9031e2bf9e3ff7d83e89881107763e5edd9458352fb0bbfc23197bddab6aa618e8e03224ef7d33ac70af47006ed452a9ee1e888f64a39dfc9f383807fff43fe7976e50a083b4b5ff36c6e43dd5a5b54eef3f2bcd9ecf634baa72efd210caecb7e01445c3d127e8012e387202fe9790ba49693562b2060e697bfd70217c3c9f248e8bef10307cbb70b4be4414492be0347b14927deb80d680d584ca9ef9405866f6c3bce6b0200d942dfe164b564a4aceb487f1b491df3abf570e039b26a7bc65442e422e187020a0194edfb33cb76c0fd3af2c77627ed051a6a8d229f191409af3fc4c6d3837c0329dd88eb4be4c7839c3fecce7657bb775f948ed4fac1806abc769640ae117911020dd834ca56e0b87134281f3a7f9d4c12998c4d88d5b1a5f153aa96835988280b69dc5134df36f6264a1ccded432523f7dc15716a115b91b448657d43245e7e6fa4a86da8c6bdfc594716be1482e1ef236931d58bc7dc486a6f369d2078078a674d117e00a59b493002be6b55d8ea3489254675bf1a2f32266126899c1fb0f81ce55cb638727bc357465d13ed5d409c9063e1d1321724a260ca1bc08d53819ffa5a8757be92d3c86c3d4c6ed03109dadb0714a8b3eab6149f4fbf2562e6f7af34f58efdfa666a0a2c070c195b64838454f47a7c6a30a6a36a6a480e43380c4d7ad4bbc8ddf23eebff482d8247c0d91d383253d1ce98ded34cba24c41a021cb23a757e8e6fae9f258f91c7b03b77d641b97fe379231d4851c5345aef8757b5d815f50d3b6ce769b58b219257bd906c522736db327f7d19a15e9b5b0f6b642dfe7fbfeee9b6b1b0c260f2677ca55f9e1f1dd4f9a778f3fe97b7d6f9380164fdccf278a5fe6d644cc769842dcb930cd3f8df714aa9113dd84cbb10982bfca3ac496f8ffec0f2efe72bbbdfbfa18bdd32aba8b880a8fd2e52642123c513a3cdab915ed209b667a23e9d08f03fe37e3fb4dbda5fae8c3afeb0035a441064b949d84fde90224ff9c804f92576055a23d86eed7325275788391521329c783490522a872a0c901915fc817e07c1f94c81716076f45956bfdb88d053ef88fca52f800e4d30b27b2b76a96043a62b3ca5589e36b947762c7924bc2dd7f939304fc5f921d338b6b2712e332598b6f790640c4b3c1c199115eebae835f8fa62152adcae7cc3e0da9e6d32d732864315972874851ec7f6fcaa28feabd8e8517be9d772ab7d38543e6d73efc0e05ec4bdc85cc29093d9f607fa7061272a03a2bb278894fb19464979dfb2739d74c665599bdc53ff3021e49413f8b6c83e6ac800029d66741bee2159a027cd7ee436d853f3dc1e44fa41fc124febed3cc598217ecf44cff18d9c244bd732425cf44964e945d261ea95c6fb969dc3a07bdc7f0d1a0b06ce447203abeb3babc0d0f86eb71db10340a242df2093db45ddeaffc4b8a546b578f1a11d43db678ac3e2aeac4fae4448619bc1aca5797fefffa265f664cf463e7eca40a479208eb8755d4ef873223a88e1d3b01bffe9b8ef22c8e16ce665260a8b300ad27690867f012ea254b96c42c07c437e36f79bc15baa00b56685748e80bd41dfe4f0face1344f78c33fd65fe2b6f2c82f2f19d69bbf2cfbb60a480bc4e4d93c24185e35e8537b90164cbe236782bb8cf25778ae17c7245e7f27be8f53c5a72412f9e0c4734fc405c4323c342bd5126e775fcddccdd38af8b81481ddac59a53b5f9d028c97ae1bf1c7c8a0aa595de4c0f7cdfd9fd12581ae585b17e458894a42c349d37ac6e4b78156e9bd2c6f6bb225fddd4f2aeebcc9e2775ecb77f6b49d1d910a429a32dc19d9ac929332e474119db468fbd23dfa6ceefd3b8322f456f2a3fb0c876a0ce76846c4314e34e34c3096ad6738adddddf4ebe2c2f1b0702c1d0be846024a28938082d3fd61c598acd7d80c61239e07c45cf873ec92724582acd21cce06330335c3233daf9e437253fdd6e8b65269e3b0c8659129209a14aa2b41debdedd9bdd683ba3554a334f728b45ae2b4af6cf935f78e098d5990938daace0892b2f40a1cb365edd17822a37924e97da4cde757502a1884c49166d79362f22293151a816d67bc37b7a25d03ab0799cfd17972ce61b65f90a238c5c9693ca7cea7ee9e030d979239f1639f49e91cd170d400922302329029a9125474e52f82005344adcd33bee3e3031603b0af0da2c0e6f94e30357ab02873fc9770d1ff834ba556664d8fdb3e6bbab8fdf327e83340a20570b", "", 0, -587207431, "9d7047cf3b32da291f6a6d08cb48939520d7166a4d9e5ce89e73403b5391df11"], - ["eeac0b74041626e86be834f49345edff1470f83a0e677f5d47e95875dab372147b9944f7e5020000000965635265ac635153acffffffff0f06918152c286dadc9d7cac9dc19368fe68ff2a05e28a5b038660560182759102000000096363656a63656a5351ffffffff88408b0a3e02c9a14c9200f6111710f6c1a15cb5fc2ad9db45e00c468903eecd03000000056a636a515263ae0856b62b22b5edaab3de78b4df925db011db07c0c014aec3b89be243fca49bdb80960200000003516552ffffffff018ce208020000000004006351ac0000000001b189d905000000000000000000000000d1020bca2f418328b43cbc27555332c914b519e21a89bd246b5308d16f1ffb9d3308678a0204bf2736c5c37aaf922eb771c90263f38e50074d6984d9f32f579c35b104663e94920a6bcaff8fbaf1d5af0d9fa636ebaf397a8eb5282ba82a484000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f612a7b1dcaa26248b1646b172982fabbb80b29fb96c7483c224b60a3bf645e35beb6ed732fedbd128c78698431108eb950fecb4086505a439d942c363e280789d9e7912c4b7c1b31d6de9420deff948908963a31a490eae046081bc270ce982053b038101828ec4d355327926c16d29e25dd9f8b9f84fbe171948c5f41e343703302cc701f1150c446f41072549726ede624ec357748f076bb2fba79b589771e70314f72153168eabd27af94887363a93c148430ca8290ba87e742fa7020504f0f20b0478de27cf767d1e2050ec124c17091494137d8e6d9589a0abebc930cf3e4c2e87b80679df7e57084f53ba8215a01e6d66d3066313722fad07586808edc5fb4302038a15aa9ea52487bb049b3cc47a77ebbc1f16e3b991f605c670c543cf59d0c10324bb03ca558a46b770d3660e5e565ed14170054d0376b0dcc3a6c72e5ca1448c030bbedb88dc64dde6fce9e8afd4b99544e5d932f4b06edd48f86c9603c879acca021fa8a873a40d10ecc4509061c409a580127801af5e63149de96ec072c3ffce3d03260fe06b3b3936b464ec29229c7ee303d8e0bd9a8ca5e35f163e98769187565b693eaefca993e0278595424e369e08518d26ee92d5f799aff18564cd2272be2725d24c01dfc59f87f362380d90b515760196f6d23e47d049670d6ef82a35d9a7d44982afbe8299650b7686fae901c59980a0758e1d0f25f88022f882e16187c54a8876049bb816f8ebe8befd901a0633c1a8ac2bf34989cb1222d96a693f361a283ceedf39cbac9e9f8662935689c0708b4e15fec749f1eb8e887eec29c117256088648a9e26059d3e1e058d860831693321975aa9b029179611b5ca71207e0f5779614f82586eedec1f81fae92c4c09d191bb58bc4df96da9ceca30963b7e910cd3d5a998b34cc1ac17993b4b6a728903e117babb4360c5371c74be13c427ff5f7695baa695ec67d5290bfb8c6d0f97b226367ebd1e1c3de15597f10a8efc6189c04e9808d44f0fab5c5e27e770649d6af03dbc5347255d6138beb95325ddaf43e1536cfa2e75c2d48cf278403faa2678bc2e32b6cc00f18554d0980858a0a518269da961b500973e606f78af42c0a79e79c712eb3e1f8e3c3dc8041f7d976c357e3547199b913940ab37942a0c4f7dd76ec16bcb6a6cb1ae9b5f1ec7faa06cbc5647ce7d1ccdd7a65c35f81b48744e8e72165a589e43b61984c64e2490ded11d3c1d462ed23e88dea0acb5685b510d17a874edb1a2a0c6d084f07e92327c8a35643dbc93300d883bb0191bb333a2fd0b933b9aaf555e692442ef815f0a0546d44a8a63f55ab718682f0d96311bd3b2d34c42d9ebcdc8f868c38947f09c3683c7339db915cae2edcade7b764ca6f904183a8ed78ccca6e49427365c380beff51c8c39cf10dde13c2b350dd9c53953202a14272f97834a082f5802d749a98a35546624a773293c033b391d9e8dd8a663e96e4bb12c2d81f389e0a082ec2b2c5c421b81961dd0a7cbb679ea11adcb787a679589538f3f5ad2dc3e67a913b7ac6a971d3bd7c2bc93e0ce640bae10cd8ea945949de6eeed3bb95356b9c64c58a733c1bb6acf3c9454b68a962e2e65b2ee441c8783faf84d004e03de55a583021d04d5651d63d16e28a0943e7268af851658aa02d777a0a501827560df174f75ad3db3dea76f4d0299c488e1908195922794f12483bf3ca361fdb0070018a173b1761edc16e5a041a33ad6fc420dd28bba76176335c565057193e3061dc0f1be3e1c24469c3e41fe9c881e46b340a658a9fdf5652277a8450061343a7c415fb4ceddfaedc1cdabfcf180154e77a9ca27c7fe8a08e7faa8d5531a243d3c7ddd0f40513daac25284b321e5f9eaceca59cd5ca31fd593d3d12983b444a5d3ee412723bf707ab97a3d553cba626a7142869e655bd54578c7c351a3adc92f3a9a6b6944d4d9d6686e9c61ea8e76d3e288f51be383f29ccbe0a1b9a25e80e0da815114f6633c7f71ab4e07ed5040411e20b765296170844be011dab1209b86448b8c695af1e3651d0c2f9049d8b3ecc79ba349d415bcbc77dca05a250d6a4cc1b8656c364502a87c8cbc703f1626002ff19d0ccd14e07c2d982bd5e3d033d5b7ccb61ec989fc52c81e2703c075d9ebac60a403749ddbc5046f80888bdbcae1d1bc811b41fdc0d8d3952d67a8cd78214aabbefe5e1e95fb7ead9ef07c9e341bc29579f948892cfb2ed61aacb7089b5d6285e25fc753aeb859ad9e9b0e416ef2368f8c8aafa83c8c13c90185c2e0f2fb064dc90fa57154d85561706b4d980e7fda0dc6fb5ff93951e7b0b3f0cb7a3e627a85728ec1637e632c898e52a2afea3a986eadae266edf16899c88b0b004f6bf6c8d1331d27880b26eeb0894ae9145c8978814c55e3708017ba465541755a222dab3640a36b1c90c", "63acac6365516351", 2, -440674777, "9b91b45951b298151174d187d6a562a94eea542a8e29defe8981b43623a61010"], - ["0d2f154b020f4d4870c7cc72f69d77dbb8fa25ced1086d3e906f1295feb367d11dd83c7268010000000151ffffffff5b208be11ac7407a7cd809671bc7bf22a3e83ecd38f321b238fa524fe1df489200000000036aac6a7b86c089041f72a20200000000075200006a526300b081970200000000056a53ac65530e2fad0400000000026a654c446802000000000852ac516365006300df06e2e700", "65655365525153ac", 1, -154224523, "042b62a5eb6f9c2502d268b51561904b4ae469f2a06b03ef9bc6b094ca9b4075"], - ["030000807082c4030100d85c508c575ff5377f677cb15c53193a884b1974d7ccad6abac95ba86e83ea0300000005536a635151ffffffff031a975001000000000600006a6565acf3db7b03000000000800656563656aac6a85af5d000000000007535263536a656a000000000000000000", "5152", 0, -1753285611, "decc344658ec8ae88090b0a003d3c9393d2a18c2af5a35e17cb7e8eb6f17ea42"], - ["cceb6f64028e8ebcf2f0a534722b9d0b1dd8b7eb6bec0662589a1d6bcf915f2aeeda763ef6020000000251000a0775c37f08946427ad41d071222635fd800e5b204ce026ee4ede71a964beee00524d700000000000f79e73f704b868d905000000000060fb31040000000004ac5152acd6da470500000000016a555ad903000000000351526500000000030000000000000000db2225010000000053eff9ec04ffac080e90fd2fdc62112a4aa5b480cd066eaa895053379852c6b58fb8e7b8e2da401be30a8e864517b1d823d2ebffb9a33fa051340797747da4413cfc691dbcf4a45ed3b614e1283ab709cecbb2f8e6cd8495d1562a9fddcfad8b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002cc4177f4d336314a666189c03db799112f1789092a73cd12e5e00e3b964435289769daa6cb12f2a27d9e96f586971776700b734672fd325db0bf25e3f9f1227033ff3c91bff04cad74cac819cbfc054c2b0987e3bc1377486397b54157940d6c3a246482cb325e832f8b5200a107e64072726e15ecdb25a7cb644489a283fa0021c34092edd22e277bf91a296ec8d0c942a8bb80108ccb40a49538cf5ff1847310309a8e3dd914b0fba6f726e251a200926447a270bd890cf1a0d55e26259f9da620b08523803e9338d121509c976a735af16cb4f8abec7623d507a282904727932d1ac3fb6421286ccdaf6baa3c6006524a3090bc6da6698654e81abb34a8b1d023e02034ff8bfcf13c56e94ead303923d04c2084358eb83a8df22ed4710d30f91d8de0316da9b8beb556df5bb6f88ca83f2b89cd6d4eed10bacbe73d1e32b6f1704323c0311244bb47b609b72f792e6fba8a0e94010e8bcb864b65470eabb5838c6ac303a031d7bccbfa26b602ddddce1345db24d17344f7c38f64de7914c1835d50639cea3020a3c0d8a282fa17a8444fe71b970457416097c5c2e54be42dce0ca6b03186e68c1790dcac3996da85b1a5ac7eb9cfcb997a95ce262c6df9450c0e59e8df6a0306be9c5db280de424a40ab13aa00dbadd27f2f4c0ca48c2cc1d6268bbb6dfb0e12058f0bf593c18a5c0382e1132d600cce613433147b546093d60dcc70a2aba3c6dd9a99789230ecd4895b520784e531ef73f2a665d26e65d33531dd3535497078f1a0e3f041518c30c3db2dbd5b9b82c0c83ad99de72023a51777de1692cd1f1999ed0f5afb3a7e5ffa10c94e748c4eb52053b2731dda5b7cbb4f3c5cdd109c9eb692f6e5a662d0344e15100c3c0c9c4418af74354cc370f91300bb4dc9c333d7a39e4aeaed807a5d6a9e714ab6ae89659f2b9a3d61721ca98dc989d9f19ad3eb187e7533be4c17b923b7d8def9dc402c93087af803104282ae5e765f2ef4f2052a1b039a11def7ee9b13dbfff17db1ecf7483af45efec5687183c8299a26036ff41ee87886e3db3edb70427d6ae6db1858d551455033e03504a3b93da12e2b486fb693d1b756d142c871942b7fe50bb19aec79d390e4fa190c24039a62cb6f49fc6637a4ca87afb4638cee3e024e98c38183bf89d28acc8f048f8bf0669bff15e5b96a6553948b610a7a7d507be8f594eeca83ce0284e73095f566e770692c3e9db454fad6fbcf03bb51e8e0e503d13573de578900d3521dab9624a068bbab6736a35011749338a706290d5226306f6ef13f97fc2c0ac3cab6930044756a6ca91eff118f69996978c73590d9bbccb461be8ca3c7aaa0138af1fb70ebb90849f8185a736fac4494e54c25a8ef84a599027ff62e572a8cc0e3d8dd9696a87cdddb35f2c90000848a32ba17e050c5931c4bbdc751178e9cd15db1fb306f95afd45850a984acbf101eca209cfba9c6aa31a424c1812eb23b1f2e167b319930339dd6c5731773c3be7c453a6dd3f89132b703032ed557ec7175a812ff97c2f718ada8e813928531e2aee7093e940155ded4b3b545f798d0c2ee7e95d9f02263e2062b66195f6718f9957ec292c74d4f609d95d50cd2bc551209e0771c4c64a241671cba6590a50708b07c9b3cc6e374c35f0781ed08f74664432a105ec920c351386efd284e937b189859b7b7a2a0204c70f2dfe07ec71bfe53c093af4cda4d5d07aa8cb0f31714a7ed508790039118d07dfb2df18a7e2568c7a0b7500abd9c076597c4dc2f6954ffe450eed104ad1ce3a73eebdb250aaec5f637f8ac158f9482edb972cb7309ac0343cc197f59d0b39b794c7f55be67b9e87abefd9abd0922ee3da422856fe88d1ea63c0444e5f94195fda7282e349700c4ed321fc4f0dd2dfdd9b4076a7bae42d2499330df576e1ea5b26cbac6b3873b7e66ad87aa8af035f04d8aaa4265f720d98cf8d08e8bc2f67389e255b8ea958c0f3733ef84773d8c9c12cf6f579cde3292c9ca7f8cc9f2158213df1f5672d3936d41bf39bc57fa30b3f33b757bfc24d74dec48256d22813d821fb3c5d8b1c3d9b928524eecfd40cd15f75a10b5537cbb60e05a1e748bb35af0ec14baeac34bd50f665a143397cf03a2c2ea3fbaa12fa43e31f4b8d898b896df04e533931f4d573ceb2a7fa3d4a3283ea5bb7264c63cd0417506c929d87f76f8db055438313f6068155f2693aa718e4640f7961b58d262ba5f7494ad3bd7c37f1d3b72a79b33eae8cc04ec65885907ae83c0ef0889679fcf97e68e54caef203043a893b342be604000000000000000000000000425ef32ad3f25ada191ba2be3819b75044f499a53851f1bb94b811d2adfdcbdb90bdc7f29e0b441b68ec4ff689e3011faf050c1e1255a334d4ca9d9e54846cf9f5d547d73a86f0c841fe5d7aff8287502459d6103648ed8cd7867bf9fb6a912300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d96ad5c27450bd2a87952b41f56e02d9c23e79fadfe5a77c3e23135f96788fcc812afc9b4777c34f71bfcd4b6cf1d767e501dd5d1a455d48b2d898b1418b9bcaa12c8419c384d05c9fb5d15838c62f13721a26ab99f167ad8f1c2a17fbaeae354c621282887aa2d94391976626d38008dcb245fc96b006a91412734a8096dcd0032b0c224ddcd8e117f15ec482b0ec7ef22b7a58110b03bf6a9757edae04bcf79c0210ccf9aa798fcf6968907b68fe308c5dee7cfef0720324243647a7d8f852d9c20b0819e03dbb17997eecb72e4ceb4e4eab690d3fe2c966062dc1f92691deab67ade563adfec5862166bfcdc1261ba19319fdc45b7bf91dc1f17e171224e8dc36ea031e3ff0f34fbfabcbd8c57e91bc6cc1647dcf14d824222a6f1fea6d1ac37f79f5021cde6fdb375e69af6fb5b3f5184312f9ab643c7412a5740345c2b7d4de94d59603136963c058b3a2906067f40702c57bca265dc83c61b153ebc44ba2dac2c3d98702262dc6c568d436381ea15b4978ed13910345eee12efef3887dda21e310ca032a021812567465ceabfcaf6cdc0e8fdc7783fda0762e560e62b532d659942f75f20b7fd4aaa804df881b787eb4696cc3f57ba88843c6068ffdbeb00d0bad93bc3e92fb69f2501cefb2b151029b7a10eed3e499f0b61732352722da0918a9cbb80a7f704f3543eb952ed4224d8aab187eeda3a66996002b9c4c17e6f1f38141ee6eb4865e2c86175d234e86a007ac33f99cbd2c28c7c5c88ddca9fc6da1888913923bb0ecded5af91bc8222c2e3581b5b726a0b0eeda8c4155ae9340e709e54935da8e99fe281f8404f6a1f361c521b56ea628a7bcdb11abc883111f5c8ce2b73ea9ff4e9b49822428ffaa9d8b559fb8fbbf0ec68539c95ac55273d9a2f04998efc1bc1d572201fb0d15a03f550be0ed10e4383dff802ba7d17845f1acb4c2c4410b6c55c78cb20b12805c071db09810625fb2ca4fc81e85d16b65dcd81900237e84bca883d808b39aa52962bb7aad9296a96f72de0767e80526bbec91d2423926edaa9d896d2c0b19f9ca650487ef56fd9b37821f7dbcc218ac7e1d7a114de691ee60d27b602266b0c20709e375395359394dfbedb9d2577c8a80891b9b80ad67019b67ca2bc18c93a83b3a77c18009f6df503c89909d9fdeebd3c4587029ffb727d75cebcd4899e39d851a31836d3dc4652e40f9a4e58e93b9b2e6d6386e1636d5f7b4db7ecbd749789e06c2ada53655098a0f8635f1bde5c43a7670493c067bb43fc2d996a348918db02d25651091922d2f3f32e9f9340c267b804c44b299143a4a3d6c42a1c10d542d42371d2b4503f9573c2ea1389349b53354544ca381f7d03f1b2ea6f23011ac8224858c607d1464dbe708f5b4e7b99198213ad3014bdb277326d4667881906d3e0a3b53f490f3b3f39449f1460f8432f42f4dcbc68c75b342b9d9139fea1d62dae3a152083eaaa1fdef0904a18ada0264186c56425a6e32114c80fece53f006ab103bf42df0d12b8245d0869a6c7c9bdc6689f749200e900d9647fe164b1e6cdfa053d59792272490730c11833d53e10dc359d63eeef7f4ecd9d2c2e5f4aada77a24b651314af8786fc8a778bfab0cd06d7cc5b83f24f216241635d50b30713578f6ab6b4635a1ff2c4d2dff0352342d85201dc541e521202ac76c41791efce95c804b8a2ec36ddb988c81faf416f60d37c84923a533d515c7a293c139c0efe873191a7844d7927dd36927d1821530071997598f3ff7a9eef722b8f8ecc221571b211176de3eda172c21c59896dbc1d6e60f9c9b1c1b45fcdb864cf81b124a25ec5039adb77aa53f50eb451b5ad2a9b8286ce060f55ecd3b66268a1aa42e802397c2d8558a1b32734e673cb1877364f3d10a17fe12683cbfbeb1f7ff25e764615a64ec965b0e71596031b079edc9fea98a8336318ef6dcb91587918bf30afda8c247efc1cae4b365e9ad2a71888e31548b9ddd4e5828bef869dd36fd7cec2a9f7e74c2f27f70e86307b2e99acc6babe617d9fc722a757c319ed03446b4a8af76e2c91d77de55d9834ea5244a68f880e3927a2448d318f354706645abd3ae8ec91bc749decf0b1e5c1bcfef9b9ea3292d4384ffaef762edc0236a0db86fb1492e9d3b00c39c149218ca1fad967af02ab78497cd2de1290ffb526696463123633e8c7811e09496e6733103b05315876a3a7114126f6eef79b93ca5e9b095192d886c21d5f48c07e0817ff827a0c2fff15fec90851312b99d41b4f43a18c62e6c1d8d042cf96746039404b90000000000000000bf2e5b0100000000b6fa4cec2d1660b31028e5a2b6c965b0fe1dcecb0b9810e240bef935e334458889c55a57c58ee7ec8edbb7ecd921ac468a7424d50379113fd21ea0124b1d3c7b4f397f1f824cf2e85438faf36a8b5235cf1eb2b8610e8820bac8f0f81c01e69300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000211d4ac543435b56ec6fd3a0062d78e3dcd7b9c0254f3955ff41d1147bade9a2ee07182c9b4a4ece724f46862e7b98a4a383f44ee35b3674de645450d8d83e8fc895be6ffaebe363ba815a8e1a3dc6a4f1dd48521a68a0999e84006f7bbed58774d091b077e3b10dddd9f0a541033a9c7496cb9143a1edfb9ac223d2f469a134021d2941fd88760199cedb57a6072c9372b84ed27f5432b88a09d5e4705e33335902254288747036418fa3d36d15a9f25d424cf2655904fe72c27e6d2e18d1818a260a01beb7682a197031062e8cb2e2726f16676fa21594a730109275d3be5a9d3790ca4562fc683efcf6f5b9515c47a311754717c9a0969d18866919694072bc17320215c654c641521991b7bc9f75215cbf493a257e7d537932c7b1097998b286feaa031a8de0ef54e8c1af4950f2cd79ee2e102eb4aa1d9f04b574787beaaad542c271021ccfe3ad70c2661c17070010a9c1acc268581ca1667b3debc3c206e4023e98c9022a15c47a5108610a85fe787d8018684feba6ef7345dac1bfcda2cdd885d26e3d02254b5b7b160f756ee27c8556e0c772d0b2ddac566fa5491e1ffbbffe83973d6ab9fec13524bd07d42d387b46f3bf027df18857b8927b0dcac73d157c910c219f83097abcba8a534d77536a1c343f2537880a90a3af93f45ffcf7cbe3cf6e9b681b048a9b0f8773124b0383c159dc24ddd48c25d29a6c4ec983cae24c142fefd79f2262bb2a6dae7959f3ee2e6467a4dc8e0d458f76ebc00207cce2b53ac04f16e008c524be8cc54046a5dbe3bbb80fb819e07ecec533dace6878b5257c5e8b76f9e8705e7b7be0c77544e3542b04aa492ba29ebae25d03ad7f5f75d24ef6f4104346fd3631552bf8a6aba6d43de9aeab9a31dfe254733fdba17e254121f78ce79d96ee702dbc3ec29caf677d78de3b2bf20bd7d8b54217f461fdfdae1b7aae2d04dfeb5fe76acf33dfcdda42d0f2197aeb27969a19973d6e717a5472b4d43f097c4468a037430dbe665b0037917c0e3e38904219cba7d128b324e32195ff5a259911b67670ddfb33094b790f20b62ecf87da01d8687d7c8cab3fbf22280daa2fd9cbd3a52a27944abdceeb018023bfe63d1e85dc12de95c1359acb605b9a556f91504d64912a455e07b223c9cfe3111c768ce9c362ce53a777362459c4cf4e41241c5a08b35cf119b84d15f81f4cf6df98a0e5f4739821f886f3865ca13cf299aeec67e83024378324df1bc246e543cb2556c63475ce8e9ea73f618c3c65293c1382078098d596ab3b4cad1e4009662a79e0f578a234d34f4b33c17f65d5621273bc64269d6c65016680ccfdc3f651f19317c8c756b953a8230dd9767325b441fdee76bb28c45250985ac6a0a182e8620dff13e7656c54a5de1ef528a304038711ab08bfbeeec0d91a4add523bb1b13a5565d5e303c59b6228392128db44d756827b5271eafe17884b30b513e92d951e09b92bb3c736cefeeaa878356c0d58d86097da86939cba3db1e6351534f781be76cb4110f3e38583dc5a8f023d210f24906d357b6b4961beae66e4a4c4eead16510890cea17ce2a7c9eb4a3a82ea7389a63eb956c7de3e4292ae98873ef7377c00705bed2bb1c68b67448568b2e62522d798e6dea6fc6c70096fcf2b8f6e22b7506f5f369f8628799a4dc0a3d9b69d3666102728de2bd355a1d3f933c30368335cfdeb673da93b22f52f60d5e328861dde34ae85986532347c86ff7fa60f44c54950013ac23c6b213ea6b7c487141f1b0d3140e0b56c2ffd8a9fbd19655cc27a9a892b6d3522c194730baed9535bc31dfbbe9a4ee0eff9c42363ed909f72a6778859a8edc3c06390f10a837ea7a1f3a925b2118664dd949170c8f93da1189d54cd53059b8ca39052e9a0f46027e722d353fb813f5dbcfc735510ede0dd91a2a26526e4377917f78b543bab311c7707082a1c6f19c43faa65fe07391e4e8d41c61218bc7078e3745e4f8e707c3a3b5648b15aae904df19f048794c4381f9325d93a2d4d4b2e45d2287318c519552882eb0c72f1786d4d0453b39897c2ecfb1df26724455186a13e197938b22ea3df86ab3c13de94211f20c969aca3918a14bdecb23b19cf9f3a9291be57f668c6a7d1f099487e6fe9cbc07bb9ad8ff8f911558757ada9529f73b09f9c0c0390465db8e94becdd4a5403144be1bde540abdc2157f7049a4896883726cf0f18bf9d115b4845b3b1ac9a496e2363da7752cfbc12a0bffaf0149ca6178ce83657dddc2663fb9828ddca73c6fa4a00ad866691dd025eb1514a7650cdcc32de3e2f8218cf5380e9dc2d3f2911e78e8c80b51df2330c748d8ce60f080589c92a05d5c824dd8e64319aead18075c61c33f6dd9e90f6cab11318ebd8ac50c047fc91046f8706c9ecb66df229673681a894a2df3c69e24f6e600c", "00", 1, -488271810, "90fa5f765de89f01c462e9f2c3155bbdefc633ed23c33d5befeca2c478d11fb3"], - ["d8d6d015013b424b8f6a6f5298db6eb347afaf6ef65f37e65b8068704459657bd6c6a51c9e03000000096a53636365acac6300ffffffff0115ebee010000000000fa2a84b10300000000000000008bf5f90200000000d36ad98649f883f6080068785a439e7e1036360368078b8605e1c468f1cd42dab6ead7f28639e0468ec1aee9db11cb413fd84284869887289740691ffa99ccadb17bfc98bfa75a14464b6d69095cb3c01b0feb055f941c76dccd78dbfd8c509d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c112d4ff6e939ea7eeb5b5047d838b996fa48d548b3b3fa228c82cfd1bd61dc0d400976695a885e21f2bf192271b01c6b18b2d58bcbcdf2d0ef4b30064c766cce05c33392481ba2160c7dd88e06309ceb8c9f47c60019ccd001c8c2252252823a393f93ef2bd2da1d1ef05b5169a5ae4f4ac1cdbfebe29feadbc0d47d15aed49031fed0180b11a073056078c4eef72335f3f720f107caf0af734061dac3836d7d2021d30387f3004e9c40c159c129adcb1b18cea8fa3648d0b04a42c1d1d8d32b8660a006eb7e914892d0f83c3d01ed6d9c09d8550ab0de3cbbaa1fe1b6daaf4cf6f586c5ddb4ab543c2a93009e67119741904f19f3ce7e1203b8cfd8499d9094f3c750324873004f8e2fd6f417888c5d357715fcf39a601a77948f8f522e49efe0fe15b020813ccb47ebeaf532006b96bc87912af615e54fae7cbd548010d7f0db7fdab360315112c323e248aea99cda1b26eb4d0f062b77fedde2ed420d75a859ea87a7edd030075d60dffb0072b53487888539dac402f39642a97c604484cb6039ad39a4449020c2cd7fda140291199e306b28888b267afc478dde29132c359a9de34a4d6bf8edf5329bf2d86ccbbb26c9a83cbc9b3ca40f64dc5d4b4fd96f02497a534f09e2dbca3494a56a43f1efd86a4ad0c0038a1490bc720d97732d11af8722c897b635484406ca3f2331b2cceb02d4b5cec18d693d626db15f082c83e0615a9c299b4ec8529437f0ebae0a4aa09b984c4110f46534e772bf0e8dcbaefaa807b196895bd18fa47d5f19380e8d1ca84d29c51f46da20e77acd0648ff788100215f658faa3ff2cba5beed7419264445b32d3e4bb7d46e7b7f296472687f43d6948d47484824e05f903bdad8dcc7719d4d737196ec50a62d74903c250c3e573c895d3366d7175b738cdd8d113ace42dd9117b5ea6261e54a2c8f4c4e217ea0f37fc36b5db7c481ff7aeb6c44d293e2e0bcb90f290efa8b2af048dcc324ea56c2b11061198a1874016a5f3f893f36e2c0e49699eb0a156213596078fb0aaecba85435c7c994ee9047d7fbba71309b3354c4658bc6c85a4bb82c88349e71f209df1a0a89b5365147e41ecd22d6101b59aa85ebec506c82338065cafd8b725b4ce427d53e58c9608142a73b209ce6a8fe064f7848fec0d72e7e289dc9bdc6e104c0b351ef92e5370c0913e595bbb066d9820f1381a679ee6791b424bccd370154a59e10898ae5f28fcda978bcf2953565d1206b52421b620e08eeacc427b2b083c58d090c079e6a61354cec90213e1e633b3347272bda33f4a834b08c623fbbfb097b0f9c42ac5264ec23a21f316b0f4ae1330a2bad86c7e32eb03d595cb8f0315403b73a0418bb3815c53053211c6f993006f4e4be2bdaaeeb3587e893b20f25586bb6dc064bc457c2bfe2c2e9f3ce7cf017e2cfb5aed8eb67665b8ba77b85b8a2afbbe6b4aba699cb3c6c90461610dd1c1f3e498ad49a9bffc1dd3d7d04127c6a924ba84c760f6bd5f809019f80357667b9457e5aed575fd07d6ec7e7f5e0171bef6ab7ef6fab06ff8314312365cbb63fdc123f31e7e26844a9056319be6c1480e2a2434dd04a7b311d1cdc07abb5a881ea15739dcab68fb741fc2660ea7fe99bb939c075e9749e2f8887f8bd362749c030b9f054b85809144dd5298c9e0593c1d19171b7685427444fa9962b5614362b01b0017282ddf7d0a40d88ebf848ed2dd56e030cb24a80ec222290745757a1b0689a2873f7787186088c5029dd741c8f9aa860db5573cec215f3af4474fae582058d3404941aaed11eff3acdedc341bc58d4e6b1cebe4ba8448b8e611d3195a833de2f447ccfbd6d8bbc4286332999eae2d6d72756495ae2dfaacb985bb9afb5c5a011a218343519fa30b25ebea862514aada38f78bf813d9a9106725daf256e5995612c5450c1f3a410aeaf06ff6679dbd1c41b14fb56c4898185d11a8649110330035c24d45ce3cca1a17d65b9b9a95302cfa44571bc975cd330eb9402f381dd02df0b95ff26b4d78182b66fef122b5791e180e181ada09f0e3f5461dbb62c1d0a147506fa93518a36bc939cadb8d42b035717f767992b555b75c546c9289c44bd99ced0cc90cc37894d735100c0a2d447b0939ce8e2a0dd8cdf853b5600a5563734bbb2b3ed2d501920f41291a095cb12774bd60f693a79b454d4ca2cfc8edae24cfedd7b80db136da3d2d30c958a539d36c379e93ba9a0121c32307edb823c966a4316c5064b626470a64072f842da2d6d6fe73d1c4614685b698057012be3341edd678131fb96e6a0100000000000000000000000040ab01e2b9316f3c15fb8a4f8a1f66c4c1f5fa026bffcdd944a0d12a14466264c09cec54db9b2d58f0b01a79ec09781871edbaabcec31d52481df4a910b450e1da98adc4ea86df8e4a75b6e05917eef9c9dc4c4080c0beb88f226cde9f47fd4100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c83b0e40f129057d50ab76118406707b87d891e6c58d304c24490133092e6e8b72f66465501fe9c8b18d5880bb503b1a2738d07328c5651f0902f02c748def51a306bb6ead1f79342e5ef6d364dbc78a892b9e229405cc670d772e0919ec4e7fd92ab2b971b3362ac44f62275605596098b1223c94c2ec186bb3e930415425cf02006797206ffdc3887abf4edabdacdcf09b9e8a44b216657d7e7d4417cc8779c4031a9b280b706e07fe63bdf638e6ff184af8f773240d059e1d5d9ee30e8e0c557d0a07a50f0dc95e547283c7d090854463a77d90bbf71fe95004790714e1a645977b2458fca9104a485b6ff62c661c28f3326508bcdca8a58d2013c6bbfa24465207031f6a015a18d4cb89f8a5f28d172fcbb64553c7103f439c878f14a40c81fc008203104d1ef800a7941df3a050800e24361bce2b5f91692548c038da47f4837c19b20316315a5a08eae4dd6a0d9c30d9fd12afeaf07533d8908619741f9325b160202c031cbe23c090029b5bfd09cb8d74f25700a53dbfc59759517cbf6cb71bf735ddd5021b6f6ff13bf98e96673001a10da286ffbc02576a00b695214b23c6bbe35eabb7cdf463b2813ea941bba1130f8d6a8fdad787e705047f2ff594d6795e32381e1963e2fd5746b9b7fd6ec318324c378dd3dbbdeaa76d409063af9f958b9afb3c55d86e84a0512cce648cfdfbe82a3b36456f459f03d1308bcbc9ee7b18d26b1eee300ab0c6beebf1a6e5e88737bffeea389d8b49e8c7723ed468f5a2c3b2f8890f28167015237b86d0c1a5ff568a679bca0a7b583c8782a6501aadefb9538256214a7c95a4351342bc630e68aa0ecf10cb9368bf52ca1ff0c60b75fe5bfba1979a9e94d1bf0ba200fd17a40aaaa5445505a6e7bbd3c5d1b97dd954ed1284a5c756411028dd8f0e16dd572bf54f0ee2f03f27130ecd5343e4e287523558332a2187bf1aba5275cb1a4fde773820f0b2d0c05065ebca199ac62a9a0fda5fa0071dc197fa7dd82f7678d606ba1a6378d37ed651a63594ed08e6aab82ae24b619bbe7f50afc62900211fdf25af2d7e1e6d0b92ca8869f504969b7580666f4f755ec9ed83a18f060b0f2aab607190882348baa0d1cd10d5fa3031423663b5379d5cc9aeb61257e0b40f7353f1db27eb57dd4d6d628e5719a97511af33ba9713ca4bc80ab7e0dc8e635173099bd9495c5d03a74a298d1551cd362ad8c0f1a23ebecad05dabd0d504cffb2a1cb8f76749d744490f7d7132c44d551af6c1d01bc8ebc5c845256a5727cfd7504dbd257c4f80624abb0c3c901472a56404b0a1d6180d4a55f0a55d756a4479c55d32e45140f677131cdceb7f89c9bd5efe5ca020fae05624753fc9eb64b5f3a5a0ae2d7316fef9fabadcbe2e7061f4a02a17a527217e005234a6803acdcd949f860979c4c95e438db7abbca39b4a1d3f7b352af93e82610b74d93448f8f7da83e7ab895532406dd49c2b52e823d92f44cbe1cfad4adac6c439894ba5d7e92fb693a2acca97078f2e0fb96297b9b8484080ac4f7b423708461ce0b7f1c49cbcb1ac078b2ab6c039b907762d2c06445b06d22cab003cc8792f0ad6447583a7c359e7607d165fb2910a44a2e908a024baa0c1860075edb82d2d97904bf473ad67d0602adf0fc08d4e827224b5b5d5d4c33b4b38a351bfc98fe45742f90fea87e1c96f13ce932f79748d9e6ea67d06a187d9aa5b390e7624a285fa28a48039ff65e66534e5dc76ee92ffdd380e36b01eb987c1f75c6996369ba515562def7b500b9ec34a8029c6145bd37656ccbfe7a5d58f95ab184155db0d39ab471e0315f7d8ee669343f214bbe19ba09470c16498cf55f0badd25283da5fd80fb1ffa2798533fecf72ea702058bfbe3699b630f5462d0153a4f6e4f9f42b8c50ce9631eedb8f09c1e0546d69e7994afebdd40f5a26b2f02b046944e4e2f63e2f660f6f83088f5a9bcd730583aaea7bfcc85aec0305bf4b523c223ecfe68c57ca38894af2abc037771d71e6213df1144590fbced215d5623e1614c947b0890cb9699390c005847e812c66a815e7201c53099a4818a6e4ccfcab8f8cbada8949bf36d35dadb796131cb2b0bd521e9117e04bea45944920ea5c4649c157b6293666c193d848d18a438a8e3edc4bdea61cd83ba2985dfd017eb9845f4f21e5d0d4dc4aac18be724e3e0236a9d78999fc26736101d974c9598b7ee972363ce964cdd33d148bcd4a51d5a9e37185f8edca16a65700f93c62124b452954e9c2cd797f0a8bd58013c6c9c6af70721fd5fde83cd1c4d00000000000000004c859304000000004b4a3fd418ccf3b7121dd6ac4451687d1dee133d0e8b764abeca2c3db6c2ebc8f79456f3ba357552964234b48184f1521b139ab5f87977dbec6c79899c87b4ccfb5a70db01d835342de3e9720eb7491ec3d7ad2d83e784cf4cfde4d7899f5668000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e34c070f4e17194489ea22307b5dc06613ec3b96bfa568150b766a30f7997730148efd414dde0a4f407c333491451f6f552fdb6dc5d8994ad6f9b36116e92a14aa67cfac6e0bff34b720d9808dd6767c41af03f34a49fa53ae2aaf930a890123d21362b10ebce4874ef70aa3158d81d099f6a871e0603f939aa6be36ebec023030a78b9558a198199d49a72e1da370d7c86651ea74d84195baafd11dbaac33d5302011b08f2783387c10b70612292d634c2440377a75bf57809d1860b2c652b74e80a02080eb30c83bf0ad3fec81d46667a1a4a3f9b192ab5c5def39de9f6500b95652728b6166a4267b2af022648c96917894798a51b3d1ec4c9bc0418055126cc25021efbe83333c5c143a20c5a91805e4b29abd8ee44236214fee473852e2d31a53c0227c8466403f97f1fb8de8760028378f4c354c9d7ca276d22b282ef4dd30ff4de0217fee61a86be97cc27023ee9730c52838336f03e110129c5431f6919d76f02540202c84e4a916a73ddf8e0003219ba7273d0dffe67e73324f1b787c2f82bf5359002058ac3527328487d5ae97629f4a81aeb0bdf42b890f3b08417e19f7219652c259d65d6b502e4c5f903256d62c3e067aee1696dcf5fc3fb3f543d9b847d3405616badc18077bfaee8334923ee7c80943a1f085762517781278a9b4a0b22ea18cbad4e559b8fc2c2ccecf6a0d8ec114e10fc8b3188c69b42a3a7418bc62ca02b0db69875b13991ebeff38a8f68c8eaf539d2b76d70aa9991235a2e9b1507839f5122cbf6b172180be99957add80cbd18c087666a6a997f82d4367cb77005aa5af77a850ca0bc250a2082bca35daf6be675334d2dc66a015940374842d1c7889fd5c5afeacb4217fb2957de184a904659fbab39cd3c5ea4a25ba611e08f8f060760bce51d92ba9537c0efc56f6e8d03ddf8397fb635e74c53b5d499571e60ffacc5af48e036f38d58fda697072b50919b8624e2cc929a912b4ee4dfb791a3ce11a180c4c02cbf1e99fddc484ca9b999514ecaf785d75674dfb4ff5e87a71a76b70edc7f197b1f5c1e694b4b5760962509b343b215a11ee1dca446d833fb55623ca042dc2b868dc160ba962270f3fd56472e8b11623861ef664c1545c51b06c077681a3900b86b77df68c1688ed7935c60e329c19e1f1bce092ccb1c2dde43ac06a6e8296021351c5bc4b64cc0e4aa98da4be12b08da4bc06f9d6fec99e9955368b768f4d396ebf1cf38f40faf987f99757e88e920a07cc6f5860385dbbe08072902d15b14423df4025305ec5c2602cad5ba594406aff9ec4a0da59d8aa59106671c12de1857a39f8fa94118d068b460b8543c6665a998499d31add29aff3da7b2894fb54b91cba6a28d14c14c065e3e2706dc4cec7cc1356819153dc73e88f1ea58cbe28a3458d10a8a01b1021b670c660e604a57f59199cb570e62a63f247a21d5c560af8565e9108f3c3ff8601abf8bb3806d63fa5cebe0055f18dbd094fe91b28bacf4626cebaf6247a9b2255e59f6e3984cdfd2ad72fc798c8536ae40c6b960f471c576366cf75f7dbcf966c77afba6bdafe9ef54735dd3ee5bc8abcf8cbcf658c9128624e38df805927036d2c892b9bf7fbbb4bc0a8a10641a4c272713d9b02fc5d9f4254fc8287207a155891e3dc3c37ddd327351cfbcd00d5a018cf5fe6efbe485c42eac8a7acae348e297f8b99de2fff3a6efc4a3b09f59d0f944f57433bc966708134a11c9be466b5a89d799915a3fa16fd0b504a0ac0313e44662eda2483dd3c01cbafc0d4c53b15adf4f6e07c3c29db5d17ad5c360b795406f5f362bd17f453539face985eeb318b7feb332fd98d932e518258598e9f1cea143bbad767703421681405154d633e4a99473cfb4a80bad510372de187dcabc36b376e9ea7e9adfe6706f85f8feaf3b827e4596593b7af23634ef1236578fb2735e4fbae5f0025fcc4ce0e209d21ee3f0a0b7456de2d6086197408f74ca84e054e6435a2df3ec7ace95ac46eaba8915515b76f7d79b98b0c9f34e855f2406e18cf51b3ee35a0b56de2292d47f2b2e4243a74c73bf2a027f4bdae16b88bdc603cd39f354168b36d7e5b0048c192b808c7a498dd8235db507522dfe41e5ba16b64265ae6bedb1de1465191cbef3f43e11f116fe192251c51294353c08cf9af43ca4d40d765837709313091b5a446e193f5f3601807fce9ae6439d75781b4326772c0fd7f48526ad54f7159e88bccca99af208521a0eacb37778f8e8ff6a8d6874da9f641257ec15f7741f9df2cdbb4df35b976d02bc87a3b5ae547ef4b6b173ff23e0386b80be5b1d19b3567eb6e6ec211af19eafac1fd6fcf868e8939cff02a0f49a886b26c6a54526c6828c32f3302ff6a718bcb8fe80a59b09cf6ea9a1f2c17ddd8468e827e3cb045b8fbbbe0fa2f98d40b4dd0dc03", "6a006a6552", 0, 1074475395, "1848dd19f63beffcca8cf2a249175aff234a4592ea30258fcab0691e8c387fbf"], - ["030000807082c40302a1a141b5f2d19847ce192647745fcc926b8ce6a7e05284aa5db89e70a3c1995000000000020000ffffffff2eaa776fc0f16e0fd7fd1ab7f859ff18349707bcf61ec6727d83090a082c57c2020000000865acac516300636a5355f8ba04c5edf104000000000055d92c0400000000016307afbf04000000000029c65b0100000000055300ac65acfbc6dea300000000030000000000000000a436bf0000000000a296e81c680efc10b468c46552a7803030034dab08aafb216fc2980bb7e72c0bc7009ea0223400231e6c5f4db08eb63a3023ea5109b6ad2285613f7b66199f9d296226fa00ca35226d467a014bf4b0d5c564de66836f89eb120d70ce303b927500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d64b7fe940d17198c3e6c4797657c36673cd2349f99e03b4127fa283e7afaf777267a131430c3712912c1a4e5e95624550330289bf98135fdbd254648012a5e778dc913902d44356562ae2480c9e9c629fcfa4b7acdb52ef7a62df42f8454a54f78ff52bb2a253799c1d3159e7eeb7364277339f0683bc924ade0275faf67f31022c16bb7fd3c79044bdd52759102469123661035853c879517a7b17088276981c021cea88b665a8380a1c2c03a0b9b02bdf0195e9205d0bc68dc0170d7861f488270b01858ff8cfd1662e4771e974ddeda5506734e9fad50ef382f4e843c591d9140e4c5046c67153b81b65cf2d10f4e041db2b7b65230d2c151d028b0535c62d44290305b8bf3e5a4ac8fa93a67d72d332a81e72ba5456a26db164ec916fb64f03512503267ad21b22f8ee281b397fda3956786b4455242502ed729a196b988937f3f07f021e62b10db6215398681cf521d8895b7a9a48a8e0b83b3d3507efb9be30e66216020d73e325ad0f1e0c9efbfd893b8cc31fc0bb257bc1684b38942db6861e6e93c00227a72c5f5de049b81e9ee3082731efe8b4c293f6e322bb99bbe0db93db25192c1aa257e5174ec91b17cabf4574319464436aac606a5525d75700aebe03e27a3e9f711ee58405fbd92eb4387cf18602c080c4f43d1f006a433312c9c6f2aaefe0692883bf7ea9b3575379b99b92092925a298b1bcee3686444871b4f89b3936325075df11fb103d3f5bd0b57e8a2df8a1934faae50e105f09f15b207442f9b38ad194dc8cbe89086ffb4a920c09c62b76b825f03166d1dfeb3a0c48824cd1360902f95cd9cf5a65b3ae8bf25adc367156e7b67566aa0ae4376fb6bb3e846e3585cfef2012e20e43564202c4e6e46aceec7b4143e5c641feb3f7e4779efd84645bd69f8c2c49a41ec05833bfd94331845b188b4a0bd41c66d79ea1bad9d4bfea5d26a92141e611b880833699a7b0c8d877311affa5cdce550e52fa1c8f5e553149eee395e3f303a012fb29bee4e686007d252d860805e5d03870db35f0edfeb97730a35d6c79967dd0ce893988da75f39b165029dd17d9e157c4e5e661ef3c9b85f62dfd1ec54f36f5ca7cb18afef5f5a5397f395346847310fcb428ce2cd80576059472a096321e0cc5475e2a3f819a91a41a1ce02b6de2b4c534ec76025ba9e64f2fcf124205ed38851c25f7d48a017c214f531dfd9d0f740c8526454c220b21fe9553fb856389ca84364418e3ca509305281801f7a4ace41dc0806dc2ee5b8597c90eb4337ce85fd8ae070fea13ec389a6d3c1cbc693f2a46ed71a5a51b70df912253f427c259aff8fc64cf6fcf1370202cf0464447765b59aba908c6937882c4acc202f61f63e6f8b53447ebf69fd4404edbc68e8970d641a0832714ffc14d11cc860b2cbc7f757c9386650a38bb22d79dfda086fb48de0d6cf85629ce94845b7ed54ffe66c04a539b09db045d23acd581867f29cc315edf16a9805fb160f0d1cd48401b28b2b8e510574fbb251541bb30c4ee09d48c46b3448005c3d77c90d8298d3e673c81d59dc0d10a9f072d6766c4f61a1df5cff4c6164b018616109d625e5ba4bec77c65934fafcf354eae0ccb4ccc71f556a9ac0a15b87a8224c79c7dddd92bb702b9a6a7ede20b1fcfb7ee9e71a2056d99f9f57533ff838bbc8bd4faf05bbbece36275ce80015d87707a5e8369f31f8ec76137b97fbea15586dece35eae9deeacb42e075b8c35167bb0ed602b58f5e3c19652225531e14e2e4d7b6b932930a6a3186b804f27759ad7b373f029a9f990e841de2f63fcf2b621a8f3a6fd636beed8fbd864ee693302223b21ccb3b0b1ddbc36429f9de90a21f70a1c864edeea3d3a3b16e78d393e0e563b9885c97e177f9704fac250d6f48f72a7377580ec77b7d0841454d0cb36e61f3d5c2863bc1bc355394123407cff1c515e48fff0806a0c2804873c37265d74b9e6b2159f0d073dedc30f32f9ea68415fd626b94ba5e09ccfb567d4a82928661016b820930119e44c35644033a2618644bafc88100b341711d54fe3b2750bbcbc1a411b4ab54bf59eda84f5f88fb137c05ea432414b5df2ecf3180b3e656fb9fe1648b3041be9df1701978031c2271f6a2f5606a2b0b803bddd157c5014d7d469faa4782b6020f4b39d417b23b7f9cfd520379c61edc7385232db2bf20415c4bb9751370a48289e409b08dadcdd889873f1ff47cc4a90a9ff200e6ff35704653e128972976b058d3c257454f2757992a33d625dc50079a00494ff71f9db8e17e97bfa096e1e3b29e00000000000000000000000000e9cc6af1d3553127b898df5e4f2f74a0c2008cfe818007cf759f727662bc718bf4b47bbf402ca1ecd37c256cd03712ec60e9cb174061b1d700a2789600b9b766e2a5189b49b367779a1510ff63796445e78deb7058c8ab023976462599cd6aa500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eace2101e46bffaddab8757c681f83e4723e7578462aee8d67324563d8b2d0798d256a620669dfeb49777ca442b24f63cf8d846df9e7edc51fd033e1d01f433fc54451a0da7264e08bebb00c41924dc393df7bf6f6629be75e770b0f8338c96406f2db0f1c3ee72f6b1942da0d261867b7b559e91974ef032fd80e5d86998f1a0327caf049ef3ee5d29c6306c063c841e0a1f594ee4c79aa329e7d7bfe4133ea12021cf12b9c6ddc7eb45933dcf39977e3fb7ebf0288a0417868a4d478ce40bc69a60b0628a53cf4fc32f9a6389b597bb4237cf420fc34f5884938ce9ff464bcf5cdcd66fe6e77daa59fb1b2f930174f3f0251b26cc67b2a95a8b14d96e8a0726b04a603181e5e8df529d9476a3b282504977942634b120347d59d436b4bc2af5a3b05590209efd15889c29acab3e92d6cbe21706b11d2bfda6848bb813f5f3acd57f3d1dc022413663d064f4bf19e371fa2a9527239a7d66efbd35307d9d654d41359f5c35f030d75ea22b27ccb913915eb0575f730619604d9e3b9154a9dfd255420a6bccf83032861fe2e69021872bf9b8d2c2a0516d705994da7bd303b37321adfd4027375f912dd547c065551476585b8fcb255c9a3d330fc7b20163c8ed945aa087a7d97fb06da377ed68f23555ba68222d334d591c7494c5384a9cd3d7b618469358ef39a6c3f4c323a773de888ab288792da8066c554d27567ad849a5549ad83ff5db203c3906e403f7aaf091ceb4610fbf99d1365b82a75859afb7562e42a83bf89f0aab8aecbb40009a8bcdcc54fb27edf943a330371d109c5415a7aa1db11a938a3dae67b8598f892772f913f5233944b72ee90ed5cb575da853de27afed05a0943c37d1aea7c309417092edb6169235c922364f6e9381d9bc432047ba98b299621a001cad166f666f48c2d9fa06df91242725153e6d39207e643f19cd083205e0d62632d0ae8cd4542120db0e7080e0b4553782969082ad064659a343b6ea8fb1eddfe79f68cf0a3fe1820b0a04857b32333b878c8401e8ae908651d567f88e04ac4192a3d4944020b5cf07beb7869d682585b372f251322efc342fef0e295932ad5435f66f2942409da8e2976d55b0015108934f5d4fd2a57da37f2130fcc307c2d4584020bcd1583d1b806763e0448f6d911fec43a053b03d621526aa6c623e6d37f737e85e45c768e42902a2fc49e0c098606f5901e92883b7c71aaa5c267d81c2ed5b9ca9bec44385841790af0386f4931f136826283bed5918902772b281b9b6c2149fc8b59dc822f8e6c232cbebe6f01234d0b1adac169ee8b5ed80255eb56bf85044f7183a5c127114a46d133565bfd4cc00bdc75134bf276fcae15c91c2b10107f1f0eb0099639ce077341c50a7c6cf4e7b39dcdd7e315cc5e1605ed290c2cad5ac8b4ad1ec78699ed566b146b42389b2ef88de604819483f6128aa9b70a229cd6248044ac6adac5c87f6e0bf386d151801adb5a9250cb55195ca97fd10cfbd7ebb109864cf39695a7660e466572d0b79a79278975e79a2e5278d44b774f1114ab6a859641bb260bdd388aae6dab899c592668cd8af289e76fdcd598299cb5e726198a3580d0d001e0f72abc9d622c4432da9e6cc79916204c2206afafe7e727e52d01bcb803f3fb66bc166ab3b4d0ba296185682f9edd40db7f2b0738fdf01db7f23c023aab433fa1f68cec7e3ed4fa481a0e58e484cfd87d14f5ed65364b746e66cd25f180735b0c0970fe89af310d700e020eabb994dd8ebfb928ee198c73ba0a8e4458eb7aee9dc6b7162fed00919fc52e04cb86345f88fca4de327d6692b16cd345eb325ff9b38a5b7ba6cae12b13603255912faa95996103176d8356005c396fc42f0a2f44c25390d184cb5e08b6c7e3861b8ea9870321bd311bd0e27cdb440dd5f2fa65869913984b8a51ffd924af86fab3afeca96827a5f3f796e88eb9876b1a49b5b3faa8611c45ce7e102c7e8c9ab33ed69f7f0108c7b434db205b46f3987dde2b1d033a4307c825f7b93200163544bb23d69ca8ad9a33b663944a8c0d4743a897e553c0dfcedaf9032f134eefcba95a87b9b700816e6853fefad1f4a25c53c5b3a53f2c5291c477dbbd457f9371a1f07873f1b8dedf29d3d6cc3e1b38cc478619f72aec9639346f5eec8def81ce64512eb572a808a19abd7a98868cef7bb4a7215a0a2a14b0520bcb513404fb961ab79e8233cba3df0bae4c359f8a8cf2e277b70eb45124a6c0d64d10780ba991529d174d63d86bdb7e42948e55c60a1248cee0b8b8bb8ca5721c11748d0000000000000000cca3be0100000000eae34d0685c1a524fef3e256375de1dd77e4a48afc20f9cada31405e4d569ce6e0ac362ddd66e2e1f755ea1f26962e7e9e0858d6c06326b5da6231502215dd004c85b4327e33ddcf83ae4673dbaa12a281a730cf519ef27e0f1a3ca105a9426600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cde210f5fb8ca9589826236452ce6b6be23136a3589ccd949f6b3d8590c3838b313d0fc386b00aeb81d3a3f29d4890e9721ec4494c305f6205cb16d98b775195088ab1d8cc0b8c2e3f424d8c95b10bb3b25480a2879843fde29e26f4c1038f9480c98ab76d1881fab634c114f74376b60e0b57c54fecbac563053dbfb235e7f8022076f5511ba1d953adc4620ea73bd826048cea81fd2473d8c463c7d7172d61430318f4ac2cebf3e9ef3af1166f7e1d11e943626bc6fe1016326296a1e421a7251b0b00d0b8adf9388a0b38539dd3e9487a2391250ff7eed88046fcadca25042c7c25960ac8ae552eb7c163cc09d235e8ad22b302d17b690dbfffaba9d09f73c71eba0208d6caaf29df410f5461568abd3820a141a227238d8f52316dbc781306755e94030af2ea320fa1e45fa47ff6ef3f7df2a7cf8169a993f6feb58378750cd5fc45ea021a53d1074186363a1f7cea59213393de2000983afc599922a0ceab7049b7ac7f030dc26dae136b8b906732f29b3c766df52d1f5dee79ffefb6c1fb0cbf3aee9f5d03041a3249f8381fe2e0b48032e64f4dc01573dac08add835b09d0dd0c3509ca6d7bd3251668e3afa91babc6a3a0bb888d8f51f9963963dfee5a215f3c96ee35a3e12cf5a7650d48766b2d9583e5f7cdfcd3796dcbf372d8f036da2a77c90215e05cef48e269ca638303bece8bf1474b9ec2fa5e8059e0c46a8e9930f24e1317305d97cfba7554fa1ae693bc19c6a6c0219aa888e8df1f2462a6c349df815232eec4356a74bcfb974cf1c728b00117cef398a6105cad6230c84c2e8c85ba4a267b3184d1ddf3aaf322225f0e366a45bde69344216897b95017f57907ffbbee2279d436a0221ec5f716fba23b27fb4568cf12535753b3ab708a9c6013466fc7dccfeb5e72a138c701874b72cdc86d36a0c929f735d38ea6dad4579d1417b79c6c45452b975604fcff017bc98e6733b30cd3a7d2a20e9f75d4582f163321ee53dca8661123bee5913fbe881aa77f029696045c69bcf053760ffdc06d4756570c80d2d2ab932afd5d46e7bbead0efdcebabccfc4a9dfd39be0fef7d9021e68e372c7fb6b41aa2450103144497b0f14bd1d628bfc648873339fd665c4652dc8d6aacb8a48b11e1ea6ee326f766046a389f5b54881682cf14eeecf4952fbd7392eeff1860459dc795a6a850675f4d19445018d844d94c431bba7bfa171259de2e197f4f94d7dcbe62c5c5d68fa9d99cefdf2bc6357bbbf5a8d9bc17823b92344b7686e56f250472a2b4bcd35077aef8d5538a1a0dca74e092abdae90f3a0955015f4c267ca6a89b62e29183c84c98fb547058e494dd39f4cb699a978e664a88816a891879301f4c745a96da1a31f1f7c256095de8bc2f32292b7101cfaadf646c91547b8224d84cb14ed2e4f1e7fa2a27dfc88e3c367357d24fa493ee47453a496a200624c85f082c3dbe5dc1033ab8333432854d1b85aab86ba494923d959fa4657197b70f7411c346b2d940bcf0912d7b0716ea43124e7928d682b01942b5c6873e16abd18162051700675169711ed17aabde5a6d9bbbbfb549b7c879709167932aaaa1dd2f8d3619ca0a0fc127b27cc39ac4df63b5ef2f0ad46fcaa9cfa83740942d6b344e985b238bb2b766b43e444c1a878f0b8249f27d7517c916fcf028fe58f25d6769e89c10257c194754c3375b86c0753716501bbfc8cec2845c6346802067902e8e4c01513d0ae4214333f35cd55dedccf9526e8bdd0656c17d8a237ec4a826bed52e92332aa9cac447766d410efa06182de81f9d79630d0955af0bf8e666cb48ce4d4b83670dc7bc0637887c222a177e47c27a77fb7d1573ff20ef5b86c98b39f6efa60d1eb6173f9a8fbee04b7b3eaabb0f655089c6310fbc1eae2a2c31d550c4e52ffd16709cf310f2e774d01763471c97b76778e337c1e4c24ecb2baa01d3da496e7dce2f33f6951f84c17449b87f1e9d618b3798144f2ecdd12b7d2ead7ac8f6cb6ea5cd57c582f826e689b3da8df59fd48a5a51aee3f775b27eb112c4ec9ff189324587070ae9e1337b3bde9c0e179fa6cf5c2dc1490ea0677c385166e3d7df7d45725dbd3a8002c6902855797642affc9d4df1d4031a2799f9000a35768b483eb108f899896491da14cc501c3d892ef69565c37bd1f66a46fc736ee9874ea7836b4fdccbb55ff753edaaecba45d04009e858f29e256c19d18bae1296b172ec4fb48e9870d357201e88af088183d2307e05bba5d699e42902c62c7b9c395be10a5d9042611dd21fc9ad0df0f02777bb3293fa8f513e20bf92a943431661961c488ad68d035e5d247c7d9a3c886c2a8a713e48e4f423569a1025c500118f757c38f5658adba4a1d256ca406cac694b348011eb2fc274b0a6ec92ccaab18a9fb91c29f1d836f6b8fb67236dba540f", "536552ac00656aac51", 0, 497824383, "043c65e324c6b5047adb7896cabc72d7149019574bdd02ffcd3b206e00d2bea5"], - ["030000807082c403049b56613ac60819ed873af38f6e8c6f7f4c4fbb0a56c5ec95a750c9170971a14900000000076a63516a0053652fde23e9b383119d6fe14c12bb280d84b6e28c3100ae6b9c9b978884f50e33852591b80f0300000006ac5300536353ffffffff3f47d2cb2f1769c6377ecca45c8c0f4cee99b701945af8d06db22748bc02920c030000000453635353ffffffffa6dfa4f39a984f5caf5724714ed01efa0f3176862624c301a167b688970bbe310300000000c9c54a3e037aaf76030000000004ac515353ac63b500000000000551535252aca29d55000000000006515263535265000000000000000000", "63", 2, 276197396, "1963b93df7585800979e22494f97942d6ad930118cb1471a5c4235de3d13c747"], - ["030000807082c40301eba668bcaae18b295a041effa2960e8a6700b1c420b02a4151ec1f001e96f7ce000000000700ac0000ac5265ffffffff010e67b60300000000046551ac5100000000000000000300000000000000000744570100000000c79b318e53c23c1b32c8baef1930c12117f1d815aef741d5c8e13e9bc520156354991268b4ea0630de8debe6b5d83eec1e6176b3b6df55068ff34188228d3276fcfa25f280614f7a481c469d5ff9d177956d3d3a27562f0b4b5c1481cc22a64a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000da7c20e08ccd9b01df42b478d486ac305153b790c1c2e3316b3082dc2656b56b06668a747d4bd62d19d8585f954c1ff400f938c3be475003cd7612a728918ba544ef1473fb04a21615c800f7201575fe8d0a6d55c2e5bf3fcb9f4bc4e417a048a3aedaf399527e2faa6f8beddc4571251c05dc885403db9357a2baed9ab34d6c03213d3dba3d0cd8a907edc114cf749ac2348e0bf2636cb3485bc3db92996c4ae70223bb805c3d9291ca44f5c770b47c62eb15c7d35ef4abb963cc32a1668495d7c90b072bc8b797a76b54e4c4b9b5132378061e319ca99093aefa56157b12139f7f9eb2644aa2342c5c55addcc133cb24d656ab9480dd253137b725179410d06b45f50221879d0c068af06a69b98021dc9fc9ef1d884625e32b22d7db75f65ccd8813820301e8397084832a976a59722a78a8e65156deceb845c0f87fa8b0a64892688e75030367d5c9d4f5462e3f646d85775feeb2ae0f3fc51bb7a0e857d09c33da5974bd021b896dad678dca938d96564032664833c9daa3079fbf8f8de6e561adf44f863d020884551830e7877b6c18990d7f2b197d7a4d126bd970fe6fbcd3e061921cdd92541bf97352d5bda8ae735a938148d1ea4f410d75264f990a069810310a6c96554137a5956475b44efb8524315820302f12d641f0609212b42e301f20a0bffb37714d66dbd8eaac069856a1ab35595208d9bce6b46c205df2ef67b019399ebb9a8b4d8283ad3aa6d893780813bee6c71a30d59477d0fdf28f28ad105d5121f1f0fae17897c059aebceaa99cf61ccc46984f9931328ea6ae91f24d59acecc6bd6ac26d7fbcdbd85b64d65a3b6d70b91adc355c85981566fe49f2e9ecbbab835039ff5c01a04fd012c2af3841a4d45138e891820423520179b0b4f278722593d84dea0adc76c4bdd540452df37e2c19b076907e44d60e12a8f0afca5080db278c60c802e87e49e1270d17c5c9e3826c354edd47da420e2eadd0e1a2b826f83c0c2d18c8dac805969a31d323c7c9b9b57e079478626a841ae7f9242a0b31e2431d08640a4be8c1c88dc6083372c60928c4be74daaf3e0e8f64c9ffbec99160248442ddd4d4cf6950c3c6ff16af35bbd47bb6ea4cb6238d011fe8fdf9e75a2fda47b24e0819b25eb0aa8065c4ad223cf4cc7f36b7154ee274d604ae1bd6d2ee90e426e1cb6e84b83669abb99887f93cfa06371a4f4378349cd97b60e82c4ce51d9614d947b03e6ca65f2fa8fba1cfcc5811b0617faa20f9a2f56a129df6f405f511c2cc8f35f7dbc84d060f119f80b12fb3e6f023c3de444e38c901db45b98bc3bc22c25eb67f664a7ccd012c5e9618fdc920e22eae2edc9a37e463100b8084666b7ff1a66f7c3e34680b42bdfeb314e0049d375ff4877206be377f4003d723986fafb1146ff1f90cb9f674e1b9ce2dfd958a44955826cad545753560c543c41796c6ac5506e8c0c3d30bedd9fb49b3e7a31ebd1874f1f41422f2c2b08c03b2eb6d18d179cb07fc407486721bd25b268ae11f7b098460cb6310d53834d1ea6fdd8b302f52e31ba072ec1fa62f39bfa465dab165789bff95e31b02acc08dbfd7de852ad0a79e249ce87e284806b1e9ea0f9ac09337a08f31548806ed0ff615b8c49a916b0b3f238670057dcffa4f5feaae56862d303ab4aed4d7d730770e0993d829bdd615e8c1e68c4427d4d85611afccba9c3a5f56ee05d078454c83336dcbc03577082ad8eba17d522f65dc74de15e236b033f54b32f57811bbdd6617488de8ae62c4cb91088f7f7fc5c5b5c2a0749b597d18511bf2814fc646b28c2254f289389938f47fa25f2dc5957b8dd1238fa32b234d07cf181be936deaf3b6a33b56bb9e2df52398cd0a842dd30353e724cee2e441916bde3eafb6e0f9aa864a903fc6e09a9021e3595a739510408a950f2529a2c20e238ebaabc37145b7222e250adb4c97ccbc8661b9ec15993fab8468b46b900f491f5de6ac6ac69e77834ea9e2b3bc4afd48973e6bda27c43a9d7cd0ab93ac67f14f6bc713f735bf6a790eb1ab72cb2432786026b04b41eb1c3bbdea5048a1bfeb3534cea0d2cfc6620efe8f44902da1cb606f996811e51964552ebd8f1c7e77499fe91ff38223876da704d8d2f6754d1da0443fe44ba100b56e725c2edafe2505be6fae304c8b5cb2b4033310520b3092f7d5f820f920d2c33fbaa2154894f450ab07592693b4303722c90230678b0614812ca33168b442ea11da92f336769636185fdcd5c13c3d9d869e8556958dd0fe9096ae57c5318f7a699e266d048db747e3892ef050000000000000000000000001898834f728d333ec122152fc374e4b987c5947efc86e3a8999eec1841cb5b4088042fee5d76df20b27cddbcb18cfffea57489b81e79efbba714ecf2b9adf33bc988f969bfc4c5c50afde522b4f88732adaddb49abf34807933a7410b9ef8d350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057c0a31daf5656223fcfdfaa6a790b4b5443bbfbfe3767826ea1b9757263c16843fe5fcf740a3fd15f6ff19a279bd289b3b169b534cd28d6a02d5d53a6aba0f8b568a0db54ac8273934c287ad149f2bd59c52d4cc0324468dc8b45200541230eb37aa575345b7300b317f60bcbc3a0e95f2fd30284c5c7fb5536da3a589365c3020a7fef2c2a61a190e8bab2503730c00a85e4bbd94479113dc5c23dfe178fd70b030cd59ffc7046f998e6454980d900bd54f19452c207af54b57ccc24dbd5a1de100b0052b596de3a4cde21915597e14b148f56a77a3ad27fb39869a6827762c85d7d8a3773ebf9b25b0a1db1de1115a2af8dd7941f38e502404bd22a9740e536bfe40313d9353a4f35add613cdfc728cfe7639090c9603be65a5ae2ca0f381da63f167020287145208cdeed88fd52f3f493005263c8c601ddde587be9fcb44b6c976c8c80209b5be5368f366dc4dee06a383b6f4cf0d315e664b87c9382abe1adbb9cc0deb02236298f48cfd33ebe1c47e66a4cf0f9bc274897e61b1284f5929f86153eb18590227bbef3a58ac7fcc782c0297b9c780a64c52ff9215cb6c07bca79d193a5f6c418c8d2829014a974560b399bb7543f2e8b1577351831e0740a1c2a42774c71a8c86d65f135bad5d0f05cf2ee305849b6b7957a3cfc01747231c8cde92b2bfb8046459032a5ad6b9e45c7b9ce39df5436495fd05ea165af6bb16e11c5572c22534811b985b0b3fd0e71ce14c49e98d0331ef5b806eb8c1f1609127502c80af94494c3ce397a124ab1a278f4a7c6bbc624a40ec14022a4f0ac06819df010dbf15f3ef59796097b6a7770fbdd29cc95d4c2a0fa35394b42743039a315ca3bb9efe8faba82f2505cdf14562c313cce86c1cfa3e5159b46ec58c0822fbc645ae8abbabf2337a389b6cc1e4a4b101493ca603337eab2f302161176e721183912ad45d57c1ac59e3f34d8b71a10e889dd7b4cb5c99c5eecff94af8788632a658ba788e967fdeb5b94679b56e29aa2923649c43ee61a445fff2af5cd70dba633375e53914a13a70b1ca3afd277f9da705215ea20aaddef813ae402fd38e4b6e4dbcf2f15405739405db645702fbeeee5382c4d12c908e11b29b2dcfb57138a4414dc538bd458c9a0c6c431996658ef89a4312823ac0bc7afa0be3ea57bcfc9971f825ea9eaef51823b10926ca90cfa4ce48c0b46aa9fc12bc69b21dfb3a308720ab371fed0d017b6aae97b8a240c524cbb6929f81756280be19931bd992f75d0bee05d82f159a4510ed6cf8e980830133429b4715b0ccfff558c6f679931656695e6e2def6854333e378dfb54fcaeec7bc97cc27b48e5d8b70d74a345c55c27e5341914b876e1fa2e815dc78e2d3ea47940c46dc9f91a6aefee30991dc6058c7b9620bdf06f9ba5030d6fd3787634690b827462215af83b39c75b353def76dac27d102276536be90bffda58eb61c07fffdd51a43d38679e1aa28a6f3e4345ca5e52e683d953428397980c3fb16ced4509995ebf3a0b5e5a418777ba3a99e373668f439f820b6c68c1bcd36b975b2d0b704743d582ab33292453dbb632507457e82ec47c446b7e4e75e29c7901fa0c0bf82c777694a7754671ec84fcb48d95d386fafa5db92c728f258203971f25ed3a413b0cba3a5d97142d4ea138b4389740f81584170487b8200b654f535fcd29a2f3a34d3b70981527b6aba7974652ad1677b8907008ef8f40988afcb014eaa2ad866e4c99c3a0563f8bf29d130d84f30b9a7dcb948f878d3e3d2578c9b53e4596e99cdcc0b0540f4974255751b851cad2e8c02f8d1034e5427713e5ebba0ce9419ce57788d794ccfcfb9f28c002524453cdb236c83067a5a81cba8de9f7e4ca7dd760d2e971d9eeac6c4f91daed3bd0f95a7c44004e5516bfadb8cb13976aa5b02a3131c123f9d0c15cb3feb54f8c8e617389e702a3649b11b2bc2d12c9be4fc1448ddc6175bce259bec821808291eb9b1134296d3905ed919d953910a7a21cabf5f5ded33b719090b279f24e0bde667a88e2fb27ba0af6b65b8709dc973d00b776804ed3ba15626a6a3d97bd8e7dc9e4483322ea46e663a4660fbafcc17f9e4771edb69a7b7217a89323343514c1f07c8049ce8089ca3b051f7c648c1780f30a7d0982ee2901cea2de6f32e3f2e80d42c9022bce8abc1a6b83774534bb56ca2b1d5f91c8444f4cff2fca1bb103a90a03dd63f965e778ef81366a1836c2d09f64812acc2ebca3d5dd66f980756f784f876d4dc9e8b9b3baf693e8ba41addab1367116b7a2082fe0000000000000000036de3d0500000000f5de61edc6a3a6378376a31a242d725bf4f0935a0a1eed950ba19e13edcf1b2e225b7079d239ff88928c6507b51ac993ff30a254e7a17030009602f38e3153cc963b45a1a20fe1f4adb3b64de211d398a0ed77fb840f051ccbf56f338231d18000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eddc94df3f084fadd346b6f30bd1506e8af66291c5e5b052e67962276ae12eb6281234cfe814ccf8dde31d4efa9c5401e68bebbb70f8c74b65862365283f6e52f0b9007df826034b7df50d014ea26824cee36428ff95f362ac2ffd5ae56640ee3950e393a36de2b6113f95a740a5595a4f7804c73b16534c74f0f18c43ed8da903087885e753456bf9abbd7f4286c16447417e52e1e700a75a7964fb9329bc294b022d247692ec657c3af7e81511bd983f94291d0809f2157363c8a8eea8df14534c0a062d87c00985a7b53f8536a62d09a2e56f42ad12d174bdf6d8a0623bae06fdc3d5d390e191d8c881e83d708696b45304d1ea7e4a5ce7fc545d56be86c06601490315dfa1be476dc16d0dba6d7c69c67669f41214d2148af796214d29fc6af62c120315e30618860b01e3483147b1736f400d911e440665bf2dc9e02ab51843d92b7b022d9525d79a4d868ab10f72eaa4780049c60f9a19aae2261930f15b9d3e8c2483032467b0a864e7a0a4f15a937d722fdf6bb17a74a0855229d5951cf7faff0f9dce032aa58a470809440e47a947ed448d5e99d9d81e1a7b19754260071a7d96642709eb5b41c48d7477632c531edeb72f71ad92b81cb935f95e577ae3da945ff2d0514785f0170fe9ea872321a6f331447adf0fa30d95d2dafe2919ac641c1b85ed5318e7ef9be15a57dbdda7b58367dc3b6c55f3d1c5810b4e7ae80c89b663604a5fb2a9c58ceef705fa833f55b2cbe393c25edcd69556da48b47a7047ce00d618feddbd5f357eda38cdd06f027c0452b0511272c03209118415a4aa9abc39359daaea79a33917e9275f65da6b34ff5bdc89042385526d4d5ce29b844d14189040ab45d26f4892ebcd8185431fa0a3fe5b197dee4b9f33f469dadef5671b568e15c9c7b5f64c62601fd36e275be3c57e3840a40b3399fc71285c9566578551b3d232c7a8653230e5d41d9998239f348e3c011851cd25b3340f8410c844c1ac5fedf1d25f447522add92624f75cf2d696d0efc44edfd7a6c10f5bc4fe2ada25373e513701559a9b446d340aae6b6c42bbd4c6c080747e9c0690d9fc2667dfdc9fcf0cbb33961371514d79c6d9945c17d18dfcfbf17ca4a8cfe2e39faeac312ce59c555fd7f19b7eee5e307847f850c53da63735db1351fd7900c4faa8a311b9e2657ebe4275ecd146e1881f1dbb499700a46ba1b077664c8c03ce7666de82cdf8a8e1f26993b661ba6befc7254f3c732b861fcd229fa1703b84814cbb590aec95fe745984ed54b1413982eacedb010a69de50489e48260f26fd7c65319cd1eb3cd430985835080596e71820466e171410cc290d7b929626704ad4eaa652c9a14971f36cd2821d0509d8e47f52a9da526f9fdca999f6a3349e72015893856df524d6eb250ddbc287f48b7f2935987c763e16e01df5d50748640e77ec1d26c6f45ec24234924efb6b51f947315246c0773cceb69cb79472318e04c99ed05e82f2eee90f9c743513f874686c0646adff18857336cc71aab2aae6ec5ce9d580a6f0d144003661855686e8322fe42e657b567a378047b031b84c57b55204c99499f4b9047db326bfc40930b71acfa411dc24cba06a060ca23562903b017db7f185ae3c3babf26f115f71400b680e8d5cd4afc51e9bb01ec7cf7db685fd0469ec0c943916c1c3c4bcf3ebdef26540c510689256dd8f2cd532cc4e561306005712565af9c98839f4fd309663ee705dc85670bcbe8cc89ad0e47fb873b6a60be859d27e18e49a0984daa6a128776b4662b6bd1acb2ed01371b13afb846b33b1b69d692250f12340629582b0677f0e94be6dc90bb57c4b9aae0759f2e3f157f7e7e70ae8e7ee2d811677ce2b754dab6f91ce9c7b4e50c8db6e4866960b6f09a0dda4fffe10145191bcbc9b672924f88cd6352547f0b86659b0276c0400c6af9c4e13c87d5fbd0690a228e69e6e8d9e3473b68b8e7429012a13067b605c20876e72f5239281b1bb121d42a9b48f4561206c0fafaa0bf1d77d81b72a3ba5b81e31ddfa0c45a876359c68e9140f446d31d2640a457959895e3216915cfcd35a32ebfaecd050da0bfc4adfe172cbd719e21aa0a98ba39f5629c6e1fc518bb304b0c51cec9f14976e56559c83cfdc1251edd53c7b7b773ef5e407f6a6d3d6b075b6743c8dc8f0e57d350f6102c1a57074a27debdc270dc76462dd0e296a9d7452dda8fad1d5971645250cf8d4944baa91b47491c49391f92d6078f4be884e384de29495af0b4321f024c822db6435f2d396c9b5bc2e37ae183039042aaf21c8586ccbb5e5736dcb0fddecc29f1e5955a30e02e967051b8bc021ecf5c67f6ad0a42f5da996691e481fd9acc366f7e9684dd3eea9883fd11eabf51ff0756feb8a2e11010e309d654f5fead0ee5e88df7f07c7271dad2bd3aad1dcc80c", "63006a00", 0, -1792234059, "8d9e1cefd2192d3a712e13a9880617a0951d69d39d85ddf34b87649aabccd397"], - ["716a533204f3cc913f49028b0e0da132c736004c982fa3c903aead50ab925928b4c468e4530200000005656363006362abf49e325fdfdbaae517b6ebed18d2f7d9b2243f00463995400b8cf8b6f09c92f2f77a020000000552536a5265ffffffff2002de98e318d15ac44f4e92697641e8cc12c857d5cdc4e98093e6380366ea5300000000010013640e550a786b3cab30b9e7724efa58ac455ab707f92629b0e600be860e99489c63f6c503000000090052ac63ac516300005598f86a0285cbca0200000000096553635151525363acb15a5a010000000007005100526363ac000000000200000000000000001645310000000000296fe2294a817ecd1b10cb520daa871cbf3de6d91e9652cb5697ead3c28df3e7f0c7b456500aebcd8854292db477e3ba33aabb8c48a2099165d6b942f29f94ea426d28655cc050c9ea24b1226da1578e53801f1ea1c2069bb0592dd29cf130fe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000da1b06141106e9a504b2a37428dc4760cc7e7f3f404fe97be74feb2ca0f9e9d09bbd12cc1d8440bfaa9c021fd0f7d0838b05801aea74d3a69a01e00e2d88109d7d8ced90e9c271e7eaa23388a8f36d7da7d5c9b7ba0a955835975496826a63c4effcbd7042dac7889b467a68ca7c3896dbcb97662c35549dc24e70f2433659de021f660d209c32f9c8bd3b222c32d121d7f473376d3fc8203ffd80536bb3632be2031390c847b58391290a58ba6303c675ed355e5479c38366bb6f424783b20343070a05ac8d573decac2ba6ec89f993ac1e0793d17b52dfb3c9c43965d321836da5660a0f7ef8b677b34b90f6f7a8aec0ca420e3b6159569940e242f6024a5f27775d0220b5175581f5fa12a83c69ff8fe274e09830ecdae29bb0f3ae8337c988fcae56031a42e78e9cdd8deea46e86dc19f12e71523a5a3eedf506a343b69b5d04cafceb03293e63ea1b6a941523da797dcbfcf7ffbff021fdcbcc3ca687e0546b6a10ce090316d7a51232228246237603f76564ff6a84a5b61219224f7c79208331478b716e031154e9187dfe11d995c0d92e674c713ad2424d04dffaaf06570b6aacdbe92fcece06e75e109ab1a365786af16f1e47bbceb7a59e4b0ca1e9610bf83a97023dfcc77e035a0f44980fc52eac3270b8875d06f41a25a3698584ba11db22dc07f0ab283472c8afc3d187dc61236f767c98355a3e5c28f2d0affd85fc53c051fd41f6b8d1f3facc4b794a9b79a9f853e38e66294251f187de4705d46dba4ad3a9df1891f22c3bbb9a5e66e7efbbf12f3782443acd4e1dabaadae46b7a168ec185275b504a965bf6e1f9a54fb0a9e3390971690a2a4c3aa6e5079449cbdabe82589573bbdc0ea7fd83c6dfe1bae85bb7e627aa9b972295bdd06439b1c7810eda4efa27edb41f538fd7f70dbe5383594e8a6021b87c43f8ab4a2a4bc929c30c18e24024e1723edfd76c87fa8e0550781c4801d4736c9ca7a914ad75cf37d497611d2f3efdac337794df25a0f3dd692198d19f069d5a4f13ba8ae9c3ab250d50439211e0dd5f14065e4ab4c4159cfd29f2637ef1477e975cc0bd8f396c32a55b20ec4bdc3033a92162385c0073d4154ca56dae413b8462c841ccb489ddb8d0c1776b9781f2638431fa944352b47f1160f3d45b3f918a6920b1ac6b62856fddb5df70380d35a34cd6fe5351c1a76fb491b42217d5d242398749397cb917f9b338c3321545dbe90f46ec73530cdc66db0df4ceb17a3efbff35a720ceb1c9de0329fa6cd990c00c161d69700888620a8659a546745b731146c5cfd18fe2bf8f1ef1145e112482de862f0a089199f02ee97fa404ca354a20f2cef6f96a0d5c488a9507b6ea8701c45a08a4318da3a173025af78b5e432bb2d49390771b6124e52f10ecb2295fa588f0578453c57f6556d2710ff6bb8c4c4a31a3dbdbc71e5e6716f1cfa3c51dd2b5c91bf2759b20dab6b532a7ad89c6680c1027fd605fb16fd0865f6390b89c7b4dd8bf7c38039d13f32ad4be8a4b67ee7577ccb184f18ace811368211ded3760e6438df49e230ab02c4231a0de7cd34d09b2f7b6564a6a78385958de8b10b0b3385eb72c9cc315a828e6cf6948dbda0c8e407b4b6126a47417034bb119bbc30d6a44c26fb910da6394f52110803af6df524eaa91196ffc0f14533d2534ea06a443acb313fc34a2f7914691b7d817fdaca0dac8237f24f9adde067a5dab7b8d833169a9b7b7652b662c465d766c9c7c4b4ee04114b1464379d9ff3ef7d56fef913094af6bfe85467c6be087307569a7c693331396279d41a04558c36e7e9e7e6c5b2084a4ea82477b3dddbe5d8c83b4e5b056239e06a86e824c31d02c4eeba59abb732df26ad6c6a0742eec59219520cf5976cb8c2bade8647b8d8b16eb1d4ae450bf477405fec5dc9f16fb3cfdd981fa4288b356dc14e83bcbb21171a80ea9227c884a48eb7ee4ce1b57791c19627cf394ebb652bac4c8c7099e5899ed2eab3cc415c1d0389f13253101dc2c9b4b743770b32691415563bc39f120f627d9fffe29b0407b83318677e97e21d90ee12b7a112cb91e8f66ee0be5993c4fdb21bd84437606700c9a4f253cefcc0d61657d19c5d5720bedb00dde00f23222289551b060e593d50b92dc9a90c29d5567242be088680480302dc03e1d0fd487b3e9e75bcd51658cddaf3622b168c2763abac8f898300dfe9abc916da42113152eff5071db728c117c66665b3473b8fef3c9d9cd37388537479c1c203e39f0a1bd67ed2b26912057a25e49f2e38fcc768d142199010000000000000000e14a3d0500000000b52a489eb0068eb0cedfc51728f7fb71196928796b93429fe61cb4bf3a95186c49748c54b230a68aa820afe25d18c4a4fefd63d3439bca530649eb46057f684325a543552c10e7d6494c5de63850791cf50f5d612f66010b79fed95aa1c1e9fb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021da5d6ffc4c818bb6dae7f445f1fcc33cd322cd2393af3feaec02d9b53d325bcf47853744a59e089d47f7e443bdac95ddbc3501c3c9b9555c6cf71b2147c2d2e6c9506a8d93d00264cca8f5f87557cc2b666e75cc72236abbcb0a321373375cb55293c410913c990ec89ca4677b845090a4424eed68c39922dd5d3bf632ead80217265452538d5b0a04d6c95f3c19379d3c3a088f51a73c0d30900967e80e055a020c1aae368663d9217335896cf458bfa94413a79f90854031e04c7eb1d93803930a075dab0f3912821060fa540f2cdf4e49be0066402bda247d15ff9083d83ec3210b342075147379df2429fe021c70d184b055273e7e52b4500ea8e3c98d33ae840314c189fb4d00d943d1873d3540b03aecad1855120f4069a9337e8ff0b7d095ce0215c97dce19275ee7edb66a9121ce3cca3e2c0dcf6d52350ee9edddff00e03629030e539ec71581b26614a0f8f4fc0089489b43b215bf568f1c496bc441b331c2f7032d76f017c62d972956dc28c7bed9deded853cdbaacfedc8470e3d34d66f436d50301905a8ab31429c6fb8019458039aa67fbbac3593b1d36d7592cd46033cdfdd7da192e4116133d0d746f2447dfe6b15e88153f378c9c370a7ac3e9ecd641498a9f6adf35d1963d6c155472a98135f2f13440c0b7a3d0316f812a65b9f68ccc9a2e4b1dd9681fe0568d06c91b77b81002b9cf8c0cd364bd17d51949b0bbbdcc617bf51bd239088fa6267b2afb5588fe2f225277db1a7b24d44f3e10df39e4d2ce3f5e2b24e9638ca911af257587924471676ba3b624d26490b03d3b482248e203e53fb257bf8aae77bbaeb6487c2a428e47238a07e13f9262d9acd10cebc94f87418a7c7fc631fa859d588c907c945c86a2c25528c8a136fe19a400ea001c253a944947f8ddd8b074dd843c3faa0ef089573239bdc418e010707d4e7962f5d8f634297f31a904d55b163f42121190b3dfba74af324868877b1acec76ab7780904909f57a1fb371f97349b2d0638a7af27167d5cfb36748c5eb93aef57346f910350dd211df0d375b690c27461d2a9ce5fbc0988b636e3f881b68f55e0d93ea142ff921a2565003052d3b4a0b340194b97b6c600bc0b3ba36e18b6c0e1735adcf76abdad87fc57e50f9ad04fe00db728c187179179d3f41c595ba275f6bafecc84f8039f4271866d6f5cb02c9bf00306cbf7aa0dde86e0a0e91a855e6a2e47ed0b5614b115267258d940058cbd6fb27e9aa5d850acd47a8018fad08e60cdb706031b6a77a2fb5dc0971a3e6c69e048e3bc88686de28d4eef62b17cceb16ec8887ad5e686270dfcd3b6e2a0bee0a744b4ce291fdfb6672c811931a06916e68c7371ee7d420fc36057c3adce6487d13213f27463e210402c13bbb9995fe31312b7845338e1db3e29899c7e0f56e0c9f4e072f5e2f8197fcc4c788fe3918071d389f54f66b1ff7f785d44c7fb2652558512b4fc9eaa676174ec356ba37d27bbcd5475ab49793e79b66ff6f28953ffbb85849eb2907d95f35d69d300ba1a5c48d3c328dc4f56459a4cbb293912e8397f801fae5e1b8456265647a9ac761a7825c4ea4636580ea52ac72abbc74dd2c73c4bd09458aca4fc5a542b88af93cc33f5aefabc97c8baeb33a06265e2f224754876458cc1ddd803ecae6d2dc8c62ebf888b36cefa9ed04348800d3efbba9c995095bc1b794b8b9e9867f1c027cf7c6172e7a62083c7db946eacf89b5788bf6ba9d4c00d750d92259a345f5d16298e27a22ccf7201e8a900f277013663ba9924efb26e95eaf5e0cba17f87e1500d1678bb2053a1a84fa2ea35ab4b5ffa731c2be6b4271d67d5e59fb68c8ff33c24362c1dd84f120740a929a079a13cb9daf2bc8b09f139325f92c12b8eb3cf4ad1930b9dd85c682cc412beef468fa8f5ace47d1c370e93a9c6331b1d709d7429883632d994a94a7b530bff15dff4ac8c7cda5c311c004f366997ae1a506661a5eb497d349edf58f55d901e994e172c76e153049577da4b67f3171f18418f6378bebe1957c6cb09bab2f82b82f9b631455321d57c1a25d484a4358dcddca28742cc3c91c6b72009db62d8566a8d605678c7e3506848784b82e85ffb1be42d2ae0c7add58524a6e5a6547dca1a9f826456ca43414ad968166292d34ae59f5147c35c4dfd85dba7ff417d6b585cc7622eccae4872a68d5b4238aa04c2599a237d9499f8492ef37873890978565f90de235d707efb214e02b233d097e8e060c80bb027233c623b9ae69709d2513baf5139483e6e6b170ad843a503b322fa83dd9bd0e3ac61a8be73be5223a170f32a52d33ef1d050fe46849fde0fb141e4af0a4a5155ca7d1a7531597afd2ed5932e07709775f628b57124261ab1098f57e8511e9ad9841df7bf92746dea4da2682b86544eddf016c24cf1109a00", "535200520000ac5263", 1, 885617380, "d95bd12608b9dc8dea40ffef9868f186afca0acf893a39333a01dec96e1aaa5e"], - ["94b5f256012de3eec80dd1456848e1ee2d5613abed14a8ff5e93b10bd8f9db289ece19d3f60100000007ac63ac6a00536ad928b7b703021458050000000009535152006a52acac53a8e549050000000007526a0053635151a5b4830500000000015300000000020000000000000000ba09a50000000000491d5653d744826513066389279f772fce4a119a5bd1c78a32aea92d50a27598118f77d2170fac8de0789ada5ce207d9d865fe04f72c3ba219233fb1c9cfb9bdfb023c9e38ca4764c9fb26c08e70f9ae244f0317fcd691f9131fca448e3a765600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c7a83f9efce7efbda1ed0e94f244ee0a2cc140223a22629136606ea9e401116e026354b8c2ed1197486780029aabcc4b03456c262aef6e85e4ddef30360c7b6a68cd00f4602d087871c890574128c8c8135279da5ba7b4dfe02a76d51ce6a9c0648c4dea3ed937653e420ec4c14ed438127fa61f5a5a4480486fbc96461d19ea0312d13cd52d591586c83b1e517ed2a895e5c50f1729bf3521d4c9a000a2a3366503154ef5644ad820d8ab203414dd98ce508b4fb3d987676555a00defd08414b7dd0a02cc0d97934fb8d57f3efe38845441832c1de99f41e3bbe54e22a99f67cf9756e76f461db9411d494efe6bc8b4d6cda4c9ad0aa8fb037c7d0d3a055c9c4aee12021f3705d63a73ac692d915828115973315b6e72b0e196c44d6d1a4f0129e971fe03089ff69f2c83ac6b832fef420e891023b4e8e600d5f73a2d969c6d61c136050102261c1f5d5b49a2f49bf34f0b095bd30ec40e28146850f7bfd15725e9a23bd36102049318a07468c1b240a22c084123dca5028e3b3c08a1eb868b332035c8953c43031d86d1800d49869bba7a81199caffaf096baa00b02ff67914ed3ee00c48a86204bac80b41e5cb4c07f2cef3d6deb00f464e04ee4aeba65aacbbcc32a0230c2072a56f7c368bac4c8e76a823550ecdc0c27e1e74ce102ac441ebd354c5f20e5121bc86b06687e97edb81835a31293b83a49f704105422714946a1d80d844c301c50b718535d1891de93909e0bbde1a07c1aeeabe65dce3edbbc5285b066a791e42a588cbacf8e66c67efda0117dd2d7815009376b91ea87323c10cccde900cbb7d92563fbfdc9342ebc2a549c1ad72038a91234bf3bcc4b68f1063102a95f22f95ef77f46cf0846200ac6435ab8f75a19c0da8d87663e98420a0842223d22aceddac961ce57be747c845a57361dbc75a4485cca2ad0e82c7650e1db907127eb00a5b22dc4765d071f4dc23035eab870aa207365a40dc3b8377104c0877ba40e1d764db3ca9eb75af027358880d78cbb6bb5a6a65fe15af435641888b3c3f08d0f2453b14c552d9109e42cfe83918f351079303490e9d991ba24e70bc4049667995c8c5f09a3ed6ae5ae99fde4b1099945e35b4660deeb839a0f0150929057d9b71027df61305f594445e037e7d94fd281738b830c1e44232ff53bff3e7a88350f6ff458ceab08aa10482cc845fededc74011bfa13a36ed6b2cc0cc6f6e704ca102dfdc832081337e95b161309ff50a2655a0882d67324caba065c35a8e0708698611112de99f786d20a2ee0b2340fda68b1926be0db051be8db3ac65e3a8f2d448262f1c3b4ba638bf9a5e79e7db960a6a3c73a4b89e1d532b553f240876b678eea3c9440e41fc86f1a7794f1bff7d22f44cab16dc0eef9eb0325be1c0b5f007a20951e2896e8d17824ab384ecd6c041bd158c4152bd1542156bd1d0e3858780ae031264cb3bcd2d34a9276077012ff62f219e539e0da37b298791bf267ddf744a61221d76f03f16fe2361b2ff6fb7318d87029f5755f79efeb6ee2b84dfc0b53493369e7c43116657ff27b1e206ef60ad0bb61a624ead07cb1be2c73afbc3e4b406d4a278b6517ce397eb26b622e81e6f006c798a0affe349c51bcf6cf5d7fc64df0943e83c886197761c757cf5839739b3da6535aee761514a52fafa3d9d2eeed15cedd24d004da15a8120ec8677600caab4d6e73f4ac309430772450d3d50f7ddd4e738c759617488e4dd21e8f6d1f293c90c58ba21b5ad44550cdff07af399cd0f1c84bc5f43c62218d5c7c83fc4337f36260d32171f2cee456f73fdb34fb85b4897edb8aa01f242fee508724e3acd711a78ba57e9d7f3d9eb1d835fdff1795cd099ef1b313691f5ca27a174aadafc310efc28fe8adac9f1491d8e130695d1a3c3a978dd34bdfeece3d7b596da091ad4fb0961afdfced6525ea91554187faf63768f8d0260532d4de4326568e6ed85b9218c928a94cf56325e47525d473f5b3bd31e5eeb60521767fd904c47cbd8763c31e14f8fcfe777f3ff82e3dfa11f18d223029dca17734a48f309d5f39dac50efd4167722bb557c780f465cbdcfe5f375a37486b415cf59e3800660b25f7a52f7d1c441eeeca9f4112647700b89e0c9e7cf9917fb5d6ebf791b5050a4d96a9d02741cf2315cc39192843f773f6a68c1a0e25e71b3796bfbc8581307a19e7be7955b1779c0327d40eb2c4758dbf9aa36a85260dbe2a5219fb1cb2bc1727ba1a69f7ee4c7368d9025fa31880607fbcafc750c29e59ed0e4d8436969190c7c48d6d241ef642030000000000000000000000002b33c7ce356a3873d1f024cd4557b0d9d75af28a064470fd27ae22c95a5002563bcb987044b7f23e22b7f47d0289d767fae8a6d6dd2be9391a8a224d17360ae6fbc00dcfd5d7d07c7163ecbdac9fefed3b8fd79d89c7a1133e0530889282df0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000955666f109460392075dffc5a0af36d9de04031f5650832d46e4d0f50af5d5f3e3c57744472c4431533e27817e4ad13b327ce5391444dad0b9d8957d30844ba4784d64ed7dc55118c4cba2c56c921aac6486ef816f85a25970e43253a4043f5fa2918078f13b9394b505df59147ddc5463d018de26452de58f80aea55807186f020b43cfc4c1c8d9c05986d4fdffac74461c7e23fa07cfddf2b0c59d5c96cf68b2032bf4b43c454df5054825624a77910c9b70fdee807d7251835f594ad4445841d40b01c698783638e33a445c05a6c74a537930c0552a7941a4155190a475d7dc44b1d7a7ab8a1bb0d6bd276aaeb2f19dfc67c718d387eb553415113406073ce6bc820202d15a6cce847fff467fba52923bdcf29deb913d610d21d8bdc20f3718b1e26a022ae1d88e665854cd91858867c73f3ce1ccbd81e979a8d755c67e4f82acb978bd022a6d21aec47fda33b2402278ec0325fd3d071f47c9d1b653b95d2fc19a4d23670207084045e8499f86aaac59bbd7a3b4d8e8f7acb1823ff15cd1ffc1589ef4da7a022b5c4d8929f5dd986dcb6166eb769d80cafeddbf31d33e204b9359218b8055a920cf906c718a6225f439a19d26b26ecd4a82336179b88185e7a8772e1b48510906a5ed65c280f62e8d17db44d3bd084a8798b6b9eec3bf80355a812d3f41bf8da91f8c4e6dc204bc7baa35aeae3cba4965d55675c27cb877fefd5352b06d30241212b4d7830f67d23cd562c6f3b5b949d30e957735eb5bf1491e49b6e82c74a75874c75501ae1cb080d3c7d867f7afce1acc23e01a28beadaab01137e72508217e53fb55faf20a6037e077d9da6dcd6a62d33fadbc9a794ea2dbbed2695d50364dd41878a3ce83f2e37033eb55d719b541c2b3ce81b596dcb9c813ac05b1a724c0c022621246d006dc7ce4fd0420701275975ca7eb374f8828b4b6a01add4920a232fe40db8c4bdb786217a5d6cc532f55d19b435e796f089c5b19c14c00aa934e27e4f01e398db3a6cfa3d535d15d25d87532b63163dbd6cf520acbe00f5507e9cd93ead98b3dc59fcef1984d8252a6b1b88f2a83a5364e8e4c07e0d6d3e9db50b2189733c59c8373994030799416a63acf6ee1c8dd73397456cc0fba32f020e829c7c2559f1153273baba80e8bada4683cc72d3697392b46e3121cc242ba6e5f768da2b14ee73322459152337f3a132e2ea99fbe224650ba487a25f38922f5414223da0a4a315492778989f3c22339797c7af507623221dc8ae03f5b5b488c301fc177af41146b321c3692c1e2c0d1ac7a1b2ec2b0307c09f3a8955e0ca88e7a1c0e20f0fd3784a228a204fc3146668c7823dade0737915fb3295314df8bdda0b225c47d4fd002fc6b83b050685c8fafd6f974a74ac1aa3030a5f35bc7d463efe73d29ef26ae76e07dcf4a52a9b16af0af08b7f885d5984643c52b341eff654aa746bb00d8bb92b7dedc010427b373120dfb2fcf01592c4b21ccdbdebca8188de3decb3227213c915d698b4e66ce75d71e615a4c512eab2d8827a161c38dc432af1fde7677469051c6c7373a59982f71dabf2cfa977be5fb01ff4ade8b636cdf2aa2c82c4c30b8b3c1aa0221e96fc2a8b66ffd4ea23cf7e3a36779ac2b730a0f71a119fd407fd8c8938460f27ddc058e462ac00266d6669e9b5ec7f66150f4093f72b25578f585e5cb8c63c27d7140790d900903a19a4820bcd690b08318e6086923203d6f55f778bc3071f8b1c69b026a22ae29bebb1c2477cb10ea065413f326f4fdf2af684089cb1cff2b79710fc3cdf8880e05d0244778511517c1d97e1f4731ee0b58e927a97c5c15bdb40d56a8597550c8ba250a491effcd6a180eb94db64ffece17aa851c376696c152d692df9205e2be9c9472fdaafaeccb0f3fede3bbc5b864ccf2cc6f8cbb7ec8ac71dfee271c09cd3ee69cf7cd577ab5f3f0db024f0533ba9df692f19cb8a8816811e5226d14b00f6ecffbcc2634dc2bedc2ff3fec3443750e70ec05c861ce5b3bd8b87f74b7a67691686df62ee11cde7557417151295df7d51f12712dd9018fdea3180c516b8088c1d80b596ac94e466a94f2cf22dd7a293a26a81d03077700cbcd64bfe470710344681550beb8fa24556f120f7ff1009c7e8165ae59539e4836e9240fa83d704d3e0269a19196c3621edecdb2d94fa25219e1d49ffe3c5b7ae867f862d8d1008d8a3f73f3be134e0957cbeb1e0167df91587f6a465dd84e3ea09c81fa8952a262cfe60fa6e339269f7a2567629ac6fe0d97bb6c44d0fadc358d4cde5d310fd1bc4320864832edf7c9bffcf22da32e0a75c5285e4b261de709e301b31505244897f1852487c9e1cc34229edeba38a6b04d61cb6f0226c96dc827062d42aafa84de46d12241a28229900c4bea2d128fa66a7b4f7f3fd6469933744eefc90f", "", 0, -456665322, "00edb2a8e64b4ed8faa90b2da5c863614835efa320d96ca7f97c42b54a6d944e"], - ["3719460e031fd671469d2235e364112d940528fc8860d954c95bd073ea7e821ae0f8fb074202000000026a6511ab59aa0a7aeafa6399adf58333dbfb93cb46b4380ad15c415ab4f4586500f5fde18ef9020000000763656563516551ffffffffd9f4a6de6e096899bbae029a84e5747b9dc7673fce6a17e6f821a6f19d7e92860100000007ac656365515265940c207f02ef29c7020000000003536a656a49e40300000000075253526a6500533e2bdb31038adf9204000000000000000000000000afef04d6e6ebd6ff8aa309f5efe57e8220773a1a24347c7766961bba4ce5f53ea16e417b7d645b5e217c9466856bf5ac172782d823d6733459363762ad040e12e6218b1e9d7480d9868d5d0e13ad9c505ef792e39e24073c0008ee8c4ce2420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd1c71468bad00e9d06fac01966f135a5d442ed401ad1c040adcc5a21f9cc0b24d2d9d6ae9c4c3cf1af17f975e7c8f12028d1b7b8677134f24dc65ad2febe5dd827506be6f24548cb816e9f5272d3f1fa7c9efa268a62078d17894657ebe45cb89ab42aab69942c1f2584e38707ddac6e138b9624000621e56c73158a1102e81022ca0e99763b2d0743481d3ad7bb5ad9f390693f5f54028cfe65598e97b3e99e7031233c30e5e43b7db370ce189d0e818a38e9536fbac6e1933deb548537f4fb7170a0191a85760b4d6d1c80a7d73747697cc169e60ee09ce6e76955f9897c68e05dcf9977ef4dea815cacd4a1e273a0287966b0bb88375f4f058b27166920a7c0f470313641b87d81baa2c55ab4a80f6b5fa575509b2d20e91cd911811a0a2633595f2032345f908e59fcd5688d8d08ecee0303917bf8bcb54db0c620b6a5a58cc2abae903130bab939d72705eb6626b6d1e91fe17f58f1581b85042b37cabfc2948e796820300ba04a5c00d187301e1b82a849a3c4c3e489131d31993ae5886a22623c42850031caf8526aa8d124437dde41445d90100da17ca98b41f17f67b712897864063d965f466620d6d7b29b4da40341118f3c0fd13f2c85025e5e8408f87bacc9e6a4cde18e3301228cae03d88f61b38526f4ac1f2407c5d0a68fe43c0abf2b171e91af99e789ef7b112a9fad3d90370d38cb922f2d372750d695945c8f14744283c27ba28c3603784094b441d2307a0c92efb24a5a4ceb4517281e1e72b06ee6ba8e815fbd6a47076942fa8c759c4fea6be87a5a3afd81b2f0b004852fe31a4e6f504ef84d899e3b0afe4a6ca6e6d93db86d8b6ae83bc7ac12f085b5378123ef579da3158387d8bd00687c7e1ccf567172cbfe7a3e1f191abb422300bb57d7e3302285170eab19ab6d953c61f4dc61cc29b58b36ae846ebdb7655129e7ef8994720adc3445b349387e2fa310aef5a419dbe306a5b5a3bffbf331e608a3088f62b5893a497a9959240272e09a61da195e97bcdd0ba730a0583800562f74c6be2cfa57fc09c841ddd08d99434a30821944a2eb0b861f82f2ae5771e146587a4f69aaec5b1ee1d5411577401dabe9bed98d293bc19986049b59c807d638590ad4b0e711c1da2017b841de623b0f9e942e111472766f7f020eb3176a97552ab2c855333f4c721925a760b2de9725ddc249942a02a8ca9075cea3f9837469835b81fadf4b481b03fae1bbf3f242d98d4c35ca009049776df0f4b52f9150163dfc92c5dfd1394c7501e5c82646b222d35c17426225bab377934ff4a1b0fa709590aaf6debde8808b2e36cc01cd53e0ec497769267903ecb418f11dd3dcbc8bc88d2479de8ee783a764c3a4eff181c05bf012d587de6f582c2be835237057fba6b94bc7779516d67d4f8aa8bc72d3189b6978b3d0085b58895c882a3d1a6f8962c410cfcff67ae8cdf454dc19da71476b63cdf9319504ae21cdcce232c547f3a818ae30a4a8d4b101ad5cf892b9d46f52870acb3ec969907faebc06234a12f7131379a5a0f8d16c336bd5328c63972c3740a4c71c3901a0f16310b3dccedc1f8680d918c0210fb55f901e7388706a133e14e76984946ef0046de4e061453ec2eef4da1e7ad3289c6827afb670704af461b50d452082f53bb0bbc2f972a5d731cca63f0f5cf602763ccd5ea4ae8a2d4081504a97348d89fd4f58561209a8f72493f3e77b92ab5cb7efb736f10817942325fc809dced1e831890744b801acd17ec710d3be351984220ae522b7ef2476f33df0db31a138fbd80f872e4bf8ea70e099d392f001b89ef429ceeefeb2bcf80bbaf6cbf3e421cb70c5523c087a5c0dc093fc33f9c922359bad79ab535f681735289edda2cc30055ad0dd0dc349b3cc5c223e5a9778b4df1eefcc894550ce25ebfb7e64202910d6af9fb6baf33cc21a0a092e7301deb7e5007f043308eaf6ef238ef6f1d8041a385b1d5cac3fdbaef7b11dbdbf2637d385fb621bee272457eece7d0c8714b398a9cf5fcd21a37977e8df91fea2ab53aac09cdc30dac6c19b419f7050b5565a57f2ebb96ae38b4ffb9ee2a9cc63616651b0c4d459b9b4a9879a3a23f5686e75c9dbd51ae14627d156f4e5daa1cea555109191b8021557269253114264e5b836aa998fcda6c667f3b58659810577041491c5c28fd135fc58594633dfba8119b7ec8f218a911ebcb9e88794b2b37243c4125d25f7a49c8a33c16ffd6a01f831b3c39b6a9590d2aedc70adcdb5e8043c1875f7731c1ae3ec7a8aafaaa09ef86907947a220000000000000000066e2b601000000003eeea7da2349158cb540fc0d4a482a867859fcfb965929dfe4552aeec31ee398b3d0f81d97e336a8f3cb131e21a1053df74866c2667269c222b5e029fcfb42ae1ea7f2f00e374f75f5f3749673e26d7b6fef5b75b053646c1ad7927f4df34bdc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046109e1194a0a0f2f51d9df17913f82d30a615b533fcc943ae9c2d19da65cf8f674b2e33ccb8cf8c1c526ad042ea3fb5b6ec2ddb0a867f4ccc712e330da479f68eda82c0751a22545f9023a8a7e8e32e3bf6d3f1f6e395811cb3c93f84aa3a11c3668234221d2d11bc26a03e707cbb9d94d2f1bc0bfa52bf20f7c2f5effda3220326354f2f312e7fa3cd638c2ef9726f60e263fe1c01ee8acf7a002a2560e7b299030b0b35532e4ecee8035817098b24ffaa3a1654ec5a32c5e1b4402dd037735a130b08ba049e872f6aa161ad61a1474759a3c527ee5d4a27cd73bffbe8c9a69c66470b1acd5a32d8087a5ec442e8a53f7ed6f223d2e163f266e90d9bf7d565dca6950303149ce808cda97a4214307702dfeb2bcd8155fe761eee88f025e871e549e5e70320ff1e1942299b74d39d988441a42635eeafcfaa26ec0fd258e399d4a3a18bc9031fd533893b8082a6e0ec485a9004f0cf7e32207a79284d003f57f14740e14224021fd54e9d37658b1c48695b5b5401f92f3a0b45d96e649219a21a8c4d0be3a2b80329238b6dca90d09af45d35d7178eb73dd10fdd8efe97742289b8242ce0126360a1dcd061968aa371ff014a94112d2d60f1e5fc9d2d0cf342d3b305a5392b17e87c95eccfcdd5aaa516bd7f9e4bc594668a883d73c08aca4838d3a34ea67365403906c43dac3f28b06968d73a5bc0eb1af106474a181dcee9574ce80edc19c9b8d0a06de3d9fbc9498196768b154f540291c4b5492e2b35d996fe6026f8b1b409947c962ff295f0eb94c86421c0a6169194f7da51667ca80599545b8fc1dcd9e34966673183db1d1de3b16a92e6e26177466be4c636dc2cc332382e26fd6607b2d9379a68679d9988bee52f9f4b98bb99951fe90e30adbe858019655e939d86a68db5f8d4dd60cfe2b758690276b5fcdca9748419f42a6e4defe7cd089079b198cb50ac8e34e0fc034173c5222143015ae67b09b8303a1aba103a8a60ac0435104e5c8007a86414af83ec4ed69f42b57b90a3b1fdf8794d5bb696cdde1363961318f60270259243db14a85b2875723abe8a08ebf4f4c7ff1dba567af587eb354c6fe14acbb309033d25b40b387b83c3fda86e648e10c01ed691f688f0a983c3e6b20e0d61d0889e112102a4cec25dba4d6049bb63d2de5b30e32a11fe0654612c05e8ad69bfc3c8d71e6dda844859718e916adfd465ceb6a0218f42a071a6e42f04909d065236dcca46734b3f3724b90e2d8486f7f4b17a32f859bd49df9b00da77e64cc8c8948e3e5929c0acc84d58c8892a970ce5cc09524459620b76648af3f2a94830362b5c3bdacde0e11a4a63b784b6fb6f147eb4bc616ee6c5801b0e9148b3bf72470769fe98e8e7c5cd8b76af89ce583868f6a3914c9f8b606aeeed4486be8ec57437997557a641b8dbebc516bdff9a015b648ef9fa47dac44a12bceb253c5834c50b2e7a5335ac87d777866fe8a3d8efe250f885a36902d741e2a7d94db97c2d88fe57c0c8d2ede16eb2cee7acd1dcf5699dc61dff7122783bed90d6e44ed5826ba346e2725d354096904b8d3c05b68fc674304091e4ed82a427982256c4f16962e913617eef6d1a260b247a99c855b44a6a9f42baf99f7a9016bff541c20b9ed68f49e1c5e4cbda0246cb06988a7c5bcb84933419490ba8450baadad16fca1027e4017210c7d1282bccca443a4fbc3ef8bb02659cbd5bd526b9a16357c80c35d3158cc51b2d343d11086582c78f010b10d93ab958128c7fea52e5e12b61342f41382590bd41b064cd3d7d10c59cca79cd85605578c40c45e6e8fb008110539e30fb3d678ddb7a470d94ca9f0b66626e96427c4f0ffd0c38fc1fe1fd378928692bd27ff568684887bcf4337e928bb560669abc963adf099c626690fe3e99ff5e48e6873c470c9905a4c914dfde26eb5b97c9855941514f6f423bc95dd0486a8bcd09468b379d97027b505511d62538154a1c125077ce239985ef308ab7038906b2ec53d688ffd4feb326d2c01b6f155564e3116e1f724b4feb4ec19cda4c6db8c802199225fd2e6406da0324b6dd60d988513f3cc85d4d203d72d772bc0699011f2fd18a0559dad61798cd4580bc383d4356cf41b763d66698f69e1c9fcde33b6f49f61180eb0e9b110bb53316852b3b179faa51cf6e6fc7ab2b4fa0c65ebb7b5d0ee66bc073e9883db983cba1a2aec123917a32f24cfe6857aa9abc26669f40e4201f2c4fd4205fb9bd19946073c4d3d89a0ba17b7e87d939bc7e06e5106413063c597a0a390cfb99deff88686a000000000000000054510501000000007f6121fca5828ad2661969aa9bab99d98386e5f7d6e747fa0bb74e92a8f2662a22082c8cdbf65335f5f935b6035ab5d08fd5c9181081e9bad5beddb1f8b30193a361bde02d7d97b6f9460426ce53087d598cccc5757fdbb9605b65a9e737667300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000912164a02e77ae846d96027ec883cb35b3b84e89edf9c8cf9e3f5026f584310c2bcde689cf9fa23c2b38d817e6d02516f9e808ef9d25a674103fcca9ae7715316faeb499cfef895851d74262f5b62bed506108dab5d2eb58e61332360c0bd9c1dda642bd85abe874176db54491b354839892c5b594706b7baf017a007c26d933030eacd6d188a598af59eb6b29b9a3cf659147467ec1909584e577ed3f333e945e02013426428f405b06fbd93e0329d6029ac4b16fb7e76482e87cb0f5e9446383030a0050e9b38f0e455af6a9805e3f424e2d7be807ee1cc354b7742f6395983b9e7cdd811669df09e3e8c4de4908850033911986db0e2fa7e54255dd80d4aec06a1b0213630f534f58e74bd847e391e1f7bdd9f93333e7d42ee890d41fb78b68b1b98c0308ed7a375c5bd8e1ff03ca45b1dabd07e87d38fd22e028cbc4a80a584ca8073b032326308d95bb05e124a33ddac61d9dd2b89f30b3697b0ba91ea9184f57af47b1022ff88d26a5c149d984040eda592edf4f95e01af6a39fa974702cd970bb47513c0225d99998a802621112aa9585c5f65c1e3b166b952777916cfdafe18bdd3545ee6cbce108134a6834a41bed009a28471d7715077aa8831335211e5506c3d295f6c5f91218bc238d54a91b84ceb38d13e3cc81d7488e267d42ac21c63f3d657bb32ce0150ce0367832169c2733ea3d7451cccac373cb5522b85422774e4c0311dd138fa33c564e686435b35366d4927e4b5c5a6d25b85673470670a2ce370198d97e999ce1a8a18c94bb5d2e94db4837ca428e4f797854447db8f73e4f6b71e8531b1bc578b219a96f265ce9218313620057980ce75cb6c87663439ca82392c5ab92eed7346c7be1f72b1657f69010c04cb0146d1ccf5e0f433815da2829f531aa4b26c319f2a78b97c3503ec2aaf120c92dc46b33c8b80a559e8eaefd2beb27030a03376e8a45c5fea0fb9ab656277a910f5cf495e15323a6774cbd7f6d1a969e1ced2e31be0ea1c60256a1a35b4adb8bae6b3870a02b82b1756b3f50d9a8cde9f058014e5f47ff79e608a1f7b36123fa2c5556b9671ae84ac0b9791425bd4c921f984de455a57b3614c8a28597f6811b2f093e5e741f848f25d514dd6251dbcc33a6d4882484b368f54903d97393d09a8148a137d50fb7622de35e3f9ea15aee15ad350b94196235f480e091a725793f9b5003f9c89e5bf8ccac9c14b0bca6864eee62ecba9b9702809b53cda3db19657d6e142e42c606501478899e33452738db6740a748f22a4a0851b586d41c0ff0971f8dc8a0c860b6b4b13d3ce2460e96745a6f981e5ee49ebd78aae0d87892f086e62690fcba9fd9c9c3af49102dbc82f0844855f47e5b6bcd0c81ab028503fc52bf32049875af6da76efd946ff30b3f77ab0bc2fa6add3015c2462fa3911458861e54b4008b41260df0c4371d7495d9ea855a6b78a05659438648f966532ae412511097a28c3158f16ba4a3c90b5219dd348f2d8ea769e21eb9098ed36493201e580755170323babbbc32bb187e4eff27bc3de4edbba4424598ef5f0117944ebdc9e8e681c5d709127e8dac9edaa13f2994cf8ba2daf5528d9e38185a95084fce650d58d2cff5f6bf1b6fc13f06ae67ccd435e5ce09072c924277feeb711b97dbc2d37d311d3bd1e61436d95f2e2bab9b49f491021f7f631eaf29ad0b4ae672fb8a361573afd098a492efb38678e852fa090aa27b403edac69f349c590693bacda44a9d592dc133f2d5872a00b89290a49c3f9f3fb2da203c9b18a0d4dc2287487e0b965787240982c6f9830709648666c0cbb57e5b8a1de5736626882c98982cd2e0aaadb1c89519ad24fc6ecd017d4b9f7b3a5fc8a05c8f68548775efb6cc7208053e363b66089569294baafd9f356b226427c0c6fb08200f54ac9b743e840f0877fd7723623ec3ea113298b8230cbdaad6fcdd177e7f181366434d81cc7e23a43bb6df3f5729697cfa669916f5379e50f2bc6d0a52192ff2794c2e0f31ec524f5882105bb0ea95ae732f826b6a20f56afd140f68c4892da040f9c7184fd562d0875f3f5bcfb23029f2749e9ed74fa2d893db9622cb7f459baef12ea692ef76c7e2b7d1565d5e9d78dcf917617fba4a9756a17c57d212539970d0167de59f3f8f3b991576c95917bd229af3e91737934b2a48a30ecd291d518e7ffedffe89157b0721df816a0ae0a0690f5dba5511a74a27ee6dd78029464b0ffb1fa3adf3c9a481e6033492125c14b26a88813f491b2f2ae951adce057eed0aa868bee42973a4ce26f76b85c5b33aeb49453f8a3ba2731d47dcb34f075b1e39ae2086f8e3f0590048cbb950b838db011f63ff5acf57a5b4717921e2e84f2e1c2c25bfc6d330292aacdf1fffced74d2f7dd5bb745f46449509dad3149cd29202aa091c2d59fa0d", "63", 0, 805557706, "f5bff5fda9240f4ac48160f1b5ea3edaf29079ad774a109090b915c0e7da054a"], - ["4b772936024419605639b5b2429adf1aac5fcc9b2232d32d9d6fd3c7fe179a8b60645ee9c20100000000ffffffff5577285eb37f2a1b647ff362cc5e37726050cfc75ed66a633fde13b19ef16d5e03000000025165b32dd0d003a39d7c050000000000e1bb31020000000003acac5200e6030000000000095265ac0051636352ac1c81b887020000000000000000ee719d04000000003aedd3f315ab2e2a30ca9852045fab64dcb9348fb04d2abe00cd4448d37f41f490723d2346a312d5769fa6379163d259ba3ef7b16b51cb7e5e4bbb72117844488f897c4466d9981ec4aee8fa7f5f02acd09fdfa43c1319e4344daa1469616a2f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d477dd65ef635a8119fb254ef92d267733e53f91706372e4113cc97f641a96044d55434efda5465dd6a913633cb344403e258b1195c062d9880ae37843bf44baaec6fd8db5819caa0bb398373ccd1ced8fa638dc5768fcec0dede047b77b450ce47e2b8af5351557bdc7580a86fe30fd03b0603223019b47274d05b01f9fa061031b6158ca6208a589e4da34ad97f0078e71b60c6f1a2ac85cad128fe83b5aa49d031e5948c77a9c17ea12efaca0194679e51308af374960faf08d1dc73a2ba07cc90b0777cde1c7af043b0dd876dcad98068ae9f822147a0bff25443f2903278598ac21c9c5fd375de3da38e7dc60d9fcab15ea7059c6af06be7e859a83036da9286b022e4c2abe475911f4b1e37f82190bf92fb13f8e61d9be0df07722d1f2de829dae03220849407090e7b84e852310140098b5b5af82e7411413a323c5fba5eaff519c032b19f237724d6dd71225efd9cacda2aa74d370ee82bbcd1987c731b859414df50227b01859342adf518f2c83f3eb890ba0ed83ff59bc5f63207a5512986b2cdd80030475f517dfb242003d9e0a99f06c0751c66ede555792a2532f2c5827ebb28961a59c28cb980f19effbe06a83a9d4bab32cbcd78f5f449fb4be0ccbf320f8699c2342e45c7986b834959fab6fcce606fdcb24b4c8831f9ec9c3bbd30f06c46d2cb5022f9076f271e03fbc4b2975530d35574301b4f3a71280e2b873a3792b6b114c6bbcfaadbfd9d3ffc48e97e7a969d10fb6301a48c1aba53ad6a62d4de3de162bc29a28e8486d6b7100b3572e9ab4ee1149c202384524591ccd4d205c79ffa19385b1c2581e5818c1682f64eeeccedbb621f1c192f94667b13622d9d80f26a292da6044f0ce5700655fc84eb2c27fb2a791b5f3f308d32d67cb97d45244c70c2aebad9bac167ec57dbd0cf22f92dbe004cd6aed7aa0de20ef2af28d7db8e2247593ef7a3f1bc9934217c264c046fc439542268f354e339babb42363d87973c37f468c31f94090b25628b1cf4c442404eec0174bdbd98dff7eb5754d7ac05e8c016a766a95e49c881609b125664616c47c967659ac8cdda97f0c74c3b4575fd19b53ee1ad572de09a073b092f48eae2fe9f8dd3d0ec5d0602cbb205d8b18309c285552464d15f58c4688f2e495e307413f59030f9de8a636484dda4f31ee517128c26befcd9cbcee31bd2dcb345aea7309f3cbef4ff402aa1f667d55aad185e8c5a6f594534a367928063fa93efe8799e9491be8c6bbfe17d67f20d1e51f06c37ecb2e5d117d5e28eda93b64a09a0498dacbee4ed077529a9a07610bd8e767d5164906f62209d5898668339a0c9e902514458687e702390bdf43104730d693f9de04eef50ab0beeac495e2e1cbcf3efce646c00a91bc1df235f1208bfb375e77d266f41ec181f654be8a6e282d09c93143417b19c1a5378bb3440865774de3db45c79cc00fdf49993a97e8d2f2efdb328c892dc9927984004c0529a2d7841438650272b17d7a04e8d269d0a7f63dff092e18161bb978df0a6e6857f48e46d259530f1c8c23bd27e2ce3e7e45dd59e17d65fb039b74d212817ba5690b5ebcf54f39dc9995edc42c849ddc89e085303d6f4c866bc825bbabede9713467e46af5c7fc8e58de26cd00119cdc25ccb0057dff69c53e543323204ff470e6dfad7a3b80514d44d6600c06360bbfb8ef186d9c546d6084a45522c3279c2508248921e973592aed4a0065d1f9361c48a33b281f15aaae56aef0c3ac772e833ce8f2c9c618356fc27c6a83644b06c126fc7e478b70eb450d2c35c4ae1c3105fa413b9b54552982fe85cad3fa57835806578612ad691315e9ce00ba9bb05b866df6e710610510f2b5b10b9f9ec17f17d6b38a455d1a1b833fc7afb1aa5724b573de8d39bbc71e98efd3998bea2442d9ede551eacc1244bda1646bd09df36a294717e2230f32baaf223c47d2f076f75320860d9db43102290c3cc5ed4ce63e803188ae3abf35c2cd5558799850e4a82c2e4defeecf94eed7c5c7f4c5a6428ecd4794c97e385ba801159df19238bb943fec9339c15629e9de4fcfd0492c06a3ce1a4f9883bc5e2c052c19fa22f450c6a057e9a138af317fb1c3b17875ae83d623417d20629d71dbec8d870800b554433c9c936a8b3ba78189410cce1e1b649f7f752df3098688320ffab0dd86b886c03bedbb54dd443a8b0d452d9355587e74ae9eaa5785b190740f26c23ab2a712cf07a2d5c22e979f26e95a3cf206fdf192c8e48467bc804c9f804cb237f8a87322bcb5c6a0ebc993ad2c8070af020000000000000000000000002d1210ba066fc74e21c76a54f5aab753ec09f9fd782c259bad9f4bcda4851f0f061b38f5f09ba2159f46065cacb5c25f11d11908f099e706fa86bb30dced3da9224d6fff44aab719901e93a2a3aa64bb9fae84f8c474ba260c2ebc2a5b1b37f500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eeb2dcee66ba217af55199bfc3059f79addaeda93c266e7fe126b6c1c148515a490a3a7f9e904bcbccb65ffdf3f9f7a087144ae77b31ca891858c76d2310d2bf532eb6d64a4b801f3a0042e6f49d1dec69fb6b33463f012f6557245100439a2ac6bee48190cdd3c94daf197990c03b73decd151e6923b16b763d9b5542819f3e0308a05100acf187ea4da2968f663a4a0dc1d583c99a3b702f24cfa18805522edb02054f5d780d6fdbd4efd27070966ec6ba829d9611235e7e4206d382bbef7bab870b02eb07df396ea7b43a6323485e9426709b325f1bcf5f08a83e9a96d7735c0295c2bfc938fd4249b8406c071e38e03f9d5f65667657413891f7bba05384d7fcb202240e7c55df81ee9e1e2bde42ec0e179f2a1ffcd56f802ffbc9ee1609daeab82d022a8ac708e987b965afe1db65f78102ed04c8d2183b7aa555da8416e64b6efa4802026f5fef48e978c8b58c926987c30f1210b7f449596cd6d9b3a79cf1d819b3da0309a4f808a339f98ca5db3b8a09a2bd07c84e8e0d968a6350dff1aeeb10648100032e559819554173a0464a90325527c518f7758020076c873af7a584060457da4c06afc67decf1baca2cd34067120c572c8bf16e97153314ef0e23bb9d71b680fade1dd24c62c4603c7572b307f6048f4f66c24fcadee71f762c43a08886df307c8fafe9975dd3807bd08b7bac6f0ea08389824661cc879f3fdba0b9a16d601ee4afee079fcd0c83e0b67b910ef3fb333901af871bf445f403b6ac3fb9994c1e66f8f6d706e324ddedfbbae2f6447fe63b3de9b98a7d33f4d4c082df5b3fe42cd932c291f85dd860a3130cd3eabcf320af0cb0887e72e739fb36fcfd8c9ae240d29773d769cfabcf6db73227cf305ffa3451f674950b304cd6ed4a466afa50ac42c773336ecf489e8d856ee5f3f9066e2a4b96e5629c8d29491fa4c17eacf862b570bbe950cb252dac956c2e5278bfb27d8bed51e43a4661bc695b1a6c19abcb9796ab3e666b9cbe6f5d8b81500edd0a06e11faec0cf71aba68dc00ca608bb2e6c8d2087b800d617caec36deead2e8bf16337e3fb272067cb890f3041c5d41f2fd1da006a3822730f34d89cd7e099f529e8359f5e3c45f7046b39806cf4ee59fce3a12517d7fa0d081362b14afe96d375318c41553bd85491f7a7b6a0e065a7cc30d952c0a820dd9c570de7ba5f2cac366a2e4bb5a55330436643ebb2abf9ce937065bb3fb196c304a5bc95ebdc936740fc43255ce4ab198f8b209b3d2c8b350cd25553615db67a34a026a8004bb51089100855a40dbd5d92d18f36159a6e538e2f83607e3c5c8d0af84d161bf85f000f500dd137433163ec3d1ae7875b3777785d410f20b88ff326523d2afb94469dfd19412832d1eeaf401a325a3c2fa17f4a9db15ed9ab5fb1c4dc60aff1a565631f4546de9703d7ef567d7f51f7111f69ec7f23019575d5c61c2669fc0ca39fed640e10f1c03f9fe48aec65da6f8e0eae24451f56e9d6a5e76a5c1de95e5626368b585d13cba5841f8a567fbe1e5e2e652bf1b624bc83ad03ec28310df4b80d935865320631a3f14557ebf338bc7e10add01ba6f64ff9a074bd824694ba0a35a2d47a04133dd38310dda70755fe91ea1fd44b42edb7b257ecbf4aeb55c5d288ad111e58819ff2beba639afc2ebf73b440115ca24b58012bc009344fa59efaa58c2c2d3642ef9f827682010a6599f9acdeb6feabfe4c49ba000d66ec9ab5dfdd74c62349d0e3a1733a502b51174f6d57d620d63df7437f42e04a03c84708d89008e78539d1213bf9233257583465aa5f53c807ae470b5aa66f10099798b04405c3312c0bca9bd4de5fea899108937ae8cf5eda52928b8e744ab7c13d6c8348aaf50a4cb6b0bbc9df890bb7b2cdff5ac253f502a9708e273357aca1961693a1ad8c599c76b529ff58c76addf9b71b9ee24822c1f389d4d3fd120b0b16f49de4686c218016e5ecc2f93e5a25dd3b7dbce6c05fe7a831bcdb179ddd123cb6f0e0a6fe7cd39cff63fc1fff9193276af420702dae0f596632ef2e360764ff8795e4da0fb3d7af1ce2d99dfe33f8223c7a260c91a4a128312bd46e77a6fae847f6891849112da996be6c07c4523669b7861c6808d5333d39b8cd0ca3f16f29b878516db272f86edf1c660fc177a6e86fbede190ff47ae1de2f6a32babcf4ca8d770fd8109f8417a0f7a6951ffafc8ce129ba1a5ed10171504bcb06fda4e9a1062d072bf11dc73e7ecf50c1ef83e01f1a6ea6f22f7e1b0554911b1c9c6f78aa2d8ede55ac41ae72de50abc7ebc48bd9dff883ca0c48d2b0caf60212de255d4c3559364922c900b0128c6653030e6ce113ebc681ff95c70cad48d12d1aa19f5c1be08c839ab0924d0368aba919f5cde354c245aa952042a0a34df3c18e324dcfb58bbc2c63e98130d", "5163005165ac6a", 1, -1690498139, "135061a4b941e1797f70be88982ea88ba9041318830d5582ac0f427a5de174a4"], - ["030000807082c403043342263082d68947e67063a4810dac9a324e4114dbd3879757ef5de72f010a120000000000ffffffff500cadb65ecab1d1c5145ad54f9916a233a09a51ff77518f8155aa1ede5fc0f9010000000453656aaca2c4f1f7ea8c1956cb045b378f3c0c0da3857b2b571ab0582cb0186b05f9b2954e735f150100000000ffffffff3e9c2ad1f615a5dcd40e2d0f9c2ef3479953a039a509df39e3e2fd96caac19930200000003516a53ffffffff013ad8520200000000095153536a516a005153c703e51ad692aca100", "ac5153656a65ac6565", 1, 1289876466, "e6daabb23d77c593c6fd77c3ad25d2d35994f2dcebdec21e8b2b932f7b9b79bd"], - ["030000807082c4030231851ab29b361830bfc09c9dc1ba35010f9d5bfd3c1d5fc359becf344fab6c260300000002536ac2b5e151b186710eba53f696d268112e28e862bb4c443fb6e9d6bad9a64d2c02cb15fcb00100000008ac526a63005152acb1f89aaf0348c409050000000009635265636500655153df317b010000000005006a650000f559b501000000000751ac5253ac65650000000053dd4039022c188603000000000000000000000000895692f2615464e26a7f0269b8f5c41fb576ce5f5ff5263fcc608d1eaa4c1278a0652ae9cb5d4e5eface6f033d928e434e34f5b1809d6259c17c5bf842444b9d534cf92d01e489ee8c6aacd5c6f8f2676fa75a3e310898fdbcdf2ff094bf08ac00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e6ad89b99470dafc969ef9d16a0457b7d202e491f520be1646eabd867c1f88e84d9cee6303fda3aac6516749e862be8bf608935589673aea7e410bff4f192e452acdcdf64fa38e8ec916b2689f8954d10e2c919bf4316057b9e5b0334712047003f7faed6ead488d94edcf54a1cb1d5538843f42b7d213995bad01af701923920208fae84e29e965d042d7787bde237d79d1fc4b4826d531b1c6506b7b7b5f178d020bbb324d01eca89174a35bb4d6b746543404abffeeae61b393d449bde3197a5e0b07eaddc597ac516a85ba6cd934a3690d4f1afff51e423fa34833938c1e8916547a5cf1cf1dd5416b81c3e2b6252064d13532654df6a8ac5ea38debf99ca7b3e6031aaf00c5e68a7680aac9ac3666a2f437fa3dbb392d386fd52fb8b1a816bfa1990306006152d5d8ddcf127b79cb2c474d1175f355fd1e4ddc52ad1ba8a29a50c7a00321a181cdbf32756fdf539a30b232a73c0766389450da269ff5418c20cd33a8eb021f213c136bd5d7b1dfe38499ca63a5ce28e1a31c52ff1e2cda0f9ebac6cabfae031d150ec6ba7afbe70e7ea0cf2a46ee1d2ea6a6434c51f41331625c3a2c06c61cea194a17aa49b771d93288276b0a272d9ee48f8d81308190ea0f947be90c30a8336ff95cd980c574623ed90886bf23160241a72e1c1dd0f4c379c7c3dd86332f486d4c83255f116857e9de014c01fc330a4df90e9819b75a86a0ecb1ad5e520290537dc7ed1c156059ee747b84916eb5e02f5475b55e7be105ce799e1817a93f9a9c4af910fd8a19602152bc363fdbf07be7eb0ac9865bbde639434e39dd626b03e7daca860be20bf399a3d161263410602b6259943c2c77ae57a8c325beb8be857f54d8cf66217f08457cdf77e427bb04dc459808d0d03d0210a6024d6f1bc435c283068b7fb4ab54a3e13c03cc218100ac72993a8a3f616820245d88078697ad20de07f84f55ad96a9a829d76d1a5197bdb58f17a50b8a5b4fe8e169a207003ba1f665f7e62108da20494f8a333e78ef91503109acaff03bf286c13d73091052d4ff5f1cc12b7824821114db76a496f6faf10d031c50987ff41f627fd07fc257b2d93221a5c32d97fbe2c6e7b6c4e6c909c9cfb1bd0d5ef45dfd54dfc8d8d70afeb0416d0275e9ec3fe581e64364172748251a079a36be6c33dc079c2c139fc9752f7349a701a69b809b5b3c6d488ebc7e8d6389f42e5162249d030a359eb21751d72efe2ee9acfdb5f8a6c10b3d52c646782d0b135202ae943e5f03b6083302cf138bdf3ffa8aa7d6ef87b9069be32c33f74915b7e43cfb32aa2b4e1fa5898e983e8be04f7896b1f235f4d18bc9e71656992313b70ef66296a6c1fff08ebebd152c1979d1168a7a27a817bdaaf438ba47d306085774cff31ff9456853db4877abcc954b722ef82026a0833d18913ee7b3587e48fb7b41ab18688f53f5ac6916960a794c8156dc36abff22b49ddf6a5436301ad697b17f2eff7a7af9e42b0e83e23d454ed7f9c7dfca585802e9d65dba1387eb5ab133f6b8cf87aa5fe02b3097434dcd48a226e361e941ae47091f329402ceb5e77445e27291b0541bf01bf898b8dd58b96af2fae9eff65e9c62c0a36d564d62e0f6f077ec0fded9ee0965f2ff2586eac959d4d447b71dde3b9266e83d53ee2df1fb88ef0495e434cf9fd46b6a8360df004afb9582be8347165b4cc3fb24f59bee1c8fe2b55d45b9b7242eb484f16ab32eba79121569d3f9c127f7bb28420e7b12eb15cec180a1d0234f71ea71c7edb11b77fd224e480c0e183eaa4bdafa7b5222749e0b6ced658a4fdc5e438b71c45ffc3ea8654455a0eaa18fdb7b9d1fee22df272b7d3ed4ecf90e5de76897de7c46dd6fda66644e7cbf11a36ae9c9a3df61f5afdadf4f538bd9c22b1056244bd68bd0f1f2876b892ecaa0ea16e719abeaad23a75b951ce3605d0d48b0519ff0528ceb1e37b9e68a1cadd876f76d681f27825636e8be8519577c8c09c5c91c827f3fc5836f88ed28bdcb251878409dbc74db47df6932bbd68ad7a431d9f7d472552f58b1aaef03c9337231cedda0ff4308fe7ed296e7b7e82915ef87f660d0383dd18e5a2141caf98f786bc2bdacc705857515c660e196c3b9754413e0cd07bc6600440d012c2a2da00628e7bf4b5688d4db741fa787fb60b8f6232269dd5736efada0068c701750022f645b1190092980439cda11966bc6d6c18da2b9d377104b68fda777517abafe8f2a597c8b5528b02fd202cae21d040f3443afb0d9cf86602fa0542860674d794c16a732b8f3b4e311f7000000000000000000000000000468b207fcdb3331c8e193ae4d84fa27c376ecd079d940eae0eaa7701e9a0061aa08b84a56f02b7f252276d2dcd58a287efb82ec0d3be0f23536ec27c829124234b63ca89898d4f07081da2103ba2c8d8d1e7e8a0e702b8bcbff766b5eb5c9d400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098c479e6c42cc183a8b66af449d98257eae68cc7c43229ac9d12336e0c9c3785351a9f177d252c0c60a728743bf6a19b34e9f18d56f62438ca1a913c4ceb9f01ec7c6ca88ec7cac761bc8b3394b106280f5a5e827544d2affbf03f1b2bbd3e1be85d59a9024682f67b6e67cab48e1285e4e924e266c95fb77197be731ae4b140319c283b32294f060a3c7cf69f1d41b56c83b36306a3394e18f560b6cbbcc28fb021d71e60172a2e4bcce2f5354dcf879cc97fec9a50f880b59c0c2819267cef7840a05b59f3d43a0375d932ff24823f129d0b10a4062c7ecd1668012b4b8ffdde3bd488dbe0293ec0e2d9b5ab44e0366ed8327310c59ad68041ed00ffa21c41a4cd3030b9365b9dcd7a6ecfd3246299319adaa7132e2179fd3d10b1de103b6e3d554960326f4fda9338dbc240e5ac2835cbaf22d9bc9778f89e87ce2d95012af6da73daa031ab64571260fbbcd115af37c4b755acd606134f01a20caa0f28eb998497946d403252ac06410c56e5a8bf496f06930cafd4321de7a0bc9b185084ac773ac7e11e00213317e669d79a54d26b667a7f9925365c9ce3529eef014148e68661ec2f1acfad9c95aaf17be5eb4ca4650a4cfa3cda0282e357b070c67d368ae5947b5881e8f94eb9617c0a6e599f9139807c95b219fb4c4529ae6641c5530b6c5ac3b30b7cdf23979f06d0b09036a7b52290fad8ccb2cdbaccf11edaea44bba96cfbff91de316138c725e5cef1a17c45addf55387235fdd7e1627f021e16a3224493a845e666926db7b2369ad6167da2fd20bc2f07338dbee812772a7bb3685061b7afaec0c425ef0cafb3efe8b2d279d7e5b403acf71b41b621f11a6c3d6236fe64084c044011e663e236e5ac4bfd4fac6bf15d7748590f01b63be6966a5f41ac6203b256e824864dfe25ec7fc7e8173306124e1dc3a66e418a316396e19cbfeda655e1df0934cbf674825e30a254cebee073a69931e887c5ac03a8b9743a592a91909e64b0f65f5a0a190871dcb9cec95100461ac6cf83d88d2d41f1ed6359440b1136304775e562c59fb1073a1401fdff5ac643cfec901685b9e651939643a667f80386baa4eb86426f673f089626c3e6cb8b734429db67b816836af29d4aee9bfcb705ce1dfd9170d886014ea846ec4bee80aee6ef3ae317de453adcb1a7c2ce79f4ae2252116f52a79c2fd149e60a85748d6a3456c63c11059f3b0c77c146e7bc8af69758be975b224ba695a26e49715e1ea4a281d54a831819d7cb193961ed835a22e52bbe6b2c2c5fd8cc850a1d48a6a2f326be85e7f068654124a79ae1427952e73d1d5f3c7be48e411e7ced79411b45b79c338832a50732552495d8ebb4d61c00eaa6add58a4415d9b11d18178e0eb5c92173b536bb9c9e5b68948ca44dde243c522813fc46c16fe8c0dc3f0bb73471d3714a4b78ac8647a8b25aceaea81ae7a4aff0b27e266312fc7d3fcb248a6aa628804ecd10795f5af8b2affd07a72293846bbd8e51e1318c6a3b2e47c5aff13e2957b25c9fbd2c7acf1eea70a92564319beec2f634de7e736f58651ab5d6b141872b27a44a0671d04997f08bab0ed0faa46c082598e50e073ee1623fb068090839b24dcad01c3ebe17c4b591c00ecabece31524f4cfa0e4b6ba65155d144b5439e615188456276592d9096757a847294097abeb1366f80177d92540b042acad939636f94b2dbb6e1414b5ae57d6e6018d220f805aa9c4ac090397df3d511610de34bcdf628183aa52b90cfc18a9feab1f1c7143095bbfaed0bc7373889cb71d437df91e7e4b476fcb53db1083e43923c07e8fec60600b4ba52e528def937dcd4b3905cdfe13b9d269687ca8d310337ce3bf68ab7d1e1ccd02ba96daf0efd600fadbca2a85c006a75827e64a54c85d0a9e7805e69d60343aceb8516a54505d11eaa484d0dc6529ecb50f9bf669374451472544adfaf413f4a22a266384d67a54f9803083ef6285a4941a9ef9ad3cffb68a57eece32fe62a7efb122ebacff8589bb02389b863665561d31d620b546be38789abfa1594ca251ae2fca91c3e54c44da290b0cdcfcbd89458c19e9fa95212f5af74581ff646f0ffdb328bf15447045dc095a6026941714271c2354c4ebeb25098770395bcada620c41baafbb524c28510333988669f4c42d5e7e09512a4787061157e818a6f710044b315c8eda5e89dc686f676242c5db80424af042e47e84067117d47664eb8cfcfc353a83844a177fb2aedc8fe4c28fb965fba7fc369a979692848a2d84419ffb381052a81148b03428e480f9a4d10d91dd1e7ab53354a8dddde0ee08e35ad9a8c6bb3e722766f8962ae7bddeb20864e7805df0b29e6bc75c9cf5d374226b6f7e6073fc6cae3cb18fba1605b8d5fbc72b221d1f8dfb3abafaf5f0d6f0e10c50ada17abebdcb2eff6bd03c04", "656a5165", 1, -640454416, "068fac29f92fcf159923b4f843199173e75d69636c7e316a46877a5b92da48fb"], - ["f11c0b5c0398815959daa8d5615eb20324e0a266195fbc915f804a76d360bcd62472ae84b000000000046a530053ec9d99dfbb7e87cbf54d45f41c5012be70c7f5f0c64aaeed3f93ff52415de21d605b6a58020000000151eb60b00346e8bf0f784fea4a57b29fb06a0b3e59468c500102f52e63db6f3a18ea5a426802000000086a52656aac530052ffffffff01d5bf810500000000085365ac636351ac65cc5a99b003000000000000000022b48e04000000008e98a4894a5106bcc2b4283b81f9a39a5ec3f2188b1e3b3acf82631b45be76fbaf74669c1cfd233f452c10537571a927bb7bf06461fd63178643fec23ee4ba013be036e95fe4741228661c90003b81ec0f3fcded95e1fa358632fc2515c6d815000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a38f3d1f059346753e773688f37dc5cf47e6cee14c3b99b0c08674f4b4ed383619245836f9dcf4b6d04b04c98f87add286aa9a53c5fb5d2f14a6b1b67eb624ea92b833752f2629424f7e3d85ef6a78baecb2e33f6b39735b43d0a2290704b553b9ba8f3305e72a6a3072bc5908c035cb93198ee955957590553f54a3d9ec80a021edb57e3d488696c48199728d931fab1cb5fe7346d9ffaa0b2f51bba8a304fae03128cf7bf5b5f57202311d4efb46e95935f77bcbf9b78b9289c3bed8978a09b780a008ea9a202beb8f2ab187bd4bebb2c672ec6d633460919d3b21bf0be5b8312ea57679d53f64ea9467e4f54f03496f37517ced593a225d69e628b2aa95ca433880300544cba69f30b6e3fef60c0395a891aacb89c8e59f212aa3a0d7c3c725ac04d0300ab6ead744e27066dd2fa36c56c36b0f67f7967009e1751cc5bb6cb2c0aa646021d83a88e4ab99f79103d5d3b597c6a3c65add61c75c32c4970df1225c9fd74270216023f19c737eaa1fd5fd2a97b3fddc41b937359429f4e150c29e68a3aa9168503203105ca164953378c67234fff2539815a5fad6ad91dfff4cab1e3e341acf25f3d1bceb62a9fe9a7cb41508ba8720761e5c84e6249c6100accf1ea2131f0a06b4454b9f86b8372034e9202d6b5c180de072a9bc883f17c2b724653096dca33ccbaa72f1e45f5101b6d1dc20aa21e88a5ca65dd0ecaced3bbdd8ac893be1fb7d7cf01838732f4a557fee74abd5bbc2099c9daff3638449bcfeb6a841ae7f5c7ab9fd1b0a2c5a10d554b1c966b09dc3cc9683869b51b12257b93a87ca5d625d516897a8191b5ec70ba2f1a2f1c5985f553e07b3c761932c2bf79c74fee46b921e767e2598f42be97c56cd4ca120f781c14a1185696a4f4d1605c7ffe0366557404014c58f838af5ed880ebc47c593badc69a16e3bf3c6dc1207f7e1f7e31d386d542ab62086199b70b46d02b4e686725e467d8f3f4ad6c59a8fefd7a63f4aec0621d6f7f5f2c9a48edb94ccd6e61fe2c53f5cd760eae43b985d44ebd2eb4408e7bbe8ab6c0912b7f643b0174399057a43c52e60fe33fe2463b43dd93d9b88d0020e4f39dedb0c19f95bc8dd1bbc62d92142e88e05dded8a263a5dee0dff95b9f86469f88d392234d55d0d5bcb59ddc106f6ae0de748697ffc238b85d92da6d051a8bd64a306616b08104d7f2570b1e7e0331d96db37ec097d361c6dc98af5dd66497d8c7793c313e9a9aed445fc92f9c63d34e4af30fbf7ff2ac521215bd940304c85e27cdd1f372e3c0c9c97fb89b8806d47c6f31009f1f0b9553ec07d66d2407329cf918fce7953dd75ba4583622a5edc31168a12665c124c000a4cfd79de0d0fa744d5a0440f1a44d136f8d4e56c949591ab699c48a74436d1317ee042ba8e5a61b3c26eae41e177a7d53b7df0112a4c7cb3b82093de91b2e51589c4e641f8107bbeb5a5dc10b0972e5bbf5bf295d5b3110058cf84937f4635a0a6594e3438ce7e897e87efec7a95e50f7c61850fbde264c74a57eb1b4da4c198ef9b8115fb20d89a4233dba1df848495b9115dd1b2da88df13b6dcc327bec5bb6da615714110140866b1175817134dd78a19355f01c96d489b08a0cfa28b790609712788412f20ebfbc94e4261803038ea613fa5231a418f71d38804fc0bc8cec8ffe5c8eb000c5bc9208850d92d39ab8a07108eb65f285b3e9fabff9521ffa7169b3a30641589e812539b2059226b9d3a9d35b8ca09a0fc0f92849dcdb2568798075101d24c84dadfb52b71aa3a5fb5b2c95260df6b23eacc0617e7abb1c38ed241e27746c46252f5544196cdece2f706f069c6d6babbb13143c98bbbf2e56f0d8c271f77932ffe845ce9965dd9ea0d4d7bdcf9b6fb1365e20148140754b18177717798fbc312640f88bf010ac9e672af88a5ad42f01b845899f9558d4a0cacdc3acc3792c7ba470f8906425fdc0a01fc1c2a9a965fbf8e9e1625a1a9abd2f6e1db3eee218d3333ebfff00c7224bade4b17556812a0f4c9bc3d35bae8e363b8f340ffc4fd1d7abc4abae1e939ae9603079287c216cbc15165c3a698ccac8e2b3c484d95bc13dfd8fbbd142bc49032c128cb01712e8584e48721e96cd31f71c0dd78c9a47892078e0e2c911bcd693b0b4088fcde92f2f37ccb512a716af28b6182226e90e9e69a5b507d89091365e746041de8dd59d8b1070c9b72e1516facd5336c4c739244228b7986816e35d2f8a8205c4d60df705f582dfe700d930bcb8bae1ccb2a8e5ffa33d34bebb7ec6a8de704a1d87152faf3300000000000000006cdf0a0100000000a0240942c7c77946f24280275388a40d4d8a16966892bed0e309f73ed593d8fd1b6ed090396639a7b0aa62a9957ec75e925b503af026dee7f77612f862ad7434c36527f0424c2983c7dc71802bdc2b50fb599c651f6287bd58a5983c2204ff3a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000850b1ff5f30f927a383a752b576d0971c3422a526b2149b21beee82795980d484789dee9586d5d1cb34d5b0c14a148890619c6bc500f72c939e9553d875196dcda80f40bc278365dc1de1fde63d83ec7b02ac3fdb35c60ff7d2adab4759a83aa7e73da8b6aec52db9580253bb568f051d8f7e82d67a0d6dcb6a506b51790afa50200604858917e9f2a9ed42e0b7a606036e66ef5283c17fb68c88ca1f343b56701021c7c0b27a45f94b6f5726949d4879b7fafa4853dab74c82309769485652f1c020b081ce7d0c7bf634e8b31153dfecce0cb27fa02d1767ccb97606e934567483bff7c5471924f624efad8fd7832fc38897f2e53ce61a562dd8ce1208db3642460ed030200aaef7e76a2f4b778c2724f8d0d73b5f0ad7a66d227f5bb57fd0fb2e964740227efb90075a6fc220dfeda3332909f9c14944af15bea26ababa164e4f18f16800317ad71716985607373e3e78a37c3645322b7ba62a591581d5b0cceb55dbd544903278a41f653f3dc324f98b6abd9c6a1e825f11637edd7fe38b0f753bf7a0e2dc8032eb6117ab46b133026bae8c4eeb6cc735d62a75f7bc455c3fd379efee31195580476d2d6484622b454b3e334826e0bcfb57b7bf16b84c37b56758d1a4e0004fbda39e1bcb5c199c27ee613908980ea7c63cee478ecf9e3ec91da4f5ba07a1aff2570b793527d80f22bf2773c88b33c55e0b51d2577a1c02e59e6000797743cc3db68bdbc318ae4a27279fec81bbdafd7786abfd092227721a8ec37a7de9c22b0f3a57ba5de679ac004d0d81ac381003791633e2c0e16842a4ade857d937c3c441d113f5d79bbeb5dc474bc797336238c97f1e40b25045aa176cfd5303dd90960f45dc47766f9a4099a5646b857194171b6488613def51151fd13232eef2e9f5d08d9bf585bb31918c2dc3a43205c1dc801f97b5d3dba63b7156613ee3dee907e6f9ff2299d67e08bc7cd2858f7c5cc14456c0375b431ba48e8d57438a62d243f3784f666bed7729e26bcdfcf2131cc39f601480a55387d3d39572799bc3904503b59892f1fd41c4cb170b911a6a0071fd7f98df142dc574882035a04c21136dab0b1a8d8a92a0e657b4fbc4c07b2d2440d77bba25df721a50285f4e7942ba25ffeb4e95e66b047c4b5fd9daf6e28ead46605201793efd6d5521bf8a876c57b74e650d7e2f1de507fb488f28ceaafc2b2a198303c4268ec70d970055650b21d3c36823ab9835282aedcd1f34735eea1352589371bb6002f3a46eccad8810cbe9a9fe15c5cb3c24a8cbfd36003ce7a99b49a4b42309b360841b094d8ae7314262d5f58023489962852863fb952b9d86f94db4aee4b93f12e4edcbecafed02c68ca6cee3d79e661246aa8e6ae6fc99e9e7e14df74a4ec01051cec1344450287459da3f04ef8108ca666239bc2c5ff0c4872a114714c2d94e27f2495527480420c9d5408499a2f4583a4ade5591edfa9ad8ad591dbba8cf205ee2756a9312ec7b218e62fe2a70f32263f9c59dd05220538abca58d1e0084d942b27f612ca7527d301fff193664fe11b05da67ff65c170decdeb84995c0beb3059db6a4fb97e9e960e2f3c9060425826e2d2ccbc2e99e921072b63be1ab5c745a1c9002abe73f4468e52ccfeb13ee66f975a12ee7afbacc0db2aa820ac1d2a76e8959d9ca63e7a35bceee3f8967334a3140fe214967fe1aae4ee99f3bb7bbc4ae2bbedfe9f79766ac71ffef7f67fd01a52d6799bd89781128d1c88fd59fa9e02d77a78a99cf67fb29a05e0b0d334800cdc5d938e1245610e671d5bbf4c872aee25473f06b81c09a904a45641ccea7a559fc387671a81c86dfee5ddbeb08323ed006a591b9e6b58ebc6821a630df3e56218506d2689dfbe00e401b680504944cdf6012cf8192e491201b3693a0116be950b36a1b7eed8d4a7478ce2fd142198717eb2957347568acf0f07fe185cbb9eb7fd8432061939ed2b5c1d684bb050fc0f9bed9827221f04c75b40d351d075ecebdb4b053cd43bd8d86d3b26f011dabf1eb639edd8af64086fea7d40f067799e5a5bae32c7e54c446486a68a6877656c4b56f5d93d95a5f4e4ffb483303dbabb50d53003216d6b858ac8e6467b755368dad10a9df4cb6dfc6c90b81e7c6aecbf4ec61039980eed6a752fa9d9d469c56b4ba65002a92f26a834516c89bd4bfd6e05b66a2ae8387c97896329269823c81e4a20954dddbbcb0e870be97b1c710d333dd46ed69c73f6419538180a1b4f0081205872ef3197d078a4de36ea2f449a18133c7177aa1a5218766696e70000000000000000c355a903000000006da0ca127fd7cd7a58b7b8f8592d8d361b404df38057fb23e0d6f980cecdf4046489975ca998fd0b6d705f412cec598ba02b35cf2214be24ec19c1ae3d09810c14504849dbf7781177e53dd5791537edcfaa1bfed6f1949d150f108728039fac0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028baed1fd9e1febe64a4ab956d8110aa4466fd7d0c9990ce2faca8d21654a9c35c40427f93dabea72132a1e24b888ef8c7cd1127469010b4b9db6ec7ef17484386cffe72f207d182832fd43ee0e3d2d65c2340837eb154c920d115ef2a382c0009be8bfec509b5a61ee01bd1a8f601411d5c2ad82461910148a82c5e1a90bc12031970996d06257638a42dbc78326bc116fbae7d93e630cf53ccac62d938314263020cef8b4cc70f1b6b93fc651adc3ac252f41ce6aa92319b26ea50dc2ec3e0a4500a053e772d4621e2edc00d71271e1861c86736abfa57508bfb58ca7db5a7bbd5448752b1f41ef683b4db2b1d49668deb0e50e7fe2367f3bd9025204b14d81f61ea022af9470848be2632f2295e3368990c454cd3fbf6ddb2720284ada3527aa596e5030d3b4d1b1025549616e3f87d30dab0e9c5445663b928156760aab475b9914944020d8dd790d3ebba860daeea6fd9ef446ebe10d9639bcdf99097006ac85e01def8031050bc7996d1e020574bc589144c676bf270411823746055f6b09690d2abbb56031223f0c41dee48e86c90940b3e57654b6e667792fe6842eb656f115df3c4d50baa40c68824e8379e08a9f1b410d6f97fd80dbc3d03c530008faeee15f1d08646c3fbde81f658e3f74ff2694f83face2e2ffbcaf9445f90bfa66ab47d74d7668c762597764336adae0bd201bff19a385a2b16fd9afc29a83dfb306d45dd82e744478ec403cf9335894e6bb6ca6ba9a6ef1c3593d893f3fb62d9b7e8e6a8e056c98720c3f0779b4b8cccbfefa4453c27f05e703fdcac43ac0a548d0f990ab6119d8a4f44e22773901b4b1686d3650c743f8a0d34eb91a4c5a378213b7e013797104ab38931436fcbf209f3fbd50a5a6743ec8e8bddb82e97a91c4aeb71048601d3d1d34b032553f0f20ce6432ac278f4013e552d43554a6f032ab014ce18efa1c9544791bcd40d3cd587de18e0d47649cc4cf71b43e12555f5aeaf47e1a078c49a91b754b02866d4b8be06c5c510848923c92d8b876649d412b9a4347d1ee758efedbb6a98e3af8e824ac1b5a20f955238688fa3a3dc91adb750d5a2df89b8695d58ce47ce06941e0edef8832a23820238af6e4c36e14ae0dc1076a9f976702079a95c31ef42a81ae62f34757f7987e093106ea4577141d6bf12fcdda2718b4191a3b365b279a6b855844f51866d017fd5ef06d7ddd1da36090bc6f23903209db71f9d6c1032e2caf67e0d230d20a8db5da8417c3bc95f0821bd8230165a22621a82298c3365066e3d1abf8d7a39a6c4594fcd77e2420554dd84c4a61b9caf526641eaed24b4f806b143e4bf1b38f33bcafb275e19bc956f1ccaa3e31cbd499a4bbfe3bc408226e1f7b64a67a6349f8c375617e7fea98c283307029f54eb9cb4691d8ee252ce4c8b7f33314a1ccf51477008cfd9a7790f75abe02adeaa1e0b228beb217125ac1270a33b96ee71a9baa0cef5f7858a0fc764a82accfab43fefa3e41c110a80e9e1d2905146a836672b532cf225563e884b116e63346de276f20cde24c418e6021b7a3c40af347fd8f7fa61d7c841115a428d1e101f2558b44c6deebbe1abb89a9c6bdf316a36b2817d5729dcc2cacacb318050f43e9b54ee7d556b5e9adc3f276cdff2b24ce5b54c3247e3efc16a34b0fcc2bd7891f91419bfff2f400254ff008bc4972d4c17cddb71ce0b95329ec85bd8a10134a1138ee7d53b3ae54a1cf24283aa34b07a8213b6d19d1d988590b20184e1591bd72cb4e7965b47ca7e5bd69bc94adb86341d35b47bdbda57035224c43280c5779fc97af1680bd72debd6c506f8b5623647c06ac382d98aaee8d9054c7a9db9db0c7feb7bdaef2378778bb06eb4e582b25dce8aaa68a8cf2b5413d98f828d85a131e3b9a56e7704acc2c0d8b5470c54badb26fc3b7432b69ce5deab7e07eaed3a0b12d9c292b70525c45407584bace6bb875a905fd11507471e82068e0b9d7d44ebe7be355258489eecd5d9df14c6cc1b09e6b02ebd1859cf7e74a6e2af90e4d0f78984b5420c4aab15494a45af3ab641f72e3aa920461bad732c4f8c39574719b99918a12e8bb67ed88de2ee7dcd8c2b4a8605ecd746653b9558b006169df17541faeda41f32a5269ac02655a3777ff80cefdf8a284ac6f506a9ea2336e845909e2385262aebf67a64f726037b977779a2bd03fa9c367b972295836c83d31676a7f2ad18ab1dc5ee2c0be84c8c9b231033175eefa6d33e208353489f1653b7e6b8f8ab0586b455eab995d11433bd1b0de679760e6e6597d6b11b7569c309cc28930c44b6147a192ad0b5961e931f28ddb4a6ca080a9020bf069278d92ae2fa2eee9e4419355b8f95ae1487605ed45fea1f1fda995c45ab79f9b6daa65e3f4587d9f8879140c61629b0896dd54c30044df651359a3f472bed04", "6a52525165530063", 0, 934885344, "5e357311c48f8b9d18b9a69ee75bcbf373c47939fb001ffa096c9dd94f75e0e3"], - ["08e04d7402e0eac9b25c4b1597d88362c02348dd3744604f9c3cae835ba3c38c919da239e00300000000ffffffff34b16bb0a575173af43d064f6406190ef8eae0b6dee529064f567b568b9dc24e0300000009636563655363000065ffffffff034988250400000000075352ac0052006576a0e501000000000565655152632ff12a0400000000036500630000000002cf040f000000000000000000000000008946ad4f2168ed0f0c08a34d306b3fa8cb70c1fb5140f22de4c8a6cc7609f8aa7f1b84652607239dc7094da9571ae15fb7b9116e4a5677fd5eb978602eedd4e80924e5a3c13edc00aa94fe77a6e19430b619f70d6ba15f9dbaaf39bfd98e64a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae69e98a1c73b907d5c1940ba48a2e3b78802c1fcf28d22cadc3f8deee7e4f8a5788f3adfcdd43e9f14847221ef04fd0bff5c5dfb867c6b598d8abdd25bd228bffcf967341a472ea621ebdb3976ab0340bb88ff4489eeeb1c8e7fa237f3bf87e6458535ba7368f42c159b01ff4f93cd128020dd2505151e056e81ac1cdc7a796031048a37e6525547ae85c67e315b20dc3cf38cfc17488d56af5ff797c2b46ac9a032bd0e37fae579e3956cd767298e4c463890a067a5c531c0de9aba06158cdbc930b00d4ec5b615fa2e8f3893d20edace68cbde8079a508a8f21680a3a96f11a1a5b91d60cdba4ba17f6972d48ea9632620fb65621e8935bfe691a2704904c8f635d022eefadc92ad02fa54c24f166e59d16b53fcdc7f7de12e7b81ca01c429fe66d38032c07464024f99bd268f03a98969481849e239a2a5802a622b610891b0347be010306e5896a7f200dc4cf088e41fc9ff4c5ac47524beaa4e2820cd8e41c5349fcca02194a8da4c4460dc9447d162f10b6b5b8ae2ae3f9cb1d98acdf44118cbc0bf39b021a67ed9b267c61994f06beb61ea1ee1986a995fae16991a87b2ef858f06d6b1acf51ae90257d1e4074fbd3f4a7f2a5e8cef98d4c7fde098c32bb0f4bf4f9ce1e5b54668b52339237914b5d83d8f6ae61217bd951dd56a2d57e35688bfe9ea3ef496c6fa79e103b03497e67a8ef917c9d88a2b5d69008af3c490e1712c9b088c7d8a6771249dc5df057c4d897ad60bdb2b0640c2abb91c765f74b9d5187a259baa6e8e8e814ed97c917f3de440c3e16b73352ac2a07200bc90b6e0588f45c84a04f7f4f77d138b31b1e9cca7ae38e4019f0f0c406d88e1dd04245a89adfb8a5bff06f6e109625261b626dac5529f99319d9d3dcbfd4eb36af1e8690dd00fc7efb08a8e9bfe8c493c1e217ed7f3d6a182f1e3645edb670ec0646c0c35f3dd447028295ee0777212f1d6039ad2322e51317d0562451fe623d29622ac8ac786a2d6d4a739a39be6661d3cee355cb020b86a3086913c5ed86013bd5f436995110394efafb720ff40f814fbdaf784d5c4d5479f9d610ebfe46b1b4f3e4b8641fe6bcbe57e351ebeb1d4b82ec67ca4e56438b7fe9274f28adc9061f2fe75d157b3a94dc69ce068ff85dd280104a7b39a2075ae1bcef28a51897317a95e3e47c391d67b2e2835d203ac2a1f1f4a6d60ab1932428d4513bc8d84852e17c76881fc1a74eafb7b9c9f97b0bcefb6ae5ee400528a346e351c74209b01763d3c79e6a265744d219f09ef8e7c4f54cdaefeef16a12864c27c09026bdd69f20ebc0ba84e33af203585bf0cd64a7c60773093451c277d296a38eb72714fc2f6ccf91d0a3654e4aae9350885b8075a2b687308df21f1e33e875c8244dbb01283ac26fe7cbe4cc0e89e7178de67418958d50e5946238e0c8093aeb076f124e15d5a127f855b89ce5777f71a432b3396ff919f30c7f19cd3ee6337ea46621bb043b958d75c2f044a7ba0e306809c8cc1de73504703059b3f91a5b21db4f984b2f135161ff5146ddd6a45e92d20b03f3284c45289dcebe21841c9c004087436014d1f7a8cec208051dec1802678d28c2c2d0d5604e53f2a70c47dffac3f0156e8f7eb7451859fcd59cf39f2c459ae5967e1a6885773a371c1be8bc467ddde515d0e3b0ec5cd034d8ba5fb5534d714f9863954f6f9e285450c0e18c6c8c559ea1ee2d8f0b02398d555adbde6dc9709c3a57910245d13f667c5e7b7262dbe6ee1093fc2dedc06c91e002d60629c60f3f2049e0f5c8f957db05ea579d612cc38d5ac0588d77f080be75053277d5bfd484f148dbca646917fb9a34ff8cf353b71a81fb473b023401f414b0afee9b93f130668c9e4cedb2bf845ee61e7d3e066e51d7e99eaf5eca61c2ce56df4ff41d5493d0f050b18213d41218fc23f73bf75a9decdcf72bb741aac6e3c9b25f2de79890f057988689b2b5f2cee662691b9dc65e811eb85459d2ff4c40052b3a50e0414e66bf2a102fde88900c93a118904810c5974c25906cba7a1e1b650534394c0abb59f2f8fb8d0110d599aad67523c4f853909cd9e13d9a4187c68b21cbe76cf0581c40890ad747c9504899a4270868e2eed31d1a85b2276632f28d49b08a49a78cc79a8fb1c961e99b7ee00c8247570b6de92d430166322d3216811e4d64e7e5f2f6d183959c1b808722689feb3684bb0a95b542e086a104ee3aa6fea6e3f0a1bfe3a57fb4877666d67dd048d9e5712cb74759a9a0c9aaff5eb5bc86e4ebad2124248c525694d43d4b08f4234d1d0000000000000000febfa4010000000089601ded29bc22a21f145cd77faade9b370d755016bc44e2ec9b9f93a0a96d71430f8bd8b244a9a2c9b6d0b3cf1f29c5bd436d6d593dea1268a401cdc1b9ba895270066c1aa037173aea03f0e78bccbe61a92e0c20be0a3d506e4ccede732ecb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae61403866e0df91eeafe846fc2f61fab8d6a38c30e76c40c580f12c1db6f6597332b86a7d933898f01b1f761aa74794bc7baa94e90361d57c7df3647c5f594c5ceb0c5acf49d1cc9562e8434a031bfc2b16aa81450945b1c474ed816c73df67d0aac77303bd1f386bfbd10c8f6bbaaf6743bfeec44b91d85bd9df066bdb21750311dd0db2c5607f18da64b0f0044c43c5bedc4e207731e780679942686332c4260218ef66e0042dc17deca035443933746c215b9355791a062844b89801dc094dea0b05fbf30de86fbfbacfefb0838639fba8f5c9d532978e2d824d659d46f50c067be5febab83bc0a4071f758b836086c66cb415819ff68b0d6442333bbecb88c01302249cd7d317fa852ef70242ad4d4a74ef4e2db9caf971a73a5ab3c322453e10c6020f4c52e7b0b5c76e294446ded05f070d5e38f9e4944372f5986791feaa8294680305aeace9f8ea28f62ae74647532f077f4c667c4f26d1b401f5531ff1e7f41b79030e962dea992bf44b7d230a82e703e1c86c5f1154222d843f717865c4ddfe1f2802150a7c3657cfca2e0ecd240b88e3c99bbcc4b74a036f0910fc567dd6e86981e7cb15670072f551b4439483c406088434d90152c9a7fd03e95f4ec285cd9304c912bc3b126e87ac8202e55e499ca41046a656be5abcd4ddf60e237b818f0253309f777060009332f5fcb4bfac633f7fd390d58977ca696cf3f601a857c9aff6fae787a7457828dea7757d5f4a16d26338f4e0bffdde889d927de14883a7b903f57c4dda6299b3b7d64a3126692d99f0138a16dafacb755bffff8691b31a8e004b7e5d77485b85dd19b2504dd91c5f0657414575b6729977e22380cc6018bf656e69a537fe4d5ec6f202c0ca5971c15f4148f951b16d46910f225b722f4091f367d687b88a9b227d6742e002af57a151f7dbe24afe542f3dd924c62840a8e4ee3e8c7aadf4bdbcd2fda8983a1872547da4fb3e209f3befae689a0321a9129c2255e5e0d7ba5efb18dd74f10a86692354b4b675947a70f49349bfa89c06a586dc6f699de71570b321fd114094bb4a7c4b5456e2717d28665f05cb72f997c3d21c3de522e3a57142f14f6d51d17ba0b3c269cbab04296fd67dc233362d32e86cc9b9f5d87e69b1c326d22716a1b58750979a638ed6df56e0431d446fe780454f2f2b07e821cdd867200268509cfd6f44d1ddb8594546592f71083dfa3125a57205771982ef7d640f97677824ed99310752df2221fc5ebde86212a06a2b525b6795c2e7d39b4ae63299e68f441cee6393dce34ccacc66b32c2534a9c463ae3eab2ae1ea1ba0efe7f04acd4e5860d0db4876d4656e3421d2e752c3c396afcd81c04568a462e8d528816d90146d9ef55891c64a7dd867266c47da82cdd1b37f1eb7875c5e20193527998a59e099ecb5d72a771c9ecfe1e82fde4a27cfc685f5905ff2c4bd557b5b3620a46a0664202caca6e533eec94957bbc64f0a63fb4b8361233cc3c563e453b73d7d3977fcba5fe8e48f4bca1a23033d5425ed0efb0c546f2fb68bcb02f5a0f5a24f8b22161e1c9439d39f5a7565297b97c059eafd967dda3188414072db1e3d307e4b0f04c9c2c311dd16ea7889e69383300bcdc9129c60e8217402e670202dec4942d391f1ff90fc37fdd7676d3157120be836e0f2635e8a4f6d9cbd931e7e621c86e89e05c494e5bd1391c226a9d9caaba74fc1887f1498b3a6d08dfc385c351f31768fb9ff141fc6951262b97239e09a9968f15687890554a96bf6d76f738a9237a0b59bcb3fb8af5c1aafee0a56de9248fcea9dbdd94cd9d6eae85d2a81bba37e561d0db626336076c3400a404d51fa2facf9c6119d9ae2fb90ad792bbf1c476dcba0b94859f3250aa7334a26efee12116a1d173e1aff8ca780ee970805c8ad76d4fc1384b0ddffec7c78c4936cbca672b7b8879d37b48e502bb362a75194f7cc75469e9833999348d79a11f05570fe5710b3b738590ed8be1fd33fb132fc66b99213c755ee1c275fcb6505c315f21a185ba717ef5eb068413bede9e9df907f7b3056b78845d8ca61986f29a68336f8723c32cafdf54f35089a3970bdc0d1b9a18b2abb17b7527fb79c1078e02e658ad7f2bd08a10816464d24d36155ca8ecb82be6d965f0ad76b0d6a60ae01f403a51e1e98d9ac8f1438a87f6a268b125dab10d03ef6e1d5ce6db868aea823c18f5443850cddf10b08374e951ffaf095b7159cd990cecd7c74240eb22151d759b283f81e4cd8690ab597efd955634a6548fa03ae16528502b64f217acd9ba5a52906fdecc5b5096372da28eca3b5bdd6f19ca2ac6d6ac4d33f9aa3ffb488dee14e226aa9cf57f346356d7f887fde2a4ebb921460c3d4b0dc86df46dc1cbf8941d479cd07a3394799bc2efcf21266cb0623858db559c3f03bb94a0eeb04", "636a", 1, 1955746522, "7a85a7da4d5ae49aac7fea27eda4267645a18e0543ffc650d1b00ed05634cafe"], - ["030000807082c403013b3a8ec11f9af2170f3d719b6b05ab8a7ec0121e31edacee9715e0e37387d15c030000000165cbc1622d02b9ac320400000000096a0051acac535165634fcee005000000000263ac5c361f30000000000300000000000000007642a10400000000b7ec7baf75fe2fbccca76fe4a510862d64c7f04cafcffef4873fa76db433b32363372a0733dab429440e4ec4f3bcc1ef8b695f4ec45e92ef113b9cd18ba9bca1129dbddd99f5bc0ecc0a39f0c5e93b5a54a1a93eef669ffa5752aa70b76d3ecc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c644a53aa4ddc97023c3923941599722e23a4d2975d265d79cdcac15d250b4a825be69fbff856bbc49040a8b1ae1b1b9a55c2aa25926b68a7885fea271c277e406b10f8ba209a521987a86a2f026e8f0973822a46b5404859b3629e8956b9ea8094bdad315ae9e61d08e48866d32bd1b34bbd852dcfdc88f1241fa61436996050204cb7da3fc3ead5e3ed08e51b27e0fcb4db94661808c3dcd059a105944a3739f021252e5289ea2930e3a2e9ff044c1b7014e27371e8c8903f48f1e720a425d8a030b06597ad76d1ed04a5736c1e9e8ae058aa744681ad03f2bfff486787616ddfb9a307917223f94f2ce7cea4a921a3ccf9b31532b4d88cdab90cae2bb0b0d1966d4032866d378c259369f4db25d922bf589ce4bdf1c730c306346f6f007b24e3ddc470207f2f51a84b274454582d13c8a1caffacb965b81edc696f74ee99df47d551b3003056efcdb97cc9dce39ac047164cec540b323710e23c19a2eaad22de33572d26502272d19ac58be29309c805f87dde5922c699cf6f8b7d101a6979b17420e1306410315c237adb7671a51cf0737564c828785e28a39df6576677b8d0ade9d5f39f5ec53e10711c514c6cf6f9cee2501432813f24fb97fade92fbacf70148d0a5f9ebfb7407c8d3ccb20f723e1f31bbdf0e26392c4f17261b66bf56e7637f641180dc8f04814ce15eb0972fabf4783873faccb1babf32b4d19723b1c624b17b47166998083e38ada1908a557163a78973af8de4dfb1446734d8401b0562d9c37408412a86d2966cb14cfc988f4b38f07fcea5c890599ea767d01a5c524f3e438277e18c220f340bd42be58d98204158a1dd84f13cf55429b5bbed35fb89b71df94253d682ab2b1de87a2d3a0adbb33c6f6b54091ba08b79d04d99bfe4025c2fad2ffe4993558e09df8d7549ff804f3c7db19bb11b3094dc3ae69cfa93ee39021f834b6cd6287d4ffa0d29186d0cdd061e2ad9b8e7e289d90c3faeceda12dbb3579f9e58ee9330c22dd0c8279ca8dfeb0f4b1e156343ab326266b1a328db833b55124932db24a9c7d8f6708d61c2b4a35e78ea0166bff547c7c68284b2c74a1489ccb378bdecf449fd0946bf016794972b95d66674d73f5f1de2acd5fbc1b08b17bc1ded7ac4fd5d4438bd109fed2b38e00f28b878dd5697948573e24eff93a1a2e6352e56516ece5705e55765d058cf40193a665204fdbe04352b8ffaaa7a84875ab018764d827da6b7fd505efd1aa8aa907864685fedad34ef1abf75fc377cacdfe5e54b295888639ebeb4a58e17a503b03d930da01e8dcd74e7e360ac7a594a084d0676701e467518262c87c6696c090577472362f7e67e38fc9f3b8ddf1c314d7003dd63478f25f193b2651e023230d792f9047630765ec946306b5d6e4847499286c418be0e77d4cd157d7e5237a8b3ee2cc7f48919227e4c0deb1bfa15c24c57cbbe31df83b3912357e781d4aaa17e4a98feefa87e16ad681e8f8a534438623b6a6eb7d5e772d200d184de1f6b1dd01a5cd2fe8f88a895e6a5233d7cb6f557fc8b69c374b581dcb50b84ff34b15c6148b7e5488fbed254282a3b1af80dffd06c262e94bbe5ac25d938076ab6f2fdeb59254b025699fa33341a310a79e312b3cfb6ef631de4578939aa88f6348edebb9c42e1623b9461f11268ea8af8173ae2182e6f9fc8431f2bc5e9be456f911b3fac9a56ebe9c7ea2d3496e520c9268e2b7ce1050d4445f1d02e05f2b2a65d1004d4abffd0505e1cc5f2be300ca478d58fee5b00dfbab7314f9462f7fb9beb58435cec824a38b4b1aa8d487ac056dd69e8facc6856a54ec0a6ae3f05bd8da4778acebba9cb1e40c79de4bc9c9acf91357c33100d9186e451046374b012dbf9e945ce46646490b5eb430305054dcd8902db2d8f0625215cca2249c1fdbe6bfb5f60894f45de2bfc845626834684a96ba687973787e474e4dd79545124e8a9c784fca913d2beb86ec9afc81e0bdf17762305fc58adc3dbe0d06fb1e5e1b60491291333402e457b1b7bb9c218d8a7a0e6da5c0dc8d8431ae50e587c39dbde7cb86b8a26eac8dcda69f6e6e6f434bfb3a915a1f0576c4902ac4624c48d33dffbe3b977018f11cebd3660257af959c48040c702c463e603b61111d7199dee196827f6f4a2b7c8e7ab8aab0e4b4751f92f2240ae338b4cd81a6f4b4d27c33e724313ea2876f2ffd36143529d23d04b78f40793bf4314e30ca550bb62f01fc13eed20c3623483acff84bce092e03cb4625b91d8075cdf9ca32bc5ad2f8bafffc88a01773409cead6d025c401000000000000000000000000bc4e8b071cc769869bc4f829367a9396cfcdd83385febc20ce913b4a31d4f711289235d572148ee6a59e1fcbc228f50cb2ddbb04c89c2ab91d64c7b860fc4600ed0d94256b6bd7be9d50a576a55a0bcfb445ead46b417cb54cda2ddfb204b4aa000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007aae9e144f9093476549db7e15fb3be02b0b1c20dde288ed401defc3a1c8c00eeb042780fcbf3f6df302dc85c0433b8f37a70464c7443f168acd8c6cc8d234b0e7e82629734b593d7426d9cf0a139044e81cffb9d4e7ed6a2c826c214fd1a3f76ee07d5800abaf42342a9021abe6aae0f0f8c7c77c4f36a63f85881fc4552d99020d99edea40e33eacc0710aacbf246c62486c19cfdfe70ab279e33842fe5341f2022b0ee72dcd46acc6c850b7f5781da36cbf83beb7e9271d94f79dc1175751a1950b00b1f43b0c4304564680c8559cc71b7193f6a2e409b6c0140f70bfd73dc2b2cbc5148d3dbaf4825a437bcb1a55319edccd30115adf860336c805a8fd85655d3602192df20ee26ca48b8403aacea0cac1b472d33c4c6d557a393ba06cef343b14cd021c402134d6b97ec7a56f44c2265bf378af0045884b1306473e590cbe205d935f03185732051d90dab60724b0fccd1b72c06a97bf38406685648748892e52cf120e0307e1471fb299450cc7ba3c81a1bc438d5cc76050da5bb6f452ffe2188e30c4730325246da5ba8a34cb55d8c3a77b148348d4360f117576aee8f59e70112ba92e99a3d4cc51c2df01cacd02c44a0afe52267be0d2ebacc27b669750ec289a98080fdeb09e2569ee386be795adc4f7fd39409cf2666f35deaaaf9e78597ed2ac67134bdd0109b665a46e2bd9488fc1efab8b4a7841cd52b81fdfcf0e88cca9150279f3f55f821dd7922ad13a7060c00a107d9da2e976dbba6c6adc701fe512468342f92a8cf3cfe2bfc12e3366450f7d8eb1743e9c302127fd056c36a344540af76835be39648fae451e1f1370dd3c6398937eebacbea479858b016b23cdcd9c7f61f15f065698421d45c16f493387328bdec4c8e9e2827995e900ac17b5179a3e35bb2612dde4ae99c79ee1e126dad5fc1d39586d1b3a6b6f032aabe2f4a1761fe992093ac6511f94e948e4cd26eeea498391b953a93a91aec7488781a41fa241da92da96f74d7cc71d3ef858ee744a43a643f49269d9462446ce61cfe51395038d5ad36929f8f0ed294eb56fab8d038eb84dcd57bbcfc9f8e4402cf2d464a00b3896adcf02f3e71016062402903aa486798edc161c8b30860386228798d06b44052273135f65063756cb722f210f943b89261a75b3d757556e3243f40d0d903d320a89463459787155bb6d74858f75213aa495c4030ac01feaf0b8195d894ad688af5e7ef4d1b98397b8d80b766d3cc68b7a3fd1500abfa5e4c42c306857be558b63d8694942d7c130620374959fa81be0cea1b04920debad8380ce4360a531de2f7cf2f523d65863beace7b6bcb99cc4bebcf456f7fcb5a295455edbc44c7a8a5d8d74461b4529f1c52162e087c7fb09f8c06669b6c3050bffb2d650e1db1c9b5666e5273f1e40d43005f6dc0985f395a7d5fabcf9d05da6f05e5f438698bc619bea73bdff1b839a7eac775075f89fce50f5beb3c3ed794c17577d8daa3ef99022073d40b124f90fb0809fd5d21c739356df0b9b7730bf41691a0bc91814730f63791171aa28cd53eff038eea56a5c000b8077a457573621d26fe8533675fa17f8c1f32fe30570433df02d489e1b5e4ac955d7fa899e7fc4bd48198a5a1536f6412fbd939005629ef70b981fe8b79707d9379be2c7d9709d0eec9972df6649e4d18d4b3b658ce4dab2dab825d68a443787f865b70abe9513f78a748e8993cbdc1c68d77fc29e43e4e9ce930d25f7432726298d9462054da76f3185f2ae8f9a3a5e6dc9c4638d4a16dfe1396296c7fc1331ea7c06ea83788b91fa571072e5afba9cd725a54aaaa77ac98d070e10ac538cccf5e5a27c407f7b8c92c7c3cfc6a6dfec6d020b9d16aff5db0ce946a69776eb5ce015e2e945bb28ecc0dff03c15ae94b48c200523eef002d47370eef9cc408f9b7397b57c2086b3dbaaaade6217a7a3f2c48f87ef6ccd3c3168de112f810a661d6a96f25add35057fe9afcd3b78520389ff3b4402e4f9e5eda88e31aed9e428cebfb8f47e608311a224efff1000879fbea3dff07c7403c9f66e9835c4e59dacb0f16038457ecd3c5c8b4f7e74bd6d7a6e5a01037d421e8874a93ad96a2547afb0a9db6cd5708aedcd3b632ad50ef66b1b4973c0606f9cba64680a49de6d5412850f8c5e0188144d8056f449e14de4f969c2178936f854b6293917db14d046e090355d0672c73ae5cd966fda7e14242c92ac4ea5b7fb9273a92d17af2a0fd41c4a17a3034a49d1e99615dd2f0e72e9b144ddd25210ae1cdb34671fb34c8c3618e40e40d1a0e00000000000000000000000000d4aedf2999d640601c8ae59838c4e74a6333ef3e1fa52e09e3cc340dcbec06012da7e46e181a522624db2f85f39ade66c940e072ad7c87489574308f38bc305512101173bb544d09c332735fc4eb89cda2b35d7b4b6023583e9f356bd63f838300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000461ca4c6e6a2546d4fb0c12cd0f0ee2ce5872322ac385d6743b58c370df3fb800f8f4c0ea89f7ea896e17e8a6f7dd397830268fbcbf3512f606931838200c5d72342a59f8bde0cdf47810824aa8a9daed3223d9513d4b0971bb3d02ab3cf23d22b5b521c95fbb0448d595d17ba8183f413925af7bd2243e1697643a8f90a6b00022756f6e3c4b4ff13e3c93ceb1b056f9dd2d0154537467fb99931cf860420138c032bb1a97fdd0e8ffbe9d99040b143588661af39ef47c5e69e0bba5beadc25c36e0a08f6f84f843d33f7cc07be6b981d1d56ba1f43f5170ad2066d94e68b92c20ccf2e185f037a7e4957cd23c771398576ebed8f01c8df5365ec536faffdd22e1ebb022759758120a831ddc50dd37d6bae626d4dd686ab9d1da92db174ebf6f6f657a303039898a7890c8db9fccc04dc706e32263cf8bce12f25bcc185a656763a2995400316464ca2b13c12e4ab3505aff002d7942947b9c20ec4dfea8c9617d0e46b7f07031dc9055b6caf400352bfeae4b859f075ccbdb11de41979cad30277d682842334030e17381bb51e542ca8f55216d562c06e18d2c838b9e894a3ef37d1c7d8a8014c93fcf0e4006776b2741d275019eb6fe5e86a5a87061392a7617333253abca9e2faf5a1215c6f0e66dbd3978511ef3f1dbdcf8834c25c3ea561b90b68327802f0028762a0271c43546f5216a93c4591ac6cab1a61611e749ff38ad042b75b8dc9708bab7f6b369eb21d8c0eaa7e6ee53035d2e85e0918a61b24eac6b2725ebccc157eb2020326875df23b366b58cf1d54c6071f65032ade3d118a5acc1e19c988e9ed4150eceef51aa7544425885e92e1d92efc713ea151aa53afaffae17759d64bfca8f3ad424093efcf4193760cceb1712836d76d5b000fc5c97da7864d5746153f497e3c23f2bfffe96f43cb1f5677dfd025c13f644e8d92b5e67f65ec68f9a370b4fa0088f0413686e99b7f78f8928b21293a586eefc120f7a142cd26e743ab6cb5423ac66318fc1d8eebca0a32711a7275747ff39820c9a9d6e7bea2b20330a3658d95a7f7afef1e5c032fef8f78f11fd2672e1b04003d2ebba4679e91f26e2bb583eb740959619423a74d8ef8eea5a15e32561507fddd08b6272a9cdbb428086ce052e29fbc7ce44a54a0a611fe45e2d05baa37f85d0c10317de60e7c737f13b9e0d1f8234e5dea53d4428fcfdfa6fef82bec00d078342ca037000f5d080445a4a0844754b1bd1a17d979b69e888ba861c03a318870eb844cdbda8a86ac2bf448cc3880b4e12c49fbffdec51b66061b62441b24020ff3a4d7c741ee2d95ccb1fa080759378740268f86db0824a100622992eccffe19e83437d59e2c3305e13306b54253b733dce20b1e1ed1af04c16910d488799854fd5cdc71433fcb73e96721808fd37a68ae397105d48eebcf5d9245c8913e31513b4d69440bf48338e3b4d2cdab6f00901b6623be7746e72d2c7801b1cff156dc4d5b3093967991e8cbcfe6753ec994220cd2cec8ce62e99b9b107b63b3711c8c20b13a98188beb3b55f78c804dae60ad472f16b044b4a62fb99de6764360d741337d02f4eac853fdd3d967a369f4e209142ad4922d7d7714de78d8f37d0d6c8e090048c5798e8f036ffaa8e8d26ac57bf67f582abf6907e025cfe6fa5e6c77e09cff8910adb5f42b7aac1601dbaca284cacfa4c1733d3cfc00a17e07185a82024cbf2413c5088ff05584b2d8824f6e1b74aa2c409a84d5a09cb4eee074341a8f5b4ea057c6433f79c4e7270778e0882c0c5802ddf03b86c9ce0ee4803bff8f9a0205c7d9ca91f11ea9c17e34e33beec03a7eb72debac9dbcc6302485237dda44aa598c9c77e2150de73a0a14653fffe6fd2a4108030d6cc0d04d86ec9886fe1d3105fac98b281bdf8236eb8256f8e0b438e6cab210c9222600dc1ccf94c58d1fce97346cc8e2e5bbea970c4ce1b109874b00599ae6898374ff8d216098fd7210488e925c26ed9fc6ff6673b9cacdea731c99c99f2bcba66badead4031b8a01a0eda0f3215a1f0fad56e4c9131abd163c78e2d7e4c90dd5ca9854abfb921b93d7f2f142c5478604969d949464455b5a022d942e6a6530fd27181a8c37205998eae2c12d9b8509cb10df31ad2e5d11567f7fd08becff959a35277a4893d883159f7964b520362b613da12e6530908760e34984b4510e88aa16c581f162248b5f08b241cf323db0bb2054a2e14d5227a08a62bf06c33905c53ea8d6fd8be3b80c82899e2353ceb4f2d0938e90aef55e951b078ae795ef8ffb17eb23932dcb22f71ad5ba316ab946bb1d5d9c82eb4a0cbf896c9b810958333b65fb8938988a16f62634db12149e6604332b41d83eff51c2dd551baee19ed2b5fecd8c51492a87e120d91a8769b864e55e6c097dfd9e34b7cf0e76ede03d99c5230d06", "52656352515200ac", 0, 1984609098, "543275886c88c3ce3856f9d1d0963864b287e18a6a6b5a66ea21a9fc7b4fe9da"], - ["0a5a467702c5858b42c275e6c60c8cff4d4c4712191c22ba4f031ca7e6f9fba94c5044c1f70200000009536552525151510063ffffffff11301a7f5af6d64320b1667c538c754d1c3ea24f9d3ea92a9bc6c9eb5b85d69500000000008a0bbdc9049cf99001000000000089fa46020000000004acac65ac2c099505000000000763ac000000655156bd5c000000000008000063ac52516a000000000002e24aeb02000000000000000000000000298704910adef651b51e87252b820e9382a4c46f49b00c66dc36ef2a7d5654b91df182e43ab882f0f353024a197c40d75b10e2f4eeb86ae8fc42058b08d1b5adcb7a74d17f8b95131e04abfb7f667ba6b1fe821e2fb1154d304c6f4a29cd14d400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cdfcda97d4888e16b28c83b11f32660df9d1958a9a9aa567d45fc86afb72276e5ebbbaa8e3af743fb34955df1906848cec9cf873d256c408c7f97e134ea44405ac53796ed2f2b6a9b011666d2c005671a34410db0e457a4509bc77cb6854af51774233e68b3c7aec6d49baad4b0d4ba95445f6f3fad1f47646b5188e9bdabe61021d44bf07dc5594dc241ea693e6d5ff5cd0df5f804143e02e466ed8f97cccac160213ce5453c9099fafcd3b535226fbfe417b8aa8843e577540d89a49c6eed0ddd50a019ec826ec0302c891304f6f244e42764f4c160eef6d4921a3526e08e45047e5e0b3d24469980581f6e264f1702292a67fc780ac762f42a9ffe4118e315d8c580204b1af0013f19c64daa4d834b8a1b38036a29dbcf74db6b4bdf88ceebc0398a502040a5a7b2ad9132be709fa5699ad585bc9fbbf19ef92ab05ef81e293bb2f4326020c7d08feda8f9ed2236f0a99f64720931362cb96c1491ee428ca588c715bcad602276e7fcfe1906e2110b35ac1a69b6ad91dc8641d9f694830063e85c0f858e7fa03026a84a84d6587a2cc05833eb3e456ad666c171ba2cde06542ca3e2b088c5b66c177a08fce2d6e65a2c7a71756cf4690bfdeccc2417c21c545f90775b4ac9a3cece4f52a0b8ef4b418d46e6d57e2bd4be96220481606cda9e122437a6ffdf499672dd7632cddd3e7497c562faf47f681f5be18b4b0a9a69c72c440f9fc09a8db8d1e450ba0c11af48a7953d8cd5df3d01b913391e35d9c7c13a5facf34a3a298288b89a4618e177f29ba94a0ea059a5200e0b2cfd523fa58b6ca09ef15796309ee470b872f0c4399a8ec00660031d86dc47ce88ea9392c7c97a7650894e4a398c5d2a4a604f85e81ba2ead5973855394ab8c10ee2226cc73f6b8c58e45a6fa42373fc2213b1fb9c25b2e1117c88c348ae7397ffc86ecb5b5fd06289d20815574a947d44afea1ea60ddfefe94ec63068ce67ebadb842b3114d2ebcda5de3f2f24c1fb9533db147b6ab9d480b14792ddeb6da48dd2f8fec80ca30cccec5fb24bf4c20f0973a2f057acf1540b88b6587fbc6ec4fa79e0122ae59bbfc4eab37a06409a7a4e5c93309e1d1c63d25de64a0b5f433851225249a13b0d174f7446e490035972d0b992a2a81946af55fb60ac1f01c53e9abe0dcbabd7347b407ae5531cfcaf8d9c6000970473a8526814f3f4294c368df89a5696ff9bf9bb479d59cb0c6a9bad29a53d9a81defaee33d4e6f6294a2dbc748707638b9a2cbc69eb2ba29f14c1fd7dd3e3e2e860168d563e527c8464103536f6062afb520fc0ba83d1fe3584f10f8912dbb0985a178233ec728ed3fa89c88e57c5cfb815c147ea012b035aa22cc9edc8be61e4c7137d332f130ededa6c44d79a8b2d07eb33ac64574d4a2f93a4ab0dee1fc017fcc8164b4760bfb7f9911d923c18f864e658fd9f10a5e5b25d685cc580352b82cf8625c519afeac5746d5e998f805c47b0ba2165716a24c66eb65db6553ba24e13d117b0cca4b087bdd6fe63d61b003de2756915bec5cf3cf5f77190625df597ac4536c70d3d79331d4d9fcd4ce37bf63bdfe09f756daca544b9abf7a6a2a35f0889a89600c1666203ca28074b738043a7f47a355eea8e3a814bb33709956da577a4aefafa0076909106f06c6dfa07111d25b7a759799e68a16af340b38625452b1cf010949600e4e35ce7f84fbf3d96507954b8098e0bfa8aa34376d3f8aafbb344ffe826f25110bc1a980a9b32903cf0db79ced06043187b48d13ff722c81331e40529bcd19f50c3ff8b27a9a1cfe9b7d35a45f3b720946a03d32937a6fb9368a2fcc43d2239ee61c0a883b270350bd9a6a7522de3a4f5340f2e6745ae36ba66256ef1cad2ae8d76f96031b71f12239a2de5a653ba0cb37459b2dcc82c2fa5a0521d5a156395320fb947a39f71e34ceb5f2367a804a4f2dffb252e0cf298221ed05b8d0bc7401bf98c2145e7870dfe3b4bdfe1bdd3719aebf35ba159c2a9dbf6cc7fe7b0c55cbd2e228ca444184b4c63159eb2fb899b460b165d732fdb88ff5ee5e7ac174c3800aefab932fe442b5c1420eb094b16fda441fdbe5a4e1ed5026710d38e1706d62a6e4a153e63010d69ef1a01c22c1427c511d481f497e0cd916d06c601696835178cdf9fc0c4b92e88d8f70a1a9fe69ee8da1058729e8af9ebbecee6e533b1b7ffa5535bd67bf68cb120a2958e349ea9637bae5fcbaa2b634717598ec71f23dc195d60c42f683b1086f63cbddcf691681041a03cd8034c2eeaff224b96ea47948c52fc54000000000000000022082101000000003c2ad9c8af100c4090f7e0953d9f2d06a3a339332ed0c1e0b8a8630c47045c5ee71289973aa25a90235c926678d860bf1e246e6ff445bb830d35615f3e69f9a962d0cac54a7b8168fb6060d32254e10daaabb3bf530722a5fc1cd697ff947d6c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073b6114831e6edc14a3b8c03947d454c2801581d527e3b3ff8d450316bfe401908494a73e89c72f99e6f097e260ddf8f861266af77767fea8f16b33229438b92903640b3ab808e1cb9d8b334e9c2d5f586b61e960e2c478602ac355a7488db6bdc4b75b85bff2ad1faa8befc83b230db505c2c8f281914c6294a6435ff45cea02104b0a225674dd5ba1a3bfc90e8fdb75921d04f67a93777988ec195d2f241cf60320f87ae8ea6bcd6422bf63edd3e587d7d70df20a7010f268d44ae8ae3bc93c8b0b00a482dda961874538b71f6eb56838355ff3eac6302fa48f584952bbf9a8b7dc3b5a07f93923ce75000a9f3474ad9cbffdecb892a38cb208c4fcec409187b63a030cc2dc5591545e8df28e2513ed17b349c0b198e65982dc068a6c60a73886d0c0030af667725d13c00a9dd132eee6f55be5d6dbf36c8e267b716637da2213c4445d021b3ee9ba3eb46b1063b8f08257d4405b71df0f93bffa2a4c64b9ca7e17478b3d0326dae003ad3df4761a17ab9c8e8a29345d8432e687577937131419a9684d47120207b642c2bde0756d368364559c60a4837f98cb84c45cc08178aa9296701903e3d3d73bda42b96f384e59a4db396644ad5b2dcf79628464beb8e01e8cd066fcec885c2e09b40b5e47beee0c312672ef1323696653b354308fde99566017d2449664c2fbdf237545b32e1622adb183ab28fa7cd1d171dfc0ca9915c47bb7390ddf88365cdfca5d2ebd39c63c0a89b6cccf320c701313259c81759eb4df2165fe8f09df218242b9345bc673f845dcd463c0481f30670c2a5b00c180cdeb7e0726f7b9ae631a84b86fd99be31fdab9dfadad78c68ac7fa051f72efe25345d97c2ad0298225926d829afa05afb1d0a9cff5a8282ad1023bcb6ec0e5bf56010ae2a5fdb94f3ac1b38bfd48dd6efd71bc19218af073b5422e02474bf4c2a97a9f5f9e796f8d01191803e90abd8814c6e1aa728f403d8292d5ca5164eca08b4ebe1ac5934a97ffc320679324ac7f733b6d20b2ba35dc0308a7ae060c47ad02fce5b2d43154e08a333ae41b22a1e95a8c0645bc61d63cb3f22f584a1387de0c4eb6820f48b1933faee50d9b5bd27a46798c200b8cbc36223c5797252aec774ce1a3a86abeeac853c84230e4c97bff3812294b3f71eaccbc9dcd11cc44908337887092e543f5a1d6665274a2054806dead09d50ea0eaef7adff552dc688dce7db07e92c524d2191dd32e23f3b729ca350e3bf7bec8a89279b8547dadee1e2e1380df59596e8b466ccac57d61d55d4cf55eab5af408a1fa4ac99cd384e28707e68cc4cc4e8a61e407920bfef2659a711fb654850c2022a0de74e526e82e34279ccb2edac12270da17e895da75e6782e8d1c729542165988eeb19ad51779763712958d91d1108d5abdfdf749c464859111020e74d17ddebefe0a55a33c32c087813b752130c16de1f453a7d6369448a21acab763ac2607976bc136d92eaecc7a95fb6a05e23d09a8c9af2bfce2964d89c77b03829d91e7a85eb89bd71005f0ab7502f85f11aea7c0cec31923a4b4912e9c5896256e2155f41a60363713797f2e6317431f57391e7e5fcfd26b428b0b588d6bdbbeb55efb3cca5d6684d7dcd9d38c33fa6370d1b8e3a8269faf44ef27d8beab53d7dfa57836ede872d2dc4039f2f63effeab508a9fcb54fcd5d0246728b281ef7c1974c757dece089195851c158417c6aa99be7803fc374fdd4814a627f5c46d623489e3ce3bf84d77dd86965fa4f5f1dfde5742dbb615681b4df8bcc8add0b1a59198e43d59e7af47d756de00dd2fe20cbd86f6d57e661da0cd30b6a5ffc60442b953ece9ba3cf00c59faeea50318f60337b718b77fe5865e23c8b811f4a981187959e538707f81c1e29c43d5b5bb3d1e19fa711ad45653c387512c5c7ae10c0d7eb910ea7895913f55dd6064876382a7fb356e5ba105613724015bca512a9ce51813fee4b12cdc34b242ec0cfd7790609323defc7c48a0e764ba74cee534b54fd9b2f71a4ac2be2797e5273421fd8a5c93e7de661c5500c909bc5398e9daab8cc55563329832b0c9e7553af096f9cd2e45c5ff6ada220cefb23e4f563775e6400c73cd59f3cc3c8d887186a32ad5dcd7f1f2a0a34629a1c9ecded4c6e86e131ffa3017574d63b630965a581ff5117c1289fbc79851a0a02afa57e26ff66ea9448a18034990eeb78dadb53ecd255869c696f845b2830ce08b0ee4da2c8d724ee75abd9717f522b69e19838a5778f36f4899aea30f2c972e783b08f310a9411a28819604f4029251711d5a55d5c778d8cdde0e564701b732a7b14c7dd581e01fedaa37bf4466c6903c01a2e0b64742cc9c738e536f2919d6ac2aacf753fe2644c8a612f8c62a36b99335eb8a1cd58244dce4ec0b8b853eeaed9b13447e7316f4ef02e538e08", "", 0, 225514616, "99efa90dffa8f3423aec0108175a1a05ae944288676f1ae43091ba2c561806b5"], - ["030000807082c403015bc3d6f76b9ee19dcfbfceef19d80ee44961958c3659702d167158d87a3436a2000000000765006a65ac52ac8373393f02358cdd04000000000200534de435000000000004515365651f40aec00000000001096a46030000000000000000000000005ba9b04fe70f00e92d4d10db023dc09abf24521793ad22d2f7e3b8a9a206234cadc91d950410a796710d89925a1cf8fad078160dc2c5216c7e07a5f17556f4b5ba05218ae6092e770cfde16d5427eb849ad8d9de14ce34ce956a8ef3a3b4913c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f2d0c50e62de326edf768910799e6314522f36ded5d4fc4030a23ddfa65f11dea02d52a083e5f3c99f9bef58693d1cd44fc5ee8cc81a5618d6f175bf8be0a303ac5c4aed42722acec6bc26019630cd32ca3f9d001ccff53d59d760a56aa4d59cb1b7bb1b04595f065159146498a69d662efc331ea6800846f26d9f8b34b650be0320f00ce3c6ec8779c32d6921edc5aaa0071f091aeea7ecf1f6f68fe92775c3d1020ddc5c3b059fcb2d3b26db0064ca4153fcc09a9305a2e53e38fa43daf1f8b5d40a082301c6efa150259afcf4c8160bdb8ecc768357cc1e26ef149374bed5a7bd200d909e414e335b0ecd5a7cea9b593f3c6b86f16b2eb59a178c0b7b68808917c5031d406d748a5d3323f2b384c122d9e9480a27b84dcfc4a33cd65590cca7e9165a0212534c06979c147481baafae02b1da593703dc906d829bddc31de3c8cccbc08603028afbb472fb28d3025b6d6ba916987611b0a9cbee7c1c1d93bd64a3e04dd70502027b0782190115d32bffdb013add59d7305c360b8a45dcf8a093d910e44c012a022c676c0e3f29bae54099c7d3428b3e3b9f5ca442ee8016fce453bbe770180122db5246ac86ff8815330ee9bf534f72627bce253bf949488a5342b550fbc4d818e62cdb3b733f4b4cd824b88e59dc04dbae2a564026ecc6ca1571a17f2d5a7eb89c37a578d2df719e11a0f55bb46d14d1bad3918f553dd52360defe93b22dde3a2ffb706d9f4b4d31349050e5c6a49e715926fe1216603765b10b46395fadefb72987a54b4600e03c9b5714b61511dc97ca0bf647e4a6d4e5267dada37f12593a67e5bcaaf21c3c01e9f6d936e518b8678bf6a271f4212791153a02b3af2a0e0125c4fb9595b6ef54c18e052c3afa5e639c418d66468cfb97e5d0abc5d5a362492c1ff4b2f5a4da2483f3fce982f19f396791251ec7a74ae31a7f5a2d047ef756ca6dc0d26441664be40e0a2d98cabffb49feea7d932c4d5826096bc310fb8c2f40ec84976c85c8dee5b81f97e36adab310d4aa7a3d6529f7470c96c8e2993bdd8a22b12c70080b4e33bc1234b07e58d7e06138da48dd7878ed65a2ca203fb26575a2b5d2a45a79f67cc0a893308325285e3df27beb7d66497c8c774c17276a2c086253e1f4a4b48e3185b9b61564e16365ddcc3947513e3dd768f7b7c3e4ae8de941e57daa7e2607550e6d45599b067697e8cf7ed8e20b29559eda47b5b686bbbf6da242802e48189aea5b1934b92af0b63c8b9d5c6d19d8141259ecf67195a4b48b25940f87729b8c125fb829043aeef9780b945cf7c27aa1491e39025b1d7939370139a96fd1f6dd0ff0b4ff85330f18f6c47718f29ec01a7eed5f2a7c6ccc266bac4aa67c4b2d9f8161a03981c8e8e5e28d34ce58be8360f29f13b51ed7a32487ec48a422fd275e2eb77df0e5d9d5fb9a82fb526faeac0c59fa6aefd6ba33dc024b578aa3c109bbfe4ce58a37302276e70ac0e2fad935d659d4d7fb4a52016e6c07ed2e2fe92542930a063cdb498484bb94b86dd7a698ba403e5a2f221851d919f8108c30bfe7253dbc48c9a45cb6429f6a4bedc54c64c54987434ae65a456a721cda5c8108d38e0ecb811040ebbb1b1aa7ac1887168beec652eb464ce55c3ea8f95c77dd39f819b2be695b09b371724f30632255cf0e34b53a368b706ec6e6d9d3d6857f4c1a21cb2e8e68c5aecd08d582380454f640a0a824bd6f59370406de0b21cda89d0528e089b685654902f03a72090d741aa550e36b2e46c70e57004da3829e3e30ff99534f327e298aec6edb02b4ad2e2a65848a3cf64d438d03c08a02b64d71a8573d9087a0e6dcdca50342ea0cab83dab4b1a9e56d20fb3e0297aab499c1472184cf2104e1822bed55c75c43f0c98d1a5df906a430d9c0aa607949fc18dd3e5828c1ba471bb4c637adf93d685f7fc0bb68d5649f332770b095f9defc4863f842e195f02187dc6dfd0b3b978feb67a1cb7c3073936f7e7bee1644624ca179c83800b0bdf565810a666b992aea72205c43a84cd96480a0b4197a3200c6f02c3180f62f3e0ae9587157b482e15b218bf120a155e671efa2a6f91d3083e7645140a32e05bb2921a0c8ad4e2716c4ea13a3b9b88e664a3e9c83e844a0f4622781d253cfc20efc30cd666378a72f03f3c78b24768164ecd11c84cd60b657f9fa584a35e7f164de5e38a951d5f672f33bd528c2ee8bd15970df3c6b2cade8e7c67112ca363c0fc8f4d28a551acf7a1094f274edb7778a000606cc64a5ec7750a903b9fefd8eabb934093e78d3a60822c8902d8c80bee683fd8252f27a9b2c8411993698fc01f9757a89efec1c658ec59b803ad4496ce7e8965d9fc98e9642f561f51f5eeddbc6478c161c2674a585e2412ea429473b13acec197d7e148e5068cd29d57f2178fb4ebefa43add81c05", "6300006365", 0, -1836378548, "02130d91c51c116e93aa32a7188481297fa341b4f9a1b8f9d8ae5ab11d2847bc"], - ["030000807082c403046932e71f00dc3d104508068b4040eb34819192be1bca662bf8788c1a64bca53e0200000009535251636a0051516affffffff7bc6a698b950014bf2c23f78e439c99df0bc8219aba497f465d27dcd4a62565b03000000025163af25a277de77a9698f67fab2734edeb20356e2c1c7adb5af72582aa3b020fb32cdd7cac001000000035152acffffffff5634d38e5bcbce98ef48146ea040837b85c39eeb24f3f114a10152acf1389a910200000005ac65526a5174c7ad6c029af5c20100000000056a53ac5152405f8c030000000006526553ac5100563839abaeccfee303cbfec905000000000000000000000000faa80e0cd947337cd560b5ca8d43253debe0895e19c6d454a4285d2ab7940aa2aaf549c9a6f2cfbaaf9460f06f6ea0b1c595da3a9a1008553c99dc858d4451616357ca02ddb24c0ee08d4a4b66a81464d860280b963174c165b570add5f7e8b2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008aefaccff2539dfe3fd83fe76ebda32081ce610225e88f03ebaa48436043d4fe14f786aab82fc4f54abaec5b42d4f6afe7a16f61f491618a40b1a1454e52dda3109b2dff5eaaeaa1781c45d1e622a8ccdc1cd94f17c26b2807418c1a4e884bba2841ac7f481fd1f96ea2e66806cd5d6582b04641d7970f83245ef24aa45266c30223757342ee4dd402f011f1d544a4cb7a44ebf8a95fa336b1dbe32beade4d06ff032fe3d0108106daf04dee330db2f934458173e0794f1f08d8e0e96ea48ee0d1e80b0304c2b75fe6f031be057a140d2f7d0f776e22ed38595445d8977b2678d89731109b4ff20bea3a998a5f74ae0da138a2b071c86e09107ad1e439a7408bf3227a0327e314b70b36c4f007e6f5ec21c2eb5bb68cbb9458af80f4e00a3f2f7921a46f02004b285d378a4633ab542d1ce8f476310ccd821010006a41bf729f70ff235c04031413a902965b5d2b5d4a828b23241d7267f86cc1ba2f5ba97d0d62652c30e4e6030cfb88fc106fb0f974c4c6d76d904fde60716cae8aaa37ca0a3735f069f54c86030dd0dda7a24873a86f2dfc48d2b06feb4afffe79ce85055a852c6ab23a800e108558181e24beaa6e8e42e6f091bd743a4255386c6104222a70fccb624bef0a47d59699fd2319aed18aced46b94bac819b492047950af11de2b7e03af83d182ee789824cfc341826a51af6116ff9d6313b6d72053660e92f5b0b4565544ddd509d839119aec24c1b950413c38cf8e6335d466f41772cd093815c0a462704b425a5938dbc3b34dd12d65fc4b31db59910588dfb25882834fa7779fbe5064ef6d7a63f44e468164082f80b96ca8db888b02e40f67cad3bbf5f8297e5e958f677f93b17f29430973521453eea2c59ef3daaefa9e7c304fabf3edde386d36cdb4a014c75de654e9ab81f9a684ce6eb782375f54f0ff4b5d290d9e3982d673c3df5271430afb61a8ada48004dee2f2b95d11f8b2df2b6473836fe9e344998dfd2f6333d44d44edef13a610299282c24c68bc83f49f0cc51d438ca511d389049bbd4f0613ba44f083d46aee8604ee26b8d75e211beef88daf3d4b86dd1fd10ed5fc72bba02714f08d39c2fab6a5641246803b35c0e373456a390d30c5e741a14c6dbbf7d80264803663b0e391c8d0822c9ba895156dfe9cd6db81005ddbaed83c31d886f18c8da68d1f6080be12e1c607824015b06b763a386f526aab7f0f4f7369add91c1003b658fa6cf98b6c3226238cf60d05731eaff103f110d090b6d8ca6d836cb0afa531a11560e20f015ccc8fc602ad3b9d180b29ae1846aa6859e08c2d0ba4ab7ac7e20f4f2192aaf83f6df7ff6b336fabcdc6322d01a0547dfc986abf1b4675c45314f8dc68947f06a3ea01eb0c80b17ab5489b344fb176127fa0978dfff415c408dc3114419894b7196fa065cfdcff081d7de5c9c7da2391790c944d27c05e67993e21e1dbdb8dae5717387f3075b0f3ec4aed15df00c9beff5694083618c206dbc2899fc6d6efe13dfb318073961e6df7636bfaf78a296c2e92eb1f037a9e1a4359637bd1372a86bae4adeb8b8d09e3820ca966d61600dddd1365166143ae69bca31998ace5d493a1e9818c1b382b0fc235ad70db5ab09ba1d829480bd654f3b371f74c14862d77eed067f4e23e4a55707e0a6bd7a354ac51a53fbece5f4ee17b0b3a11e328e512057a326f5abb1cf565fc6d30a735ba7e3956bb89277959b0f4887c5e1971ffe1ebaf71f257f3730f9cfe4da66b9c37c8727a1551b49cb9881b0be42e3be70abe8fbb91e10d405bd9160ea5361b7cbb8efa71967a22f6917613628cf83265c733df165426bbb3570dd5b10cac145095d77a19239f8a7d32d7490d1d81755edb66d8b2dff338522ed153f0635402e120c8a140c1d769848ff6f55f0ee5a1c39767b4fcc7d47f772f97fe5abf037bc3b7b6d5e4fafa7296ae0f758dab6d02ccfaed4026f47a855aa6e96f164dc978280d91c826c58a02a75d7fd4fee0c63178112e792d9faa95dbe6158c8fdd8609714584adc23eafe938d0541e890b5e5926818ce9c5a60c111e38f408156e973b2e9ebd6812e122bfe4e727ff96b685f0e54eee0904e11b112248a0a571c15b4e5e368847b7e1afd90c77e8954d0c340d14d495df5e7e3ecfdf9c3c11c460df0d89bfe28045cd4c2d0c3fd795801d50a4e503854d230a7ced14518da99bc5b71ce46d66808fe19426b97ca31c8dfb74fe2655936e00913cf40fba449b6ae7639298672d39e0a5e40b50794e208b90723ba16b8789247966c533932400000000000000006d413d0200000000e830bd21ee5e88076a01f03f1d13673180279109fea628488282fc50b618625190634a8a67a5b66419dcb51dd32d2dac9e70ddb46d4e0a86e56a03a3f294661e420fd14feac87743f005bde5cb8a5ef179b8a2429ae204ad010bf34ba71df380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d7083124871af6e63706a6c898d1428e2150f97cfb1747a1dbd1a419089f1d5474e30353833806c29362390492426f35031939edacbbff2a85cfa32564045f73965427e38dc35a9bdfba43add608e1cda3b9909b95395e5efd9c491f5aa4e9f5a68d2574c954b9afa9ca6bed951d1dc13c542a1576ff3312b5a269444a9398e0327763c61c4f33a049a99743fd3a5ef845ba7f33d8c65a617f5521f77cd74b5bd032aa52d5a4368d6c8c92309e9390ceaf69714e5ee05309b340aaedbac314571cf0a013267644d0184fa0d1ae594ac4bf007c8e33d70045492d3e01257ad110d02efa568ee53034855f51c58e87d6ca68212c6832cc4df98b13463a1f566271fab92030aa173d913f69ea834251ca2746aa213b6fbb17560ad57f2603c1af2021ba46403092bdbed3d03e7cc9d5782d8e5d1141b575df7869bdb631dc767827c134107d5032589316fb44928b934da106f244e660257fdf432bcc2b2aa1dd401c3f7792a3b03157478d90d364a9346d1c7c60e641d79c334e149fc208783bbaf45d08044de000300f98e754a4a07a15390aec28733827a66a19ce7a7af50122e30bcf45773cb5372711c639129889f3f89b5553d88875b61b6f3c86108c3ac54ad1337e4fede4ae4e26f373cada9bd1f08af41d931e0fcb535373a93d7f99c828f5d328527baf271c8c64b9d527c4521042d6d1128bfe89d938717d827111bce6adf5e57178c285218db1754c34fad567333e707e4877f7496dbe8864d704072608a5b55daa143552055d332bdd51b4140b13cac3ecdd474f28b7f99c328b0754c33e6cb6976abed269350d669351263309939ce56ea733bd2459b0cad15bc347faa12795e4a42562bfa4a475c81ba59d129775bdb2bcd2f4685044986886beabb9462e65bf66251609f0d4326677852de9d59d3019759a0c3a09cbe4a4a90dec03aa144fa8e7fb183f2665be2df3b45d8c1b90a2db48485791155c47e3124ab442b1bf9dfce81a4512255ce09ee7add9699f74298b140a135226a5412085386f73fb645ec03d9bebf81fe62c276f1130acef8e8128740701c12399f5b11b72f4fd371726055ae827d6c761b2b5dc9e9b909b85a1fe017b554526ae759dfb93559daf8718ef19a24f08547793aa42aef7dc3a13b9c2f2f1cade31fc6fb4758e2182b22d5eda10643de68cf97e599d575124a51629ea8324aa8fb16b242bb177f660c9e037ce101174dc49a0569707142b51762721ab9ce844ef66fb71c19830251514bac312e624c4efacac835ad32ae8514f2cda542a9d145372a7ee979eef2a4bafc6915b70e29857357cd6c82266fc8045a5c7d4b5d02428fef7880f665526b9e1fc1b784a8ce43dd473c19ea1054ef43e2cbb728e9bd9a2a606e09788ca598d746196be498fb3597e624ccbb68c1218d6b4b9288c58f535f200eaadb04605860ca0b0e70a447a166dca80a7456cf311ebc00bd4db37bdd24cfdfaf846a952cd3c4edd16a33aa3961e9b233650fa5837244f7390bf5ab4e8a855955a5226281ae3281770046c5b26c8f5208a6cbdb7004c3705b71552377a4cf7347b4614a398e1cdf4ec5d5a3a114ae56ebf4a88cbb0b6352abddd2a6076b765a0fcdf508fdc6ea6962668bbf7cbfdb863a7e77f5c8c6e9ea7b341bf5e4d3bf81947074f1e337da3a2df4a26a03c30d9ce27dfb375a58aeb8209cf7dc30906153d8719a85c2274764ac96a5b6d81c6231a9ddf46077a39ea9f1fe6db8d42295bccef9cb6e81ed6f57a826383dd76cabf4f162caf4f8cf3c138f6770f975043930e85251f374eb18c8b766437aa3a4bddcacc2b5bb99f4e5645ae12b594fd00fa648538ab0ac8bac09f1899bb17607f2fcc3aad9e89ed49c449d35fdd287bf858d62d2e900bc4e0a3008824e88512a65db8809855997c43e1295f28a67fba2666bf804a165d919e1502613e61f36783e3275117447abb20c96130bf08b150356bfc3fcfa96c5c223d1d9d52b66b40bbb59787959b6d71f4695c877673f3e5e46432868224bb6faf648914b21d560024829371cb3bce78832248f949807d3ba118f5d0fde0f5c959ea52e541229a57e889354a8e7673e26b682a4d2c429a756410ec50e6f0e8f310079c8a3ddd68d23ebe3cdb221d056340b8a175fb34a5e2009ad323ac7b1abb2749e3ae1126d2106c84c7ba09094ca81b97b6066bdaf8e732e3340d5ba819ed7fa6f388b6cf827b14766a51b15f012319eea52010f607ca9e420297234a428d70ea4bf0a15f05f09de14d747e80002935081d28db7fb3b00000000000000007b7a9b02000000004f01e55acb817c237120b76c9514c91886550460d74b77611c7fce045fab44129bbba65738d5f67900c22d0a315394671253f60bab5005a45c96c958dcdf5ce7e86a431906b6a3ba2d73103959d214b2891033a0208087164ff32914272f026e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000214680900cc22de5fcd1a86abb2fde66ab9bfdee945d1b5e452a8f3d1c63c716f68bfc46394b3297d865c0cf9830322c189db6c0fbbc07efe31df0c5d2bcee2ca8a1910dadcab010875fa2233eecc9eb0b1a9737cd0e4c1a9272942538ecff31c797a91af04e860b196e05234c75c46935a588ff39002f56223f3fba88caaf3c020901ff862f73745fd083665f612185d54fcb6fde3a1e687672cd4b6c9a4e1f750227721264a7619e474643124adce0dd76f73c25a0357efc1636e6714a9b441cad0b03c005ce19b1acaed34db07c3e26acb0bfd3ab49bf99648cc67a940a51c1a95c57845c75a131ff89bda23022ca75ef032be5d281c6ce2322960b758b86d2ecc1021c11c876ed50f21d7ca9fe5a127b09f04070ee60774fabb229ecf50f52143a670313e9216e38968e33277e7010be92a1c82cf96d9d82ac0933dd188c13ec6f4d9f020183c42d78068626bbde35313b670aade7fc79561684bb9c7907833ea7a1942902231e6c4ca87a86ac0391db0122d3d496f767e225ad12daf08cf1be5ef032c2f20216ebd0c035156354d3f7d4afe2b06641ccf98e1753e887062bbcc10e9aace80270eb63ed99bab2a25b59619e1e700d6fc2c0669a7609fa743bee697c674fc99bc34e83c069dd731fab25cb540ad16d6cbcd8d5de7a2ee0c46dd2bd8573b228a8c0034402b1a23670952a6ac5802087e92e41257982911289c266e7aa3aa3e48c96c6819f8998c3414ad070c2d253761958bed10230887517baa3d22a11cc107b3fb0935638891077100535d0c0fb5c1fc72684d43a2e0dd176e9885d3b825eb1abfd7d9401cd7b83c68c7425603b74eb3d1cbe5d0c2424b7cdb5da4e6f56b771cf1958254df6bf1632cdb7f8a43b97861b1bad1b6994a0aca0a970d7253ca58e41c6be2267306c8ec6b3f12bfd098d145fc2f998126cd35d9e626a93db7d4f9779ff4d5763bd2cd8d964dc5e666d9b28f78dbac494d0e92c1bb52b3983e0458e99e1e7877479dbb0f41d9c2d824d6fcd1d652fbe9a5f6d463fba425c56a5f2b49368761bab527ba0a9622e9c66bcdc828927a91a70fa6fbe881d93e0a138fd166ecd30fb42f43e43909f99d2440d0106c5f2bf40c6ee3c1037cc666a0d85a0431f414961cc92ffa68b96f3607b5f7d9f2124514671400bac1cfee343f2ae3e2dbf71bc0d95cea8db53c724f8681fa21578b56ba5f440e2181cbf666f0eb9f20c3ba36450c686baf35515946b7dff17d04ebed8ef48820e4e983c9fd025432252083dba6aca30d51210cddd4844ad02be9465db79ead350edbd41718c261a4dd9e432d3696392fdab078034d4ec11a840571c12f16928b8e3bc07afc1dc03c01ddeb97d0834f2f85d8268c3b85882343ac859aaed5701481429f43eb879a38f5d31df4f15949e6dc92f5ae85da72616b5565150e4630696b61a92d830c5c4e88f88ad99bd5467b0a1fa3648dd6c6e06d1f2571cf779ec52d9450785ecc6fc0f275dcf7effc18c60176f7ea0b8c2f50a755bac17dece36a81ea391b216dc51c4b2be08fc9857b9edfa28662d1a0d5d86432a563e323444ddcb7462d15ec8b6c0d051806fd803ff867593c46f128a67f6e43beaf2d4cf15867b12541000e9ef23019de46aec1cdbcfd1ee61b7f5e30318a4decda83f494d55fa481735ffc555cb4b4dad88767dbde2b6ee9c07c6f7cdafd12bc4edebd290e0188c5895d2c8bfc1b04417c356d5c6149ff93bdaabedd3229197f3241d0d480ae0e9a6441de0e86f3b17c06af6d66dae324fed1eb9e1359306638fd89829e7a6a78a9509da6029b81f03b91b7e6c1ba6e35f5afad25c334031d6ca0e0e19f1b3a880290d24844f03179454eb9c6d1ae9be5e0737717f97563dc111f5e1e8eba453c4028ebf11920700fcb0e328a4b305a65c09814ee6cd563f4d431b1fd339a2079ec4e560d6b19aee597069b23066c1ae465497603e4b181321083b339ef097ecc278fc2fdd6e70b6f02a4640d2b5c81632b35cb3a55af26c2425bf3b831099a60de5cd37bdbd1cb17a2e7a19c2a66b2e68469d3ba010910e8d2dad0427a34fcd094c769056e8d2a17523108a9123e6074b6bbd5247508ee809a4202a9dbe061ab7960de99dd3ef7eb2fb8cd92fa87d5967c2c15324e1ecbe12123e47d8210301e000d1dd2ab8a27d83da145b7b58576e39c2e51b42c0daacd5773ee1d0948acded73df4108b36fcbf12a6042cc4fa84576167c23f0608ea4311d3d2af35d9306235a98f7f3cf5ad2afd5912b8b9bfec647463cf5d2a85c10060db4d467064bf6529fc3fedb7540dd4316ec5af5abd9b771b97fe988b4aec3397961e62be6188d868c2783908067665bbf52d7c1c48a5277fe9b2f5caeb66a560018743d377128b1e27f93b532cca232837e524bdb3a23e944e30aefda3f36a403", "ac", 1, -1374172599, "50fd124dd5f2a00ee7784c9a3a79ca15733a5acd6f5267c65df6d75baa4ca173"], - ["030000807082c4030187a4ab4a7ef1c3fe07089cb05520e4e996a010b9f7dfa5878d0682bc0a2cafe80100000004515265ac3de9dc0102d0ef2504000000000452ac65ac36c2870000000000046a6a6352e909e80e3caff31c019769a701000000000000000000000000000bf0c1155909d4dfda030a2249b80c0814e92abe2bb50ae6ffc9c3c742f5af0316e42fce4a57297aadbc06e76b51640e58860c15c19c7369090387b9050ea22c2e8d1db8e300eaa77b682ff9b443926747375415a5afdd058e49c262cbf30400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fab667469c75ba1490d4a8e78facd71abb4d23e058718256424417a7b6b37a9f997d66ee82772ecaa3f4fbf83dd6c78c79ff22794f7c5f486a540eaca3cbb36b67497f32ff685e181beebf98d7f97f54556b9ea8b62afa11737bbdcd8786145b07aac2e6213dd754424a2240565605e67ec53cb68cbd7ea6f80597368754bd00022aba83ecbdd2183f9b72f74646b79b05687c466f96e52ea782623daa9fb402d9022fa5d8cd07f87343cb90f52f7b00733a69ae947025fe6f29d02962c87f084a850b086368e8fc0d3451eea209231f83e2aba9116d7fad28a121e7d0d955d1a7bb7b508b13251bdedb3dc5aeb2fb237a8a9980cac505f30da6ae30a48b6bf3a858e103279de636b45c68e75b18fa907ea51e3605cf192c8cbc52e97c05a745cf600ca9032d6cd85b64ae8cdff25c04a016e2f4cb8580ae60dffdd95d2a17727d799b5fdb0203d071d3408130f9797539aa729a85dd2b2e88eb2de17c7e4ddf2476210b8635021615e80f6cec459cebb897736114df0d0e7a6b919d88579dfe831c3a30285e150227a6d9e49631a4110a37b60835dc403ac4a819e67e2bc0fa6c8e3ede57100820fab2ff1011f2f78debbbd2363d86d4658f6331ed33ec6dfd8bf0f66b1c569a2c6b11a3be60493780cee48edd69ae186d39f94d00336905ac57fcadf37187a94da17797b2bf2156180a24b9c36830bc0faeb73c9737b5352370ae85c11a51f30453678db99cb537c77252fb5dff93a8e58717e14dc9a65c2ab94b4255d738979ef6a788349caa37a689a7ef7250b9937a76b70eace43a3e49a535bd4bc47ed79936349f39bbdc4bfc9e75b4108b40d01fd5f80a9df916e08b6eac75b4c2f1ba46a9891e5d5a2dbf109b367b1e5389097bf9140a6d9d7f8a36eb234331c69fbcaa209b6ed7fbc628185dc52a8fb6c92a9197621aa5acdcc4deb2c87f7ec5f106585a0dd44b6a9e5999d2210130b1911f1aa716b07aa818df258a29db3c0853d404a112cff265ade846cc11273f2890072130bc621d076a1dabdf57d65a7aa8ae5ac68b91c2a491c4ad6f88cb2b99a13ada45852654540f1d1b544cc4ca1a64e3399f43d909a45321bbcb4a5c473261f55dd199c7830b00c9955d22626966b088ca9d0dd05008dcfdfe4f30a82f1a606bb92c8fd66b165813fc5a5addc895781a191ef359048a78ed784e77688908b2011b76f5658c31f673b5e89ad2f592e461bd722d8d4785a71def2f0071fd47c3b780706e11e186461eacc4d38a5333a6b7d20f7eb1ebd43f8cb8792ea0c36c0d42f102dfe76438951a30dd451de0c1d88ea08c343d945525f530eb03bde8e5b062ac3232657b5c58626387fa5852a2a167e5800bc01b6a29f0917eab43e7a3db4b201a83abdf5d9988dfbc4c6143b2a00fb9e8a6467e7138219cada3f2b55b6f82c2958eca6979c228e8de75906a4560496c1a7cd67760997534866cb8dae8ae290b915bee4e8050c6d5848e7c891173016420b6e2f57332199c778ac81de55381651e456e0feb3ee1cfa8f628c13e7a5ac105186ee289e2efcb5054ec8958edb13c1387edf702fe4252f5e0670dd8f65b391d1be17df6d41628192742bc783a4b9bd1b834cb54bd88725894b678b83643da20c1b6656f57013f3e39e13003829d098c44ec42859cf8294cfa0fc4b33b906c51a6beafe5eb398666d03ceff929f94507cc47b6ceade1702af35af799293040e692d39e528b22c95782b1a5179f5af122e223f37c52438a5e15941e418756db7e5f75bb8d7797be25e4ff336e288fe73775feb57be18ea49b761b486b4a54552a74814f2a40b949fad4ab4270ebec819e0cff25c6cc7b70dfc1de6852cf67a2f9e24f590a0f73e25b467e7f838b99fd1776bfb09a9d290b13e20cf039c8ed96f44c32fa28af521d942d388a7d2ed146ae6d5cada6b4be6fe182364c1ebebbf9ab38a4b008914d1ed1089dc25e8e277ec226794a74b24870cd46806df514cf3ddb487f6d6684be24691217ad4005afdcdc23878aaef7e54c7aeb538c624b839ecb4156b33a5a81582018291ff4053df143cffb9f7e2ce098290f5a459b5cfe8129016b5a2fc54cb5c920ee120da113f0049f71e43cd3171c50bb7db50f3dfb6716f67bc2027b79d384b4e8ecbbe55595d09d62fbb0f64c9ee15061345b761cbda8e0e1c5e2f4f9b3efe3fcd6d278e8e1d4b43999d05aa398af0e57d555c3757467098ec14ab3be1438721c56e6c3dd35d56f2622476349648bc3ba97d3c3df132b6dece60f48d8f7faf7dd2f512af01e8e6776d437f9020996af634c4951d2f39921b8e6c5db6cc27b590bbd413f3c506e0c43bbe0bb693d0bf4148ae816f1a23874b881190e9bf78900a359b68b7e0fe3c406b9b53d4dc89d8b6b79ae87d8f186e07ee8c1511eee8572a5a5b8b592d0370c", "6a6563525152", 0, 23600395, "db8e97a506c2bc3e433b6306270d4bd8b3abeee0a6f5a5115f0036f46b83d627"], - ["ae57b155040b18f979dba36729df56fca5c95f9116076567630be837dd7ad3626bacd0be6f020000000653ac51ac6563ffffffff0c819aa864c50fc41b337cd4ca7c93c50d995103a5f041c0a8511b23fc6e7dba0100000004526a516affffffffd6642cbd57f81ba838ee28eccdc2856d1d0b3fd4d36ef6a3432cc757a4745cb803000000086551526a63655153ffffffff88b1c257e88e15b53f68a62c2c612e87eef1eb7a3ed8daeb270c36ec23e55d4d0000000007656a6553655265ffffffff02752f43050000000002ac6ab63577040000000004ac525265ed360a0a03000000000000000075d75803000000000bcafd7c8503a8c62b5ba31a35fcc33f05250cac1181962d0232ba64681fe9ea847cf50a066512529a472fd7e3887b6c28f4b9b97bf4c920247f4020cdefca272c27ea79ed78e03ca5273089978e447317681211072a22b54b48f2754f6c865600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b9eda1717698614e7b6751eb46bfb965122a6fc3c77cf5ab69d0911228f51dc3af83ef91ecdada881230e18abd77562db37352bb98bd6784ecac150f1446ed0252bddecf7b84f7e24daf4202b4f842b8a652de4d445f4e89a55488a407ec4097dfbfd98015b55ff975d9cc4295dcf6d86d7613809e3f6158e6018536ef06349a030278aa77c7c4eedd8245d7daadb0b17b94fbe19fdb65438e7b9e72a446e9b4ab020de1714cd47a4c6b2a2c22681c94084ce2f2b12ae0bda57d3382a49a729efd400b01830e2995dbe1c12cc67e0e61258b1da7a8b05ef759f055c4a3a8bf3e70f48f45f596f1dc7b5fbd0408da13fb6fc97e02ce8fd4e69590ca7683e1774b218a4e03184fa1627eca44af5e699b000348d535911d52d753a431fe3b44440f37081f9a020cc03943d84e7784e87a68b60086e0e001bf58f84f6dc3b70c843000fddf46df020ce1646805ae55857761bdfb66978af5714975d14c647291a1ca40d46b241046022a179d02f502b568d619d38129aeb1446053ad574211fd6a5610c6ad745f25b60202e369e3e55c187899512a5e5ea33fc76cf0c7b58486ff15660fc9b9e69e9ff2699395788d5b74a5d35fc49c6da66cba4e8d0058a3bbf106f1c47a6b27516dfe3680f37fad52f4fb5e3f92e5594e232161cbe4f7e9c1b0aa7bdef68aa38e7e653a49258a31ad024cb7d49edf7737e7b4ca7d448f87ff2db6b56f1d8f14d365c696c7c13302fbc207bda3ad78aeb5f14fd00d1de5c21f4780e4edb065e5aecb743f5769c088d7c82fa788e5566ec57f09b24015a1845f41333b657a25eef3818f07acb6f1340cb79b7a73d36e0ebdb69fe9bcb4e2293e8fc8d351a4caf0e61b0dd5f0385c4fc49b07e51fca73e8ad48c9613b0935c9d9ab3ce9ca6518a3f2d4f0721d700f2805e1d0a0349ed467612e226b16d1c6c9ff0a4f2f73cb356027daf964009339bbe699822eb9d77c171519feaec499f5a044d58f46f4e41834691687363e39e9ae19479e2f65a817999d16491fe62392ac516ad9f938e2d258f9284a530da91b4d01766e1fffe9e007cc36d300188cde74dee801dada0bfe1c604cfd7a7cae26acc71a8479dc0f2a71bf402ebcf604ecc8a8850b565d7bcf097cfe90e0962c4f99a664920dc8f7d3de81844633cbe8afe8af42ebc8e96605d5d3754c1f5da7c16e9c54bfd75f22907b32194a3b8fc02db6f8a056329678a5e7e65c873522e7de9811764d26f2413fad5f4cccdd1de122991c422b7e8a6cac126d900b4c981c034030e72c087b077061442595f68617285b0801d481e4d4aba4655cf2ca99556f13894a2ab0335c4386086fb84383539d6c65b65faf5d42736d1e6006f9d969a53533337b4802f3b222487441bc6b45792641f574caa0b3dd0f81b160130ca22d0086a2d2dc7a41d27480a0959fee366c15ec282c6574ed3c669608d002fac9df6f9a46ecd7fee40a312be51142580f5bdb69a08cd5e35fcb00d8839e360ba1e17d5b58fb109a27cb485dab8e9107c8666b002c304f58dc1a335674d3c8d97d12d078897c154f749881e7dfb10e20bd36f6f6f4efb47b99df138a43b1f2f88bcbb1ecebc26ac9b56aa8c2077fcd6952f8146acf17c00a00e32e4dd50f4fba9c01c31aba4e263b108e73d7a847a09822e79c44ad3b7f46f8f691f1f1371b6fa7ed4d7d23a14c2d9095c0507d25fbd51a1f2e3c4b6eb3464e3c25743e7e18ecd4684db90a97b8517bfe31cb6557763fa02dfe76aaee2a99e5ef79993092b8c7fd111e480f19e177b56d913ba71b1eee631406a33f7107fb300c3faa49fe82d46c7cf018e7f9f98d2868d691fb9d2194bffc4035ff11227fcafb6f119ee0b0196955262e669406a38b165ebb556acee7af79fa73bb70d7c345a8115681edfb52e576af50bf37a5683c2ad02e47ff3a824afe88d00e303a409b3275082326883baf6605b2493509bd4b6ec7028284eb9b1c54f37198316c2edf87b0d25a147654476c2e259cbd6260393a1322fb99a6253c3a59aab6a7ce3bbc89c81f03ed88a931a5ba9c3d538bf5e4178b07c4ec0f820da0376328522b15c4229931b03f95b2b9d2946c64199851cdb1e6a78ef7e078ee40919ad56688f11d2e4afdcb5cfb4b8ac55fcf29fd991b0e5c54cda98a4430113b01c2dcf57489bf512151fd96dbc119907304787a57abe2147dcfbb29b533ef527bfac073fbec8775cfd5165b8d7512e2679af1cdb32e793dced17b7fd7d446c6cbbc970ed11fb556e91d63ecb768a2e3e101a634f582ba50ead1914b9c9c36452900000000000000000000000000309f61b7158ded5ee8b9f2939c78b88d956b4dfddf56d3c1d40c6a6df0ce459dc79b38c94495705a9a6ba868b13383f8ea9c3999264e80799b032c56c1431512621dc2320c8811d993df83b507546fc43aee9c6aff2206092ef784680bcc10ec000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004618d5d481a82b9b1cad2b590f55b96b209c5523598adc1e5ad0d63789a9014f09e531f831d46005d716d067732b20a845444bbf0fc34e7c7da359c823801ff26886949dbea7c95b84abfaabd8b7101510ae2d437eda1e2efe04f0ecf513509c19ea876591b7608ed0feb642bdea8dd8d159d924bc77345722cc35a7d63cce9e0325e5f6c7afe14ee9f5435d31c32e9fbe541f9eb722d7fdff5674d39797a8a3a303210131bc847641879d46e2b7f59a3bf5d0ebeb760b6ccf6c292a3aa48c02d0020b084d1e07893837d9ecf702f360c2282770123c835062d0bb291d9f5ae3192ec0445a1d9008ba5263b3377545d7763b13ae998559b3e422581fc9261405aded350206b661f72f71ec5b25c3b38dd7335731c30d085b4dcd266afb97d0843530a6700224a2d8c766cc168b0e2e7bcf341c25a23bbc1d86a2637ea53fc7f934c5577e31032f554d9e7557d440b693c768276b8a1134673507fad652010410037a480a5c930214c393b3e5962c904ab762b521f72b009ba8f2e58cb208295ee562b6932b46830202071f2884972df52217f1e1ec6eff74d1ab669d2cb8241cf3bf1376ac5f0fde8efbf7d40ec922af8af2a5696aafc54ff7c9942b6d8a9ffacc0a50d8bfc2976bc62c0180cb2aee4617f68b71444ca2c16318e743541e1e082713fb65ab8b7a5f8a3b6fe297eb2104def06d5f2aebedb5d1092a6179d2c2dffb1b2695ef08f78d79194c88367d114412d95dee3f69220e539381f3a8cfc5ca1898359091d81d6195b08d7cb2ca90a4a89efe361dac9637861a63d9a3efb14e4c5a4d56f885a8b713246b3650d7eb0bcc6e9d66d7a358403a46c1bd683890221db9625d944c555ef5ab3847494cd3639435fccba6362e71c935b5bd80307e35f6c57829d91ee55f9e3ee36319d6a10e386965651fba32ec7af9e14d032cfe6deeb372691a40e9482d3ad7aaa69ec490076b8b70c0bd71372cae2bf7e3f5b63027c893bea6a904c2a415a57596faa37f00af5bad850d56c87a7348e1cdb9d2a5b86c998b60a73fd7d86e476f1e489ed347e2e4f730ef79853ee908d25122cd124d0855e62e1245b49630e274e193aee7d0e502a4b05b31428575aa5a210c98bc0afe961d033ef053bf904b885ca922cc01c155a824f408ba0cce968a1706066617e7238f0418d408543ac12450a47ef186d74086600654661e7711873c0172d3d68e93341956aa140ab47855801febae85ee909d7228ef231758ca21f46d54a6355d7b335b9c5d4ccc2713c8680b5f237d0652ac194985b5903fe02b287a4a24dcc433d5583ffca286180056fa9e1df6ba09e4554ad28f5d5db15321ce5cc7cacfb6173f5f5ca8070d7aff99f8b4484a0777b78afad871c42c2034590d4496f0bbbc4adcc8071624e34ebd66e0b7de1a43c269d242fd6e12cc24d0522544f93654a8b0291a7e6ba556e7269f40ce14dcbe2f7340479e3ce6e3fd9db270be66e4b5a527217c8e871a0c48b4dd3c8926ae2e9c2b8d51fd855c0e2121ea762b4c2e3ae4b471c3422721b362b8e4babd2a9190ec090574310e3caea29106c666d4c2a94b4e86a1b4108c81dd738f35dbfb76e219fa2c7e9510294c3687259c8a8f05d103a62674422a1ec2417bc66980e0e66bfd881ba66104842d2fe83ea4d18bd2270d0197253171563a6ed26a51ea796c036112fef15925100d6623cb07c14f60bf9b71c83014330685ee84912348f4afa143874515f0faa1760835f664dfa9371ab0f5a33a05fab78084407fe2a372ee7e68540dfe46f4a01cf035d535c6f48fe19a8bcca6c48e2adfd3795c4568687b36cedf5005f1c5e2f53e335c443a811de9da378aef91df0b4e151762ae4c47065b03e11a2af7d81aac4518f74a22999f3aa61b581a7509c8e033621afdbdf59148705ed848e5b76685d46b59483e310d594ff75fdb3619108a77f1e1bf6f940655d625e21f054497977bd4865edddabf5fd7a501bacd37bbdbf22d38179460c04bf9b62864a631e37732a3de7d420d85c380dcfc7037cc2a54b4d2280db969f74b833aae5a26fce6e0d72624f2c73f964eda2144a7e45d026084e54e0c3c7dd3dd0fdbc4e5423380dab1e039759b06a9788a2d2fde7f02dbd63e1d3039cde9700269000155672c3f49fbbab5ecc3016d6228342b91c03495b3000bfd446349e7669fe15b495b58f98fc19a59399fc61c39f1470a3bfb8426773489acf665e8ecefd1040eeae05b9ecabcaf0d82e6329fe1fd7ecaac51e207d66bceb8d1eebe11d94d0b1248f46f84e72f0000000000000000f398b10000000000ef1e2c9cbbc992dcf2fdcaaa547b15ebbaf33e42015494f1cab8697b6c8b50c707f6d7602c361b0b97dafdf2aa6660f9b41b11e81b507f15b5d82edc5dc70a9d412a9fd03838b67b36fcfc1153e8a702471d7d4f2c78906f2e331d13a5f7ca1e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005090cefee3b7101b8ad44596ac9919470731a821b154c02b6cc029a75a1d8a0eba37227497c8b0395abc63e61b0eb9d32993872a62f9fedd52653d2288c51efcc749f715bdfe44ede08f7f084568e106d2c568ebf035a00d793ed371fdde2a3f2ee7036d9af6694c35a51e7789532f52f0af970eae518fda1e539474c1b44aaf022389108a0f605faf4c721244ab2939d36fbaa270c15d28486262a15baadadf2b0209821b5f2fdd12da436f5091f1688b25acfba55d255cce4219680f52c2403e930a03de461ee304e6e6543f6556e8aa00f5585f13903a11a170e9644d9a618b5d4bd431f17044080603d705e404a09c47521a936aced953cc7ca9f6d9a10eb6e7f40326cfb80d3aff8978bdc393e9c5ff355f277bffd9594ed4936b7d0e5c6214aeae022d777594d3a0ed8a18659a5496ef2005da0b611f57cd27875d53b650af260695020a6811ee22c403b416afbaf8c7b886f12391c1ed3d264635cae3c6086ad334bd0216360990a3e61374dcc0078640617d89484efc9917134312d15b90b67f099dc9032833c7c17a40a325ae2c4cca417f6d6b0273085e9357c15a8e9885066e003ddca351140dda946ec1866708972ef47f4e9e0485a2e18a6360003c85ef608e4a7e328765da97a5c5086dd761ca8e39c1d4b8e78074a1adb2bc47725c76030c2c4d33b1a91b83b5cdd3ee97a8550d40940122fb1f5b3568b3ab428767ff6c86ba45df2e2ec7b82c4af4f7fe0297e1a02707d33efa8d04bda687d1e021e290a8618f8d9eac6fbb88d51bf65c50b1feb6ae37d564f53002291f857b94aa6859f54fb777f62f658847d635780eef1035eb3225d30f27ec226160ae75e9ab4519845cee3c3fa325e6c975f75aa66bbcfbe1d4956d5a4765ce1460e6050f7349ce607268eb585dbec08835a9fba0fc64236293524d686d786e4f685b677d8ba229046c2d275e6d0a8cea29cd3c408f020650b1ad10b7efa1d60220f18583b51e94c98df4c2b955fb08e85d16400531f2c14b8f9e1c7e10688e8c73d83d9cccce87a78ab59faaa68f0de1a8bb4b88977e988459716c15f9dbc48cc5f0948d62860961db3c2a1fd07ca1ff9ad0f907c9dabdfe1ef3b084c164928453da5573b9ae9df6bcdd44048bacb44d064adb7bebf49c7856ca0b67a0f642d3d05dd6f55ba2c88c954c50f7e4fd8eb0b80fe069a9a864edd9ce4c7beb94ef7d6b80cc325e2afb7ad972a3ea482618072001048dc62952917e6dc646250efe35a762eb04b05e1d50902878e3813dda7748d4c88e39f746d7aff1e511cdf90c6e92d613157e45d7337c74b43b951b25a9b11128d44406d22ed900ddbb726af7b86456fdcd48219cc9965737bbd621d2853ffcf3fd21159d02b374a5e64a217bfca41f9ceb89643ed4838faa2e864cfc8aa89bcda9981c42b07e1ceadabe404ea7c97aefdd5084bb9928da7a3f7c1c18d9ee9491214acd552b6aebc4868c9b3baa263659fb62a106e35843194edaf1b1a280954e8f9e96f4d8187a71cb441d17e3e70d15258f539929a8a186567c80850c162aaf9aaed0e0053feff7ccfa68c30ae4e79b530257418a42fafb373dbdb9ec2c9dfaeba4ec123cb2510a990a4c2defbed1f674151b492002df179a2af383a61f2f8556f58cd7fcc405fd0fa6a4cd0371c1560c985f48165732acbd05f88bb3cad32f1923e53dbabf3969dc4004c134544b25105f84bf1746cbd003ca66d710041f322d5f35b3866b21a5be9653c40b44c611a338594707693e46afef1c82758098347d5931fe25331bc646724750f53367ed10729cf8beaae477b038848595c5d99103ec507cf26de0da207c9494f7bc0d16daf09f9f71dad1b48c64749d9af3c00c13adcc2261627f4cd4d9f0a354af6d87516b4319a140d97f554ace3d61ad15fa1e718446b5da0c7592881d579faffacf25f26252306bb6df88d1f726d0074a09b573bde2be26e49ae64c4da4289db0616aa7d03f1b90b6acba7e6410c5bc8ee1aec223e58446992ffb8d57c2e67447705ec600211c54fe6e9066888238c0746ddee2bb70e2e820e4e641f5f75ff71c0f0f5e44025f4b69ce77d774809ed7ba7b078ed9266785554dd93dd43f4da786929190ec3ac90ef1b457c83cac85dac2ae1661e3684394ba2846ab9a15f2ec23d14755e6c3bd46cb8bd19c59f87a57cfc41a6c5d1e8fb53d0c3c2e5cbcbd749e6d9aea98ed727aa8ead0b98d36a7ffb58c071716307d9a7898f120dc125653669ad534644908ee6f4eb23904dbecdc8349e4baa99d381e3530a33b09098ed1603d290d136a442216e73bebf5526c760261c447b08753404f8175ccae04d27a3c7f67c8274238cc5dd045e36f097f98b4d0622abc6cbcb36e459e8e8eb1b9f3960e5502d974016b5642d9a880026af552c950f4f58805f49a480d", "0065636a", 2, 1561332473, "59cdccff8bf3889a779ef1f6c1a73d00f320b7e9c2ce050d4912879224454f4a"], - ["030000807082c4030309f3c2233a1fb4f5e5bc0f3bd14cc9dbd14cfffa759fa2f2d5c8abdff8149dda010000000665525165005395f50c8f7dd64e874f01eacbb03e74e732aa67205425bdaa77db4c8045f334b7237d194c00000000025165ffffffff55484f27f0ff9b1887632574166756bc896008214e2cc3a45efc480c8281a2e701000000009bf8f7d302e3573a040000000006ac655352636ab44c8c03000000000252ac00000000e51700b90114f58b01000000000000000000000000e356db2b317da20079594c6355ed6128673a26ff1719f74c4ea82760012b9adcf88579b7166e4706281bad02d1b275f8c18355155f48895e95b694a1c54839571987d9812e432483156906518ee8b516746674d93c376d3a02050c2151c6395c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009cd23e58e35103da7637a1f0959bcd730a2804d759b563b1b3356634c06c1098b00555a88ec15386616189b645a68dd8ee339910815f00024839c294564bd9ee3f04881a13f18248f39ccdea686ebfbfe847c04929f9e6cdade5794118c316e673721e8ecfc1877521576f51d335f16feaaa76e6ffc71064ef40ae0612146c8f0322bb287c91845a2f51ddf9ebc11254663a7f9a8b2475a65f4900840e081faf4c0309a8951be2cfc434053a0315a999fbc8f24a754ead16e682f98fddb80d12ddc80a021edb7849a4e3279c124a7cdcab6f4c058ae296640f9e9e40ea73dd7c2c65f9abd995c4f180e78d2082b1c86452985674599312cc118414f82d1062c131ad93031b866630de2caf72d74532e735914b6f8e5ae3372d0bf9b1e4de001c4d0ef532031004d51b74b0c6bb2fa12458c9d9ae1a5caab54483891cb1ff2abee8147e75460328885fa5b7d9450d99785a3811fcc6b0f301616d6f0cc1d00abf25bf2d9b45290226edc8314e3ce903c46d567a768b1da397180b181417fde5f69229157339a4e10218993ce61948209807ce160e3566923e88a9987ad2a3336bf56e83f56c114793427e96729a9f22f036a65ab0e3309aed8a2f317dc836a7066bbcaa6b3d62bb27ea44f002fd07e1d8b8c3e8647f80d9f4c77c1dea0e84158442b8ecfc0d5b2c31e1cd268e826f70a10a7795cab1b9f09973eb48242cf9c93b4a5598be588995eaeb3f8524439d570a8ff85c2b13a95b888bacd790b26bcc6ca94351c02a8f72f778b68997a9431ebccd1d01f047bf432aa14ef1c042ce38bc58a9ac0aa25a5817ff3c30134030f9d78f6f2dd7a7844fa4034f37d0a443455cf99f0b5cb1b13d737929101ded8eb03de96e3f0cae41750715c6d7c310a44861b478a4ceeb32e4557d534508241704726b125c1a3a49b7fd145ad9bf6cc073fb1d719b94009fba4704e0754d16596ac706724b1465380677b561515d3a26579f1e6536f2f2f0b2b031c6b872739509fb05b69ee77e0f831aaeaed1f4e9fc761753d17fa0be7d22d105d324965da7b027d5cad55a5c1781aef4ec1e8fd0ebeae22662709008f22dfc4c0f659411b9382ab053e4631351bcf2869d1b6eb5b15c750041c44cb255489431b9277d1b41824378be8b74b3e57080f0286f99df02cbbf0fee2d8332712b1f7190b6803704f94583a22abb0b5d02961ce78112dc55aadff544652790da5f6314e506717523b87ed85a6d8ae9f6fe8808793be517a0b9c078e8486764830f39a91053c587aab409b5938647b20858d548e2383aab274734b428ed9eecff7677680a84cde10575b7801358ae8702e4300f2ecc270a8df9a4fdb113c8e83b49500a471cc63854e2d9f3bdf3315bf15456452a65d680344b70f81d8a2bb7cde9eb2bce01d1dc7e55de8bee5e6d3ac50052da5c4255e33668c5b6be535c5bf59565cdb91c8f8ebc3f5cdb127a4f99fb802e493d55e5fdebe1cf1faf51e941aee6779a97e0dcee91666cd4cd99a78750aea2fe42d31b0bcd7caeb00d28a488a2c9d03c09fcc2f2f1ec0cdce9a189f20b9d3fbdd932fa2d0d49220f63ed2aadeeeccbe1253af17b154713636f666135706bbe0f292da53c888134a449d3cfa5ccb46a110c955672227b1c490daf41d35d14f1f461e15dd65ae3f6370e986c8ff116d1d9a7723654f5efe1f058459e6bb18a12b45a744d68c480b5395dbba3942cc8a6479ca019e7dee0fdf987407d796910dd6bee1153edde1581a0ec3df2929287c10ab70a6421feadb5964293b4f71568eb55016368871293140559d120ba8c9bfed8b340bd84c8d8abedd5e75b004cf808b9fef9507c2b30452ec1cb3b702d7c5dfc4b85e36772761f577f4ead2284d2fdb216e33b383f1c72ed9716d6be2a613a2e2420e2655789e55572d0c41e91ae6fc2d636ec0a059b9674867864fd3f26cd93f03e7e3cbab45eed8014dbcbbbe6fbd3c808b78af01661dc6c8a0b2c1d8dcf16ac85fb0e5a4300f5091f1e1502c8e0ddd8a6c80569cc76d55116652ab7cc4950bd02b80b3eceae9654d06e0fcd3e3e9971f5a6af9eb7f1c01cd2552bff2674229a80e47cbc50bdf51cf473659f954881099a08a5ac54e0f158da608cc2c605ddeb580cf0fbddf5387fbf2416cb4896d4be242dcba18b705f5bd1e6f88157bbdd0fd25607293eeb4f4451417c09a2ac877df3021fb8472cd3430756bb2d1f5d00b6cbfb68d386bee4ebd934df57addb9ad1f4a13d045047dc77c31c925ce5e92e1752b862fbc131f3b53386968ac0802a0c9440909a99c9cf76cdf3b763f18d40bcb664621b0de4e65bc726dd8c2d8edfa1a98338fba556cc3b9561a0422d42851311e5cf491a546f39b146dc47cae352bb58d9c0e69776cbd354d90a3247bbf674abc407b053eca1ea089fb531a7a55502", "63ac63", 1, -1260553995, "10538222a6ce5b1059cd7c0c6f2c313f4258b102b27e8f00f93e989a313322f6"], - ["030000807082c40301fac665a866086905d6e8679706edc3a3a3ccd787184108e1f5977c3683ba3aa60100000003525163663eff8901c64d53040000000001009c4b0e9547d6fa0b00", "53", 0, -739251193, "14f638f1617bfc484fad5c5bb6f30c3c145b1a2a422bc9575ce845007e1a82cb"], - ["b5a84c2e04937fc088f52b9701d13e9148801a0a66802cc5b90fee46b00cf184bc1dba60d8020000000852ac63ac6a526351ffffffffb4ed3cb0216acbe902a8a618e5ec3bd0d10b6b943fde569cb326ede80a30a04501000000016affffffffe7f1cab5585191b9a17cd07daa1d6e2457943af234b42f14c5938f625b018d9f02000000030052650fd1c83d29b4dfe792cc054953a031285aff5f2a446c38752ad30482932314a7eba481720000000004636a636affffffff04a699db020000000001ac10506d0200000000065200536a005192d426020000000003656563d3646c030000000002000066b9b5420200000000000000008baa73040000000047b78787985555f3b29bb93da5f7bf1509e290c5d3d09b098eee35aa001250339e0e53a763a3c64564384fd8b3a7aa62b731bdd1d370d46cb14d1516551eeeede6a19ebfb180f9e45f9fb942c24bf690c2bc5c7123eda191f376ba4d7a35866a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000463ee7024e532f41dd04c7b4280e1271a29ac8b52fff60d65e362b00231842887aa17a31092a7f1b195a4775b1d04f99f180920f8b5201e14349849e21df1bf8e6a58435ff9f905fdf3f26a788f7f3376624920c9f11e4983d5a9ea298bddc86877188529fe9516d307b95531bc5705147da1dfd032b174d7614a3eebb4b61710210a0382f282659db69c10f5943d99b6336ac26c04ad4e3b539ef43af86edf63b03129f2045d63b3e3c701bda8921666e6a2beeb9732af70398c3536b963a8e02e00a08bdac7ee61da7f1940cac5a2a1f3c4a0b22d692f6f17d8b13db3e381a37a0fbb0564c15e26f40e7d02cfb51934daf07f6eac32588ca8aa314e065c101558f80030949fbae9c9ee138344120160f5acfee1430aedb6e746ea8eeac229b3fbd726f030756d9d054548450fd4ec95b8cbe77cfae9b5976cc6068230bb29241226819a70305288460d13a75dbd0384c11a2b13592c83b519f3562c6a62ab3a97da5538b6902210a3c869da94c1082454413072c49acf09d7f7074d2b67ef35fc1d40a5e9e0a0213c68409fb147d0c6642e30f56af92a40d9db38343b03242307c0f94142ab07bfd1b9116422009267dac3ba13000ca3ee0cccb56a1cfa90d0b7a939f71b78f956c9f58bf30455a1706df7c6c919260fdaadae4e71921f409dc60ca59592fdc3e942336a25ccbbf98e84f2b467ea55c48770f91f5be7a6a607c4d71cfc75dc65eee38f2c6eae5e9aecb10946ed7e70d75b7f693e6c3267b40db994da91e1d6ab55a231f0ea63fee18c77f94cdc5ede769cb2893e9ddf95740131cb715ef4eb56f6e954085fdab876afe5d2ce1edfc905f9e641e389707791d9fd6357a343d15a7f89ab727e4b0df8b261c945551d92ee9379f373ae5b131df2d7bed31cd30714c3617ae01cde6b16bf4728dd1b160c883d11848517a118a23a1e5fff2d5b13aa07f0d45a1d9d9ce905accc81601c5dada4ad01761841ad138e84cab953467f3c56f474ec02abcef58454fef1ff600a1a5b5b2291eb97a343b6372f1de58e3bf186018d57312dc5a77fb1bc58fcbc02bc37e841f80850dc82c16e6549ee3688fce1b0dd687db17f2021300afbf1d634725c8b23e15edae2422876293a456dcde27b65c23efa970c61824cffeae27786b4db4e9df28d8167b7406d116acef9e34395e9fecb60c26e5be01015061bfe472d6e7b7ccee748625a6fd7c78551072b97cd348e1227adafed0f22e796c216237f8d6c7f3990dbd86c6d2de4ef38c9dd00b95421246fa0b661f409584c5946a67b46f892d3c847502d2ea64882920f8d22deeb1b36e9d8919cf64600193de40f6cc89ed2dcce3f52d01c6d9756dcb64807fd7d662da785df0071be0e31eee8342ae2c1f836115e1bd373d6b2eb64d2af46820f1946a01d5824836653e0afe9fb8fd94c994ebac6a2acd81f4086c48693d01c96763843a720da043cd3d967a8b30f403050cf69a5bd17119edc91373a3ea42db99b7ca66293a7ab4ff47e619007963f73ae2a7bfc8874b06accb96abecdf53945691bf6bf1399b547a32f4e117bc44003118a5d59b4a3d1e632f2bda0017d76d266bb185be49d041884bbf641a80947b79ee6584adbac8ef08f8f53639eb4ce94a066594b88544a85df0778d030a2c9ede7a8396b069a3e7cb2f51d785a5ae3b09a828707052acd8ef6380bd742728207f2d8e2db1a8a46245c9472d4832702efa873e71f88b3714ebc421abdcbc89dff437052c64ceebaf8202752ca082bac49a653fee83aacfc89dd7ac2d6af231ab97a03ddf5de8c3400cf42b258eaed0fcea17f925444d213478f53e3715ea383bc6adc9b762957b08b4b4ec396ede43a5a771acfbb98ce68bec5904e88f47923ff0697b56b489745e1f60a050c3694cf62c5a8917676296171b99b5a0c1ba2c5e92e1e7af9d9408de1d37f4000691b98064b2841b0c06536d78e19da5980cea7916d0c479a1bed9b732cd56827f44798bbfd428552aee35a3f93571e5978ff1e2d695d21c2b22c2e02dddc0932fa296d44af586298ab605b2b11aee07a57963559d00cfe659dd2dc42bab3f9fe252924bb5cbb77c2997184a8bff10085bfc6c096560ab417038dac15f93056a6ced8ffc7f16d2d2cc4adbf5217ccebe6dd9510c57e92d9dee253fc9197c053400f2831c4abe72cb53c48b07d95c6582f7f1aa75d4c076a1eca70522c2a10a951238a56c43874b818ef868cbc953b68f8aa8e903e65ea5ecabda522b8e58532a08ee95fa2059d6d0d28ed9c04042828dd68ec319f6d20f5b03000000000000000000000000a512cacae7565d39fbfe7a001bd71078318d102510fb2bdcd692a7bf996fa33aac47b7a5197f55cf7104af80622da2671405e51902de69d0528769d275c9f07855c992a0f75bb275c9466b0b45394de3ac7ceeba941af8ed50c35d9e579d49f6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004dee37ba0d519250791dfeb1f51401af60485b96d68464fc12e7f50542dd23fb8304d3f88f33eec6c5f63f2902dc79ff86411f7d33d25202a1a2def62147ae84c501238238a288d72bf9befcf8f046a47c141d8c780b9e10033b9e19f89dbfec851e82b708c3c6e479e6dd517769df9ab84ebdf3e402b496d28e70d092cc839d02137362efa22d101445a3e9c4ad484d186c60ce6f8c5d719ad9a82ebc2885fcff0305abc552e4d8303b702cdfd1b00c0a3399f63cc5042aeb7164b3f3354da046980a02502ec898122c3982b656b2c91fb0e543b3a2d2c434c5bc8f0440d0ca07eb7ed12b13e97ecca8cadc5ce072760950667505b7dc78ad55cbc9d89c7e8119d52c0205725d1fe89b392efca51aad99554ef2a18ba752df66219e9ed64b264577a008020cb728508b577d20f15ade24a5be0ea048b847b8899088c0c8959d476a1159340320fb25664ece7b61c39d424634b0995859213154ebe0d4c5cc00a7d4ce9986fe030ab5201f465f14f947eb5a3f1cb07ba4c32cbb9506973ff85ca5d7a0cfa05a0c031a49124723f95e44c4ee3eccbdc8903b537b97ff1542ed28e18c3c8f5bd9b2c02310f866b456edf2277d47512acd84a5445f1cabdf7296935315151273e505fc3356520a33abeb439f6a80f633ce9bc7579cfc5c20b591b1686773c45ab1a1d6874a8e0f148861b309774763fad553af562b00402a86f06f2f011f236d90c4ed4c290ac4d7d735a90484a5e0a3a3afc8af000473fea3c768f6b29107b9cd08fc1c099964d6a4d056ac32c8475f64c3ac90f22f1bb97d3d57cfe941a84f9c7e2b6ef71021de03176929c42ab70e09dbcd45e1dd41001dafd45495dcb64876f5d01c9f631a69be014e6308c0bd0b16710403db8bdb734ac329c45883850c479fa4eaaaefad2665a411bcb49522ccbd955bb3c47b84c3ab7333d102c833036b356cdef174e6536845447e9fb8fa3edc5b88d5d75b0b183ba686a6baacf50411903ae4c58a8d6a69bd504235ad28d030675ff9bd416be991454a056099f967ef0d4f53c1b26657e5beb078a519753f155d7f87149f8290a4ff8d3fff2393bee70c7f9051d0714f02e95516fcd364a1afbd43e83ad18d0c1d025a11a8e0b0cbfe92f2d5547a01e3c13efa636a165f7f6133db450a70e5684fd124349317b1f2987b4f27efdc0faba8bb18f2c9dc756c079974cec6c542dd8085715a4e197f153aff2dca6ad0507cacf8e799e8e6d4e32eba141196e6c133e236394838050716349fb06840f78d4868e92f0892dffe75b41de3005a93e1dead106b61152f77017737b14f9994e7c934141e2a5e62a62b957c0710c7e335323fa4a4d85a28bc6a4c6a73eecf24e7381771d47030d2d082f326d4cccab183e7fc57aafc5974ebcd0da0fbf0bbd099bbcccbfdd994cfc82d47fc6e58e8fe5b0b9f5adab663ad2d41732fb4188867f8d775004a297823ebd356de732a8b6ab214e58c2233db21ede968f5a0ed1022cff50482d6a0b6bb99724dc50f0036dea53f42e120ecf54eb854d8afc3bdef56d3bfefe83320f99482448cd3a56105cc758e3edc2add047e18bf324c63c7246280d26045afb080364ccea03bc72477d6ed2ea7218f642d7e6bf29db1a132c65a7e1cf21947d2528adc67b10e32de568589306f5920337f728f0faa37fe16f3b6172a21c852caf00bac19fd4e346bf170010f02f116e52d7048e143bc279a514afde8ec64facfde6ac29cfc6ad2f3a5e42d07411d17a2beee6712ce1c7d09c5b0bb7ae59f286b26d614a8a1cc530ab2b1d7df7fbd2b7a82bf13479e664bc41ad4d0de1246bada2f545f4545d0c6569a17b7bb9cf2edc8a7fcf767fb67876a66a60aba72cb6a84b24d8b9f7c4c3521a3a7d22e164ebdd611a30b621cdc83e8365e26087e55602964d3ffa095d2796a2b36e74d398aa4ab52b48f2f24b0ecddedb00334eedf94dc006a5e739197e537c8e8d31c467e5c2da2a7a66847baf61f9ec71d58ad454636725bda51de7cd5c3215169672741135a2115b415a94add1a884d9ab8f51f1c4ad3139fb6fd34ac60a1155af145caf9b6cd6c03e70b935e19c3b4089ed61dfded8e3000bb5768f827507e19cc3aeffd7a724661e341f841d4dc4db307c0515b38b1a4fb0184b306f054ab5222d0d31924121482c0cf0c4de143d5d83e221e05c40f243ad0ce531d9fd20f799e0c930ba91f7246e2579fabeda9bb0dfe4752a30048e2224403fd7d1cb3ae40e9d1f569f0b681daf00d7176808f51f1047280679c0667752183f2c7b6fc3adb89a88d32cfdce16afaf1e7b81a70c2f044bf2046e175c51f895ad74dd709aaf3635966fbf9853739b420907dbadc166391b3fc5a446b450abd450eaa062468beaaf2dfe94192328f20d4c2f44a85024855c9f2088f4bc8c4e4109a0c6208", "6aac53516a63", 2, -1188894128, "10a70e1cc33e95fbbf17f113cdee0979ffc4c5d91ab1bf7c5db63f45e74e1b9e"], - ["42f0223c014e45e6da2746fa994006ef6052d02da6c762fe9374d02a53e99d76dea0573a240300000009526565acacac00520059afb63b0179b3a2020000000005ac5253516a000000000300000000000000000edb6d0300000000d9cb57be69214003ef088e54f020da5a7bcbebb081e1e9a6c7cc739b2dfc3e5a6f3369b9708c192413b71e6258ac9e34d1c7fd24dff24a9a4d0d4441aaeacd5b24024594fbf34e7e5328e882f03698d5e36ca97cad82e12bc933a047f8e7026800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000187cefd6e9ac2fa6aaf841c1380c30635e4648a0ffebd5c80601568891feee4a9072f96e632437628f8d74eb59bda6dd2a2f5d77fdc38be8782d6d591b75b5710d56759c0d7889f8cc5af1835b635ffa5788a85dcfa3f97d6259d3fd2d1c9c94fe5869c6399edb0b1cef726cdb4a0d6d4f44d1431bbdd8b777c83809e8f1d064031a35d9406a5aea7b033c02ae02006574800b97b5a3e6200a0f5f467def08580c021e9ee75858e15852d5d1e6fb7dc2974ac7a2ade13cb3ddc113de2ab02d5f4cf10b0784af72ae068fc9b1fc0bf33754fa3a3d6afccaaffc5a62c3d6abb89835836db5fb5e006c4733871817e9edb7c2a8cc4f3ab99a8d5c6c91cc5b93d3645c5ee5030f82daa54b5247f537c58c6ee6094d5af3ea39cc04598e630429816d851c1ff20313ab9f4aa5237d9bccc6400134db11e25a9c1689032badcb1515f825e3e299ce022a37df98a38f54213e05b35973c498ee317b1a6d67ef66424b11f7ab4c18478a031a74174de3e64463c29f6d67783a8c103d16108c7d66646f9c0730415394191b0208b8f018669999b08d83584f7db9a83fcc1678b6a04219c04d2a5a205d253627fb3d5dede2b1be0dc1dd3e858b5773a076ae63b437565a334d2d12f6884f000021896c9f6ba8114e17e35100aa45abdb85bb7659dd27275d4b91393e8c46f0f2ffd5410e207a3e4fed45e744b0db2fc775560599aea5ca474ed5782e4699324a99c11df729b8d644530dacfd0831ba6ca2d734cf83ba06b46cbd8c7a25f20dce7a84324bf89d5c9bb36febe7b40df17b23791784d43cf31fda7d2edf67be39e23c8f4edb2a18b33ccfe8e86a6813d8a50f3808284306dee2370e70eb5a47d1412bd010e5784616b43e0bb74c194a73d7f3fe992de313929f0c342b21630ba6ee08371b4de9dcbd7b00e2aa976d7af3c29788838154f37d8095c74216eb7ce5bdc2f33fb9f2e78b80b0ca1549e883cf735dba092f715662df87860c3df8e5365e20d9720ae1d4bf3b4e31b0d47059bf0dbafa80fd34f8c949ab16ef36e929e4df2a0dbe56f0ef926e887049f1167d43e0e77026e2e421b3e55daedd2cce9e5643af45a1cab6e15d7838888662e246a51131bfca3e33fa24f6a54bfa7157ea9fdfa124a0af8ef8c275a0acc7846c834528bcf4e58f5f080d4fc3277ab6ed95ec93496250d4ee1dff5f3929d6b92e52cf655e17db33e535c26b182fcb60527a13bbba197e75cf7a98ef474d81ee736a47713f10f78e06e293fc5ebbe3cbff80ff37e0b906d8e14f9391950a8363866adf838b71ef52cdecef57cd1a0dd07acd268459f4c4a12fb0c58934dedd8b3bfe7d8deda6a21756b7602373ca7f9394ed13438b2ccd303682c6f70855f6bff37c245fd2ef8a8ba9da32b62b922202618e3c8d76093a8a7c7d5573a8ce3fbd68ab2d11b42ddfad01eb9f62a114fa19b96565afaf24770eac5e64b4da7ec29e65b5dafc2b5972e283c593646e3b41e63f65797f261bcac157ba8ea75021ccd2545cc64ad87092faf37a0cbcd4a08fc44e1826cec8279f5e2ed91bc8589182e06b87d03306de1132bdb0fa2c9e3e0f615e56572a1ef0e84c6ad956d91c3134026a999d06f6b5abde1a5de72f3f2a6f9636d4ff499d0746e883ac88f49205a3d583a379f39b73b4ecdcb57f55c871303356348804af78a25977e2af9c20b93e8fd69c6d770c1958af3499405396afccac2e23b0fa3efd3b52c4261959c767b0815cb3b82d866ce4bb5f1f1e80cc5f601deb26d7fa60954207162c1a7eb5c77bd84805edad7ab855629ce0c5c77137b0e3d569f7edacad4832086d9107337858aa77bbc87da6d4303537b75ddb625aa5515f09a0ce47cbedb70b3b2524f62cdd5a894ec578ce47f2484274d74f021853687c4bb14878792cf7c728051e216d113720dfdd91d6847f470f911d338a8696c1caa575230c1de14041304059125c681480e5f5e294ae21468cc2abf2171036238799ef0b9e11db99f8eafdbae358da99e1e7497a9a9364e3cb6cf3ab7cf27990ebceede8029f0df83b1aa0d62da561f2a9267766af41b545d56af82175de2c6da2c241b301dd5142c2c03080e46c8f38adbb49a387724ce87bb30550cb69252a47321f02ac1d45b88c572142e8f8debecfc8d4910deab263681453338eb309636b5f715e353b733e93f378c0c1c86887aaf1dde3e7bcc8d7c93f2629d7468be4303cc324adb64dbbdea8d5487850c0f923abcaa8ea692edb3b5593ba1bc89e757401c790a8fb71c4a1809d85b25d12e841f0d540bfd7d62f3b0100000000000000000000000071df170f4f72e10af6145931956a1ac26cd6823450d021c121fbe6832e8c37c2a5124a2bb0b9494268e60ebf8ae22260693430e595f99247d653676cf6f92804ab4881c180d33690f0fd0efeca614ed30c6966bc6ab7b0b4a4da0fcd24c76ca500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fcab45f39ae127457ce91984b480a7a9366455ddb336d93c285cf1802cc958fbc75b880ed8ff6f954707fe2a35b012d01fddf26a333ca2584463d04d14a7d5de606d3c5ca14b1fb1c9a4fbff1b959083623094a3e85a6dae0b093eedbfaa584a5506420b350212719d5ea190f20972319d8d21105ee14649d0dd60e39ef2cd380210da23374fab89cfff88879cb95f5c2db16a44149c6d3a8860aea9920fe105480225165481d69679d378623dc4d346e1c5fe973c263b1d75ad47c44844f63815840a03754547eaa901d9553c572423327c70c0e0e5b8af0e7ba71f905815f1f7addb3e7342d9c0d874bf3b9b493c4c002a1eea051af3bdefc8b9cadd4052b30322af0318ff3e1caa76913b3ee89ebd1f6a46c745082f854b8ff0ca2c5298006dc95a7202070084d0fb2680cb6eadb622642fdeb97b2dc98c30431280dbe456509a69782802210f79eee16e72c8712f221088ea1137e7ead02eb5c705b6adab041df9c0e8e0031dfe7d99aa5a56307021e14346b6b20167abe8fdce8920c799f56f2fb3767a00030c9a6c41781420d347a95cffa775f4cee89f79743c1b17ad128ffc94d490de6ea656725385877fd59d7478bc4986912708ffb8f6e67148cb4af5407fd518fdee9de418bb149ef3353d0528cd69d5852d2fdc3cf6818179bac59725dc61cbc2bdcdd9939b456f42790c53d27da3d42c6378224db412f35264bb99e6189b66f006e2a4b956b5b9f3449c85b9be117a66e4172a2840336424de453051e1c3afccad1566158c03eb1639b156243cefddc0b8c3026ce0f9e54b92a7e634581e0b5f43c4062303e5a026ff1522ab1aa89e1f07da4269ff756735732ad0bacae97581886034784175856be9b0437787ef993527e439c2c02b4d5b35622dc555453bd039d669059c3c73f124d4554a49de7198024b501a49593a5610c29effb689851e0a0ea630b6a5e9f72d5f5d62a09a7bdedbe33a0f02c3134e553fd52ddb40741cfbb427f5cbc8e7a10aa4599d2673746a83288d7371f2cfee092281da5ed6fa3a59a2e0c97a353c943cb970bc1bad5a8ea5d0952ce47c9764429a5105fbfd410ac3a0d9a46ff3d67a7efe8b8ea40593f0674fd49c29fec6544379a161ce531916e27ac3f9112629f4b4ad63a32da6f392e26b7db9a0ccdbd4b2d88b751b12476cfe0319ac5f3b68c14c92e4fbb1d3c69e52fd312285d863b0aa8c20e215007723f5b05e734383473db500956bb0079a330fc2b0075d8f747d90968c44af745ac62a57fce6df2db46148ee40b53da54674167612b28bbff97f688ac0cece9f8184accacad158bb0b05f2f08024850f6971f2ee6170fd44fb5a99c5cc718b59437a6f7b49762e3172fe8ac65770a0bdda6137db8f6a902321a8d8379318328c69cffe84687e81c94b057c5cda0041db86f8c7194952b15d60e01ebbcf28e523e9b3c78d75154a85f10ad6cd7794a347da6b6eed9ca869743d02fae18625e06e2f13b08b99a5fa844b24f2c0c447c4274b2726c71e18345887731ce9c50324de1cfa35c755748166d9058eb3b6ab1880ae8a63a9f9b3041341b19ef5135d929530e80803bdb649e1988285182b3ffd80fb933dfa0020d5968b61e06cc4d94bd1fe3c1dafe5936d97fbc039a83fe1dfd497321109d06ab804dc039447460ab4e8f0ff48a2c6e1509e40155bc664af1dd5370104e5ecd7a7689c03ef3ba5fe0e598cede6461eda1aff897ed46236f89ac54f0e792d620651d34748d6cbe301c6b2df0600331377a47945899af167d67f0eeb4fff5000f143ab335094790c09b352526466e7e9858ae9fad2aaa0b128a49a9c0059f7a820f0cdd0fa5a152a536ccffd43e8ab7cd6a03206eb5754fc63f23f3b6db84a6e0af758cee450cf8d1e4d66287d6375dda342a6653b10f59b9d6d46f7650c630070bc5bddf1a0cecced9259ad2824ca33164bbc3da988b3140f93e083d0386d932505078179850a00b6ad687088761fcdb1160a3fe06488cc1b65f582966ae89eec3045ef4dd923917403089653dfedf7005f4e700e87a7eec042f9bce4acc49245e21fc6717ccba2d1b5a8707ab7eb91a262117f302fc88e83e8a4fedf197e17d360146af4d79a1d1d90e39cd533c4cdbf9549e0fd00a74e9b595628eaa25664570d31131da46e2131ceaf7e7385412fb43c8decc18571b99f065e823fe31cbcc1c854f6b319d3bcb9e9b8ee4075684554d1fd9f9be05484282137ad607985b374e6de2a96b8767f86b5f8936e349ca4d99ccb54da8bc23bd63eb56db174ffc863be87010000000000000000000000006ae8a0d3d127302e5ec370180f9d4fe1f248483be93ace8064f9d92d1f285aa0f5f5430db1faa29da3e515e18f1e69317447da1109c9999ead9439d6b025a3ca790c81ef800f6c6357f7d34d38196c8920d36e2585ad8f29aa5300591400261400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f634081ebf5eda8bdf67f33e90810ba8e3a0c091536758db961b273660c190e6b73892a55bdccae139470bd26ab59bd0ed9506c926fdb499339999c503d9dcaab35a874ae1aacb53d9c7ec30cccbafd7586580e3368f76cd2d3dff75f5aad83b8eca4f4bed2d0b8bcd26f86463a45f23c09f8a124bcafb1b146c7338153fa38e03120d0b3689f943b0edbd3363ca3dee519e8a74cd1a606a01d245f75b1bf32be802064f1e8e588a5997e7ab133cf38d26a997c7a7e385a9cd3051d743326fed7be00a040df4ad01054d8329487e4e07541a28ea2e08a1172d2371b9c9341470fd5eafed2fa64760e79e38da6c8118b83d095161dbc4102df1b9ef6186c29dad06ffc402021fe7d6d28880549c67b08e0c82e33b12439362acb760871f2f6da32cdfc670032bcd24691cd0a16ca1c480c9fbd901b416e10a9fccc2b164694666363778ca1e021f6058aeebea95537852d8ff380ac3ae0f53b088ed65fdbb42cb5d6fa772233d0223cb5d31544db3406c3a8c0f4db15631bb42292d009b5f7a63a813707562cbfa0311d454c2622bef8236efc18700c53173e14cb63d0eef76b235107b2102e12c6fd0bf4ac1fe04509fa01d7c3d29b01de7f2c671e5ac332870e6b2751e86f14b32d733df270f4994bd916195fb41368bbd6016a36c324eff01a9a83777e753ee3d5b66d967893d1731ae424b59e53342fd80c6e50f8aca5305919c5998b5053b309fa7ccfd17d4e3e844ff688f72b3119e482cfd93a032d616a1b7008c7bbe23e560aa951523f411c9c820f4ae49c8fa236ae1057f8c71d583c14c2abd61069b07b202142f9201f2404f6b1d1f8de58e7025dd0d22fef3a679eb512f26c8aef2ff8d4f9bbe642f6a9f28a8d14d1ba4c637c1879ef27b8bb7c2534392b3cef7c25add84c6e6c2c44d8601f7661884c90ec5f7a9cc4694307689410ff8ed1669a1ef0c168a7e4516a899f00d3ae3f64eeb093eb523d6113010f173afddc6ff741320a7f7b122f962c35d0f1d50f2d059970241353bd7a332b2ce8fedb7b91037c728000aac71a27e90caeb15a862a542235ac507371028e23915b9d8f9472a5b896668ad063ee1ab3e997c53509249dcd66db54b2a59f89159a1279770a7b99dbafd8d69f878398181ec6ff17f6c36a7c1c2583507d25ea92258cec6c97bf7091e9376d3f9e82c9de69979dfdac4607aff8994fbf151d1a1552fd37eedfc08bd70eeb4d65961b90f65b4c46dd84fd4df2e4c38ede8dd0ab278072dd9599ea8aecfc9f5abea9a31711fce747b1603fe63138f4389745f2f8e21b35b3812348674f7346f9409b51aa84e5b8816bcd050253a7abe9c034719af29a0dd40e5e47df42d168bfe5410bb3874db5f0931fcdffb6bf8e4cd6625c04da3834111a0ef95eb7e1bab7a68fc67963490f6aa3cad0833023e31bb1d049463b75226ba73317f603d9d9c904639bd985e982df4d9b285c1cfa1b8994415d13f7916aee78671ee9611142860c84bf6566c085f553828df3832353e3bf0ffca4a049626bb093889f82434fdca625a55df17144cccaf7488bbc9457c756bd041c739c5f44e4ecbf372a12966a3a6fda3a8284eb57c03fa105abaf86a0ff6dd06f19b3c47f6facd96aa1e849d832591dba1d660373725daad690b357bec88bdbbd1cc1e714619b8d4b46e69d00dda59c79f14e96469e8f021acc653cb64860520bb91f38a704935b7b60f5eca9586f579b7002c205530264402101e35d734a9c22ada59876c0043eab8686f67bd1e859660f99e9c12cecbcef10fb7921b81b61c2a0787b8991229ab6fb0cabe40bd2b0b2cec904072680d62fcbff6bf7f0bb545003cff78c831e464cc0b8ccfda88736ae79652bf45c66246fb6d9a4c066f5b44a3e078e43141b7fac0f5433d6ac555793b9be3c3eff0fc4247f3daae189c8f45d341207b6da4bf31729bfd0f98b4cdc4dd977de213a552dda4390cf71657dabb3757a254787890168030b17c92e479656477f605065b87fa6bdc7bea612e167027ca8c11f4de8d4cdf8ee0af25b1fabf596129fcc7a639881027f8d63a392bcea78a959091a41f9c022255855b0c8a02aa788fa25a7e0b1d1d9482053c173c1593dc7c024ed82ae94a1de45dda10ebdc21c987e59bda861f998bc2186d4eb9878956847b79fc90010ddeb41f202f6aba09e9f59ed263522f9b845cc72a478753c4ed1657564bb98b51c881149c8efb42750b9254e163e3f44e07027c2f2ea47fcf1e6b10b23d1fc5355c6c885fe5d7708148c2d582800ab51f991a6a2c4c7bc0853af402b5185917687128177f53674b2f8cfdf0c69a9e8ae4fe3bd607d0f7250739759bc0b0854d8ff7a8fe57a220e7db022c0e876c85cf7ec3589d3a8379cede27722a72676f27617b35252b4192d4eae6c436f0b1bd50daf5d6460c", "526563650063ac6553", 0, 1902793955, "34158958fa20b13d9f9539f7a13f4dc61a0511c8ab61e475ed55e3f01c743a07"], - ["030000807082c4030289a614ab40fec3473380bc9c94a8443e876d80b78579813e4e87261abe9c11b10000000000f5324104e063ea73c72b3b95eb892a48fd8af55837d184c704ea8e4944254e59b9f4435d0000000000ffffffff017936ea000000000008ac53516a526363528b8183c634dbbef0029dad7d000000000000000000000000004b257669832a46194e49a67f0d003e724afa780dea0e30c6cda1a14d0c911909927766e2fa58180a9e8324a49f140ef9716f02dc4e1e827ffe1106cabe34f5e7df87c1e3ada3d932d13b6e6bba40913b57687884c74a04a11edff5a3358f2742000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003bb43553ba69b1ae63ec9616626a745bfca95d180dac643db0f8f840a72f77a60a84e8dbf7e9357fddafb64ea0e9ef4c3f2dddb72b63b85a4fdc6dec6bdcbb9115753d17eaba9c52820740fadea1c14cae10d4fea03e51b07e772e46d8e48cbb3ecc0736229d7ed08629e251007181489ef2f886799bc4227ac6feed3779de910202a35c3458d4759f6e6f56d5de8577bfc0f4243ce5b9482a69c93262270b56d9020c80a86c0a928faec37cd7f40a5699b374a780e9121f1297ba9f5eb81a02296a0a03d1a7047923feb4cb149df94aa3373051b2a8b4efb65aca97b854428831dc485744de9a9c04652ac76c86fa78957aa67351822ac47584e752697e6aea84f7e503225ae1b2e1e6f1158b68c14a111d739d9c5e13d67f20f5aa08f5565b7d24ec2f0310ce6095598893b4e0ffe7131ec1a42fd4f6cb845b857e3d8b4ef16ed32f145e032f8244d468eae67a6e737ac545e86a65bd5ee0dc125e86efe606416ae68c0939020d78e03ebb71217d534d079fb4b3561f5a9e9e40ec69194767bb1b91b4ff6cac020b500e589561bb29c0f642f10c4c033cd76c7e7dc5c8a0b6a2f041ad8ed2512185991df3e4f5be6ed2129894cface49cb96a054a2a709a4172cb4ed6264ae805df1f625108e67eb02c1279c5610c48e9abb117fecd73a879bd5557be6abe0cff74dcbe0ee86b6d36a449a9b9c63d6248b49eb8f87119dd989d7c52ec687eb9f41be68e36f49b8da330a1b41e7b62e458b47cceebfce317e208d27b8aa2e161a6f1e8269edae492d83e150c2258c36e9f5161ac9745d6d00f4fa72bf42a7288d1f31a28b026c34612419ee66b77da193ea150084a9c8de8b155467b59d62585af690fbb81967764883dc4006f1b1ac92b9a648adb08d687803338783f3f79a0f98d646d6ec7e50a1cc79235d40778cbb11d6ae62a1e8482f754ac45c39b65150b8bad0f28b7a7420d6812074a2b42a6e840c331fba353f6c2a94b616553582b108da166675fc2cb89664f398a397715951f4f62800d3bed409170036e3b1e0b55cb2820e40c3641391e727a35668d582a8c938263b68dd5ce3bcf94468be5cff88c3a70c0f500f0622c747ce1e7f7114d3f52797081a83b7dbb4b2ae852c746ee1d3f6c2f490c6269f40ba70f9de164ebd4f3f9713369275617dca67d690d6569c02db8fc16a351b4e07d47abe8f4b02b047cf1c0338b2d89cb0eb5a5ed349470262621e5164baa11d4f03d113dfe3b4597621efc4d1bac00ff24e094aac3ac72843637aac310d0d10176101b1d9cdba7d062be7d2c847e0dcfd36c808d06a55806d52b6c5744b244e03754444a233939210a7b4bc0f53d4d03a737f71f49f9dff561eb0a69f185c2ac02957d28b4575932ecf06016f24e2ec4b7cee72bc449cd5f8d169ebfc85e7598e53d97f8893d4d5371491f2ea111ab71b449f9523c4da320a97a1fde2a2dfae1a05d8768b6078a2658b802b8679187f647da4f0223c1dc72343deb695700636c710976c58a0ec62f529b80c36231499f60869165cffb21f82c3e672e1aa7426c9e96f9806f88e0eeeaf6bcbc593a75b07ff5f5a48dcb6d4fb9dcaf986ef65246fa46c5500aaadfd2cb2626618b7e1f910d2c687ad5097668ed632e9154e979b1cde4097f31c6597e81a325a0bcb983b3dd4458423673bee0ee260ef27ede7bd8112654e286cd021964571daafec991f9c33bbcc0ac4e009f7cd089fa2fe89b526c6c6d606ca67252e706fa6445320ccf8c5b56f5e35e905b4903e16b4c651e97da9c5fea89d3b1ecf8c8b88038f11b913f029f38c9340f2d0484015c5f34a15f3a44e86d00243f0e531d6405e442dda709666c6cdcafc87939ce0f8d6c9f9235e6233cabca6f4c4f1c98655d4076550f86c69c0b86e52e69dafc9d28f46b0fed762b8379f2f066afeaae13c4ddcaacdd2dce66a98b791b56ece681035785b06d1ebab72aafef25c6de8b29bac8893a1fc9cd15c6c41a6607baee335232c5df31a5465755294b71d210b4eacef6d552a3e1e10828800c72534494bf4b348598ef6c2dff86d271dbcd387058ff49cc52e8640c19e437eb84d3231c14c79962392c7e29336e3335d6f4fbc963a91d3a31f964742e233ab99206b52c88bc638bee00d2ba005f71db02253fc1d672c786fc92c24f1d91f3a41d9f88d7785acee2550627743c7443a729c0a893d12e007a22777b709ddf774f5c48342ca4c4f475777b8c933bb7a49841630b5b7c428e7543a6f3f8b57e75b04f1cf73ee5aebfdfc6e2a27c19f87a426ef6d70000000000000000bfaecd04000000003b464385710a9bf0efe90a0347c332b5c8652153dc90debf38b13eca5a5d13f9995b8e4fbb8f31ecb54cb577a09a56af4a90bacae7e7337faa30a83c67401ab4e5153695b624e9828c390e736cd901156d4e19e35bf513bc4824a91df26fc810000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005134a6a1b357d00f74889c2859c8e5ced4a1037ab27d99965fed898c3f6df4d8d42b59b78b6940c0ceda01b1473a77f86e3a1861f96e119a62521e29467285f408225e4f35dfa435129baf8dabb92c0a7d2f85036b2900d7860cf03fbcd1d0806abb43b626048be6d545e84a75d32ad25a681137a5ce7ae21c6715744f0c56ad0315a25dbcf9b25ab5979357e8250d584c209eb94a7134712484a845e18feab012030125b9c35d33dbae2827312fbcab22db29e7b4208bd25d4c9bda72a7b6bde0ac0b0224b3474cf2fe474b59f9e9e63a6e7be5dd767504d9a41ae5227f79e29b81e4c0593fc05d5cc3bfb862393f829b685742f9b9e342ef4525c39efe8fc7d065ec0326aee1e7b52b7723260ab005723c3e5a7f1887e4dc03bf836ebcfce5a7b5307e030d5604be2745cf18db745def5c6f536e78e7da6ef4c798b13a42c1f2a2f741610329a5a252f2bb57a9561fdd07df86eb81ad32bc096c865eb4110d125dda3f47f40211291e6b56219a93d0fc32e1ae94f0487c1bc4ba2a92225df64f6dca6abbe6f00205c8ad1e2113e17e554ba5a445b29147d69dfcb408c65472097ce41ac06d05e524715ed1b69c060393f2ca2e17e2f9a96d855798c5476de3ff21ef12aa15455bb4630399935e0c4f00f75e8f260dbec0ddd4e7183d4bc577fbb514d62e8aa05e58d46474f0411140dcf78d14eec982338985897cc414263234becaf75bd3d9b98bf0c92d7d3452a4ab59aba54d28fade7e2dff3ea0b48275e7f46598ad27da8370e4bb65dddcf0a198420e8bc0116d7bcb935cf4ac08570c32dc4e0db8a931a8a8ca5bceb8e4aec545372adfe36ad1914dab355e7e1df234015a2b61a4d4d6267460790bb68a2a630c24985d3326049afa1e9c8893bdf549afe9077912a26f36e7b1e0465fa5f7c5b7f715de377ec988cf8162c11032545a25f5acf72fe9f91308c6a5b6c49908759d5da8a45c3ae2ec3909df3836c3b8818dd3f41466b2b9182623dfd8339f4939a5833fb6d93c0a6cfa56562607c03d590388be71ddaf81cb08d3a8124e6f9193b618649eed9c5249884af3d71becf11d147740d2d79af16be8389ba6012be10d3855f6177a6c51dc07b5f32b64ea7f98ed87952c78f2afd9aecbc1b60e0e177246c9bd9929f6040767c3ebb00703cb015f30a429c7e880659b8ccbd6266227c6a1c230ca49b9d358d5145a60c16dd5978d4976855b26b5fdd5f3c943b3751e191747bc06e863594026c2d27c996de96a7a73178f29bc9efa73f7fc25ce885df0e3931f2fb4f07122b6c31921edb31132318c5c998ec33b033afd140b940686afec8885b921e769ee5d1431d1d99fb34e6b3f1b389bb3102fe4585dd5753a0eb2cb80a2082f88c5b3be41751d220490082ec5047c7c4a968b291d2f73327ecdc3d8ea3a02e547e49f1dd2dfc801464d590e5641d8c13d0771b37b95b6d6155051629d16f0b2a3f8f16114db27e6767ea14b8eff3087fa188405e467b00eb884f087427e3c06c90563d416417b43370eb774d64fa49c6bc67942cd37b5c44da88f616485c9dbfe8317d86809fa11f487c1f21c36a4c8973865bfb884dc8c315aa0cd8a9215dc85fd80586e734bb105a16f419f298a82578279a4f2c8b443df78dbd244275bec96a139d7b613d68bbc93b3be212c9b574333763f157d1ce51fdba7da0e248b8476adaf9d7b56c108154f4f6b92ea67dbe29ef4c950541e16343234ff92ce061c22ef2b8ed88bbced88e8c0a61eb7b615c8d524ff0468e1f1ec50ab8843379b3558cc4f5752c09ab928e284de586d15b1a4f63eed3c405df93f25b46cb98815f5627b30a4df7d678ae97b2d9421b97bfee8b0a6cd3288187f4bc989b8cdc74dabf16e90f7a2c7001b827da0f03bb19f332af95df8af14023adee84a11e7ac23cee00a1cd8663bd5e4f059c069e68b684f6b6af19f7d338e4ddb204cbe176636e84af165d6325dcc824323f53e7f23e5c20d55cd795b9ed69e654eb5ac02b75dbc8021e5b49fb69f9559850e03621e8f8a782b72a68e96ef5a40832dd3ed54fbebbc5da64bfaf8b359ef687d6099d47100fe909d314f31080f4ebe322f63cea51e47ab0162957ed653ef17970a6d4e6bbb86b7fb79a19bfdc473937d8e8daeaa78c360115c430e6500b74d330063061dca88672a4b2741698f0ad58d53464a779fd4b5192ffaaaeb6e66e1618845b8dd379693a54152e8626a5d5493b86b80c5a64519efa52a324e4c38c13ed8d64f1eb1e329d6d60a202de2afebe7a838192f52a942e72e28c1f4bbb35437d40fcc1c7799f281951b3e2feb9828d29371e73eb0fd9b91f63cd57d59211b53ab238cbe75ef60a0230a6d44061fa7f2b6315bb7c4ece8f8f0616bb1535241a992bd79dedd21d10c3d8f4e20f9d74a3b003cda85e945a798fe00", "5353650000", 0, 11342600, "11233bf994b5438fb0f2fef37fd7fe5d9fe58f417823d74c66c32d2a34655a6a"], - ["030000807082c403032b7dfbe6e34e59611dad3bea723a7b55ac7782e33f2261877eb01b2bf093975f02000000066a636563ac009e9cb8aa44e3a400a74678ae5f742aac7f47efb6c6e07e42988d63fc2e52abe3b42eecad010000000463ac536affffffff63b72e1c877570967e50704bfc0b170bb0d99114b68715de5b5d458795fe16020300000006ac65ac0000529a7d66d00337a764020000000007656300ac6a6553389696040000000008ac526352acac0000e9281e020000000002635143e6e987e9281215020000000000000000e01b5804000000006a5c84d798cc249d16c87c661569a43cd01ca690313016c900f582499b1159b4908ffb5b80282447f01a302bd19f51746daabc1f93164657452239755d775afe9df88c91026c1d49bd162d2107b6694d7b94a749357ed94eba3c8d1d1b30b95500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b5788f88db6edaf55bc5d8c0a75e266a79380a4a9bdfb4521a7dc616c7f6127271dd1bd809222f47f468ed2c77816f70c25a072772a6eb5d14ea383f840b7ba05fcdd47fe24a5f4df04e0e0af6702ee409b8f1ebbf51c571e9307ce55d90c1e7056e3da65fdefed758bfb6503aa65d1b694c1be8b3ae3f01c202ae96bc7e4e5b021bd8a77af9c11a9fd7e2533dd551a5e68e79ffebc9461bfdd142714df3f4383e032e607f009e5578d0595d0d428f85f02762939c44561a777fdfadc24ef7ba371d0a05c74becc846f2eef9862e7d88a4c6da90d76cabe0ae640c9538666cc51317fba91cbfdef86c3aaf7ea5a438820c7aca975930311ab0bd476d5089c3fca09e47031484fd28d6c43f27b1599182ff3cac77f88c5f01dde40b2e9bbb551172bb29680203d119df91428c9c49a5a65a76867b839758861920ec3a59926d9acf5df2c9a20324ba0981c4b114eeede31fc61fb09aec7cc2af54e5a9349f6c8570fd96e80946030c6e4e791218f70e0b1943062f9fbd8681f5a43299d34f918b438cae85938d6902188b14170d80e7bc53f1cbcec66ecde196568cde0591fba0b6d207290f2170a6970df7409688cb4ef430be976e756cf70a6e4b09dc144e49e92ce83e1e4533504f6ff205b57f26eee93c4526db84c728167b615f226892a7661ab513012fa5ba713113d590dbf260299c79f5c02fe66d048d1b7542fd79f329c653279fc18df4de4197c47ee72c2e41d6e5c8cd4367501a24d19972818076654c5adac76eb7c37b3c8ea0bfb1fcdf2eaec875feb1fa0b05fd85d52a4978055af401cdc33b0e78302f1ca5249f3b8927daec43b433e34da72cc06e0c1a0340541b3ef932fb46801587cec492064c0ab18c8eed50bf15fa1598ea42bb4a519cf482d2acfce083a0da9570cfb8939139d6104d4ce1a1c6dc051e3b113cdb4355b90810833f0d49eac6e150a2bbf486167838f3e04ffe17d2cbf7759cdb05cff79e1adf682c9fb432813bfebfe658f82002450100a97ed25cdc36c7fed06a02ea34010806e81608a3793edb724fd1665bdf6c3fc30bdfb3a26b1d9bfa01728fe942dfcc92829cd899c799f9cf4a4e0160e1c54ba78147b2747bb35586d66676f09fe0951b0712d44a2810542463962acb62380ce08528ca4655ff288ec43f4b17e1d244d2861dcae6aa86d32910bb3e644f7c3e13abc17b14896d4045baaf86313d3ef0f458cf9cf5422e2f5d62cb6ec8073a7e151a34a1e1c7bc48f2d15f5fda8d312a1bdbf2f8b3e0f2604b554211c8c381a7b7ef9cb01e6150fcc4d4c002edbd9c0b87e2ee981b1d96758bb2d6812473dc2b1ade0909b1c2fa136824473d321fbaa79c8f8f567abb2a6d4b7489aaa10bb316ae3edaa7b2ba321618a0528b51eaea61a41048ff833275f51fd8cd11cb8d86a93f59a3beca59defc76d69afe90f6641f2b84adbc3350ba3f9cac63b4346ca14d4df232570a0b103b3734f405dedfef4eefbf3e8b4987fcd2034e2c4e69984052f0606af25c44a8aba834fea452e15b353f957c306c0047c6afd3178473b25bda5286ad2f3b60739ec941e5f5afd1f0bf5b849ca6ac66a5cbc37298fbd063e9ee0bf6d1e109a7195b2d768cfdc4243f457dbb5d2818be437a9c54042d21a2981aa8feb6b1a825d8d13c3cf83ef4bae4f48001da117b5a733b0333ece64862c5efd1857c2d550b91ad5b2504029c8c09622a46263f6e6f9bb35a16df188384cff5a21a261021c0cbf234fb97c1c876bce6a69fb74621dafc69b712825d95952633940ba3e35b632fee5691632abe83996ce207dcf383dffc4309a9129502e7efc69c9a64729e4ef216bf385e4b49210c7ad72a2f35fadf937e521dc02ee69f743b13079b09223e501f06550640296623cdd76b846211871135533d11f7ddd1ec7484243cce7e64a2f021298f6363ce04cf6e3be18a37cc1b4c81f0321676f727d14e7ad1205211cf54acdb78d077650013191f66904e609430c5af4d3a9e2fcd0016257ac1c37e5a880d25ce8c3d1c2cb0724e33de69f64b534403501b21d19a3190460d35c835f1c3477cff390c7507c9be41f1fa14dd7017b9b44bf437a91bfd3d53d28e7ad7af32308d43a0ad2ed709b46ae8eb8d2fd7bee88ce131b97446c67bc43a9a670af3360805f6bfc5a3c9c42371ff5d32a5dadb1c4a54696cbe4445e383b037994799dfff05b15ac273760b3544752ffbff8651787f1f38b2fe2f45093c1eda599f978e5041ee8a9d12437c7fe81c3a32cbbd489e8962144b188b51269a99c75adba745dac603000000000000000000000000b52245a149aff7b01d504458bd82d484280d20e94089bdfdd70f2d9f392004f44fe220542c73b89803bba8ecb36e345fb558e9f44f4cb2b09b52dd3c27b36354f612bc9995cee93eb811b2a3ede1763dafca715aff58b06709469ed2ca747c37000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003fe6b98b7d861ab3bf468f2799df22d5befb9538ebddbd86cc55f90de73ce6f6cfeaf0bada522ffe0d2233ed6f7792ab62af8857e86344a15b05705a428695369edcfad6d05ce3cc005f9a54c112162ec7fdbd24b86aeaf104aebabbf7aef16f4ae7168ddc06f386c4e14a2ccdbfef8bb1aa05b434aee76ff6ace5cc67b35212022c91c5c552e112a0cf159a618e685a57cd29fdd5898aa622147e469d7e3ca369030425537a59ef7f253d4e853002c8e30c90dca8f63e0aed6dfc18c6c24007be2d0a002e053d431600497f40d887af2ef10f6f18ec3a4c4da37bda2263fe0145b3ff6ac882d59a96fa5d3996969ddea8d3af361c8a0484a8a14169f8c49cb317a9b502178acf3504e725abede4e63c64d1da3acace42e47ea4b215e8e37d96f7073597030d4088c3d6e619e81f40bb713c2de1582a853e4cb70c0fd5329493c10599fe72030ad4449e2983420ae257e256ff04d42f83490d0878ab52c98d48bf579440eba8021d220f2526f4935d81925bcc06d597636e0a761be84a058402ee0451b6ff687e020e246b913b9a1c179124621eaba777041f8d7f37a4449b451f567bf2d6ee9ce0fcf40ab04beb8082e3573c8f353abb6edc93c18fd19e75a6e82982659de192f681b39fea118e3758338a9c1261e98db44de072f04334573797a62ec5be00a3adb1e2bf424b9812f5e468802ffd42cc7f69e1db16ebb5cebd816a9b319fd87fbfbc6fe8a3ffb0b26461aab8206acef1e76b520ab943628c2a56ecf815e8ee94676559f083dd655e80b1bb148c01330bda6ec2bb483057d2f64f4a51bca175bc40a7b4535cc86e9a2b127058d77888f7321cfd933bbe0ddf23b9bbe6191a76444cc64dd17fa87441a3ab8a2984058ec4da22d3293edfe121438964c49b29c55b31c55b02527a446afd793b3bdeac651d11de77ce9c4973f0ff50a946b30c6bb3bf8b4ddabea44d6267e8b6bcb209c47da750e6d37488e546494218a8b92e5bc0b08e34a40fc7a358aaf0ad4b5d09fe33554a637de47e8d8402292e779b0cefbe62f758d54da5e3aab788f844bd40ca97d5c98e92d4a183d37de66be576f610cb6ce095b587192c8df327ab41563e717d059bcd62596e63e9258d1867749803e8525ffaefeb22ed8c44583b0562e6e4ae9b7095593b4e5fe1f9726d2d20546d7b9f8e0c9b33b9a368de872d05a702e3883bee2b3af38a85636c4d864306474e359d37ab7d8215fb11f6259872aafbd95c8bcd41d53435bebdeeed28017d30ac7491af3006bcaabf09fad1f47ff5d67f55aaa6fc9146a83526c1f8327dc6b01a02c42bb0e1d251b60164a4477cf55b79a538879afefb1b7fcfe6d84ec9916c800f024cddc737738fff43ea806439c865fdc76aa80c93f6a9e621c058377ec59f94475f41d0ea0dc7c6802fd5f919ce666a1501016e9a61b2662d73c048a51b77de72a5e659b6f63c3f72210b39174c9b31bae48a9bbbef0756c4d5e0832d7f847e24527179eb1d18f6c772e796c09a8f664a91bac8df04510ef53c05bbfb25bf3f32e6b61e455782d5b55899d555a66237304a0df3816d918aec7fd51129f87ff78515f0ac93520eeed359ad240538c009d1831132eab12edbe0c6cda9eccbd36975209268728f66f3a5c5f7c6856653ff6cd3e2139e02b7c6018c0ac08e1c16d47e2b602c2c6787fe8382b70a9fa5b52f443df223e7c87fbb1caf2aa391cc191c82f09311a1dbe53ce340096c705c9dd86e5c9e7f7258fe6111d4ae794fa88897813604c643c6b8f6ed60ef477928418936259f22d291c4c60ac3a1b820c4e69d9f7287ad4d161af9b6f843a5a5e4562bb2fdf45545eaf219710f45335012fc94250755be82f5a3a8641f2ad54f2f29af7617c075259c279c783f07477ac68e4366533b691fa62580b4f2f24326bb597cda411643f5fd013fc08f84666e59227a0a8c1242a17356b76444d645f0e55de6007ab40583ce5aef94345e8f886dedf530d94170aad92debf2fdedaef27927437e9658e888490194086006d82ac130a61f4210170dd4a18bdd39c970acfc40e840e27d5283f86a3c3766b8001699050ac0195788232d2c4841af160d48e6b52ff13fd5663bc127afd84609c6b36c76cb4bf9155686c7d5096372e46a3496eca296886b9012e1bc1c0e26dfb8428756349f5f04a072abf72eaeadab8d028a05b8c9d294ac70c54081ed11a1ed8d2a2e155d1855249cc581084953ed7e86bcf97dcbffbbbe2b68aeba219e4118b7a798da629a4697cd6c6423eb058d566a6ee9cae9218a84f4103d7d5f9ec2d5b22abca20b5e2891414bbefeef60c21487bd71cf472da2b4b73e4764ca6e16811cc6c1355f71971fb403bd2b3bc4c11cfe60dd3fcff873c447bc9ab95d313666355fe3ddfffea271fc3233f68865deed666ba23e5cc500", "ac53", 1, -2099164927, "8adeac2b6d51a5bf9ab039884cca7058d453220339a74eb10e4dfb7b9c16db29"], - ["fa570652025784f87753ddc37056de2b1d24461fc1e492622337a497f299ff1604cca4742e0100000009535253005165ac6a63f1da03bdfd1ac587783492a15434e9dcdbad2c67bbc6b994e8a6be3b2313cbd997ec7c74000000000552005152005323a4ef02e41c340300000000036563524249b6010000000003006a63fa0fe73a02dd43b00500000000000000000000000037753164e3145fe145430f07e449f8859f9f872fbd34c3e105514786194d612cb68509a7f95bbfbab07d687824e92b76434525f3b3bf2984b75a660e4ec7f5f26f834406dfa47c5e056a81ca74b34929a3d9032a8608d34d9f976e44046eac8b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e02c105af7c2f13c38b4c2cb4b60d80ae6d4102d2a318c8c6ca3dade89bb9273f258baff30bb82f2249133b373629e48590798a8138059c57c76579673969c918a0869f532f4dfd44203c55df81ddd469932a6576895cc4e5614487d3426a66707169bb055178afe7ef58ffe258acf43280551e4a7ca514732fc377b83a8778021c243ea57c2cfeebdf14590973c3e7572cf6fb89f274fb74c5e1a915f566c7d8021673dd72b361a304f017092057e3d638fe92b57b5e8cb68938ce7cfb8be6fdcb0b037b4e0cf6e13a9f2ad56312a6aa601feb083ec85e509c5873071e18dff0bc0d92575ae37987acb94e201ab9a0ec11328603d2d19532154c65ad86d076b7750303266fc1ebf8956248d5cc775b712d9cf254aab2c694798405233ae72fcf394703021a4c1207c1be1ee4f034985af176eb56b1df2168b13a9c055c31b13a8da7706f0325a2df5272aa3a659547b0435357803a6d2b07ddca942792d575a8f36c0f732f032daf529cf6a5e3150e95b060eec04265514296b182103d551e825def23c8bfd10227a90d5c8f7419e9dc0472fbbc7af179da5aa3ef9539f2cdc48b5c894f30f2b94dcc8725c1a1fb263d4f916ea31a9e3537283216cca989f173f55f21b85eb6815a297bc711b631b6669a6e86b6adf2bc29232d19630241c0bd688ad3fba2eb304545de0fbdd4e91b4a82d0d14024f4f33e9cc8ee052d914e59bd93a0d63ad3ade702bc70318c700dee91884c1e2787c8d39205777fb4c34cd311665c35baba89e57dcaad276a2bd17d2d8a758734dd70f04d7a8d3b1a337c3cf6ceffc54b98df5c81ed44f99d5c7d765977b305c92b97ab64ce85eb98b369a3fd4e912ca8dedc3f13d05755315d3b81d3b63a1f8d43ad51deb52741fb7ef3c2b6a21356dece2a8940b3ad660270ab94fdb724b2b452ed779a1a0a69f125ce8ecaa5267e0e8f0a676edd9558d2db23b569996c128a6fccb878c9053033b64275037fb1064ecfdc9f5c4244e5d59a099d7622a9078ee11c06bc8c4a65e9be55b4a9c64b3fa750d0e8a415bf1a9b56aac0afe5e12017ad9c971c63e243d250cb394410ea99be29afcc3784125e8541b72feadda609d93f32bfac54bf8b3734602a28b90908047c842c216a70dcfe791004d04dce83daf4d3afbe52823a512dc6fd6a389c3c0dc15228802127f05399eba7ee63221ee857a4e47d84573e3d4783aaead5479016b6550523a386b7de5fc6bbd2a440f144ce5e763f39361d01a121d2d235655c0595982a03751bfbe5073b26410ba2bf39ecc55c9131a286eb26443d6be3db71fcc6196cad582ce30f6d15e111c91811a9aa4eddc87de0679e689fd15e3488d462ea8234e558f3abd53db6cd4865cfad48f1bb54cc997056fa507f300b1542e2a5c954cacfda6f52b683077f4be0895450f447d3df0b2a62b05f548c2349c87b7110c6033d513175e938a2c82311dcaf303f8be6e8e02232e5aaa9775b4afe3ae8f5b4bade7e144bdcd53440520e52d6f6ee2bdb231a7fad5417d7187d5de2a8a3e221e1df44f6aa8219c813de823ebb9e81ed814007351632e61f06247b75ba6d87fbf259358d842112f4fec013e729264444be8aefef5c504d22ee7f02728784f71b8bc91704a4f76ab942aef8fd7124f4568125db98d3911ee6049ea86b0649135a2e726869b1ad8711767dde3ffd50335e18604a3d3512c1195795293245de3b4f04cfb700fcf97e20e596c014bab2d3af4ad492e229d2214226f58110fc7b8b6439acaa7ebbbfe64ea575c580dc89b518f87241e1cc30c3cd74881c123e88c833dc62820f27cceb94cb7e8e8a45f71c0abf5416e50a61dcf2ad980f9b10992ab0015722588dfa6558274d94f973179e571207a5eed1a10790c61d808cd008fc9245adcb6029c8209275c9547f16169091219d44b843f649ed021b0f0db35e0174ff91d78ab2db5d833e0de18ed4ee00b52490e303ca2adeec502df273596e72d143fabbef8b751e45a9bb29527df60a23f57f8c48628b69d84af36fb09a93ae5a9b65dd6956335ba5d3ee31306d3229b08062d53875d3a972958cbd4741435f54efad7833111af9b1d00a0bb5de282a109889be0e6544632957ba5160a08d9ee3fc6a8df8985bed40fb7226b5a6e4f65e1d1a49aab9878e56f867d9ac13f74e042afc357d0aed32b88f2bbd26014c252c1729d4421b0e863d94abbf49c69ad8be41120e8147a580bbdaa91450548e422871110de5f72fa02e86a66b592ab38e51cef83a5e8654ad677380df83f409c81f5f2f000000000000000005278201000000009ca252425d5064112584392a57a2e5d1faf6b7be88a9a9f09a2dc81bcbde97c89c7d9d9ea738aebf720297c78223a2ee0c775adf06def6ebafba39f1e7307c70f9e654534fe936cc3549101768352222b2f84257ed404bfb1e7aef48a05f858700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a033fd5165f3c3ff5abd3e4e167b8a9b083f840b96e8d26d0d097972a9902e4dc3e8852094216acb1639e71a4df2a58c752504f41e72866bf4e84c6cac51f302c7c4267a08332e086e25f7e9fda22aa4e16a09ee0b873e3de6ba5ed9ae3ad91cadd2c13b8d815898bd476c0c7da194e2a93bdac83495951de9ac8e4478b37f1f0327923d8fed0730a48c708e8a72dbd682ac6c5c27a5a132ceeb78b87eae4bf25702238d82b27b1c66f822ea0b67df458465eb86b34e12c421b42e7dbf4cefa2efb60a07a6d536811d8c9460846153749240526224986cb3b0af006f413dab10033c3bc3abd0329168781249cb283006061e440de5ad6c53327ffcee4b311eaef172ae0228cd9ab2e7e0c6bdc3ad701e93cf801593ae78648f2ca4cf4489990658847eaf020ca3c7ca46875543d56abb8d664c91a7337957b1f7aed14ac6def32f94780aac0329cdaa8856c004042ecd732da3a4eda42ccafc53030ad8a2753fee93963451f8020f0dd56e82b0e0721a2a069bc330056639da807ec325ed024a506e369fbe661d03043106fc8d17bad2fac85a459c642c1275fee2c77b035aeb158e13352aee5cd42590874238cbac9e2f91e6346871f94f0f13fdf76b6b6fafa63b03a1dfa5a9551d0d195ee5a8d50eba81223061e7afe4398c8b42a83627fe7878b70cbb499adf16ea3e92e87fbf6266dcf5657098f9a808ddfc4c4dc532734227c870400c11badf478cb3f88e9d18a3857ea4adfeec61c7b969d26a4ce9a537c13e435ab3c4dc5b336d47e2481994915620f176433498140defb6b018b33b7e5f2e283a48d9952fa3ad8a1a0aac83b2cd0749792e38e29b7e40b70698a2a4b3eb6fcb6de9190487b9f70fc8da863274493f275e5274e33967c888bcbe80c4e18f20d9bb3618ed643ec51924a0f54d7f33d9c30b11040214dd39aaa189d59b86b9af356ff701c57aee87f26fc97cb315825225f34f4a2cbda1e8d4fc33ed9cbe668b99cd08a32c824afe2b900c02df452ca05b946ccfdc157e963b4fe9c617e511d846ab61e119a8904f23dbaca2f4d4c66669a3dcbe71e3146cb0602e07b96dcc5018a3241ea6cf1297ef07764ee7270daae3346231960a36d9877457283f9d8cc3681a77dd424e9734059c4e272c9f39c661eaf7f5cd20e8275776da2e0beee4f2d18274df8acefdac322f92a05e3bf70efbe6a4a89bdcf96a38a8f3e1a10485393f4ad8539db28083b166ca540552b8c18abedb82195985bdcacf4ebd745c1aeff1e11ea1254a4c9477933b7216974249514edbb88818fc6ea01ba2601b29f6ea796c1b8fa6239e011d6af4098b3ff8bdce2c3239d89e834122bf9e27756bef07684b1cd18df60602213aac0606ac226a75800df52920f44c500749df61c9af8bafcb2f6660fc6db5d63e9f7553cbdd2812f8a90b18b8f522be95a02a7b29a0a95b2996598e25f8371db381824b82ecc66d25dedcc31791536d53a50fd49267220b3aacce8862d8f56d3b38eaaeefd35d7a3c0a9d23f5cd5a111d79eb7fdc44ddfa35e82605db9faf113b2f5a6499041e3ff654d2f2dc7495e7e0bdf9700bdc51b7c289c94effafc87463390ba291594916b3f2094c3d29a1b47e5baa4decb9a902d7c9c411bbf3566e988b25d3cad950cebc0bf67167acc818270c622d0a07e61aa681868f2b3346940cde93f1c57fc884c846ad06bea491253d803aa8afce68671f1f9d5b82b8bc9d95c8f18664c32fa1577f48f33302bbfdf1debcf5b27095777a04c7bd9d2dcb6c09745bb3b97a362efc5b45e074fa6cd7947721445f07f956a22bd319a1efdf7760ffa60a182b76b77e3b268238b67f69e0e46699e20713f108826892d55a6584ede8f36058cb86d5ee1e38b954b6b90401dc55eb750000f4282385649e498d031e0a2cf28028ec4730cd482b17bc126d994843032a42923464922afeaa8010c7bb54d7172a42c6580b3329e2be8314ec47bfc5a44c5f203c7fec241c4d272d4677091cad61d1a7cadd6ebe02655cc99f5fffd110b1b295c4036ab6c16702134abd829eb9dbc3acf64e18c255a82982c4b8f356676ccfe8ad0e25b817be4daf738c5d46ad704ab7d49e0b60001294d7f140344fe2617affe4b8ff19cc0690fe3c53b29b443db50302fcb3039fa46e12064adb21b7cd2a7144b9563be80d9ee7efa67a4e8f3a540d2c70ebe6cf7945edb8a981991fc6d8d4fa850869415b28fd998b374ee807a8e2f2352766a82ca1dc7ce73a15d4c243a2c2f4124096153a7cb0a8c04515a8f81048f856502a0b21882c7726bfefd27742a9164190e37e64c6a407100e0d670b792d0fdd04794117273621698343579a8a80ff4090655cdb7544c8ad72deb879c43e06104aca3fb772177bcd2cdf5c263afe272ad0edc8ab4d5118ceb4450998a81455e4941d7a07", "", 1, -1878466878, "f45ec332b19b5aba0a49c955be22ef968e627d809d08d4fa773210df752cf963"], - ["93b5f0790353ee9998e48654154a53aa889c0b812c1586e6a215533a70b46634c570116771000000000265acf2065410bcbac02a7efd172463263efb1cefda6f506fe0bb057c2c0615c4c9d1b079569c000000000552515253acffffffff43c729eeb7970736d45708931ebae19c13de7e78e544b6aa430ff4c0f6ba1f220000000002ac634a38681b04041d3203000000000765ac6a6aac6a00a20ea50400000000026365331b8a010000000000bee94c050000000002526500000000010000000000000000628a8a000000000027242dcf80bcc0e585c19bf1c5f18151d1a26c251523cf1837df0fd036015a6f678695977c9bbe37f86802b2730497a414e183e6cfabf493bf42ab8e18316c6ab1fe335ec74c2a47974d9b17f9ae9d780b17e69db3b17db866a6b75e0bfad818000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005252a859f1b4f614c15471cf1a0341031397dab4c526178e034132b589967ad83ceb7d29260d42fecb169305493910cda6bcc2d27dce114b47477e7f2fd7b817f059cd4b32ee00d734442cdaefd64e7f385b1ff7954b16994dd927cf630fe3afeb2d9ed87d6fac9956b8671c808c610f63ed3a3c69040fd8fbd9b6469112b7eb0215db947e7c98e66626a26a84748903381d00d78d5dbf8c6148cc823f8761d583031578feb415a182287b9c886c34f8a45bffa8bcb5f95b0751988973f138d7b88d0b00c1efc5f2520a78874851562ef5131f554826396bbf38472066b052ad68230171b396548fbc6a7c394e5abb9804624ea3fc72d3a6eaa7909d5275945244da5d0219065bdf4cb5c7b89d4628f9c9dc33b03089ad2118061d4880b46c10250971a40219bd01c8de90e3329ba306bbc2b18604a97027876805bf7e65be208b015f86bd020bac7c6afb429a00919f89a778c9560034c44cccbe4125069a239e9e7ee2f5b60205ce0ba53201ed3675d541b6adc52680e53928d9230962de812249e20479f43f02058b8713f40ff5d3de7cdfaa47aea45534329f6c8a0178c7953b04fac39f9bb705e67b501c5e35356e22d2690a3691dafea9ef4c6e556d6b49f29d13b316e4cd5d1c26b711113a7ae9939e1da23eb4b986f71abb52dd09bd340252b78ff4404302ca837ba83ad781c2c70f47afdab070fc57ea7b1f4bc66bd29cf65417ec3527e8936ddebbf2a9fc304f436bec84249e21970a89842e5d72b33d8d8a9c7df70c60c00ea51f13e093b2211b4c38497d6be9ab518c955dd81c7766b578fffc2e43a47530cf66da0fdd17a6183595936f12c92904a49216eb18554cf84d60502f77baf64e6d0e9ad38629550aa704ec0d7c861f52f3931ab6a5d32f9407a2acb4308078f6c2496b9c27c8f114f3486cb34a291f36b7b25aebe5ae42fff3e84a633d5307ef97b1236e6c4829b8abf720718b94a67dff0403d70b848e7e6b7eff90db92099c3f41b37b232b7903a4a6c08ea575ec2bf2d4e2e17769e42f465e2c1704445372e1d9c4ab7d2b5ced3c5cc53adbe14fe74eaae170e6529b9cd7bba6c8225489a4afd21d432eca9efab314823ecc097728033bb1e3f3679eda975ec2ed1f5b047fa531abaf37827fd24ea752bb6fefc618eb61ea7b00ed9844dcece66273a322c4518b3f2a986c0098dff70e336366d70da60045cc57ac30db5b7c728117ee0241dbb0b525f0d2f77b5c62eb44e15e47addeed1445976e496c52c7636bd6a4960236303c5976bab3e5ee5e71f3f9702903edf33454f460086efdfa8ec35ed9983c037ad637322ae4900d88d171fc5d01ee92cc26baf276289865e595b5ec04ac0f7f93e9a598ddcbdfa5ac582047a82ebb241613d1e3021b9259abeb0fddeb280b4515a74b2f53c21339126a3735940cedc56435a4165cb962bd2965656e6677cd93d8765d5f63f81088e38b64db245ddb37395174d5548cb3c6a270728f0b503a80da3cd6ebd126ce3a4512fc8eb62faac241d9a28fdccd05df77b9420a61bfad6850abc182afa79d9c6675f7897c668dbc7fd240ecb3dba0b65abbaf4d0fa2727cecae9ccd92e75eb301ec1dc1c9ad2aa9bc0fed9e51d70429935fdf39373bc4f4baab055dfb3844a6c8b97e8b70351f2d5e6376884e28e54624fbd8561e8f9c5426d464dbc461579788f38f4b0cf912a50605813bd69a58d32bb7bad40de13b01e2d88b91f9cec4d3e4a393fd0da20e9e95c799fb578e1efa5f09a81a1ed821a6272c41ae13f61446b63e788acd6b6dbc0ac36a57b5e0ee39eacfdacf5203f5d2154812871bb6f34caf2dd9a36c4ba4634fac18cad396837c7bd6a7a873ef037cb876619bd6b5366e5710e4b86a743aad1aaf65c1644fe0695ac46f04e726638dcbe980377bcabdb7ab05f613122cae1eb8feb5510180db424e8db442493fcce5804f208959b10e62b50c36a23130fd9c5e49da4fd5f7f92c9136ba4f9aedf8570d11f17575b184f52b4f81065afd593ec8f8b560ed57668072e41dc60a2f139b06e3d4e7ba45e1631a595300bfe28838dbaa048e7c3c0a43f9af6e528b220774320cf6f6b97ee6443b018d6a31a04f26d887ef7fba461084a3a21746e70df0d9200632eca9fe3e8832692c24ed096fbd20e1439fa1dab50f6f24b6dfd7b46029bb716b418be2ea8c8a2e3739fb8bcebfb99473178b77dccbba9d5aef5874151c9b7282605422113635b23f842abdb4b98c11ba1646cc5ab058a1302f6677e53b88fef14362582e0c88c242d1f01b15d8aef64346317de18f9a4abd09bceadedc175e213a174549f81ad09af0942b3d01bdece1065711677afd8a33748486e563c65d30aee7da537e628fb179c29e277346f004e456b1c95d7bf972cb4e582b92d6625dbe49bbd569ccb587fe320d", "526a", 2, 580987371, "27685b233ea6641e6decf9edca8487540694a98b789cb4d66998f669df894f26"], - ["3a0d4c3a028779fbf266d67dab9ae777d96229ae898a1797adf67856e4dbdb088900f3dbfc0100000007536a510063006afbf35cd30f3ff5af929993d6ea753757627b427e3292b0b5c8fe3fcc1150220aa8876565020000000100ffffffff01ecf43b040000000005ac5153005100000000030000000000000000c51053000000000061a9f51f1a5e84b8d980978b18e51e1382602fcb418f15448cbdc151bcfee4a17d98739a0e2bf7ed4ecd904735f6cc4dbeffae5bef0d826d7aa5fc2fd28bc297fa31f4400ef213082e5d3e7b339a42e6467f2ce20b4673e91180d978c775ac1200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e28ca71a795de4034ec14eb387ab61bdc2f7b8b960242ab70ff3e37ca9a07f96c1e1158b80be21d26cdc3e4784f9b233ab7968f16ee80b5c3582bb4a326b0cc5f5e95a3ba86f63b16ad7048eee4052876d1b0954edbb4510da2825bf0963c613dcd4e7c98d10d428014ef5737ddd61926ec5957619c36da85a8dd41ad473b09c0314ef63481480544851da1a89db4e2bc8da9a41eca9100cf363155250f2c3adc5031e4f65fa4d723abe9932c7946f2a2c19148e8026887d48b215f364d02db974060b07ef5845d55f8f685da1f46d14692a628a14680d760f4ddc8a2788af9653d910ce28da2e14b1fe88f195773902079722241aada09e6cd9c36ef9cd54773a46980206f7318c7a53feaa6f727499b12d1ac83c40551cf2744dbee87f1faca2a6012b020fa02974cd702408cbb1a5ddac93df28fa79270169ee7043d965fb3980e524c20217d4bb610cfa0d857721d0acc49116274bf3dce440547a0feaa9915770f8208302051eb79bb4fd5ad50717dc714ccebc05a77ec9736fa76b656df7b2644abc3403020ae2f5e92fe3d08db7d3cef2f79fd8f901d759a66579e013ada4da44916f519917ae7037f189b2e0a88a30a877cfb66756485057098c19f40d18a7d34bcaeeeab39e952739ea5f4b8a1a78bb51603f5943db438f25ecf8aa46878831e89c948a2a5aa9cf9b43de82af7b76130c5f30df6bdcf2753dada44cc100b9bfb0acb61dba1946f171030ff0c8fc1c04a0c75b81e6b8d8dcae7045e95672e5bd4345769951d0a188defec1f4f8b832842db39623d67938b243b38ff054e654f0477887ad60ec60f8c3627205e19a0afa4685609de27629cccf30dc766f5312c8f6c3198954590bddbc96ff02f847138728d440d60a65c5114b85cacb5eda443fb5fd56ff38580bed094118bf6b1d7902a8149fc09f98f4e03e5689a3923c1355f86ecfe99b8558d27c2c4e39fa99cbd9493d9a552bcde51db6438ac31ac27c20c4af6ad487db7433710c6da8aaeeb4e830acffd7aa75dc23563f1ea8daf5a6b2754151ad2296bf65dca47df9d306365645a5c341cb57ffda7787110916a2ba7c6954a350dffa61be5d065e1d043032f16cc14d22c18f382b7c239493f7e5462bda347fda5f270b79171dbb76846edcb5b24f30d3927a9f007059d0d6e81d4019497e4a7c4f504b7a1804d370a95024c66f0fa4638914cdbdc2167afc835bb17beea0445362c750a3a4b74c525000c8d36088eff38a97f11ccfafcdbf7ba94cca65f56579dab3932191bbe12841e2525a8b5fbf55d14da6b687c2ea72ecf6210e14b312bdb252280833279c5a1e8bc93b1397206e1373e9ee634be463ee80a94967c22482febbbaadcf5846d39914cde71707a6b41d50067fdfdb5111304cf0c6dd0553283553456acf9d255fa16d48d92913c58b87f5380b4d9d829de044e46869535e51de56c44b720603edb2f55812dd245f4bd32e6f421eae95e948c23c65244cc2750b5c2c0ce4db0289aaf12c6a0b521faf724bcee666e60adc5a13cd8ba46ec04aee6aee3fe5ea326a389eba327235019a2dfbf18b244108a3b7ba6eaaa79dc5899c678be149b6373db0aaaf5f522c40db2e60d4f44b8b6fdbdef35eec5e6c25522ed3a3d6a19163c719d63fe79355a4664114b05867277cbff7db4e2d828e10994b493641c9c2b394e6a607e7f58862cf045af720bac382c522b75e4892e4f3879eac334abc2f012b65f1ec059fabd4b0bf5665716e401b60ccf3f2c33b5edbe5e4f3a471747b14f7fa695d97f74bb72eb95ccd787239ca1052ac270a1333ad03919fd734f3cf6f174aaeae3b8be76b370b2d3670da12f0b5162310d6cf2798353a7910d408b5ed4bb07fec90dee61022c946d5518fa23910b0a53fe5cf2fbcd88696d1c7618a5082355e7e8230d2d5e4a4facb0a19147aa07f9b3cdb30cddbee4a58c9acb04803d353175c21de80a7c9b7713d635b6cee3a1cba7afc895c378f8b7dea39bdfbc424c42670025d02ce671f59bf5ecf539e10b0443b149dc8caf8cf2bbf5f87d29c12b03614b11977f72f73bebae95a7aeb38428377e7b1c92427faa9a21c59ce1d62a4cf0ca7fadb59f9aa61b9221f5e2ceff3067ae782cfaa6d69a0eaecda96a89aad83cc3db394af01f853911c9a3ce31bfcbf5782972daeb1b4ad2bfeebcf94717bca87eb3094202f972750d75858e7d16b5df21fc8686812c215b1ab24b7eeb14c16cc1a5f395a95b9a7301b355c5930f3490fa4248f37cbf6705401b3599bc4af184ed220eeaddcc6c30000000000000000541555020000000058ff449910ec76b3e9082f95341c471775f87300421b880f35551ab6b169babf1d73ef398fca8d4e18c85b464c3f8176b061442983a26baea08b1bdcd890269710a0fef912827929a77525b2548363853e553fbf0d14fe3d0b9403663363e14b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000df0299507b700c69b8eadb0c18bb1cd9cfaadc634ccc0eeef29ccd8ab0a9034981bc493fa6e1134a8e2894b2f00c76ee4cd01b4ddd0221938f5f1ffa196cb3fa22df2ab2e3902791b9311846866514f25da59268eab761d7f7a03a378713cd22ea782888a58f4d8ec402cdab8b806711ede6269e90edcf36689e16c7967369980222795ceb8a36a7fdd618325f03b574f7c5866c21d23143e98e9889d289ab7a030325fb8bf32231710cb07d0622e1b93be96ed4eaf92034c80c730075bd6de896080b036e59e42ab583acf9a25633bdc1a08df028158f4bad3203147e0282d418553ea7694d0fe4437c34f74810651c02d1be62da6998611ef51a03d9be43674ce4b20218ddcbd2484b81bb8aa654400e5fd492577370707c72fb3a62ec83c1fc69e453031f3a4424f37a24b31e581fa242bbe4ffd1cf883f28b81151d7b329232c4dc5e8020655975ad813502e234f4da68892cb19bdefcf66d9b668e67f40dd21be277e0a0325f14978bf1912ba0bc2d37bb9ccf62fde23a7c7d4671befcf7219802cea109103297930be4abb1f04cfe04e8f349287c2314b4b781fe0b6bd7fd9f8a27dc4577b362e7895fb5986ffef89239c41edeee08098cf4b23b67b606be259e0c1c97cdac439edba8cc756a167e0388ab66372aac1801457af1d13650247daa2c6b11316ec4479d81bc7f7c9300a9b8537a94c7ae4d9f688e82df307a7f9a54c1dde5efdcba6419f20c87ae687679f3255ac1eaf41a5b67751e1b92a0f7f0dcb11f745e679732bd6bde3364892d4e59b6e49825a2dad9cbdb4223b54343605654bc9516f838f26f577e33852703a9f446237b187d1d556db17fbed9a859fd14b209c8d6ba03c5063e2c4c6b9422469db006fe0fe144d360dbe181b72f5a2d6be30ff53ba05c7950dcb8f63e9ea30fecc8e581ef2eb37139a3748c714e46c29037034846f9e6f69d505eae42fe126406b3e930d2578e5c75bbc0e307e474399f03e8540373e6feae96c97f54eb0e57e9034dfd6079769bb47df622d8509be3a0961c9eef1ccc7fcce23e0d4c645768087c622e7665dfaa9c8780cb8d36428aacf381eacc9c446f357bbff1fcee4aa6b4556032f531f7d1d280c7058ebdb53abfab2078d21f08022477e0fecfdad756a4814bafc22068d0919d451789e4220a85ba36ed79dd60bc98fd14b7eb8b99240a67b5ab771f8d370ac3e9ab9934a774ad2a74b4bbccb955b65873093acaef8209722663b47c26d38aacb28384d1414ca27ae5b28eaa06343c71be626a93563e258d8d92a651556f47155b8194027b1cf3f1f9c9606fec565814f622aa14b772ab6e8b432aa74238b7fbeaf9e57e1acdd6745418a5fc8aa750b67c271a2ceab11f904addcccd7c4945af12cb01e9af1ee27bff7e3f3d937c3075965c14bc49779a6a8aab071b4e310eb18da783b96d5748ca083042364be6ca32e61ce2443d977635181a701c650bf5398c9ebba975335a8f3a6a9256a93d6ec66b7c10212039eaa8290ff55e816dada6055d4e2f3a3270ed8df85ae2093915c5ca1b1c5d199468f559585f5061e935a9fc30048bac45a21b99b56436b9a9ffad9d963856a88e567fbd121c36a52600d7008677339cb656c274daf6a0858490e226ce5ea6c6e5efdb021c306a4d01b1b2df3679f7d7495c066f55e9ec9f4611100ac28d7359d6f5230120e58c2efa80c31954a22b3fec065465e004b0f88f94e434400b9edc08660afb171e9d2dd9d31521dd61b610f1a8fcfbdab80d1104e909aa46044650c52480a4791ef0cffd59b342fd7adeb1e1b74ce1b3b9e2c56451979ab3cd4b2b95107bcb8262fdae6738b82a928de38b7250a42c588a5c8f176e8e29687f4e483398cacb1e58ff5c37d999cd88bbe2dd3ac9e24cfe16bc29ffbe1362e4d4ea7bd800c812d2096fbd5444c1485b04cb0d432eb0fd04d3799a92ecfa1a22637e136bc29b43e4bed7d36d8e1e7f83f6d55a5690b6e1c9501179fd7f7167dffee92388d737f24149f2a3b0acd670c07a88791745f0efb938c1467db195ff5bc5bcadfb69eca7027174d2d8f032798c8ee9342b534044f02b433e8a3266dd0e0b674d31269d2f0d016a3c6068815634cdd95582a21859146f7a9c95a21e51eb926b5f27381fb837386edc5c1f5f2c293257fbb2e6d5151191e4ae2606d8a91d4b5089d7687e19d57f9f14193a1b26cd2509bf5a305a2114373e4c965a403e9ed8ca0a4dab089e0ad126d0c07efe98f861721207fe5a536f37366c71193936bbaa288020591349300eaab0c00000000000000004850050100000000381c4ef9fe5272fdfc2f786842d3242cc6c6b3ecde289ed2b94791768e8dd8d719c5e54041b5b7f640a655d6445634667a1593c011ec2cb61dda9536169ce625ad29d53f4e696842cf736795eb6d7f66245342efc838e25ef2a4d723d9933521000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006d5aa41f1242afaee3d993b70fa7ac9a17bba0b7665656f6fd7d4a907be8ad7dab5d94687107e438e97a3443c9a1ee6e649fdee807091812ba3530ac2fc03f787fbabec14967a00cba569bd1adffe8a5736a2dff5d7fd4f9e8b03ad130c72fd7b521e9091ac905df89410c5490c1997e5eea35c0b22bde589d33571ee06ef387032c9ca499044dc1bc0213b183ffb564bbe198d97cf2d078d306a2c07f2ec6ce97021342702e3e1ebdcd95b59f029542aa71a06f01f851c8d7c5318e485285af290b0a0077a98701da904455014a1bb76c4ac9cd7876677707444653113eae5b8f7665d178c3624faa390e5dc443ea5f0d68e748aac3922a9d970110c5449ab46ec8c503072e9537348e8f71e1973df1110550755fc9ee80cac20ed8428653a1a60d5661022a9b9f4a85824dc47761853578714687c93edd5e833f22f3e2526447c4cc64b60219ed673500dcea018960a2a8f29532c911f3b9a76c3972bf6e6dad8f141c2c4d0204fe5592edcea8f6fcbff3d6731f10f7966cc2ed11ac15b867cd401cdb10ba590304aaa58b65fa07e0e4f36c0018b6c7810c284e316327420c42193a71dba17eadf223b326411db50c706cc682e724c17630ec042811237eba7b6a76a8ff8db51de7fdcd21fafb3d553de361adc96a81be0a6776ef072d2419bb10683ee2af35836af8a473b721043c01654d61614561cddd2266c5d9ed480205219b933e6d8d23516fa8462abe6726f54356473a649d6d06554d69d683fca63445f5f290c956c2325e24b1644de87e8a6b90ac5f8e92b6923d035d81647aff926c659e16dd0c69ebc87f7d8d75d65feae6923497b41d9f8858ee24116a55e132b659df63e99553a1582132d6957865252d62153337dd82d0925d8439328d4947f2533d20d9a671af300211831fdd318ddc2f3776455030f9db8772aa97069f10a1a865035883d6068b97a170b1178f046e86735ed89eb1189da0f6849473a2994774092a9e459491a102ce4c37bd9ff5d17242a30d25cc29847b5a766605e2775932d514ff5a3aa81ffa7abeb0c1c5707280a20b47d0bc8fb34ccf7d24d080a67191a7cd70a2b6d2dd1233addbef07f843d3b2e2f264c9b182f0f5805022db614bde1ac4b3a2a1e19ee0ce4fed0908ea76f887a1bdf02db499b2343129d47d3fb753d94883c689690ec78a3f5fdb9463e31c40a49ac43c5fbf2e54dcd774775c5364a0b1ea2f890b2fe8fce73f81de744574898bd5526da83ca3f6519366ba05a4729b0d2b174c57eda11f436f5e0df9096c9423e7744eafd92f1c3ad21f19d49b02930fa8cba3853f1826ad9dc4061ec22402297635efd33af08f23ba6d9cda34029f3207648de93bf9cd86a4c320515c67864aa74787b17d09c0830b63cbfa964fc5282859a8d6e41791b167015aa77db1a809bfe596e2de5094d55590f8d473269282d31ef9022c82aeaf3e5036b42f6c016c12b41b48481455df6f5982fca819a7ca5463f1d45455d49cfa31a9f693955ae9f42c10fc9d895d22c5aa70d4cf2466ab1d771ed1989ec02da2d757e5f97b24cd20bff0459ca9083612a273abfe287d5a710b56280394dee12b5b52b9675c4552c1468ea56415671737d4e1ebddb1a0fc4b9e0aa3ef1630e0012e3e4f3a439865e51100b4e8dea7a1d237ea12cf9c6669f3eee5e2a6a88537c95f0d1bb1963e80bae974e3a9f8037ce7290a1bc8480d3862209391920d0cac151a57989b7c4774b21c70f4d6dae5f8584bd25956e4546a5a113f67ddd10a9a14f584a3e1cae7520050694e7f226f2550a1615e2cb983ecda317283bb916bebb9f918ef65b9ac52f8c556abe3aa534646f5b206888cbbc5c6f6f296f3d7e2e7893bb7fda18e97e1b20a6709595f0b5315f80c19f941554446460768df6c03f5ab234b1a49ec557443b47d5ae1f4c4e3b3015724caa82792d40a5704116f89d4ba8bb86127ec6d7529c0f3f96b6664944fdb5e4f1c52dd2daa7a4e89d6c95bcf58fe2e681e48276eafb6bb5a3cb9559b13c191080a6a6b39953acb8429f6c96dee90495cbea82f9699c6ce417fd23cca3f980e4ee0fda36175bd6cafd69c8fbfecb698d9abc0cf2416ac534bf4444cd2fbfe25d72dd43fe0fb721853e922f44061ba46b131fbfa955f2477462e712090bf6ef8dfa28b4829f0d834ba4c48adfb384ef60a82298cf6653b19efe2ebceee5d477b5d79034c7a8a1e94c9ce4d509fffcefb8dd5e997f306175f354f68cf48463c0bf858d3647ab3ed92162f774f755c9b7c76ce95e5ff2c22eca1cdec4ccd9ad1091e3a8ad749b1eae1a52a15c2883f48f15daf3b1de0a2536344a97bcdc3bce7ed23dfcef5175888a29d5ed528b1d4071f5e4ce7b09d2f56ef12747e68f542b8991574def093622fe130f35239d05c5ba22a174bdf864a56f63004", "51525100acac6a6a", 1, -2110990180, "a7b0c5e0d14235dd261ab5958e18d371a3fed76ea9404cefafcefdf7d3761c20"], - ["ae7a5859033acea556bb3a52c1679d1ae7a0b2b986ca37f5685be927a0530cd53962a362490200000009510052635351630063ffffffffffb02672c4e7e6dbe7535e60aff5fcc6cae179982dc41a4361718213ef520e05010000000153ffffffffe9e761f99f3a00f2f04a68e5c650cf80e635895a814925ab0c7e4cf50b58204c0300000006656aac656a52ffffffff041ad82e020000000002636a7ce06c000000000008655151ac656553002e17d60300000000085352ac5163ac53525e8eb30200000000025363abcb83a2010e5c43050000000000000000000000008a484847c3507815e6106a8d6db107ab4cc0a29b43674508eecc375a5e9ce49be842351ff6610549c262aecb8d5f4c08facf82f4d4e5d308cb1a55df3682482ad2894c36671a4814d2bc963fc053eebbbb1d7c701981cc22bf70f6e5051ffb2e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b8715e7d6834076356831969cfd26f8827d8d2a89d173d9adc86e735562ca938c5b7627404128ba7c62785200a3b755485c6232e5549d8be9829db324c1a1795439cf4eb060813842b79e074696518f4b5c5dbd97c24c768a14c8432dd1acae9bb7d30b21a80789b4dc9f3e9babe6bd48113df27f982233698b0e5716e786ce022b49b221e781d613810a13db8fac7c722c7f66704d7cf799d234a29a17324c9a02188b6251eb570c854ea15c3d120367303aff3e33fbe5a733d0eed0f5b1bb4a7d0b04741b4dbc7d95ef6a923e362643fb7583d73ed372bb7d9c3c9ed064e64ff9777acaefbfae70bd3b32ac858578d17369b00849cc17cc23957c551e041bfc549e03051e1992c1077ff2fadddb64f4b9218bd8580ed0edfdffa9092efbde4c278f9f0216316749dc7b79408e3a18c4c7451cdafc81ffaf945bd8c1cc8853aef17c6cd20227da70167e1c560f4c8de907840bdb7cf3949dbb3cc8bd41e21357561afb299c030a142f7bfb6b39407f9b72de59575be77a02f1b785be4f87df53ba29a7ca932203274562cbd69e976de5f6ba10407c950e9bf18020df60f3c5db137e4e7e9bb7b0393fde5736beb1ea5564738b1196ab406d6419e18ba7f1c351888e13ad315d24d1e272a99f22b0007dd5c5d6ee75fe14b0e455ac6cf8b94e6925bcec070fe3ace5eeff552ab0435f1791f31a03bc2e31a778577e4f8de70b1e514b54783597b72b664d30bc998127fc2ee0d27af1843576c87b51e43e0d03af12dae3c9da234f55f01456a1186e81ebb4c22f1f491a14882db217f26a4845458d51dacbcb56515c86d4416c1ccbcb2d67470d116310fc5c42997e7dd868a8e6987f61aee135e47bc3fde92c13bdd57fe53f591d7e9001ea48eb4b5a72aa494d8f90e188b96b430692fc2ecf4856fe46743e280ca528abd1a1c8b3c2e67e1644623020ba28e8e71ab5553bf7ffa9f6c9612cef8db442a20a1f1937cbec54a72665ae1e84a80a6c508a2cceaccb50bfe419b1800df78cfa80bed75ab4cecb12657facf418963e2146f072fbc1a8411cc66711ef236e6043a816c5a920b01af377c2decf83ec64d16f6787f925c988630f489ea3abac6a33208ab4df3f7e015f82493e1a3c27d431315cbaaf731233c8f5fb35cd0cd112c295ea18bd85e156e068a3f3b539b2d09084030a86ce3d036502a580080216b47846dc4d341a081606b60f69efaac6b6349ab5b4499331f17755e78e03a762907be000a07c0bf9d13db27ce6728278de28a91aaa9c361a79a3dad83963d513c450ea6e690ea695e51b03049b8fe6c853103beac1202414f281c01c43713d7dcfffaa04df3ee20e7ec53857db38696ef916eee6c2c94f2ebb6f7e8ab495a79f895392791da2407629f54d2ba177efec7f42b4114be547826f35bb6cc18283d41d4bb44cb92c2008f7ba2e9c628e77aed900a9e8c7f1664bdbd62374098f9d1d4fd26a15e699036c3bdb9885ae0a4ba18dc75c8133921040e6ea06817a37973e53a28f174a29d6a089a10462b3af4a02f1f956f9dca30518adf545acc8b20a904d66c2a0750a780642bf10539777c68e905c339c04b5e0aa8665e1f432560fb6e8e06c8096559ef19232407a90bfc0cfc544eccd8726b3b9ce545a7782894b5b94d9792715f0aef28bf8a5dda8432d22654b27439ee1cc2b2f82ad08b223ff5513eb65daf372b8c4ca8aae077a71cb86ea7302173637ccb44612fa2a4cd525bd0d668bafa9d4d524dc2703c4469aa10fe09e73dc387ac5ce7ff3e3f13c1dc330558716347e82aa5b78a07db83c81063a6eef1cd55348215f3fa4bc4ea5e4ea66398aea5f00b59bfece0359e80d06baffb7d587a1e9eaef24c16824e889a9506a4a95076ee9a22b4f298ab3c741249975d8929559d36710570ff30c22ff79941d49a051263f02c42cd4558a27b4df0bd457862a1086e3cf40aec5023062339affbf9feccbd7219905257e954d180d41299db084197114facb4d35c91d36aad02623478ce33b5456e454d8030c5e695e19c57ce61271d9757d2d20a02fdf60c734d2700b01a1fc834ea603785934b227eaf599124ce51615c93e0e7bded347ed8de7c22ca62ef87acd52ba4a3cefdfb3ab8f6805c0aeaf9a685c77cf5c3e924c1cf327200a097fa20c7c53c2d4edbed05b42d29ef689919324d1a9228585b74d4006beecde706bce64c612d0211db7b2e35d5bba21607dc1f101ab1ec519e214df257a5f3f0817dd8bbcce4a6ea6c3cdb86ed71320ae8c1d183ad95754a70f352da88c5313f246151ac3fc2ad626e36c9186bf309dd2ab8d0a43e27c9bfb46aea0f79ac22175451ccb1a84d2a33f85466ed691276f40aadfa2cc9d7ddbb4be7bce1683635a4d667f75bc2e0833a2dc584420a08c1cf7213e62a5a8a808694a02ef694aed06", "635151", 0, -1270897166, "abcdb66c532f77f85e597d1ba003cec5b05c794fb152d102e7ccc35c1067e683"], - ["030000807082c40303fe50d3fa0873d4a620101f6b3e13026c7341c8a1ad6bb20778927044ec1c712f0000000008ac6aac516352535199446fb91804d52fd5c0268641f57741d791eddc9bf16f6eaec4ef45733a753c0d075ee301000000096a53535352ac5253656ca3f44078553073099525f57694f0eb130062807db155337646f8f47a2542e7b8fe3f3a0200000002516a26e1e86c019e6daa05000000000553ac006553000000005f596433030000000000000000c6c9e50200000000ccd22a213719a3db0798848708df371434a1208f28397161c76632e7553fc34c2470f95cd9f563517b01a8b5bd4548f8a7d0c2627055b656c9de41dbd010462cc6e50d52eb4e3ffd17eb3c2c4953044b8c0b60641135607dae333db4a5f8d7830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055450d205e8252700d936592404a8daf7d19b7f95ff48b350833494ed228bd49fac8ec07a88acf5f35e2b65f7246e3d284815310056c8c6ce43e7243784335d8bcc973fdc3879eebb0dd7e4a8aa2f6104e9c3d728effcc481cfbbc605ff24cb609fcf3cb301dbfc07561dd853bffbb7bd7ac3d8ffd51d5935574950e11a0a6f20310e7fa4ff7a7339d6de2563430da5d97b434f6d7465a444f504f83f7f90f0747020b4d71c17d9fcd5e88016caebb370d197bfb043d95a95760fa4859cf26aa34df0a012b068ca22a107e2ac425ed9273e67d6db017c97b73c5544368e73a9a508bae9d69c6ccbb70e56efc18a938af768af7d56d53fbd8f7bd37e76c2ad1e185a38f030bfc940f7e599ceab5bff16da15b511c5dd924de4fdce6ec74903ed66f7dfa92032350b9b6f0c5e3b024acac3935f49909d898030cff71a85d1ba36fbba3b784d20321738fe530839e022391fcf8bb77f3b1624dca6d0ca6aba077d7c719c078341a02185d565dcf7546ea353d3db10011d7ae9d7bc96221b47370f561f4db5943b9b2031c4ef6970c8a33fde7e242ffeab59d795ce131f42554f88f5b33c1ef8846e09fd89fb7f799aa235bbc01fc5bc9269dde7fa84eb5be5c68c597ef84c6be3cbccea3d1a3cac6b2ca897ad6deab853ebf5903f54b485b626474cf55695b216774425187ee6591f9c4ec372f44a15b1a3f1b0433fdbd108ed89af7afd08204ca7b8695358f23a7a75de6a2eb1ea4d6563560757db9a95feff399e23513a51545f11344a12d488bf388ab36b6e97a5e52e616f9112b555000a253d206cbdcf56a4aaf6dba02b288ea6d7dfb8848775af954c2285b86cecf90426b62927500e42306f53d7303efc6754790bab2f33d2764811de2b721c84a4c4fc38b8ebd6b9c6f4200a3524d29597a5604b7f3045f54a0d07d54fde690935b823eaaff6755c4651e2e461973bf11da176ad204b9e8ba9c9ecb4c077265c684227486b0b767bca6edbf8d2a0767117a779460b8f2e77f17e532d439f5f8d57882e9b86f78776a4550ad8b88a5f6c086be54a6fd0cb08c6a398e7aa8ddf79210c11ddf305d97fa80a43f869a443d83533c9b7cc8e447d42d53e4c828cd52c71b1c260d486b6565da0c27a3047dd08f00edb93ef6d4c5c4655413b053cd29308c1c6a69049ace5e1cb084b4bf408fc093de93b7547e4de6f60163ee3aaefa17ba3ac54d97653a51537c49afed38fb5de9184b0d164cfbb6ac4e2aaefb009adef72afbbf7fdb5489cad5c3adac5bc3b018339a54deb17a0dcba65ed17b60162765831c2f80af99e9cc6dfb4a69c35a200316f4c1469a8cb6c8980c8e3003ab6be64dae41cb0f7fb659d12ef75c5400e94e0213de613d44600cf590acf22af3245804c78f64161fd4b5469e376e77b5b49f02b894c963125d8ece20be01401ee48788bfb6b1dc629cbad7e61693f959d1a0b3a497501193b73189ef18e387bf89a62ed72aea262a406eafafa491f14afa8c7662d141a84c7c9db3614783a9023a5d652d70ffddbafda9664a5c479289ccd477dcfc94799a5a9de769ea1cf32ac259d448fe636605bc62a1cc1b16a5aaf00d290c6a332925edc1428f023f9eacc7609ac14162c84ca4da7bf631159d7f2a534efba1b54f93274218472d42046cbadc436629d93192882f0243a9cf735b5b306b8e3d7bc012f880ca6b9d23c69bf4154898dd7e91d5dafd18578fea55766204e2051e1af88bf14be260c50359deb1578ec356ed64673e14eb6dacabe64b261fa86d60078c6e8a320f485df00fb783696230d3fae45dceb52ed3357236695bd35e50a34ca52d8f7605f7463a2ab74acd6cbc178bdfcaf9ddc03885959d1d349ed4c4232eb4d1c32e018339bf845f35af7c9b04ebadfb3f9264db484ec95f72e3ac2f09db69ef56a4071da4ceea89b20111abc74105327cef5ae2aa2fa4f6fc83119c516f16112299fd5c3eda3e1d7fc8fe6f38e03cece1de46125ad585c26c2950e87828f6e946c5e2f030080fa16f8d40557340cf1511c3b426c02621a1c0d35850a4dafd5f354101cc38be1878f9cae3fdd2a845b0b9e5006cbdd9fab6ed82254dd6439f54e65f4727f9639fff0c834a400e09601f1f6bbfdfbd4ddb5e5c0bf1559de4d0f241a0cb8d049ee90859df4897f112f6d6c7cf8e4f03fce38ccba492bb15d7d733140b7dec6d96a9bba9ae1e753935820a3be150a0fd85d4ae9492ee240ec6726671f2b7c591424f05bbd3af4cee10ebab17e8f97aef62c8ab2cf7486d8cdd33548ea2f43259850000000000000000445def01000000000e3a1d17fa49a8f78355c9846401c0f169d8542e36fa5c5f183d098017465a44fac0f928160e562b98bef2cf95af988ae1d9cb2c3711ec2933085160f7a6d8ddb5e1ab36d3ae2c5d4ee91f783f844d1e70eddabd7ae4154759717f4e2bb1e5820000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000067227dfe9ce6ff7d6f5b3e602685a4a91439bd6e69fb4d187c84636685bc7e79205a6d75422fd61673b039954dcad4f300c1bcf6f89e9061bacadfed8473a53158f1091a81656c04676899c436e6b5b03de1c96b990715b2b34c9405249f89b616dcac6366a422b7fbbeb4b33801d5cbe240323d3f5515ff5471ec8c04024d17020c031a781e7f2925a2d9d3deb493021aadad21895cd3dfa2020f5d66434c4113022b173a5fe348112cedecbea52845c285cda0a6e181b5f6ab750355bc39921f750b07f23966e44ed1e3b111120c288092e654c1a5a8ff28e6abf1496c7253bab9fed83b15ee4e16a06345589a5730ab44b7d4a78efae81d32794d839ebe47bc2e44031b57dcfe4ee826d6d39c192c3643bfa88fd9799b77e75df98c092c0de756064402172751d00cd60f647cfbcb08e2b583d1f05ce0702ca68aadfa9a8cdba312748d0223358aac1e0978a7d6b1c2bac0bbdd831da522249f8c76fa01b3d68904ddb8cf0322306e16ff9616aeb03779373d229093aa354474b706f56fd32602d5d3ac70f8020ecd13d9449b26c6b00b2f0fdd0df2985a65a53c942241ba6f98476a2a4478dd78e03cf7870049b3f46ecc13c43dca9a23e4e820437860ecdbbbe39d4d23dd64ac1387b3c121366f710246b48d1d0ba785f7f8f57745fc9963a5b27022c534d138b9ce20b9b09bce36e6b5d6be2d3a25fa01b26cc3d58e32a65b1ded6997868e205c07cffa439cad881233d0b046dca081b33b7bef17f14979ad4311c6e98b8b99f3f538d91410c45164832694639871e51e86a43eb981033beffbaccc3c659025e1a93a10cb5d3eea06d978d2353c80ebab93ceda7953a654db4d61605ee9c7f4acd6f4718762efae6f5481b1e628fb29352d6d1875ac67c643f3e9b374be121fb35d26204cb4e0cef2fd34c4b282b844ef590a35be7dc02dfce3d6977c377aeed76aa91d9c53553e723bdebbfe96e97b559d66ca114276132269fec7ef50f8adbc78b4d5182ff1771f35f26eef6cd2c6d89a6dd0232dd2c9c4f932560c1942d05694507d7548b616c159d125c08b05d00fcb7a0a8767a81298455c312b1f753fa1ce1d768873d1c31622ba173aa42875c6197921cd2d0f3fd1709a49fc4a013128a40fc92ce49efab5c37a27a3d522485236b97d298d0d092be1f4fa4350920cd0633e68d2266e2cd55c430b88edaa47a1cbdb2bebdcadc2576b755755ebd6ea8724e8650abf701baf9b47605280f5b508f5c0a91c0aa77754defd56456d95e815ae2441db2fdccb2f265994fcced855e8953be822341b99f8359c8a94aae4867558be9e9faa8657351eb6488fbc69e57389cef930e1232c036b4adad7a98eabf97318c791a95e3aaaf3aa8e201d251d8dccdde6da4420ebad997da79cb6d510d445227993e0b6fb028e76a3db386f3fd5ea464bc3f7101f1e3f47432f970540aa9371f89368dcf9facf186c195b8077ce49f05c7fcd2b588efbc207fc125283a3d50364a20c0c81b62273dd7710f6bf609896710698dbd85d88c8d2940a4e484d653865524e019d0676bf6cfb1d8b02aa575c415880d96d45761300506e62d2913391261dc9dbe1fdb3392567e245fea64b0d02b07b89949fca24c30d59299af51009a7c9a338a56129f5e1728068cd4f5b1af25bb7ebc3c673c7eb7c28ee7573d199645948af993a6253e790354d6bc07f2c36aa056e75dcefd3a5ed1312f6c4550cdd2f73d175d6de691edbfdd6058a6715eaa19c49729c066985df468a5d909c3c5c07bda99aed213add113f00534d7d6db51f1fe449b3f1440e882aee952f6e97aa48815c2ebdb73b5355a03c43966d9f26d5c9309461a296950475fad0d3f03712c5a29d5d493f7e90ae70eb209749626241b053e686cf66db99b641585b30057975545a3bc9743656d81f7b4387481d9395de6e39e558cdcfc9e169a8b4f18497f076a7a57ec2b5ad9900cddfef519a29992fd4beffb70837011b4d4eecc503f27659605e00d550d5e4e6f062f3649e4b55c2f36bc76dc5351753e36ec684bde12038ca2e0fa432ee4e57b939c78ee12c70901ae2c7af905d45f3d61a8755ceb173606f8cde27a50dfa6657f188c562655e3bab12b613e9c3b68e653d993f326ceb9c27fbe0637fe0618cac617b01157cf81086c8279a0dcc4a298d366298da8977ad6ab05ad6483a2dc4d334279df628c585871ed0a040c0b151a002a4a114fbc58a789c99181905febf8fcc33b53e86053f75179491d6aefb894e16c700f882932418292a9c6a075f47f9f201e9d78805000000000000000000000000b1bd28d415bdbc995ce2b4659baa401c6ddeb8a209b5dce018d7dec5895c122222dcced6168cb39c687b62dbd86e0b7abf565612eb15100ef6d4a1eaed0468b66abaa2e2224b8b264e5ca680f7c583c99755e291e113e6c5022616851889dfdc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d09886461011ae904f621471855374c2e8b28343bf95cdb13dd660a84872ae3977209d254a532577d33cf377d22e78532aeef86db99db32814ac6fb64ab40b06a965e4b47a1d6323265b44c03f5423c0a49e60f0c4fcde7b76c18d57a5b28fed608c97e39817551a566e96b8c56db3351cbe4f0f1601d97ccb1a71dbf3e502ca0322bbeb6461abe526c94b588af35c2ca3732091b01d300036f220fe53aa29d9be031c3a116e7adc971d1e364189fd6739ffe7cdab86fe9f05576921899502acfb750a06ce9ea7b2d9fb9184cbbed7e9cf5006d342004b241bfbf124d5eb42442a92f5c2a1cc078d359fabdbb326ffb9486bf715c44d0ce87158072ea9eb548e4a5b30020129e7d24265e70751a3e785cdd9b0ddc016523b39bc38ff9613177fbceb0ee6032cc0137a6979c6b913435541d2ae704cc609663d637e3f4cb939b935612e34cc02294e64e2359a451fa1fa040e5e1866f53fa0db456d58307a5b9e39ad091df90e021e782f7b9c6cd918c8ce3d21643fd19345b4d5f0aba17c15459cce14a8695aec0220a3c9cca8af4605020ad71c80ac8ea04227413c4a5657ade1bfea4a29ccb8159f89e3388d43961410dec6b5c6fcb1581c59f1cb83e0ca7463eb4694b9580635b5417a537154f6ac756477d580d78bd3bc88a0c1a82e1a49efe721e330f419f0dbc3233be72d72075525fd28e968545764b4950e0abfba23a366c87c82415f6ca968403bf7151477f934e74e7d0728d14a2e17bf10819419d4c114d25031784178928bdfbeea5a620b5e151fef328cc9fb7d1673b8f69e570ac7d150271f715dc375dac529d94a877c0ad60dd5c977c89df7ddd0adf0fd61ae135ab69989cfbbd701a335af38ee1e8fd80543470567ead91a779fd02a0b75278bc45afe94b30b4cb31253afd26ae120044b27b8e138e47153d75bde0f632a14327a976987832b58c9061f9f8a25ee942d69a256400981b2f4d654ddd56d88784d8942262b43de086e8a0596d9a9850e53dbab5384999e0d5d4b203a918ee7c149597606eb32ee8208f48505786ea651c0d5886a0ad2a6557a8d12186660368ba18b114d4032e594ccd534929c9e2335843d452d5758d13d54fc29941ca829a636420fd4ef1de45d0df005f97fad82a841ee94b78668dd9468f0b25027d182447abf83a3dfb0c41bc2898fa91b9731476bdd295006095173b6e4e828cd35730f949283a0cbc42976d4bf22550b43e14f505a7700a6331e543334bcf3f2dbef085219c92144bb8f7dc56a86c1dbc61d7df69b9a0762e47e31468e3b53df937a0a74f5e72416fcf5246ac32e64c10d1ba59856f8a2f4d4b0b0277289096bd2e19a28ebfdc98af55917787bc1ad4215a67f0564a3cb0c22ee8e5c58da1569bfab065ca87de9cc723ebd0ff34416c10f1262daaab6c375f66eb09bd644ee9cb395bb4ad557c0a422e6ef0af2a0304bc5c5ed156f424e056259bce8f7001dd7dc41e76b1e76fd4f654b4ca33923d712a57c28d2ef06524801a35a030102d680bc3c4bfc403e97e178d92819b023a1d0f4d3db2282a045706d3e205c0a2d47fd95f855c8b380ea6679bb82e4cf48e5d36fb99d4f24d63c0b4bf169c1d437b5857c181b43233f461123b06342a97b6d6bb27e4582f774bef153c79607599ed8d7e94013fa8371641f6588d42b382a1fbf40a520ae5e48c4cdb53043d1648b6b0d79b2114b424838417774eb360fc4725fbd8435c53fceac81a0b45a954886cb26376c15c7307c5fae8ee06ba011bd33c1ac012f8cfd6f031036281a07b3167beca0698acd0ed8985a300d35e9b59ec75c817c6ec9b73e267ab58690a42fa2d239ec003c34ab3ce1303345fdec72eca3c2a890b39a7824e6e422ec2b9eab4582cad18e5e0991510699116186d30cf9a70a54d749dcd0b88466569788ea4610d30e80d2b65cc5b2ca96b584c7977dcf096edade484ae23ad90ab84c2ae5e9f2a1f271e4771d7488430295bdc592be51401efbd10f28d7a2ed93dcffd281add6a2a0d001b9d2e6cb8eff78cc602546db91b29b9287ccad05a62bf073345904c60c99911377db769ea64b641cb05dd006cd23a0772d22519bbfd6b4d5fec024df2e4c80583a57054d4fbaef45fbaf49f6efa59fd0156cab4c033f77d22bb27cb48a16155477c59f7a7a97b606c599ce1e06f85bff457aff8f3d4ab85d7569cad5b2e4bc14b810314e68264ef3c4c0e39e469d25a0d770962ef5f304b3c61bfdefe3332822ed0de40c8d71b949dce55a393d2aa882c7e3482bdfbce8edb86086ebaf11bdf2224d80abd13fd017cd8e9d93636233d757ece850150f9e54a72ec516784eb9326419ee064af08d14df4fff3116f7e7a8f23053246c662ad6a64d141e554708aac09b6d3bf0df8c84adafd4039dbbaf67c95923b4e5cedae90701", "ac5351", 2, -1526254886, "fb7a7e5c95e1a76ea58dcbaf0d9754ee5aebbd6b8fac4e5b7ecaadd6cfd8e4e6"], - ["b9455f4202b26182bd1a7d389ae1e6ec66c39484e58190eb652471472ee836d7f52b0a0a9c000000000151ffffffff4573ab218f58d4b3d1f4c2c2fed6f8aa4f7f37bc941a4fa0f1ccec14d49400470100000001004a95547d0292a3d001000000000352526ad0e6e30300000000026a530000000000", "6351656a53ac", 0, -754841972, "004ca792be0eeaf32c60be0d556bf56d8ca9b5a2915dae1fd78be9880d37cbb2"], - ["f815f50f02b7d509e1d7ec58d5016d3c0efa630105dcf347661ae1a22abb882530710df9300100000005536a6551ac68e74d347ccabfb5d28fef87bb569d83aba1c29343e8b49929198e4ae54058fab4051f0a0100000004526363655d3024350326e2e002000000000652ac51526363a7665402000000000265533017600100000000046a530063000000000119c7bd020000000000000000000000005b16be334614f17c1df8f30f8c606e6c842d9e1131a6cf812cb6a91f8b18d5de3a275a933b793658a47244304ba9c1c3670cb27696845f4ee0278ff64ec86646b16b46ffae62983fd90223b4f3397731237dce74875ec500b7de0abaf6d9d41c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1fa2e90075ae9501ac16136bebd4aed7a27832da1ce86b858e9b7ea21a32c0525da1b0a11a052e942e43d82db0c0625272b0e20acf0bed0616660fcd38c836e69eb3ca511c1625b2344d97b07fa9c7d7ec5b45673deb01d2ecab221df8656000657c06cceee9fa0e1aa9d2163c7752bb936de7fe3e01538148c30d93fa24098031d1113a258888012a1579e7018d3cbcf900be780a8a70094e127abc75f4d966103074b10be02978092e199f53a1bc0b6c0058bd5031808e92e8d367ebc293665fe0b060ea9622aab86fd525e72fb87f40d79aea5c9bcb1c7292ab23d466d80775441c6b4d58009ec51da921ee3885e849c697a85e9e95bfd8f6b80ef70ce582ceb8d030dda5d417b10fd70524e52878bb571829fcbddfb40f5c37fd2499386486c29c403251cb41f532877552d111c2f763099ebd25b5712e368c963409b3fbcefbf22e1020fcadc78042539d96fea6cc603ffc639596405358a71e48083b774146e6e438402011aa4d2d473026dd050781e8a98ad715f052046d9c0b508a5698e9f14267e7a030f576e243ae6ba71331108d3aa63adf251769960c3c64411671754cf5ef69324956713725174c1fc58a3071872c2067fe9ae3b41763be5d09a1f76c59bae8cb06189a05af68e9605ca12cf827e68d4333e9381aa373620fc409bd41a888b478f841255e9e1de08001e5118cd300b666221a42d035804fdb83e2fc69d7e1d818806640d318eefbcf0b07be70acff07bd1ce1407a803e67cf23d993db8c658d3c77a4b39581a8fce01bb5f2c175ed9ff6bfe7d0dda63f31bbd490ff10d843d430d4e392f9812f798123df9d3aca4f37fc1a1c1a7c0e8d4a135775a024d44988a48e2103766f1fff89e8c582f110ea9f3329e618cdea8565541a636b9a96ffb805b384841693a8533c2e5416355e2b481060bb04178ae545664dc1c0929aacef023dbac5f58ad578ab75b5392817358a6a79d58a2444100dcf441be0c6967ceaf4bc3535ad5dda2c467ec8bee33501190f069f5ef1606c2b9f0270ff843d8db6fbce15e94cc2e9ca7e02bdb2fab48cab65bca8b9254c90530a9af7a4b0ad2907afa3605d4964de2ca3e1d198d8c5f7dc269d551134b4d4d8d1054f93f2fdb83a2d80db817b07a145dd5fc855c5c515a604cb53af065e527d125882a1c13c6954a5fb51fded6a2c7dd1f90eab8764085d3093e5152c4758540c27e181ba57985388191ac1750ad8eb5234d2c6e3d61c28aece8ce56c1b804242194a217f7afd5acd2cdb0587d1d3ba1311efab37e1f63437655517cdf599f00d650c26eb6a53a7fa4fa49d0326846281df5cbda0e8de6250bd9b9e2115caef1eb53b5716d9d0e910d2cab290916c10132d05cdc018c8d737e3d9f50e38852053a1ad409b81c207e0bf69e6a9a24ba1df9ca4fa2032a5ab31f3efcefed36405a27e42cadf6ac3cc6783e49139c911e4fcdf23da8c88f4057f83495fd5de71aa9f364870d5d8cd8c97bea966f6fce00e938f3a1c0146f11dd6d550e0c107230143d86afa3532060d99e286469f8342e6d256aa7f5c308a0778127e5cdc0a1cf04edf64510a5a3bfb30deea338e225692298a351b5c58617d39532a4275f8f8cfe9e2a59fa06651c6a3055cede9e82086d384ddf865f2af3815047a656becfcc7f7d691e8bc5ab1ff9b385587f1e0ccc076fd07fe2f18d7d16b8151b9f6e701621a1625eef4c62a646796a276011603256ff26c67407d3bb9dcbd0a48c30f1fa446d2b0a2addd2b0b351e966ca99f2c6a8042bef6cf52616b982410142b98462b65926d2bb48a1f84eb79a8b5968f1f6989ef9f2bb7665038f86e6626af46b8282838ac8daade00225646a5357152b52b2bd7665abff8d07be8e4c8c6376c346905b0b048a448df7a568dcdcf014c81247087507189f8af2fc625fb9660abce576abff9f7b0a3b7486a8489101ed1140928139cf8bc20a6ed169ac3c861864dab25a94970e052191d8472b8e506afc897b9c393637040e544849d079a31a02dfc47727a6e73db9425779e51d850ad6209ddcf1af639fc49f357303cce9eb924a73ebe35b1cefbad7d6b12c893063a2acd9013045476a567a128e4ccf2d75c87139084d283fdaf96b0a39c555fe23e1f78efa76201cf735238d069cddd2bd95c943356ee27a967823c77eadbd6a29984e2c51fa39655ea7d22db030010a7d4a2152ba96eba7d032bee553e5d2b65d3505764c3b7f603ede126523567fde34c952ae673405a6ba55a05108fe2b9b3ccb67d481dd3043bbdb8fccbccf1243ff2af488f66737b9b4d9a5032b86af10f02eaba45c38fb7c82145b55a7db8441aca959951d94e4a481bb07d84176fbb78d03c406d68de1743825b3e6009efab46d215f805d1ec59cc53af23b07b88d196a2bb0de2f0dfa6b7f6c70a4dcf70f", "", 0, -457613618, "4ddea1bffc08bad6e72902a22ec31bca789b72c4572823efdc6ee7e959171851"], - ["030000807082c40303f9d14d5b608bd1e8fdc0c4b8a45adf8c46f4e8b20686a080cc4d9109ee958b00030000000400006565ffffffff2e6a3ab6fc9e673cfc541e827bb19f02635f46e83cf427ca472326df74d8052e000000000153ffffffff6a23b7dc3daadf3526d6ec815ac24342cd4899c9350692cd74ed7fc293c67ae7020000000952005252636a5152ac21f4cc0001af62a402000000000000000000000000000100000000000000006b50a90500000000beaaae354a134d801beada6d7a61f79b8434ae4dfd184765067ac87943afe56586e1c406bfc23f84fd96e898aa1f87d0448feb88f3d6bcaa0a3c56fee07d7a75a2b140913010968e521138bccef2dc51516ea8cc8e7d1d7a48fac10bb74b4b1e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cc24716afb3ecb34bd381b049f35f56913797a41c812feb5b2ef3e7bc73330dc714f51c810ef4094ae34c4c43967dd455e37f6528feff30e92f63b6f17263067cf8752d30242b53ed51037b3cf93ea324a1441c9adaa7207e591441317a6558693428730ff024fa37e48fabe58463c912d78a61089492e2f9f0f40383d10a691032a2f3b0e6f71c89fbc90ba0012032d1fcb8b4e9ef6da46bd15d23443bc19524e0201069268924a7f292f0dde18cd1872f4389a8abb279343babec1cbb17d07b1e40a0163146dde750607bd0792290cc3fdecbdbc93de59cb73c4c4fc90768707f7443ab153bcc7b8959adb5c3e3a974a646a3d2fb58beebb1c1b0fdb723a72307fd30328876a0dcdf4a4e0beb18f2b94819d2b8d8f291ab9298a7551c49cb43d911718030960b088e7a9ec411f6f5b2b27b6e13cc9c086482e94fa6a85a697a4b0a88c780200016495ebe09bd9038fd67086c27aa84c9029cf1a60ce8ed7fb3f8f005c230d03213104011e853d288b957f4f9e12de17e52054b80db5977fb007f49f96c6a7a703153ebf8e0bf5b6970f0b66cc6bbb6f6104a71fa08a31556c45bc790777f5667131c39d3591be4d84bee806b76a09e7cc9b40268f5f417375814133a5aa009f1436906ff5f473dd86d1645dee1a1a9a435c019e2eccc590ad50dcd8bb235221f3f46cc989a798c9f8c369208da4bb1f80130e1f58a952d099646027af5174f81d542f0de77aa35357c52f956f0b9435125eb3ea0ed87cf8720b7d8104b7d0ef9219446791437dba69fea046bc6e4e72464b5bf39049e9208a151bb7b482d7c003ce9bd6f90df53461d5bc18e47bb48369ec5e199fd3fe0c53fc44cd77817a11420146d1002873175d95a9fe435fbc5f762582af297865a7ed2594912d4e193c2febafe09100d3477529f0b8c321ec19bb845ec9306d00f5038465a2eff28a3c13ded490944d38b939610724e09acf5967b326d66e906fde9c46b51d421319c4c96a20af806d4eacc201aa4b0e56da3eb10f040e3f12a22e1e8ab1d1a1ba30b379981f6593c57fb8673f6969cedb6000b84718270d710adce5671813e557a4c24f69ed2308837084c2bfb9ee95c38fe1ffce71652df1d0a6f777133ecb92cb481174e8d574b99dccd78c350872938f4783f99d3f50c01a9e294a2cdf8d7bafb979b9cd60ea0db9ef3cf4ab91bd83ffab7c584e70e1cc85970fb1d736db8f687f56cdc6a3b340ca827fdf65bb031dafdc4df57bded16bbe30c482c5b267aed30e657bc25cfac423a84743a559fee94574eb3fe5d0ce6f28d79eefbe40f0ba894ce44a5cf4a5a5ce060b8759cc278c9234e00b38396fecc6b8a4b2fc496430d422cd337a59a176c148ed1ccff47124dbc9621ec8395547f45762763c375d2d7b910db0bfa6dc7f377b1ca27669e36226daf9a576cfd6c5345a5e85fc5760fef4a4a9070997735b0efae4836c0e4ee917766cc42f969f743d4880405b06f875bce2611a901d96343222933e42f9fdab1a6364b9e6c01b6f53ad91644c7c1a955431006673a4f5b8483e935bcc349feecb79c096f3dfa25594e96ffd3fe66e33162b20008907b00b742a6d81eeeb932086b241a749ad6fe11ed0da57d0bcd239977eb37eb6b084a1b1a9894a7461222a72cfe365fe4c0d616b91018fe874bbef6b99397a732b9a61f30d23a4bf48a9062aa2e9b69b7602c10555de55b0ee0f75ce5912fbd2a4afd3b60afb78c0468ee574fabc969f33932e94f1b5a9b5f4e4d422a55e8f7cacffd4acebbf30c851356a5bde7d9f7adf782e45467318787f01267cbb4a615b9c0147dbff3ac52c2a4b1809e6d48cfecd8910e521a54181665a64c5da5c0b32ae9256e81cd36b02eb30523cdd4c76412ddeff61fe11e4049e4a68101f3826d66811d8efcdbaf214b4cd4025c9a748eb8305e6f6a810bd651dfee8ad6a2a667a122f4fa4b7f5b540b2acd84a2620bfdecf7f892f13a0d9f513bc53144bc633e1f96077bd7cecb6bcfa923df273ea487eccdef656d68b3d73baaa093ab4fa879e1e21a4d10a031b0407e8b5d220cdfcb1e905160de8f5b0aa08f3f80632a4a0fa7628fb3ecfbd1e208c5a8949e161617c979a0f59489dcd7fb5422c142d93b6f76028f7c950a26c0f9712af7d46209b92d3aa201de530c75106b064ea519758d580177f264eaaaa99bd18bbbe3664870bdd8e68bcda82e21decb5d91f64e1f76c5f916de7de7693d0a7dd7e30fd4d428435d10a7fc5403e7588c884e55e244b5cc920b64d7fcec34da074ba8518face29204c800f9c0c7c15623dad1768e5ae957e1d664c4b836e49c9d138d0b40b50883d5bc2276a5662df98ac0ae060e2a3fa81de410f0d3e31f5ffcfd0c3c597a8788c2aa417c0d8b37a8628df9f4a82f04a21e8354ba25d802ec8a419f1500ee800", "53526365", 2, 1090213351, "c956f6d27c2f002bbb9fc3b3c68a6f5bab61f31b392522baa67439c7d08fede7"], - ["030000807082c403010a2b543c358a328e6dcae65b42ae3a9748c157f63e05ff60496ebd5ffe0b019300000000066a536aac526315946b16014bc3e7000000000007acac006a63ac51000000000000000002000000000000000007b9f50000000000935aa5862cc61ad1fd89a8b0c0b151126d7156a239314f631559c2939f57fe20d1c18aa9542063914d0eab4af623bad9e3677c71ab17770faa1b0fbf80e038ac4b41db4009c6a153263cb3f63df7da26b3296f4c281c79bf28657bbfdb1676bf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f5fbe5f16997d8306e1caafc3c8c8a52dd513af799260e5600c191f579e5be92467bd6febe20ea2cfa58d4467ddb9bc9ae818128b9ababc68b130ebb7a98f213a5668b8c02e6e9eb138ab028e263f644c50c4d7521314d07bb20a68ab1ccd04036aed4c24b307e0874c4d194e32c38ac8eeaf47eaafc16ac8c0056efc8f25f480318a22cf82c5a852766b80e5598a66e84158ee487d6a3adae745e1d9ccabb390403129824c1091827b17ce81edfb385f0ff9ee1a73b97c329ddb82a84a26db55d3c0a01e5d5f0200a35f449120051449d1755d338cbcc00fe796d1edceb7002a5727c94f29470cf3396ea59a677e192fc63da334783f1f45fe3f1e6df563e97fdf1f4030b891d16542cbe48ab99095a65bfd406b4efccfc2b3e9d25b4a5ad10019105960221ac50a28e610c7c665e52342769949e268808381986e17bda35596fb545d51003035eca2d1dcfbd70e22841078f9b3adc9f2af614a5db2366e68c7fe491c2956e03153d88855ef87a26e011eb49fe2eb29245f9ee1aeee55f064b4c4fa2b62e08e1020eb73ed7626f96334478761aa1943295806d808f3859e5cbac9c8a64e33ce5ef19796425ebe6047d00b1a0041a0a8be5c441907edc181c21f202a37d706812f5e546e155df3184c70bb3880250b1d6dcbb165253be6d4c223814190569cd6971d49060b322745af9bfd8df69f61e8cad4b0aca1f910ab082dcd4f35949d1c19077ac2fe664fe345a6741e9be3b3333a92718f802ef89cffc094a25095c30ac8dcff6f6325fc949508112d2e332cb63ab528ac60002a3753b4bb4adbf1c2acdacea7fc2a007bd50da7cf2bac70f72f06d34f19f082af14b1b25ab6b70cc8d84b0764c9057c8f996c2c83295a2e6bd1586f1fab830d0d274793a4c7932a2f512c9dea3ecff6921707ccc31ebb6b5b8cb03efaf2a82d70b8128703bbfd4d3611c532a6742b64f472f1eff4d027a786347e54f3d4c92f9a84f01afb82443cd423ff973c99d44e47b0ecaf1baba2432e15d26aff7163cc9bac76900bb72663a2a93806c3a82b2f8810d43820dd41ccd4e12bc3c2f4603c30dc6ccb24f9e904f9d252a3b1f8fa3026f9046750c92012eb5df9fa4b6276067d34af2fd7ae7fe1a2fed3e549944e6eaeba7d0db93da981851e7b9123745a9a5e69a0fe8512b52935a6c7b0f7a82c67e79fc9174814c8c8fac24157888ecef64b0ba1b3c9692d6a321cef2aa004c21f56e311986c1696f9243793ed3c6318e1d4cc9ff80923f9d55bb6eac9db64480110fb453e837bba140c0699b992c3bc52f91a0bf70d1bd32961f17b0b69eead4a2e1bf01686ed8d6f98888c7aa54cdca296e2014f1354447bf7e1cbd8210a9291cf87169764a012b6449b206ec7b2178b936402df179395771f451ad516199b4ef294ba7a77c58ab15e878fcbc7e1d60a40c5ed2789a5bff7fa6b87ec499a3d55d67203bf96d2408bc20f652b98164131627de51a1e1e8ef8bab54961f39b57cce8c50fb25d0b0da6e5cda14498fece32a9177c2fa8717fd52e1a30a2fd957c6400496cb4fd4a0874aacf1217ad0c694db1f1ab8aab4a4e5ded76db4249e15cd07180d24d7a97b58eabf1a2ba560a2b87d5f0cf08d73936fed90f513c02077caf2694a8f6c0713da1283cd908a8959f01ce275b715d817b9e10e276f21d1c3f47cf71a805ae488ff6962eda5c1e8290ef82c5de1dbfdd63171cc24706dbc888b2c83f699734906ba6f32ca14cc6f95f07f4b4098e2cfb2a42fb99a2ebf1ba085164722b22f985f1b1802e209999192ad8b9b85ac876d6ecb882f14e385393bba433c533964db1671075117c6f801e0bddea9299b129b92b40bad884c669302482efae9b828a1558d3d779a7524fe764bac006d438874150cb5e8b19ec5e8e75cf18f12e180bf5c0698376847dd5cb036312aca038496339ea72b5247be502894eb1d3089416e71f7f985dde3bb5b12b7bf38ff0b9c656fc20c39e7aba1e86f7503d4d1baf125665f1eba4dc9fc4cb8addc81c919ebc1051e28b00a2fca597aa0afdae12d492710e20300413aa664cc2000e8e9249da80a4029b4f3828eff4ecd4cc439fdc8cb8b3dd51d19c85ace94d32a50a5ad2f75634c9af22ec6c65b11dd847ffb1d7bb60144fa86f2ce714bdf6d11630dcdc2a4dd64580f8f59c25878770751cb4f457b027c1922d6abff57f726d297810c0c7d4dcde0d60a20d237c40c00e77451205a09df4d987a5756ad3708e48222c9ca7462d0e9509cb5b1e29a748accd925f9e16ff2525b67838fdc11ea350400000000000000000000000047c43eee889ee8639efefb20617cb56ab002e9d0e2ad682acbcf2ad43b3169d118a3225880072763ede2e357d679f448526b1a1d8360f161f683cda04b49f8d0984c2504afb60195c61073b36c2416c5378f82673d89659f449c7dcd465ecfa0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004cf6f68a0dd735e997507b63b64d4a2a5e13bc328a72fde99407f6a528c99324f671362c9ec32f4abd63a02b8db7f8b92f3662a95de4c2eace6b1248cf565d0dcda293eb3ecbc5d6400bfb9bc92f8634fde3e8cc8573e3b87014607d59b84878a9d14a14a50e018654b53ff9e93666b9e9e2606ffbf9eba590c2487ba4d1c89b0220998fa558d09a7ebc34f327460062fe11c6a0ba18fbaf2f34aa7060b69f9a720305e3135ded94f7fa311e5e1a83fc3db14743dbfc8dcbf9452e6adaf22f23cf1a0a08193e76a1cc1f85e1c86e3f41e4c073fc8bd1e83189edd21192bd68ce5acd6b63312728937d2389646b056c8d4f727eadf5d24a1cfdba9712dfb1f317f76c1702014f6cdaaa52f28f2b5f75cce155c654f8d8953d3b78add39f4ebe0406412e78021c7af7ac0cac89a33c3afc60ebe13b8d1c8611fbe2b180ac7e217dad0d51aa67020b629f07760a8f6afd36017f06b6c7baac89ca3295c0ea1b334901f988b1b825032abd4dc904237afb3e286a2095b0cbd481c2b67b666f391558725601f9639453031d88ecd11f7ba677522bbd756de7b55050e389cd25092c921df0bcea872a9c21ebe6df5fe092a4ba909005d079438e13b93d5e912ca22cf90a99ffcabbf98da8db160f29b62119342f47c8d7c0eac5a9abe457336ff64d58106ef4e1d56799c4e5492cfb276428ca60f89ef87059d976b7f9adf3d341daecba1a2f5275555a29a41db91c20a9036bf9658e73b2dcd57b300a0f4401b21a85af07802738afe7663d24c0757ec820607987b46c971afa8a69053ce9d68856f68f17f8c70451ad352a6102d47a94fb8333e4d59fbc6d8c3227544f0495e0a0326f67559b6a3a7eacdc6d078903ddebb498953a4538bf28d807b46fa15579ee62496b2257af8d4e35fa0c364b4c527641fe00aaadfbcf20fb2b20c898bea0c9f9f49572e79571e16eb13b43e6002cacc8b629f4e1a5a6936ca769f900bb09d9613a2e8cdc913812c27fa6b7b4fd9c9732144632d6c04cbb5a0b1dd332f54648e9fd5e4bd1886fc0cd8777e3a2a1bb7e6cb2759a46ff9500881b58d2814c9d57a2927d416f3b7b93211a87703928c05404d16e3a1e2795acdc124062b2fae5d3ae42746f4f5d9e872dc73f9820c74407a92a483f4565ddc1cd51007981c2d68504ae2376f55c392e04939e8fcbd0eb1898196d2a4e79aeeed3c243327de8bb0c169c9322ab00ab74c6c4aa1c6b632108de8e9b123426967679855127a2b625e7cf826dd102b9d9a3e8ffa7f41e9c16b5a486fa17a922774f8930f31ace4ddb8a847b21a8c2ef06521d9febf2534e55b210eea270899fb4970e34de39c31864ed3b2ec2712b4fdba506bec0123fd3b6d7bc300d8eaae20730a1580ee35e2a64d64585664c8cbe7afdefaa047cb27e6f5ee7ea4dce7a0218dc669cf20d3cb19f2ae2d13c9998cc745991559e3f9407bddd18e20bd7faedcc1e50a5eb5e30f9facd7aac358858d4e27494972546d85b92d39f3a493bcda28eb87a7f559dfec77e681fa0ab50d4214b5d428236011342c6c0a8b0abe8d0549209d1410691a9435f49fa7edb3344ab2fc87f36b8c8603b5656faaf5aaddc2e2244f1920d00ca0362be28b334c3446115befe81afb6f226659a70bb17af7a06e703bd79bfd1a2186644f13aad47300da47e3581bc514c88b64e00717aed6675c4c6e05db5b981996417aab3439a1b5732ede97f4e70371af0fd6f8ab8f215e6f9aec0999d5a8ae2615bd92c7916e93b1412a4e1b167c375d4273589f90148ee1fc1bc444ab420dce510d4d8de24f0f9ee7029d3de33801a139638d2235437d57408032f25ba799fae75d69e05d84fc9d02b10e548e6b787f1d63a8f6c38a9b4b92ab5beac67af91765393ba55772c53b96c67be069de739fbc0b8548e70f8adfb407461416358f11ebe55c690630e077ca056d9398029fd7d2f2575668b2610c1e6877a767a633483c8ec00c59841ed205e37af819a9d2e25bdbbc451b029d9f4a3c7cef732b2524a61a0242d82d7f8825376122cfe7c8429b50c34f1eda78aedbd4e83df30711253bd1d125ad592ab0e41b4ec1b99ab9302ff871077ce45ef72897ffc8d95ac66565be30a971184941869c39a5b1142fc3ffef3f4d6d10927c042afa4a7809f441ea8efb93a4ba6e5367f56a98508d2506d909278aa5d779513ab9a253af4cd8afd0bee323fc6221b72e1c84e8e1bd78073e0186db672663742fe08d40f74d700f85ae5c33d8c533970947d721592d96a639ae06256327874ac2077e8a56677ebcc861db51fdb148d900eed18bbd0590036eddefc782bdf5b64f7e6eece2be607ff61e60937cf481030869cf4b3e667e788b4cfc39a56bea9920f36e8bda712ef67ee785b6efed0dc4d7e59ce8861114f8ed301d2d3242fe324ddc1c004", "6aac536aac6a5151", 0, 409973093, "1e4fc4a8483205f3ab3d0f9c811fcf571ef06285256b203ef57c75f7b3301ab6"], - ["9134011903c0189a01b2b171fc6ece4f7b5f5b3fe5cda191eab8c13e9782308f81d3d7f2390200000004656a6300b6959da84c7d85d4365941b9361453fba856c69a2ee552114696f73beedf0c403cca2e710000000004526352519d1660a287c72ff8d1df255b34f8d59f944e61214279cdb5c005323c3d52c45dde1e448e0200000003635252331ad14301d9e785010000000004006365000000000002c0e3bd0400000000000000000000000010c299e5120ce38d4a65b9c4006cbfc48611670e2fe8f4a1894c573c01dd692d2c189c42169c7e79d49415da29d0a0df2e193d19bc75ef2fe4ca9bbc49767992454a2a305742b5d0e56a25578a9da47ba83d839b8658c54fa7394b0623649a0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000286d1447e46da2f127868373db6182be7e11546295564995f65f28ccb0f7b86c124c1a8cc0a0ecd675af9ffe4d2189fc52652176b8ea430193e369490a7a7c5fefec3a9d4076590e209cffcbfe2cc616f6bca2098a51e81cf82335fedebed83c5a46b513ad7442832f4ccb2b54d8aaceb2488a679f69cb308fd0a7bb54862c6103073cc674dedbcf6b8a6aac7ac3981e438be8133e7f6cb428b013a3d66a6aeeea03155d6aa1b0eb1cdeec355a9addf54b5bd9f5976d6434ede8ae8dec492787fc830b026ee19618f6d6d4d274f3e69b31964dde569a438595655ef589fcbdf344a558f5bcb7c803202eaa7ca0a6997f9bd84711985f428c5a060e1299bbe38ec2c62e0306ee1e9ab0fafbbad70414ece5b4d7a23562d5d99ef0d19cb44ad1003ee4487b0207660bf77b3706beea950a68d7fd6ae16419eb931f7b26b2e630e8378d0622bb022c43f363023c7906c0badd6e9c10c4c11a40c2fee9fa8e1f22fab6db600b6c6002102665882165183c231a7dfe6ff98b4561f40eba5f93e34eb14b476b0b965d1703163831ef0a353fe547afabf8d535763f926623a85a20e681b081af5c86f6573b868a5af5ca128a676098029e390658f565396ef2446d5fb7f06f43735bd601b864c0b96391df203e3bb09ff88caed5ada8e0313bf53c8684f559c96d4a5f365dee522aaf21049fbb19e843f82e7831bb99995fde755c5f65e8100893ae60f3ca26af011fdd16e90bf54ddc54072af5ccaec0573a7bd03c0d7a16ce3fe638495a41ab2f4d85b75a0fab6b8e899ab62dd447f1717ff365b0b5cf457a63f0b1111fbd3f22d7bdfdd78cdba1d43ee4fe8f7a65c1105d7bab1ced021089c38d59e5ccf706ed413bfff4feed9e6b798368590f4b0dbba0ac5bb6e2b68e6adfa88538a0bf51ac405dddd549674eb6ffe25ee530e68b522a3e753c790deb02c20b253dc755f181bee448baae473517dd2d33b53b4e5f79271cb51eac521b90b5197fab2fefe6a849439dc186de507c10010e34eb0940d800f74bcd708e787d3528d8f6f4efb2797f652115ef6ccb61dac838f595ba13712f36ea417e17c45ca3132b9b7f98660a91953bad202b1cc08bcd2b4f60c1bfeaf5f95bdd28fb25858a280b6f871c85dba766067e669ec0fe62bfeb482dc773642d7a463755043037b6cb23b8641dca2ce6a582baa149fed33017de2cca179692ef58a50fc0aa06ace6e2553739b23dae9bbb52fb806939534e7883861033432221d57dd3c2c2bdf73859ddd108a414a9f7bfac3adc7a5b75f023b9fd9a6751657b45cff38ee9efd16ab9a6a8a5c36fc4c2e158231ecfa640f220e472d118c490dc7c415fd2005f342f974f98a6e6bcb1cf7985ce8766e9897aa9cde6171bcc18c7fa318de10a01deddb1bb8bc9b2810f6ca5e2ea6dc7ef9f9fea7ff57c6196fa0c5e1908110f644253751e4bf5b552daff0e25ea34006f97b1f40531483b2438df93343f3270aca6df073810995579bf257a659212d7f403046c49dde902ade58b1558050d546e649d65a66367c865faff3d8ae1f85d815fb84ffc10fb2fe855a0a8b27590df47eca96abb6a38f0efe648dfdaa5410d1097bd380a7531afd31c261944f076f3f59ad8d9db9e9b6f72492608ca5ed0fa8d2a50392d437f7e75f819a767354272874ac072012e320681b88f70b578102d700a4eab9d1196035688a671c6265d34a8b5f67103ca99cf314ca2edd0cda58ddbcb39bbdcfdbb592e4abef452200b67b4926a8d38009a4ff3ce2639c57d8b6a43e5e254f84dd7f7f405b60fe112f1222b82b615ee56e8201dfe32e3814428f74b51ee66ba068b88af91f5356135def3a94fb6c0af70da3b706177994e78325852094e5f889eab138cb83a08c7ca732c8dabc400a81975bbe7e6cae198ba32bba65375d98430fa46a2d5f15c52c74520e9a71ecccfb7ec86c3b731183bd5ceb4e019784819a8aac91bc67f86f7214ee87b514687524a09fa83d8e33d39d9a9f64448a4e938cfab15dd3ead6b8d61d9e9c5b27e05d2ed60d51eb745cdbf39dbd6dadf614f62c71158632bbfd207fd90520a0458ac3023bdac6293c8ae8811d877439bb75420d7bf8f54eca217e25bba0c159c10b836a8129b2487d906cb822367e48876cbecf5630ccad5b577fedb5f7c9f8f148e9aa21ab82c3bfdf53e1b8ec3e9ead153c214b6b984fe12c0284f1510bb4d35e5b9258579eb26a38a678f0224ae78084369029f18035084895e8d226c19df6e58a08f32062e4feda7fc83720aa9e5fa944008bd3ece0000000000000000f099d703000000001f52cdb18438750f845294cfb3a6038a73ad06c25caf7fe0ed029fde46a98b86266a20269a260ae288c243df42a9ce1d6e46fdde99cbbc9525d122174bec2c549045c59491bc1489ebc229843cc1c751a17c647d16355c486c41cc839151bd70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008e353130176e93a52a298f4bacb25d7213cba568d50ba27517a3d7188734a88a25b3de632ea09c763474cf6c004b089113d40e7fc6391c7cbb8754817d29949a0de4098802b4f5785c77ddd1d5fd5f0dab1488a988d15287db298bee8fde8eb93110740aaf44ece4c350c935fb79c3107cc2c6079b33fb13438171f6ddf78580030048a5ab6f1dfa5ddd92e7cc5bca35465a00d8d3fe07529013c0b31ed8d78d7e032f66495c3388b84d2e6fab58a4b95cd0a1b862179dd36e69f182f1bf7ed51d730b049566d0e4ddb86c8c2280468216428998187fe4d8b025c96e232a8a966bffc39360100040c78da24284036686a8256186d2f1bbefc9c4da98f2f374dfe4f71c032e6c1c17cc8fb0ad3514f375ae672274ebff85e0cd850ccef973a0f41631e7560314fa38a908be611d8d8efe9dea403fb34b76b4594dbd70e2fc2f27313a9d5a250326fbdfddec83d84602ad978a4f5fa11f088d4c0acce623404ef01d6e01f78b59022b991efb20d315d3a99efefa1ca2652bb43f3e603fc86882633f676890446fdc031e325d67689d96a31dabc9f6e54892ca74a6fd96c4035f164d010346d4662add898268b14e9a7f63214a75908db63b5ec85886a67acca4308d5a8b3863db3e31d1b64c2ba2f2075152757875709da47296d4c5439ac2b53e12cbbc019dffec009348f45f2ece5a082ae0e287f50e5f3b0df6c1a0d6db57412b7fde9c743a0e983a0a26e5fd9222c53672e661fbf82ff50623af30d2380bd144aa77d374d92508f466bdcb227897dd958d2dea35257f7a179bdc9201e067e2bf3968e645ec7c27cbd4c82c5a74841cdd994d8df52816e645dad97392eebe539596053c491aba1b6222b455034f39799455b5daf278b5b6487cfdd2f3628983cd075f9313f3646cf075b93562b4d99bbbfea6d2376fce029b5ba7f6d59a240bcbc141693b0798d611e83bd40f28e07024529bacfe0a8276942c76f9e9cd36bbd2da72f6336a739182baed4af72d7eda144af8d4c600e51c5d5335be77cbddc6e7f5cdc9bdf02c415c02d79618d187b02cd8065e8a5c783502f14c6be87caefacdcf27cba866f5851dc29d882cae4197c8ea1a83395399d670e87171438fa365cb62ba0bfcf07a078374179c5d64ce43e8a0bc6d9fe970caf2c6b872548da6ae18c8ff25710c7a8421ef13b33a86a721e1ba65bf6634f71e8095e78e09f3a14cd64b4bf7ae4d8d49d92d3c4e6f8f1316f9baf3282372d661866c95fa4213e241550329e75f0a4de648b4863af63c27994a29099e848c0ff99b31f2f7a3158f53f2276eb2854cc8a7cc92752c5a3d85a73b6320d4844b5039e6a11297115098c9bf9ac626b0fc16d92e2c00bdf4a1173b870e73e5b030b3aa602f32f54f2107093af7d9e093a3f364ca36323ac1f2bd1a44f504f88e26da497a769a90efa05067cfba448bb0608c95e40b486254546d112c5fec14efb5660bb8dea4001f3b8c3598b328491a430ec4573aaf613b4b1a3379ec69bdf19dd959e2d96793ef74d2b66ffcffb92ea270a6317c7b4f4a2f576fc039274177ad63fb93034c82da13ce576f8e64322292c94438a5e6dd33009e0283780b94a957cf7f4ec1c9c3365ff5d092489c43eb8a1bec2ee460c9dc8366c881e79c07f44efd1ff65993216f2509e10d4cb52ef06ad46fb6110595b0146cad630f39021aa53f673e1c70806763db39a248783a4b106d4165b8aca44ded8f7e82f73d3ef1b587e6ea5c719b43e88171f4491fde8df72a4d973e35e073119bdd4af5ea32fcc6c26e0af4d4e49d0af07c3556fb87b665c3b19665e49d83e43db56d2a4bd53297edc1b400b73c3627f0e9aef64fc1d28a60b38305f46f7fc18a9c79a7da8f19f1423ef170861092ad6e087ad3cc11249ecc530708b65d9f8bd7c517b4665e716ba3ba65fee60394856b64c96a53cc83ca7245e07aff60f15ae78fa9b203a8adb0ac1aef947686ab24e7da0b59d9fb822e46db7b6ffcb4169bd1ad19f5049bffcfc960e8521a609407f17b44a927be1e1aaede285299661a533199bbb9f5cdf496eef62f5dfa061aabb4d1943c9568b83c6f5a9b12aa2efe96e337ee83d4d77c7f62c12453eac2140ee84817938f7568874a684f047e09ada1f1f4aab6de6ec2f5f39613b5aa3f2fd4c3de9c74117bac428711cc32a35b27cb94c16cafa2249d5c6b702ba5f4c867259652a0d79ca904ccad9d9b0b4ab7c3668624dfdc71097b6a7bbaf672cb0a4211b0cabf076a5dcf5390dd83714cf9226190c9c4f11248f5a17cf94416d838afd502bb3256b96f4ce4f53aa7f624170b60a3fb3155183c3b2d7072a9f1c3acbc99fe0875705cc4acca0038c86273d955b3ee5fdedba9912d48b7016a8b54ddccc8b5dfc84e0871ffba52b6e85afeb2db6f23de1233e2839b4d91596705", "6a536a5151", 1, -1274031908, "b1a0d30de855fcfb63521412cc7499e6369b742df4c01d5eec373585310c9cb2"], - ["ee72f43701869dad62bc7929756942d6a0b3752235d1e8b608b445e790c0fd74849311457f0000000003ac526affffffff011d211203000000000060a65cbd030000000000000000c788fe0300000000734b81014e2cff9f9215dfee0f6e018c95eaea12f79e28fff9ea3b4544475627b762e0d700afbaab12ba2a04ea24bb4d89c58620ca7945d66129ca41c91537ef2d198d2248419856d4d7f94914b7d90052629197c6ac438f52b5d4966e77c4f6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004f3e5124de0df262976e9ce211e2e8b73e9b66c9b9998d9cb0694938582cdc770500e9c7159e809b0059c02ee570cd87def60db7446744b4e52ce0ac1b4b713db81db5612c871e758deae3b21f4e867994977c64320ba0a40a6ce4df5d645ad195e5b6dd3c2684bc79c76d7b06899532c673acc32020d4cb176d8b9166a41b54031344483eb74a59d261303f536f5ff4b07f96d773cd5969e740a427bf37e4d1680215a4c43eb750be5c84cb4572a60304225b44b9abd7ca2d43e5766bec0b0021770a090b8bf80538cc96d3fa915252d60a01d7fb22b421055a922fb15a77aacec4264bfcc91715b4f2f5263ffcad05c08ffab2163a2d68c38f9c88ed392fdccde3d2031acd0856dc23d820b9d890220d93c4185fe8a0aa22ce3aea013db1ece47aa1160316248a017af82ca281c6ab82bf46edd5483cf54c77a342b5c14487cd761abb53020866e4fa23ab0901e37d0fef025921dd493629d019768ca107e913e96366d16e032465b72217fdd64fea1c49284d7606a2d397a406389e724a52c6a765971e4998032760ff0a894bcfc4b7b33614323278e9b3498c507040d45c0618e508f027a15af2b41e2b5e43047cb65c4cb9973212903a0fa7b9853a0b6d00dcc12e2a856d7c8abf99ede47c06fae93b76d068d6b97b1b00989f5cdc8d58285eb4f5ae93377d33e6cd664a62418603ffce1c3a521b371d26352f49b2ccdfa9becaa425086ca69f5698343e18139b038022294704cad18d9aed4a2c3d0a2265bac9ca50f68b208f3b98d8013b30f6bbfe72e57991c50c06a7e606606ecb708bd064841d1929a4925c89e2ca61d82ab01fac6f3bde69e30569a50432654b8ef337853d98343356472497858a66c0cfe4080a3394ff61a5206bec298850c82d2cb7af9811185425b3b2a9f2acae4b334f57803444bf5d6e7263016075ee35e45277e821c58f46f4df38d2f2bb73e1b94040f51ca7fa2768e2c67444012c2965792d1c98c30da98158c344c1fcee459cfe8a719efb689a702944626a9280b162a8b819c348c59e7e3cb11fcf916b643b8ba24bb98ff8d63fae44bafb79947dab630e909fbb515627802493aa6d8e4bcb0406e075cb3210607f1ba7857b844a8455102cb99e72b547b6bb42b24b0da7a712c32a60939e95c0806370041d149a04d0ba183bcbfa64e2b7d97b75f808cb66be72d79c216a90b410016e98ae79cf1e35bbdd0a856d6463e193a24c85dbc689d3f7302fda214ae6de41662a946e69f8a9a912de6b9bb74003461858b4e361a234717faa5f32afb5ceeda9e58db003eda8f4f0a56440644761dd5f3844ad72958c5285f2c39db883b8461327da9c4038600c739768bf8e199d4d38a59f117d41fd86ed58c4044bfdc67b4172fafa081f9d41cd3b825bde11259ae7bb8b2bb6966577638a4a52e84ff2445c95accfcd5032f656016062750ea3334b49f198c82e58954e287b775ce9d6679828482d504370748558f5a5f9a6e6ce4367651929d6ffcc27b4c65329fab594ac86043f0a098606d6e97e987e18be21b0e62c885b52c3326405ffe13e0a9aa9787e60ec29f700489b5b737b267f2680c3454d54c21268429340f18acb34461c51b93987f1fd8d1d3701f0a4aa71a8fa0200efe6557f6e929907cf07ee26e3367de8b84b76dec633c993b24ef778efc10cd15eea2d5b845a4565f09954762b88ad9c348e071f600d6f1c600d1a216cd31f31b7caec2c7d33802344001c02e81eefa00d5405eb3097972de10bd2d304cc94b852cdada599c6f6a010656eea71c39a40d007394104ca1f2fe0335230e388d33b35c340f6b909658c61a179e12361f1ad117bac16bc774c244123e0b84f271d4a1eafb61e5050b7a3111805c7bfc3cd456354e1fb0c2b346e26aa574bd55be41ec7b9edb87cca0124715bc3378cd2d6452bf91f3e129f8ed73e6b01d7dff203f908d5bb37171e9f3d00a1ee0d8b456d4e874ab5582b23788f01986da72cfa2475db229a08de3fd80f3dbcf2a10aacc29d01839d0143c083c913085cfd9bda025aac44993262fde1bd31102d8704935775b5b3ff3e31da5ed8f37c14fa81792d04a6c9f7929c38e8bbfb5bf1e4f056d253b8dda31a2ea085d311999a72b95c54dbb552f4f41f07e004833ee12f393e2422ce30aed48be2acf151f30675b7f7764cc2d06576d664d453a6b3845278be115d5cfd0feea2ffaecd6ed666d7d4ab4fbec4feea4c54b13e21de103df0997ac5bcaa2ac3ab11d6085e1f4739a1da28be1a449acbfa40bb2748750ab7939de93d15880400000000000000000000000095f519cbf2ace227870531e8022195ad938ea3b281291d58d7948684025dcb2ff15e665617f1b7e502be48832b96ca03471a988e0c633ef3b96954465e9a0848bb21fc602fd403bbed996b22b9a75440023e5a89a23264fb4b72484f7a89ce73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f1e5bd6c21b7307d9c6c9847d4fe0bd58dc659a7d6ac55183cb59302a1bde80e2a8cfb28794502c06585cc467070006b84fee04c3a80b41f438898974139b50a169fcdf5a20b76ce1931dac735cf72121cc090df4d3bc707af6f7f90fe289d4d84e325bc660457b5078cf500aedd982acfb03118f5e44ca4a64c0c8fd9cc59f030f11bb2b724d512aaedeb927947506070722bc8daf03f72577673de2215e706102065a9d6dff15e159f7b4220b808a17f8f8035496fbf0396153b88951f78a295a0a0618a637a9406b92486e30ece1929bb0385073a12af55e5b838ffce9f0e63fc4954305e063fc062cef1b0156e5797f66a5929af3f418232e86961fdc3e604b2d0316f67e2e63c171b7cd076bcb752994debbb7c7452f5617339950d3c74a1ce48a021798925c63b4a29db97f41d90ef44a5b51ac1c59d99b81fd5789004ce0cdbe1a03169a421f57d3b7d9dac5ee3c5ceeb9c12aac4d8315847a5275e4aac8141105d90309454c6dda5787d54a735334163d43b9503d8899fcca26f806a477cdf5851ef50302161fd59e6ea3bb63da25ade3feaad50f55cfe02a24c85ee91e15e52bbd196221e6994057bd2b4942d31334da29252efddee065d4f42c3ff3ce86c1292d984f66082e9376f73076457748eb308291ba4cce21a1bb2425ce3d134b1f0e2fad249f31a1bb278b170f61dd87fd7d8e642903df180eb14dacb6234baf01c65b04b9b5c79055c5f3b78880463777295d3fd9aabb9f21114fdaf290fb0ae206e510178d0cabe93139939627033111a8f1542640f55984082d4ac806d3a5818f5bd75699bfd93d52031a56b323bb3bb6a8127ea91a013204bee39a73fed0dcc89a9d7396f32dd1576dbfa4413ac347058caff5ee9dd2a11d364eb9fa45f53e37119bc8a258a2465cee828d3f85feb2509d36396da7d8b4b42d31db46ee09d3909fd8641e19de878fc5ff60463bad1c058d7d3c7195770f93db79975f72521a698592786929c4c16f115c3c0d1a61135e967543aee79fd6fb986af79a957292a58424da8499a785a5fd6b0a469333a432bd7aa4ef27328c77059bbde9739d76206bf9ddb55cb4d03f82b3c7a264a209be1e59a35c7cc72a304862423912b3afef47c92fd7cfc5bcecd49c46256e7995d43fa976377436106ab7c23c1fc22bd2fb939f4e79af8c1fe51ad372247224bff441c1b52a33b8711c172d66383e8db38927dffbc0d9377e23e5046e7c8df58cf12257981f785b5fb58b59c0ee180487b99d7c7568438f4d79b0e886adcea74942bec8e2017a937af727741431b53e9afcb734d671f10820e20adc412148f6db6a312d5ffe85421f23d3f99f95548b46ab10b35c1ff8260a73385d7b3f3776f4e88907bd3f0deba71ff05101ae95ac821f519900a787f7db4e761af45213750b6cb267d56d0006a8c70de7eff14daa611ac7ee25136ae80b6c5cd38b4520b24a668a0c561102c8dfd63a80b5b27f319f1633fde28331efef22851b1a1936d82eefa6217f1eae154889b44d4ac3bce338937359fa245d34097826f4dc0e93bf0586953cb3cbc86be5d44b88a246e957cf5d72ac667d028c3847b7543deb1772e133c975e6843ad87e5b57b7f52550bf379c4a5f352aac773edd5cebcce04efdb649b20ad5ffbb881e63e6d1e0ccfbe95f25b763f522265e84058bc94256ec0442dfdeb6da66c834e1c3dd51c9acdc248dac15d8c4f244edd74454ead606b3a3019ad3e83892e496f9131e00f7f9fdeda2eb64758f55930f8d03387e24bfd2620b1520d90ed83bd2ba0467dbaf7e4d01e54cac606a0fd6d948f688c86ab5d1b017f71bbd91f89527490dfa84a30b575e3fdaf27dd43757bfa848d58c533b3b2e697afcf80ae48e339a657425b9f3e1f3f5153eb25ff4606571bfd3dbbeeda22571e433612a5ceeb306fedd3fa44e1f2cb26add2db30ad43d55626a2229346dfade40ec27c23f7c3c2c595c81d3fc3e1acb41d1b2dcf7769d918f0cde09e4a426455dce34dff90f766a182549d1be2fdd95b05561f31c025da9cb9bafc63215aed3ab17ddc488f69242a11d2968220b6d30c81d40691aaac4299b301050a3d618e7c10f340eceef1532a73f95502a82670f4bdf85c30538d4ced54fa9c7da727fec1c4464b1c8a7468e24e6b454f76df781eae792e962ac3550341a9f8e34503d5463a3d05b518f59bf6de5ced6635ef39c893a387fa62cee83ae38988ab3e237a845cf4075492de25ac5e202cef3abf431773739baa94f6ae8dd1fc4c3b4c4b4c79d8d4dea691f000000000000000041828e01000000002bd214489274da3f13c265322addcd4e88c71b71f0d6faafe2e7fa408e7b46f4cb142e8e53846aa592c542f7bd698e3f302fcc3efa0d3b8fadcad9c109c9335dc26fef5b068f7d9380ede962e2ff0867c0d44c6d53aa3abf740b153fb4410dba0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076b5d3b9c0c894e1582abf1b9ce32616be0a15cd7faa4ce0675cbe3d6434f706997bb9ce837b8659691f75a3a49236849323c1f4b859de10a6893da57a408f93b94bba308edc9e17ab5c0e1624c91ded727f82c7ffa1fa3c3dd504a2b59689e97097b542d3490e22b11ea9c18bbe66544102c37d043cd9748eb595d9a2347afb0202eb49f56968f98288511ad25dfb96245f2ca8979f61511cb4993e8ddf02f5600311b1de98013866b43c1372c51cb904038b3be7f53f0edd691f913469e45d948e0a06cc1f8d0508194448a4d28359243fecfaf3a400658a4df8e0c83aedda746834b2e7d308b5bace2bf63ab1d109e184c9e4af4bb70ed54e3232f5fc64ff20160f030f5c9f75b87570f6546fd1d7f47b0d86498fd68b4b949b0386ddfc16873cda41032c779fcf1c04859fe7fa524c54c0e49b1dc170ffb1e0528724defe01fd844eb903180ac6d3af500da67c786f7ff7e7ff934c708818fbb2da6c30d1d9f585a283da031ccc97c61e7394a4d0b679f9a439e49d618a1952bb7c658f63fb230e27ba6a1f022104bb0da324ebc9e672c3262e2846c266dfb27a06600ddad4c2d262adcbc6acda45f8a7d360c7f631ff6af777e66db073d910b9e3d8ed137e5933299508af1adb6c27aa671375ed63d50a6b9af9fe52c243c560713f5734bd94ea48191ee3eefe3020cb1fd6c32579bc18282284a732592da21494b451fdbeedc9700431d56050a9d8df7a07520d19ff16230f3c177b5fcac7bc22c6bbc12f87c58b9ff2ed2d2eb836c2b56b49f6acc986a011aef8637d5690142bbd903b5de1fbf5d45f2ffee28fc9348f7fc34a1c10deef2e7666e8651d707d924fba1f3fb4b68fa3c11bec35e9eb88b2919f85a0eedbb019047f8fecacd3c1471971c100fe69ea655d650c12f5cec57de2c1900c35d595099d7fc5c91f9b6bc69d23b902b5371d3c944ad95bd9d0f0c6143f52a120f78c297a44d7524d91adcd8d130bfdb49579184165adaaab626e9cb4367c6ba7c19c5e44398ab33ab08ccccbe10553d958054d6a6a55be5b9c7a7da722e9b6528d16dcf32fdb3b2e01df1d9bd75daa0cf3d8d74c33f2367e468d19ad21af95160b51d4e9547748d6268694b9b996aabc3a193b4e8bfc02eaae75877e4551297a0054d2b51db2c6000ec173707f9cf092d154c1118f8b6b7d6e32b6427f29de1847ba833e346b11680532308985ef2f2732bfd0be6e4eca844afa2ac66ac0c1852425c4888a687883279e6de08a40a593532a3b786398a1aae36961971b9693ced5c83487f02630c9bb5bcd8b4ea499e72dd6e8787175a179738ba4ba9bb1e65848139121f626662936cafbbd2619994d66734937610d8f85e92a84a654313bcb2de52649a61a8cc8677f11f0f3886e5e111d250f0d9f1cbaf11061b6b0a8cbf2a5b02adf04bf52e540c1bae4d0c00f7ebb7b2d67f23c572db6c80c71931fbaf9c71da3a17235c69d4d37eb8ad848d992887ee953650d8f4783bb72b34582859b9b5142dcf26fc31cfe5fdc7edec6b9010a24c23cc9069776983f9684de816d952dd2198044afe860bc4a888502b38b13f18217a7cc964c8de353a713c843fd92d70ec99617a81f1c04d9d92152539cc1d27a285b4156e09177f118aeb66a3b700ac8f8dea5514051ca7475d959d570cebd5496fc2a9157e4a6f7db7e27dc1b9b33355fd03c797a866124e5200f525ca2aef086497a7bd66f6032a831ac7b1843be4a4eb75d443b4203fff5f5bda90d20e59aed2a2aca6830d8ac2ff3b5fdbd4e75578f35a8162cd05b86031aea9a70a64e71c0e6612791ceb067b92ed2e5187d97be08e6a7430f51ccc6e77f3ba922d364c348caf348f35bb927097f4da65c21d505ccd9713b5284701fe2c6f7d3d7aa6947a49feacf2c3d89f3afbc4dae84ac32d9906e022432fdd576a8474446a9368b4a806994d802ec1728d720715f8f8996c248d8017f24d88336bae35a16aedc14bbeb4f36755382293b61bf3712f4ad895210d83aea747637a65d25c936531ffcce0b532a617aa5e838354291fbafc3753b11a616630854dc8a00da162ea46108d0e9fe37db346f0b074af58f03be105a91cf61678d5bba729925f0f5a4800287495c6895cb8f52da9825f704a180fa438790fe1e31fcc5c9625043af91de2d1b63fb1beca5ee8c730788df6b2df8128ed0705d95bea7f6878ded4a10e461de0cc05d74e5683115bc428a54e38fc01d4813efd24ae098b965f0dab3f36e8f12a217cf44fc15e797b88e8cbfc9e54d6804a45cd8b5656783def1eed1a16078382f3706e57d0bae8a44276c3e2a96a7408706e05295f6763394223eb8e83071a474392c37f53ae9f4917aaeda6cd4230d2bd81fa15a2c131c5d5a8415307e1a69a741ed52303b6bb2d0627cd4e2214fafd43e18010689d403", "", 0, 1267452611, "76fed4cb3a5882a700b7b1a5947e7c278d14a1efb3901a539c6e07b08bbbb450"], - ["030000807082c403021816e0d96f2fe629381fa7ea761bbf35940d7b5ad2d53bfacbabe40edb419c3f00000000007b2adbfe2de64277178161ec18c91fdec1573582d857cc95b43e0bfded11c5b90ea920cc030000000353516affffffff0453d2860300000000060065655251005ef278050000000001655b09ba050000000001535d6a5d04000000000163c4ce597b000000000200000000000000009ccfeb030000000089a49e10ba5ae0ce2fbecc92b5c0f65b98536d20e7922845c1c47534eeceadb09eaacc77d5da5ff6ba1bc4cd148b60163abdfc71be913922ac0bae391262fde2ebf2078f6ef11eb2a1698716f9fe7287d5bb84e6ca2e3346e48d5b4c20a5e47700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bd096f1a6d0adc79a6a6932e1e34d0c8c16d49337a5413ff994302bd72a1b9a78576af28540254770e369af49496b86b0973137f20931f5236e7415ba9cf66bf148debffb3f758abbf4354ecda79308e744cf490c1717eee84a1b436c1fe6202faad7919a4f1faf43daf8f2ad69764c3f2e5c3c5c92a98d407f14af96d6f479e0309e28e79b7bf03b1d75200a6b74609a955a97b418a28ac8fd600d267103e607a031447031c034f633383f3096828bbb53b525964b4e2e21cb1f49098e99f19b7d10a02529f86a5c41b21361ff743202daf74cafd9e0e508a294b027c2f8272a733303de4cefd919e1c32299bcae9ed2ccca991f1feaddad73cce433eaf4c4b98aa1a03136b90c65add0794a8d179518c76198882bfb8f9c8cbcfd8353a42dac919bd97020da5b9711a3613fb1419c317f1530f6d3c54f120db7276c7769c2f2dec7926b2030daa0dc7eea204246e9cefee5017ca93348363f11f9e080b67961b9aff79e40d0212f7ace0dd862dc8ec645f7a45190d549025a97e9f720e7981242fe1962bb648022ddbe42b016a60f9771506b831e688f4236a2e3b238d39fbfca588c30e636d3481c6a06a8e782eaf188de5a3677572436eef0f19c7057bd62f285a7480e5c56b24a8c1cc02d5739bfd20417b93d218c72c4ee1072ea39c3f8cf5e5f9527761f557abb3236da87028a1d55e3d7ebf53fdde705241d751eab79fa546919b51b99d9d2c79253fd1ca534c5f058a752ed620943863f086b3a3a42ef777d243edefcc20c0927e6183f1b98fcd88656fbc028d52d5422a31337efaf628ba0f629d4783174007d9213c30ee595addcb87a831d6c975cba17e5bde8d1e57320d9f3087a3f692a97839dd182b867111898d276dd1c090dac4f5facaa9b2063593548cc3ef3d542563b14207be0f3ca1d48e2cf9d7e5918e6caa2b1a67476afba6664efff3280c2a53c4667b386bd8651004e3d91f33f0fa9fd7d373917a1b8cf037cee579cfecfa7207d6766f626bb182208055939f9d0990a957ee5d3364eac9b72bef6707e4bee532d3b644d02da900096fb81a69a01085043894b8ba5e2441c2718d791f5d6d5de7f2bcd982931b549a66bfe8754ddb86a95b585e59f8e6a8841ae4637bafbaa1f6bc582e38be9abcdc70edb703a4e580c97a2f341e7579381de5938d2f86291623cab0402e27e899a190657d4bfc947004d9a8e2cb4defe5ced4ba7fadcb1d058fc4d14e04b1e4087e1b3f631577e7578964fd28d035c3544d58762f50a427ee3cd9a6fd65fdac95cf816cf3d80821459df113d0a5083e3dee3bde23c744fc769e30172a762d874d0f4c66ef7242a0f041cfa59deba0bcd878f94eb23961d8fe931490500a0d80c025525285a327befc081dd2ff6487a8b4e8b796413cb5f0ed33fe6067cd62ea45873ea128198e6c96dee6f6d4d87dde39481664596c5a638796c27f51a1cccc601cf62e233d6167d63592191dd09b8042cc79e684ac2516b4ac2e2470443cbca5998799b10d81d9dbd8a95f760251afff8f00973a332b3c3aec5cf93bc73adf9b07e829d53db51dad92230ba45ec5244b79d8f754e5e7f1e42c2af9be1c096d211412edd3aac93512c846b27af849c609fa03bccaf93eec73cadc24b8efab1b05dc5ad198d8977457497c496f21c7c142aebf00859ee6ec29c5651e120490ef11fe8164fdef3bede6ff8b3ea7b1b274a9bf293d187a6e66e0b40159fbe5a33862cc11b7e3500f1147a5fef04767cfd60b28465770a18f29519c24809f0f2b1431fb41fdcaf07e5ffd4ac89cc7965d99b180f4492a6ddec3ad153145519fd949f23c17e91feb658c030f1cf6bb604d4e17ca71bd2071612098cc69caff85d12d8cd3f9354028bf23bef104ec7659ea295106cf98f46b0ffaee45ecff26678c81b7bc308e164ea536aec2dc478aa3ae385147bc28b4268a3e76390a5052465f657485bdc897a369557fc8e4ad1df6f5eeecf777b1b47acfcfa0729c03993a70d4f940083aa25c38731e70997fdc7a0fff6bf39466eec83fa01a1c819fad822a67aaab31bf5028e0572b4418b1922c224334c50f224cf32db883092482a914d25981fb660b364080644df47e453abebe4ceb3f3e4a914568a28c8474d42a7be0e1195f854929f041237346c26890ab02eb68a8e64420940921aa2dc0506f181f8190e3e2098fd07a8589abd8340a45e4239914f1d1d96920566f0e29a9c7a4aa428f636545faaf0d4213ced03608261c720cd84662697a1c51e3bcd11c512b7bf37a518bb5f5527d00000000000000001094160000000000b0b656645bfd83d3beb15e7cb0620331f2baa307aa21d48804990c2650586acfb454b7a78341c9380ae6ba5607ef30bc98d2901ca8b946236bdb42d4e296c0b800e68b1350ba81815f106c4d182f4f45b03a7ebd2ce95abef6fe9b86ca7006a60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027a64caf44f1cd2308aef98c33d5a2a3b3707d9c72ccc5dda24d80a1dac2bb3b8998c20ae3e0fdef7c46d4f1e208f19f2ffe9d0f7f2155961b5bcfe22fcf3d92482b48c994f092c790077d1e87043d4e34e194d4fb35634d20d3f19e5c73319a2f79ff8d2bd4b1e8c9142c891d2313e2b6fe202991fd82845004d88936120a1a032dba640020164489b470772656e64db7d4cee7b7003aba3869ce185fd6651b1f03209002b5449db641c60dc636dfa29287819ef6720a3edf393ed78bbcc6720cc80b02a4d40d2550ae76f4a677e2f18b276c3f1c327826206264b063a727321064904f0398f25b96cd470501d0d08a94ba12958b9c8bd885e178a782e22250ba2d35022ba5242ee3981de446c87d461a3cdadac5f9dc7e42051ac3d705c9290211a7a5031ea9037fbe11c44c3df88669c4f8b8d746426e375beb9c9d7ca27cb6041f6c4b03054570b28b10cce3d62e2fed313370dd44d37d848cbc72805483d1b02bcc38ec0223fefc1a277307ba51d5e8089006fba894f8d52614d4b95fad7429739446f67e031609f84594fd097743f43d1d61ec590b6307aaa4070dad25bf2b1866b9e00ad2c9ff2ba31c93f88e7fd4b726a391e476c582a0b7c820c749641dc904a9b3522908a16e1e62713235ae646808a35da87275c53a512a7bbd3bb2c4b91a86dd49d00949eadef70cbb02538b7503411dbec19f48123a9804f42bea494e238f1f9312dac202278a38df879446018041e41f19ad229f1128954e75c96a1251abd97cf156fd9084801b689d5fdc0ace2e03dc0298c83f36ec204ff7a62427f6beded8cb2d0014263145ebcd104be2912bf35d21bffe4b99eab38a16dcceab51125478395007683df647ad01b8869e6d6a8d6f318429012c9a006aee6b06005eb91c7454d2f840ceb85f9196d25dd97eea609eccdd1db64bff7110a6601602591cc43ce2d89b87df36a476d9ebba95ac30c91445d9090ca188650083835269e3f68eec519dca9e30ab4bb63b98e2c2b2d4b59a1659b732969dc24a5d8e15a66f12d00dbcae88ebbcc241f049139784052a2e61099ab4f96d703c9a4799e58364d04a2a0a15d73202fa5f27d30f6099a18518e7e283a33406e00251674a422b62348f4b9ded9b2f9d1b0de1ba272253aad8393d3e4685fe7abdae81b47ca765686b7cbe08297a188595d455d5c6c93d834f3c565aaebf6075923c49a99ab43d16fea4e0aa4409a452e86e1b05ccba2f922eb567bb3394a951587ecad40b46af442e3b94f3df52934d738cd063428a3868707fb86dd6875c29fc3d40ad3e9b7032b118a0feec9d505477d0a6eec93524e2b15c17098a98cf04f8f3d854353ab62bf18960dcc5fb1b8618773d53452fedbd02e2d97ae00013bdcb3265266f946eb5146c4508bfde2a14ed191c3bea8bbbe2821a006a159436e437b38b56cb12f0b95000cfe58885add9ddca511b8dbbfd466c2392f8ea3cca4b67b1c53f502d4b1191059abcc647d63651345793bb19a87fa9d14b95c3e73aedf0eff3c91d036df2c5dd179a408e9571c396c8e1061729fce60357a32c122a85016df4a9d3fd973e321a4ee33dec172b270e5f366fad0d5e707d67b23a47db330f6959816a8830ff0c6f98ed4614b7b5f5b30bfa628549d3dc24b2f4a83cb2f256ac93daa88a161f9df00bdb3bff47e07d647325516533a110b23730ad221ed1bcac444f1248fd48859a675c3664a612c5f60beed7e30f907bdda21beb30f4532e5f1851907656e8652a2b326ebdb6d24ebef8707b397af369596a561a04dd5ee69f9954f9587af4d77e119dd18dc7db2e8a04a075c69a9b3ff47649fd674f6877defc8d1636db8a0502bb626a727ed1e99ca27502795d2742da255b9a8f693e7fc207013652d63acea96894382d28b52159238827e991b2e9cea44922d7ad467bb06222349e45ad18cdfc7ff45d8d552041a6ae920c021062db6d2fdea53e69e382125363a400dfa4b51e11ecd75b3f36f0ce8a81451b1640a243498a586dfc3f319369f93bd183b7a04239c86aaeee87646aedbfd8cb22cba768dc54e092c6de8c13594bf80cdffb90d54a254cc0a038eac1eb9c4171b37ac8044a04fdb38ed36c1b700e36420aea4c02d06ccb031187d9de04ab5cd2044d8c571bbc12aff7c5b41493859bcbc59c063a2f154932568c21b0c58df9a6d95956171cbf131014747dbd0dac69632811464e7cdc1df0b6efdd629b3242c3790643ba19f949a5c55b609a904f57fae2bc981d9b201d12aa267e03a10c1bb2539c7aa8727d802413e51e789897466601c542bd6bf1fd0d8dc3c1ec6ca0e0e17d4c4ece82d6947acc9d43025a39ed75ce8195a1b5c81c37512df47f8e8a65e7433b6690580d2c3fb825c7975dde5b691fa6a8789fdcb99388155849e75764e291d47b27c4120f", "5100", 0, 2131778298, "1a5be4f91685b5f0e042c56b0dd9f546b2780bfd94791aa72251a075b9a0c3d7"], - ["030000807082c403033a5a90b201d30d84294f44390877c3b337b95fe3f715405568dc1266f7c8951702000000016a1b9e4ffb4ab40a5e969f6d68d4f227bdb7bcec27881b06c5002691e71d3749585d39275701000000035163aca9773cbe2ca209fafbf54b391ecb126416e707e9a25969171c837109f68ad66841fdd3df0200000008acac6a5253526553a18d1e7f04955ede020000000000c3a78b04000000000600525351ac65b8895202000000000042cf40030000000004536552ac000000000000000003f5efe70100000000000000000000000093ef374b28a13dd9db81c0ef38b6dc43e204b97c9b6cac17bbaa1eeb100424f7d255e46e8082a85112ca3ebfff8159e672f780354d28405c133fff6cf31fb2306ffc6ae780fbda69aa6b3b9013748ca02471f82f4622a731545c70b25473f06700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e956880e62ea3e4c5127bbdad99ebc6cc92e3439bdfa332baa5c07b50c1e611c27c79eae55f975340952693b32d06d4da61c06776adbde3429d682823701fcc79b6fe046d6aa0f22206742fe038e36e5572cd0fee9ffb9b5795221f25867d6977c8712b29801c79ca08ad2e9acef22162d20ec30a3dc375259fc655cb3a5f3ed0300b0203644ed5e401aff2aa3b1a338803bc228cfc359d1a158186e6458a7a83002084fdc99dc658fbe0004215476aad0ca3ef830837fa4a6e9a66d4d3f22ee157a0a01a9b88eea2b9a653d3c1fa5093a8e247fbc68fd3f5ebe53844ca0648076a95d0ccd2be0dfdc47954e6234e8d99fdff78418e57dee6969885e936afd748db0c902205d0f9c7c5b5d89d40a788c667c670404d4fe4b9f21dc3cb9fdc8ba7ed4f3040311b2473163f9692672f0cf1ff559efc1ce90fbb94593a33716c1406e1bedd4620317fea3359bd1896c2e22a031e3f80005ed9296ce9c7ff1f6379cd783b86eb5f502286899b3562310c7f0587b51d5e76e791c506a72730c9781a966ea24603117ac021cbff7381381b303728eee64c111487bb3ab46a07fefc6a16b906f4b89d49c651eb210768363ef6089cadcf03bc52314ac6b5fcb2065187d13cc515dcd17c9e33de7a98dcd919d846a091e53ab60f24b6f1011006316b1ddd8b1dc55618f44edd4d2c7a134cb7b4d678d8f589f90104d4c22dbe7ca5f72378d21bf02790d9da772ece29e8e0148bed4298fe06578ce6c99ee51c297790025680f3d4c7cdf2e343236ecf67c7b9d5a6a43d1d1130f24fd54ead7fa1cec901efa799ee1eb065969d67ab65c7cc9e4fd410a83c7825d80e2e152edb54fa4159de4d43efc1c3a976b0863d4d71bd1b2618d181a5d12d85198cfdeebdf0849a20c06f40c1bb70a859bc3eb9215d98691b4a775aab49a5fcf178dc48c4b4a6286e093a2184571e55f962c63b5d9635e25986e92b6f885ac77b420aa1fa4361a50fbbb97018b5b77590ceace2cf144c57f3b75ccf4fd61ecf82ec422fcf84061459e957c89d372a95a4a4c85fb07db7e459c2a56844b8535d048bab472f2a4709afa6dd2a4d6b1fbe78ea166643bebd2447c9573394f66ab29133aa5efaee57bb8339280d7ace7221cd65a03bb084ccb6da58ce9dd82bb68e6e837702bdc6b7a4f6b3571ca6224acdb4afe27ad4caf19e461d02ef437aedbb19c1dc7c2a1d93475c4c2261b0dc96ba47a913ac525edc2ed85a0dd9dd4075970e98878a4b18403bfed62f8af201a9fc7f91013909ac514df7fdaa32c351626515b00e0034ce23d31d51198941447c8e0b17fc8479cf416de49044de005558ba404d43792e409cee5b666be68d178a9e03c6f9b8fa5a10e9286b2c1548ce82445ad88d61927e2b0e729c7db1fa27b56f03f0f004669a55903df7cc65b8d16bb38b203e0aec03d3f1a199ee5531bc3e0dd1a261dc6d6c3b74e514754077cc96a9e52dbf06283692fcae24822237eb3ed2e58ee07370c6d8609b4653971943ee6fa54aab7bcc5037eafd2a7a88633e17078e3ecc207f955528fcfd65877cccc321f2dab873d6efe4e9cce75c1046981c31c127ddb22325e2490e0853d74aedca2aab2d77d9ea624f099e5fbbfbbd7f79f090fd82b1b7593bdbfc66cbf5643123e20a272b8f498c698747e675186afc04e858204eaa431b083bbe652ce1bba93d9df3cb91fe35d936335b7a6b80cc48f9f607b3f41ba6bb5c0ffe39f24b2d453d62da1ff197b100c4144c975752eb0c09ff5a2db9d18c0fc2d8031be3c02a8a90ffc765b0cf5071b9bda8f6e346f23fa3a7cf9b08a85a61a449ab9da6dfff4722a794f82673d0d9e28d1924ec9f7c5fd753c85515e263f27dbd1dade1b95c55d3a2a403e3931806e563438c7fccfc997ad2e9f9ef38e4214376095cb74b926d1184025216536f9f4080a37e0eea46419589c9a7a69b4a4e9e135cfccf953280940289307d3ec6f38dccd695eb90ee766e19901c02ea0836610feaa35e03b58d12396dc726c23cdafda892bbb04ab509b48c45ef0f5075d155a2019f312d33896d4b0c8c23f4f135fe300ad1cfa092adc2d314fbbe5eb1bf6430559af3bf509c5c8246be28667761641edb14c952ece8af91d38b5bba123d98affcd94c6e77d2f88e3067c58e4287c08eedb5d8cec0883d2b4e62278fa7dca1c5c52d775a2f10281fc27f213c06129a0b0a13fa9bbf55f01aeefbe31208cbddab62520ee222444f2371731c27b832360c5b041b0d0f4bc173d075e08248a18eacccc6b9634e88130cca33a19b478f405000000000000000000000000a8a28b7587270fd0a00eef1c552cf5f0cd83253c2a61bc5bb244291e75b74ba664a67a1f73d10e4232254589309118bc46196bdb3e1fdbe48fd9354dc84e504f2018f4dd0743aba6b2454db96a59150e4a93b22d8ec62f63db32c5cd9f4fb6630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bd31b4ebaa3617c14337d8d943fa4bed3fc1cc2fdf5049104bf9ace7932333d749bf4e4776b4cf211caec28b014bb296e27d6c310730606e9c74df989336bf35c4fbac691306d8baa576a05fe53d20cce0b2ecd6d5baf15f92864c4bf94ad28483688a9d4f6ddf88f570e36f5b6afb82ce2018b7af220e5d5c0e076412fa8e0223e4580fdac4a1efca1c259a237011834b4563f033aa06a8816607d70d4744800300cbcd6f361ff59cfb3ffefb82e8526effe4352b334be31ac8e1c336e6281f4b0b066bf514401bbbf052424b7babc3a59d438c36ecddffd2ad5bfd40e59d836be53d40e9a831db2694a7408f2cd30f64b39162aa1fe3438f83bfdbad24d7992722022875ed616d09616780704d89c275c795c99ffe64d1223cc2ce23ef0a04bf8768030bdda6dc86d557a7ea38c47fa660bca50d07ccf1de1cd6f7b3719e77ebc14332032870ea59cf2cdbb5ace8209b70f1ff7ecf9836c00a471f22ff11acce53752860032be7cdbac42fa5b0920b6b51d639efb5dbc0a91ffeb059f3379c14d4401711960229f7de7b8eddeea3762321f665060690655d3a5ba65def624f2e412b4e01b137ed2e859204cee3a3580238ec5e366277dcb40a07c2665513c1112c41368e8cd61e3ab4d7eb8171f081d731202fae6b592b0dfdeca52208c84e6d28eda05cfbf78e265db3b006b7328bbb73f67ce124302fe9c281af47dacb1100131982a8e42c9f1046a1a6ffeffd5f1a2aaecc7b57252f051b72e307dce0b3ecb2cf4f616a91f39403b7370916e8fb0f569ed247bec5d1c3816ade1a0f78be3ff21ac1d58a11cf16fece48031812ce67b38024e9c04cf3b1151fd43e06b19228687999709d63eca88583d56ba90f76a2fa78f03e3485c4c3a3d50b2a8c25fb304eb740df2b6422d3ebb86c5e2eef4a350c8d64e8a2f148b6cd333678685c5a2c45be295785b2bd0a4a155eef564bed3ea5470d3dcc8ca09af835ebf0a8eeb8a921e022ed9977083bc8fe7308a760ffe36edac742fb480d3e2560922283eeb5cc198d1ee42d17bf0bfed51b0df1f5d77f1b716f9885bef6cc2fb9795998d3a7c3483214a0563a72ccda862e12e8d4af4ef4f92e36b0c8fb2d3b2ad6ad08e0a7e4e6e3cfaa7ca9ab8cc499e6fd6842a897ff8bd2836d6005b9ee85460a65e94c5bdf8d5ad0620e0c1154fdb320fd7a819db4673676bf3df5ab9dd5cd9f693cc6e49152edd95eca8bd790803b719608236aae36010c392c4a2dccda5be679e5b4f49892ff206f4df08e2c4dcb3ffd22e81d3e11bbed267e589bc1b7150f20433f572c07a3e851a8f714ef26ed908d2ec295938399df33fba8140b75fdb093b7bb933ca2179b8437d779a0ad11b357b6d1f4cc3bb977630fef26bf484b36a3e63d149b47694a3919cb2fd53fd5a2a4584b418dcc0e4ca8a11f0eac64e4cf2583bedf06a732b3cde9f8d37f2ee8e1c6b825d99ff4bbfb07315b3abeda2570135938237f7f949b9e07a793a7b40be291e3510dbe4291bdb287886064ba4f67d445f9f6253f0d6b60fc203407f2177640aa38994bad8a4dea0147769502dd1a306a33a1b2287c7def3688de744708ebee9757e2ca0dcd51523049decaa71cd7f4050d9a13b907e9918cb359aecbb8fedc7dba5db800dfc0591de4e1e83549e0b560248d5daed4bc3bada0b31029dc8fb71c3821cbfc079f92e86b70aac5d885cfd2b455c30a504ca46616c1cfb0f400744995e68e7988f89e687172066320c87b8b7b5d8abfd1922462b8bf98362a2996c1b2e053c7fb367ca17b6aa0709e16edf4e411580be6d1fc34eec7a681d4345d668087d4bbb6f7b133c9c90a441696dbf94db61d0041d99c5c2a7f8f92df4c7f99bb4c38958196e922f71729ac2c97186c14f22ab8149cf4b51d434834f6fc03e63e13f64ff1af42d38257257d272110ad118023bee3f7f165b21ba0e5fcf5d9b6a952892e3756a6f852bdd6c0bc85a01cd9d03b8d6083f5ac65cb617fe46351cee32fec56e6388ae0b880dafae92bb09c39c9bd841fcff1eb6d36bd91249e48f1d076453a362f3e38e7e753736fdc89de7192e871e321db28dbbc3027e804ec9a2122f6a76f93b6915bb7663961bab73d39fc465663a0ea07ba9374e037d9fc2cbc13aa4ad9c5a843f4edaf59fca68339f8bb7c825e717965f5efc906fa2017afb3222d08ec90a39616358c11c64068bc595b15a2f77048d67665bfb68d9f843fb5b2c40e50136fc69997df1a78632e48baea2b7d663c618f20c2ef3d50001498b509bdb74c16d011c6006cc8b801000000000000000000000000593b8ef9b31e13e37a32a3205a30ab99a45a20d6ed6ce3ec2539c7aafa3a6166a692575c61cb7711e2dd2c7142f893fdfd9e608a5ed2d5a35d2238dbf4252cd6a6735870811e9be8e84a5e8cc5c923ca2a4cef7901153d4189fd3800039b961a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0c97ac9df4317c1f384c83668c8afe69b247ed6cd71442ac9609eb849158e864af17b3fdc6ac6dd9eddbf28c970e415adffce48fa32f04f20b0edb936c8082dedc709b55012bd033ff53df789cd19963fc6584947c37926d7b91fed9294707d91042236226e741a745a1514f89fe0debc6d7372d3b63a51850ca348f50f2d2c022f89c9e06c1c85330c48ae62660b264c59fe921377672b53dd0be546043e4608030e20ab8f01df58604927fa26c9e62a662f8d6194c58b75921b41c1e24827be080b01f91bcde1b14640a51eaf4cd2827ccaec57f08ff08c283896d5ebbc76f54bbc38162b9b0d5a49257881a1c973d0dfcab0ad524c662cd658aecdb0ef4a782629020ff992cd0b0f6dcd4df0734823001ec33227cd469535143c0a55a0135eb068fa020ba11b34ad893af77b882f6c9b6a3ead47b228c3e6c687824a13403a5494ff66032594fd33173757d9f49b3af976511d0185624543dcf933df85a12b3b2d434668032903275b760937abd61a13fe21770feda77097bba09afd5f17f69a35e725a84f030260374f96873b5f29ec21ffe21e5610bc9c5722cecf8943528071462da944fd239a1c1ba1a2ac74812707ed2a72b84c6266d39ba1342c502ce7e3d32f97e899143c3ed0eaadc9ba074d52c970c420a63ea358de176a4c1b1da089dc0c9631e28cd93223f623955713d9c347085a0a365aef3fdb3dc129f587c6569ca96dd91ae523ac23b55bff5a54255438ae69a7518644f84106f104a59663deb799fa9de850b136b713a0c93809abc4f98e757e9c108b9c502b38cca51c879df77abc642d76b2aa5ef7ea549d47d41ce270e147ae7aabd45a9f9a0e2dc450ead305eb4b1fd9df145007633df2f8bc86d5d047b15ec258962f1ca6e22c4bfacee6bd8891c7d717bc54535ddb77fee274687c37d69285621cd5d89820523d92df2219734b793f630567083540aeac7ede1c70b73d241100f95c100296c7fc95ed90546dc627a84a69a0394bbb74f98a65178587656797ec51d4c877ffc809a5e665b06c63b5911c266de87c1cc9390afe9f2f541694e609b855ffae2b81f4b7479ae0a55ebb8ad830e53322628058323a5478787882a7c9f7c388e0e22b6590b967ac0ecaf3bfeb1ad67ce9e8f7334ac32534a735ce2489d832bd8ef964a2c8fa40cb2f083990272d629ff11bc13c99417047391d395edb5f6eebe71dbfd2b97ec918ce3cb8eac0cbb3638fbe8dfd5df4585d45b292fc0cef49793914bd54130eb264b542fcafa3b04c35c4a91277660d765e3f4f5e6f7b8b9b5447262e3a53788d4946266313ce01b9f2f4d12e710e12ede1f8fdb317351a198b2c44343bc4f981b4623f851132864df037adb35391eb6222285adf81fa0510135abebad773deaee6faa8028192a41deaf3b67c0beeef040520442d1880bf7f730d2ebf0847d26a81b2956715916f11e1586678097f21bfdf1a876c015447e107cfdd2d32bf6646c2584192175e551b9d1cbde3a29ffa11130365cccba2b07edc7c5e0e091071e9675437e169f756143c0cbd806cf84b994cefd8e6fc37ecdcea016ffdc2c1b154ffbc6a0cef9f5d40135ecbf8fc6fb64cd46b9019f307e92a1e977fd82f37b92cb9583b7fb973fb73591093d4fd913bf8e51d3b4dc8cd3605ca1a9009cf77d51f8213ba4e05c71035631d3b8d66e96bde2a5c05a0b4664a27314e31a10af0767e39ac9cbb2e1ecec3eb67c515940af2089bee255c54806081778012ef8bd6971472a6016e3adc210e67c0f0b18f6a851a4826da3f34b3ac909992acf7157927b79d077af01a4f711753ca4bb6897053f4aa5281fb97ed8f4fa8452eaf933f607c7790ddd2c1dc3aa0b34b3ef9e7639b027aba3f6dbf7fd55c2e0b2572f1785f2f461d1cad5bd8038c5feb488b8f2515f93e4047ac36291ef3e0ef9d9102e0b2d35686e1ea196ba7ef047733bed79e43a40658ac0a3315487280d93c4ad93cfdf9a35d8875fe20f05e9661256b89361237913fab6159f080ae066d71510ec5a7ee018e6c2c2d737d0b2bdf535f558f123ad1cdb7b6102d39621a43380713900254ab0644e290f1b544585c71e76e9ff4f35be037780665d0cf39c9ce5251bc3c5edc4fb344fecaa22d4c5989d9eb3f0ee330e2b36472abbb80ff07565044b585b9cebbf15bb3913237052768ac69ba49e2e6aae572750c502616da2271a3aae648f1ad9e7a5191ac92cf0f62061fd4868061ca8b07e69ce5fb7fb1f8fd933de209690b5b0b3061176f6eac3e33f61a7a8cfe014921ba4ac5c14e8f2c1609fbeb6ded5887ab39be819eab50382b620c945bb9dde2ab2a4daacb4f3fe9156611463b55b2ec35184cecfeebf82e5ba6d91c71cb783fa0ae3693544f86bcb7a05e0402005a154611acdb8a62ed079a264802b11a45cfa42307", "5352516a0000ac00", 2, 1663512578, "eebaac1834cbfe9a9d04e1fa18668689cbfa19076b83da69bd15dfbb8ddb34af"], - ["030000807082c4030306cc09961a659f5ad7d1f98dd3fefaf4f9fa6be469d5630e76d5020c9424625302000000086552516365536353ffffffff81e49e2dadd71ee2b850a2c977b500d5ecc8a9516c0d27f99e47f9cc4bd0356c0300000009655300536352535353ffffffff01b6d65eeb54316eb6c84902b26ce4fa4b2833552d251083c7c49543472032b7000000000500ac515163d825f602032df15b0500000000002ef250010000000005535365acac87b0f501000000000763ac6a0052655300000000000000000200000000000000004f4835010000000060a6f2350ffff72b5ca56e385d1fa72a1050dffb171cdf0f41c2b14c96f7f2e2acd02d0fef3ab3533cc15a5f3f201ddf6f1bc8ecdec77ec9fbb7c106840c44c126f853420b5a2db32b3d7421113d835fdf406cda75f5709ec02493f2852e25c400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fbe6d51f34e49cd338d90c149454537b0a546aea2f72e4bf39f7ed710992a501b3b14fcd16c47d573a0b1799e4d10a47203f1946ca5c0d6059b5d3df5fd2f785b073fad1122b80d11dddc32b9950f9fa172e5b314218ce0244aacfce74bdab0dcef8063b1b0dc0275bee9e36a5d2dcf71326677101335cb80e24ff16b17afb9803110bb8b16f1609b7b0f60971256f3ed125b9d80f9ae688f3e571c09bb641e21903244ab8914be6e9da87ec7fba6c9ddedcf0382109c51652d7dae96cedccc0e4dd0b0085c49296031fb94ef9e3fcf9a9679503c9d9b07ef2f23c7040b60570f5bd234771a4391d9ed6d7f9f11dc90e0be7625a63dbc8c4bdf84bf9f98a04365a71c5030b654c4afc2fce1fce42a5f421e7cdbd39add4afd3d1b34bbe399bd5ae295d8e022f225928681fcb1af6eebcbc9a4b9d4deb6668762549ac06e04933e2d4343f870227981c0de789df8ea0cd1a0f32dc33f4a4312242073c01e6fde1bccfd3510bfb02184659a2262a5ee0ccafdad258019a5509fa1b9d1fbb137593158665dd9b59840207efca93c3faad44078bc792ec8eed70e80d4a6f5786ce70f7c25780b4a6148a95865a7dec1653da95b4bcda2699412187a71a0b1234c4d1b33cccef3db48fda864f5b569c0a9eb154b2a7700b1ef6f4f140591dd741fddd436b14be09d52acd7a6f5ba14f9f9411f131a98081b450cab462b358a15574aa5423ec9505a7d6d8360a89c4c4f9347cc04cfc8c282d463a2b7b9bd7dd5e70a14685519265e5507521b9cb9d093fa4bd05888e9f96f43133c4076f789516b0aad2ae1aa2cb15a39fa664193f061eec3dd8f22eb90f56c152f5cd65c43fbf9ed1602dd367204ecc145b523a98675b6743916b6c8e4db4349ab50f55d85a245c91e8219fcce57ded439085de27a331b094e3ec9d4fa0333b5dbb6235c12d035b169e5d20e97c3b99c7cd88f9695cf1dff26d929327a5561d9733d23f06603028e45b738f1add0592513286a52ab1bae7b4568a52def17e99117833714bd990389544c160c7c12decef4335828142bf77064c6d8f5f9f129241cfd6da60763944b1651aee9907bbde4b4cd8646a11949709c428f621f2b1b0bf3b9112a600ecb7b38b0f2931466917635a2cbe20b6513d0a24229aab4c0c5efd67a3af2b343bc7c655660ea5c50fed04368b9dde84ecb2c7de262ff00caa6070d18c42d707e2e4d22aa5f9b4687a51674c84637ca35aeb8f16b8153cdde36a50f5097f6722b52524038be165619136e5bf42d46e78b51d0eebd37d5ac8ba516a196c00402886d23a88b230703d53d56934db9108bc32312bb2b025daf3a492367a45f0f41f265efcb1b41f02bde2c59ce34e34d8e909310752744a42798ecfc83d0af7f7fabcf99405948af6e0c3f0ec383fde1442d51a1b6d0f302c58b9d170aa1fd783bfed46351df7b2851c7e7393633ddef468b4474fb3ccc9a4d7f59d4fe2f118aeb286a739017d742b1a672d9cf2c76d642af00fa0d0b552d223457479af20e8eb77940b34a5c797b83de64283ab8753a3fedde37f76c33414857e4f761c224bcb8b64877f2a1176fcf58610f3897c990c33003e958ae1813ffde08f12ea9fdd1e5bdd53b5e352d0d48cc05dfaac80d30a76a15fd7ef9f475ba17aa8ae2a6409ae1093b43682bd7fe93021fcf830238eca90b8a96134f34318bc7061dda648403058e36f0d3c06670e50189cf8a8f14a92183f78dba39c9c9c5c66e184b803d9e6753c5965a63af57dec40dbcf169ce47a4ff11763df98d80b483e1096ea679042d45225e99c9a2bf77b51aeb5b3c63190795ffc9ea55d6ae6110e480fb8884b6e5b2c2cba0be6841a4f7dc738b89034b4f53941af0d1a77b87647237329c9fd7cd44dacac26cf783d4c9a0298b06674662ed10544c9966fa66e3ce4e6ac9dd65a08c6475e50221e33c8bd369ff0b107eedb80e5b6d03acfa0036e38b288da6114937d2cb5939efbf31e0ac2ff3cfd490e96c3d0058eb79309ed9d658bfaf9992a403a6d28db0b91143595f9db2eb32208df2253e6b32906e4ea687cd395a3c496acd8ddb979af610b40368a90e3186fa28271d90f374dbdda694391932efe9afea8c03915da26c2fafcedf49dcd30d60944d3491132446788d303268ce3198bd98909fa8e508b725d106868ae3c35499f1e03d8dd5843cc954c0a17f47e3d76bdac50e5db8b614650716ed68a1224ccfceb29923def51194fc9bc61611a7a5c28c2fbb53dae9ba4574a798d32aa441d31df91a3cbea8f489202657f95825e7a73b5040000000000000000000000000b1a98f85780cb5f5091abf8d5f20c601866951d699ccb08ed68493df43647b03b100aed343e6d201feed21d610a8a0af43ed9a2a9675fdbdfe5106fbbc97307d192c4a9e48b89eb93391e80ae3267c52b2f984eb114ad7efa6e3a151f88d1ea000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009be78732071cf04ccc5e65b01b23ede3accd9fd113da3df02cac6e09974055f628a6cc6073ddbf7d505094033e8dfe84fc9ab997e758a95d881df183ddc14d97c8b64a206c9f4d159cd21c2f7ab19f372b8e2799e1d3ab4d61802329daf43be6cdbfbf8e7608bd498e16e201f397dc444442e3488272bb55cbce251e09f6d199022084ec782c69ea1008692fe15c8a4441d6f4e5e7a96214e9d71d6000e59252b402001c281285c472c07b44cdfd434b3c3a49593f7d3b8546ec92ff2339b792fae60b04aded641570ce27647843c4f636eb4d3a9621d2f757b594d6d5752bf34f955f32b7d5aae170e335afffe415ad09ef53d233cddc5209a1f507def075cc85011103213648550354b7b144c45496741a937e6dc98cff48cd28b50478d7c190efcec003282cc0c2700f75f0c6670125823cfc7e60634c0814522563bf0eb48f8b7c86cc021a0fe5a3c393463068d34ab6148135ae9c296b2b8128bf83d96ab4a849b4a9530311d13c794cf6096935078199fed0fc74cd2e5844f1945ae6d7b4b911a945e1fa021423d028fd3661508f009c6dc716cd83a5f545806e52dd3a03664933930b77bac96e7524736dfa70596c6917c1185165671deeb16ad7e53415961a5a58f72a657644b102061e09200b6e873ec41f60f7e6bcd6ec4f68b2cc7f621d07778f78c4d8d71ca6b34ba1e37cb81789aae608b47be71e3a147888b58bdf528989a653d6fd64e8538fbbc9bdbf975303c36ccc063c127623f1fb2dbc4781d2f865e033486b70747bfc7940b6ef86d54434c5e05fe8d58434c6323eeda911e33a4ab626364e7b886665365df65b56a27021d2c094fdc0533feb325606a1237900cb314ccb648b242ef47c509650999a4e449cf8f917397d665011306d48e0ccf77f1bced0e3de17a5ecb4ec15a3ef74b54ab3a9d4f925c2c1ffd1330721afe23aa7213012fef6f165017cccb52a1a337f99fb7b258a7765430c394d4caa3767b6917570341acc58b8debdbf504c90373c9b8bf1bb0bb80ae60b37f0f93e50a035aeab0cb1540be2b79d785873cff98a8eaf4a8bf243e4b4b6ac542d22a93572aaab5bf97e054ac38dd534952a56dc4d4d71bc8c91dc2fa2b802003bea53601bba17833968bfc365ebfddfbdd6909d020280db66e011b9e35b5145df048b04bf025a174a2d9861e36cfd763dbd6da1f5407db9784e8cd103843474cc901d20f1ef0fadc594963244cbdce38d92b0e5a9bdbbc360c5ff57c2ec8b9b98d48a137d160a37cd4680575faa2eb2158ccba3bf9af544ed15cf018869c80b79a0c37a158506895379956f7a1bd42a356e3176dd53ce240a869b20062c38d8e59225674bca8e7ce718cb1fd6212777c87cd25ff1a7e096c61bae7b755a1a7206bc93c557d31ea8ee64f73b4a32696d6c218db332b7ee461f99a034c8bdbe33cf89c0705b95fc9cc96d3d63186ecfff4a136cbe87266470d3be663f973a288062abaf8f4ee14ebfa5a04622a3d188dbbfd1a95f917148b139a1a27c5a597ae168dcd95a0496dea20e47fefe5c45fed2ff00a9348ac3c463ceb5e54bc6c8c169f4911e05e39a6e812b6818859113798a7d7e1e4280b71bb7ccfd0c4634f04aea0c0fbbf643e54eed7cc325c1eb9c5379762ae43bb894cdf5ec646ee41d10289251bc4adfc1f2d24b3a76c5ebc81b2d9e655eff192d7d1790f3dbe11bc54c27cfcbce0e00c95c198d8b04c7071bd425743810a0e973fe74f721723a9a582fb820afe952ab7cd857a7343235f153c53f59befbd8380b51f907045ae1166e2520ad052eda4fecf6f90e6a169566b628e9e3883cf4f855fff8b5f7952c566892462b9775952dadf67ae8a932952e6d54fe1015781442a531d92c376464346a025d191951403f9bfc32518062783338b94cc0dbc37ce17dc3efee9c6f190553d26978811933f75ff86a83c2f8b00ca228366961622896a7178b6eba8d7e26c5aca5b05e8dfc3a8394b117e05cbaf238c3e2a5b127ff04b9eac808333cca2f50dceb53656111316aac2de1c56fd4d4f9f08d9057b3b1d50558d78e80d9b7c56318d7bb3ac1e0777f8df6765ed6388f401a85e92320d47d74cb7882678ed688d1797f5fafc52c36ca831a87515caf640f4ec0fa8914fffb32d7f4a83160d7131eb6ac07b4d39b2fa7c7974e8af8b9f6196a69fdcb71e4438e1f32a07e015965eeefa5c5d1a2006e12c7117697bc25363041e6a6831f5cedeb389a7e7fe976e5be4b6a343b7aac98132d3ad60683e29994d8ef21ff558e040132dd47ec4d3736d63d87b64770ec3965163892cd9a6010c48cb2979f94eff01141ec696e99f0e36e32dd272e2cecee8c6859023503e31779c782bbd77a8513068e57d9fda8a81130991f2ba621b886353df35f5437bb3dadc968aac2fd21f878f23b703c22bb04", "63635365", 2, 1906685658, "e2f1fa0e7300bcc76c323711cf8459da68010a4dba65de01d9a61d4ebd30a2e0"], - ["030000807082c4030234d5398a1824f6345d11246dc626fa4a88bedbf0ec9ace59fb95ffa4f905f5f0020000000651526551ac51ffffffff8f956945a1ebb2fa3189047bbe85cbe5cc36a466d1b33e0f5cfdf19b72ca1d1d020000000100ffffffff0466b54d030000000008516a5251630065518d208c00000000000152c06cb0030000000005530065536a7625640000000000035353515964215e00000000010000000000000000b3942e03000000007cc429d84223fc739ea7a9295279fc7a0587d82f8871f28fe65598832b26a3b4dea402630e145a4a3431cfb2290307c7ceaab1945d48885d6c701b95c062b8aef99bd0910de52770b110cab898bec5fb4eb7ce12845fa6a9e65b6a875ced3dc40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000037500f69da198ee7d1d5cb5c135be9f496e6007804568f08713f0dc5282ed2bb878d6174b0919ae156175aba94091f0c78531b8fd62c097b9fcf11ce68dee0a554f8e0f60e0cd023e58585afd15d32c4fd289df53579079d4f713e3e6dd298a44b420b67e881180485edf4c0d2390341e774df1d9de9ce19bc20c183ece677fb03012995ea82cd0216c38714adc5382995fc1f5c3b315037fe209361f10e42f8e5031d9f27f74f5aefb16aa9dfaad6714c40d4cb15d8a0cbdc9b2b6d6bcff1a2cee00b026c87907ef29390c2975ce80825282e4398ac9916d1911934a6d55feed358faf3257e6ccd69d708e699c0c4c8b58fbc5d00eb1e81d36fe02a747e19ccbcc42603256d4bcfaa4fc455078f98b4cc43ee4b05fd385eb3d179f686e3a42f6cf5d948030d1f12df6e55403ef2bc2db9b6c080d01f64aa354b8f94293009cc9d995d428e030d91a0fc74dc88d914436d2a722de73e44a3c7baa5b079f42d592e64c549b980022e5c33f2e2d98ec8cf2d5c1c20bba6d1a970bcd8b1c4218be8ee0ca3a3dcfdad030660e989ce53f6b88a6c15bdc56c5bf6a3ccf0780055ab3936a9911a33ebb03337888bb0d7a42f00c7d91e44458878761b4d6413d9ad10534bc7a9bfd92bc0e0ae66f9136136ed5080d4adbbbb29b908464916ef166a8f0e8c7a7084aae2e45ddc049447aae29090caf7983af4049e2663356eb30682289aae397683eb3ddeb09b4fb99d5755260b123585dc4741a7fabb3b34d0cf10165eb33ebbaeff9abd4f421c8c56a67e6223507a26ffd1bdec4e4b9a9fc99ef5827fafc31818d4e8b853e6e79c99df4d029ded2659f34cf16667e417667bfde8adfbeaac08745e4dc65c5c44fd78ad1607dcd1e7881af6fb575c806a37f1c05b020ee7739d003ef8f7a47f2cf6f5aeaab659f170b4f6f66025ad222a8dbb6570fb9ddde53b1287a739458147a81c9a21bda01c44c08844151a173361849f315415e7e6f159c17c0444fbda8c8ceb202af0dd696bd1df3ab01616b9ef2b0f0f968f67f2c8b26d99e92a56c44bf34e15ae5a433e979583bfa3233d59b7715b58d1db74919989518ca303adbca9ba688c174683146a520a2072bc308e1b3235e80938d252c0c7a50bf59e442706eddc55a65bd17409ce2e888ef8b782569d9f83bcb718aa2956936db7dfb1963abddce78b0dff808ebe383a24ff7269d21f8ed3970b92e9a3c86ca2da2f9b9385e8e0f987e1ee3680b5973abac72a0ffb9473d485db402c52df180150ccb3ebbf287794d194816a0d1ddb824316e3d823484224ac236e97cb8f1006f0197a6c701f1a7800c8394b6a58fe264667188e7075182bcbb0ab652dbd957b01a760e60399b44dcb7d6a509ca7920affff5d25619b86409b4c2cdebdfaa8432dc3b554bb5f8f3138f0b5f63b15a36afd36a7f1f31d5c7cfc6db68f965957a7f9d17d59230de6375579b335ed7ebd489fbeedb7d26bc01da8e3c5dca28f458dbbdc6e0c6d81e7b7b414ec1edee0d24599ba46ac71de16580a1b874ae182660e19cca9587a8cc1afd8619c8676ac1b34711061cc9660c3f8bfdb54ce725bdf95f8c5836ceb5d411cc9fdb09ab3089c60ae7aec6371f6b99801660fd098d8254f9eb895303c71d26632a2a9b5e58ddb1be81c3a0432bf287c8b21a713a76743816967fc0010bbf64b46ac228e354c044bb121ac05072656feef2100861475f542c9a343f8612c34fda7065ba1226d0ca7b8c6433ce935a6c563c1930cc04d01fd8c0e39471c4a2e7e1c25b844561985d21f39bf2df94e6074ca315c7d425df709a9d737bed8374a99f563378494e228829d45babd3a71c0fd36ba7001435367b1f32f1cab4bc121feb1d143aa581f3f3f22080b1f54f5faff6b9af8f960d4e9eadd0f398fff2c34733be5ca733afbe203907ea37436ba7680a3578cd2a9ef1a532190b54b742df9ae0dca8075befd26f6d84385e29008ad955165ad2e0b8ddc62ffc167c346c62dbc3ca723bb34669b1ea9cc4b80237701c18ab66188840a223e6efa63fdd0d7f5e0c28df8a84e1d27dc92164eaa8f6c97ce7cf217796f0a36da7ee42fd389515384b2325e70183fa4ab588ebcda19fdb26045f8d4d9742bb4dc258c4d5b4429ab175e0614dce5ac45503127f8f948b9750ada17847c6a323c40e52b39a47dc566d09a0ab670edb22d3d0866cbfb5301baa4492b6825bea2241897ea74a8eb855a478e45fbaabe94e4f832b5953e07806f7073bd09fd30fbd9f3edd72d673db7218b0959f6e3de117e27053d5c7fd63ffb6d3cc01602c1b2ab2b43fc94574199d7e65687a9fb9a639bc6b1986a940c51e8b63e28efbcebdc451e62a3b82f68c68c75136c1cd1140fd71334216f6004cf281a82430800ba51417166eee24025eb61f56360818c3c041da6a2d600bc01", "65", 0, 1518328733, "b8f83b45276d7a4d3fb447198c99ca2a222a1d37b56b5855c26827cc3c859562"], - ["030000807082c4030177a468c49f0c2fa81cf5005c79404e239a420579d72edca181cbcb2012153b6303000000075165535352536affffffff04919c16020000000009635265ac6a5263636516a98a0100000000016391d1e4050000000002636575fcfc030000000003635100000000000000000002bff304030000000000000000000000004f62b5c3fad048630c80567ca42ed80eab62ba7d3c49ebec1c575b428987a02fbf501ccc3b48d04be987c080e4a331f486d69b2e332c90fbfe2259342130fe570b7e27dfba3fb69260da5f6484698d6f17673131eb795b88429c661e81d3b184000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008328eb381285cedc41c7be37666625566f1d55a27941666ca0ab7ecd4afb16b9ae05045f6f552bc4bc86bd2a0e51a54079091c15cb948db9bf06d05f2fabdd446ee5c2909bd22b2653377e18f06a92883de11e5d8d0af35290d6f63dbc13c8a9e9d863f03174875acaef74c82e6f8c1cfd842be4cc9d0d9d3691c8703e012e2902164a984e348fcba96577beadfa9873065a147ce8c642af9eb9a8cf44988351a3030bbf3b6333b7c06d5fc0b13fbbb2ed2b2ba57603c23aae704bd0554c1752d9390b06a7baa0b5bc43715bc18ada83bd19138f5639804910d6d40fffbc59687b07672272a1bfd447440792e1da790f93c5c39d92e5af23aedc2d90e4a9e8bf14a66a02294df8e6bd075aa6d1888d45f9c464c09398641ae4fddb8ba07bb272fa23671e020dbe101e121cd6f09f8477db11f276257f728b38b54198369c4b0f2c2854752b032d8ea2372e1e226126633e6797a98f5130fea13e994bb07978d59429635cf875020bc285f8e0e3b4afb080d2db2df27d0e617c7a389069aa48e666e2bd2fa62f26021031241432681b5b45f491b80b484635d08605022452f0a5bbb2715a03625d657b5db6d16046b101f513087f5b265f72442224c578dc987a8dfa4edeaf37cd8bc449b78d0f9ae87b2ec7e0d6b4972241514d333e497e3002defdc01af8b35fd082fe4a33ecc7f83282e39ac7de51cb4162bc169e59b15c7a62862b329913e6678d926ddc418eccc0e1ffe5e7797f0d80e6d9cb4f08bd998317688616833c563ca64d2df2f1f67c8c2bb156d1cd67ae55a725f5405f5648cb019b6c0d2258a413e3ba57a9cfad7bbe093f0d18a80569b4f586b8628064887c813ed61facb2e4661b120f97b1e7383ef3717dc6a3f8ae4c2e7341cbc765516f48c1f27dac0e64f9d7cba1fdb1848cd466b4b97acc4a8f28da973a569db1afcc6960c75948dee4b26c8eb775030baf54c5be85245bc1ee1e5fa0995f9882eb3632cb9bdc123a1f5b8d64a01e82cd2a4c67f446216b8e38efb6944a15376d02910aa256aa52477d48a56fc305b15383d4bdfde49fbb72125d4c81570ebc65d9a2584c6c8582b45c235eb55296fd744a51b0edb3794c483380933988d596bc0432037e12990fb43abcd9457170b12d8900cf405f2049130ad5727e560a61550f772a3f5bad3f29d05032498d52cd3dbbe089d87c15f000de97fcd95dfc53449c2bc472973359a6a99e98799a75e351ee38e600017c2a8b1450e3ae0523c576b16f7983940ade16c1b890065ef3aaee3eea6cf2e5d930845560299f7bc7fa4e263cf00db50980a391a9e53d0eed2132b47f0f293dbcf99c7ac578971a11a1a96998b7d8783102ddd0a7f7a09aaad30eeb9cba5fbf0b2c636a10d3f75cee203e788542f2bd945cd848acbad7f8b382ba8d3c355874ba439e6b67bb85c8a26df05054b343e68254d1b5de5518ee4d141b62e9f591052d0656c43ea319737373713bae3752b04988ba47db55f3b3eeee7f1093d7d78983a6b5b3c4d14a057fe27602a79fbe8a13c701fa3437af14586567a18fdd29fffc7b425ed8c41a3d2668ffa93f25df4fb9a3df38459eb980bde37dee6aaa96db3d7be61907687ac7dbf9402bd32c22cfc03849bc34eec108520f8fd990abfc22b1043b4f08bc2331e623ab5d5630313ab073b6fd0e6246d9c8d6fb4425476f16197844d7d561d97759c57873e497279cecc98e8bf013b07a5b479b597fee6c1d33d93cf20d41018eee8a771ee3bca22d677f35e1cc095fae18f84670946744d6f4d763aff51c0d309e8650ce8fc99760d3058572e96365f0806d014afb2d5c557de874d0f24482715b3ec4f24166477e12e0bf89e4203c09cd715ddf31446d8407f995fb16d6c288c53dd9776b19aa1dfccc1c806db358f538abe0f2b9d4f76a039dfc29b0943686b13dd45c0447081cba5e2234a719d35953f7604d9320a7cb0ca42ae4433a3f356f24cb22e477f1eea31b66daae3f81986b5fb3e56c6119715f2bdba422463986ed50a96cfeb161800e92a6a5eec957412d6d7737142b07f68adf894e7843c3513f3fded3b5505b0eb09f6d5b21f1b35f5919348706a882f2ac8c4743c88c978eff0c0047713f9108a4c7e24bc88551af15f9d9137a0b55180ad569ec46c21437ac95c4693598a0a65129d066d4af45f41420b37da2ae0f1a782f1682f7313e731ccbfec5fe80e8a0476d3234157688affedb7bfb99045c3521d1d5975e1bbd2d8e782d8c66e223a51e30825eba710ebc495c302b68aef951a30055286749575b41cf0200000000000000000000000080d6e9e6ebb4e5d82edd148714806728c7525466735dcfe574c800800cb4ec6c567296ba8eeadaeba0192d264a7a5d6b4c48f78142ec519f00263b8898a8198c40a606b35abba13403c8adfb2261512d8df2fdf2c448e5c024ffecdbfb84c355000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002dc8a7ff87e10eabf944b39d80fb4f37e3ea9805321b2f1756916347d744113a996945cdae86c4d5b242fd64340e7a06625bcb49f83928d31d460795693c03fde1b89788f84f48aa2ea983a959542f10a85c2c7ea9de3cbdbd5c08f7fc1e7ea3951105fff0f48b11bcf3816f32e1cc9535622de0c294f7347b22129b215fe3b9030707a923a83ff8a30168b66b0463955b7d836b890e98e7721525b741a9029107032c2f2d11f5dfe19504de590dc1621027a803fccecac0d06fd1d723bd6925738b0a001ae0f7f6032ba81798921a8d1fb5c40e519e4a13d20e1a501d5304c37341b115aff898b30b4f408262e7e972162871af86c458b6310ca4092fe27e0c2fd529032f495c38f55a010ae358820017e2b0e1772e795f698235385241c61360f03874032b42466335528a8a9c17751044d2a5feae2a146f8834d99261b734b8afa69f1102106d1819bb232f74fe4e6a380b8064e9af3596e6b4863b4fd1901713ce0a65dd0318c06b83bb5647b0296e24b01b7574f4eb32915ca2859a8974dec49f35249766032ae768d88f2f5519026231165c9648abf72488eb6e1cd6568cb769196da16c462313af251c2f20a736df5766d318dcf5bf6e24f51c24081f2aaf38987f671048299dd41715071359328e3942971ac0083c61d3d439a26be4e68ec10cf0fdef8d2239ae024e531dd5c3272ce86da331b5899d784a0e78a01bc29d2361a4f8fb008b48eb25cc6ed893982888a7c7bc622893d2ea178c915744f9ec5131dd048fe424b91e62c14f09090a95830bf06067bd46a8a6539a81957d62ca583fface4a90d14ac48a80380e002bec7c2198423d5ff4b010f6a2152022809989dfa6da29bd08d3374bcadf1ed1ab87d2bd0487878f126bf2f052d50ab3bb0f31bb0e265aca18f5aeef561cbca418b9703f2c74e893be11bb8da432b556f1483217d3fffe26de5993408f1d8e936fa1499017e6d0e51fa7c4853118f820952cd84356ae8780195143486a732aaaba28a8f2920449d13b3dcd6741b5c88b79f609d0ba0efff550c8e06ad476735072547682236f3450fad5a396a15c8df4a417338bf5c4bb32ec0ac297c67b26b19b6db1be9da410967e63fd606b1a8edb90728a4b82fe37fd1a1142882a1a796057c38728beb550940258bd4ceca148179c7be5422d620a8f369be4fbdfd95230fc00b41492e74d083e142bc3d17cc34380ac40ce14561646a8dcf0161afff04c58f1797a00b475999300516b5c0be61f4448a57c5117dbaa4748d70a0610dde730a781a0917199fae0944fbb970425bf890d82ff920852bbd86a3cf6f3ab60462300697eadcad5313dd1f7520d753ebdab0c1e1a1bcd4ae4273d71519e67892b71d32d1a47ab2c36a9fca606a35d4ff52f82439aab8a633a8b621db3d0301c9f57e6c789f08f681716b57001ecc59de50d48e4cff0ab01bc3c2309028b5066ada692eef40b4c7efc618cc6e3a826be7fa756c176364133bf9406a623a704a35e7c893fddea436935acbc4bde0515cd54f11ee3b2f0b24129edad968e5fbaf045e559a8eda5e1897c56726b902a687ff5edffccf37288147d46bff688b4ccf67a366a03fbb890b8d923fb2ece0e299e44ab2ad1cd8ae4bf5bf543b9529208e1fc2a89ea7fc689eccadb1175cfe4a2a161a0698b068a1b26ef87dc94fcfe69e9a96c81ceb0ef786bf64e5ea4d0aead38249c595915f43fe56800cc75346004ff09823466f98a75769e4f4e04abcf5d39d24dfdbe56e992d74de724b2a145c9ee9c8a334795f338d23987d99399ce3a9ca4c49472a6f7169b1401d8746c8fe55ae51b292344e91972091d3deb6781318216e523eb193151ec16a5d21b1d1f1deff697eb8767f0908ce9aa8cdbde973ceed0fc2a3b79f08af49eb6646ddb87c3675df406f08bc4961ec129b01f89984c566de98765dd6641320a61d94b150204acfba845af441014187bac4d33c7b30295393d7bde27e615a3c6499c992c0b8eef1df14f9ccb5d0724d93c8226a752361ef221ab514fabcbdf2b3db386fac395c79901aeeb0c4c4eb8fd56b4f921347159531325e025652e950bb798fc9c195d4328dddf4590e2541aaf3805622cd606e916c4bfd7c484180f94053a5fc5bcdaf36cf3849f64827a9e26164f1cde2ede207e9722621a1e589b59710285afd8aacff02b56d7e5f80d09c02471eee875c1dbeac239580a71268b8820a29757a2a18767d8ccb2944811fbc7462255f2ef44c85dda97e7b5a042b56f4537c85ed509eb2529e5836d357502de2c9707a43ad526ac67f469112df8f61dadfdc54c19dbfc8a627d59a7aac0aee7032056d619b7f11e13ab3fa6d37a6c8b217dc98f45cc833204cb554b4076936021b113f6813794fca51a5dd7cc86578a6c271baccf0646fbfc5175b2128feb604a0b", "520065636a", 0, -659553128, "fa6fd47299c1398cc938b308224c5c94e3d7e94eb6637182f1433ecb8b1cca7c"], - ["030000807082c4030465616febb2c9a6260c6a91ef9467e9787eca8a6811ef301c71296c0457f72c7a030000000163ffffffff524e163ea9264b44721ab1b6a11cb2dd4abf73eb09194af7ce035e44ea28daf003000000000b4ae269ebcec0aa574fb7f93b611d409c2661fad67dab1500557bad011f988211e9e2c00200000006655365636300213a0d68239c6c0450940eb0af2a62bdd7b6f31f1cf394ca7be7f7d869fcbc976e7e7ad5000000000400ac00acffffffff028e9f44050000000009006aac51ac53655365c8a25f000000000002636a000000000000000001738e8e03000000000000000000000000e58d0bf657379a44f61eb207b33b8e8f41f50787cfcd9db964c92b48a1ceb3e513fee6ab77cadb07d7bef2d1fe81688611299756a55a57f3ab63a8afa4c37ab36b6bf9557cd97646b7ccdb31f50075081391bced58d5106f13b4707127e65e9b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7bf1a7157215e433ee69c94aba81d2b49a44b88b74c371c7daea2cc0b69036bba4e60558f15526d69d732903f2100a6cd475bed54e2b511fce0b4c423e7e78467243bc05ed917a7dac49ebb8a0410bd1a1ab95e8110a3eb01e965cc1ed3d55875f0cc1cbe08383a19ba2fae25fd2e2c521be524f94088c16283a4083d1f924b021950698d4820741ae9447ebf3a665291974dffccb42585f5f8418370499db940020bae9377ab570b51dc0d099bc46f08ed6afe6c03e91cecd9dfb0cea0c4073dfc0a0327a48b6dafd301f6b7d203403b8f70982e3b60d91a0e3da416aec792173eaabf890eedc18904b9812a8bf55028345e57d35031d9addd890bdf042030e8d61b0222b81fdc6b8e22230ba8293a7b0ddd0c2db7622b993096776fb38b67b57c8a02030a6fa099ea23a52c541101f38bc185eb4926b3bdcd6d137e982c9234030615ad022665b84e234b725ca4e7766f20f30c590fa696c1ac0494b13960a8e112d2d89c020cf3465fd599e13eaa41bbccfe4e61fc0fdb4903628962aa6646c53f5910fc300226e1fceeaa1ef038cc04f4da5d35ef01a80b3e82ffd1cdeca5e351132f0554c653fee6d31f4fdb506eb610dd0afb1385f8e4db07d1c948c1cdb514ff58bb6396933215b17297065af2c9f57a5d2c8cdff39b6abc1fe66c1ff8989d304d610792110e19902817ad3da937ba2ee9009f56194011239503383eaa2af85433579c3433aad57f188e206401e8ad7c8c6ce7acc287148f8a94ba10271fb78e7e184cae490f9632277a69221445cf9ee8c70d30a9dd0d20d4f02419ef3e0d08b6c5eb7819f6fd021767e3bd3ab779af4279061275dc22573e7a51badd466a625a0be75d6521b089ede041f22efbcc97427236e942253228da65768e158c8cebbb9925efe5462015d4af9485dcf37277ec181ee4d9f9bc42346e3bb0f4fad2913d6f479302b6c7b14c8b8d7e44f260246780edfd70e0e1a654aad9d13a61461b478ce3e0740d91d06f8cc9dea64d42e6e9963445b6716676b92021ddb3846517d98a6848f84b0f67c48524aa32b21aff247b0785532724b7c2290ffaea8f7fa31b2f025bb81f8c3e33a8fe6044860559761c8b8426d8bbb1cf72a22f1745882ef329406a1fd214e3ad2a837521e3c7be1975819eddfd061fbfe06b12b433d8d7fb71e990f5a9cf86c16692b6b9b69aa50d2e156ddcb6b367d55eec92e48bc87da6f872f8480ea56cd9cddf6ea31a22cb330a8e726dbf575b5c1533ad7461c764c950536d3f30f28c129e3766a5a048d260318e9aa2e8e176a31c7ea79d259c35a5ef496f981ad4c277c3b51f2489f8df5e8e81a3710b69c44848c3e1bd4b2e76a7e55c9fd2256749b8b273e4e585b155c853150302240185e730103d2c2fd76c6bd08e041f1e661eacee56c13425147fbfcc9e173c46c4ce82a8bb9338b70920d1aacc801e894808839a1c6d952fb07f2f0a8e72c5908e1b9f9df93a737f91093af03a508e676c54f0b76011302bf24bd2971abcd847853d0dd6cb5775983682e3180277587769eee6c650f5f5ed1fc9f64d0dc2b4479538a91360153a04ab1042a9cc03e105f5c641cad57bb31e9915000fabf0ebd43f5f35aceb67a9eed3ce085853eead9dd76fb4f121b31f47ea006c60114c9d14d55b47e0729e723268a6958447df7f7e680105ecbda5272c9eb46aea41644fd37c9f12a56717b9855b2f8ab5d681db392c9e02bb560fe99a6893f5fc825ecac5db4465e6bd936c8377c646fda47815ddaa38a625d1d1de9f8d7d80712be255313709174eb451b38731a7efcc0782c064e2f1f29c367443f22b239a5624f8fb4e3dcec805d819b04124af5438fbf2a7868733c177920730461caed4054be928779ce11aeb7157d44c2de4e57554ad79d13a9114f3ce81cb8c54711f7d788ad34a205e401c1a24019eb91bd3a95d0bde8c66a9fb07b06ca7894ee3af4047ecfebeed47d6a3a7d8ce1194926bb938f95f35aa0d1cdc8aff73c747327d162ffdce0781f298c61eb6da12ac5268890d9b3938a12af5fc375e9e81d357291593c4bb617b0b49b462e6a06c1c7ac2dae003d478ced55d6dec51d0449ef5dc40876570a18f5aaecd76afb4535f5979057390029d2f1b6ebf449acf3b8e575ced8c13d4d2dbe311c5caa2727563f6e5bada7a8f11a4b5578d3a445643b174ef61ccd87e67d51c79d068294097b02ee608858eab8aa8e661c4f8d287538676237845408ef8489861dd808aca1d0d1514f47715102c03e26dc5b9db85333e7173f8efcde8676b3038c710282f8e7e59b88040e42d690bbfeb5afb8a89eba0954ff6d163e51dca8b1e1ed48c7a62881f9a29fa902a1161df384398d9b694d0af791002e66f4d407031988f17b22cf1bd3f300cb8814a126c227ebf1e4258d03e904fdcf39600", "65ac65536a5300", 2, 1724268038, "b57579fa9138aabc87a10dcbaa8685571e5691ddd545681d30b933aaedd6b62a"], - ["030000807082c40304303d1333d27ecb157e6d602abea3e2d69f0c857a1de9d24647ced5c7140f33ba0100000004005263acfffffffff282ebd5d712e5bc56ca9b457b5fcd044460ef18eba7c2ac03e76221ed944678030000000953536a536aac536aacff214db4580ca5e95f3379f2cdbfe04e0a3d45132e65297931ad0c83ba968f7aca579e2b0100000000ffffffff270ead6516a3a0e758bfb45c8a8ffe5c1176c9208e4652eae9d6d9d2fda6e37a0000000003655263b2845ae0030dfcd702000000000751536a6a53516347f3cd05000000000163c82548000000000000bad54d0b41414b140100000000000000002968290100000000f48e3c585647e04534df4b18da35bf99668cea491d3837b0d23316ae804ef9071cf0b497fee814f1ea188e5e94954e9012c84b701cd096d95758e31049356e4a979de2ed6c64aadebc1178ccc0af772114270861ebb8b5140f4b9282df9260ea0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033760c52757de296a808a0bcadd7f87498e6a2e8697aadbdaf439d9d0bcc2db2891637e54dd9903ccc305b1cbd821ab74103106c4dccc6598d936e45319cd4a6dedbe1fefa8942f15bbf5d05226a0ee811b693eb8ed0fa58f99d140e80cf11417daf383d28f46f7750ebcf34fc1a8b38d6abe4bb6e0ed360159cea4b69d54388030a37dcd75b7fde18459559cd870f5e6c639ad865a4e768e8323f1f40ef00798c030141932c303c3604e4acbb94182d93e0fffe4bb6c880a0f2f9d95dc9c1b9c3a30a05752067682ae320bdfd7285e9870b6515e47499e65393891ab2f4bdb93348e9c71624e5af8f63385c8bb6d847a56ac776dbfb905e52b840c6356acee669b089022f921eed9be3148a743e4ff42bbcf9a423e9c00c2575df8afaebec960b4a1acf03179d20fa57b7c350116351c84a78940d462f2d21d72ef9c8b72af997a6eea78f020cbbda91c389ad2d622d6c342de00241eb29f4c8b27d0f64022afb5217ab29c203235031794b6459e15be069b6d79049cda861b4dd2c16293580280a529bcbb710022441bf409f7e3d24ca4222fb5d30fa39a93e5c8948305b537bd0414aa40794236a3ba232b11e8736646ed29c6871ab5cc6dd7a79dee44a2ff1dff2b4eb49299fcaac1907e06c3aec90e53c63a68bee16ca2ea0f5f2b759c22588c1682c47ff1d15235070014e77da85a2da04250cae6926538f4b8f958d508245d590be08399007b2d48ec546543008dbf52adce84a7bcfd397c545debd2aafbf77b58b4828a8f54270c9032096c8f2282bedce52b4c5489f1ef5692488429bfadd39955967190572970b4830d5efb01a8359c444b2031379f004ed96e060c904feb9c9c10d2d93e73a273b3a8831f68a4f908fb42ff98508dc9e0582cddab09a59e01c0b0ffa8199b37f0d1245b4c9034827c03f87afcefdc163cd850a7c2730209a2f06465d37e27b677a6fcd35ca7d1c141c3c584863b27ddb723108e6994b8a25b6888d46fc98645d2669df13411412ea6e1e9e315a8c2be443d5d2723ce654fdb5b8b1e07f2f1c8cc4b8197da7442ade63e72f33732a970ae189619ea18487f0c64c1ae8f12dc3d41e04a39fda0c444278c41d0648f247be03c4d7d3692f4360bec0055dc13db0e6d12f82db656fc4aff933ecea9ca6b60831b6ebe1ac183a5202c923a6ae8c8d720afef972798c6ff10c26cd78109f5dcc7b85b6ee575119e0e7299fb91c1e926044bb318e57f4411776d2033903006bdcaa2526c67b837ea33f218f45e8e3cb10f8bf138e9a13b14624baea4724e202b008d453e2be3ac5ad2af9e5b49f39c705aa26a4126b4106700ab7b4d8cae74c3b6553449fd444e7616b1c779b5af2523d95c549bf4af8faa71acd0c70f6fe0097827219983578e16763ab4bdbf89d47ede5d32f3bcad3fad32a54177d154167f12259ba77649033f2f846dc9c147959f76d90b08a93a18c998674b2f25e8c145cd7e230a699f7d70bcfe696858b0c03c506f09b0a4a3f84c397fb86323bc8f91bfd1b1a03ae950896e3c75e86c8d98f8a68ae33183caa9ccde849ec4fe60b0ca0568ae655eed196d6d4326da1cbd49c7d1224da5587a45ef7878dc7e0ecb6f50a92209ca1d2c8c9d22cea71d5d02abb38746a9f03d2fe33a9c93ea150d0a3477e9c7ea54c641d30c88d1dc6d4d79a97ce5376c1ed39825bf2d3d63f2b46e5ab191742feabca43864e3fe12a8be69f8a84b4b43dd296a89d05740230fa16054e8cbe96f805e1a08229771b615df102e192076f9bc32665a4b3b6cad3f73f4cebd25def20b9908b2573d3cdd1c794b028a43834166e92551c9f9058d6274f65f74d1490adab57d5261bdc390de3f28d2e7f753d413fcb7aa7a28b2cfe03fb2dccd55f8b782ff0ea788ab2260e48c40fe4855149574add64776a98f856a66de640d0c805776326c38e3887c6724951c84997044dedf11c9b8b77cedfdfd088a1c62dbf524bc80272a83b2137400cc10397cc6d1c15edb2da699f45f975e5388f089b220a25e4ffc347b17a6c474ba4d0a5966beb3252fc70713ad5667a5ca69132f73ddfe46c339a549eca11a7a613c9ece64782bc1b69300d3bf506ec249520eb1c42474df49f41852d8c73632159e1ebaff7630e2666e3aa765dfb0924560dc6f917cffbd75a11f5ea80864a88f61601242078396e382f6879879ad2257a3ebf7f6d90b64cb9e95ac9cc482ece50094c85fe79c5fc7eddbf377a5833ab65da4c5fd445d68d38ed8ef837443116357502a9b42d45e8ced9387f96edc6b58962fee044b7f6c781fcfc6364f824f759b4f1ebde9a57241b14a9cbcb8758edf160dfdaa5d7976015098500812b1bb04905839e72da221505474652c12c54d9a232dbbcea9f1114357e32df88b0a26f534cccd7f30d416c05a9ad848fffa8939905", "6a53ac", 2, -316248815, "ffed79682e42e4ca16c672436fd5d9f87b82268dbb01afe4646cedda7a16f693"], - ["030000807082c403020e6a3eb1c217f4c8cab31688452c95f8581769893396beba475a574b2ece3cb501000000015301855bbd8ccb46ec2ce4c402cccb0701f07ec31e3186190866ab1fbbb8f5dc4dcfbdcd5403000000040000006affffffff0352ba8d0500000000026565f1b2fb040000000008ac6565ac52515353d4d635030000000004655365535f3a21d2000000000239089b05000000000000000000000000b4e19207ac2d9a21e8dccb41df77cbd4b2231ecf49cbdf53ad37909634177d49042e322d5b2d14ef64205351191c735f5e21a71b427d9c558011d3a909bc1fcaacc9f1e37f2697d139b2cd55ec64acd7c9c7e540cebb3da5ddcd6b286b4a191f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cfdca308001ebbff43bae8693f0e4f10423d554bb40798e79b8b6bba9a9edafffbb4838e5b185505e990e9d66d5e064ceff55042f3c433b7b1ad8c8def68562495b50051efacc0172f16aa9273c7924970bd747e57157d66cb217405e9c35a82962ac9eeb596f2ed298c0093273535209170e848baa17ad503f8c29153dc7d4b02158d688232049cba1b72ca7478286a9b06727843d144572d7c63d43d85d0c89d031d921240b892025489319bd6dc3a1efad0df88cdf21cd2f0e54786c0464429d70a048033a134dc55013d75023d30214aa64dd3f76583615c2bb576f01de991ea32aa072e3e81bebdbe225b09107919adadd334170a8f218b6f0d5c6a81a38f42040226ea77d369ae54a97c156807197e7e45c78fdd5f55b42830c2a3cc809dce153f02303b7f8d6607c997bf99dcbc414786e6da96033ba05d4c5593f261979425f0c7021c47512184007c800da90302e2c71a904d8adcfc8acb83b1e7d08e579c9a55ef02004474ea392eca3e9947c307cbbd67088929d58efb282aae684239c3a8110964030a86ea77ca3ab1fd89ddf0ce66e7fceabe23aefb534cd25e4f506bf8d28b3757345c91cdb2e15ad1d56779e841f9cd88b4990668bcf7123ab0421b344bbd3c6b3523a48e8f35189fb7ed65c146f758dfec25e236332dacce8adc142ae4fe3b624c63fe588a73c31e49310c0ca0167fe2c8fa10bac127f0023ff02737ae6c88acb87f4575e2c5f8a8b6f5ebe7aca2ae4771ca2cbe0cd551594ba8aaf9b8788d5c39c6ff0090bed6a5f7e8845a8ecbe204b6d190554ef07a9451b58bbdb78c58b385ae3befa10c8bb3ed5a5b4201fef8ca3201bec4aa7c4cfca76bbd2b8c6eae0d4e49dd3591f5c1813798b71e2af9a322e7121be5609906695c020012161ba338b7457980935de26ed1f7127e988103dd29ed43338d8f696dc8f545fc9cb39cd2e8a98115097d3f5ab42401c6b9592972ffb45f6e6816d165267aa77bc11776eab7387f158590fc75eeb643667d06807aeae179698d81ec1ba8ee50bedcb86b10eac19831cae12662ffc81741f841aa6a11e37f0ebbe12f029ae269215a1a58001b90611b1e315657dbcda67c8f1db2c6f7ad5b0c954cb0a9dfb0441e399a4cd29014bf424bef51bf716f89717e85325a7baa87841bb91078813ea8e7460f181f9d08720ba81541c5be2bd137c707d6e525f94b8b9c41df8bffba3b8c5e88f4fa6145e74a7824c79ebd74677b9b8c883a258c09a35eecbe7d793c94146dd60c11d47285210763f7cec54af41bfe5cc5f09eacf624364d2c5c35eaada0c5be3e8b64767df66226f07c678cbf2ea04c78a5b73a39cd8b54dad0d7e612e99ca1a951fd391bf2e8913fa51fe96d090d2e57270ba5ba7d8f26a95aca2dabc2128318642e23028fff2f522870d2459f666080f8988d08974c4e126652a04d734751705790d9c39f0c40389794f691204090a8016f89f5af36a25e612ac1fce414abaf0832c5b9f83bea7ec5dae23e92b68a5d977a423a757ecf024f586275c67e6b22a20c62df84edf7460da239830afaae3a075ea17679d0579cddffa3fe668b727504093ffa87b8e12cd54529bc82af7e3f7bcc858527a7be845d58e2f4729317c8ee74d34be28c2cd4415b77331c1e1889f784396ccd2614d8f0d57368a393767c127fe247db8cd3bab761d8c5adfaddde73a1cf8b801db1978e961873253b76ddbc11e88ff63f8ad2bfde063d42e1e703267c0b0bc48c9d694b01921583bd560d747ab148f904b23ac1afadef69c1fc373d3acd91f9b9f5e4c389405f336147aafa08b8d91e99c8cf8c31a5e9487f76842f40b727ec6eac1bd25073997c48b4305881cb9188890c40c9756dffbd45b5922ad8e1ca7e03d630195be5fe94dbfc918c01febe357d9951b784ca3fc7e53ff8901e244e8075f36099e599577c19d6b76f0d6828ab0b49820c98ee7054088062ce969589863cd9fdbe9cb70f8bb45e53c58b757f6e75b7338d1b8d9190615dd089f90d75b96de6e491df1d94c7693da3eba85ff1038eef048833340ca3d5770d1224e3fe7dd19cb51541b3cee68e6324ceeb0d0aec9ab1f00cb154234abe48800ff26664de405ce764867f681921fef1c275bbdf146353ce6fb9a495a6ff00f75979054e65241242591e47766d3bc826b40279b4a2cd6e2af2be23118bb48fd30e64dbf5235b0bfccee20be81f3666360c6c5772894e74ffc1fd9a16cdec72a06bf58753961661e74f8423431bafba3f1cc805862ae0ba4273bb82d52ae84d2c81ebfa0000000000000000b3a75803000000007b58f66baee33293dc3349b0afbd81801f88ff70a3e25b30f03d59ab604a02aa980a09efb2115381540920f5a451ce1bb781fbd51688f4f4280b20a46aff15f9db70e247582d46ee6a6ba1a002518ab7f0a3141f3c2106abf5b76a2a9a63c71500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d805b931d9b786b331f19a099472fc2aad216a80a487c9a47eeb1ecc99e54f819c0c4c62d37c1a4b22987896f286452d58f5fb810b19ddef9fa2e182b850aff77151513de9afceefd577dd96ff29728d931f7cfeca3f345adc92bce2f672a71fb6fea61a935f37fa508f95fba6a9963f0c692838222f116159c1a7c5eed3968903224666f476b1fc182046e65f34a8629af50bb65d3b4444b7a299933132786edd032f12860758f5c5e8b6dad69212618f6f17dd19dda87d1fdb74679ce071a0205e0a04a02b6c37ad59f3d99b65e1e3294d010a50fc516fd51318cfa0d6b864c8173be9eba94ef2d2a2208bfc031b7deff9781dc04a306dd650a43a13a570e483240a03172bdcdb40f8e89860b7f69db3c46fe412b9df97cf65e29d1cbbfbc43126dafa021bd55abf338d1c8d2cfab294a1550ff01f5b69ba4d8e5894e556983c00d7fd7603263141dbf8490977972b22dcd3150c7f2516d9b4910d769bdf6ed29f3b0d3a46030fc12331c7e1c2aa8a175a4a0c9c46baff66069aa2bc9f9929e65095ac4894b60216805283071d61b8c13b0534e8a2bd529c8b1cf7ab6171c43cdfa31d5757efc993b1994f51540ab6b4c31a083c21992026f1348301732c83a4f3f0f1de549f760ead79ab59334f65e349541dce3983e54926f1590236535d6666378d2c715ff6b3855b6ee02976c4d5c8e8215c2e2bce5d946c07294c9ad7365e0e3950b56ae1625c69df604f741d9b822e18f9d6685d801d757e915f401a544bf4e78be8a25b31e8c098c9fe613dd4f659c5e046ac3e76c2bd5212117deb0e2f3d6619ab5e2019b2358568d48a34f08c10a1cf16238202567e145ecc5a470620ff3d38e4209e625b4f6ad8be9d895db3b17c61035d33bd4390d6b2399aafd69156189004404a74d6b28d8642dd2eb59f6d948c4e20a13740da658fb91e6000a4ab4d73e086d4ebddadc19bef106c88fb5d88b96383074e1762e070d36a5c1de2e3f737e50f10d50385346aea402c107a1c0f22fd9d5dabbc63a041c5c799496353b27b820cf22b35a91d4002c628bc0ee619dbf226086001de4d6b44e06d5e9f0fd7e44c5973ea182c7654ae99c100e00d624dcced68d4905016bff27855219b97c83f84b3d4332b142ea6fc0a995b5f0d2168f53c4707d55b09504b062d587720a9edb6a3e3e5f541a169e8b82169cfb939078d0d0185bc3ce210217ecd5a75393e46ae501217d48fae7d959f19fe3f7973ba2908df016c9856181e10464c26fbe9eef4c36bdf0a2b475c482092530cd043131e59759c33d33144f29cc6bf6475cddedaeb7ac1f82274dfae92571e8f2a3412b3890731d7b1d9dc3c2a25c7ca20a225e1230f274a9cf6390ae7027154fc05d203bb22808a8548bf2a85a37fc4c1234186d53e23d013eb5c122b52e6b4f96dd6da55f880e986562135061227ddbf1d33ac968a95b79dcb5abba194291416f483838486d9bf00ce5421433ab5a3ff44076bc63d4bacf9cdcd1955480e28bd1abfcb749655ce1c9b495225b9fff914e72ce613d5ea50292a7b93853ac94d6df690b4aacf7f6bb0a8d1dd03f24e1e4c8561cb7f2179b883c6e025554ec4ff17b66b603458cc70ea01dea428535e81a07494ee63fefd5d175257d5360e21474dd0d85fba9cf476af706758ba8299642254298fb3cd883c6bcf5b6fdee978aed934b4c9c320d3ab287099fbc4bf1f22d9e93b462bee676a95c547172c32bd19a5479af181ef2db90d5e996c8cf5bce059d287955f0483223a36ffee09dc507dc881913369c5bcc7f232ed618654cc69e726c6c04b179a64ce0a2e3cae6a8b1a5c437e5f00669a5786196caec98861feff00772d8bd2d14eb02b51cbb12eea24c6df9d7b85082ababcc73cfd44fda6647d86bde5cb07e11f1e77c15288bb4c93325243b3662f967b227114f96ba25d4a260fb9fc80b3b938a2c1d25d5d720b06db9033fa7aff929268989b23459d974a18ff41b3aba45b682b610b4021c338b118b78a6c7628b47fa80e5fe97be3d826cc4b598fc98e0a4cfde72d741881e82fa405cdaf5d4e2110a44187ec1819f8761bfca2d25d3c045806aa1f937f36ba1e005caaffee73fc22ea876a5d6c9fbef2c48d974633d1b8bf83b99328ba9f84bc5881aa0a06d1f695faea4c56c323b65ba43f9e18e9337780484e7c7bb40129625ded40e3b64926da46001797a1a72e2eb5158b5d5416bc9810a804020f02e7902f16e502f08a5b3476552313add536bc4e621396466251a0b267ee346b69800a8b5d6dd2a953da48c98556c365a9736a64e318d95fdfd4d46b3952f3ee5ac1d0c8c35e28a28101bc8066edfc9b7b425b47f1d7cc8fead98e4e70084c9ce044dcbdca19ab03d315fb2fd9c2803811b0839761966baa43ddba059ee41b7768a31007bf249cf8975609", "6a52", 0, 1740129121, "fbfd8f015359ef639c515a9ae1f11b0671a6ab2dcfcbf3c2889564d08d10e6f6"], - ["ceec3b2b0475410ddbac2e9d8f61f1af0d6dc92e7b7216d3753bb3102ea3452f58f551589b02000000086551ac536a53515289dc532ff324a5c59ba462390fc1f7a4b9e0358a03f66dd33482c4d3afa4ee4a9e00eaf2030000000652acac006a52ffffffff822e2863a808c24d48cfbdb75fdc7f3d309cdafee2426efbb8f744d1f76174c60100000001ace79d58d3b74138f647e8b8a641df4982995879f5a08e5891ac12204345b26197cc74e97000000000005020e5dc020289f20100000000003bfb4f0200000000046a520052000000000184ef010500000000000000000000000093981217edeac6c6f84e623e673434ff0cced8a8b7d2ec5a5db481fa0c0e1ce1af23a3d58c2ebc972f4997960448cdb98aa88a54b1f714b519ad4a6a455fcf7ee6ef86c40f8705b04f7afc9fa1acd10f0f97d5c2c039eb69dc43659b51d2dac900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000abd0bfbb4bbbeb74eadaf01aa58d377803c62ed359c1f4776ceb84dd1691025235420f37c950f7815e009332d6c40b5bd6c4d39ba87328a08dcecff1c0205a4e6e7b3d961f2a05f512bba1c731501263114061da3e0ef4008bfe503fe7a6afb17b74fd81fd56e238cfb2c53df220084f3599f35048eccfefdc3be792b9fd9b9402138780ab6521fa069d942746c42291c5bd6fabbda5c7afeaa303fbfd9f58900d03245410b8efa5c90772ff96132e3c3d70392ee2d490b47e91043ad4b2560793c80b09246c65b9a959321b7667689c7116db13481ef21c69f5665b6fa7a9d9bf4fd9eeec02859f904fbc2dad751c6e8505aa3dfe0152ca67c8beff915c1001c78283021ceaf7fdebeba51f40db24d40366aa0c9622aa5156efcf57c21df81bb0b4597f022e2b80187d6b4f1b3a086fa87adb31945fca09e577392d39c04ed88d87db51e10207190ea62631abdb21ace553b014359e1d9ac3b57ed3dee9c32f2f542a2f469d0224cc6353f510462492ca9b4161ca51e5f9a4267426a9e1fdce5e2fd1f6d44b730301cfc463af17649cf3c1241bd52fa25864c2f5cbbce0d757deb5e182ac288d76a44627c4cb56ff29e6df5b6cf09dd03d1dc1f20a9b2b0abd0c1fdedf7f9516084a2b0b4df57024388f3c034d7ff3a9bd6669c71a7d75ff9a495ecc3086fb009ed3a75259b031b6e82b4f8f757d2437cd62be5a660780ddf97d8c835483b24a9e7baecf03a8aa76f1983016fd3b2434668b7440c19701c9e6e8394d86aa0697c06049bc90a1db68144078bd2ea98a3ac55711cabfc293733d0bf7cb101c95f2eb5a259c9aac45fdcba1e04452bb08a8ce4d50969c8752b81db0786c43566220dba9d9e3cc9e24e3710265cb0fd959c1b81c3d2379f6773ea3a868c21e6c069480c1df3f69852b48cb9a9ca124e8f0cc38b01395299d72476a19c6e92efe61370f464f2314672accb496db3e6cf9d012d527988833db9ace093c4afb103dc1ec9f8457661bc656db0aefe9ff22bc00daf389e5498700f8352981c84606e84d4f748f1185999f93c7a3719c6f906fc85d76f690271cfd8cb74abc804ac334f6eeb7b5fd2a34306fe7b06e6a2f52cf04aefffcc9e4b122342fe08d186736faf2e78f1b87af7ca5b55f860662634a95cf85285fb8b4700ec9763da4e5992c5990dd2e8f76598a06ee0e92e0edf0184437380d4609cf6ec56ff2f7b84b30faf91f25ae4c0d9f9747828d4f428177265bcb78ae65c7a1c7e7bfcc1754ad910675233fc0c72b50e603a3e8727fa7b963deaa832291e5566a52ea2b3c0facfc809e613b98e61897d494999036d336bf7e874455339b0fbe4895e90588737e1e7e09c25591f4c6f4a7a84e0113f598391b0e57b2891e63679caf6c7935f7b50b3bddfe3a04d1f975cbe37bdc162f2c4e52a617a8b68b1b03453a30c803dc80785ef8de68e86b3316f9684917737034281735c836e7caf6d1f14c44f54d484adf74f0e9284195a483d4dd6b1812265dd4206df125db46942371fee5ffd949ff2706ed6d8035d4f8c93873f09e0adc934d30c976ac5d0b9a6f894fb065ab5c7fac095ee69bd95aeaa166076331e14f7407e1cf81fd75df28e3ae64f12f1a4b96da18fb93a05e9045154d0cd60675ee984c30a20759fea841f2c73900c74eb327400d5d0e4765debd27cf773107e0d997b4868c45f15d811ec945c4e17aaf480c1c2cae9ee293ffd08c7c6ba42785f84b4434384960d9b79cc82d367fcf49f130e6005017ddf680877bdd937f3698038207684f979e08778c06383cf17acc6804e448dd6f3f5b3c09e412be35338c21920ce36f6ff4596dbd71ce48eb4eebca10638842e4cff94f956efccd98d06accaba240c6a600811e112d8183f492cd95dec63a916ccaccf6bbd7c006e4e4eba243ac9af839283e9ea5ebb5ab95a2478156ec69ce1c6e0c07ff9b46298f8591ad6e63e701bcbed8d98d024482450c761d4fe29fe9361ab628437a2848423875051e6e7a85e9f18dfdf5af8cae62070c634dd4a1ec6896ea650e76707ad36b02dba1ab396f1e80f0c13df97be6307408aaa8ae8a4692cf1bf65772e548f117eaf2a52da2e6731f6c18db2ca43cb63ccdefa3de7c95555ddf463ea987dd2277877fcc4396051991213d41f505c87d62d2c9ab91f4b2e5c8d41c63939338efe3794ad2e56ac38afd6d1a07906fd82fc17dfaaf64349ba09f293a77d6e3154cc53cb2a4b46de8b4481963fc17ab0f6d5fd7e1a6e0a8e615887ae9707bc43dcd0e4b8528edf7b0b47c312bb2ce88ac89693f5f004b15be33f7cecb49a8e469c0849664c4a5ec6dd43e845beb4817f06f0d3164a348d04089810d1a7737045ebee757d0b35506e90b0cdc249b293c94f49474a87771b7c9d851a4f1e4fe43858ca7b9290d840e1f08ae356801", "53", 1, -1235183906, "ce2c5263e2ffb84f681706a0c2432735c90132d0a6a8dea8fff1774413cf4dcc"], - ["da28705901cb7d269ec0b031b13df9c6a852468c40cea01f8457280d961843a6793b01646300000000020053f66500fb011d6098030000000001650000000000", "5151", 0, -1258123387, "edfc9d0dae278e26f23b3dbed6d8aa4a5f0b5914d34afbab7e55a3a3f0f056bb"], - ["030000807082c40303806a73d4908d65211566767eb4b719e36ac909f3f83fa42948b079f5d9a0bc2a0000000003ac5353da61db4a1b8b7d5f8dc5c3b37f4c61947e08567a6d781ea74f230f0ac9306fdce8a3250e02000000016a3078289879422a1b92413c6ef30e9e23b1dfd4f9a545f89a52267331a7c375b1e4e4d95201000000096a516a0053536a5253fb31d1d30265a5890400000000096552656352ac006a52c8ec460400000000056a006300ac000000000000000003ef69eb000000000000000000000000005d21da76a1695aa9bf3d0ea3336468f3bef2f2ed0c5ecb82bda1c1eb708280ce1f3b3c487b13be1db118fd9efcada7b77c87b38938f304ced4614ea2b085c3bf55125798e95207bdf86fdb86f37b46802bd54e980f548d5dc0f057e5cad9da70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002dbed893e7a42eebed8b248c74e09c357b2d6e83c25f0da9d0d83c6f429a6b3b09132502b837aed5fb212ac05fb8b1a833c993233cabc861a6b219336d50c556db1afb4e93ad423c1198f528ba0efdfe0f2f66b97ac31fadda3eedacb75aec6e7188d548ac8b34e13279599762b23c8bf1e606a434669726026e46b55b8773680230363b27ed596e8816fb68aa28e43482b277f7ea54072027b4b3d2c3053404b6022b44d3dab351cd0d510aa8d44a0b759f072aa474454bd9569dba0d520a38f6cd0b07f3d9aac7e1da161ab93c1ee5c0ed12370312b92454e9c47d6f3650e68ca1d7c7dbf3cf8277b8181556fc5fafd2d3280f8e78c1f6ef78f2bba026231de0ba6403198b3bb041e02be6c5fa8673c1a4b6da2e2b2cb4119c9a1845710d338fcfefd7022e38998bb300940e81402031c25b910b47ce7b02fee0f84c85f4e85b8d3f98270311f2bffe1ae4d0082dfa18919e0dc4f1f7e4d89ac5c89143f496ccf5a5ca3b6c021e7e2a0219b362889889819a68c8b447878d7912798a928ea224e08ee2f738d1021377ca78dad90c51833d7d2f23a7f97e3017b296a9711dd2a82ecc27be4e61a76547b63cdd3232099155bfb4195aeba15720003b094e32cb8bdb1ee8222a5c89a2027021f0206a353a24c69679093d85926791222d1db719814d02defed55be042386ce8b25f37ef59fd727db962a6e61f29d827a6a6c02eb80107e0baa1eee984a8a7146988365bb92c685e3b7327e115d18b3a6adb0f4ec8b84bb7e60984607cb9e99c2d5fb79ec7325942347b169bb1cf7a816a05c322047e992d33adeda2415701da15faea2218e2a7bbafea5f98eaf03ef6e1d3adab7369e240fd516dfb37f42e18f9909a20ba1b84f096063c9100ba1c3b2589a9a058f43da119f04f99096b99b812541ccefe6fcb63ed28e96b224652e2b1c5101ed15e66b4d7bd461829edc89cfe45096b5d895308e4eb147f200e2736bda428084e337a8bd1ae8fac610e0abd96e71d16cd77624aaf745f8cb953656c81d2459e0e524774347559e5a0a1e07c408c1860257a0f76569b55f062e490b0de5d7828586d4611fae947c443dca328c7982ec2520c23488fd9c66ba1f4152853ba1bcbfccdc11ca7a738b0f922c8941381a3d7d49fbec96aa41e3ca5cd8e796461d8331e8870b4e02049f0ce50a31da1a200b0843f51d8439846005d4fdbb90a126b8b1fd3e991738659ccc4dc1cb6e92d9804c7d2ca3bae276d7e44b548a45661e50b90f344759de9b49d31324201e5e9c94696625e0b196062b254ede62ef08a544a8f3d190e6a950fc206a8f653628c169c463ff406263a2d886e792bfe1715302662d787c2b9f1c3e22092fa937910230bc542b1438a52a9b1f66c845710637c1612454f8a5e89537947468b23fd2f72f42c0acd644c4ed165ca00f8bc267f093f80fdab71a01776ea1113e2f5c36345038990068bc661dca2c0aa03642c86e27d8cbdd4a0d4fd6401c215e5ab7fe07a6cef05d46c331822784d8a7fa8051f469743ff259affdcde62ffaf1f2ce942f9057421341a805cbd2317226d88541e66e5c10f16bcf3d4b1d5ed731ebe10f4753da815926b1ee6f23d31efd4ab1115e3ec2cddc9c3c8b820c32baf0c73a328a2574e3a26658bf7fb41f20269197870a01db3db021ba3ae9a87524624df17fb94e73e6596990a65d70e492a99d3af321b37e93b2227503038b72f489d0004877ae5346f390cbfae192d380dda91b10a52ed9b7464378bc6d2bb884d2e65f1a11210c6813a8d541d04e2941d4f89a53647eea1f6ee04848f7e4c559316ec3ae6d71ce64b3959d67d34c06b111ff629e5705aec0c5aee4ce9bf562e6e1e06b8aa5d6b73192780ecd4c023d087c8370746f71998ae51176b2ed9c886438911e14bce6cd83ba03a211d56e45675d8bdc00eb59a28bc39a3eb846691cc7e6dadd02e56703ba2c1424453005d98b29c024ce2a439312e6ec7d8e69c8040c137d47aff30ae1f5a5ff2c5b387643be678da56628568ca9d85b3d0c0ef5dcd2253091bd3ddaff436dd79a9480e81b696183ec48999d8e6afa3a9826011c3c4a7328cc3e08a4ebff144f9bd79f71913ba364859f0f68b3e854187607be2b45cbeb958033bc91e24e9c068f0be4c7e798875345ff2c5afecb877c300fbd3a28788ae8008007997f9b33f0b2509801316e875704f2237a97f75ef6a6074f4e9d875183fde58a2337c29be2bdfc560dc02eed15571a5f26773580634402d886a545da08e5e2db442fb902edb7af6a9f3321917dc8403000000000000000000000000e0ee7304f8bd58093ab9290fa65d2afc9e06af392e43020aaefb12a384974cce5546dacb37f79b95ec0cc7873d8a821c65f5d75205c1c6ec4923bf9a171e7887d1c0f78ba201c9b6acda2f94dffcb99df7daa97df4cf95c8cad44563a3fd08e6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009238cdfcdc1e0994f694d0905c517aa6b38ec2f62a05f92b15a6f93012d5edf1687d2760bd58a3ad6311eb5816f16da65a4571fd96f1fee32c8e10d1ee93cae4c408af94c19b29da0df65542d451cb902294b217ade62707009e5b6802ed7ecb046fd384b2d4de8bd1ec5cac975b159cd667b5c52c8ba01e5a382e87c5ad387d0214d8b02f6a1a46c7cb78ddd42fa18dbec55028b5ab0e24e70818bc1dc0433701032a18a2dfddf5d00cc75d454e0a7edeba8c6d457f46809f5e55b1b865717fe5c70a052654b68bf2b79c0cbae1db349c554cfcd140d6cf8040a6346060376093099bd13cb267ea2047efc9597006265a7500757b5dff00f1d1adc0a4be2f5def5a48021ab8edf29ab344fbeac858b6d8cbe2bb4fd948825dc69009992adf4e083f7b6e03014e5d52f59a09c80aea54cb5900aeff7eca9f11edc2c6e1f9f45935269fa774022938d7ecb82d61598be2a7d8f6b61d510269dd3eaa620b37ea315f0e484d95c00223e4042dee8e2078611eb83e833ddf3524ca32f2ec71c43d291944b700709c700321fe2e0edf7e96194b2050fa376465cf5b39452fff6de3861f45769b2199bb5cdd56fc86d7180e2322ba4a9cc3900ad38566fbcea5a07c749af02f0d6b17233685e74153c31993d6e4ac75d1dd961426df68f89e37918fcf6dcf64f8e28622b59abd481f0faaa572b3cc7cc8a137bcb833d63ae6abb7ba54c32d2a3ebffaa1fd11d8338c4822df77e0c2616c124b710a08b73a1ab38d780ef411aa861e617b2659ed6fff79e806fb81ee8856d5baca94f6930d8fb542893f2d38811a8bdc75a6007f434b5673ab682209471169b2c74503a86d3d40576dc0deaa592b7af2f33e5bd3e69d6b158f70663cc5f19eec49814de663f1db22c07e226c91b86448f7bce0ff025ded0e25d66d77968b04ad32fffa09af98bab558e5b1d64f18cfe3c55156b5326157d4f5b0b1972d2d00e327d916edb73acdf1d45e14fc31c3527b99aea17ed645289d706af689020c6220b4daaf47140089f203fd69f648705eee210904e310d7a533f6d0a0ce314696e22af5f6502ab7a7c75306e87b6923342291318fc9cdc7f9bc2de0c9d59e97d57b551394b38aadb0b8578515e189d922960869eed31e422f0a9369b3a284bc730a0fe0dedec0fcaa3066bb155ea0c4d50ac05c275c5ab08d73b68c8fb2b2cba1c8104b34713bac9464115ed10099f267124341b74a43f9bba43159e07027efb0ae411af2ceb5c71bf8f63f9ec88ec238d62d493736c696e23615bc731c3dfc32a72ff641db9707ff64d10f922a1ec6b2a5cd9ad87f2c040dd2fb8dc54f27eff3e832d62ef98bd6b3a9c7942cab916e2eaa956d7b22176de8a7f3f690ca201274618800cc5fea9136c287bc869352e212a8506cc62350d448acf28e88420325a40fc42540d066a886f9c04527d9085d12c9f7673d227ecefcfdb606e3c7bc8110fad29661b41c24db0547c7d24cd0a879862fd379625dcb1e41ae1569f0ba41a8e6677848b792b4f4c44ce132f585772473a842bc239de9cbd28217d892d358d7094e1b61014156847a4d9695e5d061d41b8ab3d3c03ca78793ae89cce9c43b4ca5b49bcec9c07521e2898a450853e24f401dd817a09f68b676e29afc0becd6af33abf9a5500ef4e1497596647707d1f577d4f8755cb402793b2ceca9b347ca631de40314b1e73dbe79619318c331e7a1f6200b7c7d151dc430fc246fdd2b9eec17c28eb6473a5cc223162f1b8b2a570b49d2e1a3fe485bc35984f46a47f20855d0cf4f8f6c39f08320ec11f867c2b7c5148ac922f7ecfb637aec012d56950232b268676e2d6b1957e6d7f48f4d1fa2e775b93489f922295905b8517899c1a2c0d13eb8d7c97ff3ea544d9ede1c78dab17914fdbb2696c704962fce051a25a4d3e2f886e735938d9e90362e273e1d8a47f7721bec3acea5b2754fab152673aa44e1ac0fa8fb2e3277b16ef3d6a8ae7ee2d6813c5190d4afade9aa4a3f9128c435acbbb2ca3bcada14ef6671abfbdfc7218e15a98ba17596a2a236e3cbfd6bb94fde34c3ca32b0bc2bd42fe504f151a3f1705692ffd5f0166e8e039e8f1a243a3c8f02f1a9811596969aec261fc7528d8425fcdd5ca1ba1fb5b9c4d1dbb462566f96438e107777ccee625d9e316cacae1a2a56cd359548b3fb9b8ef57658b88887350a6ca070713b5df1d191aba59fb478529c4285b0879452cee016cabc22724911b52062a4c2522c27361a4b28494ad977402cd6ee858fb9e9173a2e90d5ba7fb9fd9c701c00000000000000001e1c6100000000005f045ab7203dbf152de024e3eb84876884189c84469622dfb5022d5fc1b0618788a02a2e3fdf1906a4f296ef55053efdde460e8355e6e6367a429ebd6079d74f4db962e5fe7c5489fc0fd6d1e87f4aa189e5b6e1fc48bf96d09dfe1d7ae88e0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000059fc02fd2969279e51c41c77638acade9a9a2bb2be9fdd28c7d5ce1db26586354ce95d006d4af9cc6af0a9a6476446904d184aa5ebe95d5d89eedd809ab4b9b15e4f7b7abb0b7a6b4d5b1a7f22c41bfe3b184e2e5e53b2689e322c9059037a1581b4f2d5100d25caba25804db3146bf2a8b3f7ca59e6facaa0e560db0d99336003256391bf0e59d17da57c9775c9271dda5348628089952eebb1cf8d3291fa5227020215b156a9cc3fc593104eb5c3231a398bf6b894ead1376ed8081e78842b9a5b0a01e959a992ebf1e57e606c9f2594d758854e6650724c3aacd1823784bd115c6319ab88a5e23aae0264258638c7fb860e0cb5f5515a7713e86c0d6f844b51ac8f0227cc7f11f8569f9bc16982e220a7479eddb609c52911cf6dae3da168b34c68cf030cfe4898c125a1b80a1106c2b9e7ae6a3c2792a4c6aabf6d8a6e02f7f13c69650220f61312a681779a712c595a077e1d95021f4ad67aa1c3c661aee0783631a33b0303b214eb6eef8942ae0ddea7d1d8924a41bb7e281ba3d56ab292a935191b3e64021a09d4ee1ab12c1637951d1792900fc5e36f8992f41f69b26a8ea8c595ce2a1e0dffed75a0c3b82c4bc2a3b07349280772cbb6a0d2cba3c18b2deadc19975189295b5f9573d54b7fce66568d60499980196b2d944f54e0190b27f80b87a56ff4ee96f269193d1b558faecf7e0afe742ae3cc50c42dbf9a73508a6e894b50a5acd4898f6ae554c8f8ece8a6f0f19828283b6c5b6e47c26c5e090981d37388f6b10dc6f23a7e173e39ff81004e27495c38bfa6b8cd648c663975aa500f6ce5c62980f3284898767d2dae4f6a55157503f559fa577d620637ec79b0411fa3d7a9a253985e96a26b0105750153a10520d060845dd9fe05596d1cd0b1fe6063813bf0e13e17f6d7590fe098e4291567dce89379da1232ebcf99022ed624000e7004577e8322706fa470a9106adb8fa8710b26aaffe91b648f9e2c4979935ce226f1caac7b4e039e3aa977e3ba3e0e07d1f37f9b0174ff79020040903590c5e8ae78eddddf9f3b58d14a729f1dba1f1d6f81a74c7454a700e9cccca615bdc64d2d06c5dfd35475ee6445629c26c12f22ce921725a4af3b082b5f3d33e9364d5827b10fd85f5e34ed37ec86407e86c96f8b144f289c6df4067ffb7ee3efaff1e73301e80eb4944cb129915376c037795a48438501d5475885613bc374fb5661d1bd10c16e9a60024825150dd20884be41d49e688dea92027c4ed3246c0542e9bc374c14561467efa9f7997f8779d19f2087754a3717273824730ecb7e3d61a13dc726155740de8d16d56432e461d7a127432756243be610391ef95ccbbca4814c9c7c66656040f40293514619874e0aa70fcc04406c9211e98bc46285b5e78d4380c70b7696773ab8d04534c0844e83585d70b9d19f87de038afff14a95f27f503bd6dac626ae6bd3dd4658ec379660ef92fe9b2266d4e6f782d58069340ac85588e692b275879414a77dd9138b23870134af63645711b9e33d5894c8543897852912537bfe0abeac596af0822de900e981068975abf42dcf8dca2892612273646532e2fc7ef257b1a34205eb973ef2e344c9d7e9afbadb0f493c49642895057b669c43cf622bef162768cf224f136ce6bc128ea5c4acb176899bbf65e2a7ee09f550353c0d4223c764f98876736b3521dfa3f80fac6dfb4cc391bd6b2cfb42046035d2016c135e9a33e2fdb99842743c2f96c8e88702d49a82cd73be8efd75a74fb387ce2181f33d8136ba67fc73e3f1e67d3d443a5110eb799c3e76fad9e4499cc9f19acf09b978adba043d8222321ba5392c37af19b4255fbd4485ab9c531a3000f236b74edf231582b79cfa83093d3bfad6a08b9bbb20b04afe7b4a74d0cabc349a75640f6b0ca41ec38f67a22993d5c0c414699d0c160fc1dd8e3981efe04db3b1487acb077da3aa86f677ac7aa7aacf51640da3c596c0779dc3bf66573f2556cb8be0ae04bcea9f8d947f7c50045fbd3d82a7ea6b111d3ab365fe3fd3b369bc65b03c229b07d7374e729049ba8c359aa2256bfd970f3e31db9896fff18f8f62a43f3caf75722e75778aebc1fe362486035ae89cc1f510699995424df519b3364475d7bd74981e766562b697a7ff54245aad8ff34aae8d2a9583d10194e8522e9b2a37c05b9b1eaf4fbc327027c1c67e5fd628c298a7ea6a2e50f6f9a85683af05847425fb517f3b18cfbfceff4ea110058913dac8251dacf24fa0336d90f6eeeeac22a25de1a6188a1752199e4c98dd2a9e75c50ca1379986820dcad4a55752f77d7ad135c63609e501f957149cc02c85f00dc316f77de7b7dcf502b750798fc4f56810e3dcc08f1d6dd879587fa6692c673dc66f8ed14f989622d130e5f7b005ffacf671db200a0d756a9bc42862a2dbda02", "6a", 0, 441155734, "c3292bbb74b1b561e7f08faaf45b60d69c35cb897bea118cc24a0be226bb4981"], - ["178cb25d0220fd6339e3e661440d9b32bb22ec00e956879acfc45cd2635d6b336f1e4eaa500100000003ac6a63ffffffffeac099a3ee363f9a7b534697fc6916a51853cfde436d67a3de72a79cc81be92d0300000002515144aba16001edf480020000000007ac526500536553a5108ee900", "6a656353526a63", 1, -801959471, "7146b3c34eb7200565f41e8c4824d67a6c9d489de2969f24e2b791b7e757bcc7"], - ["675fa166043b203659a46668233e9ec715c711b862cee94e42952333fc5ed53e854e6a4e85030000000363526affffffffc4c97abfc6bb1a1daae550cd7ed529097270f64309e598c29d1a73e9be13db2f0000000000046448ef6090b0a98fe8794d389b1cb688f84feb2fbfa0ed1cb496beb429a9fee0f6fd82030000000863ac6a63ac51526affffffff96bc21ee9c4b2f065f8a0fc0821b7308ef5f57adbd64a2be42bf178335e5bc190300000002ac52ffffffff02f3189f0400000000076351656563510039b63305000000000465acacac62e6dc02010000000000000000de82fe020000000041218b99435a4dacf44170252c8da714077def11fba2b2463e0e08cb0be75d36cba88c873c6b65fec04bac3f402dc48081fd744b23fead613eab4bca7b39e96845de7f37b140ea6c8b0dfd2cc198904d7947a96d8f0f829a72955e92e7c46ad7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000649b3733c7ba1b9d68c96f74b6b6ce582d49b48a5c0f393cbb530d55cb9429cd303f3a43e7334941a9d69cb96f8c95f2e300bfd66a07974b7ba84815050f2d9b81e1a09abec9856bc19b844df63776f462bf6384a3d4aefc9e4c265496e22a462e18104302cba3198e5ef997184da04d572d449aa9853dbd7503c9d3f33564a020bf9f301dda938463921c1801d5472b7332e8aacd5b77efbddad5b0a960edd990304386cdecef80113a975f3454e851a641dac612cf8ec47e059c4138332d5464f0a0011468b2b6b7ac62d4c102e7bdad1c4f5d63497f2b24af016e335b7bea026a220a89cf7d1ad750bd6d8a842d4f899c1c90201755a6b43f234e00b66920334a0022fe9a03d2da89991cc9ad2a227d424e3887268626249d4e723da601a7e77e19602033d0c57a0649b6b0523e295e3c07d07e0dec976af52952284f01df00f768608021dd762a2afa1e017e4affe27d51c478228f8c95f892c6fdc39a9f60601d7f5130303ac542d41bd1ec48845009a5df6b6c84121b690da3763eb70e46b226a29bc4103196e227bf62e49d39c90665286246225df39350ef5d4a4bd0847219bbd16a6c7ab7fcf9ae6b539bbb359e4f3db05e1c2309d7fc28a77336c768f2c2847752d24e59e672bae5fb19e9db642cba26c5510c20db51875d055e2f53aeb2ca56dec8de03d2ac1e9583db8550b0938e29206631357595e40ca9e746867c768b22853ee559a2662a20a4dc8d1a5c2e5954a0e3f9b3fa0467c71bca83aecf0a7b418fdaa6489a947d731eba98a3b2bbd448ba0eae6a36f665d279e9e7d89c90be9cb3c6a44c4c384734190b8dccfdf51415a729c71d70e8b3fd53a6ca9ea692cf5833f9542b8813039e5ad5b2db8ac46564c07aa3e491789841e0ab7b15afade0931c8674b568a13d15c39642dd998ed2870b3bfbdb17b413d712f7626bc45a2559f6ddb41c40aaebdf9bbea4476664204b69c8861a6e5a87a9feb7951f3993fb4a65cda01bc70ca11f934764af0918b0662f02a324f7ddaa0505cf40855a773ff228670521e1fddc7e42b29879a90b8fc69b2b5ce72f2a786390ecd7664155f5f95ca166c66e7d39f761f3f5e80ca818bdc80933f770145801a712de41c78b8d725b6ea779af319b4ddfcc68ab40dd0621063cbd17c6ac618017dbf328a8336a35e3a0481a8cb4a53bce645ada17fa1ee77dd73cecaba0aa62cd1ea0cdf991ab1353ec0d0af254291af49bccbcf3e2df7e9cc35a4884d420792afbefbdad25829fc0bbc6482988f54b31b6d60d4d04b30709c5e9cbb99e629355eea80b071c149fa95a9671f7431d3feefbf2da371cc3b249dec6355e80566807a6d26cf761075bef015b93b2368c81fc643317bd3807a569250dc3e2f4f34b3149ca96731c7f06784370b5be6c4ffbeb2631342d3bd4fe8836ef306243b91c52e89920db4a333ce4a3d5d3462cff2e7052f1d461c3753fd8572e9c75f3dbdda3de48ee0c05369181b8269db79c42a94ce2ddae0d01c0d01d4842e33178948a5439ccb14e42c293ad6fb240e59673e4f3f148ad07bc31db50cd01115147aab51f4ec90de9712d24f5519f59355e99f8eef074e7f195d23e299a2a4df634588ba9f849f5c19c6f04d662549eede72bfb7e00b9b93ba27a8de2c3873597433d8445de823daf4eac0fe939397db6c427525677760a85500c8dcf7c2e89ac016cb90d24d811f3a4188d3f1e699e9d2f46f00a7ecd29ca75cca4b9c505d3c9324aa1111e1dd1452ad6dfc9e26eb9a749d7001be802e0e1187fca83d6027c3192aa9afd8e944c4b1c512ee1cb12ad92ebdb27b86ef377d1f78536933331428b9350acce8641943b673359b25ffb7f7317b9d4062e2a57849953c5c6f31cf51937aceab3db6cef3d5e4c7b923898dec87174a7cf38f03657e5fd055c932aa0e2c31e2faae5fef8a588b8a015f22a13f9b5b198f9f919c3b135f7fdee15c17f64238498447e88bfb8bfe2afb6e27ae61b558a8d8cbdd3389d8a494e3cf10801faccb1c043f3aa0b8cf9ccd57da5b8b8bffa29f4fb655fb1022918fdd28d3b603771854cd08994ca6d1a16255aead0a05c702ffb416ddd79ebc43c7fcda150727de9d71c42448a00afbf2b7de1b36b64e9dd0df07db64b5082718e0dc9e00c3cb950bcfbe8ec62e05e32aadeab0518ce35b142f813696dcc6bbe5aa47c80cbd107b18cb6aa145b4108e38c69dd1558dda9fc003883252f351e97a58b3e7eab6320774ebe4b1919febc97f23037fde326a5fa8fa886326ed202f319a3d8649f019b5e794d6cd94d13ed2e488371b08bc8038c1c55ac2079f139aaf7f19ed253b05da1fa03fb79fdcbd501f58d435965f3fb23b74e428c673fe06965a03048afbb8b4fbc659d97718a0bcdff55142a6d0604de83927025ac0efc14b3d83be310900", "ac63526a", 0, -1745775988, "dd2448f1ee4b0620d54f48a5eb8022e94afe32cbf156006607fb1e1726c74778"], - ["030000807082c4030310a5951463db872fce4431b3e8d61661177a6b4191916ca73e38d16114ca1f39020000000765ac6a005200006d9cd0b10d690822659aa3c2a71d947e1a8c28ad72b96e389fa19761d21ca0dd057b5a1a000000000452005253ffffffffee4696a60c13337c3854cfbb70456fe3b3adbfc4990121350fa02ecac6654fb000000000066a52655100acd814b0a903165d7f0100000000025152e57d2303000000000952535252acac536563fb3a4604000000000863526353635253ac790be8c22c3a38e3010000000000000000665cb80500000000d7d29430113c95bde39db23b8720e6a3e9b18df50ac143f6272ef25dc7d8a72927404fcfa46721779bc9d329d76188eaeb1b6f75ed2c201314e68309d4de02ffcd1a72816c5fd63fd0a6df1384f0ca5b3156ac594b256e0f841624870814594500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b7cc5243b32f33fb70458192fdd00b1092efc4e29655ac0318adcb8a05a893452438d9d889ce5f19c121afc7486d11ad5382b236e49212b7d8d7c8575b86857d1401d21354e61882c19ac04a6dd797f5737b1b5da7fb34d401c3c3cc4b11eaa95717b9c3682167abd587c0eb5f88435ed15a359ba63471bd36cc5e8de0cb4329021b7129c4ff71fc23ec870b5a926f160478e696779cb2b82d1b606167193d33d602215cf2224cd640547a40aba7d46202ce3723290d50d871e9732d76e48a92e6670a062ed0db38c4c81eeafda722718655141e6b9d854b0d75e497cab514a32b43df5e0efddedb7c3cd5665e3c187dac9ad7846971a0b4b77ccfec29295028e891f202113c563f1dd53d751e367941aa9427712d3c70f9ef79ea1acc6887e4a363d4bf022e089eb5e6b430ddc9d98612762d397f8d033e49dea91677f49e61688e6fde4803026f9333c6b3f64fd1ac44d2274eb95b1a06171a0387f226803a8d89bb1477c7021ed62973dc260d69ae26b76d19ea450a03f0cb0b5a26b1f38bbf62eca4169d2603209cdde3c4636370876acd061846464b64b93cbb05f69616455cce2a2ca4ca4e3a9de0f52f603e00b93f48ea85de0a4e04875fd56690b21ac44eaeac2dcb09d3f61abc97c02d2ca44f81aa392ea2201218a87efa68c2ff18c666a53c9848aac3a663c511c9dae60facfac1fc9c959928ff8c31a96cd3825529cda08151efd644945c939504c4fc9f9f4ad1bed894541c04335c68f6b7ea3afd1c8421398fe73c77ecebaaef6d09f452ae3be8dcfc0e8d5f8c3ebc06a5c7956b8a7f6f11450b7441dc0656314340027a18ebdf80b74ccb12d3165cd4585142d4674b28414fab0ccd81603277b18f4d99c7dbded5b5b689a9820af1b98ab9e88d4f74dfb7cf14a73d0d03ebe5132dbd86d9307cedc9c56ced54fcf845a6d8b12bb71298117bba3063dfc22d4e2d4d1394cf8eeb751c5ab21ffebdf28771e6c02f50759a5e11ccc0488f7f8962343f50c6eb9252b1a3dd57ddac8fc41819bc8af00ed83ca926b0587e96315947ed8f1f2078378aa9c179f57e6b34fd4c44dac1ba0f4c21303258137707d30d2bb8330e0f1cc2eae6a7b749f8da65c1451b3e9b7adcab8b1c14197d77e7e35df4c358f4f91cbf744477c63a27d53ff744e4748d3bcc29b34d4000e811778eafe9a438dab02a8cac6da9150c5bdfcbbc016de0a6518f823fcde128f63c0b57e8c8f86b89a955f0a0a7897523b0a85a8a28d8fbd7d5ca71c3104381a19ba55f3b2a16de7efaf48586a95a03a10ed5413f62697e64e8f18e0bd277b03705e309b9748a179177ab22dce3567008966cdb3650a8f69367c5332b8f0ef519f56504e72f1a23e525f464695ae3443f40786df90563f57dc342072269affc95b3102692187d01c7532dce6c662b58406641e9674a83e94c49c382bde3f38b57dddecc3b3ae4320ba4d938c7188f3cf02ca262d45eefa6d4507689d9e3d0676ca5ac9afd776876d407124009167debf57a33bc2ee0163f18043d45fbeb47f2af4138cc90f951dbc4d6e90c08a713985c043d5a8c2ce3cb743b6b1167120121dcb5d525efbcb6adca4b1415d1fc1b198a18f455f98fd2816543b523a1f32de655ee0fe235cdb8a54bb468023eb41cb5816892e891ffc8e9f45af22310c39e47c778ee610e24549ecc208eb748b07b6427018ff2a82755b5e19dc0041b161701b0ea812a6c7bf978e404ef8c77ebf7b513f9f5b86d26661210728371fcec5bc05282528aafb0e8c8cb3dc80d41d114f59d008a4c1aa11da9b4f3e9c3da082f3001cd377a302b590f16e94c7df26b23a6433d894f275968e4d9df5dccf7d8d0b14c7ab9eeb7ef1f810c1cd3199110cec40d5d4c540ea8cd9fcd614a667bae2a81660608f32032e005de91d43be89fd3cb1d37de62e2c243daab31ed0d9cd6191afbd25321ec79340251c8a72dcaad0704987c0ae4ebe593506ee954e357ad655cde10c659b247fae9f71055172eafc9897c966d5be504d838262548fcc034c858f348203a1819094545a4101a947e0efa3a30cdf42f738823e27ad7b8aebdfc216301a4b33dfbf460f47538b4f5ff8a19b88e260815b11576ebe016d25058071b05a12ec470692aacc91df2ea11e8bf4152b27b5bc3d7a29094ac5fff125ab54999969760f2279e02ea2b5fbdeccab346dc44b5fdc1d3edfe217486a8b0513cb1d209b9bce06e9949327a8cfdd987596aad630518856b1106bbb504afb988a3cef6c66b10228f6bbcf7baf0a39e1d5252c6c10e73e119b677e48300bc15c48ed64b01d7ef8f7ff70a84a9bd051a29bf991320afb3f0fe6767bb43983a9bc48135ab72c28f1272a5f7e3866547d6c89c412fba2f7843a00ad4bfa87611c88902b24d6e8fa6c6a7c6706fad2c01192fd269b6a305", "6aac6aac", 1, -1002125106, "8e34fdba064d3da83d64fa767f789670ee9e5638094712052d7fdaf1b5dbb409"], - ["345ebf1c0499e0276e117bcbd2be4cd9b2ea32e3968d6277a5f6445b785ce0f89a64a4f5a200000000025363ffffffff72e4bbb42b4792d20b53b73e92fad0f5e41525e7374915f2ee813fa5c8aa9dc0000000000653ac6551ac632b6fc4067e5446c2c0f63f9b4990f545cc2ac76224cbb50420dc13a7ac1a92019e3a7ce40300000007acacac6300536affffffffd55cba37d221e7a799486d2071c4ee37d070097e2d1f1d315bbcaf345654465b02000000056a53515252268cbddd0198b2eb02000000000763ac6363ac6aac0000000003e5adbb03000000000000000000000000c7426d3481df101f3d3a0782163ab54bda711f7c09859c4669a691a6344cafba4248865a153b160562e04e407959d10df00c4f6e5ed8a1e4e6de24de0aeb7b03f2d75b84e69411516c1b02ce0ef8e3f430bc7a84238f54d3055ad498657b1e2500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ac46c49dc7528b54b3aef0709adbd1dabb021fdca0fc25ef110ef3051deb771b5250467dcc2e91404cbf438265b86d49d7b96ca7ac91b9bec9ca743da985eb5b0f477ede78fab9a9b7d88c2c58fa92d6538fcabcf372c68116e4be618aa938bc4b061936a2147b3b5edabdf0e3ed4955da0ead441a9464ac9482dfb9cad55c38022515e04290e9c4eb8306f79bb7d42d7a8a049729140170ccf23a8f6eb4e224aa030652c46786c6f55f798aa283930907d716055d3dabb92353c1abaeca6e9d38370a05bdd25c94c48bde56c92002b672566c8b02d804a9f7a20482439fa81fa4fc97ab0b72ddba94945bdc61a0345bf91004b0b5601a4950a6815074fab8fe5bc09e0305ba2b1dbe40b54de47dc848022f2c02e259ec81df3beda399016ced9e39d69a022f6c972f47a20a5552a6f61059227fdd0480b996b3c75bcddb731f8e638d6ec1031b0049a5e99a4e9996f722903a04f970f50bb1470c33008347cefe5dc9d857750307d3eb060e24224f2e332c0307b8ac2fa224ee36b8f24403a070bb524519377c032f45f8997cee0d045ab17d518c30e0700f49605eeb1e49efac49c9d6375ac8cc671d0b919b98d23259fcb0de27eefa75472f817fdb026fbc6a089e65481100e3a5e4c206fafe821c84d32e9d734eac67fb9d20b445e0b6570a898e0dc402efc803de71f0c14bb40c6902b9540613c0730c3dcb992ead8b8e11d2ccef9acce7c081e3e0890c64091e610cd5934b61a7e57aa68cbc9690b2895c53bf6db5785f56afd2156cee8af03848bd3b766cf5e55571853c175a946a52cb9cfd995914bf69ef7b885afc10cda0287a3ce30620ed07fd25f6e694f783510aad4f5e92458682f0b139e7e3bcdc7f2cad7b9bfcd38350bcea0ccafb49dd364b61b98f6a3babe53485db24180efc1ceb71a5fe4cf719b6a1aff749d7ec0ef2805cf10eb1891ecbdbc87fa929dfcfa2f7ede52781f63428646a121ba3b5f3e73d006fefed03157e148b589d939882e6d4bd5303506d10541f45ce71ce7341d9de487c85bd8605dea9a156be7a122b4e03c7ebd224c7840a0e085c6c7a44e37514f122852c707cbc2156c04bd5f45349d428e9b20404f14b11d0d7a7d82c4b1d741bc169a1c282e95ef4d1cc88b58d76173af6a4affd0b3ebd5901ae9fbab65fe60eecf65f326f4dbf4339d1319538fadb31e12d43f9da27c0635b8cc0bffbc325ad9d6c32fa9d2adf2856f0838e6198f581801b8fdf7624f866567bd9c801de0ed17ec63ae08bb1bedc471cffe516092d502d2546af48e043aae9fb0031d51acad694accab9c36c465644a35b298c28b73884b289f210d6037e0fc6e37b0d7a5ec4a7cf9671618439e242282abfe8ea89f50de435be180adaf60451566be9de3f0926472d47bde14d15fa61c3c02cb7a6e54ddb2cf2d7605b00af52f84d255852e91a6690f340a6c6a65b400a3c3770e1fe768783b7a2a0027a2df3d4ae57c9b4cf59d01e54ca84c6c5b3ae3420687fc756730803424052da134bf87a5f924f4045b81716d9ad77782e20e597d82c7e74506483a26f86ff66718795f0b0cf29d23f2fbb2e47dbc85f60465f3c7bbfbf6d4d97de816dca14d1fa9a520b780cc64aebd7ccfd4b35875700b357f0aa5d2b99767f8c55072c07dca60197c1d3b2ec51993b837b0ceb71885ccf16212a7778bcb90d480b1dfc63308023869ea9de0b323c7d8d9468a887498b698a31bd01dff39f017b8cff75cff6ac4c487127419376b56be0b3f47a4cbb69473289d64b6a8ae64ea949ef4baa0b250adcff33bdda05929d8557fca887a34e1b392a884ee441d3489c7aa6c5bc65191bb0da815d364bca287164e3bd4386430799b7d91c1f61065d81deea3ac90b0f9adb8dd66050dc5e74488ebd0963d608d36b8257c13536c925b0d4c31a546b153b60606e1a99b79ed27a0058c6dd8d839f3b17dbaacd7e842625dc60f31fb430e0ad30f8702ceca85fb1c5fffeaba7c5a879b032081287d08267554f612a42dacbe43ee0f1c9d42f71c62786073bf10c7cefe45139af7470a5ccafffa836c40ecd7b920a35f4979a2dcdd3f16fe319a630b35e83a1f5405990da03491df31d7dd371ae6ec1bed076c2614fd706e0126df1bf395ef69c455c4a8bf89469a1e02ff6fdd921e81e9678d8ab954974e8209bd69f753035700a699af284c11400244baf7387f97fea6c17c3f6852f8dae0af76ab331c7e7bc491b8539bb2169ecba2bf2124547d3f09284c02c589ea30d0d87f455885c77599d4836e481d5cd15e576000000000000000004fb6c0500000000ac8d3cdc32b0a1b8ef021d5f5027519f4f75502abacef251b249c5033d86aa016049456eb6620e2521b8551e2ed6c156f5f6d4d14a5daa4bafc0f4b3b6d2d6de91ebd33c59fe2fffaa35a85299af3afb9415ff27f84ecc9449110822745334c8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f58aefc56841b4d6a38fa9de85866ec46470a997e83e46f25ac928e7fffff09e5a3da4377db64b461b53534a26a49f5d465c64956a21cd118d973047bc5a74853157746b3e549fde1bcd575044d296233c3c119272af346811731d0ac6b7101b860054707570f6d9215af67b1c730fa324610d12a9ee226f0377db3ed0b6114022490f9a722aa3b5ac7b41ff1897f3d4d94575a8c140e99457b616c4f6fcf06790307aee4d36d8cfe62d869b80e6f301308d3624276a3d75e5d47fc18d846f54d170b04dee7d1bece29e5313457ee64df633e0dafbb060854b64d71c365ab9bdf12ae49dadd9c853e58cc7fb9678ec51409e8454aef660c7daec57ad7290be35d76fc02042d7ee8e1b643c11045118e3ccf1947cd522d50df98c41c98bd3183caf665cc020ea493bf2a1073930cb1860d59511f59004e8c5824c7c68866f7a3795965d24c021ce78156a38147627c2c33e8d2175a72fc7071af176e30fc555ab2891a0a57f603200de34500eae990b9fee873ebca68940e1d026fe8c0c3e1d5fe5647f98a4fb0032d0814747162c27f5a98218eafa24ebf8356e314adffa278985846182e283f84f1acfea052aa19c970615e2ce6013151a3bf18ce630aab981691eb53f3368cfcccce931e1b82c97e01407bc48aabc121aeed4d0c4fced9c533a3ffbee7cc7fcba052f56c91b3f275a8c80d20b18e69276ab8787c1298d89608554c8af992004e7148974721eebebd7e5e70c334aa4bb11d7487baa72a5ba6f26261dd16ff9f418d8fd5e791788658541a9c60c61b1b26cd3c67fa966f354b1b92648e460177c478ee2184bafd8baa0cb6ebe0b5fdf650fa3c2151af0bb8784236023242a8ad3b49fd0f29f1fff29e998b752d7ff1012870cef01c3ce62b11ba46fa618fedd92fe782a533651e02bf9ab58783128be9225bfe9febdfb8163f82c1e3af91e684c806c4c1cdc68c6a67a0ee34e324bef9ca824e0c25b29b9001148d229c8a672afff5ef7d95836eb083e9fed679846df2fe2daa81263f34a90e8f2b8498f462c62542d9eec0aeb53e1fee2dd965e2df8945fa8fad851b7a7630e5b524819439a745102a623733561964a9d98e98bddc4cc86071890df9b2e322f2948554801cbe89868a9beb8f0c97ab033f3e62105e9ccaae1fc0db41a19f482b7ba5dff7a39277f1954250bb4e20ab2fc2a86a19c26896b1cb5a46ce5d53545cf875d39fef8bfa7f44ccb49ecae91954f21edd6bb9a05434c6dbd22604a9c7cff7b5b6ab89ffc37519123277b2fb696d52ca5c05f5c0c294aba1d7a8fccb55b732acb86adc07fbe5b642be2ffa4cc0c635772726eac583f3a32eaa11058ffa640ff1bd3f1ad6aa2c14234469e954b2977d7d8417307669fadf95d560f6731ba572231add9ebd1f6313e77342c020bc9e530c0f4168fa33688ac36601253d511b61e5283fea1b1dc4407e0ce4b18161e08ebcc872ff0ce0d7c414beda2a0451685f10ea69d30f6333ac845d1970490a80b0a0214e999dafd3191b403909820a36b5254cc8fcfaee7346dce1de37f83afc671afbe0d47902f450dfceefdc4f72f510020eaad4a9d9e74baf9aa2d0fb09cca43a1da10f4491b80c167adf5e9a28d9481e8452078f9224782bc1c2fa621cb764082788e6ceb81d5d153d83647604b373bebc5e11498e30bc679bade3945ff8b641d2fa60f333458b37ff05fb4e249962fe022d62eaf8445386bc29994f68b715cc229006ba1937eed66845d93ef36e2d5b907df3fcf117ce0d3cdb848bc1fbd79b11bcbd9d09e2c43517b88fd3ba07e428804dca4b4ea609d6fac4ed01f001acb3740cede0ea7af24d9cc9d0ff8b87ed90013cb87fc15be06011af583b845a4908d9b32b9103376643449255851084021364f32537f2880c2b598a05e64e8cf24c58a298a4c4c2f112bf09c0c0e970889b787aabf78f00886c4a70e0ff82fd98a1058dedc42409c6cddc251836550f59f6092f77727bc79fef3a444a62d7c3a1e97834bc834f47c99417a98a7e050fc91d4bad6caa70b9f1afa89ceef2fbc1cbe0e8954b9615472c1c925b60f1ef04537284eae86c888ae5103883674c3b6bec276110d61273d2a07404bbdbbdc89a5e63eff717084b350932f2a5c7af6f97e40ad9895bef1f2f2285134d6b7a305afd704eec604d918b4a660a8f3dde6f7cff5fbf54c1d0a3f48bf350b63df79bb53e8f6d625cf4b6c8660e397e60a7a89d4512ab4cec2f4a5a96382bfd7e5f4dbc4ea6dd6568921a160c47259ee4eef770fdf37aaa851f26b92e80921b010000000000000000000000007d7843bbc37b1e13ffe77e52b5ed83fe09d6d876864543a66b9336daeace2eac7cab6dcfcbd4e18a21850a049db8f2dd5b2fbad179934c651013bcd1785cfa338f3a45652b362d143f1b873dbb79481e7289b67ccbf99d9dd6ce28062002013300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ac62f89c081a04eb4323ca092fbcf9a1ee9d33ebe5ad1672953c1d708abe22ba0600ee5cec186a048166d58d8784ce70aedd424b83217f05c4f4d310abdc531b18abe15b0dc2bdcf7f25fb86b07662a092853a1824d9d88edda63b3f4fc28a4581725685eddb73c77839bf77cff903c6f5643704ce3843f4463455a97b647563031bc9eff40a1bceea945d3d9721e42b1300fd69bc337143eb492697742e50a90e030bae4880c1d8b6ea7f38e2c9bbb6c07e68b98f15e73b1dfb3e2ad20faed944ec0a0526f61c429ec5142fc89b10a763613ba0c92e8eec09df476f9faafc6457a7db13cb54ac54ed44b2e35467b2afc68cc9b4915a7327f9c2b01e0aa3293512b0660218610fc3fc227b0107f85793d01f026e2dcfdde7940201d2295b38fe117d1334032f55258d105426ecb58ba1a57eefcb9bb0d84fe721390a7936046138dc5d86ee0221e76f9971df2e612c26b664d78f61fada29d2923d4a956958a8a2948822aeb8032f70a2330a2c5af2db4bb15a80916190bcfcbb7f1e508aea74cab4f162ca94830218467e5449a43f659037ed1f13a8c81ddb34b909d13da77af750e00fe0b70d93476e7ececd059ca6a9eb1da2dc5cc24239f749f07bae05c9d22c78e71e50a8d010e05e77707731dc7c23b5ceb493705a8600416023827fe39cda700e35dcee2c9d205e98722a515324218b5197d11b643f8e9f13ac22d6f6fce90ccf97188dfb367c8fdb3a5009fdc5fe59964d790c4d50452568fe6231aae6abf3b73d44b34d82a1cba6e2c8cdca27fd5a6630b9834023513c8ecf02cf210da74eae860f83cc95345b9deb8011366a94219b4522d3986b304f5bfbd7e55e09292f96ec385dce173a0f595046b6f3868855cdd5dcaa6d414071989b45c63af97b10628ebd1c0fcdf56d63ddbf9280c791c58bdffd0492be414f9253e80566c6cfd2212acfee83aaf222532a818365b30342083b291266d7e45d7154d7218fde3de09fbff2c22293dfc2a5b5a1fd3c6dc1694cd4b6313fb869801ac2d04188f45dd2cc05d2432638af13516412eb3b3af4cad2f58e57dbac8b370b020ea17e683d7bb86b068f1f234312c10d1635cf4ea42e2aafd0f8642fb7cbb34b4907bbd17f7f98238706ecf7318befd8db71121d9306a0147f123ffcb8352ab5049a3573a2a35d8ea9054d93b1eaf311fb5e4856e2258628251cd1b106ce1f32ae5e210a15b9f7738b5890dd208487fff1a8778885a1ccd0b3d67bd39c6e13373d4067be3c24bb5fa37e4128f43a062b674731963fb6b4416df729034eb1f3520cc96d3537fa9733c103451144d8aeaba6aa5e612a79bb22807a382e7f676dcbd647d862bcacd0afba46af3576bc2629a7f3a59d7754d129868ae712c28d1bbd569d8f44ed80c667516b748213258b5bc1b0460961513af1154d3d07e8f69900aced4518987f431ddf18685d55ddb9f7d3c2ab7da647ae13f7eab10e26a60d937f617faac46dcd3754f984e0a39971da23f948e93cced721a5e47a374566477964510866931f0fa73327beb7e594b255efc59f792fc94e2668514e95ad3a3817afe52739821bced5215f9671625180163de5bcaa2c3b72877811a2100a1b2817238d5581925badedb2ecd555b1685b56042aaa5b089ec413b8bf868ec6fcfb0c13958df21b8863486e0d99fc19f0341eef60fc03cb5a3f5e80e6902f811c53ba4d62a564576bc2f8bea2d197d03ebf4431486285e641ca4765ed539c5481314cd03c29acfa1a88f064a0ceb95c41b3f6166d90b532bd60adfc08e61e64cf030ddd2bb3553c711afd61196bbe48a3031e834ad80e617e8e24df6d643b2f853b1fade0d92bfe0836210f116eb98674e3d9090b88734d2bd1e0f203d7c7eb694df5f33a03995932b1a44b78a9d6dee15d986cdba4b080fca168015a08e8dece7a83d6fa5f542df5cedcb524898d476db1395ab24d803bf0b6f69d4f764b31a5291a4fae768be6cdb6a4e3347b43e6d7c925126d676384c5cc3c371925817ac6b0ecac5cfc9ba91c6ea9e999d889e4d18beaaa04b56f1d937abd241c3c1432377c5bb01c4babaaca30d32a4dda80853c808bb0c4772f4c176e932b6e869f8776871fc01166af24ce23ccae7b2ce4d1eb64764bd84e696e07d862cc805f394f68dcdfa69f7387f1cf2b74145fc1bae640ce1c202cd12731ec7baf04f45d108e52ea5911b667ae692c90d1eca0d4565bac83b7cf1c14620a2d737fa09f1a3e7c904725b4df9bd00d048cc76d11dea3363568eeecc0b16640edb1bc0587668d63eebf9e0360b75fc774e388a9057c44c112e1517ae2e2594d84b5b09c3606a19f82d173733dac99b526fdd6e0a73d5f95e455caff8a72c3d74b727ca67ee1ffb6e232a05c79b100a9456d081a5c5953a1f1197ef7ea734532252f7c062facbc03", "5263", 3, -746429655, "6f99bb536d5b77b8ee2ae45fd53f85bb582da6cbf09c61ac09ecc27abfa4596a"], - ["030000807082c40304b60c093f603e9edb1a896db4d10bf05c831cbc5b3795f8c056b391107764c87d00000000046a000052ffffffffb7f4bd4b02d485f07c42da7347e7604dafa2cdd8e47bca9d3bc855039311959a0200000004525163acffffffffdcbcb64448037bc6023cc4faa99902ecf889ed1b562c10b93b7fcd2ef78478c703000000086aac006353006563ffffffff1c6ecfbce32b48538846ff29c9def794ee49dc77f5cefa5bf9a6ef84a7d4fff1010000000163df7980c6025840be00000000000353acaccbfa570200000000055165525153db2bbfa70000000003cd2dfe0300000000000000000000000006a3c888c6d0eb21d6ccb86383b29ff1d0aa510669309eeb69104129aff4e593686a326bed131e6cf5309ae495d10df98fbd06af0faf92a26c526b5706efc9dc077653052ed873915e0f4acb3513c11837a7d74681f5d8aba13aaee1cc77e2c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000199caa7a6787803e041cb418976b8614c5a1f0cfbc853b6b8738822af71a588fbf111828d0c6ea60bd296cb698999d649381f8b1f8afa3417ee3f33b3501cc121deababf1077de9ab0efb170870d1ce40bfe86f46b3da58fa3f8451db9ab91b952cb13e5a9ec6bc05db1cfd73163067d3324965bc3dcf54883d3975f50aadd540202123d65484a088701322d20321ad508d05068935ff0368dd437e21d574c64220228f2bc7cd04959753edb6fb9e4d70157b47fae4ee4a530b7caf59ef9462c164b0a05f705a1f9d5c46966082082d95038a84942ff7f2bd1377640b7790c760760c23517b4d3c3ee217caea065cf104b150256d4e781eab7515e0c05cc8eb06b7f840314990f40334da59ca9681b876ad8fba55db8276d2bf5142aaa2b01137c8aaf820223825d96a75b207f1086a5d7dd5c8d42c4c496d62305734c35c1e903a0ec3e670206c618e0caef5b1a16b890a766bb10c7ced9896bb2e1321f51aa1fbcbfe5fd32022ced51a7e8d8132cf065d2dd1030cead0ee2c25ad941358205a141c6bfa58a0d0306fa68dee89adb254a2deebe7cf397dd0290886b5a7301a64bf3b66c2cb7fa865bce6a014e8e35db3c2979d00f68f40286ae6718950023f491f6967ece8eae9e8d12cb57a087e3dd11b3994f7c6805592952a4abc881a5635b55e3a23266243d2f1608a8d8ff02284405a1f874908e448c7ab9f23f9b15effb430733e7b5cfa747c1c967cb8b37c1b922b86b9ff9358acfa65f15ea252cf910b4ba9038314ce189c00f87f3efd5b031c1e8990d7a5b001870b62df4f9595efab948643985019d7610bac062180d331d38835d5f5fe775a3ca358a5577eac018a66654b855814b293d9ce64e003d6ff56918bcb08835641c43ee80cc99fd101429bacf5ba734dafd22e7ffa29e4c30d65fa8c76e954780c5ce07e82d2b22aa07a05506999a8bd0797c5c70b9ee59886d100b9bbaa31df5c2f1a624870cc514001cc27a52a7f586482176a3b1f95f1aaa6a2965490981c39675c2afc616462d969727fe8a04be4177ace4303c454aaf3079786a1a081fd9ead100721ea5443f3546855d28d32cf92380c5b517203e1757b01e938cc2ab82b0640318228225fd4ae737857c31e7dbae1d22714f26f16b6e5b0f2f6f49530a75cc5240e79d7a748962f63a052637de7d9f0bccac3d541c0609bda026b5ef50b53e2d19f0230861eb12c5136e7cbdc663d3b05bf05c980caaafdfd6a091bfc27aa198abd154751171c51130c4b594e0ca287b2b402a60883f04097c4512efe576d63a09195294bbce660bb96b56ad5ba1066ec12839f3daf275e1cc20d3749219ab562dafdff14354a3d0da5f1bd6c1e3aa44e641370da79cd4d2b6cf69cb7fc3473d8ff6a54731e619f158077401fe0721b34f4622c39db6811a798101a24b455335cdadc91992b1c1f7b36f20d8e630c76d2aa46a400dc35059723c66406590578488cf8c6d554b952a03701f0fcce8f143cf246b5515dc443752084d0467fb04210aed5eb5724e0d593f0c4a142aa75f4bb469dc8105cbef49da8a4574109bbb7ee60f853d23a51a9a52779e3eceb4fdc02582587457036312738c628c021b3a3b030fdcbc0b79d2f1edfaa99f54526257fcb7798a81f9eccedfaf30aa03e52e30eba5ac5a6f3ba0bcf6f27bef229f77e7b5b4f3f99138e8a414c01c6858a3da0ad151152eff781b33bb49276d00d2230c44ffc9d0a55e704f5383a6e2a74c7d6146b8ad1238f11c7563eadde4a7b20f6607ded62b89a3bcb3dc043ed0182a1145341c01eb67734d073fbcfcd2e74d647bf8dc318076b6ba2d1e489bb0564cb9cc0651fa38fbea1f7967eea4f1cca19767bbee64a530a97fbbbcf3b78e575f77903283fcb043b219881c5e72e5209dd193caaf703885fce5c128f23f71a0bd779c52f335e6dd5f1248be71e415946c8ff6381e7d32254f0e366832d647700263a47f23f4bb15b318ece087c5d18df919a2586738f60ae46592fe32bd268bed4242289a61570caa734061d3feb7c22e80c15f6bda0a80fba7646f5cb305160ff2d533bc098325aaa4461029cbc8f734cfe5419091f2baaecd4876305bbe1f04d0047d203a00e1dd1c65b0ef08de279c264ba4ff9afe968ece2c83a7eda6a291db3d62b1afea63e6cbdb21c851dcefec5c0012d3d1ca81a2f63ef7da40a5275f281b851524cbb71b188fc931db35d0ac8f09e8c2a2d5fda530543ac8ca56508e8c0ad043fd6e7758739b938f5433a930d1ccb7a9e8d510f27b5a36e2d4811c5eee000000000000000063332a040000000010dc5ce5f159cb99db2cb1200855241fd2f100ddd91c32325c5c4fa11500c8817cf0032209f14c2b5dcea7c5362ead8cb34b051a57af45120d25518c73eeff6e5d1c55098839f440cfb0320cfb40d475b6ab9ada87d523f8e4c75f0927ea77a500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000675730d015f7e490c9f985fe8bedbe7b783a51ad492c87d909887cfadc1e07a59f822768ab26a0b92a8f670c181650921a50c79fb56fd41f6e5822927fba5900b967bee0c9e61cc8594b812e372b23b3590879d592e50c60c5f6a36763bea1798b5fb8d00c69f48786ada5a57b75549a0b41aba8b8edc7a3aa8f442746b46ab603122c5f82c243e600c8e1d6faea74fad7eef5965d1d8b8aa3396e9c52697e270d032c2ab4bb4d9888c591d7f6d49c09bcd66d332eeb4503e2dc4f00ebe3640a14800a020e4578ff93aaf2c520f6841f2c33b1365e0f5c4048f230f25144aa0e4ac566886977e93a54409c93bca189b9cf00c1caf4bff74e8e2a9f9541baedd20a651c031e0b678df853d588f76cf24c5646929da676f44dff622fdd09b64f6b90f6374203252eb5b19eaf3931ae69d3f1ea7c2c78a3c3aef327d75a95bc8ac19896422db0020a6f04a10f2c15b02d7347e22eea5c22e701445eb5cd63a67f02ea693225377d02163fa9f1d21b32fc8111aeccb84ae0ab0b14f9abf35dafc1e9151496208082ca0325a0fec48a8308efb7493badd2d523877efb9ac545d04477a6f5dc1cfc24ed2651ffb3be0605945b85b73387c1a651e2b4f2a817d6577d2353e239509762657ccc4689956be515e62febc4aee2fea86045401fba801507f88c7ab12dd74599dc4c352870eb1a69feed507a1c35cd08b244000bb8dedc79d1b2c9e959be2f1c64ce27a298e62b35b5905be59269b8d1342420e5590d7119a7fa217f7fdc2587fc6cc4769addc60eeb16151af32f5e79d801383eeae58f18bb9d946938fd1ca318de363407679c3f9144845fcf34c920b6635fc7cb2d630fa4d69fb9783b4696639d6963544baf9a54fd7c203af7b936efb266a5de0e9bfd311a68362285e03576b0f2af60f0ea980675c150b733be0a3e93a84d133409f6bccb5060493c9bbd6a240f4dc2f52ebcbd1753a9f85895c443a462dab0f1f7a4e44d27103b93cb461fc4fe176156f5ba6f40c38dda8ee80418a8553234379462aa2d6846a1d36efa094e2c1f8bd28d04d468f59dc2913b9776fee270e0cbb924dddfaae3ded5720c5fbb68a2cea017b9fd314ac434121e3899b75e801d5b4819a3e0dab3b5fda9a3ea788b2fb15904211bf3a0501a242e2cdad0cea21ffcc5e61d61bbc42e4584f8b870b51a5205f61e628f51b5a88f2e69762e2522aa7001a64f9ac5928a68e88869076f39e099bb65d0a62c09a282f94c8864d730e360d73eafecdda11d943e71723e8db1b389bb4cd296d2a1e5dc2b7201b27969d32077a2dbd3eeafacde71f2b00618a301213c4ce42a5ec5001cc9fd45775a17878972aa1387aad5f4999628cc37a3a39a85defcf6c90818a603f3209190df8edc4aca28b94783cb45778fc9a0ffbfa57cb2e340cd6f32947971fb1af371a60ebd12fa592da57be6e9e050b87198a2023ff157f6b24e5a50abb5c39a8b3fe17ac557b16846b94adddb8969698aee1c34106f28214f566c32a00a05ab03c228f606a43e95f76565424187151b83dc8b997f0d3ee91c8170e3b087d5d5ec15ce28d912afad1e3ab4b526cd84e1240c32a968aa49c48fcba261acbf5be2951d3e1eb45907e4f5a0a5d06912f8d416aeaf3ae48633e78ffeaeb130c30a12e8ec7f53f5698ddd6317e2dbaa0bb0a2ccd4c388374c12bea6050e8ca2af16e28b749bce88ec89952ffa1238fbac08e2693afe72f9a6562ce3e22cb9f72785c92721fe7147250b98c3a3b25053b2f19f0324cbc43fb99d8ef5fbfd832ca31f175cfa9aba9927c8f1de22d6405f14c11e9a3c2bf7b97ad80f6c8a2539bbd2f923eb003b18281c1998d13dbabc7dcaf87cdcb4a21c0b9a728f0920253b54d3655418a9eacaef49bc534cbc2035509107cc5519be6a9b81a90c1886994d5e5b7fbb9c5bcf1577ae2dee68b8a61d5c2f7ca18550d43f4d58c747a8e2c011167406097578ad26419d30f2dba8785d6062b3ab11614e565134663c0ddd73021c10aba06ec977dbd48de10530f86e912e613a95aac8ae9b6f911390fae38bcd2a1a01908bd784f290bdefc0aab6ad396056d1b844ef6971095d9f161bf26e9e6f10ba44252f48a44b08ab1c304a3e0dc9d20e383825cf04b30a94cd05f6ef9a7a416af2ba473cb978051bea1546828787c4385364618988ed6a8c6655dadd711d62c52ca2b59374f5467ff3c4438aabf4a5c46513960a6bd2869173ed9a21f8ed3b4435ddb61f9f63594d07aa1d8ba764a65f1c620077fdc2f8a5fdcbbb60831876f4541d528a00000000000000006a1c720300000000ed3587de8d6ca4dc914f428be6bdbb714c6170e8299bc11b00cd4fb5208728bab9467679828dce5decd8f5aa75723a151001530ec9863efbcc27d5ed18ba4e09c66dd535c734112a1e58880249620fdc4148f3888931db4671a6b8070b0f729e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004567483e3ff4d741260328dc9a855754a9bd09bc1270544693a04d7bcca2c43d8b30220fb0ae33d6eb8b18199b2ded5578ff64804b9b41ded9c676bb886d900235815bc7e6a1e9bd78fc76f7f132828fd3723cf00d9191018b6f3737b6e25e79ce96efa0bfdd69036e98bcebf07e0ee808cfcf2f0109973c8b5215f86f3725060208a7031b64a55fa00e4439a0f0d356b204a10101a79345ecec6ea6c820d451c60210d4b01d427c6a4cdab4155aa433b4b243cd337a47042839ab8b0c0023575cb00a002e4242aea135931e68ba054c6b9e8e02eb4f8725387ae4dd1e80ba10bae601087a8b251817a8f3ce43bcc7af350493233458ec60b4698650c49c16a01ee0d90317f3f97e11bfe89a895b800e292866297539f7eabea29cefaf269ae302564fc0030d20293a0babbc91ac6fc285c5cab17fe105f68491fd687ac7a90755f1725e25032b84d9949a7559029ad87cb23edfe35939270fe595e45b8cb4cba8780ec3b50f0319cf62ebd5bf5d3fa3858d980f29e8543b3029645389a15eaa015c65ea210f24032f55a3b33c0c3babc0d70124bb9bfc5db18237c8ac348a057830d5df1fa3be75ef7478fddda8f1c75d4a556a9c6f79762a264a703c03048c4dba275a391251bea7df94b58071b99793989c30b2bee5db6b6383501943a563cd416acb5f5ddfa4cc2d2cd0582968ebdad8c5b58a7124780fb58eb1e4cc556cdcb6c842c34f41211e91ad26726b38cd3963d9e1034fa55d6147a63e15b81ac7b5825a3f45102a957e506c907fdffcef17a8d00a0edebd759792620c6e2daa745df18f805356cb90d9e022f9ea23ae87b9b075768ad710a4d48a22b380d4a98169a27e826b95bfde5250df3a1093cf5c6c435cc6973285a8933215ddafdbb1b1faf946725d5afba3cfd889ca42f30488d8ef0cd35f76223352cfaa2bec6294a8fb604de126a86b697257b57739b83f0c67923f27d7ebc071ee3522eef7f0c2ee8f7f0014d7e9987bf271a0004baa61b46920839526a50451d12244d6b4784bcd7e772efbc0dc30276dfbf612fc8dab085d124e4b44a469f952debf8d93288b234e413257d39e7e97a8521ac564ffdab2cbe349123eaf4a41d0291e748329bffa8166c512d6ef4012dd0fd57fb6051e62ea271b190f3586a8de63457f13bb3cc19400843c7986e7c2ba353370eb777d6926635c325859aee3c8668ccf40407664b9ede867898b51d21e15e1a1abb673649e2c2419fc089d1f66b072dd38a6a5fdaa118c8064bdb0170ec7113b0668a682be44a37676d621c48d53b5c037e096899ba95f61e65cf613a6eca52de75595b7bc15a199682a0a102d26f2e2857eb38e22e855ce93f01d3721050df800211a69185385790301ed95a6741e3f1bc4695577ebdfada03d02097dfac5d7b79465b6b3c37344912cd0873d2f81a512d3bbfc4f0775561e15c9da004af387495a22be734e358c275c9af2cfa97e069c7f357e93b6a3f2be80b28c5d0cb1af8102c2e8c66c7faaaccbf242273115823792445cc8fde0a970b5b763813af58ef5c965b50d6c0111b1954344b6ab5aa9711861f6ede5b94711c89d0676e766163e2954aadb6c7877abb46ac4537738b40dfe90db18e3938a54b425f3781a9372547502da85dfeb58499e77087b7ae3395c430876c29fd0bc84fb40a31914e89433155767cd1524a3bf1956f967b8a07351fe2ba3cb5bad6f55373930715424c7f4e26b17a80d67a77a8ebd9f9d48b5a1b1c74906aa4dd83b52003d1f2823b16c013b65c1cec42c7f7313aabfe00d6f1159c13e7f6e6d88acf8d071d790640a78e375a1423d914833f49e5f5b420817cb4fa5c366bba1888a0bd7e61d7efc6c3343471c80124b38ae84895c2b7000c11bac3539d30718d6ef7eb836aac6b4c01eed3996fe086f190e3d7f704a2d1c7627dd7cfb66419a6508739989ee75ccde743cbe7c1b2638c6f64cab94ced0fcb5a0d2a11a6818a08f548b9e75f2c0c2b2a04314e461589fcdf51271f404944092470f31f992cb9163f1932237e7e91a37eeed7a48502a1013dd3bdd90aaf97ee7c35bab5ebb289d499d5b3e52f019695e8f771f55adbb23ae1298281e59f65423ec300b54fc3ee41b808c52fc41fe0310aad0b189df49d09481c2bd261942882484047649bdcfbbb2c6a33532cd0de84869899f5e25e212d0734eedce439a2b4154396cbd6dad846dc3d28461f8ffb94c9220d929c2897d904b2676c2b65b5b64bacd5ea331763ce5a60c2c47ba3a85717b0b7a6fe68c1efeda99a64cadca22035e72d7c8e8431a558334a1fcf6329c37a47ac0722aee47dc2b59fe1c49307879cda803bd1b29a4b48fe7c49b38072d47b43c77b8e3e8b077d8aa7a5149ea9552300aa6dc0837e07bae14fdbb9ac9d03a96fbf4c2d79636670123f788bb4703", "51ac51636352", 0, 258374368, "738388f5c1375e289f2cd7d2107cda9805ac921b7bcad487f10865ebf3216f16"], - ["030000807082c403016e8ad4120cccc3c4bfdfd47072bf6d9314771bbeebfbc75d70b565107fcfd0a203000000056a6352655223290644026dc19a00000000000151deafc801000000000852535365656552ac000000000000000002243952010000000000000000000000005de4539953b60ce1c56d12d4823a220a849840702a33cf88160f0822fc0993073ad8c1a149be8cbc2856cd843f23781f5dcd4eb9d3945f46ad7dde575fa13af05e77c9eb3d30600a7b31442ca6ea084f7246df3231e592b42f0c270b226a1457000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006724ef3f737caf748a4fa0e30e49a3a56144ccb85a82888e615c1fbabea0161634b39376322a9c7870e49eb591dfdd020e5176ece6b9afda4eac9b22faa191e3bd81b524863d528c99cd9db365a882e6e2bc44650fea4ce1bc50818199fab7f948c64b8f00d82af9fb085b930d5334b83a30ee34e8975f9d54729cbef3c7eee902296d5e2f997bf18d0aa0ccd13e52e035351fa864cad244a9adf94ae82aaee0350207aa9a6a77b9c66b8608d76fc7387e969aa9667b465e5245207fd4ba594478c20b06e0a3c6d3cc28f0d7dc90e90bbb8852b5c90bca5e658930bf33d9c77fc4201a5f72e10493a97c36a010b86bab7938835a6ea04be59c8a5ae7f2e23e1291d87e0229e31f6caa753d272b7af371d0d5ed99b45a0e7dfd98c97cdbd9feef6b9a33f4020ad95ff2033bd1f8f34ec65ed0d2c55d4a31e88b070652f0c2e02e1a011f6a9202058d1047f6577eecd90d117125115d18534d2423591241663df084d05065ca720326f29ebb36b50b4f895099fdc7739594b1bf89742466601bd0ffca9c9810d096020d290f005eb6e94a6f5886f1427dc8d1a06e2e5b20c1506c1dffce01bdff6acb37af4bf15ffeaa9ec9c03f05749228d97e1949696cd8e42111dd388dfda44f9dbed8d117952569b29bd665b54d09d8d9f3e72cac0051abd86ae27c618fcfd961c4ca7670d14ddf876cce2054302cfa23904899a8edb8cef351a759b597dacd8b5399edac3e7c58b1ebf3edf1cc1c7b0fe9747e7f6f693ce72c65a5991cdbe2d2b1b94284d9fa7d283725d39c3f27491141432c719a2a18fff3b1b8a3cfef4f79a624268b3cdc3b26cf89c8c8cae52d14dc402cff4ede31330065ba45d6df6cba0b01845e9b3a2100f10b1eeee2112251660e63b877c3410d2ae6142908b9da2497737b5a1852b6c56cf1f17b278da66d2c27d647069c0fed4ab5c6d2aefab9c8ff65e4989e9867c199fe92c72ed3518adf461d6ff4eafac39fc36eebfd6fef68197a784a707b0f2818981e4f2b82bd1311545b6d2bc8f6f148a515359fc02c44645985567f6ad567643ff8eb4e96790424a863888415f60dd104cbd43b30189b1f5848cb597fbe297f209127e4fb1ffe19733da14b9d0f66bb8b0b90f689b0c6ba127ccdda22e0917cf24b62d166a6e41992b4d7c423f0de55fceff13ab2a3cc72644f607c79b0aa20ffd175d83ad7570466e10caf382f4d3647619067f861899a990e1a85f5f6b874b4e567f37f118753b704069423c195a5c97770b2ab33cc3b2350a2acd268f6fcf3afffa845df020cb0a151151347e1472956fef496dbf39d817c3dae25cd3b76576aa3b0aa30c0a026c92b6d896835600982550a0239c6820736992aef764b473861a0e2cc492a727e650f89591ac6a540b3a8a6a674baa37f6be41d6a06bf52a7490cd9ec3687c74b89512109be45bb7f6bb8a6d8ed86b5333b29003f098cb958e110e940e0cec4b91a09163428fbaa0390b8dbdc4f642023a262beb78812828fe82ed53334a3da168f99b77a326ef135a6f387ab99db5e198f1955e506531b42f7eb6cef9b658da7dd0a2131b88b482fa4447e8362d83344cd0e7f8b129407f627bdc182aeb0b8fd62a9e05aafbe2271aae5f96713e5e88a98f761d83ca945390e090a1505be504b691a1825dd0af27e9da527fac6085442f20605ab18f12f155c73405eed18dc135d1fe6d6cea3337dcf2bee7f4508e1b1b8577ab0790ad69da3929da48c30b725012d022358d5aaf5ff5831952a49dc1e9b927b8d8691ffc09784ea8129a4e756d0d32cfdfdc187016c370af4769fe83569fc42a40d57d5e19663085f04d454a13969d8d7f237472e45a75daac3391bf19bfb1c605a7f9abefb3c2bd8b8c1fb7b2c5878d0bfd9a8f63ee260187ed3b1592261b9ed3851514e83cf4a1aaf08a50cd87e1209dba779b423dc76bf3c9f2669263163f3026b493dc04510399dcd30198947638a585832b4d0fb628c4ed217823d8223784df326057382dda5e2dcb2d4a56294a63d904d4611c4b03a45ab50e8de9ad3cd7270a6e79f79e232bfd50c0207279d28ee868641ae8e8e74ee22c0de001f85a65079b62ee1742c67ab28a692a84bfcdc4bba9525387aad6e3157c3d5f516cb9965d6e0ddb910c9bf2260e803b1d23a2de4d45c3e1bde8f0dcd202155d392935a873c8b20302d0521c3499885d7d7d653a9d88d3ab43b1121b077afbdef238da2d8c6ba4d223f84707871a77eccb78fda436f2e978da90e95177fe6cb4f060c4b80cb1e8a040cc790bd23f0a70000000000000000f830c90500000000c38efc7f709033ed0654778dd15e1417a4f4b4ed5633380a7497d7856b6ad6fe7ef0a63e77e1cc396e133832dbe5b37e6499620dfd6acc9bc9caa468b13ed075abd1446841048502c3d9a8dd967a3a9090aa9adaf08cf88777deac06fd705339000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c086afd97818983274a13be176f55f6ef6eb887af07bfa157cd72e6fc86f1bdea0f539f112ec8f69186f7fd10a6df842b8fffff9f4a78ef8b2268a8c82c9c73b728072d61c3fcbf382025690b89cb25168ab5ad2d10dbc976c8f4e15e5437ab2a877fb95b371f5bd5e864d325abc8922dfede3f39416ad26f71e302f24fa8c202037f7d64b31ddc4746273bd3ee9130431917b6ed872c6702872dde89e5a702fa020da441e21a747249d496d42d94fb1de994a326d1789ccd480037e72452b65f4d0b02e6a7e63d9722b7bab8e5817564a069c888f5ba8a1dc6cacc9b7ce20b6fe5bcbd7662e5ace563a1706fe95a5a518b0697523ecad7255fc1b62a7d14427f4a56022e1eca7a0a95f687acfe434c60e5c9032c6df925e4d7caf074d160db206526e2032ac2bd8ca1a314700af71c0873900db79fb94cda16d141f7efec268a0fb6fca3021674957572cd869c5284114d19346cdefa34f28572bdd3369c48962405ea05840303ca10d4bc50c7ec7b28ca8361bc63b837f126572256a1ea2988c94455dc5330022e6444bd7ae08ea255cc1345ed47fdda433a2e7777b2b40e7cb43e958f93668063cf5ba8b4d3ea2d9ee22a003d82b6565f1dee075cd14e883029dd0ae271fb80000760fd98009e888f743f02a2d5b26390ea8b0bd071fe75048f023e052eecb2ab2f877d89ff27ce47f6696b9bd232f3114cb2259c1d399cc073d761a608f7ddb1fb1901339d1e4359a9f8f4985d244f412400de1bef48c898d7a0c6ecc9b3be18b26f19f5e8453cb7d36a8c33def0516ec51f3512332b65d3b4229a3230ffa2ac5fdd692f96457e575f1f8a60613912f281d1312674cd34afd768a255badaecf2192e7f5f3ac00bce7d380aef02ad1a6af788823f44d5825a90b1ddd346ae56221adb5433616b0af864864c82e9711fc2e83465d3359c14ed758d0767df0008a5ff4a81bd332372a2980f785533d55720cfc3a4e5351a918abfee93ac4f884a61fc950b380b51531d7a89ea74bc980cbea4a8b32403333d0addd9d5fe90193bf602bf2edb73ae27cf56485dcc8ce6eff122aeeacf65950fd6d7f33b177fac838b6594fe563ec889787a482422f432c86051414a39c15573f7457fd45d6d1746038f8dc3b4554f28c82b73571f8ec22d6082ed4cdf03ecac3b2ff91cf5853dce06df954a7225b6321607330785671915fde1831c511bb41d5b9d08f8d01569b1b7f513bd3366647487e1ba949fec9530af572f8149d8d8f9328a6d98047bbba09bc6749f66c5a63f043271bf025f487f1c70295a09b307e1ee2ca34d93bd90663f223af06b12cfc1fe321ddbd6686a7e3162a107c4377176813c13748705ee9df1caee98ef0640d519fcabf634c3307405c93da5183407e2869c1bff4ef158f844781f9d83001f06415cf99dc9b55c8455dafffe63359fb68260d866c7898e1b52ddd39291aaaaf020b720d45e52ebba371e2aaa5a4b1b305c9cd3fba55fd66d954a5d2b4e683b1c91f5a144a2bf7c364c094489ad527f63aed8b57bd4c8af94ba2bde155ccd75f9f3509f603152e20184bd406b11df90ca22bd2f3c6c9dd885b7ea561fe58e5c665ebded78cc8b805ab37862cca84e1e7c155c75f236dcf99124921f41345a667071bb74abfb0024e79291c431ba67d139b482c5c35e6cb1b7cfe513b45c2213d4a4b7ea2bcb35820aaf2bdef28d3c072959aa69ff6e9277ff2bda40c68630ea2dcea57619784ee685e63827fd1929e5407a9aa7d91ac98b4ab2b2a4b01587ecc5915540b6c0ef720ecd586632f76f9c23116fd14f775752075ba09d000eba923e20654c050505c4359f22ac5214c2b1400ff8fbf0bc8393c83a33dee61d135e7f32cd1b8d8f646c0b5574215fa694498f6ba0d6e1ea298aac759b64061acc5c544644b5bedcfaf2af56b61757d86ea59e5247a31d0554d8eb4b9a7f81891b66500c1d4c3a94869992eca557539c4cb817c455856173d8dd9dbd12fecc75dbaba0ac315e0de8199b64c332dea47ea2078a76f46ab388f48a59771f6a156b678ca899071b3bde1bbca1a3a155413885f320596def78affbc1cda95f713c68fea259718ed2471212868aed8f80aa6f6ea9f65010b3e260bc7be176cd15528f5a507a8f98b25c7fb325b7c7046e77a9ce47ec6305685ad9e5c238e27591751506f3a4877a6cab3459d3b1f96beeb2dd41a27e99c58b30034233d0bd2622198ca3295e8cb4c2658e7a5ab92f20b3045e0b098c7c8f893980492b152b788206f716ff97497d94bc60ae7f4ed5f2403233891618bbfa0d7d986e944399866d14724bd1afc1844678d0efa95c5139851b9779e72d4f8b62b84d8a339575c0180525e06126f44d2fe3b12eed21f34841384e48745001d99156693cc09c89ed59eaaabac3f2ab940f7a5bf62dbd3f02", "acac65", 0, 1638029704, "732f2ba4353434cab5cbd3d148976e9f5ae98e625ab38863f7a7258174f0a67c"], - ["030000807082c4030221e527dd73c6cabad23aa7872275a6f69fd8d20f7d038dbf3976be3e17cae7bd01000000046a535153cfc50240ce96177cc07aad4f9a7684aaf4a40bc56db55fc8d0b19a17678726874a062de80100000008656a6563525352537160f9ea02271798000000000002005272968b0500000000035200656a72f009e7befc1100", "6500", 0, 1103634089, "533760c3c8451b313ab37f1eba4f8732761585a795d451cb16e68ad3e02152eb"], - ["030000807082c4030219834c6608d5a01c307783ce02ce6368efb6bb9cf1dd595ef8b847f00f50af7e01000000086aac006a51635251b34dd25b540ef16b9cac1646781328c7f293a571bfc33107e090a0b9c93255451e50910c020000000653ac63acac53ffffffff01d8fe290200000000016a00000000890ec10b03c9f4a6030000000000000000000000008f8390d47df31f839175ab32465f60a7de7c5aaec7ea05b3f0027728da0578b08debbfa132b411879f4790b684dbe0f81bf4c39bc3800a7ff06d6451d771a643c7c218bba8675922f7208455aee53f434717d47289eab57a9f1f67990c9aed1700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fef06419449a58c09098b8cb260a9368b5eb3a2a3335e624fe2f4d22b063dbccd4e8b80ce218b9f8c9fd454fec181ccb950d4825f958573d3f5d7863c6a5b56b7c8da1c08536846dd2e6fdcebc0469b941444bc890745d208680b862c9565cfec25a541fc68ff65c9a1e4cff28cbf217e1e12d19da40440dde41fc60372b796c0226c7205aaaaafe84a36460540a0a6a8a60f5de2c7e97fea9a37c4be437453af5020b3c0bf802ed458e919a0bd10b0bd174dd797444874837c41ce63e19cfd21fe10a075df75c3b8eb6dac0fab14b8a8122262baed32ad3ae628f241e4b318e1dc0953ea6c868351aab3be82cfd4f5a556d52544563f32f6c208918e25caab674d882022b36fdfb172e2f9b51217dfe66aa82ef978ad23aa0c9ee5e78d43ad8a9067f93030a5dc164a2059b84b1bb01dcb7b36e53a3b8e23bd850a52bda75cda1dd7a9336030e9b95a895916421839f4196673b400c807e856205813b3d463ebd8ccf2bd70802121d059b8a91c9fa15b17ce0452a0a5d0115dea6664a31ebcd279cd2f0cdfe0603004c68d3e705e0bb9e0b82b2dd4b65e3029f8f808464f1a962a89ac797d52639e04a8ebbfb4a4b8d60f16d1353cf9e1eb7622bda7d8f3d33b64870339db2994b084194d8404a51dd50abfe0e60e1895ca7881fcb4883ba5676835c3d0b013074e64022dabab2cdf57c83e925713b9a480df31c48d786bab4d42905bc461520b6484b4c3cc9201237e1a5c77072a3567b001b960ab426ebcdbbac8998cd0ad00b74c1e41110aa07934fe57d83e2dd3b7486342af1c9a257995a1abfc563a8f8735a743095d5232596125d01a68ee54dce6152ea53d34d4dfc72845817597821588c4d8df59d306744e399fa3391ca6426ef5eb9d82e1c829209bbf96822e17a393e5df4d8100404e9500ef96e339020abee03e4e0c682ca56d128ee52373c7cb32f5dc8105536e3419dc67ae237509ed1500c1228b69a2d312b9fcfb564d53cb8cfb64517092993fcf1fbd0806ca5a90eadd542bd1fac8d7a0cb8def23754ffbc541b34ec69a7c0230d4bf9325755239799120c496ac2da7d445052d1206207f4e3f0ef4de13739b3ea675793d806c1ba3438aa7adb4f2ea2bbb8809a4636f33a4748ea41668e97b837880460b4caa2e5fe5ba0744f7ce5ea8b11491c41f3d3fecc8a8e9bf8aea01a66bbe8a37d679bb5c66dfcf458b719f36f791e1c6d16a7959b3dc2d201bbceac19da3df752fc3ddb4fadad10c93132e116f5275bfc041fc4a63c118b0e1c013cc1e94840110d038a5caa5f0dc2b7516f0c26030f939b28ca1a1387b6478b7a14ae369639077035d3a71c26cb897f0efde8e92acc9b778829769a82ba491f1050f03a3abf3982d375b74b8a14f42c2ce4f199d2abf86f5f840ec88c1fc61dce8ad8ea06c900304b1770dc5a6580a4af8d301d86d3340eec3bfeaa158c607c10a01ce774b2c715a43e28d6d0f5e2226114e66abf57f9768f6f9a508b6d1836e3f58e010389699c3030be88560edb4e8fd2b8109f800092b72a9af068f9db59ce418a96ea438c95c60d3672e531d705985402d6dc0d88140a5804efd84da18762a09a515fca6ddfa4bf6d7cc89541d15b449177176aeeaec0092d0245d7a8266e50d491c5257c653b6e5dfaedde68200917eee554272652dbe4292f2fc1dbbcb42c7c76124dccbe5a6f9313e48f631b5a0927fd6442b107e0c9f88c389f306f0f73000d0f4d62880b2bbfaeced868edea92597d029ba474b10c7aa2480d51381f22f49ed1fa6431830a4529d620b700ddee46d4a7c4d01e204ece67a296638dad89085ae865c7f87b26b8712b5aa77633f7b68b1800fc9688772dd1c31d7a9952b910ea69d983ad8ded7382257064c25dcd4632076b2d62217b04b162d3de3f6f1f3fb22fd88d0641d5547f5fa2d0d20152566109f989c39264413fe309ff8b9149901ecf5b0f1e92be365297bdc15373a5195267bf616b2cdbff34c034302b2cbebcb233f7f7438a49acff061012800f529bc45cafb37712d94fca8a6bc2bbc5b2fd10cbd7ccc4c79aeb807297c0c09d0d6eef118ad777c00c2a56c0e3372957ac15a6b4818b3b362611b9759eb3061502dd4664c4ebae6b41ef7c01faa413a3c7a842a09118307bb28d660cb53d95b6814a6c3ea12bd474ed6dbad8bbb95309535ff9208968cf88b14c0c0109f87d2dab12912756da645bf2928e263e7f70cecbcdaec1a35e377442609cb272fb54e9eaf92ff8acf6cb6975d87d5acc047ab23aabb153aa150ce7c8218200000000000000006bc3c700000000009d299faa278df1f85da5c5411fea9728daec64ea2be54fae635dff42e5a5d9a9a36c078903f5428a88c6b863acfc508b20a8f769ad72cc60ec2bd8af895369ac522cca3171ced77f3cbdd9700adb7b6a0bbac7542ccaf4ebab69084ee7012018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bdc36bf21e3205b1f0eb49e08886bc3bcf8d3267b9599c6d8cdd55f5fcb5d4ea66a10e5036010c1174bfac289364df8c7b157401a65037fcfd0c4e2523364c1032be2570d1e392c4f3587deaf384cb12f5d4fdfe14baf5e4edab035e3960d011cddb20099990000d3aff439b877ca61ee6c1ace32e5c1925e4f7a3e089fbf9803201746d96be3bee9d6c4c8b0a050e3215b4b87992c2c32e98040e66b59579194021aa15b807a75d8000816bd4387343397b804f81e81d2eac802f31d1869d3bf8b0a00248ff5d8dbdbc18c749b9055b5400b8111de79c50bc8f724b9949a32fa50864548e1566726c4fd49ad723d760475258cd99effb86d4d3d8598c1cc59ab2158031e2687797268d3961bf972d502f657460463faaedfa31fb64a6a6cc6fa0c3c6d031c8d101b5e5bbdb26285c8720c850b8e35d342fba77c2df4bd33e99fe884cbfb02201b9926e19c7d483e7abe7067dd3bb373dce6a2fed5f9988d7ac683efc4c0d103277f1d07157b10f8166ab39cdb3443a090173b7dfb6fa3a0a5d3d19e0083a27a022ebd89574a7694007c16ea03e2a31205c691a9e2867f5357cddf1ec62e3833fe142e930b76661e72ea83b12c3df9b1e31b11ecb97a9971dbcb9f0b980b78ff6dee3dfb3c73f49568e4886ed7073614ede376b4ba59867f87aa73f0437f7a5c38ab95e960a8d3758719db0eda506c0c2a40f4a6c1d2fff000011053e7d975ee5f31b6f981a0ca7dc174fbb4bf94aac24c226ae0fadbd6cb25c2dcc74234296eb05c945c16642d882fb2241cadd62b6fad95d04c8ea03cecd40b32ed2686f3b7d94c49db6cd8d94068e31c775a7a2b86415de57468c1ed86565214cd4038a9ef449a90b4ab63a47903f2e65a1f9193a081cf220cb257adc290fe843dab70541af95014c2cebe5874eebfce0f8028ffa38e46a0e2fc301c0d96e4ad1b310b0a7a5db25bbba72f8454e16995036954451063adf60ad0399063980849588709d4b9adf4299a84243889c832c810c0ff6ee5b8670b529bb4d81681151e18141198acc5aafb2a47676234816e8283a7e35a92cc01082282a006cb85ee0079eb21523252e270373d6eb32dbdfbb2eee793a92000c1e9ce5e74126d0fcd441dfe8e6c09328e7f15686fa1757573922154b878e15d8b59fee5b8851f5e954e42d1f7152f60314ee1cfd4827913142f4c5a487999025eb0b4e7de20ece2b84d5670ed13b6581532c16508ace78e82bf05c12e9800a033596a1adb69cc4ee2c89533e4bf6096e7d122f290b46199b0585b62d4a980f32c8a2c44b80d69ee84b6aa32c157543de97d7bdafbe10147b4b28f5186567e76c6460411547a0e69a6fe66922ab637559e7183bb1d9fd6dc428ed6dd67e794018f4dbe1536f8b8ceebbbb3ae3b6d438ff87e9963c409eedf63d33f2855f9bef0769ca3db7b10b64ee79d2b30d8a3d8b4e34a376f998bdfbd38203edbc5725a1828cbcc417ddaf7a4f4c138bd41bf4b8431264901c4355371b4bed439df12335c3cc653cb6936a2cfb1d5c9da42cbf87da6c0b99572c2c518555d9fb2d0b4bbc3dd82c2ec9c7dbe05a29a98610b4c1a4228656e987d55192a9a3461c4bc797dd40305c6855d6813eb2fa57a303d8375696d3d44d8123e705cced67489d90191ce8e5a95983d53d41d2e95f81ca87ca6bb34d61d16cdaccd38f727bc3324f5cfde52b0fddf1334f5622ebd5e952bc42c13e6125d2c84353213252922783fcc3eea4feb0d69fee20f61a7afedbcddd6c336aba334fde29a3856f7713200129ef9196750213d3e05e66ed3e35fc142b03df9bf42abf1964c9442c81eb6898b9e5fc6bfb5d5350872cb6e88deab27cb472d4fc335a36acf67a041077de971754b5580d9535675327903ced20e6e2e65a0d5baaaea49d3538e08bb665e4adf24f83cf0de8b928cbdd09257873c6f81606463e43d09c94dde17820d83d6533c2a7802d74988ad445c8c37d7e20151a7b1d68226bbc0633dd067ad2fca019c54ccf17702a7ad18e093c71568f66aa0f75e0fcab14d0447707572b7e0020fde15e06146ddfe0739d264d0fb105daebbbb53bddd31851f40883255bd5254988e84e365379c850af64370e56c2f31d9fcfcc1fbd09f51983f6e5e0362c045dc32722d7e698a3c75981d0380b73acb0be8a0a07b9dfd9e0eabf7042771d7eb94572c31bcba4e55f7fea4415937db0f900d90b9542104ab2ac7d5d88637c5c7790e0b801e4bbd7ee4a347a529c3ef3db5dd1c7805d5029d6fe7c004b2e6391557e4d786e32abbb6200000000000000000879b5b010000000089a28d23e72e10a1f8b7ba54e617f938df360a60d47b8e17219adb021445fe9bae527a9002e8bb21f67b1c04dda0d89f7fbc77c0d5df765ff2f1815abb31b21e68d2ffde772afb365df95b2d67772717c1678b127c3b7d4f3dc26d90a5a8603100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000784c55f2c421fa46bb4d40ed9f833b4e3e98525315ca37e8b49a26036ef7af0a1c8b2497eb4715879e67034c67dfb8452061c8baf5912144d75a88aeab3db7a89e55672431a89e18a909f74875c555b26b61d47fca9b9b67a5ff85c5ccf6f5bb45b0d74b45e92f7e6a9ce12a544d250cdc0d6bb90706f1475f796d899860e0d40213017d3eb578edaebf071d92ab3070df888d957fe1c8908e1df05136b2c3a646030f850eff7b8bdb197ee7d086dd3865f2a03984f11bdad2e3cc971d658217cfc60b03e6fb1f4e18206ff63e444d031430faa7f070950b4a0ad65492168b9c0e35a67d2cb7f1078f30d992c5bea02fe1e37fb352c65e3b0f0009caa1a986d5318f1e03276c217a043b3cf4724f88d2978bbbe4c37e72475b7cf718af78f36ea795426003163221fdad0afb0a879fb1919654258e19c228c483c00ddf9517ebeb6f99fccc0308840a907e141785d5e32985ed8c3f659f9e0447f14c5785d905ce8f9e9eef8b0309291eeb37739ed381b750cf0109f38cf7ee1ea08cf17372d0f40ac96c50b58c03204d41ff2dd3f640749761e2cc3610ea9786b314eeff8eb390d1faace35fbfe7a16bbee246bfb45068d1bad10d4bbb12162d8375c16b2962af6cd9cde0d037b466a3c033a91e913e65a72e2764d7b93bb7269978cf64ce1544204d1952693724de8d09e285a31fa7776abe10c547a53bc57382369efae5182389a148e0860be951dc407a5c1b7bb241c183382c2f4f4cc1813706261cd4e9dce4d7e4d8aadea1a52f163eca5abc65a49dcf3855d1bb37f62e9ca0242be8b661c54532c9bb39b103438c728dba1cbf6e98e2ea265bd65ae8b74627d51af35284d6fc933bca357167b154e9ce5e8cb8c2eceb11f24587de4e1754a9907c5f34c1427e0a18bbaaa09811ef258a62aa2da9922dc2c574a982be005be67a63a94b265cb91e6d69d30f0a4953cdbc9342e0fb45ae5b58acee1ca9db2a8a6cc275ef4bc7240b7016773a495a4458ed17e9f69370f36b5c2f1d6a4d247a4973ae478c23b4d0ce0516d8a29a7c151aeaac55fd4ecc6a5d0711a57c532235a3856398774830fdb56ef269c716ce1a63682dde907118bd7ee0fd964e6f2dbb52a0c68a95927ba5c9a53ffa8f2f0be1ff0c5088c0c0e9a3efa900a85267dfe1c08a5f174b9ed2b50c7f408b0290644f40465451327868be3eb76de99b617e16435a801e0ddae0ea103aca41d26bb93da5660ef1626fd4484e480c65100f826896ec3adbc28d19d58119b1a07d57af13f51966917ed63a7b746be479d2b0bfc1a5f4d5b8108f00ee4273d7979b947fd9ac50c6c745f9361706c0aef2da510b04df24ef8c49ddf534f407508aa55b8f9e75f085bc46b46d39a026df7b35f5af20ae4e8150dc99672183d233b2ddfb0d1e0e08df866ea07c3f3a4296d718f3c342b7d337f8881215e96edac3f8506fdb32382207aaa9cb3a9bacda10cdf702e136cea2885c7ebcc112939b83ccaed39e0de7279ccfbf4d406adf86ea50642c320e16c382312d700aa1d72b1161ba38c291e478064f3f0388066886bb570c0645cc16bd95d9db05f9e4c698ac7bf9b492d40954c9753dced03e745932167f11219e079a9dd3b787620a8415e1f7f3fb907c9a93a0388bdea68038c60a08401af0c5d2b97a36608ee515538626415485014a4f6e9fd35c2e8e3ab1501f0480b6d88f2b9c4103bcd4f829ddd5ffa80e20eb78dd18ed7d90fd3869549357711b3a19c1728c83dbf580ed6a298c00d266a9174f582071922a8da2b479c0b0aff59fe0d7929d0066883f91e7720996b0738cb4fd500a35b760a72fd14bf45ccbe408fc8fa8898ff7df60dbe28141c6977b8974e282f99ea18b1219ca7a8b7368b0c75388e07b0a5d9a239aa27bc66a8c5ff708f9d739b05fc70b85b9d1f809d665489b2886ca688225be5204d8f62c3c44cff7a349f747851ae43e3bdf02334769fc76575587ed9543fceaf0441e5d7b93e7d301221e9143785d3a149d35fd5517dfc1f628c934a59b40ce609f3d3856b17c7c1644987f4e5fe02451c367b5a05c10ec49fc623fd616613b5bb3b7148687e5968a44882795101784cd34eb1b1bd07631e897f1e0bc594bd0b1646f63dcfcd39608c0a74643dcdf8ad2debca53b900cf7ed5a78ef67cdde149c7c9ca83a05d1e13be70f8ddbcde702ca6128a95176c55e1becd0fef781ace658eab3f8b7b1c6180f4d04da8549c078e191126c09ea4e2d64f62903110eefe2a412f23c37ec2de131bf82d6a7912c1ec86a91c412757ea57a79d974209596abaddb281bbf4e53934ecb1e680734e49eb028cb0fa6d151e4b0e526e6021f947f893476432064c906e98fc643759cd90db6fff6a895deac9b207c303a5ec1c784856a21db4c3c174d1c7e7c5112da68190fce38c5635eb509", "5365006565", 0, -1681709920, "deb222d7bef6ad0d68853da01f6407bf61a7eecfea6eb7a3955eb350da324296"], - ["030000807082c40301a12835b60188c6db289e22e98f055783a684078b35cae46d512f1a2d91362be30000000008526a526553ac6a65ffffffff04bbe1c4050000000006ac656a6552659b45b7010000000003ac6a655eeff50000000000086a6aac5353526aac0627e900000000000152c021a7938d4d01f70300000000000000001dc5ae0100000000bf2265e7e06a483fbd7b446727076b2991c2899f5b2137329ebd4e20b15764467a1edbf7da66327fb4b9a9e047caf93bc03036c1ca9245ee730b41b9d12e7be9b6665bea05026aaa38c8ec0fb7587bd156a00f73f7b56d7560a7d1cae3c922eb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000df0ce58ba96fdd5df564ea5bcd9c502dbdd95c999bb98f1c58a52488b5ccb5c199ff1f9436b9591fbab63406f73503dddcd4402ec399ad20fb4aae6fe86b1f70c4673c05f317434afe4e9a42a0f72167848f1b1dd620a9ffc7e7ca9d432f0f497a87b7c6495a67caf029bb91ac605addfb42ca0f81824742a35409aa8ca78e71031de486fbe15f75e9526461692efae0a4e1623a9d8a6015500e69a19368537c45030e4b79165f9bf3915f70add299d1474e66c87bf281563c08551711820cc7df450a0898a857bace7a0042c146d70488a9d158de9f225205fc181f25363f9d1abb499255d1b3b9c830a2a324a3031a340da18c1cd0d3a0a2fc73a1c67d023be1c7ef0205dd3f91b1797fd89e03ffcfe4d7e487a62d7f594a8de0b0fe78c9c3a79290ea022907dc6bd74ee91f99adbd0396958ba366dd302de03d1a5dd0529d90fc89ea8d02262a37d96b002ac18edfdab924a3048ebcf8d88af4ec975bfbcc18d745f5f633021ab94afa7d6d5621c812b5baab86e98fa4339aaa20470e1e8e4028051ce0c68c02270ae466067fc6d6f86986fe9d73e9812b1ae309b770f8d471dc56f013eae23e468d3f9e3800eb71a29217f3e1651d98e437353746febbea60a471b45583130265f0a8b3f9db44b92e9b64cc912d9ef366e0c78ea3b81fad4de18b3d882b070a28f047c526a2c8c7f40a219f71f0512c626ca8179569af87f2926c608576641b07cc11fa9e19b8d95285c9aa301c7d5d60ede293a439c1f98eec6dba43473de098f304c998cadbad3b3c12f725320c92b9256401652c7578f4aa02dd4640e3e6ad1a64408a1a26a98db27c3ab83122e4914e4f701d645fef1eed35e951755ed99defc06b35ab94b134036d8f9f55bf62ff8fbd20311ff595def12d88e79df8b81d23c0de9f44c996376782b81ea59d835110a21183f639be8554595480d020736b139501a33f5e88c547526205b7cb195405b81b599d2a7dfcb9f8ff289150d1c489c68c51878c8901abef909a3532a722022f2330ce07a1c4776f128cba77a1f2e95906c83db53ff13de97dfaa8abc91d2611eb9dfc56b3ebaf7b160fe0a3b6aef2de0bd48f4da34e521674158c5bd513da2030aef8ace84dc7f10a6a4395d355faf22ed0469d600f76b3a364b9b0fae7eb692a5f8057e1c6cae91e5d1dd0c49c816e542bc35b8396531289b645d3d13477d4cb11f71d54b0ecde0a5af0e8caa8a709988b6e2ea9240177dd3558c22ab7aa2b8682a7dd596e5b8f0d108593437d5cac262b99b0314372c345b977f999d2af627209de87e52957929d8898ca68d18dfa7e4b36a080628b01ba559d31fc2e5f671aa68c4ba5fa3e3d807e6e7977089308eb1cee5613ae03c637886f1357dcca3986d8e6f1a72d24617846bd0c0e0fcc5ee38a086aa709ad185d6f47587bdd871064efc602267d1875bd34449b837aaf25ea435615664fdf718a451c77102c3fda3c2d30bf2cd1ee43a4140356f2cfec920df5159d41edece76caf8057c1c474a17945935530f5791a67c04c1458a1b7ed3faa27809592f726638e19da5edaba18fa31fb58184fe27df28cc504d1a1955a0a189f34f9f20cdc6f0dd2f85ae2773bf86a8ff64d365df6f9cdd28e6f21c4e19913e0366dae60fdb009548296bcb86dbfebcd5729263801f49a380cc8e1d80e0db30aa2adb9a0a63685fbe022f7e50a3e4599ae20e8010aff6d58da132950263d82220e62ff705e51de745e13645308cdc5e1cdaf8b86f34f8378806c762b75a9c73b3a4427e9453ebdd94af3f94cea4ec059ee4069fa566df01ab19035e3afae89cf224ae69b80226349dd350d9fa1f10194147420361eb307541008229f06f353ba6528cfe6cf65ace8808604c9c6e106c22d2c88e0ad55943081379fbd95df6aef5d879d7ca2e9858ab3edac65825a2cf518a0b4d3f45fe3223af4fdcab5f13d7ee4f1cf09a2829ac67cf77838ea11a8d831a6d8462dbc452581a9c1a67fe5cf24675f5822e042f80a84470c80a0613d24e6ac956c4b413915d76734848734adff78ac60f9e0d7bb0a007eea2cedd32d81ea0d5c7318b23a32e2c5e9f90929e1101a0b0082754755c29f0bd7b837c9d200236a96db6fba6ae355f8e2ef50f8262cb6b89be684156cc326ac4440f6de043cb5a831b77567753be72cb2d6b1d4253fe1f88aef318e34ea8a675e09b8981b07ea33b8f8333184c2a27cd092b71602084251aefbe5b6a1c5565a2e268e0eb7f5986c7e34c0e452f2a33708de0cedcaac17821694ace20533a572f9b91d419f0100000000000000000000000049c9758a8408d33dee152b97be817f522803878ca92bb09274e4e1d5fcee9d86be8e7048b6ddeebadccfde06c3798cb9b2e953552f32b748ddde193c4961b43db24475d302e7a17b4257aa03d6791cc5e6ce4140f7883912a92dd7e05a8ccccb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006fb57dd4c0ee9e1a046cff40b8e94eb8b3bd601b8d28df4272a8a202ee49a4ed655045133983215da94f4cd2e2bdcf5f311e0d4d7f1d90240cadbfe4bf0c769660c89e2df98c531fff05834171ac7ee0f3517e1df8fa47eb6786d7b1749e707f454f4b83a4d4850fc0830d370fd34a6e3292a7c89c69057f2a7bfec1e6c4668f0304570ed5e98d313a17dd5dedc7dfb039cacd90e3aa5b7c4f6df4d61df727117202266690fd9d32efe29ac0bac0fe8ee8068e45857df3038e7c7bc6605c4286c0b10b008f74749851314faa7d4aeabaeb77e863b32f8f0182a1e5a9916d3253b8d2ae4b2744feae501c31ff96a94449c52eea817861f6f2b331aaa28dbc646a2b6650032b535ad80440a23141c4d8eb3b7ce1be26891d5dfe72285000c57c8ec10ff3280223f6878126b3c7ca3e697cf60d74c5a63ceb589cf1a292af7cd9d2b525967bd1021dca56f175456957a9f7731f77ce7d4e23f1b613a0477588f767a6f7c9bd9db6022afd78ff04dbd35e656d8a3d6b780943fbf01b79551b014674fc5c69e4b82338032e99f0f54058742e295b7e407c7bd0e5d0fd9ed421fd09d1cf791568545d5bea4e2a15993e7692849d08677ddbf7a181234e8fa407a5e0c529ec6449e709e8d97b742367d509dc826198d0a7c4fd78fd97c31c104936f42fcfbdc04ea33d83b4239ff4e96b7c3c28f163788bab4634281fc2fee9fc0e42e9a9aaede4d1c04cbf8e4e4d03fb46279003e100a16b7a8d67b4089a331816f6e3ae2c8bd51c0dc826b0351c6d7f5a231b03c9ed132c9331e81e6d5b511f20265c3cc795b4d755be79a94c365c44422ad139f494a3eafac81c58a0e21d60a708db5c97ffbfac1dbf500f7321be164cc71d258fe2970285bc584a13370792bc0310cfc895154088dd733f60c7c6a94fe3f5ac4736f15a57554b88afc5ace337c6bf4cb83d1e77b3b3336829b51a50578145a908f4821dd608e22b34bce57904cff9ceaf306f8acc95db8d9f97ede8f8f59086ae0d6a3c771088a0dd5591ef4cdc9adf02dddaa66c44d537ba1c3fc9da885b2c747f254de4eaf0f6e1582402759a572e69ff984dc002d3f1450adac36366e284657148ac1c37dcb822da760c865f67418dd863b26d6380f1c1a13d27a3fd84e428921ead806080bd7ddfc5454764c7cb92bce4ef5e678877e764818227f932d94a2a7aeb8706aff3a2c528b79fb140e93bf7d024234ead8110c263feeb3d48f392e0a1945bd9d2dd1738a73922b517f05a47f940c8e3907a20882ff56a5817a2b9106ec60bfdae41ec08bd514c0d2de57a0982e872c1d23e80c1a6aa5306cb41359be8c9be95f4d92652d576a86cce8a2c04afd851865907b869c1620b8a44a4d8e336e41b4212760b1d8c309adeaf8e746b265e5bd54d17171182c8d33e49730523f6d4d174ea765b90daefadca33088034ec7ed8a0de689ce041aff54b980855b4fd2187701fb61e045872c1522351ea22a0a5a8a53cdee59677b40cd8da1b507c79dee07ec03ab35305c416c61119efdf9b86983a5112e29e0aae0d5306d7f4c8473a73adad790332cbbea277eb729e838354ccf20ce08c935ae82a9b6d5bc1c62e38d6c13847d48c15b66d1bb89f2f6f91670b17a63452d4a658e927034a40bfa260088c724892df0cde4b2e0608833b89f48e7489f9d0cd20055d02d58decc4e96e0a8ea33ca793ecdafdd4400d4a365c5846092e38dc57bdf8dfb152930f4c11efccd9097ca54f5ff9083714ad68683e65be770b947d25344328340724db9fb0d63159154d628968af3ae916ad6d14fbf3fe2d0da13464ea7c4add0e44320f1157173a240c68609ea2f66fdf0964d4729a6b29faeea9f426817ae9db2f705edebdf58e623ef2414ee4d28ad8a6158ab88c3a1353a009b5284f0cdf052d43daa15a91220708a667c7c083956755d47db6cc07a9de2752acf5d87b39587fbbb9b7d2e248c4702d81dae2bb422a795f573ef83cab3c7fde596dddd4c30a2a24884debbb1a537881522128840e358d562a4c37e097f2ca0f7d1b627a61c39804d497dfbf7afdb9033cffc1756a3434d451851de5ae9e43d9f6f0943debc43e3258b6ecd967c28bb18229c0130b7b51dd55b36ab620b57acac39816dfd186c4aab552073e9a7332e8167b407cef2cef08618d85af4a1e11285d5dadead06c9bd56fcba9724c7c6b60dce841ea7b9bed0983f6de93fc8034a4aefee2930a227496a9db22e5ee501f6304446f5d985b91fdc426be6674135ba310d7dc8aedb8fef8403ac14d4ce2ef4c000000000000000025224d0200000000a8e6648800a2e3280d99cacbd4de8a11975829708242244f80ac9d6777594ad3cc67c021c0551376d90dcd5729628a4594222e7dae9fc12eae076169355bec637a03d640875756850745442a4f52546d1066c59b7f2d9dc36c7e3ea42801de210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028bb51c51eeea936bb73f9ca2587ab0a36aadf915b507482d7f5f612677e93fc844ef52dd9d8f1ea175ccff954ec0970858679ccc015905e6c1e1302ebbe1f5e19d26efb018b4f9995dc36c917f7fa2725c8e7ae332d66de141b3dd33370342b1073e8e7c563dc77b206f781340d563b8e7060fed628e2b8337fc30e76161c3b02078a3be3859e60818d22202a1e0624c98eb5f99797d29814078afdfddcdb4bda022f6b2dae13ccf2fdf304d03674fe19c11c81ed600f0e5f969c2202490b40d46f0b08d831ba6f68915afdad85cca651cb47bc82809d93a09b2ee67ab692ae6bc906778f633da4d926b2d2ccaf98ed61ce2bb4c076c66cee59ebb8dc46a8c68de0bd032e0ca49c00731abeec74f281f2f63fb026fa76290b1f97eff60e10bc0f52408e032e7225fba23ca7f57e6b8a340a36ba7c2f5f9c766deb4fb80c3b66a8c1254388021cb51edcbf78628ef14e0063dc9568bf3fcfaf5892e0ffda291bf1648ee80f650301098c6bc64fe56696d580157c143faa2c7dd1d99d23a8847844e343c779a04402133942e61cbd794a1135f967b140eaacd93664c057fd44cac18a6afd951a09881375933f7a09417a8c571694f16fae31eadf06f7a02d86ce0e4e1ab05b4128313511b948eeff13609bb7cd5f0bdf7eb3ceb548934c9b1aac31b5f43d8fab3807d7e936471b7c2438b4aa2aeea960a41fb9138c8a7e91307a11849026c34f866f77c63f7528a7b0a84741cc5e15c70099e6b8fef4fedf9e57037d93048771daec04c577c4b8b45ca52032e433710f1e2c1fe60416ff414220b5e76685082b231da736d375757d262d1be38fd6c1130848d208564c04fed173b447503b36bedaa14cc77a5c3a5c0135d535feac455e020dfc1fd8df990fecbaff707f7ba884c7ef4465725727938ed864bfa451c69454039a4b541703c37245042396285ff8036737b7bc889993532efba99ef7ab95f78f50bc219a789671bd491f110556127f46f721eebc4686170d13b86915c9d17d58bccc6f6bd354f62edb90590f403097acfdb2410ed78d96559c4ecb252f4e0717520d916b51baca62a148e4efb255ba11a88df22ff4b16b87c8e97be1058547f95b5b9a46af14507614b2816245ad4b89e08950aaae6a995580d9f79b359b5e1cc131492000e88adb83685dcc5ba7d48504f2c1d4d8508981fb890da47ea3dc34fe9a14bec5f1ff0bf907d1d3447ebf9bb5eeb9d646d6d32de0016325186cc08696442d8123859173dcb2640ffd091b7c8661758daca84c44164d5b1b7aa27d07a59f223804e8484e74db5230ad9f8f8763841652c8b2c878822d9d760eecf2766b94b11e2ab7b0ae977d9016d98f5dc55ced45e55db2b0839052c32a9324ace625c9280bf0432974f93cd77be3ee0a9aa1155ff3288af78af18562e8198659306c6740f50f18f4397cadff0cdc22e7beab0c00d47a5eac389731a0e5b54e39adb3fb821d5525a893047203c853f5e50cbc712915cba4ed5eed82d47ccff77160f0e5c7fdff2ec5d4e2724c2e2e49dcbabad1386cee578244d9a31f6929ef689359d24db293754924fa7355b1b71fa573598926d6afd7e714a23e890404d780d1becf13e63bf28607703523ad29a043ca7ee8042f2c996b9701e0c297fb48a36359baf436dd8f7eeed4c90d4dd32449e671e592cadb99364e0f032e6a2c81a9b3e2838b34ab71883e3fc84feec4d6153a4f62c58374e7584a23fe9ad60af595fac01b2fad95d91d3a5b6574bf108cd902968de71716bb0919ee681fbb58feaa2fd222fe5006eda7ef83130b732179efafc8922b2c2bddd5412340dc1acaf20e0fac8cc152ee6a236755f7d9d4f231525754caf2ec65a50993644fcd1c8c9fe5c01dc1254570e1aa22052fee079a395cf9bcfde045e7770f2d7d0d3ad49b2994546f3db3a1e705c1bebb9437600decdfe4e7eacf6e3c0ce52fcba45b41a742747b1394cc4be1fc1dd4e76498ee32ee2c10d95e544cae95f2e74c540e733a19f2646abbe11352d0aef0dfc8716576eb1673e00a2f586cff93cfafb7bd2c867a1f30669d62e3e455644a1e48a7897446bc76fbb196dda7e6689995edf7208c62659169355c5e9388a15bc32bd6ad78a8f19f949a3d37593de49b8bc20740da18681c9f3b3213055b4c6f4afc8806dcb2bada86f25449a115bdeef64195954bc43487909999fef7679688bf0c3cb24c18629fc4d5629c630ca7d1b82bd9f9c7ff031f7b529e5291f16b1f934fa7f93567c370be93e7ca8b6c7fbc54bc3189314d536416367b8fd9cf176b13413a7e11c424cd19a350c146e139cf6fcce17eb11dd5fabaecc2043602bf45a638a5deb3ec7d647b1daf940d7d79197380822d5d5f43540fb08a99ea8154bad970eb756fafdb0dc07bb17dd5f27d0dcc773707ca29233b1301", "52ac6a65", 0, -1153580287, "ed25279a03a344c5732396972dacfad0df7672d531a50a8dc6a5f33d5c293bac"], - ["43b945050230f2c04002b876caea67644c7063116c3284488f08e82d258b1d117538cd684e0300000009656a52515352535353ffffffff331d5f8f56d1180bd9c8a46fad1bd021f48b6eaf75b95413d0c91855cdcb2ad3030000000463005253ffffffff02aeed2402000000000752006a53656552fd4e2d0300000000075253526552006affe4115e010000000000000000363d6b02000000006ad4be6d422534166e488048fd62eaf50b508e374f0213aa0d9ffcc38bd2f761c3f6f72b4875bb46b247604b4f7130d4aa7b8264e169216718f386f351db5a463926425d010c4e26581a6b38f009d8ce2d064ab671f08c89dc5a917e99371f7800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ce60188698197132143309d25428d42f856b1033d6cea4bc2a59085f9896456fbf148101ce051151adf78e878cab3265ab0d3bc6a7aa400a708d4bc112e26fc756724f533dbd4a66fef086bb83596720093cd1fd7f5f6ff7c3c34bbf44ecdd3f9ebd8789984249ad515052b2e35332f46dbb15af05a98c859f4ad542d5c20d2c0216881612c41d1e33135e5e176c7c7e2c83b284e0321336be3960f2640fe198f803213d51d9991feb4b8c8ab110ec85c6c9b4a5afc1677089efae642c2c4a800f600b01189d19e8d2af217ccfc60f91f632cb3c323892bc331ec998d21a3f47b9bc15f33816b18d246c746843c95798e5ea3b12cb9725e18cf51310039be6f8e06a2b0210e1b4658be59431bb125e94940666828192a39b7a395987e7559e43679a7ec90317f107bcbb43a2d6d35176bf1988e88776fe0a26f5ea1a0f1b270918c451140a021c7cee697958f7cdf999b32fe71cbc50c7c71b4c06fbac950996b1ed522f9b60031ac98ce4737b8ac23dcb55b7bc5aa4e47fa238c520f1587223741717ab9c23c9030abae350c1e6469d40531b4da871dc2ca8ef221e5ba753912b3b6f27105df8490441e18713dac70628afa54582a3598dea47926eb74852cabaa9e980a3c539b5a375a6967782960832c7c4da39717900ada4ea22b19179402cec425dbe965665336a59261aaee3beb83849358103b9e7128bb51cac1e12c7d8259efefd0e8ee0bcbc29adbe959c6750e3d63f1fe5e99a19f69c9829c38943f3f75d3e7ee85dea3851892edda357166bcb1d85f352f4e54e058caaed2139bbe63604e6df6b3db9a84fd1ee03a5453685703c3b3a0934015f28251276ee98f3f1471ce5ba93283326ba04bc84831091501b995d88548b0282d5f4ba863caaaafb7e179a20cbbcc8adbc9e3ec5843f68d11c48a68aa7a1b8e1d79df3066e8e226680bdd39df61adc10f574fb6e7479eb61aa73393cea0528ded8787d770768798e933e98d3cbd76e8b1d0dffddec2ec3009be62371506271e3794fd6e04e97bba39c901f3893ab8f0db154c0c34488cf8fd9d0cae3b41c0a5b411ef271faab354f15c0cd102721248146201e4d706098f971c47bd0a41f274938018b74d6cd23f9fe98577450a18313eeef2b74a31d99c599bf158ffe59b98cf962333d6bb6957c57f5bf4db458d49b1c945e07e7aab19ce96e9a9942b7df00c11c07d11ada680ead2212c2f6616015f07d2af64ecf6cbbc64d54ec158e2e720faaf8295cdd5a88f59b39d5db01d2231d2aa462b4dc96c63f5a871023b3f3f9fc81cee2b5ef6492802912a57a42d73d1f484917e2a7127bb017655e35703ee261147b59d2fb6a7ab6f1d21eb95df9eb04f57ec6bd6ab73951a68e43aba7df587101090cfa2a2abb5a43ee7040cba46d0a023433cbe03a29b49bd44680b6b851255f5ba9d2b53133a388214c3432d932aef385049f6bb427a7ae47790f443bd85f0c640954a3a91da8ceaacab232e0e42086213b54b14c0f648f6edc83bb8094980153f8d9f4b63128789954ef1b2027a5fa503ea9f106286b89c36d9d80acfedd9b541bf2634568f321dafb90772a9adeb9fc69012dbba0a5c49d6b0a1dc1f413a5fbf7aac2b74f06a73e7896685f16f1b592a344ac153dcd1f2661b2d6ce83f34f5feaa804fef84298bde548a7d0a3ad159c7de0509fa9db69f490f7dc516ee970cb71bcdc70b909d0779e5be6ef7361f705f33987f051e65a6aff05310b5e098e1a1a894724586d1f0ef77f2e880ccdaa4740f5e0cddf6ed5fae7df1c046e161a3a7e020a625b4bc9e1cfa2df564ed88da79c18c0fa9546013e29d1dbc4833cdeabeeb81d5cfd32eea22ae2d0ccb6ff18ef020f2b6be8ad09313789e58f0b7345843fe8492c7cef020d8aa288f0ece1c42ce799763041bba77696baab610927ff6b19d00a324f9b56d8889fd409c738b36c6d7fd9e6ab9d91bcd3fc2bb7055f7be4122144c886bdf5a2aaa433a0e7ac925e220ad55b3b630502f80b05fb27ecf7ec8d3ba982feb5007eacbf9dda6af59b4f4450d2fdd4137d487e161d33e452249ba153163d27c94d4f791e98de939a21a530d04ce1582e4bdcace69a33155398c8e491ebb3b6a4eeb356beedb689e7522215c024b218225c1817585f0fc72278ad0b3298d0ff38c845ebb5365c12b790724998d896355c61c68b66d7b55cf6ac74d1b58c81ebffdb86b3740870e125d422988e8866d72fcae722943ef31c1d673454f0a86bb50412712e4f5bf89503ee559b329d89c7ffdd57385800cdca8c34fec7446a48e5ba7c6197103ee465b0639658d6fc31e440f7229e3d92c682f3d802e4a332a6431115b8427f3bfdc7a0546d0b7e94773fdc1d04981739785f37b8c79b2ea9a40f22dcd97d676f70fcadda91bf902fecd3bedd80db0e40e91201", "52515163", 0, -80422014, "f01fa9030f7492487195c2538e5791eac77e5d245b58c52e73c3fb30896a6eb3"], - ["030000807082c403049653ff034aca231e7ebedb883d32564f3e08efeef5e5bc79a660c53b9d3665190200000007516a535163ac63414bb303d42533fa47cdda4e8b47674911d1e0b2b39014710c6327ccd22b957de33cf98e00000000030063acffffffff01e75bdc5a50fc3cac114dd7aa8668ad6383b0cd213d7ea55f6a092f8aef54500100000008516a536a5100ac6a6d93a013dafec7b5f00cce43f2de8eb41900e6b8e0fedbd71241aa973bda0cdc44cffe590100000000de127467046a399e040000000008636563005251ac63b0e6e2020000000009636500ac535265ac52af1b810000000000085265000052006a00dff9290400000000045153ac52000000003417bcb00100000000000000007031ba020000000097828efee310acfa783ce248ab879ae32963bf203004cc2e48b861069410243ef6125ab175a91dd7ec60dd7aed8a3deb2dc1f61f4202878d8384fa96491462490f6e5f8497cff41ce6dda1589db226386c6d1ba75c2bce8396b9c4a88d67453a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009371c374b2376a4b515925c42bb50cff851d65493e77e2a418dfa1b3096c4bb8be33b5140d2bde7cde01156850ce3755b8b5aba3158644bfe452f75c580693246db7afed4fd90e5aee710535e519649e19681bf6cc7e830c5bdc0ebfbd9006c563e07aa6642c601dcd8f30313de2f30ef1a86251478a4b224e35918d66dd871a022c522b2219590cdbc7480b80979a131cf3fb3de973701ff6cb40f0a04ecab0fe021292b7f9a8b37d10f61699d5ee2704ce7d3be4eb3e8e1cdfe3e47015d5eebbef0b019e1af64b4b2550beca53f5b44a2a6e07980a4eaca0bff664846adad2c9f9f0f043ae2d18a715bbb0659b6cb09e1050aa77da14f81624c0809675fa892ed2710300b127fac9b3d541f59fe8011e8f94e5f6b4728c9bc3ff90a4aa63e67b68a93e022d0dbfc0cfef9df2c06c6418ce69871fe01541258dc22f74ba0243499d5283b1020403248b0820ff5ff99eadcd8da42d8a8d66c4345d2cb3794ae31a2b0735424c031454f2847a1cc750cb143002e4bacaa6ae450d2d2a44881ec82289265fe32dd5030e76f14f5547e01530ca4249178a0424dd4b687b08dda20387332cc9334c55cb72861d3665620e8d169b61ae62f4c7febdf589116cf9711d7284435b0f8645eb6aeaea4aef44a1aa6fc4ebe522892a8917b77038459448abb3b3a502e256721ccde6fa86a8fd6688ac183e6b7b6363bcb1bc478ac9cfae8f5da2ecf3fdc01470fe6c56a5463a13ae458a75c64e4e1778a382ecc170469e5931205b7a556b7cd8c8109189d68b2cab87bcc10a79b708f0fe8b306a6d212e3bb6a6c97ce4c76447628c6b9de4e0c531b6979f4eab8d6cc1042314dfba016d9037cc7a7889a52dcb522afc6d92fa0d7764d949f94956eeedc1558c3c6699847ecf0ed8feafe3b25ba21b13da60b3e3f115c12d61f13233a7c43d7c38341226ba45fc58bfbb594752343892845c5574944f4351c12b6fcbebc91e6b6c6ed6ad6b29e52a1df21c25cc2a64684a472ec5633972a7d39cbe7d93b8c749860fd4e38a2d757bbc189a9a5def11164234d2f89f73d2a26147c6376963e42457a2da288801af3b70d9c00363d96224e61f099d961810afaf59e6a4b58f5a2364b4cd35cf1ba32b7f7e5bef4fd748062630772a9f4b98ee85b31d6bce0e52bca71110425cd1ff7afe333241ee2cdca5a3f526f1f4349870e3399725b0eac76f9c02663ee7a43e64712d098f510dbd1091b4ec37757aa86dc2fe1cc8fb2da0538ad2b892c21d7e0eb6b292535009f3b80b634c1483566954372fc7e3d81cc28c6a51272c84ce4611aa7b48cf982a55950accf15f777431e30484ce3bcecb5bb6026ac215d871541f49afe8f62fc4c09c557dc0f3339399411f25ab3a3076ee99a23523164bbee01d05b15bf36f053e2355ba5b7870585ba19954f8eae6c4901c996b3026da2b19ec1f9c0dcdf796a72b43b7fbcb940384aa8e0ad53427b347c3cdb1a535e25f0c09c716f9869160d75a1300720a500f5690705ea91b3339e55db0cab283ee716e5937314aada7c27ba424ae7c6238ce250fc104bacc9929f86729d74cd2fad7f1af9849e4f2528b8affa833d1e8ffcb1c7a99359321937090e7be11422c054360e5c3c2a8c2d33532d02346faab65ecff0e3ae70ddcd235070767b2656204ee0bb2ee7f6ee1935e2b20b2a8249c4a6be1faeccdfeadcca9663b25d618fa5c53c9ddd609f374f1bfb1627443d3247f6c5d3791207c0ef1352609eb09c6fe9e28b11a185c5eaea7be52b9b7cdd04b97c258c3cd3e381093de9751d39151297e496f83cb371b0391e556754ef846512348f4911f71867a0c6f9b80c67804e964308c5199e63b0e427e72dd975fb75089bef330dae2fa243d85b325c0a6b703fbbe6d3dcba55c1c475ca5b37da5144340cac811b5de9874ed33f966ffd45d8cc0ff87cfaed9479631bedf9a56daa3e7d546d818603e9c81910b2bf3dff60aa7db87127b0eb3d846ab1845790b8c4a9883b4f083f2ed6e561eab7676fcc4509e369cae28f239158b0050584bccf1b972c10dbf3fef3718ba33ee1192ea1aa9b14647f8d5b591d4b9a9c39a76ee74a9542b8572fdc556aeac4c5568c7e4b607328b469542e8204bdebfe1ec047282c8c36a8453dd806d0a22c5d9ef234ab591b010282ca5dae6e3c9c825bb5b0dc93ec8a96ad3d80983249339ae1836cc00a1df58db6901c19c530f44484763b0667e4aac8dbe8e8f975c22a1d74388e7d048bac96a93a4a62c1fd40baed44296b2dceab9050451326edb95c0d48d13f121199c52746649259086ba058b0efb53c7d44d299cdb7d88f20f4ac36452752617c9a909ac76339b3a1f33521acd1f79908b0de8a9ec8c455859af37ffdf4b128670c586c01fddf3d136e9d9441a963a78328ad247d2a9d37e9711155600", "6300", 0, 1642677251, "0458f0832ce5aa17ffcc672f2487a747e8d77712429807e49c41a288a5012082"], - ["030000807082c403038e717c06afc8e22bb67ffe9d7f3909a46b1acc85c1b6f5c81e1f79237b58e02e01000000076a6a6a53ac5151ffffffffe75535abdafb66328cc9b2de441a52879eadad34aec4ecdd04d365aec7d241890100000000ecac9781f9d8e1ae16d56140130e4e385bd7df1cd8d19b94e20e8a2d4ad69e3ed63a84c8010000000252653564618802fd96650400000000026a00c279d103000000000851ac6553ac6300650000000000000000020000000000000000a6672400000000003c9cd0402263aa09151e943a3ac77b547a7a83d7eaccb922796f6ab4cb7e471028c04ea5219cd20fcff55427d23840ee71d16163aea319a2cf4d137a0d59aa0d74e0c6b68aef6a2c61689868cdbdeda67acb78510b6a25344ea3f9741e515d1f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005f1598ad9392d70c63f2333747b2d2c387f0d4d73fb69873f69bb109c6d62f3aa6ae26075646c7fd38cdcdb427ee7d1572520200f80afa5e40a956acecb1a8ce5e6c5dbf4c4cea2d3d7fdb7fa70f246e52edac8d4fe038e54a152822eb9b57495db6f37aab003da6793d614e1023b62df3bd7931802f66491a0203c1115505103022327b275136f8094ab1016d99c1fdd05b7711c0b2c30db53d812e9ac8833d5020957323a480e7785d80294301ab8140e96e8687cde44ba36fa24861e23a44a3f0a01fc7b255965f53947d0aab869c992ed4434b19f026accbe7baef6e5d9bc63ee7a715c656dfbee11018836b3544fefcef8b888dcb84cf8fa67981f24394025e9020b3ee60520d9f5da173689e3cd1f6c50a168975023dbe94f2480cc2b25d15619020ad2344896cea4cd5802e4b73225a47eea777b5685c54ee1d28b4a930c02fe2703030914e040224d39c4ce40ae57f07d34d7b3f61d91834accd00e7f533a43ab0d03240b92210cddf097583fcdbfabc97e9f63b13392a32d3504551cdc202e66d09b0309426f4adfc5e0b0f473b8677d3fcff0f1f57c368d1ac7cca27466eb796aadff357ba70d976d6c5b70059ada06f7556fa56a1a08b1f91a25d2cb1d1c33d73374a7f528d93201f40f041d41a324fccc2dcb3927f1724179baebb029685411a5acba8f0ccc3d54ea03c400b041d3b14487198a7a2377f701930f77a814867c5ce8b9854f39b70703a4c92c210ac9537b0c03bbfed4b6604bf5db1d658f38cab34fc6fe5532a2ad41ea9c696fb475a80227a68cc8cc7e4d50ba2c6424e50ba2c9518f6c02989f31b96357eb6407b79b7c782fe44869fb0ac549ef33e6dd9c77a833af9eca0a035fac17b319d4f9bdef9f7e7eed69c8717cce225b0612ba5f9cf3131195bf027544472b849a2247303eedb6e650d11d10f4cffafe33ef2752b69cb6e5860c75bc95bdf4309fde293c98422032767d86ef6b9a6b8c33eadc4dd10def9df4040850d9577a645931fcd88abe22bd57e6de3234a89b1a99669cfcda55279f120ec38f83edb99cafde4a0300e4fdf22d0e0bdff5c11180e4403169d3e7387af94092aaa02c427710cd50b26d314a19e809f033fcf0eb8f2fff3db1195dbe95b9cf73c7f445537b7a44e79ae2c8fb375fe997e19649354034992f5d3049d2b30ec12b2fb87fd0e44706cc0c80680a5038bb2acbda3dd850cc842dfc4c3c687dd1db69a20acfc898d1411b556c4c55ef36567b426a0c438d59d7ef036b41823a693802b74a5ad11654c6d3fc6a9d12ae5a3e6790664d61e29a6fafaefff1e63ddb06cd5d91a39ea7fbfbe72af1a5766049251d01fc98b01690079148716416c10e410c32df096a144cda56a52de6913d4c29bcf2948737d895c614228f4a8e7a9b05eeb8a29ae06efaa4c97952b78aa2be6806cda5137f9b9fcbf844da9eb949cc424597d24ce765aaad56e6015953e24f802bd08065c38d67806ffd54a4a91d6d1a603b60b500a01681a36de79ee0ceae7e72ee94bf07d5897db18f6989ffb5b908162de778e2f4e720dc7fb786db896c14a12807035f895eb69a7129adea8a42008322a90a1d92105377552e0a764442675e19bc596edf725fe99f968c911e803e436daf3a370c3036e2e2aa5ff34556d9c6dd87e0812ff3d89a5280f78075a5783cf616fa36024b9242924f1e9099ae4f09bcb4d6310c25968e03be945e784c87331ea3f678ab7ea6f9a40b31dfa8ec16c85f3892912940c3760f52ee5d01ff942ad471ae0d42189f80c3115d103d6be78624a36b0d131ac986a31759248b799161d9980449f1aecbbef466e38b6d5a6a487d33ff689e4aab962db805cbe17c3af1241c3e5b5bd9c90a79d2152f4408fa7e0d823179f519a6b7f4389e9f8386081520cc6b5832b19aac238c3531c08372829f992d9b30849e9c18d2c3681aed5051527b71cedb13c425bf72bf5409008bbb6bad6bfe66c3b35f8475f644b6bd0a44cb0f20a6b45407a7015b604339a6d955712dc83cd10a3f25bc40cea0430c48d957277185a864a2f0b6d2c56ad84d926f2efc382b0fdc4a2f678a6c3e090980e9903fc98b98b58ed48eadaaf2ce4888b73c7b1d7a2edd5a1d17908996cccf5b578903477f380cc324559bb54900bc3ef0f4f955ed64d68de6b21308858106b8f6c3044f511a4a6268c14ba3dac5d8e2213744bba6cf2f1a84b8d7a48412f8b5d222a9b2b096ad13d4cbfcbd854600e0c41a19b61a60bf74398dba6132431c4b64125955de30d742f8fa93a993756b0000000000000000132817030000000030278612f41cbd81782a97d8e254d7ac5f5518d64cc34de1ec6c8bc9cb0c5426a5b68038e159242e9c35ab783f83efa408efb5a60a62c151b16f6d1bee50cd508f5198bf32813e5377fcd4671e3cfc82e8893abb9807d68f5ba2fc951a23c69a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000048b345e1d02356327f88fb91e7e7a0073a4e9e066febd195ec17d45efef3dc61de3e98d33bf584ecb7d246943e665607a7812e30e9586954e444d46c76c654571d64c783d4690ed4fc8a240de5371ef5e40cd9490167e41dd1b1c68d6786642d54b57adbee5573e429856b4c2f5838686ddf448fcdd434d09aca2d5f4ba76700030fdaea2f3e2406e26e50d2ef6b0a8ed77bd868625ffe82cb40b0a69f464f907d030206c1f06689d00fddc0673a641a9dfe8ca26e1a6388767f6f71ac4ce2239f5b0b08703b6d437c75ccac131f8ee10e18243d0cf076e75676415efd4fecc0e50f37d938fca18a80653208d745e11da0195efb21f7d64bbc02124b28c77f0ce2e90c03182dd1cc3e76a133b1113362e9c52f27405b9748a074cca5531d155f996c9de0021cf2869f6adca00f24ff38a4041c0b8702ba1964f1655baca2725cde914ee9b8022ebe86ee00ab580a3e68787d944157fd576084254bf2adb9ea88549ae9af5f55021320aae6fc9b86f815fc60763b070ba06b62f4f42d241b835ee44bb50e42bec40220f23f855800793b19d52ea3b341bb133f3c0b48d082a37b4369436496543659d76cdf55e8ab9417b37e1c6073342fdcb613dd2461f85e9438a2cb26412e27919665c7cafde6101da272856e723dc5ef1d504e7c8a7fd410941a2900e82aa9ff2fe85cf646e7215b467de4fa78f26251a3d511d9521a75ba34c78a3fdaea2aa5b54568ebf1faea68e25c42e14eddd0e7604fad4cb46fd0f806297405edbcfdfc33af3de699a1b31d8661ddb43f5df616ff23bfcbc53f993379ee37524844dd8c01982f2f4738e695d6ed3a1a8c5f75f29d6f8d7c773eccd9373a9a29b7047654010fff50ab39080fadf70ebe3d575e79920cf59538365f9e463ded82590f48d199f883c88b0b4495af4ac1cc958a97b25576a27e17fd69a183f7da1391fedd8e125bf70660bb1ec8d0b01bf2dc01b98acc50b4cc9eb0384180c6c744209d2a7bc6d8b610b03417f5107f6c2b489b2609386ff49fdcb80bfd959394d44af675e874741ed1ecc3fad4697508e3994524f364d903ed04ca425c766e6874d5dadaaf094a26a11cf55d4529cd2936db084962c9d31021d9812b48dc662d7f13d6cf12307a6de632ee7f360a35aba537678c79aa30ccee0f96906d68ba262cba7af40887d4073246c2bc0473686667957c13de29bf7a8e91fa3ae0fded44b4e74a6dfad382f884ddd538437d709ec72c26aa32218786f4237d82814942b1c1909fde69a9ec65bf24aeae27d0d56a0f56fa4d188d4f77556d93610d3e9264d86654691b58d8e3ff3873f444c14ce08aa42d2e63d81c96d5fb5d98dfbcc0ad89b670b3d3432cbd9fa6d00ad4f0742d3f5031eacf2ad69eea7c89cfe872ed01358f069d148a5d1db95f93ca694ec95cde3f0618ed458dc4e6580fd38b291ced236f1d02c98fb3f2b0a7420a1eab11840f4ce513f3c5ed38dead44e90706f04ea64bb5a193418d1879c28ba1be6291cf78ea904f2d34777cc9392b87b403bdc260f1195b7b6f61af3faa7cb4389556b94fa9ab379c63f6f1c6247b464e75b7a635028d1a6a545c3f8768c3fa345bc0d92adeb55503da87c6b7f10a656d326c4367001b6e1587bcbf770f2cede916d638d04787e90b1d75feb6580e6a5d034caa027a3bb60c00b59042064adda7ee969927789c0790937247837c0fbfa375b3952bd36ac5cd0a6aaf77c0d55a8eeb08eb568ea099a681d7c856bb681e1601aa03a9b0f80e5b46269f63de1b10033c54171a14dae81622bd01df35080b7f594a644de3f0b7c79c1a1574f2c5b1f0dd34e9c43ddb66bd021fc0ead3781287f963e21f1701f949ddad010be045da02e93421cea97ad2fb40e4f2ead64e73f53229152d270ed4093dba28a13e649edc147345fb1a7dfb58bea898002b6546e3dcd2d929080c1170064b5c23c8533cdf19e6fb46130f8c541f9f56a4ed1fb19840c8f2cbd8691728a347636dc8679fd9ba9ef87a311855b04307cfb614bedfe476f0b0cf0ca1bc1a0386e9565a7fdbf751a1af55778e7fcf579c0aab9c8ff4b2aec5e1613e82d192123728654e4dc15f29d557d20e020c05c2170cb3c45f7950b141c44f85550b805b6adeab9627191e675e59390f483126db753ad40bab413262dba03ab73392217cb8f40e1cbabc551043d91fda190776023488879256d238d1f128cf7db43a1f90c2f051846b47135b115b79e807d7cb377987fae336e22d8c5646d96ae3159349f3b04df007ecf88957322c03a9be9de1237c8b866fe9c5acd20635e5b57685b7e4b3d142c4a01c9869e861c24902dda05e404420598f63031ddf4bd46f6796311006f91a8d5ad0007fe18c0fa2fa9b92d206f9512a0a5ebecbd65be653a547e469a62e60b89d4174af0f0ecb4f4a900a00", "52", 1, -397837202, "be80ba86194bebda79c7235ccca2cb872c36f02f4d08c3e89f0b2de08f1d5512"], - ["fc93f268010c1270c8ea5ff9dbf287c412cec17e1954270e40474530ae36e5ba4b6e8d03900000000001ac9553bab00137509005000000000165c30b5461030000000000000000e266ab010000000024e96f485ee735ddacb02b63e5fb88158438d8602d2292735bc70b259d5635aa527f4b2e2bda57a79429ab55696bbbfb4a328d403b6e8e5cc02eb43cd6ed79441eef0d618ab258947cf400282bfd4971192a400c071e745b9f7e6c1b60e385d8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e59b0cebe31d810cab54513021e1344583a1ee3abbc7fe5d200a646bd9c16da0b05ac51cb745ed5d2e1bd1a7843a2f8ef5b4cfe87e64d32f7983b68fa882ebd4b8df7d5d798e294572ed6ddd8846bd087667bb52cb947f5a1b00cdd833ba86384072daab1ca8e77c2e83a35cfc4ee843b0ea03bd6933fe9869127a16e17c915021a12a3e261ccb02b1728c776421f4201b9ac0bab0cbbd3a3f34a7c3c6b3591bb021495c35b4136dc553411f6840d825d87fd071c9b29e110f9cd0bba75a64b243e0b02676c611c9ad96160056c5794c3a89e9a15b0766ea1b2b157021ba3ff5ee8f84d06f607ea4e4a5582d2a75564b2b0b9ea3589eb9f2e037564a52de9d3d9895a0210b73d9225b10ecac856ee36c00cc6dc434e3a43aaf4d7862a32969b6f1cb1870308170e633c9ac5fbf914d71fd626dbaa6cc0e3048263d6f0f194d5d59bd47b9f0207af27be79969e1a161e26b94606239d767122dae5ade0b583434c16d632ef2403253d74ce33243c148a088d8fce0169b7ffba95d4b33aaae634d12ace746367b20204678df281f820df6d39c70b2226c7e937263fa47fdac820a9d5a49662eb999b0a2e1b8a31a41f6fb699101b3c1f872ac446971a20e38b43ce4b5654aa31650e5f1e01e00579915401e53d9d121beb7d123ca01bb92b71b695ce2088fe148489188a9e28930808af5752df91121c6ccae48910bfe06f8a4c479f2cf692fa5c7da18f0543df6e215644bea63a6df28c058513fb72423b0398292d74671f0ad3de35bd4f50e4876177543aa0fa562a757c5783f2dd714e447bed9462e7752c33aad160d9d07d2bf392e37c39d11e3e727b7363584569ab4eb8dbefab98845508aedfa49b785836686ef02729f32b6651af45d248f6d581ef2640e7ac0d01e037bf866403cd67751fca469e0403b331a590e21a8355e79b27c245358ebe550002e54a19eae354c3062a2c9a1fbbf23e9169a830cdfc8cb06088e6e323b2bd9b9e65cd451fa2d205d841447b3bcd5d2fc19752acb59f8daa6da1140e6c0259bde05ca9cd3b03e20d46d5b1edf3a87a6f4a5f60a70da6f3a6ff13be24b435cd89d5f527c6c24351f075773e6489acd2a12d23806509c85f21ff5f7023ec0592e402c5321cd2d13955655e80df0219767712e0a4efe188c387f5b47398527bbd9329bf0a6ff8c660b57aac2a65e233ac114a95123fe3d98b7f023797d3ba6322ab2e9b8d5f54237b1e009bbfc99a7c086e2ad2eb374d23f3b9da2c19d695b434c092a208da5102dbbc75df7f6afdabd1cad5b4405f306b6fa0b4884aeed331dc78c56213eea2125a8b430663f21c94a24badb999f83c245bf84ba7a826fa33337af21a3c526e3dddc6b01f57f812ddc13e5898bbd061d9f30bb8b27878ec4da85e7d0bbaddddb9081a8e26dc11bd73870e57c14d1788810807d288db3290230c3c499bf007556a95a8432942d16ae74f30a562f7314098de05ecbf681c716e7182df155a0768a03db4be44adc9b9e71641edee8df6c4de9e9b1c837d8df28139de344f087e8bcac9be263015a8c6fb922bf25e0cb74e0b1d55996b75a4c1d1f184fdad0a0509c571aa10880a00d52119d3220afa7266e047985c7d3be5da30f5b99f3a3e47af37d50244548dae66e6ca7d5c58e1febb1f783a96f5a16a311c9dbf77d27f7c11a2a074eb6836ffdcedad13c82aa1b2fc89a2c297fc8e58f9bb49e716fd9a43e03fb62a1ff4e947607c59e45a217e2889debb4ef35c948626386b62b0fe6cac325e5837fbd75985fea6a1c46f1955d2da18f237ad73e5bca6cdeeb5b5dcdc22ee2dfe618b1dc372553a64846137cb91a5b23f3785add33a9ada23de92db81157d52720ca188636960565b5d515551155c4a1b80bcfeaa763280955dff7bc87b75786c4edf01d295066f233b80af673dcbb78efa947617e5a676dee3e5f0043124ecda2eab3418bb6c8acb9537ff1c64088b090e70aaee5b5025a44383b275e8196ff04adc0c78a8ab6c0b078bf5b6814cf36997b425113a9e9712820469ad1777a2b0c75a9d5f89d4f6f202eebdf49d59efa6f0888c1f8fa7814940f2a95aff3dcfc66b5eb6d60bd770b4157d83aedce8811a1471b58ac2652d59068c99243574cdc16f0989ecd28b133b27ae71f140aae4efbf2d4aa54cbfcf3dbd25393addcb10d1c78a4655394409846ed41d721eaaf0264c77d327b21d81c40cca7ba95dd04a976175f7fca2e003eaf26a9f146ffa9128092b3c110045fa3c75dc14ed87a3f8d65fe6f04b4753c2f92507b531ba00000000000000007426920200000000c672f0649552a54b2eaf4049843456419cf014359aa50382a7ca4940a107b11709bcbdd70409d2e01e7d626c035351cad1a2031ab3e96ec4b20341ec05b04d763d4309350d21a3493ce498aaac3d1508b2e9877531ae42f71765a8c5ce67b524000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a93c6162ff5af4a68be0de55430cc3b3a0ce4528858b6c9b6f277d33632269b30b5d2c5284e1746f4495f6416273ae9d26ebbb98d9f596af9386c5cb056fc3fb80f1b2c97d28a4d21437e2c1cdebf6745c195988c46fce85ae1175c8ac0beb871a92586befe300efc112d895d0e31881702cb987a81cb79e04e0c98e0b24d8a02219aaa6d9f4ee0205d2535aa47ea2a426c722793135d0d54334032f00e1a2acc020ab65714ea3110553fbcf2914d4a18b868bd8dcb5fe1628a6e367ca0657515f70b07d53564fdad9ab6e36f1bdce8c43baaa4b766d2267b4cfebdd1b7be41d16b0b835e2bb5660a1355fc3f745001478e42cbc4efe7846522aefb9f08c5ae6074c3030e3264e6645f6c9438c62f6627d1520a76a0e48d9107359e24c8c212cdcdeacc0208adee4482b90c0364ac893ed0c09e87ce7f1ded8af08483f2e29268a45c46c703294882e68fb125135f6e6b94502ead418405747e94f64266e2f020b039cf92aa030eca011a394c11958bcf147d88232d28f73d551f878296fd3233d438d0acc61e0329bba984326b9241d7f24a1c20f43da5060e697dfd35b7330f5a515d7e9d45c9e3b42eba371e4f169a49055ecc72522ee4cafd41a6b5fd9164e673dd1bfe5edc1198a173008e660509856696a86a7b13a2d5bb10b952127533ed32223ee8ca97c9e8b22fbc0106ce0e51bb4c4b7f1703e30e6ff35ebcc78a3cb27a32c260806f302af4471ef105b4da667f7261c63977c4ac9d3c905524ce3e93911b0d7c14f24d15c6a66c03b9e90d0ff30ddb393e3616f86db19e054097c0f9ded4b5dd8c7e249ace0ac7c66bf703367410b2bbd6e54cbb97225e047179aeb80da134f22229da250d1bead15d44601ae8ea5914c0e43fd7678fb963265587208dcddda72796e64f3bc9c39e3339f8f753995bd84501a2976276519927ce1db1c0f5d13595ce88fdb522ab90e70649d96b193151f7f4ed89d3c16c7c96bc1b95f528982e8ff617daa037e7d53f29e2d02fa2dc8124236a33e9384062d2df4778733f7726fd0c96a60b7c5d3263499406baca511104026b173121d1e26b05bbc9fa4126c8ba09a2b0e17e32a98b017a0b2567ba107d7ea4f533ff336017a75e9177066b189394d71f8a0c8aa82dddf819c9e647ab735a04ca4bd1f9f40b0bd3a98955853e47cb2a4ff667ec812310ed14ef20b7ccb87e82f916b2ecad25dd5b90f554ac0e215de008a883f43149bb8547578278b703298defec8e3bb8f96f588e951466accb8a1a24809cd6c9d3eea9a43e4a5450678b6e01cf2bc39296009601c643f856921a814c64f4beb014857dd7027a780bea96650200717fce5320965fe7ae4127af1d79b9ed32c6d1cde2992d024c570c42a521d536844d6b636f5151df9c5fc505af8166db388d006497894d208c2d7d4cd0c51729dd931659b6652a8b6b2b4310c58381a34955d628548df977f0e1510823991fb78348d342d0364305cb88668d486ec7fb5fac94b67b852ac6508c00eed61a4b47b188cec9ba73bed136746e749fb7ea1f9e9e2d9f0c3bf4e03937c44f9d3223a76856b155d4d79f6bb287ea30a61fa13bc8925eb54814fb6594c1142644d67d541d7b045934e1a291a878a11eb37df254d38d022536e01ca90b0370fc52c0fa578b0bfaf238f2649968f672835f28d37e2d33fb4ea6cf4c500f4a9757214496a78a51a1f5e92323fd7bec6f28db5e82f52f0261a7ba16d6caf0881d505c0764413ef4035b737653a45855e40632b018dfef274969eea4adb9631bc9e836b4c9bbb8d4c17b5dd839374f5afe2e5591d45d3c7352df62c5ab2d7e5f7344b9993a982942df487200b70195f2df764aa1b24a968c53baecef5481235f0d2bd4ccc821f2977c969a22d6d5e774e9a791a01988f9931fb4fc223bfce593d51588f132baa18bcf0a6639ca3b3d65ca8d46c54f3a335e13e3d3f5359097754988089ff0607caca5c6bafeee4ce8b91b11a8bd0b3d12946162c90644bd63f125bec32e643c1bf3778e23b55b9202f72ef29c3c9f482e061a20a7420427d66a0504d64524083da069ca7f0eb7d9a38c8a37a804eeaf7ac3a90c1f18c789f7d1e028c5751d18486bda66d9f6c0bb6480b7091813057e1a5d3fc97f8bbd772dcd9fe2ec7a9b529629f06b978a99a392b3df82ef138cb7057e3975e5356e73573a286f037ab0ff819422faf08f0b66d9948e3243dc0d8301091c3c8d9b268802a9b6d1e3f84c3a5d5b1117f5e82b3f574e84ac115eb024b3b1148ce8bffd9968eff84a8ddc1a903e3f020000000000000000000000005a98258775ac33f5fd2a55d79126aad1da3ce50b2200254f38edcd873d597baa0f74e22e67ce012ef887bf08b80af5178feca914ce109fc22bedaac470d8735aacb69aa8554c1366aaef0d460da2fba314118e7c5326bc967f516357997a167b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084ce07d531901afcbe41c83899b014112403aa011586582d8ea9c24b17d62b9090d4680f6144a22bf3ee1016407776a09b933290d495e9f92b8c342c7f9fdb19c3d5ef61fb2635ccf8279927c2535265e327019e88f9ab00236e3aec00fff2e837a4057ded53aadf74893c8ff4ede84ae9b6ad3d6ff8eb2e2344150f22f9421b030e113f5994f4d918c0839ab6c39235eee89b33adcd56db835919df367e5d940c022915f5b934d03d328bbd254b85b934c1523d6d313302fc7343350e99c0eeb0730a0499d0e2a37d47a03f709b65eceb6a1cae6334d708cfc24f8b18d53bddaa59f23e5ffcffbd25e2aff8705bea49449e31645ee714b66fea13605a361180cef9ba020fe7cdb09c449030873365d751e830ece8935f32f965d73525673edbe0df1ab00323904eacfbb4d5b6129fbb717b51acf57d72226d987bf3d4b318444617705d1d022f8e627c372ae098f950df00f9be020d6fc6bd7b9729365f971e65ccadff7c68032f98e426cd93c8b9d48419d299274a9c8dd2b78c64f46344886638051537231902086d962945ecd89dedfab9668d92cf273673456ec4effe6d74c2f57eadfefcd7011114ad844c67b222e24afa5b7be3da1971313ccd006e9622c5a9e32e081d36d9f916b76e053085cbe686ff5979a31f84d867a44db24b795f78adbc7b65d185995ca468c4341c09f74d02152864b644f86456672fadc882ae058e9cd6dafe098f4e70ae77d78ddd587bb59758155a9bf106f74ffe07540c352172fecf82d34a6bd6a6efdb728294fbbeb49ee8e38fbf4ccb12af9c25d3a7a2b445f9f2695d979ea4698b9948271f3264684d6e8eb2b9b12c200bf6c11adf82a1180b96518852d05a654901cec606418f4c33bfcbe6de75d2d7ed14752ab44164664853b07d761eea6381d5c922b4e10388a52f6ee979d4f9b1dfdaa1dea89c5867ec466d09a502fb18c9737bb055d9fb3a1161b274edc83d5d3dc60c588b806b79be271be8361c9f37a2fe9076bf51bc92fdb526cbcafafa5f46279c8dbfc401b75df9075a0d74ff9e342a90c90b2d838a0c07f3688ba03c892be02ed1f636b56c50c9d3e25025d7427406f2420e693410014eb4f9b80c35224c14e13e5909a557706c84b25215fe352fa894e4daba04d8f8150a986809bce5bb7d7138423495f868de45e356428f8430bde1ea3bcdc09bc04281039193c1ccae54de3a0ee764b46874b828a8dfc34fb4be5262453fb32a26b934f3be599a38fdbdca2665de79f7ec4b5a80a22d97c8becd213786f6906541c810fea0afc589b24e8ac41fc99cb1de081d2ac3d75da20a1d38e700705ff2a19f414a45ef64bdeb2a8b92602c8779c3cfd36044e9799b0c2882998612beaf54d9b4b6a87dd7bc436cfe950d3501f070d1fbf155972a2e9855220663946d3ccfb3af344e8032fee049a6b5104119069932dfd09695df482087715fba08a5730fc79a4789ceb81b55aba7070dd8862537ddefd6ec0e6a894bd72fc0e1e4af2db1aac47bc94fd67553274e4517f17d8fea9da19b6b5eb2e7c38d20b60e899d4538319edce4090b80ed76bc639226e5eef4a468b081a5fe3784d77b327eb1dc64e614394c57f78db2d14e1f0301631072a685349f44daadb3e6b3cc68bb20c0fc6ba28db2cf4bd2ce1ded572b4e18aef81eb29b9b05ff7ff817f8c918b78da20fb6daf9d10e3dade777c3196e16687e6b8fe1f3866c477a47780228c809a202ceb81f9430d6583d6d06a199508c9f7635fdb8e65cc3fe31add1e4db5e07b0af0ba81e4b67913836b539057cc09752923e7279492b2f225a3f026e7a11436c2e85d38f6805cfc99d90d25edfc6a5e78711a8c624fee2bb8e442ed8e8b41fb1899ea3a77f67e208af9f50b06335050b862552c52f98975c7dfa47fa8c34c09fb4ce87189ca1d7e00b3bea313b3a0f16727b5138fa1a024705ac5605aced6d47e28431b8a447862a4c403c38673159c7ca3951fe2d65ce93d8221f3cd982302ebfa76715f410c7b8659fe5a834d2466f947b7b175c91f75838d46d84f21d577cb02d0cfba9e67e3541346289e3e772000f4c31daf8cff9a7a2f820cf6d515c027a311f3dead0d43d555c35163361d65ece6dc259ad1dea24bc55052c2de16c6bcea155bc6b2cba4cf6aabb2c61a20660c3ee75c9cc47d72a32f12af6ea87714a295aaf60d94c743af92e65fa52a5225401c45f2ca36f55db7aeac2490f7136bd5d863463ee608bcf4d3c70339b1988ad825bd43a97cd7b9dbb01a460eeac110230d24a08e6509b237c88218395ff9f4a9eb263f981c60b7ba13e33e14ec8ed4ba07d209035697fd676e72e61452a83168cf596d2193cacf65df8237493778b604749d680cacfedd508585b42700e570b3684338d60bf07b940a40894a63d530b53ae167ac077cdde02", "", 0, -1160665220, "1b3da39b478776482e83d201fa40234dc42b3fd49e753405dad947c706e3c27d"], - ["030000807082c403019ba8032d89e61c077bfb4b1fcef48edf4f9b7c5dda7eb3a7446177b9ccc19bc300000000000391183104e21591010000000007635300526363659209730500000000086a51006a63515365f708c8040000000005516a6a0065f0e96d040000000004ac6a00630e402fef0000000002000000000000000070aabc0500000000ee3b0bb2b8d9a0f60668bb44ef2715fa471aaa1f3683ccfd9395d33b7ae258fd7e1bb09d059cee11acd08649e989e578220d97c6a88a10de67236162cac9cc7ae2b40ec1dc4e9d52c59afa6f2a2afcc9d8d7a13c72f6aaa05704011d79157187000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005d529c9ebd10c4f9ecc9b7e71e68f2eaac14d5e07619ddbb7374d9484a6818c6ef7f797d60208f7b575d01cb8c7da9340edd584c0b8f38037f75a111d55efe5cf561a56fb1bbb9faadc3f9e73606c1f3f5f2d35310990a4fadde2d808cab8ea7236bf0507781f32f6a7f04f61c5750872a68570017f6b2e14d7d325edca6f48c0225b7057af5203675c01daa064964d566bff312f015f90905cad44d16129ba0ea0209dd59081d31131d8f4397aaa8c933dbd70f9cf9b9aab697fc9388c1f4729b990b02fc7ecec8a6372907c8c79d3a41302ae43329a664f103450033f58932001669c42e27efa91feaf54f4a36359d6b55c8ba07a71979a6a383e60d7012ce49bccc031a310baae0d699a2e69cb12e939e9d062eb71afcdf685541fe8d483e3e042205030c52915333fcd7201dd50c1aa0d3fdaab968189ea800d6f5ba9300ff3bbdb7bc0329434de72ef26990115b679b1a8371567122c10f259e125cd863a36fbe05e80002287ac946fe2618687b5c4f04664c69442198df2b21be1be670714c013b3b9b46032117f8259a71cdcd6a65a9c4362764851fd2292ab8fedc9f021c597126a64b83557dea2c6ea6dca3f72ee754ef95ec82d5ba269363f0a430125079d5ddc95748cb5705a723107727e0f511a28aaf83a4e28caa6f6654838318810ff4c4708e9bda6cde04ed5ace6b876bd7633a0fcd93e9416cd579a70c5f80b13fd8ea7ff3ee1c6f835f47439a773e4c9257e5f38212535940f7e9034ff9de43319e171d3f25f66bf42aa428e53819c401e1e5c3236fbd2365e74bd2784995fb5bbd3fcb85f6664bb7f406d661e82d7b51799fd829bb193ac44bb8e207d911fc0c5acf5c315d40714fb31df1d59c2ab24bee64bcc2289d766b75abb9ca02e810ba96ff4c2db8a36e42800ccc40d48afecb9a5945416c6bff82fe2d261ba392823609af926d4e839b245673601d0c993480f24e9f34e750b92ddebd7f289c1c76a53bb7e187eb2e83b8e858fc95642b6f39e112c02d03b2c54cee242285ee1f05a53b69f5bdf3576d86cc884ee0105943bbae603cf26d992b0e42c2f06af8129beb2ec80738ec099e07837a293287afe3aca099873b42aa73aac62e9467434c2336af6902fa215c9afe012927823184a48fd687731d9d3a0f835e28fde82b9a41b55b27c073d40125471385da3a7dc869b9359e090dbbc46f0230fbc73d1a17c5d3649b891586bbafb884ec0787f89b614277a83c47998cef348c5caa1f225a9c264d3b5bbca6365aa699f621a74751b7469ab4b80059ef377177cd1386f621bd343bb1eaaa59901b2506c001abc2b567572052267640d33538db5f84b67afe5565d2309c5dbf59de7fd9db44c57ff4494b0e71becd5965e3e5efeae88859f853a8778fe7cf644c3c73f050866e32ab03847e244f1384802806358c35fff3af4db75ba6c51b0f84d1f24cd0c128d56cf952d51682d72b1b61b733df0434379b119fdbe1d1e719cf7a511017efc0eed2435721e7ae1a66587e513095128644b716076f7c2eeda05db819321430a5ef50616605d07bdc22c9e58e7b11ac126826982ca680bccfd86327926776d79bc1db7bdc84d7e825a389a6a99e9e9dbf1312a6123daf1a788f25a10c2fcdeaef247bbe0c7fef9288a7b5692832d935dce3afe9e66a0353fbca94c6f2bbea0f844389c0bc7f96e12945b29e51df507d0a17de51a6f4a7b65e21c6c33668bfb84b8af1add40c8ec70886d49cba8d94a5f3262bae24473994d281cad2d0a7812b864ee59c06c6b12257f09f8f6ed8225451bf732d714c0c4c81832297a8762d0bb717c9a0dd92e17c8308b3909784e62a4c92962475bdc815eaf6e1ae854a3c32ce0b0ce94cf42b3e5b177d1efac954f924e14eb3e86faeef29bccf61429afb90cabae09e6c5d4b33f3cc3f40268e0d4984f81642ae72d671b9e1b4faf41f40e24a485987ac36452216c4e947c0749ecbfec8c99c49f8c6e2aecf138a0d8938abb9d64f6b6f66453b36fef84adeff75e10b10ec16f28d9d1f9ef169e8912e95a27de90416b48eb3ae69f0c68eef45bf4401872bcbe5652ad61c751ff04c32178fe1a47159fa9acf4a957a6bfb45de7ffc2d5e0eb27136b37e22061e1e6f0399300a85a7472fa4de76c5c8d1a9a0be5631d23b693569a33bb6b8e8111043d5c0f9c0b71eac20a78b4008c5916cd72080d8d41d8256dd4df27a97ea030642a0334396a92428e5de978ff44a694a09d9607719239c1530a1f2bf7bd2866ad3f301ecc092f7df591d0f24dc5600834d62660000000000000000000000000060f0979592e373c82419655612b2ff701e4fe89d22ea858e7d719f000e4595885716aab399bd0897c04696fc717fed85656d1cadc9b0a0f791ee4c1da2d1e912a44dd529207cdd040165d229d4a9f67ccca42f94675da67186376ecee7224f4700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b5a67e5e219f8cd17b8e6dc78b49b93b2db774ac60944a9e195e8beff1042712c943cac31b36a48e0c6607389637fcc49e9cc12e9ea68d846aa4e83c45cbdadc20abeec5e28d007ed7e396b47cc892c2f2cd3b439e76c00e4ed35fc4e574adb253752bf2c14fee662ea91eb78ab3a238d48cfe4e8829f750faa9a405296f39f6022ab767064f4e968dac3c8a9f10aa63043ad64f9023b1253243db34b1d7e3e4c60315e7c04625024066765f20fa2d83ab2d805ce11fc30781386423ec208cd0acba0b021e1d8c627d7f743b039b66adea370b3b1b9a19bb0231bae120daa27f2b3c20add7f81dc230a8e90e5f37a8ae4b97b50fcecb26f3f4f62c5b6927347ef2999b022fbb9596f108623620af0ab3f426ba49687263b8337d428ca2077ee7602d6df20215932b4bd492084b0338bc9b14422199c0b76b5eb099a3065a8ddae43773beb3032452ff816f0fb0bbe4cc656270ea72d4478966f6ebf12261826be0ed8ecfc90c020b62c36aa79768fb950d6ee72022f1eea2e73bd57762e2bcb818df8e8843c58a0213f6b5f6c775e4b94482c79567a4b0ad0d8e3c22f8e8309927354836fdcd4a48fde4886b88ddadf6926efe98a7e6d202300b51f49a8db4d57bada25d2a9f5faa460f2aa730d207d71012938e7b08b66195be2e177a7a2b1ded14094e845f1af24e7dd5ecf249db630e126082e252defc43d7aea6fa038442b88af0bc07c4e9931fdacfd84d87c22e0fb913b54e30ce7becec7cf86242136e642f924f98a37a548950ebc15b67a7ecaea301cc609b09e3b669ab5230084963b5ba41bbe5d92f5fa4fc5e74ffd2bb8eaafb16051bd0695aec08a08f261fbb155768c3d7245ace5ec7cd9e5c2f765bd8d0cd07d1f1e4560488911bd1671b1e1f720fcb80d70d181e7adc4447f5859f4e561763fd9d01194fd2e2e78cbb8732631254eea034562293b30e0493273574a064c9c8bb9cfcf07edec608255d7bf72d4d9c28558f48102e1b66f37c039dfacdcf6c47977f59625ac20caf10741272c32db9f244f7c5908810742b488cfd065aebed2f3aed710e44412fc1db5a6a207930d9d73284ca75507fe8c921ef289ef4bac2183c34303a23bd17e74e26bc5f09b4200b3c459fadd31a308f55fd840e6b81b7c6531a9448d3fa5121be7f3da934cc09e6ed1f4bc23b9ad2c878f351b62d0c4502a52e3bf3368354c01db184545926cc9d3860765935f731b0486c615fef9b22a6ecaea755cc97d639103519d08a490b5c63214e506bc398e105508a8c8e699d26c0af50b2c11bca0b35c8b6f2186ddab0eb812ae027f1739569d38f13dd7b6af75f2d03e155f6a2169cf7a48e59354d098f3b73f24df92598d7954e3486cba7918b28fd05c798af7fad924cd65874e22e7b59a2a8a74123d31fe62268ad3973ba89136ddfe00e530a98016772344d1bc3452a4657a1952685b2771cb4b7f98c41894e4fe6c82e03a284181e207887cfeccefed5c24b59142e4e1c2ce8330e5cb74472195ec6ace5d2d3a252f0377c0081a53a45301fc663079ea36b23183bfb7a9e586a97c1c3ece2c681e08521f6ca9680aa20b9460cac681243a5df7ec6c469874624989becb89d0469e8c72838a410171c8b71065e1779752a8957f499334c365dab380919e181c76cc4aad54d2ccd242dfa96910aea87cafb4ccb2b4d114e139d16b6182af623673432d5db8ec5feaf3e707a18538bacd18dc27d9b7d0099e2d0f3cc2ef0ca414f335b150403f0c9f09f7c5827e07b0c32e1cdbb19837e3e36c86ba2341a50bc7d0ebc58c4a561989515d72e849de754e4997acf4670a2d7b18694f14e6baaa77bcef7350573b18fe694f5b88a3dbda49dfcd34bb6e8a16ab08aabb7330282a256b8530231da5fa5c4ebe2d31fb122ee4b024a93c8d99258d8992da9bbec465650df044b518a16afa7a2333d6f5fbd69c3a5870ebab53c85e697ac2c1317e65e8cc680aba82e41df81d19a8275ea36db03c1e57175da3ec66824f1fcd70e56030326f2a3fe154af10296d56b828fdfaad2473567077783a5d4f2df0c3e19dd66d23edac4b14e3b582268e199ad3ff88ccfbd566e86c60e300506b8ff2b0f9fa4010220ed39d2cc5d6d203e6c67b2053e99cf6020bdd5ff134d09f46f2a733bac37be0f1e3fcadb2f1d6ab8c6e43a99b692b95f29adda899cff9ee7faa49b1c2fc4cb27d246239111744e0d27b237a7c7ff55eebd0f5c32a11da72ccc912b3a834ef1baac418734a2d4bec4cbc355ca57b9f51740b4bb527de0961823d88f21d625587c48b041bd622320e2e96d8f65911cc006e22673ee3befa5182b3b1946c00e63865495896555740de93768bc3c538393ab43889e6b33549b2cc04188fa5f18a1b294012d4766a45aa100032074c8a4a569945a6761a867934625400e05", "", 0, -1662352455, "f95b87be5d4ff8cf9dfa64f7c06e17edee35a5c0736a8ee27a75fa32dbd6a96c"], - ["3620486b01190a24bb8acd712a8c10e380ec33439e6be40706b6a72ed8ff6c12cd4d1a63b7020000000600006a525265ffffffff02606ad0020000000002ac00f9366d03000000000153068a7f02010000000000000000c9478e0200000000c034232a2298edd9480faa951d2572fb3eee9aec751e800410fe52727ba2af5e3d24ac44ca60f90e9510a15d13e33ae30a71d5a49f473246d35c50083188f84ab0ac6d2c5c23f95d3a7a949ddce8ed0c38e09e11aff74dc8ce56b2a93022be6b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003124168fa14e3dec88988503e12427f1a3b692f1bc335d289e27e1b820cb78f8d05be2d706cac7e790be50a99d6f736b69dc78d7910330bbf8c39f06f9ef41fc4e6a383808b16f6c69de012b918c0ec33c9f7ac99fc71f44594897720ae2809fe5811e10b95273e6df96d056bcc321e27201e1fc0555bce375410198214e1aa8030e9de306b99a4a21c95b6b209738f6dca4c83665abe024b7874c6027c00de4f303003f0607876e24a937562a728d49dec955f85a89ea96a26f74baa52b7c78b6300a08ba03709bc97131e64cf9e3707df75a24a0fc497997d359a243f1a625bc950d3601bb7303a32ba9b2a1ef7b155b2eca368152a0c86f89794899f895e9ec7c560307944818bd8c9e5512019d3f75bf82dca950235af2ef0b3079696f860b8ec2c90209bb196ea187b7016f7d49242f6c9d802b975b10b980bd7c4e89fd1c4a20dc060216b695864d3da5b00826645a181d42a302682a721138026f86bd42de01f40a5b0220b3eaa8c9404d437825a4da7fed808defadb17fa58415ee732c32afa69545bc02121549bc7bcd56be8fc3db70d1457f1c3a04433e2623db60abe856c83a3ceb335d7b58a65a2fd0e2afdfbac483cf9a02464e230e6c19ae260448978ccc18029124dbb529fae8ca0b12f1a2f40ce0ffcf0c08bfc3af1ca30c9e60b33ddc8d74fab5d9dc10c1beb5de35f98a344059413ebe4d3a6ee2f76b452cedadcb760ef87a94a65ff26e4bd222b117a8eec6623ad33f4b6963b717a2831b710441892a6bbe09140fb88e96d73e082a853d3bacd2ae95a17018c111578d0dd3ef299a2c2d0bb067fe64223d25fda10e3735c7c689344df9e0451a1f3eda070f4877fc5242e3808bf502fe1d71e991d8a65b0d5239a31e60d73a6473a644a638b572671946a5f375401b623a3ce3a6a87fc6397d8955eacc71aa2fb350e65005985cc20265fe0af14a8da228234b7ea1d5c839672c1f80d048a3c5b9de95e3dc2898a1ea6b6bfe09c73981bd5941b228f5c09e3ac519d383af0d8e74efbba7a6a261078b1e2c37014510db364577413106de30e48e0d59663f21d787ea6af80aaa08941837fadbfcb5c979e6207009cb935f4ebf98a78c745ebd8f36e3ab21c953b4d2ff3585ca75efe229c62aee063d27825a5ca867b7b0322d66a56de43e52c0d9c3908eb2459dedd81c25d21345d779509545e6d23e4b00d42e5292cbced1bfc208705d87d423120117ea9ace26cf490ee04f236f6b315109dadc7098ad5c7d6ad32bfe4e0fba0556dd414bcd10079b39b4383520444903bb227b47579865e1c5b699ed524a7c7617da25b62e995b76432937fe341ea9d0f520d3b3f1d0805261ed654310aa43385cc11d00594e4a3e6e665b786effbef686162b343c451cddb3aa1f557cb3994aedfd02bde82c39b64527f16bd0227340d2b40e6ec2d341c32de0ae6da8feeea42a9556a89001964f1f1868d1cda46190495ec89f82046cacf6de4fec140410f75af0afbd74073806e219a26eecd8f2220ee07a7815acb6abbd9862df166265af1615f16d2b21645272e93193cfbf83413a7a43606271769fe92986803487e6f0b85753a13afd11bb29516fc4329db07db126bc6c67bb8357a1f427cdf7875ae7113281f2cc3fd8c61a33105853a1df10410da574f78bc7ade975b2335797b594ceb59691ccc5ef2c2f4ea5586db86fb6b6484eed09b2f4d7eb04692743733aa5895a1fa00a7f480a473ac71f577c2d98d7510a438d39ba1134ac5ae61f597fa146e2c757dc1689718ba0e959fa961247318ff12673f756308000bfca6af7322297b88a9af369eaa9dea83bcd7e49bed6ae3ca6790341ff3732017f6dc5a2b9d5b02dc3256d53b01e7b44a5a34d55b61e4093d7ad6257d0f1c04835ee6e152f08bed55ec8fa469498b410579d04d0322cdc3afe6ffc3c65dfc9fce39e56aa3b1a6166225a543cc287700779f7f707f093acb736b72114b2bdd2549773709c21ae0c3981e6eb8a0b5d4690fea2cbd645183bc1cf7b4a1f462ea5b2cc72875a5090b76e1a4f16ebec9feb207d568a3d1d5c05b255bcc2aa6071a49aa2d27b745a0901fd08c42c1398a633937276259ad0ade7258a9b3377344029d690e4d9bde46e832dbd06b2803f4321268da3b2c56113e32f2269080c478ec52a7631377d0d55b441ca68f8dddd41e52b43d56086f71b77492638d159884a8b4ef646f9c092a4884504a9b5d6ac7cbd01a7b168fb8adbe645dfe447ac68fcee2975c1a985a7f22f85de4e47814309b3ebe0d51b12b6764a274a82d630b410827a08cab8ef77cbfc94680ceb1ca72f6af00c827a34a682fc057149fda4f4ad817d2271ac3c9046e0ce3955b58d28a3eeabf3f2edd8d29a7471119de0e0d9d76ca36b5c9081d8f7459e5f73e1d2f01aaf1e9e29f0eb05", "", 0, 316849224, "c44d1ad006beec8536ea4afbc4115faee7575a601fce03b3e0e7a48b5ceb83b1"], - ["030000807082c4030467a75c399255d110187cb1493c6cc0e64b236a5357ad98266de0593d2baf3f020300000001002084f46c2b425516285ebb40bf009f8f2b02ef5c25c8a23cd0563b3fd68005e7aa627cbf0100000003526a6ae635523c9e67e45abdc0f48268cc10297afd8931ab9639cc0d61e09bf9052bc9dadefd8e000000000165f928c2bddf6fc05118c279a4202aaf283b2436e00eb544a35f9a900d405c6fb393fffb0d01000000025165ffffffff021b37d20200000000026a659d144502000000000100000000008293413800", "acacac51635353ac52", 0, 2124744863, "e5df625f2fada41063bef6a55787fdbb2155d5db672e7957b6e91b9f66764bff"], - ["d9d7237404bbfd080f12492fd863fcf204fa2119180d4cb8e6dbbfb7a79d0804d779b12f0c0200000002515234092eab7245d47251ef203c5b263b195bd6f59d713758e80ee80901cf9662dbb61cfe4b03000000065163630063acffffffff3aa55f12599bca45c8a1882395bd4fc5650818c358b81a7266945a6ad222436d0200000005516a525265ffffffff76edfb23bf5a8bbb8ca4b2ecbce6d66c0bd30b3b536b530d3ea56ce77b089a53020000000853ac6a510051516affffffff0435f3ae04000000000251523c50a104000000000253acaa2a6a0400000000026a6abecdce01000000000351006500000000032b550801000000000000000000000000253887e2b2c3c536edbf677f192f121fb23c53d4a93e6ffd63b362c3fbac47568227790def44b9403baec49f2ca3a98a289f4225690168cfc7856b61b3eaea33d152dc110b40a14dc2a9cb75050be2f449381985bd1ee565d58045ce968b547a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7527a4e35f83a7a23521242a2df1c6c3bb820a706869659283fddbf8ba720652f6d78b3d014471a411720925d59a3a498debf1b5ff898036a524a577f566adbbdd9c195f4ac6fa1a18ac156b864b08edca25f8e0d34510fc61c3c3527fd6af6c6498be455deaeda464562dedff2ee7f87bf929195758c59218e179438c1bcf003040bd22dac83bb927e37e6ecb6add1f80ee67b8f4c7eb68d7da226da580d0fff0207a62fe907e376606672288412a3b61ebfdfa97ea64d84d67a9174e2dec51e140b04594b96741dfdc6833cfc6662db40067c5c771004cd9fa9c2b31d11e5e3da78d4953ef68eee54ea0d457ea2bbcec7be7a09ffc85d514513e1d0904273d298ae021d010e5d935e4ff7498f1814f936cf7bec39c0b68b00184ada94445e6b8d9a35022a0bf77661de60b946071ba2d29d6e518df0754bbf18ecdce31787391d75c5f103157758b6693882a8bb710b4d15d897bea5a8c61f9d162b0057a26fcd953ecb170200e3ac131984fef58a699f8738902a4558086c527b44caba1eee9e375f63a96e03198d7e1cae821f05c6482f13a083e94bb5b5c7a459e468adaa0125786eb52c6e4120ceed3c2b4660bd7fd036441f4433692c33a3b01547df9b84ee448feeb3513074d4bf5e798636a75650d517b77f63ada97bfcfa0091d34772585796b029aad3068ef14bac7defa27f326d43dca0c579df63c82a29fd6437bdc4aa8cae8d6747fbe700d3b96f1d365e18fe86a27ccb4abaccb9c2d25ec88d284fccb37644107ae71c3797cfd2f8e7d7eb6a008fe0936a2daf2feb2c45001af47ea4194282b9979ce5149ad5074af05bcccae95c6756308a55f84827b873f002f5c55da921a0f15bcbfb77a402dde38f48aa19908e6104c123baa40482ac394e37ef74b5a7096a660d29079dc32c2b8f2686413b3af3644e977c0a9ebbed5210c3379bb355d4e23a514c2b9b09aa145e1e1853ecbf8851c5bcb4ad3927ff6332c43654ba10ec597135ddeaa03175f3579113e9f7fd139587d9634fa2b69d67f87771240ba7e9a861dbc32d4211ec4d69417909fd78491b84a27142fbe4e135a591997c0f40882a1db519c607d5150d20b6079c8deb9b2b76a9e543e906a549e8f92574ee2de61fd49294ac85b7b8ffa826103d37a6a360b98d3a5a46146f283154286e53b771c504d1e7205a33b26b8db9d3211d4ab38a0317de9a4cda363b68f2ea12936807c3ec01064c33c26b0b66812470f65917ddf86b5e165d048a6831853059b643ebffaaa1e128e37ae899b5c3be093565ee0c04977ec83ed1da534904c7a5709f67e795f40b558e58e0f96126f9b3c47b97df612cf4bbcb182422da2ed5f60c38d73cf34a3674fba945726c9c1b5cccdb4bf753539f993f9c79e711574f14dd6a0f4f35fefc2d0cb53b3b53c7917052a446513de937f514642153458ff108698510da133df9d62c4653be1b147ec44c9bfda0ce48a98a043f04c22a27bc35fe44901824aeca26df85fe3f541b31d37879f1b65da32a39ff5e83b9681fa930c79b493f278681a0edfe7c6ca1d42077cff2becb64045f4830e5d7c9b7347b86cc1c0776d123a62a73c8945ee765c0a15da30649307ea79e60395993134388dc74765bd9ee0844c5d49c08d21d91a531c9d15a19bef6cf97b01d14bb0ec902af44bd3a876683771e5aec93f88e781e57cdb7bf848cf4bfd87234ea7cc6ef3bc3cd3038f8e77bf20677aa8be63e6947fb72cfcdd7283d20e44b6adab4b8920fa448632420eea173db6747675a2b41737ade929773612677e0020dd3f71734d7055e8d865e8f29ee2235ee0264e7e82ccff78fb19d2e4f0337b8e313ff8475681f5983ddac938e2e52881b0c43127157ebf2393ef284a719575a565734ed5410b4285646f93d5c0edd1841a668d4c872c2dc092d16b609786a6bbbfc8ff2dde8e91a58fdb578fcfd32fd0c5564ea19279771b712c7facdde0c901ef977fc2b3b9d5b35ba23126b8ac9c9cd76658a48586a003b26b5ef3e02b04c3d6bf7116c32ac822948b9950610e4d6576344d41cfbfcd08177468e161b43af1c46ff4b43b59d19a94b2a9e8d22831201028e26e8321388c841583706c6b17e0a28b9623b3e18a08af9c6c4b49fba51f7bf4b2f386700a583244ae316301eebdcb629cc5fa85a1aa541113d1d71bf0181c9fc69c9a138f60d4dee0619da501efc0e803df402972d1e12f1a5cefe5b510d49b3fd88a42b1789e3f6280fe7819144132272a204041a6084294fbf8e899a078e11742fa21f7d20e2ff26c28e3904000000000000000000000000bf57f066c5fd77fe95fea8d9374b5f3782881a720a5cdf07d967ae30f32c94dabb9235e2de79bedcca3767c324e497b735971fbe2f3e0365ca24ca3a182e51cbfa6140e6d5beb676ad48c40d25383c8db2c2d3d9d89f90929477a8a17ae8318e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e910523b5eb8afd32375f0b485db839cfeff595c2fa8e22763207d0d5cbbf81474de480c614bd8f33511055eadd1b92e2b4a77d15c427926fb8b1698031d3a199a95bc9e77d37f199272d6c189b489af9d041e121dd40b04c2891c0571eeb4c6aed33b16280316f5b3d2c4f8738318c742a48f5697d0deb00dee9f9d223b7224030c58a60da17dfc1b70696b086266005c3336b52aa6ef9bd9a9e73485788cbb3803003c3e215b0700ec4ab2901d50a81fcf7c99e1ccccbf4d53fbe97c17e9beb29d0b010f7175e68704328f7934821a9a1c94564fb039b2b10a4d13e0f65ff9b1f0489778068f6c6879a5f8dd031fd5fb0c83630a007be83dae15f3606593c4682fdb0225685c197f29b0f046c5107bf1de8a227ffac6b83e09fbe4e7a653c81674f8c803137700eb886fb870fd7981bb4012536e1aeb2633f99591dccfe0d6852503574b032356f0784cd7b4274ee62bfbae6b182d20ce02586a00954022df0d9cac5dbaa20223027c81364f40ffbcc6b046a4ddf4b52feaeeaee9023e31564a82b15052728103189b39ddd2b9a3ec27ac1abd0045054b7fcb4aeefb2830f9b9ef78c3f66a6a8c39032d3c9629b4f79ecbea3e2dd568cc20592750426db1d9eec534ac4901a713406e5119f8501ce026f854e181c62a0da8e693666a84a7cefb3d1dfcf0352cd0a04a4e726108c61cce59c06d862082b81cd3935a230e13b596d1f8580a96a9d5de1e990a21c648662844577687b8394c6be961ba525fb5105cfea911468e169b6fbfb0348fa551e2e9178448d32aef2a39c59940ac1043b27c23b4c74b2eb25dc8f6c63d4f614be78699382c592d698c575a48a722524120fe17758eb11e90b3768271cd5df2b6a63878d71dcbdc31f186a66374d0cd92b7722e1005cdff34f6172e76a20d72247f98de9ae0555b5cfeb5a8cb486337cd668d68a2f7d290982ba9510dcb472f5718a892697942ae42e845b27fb054caf369d5c406ef1e3ffa78265c3f349cfd99cf2039c98c57d78d750b76ed26d95608a8a2af64170902c3e76c0254b532ffc9700dec645b68ee778a1aa7295cb512ae4471817242a2893f5d57b2999264efa41f15151dc321c4048580388114465896dfe4433e156e882ae44a8d8454e71e97d1d8fec9d7fae39a5c0147fecb3441a94f653aa6fdc0bf63be3ef776b1bb37008ea416c455bb331ac5b63c21a41bd1b5e1b7d73cf6d398a678683dfc3b7aebbd8aad122b6e459e51e9a26de522ede0e12213616c0bbab09b8b5f6f9f21681a6309d728de09017553a55f03f79aa35ba87a61167b4050b01128f92879beb6f4ac064c4fb14db6de4d5f05be2b76ee46116986af915a3d1e8b8b4ffbf2e226f03894c7d47911d4db27296f895c3ad450eb051ad5cca1bf7a826894d511614ea5f4883736e6a882d92406755bceacbd230d5dbe581480f0fb57b91bf54320faf753e601cfdd4cba573da3ec446ebe69871ff2e62d068571dc6505e3c6fb5bc37b43c7f497cf10d9d5ec757e601dbd93d29a9bff15cf2b1927cca0ceabd692fd7de704c6c4dedb76badf5b8ac74db088b0cb6f6ffaf3200fb168596eda703e59187c822bc8ffbfb9cf66cf9c1fe77d7a07773e0cd5e775f2a546e5f88b423dee72c3774f7e0a81df4066afa507c266a79790e045bf5578179da5133ecd508b6e1702311cffeaac2706524f8a387a47571223f82dc5a66257daa94f55ff6c3c513a0a100d39c2e2cf1aec07b09f01a507e86d9f72e8d5fceb8c5279befb7e1c1fe84300e6ba2fdfe5e3556bd395ce3398d1d488f324b41a20dcb62a0b1c9f234f45397ae59d66646ab362fafd8b2cd5c34cdb0b71f0a7f7d20100d6f39b98d4d515ddcd8a180834aab433d1fb67925be194f82f5df187b1614c178a248561a573b01b1bd70793be137b9b5482ca3e665d1508de32c03a338c36d7d4534ab1cc1774fb60d5ca21559d1c63f5be57ca6e8f4ca7a466cec1c63990fc128f334442373c360aec0d0b434979c2c838e9ffc576f3ae9c795e3aea608c14f42a50ce118c2a833dc909edbb06a9ccbac488b581dd47ac75ff913601b0e297018625461ae3a96cfbba404df2d700b4e152c5634ae57d237c5a1d02873b1131adda944589ef05cc89edc1121afe66d8e0cb54a93f89293c916c2393323ce3bd075981ed15879172c711a1f0fbf0ef0ce5c838730d3f1624de90101a91687915de164893fa5eec7c0ebd65b11da309389294342d9b3c93339363cddea1254627b31cc585fc0c43670975110b80427fcbecd01b0000000000000000dea0990100000000de8cef50369ed5f34fc1c87acfdbf8dda6a9ec4f5d13638afac3c29d44d0456157ee17b9874ade41502fc375a1567ae5e96cbf3f2a32d590fdf3a3d5858c2b5c90e6f73c0d6d779547f10414bc94fff3e7b7859e95dadcfa527a1eb716a35ab50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005770b554a29b4e1a6b45495977ce260cbd27f7aa0cb7bec75e84d8e655b26c60e482df5b4141f001f5f4b28c978bf8ef39aa36ed3d90e4f5f5333413a60d1a0de6d273c62583e65a19d1557fe4d2847758665cd08d05cedb9199deb202b57b10d77ca7a5ac1833220fecfa502dead6b23ad9d5b122e08a375a1f260fcf373870228aba025fcbeddd5076db366d0d3be0551c944e2293b45aaa30d01dff040d32c021302770deba06e2b37db1fa71226923cdfcb33dd379a468c24fec9b78f6113e40b071b9b9403c2ea82e3815ac0d0e38ec4afc03e30e89b2befe2006ace6745c5e06731f6b83457513ef85e4e5642d7f262ebe1bda53be3876e04649e4d528a411402081ae8b060c909c9b0061600aa92ec2d0814f9aef1ab17e6fc3a3b5b583ccf090207a860fc4f065fdbb2e4b74f87c16600946a6d5fb833b3f3e0dcdda7378abc3c031576bfd6143c82b3173e6e2558559d60ced0823f3f2944e6f0c916fad81d1b83032e14d9d6f718ba97693289a4d2f2913422f8a78005eacb32ee7e52f3e70e20f8031c32b640bf8daadc04a78d10d0d16e7ba6c44530539a959bf9a91be6c168c9388a0d4c1565b6b89486cf5c9f2ad4aecfb9b07dd32862e0189bd9c3e47c0e09f4f1bf04e83c10fb6770a03ce5a6fc6d6e556051b5abe45daa0bd4fcf02129fb35207e4095480e66dbc99c6f01862bded9b0db8a7be2b21f122683db9dd2cab1c0095b847a0e2fbeb42e49041db8f248e5b1a974c2f793d10f411814704bd028133471b0534b6e34a48e0aaf7467dbd662c00686eecdabe69343b36992e55694db41f42eafbe83dc4698fcc1501e5700062be7cf539bbcd54c08e76d318881a869cbdb35bc445543b85239ac997869876e60a2454eb84518e52faab05e723da78f78ea04272f446d6b48c2bd38d0db225c43323cb76342f51eea46e3fc196488f2da51cdfeff65b752edbfd85e1f79584a97cf1e490457d0fde48d5df8c25dbffb147b1b39dd1fbd3a4a163d7f7ccb830cfcf0b71ef16ec811f999fe9dbe7707677e62144a3713faf6bbea3f8b5293e1991d27437861923d8714a0e6a63c93061880d0939448b0a260628addf80a2fe259e2312786c1d2fa7c59d031e2436a14021aa3895d61660d82dedbb581eb1bb03e413290d5fc1c233bd71c4db9a8a103d2ab74ba19a27d1b3f6881a33ed05189dd7f5137d53076fdb41458af4a2768af433f650552b63e03457d96cf6e81bb4e62a89da25d7428b0bcf2d0ddb512ceb0509ea30607bfe3b833bc192a01879c586ac62aec8e1c446a5da00f6f6c824391027ba75fd8480977252e96affefddd789e817d607f5cc063b25218c69001aa2b0560190ed891f7e000366c0f80f73d405c334d5ab26978ca31eff8d6798b8a124ef0fcd1a4bc872d237bb732baacbda5d9540e43656c218874f48a23db4e75a38c9d5a1a395c80595611cbb436dae83a2faeeb1acd48edffb47407c9d2c385d62442e2d5ba02fe4f33705c5bd4c576a87bfb3248608068624daa7677a8d4ed90b4404c769e5eae7d5b978b1731fd58ddf35873627250f26b7138713fdc6dc3e793c56f044f0a2e8a1c32ce1fa3f5b1571dcc29344faf25e05225d9bd642ca0eddee864f76866572827101847232c5f51b6bbc2b4d16176b7f24e5270b34c76bb2cae3e8f9141972153f567d4811c3e5bf7638a63963bc7ec50b16468e9b6887fea852cb57b4302e7aff1c0a110055ab659db044fff4bd49821891a82b96ae68dcb3d64eb270dc6231278f73326b8225a903085e2176f37f9f5f47d44d3c44371898023012034f663c73fcdf65e7b2b1acc21ea5dea5a780fb07e73802c025bcaecead79fe26043f02008a39126abb9632fa4c8c6b1cbeb0c14dfc6dac4da7423b996c87551771166913605a142b837f9dec24d4156a1317cada3f0d1e0837f423a9660b5cefe910d252b6bfd545567c13687706f468d4adaae833c68830126246ae2df38eb2cf292ebb110c261c0abf1ec6ab744ee2e535a8069b8359dc3dae67324830a5db1b1e4a239f1bc5561e8a8f37b46ee6157c435032237142986b7d0806ecd4381e3f8dce43100375c89519b74f97b6cb96ea2d2dd744cbf53f28a0da9bd301631c2ca61490767ecf9a123becbcb5eff3e9b36e3d707174acbafd9aff56e9cd1a9b760059b56f18affbb17629b131e5db42be4c710032b25c3bf069c1eab78bed3e6089d6a25253db03f4cf555c60cc1395800540ec1908ae599a3135350a23f3cceee8dfa074b412c72523860a912e1d9603cc19b96a93b8c8a95c2b1f87d565e247800f4476cc251f69169e2a27eeaf1387d01b73d943d1a25f831ceaee1df236426d4f35a24601f3801f888ce152efdbd83302f742ecb6c4dfdc45237e19cba80cdaeda66fa04ec14b976af6c03", "", 3, 1375209089, "00bc14874db6bba973d859b41c869ed4b785d5f14182d423fcb6b4aaefe15e1a"], - ["8dedbc0b0176665e68b4f502826e9ef3fa803483bb464990c0ade7d9b036b5c3d6373d87c402000000076551acac520052f22e0a560289c30f05000000000465536363189e91050000000002005135ce0e98030000000000000000c88d620000000000883442d290d6162d9deef792df29d081d75344c0e119946de51f06e9492158d5a43aa0303f7b473213489fd432cf326904d90bfd7622bc7d6cd46b9e39ca622534903c815fcb9c5e6b763ec22f1ce34e7b2a020df5fc884906f695bcee67a95900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e9a51ed5f2174d211600c87f524f6d714076c24b3d80676f6b42fffef236853ffbb998e53e0bf6c9646244bffe2903923c26c3c7a7d44535e36e154669ad971ad7fef56a148de3cae6092a462647e9c53ee02796bac50e6d512c4d97a316596d7005ec5c90ed57bfa1dc75d077462a7825e70ea5c73b07cf3be4ecd7e77cb04702115067e5c8a0082a07fa7b154522fcee574a8783092c9650cdec7a6843dab04e03109e3a0b1302f5e8d8a640b03946afe07e5dd908836c054b844342ef2c45fa310a05774c8d022972e0506811c6cf77687698c023cb58ed2b5b259bedfa49f7e1834cc60b6569116828456bbac78e58e18bc6b3008ee6838c655e1738cd3bb10cc0022676e617d7da28171bd4fa84d689de6bb33f48545f46056a31b7a8f41dc8c1500304e0ed2053db2167fdec6529a1c5e090c8db4a15369def6ce168e3482ea5f06c020bb962efb254d3713351a9dcbb82c0b39da70f8bf81d702e03f815548d839433032ccf0a826657ed7988e6d45b036259b9b0bf1e5ac834c066ef071bed0ef5354502068e8bd871b14e487f8ca8cc5ea394237def25eb40e1e7d329aada4d66972134346b725f9a25166c6523ae36149ed9a53dbcccdb6762e2a87abb82087ee6a74e9382a16c8d251e9c65b195576c13a8ba805bb2fdb221fb5c3d342b3ae1323d7a45ca4e4cebd7393a8dbe3dd7d500d135bde41fbf8f4e5c970de51ff56ae0da4933c273d72a994906b111539751cc2fe5167a1ad93ecc110fcff58a9285b34fbadbdfaf4d339c840104d84270befbfda9ecc8e5e48bff24d7ef1b32193b1c10afe8679d039ba2b5996dbf197c0969bd67b056e0efa77ecd3602d70c9a9bacf63d8409708ded4906a5485bf2b1ce9c719e662b2e3d810733d94df64ac71823648291f13a438848c5aa1c9cc7934d49dfd433b1047b28cb9a3a54557accf4c8bda57052d8da1d655a24eb235092c2293d9caee2758a54b5e40f8855c3d1b849b7902094537fe3ad10e9e8a69c743a2142cf7eb049098892f660bfa596eef64fe5298d50c490d1e86be6dd4cdf1ca2b25ed6fab2747b358e086e6f87c885dbd8219b0368ad87b5089084de4165e27a76f158f0a7242be146c75db2e8fb5a39f9478e6565d1f077b3d8c4684e726f6411ce56c0d2a54b26e06c15df6726ef4340ff492d314a3bf20460eb088aa25f18109af7afc0fad9ed3cabbe7bb790d63143de3f7378b2d0e132015d17291109a2fd29b196c1d689155f84289d6d9fb78d93efd828ffefdba1cdb45b763e63fcdc709afecf8317a72cc65193f4331dd9ec29a786d2ca293b8bcff9fe452eb4dc718fe69be27c2908561bfaf90b0347babda806e7bf7310dad3310bb2cdf8310b75d7b60965e4a12f933881af641676879f5f00324d76f9cd41ba385685c38b5d666933a0f03ce66df6579426068ea923a3cc3904ee885f2b83fcbbcf27570ad0f17cf0606bb170b0fe20e3ad6bcae855c8509261612ddf88f369b076e013c2a7c1c22cd5ec6af23dba33fdfb42998a11d6e7c3c63364a0ad5a7370e1186704823791a5da0b26f8605bd778846e3525242b3ffdbdee2a39a6b350f256eea3f88b6636b56c5c58768104da0bb01c9d29347ef962ed6430edc9b89a671578e625d6d6fc290f0e8782cf5013c08ac985e5a3fd13b40dfc87f5c54c28708a669f9180420430cdd08c81d550fbe281b85b6789c7e5cc04cdf24806b7363cd7a35061af66e0f32697bcffacc0c3871288b5e4151da08077779bc689974fc3b62467d610ee459249e59dd137f900a135ea3460c9d5e7e949eac7649dd20ba478b65ff8e096f5bc9e01f2dceed31cc8f9a28c335ae52038d6922aa42522a0064b60068037ab94d8af04b9b218df33e83133f4bf3dcd5ce0910149f7ef3ecd9431f1e057b54ce4c6b5417f933a965afa9dbf61b13b7608a78cac139eeaf0ead997969e20e56cd6b2d63cd60366dc965639d9c121fcf8fc13166b806befbad35e6fc5066094199a19458edb72a14fec67a8f4a4b8cce8ec7eaa66c2e4e8df3483e0b9cf0d91f4e797470f6e6d07c883a3bf8a80a003755c7cf0d4ef9ca2442f50b23d5468eb9240b21b9a435951067cac8756067c66900a359bedf535ce6f8818903ffc2c51ac1aa3bdb3b4ca6b5bfa90e02ff2d4e6e7ae1fb3c7a2642ca40f52c6b25629e8ec7896e34d04bdf751f1547b481876cf48bb4f4d28981375f75c5670c6e4ab45768a65bfae14e891e53036516d5fe1d42ac8f6c61966e4899699aa384555a3975f6c5f0f8bc60000000000000000dbe0b20300000000d4715afed16b9668e19e503d191d0e0eadc8d3170c93d5754b98cfb0c02452789be7da58c63bd1a4f6d1f8b327a387004448ca6da0f4e07ecc408d780dc362b661f94013bf3a0df6f6bb62354a1a505c6af52c8ea55e08d3b53b880c70c2235900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000373e5d89cc087123eb4761143b84f311b162bf26f7983b7b03270661a24c93310477d00cceb37653f71f223c0f0f2e81dacae286bff5fbd34da2c869cefbb50ecf0df479f0c8376fce6ccbae8e743e2a9c29d3b9ce333042574e0dc6942910b750f5a1cd6d976d8dd36def93b83aa23cd475107fab0f65a0629baf3680db04d50216ce377fd589e3cbc6a14c5f2e86a5f13dcd3165891cc2660e31e5f39c71f860030cead3b9abb82df47459a761d05d9f8cd31b5c4fe3cc6ec327408355017a8daa0b039cad4df276511e725ebc5802cddcebcfd761c802eef46c1a535aa0c894750982712d41ef2e66c927468d966cac73d38b6eb40d94cdef64af6a87019985994002092544dc4cfdc9293f6f9c6dc5f120d9bdab1a633ec03eb72e6ddd75b5d1931002075d55d84f47436a55b005e7ce6202baec8b6ec1356b06b5509953de8cea7adc031187e03557c499c111076d80988fd627c7b5f95d3edad457725d6c96629370980306c33670bdcf6de0ac6fcfbb70737bb51190b28d63e4bc609828e938b51e4e1b022698e12ab53dbb6ec8446a9fa32d127a8aaa037a10203b1122d654214b410ac57845f62d35cc1f88a877e9fb502c2f44325418a35ac714c644a5feeb6ea95568d64cfde60db4e187f234b8e41bce7380b0faaabafbaa0a3d40925bf0ee1cd1e97d08abf8056166186b323d28bc84d2fd650cbd3ec85e07e90932749d0fec22ea1bc3134ed4688390ab8e4cbca23a880ff1a888be3589bfeefb560d2451ef6ce4fa342be2cc375c94e42d55bf89ae96b57a3754854c7f5fc0ae24f1b977c4edd5a3ea62af59f3be9480e27df9b8920323116d7bedb6f41954eae7ff2219eb52bdb62bd0c5f62e562d2c493295f9f826759f70704c4731a483bdf5bc65baae302ac5347c82f2b81dac98dfb5d34ebbbad7bcf365e0cac33a90dbeb7f1536e04117d450fd842a763037634c3dbd9a00bb81342f15398b09eb22ca558e246d44ee36ef4be8018b66c67eacd3d80901d444dee1f51e82cce842210d24f90a17e6f97616185695a484f1bf0f4ade10f87902a66c44c090922d7b684d2a42a284f393d3429af04c06ae36f25c3462b2a6601731fc19f22097dd7394a892c7388ca862a6e12f70446a25722de48ff194735fa8cc82f620d5804951e7dc4582629c0f3f578b746645778070e004e07aaebac9982c52111013f159001420b352c45f56d52882a4a5f79e1a04441691a921a770b53f536f30b802759e70aa1b136c2a6a9ba2f9f55e2cb4762231c1946a25a3d28e744a358cd5fabaa39ce0bfe3461ad60ee1bf9a9f0e8e17f9dcc66e44e9e1a6aebb0b25ab19225cfe78fdb08cb35833c2fc6826c654808a2a8efdb4d4e00e9767bb2b8ca7c7b8e77e5393397ea55983cf1fdec253751565c015018f3e7913adf501cbcebe390990827d01093bfa62787d4e6cbb8cb8f70700a0c61abe58b191fe1865c9874b7d68a1602c0497be7ed48785cdad1d98b0c9dd75e23e9ab12b2f7b931e54271a2277600c70de5509888beba8e5495aafac4cf89a203bf346ee91faa77046b9169f57c5f7adbea610d4cfebe302998521ba230f04fa52589cdcb204d90b1f65eeb47ac0afa085afcb2a28808156501013344680ee74cbab9dae6b000567f1a7b2aad29da10cca66d53cb3032556a555994ad3baffb7ff3040f52dfbb23e95e5db7be2ea82b5d18a498801e55c99018027a032ba2f1562332f9440416800da19cda96f5dd0cc03566e4c14a8d3b3d3a3aac9a339a434ecb503ba25f1952ddb49db0560bedddeba3f4eca13425c5315800e3e7ebe88989c6989ba6fb2d4734a7e9570ce255bae36332093131bc2d50127ec610e1918351ddb5f9d91f53200002bc568106e09a6eba0636365556103759666ea5753668ac582b55a7d0ae1c0b0fdbe9f557b069940e45147deefe43c5e63fc223e9ddec509ffd2f921d70ec81a955eeb1a112427c41dde70c9f242050068230092d53571759f506cc02b1981db1a9da46ca8841f214948cbdeddbf9dab20a1c9b357f13bdca8f891148e053a7673efe9ef023437b176b4f694c1700fd8c010a6bc5fd585e261b2718499551798ece6528ab3bb387665181050a0be9c721a42b9637d1881ea3c0e469bf22879ab69a7bfebbbd7f1ca12070cd1a95b2e1af619dc8b42e3e868e43a0c30309a658e3fd27e10e656dcad7172294c976d16b7a77772ee842181f23ccc122658576b0757e9354fa62d51d327a52efd68d7119bfd9601772aacf11ebeb04ac2d12833c323c3f305000000000000000000000000516890b355d8704fca0aa01658ffcdd8bb47cd6170734c0a8bad2ef8f3c6d3dcdfcee5e5fd6dcd7c8eda4d981d83af8cfca29ec8e25e11fd06298f805f271eb4e1b355ffd1ff9badfa34c33bddf7207648c7f89db7814e67bfff80a18bdb6c6500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000851ab9acf9c44fad55e224ddae24adbc958aef4ca7c0c9ad162b4fc4fca803f3a3fb721c0d348f00c7d96cb87ae1bdac085222275805d705e41c69acb3b25869f7957943979d2b759d39d80fbe7d55811b9a09b6abd3612b02eb10e28d7aa102b1b506fbbd20d4d5f02e7cf69ea719e4910671abf8dc25df14b26e090e1c38420311f138b7479112285d89dcd17f03ad79b88436e9ca29a968c99bd49fb192f2940312b2cf393b1f7da9ce2131b6f610f65d372184547975bd988279b82574c3c1f40a06be7597db397761e367f833233f7643c70c6d903d7cca5a624df372a966c1f987e67afbc53c6302bca741eca5b4c5bef1f6acbb403cd64b5e1eb128d72672d003255ac925b7533ad70a2c561cedbc6cc5ef65b1e1eabdbe9ae3f6d77865d74b9f031cbc309e758f1e8c708d11a5a8df21315800d3064e13e8cb73347c32d202f621020e7b9c2d2fcc314bd432cd4313899c14dea86b428e7a05050289dcf34c3e86960309f1be91657146b208bc96d6799e4f26dcb11dfc2fad6e17ac5c4a1f0948d313020095aca10a57d686e7d71e06366d2f65a4abbffe9a3021773b1a76cc6a2f2226a622e72457d014c91b6ce4ad1feb2709c17becfc7536eef4ab2ee9e50f18a5c95a60aeafd0982c88d578e4dc2622521cf75c887b2941c7c8d30355abc413caf254c3079121c71ec8060fccce0c90ba4fe86eb312ed6f712a0aad131a5b519df2e930c27ad62d964e7686c7998e88267a12f76d02bda86f125fb5100dc6ae63dcf69f01db1a441ea4fd994b50998b9585b49dc2cef600b31ac7753268fc04008f35d0f7ea0e9f7fd98e07710d18ecdb074315f1be051e8f974782a7e693683ca292c5f6286ffe05d91ab46c28c6c06d64d4259bd4c04bb6bad3b240e0c8f9b2346e0a3ca378c1ed8a2b2bedc7cab7fba0c2a23bf0eecd4e0559b91faa50d437b7dbbbd5ba8eb57816eb83bc9ad065b63940f01d1ae2c2e19a746cdac33da1538fa50beeb7ecb4c66f2635d2d8dc4a9a98b20918b526683783e0f675a9f5f5e6a76bb89f7cde973609c87c70e66aebd7a629ed77d08c9e77ee02e2dfbc20cbe94a4a62165af3e1702679de54e8aa7dcd7d64c08f3c049dec10f7fe774bf7524ead1badb899311f8d2a310a5faa81ad8c787b8d7be755c85d974050a087a219f05ccae6dc210692ef2f2ccb2b60db91e02ef83f17d8fd4d7ec2711e414a4ac3dfffdcb0d99c47d1702e4660a9d7d90c10272d8642d7988f0926a54ac814368657f314b7829ed3f3b7f78f90a5f4fe38b02cdb938d51018c7578bfd92fd5c9e2cea97cc365c07a5118fb78547caa4abdb00df8bb02d6b60d2aa4431ece374a5f8247a8cb7046ef1eb7d9fcb7f1c7710059fc727527f99ba2271b7fff317a4a6bbce72169ccdbcb0ca54d1ad413ace4e99e52ba457721004606f4460332eaf38fd14cfe77064494d2992461cfacbe22a814c41eababce721221a697cc7e2371e782ed13119fcf6ad14295bf2e698ce01068c11e23f5fe2ee05b08b487f295701e739cddc53d9ee8a782ce593110ebcb21a4042e970ff0362e8b5b846e2b6754f5fe702ea32213dfee68db59ed5acf33cbdec98355456190eaa30df9718d597d25d1079f2873e46f424ade1875e4c7ba60c71143f5fa1b031e05364dc3dc3d1456018f10a65b2586f0e7490205dbc4a5cd9d43b4ccfa1114fcd2f155bd58b784042e21ba33fbdffa86baf319c7a5ce500da603ddcd0e5d737247b089d3e5a943921783cb8ec1e49b465c1c9511fb71a2ae69aa2945d1cd24520b75c02625909546aec9c58eb620ec5a21d11febc16ec7967b8759b203910c13853ef743d392cc1258fda1bd2b77950719ccb8f086a52d63a723c2f2219358892202d9c98a6a1ca64fcf3135113529d3e9d01889a244a677f229d733f6e189a1155fc35116fe4abc47948b8598d0b927e35dc70258b1ca0ac9eb5ef7011aa48f2df040b67a25fee7a3ae4608a7a03ae6f6edd4f71748da429195504be5d04108541a7d523c7a2348b178ec3d80b235e13a4006f218a149fa1ef1bae56a6b99aa21b03d73d3fa7400c565a167263bcc556b4adbbe5dfe3b38fbcfd7cf03300bbeae73a41ffe9fcb42cc28b7e63aa310790b5648589794ba4183dff8eb74562b7c5b0a44cc39a03b07a0fafeb6d54f894f7bae7ee286547e9756dbc206729f1f0654782ad0489e5ecdd2816767d81393ebe0a566731875f40ec0ba3da799a6c3ec866b77d6f063906d594eecdc310ed5413e1244fe884481cdf47d728d28fac55efb04512e746f9758629e36016f4cb99d06f7c170b62c4a205f5922c609d999d73395837ce5480bf01f5f1d0fe3e3e9970d85ff452a2d69b2f7c4b11be96390735591036e1e7a2fab1b2d485f48d481f65acf6f639ea3340256f8ff06", "65656a63", 0, -926391157, "f2975c44429db6a290a89be17349f68583ddf58725103f36207aa6d6de27bd69"], - ["030000807082c40301b24d161905fb6e5b84b66ba1f3518392d4ba36be02d7493041160cf7d9db06a80300000000ffffffff018ec1ac0300000000015258d3dc7600000000030000000000000000c4465d040000000077bb5d490927c0ecfdd97487f9d7f76f773f5e214ddcc26a370cba042ec9d63f92cf4a7e8c8311c19a558364321ee5f0b4eae40903c48146f4ff13a85c471f3f4fb777ce82c03803d0525bc5b7864dd45b870ca052041f27f4179654c62cd07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ed928df7b9849bb50aa47420f7eb5e1f58d2c3f7dd65fd7fc37c2d70ea302b35392312d53c5681908463a0510a1ffd6df0a27ee666394793538921b156402270d7b8a21103917987ef40ea042d7d6615a2a3d83d55af290368bd4e082faebaa2fcf2ad1280c920a4866cc1331691d64a08b0abe98a03e51acd5b6de8c0d8b2db032a3ad83041c40819d63f3f7bc645c6a94a2cdc781f1788d560a0036f593733a90205f3eb474196b6278f65100011c8ac4987d530d042841e220d85217263b038930b05dbdaa4429ab628296865f9e8c31029714fc19d094e3d026263f95c1ddc015469701cddeb9d81b068548c8c44dcef953f22443008b51cefbea2af190b816810021c0daccb16b65de1e00bea5360ebd4d7b8d7997708332a916c1186e4b86f7c61030d113a9f4a85e09fd7a2abbe9c7c31b874c8f54204cc39b95e7d1026de0c162e0216174cf1fdddbc796a977bd2757099093d0f3c3f883ad74ed308e2dad5ffa39202183138d7cb06fba0ba8dc4979783c8337604904f00825cbeb715694c8e653eb30216ad702913dbe2a951cb7f53489cb7aebeb1136e5e534df347d64bfc85ef6c3debd1860c8d79fb70dc1645e6f64e284d42ce24ec3c56df6c8251a69e25a87f80742aae059e9ed6fa442d2615203a81402739003e8c4a7bd83567e197e028203834f5d1c81d52d949fd5588d026332e7287f4081f825728908be666d06805d686c70ef9b9cb453acda8e512ce6a339294291264538c17a8da23a7989a4e4a5efe369b45948043bf4ea8c06525444c87bff19183c01cd656810ea3bd46bd858ce95cd32e32aac7efe75e434b26ac9d6c8190456f3f277dded3f85f7ffd851ccb6bcdbcdc3e1682aa490dfe67ae0c059a3ff6174407d3061e6822da5621189e6066db6aafac679f2fc7f7307466fbe4facf0fb37947028715d0aee0a1ac31239c076e0f8ecf844782ef2356b3065854fc91972f26375588911811bccd5658dbc0d1ff65528430ea9df01bb2a9f9de5e5e53103dd49b7be3cdddffc241064cbcb0ac09e644cf8cbd98ad18aa7853bef5ff938ba0b5d567d23dbce7d37e8e8596ddcd22a472f28e5af048ee4a0d2a74071ea965ab9f9902bbfaf99d4861717d195113ca11592262093927ca745c5dbe9c858cab268ae7ffc2d6100d1a43d24b11b3f9c0bd8730d974ef86c88df02cce4d5a464ebd158990a0e62cefa60100927d8aad35df9b84a6bec3dc9a2e25048e4cf656c8c1cb0062296d2b3061dafa98f3b14613ce38ff9f8f4c1ee87c7c20df6f8bd5dd5e4d52e0a9302091ccade8c49928e256715a0494c4d7ea619f9751f7f6ad4a284902b5e2333d8ccb197df6b25535cb67767e06a80c4a31cf23a5c373ad9758f3f6487ef84b3afdca27f584fa322e994f6e1fd929c33070802c47944abcba81e0b0fe132cf980ba21081f6043b50695b1806b7300c5a5fc98eef0e0fc32cb69e427635a79ce366932de5abc5008523f54e2547a88d211a2aa1a910fc4d4d3da479f5a29788641af13561e88ef867cc16cb608ffb7b0de617e7252c895b74ed8dd0cdf2c636c9577055f04b3800c5c696ad7adc5ef1773cfc8b89cea677a591136c22386314b1e871be7bc3e6b29f04bb936b5014687c73fc83d47b8fadc26a563b33afba34d1c7f83d03accdc13a71b26f9079f4f63ab8cb225d5426f36e597b066ae57f709b61c4a49c8d7c3467caf4a13db12fe1b67716c2f2e6e6cbdda2ac8a0f37d179bc1976e326bb3b9688972d07184fefd9ab334e646c26853878ee58cc05e31b885122be3b99cea3c86944e09e1e6986f58e7cc38fa6a28d80a905a7e554777e815266a6a884dfbe2b7d63e4ca883107eea4b3113aae217568c89b88fcfb988b25063b9ad45aec26aafbc1bbe9d615e91ce334b4fa7516091ec50f13f099f0c981c5bc75d6cb0596f1fe1bbd4d08af48c59585bb441dddbaff143dc308f7d9ba6f6f867de2737615cc9079097641a52d9a288c5871c69ccb6fdc08b4efcc4454627edd2614db2e9afb637e1153667706890c95a7f6a2d6bacc6fdee8aad9efd465d93203f6d6f8e268e55d4e7d596c25a3adb5fb40ddbb8cfb65b51e37ffa9e414c3bdcc2f3b77be0f833ef41f869f82f23225a2dbc9b76d0be03d186a1a972a73b39c245a43433b944da9ec8f458fa78bd74d85ec612efebf6b7cb0f929cafb02f726d4a4bd7d538879e33abd95e93fbdd6d181a902e055c4ccd813d0b1f2787b422092d3d217c082fc9599c5f1be99fa200c8fb0288e1887e654fbcf800000000000000007617050200000000b87a72bf1ede2645c69d9e0cd77557be924dc5020dbf9d578665f3cc66ec142afa48d33e7692061a72bec726f9b7cf466e4385361f60f2e00b7d2d458754368fca8d88aec60b88e68aa146adb6d9f5d251ccbbae6a028d74b9a790fff1936626000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009261500575b8da5ab4858dd14bf4b30030504ebdd2f644899dc6e30e5257682693d7ac2b308ad1b8de954905731379b707d780f4a0657a9466b1b7a6d068b07b6c3c2db0fe7481717169ad68b99dd6dcf3854363eec1f35cd5d726bca93d2cbe146d0698c8390940793d29a47580313d662fda4b542716b337eeffa4985597890312b2e8a630f47d89257bd0ad3da8556ed63662218867807d22732b78df54a54a0208a8407cf07b9183bfa895857b8a86e848ee8d208f12c8dbfbab1ea62c1fff140b000af5047cd3c0121423d16d3cc43d4cfdf66056769dd461057e3c25c1e11c5fc68ab17073cce761fe9bbf2032c31a6490887114737e0e2b814b4448326588e10303dfb2cf3fb84143771d812710f7384b5f8ea10c8b96436364c625873ff1bd68020088791fda5c9e47fa8671f42c8471b511072f6ab748abb1823069638e3e1c0c031673e4751a6ec9fac3ecf1715eb892ecbb900beb24313b03a2841230e5797ccb030c6a25de8dc29c42dfc4e03e10dbb655132d1b1b75081f755fa7cdda189761640303fc8765f245ae6f00140501d570a2275ddaaecf09efeb8c15de8c6697295317b330139d173c736d02b96023f859b5967a5838038db26803827c7dc41b5c192f284d62454a7badb2f1b5b6794afd0ae5e90754539c27f4c000df99ae014dfb0393a2ef520effeeb54f581e32a02130b4c1915fb135bbbb22bb862949ff4d9b899bf3f15265e36a13becfa38efe5fa802b884f87014dfc885ab0cfe0b6bb39cefefd845d7edc6066f6630af3bbb9289687f936ad4840541c821389b5209f25c0f28bfd5519100d1718f4a03ef250481bb6dd3511e10f96ff5d08d20426c9b8fbe621ad2ac486823b0565f186137d2693f6569bc6f471de6cd7491d070adb683752b8cd0a02be6b48cd51ca2149160e3f9ce48ddd3f506eff539f750e1bcff05d3976f552abc4c8609ec30bf0a945d1fa05f9ad49e835312662332771eb9d18d6ec166b6e459a280b8886a9038d617b3b03cf3d23f09150df3f279b520968471fec3c05ef9941c913cf7dd19e786535a815361190b6b00feac3d0fccfc78ff256da2237e2bdedb8dc208cb4d717540f3b2db65f6feb9bae67c4921341e27fcc2116218c501aaef556f4876206059482ae855039057276291b9b3b029554c4fe82d6b1454a4649b0be5548364f1b20d347012d144b1a84435d5c8689bc8394cd60d7c3cab65c7f83917a05a0a6c0a723ad8926240e92d849000e09eb356803b7e1d79ea7d1e122a2c9f476ecd40eb7f1a45dfa43a63c592b79d48affab11eaa02f399fa3c04055acefadc79297db316df6d23db04a71313109a5aaee6538867d5e521915e1b1e2291aa1c31efc91140538e5ee95e957d9ee1144a97c06d374fd670de50edd2c06edd5da85382d8512d26dfee81a13c06d99203eb07f313d2e69b86adc201c886ad3f6646173df17a246db19b6a77d47de6bac0a0beb01742623d653add295852137a577b4ab1ec4c5f7f2d28e793d5ae2085a2be578ca31ece947998334068cc76f18096318283a477a8e2aa28fbc0fd68ba07d055c7ca51561983ecc19cd4f52dbd359478b64ab0e34750330d635d3634696b2d752397525899a09adb681ccb796c8e60c5e5be5243b4ea8c932e21cd0897d0d3e83c83a6cd880f239a8bdf717e7edd1c66c96e66532382c42b9b5a47638ff82cf59388e86ca9b48b6924b333e247e596c0e6ee86b245e34f03ead491cff0eb1eb8170d5fd84e69d2279cff61269d5c062ab977e89267ae88518230d3d1a4424fdb47b14f70d4856133869cc6ee54f5aa40db764641941aaac1babf1859a289ad6646f612628c89de2281c7b52b15bae091d1805680eb6d74abeff11cb605d9732af647d5282829fedca92a5670d26910fb65e5976d0e2460f2e17831e4bdd9a3e10f312352b27a748c4e0f18bae33ab09ad3cc5a94d8dc2eaf6e76617592d48a5bc998cf7756fc50e193ca9c5cac735a91d9dcb96e168a0e92d0d39c64560ecaceb42174a26dbf94ebb1c4be93665642fa30fdffbaa08cc24f609dff9a128daeb9b30a7b9ce06bca29bd53a2b441c88cd4edf84c63e1306d8339fb0c82c1ad7d1e36b5d6c4025789079b0620850c9a1b77c93d5bf93b4c38f35df2de6213e0cb5968d405ef8b2682d169fb2feac419fd861742ac2d1ee48bf92939fc80a5cb31710e06e16d352839ac32cb86a1899640bb2723160ea6db9ebd915c748ef151620bcc9b8876c8c013194053e32ae1d771505d7964b7f96efb0200000000000000008ff8430400000000c620123994b395e18fa7595e4cc683a0bb9e5c45935d5a29cb1cbbdc1342f5b6f70c89fdf8fb7d3db76b5c9c97fb78af509bc6a2162cc2f3a1c439c441031c9af9fc2efaa88a019bbc659ca248566434fd5783d480f2dff103cf8bf683363716000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e2464d9a6bd8fbfada3e4b8ab07057224bf414888fdc3d5da216db13b99c3f33b3d004c742c546ba48c42fd1d35c4c0360555502338b657400a793e4d076a2660069b27dfe229580ecbb869c45d14de251ead3a9811a6e027295822e91849840a4168ede146b87804f4b567d6b65619b565254e63445a9fde8b1ddce3f8912b020948f97350189ceda786dd285d56db7691dc0c78063c5855f0c094d98549d679022a4dfe2d69feb359459f943b09bf055361a42df9d672ed067508fee2c8b5822b0a0283d23e940aa931d8c324b9a2e59ecb1166e4cbe14bf171b157d7378aa8c6ace7a929bf807d24d2ee66b2c807ee57b1d5a87db74f52246801d8beb6e6d6529b0327387d012bb4943c025ca699586e27f236ff686b562cf5d38cc8fefd4cb980ce031084284832e78d5ba12c7bc58de44bc8ce701e014f23455156518fdf5ed07994021182bb9ee10d779941cfabde31b332d8f9ce81bfc04f2c3f073ee46816097e9a032607cca53fa1a4a22f3841ba9e7a0cffd30cddce79000c66e647812dbb89afeb03023bd28b834cba88524d9455890bca3e5b90b906fe1deed166cda208fa19b33a8f44219b1dd75868b3c2ad7b6d9dd3c4d43d03d695f7f6ff65229a8b70764672c665b710a8a3e2171e2d7902947924c6183c9244cde492188af3182c43be7deb748205d4a1ce75e29a42b263b03f8ba1449661bf40880e0ca7cfacff9e0be29c8c0eb659c9857e18a3685875c919c949a681f73a22904fd3a9968de989350f9b7032a4702f375f82fe50d7c62784f63f9660bb35105e5c2eed329452b78a30846b3602945daa703c314bfe8852fca2585bc53f8b8561998b07a0ce6b61aa276c2a1fc571324d1f604d58fbdef1141acdb4e0d71a401f58b5b2630ca4e5902252f238569e402b48690eec3c8a32bf9b104a344f13ff5b9560e4192c352cd7d25933513a8108796f625c7d6782afd8d27f05940c495b15a8c365ba3e27e2322f7cddbec59fcffe986fe5ce0379a0669cd47280bc48ac9fcb858918b389d374a9bf61893c6eccc5bc47c2c01e292bd9caf3904eaa3e2c529702f6386d459317a14933717836e43089cdeb04a16a3e47632573bab3fca9ff68187fc42df595e14b08370e1ee73fe1b3db4a3e9c37c32e61cacbc5a7fc95247eb900520689f2e54619248159d52987849678f31007d28476ecd98bc6a3e7e880e7531f18041e65f3e0d5cfbb952553d0f99e555a8164f3a53b6540bb29a0072552537f9915eaee2016ff76f274fb20d3c96e1e80273499a5ea56a908d075feb9d3cd08dd67d06b4a378059cf34268c68c4f870e54ef3338edd4f77dd0c3e5b749e5a53b6429a354fc6a09213b77eea17303e32c3f2244dd893a1c320aee1b80d905d0def55288c50e63116483911cb5a0d77f2557bcac9f9747daf811d68c291a4715d58cf1c9d711b9c521840931fe916973be61be6162f63f9548d9d3a8bada299fcd89f845f5202108cdfa6a4961b432ceef3555c1cf141ad09e958befc4018b86c18ae12176087d8549bf3d40957f117395560d335f5e902333305dcbff69af5bee7e8de6c9d9cd7e96bb77a9bfb7f882ead22eeecd9824bb2c79b788fd6a0ceeacacae785eef1847f914e7dfe8cc52ddc45f65a09cb56dbe4f2718bd095ae1c29b9da9e43712f0a32216bbadb47506b57383c40d90cc7a9c75d41a33166d735cad12e8ef1eb8b57409ac23ca41a1e1ab5a33a6bdf4c559d68574c7d53ab433d679fa165ed1750590018365e6317c35f5a925d10dc77b9455afdf6590369a2a9d1f11aff7cd1511ea90ada7bec46032535917d131675a5aa8315b37c0c711abf76afe231eca34bfb4b0bf4a00834ae6aa7cacc3fb10697104b172c242bd3bc6817cd1b6ac526d2720cb798abe3a80b10e8a625ebc0afe0c050d9ea3fe4e9a8c7748d901f6414f27747203b56c458f14cfd3d5aae33e3a56c5278d17b106d5d31b2ea97242e2755088598c7b8f2ae90cfe2b42d7e20f986f7dcf840ff39d992a9bb67d57d655dd84e30ce248589b76475f434b856db5a4c145d3679e69e38b8acf5a29a89b407369afc317891cda35bbc0f8715f19c9a0cc0b743aea6019fde9ffb8e136f26bfdc049c4aee6b7bb894e952b6d1829ad76bbe9779d1e0dd4fd64941718c3ada02cb0c88cb6996c967c36bcf8e159830dd3ccc8bda57609b345694606ef3af25d6aba2cb84adc0ddc823ccfe3c83c07a7cc1123e527ead75d22470508845f86e2472b6497ff5f36d2eff80de304bfd3985259d5573d7570d09a2ef1985a966de23bba6f3bc96d14ca445728fe6282f765dc5270cb1f71e0c5cc3cf85aff3d67a6d5bbc0b03cd6f831146ac8821c53af6a1985a5b8b4b7acb7dfd98c588a4ef86fbac6ca61dd0cbe1c3d6fc22711377c6a6f95202", "", 0, 1659126309, "2bcc7d8fc0bee71c64b949b600ea85d9f3d625fac854483e81a484cab0cc7400"], - ["ff1b2b6a044f3bcd85c5a096b9aae80a79582deab72d80469d09b7ef19132878124e386eb700000000016aa2207910ce6c867abaae5f96fa1e1d768ab49fe06362ab8728663ff183e6da082b309ba502000000086552536365635300ffffffff264519f7f19b62c65053b147319c95278451d0e29a99c781c898fbc2b8734a15010000000553ac51ac52ffffffffea952c962e81708b2f7d840aa3133a677daaa94cad21de013908827a93fc64b30200000000ffffffff0425940a030000000002510040f4640100000000056300005165d9514b05000000000565ac0052aca137f4010000000000706f9a4b010000000000000000e6786305000000002ac5832ec9840f7f5ff924997076d691291d4b54c07f7ac42ba155e6c50ab7c791af0181f46d73e10a588ada8dbc179b7be34d82aafd6fb71af75de46fc517d9db1ebeba47aa148899a2b1ddef3e7ebc28306bbef3df84fabcb0297e60b8b885000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b07835c1832508549b867a9ff120505b637e0876684aa6343ec9c6c0f01f2304d2100b0b96c7f6381c9ce1c482e931b1214a9a584c1ebd30bc86ecdf0e248fe73cd0607512c6b72cc02b07ebcb02a9e2751dd977cbd48949cc9b27e9cfa26802296cbee054944739f2137ed408b5ee494ed478c085ed98ef93d46c13d40d9dc0305b02e58ee7779e191e91492f9821256eb839db0bee353bfe401f4ea793c4f6c0308ee6953895444aa734accbc2bfe242b4c77fc3db5e2f5761425bfe96141ccec0a06543d6acba6df03433800e356f9959688e480bf8ead437e841f13e2cf33bca6741510cdbefc09db962634677e22fac5bc4e0eb646d6cd1cd1c0e9222a8b1a26020c5b5861450c33e0e9c4f498a11e9b644d173a33b4680019303a305d88c583ae021aee4080d605e8744103640d9e86c5ab2fb28aa0f165a60064d268037129617b0200bfeee683dd308c43633be5baf69788e6e6a710be3e685cdc84f64908d5c6c5032fab3301038aea8f4a91bbb07fb3c22b77706425e2eea4052c77183e0edd1b0c031937b1d805c12b3c9fe41db416a6a79e1c9ebb938e776f6acc34d674d63d9fe6fe626c86c7d3617ca4f8631e53651a75787c2325f4f083d884c9e845a0aeba9ff3215c2d3abee73d384a4f34b255f0cc4c39646fd572d4f6ee958111be6e4350fb5932a2bb2c18525f7ee0925deba899b612b5e8c043765747e97fe740541bb86c3f30d7f5f8b5e7c5f2d64a917fa3fd328b3a78d6c2145c2bbf6ab77525db90164fd5fb6827fce6987cad1ea991738a6431f5b37930d1f00ebeea16fa6fadd891f4465d00f4eb9a074a94e211eb35a7cf8d640ce11ac176bedeb4dbec5338f1bfac7a51ab3c3eb5637ce40107c77c63e85099d536b546712f1fd51cad26e1ff3994b400b93426099a3d50bc1a13dd62d4e8bfb35575f528b155eadc5a3a0b1410389ccab6141ba97539ca2babce67dc857f5b394dc3d27fc456b0bbe15825f66aaafa741b6e2c9cda9879e1991eea9ea2ae268892b793d419cd1a1f9128673c153f0135b6d7fba94d79456694c39c45170347483f0bea4c66f64164dd2bb32597ba10845bb32d6212df15c6c7fbdff43f4b9b6948686c7c4cbd03754b6bb92494f7fc4e58b279bd93ec2f9b7ae0e9ac464e647289efa0b229393809c92a075057143ca09609741a8180f978a94f425eaa108b34206cd0516e81531fa64b947cfd780e3a4d4276172e1132c31a90e5855f8bc919a13ccc39872b506a67bf1dcd66d41b235c6fe295602124a388c025d555bcf2c7b19bfc88180b50e4bd05be2069103182f2706f962eae57d1dfa8c49e3f8acbc60e4bd176e471515b64c827e4242c6e205e96a0c6190331382804698aadeaf29164295bab9404fb17c2474899c5eab0611e34f47acfc0edaac0839440d4f55e5f6753fc7be5eff02264d3280a5e1e9f2160d6e32edaf765bac1b0b2ad505aa8f639c6a6433d2b2a0731a9e6e22b3b2d2cb8f47635e3ede1f39c7a52d309e4671cb37972faeebc039aaf0d915724620abc1aaaebbb6cc4a1782837a050dcebb3bab3ab4bd3e0c72cdb5e123037d28980610b298a6bf06d95e4a6922d368fcaa2166b8a39a6336b41cdfb2729984fad8a739995152842815e414f180eb74e39769b40d1d6c6531f9627c14cccc256daeb4cb52c9b96269928a7a68a05dabd44451fbcdb08e1633524fa75c83a337dc7d6afbe585f508817ab10d9c3dafe34ba0fbc018cf734ad9ae879cbe9ba4c0dd4a71e00e0752a365e185dbd8e19f570803c90e2d2ddeafea7501b774913225c4fb6aedd9c44757ae9f67044ae71e18fe24b965d3aa17400f3294afe992c2fbd2d6eed40c271462312dabd5d0927afd3f6b2c30a38355d871058ca2e0e465c977d3c6b8254eb0f09fa8f4c8a71e92d0c386c21bb2752d2b3632c23679108e0b25bf5e339d71ea9f70f19738958d0949f8919b6a778eefa7e29b3934f806167663af0327d8fc3ebe1b1e8271e3b16c34c0e96180adf3145d4a3578595142503be2d9ceb353f586a1879576c7980e3083dcb9c550f97eda139c206a4cc4695be537f9baeb79a193ffdc49eadcd54a89b71a5304fa9a2fd1031da97f026b4018355ce2b4f8a749164afc4ccc3d4d29ba6eddfd35815a3c22139775aadb77a974f62a7434770e15541401d2d4a2b89abef8b74cdc06e0def4311843e96c7238b0a26c4c34b1765d39c19ce4dcf36f0fb9033d2acc5a9249e5696af1c7f5fdf8ef88b6ea6dbcdc44ec3623cd73cc140b08077536634d930b397b7af7fd7c5bd295d76fe274d1932ae1d17fc94598193f60e6fc9a2e973442a6185964360413f3cc3bfdb8ac97e9e1556daab4a77a64518a40ccacf88290adf7dd6bc5aebc02e681856ed197ab33cc0df8aa99be02fefeaacce0b", "6a52", 1, -2053263233, "08ba895edb59cb83003dd96f70f73dc392e98cdb380ebf5218dd48e3f3641e0f"], - ["3544177f03df24e14819dd5f925410ad284a148d6a18591a60cf975bc35858cd07f47ea3340300000003ac5265db99f7c5d4ce21c71cd5bcfad390ba98b2d084bf8a8ba12e93ad0d23b154faa4703053c00000000006656a52ac6a657ceae35486e094796bf33b26e0d2deef8c4ae2d417ee30c7367bd4f848a5d0e4f63f2da403000000010056fd8028043785c90100000000016518e3f101000000000463536a5343436f050000000001ac267fa503000000000453ac510010b184350211bb2f0100000000000000000000000098e4ad320cb0cbc94843338dd317ae6bb2f24660a399689f801bb2f1ae1af65cbdfa2253a0b2738112aae8d13adba12c96d99d3e15235f0bd73d47e817db7ce301ece265d7507f96e6f55d97beccb63b0df2cb0dcaf91b05dd3726844fcc863c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022d64c5349ff168756c39c3fe7fe0141eb860b2c4da5d4ad964e796007db3cfce7b75831cdef598fe7d0276c51990a93b2da90c8e8f1086ed11daffb56186159cbefe3466c43a411c33e17a199ce6060d234e2025dbd8c6b4d36abaa8991efb2893caef9121a9354d76f382de488edaee845a3d3bd29467fb0cac35a77d0b7660318bf8d986f112ad66207d66d5e597506be66c3e68b88aacd889e7aa257aebc880217da2bd1db8ae1baf9240ddd9ec2e30456e5b900f1f1209a3a1618e8150c705a0a013097676ac0fcf7038f25cefc791c4b9a47d15b9077cfe288bd9f23789964bc625b5b076df40b061fa0eda9502646744106dc9711eb528cea5b647179875bf10229ce8923abbed79069cf7175ae9c17c7c7314bca6616cf23d7436a3b8c24a9a3022b31997410814bc9b98092550848c0ee511498d24befaadbb2f89e4ae651fcf60225dd1d08c39169ee2ccbc88ba07e93517b68160ddc209e36507ac02de7cc8da30201f4446775df37e10a6e14ef1d143053f5df81dc71b11a578f2f365c70458cbd02071dbd5ec47b4baf1e4eda7966648942215a8d8e16243896a3528a95ce786f9f3ccadf2e95d52559954881b0d061cddd19331779469e0157c870d1347599c0e27280f6b8e673b8deae6753b94001652f1a7f38fc914cad22e819c836841d3ba7b2bc843fc307a4a148ad8acc8a6b865a7c23abf4a043cacb4f71c5db212f36124c4115dffb77c414cf374301a1f1ed9ad839c3e8663b1cbbc44c305e22190242ef645c428cba628452ca82fa1ca3cb91cb0915a154650c7cef7d39a0565269a78b4f014e2f939f6baaf8cd4f4ff5e7c13a2946e16ad445c06415a4ddac7389055c3e30834211b38dddee228e87b883bcde18ee7add7a2652e3d6b1b1169f5ff02475ad7933deeb933cdd664ff9660e7e52ab5350ff24d14b1342374e98515bfe8cdb5d4190fc878ea5ade001e89217b3a9c8835814962ca1d6ae64483e7d3fb4bd9122b019284cc082433f537964758f39f7078a77e81aa717ed6e0b7311578773920033461fe265148d69719e2ac2a852e9cd0a48662e18e894098dd1b38a18ad5bb9cbaa1c93af32c08cb1e64317512a7f369e5355ab8c6cac2c1c2cd44d3387207fa31eba4065ba16ea11f573932efbe1d47c5ff542e2dc101931bab69d647e6e070348b0d41e0359145c0fd78e6ba9fb23cc4c684af85cf3b4ea7984e3b108e4b8218683e34e50f298a35bbe94ddb0007bdfd6e4725bce55ebc5831313bffa06fbc7ba0652f92e508e44530c8d79288c1cd83ca1307362b46797a2e8a97686042711c7ae811481cc7040f0835f67b8e0763117593892534ae9cb0aaf3d703f4bdb1df04a9214f83cb2cf96be66b3e6f12dd887d36f9bca89ebf5bb8588c7c902e22ff79f2bd78c9235480c115be2db91466ad1c04bc8aa2ca3028aeb5e852eba3596d510d5d95c007e5e7bfe758ac9e75754ff939975f922a4e0e8b62aabe0d587d9dc90d72b8daac29ff72e557d2d174055d585388e44b1a4fa0aae13bb7f15caf62ce1239cac79faa8a71ecff8ceb8d4abe5e0d5a898d74c3f04a9a5d5e53389de4ef7775665cfd9e1f37e9f7cff5d2be9d4d9157bf97f5e3e3523d924e4138315ea970f1fe553bbd2426cad437b5e3d325d89f5bf06c47480f0e1674b47bfb53b55859fe69cbf63d7038be40b76995052bccdb54ab3fe5055346443a44bea3faea17852ee22e07442d9ad28f0bcacc679d454ecf08458cf72f873fa671c931d34ddb87f96482d11a8b246aababd050a5f951d51354edfa4d1f05aea305ae90c96429cf694325a5cde9d49e71733ef1d8196fedda1aa75d1527e2a6587e3fcbe0af4ff0c805726478a0c4a8555f84cfa606a867b586f442d12d7cffa44664b304fa6c866afa8d7f9cb913a5edb7e256004c9a92c780d70d030dba487950726ba8796d6863a4d42d1e2a879e2a523b047a90c07e984fb0f43ca782ff12a28b359286c28d19473b63243faab01c0c05578ae5cf21476c24281e107434ea75356b3d6f557fca94ec9e83679ca704acd1fb04966959ba4c9116b21820bc252bee30449ed890b2e3057fcf44c3d6cb63ad560ae1b241a6f8914ff6c27b7103bca7f8934a4fa0b9799b2673b879a31aee1a16af19203884f1cb27de8c28a9b744f577e999925fde1bef672b1f6fe5ce98e42c186bb43d1debe4d28d8f93d41174d1bd58dd69a964a5fc6ca42bbe10d29eada9e2ee75b6f5aeef2bb336dae3425cbe3734e5533770c169a80f0dfccc4ac51a3fad5f000000000000000000000000000150e14218870348374d64b04754cfd280ee7e20f6f1a5d1bde30c0403eafa95b6396a78c63e22aba039fed420b7326dfb8b7e73ce3189f08455d42b23e0bdd617a89ab7c6d01501e1d07ed62a190d4619526c916388b949097aadfa6c7e01cf6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004aee330147d315993d226c5d7a6afbdc35c0ecd52adf7a10697629ec29b1937455146c7739b90b7cc8c71d67ad5da4928cd371bfcb813f980a5644417223e3c4d664627455088f21501aae06a940a39be80501a0fc4a7b9bc009213b44863ee20ef6238524605650d4955ecfb6f2884e56db4c6b2ae45313932814d7884902420214d62a20a71c3b7d7cfbb043f7a17c2d144ec05001849ce63a586030c0ad3d44022707367fee3fa75aa86b82f539f6d5e1421b485a15e3bd1bd0254a91ac073ee50b02c7383a03485c7bbc38f6c7011c0ae4859703d1d26b8ff76f2bb8591486482337bc0815fb6ae8ebe5b4430149ccd722a61e7cec40d8a2b95c2b0f61dae95b66020bc951229e5aeb9764806ab02ffdefc6fd291ca3a262b882fd48a9bcf18165c602215a854d196674f1d32fa6f6a80da0b9546eddff24ae169df81e61de4f53553a0203c59bb4e0679a65034c78fb1930cc8afb879fc2a2c4c522284a8cef52ef426502005d62bcac0b57d6f1c45e7778200b87e4a59f82bc2fca416bcc7c0bd5294d77021f285eddb8642f15c767f0da52b3241443be88edcafabad41a4577f25d7961b6d1b32cae9b609156521e8b11bd03d8a6a7ed607f722923f495e5a2a394a828703a4ee32cc046092b61eb4fd0cc706c168a017e5f98165ecbcca837695f311e1bccf5557281a264ac20cc7dc3032fd03cb700b927f31fd6cf3e295b38e4120f92308ce0bb05f8822154de1ddaee14e991bb77912eaf63efb181bb8d7c8683686e11120f522b4cb50d1adf95b24b8066f6995682362f1a414e769c1fdd84e86e44f3901a788fa106e37769a31ecf5027ae95fcf885abc02ad89117c3461d757151d1430e44aae93c1b52a47e7d4d14d9dbba8a86321ebebe343e01e48888d76998ae8df17fbe98169579e4e5cddae79425c6e66438f05bb954e60f6d4ecf81f1ae2639097a841017726da540a1d1b65aca9da30ac17fb8e22f6ff7bc6b6dda654f1fee238cab3a5afc471a2187f5b60595a72aad34c1052719ea4c85ea518d6b27c16e1f03356bc57d6ab39e3290ae9873c713196227d9d033c51956812848ef47af50fb4389bf6629c7c8bb37fbe4d9bf1b600d6b482b5af337d872978db0cd81d564c93e3b35fbc555776405c6de1954c3b64eb3afca5d22b4390d95b8564742fac28bb52830b1f331eff8f95134649ea8df832e2d51c59352c38c6869aba3b95bc563c72d9408a094f0f7154944878eb0ccd769bda6ddc929c6cc0a9f603629acf66b73fe53a09a60784f087272c79241c33c14d6545d61e469fd9ba7df584a19edddb981b9c0e3845f141e5b2cdcd4b87a169e4bbc405ee849432ffab4ae29bf672032e3f11709f745dee18b72e6ff743a4750992146044a140f71586e634a18956dd52a67715abb836d95379063eff28074b3b457d3592f834e38b39b529b7ce94e31da11b056aaa861aed84f75f1df3986dfaa2307c57b1601de519e930f3990b66d3547dca4203fd283490ae520a4549d7b40f9d5f2da85e27a6a77871ac921f16ef24707c50906feee1068ff9db31377950c176fccb9b88d957d8829497a8d74f30c8689b04554be5df785d89a040528ddcf10f3ace7928d0463092a415f958f4488eb1b8e87283a564a7891abc02a90c53baf88eaeababbe949add52e252edcf5d67c60194230e515b12c999293248ae296c86a4ba0e9b6fe7e9bca5ca5263e95f3ec5d1aa282e8b3297ca13adac91308015fa882ab6718494876acb440270d0e676462b055b342e6b09977b923d423c2b194cf15f98fceb3b46a11ec2205a20734eb56ff81587a81d29c1f36e885b65446c3c0428b4f279ddc18aca1584339d2f7c9f4fae3f4cb9a13aaac0a465ca5ba088187cc0c6377a5ec59939c1e1177770b552dc72c374016ea7677dc1aacf08596b3b96374950097c78815f236c11cbedfb04923684f43ee796e515f98694c987f8783c74c6e53f71e145dc1262d78d2c13128930fd67dd7387daed306dbc70cb68bc0e248905e56922abbb4ac037a4b186c1d91a52e65c08317649c474f9c7b364371de3bef6ca726f89b7707a5a30f51ec9c4086ef33800933221715ff19b2cc7f4f27653355e232c36c1d58cdc3808420aab54e0b85677afaaa90ac46fe06817010cf379ddafb99b15d03055f2bdb7b3f4163c5fd3400634a5ee009efba471578350f2e4a4694c315c90e2dd2db7a1ddd57d282eee61de8d6599e751ba740ce16dceaf8d610157cb7096cc579733082c7642e50a228a9eda0949772249506fdd7532bd520a238184ba63fe00671356c959edd4c7ca1c8d4b36ea1f76af8934602fbf97b36e6596b1d05d0fe08e1b7b53c9cb0886c4c8303a4dd9026eefff0b50ef75e904e62d9b09586dc9e16b98dcf053188b948009b8389a30a1301", "5252", 1, -79696048, "69cbc8571d957113502fa3949d6ca4633dce920e616ebf97875167b5ca119876"], - ["9fa04b3104c20d0abdba90864587ead82c48823daa611da2ffa0a943f66c29e4bbd406c1b70100000000ffffffffbe905dab49466e480333a9641c1c0624982db613d3bef8083b3eb70ca5431faf0000000009516552526563ac5365ffffffffabfbd7e677aea38f01fff1f76c4f2564477babdc0b9e4a7583e121f47e01fd17010000000300535267325dd0ab24656bb2aaa9ee35e1919eec9214e8fe933ccea45011101757d2d4a37c67110100000004006a6353ffffffff023e1f7c0400000000006cb700030000000005526563acac5ebeb38400", "ac6a655353", 2, 1079971704, "6461ac95bb594643d1d95090d342adb6e968b2585ed42b0d9f1ea10a4ba8aa50"], - ["bca6660c02d9c65b542551774eee379ecfcae61b88d531fb35e4c47edf587c17b703c1bd1103000000095352636a00636352638f15f604a02dcf043f481bc6fc34b3271c7a3017fc1c7dd894235b41fa6a6d5da80ee9d000000000056a65510051ffffffff01d06d210100000000016500000000010000000000000000ed78cb0300000000f685d1044c386c4791c7a7991801b3ec270529a67b1afec8d94ecbb4ed6f81a569dd8665f5d5564cd2164f5d851a941dba31f499d125dae1e3a03b6d97c49e41804690229321fa4ab89e3399b115f8f64ef3bd36ec3a79180fca2243e342834900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d8e4b000bfee4b3ab5898963c0c573157723e4c6276e521421d2dc9c7623d0988265e0b381f87b9f5851dd20d70ada78c1524ddf3ce8a85dac7ee93832ebec8c38d89de52446847f015c2e5097e76aa1664b39e969baa4367f72e0d3446bb7695203599037866d2b1d82b0bc21380b6b948a9f16ca1da582deae7ac0a83435031fdf76977cae00d8b77686ba6209598427bd0700ba3870706713ac15398ef4410302c9a33139d5a977721d1a84a950aaf6ae65050ab244d88527fe55108fbb413e0a066d1f9e266a34885ac306a9fad1a0475ebbf149a895eeb5d3a51012c0ae7bb32fedf1bcc3bd8d7825514cb5e9c9ac44de2be51952c6f8de3fd74bce878a791003142bf2d8825268c443c9683f5c7edb0a7c51ca903f8ec3376139f89039706ec90220fdb59aa4a3cdfe0920c8ba6bfaaa3d03a779d12146200c8fda517420b29580031c34de8cfd7a3d72126e133e4fc36a9954eb8363f71085aac2cd088690348b95031e1546d67fd389e7b846f0fcaa8a12c8f7994a0d34e7969c289f224a978c4b6703090f32f7903575c8588e2b5432dac32fe66b87c99c30f6ae1601bcee56154111fc4f2607da164c92867e6cdf900d229b2b532626d523941dcb29c8e0b1237f2f33aa86bd390b2017db35c50bacbd7ade359544940266bda668335cd3fb6ac3de55b5da89c96504b8c43db28af6f76c5382dd0e5f3602599b3e570deab2626e9e050a7583842078571016c2edecc9e47c6ca912a3616475a851bf4f94bbb9f9dbef15fbb5e7d8f8dc5cc50c274f55db834570156a6f32577d1c7093fa352ddcd89a4743e30bab97aa92addaded7cd697622163499af89ac0e3517176c300f8a14b579e8f62d54f2fb77f629b4a1ec63706d4b2b1686d286fe82bb40820256afe2789fe181f8e9e398235b764ded43ce84bcb9b075dac8b72296a7d04ed8d3ca8c07c8c2d01fb7b3004d0f38684a7b964bcaf437ae700af7d6cda06bdb289fb7edeb319fbe084ad6018d32eb194eaab98ed3ddda6967ac997d3b49468b907ef1d5d07eb473aa79d583cc5c3324f7fa396f6779bf0b5bdfb81ce54f3c92c4d25f4783d34f6de01d3ec256b63138c588b32f3f556bfe6a607a35f67c6c5aa733ada5da9640c7c004ccc4944303e64f4d7bd13efb055656541d7d06f74b87e232b13ff08e5d45ce5c020880580a57396e800a04c028da687320412fe402c3321391d7d62e1b0fd889ef16a171913bd7edcdcc519b696379f87eba1911cf4f007ba62a1338d32efe9db34549968976be66372d73e98e79de5e90fa66fee0ad6e384a96a6b9edfd4b856977183ab1c26d79d87f212a5e95ac790043d4a63a3cb38dbffd7046742322aec4bbab7f5b34423f5339eecf3e6c0f96b7b2d73b2ab26717f7f1f6f473cabcf07a819f847c09629baaa4c02d99a3aedcba4d333632eddb663ccfe926cd11598da4182974811132baaf4b32f2e42f89c23b87a247b64b16ead8e1fe18ce49e8a710fd38a6874145d85b314430591367bb4da2b719ab199378978558fd085727caf47f1101193b6238c7b1394e233719a859daaae6da7c6982dd9a2a2fe1af0a33789db1ca4c22e81a68149b323d9522f01d1a217b59120185269cad722ab5ed7c26830507f2e931b2588d5da52b55b5bd22918e6f7fcfd27f8e7df3b31ebaed9d7467891e35c28d20649700568ca1264f7d449fbb9a4820989d3fc9178a9e24753117a71687ff7798a5cde2f331192e78e55f91da5c3fa2c2349d72161f88bdb9ff222e4ed6acb80a74fa1baaadcbbca4dc1fe951988bc3e60b385ced3c4c6b1e09ca10dc2f682080fb6368ad0bcd3edcf81b601d1f0cd72d64e8cc6abf28e5b5da325eafc080551c2c18f1ebdff5036c26fb643346cf470079e27cbfac75325650dcfdc782dd8063c349da9efb15580282aeb6b8b84bde90aea2345aacc13c84e659ef20a380f979326dd1fdf594898759d319bf7efb7afbf9c6e64f0196ddc09fd136981233a3600c2924c3efe6bf8d08469ff416defc39bb9ffb8430aeef2356884979b21b455b3b87f3aebb4fa9b0f19d9b7f9ea6acd62847c882ebc6ec834a467d7e29c3e9a8108fa71e734bf01d1a7896debe5dce7061a938047eef78bff14d9184d61366c4d807e5adfdd13d04488306ac0a31c92df21ee8b3c2f5d0fe85478e535a2546640d0901afc994d1acae4a3c27a826fa24077418e8646838fbcaa4251d9fad6efdbcf740a13a0a44f945e2a0369a64f3248a9cd1fe21f9c9ea7ebbda8c77896cb12c0a900644e3810ca7c051769f1285555743f0da46018691d898822345294db2cc84490bbca9d6d2e7659a11e881328c4f0ece1f489a73114519b111a00f30a0dcc1c0f42466719e1c1eb7b138aa73f70ca7527af5818e79bf185785ace03c37e60ece0d", "006a536300ac006a53", 1, 1420116897, "aa0338443ee44f4bcec6fe24e696c4487261d35a0617d0c56bc9385c86ab8b10"], - ["16631349019fa35390ea542211a1c97bbbb588709ad0fd36f91ee9ae2ce93a87a572d08713020000000651516565ac6a63f338f8045027b4010000000008006a53ac525300638b3e2a00000000000852ac51526551510063626702000000000951526a656a63ac5163c600c904000000000652635200656a00000000030000000000000000da8a1504000000005bfe9464ad54083f2bf06e89829b84f157b3b3621dbb10367e495d2d18685f792525bf5d973b9c4e4bd9b6e63e17fa27b818eb9fc5ca340b99802db93a0e596e0a99897344db94a058b00cc85a9032e6f3e44184a6e4034f90a4baf91a8f5ff600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f11a23ca5aca68f3a07740f2ee4fec50a96e3dced4dcc5e8c539d42c86b6111324f3c7ad754120c06d12c4068daefa24018328e1b5044497ad682783e8cc499ab28bf04ffb9048a4f3c8a7a6ea7af528c60357ee517a664ba9136b6916df3abb432f8ff0ae5fb9ef3ad1c22682ba37c6d41145e1c9b330e0af6b67da6c8b314203142c81fba04514873ceb01deea4f65f30f8d0d8793b5d5b572f118a4f638c5030216ff21dd8d752e71190f4b7b27cfd801984466237a24e07bd76293f5e8e445d80b0684391cfe5ee4578809e855e4b6e3266d8f4c70a68e207169680cde7a928eb36ef75b7584f0a2299da9944b526738dcbeb7cd1de299906901c8c59f2c7626f20206f65b29ac825de8a0cf7b3800fcca83b2f9c0d65c96f8007026708bf3f60dd4020e1cea7cc09fcdd3952df10b3b3136b2d1b3c6f58ea33780b24375924a84e4c20311eee1bebf3cf290670f02847ca4bb5c41f5049b984d48e0eff3718b1fd460030205b0e46d879728effd6bf97431eb0472d186005c4b0cc789298056def20d5acf03118f1261a7e7c7818e8c2e600d6709df48deb4a1b6da055db0b718c7cedc932d098c6ba90808a1f5367df5cc59dfe9e7f6543950b01729132d1b42e4090d7f215a52819140cf51fe2da4819038781068e2feb221f90654550093e791d6d710c679b08f2685cfe6c90c6fd8c11811b9b2bfd00b964693a480f9839f4466697d151694ba89554f7034968321a847e4d15248cdce087df6b735d05b763795493d124fbf8380570aac41205fc236f24b0f1435cf7bf46124ad20036dc16c38b375eca62b92a57e93b99156de485555875ca1be00f17647c2a19d0b6dc97d30392afef8db8d831f06de1f4047102e99f0e025100ff3520a07bbc9c58722fabbcc3fea667259e24833eaf5e7608e1876cd46570821762a4ba36f2f71a9250558c38a5a208c1699390b514567f09b042546eba2f79e81c96ec3f99f0baf9e9bb8c11c420e18c7829eeca696797b555c8c02b8951c0f30893ddf2e78c3f58c00c41ec11c915b08ae36ee11afc1a8d234b98cb33063341f90b3796fb26aa6237ae15638bf9c4ad1b39224ed868cda7a4b398ebcf9b3bbecd07e032a280aadcc3b769ce58932c371384fe6e4aaf9b3e09c8efc154674fbe1b70566c562e44f58de2852cd3ad56ad9379fc52e57b3ef38955bd7f46090f4bc177e98b98b88dfec801ed6e31532a1306d1bd283a2caaa0249963afb0723af7eb8514f010f95c711e33a8f9e5666c95816efad5e055e176cdce607d6addbaa1054283d98a27e21a45143f89aacb31400cdd513334685ac90300d4a4ae9e3f6f20d0eeb7a4bed0fa14278ed1f7e67807d623f4335caa0c2fbfb5a82b8b3c985615ed1250bb858a25f8ae97846f0499b97bede1896f7c0995d3306a67b97c42a3192c1012e6c49bf0c792dd9ab4a60aab0d12eb6754c15e5e8918eddc9c1aaded0685c7676a084b6dda463c5943d13c20b75b964b5f093a8b090933dcd24b5b6a52283d223dc45b996e0457252e37ed7c1075cec44b26175e7f4cf55210fd9e2f78d8049d4ebfbaf10f759893e45bd7ee4e407593726f6e783a8ac676ade938f0b0b220224d91a037d58d9ce5af652557f8eacef44505f4a5d34e06c3c94cd92c90dc4d746b36d33ff28d6109fc63845423f4fc0c0fcb0eaaa016a69bb731e9cfb661ed7db6034bad611490eab43c4354ac25ed39d0d10541bffb854a8cb0809a54a1662bbd268f0f88c7a401e623826a753a008f9da747e46847dc7e924504f58aa30a6693c26f066cc3f65be335335d8e22cfcba8a53b3e7a2a147578404858eaeda035b1ec5c013ea4096d025770aa60c39b03ba49d7e9883709427838f6f5505c50ca0e5cb2cdbf959f7949983c4c8a59ba901a4852da37e7c97d1857ffb9dbb5890950f2d6630eb1e3e871ba3a7271e2b931e988c083117da84c490585994508a2db06f97ee608a038c20d137f24aae382494c8bc615114d3932ef4cbb75209cd519d7c7e2088fb7b370d180dc9b5b9b76d401542bb3112f0b7831cb5c4acc0e67264fc1813a9824d65dc50eaa6018d04266c3150753957f0c3e818c507c4c206bb99abfc1da3a584c90a1d110554e078090b7c6a8f543af676feaf4ae80d7200664380872779dfcd9d821f49db6a3652ededa97320cf3617ccef47dd541914c3cdc6196bd9e5f8be4a044368394e8e6c3d670480ff2db7085bdf8dea58619881c93a063975e15f2ac5b38c7818732c6fbd3bc2da483098b8e4d93b75c8bf9b0c03000000000000000000000000555e822470cbc645139d837af182c755ed17cd1b878b9198414dee8681216131fd98ad4793c8b101584f7c5206333a0ee7783beb178146453784d6982d9aea3e0e7cf955e0eeb5f8722aeb80d182f3a3aa88fcd8d07d2b49c9bd248c02d0f71a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de565262526610b6455dd6bdbb4da7d255e667595ace689c6aa3667dd12d23cfe7a88ad62fdc0209b16aec94e6cea4169e7880597fbc0144fbf63da98e0d1195f028606316924728e22f562a8d4f2da1780f740dd1ba6cde828a6cc7302ea014299a0489776937d8c7a16e7e03ef27f4ee56f30455ba3da2678a79d8d068f10c032ea517350543b378965317145322608c84f5fc5093bb2ac0e36b3d037446176c021f52e27c4ffd579bc2de0aece17f2e4c858322590a0f07db24dd227aa9686eb50a066f53dc860765654460f57a228bf378d19dcadc2dfeadf0c245b72c023b5887cd048b517bb61ea5cf2c383ce25692fe292a2c6c1fc94c5c555a09ad580deea6032354dab69076efe040022e149d792715afca33e7cc36ef7fe0c7cb6cf1dce5480302ff16e9300ebb4b11d310ff09baea08d3f6c3dfd62e7dba5c8414ffca8a713c032446ead1d20ed6fe034d138a0edbbe8f39aa4e7da5132902a82733eab1b1f7fe022dc173c3d2534d65fee59077318beee290ff397c238bf2449e4961c60393c11a03276618d139329ffde8e789e095e8b0d4eefde61fa12a406202ffc9c49f8c1d588899de3c7140586bb6ceba08c2a216100ba88541030f5b2bb4b771b59ae8319a1fa985f4a4ac0cfc2753a565d240c513fe9b5cf98b5810cb65b7890b61e370bfc69d3b21887b63c16d10e21e7de888f25ae16ace0bb4ae866d8d70e2677e2b1a40750716ada2eee9300405bd839c58f3f7d815f9d60015eae4870b50bfdb220224a5a0a24acb0987e58bf68b420ac63cf155bc0d57faa031501a42149dbdc236f940969b5a1405871e138812ab476a57c64bc5a7901b66e7e1622a4fce7509f49d7627e608bfecc76705e824844ad95a3d941c6ea83dddcdb71ba4f6e0f1b873fc331bf584a36b0ff45c19aa35e3deb98bd345c3d673504ac9947279555c058d90d0e340a74433f40c4ce45f97e16a7f3dc73b20f93b8e34393e2a6e1d41c9e60b3dfb931ac0eefac11507928a2a1e2b5e007752f1327d7fb4caf1856b8627e4ea0da3ba815a55e07c3e756d5da96ae691a079f12ad49231896c017e72d05993501fa976aa5c155599528b4a29d28f75c4f81b2d2fde4e2862379ebe0daadb9c8fec4c9c16814fc3319e770462b5746853d7057fa75e8d40e8138affc9fcab113de47675536fc408efe5a0a441a8960684158c6a0132c57fd12066da91d78294db3e990abb8b6c01787ddbcd38e8e47c84539ced4275bc36b4a72919480074f644b4c72760905d09d5eb66e542fa7ea1ff59c3c772655fa3cda8eb5ec32f0f013be247997f49cc004ef4376ab98a8d2f10f2ba4e42ce89bfac20b359b5cba8177dbcd98b2aaf53199a80dea5b66107fe92913de7a64d4696fd1f6bba09eecdba96dcc3fcf5d35f8ad4beaa4f4685531f49722d63c87bcc5593470472d00a6a1e82134cf8c2741aa398fddd1ab92fbbcd04fe332641ff69fa7f623cb898b977a4615da706420c09578db5209ba039b6e74d2826b013d1c1da55c223683de95ece1f98231a6deb98353e5efc40d478f945638d8249d790dc4efecbe4482c9f063fada8a24a53949e4b147c2177b144313b1654622acb2bd9681a256c0aa4d709484c2733444aa4f22ce0db9a9e5d079cebac5994c856923e00676858d7a388a9df79b2480d31852c535ba763226fdfd8ce686c8834df597a0f9d5875a9df1ff6f109070c44c2ad783d463ba24721292111951fce7c52bb06a2174a5068b689dcde9ce76e2c7b8934aa139938ad73f97ca9a0d6bcd791e498381251d9a34c9661f070f3767b8b94f2138e919ab02322b9fad0478b7bd061d1a0aa20055c499e82e893dc683f6218cc187f161279b1ef55ca49eb577a970be5a1916608c649a1575809f8817b50fc39d3cac020b354bd2a2ff487b0b3e3a3e4c31e688eeeedf204124e6a3506603419be8de69aabb9a6659c86d7629f0238c3050e0c2efe8835ad520c1acbffab86810524478fc90a9da5c0c594e118ae9157d3af091ccd14a652646a27926da8d6e75f6945d5b3924d15f13e1906ac78131e8b27432581da71890df312932d5202eecd176bd7889941ee78a53398e165c264b6a6182aa7ee52a339a18a1ebc6b7078f9448031db018043f6bb517f902e274e1a983926aaed017bb1bb8483e5b923b813331688013ef9f359ad7079cf27f8cdbce101f275435960501eedda68a6af9c86870809c91501742391979ea7f5c1b60df13e2c45fbbf5428c08ad466d041028838f36895c1deac04ea2bf6eb8f0000000000000000000000000043b9c461c84da40abeb5f4ecc574dfc7c72b2094907fb487596291314cea3ff5759a1f2fbcc3055390da5e3bd5d031cca748eef845f88ccb4f1f9a53d3f4a03e6bef6d5555d586e98c4668fc84385e5bbc129e44790e42ef6a6b96703534545200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000669a6680578f601e37269d815774c99022fe6ee954092da96f49f7011f2732b1731eb446ed75a0d79ce903a981a05a7091fbeee2cc53b1407991c67c7254c8613d7ccf9420ea51aa168a842e67b6f2bae1f419a0a5753b7cd2435c8ab583f76d6a11597ac9b4ce0778cc10376fd6b5a271042c7a5fe822f8e6838b3778c6320403181e57ef434e3c88d29271277550514f35292b7dbdb12029f04c5e2a73a03c9b022c1c0cd2c3c6ed57d55fb4b2e837955b28a0a8a039e523e76e118588b3c037e40b001c5c0d9aced6edac034a4a49b3c9ba8802786c378083a384d601367386cad9a106d2f15cc93837ad8b582070a30e7cb5945f3cc521a4e5150a53830fe0b68f022503439e222f5fe5f1db95971ab5726400a4d35fb0457212ecc027d51473a73d02288f864ec0c62a71a9892ac2f0f7827011d104d48f3151cfadf79c6aaedf1bc50300adf8b9ff7ae3a87fb72c998bfc8fc81576163f805a9f12178073bcd5bf001f020ed5aa1cbf052d084d78c28aa31558233096603b601b9a904b57a87fda1879fd0310716e8fda148f0bc29f3ba9afdcce703beefe962745d13b762be348cafb2ba705eb67088d2887c4937fdb780180c4c0aa47aae544017fc10f0919fe7a0e4e0f6492bce5af028ac7cdf8fc44b9a1906ce3b9b024d2ae7eeb4f751e46877b79ef6c540d215de5645e5d0af0067d0423e1788d408e2b08826d3865e4f95b38a5353f8b33e5cc2322ea3bb3e8ec92aac956bdd39fd04132775532af526b08d16f769819f355917d4d93dcf56634609168b791549e2f85f48a31f6c1b2a92667570c05fece9371ea93bfa1bce4b1ed03a9dd09ca5c0f3cc26d10387c92e4f4be43a568d6726c03caf2f040c9d718525e78739e5d6fed57da513272f8455b7ff4f3f14c2d218b7e62ec3fe525ce05119516f068e19bc7746d734cb993c0e3d30a452679843e9723d971851352b025a285a8f5396ec68162505a6fb41bc5b10cdd97bc0e735f63aaeed436b36d1c4d514a04fc31fce3e42565999c56d4d38f513369b3e16c9e2ece3289bc34f6d2e934ed5a299aa9351ddf98f3a12b917ae3ac5e0261970f6b37a07ee2c47970c27d1916bfdfdaf13ac0a35da3c9ebb530b2bff051c3a214af78a44fc0f5b7afa5ea713587badd7428e1767f89339f450fb37d01d15db6d8ce62c36873bf88f5531db858c8c5bb67c66e42494cef13607b080704d1e37b497201da0ce192cd9883b1d3400e8a2cc9a565af12d86ab4bee2c643e4079db072ced25a250674c37dc1b2878a7d179587b8f211e810ac4e87bb06880e2a3b984ffbdbcbd32609cb65939d8a44b8762140b7691daeb3de27b70b5a96e2df9b89473a4ade97eb3fdc48a9f7df5522e5525ac715959e76218af6ab3e75ceaaf2b56c5bb18295b90083cf340bc696a04c6f820a331e77bf62c1949024ec070e754000c0aefa4d3250a80f8643271dab69bf547fb64f261d404767c264a290e87fd91f98a485865913e63061da65335eb6411b7fc37edfd4f6f87dba158104673d4e5e8cfbdf83f087626988b24462dfd4533dcb676eef95bb0a1a7d5dd69b3771ce49ebf05539feaf0ce0a31484dfca27334b2a00b4f12ea0885adffbac3d6f49885923d7531e397d96eb5190c894e9b94c3bfb92659f294b635076d58d3ab9a32c0fe6cf1d0cf9eade29dc8a1e219b09334d62f4640a4f0c2eae0db9045b2b9197e84a228a5564ce25e0fd606762dad168d7efa711d77d32fdb07038c197d74bb8346a181c7775de2c56295b9f51225ab10fa6ace0b5391e435894759a687c0e8b9864b476f45afa257694a8b5daa12dd5340a7607e0c60da310d61d5fbcc5a5d596812aa8aa56a97f3abd7d685fa42e8e290e7373652f7cc028c71a4a1dfd8b062fe64cf100dc06dc301148bb50d68347cda1525054adb3df9bb2e36963719c2ce75ba02a0402f560311cb3e17ceb8e6636566a7ba670dba15ad5ede548fe3597f621f233d8512700b39e75a634d12a8ef370eeeb9206232c608d9aaa7abc32f444657834f302b5134e57672c03c723dc848b2d52c3c5d1beadb302cb24398dcf10e670f24fd381a5468a901cd771e909403a12f9f648d8fabdb6ad2793024a6ae95a6cba310a3aa80119b1c911b86870e02e8b4e2b3465ff7c8f444030b99570032b55a0e34b69383c219ed9a89f7a29c0b5d681ae58644707ab8ab115197b5206b515d1da50c09b82b1d36c3c6255f2cfb4126f3bda6f02b8158233cd41c00a36ec4004daefa9fd638c00de4264434d1b68eae0adfe2178ad037618e4a0d12b894ab59853e2ba8b88aceeed26fae64bcd227a6a1d57b94af59a43921a5c8545a07b44f2cce468cd5588eacaf9c9d6d0aab4f2d4609df2cf17c1ab634ae81595b35505fbef37f48e77edfcf31c14984b0d", "65525165ac65", 0, -58251772, "e73fdef47e42973d75c6e273a1e9d55333355b0e4e407dce1e3cb6d2e635632b"], - ["32db6f04020eae73a8510b203720d0e827b5093ea5f1ecc95d8914e85b8c9b4644d7209a4f0200000000ffffffff5174c13a2bfa5e1fd7956bdfa7a3b1a21cfcd29fccc26c7333cb5a80f1dea56c0300000009ac510065656aacacacef20c5040242bfea0500000000085265006a52516a652c47f10400000000045253656ae1ba05bb03575a0101000000000000000000000000d1fc676fd51e6242ae5075882d26aaa374df6b3067b49118fbe1dacaafd582e0d0b50ceda40de1664c7c71cc34342a35012a9859aa688ee911bc3d36d7408dbd6d89741028aaf92eb5df11a3fe24c2505b5a7cc60c6358d0c604ff5e9ae387cf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000faf853c93ec8d04f6bb6475d305d2e3ffa5775f084d8c88d5bf85ebb45b638655bdcb8faf6627afde8c2bc80ee131affe8c4a95b8d72445979f836c4dda5c2b5fb4b7ce4a192c35481c9a8346b489527cc61dc3d48faba86c8ad2b53d372044c7f5e11fe2681283cb383f73dc4e4cbb2344cd05dee68fc02c7cfb7a495723a3702174c09f9fcfe8cb49eb6149daff6d452a940f49244910d6f6d203cff05f4ba6802007565274f60d43422c2c7320ed5a546a93fbd873deb859fd1ba703b3b1dba060a059170e961b197f69e43028186af37ec1082948c644006d5088c8e90200642632ebf0081077ad5ca8b249b5eb6f8c06cb8088776568c3dfcb9e4df4356d2eabb0207c7236ebfdc1565deaa3c84252d3549da0a9d87a27eca13c7322b92f2e1700b020a60d200103e4c96bc42bd30e2e0a5bbdf2fc4329c55aef5bd58bb2aa21c3476020dcc053311b18b99ff1fbbeb2c14dcfceea965ba556cb33f7176f04a397990bb0201591d1f7db7e84cfa176fbc1df717a641ddcfff493d0c2830af4789ee4110fa0216735975e5e7997597a66d3dfeb2730481d31a1161212223cb3f50acd3904c5565c244424d906da7199f30f3ea8d8acf6e7eeb376be932950085d79e604d898e7c1afce2372e0c0d18d539fdb8e47c83c7ce15e128cb4f509008caa1d0cadd710438e51febc2f048c9519bc28f3796de1e72a985c17aec93ce1d4ac118919d6a7449acc1a12d997c4d5c3d2c0364e172b08192331980df1b5f4d7a74ffb9b8a969f43a54ad85fac220eb8e7e9a4c94f23ccab82eff2d78d0efb1df1d3153c1890f54be29758c45d8ddee9bae13c549706f0a3c50dabe575e0f51ef9e0908e630d42f1df3311621dd8c037d1e73b00036cdcb0ba3701136da7e66a9c6f3e61e370ecd828b43ba25922d2060c90c21082347667709c3f84946d154cc7e0493f030e2284fa770669b36dbc60c72bf86bb56822c85c6be5312b46d9b4d24046116707afafc8797b54d2cf260a374d57598f39cd605681868d49af8a031bdb6c13f604a7844c61e6708b6695e554e099523cb0fcb255cf3479694b80b8a64fd4c523678f1c269aee9b4d3cc7ca9438faeba58efbb1eb7a81136c5938d6a276b63b079216d98761ef264893051d92c495971439b6a09e7d2bc96c1ffd7d1f755b9ce7bf5d84640d8f914ae0b92ccb1a4b8867820cf161df7c092eb06a7af8901eb095864e5bb6b96e19f956ac56d27ff2d207cb9941b0be97a7c7bf68557fb163bf27d34999c1f2203a5c1f8f8bbea481d3d606f525556b33d10b684df6a6a26bd94c64a032f457346a4cf9e3fea10e087079ecad9707805974719b3a4d4cce92d864b54799effb973c93d3c6f38f46290fdd5b6a831cf51605e1c436e38fbc5cd471f6348572533a966611c18b70ff24ce958bcee245d0116a5c065853dac688a3c6802bed411bd1e59bc5ac3514a65822890691bf98a1dbfdf30984c78b6d026e65ce1ff3f492c1b6c5b488b8c54f417c501e6cdec41b78a3187bc1d956cb49a3e24515a2471d1612d64864f2e099da64eef9b254a9b0894562364208d708a417bdbcc39edb0f9a2af38f989f477cfc4b0dc0da8d26dc8fae8f4ebda50f3970c7f341a71510e5505cb28a362c1eb55b6f2fd51c4a8f0d464f2c3c204dc1a39f0240dbc7af15d0e68c7be0ba6403f8ce51ec5e2802c004f1f572b9c6c0093537f6343c4dea572b99df729a16a7a855a1f2ad120597e4a62cd3f2e0c096471df929e487efcb72b2162b69f79ba0953f342389661f7ba8ee81850a0b1325ac187092149979f3873b26a7f76276382d275ae4f1133b17f82769fd795086fd741383ad051716135550f029e803a6219d637618e92aa585e2f8ec96885086c9bde2437ab6a83ab44810897e54c4588289a84a22774c6cfba7765a6bcd57f97f92189d3e87f06968d1f7b61c5f70e4be23e01438bae2a27a4abfb0610e8811a8bd62be5f61e7b84b6fd39adc68680cd0669149431a550565a54e13c30fb28f987d6d98ac9944001897a942ecc44ae728fab5afa1bd7be6c8a2394aaf850b4c12e2ead25c28743e5c6879360b4709ec57fb5dba5122e83b791e4b58e82f3706bb3932751d48e711a26c669d8715f860ec587379b0f03be5c288f18b0f2ab975a880077e2e6acfb29f686845fe935dd3714daae0986327fe1276b60dbdd7e0ea758589d5be23ff412c578884854279eae9cec248f1f3e6497028df0a48a284a4da0a3f2ec1b7721050b4b1f0ca04db3a667e3cd6df50ff4a623832504000000000000000000000000e5a239705a92c5f78d5bad35c0a39cd63022c4183d2fc266ada2f4208d3a59187be3db47f67814b70b29aebdf2723561fc37068fef6ca0ee220055b538dedb4e0cd21d62e7d9e48e20ea65d6ac040e5ff5a7b9ee32a4bdb2e2a58eca650bc6b200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1cffb8dde583d082ea4b4906a0f3945dc2c38632e7de8a1cfb949c0530bb937bfbb7030a30c71651e5d9a42d5dce840c289e5ece4790b27d2a3b0f24f731a759edc69be547126d839cc08148aad677cee25bd0eb6a4c821b45cf14ee14be9226f32f9b38dcd3a58597f8491b02352d10026c74f7804caf3fadea0f07010dcbc032e15d431227209840d6ea08329630062456cc62b084a7b7ae9539ac917a674c30318cd23aa7fa4e709ebfa5baa4c41ce13c1963d2220dae7dede65cc1b1120ea3d0a088baa9b5c983db76bd4bc261a62522c0001de81d938c89382dc4fa0c82ff0d1012ae929a31967b167c4df0e215918c5d0a41950f71e79fb1fc5c091c68759af0314f27738a6c97dc07a092f267845c0401e331a554b8bd90d5c9e548409942073031671d6119006b14871246f02d05e63c5e7e3823a03d3247524c9340f3214228a0209b09b0e044a50517fbc92c7be0968617c979effaa6e3f97e117a135bf2a017b020d9c7a8d69a24c491b1ff9df898119347bf36259df5a355575553d3da4ea7ed30222b4a6634a2793edebda173e4e24b3e46336db08f7d7dcba4cbb8c55f7bbe6a2cdc53566086e8ac04ece5d870dccb484b18b58cc0eb80468e31aa63f5b08551b25e19de07fef32c8c5c3a0b44d8d53d79eb2640819583ce1c19af0dcf0002494724e20fbc8c30c88024a55061c8df93e826ba50bedc51a96af22c7d83be37ab8a3c17d8bab938392b89208b8841250255eb1ef030251e1ac7a2a50c3490a10f15ad32e2db20c3b504e307647a798e66ffcb4d075109886760f212312df3bf7993e66daba1603b0eddd5949465467542d266876af11cb0c345767852b3284786e9060516f88bbe09fcbc16ac72ac24e6e598f6c86e5c3f6dc1487d354644e9973b8da886ce1763c477ee9f6cce569359ba795c06f6b4b5952b03dc480fdb4e3dff60de9227a3d1ba50ea87c1d6a85bb994b2de10e27805c5b2505938625db7d218a3e9b76477b7976c56262ee6debed5ec704a0dbab48227ec4af9cccb52694a7297fce3dde38d377730c25034581d81f58a996297a431243484b2d276c43f110e6a5316ee2e43709a852e82d8e9c9f2d7b2634d1f3bcf9a61512d0c37d127df3beadcb8aa9e1c89d61ad75d81190a862473f5a5957a0bd75f3cc5f0b7fc300d452446b0f1c9b533dfb913be04d746f0c83efc4fb0a9072f99908f58381e38283de2ad1d866853ac15b97fa305cb65538adf4b98626e7d1ea6fc27deb23d02ca815aff2d4eb7e32360ccefeb4cd450cc753f09e8ebe292f2669ff2bd6de277a863c68cd19faebcc1d44d6a64bf1040865f2a9bbfa73e5ddc377225ae5ddb7286c798b0c252e46e3376cc209cc63aa068be1be9b62dced60b904d37178b11ad6eedfb69ee682d082d29b8a1f81380e4336231e4687b7a363485125ba627252067d01545fabcbd870161553d0cd0421dfeb70140015e98f97467a9a9666c81c671b79e41520ecab88ad98651166b48bad0853dcab47b9bde70aad9434cccb21fe3e58248a2041645a92daeb7b0c4d346c76411184295a6abecf1d5b164e5a1be48830323d22324900ed4c87b44748f61838ae93948ab3a6695c00e4a06fb683d4aa4c4cb5180b81676f687e0f66369a0d00120254ee399f690f755d3edf2b7f1a97edbd33ae7d063d00c0e7eb934a2d873167bff3d1edb313eb00e23070ab40c24694d7a838823631ffcad27a3b7ee41980868715b6d6067c72fa647db954bb565c3f369c961e2d1f7a767feb985e59ed048e579a3aeddf73df039273ad17f5a12d9ec15a03d917acc4d8d74957bf336bfac90c637d5ccd93795366baeb9e9cdfd03aec209d50db3d9ce1ba851a3f85065f7f9661e3ffe73082f5f21163be32ed54b7ed14b5a4844381a26026acc66935501ca459c6f078e5bfc6dcbd7f9e9fc1aded9b786d3eb3405f1a01d642f12a8bb1e1784b5df7468104aa880fafa5073c5e8cd73bec4a8f409c566d3af0261ae38ea4f9089ab4ac6a65bc9e30ca834ff6bd72b14bdb80be3ce58ed7ae35b66b9e9a2db6fb395e1aefc44d0b0e095b3a4ebd00fa4a38c457df528884f787948562852b01ac495d8baa8992c2f908f4571d64882ca6b2deeadc2ef38b78618fc4eacd29e18a45c06a144e48f34f7d3713cdff6fbc77e0aaa2b1f8a6b16c7749c7f23da367c0d3f9b2aa99a68dbd4abcdcefe2bbab6814b79dd7221f4f9c28e149a9d5a8de0deb997c978662ea143e80f402370b2621fc158a68bf70faba28b55f8d2d80050000000000000000e059410100000000eaf734623e4af06e70320712dd739672d3a018e64f2dc675f019adf8b9261311f73c750916f17f563b3446f22598059f3e097c419461a65ecab42fa9f6be5ede3ba5762f1ac82e1346c5d0c704f1894f910a20c5026b0815b90eaa8a86f986d300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bc11e348d507efc9915a1566e9ada18603811c20d418b295f37cbfc1b3620aad41f72cc3d308eb3c363ab31c3dfba00dd6198657da3a5a9040e20ac4640075433ef715cd11c5dde0d35cd4611404f331d1012fd96f474ed5bc0b2f85f488ac25fee805fa152aa4641a056e7709057a11741054896bf60fb77761404978629437021b6c73bde600504047c9260331bb55317188f92fb9cf874865935b45151073c703300525da019a5b64a4da1f58f5340bf01bd328877055a6e46ed4e0d5c45609360b05642d0c84427af9d3af56d66cc910622619a1030d8770ec2774ab7b55197ceefef996ee09b2512a07e21ee11fa29d5d3631580087c3de79f3488c7ca9f816ce0204d55ce06a7d362072a5b62fa6f543742dca7382f746f719d4d06908d04e519a0226cae0547b83b2d55f11fe9bf66ddbe08ed6dc86caa6b74d73b9df460f89357d0319526d2d07b6d899971883f6d04a91895f9837af606daa0e271fa97cdb829e2f021189dd36d9ba649f9ba6c45fd42a6fb39091e8b1c038701db971e5bed098e0b20317235d25986890315222dd9dff3b02a244fe98d6e1a9c8e4b6a698fc7f4f08929bc74d5dd337659e739a73e3b0589a2c0bd62727a658356cb04fb1ebbe587cd98e1d27b9c6cb8e929dc4a6aeda811ae413690391b261f2d455c57ea940b4c1cc74fb336d38bbfa8902bbcc4f3c4d01d653b044ad0922f0601e01b3d6319b1e01bf4c86f9a8665e5126160116a26550b97d8e13f0535fd33f96aa4fd0fbbbc6f06cca386eb83882d67b2798a0f5807e6ec52e9d45572f5258267d736f749fbf7b530ab4c88bb5b061ee1d8dec31e72be9bfd0abff5b64f885d43d751279abc525d4feecf5b96781d6f84d7d566e64a20cea479b70146a949dc92e5395fc06688709d99087b44cd3154cd38f426bf989d5960eff5d5300e51959efa212b8766b11fd8d5df1f47fcbd415cd10f7438dbb67eb13b8d4efbd7e1aa6baa9aedfba2250d66b0494df20cc94b85d16189b881bf3f0e85a450ac5d1c67e8042e7743f72a8217f80a15791aadf56e5085a941f3cdd4e700cb632d647744c201dcf1adce54b1f4e9da50cd415586a4b8cbf9c9858efe70b38259bb8253434c12e6b49ce69159b9b427f9ffe7242f2d0bfb0e0b5e6c4a78d7f13cc38b99c0c3eaf77954120abf0ab1731d2a619527094d1c9f96f8bd754cb936730d0f4e8f344633f450b4544b6166035e96704064685df3fc50e745538a7284570e5e4ab7ee4297b644c14c990145f27d4d99d78be7b831e2ba738cb1ee3e906a6ac56d4d928e865ea6d04b588ec77dfcfc3b82d4d65896221f53e7f10846f9e697342e0f6351e635c1e6cfdbee32273157c70b0eaedfb73463a50c930ef68d701603f88be8a33abc391b5d6fff6b075ef16927666bc3438e66a109d1172a71725fd70a05fc3033b04da3d82478f2fbfa7bc3491c0b053ca52918dc22b31d735d9914f99b23c7b2b58a91fd0013877f4bb6cb1ca2654f7dffb76f4af75ce5066c29972fc05169556834e48eb523da7de37d0a5f049fe549ad1f5cbebf4627934811a338bd847c5bd7315640bbfcd38fabdd8f83e24708f290cf216687d09a249371e57350063df208f7540706313ec2a52dc4a2e0a74c1f097d61fcb2fcbe527a279885d77a9b5c06284663004afafec7643356ac683d8a0248bf09188d33fc018d99d529e894da276344b941871d5c4dd5413463659033bb47f9741c15c2f43d0802e1784f9cccd7197dd7ad3c8f0c51e4f9dd94e9ab5a9f12ae61484154bfa32dd418c741afadc95474db2c86b111b0776107f595607edfc291ea5b83f842c7af559140c1d25f02456fa92876b1f4f889f0d341341fc353dd1d9fc9f8cf32182135f09eac4b54ee39539b1d55adab24cf5f649117e47fb0eb41233455635c27f812acf406a9dda88790ff9fc9236a008b8410a8b1f63ede5b52d084762a77ee9397ed49c0c2d1265f3800fcdee39836599c4bfa9f9077b750066b741bb396c3ad8d8427ffeadd3e552f95c8fac9859569fb4e311fdfdb003b6aed8f8d22ad7fdf526afa278047a8941bd8e9aeb50a407ebfbd29496f656de5c63417ffd01437bd5ec85740b1304d02874e7eb0befa2fa488a968516d65c64b6272b486edb64d3534091edf480ed7959fca0b5e7b3f8177e46396966839d27103c065e516c2d074b34a4b45c806827e1004fd2ad219263be6ecabe56d8ca3e39687d5a7e3dd9830c3d3e07f60166d21a59468684b7282242a2bfee111908e3d39ff7464da2a84fc3ebe703581f78bbaa823ee755b98684356af91656be6fbcdd8199fba24019ab08406a81f4eafe752bf375113b32eeff0722f129cdd783dad082dfdf0e9c4096f087e15a3dae5ccfd7f27c6c4d5438252d67531b78a254e58004ab5d0f", "00006353", 0, 1002542895, "99b3e76d24e9ab08fc13d88e9440506e49c65b8dad11226f0f0411209251c707"], - ["2545751e0165ecd7d67efa9e38274bb132aabee22b79a42e757d02c18f04e9cde243a1ea9c03000000075265516a656553ffffffff03745d74010000000007006352650000652f496002000000000451535163a4fdee0500000000076500ac0053525160ace37400", "5165", 0, 1960340943, "98ff05d233f56c7a01587d45104f35ab72b49a48c7e2ca5c9d109f26d1bd7125"], - ["f081660f0322765b474955cd38901fb2327c6613fb45908f3dfe90f980830f71831539f973030000000765ac6aac5100654467e964949a8faa58d8a452c1de4392e3db2154ea9e04bbafb2347e5b701207eb9fd32a0000000000ffffffffa82ddf66ce0314369f616099860034eae7021808d0947f4c8b7f0ca609ac3625020000000800006551536a0053ffffffff02a14d3b0000000000096a525265530000656a155fa800000000000451ac63514d59d5040200000000000000004c841105000000003586436d0c5c07a2195b163156abc3ccfcef787b06d0a41548c3907a1a4cda3ace4de16a634919dd044026e0fd998cff2f99a3abfb12f36af3372f2b57897233b0a37b6e114644093fdee60150229c8a0bab44e67a67df0a78a50f610717472f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003980f131c7900ac1ecec7bb569c3c7c9e610bc88850b8cf3607aeb3acf9eeef2752c28adb4fd65a496579c8fbe4bb47fa75b9af23b4615a84fdef3ba6bd1ff6fd77bc6a9427a8218ad1d7e7ef9f664a8935edd287db4507e257706be2133e6ada18c87d522a1110651c78dd5fb7b1caac24396cae4f7669fd5ae07b93e4cdb1021f16774c7af8a3fc55fb986f2e166a88c39764b2f673ff4f039e293ab0f1905e020148970026589a48554c577881341a35e04e4bf135edc46f0e95a9ab8879634a0b08938b72429f6771900f9e05f2f0e81083430343002928654e08309a70473fe409976e301c3d21641b5339fd0bca625768608308c90f25986a9bd353d1794abf03002d9a3ffd5c79ad6a4bec007b88669720367bdab12cce204ecc5947c1617d170328b9793dfc31c3ac58dff0bbbc3826883f6b2e37ee2f1f6591bf0b18b3bda7290202716588608eed6c23735a1725537e1b338a8370006ecf20693b48ac31c81541031c71869f92081cdf84dc2ff125024feb39a4f190ef623fe88118354b6d41876e03149ce9c87265edea44205e7f102ef700cfbb7f612c636371f6a27e9bf7a7ae01f4cc01867952e4e3d61146f0565b87abf460de1e69ce8d0201a7f9349445c6db1c93ae0eecdf1a084d1988268d76301ef8253e7af06ea3475c3fbe9b338f5ed1841a2d3d0d558e5f6329a3ca00db57156efb74d9c4e9ed5aef159ea2ae4bd3a863f02b1075d3898a5f849502769225d00610472bfb2d22e352d410c06d1d45b140df8a0023c47c5c9af988de57ffd35944b7a89f9fa2a3cc8b7f34a78b10ed2a03bc9e8eaecc0fbdeaade79f7cf5f994d353b13540390f431362e250b5fcea91c1d30a64e44182e7a1f3a814795fdd15139a1da2a1469d0658a0cae6d0ef164e8e1256e83d7571901419fe2d24d3499c7119abeeb6de71a75ef97c7a046c26a9dd8fa97ec60140a76ff664f7c4f3cfab3c9dac88e1af9e4bc17211852484bf5393d0c584f0947e7cd0d51e59010baa7a0527ef451ce483328d26b93df4b99933a67772f0b7c357f8339bcc10bc386d510d45c4c0021dd22ce7797ea866ea8d0c6451148768668254d5f1897e1dcc436e54301a6ba96ba51acb06e8418b7e6c5b8f26767ff212acc4cdee3e1c223c948591e05dc1a2c04a5d90a3f40a03719d6e73cb9ba57c962876867270bb444f831c6bd9b03ef81f1b15c91d31b03a65ffa19583bcf7bfea9c16ad985f681ffe78e53971449dd384f586389d664fd5251538fe7e3c9f38f347876dd19aabbdf3500346d8d95086d48790ef1fa4fce825e33d6bc85b5008d5025716a30a36a38f776bc0d19e3bebffcaefd8295ed4ea718e9b930c888ad742571bad49a09ab3a2382bb8eb84e5733ef66815b2ccaa8e98aa214a4aeba5e8b0cbae6d11bfa5f26594b8cc3bd532e57a6c77a76793965c92fbb02409592af3fb8c502c539eeb53baa45d307303fa52c032eaf06a6527d899593436708c0120b3cf20b0c5524bba56058902f4666ae2dc88540e5dddb9380362796839f996aaf540c8c4735c367087f265e9922ec56a9a442e7d9be776da50c2a7ca8cb3827821f77ae467079dd0e666a943ec86edf8b7e9f60b17e6c1e9c8028ad27f64252bdc4d8a8301255b996cc783ee0ef4bcc376346685dd790e9ba8987d10fef0b31dea68cfc997c92c9823534d318ed361f75815093f1f013cec27570047f18af6b06fa8374a3960b9e4e0a7ca6ed59b87188ed671b0e2142c908b5e36064f2203aa0ad2d71334360bf4bd9863bbeec9ab1e429ab0565eba280efa52512bfec46d3963de729723fc221d90b8d4840ca01ee43a6a016c7d3a3dab33865b65c1c55fa285b5bb0626f8b46aa324d21ffe77857860af8c2b1f8e92aa4eef81484be6a2a5a8c25550f1d9f1c537f76f2b93aaf7961d81d3ad49f00fb2d85e251a13cb758ac823550f0d8708f03ac3360e6889961e7dfb79e00b1025c559c8e53c2cf9d62b42d223214cb53046702888a9b32c8b606c3b7defa9eb95576d3901a9d0a49634fd80213ac9a4a13822ec1e694c6e0af7c9e18260dd8b174e32e4485a179b45812ab44543d99ca919e863b44327ff476a20aeddd2f7e8ed888603f252db212347d6872f223000507904903002b8dc00f2a51dac6799ed70139e6c8b51510e18c13038d55305a5783691bbbab50a9e4b81a73141143db26083b692166ad3904469a51719fb1dfc46db0d1d7aeb0279ac689432696366c782ac3bc7ec3fc0a407220ae464b1f18b944ec7dee53c41000000000000000052bd0e030000000083ed79c1d28449f507f9bf01125955aa7e8b3a6a050eb8f190ae0ebcb28488324e100bbb13b58f2c759c2e7a1bddc3d0e34bb59e78cb263f482ff4420fbd33e68643efa2782c10a4b0d11f76dfe6e43c1439682756030f2d65481d25a9d35279000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005baf3834c0243357a98636cf933fde2d5638a950a62ddc79e78209144f74523ac37cd6f4f3c67cdd68f3b0b5ec2b32f8579d7d0a033a3d7852dd63a51610db1ef7ede9b87a362c28f1e6e505fd08174441c4b8dce12be62bb19f466a6dcacbce0d2468f688c8841d71781b426d95a370511f7c085cac5c8cf147d9840be7e5a303013c6bce7653b5388e23c65c6f9fbb8d30bb75e58ff31f99e8a5970364daf40e020ec2cbb211065deba9a12c0f3efe5003d2130d23cec8d9d9d8d9774b633553300b076dbf9d76b03a0b4ca6bef8e1a0a7c123a22d59fc115ae3fee83e2c02aa76814548bc9b83652343dcafe18791a5718f34b81b8059b0e21ac0e568ef713d7c8d032019a3634b7e7c1a5a7d7deaab737e253a3176938edc5f1d3ca9eefc32a2b09802264fe0ffe23f40bf099797a31a62269cc6af4f494c03d23334bf0f87bd84a62d0225be6954e62e74e857054ae34ab7d27bc7843c0a6321bd17d4ac7cb56ee199b10221bbe9ed9555122be13e398cd3ece3ee4d95d972a10f5e21a3249c9a2c86bf5602200318eb6db8363bfe07bce2c7b20929699b23e54e39c154e0497d95a89759e0984b66664ac4a62477c140eebba9424f65e3319654ec3119ca030d6e1db53828055fe40833dca5d4002d6b177878e0c13713d736f23350cf4620766bab94b42f0d085ebb25efd9206375328e5b84c8f73514d08d3fa629cf32a1842cc25845773a184ad48a50d68471a6c9fec6b6eaa5a9a1454441d7a9a810e9b68fc553db1b718d811e9d773fa07c9e4f6626b6b17ad2b1476b717c70d0f8a3e6e3ce8c9275772f410504fa5aa564d1ff0b7ad15b0220494357a19b8586d1f91f03e939c0f12a061bf3428eb8f2071cf5c641cb8a29ed9ea7a916edc83171b0bbf919ba2635c52467deedcacf6e9289292ed2afc227c44c5522908e04574f11566390afd21b4ed8149bd2768d2a197d67a1eb40583c85ef51720ab8b4ce1a90eba8e608e0492c661d029cbb0cfe580dce9b96003f4db95cd4a4b590caf12c6d2517b5ebe6eb492114b5690c6fdc7a38aa020291c209f4c182b36175e73db6cca9c2e20d67745387b86b807936e4d4e88767d7f132c05c574fa90a58ccb94c709cc928f1d9aa2174bfacdd7b8b7461de81c277b24ca9db6cf36da12a42222d313c0e41ed1836aa4ab8c996f505305a113db9e812dd8f427e180e9d2826d245fba638ca108d9b47fd1ed240f0d5bce9665c55d587f2c33d0e781179fd7deaabbdc3e9139f8c0ccbe736b2e1f32547d3cf79b1526d2460c75fda999a108c5d0e9534cecad5bb415dbc3766f2cb0526eebdb210c0c1af92db5989dcb97d4ab2827e959c476067e31dfc4b0aa4706bcc3e3ada98dd9aea391fadea73cebeb809039f9db216bd9ecff01abb206a3fd5bedccb782ad2a61569c59a7a9f9fc9c3ad92ad1e8fbfd91863a813f66bb2299af05f640f1bafd0055c2c99cdf91b4af6fb1f6b4ca0a44436147bf97dd9be09ff6421bbb434d8b26af89dd3a99847131168c355b33096e909faa4b3a1972d46b2c7a4cdd994f1ca168b9bdc6d8295cbd6d14ab295af4a7ad00703d651348e6fa95df6c9546a2f9c2f2a132606cf200c5cc42e7b022b1ed3e1adbd4d6af6603f137d356ef70275677032749d174376ee24638a3c9cdc20ffc73b48d1fdb9d07e07fd8f1c5041a151237de9c819ce35b6380adabcc25c93b7ba0f77e6beefe996428833de8a9c71dc90bde4914478bb589ab07c589f64447317c951abc474db1651e1511beabadfc76c84d6194bf746ed6e585338f3d27ca09413e68d4af2f54421e0b501d33f5931bf58f8f2599250cb71ee955f1ae142761c89c1dee9dbe1b31e794d3d3b848e70511dc4fd850906bf06886eb84a41024c80cff2eb342bace843f6fa66da252420a5e45e65fa4b44631070b6a5b2613832e7527f719d0b63365f1a24d874ec5704002966ee060fe2daacb9ff0958e2c8b0cf4d08df6ec28ae461add932440afac4d73b1722a08e0163f697672a4ee106aca0cfe67cd565f05146ebe0aea342197af27517505f3c2fc81efced594d8d8bdacfe6810f65fccb16dfd1fc2ef60fcf38e7a21539f2f567d766bfe4193556ea04da379fc2fe62d5dfea7e3798462962b998c7412ac97e06fd5cbc2a7c6bc9122b89dbd12acb2eda00d095ef911797da94c5a78b206bb20681de13101142633fe90c2170f535796aba345ddbf7fe377ae5c900425dc6d4616f7e3fb64d0eaeeedbc2611f6f8b06348848298f9b7cc8d545882bd66cfab9952c9e75a47435424645854d5d2fe89c46abb72cef8b4ee48200cff2be8689a1588f53a1b08d71a1d0f9c40d107dd75a0d49f62ebc8654a9c8dfe062808a3e5982a37eb74e997815ba00c3167fe9d93fc4431f2133edc66c230f3db4d808", "00acac52ac", 1, 1412673965, "579e9a4be24babc7fb3fe80a094600a24eb90875091efbe346d28f64d43577fd"], - ["60346b5d0435ae943b32658ce045de1b2cc87e6d2840b66ebec18552349ceda054feff116f02000000046565655205dc3fe9618826ec1291cfa0afc5f0dec74fbb24f89feba363c370377544be45e350046100000000056aac52ac52ffffffffe2bb0920dd6b05b2e3981bf31662610ca7906efd0e0843c385e3d496c4ba1541000000000153d6850cd92625ab3adaa48b10b6a95f5eb16edf214373735c6578400bef9f48ed83b0408f01000000025251ea8ea6b003f41a43010000000000b3d1c301000000000952655363ac005200ac8f534c050000000001ac6488da2500", "", 0, -646752724, "a53ad87cba8abeb052776b7ee9741c2558f3a3bc2478bae5dd4c7ea213205c9a"], - ["030000807082c403039d361d0ca0ce45d678e3221c0be555928074fc6e5aedee3c7b0ab26da42f0d3700000000066a5263515351ffffffff060bec891d2e8c6b2d036bfed370cd01f287c77f0439a36def4a976798db68590000000009ac005265ac6a526a00c1d20191a3768e509ea9ef4ab1e6efe852e2413de38c0e15f52a5eab3d1b9b91278304b602000000070063656353536affffffff04d0e243040000000000de08f3000000000003520063ed56a10200000000046a655253fee08a0000000000086a6a5100ac65005200000000000000000391e0210300000000000000000000000098a42b4385fb47ebe49edfafb5d1db7894e5c7d3cc47b0c5ed3abe398d44d0fbfa2b5d6ec782814f13c0d63a1f05361b66d1be25846d7aaacc65f6ca5b3ee61425e2c143a7269f8eb315b4137fb9d6f604bd5eb68c82b046a86cd14035805d26000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004112db150c58d035569f8c5c3deb8c018553f608792bcf543eb8eebb3ba43b2820c4a1f479ede1bb990cd13c03732486663b04e7b10b8f8a4aab23658ab89738b00f4ba6b528b6b61da5cfc9d59c560ee5d4d933abf77078398c004501d8e13b33744813743c8b5f9aa5a3d3dc842625de5c15102421ea3161a5034e6b311411020133886041c5ae9e9d4b9eb499f8d486d3e7408ad621557247c70fa11fcf366c0204ed7f37a1b62330fb7a13f6fa26a21b93ad882cb1130f6cbe1ae31aef6979af0a01a29d01eb9f64ceb21e4f1bb77322148d9b752624a163b347adaeb3b421125794d399817da4b5483d2b76ace68da9e3aac213eb74754dfd9e2b16c330046241032e22b9a2c4dcfef641c8396462d805b702a0dbc28db43aa4fe6a1edf9c850009022bcd594d8ce407bad7e8f79da62f99399901806433123c4ffcbe5849b4f26c82021537045228fd4cbdab35d2a13bfbff0489871d763204febaea389cd59dfa7101020380543e26fb666f9e8eea7688061d6eb4c42737cd37fddae7b87efdf7c930be021c78574d42911e821b940b9681b28020be977b8f8b26d6f707af55d5a0b54cb7692764ba9832ed1392083023f447f2b295c6f14ff5dc88bffd8e03eee112b021f193b571084b8fa0b511531d4bd4bb10a0abc5066c461f6388f134f5ab63aed782e460c57521366468ca7b29564780d83d8fe9e1122f75ebb5a4a66ae30287c1864de7f3e598ee7ed7510c6daa34bb1d035c88bf52d66f79ff10f03f1f41f1637238cd29cf1bb0114cb5dde5a603974dad8b0b5c9aaec4200cd7d469e087864c7b7d56fbae9cafc7570d0c31a1a51ae3b67cbd5d1c96b14cf483480bb6afdd05267c0f7ecffc09db3b857b94a1263f2c7ccc38d0e96df3eec45502b8c3ca4bf08d2587d2674bbacf02aa6c70c4ad8f2bfa8ad573362b40d9b56b64d7e842e6d9287c0e22c1908b9930bbc948a14f50171fc324333960325a50aa646d2ecb2d96ecac32602eac51e58877272ea50f28bf935cc830311a67d22315512adab94c3d0260cbfd2c8ba443bb508a53665601644b47c1df58c8c7c2db0b8bdacfb380d92487e08ea2f021dae2c2d742e7e0f07f960ce645ebd0a01d2225243b81c7e654a4240eb85f29458a7dccf88dfea030720822d90baec5d05405832604fdac3921003cf63cad54b9e899886d3f728dc6982770f9c4d996a841224204c5fa261a546ee55055ea5b8f4467446f129d121f579261cb00d92476ddecaca57053f91c5736a623bb4b68b4745cbfa0c8eca7851d87fd0df6dbe0b205b3d95037b80ce703d53a7807efe032735661654a083bc550011ede43d34be438ebf9b30e1a751f2f1634e45dffc699257821e5c63a7079225bb275feeb956c8a3fb0ba04f7b68587b30f148d8243f09195902e1726d6e8cbc3141a3beee7789c1da632f651c8a91f38dd394eeceaebaa1f48c9a529e63c3d9499c2b91998e6cb85535671e1dd4d9387a202ce4907b97fc94851ddf833900b0e683a8b588609be9f51347448bd639a9d87ffba60d3958210f3ad9780a9e07fd34abb2980e0a38640224806e8b3e2c8cca5770be402f030e3c0239d59544a434d18def119ff0109ea64e3b785195c2894cefc19af0cb05b6ea54ec8eaa7cf8609504118b2da0beb704246e090fe6f4e638617a1151d02f220c53342409f08254a76a1902af67a48b45cfa5015f15b6f225c854c199037b1c04560e3169a3f741eb8558732ed916dac67bc2d66e6f7fb50b0f2d1a4c55e09e29f5abc5f719de5b2ddee0678d3ebeb789935c191528e7f81eb619ba9b9aad6f0ddbad21ced86439709ffbc5e0d0553a069fd3464c55aceed43197f6f4091adea112ffd902b6b129a07dc592b430710839e0ca87225b8f305d76a609ab45b47d769befbceb6f9a5b322c092da8387f7dd892071cecaa06ec181fa7305a92cf7136eacb48d9d617f661c36ff6612255b46d9514daa141a25fc6c1a0c894bf436096ce6adc7ff174197d1c4c6f6cbaa3545435a4b6e568fc1b832b3a4151e75f6bb23cca8bd7da2911b6cf743e48cd6432924fec9902418f9a4b56ce0af5c828164efe407f8fb80bcf48caca48a3358456c749a8ed5b672353024dfa1c1cd6e24a15f3b5190a9c4dfc18902c19dc3f0b2414a16490a529cfed58ba49e864446c357482990152b4e908df905569386d4dd387469eefc6dfd690d5c77288a2d8ea5907be0f7ebccd091bab511a3d88e5405d751610eb0b63294d47635bdb70eae6676a2fbbf6e88b6c6591885696f02000000000000000000000000403fb14501b486dd81aeff91b0b0e3c9c2370a63154702d288ca275a15708df7f1c72c1db7353c034d8b4e4a3cf4ab81c89d22cc4160474e02e29747c25a5fc39716c250499016d06f764b5f8baa7a4eba0ca25256b0c3db446fb3de01bf79dc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049584cb6d6a20a4b26862350b5f64237cf103b337c0fd4369a5a0c23dca7dd30c6120a4e9ecf00a29d645839a107dfcdc23782ff6cfff3231e59587792432a25a274f3ae0116589fdf5d889776f026d8e860846ff65845f78ce410b32e4100009074953c2c4b7aad543247503c524b7815af918f8d50cdd4f20b77abadc672660328d2c09428de6d378aae81e430ac5cc402b50cfc99612d6182b24f26636990ca0214d297ae16843696b97effb37af358e6d4e726699b28fddb98b428d8bd5c014b0b02ce02c2c48b84054d4d688efdb6b1e2bb109be4bd985dae302e57a1e3b05b55c3bcd127cfaebf7e442f880fd9b5510ee56429b8a7fb8081eae30ac19ad845d003095f052446e2f4e5d5d9b9102e6b101d8fbd0e4834d5f86db2d3fe5974b937030215154bf3d33851f01d000bae19e55589b80949a6b1b5042d79d5757a59720d53021c7328346a9b171614ce6612ce3eec79242ed886c9970f157d663d1efac1491703212457500831fb6b1dd3ac438a16ae12ea4b9221ef3549cdb1699a1a1851581f032513b1b674645b5538052156ca6ca3ab37c3a35fdf198af5271c12a80e88bb5ec929055f818257a47cada88805278328aadabf6480fe8ef205b911e1e3a4fc3d27b06da6ea8c8b69dc02627a76b9118078a2e2195a77b134efd45d1bf7ae25b22ccd5faab9fbf7598b6e640de3d07ebebd298cb3ae5ced0115ae4bbe1a430db0b34a4b578cc3e5dc33fcf08088120bed9089c2b1247e8fef5793d986c3f1082d902f4db6a9c19ad0b3159bd1b695a732611ce5f16baf8bb41f14a2ad8de327b6579457dd2ab7213eb98043b90cf88987092767f5c6e84b83b9e8c64f5cdcfed8cc3506ca4792ef5c2e562eb318f9e0023dd0022f0447988786c9b6aaf6fd4b232cc9ecfcdee917cffdfc1eea3457839957a991338855953050b12fe681b8e4451bb6e9c5140ec567a9b4a0c0c2aaa4f48a2195ae5747fcf93571ec7ec91b1ebb5e75f371843cf7e066bb25baff215d5740769a17072f48db4d182e1ca9bd651c49a41ac3111bb3f33a4907d89f5b7645a28e6baf213e88a1eed6ed7c94cff1565818b51770666b1ff20f98029080586ce0f77244feca7d55c53e47c2ec992feead59b3a0cbb8402371801aed77a70d1ef4f6a964f27d3579e0bf3e3aa01ddb93c07e71ae5d91b81dac41b127facb880dda11f3993ab1c0188243a5180a141bf8ee7e208f36fb9625b7b19ca992e1a64d696129ba3ed21ed4f565e31cc57fb6d0614c44402f9ca9a9f5bccd57292cfdf0e2e7775d0a223dca22135385fb9cc13d83a3acc3c08572da28aece2cac02f724f6e8865d8b6ab6e807f3f4d89b687cc1b44bb25654283a8a3bdc6c5aaa86642a6e0b39785991bca4efe1553a0503edcf6f4fb8fbddafc4680079872a9ed8a699c35983caf18831c11b6bf6719a4c4aca8fba1b02ed6866ff94b73e6bfd848a40b7b0aff0c96d574ad474607fedb5b6dd269b93e32b38a84f06c5726873f230bd97f6875ab6e98379306ce8d080f2e06a1cd323c41ba322e9061a458c4ac1d071c2f61626cf0f4aec3df2d686a64d25e312defa1fb5cee9253f5667a5ca902dffe71d58940e2f7107e2f07b7f010ff580c74f1d0e09a66b01fd2a0a3127ab1d776852e104984809f7d78aa3ab56b77a5138f368600a874abeb68fec1ba90e37e4f33e9d526ac210f348a0064098818dfb68063e076142506638aae5d014e7504fe6c326557a419fb6278f2d60313eb3ac67a7dcbb11c884e5e3a0a7d60a0bbd873914a95b90f36ac2544db8f7e389aa40e33e1d1e8c98b7eeb598c14d656f593485e7ad812cb796b842814f09d16362189d0650b193c4487b966dd03c914dca5faffe48df9e47f67894049a599eb3c5d1146d83513de152f1c67aec69bb95850a990ab6d652fb3234680b117431b855ad794143f6a69e3fc7108fce61a9605e999088f391e7da36b5dae2514b69c7b0a38d6d17f166df0c459f2894a83846ef563adb33bfe8687c756ce872bb0ed35643e5e959c6f94ed028dec9db7def6271557fde587e493c7137bc79d3ca7b2ccdbf4a6f06d49a4fc8048a5d5ea7dc61faefc00f2ce2af0df784551b6fd4594f8cd4d417deea67ad7cb74da7553441dea2db035b2790cac52ef035e721af96075c1ad79ce136ac32faf7bcd3791e5fc3043e1757b971ee7dd1fada40c9ad8fb8603fec01d40a47af9c22e50688ee77ae00c59abd38cc4ff0ac629e5433a7c36ffc5b77a32f7897f8608a1561272ef648beb45c0aa0b52a0100000000000000000000000048faa554f8b0b48a9112199acb93296e23138aa5bcca2d33cf896cce58f9c6f73534f452f864ab60608af8ed45561a8dd88ecdc837a228cb3afbe7000a74c742516519b4e15d237d919f415604f590b8d7c37efbf56840ba6d8fa5093b186cc7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b7b81826b4a7b6ff6f155a3d72c1c4ee314978b927a51e6e7be3facbfb1ecd3cccf52bd44ab695df84dff71133b294a162066d8212e46eb70b6210a9866cfa91cd459201723c40a69c1e52db1fde37f8e42d0d5e700d7490fe49f667e9b5564f654f8fa289570d029d73066eaa6e98f74d6ac2b7d1d830150efaaabc03a9a4b0303c2f33c3ebc1533a20b9bd4ef6f2566c4619f6dd705df341e399cb098b4d93d0229c76ec6cac33e76f0b402be8451e7ac843f94f534f1c5722eb64559cead8c400a05a7f86917575248aceeac2cbd29bf1e35e109adaa900881e59665b62684979febcd7b00f449b9423c59d0c576387966a81aeccb6d7c03863ee607f86f341320022e7d27b41e007a39cc38de755e785f8700c6008059562f2cf4b2c072ab1fd79f03108a8a1719e5ddd773f346aa4c1d3ec5fc31ef4ba51fdf3284972f79f312b079022b1ff6d67f3723536823a30334c295f6f546fc1d35ebbe6b59fa66150b2ce31f020e618ef4f5e2f4f682bae1310917c8362651f150f5f7f51343c55cef4000d72a0200bebd2d5959333228632d05566da28bdf059223d2d231874e78c2b40959a7804294891ba0d010a5e5c090ed4be6105210da9ff45e82f5add14b7eb96eff6cb0b7076a4273f9ebae33e3f180510102a99df9773d4bdace55462e4b692ebd3e9fc07aae437f23166b3d999bdcf17b6c79e39dcbbfe7e0b95b4dcb1558f1ea27ac03df265089789fa2b93ac977bcb610789effb20bc012c1470ed1e2adcfa100d9c9968001b81dd37c0428d888d219700590d7664a557261a1ca1de80819f67e0cc2fb8b8056ea50c312c3ee7a0bf1a12d513dc7ca0daa1e7c9d3d0d82699d86f51492ffd962e511fee057e1edd05e10fe4cf7e323630c39a76cf344c5ad7f0ad490222c291a730d8a1ed535246e826a5304f970e3d8bc83ee4dec15376d7bd0124723e657c0e69362c49cc2be0d048acad47030e87b0ee1ea776d21b5f091b431dff4b4aa6487b22d976cba02b4dcc290ddcc09dc4e54d0322bff2822908a5fb2c8d721bb7c7159b8f2d6a1a57df380dbfc0977e6b3af6db6ce1df57f1c9ef2343cd39f39e08cb27a95e5a66f797b4a4303b2c677ee01461ccf8fdfcbd717cb5ee4f8794eeeffd446d9387508f1c77f37032f7bf99033a9dd4e975ef7d7e6f1bd598b280fe611db71dee7c2b4fddc078513ef35d3ad7484ebe7f51c15552389a190a37d8d48a217c785ae671672f0bce0f46ec8573350b826a2dcb40d96c63362e1b02f5dd47d3d2ffe06914ee024fb82a075462dee8890844f693b135ef843f900c50d5668125091dcf5a0cb7376f976365fbacf7fdc19030210b2a43a1815e7daebf33669c35f4fd947a78a2741e84f7443b2facb7671f24a4befc1f168d2f43632f0e1a8509786833a8152bc04a42eab6ddb91ea72bfa984b0f1649e7487033628dd5601ee2a89f1678abb805cea9f707e128341054650e39531e3fba72683ff99f0c9176aa73e598224e334c39c1cf2de0cdc1aff36b3fafae13160f9c0106174242cb8dbe6d3bbb3bf577b4426c512e2737111850a30ce07f34a6b329cfa26040213dee8e140f252b36c602cc009bb6acb9c9582cfab3fefd3cef2955a30c6df537451f8051bd8ffd0dfebcf42ae8650e126f7fc2da27582526913f0cb36d5f2ce8c7d0d35dd77132706eefb77afdf2d09dcb7cd5c2b5a9b23c9c88318152747d6d9d459a33775e817fd399e09f7b8ecf1fd30bdba60a7d7f100edea739b4875b4fb70e95066c764c105820232959e811c171cd288034495f1f9b4279ea732e87b7de2437f510caf1b765484a147c3ff6d22dc8cd6c6931a41c5f39048974940f30cfc709cd2c2bf6beaa318b83b88db5c3db8d9a6ead11ded478957d0d41fe9268b8c09901ba79846cf77e1f6f75f72cd6e23c36830bbe2f695f89cb989c8f5b6745956d2f30f4c686435cae8066bf22f0bf39b0339b1478b239eb10e1da414c059d53dc3b4e71f921afa0e86a3494018ac68e1454429567276c7aa3cd3d972b6abeb18fefb32da77df9e3db458892056db4fa07c372493739e8f35aa1ad92103d266b9cb4f429f52e33ce965438444593220b030688a8817204574304b4ab65ec64e86daaa0fc9c0c71b121fa2307f91bdb4660575aee1ef37231a699bc0177a706ea5c0867e1a298e0e785f403a065390a42e23c76b3037d69557896a2ab28650d80738778350be0dcfcc40018ce72da3543fdbadecf16de4e289d53f8b26cbcae30078bcd3577c27fea9100a8546c8e12fba8ee6777352ffd43cdf89bc8f63a17eda49137b99256ede420db5498f64aa75ef83f500250cd4a94a2264e36e97bea28e12d27653758e9b73045095f1094038c7f0d51877320aa5cc8504ff732340a11bfa5be9e0e656eb8513fbbd0a", "ac52", 2, -452437318, "78d11296cfe45aa38180937b0a07c9edf8c14722974cca008b76577115f49a2d"], - ["030000807082c40302e6638c1828b5758f8853aef2cbf60eaf2cfab413e2f526ec2077439bb39d54ad0000000006526aac53ac63ffffffff4140e3d6dcb717d91513623020b9272d0dc73eb0acbc4ff6ae9e45e70bef31cd0000000005525351ac6a23a6931f03d4156b050000000008ac5300006aac636ab2b3a1030000000007ac6363515251001ea42a04000000000351ac6300000000000000000353c6710100000000000000000000000050779afa1f9f8d156a04451f6d7fa6c7a2efe5bda6c73cc625a0002e69c5d74c7454ae2d2387f51e18e1528aecf73cbdb6d3af8a4b1377f971227c168910538713200e2b9c674e9c10d08b29725e6a0816ad8ae4b87b47d3b73b4addecec5376000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a334b3aaa99708df5f62f5c41d419ab2ee6bde76b79d710d9247a270760c8662ecb8bff7ed79830a9ec55837d6476bfa97ce1e4265cf5d474b367bfd289219b7ad6adf5a706600929b1f7a13e9e805e5ef0566e4104bbf2c5f79b7099cffb97b4f95fcb2e2fc7b97101131a3414ee839f99128a9444e988456e3dc5c16e3bb4021cce506906a8b7fc5d65af7ed47b843b9269e0c2be88606315bfa6c55b2fb059021093e2f999bc548449f51934c15a1d28bfba273de98bb5d1cfe33ff2ccf86b990a03a3a0527d1ae174fd568a62e7cb949466cb8d26d8b4d61e39ef20424fce931fe0572e6c861b98da9936d9226ede3d6f1c303d54283b6e8ce3af196716aaf0d6022e20739fbdb8cbbf72e991a359ba033253a774924e6e31e9eac11c14b6a58fdd03149daef4c5cb5a0e90f34ea49a9ebae5ca7a7d10e53a1eb967e368be7d22da0802259c93c38b042a8c255b1957247a2a443642d9b77d20a7cabeb424d46036b6ed032ba8a0ef941c30b0124959b787c9671661d4baeddd99e90d67ada08c21d92d06032a65e88e24f1c5d6c54c12b1f0a109fdda101c4c25b19ec911750586ebea08a96fe2c350460b95ac788473074cc550fe5fcba722a826936bd1ab29d603a84cbad614e0d6ab296968a03d4f89c00c466988fa5d9d331f2fb00b62b85560f5933d9a5ff71531c5bc9c28c4a94499b2f0db93641f8ec16f3b40690279a4f18b0e8b908b10de2c07b4f44d0ad681bf04f1048d6beb26e816e937c68f975c33f9adda5f52a0034180d69af95ee8645815bc7ca2f5fe317372d2808af9d9fcac91481823e5c2186f0a6fb5f4a7e23a1a1fe52530273666f64355ecfe7c91daec6880abe588b1e201342bd92a7ad53e9ff8063851cea92c30f081264fe75bb109879649728a5b2d6a7da08f7a1ac11ed4b61e3e21d55911f2d78c76c3d508d7b5fe908d9dbfe041b3097fe020612732fd1c46a37a443199d21736f4ff25f7d7fa7b34efa61e6da75f9a783026a5da3a41dd9d1ea0d95bb9c4091102442e3268745752b9d6a23d7a8d22e7c759cb8d6709efe73b8953678f4258a42f705c31928892c579cdf7734b9336ba414767cb7c9290c4024e941e4de12591c9773c84fd14a4d8344d551ff1721d44783d9bd13939dab23865ca114ab5bd03d267cce49fa3d6eb3f5a0d937adc03bcdbc6c79858aef961ecd324b20ca4b36e4a7dc010128f0bc315ce317324719bb7ee99362b3a3c08cc0b272146820e751a29a7c231c067dd05765a3889fd47d7b84f09df3bc8123c54e340505b0713aa7cd3133fe52c331fa382c7dec2026c4e38a0a74225f7db3c6b3a8af4fce9f0b988c7ed4579680842cf737ee5c7af1d4aec87f4d4a73f850a30935a85b2171777612ecaea761fcb107eb60c67ceb83297f3156100e6b2693eb1e8026e4a4f7e4a293d2eae2eddbf7840840e653a6bf441b48e60ab8e6f70ad743b74d27e3c0d22a434a6d6f964a9ab56170a351cf4af1169998151b6667a2968076bdc365ee2541996e3db68ccf116d1a12d16394a222df426423709582d8dab6e61b978403558fb228c1d96772548db8f3ee17b7403d875f24fe21023010963c155e49eb86a05ddf079a09fb698dbba9b5a692fc4aacc01ea57a6e8216880232306c9c8a1a51fb1ff72ed2d1f882cd7480f5c9f4a443c06dbe6befb3a896791b160654e89314ffd0d6894de7bcc1d0ef39db266301c703ad3e772485c4a14b9664967969d76910c005288d5f68580bb7a41dea3eb7d60c4a5c9359a07a18ee404b4d64393f68948e6d9f20b1e0d031af034f746df35926a7973d659f31664e70f5284c569da1896e9cd8c695ffb6da275db93ab5ce47135e8b6a9d98a045fc5f7bd4b43a01d043822ab5abebbac9a24d00fefa61d4d277afed93c071aeda169d923e492b647a5897d0556efc18fa9ace532841f8224581c8b63e5f1278c5f08ca76c416f8311ba276361bf228cdf34d7cab6b0b22afa2cb10db920a74b0a60ee84d482b6630e31232f61b5d169ae33a2afa0e614295495990152701be969d272e67bfa56e2616f2faa079d78521f5faade3d3b9f10d23037c0976eef749167d1de2d8eac4f6438a7bd8ca281d73b63bc4324500c39c337d991647eb228e621641c960284bf3ea806c3ce6c81c9b256c3d4bd11a8ee42875d09185e4b18f0f220c42d69973df7a7cb379b857749c4a661455424732db43963264f5a9fe639ccec4b84479246b768b56a089e7596c6b428dac5aca8a38ad69f5519863e6e46ddf49c1db2179fd01000000000000000000000000707ff7e0d62857614bb9cfdc9a5547471e1476b8a6aefd2373273b8d18d7e562137efee746c2ac3d687afe96b609430d6cf7960f9b6a4bf14a2194641de7a2d09f634a50d9718de03f8d16715f49fbb9ae76e809b8af7e56e9bc8730b884d0d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249af0c0181e149d75e07a8960e75bded53ad8df10003eee71fecd8eee133d0e99b494374174e284fb583bcb47d2408333aa7afb94cbffb88233bd438995fe6b8683afde70d39da71456e4e86a79ff23f58e2f5221da1499d611b6e210ee9061fc77722c2d9b72c14a799c452313a56a92766d90ec4dab1b12d9edeb2e15097603268c81e117ab1d073caa9023c57fa0a690d8f443df4c1fbf507ad94b99bba696022f11eabe23d5a1284cc63ce82fc7f854c558ab383f0f53cac1050d88cf0830fc0b02c9391eca3286a4a26646c7efc48b0584d23f4ad21d7e096f5a1918ba227ed0824a3870fe76e8d9ff4680a01199ef949d5a085b0e2bd3a67bb9e086b35f41cc0310e42a0ddcfd66ba3059ea4b16715abe333f9ff4528e81c7affb49a3805ba33c022d8a9b97b70de6df3f62f3ea220175b5388877b35b95e0b2d3b96336be00dbe10210908a221077d8ad63589a8926dc3c979dd9f6db4deb4ea9d596c90479e206f8020f472644370b895d0aba1b060e37f3e4fb5423e88f28202b155d8592034c172b020b7f0c96ac683eaa60621a7d515ff6da1e8819e5e1eb474f086615958b16ff7ebafa28ec1861090e1e441e97fa2cc789ec1f954f0b2c09bbc7f60239e37dda5478b613203cf96251f2908879cd750dd01cc30b4e91c32fdee3fa449b146517e932969ea45d671f7e2d083de86e5c5f592e500e5e16d2d6b5ba24dab31912f92ff6f349bc1e547fcccb0fd4fdd04c15a3a98492046c61da26fe82b82ee96827761a1836ad217f35f3a7cca966cfd585f84dfb13cfc8c002c0ca7e59f7066fdc4e00c2aa2aaacd118875256d98447bc7cc9200d282805c55c712f55c40cfd071fd965b00d23c1419074d63343f9e917c2a378243e1a483d9a897450cd4d6b4efe757366ac01e200290ce35226b66e438097434f68423e7232b8a5d5e1611cc2c1035e77817fd74263fcc45d4ca94bf2964c4ee2b9ad7853875f62922210b7c48efda9505630264d3b05533d1e5d4610413c30c806465d6bb15df4074b520b53d55b254ac4c8494857d160251249b938186eb4874100b7b95988b9d65c31400f39f91ff4081684bb8fe747ecb6fa26af56063a312ca743f05c1a07443ffb75edf4b59536ccf39013f1ba3acc5ea57eb4af446351ea5038a015c052af9dc40abc327a62fae37320a99724911fbb024a7e41d0cf7e1905219ea07a2fe89d2c439fbcec66eb58600f4ae2c2b898d78a84afdf622d992ff90cc34d7875dfd1c53b4819b4c67092c35be3aafbe6f4a1b44fbef21f8670f5366813523bb4b0d4c43619c56f21af92f084e5882b1bad902bbc62c41a42d3f31d735b2196598472813fecd8d26c54c84b43189d485601a22358b47e2bb69ac17fca040afe952ee6479f76dbd009a3260f08edd3b6fe3867ba8a637c15f79ac6852883792e5e72bdd9075d301ea530a4bb8ee656074921f6a1b3e6c420ff8736c8502d4f874bfeb03aaf1e19b0a471816b36e6960a7659f91c97128bd94934091e53171ce5fdc0830b608297b5e95dde5947f009008c17e8191f5dbfb8edd28ca9aaa30b7508458b0ef7c688afd8443e5c4791d216c08f4e4192b7bc05b03c72329106d3c91ed6a7e9990e321a821c1ac9f7af2b6717bb5df3009f978e4d7b2584c9489cc6d27252a5d1140eb876b40e36286e45fe461ce50e09c7fba25e0fd4c0f0671a6e69417d57b55d81064d354022a50305d2a28b4df15eac66d037824f1263eeb5d025b22d0f7bb909dae85bd04e98826b3ea59b6c973ba2c9fec6d643305f30adbbedc8437c69bbb9dea53b23e52cb0640f1bbfbdd1de98953032160282d930e1749a2ff69e5685b7d8f255dfc18833bbfad644f1be71900bf15ad043657fff583f942408ffe5a2b976c39e00ed5bfc39d010db9d0fd892de09492db55c5ad29ea810c87a6ea496a1ea5d6dece653dda00f58116e99a1f75937ef8d3f49fd5678cb4595e2065bffa501e2ddd9d5c3d0f336532db5f4da4940a623164acdd2743555902383788b07c41d3a9d2d29e6ca2b217f52f2cb79ce502efd691ada4f99103ab32d13982eb9dbfce2753da29e38f31332e84a171ec840c83e9c8c8c7f922904e6d4a1b7013fa6b9c267b8c08f5b1989995cce229467ad583ccf958b7f84b7d9aa41b1f7e94ad052a3eae1fe4682722a4d48d254455c4c3c91e5e14990e5e8bd91f13e3c6132e4bafb54ee44d8bf06abec1d9139ab5b888cbb3b91b7f46b75b94887778f0d551e060fdf2a37a9e6fdc55315cae37037e87cfed0000000000000000cdb25f04000000006cc11e6cd804c21cce068f528b69a09333cae97c85c25e3c5ace549a0b834beeeabcbce8a54403b614823f47fa5d2d4f958840493df657bd08dc20ae2c872d0a3b0233a064371f5b9190b0d843423db10b9a128de524099cb8b34c3b9f047b80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c8e865717486e2ed5c7e3d910ad10e91835f36a1b64b1a3b159814aac792ef5fdc8eed704f7d89ae3985cc3606f7239380f107ba8ed9a005f2e0986f19777b556d1e48a65c399de8208c27a95c23ae0accf072df7e0f95cedfdee393bb4b3e5501bcb6d47717e5e72abaa14d931bff875b33b1ef9b13a823bfe951597b9e6b8031f75196f4d5ae2ffb26fe01d055606c561a38286df01412e041ffb96da24df290220ae1702cc911906f0740e9330705b26e61b53637b14c5e915f3045531e68c8e0a01c53e209a9d0fde72cc172ce05a04be576b13c00e8b8eaed4ed9b11231c731da411ad4b3f1bea615fbb23bb375bbd21347b0fa4428eb5f967fdd3f9891afdcb021ce44bba2bbf8e1b89a2c358a06fe5f11058fc6938dcacf300f557b6c5e8f0d30303a62615fd486fed1fdc834834af6af78f34421ef9aad5f7c75fc68174b23733020b41ff4dbe447eabb53ffc0e159a5c744df2273830911e267b5d73ddd8972a000311068431f04f79846c776621b786f0eb03809921ae16ca373367d4f9b0beaa560221b263aed9aae7bc1d4db23776f5a5b0de49dc2d5809cf7ff31e18f0e9063020c4342701980d1a28edfe7afb2ec46ec89ce529a8ae49ce016ab92a768019baa4fc810f5b5ee0ae10a82dc569eebe6e68b2642b90d57858a506f174c383403686bc4c206d6b18896ab3eb18cbaf40492bd2f6ec4a969fa18734c76045c39b089afa3310b1db12944ed4aff8ea9f327df24a178d4e9bb3fd565cfae9b1624a92621b363514ad55d3ef8b4b680f8a0514298f14caef77ccb062ea2cb5a3e38ee20bdf9ac67f577cad996280376ab0a22dfb8d03ba51a55e553921e98872df98c4472d98dce72d800d12b4a2fd58e80f96b97f97fd733110914381cd357ec69201591e158d3157ad467f1df3fe81ca290b14f7985b2acb45f9434500e6a04ea328b5e374a7e3809bf97c574d3edbd8847e95ef0602ce16985a8a9046df5b7cec81862a3ad96b1e1d9f1bc934da85c69fd443e1f59aa210126b6be53c53af9f94a3b841daabf73148fb70d13164d7c6ddad5150affc4403975660f5bb79f7612ddc77f1a82a102aa1c245600339fbc1faef670d36ddaae22ecd525b4f95daf2f6a2b56320a118358653921d95383c21a23cb015b11b851b0bc6e426394c7da31fc090e101bedc2ff41ec3bdc15757fcb68c8ac78882a32a1d5cd734b4fa4ac25f11567aa934d211dbebab3ef00efd19392696d3da22390774a41d4f0a3c8625aa25e25a204e5fe4627af554425abf5c82d5e2f8c1c6a3d6bd07db26a0c555104bd29c6d2512fc15b53fb39958c8e056eb75e73ea3d22d7de7117a6a862f1fdf674dd0f76f4ac625697ad55605cfcc59c2a802ea653f03c8315ee3ea6823eaf8db8dfb8c744be4968f29c8907e7f3344bd95a23f90f92e65d4c99790ac7ca6fc5eba1563626813460334ef3e61244acc4bf1a3e7bd2809f75a21194e13fb2b34a4005d3fb900199f06adcbc4908854568cb54df0c1d1faaebb9889599a66e339e488053b05ee6997e0ec51ca1f475121171833fdabc708660d5bf3d934ff5e71d1cdf1f9cd0adaa44b18dacf880106fa5718fbe1fc0dc3ef762041bfa0ace40ee7d1d73692658e3bfc37a32a1f8d9d78119eb0fa64decb7c8295e9a38213a44fd1a2573aa0c8f0cfde398646ae1c97de85e604299ee238639e36f5fb6bc3c8ed7076495709d112e93a6acad89ec5e9c1c627b7046b66b28a65af521ec3e5fa9485f993e7adf81d27e0164f8967e3c5bdc2b8fc7ab90b85e1afafc23658e1f3fda0384d1f961c646ad3fbd4d311f9809d3ab80fff0d5a9269636918fa3cd814e64d138a7339d993ae8759557e4975ca7f41908736a490c668e188ef24866af09f498490081d533b2295761d6b65482366c22ef702af1e5c037cfd86190fadc279a8fbc26e33c9d02ae2d4fa7e22192d62fecccbae52241a664348a9060c9396a06a73e90537bad9781d8fe18f2d25acdf11893ba73392c729f8b6218c1c1501b4510eaca33234da3de87ab495aac354f2fccaf56fa86c844fd3cae9d99baf88a612f4f714ef53568c810bb01284706d650a3c2aa743a989db54608149c775f0ec0419cdb22402251f70454cbfb6d5ffa98dcb8f3f097d1b8f09afab4860c02707b7ab41820c122343dae3ea21c761db958b327707563e59dc57bb6f89bb11486f9f62f1ad60e1e6dd9dfe7d8e6559aa2ff2b940ec8fc156aecb9f53cce3f70cde3427d28a241e3351512c5d92b4238cd0c81cca98a58050ceeaed90715d6ff3990ddfd4921936cd412dfc1cc968dc2d3fa585d07beb7c848e6d906364a4cbae2915aac3737a10ac7d6f8c08b0fabb15c7ef7266c87612571126d6db4b0178fba27f6516bf88c33b2445883ce2f654cc008387cad704", "53005263535251", 0, 1931210944, "e50ab954555e25a02c5c5c8b7fa85a0a4f876fe621feb494e36c8d0a3dc0271a"], - ["030000807082c4030167100d6d5b1e30d5c34a33666d5892bdec051aa3e12d3cb503ee1e0f1a050a8f03000000065100006a52633ba8b1e8034ae4d40100000000085153006a6a5200528d126d05000000000363ac6357ff38050000000005636363525200000000a4bd99c700", "656a53", 0, -215140001, "86cd6245af75db2d8b1715c8a8b1b5884c551db006478c69a2b729f8ae2ca3a9"], - ["030000807082c4030380f285134da1541565cee822f3e5b87d724110cc89afc508eebbcccb17f38817000000000663650053ac003b352f74590a67b4197b466a87b81a1935db599c648bf967e7752813b7ec41c6a0a5fc2401000000066a0063655163c9fc0f9de7fc3d2990752f7a9d61fdc6a0fd0b4025c8488c608f3880e074e21454f15a3b000000000453536a521eb0740a03bc9ecc030000000003006a6567db1c010000000007006a00536552ac2c202b020000000009ac5352006a655200000000000000000000019ca1f502000000000000000000000000cae4e56dcdce126879f44644ee474a1994a12c28014176b8e6ff468c05ed6aecdf2ea0c5a3399af0a2e98da4e705c400afce42d358db56f615a3725ead2ce83d8733e87f7daf7c2b3f6323b1bc69b63c62ba00746e7ed943385e5de903f28f9600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b4d672fe34924d0eaa1064693092c9b42942c3c6c171483f37114b7686889d0d04d69a240c5533839dddf971c1b515382ca95529f368090778220aeb5e1e75fea6b48cea57730ab25295e18e271417f73a21c4c1fddf7d679e604b223224bd7d6b99edc03fc98aa38843fa8f7400fcb510f97cab61b8ee6d1567a3db0aaa2cb502228c3f6447ca3b455ac211cfae16ba6789c58762a388d6b8b519f1182c8d4486022de3f214c5390d17f6a1f5f2911eb0cc2dfdf9544579330647afc7efef8da1d20a067ac832acc64645978f5645dd0166d7c0dc1020a1982d370f6145b4238c1d3a446a9194a7a4a6507d5d7c71deb08b7db87c650bceb24e479247a84ebe1da95b030b087a6559d936c69d565066ed7b7af403d866bb24cb0caf1451ad57c6a599aa0229fab4619a667fdd49d8a9aace3c6f486165a7e1373fdf54b47ffc452d0f4ccc030e095168a7c1df27ed2885b39577a5f55bedd4fd86cb9ed12b9aa5cb9885476e0216083d3661b21ea8e22ea4c0a10884f61b5726f489713ad0d2d175774d67c1e8030d5f80834a27915b8da375ac9797365ecaab30517244f1a45a219f3b235872df6deb9e0c07233c51b3950c91f8346b334a91c88207d1856f365be27f6742824bc7958a00eca8c8d822b369c31be8ac879375fb59293908ab0f500985062d45f8a35baf1e685542c06ced3ccea99c1196a5a71f034ffa3180004fe553d0aa5eb627ab1af77add743dc7507678cc17c2bb76f5c4b6511c4e4878618f5f0dc1ae11e3d4e9d57b109379363d78d89f4dc350cd73c116442f50c00553664ec1b1cf4ffb847727e70e7d6acd1617c4020e4d949e513064b4aa86fa0ea5b99d5d4b8f9e2e2f75705a9d48883a178d72f6f69236915bac93b38b93ccb7e5940aa80fb0c6ca2743e8fd97495fe41a71b193b67787e001959bb23c5dbf5f9c308f232c59b2a9cbb257e9de67f7f350eff8b1389a976cbd907aa0efc0b05850b9ebb227ad3530646c14c6ec46fd6f0d7f6eed3be8392a0e3103903e5b3f46c111d6affdca032817ffc1140d7b196c2b7ec0c712da14b8ab57aab17cd358b5d6aac9b889a9adeeb6dc07c2c8a6b7787e721bf68b08e58b37f69441472d9d05f54069abcf48bf3767947e168f0089fd4a37465e7ee727ffd6e0d7c9ad796dde4909bde2140613e8248ca95ca67bb4c0757ca3344dc4080bb8e79348a935898e8d9af05483ddbfb7299ab3c5b2e7882005004bf10b0a6f0162206d0771686ac25215202ecef93efe12dcb0c06bf9a647bb061b8705ea29600a1f245d71025400d3348849e9c05690628a7774be4c98bfc70450992300f7f969783047507a3dbd7885e27ba921de2f7987d843efc1ac57946443e04a864ab0a6317fe9d6a207e746e5b1e60edba167a9b8e500a7c24078a7775908a8dd7d1410f4532e72c0cc2a53fd5bc85f4e524555ec45680f7c7291c9d36d48e216a18939e78fd8ac27f140ab1eed7b6feb5c0e7b3d1ac2f8d0c26320ffe4aabe72f177dd2e571b57756abdf44032ece7fd8282524c4889c3526c09d7a0759a4397bb29554857cc8709114222faa8a85376a1d772f58ae0dabc1b6b5707988c219b1ab73f95f0d2e92d4e6e25246c8b8d56bf4a2790526b9a97d7b58dd0087d775613214f3dcf6601714e28799e46ecb93ef68ce439800c4ec8f76c18f27dfa171a5863cd69ba1d56c215d13540c5a4ed79bdca3ed79e4a348270346438f66cba610ce6de611aef20f274657d594b3314e834574aaa99799a6f01b114b065060c1fa90e64e26bc7f0b31f859ffd1a08ffe6acd5534e5355bf61797ca8809b7584aa9cf2934403f6fc84f91662242809ead38276ebf4ba5b07866b9f7dd0e2cbf39c849d18db05400949e3bb191382460b7e66c1bffc6b77ec32c2b3727d3cc258d0cc2d6a460910899ec6311b1728aa7ed2b26a01d6ce0f5fff3cf0e0bac20ccb36b555b8a06c88fa66c0f7715045d400b0945cdb96de3ebac1f29e600963e955c70b2f95ec16961a9df0d2ec86345fcb79d9ddbb1a4f487a4ba3b1fba2174e17ae3e2679ecb76e5c20b5ad86a8b9accf7f22c70308eacf10eb5a4d26c8c6041d45875c7c05b139c6d08e23b338bfd65a4c91d9bad002dff1f6dd6f3869b2b0d11a58a25a61ab5d361fa43695411a7b7c55045ccb71bdb471bcf5a58ffe73fc236c0e24ba0d7fca06c86775062138920061a40931b2749173acd83c3170b36cd4d119a3f24a5681ed8d0d367a385ce1f26beae520b5a8a082307b1bc73d32326b86a57b502810b10021cfe0236fbbfabfbf278d46f4894a77e474a06d348c5485a8bb185e3e7c81946cb3966794d3717e7a4971bf8d57553a30d25c7a245ab32dfcdeaa0ab55acd6a892ceb389eff22c00f8ef3797673714384fe138788f6e4c5ccccba07", "530052ac005265", 2, 1095169059, "85dfb7885a4738a6c494b6c58825ecbd91082fa5a5feb7442d105507de81fc8f"], - ["a351ab40019a4b2540bade0854b3e504befd0a75df48c33a948a33b1230341dda4a99f7761020000000152ffffffff01efbf110000000000036351530000000000", "5351", 0, 1028052498, "26648ac2ce5af231ded03e78f9b4dd73db0ad296c2964265c113f78693dc03f5"], - ["f260f55a01d6f2f1fb0fff5b5b87157c2d1d4c0b2538fb6e30123f2aae3b0818a880f7c8ed02000000026365ffffffff018ad0c6030000000001533bc6907e020000000000000000ca75ba0400000000c7158fe3a959db27dd90ffbeae4866f89aca4b305837e0220611a1383ac9a6aa1bf04d3fb8f2edae85e635872b1f5586e47e39adc624d38429bbc2b037d507706b87f7350677e5d5e2f78d5f82258b71f4d2a57f3bbcd5e4e05b05bfbef88488000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007e8e18d25407e19bef6618d312b53330344299d0b02a0c7708cf21a5e64e25739b515ef97cee1b7644d21e7a80b1e03dd374f3037c0bb109252cb9d2deb33df06ed4de0fcc995dc1c91bad43e90690c7db3171e068861989c77a8a30a3b5f1ca1156db37cc7ff2013fead133d2b2092839e1365408b82c7f29de2e803aa54955032ab68dbbb8993c4f6a8bd67eca0eee4dac614732494566f125e0bb8ef134f76602252dde1b15399649f0d5b1c954d5b207d9ee3c0765bd4fa8667c1d4a2fe6b95c0a000604b7f5343c1bbb566e2b70da0ed33a0c43c02b86d5cc4e436517b3a42767be8cd30cfbcb1bbffe5246aafef488df125b6cd7d3e5b3ae09d5bc9c658097450226080c076fc9c6c51e96734562c9f7f983c10bb4ab35db8d87c57bf5ea68f58b030bc9e4536d5fb45b24e48d2885aecd8e58fb7dd20cceabc4911b8dc1ebd5f83f032230eb59c6394e9983bc9a6fa29ef2b947ea125ba91533c1bc03824cdb552d2b022d82c91105dc8da5c85dcfa27f2c299bf59ea62485d840694d1e14c2efcd8193032cf89dfafd7f9dbaf4369cc1383f2cff1b29061f9a568322ca925a2c8cde4c4a076d00e01cd98fd4c625cc5b00383947169ac16bddb787847858e53348483d5155e0daa8e1dc70b81b933dec0f4a8b31eb64cdd60fce31657c48a19fa0f3b02d819a36e36eaadb7cb1b620bfb0fa27166db787c8f2be15a19254c48e7de352b46fc15e8ae3d93e3d6fe9af88ed5d226414cdd1c3ade32e61e62e142f2eed5540b3f87c441e17a6e93d19a0c6154b29bac390dafd6eacacbc4909ae9807d29c93670f1926fad3f851cad18153daa2190738094fab8f810448fe829d82f7321e3e32061b7fffb488ea2d1400d766df7baedfa3075e5d90448a30648c958ba630ae267143beb9937f7aef3676d533e327123f90dd91979a9046f12e084ac2e327429346ad15a84a5c921765a0034274b3c26462a7b6999977bb0b031073830dc149a1a234ab0c3e14b3a60690d798aa5f6591ab59210d4349fc11dcafb2a8f6fff0bb90f03557454a3ed6d93098156256d03c78af655f44f2012b2d574aa1df0c08e7e6a84594d7ea487476a815ca1b5e6d3dbe5246a51d81ce0b81238bafd0029c5d171b3ab2209013a33576448ff0982374cfccfee1373b2a3576febdbe5ca693c3687937a3c3545d98488fcb5c3774bf4f968aadb731fd7567c41efd016596f0da22d9009f7d4dc2f90c1a2b3eae3ff9ed369c2e131818943b40ade928d4b05022e7855c5ff96719e1b38c474ed5180ae833c29afa9d27ec232fd211c673449d5d53b9c2cfd094fca2209403b3fa05a14ecec81593c956238f68e17e40db3b9c77b549af722f6c7c7d973663b23db7b4ed4e55b96f2789d235f3b681839d977b3e3e4e3734d021e2a9caead8311f9c8177ca081656baf89f64623e75802b98afde65deea8222440937ab48c7d0c2c83125eb478a20a89ed4ad7a185a3da5dc708603727b03a1ffba03929ecb40f4ec2f3b9538eeadcd9bf8a06b7f503ae8f9a580389d12ab61cc849f15c1e7fa69d9da43519326c2a3e8b1ec6beee05ea7200f4eb488e15e4c611210a037b871bdfbec9a5281a4024f7615ec2366c7d4982327e0acd5bdda39147bd785272ef2003308556ab4e8c9d5c64695414acda0793e8e130c632fb536bc9a59f71dc3dd9917690ea06acfb1bf26e51a984057631ee0c55afb4b2a26777024bc684771d28dc2ba5fcdef7f28faeb5320462165cf4b2c555763ed21f1488c1cb6a9314ca4246387811784687754a0853b8f5e07ce099c5adb294886b90d20d58278beac07ef528344032a0ae6fdcf23574cfb0475d210d96000ea41761f9c4d86ed38087c686422de8ba106e3b803db4b043688fddfdcae5543ef93f2097e62096859fac3a1f615d67109bdd67b3708259a836790d60e5de2418153cd5e87c39e1d82e0938477eda0853d016827e4e3e26f82a66f817e10b15ddafaa0fc19495eaeb219679b8e4f211a4513db6e6f3e513376f6fa6e91463d01e677fdc90cca46adcab2be6106110e4397e9ec93f49e1dde6651125c7db619e3d843b064787c369736a697174709047e43d6eaed1cf42b38ca72b31d6e489af6bbcfd08da49404aabc0172cfd4251190834edcc1a1cfe5b16b267610861559d24a9526bc1e8bd48bb839f432916ecb437386fd0ae1dd7dc46ad394ade1c0b9dc0e70c05652364ce46d3401b24ee01af2498048294c59985e1749a32e57e1463c279b7260ae74865de59031c3a9e456920000000000000000277f07030000000035d3ac7bd06c74d9244294dc062463220ae11452ee13b370f8d47ccee7f5b5835bc21c38d5277b2756e8e05d78f10ba134345bbbc1ae0b8af41096d507f0f6bef8db8ffa340b6396aaeef35c51096f69529061e8d9fa0e39c9ae4427586bcbe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d519e500a330cd0d4e47e732146febb3a6d7e119f0dbd68de7ae0caad9397512baad5af31b3fb63ed9dcd650665b8e067ca9bd5da9dd1e54349f6de5e89b49625ed1ecec17fcab60f5cb13d6500efa751970e23fbbd134e19124f2466a36ff5b97ca5131c4ecec5ef28ed9c475f08b0d11f9205038c6ecb211010afc6cb4b2630220f3916abadc87683da78e17294a109cacd7c14d1efd87c144e0f4591d1eacd8032cf4349cb13cec5b10693aa159767d40cfb43656910442a5d58fd3a7f56f928f0a04082f04ff09b472c5f0b6e55e3a9fb1aa6c8972d43d1d70bdc0db0b3a28ebdc7860cbbad642ef6dee0c0a9f32fd5135a65d89ac224a97e319b070d8ba4361d4032aad57fe115bc601c753d2b27657a13a49942c1d658388e4ffdde18d3f543ac2030993fc489ebf32ee3117f9a976999ca4599606f9e13ddd9c1bd7b414b9ea64570211cc08395eacbfcc1164c84e7145896926908dafaff6c2afb90f107cef955d28022575ebd73b03fab43b2e3ad7102a1320f407dce79a1ce1ef0092fb42e86288f30206892b70f184d89fd51ecb924fac70d52b10b3969fe072ea00b507186818ee1b4fb05dd378a3087c0fd11601b7e11bda52a77ea9589d7b3c8221bb2087f1c1a8abce97f3f7ac2d26a9f9f6d939891c335fc4811f09eda33f80a94768240b67ac49fc8187283e06382a29b042ba474cfbe710d245ea2cdbe7f840fe30e32b4835f82f3e2dddfaaf520a51120cb1b1ace5524203da5c022d8a046bf80e0afc3fcf07f2baf9049392cddd5669ead11fad3d28ae9fc4b8bd2a3cdfb60764009818c6e10bb5a9096ddcc703a8ec19cd06a2b9cfa491c3edbf72d38a5627229d22b4e1537c0197ce6739ca0783ebef781d74b641a2430b3affb6b85b95099800a9fbee0735da5cdb80c2761651ac92e2303045db8be32a72e7c0a831bfdb91707f48f5be5c07883f9d0f291acb15d246c77c51a3cb268aad49465938a0742d7c5aa7c3e7c7bfdf2156de5ada95f67038287f79a68de4ca761436f6f9a5ee53da812a55ffcc1a083fa692387fd9242071042c0e5e5d4f713e08dc72d06b8f1b599fc5145bb98383a0f977f83ed79f94c8c40accac615037963bc91edb895c95af68e2afa76285044f51048ce3ee01ffbd1dd2565a2f1242a62b15b2861e4454203eb1ddd47b8a71a50ed2a3131186c98603a724fafc420c4f8ddccd26467e2e54726474bd788f82c2cdf7fd9cc18f3738007f20eab6df7bff9d8cc7bdb5302ee6569352895b3d1ce6a14524f0e91cbfa76a2692f79f878523b85668eea9c9d2b5710e9d9bb0564df76cacf337dfb9d02420be465640699fcfd068ecf26ef6f8bff613d15f481073b7464f91024bf499008509634d68772569f46072e012d2cdb69aeeb87ad338e6611cc05ab8bc821d8a9af714a206704d04106457e790c2dbf2b07d2355916d86c5ae0a8273e735fce88a990a607dd2b66db50a987c2749d122423e0b4f96ac50c74706783e3ebcdc02c38641498d701d984f3ed6852fcf5debb51679f04696845fab53173814a443e8e6561714f690aa647252a78de4374f0b065193f7d7e8e65560ef2cfcd85fe8334827b1f6e168fe5ddae7f223501ea12e3f9e9bdeabf3cb6ffde0dd863800396b2ccf994e0a1cf8d8e936647352c5d744599bc787b1d2bae8d6268492489a92995155320afeb9ba404b0744a43d5c58ff521f7917d594bee714564be928f30a3ee442f2e108e1d4f053716c8f8bb1a1e6da66cfee50d80dafccbc8edc02a4389fe2083a392c926eb4c935c365b0bb212460625eed8b444a48e978301ab45af5c3c728e980027a2441dedd1f31ad7e7dc6ecdc08e141f0fd9cc370cf096ef4d6566aac0a62f0bbd2ee4539d58f90e500af9e840c81a882782babebfcb80af10749226ba430dbb159d0bf2912334ca1bd355f79e9edf471b25d8f418f33dd2230777eb84884e8b8c0ae160a46ba928e307573be453dda2e526504bbaa98c379227ab7243bb555e7ac345c48465e145813a3938483a925c0cbad675faccd16dfd2cf919383364265f8a7086bc336a988676601e610c3f05ddd9ed204f09a370451b36cb6817ffb923da4f7719d91b5d700b4e2f6d2b8de154fe00a1f2761db7f545c25407f3fe75c1c4c5fa49c64fb848148e937bbf9f0931d152382785dc7cfe171ef4861fe12bc96d9b71b93150214513082a31b61db71912ecccda1b5db6e08c5a230eb20aedaa12ab2b3ae668839eb8b11578949352cbee278ebd82b49bf564bfa373f6f01ab7aace2d0d6719b624787a4242f998e893bbd97c2084aaf6c030d6cbd3ca041d285616d21272f42befb4a8b64e07217f227d448e6844ff7e0d1c1ca61f55172f64fabff3082b242d612c89fb3853d6129e9f1009117c16db2f846e0f4834804", "635165635151ac63", 0, -1766492488, "95efcd9531b150d091a8371953db0ab69c71aa36b66b391bd510bad9134358b2"], - ["b6ad5b53046dd980b1d9c97a3ee0afdad7aee0df5d9bb244b2653940da3222199b2d8109d60000000000d4fbe3189d35ad43b9fb21eb165bbae48be1643cc213d7b36fadad4afc989c747d390f800100000000ffffffff71fdeecae0bf411c1841c4343d365c8b8b4536ea214d2db145fdbd8a7c4012840300000009ac536a5363acac6a00ffffffff94b6c75f3c5bde989fc439ab3c6538f50aafdb5ba318e9278781b56c4b26ca8d03000000046300ac53ffffffff03ca6b1b0400000000030000515db3ef010000000003630052f0ac6f0000000000035353530000000000", "52", 2, -1773700474, "93b630bd54e94697ce40c154e1066f45cde2be68483168f0e8abb9d0e0ddc4ad"], - ["44056f0b03378de86ea341de249639af6465ba609d33696367a7a31cdb4ee1b7b741616677000000000165339b82bf56d717b003f47741029231fb75cd32806a86d121ea8c30c38166ead08887b8770200000004655352ac11e3f4fc6bc46804ad52bf520367eeab9eba2377c066d3c6870f1d624547be7990fb6cfb000000000753ac63515300ac8abdc64f045643570100000000050053006aac200bf30200000000075251525352526ae123d00100000000036353538c7aa9020000000002ac6a5d32e97601f76cab05000000000000000000000000588880ff6f93c0767c23fa424ff6091b62e35a6433d6c516822e6f668c3103d38156dfcaa1b36a27e37376230eb253e15006b1e6113eaa1f5a15d9a711a61c0345ea83ac7a6f714797f61f9e69efe0d2ec2294da44d3f41b93ab593d4f4df6ec000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f92bbe161cbffdeea9cf9109878421ec80ea096cbfdbfef75c2ef904d2b7d11ffcbeaab934a005aade37d39fcf80de689f498278dda25d60277acd212cef6aa004135f6ea9f4912221031846301653fd0652b6569abd534b9c1d6c46fbf13ad6781b2198f6e7e32c95cd6369d2bbabc06e603919a24a27f87f2dcf30673a87d030ad7dafe60973be945b7ef673fc8e1989a68a6cceeed5b3810ef81bf73e5ddd302063963f26747294b0027306eefbd1322e8cfd25cebb4681234d3430a67da256c0a06f26aba05c4373abe3146eaefc76c9c98cb549b0825b293916d918bfa1c8447b4378b403869efdd7d0b636414e117faff7d5d3d6c4af3f320497eb019635f620204d195c25963e8b70cc9760911ee6b682282d1aa723c02f158e7aed858096ff4031a598764b445487c5a66239ab5adfc96a738bc738bece598f36ae77abe0562ad0321763a9820e2627e76a0c607c42819b60eb6716c6a8e7f4c4ec17ff103fe08230200be72a88013e9fa9b5cee7497b146de56cca183328e98c8697f25b6ab8de48b03215b4abaedea700fd4e7a37aa3912f3f8be5c6c5d0ec9c1fbd9ca379c63f29d11618bd80f065c6713ae79071d30598e2ede4cd59d999ee9945627b8339188fc36bdab18842a673a45ab8a79e7c3c6759d9e3d06843cd9070ea268e0a751f253ce46f7ce2b1f01b08b5b0d67b2b1bfc4e8392d17624e72d0ba42e9afb156ca4b89f58e5add67976bb4a2af0c231c4922994d91d2622361203e2517bbe2416233e72f878377742b2f57ee0fc71d840d3e7bf92843c2f5a3d9df6855c8b3243ab4ab0f62ea427ad25bbdf8931b69190c920d97d1f89da17ac21cda6ef243eac3b4ed327c1bcdb7c9f6ec212f832e4a895b2a47503ef61f6d2e0934bd29ef23018173e1f277edee3ef606a20bb95565e8cd379da0babdd2a121cc988421622222370e789338b508d78b1d5e427865f9d878b9abec74f956e7bf095e83888a0b8dde3059757cb451d2a3e426215f043baa15e3bb513a0d92b5a0f96854f697d719cdbc555a2191326c971b99683db31e7085b7f4068696995ee10b163107d8fd66d6a374acf1587c6d95cecea3fa40ecd7c5c04f486e33d94c447cc73d31e1418fb2435975bc47933789123a69904b27af3fe42c8da78ab837734757feec3c70957970062829a1fbae6970f6de603a967181beb88118baddb9fedab291190443a3024711342279ac6baa0642116849d009227531935487663a8f7e29a185228533ce8564f9ccb0cd550561b04a35d9007445d7200fd47517f69beb7aefff4be78705973840c78f1c10af9f06bfa369a13145a66a7c14ccab16689af0815ea732bc006c2b06d2e22340e0c627b063219ca3a5acee876bb8df17914b2855e8386c7eb05755c7f33ac4ef69a784c5391d95aefb2a5e6674f7d9843632f85373e04b864e65fbd6ec20c93b4a5e0152e5e44b518fc374cfe6927506f54830997ddaede72eb560ca60f97e4779b5e86055ee1d6ed4add812748ea20f25aac9c752e6d3c7d793a1c80be457d8b11d1b1df52718f9f97c12866b81ba7adc7f215ebd8b9faaeab76b438042638b814a554902f4a8fac0dfbbf394b05b1eb8edeecc2673674a7e03d1c8221c8dd83dba1ecea12d5a1a36e475af7e14c6e80bb51ee71fd0dc6195417be971d9c827cb582ee1800c5e794327719580ab1392156808b5bb4213370895baa54200536f217003554c8acb4069e045f9cea489817b65feac65d88b8a04cc814ac2fa8fc61344e69ecdb6d05fe496111e469f34afd5d804cf9f3a4b7c5bd4a4bb0a7ad8ff2d502db15af2938fc248cebb84e927caf818e52c1ce3c010ab7396d3e35dcc8d6541f02bec6666eb59018b0309b97ee6c4b7d06743b351eb9e4400c839414fd3d9e008db3e21b06cc9fc83c9f36d7e20c3f84724a998eafd29e216346b0743dac1b9eeaf1cb8e799cc3e46738133c433776b1f6ba48f45f8258c47230f219d259a3625e1fbc257753944f1d02001a2646664a9f850a9ecc86abadcc0861389a74360ad6b42fd65efc9096f8fd3b8bd5e5c35457edde3011b618a4e08c5b6c8698485a1bfe1ccf1fd49f7ff0f5c2f0280dd46bf8cde533ff402e5edd12a13e0385bb9beeacaaa3bda1ad118f5c488cc7792ced95640e125e474ebdfb1beefea5317b1b66151574b47e7f0251d5e4d82eb6b57e9b8eb40d8e0ea07655d958326d4bcaa5741cb6a7e09797531f05e3491a25fefa7a44cd7fe5c7daf2e16088fdb695abcb36161540c6ef4a8f914b9e26e3c170d64003caeaecd1848de3169838157e6905d236056e9332d836fb15990b148dd3e180f2a71b84eb6269a6abd805d4093cebf3838da2fd00810022712925269d7f4eadc8e6c9a4a7b6cd595d8d32298ac4529bd0b42243886bb70b", "", 1, 550170128, "b53e6db9e4486a191e269c6b7c03fb73be8ec7b7c3381c83fa81847d7b30893e"], - ["3a6d335a04c68cf3208ee400187d0aff5bfcf2afd1880c80875f17ef221ca1ad0c250e4de001000000056553ac53516c323f0418f1937b5cfab63c210834553b6d94827deff1bedbbbe6c3575edb7df31e3e920300000002ac000ec5c2ff1e301e6417c43da9db0d99382875b3c8af188d0465b3fa512223934bed367553010000000153ffffffff1b2572521533196d4c326ef9215ae1c5216ac6e97993a78b14b7da3c8870942e00000000045263ac6a36c1b7c8049b9152050000000000bdfaed0300000000005fdc7c0200000000085352525365ac636a0a8c1504000000000952636a636a5200656a0000000001c67dc4050000000000000000000000006dd88da4704447f95c58dfb9749ff88816db755331b16bd8c1c1196298d84ee4e3a92a3e5ada615d1a3c3d17c07660d7a9dca8ac6c96c55b89e8c1a1edf1500995404157b1cddbbafb32ccfc5d88fe25a12c27079dbf9d8ef72788d886dc6a580000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040ac512e658e2ff9fc961c577ff00c79869da8edf34f807733019c72c786fbad924733e040727d5735d0d5620e66f8710358f142d330fa03467cb91a169deaa3d7e4b9c8843e56ec4bf049838f8201db6ccb9686fe53d069113741393a603e66159120fd530dc306b581809eaef5b6cac301bf2f2a433661d08e3ece3934b63503293ec12b100cbd405e103d99f68c7596f410c9fe86bd99ee844dc67409841522030790dfd1f593ff7e2161b18c856405144444659955e77ef7c6a53fbc5840072d0b0785df56ef2d035bde00fdbd5e21cc8363bb9cea919e78629ca5fa31ee46211d81925c548770751e396eebfd9d51a4efe2b52eed869695f864fa2d709e3f2b6c0312207f6d1e3c2fac1ef1326182e6f9eea34b0f3b3b4c7f786ce42338a8ec2042020a388352d371964b0616689cefecae115c22f496a7f4a6b59bc83959eeb034fd021ae61fb54e2bc6bf94d1622f90d0ce90b6788adb015a84c04e6288ee09015c00022cc694b868c3ae590fcce93f6fcabe76872dd2bf2ae3f126b23ba412274febe8021b3c1ceb0f22691d2e3fe18622be16c3e930c8ce2ae113f6aa2c2fd7e689be604e69741acdab06f1f78b5dfb4c4b107ff770fd2f1bb3c0401378e04cc7db018eec32d6dbbcc89e5e799a6cbc2b5bb20a11723f2420c54a72bad523abde1d2138942f65416f4e7353c08b20c7e508f11ec59cc6bbee53f04f00e220921097c84eedda1fd791f9a1ca871eef32137ca4aa377888ff7dd9e8f311d41b1a5a0d8ec918b1358e3509c912f48f007b5f929d3db2998dbed8d378613a6e9c89dab3b071a814047de1f212df44b6d02d097231a462d6c9a9fe03a8a01139cb28e58fcb312d1812122372540d533ed1d20ab789b24c02be6232b934f5e0bf3d7086d632fdfb77eb38fb90101648e7e39f69fe5ddb9a6be255c1be1e60251f303f97b476820f42758f9e7f9da8e53ed5e406be56e4dda1ee836ce5fa5c412e79ce9af719963ec6cae1b1901ee8446a784dbef26c9b3050966c5687d541cf089055f49b0b304e713f17f4270f1511789107f6ce2fc81e2b9cea4545508d42c5e9854328b23e7a99a032a21d5263a96952b4be55a0715e0cde92b67d18def042b6b28e06de0640d317f6ba378f161e800398f65a9fc21798a7ac58efebccc48c959df607f22a25a4cc7bebe7fa39f875f3acb954cc94eda85d129229d6d5e442f97dfe859e50ece3d1839cf4af725af2b2f7633a67aa2f3d62ba12084a5634ac049346c30e6b14a545ae03daf84f5c727a3cd908cdfa560ca3ba66b160371ea1841fd488e2b8482fbd34adca09b0667bab29aa1c9ffc7eb78f8e7ae3316567e71bcc541e86421f80a745356a015cd9093b1cd9b66f70c35ab9d50abf61ca3ec793df774d54ad170e33502936f0ae7c7db95014ddadb0f5dfa22e731d1c2daa6cf6963338ea4e2ea4f33ffc53e9fba85e0f2ed185a49c0316a20efa8ff2e5daf2d37f6e4415ce10dc61ba0f3ba657cc8d696ab23b9a116a45a50a99cb241329551648f9211ef2c64b031b3ef169e04e0be2411abf9b20bbf3a15b1590a64008c3bc5b5d094db8fdac5a1b905c6aa327ff001b55cdff4911aa38ca37c82219f50f1dbb2d1bf28d3d364fca31583c3c4434b2886de56fb92c96a4d3c060b1286d5ce8c8eacd622331544e560ced2075fc48ff9b03560dd09d6b28bf2edb53ae0f18e46ab5dd9b0aef1fce9895272bd268abc8f21a4f9b4788c3fa80d6faa039a8da3cdc95e2ddc75f4c2ac14b856286182384c748d751eb992412cc6c426159e1419f05a6311c80531ae49be762ef23c3fd3be84e5385113ed6137aba0a908de029d0b31a1a4c0f368528c96345276b5622a94fdeaa1fd6630a21124bd9bbcc78c2c41478422d725c402dfd686b117bf082b53de9fe8a7a09032aa91f5f8c0415f700f842267804365bb2f4e6e724fc15b917389172515c185044d44c65cd10802abf17439acb1991ad3fceb510d3e7127d546bc4d7122162914a97fcd62b8f72034eba0f5ea335a4f147bb876fa568f6861b4e594933e2905994ea6a268728893a8e3d6b59331d50f772402c933b8b7f0b00dbbcf8ee0ecb5a629558744d77fddf6a5ebdb7c0c6e4b17947d4b72653dbd8ddfaf24c04cf435ab49a1f7954ebb46b1e43d84f20b3d34ced1e504811d9fee937bcd9c659c38999eeb0b705a0c7dc41269b8a3d3e9b9c7602c5cb70a0a78c78104391f6dd95c2c00ae3c5af7d5462b592829d26f0b80a82f98ecffa99b1486f07534f9e710ed9b4dcfd1597ba0bb42067be9775cd33472f7dddcddd585604a4f06b4d3d51f20635e0748ec4b060a1a73e6a0d313958699b6aab9e75eb2a794f592f5631c7b6ab0e5c9c73d9eab8bdbaaba508053a9cfa47d70997704608c28addd89b2e644bf80a", "0000656a", 1, 498820236, "39fc093e2d0f27826aeff11be778d86cb044260132d865def86bc18af37bfb02"], - ["bda9a4540207d161cad79b91d7c46466154dd34d3dd5e66fd9a2cbb80750bf97a230de90a70300000000ffffffffeb2d62cefad6f249b4b6bd6aeb7aa79f4afd91d5b94dbf4bbdc194bf65e1147d03000000076a526a63516a6548dcc580022871ae01000000000365536a3bb41e02000000000553acac65007b3503c902ddc98f0300000000000000000000000068af552c300226c68b147a51e76a186370516e56a024ab3835ad3af3c5352149bc9187056c93e3c3223955837af9213a157e84ac34826f32123b5b1e76496878ec3632ff3ce611f8666ff8b59413d1f240cdcf226037b1a84ba54b9bb7b8ba4f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c7765dcfcd7ed884b23c64e4a3d85c32e160c91a406c437d8282edfb36bb9f0df6cda507559796cce20257cf1c53ed88fca5086d6ebb19501ec7ce5cf5dd9ca18174a5a8597aac86fdbeabcc6d515fde5f55eb0f3f673cda8f7404f1c2c37ff44af34586eea65e841c35e178b0caef024f819fe586b4e6355b7466043bc8b1031682cf70e74a0e89618a1e53f6a0b374614049bb7803ab117e575908a13981a40219129acd0709cb9ba83b4125550d3919ab5334ec7f54ead4cb948bb5ceecaacc0b0664c7b29c4527ae6828c742d0266eb253e729d0347acd32c1ee478064f9850f381bc17a11e47f8c4246306c26249b551c7299a6c5662b66b892d0cd6ef4e6250322850d4a995102f41e8cc9405cfb67b9f124e657f71d70e0e9e4c86eda8448630201666a7d19b9b1d306957d16d8c5cdc0229303aa18dab66be8050124252bb964022824aa457ed2fbfbe6143eee583509dc2ffd473b07b43955de3401e4e87c50fa030cc859c5b690110b4eddc15d8d22a7739465a2f5740525f0e5f475400e7d607b0321072cb52e8fcd55b7d3ff2ade74cee08e41920c3b297aa06bea9472bcf6f1d781a908307893757d281345abbd617f0581c3134aa7712320683d0d3e95612432230eea4b7ceebf78b193a399ee2254823e79d30b46acfa259dea1058edeadeef4d6325c4e6bc1b5be0a851df4a7e78ccd7c83c958d9ca110e10dca41b87da37a95209537fdd79bab98618344f2e090b54dccd0a0fd65660a63efc75a5c1d38356b2e25eb2cf6f1c93255a474a6deb4b8553d3fa68d7892651b7e590836bd7d673f284e4720f5f49c82e3ce1208c913b7c56d40d22da93a5702e4d4fed5ea7ff4ecd2a0cec5f8a01bf9d9cef2522c0028d474a5d6efde006abc42c16671be6f93335ac11d9eb962c993119d546708493abaa4b67dd4137b84b478fa31e7805248c4ed43624858bffa886f20a8f63d25f82a8b1551060504e0eac2f6273a70a1a4c42ca20bb952bb4f181f2eeb02f19a491c5ffee837e2da37f726e083d0ad1f44faa88528ac598dac7b8326cba715765a59f9199dfd30a284a7db87d77d279743594a039dff1e616adb7315178817887e2bfb30a6b57abd0f1c149eed1f30d7fe243bc418a0d39ebcb291530ba51ec63a69420310e4dcf7ef5d7bdd3edc5ff581644c010990b74186bda85c17bc2ee95b9e5279eadf936ca6a610089a36fc97f11570eeaef2b8cbb21277d7d3c3785ce25e844948bb50bcb1b2fa1a5fda10cca47f2a11db03cfa65777dfbd46a7089738cf9e2720dc107a4c73307a8bab20351be729527894259613974d792c79c8ef7f58fa40220907034ac45e854528765776cabc2636005f429f480d2ef2e686bdb513bc103716b84d543ccf47ea06d707fb689167e440ad45b4db4abcbd8ffdb6d4d339f4a61b49a821c4829807ffa04e58488043ebcdb794009163ffae7925152dc8bb15463a1fb7d5faff7cdefb2e4382b8bef6b20d111f2e8d19ec769d04c3560a262007e8d226e22517a70202b64131a518882e0b016db0746afa0d148b0ecf6dd97345af01adc7e0304d2c73f5eff4603e4c6381aeda8a62c53472bba4c997865f1293dc8b11b2b7f241b48acdc8a18f205548c0d36435da0876bb2bb77ebba80974efcde40dd8607083829ff37b5600ea10c6ce50d5351d8981ab4f6d408839cbdc77264bbec1e7fa40b0a0d89ffa0518719818b05f69106f82ca8edc1006362318359cddf86682ef59ae98236e93966a824022a28eca4338d99ad9a3d1b345b86723cc8c23380f9ffe3fdf7bad810c676239f6cc602541421b6a54da15bb101f822543fe2d1fc58f87d51a9284734c4e93bd2acd5c0557728873b5928ecc7fb320e45649bfa3a5bd260bb2e8e782c0e57e105dcb215da4c3f59fe9d15dda890990a83a2688b363885835286b1f764b6d7ba0d2ba1afa3b1949855a05726fe57745a294df984973966c52bb7ab222468bbcbbf127a4a125fab54a3c4d17db39533401e5282347fb8d94dad0ced5019725a45ad88c57fa7d5f18cd69fa760001b45f5629bf54a424d9355ba57a742bdbfb8ca4cbcd11027bb20e75f614de134d3f1a5fa02eaf81417438491569064168c31a125bef39091f4436b8be1a218cf1997f0c2b3ab6231988f2c6efff5455ec47bb465f45539de4f6fdaf6d07f02ad89b90bac39db34360f423df5a1029060b649361e2cebac6b67b8111bb3017cf87d0517013f345097a76f7f5a55128b80be13b9d618fb7d05657f1f794e3f89acda2000000000000000007a21d0000000000abbdb0cbb1e56da31cf9e72ef0f494a4d80a796c2921747e898f606273c8bc38eb98b80c7c4e971b5af2ed2af9cf0a03a381463bb70828930913cd0e5f929db5d6b89ab2a8eefb032fd3401b1d50739aebb1ebe6bfb8f26dfd6e698cb8628c8300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a3a6901e3f32cc1d728d0a578d04aca19c1fcae5a2091c74f074a6df1b76bd1dba4bc683ea6678eb3f431bec0f6d3b534f34bb7674e750dec19f7bcdeee89a5fa61c68d18b674c4bf70c6d84d933b64232a32b62553bf7d4fdd0d9842d3944bdeed5dd38308d128db7bc6e719c248f49d6671f5b3735b60f03fff396aaafcea6022e4b40ff004782568aadb4a4c6034086500f402158c95d3461623dcc7d856f4c020af509585434fcd1adf701591762eb0bd4a21dbe22fd999e15ca780ce87593c10a02282a0607cab589720945ca3a9874e44882c1ab5c2f531a48274b7ebc49e8a61758ac9c945a3b6d0e263063de9cc725c8688ae9390a7313f01371f94cebf79103162310954cfee28e1b50064246ad45e660f9c53184f2eb266680c0c45c214fbd031f8d32284480118249f0981d25815148712a859ac48aafcd26009bc8a0694257032d826ec0f180a3e00bce54908cf97686357a6691b0a292d0bdd0e296cffe4f490211154effcaae2582e93a2c13429ba21f29b3e4dcd2dfea1779b250b9450af97203112e7f7aafa432bad2caecc687555ea372af18f7d5dc2395f0f595dee8514ee4f4cb1f270c8d1ad16d30b43fb4590e6bb2ccc8ebdd9594e38fe68aeefa8cfa10a6f3ac9a2e66723fc945e178e627504019309e7a7b01b817d3464c5f521bee72ebd09d574b8f81ff393697a04d0cdd518cecc003ea14bd7dc574d8114eb077632043456126508f1095be8e84262d42311d02f7a06b85977893ed542e5bc018e41a665c14c2293469baece0e07ba725fc9403ed10ab17e4c350ffafe2a271c09a895e666b39cdaff4b4f69f5ee2485b79d572470562b8171f629596d1fae06bdc0ec245b142ed5d3c5ce6b79ca925910ef7d17a43cf914a6646ebaabec8d8fa6c88371be06c7cc7945946bb101a75492f33cb479405ddd4c0a441886508d9bc728287391b250802c060fee6aff54a62612a6f05ac02fb4ad143afadd55a3c243a1399984fdf15430c063d3cb25ec5b68cbb0e53b710ebc02da1f384a5fb84bde4dd8ba1b57b3ca83c7cd64cf72a11a78e3454b616a5c9a9644e1baa2f4c456f332308a0c0defc91778eaba8010716820812a9fc6d08ce49fa3b83d636e3650db467de1d9bf0dc53b546c842b8e19dcccd8144e7e6395bfb48de856484665da1a4a519744a1876c3c82dbe8ce5e524a8a550c4cf937e210bed52f2b5ba261fe7a49626b66ad3bc434b214394adebe473116f369be2e9e372eed07d5111d73f62ab322ecb4f0f12141f1db9cd70cc48d9ed09fd0df6cd6acbd9a327df4546996be30fc8ce5c5c47db72b7cbc96329f03444ca739853cf42e24cbb792bd4c7091523019f9bab3a218a81cffb5723d8f6828e1df9c396aea0c71e681ee7461131c99ef307615838d49760a4113abc8ebe94bf8daa6680a2c5d090b0674239848bb852f3e831b6081fce881e68e0e7d8d9923fd948f0811005049b581506bf98e5cc634e67a7c69eddaca64d55884cdf53b4b5dbb742650a92f75c442c202a7fd5526d6ca6abea1e410aa709f2065a14e9f8322b3b048aad0609d9dcc8473cd52bec90d38e17c87ea7ddbec705d34a49ddb6a9798abb5f5b9df73175286f2a5e1bb10391403508103d749ca5b483682c92aa447cdfe567047b614f2d61cce96edd0bc6bb8467a81531ac29c0ea9c0d3ca4445aa85c5d2184976a4b850defab97f97fee7895cb30c158db4b13230edd29ae1a8389fe15cd491f1c4c802a9846d457842511e9f0d9ab11f9230836b295b230a8bb990d3c854c62d2b730c68f0ef74e80395f99c95d23d2b8ac3ed7120239ce42133e481bf5ceee946434680e0dc6111b27a341631ea55b4339724c9bfc1401754675949bac33d5681be4600777ba2fd63abff26aae09705900991c08f0ced305b842e838a9db26bbb3bdca67bd1ab42a0fa9ef916432c97587697b191d4e8535c58692c66922eccf10fe4118fbcc4190bd3c296f50e07957988ceb0a5d714e73f79595e1637228b6486e154f8e097a1c8703c27154d2d67e70f3f36f03345e20c0472baacdcce49fa939d42fb31453ed38b161889ed3429f0c591c67a67c80b6f792e83dd53501264e7b24e8e7095e973aa95c780054b40f2209d620cc59ebdbb20a0c17d3f61caf3d9ecb1f411ec0d8a3da41501f5b65f2bb3c6b55eb2444593919d780fd90ca4ec302a6255e848c342da3f8425abb4364c1c438de3d3c0b3ee390730cc7246192cf063a298d45f9b6790283f93abf00228d7dd57b0554c9fa50f9247b487ffb5ffd4b99c3d283f70f9141450ce3edd452adc30ab5b7cdc933e0980c28634ba6dc6138f55365bcdee191ca599b65b157903ee44aac5c0f93f9544b608477fa0913afa19b412b442f37feda5cfe1ab68ea8005370f8eb92a868ba550b", "52635253635200", 1, 968493269, "c41c1f7ae7df5e7789135f43c8e65aa54eb22c557612740f0409d647706d8b44"], - ["030000807082c4030436241ef4d9d25667ff13df8813b1818960f67462db27e2023a62a50d3400a9cd030000000651ac53656351b490210cc99132a4c785327289323676aabdc44366682507ad7b70fbd0668ad20a02f2dd0200000001518413cbc359a676e80f7b5dc2607409e426acabc245b9547d4f0319d39625d817852ef3d90300000007ac636563acac63ffffffff59506e1309f8025bfcefb1dee92ece277cd0996e8e85b19cac1b1bc4f59e982703000000096a535152526a655251ffffffff01c591e1040000000004636565532a4d1fc70000000002c4afe902000000000000000000000000ef187f408b960c8f96a52c149856cb61cd4fbfbfd10de0fc0976722643dea2e5e6683aa4ade0d8d23a1b1cda805d171f31fe24647674ce72cd7130d266697c1ede13c7a13fa1c35a5c4d93f69c90d2ccd254091129494d7caa81f1dd7c0d325f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e056bcf1b6d45a87db3fcfd7a7c1d93b0aec728993cf19030d779ac2b6a5553379faa027a2b5461801875e318b0ccf2d6bb39990e0e1abfb3476989a6b550403913984ede5d85c1ee600b2cb67159747c919459f374de7f9ad95f374118933e7a9515a163e002f936e1d3c3fe18589dbd7d9a570c14fcba318218b23d66ab50c021639c42a38e21e9fd76cc1c90438620b3a9134d76274c1903b0da6f2cba6769102135d382e0e1bd69dcc83a2e727592150fd08ae4aba7025333480419c7d774be70a00dd89713c08afab49f087298f502996b76c3d19edfec179a3d06fb10c6d0c56c966ecc3bb26aca00f9c297a98f5a95a8207c64a95490e0e0943eabf0155a3210204f61c89d55e941a7bbe22eb65c319601fc6010070643d4a2a09b0e19d0b7e3403018c0419898a3cadc47b6895ff136ca14a9f1e8f48d3f5ab9bd99f95f48c12a60317efa8d50b7ff57bcb018507f37293af273e02857289a2e3ca803dcb4933f73d020823057f811b2b3be01d1e2a674c02415744f9ccbd5dc04d08c58f51a0f76b6d032e21919a4b68b987a29ca2b40162341d35016a0df7a428dcad34e44466fee0d9a3eb8de01c004975a3854cf01cc89a97f7c9b087c34106ba3c26be5625203c92fbd96c7057b72985277778763e58136fe65138ddbf0691f04376ae88278791ac872ca7dedd365e4f140ffd5e90d0d11cc8eec39e657437d4d44dc26134f992c8ec8339c279b097470b19a7881445dc49073ff27f6fb8a4417b52f1fa8a356d27f5629604da1cf4d681bf89e167bfb3e68d17f5376249a7d01ad404a7dd803b2f5a8d142fce74473b9938eb3308ff783d48518440cf749253266e5594854eddaed39ef9d80bede3df87706649f3f25aab4534b4b2386136962395690b27fc20525a4ca6736fdbc33e108abf2663d16078c595192a13a60f7f8881c370680c8883774ab9473eb33d687db3fa67034c28cea2071d9be46f95a98b0ab20ca7cea92d755b755221248243414018ea21e3ef9fb15b2e6b716d5ed12603357420192900c6bf2d6a674600490ec0ccd543d0802df0411228a1e7a4aeb131fcdcc1034016ae2189336d25ad0efe0c406df2735b9f17c2e9df418772faaf105f055253709590017f363e32a33ffb037ebe219b7877e283666a44f2dc86df81d43a36bb84b26305b6eb89c9df56dab90c9c62cac3b9e5544b36f27e0b802378aab91ebcf990388df8eb1954b3fffc0b75795d571d954555598a647824efceb4971a55b1922ed771853b516f8396f8411a14860af71ac96440dc520a0c6c6c11d946d13ae0925e8c9c53f9ce3e99051b960ed90262264b20456bf1a6fd9c1cdcc3d800e0ac01ab3a21bfcbe4f01cf83b4976718f262e392decbc5167e08742b46e282f416fe8c9c9c1075f534944ca331e9058a38cf826e63b8765a28e20f5b16a27393148d7466d6748c7805cc4f35607bb17f09cf5248532fab5636fefb6b80a5573351adae441432fdee43514d8ca7e695d468eda1c867b44cdff70e905992cfc2e21bd0e7fea85d9328f128b8b0fb696312a033ff2bf071ec9bc147ccb90ab562ea4105262156e7fd9e321a951e6a4b66876a234babfaeb8920ded84c66baeffd98d33cb99e3a6deb4a7f5eac5a5a985efe7897a1ae8d832b3a245ae5cf60a1d18a661f8bba8c4785ab4b18524c1ec3196b7bebbc596c334c1b1c029033fceb4978714dc2cd89f9b7f0f8037557a7a99061d76157564a22866f87d721d04427919bf2a96edf97e8e148d611fae225062838eb02c67c69d9b9e41c07d7173d9360e0ba0a7f181a16bf464ea28721e41e5251aa7dae0545f0d9c051b94e10d0c8209c54a5e9dedaa39f222545a85415da090cd4324d753e11a784c0f480adea9c7574a58320f8f9b9aed92a7303b544d3bdb5653b45d8c359c9ef55171f2c15b7a7645f7757fd77b4aa4adaa12266131c8ebfcd4f825bccc1193ae887eaa5038db78c191d847d1f200e87fb182368922f00792416fcb428b7d974d2892b9a43a7ea4a8da26e16b4d0183910f1b98bc967cf7a92cfb0a1081521bd2f3baea688e2d0f56108022211887c5e138245735c9353933035baf5738a5ed7088cc932f5db4655968ed89326b34e77cc04cb30e35b2ca8defa9eb5ca38b213938f83c7c38532b06348079eb75b7736970f313d87a0d1697e60656fc951f864cefd6efd5861eac8f730bec4e682b20a9f291c40189f161108505295680352689eec8482e9e053025c79ce0d57eb589767594037cc6d0c927719ece1dc19a24000000000000000000000000002b168c22438de6d16169bed4aef4f4cfa40f809851feb196bf75f65a2f129c4395614f670e6214541d180452fec70c9a4df8cabcd1185381673646149be4c9f30a9d45cd1b791725cdf1a3fd26569c313413c9b9b0e668dc4f4b768efd510647000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004b292c721d081d0ae2603631cccf8f3794b39c667607ab283b15f4a9fe85b78ad6bc706186aaf899e5fbbe3dd1eb4b22bf2f80115f1131d25f7735de5b009d8a4ca8ae119de71521a583d4e3e5682e8a1c8c51260d160b73a5a89f7ba32f1c930ad11ca60d5cc1dd25f42a2e6589a79b1becbbf20257c3c8ff030b46d109a01f0316eeef91da90ada4d1f7798046361017bce5cda86d6f7883670948d5fc5a96aa0220b896b67150d0282c3444e2d8a5e9423eb8dac8ced827c093259efc3065de530b04f2ad060a659c7ef27d3c2e571510069916f722028c62b172247db7c2421b26f4a2f92a9202237d7b48645633af76446b68a1a2f8a6789912e9f3ac22e6ecd50224a5bb155f1938ca971e036b32c39e16ec8dc35e6db1d71cccd5809c67632c2a0307a03b6c9f78f809767bd004bfca1696c5713fd6254e8b14306ef220fe95b51f0214c7095703a79c87abb945990512ae05002e0b05ce6f59f546db9d3540502f49022ae578e6036ba427d5ad143caab5ab83b67d099dda7984452e17214dc58839e1022e1b80e72354e0f13c057b1e5a201d62d2350c3f13c86ca983d86ca5d88d543aa4fc3240d421c38f00273515d540f4ce4c82c30bc194164a4b1cf90f5ba00609802ded631e28a0347f40768da1bf10df50699030396714ac6ad5132e5e80c7b8656df21cb0032147fb9b7eea9e117c65339770dab3c3d8529aee0ccd9f69211b3305f9284fb7cfc5117366ed733344aef870927768e6f8373b6bd63c92ea93c600070a0dfcfa447e5dbae8064636ea9b7e845ae3d7ca2f98dfc36cc36a3e5563d667eff8d6ad922f62fadd7b0902a9139f3ca33e6f694f51737113bba036491b3625dcf394a1f90396f171f41ec8bdaf82df364b8d3f78a43291d91dfa4e67d8088c12a681163bb44047ddb42a67d89d1d0708ea365242b3b7a5ad94c5f67f2ed920c2d45d0ce9891729420e1bf4b79f3ec2f6edf7f50b4e29553c9d87896cfe378fc5803582f3d2aff4b59c9f0fa6afc754045d7bb09477ba6d2285e525971475705e9f904fa286d5a094722247779756b5f530541f5ebbaf4fe564b359db1c2944d86eb9cddf7b7a0d330cc51f120f747ee5b59f7a15c0443da44745eb8d557d7dd2dc56e9e5759ead099ba5ef41dfae3b4ab7877e5a701092adab15968c93a9649d8702f26bec5bdc0833b61ec2d1e683f2b55d83e475ea88373a0ff8cc1953528d845e27e1cd2fd3b66f3947e037b1b8d5c31861e784c3a6e32e7f35d1289ca1b287c340d44786d59786e99c44980484e6bbe6b5edd2bee88abe6b7830a63c253e2ac227a6ac28a4dbbc2f50711a2b0ffac737f6465792e37820823fa87c37e3b2cc9e716f61178910d5526cccbd033a67fc52899acd8f2503cebf91276c50d1cbcb4e2595aa06227bcbe3bd85c3fd0f4268c670f97fd793a20c267e9c380310c4bc988845bcb92abee733393443c3092a485c44a27a72d76062e567343c28a963fd44c771313b726ecbf257aee84a8cd1ff5dc5c856479ac9225f825d7177b8a306afedb26d82fdeb5f1154ed4210a524f25b52dcbe90656582c1966ae70d1a31b5f451fce43d2e822a98adab245d0c8e7b13bf1d3cb429ce28b0cbf69743fac430b5a454aecbcf2ec9e6c1d9f216d8a7a80deee52ee91d6e8be81be83869df297205060a5075a3f58f9df82b3ddee88ee09a288760ebbc59c266c85a5f9a652e6e6795498f4e8ef106b7362c9fe62b22ab719b4ef3eff258c2b474a49658ce0b938efd16c783462e4ffcd7fdfbc5795ba18b07bd776187b1c160b4d0a1f489a2ff6d82760623b7643b20c8c10b66fc74d6554e1035471303cf265b35740aa6755b9b6603980d04f5df3fb6201a99586421c3e770929265f26cca6078ea6492508fb40dd2f75af6c0ddc57762c13a3dfd73dd28c3d4186d6d64d8f11ff5ac91667dc4d8b5972629e812c2aa3e01d232531dd32366cbed776f6516e1816e5a19f83034214218f713e5aba2336821da361207db24bb08bc4865cbd94d8bbab1dfe4c6227b99de7b3cc9709f02825ad088e82de9a72f2142296e7e2f2ab79acca0e2c3148295bd4dd75d3da2d8412cf41c503e6ffa030d8974b69f69b94e620bb500c11961ab982d7394ec974cce32cdc685fb7d67b9dd7152ef016e676866a1a387974191439e51bf21401653195ed0402e1347a907019a145fdbcde9e21e8d5a8ae3c379c1ed08dbe24d0a7f82bc4c230df437d1fe934a06b06183fbcba5df00dfb1175fa28968e94b82cba9f6a6fec8cfa173e3ab9c275f803e93d2e457b845696a5f925de55fa5d248c889cd9b141f09fa342b7e4d1e4cefb7f6821325585d7abd67de2cc168fdfb2cbfefc8c6c045be295011205e6530abec999ef28edd9c7bd05597cde6b60f5fd1f30dd0b0c605", "52ac", 0, -1955523078, "3ddf02213e370c7c9973822121977d7e2ad81654baa3dfc064ce837fcf81f935"], - ["030000807082c40302a4db52c80dd87e289d431d6ab744c2ced1f9981dcefc5b62f5346fa022f5446d0000000004ac530063ffffffff3806235cec5268360b6bfe59a3726ab789ad61b32d7f3ab0f3c2458e59b6c37c0300000002635188e00df903fbb0d40200000000050051515353fba8d10100000000036a6a63b79c7c040000000002ac51468ee33423d29575032c900300000000000000000000000000b57452cd68591df1976774dcb805892fa2d709e4fa19711a56cd55a8aca889e398044c3f17fda02d1de485cbe85ca1f75dcaaa0b3c832677edbbc2ac64dd169487180c567d19cce7fb9834a67d0ae69e66d7c61be0cc7e8cfff988e75910198f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007da6c5319c8a017f58ef1b2f6009fe77875de77c8c97dd01ac08159094b06a6a9b3f8c70822346a97954e2a19b79c55f00d04ea0a374d90290770cbd32cf8eb0c2da7efe16f849354b3a5eb7ef8d2bd7418eca94930b1da9d672f23893f6d89a0b0adfd252b647a046b1c302765048068b9fec8f97de9626f520f28f3b5a8ad202055d3920e69449e1baff62467685d670097278b803deaddfec6ba689c5010ff1021ec8d20e63800f45b25bcd6e40e50cd1f6bc2ca2a8a801623038d9cb83cf778e0a069398a7ba27b2000366c57099812d504d6a4a57601eefa892f834334521e6c7f4839f8bc72f36fd3b373b69236c1d99b3e9e8ef11ee819f00d08b1b37cd90f7020e9262dab1cf7f8c0dcba6ab90a166a8aa7552796326e2783de0daae5ce37c84032a9c5c83b2b7e2e40fc7255c44bf3a3077c7399d5b1f4982f330bc17b018e6bb0224d8e2929c8bcc14fea109c907ebb4c1428fffc6a30daca914996de1df8500df020d43a7edcc1e3b84a365bd12c5656bf38d59055da653bbf1dad5ea5432b063d5022a67821643b993f88291feda2f954b491ec588c6d17164115bf612d532de06300fedc2c410bb1378d5a386068bac1a6175880c9d0242795751e509e711e8cfdb9110370d6c72843ba8a8c5e1370f6c2255a95bda656f853820f89eae44673504911789f135e9b1ef5308391a92b87aeffbd9dea0255e6a4a310adf14d51b4a2d48c1a0555e2b156939b13559d7d474c79f4764c6deb5548070bdfdd56bef6adc3ecd92d59065aa3ebc8ae1e1f34e6eed403c0782c397bd3facac3cafa5cdd03ade29591039888d2ad5b04e03c59e70bc9919d72dd319f2823617a3af31dfc21b38b8cfd21012a8d2655c032e6e16c7b030c8b8ab459c96ac275281a871ebe2a92cfa6dc3f25cd7cf7779ad06a044c3e86522e61b7048705729762e29350f243bbe46ced2c9c52151cc11705a1691977996d182ea7fcfae5a6d81c1d59df4ee49b80ca630c338c2d9bf425292030dc01a80fb021e2d11b92c0eeb07c80db9e6419bd5f3dfe28e890154e40c4f952cfd6648f9030722a1cfc7270bccc8aea536928c4c3ca0d26f0917bf99093eacf91ffd2ea1eb75c2f412a390eac1ffc43dfb12da9a591733d77ea1ad60c0b9d9dd6698f0d3780f86a9396fbdb3d90c9ff40662a38bd1a91dccad8bee4fa0cb9ab72c0bd0d4ae309e3b5a6a248dfc6f637e5534311be62d57ac8065b92e34411bc1c7984da4b4124857a963c1e185a772b57ef6051300d982113958c14746c25a8b52ccfe5f23906c995b7ff3960bdee382271634d6c33bf3255bb5e34344b93108cae67d7b60952e535532def9c5ffda21069ccd031d29d3a5b837b9a014838387ec2a558ffbebd10c9424ee990f84adebdd3b04d2a0af0da0a7c7de9dafda55243eb7211c284ed35ef3792ce3359c1091c0caf375cce3fcc955fbb1c2d61a8ace4bc8e1038a63ecb5ff79c2537c6726eae13f1ed465c3f03ee33270bdd8afadc67137a2be62199179f6f7c9df8729f33542c0e7ea6c9ecfcc06712b1f65579a211deec275d1d2f885bb2714703771ab436db6149fd4595cf37439356d7365523f84e01f10f30cda5b8b74a7dd6477e31a00bf307d184dc34787da25c2dcce5f6295893e090779f2ebf660e8035a5e55b627528f00e3e4a7475e473aba76fdc0a5781598eb5376e771edd066cc7a0fa326c059b65d8e20786b9a0f7a762988fd1158ded74c514c3583f3090be91fe0a174cec6164927549becca2443d4b2b2585328a78b527ebc0386217758835a9a07a27c87a942967c202936c7b656b477b5705f0119c46dc3d24659228a7dfaba39f141b58a092bcde8eb26f1c8f11a481a508d4955cd62d7675063abdc873efcb243f80c353caa93b967faa8f605e6bd3c1a784af8c14cd21ec29bff35824a6b7f0ddbd7bfc4000049e12cd45301c6031790415b658f6a7a0759d65ebaf683b5a951db5ccbce61d99da49bb3a23cfe665c247c15a8bcd70aa6b6fadfe60cda14c7a993e3ae8abca48565a1f502ca28be8c310d805c326e636ee1c61fdbe69ca63eeb62c3963702bebd3539767ea8e47fd931ebf89d06e33eacdc7dac911bbc1c102b07f47028ff265e4338591ae4c05c6e0067d8a195b48639d5206a0b319fd72cdbbca5c539fb994920fe133058556fcc1126979ef59da5ddd6a3bd3d79abdd486b14862707588134a39951d9fa75b1393a260be34b28ac6fa413df9372fd850445de08ca2a0fd3a731124c61716d65472658c3aeb70000000000000000b9e2ca03000000003d1623f1eae5b97226f6c81b5abf90da9d2ab2400b50ce1b7e0f54b7bbb9b643efa85871ea2d3a977178f623f3d0498a2849877a9800e1ceadd15d88fd0417ca037e85163afe9b8176ee6cbe8a5dbf778fafb7aa8dd8c6f0e9eaefefdc4a085a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002942bedb492785eade18c8ab64b564e993bb44e5df4ae96938d9032b2f04b9375a1ba3e85c791fe0907f346f66b15ec127b7c8995bc730e0c5e35c0c199efb95d403f993e26ff1fc617a3b69c14e113cc3c21fcda17df1f1d21040dbea0e6918412efea6c619032d80b13c2dc11a88533275ef162ba75bf9c79c12c776a493bc032f92777ac707a8ceddb804a20d80c70746a83250be2cb6bdc05ca4d39d273bb303171742a85315fd62a75423fef0c2bddc3d662b4d3b236f5633c72b74528d90f80b05a17b2efe54ffcc1fdce0862b7d1b6ddfb08e16a6b63f086fe5adb16a399bd280980377a311e85ada55e4f198fcfc4e712c22c71c479ff455a9d4c35e21c980020c61672a9788526599efe960a22d27e92a0a44739b69e25603ff98ad2b1e948a0325bdc8875978227dc897e3504131add7e1ec5bdbba8f1eadc69827fca9746502020449ff3b23ff2b709ef47ab42cf131c6c1748d3331e34d8557e58fbe15707af0021e5c422b3f8b9245b7aaca387809f949550d6a5c600669809cdf9fe860906059020c6d3df659e5edc28850926cdd150879b4bf32c9a48ec4c42067fa8590ff766924eabd6eb0695e6dc06dbfcdb28e2a93ad98ab09f670fdbb578ad61ce1fb570b3a6b33497c09ff083fdaa4a9016692e6f1db4a6306c01b38380ff66cc2b10ff1ef865824808acd1dcb2b2956889ebb44099e06c258a69978606a897a402030de98d3d30136f1c0c3fe224592469606d5878f15faa212de0688a69e4c094f59bf1d512ce5bbc7bbcace2b288b465da32eb382f2f1bf23bee20c1e8d2ef28199478e7342937525a7d7696fc98d886e343877ede4a373f67f9cfe16309b7bb1ea8b52bd4e8fe67deff685c6c394f301a8e50def89ee3fd5bbf4e179b687f599ae59f58a5ea57d0d5d61752e3f6d799053788fe9592a930929d9eaed70fdc8be043857a112a27d26cf0429b0f7c5d2225d17bd73dfaed271b6e8cb1aa1759dc16b971e356aa3589bd6ce8b1931312bc9ddbe916f1cf5073ce4548d3e6f96538311b1a84c65d3c5ea6824d7ca8298833a7e56f06c8306d1b053aca85ce891de130792b522fdab80c7c435ccf6490b0e73e5be2ff06e2d831aac9a9f4edf71de48f3b6d992c2b8c189f5c4fdf6329e0c4689be7ad1a8e56ac5714a27c755f081eaf83989de34992997c8e2e0e6f3c2a0462ff5534392803b7be4aeec99aeb984574ef77d4d3e9808ce2e5a3c0859d7f0f873715b942a28ee094276cdfb6d0b69f731ae6a733bd114841b2d35446a9dea90052d7d75656527d47f13457b5c6b9d717b4dcdd28c0fe5ce08f092f6d030211086c6f2a1cdbc918f7728303894a9ce4f0715da94c516727820ed2b748e6cda6e926cccceac1aa67598d7591507919cb2cbc9979c0040c29ab3545b02f2948b1b697e614875ac946cf3de2c4366dd8abd4df535876e41f46ce8464f732c16918c43285fde0adfddf96fd05dd93fe4e090567268792306745b2d1e637a73e93b1199cf86dcfc786568a986d7da426d83cf9868abbd3c72fda8a601a92d9d12d51899689cee5747f24c1ce94d3e7a894d46a2e3304cbd8a7d8ad51103a094e9d9a8e135d587efbae88371e855adedb0ff01a8977aaaaef813fbb8caebff3f9d0c2190033d66d760e35313ca65794b8dc415c23d4bbc88496694cb754d320482194f6c5549599058333c22bc2c448d6bc61886e5d757d52319c1d1e0651475fdb9c8aa54e908dbc573b452e8e97c726224b85f4df7251ac8b5538000bd783892113c5534cbb6417458f4b041a7372a682ecda0aaa99d254cbf4933073f0a59305719c90ec27fd31f4361e23be78dc5d0415e1405e5ebd2e50b9c6e97cc17595c72100a56cbf9e4a4a97680786e6b6ba170eba6d8b22e888bc162e473889d2593fd6e2d5f09cad8fbabbb4dc829fcc2e99c54438e277b91d135914e31ef4ce74449cda65ea25b799d779b5c52b744053c07ec9e4ed6bd4a33b4003a823f3e2fe1d6dbac213c7eb89fa61c422e2c63280f032fa9493c4ea5d7be57711c5f95e8b1e0325473bfb2757f9c77cc1786dedd85ed45ce753b16c487be32239970a33b318ef26aa1317ba6bf973a914344891a929e33fb6a0c60a0f6bb941be22c13954dd4790750a7aab1edd7389c15d32c82404549a029b65a2c985c9eef46ccfab5a91946b327038e1a882f0f98491d1377b7893827ec0fc4047e8c4f890bf33927a5e95e04075e0647904499b4678eff7ee5686f10af9bd71c44e329ee19ebcada2482bb8986c8443cd5cd05000000000000000000000000186a63926ae968c10f90ceaf00a9b6be79c963d3d1f2b364c3b16ad837f052319b13ab633108bc9875d727683b30e85a532985043d4b5f49559d2871eff447fa876cf1e78ed7b0054d71c5d40ad0bc4d63715bf50eb4f548982e88b7546cc861000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a639ae0602d77728ac414a107ba8ede4c12621826c9932a635d96bf8776acb7c9c980a6e18972761aea4882c20e687f95dc5634726b12416c8c89e9cffb03dbc7a9a4db2864d39be585060b596f967dde3259ae5d681a7645b566a6df7b39c0ea6d8cb7dad303de4ba6240ba4bc65b2752880e7f448f0261f9ff9802e505fc2032844da3b7b173e6688a28062593f770220bcfad5b9adaaf5b748da867048fd9f030e4730582aa4e29ccc60751a8e0d9ad24c91dec6945d69561f89b1dc408d38b00a04314326ffa6e405a31d78bb7a864f7a1c71d835193e006db65170a63c34aa77ffda7a6350490340be5d65e1191b4e2cd729f57c8e6e38617a7da1e39f1a3f54031b45b4c2a1784e2c17874ea31a1e3d837df76f545d4ce0f52e89198105fc93c7030cc2f85d0762877185a5887f0e2cba401c6774b82b412158c1feae7f67cecab3020324ad2af81ea11d51fbcd4bfe212e8d2dcdf32287a4fe8791d1223fa7b31f400310803b964bb29c38019cbb0507e35a3f436a59fb03f5ce421d71f3cc5e09f21f02286c5e2b5af025110af37cd11547a94feff5abdc9e02a8211e9068afddd1260a835a432dd6d3049beb025b03cf0963b42c2debb955231fd462072ebe86029f65137b8a5d101bdca298680f7bf0dee86779389d1fa66216e291a8e1e64761a155c0994170fb93942ad852cbd52c1b3c25d4f89594e8b5a2fd0f5d706df359161bada77bc6026ed198c22b4fdd5dbb9da1da9f763cbbc17f0fe18e9880c8204190123cd2294f6cb7f80575c2c80b9b24fd821f257cc3fa388b53207b1c74c9354e5035484f0b9b082f58312e027fd6b809c2dcfcd9d4154729a1e63aea1e3e47ff422ed77ea6d18ec669887e990b59a1786793cf86c9ba94f1f574d02415faba0c0c66849a6636438d61a85d1c566279d621407f973e1f4dbc01cd3f10ed3f527dd6380db19276e54a481eb800a8995e452633a694025fad680b383f0a23260f7953dc549ec002fc1f2cf011ee6a002198b08d0c86fca957de4fff099dc00f42a7cef82e38bcc4ec4a93df7685fe5685480af0b1b1bb5a2c5cce138c023657c001a7b7459f66d023304df7157012ad4cd41d9468115051fcab1fdd4e833bf885e5521dc6ec50eb9dd84dffae49a00589266ba105432b2f59f245ed55173d152389bbeb36cf1bc48aac02d0a54a1a2d2c8812f846d336bebf7cc3af721e5fa6519a7d7aaf1264989e5113a0289a079bf0d4d5ceb160b033550f8cd28f7fb972b0dd3e569db4fc7c73a972fbf3f02d8babc79b64b76996bcd960dace28956affbbd4cc5304ebb495b23468d5d1e59b5d1578e13fdbe28178938160bed4da2b529bed70dda3162dffee1ade3fbf0ce444b60364bc74980c74f724deb149be2257f8bd1aed50471170a220e6f0b43f5496c77a1ac7cb60109584d8b477f656087d13a0dac2cabfdfa296c5e4446fcd29bee0a64c5940c1bfa9d6b5f92b5d0c5aa4115b87f5529691b3b5bf7fe187b19b270349b7436aefb5515aa7dff5aa51b63c2a7904559c46f4ad24e2c95f820c2ec032b3c0aaa704122165ca989c1c122ce8d75b18505407f1a9749c7e4a7644ec7444f0b685ed07d61ad2b59a23b8b68fb7ebaf0f2cff03f5d4bccadcb8f84b068f8fd5de800b394bf63c4d91fdb73566047f630c2cae43c1c3312d6de33e53c82783883df7bb63e923a2b665478b863b7c1380b2597b02d44f0f631ba89ddad0684c914ee01826b9178c9d9fb79ff62e46a346712adb20f9c52663bbb80a060743e34230e8b76634b9f2f9d7c71ecdd1e51e7a331fc4b603d450dd2da0e3ea7fb45435e09dbd7b19c009e19bf582ee99f2cb3687ceb84a9e0463c889ce311b5b1bb00e25f011afb383e1558233f484a49788493f6c2585f1df190ae4315210a66153a079a815676f4433907b6da8e465dfeafa2f1db86c05ad02c08c859c6db62b7073b1feb45cdb07788ad7576995bc9d80ab5b91c536468e5ac7b82656854f2f39b0f72f3205e82cae0f2cd71daf2febe8bc4338e11fe70827c671a0252142e335ea433eeefb97d3a64c2fd388b99641a36244aeedaa6e2f5890c8970d95d8627b9f65910c9f7eb7e92b32ec801dfeb6d12a4d24adfa370688ebe601a3b19c7985241898d23226340d0221022a492b53706349f7e84ee2466eb8f36e173631c8d9f72a3d19793355e07f147380f099cebe79e45ae42279c6827de864f47d61e91aeca6933775bbfc68fb36a9ee8d5f340a181053d28ac79ce837896fc7a2c6874e3d34a47098fba5beee3a3e791bda919d4fd073dad474bf93d763d7c4ae03488a73917fa281b16fc89c95c1bf1b7beda84e88ec158bdbd09cbe340fce573eade33f7b1df879c6684cbeade612945fe12ab64c3d822e062c4064ba0f9e54dd2c17c31304", "ac5252536a0065ac", 0, -1822856170, "4114ca03a256bd594d05d03bff27ec38eb22b9abe9b83e4c1b2b81daaf728905"], - ["030000807082c40302a7778e331aa44615dd4bfce788fa9155c25dac60b1574d365489d7a86aeaeb700200000002acac888d61bd554ae6310691470c0ed59ca766a495e6de3a594f2fa12a1f04d1a18d7db380e8030000000552ac635365ffffffff048a588805000000000951525163526a525352e7df1f010000000004656a635306d8d701000000000900ac51525351536a65e9410b0400000000015200000000000000000304a19e04000000000000000000000000a48b90b107fad2e9aba86b7cb1fb133a646681d1d87809e37b185af8cf11a566bfdffe08c190af5e1aff1ed383b21011c10f59d09cfeec0f8fca280652acf6ae54386c20e0fbbdc5e0c8b5b9a3eb5e36b5cd8eb1a75a4b7549764d3ab22777110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054f4ac70006e2aefd0178a8cc3223e89eb5eef4c6c1115ed8bddebd00f2bff873a49e36419c5ee4f4e870412217d54a549a2252bf8335c1379ce084d60324cf49d35059ccb524d79f109c058b6e7aa3fda8e218989484e1fb0563d8c3b48d138b4fc415d2a999e9b33faa826ce880bf43c4152f1278071251a933c5e00cade2e031d115684bb92c111a9a983d099e46e7a833b6fc150fb8390d98ecfad37d5e1bb02209ed4944f41db5842b9db35c53e8ceeff95941532f93fa531dddaf6c51991570b00ce8d67a34b6ab39b119dbbb364fff93c997adc2a0837a0adb068451ac9928141a7573ca857620f1f13738cdeaee53fde43d328a26c70d1b7992149f60c4a4902093e1e869eeff81dd25c0a9f5171328ffa765aa57df07b22b8776d85a159c554021e330b73ab6d8e07310ce9a375bd55b91240140e5eb767f6235f6952598fd5ba03275bb491b9782785b6907216c258d18cd58a88ee6655f5493c9ea49f7ede343a0316beccd47b8b20e784e77619f61cb0adbfaf69f4b083e0a26de8f41077cadd8802268411c0e47ed8f1bee5e993c37554236d78a42123253622204068a0b295e07d3c1a0dd7ee0fb44d4f65c609f4af73a5fc49a3abde8343e522d9cb689cabce83cff8ff215e555f8afde376d53d13e169080373ef3e4b6540074e3a43b25ef814c33724cb4ad4365435c96ca43f8893416bfe09558955d5f2d3495da8bd951a06bab4ef4fcd48696f48f3b67fd6cf1f719b631c7bbdff08a0f8fc33d4124116972d15a4659ff48405e7f3b9a34f917ec9e1fd7c78495c0ba686d70c512da6ac12d505bf2ab0103d5dbd6c1cd3feb67e441304d411e91e6ff50be68bb93e7363ec2919e73596726a20e66b6b1de0b577797c4626b3d557a482d812d61ae83114d1ba144b68565558725ca30ed7d14fef043f2ac0c2e839db2157bd63634bc098472cdd707c7c55c66b2dee7cfc78b4c3fdbd6aa1bad469c6e5a63766da050814d556b29f24e45c2a68fd9f7a37c3ff65ea65fea00541b783d0a8f355b21c713b2193c293a99cb60d17aaa2af91cc3a7b18b2f40e4a33dce95f66581c43e1564948dd1e8f82450eaaa9663cd528b53232972d6f7cd2bc5e07096c31042bcca59d7112bdb913a5ed96fc2ffc1b4aabd4f149fc4570c1493841d03006a2ffd914628e767ffeb8333d9c6e7685c7434cf30d6e211304a386b0317fa64e960d1979317292ec1371ff866030cdf81eca76c9a76013a2f01906a549c782823342c74a7a3a29382dbf50165696165eb1e0fc94295edcc0daec3b9958eddf35aff0fd1e54b055decf92f3a4de24862812ec164b4c8c94a333f4cf6313600853741d23b281279392691e5cc0645f8f10c6424e7bbb994173c261d61b502e2139cca3d39fbdfc22e1d8dc3b35820b6dfcfe691a65f28c5cc7e19f08f2b7d63dfd448ec023ddb77e1e8f5dfe8812af6377886d3dc9b369bac2ed769f75781ff199b01cb2c8770e689e85f756fd41fa2e4d0f7b59cc2347a10e16456475cd0d3f4f07478319ea940b02522b4b9ed6fec6e96e75e1076c5122eeefc01193ff66f29aa0da43e8863ff3d30c4787c3f9896303e3cf95f9c45658e1635c7df1ca4defe7e531d6fc8c7ef29c616f7f018d0aefa5268afd7f35d2100cdcd8266b2663bba5822c6d776bfdba1f7a8288211b68bd1ad13d329ccc1228512af5eb156c410cfad40eaf824cd27a4aeb50c9d00a5cdbb3ae823f79628ba05510e5f2879c30c7eb984581e689dcf13591fdd38cf818f6308d597737c7bc07151e12cd582efc62cefcad434ab6b17d453470febb925f411448f85577434645c57f23753d11a8ac8c5349559f06b938a8130fa18a6c386d08c2f378f1b3b9376ff88544e01ab49a28ddc46b02b6258c38a3826cc8bf4d2de7d12b2e54bfc2649ea7cc7b37d53796aa4c3c5003fc4c7f32119a4bac038ba2a110058872de9aeab005dce38fdc2e52be6c7552445e22476cd9474d22d5f3c329247f81c86de6aa01386e0fac5e7b8c9865a72ac6d24e80b4fdc28f6719d6236a288b2113cafba791796449815e2293917894191b9be1e3a82c0e80d24e2e90399a0680e77c925b1c40a814100a006cdcff08dbec1f34da91f729977c2c38efd964d56f5dab4ccc42a045b7c305f0b36df2f7f3a928e10b4b4b408f731939780e77e6706daf722358bcafdaeefa8c29abb311f2f58873f72cef68df1a0ec02680eb59986f7a2ea982340c897bccc7dccb846398b580e19fd4f8f7b12324ae288aec4742185dd4116600000000000000004ae5940400000000ee9b955be517eee42b247c29ccbffcff8def2eeb9c4943e00092993752ff979ebc03893ef686feb5275d36378050b1a13634e99c9e692a7f6a3296399a5e4c094fe8be5d86843fb7a1849286c4b471799b20aa243bee41643c37784ef3b7f2a400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d063ef03992d598a95dbc0e334843f6ffeefc3953df5eb3966a85272e502b541517ad373fe8746969eb75359176f934e92e993279d5fceb4539e6befac9752ae5c3bff0295da816bede9f111a3d8d470574e7a35ce27ab523b376d1dbf235beceaaa20273c5a567a8ca3c306d1b3d98eb805d0140d0fea405950df22323a3446022ea33f9b919399ca85174f0c1679694d24d3e467b9fde7e77bbb8b635c9c246f0215ca36019f72d3cf02c173b350a88f3ca7f4360087e01c0957fa51c6306a0b880b00e21361e89e34edae48bb876cca61f47613990e58c8d1d2955e1bcbce550d2c94ecaf770bb65d10ccca73ef8ed7c49f8fcb11b3aebdcead53ed704b59214b0f0306a8941e3e3fb6adce51efea1fa42a0649c677c08063615098f5ca4de57064ea021ec430605ffbeb193cad4c0be4c7896e91e6a400c523a0009a1eecf576501a7702016eca7971627abf48de6cd50ffbe1fb564d73d974ef9fdca3dc5db611895e9a0208e80b8b3c8f58bba07de02a66b411b6bc5d3abf7c43ac32f32546fad6ae5d8202150e6ac7f1e58beb5b26edb9ee4c06f20cec3da3717e891591d4bf41178c9b307195e58af398effb0aaf025a94b6e30ffb2e89a5b032376d8fe3118afeb56101036b6bbbbd5d9c3c43a7dcfcc942e74c5e97541152a0924bbc818efd6bc7e20b4938c677959f9b83572ef181345b6454acbd2a1d6440938e4eea5366ab044356667ee4e8b84d8e26f83a717be859de0fb165f0c959a55e7aaf39db42ae72f18cafc47d249859bfb53a75aa4726147275fffd6cb1d8984b3016395f524c06095345c162cf3e8270022e69f104e696ad52439982185f459e21c1b3217a2faf4e35447baf0ab65d9bd53ca1675c0d6b9f5b35a42e7475cb88d626eb68cf33ba525dc79bc542ebce4daa4753d053a44c904a332f5be3e4bd2aa8cd909d69d7676d3141114c6ec9d37d99fa591931be083017e58799b69a9b6a2beb6216c6f41f7724e4a7e8296ea3f9ae95a0a8c12d050eb88fbd5de1ba5254031bc5e25069f226c07a910e2a4416c4ce1767a9878a55c6e84750e40d487c1d2552695f7ca92f4fc6e01c5019137c30ab2f39085259f73467841554f95acd6fce9d4410ac6a0ad1094ad71ff682640db14ed4b8d8c4c4906217f3b94110dd8c195dc5bc14d2b2cac3c7b57fbd4aaec301a6f85203a027836d187ca5adcf5da2e16724e125974196894e0a44d633f5f4b53eb487ea0655451193cbc98e39d56610cb7bc347be44c196912df45fee4f20fcb5080c184d090fbeb8e2bc3a9e8223cfbf107771d73e8f033efe32a7a456fa0fb4faa3778e2fd94abd09b520e7d797acef9b2d7c414382771c90fbd0cf3f6a514491ee1db484474ebe186e1eee45bafe838dbdd3e3dac4f1fc232cc6cea036a95b0828a02db9f859891dbfec71a9aca2041d11e2e93c9fee003943febc8b12e44ffe043cfff882a7c787309694428f5f27a86903dd252755097a235644590d4182cc552ceabbfe4d8ba56d944e8f0987618213c9a6f50684469c9f4dba10454e66cb36eda7deea3ccbb855d0e29cc0c62e0ef42d09566ce5100e8c415de6be18edc887ec3bd6ff31a2be5d2d7ff8211e05560c6f635487319691d1058f175bb7d66fba55d9796f6a6f4266126761002bd767f372e4a47be5f6c51bb13ee6e891f7e05f76ae8f1154a8b68bb2e49756385da9721a098dc67b41699b8dcc481c05022780d65c9bdc0fd984d99bf19c44290382aece29fe69829792d66ea7aa6d89148aa44441e75cb802b6e9ac224bab80ec6ee9642d3c6919d0b3a4c41b7666f1fb33d70fc887aef2780cdf735cf94342d414363b392ff1d1d3b266b9a5eba3bcbf9ae0479a8c9effe6bd592fa079d8a6097465d855f6c33affd210a85bc32a960745497e6dcd47ff5384301e39fbb09ba5d71c0a697943f727366c76f874f0413cad1b8d7689107272ed3606a5b8934fcf68cc11c23fb27ee78466f229f645db12ca8f1c5342b61fc5ca4acc357c9963f2483784a759474818ede6b4325bae1360329d404fda57822ded3dd16b7c4f418c6e4bb1e755c43db9891cfb502cac9bebccb0f6f261626ac6c53ba565c3bc78824a4273a0b7971ada72d7377889e2ec7db1198a47481b8237662da1cedf9635c362334a1605aec2e7f93d72ac4a105e45171b034491332c630c7751988e754519da184e1ff02f39cde5359f436c38990d1e8117a8f3cf6da1fabc82b1b36dc5df3167a8bb7986d55e6ba95ffcaea00f52522b5a823b100bfb8a4327e505000000000000000000000000f2e88f70f06cb0d9f9c333ffb415cb8c25e2f5427e366e90f1b50c230460154e334f0f032799248219d82c7bdbe8054bde354418e7f9acc1be04e7e2a581534af6cdcaf32265187962e9fa79fe105f4a2a1cd97530faa9a851525be59b0e22dc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ceb594efd9a4c00aa1a0685198b2a874515661e6ffe5a1c14aded20495ba8cb2a2edc06ff898e8e71ccd22f3c1735d3eb1540854a727fc623ce15dcfecf107003ad24a1b4cfc571e3160905df2e01e29b0d1a40c0837b5110a550ba2bf4b1a5534ef3f20793968fa1c0a7dc509c484aedd16c0226cb29fed20d23f7ac65c34850202d05b5dbfd4ee05670708dd100ef3be1b507b7b1b639ac3bb10453b863b58cc0307be3d84bf074febae24ec6f5f2629c9ed5c2e8e9bd5da2e6459d911eac551c80a01b3ea763f54719a5b9446732697cad00e03937b687cc2d5f74b81bf3d5a5400da07e1c6485cb27e489aec635dfa865e30eebfcf25fd1eeb0d8febc7769b7af2021f222c2f4308fb139352cb3e6e1238ae88d48c42208e0dd0a1dcc3e068d84f430317937bd1287169b68b95c2fccc02a3e654ffccdd28306e189898c04ad0ee77180323feba486fc5fd454527b89b120b93c6989d58d537ccaf057e21d8d137d3c0b5031bba92815dde2390a2cd6fad22f1c1b7a2485ff5632ebfd4e17133d541e7e5b5021cf916f66cc9d6b37c67b8fc4022e5ead3b1ef1a809aefd91d2ad0c869f5e0259cd0579600286f95bff060d5b596a443e78f651ccd7c33e1435aea3d2e952e69ea77110220cac3f05d05bf9c77f2ab8c8d5d0152697d8f166c1b990df009f2f1da0d62c92c9a39e9401a82d45a8b5fe5bdf6db3687d388efc02676fe96d57b3add67cceae37efe7c8c713863fcd5709414aa1cd9a8cc5d5937f087aa54122cb96d9281efc73756664861eee5342ae58ac87809cc14aa677ab7848f47dcefaa7afeb7595d75bf847524bc09258afdce007eace5c56573dfc0b56d8272fa59875602486489b1a8f1a16b4d1a0ec0f97e0949bd1cef2bed1733483260ec4c1d6dc9ab66c192dd123edc68886439cf6131991a919bc9984b779ca225cf83a424c06de88712beb5333bb36de3014f49a1e89cf24d790074b280f00b1b41705fc0c67ab112ac1ac6f73d625239513555610be8a88516e8004366c931d141cdfcbdd6a0866ac6913459ce3216c9f45f089429739950d4f96b589b63b30e809c641881835a5e7d66a927acfeba351aa29cf91b3ab3fde1bff392efc16d3164e832a9d27c1c8f5e05a03b6a90f927e36cb757f42e01b09e0763d99144bb5b87ec6dccdc928b83ca91071eea72f23e3cdcf9eadd01607b9490e3702e853e2afaa402457a37698671169dce82972cc302e359b1e8c787847efcf126dcaa6b3287d1f74a4a60db04f06b8858e2653c3cede6f1b5144733ba540df0ed54ddeaf0a8d60106798363fd5f6243f39d229ee6062a88be959c06f64039d9ded443955ddec33ec93e437feced008a0d0a5b0c9f3e08b2f08a40f70e03045b5632b43faee08927fb06fc6f4de944c68a8ca528e3c8652849e4932d1d2824d70343dbae2aec9a67018c7f4a171b80891973f7e146db0b06a1bce81e8cce5c2a2db1cb178815fb1ce2ba255f20a216740c6a68b1298196ba52360dc485e9304ff17a69bd94a6bc49c304a92686ca95f14e04d4d03cd4c2d9ef74aeb832aab87a7d58935bb76c0c753630566ee3987bb3fc63e96297c73684dfaef4c280c1bc1bdd0ee3ead173f579cd895f48466bc7fa8af0d0ce922dec51d2c9919602879a1119be97332a61f070dfd05249cba95565d78fcdb60d2515f9bab4685cd52efe518ecafca096f84ebd002696739dea528942d8541c86a9a8e49ca948ebf403b1b8021b4ae7102d39c5e6f08d888ad5b0ccbf06c47e2598bf3c3890d24f2abf0a811e2aba1c0cccba79982bd1e14c163087ef24af36753ff7d862919876dae693b795636d0cb7417b5f68c414c0b3c17091c588d8c86f0401a8f865cf65401bca3dfe2489eb88c9a03a47b0800907dc8aab6e0e4bf43edbdaab777b94600dfd125e932a2e3d99a9a1c4806a063f4be5065db7be9709d6abba45e642a969c8ff2418c1645f7c8f71e7cd024a8eba1e0d12d07d0092405bd32db298257be6995c15d02ef2b79b3b8b5056f3f78503024bf7cccbcb57896ada851610bfb0ae04018be975e40524beec87b7b0f1e1bd7e04739a9e79f58386be3098257ccfc60abc8785aed167400635b5c745058d6a15b32a60d70bc3d20570c129b946e5f8b5833b105f655c18e799de9498397c7cfacc7a0862837a022667ca4cf7af129224275b9bbecdb9867c1994cfc166f2d7cd35c423a72395785422266fa1f52ff5dd4a5666280d052764ddb59a6d0cad326938629f1738d4a5a2e4e4ca57bfbaa6dff9289e38b6323a8d90876589370e1747480dc0eeb8a2bc4de07067cbd862b5c75f8400939c3b1d9b19fbf77f51d35b5841ef12d78fd4765f887d6bbf7bae14bc9ba5240d24c85675b2d6987c4b3c318652b85a502473df542baf273a8306b00b", "6a", 1, 1963462756, "fb00da5613e2083f5d84572734e740c14d49bec178cfcff9de312aa84a761483"], - ["030000807082c40304cc29585b2781e573d2e64de5b9b2b924aacc2b88f5bf1a6e5bf389c15a7aa5c9010000000663ac526a00acffffffff12abdf9ad1b077c32eaf9eab86017b36e6abf65545f744cfee6c30e24b783243010000000951ac515200515263659b22fbcb67c034698687d99ccb5d5260c7151d13061f65da4e4a032a35d3bc097f93ca9a020000000153fe7dbdd37e3ca515514bd9cf495f5631b8461e2d3b77b306bc54d1826706b83b6fa5406c030000000853ac526a65510051126d7806032bac4a04000000000451515365db56bc020000000004006aac51b6b247050000000008ac530051630063529c1337698d583b0c010000000000000000b57bd40500000000105a71628567cf76aaeb9f9285e9fddc506f7273e8d5eff8ae9484056cd2c106193c89ff6f879b86121efcb3f17e97f6e5192d022c08ead565ee93cb5ffcf92d4de9bf94b923666e53e1d0cdf3485e4e424ef3bbd87242cb78f25b4b37f38b8f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008ee0ab15050212c93b6d6b8f301d40bf4e5febdb98b4d86e195dfc168148216a54457bf60c73e7716c40b8b0d54ac448c21ce4951eb1f61d4c52393a49f36de4090ed9b943f8e2d360665eb5107bf78337f9bd83a38bb06bef8a424b219c3ed6a09af6a3cd4963e045705e92a591a71d3eda9d27ae56ad39b0442027f8030510022394ce49aa3d5201fab3cd78dda2860f5f644eed9f4834522b5dad7072289ae4030304b2ef8a3e09e7e2fa93ac80750982dfd8155060420de93472b67fff8197cb0b0310462530718521790e788624f64681ccca27d76a4b8da06a68965be93df8013c875344fe95ab3b163794a45cb9103b565f97cebbdb2a9bea3ac425f29253f3030554002eac1e9c369de6cb747cad5f4bd0d06c66cc19165a476b47b5e4119761021f3168fe14507ddb51a4db54a21a046447416094bdc0a5489b290a3c86f116050317de2c9753383358e4fdb433e03adba52bc532b714c9e70bec864c5783f00791020d900ac1b85cc001c156774cac4df20eb5a211dff5d261951610005d5153bbdd031351b195fe47e7a18e68b73e308f740b15bbf5f79fb6bd59701e1117c9456abc27e0f842dfea8dfa7aae5f246c42df4d3391db8aa4d1015195f728788403af4aa51970cb99ef2503e4a2407a6fae0f6f696618d914d71dd8b219b7722bd2a7d1e0a48152b31ed536abdf135f386f4da2299f867f3415b0698bcee14081a5015056e28b74a816bef7d066332795741872e62822ee0349c106f389ad1f4568d7c6a7fd84c7d94ec86c2dbe45b9fa84e4da8c29d0197f9956116e78f3644bf4321a466779b97b6c0e6b562835eb369d7d84ffd3fe0b19eb4bd6071864ad7fa57ae9fbe344d49c2bbfbe40eca37b7d76a111ba5b8899d2de92e19125e53af8b0fcfe7bf1236a5642ecf0dae3cf369324d144aa99a809b494e5b8cd45c09d20db36eb2723b459955ec288d20f43a08c3e173f9e3d41eb4f245cb0e25910469fa96e0b33e2e10dee183878dfa6b3cd2f632ab247b8cfdcfd4e0e76b5bcd311bbd8c7a90a4933bbd532f3180acd04042bbd899967b598525c9e93a7bb01b1407ef9e6658b3cde677ceedde9583788ef531093279f4d1f823fe32a9ea56626f8476a4ce7197e5129ad2b956e2fbf93fc5afad81cd200cb59e86bda396d46052d8310eb411f6c1effc76bc8a142da12adfe5a223263385c10c2aa788f9d6950a9fd9315935b5b62e9f552da157d752673997304c14e8268df4031a7a59997b2f020881fb5a744b41d2eb0bdeed2ab3e74ce85555d7789c8071cf8aa8683dfd5ea016023f426afbbc6d140f48a0b18af5f20b724fc718930a40ec209004fdbfbbc7f022bade9b31138c8c6b99e41110cee59faf9ccd3ddc8cd23a3e9240fba3b2e64436a87e365ea39b7b5b1210646cf04ae19a064490b5cdd3d2c0c276faf938d48b5675def4bf606ff1a860c1cdab2df3a608cccd714b9ada0c49796b6cc242b61e94392ee68505c5d4641f9e07b992c864c7a3ad5761f7649c73a54995c91495612f299386632a4ce64bfdd71973857c4fbb87d56a10f14eb08e9c7a66684c0bc384a433a491126d789e6810be87d4346d89642bb297436445b63680cf7e88c94aa538530f5e48a3455b8a0aa1fa583c8ba67cbaa885058f727a242b2466255365df8b4e4912b930057b583881cf30d437e23949618ca91bb8994c460597dd5f0b78a740bddecfd05dc3c6bdd736fbba272beb6e00beb2b120b1944eb26d98ecbdec7207905cf4c3cd645843004ba6077d2debcdec53871bb1e46cbfe0a7af9ce7ef6a9f090911ff4ddc55e14eaa651b8055769f3e9d75fc283bb562cbbf3ffb29d40f057efab1b30c6bbcfe85bde7c3d82d56eb2fe4775f9cac3520aa342ed747c71b5b5086d6e8cc27fdf3458e16870bf8c74c309b47402e694271df39af7a06aa751be0fc2927fddd3d90fbc6fe94d649979c646680d4fe4da1426ac42193ce92d4e85c6608264119afe8898649d09301eac2a26551ae1bff9a670eda29c562d35b9aca870192e8f34a8fe507765842d645a4a21281f5895b98dd7e955dcb69fc1183d6318438097e84a6f8c58dfcbfe6cd4a56b2dc498945c04b97287422991c7c64b8bda0424140219e3fa65e051417b67c33d49d77fd1f8a2e2c5d3f181fa74726642fc3db899ac66e8ac93de0a66e4ed4f98758e47c9239e91382fec52de3341fe4c884c8886cf9c846407d808a9630a943f179ed35f8cfbf43a1b5a4473b7561d2b744d309440f6ea62e1f23066202e4ab0857563fd37237c662a71268f94096153297e63b4412a9b94995c9d298fd96110c9c74e5fd131c72b1ff30fe60574fd016e7ac76381b944d080ef5e8e399edc186ce04fba9c23e6a236c6a9d61a6fa84c9e367c77815a0972d554cb0680e4e208", "5365", 2, 1669383160, "3e0ccb4e0bcafc6ff455a6ecf6175c079dcd6e2e5d8c4da35b9bee300b4182c4"], - ["96e8fe5201349f05fef8f82cbfd5f3bed83b25199e43d3dbee7dfd63673c02930245e8ac8500000000085300636a6a526a52ffffffff0144db680400000000086a520065516a636a000000000300000000000000007a018d050000000011778373a363758364d1fa40b75f578dc1ad4b9db4cb41e5ee106f5d72ebb87669b3a808f3cc49011e9033e3f7b4310a2eccedab23fc3c85ba90aaf19d0f6ad76132db9f5eed127fb1f2ade1ab20f6e24975f21ef8404011020fea1eca57d81b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013c3d1719a013279af42faeb05702d4d444610a1e64d0ba88e251477466d393641ba35cd523ef36cb14641c320ab6a7d0393c2515b2e76d88cc32010bc4f5fc6e881bcf91209ce56015c5c654699c55f48b7f3d8e78418d6c4401ce392e769396c3e1bb19bc51f73a6aff5ae6fa2cf4e7a8f4f713705648090a90f1a9ca0ebba0311d183cd0e2a674a2d304192067a065b8c42d5dac47858fc37972327c1dd93c1020ed86fca1a322777082122c16141b10dbc798472c66216e6c3644bb40505f65f0b04c100d917f361ac318221467e4eed1019166c56184f8a80c537f45bfa9a3df40241eaa4b6824776d7a3ef5dff6bfc75aa9fda68713ca8b933e91288fa74e2560205c59c78667ded152c76cbfef71e339248ab1e6bafab94cc76aa356067bd2aab0215ef5c567c29de9988d7d35ef6df0759553eb4bc3dada5e58014ea81b9d66476030e55debc07aca98bc91837a134e3cbe4a81a9342ba8387ce0f86657e995ab9110325627da5e12fb44c2757177b37250858f596d92d57cac42e349f3e6ada3de6aa02190c1699a6de1d4da30fca9aa528bcbdcab0e757897ec093e120cfe2be4dca5db47553ad46fa334156703f2a6a4a6fc9426e6f2e19aa5dad9b6664dbcf850da9acce1ee45a5ccaf9e2a5f8f7cf1af30aa5f9835ef3f150ad29fffbe5fcd087e23a0c73fa6e2e16d9dfc0b8587020714ce9419f74c5060a850f0ecb7a2f3f612e4efea9300f766da24d9531f3701556a84f5d8f5473a061d322dbcacd3e87187253a9cd29c395a8d1f15dff688af2b390f397ee8806720d3e48a050164f6f61ada8c760f9af55c0ba42428db2222279b50bcb3b729c2ac1c91125d2e700de446a6b6e8d966754acb0c4d7f8a64ab54ba9d108bfb64e889231d92bf6576d7d29650e46f5221e4513ef64b6718f86ec92ce616a9b069fe93055f0b1674227c03a880ef0914ef5e79a9e2a277329d7e02f5be615154128bc31ed13203b6c15f70e7971c7666515795e39dec25f020fd787bc7f328f1b93d014a54f177c0b5b04081a4cb5c26c00292fd3ac3bb6592a77a4fb4268ae6cd8adbe90bbc3767c4aa3590e0ddc20927bef5baf58e52866ae6e8e80b170a020ec9b1557cfb426b3a819b4d2f005466fb7266aea16b051515a68596931cfb60a45e28db46c85ad5e9251012d0f47d41d5d08cdf8aaac0c04c35a445e8b5bdd5e248852d112f8b386740dc35d68dabb2f2f9f86727fbeba444f89240042428054b447aba483388f6e791dd4dd303555fa3f5fe6198961eef1146ff6c2766e41ef42ffed58445501ff1162792511591f3aae3eb68023387d6a835c2a25bf63dc64b8da174b7ba90c8bdab01020ade84b3daffa77406a178a182c5c0a4eb5a75e740727e04395d77d9cc4eabd7187e8b7c80439ff6359ab4f67dde376701dbd98077db5d6d2069ba9390f4a54f856a62d5f0af3b46da855876a51c13b811de6ec646db1bfe74690843f59df2b2ab17141421d93416f943f327c82029fb1e1a5b2493563a2abef8c36e50f8483162077db829ec8e291ddb6c0f0af3a01c06614ce9973b0dd93dcc38f2151baa4ec756071e2c6892ad9c9027bc3764a03e1e9aaf11b031bb2e394c5129f3dcd23d31bcb4ded258b26ffb6745078ebf4a12fdbc18af6fcea43cb2025d918691e6e7a8117c1a9462a8c9ff1eebed9f1b00466048a1bde48f475f11525e717f86a30cddaa10cd2eabe05efcee0abcd76ae3c85e0163edfc4812571c554e642d5cf2b3d91fde776084ce272c618643467d62cb0fae4fed0a5c0734c41e7a310a5a5e0f9221fb2b16f291ecf4e5575327ae9f8548f2dee258e08884d90a6c27503cb94a1a87e8e52ffa1e9ceedd2884be8c9fee137a11181185398379c72a3e98df506d3ff5552c4738b4756bc0de672a6e9084d7f2760cf5203eec494f76f53ad8976584f7df80296ca4a3fea64c9196b2e47d88cc080c0983136907ff09eb1a1a5d892b35908a88fb9652213311d4cb3cc78782fa2834fd660a18fcfc1692368ee2824dfe69fc9da77190a709e8f02ba9e7cc510dc7ceddf86e04f9a53c8d614935bdaa28b1ce10627639a995c5dc3fd90158e9d34c3fbfc842d29d4de6eae81cece2276f24d46a342bed3527aa7b3c7950e814bd6e01587f6e5a5ba32397e102d89a8213bfabd8196d3c865977560bec486bab791d7496c8e973f0699499cb99956d72c06a7d0ebb3121a838563765738c2bab559b7fa8b1aee669c7226495f6a062532eb001dcaaf865db85993ea0cc84b7c428f00000000000000002a5f72020000000043cedbadef91e43e1635908983eba097579ca3a436847545f2d6a6575c2557567f4fb3917084866f89f5847b1398e1e0f3546b70675b11fb8e5497d1feb779f7c87b995413a49d20fa2657b40d1024aad29f6a0a1b34bf3d2942dbeb6d19d2f300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d4d91e0df364bf9da8eabd33f94ad7b5d5850e926d5cd9034c02619e7f40dc5fd0ba50955574034eaa713c66e34ce394e5ab5a1a7ba354570a71a700d7008b369faea4c24198c597978a2d39eb9d0a6cdc2bd6e3f97187faa5034bbb5e01f0b0d7f16b5074cb90e31193d8f8ad9c5fe949f1426f17539c32a140daea2ba3732a03259c7eb1ec87843f33001f5eb91c2458b07ab4cffe5a976d250796f943c45e94021bd5ebebe8b26fcdd033c84763d7b44690c77d05a78c8821c93ce3e575e72e6e0b027d44088bc4f8cf4cebfb3b61217cc581da79a7c0e2ebfdb5540196f64163d08625ff7fa18089b1cfa0ad71ecf29ef5a76f688b3225b8834384cbeb5926d957021fb4a3545c94ae21b845baea654713788d2d35b2421bfd68c98eedf2056cd5dc0210cc00291da686f1ef28608403f2d32d1d2d143626924a6b472b071ad7a43c4c0325d5a6c30ae694fb466b04343f8ff453626cd8913300c5ee483e2926bb6a725c032ef8939a8aa81e7b4e9dcfc3f4134230dd2a2a82a3e2b51df41aa2abcd80db61032a8fa05cc8cfafe1642f6c98d38d3c1b4d4697b53e4895aafcd69b06179356f6876346965b7fc900890c875c7834ea48a770547f5f6c48bc66693b828b06166e537fc550d29639e7a6c338c90bf1a6d80ebf8f72f9c18af3fcfd8dd685fed0e10770dc53a9d630724fc6aeed84214d88e2a54b8177cb5a32eb15794a7cd015fc7786bdc6352993a16613b5aec5969291f4e68efcea527dd9e46cb64712ac0811f737417c3195766393c77070415494025f5bc36c50224cf9594c9c5333e880b46499e6e6643f6738c2c73ce972ea1cebae099c27b3db235a979332dc133b0eeb86d40b9181b84f83c72cf90dd7656fbceadf0d2f81ce57018a2d3f3c94298a94a25f52a307d159905e3b365bf4294357cc7bd5bd0ff7a86cf2c83d312e142deedcbac82325932748878183bca3b44f621c833ab0a16449bbb028fc85252371228a87c21936a0f7b98b4441bfbe333e268b942b31a23488ab7281f19a876f6a00550e7eb5727ffdff7ba9acfe76dc3c8155ba11b687d5abca8adf87f93abc41ce36489ec6af11089df4a5d345853ad78d5470528de8520306d0d21270092b4b46f41016c21f61fbd690b40b83ebd802573dcd4b1898b9d0b7143699eb4701e8b6cf6fe0b1cb1180a4ff93a482df466270cd9d39a8d7a55f3eef942e8d50733e993f1e688bdd95938fb0a27b5ef8131e2c89a29c2c282ead2ac1565018e5e93c4cf9dcaa4b6194887a0628dacaf0f4de793e873b68b865352f4c71013e7fc653ee48c19c4b472d05a68c56fbefad34a888d9d1fda203d7f1496cb8ae253d0a005b3d54959527632d5d8aa3c4a15e121ea0b88faf41464dfdd04b7f1708c96c7c57967807b2dd2f29b2601fc026cf9e7018a51475f955211ab4ce1b61493147c44c9a18dbabea4de8cd3befcf48cbb9df846739c5dc2281fd1c5bcfa47c4e204aaf3980b53f176c972a81d453d08c3eac6a89e450a83f80d6a7a69bfea397a12c3dda95fc1aaa26411ce55c1c0a07c51b3a1e24f197d7f2409096cf6f0e59eaaa9b2f67914329dcf495466d2e30e7c9cad6e30ca5347418773f70e35cc0b5bba64be8c8b09075f6899d56cf15f000d92740160d02006fe99566dcc0ddcb775dfeffc015bc60a3b6790f9fab7a769ac636a08d0cc353f3fbce1488d4b72fc2a6fcfeb3ccd4880c5980b0039ccffba1f87e673b76b3c06f422fd64008d2b48997a08686c849ebb440e0764f1db016323b36cc619cd73d6f525b5e8fc66ccc011229d84e350ab3f4efe524616b6298fadbc4121fcf18b2734fcd847cb5abc723c4a49ad45981dbae61576759f1592ace3c1753ba206ae8f0d3c943da76a0788043a8f7bfbf028101dbbbfee4864ebe23671b11df0d3bd84afde6e4c6914ee9c71101446977d8ff73493296b39bf546aa98414cf0b10abc38b13e4dd2cc9d8189a1bf4f45c5405fb1742fc569f3925ddc952e54832e27e80fd01255c829bda689671787e86a54436e4574ccd036d8d617d7e6fc8fdceaf98c00d20684fe3ad5b9926bee548b3d9eb823b7575169c9bae9c718761cc650542cd46897d871496080052b0aad29caeedde34114d5ee6d20e466976877c93f15f3e95e4dc3fd6e76520d45df154c32b9d4185e5867b6f5b4f21f46430c6d027ee91176dee5b4bf5d34137e9c371b6cdf0c3baed0c70c6a201ed159de20eb4fb666116b4d31ecdd84a76e3a69d6763e37b33381ad76634613cb3e2c994fd7c0e88704000000000000000000000000d9f9dbc1f56630525e68eb822246115876cf06e7d9afb79cbb84197b1e39a7acbe79dd064f7e99842e70e202085ae5defdb8e7a7f94c7b31211f32cafd77610db37aad993b62151f02bfda55f975145e2ac8f92a5bca83431357c6a5e934517e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007e560b3ca4c387a89b31eb2720ae2983256251533e85052e39a29adfc922ee7c88a78129047011faaf493a341dc2a4b85773f1799cb9bc836317ab8766061db264d8f3dda7107625778a48311adf2f3778ffad0ed334d0fbe78069ff7ef7c5b7e30e2840f357fbdab8713e2bf0ebb35e4f98c7654d11901e9fc93bbbd96b23a60311db38db144d48373ab0237da4347d5fd9ecb8f01140c4125247d81e51212d860218133de9b7d9f23e6ae3dbc77825fc830ca151d140798b393d8af07ec7f4425c0a00acce49ff4402ae1feb211e91cc8ee52fce6b46aa29b4ad6ec3502c688acc284af0401b15525220d326f14f655d89a6a9d5ba292fe0712a4785eb17eef26d300220065870b63d5645e864fce19f3cdb14d696e07d022e6c9984b4aa3da3376652022078fbf797cc58fe08453d4e4350e2e7d1125f486f78c0fd826ab1a508c0f0b40213da1c2fe985b7b41701fc648dd935b9196e090f87698d1f502246dd411de43f030b3901dc3aeb3c2533960f2060eda24420caf600d70a6f94dde7ed31ffbaecce031e5c3f540628cde8f494c9765f437be64139a4c1a215949fb53706eadd07a7946cad2c2212da76739505cb244fffbe035d6fdba0218339973e9906c4a6cb91555c6bcfdb4ebc207ba88188ce741b96b26be801bb8a3aa39268ed46261a34840c2f1415f4ee03bead28aa51f48a1a123d33ad8e024932ce90cb39f8860b6e9010b9677b59eed3dadd83cd47b0c41d1cb91befc64f909f682a1b7fc35eeab4fb3a7b97776e0deb4316bb8fcc0a6a338859ff194cd374190fd22350dfad8bcc08905d5ee6f2bc65cbf15cacafdf9d4b0ca162a74ad3a99120c31cae8d2144a0dddf6aeaa749511eba5c7aea141c3a8bc6f20bc96cc790e32b2da71e3356fd5561d7789455ad5944adbe88f8765c606d858f4dbb09100e451455c1dc8e515e387557f49eead12aa6014961631f9a0fd23d24cc2a5980ff30d603a3b5e849e4aa5288f2388dba97f5adac46b2152dfa4ef9b4e0580103c9a18fa44dd67b83da6bc5f3c2dc138f72709b49ba08ae5c31d7f3e588502d06408919de66202953d98bfe51eabcdc6707116ed30a5be28043440ef8d3f358442893205fdca72f750ce3c731069bb3c71ddb6eee7008076feb37860f7fc122c31621e0bd0f6804dc261ac69b540baae5e8548ed032f62cf5b36be37cab22a357c92d01e8c87951585bb89244f3fecac91dec64c70c6be7be45697052b4dc7355c5f283d31ee763a379b22ced7920d5fccedfdfbe57946796330e2ef7acfd8755069c81a10625a7f00b728db002438a0c0473c4fed9f7c8d4784e866770af06648055bc113e6883f89e48632895c1b9d6a90afbbd7ba4395a0956bf42db3e90774c061cbc089341932d50a77bfb62c430cf8dca46adcbffe807607175789b9d094f6549b14743b21046d5e736b6c753579c07c3409acca65f554ef0fa4d8a83f120614eced26db9f73be237abe39a7011d3efe6878e1a6e69ebdf2d21d2f36cac9331cfbe07dae7b4ceb7bbbd45198bbe08e6392bc2fd66c63e59d2488fc52b8650ff0beb0b4101b6ed0ec991c6293d93d7ae3a4c75f4700ae9a01bba9f3a0c8d4e9554011524d1b1018d9f7750d0782c67d7f8636da466255d45f60b2514e8b8a476d6fb1f81e2725ec95407fe26d65c8b20309293f6a985346888688eab751042c5c1734b4859a7816b84ee4ffea7428a13248bc90585ac27e6f08f4b18932ca60e714cc22b94e72121aaa54defa7dfbdae332eb4f9be74817d01253bb13878ba308880e15dba8dbc348efd1df8c2a9f42d09519995a8b1138445142adcebf1da5ab7fc540cf6dc6639db0e02be73c344e45c260f126b6d4140832d823e1a4864b9df1502c1c1fbfc950aff3a9aa5418d467628617b51ae1dddc14f08f8f13342c338b4b769a6c46dea5767884bba062c1e61f42fce0b396163a2413fd68cd06454208b1299c4719ad336fa07d7e7637e8cb427f2d8a93ce667ee7767b4fe302f5e7eaeb9d5b5f336936ff913c52cd429f959befd9a716eb0c45b7eb656c790a7df78a1c981bf5d90818fc225cddd67003d4cacad449f02cf73bbd86c6eaf7bd5c2339d7807e2cdd26d7274771149fec567ca0149f63387e3436f541c323735ce3e3c870ebc94e1b138de90e04fbe86372a3103cb93616e44d907bbb9ac53096456aad0ec20321f024ea112d6b8b6c25426cd9a8734255629baa6ef936b911f1fccc06534a58998e20250813e72bd2614de233f4f0795fe313e63ac8037fc171b21fd473feb413530ba14aaba10993f6b5db9fe3044717489a019d53f8105f81713fd58a9bcf652e0bd5b55b6d9e32c211bcd8c06f4874671bd267434c2632ff4ecd2532b2d289101c1a4f07e0141c6ca26332fde653011f46a50f46604", "ac5253526352ac", 0, 301220637, "3fcf1054f80c635e9f66ed55ac14ff3a6aa7692788860d8ac5b099e330eff668"], - ["1bd6885e04cf7a09ac340e9a48244d922c098561963494af5ea5761568f13ee2110bfc4a92030000000465536a51ffffffff85c687ab7063d526a03ab8b58adb81e77e8a84b64a256a20b4f1f67e7eaabf4302000000035151ac6a587dd6e48f742e55331f4cc0ffecc2d26b0ed4a8ae8cd9aaa7b02103dd328577136149030000000951ac51ac650063655303f5bbc3e109c98fd3e0d2e556d64a0e711bdd569002ba1e7a9444172d8fcfec9e0d1ef5010000000751526363525365ffffffff0187fdeb0300000000046a53656a00000000020000000000000000e330810000000000203c147b3cc88db0951ed457f1a85fd0e7eb7a9f013209fa0bef4e5ab6fc65a43d35b636e205c27760c6a8ec8dc707870e4dc98eebcdade67b5b3fb176684bb0adda172159d79cea3bbe42c9ed44a9583fcf74a91f1a0695184ca01726b4e732000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008e6eb60f6fdd03ed6eafb3c05d8aef5df35a4817c32a2575ad1d0c9d780c33823c24073ca386277f7692a6fac32bbb9e74ebb9abfb31a068dafd825ca17adda0072e5719a4d74a316c83cf860cabbaf69c6e93c6fd4aa00ab1ec4c02aa737673620df7c31fa9bf429c9deaeef74cadefe252538f83eea93299153338578b0b590320321a59cd0d7b456f81ccf08ab1314efb99e88afecbaee4355192247a037b560329b397c0860562fe384edb4b11a6f850c40b83f11a123b3392b3164870eb99c00a019e7c1681b0b1df85ac789a9f6ec7fdbf6932431b0350bc5d19cb4356b8a1c9ab4a0ddb338005d921b36e67e1124b3fe378cdb90939cff624a0398491b2676e022b4b757f67ec24904bd5923db657ac02b279d8e9f95bfa90547fd313ae535d2e022ecce7b270452c4713542fd6c0e799ff07279e12f034856aead86fe7ed407ea3031033ea1b51cdce8205d21ac3d8be5d0ae3427a943fe57e8ad86d9d24891b0cc502229d9d3706d90d9d474a0d05bae86f6fca2c175f03edc6ae1dc9deb88e480f87032b65a2245dafc670442354201f56d7494f3318ea7d1b2fc22cd250de3669a1b1395d8a386ac9d9ea342312c8467a773e66235321db7eb1fd076df5c733ca25492a66767d85e6fbac1bcfd950bbde9d9ec171f1639166b8f8a947414d4a3c19ba0ef1509aff3313c6a6f31fd63e37ec44d23a52f64ea86f3115c44ca2c3de7bbffe17b147795fb6bdf55d3187a88e35df30117e79ec91f3acabdc894914eed0782315a7b748ddcd47ef99c91cd7978fbeb2314545e883ff588e9434f1471c7301c6f1a4fbea11320f175cfe0a24c00f027d80a99ec38f85c0732fa206bb9fb47258e8ee6f8d1101cf90add6045a1933fb6318c7038ce068d498b65fdb25c39e076191c8064f21f7dd32dcccba295613b5009ceffb5346b556f09b8a4352cb578568eb2a6f84c2d4d25000b77042dd4b71ab83c1bccaa64eea34a3f706d8c47e208974dedcc9c4b7da8c2e5e48bedb98b1cb49b29eea79dc968e679954fc58b2438bceb2eeb290e5d8014b293f0aa30103183b0c08ba5b00731d1178734b97838ac401d0267d05d234ae9e0d82ba4aaba616f28b2569af951bc8c1034866f761ffb8a3ecb64640eb1ae1f3e1eb546513533a3ce5c74428c68148becb046359b9df2e5c6df975daff3b99e76b1c99ffde2287ee713fbdf5cfb7b0977407567b4f08c0301c4b240abfa845fb854e82eccbda02e1af6408d6435ba8ab5b50ce6d04d65b76a3fae530abb7a2a6d51348c999b41df993ccff0fac20d0d9234c18ee64c180c20b7ace16351934ab795ef699f163696289c19f4a31ea037a7b0db4bedcc65bd533cf90239790d92ae2dfde51ad709a30cabb69ff270c95f9f98f77431e2aca9b5af89d297619129271a590496eb3e1eae9d8cbace555573e3d1d11ab780686ed066b89b0804e7a8e83464613f89eb6d61178cc9a0c598946a6f05a974f4ada17e892f969ee1089654eff1a9ed827316db9c4c4cf4e094a8385cdfa2a6ecbe1e8428dcfb1af7689fdc482c8eca0621c9685342058e66f8a17cffca0247f783b83aaa633ab67df4fc4091e0a3c6f77f0ee1f75c238f3eec7a60715727a1c4c74e85ab32d0942bdf9d8b53f7ebcec478f3d86c0d40b848e31df6c471f6d3f9f9fe9897d58b8484734325d19d7c6dd179a427fd049ea9e2793a341010c3da17a9926bf92dc5b015cab4ad8c66922f9befc196c3071d0c52ca5746dc930d1142b5107df2943ac5c19a9f29162f0237ef96ff711a7dea7ae53a791307a16db432941bdea59510efbc3bb1827c2bcc3d732160af1311a67b8dbd4264e12854c8e6180c0a4f5ac4ed107ccf9a2d8ddb36e5e31c2b87b37f54dbbff294efea2d8d45710101d09203d4c904edc3b98652195004186c272cb27d0fb881d278334b703772c9c743184664aad1b990dbc1e18750b4d078bcf1bfe0d3721ca3a45ea54e31d21c32ba068d32b8508319338c9d6397d883f76bc7efba294dedadd9339b124c922c9f4208dadc4bac6835150f5282933897894d80ce5aeba4db31c05ce111f1e27bee8b4a641adab2e93ccf828ba72981b896872be11e34db4e1a0afae411d95d249106f29800de2f4a19fc2dc86ef6f4600649df1b673ff5dbd7535368132559ddc416221df4d92025e1a2df131090415c6404388d262e0dd0bbc5a6e1f6ad991a174e1115d02deb15e7cde0caf6ae40c4c04755add0cbff29785083c651bf65377c18ca0d2e3ba6182b72f2e10e36cd5cd0000000000000000ddccab05000000002335ab298ae2e5849352138fb8874723487a28672f8879466788483e16909069619adfffa873dd4ad52023ba4680bf3d34d2f05707400556360e74292fd1fc6e9c52fa52955584b0e43e10ab4a17856b9170ba908319019b5ceb205fce442efe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af800152e73f7fb70670940ffbbcff4bf17fed45320a002d7cdf28944da32c1e96f03d53d7b98b0a5fee462a34e50daddb13d8a0a199f740dd5ce289f82b5bdbf9578e235905e54a9b524a806e3ae02a51b884bc08a0555a9fa8b0344d86d14f786f9b02e70c46c9b8cad3b782820d1e2bd03d8939c9783b40ddcb156b2c61ff03015f4f3e95e9fc1c342f62c9e22f954b0a25541fad335f5c7d2817ed46055bdb0301f08c61745d095c61407fcb87955b7d040e177d09c272658faa42be6fbe60f50a07ba6464843956c3fce44eb21d8b0d7e8bd0aaade951017e08d1ce67e4f49eaad8fba2b14e63b103621b2334092d34d623161c52caaec578e13a7e6dc3ef55a80305f6a7f081dbce27ce9413f6d12ce7c77ba26bb39defad714309109dd938dedb0206c34139c7b74fac72132d8641cbfdd20abd800068c9e42f3d10874fbc54cea7020e0cbd5c3ebdb7316f3d88145eb73d662ad22dd8d8e4f6be7d80af58656d781e031c03b8fedf44bdb0a06c3fde3a26f6c241451ba39fe60eb6c3327f7816ec62c50206dec3904a1a4f456b53af5ae36053440f26ccbcbff6bd92e1ee29eef86284f2eda791b995cc596439606e80dd60d83717ec55bcbb6abb1dd42b7bd89fb1180f5de6d344cb877fdc546453dfc24c3a2be248cc5115049285d9f084157801529e86bac7dc580d0572f5915f0970d9fba745327fa03b37dc107520542ad331c93180664d6d1794e975a613fc396b4b0606b3ac3222ecccc24a1a9dfea471a6722019fd43fb8a046c6bbf4b77b2194bbe2c2699ad6f26a8f86bf6bcbeb5ad423b03aa49c483d9be4ea7c2cfebf386159204922180b92d699d17ef2d7494c608fb0cf5353606d263625fc6bb53f337a4c23902b90da0fbd5bf238ac75495da225a1346800cde208a41facc3c83ea70835adb11003168de045933cae16d46b01bb949c06c40387736c9d9dedcdabe87618bb76ba6400feb2359cfd391cbacea9b5869f153212d0a286cdd5667aebc2a83c338ebde4ede7b1a0f8ba91fafe9675b06fed4fe6cff970b9bdfe778a53d636a94ac94b984cb7324eb3c30eb05913f9872c09897dc8599b2d74b11ccc80cf00b4fd27d58fcd08969d0102add4c4249ea97d0b3d941e3703315af6dae87dfa59c459baf482b310135126e7eafe1e103f2b6d879f1c46ac8723d013998142d21cab48db091fd3d511a8f2add25b468e38c712fc6968fd871fbb555a2212f1da813f8b199d8c9d5179d2b8237a95f936b62587ab43065c68a4a51d8b8e9aa04569239e10b2202cc77af3a5199e40c4b2329b6c43e56745a72b7c0255ee59af1595cb75088d75f34f42da5ce0f022827172ebf5b710b8faebb4b627576e8cff6c4aafe6a701621197cc8bf6181aa2e117c6520828d4e9a6710cfb814e0c3a4323434467cd5ca66a9ef64b78630da81a5c85cb1513278cf5b7d0b0d742c16d643fc3ee2fb3eeb84b07100c067579f3c866afc565764f48456aa672c4a249934d989d82b961eb992d888c27a8491729716a868faf5af15e018ec5e2c0200b58e41535012b2851a5ad225135f9de56958d9971c2c2c0ea4f5825fcbfc4cde457be3dea34cbdfb033de6b52e3ef5a77da706f6ff155eaf1dc067d057df4a9bfa3b2558aa2b71240dd72728ab3d1c303d27f0d1e50e3825a76e3b36534cda23a4deafcae427480bf310b70716f4dc5c91b7f24fba97809d29ad83abcf72c460996d24e3c227675cc2aa19f37e1928416ff091b9f454c48b114063323a1ea418529a40ae068bd45cc869ced3f7e9be63559a160dc4737ace23ab28552fd8b32a460297d2ad31a642a885b02e5d39616bb96e9c3d9de10f709e1a4b42600ecda3bf005ab3ba15c4a2d0d74ead6e190bf93cf6b58c66a50c7bfa7d9df255823b4e12287f8777df52c80fe3ea261cc2c604248df0412b9114ade301d9835fffc2deafcc656cca1278573b9346a5cabf37d6b79bf5f8337f2405690b32a7d4cff41c3d2c8aece5dfd21ead7e116c52715dbc20fb43c2aea713b34e44687b6c3d58e13319a869b592fd9fee75505546525d78b7eecce6b897d772a37b32f461800f9600081470e5a61e555f9d5782de282f0b170722eb62dfcd3c05a3dcf696fa713c6f33066ba009d0379871ff4b46cb0a90dd60a4acdbc6abec943a62a89c9c55676b52b0aacd6c41496af97a889d30c7900a8e2eb48eacb2bb778d5ed17113c5911256a4500592df07cf76b4a54f30b318e15dea637f3780b01d72e915d5cc13e771384399b24c0ad0c01152607877f65bf2b00d9f736da5de9899bb069007c02ebfc4e6f5c6286552dd837c50408e1260e3151c72dbded3a0acd0a885ab83c705e53e379e21631f71a3e9469743600809560a08439de7df230473e07c87ba87cd16a4ce34285e4fce03", "525365", 0, 925214721, "a8092dbe7d16515cb647eb7711427131239129f1873277bbe4b357911a6def67"], - ["030000807082c4030300f814248e7eaa51a02f55733ef0c14b9dfb86bfe45fdffb448fb68c3d051532010000000752ac636352635153b92cea53a6b095632d836da5b3714875207bbee9bfe137cd870d79e29cc9d75167eda200000000026352ffffffff56976a2eadec5968ee16cf3bd6a201d4bbdee26182d96eaec33f530dd34244190200000004516a5151ffffffff01f3d1a103000000000651656aac656a0000000046995ec601016e310200000000000000000000000058cbaa102d03473fbd1af31330df78b4a029001ad27abac4bf7001b9a748921a3558332332e9b5d897e50d5b310af7fe6076975389b6212b502bce0f0b59ef3f993deb2996b1f86eb87e110dbb0ceeeeabed07c943ac242b543ed0ce19e2ded60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058f81fecdffcf52e6884ce9305ffb6f4ec51c0a1184a82b53abc0c019f608da5ce7709462e0c3745cbd2dcbe24db4f12cc8ad1f71373b021de67fa1d03a06dd2e5072832045356ed8cc4ebab3279d3e436938078408c512764520b27e6e253e10e9d986aaedef8a0bb4ba607f03a7d80baf800ac72ae429bee5b894cb2f89780030cb7958b12b86f48d034f97f2b3c2c3444ffbba98c351276900caf25e494b9a802260b5b6f05a5652ed36bf25b4a91ac0f397fed2b6beeac0630251be8aa38de110b081def119c2ab4b610c0d5d8ac165eb042778b4aa6cc34d842c0674ac269ec17969961740f862e54bf367bfb3ed975b48176efe62d9843c1c1b7b351d99fd93d032dc3a83c8e278a642ad3dfc5ddab784b49ca123ff18b41e16748eec5cf64ebff02264474d4d398116f74292091192385e97b94fe37f296b5c7995a155202d4771d022f0a6fa4e6a93b5f3b8c3571bc91079c2950526cba59614ceaf976cffa486a06021d464dc4e800873e40d866d0174e5dbdeeeeb0197bb252babe790209516ee7d2030aa3ba82bfc265466a03b7096ddb0af5e6cbf56ad3aa0d4996ac316f24e60b691b2a926670aebb044f71c525016647a3e9c52c3cbd4a2f9decc956f043bdafb8332a585be990973fa5e48eb7482844a5fa0dad7e65cfde4d5da1b84b7d15817a7cd0e0419be2ca8ce710b78b2ab39c4b0e42fae8b5e53399158242771acd0ceee2c32c876ff7c561bedfd4ad4fdf70a6af466b8a788c1b0a4cfec57906ac7922e5d6f68bc04098d0fdab74f15a680828e778ae2aa693eed2e47505ac12f0b60fe21554153b4d68613a50f30ddcb15770f73ebe9e76b96f57f4771c95a32d73981cedc66069e42dd76615c2619b5fbf1ab27adad3ae4725292937d1f665cab3a4ea17322ef9d71f33f7149772b9e091cb107882a547844df4f616536e3ab9cd1dd654b6aaa37f5f979bd361a2360ac9cdf5e298dc0531264f2b0084e21414f6e9342ff4b5c7ccca99d9e1ba02b0b3a5cc435e2381ea0d1493f03b7c7d56d6aa9bb0a9709f76c07afc0257db33af87a62d9f79fc3c001be26b5600b5aaaeaa7966adee51bd1be80dc785b526ffbf672b03583edd443c8d938cdaa58913f46124885b6d0476b74cbe6fef7b05f1992c075d00dc5177c3ec2c887031f7e1a0934ea1c17f8f06696b33a88dfb6f6a5137561abcad108a6e5b966f63d5baf34254b922b2a19df5105fd16e3fa70dc40ed699808690a00311328752b5d78695fcbfbe5a4586bf1c9e3b2356e3b7cc0b011f95af8179ce95193c846b001d1183bfcf822df7822f2349d957ec4939a292ebd99e76d971aaf2266092f5c9f80338add6894934e9c3ab3ebccb6bfe5d3e523527907030c5407a84e94d1c5df17cf430bc84d2a5bbcd52c43aa382a1ff8d25854a3fc0b4c20b0328a517650b6c02ea90423147c5ea2dbde74c0710319d59ee5809da110c48d19c3267b39e0dc41a660f11a2416a3d35b075c0b88cf4852d8c4c330840e5083ecdfbe865ecdbc3903335e719855eb8e33a7d87be96a0ff0a120999fbd7d7330f1e3a4b66be350c81b17b295ab37255c1b42fceab37c86111447cb206f020c51789e397fd2710bdcfe184de9a65c5f85b48820a6a4c2fe2f3da6c92ed46c9ec8cc59eb1b1106ee7c75327b550dacc94c45ee1f2b91f02b8798fc4daa25383dfe7031cb68d30daaf80484e4d6de85c6b76aef069760d93fa39624a7f7bc71a258c094dd49da087c06d87786aa03b8253dfd3ec60f5515ed19d1ebbbd337d356bdca8b4ed695778417ef28af2a9b53673ad03ef7472daff5795708ef2328a6463c14a8c3848a7747e4c48b784628ab4c46d731f7061124ca736287d9b3e1ba4b3d87b060abb69ce5db3d3c2e4a4ba22e394e82fa4f873c4ac588efb3bfcf770b9b7d83b194de24cd113c15b3a0099eef691244dafb0669219b21b36213f0f666a0ddeb44d1fbf6c5e4f7a5ab7ec332ea5b30ae821f0d4a7853d791f8fbc736c30b27db6345d2ae13110b34f1b2f23cd94210de4ec1cbd52898231368659be1b4982c372a4c48a6e711746c1604c65eec66952aaaed689bcee7559d97257be0f9d2776fcba7585bd5c5b6bf2645b1e43e0ee7b03d127967c92c886de0713b242911ec73d8c7d3f67467e788e5dad9f4f7dfe7cacddcb710c03e69013bd62db53fd1661feea0c3297e9f0687712b420ae6039678f427bea233ed5e6b5411ede3f421a3f73d91766e22956de696281683bc71ddedd02d36eee481d113260ded2188f3ca093e5b6edfdb18c89ad59adda634649f5e2f3129838ffd0abf9b5d033375630750fa9eef98e0ace36f643f379dd2039bf0b605d1cda42159aafab13914affb1fed1e509531d35b035f4bf339cf4ad02ea8095bcc302e9cd5c25f20a178800", "526a656565", 1, -1049999694, "fbe32189afab409c7a6e38bae1b7766f8b0a8a82307bcdfeb8e51c70d7bd38c2"], - ["34e1326b03accbada377fe3d7eca010bf04c261daa6d67fa154abbd649af3808077f7ea82e02000000056553515252ffffffff93e15dd7444ba7005e8fa1808c1198b94e0bc1ce2000b55ad8a012c2c6d6ec4203000000086351ac51515251008a0f6c2fa4d4c75e1ffe1be4e1b20f533dc59e40b2033d185f5e5e0c2dced30a84c80b9101000000075352ac65ac51526ddc2eda0311033300000000000853656a00535351533562e2050000000005650053ac6adbdacc0100000000035100ac00000000020000000000000000255d930000000000560229d0d1759a0c40a73948788dba499842f1e10eb4db30f1316315384de95d83c43c93a2ac34d8c630e0f905534c6132987af98889b149fd694e840699aa1203f3da0c2302ceec66423cca22e1848506ff8e0d9f2151f2e4dbc41af31108e400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b2535ba7b3bdb4c0261a4221ecd5f520a319ba1a29d0915bcebceaac2e8468de7316b941456126d54aa8f1000bcc216f381aed7380fa855c468622209ffcc7ec8bfdb38ff2f2d6117abb2bb4eda41c5f3c1ae37208468ada43b13a202e1ea207cb9856daccf0e8ef26f50b780713326643500dd2228bba87f084bd2d910a083c032cc37a37af044044ed997005ab23e7785e6fedf42654a94d65ae701d701bbb34020039b0cbba661061b53c6384cf2521b962e343e2fa433b6f5563e299462a740e0a05a0ccd9e178f9350bd5c3d47aca56c8a5f5c2105e538323fe9e88ac2c0cb023d4847483d683e51a0f6d1d89bb9ec50d720efbb840e893225804c3d10fda92ab030c5e9f4ced7fd325257e5cac311723b92e83870207dbbcc037460093c898233a0318569f15de627944eeb991afe091900318027527129e3a56e7e0694ac9f0e54302076d96681805f623ccf47ba8618852fbac08a603943857fae1dfb2154eb990260214f704b5d41da9523760339a9686a04d6a8137651bbb69e42d41a635f48f6f61032087069162991d436ab7a8064b130698ae2bbb244fd6d0b8bca5cef8d78f019a9aa0db1c4726a32328b8b60d73df2946ec8058f4f56f7ba3ae29983c73373e7b5837c6a147b3dc4d1017d8de46822d2fd865413cd33240cd23da72c4b7e4ab1bc25cf159916d50a257770027e271642cf909095bd7fcf591e47b784ce828fce6effa55ed3b8ab73202e1df533aa96ed1337bf0835e57eceecc5d9bafc1a0238a20cf87260ccc35a580974112ef88139467b64ac3399a8ad29a4d3b35df7c5a2cee686f21741f19118a6e8ae7d74ebee4c09bb4866a7a469c564b9523f295f8dbdb1bf8d5e08debc13e638ef7c43ab3a80ab1fb4842ffbdd93c33cd26de94bc827709675d69f86e3684e89740c346fe2ac241703159f72bfb7c942c33c4df20f643afb16209a9f0484c8006a9cfaa887dbc9d9f4603f28ddf23df7441224e84697bd035249d1fd65749380c1dc294e7605c80f0c454bed6eea7fae0ddd234eb78ef53fcff37f43c18a1e26d9fae511abf5bf419837b707d5b06f7cde89195975a8ca96f384e7c8e385c99dbfc43023eeaa6ed796fc58c3da4ef0f6b53a0497a41e4aaedd648504fe64107ebf6b5653030f77f72d1787f61e54532f287d387b307ce2684f74663df858555399da0a629cdbcd5cccdea7528a57433fd2b19798553e5c8d9a2f3ad782c9b08bf585f104903b646432f4af54d938b33d685143b2c3ef05117a5617cfe78786cab7a68c237cae436b1e2739afd9819ee2be80361b86fc6d5c09d3d8e49b347531348c4fc4463ec5c4c31fc2ba408414279596cec0e101d19adaf896e97ffc0465749f6c2de331f7b2a4fd47fdc59e55a49f72536cceb868d4825f6320a4a466f663cc86e0cf849d031019d0450a630caad3e67d20f04ebb873a4e5231e35fbe356baff4c7b482c0656dc985dcf4a7d6212d7a6534a5807e88ebc6a3b56e476d54b5a24e0dd7ee34c983306b3b008a94e83c28fa8f32191bd2b49d1c651b6509c57c5fe7d36fc0336b99ad88079e749ca948d53e8821c2404620f55933ba1a76cc35051350dcc03c1a4ebb257367fe810e7db6c6514af210b57884ba81b868294cae4ef8d73a1504a940b3097fd8735479b92ad34fc7bb14cd700618a1771709a484edcf21444c3c0cc06d59b90c9d3a36302acfbc0ddcd1b06f5a7ba6106cf8f641ef4be40ef38a24c0ecf3f4548a080fe6e6aae293d8f81fed2bda3cfa58f17c7a8ca3abedb520197aa5dad506144cd8f4825fc82d79c29c608c523afa8e787a8af259584910a672c22fabd94d79721e36e41de8214190ea9cb1300be30d1c541d6a214d454ec1ac18d32482c5e88c461c95e51f2d8d222f682754945fa2fbc7e3e58cefcb6077e7ecda926cadb8b3c04cec9f467d7a431e399b149f5fbc58fd52bb2d64454af507734b461289c9e3253c56871c5fd9aeadb836a1a63780d1c337887c58d903cfca6da490f4a96cbe642559dc6d4a62f58297add023e5765a586a8f3a14b739b20f5e934286bca4e7b320790b3f5ec24f5f023b30d8aa029a46960444d4f0d0fa45cfcd326163d2a6cc982bdff08dbf7a64ded0daf93b944f801730b7ec025b1bdd031dc7c193e27507eab4574e0b1693210777bdc899f52e8c01bde5df3d9cd9594b116995620e3ec3fac96f12b5cdb7ad5b5c3a827345213fbe0e34ceb58136c123b7aa737d4c7d5c3a8c5c1b225b5d0f80093d3b4b4287aa8e962340568602b0000000000000000673b5804000000009d4eeb5e9369242403fed07cd759f220edbb56a6334e0d0f6866a9776e16bd0998224f72cf3f3c2ad4a616762026351109c95755f3ba7f61cee40342b7cd47270bc4cb47393f0f8b5bac419b6cc876a63fa892ce1583dccb2935b14f5310f4600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091fca6196f345430f116743bbd3e23e13152b1dee56354cf71ebb2e155d2321f00a14474d50813334a52ec924fd5f4f19245a24d48b8ef0a00334332c445c6c4c29333f29e26a17adeb1dae3dd5c006115f2f0d72683dd1ff4aa30f7c4145bd99734781f2a46165c771fa165bc9cb5deb2fc5ba55efa4b6ffd973425e8c5dc1d030e626f528186ddb886b231d527d5c91c682e9a45828fe72075be913f90d4e5d6020c3a6819f7444d75bf66ed7a14db211614dfee8e7eb1696bb33dec36c5d2e5b20a0377dcf74880f0a3c223613c4645b9c00c685b5f321fc4279065f565f9400791db5b1f79ae9b21c2440f03f4e8c11efa4353638b48f69d375bb40ce19febca35022f4b9acf8d802d8a8763bae83372ed42024da10e03ce85a6186cbc7058bc1641031083b92f59b1fe9b3e91d68ae8dcf8bcc08fd74f525ae64b79d0ba97c8d75ff10206626a2b31e8b4572f0cfcc8f847c31455082d5596e149d3a089999ef0504395021fbd336669d67023989a8c222c166eec12f32d80363948350d9d2c9a5d3cf106031aae6c576921c672da493d2f0c898f1492bd4403010d253de741249b4e325518fc13345cf680c2042e5c9fa82cad764e422b41bf2568859dd46ce7f3d0723c1f83aa683cabf22c92e7a5102dad7d8c4018468e41cfb3e7ca324ebc6fae43e82b33482af0917725c408d7b146088de114d88d348604058f78f6bf0a393810a6450f9c61f194fe8791643b199ef7ceb6d22527e7b6faaa6737af06e76d70569fc6efce5f4ab42ef52ca20f2e65922407a20b5a9a5a270da8e31f7a3a1c6416246a2e263cc217a9f0c54db5cf3e2ed14223919daf4de5b681ce7602bb6ef4c29e244ae10f9803d4093d8ad71d18b1cd20ad19f8bc98a0af4ff3ea20987969621781f94560c475a1ee93cedb47afe0ea1a45c0bca439d4dee052b8db250bc5cff6e2fbe839000c6d68578cfd265cc593256f2aafb189332b6bee162abeadc8cc59d2d71968d507d32a514842cdd4db2b53a5ad1c062cc1a43f9d8ed780f2b3c03ed0e466e3d55fc8523e7284108d4aa9aaf1e49c6ebfddb5e64854d74a4910b905262437764dd11c57d4070ae6eb5da5bff9b70a4a5fa5c4f341c8749cf7652968a0b3e6922b94652da6eb81642b8db18f50072594d3c3cff571d9366b431e4818817b2b520b39ff10b17f9fcf8cecb0978f651fcc42e499b701ec01dfbba8cf236e1002fd550594bc0b92b021e0825c62bf2ca0226ee3d8ed5acad63f7e313ef388b119ac9f746113dfe2f1e9187ec79eb94dc552f5ff672f2e36db337312b7e37795dddd8d825935596ec1c8d63e5a83316ca3b0750d9fd29a527e32b3a4403897b62e3202b55a37e134bd9a3ddf051928f40e91bc3c9194a2cb026061a9843beeef4f0a90e48c7249a16f325969ac6f27209bfbcd63966f2285e7d2c0bde166da676a5d5290449bd6e384c0868cc17e096679f27f7d1de6e1be3465e65fe0d14f0d8024edced3e7a170d44bcb4a61b8c173311683ba09cbe38ecacfc293cac8f21439e42c7df0cdbd6c599ec503183f92dcd74fa1d76dff5feb2ef5efc256c0ae01b36723944dff5710ed4796b784e4dd9411878ea9e5167e93dc22dd041c78cfd89cdc3f5e241a55fed768001a19e7b1cbced058f6cf8dea026aa3f22ad278e371eca0ad6e749fc57e9480eaf9a5eb17388f7e0feeed4489afbb32ffebd9669d8761a56b506e0dc53d035531af279c0d2e9196d886115daec9de2039ef54252a580143b1ffc99664a6a1f260607045518bdec8eb3efdf09ec24e4cd6b50d3811191c1741f8bf610f95af04d44522cab20f7ace9af03d8f6ba6ea324232e426580b42b0c676d83c9cdcde42e99e0904d6ba9fe4d91b6dc521f89857714cd5182919b1e024d1113cf68ca76bfb8ccbde97953b07bb513b0f02f91d820fe4306c69c5e33d4009575e538d5e3e4955d17a18a1e937e34968f6c6881dbc91fd3cb8bf31d8e67a97730e5209405c936aecda067b8c7e911bd544a29eda432da26433e7c065fa6581e2453b6278968dc8478a06d74550e08f17810d6f82d98457a27be62723a291951754215174d92723a8521b29807eeaeb577485808290f09125b3f5d130113bf1e52a6ff4a121823a3faa4e7718fa010e602b61e6877fcb5ba36ae63fc056b406bb612402b48f19af7f595acdc67f2d6388d4316b6dafc0004961d2a6afe75dd6097e3595783abe848ca13bca533b8c1d42cf770d5305e9e0e099466c27ceb8b9ed97dbd14130344431fba8b7b341405cc8aa402a6eff527fbe5dd76589993255561ebd2cdc14a403a02cc34a3f1984372def4f853b5ae615e150deab3365d60bbd451facea243ae9c84db7ec1492b8f5eef4465806966c958e7583f8ce6564528f392ba05cb8a6e880df47ab01", "656551", 0, 1506543656, "7cb56da6ab29eb828f4a1cdfe94e7e31af7252007032571b1228200aa3ed21d6"], - ["861668390319f92567b199dd6ab52c0316b9fec159802d0d4be0bd6132620973a613e155bd0100000004ac6a6552ffffffff557d453cbb2a5a2bfcb056c091c320f482a51f28e2e77c41a388f74c186e5642020000000453515363412254f0f82c5a07decc3a2761b5c05e857a12025afaca678a7ead667c484cfb81c8d2f502000000046a005252ffffffff018afb3c050000000002ac52468f946a03cd1c920400000000000000000000000055cd305fb39d577f64f1e8a40bed19389a025f1035f83f8d6cd71a26f5a2a5b24d7de62d379037e7a8a6aa4895f89523bff646ad75e42a6b29c0b7edaf9ad1b201c4915da944cb4de875da70c882c510583947fb16d7e1010d2ad0595c22ac0b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029de04b4e93913806dfec959f5e9d9127ce5cb540d294cd9a96258124377a6e371811220dc4d12897018c22748c510b74ce2c7c09c3d92c2b5e49ba79f28305c34d9f04f394aa8938afe3b4f6dd0f7f1d214effd36e7429a56b3cc1c3a54b4e386101fd635b46e39fdab7462cc592cc9c9f2044555d39be916f3577427d26c6d0314dbfb394e09cd2480b153069a36268eb3f28d66185ceb460fd0a2eb74bcbf59021a1325cb23dbb6d40af54bcccfec89da97fda055fda0bb7a58da54ad9124117c0a083ceb6f247ca3b537c7deec278252bce39422639ee2d32c7dfaf84b45e4391ec27256d25f8c542de9332652219a8a21696ddbc375377fb17a85e0c0aebcf6cf020e483bdf117a599623b982eb09740da5b1779b8e4effd4dae021aad4bfc853e70321333d1b008eeaf61febc6cc938f490c2eaac4cecc069663e9754ac3d06447dc022a3481df391c5ebb921f1227099b40a78ca1a39b13ed58f5b9d5bfdcaa7569e302064033b2d0108b983b6741060af92ba38064a26e514712295d729feb5bbf4556020195863fbbd6b4a5ee0d2c355b1baf767e13f4e5f738ff1565430706af3e99fb0abe96eda38775023dbddb226217bd3c503d78a33408266b99f8c8dd1323d839193f88f6a3b4fd6ea499a894d08091b6384db56cc71e1cb16c9cec8362b9e87157d954bf56f9eb22e5aa7734b522fa34c907e2ee5e804756a2215a9c20c40fad06ebb5f2a7e181d78686577c26bba290b27eb8761b8c86784ff82744353dc7eec9db2a2fe0aefa36679295043005b3fd5eaeebb40e0ce6ae6e26c03a28f92ca5bab4e1bfae93396f36e4dcbdf1624d2f67ee32b020c8e3b6ad284f0394138b9ac9f36f49a3013c7075bfbf0c73064c6622a842e6c64c9564806b32ae8ea3855017f031e890822cd16c2cd4b5e99c53f678cb43179fa678a6f0daa6201c696464fd2735158d024eefe5cba7d57da259ec103ee071a5d34c18c65edc305df8f3579181b66348db9064c316ebd4cb4ac72c9d4edf21f4f5b3cb37e346e39556ab59c86831246fcc469ef21e43d6d7375bdd172623abe645b1211c44c059369aca1ba7bec08690576ab848c98486c30e4cab9587d87797007b83ecffc1d75438bb504b895589b7a12358c34043a8828ccf40c2d2955af759966c7b4da625524c96b0d6ae666bea5d8ea9b9706b88301f7993e92bc7a5fe419516fd7ac2d44f250f4702413c925471d8031a5f9a396dc1de49c8145bc075092e72cf927e094f348289d5a98a97358c6c9dcb45297dc6efa5cac511ac869cfbb284039ca2303bc03e11ff1fdbb6f4406d562356ebdb0daf0a161052fc3c31313058beba32447a5199c6fb7c65acb8d83133d9667cb3c2fa8f7b642a06f53328cd24f46ae83bb838afdaaf9d554ec4ea76091d479e8025bb205866e3a725f84fac2d849b265b7097f51113448ec8ed98831f6f8fe01e1e3b2dca709ba29459eb8548f14630ce74f7147b57ea7d5a50e9aa2db72bd5f79269ce6ae7643ed185b52895dc255a842fb7b15c069ef54043cd1f03e38150804fdc7fa122302808baf226c02dbb44bb4b5863601d3d856c7fc65acf335ef51aa397e761dbce96cb0d8e7fb4450ae494d62bbda81a47e6166f67b83df32e0aec205042e2afcce37a95609a955ef053a4edc921f13c3d71c68cea4f465ec249ff21113c07472154ef32dc71c01f15172f98b4357284d718645257b21d16c16b597a1d54a0b2d1f7cb2f2bdbca39d952476e9f442d50a7403aa9f009dccc849ebc6a32819d2bcb9f20b3066dfacee31859003b23db89c3e56687fad23aec9128008a22bc424d01347e01a0d68b2c764a9f15778a8c0dc9d41b748bd21fb05cec773fc680e883756a7476a46d043a01e17edb2cfb186ee7514a4e8a1ffa3f0019e7934772b330daae639a94829428726c5594a0e710d1e23e3e5c97b993ab536b80fec7d6fd1e6787f557f84ef4417dd46aacbd4f8a47712d8caf180d1b172502605d34fef64f4fe652a1c53c33827e127127deeab5d6950cbd0b4599d23f2e3fc79c0a3d0fbcce11496b54249750bcbe610c15aa6636398a0c6ee2cb9f79947b506f066b6b91a33227d18c18838f9b880d55638bf67e1ebe2c1f1e5cff8fba8cfa886ff02c10437ad1c5d353cbacf2c44334d62245ac32857e40a0dd44267877e0bc822a755026615e212115af384d179d4156c65fad7c96f2576db5aaf5a0d7e03071a43892dface85379bf3983b547556faac4fe962464d0b6ec6fd5168ae132adaf8c381cd5e8cd0001000000000000000000000000a208866d63e8b551bb3404917072f077cb73cd6538d0bb42053ba24e81e1037d5953df6857e9855348ac0e93f4e8556aa3c74a687ce2049e647125848683d567327663557ad05affd5bbeff169d6cb470f12d7da8fe6f02ca91b3606bd3dc672000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003766767978ff8b58a087c81e29c5dce5ebf74f364112c79fb3ad6e6ba2f4d51f82f6ad9313880464e262e1d0647753a44be6dcf5347ff9e9a346092267e68ed0a9fb9345cfd5ea8197c2770564fefe10ae3edb748626950206fbebe0eabf7b66ffd09c797fbef92fbcf30b5fff709251f174b2f8640e2c33a945c51f264424e40219f71a2eda2de453ca1345a28dec97369bffe1957b8d4bc00fa00bd7651e6f940318ba32832ff01f98cd922fe21227d2b1a4a2350920139048accafa3365cc9f4a0b0324545dc44a93d3c9675cb4617676156d415f20aebabb6716eb98531eff5b6be2b1802049aa7de7b753ce18b031409519252de6a299c513a4ae87bcdf9568a0032b43824e8d5e25fca9f73d23b55b79979a7f7326fed7db01ef3b580982b3bb49030852824da64f0e38c955ab530d7b3c33ce2a2b1aefda883f9ef3584e82e6306c03107f070c922fb6e277f66690479ef9e28ebe9b38c1831d4e81647f6d4c0898840302ba148d7db50609950bcdea1fc15fa75c783d64569b542feaee97f18f61316102071a1f7763145f1d685122f3b536eee97dc815230428abcb73d18660425c51e459a2659223fa3e3ad5520460b9ce7971b7f03c3a3640263f3460b3cb63654fd6ad06f73e3185a4aec77e4c453e32e6e9ffe54a0daf1f11b1f027e0bdcd348d685d65be3ef729a227ca4c4b315158bc98927a423585f1c8906781ac616468cc8f538015cb7dc4e5d035da8ae5da26dd6a48a6b51292ec1b9d8ca683ee3135cbf7d549e26df29e9f0f8e395773db195f0e2c7ba1fb427bfd4995cc4fcec37fd06d966a2f3f4f5ac041cdfd97acbce1208a84539aba75b9d0f8cddd055bd4194b4b58d44b588ab72b7690d70d661e09d2318c3dae92775cd558b62fdac82859bf2461c758d1425210ca3fd53dfbe08418d35e2cfe0d41439386b7be55e813a06e1932ce81de757688a6c556ada57fb5bfdc2d24fe209a3bde2836ed4ff67a6dcaddddd0837b1ffcb85a5129d762f378f0fed721e15a748964a5544b1ad4f96be9c0a4af55d76eb103181e867328db1d949410d3d2f563bb8c67ae8098b3d3a88225e8bb0f4bc4f78bed163e93fbe78fe8dfb3a404588c0cd22fcc09735e1073e1774e1907d89384b067597116b832274d02daf8149c04b1e8619439c9ff3fd482adae73c3734e597338574186342918fc99c7f79ec4037d940cd871c589d44f08a00fe6de1975cac5c00be7e6764845d5a9369ac84c32e37d2c67e3559f5dde4c3a807d20fcf1c09d8fc6eebf8ecaae1bba52ff81ef7e3114dfacd5f94c67d77877cb39f5e0d72e8b23a1219cf911dc1767ed6fa62ab41befdd1b8f685f5f1d20e7f75ed4f61edcb39d048aa0214ff004484c08e373ef2d0e31387848ae27eff8f57b68143af3d3fe4103bc560a68aab421236adfee57fcb9d8c82a5677a7f2807f7779766320192cfde506f8cf9f04b6e1130bf6b7c4e8b0e6cf87148653ae06fa974fcac2dcdd9a1346ef8cf06f8c160698466265c295c647781b1d74448242535c3cbf075bf181175424fa20147c28ed7b9a9b4d69a1c55f9f186e0ae49db07ea498a3cb761a76b896b5c220194cde1438c96766213cb564974477326346f2221357c38345b42f85f8a2117ac7ffd1e8131f696f735a9b54820af8df3b4fd366d706e99356e7221219bf2c63b09fbe5a09281752a4095b04cbd034c12b23a5300318a4da7feddbb549c68f930424288eb674cd20d35673603862a3c57dc13477564783502f7ec405c50519c75984d1ec44a487b6726fa20b0c85463df38c90faf48526fbd2b9e65b41cd57142b6bbaca5623bfbf02078ac8beac34c032338352171f6c948316117db72dd15e750bcc1ad1c1d2572ce6b68c2df5e156f2372195c4810edf014542e6f254c4f43b239d795fd6c7e2fd78c53e4e6d2b5bd78f260047097055b1cfe1e77a3418ae82eea60a4370bfad17f54ea42da2304e0ea157acd14e43f75c10b70c522f83e367f8a37897c154511cec1fa608a3b1375fc9168d58dd563531645b03100465449d329b50f6001bcfdf0297bf0b066286672d531b7e824256723e4ff492f172a3bed05b11f902309b11ffbfd53670abe2dbed461e0ac6cdc21ce14557e76c46799e7b9f623abb4be7f48d06114afd97c25da350163b22d96c15ed1a292bc7ba544cea634bcd38fa85ade40ec4a7143036da1736d640023d93e521059319a0170470eae602b37123bdad19caf0fe01da88f8355a79b3e848fca07609ff4e15679b848960e94fdd26338e04000000000000000000000000ce7e5b6c5bdff0bbaffeb46211bb732a74e4ac7642e97d1470094934763fc32e09d3e097f530f1e03d4d4e18ae830646903b64947242e14d320f345a81ae8c69cc596f2a6a464af82ccf7545a9c5bf6907ae3005f8e23545179ba6039352b69f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c4aca2903e7010ed00820ab38663ffbe10ece403b5485cbe475fe16c74271eb3b11a9ca46a1a322cd23da7cf5de2a5b90dab76b34dfb40a6a8ac0908203113aa25b976a2d57c184e8b8797f4437a6f3b34aeb04551407fd6e9c800f8f6b3e1a7670307fd0e9b4ff88e1d6fd21277326b03670fc04cd677a7d63faaf1d87d145802259b95f6b194e1da5806dae5c881da3985f5984777e0bd87ccefb7753850725e021191bb308aff688ce26c3458f675f2542c0ad862b6fb851f200eeafd76be9a600a053aa7cf4456ea213d00d98598308267e2134dd5396d38b9943e0f0f27e5e988f50b3eef2f27d4cef5d85f29733ffd244b38f7316a4484f4c3e4725c967dc3d0030fdd20f889a4292a7f5c57f2eba619e7bd048812457ee97bdc4ae37c6680f536032555352aa72d3acfd3439ef81193effdbdbdf96320d2794a992fc2a1fc3c173e0208ad7a81ad5b88223068d9edb370baa684937134d16c95cada0588ef760cb671032b640a99ef0cfac47c845cd8f0da1ace5474cffc410d35421f19a9e686ffd295031089870fbb05322c2ec0015242f4b0211161c6061e017a77aa8cfc13d5bf7f9a64ac13b50db9813c926df1ca966c34bd09c645c9d7d492ca53863f32a10578473e982158bd4f1532927615a20997c5d004c9f4917cca6f695e6ee24f49e29ba4c5662c6cd05d36b406802e9aceb4713b508a49bb446c667b6677ee2b3bb799ee6daa4c15e84bbb09cf136c56fc2fba727eed6a76faa21cf59104742d2b0b896f7ebda517e0fc3f0978189f5466fce5edba07e7a5bc7f5d2215848fe7d40a5bf82285991ccf9246861fce38a803bc6a5c9b4092f26c9247eff67624759e4ee569f6e56334080cf4341ded83429c95e5d88bfcb6c594f31a907c9c02891ffa9bcd0ee303cd67158acd48f728fe621f13acc3a1e9fd80950ef05844de67b83b5d1a6caf23471fb84f2709829c47bcf4ca925b2a8587b57f14d6505cdae7836c09ed99728a33feabb150e6b9b5474c577d2384faee1c48a76a6508dfa08f850a07ad68fb091f573ba2c42140b02a293fead143042aea4ac24a19bbffe027d38559e79e1ee3a0e02c93c8e236d86574900b75460ffe9e727da92368c9af972ff9df387387f536a321136c8db3583957ef810862d03d85714114eb7919aa1c5e9fa7ba4a7f1178d488fc247828ab6c90bc79a9a0d95c4550a11eda34cd99121630660772d717b3d2a191956b9a09692d73b45c525a2b773d5a463ec1a4b91ad484bbec3f2b29d71e116b559eb87ca255f0566c81d23bcadf58d308a8ae8f9e4eebdea86858b18c0c217bd4e115e44f6d80a47f573b2b295f6352f7971fea25af234c2b8651d108f0be9dbb6febcc8eecb433a8b628de5d6f3a8c76a25574fef080f73d0ba07a6360b1863ecad5c53e73de54c132cbc659710630d05357d78c13bb4928cb96b9fddb8d3859acf5ee606511ce46e3f962d484c7acd0daba74475012441c837ff6f5f0d6b5627ec9ae7c20f47d00f867fab2022c9bd6716fd0aa08874f0efa4bfca2dd53a993eb463010b9629b3d7a3161175ca810d85127980c59d7051edacfc4acdf227b08667e5e66818678ce9c82d9950b2a938ad50b85ee128b02cea8d94083e5bebd6638d82352c02d88739c3d2d905d18052fa7f284c798d1bfe53a5cdb72fc8ad3b6603146521b9b8de1bd84741e8bca5db3edd578422adfc97c50110893a7ad0342a99f62386dec189e712dee2eff09f685a856d92a8f13dd5fd98f32b68bb2a2c72c9eb635dc0ed61e1b1bd35004df72b00b4710aeb9069cf77627e947541533683bf1a966fdf3d22f257865199d1c81480c846d5b1abbc65c00314ac77dc8f7e5d5d4d63f6fcc31347a9a5eae2ff73374647d4fc42b470a120f87bd60027149bc8151364dc0cd37ee7388cb13e7b0d4e3f59b12807085af8073b889b8b1613afdf47871cde618836683813040a5d89ca803e5d9f3a211cd820f8d0d33bbd5913884ee5e5d25cd1b3758af14fec9f365375a18a312cbcffdfc474e40bdc04613aa6c2de3c2c243cac3df03b06ff1a02821e043b8fee44121c88c4af1c2d7f5142bac5db225ce48285c85b04177c02f43eb54cd7707bd728ffc8563b4cfcfa7de29754b6ffccf85c8eb8da2f89e451cc81834eb2105704d3e3d8240570cf8bfd01ddee6ef6270c19c5aa7f55deba8f12b2a7860a5e678c10739e0a6241b5730f9176acf6d82fd0f7c90140fe561d54f82cb2f91b02bd3bbcfbb13cb75e5c001ac3e141f730353a46a795f15b1f1f02ed2ada9c52b5673ca0c5df0109a40ff6c7155555f85d55e602e844d8dda6dc167fc23dabd67c09a381f4f8a4c1e209cc1db5e3765797c732153b53821bfc56af377df3540576b737ff5f879f7b6cc8dd59424a73d3bb21849a5bca90b", "51", 1, 1706299201, "8fdddb9ed69c90fedfdfbcb77f29d584463a3940264dc81f16d8dd041f62c237"], - ["70463a050315edff41c45ca13cf25d9bc012b4105c31cb5b7c4cda0411a3f114550c1f5a5f02000000076a52655151ac52ffffffff7bd204ebf2b76fdf7c1d7ee3e835075031c3ba6829a4af5b3740dab0437c6f360000000004515253638f36c3cd66014d1dd4a5855f640862a97892ddc147a75ac473e02978f78b01e3556d41a50000000007515100ac51536affffffff02b5dd2a000000000000caa66a03000000000300656a000000000364e6e905000000000000000000000000c6a7be0ca91d1fbfef1f28fcf00bf946f860d5fa127735986318ad52c9a56364ec3486dbaa2e247a7cc6e3bd95eabb4878c14350494b8bb3bdf87686cb862958c34e32b2d1100e4927433daa45ad8b5e61ade49cf31dbf661ef23e1fcf0d238b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001259817be3420151bfa1ba3fdb351c1a58fda102852b37082666d716ae538f4088873fbd3304a3a734b36d252f9daf67172d1892cbccfcb5e554f0553c695988672cace782786941e43d0b94d1141c1d19744db8cc9dbfd41416978437804a69096f165325a3d777c1893698fd5599124c00baae47eb258b984899499586053503268e6ef919496dbc4c7df8aa7d7b19062720c91e6d35c34292bec74a3c44b5460207fba1ecd68d0daebc00891793ddbe1056403e0771d470345eb1fb5346bbe6130a080f09623b95f0a71f9196b19ca80852464cd4d9f49382bc11aa0c381f2551ac2f8500dcf0ff0932f899d5669e1e415997d4647befb87da77e93997fe668b24e0326d75f9f798884634bc899246f906b0524d4c5dab87f6d2654b18c1cc9660788030e04aa178a46ef12ab0782bfc8a0a9081e1f792e09eb7f7b6232d37fac790998031a8c249fbf3265c82285c33a02c0851bf6205905f1d47d4d22b04b334573149603045eb5895d0354dbcc8396245815ad19c2d89cab8146ac083fa46817126a1664020d29a20c1e4e16a117048eb51be4f6520535583e189272fbb762bd54136c82d3e25180af6a3ccf6f1532cb427f288a9eb2f911bc85725b1dd6897178537310f3e78e9847511789278517335161a841271b3aabc2c8e96aff5d0121a8398bb6be3b714af93159c82806be7c229bf294ccdc7f70e703a43d33c6e6958da37bfdb4242787932dfd7242a2e1f97d1c5a521c9c8f88eebca82a6ac6de48ac0ccf3857c90a4f486b76fd2217e045d25911de84d9b85b5c612b8b706dce105c8adde88022726357cd50910d5b4617e9907d0d188aa0340dc4f3c9c6b392ddd8527e17ffc865b1d0f524770fb2c5a63f9e72b5583480966207ec99e1decfe0fcb0d7686eb21f319166c7bf2b95a3c7531a1a2df85ea8db3ea8d510824f4f75c5ed9c328d75102ac8532ea7950e1a7270e4933a2dc3ec9edbc36481ba68c84bbefdcd624b37d76bd8b8b1268e4a67864782406dcfa790a1fb106d9b675ca83af87e23f9436ee562368c867fa902eb31efc921d34d97173f40d1cccaf488fed151e71bd3175cb1819996a1612486f3a102060f8d021db90bdef95aa0855ef6e60bfc58bc52b052356935b058133461b43fa888eeae8e833acc2b33000ff363f4ce2a9fc570a98594148970bb2a4fe1cc39272a295ce3e76014f479321237f9bf3c04235b1e648b6bddc2dd33a6d6b046d179c2abdf7f66512d1d0926f8a15c112863635f63832a62575c184a1a0243ea04eac73d03cd1ff7b38502919a6d6a33a72f7183ebbaaded0b5bd322f120443e0bfec9ec58fb5538e9dbd27b1f6e3e36d59e61211ef0b1bfe57d0c8673a8633735e3c21f052c2fe352473520c3b147236527c7f8294fed4416408bf715f1e2de343ebbdba5cc7e4b33fb13043413542bcb996ebe3a30d3b5edb66cd3b74567b8665823fcc30a3c71a9ce0e136cff34a8288410e4a3e822843513fbe1e49992fb7079535b5b2f90808c38097f11c8597290c2dc346d55fab1e99a2b5313fa060e3469bb57b82cd9f7e28038f5adf0ac903ca5afaa128ba25254c041d540666fca7acea47c974b64eb39ae753fed8fd5ef7b65ee75bea525c46c9b51ec0919cd156060dadd17f6ea55d4b27bcf4fffacf83bf4458860b2ec1ee0d552e8a3bf12564f57204be74feb38abd1de8a32244b0a412b36c1de3bf8dd0293f983b54527efabf874697f48e6ed4101ad72b4df92d28963deec7d84a47b45f243714bb412ae0b1dd3ac1eb48cc39cff020a4ee6e8265ab143cae766c1a36049020eb514236612245fffd1f608643bec31cd94b5ee5bbee1d5d3d8d6c191288cb9f97911218d79cfe773c9aeadae63a302e776ab2f201fe1ef93731fa14689db1ea1f8155b36ebe90695e4129f4b52c1b0f9bd8c45ec5b6483246a26a5f1a789e78e2e557af3406f5dcd8ad94e76327d25d522b87c2ae21c266c1fb476a2564b79f74113bcf9874a54b0a612886bbfc7234c35a87a0f2a8d2063423fcf75c1823a843d9c5369b3a2d7c4852abb91957f1428fa7da3588ab377d703cd7a56467ff61cf8b934c2a719790e02808ec2c6621f3e583a37b56edf6529c0ea687903d4ba9749001acff481cb205c7ddfdc69a256f8825c570d7946b7525cd71a8fda7892b55f89a8047eb32ab5763e104415781089c38471e4f79ff3b57e41e9d622737c60773a83497a3bae0a80a4f630c02004d425ee6cc2185d1ac89892ba9ae68bfe29dafe2693ea037b77c86a4200000000000000005b7640000000000083267a9b3d5152d8a04fe05f236673d3576860525c1a86829d2f76a0603e683d7561d7ac3c823ca3c3df715859186f89be9abe32708c47e39f4a25fabf83758b27216585c2585fc51c5006e503dfc7f0cbc527ff738c206dfae563d6b71013b700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff6b675d4bf8811bd5f6e42c93293a4987ccdde9b55be5c37341f5a6a7db010325797c7988a2bd7d545e408e7fa563b349dc95a86f27e085c6a0a2e668b4030aefdb4671676c842e6a668e6ee35674de9906eac84da35623fef2672c3659d9745e946c97a8d27698706cae6b040b6fb6ae454b7c74e28c8540d59a7b7fb467ed0323d8be838e285cd55cc64233230db24ba85d771fb9089192744c6bb5302678df0223e4baa1fcc4f1a2ab7a60a092bff9af5fab707b23a9ce5e21addbe46db22e1a0b0077576426e0c246e87f28408556c2edfac8ee47e5ff980a49f1735fde747910c1ddb4894f2399844de3420600e6217e4dffa65857321b6de58db071260b05c8032e557312c90e4e120205d431f100bb5b4189316dd99c8f9e53d568a1b0d0eb1103125726d86e95e576f54f6ea80aaae5255a50dfdd1f59d6de56e8645d13f48b85020e956a4144fbf56e707bdeed6f08d83712d830d41f2522b5142da91b66afe4b4021aa273ae7e33b89ee7aecc202b0bb4b4c2aac255c8ee0c525d6042c5d30db6e6031e80dcf8938c894ee16ded7db35af62261f24e359b0cce91aa64a9ce60fef3c59671a02755f07b3125f10d2c9d81ae363619ac4cf50fa6e6c0b32a040ee5c116385a9b999c11b4332bf155f6efefe77f54f524632e2487bcd8f81d1521bae616a19ab8c37f98d6a3415fe7ef2965ba899f41bc834fca9be1a7b4cc4e3349510bff7d40a474117cb09dcc98c2f220862c30d149df31d5961f275babaf11ac6d71e28b65e51969dde7c8a61d88a9090a737a24e3e73f7a1b96da29a3a0dc341cd0dc992985264b86f21df05b4d2fb8ffad405e7b8531e97a398b5fc82720dd9fbdbbcb720c25cace47e664e7ccd60e9853ec24e5a21485408590c1d16f6989e1d34e8a2022f399f17d1c5deed69698e04d7e3182840c18a63fd262f6fcca6828943c4de2e4b55a3f745ededa348116bfc6ee8603d37ea2e5a40014ab62dd57ac37aad592020254b281961a5baa7f41a787e7a9e13626e8053ffbf4dc6f7da7e89503addd5713ae2ec7217c0508ff931d1b1a31fdd452c7e4f306ef394559e1b4a6d103d526e465a4ae219b79ff3fdd074048c314b27a7ad01e450f51210b883a649b1d23e2601d3d076075433d5910f6fe661c46cb16e9a035676cff04a381151044a53ecf21a6270a531690fcdfa3e582f88fd4764537bac3fa76c547d242363ddfcd5a69d9e061c8a51777b16b08dfeaac5309568f8196274c4cc8e3a1992c3368cbd2d0045391462064ae3c08f549e2c4f1d6393b932f49a03ba5a54d18425be124fa4d86603dd7306888f04ff7e6e4ac055c4e5035fd6b97596dd696e74d5e19d88f7f0506bc05034e3413ff0abdaed652a507dc3e6968cb843522a62e05c1cb1bcb5dd23f22d13c2af9718c500eb6780b754a3d129b84399a72a2cce6396e4bb402372045cea25abba4307632579836270ae9f5da02de1c19694a12483e801a442a3e297c340658ccdaa29c94da97f6a07562bd46b536a27a8944039fab9cfbbed704e249f23aae33b3a97acc82ce638d90225607c53fe89620cde5ec8c5dc5cd7fa9a152d8b62160b777f30edf29eadc68587e22852222b393a15fcac596f2c9629f6f6e1304ec23f8640340d6a10bf420a1afcd5f31ebfa7d4d191e8ace3da880bdc7de385c8d696ace4ecac8ce494ce517b3552a144670c3fdc87529ab093a543174d44aefb96b81ff930d728db70b00c05d56082728ce5d19b7be464669cd7d921c88dbe6f456e8024163c25133cab2f591009e64660b33ae234e38a7a35c13d9f1472649341b1fdb1c7772aedda511964b56309215e7df5b0e6d331901dbdd15e1b167920d1b9cc9d09a4e6898864fd0246ebdce5177076d47c442b00e2bd1093daa1053e7983a92af6fc2f41166c29ee25463603e53454d9d4ef4ae463eefe332feb5bb81d2262ce997cb2e4eb4a43968ab4b647eb343810ea9ccda78e3d9637aaaec69f6121c0a7109976de0032732f9b735b5c57d20834f04d0d5abb4f63dba2e5573b2e5ce4394c68f9f36c720765c59267bac871f75b782b178ca6012d5bd915126618cbfbdc9b4b6a6d2c90995b3e1c85e3abb2f6d174e5579de5fcb69b93d735a25dc3798c054a9f4857ca6e8c2c9893151ae43a0ffedb7e4fa6ac30061bc42f79a426f66261d54254ebec146b8c9f44afe54b9e6c3bfbeb46eabc744246d33d9bd4cb6224d993c0029e0af48b8a18497351fc76db2cc2608ca506282b6549a1a7fdbbcfd468400d57d20afe1f2050000000000000000000000000e49eb84ac846b6c20a1c4220599f77f01dcaab45ab6fc9ea5ee2a50b25c1e4513b3ce36f219acf3d8bd3b662fd2aeb246aeaa0381cf96d48c6c80ba87c44b569c888ae19aa6776727ff6a2d47aec40d66a435f1545bf0674460eb53ad32de2e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064553a7120b0dd8e11a98048ab394bc19b6b5d67d7dbfc133e10377e21918929e28a02cf97976e5fd360b23a630b8dd6429b49cfc18e3f14b5ce2f98513a96498975bff54202f6ecd1db2eece162b0419788c16d12ed9a1378da83e4d05ca9ba22c474c6a00b15b8019e1939c27b06769d08d7f8dbbb936456d5522d4b4ebb1a02219971c685d101a8b8f38a873fd865accc4468e9d6938d3505d9ba0ffb81e08d022ebbbc09f13845ac8c93ad60bc355f0dc38fcfc819ca373d24ccae9fdfe912610a060760358ff65bceb95a658074026791eff142fc0e29ef823faa13c361c585bcd0a979ed538338ea6f62c4c9140f39b12278df443bd1ab914da6e07265fa0b6603245a784cd3a0e01daecf21a611beff7b7626e1d1a78958b1a4d2e88b06519188020353b0a7f60d580ee9fa4e5ecfdbe465ab30f37dcd05ca773bd85544fdea1fcf0329b455d3bfa5eb4f0ae8bb305e7477d28554e2e0a7e9a720ddae03979611a948020b834f68bef5b4a4248856137d1da2f2edeeda8fed0a630e17bf5b87fc7880c30202ea1b40f06f28daf003b79e8dfb4f8a8b05a941e4d0b998dbea6f048dbff73a9417e17c31962f57ccd159ea4b23345c310f9241e5385abb11d905e0c68c2df78c0cc8d174f2d1b4a078b9820a14ee8da4e49181c90225670682a9ed3dfae28c490bd5a30f2949ae66072dd0cacac9d52367da0808301681f99a1ef9e593b3bb4e3ea3bf8cb06ceacff3729125f63e32321bfd720b5282b51f9f123db946683e63ab5d3c410ddc32f9673b4e61637a10c2a2ecedf97f9c2d36fbe4cc4ffd453bc81f6b32db9cc78d48a45dde329c2a7517d3340ed46ace76149919215677b0990ad15840db32a777443f784e422e8e3a732e093a77694d63a06250e1ab76cafaee86a7cd5da3f6561985799a1272742e9f848d3eb5ef4ced6729b18f2eadfca85a312aca466e542e9aeb597f626db79af0bd596c7fd2f1ef3ca54b2e8c86cdfe03fb075e0bbc6c87c72d8c10e86694e3ffc9ab6a21528510e651f89e763ce3d3dc706dd11111c9f65c8012478c823fda13efd653fc644ed3383a1080844c10746aacb6470bcd1a8b4733e674e1ab221e60c33e7fcf080f796c6a40e045334dd7c71a0359b8eafb7e8fbdea1efcf6b8c6f876b4a382ed500589399ae3cf4d71c71307cf842adec0dcd2c88f9fa68f944f10462a2944e52f68feaa2fc6c5338604132ecf590a6db7eaf99bed11d5ccb5610f55153fd87db279edc0a21d4a192e7ea00ec4ae721b1b52491a313617c4d9ce3a7d7620c45f309049e4f5a0c12fa3025f1c3266acbf998db8b45582b32bd1c5db5b7c0f0fe34768ef3b4daf694e26b3b747a460b386d438d1b7aa3d48354c9a2e29f7127842a96729cf8785ddfd2c57186e6cfc8ee36ac16b343e1912781c1a24f16f6dfd1e30ef3b5d57dc74a2741e0c7732ad4ee5e70fb6c559e5dc52ddd94eadee51033e9d9bde7e0fc33dafb3c2803d00f386a219f31e34d58db18708bc81d0d325de4d429d1fa5a60eeda379681cafcde993fe83b1f3fca6856917cda696e774e880b6579427cd009405d058e9ae9d3af2a62720abdbd1adcf56ebafba524500bb9801d80da721a4a60dcc2bd1170d15d97ed307196fb806359f5b9b4dfcee4c5d12bbe5c7c3f26fe5d36fb32b5ab478f4f2ba398e6afedab85eaf30622f3f734d10f2370bd18a44631c2fa7733729977b9de69dc34b4998bda8b22bf6585c9ba28b88d8de654dc86e37821b640bcdf0cebbf4d3980f12c5673c54a984b538d89a049dd383fec4ad84fb98c4bf6d6680c35ad8f2e1ed46fccb43c636216ab940eb52b101b99d563af8e4ea4d011c7f9567de18f02787926bde6731f3d2b7695930ab0cbeb8653953dde910232efccdf1106b5d462c1748dc742ef9615fd60a98c49d7eecdf2cb76511d15295c20c03f6d6024acce6a0c490d2d5a90f29f666a4f769ac6ebea6e94530fab9fd4f2e844fe5ebfafde6b787ee631bfb0db782ed92d4de23587dd858a2039edea84b27f0195b5db457ba82bc6ba9b9e26776a42cfca713e5d2d6b8fe4eb00d49692ed164e802199a33422af1d6034c22e19ce2fbebc14ee1fed63bc83b22856eb9000837a65dda1cd0e547d0f1b45873ea9fddcd3959f24cd74fca33cb226f1caa707cdc36f170afb81a11e8839d4ed96a3b0a317624654ea676a8dcde75090ac53329f4d4bdb1c7eeefdf989076d03c082be2681cf787cf0640479d0e05d543c7eb43b3576bbd6b62a48af5be2ef37562bb438c22f8b10deb6eec93a79b0e829b2d08a31c7c3cc65ccf4a8254a1d74ed4a6b7a70e15e69b3c257116398d5cb40fd91abde1e06e9aa72d0c2de6fbdcaa5b4235dc9f51e8981ffcf70527edfa1126aeafa2b55006fdf914f3666ca69e09abd69401", "6a51", 0, 480032185, "4b528962c37518f4160790f00804334d128cc27b27e95a7cc4ecaf32e13af28d"], - ["0cc7887e01c86ddf19592c5d560cc5c7f2720d2f4b8d4c7394cd16df20ef85ffc6725ab7430300000009005265ac6a5363ac51ffffffff01c6227c050000000000d13659d800", "", 0, 1734439937, "be397021706832188eb49e62fc1e141c552f5b806f1d75cbecc221897319c0c1"], - ["3cb12158047822d88b8f7aa9d311d2cfcef2fb67a5d853e3f9029b037e7a6abc794b0d107a020000000700ac636a655200617be533365e290a46b30e97a6b945d3881562f4728938de1fd930be1763a1caa954a48e00000000096aacac005152005352ffffffff5ecaef2545ccbf640ef7df24c9003928e356ca7c12c4a217fbdbbcebca82c05e0200000007535365516a5153c0fdb39cbed3e41c622063fb1f52feaf5960716cd573eab2e72a9511d2e432b480416f730100000003ac63acc682f76b02c24dc6040000000005ac6363656a42adc0000000000009520000acac5363ac005771da88028d2075020000000000000000000000005c39d7c79cf50046cba343859de3ebe6946aeca93cbc8634592c36a1321e98f4111549e992991c6cecdcbc7836fbc04be3e4f009e8a5806bf0349efb740bb5a2627f98d05e57d6461c6131ac7100c6dd5f963c2e2001209dca2e0bd6327f1b2600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000525ad7c1ba9be1af65da2dcae118bab5434f3d04605bf54ae69893151435626ec700f2437a39b1220e8cc73e85a2e9e0e97972d64045a3301b33a0ffaca5958bdf1a9deea804d546030e71784ae1700531c66025ee744748a3930d1c1b0fc60520691dd7890d7193c363b2e6c7e3173622232f14b8e9883b563d25ab7905664d020be05856215111cf14419945abbfa1ee8c1a6f371cf529420a4517ff7fe7220f03179a646f542023aac2556620bad772bca54cb3d88a6c5fd21a8172edec2923f30b00e4fa576dcc9eb02682eab3ed58e00378815f459065628f6956941657ee58217691abfc73112de0247ed6462ed0922aabb48badc14f17612616ce9f14d7acd1022d888d3045751d8ad30cae0edb20a7e607c409d4315a35736cf952f6cede9d4c0214a8de6a96e660c95a2cdd63181ddf64b1c881e236921a97098c7584ccb190420309246aafa8a333c9561c4857dc693278ed8a3657c229d4a55f774d89294ee35d021fd113687769cd47aca1e48835ba92c08b7fc69c6d6d898bc08be8a1d3981a6c0304a7a81da1155043dc7a5f6dc578797b32eb6fa7501a9dc070994b27a941e59a714b08f80c557b37651e17b6ae3c4c6519272517cf060e5baeac0e51ab53da4b8b500c7e68130fabecd16c091e5d4928519de6da3fcf225a1080fcf1065ca48dba60a0681c501169725d4751991e1dd9fb58a07c28a1477c9c5fcf32704aa1e5a12bc0b0011d4d8bbd0f1303ded6c34fd530592b64f9ba6f157dd7189651ae505f91b4b99936235b915b0699e11ccab126f786eab6a17371b257dc7bb629e1de49d45f2ad14d69d224566521aae16ed0620c8f08d6d3d537b532f7d6d147595a384bef5d2411b2dcb1b2f6dbbfae4cbe1c050707aab338bdda331fbf11b543a338ba138ee614725f662592cd9d0add76efb446093716a6e6f752bf38d58443390bf2f4fd537287c27e90303f91ec34a5003dba4f42923225a1e8b1fcdbaf4141da2e098a4268ebaa986219b58afeb6ff0a35b45198dc522cea2bd922d270013d027436a68c4a9b2d756d90ff02511f556fe2f5103ee25b906752daf6dc0d1151abacd125b3d21e7fea9739c29c48df3d2e5512626abc05a2009040943f64820409a864c871c7d8a2267039e5a2ec2a42b2eff5617623a5a271fd401c6e60705a01ae0eae9199e87cb751d4ad71abc92ff32a7d15b1934e3aa135a8e8d87f5ac42a0aa3cca5942b00d12df69c6b1d353e6d5c8f6c69ebc3bde78a6e63f0bc3b53caa23b1b60eb057fe1c60f2f5ee4148d924de4b85c84412a31c65685cc6331ab2576370df746d49748e08c29a2ff143981a829c8b4350d2e02d65e6b1ed0b8d29510f63bcfc5b1c8b4f8acfbae761e8b42007ef019be567392c084810074bb384249cf3eb0818d7be9018199fd1ed50de12b0d1cb6a798700b7c7a23313dab762e6901e224eac440c7605cea383a35721f5bcfd27c85618f93c95456abcfca7d444decc120698ceb7b7586c8ea53608538a4b3b6d70df25a57ea34d9fb0d66486780e6b202dd3ffd2577e3e7ecbde782ed5a886590246e840fdd3d7db6b90fe1b33f14d11430f485fb8649636cc24cecf0e5cb5e742114c4497427c9a980c7dc5cd46cbd6f967b4b97cf4a00fcf4aed7f0e6a66960bdab4d9565971135563f13d79476eb5127ffdeaa7a82f118794e525cb52c5bbb10237968fd654251f97c67ea72dd6d779a50c96532383b12ce5f1a0a4f3038c178b8240787a9fec7df98dcde385bc752060d0a92c730240279963d2e3c822f4e48248f372a70b58bec82921345667aa66b06acf07a846d864c19d2f9d0c76179f7e6d86ac41c1046b1b186d1152db3cb7c050edce095cc93c0e5e53091b71f2426b2b32f006026491102b7a4dc68a78643752c1e076dc06cf18c86d6ea7560d575d0cf3e855d9ada61ce977c7e53e98ab8ba8d72d235df97075b24dd637576af26d977da66fcc1d3d7dbbaf7f07d63c3f2585651b69d6f4aa27126ec2a4171841035afbf3c904f13a151f5c00f026fa72b83f5d8bda39571e6d99d607d9277e147aad2ee732bca1602927fbea3fa53cda33a66ffa24b4432c4b1b65e947c716e1f9dafc40fedde95adad3c9daa19738a5e7f8f185efbfec00e4b171b44d3dad132450144f8a2efb1499328b2c15ae2c3367e86126719bf0b522eadd09d1978636dd7aaab405998cce2c0b3af74bcee935e453884b92f783efa55424081753c675203310f2fdb409bccd9188ace63dd0e919ab497eca8eaf76477a1369305f11002000000000000000000000000fb5840599a85ebf5bb8062dbc853010a24f6bad521ae3d123b4fddad8a37c1529ba1a192e0cb235d4ab57005d0ff82661e05008095320f0274c0d03d40f889fb07b183258957b8393ccf0f02ad155e7c15e85730f878cda7fa1ede3fe08982ba00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c840d51c81cb35b37eb30ef5d41995d011c48c452c98fb9d1e5853101227458c95e28220791709da7aa70c8b2296261c29960b38d4b52438744c67801a77838c3a80c5878ceefbf5c3ddb272b6ea108ebac5ef795c50314222bef045d101c03cb2c8e1007501604856dbe4362d260f1e8d32477cbc27d95e3c6354521b5dc5d30329de365a55a39dd80a2fcd24c29419ba4812cf5a6482d357b6a2ae86357d2b1502065510ede2d75ad8b16bc16bc4242dd0908faac242aa9de14e19d7b438725af00a02e58951c68d602aa7afbe89df93c6b70b8ab86833594caabab4253581429e0bc00e85188999d9b4a4a07c251b98b96183644c4f2e33d81239464be659da90a4020ea5c62617430922c86ca11c9a95e4e12a9767803bc3d5a9653886677b439a9d0318c8bb8b7728758fce3ac5c420c10ba58c25fec631596597ac5b04b80f0f562c030ec935dc6a980e0a30d529068e5ff37627d4fce42d5f54cf4aba4e3b66e3411302232481cd1070627db1c1c36197ed299fe005e038ef75ca6bf03b9896e38bf35e030f8434defba6765ae85b495e2111905027021319ebde488d060eca031e1d6a2144fdb46556be7f9ae618c86a09891647412fe10ff8f6a702826e3e1a901fd584c169529176b348810145b83ff2d96295c3a35861c606d6498548f1920453c524fbec4189445de1c6fbcfda86248d08e80385637b5af95df665d84fa74f9b64e032517bcea65b9f21b58cc05ad330ac576a38e9d2e269f19c65aabfc84949dca4821ad183d9161822aa5439428867398c68d86c409b43397b8f607b9a68e7c4ec4da23e0e8e260964fd52675e2d86609c973aa123f17bb9eb5681acede959775d1e1e163e1165ec3726f2b5c20e1d63d5eff1e91b4686ff32b67d663f6991774c3af66377f03f58f816d7467b3816cc79f7b9c07cb94ec0f33108c565eb9e6c2615f77334c676f24b50d94bc4e58ad28bfa8b0770738629e0d55303db34409855c48a205a76edec24e5e1a04cb0b48bb07378349fed9a450e41a84b46476adbabdf5639cac117cb7e6cd9369b68723c16956f841a093bf88e6d8dc75b2ffba2060e6b951f25a553711761008d619479341f56ce696244ad3feb094305ed13aa28f2cb7d01627dc5ed9befc75b129e0d6b574349cd4a213da406439673614d32f0eb83de6e68039f810ef5ed3cf4a497abfb022fda5d832077b8c47ae293b6ad8b76b427efa56f0b7f9e9571d59654e0960b8dfd56db8034d5baf8e71579edc18e61bfd336b9671a4599d5fa1099485b03488bbd96e7433053240733b8d534804bb66b56e9f53ebf87539ba7666fce97e6ed9fadac1836c249c7038cb90fa647bfecc13f16e2cd0c4d96a6bf228ad23e9f30cf3c6c1ec6a4467528ff4a14c6738308e4f036f37013c2e0409f23b1b03361ac348dc1788e28d1cd0e0e03e702d07da902247a0a9d5d95b9106fe23358544e9cd6c12455d58f27a6c41a655cecd940bf8d70e0911606e574f0e421e8f531a831751fdc3a9a4f348f84840a3ccab58dba9f676cf718fe1b0cb0293e650713bec04187e93e16d02beb28b88c398db82463bf9e182040f669e1207dc29aac49c8d5a64dee6b278d1fcc452f7367b9b2b4931799ec2723fb4ea52c2bb05453dbc6e8f367425f675327ef97a3f4b683f4a9206f56214ad0acdebe13d8f7e808715da907353cf5095ace856a703c86384e67696e7c78159f6a869fe185d3bcaee7cc620768cbd086f88945e82190f1520ce6064aedd44ef3239071529fe1c18cb39e28a63e956696a59e7722b775f674121d1c8561533aaa4db7869fbebc29f3fe5a1dfb1dc1c97ae066518e61650030aac29f43d878e54c246d7d66c348ec00defe325fe60bb2c5d7d393228ab07be502805cfadd99c17c52ff87c8179115b7f965b9df08f621554ebcff644e87aad644ba4d802ff00093de14bd10c536b5e96cf341fcfdbf8fa743c661b85edef71eaeb6905196855bebfe65ff8d33050de772fd0d45ff9d24bea65ff486aa79b463ceb4afaf65b1bf1aea93d8207b9b0cb7a1a1ff7d3aa27fd65235ffdcac6d296db85a96c49bb41c9822a68e8ab41edddd6442d44c6678b6fdb1f344816805e05410f5032d8f9ad90a55da96b9f116b63a565105d456e7a2a416c80f3d90653360adc65e3665b10d3bf5d5eaa09ddce489f9756b2863ebedfac91a3076da05a78d6abeb245e6cc3115262e3f51e1d43ec0c7c5e3fbb31a67759f53398176b4b287014655b89eda0bc49a8c01cc9affde086dd0d03f658268d73760578cb3f7195f82aee95a8d0d60647f0c62a3f8d4b52be2642253984fed6e404295485e65ed4a794b5c23ab10da5506a44370e172bd792081330eb94665c7cdae9340681de8ffa802d21b3a40359474343d7b830d1b0f7228a106", "5163635352636553ac", 2, -160947707, "21af35a5b9fab1800ec021808a26f2095e6b93ee1ca07ec1b36ccbd90419d0cb"], - ["030000807082c4030247b3f1e32d7c3f69eb32119c4ac26cdeefffccfcda55fa7bf0b7298fd84660f70300000009ac6353516563635200ffffffff15eac417887e421cd42583ee6f9bf4fe54dd0479c2746c4bd88b4809ff0fc6c20100000008ac5165655351ac6affffffff044ed2800100000000096565000053ac515265563d340200000000036a5265b06af20000000000066a5152ac63ac59326a01000000000000000000000000000300000000000000002caf75050000000037ea5f9fb0730e19de6f27ca27790b51a3e7c3466dae4a7b92362a573b104b494c98d0a5ebdf7e21d9038277b5f87928fd16bab9d967330b131b1907fbf43a78f6f656bfba0909be8e3a3daf298bf5b3ecd9eb6b378dc9461363fd19f90d27fc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000968f11675963e8a941ee06a8282f6013304b539390b047645e4a09dbc23b7769bf0ce9e6c27fb439877cc92a7d5862b2576513125623b0d912009d0d9a540ba0f62fe64956f6861b848e1816d0b183c7b1f9e7320d699f2fb56e46da8919651456a66c81317d241faed57e36616efe947788da0e5a94d0a3891cc8f50395abd8022f76e5c28f42a813b6fe7e39a300feba50e7cf15197a32d5fc5cd05b33aae4ce022810bd94b46a80c808f1fc8f51e179018446de9a01cabb5855617669e691a5e00a02fa068250a87471a14f9e280bb46ae62efb9bfed3e42a07a2fc813372cd872eebc2b3c0d7731f7e3c871f9081493f430decaf910452322a726c48444b08af68031157b31e702a0a84a86ba64c6a640992554d5220de294c7eef48161856ae670d022506a6e2166e5e8ca7c81b00cbd785916e6c9c0919c76f4776b297546f9aa6bc0317f28e45e6d2868b27a49d870e7bee8125eb505d954789ef9534dbdd5794bba503218f380d5cab6e2aea62b779c962863ee92d47e062f4dbfd3f5a31aeffaca4ee030fb955517b4332a35aa2413808bce7c0c687b88af5f1f1ef059e214f4accfe3f3684609ec6f12d7ffd69446f896f3223df82702c1d62d014531de07ad274d0f89d311f5d7bb781d7ea5ada2cfd6285fd7da7ac7d75d823a0287a69222e72ba997b38c1d6fc3176355205a84a1d2c1bd0173680f213fd218deda41493970550b83aadb37ef43dec69cce64583c677876ef5bd3e81d29cd004cc18ba0137bddbab3ca428efe051a6d25815c84f61e75c4ad5a8312c1d7c40432eb392dafac2c74d65b7fc50112f3ea5e3ce7b98b4e527fdc88c2ff7343eff889c204b680532ee09a4d05f3415759936da0d725bdc3d8d6b80d310efc1bd769e356737afb0db316f947442cbb0b59d03dc04b0e115bb46413e98656c01836d91045b3caeafc8cff6d004f4bd15565bcc5af755039cb2507f8a089c2838ad42e6a0e5774de681ed98025d2b985353e33df26fdbeb19f8defaee1e07cd3fd34d26248dc9aeb03d2bad1a41afc70b98ca78aa3eeae9f3b3de883b969455bf0627f36786458e812b292870c8f0af030f0b50c628bd30a39556fff9015c487c992ae86f5c7e12e94733dfd081439ba8675cb6464a5984587ee2974b4a69254ea52328e98174e22b5cf41460fa00603673e57956a93a2d8476dc694c1f3c0deeddf4b5df121ee8d6535562a00cdf5746ebe1024b2a1e633e2a5bfd3ceb576defa9040f6c2336c45bf2fad74ef003cbc61f46f2898160ef23939b80fd88cc094c93d90f4cfb345fb1cd7346a4ec96cb1239555285ddca6268504f51e948ca36e6ff72ce54cb448b03454b1bfb50c8c299a0583c02ea8b52a251808c62193b732141fbc0528a6c0fb6f205a62bd594cac835622dd331af7bb3c6db7e89145bc12e4fe28152486355c2e1413ed8d6efab3ac485d3ca0aa2ef9fc77bda7ab50012d862092f4d7db955644bbfdd5c9ada5af5aaed2f19bdf7b96bb95ebd9be8ad0f9e4eccb6c701902abe71e3b76ee74f4e9ccf90a3d0a83262b0ae27322081e257da1910191ceb168fb874123889a416201c4deec8206733c64e475b77d3926ea545ffb27d084b3a56f08bfde770537da213b8f1e4cbbecdf6ccc8ddadd340287265681386c58efee53320db0e7349b9725027e49b8071445d39118fab5a9003567485805a7d7043b7719c7c042a05e5f78238cb99cf6cb52bae5e76b1cac6f5d2c97c2e581c1efb2545a80f3ba8cb7b397f1f13e485618e4520ca507947577522b72fb3acf1fd9ee08e4a0be7657a8836d474e5650c5dc54ec3f37d24f708b43852ecf6c10dbc55bb8bb25b26f9368c5bf467fdb4d4b24b5226e01007cff150c18459525342a64872944d1013e4d4cc5a87a31f9b437fe1cbebdaac16fb858dc6cb3ad4dc6d88cc941aa5e4d0b3dea57c3c7018eaebbbc4aeac01043b2fb7863187cc053dab93396dc0fbe3e247e6c4aafbc4169f7cadf8a9917febae9c3c4c53181fc6b2b866323324cbe964f3557d129c3d932db2ea63105a2784434e25c347ba07852fdd8ca3d10dd54fa12675b9c6f45d2aac530ac4fdc7024dbf7b65a294fb6a6414e7c893b43e461f90c83d284fa4f686709225275e38817489facf92c0b8de7d190f6994d0bb1306b8f436be6cea9afaa2f7142b543deeaa6e440fa36cd725402666b35fced8666c1cd16c531ebe0bda362e203f59267326b70a3890af39d4f5f89d36893a3a851b872ea07cbc20129f083d358ffca03af5c1775c000000000000000020c05303000000008e671d00a4063d9c2efea19a5128ebbcb2f273d29f5e5a6ac5025a1a3cad0c1a9f9ffa98eecdfe7315aae8d36a54248ced4e5b7e272028a1b95fd53eec0340f33e16bd5a4f071d465f9a57f14bf0ad0775032429dfe9ce2e4c59e1c68a7346280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000032db2d0d702e78e062605742dd9f8f3f8ccbe5bd4e2e54f53776ff065b27b93fd33382834afc6fe775cd587d7bf81ea0cc522a1e832402450ce60574ee157d4e8331563155cc7b7ca649122737095c274f7856c28c3b8cee272df8c3a0ec4c325d06240b6d3438b3a90ffdb7b99a5a4bc19ead77b58527945e94f103c94a79ec02053001c17dabba12fa7c5d6041c3060b313e50a5aee99b8dacd59f2a8ef43dff0327753589bc1129fd1743b062ae5ff0970f154bc7ca42f15bb740c227325d514b0b076851221b743fac31374ef8eb7bb2282a0411d9f247ad6c7e77a2436807335e5f2680fb8ba3fede8f64d91ab9025d23af026eb6af605819f7be85e696f536d903231ea7e4df935b9e733cb4b20cb97927651e32fa8cdb38fcd621b4dacbb1c94d0312c29fecd76c8b4a27b52d7801403f30746e8cc315a37ab58366e37abcae5075021543b742c4c4e5c958a97213a2f33341d19eb81188f7f9ccc8acb5f19f36af810226594accaf533cb564dfcc25b038338de929de9e51f0646bbbba04ea5285f143021ef350122bee96b06dcf321299af70db2e860de7a09f932b5ec125779c06a1b37edc31ae2bae964ceb3dba0ff6c6ed442890c7c1d11a0c3eca5f75e03c3ba684019b66b837dc826f3028532b2c9c9da5c2e48f495cfd7ec9a7f93e36142ba5aa23983d6769dcd1580db8cd0be20f8af6b29a46deb59e883617507b3dcd275387a2480b38ea97708128432f0caa24a011e13ebb5b141854d308e29a83748f3db62de5b5ad446a83b5370cf8a3d7a08d29acd242cf3e686c92e98fbe6a20b2c7d367dc39070726cad3b7145b9a5b12ac5c2dbaedb8881c81d8b545ac00e77f916e36ccf6b3a67031df1d4b7afd7d6cb7ac128d38e2f6eb77f5ada6b4e32a247e99b8ba0e16cd2858988226d3d87b121891e38d75f41c04961b2e9506fc0140f552e5cf5eaf229d771cdce1194931557fa9360855446e95f5c18eb8eef64ef24c414e4bd975aedf086f35fae1c70de88fdda98676eb806d5e33f1c6b693e314fa7c12306b30eb56a7afe12ef4a11146b230467d7373cc3eef32994b9a04429d09c018df2c5e6e678608f58a2d2ace72350651078fae3f8f71023f49b6124a33a64ec71de7b564a2f8b1cba93f0a92d2c4d86312f5664e2d4a0d19fd830a65a30c4a28a528a215fec406c04d087fbe3d5a92a45687e89667632cd3867026bddb93173ae241d87dcc41f0abd63b3b56062231953540297a8b21bbef8180eaafc5f71606e0c3d4cd60a33cea71e42ad4b68dcc3d00d85104cec2241826584a8fac7b455541fec1d0f86634c1f81f3de5d14df2f1634790c3561bda48a1bdb2cfbf3c7d6eed6b9eee223d6196aa245441056f58ddfe792e7dba15e0e939c5cc50588cf6270d4fa16fef2498e1c337283e855291e2da952f5d840ec82871b35938c02c15885f36b362983d2108e35591b7a1bae99651e90cb325104bdeaff51fdc19e43b9e7d0519e9bde1603e77498e97113d730bd4cff56fa3e42c15dee1b206cef835a39eb9a900668d5e919493b13031286fdff1e34e076d18c12af64b73b24f137ca85d6b70b6e35c6d80eab6e41b4d77bf3ded39812e5b5f3eea9515c6f24b9cebab5b9f75045ea002cedcd93009b9e41e927c43113b197f97888c42fa0a8852b64476d9835d618825ca607296538814ab8618c7e51c34b08b0ba53b91141991f40ddb8bee4d70183813b9fa49121b64aec65662f18de921cea24f42cac90a09e7bdc252bd92aed9863f941b23a9ad21e44dd3c4e2ae542f65ed24152cf54f68348a20524c689577bfbe8002d8abf1c6185569915c58d78e59199c5a8c71e89519bb55d9a6807432417aea2fa8d55bb2db4ed0ff669255aef923eff65317965b6ef5fe2496c1c6cc8e13ce7f8901b7324b5a530f70d86f1c01e494955f11f94b17bd3b90fe6461b7c96f9819f911dd386fb7b89f9ddb55a4beaf83e4de52a78c3803ec8abc059252380c5ffe381141fb5d0ad3a8c1c80cd28fb5a27aa171d0148ab10182b6dd51622a2038ad6b925be28b89adddf13a4364d743a6c79b9588e527f18727c2fa67caa3618fcd755542ed819c2dd0c61ed4ac9086bde29669c4630c9da40c1643b1aea16b6310fafd9979ac3f2b37f73a1fdf2e8869235ac0aa9427fe1b3a381642d32b2492879d75cf85071c091844dcc9b4a23999b26c739fe115d284f7252a14f1eb644bf1f556c300dbcb8b844acd76d790d83fd57c0820a936b1f7448182480bcfc94b2dc6d85dfb50a7c0a663ac020000000000000000000000008a2ac036e26e3c733d65715911e8ee9bda315d5e2b3f444d1b384e3d353becd1942c6d80675bd1d69d1463ba817cc3598fc71aeb59914eee8944c9e0d7207bcf461c93f9a5754dcb0ebc0b2f537efde5bca9e9fc93fa0bad67aa8c2da4c0b9870000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000094467c69541df5365cb6a62160e77768c62e4e6c7e1c92eee6d72f0c0290595cca1b913aa46279d270c9bef713ecd58981a937396f72d2bcc4a9b6e108c46f84163d09c82810c4fe3a7f4682e339312b5077bda1099f6bd355ef464f32e8c56f24b9477442f768f94e94de095b7b2ecde75bd5407579703f90567d873d80f9fc02001ff360dac7cc0a7435c59b0dd1c7770b0fa6a1c2ba6dda4e3dace7ad1439240308014b5bd70f1d29bf961f586a020407ad197e41798b5683d77241c82f9446470a037a342a287d0e0b6af93cf30f9e04e2baff965d8f5a2c2b82411632bb747c2e8d2146d7f7e345911263a735c25fc958af7ad2649b804bc6bee994656963bf54021f57a5d6a65f3a10d91e04b82f9aec40433b4847a7cda78f5b2910a444d796400321541b3439a6679d38801112ff1eb3166b829f7ca798c3a3542de50376ac12e50218cc5c6d4a5222ee7d9475ba994df2eb34817ec7860b6b105501a657c780449a0302faa6af465288b00f80b8c0422aebe95f08b3bb4f25c8f408bfc5702ac69ee203179a7b5e6a5e9980c99606b24f1ab3c4708c21ee7e13d5d84353d1b412d634a3241c8bc8579c891b24beae2ef195b25262bfda6d81e8914148d01c578aea0a1c3ead04f97dd0a305045865ec41397df5e437f06cf17d89eb7e9651bd96a8ea48da7061942228c41639e4b1d75bbacb8813adaedee5ff1f96ed5c0619e9422258efdf8272ef5fe24bf9eca3b724803ca882e39e1e111152bf8cc6b63d7186ff84d305b22a8b9bf03419c4cf217c8bf77e2b90bd3ad7f82838695922c11d900ecd140d84495274225b19ec2137b22076960f46b31839b3a225016805e6f5b3c2c87a0c4aabda339cc75510aba418e8bd045052bfbcce0ff67ff2ddad4ce7d3ff3a6736859c5ca7b950e829a05735d8c02b9ed6c342ba041850e7ae3dfa72febaa0e2fd5be03c9ec8cb3cc3e24d411116a34a75b3c6e95bd74535587a69170dcb330ec229f5d4e3ba23eb98d797fb8d6ddeb2dbd03dd2e2e7c27908949656c28351531fb43be4802ccc11460f45d3611b1b1558364b05a33eacf0ae2e91d9774fc87413161254714b634fd6735594e20fd3ee8b3242c94047e7c14908fd29b998ad707dda6c004e09d2e458c8b57d7bf485ef6473eacfa3c702a009861049b5d265d438150d29ba6ae4915d98723080155bdc07edd45c9314f60db18b071074498fbc2aa97cc5936c27eec31c41f294c5449b313ce892ac872b8c713362e58f429dde8265dae6f343c89c0fd4723455965e77e45ec559bec329bb32d8e179f6893cf36f83a8e04028c1ae81e6577924f7b2e42e5150cb95a1ce479c417ec015d477e100b0d861d1c887391a4c0a05a66c827ea9550ffb1fdf27b97a517c60dd585198bb77b7db34c15790629421aac8ef1ed5e1d6713fb285a112efe3ad3297728ac3f7fa1e5fe64692aff46315269399c3927a3de1fa8460c521403f1fae1f035ba1ba5c0377ff13edfe1a4763e7ce0836d1641b7b7226f2466c3acc29b27871d82f4c5f2e85c86897a7863135ff1a870ca4cd9677b8a235e521541e20bd4e715c7ad92119380e50cbb6c45aff188a3b630db6656890144a05034c3b8ac52193bb32a288be8a196bb2806bedf767ce442cbd1789186595f39c147566116deb6f658d1ad6859cd018114c610887052480838f5eab60f116149307093781b54a5b7c91cb76205e2216a326bbb92fbbcc64ca6e9c2008dc95d20511fa72c368599c1e48ec88e7460d4619cb78ea0b03832f9a7a6350a70dce8a41c28db767a36b3ebcef9a86d7a3aebe5919b8f1dd3260afbb4eff6bd27a9119b32642ba203b1fe292f6ff00e2ca81e5bd8264f7a3f3554ecf601d5f7dac40a4b96629555c891d784fd88b191b031c0812f39297f768a84c0177c7057c6c610743ad9a0b0e447da2be74b70184baf52fb872a0169e1fbbcf92c871f8dd1e6f5b18210f22e93e3ff8e93c61c1712307476940fff979e0e8f4ffb25fb479a7ce5f72a8ccbbc958ccf9df5e7b0231f9ed8bc18243f01dbff98ecf98e1d9e658ebd1ae94427f6ef3128d84e8a1e080f714323309be173a3461d5100a9407c81f40391ca6f3e22d1a4bf670c84d4c26bb9e64d397473ad3dd37c0260d221a088939f23a3d39b3c0c4e96f96d0b909d3a8c99cae5999fbc7dd3b55a32e43e5a85fd71d8389e5172e68198b72d13898fad31a8ab3cc5b266add05064bf6b867c067dbd057e285922e4d156b7fccc525c33fea232f4961fc12a9681f34a691569491dc77d0e3a89aae167f770037180bc6d2cf094016ac7dc23c1be1bed2ed3d12cd8f642c468af2382a157b07dbeee4de205e82084d3bee1b9d618285b2e8624852de5e3553a17169fe6c59ce3237d64a3e036f267d34b24fb27013cab90f", "ac6500", 1, 418809954, "39cac2914406bcae92f9a95a6f3c13d97a2bc196aacc814594cb803d1fe51ded"], - ["9928173b0356d45c70a9db9f93b63e84a92cda0aac0e4ca6fe9400bc916a0d700e1b13a91300000000086a52636500ac63653abfd88e1da0798477cd01b4449f2ae8882d1b235ae6fb719ebfdacdd5db2a8efa9234200300000004536365acffffffffdc3ed9a12a4555242f6eaed0440f32740c2ebd72581efbef6c189bb0dc3378920300000000ffffffff037528220000000000035252ac9c05d00400000000036a006572057c02000000000152000000000260a40f04000000000000000000000000a7c3a6aa24880b726a109e1790f2be8bc78af6b8a96683d82d0be6486d98be7126393a11ea5cdd91609705d418a193340ed674d516dbd1952c3fbc8f2ea86d3536f7ddb00c9010bcb36fa95e4f2376dc94e040ec15cb3c76b5178db2288bc00e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ba135034506c297e03bc46152e493875fef8bbcf2fb6da6d913fff4a6888f87caf60dd8142c41d7e7c6dd174c6cfdbb67b4b9f7784b902cc41c9708fb04fa8541314de0ab57561c109977097d7e854a3b6308bed816aa09b61ba5c16a78d60f0cc310e9d8b01f24549c8f38a51a78e027bc91f63738aef86a894fedd3bd0e9a02239d53c23fc53f7246d755c39c553dda573c703c2aed28d035e95afa078aa1e30217d1ef13d37d7b2808fc4680860176161b49e4b3f9bdc86f69d783b1b1365f050a06e8784593719e0e1fb85b8c5b14fb443306eab0150cc7a4c064a53ea9cd2755aa5df1842e65b184301081430919c7cde73e462356b97c9ad4b39f56daa047c50322d9c72583c487903d3da3147191cd52f1966299a095d6a134b135041fa61088020d456a26aa9610d671c8c64a89cba467e144e084b036188384bfc5c823eff3d00217d35472a8484d135e801242f903a32875df075b3a7d717f3f87b36c923e8bbd0214344d0face2079beb704598b047c7976df62c04927ad804686152a87388dedb021eff7cf9b6e409de115f3df97165c52db2188c2f50f6f2d25a50bb1facffef9f41ce312acfdab508f213db908a175b2b86a22fe7c2be867d00ccc073b60020693532a3ef75eca1bbb274d6c774b29cb5ac4edf450eb8ada6ee7a6c17d137e44e899861db15c8a7c97dd0b2a79aea989b2f1691f4c78f05b0898a059c509259e63d2fc063fd11596c3b16509a014ec2a8d73f8ed390f39b9d1d0b9ebecba7bd47537ed80ac48e33b9aa2533b8838194bd2a9624383251f6fb1c9295aef85566b5a432696eca46e3a4c4c4d48d21ad010e6f1daef25401e239a78c6ad65865d58f011e0374fb9ec07b1ffb1d52631fa650f5e66f3b697ad45d67af9eddc33ba0e1832605f76d296fe413f94f6f61173ae74c34f67f7dde41d1d29137292ba7d3d4462c5486204ed7ebe1c280b217e34659e785414fab8e0caf0f7aa2dc75ab72b33f83c088ea638f53127e4c392848b3a4d8d4b126069d84a1526589d0974c84c9c2b68cdbe9215c27fecb3cf8fef39a8db016d1ed6f5970dcc61c7ebf9121b4cd913a11c64bc5286693042f7eee574fb7669190334e4fa73c502499300a3f6f9e6caf72af1703340d6bb2de1ab16784aa14779ac066a256232fc15a86ff1d1d454df09c1b4b72222d99655844c67fde6bdb4534523ee7b62d1a8adccbd17fdd6f9714851ef514487d129ca06077ad130769fa5605f0d5f3260314ceb4829412585f9fefafa28665a19b9957b6b6f3f4ecd928b5174ec1773aeb857ffd58565781a400a1ce74b51274b43468d2695a36e593c06d82339a8b8a69e11400480621a22562010ea814bd2c16bdf48b4bb12fe4ebc94b1e628cffb3383f583000f312d2cc3434c00dad8608c1b12a3df8c1840c1d73ca99e53d8a8e11d73182eb8a750e77fdc05858ec91a3f0b5cf816ec0f5d118f4121a5961d931f27407a984e8ec780684473c1bb9c6001e387b567ea91746f5d3b1b958557c34dbe8ba2ddb75df4482394c84d1be69eb76da7725962b8e1b3f18791bedad1f2f6500b70e1db02addd492d428ccca97375d51d4dfd4f06dc2fa48113ca66e57a717e77ee34657afe537a21a58cc9c2d5128d7da279a6208f2740f10cbb43b2dc822504834b8f435dcc2c6625642deda9e66e04e610d59b6c2deaabdec70822775bc44ccde4efc37ac3b049523a39137c9d1be1f0c5425c9ca9ad256f1244aaf56856157f47006ff6a1f67cb2071b57233953ab49c7297be13b25f053add44c08b245fe513e9125f0aff193b591b5259796f112ceeed82dfa78a459db98506223cb9fb9ab4e914a1e33bc5b5e420f2b8f90062ad054604f72b40420d2353ba6d3908e0784c685fcd1149087a5135abfdfc74a4e9b6c9d1efd77bede4ec17e33f1f87a1604edebc42a0dee77dd0f811f8fea5a4d2b75a8bc0c761dc84f1abd0c25bc1ba82725f42d9371090ba82a9a32117520f6e3d8a55ac4d82459b53c2d165945b0d2dbe81e0b180c316347928d9ba27292d455094dc26ad372d07b577bef8a9df84532bb42806123197ba4ead32130c8342d5091ad99f7f8d24f7fefb76b6e0530f7cbcdcd813785778ae121132fd72339a1cd6ad4d206b9d22ec4f9d796d1767a56d4bcaabd4fb9fa4639d117aac00c763380b1509e620535744112e04a91d83bf1da1307156a109120fedf210d59685ad729f5988bb2b276090108dc4d22dac2cba07e577c7c86b9568bf76e95e0357b1bb99327442f073a80000000000000000724bfc03000000006654582e5f2cae087d112db81b0f438d854dc8c08eede3933a000890d387a34c16c62ac9b35ccf4c21515437e08007accbfc9ef63182bf36bcd9b14e20674b497134200554040d780f9ff6643ff90dfba2267b5edbf271b7f593dbb99c2a6c39000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e0de4670f2392760d13fbed86a9b2a1afbd25a6feceaf5a317d1338afe40548658467ff5ad75caa4126719b7248b461ab99dea54a00794ecfa53112ef976368313d3002b5d6bee76a6b22c2a458427c99aba3070890a45f96104745336fe1a44db8b386c4af7e6257316aa8b789a85a29e5f0437c65574608efb2426efa7b9302063006e7bc7f10f0b8bd98954cf2e99c91f7e613d543f14b4c290f16e54e6f7a0204c9de1a823b4126a939a6446b7c1c053372143572be07ba5b29e24e8bb2b3080b0719c8c84e3438d087430afdb8fac9830987b636dfb1a17cda82725f751178ff83d7bddb8ac964e7c365609bfae3b4d57aa47e94c66d9924c9965f6f0fd1913a0323e25d82899eaef95d3bf0df278ffcac1596a804902eb87cf10ded0819c94b060306e8f99fc927140a5d9b0136f12040ea4749c811c4e96c31748bf7ff5019f6a8022e6a1f63c8469e6f8061b26de4fceeae67a819867e1c4faf7a6c330920ea00ec031ce27781ca8e2e1ea0fc6be0cfb49e3186f08653d6dbd540f76686495f56993d0223ed408080a6b86cca42ab5cc2b068e35a0e41e7716f0ddea979babd353e0f0540c2b41bf70594e6460aa7edfa5de246571cacdcf8398d2b0d13cd95aab8f7ac0715490017608df1e0061784e51d19e8cc6de6b50d771493d6b4039ed90255339aa17e5943eecc3659247276fa087764854e028fa450e5c7d202cbba17971a2249a6ee0c562544793f251bc162f780668c59070b66de637e701a4b1c2d6b01e6a65944837caf5eab0162a63b7a6014eaa4ecc82c92dd3ef3da48633f405bf3e03adbc3089cdf6c75d0c87aae7d2c89d80661d70dd46e91fc517102e48782f4b3cce8553695b9e80b8cddacba1eccd9e78a178b7dce45d498d22499a2853d3113394563f089d7a69a390a8d1ae5545fc3f6288b16894c2c103a35411a5c3300edadf5cf921fa4f04f6ecef1db1f68faa621ef3d8891cf875a47dea37293395717ac81a89f4f41ff784cf6353032683f8b1990f8564d215f667f04b8c8ca32034302202502cd3657452a4e17d7f33a200b45be527cc6250462804227cf8d952ab979ca7415f7f61acbcc8b33eed2a2f9ac74ec3fcc17b41f8bde061622ced6351cfa9ae620d8431c12d1d7e4f1938a38e7cb627aa4efe1645be0fe53e260b4b94f74b58f55ab476b7af909cf7e9b30f24fe20a248871a12c9fece6d68585153480dd88b9b9940515063e1d79cd720a1247a7d6f917bc8f0136941589364de62752d523615294f58e7d0d79fdcfe91446bb8773451e450540f0852c384e55351f44abe3881a069b47ab7577e7d0f2d1cec9f6bcdf043a190b66a7b22fedb85014917e629e47aec9c256fd88c7bdd959ad31a8993df3b76cb11d9153bd3c7d2d7b3acf33374aee59f5afe71bad8947f40469215cf944558ae964cdad21e7cc9654ff5482c86bb7ea3d8bb5deaa3ccd17a93a07655cf5cf2b18c0afa84985dc6b2beca37df765481fcb0ca61fceb794a3fe8b1aa9c85d01a9b7c3209442f57cb3ff244b497726940b58e1d83bafcdda3afffcaaf96d5f84cc08ba36cb889e7400b32b3d7daddcd589e29ea9f3aaf7ba1c2cf87a12aa5f59e9998a5f5b68fb97ba542ad95141357d42a95dd954759f363cf4dba98f26b0b701ff7bf2d85c41b34f35ff9a72c4b8a9129a1debf4067e0b8b2f508dec2c589b75433e89c08c572dfb7f11afeb53c17faa831a956ff5d79bd1127e6e68f1c2fc3831f2c96ef93d1033bc99b05865e813fe0b9b134b79d78def65a117c62dad96bf8f211eb09e067dbd8e0f34cffe8fffcb91510bc8cd8b90f33af2f1f4f8748b920c92acaa490fb3644c4aaf252919811f4095e60707a41b271bdb7a85efbf7911f0ea58048083f16baf76f1ab7abb5e2a0ef27f09b83d1036b601ec8da515ee5831e7efb64d2783da56c7316c3166b3c831cb21a056eee4f8eb944167ecba1abd7fb2a15debf6810c31609cf5d86baf7d680ce1e9519176c12c1248d056d5e627cc8e299eba7761e3eeec80bf8a9ddb8168d35267e43a71faebba765ad168ce56deacb86034489dbad6ac7e41a4b38b156b78ad63fc8bf8001e302aa856bd08d00510f3bb73fef53b2a6b4f2b5fd734b5dda6681cb3f1cd8a2f366fe2f4a5f3eeae9c40c39c1d0a3f9a76a6855cec84279886dcb9a3730d747ed982912b24c52c450435565b7d0bbe8ab8b7da8cd34485f37bf825c49e3058598c2867f7b0655ff9ca8ec445ad68a92183302e45c0613234bcaf9bf4b78b63d2a9f5e7b9600c2f22b932ed8eaf0cc08f86fd607bbe9df5b2d699d15a43e6c9a2c9e34ac77d1ff33487ec0a3e3a83122aa23c8af0ffe4be50799cf81fd201d8b847cfb6e8f5da4447b7856b7af68d6d237ab1ca7b9223c7999a6bf47faeace78af8d501", "535365", 2, -1994589496, "96e9e9f8f4fc6f09873884d8992483c554c2f4ed15ad83e56cc7398185e91190"], - ["030000807082c40301485766f7af772a560417154101e77a70dd3b31e953b7c2dbd01206a26de2301700000000045165006a3d3a06020187baaf03000000000100000000000000000002d03626040000000000000000000000004c27d9f716e30893500046a753aa3897f4e102314dc329b404f5f9ce2f41a2bead1b0ebfc85a1ccee5603d1928a3f07630b2b8b8dc4bd867b62352dc27b83ddbbc88d47359008fb4d1e5629754a155a503cfcf6c64204dc762fbca762259e32200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000663f3c7bb7ac3b899ffb71b1e712e826bddac3c53fe7c228c1f2d7e5a5f5998223b05b635431b416b164161cef4d6d39d2c2120dea7dc94f0a7547f7bf6b65ff183f47ef215100a197d5a78e1b8cc4cb28be878b9455c3990fe964d31bff32950db26300267cfeccda627c83633fa6070b7d8843d457f5bee81d3a84160ecdb003219d6ac3d73e88a02bbbe9d77b84408875b16a267356104eefa0fe46e177142f0307bcd03251d385b73a3ba8bf649ea50b75958630397e01eda8cc805706053f1d0a07a5c4cd68b4f9213680242844e144303e7a46dfd5cf2957f9c59d886f8daaf3df500d5733b149a8809efa16f122e66280ab384c92856da6f4d49cb24a97792d022d74ab9532ba897dd45a096c4b2b8cbb9ab253a2696b8f9345018c7b66e00bba0222f499bd34f81832a4471bdf91a86020bb2ee3aeeea4c79d29507f36f4a8b64803231bdf616761ac8cd1be73bcaaf8d02a5cb8d60885411bf5a12c1ad079a946ea030e96fb2ee369478f0c41c1cf4c70f27485f060c1f2179ed7eadd23c39c2ac4f60311377ad655dd81ae4b8f614a5295ab31b39b7e10d3462e49a6d39ee6e12d434c37b3c1b4e60b10028a0869aef436717c77230c789466aab717eb7eea9bdc1f61eb1dd7a7133848ff6c16f43ba3358cc8d74f106afe910b1535a484ef89d61cf75a4d9b265f27b339a1f9ea626b688f3475ff2f9080e2cfc8593ffe03cc17521740a5712f5a848dd236cdaed2ad931c6985cd002ca6dcc69773fceccdfc48d2e03b843cf3a3896cb83c67b90ed9c36fe2df0a94e3a068a9cc500ff5f7c7fe1afaed56a7218f0029ef69806c30bc2f5099c7096a7614266ec4c03f6467e4a94fdc80a6e293b079cc7965203a3b3156decdb4f47596ed8ae83ece28889df4cbf8ae7a2e20d59595e9e08c3f1773578ae43aee60a06c30984117840ca8164089668312f51d4c0f400a001f357661982e759822a3a6d49c0bffc577820152291f72a8b645e9388c45f25acf3f1eda69bf42ec2f6064e0c1faa705b3ed689e61bd9dd81523280fef6e9996c2694f523ae243a791b95e88cb9af09752012b6d4472f95e401cd8701590fe9a73051f1d52eff4401cb4a87d86fd2df9d59af04e60f116ac8cb97f564e7fcf504dbc693a646db8966138ff5094e5cf979be69f7c547dc710869068b29403a55c57fb634fc9a8c7e3dd96f2512880381d5ca0decb92d19723a3eefd719b66320746438ea798087e9112d42c280ec8ccf7aa16dd286240218a16ca33bf5b4a4abf1dcf524a3132694efafd08eb9b0febc08a15a49c7e3b974466955b2faad4969b61f4056a7026e5607bc0901258185d5ea93ed82ca59f0e63078bb630b6c0b6d5f6c047fc7106033250c0f4088b4806bcf6bf4a100deb84111548627e0183425a4eb8bd86fc3e9336c9343129e30b041bfe718050efe0882aa67caca097eb6fa96e3002543c27afd11f0baeb307d71c1e88d64d100526163e1927dcc923946f902fa76955017db65a325d1150658f0752db5368ac02a9bba4835c263f8129c801a404bb61b3ac99340e8fe87f2e19989aa53cbe13fdcb9bdb63b340a1353cd32af113be1e16a65aacc526d74b92659c595c2c8b25f01e43d7967dee00224b6038327dc91557e428b3aa25a0fe63eb46aeb20176fd1ed04a06690364478cf6dbe5c076ae9263cb00f257838a4e68a5e8083ed378c893b15509e252892f3ef1cf7e5aafc8a3f28b194d9ee19ce98ed70c52586b661cb6065603ec27e16c906299db348b3030d24195d9d78c1568a3482aa0ae9cb15023761fceeab9f81be076761d18205b199bbaed20407937f48710d4b552a825d86a40c6b6cfcac022743f2350d62ca6c0a3225685a158a14f0c814b524a8e66edc9500a693c4484445df1397921394016dc4fe898af4c9deba1ba3c176f8554999d5db45b02dfb896ec0c2f4e51121e9eada9016364cfea48c63eb8fcd4b9c053cd892297e9a3fc84645efd6256ce70281024eb571b383562350a583b64bc51553f960d473c328d31114cd8f150b0b902c7225184d62411b4c20fa9d597f956ce51243070953351b2675f289c5522944cb01452252fdcbf4d7748f83e61af5af8657217d2a521a3752326a1ae1c3842069f2e0d0594032f5f3af76338ee4cca524f593cf2fdfc2edd20c930ef40177ee12b4cfe4bc34c2c64408631f0c8dd9b7a0be842308fac76ba4b2c74ef34e15a84729c74d54915cec98a923a06c5b035a0dbffd9c7e81f5f71086262c50dad1e82f8b159f669e20000000000000000e0da54020000000085d91685ac48be3ea5ce10d922b2d17a84fc83f2b3395d13e7a83f97d2067785602c1c6c03742f03f97e5ae164ed4ca7bd01f040478eb5417abde052b9e1126a882cab730a78787a0aea4972a22058cf7ff1c1555ccd7e15e0eff63f0bcf9abd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e53fafe450545131f5da209c0afb723259628f170849d9ac003d39b4b1fc13efa5489685c460c729c1fdc501be4b5bab9b7b7de60152516e91a5ca906e85d971b164e4ecbb995fb45027a5cb1d3443b9b94ee9a31e441a5ffd1420cb6bde16a13f2ffb3d3fd7cb6a191de961ddeae5312c3532ff0813ce61d67fda8de4bbf1dc0309b67b930cf228dc2e578efc9f0429f761ed14be2a49106ef4e62db1da1708b602011f2fa568042e22ce9a734b9682c2562303e9704b9d74c6b94f7ba668ba3fac0b01a4033ea2dd0f3c8c00bf0d9112c123111212e2d2f3ae56a5e87109a7b81ead5a5a55aeb6101fd92282b1d67e42ad124db5219965aebd0511ef4338692aeabd022b37246a208a0c3baffde9b0916068eccc3f5727e565e14754779b7aee8363bd0305cc64003c6116333193c896dd67295c6acf7b64b7e8e0a3687090120fca35500317871fdf110bd223ff22c842727afbc5003806809b91b224e7c50bcf9a0c53d80302997429be6ff63ac4a57e7c51d6650e9635a25712a68746033565be4d982326021c86d7c030d2333fca3ca147b8a0e3bfa2832e499222cfaafcfa7aa128f264c10ee9efafaa8d846e32756f3755fa8ef466cb62e8417d0a3e98702bc1814ac14920e6e154e4c0af6216f88b9634032eefd9fe16384034a2e7870df16c6135b9ac0bae032356b012b7775cec382d9425753d70ce221524495c53534dcfa907175e98907db9174a96c06d50db6f43fa0e289256f59563a993cd44612920bc1530e135ec3fc1f3471c2bab1f20785227b278cc95d67b36119e9f3b9a2b6c7d48a9bbe5309ff3305ed76f3715ef6e3a1ba630e32c2e659f078a469be7284e403c1e89cdf0cd2e4580df4246a7472a9bb82a8b45bbdde0356441314e8cbb422d0e7e5c5881c4cb47e5b5e0b1c566bf9f4379868b50e5472d8c4693e68c1aa98bdaab3e74542f92c63cc22a2f7797a589a2a731df31850cc58cfe8194df0702bb4daf9fccae0652b10b9d75c687e7479ba560930b2efc5e9b169b1afacc19c4ee225b3248b154da9155dd01638917a2d1edcb9c85ef812df4b05f8ed54ecf2413b75138f80d00f0e5e170ed5f3a2f9f6aabfb681f56811596c71bc386b29f923dd5a28fff95b05da91be6c7b4fe1cb1a23866edc3603e24ea96ac67732ec6e8960279d89fe6ae5b0fe948f6c9af6897de41e6957abe3f8eb382eaf387d9b39461e17403cc073e64f44f893e23db5cff3d578ffec192aae690eb6fc93ae71f62dce01dd4deb062dd9b42d43f90ca45f8986a5722853cc07667f57177b618eb1ae475d1fb7ee8bdd7590a48c1ce30421518d446ea67d6b0febd4fca1bfcfc730bdaaf98c1017b243918f12c296f902aaf44d17d73dc0f1f82e4a1017f034c40c2505131a3fd94064af96b36f2ccba8220de82264441dcbaf210d73595f0297d2ea6ceb85eaafb0c77b24d9a5c78f132c85ae448f8eb48299e0a3e56a5a439b84da6a3b5d977863220e71d62b7e1f6c10b81b46bc8c42897bf5c678ab44b4e43c4f2f6b1f15a7f1140622b0c9a63b2eab2144e10be071cae39abbfd792ccd5279aabd76fdb3a80db2ccb260a08dde251434cb96e15cf703c60c411a09895daa19baa0e49c6e43dbd809cdc53a885bcf0038facaa0ee2fed672c0d8f6cc0d583beb180805af6e5d6229751b8b41ca13fc43952f5575302fa4df51b48d85cd6b31f4d1b7643a6da36214b2436a2889a298146ffd63e15b8f9ed995970c4d4c3ec6b1411bd730683b8244ad3db8c5d646a10f5c737450f5a24305ae85781537d367743f593179434478646f3403b4e2ada442e62c9b287ca8ef53dc217d6fbc74fde46252b88c927b3c93efb0d15561f1ce62ea605ab4b83736ec79b39dba8a6475227d4b6c225264479f7e866a02208d42066b54c8d9a5f88601f99d97e956ace2e3b7a120f285f4d695b5e5ac7ad84ac63534833633f735b1030b98ba6b7683fa968f05cc23f85460ab5a771fc9b5ce17d3fc9b957d38140aa9463a3986f28df2e9fa5d8b4cbdd9f80a415f5df2b2174c18314177c61eb45164d4d63a1340046bab912c414ad8589a8c5ac99c5daeb5a1d564f5eae2e9a34108bbb860098b50a1b2abba4940cf97a6b5e7b94596d3d6eb134f244bf7beae8228a61478ab33004b0502b153d6d2d9c73a5dbb83212ce0bf1857248a29003176b8e4c47b207ca0311a39d011806ae8bbc46e74c0608035abe4ff39d6f62581777ec9c8fe3a06f6977ba9f5287c2446783fb41f498eeef48016005a0a954a5dbb6bf28c3c8e97fc675498794d27ba8836e9bd69edd2ea281a166a7a1bfbe5c4f3fb9f3e47dee3c6a1a9db89286b19fea90e7a685dea856cea352b831bc7aff97d2626081fe753a2fddd4e10753745f79a9d061c2e91439c4b7c21a4ccbba70a", "510053", 0, 855084578, "e35730804f4d3614758e94560ec80cd34a364fb21a84320edff33c85f967b2c5"], - ["78f65f4704aeee4765f4a24d4474499b803f6cf88d8038ef009f127aa9737bcf5d8ca0bfa501000000002a757306e6dedb7bd2ef96e48a26462aedcf17a9f6d91f3b51b6f93ad7e4221bebbe4955030000000400ac536affffffffc40f441e918540e4f085d0ed637e4f1ec8dd3c5a864b2796982f5db094047663000000000153ffffffff33e2e78ebffe3596da0cdd6ff8ec20e81938ee9f84ac8a89bb23211bcea5e2bb030000000251009786f1c4044c9579000000000006006551ac5100bf43f7040000000006006a655163008ff05e040000000002ac5379170c02000000000551ac636365e956081800", "6a51ac6553", 3, -1393017821, "78fa195821c8ac6c44c02ebfe64c323a0090f6d749227f21ebf2315343f7db57"], - ["030000807082c40304aa8ebeb6090a9d2fd9acd9f1f15218fa113bba18a7df8dfd4d3734e91537c4e20100000001632b7b2f1cd4048641adac141f46644c8cced747b312985d4e9b948ca37b26ac3162e780c70000000003515100f6c03d8b205596d8f292ee0e3ec24b057045c248edbc944df4c7b8a67043dd872f2c198c020000000900525100655300526514bbc68814490ab4690a7ccd528ca757354f6aa4916a1776c376ed86f076089a4768a7990300000001acb5bdaf7901330d0e02000000000763510063635153eaae961abaf580bd0100000000000000005871300000000000635073fcf508af34b728707465d6680ac58845acb2d161d25df091e8ec4f0b529f0de3744ada0c63a64613cfd3dc661cbb57ff6c26d947a737894415c3d1b36fa0146536be75320212dd1ca429774a54c717bc98bccae83eed0b4d915ad13ed2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008de1a66aec493410de89491b2747d942fb2c73f421f3c7ed6e82e5cf3c99401b11712c4927d19bbb9122a07dc787825a8841d6f7fd58a1dcf39daa9b26c084df68e177b104a7921e1f2d2a27739fc43fe29c477ad59c8a2c39e44033a760a0a5f746f0f036573367a97d64232dc814a4b1600cc2183aa54408de6683d48e027f030b3df523feee3ec263ea71a1083b1fd7ff0667a912cf357c85df10187b512e05020e4cbf19befed0e1332c8fea97d5056c144aeb17d382ee0c3c4aae42d76b51500b04725cc685db08e675c39a0b2bd47e27f262bde226d1b9abb23d46a0e222f9ea5545cf15ae70b0280e525d1765ae06a05e0578253a3824f8af324119227e8ac00222fd12d02938d5ddc22bbf6b5d5c605e369eff0938a2df1d29298f8c834a586402036c9ca4ee2594b2eebf0172a3f3035401e5acdf7978e2e60528b2131e1e988f020e4f7c08c25eea4f63a8f8bee1d5344b271ea41daab1b114c6662195793f7c3a030b9fe856debbf564abd29f038a8c2fa4eee676d08288af0cd06293d0ca7a7592020274f6a3499ec757bbb95324fb8418f507230c5cbd9032f51ac0fb3d956f7f65472e257c7b485d5c6fcab4dca62c04f2dc08d880c01df9fa97c49c728ac4d0eb3202f51247d66a83f181b266733ea1eae05059d5f607e2cedb7e3671a1a80da9542d07f28137a9600b5b8fa998c9204004aba588adedcd9fd1a913e253fe921972ec3e4ef16b948569624a842677893e5c49618dedee3434476c318ae41394af95c6114759067dcc12b3211a64b828a6aa41580e82d9cf6f49d13fb9b2aaff6f519263c6bf49c415e64225c95bbc77578a4b8a17123e558b04287e9bb7ffa2db80f53ee4bfe73f76a9809343c65529612fd2e7a3aed01a5bf42a05a1a14c19f1208671dbc226efd112374c2237e47d247fd874afc6d80e3aa22e753217677be3a34e372cde0d13b9b3ebd9a08250ed456b212b6951626092d1903230e1fdb403071cc0985baa8b143444e3dd39fcb633cb01d5984665c28ab33745ab700a151b9379cc94a920817f1e3a41450b84d4943e8dcfb8ade845c88021ca4dcc4fea025b58f9581f2ad4b90f96ea1f89e7b15d0afe55452e908e5e491efbf1ec696761f146bf872aaaf5c5041b1d9ae57af67dacf5d539739ee1f5b31f59c250d65badc7f105fb8402c2940b523e997832290113b664c71e126a8489915d98dc2ec03d85d65aaa3b31ad9f30c607c3a98782ef7d3867cccaa147b06642544b39838901858cea83ed6685abd4f83400b64631f66aedfea9d4e1ce9b57ceef051385e4215e55e236133e2f05ad359d019ad6247f91f8f90f29c02cca804ecbb4d0d0d103923cd6cd692801a538ef70384ff72798bb3751bed286a067f49c3467c878d2fbf4e63072fcb5bea3a6daebc3fda87ff6dafb1d40216faf2f580a90bfed2bb6062419ca3d1a03b9f6281e033c06aeebc576e5d27e92eb5ff8381966456b566e03f30e85274c40873386b4b9d90e3cf3b691ddfa227edacbd8d53124e500502f181f98efbfc46518dfbb4dec10326fa2cc98622f5aa22e420000f2c677ac8d8e052f6748b7a9adb3377ae0a4d993462252913605bfef0aa5574bd28a7526ee504d73a326aa3eaba4f5b9c323036b260b81a7fa36ff29406777fe96029d9ea0d7b01171f9527ccf1814b398c26a59d6bb051a42555fdc1289895def9ba456f2da87c2cb92f7f2d95679b880c81d6c9d06ae944d810d6a2e4d2011ba4cefc038ad6ff96590540066dfcd04e46c313951180e1fcf3862ce279feaa83a5f0363a1c5b71ffa72a6338d5cf09ad99688164f4436a61865969a7715d7eb956d93648221b136a76ebd6d1f50379ee779ec5125e9d3972f110714c2b394bc1613f3004b1477eabd4f3488ebdcc26d7fed04dc34315ba59ac182a00d5624938361e35248103d6a2fde1d846efb389c0a451fd0445f558a7d4ad50a6331fb3ec4c8274db725167ea2c18cd7ff807871e3e01e22d5fa5cb0c8e18cec65af051c642a4b9a15518d1af1fbaab44d8b659f157d116b89b65f6486d0495b3c131d39496f01ff54bbbaee5b34e8dd5f0d0c30cc53f5966c9161116cf0c86b5377352c33076a9fb7aa22c34078072931ba1ef96443ae3767949005b2ef75bdd3b24c950f6a4d9ac7ec4500191b9e4692999dd8ec66c16c45d9454783709097b33785dc308a0c6f2f070cf06341058939b1f5010218ffa7e856c9891b78a6a6a0f70338b5958b9ef2ce8f9a28d6544c23663129d682320fb98d0044ca3497cf5e9dd5d83afbc183da34c912b53c1f5e5a019bc31b1925fc49d730f7be0c48158cfd59b3f9851ddc36064b3c36acb429dfc1bafdc27e9b4f50d9f2da14f625a1fa93cc73560a61470e6562a9d94ea55852d2dd9c30d8ae5895995f0005", "00635200636500", 2, -1128554963, "384ad32ad6f2019437690a0297d78f0948e542e42898a9a69271d357b53312aa"], - ["030000807082c403045b0453278dd7bf0d26f850c794bbdbc59828a97ab47502e231a98c2316ad68b50100000008536a516352526300ffffffff6a4039115531339fa826ca3d28b2d3f0b8bbb306cdc6556f23f1b1c042af351202000000076563515100ac51fffffffff46c231810cb32147b58a71f8a73142f3a4c49b50f8882f9105d6aafc916258e030000000852636a5365005163f4b049ad3630160f8c4f2f3121cc801e09d7ee90692a7848894bcc20b8e479f9e3be448402000000056500006a00d2e69f7c045289a902000000000353630023b0f502000000000663655253ac63f93ac703000000000800ac006563525253c687db02000000000965006551006a510063000000000000000002000000000000000039f09b00000000005fa3d36777bc739f7c42b244700a15bce6af14fee8cc99ba293944ff199d5ab445112feca1931b2fa89b385db6b52a92ed30b4ea0fc605dea43ae5e0edbe8005a0545f1ccfe7b321e39018f9faa797420629b71f4407f87ccc202e1ec407b8cb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bbae880a53931cb15c89a47776174cb6349421b3e5e906dad4ecb8ea0a2b4dde1fb22b6cc5cd257f9989cdcc44d747cfce62ed40ee53da7c08465f21b1cedc6ad15e681d65330555e6766f7379fda6fd4b13e316a88303e4011e0f07f36382c920e9277ff22ccc5a1d16550e9b2445d564d3612aa0580ed55484557aa2be162d0203725ebd59cf1d9b62d5b4f1486fc61c3e82d87e3e7f618dbce2fd0a1323c8d7020ef46cd2e445b8a78693fa36dff30d192f404909988a94b516bdbf9ec7c796a40a000723f98fe452f2ce67375e25bda2b1081a85df11dc80ed42b963638ede5f025e2ec75f4108fd4d2dae443a7a8ab372c50c3c12f3c354f8f1cffd3222bf64eb031aeeeeb9bd3cfe742706faa60a4470360daeb8f5ff27dd2f79fb5b5e1eb36262020632d36d3c3afd12bbe8eb548fc75486c38fb084a3aec3f14a3f6bc2a7b73aa4022bcf26ca87edf7868e4db8d02055e005504f5d04e469bcfea7ee79b120f6ae900202e3ae1797e6d774c50c3a3fae35547f20eaae770c5e0a5ef4ac49406144db2e0223655a01b6f41eb109e8b5368fab082c29b8531dedc5ebbbb2c247dfc62567d437bc13f5f57972889af35e164a8e09cf9e9ea2725f285a95be650098425a891169820e5d1eda560a70b2c998df646135f7667578bd43e49b8dfc367c570abcfa8cbcf3b654c2dee5644ac1e24d2f9fd00f986c51a4f3afc4a6a4c0c605fe0cfc414a7bce07b394c069fc8e617b87c602ca7774a6d2fd071423d10c98a4f640895647e967483ef2e5152c3a191bc67261c4a69ba0a6e3102597aae8be078c03ba6e22462948342740d9ade2bc4ec7be1a347737ed432ab1edc08426718ac3438772751fad5b3093d44ce3aa92b3c6c867f8c4fee53b09bd78ca75c17e58ca9d297be411b6275eeaec33d432e5a8d9bfb57ca4d87aed7da119fec1b7b7a7e81242c51c031c24b0076c864a4157ad26b52ef7019ed5fc2a0eded8284434a81655b7f37bc24cd6025e58944b5fbd4261a8322b1a33da163de1c7458b7a57b889651dd084ce6ee5eaf21e42fca94ef4f99aa24637ed93819ac6976b6adb442ad84ea91702d977096bb33fad2e9b0ddd8d718f57858e1bf4c41a6fdc4364efd030262bed414d0cea85f3a9b00bd88483f0c58840d3051448cc1aab34c8a7ff5860c71432db6f7d64267f6849e87cb4c0732a35ef190676d5591f789d9f03b395f8e8ba3c61d65f010f95c8c1f9e0ba51dc2497add3d3cb469e0944b59cfd3f17b2748f395f76e7246b88765d2ffde3c99f3a0b3b0b719377894dcc4f43b6cb0dd9170e2afc6c2bc69fd3edba18a08ffb2a4f924405cbbe3e5ce83100a5a333ecee092702eb8af044a926e6cd4bbaa9942b7c5b17633571c92dc2f72a5a831b4a09570b93ba6c0d9aaa6b9c8b30db3ac1c5004612e2774786f2f0e71d9f5bfc6a785d25da46e289488a551d6dbaa4a009dbaad58109cfdd1b7f9a571eefdcec6756374514f14650820b5b56f26196d8fc071889b0d974ede8606b64cc02e691e81799adc3f11fe4422f1a8c187fd536863ef260ad7fb5fd59e4ee9d5c23b27bbbe12355eef2cff02bb7be38ac6fc293f546c07f681eb410ce13fd997818033b2a5ecf2217df2562a2c67bc533f43245465c8c2f5059bfa0ac4b028e12441ee91a416eb37db920fe3b9f0164d9570ad9c7f7b05eb3ccbb5d6e8d34feb341704977ac3791d6604d4b37d3851a0a206de1a018327e05f490a8e172027f16d96b5d19e40d05ef6992c3c3ae720fe3d95a381eeada86afea78bc6fca8b5cecf3014abcd366db8a3b8421ec45fdb8df00042c845148166d5adff07d9ce18d57184ee9c34e5b4f9481c121418bd674ee70675fef7f15b3e4de7a45ff66d3943f1bed9754b0cdd4d45515e17b9b30d1662bea4185929b71a961904de382f981b936ed1c5f050e543758d2162fea48c8465d16aa45e3e71c98924d60f0ffa6258289ac400b7250fc2a77cf2de2aaec9dd35c48c32f61d16555fab04108902ae183acb570cea7a87bd12cff424a1e8d000584a383d08f6fd3fcfd13f209f45b88e4dd623a462a1afb93f2e8d98031b0838920c7f61a3d981650347537b46c38aa817608c99e86e15c3d65b50c06b9d364258f8935b9254067733123bc5da7c9c7bf87801272fe15a5b4bc5bf2be98fa6bbaeb4295cc406925481660692526b8c6ffc3af3dff09c10679ce7844ba5b1d23a3b1cad2e27ab5996fd318ae3404294ab40fa0583429eaa2ceb8e55b85528c47f63046413da54bd94fe10000000000000000c7cd330500000000a186936f7fa3870e3993aabeabb99a49f38ab38e58f0db0e8c3f311440c7e627d1d2f1bef9001d492de28694aea51e10e40eda873230d9bc2ba9a2e1ac37068dcc4ce77c55d90b98873b36de70f4238d51ec16a89d58a5e1718fa9bf132f9cba00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000edb4b5c8a65646dcbbbc655630f7caf22eb2fe283ea7074394b6d6b9c0ff69b27f2df69d92e02db92be740552808a467994517fccf3e5fa1cc276cfc71b708d5937aaa721957db999ada548244d7b6b415af247a91a90207764d5b0ae5a48e3deeae8f0d1ca3771489b58acaba5f471a8ada2aa3f867497e141ab54a1c4d9859020c2f811c8efea4b5edabb0d076fc2d1852966b428550e4bedb5eeca5ab20753f020b50bfe2014033afb1cb071ec91eed6cfd8ac043469eb722fde5b66a96c4dfb00b08499beb61512919b3d4fc157ef6c4ad50c6aab6a1602aeedcb8f873e01aeff4cc9150db280d1e209fbc389ca6bace723e485beeaeb426dd22b6ef23051aa5100304aa5a882a88b75718f1775e486cbe19467f07146339a8b45f27ad2b7b3cb63c03303c1c7760cf574e1d259ef05d82b7ac05676ede7547a0b0ef025636854cc0d003295cc4a78d30fc2ed46d5f1f3c21c711aa4b87eadfffb3a662f8a97ffe99fbe202040006c7bd67a13d7926487a104ce89a2d8d5c0ebbf8f15937b42e73e3f42339032fb173d9c32435d2514d16ff33d914719c4dbf2e2e5724361864018e7fccd929f0e70d1c0fa1a5151149de69c21d7e1c6219b1a1b5ea977c034be09a2d93923583e04ae4679ed66152ae4e66bd323b400ba0d0ebca9129d591ada86c7a34da8029d105da3fb0fb386d228e3ff579e3211f207c914f9c1540d991397ba6f0c4a2abcafca7a04c6a445e1a7701f3e7e334209a054ca1564526eb65350cd68fecc6cd271571acd750acadbb94d0a1fcb68d77968eb44bea116efab1b2ced5824f1c492e2e906507ffc612aa78556e29f67254ec58b401a435152de3943aba6fe4d134fe146f5d0c2bf27f4ce49b518b7c35ccc9973f5fb72be1a2347cf6ba892d4e7c9f483c03cac4a7fa3569b3fc85082fbcfa392a90d07fdafe0bde9f3ac898974168a876e90ac72a03c19a0ee56eb522f204ebdba7289d78f69c5b0f244cc1fb938bd14594d03f517456afcf2e6a8acdb585295157f7497d83dc3421750af67546714b7a11c25bb857b778ce69c567ecfe1c6fab287d35d1010152d86119057e8b3351ca3eb0f9e50567c93614c80da7f58e313487010be379b1f88d4ae09e0f9e75a47b45a21bb28495c0391715f0ad7c7983af3d7cabb109e3bcfa3207f61466f765ad88daea502028ad8a105783ae37d92408c5e638ed10984f8642982aa0a6b8a742f57b725cdeb3e0051c71eac648a9bfae0260e6928619d7cb468ed2e8ff6eb6fae6d60527e8be7c1c2e3d46d03c2f0072822012a65277223c0647bad202c17af20164778b29e022083fd5507b5052d38e913a88baeabc740efe4fab4a2619d1260c254c105fa8d020cc5e7a7274729f494176f9ad08807591299436f2a4e77c126946544e3e4c5dcff10d47e5b709e0ca2453c36c7010072241b94d329a989965286b583d169286d2440d07959c5e455b8ee3ec6d885ff68da863dbd44060cdc87ab707e9f73772d51470040638607e54da049e8f272f70b5533205bf5dd9669ef84c42a3ce00db58b834633c785a3dff5d27491fadf4c326318c215392ebc02a9ffea821f203a9a99ae59951e0f7bf3486e6c41d5ba476366107de7cc40f904125bc9dfd90f1209f6948f2b2d441697a1d9b37c1ec6247ccf97892a9a61b087a666d681e335ada99d6f49622b27192a34fb7b0d912208e09b67e4d2decf341accd054287995b02443345a3935e72ab1a110fa903907cf795089fe6c565e520c2ca2647c5a236284c4e201aad820ce0eeca76ab55a184aed2fe26e7e707da301888f6733dd3233f11c1b24c8c49bfcaf99b1d148322fdd63c36700ce40bb5ccf88ca893579b83328dd437270d3f9e43dbfb672ce2249709bd8bee2209ef6290c1e85f853bc5c21d32fcad47fcdb68523e53826ec94d5f4a2002149dfbcfedb3cf9e1ad6e130f1176cafbb28bef0a423ac058e1509056c232df5b7fa3af46651f06f9b45c6f23300d7c5b86e63a2ef5e15af76a4762916ccaf52a8646b510c9c0c761995e1451965e83cfa505c52714f5d4b96f35724025e3e8b3bf4040c01088e91fd35701b49bd3d40d9b860b93f0e61bbd4211b7c01157153d86e32fcdf8894edbc74636d382e566b4b739758857d76c3780e96ad3a4e7d53ced84109e0cb91108019b4d98be647b5867e23a887223a541e4bf62009c4cf6c2e05bbcadac89752de87495f72e22eb9f60a896e08288b6f1a30bdf2a9113df12d64b3cc59effeec3bfc8f9755a8adbf95d8383ed75f9b07519f798da8d7d41578f5ccd99a9c4e34030864d210412e06dd6a00f5adeb7373ac14b8441d405ef3e7b6873c96d9f9984efc3d75cc97c12b261bce9ff2d8dcf514b6d5059404c0b0d961bf1c69dcb6e217314bec8ec7c869d8a2eee005", "63ac636a65ac", 0, -1282330610, "1fdc3da92b3acddf9f1c068be4ff0450d9dc362fcf6f22b703f215c32c1a548e"], - ["030000807082c403043fffde9d8c3d6b9a92de74d54754dd528a289aade2596c6572b6cf58b840283303000000026a53ffffffff83aa6f92600af8245ae76b2f2b6d507f7093558ba1c12abfe4539c8efa82a6ef00000000036a5163e6bccdaf4704680b9e4b34deffc53b2294fab6ed0e8a7fb64bf2f3527392e06ec948e4d0000000000751520053536aacffffffff8241376c02bc43bd3139aec26ca296afbf9a1d2d2635f67cab26c028073d9b0002000000008c071e06025d49d10400000000036353acf791e1030000000009535300526565630052642e5a26506d6e84029dc1c8010000000000000000000000004c9173a6cb06e38b3915ad4aa31e68c9f93724e763886cce3c71272d85b2d6b2ebf6729332d1256db5bdc901a35a6123f5f9c07906bb670993584d1b9538e344b87e1a499685bc202220732e02f8ca8161743e2a596f08cf2d9bcdb1308867d300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000834326443ce756844fbee973212dd6386e8fe2971420ba8377dafa518f57f8d57b2ceedf74644d00b33f9503fb1a9f98e1b4b4f022fbc98ff0ea55ee06700dc66688fd5ddc479b28b3a2000238ec43c6e4b48de720de171730d1204a827f28c5fd75609b7c8b45f8c2564e31605e09b302a53e918df72edf0f6accda42f0a346021b7ea3d8549a2e906b4543f26e008e0a4e7444df6c8b5d77537a3b4e894447d8020a4c1cf2a5fe58d85341758c60abf08eee55392f9016a69a43fd92e6af2cd6bc0a015d3651194075a642ec17ea9f519f33bc0509d1a7f684ae2ad4af081b7c388f826776f5b15dd8203373ffc3eb9dcd54b85cbde6d65522cf42ff120f9009e360021423b68de1abe5c17a69dd15dcece555c6aabbd40a1a923d024322c5aac1ba1f021300da3b346c53ba02efa3d47ba866d65c0a82571f602926660e845e38d99f0f022f2fe357e52bf30b4bb0f1a84b5fa41afcef531bef843aacd799ef3893aff2840211beecb55011ec907783ac3c4ac91f3de0e218567717dd08ce00f46565169b840306ad831ab1a8af299afd1f8606530d1e18ad1aacd9edf12f3c18d92ea429ef1908e2660405a739f10623b0f15440a8ede521dbcff288adcaeb8344e679eff40692dceb67768001a28e0222544de18f90c439845e33248918b1d0ce0475b3d4b81271e7321d351aa2dabf316696d5f6d01d893cd4cc59042e6067a4b7b42fef9cb42e9818ffdc49257fe61412c94a1bcc9dc8889b07eb434514228d0ddd72a508e69dc65fb744868d27771b49d8ce4da78d45083a0a7a742658ae8e59c5592581976fabea9406cda557f79bd392d59ef69578d23f6ce3668b484125938fd6b109033676f7099fc1d80be38231cc2a83cc56ae016a4cf9f2682a6181e3456bca1dc0985f1548286871b55a1c571f9417fbcfb7398789d33665a7c5dae3f6155e6da83cefa4c0f881fa88c79220d3a0c5364f9cfad5bda9f98513a7153fd715852003dbe9694a3f9ecbcfbf30737ed37cdb508253c63fdb8e21e4a9079e7fc351850328a9764ba48e8a26239a2c8313c918de3e7f202c22285e444bb10d879dfd9c9e9d7df5d998e58e973580f7d3c84942cb3cc6000bb6f4821ac8a12eaf5f0a434f9614e8dad72f984efbf55766f9cfeb630536874b9d91d78aea20ac329138761290494282a173ccd59a96e7040e77ba308d9767e145319feb9db3c56e181f978c10706ca147c44e126340f3376a51dd78e73e42b429bb59c6c42739c59eaff8169264aef8b99985b2b5d0374bee4ea41e9094d1ff2c514597b6123a5bee891421014704efe6cf89ccf4d39b34a3e92a2d131363b5897c2bcada6eeb4a5c703045e012c38b8f7b73a7a2a6d8b73f1c4727a7688a5fdb96d56ad59c5f8a56e9e292d986e4ccbc36e39c562b07aa0478f65f66e45665f95d0742685935527129c111a36956ff187aec1e563e4f470a833e214f9315f714eb77c6b9fd4484c9f66503a0d9c85c3e7745b4d72778e7e3b068d6a3081e2d5f14a7015bdd8a7b23d8480cc5a72e01102236c2632214067b48ac18ba592cbf097ad2872463a16cd8066703dc1b546ec8d1d4a8756a570c0da3a0efc4ccd9bef1ae39e227961098a20d69d5f3085378f7bde93497c2c62cbf55f99686292bdfccf676f16b9ae221a87367a8c41e5ec2c659503c74694b10493cc2afd9d6354c16414f8068f162e906dcc054fd73863713e2bbc45d2b849adac1f8c152b9e3541ef5aeeb46be1254d961181c5606377e1d678673cb872ef0732955ddf221fc9df890cdf47c32ea53d511b105103045377e966231c4ba5bf06dc1d18c98a79fa097690f03bc0227b52a5d598d57ab221e2e97c22c55b9c535c95ade11dbc83a03ff866e057bf8016866997b495e0c44d64f578e0238604454ae802fea9ceb46911b6aa7598fc2552c512aacc7b7ffec50c4c7ccfe640ab5ce358f900d06f1f979c095446ef53c52977171af6f068c6bf788a3969afac9a2639b83c16faca7d17587939bc433bc31f57e1cb044b7e217779e18e386e196c843554117abc863dba9ecaa8d9243262b4fed002446c68c37c189308d34f56751a7f72db610dcc181213eada7957bce5e65b837f0b308ea4ebc49e7094a3297da9ca4fd7a7bb4bfc6fd5ec8141dee7b7aca9dc5eee4ae0fb5ccef595733f50bb6584e953bccdb2e43078aab966ace10195974aba63ffb92477090e033d87fe160a0fcb8e7f1953496adc4324aa2e2c64364ff9afbaf9fa6a627de7c8cae16989c861554c852b90000000000000000b44ba40000000000bc9513ace821460747bada6cb91481482133760d6de7872f4c64a29acbb79cbf0941231f101cd76907bd04a0347738542778bdec1ed85cffd9e1ae48417309392442fcabd98b71e59d060413b2d531fcbfbbc3c53b23a49eaf402c47d576dd7300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a69310366929d31d22ad985379ffb9ce59e811b511cd811a25f735e481a89861126a2767a94452af05720f9f7f01f2108961677f53782e668a91b7a6f8e83c29d37a268a8370d8ac8310c88a283d9181c811b9ea4c60ff7d2800aae1e4c26f52c4cdad23e485973151d76c54eefab0e4b8002265ef35e631b0a7f83068ffdaae020d83fdc5cd050f5737443a2792565c02e0f5859854728ade70bd9a32fe19cba4031956968c655b709dcdf406bc5df50d5e518ba60c604df1022f966e7e45b460240a04c64215ae3499d401d7095a867a8490a53c8f3b53938d517abbb50cc254a80176673bdfbf13218c27da81831ca314ccbefec9239178c44c3cfdb3a42d205acf0223a1f2b27d6b81b97f057b3c81ac8bd2914c99204684427267ff80e8a499495b0304dde9354080a47ad8342dd4e3683d5125391293231b15ccc54015c952ee38850201d9566301b45f48dc51a3752860091f08933a37b003156cafd0b6003767e45c030ec15f04bbcb7ba2cb1361ff7ade1dcef491e39c77c4d292d523a14adb4f2419032b9e952f8f4bace53125fddbfce0d801f57f26585f70d0ebd160165759b88e99362ab0d282ceb382c2542e1028cdd477f166b15c0893b2786dbb1341dc79ae7beb44e5c7e045f55586401a7d2ef3a3682e3d28992ab930c069a20a13cbbd98c80aae8872b7622777734c3b716aa428db56bb62a82ce6a9b014a8b3f7e3fafdd7abf7de84f860c2ec1db4f5514f8e27bda8476eff2b6ff9b7f8607569c1656ed33f9683ec661be1a965b51d9a4f3452457059b8f726598a7ee7730b74fba3a5f03448a6a026264d0c086fe3df38c7faaf76193794c34dca91c90fb1f0d242ce3613112b24263f8860616a0ef732ec11339b30afb73633c6c07636a830cd91515db55d686201b14c827c55f0709ac2db8d854493a4a3af3cc9c3beef468691f69d04ca411f6b455055026c7181d1dec238eca3991eb7fee0f13bd1ccab3684fad1972f4ec6911740554a81c92dd99ea626b0a24350a5ae74c9ecc9480cc30bf158aa3abfd3acde1286d7880df2bee81436fd3835c38fe1619a4b28ffd887b539e51a654ec7cf1fcd2fd4eb18ea885c68a104d8fa1ef82a68899440551d08492d9e0df787131be02298e0862a0b7e1170cd8710367f52f4eb65c820d495412733024b943eab19216899d9dd547ff271103aa82e49bd5e01ddb435c028a76961f6025ac3e3f65123c607c539dfd6f0a0d271e8c1e98939181f4fed2873339a50fce2da1308c7da063c87953a9658a4ec296f0c3fdfe479852641640a525842c5f1def14d2d56d61110f2a34965457294781ec6997be316048d80d1189cf5eb3fb4deea6acaf46d4eed80c6bbf930ddf29a6f658c011adcd554d83223ef52b4e46f225d751ef06d1071b0d03b4ed9df7a98962629933a8ea5c72a15db522541816048d4acfa17d2ca6d21fea69149ced03d682e1cde03e3d8b072d5ab5650d9200645d1e63d9ce0c8b75f78624a03778e0f91922df95de077e9e04c00166bfa645f351e9cfc009d52d288cd17436f6f97e8575d942e34b1438fcf8cb99683f6a5190bd42222bd1580d1fd31b8f2a4cee9fa5120b0f2adaf13e40a3d3840addbe00188f680052b7ac4bd8fc30e231787290c18e1850a56b5382adacbe07b76ed0934fdf43f86d581b2f8dcd013069f2dd032313966073c1e77abf1626c87ed2f6eceafc753aee75c20266b25faa40d7577cf9abefc90b8da57fb2067203ec9f73b6004c0d7a1bfe2b7475d4627d6e5fcafa6a9f323313728ab96d237880bd3179a54e3fc625f37ed05889f6fc7336949b09f5198eaf256c58b220f4f40d48ab43cee438855f6a5c57d11a4b6fb65a6ac46af5ac4109288acb12d65d393f925f9258df0168cc0fbfde9da2939abc8e1afbac7d023ece0f31a364a245c000a6079490ce1bee047312bfedeb1e6c71982117d4a14c228af8310cb9c73f827b7307f09ccabc997fa2d707ffcff7ff691d965d2e0bfd66af070d56065c88d96e85df573c1d5e6e6c84eaa841ca2265cfa8016c94b13abfaac20f27eeffc274a87f4baeecdd1674a97385819c7d4121fc4c0db1f1dd65288d877de162964875ca593c6dc0efdfd49610cec273faf60ae366d8d1d06cd4127193eef7a86b385b05031a86e20b12f012283af3f4da2e40915a46c45e425d228d28ccffbedb14369986b86a55cd5255ca629d69f33968ed54bec49658c9b4896b5cdc0a0e0bb498143633e7025f87a4dddff835d16fda75335573a1ff6046a6491de1ed2843711a5c77de5387900739e656c21a3b14dddadac8a033927e19932d60edf00ecafcf0824c15e1cf7530eb18c8c05205154b34c52c56e2915066523c0bf90ac0ac52e4fb3488793939e72743113f37df872acae449243cbd7783d0a", "6300", 3, 1611897920, "3a1a5eeadcfe531bde2aa6f16623cda98d2e52b9cfefc06a95e625ffbda40d94"], - ["6c0fd52f02439aac102526fd4949a60f22e86323b902fd2cfdbf2a7601f0f9304fa2fa7aa702000000046a6a636a5c5485c0033d2127d1614f831a0fdd04e0e23413de8b3dd59fb87be45dcff6f8337cb4a001000000075151636a526a52ffffffff0325f5c900000000000400526a53de81d2000000000003ac526a906d3d0300000000055253536a53724d0ba700", "65ac656a006565ac63", 0, -1501232704, "0c9cff6586ad9e66407ae8349cd0c576eb900443cfa28917c26ce822122b277d"], - ["030000807082c4030159b32c60328b1613f7976933e0fdbce330b7c1f77ea54df907b3c232f9cccf920100000006635253ac0063ffffffff0465e6ce03000000000151b8153a010000000003ac6552e8e94405000000000452000000b69e600400000000086a52ac6300ac52520000000000000000010000000000000000e4723405000000004bb67790ef35f9fd2a93ab8f8e9e97d2fe98dfac69408860272132dbcff03dc7fcc290b506e4dc1d30731a1fa2aded78e72dfeb216d4df4dbd3d75bc4c8e21173bc1c899f0a55590b83fe9becd26dce13797caf8ec756eec21bebee44e7f2c66000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005386c495e64d4a23d069133c8f39e575398081a1c5f44b259db5315d4968152f486a9170e9d12703e39df40defcd9184dbb83ec02b39755dbad08cb533efb75baf311d08d2a8174036c82172983b8ac7be88c0a624afc24f10502ac63c74a6116a438b705253afd92a1d1737a690c8f0131b1710ad1883cdd84873d12c6cb2f6021d87502ef3ee9de37327abc62fab3cc6466689d1ab84848dce3fbba3ffb321a8032d5730ba1e0c6e2562dbacaa1a07cbbfcef2b22937b9b25fbbb7800494acf8d60b061577ba7cff9bd63ef6a539b67af1d3c5c6f5e91eb3c9c8749dae47884d4174f61e0d596792e70520ac54a50dee28acf5d9f5e0028a1b16b31240d4f05296b103304fa5ba87cc4a42bd50e1acd6ce383a10c0cf9f44b8dd6a4fae8900461517150324c1ce82822924d2843b0cd843ca38d436026fafb226dad6f204376118df692b022e27605a5a2b122122eee064987797f8e6c811b710de3f0155bf70cc2c3a2b07022dc6a42386f1d8cc2e5a1f60b1337e74996f8e1ad9d01e8402b6eaaed774b678032c6aaf7a335cc1de6f2becf80b91751fd6342434a43282f123923c10dc48f72778993289909d7326fc7015e3b017bbca874576e1079695484bb2fed4d2d19f508726065ae439ae89c92ed0b8f07048a145ce3d92f1d441a18fea16f8128d79de326fb21f98abb373e63f0adae4cdb960afeea3934744f521d9a4df6d7b5afdb55ad3232b457ecf6cb8178d075e3096990362aa465786fbf4fc8c843df9beb8d8e31366b6a08b3f1482dacd0e91483244789cbd65c6ba98ef2e7920a6f18f98ac9fee8dab1d777ee52a7e0355254bccf2996e89f1a4e782df7046b33992bb01371936b074674d4bc6119270c033b092ac85a4a9928f8216a5f20435599940337dd5e986a9135cdd1beeb45898afe9c850ca5f5b144fb090bc3dde92c9c383e0f5dd6947bc682056a01abf975e6f3e10fbf6c79bb83c07c5ff4819fe4fdcd8873273ec65c25f3c2122152ca31049c0ead05a8d20837089e28bf7828e143a2e33f245286bc3faf65838599af7cd7c3c894ba066681a6430e86c23002382aa50c302cdf01531595b975ba51eda67c23dc36e18d696635de2ac31144164517579d0028e1bdaa2aab494c97a67f4a52f5a4de36a2e6943ce8c45fe8d8a908a4a6227d56c9f88e40ceef83e09ab016b28e8b3975bb1098ce2fc69d409bea8c0e3f9a2ce237925eebe6d7f53007af4a672ca4d5e7e825cf7183e4bcc1e42f357539d9798a56eff5fa11809b08d51212398f17db09f26c0e2fe72178e3e93923cbd2d8f400d49046b0208db66a93de8d665bb28bc93fb0efdd84b2c8c9b2a953a477a1a679bff7e963eb3888175cc35489186656de4ce98ace903bb925b7108be039e277032b901ec8eee461238580017693cf9ea96006dfad23ee916c79b6a06c140db024ab0b7ab2d188c51500276c06f189a540de54b9662972cc1bcd99d1aa2ebf5fa9b8858ea12ea0a4cdbf0276def1607b466c5fbb35d24a36b56b47eba5a578b4bdb4a1cfb9f3acd9e7ad614b01404d7c3335432a7683a2d165d03b6defbd1785458195cae8ef083ca7f6e8937fd370f17883dd5249a0690290df4ccae2fdaad6f697c98e03d14fa29a8d1324c5412ad112bdba0bbd3d3f38547ade07f4caebfbe24118b64894e90329ee6a0e30e0aefdfd54d8dc57f14e3f977761110cfa2133970d50e202276307af8d9be2a1c14501e4581f987daac8d20f022b62bca5a455bfba305f91f2acc98cb7c9249a9c7f4a4c4751727f700460bd9939ba5f72e803b9eeebfbc31296517970e67354a8925bba70c61cda18f0dbefa8c0a07239c209ffa04308bc032491bab10a0f5a6c8f597dc19fdcd7337e25e70023cd95892e6a34edaa50c155d28ab87579108c1c77a69ed9ed978359f330a1621889781633bc740a2b4d111feefb658adee5fda57db9482e91df06058457bb8c1cd7e1e6d72eb8ceb8d8624f5d7b937e253a8adc3be2ba0b38ace1c193165b9e9b76b3e7e9cc7084f36530d1d105e9ba403e984b0f6c6ce4085a484235487024acf3980e969cb44bdab935924c7a6da54f9912cc593877c1a0589b8d80217b5822d131be1a80f2c589e4916b3f460efeab78ee7170c2a14c8f4866ae0e0dd3cb8999f1c897766c48bba417d57b78fe0d2d7e66e2e62b75c1f71248c716cd7eb1b961f0fb727d15caf6695c9c92024169ed1c8c4a902370cd7c2020025d64820090a9ee07707deda41c67146f2c017c3abbb6b63247f272134510b1dc77acbcb32a64f47b04923dd4d7ed558702d9619fb79490c57e49ad2d930d46d723cc781b4c4dc7a2f7c91ee0a092401011e38eeb72695fd3beda149ffec865c549d87e459b8a43afa3eedf87b4b44bcd72fb483df04f711e10230fb04", "00ac", 0, 549221536, "8570a09e35a88076aaca52440362cdf5dc615406a8d38340b15cc4e3defa42a9"], - ["2c10a47f018ae736552845982f084b821d54c772171cd2916b4af80188bb74d25ace6f9ad8000000000365526a7828ea1d043e80cf02000000000451ac6553001bce01000000000700656a51526a00aee55703000000000852655363635251654ae74f01000000000751006a53ac51513411bb0303000000000000000022e9fa03000000003bea9b2060ab077819083365b0b16e0487597c3e7fdb52b9bad6962ee25b95b62e2bca6d67fec12d94a70a398f139f66e2a17f30e362e56de06fe4d91d62817d6a3a08944fa594011006ce24c7cbc144a24b75f10994a03f37b17cdc203b65e100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aca2f95a463e8dc1f58636364cf909baec765ffdf4986fef5fef3c89cc5db9db9f7fae037ebf2ffa40da29843e2d99a914ac1d7dd625f66fbe8743298c7d80bc4721bc105d6f886bc3c19690944c2071015ea3faa5c77ba9a0822cfd4666e249caffd86756385177bc7a9953c7813e599c580abe5451ffd9e48419ceb2c4767b031ece8179c792b89370fc4a40d5b0735c8665d244cd0402249b02c5cecf2a0e66030d8878c32960496a2c59b2cba601548ab33baccf5d5907c0420712687d2dced20b02fd6ec2ef2f87514e1ae66d8569d81430fdef25e7c5901e5900488dce27b1770aa8c9077b4d5ad761f06aed23561a6c58e72250d28125a23ea6bd5992babf810204868477895bc6857c10bbd5f8585342d6a5c04459c2a7622166cc838ef4c232032e7b31253658c93904756a5eb766ca1e1cdb3c6a6fb499dbd8e917aea23bf540032cc7e78cab84830d78670056fdaed3c6b432ac924d21df8a45f6ed14ab68a5bf031a2b22ad67cf780be7945ff3f03a322ab6f7878a4cce9e6b7b665ad248d18ffb031bc2f0ac43a6f6b0d5646c48ce672509f23f29e528135d65c26aabd96644b1b6138fbfb027c4783bfdcdd17899adb3c0b978d758add39fc6a4609decd3548ee697c53017ef79c669c4bede8c827a9a34ea8c740aa4a2fbc98126d3363031590b25f2c92d45330ce1a875dbee1d92515480572b0ce979992b2e14949d1c9c12bbcd19b4ab57e68b7fbc5b8c53a8bc7221ebb842ee6c20be57568840904161d10ee880349d85a75b497bbdf97add7942e0788e9abe4bec95b7510df76e207f4447a39f78aa1ce2e9c719fafe1c3ac6cb8f553265d542f64126f3f76175b094a21ddc2bfa3e200d73ac5b00a57eae3e61f0703d38f2b01b593c6d89f8c5d3ee969e6deab7f7465ab98545da4c88b10cff30d2e8403650176751549065a1fffe713904482490b4dd9f851b427e9e32a2b436fc6b9ce5177b7158c170235e054de2b580b1ec8beee15a5ebf67d58bc3acfed099320823bf5b2e5f847e1f23aa2b38abbe74c67b007d3872fb430846682e2a4fb710b6382acadf751ab664f82e08dc1dfbd412de8e0953f495a8693447c4e89c3a70f4cce9309b402f5994fff5dee9bab9319ba464a130818246ce75c82fc50ebaec99574d9f344d53af6d650cd6de191af7f8d39a3a1e3e6537d55bcd00fc97a2ffe8d9b11e8a95862449cae32e33161ecb0479f1d4c4018df1b1ef73f230d12cdb33c8de7695f08ac22ce589b7849afd0a8991954fce510035224bd453474d62f9d9257e093adb190f60a495af00f9e7c107eedfc67b972b515d55a8f4f24b4249539a1fc3618d92f9b7d15cc3d4e1a57ae2146e3912a0d53383b6dfdbd36994007418125f0f296e0eaa113f71891064d11d946601f40c19008896eac83ce5cd630c908e8fe813e09951d1425c6f0721f560b08403ebbd9994ceb561029615017e656fcae7ebba3f35608ade6652a494700f0eccd868b2533bd9bfc106428584d4e8243d45852a3ec63d0cb1b5aeef78d9ce075f662e7debec31444544f5978ca6ed5f7ea2da90405c85cfa36bf4788273e1e79559838125af3febf62b71bce618f34a67848f3dbcc939029d0746cbd79c675b49060b49300371325b8b32f980865d48354e16b8a01928d4c23eb66d4b063ccc6fe773e40a34d2f140987f919ead929f52963f37d94a5aac740feaebf469b0b6131d8725f09336489dcc2c9d71681330427a2df7dfc4017f02347137b51808c3498b21a31438d6d015e3ce916996bfb02159a1648343b61fb93a2517ba07b7ec65ceede306b5809181d93ee96e17c69d415afc76e5e8c69ba442ecd2b16762a6db1304519d50801e6860ca052953af74234eddba71f0a44d078fb61095b1550dd4f8e6b7fbeb32498b44aa9feeedee25a304c2cb1aef0a67e52f8dac2b8c2e2967038c4f0fb1cc2913db916baa2028bfcd9d777b8272f6156b03bac9c196879927908881a9074f084e82ef894f5e8cf2f3651baad55b113490329b0d677b88f5d16ce27258ba97e21fd443cac229135d2c132f72511b7c04e43c85de02f450ed2c9eb2c3feae584654d6a73500a75d198f4dc50b8360e7ad703a3deef211e6ed2b8a6e5b54bad6e9e6b9c54476dcd167b12e02ff3fd3aab5d5de000b7b34871049dce6f1be4314ef3820ef96ac9371b1c83930cc720f4e08e06ba330fdfb13a56202a58991b5de3744494adec8c2644572c20db963fc79bf739b256bd27f98477067ccd98318da9cc3e028310ac00000000000000000e6751f020000000045a6d21df9143c0592020169bf149967336bfffd6a0881eb255c2aaa774d45b89d4cb570423cb8629720622502f699baa0f803e300559d796885fe3e0f8a1537339398a585be18ed135dc7175fe6784bd5aae1a2b94fb9eafce6031fef779aa8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002155f58054d975797aa3e6dac041581d41a829d18bcb65992b4dbf04fa1645933b72f7d78b397c18a972e4d1d033028914e353bbd4e19f7b205f48e120f2801d4652e952a4b9ba5095a38ef12458a1968061f81711cf153f6a3444f9819da2d13569269abd7babb514bdd25e59acc497c3bbb4cab504bb2c15b4eab197a0e70d0211c6fda247cd1786174ba8d22d3803951a73876a9919003404ae09b19b8913e8032c9c08925aa988e57bc6a7373771de3dd770e5c4c42fc1982e95ca1af9ec726c0b036dea353e382aaff8550e292ec6c9f3e8bfef92e2a6881569b001fb8918fcc94d1f40e4da8931770f179662d49d44268b89901fdd77be4f46fced2508b3f46a02069f52b5b5e8d766fdf35c9563bf581a969547342a963a40c213ae9d5715f2f2022b21ed06a084ff3cf23531a7e264b576a0fd448ddf0a1f14b6e5f8a1812a0e91020393ff16142b48436de4aaf52b71ccea7b6919d6fc97d87228a2788eec6d840e021334449c83e89a525108b6f44a19a05136ba748ffe8c86d655bf7e2e8243a59c032024453a645e801b6cec2f86e98df8cb958399c6048c1114c0da514bba073a6fdb1dd65b8b987a417db40fb3cfd14b6df6b832d9029eef555d720d94196b088c9b39b400a9b8382458142d5f6751229e200b46a7d900bc27838dc02bf6a8b0ac7bd95ebe7f7c5525f4c1a8624a1ab8f1fd030d682e4f73d6625356fccfd516a0cf9be5ef37f103ed9958c2c0cff06d15f3bd61cf80b9b7573bd94c4a678a1ddc0e96f2ca60e32ca47858bffe9f95fa742cecac6c557c9d1b6406302ab62b4ca7ea1aacdf4ab2f6708874fd9bd3635fa20d754743fe78cb6c4babd1a5b5bbad979bfae61e54eeab40db25b992dd6f663bb051a48aa374638dbde0c72cc8894a2d659ebdb0a5e661a3836979c10eaf08aa1e73ff9eabae71cfb3e1bc167ae50714b35a0721407f136f64a727fc1cd8a3ff8aec2e5fb8d33d11288caa1de9fa0accf4fb70ef4c42b849f9beb173616fda4812eba0bed11a9f91c680fc2d265053fe7b8161e2af8501ce3121022a9808d1b0c17d2e1bdd4a2ca16caa37e1b171884012b5dd553d6a826916e4590eddd3668fd952a25b4e38ea5c413c52f7f8e6f2039aeb1581171efa3eec50c1ae10e730771336c4d54932492f6e9d31ba58deaac215ad8b8448dfac3732cbbdcd318a186c14cc85fc91a30ce77498cc1f22418610b1d8f23ad8a6f9f289d4cb78ea4bbc9e279111e0fb583c6edb5932f2f999e5ecde7efacf133c17fed5e2f054fafbb4ecb5319f3455e8b91616dde0f753fc9cbf6e4861a00c0b4e01c573df026d8916c18976bb72549b922c6a789d535b6920048cdd38c5751b52572d2d282401e2f436b30cbca701832e9e7bcf8297dc88f52a81e1024111d66635698db78385dd3d39cb713ce1f5029dbffe2600d5a61f91469db6f25a4a17c2d3623191ae517d5312ddde7e51b58c3ea344f60f8716a04646f7c295875f85bb6edab12b55714f06cb2b11fb992ab69710a2895e9cde9523318359917855b329be6586568735a6ad751316a1d31a061c760b0e3b3d2a26adbb95c71df90214262c920e12969e0de85b5f99fd6280aa1467265fae4ba8aef5691a9df8ffbd05da92a1782da038847d746457fa263b6fd0ed958146e3d21fc6cb494b51e3119438e8e5a3df7943b72cac05685e8ae0fb2808d7c102ab20949e27f0f68e7c971993adf95d78ffb7a333d4aa6cfdecd1cf72627656d53d71d6582490dfb550c5f508c1a22ba8f524b6e7d481e06038c162861543905b89e68d523630f21f7476a35bac23e6357d086ae5bdfb5916ea4833662ed25d43051e3950fe43f1da84bb47f067d1170a0a856573b1f4802ed8417dc2b0f0a72c87f73c4e0fef91fb40bfaf210394e34cda1a13e883e542b24312538a7e925b94ebd4a8d3c92f9b02648b293336063bfcc0dbce85a4276b91d791f99aa17cda565e19c7284cc90c6fffc4f615a89ef6b2f343e651aed0a318c449baf6a4a11f5e2f8135e631b7c2b2fccc426820673e89c10dcd6771d61795efd1088cef6c9e755cda978ef58c2bef4914ff0ad9a2f0531d78d117ce738bc5f492e89656c22a74794adecac376fd6bc931067a5979415ded2b6d3ff62c93a86eca081f1f9b7ef3a92698f1536204b51dd7b779c650c4420c5501a53fb3907ef1c7c9f9c84e7814b8b40f22dcdbd420ca6df72b17844364c56e4ab7e159fae5b6d623fd1b57342366198c9ddfeac5a24432c57799ef55c1164e51be9ebfbd000000000000000099fe1a0300000000d1207122315b218ef5fc688d4013e6ec2e223fb525690b96be8d6ad7a7bbe3d214670a997ff66913af9a068ecdacd50359696276005ad908a11a48890537fc0c077bcd7855c647faded30ab36434f5daa62f61c5af1b586951757e4c6ef10b8b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072a38f56b7cf7c8717b2d140be4650ab292147b82c1c7903818907b2ffd98b04dea2a55f008bdd6ae309b433a2e567015f613342b4ee4bfa38bdb14256d049fff2c9690fe01e08fcbb332fac11c2b726f6474f0f312733ebe1163ff2293dc30f818aba3f2f9350f9c7d1748898398272bca7498c8de938cea44d9719e28de3d3032d63a774bffca32b992fe194e5c22de19928d31cea08a008d0cdebd0da7c869d03033102ae29abf32e82a453432761835438b4f664826109c618df4cd227e78c0e0b05807ca016592aa16c5f3925ff3b939974a3c226d6cbf342be52e988a8c5fcf3657d8c93a444cc3c4c008b48843403e01c8ee025f52b9cd27518950aab238c82021373be65df191c120a61740a95fe221e21c00f94f244a6714689598c7000e8250229bca8528c7c05db53ee76108304c6a54620820e1408600f0fa97ad8e360298a021b6114388e3415e6b4613295806109bde183b6df5ad82769389a99267e70dcc6032bd0c78ed89de17299257ab8079023575ddd9770dc987d1072d8f097cb9831050320f5d95da7d5c0acfe506d7447e94011a78495b088ae50faba7ccb2cb9b452b8eec67b07c27261e09cebfe8b07ca26acee877e4dd6ec5d5d73de47f695e91a6e4f88861ed91bffa77bb096dc184c774093b181f4cfcd7c6ca0f371ec757d23be4cde554e27ec4000e1d8ec38db889ccb4ea7ffe0fa72da58a92ddfce39042f2eb768dfbccdab00f42ae3799d1a47404481f74474fd40d3f9985c8f0ef65afc062d131610299db851c4b138634277d5572da926ec46bd08c7555b78f2d1a0e8930b472571ce2fb8e8f2008b624d9f8c0e33b09306a8e883f3bb25be9d80a64a27ed67c0356a1890ef16ae6213885c3f86e576baec5d266522de314446edb6832e32750bcea0e0e8c499ffbf78974e353c084ccfeffe0d2598cfd673f7892d9f9b0771547f40e83fdb8607582afd81ab902d3dd1e0df9361d7165618dbee276a97f000014c91d164333311d064d02fd0aea1d382fbe2ad47c48516793310d9bd9edc7f194e553cf9d7f4d7f6ed10353aa91a91423be4876477649f5620229656641b32b5738888c08012d7bfe199c9737f1741847257396b9c3f87b35ed02631fa4647f525b3215ce7ce3e92d8f7462b93cb490b26f82c633a645a7b81a6fafa5a8b64e3a7d008c3533f97bb64872d55906341012300ed7a0db4de7c5cd0af61350eb6784b88f34e7cf855002b3b4f7e188015a43c4ee596c222e711195d244fd4783c8756766121add87235d27c10e8f181270f7fa109e8e02dd458c03362074046de297f5532be2c836be1ec4f05ca3f3ed412ac559eb619b105c258cf76ad3cb8618851fd4d5ad6664281b7448c5935e821a820aa077a95d20599ea014a7eaf60a756439d5c6fa6bd3dfe40687e3630489f06240799dfe86f465e684000812e5b0e83c23736ee61ce1d910a4aabc88868e9c7487ada29a19e739d91dc41ad68484b70a309c0499ddd77ebe78c9c107ade70a94f70030403bf39da276c28fdb5cedfd878a521bd390b03976197c347240e66aba0f4ea3004fd181b6cada681b3e6014139893ff997c1db3a14295a7d5168e80fba760ba4142af16fe527729ffa64e6abb0ecb2a37e5355ecfaf7a4e94326bc4f2123c4273667e6f768fa6342c8ff7afaf40cf93b19bc791be364ecd433c179e82436631f9447e3937125a276ccd733ad5a987ba6c4cbab54b036f2e2cd519eb91cc52f23d9dd948466ce44357a14fffb5346a33dc365ebd6315b81b3408989991ec82233fb3a70b0ac268a324c7c574f3d925473f747fdf29099a81e83570d6d94996de94e4bd969b3de7dea494b3ca00ca1fd967d77052f5ea9f8b71556d24020b556458588739755fd89e5b68562fb5575bfbf01ffec0872d18536356ebc05215e481e6a3ec04a2081ba2e0ce0b33885d32d55527336524fd21070ab07902a4b7fba70a7a7effef1cf850329844c89c813f6187769f2f5ee93960aa87e8aa72a68a9393dd1ff9c9ef2340568fb1acf68b23c076af7ac949b001483d42d65aa3647d6009de4a6524da313c15be173d545fd64766a0e84b21f5312d5467fa3583f1684a06a73b38ab132eceee77fee6c4d685426ea78b7d934a89803baf687f34287057fc1b83bb34533dc6e8d2a83147d1136c7948d61ddee748c0a5b6b980df484cc865e156673f8d5d3a6f9e9d5226194d7f3ff6d54aa2f5a757de1e3857ea9e79d968cfdb3266eb2953bd172b66ce16f9cc57a5d63991088b34f357c3641e9aa70800643f9253ac3c88804f84957bfdbb95dd79a4d44a00114f9b2fb55dea75d7e1663cb1c5e172ff7b819abab1a18bbd942f4fd10ae7b5a34957d34cac10eb45ce219260105e5c8fdfdcb8e7784562c206f3966813d998a028ede780a", "6563", 0, 150238741, "63b9b7aeba960c7649c1a78693f7f7b148e953e5016853514b730a4a6d60cbe0"], - ["030000807082c40301466defa4b872f4a9e587c3a7d9cd87b8c68b1989de7520db922c6a78dea51a1c010000000952ac5353655153636aedc353c5030df589000000000008ac63516565656553a5dba903000000000763526363ac0052849ddb01000000000252654af52a1c000000000148cfc104000000000000000000000000fb2641b9655f563d882c6432279a83f7e74e7fc0fb323aa128635fb9fcf03c37d739aa8ab394f4b8260784797bba6d8d0123e1a098eb6f95737f4b1564eac5a10a08f99e985ca8ed7d7a8e326d15ca26eab9dcf2aaa9a9e69419fc78c37ee39f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075ebb8dd3a8bffa0fee55267f6028825ef9aaa9dbcb2e21a5c7bcc3c00e9e3d093d0e01120fd4b68b3e227e19f411e77ffcbdbd0d215757422325a333a8ed9d45b64a9315ad6693f5a7447d60b2cca9a55cc919a103440564528bf9dc233852c8704e694534d19e870820385954b5d442987d3c6764157ec1cbfd5b11d09dcd803129945c51f68f5ba932d7c3e939ab025f4c078a612e3ee9f9822061f06ede4950327c0ecb051a8339934a07efeb48b210f791b5366f71641d4db14480d85eb9b7f0b04d38b62dfd6c10bc40cd205ce6fac755449fa8204fd956299b35e78d7c2920a64965e667487004017b870d9b6b9efb5775acc2125727b615abb2c9907ed25d1020b3525bbb472ec3cfa9c6a73ec2ff485ae148e98f899c2acfd10a65c8bd8209a031362922e591eafb8c6e6bd9ff0195df1791d1d8b6647a439c714d77ff33a2f0302136f423354043d5c507b7a94e6cebc38cc3ddef5f27e373842bcebbcec676ff40216dfa26dd75e1bd3ead2b2dd1af9ed2d5f05567350436b87d24b88acf8d406330218b169209e4d426de03040c0fe37aedf0e913e9aaa6aeb7e0bad7b890cee770a423ef21f548501b8338501d179e8c3f1456c25d9566edd197be864a8900163c824fb056ba9f2cc416afbd801be8bdb5e5e30c1e62fae06a599d2fdd074aea7d7e2691b303df8f9ba4e36e58c16e36babd9d77bd538b7592c1d50a0c1a5c3b1bc0d957b7c4be8c76ecfd61ec51dd9168f7118689a88488cbf0384f64736b2a7ff580b6784c207cc3fbf1be633098761260b4fc9463e3730abb78724e25ea5944af0acf916fabc7aab75d1ff982d848b15c0b3410f283d0860ee4a7e5a1c11d363652472c2ec1bd86a678607af4e6ff945182c16c61d3490a33469c4cee8fd58a908b6dda5cd8a465145c87ebf2ae5a568ef04c71beec614774b1450f2b4ef1eeb615c8b695ba0c3ad2f1817836c904a75b749234242eeda1196235664c8251c10e262602b5fb23326f0dcc2af125a87d08549fe8e450af2a0235e439a90636d5e0830064768fd268eb1aa4efc662eb3fd0b8fce5c2eb95dd5440ed1a80a25b76e77d95c49f23ce9f9df637cbc5f4a2377fcc0c8aba0313934ad5618bb05992c4b8f07175ac298db6555b2163954397b111598f23013ebafe19752e8c0135279657990aaebe50dec880ddbdd28474ee5e81489d2953b94d523b7041927dbb24f8e7b7d65dfde46882d8dec56458e69ce655def147617d757fa850bc1d335a2fcfde91a7c7ed8fd74e71ceffe8946c4cef35cacc32b281926b79cb49f18f5ba4723ab1c4df3002c29053543f3bc3481fd0e6f19b084324efe866bd7a7b15003db7f4c6741afe366dd42912e4b353592bdf8647e67cc378844fec30076adee39c75113c0533dcdf8315bde80298f68c8e56d0b41564fed6c25d93c362ecdb3f79d906ee3921d405bb89ba1cedab10761ce5928a33366045b7237a5353c4271f3beb6368a73486104107a2f67ac12d4167dd37f7c7bf229710b8a3efdd5b2099267bca2303e36ef1c04dc6357d2509b2a257ee41066a53850da93b42390e6a3f2b6af1dfb61c7865ab32394e0a4b89d65a93093f145daefe31cec27e8d9d38be8adab7891da7badd742bae2ab8119b2defc6c152389a2a38eb974cc36b7d55402842b8fe8ee90e84482f70c20410c8126a47d2ca4340cb26fb75ec83ad6ef4e49bde6433fba097632bf5f14964ab1264b965e5d5c447b6ca26da5da91975c941db867f00d9fd969cd4c125d291fbddda13431c334404c3921c5f279c2e422d8009c762ae431d83b2ff745db0ca35f2804eb3a886820aa6c0d1b53fdae6dedfbc7c1a2217ed47f548b4eaa3722cfa807fac38b846891e30e0132c543514a234dc4ec71c00bf896a4e078a6783267d769cf8c21c390403479e4eff5436808a767460eb248d2578b8a5a5cc5a22def9de48b30ed4272d0aa3b84cb8f1ab12a57af265978c1deecfef8793b20b7c043f8fd44c35e28e8ffc67a00b654406a4e5c58649a8e0b82f6d61dc19edc6664bcae79399e0ae8aeaeb575a78d1a533b9055d601a1274c5df0b7721c63b3f80e1de4afe25dd7dc4b7d1705c579a3c0f189c56ef9605033c208cd78a7faaec03a714d980bccd0a766f250b31fff87a9b3697b0ff4a4ad9dc1812eb2607eb5a9662bc4a01004bd728216cec90f1c575b4bb183cee8b87feb9aa09ab8b92c618e48743ebd8afc8d68c2ab9793c89b44ab6b4de5043463d96dd644621aaaacb06064dcc679950c276a6d8f8eb929c19876e94297739c707527a1f56f8741433fded4e6cae65615e7a56711d94efdf5d684722244ca4699338e4a642ed9009c44a488a4e376c4bfd9cdfda68c41fb66fcc2586cdb306a9db9eeb31748e3efd1880095755448870079fb04", "6a006551", 0, -1451159415, "ac810807884ced7ba3eff69704fea8785ea995a9f5a7fa74ae141dfda48a883a"], - ["53d1a460039e6b2d64ce2feeae7d165cc1fb592a3e9c69e6227483a9a8ba0ac9db2135fc9e00000000056a655151acffffffff1f274b4d9fff0e4507e73dd01e177e29dfc253f0cb530c6494e086eb25f40f220300000003005263ca3c02fd31d2ba07585dcd2a195885468455726a4313ea061e510f94afdac0b8bce9810502000000025363ffffffff02ebe33e01000000000067d210010000000007515152536a5100fb7ccb7d00", "", 2, -156355169, "a877190bc9e82a3a2c3ed9f1ef410250791293133f75265c6a298363c85e5295"], - ["254cd82d04dcc95a5ca67e4bc6e5ec6d8a6d71becd53956b27fd2dce2f368acf036969d9770100000003515351ffffffff056f6b5635d9732436618ea009b4edfb1938b0e1d0af254a9b04b2b3ef84a9ce030000000153ffffffff62bf89cb92b3479fb1e3884481111d0c18dbd297ff647f6e586ba63377dee74c0100000005ac6563636a8e57871fa33e05d90e7da24e9f4fa5cb37f38170cacf506d140d46420a838c8dc925258403000000056a00acac53ffffffff019cd6830100000000096353655251ac656a65d100a2e1028475d303000000000000000000000000a50ed35f0e5eef3abeca0b1fcee038cd67fdb76fc73e20cb53e91eb21860af074564ab8e56de773ce0ad21fb90102d1deca9f3e0522bf2575c0e8175ea10b9ef53e492c9a0d2bbca18b4f3e197c35ce8b16f0086ff25c5b7bca772ca74a89f520000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ca9cd530037a19413d15d8d3696ce7b1bcf981d6fb4f94c4f9af3e7d0413913b635d860e6ba90b577f874faea004451cb91b919f00d62f4d2810e90b155a529e54c4230c8d87333a7b888955370b6bde8e24fba466c98637ecb004af993f46c49d641ba4296ba3155ce0f5c558ed6d9fc82d7ad2f5c507a706421520e785340200f029ca1b9b20dcade2129fae113497b12f45db76db411ac165bcd1a9491080032f436ea3596af6d0bfae9dd384e2668d93618d4fcca17d48c0daff9e49633dc10b05ce3ae9e5db5dfb84ec2656302760d6a06087df52b97e9dada160a3bd072f24fed01786075871e94f55106cd6538219157e34cd948cb9e1781a0f775053d44f032f87ecc7b262d0381b642cfe0c12cc697b52331ebe1c188e396426980696a491032730a8ec68547bef23408b99cbb9bf3755cb2864830e32cf737ceb8bcefc13ed0212680802d039375da72d03e8e0afa265c99b7584b76ff2017e72f073ad7fb0f40307e7efbcbe28260c6a99d6c606b22f304a012bae53886d032662352c5fd666ed030ef54da47fa050ccfa9dde1b96fc529718db13c013f122b6a2f33703c1d6dec22445d37738f3cd2c4d0e2ee5ad7c10f6c858a2637cb042ce1189ad50e5257209f4a0bb6cf538c1c49c117b3c48b723fdf036414e66e9890aa8b7d7101f54a78085158ea88f5505e9d8332d191d0c7cde89a03764cda9258c317edb0a692e35e46c7484996e2a0327f4d2b49267fd1b4af16da4b7f30721368c773256898899b03d9adafc25c931a47a06e4ee3b9490834f7021a89bf499f33837a1b95d8da84f00a023ea291683c1dabbd2b402b30330cb0f58bf38864dc6e0e777330eca120ae4a5c1c30302f27cba8a9c7cc7476ff79de3f00108347b6a244132807d273f13688629b46407bf80069a3559137f723b511e047e5a11ee1f665835fb510963e721b1bb6911ead6f89a55ad0f2c1986c28128cc55e7ad4d3ad3657a12c4ed958f470961b5278aa331746f734e0729fa194223007aee29725f8822d3c1d37311cad215dc3bef5c4448e94067616004317db6056e11246fb7cf0617b51112cc44d95d21b01797392c1eef2875942ef5cd49f463fb9ada5e197ac4202287f7a15db2e4846330533cc85610dc462854331a7a9abf03d40a5f4a094fa4e17f85d015823a850477bc2c4b64ab3e77f4ccbf38ad94ac16799ca45e30540c8fdf254cf83144edd5cfcdb61220c1f93553bc51d44684b23414fe19a47b031a7dbb2f4d9d65437afa196322f384997b9419d7df34fa70a78d078f26736551e097519415f15402ee8b677ff11e60dd5200e5d799c2aad38c2db6ff6607b454b092b5ad28b28f3bc0e356e83a15c90395a41c4eb3f57e4856e361c687af13beea4bb474f3f08083e6221a4fcf92a7fc3bb4b9c21f3c51c445fde2422e44917766920338692228a7105cb36e5bbec5612146074cf128ba86ab5f36b4d4637f303cfe6c4b5a298019adbd8c876ff48650c4e2a9d287b939e5c457aee445dda96b248768c3cae1cc12878d8e3e910387fe00726d14c82504eb87b85585357be02e633286a6854b78f14583d2113ee6f41efcd02fcbcc3ed17f07901026e08518d00f323b558193e211a0921bc306744976a2658384b81995493846fc3726ec739d9167d7d124cd0eb5a967f163be41a648f40db0b3b4a3401d421cd08d93304a505443021e6698ae664966389868a3bf54e098207b24f18450f43c563f1fbfe09ab2e0e7cf3f4c5a4dc4578086b886f92df3b4a4905b4889c8b7abab8d4594ccb5ff0582f18f5d86669583eec72045d4e57c2fd627bc86ce69346a6816bce8fa431de4d898872c02621855a72bdc7019726d009c37a50b37093cebdcaac26131a3702b7d61f86cb0c7b6cdfff20162c366d70488e04720f76ac6c71de5c170bc7118121a81738e01cd942dbb1a4573de64309a7409dcecfae310bfccf69417f0483d49e0941482a2242d85d85c9891ee193549caba0820482ab9891a73f9f8e274755596abaf28fb678a50a6edf6b2f9646f87466112c59ada9e3e98fa28f3410d3fa81e434f92d65225905f24d0417aca4e48899bfc7f0c25537a3abe4d4d048e701b662d8c940f31a244594b1bfbf6d7ac30644e1048923a573401b2601ae36c04f273ce54ad5598593c993e86f324c22e0df027bbadfe3fbfcfe207952cdc97edbef36a8140736712f4fea2b30e6e187d8e2a856968ea95c2b8b493d474f5e1d807fc89a38a55fcdf5cd8545e5bc25412734fcec9c9a7ca48a10c19020000000000000000000000003ab1104700278e6a9d92234e0a4a128848da935255702d5276a8afd289510a22b63f03b53054c615045e6d3989a5ea4a3c0c96411568580d93fb7b26e2d54f39acda5033c62c8159671bf69fb48cb8476caa9881198a0214784f86d85d16c417000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ebaa9fe3a57a25e88da04f7b86b69143a7bfedc51a190cb5bee3a0452008320f8c4923816c618a828b9c64632ca60572e7cee66fb3ae4ddc26aa5a951f02e2a41c84cbe3c3415eb5bc6d2d90f5bcb0ac1f6a8449a74d6edb080eaff8298e89180062bf8a86ecb8ed71addfc4211be317c701b59a04bb6abfd82659b43eebe850328863731edf47942ecd96f35f159882434e98428f21c57d2664ba0438250306c020b1d95df6b30bc7277daa6d839f951b605abb2f252e8e0942c93e5b483c14db60a0253ab712a87d25a3650fc310d834f580ed587dec72b9d543f8f602656ceb9906c90653760a215fbbc033f0c2024185a849817873cd3ff84193e4529f0196b64030dd319d28d0dddfdcc255e055a745e2f39188fb4bfdd7abc4643c03158f92ad6031768a8a98aacc37649f55b6a6e620747c92d62196307dca5002074c77ae2bb0d020ad7324d08495ba51ce008a179585516f945bc66d0f148995758adf8879d4e1d022e2e96bf54352c9bfee1063c1c45b3e0f940ce3e48c9c43f17af32f1518f6d9f03163c0753c93be10ab8c9647dd2f2d9d3e748fdd5939e904f3345ca32db0754659f86e6733ae3d77e7e17edf2c723cb891c832654dbbb04cff0e03a6d7c15a30f9ba2d44a3ee2bc5063e3edd5f2dcdbd53311ad4840b9eee59483de4ac043ba68d66d9f9b2e5665d97aa31357e8f0f55468f71fe3cc9316c98c52b9d4270a8f5062ae17f9a82bcb8b90b32ed33d517149071548e6a30d78ce7f5f04971813b230c64570f49a1f6f37842e71f1f75667a0431d4c6267d9490e560829caae3e08af0c36a347520bf585321c087047be8a4b0f949ceaccdbc34e27c15e9220490585b7679d845da121957883d4f849c7635b5a9980f9ee910457089b69cb9b4201cc064ac7bc34be222daf1e8f2a7ef69a63e6faa8b911d0e80de9880caa888807d9283f36b914adf95563bac392bdc582d55f68ba58f8c4824355ba55b1d080e3c79b3d7b51b18dd3afcbf4da73976f0f56a810420ba83d534d8024130fe7a7fe0b2e2c6391975b43ccfdc642bd3932a1353a671a2942006c09f6eae50411d41ac49a7a1c10b0ff0a09a91685586a851d8a912f4bde044fcc4ced18aaa5a5de936bcfc00efb76d784f2c64d0246957ee50cab62850bda37d6dde570ca12a13bed3f5a5cd51d715162adebcbeae03e2b5267010a0157192c3451d745ba5cea8302ef050bee70acd72bd4565897a39be60d8a1be672b1ce40877895b28ad193f371c57c7742cff4a1e81cb8b07feff4991bc515f53c61686e044553a72a6249aa6b7b707e0610bb8bedd19b254ac0d6559c21fa0c5e9931e40661de33cc6a52e4f482f1a3a6673503934bbcd07bf70176f5cc44ed97e43c25fe9630e277c3b9ab69b8d1069b658fb3b142f535f992001f420d8af4d05610c68379a79d93f2b83766694f703fb2dfc1525c8c62a88928286bb6cc8fa17002919b9b894038236c3378e3c1d9c793e38adaa3be53e6e1620cb00be24bc6d55e9f9f0c15a26d6f817b86922b3fb29e71b224171d5949dece521618770990ceae73c9de4ecd8794c58e03fbc0fdec8e2d58d504224dd87fa3a986b3d82a0d1234d9b99624e619083c8136a2885b21566b2498e7c313d6b017dfdcd7101da0e3fc2c29c76c30cf3ed7ff9de44e4195251c70183f97b46c73b0063334634537905c6d6e483573a04bc25cc6bda15151ee3517cf8adfaa7a669d6dc9f7da818445be3229c074767745d3adb55c57ad96dd9e636ebf3752d0563268e755065c74198cce8d7b960eb90c07594103233434fa3b46d00126d19fd97aca32b1a967c423e44a6abbd4141ed26834618983bd49f942f3e6ef3b949f7d733c19ce3a787af74ed46b591f73b0b2d0fbb9354bce002468a003127f191e23ffc45fcd8d134916312151cd2a4aa3be09ef4a8920dea4629ec122b60622451005078481da4df503cac2904e43c6afd4a3664234784239d580605e1589b9cb6a12d808242d684b4063454fd1e24c99d1bee14f540ab6d7d5ab2d52b3d805496bac14810442cd0b956ce38d97f849508e687f661dfc27e72ec047e945d8a7e75fcaf783e89771ce01f308afd280a9819b11f94ff3af952193b88c7acdc13b4213eba921e13926ee7a3cf7cf0ec32576b087b321b5a2dcf6de0c1ce011d515b77d0758bd33d07a69018c0817707ca5145b06355fc76687848b7fc31d790ffdeb885111f9da6cf064a8a9eba87ee6f81b892c991c0e1c93c2897205b91d6d52b7b63ab91bfec6192c0ec788ce121eea9e299bd442cc9d94169841cabca7ed88c84ada7c93a73d43c38c25923245b9839fa1b87335223c72514091e017950175953e3ee3ad0de2d81f6e5ae9fed30ed4cd8c5e38353fcc827b190d06902b4231c8166659701ec602", "63", 2, -307363047, "81648795368494d20de9d9d1a487027c6b52702838851137583f5f28847c300d"], - ["f28e927904b68bf1d1ce3c1307d631da5951a948f35247fa91fcfa66a995e40ea098a84df703000000086a0051ac005152acffffffffd6cabc465d77edefa56173f6820aaf52173603e2f3244a00f8454de70802752e03000000016a00dc457f15ad00639e05d33173a4ad5b3a5c8ce7aee23561362d57c0fa83827258c580150000000000ffffffff8f1b4784e5bad9aebb3f2c9f76269f578c2eebd1a4a855dea357f18707b1bd7201000000076352535352ac63b85b554b03582645040000000009655252656a515251acaa285f000000000005536351516513c5ce050000000009526565ac00530065630000000000", "6500656a63", 1, -1510038594, "3fbb7e25a69b626a8c79369950ea1323672298aa1bec7065b82288c2db4310e4"], - ["030000807082c40302eb91abb96f18ba59fc1026ebebd29b76ebfbe7c03c23b5dfb61f0e168e94860b01000000055351516500ffffffff05226ddead4353e241cd1450d8e05ededfd3c8bea42859a3611af9d5a8bef93d0100000008ac6365650065516affffffff0125d230010000000001510000000065c94ca4010000000000000000caeb5801000000006ee6c76883a7c76cac0adc578a92f232f6a371f489421ba2d851e5b8145b8dd13604369c59e2d8708f0865227773d91aa12ab908d7a1efbdaf96970ad1ab81aaf86e723157aec8215ac5b2750de9e45a83b3d8f223187265d30da150a07c6211000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006cfc54d8f298fdc19bcc7da9f197b2081c8ccf22f6d9a098de95164510f65bab5d6f770edf44164721528616bf2a858a07feea7306b4029549ce6b98b4e62b03154c85098880a15df9bbc2a1b6fa05e55a8bb81ae1d1f921e5283dcb363772662825a738cb5c9b22ea46b2fefea961564fa4862566453258d220f15c8ab8396c032aaea14fdb2da60a66e4277155fbf52096d7fdfbe1ce81ac9c7683259878229a02293235f959fa7675fd0834d885caac7afc35fa2d23ccb801231e5f9f87fb2a5e0b0030a6bcd089bb3223167d7b157eedab5758fbec00da70e91e51264babb6b8b7303af7b28a665c30324f1a61c8120489fd3d76be2a75a1f1e345fef514e65f29021c28ba73e948b95caed27c9cd20946b77b19b24a84406d3b1ad39239fef4760b031fb1057ccd94e407d43903ab0fd14f8755b434450799f59ea5aad6bf689afb180323dfe8b234d05c51dbaf010b51168d03f5ec658fabf6ddfac9fadc70a3d612f80204bdb18837794b3e684434d5565ce6595c24dfbc880c41c3c515d95894d99732030b9ac845750f08d99e3f983e3b6376ee97c6c1bfc7600afed66a3ab5a562d8767b2fef3ed82b0846332354f63816953953fc7b3f7957b17d23256bdb052da404ddb6df5ffc9e746162ee5a6b172590ea58c179cd5963ebfc0cb5b8ca2d7184affe77da76c1367016ea088930c3bd7a1216d652c16c5839bb690676cad055e2f5d06855ffb782c88e8a28e92391d9f43ecd348ca43514d0b0d43c33fbb5690ff0c7956c0c79026b6e0fb2e30c9e6f7d2c08b0b5a0e819456934b3901eb8dbeb81dbf6030b8f23eb5f68ea95c909fe23529b06ea6d46d29d1292ff8292be55dc8711304426182d6359aca2db5044eca6be643a753c238306ab07d4b0df45793a5ceafd581d480ea44066e6d988daf81ce6d4f1c522ef1e09782055abafe8e470de9cd997a56204b905a5d8ebb7630a06dd6b8179799f2bda174a085c5f1114d721421268b8ffff474c72041d1ac695b9975eb8379843a5eb7b7e96dce9e7afe753af6d4a12542c442d4cf796baefff6b0e279cb6f9ca5eb0bcba058ac58f5ed0f24ad37d09b480c3a1deec04bb52cdabc79acb5147137223e8a67a088d99b229b3b0dba8f7d99d96c2feabaf34fee71b56f1a095119f3cdc989ca079489fe388cadeab84ee515da95df3e4cce2344bc77205bc923b686671ee1ce86abea8567f8e439c32f504d8e5ab96c429dc603ff9b849739205f6733745a967212181c48c0fc0f9bc129dfd59f223de48e76cded29dda6496d2b137d129be15f03d6dea063752c4fb95e741ab7cc3284ba3e26959582cb6f09bbb4cc3af2fa1f9345db6a753203a77f3e0d0937701b377d93bd8b06b9af6a3f900a7c960bcbde56ed131bc8045a73e332226596e5d7305c3900fbbe279ac11497513c9458f308eaa7d430869b07ad48dfeb016ff410ffc41192f5e0457ff450212534128034c57d1a2e05e91cf4cf653062dd1660375f3f26fcbec43dc5091a58b19525519645a0aa73c746f767dc2e92e784e33f4c7c5e95d59085843ffdf2461f82d30de050a169e1c436502e9d9e608e889ec3ecacdcf0a6fbce5a394e9b7c5369787876abbae6fdfaa3bf228c9058966edec0857fa16f4e0d97372eda00b307972935dd768c4be5b421f8761bd43f79e0ba5e8c540e33cc14793f43be7baeef4ec05812d2f755bfc6ba336e9c271d3ab3b54495279c5fd1a7d590873131b7a0dbb60da62085befe012c2a18227f6a6745584853eed7099f63627557bf5ffffb90cedc89d9b97fd6683fc18fa0933db73b7487e7a0bf2f7d655f68bb9832a2123cd57ab773ec9b632247f2d564808992f32cd852d36f5bc1515ee8470edce67921844b31e76614420ce750cff22dd6c4cedc13fa09d5a815de5b4c15996b6e63f9c4b29a5919bf30b0fb263fddef835e0689e2342ef702876367a1da4642418ed031b17f4ae22a273814574b016e654d6f4009814b5b835058f169ed710ab75b1447e9f11e50586bc33bcdef0785a1e6a1e4d46471e231b4451194feb458bd6fb1fd866574224c43ba2fc097c85cf44537a08daed59689e76c3f3ba70ec6ee1431fc0744d1b6dd218ac742aa43944ec933fb39e8783d99a3e01dc96602dd3734b75968bb8d442d610d7e2f690df5d05f4ac290447e1fe3e5639d95cc1759aeed069d64315f131cea38534d5dd018245246018c981ca32885c7a820a4d2fac1f2e6d14a7a934baeabb5e331934a4276583bd765fcab0c1bb76aa960ad672089f15b5c5abaf87dada2dd40a7766c2bfaf9a14f04a46f17aa2e5b0c4a8f254684b2a4f290d46af2589b7f5b724266a64eac3b61436e752848bf58bee9862401698b6e1770ec1be0847b5606ebe507d93078ffbba0e058be66fd3749acd06", "", 0, 1564260044, "c2bd35b009c906f398362282a2155d02bd552518439249b82cd81c2252e497c1"], - ["030000807082c40304704bed92f5739e092a366c3290e2cd0ec6d2a80cb5b3e1031b3bd69a088aec840100000000ffffffffb222d9860dd695aa9e1da3dd47bb383b99c80a9cc2032f7cc95f20174d54e696020000000865656aac63526300ffffffffb8f9a36380b5f0f13f03a04e7a33fbe1e7f1691ab8b7312b7b936d0a5e74aa73000000000753526353006300b2cc79561873070d613760e0fa61a2b7ca785dc631003077f60086a9c0787e523ddded08020000000800635163535100650e3490f503f92f35020000000000413110010000000005635252636aac30ba050000000003536a6a000000000000000001000000000000000046a2ed030000000079d520bf173964608abd5c8527885278fc2740e2e367387e64c68dc8cc9d1c1843a71dbcc96348566d20a44d2ed45fa66b738076e7c325967e9dfb2b0831184d00426ff9fe91833503c51cce42bda931f3d17e5074327167bd3cee71186be93300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aa6da328f5d259f6195189a9523a4e947e898c666d196710c1776eab7ee2faf5bda74f867a9fb597228072e09a6cf76a578ce8b0d07a817967cdf6c066d5a81dcfeb9daedb132492153a38af1433f4c8a7cac46588db40957bd95ef6599e8a0107f77e78fd412a6fc777c5926a2d124656bd96e0c367d10e17285f0debe096d30311caf80ec0b9ce9d64748d261b219a69d53622bb6e156a0e096d88295effc4fa0210696d709f4c7f83efcad0fb6110c96bdf2b59d7d0bacfa5d07da78c2b751f820b055f2d0103038bd195e59156371370fa99483ea2f0c98de59bedd3125529e7d301e6922d03d3338148325039fcd22f64d78b0ca436664c8aa496c59d4c5beff9032b6c02e1b2d3238707d444833c2423b509f03dac31bc1e99d3340560c0f5e92a032470a09f28a93a5e88a7794865ce6ea4d6cce072c79997ed2b1a3ce4e9c0408a02181e3f8a37904a58803456c301e5692e0f675a621c845b1623661b8eff4cd0ea031804390f4f0eb44d184d2c89be743863b3360363a53aef535f9dc845d24b126c0306ec740ef7ed805ab91867ff5b36685453ea59a947aaaa3222820f1d0b65a4375134db8d4f51e423358357f0b6b9c60590a56b8c6018808254010b49de98d954afa97a4b38ddda64fe74fac7137f7e48b9074c9d50961fee3697f4b9a10b48c8095ce4f831bfaaf17c1696eb8f35368201c218fc1a99cbe5bbebe17d86d33bd25c215e593d7cae6c4136fb6a03c56f552b00abbfa08437a0d225e9e253ce2c35525909715a04b46fc13e03e89ca4c141ed74eff8a81aea316dadcd4178eb12615af7f10fb57be06d0ecc58afa93afc7edbc8a0a754143ded1cd235da8286c3971690807e44b43f198ae77c374c34184780226506147792bb70311f3c458fa845dbefbd2334973017b573563ebce42325ff49fe69ab8907a072e796dd96159d9447fb8ce98dd3e410ea830c0b00dff7f5e05c9151d97b97160b08a93460482af0bb8d74241d96fee3265bf7f511f2204b167b64db3726792a52611a1305b8d2a29c9c42be12ea735d48752f12b7b2400f660c866f9a64b81b8128469f8b0b2a40c3bad5fc21312c0df938efbb3cbd15230de0dab6ff56cd6e6f541da2b1904c1884203a08607d43c0e12b4cba1fa574d233c2a07206d465643328e63107290ab334d2437ad11fbe4dc8c860ca53d9e23e7c0b9576cc815af44514571344e1421a34202ff4cfd4d9287554fbc11f0c8d44f66dcbf5c9a3ae335ccc124541942433da3d35c7d5165c7059b6a0c2bfb36f956be21b1239553c6a4133f96782d0791483d4317a9ea3b1c35d8003f685ccd4d79a227c3f6ee5cd77a13975f88e38af34e5771a4804f4743e6d6b12f6a8e0e16800f89d91d11b744d1bee57c9dc9eb3b4c9af55434c45b9fa6f9ce7f8df3847ee36ab2ece7ead2c097b787d1f5d1976375273318d137f7876609349d8c1e197fac5fa827ab188736f7761fffbdc6fdc523a1cc7f487aaa5f386c53481db3060d1c671c6a17b1411dee4f388826d6d822be334d774b23b638b149538c6322305550cbf0b57e9f34e2d95c34bbf0bc85bf8a38ffc13d187ad64ec813385a2b393fe9a475838e3fb2015642f068c4ca7a80c245b6048a9abc67dc5bee46d8b8992de57e131b03e2a301645bac45a205ec2debe6b9a556e8dfc3bcfd8192a9bcc1d84a308ea890224a19278d540f3b432215eae42627a1b63ca26235b488be61f572a75ca4cfb0f6c8d8269526870724700e977d43104b8a3eef4f4e1fe2a46ebdd20b42d87582859ee3192dbf4d4d2bfaab14198ec83c1a2a6684652e76d119d3462e0e252ea82f0f63953109dea2f283894d001f18aa6ea3ad150665538cacb43573218864f1874e185bd405bb3478dcc16211eacf545ef1e7fde0c32fecc9b45d6a68a4e0e5247766d8fcf2121dda95f29c8e0e952f8dc3689ec9ab04fe53384b75402cabd756edbea01661ff3e6c99e87c751623ae618aaaff4156876f717b0abedf3aaae121d0bbb2389860155dac64b4cf4e5d0be868bb62216395de5694769e2faf234b2cb792dfcab4d0044aafee64a3cfb193167e6241a6378ea16833db86fd248f94f99156e23b747c2d9942d5552bbd94f7b6c163946b7585d5eb814b3bff8c10308feae29a14d632a32192cbd878aaa0c03fa0d17aa91aff2d34f8220fc083dfd5f045659eea3b69697447616e0c2c9e04ff14b754b31e1e86c469e289e5548b312de8e4eb7b5dc318ac8fe552d81993a1154852b71d8bee78e891f2d71f05ec686babe7c20c4b35ea5014a837217e36db5b7d622922553b7160d1d23c10c2f2e284a005ce04bb2fc54d12622e76bd141690f275818535a5ba18f5bfd5afae31647ae199f213af9158172d1010a6348c5935648647c10ede57271f21f1007", "ac63515153", 1, 2039863368, "b0d04ff3eb9edc00d2e0c50b43f1f824cc20a0b6915fdefaa4a3a574db3c8c49"], - ["030000807082c40301d0865215aeff19e14028320bbe84e6e6cdfd16656836a1719a17957331af4a3d0000000002ac6affffffff03372bdc020000000006525165525252e4f15b040000000002006ac180410000000000026563000000000000000001df9b7e030000000000000000000000006fdccbdbbc40370ce48442f5fd1f6c853464f8fee758327d905b3756eebcd454ef3f4fc116c26c96bda974d1e8b86562f212850f5a80797d8c201e31842939cae8967e9715997f71273452cac2cce8da14c653b793468069effa426c2303a1e900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f65597af4dd6c80a0495a48a9f5325c7f1db1927a48045ed0515384bca9a2f07e846ffca71cda15598366afd2cb904aee7470fc8bb1e0d776bfff032e866d48b103a4dfc89a69fa2d9992ae67ffc89d538735a6ddadcf7aa328567fa4f9e7b7793e0ba1c81de31bbb6b6638b9b3568d1a83ee54d0d7271b23faa3fbf81b4735a0226ef179f02e0952dcdb7c3ed6315055c248e1fcba498643e428ade58b849090e0205db01b64756124d789eb7e1a45607c608585f6884a3fa1f75e89a3f436259fe0b037aaa20f88fabe496a2b9fb3df6ee6dc1d9e74e5c21cbcbe653c7ba26a80ad0992cd9a6534bc5e18f05ed9ef4554621d6cd4548f03941ddb3d2b7931f2d427a031b6b7f3fde1ac9467ed87be73bc111a8747d52b46c88cf2becf38034225a7486022a93ea1c44b1900259c9d2a89ea316fb6b4dd1f0cbeb5651b18d7d706ccb544b0323b93975e02fc468c370673da715dd07ac31f55935d59d31d5eaa2588e389ff0021680bb1ed46ada70ee79ef8e1cfb5c12bb4906d4b230851e05e6325dccc07fac0200de74fc9b0e0db881baacbab816b12b88fb4eccfd7a1770db6fc6cc26d713b5ceaa76d199598cb45ce4828da5c15677da363b73065c2de70362749f243627a6abdfc090c98173eb90895ae2f496533beda7810eceee1c2e8cc9a00272dc334fbfed2a6df4e51c3b0fb92d83ceca3043e0a2cd85decccccd51dfec0e75bdb2e81cac0d4a6348b642bb36be3d0deaca34fc9e6aff317c8bab8ab48123e8740e09eba30cf1add3afff39fdadfb94add823bf041faa7ebe8286e0ef178f725cfda08234ce1082b2d6a545f18490aa6f5f0fff5843961f735d4f8288f51da86fe3220b243e87446d1b91b77b13d52234f3bad1389dd8c327d43ebdb4d67c3f6e183dd85f82a226e2875e33c5799b2dbf42f10a2a4298a2c7b0c651238cfdcbc3ebb8472d332a62dfe9aff799f86db10cc4e7b6444da942630b25a5e5e23c06dac7287d7762cd8e7847187219f18310bf131aafd457f9719824884daf7b4bf301dc83451ed9e2280c0dbe000e21e3ef07a1a3ed72cfa26a5cd726a2414265a52b26427a44e9a63ea8e971c3e1b1fffc0f8b3f6fa69d96880bb365cbaf40fafb96431b72aa2375636320350e22fbe5450eb0f27169e28d343d90deed44c704335af81d664908e697c7e4abcbbbc2050b39e32d328525b109aeaccd004fa7e407f36df55aa1dd626562041a226fd166d603fe70ccd013719149470f97148dc2bd29c709699bc41dee3720d531dd3a9f4ee5746ded7b94b3cc6b2c30a73708c871add1ede0397eb60b23e559a03629d00f5e8440f51611cf0c54764b683389765c4762a2f2069ff1fdf05e65b653d511665aa6097b853b0c0814d624f58dbe317940ebdbe8cd6db8dca721ce7daef3ebfc4f360de400cf85b0b6941dca8d11d703f1345bd0c7255c2f5d7a449266d94670675e2855966c269aa212a868b31516987137899942a10739251e6496774147b78846a836c7e704cba059d4608a954d524896ab93735fbd0e232edada179ac0a44d4b163851f54ae77e3108ec81aa135b2b4e5bd50461b1e7e1f5fa4fbfe4ab612f2fc9f04f2c6bbf1e792e153724714a4340e9f286dbb1d57d31427d59fa51a8502ff6a7b7ef88572dc8f3417ab5ea53eb41435a6dd50c252667c11ffa1d05cce7502bc7d8e141c8d20bdf3a1ef01ca38d9c066d66177d2a1ea87a3710af72e6480e1a90acd8093122ade5bfab46ece8eafb99c92f50feae5bd5cf84a3531e359c7876b7908c2a590832f29758192425cc7b14d882ec448268b37b1ca5e63d12108c4f6d623054802249af086d66569eba28fe9b3267a6db89f57ab692918439e62e040c86a1c9725a18fce08b411556a8c2ee1983566c38b18cea0800322f38c0d662aaa57aa67a071773f635bb0f5836a4e8ce61b82d25023d401d1ad2303eb2a6e1bc68db88dd23b2c2094c1c499b9130aba31a9f343387d5e52d5f36ae5aef487b03de88920f07ee655536d726e25c28a81710869daf9c2dab3c34e5680f894be16a98e884b15cd9dc9664e30b2bb37fcfd93259b08e5e1684ca1805ae1e60bb24ca8dd05a9d159ca4fac7f04d1e192105264e27e27886add64ac70f53663ca0dd6e2eb13c227385436132683ed55aa7537f1874fc28df56b13802fdb3f1924d348f2a1bafd1e072c01c16990fac9408ab2189fa093044e20c7d9116019ea8a3557f169f06a83bd823e8bfac10bdcbf8122f9dd444d3e54b1774f125b083f932ac476065a7ebaad2bb39be2b1f8929ed691b0d1498364e0df1e4b7aa1162161c30dd787b33cfb4997a3bb6a0130371a9c2d05dfb63bbbb99553abf8315d50b2e95fcd1765e7c3262f6b918c87bac3af0ab50b0b51aaa07d3d9b2845252d7e1cc5ec705", "52ac006a0000526a6a", 0, -121624942, "e9cb4eb1feb7631e5396a5dbaf0373b153a30c7a796780db3be932b2239d5077"], - ["d714db590125259ca54ed4afa3dc8bd64c3a6f8236fd33347340a0503264bd9d26feec53e40100000001519dc8e94403f4234e0300000000096a005365636a526552b7231c030000000003630065d815270300000000076a63ac6a006a63385c766f020000000000000000b3b9cb02000000003e62937f603d2f8ee14c1542729e0afa254defe2880976d26e3c68b64468599c19c147d7d3708d433efb9fe83236c08471df2f57fdc6318956aca294ac23773464a7f68b268167233d688616aaacdb70753783d16b066f5ca2ccaee6d3f07dda000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c43153ea41bfaa3efe96dd9b636756535c3a1d061874eefd3a400b3c7276554cd10673a1f324e9ec1da92915cfd2a8eab97f14e457e77ea76b7b643d2ac7089b69d328603cbd21ca67808fa980763c6004234697a9bfd106545470064a228489da8cfa10f207baec4429f1e38270a6ef037e7512916b637531f555be0740c7e020933d68e14b8a1221cd83b1a2c12f03a2d03d20371b00558df7eebf4e9ece038022626207b8c3f228e91ac72abb6ec42aca1572d7082ceab597edf91604c9d70390a0474119dce2284c8e6018b074d8d7b73ae64b2d5ae5ec60feb51434fa4d15f7eb922b59a299c92de982140430d4aebfedcc841f0ac9717fa90cb252b4827cb010229c5044a17787c0e2fbcf5962387f4f0fc5f0f1f449c71a661ec66cf481612bd022288347e8d1cff857e3454eb06667fa831e1f6ca0faf5c20c01aee4304e2401402252b6d2db39f376224f42b5b8a981801af60f6af0c14732146b9744a7bf225cd022a790c2d6f8ce63722712f62f03b90a420192dddad71c5a40cfc5beb1d1e456e0221e5fe4f4e78ebbfcebe8e132ef1dff830f1f6cdb2af2eea757644a9c1962043b0e388423f7bf664c73ab5b535d7c3f835c74bbf606d24d235fad557dec01c2c48a2e414c56171030fcdd5368045bb5209b4f8598360c571e8da1752b7550a7d979a1bafea980046aa6ef7eb303360c5ebd59fcc72acce2159ab7dc72d9f7b4adb7cb2e0c60226c46527447b45b61c6cf1b4c96946e9a176cc159ff1fa1a3e867fffc2136ff9ce21e847a4dd9e81d51b38e03b7af588820e17c20dd4a0c05810e9e6978a4ab08a989538339c027426025cf1ef4e42e3896e716208fcdb43287e0fb72c3b2460aac95152551dbb1f992146009abec01c0c300d84880bc54526a82000bce37aa6e85fcfa3a20c0a3b934c8aab1e5fd933a7480806937c7d5a5f6a1df0ef2c7488a4fdc5d97e1fef37aad5f9015aadec262e08a4a4d45223bbdae2be37ec96f307bc14bc0a64d54d710d235bcabfefbc992026e88de5082a879474f78f1e9b7561952c9489ee81b172bf46f6255b3245c05d359e4324d3ddde17daf3e727cfd5755b021f67cfc7f5314070de66d49115499d44d433993183c88a13df72e1cade51b7648e25310fbb2b4f6596803f1185866790c90a0b5a8ce842524abbd28291748efad21551c912b6f597b784d0a1aab15ca5ef943856a10f145b0b6aa23390891afab289d23fb6723eb85e984464a5283cf1423c4cfe168cb9752cab4a7fb239ad93ca6373847eaaa7b7b935e33c1f84268e8dca8e1470bb07ed311ed925248069fd43c44c8fa0221ae4dc07340a5f9b0d048956bca85c4c793777e0cee1b3bb8a33743cf0234677ddbe82fb6855b7a38fa42f7cd606225de0ca0e98c666786a7527513f77fc81d84054b1191b8f3d63591f663e79722b16a21d88f2875a32ba7506e104a9fc62c25e0f356c498fce10d5a088c39dd2d792153738f6d40a0531b85bb595f33627a401a1caf84ccc9b35c20dc51125d13d9e831a5493417a36e1389b4c2836d9fc5fc4bd9c40148beb3af3569c954b52fb70a0e6b626b0e12543c78d6b94326c0353327da937e49649be768aaa0a7eafd40cc181213c6ed0335997d466dcba1c925b77f6bc1c7ac12309beeb9684e784b958a588dd445793a17624fe87cf309d81c44287a7cbe9a2a7ee7c9a957a9107227b098109c69711f42e139b9b7422023c3a00c20110eed7141e1ea412c3f5972f4c0289d814a8b1349273ee8d8a88233d43becb77738c52820b336763ac598a39f7338a75ea59af9323d044d85e35278f4753719283bff1beecd3ac8b8f98eec632accb7a410d84a3e197b833b85c66b30a623d83835ba152a5b04c828af11765d57f0e7e8a9f9b75cf32ed45ec7bd0035eb7a76f90722a6df632b4fe9e5891e997ab65d5473494c38b33f1601fa2ea03a196d673613cac28ac68f0d51dfef504929a0e0f8ab67748269df2e4da1889c08bae7529a67ce099898040c92fbe9bfe71fd34f18dc08543e196198741b21ed3e6f94dfcc966f4edbcb340113d230f8f9ef3d1eedc28d12d18a88701a0d0b0cfc53304aca496c36defb3d0b20c386eea3a41a09a87b033964929e8ec229f71bfec9c082aacdc6414661b522a0904f0c18dd6e50c47be2d27643f2ef4596611b9b2beea7225bbced97f53f0b3ee5646cb9f44ccd1903fc060e14223599b2bee3fbac7330fb550d35ef8f5585e9da6a876f5f1eb58ec98c9fe7bf0d8bb486524fbc65aa071c800000000000000000ea53c0400000000d3899bcfaaa624e2caa8737f61e61fc19246bb639775314fdeff9afad97bf33b93603baef75e776d9501d0cdf73a7f0b047ae6c016d009e7c355d7e99123e3699ad03eb3b73555aeb88abfa6ddcd2e844fcbf992f4dae621d2c7acccc87c6c180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000067915c888d6fd568f93dbe32a38caddcf04bbd82c5d4d1797de75501eb2ddbf018f6e508bab2c25c537e3461897ef0cad0914c9affe965428815bff79096791e80a649aa0ee6313a4cf9b7edf262a6d8ea34d55a8204a69e66435b235ed3ca9a43d8f57d9a81f826bb7a69afd2122123373926aa3d9bce4c52e47c623699a98e02157198cceaae569fcb4a760a574b4bbf15d8142c92b77f9acb6e8f7a6eca93ac021eefd134bc4a883e973e29a60d6d8c4fd1700fe9ae173d8395ef10bd5fb95abe0b00fa619c9a375c035dbba43fb98a71aa0caf81d6a8f6e21aca3c1e68f9f78d69848ac30feb72b156d8bc58e3949b7acb37bea0d9a04df9cf9025f67c9cb0a0970306debdb8a98cf59c1de8a24085f276ebd35301ccfe87f9f6e206d51a9b02e0be030ae2550472a84f34894af99b8792cec7c9911e04ddd0a18d3320b6cb09e9874c022f29dbc7d51365ad56b1436bcb9f4e97404c31b5a113629c3a2fd9d24f3cdaaa021f084107c39af0c80b363045c48d38188f0e9ff7116318bac6932ef1cce363f40324f3af30e20e4730352dffcca4eb7c5b371b8b65121534b5e17edc87d46e09bead231c7a1a6071a8f0e729d5f2bde5774a76ae5276a2c732cdd7d40286ada583cd38a7a6805fbd55be54b684206378b8ec711fae9797a5f2a6dd2075862ff0d3040e759d88f6ad48ec87aa693e27190c239a7879aa7c39c7247e9c1b75c0fa9e116cb86eeb0f3b316f9f3db3a0ccf1a10f46dacb04cba500314111ae739fd60fe3aaa8f4e05bba93337682cc6399a7312a667b7549c67adb34add97f54bbfde31fa106c5104a302242119b1a9599f6128580903722dfda40856d91b05ea8066d635e7a5b70594d4355045b09a3743c1f53ad1737bf7493493f73eaf530f36c6dcb3cc9a5e0ed61d4dd589e8e5e8aa8984a21fbc2213e6e06df21e51b4ac34f0bc6ab336a02eeef7409e76bdcefd52e9ec020dafb5ce8e143c699df2180186d09776ab6c39a993cff6dcd5cd06989d51f36f9391d690a1254dc11218835822c3dfb6142982f9d1bcd353a4eec47d2ae0ca1477de710b8cf116ba94524d1c98c9cb7b95f7a6d702e06d524e4cc9835b3c5f773da3377f18574186809ee26ae2efb2765088c255545025a986c527e35ffc855ba1daeecde778ecdcbf3d1f6fce097d0006adf359422e7258a68231788b85e4fc88da620534116b6478aa487616281ff78b863ae626d9c341e305747dcaa7401889d5493550ed4a03f5996ef6acb1166515994e8b2aa431bf1b78f7b9855010455633923ab781480e8c4b7461e33ad882513aa532d6d35306096744074e9783d5272d397df6032a36f724e8dee9c4faacde9a0fe76c551a2f4935dbebb289b39cb9c9fd5af5303c6ea1d052bc78531ceea6f3d014306e31e450156e122d4d0f58fffa4b7338cd51ac393a84f2811b979beb7c8fbaacd9f1d6b83936917a0ff73984e44e50385d21ed38cd7787dc179e8e848b210d040f67c607e99084f989c6122eb5c12e8bcbb96100401b16f86e78528246e87df5d78c45c15bc25d07abe43a79b9166f481e35f0272024bd18f60fcdcaff2acd4371a9ab00898b35424b3c126ad27e8d6042c9aa7dc921ff924376276b419e4c507e93310b6b14fbf0a7ed6981025f3723aa0a25930fdf831370a26fdc8270e6b50532d172457885d8ef0f81945d2dc3298f50515986c55441e940bbe4e1e12a7a1180095b94ef932ce4501c3a3f7f3c8e268165dfd151f9f785d67ed8e3f580ee16e59559b62d0cd9e6c1f9d2da398f5aea4f861f07d2b71b6389a5a0eab7094b4035d786787493c2b7ddeaa360472d03ba880e375269e9056159747b21b06bacd1cde7dec565321e3cc61f7e0deca4c3db0ecff7aa696b63ad72e31287dbf7db773d65305b179953cde411ebd6c9c4af583eeb0aa6a950d3872a2e044390c25095956f826df1a3beb4bd8792b3a283e514929adae90b2a3ffbd330f78d6e41d7bcf23d333866afc2251b727503f09dd6772201418d2387231be974950568f979ac1fe8d963dbdec9fd7f49138b1920936081ebba8bc57c9da7031bce7d039120ca0fc529b6f269ff02a4419c6fb1a3dd43638cc095b4b2729ddc6a68da254109ed7c7927e892701d60f5266e92075c1264061c174d8a2d543b5a6bc9cf20ac02309f7b3b8991775412b3e3f5082bac3084ad679c7a68d9ea85bb6ca773f6d18eac1cff2b95e5ee06558f918a9cff190ba654af5a3b6c2801e95e81029640cfdda60bf6bf634390f934bef8a4f84333b3e14818b1d573e668fe060be3ba58b15ce99aabe65b474fb6edfb9e2f715baede219af5cfd0f3082eac16ee6c5808d5b596516717e9aa640f457a6aced6fd1c79f31dff3fef1e3a6a2e1773b933df02380dd7cecf455fd1d9ffcce04", "535300acacac65", 0, -2103617336, "4111fce15d6314a297173e579f6fc59b2e02819adbcfe377e3853bbe874f82fc"], - ["2fd7837c01e4b49deda0a66ca1175f6cef879fbd4570f694ca663bb610d7970e5e96338dfc010000000152eb75b28703a46de7030000000008ac53525253ac63526cff900100000000066a0052ac6500d66a21030000000004655351630000000002028c94040000000000000000000000002799476da0c6c0f90ab94817e7e7d32be5e205200566783437b6cd283604d0a54a91df42f20029d639353aa28492eee8e199561d6bbb30e4d56bafeee4b1098b9f01719ae34433ed3def8cc3f372732f0a3dca3fbdcffac777f28d7447151702000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004bdd069d82e0965df2bcf851184ff60b5ce4c23e58fbfd4576374965c69534f35c7ca0d63439251204b3fee7b3187e3ea35c7dac29742429f5d3e9d141fea8f507e435523efe58b5e02a5dda82d7c7880cc43cee50f2eb3abb15ad2d82a94a0fc4c104081eaf533b8a567c2362fc29f56e451dac9e59339dc547b3d42281fbba030e10a0bf16a6dde7557c3d8c16d31b0f396af6873f5d2dca25d698d1b5186043030393fb27b94eae2928d27b21ecaf65fca7b7416fe8909a1ee3de32d9212090690a08146938b3af5aa088c53cd2a6454e0063765bde7d00eaa86dce1526c910933d17a123653ce9c8cff2809abc8a700db96997435f1629fa0836f7531a066e02ef021f3f1af1c3b51627c209cfd8f74fe7ff500c2636939898b7787d7ac41df49add0316a697e7c06f163d35e33037b2f9384628a2e21cfb7d65a7ea4a1d67b462e70302052072e4a8a601fa56cef4fcab33a3bc84033834beb3dde38baa7526f19bde1703063d48d9a273d761fc1c6892401b068acaba634818f3f8b6a7339fc2e7050dce022aa4f68cea9508db58e0394b655d615044f679b4903a70c566d00f4b4a1d1b79fd80aa15703edd1b23171e6e94f8a658948c09669bb3dc4e4bdea78abc7715cae06316eba48521733a053c2ed567281bb9014f64869cc2ef1ae63f677910b2857b397680c5c44f5aa84809f5c282d58f5dece0270edd0936cac90e13b2b6cb00122370eb8a899b84bdab9607eaf03ccd8fde382956b6da9c093d05e85c46164c1a731e7f460ef6ee9aaa82066502b9d8803b352a4e48fd9950b018aac006ee9fc7fcbe2723398b0e0dcc73006f439bd9c6f6912b5e9867d4a847ee8be5a42ec67bb17a981ab119433a72daf3dd02a3299dd65e4fe6d88518a1806c2c0fa287d1f35ed5584adba498687c0eb99289dcb199d647ec0978a87d0c3d8cd065a8b37ae12eeac28a88daf4a7e8deb589bc7f63e71be2ebb3d37d753b9ca74a487a83b1da2a1cba2c92863d9ec975afb1714ce8f0016a832ab19df86301911464185ed8d8c8dd31ffde6ff36b4d01c173a1c2af1ef6b4e0db977b360f82a6a8316bbc4f7b4f35f6acf73c5d06fea9a6e41ab2e30bc7fbe9ac850448aaa11c23a58b55d6042c1e7ca026fbe5f22842533b825448dcc1a878fb23f35d2d29e22a91fa1701397c75a867e711e2591f6376ad1cf7b9fa40a6f6dfb5cc4f635b71d769e99b0d9942ce02859cb40e86fa0831b9565add09b10d722d4546a8af458170c24fc6c06f97ef141389fbdbdd84f6fb45fe7f92efffdfb1aca1c0ccf93573457a11bef8edefbc5792181cc6d0561d90fda5deb91813440c40adcd9551e428d34011b099b9fe4de7c5c7604a3d1692c44b460f241bdb8be00c5e6df6c2886a6928f4c6d8f6f0cdec85fa25c05be0641627986caa7a07c58d082e0b98e85a330ca54f5133a70d110d9323bdc4f629998db450ac065011f0615d060a40605ccaad8bab5cfdb03b826f90c70f8ef6e455a63c92c4af34bf40b9f605833ffe902d309328729aa1d264b66697d68fc211b37cd66e1f13f310424b2b1bb81ddf244f3082d930bfd621d9a493d33140f2ddb1d18ad1f05cf7c78b3c1b44182c1c0d114f6a0b33533a3f52d93f1504940821c022097013f48ee8a7dfa75bb53c8724c560ceb5e35e216419f272decd59231b1765bb4421571d35f34fee04119359c41437c85772ed26a98892abb07b6f9ed28e9f8893f9642c08d21a699307fa10b6eafadc46471c5ffc25fd216bd03e18ea935019d0b666ddae8b9eece614ff8d28afc711cc7283ab97dca1f9838f410f176b51d2d560307e6fead11257ecc8657a2a77fffff6ae6ac5ee413570d19aa4979799a329ca517729ba88be9450449df5a7156cc3d66a4823f1237fdb69235b621bfce6559725d8f65d2e5124687e5b7a2d642c83d8a6ed452b12ed0e0d1e0a2d670f98b6a0b03fe8edc4d13f97dad47d2e1c5c53a58e9de9ad4d5ea5ce9cf22e527fbb5eec7057e7d9ef7330ed5e3111309cacc40c0073cc2f47ba8377659c738bb1561232e9a50aaff953e04c8a2aa787e8f758295561cba5ece455f2b0ddc66d693c1eb2e3e206f4e6e182ec5e9da625c23cd9c4c7c76cdb6c2bd6471e40623d06c359135a6df7b3bb36836849cb28af21987a0b37414df6e439ade5470ae398e0058b7088fd288d455245d7898aaa7b6b269a1fae76bf47f69ae7e2667832e399e1955463c8b752f8efcad5a2dc19ca4ef1a36e2a3b091d4777ea8aa14a812f778ce44cb88a87a56b32040000000000000000000000007da443d8da82aa66334ad5ecbb12b5774c5896b93d8f16bdecc7e876459ae8e7eb37ab4f51acbde223f2a9cc4aa6f3f37de05b9694dab7f5fc7e04332bddc3e024a39a50876a69241f2cdbe806334e615c28a00d747a6454e7bb600a06cbaf100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083e360506d4a5746563d923ddf1df7c04d35b9e1311e88fad4560e8ae7dac471a69475624d4b37f5260883c045092c1a26809b4bd1b11903c4bd3a7c2e27ad1554e2643e9d014be4199a624eabe065689fb7ceba6a16cb1123c6d513154297734ec7b77cc800e47d77977ac45ecf32471ed6d8b89cd0711529133eb99591f83503028ebbdcb1168226b58b1faa398932581dbb145ee5403241d601b687b8479c24020185aacc0fe78c859d30467e3aca099bf08040db6f7bfeb8533af345f7e4dfc00b0460241c920416cb6a5f30ea5ea96dace14da3389e2d290cb0798479bec641047e62ce12dd963d66376b89c82d78dc5740dfa707d781db3a8e5dcac040d10ed3022509bf08d81e47e42d914e4fbf725f15541c20b084432255fbb0203d5988b24002287dbc3c354e568e30106839582789e0e1c1d78afba1855395dc8fcc1b0d41790310bc4c32b65564af8fe76c4f9dc390d6bbbf1d233a53c3771185b5963fc00134031b8addec58df1539db7de3abde8398dbf4b274d5b83beea88e5d2c61d53b4af00302cd24034c47f66abecbfa5c2bb0698669bc8c420bfefcd7aa91681a996d1ed3ab9500b4a4a6ba3b513e66a99c3fff95f94535a07d41e40afb6e1af1d446b4095979c71ee2730c94d48f04a34f9bac37eb44a58d00ef6e25caea2f03274b8b6206250a014c270077b52e8a7c9002b7a4c41bebc4d8e472ca017ce484814c1e3ded296413d2d03d469054f96212b16b5284e99c8ee820affa9149c9f857ef2d51bad25c57aa7bcfafb2098e0e345dcc48d34c144e77d9257d324f66d50f1439bfb547e11cd56dc4f5d278b624f5144c4e6223b4bb22c2a9e10a7fa445140ecf792924fa8a8af06dc9b444e505f81946e32b1a5e5f0856c2609d9811dfad43ad4119041d9f6fe26ce5e1bb56bdfdd467f8fb8330de2a861c19bae9e575db9accaa042e178c609cefb58fb855ed3a0eda9fab326916424dd38bdf2899df07db36ae81be631d41644a0dad9fe4d31e6df1a5cea54b8b62f3169a49f051f2db995055ee16c62413caf59c0cb922a788ad371a98eee40af8410c34cc73ef4f89523d1c17b146bf520069cc729d6c20cf89c31e9b4f11d3e6caa289f4971b8ad8599c2901cfa0603efcb1f5ae69c659ab5b759be771fea942a8805a750fc16542a90a0e835a9316ce24e876ca8211248e0c2cbdc65d115001033eda589cf5a435444e21609f9ce7919c734edff2b31cffb375cf747921429aaf75d9a5d63a38da74c624efc7f42a098072c467224afdc1fe69ec2dbbeb7dd646b6fce18702ec1b3b24150bd10f6dd682d3328837d395751140e5f99143636a22ad43c0585b032e7a4d808fdaa1e73faeda370f5b4319f42a4e98e74c116370ed188b491f759266df3aa5b3681e5b73469b02a59f126bc98d6bff67ec54fdd45cd7069ca81ba1db7371c60b70ec5155b0a6fd9877837a6e54f5362ce5889a5e600f785505b5055663ed2511c4bcce0edb7ccd1e8c58b9ee0a981a615bbbf4684235387346e3545e7779870298485472b4a9bc65359af24e9d8fea20fa3bb1001ea3a03a9ad25c2e0670058e3d70f885809859d537a4d7133d7885f6749707c1d955b816749490846cc952d0cc480a75bbf8de1e36783b5c4f39c40dca1f2f0da137e111eab71fe0797beafa2f172ccca381685cfb08c578fbf6c501511fec121e6cb473a6d95986c2f1c6bca69fbd078f365a0d7896097b3dcff13d1896c68a9baf31cb5eaf5f3dcd1a73f0413412e9f1e375946296ac0315937a1e4076969a05759ca50ea34924acc1beed1e4050b9bd220f9397c81da1e5d143c54d777a55aadd1aae2bbae845bb83885958f35392bd14209358199f51767ac64135239431bd80d295f2eaaf7b93c4d51777dfaa80d9444bace3988bb4808c22611659e672dbca782db45868b93997d6f58fde43298a8e97d1ae83d1375e22e5b3a4de39a51883832a4284e1b5b2eadc9e470608ac1764426144ede6cd430b9d03f635edbb670e0802733813dc374b16da608a1a4d7a30d8702ec9b72a55dbd178ef7fe7d9ed533203ae6c4dd4ff51012bedcc5204d6101cf512424e6c2ebe48b06b376956b789ad64177d17489953b1714d1c76e0eb43b8d889c132193bd273ba91829463b515b31f3d1dc0e713273fa8326a00f8485c066dd35883705e20c19b9b626e4f1013d04bf6da8f71fd2a1bc098b87f19026d8b598bda331edd7123318cb0b8b6de7d27476aaa9b1b312d6f0e11822de0b2e55d20864e1e49f2d47b5c4da97ce6680de75de29a63c3c20ed079dda6c02e3b7e8ac43322aa3ba85e339171cc33387f9e104ec4dec1f910d3745eb7639be54d6c78072029151d4d3f08e14a60511c5a2dda545fa0f38bf13525f860d3d3326218ffb7408fb147ddac2e050f", "", 0, 919815237, "58babda91ed5ac352c84bde2ef2daf5d29cf06b398f355771c7326bd07a84711"], - ["030000807082c40304af88a3bf6f756db4dd0ea994c4ef3ba1673c52d744c6fd5b73a6605c0ff4091901000000026a533e79da75334dddda5297f30b232e820f081ab74b76dd6a6ba95631e78a0f4afac670523400000000055265ac5351ffffffff3835b43fccef3a2f1517d227a851de41d8fca535c356e1ae5c270257b0d16f790300000000ffffffffe979d937fd09a3e55f65fce4f45574c442a285554e728ddb517738a0301568fa030000000165910e66c504bee1be02000000000500510052ac60357f0300000000046a6365658e52540500000000086363006300510053076fa2050000000002536346ef3401000000000100000000000000000252e701000000006ed46c835c82ee6578147d175ae75d368e7c80ff380fb892c40785dc743a399dea75bdfb4ad912ad8b7f58b38d9683de7e4fc64c58fc6c3d73eb8093a3b4d27fc82030f2cb1d599359fa5842f0c96532cd49d369183dc4e1ebc47775133a4ca200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000734349a289775dca7db00215aaddbaa97b9c6baaf0d5fe7d3740a8979f643f1308ca694c9c2fda2576fd0bf00d34924327a54e696235c4822e2c102592073473f1e6b5052b047430b770572eb42616c7f9d040bb6aea7d7edc28a357867972c0cd97e423aceda359030379abcb60e0042c164f2e231d4fa5f490b4eff2596126021555be2fb944608752f88588984ff75284997af13102483c1a9768c1e13bef67031a5f3fefb7e1cc145d649e70457948e2cc32b5cffe00e66bee7f3d0fc69088e60a028ee997d6cef9489c3d3d9199cc0ceea77ca4063529d7feb32fc9c5a676e64da2507c8e520ca444f00d6229e5cf2db9eea015f78893f3c89b1b043f1c4d71c4031fd2c7bc5f9f22582f7809b2d89548e73479f90b836d6a39da0a35a0d19ccb16022b8e6179682ba438d7ab3e66aee11bd60dcb2b65386c226e66560221cadd3d660215abe1fd70ffe40c0681209a393fcb04b3c15916a84734acbb5fe3e6326940e1032d214751af8675c9d0467a59a1ea42dd6eea93f1b6b9ffe951b54e4248bd065f020f91127111d22438b24f0629fcb93a464310fecd6a853c1798c2d6d42b17fe8d2c99f6fe71ee1561a94ce3815bc9c25f144376d0f3e0e615296d0ba1063bf6b0a8f6d6437db1dca55ed56a3d88a6505160be7d4513913d447708c55a7fe47bc8e3370a8cc5887d21029b2c99c7c41445b0d087303707ce223cb47d95e4555845b3a69ebe042beed117953ab463fb43fe2a11959009754fcb028dd1da34bc17bed49a2924496190f1f8f3bfd70a2d3626b3b8ea1def284952d27a2f6146405d549813d8af06ae2a65b38e2c86f91dbba7a2b83a33e59853b2e243763bf00505228f5e04660714cb00f1cac0e925a15cb2579caf023d5ae30a78a86eedc49fc6665849ec81b2de7a1a477929c289619ffffaabb057eb90ca006fbf6816a88c0c4ff774838bf0911ede542c10f939f8d0c1de1414df4f45f9e1ed971c5b4b878a6281f57d6cefb255f0b8ea081d5fd5825891eed4899c1d90560eb4c0aa39308de3fd13fe9f546935e2580286e8d6af18f31f208d6daa35edfad038c98e5745dd1b1267e67326d22d79e9c5c58d3c8b5a09cd1b18a4ddccc399db3a56f7d9d1fea36023e8fcad75e77067a60622293b3b41abc4e30bb58384aca025f0059ed24314a89b519c4fbf3079b1d69550cbe9dcf61863e7c3fbd685602066ee98bd78953c52f905323fb538a6e8f2b6716cc7145ddb7b6bf51879fbd852ccbc7bf85e193c86f2a7aa00998228383dba16b68496c6f070f84f09bb493541db1a4cd007fcea71d3384a58e0590fdde2cad768c582808c5548f1bb47af18b260abd6579835b0e38e15e4f75383af5bdc150584a502f0efa2594d530fca2e8bf8d84431c45794e70c9da6e38f6a0f4f51000b73d9e0a64332f2565b09915238f7365c370d3155c473d9773ca1e76c553f825dc1b73f224dfa6ed394d3aea7c9250296b3b4dd8e662f33561778c99dee4d383e7b7eda5e732d1eb1dd0d890ad183912e879bb603810edd0dcfbfa9bfb8fb3bc4211f142eb577752a8ef0b9c6cbdf5859a85480d467964e52366de2caf8981776afd9dd763dcf079f7ca7e13edb1fbe482d4f94268699de9ae4119fc2ff1fe2661c855df82c7dd6c8ecc0026a54e6feb6a31a3be423cbbf37a296a22d11b045a2f86db03344789fb5230e7b056e80869a6d3ad5524bf5ba49c029fdca47847aa3aea1e3c22857e715b36554ad453e6824a16e8783629b68480175f87b25631ef8993cbd7fc94f54b99692aeaeb1f9515b175e893203011280a36a8e6fca711b4ec20a67d46f7776cd5a85c03ba45230a754824769b17128b3522cd3bdb4e28a9a259a8becf5a0473d0beab1fdc69c38f210c846de202e0b087b7b7980302e5157a57ee0cb1e11b9d6cce51cff68a7857dfe2e943df13f14f27c7d552230092c482cc357d637812a7ccaadd3cb562a24e831c9e6764160fbe90e01e2abc81c8fd3724e4096009b9fabfbc94bbf84f0112d2c2af5c6c66fa106cbc11c3820e77673fefdfb00153ed6c00ed26c1f340337f380d1ff95a24d939527e38107562c8ed0cd0dfe5e5abadb6e051eae3bf6b07d47b81f618d9a757f05d6482b2817c7caf421a3dce7db93af5939810bdec0beb2242a82e85f8e0edc67e227c737200647f3584062a84b2420aa7b92ed1340f1bd1be7d417fd207f428252901229a0f4c18f8a75022eea4f09500a3a78598d07dcaf93cd3ed586082ce59352facdc69fc9c283f1123ab8161e52250e6d1852e0736242b8ace456653e0410300a4b1034f3d170ad79f75aa313b0f1f0f43538fb1a1c72546192d8b464746734d613541980fac89cc74ac8a76bb6862a2ffcd9983e4ec013b26053385c72e3823a7056dfccf0f6744df3040c", "ac515152516a5353", 1, 353428099, "f540cf41ff94668294b4da8981731a33361a728cb360621aa06354233cbdbd7f"], - ["e8c993070407dfbe4d7f7e92a717ad7d8dd285acddedab1e53fc11a773175da239d229c57202000000076aac6363ac63655e54572bd96832be268bf16629d245947903e14911e5db8421715e6805e997dee0be2d7a000000000965005363acacac53acffffffff7cfda185f12337c95a0cdf875a57f51fcf5a3423898aad37e42902bb6fc6a9e6010000000251acffffffffb734f1e151aa911f040119e41a5bc746c2e114c677b74f2903eee3841abfb01700000000096a00630051ac5200652961e4fa020be4f80200000000025153903f8e010000000002636a30fedab200", "5353006553", 3, 875597649, "587d62dbca76c1f7fb8b1a88c0a2db6cae269a89cc29584054360c07b1c6f328"], - ["030000807082c40302e02d81148afb02e30a918859f090b41661a9cee31c34f0bba08249449e22587d000000000963650053ac6a6a53acffffffff62d83727314b621753d79266bc42d449ddea0867c3633fd0320ec848c3e2c0ce03000000026a6a1d1b8cb00452ac4c03000000000500655352ac74651c0500000000046a6552524424f3050000000007ac5365636552005c96460500000000045100ac51000000000000000003e76ad804000000000000000000000000c01f6cca7245e5c499a92bacfe7a5b48280ab8542f6bce9ff8db1289a73bd5ef3da0118eeca5152b7a90688689ddc38cc2c733005bef8da91488562fda0b0e377c075cf1710606d6afbb6e37ac93f501a8e91519c580e555367b51b7cfe6c26a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ddffd079bd715556b4e7c54ebabebb62117c480ce5e7e87027af7a17b70ec00270176c99a66bade23a6f42645aa12c73651dc8666a9ac9eb7a47e532ff4dc89117c7b49cf30218963d37d957f965a7b3962232144b3982f80908fbed11c1d7019a3ea954c3195cb5c9753e93d0a7f56eacb2c7b3eb10090f76296b3751ae61450225debd1e45b9fee3ba0c2e51928197b08231ce560a98dd48729f51de3e1773c50305f60e6e9b02595c8f814e724ccf190956700af40a1208a244612a1526b4dd730b044c3f419c0ba3124ded21b51a953d87109ae3bdbec2e648beb7f9b4ca030f6997d0ed28d4e134dd59712bebc5b7e198a55a9479e590bc08f5805de90f5df92e022ff74789cbf8838d056a20f027203f9ae39855f6fd3e4192a9bed5f827af4e9e022bc89c0a4877b3cabab14e3b018c92ffdb6fa0e39ee219782e0e7ee038da78880202be3d2bb9ac33562221dd925a8f6ec6bf4d7d45d12c173644bfc40f9e9fc9bf0222317d43f983da7a0434dfcaf3e76d7cc436f89f5c55de2e75d9325cbfff9a520212bdc00043b8b957b6cabea08d3d76d2b053c4b0fa7b649efb31aa5d6980a37aa01862895500893fa7a5ece2a79f4de95df764376da7ba1ec835f71ee4f0c41cbf008a96fc8c30907df055e7d0a6c2ec46f9509454fbd73fb9d20ba745f420c7f0390bfcf6a70a5039150c113e1e92329b1866fd2872852485c327b1aee02924ecbe037c52437db368ac588aaf3ce4d43619affbb65c52ab5c05000343ba308d0b870cd0e8e9fb8c622e7c381ae3c21cf42288c358273ad3bb319613c6433ce9ad120a78882e116ab994ff5fbd82dba467049920f16bd1182dfc690da06a474686195cb00d12a77d3c86622210ab2ff53eb29c6a1b7a9ca86cfb671424c48964774e9137d5733d9fadf9ae509a09099370c1d42094c47a32ef3958fc821ad427cfc0b897804036c109f78be3e53f58320b46e76383dbfd32d806efb48c26f8f3f3147076ac1ed40946546b3a90a3bef06eff681ebb2a71ddf667382ae41eea4e6adb20dd8823d3ba4f5885e46a300a020a6dd42bceed4dfc1666ab12a3807f34f1d4f1ad0aa26fa230685b0141b0fdf09e8f2dda475d1c0c64dfbe03ad46bad665efeabd0e51bb93ca409908cec097022948efc9badcc1fc76882b3a3f8349f82189af104a0a8ad938441777eed9bb595356c4ec61d0e6bada306a5ba1a603fc99fc818eaa61612e99927a913a94b34619f7f88d037ef13e1a7aa8a6844b06ba1d1ee617f3a0aa62e947f13d6ccffc9676137ad1a45a971bdc2b60cf6fae11b45ec01c5f329f5b3f03df10f8327dad397b28b20446599a1474b56a6cbbc747bfba9f99bac7e84415b2069752ed0809f3645097e3ac91cf129a5d1efae8bad3c786f9794cedc6c81f4e08dd45d4858518c777f25bd73c8de7810c6197f14d1466974252af003c21eb2c46fc1f1d8e508835fefbead14af8185f2c6d49167bc65bc9e0b50efdf8a7aad60802152a7615e95c1d2ee0fa557950d33d2c945cdd49d21a9f099bb3bb2940a5b847a37f216856205b707159d75fcb9090bfc0f8d17dc97481e2cb7fbb668e0df3cc1f93ef959d8e2869f67d73de0e3cadca49e941ac14f17676917b264a10f5cdce2996a95d8341b5c1bf16dd94c27e71012a256af19c9c5c88524cc3aee6e13f791d0103692d5cc028977abfea1ad4299a10ba3ccd906a27ce9e31626ad09066193facee533530d4973e76529c7a98e0eeeb7dfd27b3e4ca4245bd1a1ffb11a5c0a03954e8859e8119f3407f620b351e4ec5c750252e8f8d31daa889374b066c9fa94dcb71716962bed1a2b1fea4ea689356585b044a5440901bd6a45961cbaf36242f2cb30086965051a5918d098b7ca776fe8d020d2314b5829da71eb61f383968fc18faab4951f2bd807f775a81e6e02bd84b244e8ef8fbea9400ec29313eb785ab1e665143249932d8c11886acc7e8d61cf7ccd5ee0413e1df94739c18b2d1e2e65aca512719a40ee6c35e2560ba297c8e7dae9349bcda04bdf70730686b3671c48afad82388117d69d42d5d0baeacbdafae7a73696bae065eb5b20f15d5fb720b300e625ebc8ead248b49ea97758fdf65989e1e3b202df15075b41fecec36d7c0dafc932b5e7b3fb49c171ea8e588154d04477e64c3735649a3425fdbe3eddc83f1edc74191a338edda84cc4708bf20f6674d1f288bbbbb11299388b4b35f173d4339a83be7a42334159904008e5549c3d5f823f5b92e158d8434f21146e67f73cae7fddef9afdeea050000000000000000000000001fca4c1799e4e91d3f8992c4c45e11fe8cf8b5429b39177b885bffee3300163a3348a8556b4892e9587eee45eb2b553ad8a9250443c1c4a11fd3d120ff1aaaeb95b6393d51bebc647ce90a27a0584bda2fa4340f30632d4400ef7e6c8f04da6d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000df915db5d594d68d883d658f5cc5640bb9628cc01e46b78a973fd3709a7e3f858033cba0c03def2948028c327dd19f9424c82f06107f14f13f5119b13891c2fd77f39961746ed0b512f149276d96c9abaffda56f6929b5bf7214f2cc50cca22867ba8b917bbab34f6cb8866b5a7a4fdba386eb6529f89559ac9566adb636760a031a30d817222fb00e9d79794c0902ef71de1767ebeb1e4e32ffb1873be9de8a5b0217b52e3af8792ca362b838d48c8dfb81bbb4a33d5729bc0033a33848408edc2a0a0454876fd9dcb5cdd0234e01afdcf68c7c371ee00038506dc0ccdd20358322fe11ffe18e8bf34ca0d520b27d79227ef4745b656a546aa0d25e9b38141ec6a26f02000f82a7d7c2e5334f2da9e4ab33da7b73143ab649b62ceaf92484db0840387d0305123bdad1c1a4853caaa42b23e5ee99fd77b187cee557ea330f37593b32c9ff0325e5e653f7a63fe47558a5ef1c255b5a1d392345b632ac9375ff2b5b1bcccd45022f512b3e68cf2269cf7983d188d95b404681e18d1a3b402699df24039b604e2f03080c306455be9466c12103eacb0efd009965f2cbf9dcaeba2c6f7b8dcbd8a0a4accddbcdb78e3e2be82bb87aa49f6225b8a387b141541b20f56c669cdbb62aafa987afad093a09e39a16d3ad69c1737cb4369958703a4a222f00556a712fe10d1a2d93d4240bc41328d924bb1aefb81de1eaedb9496a00fd7ec8d3371218b65777f49fbb347c807ff3413460ef474f6a1070b5aad8642ac76a1d1967a904ef6214615fda1036ea99c84133d21295efe19d51eb46ba0ca65d6b0c8877addb507ac981aaec3ca1912da209cb4347276104be5cf2a528499864239c103b161c1b82df37e09af4df06b84364740e209f6ed90c09c32299b5393b1a88493733ef32543db6ef42c127e52cb07d47b373461a4b31031a1482ab7264fcf41021165d5456340febf70097b388ff5c96f580a5c1105fbf0b8808b1a7fca77f655e5ade9bd4b2dad418e869d0b59148623615744426a511b7c04db3217144438bbffa3c39bf6354780445f1a4c91e007baf1824fcf584eda4dfc3d77ef1da1ee03aa5bc04894a781ec6ea1fe910e3f94af1e976070b2726ff4a369f7b76f1c7f9245397827e02939c056ea7d8769fe37d8f4b9e62f673d2bb703263fa2ed59027fbfab4bc47bf76635262bbefc91b1731061f7edea7a1927ee6211028f545d41c9981f9407dcb3e54122c7e78ce342270f35ac00550c2aec034716bbbcb0c3b30a81002a5ad3aaf2d2ccbf85976df6dfce2ce16603afb58d01f794be323d1d6251a0db9eac9e921d4329c5f8ff3d4ee420e3f3a9ffc879806a2c508de81cb6fbc1005379b8c703db48651834cbbdc208014cfdaa6aad05b5a2e8da8edd2f370d55674db62aaf8495f6e75a7d187fc5b3ed1978f300728724895515173dbd2a1c6f3d4475217f61fa5ccc6cc6588695af18e2e03151a60425f2cfac449dd4d337d7b289e707745f36e3179dab25fefde39fcfe691c1fd5cf6f0d48607e7c87040e8e47f91a5f034690772ff5021cb835c53b612157ba6993973020457f48054ceee5e9f4b08561340c5671c0c5b6c2509606d93cc2e1354d5b673ba8853c2c40b27713a7359a6861965b31bb01b6cdeb2c2c1c56b510a5baa175cb6cf69b88b07f84e988024dfe9bb549fa961c70ab1502985a0825260f5753f6dee70320277ea08bf18e6e232dec08966c834ced61ae0031fcd02e822626d30729ef273808682135b48bc2e89eba662dcbb38cf8399eb68ca82f6a306f91aca60f2ca779d79f2130d9c80472ee7a5b208277c744a6afebd49100769dbb45b54b6895e3b3214139ca297272fc073f9263ea99b8bb07267073068eca676a8bd3d8679f6237694e1f771bf54ab7ff43e82350d036507782fb1ecf998f7350621f885a867361a0514033b83dce61f7a046c970676436b7cf84f4a81479a122061147c1362ab897bb31aba3034833fd214434b542aa9df889e574599d2993d791d8382fc7db4c5056c50d6627484d2b588f1ee4f635463ffe80096b4c3b5aa2e1ebe314b77333ef37a2e179462453b76a16c67f026ec28d178dd988c6050135fc0575165703db2a6fd1c48d7c7603e60983ccdeae437ebca6adda59b8dd8ba8ebadfd9ccb4536b990f3603b70b3f5cf06a78c4092182a8576f1926f5530cc3e636ec0f48877e6ee1168a5f6c78ad5d88b0b0102d774a7b7222fe9e89ede12d33890ad61f71b21c26fb63cb57850ae71649af553d6b05346afd9b483283e34c3cc0000000000000000f8421a01000000004b4956283215106d8d189d2a38f4b428c8265ce665f29161cb0cc197ac264e0992f299ad13652a3546a63b4f5566307462bc71a4d9f223519d4cc6bdb85a364c6769699854806ae710aee708c102372af32f9e6d16a2075aaa56364ba9d5a51700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ed83a60816c298aaf0a0bbd71421b9f36ba26f04e62a5ba209fc2f7dd9c03dd7d1e22c48911c56af339f24edc9d08d6294ccd1f92760738dea994f3e75f423b22a5c5b518f4b3c5de5c54894ba8799dc53079969a09389fc1394e7a2c5530e1d4c537dc3a74311eecd0b813aff737d00f89f18edd706f160468a88ae98fbc008021b7fddd917a1e9f9c203927c3f20cca87c9a3a790c18c1779d74015a9cd50f8e03037de58ea7eaf610dbf4924083ca8e4b3d24acf2a22031c1f58b9f515595a3680b041181dcd5acf5f93344e76f6f8bc6d62f351b2240d84b20a69c6e57c05a46d9a926cebb7b78b9c55acacb35e12ff4b3d1ddf384be4db657ebdfd9b78af1d1b803147767c6d4adbf59af0619f7ebf4b00219714f9fadc40e302ed53dc7defc4a94021506c77cfe8b02bc3de4e35b71841eec5606707888c1d6117ad94c966d35a4da021ddb185d42f993806567fbac057481b1db12d2d1a2cbce1d21319ee6f511c60303180ff9fe20cbefe8c6f26075431b2ad023d415fe79f955dff5a2cc769e7e169603125b15d6be454718083a084041346dcdb83d70970b4fb8204e757b3110cef4b942896c2dc67b4185d256e3ceeb83a4dc902c9f124eb29b9159b75851f152bcb2ba989c380d0f1ed91d5e1f4b4d64dcc28b86f239d50d84da2c0b977ee64e0800caf28e243317b1b6be58064296ca8c89212a5da619c076407248870c519ad214c60e0fcc509a31269712307749971301142aa98fc18e7a2e28aa7ca17961cb97a97ae4d7cdb8ea73dd7a8870f24efa2efefe15f8bd9b2353dfbc3f90f4fc02f90deeef1a26ac37e168141d9a1beec0d19f8822c4fdd327c70fb20fef0afd8bdc366655e2ff72f056f8d08e7e759428a4a9071668d1bc848709d0086999f70b956ebf66408b8787d78ae1e9bfb6713264c14bbd5c3f1b21152238be6c1bd90293ad614f2da2f79456e7d99ba6c9fef78b72388d960a40efc93279364f028c9d9f92e978ae8831b3540c9d44bbb50caf776370dbb36c491600ea5b83685e6ba0eac1cf4a2b8df5d6f17aabd31c4f29c70e89a843f23215769e36346cf832d1baddc36ca32d84ea6e6072b861b48d0ec06f412d074c9be3c17de000ac286e312401bacbdddb2d3643b08a1bbffb2f8b25a1138d4c1b5e69e9d96f1c5b75fa6e6831d559ae509cab6cdf12dad096766e0f527bb39c5295156e629f3f66d070b3f58ad2448a04cb83c3d5db2c82d0be605a6dc5e49aba8aea4d7c0ad1aa0f2ff427bf5c4bd6cd32151f6b2531fd4cf94ac533df94b84f4139e45fda1675c107ef31f032c1d025af9356cb9ab70e1be177ce4c5a5b54ba7f3346479b985af554928d95dac5fc973a2ba9297eed4562686b9916d6d3945cb120187b2e0a849e7bacf8cf197d038b9d6c5b9dcaa8590d8ab04e82315273b887b20fb28807a9e1e8b986be749eebf158ecbdbcdf9b8c1885973d8b2a131039863c4d971ef921294330906b57e5ba0b1bcbc90969438047dae3ac246ceba6aaea8fdd89be9ddd9a3db23f5b9232ce4d9c1759102feddf4c505b220a773d7f3305d2d6666021e37ffb768e08b2a46ca6717fb981637fdac04cf76a52c57b01a53b602ac4f105f50afe95a5fe79d21fee1a76e3b3cd641790d26b6adf4248a85ad4d95cbea37b438170b5c34c8e97104109944cc273f4a08001b026ba60d413790f5607cfeb8662c2ca2c002d51c9107ac4ba0e5a45441b47905d163e2367958fa7a3f98f712554a98bf301ddfa555b0dabb52c754d0c4014e221426d96c0e1a1610250f265646dd9334f679eeb4d5e72d850988b7864185089f6dbffdc3ebd65c6c02db41dbb1f9682e5727c061ec8940d355ae7dde32217f2e3b8ada540428b79bf14b1bd95896ec77767ffb56f7b43505c4b7c4a71fe26b0d954d5d10b028c1a67406369e8b738f4cbdc4d8c5ce53b58e8c7dce46df02203a7989fa4b28ac3b4295828646f06516b8129742637cf63492f7f89dd3390c91001aee425f96632a7b3458934c9a58548d4b72f397c9fbe231ce258b4dc333343c79e943ca2681971481b5815654ed8e44bd3ed5f8e2a0d572bc290743c26d111a4ceaa1bb0ba9856cba4980ad47bbf6d651f58fd1062fd8aa3259759373f9978ec20bc0cfb3b9393394fe0387021a57f1cf2821532cf214c727b4aef262c984ecd45da7ad3f8289580f0dafc5bc3b33129ba88995e0f7fc8541105b21ee5e79d92c3658ae385d2b66944e42e0a2d15e945ae5c90f947331357c44c5cc44390f17e688dba641d6a69c612171194c66d20f120dfb7be37746c9b5145e048b50947adc047adc7ad102e1e205098c113d0f5a2b87e5a04d7ca1b9da1904475731a1ae012ffaab49a138ea2c9e5c365f743e5e55fcc71f7c7a8ea2c8d0d606ca4bd617d9641ef04", "6a51ac00", 1, 432803785, "a525728918dd2db1e8c1cc328ab4f5c859b1c65a2e5bc8fd04f7936699271999"], - ["030000807082c40301bef3f6cb4bffb205ef3638cbd40fe4efb6d9111a422edf4389151486d59d08000000000004536a6aac682b822402fc312a0300000000004d59a3040000000009ac00656a526565526363fb0c63a02fffcc0200000000000000002360b80200000000dce39302fa687c1005e06113ee6df2572ee173018cb669cc1cb562f33911182f6bd642947f9109c8de33b0cfc250badf11e4caea9e53943f0db7c12d6e81d34efa2b6ce0bd791b5db9e7f6fe4bf030f7e184221aad74e877bc6a0c5e442276330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040ef35629fafa9765f177bca64dbcc55e5a6efcb971994d441080d4fcb3fe6eaf77432887b260c047a1dd077be34137107f00c51dee464dc87c9e04caf6edd56b0fe3300b53f858b09885368c974f2ab2f8218153caee37202a9a30ca755e9f6fdc6cf86d275f0cfe975c23c6b0b7700f3888eb877232a3ea24326ad16ea23d50325121f8dcbf3585c53134b8de8bc6510e0d9562ac12994d5e07fd31c9b4edf990215d977e61dd28a2f38efac90ef101975d48f7ab5e711d196e34656c24cec8e710b0710e8d41fc6ee4cfe7201251f6652de7f04c59a71e631527121089beae2b00736771d9907128c02db2d9f8b0d9f5d752fb9a2a4944587e606e16ef0b472f4c80222a3c440543620073337067c4ddf9c4149d7807f56f54e68a08e58bbae5c232f020ab86e356f76b092e7be92fa22354644840b9aeb89bc42b04badb6dfbb1bcb41020a600242424bd029538cdb1f3db432327e234e3784bbad07ee4f0df6f2349b9b020d208bf7cb9f2b1663bb3f1f387395bbb30137cc3cf51fdf946f11cfe6585984022ffb74c1d3b708bbdc6fc8de913f9701cd7bdc1c325db403a3461c5248bd8c367f715e98e3a14387905b336982af401b4c296701da224df76e337a1cbd7d393f4c0d1c0c570c645ad88f9f9d77806bfb50480df053e66d0d01ae1c4bbbfdc840d5a052c1d92b3610e297464db0e2fb25f362813e65989df7c340b33b5e38d841cd6a4b0ed56b5eaf88a6d0801172ead9af9ff59e36b9f5ca0240a79c3a92b0333300591a75ae83b91da2fd266d0d1a9b0e5a13f675b30922b4c6188b93ffedf7ed3dd8087541890aa343faf47e403f630fec12b8211c11db478f356296da63321ca26aac4c0304433359c68506926da50188dafdf0b2f8576e1016350d066e1b056775f87adaf5e6ff8296d785115317e137678f03c96c6a2dc2b8e14a270db368ec8a3e9529a47a4de0e12aae22cdbc45cc17b7c3324316dd05d7e764e1b8960e9c5db54095a79e0eb5c62cb29cc7b2e826eded9c3c1600d48995023d12228684586ee2592106d7d6b99ef482693b9c02a8d6947d31de03f20e2c08300158be726ace77c62a110654d055efca95e543f30bd0631962d92288a99da082b84810aca650809b90429ab0f302fc10adaebbb708dc349746aa24cc20e5c451ada5d4bb3cf3fc7230cf6867f7e187281943be036b58571a4a70bcdffab3d155d44760cc7d623498b121263ed11728f6da5efc5618848c907ab7d1ee5ca9f7b84fa663d73cee64ba9ba35509ecf5c9d6dc316c14015fffbece7448820f31678b7196cab7221bb1e2023c6c4aec0cb261702f0686037141bdc645a784cce2e7cdbc0d65807a47bc462654249ab646ebdab2c61908d9e3966ab51b276bf6ba18db42db3b4768fe27389500a89a08f105e898e3b4d276763785daa6c57fd967edd306104a121a5065b45ea7608fa6de334fb6cc0d57710b9e0dd1d49cda3291620cd5cd4727f72832d1cfc3088162575716df524b3457adf06e867a7e563b1f2c80e3ce32e66ea30fc7094f79cafb7695afa6e4ad287ab222b8de2bdc4becfaf0de5ea7a88576b958f77bd826263a124daaa8f82bfb2f2c214cc80cfc5a6f0bf7f65ba062756343c526d1149d194e40f30e7f508dddcb490b8673ce61461c0771366b028d74fdba4303ab872548db5a23efb02721dcbdebdf029d22737afcc56f248b6a479341be43c2c877554f8889a0cc65cb140140033ee1d3d7d6fa86335f5d911d07d1d4b5a9282c9494dd29504cf0f87a053f31052b9b74bf73aed835bc3e61851ec6932542100eebbd797f395216ca6b7e32f8245d39732b51f625970df8282b05681e308392d2e506a1aff6aedd5fcb100a17807faff1b3d695cc965e7837b21b2f88b009b2d0fceb61a4d825346ea0819d51d0957532e95d73455b6a66d8a7a859cb3229ce98f8190cafbfe3359650453468790444ced0b0030c522daefad63bac9d6fc93da6a477dda2a8c64b766979dbcff751b895aff96b0eff0efe68a7c5af4bae3a54aa1b8f36f2b5a0e15e5a0b88a8154181ee9b99ecc021615c161dd425dddc7a6ee3b44176228c502595d2d13bbd100e1f46081671927076fc5d8064e44bf25148aa0b421fec7a2b481b0513dd18f115b4f96e345fde64938cbd1f240589bf4c3e278eaa4fcb7170f37c81ce66de79c978aef37f759fdebc24c252881b045c2671481cef2df359f1b93671abe3a9d6f9ce83df9d0130146699646afd7d6fedb8a531c85de7b4e1d4daf11b09dd2286950300000000000000000000000000be359d841ea0bbf8cb1946e02afd897615e8e30777b25edffef0ee8acb28eeea56c1787868676df0b20f035e7663151d2562b7989b811953f8c5f12106ecda7c32752e9f96a9efb9940358e8a545bace19cd45d75ed68bc86861b6be9b670392000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e5df8ba42e03011252f7d04c153ccd8e709dc4756719a449d086ecd9c378b9359806fafcc4e3da711f71cf4d2c2006dd2588401ee492d372a63f08026fcafcd73e83abb3ad4494161afe0f8a4df9e6fb9add0df3288986e366c49eacf252d80ac5838a07d35c4166a6c13fab24e7a19a41537a5b6c199dbfdd3bea02f7e07280203fde1316a33c189534c12f45f1cb32b9a3a7bd6f81cc1bcfaaddbafba91d31403124f474af1e2c772205ec1c910c071a376fae971552abfa915e2f47010f5c0820b07705fca88955cb93db4ce8787304add35b464919bf2e63750525ff6cd060e2a9a739dfe86af0d4a8c45150a663208578ffbc2a91bad7bb2116268efb7ea8dab0323195f49ab3deda200fea8bb0b1f3274cb11cbcada0752ff7fd6bec59d4a638e02120e168cded99c21b08337dda0e3645dd8493aa617bbb97e70adf1fe310409d30228516410dce030b6b02c8ee2e6f982ab8d273fefba26b6afe8f3ad2fbf2b483702281ed896d04ab338a906e1314f1bebc26d5bcd7e76c1a2ff677bfd43c717306e03254be7c6c9fe667c30a44ce8eea6571f391208492e25aa7d9fa5c2455b332ae33616c9350665fc9e6de065e2ddda104d66ef69d72385f54ef3180b4e255f2822d3da967701b00f05293b57fd3d58ac51540c60f9c92937b737c4642e269a1803db2bb56243c83a1949dc30dffca0f457aecff32ce03416c7054e2338718a9d7deb24ca136caa1693f149d1845e140d410e77c5cb7d5e85ca4d2c6a2118d52a6f667a6efc637623e873576d50a0cc4d6f1088e59cdcee609ab0c25ebb3accf195676b1522b735df8f94a22ae5063aa34fa4d05dd9e946af09adee08dea0810bdc61be494e874cad58e59a3c4a641eb4f16a65d5868db2deda9714ca7fb20e1846d7b6d1769f8bcc2667e9a8ddd24fe6a921850d497e584a9fac0085386b33c4d126ccdbf28bd4238ac3ebe7c2f2afaedeb100dab510488a22b9963195aee3fa195b81c2b8699befa4046954842cd9adb3437329490232f7d3583b2bff97d47d257560d48aba2e2bc774993d9cd2a7be3fc1dbbcf10dd9452bd641812989aa8bd88f8c4957e84fb81d332660d18aeefb5b2212b5df4a7c5b6062ee281467d726dfed8e5f856c6947b0c5fff7e11cd75816164800be1f000da8afc406ddbecb753f62b7ede0bb89f143bac609a1a11366f20ad8b46bd387f2f7a9349a70869502261b08f6d9acfce7a1449943665d3d6beb5fe88491aacf50c2c6577658809a72f3a8b1f27db4907905b223270ac53bc1106f29c9e9fcd1764d3c2eaec038bf6aa5c42f982b6ca4f2de92ecd5a32369fc145f503bd5266525f30caa2cc42ba654c5248f33f26467ed284efaa174482f917fa8d1e0060316876a540ce55f5f0493be6ef7d635d934415c88fbe446e925305717df3b48738effb22a300dc8a2b80176f9859b71f854ee47f59e95ea361237aba333eb873fdf8125eb23f5ba2a93eba0f315bb87216b0569adca2f350ac48de5781e99ffdca919ca2a04bafd97ba4fc393a565b41db17edf187ac43051d587568743594a2f4b304c8e40970c771743df7046523a2bc287ea2f6d0c05f0e94172483888e66becb414249b07a81adce233916bcc07bfa6f35cbf8851c43d5555a20b6b2d9767fdc6dfc2d0d6792e67a770d65d3fadb55a0b5147bdf2bfbdafe53768ee4fe94bf8a0eeab6cbbf727024bed169aa6c7ef93f5746bf98435656e9d8b744acf279616926327fd2ee5512f1f60a62390220306e9b5f0211ba85dfd83b6fa5fd1082240ee7912b78088ae65e819f408ffcd0ba0e9d2eba89ae014f8af24ff82c69eb8d363b65b039e7ea6299ef97118dd76b3b0fcbf6378f528672b4ddcf1d78558032fafb4bfbb84d45106f7d6a940d1c4e57b6268f66a1bd2297ddb088d96cf6879f6aa30f2d4c40c07990b99b9fefe96b0bd0ffc1d40cdcedf22c9e593e05d3c1750c95b44bed4094a987f4b7fa9f4e211abb4b812b832c090138857f2ae0b68c60849c870f55b571df5d586f019b22a03b683f0d0dd51780249793c2662ef27d78e14d06d64837bfa2bcab6aea7010b41108151affd5d09fee03d73bcf6e8b0902cf6f954150a8994dba804a21d472c94c0678270d6dcaae0b87a56a54db14fec73ebee451f456c5dd7251022e45b248062f6d279737684e463a5114df68ce80196d03fb25483ee6112ae6a9d547fcd7f8e89b99a9d287f6fc767618629a0f5b1515aa995e5e1d8969cea5672508b27eb5e695171aaa7eb5caaa5771cbf1de5f1680a5d0bf291caf696fede4880da6887de83ab370d951251a3a230b16c3cade752cf6f6fb6fc92b31ee0188008337ea7f3d3567bba7a46236859e25501cb8f996843b3cf39fda8a730e971e2fb2e890ade2db994d3f8e3e7d272c07001", "6553525251acac6365", 0, 222134588, "8ba1072f592bf9ed37494e4006c2d0b9b793d371b0f2938a1d358be526544463"], - ["030000807082c40303d6401cd2da461d86db5e5e5efa571218982b0a78b04e9f71f33db43ec5d236dc0000000005655263636affffffff9d32bc6b4909e9cad84035855266ceffdc4eecd9cdb01c4f1e754f481259e905020000000163807a27b19a02acaf8f17ab1753ae6174a3570a2ac44b2f925170674d01edcefad039268c0200000002516ac24a1cbc020ba37d0000000000026a0002aee105000000000163000000000000000001f7854d02000000000000000000000000c9393bdcf55c9fe0eef982810ae37a1434dadb2a23690b6fb8a490a644eb90272bbd0553cfde0c9a8837b463f4e114a80af0736e859c0c24b49d9b6b2a398bcf4296cb597174f633a1e422d86240610410b3559046775f919dfa1402bdb600c20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082190d92bcb2fa59921800c44a1c55726a03a2438ac2b132563be4f581aa3447f18b6f2ea24b0bab8619e28796260f19014668afd586a52b757d2489151a5eb5ea339c532fd349bfb666a198726c9c8ba1a98b027f048ef7973d7e6af9bb6c741283ed80f41d0b8b880c7046d5f9b921679db1cfc15d39e606e63906f909ea210301b6e403815cb8b649959860f2a760866c655d23c34790ecd4da8c024843b34f032652cf8c00845f731ff513a8454f17e9506ba666420dd395ce919290669bf7290a04ceb7deacb1c001b65a744d85b48221668d382ef8105e40904f4f43035fc1047e238acfb76e86b03779d16127be40493e973bb2ef6069d8ddcb24489d1fe5da0306c29ae1cac43c1b463ae638002c4b85db2c39e49d8f4de68be1c174c18d8395020a3ca614f3f8b23622125abd5eb668660eeb2e85a1bbeeb76734648c267b56af032f06305dfcd9bdfd52f1d04e47e0d56fe2b1d36df45140f49319f2df507230fa0314a23a48d52f13670953c04219ad09ea6e1a016f4160bd77f4601e2eb85addfb020794df7b8673abbb87eea54f8fbbf392fd54762673ad097ce1ae5b6a0657b1e65d703a7c85ec081c2130c3afa94d92fad83d2d36e6d5e96d3a63508e5301365a9b3a54a0a2c4465425921920b4151543ed16fb92de1b562caf978595b15141a52efa8b701948e6248adbd6a5f8c6fc3749560dd05e4e41d368ed5974cfa7879ba754d43ca3dfda4a9c8eab94fbcb689222cf985fe27841bc53cd591d3f97ca9c238f5fe9a6a6754f1cfa4e2125257858c186ac2f479c416f8fbdfa8914ea61c4252dad00459f9abbb7aa98dad55f0aa3d9b6b54e80c2ffbfa3eae4b27dfe20a1875d365acb4c20dac48a55d535958a53240851f0149635285b8b186a06139e2ff2e83d2a6dc95f6fe9b72c350bf6d5af5537109756826e3ceb31569ab53b78f5f91f7527dd06596df96806a0896d15e6c5d3c2ea7d1d61f3eb77fe24a0bdcea23376c45d6192604b4af4f5176a8aa7ce133914c7d0a61f20482bfc66b0f7dbbb08c6aa0636f36c941b5bfee81e88d7511b393f18cfa27466b7d9e9fb79e072ec979fdd41de84d5444a4845166701c4720c52d4fc589ca7f2c022c6916c1d3f40550d74dc6a75b4bf3e47af5205645ca111de90a7448d705023836553238e376e5ce1cba1143ee8a63817d0d539faea1debfa310ea3f287b09853f7e94e3a0b80577731bcc83637e2f73166e47b343cbdb1e15e87b286eaa776792552eb624335738138c6811faf84c56667f216bfe5322ad47ee421673cce49393d39b4c4463d5a5d48ddeb8ac260b3c67f4a5aaf047de5f602a4880c52f96156ecb201b67c31b193eb367d72b8d496ce9db1fc5af1f8906251f37b1abb254e509bee9b08b675b143305ce33b34c0d3b951443293f12ca5debce649adce261a2e98c0a1ac51029adfc0eb7decdb68f43664ea936e595fbe8df20a96976c20d0b64758a1cc03015a775542317feedf7909711813e91ccf4f845b53b2675137a4d26193ec5dbd1fa9fded0e0098d20e170c840c47cac98ae5134291a8b211b420313457a1e9f48a60055c52ca1af0079f284df67d66798d2df3e090f7fe00e6252ceff2587c787b71f235f7aea968f911203ba2e0fa6258c18af7fac36b7955688733afb56a268faf05afc9854ecc3d27989cfd06aef5ace9f8c5c1600029bc021b34505a1fce99ea0396f7d3b0b77f4940340c3e6d9daf4343013d6892358a564e3cc7a799dfc937c5c954724f6fee214051d0b250b0c08d7ced8215a5bb70207f091986f8eb07dbb27a35dea72eab1094bf1c579a35218b5e0508fc16facb1200d295638b7295068df8c88f9bc2ca377ac4ee4eb86f82c53740aa5df02b5001a7cf7af2af60f3f95bba3d980a9590e34f9dd351f3999a6a943b37d6c6c5191c06fe7e9a03999fff8b29122cef175dca108b1f139335fdb0a85703a267014beb59c048d9e98ba7cb4a56a3513af2737dfcf9c043517eefcdfb2f25fc81db5c491f6cf7ec2242af51ed9523a045ad02c7b6760780a3444325c3aaffe916e7003b51379fec4929f1b21e52735bfa2a51ad2098ff6a37f2a1b9280aa49606553e70014b2eab855a381d3e7b23158d127859d86027cbd20bcbcfce3d23d9230ec7851290698bfae9f062a7f8402d7d087e88dd72d2e529c93f1210e047431a4688536dbabbf9b4a92259a8812f84ef9b5bac7367542ffefe8f34061e41bb568d969acc665882581472af099b4956d59090fab3d564f429498afc1bf05058519299d64e99113a9b03533bfd49f63764ff8d9e5707bab3bf65288a77fafd20a62d53df4b2b7126eba5d916ebe74edc0c7854abd5c953668697f59b5b43c10e38dddccfe504d7792541b862e33844ee5e326b7c054227da0d1bfb6c0a", "5163", 2, -760721532, "9a7c510c8e78872b9d512eecabba48546f9fcf357bc1122d7b3c6ea42ec8e506"], - ["ca313d10015f5be7be7d29951980bb191773e0f42981a82c323a59c9be0df35a337d20337b0000000007510052536a5351ffffffff030f3deb0100000000026aac4329e6040000000007ac536363ac006a352bea0100000000056a53630052110d68af010000000000000000e2333205000000000485ef4993c8bd460a8d706e86dd0fe1eca4b4b8c99553b49a8ca6c744a4907009796fa502df4e9eca731599b6e12066c3d65cd1ee1ef954abe4e7708d7bf3685048c2e545b47cd91ddeebf8442cb40f04dec610781fbe3ecba5564968247e35000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d571067852443f1085081cd793e74d8f036f7b4baea8692130917ce282ea0a36384915a49d957ea26ad7574599c25fd01736667415332857072bad8ae6258ee0e726d1d1a1e6f73cf31c36ac44a41db68b4b4d5636cc07516b8d8fc629d6544dd97cc85508c3a1fad6f0e14bf9b27dbcf912ca30fbd98a6aeb461348047b1ad020e64862a06fd39f1986e236a024b5081ea6a3407969edc11cec89f270b4513b703101da940df20c2daeb6a7bbddb5d8ecf9653a6d28c09dc43726033c9819e82000a015b3bd48c6dfba637ac716ab86e5a5bf0b3b25002b6cc83d5f4c87ccbae355e71341b9ddb72ab219562f8bf688d5b95b0400cc018a4d0bd0e876411129aa2870206f99220618ecfc3aa2ba5a5c11c8e1986bbd9ebf23f4c6f3a58a765f0eef2fa03276d5449faa3baffbf250e02724a0c332c817c3292d907b6e05a25535d5f7c9d021217c2a532de1b1e826634e60955b41aacd0e20a0ee6be8a54e0dab1f35a02a10211ff64c3cab386c38f1687c1b41f9384971e411b0e1157158be8bdc5183e0f12030eb1964a63a71f89859688fc7654e59e735bfe40b8c332505d04ff9590fc831a67dc6c94820ac007079cdae0dc572bc48ac54185060051b6037f3a690200d97cd053d54e85d2252c507e6de89bb08258a0a66f16c35cc2bfd68fc30ec544cbf40073df344e366322072d0931f016615e57d581f95b6efca1f2a2f8e32ecdc3b6fdc777f428cff2c462be0990e26a506bc07392f6aca671cbef279c1558a4aaeb0f79f237f2166c7d09e76dad52a082311769ca534405393c38e96c797c0c503ce9f29c67a5a20f79b24051c92cb8f99330f609b6f06e8cdc57ff26e8bad8b84eaa2cfbb2f23f13cfb2ee60f20d8d4b11708a8cfc7ee25a00812fa132d64d407116769ec71128c48d1a720e7caaaca699f4c87f5383abd5ae4f377153229cccffa4e1a5234ec5480058043b2df7ad6c0c3c7a77933fe926b4ce914c365fcea190be61004bf086c9599b7474d8c1f2b24e66acdf217b76db034a48a4bc8b649fc262c4b367b59dd9269ecfa5a5aae77dc04ddf4e716517a06d02490b7e01d8be53e845bb45e7b1d68302c106a55bd768e7518fcd58d89539dd7d7e434c527962ecf13a92e85e4f4a9ab35563375c85d67ab8ee793f887cab08b9cec1866162fe6e50213b6a8d6507bee28d3a36c1924a66d13dee34749bca1bb74aa9da65f922970b69532755c646113486611d4c10706c7a77fc7088323d34b52bb2ed9e1f1de0e7f2f0c1c3cb03f9e043096579fc3a1bc29c69a6b3e8d5d2c7ec1840933d5aeca06218d58732c356f2eccc74aea315222c8dfcabb8625c08dcdf698ca2faf864b251b80ef3b8e37a5d0a4fda7f15f2a0e6cbe658e186d7b2db1f502acaf1119eaadeaa763cb23670948c54247f6f04780f1df183813092cf7794fa1358424155b57bea0092b638c1d45a4e7bb1e901ebf4d20df7e7007b2e52f42d309bc28e7a43459bbff059bc753576e0061d1cba66fe16d1ed34a0a8ea51e58b9cfd87b889754a43f6d001a65ee8a9e82f1e6f06d0dec763c6e8eb471ef51312001888be1ad6d03422e8ebc79921e04595b0dfa159a21a4c976f6f3f25968b0a66a85cec7f05bff26dcfa2ba1fbdd23768aa27ff57180fa8cc7286f3211ddf11c1a45353f9dbb7acd672197ff9b2f2d89a66f93e79ad44cb3d1a703cbfacd3c8f8ab4dbd5c9bc935315e89ce03529bfaba72c815bf6aeb4b95c32cab901c10243b3500621ffeec4506007b49136dfc2e6859ba406c91950b94c4a4b2594f88c5e2388d48e9a14f2014513a3f3888950011df03edd2dab0c52ef6471ab9fbe1d2163444f8868a829933ace228aca1fcabd092de8de561541a6e74f8204e490dd9d7c3d89cf96571eb4f01e6cee0a75dc96ea81d669dfa6988bf159c4b533cdc8f18e245fb83617d9790eb6c8c47d9825216ad504cfc1902ffd39cad75f16559f65e0d1839d18678f5928acc3e56d0dad41a305dbd9162a0659fe50441ba2d16641ba31825bd918676385a53383178ae41509356c65211c2ad650ad5129a7b834d973fdb59b231952fdd5b271407745436e20b6b39fb178c9492bc0d7da6d03469cbb7684a89129f5dffc9d6b3604ced6f55411355f5428bae35c46cbf164793f30d5f22cf8fe064cc3b78b47dbe3d21c4b4fa8249cf66e2e965f27a3b31ca8077b9bccde89467cb49855f46a6e1ad9f463641bd99b164522c854f967deac2a7130aee02a009b33617a0717c1bae76158d788b791b3a1eb78963d34998a6b5778fd7ccb99439a32d86f4279b2aafedb7cfdd14936ad457baacdcf22547b85567e17cfc09b5a5e087eb41d376c95a06281aaaf66d055f79b520a81fa4aa04ed8d82c71f099d0d0003147f9237e4c94d28ee2151672fa6dd0c", "52ac52", 0, 1091588510, "ef6544dddd52cbccaa8506222be41269dd8588fff2324581a53b8977d921f2e1"], - ["f0d7930e03283c0a6ef110eac61427f66af1dba8566ddab37e5465d30a986c927febb564fd03000000025365914d75d7943e0ba8cc258b47080df6fd82b70b7c123482e76c15275e6c23844848300f99020000000700635100526300acf8d2dc3ecf0125792176812f572ce58fc129d79967dd40384a8fcdb392b6b163b951840200000001acffffffff0369ebad000000000007655300ac5153ac54052300000000000365650070320705000000000952ac6a53ac5200ac510000000002ce8a7c04000000000000000000000000ab7d8586fb3999e5c471638f94d8fbc5ffe15bdaa529a5cdb274ff9fd5d9602be39f796f9169e3b506be134656150ad82950804aded7e2f21b2547bf2b59c964a0f459bf7760ef79814934ccd6dc3fb05c89136510b64e3549cd7fd3191eb7fd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d9837569046388b5fad5c6c63b2d1f5cf59d8cf44804f1e29919688d7ccd79bfe4deb0b4e3e99a0c42183c2161595d6535951b63a1b63719e0e123bde658f567e68c8c443a0c152510a5e0c470e09b494093a9d9ec7cb5ccefcee9552112c3e2d41f5ec4b26faf7a71e6505d9a4deda979ccf5a061c377e99710d8fea3fa7cb003136d1bef0bfed1a316bcb891568373d5a95670fda6de04d9eaf1f7979a9f8290020072b02b10b5ccc75b16295d0a5c2887863496d5bc0eb311223c93bf8ee14ace0a049107521b10efd167aefe6f00325a0d9f3357e02bf99e26cabd7d787d8b552d380ae38db52f27cec6d4f8dfe33b3e8cfc5219009c0e7d66a11bde726a36030a0215c88347464e87eebef2c5b4c81123674f76aada47e56946e50079d798956bfb022317f9bed1583bde19a9520d2b2d0dc5969e6d6f7681176ad4b5a63740ce669b032f831b3c3a6153136380549050ba010963518d130171ec18ebc183bdcf047a29031101913eb63fe7204a4e766e62c6b003214063db171a9a41a83e101df25d1c13032dd0b9d944e93a51c5a0aab6e37b6c0b3bf8eff35f236692be23f7519b690c7fc2e39b0f0c704f4000f64a945d29fc904e92663918c3845cd62044059f5824e16eb062ca4f69a5d50b2e9ca7bc1a1346f0c637b0d295788c6e9bcf3bd7d9070368f60ffb3ee241be00054d44de5be156c0150c0580e41dc71194f0e3cfcc8825daa0bdecfb6a040b61b907cf63ca02d66831b101ae04bf5041d1ca0924a08b5639e74b550bb989159d110f2dab30784036796c3a1dfff777cbc32e635438f0d4cdd5a2e4d97931a746aeb0ffbc53eee18f478a6529d89497ddf49a621707f3ed27b9a51083bd371fc7f79857e8a5a6aa0c24294f12d6ebf5b0ff47c151cc531d78e91a187c0c7d4d26e583aed7d7e24510d7544b9ee481853270d3fed0d88669c5acb816effbe68bc2f686fb6e9678dd41516d3210ee2ce9ac8b33ceb9954883d056fcf32e607cb4f76f7c5294048f67c8d572eebdf878480448f9f2c68ac71ddddde4a05b9b5cf3af52839d47132773f514c5a4645f6a3e829bdc0cf7429d4825f5dd71196f2b9574808ac7785e9c429b99ee52e9bf33bdd00afa83425625aaa89e55f61e2ba87fd3c84fb36b7e4fc0061ed2f5109a6642373cb0ae9d7093f840827dcdbc816c95e73f728d5963a0625f7f9cfc02d34dd4f383140a0b1f6a5903c79b9677bec9a886781882076331eea79462771503887d57db02c4a90956f275fee6cab1cf497b0ed5391f149ca9bb774c40b5684712d1b10e2b69113003375d7e952b9f7d747ace224157b3ecde0cc53efbbce84d183f25d6c8d4876fb09e2426318cee103fa774858c1a68ebbaf534c5099b0295df8984d0369e33eec45a1b305fa4374524914bde54fe9a5c24c6ac014c708f81732de6638b90e7639c647a7a4f34dd41e5c54926a13679dffc126f1f416a04702ab6b33711010a3c940e30e0549121e04a350d15caf64c69a05ebe3c81a48510502c6a766ec29093285dd254a7dd9df551839429c6a6dda7e60838c678c77608b64c35add1c000f9ef4909dc0f73d4cf04dd9fc41291e6e91be78b655bec00233420b504da3b56dd087b1f5a483aa40fed4e64b0875643840c48dbfb545d4182e55dd923a601ff022df6adfab34af345afb2fff54ccd454117d03dc3a78033cb2534a9e0ed08a3b5d8cce3322316848f89b77992616836da991e577d24d519882fdc87890b9ce3cb5ab5db5763a230328a25aaaa189d642bd782ff4100cfd6083f5e00532fd4ab3dbd8c317fe576ed5b946b2f40a429909f00bc99da77dc022e60c2a9b145f2c140a68deeeebe0afd5b57495e4287e9f2c0c574bc4f2bc4ba6f54f38f62c094f89608542c5b1d1118b7ec7ddcb1a2903019ea4f21ae5b55afb8da5780ed0cc146375f9b6a9c28a03ca2678403de123e014ac95784fcb0cf15c41c4c59ad36b1dccdbb881aa0b4bb1a93d624c5d2c6175242ce90e5380be4b626d77b010f4da941870d40e3d45ceaacf30939952cf8e7f32ee56ead2626b7b41da611bb83eecb2a2fbb3b38d449326cdb201471925713a199c40238ee5c36dba00388ab7a622670ca8bbe43dce5fda72b9b4723427d9201f2eb08bc3d865ac994a132484356662bd2fecce771ed0943ec7a0ee852e8279b3aeea4bf82711dd5394f677afb9c0038f8a06a1cc30298ee85b5ad3018868c31f745c140032d9aa26c1c79f3c6a24165cb6e90045741f1212d24270054388d1e76618086f7d29a02010000000000000000000000003ed7aa7b5519e1ad3a4a9fa78dcbd10f11ed74bd292755c4505cb52754bc5bcec94d0599e4e542c184dbbd89cb9da46014eb81f8e8097bb0135a778efa10e3c708221f2a472bbbef660eb57830102bd5a84318bf42124cb9eb680c4527cd76db00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fbbaa8fe9c5ff9c99585aad548923a194c7e8ddf12e3c0b025ae318bbf4ab0ddcf718a781679a980e1f10a49e2a4baf535ef035bb2c3aeb4802be13d27d9738bf4437f33499e7d7affd993922918939f0beb3c37a8afb684d8e19c1dde97110437cd5a46c06c1469ac86acb8d0d767a442ec1e63c1ba9c669caf2ef96fa540b0030f0e5183258587b1bae4d41bc660532b7bd4bcc39615dfb2f72c45b51945c4d2031525166719809d4014abb6d54de988020418892eb67fd4ca58b6f462b3aa3cf00b07f3efb1e71412abc467a0a7804cf9f7bb0253fe28bf4930287e03d2b9242a15dd8ca35d2d40fafcff93f435fbcf4427c330d84dc2d8db9ccf3fffde30ac4e1d0227fd876afde2be4d7846390ec5eb776c9bbf9772de786f060f4d4744f478d4b8022b4309f5c8c712699c4cf90d39bcd5473424ced0f142328d29ba93eedeadf73d0327ab639edf6dde2c0bca07f9c4be78dec6db1758f6d8b8e4d070a09fdd8932460309955d21331866fa2970020be33dc29f13d9a7dfa275e297d0a07f51c33c654d031ce6778f541d24d5ca2c86dc1dad57343ee19aa7e105f1c19aa4ce80a11054e97cb9a5c94b35410589b691abb8d7942cef300048af0ad8075d396cd6f3ca2d4af6aa418cde93cc60b4cbfc85cb5ca50d73cec922ef73aedee055fe4e8d8948b4059831e1c0ea1cc1d382a424057fd53aaa682df46a2b67785d92f9618717ad20d4c52aa59490b5bb3234a47386e3ea32df7f3f2b91a4e6ef37ef9c33ba4dc9fffc3db69146d48ccd8ab2d66ab23266ff1337fa53999b913636ecee89bb7f874e2b62a6c0ad39a2d368eb7c194c738eaeae7769c16883f8bdc818a52bded42f4fc3a3fb19ee429a77417e1e2e1ef4482d199fe6550e17041981bc0420ebd3776805c64fe34ddc8a91a12a644101f143caa90c889b2a9cf0388c561e6b20b5d2908e8500201620b88a452d99557a00de4c4cfaf026bced8a219616b49b6b8fb643a388d1a9cc6a961ce782c5a232d2cd924aca9006b890848e2c43c8c0e055a2acee4666fb0eee1541bec353cc9b953b772deaaf24de61faf42e53c17ea3df246e2e29ada16647e4d124d1eafbdcb2cd76f5e4bc509fa3423a4daec18b6092cde08689842bf89700839fdcf8d8954d75738a6d55718cca1bbd4450380e8f1772cf86f3122d288db46188497e59d0d1e1a5fdbdedd65e6e2f4c0f570fb6cefa34beb4d1ff9cbc841f4566eca0fc0e0078a0e336ca7a0ac80fdfcaaae8a7fb01f82847fba061280ee749def22d69fb89f573380380aaf8f0abc9a557a8fbe01079b6daecdc5125d1d5b4a26c85884411d6b7518a4a43b26a75533324f45ec2f683748aff9e04eb2b101c8b5e3c673da543c617958ef534ab15c32df891ddacf36f0950b0550e2f77516275b8e4f64299263c119209d41c11e26584d2092c67aa5c6788eb3357ed11c71a3d14952d16b1a9facdf231d26ac02abc96c6bf32efa05ff653159e6f26cf930b5a85bbca4e6f12e763249366ef50934362e37e13699431b54a72e3cda37d3d5e9559832e5df26d7c6165b66cb80cf62ca8da11b7d8b65b50cd557c52103240af6082bf10e2b6e285965d67a6f41bac0ff7c8e9754ae1ee365b434159b3c2602119080dec25f52bde838c6363ced9a0cbf48bc5988e8fd635c16006a904807a16d81d4f054829bf1bed5a07512e10b91cd006e2a96afe691bc4fbba449cb14f39a3ec3c1293fa8b271be99c1d2ca18b866126f9cdb755e63aeb2aeee470ad2c2808563af9f1a0aa9f03b6e770bca3f9d81bfab2baac4ad276926c16e400fe1d2d49fad7f34f3dca635d91b33ee167f51eabec08e094c90da161d54fe208efa5871862588e8105d66ebd228b7fe3bc376825706c11f0f480a95b61a595239723b8ab37098901617dca29f0dbd3c7b1fc3484cd693a3262c2b60f33155512494062bf1cb572b529683715f8978754d576d0a6024955f845f5dafc721d392fe24e998b0e710a929b308887fdd2f30b8ba828c69de8018f3d1e774d084d7a864932146640f2791df0ef8cdcf649eb921e1865341cdf775c3714f3ce49b092959191b16769543db282beb80b9c55ec3c22d5eb9573cf81cdaac231de900cd9de29cbaf0263da4a14fa16946aaba9a734180c8ce180535fbf879664fc3405fecaa972a3a5bda5e7b13a584d503bb8ce840545ef5f417271464379b2e570cde519acc888b19125920fc6e752fe76f4e8d3d1b0ae248cd673625855bdd0ba71700e5d028a0ee53c962c191b0bb1dc39f3e95a5c6e4e25808d7fd28d709393bea59e8a2545ab459aca8bf1427849328f6c2864154dd68e4d0ba61f7a5bdcb1f09e6bcfc91e172ecd488a913e156cc4f4415516d846226682843d4ae84bbf3dc2929defbab94332293da2f3c8131a01", "", 2, -2042866870, "db157e965f1efe8d0f76d5eb15cbb4e1e531cc82341a0a4be6f599323a012a4c"], - ["030000807082c40301ea4630b9413a3b85467a6513a30047001e6c57c88e1bcfede0f8a81e2127a1c201000000016ad31e87b3030106b80300000000066a52526a63510f06140200000000096a0051530063636553e1bfbf00000000000000000000384ab79000", "525151", 0, 943335287, "4f12bfd65b714c821daa7eceb25c561c235825dcbadd0b2daf31e3566c93a661"], - ["b56c8b1b01b86af14d39250e573f11d0201130e70f01e7ac60318f10831a4e88e1f07b8d61030000000563515163acffffffff04d549c7030000000007516a63ac52ac00fee951010000000000f5aefa010000000005636353ac658abfba050000000005ac63535263dfa0c2a1030000000000000000f0df300400000000f574c6a518b993996d43c2a6e1caa0f392ef52f957fa35df50ef0106f74a8974da68243a29be5ec311736379e394b56ba2f4f99587f38e4b2b73617472ed97dbb5d709d5ce07112a9749cd702a5cd1a39323dedb1f8da60bf62f2bf4490defc9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005a5ad8d9355113c577f3bd4800177f8113b12724f8183c3a71f3ecbdb8522e66dba3fd15f1dab4a471026440c02681f03855677cbc8fbaf447b32e43c587000f686379053c643fd8f226e7f4440e01f654a60120ad64ea7b5c67e7c6103bfdd44088b2a463adbcfccc34b100095394f9dfd48707a015ae48a419895ec1d20d03030038bccbfc99df94775d8c8ed77f461cd24a7f2a175de361c8578bcee1739a9a0309344f65ffa19c984aed876761913db997bccb0a63d850cff0b3484cf6d53c880b0570d4e677282349d9fe03a861c08f325b66c7f78d1d2c9304aecee91b224e6cac471a20df35cb2ee7e97d3e22d9a2765efae900d0d390bdc781944525bc895f0302d6ef3164e96033dd46d85e48c74879227aa4aaaa79487fc1ba3edce4c32ef202023f9bc4f2cb6c85318d7b2cc4d060b57085c80601845a8e5c2cfa89a974ffee021ed7137fc8556b1433828c6c045e4267a6f95d3aa1a0f955aad8e3a3ae9f09a4031ed661c0b51b6cb686678ab904a52ec2429c6c4ff66ee24e3baf805ec48244a2021c48dbe84e8fd0cb41c57307e4f62b469620fc64047bd09f4c71129307fcb6f8174cd9440e43e7545fa99eda443f49a70eec131ce499e645806a08d1a2980078e6e4edaa171b9809c8cbd88b6865b4d2257c2545efa0df0fc599e233986bc8aa92951c7a321f7bf1bd8572c4c18722482bba9480d85abff2ff3864acd4b22d61e88310eef7dd881f7d7845dd485734d41931847c8a0175a60e4351a2fce120e186e924adffe914476185349288641b58d1235c8cfbf175c3fa27e4b9c0f36a55e6baf487edd5e0996d0c09ededbd830c5694e90edd388d8e8e43002f3d6387a124142dc9d937ac79fb0f653e46de2183c14c97527a683d306d538d4c4de5c60f82218dc47c513e814429ffd7616ddae76c78d54ea1942762e73e4a06a1e517ee1ecc11398b70533fd743c8f39ebaa235cfa1b52cb38a525cd88b97bfe7b227745749a605d875cb820c91852aca6484a34393b71c9da83a2cd449536e38a07d7e3d3f7f6efa39a00a267f070dbb2e0ee5236a36f42dac89ee7c982b2151d73f10dddb979dfa979cf0dc006ebec80d688cce5c764b3bf9174162d6bd26382beba0066deef15bbd8c698cef57a89de365ab0320ecfadac6d99c728631348a15f1ccf49b2374495c77c8103ea1b8fe617809949f75433723dda4e0efddfa80a660b10ae374c6221eb2edf4be13c276fd810fca44a008eb283da0ffe1aff075922ca37aa4fdfd8c1870c3ad93c6993cb546139a8d94a44d2f01e4938d6f125075b07120d73e075b46ccb3a2d8d94c26c828412ced100871d1ec675f42e6ba23c6fac3f0ebb45b8b35586fc6b9e243baa624057a48be0015adbfda9336e5d389fcb17e71c99263fb41df45634454cdc9a1fee0e0ca143ac622ce92ce3eca6b80f87a96688a84f48047108f0f0b41286d182a54087f03a11989b8a2a196a1c434069b16890cd711049428c37f57011ce4f0620ab42f8398b4a78afe470ac09629b60af9231f1c13748826024f749bfd4bbf9341fe8bc3ed1bf554d768915070e35a210d4e255319fb784137ea73664ae607eb71e1ff337969aa409f29565d181c67aaca8f1f1c4c2bd9c477c9739bcab130a0d46e2c118176e1271553624a8c12a001059c81b141d023a32abf9290fe6559adf74632e8b88b8eed3c0f07512c5d2b3dfd0a986ab00fd76de2c7498ce521bb64b3c3e6a9ea4225afdd70336cc1e3f0c0a96f3ef1aa5c6eeafb14191810d89f2705a7055c09537ad9d87695818e2cbffa9c8371a554b1e396939cfa21b8f21a94e1f73903096d7a1137fae8b49bf26ac699c48a592ca1b5f8487797def8c54bbc7faddd4143d01fd7f2bdf9a28f4d3ece860ad3e18e56da1f12abf93a2c0e7060c03b8956114df0d694e4c684aa400cd170c5c26829c680e81214098ba0c49018eaa4e2c2e400bc2be20f51b631547163ecfde3f6f53f76c270375f8df05eafe68e76497dfabf913d404108a695c60cbf58596c084403955753c9554ad79f40606621175353d65d1db2df331945e705aea4f5c10a4913e142261e17beeb4ba5150cb48864dbfaaf30d25681908749fdf2d490fd77eee98440b168be3f8490d77c75682639ef38796d5eabf0a44f24032991079fc8c34dc1903b60908fe12818d61ad1f2a8e4f2715fcaec2b48ec7de1e8a8d6c165cc38ea3f54d7836b728ce403f9a3e557b7bcf16db6a5858c4488c22a4a491d97a2e5167c45b8bf23680cc4a4bd2fcc0000000000000000ee18a401000000005c8ba2e7bfe0883116bff2a1f5e87caa99450d9d0da05ac30c4fdebb58b5b2af7de97d74e5d7ab97d9d7abe2bf02abc096f4bfaa10bf41707caa15ab3e53ada7151d471f672bf6e552496c36ea94df1b4de64af91c81a9448273e6fe7560c76800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b73db5f0bad461e278795e3cc5b4d2e9b8d230c3ceb829e9671dad906d76028a283e2833e006361bddacd8e2023de915e8b96cf521fecedf8d76fd22a5b46a4aad514da0a737d630d4b78521137314dd6692ad14875df95ebc4b41eb2fa11923f33d14b8be87f30b17ed6e84aeff2bb0556fc3636c4f17a4915dfabfa1f97c4003159db1ce08bf7c4cb4b10c49691b834dec09cf6b5cf8b786ad826acc7d62c0270322eee4ad55bbf6de49b82d508ec0e95ca67dadc9896b8f7d1593a7f02b8485220b01375884da03e6bf36d2b6e72ad18e31e6013fceb906402b8ebe17858267e972c28921757749160956eb8a8dcd5a54cf2f3f77efb1179501e6f9be9e2e1c47ca020f8ef9a1a199ef55057b1c409e24cdec05ae272226ac2ce7cefd903688472543020d4dbc4da96b01cd8e07d355cb499d6a4fdaddd6f4760c1bbad4c117efa553e70315a7ba826f915096011b61d81e6e8079f32301808d75dce69bc52a4a56a2dad40212fecfc98a18fc7c64ec2760d43b5d00dd38e32d989db0552c004398e872557b0325e1386b4107608a28a4519dd0210aaf53d2cb981f5c0435376dd7c0bedf6b0cf403d9d187d09bf1b102771445b1a00b3b4c32a4a18432266f80ba558fd4655423146f868dd7b1a171de98e1a495f071703a35983c9d3c02282598ebd7c34105ad383786052989cc0455ecb1d441d2d284e4c2d94e3cdc9ac2a190fa5c6fefca684ddffca1e1f0e0ca3ac65708a25f62d6ebdd7ffef6c6eaa51d93d77ad93a1ac3f7e08d5f8a103a390e7d3347493f2e2df82442af73ea103a52de9959c5df68e69f482474183bec435ca2f7ea2bf290e5568f6328c111722f71d458b038e902de466f621e45f905e3a25765ed1b8316d890669a0798976ab41209be1b3ccdaad005970030f78771548ab59c620026155520304d7b01ae2b84c8d465d78fcf7f1c6d2999a6384073631943893a9d6f432db218bc583b4050d9ac40019c1c7dd2bedc032f1c7ff1ef62de4c199db58b293eac6707c66cf9c8965ab8ee05e09304d0a8e338f9bb30be2be645198f761fedf9b0726ceaacb9b5e81cb28778ba6f72c5ce4904ad8ccc1ac047e807b829d9e62bc603b6f8a04441065b22cc54b13313546b58fa428e14d8a41b2ba5756e219fc08ce545ed4dd526ab7868284efb7fa25c70d78235fa6052fdfe085084b1bd083077db3e90952c1d45fb6b1536705378ffc8f07ede38f4ffcc1c890275853d6079ae9fde52e5c1b1a7dcdc3537d0c6cf12a1f87d6bb09018e0538fe75e3f9b613bc07468aeaf344155518ad534daf4329d09d10cf164eb1d1e6dfecdcc6e0c0bdf7713890315cce39f0baa1d34657dd3480033974df633c1f7820021719a4f2b74066ec9b8faa106a7de20d9c52305c41615385729a7fa4f8b8acab0d5d7347687e0f1a876b8b243ecbc81b623774cd9103b1f555600e317d513771f16d96bf574c61e5fa6b229048d87c34c8d72f70f077d5df8a0a9b9433744387f4c5914e787c949b9e5e3020ecc7f2f6b28887bbabf3f3290d3d6f59d1095755f033a425ce5bb89e00a094f7b19d76cb2869d029d4e94db80562514bb68cc475f00fe635dccd78c28c8a2e058e1205ba3b29884831258acf618625d61b304c5b852b5a4cfce205ed24b182db29e4c9f70787a85239f3d193edb1e84fb9a4e6215b3b1e325612d99fe646d1eb3c4725e77475b9ca1e9bd4352b8fd2b9994fba7570fa81e4806ebd5452c54b7eff3c322ae00c5aa96391192ff997d0251d0058dcc921a04bc54cb9395cb6db6dc97595419a96bf7d20ef507e5503c76a06d22161bab35512a49477be391b8ca6dad46df759d1dd2cfb73c846dc15569c76d0bfb636ef81125052ac6778829597eeb0f0bcc92d4e85ddbd36e50f8006c303ea7bf66949302d3882661719e9b98f2d0be8493707b887778e98613b5c3f4af5f37f3fdc1fd079064c79bcfb7da98e54f47680b103ad94f2675f5e52674792697a2134ef31c6d45d56cb57b1b93e57d4f60da84225261bc6ccac123f9b0c5474aa4aaafc9baa5e8c14e03e384d03f7c69d215cd999b8eeee4b3ee1520d71f8c63e22074e9d34cdcb39ef0ea0c20449ad8293c186f01a80ee5768891ba1b2665edcaefd9ca07ebb589c69777705e0c183ccd0dcbfc4f2e483cbe6229bb9dd5f0d29da555f6a319879b9f84e809a9610caf336f3ae12816c871a06ffffdd3d2bcf4187e0c54d80dd2c850a8c33515c7b56797dfd08163a7a5764a2c8aab8f380a9896ffa85d2bada7941407d5cf000000000000000000000000003eecf233dee579afb7e86c16583bc5025ec457fe613e41ef91e0a0cf29313965b76d43341be8602468d79affebf9fbde4eb47631abdb1ca14adfbaee6f94f55aa065a6e05c676412fed900c7df9e05dea69f34add0e81c2bc9041797e108e15c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e974cfa39f0cee9610017370bda12a3e9823d025dc6251c4a6afcf15281c52f81efe5950482e815cd3d68335aef8037ca3275281eee1e5bd4b35bb8f2c1d03eff8ffea2db69b3319981e447c06bc3f323908f1c24848e5826d3a140f12e3d3517f4b0cc2531fbe268bf79a45d0b6be4efbb8a2162053bce33649d8cda55a35c70311465bf601a49225b6ea2e8fe06a118fbc840ad3faf55bef46ba19af019874a30323c87d58c20c36578df8084d55a11015112143cd2dbb5a99fb0c9842021b527b0b061ced684601caeee7000e7bece94231b47366a55e0a958e5eaf006bcc6f60ff23468c24bc673f7f72a398b7b84de1a42dafa6c4c5d9a99ec3c696087742c2100227ccee356c5556239314471f764778abd3212a5a821ef514339d452c9d20dbcb032a88a0c617c7521d821fd12b2e3392a3731057694d22b2a47878da1f7cf940270319760e49000790cb0a51cb508c8160f9478bd02f3cff0216d2b36b2397b4a6660329801c4598fa6aa88f8940314274eda7dbe8f3d0c41be7150afe13f34edc0a3d030a2817a5759f3f413a178e18f623f22a9ced4c096453dea253f668e790fa7ab83d6adfc58cee8516824b904e93838017d710aea52b847cf750495da48077e66cf19c25c601bedfd35f33f336c91a59b00a43effcdf717a7ed52b11c0d9d91f6f25cadaebae18d85d3f231fb84166c7381c988615f473674cd1b5879d2fd8fb3fc572861aede3395f60cc1ed311760ee622eca0390db8ac87e391c7484ad1a4f328a65d2a803342864897441738ac0251f2014f82567b87541ea3369fb3eed7bc8ab1d254bdb768f29886282594714eed1f161ec95b567bd46e84fbffe6f65828236ae56e51aba214a93085eedd884d1b5a683582bd3b272d92576cdc417c95eb9e4f7d0a021304811b01fe4e1d8f651841537b6b1e0ec4d7622c6220c8f6d7890ab18847d402f399a544cce60da397bb6da6a2c93d3943ff4f572c3ffef28a0c58fc02b0fdca7c6e8fa9aa51b56b4e8d2cbedf9ddc240fb754282b4cd42271d701e050d9947846af1d34bdb3c0afe79841471066a992a4b83e1cac61989ae4dbdc45b483360ea37ae212d6251d89e1f69e6183c71dc56e0ea93b8c759182cb8f0e1db34309067942fdee9abf1fa121037381d385065a7cabdad64a990ec137a1f768282f8e50dea82dbf452723d47ce678baa9a4ca592fdcc6f662e802fb6b85f6a47a245d8f74df10784fb5d91967fbaf462aac397fa45455b76539607a3c87782b3f7980a480e70fedad25b55d7921f3ee8e17fe5be6c33929a5aaff76d6125a9455074c777cbe560c6367cbedbde50cd56978cc772963e65bf233bdd2799624e54c32a747708963a5f8b024bd1fd2561f51a7d0eee7ce2340557438b082b9e66e40846f5dd40c34edca400e5ffc15bb9e8cae9c30a9acc4a7abb492e01cf046c6272af7a9898633291ba742a29da9e7a5be897ab4144f721927fa1d0d416faa0caef8c295cbe8d877b41b98bd764832f5f5fcf930daeb594357151c7138fc9d8b814df4e251da4f21cd5ee3c65fa99173e3e8e182793b9916cac159315a637a3c2aa3ef999fd4ec2cf3cebc8877e6ec715b39ac737d2c34a39bd1d6060a2a3f0582c836f04f19d14f957a4a082110e7768ddeccf9d1c98ac1ddd8dc408083926718a82291a9a6babf06547681496e8415bef7238a53ab5b7e91e511ab89fcfbfed571835b81e7e453e9f4a6314e9f9cb8546a825d630d2e481179232a007b31cf57bea61de890be85acfeda763b83913fd840614e306006651c5c166facd444cd64e4ccad80104c3985fa266f5d66d3177b16e1b566556028a1d3632a7aa5f8fa225c953e6d07a753d80a455a36d139d4aa4ab9b3fd0c12c77ac2c926febd609266942879b68c6227c79e5e92529ca166e92daa90a0c5ea7918d9a6eb10b2f32c26a26ae6ad08ae1fbdbdf1bfc0a4d3e63f2341ea76ae8702106559f7906975442fb81b3867b16e769de163259bf230531b7efad37bc7a2127de6c1501126a505aa878982ab81f25aae2504e7f492355a0977d1b5b058f805bc8c568388d2ba5c7cb03448cf966e95580c546daeaafd00174f7b551c79504d214a9c1b130ee75da37af9b7f67229c81faaca030dbe652dd8c518e3b091ea8fa944f4ae5b8db8b523b008ab1569c9194aeb444fb9e739e5b9d70107a23b29dfc28d4771d548882f240bf79a74f9c39942d0b0b1df6c32568a48679370d0254046810f4724cc81a43038cdc4fc70f4d3014e1a2066f740d5cd3ad896662578adab6cf549b6a839074ca6fcb2261bcaf7b8500390b1fb36d37e7a6d837b852e674c682347d0e4987531140a27590463a936506c66a29f6c648a48cf41139f3249d6cedbd43a40e89363561c1586539dc83dd88df3d9077e0d", "516563515351", 0, 1496333835, "5e39bf0aadb71d3104722e770c10feb86bbc306fccc4616e82182729b1358045"], - ["030000807082c40304d07bc0c78da8c19aa227dcb473f7e19de2d5dfa4362b6d0b9ea02dbe2f9ba1f302000000075153ac515163527cadda59b707dc26bc5e8a2074af44ee70e1a497092fdae2e0241f7b42a478fc1a6899990300000008526a63005363525115bee31becfb953cd77c2085a3fbacfd41f74babd52484b9b164b4c81bdedb80fd6a4d280100000006535363630053d2d770b68f235b889cd20954f4dc7c50864aab118e8b596266117003189a8957847c03c10300000001acffffffff01e8b37c0300000000025152000000000f29543a02c59cff010000000000000000000000006fb0d82515d386b737ed3583a996baa213e7844dbf9f579061c8d3cbdfe715f3b254ab610783ac623293e21985ae5a00ea1bc9cda969974a5f064a6504078d7b3deb27481139e6b1acc46d81cbe57aa1f1403b1c5ceb9fb27f1e48b89e73693e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aa1f26ce43764e596fbc81faf7adae0b95526816beca78421b6f600f4088d753ce201c37030596c01ab5b6a0085e696cdf26caffb4deb6cca3f762bb906f99f5acdebce61d6e9f4b940e42687d1cf6fb24975980804b30b2593c620d70a95c0f505b64813864f8497cedc9cffb759177bb5110f854fb5acb95539ab7636e5ed022b37d2ade963c5de0f0bb8f612605fcb9cf490b18b1d7e3fbdf2331828bcc19a031dacc6e9f8bf19dcf2fc62a2252a87857288adbc20962fafd7934ea8c797114b0b06fe461af1d7e9e2d15a4aff290fa1126870fe6e60d59f1f54b189c165610864b46149d9e5360171b4e83f33d21f576b5b0f13d90d75329e8b48579bf6561d3603220d549c0ed416475ceee4f4453f91475a7e6398739550d501591e0dcfcbea1402106027fca74e1f8d2d835f32ee3c6b974de0eceee71f5707325272b8305cdbc503061aec366bd8e93bf9d87363d0b0ab411f7deba34ad1b635b5e77a3cdacc322103019e19d46c324cfcd313271e40ced26cf6e0808e778d5f884322dfec7176f60c03201992fdef854a68340d81150339a3452538a68b41ef382d23342fff28f2a6d85186a1f8abab26babecbfd115890f007de5b9491980b0ef7b6ba798e300a709d0443d4f753e4ecf0da937fe3fc4f3fbb09227caed1cb5da3e823b1229d3faf7df0bd8d7580b9cf8a027fc4756c1c656405bb3f18219f036826c383667d705100ff1a8eb374421e317e6dd23ecfb0453907f4740a796ef5f4af1c88255e4355856dfea2a0882384538aaa7c8662542a455198e8a3268d599a0215fa6c6c6ddcfc1dee8fbf029f936dd51eee5612dd7415062257b5b5e2b4ad016416f134935bf524cef92505070169a049fef90aeee6213be26fa447db7c177dd6bf74db71b9a99c903fe00a4915bffaaec946a016ca99b5599dbd46ed0a317d50221f3a2a98dc8fd02b5806420763a35a4da223b6ea5e5c3860e7d03155c8cb5db9bdffe47af9ad7beb6d472541266219edb6392738f2a5ba4c98d2bb4d73e30ff3ff2b27e07ee3495a92f9c53efbde62d9cd37e8f2dbffd1c22d77bc1fbd493d1263e56b70db833d009077461411e762af04745ad5d3e8293c7f478c4a9a3d7244c3fa38c520e36d8023840bbbf65f4b119643a0933ca385f0abca3f05f9bb3e81f1d6feaf9f6c61c4ba975bf2cab5cca204467e221704b509ce422019094475c7bca54faa983a844a74dd93dd19def488df112bc9bee3146b5b18b6ec58e24f3bb5472f8b3012277bcbb2c0ec8e361e33a2918495eb5172f67a1b3e1c2b78ff7f0be76ba269317de32f3640573fa42c0af504f24b9174cc256ec7aab8e829fcf79a554b7a16b51782ee2f4cbc0e49bf1dabdf74a892518bab58907057f5f33ae473411520a451dfbdcfae730a68ee8ee7a7daf6c9301c693deb149900ad08f5e78b2017b579fc865f02f246144f7ef02627cc61d429c561251ebb503ce6a6bc8a0407c8be756db2478ca82454fe404d0ace5f31f036f12c4fb7266321f181d7e26aa271fcf7e83783335fdfed13a77665106a0fb507a355d7b37e19a22be21f7bd703b3c85988b876b34e4277efc88537954a135e6ba0f78447896c6c7e3c17b15ddb03f84c5fc381450e1ccd66f144dd5813fff274f8d12575906272e9e0890192d2bf205bd098d6660352f0a3342ca930bb3b76b3023c1527b696c41fcb42cf754eae0992179d7561a4d4927734d9cf61da2191a4d67169c5a6886a19769bae022bf6fc70734c0b4bc10788679cfed6d0b83cea5cd6f547ee14462d9053dd4f357c55acb764d3b3d942325eac0720142c35d8fc32fd8bef55fdd2895343ac95079e04344c51cc0581ab2a31b984c5c680ee80165189d5916cd5513275d655b8aa2cd7554005511a19be1f3a81a215aed1e4a910a49fba4234031a02df59dd17ce75c4f79c06c5f0e93a1e8bdace791dda9d165d0acd066bf5415b0778f42e0849de19d4260205d382898858362d40fcd3dddae48aeda3c402d98035dff0114880604474c0c22616091ce7e86dd2fa15ba405dd242ef3668b6565e6d3ac673adbc47cfea57a60657829a6281e03b5592d726b73557e26a0bf36882e0ebec711c52a088a0c48099739a91f8490104f19f55f755f0eb3ba55d9646f947b01fff08ccddff26309ae0f505720a509c558cfc8a2b21b89e3bf96c2d2d97595fb47d24cb918bf123f5b0295a2874c4fa46823676fd7a3585c757daf838a4d3652077861aeef1380ca528349948d2db471bf333e3a2dbfd01fa1a000000000000000075dca002000000003476cc941e10a1df2171fcbf78a5d104a174c0444d5f29bfc2c4f6d4766351de223af783cba893d90ce1ce7e9fcfcb8545f3dbe5c886090c80c98aa3d5ed5f8fb893f52f9dba631aabf0fb04c8d018326b98495b3dce44e4f1b80c6932347d500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c8875d9824c1e850cb6f7caeb5118bcf3f777f21bedb5986fa687562b544511c97e759e3d4f499eb317ab57c4a05b285ea08c695ab204d8b5e569640e7d9e818c8f1dd42d300338a05e70923822029d752e8753933fc4a3888b81dedf9cafe733b0458874741d817b4ce7aca5e4e36b42014bd638bcdf6279b4376514cad90020ae56f59228cf00e4144f74da9816bd4aec61cbc670e7c7e2ddfe2b079503c9b021ee375ea75aafc683ca21dcc0040549491638a5ff4a7fac6898792c04b34b6a40a037b3de4f3221c5bc39417d554f4b2923d32bd617c7f93d101cbefab11905daf0ae72ddaed1bebac26d31caaadb4284cdfe9c666732c70a792656b504b6a4d1a02201b385054cae22ca94e827cbd034455dba960d64ab292310f0d0097f3534eeb0301f156d3a86c23f09acf4d036e9195c1336b26cba18a66feb3a32c376a777e3a0317f0b24274af00fd0ff7f2327e03488f678f3cc6d627f5841563f887c0957225020f186541ef39c2aeade5c9c297c92bc555b57aa7a55f369e48c7261830008b460217d02dd88c55f1e342651b08f0c5c64bf1076c8fb9ddaceeb8f01a0079c6b1f8f289c4f3445691fbb943c0a52304d0df929f142416642bb4192ce94e2e3db898a5228f73206108fd34b2986816e1b50e06e0ca7e74f970a9c3461d40a506b5b840578dce7b3f70ac7ed746bad204621c1b7d0a5872a947b05231018782680e47612c526e4481ad22570fc4b9247bcfaa5c9117675687daab343e4cd61c2d417068e8a3220749f959bf7838254f92d6a0365669bbb5f6137ee19b44c5303ef2efae8c7890859e048d97db0457fddde5b34d002084701905968732c3f7d845f29952adbdfdb22298e1d9868caa0e1f464a98fd9bf6d8187b55bb1c7f5c7eb30a7dee4060af02d1c2db4297d3c33a7498158c198702d79ce9bca287eaf2672a8e4ff01f4d8dedfcc2693e7e23a250698030e51d14a2fb02c95d92bfc4aad717a41b23cc60712b607d86cc83081673c7fcbad060e443c33a24eb2a5f32a95874d3fe7ae3ce91bbce96303471f36d1548edaf94d70ce1d924baedd5d9f4048d6e5002d1ae245184753b260b107a0ea303a1d7148b81659b054d2d8463dfa1cfde2f858485a91271db0bc8047d44047fcbedd2e1f70c707a44399bf83a71e72765a061112475d7b2db64d17ce484104f22342bcd5b5c029bc84bac6fbcb39b061e82c7ce1fb26f4f12c0c1c138ebf5d8947f5e253980969313a4cc45c844a590571c90a82e1e217fd1f4e477ec5f7660a54375f5606d02b7325a657a213462e4163b6ac5c72074ed0660c2753d082d5a22504cc5d59d6325de21949fbcc2198b55606713ce8aea2e3a488cd63a7aff8d4ad61c54b1a6075e89afa3b1fad84279980aabf159c22288f4a2fd014631daf2368e7a8b3e7ae505d8cf9e9eae6ccd4beb922440b4c7d6c7429059d6ddfd4702b7d5849c467d3bd8c069bb84574444e6c8efc2ab3eac4e76d757201597582feb99ce141b8e510df6decd0889af4fadfd2a5de59a4d64a1a02a290fafbbceb608569c31f49eeda10f6078402c8248b1a2054c790ff92c0b496b3aef3a99208215b6cb34684a34d8e49643f1495848be7b8f1abe6b189ffb183adff1de8be45e8f943a6f5f7bec6935389d91f4852107dff443c98bef89b633cfdffeb428b61ea45b88ade474817ff6c90871d34cbb5ad184945e2e6cc394d267bf94cd7fddb1513cdf69356af033fd970a5c1c58140c02025a49269948edb6408170a838b5b400b6e4c4677ea17b8b66ad4f6d8bd8b3ac089d2d9b41b9e424292c2f27eaddce9e683d417bee1890ec684bfd40a92e003eccc0b02501f3ed81da0453f31e4831126bf6d3862adbdbcc93fa1ff3651a873e24aec38a1e9ea4d2a03acce43a33aff426bf3177ed80dc8372c616b60b4015ad4be00cb612e5e4dfd3a42a1970653323909e8f86fd54c92d5369deeea312b4a0732691a5c559ca529d268fa6ca26eeefc14d2b12cd72af66d9cd2a021b62dbb5578acf32963bac39d1718ff6de803b00048ab7d5ee2e2a5fa520ce160315dab2a11c4dff9b95a5c1d4e1638077093fb110f14eaa44cbfaca561640184bad6eb8177876a2193cac4ca6bc4737ece92db2c541801591b8043cad0032cbc3a3671f2f0560187d12efc7c4b57ef1dbf18918bbdad8c8224593ff42cfd5d3c6f504a4f8e8f50cf5dc2b452b2a1abaf6d00f716a63f149f40e6adb307997bebdf3dd0a7cd4c653f27e7f931d5336ef83e5e74020f6e373e924a8344dde7cbbd2d01b3369ac2bdc3cbac62f3dfc67fe72fa8abb356987be124f084b61b99e3e820c1df455253980a741d97fb49cf4612bcf1f2e26e4fdb50b02c29f4a7211e3871576e94473a01f875369bccb868375e6d7e5e4a3bbaf2409", "6551535300", 0, -860315563, "d304e3f7a680bd826a551d540127cb00c19f34ee9f752d859f84ab60c9c5750a"], - ["030000807082c40302ac3fdf131d4921e04953d19c3d90380c015906fcdb441b895dc76e7fb8679a4e0200000001acffffffffaabfff06062de8735a012d5bd212a4b7cfe2daacebf016e9dcd84738aae4972d0100000003655365ffffffff03f1c44203000000000953000065ac65ac00acce264e0200000000086a00535263635353790fd50100000000002da0c56d0000000003e929a00400000000000000000000000071856779df9c7e3ca6df10b465d2cdd92cb3cfdd17a02d725c7720529096c3dda70641636c039dea26f579812c6b8a9e22bff0e0fe0a501d11c6a4c4ed30ff308165488449a2f22ccb5f1ad6ef885cf335b3c4796bec0bece05deb772e4d07a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000849cfe275a2b5caf9f335807e908423cf54e3f5cc61d93d6a150b112a005b8c6b31e8ebcaae93aa45ac44056256556994cae4f2186da7a84176c22dded8a060647351748b3995c8f855bc7432c66ca28efdc8edabf4d33e4ffab2942065df017e22275b291c9ce9d27eb23c1d7a7c5a65e7c44470b98081ef8c9be380348344d0309c9c2b677c93a34ffc0a2dbd48007944af3ba4167c53a1b73c6d18f3e78bf7303224ef54b1bf4d9bc903ae18c9fb1b92a2700b5d26e0cb34f1997ef5227f0d1560a00288e6d11589aa1628d7b7509699a11032f70589c5c878ede96bf05f132de6baaca3eace056d8f9ef3eecdf6d081bb8712b0f9cf148fccdefea90c0527a7661031cffe1c28970576faadbb4c9827f0548eebe09d7bbe8c444fd145f09afdebbde021a788839f87e63383ecda86503355053ea572a9f11f3138fd7b63c40383a5185030d36c05a20996f9bbc7a25c13ffefe4a323afbbade36053c72634be82f055d6603282121cc49737b013756ec2ef7073ef7be4565d5a6105ca47fc08076a5783867022172f05c5a6fa39587ed1f6633f85f70db42e022f86f0fa018dcb475bf7f27c8fd74bb44be1224772dac1ee1b1b24ea47dfe22c71836f531c81cb156627df99a871a38e6c137ea91f195ca4b0d7bbc0aa1310b6a8d3e3a497bb51d75778de421f82ca4f1dd686ce29e4c9de7371cca1332d72cbae2d5ebdc54fd1ec0ebeeb9637340a5b1382fef93f3ef96cbb91091b7170b8c8f66e6a7c3ab82813f0b187b5ad23272dcfcda321a2fdbe0ab93417a19d77d20dabf189df9290bada57fb25a8660db52254ac78a208fa2e4b43d3bf225c1f76f56832a9e894c82104c75380ec9ba82669e2ecff5dc1b089f9e3bd37bc68365512cc6a0a9ddd9054296baaef95e7275d43a5d0e00ccfa4b65c94573dc258fb45466aab8a86c7c0bf07e59cd6cb4ac214a0f6b144f17ca076655894b21e5ec39da62e76216ea31b8549586d2aaafc313457d0f42d0ccdf80481fff6d88f02c8fe3453daddea69309e826ec1c020fd401909c5886c9235e67cb166e8b5e8922fa5da764f3537df7804e1a9acc6598d657c5ba977125624c1369fe776fc8d53abb181d5d16ff6cae57c73e7692a223ae316993b4e1a70fd30be96814ed6879f0e2545962ec55a8680c0d0123822ff4b8bc04bb46ffce87f8f30e4823fb9be24b9552bb9aba477c157591f4904e14aff9559453715d7e23a77d7cd44f6ab2ac00ba88199473efa1fcafbc569aa0e8f8f0b7ea4fe0db2b2b5bd21cc171887fe1fdba0b6e14fd2dff50fb91b808483a08744cb729b4742dde0d29b7330288844dc9cddb287bf5f7b44639bccc47cb012b1007a0bc7782c717766f01e12ae817ac232985d6a269c210ef4a785d3fdddb4825599f331151622f709f23b8fab3f119266c31ce9d85d54dd1e20065808bd78e955f105c5984ff54bdf6f5d816f4881e1a4ed8580b1352e451d33eec49ce7338a95530d210d810f1980f095a0cd7fbf4a8aebd5e35b2f459f5fbcc73d6fbf7b01bf1ec8e99df099f0fa753e256a95458938ea08e295b03bbb1128afadf8e1e3210023c6870546160b1dfa424c78f7777df685ec2a9d741b1f3300db89e815cd052d712a20e7a46a57946495bd81d7b93c311af81059775951c4300f3a8d16c90f882d46802c4a91e601f2550374e740ef52f39092ce779c66784fdb879d69aa3893d6e882797f4438c96c86153031d582117940b0a799ce6f46fffe722b3bdc4b2eb155933520593c6df5d182abf93ba04694bd6b7ac1527f0e6351f4e489c45778dcdf24427efe99e15fc14e13d8d416e9909e33c85ab040fcec52c2176251c59ecec1fe0206386def1249d8452166501cfb1a7ed36e88a57d6d8a4ef892839d6df282d2a86f20c3cb843eb11b6de37614579c3c49f25b20eaa0ffb64f4833ed2123a2c6f4262796ea911a4a9b9d2ad3191878843c6453f88a28211972117ee9853cb73ae35c978237ee181311f2d4d843d3d98a03659d589290a88005c90858a9f4aa2fa44705502b32a8e92f9600e6ce1a27539c71d91ce76b6989ad482ffeecb3a589ba5328fd8b5333b7df43f2889b1016fa685e48b463b443885382c6bc80408172d66c821c24cd394e291981a4f0f7d0e10e1d49a3893348f1318dc2fbf6f66eeed02eab15fb0a8706bf67f52ecd3b8df231966dfb500689a6e3b1ab543181c8f0fcfadc53cbd89585ddb029e47e24a6a65479b00397e7fc118cdf61891944016e72ef66f0840c68e614ba512fae4d05f8905000000000000000000000000fe2e5ad4f6f63470687734be76460805777aa7be6b1c659b4158e968690c5d2937596309b14c831e955d70458f2794f9a80330eb0d5f5a484e616fc5e0fbf6b3e97a4c0bb84d07d5b4a98c1dabf96e667ab5dfb65bd075c64c6d4b34201b238d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e765bd277e49af26eca28c5f0089726a1c14dd95f056e726a69f0b340159975f094ab87fa12e4a95aa110726c50e5057efcdda87d5b0b0fa50ac0f02d67dfead7d29527832dfefbae0c38958937d6674768c8296f79263fa21074f55a11699bb41a2dd4df8155d701a027c36f04130be51d8035ef341a484ef89c68caf4da41e021ebc02dc9c09e9aca9d693208cf5ccf07440d263bf94cdcf9a433005bb00da0f0301aa7c6285b483b780b2df4ae0e6ec3b957b1978bbdb34b5333f98f74be28ccd0a080e2a8173fc459c27e22f49c53e3c8b39d562b64997e748f8051f725eec00ce04c10bc33bf44010af82cea1348c4bfffbf8eaf205f18136327997b17f3e522902021deca74b7c41df7c57d8f240ee06ab4a42a53c839c39417c52e8acb5e1081d020eb6a8456c9ede68888a694e5ceef893f7a930026a7a547997349ad3980695b702148e25bdaebd1693bd4648b79a53ddf5afa0f7babc5214e96c2e3d3fd1ac6fc3030fdf280949b5da1f2edf77a3d868c7b713a8b0d48b3a141bf8622130e201ad900301c1983e91a564fc3cfaf8377ad4f3641ae93432b9e786d252e6303d0e4f5417fdf3ae7267b2b4bd3d44ce3e9f401da984fe231a2ab80f892af507dc376d9035c9ae72c88c07daff9624c1f62ca668d189a3bd6d45f72c8af3e7a087dc3ed290bff3dd4ffbaa8bdf8e188e196e3b634e951a5ed75cd47a51909ab1d743f184bdb4d05520acdeb00f3822b5ee6c3437bc2e3b27464b325578528f402215b906f0eb27bea4d6b2bbfd6f429422e6ae7b9bfc54fc02fd81f0b25401eb1a6a1004f60d46e0293016c275a296227c2e28f43886a313106fb7f113344058477c2db92b5d8e54ef87243b720ceb9694e34f5278f1ca063636bca928e0f41a15aa1da1c3a4d0d6e5f391a4c2abd6930e082d80a70d55bbccf826f30e1afb87e50427ec9655a47ae4ecb503e24d2d72d3e87c654fe6f2c38571ce76e644804c384223cb24adf91c7fadec81bcdbc9f2302b4b8ef934d4ef8c93b5e88a8c0893329c0610ae535c61a25bf26d4f85854afb472e60016763aee37e6bee13599d98e85a37e9e76e30888326d9f7fb73e9265aa6432cd9c6b9f1bd85f27d5f8b42ab58ea8fdb0ea1f0018405ad74cb9a67cba6a0acc3919e36d0e678b9867359a521a095445e81849c77e099e45dd3354dc58edcd8acd0af4adfdbcfc0d05b1cc0765f90a20f7d26113d385a387b5ad28d41ad5e2df43b11656b0179b5de07d1ea11a4c01022bb079150ca36d483f20aa83f0941608e054a1c5aaa13e2ae374080ed13fcdf5c79b0991040574fa1a0d4142fbcc257bb37e94784a6f3dc6f06f9aa035ac344a285fde75df96e491a69da81fa5becb44e68d30679dd5e0a7b8550dfefc7731a870759dde95ade0622684bd57df566d6369b53fd15bf51a5dbe6a24a65e80ceb1f7d1a7b8c299bcc6e7e79a6ff86c340446891fd5ce044cc329dceefb53e4116613e270254ccc780a8a26f41177cccdf2bf1c5232c552c9bbe5816a5a550a12d71c501694f33663edc8839f58732f9113abdbfd421dfd875073feb877a7b93152609ab34fc8a8f0f1abc9b55db2d4e1332e1f877e287ff246ae3957dee805f8ea5397d130b6369b4fb0f58824de28cd4cb0eb399fd2f0ebad01ce19962e8e8cc439cd9db07f7398bef49daa285f87a97173e9df209dbeaf456a30ea4e25dbc9aeead762f5cf7682a236d9b97310e319e6912c35308707f872abf177e7fa3b22c69b1bff1c2bf34f1d13f70adc930a326b741ea3750dec9a67276d4a48ecaefd93fe5228619e89ad350e140a5158f8e5ea5e4dae8cc41b4a267ae12bd5ca3cb824ff06766d67b86c5d0f4bd4b28732a123d1b34cd0b433d99852996a23a74c3752e5cc003d0a3764954e0edc5674c28e6200fa79029933898bcb78fcf5c415df64fa4f2e14036a7e00d40c67c8a958dcb15bd90011c54eb3ee102e5ba5a3b3ebba09670528a3cc09160e4098b7b6ae808bbe29843a6fb3f2d384e9846637bc562040c20c06fe955ea5872eb9169bb1d8542309b324dadb04d5040aba744cb8c9cfb5fda9bed60b2305ffa590e2326eae0c05fc3aba19e00d2f99232a026ac309cfb897dd116f9b78ac3c37107a2277dfcf6758d1dab001ab1c9d9a9184c216d278d18f50c5a8c37e3d05f524ddee4068455dd8de7a80ac41d5bb5716405c912381c879b8f4addd4de484e3e2967273a28b82bb61d8391653734b0eca658c1d701176d1aaed48769a5f17018b8aa7dacfa3358532e64538e01000000000000000000000000cbd6f7e1232d5472f9459eae08baf971ccc3297f90537b45e9514f07d446759d5b6a57cce3706b42c29c78227f9298103070ce66acf821a553eee1e6d91a9924da341741541421732339de6b66ee67146b01ae83e3920568ddda0982aaed809c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000244242d273ab020b39b1a16ed4b6d8f8754e5d383cd22c037eddc8e6c498fd69f3865f643ef48cad31b06ea0598222352ba3f2df176099df1206f0ba72a5431ab51cf2218ea64beeb96352e90f2eda41ed310d947d55ba57e698232a9de460d8015b1c57044d0658fda2b20fd15b3d147f58871b13d0bef49d17e93d6cf3a6c5032157def9e8e193ca2c52d75163d9c5246106fa2f77188977bf27b0dc856f54d9031b1f4066cf6572d9976a720fd83df312e3988285bdc80bc5d9f130c32f17ad2b0a060f5b49b4c85100f08ae0a9fcd2036e52257d91cddf7c01f0921267340fff11f54440937f1132dd9684993b67ab9469ec2294a18fabcfed5aa22c002c0ec860022f8b37ad9047cadc72cc9e5d7cf1a3a144166ff2c01e22379daf863fd60ec99a03137fd538a08660453ce56bbb68385994e4f0786d17f1c5147a2383b7dc25a39303060aa8a8c6a1a6bf8498bbcbae230d655c2dd87169dfb01de28501f93903c64f02035d11f9e8165390fbf2f529946e17b0be7b52035869f21470f3615f2d23ae31030acf3f45f6ed2c41f17c1a08be137f26c107ad07db9c7759789ec95ba2dba274d908f7e2e1a3bee96c2fe9463894d0d2db937eaba4b6b2762a052bf98f4c128f60f17b4ebd7a4c89e3e63ade39dc505226c3b94afe14a1bbdf1f093e416523fc1013c59cbd98008abc3d781409bc572483bc5f2d47353918e0d4c02e07842d3f516f24ac62d883aa6aa70bee6e05d599ad2a773b1011ef052a31542a774d4edd3cda675badeaa57c9a019f4e5ff9937108c1b6db486b83b332377c228d773d6300238fabb94e64625057122de7d90d0fea836cf17f181971e94910189179d7b3ea7779f04e034b48d20b5fada153b7f986e0c2acdc7d32e55f1572c430bb9f6d769c60f3c587d24d84a167a99b120f1090068f500578cb74f6c44805b43d71832be39ffbd6eaaf6ffe125261822a01ccc63e489554593ac345ac2153b5fa7015ac238482e266e09cb5265888d0c1e82c68aa0fd4a856e2f4d25c835376a6b3fafb2516cbf5c4526d495ee5ece2d20ad6632015603f9c11e4ec08fe7f019d9640bb6dd53addc0eea6da2ed74d510b9a045e0a680d8659dedb263a4983834923dac9fed5ff105739cb964d6e82e469f16cfff118a854c304fe51268383de2ab4e3686d6729dd123976ea4e1f2d7c3fa9e3a1695c695737dcb1467b5a68141a25425cb661a78c347cb7d6ff83e78cfad6078db0a9f4b60f714e42624cee4690105d2ace84d54800c8156b1b44d9c362135ad73d4b3828236bdae4dcadb1e10627da2c349afd497d089211f0d673418b3b4f849c1ac10f7f277c1a3c89359c38f2e355c7a65cc0c747d58a5e10751dfb818f4c3ff7f24b151b67767db11b13539c0f05699b6a2886d6ec026b2afe031587d54761733ac7bd74469d12aa5f0ddbe96b9e06136e2bf4da986574b167d08348311a43fcc3afbd1acf31697d5e908aeaa75d39b2c114d687f34ac2f854745add290e48f65f4559dd639a898fb7ebe53aba48c4fcc0dcd5185f9930167ad7206aca3dd1a89acf27e653ba1fc1965b6c4a20cc9ad75763b9eebebbc88962c29ace9a4cb66523c3839cc22e704fd2b4b4b8c6fca830b9235bf5d50cd4655083e33d7800a9e9af35b6e0c064aa85afdca9a2f7b8f103ce9911071899c4f0ce965995e8a42783e9804b5a2db3f6dfd8701a31f6fbab2026d59ee9800c59fff3aef853051fb7453e6a8959db831127b7c86ef29ee61114e1a6b46fdb686f121058cc426215b5a301993bcc8610e8193f1c857660c125c7d3840ba968518fe1a88d928a646d0b437e9a18bc400e987cd08205b984afa643b443eafd076093baac9acc0815cb44987c9b035733670c48088260ab3db5b69f57ae4bc2a7294bdb469362b159e05a2bd98dbe9cf411ee995545ec340deafd565c6e3f8b18591acfbc8a1b67f4b506e9d458be17f43b506c6f2f823bd23d9d233a25b437cc53fa6ecc3b394b573be0849c8c602674caca8add470e1d12892db8a8f4fac4d0acc23237d2a906732680d0e8805461ceb970ec6101c93d9f696d2abec5b1d093129058a28f8a27a340c6f22e87a448dd0967fccf54c38aa07c3b837f148dfcbc16c506ae63d7456a95666e2e949d528e11f917d1955230e13c0cb931e8599017131ff10695dac9af798848924e3c26a327f376980c84636f7ee002d95650bf438994a7b4a330b98dd1d6c3e48cee1f3f500ae85a697066181ba968ec8fe4a7c05eae81929982c9a8f558bc6bd42729928a63c3fb926e940757cec4598ff070ffb54770072931255f236cf6ab0d16ed6e7f36710821e84e57cf7f481ac1a45b393b875f1f3c9600534447440181e1581ef090e0c68f650cb5e58041b3b0d02d05c6c15d120723a0116808", "6552", 1, 1167438736, "ebc5fbff483017a91a18447bea4ef2b688a553e51d189abb1dff2ce1c67f4e5d"], - ["030000807082c403017bc3887bb6261426b474b26273b979c9a4df8d6586013e2c5b676e70ce7c56370000000007ac510051ac5163ffffffff0247dea1000000000004ac536a6a59ef84040000000000000000008d7872bc030000000000000000e94f0e0500000000eb8a23d7dfbd3b66eea4d08fec976a907a7318e406cdc6a23bd6492d699087dd3cd5ba9bf3cf1c747a6edcd194c019100a31377c7e0faf3ca88a0aea78ea95fa52a321624634ae17ebee2163ad4bcb1b2acfdf12b249ceb28465f578e3d597f700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000634b8f7553b587fced607b7573017fb48e42b74044f0f2d58e07c073684ab6dfdc4542a2f6b9eb6fa9bb99e99c8ec38da1d0101f442e993a37286430c7c3f5f850324a0fe45c9a8e9c40dc9144240b6672b53a0de577a63d0adb915a87f2b8e301e3fcb3bfab93d5032bba8cd469aac810ec1288a479080959dd763cb024791502184f0b7e2e0ec6fae4fba09445df159968039964fecc3a5f96a53e95a3a6e9e203271cb45d4d0e4b5dffb6dd64913a49eff28f26d30e3a0c05622d6facb21657b30a069d1382f8515849a0968a1e90e1490acd76e32de99ee961bcf16e6f325614af6af950d6ef66f4cf1079203a6bf64aa8cef321aa06d0f4854ed30c2b78585a98020b15302a7339258c4d4384faa31baf17fa292b2133ed79faf8d989736313d3110221515315304328c5d6ea40489abac019e3206f5d07d70f11b8b9f28e1989bd5e0318fd27b5cad794f787d437712e60193702d18d7d9581597ece993da58d3e9bf0020e11aaac4ae0e4e4e41c99e8a3ffc67d0325e1fd31156731b15d4b04988709190200d8876f84eaa0c95d4113a061ef5a871511dbb350f27526071f1649f13f52fce35d7fbcb5179c05ab3aa49cfaa7ed239d3f5a025957fbca96354ca9ed326b126011ccf896cbddc2644cd5aea0c38ca6a45a085e54077383cfbda6c0dc0760b5923d363e510542337c479ed96e6916ec6f912e30699556a6f26f9e637171461ab6c620557d7696cb1f870247424176fdc5cb0e5507aa9541ae155d5b9c86c5a1ec7d1c583004e160cdad3dca00537375672a81e17ddbfd2806d28fe039be1255101c1f455154d7aa2ab72ca3393a5846ebb03f38a5537f5bedd5b552f93dcb974456535fc78939b715348177dc6bbb9da991a1c438b0a344f995e759c4333b4c6ea231c118f7af8612652943a940f1ca1fe0bfcdb66ed70362c4a508cdab9b6430166744443b66bde924f98ec7681e796433966f46c905e0f59568d26826ab0c755484e6a620acbdebb5145bd861a82f933b52279ecee1dce84cfa6cbd6bdb376a3dcfb2dfcf8c0f40faf5f8f3ef7dbcfec9d177f6b7362bfc0bcc24a7d7c04ce187e18ad47ecae09af64817925b0b87f632abf9669e56e96ac8e8c34a840ea4e89eda9f96cb1e6681b0301f3a31e5d5d16e1acdbb2597f5c99ebb9d7155e719ba999adc0d0ced1cf94a56e1e6bfe2499ca80984fe84d8cee9312459f777c6d0ee7052d405387e1600aec40f58773207937f40bb9bf12d02913d814a1db6dfaa0f286aa5453a8053af6a53f426c9dd4bf50dd5730319e4f17f5e48cfab4d1602cb97199f47939b3403d20dae6de94f030706d7a220cf9b3b03d150cfa954e9e86254dff297c616054ad62e67e23ce8714e22b89daf90bf27632d85d342f99e43909c7d267747bba3e775140db00f7e6f625677ef8839c87d6e88c61ce274f8e488703ec93eb68ad40cd49d43e45a0a57f7d81f6457a1d4c1b45f49a87a21325ed9597fc60678d3074e150bdcf0750ab2e9d2e2ee24fefd8baa838546a89a1335b0bb4be8fe9f40c484d0596b39a20d5281c76ab21e4aa95dd318d84096de53de9e3c7309c78f415483a2c6dfdd55af526c9f211a3ca92fd68de838134cc95179cec517aa4916c450dc30c8c044c033d21e2daf58830509bc93a04745a65b8f3a0476c21e2cd43bc059ee81ff3de6a87b0781b925f99283f1644daeb60e32038efa346a3aadf49b5e5b54e3c468f5ba1aee38a78cab51d23b5d8f32c9dc92797b9656a067b48d38b521e3f27b060a118a24d7bed8d1cb10e00fb7aa972953298d7badaf84c2147d56d5115d2b6d038beff0656cb005800caab73ccc269b96ad78dd5e64ca8fbebcedbec1e047bf4aa567fe03dc26afe7835294b8251b02e08d8b1cb07bb8fb5872a537ff3093a08425aae00eb390a0d00ba3e05ee2741643e591d98a569e6b4896f6f8394f7a4c8e4fde53375cc356d1e8235cc51a4d4913d1fc6f57ba59096443a7019d6e1c0f61b51f0b356bea9566a60fc5ce7e466850700230124f1ef05a2bcf7ed5b3cb31132406df1ccbb2d960656cc6132cac8f7149475d7a93c7923ed8a7a5355d45f530e3addcf8756fbd01504558073ab468cfd4eaa208b3a8840a91722b40e49b6d557a14a50a84fd2e628c6ba6a56469f8a1a23e779cd9bbe472a0cf3a9044e2aa97656f82feed11d37581b8db405a37f1d83a5b28855f1f424ad0b903e8813aa83bd13977cf4117657dafca1ce1a008a63a8cb80873f7d468d2a7f985cd6f39a0326e5b9c120000000000000000ada8a004000000002da3481274f115626feffbb7f1cf63bf6350f4508a24abec67f1e580c5fef830ff61993635333aff8adb9c55f7b97f8e4a0afea40d4c3367cdfe4bb2b6e884093ab9a71df870b94d3f8cf98875854b6360f62cc51797d56111073564e247e6160000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043886828b2df977f243eb49c4457ebdda813961b6bad33027e3c2babbbfeec8a1337c86378c460801ab3a115f11fbb89f908e6a7793b12d56ecab16f2a26af1181352c2f4fb96de15373dc9b3353eb6771cae3433b1ef2de489943284fa6384fae7e3475ddc9da2edf0086f7d6f6795e8b557c6cfd1fa9b27624329806edb4ec0319e6a98a6a34421d319f363de9dcd35609e1f940bf1ceb9a817fea8392e5fc9d020a5ca8887f4e837c1ad9b5c67aaac0d5e32d22e0d970dd7bc65bbdbdcc7279950b0187e83d9cc9f4fbf1bf7edc6804d5992ec78bc3d50d730e80c8e531f190316498034035e28cfadcfa59cc99082df27ceb2eac19315138317cb1be60c7232d6a032bd4b1a8d95664e1be83d9da8d84be0ad2c25fe8b1866842147b28d2b22c5318022676b375a1bc3f88976470180833dc37f87bae66016b8d8618ae148c8e13a9af031b46801b1541ab7723bb67fa13a5ea0ef392c914256fe492446fe5ebbab5866e0227431ac4fefb0b7441eb0136ea567aae038a9fe02ed4f052313b812ecd55ca9f0316bcb9ce672e56629d93b3405e0a3e44466ea1ac20d449a8aff2a5bdc133ba21aef4019af44ebdb516ded967097ce4010ac9723b22ebd90b6ca3e3d65455ac57138d12f51d847780d51cb3ae0ebacd3e86d005ff68c9548d6b8d293608f9cd3082330491667646cf45269680eddac38e226e733ab40890d73460d7fed271f52b2a54ff5ca3c98cc77fdc3ed94f5a83f401456c7dc1d8a47d1539f336939acd183fa36b9ea68638fbceca66389d52acf360b6ec18174a5f99a6efcb2ac4e49e55b5d873b751f313153b4cddb718129c49ab8728a25b2f9777fa474cb4cf0401f3f8edce6a448f69abcfe4286d1cef9deea4acc545256812440b8871a7d9340194b3b3de09a2f4cda2b4ee8b030d825ada911658b2589f13e678c841fbd0237e200bc50c7de5255b7892dc7ad5ce87c10fa35f71eb3fbe873f06d49befbb98ee0976fcdc196b5793e0b98bc62a9c7855793f8822befb6ee8f8504c6e3fb13e5a2100b26a600dff96be30d1069241116f11708029f106d65e776074d78e56d5a20fda6717c6e7acaeb958eebc871d089a72a10d19389d2ab39fb9b1daf0225a6ad1cb72d9b754bfbd309cbe6cadb9481a2f05718cfc6a4a9a8f0d0d5721790c5e7f746cf895428e4c338beda0d042408df7da407a2d5912f8254a37f170ce7f5769570f7bd88d366bdb764e3c2e1465f01827398d35b904651dfe4ca0d76c8322d773c1a36be41aa1afe77596513c3fe1450ff14d155faac955a7454c413c7b6f217473894a92d1ac0a2d6b5356f3d391d053ca43c0074e23defdbcb8e3daae34fb69647cf0648d050eae5d6cc94c83321f065e4b516f4de00be95751bc1c43a62f28d4d47728a5cf074da1b5aa06ebaf52de45929c4f3d5e88a26fbbc9e34462e700c703194f06c689caf8ad03c13710d152501bba2fe3f288ea73d0ecf7162f86a54ee7eac547bcd14583b30a8e53667bc8eaddb51560e1e734f8b3339cd90b1f5b9f4cf9c5f46013ad743e102a9861a2b968ca2de8b9ab0977318a914b001f46bdc6827e2236a401ad735ce793291b01b1d67c68292ee01d5f3877296a594d091eee9f8108f36c7ecfbe074f8bb730708c697e0afe6f14d9dbbf71e23a79a8686f0f85ac566646ee9e57ef3346794068bd4e8198c948f35191d6769a3e20efb342cf747216534d8007808b20fc3aeb9c436c3b55c592055aa51ab1a9f1b41ffd8852dcc3cf4e333930644fcaeca9dad1c4a6801a01ab78a0bede74ff5779801c9176042831463449263f6bf2beb01da24d4300daf92c2b9ba0353a287da06f370fd8d90b3d5040b9072ac6a1b0549b83237c47fb6674d9e450fad9589a663202bd9690152b2e6d0e1bdc4f0dc9f85e51acd0e46676f5d79d486ae8a40b099bc38d4967c79dac69957093c4e34751dfe7a4b19ec5e01927a50e00b061e21ee9bd13592aeb6a6ac928f19069554622dfd9a02604aaed467e296675624ccde65b1828b96a5815af5d8e5dd24f48afd41939361b7b175bfdb3c6fe6e7482d2f3bb9dbfca295c31bbe4d6aca9ec5780e91a0d14aad4584d90f94682fb46f7392519bb0a121703c5bd79af360b7632c806472d083fb7e3378b540d274443a8006cd74a796196338e1996b4b8db3754a927d1b5404f1de534b116c000f43bb81f70c023fb5243a89f88f077ac49a5cd90b868a80f4b626942bcbf2332f8bb15ce927fd5e21b50d9e9016644169198f8278ac4eab7c300000000000000004ac1ea050000000085092661af97eeb0533ac2dcd99a4c3f80251a6e0fe5dbe61554ec03217959a59b8362684ef7afa8bbd1ff2e60aef5f500ad5f69d71c8fcbc4dcd477379e26e8e485b12fa59d14edc94e3d777e92bbe0894bc9bb98d477537555bb48bf08c44f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d9be3aa4e700103c8d11825f58262c19f284980500b11869c67c002387b9c1a7842f8283758ea6df3d5228cef66c77b993e5613a87435cf2d4a7a54a841b7531c4ff5b975c982d5f3a1ef478842a5cfedb2a24c5dce91d5d3c2d2227ebf3c686a3e5588de5f760e1d61c506a9c4063fe30fdfc87c14d6dbed81e7945f432f9ff0310885804f1a54a0c34c99835cbccced609d987f0866334033b5c26d2e22418c80312ce5459d00d68bd9cc55d8482b767c2385473c620e56b0a8e80e633d52539590b049a0e9b0bc6846008797154001a6f7c09cabe3f49597ee5ff8b496ab3a65252378371566c63e53c7f4f869b72325e72cfb0f688af03c9fcbb29540843359e3a03301adc016656ce2e1b667b1fa6a55e07eba3b4bf935b2ae28a408e54cd7860700315d7e2f9ff09a9c0fca387a617abc921e79dd043d1e1098507d9a616f2703428032de41b650488fa7385c773ddf14c60c9feb59fe489ef09168820cb6b6b2152e1032687039dc945dd034ba38d575e7493674297f3f54d53a2c9b2c84489825eeb800324f76d91d27ca351b26a34c78bce476a357d681d4c7c8dfcf47e2c19d7424363f0139f40be226627975cb5fd20711119de96c6f3a3525faa0cfd359c5fb46f417afe78fa89e53f259a6e79df5598404cc23b3f3cb4068a7d7d375fcdba81d2ae2aca879d8e0e59cef7e1e0eeddca7a5ff0f97058704cf463cfbf88ab9433577aa8e4fcc0c03310357c79aa221984b2d686e703010313cad5beefcfdf517294e1c02869258bea5bf13b2c961ba8d21c8915ff40c4b4f34dba5fb74ed5ab0e80e47e73be8128523ee5a2ec675136fe9f97a91e41e0f550707e0b07e937a07233455e87c930be0a82fade89ad0b400c92c044abb81473af8a03498e59e6f76a1d113dafb6547600da0c6bdc63328443679be76acbe2f63b82d416848ce7f0a4cbac2fa947f266aa7dcf624764b41331a2042dc82dec5e58752fde4c125e23b31ea6c0610201452f96ffe353e6b00ae5851a39dacb09cfdcf669e61a274f37293e3b119cd91f37b258e092111bd7036ad196b5e31f5e9bbc6557b195ec4b928c9a64edc6d35a4ffa160b1d78cc36ee36fa0048af3e0791fcdfad059d497eae3cf8f99e19d92ac5fe3eef6e4a6b920ed3fc03306d4c6e366e08b9d4ad062681df3d66556d06a44a53eb76e0bbd2e24acc3d87cd3117fcc30cb9f4278920db4202a827c2929492421df3e92a3ea92931f7a4fc8ce60814a6e4d90708e12ae87d2fcbb7b41e0f9120f8a4072bc2bda51013bfbe56c876faad693a4737b3705a13da8174fe37701d0bfed58c15cce899a5c62e1fcec65ad8c793703c15c4ff43ab432a77062afb998712d9c0a0fc2ed1013eac1ae043844b52525e1d81f0e63f0eb4db3561c1d75111c54179bc9aeaa61d82496b4c118b0737c234c60cb91998388ece846f201d25acc5cc4eafd63525552376162996a4e1b1d75a71d59dd8f8162365f55bf822f3774b5423d6ad9bec7b6850eb1ae02f6cc8f5f3004d12eead53bcab2f2872a1829f88b690b400e28bde2ff2183a7ef060e12b8ec9b260fca6afb3270d9e8daaaaafe3670e72fa61ce79cf1cc92e3584accb66386476af510abeb7e265fbe15dfc9c2e9a9d9e0cbbdbc58b822868211a1483af2f66ed2211928c1f5bd528adf66f22002b9dce4ba23d4161b8e83d77fc17574d999e300913c09443a5d651f368274133a4eba59923c0ce8c36a0618b51c37edfba2fe3364e84b8d1713c96928c92075dc3f4e4146813022fbab89145a500d9d420cb72aafdbe633599ad054b69bcd4257ffed595d77a6047df0bb2cc71c283bdbb154a0eea6d1a86b5b5b51b34c1052eda76833749024a649bf229bb9e1075c631df8751262d862bec03af5e7bf16625e6fb4ec8fc6ab3dabef7bd17848570eb490af06df1b1e7a3693fa8bc4b04bbb7c9a3ead3f6f639281aff2c0e4d6783b47aebdcfd74209c0a9050137e51b932dfa4820fb05087b932129767db67434b82a4e0351b7a98ea4ade52f9f947b41e3f37177eb2a7ed45fbc07504a4a9de3a3daaebcdc4ea9fecef2ecc0ed07810afca26dc39ddbd662900e7f1e4a66e35fdaab6b2df7ce8b1b702c4df38f3abce07d8702237751b1a677d2f13cac747d55e7208ef2477fa824822326f76ee4c619a659bae70c8b1c83efbbff917eebd0b74bc3862ab683d645ab04898305adb6225af2d11c64cb2bc69a0b44f0de85758bc11f05e17337e17f557100683d79a1f6b1c9b0057058c4be206b0ff66233fb68c13f632ed758747952b80b43b0d8534648502fef377c64c2a8212bdbb99c96b920f96411a2168a30e33c118993e9752d011c995baa9bc8f7c2e0f2c191b19ff8ddb0e6eebf5c4f4a560d0099b795bbd590267ad4af038923d2754085300", "525152ac650063656a", 0, 757810813, "53f0d6befa4fd4354c0104f8bc51ab601feb4f7d58bbf053ea7cd9175f8131fd"], - ["030000807082c40301ce19953cd3f91cc2ab547cfb0b44d72aac5b562baa86d248fc85f06723ec55c80100000009ac516563ac5365536a941cd0590481c94c030000000004006a6a53ff3bc4000000000004510051537e2bfc0300000000036a6a526e7b2d000000000006655152516300fc157bb000000000030000000000000000096f3f02000000007bdbf7f8804ae8bf1cd9d82c12fe2ddc6f7640c0365486211640976057709db7dd45a5737d7bca3e5f49ce02e38db3f696bc7ac59b44ad764c5c3c09b5fdfc5e527795eb2d3752060a5734f14dfe5176cbbf9aef7dddd4fb947468febe573c2d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b4a4be45fdac193e9093064e6e84a9446b17fdc5e393d1efa30b24010ec1ba0853c1c9e6c6207ffbba6df2a2713de1c4edacfd5e7c91950b9488bf763182d6c6412c75cb22de393cd9e9124bc9f3b70131f717b97fedc7390ef5500cc5109cb498b7a4f64d13e3a205e1a58524c949ddf29794205160fdc97bb07e5537733d9c022d20443cf0b084f6d0afe399a55951e81e673ce3e0cf8cf76767967ed662545f020a502c0163442e7deee9c41d9ca80aa787828a5a122409545659f7ba1867f20e0b03fa11b1308f2d867de50e5f4350fb605fe87093a0660cd737e50f85b808e29b124f2278bd4e8078b7cc0503130c39372978f04612ec3096ac89749d94932004031f95b9d01f6d27965ee13435909c6c7a5558ba48a22b548ed8b708545ae3b70202071a137f5a131ae6a8d0618da631751f1cfccb1758e19f2f02170f101697cbcf03037e05b46634883b04e528e739f5e8573d8e739d86b4352a1493ab98eaa384af02266577904391c7c48ab731f800b0528d03e69a195cd4ae8b747c7acf76535b95031de1812202ee6e6af8cf933c8296ba201ff2750011091ba561a2f117eac8b78946b95c11cf12fd064026131d7db34097f9e52ac0e6975c51741f1f5e46230dca757cbd019eb7031b3e1e6f0d8923540ce51f54e65f1591099953f506c6da74aa7e7cffefea449160ddb52d184e0bb65b4ad23a0999a844d9ac9d003162e1b63b0b0150d1185b84a16f98a04ba2d9c58909587a82d4a1a436324eacdf85fcf0a35c0f08b71ab915d0d363bb489dcadef21dcf14ee5f382d469c27a1edbae94bf9e2a9ec32d0c3c66316422a3810a892075edc1bd5d53e72808c80f1f6551090146b50f16a16812ca962c1a0ae737626c62d6ba3ba5c2e00ad6adc55269e81ffcceaaaed17a7202c67f55559d2f05b8106c0d6be6b25186a36d537ae93d9415ad1c1e368443fea2c4561425a8760a625a7c9e7325c8d0da938ec402f2b10f7f8cac1b59dcaee668840de234f00da0be16dde87b5bceb197105adc312ac711e09bf41deb882b73ebd486dd511c7ef4309eb6676083f8184d9f70dcb3ff3dd51ef62436ddf75a1f26c3f0f83f9cac093dc8536ee3e1c1905b811e73110242048856c417a555adaca84ec6871d5a4ab82e6b37dd83c56e4a369bccb7a000d4d8ae140eef2efcf733086aedbf92117641cb168217740b726b1f106772ecd836d022f3a03a2c782e838865a260467ce170aebd11dc07ba68b2debf3fb4e6524fd24029056cb03b30b98518de0a514ac1005248cdbba07fdca3f196473edbfa63b355a8881bd0f2ccfff5b4244acbbb8ff28c871e32300b6cedac6a2a72881ed30f92a23f4aa8d48d1bdba7f666f3e62f6da2923fec9f391d591b8fa55e02d1d6d33a31d113f3de0f0016ac8c77ea4eeecc7302cccf2cedd852948d12e922753a2feea967c87eeb08719de9ef1f74c1fa2a2c4ee4d738a18852d80f1dd12b9f70f10fbc2bbf295914e91ca7443ae28f0ebd8266320a61100d198b7a08d0701bddf9ffbd6439fd39ed6e65ec5591834c9870d625e8fa50d5de7ddb189e11a925925311aba86a299b2ad4c05e25a8e27cb31cb4ee17c4065fadf6d010c59c1fb01a37d54f342d9bc5e11e025c154cb91f049996307a856ff93937e0ff0381bd2d02043517caaceb5e124c30d370aff7355b42777be0ef8f0a72b1dbd0b22dfe81b67c56410081ec18356aead89b1724c985d3a94f3def6f9f15f1b38cfa486691211f853679f29e57aa61b6f7fe3d2e9eb3cbedceb24fda1fa6d9688e95f1798f52dc4b9ce1455e5bec80f155f2a7ecae770e93d0da4ae0968968923e43217fea0e7d7a59ef39559cb52580103fdd413052027d27a5c5aa710fcc7b0c08fa852ad3405606a4d102b6dadbd32dc94f6cf6ae8a9043f579722f19420b4edfa9a6fe4075d668a68ab76e866d2d94547b27e0b8ec76c4793ccf530b8f501da1e22ca3252e3d626127f5fb2b886ed9ff1ff9218c9a4d80f74f9186d5aec8a86b0611ddb332bbe6b4d1250d5f0a56a6d285b2136eb629cd8430bb83c07ba2d8dc7509b338900ac6957a4e9509bba6ed68234a65be467720afc843072511235f85d4f4eb116b809dc92f9660c971c28749b8e73feac0ea580f7d3ea68abf275c57e2a92027b266c95bcd30f727f6c9a2315e70f25b2c740aadce3c73aa8e99dec8e02014302276757bb5ecf8383b0e9620333bd339491a2c4d78d36c871ec8c4931ec638f2de3ebd8c9f0acb850d5d90e88dff6ee7f177505a93000000000000000002f665d0400000000a4fee8115626855fcdf209a5d54cd7f25a33bd2a17f8738efd4cd5114e3e63590bb5c22bbd15bec4a95c147611b4ff9b46927f82e54572b4b4d3d72eb078e79b3f6cbff0eef5024120fa113a2991b1fc92281b9cef352f79ef39c57eae6911b40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026e9d6f5f90293772e97639f7436a7fecf1498a6f2f1fc793a1caa18b3607b57c8eb3199f4341be6191239d404583fe7bb883a258d1bf664e89fd82edd1c1e6d5dbba9816b635f5b5ad69ef1d57946cefee3a86ace01cfad52d32e292243856969ac0af16244b3e147df0fcb426e5d6695161d3ed19abdf60b8381286c7a90370324e30c0775a0d420e92b05b936569e5a14e33241ea2f978fe3c1d8d5cbd114860305c7a960416f3ad99cdfb14db813b743071089abcc569d7c8a94bc804d4516340b086ae03413aa79059086dab10c743bb99f94c115267872f2a4138e1e4cb8789cf1451357295f3ec73ab8e827c4fed30816b005394ee7583100c41d9002ee00740200aafb14cc14db575928757d19ae2b8d0c5c1ec2226cce8ede5ad9bf70f9d2e0020e3887591008b1149df8e30bf5d2e35163ff51ac53def225d8779e2fb183bd5702186a3ef4c455abb38fcc5c32bb6b5f55e1dfbdc13deb54553bc788131e98d93d031877327d333878c2b676235bb69feb6c359f78082aa4f191d82e04be42c33af0021e716fd498012f159e4b9faa4555505c6b7c4af3ce84dec5c755da2aa80d599453574b96650e9914794e6f3a585244895f9b0e30e4c726ab4ea2fc6476f946c08ddd1c32c5199ea54f5d4e3a4a7987827f862fad91a06f50b3752f0c368184341db6f751ceb977311dee0e3ad1e094302b5ef3a74c49a007cee55411ecbdf83db210cd48dfa8ebb5cb8bf0817adc3267b9778f927d1c0034fdf8fe5fc893d54a4fcb575fd0a0ec03850a48ea12a8df6173bdcdd8a3e69bb04fd7d37f10fa769288c92e288ad3ad70da0b207f68474e05ad35c121dc854793ec16378a512edd23f3ff761c6fe996aafb3a10e3577bea18d1e80f1280adf8f297d1c9575c6a9f3505e61621b9d479415afe8cdff66d0cf1a63f88c834c349deb2c69c4bfdb0bf231b15e2fb2ffcda7be6cc6fc2850933acc2c73640685c0364584445e248539604e1040e719032dde582de711373407adefdcc7f761d857299814b43b96d05821f1dc9ec3a32967a64eefd905a24c26fefb5f3ecadf0ebb1f812b8916969bea4eabcff94460b2a27409e8f9011bc7fd964dce2d48e8773b911af648e6cb5b659192840a17f629be45f14fa1392b4a9e5a0daf01ddf2e4b4a0849955e3de0dbc0c0b213327b29e5bc944b266dc49b8866753ea9ffa6187023d59b25472bde8696b18db7f7e01caec50df1d58558864407c59ed6044709a88c01c867b266b732d64aafdba05ea1f74e9e0b202d183d76d1fc2f9a64695ce55d360a85515c4794bb8fb1f45dfc2ad323c98569c5f084aec336ee25e7cf277516888009ab14cb4d26dfa83febfafd88717329178496d39ed523071d34f4f5e4a76da38aba2ad9450be7a027e5361c817cb551d061003d26555a8109b472e92f2307d9c64702ff4c9765eaa88cb3cb2718f5e6c02870642cd4c88c166b2ebbe17437e1d1f6f6e135cf6ca338da2bb3facf1df4d239210b258966764a459439370e0229cba7f80f33bfd9c50dee1ff8b7a24c7431391018d0882162f7280e0ef05ca1d4fa47434433d2c96ac2345ff7c6cd65a2d6a289049e6fc2e83e4f1d629c0f5bc258bca7a729fb106defc43b8dd88d7e79b9f988e32e01835d5bdaa0813363cf380b79ffe9adc052be762f1abf87b7860f0825e873cceb9dbeecc4e278867bfa0811c9a5a630b18dd5e5aa1e08a6592a42affbfe46a57955683a0e5d752e30d56bf4195424c557376f4167d6f58b52a1c708c58d8b593262a9132ba20b89a7cca4eb050ddf471dbd22136a19f0ec57b4623300c9d0e7afee2c62835b8e16f697d6677e50ae876646cd6aca3f23d5e47161b8a7258bd50abf87bdf94cbbd4abe01cd62ff76c4297dc35e7e83b990c0f84f83723ae21c3af7c49f8b10243404ad0221606f5c9778a69dafbe2e747c7a3f63fdf7668f63fa53fa9624f0c2bc0e0281eacda73870a539e1214851aecdde571d46a01c0b8f63db0ee08d8fc7c985a1c42358a3db365d3d116926db45fcc73323f24870626bc6581e734de33bcd4476c8a29ba1dfd0da0d56258fb74a188a3475fa55c2ceb042ca111ad6ac54d5935938d59dd95b1cb89b7ac735622d03a08a0d893e86712f3bf8f98fad6bf4dece7260299e4839abf61ceb74b0e6a971d1356ce9ce9038ed8356c9834fe369568a6ee92e6d1cf8cd0c26a6bd7af3b48ae636499f3a812130e48e8c85745af4bc1fbc0495a4b565581dd50e4b02148062649ae6caa83d594b1c184e5080000000000000000a465690300000000b214d4d9d91de8140f7f72444b49b39b76229c95f5807553fe40cf90aa6e9f22fff1b6822ced93902c452aa723aadfa9797b9bd9648c2eddcbfe914dba2e7d9b43cc4a9a6a4b667fae0b4b34e28befc3aa64a14402d1a87a10c72239dcc7178000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f12a30703c19100b92e5b8d266ebd3316679fb47a6b19df247a2822e17007bd660351e05c3486eba74fd621f41db6ea8b694830d3a61920defce67e47d34ee60b8e347d3fcd505bdf7b4a8ae5742eadba47598cd781b7fab8dffd404073466ae81d9e648a07fe36d93a9e8b75d9afead03d820d1f90a2c89e4538205e3eac43d021fbc9d80cce8afa23fe4e75840c3fdb34aa3c51bbb46622e937b5775ccc4658d0200ca904e4b2189845d17659a760ae0a81cdaf3c58b429cde0c945a516dfb70f20a092474d073d937aa44dc087645a2ccce0c5b7bca4164787bbb9d2ec3cb9628127b8a92e1ac094f56c7af3e53cb9347f93ab78db48523d64c587ace567b9e9dd4021f25a817e37496a619bf193a3f9db8a3fb38f78416e54f57bb0fdc5d6d37d5640328ffd8559b8bcd7663c491499779f6fb4736f599f6eaf3840b3930046330330a0214fa621b04d02ec3e0ae9d98531f10ba32b57315c4f5107f87a1b1659e5e00970226f432694ed6afe382236fe8fe5890377e1ca0dfb158013748890216cd1d2dae020889d3689e379dd23088ecc82d89b2d9bc40aed2911d4eb0f9d04971cded48413297d1750507d80786fbd1eb8fb4ed9974a23bacde11cc00394876287c734a00d3ee82c05f24336a1a8bb109b0bb63b915dbdcb68323c362a356813ab5d83c0d149540182c53050b22aa511ff759a68921f206169278d83ad0a592bc72d72c4b76825c675ba0f7e3b26a5b271cb9b0bf497f4650261ba16eeed70ac34cadf2664f1c773ba973786cdb1a88f03a29080b502c32a2db7c7fb003b330aa3b14afd6853ef7f6ae80b1fed08b8d93c01ace25191171eeaa755ae93b35fd31ec24280a40139e088719397b1c3eba37a9cae1f1db260a62dd75c1a12313ff2739f3ed3d3cf1a1e9e32184cc6c7ab14385cd30f6c645f1c0dad198bcdee3708740a1fd178bf6247f8dc77efa9f7c7d96f4fccda7de5d9913a1875d683d85f07d9212a5c784a1d64fdefb4c14c08acb5e454c7db2266091d171617fdd23b7931d256a330520ad2a39103e5d5780a96f24b1d12da5eab96bdb21e8dfa8048e333f16ece6056fd8395f46f9c3a8066e1c1b818f719e338720eb5f0cfb934696381783ed0ccabd415c71f98507dc7b512d2dd68181710d096e76093cb090d8ab1b13b54b99b368a2f66c1cf00a60cdae40d962c36baa8582afbf4a04d99ed8f3c0b9285d35c983580d0f71d094202479f2e119f93cbdebc28e49e902f036524d32f5507949836b34c62e62fc00d20a4808e4038ffd416380e307b42c4fdec42ea137c38121f4ecdad5989831fe055e3558255ae2ae8f22d7921e4f1f805d70f795a2f5a1c6aede9d67624457223eb8105c70894726281eb8ecf5a483f8377cdd533143fcde679e618713440e2cc3b5ab109950e43d3aa7c2a185b5933cbfb104f07e8bf60a837fd51327e5427835476e7cdb4c3ef704d22d8b272eef5340665b28fe4fc3c278dd296a2a0c9b7aa2ace3dddda142dfa4ece7016302a955ce5082a67a837eaffd64849f885b8af05a6900b14ca46d033fca516b10ade31bd5dfda0ff9bce8e7e9a21285f23015c36078f8f7ccdeee26084aa932b5fec4f6687c11a7b335aed9e069fadf207be75edbe3a8dce7208959a6e291d64c2844bc63a445e01b5388701034fd7ffbf2d7d1f6e4657703a3c4bf6982389b022a1e93c7e67cc6306e29b59bc94db8562ca5788f77092758bb8a30c64cc4822ff0c68b8f47b8b9d305eaeb8105522f4eec6d02de881033acd25eb52fc15d7d587375f3eddfc9019b1136690a01cc92527304d423c6fe44f876b3ff65f06642ee342ee94a0bd02af8499092f25c1c7146afba8bd2b6b98a7f8071b318687dc3345fbdf3b55ca3d3a99c5d0a6ced629d123d2f9ed07922f06fecfff932e92fe8cbdc9657935983755e5b566e5e7ffc0bbac6ea83676f124709c63a3e2297598198a0652cc5e7165a325a32632df5b06dead334f8d1911fdb447b6d679f0a48a506aec0094e2aab779a7b84bee102e4490b091ee9c4b222dac21070ae1c9cd789996a8120281200a18f2b1b43ef39c603d7ec6327ab75f49a34913602e3f1a279e19ac8e2bef12b434d9018d2a11d7b89b9904033b9b9f7033d81e4cf9c35cbbcc112b790f33711ab6970d46ff96af2aeecfc08f84c769c51b64e91cac3ca096846b1b2e3853064461b9735b9986b21bd6304f7a0c8a53bfedb8b16a7ec7a10b8c1c745ce3249cb0dde7b840c40f1118dc1b461890a7695b0e430bd1b3a2670732073746b2101ea7b1d4e167c10c5ac1f371d1a82d37ac781e9600cf7437215a9e71230804cab282e509494186a406eacfcf3fe985aad8a548c4206c55a74b3916d8045a5e76a30d05740841d15a29fe9ec801213222ba35f51c8f66241f302", "536a", 0, -2050693444, "c6e0896ed1f9335cecb29dcc81d3dc9af9cc7a682ddb8dee06d6cd56c1d0b0dc"], - ["1c0be9230467288914d5f8ae2241857d450d58a32eb09abe9f02379b1ea07b072b1d3d7fe70300000000ffffffff508071a7732d826ad802bee2b2a06d2267774fe99ccb43b060f46bd3826fe7d901000000056351536565ffffffff886f386e6489ac30549e13d88f6cbe4b76fbf98c0611dd5f1a98466f524af2990100000005635363ac63ffffffffffa02e9462bf4b4b94075074c494f1af5c219eee6fd7c78384afe2d65c5417e901000000036365526e16cf1601bd2f3604000000000851ac6a63ac65536a0000000000", "6a", 3, -1603271225, "d0ced9e890d0196bca9d3d609f055c78bf21e0c43afffbfcc1f1d6be8421ada8"], - ["030000807082c403024367b31c42e667da4ca15bb665180ce7a311cde080fcc932cead7e95bfc90ac8030000000163ffffffff3186aecb80d8c2700b6882e5eeb0c83ba68222dfd6e254d15fd66cd42668f242030000000965525300ac00656300ffffffff02260b6f04000000000074cb68000000000002536a000000000000000001ae353603000000000000000000000000dc44349891cff5f888b8ad977353405aa45f306fd94924f4ad828fd3982824c6f5d6ed6b21eb7a1192a9f873e02aba109b5ae860b6c09fe7ee39a76886da1105ab79af87909f2d1570145052779a906e42e5c3097ff1991d413f822de337eb130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087a75d6a0fcf19b40a024763d45fdfdff16b60d4372f85eb6b3db108fa2d9758002ebaa4f17f1be59ccd1c5b4ea78707662024976c15f39c6f158414dccc1609a6a7484844b7292197e24277e1d6274b49e3884b39dea32aed8562052e808b02f8121424e45de93ac852e99021623b970f2bd74fa3422f9dcfcf0cf0a1d5720f031797989766e6841c2c03eee374c77eb6fdfc6dc2f73ff06a96809de7d3fd53fc030d92c6235d5933d8780289b3b2ca239804067f52a312f4c89a3e23140cc409930a02a9b0ba5ddcbfbb6af837014239f332da7da662b3ea16dac1ce9eed149157ac008a19cbc430a067a9091abe27e9a8be0d85f0fc59ed224b84cbf3fbb7556d30031e99d365340b61ead86557e49b6eabffb95ad8125e60ce7f39f7c9ff09f6dac1020a0cb62577c4f8b264977d59ab4d4d7a643ce19cbae395e02e3c82cf77bccbf00213b285c02c2c78b735b03ad142645ebee4d3d9e1477e35e829a85bed5f0d746a032dbe8669c342dc74f171ac8390effaa47c2fff4ed062b432e7f073514468c029031a7e97948d2f65aaa59aea60640d8414912a8e34739adbc8b8d801d861c6ca6e88de130e71bb29554edfb2eadbaa0d6a85af0964f5ea27c73b659a5806c274b05054f102070508fd58f89f86a87e9e42c3f72e1796ba26ea22292bd0b55de146f0f7858601865aa80d2e679747b11c0b79a9b0105edfc5bf391721098a88dd4c8a661774bda119489aa597716d02a92dbfdd47a403a63963f4a6b25065dece7c04b34c4cc9380686c4a480899f15fac3b8d644a25acf4716dea17347f0a0fdeddffdb78b7ee919dc35210d82f324c99d70dc99ac5dbf9565ec18c6394a157617ed1ffe085d02021b10571ec8c75a1875fb77abc4c09722ab4fd75151a1e22645f1bb00e1618258893240b5a155a3218794da5e557b9c9bf0c849cf008a132b086580b69a71c63b0b72dfaaba8cffd5e9ad17b4bb9bc4f18938e7ce3cf0abf84f077a5345e3e9e5c32eccac060740ceb3a3b3a110ebd755fecb9f32c0cc984da3eefc4e8fcb0b866f09175110faa5889f9be354ae38c90399a2c6a55c20456e2d9b1db984bbe2dbc7532c96315035407bdb8c6e6e40bf4f26076209195e13372d3cdcf66b816421f50d6fc59ce0dae66a9721ca2ab04d6bccf4e30e2576cc0cccab04a76b9f6fe182806c5958cebec456e96aa5eca7f4eacef1e42432482b0e8f030398b5529b434c6c1a9df17a3c9b258d320c21f753c65a9630e8e87da9e62064ccc7d2a2c237796675eac61a16f9d5855bd6df8cbb4b4b4a68ec2e6b2ada8654a3c8e0c423ffd0da9d42a31a40612ae0c13783948e9c0f315e6b4bc5ff1d0dabbe5cc397dde3a29a98e307243919b0c31f800f3871e00faebf38f53c0f23c0d092bb87dd9f85ae696df58f7d8cde7bcc8198992ab0db023cdef4b82090359b3cba9d9fd06fdaf3641a80dca4b3148e599a8ef984313776c791fdfd079874d3a6b0e0c1261544c61ab8ed7e22c61bfa5a82b9e1aed505444fa473e2816a30a68c5171c694bc5c0a31068c86ffed1db5cd615bb30c4576f246c9d02de87eb292ab1d86b7887f7222acd96197433cff14a68bad26d770e0b8574a7a3b76ab7ac61f1972244d9886bc4f0ccb9902edf8eca3b1dfa9bd2f3078888627d331cbed91a750ac7b974416b41227e7b2b48b1a26249f8c1aee83ca7ab3f8061d345aeb9620a04790bbe6d87c5910eca4e9ef2be99f4e5218d0897fdcb2518238825d40c61e252dd0a26217d45ff8095a099224afcbff5bd9e7cb0219967c467908b33992b78764b92b50b473b334a9d15e904eae54acffeb429929141a7e9dddca11dce770e3a6f804bc5d005c8033a0fd5e5783824f2dd38c8cc40ff46a44a4cc3e8474b211ffe3a1d0268edf7309fa4e7917213feace21a0d1aba3615fe5b9869826a9f3b36d71688bbbc57c5248e5b63feaad3fbd0b45f0a9604eb294595482faff86dc6b62ea202bbcc1cc0effaca30e4bdfeee3f31ee8d793ed4c76cf916699820f9176e4751fcde3d02ea76035c86444f1a2c5ab0e0d75df33fae774d90c34535d2eed11cbe0502f55dd36683612b0ac4ef2f54f3a9ae7c99e8f1745adcf346a55df7efc26082fde26d9e4b2d82a14595f8149a09092f725e4600974b54c1a5a0abfb0e6634948c45e6d161d892bb6b4d9ba8601c393ad51863803db832627a2752310875236169eef711c5ef5b743168c39cf9ecc961ef10f03c92128703e3bbbde3519baf8e504b2b719261bb3be1032a83ec243673c28a0dca46b9b445ba9e3b9d60b02af31b8411deda89ad8a6e9b09d780696cf58c6e20c06fbe2bd1086a3529fef709ac49e10255367758529f87125edb8176dab51c278f64c4e914cabb1ec6249553c135bc63ae12b847e38e521e909", "ac515251", 0, -1568012363, "21a5c35070070b7868e32632763475b630cdea03c4b73982d16b033205d4691d"], - ["030000807082c4030222e2872df55b06fa03c1d45eaa346892dd2cd1bf26cea6f79dae119aa0a0c0a2010000000565656a5151ffffffff5b0498c2af176319ed42b09aa3573d66553495bb2e9d71cb5be2984d23ab0715020000000651656a00536a55ce59e40149516a030000000001ac00000000000000000100000000000000009fa1380400000000911b1b3bc88516ee3e203bc291f6195a38b17d80aaf0b0a60c52cb5d726c9645135933341cda176b922746325b5977315edebe1050b60671837a6570b0ad1702cde7e504157af25ba160a35224f3be1583f89b036bda33c84517f7b9bee9041c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de7fef1682a8cbd80403001ea6bacdf5149231bc07f76fd17a1de992d66eb2ca97b83feeb4ab95c0bf77940f1e7ba58187ec3e3a843d63b0f7e7d0d96865343ccb5389e6741755731c0ec01cb605b175fdb5fca7861476bd076981acf707d89923baaa466e637f0c65d4eb6a9cc3a8fe22b93fd775070c6ffecdfaf1fd3ac4bf0314cb56c8c39ee23adbfa8d215363ac08d4a7aa067573ad089abc5cee08431e45022fc185f6112e03c5b51e91c8cef8b8e4d5be63f277c1b25a744df676a091670b0a068c33699faef3f2c086c00e9f9af09b955b9c5c58f02c01dda30ef1256c2b05bde8c86f40f4165efa88d9cd8ee90e912785e57bca268d6c490d89cdd2762a930215db4111f67f56b2fefa74a9573c91e2755a1131b118fc1f43ac3f81703fc29c032c378fdf28115c24b0c6693fc135da44c8fdc4d95592329d94c1352ca3431b06032c93a001460df77005ce586104741f27ccefe62abb58f8b5a3245d7fd32e4d10031e798173979f093fe10146b0c2fc1ed4120ef35d7111e69e9f5542784fbc0e820213b99f4ddcc6ffa27b8cfd9de72c34f0c8c7c2dc9b5645a148dc325a82473999e0f055b02942669b6ea9c876ca5b786633de21a4de3564310593b65f87f65d4b8853c9fbae52d4d65fa9083b250219688fd2989efa93d9ea765a0de2c17c81621fce6949b17b8b8f83b90ca4e0ddbe1a3b337ac047d06ab12b270f88ff8e0c1baf9e868b69eeb50e5c1b61af7766a6004ed45e262e08f5dadf0dc5f239d891213a5ff5c47b90e154657115bfd9b5ec71c0104f119042dab11d8de54e0f99f557a55c5185609b54d9549a370c4c39bc4fa82cb32f7826a5bc50ab0cff16e5035933578b54e92203dcbd0a381bfee0bbe000859b4b07bf5f9c0a3ab437dbe35d52079ba9d1b71a76c94b70ad62fc68af5da3e06161247db83dbb559a05093df5d41075cbad648c4358a53e76625ff0bfa01f80b043bb8b8a055045115f46965640d27453c6331c4e1ffe0c7f8eb92c085d4e34801d5a532fbfb3b60a5946d90840834b5c9dfda70e17b04c4fdbb619a9aa213624b79f559087d84c518f56dfbe311b79f0236133db418e218dc0ed872b669e1197c7ee984427b068913fcc8f4a2a0f35cc6167407600d407840b35818e2d709a181561cefd35ef4e28450b8c268a2c65e046f26dda01a5653d6178787297866f970d654ed9736a12de7dbc406f7b4cb4113b77fd6d2d1dc73d0c734ac657ff910467c58b49939aacdfc363ad9e56b4684c1f7550a198cee3ca06987b445667a7f05300da9cd4692504a52fcb7984c09657034ed0f56d62ad6fb82fc79501a82977593def4ac2adac2c6c095085db51e38a67665c123600ae8a1723ca084238fc6a086739c2e1531fc8aff04f4e3f4b4614066a4d1ddd0f94ddab7a168d3356ecb734911475e58d289deb29bcc714ea822dcc67c964ccafd99bc619768daac85bde3880f5ed53f9d1e0a92e5553bfddcc793c71630edf6d17426bdc559afeb1f36ad58e04d1029e32c6b1862e5e6af7c446c3bc72c6c112d6543fe3a357325265cd242e7bb084c11ce1a27137552264aac62d8b2971341b89babb823ddc67fd36a1554cbb2853153f714967326816008afd582236e7e4a7b283d73097bcd97ee3343f0168745c094f145ac77564fff4ab9a3d7df5e610addae3e21b2835641b0fa423190c19b678f2b10dcd22cda3536fe940a184be3e6d359ad4143ec0180da00ba566692e2c4a871ad0d6015dd92ca7f97df0ca345ede3dcd6cd978ffe84f8c5d85f1e6a6aec82edd7502ce5e498346a39dda5bf1685060803f6c093d6f509c1b659ecf1c10549f55b84bf6b6c9a10273181d60494f1e849f427242da967744b0ecf1e2e46ef2d00a7011d9255d8b6d585e078beb619b325e3355fca5b38af49150d1c8aad620926dd311db1964784a4277a46cf46248ba650ce43101fea2f5287309853543479df30fcf2a4bdf3ee174b3303943a787083fc960b714a0ff505d0c4df5478260ad244defd88e49dab04da63807d9300d1338f4cdc8addbd45e11c00203b3c26fa643f0ab74fb7b1606bb5fd84c77ca331b75b43754b93d48fde2b19f680d8d96dfb7f461c6d04ce516bc77f7728286073112fd2f2d27c81f860afe9d6164c8d6ccdf3345d48435e88a3270502a04e30c836912fac4177f82548b85d2b1ed1a9edd711dfbfefd38dbab61b8a7925aa4bbd6a34bc9099292d95c8de61e0442cac0377b363db6ea6a7acb507718fc615139f9edf356f8165f016b085566861530d51bc947b8425e43fd7b6807a24f36ab4c5bab8044816bcddcfd758a0c85d923d2ae050a4868eb8c348378715dbc448a1887c53b5307dff52433eaa5a84e78586eab2d289a9344373041063152aa93e37bd0e7efc9be975c4402", "65", 1, 1455836950, "c759e3f410bf0d386c4f26a0dd73c4ba6ce0cd38ecfe15f659edc4c8c53ace14"], - ["030000807082c403038d2ca2c199741014aef309377610a4b4483f39959baa979ee784d6329f9567570100000006ac6563525252ffffffff3bb431a38c62e7bac903d693527e1acd5ae934523341f8dbf942135e7de4864f0200000003535263ffffffffba444ed1b71087bbcd1aaa61b672cda02eb1c159b10a67a65fadf0b9ac9cb5db0100000000e07e6da601e42b19000000000006ac00ac656551f4b6098c0000000003f11e7d05000000000000000000000000a658716305cbc3f0da348238d9b1549fefe8c6aad12249233776febe24653d121745ac1ffd6acfe36a7f1f231de0a4c7d714f2cbdf4b6b2df19705b059b6cbededee413a44849f68a55bbf163434823a7bd71ab7f620a2799aaf90fcfa0df26700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f0ed32513d9652dd3f0abf7baf86d8b00551c2f80003185aa65d2c665a2cc53d3c232bb023a00bce5d2fb5f35699a2f8c4be55a36db30beab1933a695b106fd8cf5def190f881f852dcf20c6610ad77e50db5ab7d972e71210d889eb40f7a7dac52cedb0de5691a56687475f6ec037f37bcc7b3f737214ece8d153d9fbf05d8c02115e425a8ce148f6af36c50882512e44f8dbe956673fbdb9b70d65c1825e0afb021a9d96f50ee385071103b1cfc12174cdc64ca0edea00e2b2909b8324411de8ab0b02a295b696356054a7f3524a6f9a9dd2ec86d7917fc34ed2acaf7c367312d1da0745a96c87e54e1b0092f8ed639b7a712a5d6f5e8f9b8933b80b8bcab851aa53021d3a27b6651256ef37c88c428c6d94ccbd82dbde447242da5ddec3697311a351022d8773004d0a91d3cc7839f55ebaf8618b0dbb63dce214d60acb7f3ba4776c49022822f0d149e4017c37e1395dea0c70e01d6fac76a94d40a6fe17db4345f60e6c020ffa0fd8c012e14b6338d5547418180f4406eef3537e586d2d2d93b49e93c503031d8c0d2e9aef9dc928e44724e1a1f6256d21ac3cf7b891c0215724c227d937ca8c3105342a0f16ecadfe79986c753fb0d97b424288bfd98885d943c672caa585993c70b4ba463e22fe9af6c7960dfee4904cfe0217546a5b749d7c19b34812afc8dc431fdc300dddb9306860b7b5fba7114e4f7c713eec7bbca86aa161fc9f5a58a2e9caa004189efc7666bfb0dcf768dcb104a2e9dd4dde0fde10c4cc758f48e5afe8584b9f4aa851b6a85290f000ecd8580a7fecdeeb155e4e4213d833353b0294d9612a9d43667dad3e60942b00270d4712df4ac4414c36f5bcdd6a3a12160998112c65cc48685aacd40e74c22ea9d33bc17243d4b4a5cb6decb1957dcea3733368fa37b5d14d4fb3fb5b80ff1b06074de79c9c4e0638d5fe451e7e38f1f6ec1b3257c201b39722331de7a78b8e506e9b2067d1889ea7343ed23312c601d6586f7d7dd782d3f86565eea63d0c9101d12381471f2d23c83051f6e238936f5a965e977fbd3db79b489a809610779e2ffc1c8ea198760a29747a149ea3e69c86c7769551f6fe6dba2d6c21c563ba7d137e04a426d0980764a1a0b9b131c181cb102456ea52ef158940d6289fbf2e9c4ab2f0349274abda3555f60561aec5826d73f0b9da99adcd54ba3b70ce646326b4a97b7893ce6e6d2c0beb83983e5f48d3e295f64870fa28e2bc8b01b545bcc25b6a5e9f4ce3f5426f2da578cffd3e6d0ff59e9333477ffd0986881387e700807fd988bc9b6027ae5a6d2aa7216b075b83730a4f1376f0b69e91123f4523eb17b6468a00ad8c43036d7e0ff29adff6df769b5655472e11b5ad825c93e9c1d1784a885ce1eb2e8f73ca3c996a1b9497738b6e1a9408df8688f6eae80370940de4bee8ea9f1fba973887e2c48970d154591cf60a883d4ab7aa202bc44ad6cdf0eb9f485d4df9061cb27d4c505d20820566565a5974328d30708df26715c5cf7b37995c4351d49b674a62cc7ee3fd7fcd9e33a38b5990f3813d3f16f9f3167cb4efb83f777310f9daf467cd4b97b4f6bcb8e20dd858c327f607966c0aa7b0d8eb7bb3bb864b3b021541b3a5492d5318cf1c9736b584d0b1daa08be815e5426054c4d8be1ec4964bbe2056ac2f07409f566c08d36d9d3a9577523375e924dbe55bb54e5a808f58b5b849b8d2449519b21dda008f4fb270fbdd5bcf1e6a92250df32489851e9d521a7e4ef12b2bec93a3b08603e955d913924444e63b0bbb909a8da1566351c27961c523b34f745e03377dbba4cc8c1f9f8eaaca53047890c9366ca206f1fff3c0bc8e7ea8a4215ea89d6cbdc87bbdd2dcc94c06702b4716fea3138a43b2231bc52fe0b78cab8c48b2bebe24e4970e853897f2562bae84d27aff0bb13a451ddf089e8a19ad486173fea3642609807a1c5b42525322f8bfbf2aab2f2d1625686c71ad7b9afa23a8a4c18226b1e3686c4599375c396b763685f82e4a400a4a00bbadbdb43c665f07a6b2b97f7f4ede309f860b553993dac9462e3671ed1cf502d2ae94e1748956e2235d330dbd4d6373e6d95e8620a00dff792f7aa79394be21a288dc78eb45a4ae54dada240c4a700cc233f9acb616e978f60b178af41810dc55290cdd4d2fba8d9a1c51d5e8c49d9670599803b5249d107a0708c98b4260fa62e2fa83d311b22cfe206fc5a7cd402b82f664bc30650c5285fd7d45e1678ad5fd4daf2086e73a73e81963eb423e6d4c427deaa331943aea1274bade041bc16e92162b00000000000000000000000000f5612985c686d2952af106702e3e143fa57ab92a4c26d6e7c68485ee056547c4e0d3b542bbd6f4b879a2ab4dfd3e3480e749786cae958ee064cff4458e655a128cd7595a290ca5ba9d5176cf0e7d21442f8b251564c39b11f2aeaf7750e74469000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007cf64216c89d98ac8a11c2a612586e2f4adba7fea81d28fac6e97bcb1f0bd90b59fb1ba3f0655b9fddbf3bbfc26d4621dd5f179fc41c1eed0d49809ec8bc96dd498a56413bb343e4eb5d231e613e0e93eb17657e6cb68e8386240ac20655117250df6b4a78634227687e1a0fceb8a55bd8437ad685ac3a75a55b74a75e45cc140307a9ebecf8652f8268238926238af1f0ac133862392b80fa5987dd67c305cae3020d4fb0851b583a100bfdc247954ef3a704638d8346975d3dcd8ec96c5b48a5c10a056ff2abef36cae85f065b74943ce29401a62ac2bc3ca82206c26a3a4123ca4f7882fca7d44848aaffba5e673153a4b49db71931fcfbe4e5485959710f45c0cb0321c6e216fb850d9021d8b6775c20404d78ed02efa0ddece185ff5012766a2a5c0317e5c1a85e0040866b2c5423fb8a047f1138c309b67b57c7ae5a29256c95df34032d9cde6bc58896177692879db688976cd8a37309a50fdb3f3136120f1a5cd1b7030008444b5050ef8c558514f04beb3c45acc1c17203d50baab47a9c780f68e093021cb54117cfb3aa8fbee977b5298af9483df7eaaffcd112cc458f6df5083addf032f2c538f22acb72218863c7596019758d1b1036a76936b22e62a095b0e1c6d29f99fdaa777e8619fdcb4d8281f0c7f6fc6fb90449d285b4180d5230fa44669e467f3c4685e5bd2570a78dd6e6ecb5e81fd9bc42d5d7c0d92d26d8e0b10e53ae5c03e7a5e593d1b215e5108fb3f8bbb34c905283573cae4fcc8e47715be47602eca6a737a9bde1a236f074c7a96c2988a5710ad67bc54285d6a7127020cc5fe0b61d9794c4f9d15a6049db0fa08af5b3c968af66796d4945f72830fc64cb83cf1ac56a38cd6135fcc61091e63ab230663858b2690e660b80151b11fd43f5d81321b1658d2efc8cc9307d0450de114f1c1bb70d0f5672c6a2473567dd1bd3b32b81b27c163c36c9940d97e54788a3c9894b9ea891520c4a1b3bf3ddb97493f10124cf9508b85a0c912315c158f4993cb7ae50b8f1e8cf20c5b5efaabd934cba8c7cc56e2bcfa1855a1fcdc5e18379f55a648a35e8e6a4165ef80b30bde051e6a53f7ddac41d7a8ca51ce86c18dc42e4b48158e755deccd9ccf854ccb1af4edc4b97f259c9c6804771a332a32aae6df97367f5956412d3d5b6532aa65a226637d12c22dbff164dbd2c6e2059f77389882ef27b977c77a0ca3cad64ecf729701e09418cde43b8027bf7f087859c07575aca869216010fd7874ef7c9fc6e01c8861475a391b59af4a31eb101d7b81f84b62eed4458c342e540ba2076643fbeb68396ebff5dab07a6da56cbc21c30c06e3ab367ef3a1c29c43bed437f13f42d44950042390dfd9c8f2103e10176c89d62f622379007e4353420eddd9fb3d30b7a0d4d98e8f05201f5d3bfcd6f8cd1b59b5ffde8d4919e405d45fc49525a8245756392da30402756736ef5ad5e6aed9c16237e5e0495f29c07859b446e5704999b0b9495d7619068a5a3868a0e2ca50bc833c6cb2be1ae7989e3ed2393b6a62c8c449472ca624ce78ec300c0a1091bd8abc05e0a82c9505fe542e25d9082c9ee70afc365bee5f62cdaf04f640a3985005499901a345858821c6391b6651bcd0d6911eb09f544aceb3261f5c97ff04f4a10568dcc13eb2d91300e1f13ce4ceba6fb7db9feadd376c60f67e40774eedae08059ddb7b7ea028db40b2863a04463ab551e823896a7cc44a0dec4c233f7cecd838fcb3d539496e86090e56dd7b3a531f9aacca486ea4682d54d626385068d2ed902bbe0351a552193b51f19fdf8ee5a0e03b240e32e2a22c80b230c599b6f5048f5bd7d7132473f9d0d7eb22e4114be65d46ff3746f1e902f2153e086f70b6c75917929f790be53375f01c50b0a116a3c7c047bdbb17c71f716408d92265a552e3a1d4b980a2c12e814f1d4887492c9111dcbc4bcd283e34bfe0c62100434decd930e85f3110e9071bd6af3a2fdf6fb3406eb26174733dc4a31bb681283f2ebca15a73d0d798cfbaf18725dfc8737dd8213409d33cd769a3cdb61fff28a19b959c727d42386cd90d2499e212435d832e6e1fe76c6dbda5ebbcd69353da97e306f0e25f0810d3fc691d9d351914192e69e7b34175826178dd56b160f30d219d9f594ad4ebba1f5add6d0236d703d998afbd309d4683c0dd71a52e60779f2360ae49d94cc03668ce9efd3b64f0c66ecb7e5172a0352f80e8f3ecbfd29a898cadf5838060803ff205c165e58a35fa93173b3a0168e3f70681096bcb13766f2192dcf0fb7c39e0000000000000000b556210200000000e845312f0b31a76d81d74ec001954a35944cf631c613a3a3284bad6a247e6a32cfef00222fad38401ec744117d4144a00e5ef4c257c3dca875287f23760eceb1c84bd851c34b6571f59b53dbe4f330326563c9a15096e7b27ea185ef68e8efe100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4e27fb1443eab00e67085843f89f6737676eec83bee7dd2aa361ab013d8748963187b40ac23c8a5615ed885aa96696cd7069840c3f8cbea65fe94eda5a0a7e68d685358e95a0ff027221067164bd6c53159bee9e4d8fd71d40e9d67259be8f8c02a675b99b01742d6ca11d00364593a1bc3e9066831758cfb7243bb8c43f839022b16d28e00e1d2bb8f80494e2c8ce94fbd84c0cd38c3bea36673e180c65136dd031da637817158500af671823215e18facdc1cd164cd5f812fed1498b1e9d69e9c0a0295f3a6679c4114594eefceb56540d820018a30cf38a25d0567e4d1bd28f7f0b73f2a06a88bfcc3d295b78d5549bdda6de83e400ce1dc6c8855808a41b03d6603174a809171e82da41f60b7aed40d90d29eddeffc1d29b13a6110ab04919c4389022089712be444f44ee9b03ca8de61081445351209c161a24e00254dfb88b3909a03136f5638ec43c5d2888514821697f3ce654fda7a386ac68cfe0259bbdb997771030d4efedade8a51f8c01ec1dcc1e4ca9ed8fb9cdea6fccb8ada662460f49d2789030e076939ae95ad34f684e4ac5de18cb756bf37b21c27aae86f37a96fea517f3b7a0e0aeef6e29bcc897b4b57ad34d0b11098a658e41775ead485318f903417f9a6e70aa5098c2219d83e4378e773538ba5a76d9c24cff2d2f95f0eacff9cd3ba3a1cb9c85c03198a09575aa760293446d8851affd65393f01bbd1e2692cc1545aa3bcf1c93001c75d6f9fdbfefa51437f7ec0ebb9890c7a14382da8bf8b07a66573948398cc70ef4716050cc2629fb7868ac5c6155e549cab24ec61e954f04ab9bb712e2fd29efc7bb091a1e41a34ebc06064783ae4e5112c124988287373f5acbc875f3cff3f29e682aca78d1f96bb2af219cca25ae316f1dbd79a38b74599e6ffaba511045067969daeae0d5d869ded030c07f2e07bbf20edb48f7f4dcdb1b8421a7be53a8313c3a5316da67b54445e104a24c81381d44061c5186cb677eb90eaeb5d933f16cb16a3f340dd486337c51a4c3abadf0be7756f4db747ecedd206182227dbba9dafc40fb0b2891840f74e12e9ac5c45f733f9d980cf005bc286b3ffc1033ebafc91a88909a31a631324fd8e2d1e6a1e6fd30f4330f053d9bb2a851ba8e6dce14040e5162056dd541e5e6f62bb8b80a48b66d5424d4e6692d2cba372d4dcffc08e2571d25a5a420408b631c18ed152f71461cea3115055de3aa4cdd1d7d5c8632c5222024b227e54ae313ca65714dd513659b1275192e414f1bdeadd6dca43ee3c3fda4385695efc72db5a7b45d6030e7fef9c72357b65a6835d412dbcd2a3a2a471dac43aba2312d266fbfcafc2b2ee0281796b7311fd798d6a539d91fc0b2f7e8c7a4bd10d82d040689e3075b327603684a0e1df973624e2184b45b28d7ad200cd87c096a4378b2ab19deb79c0c67084511b3682fa980b5a293e10eedb5c210cea4039e1712ad048c22a60922eddef17d2f64a74bdb1cb83067b27ca0dc55bcfdd4a4cb38131e4b0d24c6b3ab0d99d17f5f934e54703a75d0fe5bc33e14e37e5e0a922d6d57225102993708540bec090b750792db7e37ff462e5a0b588c80066be576e13ec78beba00ac0ea6f349f0d5bcdd53f6f0875909b2fe66a439e1ca94283cb9f3e3bddeb30c90d8bdf69a15e790cab1490d97759383c1799d1df47afd91381703d1532d321b76b6e4520f108c8c8255434addf7e9a3296d9a39b7e21481cb830b77ef1c3994bcfc44ba0d752d5b5e9a91cac6ec0eeb7b23337c8293a2ea2edb7a026b1f9a12fd60d94976b6056078265466a2cafec5e54c4165acb47ac312c34c29763a8676872307c3f117726e4596bb1ba908bd22cdd047a2250817586f71b20c44229991d2862ac2fe011e4aa45c904c6a320d3095ce177126492ebe998af6e0dd55db60b866a79f7d7e832064b95a299f7d84aac608b503218214a67ba3ba3f8085c003e969d0015733924e7e998650e7b98a5540f6db322cd29f80c89e134670721f691f51be2fbc29fd0b0be2e95cfbcfcabb18a696d2a46006bb355a78fedae44c9dad27fc3fb713fdf397d0f764f09866a3600d5ee0fae94fc3198c886360728e97f48b8a4ef8ff550b39bc7e38b94061d39485c32493b151ed878e20173abeee2b4ea15d64cc3c5ea958f3628a8a5cadce2255acbf135ca2cf253f05d0da9590b562b14d983977d1964ad146a32345833d0952a01de0cfa1da179e18f0a9b894dc369db3a9ec4620452a3d084c78e5ee263bcb7dc658f43b4ebbe64be2ac655a3e5d618f29369361cd08678d1c39eee510e6f65389cf65575f4c2a73cb4c3f608bbbc762ec39da5c6cd6aae10ef0a7b7eab39adeddf3c2e1d888fa2fb1dfaa096ebeb8721754731dcb8fb58a504a34101d4c1193e22633334a5436f07a135b076929d08", "ac", 2, -733833542, "b01c594dab8d1c223fa3f88e6ac467ee1fb4292beb6ef76efa6d692993741794"], - ["030000807082c403020d40cae0a44eba333f49937568d4c1beea0f1a82eb0a4fce930cad7b14137f61030000000151a6ab3966b4a7edaed3005da7c39bb81a8b5b4fb0650b27e8b964948b6c3e3bb7bdcf01d2030000000151421a839e046dc2ac0300000000056aacac6aac9af225020000000003006a6532fef200000000000900ac63655251510051906fcb03000000000865635253ac5165526ccf52bee99ada1b01fe5de5050000000000000000000000003e873159605c07fd87fadb8efa2841812554c0cc387fdc408bddfa059abbc3d6760255de0c57bd805809a9dde0cf964e7d110fd13dba870074475b9acd4157c8218a2e8814f69471bf4512b081689ecf068df59a0ef4c621df11daaa810556c700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e6e028810dcfc220678303c26bd75efaff11c7cbdbcfd7665bc3945192332bd03e6c4c0703d264abc1115c5b538b8fde2f416d8915f1c30ff7f239436aed8d8382c8928192e01b2fc0ca0ca03fc98889d4ca332b357c55572e7d1ee2189192a43f4ed9a15a925fa8317baac9063e8298a0ed49767db0132a30e59beeda200ae00222228d08f64b9e41219ff8f438a1800cb187144cfc0c58a3d67b5ea913d4992a021e510f2260f1cb801123310b95425821f5ecb3d2a072a57c075527c755a2ddf90a019fdd7d69b6866ba949260b9a28ce62f2ce61b82abb864811b3681fbbc0257de40b16bf591c50ecf8e7b0a5abc31306ae6993d58551080112595e2d411b0210031e8429f57a8112f6e400e6c7f01738e33fc85e8861d2f8f0c2fce71dea56a3fa022afe1108711ef88a21c323288db0144d1aa53b5af67c60e03088f40a0a1b0f54020b3b436d89d02054c8a71e618ed2ca21bffd424f64df2247e0844c8a8664414f0219a69a4d024df6a5edb488fdbfe7984ae37134a82f1a764abfb201e958fd899e0210891bfbbd83c9506d701e9d65ab4da018278aa0a068bfdae1f972de9aa011a663026a2acd8cf25b02b59e7a08b3e09188f8e1a941c361175c06bb016336cdd2385e12e6140f878f04c29a6a2c3a763367b8ce0250001785d63fcc5c84c4eeee0d675ed09a9a35936c7b4285f734d02172dfdf73ffb3f6b20ae88d3f7303762fb3319280f244df5487472adf30d8be16d0884ae3876f63f209d7637a3fef642654898c8b756c22b46be9de45688731baae6240da948b5090aff24a658b5ac84237d806aa7c2c991cea9577bd40cb046c4fdf9a89d05806f828dcde36bca66b4e92285308dc0e2fa611adcf8585e6ecb15d6c9873559876112191ad6cb590c1f1c6d6f175caed5d4f7b6e168643c0b0cb771c0aed3f858852531d13830a27ed2893e1fa08469f426b558045d87e233e457b7189a47e3e65f814580d032e417a410f1ac9c98371328c53f6a27e274c73591a56247f3084367064df6eabe5496856315205d7ecb0284b5eb58350eb1824297bd0e6b94246a13f9643917270d8602ac5f51a61e6995a21a9508c944fd4533c86f1144bc40f751bac43d9287e1112b330fdb4a077f1fce42e0a9452df1caccb1213d28142cd9752d9ee3a0ef1391a50af43f2c848d5b776169e81d101507fd162420fb23fcbb46554969907dd1af339be4bdc0390ec38088d4c24f0572713a7af7c0058ccf5800a609f57fe2661e439cf114fb435c8cf226d12c6874d3780a15d2818692336cfdd9951f75929836de8b2536257fe2da575310c30164f34cae55577646bc2936a402a8dbd06d3ec6ebc591179e6bed4c430f9add6fe64bc903ea4992e5ff26fef54aa49b035ad3f1c91e31bf7f1ff0ac47c07af4aa7a2e70e771e4318c0db0b6b6f6df63606ba2bb96f3d4b5e57cd36c973303de6d99344b3bc9f21ba9298bf60d12aafdae8596acbabfe9ac34698212d0e771096ebf73b46b42cb1cf6b95b85b10130292f75cd20b6dca6abeeb2bfebd67c46ff56897b3d2d1a3d9421356ca99f0273018c8926aba718052237459ccdffdb26408fa276d32cc48287fe894cc6602c58bf3d46b79f5ca605443054fdd84f93c38fa85e5301cc1ceb0027c768636b14e731abf2d92ee8ae0a8db33e3b7d3c154828bad3b82569c792892d24fbd279181942fd2311bf61588c706e5e50c39c02a88a8b4e5413c617e188c6fec63fcaa1f6be7ab796ad1b64edf0144738b5658e7afb35f6a3b56e289b23af10ab9f35642426a3b120a09993a6b905d681ab9578159ca47d1b452cdc852b880ae8f8f6ac4edff213f617f93fc57c3c7784ea71a32499f33427b3a8cbb087908ff208d791c04d0c0ef3891148d7c1b7a33023b54bb8ec255ced97317fb8a8d9ce09be07825c21f4af82d276b99483e5de4b2989e29664a838ee47deffba844644b9523fb536f076980053b2dd7baadf726dc675599a87ff6f4f4efffa711eced09f856928eac8a37de17594ee04ff3748fefb225913abcee864c537dc42b0799c74d384596b11cbd64c81b5349258af40138055e1aab6cc4c9ae2f42fafdaa6a3c7b04f52683fd9fec9f2846ee552b090bdf602bfa8b61909895e8a2086f7c72ce36e1ead028762b2912a3f389aa6e009abdc2c94149df6a7a2cabf2aebe5e68c6973fdbc593f90ae794441c805af0056caaaa6af1cc9ad001b2f6a7c1855c48fef31cb5c879459fbd58eb9da2b423c186d83ae15a5cca8a670a6a144ba1ef8b9b88e77374205dabe7d72980fa6c559fa3e7d0ce79e05f486d011b5e22e6256629ec7482eeea321c0abb8a7d9c07d61246d727e44c0656c3cfc3efe630c59cecacb35d8d641ef96c28e4b922269c499f937ae9474deb32682f539d475205", "6a52636a63", 0, -205822255, "4b4b7f527ca560ed5a6b84ffc20a1081ca92464508fbdacf84482470d1f55474"], - ["c650551502c7051fcaaf02f3ac7626d904cfc1b252cad89e889e6b5b9d909a5548a3c520ff0100000005ac656aac6affffffff8c47ae4e5d8a0cfc61b6760068819b4d88dc1efe652892ebc22bfee176385d920000000002ac51ffffffff02789a8004000000000951516a0065acac65002f78bc0200000000000000000003000000000000000038cdb604000000003215197cbcfdac51c19c34233c13d4146c7614d8171f89242ac6d3837259cef8a51702d2ac94d710041ce4ef708bbc6e69d4abbadb86177d0cd7deee453ea180a886ef8226c567857e3df39c1a4a450a7c013bc65f6470d9f63fadc37525971e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008cd0a87f1347dc0435d0e8d9980f47c393288af90a5b223aba20ffa365a3261facfa1177c257de4b87497cb0a470f4ca2f3c26f745089faf4a8691bef1a9b1a496eceb55c7ebd90a00e52e6e60e1a27032096905c5b30e9ea2ae64a974e224cab9ccf5bea864859f44ac02a0fa50972205b066f060fe88c0d470cbaab02b7e60217a3dcccfa146a662fa6bd9fb2af2793623622b8e77bd3fc1a0edcef69d1edcc030f02cf4485331a060d18976588d50ba4dff00766ee2ada2972ab207d39a7e21f0a06021fe2d9824aacd242b3f40f18fc147176359a469959914178d7129d48e11095b3b9e6fdae00f313fd6e57f88c342116b591653f4d7d073825f17bec6610cf0318171e90b35fe28d0bc4afcd903173597131737f012a4be141d6e2072a34f575022891387a720842c4b65e1f1d33b0ddec7b4da85da8124339a9c092b128b36ca302054ce71adc25ed87a5676ebf5add78ff725188706d99606bf9b66ed64c6c1d2302100d2bbb2b388750afa5cfe1a25e80d0dde36c79348cbd51f6a79b8208ec4f0f0322ff92f257398d6996649d2af60540f8f6ab2353c9b654dfad3661b5d6ac0072bcdee4443f751fd96909a073840c0745685b93c648354173367ca1b29b2c914a9159b8765757e0aac0583578db551626784a2106ba4d022338bf90a542ee220997b85d0a1292bbfd2accbb15a15da15adf7cac4a3ec8c28080a5b95f9806f51c5009ebe175e57aaae6e5fab94efd1eb13b8f4c347fcdb3d9dad737e063e74b113f27de08f932affe5398947da3ec2e1fec3e968949b61062aec6fa32802481f079b4851d885a7f5d91c3cc4b776b5f338413de759d7682b78adc17e27fe32a9e4d65c629980930fafbdff55a6f3b23ef6b2ba385bccc3f314ff130d2440e5254a7b8eed7ef0b407c96d7842bfb1669118046a4e8834fcba7a072e1dcf818442b1bc43563145bbc42ed798c3748465c4809b7675af9b362e14611b21443ec837ecc450068f33f430daa5863c6d7ac4bdc8510c5137061345d19899758201cb9f9f80fc5aad04a03080076df7128df955451de118baadee58e05b8c5a057ec2df6c53289031fff6b313ac057aef545c875896ae34851bb62d359fae7ef2ba893723f84ab2a0537cbab1d80d00b73561cb2aced4dbf24f7cf1f58470008b7df998fed994503e647f5fe986fb7fe90c66d9e3a9e0a844b1a7597001a6187184b0f162d3a153535506945dc2f04ed27549f4226dd63b822f9e17bd759493b4f05a8a662f5571343eacd4a3a73b05694b1549b25ab5b6680ea29d1ba0eeec0401c5ca501d86cc6ef6876ef3280b93a74d6798371459e9ffe40dade58803b2be846b3ba2d4b240c0ba9be02b20e894a51f3c7b0b41624d52b72c8f41befe09097dd8c848c5d3b576d387d301600162445c5a1a64fadcb41618722e63bdc65911f231806400cbfa7d6b264d1ef2595be87461d0abfdb0885fa3b7cc1b5ae6d15797cca93f326c1900d39ee6f1dd84546a5c9797e5481ef8852367d2bcbbc9a0986868e5949f5c9a73a834e5776f7e0d40beeb34f522a60c1ec451ae7ef41f0eaf58aabcdef99e1f80695ff7f29162f3ac98620989ff50e2a5a0d0bf39da142d67c2b99a99ac14b72962b588be3dd9b6dc77b741adcec2f1f0531370b3cf8c0d63cb52079b1e388f130aa5aedc6875b66e74159fdaeae4b04f951bbfb5cbe7aa4dc0958a500f53a16eb5fae18dfcf863252909c676764664236d24b0973f685631423156f5e8efa91f195aa5ff8806f75cece30a6617ac64f5a9c498e153f132dac4e51a0f39846320d384387b0b12d0b0f61a227e866d4ed1f923f67c199ae3029e435a977951b8119f92e1112cbd3e99680074baa4b1b4185312d2577ac419b3099daa57afdd79318b67aaa56b536a58e931652132e67beac9affb181521127a98f5c1945ba6898f360032600d48aa6242099771eb2da3d2f62b880b4149461b03ff05c6b03dfcc9db107521456d950b03c1b64672e344c4ea10a1196833499f3ef47e6b06fa741e8eb13f42201933c58f7592ce8cfd9d64adbf9eba6556e6a9f3ea403bc10b62e2be1394d33e03802cfd6c270eceb965657caad70e4e6e2e9ec8771ff435b318b8055f9d06137a74f766bbc63ea2cb088d7ab989e1713aa9a66e83778472e58eea34e3e99b1b24d98db3ed7a9ab29601086e4f16a3c639b4af895dd82e05efadb7bff12fb8eac01fc0c95619db5a131cc98c2e5dcea76351cab3eacba090232933e0ebc6eed9687ecf76d989ebbe8a07ab9000000000000000000000000006dc73baed8d4e7dc8d7aef0a0f9978b0cf25cca0b3687bda6ddb215df6b7a4c06de031b14ba69d4d5429e9f6057a75977e0de809b9186aef0257473f9e84ef6a872f5a70796fca852edd4ec3212790ced4c65f2a27a4b19dcc7a932bf9976916000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009dcd9eaa13f93fb6738f7d375f9160bd5dced36c2c7cefcc9fa69bffb5ac2c79f755cef1bfcb7e7612fcfe5a37520786f9b799c0b0e65cdcef8e39d9fd8968d8a48440c2200da57fa5609101b560a66d8c8f3f7c2365066d281f2c75ba76ce68ef7a452febaa82d8f970044b6257c8ff04e1127ed88ba8802e029e1f31eb0c75021b9655c014db6bbe5b83ec30d7cd2833c035259505223ca3f0b00422f3bba0b6021eb60016928fa231531750fa9a3ac24e8393d02177966eb0f1810ff3c8eb3f990a04fad893de506d9c9a0f2fea29ecb9538a93f793a4724099f5330db1479456c16f05d91f4579253da209805985de4f36f922421f710bdd27aabcd6405d66c50802198d3a9584d7003f0203d1c0f7f6dda54a8544f176bfcdbfc75da76e9a0b945c0316e6022dbfea38021349c8d75366677f3c85453d418ca5ad708924e41a4cdda3021d4354bc78b6a41a7f0daa90e69d4cea54cf68bf3d3eb94b9611fcd57eef4909032343763699317feba8638d8aef5f9e86a16be9f1c84e9d0d346fbea4bf7d989302245b2496aa953c9434fd0581d8bb0ae43253d3c896c5dee82e2385e34842f1874e946635095cebd60812f0c456f57709ac13a06d72829274db5b62a00e8add75c5c7a5c98af0683cbfdbace18148d6b40767bb2f2f05980aeaf6d1443208ca6cf7f168643d7dc54aee24a6d184bcaec255023cee831e5e9a4b885667462cb101972b439059937916059f023e15c825c4fff1d40b34dc8ef3bdeafb03e9deccbf331ab4e11f4b055806db5b50bbccbfe2a2699725e40d2306f7a0723a37b3588ea04c4b3b22b0cc903b09b1bea0b8b80d5e6686cd4ceec327e26387e675fe0970a73efa6862d250ad0766634f92ba72b387348cfbfde766e95c29f2570ecf9f175f094355d63a4a55439b7393248d42bafdcc980a977aad4425d8068c1bdfb03dd56e19a2a7abdba30f58f22c40009c7d5d78b7deb42099b9c3eed798472051d7717c370229b189b0967e679e2def1bdec47748694bf67268298f736ebcdbc40fbe80954e08c062d92887a0932bc2254db758411e90fe49d608bce68ce033b06cd0c2ddec7c5de3e5b5a03b12765d7e59fa1bc996262899f8695a21c9161d25d711dbe4f20405141f0d5e3827ed64eeead2772969e52fc6ce3128624c6f51d61f806f3f2a2fa5a7d4bab003afa5076a29b304c245ec5a24dd4fc006604c05b5a2fbd26166a3b5b6f7caf900230b04e685c373854783ad43ed2e366160272496850bf3298c76bebaa5b9ac7d589a9c094b3bfa23cc232e3b2660bf53abe8fc6de4e2868a04070f876d5df4a07e70fdd04994c0f032cc09cddadbccb0171cf56e96606248fc48cbd1f7c4784e5e3550e92f74742a82541e261aac659c2f1439694b9f37b378b93b42167dce9f8fc6607c53d2135b9eba373f948f3c7cc53a6cf2fffe9f9e502ce0159de3533cdd2fdb849cbcf2d40d94139a761e7dea737c66023882bc362bdff7c046cdc914a6570f0fec6d6e541f8b98e92ae769d29c56c8279be2892f831c1d7b28a1caad48e6c1f062cd30d5e83c5b138b0a6a69c9a7f15e12ee889d0f6e675af86ce96fc837d64b1953f24220da6ce8d3a7d27ea92f432f299ba5223b805b6f5c0895d094ca7f173d30677794cc16af73fedfa849bad11ddacc14305ea7ad509429b7c35410ff6a3cc31ec2a6dc6122233e35b4189a7579a122e01b1da2d85dd81e7c36b9940d43cb497cc1752db61987cfe23b88f172339d451b7fef19e4ea953fe8d61935be7bf2322c934f31e95e89ecb7542e3bc926ec5ad33c2fa0666d79a973185bcc836515732eb6feb3a35def9f61956bd7d0a5b782783a72fd8f443cf7e74d2d1ec575dc13d870b1e92980f3878911c8a070392af1865cbb9afc5a5ab8ab9f3b068c6affd272094ab7934849184fbf7adf4d53c95c41cccef5085ae63b00c171fa92831a564a3729eb9a9bfefb07557d8c7cd6780fe46d9f9690b3a5bc19906c9688bfae51aa922510fe481e28c2ee475decdc1944c5e463c84fc025f6f7be88b429367362ac49f88fbf5f47a582d0b827f4046cd159d320c653b0ee198ef4ed91f576bd151223af27ef0764a9c754d913493e6e30333586c429e67a7cccd60c8eb96ab9bf6f1a6e9bbb96824f344a18f4c6cc9b0050b63d07fb8fc304f67da80616d9393a919def4ee8f3f8a1d019a83f084b3270c1de1f11650b80c8594ac484b3635c07655e5a7cd22ec201c217fdeb17d1374c78aabadaaca98f7fa22c634eaa1888f1270000000000000000ea0c8d0100000000ce6957e7a5f84eefe43642f745cd0f4fc497954f2534045802394dc170e1768b964ba43f6441c2af5e0b96d765644c5fd77225ba65e8ad45f1650faa4e3d28ba60c89a0afb7cae0cb4d1e178322ad236c9e91354fbadca9f7aca16870ee65cba00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7b32dbb653744596997a28493a54a176b4177e0b8ea35f3beada9fe43255d83724f4e54938c2ed156a4fc93d5ae50e27d5c841165004d74d064a745ca3bf389b6ae90ac71b79ee7ba2019e27cef15f1214b5f16107f001973aea2456786ef0dadc868a8838e84753c518219764b44c86925ce591a335cca755f82c363b1a139022120f04c6985d5954cf3b3fa437fd8be383fb0f6346f405d8e0f977d8443803e0219fb94a292081a5d67d737eb4655c9de99ed69b69d832d462b547aa0b5f52bd10a0613a510104ed4d1b393192e95d58024cef7ca72263eb8d7669ac73b36441f44a029ba7a8af89bdfa237da37ebd64865540eabdbe34e9bb9102f632b6061937b0328e4d502863e13f2bdd3b8f0d08fc36032f821ae746a877e2911ec6ef8aef4bb0222baf7494f609a57c3f07313c4aa7724844bebf1075d5cd3864b612381c89d35022d5509171900a0aba869ccd21b6f5600ee67bda696f2eefa71a2aa5240e62681020dd488c8754a8ad6dedddeae80b9d9ad6b1b517939850e86e674c5b040955b5e030ba7f0089e1973032f409018cc82613a2ae4e6490570a0f8df01feeadfbd6cf0f67c554f5c06bb8adfddb1564f670b78109af7eccac65e4750484914f391eab5fbc5bfb607078dfbcc69eee4f545069e7199fe4baccc8bd66325cf4b978360e5919133fb0c2f8de6f46d31c4a50b0f7b983a275e378acbcdee2f7b538a25247c80da86f1c706789b2efda7967c8d9049ee08e30ff83e3a97c469a753d36095c40c2d4f949ff1a7a4c67b0b7359d4e87f562c002a12bbad84d27b7e0469e31cc731c2795b1f2c5049c83142b0b06fe14698c9f408aeb9fa0baa959b0ed8dc3b46c8809cea23fd23efe49738d39245960868982e7838f20d58f68232e6f3aed511fc1b7a23ee7440d8b2e781dbaaf567269ffb7314e024be81d6021eaf3078fab29edcccf4f06b71f6bf7bf5f577ccaec9baf8379dc38c3ec0c4cad534e0cf73f23832367447e5e71623f9beb578f4844a11abe8e07cef9ac04e05ecf3ca13f07ebdb0eb475700fc599ed6631b15a17f92068cf05f1edd12c0d9a251b11f69c4c939faafd7592f9825b62b3185fb5313ba97fb94c83c0bc3c94ad473bd95ee7fec2a9c19e73e4d23a74e61222ee871e273fcaf14e8b47c86413bfba2eaca7d6fcef920b9fbc2ba04ff3f176e6d4e5f2fb22ba2241666ea82a1321d020a778faecef425789c7f9e020f7d2c1adb565f9ff3671cf0bd9f265d0023a5c9ed9e392f1aaa8f43510b73995f35cffe0ef84d45b2ccd1c6a3afefa20e27381563da2ecff2347dd4cad349b45bebcac5cc654f6eb454e98a09ac546e1de37eced533ddd347597bbdbc23cdc9fa6a6f321c3d1f9c04d21575d3f2518d4032f9c320161cd2f248843a5673007215238b7a3dbe9269e4dccbae9508ea12ec876d88e8994d9e192ba9de155bd5874d444326d0346dca66e0a8c81f744b065aad51a6fcfb6eab239482f65cc0320617f251154d1d3fd7ad0ad41fe81328fe77827d4ae89cd6663f75ce4c3e47d9878d07c28c620e6ac73d689723731a1e61512db67e7f2bac86c0a8ab38c5e95a26f26f82b81c8c1ab63187605e6cf81382b36f5eb934640c7e8e9de84762c23b097c4a0aa72ffd9a7dd148d80ef64bd54be4cd0eae4e3e5935d402187749c2554763c877a14ec0cba7d862e8558973effab536eb24700670d6915ab0564c1741b55601d6f0358d8788addbdd2c3e7d78e068f4805dd6ae238330abb5f2e39940d7241c2171d44d1a8438d053dbf9ceb9fc15d300f519137916d592490dcbd012e8a106a37d5033fdb16d105518045498a7a183221ea4f5273ac1d3816a001b690151ca6044fa0c01a9cc0f59483c6daa8baf56c7543ffdf9578347e69ce5c83049f66d5f82917d2a81553312ff7598e89ac13aa3a99784df6026a42843ae55ebdb65e1907227ac78de653d55a6d73297ad5cdf41052eb60ccdb5e0982762377d6bd0e59e82d02fc0a91f81787852d769bc98f21e8a758af1a6f0fcd2b9e03c9d16d1c20ef840ece264f6de4c2e5f04ba9335569c37f7a8680ebd567541446b7e0b8aceeb1379cf81f7bb32b3437f10748409e98f9169b5ec9701470056356177ae61f2a03f57cbc6abddea867f19a8cf5a41bc9364ccdd1ca27d42bc9b649a9e36f02884d6aa568694948f9e3bb4a7805f179e92cebc7d9e338c00276df9344401222d28ab8b39f323f3de67147d0295d5245643e118482c5f6bc2e5a44a4d85461812824d91151d2153da930b3352f385e9c058dfce901234fde754ee1662feb898d92d65d433ef1b7449bc662ff8a3a6d0e450ec059b0c83410da0ea711d0fb711f6261e4e661fbacd944b1b7d638e6d93892029fcc02e858d9f631a73d8a1d94b20a0cb86aa06037fb506", "6a0063516351655363", 1, 1180418245, "f03921ccc7a7e1130f0e2aae5d30a1b13c111189d18a62c41b44d06b7d0ae18f"], - ["030000807082c40304ebf6d9db6f243fad36e10b4305218130924caea7b700ac9612018c584c45e01501000000025200ffffffff9b5e9e872dc20f4431b48839fc09f5cd5e5fcc121ff2fe8fc9caa8a7122afa6b01000000076a5251ac525365af133cf1f7775903f1d7cc2f623a4b2f3d0006b2d4fdc24b589be451b27282efea4e3d310000000006526a515300ac5ee2157fb712660dde7ed8ee3062e45da0e459610b128193eaaa1472e795cf06bb99653f000000000452515363d45a23b0016d62880000000000096552ac00005100536a000000000000000000", "526500", 1, 1921883673, "cfda708c932c5b41f689fa6ee2d3e596566a0836b28ac26fbcf23921e4103205"], - ["1c1c3260013ffa0fcdaa45a93546500ad51e736600f43a8fbe63b8d709b522b12dc7c83036000000000153ffffffff04c5bbc6020000000001ac7f935f0400000000006009e40200000000085200000053526a513524fd010000000006510051006352a69d012402000000000000000070fade000000000062589c979802f477868ee1485ed2b87942fcab360fa21512fecd3f2b5f2b3ce11f3c3d99ed8b806071d3e4af2bc3747227be6e5a0da85b72768c158bf7ce6fcaa7d52e2b99f25c2417dce28341377a877c421486ab44a28baac74825b0c8873c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096b3a6021f8dee84fb4f71e47118e2c5964f89680b831594c635614cea64c617c3131090ee2d9a1d7c988b2fef02000dc4f912cb746b7c300459d77ad8bc482f80d918596b5c8902e16ad8126366f714b99435ab04b2bf70042c738ecffafbd502a9f4c9021fe68c6e7a56012fc10ec8f22bb27234db6dc2f770c3875d476d3020e435c08740a42f88ee04c6ce89dfc4dcbd531352c7a819ea20c5799314f5fdb030f852dee64a1adc1d5643161004fb726e7569b1a22498435a1ab7c2e7f5e32b10a06ce04cb46c0487a8c798215dcd49d4b15b95ac0baa5406fff3861f2da8690b5a9cfcbdae9c1b63fa3593d8ead2cdd838e0c658e53e1744eb4def0e54c25648403297427839dfa7f8c78704168255c918c999037cfbc2536c820985ca4bf62bc9a022caea72e2e763b99f65a1e656db3806014e297e7d5ed7d21af5e0e1c2f69f922021a4177f880c10b901b3c3777360f3a795fda6a38f9a1d390fc60bf7b61f56dc6022cf95040db972141d6113f9826668c28eb2e50ef54c2ce518714b89ca1f782d102149d96b80b53ff1af17225081275581b3d1c5b9e60f7c7cd00b1297477d4989149ca362d0d150cfabc617853cfa20db602eda56d8dd1b60e736320a947ba1cdc5d195df1b302b95c52697bacd2ee491135d90f3342afb4b341e976cc212287d64c1a79360904a273c640eb9dd4dfb260a0915fb68e5b6e1c8774960c5bf3bc98dd66fe2978f41d3defbfdb2168f107068bde59f406a2dd53d3c0e67f59776a9e0257e1bcfdc3bc293de5cbdc2ba288019954cede56a84ce81147459dca6ac0d87d0c829c174392064dff496a2000f536b0370857a2c64d00e6bf402c0ed3606398178bbd3e817b932304214c189c4a58612c9557f18b6ce992dc2933e3850913e78332008bd73e93a876382d0c268dc41c398813f1ad9b22c7bf094dded1d23823402413d445599eec3e5d3199775ac7ca87c3a5cace79b19baa482c7339c070e27bf2c8c1474fc89bb00287b0d519c7f9e944eb8ffcd954b0e9e6e65bb9f66f9a36471fe52c574c9e27f1573db8a370a8b9733783e01bcd075da97b1e84441dcc60457c294b60363a1bffacf07bb382d54ecbc928e637095031b20daa4ca9f053221c9f741284c302a1ced8c6af5f26a84c3468a55b660dadbb7d2baa595a465f312327dd4d48bdf49fe1d215fa6a702014b3e50c1eed81ea44154470fd0e2af0dfee85a95263dd2865f8909de3f1c15bea061a6acb2fcbaedb47fc76b2da7192937eacfe0a595ef5b9ad25d81310966b7c902ae3e20b93e0cc9f58cb8aaa872dacf5af10ec81215a3980db8b36f2dc246abbc75f77ebf082ffc7974c4188ea114de40547c944c3db65c614ccf2b929ef441927938716ee50df4dd5d067591f73a3febdf212aca754c51ab9b62a01fec2e7a0f6e9118e8b65620b01d4395388d061c3ffd9f3763ed0839ef6aa69105b2e231bfbfbcf2467ec9e560289eebdfa793b8b85ca2501f8a210d40aff7e2e8642da2c6923a1dfcfcecdcaa002eedebadbb4a76decbdbfa130014660ce6f01c1ceb06b22d9d7b61f4172cfe090f18fbecbc5eea9da914e69282a773f1143e30c3837476bf5fabb337823257c1ac894b4d66791a79ac8959348784b83bc843627bf12a9d93dd14d6dfdc09537071d615862c25d20d8ff2175cacbca8d8eab9ed5ce7ace0ad65092193520fd8a56df2ffb32d7f12be35d762d99469b4aa7858a3c7e9d7e2768b2835cf30fa5c3597046c46f9328c123c77184e34a476149fab1dc820a45923d01da5a85d0ed8ac37b19d549a47f2691d473f0c5fc76c0aaea1ab9e2b9800c8f56bd232230e509fa9db6b8bcfeffb47f99c0aec6a97170e23ee1c45d1dce8dbe31ceff4d595bab7e4feee4d6dcbc644a4cf4e1b15987ff537f038e833f600cfb88306fdf6a5a7281507e6b2f10213cd47851037bc76d1e90756980570e5e87f3bc1852af59869429f57eea114b17c40fbac672dde923b40843de7cb25a8ece6339d8992c214181ff00010f67a4143c3bb8b7c5d8f0ee057f2a2c7150acce200daed33baaea6b4fbdee7fc5cee7edb0e7c59148635866e5d98adb6db9e79ce84ed76d15310dc77c7c040d1013b043a8afaf1f32d1fb03fdc3d20fe5c9ff9afab5e1c40d978f3fcd8bc267031ada8364476a41ef728b77ae606734d0c4adf7938a84abcc0d889a2a430bf0596e2a2adde6b98efe1f90fdc2e211f756636e516f1a134bc5b68fdfd80b23634d324e7cdb7eec43539a89770df192d2c13eed00000000000000006fa4f00100000000a9ee3bae06131ca9b9ef1257ac94710a769d9328c7301135a0f9b2be6212f52c13e93b2310777f9a6a95e32eaffd664cc5ff4554ffa36761dbceb316f707c9703ca510559ad1ed07a218f566c7f6541924ccbed45d3fb0471d92b57c7759fd3b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046f2592545edc12c0b71a13abe49a04a9b84efadad7d4e980852c35d2673ff3d2de2379576780ecc8dab429cb686a93931ac90bbde81667cd940390c91039139fc5cb19f888dacf5460aa1a35447af3c83db3519b268f76dd5f1220e5d71ef39c40906a072f6b75b3f09ec2a187c178ccd736b4c741b83a8a826f7ca6c383369021183c516198abd5a7f453b0a66e07cce45a040d9af997135534f2428fa1f7836021f3ae61af2d8d9178015ac6f11d18cae54b0b05f0a12948695c9e861ec2c86810a06b27f456b294328e109569c0984d2ce2ba25837081a006317b9945b347174fbc2a7ca2a0ecb9da15b8b5a65a893a5113e406a04f32dcf0e78013519e72bf9140315be992b6a993146c6b09d8e2acaaa0c9a204701d6af11dc07bed6b3f17712eb020f98228d17b7c0f87de50a84d39e8b154625b5abbb5128adaecbc268c57877d40323ddb0c4c0f22cf27f38bda7301e0303dc0793e00d92de429249ed092136add5020e641e266229b08a3ee24e41867d60ad0e6cbb203a273c9378b3ab9b5b3a4e0e0228350fc3f29f79a5aad2b0595f6e4afa5943a07724404cbeb8c676d9f677c2e4e595cc6584565ef9536f26a36b441f993b918fccc59dd94cdca15763264ef9d963666b025fa514938a872bc24af89dca69fe440fdd9b2582dcd6f52baf856b51652312905136dd308ec40521d062d9fb973ae6be4bc48894721ede4025f9936dbd7a48a2c2edbd322e8b96a578025cfa15e0027db1a80a45f65dd119dfe8e291c9be89cad2458cea8ee1a1b0777bbde20dfdfc1274d0780603ee19932d8c52b9fd9224c04fff5054d3aeb8a92f1e5aa22f2bca2b85b64b90f54224a946264753becf7caa56482ee8f667970956ab004338b0363853ed38baced4b4b1f4eaf31597def26d58950f5fffed2c64bf52de15c2b333693988b54733591028dfda81e884fae1219e004a82ddcf01f826f33b3747d5b0ea634bd715d825f72c9add4af3466ddbd05074883baa220c71dcc2b6495f0cfc592f0ff7a0a22b594c51a0a8050dd9af79aefb5f7345b4727dc5b588f7cb9393e8e349c542e2bfda4e92c5c3564626f13be8cc501e07a2c058706006c5d0adcacb818b97722c3c68c4cd81080fac3707cab26b6ba06e4bcb35eb00a6e1b9e378d9ef97a54a269c3befff2f5b874820e31bfe38e74f20f412f734d70719f3c300a1f619c49112e8d0279aaf715567bc1375ce08417aa3fddf350a99437f1aa58ab9231cf00c10b91ce041e416131e00a07c7b02f803b268354cf08e6de4e3c5da20e4045c44a6f1f7f73f4b504ca16de43c989941e33ecf0c6de04126bb7fb1041659d48207cafb35fd558fe1a725fc3e6bd1109e9128bd5ef5586d7c0b470a5d3cdc72b4ad94af2c0f68e92e09639e5ec4f585153a391ef8b84c1079e4a9f832a3c7e29a39f70c0505bd1d707348ae5e1c64cfebd0ab6b2155c48a1270734feb337b282468b1184f2c85fb9649eef4f1fc630c9cf1d7095bdf16801fbb191b2be9d157ac5955287068d56a724e81772d5e663d055a6ae9189f9c8900b9e6fe30a340c4a51649e7eae48967f2105949305128148f668e6b177ddd90017318f1e555367041868a4f5337df911d20b2d266e791ef996cbbeebd10db3146255e041e253f0529d341a811f85facc110b8e0169aec2384d63a4554f9fb3b54461f9042277123d5b10b43786b6c494f3d0d06c3e1218a01586d6f88a72e27a33bfb25b406f44a35418e354c2b4820e6dfc575bb83476d8c61a366741521559ef7c7f8753ed615e39ae071433749aca4d6d9ac34e71449c19af5b66473a41b2fc817c9f1aac695b6ded909be4f8e5667a9b305febe92fb6b855722c81848ff20f2da0f9e2848be248db39d719da4ba521760b8358af9a612da7321d7418833d4d8d81e2e969aaa69f62325f56c95654ea06833448347e88c906a6ba86556e86702eee785fad7e6586d1f7aeb3957e24a10dfd89ead3993bb026e96c7f10a6d1c1b0f5327875862173999ff2c83e8a6c5186c56c045720e391c7ec58c3ae854f63d9f61820c74da24453a99e8e8bcf4278e987bc0df43f7a3a8cf03304e361e6c5a1aaef1b4a7da7ba7c09805c189780a0e762b284e16bd4fe9370df7d206f43fdfb13ea5ba4034d4509cef93687a1c52f6ecb33c017a4ae636ae722ed294d9c680cd5cb7007018e0e6a9bfb2bfd48ddb19157828cc1a0307ccb98e6aee43ee514c8a954994bb555df70abf9d508222d58ac1830a09f0e9fd2d5d117c7d66f76d749647e30f90eef297ebf6ce3caf5b949b34350dfeed276be8951d9faab178ed77cd02d415a73a23b70723ff9dc047e4c6ee74c2e2b6d6a293068bcc1bc2b61f42b3928d68f8e90a40a7ee2777253cd5221cf0451a06b16afe3440a0ad5a325ca89806", "52", 0, 1611755130, "28d0f940a350016aa13537993ee9f558f1cf824e6398ecdeeb10cf63638aab0e"], - ["030000807082c40302df1bd6a2b5cd73feeac762525a8168134a9ec09cd55113a2fc91df7bec97b8df01000000095365ac005265526a52ffffffffa976a0e2670e111bd454b3f8c0ea6bc16bb25534f5463d1fb1401f6a14420a91010000000700525363525352ffffffff04274297050000000003655265742a7d05000000000351005256447c0500000000025265f5b791000000000007ac51536353006a000000000000000000", "ac6352520052", 0, 210685970, "1d2e05c1d4e37359583954bc49ced3c28af363c2f3e03f594b4598ba26410536"], - ["a012753a03878bc70d4bb6ce9dfe179c65da8d58fa84922f52732537e756f7c21a0a2983f1000000000265533c391f50b6bd172205ed743d62ea831e576b8df1c8a575e2386cfc64662a07e49362ce10000000000153f52a888d923116fba6ba622b0a4b753f5f18884ef1dad0b509d4987b49e421563334c08d010000000015a9047702cc3d31000000000005ac52005351641fe50300000000000000000000", "63ac5265526552", 1, -1494471707, "19e4555837dd74e837599e382a3054cbe18adcf5e6b122e708d3366472b20221"], - ["030000807082c40301a5f8705d674dc7c279bc397af76a32168c2bc39f66a2af3669189142bed296980200000005ac525265510167a9780396d28302000000000852526a630053656a9ab5a30200000000016a61c80b040000000005ac65ac63ac590dd7a05c5d49d302e3450503000000000000000000000000aeb019e375f76e5ba2f045051c524dac476b03142292c5989024b8de21225948da385a1cdf8681c13aaacff5d99ecf63f3d2e47977cf3aca3d5b1e0a10731b4aa280a9864bb9810f29fb39419629502ae64f00c7a0e22c4b8b2b89a7b5d3c38700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ca11b4772bc953731f4609c2509905d4fd44c11e52360f7ed0c4e3a410dae349253a37de723bf98f3e37e69ef44c5bdfa9e9f768095d0bd808aa99c303b59282a882e38e0c56efededd9abccf27dc4ddb648102e74e8b4fa9bb4eb05973e8adcf252001afc463d33f54442f39a4c4465e1a11c437de1431f8711a1eb9bed0e27021e5d748e9a9ade7ca4a94a8707f6275fa771ea7c57989d0287f0d439704b137a020d390ed16b152354e69fd9c25e43e79f90150006ef9195c476b5da6cca78867d0a01c8d54286326a9020b44c515a9ee629516dd6600636dc57963e69d883c38e4c32efaaeb57db1f8615b933b0e1310843c3e8a12e8a10907a0021d0af44fd760a0228c16a305398f0b238ebf1a5625049df514d8075bf38458dba0b33d7104f8946030fcee73b79132913e2ad699e6ea0590f3c983c87d6edd80ea31867600b751c2503072ed99ff6206e520603ade5a4fec517c2d1abba2eb4a9094c47dddb8532ccd70220a9130fc245bd9151484bbd385f21bcfb28a68088d18321b9fe6ed96b8a7d2803122dee96efe946aad2f6d56e029f74c9eb8ed1d6f2ffa86cfa5cb00e426baaee1b5aac82e1db2cfe148144e628282ca1f6a8f7ec81a34f08c45466c63bcd3054e41f678d74c4fb326b0e203403c6ee1fabe188ef107dd5b3ba14f2679b30851ca21e653782695a686587bf5efd69c4eb83d99fc35091e0b11fcf315597d5b9bc2ea231ab4227cf670a4a060415eb9c912b6fce000a7568551b80dc2a9fb85241dc07293d3d8e52eb66357f6048756d2b68a8155798154412c0c3c0011a1b7d11bdfd53436c77fd1c8a0b8350c6f8ead59766303d27ea7ca6d2879c7809c7b2cae51c3aa21f31518690e713073e5b6b4c5ab9560094ed61d5f9feeebeb807bfb2c200f0b649104e7372b35db0a55dfd869316407f7596bf8b616c57130b290298362b0780f33d6d1ada9d61ffa009c25e1a601d260b2ed5b6b5e4ee9c42afe570b076a88592ac1d35f83cea0f6f40c123d6ead7dbc707e52407a2d78e8b9a65a1d040e13616a496b8540dfb04f0f7ce0c50456493c0beb1bdec84358aaa9dd5bdb2f1811fc61097233bfe37de73fc0e93031681b0a3a89488408ed18694af112717f95f87ab9b3f7ca97f4f37b5ec84522d7428e23bbf6e710204fc047d153b1a3ca5360585b0d675c7fcb565844d10006e9b81a5c2cff61364873e4def87ee32e104dd0b0d565c5847554af5ef20169543fcb6d90b1a93eed0de470c92991be9d64b3327549852d633525f6b502563e1084767567743933a1178c2814b50d0a28a810db38ea27cd508d0af807a23d2747aa455f9a509709598cd4856f9d99748196d8b0d0de56d7bc77509c8d05c60813c12a8ff8ee1ba1821e9c9929c817ff53f143447fdf229fca3d75ca5e8305c533481621cdcaa22981503f2aa361983bebd5a8f5c1588445dd4d89de6c02df9d60c14467e0e3dde32b379785a021d4d30330f6579aaf9ac52536f116e4a420d6b719483964ce391279a5d017a260ded55297573a24333094488db355319d67cd71877609d672a3a499409597a91e1f430068654ee1eec10016576337ecc0c97cc974690a562a42c9ff5489e90e52abdbc84d9e4e6f863012cdeb832c541b0354f8d00080463168e62797f11acb7826bbde3d9ef700159bccdf223333f3912729ac3dceda820522d8caebfdb8b816db999d5353d00ef4760b6cc7da2a3c7e02d7a405a6bf460368919d19cf03231a959e74454fc843e4983d725efd84eb6c5f056cd88c6f1133699ebf2f94a09ce04c080a3bd7de77df37836743437273bf7449c71479376c809fafe1cf9ef544d8598909f509758395f35a84c509a921bd7a062567bef86e72c95f3e732017ce0956536e78db09812c479c6f57cc3938b7af1afcc7326f8a70100854895bf5c29697ee14ad9b9bf62e19c4ba7add66202ea7a7552c2638ac297c5e6e2ad49e147332a6bbfb6a5b833bfd27627fc649d48a5ec71b7ffd59f06f0c11b33e3ded95597f7ba65ba5fc6ec289e00c109049b80212ee18ab5b8d1f7142914cb70ee95a3a84477e3d53f30196f06ca575352d2abea1aac1b6c01109dd5c6bca9608cc235508a64c3282eeab19a747ba1f30ce9c9013236b317987e15fd5a5a69ca7e33802dfb547ce1da5237d79e4dfee3a28ee955a17c7730cbac0bcdf0d97f88f77d2ce38ffe275a57afbacc698ae13c7d5419c28ec3520749ee325cc318eacf37374baf308e59be3780e8a098ab31e1e7abea006413030ffa92ee000000000000000000000000004e46706acf8063e88110f06f7693933c57fbf714ca84fab7dbe457a0942910160fff86f3b7e0b16e77dbd915f67f121422866480cf31c526de2f0e730af303d7cfc4e5a0b3bfcb93264f1ee3f8a56bcf5f2294b201c18cf9238c2e8bea6ff67a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0b8ee591a25aa2b8cf03d5e7c06e4cf5fb7f71131266aaa00c19b742513073d16295299dd425ee1c1b6992473e7ef29756c83ef5e8a454fe770181b5bc8c52de0d7f01a0b906ad874e445a0881c5558dd79440d3fba0ee6298c278bc46d892849aaa5cac0db38cd4335b62da6102d73fd1131949653b0ec0b07660f15f732540227d8f499a26c16cb368865d17f2add6c6ca180ef6d458a99643742e950f28153030b4055b9bff3d11f872727e4e0cb852ddee5425a9e602d835ef040707c9b701e0b01856d96ba79e6051282faa3c9cfcddf676496aa8e4a889906f480f316491a26669d8738e113616e9da8752fe6c1270769c72ae972a151a7fadcc8a8f350d58c020a982b095592707f751cbe41cac46bd7301610f7a67c908c764f358e660f18a8032805efcbe8dc8fb23de1d0fcc7ebeddfcffef6e0c8792f18df3d31f7124f4ffb03296736a76f627db27f51cbe605b58837ecfb847f3e77c6cc5734d02488bb93c6022fa18b6d66184d97163fa9af8db12d842555a7998841ab27cfce07d0b6e24581031d16e0fb2e90dfb59e705fddadbc565026f08be1d1e3ae5a731a6019f8b42d689d58cea6ac4cb47891d90e55a64c309006881d6c52a5fef2ab58898e0eac5202208923c2750a8f48e1873d5c5b6e8aa547fa91a490687f32fd91d6b6605dc6c44638c5a5cb855cd554eec3461bc6efeb68e6fa8e1e8ac5fc6d6dfc6a64b09bd80c72c9c76e2033c9209b15baa9da7c6453ea3da70dab52b971aa64fa940ec5cad5f12c0d3df2212bad2a53f0a372c43262e8d04de1ab6105a54b04be96012f1dbe2c58451c452f6254806bf1ddac0fab793e5e5846eee03b491579d529993ca0fb396c67cc31937ff537d21f8bbf50bb9b1039b2f859a450edf4ffc5b79e5603541f3d617a178488bc34f05a529475c4636292bc94d58c6255ef5d36a77e2ea11e63009347924c6ee68f936b1ba62f54f02e9c702af8c2da7846d93be3321acc46219e52efab6be55c215f1a6fb1ab9f95186e19cd2743b7caf83884528ca3e7d41095414ed7bbbcd9f614663a15f0994002e92389c266a36731130b22a5646a75a14a41d8826f9e122f5c98d77059f79391f0cab441c2ca08f803cb3ec53889392e6476b64383289b55317916345b9c2d59c1d79ec7cf6cb654c04abdd2d66edef4613fcb85894484d7e7e708c05a9482af8a7c19f815128306a95e3f5045df1d94a742355ebdf7373d388bd92f54b315c0ce062f60ba782f5b2eab3e34bf4a77aa19fd3709193cb0ccd66049a3676c7980c48047ae21a55394e099a8ad8cae3357c3d31c485400f200e076a9dd0ce1e3f1d06fbf4be4076de8a290911a01d0e45a3b37e2cfcf806090b20212413caec803df6bf0fbc45aec1ea06219d36c9f03da104aadee310df7e328f06ff05a90f691f64c98d9b90d62a1830f5fb581123e6d9adf186082487d2af0016a8e97bb0288a67e56ab032b066a7879c84f1dd8beec6faeb9067e8a65735ec9da0144e5cdb9d8cdb6f2760995c26d4e59aef51fb730a53e955823e2cf403d1ad0f0c20c83a8ead05cd1c56c544528b550a6883d17ecb24dae565d0b66d62c2be5b1e90ff172e21091c3bee7175c573f250d77297c1faacd5f6ddb03290ff1bf2cfd2016266437a0f7d66906e61192a83861b691d04fd6be2751b22fd49a8b59a356cce7ed9f1b1edb1e16f54b38850d07909914f21951e26670bb3e05a4e3f0f98ce062d4a1d934614ae56c11fb29116949cd9f94ce87a838d5bc80e025884161c2b4e1a1c47146a2e31b44289272abdeb9bf2ec1d9a89aa0fd536f45c0f975d9a549e93488f8f2f5d4ed4355cddf96b1cfe22e63f3506e5f3bb6a7e9c8e433ea28066ea214d9eb2fd9b7b0d0ba0445853cb6418945013ee9cb24e006920285924d25da842eb1d4312975cdb9c50637718c8e97b20eeb1f96213812f89503ec7928ebd98c46088936267158ba48179666337ccdc50758224d23d81ef575ddd0d40d1eb82b4ae6f80ec8a64cc1aa7fd2b79121f44d830d357705a1f2f241285266dcad7d8ab74feae6bb4bdc89dab65504e6addd980f2d282a99a40073c21cd7a508edb7c3919cfaa3c55fb90414a20ea748098ef1d5a10704dbcf7fb891ebf5aa5d0d8a7a39d8f03954b53c9b77a351e1951887d76f4c2cda3a7c0d2d7c63cd2d6804ef1dda158c80660dbf5006f0ec27e3dae59de9971213565b05ae7b5ac6a0783c9bdb0c9625e3cc5eac7d41364196f5ea0476bcfdc964f8550800e3a6fc3f39a971fb462a0b71912ba4fd527be4806aecf151ea4c19c1a50aa3aa4195d5486aced0b99a4e11028ed076baed47b7dde2245e5cce31064df32888d82b1def11b760a0791697a439c4f7bd49c8e8484e1ba7348070aa2ae1180a81434b6e20968e0b713a0c", "005165516a0052ac00", 0, 869088223, "152f785a22f84f52b5f8cff56a5358b1873fcb3b76a9142208452a276675e6e2"], - ["56bcbd3b02fd55f3f9d5b03b59345a04946f8659b895d712491a21d408d842ef58cb424b9b00000000076a65536553520075efa458766eaf9f8a4f895418de7b34129ae769eb60b4a80f3573bea043356b41e5a29e00000000046a656a6affffffff04ec6d170500000000045153acaccb9bc4010000000002ac52d7567d040000000003536552018a91050000000004526353535ce9cf4b0300000000000000009e855b010000000072bcb734a5d6737be7456ae96d4e2d39d41e452de84eb620a3e3dec041168a7ab43e8db5aecf962189732220a205d3e6042f7c8cec7cfd3e9e6e24e5de0fc07f5fdd5fced4a1590ad39c9bc922a58a9b0d53350ae7facbb2c021c8ec508508c80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072dc3af94c801849fbac88a40784786c9346f53f3a56b883f7f63ab5f14defbab796f49b819e1dfede3f6522395da7faeb4a1376bec0b553a3e6af577a93a429c649d201630b73918991f957479b14ea02f340fc772e5f56b090459258091a927c495d5e7e8e8c4dccbfb6c6f8d45a65015ad615074c7a17b6b19edc1ab9c343020436efbd66122499916c71835178ed6e1edda1ce27af2ca7d26268a893ca3772020873d3e542bb708064826626a2c5f1cedb60ed3994309ca91ba9b39020bb60cb0b052ddd7ed1e19c3588af7414865d587f580abc0f262860451c2c4611af101e9b38c03e7b3269e91c047d9558c8b54b653499e57c2282e6667abfd37935f5450f02097658c54b0ed1c68a42be0e1cb5644c9cc5471e2c3403d337a559bf87920e130225885f31192800d8dca8ae4fee811517211bf5e5f3060a4a24a0b0d871ab592b032fe6a274a6b75c1c92c17a5af438e9eecd961cfeebbf263e78180d1acda13e5a0302efe1eed6667e851e47cf5333db6f985ae336a8858500a5964678fad0f37f12031c6b95fa4b63946a95e8c59d640462fa7aef56ae5377eeb14ea50acc5ebff83f8b9211ead4ac37f9b444e1c3af44b15e13442f023c83ddd93846b4342191c9ec4a07dda4210d9f9638741d1c56bc09ca428eda00c16a10f780fecdce46211ee636503610a9ae9ab7c6cbe92f94ff5ee1cd1d776f63bfab4c3f3fd9c1d6656c0f263c4b87fcf4f4dc31d3f5b1eb945bed255807b79e90142e6bc801ad77015c06d223b2e58d08507b49e2fdd73c2255b3d2531eb97077428d4ffa9a7fbfe74dd5a3116467cc7e2f1cfb56105e1d68c3d4437fed227054ecfca54ecd9297fd20e7e79447da0f59d5c1f9782ddf8b83ab4b3d031d4f6603b0fc473082586bed769be12da30a1231c1311acab6f61c06ee6e8b3bbd2a6390e3af6d2f62c6bfc7a45d007a3af449f38ca39f3abac653a5e6553c42fd98cc3c618bc4de686ba04681b8cda6e984e3eafe49dc46c449a45be620ec842e08e023c63c206dd582339da40382e5e413f9a19d99d8ab644f5ec631e5a1d410bc0d9bbf779ba381ebcdc6b7fc327cd6d40ce3bb1c5c2e09f94ea5ce5471ad4e418e39ac73a8e641971c5f64fb841e8ae026a2e6a0f46ba954450d027b32dfd5a72b2f4dba7a6f1c431ba089da24641318e31b1761d2671ba0af2f8d6b6f75f4e12a72981a58a2866d43119a2bafa28d57cb508614dfd88b7622102fd91f633083c2803d128dee7178437cb07ae78ac3288dc7993b2d99ab061f923b61428021697bb4dc869afe45594987315df18757b9940c4dc67a4f70d36055a42ec9fdf33377e625fbaeaa21fb2acf0ce159c0c91e6fb6cf31f7b409653e8096a314a9ad5fed14ba13d30a64252d5e0e1aaf497673e77767c03ea77f27b11de8d22e0503d78e42d7fd356e5359efa2e230a3febd874f986f48d4ed9ef0b56e71af315b796e471772f810defb5893cbd289d79070d91071ef89aea09ee7ca2fa9fee1fee45d2217e76f5bba9836ed9c186f36b1bc35d685d3f240626499d21ca5eb63416afbcf4406ede1a3474e6cbab26b25c3eb8c63db90277200ec0e09fe1a4df62fc9da15bea89bdb56158e80d01529f2a65963d0431240ca0aa14612fab796e123631b5b7aa7d95095b8e2588006dc3812615f32e20a599f31a24e5389c315d15b03482819f1d5c43b862fd611c5bae1a142eab5df2a14dd9deac6e7e683ab214be4c32caf17ddce2306529f5ec6218ff31068b390842d3f69b1990b57d4848d0938b14e5441d6af71301f31cc65be5f96c28a11f2c8c62cb18d6e59488f51f141ffa321e9c99cd7ca60fe571f3ff8ca106f9363d361732a2509e76def3be9ce79ffaed7b7e0ee605df709ec3addd5dd41ef0d37d3e94f3b2427e0beb7c2ca351887dfa7e32d694706c15d1527ff54e7b120a356ab31d3a6e7c6be8aee59f34afe0ec39fdfc3824c1a70e5dceedca477b1d3b73a9ce4db1d093f12bbf09d6ee264387f8cfe998b4b930f1022a65fd9aca8e7aab983507137ab7efef165331fab7f0f1d905c478d25dc45d9fa31a8ddd7ee7f499006dec0dee86066ef72dd5a572f521822cc922ca7d6bf0c59552018fcbbe538cfd15b665dc0337496a34a19d0cfd62c9a027239434c56acb4ef382fad33562d5af59e983d57d92fa8fe3afc7317110c4346ef7ddeda113b606b54caabeea9705ad781fd41685ee7cf89053a4515fcb6c57a275fc039c3479e2b924087ec3e0f51db8915ddaedd9c8e6dff95dacddb6db300000000000000000000000000b905cc01447f708289299e3205ef44661b0f56560dd891a33fe1e5cd7fa383168392244f81782e3d4dbbe60cc4fc8b1e6e1c1a3e4c65f5eacc88706e427823689e38e6c7c66b11270fe680d7fa740341a0765fdee45f14d2efe32610bf04cae80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081ba0471dd88bd0f437ff9a9381ab3fadc607881b20f2ca68401b89fb5341f047c404a880f034b4b012266ad1c5c1d2d00c38a33de37d97aa9c6bd5659913126dda0d9e35b0c2c804b58674e66093e6ba6aa937ff4fa74042f708d2716c07531d7fed0b2d304267ba674e6dc22516f277c9b8e9112722817606f40e92242e5e00213c91ad68f411f4ba09f60c4ec7dbbf14d462d9edcc0798712a3d6d99c8e011103190a503d0ca7896d29d42051f37e7d66b0654a74cebb3a15160323d2427b41130a0125cc105b6292a351e5a6c17d0921cb3cb210c32ab19ab2643adfe98edc3a8dc189e5e505b81f14bf98db616a6aec9650a386deae2cccb49688e71bea7042dd021b5d1bf84fb6e1000221f2c6f2a915470c7b690d84640a996b1c91e84502d661021d73f69a72af17d0eacffa775ebde85454f483f11faccfe90a29a33f72593a3c021ac38e213b3a8e2f9cdc061843f81e83d13aab32f612d6fd22c21175c70b475002114a02cea20da095a520c9b0575c092bf04482eb98752d9f1a4892dfd8e0f178030edee1e27ee8b5df9d727b39a38eb7f2b47e453004caaecb7a64e7e8e4a42b80d84920344b5716e048cf720195d6a454c0c40c6b9c96426e4b7d01626869c4261a5965d57824b2fc8f1e43242de64810fa46eaf0d2fb78c30a76911ac8cf282266123691ed650f429731e0381276954f220dd2b349241dcfb843bb2deb0656bccfa1be17512d20eced0c4871ac58e223336c8d16d87f01dfe7004cdff6abb708e9cb1fb0de658413fbdce0acd86bb3a2f555afb6f3a5245643ff37ed7f9970cad8f000af971786af7d208fa01cd13ee0eae1d71058300cadf9a0a5189871388dfaa9cbfb7008516f45fc3de11517afa5d494f47f0f0352c9de5b2f9ae2e76830a7df656f60b7c18ddc5af66c43323dc15660ea27980af7c1be0294b51ecd815b88ece43cadf2ff1ee647e6f90c54f836d844f2dc13221cd180a804901cb1ca85954ee83149063e6fb3395d20d313e6056d1016c3d7fe6b10c6cc7203654c30498474806265121153fb2a6c210dc0e787c1a1baa00ed03a65108118e6e78a1538de8df6a44b2b7295ee86dadb41603011c4406d7e45b2244aee28b003ac7680233a2d1294773220eed23b53059cad2d3f613da903d3ccea7e2f9dcdfba6c9cd1d1ecad2068c676a45b2661dc4b86a35b50c7391450fcf2880256c517ae6b0962d637bbd4b1b6a04ad723758df332c8879b62950fe475bc04bb465c60b5057d54757a4545e6678134e8922cb0472d3e59b3c4660b72137a4e925eda4f54f565207c2479eebaabe76cdcb94b4bbe9cd9e73d25b742ad990c649a6893d15dabdd63e68131e18fd7a60afb13b5b82efc6737abe8641d3ab5f947036dc6eca9ec4c69c5a0cb109cea6330f483cc9cbae0cae6af9e402e413606c1439219aa8175cc1e9a07ab0184ebeea97d0429b2ed05efaf21c241b567edc754b26d723cee561d3b9a7caa0520fd3bf0cdb02d00dfabd469505a4f663ee344b5a21c6f02b7b8f89ce7ea57dad77c86b8bcdb058719de08e85e95790a97a00abcdf0870f3bd05db664edbd109b95d4590df93bcda0eac64863d3abf4b723e86edd54ce5a3b64c30ab0e03752f1b133c2d6fd2cfaa53272c1902c5c84a29841667e51fbf49f99d9ac28fe290a7e4664f7f055a4e83041b5028a628f2d863785f0c824b128341317be14faf3e6631074cc3c47e7c04cee7e7f4dc0492a47983cefad9ca937e8a65df0abe8c78abf93b6bc4ba96bb9df81822fe4d8785d63e44e73195296b88b888f7a35d640431fab9a2ce3171445c3c844eded5ed0b5182db377208b1d3105c3d9b3bcb22027bb3a44b001f99f611ac47ce7286b70bd7bd8b3e8c6145c815c63e3cdb5f44b1c3c05f67a38dbdf9911bf9a7bb0c1e0613218115f8a55fa5bfd8c14dcfd521055598aef51ad6ac28e912ea3ace3a319d44937b6d5df46636e8a305317ac910569cb6efab6f01320dd04f56a4f913081171793bc41e9c7f837985ac1231fcec2a43e49a35d314f721536bcb059fcd200d3d3c93750da484419848e3fede7d11b6b4b1b94e124ae0be452e392854d4c35a330aef978a74108e2fe24e7d54bae6f1535c7a22d45e99589b1c889cee8f4d5891f21b3976c58dda4c9a73103bb96f9cf7943be74beed47864e112878ef176eda3d30b76a7764a277ab11d337a439354487947e79c1b6c21a5ce79feef2b08bc6b8bb7cd75bd5ef31903523e32157af84a55e9aa353ba5c5d91d682338f2277cc961101000000000000000000000000b38943623706b24439a33d9182b22f92a2c1785bfbc368249c6968bd2c6da293f99d819ac1c64744fbde6b21b51af7381a0b592d79e0798e692e9037dadee883b4e4845424fe0d6e52ff54cc16883b196a968810b4a535b874315aa89d060f6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8fd648a7d9ac9ef7d5af501df46625e091606baab8dff5edb7d8f730802347dfaf7bd5e810786f5cd4607120d08065eaa4d5736efdf978995583614e54376d4ae5fa57e595aaf8726a9d16232d61c9e6fa3d70711833af311b9e0981e5ef5dc83d1282ab07f31fe9dfeceee18e304d16dfb035d3a5352dd2da241b2681932c303179e0b450b5084a2f42f4e64ebcf6bcee7d96053b438042e9a892353f19b402502058490c8eca7f8639d531f8c898c1eaefb2540959bbe843dce7768f9e77f39810a085d5cea3c684be9fb5636beae8ead79b4166c7216dc9e8a1a1139d7249d2fd65f321fd2b153a913c87a8ad56a3b4fd8f012feabc9a71ea3f0482e7377f3af01020c1a5bedb9640e0ea8053bf0181e4a8c45da4ff256ae58425d8449ead5e84220030700c27ab74cc3bd1addd74f9106e7493b542792f7c288c593806374c3dad789030f82dc42c2bfe5128b85551995cf5174819a611e191051bc6f01a078066bf8370325d82218aa16b96e06d50329ab766c16c09539d336b2d9e2546f86b5e3a6bf8502090bcf12f4ad897d1b0cd71ef8a61324205348c49a7ab95af3a253feec2f5caaaa3a2ddd6b98c0baa124fc4af2fc1aa3bb09aacdb0c1daf20e4027dd4cb008cc611d269e123c185076cc7cf871562e7289df0c7ca3df6bbfb20c1832a2f88c69c9bfc95694f838e2332580dce9d13a2b313693763ab996b5896c96224983373d2b6eb699d2c604fc64470ef29aea8c4a1e99e9c6cc68592975e7e7f0e724115bec4d7be866bf541f65d8d32601ad24d4ce03db7ea5c5a8e60692a5ac773e5c2a71dc01cd832b7ec8080738f5db0d6142c08d2e193790a9c3187df6d0e938a4280326ed038bf2618c2b45608c8f55d89b4146560e9d9eff30d23d91b1593bc93dee037d8a5df28585d898991ccd5e27fb155744e07f2fbeaeacd32cd32dd0e1a186dc4f8ba22ec1a32f9aa28be598dbef76b0050d11a8672c6b9e23dfad8bbf7cec08decc1475cc5d734860c90b90c0e43bfa0e55fa409f3726e23360c01d2bdd5f7a50c05187ece84e9915c6f33e5b4aa5cb03762fbaefa42f20655835575bef79ec3c98975ce60b1b39f5579f19a45165f85c36fe8a7e30d646846cfa3ae9e937867313257d2f9e8c82d56661e6093c3decec2c54484df812dae5b79aabe983b7d191eeb0117651d68bf404d9673c4086fa9cfdffaf3a7be347fe21c2eda416861ff4ccc57e258c5723e10c9f7f10823c612af6837480b72200084f6c88fd12a6c9e0725ea1cc69ccd01da404017ca012d0019bc56dce3e2fd4bc9e4d11445476be909aae183e430d22d9d3b1b433b5fa0350ad9cc9800d74411d9cb50015febfe44c74c53d78e1b80d170089eb3ed5465a8eaa84c1690982e89af606a21f06518b9fc0bc28d19ef33be21f6241694be29790ab7443156e8c1f74d7e208a45b7794b3233112bb64725b6ef455f4e73f8752bb8adecda618456dcb9a82b5c6fc3148527164e842fac8d6aaba63e6d14100080b869bfd3f6e14bcf29170f5b83aa03248060cef0c8e16d0ac32f11a393d5a5ec840758975d0d63b32b9826f86651e870c1716422a29b73805f82a07bb35d024f92616b56b3ca0ca31a4766b500cedf106b64df9edd81a347c25d8d943d9162839d728261c0421a8029744d4bdd234be0c2cc7d66ef35b10e495c0fefc0f2bab08147c6b3ef5c115e32088a854f24e337c7a0663c148f8e93ba8fdd02d511f6cdbd8b03e67ef5713960c21df9f664a1f2363ca8eb8d1a6381b4442bff219d6ebd97900be54d5600388ecb2a63ed187e0707982a6fceb6ee2980b44684f8ec0a8ce94e1ce2fab686a2d56b7788218b30d7ecc9806ce7444a5c5339ce5ae3c7d450d229f02a1bbac507dd7a37b964e42eb46d695644e68fc2ae163ba18dfb08c47997bbba5a37ab52b42a70afcff89a895f956808b82b4e5c4eefce08828d02840866e1c99038b5bad8403d4416a4200b19c6b036d3d7fffe7d16f5ebcc14cb1a4feffee994250c7f3c9927eecb32e04690a77fd757b493a70f3dac2f4aec58c2a529aa82fcfb84d5639477417c261eb9c9eeb799a3a6109a3fb54e0d45f99205544344d146bba4379f987b418b16fb705c0f43684b1d36de98ae4e35b87b27646bcbd6dcde9b3511f8e0caa4dffb0f36e806f85ac41938e53fb46d73164be20dfa9c57157ce687b1460a7c8025bfa951b9b524e907d155c1b88c5f27737e10c4e7bee9f9f35ffee25f538626ae267b72a824ed9a69805e094e604f7bfd4f60f5a77108ceaf84cec312d06ab89eeaca15b31cbc49ea2cd9fb3f8f33cf3a2ff9dcb4b2104b87f277fe4237da826a99cf3b6826124268f2323b736da16644030428b63cb05c0c1b05ae1a7390b8587544ee15e2d3f957e3b2aebcec990904d8ac903", "006a63ac6a5263", 1, 182421578, "caabbdfddf125b3b7761d253b8d2ec95b18bfecb7daaba6ab3a39000208bf2a8"], - ["030000807082c403034d6b2975fe438268b9dfaa89c1574100fd34df537b20ae4c97d81fabfe21355c0100000002acacffffffff37917aad76b8d42715edc37820e550cbf1886148f9cc615b1292bde1f13ea8f80200000004525200632e1e1aa4c074b8775c19e60da9443be66791395a04b6f0777b691ded62753ad8e6b7d8bf03000000076a530065ac52ac4a19615602399d290200000000095263516a6a525165ac0c2282030000000000000000000000000000", "006a526aac65", 0, -2145079486, "eb86784c5875ecfdbe4937649ade55b91f58982df7af57bb69cf7ec64438387a"], - ["030000807082c4030410dcf7cb2240b2642f388910b89598dc5ef0854a261e8f6304308d8dc3e3bf26020000000365656adfbd2f96eb8e9fdeca61db07821440d6a02743daa610e5ba87e4235f3495c9bd6900153401000000066a535265516affffffffe6aca458caf8d6bd53d86ebc223d64bb81fb52861586ff7153a8b96efb9d318203000000066a656553656ae1654c67dfb963f9fcf908cbe33ce2a21baf255d06b911cf16f9db4f29df104ddb8472d603000000055263005251ffffffff0422ff320200000000026a52fe4da40500000000020000547b190200000000096a5100636aac00526391597d0500000000046a006353eab7359058f0c0ab03f54d3c03000000000000000000000000fab2f1d454b3af25049978dc54f0026dc1170de40999c01760f9fc0dfdb21923d1e9fbc997c5a319e418969a28bf8541a1f547405c3b4c1c1ff048e59304fd35df1565729d01692171b234beaad0fd389cd6512a348c9dc36e2d0bf7d27257c5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006422e6afdbe2ab79a95ff8d978b302886cc38797f819ea1e2bf81ec64bfd30f72f88a3ebadb55b1933d776f365d172ef614e5d88bbfd550df4781d712b1262b45ce0dbb9fc6660b212e236a7c9001f915d17eecca2d17dd467a32b9e9a0e4acdb84a21da91a52a570d71abdc259dbc7fb796fb36ab3973c553dda792934be1070224bb6f4aa2e75162774f5e0059ae7d2e3f77a60a5a68bb4bc5bcd07f0d9567cf0327bd327771c9f164e4f4853bf14c9e65aa05a39b2e20668556ecf199c3109d0d0b054d1c76caac162caf913f663497f7625be8de82108671f17622fbad3b2f39411062a76277738fff3d622b903ec6cb58ab8d54d933e37d24ee8a3e60e85f8092020e144d3896a15e83f946e80a023845fa49b59c97b0436d7ee3805dab96787c01022016401a01a40d1fd03ff563d41b5c03d5d6db74ed30a35347b14bbfc55d9ebd021d0b4c18c8f95c9966c09a29d45c90dcfb76916fb67df9fea3d2ebeda17b35410227e1b6a1844363470373266e4b83bf4cde30b243ac04ccc488b402dc3f5e1efa032b7c31c3d2e9b3fda3b5df7a5e4a3d8bea6f3810a1ca409dd19ce22633e2c567762562f8b56fdc3751c11582f780ba816556304943bf3e8f74f491bef306e00d16507b0a99104358c00551dfee9ea3c4d1b4c114b3657ebc22026b7bfd6ced16333e1d922a617cb670b316b70d1e3fe7dbb8b9289b3205e5d9f0543369a25a6b19a9770d7bfe094e44042297937cf5b8e5d2f107b794db054bbbb8e1c8dde3c72fcf38401880a2b484ce65a48b94c3b053001cae178c8ff67cea8475415b8d43fd76eeaea3cd448318364da2f58f5218a96e7e100d1e43af390941e22a3721c3f6e514dc63b751b4380c39c68caf4a433e423d8d701dda076854c4897cd29f2e672a5f0c41885f3b3ac08767fb18131979f7b947b165e740684f22c32517e3f952a7fc8d8754ea0d6e79248924efd8c5dff5105ca7aafdbc5d9ab1011b0e6c74e87734603f80400f2c204e3a64c4e687a68a4a4f6eabe04e74d1e0b878b562a0e8ed98532f8333c2a69fa1fa08f7fff2e53fe61d0e01c6f83b182a0cbf1ebfe9f67618832645e9df91dbbf1ac85478773499db5f333ba500be041629572af20d860c22ad645888d2a24a6feafb93ff96300a0e95bd7bb08fb3696a0cd00a12b7f55d9fc259ffe4e4427f783a3557569ad99b1f7381562d059afc71a4180341354543ef5a573ee75b87853af9452d8f4e21071a2b7a676d053fee9eac5d2e5e6e98ec775f46a0639bc2563e221feb426a3f7dbf03c6c76974a75becf3cacda98a6901f656902e9bb9bdbea727cb0b9b86161dfdc297df1439b6178451fccd6cc7c28975b9e84bb820807be863d68f59c2a0ab74fc6e2387720dfbdaec359381d471d5e5325fcb5379cccbc6d903d24e3590915508c52920de469b476ed029138eb876f87abfe1ad4a42987fb83ad0378c2c767b9d496230b0363d39445019c7f87427bfa843f0a3940623977e988da73279f0fdc4f03f4cdaa8b8a1df3534f6a73583902598ad4de433ffa4af405cbf78f7f181d10d1957472d66ba2c9af92f435c508871353da24068634fe2166d531640b92bd2075d66b92c5589bc84a3647fd0bddd2e607772c5fd3e03a114c54c61480b97ff03006456bbedbc0a63a1a95b7ad91150486fd6bf03622d99f514dad3e2eccb8288ae25731a561693775a7547c2d85daa2a007995e1ee541865d634067037b505f02c4b15de020fd847e4928461d706d675c1628e7cfe7a8f2ba031c1a495bc77537faefe1878c85972ff72db649ef3d61283a0c22ed991e4f20ab1c6ae6e0e57448a96b998f4c53f9004c80ad573f6d632f200c26ccdff4075bf73532dd4f2a8e85888dd7e1bdfe9c12c506edd6f03170ac5847b88e6462cd63260f4e1462695f856a15134fbde7da02e26c6654c7981aed326461b167a0247eba630258311ede2e8ea8b56b00b38f51de0ac6c6a355876c3aae49ad3c7661fa737afba4b241b21521804bc3f22b2cd6694911ab1c53b1a6ff14a242798766ccf5d1f1dbdcef499a447b6858918433c986d5abac7abc66b045f7a0f28f9b6f9d84c3723bbc4ec80691cf06bef27a2573db1ce6d4a8f8c573fcd567ee5c877955c3ffb21410ca3ee26f10826e4a903eef562221469fcce7ea961e7fc4d84efed46c25cc807c73c0826b8b400295c5d7d0ac4e38047aef72001e5b134c08d1bbe5197e41c73f0580a850045f49b94f52451358e10fdf82c6fc4b4f7e52504523cb1c639379d000000000000000033505705000000002f57597edc1f9951a87966e72f4a2cb26b2555730f10b31001dac5776f99da0d1990809485370f917a38ffb041a9344057f6c1af71ff53e24eb62b0af000e6ff6cb2e6b07dc9d330a13b837e2d0faf1f20507505d9766dad5e03c9e396dfefce000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006c31bf8a255b863ca1b89ec3161b3df6a7d4f393f0883c102d9001f9a2ec60ca0f4d152f766b1fae27afc12d257735700e6191198284f314874b702a5c1b079acca53b1725647630cc01323248a7e0997e5dfc2c762a7cc60c814caaf197e81d7f8130815ebce6d291e346a8ce1a70157d8335502706569c9a513902fc0d7844020c16be20717a8af465d0a3d02ba11f9f91024a022a2099c2ab3ec4fae1211d9703273908f9510ba2a248c8edcaaa88e1b9dea67a5989ff285bcca1b5d74f0a30b90a06e73450cb74694933c57862ca82bf457fccc087678c388cd531df8d88f82e3dc0792cfaef7c6889e4fc0060a0865311ae3be4950d788c971bbd7467c9dbed870207baba233c1e8cd3ea2b111aa43a7b7fdaa2c9a208a3099090eae7e1b3a3618f0212efa06dfb059aedd506484481c0eac184dcf5be7851b9ba68d517dd7bafdb74031b2b7e8fe81ca6e6481b735949e3129139ec486d92b9dd0b8d84b87f1b5d19ba02194ed7f33861434427319008f27b33fe8a79ae215f7a908165a2c00a996fd21703240383a7c80966c338a4d8c93d369e5cbb9e29402df01ed6c39dd955fd7c4f6f6e4c1ecb095488fcb1583f6d5e89c2208601c525f30b561490bb82fdc1ff2c5ecdcb0030bd7c02f15b1c074e06dd12e7a6082e4061a48244fa76768ba24dc60d6d6b169dfbe1b1b82c5199e3d89b22e3a334960b153f5eae15bd530cf2a2590a96c516ab6086120e2f83ed8b75bcf087c1cbe381f0422f864c892b9a0f1cbd54cec8fee255bf7676d977dd874a720824001de8b46176ac53a425025a10bc16f6a4cb7ad894e5567f405187ac9634f4348901058ba7211bfe7608c77bcab9006017cc0eda9102f90be1b63d0816715d9dd0c5492a99b00e635efe842b95f582a3d703a910f7b038be89a9f18d56e60b75a70ab888d3b0b189c64ba200a572c3e218516d33b51a725ffe72ed34eccb2ebdffcd9fd151e6316441963bcd12bd17745e571ce93615efac86df8eb9b7711331c8e396e99ffc191dcce1fc25e8fe65d0cc338526f686cf49dbd0b3335570cabb7045ad88e9dce0b7c89642e47b7a8edb410462f7cabca39b28b159f952bde420a1a0b8fc7dc765aa7fa3462deb88e07c76f4d5465133c5399270a72766a11ca4e690797c009f179e4f5ccebc9f26ddae5cf475f78ce60f0b33b5b0c1b1c24bf112b77a943f261b521d75405fef6f448909cc3a9d9f2c2eae16ced7eaff1d724ae7ed4ac7a5d4a59f49787e76fca18bb33d07116c20aa4ad8a949a357b24655b30e67a9b1be64df6e1b23f010087a72f76750fa17ed969d84108f40b5dd6eee5e249da81da577ccbd0146d52958bbeab4f6feb1d9ff8ed07038a34eba7262b51d5f52646cfe4ffd681d79066d8cfc13ee45dab1a062da7297969c511df25a234ca5c13e8b4c53cf7cc4f61ef9db2d9399d6a301a528152d510d8404054bf05e6000576d7038cc9800332b045ac78d475218088eba3f51ec2cac1dbcdbc48c4887b93839dc3cdf3c8c9b45a325eba9117a7c6ef96a10f1bf9e3eb181f1ee268e70aeef9178c8ccfe47d810ccf27417ed37d8f146e347e87eba5062e8c31b77b5087ec800dec42110fd1869cae033d77f06e64fa6da0330de7cddf72b3cfd9336f7417f38114fa06d6164ff1ecaff50861e3230e2d5592df344941a2be378ad3c93d117ebd1f276d419fc1a926ee751a184da218e12c9b1b909114826ebc2114442d861b5722c23d549fe23ea35fdfdcbd866816fccfc9e36aee15d119dcb0a73af5232f53f1289532ffc49fbb1e6a601cc38c92efc43f54c5a3857bf5342e3a30af3f615d789434189cf0a91fdddca90d5fe8cad46d5304cdebf905490273aaafbbe28c6ff807e8e26659bdc7953b21c9e08e1e2cd56c33b366ba0dff4d3ede35a35048baac1e3caeb260de09a922c68f0f713083a7a88480c38ffe30f706e2885bead81ab83b37f50081f2e3cbabe613b9063f05f925a457990a817d7ac3143adcb080959d0c931320cc97bd269b74f402784a03ebb7994fcfa2f09ebf077d510d07336a3e3ed178175b59718307258ff3e8e0116fb5f38f0fa33f3328ff02226e59d38197bab1ae2e06eced2261d9decc5519aeae1471af8dbf1abe2bd59b30ce8d2114b8ecd2d49a1c80d20e33c18653d5253f17e14b5238f5196556905f2994454907df61a2187043d79aa006e209f1c208c97648e1de052e9255dd6fdb151622f7863d67b7ea2e013c2201c2418899a25123cf597f18f48d57406e942bf7d442a486bb8010000000000000000000000004cd15445d839bb5fd3972bd2df4137e134091f95255f4b0063c811f7a8c8f60afcce9a2461293d63a4b4967a693d548cd35493b1610a4e7fb7446e0bab30cfa089be8429182adaa4f19fd4b267e8e8a73682a76da7186ab6325bf0f3c45a9418000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002399534b3d58bf13b82eb180de056c4dd864207a2f7f0e2e8c4b56182430c676dd86e22e18a8883a81d5b94f6c0ad7b1a989e7593e118b05b7a725780d870e94f68f183010fe16050ccdcfedde931e4065b914d50e9f4a6d585a755c735fde7b913daf56341e781d210ce23f29f9f5e33f7f7ec19ff5aedebd0e26c62cb4fa1f0226207d2841662230a5537ba8253fd768570268ae79a72a0d348d27ef2d6d0a13032556e17a6626ab887220e9ae066e93b07bb7b9eaafae056b589051eda1579d380b05e361af204514869167b43a8fcc39aa51239e3d4ab0893256618d48b51125361b59abc1e5e05301c3c1e21ab73dba2f5cd1b35d2b1a668f0d264c15132906df0310c485337e8c3b501407ad53f09b8b210b97f2bd4eae6a73fcbbfcb5febf9c25031e00a2aff3ee725751e8b3dcc3234ec62d409e7498174e72937aa96e0c88158c03216fac31419b198c48866418517d8dc73377fe5724d7b07f5dbc6a81abdcd0a5031e1c8eac15b4b1087bf7083e9309ffc232404995a48959eb8d4d6975ee1577a70215ef4f4d5936d45e16b06b9da9a401a8bc97d24a6835b77e1fb6b9822c5203c1d18ccc6a7bf2e23ed2338a01a5bba11379c6cdf86060481bfdcea0699e8627e3580870a4e478efc8ec1606ae265c3036bddedc6ff9c14cbcc75a085ccc177982f7107a7128824b8707c6b6e5cf67209bf0cec29f7161a237c953bf38e46a42455dd43e87abaaabd31c0efda460c83997f7c0030c26c512c67395b04179a70b195c8c6ec6fe1b6951614bce5ff275cc85151655a9e1ea31af53db56fb5a70aa0628daebf6aefdd318b1e716e67c2d0c41f6e0a5473e09742c9faaddf89b0ab023569d468e99d90703bfbaca3df7bdee975d4733ffdf427cdd3f1e3ba201091db3342b9447be4d39fb3c6703a3184adb76fd7f92109657410d3ab81b83baae62489d3e6a7f88deb66553680f70cc698551203eed235909d5a543353d36205c5e022c9df068f81452ab7f03ee7b00ed621cab81f86e8f6422ed3a71b32a90269e04d38a9c4163c77a25dee99175c8911cff578f9598818776f7d16383a468fcd90a0aff6b3f979a01b75d43062a91c988623fca7e93b85b5e84c878a2cd9a9b625b1fa5ab724a70406040dbd46f289c34b1ccf57811f1f8509c1d64af76ee7f101ea66c0095b2ed4b49012a05f94588c57ea07aa35d1cf4ff3d8527704faf6b062e3cb13897480c78c6a3817421f69cf26ca35335da5a9b815c465169df0912599181515fdc1f94e113104d6b39631a0fb4a779c771b8445a180aa667da0189f68caaf565eaad43b7b3bf43cf98ebbc8ba2218d71f8513043588ca2d5e1aa644b1dd09de59910f8eaac3d3c5fb9b6e326c9e9466bae48cceb102e847f70bca88fd81b4346932f8241438a872c600ffb0f7a3c9ba28c15993214097340fed0b8da354873e1d7a626e392a71c9e18474ed24390358194941bcb6f3e3ec0e1f83e0d44ae79ad4d734640feea1ec48d6dd773fa37a9d74fe4061adade32ae49983c7f1d4971f80678f5087cef2531b80a33084d0aff10492f5ac72076b8c5488035481b93bcab5bfaf17e532560104048d238507bd2afeb18f9619a86c7f57eb227ea137d6f1b676b65b3ae8b900ad560c2124a25f4014418ad83cad892f718978b71fb495c2e119accfe784b17b911b6f01a12203a2cdfab4afe8eb6d2951aca241ee42554a9d9e86969c816f85b8f7bb21ca97b273fbdfc17d49871a2095815841acd4ebf5914596473637dde4e0b67e70754baa8bf00ba059ecc2997b0c18d51d988387081ff9f01cc92d693e767b5e4fe9b7f4ee53c2cfbd4f593625368b175a05271cd63bfbcdc5210bbaa10c5a830b73de7994d6703b4b6678757b2817c2b515abe3253644f6ca4cbeef6e791f15c5872e85e1e3e8bd18300080b15bbf7f426bfbd358ee43a3a446330ef40f742e5ec8d843f9d2305bfa5cb8e3b0ff0f204a7644553de3d1e25d3ba6b20d02723fa8e9d3837fbaee3f2373e61da925975ffe7d882ae8ea0196c5efe58dfe53de6da17f2750d6b46a7ba026b90953c9e04eae38d3a478553813f0586d7a4af2e7b1465f6598d43a8c109ef65832ea841e902e4c4ea08c249aa808a2dbec4bf0860f2b852a9045918664b5da293ae416b3bdb3df46f8f18e1c5ee57f152f9485db2c8a262b67acfafc7ee3a0272d032dda0b12b6a869e7e3f07f5026b43d3bf6703ee655ad5ce98f4277eddc34ec198ac58320e1954e7c9616ce5ba3aecf284a7b031d93be1b4772a9ec140439253ea4e7964c5ae8ceb256d6d5f3351ee09ca4c4ef6d77e66616b6192f07029037e417754edbc933ba2b7bdb13f345f731f198c75180e38aed3cc1a63bf12fabbf423e794a6bb47afd05552ba67f880ca81a1c8247f10328e07", "636a630000", 0, 145861685, "9dc0474710973d6cfda394f4fa76a353df4c6695bcdf2bd6ed61d91d5d5cb461"], - ["030000807082c40302b675c8d883ece31d8a277c629134bc4e2c66bd8f76467c88490da85c5cd54fa60100000009ac52ac520053ac6a63ffffffffbe7c46e8bc9520211ad3fe0af499490bb4c474c3217d78b3f9ce96a4509064f003000000016affffffff045a2b71010000000003535365b568c40100000000046365ac6301637a0300000000080065acacacacac0014619f000000000005536352636a48f029bc00000000038cb8ee03000000000000000000000000331b07ddfdd82c9f8faa2feb3a0dd55f0d941fcc4cf697c77d4c6526caee5c94bcc95cc17839580844b366b7f5ed323d39affa705127f60533b06c6938fb40552289cef58cde7efd26419642deed5eed2a008a238e045ef943a54c9a3d01160b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f2c3178d9900c59e4714ada35e27ba445486f9d55a567b96c618fb8c492a44c1124ebf0fa47723f25f9d9e5afe57b7ff7e261e987558cb56f24b0f710cbf39f19986150649029835a246d68c1b51264bc9d751e5e5fcfc5c58f13e801e1ae5d466c2bccd0c03629c51ac7368fe08d0135d8b19a9a53ce8dbbabaef04a006794303171921f6268a2a9ea9d296038dbc3718efe1c8702a687995364276b8cbab82000221e29e7a4d6b5663ae559f7f78ecb6449e75dc54face31c3c0388b8cf38825310b071670c11bac71c65f4f6e2a2788871f73a118f028d36ec45dd4c132387d7507323a6f677921e062651724587cea538211a8ccfb67bb4204b8cde2a448c33dad032339c9467e26156c90ed0039f667a52ba7210f249e628249f7d316551a9e346b03202b050c08c7066cbe3b37b29c38e2d0761a8563d83335e2716f149a4bc6428a02159ea91392af616c231022e36a025e31e10eacfede2be15c373656fa06b4f018031e3488ef0fe6f7e2673220f34eaf4188601b2374e50900d686e334879ca9f8390303405644f401c7a7dfde9e48e456850621ee480fea123442e4469fa5e0754bdfaa11509bf28879195526b4d88037cf4e899aa38630a9d3cb0946d445b985bc213edf10f2b7c71b28a006e50b9807d4f67e0b1b03153b49e9ea763cdf1b8b9d985209f6df600ec87733fcc8aeac72c2bdf9edffc946fbd23d4fb997972b54ed6133cc84ffa515c4a756f8efe1afa80cb2df139e17eb441949812ad8bbf111846bd504520feb4c345b54730565cae0b19ce92d3b5782ca6e3d22e16f168ed77a67edb9d57b20975753f2a099c839fffe8d4672127d3fd2809c07286bc9a850d711f28920f367d4ad3409db3a871b449fed6a2234e49ff198d0608f4f8dc5308846f15798c31e7093b6453090e1a1bd444ea27c87cfd7617b616ded4c25702c0bff161e78450df987aaafa4484d9dfa7356f5ad3c95b01325f1dd1168331873716b3c2464ff573617d6f7ce1dcb58b25a3fea7f8e5e216dfb38ef86bb82a85d88bbde5f8e8be9b3764ad65c68a434754d87b6ea033da65e1c5a763790f059b2ea540d0793ff39d072e2a41d69b16dfdc173ea855ea1e4232d88873ade3fccd50a2b46dc65695a5d4f1adabeab42c605c0ec1d7c341cf270e49ac3fc73df97de874679a707bdae9ac6bc2af916e3eb02be901b490def25047922741c861ec54dcf80d03d228df519a5b703d6b944fde8507bcae75b48858f815b1a3074537a0dc22985467a4a4217d7a75e70b9f64ccf1614bf007c9e58f2b063dbfa4435c4eb09d8dbb261c73ecc5b0b88ccc3184da85dd32aece3be23090605292be1019956454e3c10654630a5769c2055637d40d3823df170eb12388d9d1461b77fe4a86ed8ba5352e686ffabe9f59e9a6197d24981cb54ecfec8cb6fb2133759f3028a38ea9afab9cd7d4be78004afaac7bdf685b5c1ab5fbd13e378f00b8951865ac910049c9650c0785ca99dbcccbacbc3ceb123c0014a7703e4cf3a34d2f5eb9563c5107edfe02de3c47c4e618ea5a5500f16fc10269189948109e5c5c31e748abf92862b036d6460c7937c515cdf44a563a42555deff712bec5ba94d604ff254f33799369759a3d6998cf0469b271b74f1791cbebd5efe960b7bf53f176f907004efac91d2aa8defecf27e917bf05b0a21270530eb988e2e8db972c37389165deb084c5f8d61000da9f0c6a09000c9fd91bae761d7cd78d906e24514f098e1026e3cff9505af461b46d16b7af8c15545f53d7a359ce1668a0d8b108ba7608490e846cccc712e43025f6ecd911db3c7d830b68dc1337d261bd5c8e76dec9feeae36691b2b23dceb8376223468be073a84f401f00164dc26da3d60dbf3757f5586c98213a1d0ca0e4820ec800d7690124d29dbd2aaa62a7b757018b85f0a1e290c87eb7d3f7c2eac4023abebc55841d9a024ae494bc00a3cd95f65ef41a1570a17d5e22b96002a648c258761991d5e535933fa14d514a6c82319aeffb3dea0a5f6363327a97d6ab6655a1284abbf967c0f6bde7053da03fa857a6daedc24549da7e04bcf4e03a7bd1e05f44d51809c70299f834ae2ae3049f078881ee1e5e112d33c81e9fee11e9149c8799c4b48143b55294bb9c4338a5aed19eb512c2fc6f59fe8f4fca0b74bb2724cfc9d2ec68c90c51177f71c0470f9c0d7b37aff5a79a35b68fcca12acc13ab7be33cce80f0cb08044b1966f8e5cdb375191664b3555b76ab1d2b7574a8cff1e7aaf103f04ddee713a056622d8a2dd5a2f03000000000000000000000000a3932224e2f70f061a31f38649ef7e2f317dcbe2a6b6f9e1587329ffd3988b684869098cbc7e9b1249083cce8b001557f666aba3189e031ca7c78cba23dfa827e9255b4dee0e161743ade899b984243e5ba8656191113cb94a56e388b6925a75000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d8a8406dd25614dbf04e5fa8e00a0768fd61b5e9484f80afd0415c6ab834db2f4d0ebf2fe438a64aee7775f17b0f6ac9b7a854f144f120481c3de51bacfdc226b23649658d72c1bd717ae8758af727df7337aa82cefce6ec8d98d407c583c5430f7220310cddf70516c0a2ec799eaae31a6e583fb4a9d8bc06eb962faa53d3a032729ac9f0c427756adf80a43de546b6ef6a7162aa3be966180d7b2f9d6edd938020cfb48957dd2ba422ddb48c645144d93181d6aaaff4dae98602ea2168f5a3e360a0880b051a8cdd956e378b2cb840e21b1fb2036ba78727b063ed2185f4a2ee0492ff27b4585812f0f144efd9d8debdbdb4cf74707406e7786d9d11a89b53d1a1b02046fcc3d7ffd7613ca464165be06e47db929b75f63f94818517c77cca26754550306c476f7db251742a0c12779da19ef2449831593103c8114638001be2e17f3b4022ffbba3a2efc8a986b79f3e95c7bdabf7e42d09aa4e00ccd20df2324770c7c150314cef08188551e85fc09f65f310c7dddc44c8ab1d93b598de82059bc841effb20206a3c7a985037a7d1c46fb7de5ec373a0ef3f961ec3a4828407fe84fbb6a17df33cfadc4fb4417306ef8f21c341fb9c16661d5b877f89b42557f739c210db0c3b1a934e1fa2b1e1b3da59d99826ec2e7432efcb83d955f069bac54052620b8c0947ce2966f683406385b92cb08dae16b12c913d346bc740a1ce2a56020fb40451b97d77ce8a3e34e9797bd4f2f9aaa2d71dfba916600dcfc3ac8175399a7bb89ee59d7d6e1df43b1ebc8584fd04a52646830966274af858b18b82b911c2f11975f92dfea14b6c5e976b48b0d24490c5847bfd923a09d52ac7c60d31a0cd4be6f8769b77eb5efa45cac9e2d870df7b2e76ec853707c877bc6a453d8054b56efc846bed8227fa47917d0bcb27d6e69fe73549937383dc3649685a2ea8beee83d59b73c880b8c46eaf117879260e06c775991c9004765f9da9aaaae55d356ba70ca2ec362f7fa26c246b8c3f06ec3cb731ebb5e61be4d9cd67d07bf2e38d59ed971e39182ecc091344a9fbb3d67e1e01cefba102f3c537cf4eac4428a761204209986280440ee4e98865f1f0222781de0a4eba6f2ed99a4a4017d477cb492896adfa2306e336681bfdadc0a0f6536499f4a172a3edecd44e873d3395dafec1fff9ed37f811e2e731f79b21108e9f54a156af096d619352502ae08e8c8b1b050388b8354167e05d66634bc4d9a7be8d254a2c426684ed1d416c95ee0f9dba44111c4439edc5cc9275e3863685079da0a6bcbf2d7bc4090f8f4664f728d032ecdd4c1ca6aff64dad2f947a52d05ab734fc1db11d083d5ce2318ab9df1c13ebba0c291cab2ce7fbf7823cd2d60fb290cdb61b2a97921ac13038f1c58dba3ed304dca5cf6903d531563006e14602a80c47630c845ddb5486545d16e08a47129532ca540c25eb4233b750a17429cb0615ae6261332a9bd5ae744e9b040fbb126d2be5bacb270ecae3e49ab36746fd4dd932e4af8041c8966b283cf289f1530f29a79b8556e18ee208914068e01e2ca37cf4bd86793a0009e9273919f7d40341f119838913ae8ab5e21f3f09d264c46870a18ef6918bb46dc483bedca8598d91b03e12b73b659029e4184804d8dbec16325b013f0d9599f3749c90372b6c33ceac7949d8c99713f85980dec14234aa2678ce217f2fce5ed48bc8f12c67381a2982f344115b2386134d247c385449e022c3118d24bcbb24f3906ec2785ab7cc69ca83659de957f66a69f538472755673b02b47809132dc144fcb7f150a31096320a939235c35f5dafc539be931c73ecdaad69346a33339e4af6f819f29b9a24355b3c6eac85e52bf1813a9d443070f2731d05c75811fe1d0bf566687541075392b69cb7ac0919d1ea21e21cc7847d9396870226fa51a06a36420a7746238d6a9f8ac8a4e6dd661956b161df9348054ddbab1ea4621858d031d7a350b85d6e67afc45703b9432a495c6f778c090ba958a9de88256fd0f1104ea868273523453a8a253973a1504528b41be48c3c28f96b0175f15abad3cbf8e41e7d053d40aee308d0b4e0826dfe487e1217340688cd568a1569920c34ebd2d1c068b3a99c3932e9a9989218148edf625d439c6efcce7c2499bb1ca803f631e01e0cd61ea5d48e6ef85f44422919daee7b17a786efd6d2bcb1fb737cfb203720e573674e8d0511ca7213cc7b70f80f2f0bdc7c9aa5591475bd0f9c0a174b56247c3ca12705086a8b07db5e4517621a26d4b0d5c35f6de1440236ef2df08c54ea45b00000000000000000000000000a84a0b788b1e404980a560e8a4555ea2f36cb2097de3ae089bac2b9fed1a7b9427adabacae6c504d44b9cb48b8b20702cbd8e16256bf36efdad3bdd3b32f15d9bbfa5b6cdb36b0ae001323bb7399bef5d0dd0649a04a40ff2cf138e0b45a75df000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008f7972aec2e641d8705cceead800d3d1a23986bb668019794523183f8343285de4778e861e75b173e140116978266cd7d0b8a3699376e8332fe7a5e4dcfb4bac6377085b09a9a93b17db03985c051ff107403b7f16e988cfb8fc9ec8b04d6f7fd8c6a787448789b6e11087ea9bda66ef00fd7bc5fbbe9fad7ead43df9e159d66021248d0febba5c98c94920e508ea8b3d6cc9b16e32286d5ecbb375af73968318c0203d0ae4a8c55e469d4aa9eebc17150e245d15041c415cb9667ba7e4db46260ff0a0421ac2390f7d5670fa50862310c4018d13744a6a876442df27de81b108437a644e46491de8d76f7a360053ab30107483dd84d078ba1e03d12a8fd40d8839a7902283014b850c6804f01a38f2ce7e05744eeff999f0968ab947107b85203c99065032a05db5b216e405345813afcafa49682742efc48f092519e11dd887ea7b546b00204ab01c8c867e7d0fb6a295b8aafb094b85877dd1802dcbe77da701638773f2b03194c3a94c860d7e76e2582da083e2d300b9a9204fa313a55a52b3a2be4577bfe0205244c9444b4e6f461e96ab33f6639a79e35837de1265a762bd63f2e0513a305edb20153e3232a517a69e9bb064135e9e38ffe8dbd9253765870f7ddbe4699c080e9d4d617fbc716fc35d25e6851b96e62abae342b09602df3dec2bde498e3f1df9e8e5c6b70cd1d6366190320575784ecee0f1c159769f682173eb611ae7dbc7e30061921a5c1f8abca96bca8794fc50eaf2d883944b39747440a1920ecd04bbae818a90fc3ae4d52d709c3d6e3db31c503de20a72ed7a951450f56547a60199cccbcd19a59ae91b3277e13fb73fa0b43139d61941c04dcc7d58862b87959183083b8b3ca936b36c0143e7ced8f30b3d89b8a58ded7bf49b1f7eebc4cd46cb2c3afe51bb2a20f5f900265efd51e8c85783e469d58324a51ef6820f769eb204371d4632f7a708dfd956fb5608af6ef6f76cc665dc1c90dfd6300a0bb0eba5c686eea89cdb0eee2c7bbf6bff2c0591871cc4c6d1f37b4f84fa3cae1560b6c7b0911bf4ad497d8ad4041b9745a76bad159b74c558d367d019547fa851bc76e5ef993be066282312cc80ba0f160762b6849c22f6f2899ddd719b89ccc6426ff9428f2355b4587f041358d8bb23358f659334ed2040a6d87f30a0bc015a8f9c310f1c75c6b00340118de8fb092d59a9dd2ff12a2b2b48b4ac407efe90b9cdfb6f1d6cd636cda7d3f3f70bde342f04fd1fadb475a2fd80ff25122149186a92b4b4d05b5b559b40aa748259d340f99deecbd3ae32c459beae4f8880756bb36625a6567311c795d3c134ea07eae7c3e39f344a1092986ad1d54b16c9377f124565f4bbf15ba08def3385008660b74f6b2de204b9dba8af43bec3707337cd267ce52532c99698da22ee6e67876289cfbc05df941cf5dada9845afbd4cb4da50908c513b7b0dfe6168616ddcd125acf46b33907e33efebb56c45013108533c02fff1fab76c877a68fcd71eeabcae8fa1042e512c3a4d746710edb4190880f653dfcc4d67eae631fa8df33c7e7cf65483bb63e0cccb9aa49f778755c13d1f7e8789a20532cf7aa05df39b61fd52e7803918e9f808a70aeb52e3593598c6e8a5ecd4bd4929874393ff42b5001c70aca003232b659fa58765ab9bc028b8edcc506ba9ce63c642facddbf8950566389c92ab814dd75cc599dc249e783806a97e5f9b961248e134e89f1e1f4f010f625f02aea4ba0f6fdd52e1c1a13bba405975321a3ab268f84042752e5d8aa0c55eb50d1fe177df2d03414b814bdb712a166a9959de66374e3c8e41ff29833d18022a304d9776a05d63ec5d0ea97a98370eb2d60e239d673cdd418a64e6cfa87f8d1e7286dcdf599587f366f93bae6f0a29d7911ac0ffa0f556b803feb5c70c5f5b8238e004626978a4fd4336b3964faf5f7edcece352684ddc04a3202ed9f9b9054b6b20a728ff8b96962e25918f97ccf7c45d7eedbabc059ee9830fa35e3a26fe5b0ee783461a994cd18dd4e176d8cd1be733a7d75231492d5a830269c85cd03f0384b0e48517cd7d15d6dd8dea02b8205b32ffe2916414440b14c1dc140002b4e906b60d146e860c2dd898a951560dfa16be6c151d2caaab6c486eea99b6d8ddb28a56e889930da7fb8ecbd1b7fc9d2f315322213015d04a1c2c69bf2b7291c9233458085e106665267eafeb1aebbf864ed0f69fe51956a48637d4c6b63e556310ec707941615ceabe4def5757c4259af8c649a7a2f129f5b37df22b4ba195abfa0e2e7dc3213cc0e1c4b9407a4aa3c6d03799d3f9e689f022dbf387f7b70defd2921aea43175faf67c4ef4fc70e7c225b73d24856d90d4fa331761f74d2736de4265a56b869685dc15daa72698ac16559713a73755b7ee3f052ae014371661b6113a8ec134d3cdc90f", "510000", 1, 1317415740, "913c00c8bd605125938998957ca6a25c79e06a37a9b79b84b4c642fb88e556d8"], - ["e60d247b022dcf47a7c50e7d5c34e4ceae6ede4fdee84de837494aa4af132a482ef8f3e95c0100000003526a51ffffffff792583d95413b9858653a5369876d3554b34036171a67355eebc5160434812920100000006ac53536363524155ffe70210d25a04000000000565006a6a65cb08af050000000008510065656a53526a0000000000", "520000", 0, 1263090422, "c54a7d5691c322b113292451694dc7a3ee81a9d010ab90547bc16534c16d4037"], - ["030000807082c4030350f596581d8acf853c99a6da82d40d862a9783b9a78f04d1ca46bbd0f3a4c3ad0300000000ffffffff8513dd9d8234ff1c97f4196fef45a32000f0ddfe146319870c3390439dcfcc680200000004516a6a53ffffffff7e52fcd6d2ecaf000ee2062cfdac0cce720596512694a807bd31d32bee51b7d2020000000563ac006a6ab0dd588d02acf19e0100000000046a5251ac836640000000000009515352536563536352a018ab990000000001e11dbd010000000000000000000000001ed0dc109a06e409977814c214d37e23993ceba92f0e76b9447b041e6a2f64ff3290c0c9ab743c545298ba3c852a63db2e8353bae4e2597c2aace0a91d0916803a58d5f3a0315d7bfa93cc650232b20daf13815a225b7e7ccb70c5781ba240bd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040f7fae9998c7c92c4d0676504e19832dc722a2405316624aa6d52db91fa8f083bfa04f42eb50c31329977b99967098637d8d4d8db024062e60302c3125c7b785118c1487f14bfa629479518f6df83929c3c61edb318df091020db1803f428c1ac9e820b929f62c258ac28bfafebc8f483dbd2e90df16f6eab7028edfd9cd1ab02215d1c779a9e9dbe0f54f88a856520f0b00a78225c0d9bcb4b06610d2290da050214285b487fe67cffa8dffa8530be3052a559587483a8c6a134c5b920f001fbe40a0796e1078b7bfe2631b90f78f4bba209eac40429f7646e57dd69a5e29479de9a128e7bef7bd656db84b319e3380ed75a004ef52acec29de79152d22400aad0ee020b7976da587dfde731a20d0d08be81d80dddd23178479bba5fd0a8ed19c508e602012ecab72461f47b10b3a134888fd19d3f556987cc4f97776ab78f755648d24903227c63eb01421f7f06e98317883c8d75fe538f1f2a2dd7dfa126cb47d15a4489032564e9e0217d346927a1f4e92dbbe10916bc02410f856ee6798a211c2f57a88a02062b5546da823be530b59e7d628758f65ceeb559b17f535dd82127c820a252e8f6a5041f88a98555c4d2b3dfd3805334c3df2aeacbceb5d65fa81ccf2dc314ad5fabeaea2dc6974f63cadc768ac908f06e04c9564aaac0e1f6bd6fc1a994d2735ed7a0adee95714c09cc6dd91a44a4cc821d2feb8d0fddbbca2fd0ced6b1b11b93ff5b7c3aa8651e27dcf9b41d2018f2659e6df69de841744a3db82ef24a274ad47b286ecfe729dc2220a867f606ffa5d2046767deca81ee7c9f38c5f0c27b10068e9111f91a98bc983afc7a49f19cd2cca2694c876e1a140bb52d68fe0c4701e71dbeea7f200a05c54d50bf76e2924bfa84d5360e38104b35747627c9cf50bdbf07e895b8d73e0a01841055d49eac5073b1897d2e7169b775c006a8e50bf11596982c1447f119056f0f2fcf1858e6de318e73fb750a10b8ec65f9d06f587f5573b3499a88e65905bbe16c315f9dfaddcb27381b9efef4d6bf7d6927ebc81ed85bde8e106cd369f447a03143eafccd6d81e8a7ce3b88eae5e4b9eda4afb26339323fc2209e70a9c532f59f01b16d11fcd14906f07490bf5f0ef0fb0c41b2de71096eb0f75c18b6d5979e1f9b066b98760ccfdf823a1cfcbed5bf1d49dd7f8f7f04786f9ba2b01d7aacceeb2e8fe9940fedf2957f5e3d0215786a0b2c1f8981782e92674095599681d1b8e998e21c60d3bd4feb4936546442cea2031723afe1bdafbb14937833e732128fc75f59663dd02fb7e712b9d6673a1e2d96e2e9914e0f08a7e1cefb6e50c03c71829008acfd386ca6e2e2600bd2420e1abd763202223ccfba754b40039321883539c7021ba185f67cfd0b45d630654e1de510e1c23b9b12f6c589bff1b02e32fb9f050bea89592fa3e801f0748c52b498e590b5f096109d8e9cee257efc7c85ea172ae7dfd6fe6d242e7e07a65316160d2d58c6440e6e4b221be4323557099007fe9cd8644bb0f7865ce7c2a5f15edcf326339f6b9e1d05ac579f317b5edb4c0bc8f8a6a85a089f66e0a378e965aab7cab81e370a2bd64ccae38cd469a2408c3af6c607ecc1b2f4b58f556226f4f2bb0672f41f73dc112e698f8ccd4bcaa9d613115e1a0bbc093b8d95d1726c9323894ce3f5ed254b6e40ce8a4e416b12a881ce87aea73ee078f367332788ca9ab58e2e3814634faab1a8910f062e038f7c4c4452ed6f40f92928fa3609f773f5173efb36c973ed51b92b02cbeab24434816b7d574c6b3ae9cd22eca2089249129af98b7c505146346cabd71b4377446fd49f54492ba00f6bd99003a76c258b8dfd123b13c4e08ddf1549fbc3687a8475ad9b0f8484372c495e91212cbff4c47d34ad93fdab89338a4da5b671d849f3276ee645a17ee42fb3e49b66c56db6ddafe4d24e7ff598632b0a1b65320e1847f57347cb8bf0a54d60038ac7e980d3cd8001832d4f1e1ace8af8b762c8b84c3c38351104e671bc3467c9bf918d2e0ec0152e1883f07b55e7d796cbc6516d160caa8a23d6f52c18127918ab08d68305611d5a59be18069a945eff0a7a310f5b1b14927caf90d57779bb3b5003def54f673507ef5a4a92ed2203c58561aba0db8dc5c840df0f15f2ceb93fbeb23d8a799f8ddee3e1622bc295a808734c5be9ecde574a9889f7ad43c461d93f5940f5d727852b2fbf41cc919285624172868025b150fc9e4fd45732f3166984be4f80781cae72f10f98ca2ce82c72ec68e469b2097e42f793f3a3d43b7775b94866aee783ae63d70306ff7d57de45e6effcead771563bd02dc91f479f8b71d57dc5e4ccbe76131e8b01947365e1a20d7618726b92b8e323dd99aaaf53234ba9a6c096ff320b5cb5a91824f19dc49efe06d8a59da78f37359a5a177e0674c7f707", "5353515263516300ac", 0, -1977473266, "bd5a6d5587609ac1e4e59089b1e967ca2211d231694f7d7194a06f6476b97747"], - ["1b0c263603ba58795ee32006cd3788e83e5e4dd0fa45adde1e11718147a9c0305c883870020100000003ac5351711eee89b5e8d9cb65efd68f5b8adf4b6633417a36694dcf56c5e3f759524d4a8ed41c480100000009acac0052acac5200acffffffff23551fff5f145d2c526b81419dc647b6c179646c1e679850685961d7588fe62b02000000035165ace6bab48101afec400400000000036a6351000000000283bf5601000000000000000000000000dbc6a8611abdf64ce4e41375f0b0b538b34eaba3d000c049fdcb5ee7ef0eec8c7bc9b7fd88ee7e0bef94b0e20230cb97b3012cbb167918b7000727dedc8165b7e5b25b05d950ff72ab00130921756580b42b22ce0d13743cbd7443d162596f3e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ce0d4c1786fbf79c7bbf3c9aeb94790c2499e4cea4249886418994b768c785e2ad901b0682fb2dc7a9a192c15e437e4812f6fef793d0fa60b936711f81a20091dc013fd28f33aa52ba8ce0f36d04278b0e62e71f4a5f94f954655c78abb87dfec91ce5c853c54089729ca11c224da2e1dae358b54ecccccda60c4b14ff7e4bbb0207727f64399a4beeb497adfac320e74668faa09520b59b794deb56355351398202306342843213b181c334be21ef56ba4733ee84399e92759f8da4b4ddb4ab30a60a06bf0bd1b6b6196b6dc7df9ba10843d369d3a8e304e467025c76fa12cb4801cae3f49e76b28a44890d88ee070a633abd013240c1e8a7946af7f959f3750eb98e021966d9ca8f6a3c9192df7b6ceb2df2c671795b548fb5e1e5b389e33a9adbb7c802186e146f77cc14ff792f3a56a30280b358ef7d89eb0ae3f8af1fc1645cfe13720330186988cab2162da542563d40a029e9a587c745efccc6d485ad21c6cb6ea3af032d0e3478d5216544677f7da5f42b9b32ebae3ca864f4ba94020a797b6b5f73600223230cf086ea3e718094798669b0251cd1d4c8ea06ff01fa6632eb93974c4de7e305d69fc8924117d0499c94ffafafa2da9eca11fefc832a610a84a9f7e75617de658c5c3e3ad8e147d0d0d97c381695690a2bc0af09f02e025880ab1957c40cbf1864acb3ae1dc139ec283ddfcbd9d9d26ff9dcef21c46029464288c21e06bdcaa4041e10169c2caa4195108f58e348f52e0db1f3ec6c51a0219e4ee0b31e703294fc880f4e8063d5e5cd3c85e7896570df00f28c669ec8716eca7952504ac27da1297dec73b2b10f72ee1dc59d43439bee8105a04ffe4c7b5613378172386bd0f3afa13f2f0248ef4e102205377750f151908596cbcb24354f5890bd3d6dec9ec8e6fc273c1353d692fc26c612cf9b61ac27a4239365323fc9715b130624e38d0c90b2121e3c8c61fccb41b6d2004bba936aa09d92a59bdb7b004dea9d18534c71f9503eb88ed0d5d40c9261cbdc4a730aff1ec007c167e67e75b748c66ab518ad4aa1c0e35acd1b764bdca82555fd08aa9ccadc101b8ae9e492c9d02cd29cac502f826b524c3e9c4ebf41deb257c7aae5922e59bcb375a02571f578c18e72fe09d2c0f0494d8632c94c80aa35fcc266873edb69a39cde5a358b439a6896ebe189e48c91af3dae28f1ea4ed82d2664c762d46b5b5a3cbbfca6f0d505eeaf80b1e550bb373b8f4071fb1fc7f55cf2100565bb059737377f29f22009f66ec6948a52d4362537f3e03e4de1c6144d3bb1f6ffe7720f3f4f1674af57c803d8d685990ddb056051d3080737bf9b2308a0ede840d018b8dbc4a6d97aec346ecb7bc4df189d1307424d16e6f45080cca1edb7bcbd56266620f71e9f4376253c54b16a1c75613a59604112a45245b7a8d5079b4d353dbc855c5d09a01a199bb40471c904bd1242ac31a1432ebd6a4563bfcae824a3753f2093c6e8d60f5ae2c758d3a395534037ddc42f75751e3545dbf7f6aff66c6a48ced21e8635639010b03a84ec232e637bf3f6dbe084b4fd95905264b96d84f6fa91ec9abf5002db59bb322cff01c4aba9177e1602ec21932f46a7ba1e03fe07a3c9fcde5aa0b3b4e280bac96710e6d3df739f5db9980879ec4ff5e8139ae956de9f9bdbeb9a2685f4247ad6e4d07a53e20ab399b0f97679f4acb6bef5c9425d2a84515af17c6430a56ec6b1a2fc193bdd87567b5c6036e1326cc6dba6fb7db2d1fa6bafa7774bdb126b2c995457d40bca04314c19840794aba51de155384eb06537f36bb6202aacdbc33524e7f81b2acf1a0d1c493a82589ac34d7432e3eb42fd29796a23b62c9b098c36541de2d6c9894f77058a2b53562f119572b9d713bfe210a544cf4e79055b1545c0f43932bc4f7be864f4f7155e9f26aef51c8fd73a1a21fbab92e8b3ab243b55f4ea6d3a8d79fa37fb47c2af4f17a5d729ce014ea63ad890e6092dacf53533743f00d09eead7dfdaa6d20df5fa2e5aab16f5029f52bab1b5560b6afa80687bfa231f4179f2c668e8a5faa023eba36414d30b237594f9bcc73f0ba82567b7c78afbb11bc6e3b82202b4fbdd9b7ee41913d2217e4f44a39870b68a5d3629063508929944d11ec007b5e7e4fce0dc82e800ed3843971c38acff2f87e68b0cc3a7e9c8324ab4caa375d99546a200d39faa07f6de868b79062ecf8781c34b34b6122e2fc3c32cb1bd6022c966d83d7036b783521b299d5adcf62e87954a22136c08fddeaff078d515ab3fd47a5d1808b5f880c32731cd000000000000000074dc6c0100000000a5d5341d60739aee5890f0a6715c4fe2ad155f9691db3c07f14f7852a6433c442d9f89e1cc4129394a9bc9cf17706fd6e459acdbaba6f1979ef6596073614eafbf875d09f6ea33e85d3b26e6bc3d4624f13d5076d6647c96462932ef7de268b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000352babdcdceb2856924ef43024c7f2a5249e083cceb1d3631624775e4874893cdea1b64de0d5cd8502103e408cad3aa30e5c0ad3004ea19b83608dc326de88ce248934a2e27288145670b42ea1337b9b4e8e57bd416f3f6fb2a5769333955d00ab4560199290788fd16846c9e7fa07e0c30b5214cd5192cac352fb754d46125e022536a4e4947d17400a44aa1fb8ad3f9cca60a33e88402e8b285b1fabde9c9622022ff43c374a3eaf0441038999a82f2155070c3e083e61e7ac92daf0922eeb0dbb0a01ff429e572f40e99c25e2a963b4f4734dd29085a1c824278d19f2a8277d3a21c8b74f83742dcff49dcfb2e5e605e511b7c727874d9211fc6ca0968712198c60022acb1f08cdb6b115f17d87d2c6b695fea4d00c336bae39cab06ccb153c69cda203140646a4f7d86a8c3cc821082eb8391487ec21f3599394c150864aa6b7320dd50310a11b58dbccce49b46ba97c477a38a10a325527b65b2a9816ea4c4b6a032ef3032634367405ff70b02b6b9ab54bf5619428a962efcc2f844024ff531e00f7dc1c020fb7aac23e18472012ef625107f447ff5169c4a38f41b3c6d8936f3ebd135982d2d7adf21251f4d9e587df4bacdd7046f30214e577be092039355d4b21f24f60d4f234c294c32a18208868af1e1116baf9911d08635d382686e62154a99865fb903f4634710216a6454667a9b33b990b25471d2239b43b71b49b8be9e963877bdddb4f26a2468ef391434d7b8d7b46e01bb8c03c569a01d9efbb315f1dd0617469ffe400655b1cb9e70332945bce7ad275bf0ea8edbc263f3cb6df494c0a7c5c0c77f12c1c3fe7ce60e7b6c6ff8f03a94c2bdb763e37da4914091290adee5b16aa8b9dcef87f1fa2cee16ee8ab6757ba02a359ea3a2ab8f6a3944c2d5178aa5ea4027c27620281eb8b634b493ab5356ce525515507ab75a011dc845f47e503c278716105b396d1a6213921dc71e8e8188b71981ef7f450880c85e7cd76e20c899887f2113b35c9bc35cb9b46be95ecdbdc9e1dcdf8c8e2f0a67c279c83913f885198056f0667d03642f97d6f620b7c4b7ed3c01809ce49a88ac472b54c86929ef5c48a1984b8bed0d3027d800b694ff13510a5dbaf25d12df69baca8018c2fe4eed04c55374aa6476b1ff51deb67cdcc54bc211a22ebd4f36ed5a3a892ed1bd52a50188bcf20c2b8aec0a4841206dafdcd58a70fe61c83aadb6a907fbc9aeac515d5833c20b9b02f4ebfafe2295e3e460a5752d7794a32ead8df9bdf327b8a1ecc80a614d6f98da9370d3f54ea1e1a8d030a6cc113afe67ced36bb200c14a86497aa80a445f1e71557a511e9bcd7bc5dc52107dae97d42bf4eff84ea2825333a1d345a3ceba7cd94a72d2bac93a6a2d2ce6206698609826df9f50ed1f6ff94e468c1efee9e6ad3b2d7316fa4afb12d20d24c617006abee00a244ba4486a362289257c671a1dc5c23ef0b5e9b8cc2f7d2ee612be1a9a0493979c816a48de60c19dc1269dfcf3fefb7c6499f4275bb98a94b7e7d733f39402069d6607803c1cfc6d80fec74762d682acbb57892a2be5cb1d47c935294c87941ef3fd258a03cb31cf4f0a84fa34542ad3de5ed98a01de0adf46e87eb981ea6968e046518d4f540371fee520c97be627cf7e3ff4f77a6d7ebf7e6837c65a28590eb110206ff38121b8d3024d8053f41da5b7613fc1045d57cee9e8d518e1de2fd96854569901b91627eb7aa076fa355721f2f91eaf8ef5362e456015ca9e9c3430bce15e0f3911d749173dae672f11e66c9603bf017e67c687bf72dd999979052b599e57e301335fc31cecfcbcf34004038f214c6cec1f4d032980cebe6095baa576bbfb6aaecc1c327e03aad714def93f121dab393acf31ea89c300a857e0008614203355de8d2f9df8ab02d6bb7f6cd9755a03f860bdfb9170417f57308f8bd53ffe4b2123041ae4d36bd711649fdc883ab3eafd87ac551f4769c0f090af050b22f6c8cbda24dd98fa52fc0d8a400226893252f385cb77fbb9e822e32942cb1d9d9f1f8adb7c4c61e6e7017294cbb50c6d151db53b3d14cff3ec9fe2fba919dd15c8ac00f07109008ab7610276fa9a9b1dec33113f23a714a9cff7b1d90a4a567b5bffbd9300a71da10c9005238bc376e347451e834a7372be55be1f0cbcb2a082d9b68e057e36b66855939f7a223fc043bac817bb0d8b13eea9bc579ee40f7125be7174b6d91dfaab203c1f55dcb653e989f694e81a3a81b6790adc6b07ff67b6d59f2019c7fa260c77077b3ca4abcb65465e36a32d5556f5e89695ff54267ed8dbff228ee97e5f65982b9c53cc304f06a177d022ac56401d093e3679f0c7ddbc789ddcad5aa8af469ffbb6728ac080a0b5a61601fb3543ac697ed31b1823cfe4837704f1b5d5b679325d24c6409a56b15e5fbcb03e0712709", "006a6a6351515163", 2, 580898207, "a6e1af72996ff92393987f69625f1f131eb4a6c3cdb3fe809c44d2641ccc3234"], - ["169d862602fb20a174106e6a04ba4a1ca70bd9dad44a2d6d813e558f97f1e6831818c202490300000003525363ffffffff8c63c4d0143fd600b0b041ae2a929f95fc45284858b49ad7ecce8f35d57800ae0000000007005363656563accc2a8e4003395c41040000000005ac6353536ada0405040000000005006300005146a20e050000000007ac51515351516a9cb915b200", "53515300535163ac", 0, -1331549506, "15e6e3c810e602d421b21e9ed172948a446d7a5c8c5635bcf4c93adebf94f853"], - ["030000807082c40304ab7218f16bfbcdabad7f70638486af802a4aba49235805256268b3ca1a47ea2e0300000005536a526a52ffffffff2219c349c58ac34f3003cd26b54374ad39f7cc252ea6eb34eea5bd0dba78f2860300000000d1a628516a9b6a58bf174e42f8d3a956e033e9a1e9065bf6fb17b446b640319960ec237202000000046a5365acffffffffe86b405f1756b875d0cdcb4921bf00a87baca80381ec127f1e6087c778962a5a0000000007655253ac536565ffffffff027c88cd010000000003ac655297ac4105000000000600ac5352656a5fbea9730000000000", "526a53ac", 2, -949674542, "3a29d54e14f5b8e4ec32931e614a26c3dd9cff4a9016679a88528c3c5c47b276"], - ["030000807082c40301daee3d45a3270be91cefd092b9bee963e9a7b7f18648daba159c068a84362ad603000000016aacabd28804bbc67e04000000000463526a63bcd21d04000000000553ac65636335699a0000000000020052c3f2c0010000000009ac63636a65636a5200650340f00000000001000000000000000079669700000000003f7c2de64b378db991bb517e1500f56789af89a8d5c3bd8cff3dc5f102b7facc8771fbe812d0fdec719cd5ea78a771539740c7d182c7959be65989586880b8684ba97a9f9c50277eca3c25cad69ef68863e63fb1215084a0180be855a55a3a8900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bbedcd84243e27540c10f4ef789c626c6b0e069b67711d9cbf1552b3941a29cc54c220671a8beb596210794ee6dfa37d79fa81591bf23af766d91735c5357239eda633f1a771cc240ec2904c96d1ca0ec487f24a0bcaaab66fb7746f872d5fc7d0c21cdc289e1501c37cc53c5578f7af98ec5d8980a442801cf9ec458a36192603191604ced9223ced051494f3ef0d316fce669c1495c6ce4e9e331e332fea69210212684453456c40ad2bc22ff5fb392752edbd255a0b59fd2cf89343da9d5c7f510a05d0b9baed81514cb62df8d655edb42ce46aca4b6e676f683816b4b82f129a8f2b92e0ccf5a92f18c591a8344fad2c316537ebcc0b5aeeee5bd5eaa716eca8d2031eaa03f7b03ae5f908bd777d0036b6329ba36dfddd7ba75523bdfcb084415b48031235ed9d75f2171764551c7b3b2dea68200739b0cce14c43a19573f0947be26e032ff4ed2a788329fcb97b2ef48dba0860646c7e9c6f6e652e3e899411e58cdfa60324dee81e816e1556b554726f47015c930916109a63b741a51725a03ad4a7cc590317f60d1cb6c49514fcb57a24d672ba72692aef55ee77bf5730e60364e4324292ab010e00063b49333a2cc54d734f1317568b977477c058d0271836a36adb147a8b209c65853dc8e183583651b06770447b1ddecb6a65a8f7a34149b5719b066489e0be70ba82a3f7134baddf9a74a92f6dc8413c1b059685b068bae6c0694d3316a03402d61491c7214d34f6f0eab70282197b5db1dd5550eee98bbab2dce9e32190dc7a2ce0ad299cc3b364259c1d8bd9661512bbe17b05c902bd1f32dfaf8d6f86306142d11658ce47e1201627dd656d5830e26db845bc8ca9688d0b22dfb2b65a5e2bb69701f4475067b644171856dfd4734e99a229978a6b258f4dfed54f6c3eb30be136ecb7e9ce568ea45e006f93676b98ce28bc64981deb7744a30b8133497b4bef2206ead1c81e9c66d9eabdcc93b3c76daa320693b27781022ee5c5e8bc57948f50633496a9ecdc9f38b589b7e9013ef723553eb8c0b5e57e6e9b2ec125dd5450733f3f596f5fba4cda310641e53d06290326b27150a817d3683e5672efec7295e2f494b207a7323b9d6a6b78bf8a3fafdb11707901bd4589eabd01aa7f8d35fbdcc5337d1f74e6d00e348e51c1390d920be3abd1beabdfb0fb4083089019bb56bae78ed763f3dd6fa88c4c4dac28eb200618233aec14cb0fcc9c68a670a8ae5688a18ce9b98a87a71ee5c20c4a8f9771b52ad46774cd04ee57df672cdffc49d9d5ffbab5fe3432f436a18ba48304af2b78bc36bdc31a811f928929618a80367ced9cb52772ab93a4fc342eb30be76cd333b5ca92c50f2839caf8b7e7fbb20062031282027e83c87f2cb1aef1be1ee78b617915d71aa1a3a48c8dc2f30a5b44f6852ea162a199240957c22d797cc7dbdd1e4787c2277d7cc9aec958c4de3943d21032a793354aec32356836f582b20eb2401b14aa8b6bbc739d6274cc46dd5650113db080bb960d1c5a9e8b2881607f7d85e14eaea53eab8a7e44e3989e2d8469972dbbdbb1bcf672ed4ddf9f3b3480b791cd60e0679695a28eee5b30ed2f67dc9641cd19371f435d2a3a3c52269cecbf07b402e25a8791f66284ac9c664d8b19c594bd223d0ace9e835a5d5b209005e2ddbe916a21880d7f685bdcc81599d0c1dab67c703d63a181b422ef4493a9eeb7d949278e1c6854335b6e6a96ee25a1a9c22419b1805565febccb7eacc22d995d193c5f8160604e636e9d3b6362723179658def199f8d8b919fb458004aeb2fc1d1d9b123621b7edb955418840c3c0a52cef80efbc5f6f9c7c468ab6aa147302b7074ce2f0cf64a7e9d8871f2832ca864eba85fad6612c2209704158b547d6298147d0fbe02c0158f97913bd43c201d79d3996a21b7fc595e282c5b0c96c9cf5000387bccd7a4c95a3d0e69ee1044171a19b2fa4d0551aa2f4ac8aaa59c8261b869115f383c76e8b6da91b3301ad619c750d0610b8c6cf8cc4ed49cc39febb42585c5ae3c5737bbf5e12c9fdb10d5b6d9156e13c57065dacff83ad0d00d1a15a6eb983c0a170ca61a39901d25bff0950322b16337392bc6055266cd06ffb56de9bf7503b2e710bfcc7a4bd929eb14aa7ca5c2d549b8aabc7ba9c1f1e690fb69a68091deb42d98f4df99b55550ef51c9fdd81fe06246b50d2b003983036d177f3cdc596820289303863e782b956c539d6d2919e7bf92fb3db2dd6f3ae8ffedaeb1f50079807cb89ced58c1563d1e2b81cdbe40c23adf9872ac129c183156b3a7ae25692a62feedea9a9e80302cb7478f910b1135ef8ecfd2b0c93b08c5f30765633ead637a25a62f7fafad3f86bbbac8ce86022291c4912d8c5771e485cb8be1d9bf144f9eac1cb57753f6c7c534a1dfb1bb465c889eff7d803f1199ba0f", "5200635253ac5163ac", 0, 1105850581, "43da57bbdcff50879d5612185007a0642633ba1918f87f4499eeb2c832bc6a55"], - ["526fc73404f5a9356ccaf5b3d91252083ea12d5e7bac8a3abedc07a0fd4f41b9e132552cce020000000465516a526c8cb639652025f2b870e2622d12907ab0ac3b4020d65225df34b425a794822668c42824030000000165ffffffffe82886fa548bd914e3bbd1fbf164936549a68559e746b8ddd4e2e75e3146a6c80200000009536500536a006a0053fa002cf3ec129066c7f0c63cc6ceb26c1be4b502d632325811af36c15c8f16ee2b7ec9990300000008ac53515300ac525146bed169015f9a9c00000000000016a2e80602000000000000000040865605000000005faceb17517b004ee326cc6f14909f509a10c384897dac8a6f54581e8154c63c533a0b230c89fca7abd9c77dbad731b9d05492cdee1086ea75fdf7127d6e2484f2f50a491b4b745527601d4ad9e25f9fefbdf277602080093980eb409a92262b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021670aa8043f96e84dc1d418408107a471d5dee81b47a9fc2eb7be0520de881db1df96a62bd9b82ac1a22f3a5b7951ff73a6b26b0e455d1f53a178eacf86c25dec21124392c7517a860ee631fa29967e3c09b75d2fe348c8658641ab9a3348cc5b670967658804e3be1f73a0ed26c85492278de2fa21f69ef43518d644349b77032929f48d891bd86dae149a6656a15131a6829da9c24632844784a2c24deb835c02046fd51c81eee5c401a70652003824052368fd4722a61e5fc6d0070bc930ecfa0a07ea64f7caa351c4ab3a20176f9782b785eb41835820ba033fde3cd4bdfd4ae4c0e64a4d9473ba0bd96c1e02512cc8116f451f166c0c388acd9e2c5aab08ea410321d4c189e5c0fab1f22b95222d491f6b1dd2c0e6ee81f30589af2f1227c9c0150315e1e8f685f85c643a97925cf92ee922e4b9316fd09d48cf53e2e7dfae96a2de0315bb7a9af3cde0ee69989ab385a9c0add5460b6a8c102a4ebbbcc06251f5c0760200ae7f7a779e46dc5aca07a896c12b642503990129332be0bac6979dc7235d690219e423a4d54d1ed02f1169d06c55b15f5e93f5ef87a0e57cd89987b9ed41b807d8d1b682a87a3a1dacf825c10cdbbe8bffb4d26a99fca03ebe2fcb593c4028e4c58799f307b32fcc29cad7c1d762d0da485ebe6964cc5392e48d60f28f66b01b2e0a7b0c5a1b15865ecc3d618080556bdeb7fdc0aa9b4f1286ff80354df69cf15d866a07db2531f3ea757c968b65246823e90a598e141530961c584c2fa1747d1425ebf970448b439ef73fb34bde3d5159e8df63c9bd83a70e2f25481649c09a870c90f57fd98db0401bd44b8322128611622f96be7e71f308f9dada05cf7d695231754d818c853edc065c2da05d98f8e950042aee4075a90f3d4643e63caa9a0d89e1433cf79a481ec8c6041f130323332f300adbc6970cc281b0ddc573f66f76f4df0ff61744b5bf8ceeb5a59603451082fcf9608842097d65a4ccdde4797ce6659f5e969a41cd6c3a64359b854749ae3fdc32661501edff48c342d32ac39577b01b098590d28c7f7d3b85d6dfea5e44a38853eea35878eeb50f0c8e751d4483c8e852f288344ee893268ad54ca30415f5f3dcd32e13113be1c79562abd99de6eec3b1e0bd6334aecfa3768fd3ead0a405a8199b622ff3151ee2f9028ffd1554a871e60131da144f9fa9fb3d027feda64d93f783c1f1e075dfb407f7b5b7bf3f1dfb008b250428bb305b67fdca3940b9bbb3185fa6993a5ecb90ea2ace4e84e4a5724913b40a81abbaf3dad89b60ba917954dd3b9ae18106ee09f424b4da8c2ecd9349ae6f56cb183ae5e2df0d20bf3a2e161da42de8fbfa97b3e94be9677d0b704dbe45addb8c7d756e3a24a606830899a7668bccf501de8f70ea32171ecc6cfdd1c0799560a7bc2552b606f96330ecd8bf272edc26632ddf9564e792ee4bff5d111e8cafc6538d0a33773a0c6c84f9891e2ff07e4550c4158f24b7c992129d498726aedfa728aa060933b2fb56e02686d4e7f9c9f30a35fff324a00756e40ce5202a91001462cefeee626f4ddcdd8197864467518aacc7d15ecbe10dbea15b6b47b66c7e052840786d615779fa14dcf23a13638e22b1bb3459855d9cdf8940f129956ff5018434f68573851fe8de31700788fa183fef58b9e973613dcb953605334979c033c2e7fa5b9451caec073f8199696e1cbd0bfaec8aba6aafdd04aac216a0850fb2ef3e55b6e74ebbe6151f8101491fc78961333f3643a60b3334d7cf855025731a27fc5b1836ef9054918fb6dc4fa5670dcfdee3dcb55e4ea9bb8d1428a6008ef7597693e746afbfa7b8023d38041e8117cfb1e12e858b5f5f8f22a92f6333428743256f0cf9045d680a25554382c3e4c79029c4d2605c2e9081c8a2203c8ee40e675d6021367039a028e296a9a5cb9b23b275f456f060585689384dcb79bf24eb34645c74890fdcd600ef5f6f384f672576ee6326c05405b9675ee9128363570ac9b375dd9d0b62cc6e967837e47a9bb234ec7fc987e61ee5af5620b3afd870b8883f5a2aeb0e8daec4de502a47e2463f01f757dcafc120800620b8453b581079cb35ecfcb249827d88ff3c907dd56b385647d108782540094ce9c14c3e1169de4d09fc4ea2e6534fba97332f7c8ea40f5d3b0c0a7421766d297911fa27cdb9efbbf357d2c16b56a3f4e02fe154979470feab6d7efc8757af3057538c4370c86d3c6658b1aef1f1f9814d5d9ded6ee4bdd18b4b22620da9e5f1b8ca5104c000d2fc71e8db6d8325669de011bfd76602000000000000000000000000652c8660f0e622b3822fb1c195439a11104069907dcaeed36932300b970b658e1072c995d5be3b6ac921452de256d521897d630ca6d12ddcba7b640e63b7b9bb368796cb6bad0a395a512b3c9e780b572bc05cc7dd51ae3d1c3dd404dcc3be510000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061f47fab5872fa7d4c92fb05a6032e50c79e25012b103f8986969c4b6b5c053e145861b23b6362b3626e89484d69f4454e55181212ca3acbfdffc6b3ef9db2c1a87863d5a12bf4b3db9ebc6213db7e41a6523de9628e78fc43afc8d6a619df9dcf000f6e07d2d568e17af931c6eb8c6726ed89f56039a6c1c9a424a188f869b6022c7d7b81634078cf9b9160b7b53dae56ede205506501de41cdd945a552043fb4030052bf0826bc41b2a6e792e67306c98aac0782c0621464734b653d4ac19318360a08eebf6ab7d7ce5ab61f05c74e097f8f233b407aa6f743e8cac12fec95647cfee5a5f90b776a1f9e4597d53d90fc7d3d944d1fa5e7935a1976cb061decf3e0f30306377c7845eba6085caa14669015aa8cdbe42b8d1cae8baec421f513a4bc41310222ed73d9fcd600e844472b8dc6eee8321347c04a2f8d7e169fa2fef0741ca0ee0321008d4c3b00d85a65dd712aa0c801394b6e23daa0f56193ce2d50f1599a9fad030a275f40af835c496be7c45dd0f26a685016cb02399f6ff5e415b3c0f3f36e24021af66357827d3ebf6883a9f1227fdab743aaafe9e35315f76c1c48f8acc1b8a69b0c251f99ce0ac284c8576fc1a27d3664ea2899d70cea755fb1bb8a81750a9eb12c20176fa2995cb2e57d30a89c84e5bdfe95dfce55ec8d0a4e0326a63aed3d29d13dba75ed7707c049ee36291b43b5a3f58e013063173eb58ca8e10a75d0063622ef83a8d52a78ff9e71f67ccb66fb0dbce27af486519307aad9fd1cd8ef3e6cd9dedbeaedbe67ae6ad57f7fc7010ce8b53131d854505557d8a7a7d64a7a31a3addb80a088b70c60bad89c15121724e03620008a3d5c632d1e5f5c856c72836ba1e88a657f02fb43b758f9e5b3d2728c27fea7955287d8a15d69049a9322c62aee15fd342203e1cdc8a4478bc6de2d6d9a0be463cc997344f9b527e14b02c843ae2087d53363871566844e3eb9d36bdc4c1e7f02065a685421132d3a784609261a6fc3ae87592c37a0446b03659b00b880bca6ae40c486f6a650a136d414f934245541fd00f31176d32e85c1a0d192fcfda69a4c0e943d56633815143ad16652fe9f5dfcb8614bb1af0842f6c6d088618853ba9137f8df74d93202edaa0d4d20e26e5c53c969ee4693b26ba4600196ca866c842c1eec13a6e0ab082ca0c1d32d6fc07b09e3e64fde1c3244dc36a27dc6beed60c685d06bd3d2409b5a10aa2b33aafd310449379c763fd83677cc9592fd02438d42c527ded051e8765b29a23d6e4b204cb75a50aa5326546f75bb2509cd1c4835e86e4b38b7efae3ba369a34579d780e70c16edabeb27451265b08341870b4d1fd3eafcf19fde59bddaba9a9c7ebff48fec467e9b3dca672a857bcd057a3636e005c13e5d5ff42c90ba88c5c42114694d51e9cab6773cb3f54a0d38924ff4463698f64673f7c656144e8b0c9f8f5534ab9cd1eb2895f403b0c7e500b92d631ff2d3ba55bc653438cdac8a58ea831c42119b32e3d084e893f6888a5dd8145ba581b10cd5595ba6a597abe1c9b1f8b1c577f0a69017c7d21871bce2ae7b1ab50f7606b54d04d68bb9a65354e67d5e43f7eacdbde5448a4ab3adbe38b4ef9dfdbe3514279569cdef01211233a8ef7ccda3b4fc9826821ac0ad359d279846b76a4bbd317a5bdf8ee62a1458ffcbc0f2fc35bbdc2223fc03c3e630b652e1957b268d6f5e2e75a51a7f01d17629417b1011ec445d3500b956d1cd92cf68e125f76cb3e74447891eb0980f8776a9b7e782c792b1036ef569c973add4384daf34fe0de81d1b8e7f710235a848e83eba03caa84d96146dc7de3de5be7685446dbc1f12d46ef591dbce57d61d5491716317228e8158fc220c62c14631ced8ab1876263f6967096b1c5bc037f4442282ba12dfda4942789a01a1c1f266a58723c15780aa0a195ecd3d27e90d295d8e1e1c08b627c3f4559bc0d12d1c7d97984e5d288a4f0a4de9c8500a03b176dc43d8fb8077e86af8ef6cf6764dff0b82b5f88eece08444b2c6033ed030a70bfaeee13ddd079a439477fbd31615af9a20ce6040ae7dc0afee63ec1b71896c38ee35a6b2d0667de7d8e0afef957f7e4584cb519e5acb3bcdedec9d953d08e2e1bd5b3532bd2bb98d5675731654a34122772161330bd58ded0fe175a4d4a35a7b7100fb7da53fd98e82b4e560648391fa381c34dfae378481c750dea8bc3c8ee26ef3a8aea317c1c5009dd2e9bb03074d6694bad2a79d13908b730a7679f8d4e3a650f626fd4371746e8e2ab91d89fafd778850e1c77712c110af95fff386890bc382efd87944a9fd0769c2f3975fb807874fbfaa9048fff033aeb2a6cf243857fa79d3f5dc0abb1a90a646c3186356d291c2e784da93d619eecc4898badf837b22da2638057e2f2500b2397c0a1491a59823f944494e07", "63ac5263526300", 3, 1024262495, "d40351da077fe3e976063611083ca7cd7fdff860416fbe5ebaca233bcf92e3f6"], - ["030000807082c40302631ecc4a71928258a5b96cd9d57397105c5bbc063ffab1b7f9ce220e585052cf03000000046353516affffffff26e8bd2f70bceb2b341f095248235de8895aeeccebd93ad06ad3925d8f6798ef03000000045151ac53ffffffff04b9d3ce0100000000056a51ac51525bda8201000000000465656363d2789405000000000951ac650053ac52ac511fe28a030000000008536300656a6365534f581e0200000000028b35e803000000000000000000000000193d8c72e8ee4670e6d8ecf96c2885aa513a42fb7895389d789e466b695f47866bb33ada7cc51aeae8d6bad0a022ca17aacc06bd72f66bdc3e2492911bb0ef0fcdc6cb483a17c8f9bfedd4e40230577c635199d371b2db0978b48687e3b991a30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042b5d0bfbfc045ed90bd10bb8c33f76ded2458c5f433ad9facb4375b82abf9b9c6cabb2047d8c146ca81ac399b3880d555af138655c9f8197f78f6a2dbb0eac75502fd8ab5cb1dc66ff789191072c367a502beeb0c914b24281d668bc3d276fcc220bb0d673792e364d06394651885dc795756777264f12a8f93244cfb4a3cd202038a34121ace5b9bcc9f4b2e9619e06fc27a4e27cf9978908630dcac941590ca0317d5b53349aa6ad3f52b1e7c60bec429cf19a6451708918e7e42fd2f40d399ea0b0906b691cf95fbb891a0492170aab25201c31efa8153657fe7414184c8735d4002054eafbf1f26125ffcf85f88de5f97e0594b849b56d647060b64e82a95adaa020d856b057da3bbdaeb86c661a88e1c2fda0f150add5716be6fb61b19b87c1fed020634f36c8ab0ea96cc149477a0bc3a20eb5c638ce4c5a286ba7a2d9d9348c298021f21337ffeb6b0ba9246269f0a1cf83123a9dc6bb4586779b5feefd07134291b020b39c922de39d133ada674556fb8820326f3e988c83c38608c995c9bbd0c62ed02069ef2bde4de9c97a76660eb6bcd7928cc44acb39e3405cc28e108e74407f11567c9e8b74238dc086d025caa92f1a72ca9a21ebe389af859db9966b655a3cf7bad657fb539e5f592f3edbd44e32f7edee15fd8380b0f34f455ab5078600fa16437b44d26a45cbb0dbd3ff10b6182f7059cc1c3169a1d6d0fc3b7ff2eb47552e5088357e488279c21af325bf695d81685f1ceafad154a70b01a71b6b5a4ee2968b4b9028fb93779252279ab00279620b1724d1390f1c351d3bddde7936f27691113e0e64ddac7f31564a092bc71deda33517b90868ab0d63b9b31d73f5089db2c1a899ad7551a3c469305d9ad3c63ec4ceeb6c8eea0173ec439c2f480e62bc9d1a7bfbfa04c03fea75715afd44b9741fc60a61ef5effbabc54f71cc8c839d1f26904ed94bcfc58e63a31e2cd535c9eac436523ec71db5bc0c4d686b776977caa2a13d7014ecf92f90de8e96792082c12545a7b0480fdeb5218344742d5334f4728dfc162ab36d83ba5af019d1e94aadd0b4c9f306b789ffe764e3429eb368698cfb7f7a450de9595c75b9a3febb5f55bbcf23210147be9ffee829b00e93413340dcd1c1de59bcd1bf54118e8f51e76866b1399e1dc9b34273c1751876470f1f3153eec17f55d682dbfcc8f40b85c662510873f091a1dbd872e8cacac51dac5177336e5fb628839d6e7bd963b5430774d0edecd684ec92be50d6ddb7b38a113df5a2f5e1331c83594ea5585010c854c810ae18852120928e0dacbcb8a9f1b784cc181975b479f5edf2e46bafa1fa5d34b4e9f8b297873f0a7cd2248f6cef710f2b1cd1f51e3ffbee9f93a5fbb01119e722695db8731e6e3593ed44740a38aa0ff471fcace8eb39dd3455f24a3fdebd36a1111d3b7ca0a46f3bfd5cdf818ccba8cfd3d3cfe7897d8f9face1678e6bd57eacd6372548210419026b93c3dfc04ffc40191142077917341234d6c349f16c0f8fbcd5809e460f5ee9d16f757ddf49b86b9582f6404390ce8e5e17aeeaf2fd4776c31641cedc07b6c301b4df8f60b92410ce49ae9f287f168d0bee79d9a8ebf5db9fe78ce24c6b97a0f962cb19ef5920bff94f2bd7ca86d6dea531203f9aac97d53a4847fb0a1780b0db92344c6f62c2f1d18909a56078d2d3eaca632533582d959177dbbc68966bd03763b8921e170515c8bfb4be869d66b9be41dbe70b1b5212c9eec422b12a88fea9815b0ba44690e649a930809f5d0a28455f772962ef1065ae5590246b570843688aa7059c6920a109712e9e93cc29bb86f602095dccb5e4c53cf9fb9c8ad969c59efc797839bfacd96e4ef17b2b6a21be57d8daea77351f868766f0326856d22f10504ec4b78da4150d8c093904763d10c2b54e146fddd6a1f5f1ec05ccbc1dba09a65f82c78ba2f96bada02303eb4e8e923e6e5237d4e69d4101ff74385a27baad0bb07751955e8b61e759998e8de6c62a9539d8aefaf39d78c1a94af9e6e25a7ecfd3e229b1669f0d35f065a6eb8ff18ab6716afd4a308575bd965d13844c1febd594abb8094c886d13592248e83902d61a753b2a7d2716e65803491fad510de97dcb0d6a6ae0fe2f908a2de30e247f734956bf56a964eb7557a8708fba732049eddb2a59d08a4f700e204aff810d78bdefca33490852f62eff59da79b6ed8f54e56f259575874e33aba454913b4d3060ad812ac7d93548ad1e7863f00ab440ffab99f78dda8adccc71f1eefeb99ce107d5e332cda9f88f050000000000000000f6436f050000000073d4b51fc7121831ff743d63de692a3d23cfdb0ad53fad028e7f0295b4b3e97db979c8d742d9a0fc0bc5a37f4604fe20b80cebd42dd5f06185ed022663a28a49b2083d3b22767fbc1f7caab1a7b63afad080d70b422ca07273d3797a341f91ef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009aebffade2d054d005cb3bf9323f3bcbf3f55002bbe4763d67a49f2fe506ab894cda3946f2a860a8ab2403dae39692c0b6aec0de39387bdd8d7e31f75df4a51e16857771f574680b661855450861428f9fb4e48197db6b5441d43f87b45f140c34e8ef89f9e8a687cc5df1b105d3b02b3bc9ea66e45cdbaa5859cccbba99040b0221d9faf8e3408ee01bc6030242ed503a2e557b321c0106626a8654533ca96e80030bc3b74cabefcbc5f3f63722d32f09fa1a0201d3a02d59f2974f751db9ee33650a076b9e26ac634bdb6fc50db88f53aa85d86068fec756238c6bc5691ac7d2ecbf2f053391380c9f7dcd1dda6735a572909b5484d8d189792b028f7e12dc72a45a020e84c8cdcb5131327ad640e47498c8e4f53b32b8429fa05213e4ba39420d57bb0201eefecd1640b3a9acd444954668c55e595f12a3610d876c86770fe2be24aa51020997d8e3dd45d9e6f4f564df86323b3058bb74154554d3cc60215e7be8e0480c02299667f584e9e2b11f958c11bb69c64201aec77278d35cd48a8c86a90c5323010301d169254901144f59e03f3d5bf81f90fdd85040c49291958019afe41f4dfac24f18bbb1f7d30b88dc8452d5322609a310b5d5566693926d91b8a32738abfa3c4d3879a9705467d48141f055936e7ec3382f3bf0c58999beb457d0c214beaaf6c3e46af88bc376ce8329be2bcdf0a450305e1b3ebe21f407769b5e72628cf7cd3b027cac7dd77c05ad997ef9b5202a26770135abf2d52cbd453227bc6160722e5780d447ed3ab831d24d931570f94af41dc5a53f8b2cccea55b7bb4b16bb6ebc0114ab8fc2dd1c5864ec4555d69c1e55d2fc93411d70757a8b25e2dec2c3e7808dc59b8ff03c912fd5ca742c6ae717b8e6e2d4f23f29647a0c796bf56c8614402ee23517d107408e5f064af6149c58a84bff3e31b3abc1c102e1b88ec0c99e61cf5cd97a4e868fc578b296d1d1b4538f0b35fee8d403a7333fa332498ddcbddb138322ba3be07e1cabe91fbc508cbbf99e844864008f53738cfd752b97cc01f9135513108dfe90542060a6b08e405ff6ee755db66184b9ed43c4a0d62349f5eed4b46bf410effc1d744f740d214096ec827f4646dd64a40411c019c85d309a4c7a08ee990e6bceaeeda56c353aea3b0b99045bb489c6edb2368df8f1d87e2f7b92a120fc59500fad5d622fc38ca078ef8c778801140daf20ed6608c514cbe7770d8655a3542fcdf29c1e570ac84668c21c93249ba4aa66f578f31ca80ba38c95d037d46e8f8056075e8b9c657f2ad1f758629644a755d6841d6d4e065a6d3ece5dd03d7be2e7885eb3ddcc3b77aae3f500c7668e00851937e0be0d05c58149386f5e56fc47f6bd321c080e4cd2b8962520395a0ac4eb1bc864e32bc16daa6ab31347c59f2e2c3b159ccd975054c283b91be36f148eb0185cd50f99af3064b61ff7ca7f8f5b92d7d42b3cab20415d34c54a1673ac86ae59ab21627065330a9962da20ae88aefe42a10505c2104060b237baf6b09823fa1ebacc6c8f7b9269b6d29b9826ce3bf61b1b7e1cb1f81fdc319a91fb965e75f74aa671bf9cf3f87804fe96e1f1d8b00caa3b036689f23b55b995190cf51544f637b313b50388c884be9434b2bdf004c7c7ed536f1ef4232fc316bf519eef217d6e040233d961dda3eaf5fd54345f2f40e2ec36fa2191d955b090412584bf7c6216d71b88f2ab4619f0f2e503675fe571d09e64a4fdd151484aa26d6df062ebebddb7d099279bac5d06dc6051911a9a9e21e6ddc2b414b84f98fae4b989f8656e5404201a0e8475e3f844cf1e82c725104552f3119ea254fd2e14066e2dd1ddbbd2f24b07420098d9b542c33f0143ebc6d0e9bf9750c676c281636c617d26897aaabfccf5ad9c0d3e45e2af746f0b4af95b709ec5df46b7e3f92bdae72e19f2304d839c5df46c108934e5d2d3bf84ae43f23558a3614da49f906db5de60d4b88c8de3ba3c06bbb5d6aeb7de88ceecbb0015841f6a8102b692f3d0d17713aba68ae5fbe9e4740ab09889e35fa49a036f9a37392d51a551f517e244ef2ffb3918a1e37f7a0f5baa2f4e09ab9328c1a9640a677b0938136dc46676fac102f947972669424f755cac9d9bbe3103168d57fef1a57d31bfe9e4fa4ce6d9be39722cefa5c3f9237f8289804c22de7dffa4cbe922d39a60d0677d9bf799e6830ae247a843bfa57a35965128a5e827f8b72a5bc929318d4e4d0a02f69b94b24750139df3c51d19d1664457e42c5ec1850055895e259aa0893d95ac94b898085e6565349ae591745fab06953670661c1ef666fcbe2954ba5bac206b97c1fcc7ccefcdcb8215b43cb2d0f8db2597988bde5d5b978c131844a128e6b40bdf65780095d9207cea4ae41433edf92fa4888f97a4a6f834a9090665dff81bd866c2d49c0a", "636563", 0, 914316945, "af5f017b43c2a3cf54bca7cff01657ac73b8729a736ee7fe2ef0f9b55d0cce40"], - ["030000807082c403021a6a2ec0c7fa9d43f225301ffc0ada3598033ff8240d3d36bb8af5efdb2ea21c020000000151ffffffff536d9fe7eaed237eaf069e7b699e3fc0c2005c6423f7c57e1911a8959fbcd4170000000009006aac5300ac655165ffffffff037e2c6301000000000800510063006a53ac40bd17020000000002ac63184f980500000000056365ac6563000000000000000000", "65ac5152", 0, -80746578, "9e03e767f0df9bf89d5c3bbd320a3939bb92fbd3ffc50d62455d94d80ae688b8"], - ["87335b58049cd15bde499ae1026654e64028fbc02dc045b3662757bfd5a9f860eef971df740100000003515152ffffffff98dc40d854b366440ab717bc1c4c6791642a51017b4ca131108ecb1281288df90100000000ffffffff42e4eed71ebc806371cd94282b5bc89cce2d78460f7c45a60cac69248e6202410200000007000053516a6a6a815ed7ea60fb8a8393905cc7bcff5e47b49c38abf53b7b64e5bd73c7159964bc667465940200000005ac5151636324162ab70134d3ee010000000009006a63535351650052bcbef35701d3bf790400000000000000000000000022ba2e0de252a5c36543a4938cb825f481e1b8c652282c651a61629d4ce086975022ff4d9e307b838012b748dd120ab16fe0c9afa67341eeafb6efde6c87d0f5e66bed03624be1eacc93925fa8fb48006f15c1fa4fbad5afd31be796d8021b530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000039deb265492dff6b144d4feec8be539cb0cc80df94c88845ef62eeb93a835495e8fef215c7b1a811c8ab782dd7940cc897687e42f25b9226b2dc8769249a3dddcdda1b13bf5af0653f567e853b535a907d93d0beaef3141241e92de10588c10b8e812c1e35cdbaa8fb325bdef7ef7e04138b7516b654097d415683bed558e53b032d5f32fef2a903e83e32837feaa8830d654c482da58463995dc986c11156240b0208f2397aa481d4a17201e3996ce930f90227de9a17a9b71fa9b111b756d0a9420a003d7724a9821ae7db1b068ceb76c374e20202c73587e5d4e409827aa537e0e0239bc6f3a4d3f14b5827390ce29c99da7159e915d39f1e68264a088c728ca25e020029e0dba8ed52e15bb8be958a98484d926f8ed322b4f8d6743275e85ce74274030f690d2839c4e71dc1816b9b5b8d33fb5314d1b738df314926ae95122e6d29f3021a42dbf759d5e3e4deaec8795addf54618e58ca2a1e22bec41ba4195c0b31d020208a170d4a4cb807d6d80f4a4a895dc054749e74fc0512d987a762e719d87bd19022875e5bbbaacd7fe1d85322b7925afa3f999076189bf5b48a97365dfbbf6b2ae26f86b40a64814b3ffa5b8f95e2c2e140ec6605342a408ff537b16aa56f8abbce40b973f78447ff24cc2d317f0c8b3fa3221649c3e36cda52ebaae7e2ca74e948a42d02a39e248a94507c7a5629ebcc8a5465b59a9d8e04cb321d37e4ba405a3ad53654cfd50e1b36661c99cc11e89ea7a4146726d1509e077e863e37338573eee7beceb2c1fb6c4e1569876b30ed8a99feb5acce68ab450bcd2dfe569962ae8fb89987b8766394ef2c34c57edeb4329ded8cbdc47d661a3820ea232a65511f0c7184a11b7319df5bf5c78b7d03ec7e3a86836653adbad2e406177a057cd800e431aa1aab9d854be56351cd90091f6cde8e4bf33fa75a86c70fdc2b680c9b8a63ec9ba548c49260ff84f06a764899f68b844f9aaf97c133a0c92906c19fd0fa587ccae19d16c9571c7c5719694f6c70fcc79fb3b2367f31613f8f6c0d18f63a5df716505b8dd25f823312ade86d03ccaee652dc4e52c0b27a95e7a46b54ec11f7c82281e4f91875ef7b5e3ed4799e09d37549af822346883f5492ba517668fcde57da9bee6777c7091584e31d4920afdf9a05b529a117e03f4f4d4955e8a5fd326c9e2d348922fdf7104cc0b15aa77355c2de7a703e35897fb828b7225f5158b803575329411c3bdb205e5aa2de3c77b1be77cd1af7028858628e90fe6adb1e6a86a8976b6a772d5b0c4fabb2122140aa6d117589d6323e79aa56b1a8fd7f4860e7d223ef237d9880bbc8966db7628cefd277da6a4a437cfa55d22c4779793107b9a6982b5da66b1a11e9cf2454d016cf39462540db2512986f3fa96979200084ae044b15e603f7dbbd8867fb39b9a7348a1cdebe22b87113b42a46eb9f7870db49cf884d1096422140c291893928e2e1fdb267b065ab472a74303bbd24f57f1eb7f11cde132cede369fc61177ea5fa0b3769e7886dd58ddd6a533e757a68b181e7d558b139c4250577b15c4c19408b6e6db72ca5f7920f61ae03453ad856af5e34d2b0571b833b47a809674bcd8d20f8eb00e3f8e1ad29d53865f2a7f2033307af87b106db024780731645461a99bd62d9765de229e950cf81c769c92b83495ac7f428bf6ef10c0e812adc6bdd5e2604471c7c189461af3ef194fc9e349f15c43e2a39f63239974c8ad824b40da10c23d3d23273b4384deb5f91ee9bd7241bce92af6ec30a50b073a7a9b90b67be886ff85b759609a821fee9f0bf14839b88b4b74d1d99eb827aba17ee38793ac9625464ff42cb9dddaf8fb23ab70847d8263386a04c0f9499a465342b8e9ca68ace3f592e51b511a5b65caf9ee0e45768c57d6dbd5527172e5ddbc771d2d3039f99ff97311feef78b091489f3e1f8def11cd6f31b4c4d750b758c97a7164f15f3b952ce785351b478563856e84ce326f8aa0cbefa04d5b01a1db52f4a228ae38c628dc49fdce68cc0a2264889635d271bd37d2084adaedb06a3bb875384f6d604b9bc63c8bf658555746a5850782474a9f351fca60b9312c38f0c01545dad017ddf7bc3fdb2389130b9c53c1272a4a9dc13a6df1f07d45abe3a2bcc2ddd4c08f3bd23bd4bd8a9152dc49bb689ac70f68ac5725567a8211d24b342abd9c353a1d841b87839a83d0d396a4bd3e42b492ec2fae0203344a16b75ea0882188b63b148a960c8b58aa3cc0819b125ae0eca28a3fe2c42d554de454d50eab6ea9be59b087eb4b50654d6033235f929210140d94074fd28981836eb2c048b0d923a98de84815d145ea573f9778cc3fdcf1845e28b5db6aa19dc18ea5c58a2ba5b59360421bfdb694c3363230b835dc79eef873ec5f09832f8af82ed551c9f84a12e7b6c12c19eb00", "635363", 3, -1492128473, "a28ff3d456cd132aa46334627685e61058b3f5765f6c4de81131f367192d8d50"], - ["fef844000126eab60a32b6927e449c90251bc79d88bdf7827f2d47b3089f89cd855c3d87430000000003000065ffffffff02c2e0bb020000000007525251ac00635120f8d20500000000066565006aac6500000000030000000000000000ba174d03000000002f3d2b0a8d3d7288b6dfb6956a0184c59799fb0eebe135602480451a2ebb31b3546da694d9ae3ede2ba33a187057b5c78769a3686057df351736d78f2f7581627aaa61f63ba381128ccef2a5f512be63b0a70d8542324475919b1c7c92d4899d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000778e10e1dd0a09fa706ff4dadc447b200cea874ff10e74302b0eec13c5dd3262e0c15d13034ab25a2923391067bf937e219f4339f9d7637510426e2bd7e68f5a35a61a8159b815d0f14a1f9e121c3abef4fc051f290c941fc4d1506335e611b26590fb9045e9ea7a1bf9ae841f6b0f8dd21483e4f1606bb7af14e2a729e654a90228ac736da0dc203511fd6d1ff9df4f6b88bfd90c37316f16f86fde0accb1ee35021ad3438118683ddef3b62ba53ee6433cc6d128224c654f0df8233f51d042e1940b0146e2b96f976f69d34e9e8f96fde8f9763cef2c402e124a4c664a56c39c26425deb6e34a85c0c95634d1890be18e711d194ff75ef1b269760596ff55e92a7190200fc7f534eeafd79eb4024780627818172d3c74d961e91f1e6eee7c45fc6671f02066171c66e1cec6ad7632d9a227faf1f5cf238a17924766960c212036aa275a002305498f0652569ea73686f8a4ba8b09163beffbf9ce47f883c051250624eb1b403130e2df3faa59510f9f71c18b2a32c6773461b84cf644806c04de5cc2e0ab8f60304b5eb262b0586c3624c7e6220f4d7a1e50b8f435affcbcc83f2ea0052ddf36777fe1c90d3b1d98772ae54f93ed62d5aa1511c1436af46192b08f1a7889ea17b979633a1e1444aed3f55e253a500123c9570003f1a76cd057f46e9cc8c9637a05972a1978361126ed957e517ff674aa089d32c01c955216e5322a8c52f3b46aa09acdbc3a3aebeaf2ec80080592e89d314125d88d8f240330d17fd57ffc0ade392fc3296d3d71cb8acb1a2a9b42940ebc0d473303d490a90f71d53446cfc25956b98c43047ee9a44aff54ed2e91a7210681a0f2457aee5a2750f2ff946c9ca0dd21f329b4ab114d6c7aabadacd485d2fefef72d9336a0e3ad26ff7272a84be9779a1ca85cc648894c47015358973a279ad0e57e688bd1b1ef6c32250e993c20f2024613b3f5ed7ffa032022ea4493215bc28dadca877fd2efeb26edc0d79ca90dd85933a7494982d6cd849ae7c141856861232c47b49e1a5acf6362428637347051385dad8b44e8a73cb31382c579f58fe1074e58a9456f10afccff0323fb6ed299a77f3732e9e4a7898fec182046ca885c2cd845c6c0d833045c6b6b3abac9649fb1134ef1437f83dd148335b25cda5577b5e7cfcebffe3a1055a16569e0353a56b177be3855bcef652de17db422dd061fc0120142c683aaa1e18bba96750c747f9a74eba6cbc4a5f5b0d6fa596cc4d05ff11274280ebb4efb4802298291e5ab02965059ab812de0ccbd836f3634c32762ea7f38afdde29053dda313910c17ed9b4ab29ba05bd382b3b77cb593387dd681974f62434f811b008f8b924f625e117f81180a458c87e96293dc9d676eef95d5e9168f65b46e43fb6cd1867ce8edb878fdcde8b52f83a0090b2e142720beda23892241191b193b5b7d1ac5077fa2e6d0d60481701a097b82d9e0b3155c0eb536ef7de647009f3dca3d250fcfd4c24857ba347e5a3c256b8a9dabc988c2de2660290622215063b0fc37db9eea4e5d906c975bd6c71dc954a0e914614fd94fdf1642b6fff9018118ab7192709f6bde95bda75931aec784f658d1eeaeff60bc9e138f9c2e8a352ef11fcc1a82c0f4823e2ff83eaa58a3b5a6c1913b294b9c09801d1bd8981322d9f3dc21cbef8a5fc2d2124319550952122ad93101a972a2d11688ab50d84704a715361d4930756ea544e3597d30a99c5d6ef3d5b4d399a489146b2679604315f05f48847e17e8e159f5894acbc95372e5398ceadfe76896fc5d605f033b4a9940ea4a9bdbb655614ffe975083e49687a80d0e6d530c53cabbc0eda255f5f1fccf2392e9c975cc8ed21e69cd9e8a48e59cf3995f57db88b37ad749c07404da4d009c8438de4f2d2bb9ecf24d1050d84b464f269f2bfb77ae2e37255e9f029c71f3139ee61ac5ba045b970957568442c43fde51efb593df80a4173c4d346064e3bdabcd43c9da5a9c1db943e6986e0aed362352c44a887e16170528ee46e63e0d3e521b94758b0f677167cc96f868778243e7321047b2c560da65ce1787a26c2298ba898cf476f1f72387cf2f241c5549509e0234a03d233c23df1ae146d47bed311b5f01c2cbedec4cd409fb06c03c2871869b9ddbdca1a46477cb16c243c877c66af658fa891bd3eb891a07ac161903aa6a2ce09c97abd99eb652d4caeb13bf218e336cfe98c4e31c488dd320c6f8fed01d95b2011d79cb1a131b5bd8023deecb31429fbac215c20a267034424003a797c75b908b55c33ac9694ca0000000000000000b0643204000000000e0b273f2021709705c9489ab7136699e210156d7207bb6b23f3733d40d6f3354332ca394f6418121ee11ecd299eeaaabbed3bc2aee361f2651cc6813207dde7754b2f7847c9b8db2af85108e0ffa651f64285a3d305196a6e9e3687aa267bdd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bfcce8dcd2b4e4f4d5bfeac1a4e76a182b4f3d13dd4a51b5de6dfe75dce1cec3c9e9ec7a257e8d8a06d70c1744438133d68cfb266ee4230e1a065b27b49bab6fa144ed58aad85b101d030f9a3a442529c9dedf2f724a2db513eaf4c2e9d3e5db382d8816a62270d94f6d8ca6d0acd0c5cf804704d9b50a87d0619756bc84a1f5021343a271b4c8bf870c5d5ec548b46628f8595e33b6b587514370104b03c35146032a6b668ebbce7f7106da67a5d7211c3f3319c3898f530c71520315890a0067740a0156f9966c69eb91c84d0d9434ee8f5c1ff9a8cdaae2ffb76ff970feb9f70e715b17299f7c81d19c9914845664e0a9f9d959e8610cf1eb0737259890cc78c80b022653b701984efd4390e4e0f8fe3f5273a5bffe0b7d7ad553a924faab2904c80a022fe5ab4cd0ff1c2fa3948d58748c50b7bac0655fc4e3be1d3618e1509ee46c610304e42e857bd7adda788856681c77e52a2ce600a2fcafd50bdbc596a0e89d7dc2020bd0ffc4583a8cb07afdb6828bf954b438ff3d8e1ea928ad6280ea1ef3763b2c0210149135a436f9dfab38c6a724bcb9804a6184c7ff6cf54bf135d2e046cd80692b05306283bfebf0beb6026f4136b8e36005c138bb3cb873ce1203dc3c96a528fad75a6b87e2ee3465cb26cff7762a4b58ee47d50693fb7f3a92846b5f86ec6fb1abd8df1fa4a68e2e8f60e805f4c1da8a6bcafc470cabdec5162db3686582a53ca07e74420dcb302d40609e4fe5e2f94d835315149c61a7a4c34c0020ef8eb9a9e467cfb55b33c35702a1e7796b054137c331b56640609e00e8b1be7a20d5669554fecbc47d04535473c175f32235bbf7bf98332b86a497ebd27434bb0175ef02ff494c8cfeb131d19205af5e68bb29729cb6ebea6e294995d21c6416b4a8dc677ccd68e7b9f69cc8193a68fc50ede3300fd2261aefcf04810584695a8937416e9cb307020fd97cc8cd315f6734c034c9d9e0cdd5b23ab6c76a383662c846d8631d6a9215cc6ce36e1cf7de40b514d411690624ff1c5b0b19908a8c262fb8407aea7fbd751a22c9d7cb93e7977b8aef8be4c561e861f4b8a871510718271960e690b344922342939b105bf3837a65bc057227e1e599e01b6d9760842f9f6b161805b2b79a2c18f3e1b49b72cfb3c9d2b54ca8500a8c406191552628f64c61cbfa53345a749b24c19750d9a70bf1091449c1cfbc8b35cc2c2bb1c937f9169fac7103d3bc106cf51ab63fdf05fa2385cd8bad300665b1e0451a5d3162246861f742dcd1f14e55b80430bf57c2b5adb906d366576109770bfa4d912c4fbce218d844608df7665ab616c244b02a8cab222fa46032d8d519778bfb29f54141a06be2bac40bccccf1e48bb0382d5e9c686c6c641a5a0a0958946036fee61f5a1cccf97c6fe3ce500e5f673f96c6fb8a2f1cd9fe20e41f0ec769caad18de1a4e697c575e8609d5de70f623eea56ba895be30a02c21128d41735e1b973e05c6936eeb4d891a21285dc61b605acfa6446aa0543b8fd0e47ea281c89978535d03149c379f49be28925cd4e69a0bd3d3fdfef24cc2f80324e7fbe6f1a1ff8addd817369261ec7d5031eede2da51c2e784d01cc1d302072c0977be9cbbd8635e0eb2445dc16a7f983bd8a76a47fa107c60e3874c52ffaf9b174723bbb4743b60b9e044fac0c6dd7b2d4875b98303ec5eb24a62a73976fd9cb23fd4b68a9ecb85fe0aa1d2248a7969e69cf3056f3b7a3428dcd32b9c0334eecd4d25538073d61489f0a614b6b8668e117f1602dd1367a8b2b1c71dbf2d9116965ff5bbdf7c20b47ead625cde099e46d7fa30f7f78fc09aab5dfea0336f0f2891d4e75d2a8cbbf2124eeb5e615cff5841e36a40747b2f85bb26bf414efdbea7cf383bdc6bc053fba3d5b0e00104c67a96d0fae15f1d19ca14d6c8b13ea0d2738b4e1a8aa24bfa23f9cfb5a2d31f6a7d002db0415b2c253083fa5a2ac09e0f84718d17705bdd8f3411d64a1e05070227886ef64e778335bdbcad60288612e1d3ae7df3fe8b8cdc58c0734f8dd5b0d87a6bb2b1cf7e46539b66194fa31353f121b55ff61f96f2eee8dcb4b672705dcc588329a089f13b0d7f75ba4e2b9f6e460ff6c115ba0917b1f7a52a0b3179bfef06be5b6514807bca940210402dc8afeaea8db8d669b4670fd86a46945fb748da225796622ae8f37fad247a5dca3831b6773e20e77abcf1946b89f6dada4751a959510b95907bddf2d0099abb724c6795920f9c999e95fe8af0b0353ef84be105bfec6efe6bbc11a8cd5580aa281742424591bad00000000000000000000000000d622c1b24371be8fbf2190cb37d41d03e5f0608bd99074529c377337c0fa948eabea801ed4785dd3519ba60954e2b7954012391146f695481979e89c6ae732348e3bff41444078a4acdd4401c0311a9b7b0f75390d504a052c3b89bc5c86773b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004763683340a32e2e6c4814cb8270521a7c5423e583771faa38f03d89029e7ffca04976346532b63f2d4fa8b405815c25121e9f08652a5da69912d2731d09f820f1696df0ba5cb8bee345c7baded51bfe86bca871ec7795eb2c80bea80d90d0f8f783c9857afb19e2cf16856cb7bebe7a266fab9265ba20275ed32460c2894fa40212bc64185e9d66a44c77456bef4e12fc2d2374c72255590a64da9755fd48815902284660cceb468de24b0f537f171fdc592877701b73102fe7e08a74062ec68e7e0a02e7f6c8ed8a4990b76ac5fa61cf73ce47dec0e0aa3c3115e21b5fdc16c890fcc803d52bdea78155aea990f67555849cad2f2adeefc4d5f5e4e82c7388f310a70212035c733b35382ac1e99dad718521acbaadbb485f20388138ae91857f028fac022b644bf4234a82434ed5942992a701a139dec0ab9bd6b8abd997ca4097c9b626031731634394cebf0a591d0aa1fe3f45ba783bb3e7b6a08f8b6959f2e1de168cd5031ed6841fa42c317f98fb09f8e659f1773ae10c4a4564ec6101fe8c0858ef349c032c94a56ccb85899581bddf37ef1c05a3000dfc57ce306ef640124066ae46b6c2c164d6736ee3bc586332b2b65a6a570f411bd2da4647ec398263f0e14bb9bdef44e60e4a640fe9915f6a774d89af725abfec94cb342bec0cba905955bdb4213b313f2a5df0c831817133568796e9ca5db554854f2e67a4ae42c5b56f5c378a32a8b28cfefabbd7270964b44caefdf5fe46bc6e05ede54d8c75caa8a66ce291cb5969e603373ca6d021eb66658b7e737dfac6abcff2125292bd65dda22c883deaf9638e7d633d07939b4698141343290106da8c607e20079057e72aef46fb8024a179b5927ac4aa97ec8d6cc6b3be2500beed3181758eeeece9f3dfc7008c61277e851db1f5ac1641be240e213355c45b41a43a88f4b872ed089e23db3b98c9626c8597fe32160ef717561f829f98ff7e51cf7fdc9c3e9fd55e56b90ae1561b1d41a15e6d939043a0c9ef2c1e76d28a4ab1ee790fc4bd8c915ae1bd81220e69b938da433f2a3f802ec8268107ac8d1d1a797589a592491d6d5e2ce2d00a8bdc87593b62e2de878cfdd8083b9207f1cefd8f2b4527a7a0468abb2efa0c4869fa004587db34355c75e4cf4deee9139c8fdfa67a723267cd80c1d8920f17b24fcb4eabcc3ba081122cfdfa320c6138b1c348c21513698888442150544b1d28e046175843aea345121f96a3a8014d21f0b5490af71eff38c579c5ffc0ecdf12a22274bf382b8d49f5572460e23602c41cfe66db4ca8a6c53bd9344117baa3d8ceb34b72def528fc471e0c5c382fef7691c7e2b6572f72f691e145086ea8aadc850fb11e38a03730cbac01a61bf3aad37bd1d35179c9f89b1dd7452bddec0efb27d3757aad7e617bd8ba522334c19e20d909f989d2e40c15d32738c7bf9290d5e3d985d00f8237d50d9d32d29e0b685ce2741e954679414983e6c8c72fe8f5adb274be567d34138366da076007c79c2a7faeeb43900e4a76d35b002d19a7d81bb3652f11c7e92d7d6dbbd2908ba6a6643c229ee3864cb9aea035f43fbea6f288d8021c53a5f67d62f35338db9d4823273e589585d8027b2d3ef19fdbd4de50e53ff3593fdf885ef393b74190a2e603d0819f45b9239e599b1ca282791744c7324d7e7d80f5137452ed16003e41caf6d43507e8449bff6d6734c1e575b0dd4a6dfa09bb3065301fe0014a941e579eb0c47c325468b0dc1e94123f27f78ee67812feff1e8bc1122fdb9aac1c62dbb348712bb4f96ebbe4d34cf0c89899ceac2e5b1e404c29c013c81c8221a44930039d8e19cd3425fb895bc08297b3597edf02269c54700da575e2699b595e04d429bb54f8766950f5555d2f24b1281af5b7d8d1618103e2e26b0d2687a50c54e7693b98a34006cd2061d3c8614249f1e5c636ef6c2e3457b2b52f5e82f392e69ddcf7b2cde3cf16d091d1d5778e02ec55b349217c0a1bef667c757406641051274e80de80b9de5458c2c2d319c4a7ae75db6735ebdd47494653142581061e382f072fb6d2ec2af7a4d956627e7f43bd8f6b0c87de40103b40f74149156aa15c849e4b1b2868852b4123e0fb78df5340fec9d2970ea23d87045e97d326e3da35e4264a285585e0ce5ef1b30df7a52472dd7bafb8eb4860377a67b35edb83941d639679449e6a2502f1efac0d9864ca7f305a322d9f3e11388a6d4d9a973ba5a505446faacb3ca3329003ed59a290a4c17debe641caea43bd9d3c857cf900fb45e7ea3a0f43d303555e08e1b2de46e26dffc45a475e5f468847752ca7f16598ea0b905e2fe83c7ff3055361fd29eb7d4fa91e8f9ad00d3827be1d28c5a8a6f203482e629136ee716622965551358128ce34a71bea43ce64d6132f96647de2cf4f42358eb869f3260f0c", "53", 0, -953249244, "4ba46b32da92140e115aadc0547a8c11a37f34d8f47f29ab5c6052e6771dfe31"], - ["030000807082c40301ae0ca80c6fdbc019a7bc780907d6b9d88ba3fa2b3a5445b4ddd3a372ce7afe02010000000465ac516aadbaec0e04132e4b030000000003006553bad40303000000000763516a00acac51b175a7020000000000c55eda030000000008ac5251ac65ac63651fae9007505499d2014d5baa010000000000000000000000005ebe9969bcbcf531a7c255d88cfb1672e4d3e0fe70bfcb0d7ef51c3d9201398a5ed3648fba081fb66922110d4c03d9104bf6466c1dd4ed6f1d5f7f0a1be6e13628fc921c2509d29030921b1be70e8a90ff996fc772a6f4141a8cb4792a866c3c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c07e20a0b23fb009bfcce4e6df835aae862f3ec28d549a19d92db4c5e1473f7217f1da27f68475fa2fe9675b0caf812aec44fec00ff046420d691e0883f31c588bcb769e3a367bbb6d75c48ed9ee5bb1b35686242fea12365e7e559de9ba8396e2af58e6d2180a90452f0a7ae541c1396513e26802f7098fd639a3605afe9c1d022b2c1375d0bce4b2ec700d403d0a1f7af73cac87081326f6e10caaff0c759b000211b2d69a90f08a7d205b442b784a68937144199a2d9d7687c813467471583d8b0a0885a39c7045c1ef94f23a02d3838c0afed70c1badb6d2b1c7be4b76bdca22ebd095e69fe00072ae36984f3ab5374d0b383089ef625928493e2767eacf1698be03220fcb0a42b2c0ce44afcbd97ab1154b0caeb6c6c6a349196aaeb612a0ba1ab903070b4c5c762ebee8ba507064d83b3ccfe61db697ffa75e19d3c51050698b94f3021fef1bcfa1772539e27bc409ae5c1811b6a0eb17813d8b84d604f0d57ed718160225dcebb435f0c9cbe9120fc9044748724af0bcdff47056127f69b794c3d073160214d72f1d0c9e486e7a28fadb993784874faf53ff4b2ec0211709acf6f04b2282f1ae56bd3e7878e44692bc02aa4e0f34424f27594d600da2fdc251d3983df0e7dd9a57b4dbd9cc746f0c993063bcad63c24b8f4614b0bfc7a82aae5358435ecbf0e4d350389833ae424a42b28e7e6bbae2e205268bb29bdecedd7c463b74decc1e884755e72ce42e5d1a021d91102408ae5da4b15440aa98e83415d85154c411ac2d26be233282b8e9676e3a7aee0da61edf31d0dfb7c6b019190a9e8eda7bebe90e59ccab136777e67977b590cb5d703da90fe2f786a267a2441e01b7d9f02bb4fa41ed05b03339b9254afa9bec847c8601d0d89e2f0603d08217318b945e318b13c6fbeb2516aae7b787100a4bb684f1706ada89d5282471cb570390a5643a6840c1517e3032460ab0d201756a507fcccfaf6157a71252f63ecdbc38ee01a3153d6544722b7992b586fbaf5bcb108fff13c41976917a2d845535c820c2b24595069e1778c02b0826e938b1af3a6f62fedfe60aa06b76dfad90c6c52f22e08cc29388291a3b30085e713e8dcf3e7743b36f5d5b1c3d47b98842ba994098e41cb737fa8386bdb29aa34937870a90214f90b7d05681798b3b05167e7463adb7f6bbc7726e14ba4a1930751f01a49813bd40301457d531cc4170773b4d998aa1a3d00cebabdb6fec7dc102d654dfe29f3ba252fa15436295f39c06405e21000a0e4fa15dd56b4cba44f0cc606b954ade22111577dd7da748e3d2ed8791b95db18a24cf7e6e86daf3f5642038863d93392f7799c4c8a5e715055d66d2e7a2d394e9201dde23e95fdcf5250ba30caca8a9950557594eb6471bc40745b70f2bf84e406162278bce22b1a9bfb7937932ece4b30603e6354b386bee9a7b30c2d4434b1bc5fc3aaa892360268a4bab5709252124cb20f52ab103e6099b7e10fe62332d79503ddfd935f32971148010623ea8e1fac8ee5db2f1cb5a49b992f53b09bd0eee2e050d85954301e55df0663122903af11e6951277d45d66e8609f3cf2e8fb993c5402961dfe51d9305a2c1449fd213146adcd2c9130671576f52a8adef376073d546c61e690f5bcb9812b6f92332251a2169ba2e4edda1a19304b85c6cc03a532ed040a579175f30c9987e4b654c9585d5b7c849689b54a647b62681961593ace67955608aef2cebdf251d3cc171bd2f2a8f214b7c59df5b67bdfb7fbf468d613cd93c6e72e794152318a938ca412b16445d3195d2f1b360ef77775a9d7ccd7f994514c6687a17b893d5458028a4af403ee9593ffd8782fda97544af23085e769a343a03c5faf6d439b007de6e177a293c9e33a46f4734ecec024767167b05722ec6e26c58c4d93daba749f1a54decab4433f041be27c1e879d17855c0e2b0f361e2009ba65d4e33256ab450d71d8a81bfba8c2a333a2ceb5bd4d107bd1140b542dc8ccda2b4333ca9c11b86048509a458271c392a83752d546168c10cba290a4eec1842f3295255832783ab349768f8406a5f3f20b66d6f46b611edcb8c8a717065d0c9b047694700f5c67cf7890be2a1865c69f6c4b9e6f3dbe4516f1e39bdc79f45f2538d24bdef5a7969870d44c9ffd51ee1de204321a866c014d64eb540bf5c0f3477538f685033610301ed2fc4ab91382a811b4bbf26bb984edfb3331ea25289efebed15b105569c8641bdb9701a465003bbde9ae709891cf13e18b563e5d6c136d7b8d5965f0947c599a53bcbc03025832eb6f6c80bb3a082101bc76db174b0719084c6f5a9a18785a9aff2a49490f5a9cf85ed7c17e5c158a5409dd088e4d56053cfe81af62b4c9f5e63d0c94884fcb1e3f49a3b3bad8ea9bed173cde1feafaec7ae75763bf2d62ae5b07ed9140d", "006a5165006a", 0, 21671255, "c3100d79679601b74941450606fe23a4c3c8f2ba7b2bb023d64568c3d34e9872"], - ["030000807082c40301f1a6a3ea6b9aae305fdd947a1862005b2e339de1f189881b6d12e3b4aabb47a203000000050065516365ffffffff02a717ff00000000000353655111e3510500000000056a656353ac8bc3dd2500000000010000000000000000876b5700000000009aeab98aa52c4c6a541c64ef97692ef0193a838377b50b1e46ec016113be5ab48bc4c4f2b7248fe16c3b4370acd7bf7e26554cce137854a0a9f75445816ba09e8dd2f57d72e585ee62ff8a569903cde7f42f8f02ba52fc84d49931a383b9155100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000357e1cfb9e7c108d48988c4a430f878d1f55ea47aeacf65898bf29ab03862426479fc567e948a5289a8f421647ab63dcb17dd154f4c9320f27fba0c78b3266c8cb910f9279b2c38a5f199b1099db551f8944f5b853503449e23894dd2a1706d7d3691c15edbf1632c24e7e82ef3e7bade0c7bfcbffb73ac2c7c32ec862d908600309a0e2b10bc59420d48c5253c44afc934a0ec30babb54555a4f6cb90c16f3f1702289d6128cf1b9148d89fc6514d5ae8c3505b7f14f5eca32bd8cafdfe49605a490a05788fcf8dd78d76d7c754da9aa2eef080a83e53686995bc654662ee99aa67ec42fa143af54aeba94c88c1df5b6cdcbea0e7cd91d669adb77e365800a870e2a003186e672b3e60dc341fd24ebdac042aa1389cc1dc48b0c36819fb7f76ab332a0703260c7e60f2dcbbaccf84708520df1cd794bf83dbf84307a0bb78db5faff1a337030933fb079ffd46c9d28d93bdb308ad8d7bb16af02734848ff3cfe01d2a14cc740305d5eeeeea5f1c4e56a26d9a503e60045a591f3f3bae7d83907e89cd686f7fc10300fbb239cf706480a3b97dac4babf47d7ecf85cc341dc784ae0789acb31bb6786f907ab66fd842fcc553f5e8ad3f28ccea258077288ebe9aec462f7410b1f499a34d65893a6ff1e6b9161ca12146b163390bef54e16700ced6558287f2bb5931833e5c0854c45adf12952f7f876feeceae9cf9bf5e11a871fc2ff50643ddbf9259d69e8e0146127deef88df632cb062161520194db39ff03c5887096b1d1ebc491c65a057b298a2d437a88ca93c329f8e5150f3ed24f16d478cfa582b1462efd472419299db50e0673085da25cbf404f476283a332da495f0a4c164f42465c82f123e98ff4e1a98c6e8e79a0904a6ec13ff356f82494a23c08c330124dac6f3e3a68d6e88e68a464012c4275174d8f68556060072bbff9daf1b426c099ab08fc19eac8bdcaad4239851ebebd0001bef474601ce77b9f967290702b3dd612c52cc81326e016f9f83b4cc2aa6f43e795b15f6e59e5766f56804fc1a1ac7adaacf9e3086dff6305482f1c4fac12208a7730efb6b38357b40e5b45c3ab465af4062db02de3b801d3c36b6a2b93947bc7fb67153e844244ddb001f7a129cbfe0706732f423cfa07369b9261009efd9289bc1bfe8f55d029aa19d98e030a7d2d2924b5519ecf3e875dc6c887ad02829c4f2cb6c4bb260620eb2c98fcb1f220b3d77208f8b844fca1e3af73b2a1ed40fc698aba2de2be27da260e0ae64034485b354c7cefcf4c39455e5ce6cbbd161f71ec80ef68362cd2d357dc734e3c51a644d2b0db6985887a8b0dd0dd551f766c0be3f49ff522730986f0e08a5ef72f2aa382060810450531f5d7253fbde1a603821080bc48a84af7df168025964f1f60d542613b9229da81a910c05a2c8815776f7f4bead9a6a7d4200495c9b2d9aaa64e9bffd29e3d619c1045c6c1aa824f2ce77d1900dbc6d9e300fc55e437472ac1ad781e606d9937324fc42ee12f9a599b8638610f8b1db792eaa18d8783ab08667549374c65adea7d850abe43ab29992a7958ed462306048138dfcbf77d1b87296108e010fda647390353dc5361cb9ec640b91cc4f3489c25de1aa46a602be27c9da09e1e50f9665606e1b25f7cacababcbad85df3fe0ad00bc2e19e131fd77625767c3f73cbaa71dd85eee9ff4148acc954663b1919e340d2a8c3451ffac074d5b05280f859cc701ccfbdc4f3721e00cda2a66445b80c44e02b565fd69e2cedc7258d04382892d173b3cfc9d0c4589ae03ec3652da597dfeda76d3730cf49cec32c74be77ea743846737274cb8519375d10fa7fceb9de15affb6f86573c9b68e5cc7c4fc617da57f6cbb856ef164bd8d22df2f51da63dd713435b662f0ab6d2bde64fc1bd8b60358a24fcb643da5e2d0b273156a15ec0f60a7f210b5e271046c8e5b807fecf4df084ee1cfdde2ff3977138f899cf9e81f5aaa0d2608fb5cd82ca5f149936edefe6648ec819ecfc23c76e75854099b48819a41b2f6a6d6d4eb77b9d76407a15ab568cdfa3b8947f78f6bdb115fc76fe1a7af9ae9c748633e1db3831e25923904bc6772fa402926cbb7d871621d15a8a715d6df61729f831593a2ac6bca96275a8f1b2c8bf4ee81cd659988a887d1fd62de06338514f5ad1636d99fd1ced3dc304b7fd0e30052414056d3c351dc657397b3da919409f2bf81225febb3e9fb24696066d4a4d5323072c73aa599c59bb90d7f9f59e4b181bfb9c6cd8f9a40fd3e075acfd710b896e9da31ae5bc5412845b0fd6694437e6e7073eb250db1b096d441ad549c8554941c7b93e6609fcaa8c4b6307e9e35ad2686111728c0e7b6e5baef08394d345c7f82b780eeb6c3c807b46ce4028124cf55b88fedfd9b156ac384939ce3d18ff1e4ead2b59cfeeb91f5dd0d", "ac6a53", 0, -1068012626, "47641900317a5fe7c2af42f5642bfa9b1401375ba72709e13d9b1d875eebeba0"], - ["a06d466903d13341fbd5e3c3d63a31ff939ab62a3f0e35336090f6eb652676c7d5a2bda42a01000000076aac6365536a51874216c218d42c97db0ea63a73145c10949a7aca6cacf246a6cc21e157d1fde17fca2d3b01000000026a529d64b3b2b6becb5f0034dc1f3c9eb917b5b8d659be7b135fd94a8d724e643572aaa4f9c103000000060000ac6a0052870ce8fa03eb0bf0050000000002516a0280b705000000000300ac51ca02ed03000000000265000000000003004f97020000000000000000000000003dd311d71a3c4c63622f985a054b7242bf26eb7440eb102700cab90917f9858cc69b285fdb89776f0e04ce26ddfdc21814ec4298ea835b06d2b0cdb47cb6dcd99158b9522b9b03a781c69b75b4fac06ee2fb1e6c91d25f9e25541dd40c8f863a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cb744267886b4a934c43c86290750f8cd22d00c5c510b135cf85561b16cab06c7c454240a1be6642c5bae40fa476a967964be5935213e1fc6bce5a65aae801462bac7e497fe651f58112bd8615a5f60d585b685567ae89e8e865ed922f5388eec10151113ade7e7ceee65be9d17ad97fb64210dc2ede675f66146346aaf041fc020eb724adf0b23bc402677840d606ed13068a0b1ee1ce0457fd12cb95063b9b6a031c06af67ca3af68a890759d54677ac94385b8f021d5bc165ae11da91729663880a05230ed48e1a76b362d41bdfdfa3de47ea7475d1f03da19205ee16a812cb5bb34d347a1981aebb63b86e223a35f9f5c8dc9ed81472fac0f8eddfa434106aa5340215394deeefc72ec5c60a19f8f5cfa71bf164f65c958eaf54ca7228f64bef72990204a8a4c0a8c0eb3ec14fe4368f6db60ccc2a6e460f41f39edfa28413e6be59e00225618ecfd6c21597c8245e4c4d427571c1a91693b33b318dcbf3370c6f80c7fb020e35a5d37837ad0a0d52f33b2821ef48174a0abb0f0d243772b3521a44296dd403034e9200fd75e985c4b644802125f79e706bd8a77a43dfc9ada8861d7f6f1988d07c0293f3d7ddee268c2bccc0db46ce89fa8a17274602e74efd456010d77db3bd16dd92a7b704d62237c8581b8457d8436b1ebd38ae490914e2b03e97e70e54ebb1bf16b23ecc787b644a1e19a3ec23d269273f9e807388aa4cd6109100356b634c0a389d5309f50b55f44772125a42c0b8bc158845eb56b75518cc6d81619ceaf334fea5c9c51980f0ff76a7a98e5447c3e5839cb316b26cdfbc8a5212a036e8aaa8e7f11c978b3a0fd6a3d8780cc75be14cc4da9dc0b29bf9792a503249271a96ff68204c27964283600a09fec8f1980ce753a78d2b7994e78ca925bcabe4b0d727155114fea128ebacef46cd3a6f43aa70bb60d5ebe9ed5ded6eadbd8f98b255dd58925013c417264afe8656ea23f44a8b9d838274f27e267ed73e2be1dc374c82d1d6248512534d9e88ed5ba3b2c5aaf392a24b78eb156e4a169fb4f9c65e04c8b103ad0d40f9efd93ea04eb46e167fa24935bab58b25d478e72d74d5ceda43818f63cb6be296b66803de69668cc0452b1413f4cccdb95e94cf5b8e9973fb5b6645a82db74ae3e1738dc26d38f9ec2c245dfed6865b94710581c5b9d8863ca333e5ecf5efbcc67cd207fa658198b7f0f8bc26c9cea85a8f3c3c1a7ee1080f1c6f4abb939f227ccde63f8eb042f9735a9bac1078027664069a64b041c00a46d440322a329b51a0ee85a8cc42aed9888fbc86362194ae59e78bff02e2b0b7e240f41461619c8112835e1d21aa80ec617702b2a902a55ac1f64bd726460f29a2e0678a1d3f1859365d48c42011b08c8aaa6b93866414749d4eccc3ab22239c49f20109d6dbd7cb67c9595edcbe475b6a637d78b152561e117e49bef9fd4f8aeae524394844b700c1fffd4a218d21fa2bda17e7f4dd1acbb557c701c3672d3b11f8966f3c3d922736a93bf1b9eb8d73577e974ea7b2c7ec8b27f074d93f58d5779821cd64ef32f2b5e0b04ba91d0798733f81782b108991bbeeb3d39f207ce5eb6299c9683bff5c08333f6aac65b6e4316437e641f9140030d3f3b209e41e6c3827f3c8a8298e2c7eb70bdcccad70c7190dacad5eee4e90a8eef578a1aac7f4dedad47a3f6e909243677c3d8560f0569a405903d312a15c910472822ac610028039650d686a9170c91b710faa171301ad3f2ab40896ba1931e837a40bfc8294ef55965c4eaac464fd5efac52221acf7dd87856b841a942bc9d648a60025fa5edb7f85a166745ef9beace9489d193e48c9ab2dc20d48695317985cabdbbd9f599d1392a6695c2481723ae66ff2b6a7467d7a1f60d670505c6bf952d262613fe2fcf8279feddf885de52bd7e47dc7c4e50c369f96c0180f5ba4ef1b44244ba5ca3ffe1e0c7cc2d0f59936457af88c93d5f8aa57d70d1e3265af9ea9aadde712d18ba3429c7d28a967f0b832065fcd94cecbc55adb22a725cbf73cca279c133b9ba9948fcb319733a1a6b5471aff56626fe90b3718ea55257d0bf59a03416f58321be9509f9e2ffcacfcb32201b05cdf454d2e5405f7390637f4d4221e94c4bfd236e71219665c8f77fe8f09f26f463c9f44e27b98a29efaf1fcec1d3afc62d3e0429cda2a03e053eabff47331e5681a3006e0f8fb13838d81ddbc9649a8ed99d810ca4bfc869c2a02f32ecffb96ae0ab7bf5b370bdfd9176cdc8367bc023b5584043308c1c2fa5f91c8ba1a36590b281dbddae693cc04000000000000000000000000b7f6aebba6425c6d00dcd1640440ffec21c1ae8d63adf08666c498414745a35b7dc6a7236f1ff5153c4b763ddfe7e3b8b6f6b19ece64aa2f917e2d6cc197fd558bf3f55f45bc6bdad1a6bac4576f317928a0fa61297817ace497410d44eb5df80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088c73500021a43e177c7f472562b60fffd31a6dff16e4df5b29169dc57f02da9c53f0b78f8357eba2dfc2f8104272ec9a1fb596ab370f1ae4402aec5aa20364b403c31a10f4ca29cabdda83159f2df05ab4d2dfd2e787a7322cb8950ca5ec0fe9497258d468c02de2fcbc9cf72a82cc3287488c5e444ffae8faac46a7a490dff0225fb6180f8e04da73a15db9434fe0ae0e237a89c9907f3f6f04899b996666606021b771f2c66c3ead1a96003b30a66e4cd5641e1cf1ea4f4c7e361d770dfff075f0a0342c22d75a56c63f6e76f4acb4b81cdbb8addb70afcdde01f502855b1be40ce7ca6d9bc59ced887fd4d8667e889b8f9bd25508d9b7ebac6e262888dab806e23030510a53a8d9a89c8dc7c8db4ec74623a587ad8eb56e7991c67073cfd6e6e7598020917fd70a649f45a88b8ee657c94b0e6d6735ef2a0c70a3e67862c7e1038d7f0031ea9cd0daf83e373a2fb3da82f26a133a1c239af5d37841e7879537e509dce5c022f8434f51c90cf2236c470679da080afb662d1f89bbc3937e9f6f573c97ed52602092ce08db8a6f5326074aafb06d89c4d382b894ecfe89c1070c141d518a28e95d2137ae7efb0488881193249e3df152c7bf7f1c9d615bc4485d9bc8fa9793a548bb062b521cfa68e89e37bd5ff3f54ade6fda1f97be83e1d2a49501aa4036a4aa23837513b9db7a4954f0d1b292566f04466b3118fd94e20647c0888af2cd6e8150bae08fdc18335103e22dc9b6b8891577054e381e74fb20b288f931cd5a5af408e5df709dc4427a2fa4a86e50df121217181890fc6e41e17d4cbff08bce4596e465cfc155f2d86bb3392cd35b17bf5d77f60668eaf8cf2b695d7ba6ad6c2f1404649572e471523cdca707ab6d53ea94092535cad25e322abe22174d22c00a1f388b8e86ebcb6662afa99a4a5844ca9cbcc058a5d6e26d4615494a7daf6b1f96f4799a0eaf85a0685961cd7e685ae46021194104d61042af382419cb9f1a49faa8fe430f8651efca36d08dd8127969d2515a1de8affecf692fe2890273c0efad0cebdca071525c136b8fa50e421f9b085addc2c87c969839cbb744519b6161aed6bdfc1ff73d77ff8201cd2bcffe06f6b435bd746d8b7e6b7f909f78082c6b6d83a8d78ed93c303516677ef6f7630f35c3b47387c58ba27cf5eb7ce94b6a0c80d2b142f7994563611df7db874581946f9410d5fe54257ce3c8290b155ef8ce672f0a9957aaae4fa12d26304667d420a61d569fe4ba6d230dbb3d38944cbe034c33b47349972fdfd3dab8f948842b5b896ac0c99a4489223f91d1ff9c0548b36a4b32da58ece8fe0aee52d6b5b3781988997cb88fa9af0265e400d2e6acbeceed18d84edab98887e94327223ba3c7042ddbbb7801139dd9eea1859e54bed11172736c56dda4e4c5b64e21834c8a330c96b9af8b6c4f07b7a325288f1c2dea7000e32716c1fa6b6de7273d8a258b12094fec13ca2584a6e53fa0d86931d964624f641e1f6f651e084b4d3cb00aeecc33e9834bab6e240930969c9997e73abb24bf93089f41ac7c7aa1973c57d592c75290ac12df99c4ca0aead7c35468ea1d96b8fdc4bbab248d3e18a3f1612e09628f4b2eb09c5e100add1925be6f1b2d314a435cec51f3edad1a9aadd1af20c536184d5f6dcd668f7eafa5ec9b66ea381d034e33345211a1c138502ca15746b4bab8319b1e360a4144a2ffed7fde007f7fc8359815ea8152fc94ae34c48c8fbcb99aa01b0323ce353fcc21be22daf306719a269200850ff1c79971844bda36d0e92ecac1bcc285b1b5c8e06c1eebee0f237e23c541bb60135d7f4ba241a78d60519535bf5f9f09761414bd8ba46672ed18e2c26c8225e0dfa638502439ef514512a6fc5a0bf852ff6f18f762e09518621edbb8eafea1ad6fafc664f6cc3ced9e9b57fe1aee2f06f9762e79512ca3352f6489109ac80f53eb3a4ea314c8e618267de6f01bbd3ed63e92ea73305d6f6af7fcb547267c44c0efe4fd0b363285b08e5b6b041f078b462f57361cb8619d73908bfd439aca6de92e95c5858da70eff0d183b0eb04353ea9df7ce85ffd126a3a55244a90897f9be11447780bf9fe0c8858ee6ffe861103c95c8e5add41b6e780a567765a4359696d380c11a377a97c86fa4796cd9aa6ad43c2c38c4eff28a7c2ce27893d1593827f11ba2147ada5e30be5079d83ec44e2e0bb8e86d8f9f5d5872a1d0953a70da971327d2a74038f978d41202b8abe8cb912959829cd63032f6875e1ecb34b57c0901e784e96f398a5216556e0627357d63904000000000000000000000000b0aa7f7914aea1d1dfaeb7742266ad683179c6beb38f4cdbef0b7ece9b4d3fae8d70c99bd1f816bb6f2b170d3453eec1af7d0196d38a44ccfe807f3f77a4ab2e7ce7a0715e3935b67ad4b493f6ef4311bc5712a8447005bb705e0a72e2cf489b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8e9d230207966f7b19712e746a176561d62ded84d84391fe24da62faa6c602af5b1a7063724e8b15ca5d1f709ad080d127be23d25c2cf59ed48e647213f5bd35f6951950cb1975c6bf2ca3a76eb1675e90d7ebf0ee7ecf1e316071be7fc043b1558363ab0479b150438a2becaa8a26a9412fc9c683eda340a839600dee7e0080320a420cd0fbbbec9cf7ef312048579de948d7f6897502a1770704f476b3d63dc0228fd76435bb4d68b5148254dc4c98918743b6e302284c3c4efff94ee0b129b3f0b07f0316f0db0ae8faaacfd4a98fcdbb5f30b4f8770aafede4750b57fafa63ea608e86095a6d419f003fe55e8dc810c784101be784c13f64b64fe7f727d00e4a2030c451ddf2ac61a1d4110562c660029dd919937806d3b6dda7a30c97949eaf163032bc52dcd26c480dc17cf62cc716e76c3e016768423dda479f6d4f95980e02d74032cb8a9763afd55a0961953911e3e7d67900b4311168e4067fdaf701ba0dc3ee50217e6e079ffd9ec514f2b414d8d49f42e52f53e503e8b49681bd10270375d3e71022e67ec4e9d1b77772dcac1a7538b5b26d3eff55d235e52db8d4f58a7d94eab0f0c3fc7c17c6868683ff46805bf75b54bb4c9ebb45c52dc49ae0eedacd9f459163f9ba63694278938458162d509b95434b0a3aca64e3ed1880eab93355a7d5228943ca47e7ed85d334a770a6eac45fea1c04ed2ea2aa0bffe08973957a955251e3ec51139964391ff52d0970fe7bfea5ddc99c50e6b6c0f6b8bf355ac9c9bf002a264906cfb2211aef8b45f30a4ca3ce4d34176ed0c56d8f7eaca814b5246e94c2a80727b51660f64dab4d8f028069891cbbe06df78ef29080cb7c5c571813fbeabbef4dc65a690b0d7182519c5b31a72d23d37517e6989ae3fb51e6b887d80de54502e16dfefef941d970fbdbe0aaaadb4bc63d75c1c4443a287ec2de244edc2311d3e54ad0ff36ff7cba8e255181d3fb880b831f37ad2e3013a7ab5ce8b0243d13ace6862c612d2eb03ec9ec7beb72fc4f478230bdbb24884a33cf17509df300f0d557f305809dc75ce9e3fbaba30c25ced0fb61551b32f361f3f128cf07079d6eb40767b2ef9d7c823b3dd9345acb1f81248cd0fbb24b88ef4297b42118dccbdc1c23cef2233e38a2e4a8490e1270bc0baee7f2efefdda3443bec9c031382a7256283c62591b803392af44de1edbfb293d6fd39f308912640df5fe554303d0640097c406df19fd3a7fe986de43241a6f1bd7f86a05449287b4b2e14aad730eb6093b5dc4da7a0fc647c11a6e5fa67373d9f1699883a9d2dc2ccf50beac428f4e23b898c807090e3d38b2e82838a07fb9abe5f15c930f76af30e289a4bc70f570c0fe93ed08c95a11a1367caf201716105b087776c7aa975519d0fae53148742ab356d1d1de3aba983e7ee3a77a6d97fe24f7e1fe29f3dabeef46e0741618789d16ca7d2056a5d509b40ad40f0e0f30c1c2eae87b725bbe479523baff4b27d1c54f9ffddfea3223fa01431210498d5dfa01ea23e0dcbe81b0a4efdc8a6ec37b981b810a0cbc1c197a531b7a3b2cebbed06e9116296afbefd583bda74f9d2e62641c9ca51748437b77e123a2737de657a58808e1afe90d838e1f3b366b5569b08c9c44138eedbcc211a96a463ec6d61b53e8cf1d791926307bb2777eaddc3f2e650b5b58c4896287e4533c61a435f7cfc4d9206b47158b45db50deb91eedc5c8d798ffcbb602f1dfcb9f7a319bfce99e92fba927b2053fd8de344aae526e06aa53c2c041ce09948882b1d8ddab767be211eaa47a8bb5c7ad1d339e06d3bd290349b93a97d6adef0519a675b0226aa749dc1d0b59cc3554bfc495220f1f1604a8885dec914479cdbb1ddccb7b0ae885b7ff5282306ef9cf8f94e8c4a153cc0eafc3fbe24e099dc93436dc109f3b7fc8b1f07655125a3071534438ebfbaaff38db886ac80f7b05ed0fc1edb9122104dcaa14bd6dc82642a5dec4ce4f9abc5e8aeae537f496586e57c95053d99bc35e9e1a1fc6c74fabf1389090ac05581032e0b54867b88c906825be1c2a559b2e20ac183bd95eae02299dca2c4cac229d04272a05368a136936577c62d331600e76c1649fc95368e2fcc39d1c7b9459ba845a63a38ed7aecfd11881060e83f0c1142c1f772098ad6ab974020f8cd5835ba3e1d6dfc06c15317a24f31b912c5bbdb45f0f25a04093317a43775e2a7657b1813d89d6a7f565e72e507900469ff21d9d8fa1677361cc0d7eb21c3670cd4889f7df40745af7b4f47923e3bad87ae6f4e9f472c416e8a6d4e002a347752b88da518b0446d85564421841500daa559cf9cbc16e060ce424a47ea60071d3b7d02ae7a24ea03154305c4b2ab122b3f7439ed13029d5c8851c62002f0df9163d86bdf44c9451f27e3d89f7213fe28efbb7ed472029fa0c", "6351", 2, -336737076, "21147e08edaf71403fd8a4c6f8f85ed5460af6eaca430d5744d9afaaa62a8d24"], - ["030000807082c4030332fec50e3551113a6b5904837a70ce061cd9e4862287d8e3b74667774f043467000000000153ffffffff20caf29101680b449dc7f57a6073bf655541b33b775d63d5f5fa286925dad702000000000100ffffffff5dbaea0192f45032a742259cbce9e4e2ae0cc02ea3c7575bfcac2dbe4f540d3a02000000086a630053ac636a6abc5f3b2002a777db010000000004526aacac768221050000000002636a3fdda25800000000020000000000000000cce496030000000076a22a624e4dfc73ea3cbc5e7f1a525ba180158db26c046611a4be14d4153c2b558283eb83a630c49d0d5b9b9e750a4a6442277bcbbe863451ff62a36bf35235696c9f29805cabdfa2d16e6b0fbb593221d2889a3bebf2e6058749ac8fd98b23000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c53096053c714daac2eaa101b3a65880e28489058f2e1b1ceb0f0028b24f9a4e0ceba3008137ab2a1b5ef9002b60164d9d513c6eafb51b7029b3da957c11b81c72ed15af41dd4e1596ad326053268d288007792682199613147d310bb975d694b566783c1ceb506bdf189afe8c292fb73ac5febf92fe12b04bec0bb209dfeda020879ffc0299e4ab5789f8d7eb86256a7d457fb08f96966225b52aa2f6aba8d83020e2915f2ce202e40bb81f3e24a035a1979ac3387fec734ca7eb24f10645d71130a081edfb9fd0261a7ddbceb8fe9b25ca1a5b9ef3fd941a63524a35e6af6d629d87c2366d27d349d43ba4103a84cc1fbdfb82b7ab601ae409ec4ae2d093357da6f0322d04e0f6e9d0751cb9165caff2f19b37405226b02ba2c1fc0c54336b19e1cfd032ec6da53a62d0d1700999dc57697daef40f10deeb89867c0aba0dc800fb6817d022ce1f46b272990336bd99a5f3737a26495b00a163ce910e144e309e699c8aece020643522efd5e81b640a98ab4f96a699c7f5b9dcc1fb1745d4f2fe29ea16f4d96031e562454686e6d4575bd4923c1a37a3bb6f9019d800dde8b0a008c883743e8b85582516e1004491d1b24ce9ceb4beaac4e6a0fc6a5c2b59fd8d421619585e67a194346caad45afc856d3fac864c552e63da1be8ce91bd46885db9912b5b3902f97078c8824db39e90f387750574c9ee84cfebfaa30eb6e1b9d3d12c0975bcce06a22789d4658062ff2fe11c05fd8898f1393e13fcaba450d505671dae4c7e801784e8ed07a9e6dbb4403bf511a188ad9bc1a77b749aaf0a79b1b96472def2d40006273edb62b5a71792c620cd55a34a537bea703d6880a50c0c9065bd28622c3c96273abca05aab1351cb028ae6ec2d4fd6f470dd000baced525a0d6327f14386b3b46962675345290cf0243017e7239c0703e1f56edb915eaa22795e54784b9fc1974d9755950a50516c372aea5b86f84b3a6a2ecf16c7b6ac72dbc791846463cbad50024a2739f91f1963ac9e72b82677aa1d7cde4519881c6caca0eb31aa3236e9fc46aa2b1e7ef5c0fe951c40f22bc205c0c4d5b071d76bac0f7ec5d34bbab3d8f9278d4c9385c54809363bddbfc181b1ee6f96de2670a9740e8b08c8d891787e8d3a128a3ddfc153c771f26e7a87212d2bc86800ba7bf9a907890789506b4d7627e8edcd2cca031cf66f65069cf30508c240051aa96e9396ed69ba4f510c5a19efd1a5b9bfb14cf33894d9cc3c638f0de1be022cd6d2c78cc83fc458cf38cdbc3f0f147a93f1974ee54cc3af8c0d37d25186243de8857f4c3c55d4d74bab0387927a1806f588a685d1fde43d9627b223dc51d486091fd86b90cc1c1b412d4803dc998d4e0e6357e3abf66c48155e8445299715938207fd62804e38c1ff1d872c59fc25f7a0ac6d5f2487d063eba052bd0d3b206f874f23a332af6cd66aad1c8c479a4e6726649e767757c2d9d22312662dd53c72133eb89c8b20acc9ceb0c04bcb7177bc487b7e822a7c2a949c4f2632dfc98a4ad845a19c9151c8f232a2f3914383fa699bebdb5cd0b0bb08763ba6f3f9c37c288caab932436f04046800f880a0f40248e69f38a50bbd9d6776e6ef852490ac0c108e272314a887421f5f0c51feb47c93a1ff36a27ef21978e52b29e2ee712771164bd300a811b24082637a2f2ad290f3154b962e494382641a8ce8e7ac62262294ce00196bf9afa0e4d6580538aaba3397ac4c1e7efd0ac588b1860f4f3748224d8ebfa23514ca56160c2a44653fab19e5adb6b26005d08baf838cffe998ea10a74fe8163d667f433050e25483c891c0d49686d555b8d82b70f9c255d41367c86214388bd6ec913bc34675b325e0410ee61e611bb66c64dc2681e618d0da915186ccb3ff260bf8184fd1d2b7684261b466413874a0ac47c44cadab80f9b95bd2c3bd7425c516f375c1a1a901fba5a546f2ab2a5f989db3e5aa566a030c9bb5ea91914ee6ec7d4f4bfb41dba2df814f036780026b656387f6eb489144e5f9536aba0dd3f2bbc13df65400d97ea625704264b2d2aff8453818fa4a969a2415c69d4c583edcce7075393ca2c8761abf96d2e4a969d9ee5b62eb353e0c9d47a74b8adb0a595fea2dabfa3d92ef7ac91c642f6a14b00541c66ffa469143c05d43a25138a9bd4cad4757e7941fecfd2076cbaa34a9d2555294b5b0a9764129798843c68d4ce34e0d6995105b9c80f4820bfd30ac678bf3901b063b5abc03e305f148f6f61c8de2b86a5ab45734824d1464e7c7cd7042d8b690a38231a699012fcec0300000000000000000000000036e3e38fbd705823cd07436db95f0163b335c6f5d9340683eb2807ad7070e4ebf6d7ecb835b922447201121a822ba22d4e40173fc449d668d1525d31ff6fcc1c4412747400440de83a571f6c61e892ab3ce5eb9c594184357d85a2f58975214f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009de934b8fa34b15b49aaad172e3d6bb04e06cbe8777cca88728d283311c8fb5ed0a5b2a19ba8998a18f02a878303f508f66f83e93271eec87ee94f722515489e4d78f9ca7d85249ad71a80f0eb28a42a7d4efb96144212666fd9bba84d9ed0c18f16068fb6596a6d88b60bc00e694c455369caed49018d19803944884893cc700219df174c07c2877c99e90a196f00fe0bfaee8ab9ed708f94b620b19a57248941031b1d4a118bb7aada3a96ad08695649c67f61a7b26f9a23611f5902c0d72a9bb20b08ae32a3ecc14c164283f05751c81992b57e66e5d4c7d2eeb06e2038a78bef9e75589263de3608bd1e54f0c611e5a0a75267849600246a32f484b6048cf24b970224049f65fe8b26c2ea2d2e6ca7f4925246c24053a7895d0b61ebb703764d06a10215f8d975ca0bfc82e369bf80ab446ed5e6ef0c3e059f7ffc61caea61b3ab56150304517dfb083c2785a3a6099b827fd92ce507bc9be1dc01c3f566c48689edd433021e42e508c055fed063e7763565a53f44573c55bb593dfba3b847d4307e56850b02195f27927f075caf9db40e534776966549e12ad9f0e8c9c4768f7cfc88b5e2c775e798ec0fd9c10eb3d4c3bf95ffaccd76a94a96907054be62737674a0780a22439ebd925938e3fe9c8bdbfe8e39b88ab2577f7287ea1c00aa3f1ddc4046856b7a876eee298d607b5f3dc67cef89d0d82c994adc162b8ba32311cf7869475615319a0e2bab3629d80233dea39088038132d990d67563183f7aed1403a73fb6d0143da1fc7f69c0fc1683dc288c76833b050a6b8370e4e39031866fbc72f439dc6a147cf594584f9ae308e586818dbe9f0017dc198c2d7046b5cef273c698441b9021036f3e937966d593316b46c875edd7efc787b5bfea75f0aec88fe0a782087f1ab508d946c5b0158b892c89e28b4be2a77fc8f4f04936fc19b0ef75017bd87ede3a18ff80e1b5f4d2eceb331a50f9959ece9a55e9280b52339a3e52b9f24d67f2ab838299be1b8910b5816b17a5caae76796897454a6830ad1847a0876b38663c5275a2b58108df0a2cad764cd585846485aa381cc9f28df831f27bc47c61dae3e66725d5c6f6f8f0f700d3c8f60f31d6030b9d4ed6a8f90c1265e27731c1aa5a42f1b1c3d3371d25d4bc8e8888cca9586943f9e4077263e2ea65b6d49090534e11bb3192234227e82105a2caa13cfc37d7cacba0c782fe20ff0f0f03fe4dfb2d9670917c9d4785d12bd39ddc096e7b08c8a5acad7c8d9e75c374cf6bb0bc9cdd76d2e322907553c345a2234dfaac91a350c874ca8492c4fb452fdcecd09f0fcd3c827fa9916db5b8c0c58ddb42f12b1a7d21677e41390e4f2b16308f61602c89e1ba14e1a06a117d0911623ff04c850a4a02404e76adc869ffd937119b687f72c49b15ef4fc82355a52852594f4aba0d54e568eb00dd2a84661a54135ab649734844b48acfbe7a70b2384d64e6bb2d127a656ec667ec2bc739ea58d5f910121a545eb05f5e6d5eddf3847807009b371ac25899f8771044eaeead60ebde148087df9782200293ef0539ce281861528640f11e96774ecab20eded8f7754c2cb202f0c52c419741412e5f4bacd84bd40dfbd2a1a8136491dd84717e3f0f285f6d783dd7abd637135fac1e86ea416e311d1c5a941eb3b3e1a4f9e25c1c602465fa5f96b6beae46af6a580cdb5e17105daff1a704bdc7e5abf3e311b6dfc765a036d015b7eba6882f1eb3e7f385fb72bed3b173dd4f1cb30f5208b60f0bf19373c5dfe11d7f1eb2a8d9c18fb509e56d4a0c7e5d6ee29df09951f2f9ed5cf2472f0039f112dd724fa05f61c6ce85f5cc678463d2a054c3c8e6f2f697175c0c508cf81f483bc5faceb731ff1371400649294555444b7fd608140ef012f971014c79cf9e2710977cd410ad87ff8e67c2c2226f9392ba6b5d0670936674c581283545775f17b4a674983eea1bc3ee1d95cbb4df8d16e2dec1b6a47a790205552b166aeed8f60f1f08ebaabb58537ba29becf00df2bbaf2754244cfeefea6907247078d2527e895da10de885014d6d0b8d2e901491cd5043365ac817a56c5dce544d60e7174d23857bb8c62227522706e6236414e1158cd00ee0f67535f6d8bc0663ebeba810f61ef94e7dda0ab95467ebbb42c634415779d69914dae24c8b6de5a645066973e310fce0078c28b66cf357026ea83a9a46834aee3f3abbe0a8a2e9cff396a60ebb3ceb5809a0954bb11c0d7cc12fb7ae5d165098018eedc4e12712627c5bec6f5c5198de441fb7a1cefaaa1bc06dc1c16c9cbf19f8dd99ca10d24709034ce57b27ec2c926268c85875b9ae5cf1d521e76cf336137f3488eff27ddcdb09344d160c1e2c4845574ee15f34f074fdd95f813e3afc29d7effc4c8b4f30ef67d6fc9cdcec6a3a63997eaf596af093f7e30a", "00ac65536a5351ac52", 0, 109140103, "fbc44527650de83b02628e15ed0acd340e439dc4593af74b7569565582c6d16f"], - ["030000807082c4030410db459594b8f6e740885a7ae1ec4928ee47f60b437a5515895cc928bcfda5080200000000e705d366b5b2f61913252fd8f11c847e69af077beb1295e6a49610e8d0535215163ab1a802000000080051acac51515251ffffffff993a1c2e7088ffa21dd36a56ffe234e8ea93bdf634b3e009e49ec943809f7ef10000000000a81a51808552f9a00d671bc11ffe4f3a07991ee00b5f730d23c6a4b796508a18fec6d52e000000000965ac515151526a6553ffffffff017fbdc4000000000000d2e2926700000000030000000000000000ae5bcd02000000002b27af0c3f1145426cc4a85c1d06966e749cbfd7329cbd7d5f023c838313c10fc6032fdd3e623eba4d3fdc7a4c8bd77415473a681673a5b483ee420929c22a6cb75295e8172e80b2725d7353f34e2d61baccc0934d163d066fde247b40df12060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000092b6e5d7647927db9013299989b75f7588cdb93a455fe9755daccfde59243bf9216ab71404b269d6ab6b0b8b3120608cf43ea28966d396e09107a4565ae2056db44c171b917f7f39d0fd5e81b0d174c6060cf424926ee5f6d03d6c58f967ad787098a22aa53f1b6e45140188ee6aea9a155a3aa7f8251a659d933647fa9c5cec030c0f62abbab991207c2d3ffcd4ac93cc0c4d680ad097a9f060ed0eb3f20564b40329f851df92607a244e9fda88983da118791808cf8e4bc8064804995c8cde5c0b0b044c50b914ec42e581ff145493ab9729b75d76bfeb6c8bddd79170bee16f47dacbf2136c545fb8113c1435fc90f3f37911a3acb57d4b3884bbfca22f9eb8118c0319e79b6dfe20b1dc314d8f450eaa1d95e360631156ed6892777421d30c34bdb00317d4f97d08983f65511244b3a856ee997b9de69bc433f3b44137059a029c7a720318295e26a5a91ffbe9dc4dbc8b5f958cd1d240cbd6f04c1414bee09e0b2bf2f5031e711952fec7380fb0ad27ca6ea680fb44f087eced2cae8778c84db91b5e0462021aa760ff181249ee055654e82f4bb152a1ab7db89c756a9f7cf47c7f41c89e12a3c0e99dbe6d779e73822359fc1c9a3502b8329cb46b1042f6deaf9a1df65bdbb3f29cd6c6ae865e61143311a477cd2156434f3aa10f15200942082c14788ba7768023c50f0031a66c23943066323ede4a41a51e68002b939b20cb51f82aa07d5cfb927a1a959c992e7e55e8e0735ff904df0fa3ff98d924f7ef4b41ca60be922f117edb7a35c0391cca249adc1318b23c6c792657664a89e84f17f78a6f3d3015b48a9bc17311c819295ff4a3c5879a988b09f6f0b3e0163057fa9cbe9bc81441d85df5903c4fa940f6272c7f517e82a427b53c3202cb7ae923787170f7131fc683343f44cfca61c539b61a23246a874eea817d366c5711f97bc6a21590967adcc2dbd70c9ee79e18c27a8bbc462ec8c05c0d6d66deab8cb8cfa6e338f68dfc6d68fbf5e88bdc646fd2f5ff5cf310df0cfdde9a3f4e469ec4a46d0ffdbc16bbce2004d1b328d62ed4c8625e439d2a2f25ab258197d462a9c32677373a65d5f5ef92d9bfdea8938244417fff2dbbe18c656d60b4fc0e0a262a87d9f16cd795f2c87db0d81dc64120995b873312eff8bfa55b71bbe1ee4e88a707f5e28c5817a396e614c75a39e7d86ed5c530cc67e2c2831c67b4d4cf576ce00a3775a3d9a286aeb5aa028cae0e0c64a3433d609168e0227b964bee9330acf76d0e5e2bb85e02ff941c917472a0110ec630bdfbb0dec31d22bccc413063ad131a0d17ba4a2c963c21cf8f34f30b0b9bd0c480716b3ae1bd2934d4e25cbd00c6728dcc6474c096ef1e4a7c71e0776be8d9dc1412e4ca1f65520c4d3fec4a992eda7b8033dd6d6a2f21e21ac49b430799b9939e68985fea3079081f39b6326f802bbfade590b6c538dbea9be0399c47f3933eacfd86af88e77eca9c534faff94faed853bbd2061db6bc7d12dc9dd1a083d2c7331ffd935b3c4bf43fb80acc05fbf4dda73420cb0ca07d75c2f07afae39bfeec68070970e6ec5c0001800454915616586bd81f373a320659aa16044a1edc2e0aae59924bbfad1b973bb01ad946a00682dcdab14e5d5df126259f1df36351e6c2d764710cfe55efbdf2d011d094c5e65290a4f3f69a1e12a0b234edfef8834453341912b3eff60c18b360d770652fe45fecd8b5b09ab9d53ac68ee180c6fa9596b8f0bed93f32e2cc4f800224c4a3abf3f311caa0ecb88372600d6501af7ca37905080c7a9d0083c7fd7c58364a359981b1528f8a30cb9eb73cb419da5680c5b70e1731e97a54620e33608015328e1f55fbfc9ae427dde0f89dbd1c9e6fa666d4a0ed11ca663048396682d05dd3b13749d0c8f73ab2605f6dc8645f5acaadc69fb64f301e826c8210667696c126b2650ca8ed3131c092184fffb411c0227531244c4bec4bb5609bacda08f862128c57015022a0e498a950ff33eaf6830b386693582ad8c4afa523b64a973a50827d870074d5af10421d6f69b80019507881da1c328f43418c109796958961e917b10c727e3ec3b4c88ee9bf0a0c3e50735d449f5c054c396354235af6e144576a9e4e276df9f0f51889e62dc47d176c35ddd49f2b8a74554d06370f479e15d705a5307d03215aa095fb1d2b47d87b9f6a318c7e7b37f3fa9ba7b36eeb4bf13cd1ce8cf0294d0e980c66e132f34e233c82d61e3247788e372af9049a1993dd0d154e55163d9c665e7689d188bdf88b446ad6b7957ff9536dd48e36799870010000000000000000000000008a3412f6b081d3f539d513dabad9c73fe7962650a97d3414b55d4a77e30abc09f1962546118006fdcfbde82ee31d4bb594790df7d827d218c0938126d84cdc0b4c2cef0d43ce00107cd1f2aea404772d18e5c74642d112f9ce06f8b13d4195a50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087400ec123f1becd9857782574629a062b96499ef888b552c28c6f5e03f783445dbb2b021e1ec901c647b01b50e55cf79716143b8dea119fa19567eedfad696846e7794e82195a44cc4718d989346bdfb18d810146fcebf18aa8ea6827ac5b6e955caa1566e23055b2001ddc40da775fe8a3a851677590eccb2b144dc4014a240311e55e9c79cb144b561e4c1b3594de1847e0d1b319bd9bb17d54ac830446805f020f1550a2734501362019bf823584d9aa8122a2ddedf82c5af498717aa585b0d10b075338d81b7d69555e09d2abbe3bb2d571b404646dbb51f6b896b3be7d58dc11b1a6e9b7b9345eea580971d14b2cde693d8e3fa84946f01a15954c7d12ef67d4032e3159b95ec8b7d2e5d7d1e86835563549e1b346d33830bc87ab9cec9349169003062e6f736983cf9294d9b4574f5f69fc327bac17058347dc590135ceed85bc19022227b841abe2bc30dde21283e64077c123e48947132028b9f54680fce738b7820217404006e50a8d0181e107ffead9e6dd30e87402990993d3439afad280a13a4f022ac853f75e691b21a245c3d959df29b27a9e750cb17faafc0d6f559ec1eab7b4018d6ab4e09ecd8eada11ddcdafd3aad21d74c8ad20ea85d1f7428397767203960440a16971c5c9da4e1fda857879da52848d813f8040fe5db7ee9db7e4fb42ed4722c7b47affc0a769985c24e5a7116517cccfe5d117d259e3e6c1acb742e4170bb1574fa3cc2fe26c0abaffee324a279de53d4646043558cae67c22850fdedbde73049bea1f01a3be46bd76278c5172976481d3a0b1359458c52244edfaba193a0d5541811b918bb47eb3be0edeb2c538c9a6a13bbfd2a73a0521a2ad2b04166ea2c86b396edebdb93d8fcd45b43ad12d31df8f034a2f4f49bc4d3a6068b3d581f6911d507e101d0405d17fe11c769fbb237bf88936a70f11d9e0ff36a1cc1abb825345aca735fb80be190c4a97f264bc46a3971d6010dcb82d547e41db3b772c5f0d37b4a34ae15818077b2ead981f552a2023afbaac509ddff3c3b7c28d9597b1dd67b4a11ef8358a4dd8890d6d4ca9ff125eb16d01741990459168014b7d2308826eecb6b83b7ffe5bf149d0860da38ff90a57ddcee4706cc0a58b2d7374f005a3e8ed1ed00012e36ad8b9abe01ca6a6988c9b426ac96cd97dc8d7e1fda5779719cab3c505322d0a837a099819979975b62e4a9c1af66c595a4b6f9f5ca6b27fd4632414aa79d99db037e212042011b4dfe72402ef7cc20b8f41a29a6e120d0f6bb656a886e516ae6c18b5210f461729482e3c38c3f2e955a40fcc95b8e0d4a65288b450aed1c08d883164ef667949361e9627766156b28a54411387f5a66947c10b93fbddb0313fd6634030fbe3773b653e644f5153c3ceed0c47ca28588177db4e7d19d17a4302233764b49f9b48447b8590ae5cdacc1efa7385069fd900bc034bce5400b8f353c5b079fcd2ca6f20dcb8d3f79180ce8526de1bc6715aa9ad8233c72047c0bf3f6042a4bb08f5e4d3a1919d95e6a4f3cbf448143b06e3bb861a8603127679026b251c0bb67fc7db4734765c0169afb3ccb5a98e321dfc716441842b7e9c868cd54ea0a50fbd03da9f56850f011de03e638ccd59d2b1bf62d9323d60144684c4b24a08a317dac38eb4f762ec47670f3cd0a401b499da563a99970f493c24b902f63e07eb0eb0e4a847f70a8e573e180b7ca77b24571a05a92b4a8b707dc8a49f7e40f2f29f22e932e42e4b11bb54e3b94df6855949ffc0a2fd7dccba0a6e4d9ffaf4d71159c3dd8f95a015d752897d8e7b87c3c70fe7a411c10aeee91be8ed66a2c996ebe84e62182a6f1aeb4dd582fc9286ea0814f6893afe264ab87f7c007414a5df64a7be3bb681a2991593ea5adc6c7283da4b329fb3be07a5c08426633d5536969382acb454c7f2a2e009ebf8eee7d0398d0ecd8d3c663fef234b55a164c20e63173320a96a1f2fdf3410395b5d717d5b204fc0a46231786d90791c9ad9bbb5e23bc22c19235521c67941e35de7501923e214c2341575fa62ee5f7df30a1449ba94ae0071f6700e1b1669dc18b9cd16001c8231a0956c1233890301614e1fdabe28f8dc226126a8d47b340685011edeb6f9690b28d8a89f925b8b39308918751348278c5cf5ffd38e0bcd198a015258937485ff265effd62f9f67dfeeba42ecdb0e6204141b32e63dfe25d3f7a35a55b06f58b818ae2aaa7c6587e0b048c8a22013d12ad6c14cf9265d9dfb33f81036aa2724147cc186f5f1a5098e7a63487ec716ee73b7fcc00000000000000004991010200000000b757cee736c5cf7d308d60c3058bf5be513c9156fedd84f8c9eb5c111917fb4bcbc4340c38a83b6df04a84f98c9594322741f6d113c94dcbe01e60679f79ce41c71fc6154b4af35e211b866a7d257de7eced375fb3bd231a9583fbbfdf5a3df600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000732ce1e06443ece8fa229c52f9c797fe76bcdb2a9d0dba8700dbd3316876915a08701ad3a38931a548adff66a930746cb6f5dc062ebeb6fba81befcb3fb9b03e6a64e57e9de7ca11c3134f1c4d9e2bb1d9cac02abb7298dd7bd9821889a7caef888fc53967d6968988d977fa6144348df9a401acec848d1c12b6ae535459c1e30312a8973545996a292eb871321fa3fdfd5118fda2032b21eff04e30a562e3967f030cb29731a82c838566d53647c902c9170fe766cc4848ad288f82de0c15b8f2160b04e05bafc659e834c4893f0e1593fedd5afc87bdeb05e7c307d0ea05475119216f8cbb11d1c646cfef4b896212d58149a7915b7d7293339182fa31deee8e24e00226583841f61f79064ee646e98a91fd0732598061beafd6a9e16a4f1b08dcd1910201b08cc59b03a26af6dd82e8439fbce2ad0def0037f575cb4cbc3b2761c5ff39030972af858002b90bce66d47b0bf48da0d841c6108c4506ce9e82c9eb1ce48db8032fce0b2671143043334c11cb5bb46a9d13c0c8c00889dd5e38b338fae83ca97a022167e867674b9f03e840379acb8a5b0ac432fba816468fbe9c3aa9dda19addfc9fcbb85540267100ce30cf3345df48cc0007531ddc79508110bef43a2f7d9668e8267e5d6b1ebda13ec2b753f0c104d8a5b89cdc730e1003da7a677027efea651f0556581a06b98fc3c0ed099f0971b1c46d6128ac6b8d5d3c9d4b85614b002f8e5c399ab2ff392a77579494739c9ed3775cb7b37a20f38b27216ccf153fb04a4ea2c3e6f87ca297b2e85ef4a791803b61d9455d23502c1d845b2a970ded36b6c498d2ce65889bc0e29089436b011719e5aac31ac6257fac4755159d514abefb59acdb0dcd258241006cef58a389556a14bcde7a3dc1ea4644343584b4d993ffdd6c9589db4d73dd43e372aa4e5711583d14d1a6d217a08a4a4485213b5836be177e0644c2ca093e8d2549567c3935ec3a50e8c3e3fd99603d4b974b2929dd5319e5d25dc462ef4665549745b232c0926255e78abcdaf73618e8ca5da59449fd0f58c44500ee89a450567e0880461f4c5e1dbf413b48ebab52479a9f20a03145514408c89ff10b867916fa37f94f76f5ab99e931e1f5ba5b3310e7cc1ebab56d2697738957d332cf5efaa24dcbe6e44484ccffc55a1351a6d449686cdf7c7b72cfd2256970029bc9d7caa07a45a01117885d83a0d7da85be30409ee350f560be4fcefb1fa837e23de6ad81a1b6885fb571874a51f1fa4126715f8e72293d1c29f455bd9bdbe2180eb12848cad5245d31b57060b130604b82a8f5d4a3a4d571e6700af14b66718a7d88371920660de2e56ad9f6fcd513b2b9418c8ae81fead397c78d298cbd159b3076739b9934d7c4297d1881811767e4cd4691ba53bb3211437edd26d5b2e0ce328d598d10eb40ba9b43e5c1c4a2277468dbae86a74e5b4e918f27ea6246c745be06aebfc293fe3ae294a2d183a2d19dab3b4f7cbf3f1d95bfcf42c471175ffd1318e444574c0ea779ec5b611a6d03dc63288414fd64544fc87bd42ae5915b6e8b3b5c8597d80be12fefb8fb8666eb102ecf6cf4a1854d1b2b64dc690b4a444fbb1002ae49fe7d697a8f939ddd9f8e323981d2c1167f735663b3792840009de8792fcc638eba58fb7925b60512b25d67681342e84d9c8d6c21539e1a1d1abe95e4c1e5525e29884b3b0877d40dced40c2e65d82ce9c4debb178f359c5c5dfc15e76dea4e0370876e317da69f52c1437694da8d63c4c380fbd4afddee022070f6dd14355c74f8bfddf5bc525ac0bb8ea6cff338336f3a7ac4b4970fb777c9ec994fdbe12fafbc3da57a5caad518a6e6bc7c61d459840e12d596d42f9b5bd9409f6d42cef6075b0c0311e9618169db314662eea902f32f84a06a686158e8e32de8311d5eb4466b469e632b2a4327c7cf3c12caf89c28308228c6ee3c6f9413a02812b7843bbd41f19fbc323c6e2a569a48b202b277282fcafd820202e4ac731f2320fb98ac7a70c172893adfffd21f8847d6924dfb710f8aaaa57e88197ef3e1c216c9d819a4c262165f325cd6d42165ba81f04ecd762c7a8c1d7295556eb2eabbce7f329a6c34c046c2fadfdb867137091a13a536e7d700a18c1077f8b45476d8c042f67356d22d7a1f3ffb3e7e47d4cbdd41babe17fe90a8c6820f8ed03dc07192abaa61270ac7a1589b3c28844324646e1ea36d1558c6dccd53c2e7c38bd1bfd749659289ae8245b191daeaa19340e6858c3193077ac2d511313bfb1cfa575555ebffd5dbea30008126b5976e1ae680c18661362e52f853fc3bf5e3cea269011d990a4677ad18b177770587d9746a09e5a2bc97d1a4f22cb7f891055bd019a55669fa48c60dfcf34320df85116bfc325e6e2b531fdaae3b37ed13a99c10c1231cf9454090125306f39b02", "51536351526a5351", 3, 235416821, "69d5eced605a9ffe10d02c5a537536fa151f2f7d2c651b2131f92631cb1dd503"], - ["030000807082c40302fad5cc60dedfed6bb86e582f00b9f62259aa1d17e2085d2c548001ca5a13c1bc0000000004656a00acffffffffc84f46daad8766c941a18d4065d07bd814d6397c57bc77bda6df1a077f70f6ab00000000076a53536500ac65ffffffff0197952d030000000002ac528429d9d60000000002000000000000000078fed003000000006384898e91d13c868b9fd3a0d5d00a2210bd527709ee720e7333be4be61bad3608c498e8595e50a4b1f09154f2bac6831939c86a157a276266b81165eee5a83a131e4f3f042b3516317048be8696a18ea7427e62d0293b9d311e46122f72caa00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000099813b92fb6ad11f7fd806369d8527bda5da13814a8b9ff1884406d94de59314239ae50e74ef798f4a6a59dafbf104bcd797d776802f5ebc91dc57a00edd45b388b827b0dfe95b7c9aceb184d469d24d8cbd61e9d05ef1fd7496484b34ea62f98b4758fde074d53d5822288c0b64ecc9eb2db60e81108094f885a0db94e5128303260b6b92242f24c5c8359cad91602095953566dd3494ee64cbbf7752c79d023e03010d8efcac036b77fd4aad696c8f8e8991721a325de7bdd22e2b1b906f08ac210b06437227d8543eac369c689cd92bc2b466c307d224dde963b9b137b40ff8ac36b10660d0fa49d9c72d7ce416321145908331c8d2e7d00dc11ad8ed8ae57fe8160301db2b7609f491bfc4bdeb7692a900242ff37bda48ed0641cb272f866ff421b4030241eb97a973149737dbc8480c5249a2223fac26ad25ffe728d7a451b61e6415020e610048927f88ab1d4e6581883526627a9e07d01285bcb58e4c61979f591a9d03292aef62df25ccfbc00cb60872abb7cb69ca1d9b13f45641ad165f720056fd14022203cf0d70ea3a57073697f5c13436e03751269e3cd6758aaf6a8c8b462d7a43dadf54d859cbdb2c6bc42f017596685dd2087d459371511e2472a0942b68ba9884f1ed6bdc998a26d8d13fd72d7742479d9b3dccd8913febafb176486b82f54dd057b9e7c90b019f61e4de30eabd9251c8f7afb7dc93eafb2f2e218ebb553bb22274435d257ff07be835fdc5d2d18fe3ba0c868ae94ff20a1b3fa1e737c13d560be1b0f1019ed5811d680d954e0ce976d7ac67e2db5e3b627f93ea6b810debe51d07debf2f6b7ae21edf3525df64451fb3aed142fa6e10f43f520b9352132e72e196e4077ae80e05e6475e38355c491d05646f60e255792f8b43719b95ea42287fec8e9fd255ad572f5c0a2b53c3f57c2a9ed237932241f9955d0144454424e7a8da878dad58ff6f11005e8afc965e9abea4b921f0ae44b53a0af97fcc34040eef0d082736011c81d89106e3fa783a2f9eb3dfeab0135c1c6d7a82b64313c9c6497de0a9c0959fcbb182040f0924e5f0e940999585081a4d15cb1fd578adf53b2033b6a7ad607acb3e1d984bbd32909e1dcae05205ebed06b09053993024ded56547b6db6deededb9a74943e45d36d1a7835eb066e8409ae8667e6acf4ff3f1b12867484de838f034d9559addc13e0fc22a577471fc3ee3cc2909dd4c1d0ef3a8b5ad7ddb7841f72ef616b431d7c874e02c387a5013b3e7f71fefd0907e73e95302ffa96fb15939fb38f120b8a3206611839a646f6742c13e5a47dd82cfb43b170f157b7311fcfe1960b215519bde6808aed3de0c390987c96d34f40d8c2c9b0e4f8d01cf7b9201b04978994a8234748512e2624b657b57459f9e862f0f6d6ee4f0d4500d6b22f88322d7bcb10c329db21c0118a25b6adbcda1a3d18d3495aefb8057a1dd45768db84d2ba333e1afcae52dd77813e1eb2f1f24de2036b20a0d28872929fef9ca134089a5cc492cdecb8485dfa7cd61c986754f4f671b46506b7651db9ca55ba1352b39efcaa2c398b31c6f21eab665bd38d5cdf97088b9cf303e0efa562f07b3aa41131e93ec0366bbf676541e5acbb4257a2c99b57f4354031eb55578442ba06f13d5b5d5adbfa9652777775ab7860fa948ea120cb8fc7bc7e88e80c1fdd154497620de19ffd883ddd437361b7fcf1d7b807ae02b0d69eb8287a24f108a04a3f884e90583788d1e9d908e710c38dd9d2685e0a3ac31cd29fe6342462255baf4a12738812c7c90cfa753b16a9edbcaa9d697d2c8ef0356dff05c87577c6fb37f2a2a7c9dc694f6702346e82137bc23d9cbba30cb9514970e56d9d0f9c28812082ac448d5ed0c9045d2f203ec0b6a6a31bda3a085e1c658265b3e8969ab61406e281cc07414960911dfd805f5a243bdacfa19fa22aa50e8ab96494c56955727f0309b2932136d713a032668f0e3b3fff7d61759b296c00d477dd0e27798fcc3226d3afce5496f1ecf4ee81d9cae480085b9b2f2104b97c239e4078935558429f9e81ff4ae79c70e3df5b82842762a5537fb3eea423186f77a830b0a6b3a7b5ecf33716a7b8bb8a99909c1880fe579f6ab81d7d57fe819dd953a89ea7e9603940ac843a4fec05b866c6fb39b8d681bb8c4304506e4146aa819e766bdceff03084007824659b4d615a53821ee8a853a08c562312b151ab5bfdf9cae1e457a4dad1ebf36e0fc12cf4add9fec0d3a8da5e5a48065ab6806e52102ba2465061f2ae2d45dc237a64c925d3053027d10000000000000000becbaa0300000000506f8144d0eb7007f3a44aaabad2130d7f5fd3b5b39897fed06bd3142aaf92794539cc4ec96e3bb16d9f5412bf823ff93a122ea39fc5168183815a971c66a43e2467c3c4cbbeff708ef1a5a5c3a1063a802dfacb3733036163335e0848a24647000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007d92e0fe45d8a9b3350a128d95ed247f9a63c60a194632a598c748b6cfcca80c0ade9c8f72b91c1eb348fd9f0147267c1f25c96006b563d46bde769830f5c1becc42c7f73cca1d52fd3a70e82ae67b5d085e7f863334e473b5aea5850749ee4a611c744f775f0f379b22f539a77a472de6160964ee3b0687b25a28aa05162c9a0220b82febeb66e5a22cdc0de4996888b59dde5d3bae72eb100d365ea470a4264f031897e1ede449de217e0a3dcfcd6ef5640bdffe92bc8ccffa6ed772a76c3985500a06db5a7113e588da39915fa29c0779b495aa1278980b42b36ee856ea54c519309e83e5b5b4afc127357ec6e8dccc208f785c4bdfdc121e1f5ed383008b5a18440215a57af99935e7e5a70f1b85455ddd2d72f9b702919921f01f65b7268a9724520210e2bfdea9f71690b137e8c9999896d7b5cce4ba5e14da453492bc23d966ee780229655ee84b64d9dc02032f13275ba5ac5ec0e00d5ded46dc14b0fb10e6d311a303040cd42a5685f6d9d98800b2ed3e3eb422972a76075caa4c6cf491ab9001034a031e715d260ed90d2439972c1a417f85dd6656f83609849ce8a35c70474ba4a70683ad7be36671e0bf77c98a2e6cf89ca196690397336efa6b12d1fbf126b238a60123673d7efabac88856bc7874aab293f39571dced515e027d43be8bc7cb05536ee701a2c19a06fab71b40619f9b01187fb427d4966ac36e5dc83467693e4268c74116f6d4d44a9865463c560672b0642319eae868946cb857db24a5c2cba536829f003ee61704e2663284a6a4ec8018cb77ae87cbf1d1113b2b71896b392bea31b64778172681eb5024b7880a69db93a5b1acd6e3ae2659cf5fcf1945055e474da1b00cfa7ac180e69f767e1474b709da8cbeb61d8f077ae9f7a3df78d4473aed3adaf1d43d1ced78550a96caf6dd2bc209f2e4934fcc05cb152dc35b40d14f5bd453b9ea4c756b59a1350cb76a5dfe349cb19572bf6cebfd21109f0294db87aaab3b4e32f382888cc7ae1a7f7ee23bcfe1ab376341fe9b2316e0ef514859f1f70ce3467f638df038e0d5cea858423a09df1313a7b08830d992b55c679b9f7173013bee82e96384df21a4f915cc3e53bad650c7645498633be70d2cc2b1aff6c0cf087c44cce75ecb5fa7e4410dd1dbb7847f7ed66e46d7822927200803f796ca5f3e1fa0ce4c2ee41ea2e798bd656a2e24d6ba33c77d92321e6a429f819fd02df502b1d88894e51a6eb920de727292e252a93335d9f0bb5eb2f15936effbcfb0e9d8205ca08015ff52a9be40af812a804d3d3d0b667b256b02702fc8652f9d3b45b5e10a629f68c70cde6d8569a7b1171f7dadcfac7f517252cfc7af9a4433baf2abf99b39bf0bbf9375e9ba9db1295ebbf360a9c96453fa899a53a4c73779c868e46ec71b8b2cc813ff1d4670ca4bc6857b3295b8a59210f39ded4707977b849143025a3d0d74e8dc38b9e867e8f3dcf8c1e2118a0aebf33c22076ef0a17241eaf683a81a998a6ebc619c270edd0da8d745f4111d4cb7557618f0b0eea9f30910ad3258b78aa1ed3156147ed81107d40a692c79b4e4f21046dad23f9fbf56b90a18faaa2ecd9f12cbbd79290d264aa7f32db694ab63054012795afcedef2c8c7da19e0faee4e4535020652e4331a6e6152649d588fab478674cb2fb025f194a4c96edff1bc1d3fb8682a5ea78a48333e673c0cfe951541a6b4908a4800398740544f5919693c013f002c1a6cd76f95363bb27896ad05d482dcc613072937ce566110efb5b0885438b0a3cadb4417988abca2323078281e2f7417f42d40d7dde1b433707e7d62375bc5a21be9ec88d3833c4e1730155e917876b1334108e82e6f226948703a989cc8cb4a9b92bc0ac8c6b3a382925af0ecaa4b311d4810b64915840c3122396adcbb01054fad57212c3c20df658f39a1f7f7041da28f9fd90720319e1fcb619042f9af2ad2b4c917acb9245d6a2ad3bae9a7d5190e1861e07947684e5ef59708a49d4633f21ed5cdf7eba3ec2e19dc33343346c7501d8d95bf56087a1315073ae83caae58fdf2af51ec7b3f97f221a299c27a0227cb4ee5d10bba3015ad8863906eea25451da381059919e1c999e4b8994c09d807a93a5af28c8662259a4df36c890285892e0a0f58d5c4085b71a531902fb04be7c809943123bc62fd2a467c04e5459614304957ff6f39e0e67aef5540db8b2ede88f10228f06360340d6e56457c03288e499010751668e5c38ecbd7260698c847806bc25e6c249bf3a61dfa930eddf9f23c3dbbeeaf23049d1667555289595df3a36bcd0743e0324ae9be605f40951c3e8998337d2914fef594033c3a5bb9848fe3c11c182b4c4fac67d86fcbc2f4f2f5c2a8b56a4bb755ab5a4b8794c2b6f8cb6d2f88cdc56057a6fbaca2c29830f6cdbfbfa9736e02", "00520051", 0, -145198895, "18b8788720320bc2c2c21146c50599c57dbc92050ec6892c2d5f36f559d4b1a1"], - ["76d6663804a62602f41c36fbda0521035a10425cbbc10e680d50131b424a7c742a4330b7ca0200000007525252635252631acc38c747d3ec35228c5dc31907e8a8280f39a712e52131fdbf02e429f529f5754228e603000000056a63526552ffffffff7766984e888492cb2031779848f35e42bfb7175fee68198267ea966ff8fc0532010000000551520051acffffffff7c0a824ef7100312e3fdf2fb78c1511fb1bb351c82be45996d0ecd4780433c4b000000000963655265acac63656ac6ef474a02cec014010000000005ac525263ac3f597e010000000007635353656aac6a092b1153031db07d00000000000000000000000000fc949a281c30e830ca6145441fe9dfed3409ea5fd07e4e89ddd6ec857cbdfe2d97d4c4dbd7cdc8f61631a1125fedddd7d113dca70c18ce7ca9f04b4a9da4c290d38749edc29dd75e69b381126dd30d10b5ea7fa8a2bee2d5f548a6b6489ba388000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d21a5fc2ed8ee347274b156773cad49d37e5916141563d9d1ca50894a0f558da3471f3bdfb64e50deb24baf0f27762cd17b6c12eaaf3ef8740be052c4bd2c1b4ec0a61eef5a92f7c21db1119b69ad97cb59b9740ea5304ae2f60134a602fe65c6cbf5ae939653f3ef2261b23ecfeccee02ab0faac3fef6aa44e638b5214625a030a36023627c88ebe6504b42ea8c8c1eae7796fceada2ecac8c609d7d4346da4103208d65d5fe20679f547f0033dddb45dabd4687319699d8befc76d72ecf05c82d0a08b32f940b3ea1b1f2fcc6651b292ac22d94079ee675b14c4ea00aa0b08e4c697a45ccb077d93354f358cddb058e897ef041d35f6cd4dfd1ecd79075bfe26e440206271a055b78f02ea39e91a2d0d8421598ef4be304f12f6d0810269ac39e24b50219b2c9a8872c0aec016359b799bc0d7a38a45a727d2f52463b97c7fec4f5254503247d07966f01a506ebda8114087aa3d6f3c45da08ce38eab8e19fb3b1f055844030baca96f9c7049d6cf7fb835137ef799a6ad0f6a40f1a4c1d447339dfeeddef002213388719ba1bd6a5acbdcd5c1eca8dbd22463802b2c7d2b936e787421012f407a31d63d9cb5137e10f233f3ee2997121aa2a36ef4cb49b5198789efab97f53f366b0c0d29d8f50aed5fc7b80d02127d05237ae1b1fdabacc5e2bab513baf4d1dcf9208af9122f0bc73d2b9ecb9433e32effb2575cc2a9fc0259990a9609bf32b32affdb64a974f2eeaf19e1bf547d4f16e54768473709373169468260939a79411384c3631bd8df984e9f72d688b8cc3881c7595f54e8141c3864d69dbbc72d4ffc821516b8be9c0c08c79d7822d80a5706cce5ae58959dcd935550886f85641d1fcce79961ea1f556723f0b895102f397fba5d0816fe9819a9f52cbc264e497d2ebc9ec81fa9d55eb09f0b57ea11ab566019921f7750ecf564d8ce4767b3fd4452b7ead0206fa3a02f3b10d531828e2ea37249d9376811e9e7e7cdca292a2dfd8885754ce33945bcf83122e09ba6c4ec85b0e06a05ad07be93716ea9e4423f254d4a630a7325c648bfcdafd7eba239f19283b241da1b7b2e9150cbb8820f6fbcd7018e2b51b2ea1ff904262e0429baf28c20cc3dd099f95b389de539934526da01fe53826dc9af5386a958ae1766078f34ab4fc95057bc1b9e06df706897b677a1399e32988ee179684632322ee3f50b17c809636f89efab3c0d8efd2c02d2cc227a83d710eaff9ffcb5f454756c0afc501659923a7f6ae149bb667cb4aae6fed3eec98e87ba94192804d0d99dc35fb34f9e561f3401c00521272641cbabbde7339db0d67be8e8c0fd0715d1dc49e19e207289caccc1f370599d2a5c83d92bd6bead6c26687cead490a51e5deadcf8d7f045089b7e85038db7d9d6d4a2ebbd00989bb37a7da5fecbeaaaee031227b90027f6627998cab611443536d02f89626bba0f215db12cc9b52f3e879c2ebca7a071c7ffb80aceed2e4c383c1ecbc022a629f7fbb304d212f747d7aaacd87dd25740fd429e9f59376b2474c97ce26b63f98709b2f94ed3f9709b3756579350f554538d8efface7a1fb109e954127269384f1b07c5b5709e14631e6d1756c9883492824dc3b2f8f5275118a6fa4d91228e03d6bda4e37f166584c13a2a56bb1445b7618c2f27abdef68efb1e9e64cd2b53c2381f6f29d043d42d239c17bc3c01c06357e3a7cfe1dee71e2e5c314df051f960d7cc002fc71d65f3fb6fd11e029176bfb80ef3a33e6740006eb421985ba85af908bb18664397311453af204cc31e11cd1b279e03aeda099a7c0d8042e249af187d3e5eadcdc343aaff1d6e8ccdaaf82a409c094359deb9f2e5388bccb5b9b0c03609c493e2e70cb10dc7c6dff63f84ffc610c9653110be0eb45d9afc4078d99c7fe29c47f2763712a848b79b8a30507455e4f2079148d11977654181b44779b3bc7a48d991bae51f107031ff3c91c109e1819490a73f23184456936f6f425b577dededd1472df1e89d1bee81a62c2cdfd9ab35bceff6070cbb7c4226977212bac919344bb4bf2c11f2f9e433af7bab128f2c3bc20e2316b890416de3f2624dd7817cfef54073fa3028fd713be888a1bd0d0dfaa405772eba8529bd06ad59db3ac47b236025329e70c6c7bc0003b4585d64a4ddafd7b5a3cd7f91508d1930db356406dcd1bdde9b43b6081297174cf6b32e5ba738afa5bbf22d8364fb625ca0dd2bba50a6a85f8df6624b7545cb7d3ef71b328fbaf8f64f2e66a7132a9a889bda4955d16be5c981aab32620511d5bbe69723b4d700000000000000000000000000bb08ebb6269ba6ceb40c1471a409c877560432721dc0374a682e46e1820b6d70b01e02a654a4bc347f8d337b802ce3323e11e24fa9126f8403f9e528ec588f95220bd2057ed8e73fcaed1b6b0feb6095afb2b5e745895e12b543208aab9585b50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000059f8d0882e9412f903e91cdad3e1aedb78ffc817a59147df84e4d010b15646333baa0354e062bc16fb381564da52e7c67b9c980c478e82ae953d8260161c3f181d70972c84d28e5e8a30b46191c93954f261436788598980731fc1656832cf410f24aad854e06962c0e63c3a4d3f6384958bd1b7074e41f056eb3d66a47ef5b30320d40557e0d54bf383215945e184ecfbc26b7f52f0175b66bc4fbd6d7f8cde7b020e4fc5575daed8959e298dd97735cda55de27cf643af5a73e574109eb448d2160a017d5e4769bec670c02da84c33240e1446ebd0feca73d46026079ca06d464f8d2357ccf6c46888d7815fba718edb82f1eb55e4d6d1dc45fb16768f42b8d19eba022dc0435879136eaaaf38c99b01b500ed8425e12785059bdde778baee505ff5d4022bfb748bd5610fd0dbfa0005860ea3d696991b495f5231b9c5c765cc112015f30219a94c97b824468b0be5053a9fa87de48c1a05f35dc9c14185efd8bc5b85e1be020475a9351efc4edd9ddef0761c5d7309f2b7f739b4bd8554929912310e022dd90213004875748453696f543b6b98303e7ea406ef5eb7ab95d909297031efb4616cc352a4a688ed6a451f8bdb5ec4199d6fdbe186a3b0441cd6df36e6b99f818245ce3cfa9bc61148192838aeb17401872f28c53fa7ca7ad105a5317852ec9e166b4a92375f198e6bde08d0e19c2ae59325f72f3a4e90e93d8a3945757813478bd4a2ea7b5a322b4fb0ea0fe0e5cbf9daafebf3b79408fb82cfab2bb63230e65f9ed3301b60094a772795734d23f99f2b3d97ece950e5f028908baa85b20a67ac2373e28eae97c6cee9e8e2400242f3a83771f2ff426421e93897b359e07856b6092148a03000704dc4ab84e63ce21aad1f46baf86f5a79ba0cd6e6ca1e70649fd68d017072f960d4f7b95248a367db25aaf577a31ae91cbbcb2ea097e0d20a209196949890a67a2a3d654719d84a5fb09533f912fa6ca3a6e864e595a5b5d3769519a142961e10591c742612bbf88e25a6ff4bfa1d8eca63dc0c9b32f698a12a79cfc1d7e79b10be72431d1755da0e14e778ec622945958ded1c10cb2840a629130fee9289f26d66063b6a3c242b7970d6c99b3dc7dea37e3ed096b912d3923c25fd394ff978b618d07cd6b4c4896cd05077024874e3c7e8fb168d194bbda11a957d5fa492b89c7d825eab26fe99d2937daf80bf5d29ac2aa18df44879ab8b90f621460ecc7da9ccac994d0f9e4ecc4a6a314233efdfcde1891782c7ec5d98ee82db7019cf53f5df362d3c6826f62812cf2c2e38d9315dd0528008efde1a13d4a298852422102ceb83ea7f90bc3aa5b2a24706d5750038efa6295a97db12e9690b2cc44be4be81a51d6fda414f65781434515b0489d6ffb95d88592b60f08eec73a21cc15c5ddcaf142be57f8f325a9f9c09a39541c64902ba39d483b5bbd070e3f18a6477279a97a365d60feb031b2aef710fc5781d274112847286cb2c7f1b17cc69d57b1d6090ffe062aba3a14350fdafdcb777c4dc7ce45770bc813e008191740fe252a3e7332fe2435481096bc62fe34eb1795e54a1d16e759cb2421fdf928c2d898e1dfa4cd84c84dd78f18d8f3412c1f5f12f3ef1211e3a6254d7528556679706cd483d5215d6235c3610ef6b855968b1eccfb666fc022481ce422c6f83d95c02cf4342de8b0757a65a7a86bb25f0182d21192e58251d05af129beee0c1f920e7df6c9339ae519c55adbda17696c09899b441380dc97a2617b9dc33bbfc00b7741532a08473ed325ca11e13d4578528541e315485b7d2f3e0a4abc0c36bc56151fc188bdf697f145aea7f2ff77ca85ba48112ca7bd0db957f10f266e7a2e7df329232c1ec28416dab2056c3f98d75fa9f4781fd72449c69503f1c7edebe20c8a4f57db34de9fc451d88cfb9a8a065f4f6956401f8aa15a967dab10cd9a288c02f16fa3f2b925828ddbec3b701cfac5d47e83b8988157e4df42951bd150ee5b57034e836079272b0d3035e26d17075c2f46a957db3c36f0a5864ad1d28a3cd235b3b464c354d68948bc368e8438ec6c185d60494f5795d681387aa2471d49f6b50f70cbcbaf922c26bf88f516ef7abbfb09ce5b4b410d47eaef1ed4467f5e6e4c48c7a1beab7a2a10cf30f5a9331d060ac463d323083acf8f481093beb60350b6e58ce10bdd804a181d197e49e559051f633ad5ca3b0fdd5e12adffe67551f7330a6417d2c3625bcf9fa02f64e8b8d3ded25d77fa2ddd59be006e8c9286d70062e7de27bb6612699763ceb4005f781f3000000000000000058700d02000000003a3ce3d53c23aa4ac4eb6b2ac228b429646a3b0533a6959e2f48c4d742582f32096c2a7f401ecea185fc3d39f581561e8dec4d75600557fcc04c351f7b84398c81ae6ca772ac16a82dcab519cded5ca72b602ff3cb8e0e32729da53dfdd326be000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000345294ebc9f009fd6f98a86b4b0d2ec227680e8fb4823d758c1fb26e156574ccd5620473116190c2c699fa9e6f534d63d5a1ead2d97fca696d919b82d96ac81f9e1f5b48d10598952072c4e90ebc9a2afe00e013be1370c53a0373b4600d2fa07b480f489c5657d812582b3a0e124c9e9f5247140cb76bb8bf7bd03a56fb34f031f95cd86708e6bc7847ca7134c329d460ea09a536cd0476ce655ac38fe96620b020b6c1ae45116863ac62847f211c80d6ef24390e6821b9d71583860fe6e01f12f0a036ca9b1de948ada5dfbd277fac25c02e07edbe308d7819c527ebd0859df561e1c13f79a5f305c068f44cea9b23a85fee0dfeb5e3098126ccd03fea70b0c424a022a6d0c3a048fd9ba48f72085fd9ed074cfb8f7df36d6c1aa40b5ae05afafcb4c030fc197d56953dd9bfdb56f8d79ed9de12dda5c879fda1bd66f5f32c63bb9c18f02244ba031e3fce37dafbee973aab7cd02492658f24d6f567d77176c26b5bb01c1020cabcec60ff40999cf5917a6b8e69cfb352b6563976a1d3e713f46497c4bbcc70201373f34e2d74bb35d1667a98e88f1c343a1753c402f9e1464c94eef67b05a4d4098c5337fffe01f2bf37fffd2621387822c699fb051fb5880ef5f9c8ae3cf8fda3648c29e92715f934e7616a332bb3afa0b6aad910f7a32a40d81a9b449cf26a21f0db4de866b76b66f8ccdf336b863ae33a67b24a5d3820687d6e90d6340c523216e615c12d3ab897d76af86fd4959ed6ecd7d512593d057ecf1d250c50d7e704546db0761fa3b26e7e373e3b7dcff04fd1aa61c7cdddbe956f2d5cbd77d5d045d3af78619169941ffdf8ec957b4aeec30200153b6a0f3465cdae3918f64466dc8bed13b306c825df52ba4ee009f177fd57467bb4b9f682e2a5171b91c4009f1e880e582ad69be701854d7bdba702c6e7a0af4585bfce1c5e12f5c88e970b056505be429a210b81bc7580b5c705002753a59d0d0d6b180dd4b67ff23856e8ca2d808d6842e265c8720d8e4bd64cca25cb0f2442e2ff2693332b6d86e102bacfbfb9369a5ba72726d70a564b8e72e5eedd5ba277c1e74ec845ad40eb4eac3a06ae9f78121c671145284da0c5f40cc979e020808dbe2cab6e12e4bf326160c70823d46180229ee16193957c77ff9f0786590f448141c46e688d71f49809fb44a313db370b69151c81a99ac737da44b4c8cea3e489648ab8b731da0f4b6e1eb8fe1a8da5d385fed61b999996b130bb4a00fcea34ef5b6dec49230c702a713ac9f5b99cdf57f36d42f4dca8b7f125159a84f3cb7020a3e7157836b40c8a2c1ab7c1e8182f50e990b47452bfd988cee6ec38144a972f85d4295427a21640a7607b94877d546c5d9e6a3fa35cc29a47544eb33cd3662811444d35e0e166c91bc07333e066f7b1ea40abde7923b56c4dc85e35fc752310b2c4a10675bb5c716a9bac17366e0de46ce835da5964d6b66f9dba4cdfcd2c7fd13d22ceeb13f4a72a61f69aafa08e391b9752ad9680689028ed45ddb2b834a9e34f9011f9dbdbb0cb87e21562d27d7a4ab586d23eb0ed656ebfd21a026d4f5588a4d516e77c8b1de537beeca3d612dc8b5e1ed5df984fddbc2d3275a3d814488aeeaf3a4838d7db6a23a239be757d848e64373b4bd1447b63ce9929f68ec7b5df48cb32fc70be9e4c269312a2642276a13bf3aaf4739057d05de71cf9e7009887f5bec3185e1d5d29c84227ba4911811240a84a449702add57699856d950f949d91cb062c5aebe9d61864e50ac822079a7463f31f4ec1b4782bcdfbdb04fc0cc49c1c9f2ae21871b049642550163bdf6b113f25ebf0e655e4676cc2ccece5b830a36234799b81810ae0cfc9317c545ace4054e6efda6dc8cf69e834f75fddbe5ca2f634cd71756b0f2957dfbc6e97c104d7fc2c20cf4104486601ce6a071bb985e431616152c7ecfb700240da1214435c58a7cf9fbb2875dea880d4ece57c6e4be2d695e42a81c3d12e80fdda4c22230d9b8ef219204ffa92c1c0aa70d14341bea335b901b25ce4db4863cd07b9ef952c9228d48edd0db7fbb91c6420b3908230c6fbc81cfaf13e15ca672a7868cc24bdd5684fe6369d02dd89bc6ea19a7dbe301b6c384e97c4d62d5c26d46f0ba5dff9829b7b172caa206d25f50a55481092d14cd3c30380e6d2df6d76d3f51abad3a3f6d15868a2ae20e5e39736bfec51e40e3d1e10aac5b5ba1659b740eb4b099da57df305f78965bc480709cbe3694a0610ab40912167031461891aeed689349bf761e4250fba3342f4c59cf3d8d601e41af27d864e9e6a5ff73abc658902cc0ad9e1062ac8034070d422eeb303d959ffba963d29702eaf9357d76db28d93fd4e596a46a72da9d8843dcf7b711fcf2ea85df4a848f89b685e4fce6e7915c215db4308caed6b671ade77e0161cc05", "510063", 2, -675465780, "82e8310db16a80a2e9e1d872310e5ef93b6130f9b5b61852f0b752743cd0acb0"], - ["24d9700404d0c858e11de10b5ae402c56a99dd49d344792cacbf155f0773332c4330508b16000000000653526500535344f2d66c84afecc6fcbabaf3f629213483bf0cdeff7f6aa9855bae23342b5c3c048566be02000000075352526aac006a6792075dbd180e14aa670a956a0b114b62128236c9508ebda7f8f2f4772cca53689c91b50200000008ac53526a52525353ffffffff4ec7208527073abc18912aabb8ce2fd22025780b93e7b6892ae14b688bf3feec020000000153ffffffff0362ef90040000000006515365526351816cb5050000000006ac520051ac510ba1cc040000000007536a650065006300000000030000000000000000401c610100000000be9d1dbe1743ad17a8a4d390cacd99415e466b96adcaea95156c9dfad0c1a4adf1d97e7893207c662e4ecd24d5f9246b344d7d5fe43cbf1972c70c99f4ed2036e205d2d683d79c1037e1093615771ae913215574cf70a8ffff8c83a06c262b44000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008401786ea8321b522a75f04420805f8596043cf30007b055127f526a2e1d0a98ae9e2c4453fc4366841c75dc909d9d33fd31ecd66dac52517a5cd891602588722d6ccbb98a823974b74a95824df6ab4feb7c56048ef243b1ce5fab25de5e5c167075a208701c4d8f0e6ddffa9cd2cebce4163d3af06fcb1e9dba858ab54b599703271f5bb053aac61c00c43fce1caa86b629381178074b4dbeecea00cc3085af3c021db50b5e492b1aa8998c33ddca55c8a5af28bf38290571f557aa41e50077f9700a032feeef81688d7f29a2d130e11e979311c362de244bf3b2e82a638abca3f68c3f958ca767faa537155617951e0ec2f2020fe3f3461b1734cfd8e1fa09c2743602102458852995711c974cc64e9934e12cdf4a6a5849e591e3f3315b31f9d0094e0320866b21aed529a8a256003155e015bfacf8901571ca92fd0fa0f58c31156f6a0205f28c00a864ee64874cfb9b7f7addc77e808ddc487342e329557e64e6526b7b030d3fe58de320844346f1820e13f8326cdc06f80c7347a653b3f06ce7973ea2af021044c854f1ad4c9a1e82a622021c411491afbd9d692747ed23c47d6a0035b6e29bfea45f81dbaf33484216ed5bbab8f35e785c629f25f9e9d53cfa0bf477280df13739b66f2aaca50fba44a70d98f63aa04c355b26f438e7104c9fa4fa4e99500cd4b3d0ca714e33e3fb8845fba1c5d1d6e172295bdd57522dc3c73089024383de8e59daa45411378ea1b75fb20652baf77c8856124541c77ded42a6587141364a04fdb68bab0621e5c4b790ab718edef48c43d91b763dfe0766761a18477d4f2a52ac183927c08a00a0edac3c4c44168396444eff24c14587fcfe157831f92148ba7d8d9e5645288da66e1520fbdbde81135c053991ea3800cad5f17daeac70b1ebea75ec228f336f98ac2d237b991e301918d8b9146862ef992f16f6a357d5b6b2a71487065ef56e865168769b13e8af8bb5b0d1b59180105e19484536d57ffba8b85b3490ca94fa1220341176ddc03f4e2e4694018c4246139d7e69aa51e86d42f24d208f26e7d6f53b3319eef2b6b656671f64d1a7769b41d9d22d4b51ae65b92922072150833cdf42f2b3d5299cfc7d09b1977c17551e16a3ceb2dc2328d39d05b982e5a5936dc52c4f02873d467eebf82ff12d45616f7de83a59d6d1246128e5bb081b3b1c93c2488221c2eafa84e93fde23a15816f0c1ad68b718beeeff870ad1be8c29d29bf615cd117b0496aac57ba7f23ecace7a75cdcacccd3517eeac4bf6e7c827aa9938af3a428483637834a013b1acb8bbc3ecbd8c297581ff64fe2a418e873bd273a8394b1c0c0317f01ead5ec0118cdd96b2a26236735b840f7bc7f5bfac344b005b3806a873d365bb6567a28c6e2543e847874c618db85485b8a0301bdbf06aebcf78ce969e77fbbba75fbc9605b7d17a66003cffd54283f81ea15150c5bd2c47ed318ba02d627ddd6334af7024c9336540c1bda3352afc682cf46f01db474e0f29080ca306ef95c230d8403f37b6820e3dc0d7a0f489cff2fec20455b0ceb0982f81b6659ee85a787200d07ff52e6938e6301cce2253f5d8bee22715e9e70aa455250a02cf3c0ab6ab2c1b8c9ff6c983a492e7dd5d397124a30c1609768fadb378e224b34e7da77580eec1d12bbe3a10997541101b862e2c85643ca0f7313cd141f28a7deac6956d786a5123a551f418f3c71a8757f3cb2cb886e0503ad2afcda7732fdbb2a487b9a062772b87ccc39ee48dde39bb1601f975abbe293ccaec6461c553cfebe71c972f539255f8b32d8da33fa3fecef019567a133a6041a96c935185b3e710438e6daca6a1e81261e03ecd577972ac4b914b73aa991b70d1f2b5403763907d5b1fad75575423a283137a42c8b3359b0662801efe1db214d003bb4068fc06df27b5cfe33f6335255da19b86122508e0d6c3405eeedee20c565b1ad43c33b5923b9d5253c9e39f9d7f3d15a7d344a1ae8aad209aafca5e4da5b1deba997f36fc9ed42538e6d7d3755105a620b05fc70fcc49048355f11982848af0bb9ba39a6c84a28fc8992821148ce8d1529e98dfa119929dc1dc1f07433a1a583a9fc3165592f9705c3b55585f72f8f5f84647a7ac5bceca602c4a8ee4e38127c74e91c0f6a08fdd3d0835a9daf847248568158ddc12d01688c7420484c2a0a77c70e2da2a5c1730cc97ed8a894c01f4f42cacc50d4dc085b9137e866bc882816508ea5cb79793cc7645ea75bf678cdcca66d352dbab20db6cb3b52d8461e8aaed38a0c2749f071de20000000000000000a4e455000000000062b75c7425212b4393342129881fbd9c99ebd1dac6150a5fdbbd9e445537eef27a1c4e41456067714f8212fa382e31450813f827d4bbaf6384dff6559194c8014fb83988dac0dce1ae5225162fc62e5a481851499e015ea3289096d699ecdd3c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065e60a3cff41a5d03ba57ba99fb153af199b4e690078ad0d5db1a7b4af6c734a7992f9aa425b5f7bf8c13797105ff179e037d8aba60dfc62cc8ce6aae2fc173d80b2af1cf9116d1993bd835c39f909423f1beda4f51dce8b4f3643776fda8b6c538f460945e696b91694a950af3059840e240eb0058d205850f1da712bbfa32c021efd69a9e8129535b946458f206f1b5d2c4cdbedb4ed6554fcb7521e5a2310e303199a1b9b701e0a64abc1b741fb73b75568ba3a506bb817f8c5e18064dd3a802d0b0475e33c3edb101cc9089833d5f80d44948883951d8981bc679f208fa593508027d6edf33a876861270dead8b19ffaeb5214c8033d040c39522b0a7c781e4164020e140e34a10078d0f4d0a041ade89f1352a3f02456afb4bd70636697d3fd00910306d1afaef6f80bffeadaf54ccbdb785f57a5ee39dfc28f90c820b3fdcb451ee302238467d588b5b976a784ec69b9bb3f8184bc30e7fb4126af273b18d5c2eb0e580206a844ccf4ca4cd35ad50371a655fa95dfe12efd62ebbd6d6af9cf1d7626b28f021828bb929e16df530c68c63593e94808996b62e1e9e093cb9f870b6a6ab9bdf761b2a0b39ff04d724a0463e4b98930294d544e7e8b4a7cbd4671448068b24f20efff1f1a82cb9efaf3fe096796dad1c835e715bb3d1d7b93e0a12e9ea8ba13ff25dc428198084b893b5d4bfbd5d9c8a355b69e43610b882a115b601676fc27d4ff77a9740fd7436f26566b87a458a411f159b44b251f7c32ae038a3461dbe125d316609b61b731009ec29366ccc8cfaabc0989f74e6c66eb28cc433601c6cd6086523b175bf17d13d85cbcbf78eaa874a5b5535eae137a77b871fc13f0bd4ef259b50ee5d4d25cd604b947ba23933bf7585e656d70a499df4715b72398d3a073fce2230dc195003fb527a7b747b3a3c2fb192b1850bb0190a3647de9675a7e14a804f8332e08e3dfada8044d78c798455b70fdd4de0be9da6c75f9a5205b8fdd9405c39a61783b106770928979a26ad717626b80041b1aee0ef270c64393314b61e4fccda2c7f4b18ae7079f6753d611e04993d3a45c152400e2c9c2f034ebe59c2f1013a16e1209b6c51aa81d9d0333ec92d6c7671a6f6b5b312c1efdf14e29c7b4fd9bfc316892de371cf886252acae0bf54ec6ad1f03d353d6b5a894605e33b7a1baa96230643314257f0cb7002c6aef2a28acd6b1f5290b7e4cad8fb746301c8c129e038652f1c71624928e956ecd2e8415ad34f1d60f123dbf5fea8a89416619b6f9be52fac7186ee3e831ee9cf34723d3530ac51143b35b52e94ab10d969d232f301d7963d94ff1e18c466117f17664b7c54cbd12cffd4e09a989b1364ee0b299f9c24e7889274b85da6bafdb65ea049a692c165608aa2b95e73fb23d1f9086f6671c6759143429a86de968a66dd8e41845dd099ae498b69d5bf61347ea9989a84cae515a5dfb1d65e8ad9bd81b46f4f0d8a8f7ee5ca1a3bfcb4c89e181acc796e8881a7f61e9532ad894ccd59d3eea02ec4dbefd912954647aeee035069bde7c7b90fceb1cc8a6e95b84d35d6129e031b9da63365dfddd12a9580049a20bf2e80901df578778f105fb3d52a21df3a914e308cd8206555d1cc331b017181799d027e83fbe3cc3fccd0ef199ed2f718189ac53fd34e15dd097ba55f5ddd50f8cf884ce84c768571fc3dffe52612b049bbb9a86f721bae9e820e219e6e8aa0f68f86aede4520f7889fc8d2641ed06617e4895d9f7c51b11d2525170a791e8868bdda07a8ec3c263a004be34b4f8c7279a58caea75b5b0e63e636e40b32d4e43422b53b84f40c0ded61b34e97297ade2a149c47055292fe92591225f5005c0c8bc9f9e4f7db30a1debb04ff0c80b8fbe160b7eccd9bbf49cfe35c654b46a201d2da5fd34413626cf160a28da3c9ad73b331f11bdba822924e0c1ca401d59c2781fdfa91e2316a2bcfea3ea9fd06ecf31aa0139a47a9b259965a17c7f3db33a2b0e56dc3425f7cd095d4962fd503290c70f5fea78d4a47b5f789afd64d14828605e19058b11294b8338754d963c3e385515324808d822e0a8f5dc3cf46902c0779f15c81f6f1dfefbef8bfd600b1b9d9798339fe369a2f366de9f4d1fe6ae8406af5ff02b52018c98cdf05c9dc6718e293cd9e2b6a6ab6a2377ff81460a4e20bf730f917e600f92ad285a180d10be8f44fa65ab81eb10d7895144c57d20f2b97962bbfa0ba2e4cb81609c2dfc0316428db953e8f2b7c957c88101ee5631c12210e80b540ddb807d7a1c375b7f66aa3755acc2a5b01000000000000000000000000965dd8e94a4119bf8dd9622853a56b73260bddd783087ee96b93522fa0acf9d355631b33d3818988fd752be35c08cf31c94c0fcd12fd808124c53026143aba3c13e90df849808accd9d691e65cd849f8fab86edb86e31d100e2464aaef41ed09000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009db5447b0c4c126d711b8e1f2ece081a5d3eb04a51f06f27a845350ae5e0545339740c795fd6323cb44ffc7d07e1f9bff756fe2f040e824b308f92cc1140653799b3507f1b5e5a16937abff60675d8b2c8d11037c05ea6098ce5809761010e6cbc4a9960deeda650eae8706dd5dee2f3611659fdf21e014cfcbb1c0b6f384d410312c80b2519a8339cb4e5cc00e70d5095449e48e9b240b1b12ebe4ae1dee2cdb602229a4a48901e018e688a6d85409a4492eec971f71e5d88b708664d415db4135d0b0710ae921965d7c234022a1996e662a61b71e0edef52b1166ade4c99b53fe6324672c99fe179640e782d70a09498d821f791a5007126bcad5d3de00a30768fa40202a8169c124a112ddacc3fa8ce5b859ebc2aaff8afcdc8131c74cc4398193bad030ecae531c78bf5abeadcbc123771ada0f0835233316f1ce93550c30b24825db9021b8b4b312a407e2a62ae99a62e10b0d75156952e6032ed3e83de199d7aececa9030d4197512a18119845c31d33f9f59ff4dda062151dc5cc2ec4ce1f380d7fb3f60223f6c3859d05956d0171d942d38838f8aa828211ee4d09d9ccade46af634fc44eed21ccd51e80d0578dde63cb25cfe108b72d241d5578e749ea3d1bbec6afd8ac084d31e0f4ae48a886e7f8286cb9597544cd7dcc39c7318aece7e3117f6056eb64e5080a628560eb5166040de0735455917983fab233945b2cbb9ff240fbed1c0416c9e429fa5ff7e50b69cc6b1fa8211d1adc7b74713ce024b83970b8bbaece76a34ac7e847f8e18a570085f3ffc1ab10da18501c713543f9c73f9ed7fbe4e2d1e7b5c264886bc6438f0a7c5f28cf09372fdb0985f0bfd9c1a456cfb448714773ab0cfba4045dafa5882b7b7616bae7dae8a4417382941590cfca88ee080ca76481625b5922d00f656d8d0de9beee1e5c129b689794a1457bd22cef14ef969aacac929ae6094e88e5e0c60526fc449465f966ba61491e96e0f9649d75922eb7bb9c941f3a3ff7e61e5fc975d4fc12dc5d969c40fb1470c2b418d600796ef187016236dd84b37fd558eaf5476105a438231c9ee551dddd35158b67133abd22b9a3e1b6483bf7191dea4e9130d4fbda608c0b95ea1ad53e324a313e486bb969baba5a5d13b3622507a4ed79f347235172084ad82d9e7718d8b07eff9c7dd6b87fc1437fd4f3c2b5d1c1771b09408ba08c92de76e8cbf54c17972bf573a56c3483d8d06bd497f91d54e0fb8488eb56d330e27b3b7bb42430867c46c6e01eecfd938921104dde850a3d28d95218ceace8206fac55f9c6e8a0ba645843ad88b99b289668183645996741178a58e061c423095074cdb7d328ea2234e92424ad479670221bd1c4fd9068ec534be01bd96e5ebbd0c6b2dff3cb93b3bbc0e6ca590683ab5ab9b65520a2368dc44d31081381b9a03122d60085f72653c87ff7d2ff4ae425ae651f8318a815d8df13e1d278d4fd7f463789e7dcc58003664541209353fbb46b3fd8735b3e027a24a24e66aee4454106ef089471f2c67d72128c6ad5e5df671df5e008424e067eb76bfa0f53f017f7daf81cc0389444b76e58faa66a6b06939b3ffaf302485d187723bebb9fb97034a3689b48ec26bc5e055c9ee414f92c1ce36b3b6ced62795ea79ad329f3de477369819342375b9ab7e6cf0076979ed614601d2cd924f63e9312b58ba7f3b0b8242d321453d03c4ee41fa6671d39142de19550e8eafb2a2366c04e7b56c669615eb3bc481ccbfb6cca907a01fe979603e121c90b5c3a7b3089a6304e35c6736d2a3b5eda5c6b93e018ed0c3ee9af7d2054fb93b339182a00bf06d58eb69e807b289aab7a2323a207d5e301f7f5531306d169b1e275544e1bafe874afaaf4f73aa3f237802406484c34360769e84d49b6ba8865c713c40ded3ad73fbe483154a5f5e891bf9f26191377deaf3899457c54633125a187daff90c7f5cfea916bc947527b6d2624f94432bbc5fc29be5ff739f6deb0834a8be5eba81498daef2f34198b998111a6bed9eeb45a5b29536383d7d106170e0bc94f8314303917027696928d92483d5b89a6aaefcaa1729e85b001f02135b5a8d27022e5a9472888e9bc7764258c11c1481c2af105cdd948b9792aa8992515d471d62b85e32df6434f8bfeedcb8cbd579a91672eb48c4c4cfbaee560aa2085f35ae217e642e123344c75873c6cd896fb3d5e4c6c3336f76da7bb5fa711f159fa5c84052ecb8a3c65d548345fbf596090a6d8fa7b8a4498f4f440c7caf4303136456011b0730ce86b91806c5ec808f24cbaf1418aec47ac7a5a85e509ac6ccc02914dacc20fb51e57ff950f480d8148a6aa74b697bd60afa120f3c7895bf57af434309d55fa535392dbebf284857d1cb8ca5eb1f3f95f792a1ad04379556be71059502e7ed396e95a73f906fed0c", "65656300526a52", 1, -878695867, "d9df7fe127081c74dd3b607e369e399ecde19967902ee3971a0ec2210f8ce547"], - ["52cd752a03be17bc81255f791f7d4251f66a45fdc287875ffc8678c998530faee89cfeea1d01000000026500ffffffffac4fd199c8d06342159a06171149a048575cd92831408b622eeef6524049831d030000000965ac52525365ac5152ffffffffab4a43baf5c165bdd022064dd56db36873cd9b5de96ebec3d7c17deecebac1a90000000009655352655365ac6565ffffffff011bf5b60300000000065252acac65ac0000000000", "ac65", 2, 1937444831, "02aa5d44f34775d4aed333fac47248ad4ce9ef9c6dd16501418a2ef5a68607d4"], - ["7fde2a4b016d8f7fd2ec0e3d41bc50c7fd7116e001b8c6dac8a4a2cc030e207bb46ab74a7201000000046a51006a059401eb0185d63b0200000000066a6553656a65000000000300000000000000004583980500000000c15b1fe11ba17443ce8a193273f5512dfcff304a5b99cdaa01e225f7f8db5f9c31727071b13fa0b0fcc0e05c0e08bf117fe587401b2b1087a2b5845f2c4ab14b4f1726e892fd5f475c2374a1e333c0209525ab39ff90dc103694df9a2a602f3c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d73c1b84f9faaa9f8b3c3feae22ab866d7cafd858f828952ad715967e4bc25eb23b482543e8f8d74bdd1835b6aa2eae395d90c9f45df0dd6c804320ac88bb744b159b5590903d7a03b174f103f36eaf1b77023dfbac5bcb69cc4f2476f45162cbd7312dddac0e7bc3f5fabc2811ed9710a3273e5952a83e227c465500bd103920323aa908264a2004e5a72fc0869347ffba66b61951ee6e9a2904eab448bda18c8032c287b7feefc1eaa67220edd499076b19019b7aea2106c7c927f583d176aae250a0330f17401ebd8270519d837e9a80225de063b751a43506381044283449b27b7b52d6a01717adcefdc34f87b6c8a298248c50e0d485967c8ee1116355065c8730218a429522b8c7d038ea404056d7a7c270b92aba0cd626d26f6a823a5fcb274e5032b90be84ca6e923f8e6b731544a1c99d1ddab3a291de968716c4f567a7392a11021b25c4650522dacc581e18e07556915a13d4019c23d817e3c4224cb8305b6430030247ea51ae4c0fa5248fdb130edf8f9855cff0239ed96f4f7fa01ee8e4bf39720325b430b8a4d8b11a115e8ade9be5bc6484e07b992d16c1d1f45a0f0070009c0f43ad63077c84acaf5edf46034657dc2eea3f62d89c3fd5f34e7cbe966e63922def2b24b6d01903f9af1f2cffbf667ffc401abe2a8da2ee09a5444de421fd9e2133414449b7dce488afb185d85948519f7c8eca36afdbe56ba8efcb387bdb3b4b855b5868ad3d53e733b2180d5c788268e6b9c16056437c8b41dbd887b071149b25d922839446b9258448b0910bfa1547b6caf261396327b5df5690466e744eef28d577ad587d77ec372ce797108353bdf9621a4a84df9096fc113f580585d6bfd0a6f50019255671c606d1edb42632e48cffe33e2f95f781a330454632d17ce99edb949bdccfb15870d1cbde0b14a7316296a79a0a6457cf6fff562c57b8170357e29381ad13a0756e59ae0f775bde0f79308d8d6ac2c88dfa196182b21c16be3d241a99def3561417a20e518f104b6553907d00bcbb600eb3497c23d6cd2f43c33f6e1e1b61fb251410c8567f00af61730d12d7f5be56f39fab3d991c7da0cacc420e77ff415a952f6d4c79b5d22d7df696fcd275019825549bb0b1cd2817f0b20e70ba1d2597ee603e999402aabc4f6a167434dde43c0ef03a2a9e5830da82a485ea15a4ad2af6798d882ca2614210efa172a59b5774b2bebf6c23d56335b718e793b3c7ecf069cace88e5003cc0b3133292dcd4369a26f3c610934e28695a078b027f4cad62e11af0c79ad979a7f89008c112c568f969215a3448927ef0b3ee1d9bfcfe095bbbe129600944d3b216e9a8c81222b27fe66f101dbe968a4b7b1e60260f2a0e4d269a5cfa5960147cb645cfb121b058c9c5d34aac1abd8f5cc4fee97ec80b1adc778b50e07fa2d4fda3c83796d21682bdd12e8359265a2f7aea432e5b969424a5e923ad9a61867f3945b728b488ce19ef1cf6e1f0218566751c8aea8fcda21a7e7d99af7fa90c02fbb5b7defc5a521e39d0ada8d672d8018c15efc9cda7d584742187e816aa9b1687c35d42bbf8df664e574dde4ead0218892c40eab9b9bdc2e2c8b3b67d8d75f44b3fe34c3a5747593e906ad13f54f97b21ba4d803674e5d29a4bf96c63756aa67a2d5f4bff91813987134d48e279cae27be6b5f14b36f4123f0c0bed328831115986ceffd9a221b8f57967077fd22f951af30bc1be037e868dfcdd37fcb4b6418f4f448779c524aba01f3762f22ce00a63916de0f480b688fa078e8bb194508a0b5a5ea75a8cd8301aabb799b36d7d54eb362e5699ae45466b389735252e8e5882800bbdc1529a853862b9f95c9f716604f11b0b9373a1c2e881e12e63bb6a27077eb2048d1223e8fb0f6cc0f65e017f49c4e9f275fcffce57785c45432b42e08d32566eb87429278ccffecea2f1de96268d30eaa50ed3f38cd5bf21410cd99673d8e882154564428fc466311fb9ec6e307850bcb3f7152e149fcc2704a361a8514e3d7ab38230bd0d0fad04686a0bc5982e3135c84bf89147237bce5400a45759daf6f953ea84e679722626bf6f7846a3312254c82b2cf4ca348c9614eed9506d30ef12f9b9a58bd9676c64b54a50c7b36560b14655baa42a576b2d38797addf4d3b87b9f0ac906f8e4299d600bfbc4e2c131ca8ac81da1caf64d2d8bafdf4d809a55f0e19e4c9b496bdc03987c2c8e42e9ca6cb8abafed703e166d6c61482de78d5e6c37a357456da9ff8a7ab76e45af40bac382152b17faf4e8ff5c540182f03a4570194186020000000000000000000000004e8dea6581ee7ee68ad124c9ce2ed375a5fcb40750ac37be344de80fe78de933d5aa99e8ba6dcc97f61fa7763b2610f977510e6d7deaa2fe360488406e3e299d84f561e5879bda81ef627ccf2bca6b9718f23d5e08fe6bf0396a2e87373d124d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fe91dcd4d5eec796c7202024ed45f6f044ebb9dad363426b62fcf1c38249b206b090c599d01fe6dc08ec8ad77b0e0f5f0f7626f803aea4c81f533e202199f72d0647639d43a7287950b95d45c2dca72ebcb8c797fc59c78236955dd4fb8dba213317b823864a5e31a8163620c00d0705793917ba622ff9f34ae26dccd20ccc7030793d7eafb31a873979b99354e0c4a7f64180d26e300b67b0202b443bf1aaa3703215294c488c74ee6ea9f9f19bdfbe30038ef52bf2b3eded5f67beb834cdb841d0b08dd3b1e4f8d9b5e040c3a9c9c058e9cde0742115db3e5fe5a6bcb1a69aa73f9b8820b880ee4d6573c00f83e9bf67341c76e3278718de55c51defd89422c51550221c869e51e24cfb970b8c034b26628f65f1c03f98244e6462335d91d3ceb54ba031738f9c6fedcc315b62322a21a39e6e99e013187f9181b60120cfa356b2cbbae021eb9a653bf3c16c6945a1ae37d42879e9e5bd2e4c410abb65607c4ab4149a70f0212ae5c8be828611ccccd4897dabe9638bd619f4349fa0bdf1a7ba725c27241680204afb521d9713d9e1682891dd4f72519b7df1c1c51a95243df710d4a14303e478ec2c04e03da5b6a04535d3c114387e65a1c2e82d9c955f2089edbf8d8641fb585b159bc2102731b3ee9a5a49e2683c8522bbd7383f376d1b5faff66096f1a6e789ae6ac6c61a8680806eed3e8a5551edbf84446ef8e3017a0a4e69d5a2251039db91994d79c83fb04d5f8eafee0aac7e7523d451f54b9915b64f0c4be538f83ff613e08a6f51fdb4786a57ba6f6e9cda8f4c4637e171ed3b62c8e729d2926672c2e64b88edd9f664c94cc4071ad21d8575f8295ace9fa4ad7e67b7fa80b219de54f4d5ac0292c88432f758bb73ea6c40a720289f87634d1104d6572689fa239b1297b8febd535afdd7e5a1b9dbeade10c7b400b524db9de561ee9f6d97a90beb28a60f2f2a5d86fac6aa24aedb82c500acd155db00b202c5854f4e407047d607202109dbcc472f5e5305d40aa82d2331988cfddd59579eead479955510622e53fac61d91dd20b070cb2265ffbd4142000780ed586204c85ff00f587cac5ad2d2f8211bd97dd3420c740a31d878a86153b4226cc5c5015f4508e04eeb8476e25890b465e0721edb70ed01e885a05b78555cb3f41e464b465cc616493e2a8e3860694c4a6cf653e022289c73c63515a7089a149c04d19d4acc031dd7ca1467b16c06e07b4b985ff1e3666d1b0ee66450ac3268a1ab2db429c607e52ec31c1e6c81af347cf467677df14ed3ee05aeb44dc4a5d7461305f04ae00ff832800492cf2270a8610ebb81e22f99c52f6486fcef9c4f2c1b8cd468fc9ab175d10d004f03cf1a3411e2952efc84fd949ba77fd5893e82875762e4745a5dd47c912105075fc73abdb26da9a49a40347c48799cf64a10eae30b14b393b77c13ba74b119765e8f42b3f76324a3523236cfdea7b2355c2f245b050c5e52886a0ffa65c17c26fda57b9045641ac119fd8432a94d00145859733d1ddab6b2728c8e941db87661204b52a9eb17a76b9c74f56f52302738af83b983e2eb8bdded329dd1424bb9f6776c08aac849ffddd214c66c32555861c1017e9e86836c5b3119f4a1e07186b16418ec6a86e7c354d09119f92146abbd978824198797b3410d10167c9cefb93ad6afebae9a9a16ee99f80a40ed5e8262e97680fa4cd68db239bf442d6527fa38329cb3c73a0de64418bef415b0bccbdeffe874ab264e698d9d38ce434e545d63f450836ce1a3518259c382dd1f01c737696e6b378911a228092f07014d2345d7ea63603d7daed63a772a2ff1b765740ee45bfb67a776f5c62859b78993ae998a201803e4424b126a7cb6ee8c223b16a526b652acf7ece5ed440b24a92af8e5b29a99ff8d6b15714e997c7a7f996ed1a5e4d4438e4af292c6758629274c89809dde282398a4cc54a03d6ebd457176e471eb614a455e685aee7ca4e96151f444e9213d2b5d6c914642bbd8d2cce65c66450dabc3778c3b0ddc4ff0336f7e01120eced2461ba349246f6e59105ab0f472fd2ed4d6cc6a04288b8477b7270111415c1e2e7e080a663c046bdf56482b9e52d1aecf57023e10770a10dadef8b6ed634c62a74962f8352a5cfec1b153dd8bb99ffcb1006982868e1632eb767544bcbf483b9243c67a2e777535d1cfb83d171caaf3a20462a228e4505d3e2d0bbf92573138fac17b0b9040974e4d0a9ec8bd5d9261025d24ec3fab43ca824cb428e4bf73eb41d6935e33b5aa2742b22fd207bfdeddbdf586e535e020000000000000000000000002173ca8461d7173d50e28f0771f79c7d33989e22fe49c2ca2157af030cf346c95ab203118bda70ccc730ac96739ed444771cdce90e444c4e28912202c1633d472a126087f3b5a57da12a67927468ee7956304ca24000b57e0328199a8b3d0d6a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c7613f6d88f102f273a0e278cab6bc0b2afc03c9d1036de64e90abbb47fddbc69d210e9cec39cc485d128adb24b026491f39cfcae875f8b2ecd5a8d120b2718edc62caaf74716236541790121dc1e4b10413541d5b743812cd9d9c2e7f5c7fb181220f06c97bb7b52fb1faecdc14ea2613cbd7e6a758edc456418b8874aee740209e4f8d2b74be4abde3e64f5969d2c010728f52df7ad765626cf0a9a812de077031bc31835726d2d9d08c5127ba67e625c01f93925556d8eb6fe629147d4acb6f00a02812048ca04360696e1fef80d53db60447e578f7cae5daec856aaf709c480aba630a322414ea2e8df97977143069a527fb17846f90eca4f5a361ce1af184b550300b47bae8f12032533cd20c53bf04a9cbbee02636b4f35db19ef3db1550abcb4020085890a56f1d05868182e740e3e750c3fb8a91436fb49760ffcc92a86bf848c020a7ad3a87eefa4084ecf6e0eac23f78ff903635c4460675cca5faa9fd64f18fe0205496f63cd6eb3c5743608ce24a50775ec4983614ed08d5320d93d53898f6cdc020daffc0978a543bcfec605f8bed96274583abf7771e286d2298c60c19d77e1c17badd71197afcbdd6d807bb38f8227c781b3a2d0cd59f971a8cee4ed91a783f167950e214f1e04c2ef78d8fb3633b3c11061e47ab5759e5c790926c9e92e9df9be3dec0615dd8b5c9c5dd6d6426d00efe5f9cee259bf7cf6816cc5881e6f135b53fcea490d77bcd54f9f26f7ce190667af5a629dfff821226aafb5bffab2efcba284d1c367e1e6dca45f08484a2e04ebdc4a8a92109e6091df2d0cc6c6e4e38ab6a83e2f33c80d1cb3fbad00f653139fe218792c9afbfc6fd5901a652d4a44a23709292105840fdb27b5274695e56c8edfcc9e5f3d9ef9d393d8645b554e3059e6b9131238c4172a31d59817b8cb6b119b96226f11eb7228eb97703c9f61938135750f0f1720bc9a0dd1c0936ecea38c2e1b42ffa5b41fd2f5f7ff7d8fed2aa8765fd5dc91717c2dc5b84fd8865a075c8b0bcec50724ff798cd07aa28a4bd816e1f505c35cd95aef02b0907315ca816bf4e9d4e5bdcd6d26588c3f28f7cf560aa940170a0d372b050d34171589e29b33b7a3f02dcfedb575a43c4edff36f336deea46a95755f853891969f121f1a497a94b86dc9925bdb2db0f4f7264e8e04c4fb1b63e1db78a36a3e2a3b2fbdcbe223464deff9ee9235cd7d0a5858cf3488d42792722a6b3f7563f8b2399c3247cea416efce8b64df7ac267b45ca3e3cdc32b863e6a4770c3f3bb034fa9c52c84c6cbcdcf44b9e699a49626977f23727b465260eb4451903a517a9432be217aad89e3ccf7abb96abd3d5ed8cbe23dbfa81f6c53e8910ed0b308e27246ea31e54c8c59de2c68bfdbb90a035642ce06ad24f2b3397acdc5dd756b5fb4b9a4cd265201b9b853f8cd4e530910393d0ecea15178243309dffa619fdaf6d6c8c78c2b9747db8bb668c4991fc13cd0dca1d3ef487e19c3742999b23163f108b32ad2615297320ecb0125be0b5eeecbe9d625e54fff095abca50fc2beafcce3a074ceb65285ef2571e9b83168bc0fa7054f9cc32e60c39b37643f26451a2bd3d4921dc37581f3cb34b072d3bbe2bc0c680a129fbc26a14dac119c9a7920110aa10f84192fa812d29bca93bcc40a83f428825882dda064d5c183c8d81e44be3ee6e3039dab80f08da2489d0314e911e76fe096a8bad9c15888e5a494ae9e79391ee5d1a6257ff207e47ebe01636cf62f0b92e018387b1ce031fa4af9926eddca9e6a58c52306cdc4301621448ebe21c127bd5486fb70914a7a0eecf95d6dabf1ac8fb2a7f4caad0143ba8dd8a0eb06c70e5e0937bbf7f12507625984c541fe1eb14544763c240cd30e33445f8999d8a395dbaf2e276f2b39612751f25b0f7f3436b597dcb2717d32f44202aa2d46364e24037d15925abe2ffa055a41cd670c37719d384de1e87a5eb768ed617f10ce0ea2ce11a3827a97ab25dff5ea6bc6fb55e4d488fe7c681b9eca4cd97125f02f9455935edd14898bf92f705702a889622762165600147c161d8ab9fc2c844952b72cee5909ace4667e48546233d64166bfd95bea32d11c117265b1c6a9ba333aac07cd0684ac37094fde6208268484a065e5da7182baa72156559a55f9e0aab27acb1be2165fd3a59e5f889ab405b2c2f5e0a1bcb3e0cc67ea5c57ac0e0cb67a504927f4c8e35dfd22c75e32d7615ea020fc844459ba1b8bdb68d1443517823b5b3a2d4376363b6d91dc312f2f451b79176b7487b996d23ec0ba0f3857515537865c9b19a66a8f5f48d97ad41c6fd5c6d936875130f47f7871b03db317ae448992a2856b3e0dd59221d8f115196ad2ed5b4fbe5afd9dd5342105c4cd9d6f9522284fcaaaaa93e5d7294f1ec4c92731942aa7dfa62b3e534e7e07", "", 0, 821766270, "b7bd104edd16cc835fe725208dccc798d84e59ed3818c65fbbc10d897b23ddbb"], - ["8bffad1304e82d6daf297be715e8e8ae18e5ea1fe112ee4c56f6153f01c697ddc6748a6dcc010000000096214ccca0087ef095538e987f4c42e0550c413cce7d24c6a52acf4be837081bf4402f1103000000016331dac89c78a3b76d44b0a4b9acf247109f191c99ef42f2a50019ce6d9c7179dda4e47ca7000000000752526aac525365ffffffffeb74f792868397e48601dde7095c773dca1251cb4dc6b161c2670180ecca6c90020000000552636300acffffffff04eb9648020000000002526a0075d70200000000015142da8b00000000000600ac00006a513f97ef020000000009ac526365005200516a6cad258c010000000000000000d99689030000000075e5c543300ac6b6f79d900eb6e3debbb691ff993f39c4251c509f4e280eef4bca66a55285302463fdbc9a08f4eb43e496c5597241fee2f4545904f74085c0eb438e7abb6c7df1eb8a9e1b4fd07fa787a6d2eef25f9da298fec7d6e4b8a0a110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f33f54163b6185e8ab5105cba49832503fe2d926bd341485d08be054ebacbe3a50b8494d507df56e4c1109c65c9d3d11123ca626ea0550fb7aa8848f24523199f65757c18680f30898334a478a6bb8c5f034928c530653eb718ff7f12397f63f15709ac220cd83b110b081228acf90d05edc110db9d1c27010d66530b1c171b021e2dc7ecfb6d531da659107008ffd5ac0b87a4ab0596a36aefc897a4f745613d0219405518cfe396d1246eb767c86b3dee8a45c97fce7aca88d482cda08c3a00280b072d12b2a9ef80aa5579493a0d3f76488cd6f76d071de69024b732f30bafa2653b9926b3020ec908c043b4713818e611e5d54ddfe5fc2f10fecf5582233e566d03044eb26f19d12b4540f4f935db1f374d15210f009f2c2a464dae85585cc8d3a702138646f70d833ec3354b237775302fd26d47b953f8b873ef506862acb450dec303184514134151dc56458878affc0ddfcd06abb1f02a5e39b0e0b6f16a1a57e182021e84725a342637063d2d2f0131c77c62f7ec7e2a11ac665440f625e04964f6070306ea1a7118dbf11de64acbb44aae9a6546da9dcd6bd63e3dee8a47ae87f612759aaa956405b0c7ead51a99dec302b1873eca3452ff30659d4e23bba44524b5553f6837b5a2654078b24cb54ca38a8a5d693f1811b35e15e966d93c81366ca9f0d3e9a328bfd490f7cc9e1718a822d8ac693433bd070091a66615bb57a5d95abffd528a52d7add8cf5e0a730edfddf2b7ff7c113ba99f0dad174eea8b724d37e6685253e7e8898f97a0331673dfee1f83a68ed823c151fbc0b3563aa7f678765d28a33feab990259a5529fef87535f978b7cd348ba9bbe2d7baf0a0aaaeeeeefb3c4abc7b5d508529433584461f10e8687e184acb8ea19c6e4562585f7004979689fdad125b3ec68d27b06a0b63ade309240084501ded9efa3c896566149bf654f9146a036906c90598e430962303ba09393bd82a3b95cf8d2beee07219bd9905ae6d06a57565f4478024c009d35503f8e3a14f1168cb078ba9ad494ef4c032e799b90927e054acbd7552595f0acb5d3bc022112bf7f20df13e6cd4c0de0023642abcf84bfedb9f30ad9da5e18ad4b288daea572238419a84eb38eeb3280e79f247ec181a8c844d708f2d5efb28dbb88818fda6f689e944f8c5b614dfba2a03dfb20467f3745c7a1ac39ca7d1e000e8f2766d28cdf750a3e55268738f4b113a2b8fd463e53a40787833b7c524c3e31b9c9746e1a65e87c86327b3242a0aa0986da9cc2f91ca3dc537d71a08df885a35d91a8e64032f9412c230717ad5fb26772cff801a501994bd8006b7d385d9578681542545490de4227efdf2146d01ce47973164973c59ed898866a8b38ef9324c3ace4d3cb7c20680a48f1316e68acc7831efc71f2ddff93e910821b0e5d535d35d51e55b80796a304b8de2c9ebb824aa6aba03ebb8fed45703fa62012940b794116ecf968d3274db93950b788513fa82f91dd2ef376ebf0acc066a5f2cba6d69cb59ed805998e12d1d2be5320d00f6a9cc1212d566980620cffcc69112f6b1e1d36b8865b41c8ed22ef34cc3c7128b0c5daa70e329a4891f7c5d716d618f1a3df4e0568814d7ccbd58138e28c186b9dce3e33cdcd17310350c587d5847fe69ec95e7a7b616c9e4b62834389902b7acd491f3518308102a644f2ca5482d46d83c6da41e4a1223bb711a90ebcd863d032ccf27511c4209bf1e8e542be94712dbc1fc2f08f88dd7af52cc787fb98db2c384b23840de01eb80b9c7eadf0c8b055099646adf85e63dcec83df44749573b9a2c65704825f1ff9442213d804b133a7308720e201da85fc74910d6b727b6770e02efe458a77e46aad72a71496d73379b0c0bf25a39ef512800af962fb7f13ddb8d12ba9374dd76681e4cc3d87ad00dde5297b9595abd4af6abdb668297a5b5273ecfb4bf1940151fee80dde31ae1d4abb9564f764679195c89b4b2f6c618b2e135a78db434fc8ae836eeca87d344564538f63e806adf83e1a148e82421bdcd579fe0db50396e905104f50115e692586abde66bd81dac33e5a7a91d7f79e59cfa9c576665bd243b8277650237fdd7909d5dbf37dfb2525352647b380a890f942b63778d3a287b5e3da7d84aabc9a9900df92c605252332892f049ea4a0937fc2e4d6d56389fd311460ebf62eb43bdb6332d5e15a9073eaf2d3161c16436cb8181ccfa6b8be65f68e775a77bb2b29e6c6c5aff543935d884921f77ec2631b5cc8eeceea0a8b9c54df5fbbed57a861e6b6060d2a443af867b25799443baa384338cb384fe57a2db55bf4b9d7f678e20068e576117b8eb58aae9d8a91f8836b29027af6bd093e78580696b9cda2c2497791365d30cfdacde51938232d3e42adf6f6829fda635b4f7c064096f6129e34c53fb919c5503", "525151ac", 3, 669318839, "87e4d283c7f2b9f8e96edfaf79b4ef87e8a04a7984971e8b66d3dd52e766625e"], - ["745753360366e3166012edf9ce59b8b15979ea8c47b2f06fbf223ffc51f1a7fa5820af36ae030000000765ac636a53636aa53beb12e3d12e7087424350fae97a3408bdd6d9223324427c40c46d0cac9a2d36bd1bcd02000000056551656565ffffffff9957a3c832a0bf1531fdbb2a0689a07911584dbd8a1a324fb007e682c6968ab1030000000952acac65656aac00525141d569035f7fec03000000000952636a52656552ac51dad1dc020000000006ac6a51636353f04b280300000000066500515300ac820615070200000000000000000fd63903000000004583517ace0f899c82f650510592f19220dcdebdfe2d4ebca5f59de494920231c31390bd14277a725cc8e06c8426977a7a46198458b59391a23a0d5290dfe26490aea95fc9625d88a6328bfe4de046a21a3fd571e04e913c4cd560d16a798c66000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000726130281d81c2f5b2e0fe39d4e852b12d6ef6ba40c60a454a9e6acaf646598195a43d5050b745c5738aea679db353a96135bbf7946fcac8e8086a909cf350250c086b886a07ef774b98a13d9e515f89ec4a7b7063328ccaece2e78a37ed165d939f45f7b9694063c03ecaa99726be63dc6822cb3f6b6233fba98e27e4f02120219f2cc1d316eb836cf6d0d7989fea394c857b84d50729a5064bfe14adac1e19e032990d19fe9424ee24b8d4465c83b25a107d602ab69853d01c87ed5858c59f0f00a067c929e76613b4a44d5a489920a464fd02ede4f9bd691890b958db70b43b882112a0993fb21c08295df82d7c330acf7c4a0aeaac40e2393d026cf8c2882e870022559c6da889080b2ad533b0c24b06cec8e4d88475afe5adcf6e804f57e41a08f02257df1f2c06a37c9b196d894616bc128cc88f40aba79ff20c394bab291df86d6020bcf2016b65ae767d9a1a4bfe4876525850881ef680050592e8598d6966cad3203086881c1f813a978b08d4ce76c6e931479ac32adea783119db5d55b80164f71702001cefca25729985533b131e48fcb0e80b23f073358bd636d97336b3574d5be61018b2303e3949273fcb377f39df39fa5e1cdf2ff2813479dd65e36ff8745c21a334c5e5e281f491e3760f618ed65fc423968bd454bfa8c44981942fae848f0ad4ced2f72192afe2e868696f7ffc267e6ed8ce1bd4ee2f5e10660d86f77e5801867afab3fc97435b4aa19e6516fd5a62524fe0d95b1f7645b583afe38a69706855c8c993c98bce6a4c634859f90b79acb5ec98d23c83e8638763896bffb73eb74ca5db888357bfa94c8952ffa08e493db0e06ab1a1025f6095276646192fb5f0f7f1f9019357aaa2ce87b6d2b877dc029693582efe0ed892c736492a0d9da9c3c18744ff116a971c0bf71f61b433b7481937288951ab31c6709db7b6dc66dd6f7e6f61850bdf151a5a21c1ee438a04fd21a2b0717daff26ed43b69a61efa18682d60ea8b05feea0977574af331d4b4cf56c44ee14dde5f4766e253aa1e4290e513e0377c928cd12edbff0118bb5711962483281fccdb2885439a7e6920cf076fa33b4b50d1d4c5bd51f02fa557029870dd0451b0517522183f8d1b86ca5b87539679c34ee2f08fab08cf23951052f73d15028fe94b1c4abea9d49b92d0dfaad7ec5062c20ba7d6a637cd9430f8dcbf19b6f1a1503f4aa0caf72ce4a80f9e049cd675aa302b098465382780ec5f88f0133b495e57af807c41c31cdc38978ef52920463370507683e3a6687e318f0d4f7b4a6558395fb48f757910b96b584ea57db41224ee39b1bcbfdfc5c8aed654256eff86040479ddd84d68cfb4001ddc1660a0f7d1b741e128791cc7abfb98ef7d1cc7d2cf32b0bbf8917dd48636ab371786c019568e3d32fb918824f8d57309e6d6fa3492d2a50fc0109431b09dfd926d7b8ee6f3cd4e50af89dda8891233cfa95ef24b1cd696a3edfe3e3adc9b9f357d6f023855545f06f886aa475fafe9247dc046a896616a816f12606ba6ae64c70a05eb5f8347401c47270b4789c7a0865b20d2afeb9caa2d3198ba13c6ca588f991984a082a5be72c5bbbcb5904baa51fd7beb230f8b3cd4e2f371ede66694798c97cebad71de08c09a827d69d2a062506161c7d36a7fe025fea29b44ae8ebafefe9697ef74f413bea10a763a9d817ed203809cd3235a66b9398dd808281f8db5c5c2e7a5ecf72875c5eb869e7277e2fb1f9af7de1a48a9061153b41dea29e7d0ee60c3923908fe0be1a241bb98878ab2dbf94d69299e2dad6084c28db938220c224bb798190d6d12a2731d481fdc6fb9eacd0a58ec21ac20a2d3bbe0d5332393cc587576f83158cb523f1f9052cd14cfd9b57b1218dfeba64c10bdd3b107c63e4f02eda5d983b77e496dc2cd85616ed1c956b7d937c41b4d2404629b0d625377c1122443df597fb62036f3c5561a042a92e87918f44c585071a263a40fda39bee83ce832bdaffb918fc29774961a01abda631f595f5ee079fcd4248cfe7051781528f792dd822d88a3f167059dc70bbfdcd7674a2fe74abf878457824a5df3688e58f47faa2565609162ae33825582f57325f30e58120af4315d6acd62f549db766ff5d8d34fdaf2bbc00b4a99b0a8930ddd473b8b1c08d7dbb0cdeaa8fba263f27d86c698935ba5dd90f2baa12a15fd78cfc03d58b8e554bc80a34ee1f07f285e446a85bb78e26a2114be29be759da390422a8fc5f45c2369f2b40130cf81fbe5f62ca1f802a66a6b4a437ee83410394166a1f000000000000000085f14f04000000004e256235e1c5cc4126c933a279f31150cea066969d755ee4b3e76e37ba8cbfd9f02e50b89fbc2f79d6a9cd07ac6f3535493a9ab83fd46d3c32e456586b3e61d25429a18b9d0f5576be27925a6ed1d34573e99e7e3eb6cee3001be007dc8e7e8b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061063ba29572a0267d572b5750c2532359056f45ca4505ddf7ba71ba92176845fbeb34c9bd4126a58a1e22ec8f87951152af6228104b3430571d71cbcaa347e44c271803c7ad5b424c669bfbefe36b1bbe5c79e5b5bf1b4f6f45611a1e7539f5bd475477d2a474561c7e3dbe7b0850f3222cbd28a913bc41cdf97eaebde9b9560301d5e6ce64d6e89d021a81adf4b7a95807a2b9a1eb2e391ae3e718654372e4fa0213169ecb88edf2dd0bbfa59c361b9c9df6220e41a4e69f67f1de5de25a194eda0a001b08065dd7a2d3382beecb9ca652f81d184001df4a50f4ebe2d1a0123c6b38ab1a00eaafb959d694b79dd6df57884b36a8c100b651034d922c45cdfda980400321bf72434b87a76f364fedd1d62955b83d261cc440725c2c8e0e81a066b9c7c50310823b2da259ba69da016d69d16affd36fccf302e98b4e7ba1339dd1c1b239ed021335740276dcc56bf6d1251071fd5515c17dc541cb8288aa9b2369779cc0181a02264801f9340219b2af5f6fd7ac565d863965d4069a8af512d010d05edd1b4d2703083f4092918e73c62b93ff9cea21023e26929984af133813d19710a71dda6ac50a118190eb91390ebe03d49cb3fbdf4d97af4c422532da2fcf30c79af593966e81750117756203d9f506f9a5df55196d75615e5b83e5ae978ddd3eaa96c76df05ad616502a819d36cadc0d52e49cc33208c1141b0ee1cef3827499135c182bd378978ca7b2b0bc8d09176c76766c7809a659a17c38aa753c2ca2061bdf6ab0bdb34365bf19926a7f2309476d3be2a0acffd6577783212730906ec153408b8b8b479717a673e2c330859bc949a7432dc771626b8baa8d31a3b6ec08f659e530f347d1e2bb333664625fe27f1af3b63feee34fe60ec34466b17b85f79d1376eb01d0c9ac64e9a01adfcdee516bb9d04bea1c7e8210aa05594dfdf72090646a2ea2a8a12ea113db1bd42df147082ee23588ef2063d4fe6a8e715c063a496867c73fd2ebd72df2086cda65d76be5d5f23fdbbeaf906dc00bb57e57d281a85e60ee1c530d1406b2526fb963eb20807fadb388e6a93a297a13200f05d0c166f0db1a20837213371cf59ae90e984a8c7723d0de28167a554be4024ebd91fa72e0bd89c748638b571e14c546fec7dd75f460bf1f0a6a560ae813909cc7f6ed22806a7bde1de9dc236e1b73c1b6f90031b5f4525627d59d0fdabedfa8ef5ec908ff8eccfd624c0ffbd1f149bf7d1d992735e8a6552f1110b3d3426ea6186270ceb410a165f5fbe172eae923ead9f227591856dc3336fe53a3550cc00f12f3529bc6fc0404b34a230d47752c8803687b1cb9baf99f94ff231a937afeb9227ab6cc3aaf7c62cf931ed17a7304183a4b2ada83e6f89c9f60bb84c780d72fcc7088b07b591a834c40a92d5ffe8a111ce55e4f633fc15bfb563efef43835a952fa9fddc5beab66eb8a0fa332d3c300ca4dda133f7740b2bb6ee2ba0050dce090cd41d86decd5c26dc314d6a0ae079650bd0358e76ec4df56805456ded43df804595d96b0d9afb691c9c29982f5707a98296218fcb5ae251b3163ccbd9dd1a455a5a13941e11d130561cc494473b88658cf98f306124c0be4c81a1853c2ad210136757aa94cc1f4d834d22581282453bd146883c6f52f3805495632a60479b68e44b42b10b90fcec6d1c43a55d8bd1bbcd00c8be15d4609ae2307100e53cef467ad249f5590fc58a697eb56debd7efa724931da77c9cb639bfa94af70107adb7a668dbf21be7e96202cbd78c578480fca3c03699e7944c5dd09c660677ac786e9bc2fb364afa3d6fa8936c2df7e37b0d048c7d768dd71d5fb7394c9c82d7e82ae4407fa61e0e1fe63cb64ec14ec8dac63c10949b469c8c6d42898a5b1b7c9d351b70b47bddf214b835a4f6b58311beea57f6bfd91ff9898835e0b5b0c15de6da628d81039eef7490bb22abde88f70e13adf8c0d0cd860538dbc4ff5167ddedbc160364cca45da4eecb31bf6d45981cfbabfce5e5d313ac118ee3c6ece2fb16015f58569393211ec26b11bb5b3ea0973d3496c3a391db35d7db818d85920c808337301255c94833fcca2dee77c62fb0e5db65ba3ea6b8cdace67979f1a54f1ecf78a979e159bf936d7b6b179ecaa93ac055566285670d6ad9385feba564b09278221d1af4eaa3386cde257d79e2b3ec7798b5ef024ef6456c53537826a99eb16000157ac9fa29343f7ee6d178f281cf0358a59acd5908e8f714662406dcdd0edbd3c7aa0d474955595496afd833c23dd90ff62f7fa2426fbf50926e4161843e9e797df922971b377c18e1f6b6b66f39c55e057163af5c6023b1682198432c89f56fcdf7906753b416a2f35b2c4f8b10b35ba9a9c28a11e6787b7582927f68913ecc9bba590efc1c8e79001d3cb328396076ce017fdd02220280b", "63526aac5153", 2, 382137557, "b85b5cfc51af7a0d5b75f0c0076ebb13e369583fcccfebea493d737fad8613ca"], - ["030000807082c40303b1dfa10166d85bd66150847bfc6643fa19a0403ec4da1d38b3f7921a63b0b8f7000000000365acaca3cce7cd0935dd5b07497b3b0a14b8079298ba31a1004f9b6e720badf5ab68de9a53fcb200000000046aac5265fffffffff36ec434a90d595c5a6d829e317b20c5af56b6962be9a24d082f220e5ac9afc40300000000ffffffff033ef7380000000000055252535351ba5dd304000000000800ac5351ac000052f10fb2040000000007515251ac63536a00000000427cf715030000000000000000a3501604000000002ee1eadc0c6ee6a7dbd6f09b27fc4fe25052cea8f0c500ff3d5642b7fb00a47226b8f1bacccf28df896e267f38fddb44d60960153bc0ceb0d9bab9b1178abcc3ed2d189c9d7d84acad0a25a8b1aca16e81ab62aa2df8a15add65a32550f545d9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004ea612fc3715357594da52008afd381241af74538c566de816ce06c04a9115a017e09d09dd8b0d3804b8df8caa4e7f59393edfb856b76a08f251a087adae7c8e16aad098da5585c20a9f112fc7a141caed2c56c2060a1c7ae7b55921c78c77137fcdf9db7366bed4f85cab681593bc17b667871935b9ac89c54dd4f4c4f176520230067b60a9c7b730d1b344013ddbdcff3b5275e5ea805cc79207718e8bbb504d02078c9d1cddfe40737d0544154c8f35448130de249380b089255789e9a85996dd0b048333e803fb0de072d8a5e01d0dbd44c66883e78fd2d6bc8320426c44fe51a42afdc5af27abbca043987ebb87820d20ffd77d57526ea9650b9213a2edaf09340306f9cf9af2c7b213e52a75a07c5e07b6ee26014ca2251cbff0219430b38c160d021c32ed6245a9fbfb7b34cb13626a10b1f46b88ae0eb3cd58bdacd9c528dbbe1f031d3021c5077fa0f25e738b0051d2d4c0810b2d8e691eaf26a7d1885e4a626daf03286ec15d1deb55b3d5c59de91e9242b5f582e9313c8343fc542e3a7230868c860214fb4f4ed83d488a2d917c7dbbad057aa034f12f5a09c997104295e0bf1fe7a5d9dffcce1b99e176e41938fba0d9ab6bd4331a775d9947c884e8f4a5d10797446ed5cc67a93f513dd4b755783cca428d13ec452614cb996fd51149f8721afeccb4e624dc098f9dd8a4a3d522ea50c8b7f3eee1db521b7872e22121fec0eaa7b6b72f012744cf07772e7cac9330c29ac29885e93da75b6ae8b0313499602465258ea9ef2e6168d2acfae194a7744087029c1ec467762d2063a6f04eb0c6c94b611e1deaa87642235aa5af19cccaff68a55f940bf1cf4d5c4603b3c049474dbdeeb882ac7165cb1764be9dcc097677a263c26a699586cc2f350dc48e6efa7b2602695697e60242d4bdab15d6bf2a5ff7ed7036e583f99f21c161bc675ddab3edc664bafea7428e63a02ec0a4f8e0335ae0e0fd7053d810ad9358839b3804fb4240251301db0bcc1f2379a9c95f91e81aea87935083e554a540175b193c70a2a5feb24ff421386996ec13056ee43568821216c8b872bd81c7a89e665fe11058f1fc6565681e7839e490af86d37701b34ec1012da14ac9c9a17fb0d29a617294fa2ea3865dd13c8894d3b65098ed74be09cc8df10634c20f2ff85df17f9ed1114a193c112f70061711789e884bdc56e8a38482e1c6d031760017a6817f12d4c8a22cb043abb7b298fa6075ab832fe683c2e0844032847ee694d2fdfad7e5bc3e5597f4f2722388eacd83efb6613bec5083a62eb3707bdec2bc9bf2f01aa6dcc4decbaddf05e4a9cba6c9674d3082da05a436eb03c8c7d3aa361c6612d8249adec6e9e331594e118b0064dd1b43ee4d345bb8c865859f95903d320e6265ce232f692145c17cdc8aed24a5d475c6e7ddd1fb75ff050e0782398bb396c9a02b73093567eacce9f9782f8dca806eb62207b3f58840bb596de9768536d9b437f6c3f02e6bfec8ec908df773dde126946e126da86587e9c687d2b9f6e7caebd38a52fc31a8fe74873506edf5f26a1934c7bfcdbb257dc9d452110a505e453bb2296ab2a8b3a7cafbc105645a2d755de88a392bb3c68dc0f001b24bd94df00274f8981f7144d07ed064e3e60bc6f12795fab907a5a90bd9ebd331842a85bb4cbe94e38fe28063214759fc707af84d249483f8e9d2a59af7ec4cacb516cc318e3bb1fb039217d243c98d3e01f5766f61e5cefff5b06f6768be95b8d0e94fed68c5e3579d63f86022ce871efb88dc236972576aadd1602d254274c023219ee5bbba4ea643c1c43da232db9c3c77a94c51099e9f1c142233bb3be2c30965a2678c769c5b19882902b13241c12a5a09432363697ed341b414daf39bad573c43bebdcf36e7a28a0b23031d65aaa14340e64d0a9226376661155107a1e6925c34997d284c4e39061e9b2c03096872bc067b66c0a400ceaa9dd70593cf1157997577601c60bd79660ac6af2d3f8768e76611e10ba666eba3ec4b8e111a8ad1a22452c4e5d33859338856ec0071b5bbd8b9de2e05f2727617b64a14a3d437b7050540f50a6e99b1478608c0dd97f2c2a4b53aa9752e339c5fa3deaf30918dfa6156f68d4e47df5ed1def07ce03645dd2372238744846f954488aaf525a938f6ab9a8ccaa07227bd0a555b9313f879dd3a05ac53caed8ca2960f217fa268e15a91cbb24f097b783b21347d55d5f686f6390264f6f2607e9fb2a08a115bd3d9914ce4fc53e38fdd2f8703737283196622749a9a880ba587eedfa24410b6d1fc02000000000000000000000000994eccf2e4a0cd40e2c0737fa469628d705bb2c3a40d92f43b39b999d27e6ff2fc362b8c32881241ab468dc92b7296c3f509d85a72513bc9af0946fc9e48500ae690125b1c19fedf07c7295ebcce19b06fcd273a24b6e174e0b26aec8138136400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bf3b2fe9330e33c5615d037bb8a31e0818f3fe657dbc68485a22abf72be36a64df53f57902a4c450d198d863b3028453b9b2ac440b548d3b644eebf8297056772979a2f59a7648b721cd5de1ac71a5744588f71011774f47d2caeee610013381f7bbe7356fef99c7ae2153252ed39a71cfed9ad48c68704084b38366c31ec586031cc4f77d4d14450cd6a35f78cffc5ad3bfeae5207ca40a0f719135b81bb42e440324be1a7453acda0f0906b70762cc3348921a455defcb2b27fcd5508b41637ebd0a00b70edbb11ba1f35add86a2bf392df0e7dd12d93468d1983c33b9db39c11bb1c90af693611df6848443f2a8790705cf5cff9f20238aea83357440d18b939d04030e9dccc046acbb1947050ee981a2271e1a34a0468f6158a73fa78e419e322508030c1d7a7de76ef0e5f220655249cdc3d10b35c995b0950acf0f2db774a921e04f02225bc8ecb983443692676b38c40e99aa54a492313d8fead29fa19f98ff36e27102177878a111cec577f8d3027a3e64dd1ac19c4d2f475374c745ab8bd4387cb8ef031626c2cd1fdd828e98068b8b6b6f0248c2e3ff8ea75811a8d1d65e6d3c6ea1c6595df7cfa0af2b2b8c00b31e782fe8cb40fc221f0d8701f894a4e67cef3949f065dbf3ff7a5763738ec6a230a196815fe81357e812efe10f75515596e6a7f6f2ed1e93e62dcdf983d095ab9f012a3f88afe686ca4f9409da3e32bc7909226816e15621f3b388923b4c12c608c10ee0bbe197725137a288e74445ce3399b2e683907cf36d4995e7bea2a205814ac8619fd7ecb437f7ac3d6070cacd31a91d5434b5437d9597f82eb67be4d908d1f13cbe2afa1a45005cfa5e62464547415f55176e5f01eec57a34ff0bab7b2e83761eb5a61498b1a25c02ff64afdf198f70b37efd55260739f91238f6bd18278d28f48f82d573e886b1e25eca042c15ed3c685f62159a84485cab948cc79ba8f242baadc3615b6955c16151284a5dbbc36920ce7b0aa5a309e2cf58044cc917313d398d5537a85c5fc9bf4ea4f81a7b5d4c622b3f192601efc197be920ed72a4ef7b40532e61f21d1ae68c9e35d87c3596970ce0934d31dabbef9566d180f1192e6eac48ca9019caff7ccfbcab120d71a967cd13d2b2c79dba13137985b3a9edcd57280f0ee6205299bbd2afacf035089ae116d97af7ac21bd9b4e47088874b17f45449482d9a8c86f8e94e1c47f2bdb7bbc7795f4fe1fa79f70690828336666faf2d54d6f233d3ad79a0afa8c2b79e60d307672aa710fdb55bc1b63d24af196fc16047e95ac3634b6a49d4a613715f7687a9b88643450972e2cb6bc785e9dfeb7a5c71afdc03ce5d3708d562d0d475a0d9dbecc57a175478dcf7513093b263d0fef2d66334eb34db74d4ec5009fba0c76caf70b5c02caddc8e88be76eadfc07b2f0a6efef4fd03207eb712787c63043c79d85b10f87f99a5ec76152293b6607f6a18bcb38b3a0650b683481b09d29f00963bcf9f0ad36c3871ecead2383646077a18d5a8db7c7aa6539afe196b1628f15963d29f5759958effa2ab0cd7b106bebefa321ae9d3d000db69f20ea596a844192feee2f081d983c1cda4a54cdf88c1fb3decfacdaf027a52f5a52df94dec53c756ffe2fc23a3da48c2807ad18e3ca68278896c74b80b0d14a9880594947e7fa697f216149153b6db09d6244354fca28e6f80639919a16012afc81e416dc7480ec4e34eeae1d8e39197c434983bc6a8b145fc9539ae866eded21dce45240c7997e719698ff68eed6bd55ef42cf20bda629dd56ef8e71e86c11a87c80ba68fbf53307cc51b0bd45e23b8077e1c3249bf68136a07fbc031430f474a5de2af07d07a49104960e0fdff64a1ece72618d431593b943abd7b11d8ecba3ed54caff9a893372bcf34db0428bee605690f450fe13d4f70599d2b38feaf6a8fd6e138cce90c3b0c511f11bd508ba8003e7493b843cbf0343bf38c75ecef047a66ffe411b58c4793719a2968b1fd5e26b8cca6f01a44c5b7b215247b3c12cb55f7c0adfea41785fd9269766e2048c61fdbefa8b1bf7ca9d6aa4cdeb9fdcbbe57f9beab6f5a099be974852a75ebaa250b90e6d1214b102f07c83ab6009949e5a63414b2b526cc3a23e51358fe700261568612f11557438c2d9244631b7082072af143415ed04af768362a2e2ea6ea9abb1f06762553f87a76ffcbb04dc7a2761fb7c8363d54981197c84aaaa518575e8bb4e05d25fa518f4b5c64694f7f7f79dae30979926d3ee20053cfd57d9da4a3d4f80bbaafc504cbb8eaed000000000000000027b0d2020000000067f45ca90468f84ec035553925962f0ad4b6aa1332047f2ba9d16c90abc7452fd6c123697225c4c3c562547dcc615da1e82d94e1fa66bc0de398e4d70033b97e2280892b1d05c3b78f9b5bb343ce632fc4f95cdfaa032dcc0fcfefa96186f4400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064c71419905f3402e7b1cd35955c6e060f87cd8aaa9a10e37236b4a3b9883e31a7959117d33cf6b07382fa651d63e1d1992affd87bad4254326eacddcf9b4f33152cb4949f59ecbe97e216261af95cab61fa5f0c849c12f73c32752f64b846a14f46390ee3caffc2a84adec13002fe934214449dea0cc1a79ad12c0fbb608a5a032c057abfe94b05126aa5bdeb2fe86676b14400f3dca476aba7cb97c402fb1e16031a81fd0ed334f323f89d03619642c1a57f810915444e11b707b706ebb5484f750a067e2b548848c407461be07107a60bf67588bcdc66e0ba19ab5f8b1dd4ed797992994225bfff535a9efcc0d3178f862a0cbb501362f04754f906772af22ef00b022ce093c841e46eaba20467e469b2bb2126e51c76bc13f8a9832a90f9dea83c520203044d66a78adec963c4f1ae0b67836c0bf0cf07aacdc0f985b9376637fa078b020850b200de0269130d3fe9d176b092e1a432e1dfa901153790ea065ed5b4461b030c133c7d35a9dbdf10817c76a307bc9cc037e9aed309e1ff806937b86c8a51280329181b0de70547fae0c274c02f5335928c31249791b19b49d990a42bcbc8adbe4dc463087d81afb9c631d304851f0b8dc663f223abdab79be381388fe712dff0cc171e7fa1822bad7699741e731362f4c0b69b641aa01bc09f43895c0cac9f409ed5bf227f0a2093e8b149a39aeedd6fd20a1c4f88b7b9c9d200b3d9710278f44922af54b61f0ac4d7fc09a4fb8c74758148f5deb71fd63274eb46f484e1fd051e9149bc887800ae2e39fa85f64cbe2a0c9d3e9c2fa88e42743a4363cd36516e6b2babe3ef6c83acfeadbc64c1af59495804c4a6c462c67dd13e26bd497645c0dff28d99ae7f630d5961cad16771dd5c434616a5d43cdc3681a276b47becbda5a0431d95239649db9a4bc396eae19558169ff57592158f6eb9a28b970dc79bc9945d2b02485c4d1c91168575eaf6eb9e43852349c0cedf376678b13b72dcddba2d5e30069b2af66924bab3ed2e5f2379fd692be185aaaf98153e88eda2f0f746ebe726d9d89cdcacd0d44f1eb6e335ca4684ae9d44bbcc585b3e2196e8a1e4568e5c812416c7cfb0f8bc1629333e38ed1b741565cc1d0e1e5612b1d9cbc4491996022c597d5489b72a73aecb8f57259d1ea83589d35b2fb5da291c0b277a61f2c668cb4f5cc1b692760f3cf4d5318e3d20528b112da2982bec24e20c08a864f0faafb8c347572f7ffd580791d097321ead930d82388a23750f111ff20ea870548ab02c68e0aac8d9c46ee39c60f2219c34b16ce7c4edaf0586bd16528dce5aa5e6a412ef4fc7663fb6103a94c7ac8d94237cdddb5d38354d0d6c8d0b4fc50d0cf6b0ec2903ba8531440fed3a6cbdbececdb23879b8b2f4c93defc1757d70053a0430aa0933484022e410225a0efdc6c78b99127dc2b129fb097d72558ac12db410c563cb663272f9d7391b65361a156352dbe21c421c50a3abb7bba17457f61b37bbd1e9162682376e0fc1a5c20d5df1b0e506289374d3f76d013e49a3cd5ff3a6e4efbaf7af9ae69188f67e7206fb7a8330687c7dfce73b8d518ad1a77f2e6ef85459bcbd55e681416ba48f2972f3ba88d589073be11f59964a7f2dfefa37c9f270d72a67985f017e59f86dbdacb90a878379b5fdb9a42870fb054dc3a8355f61dd8711cfe57b13e0a7acac3c6c9cd7a695c351a10463833af446ee066fa7ae9557b60f54d1c69ab34d46242e24576c77ee92f57ec0ab8379b90340282b5bd2a0af81f49cf79b39e6cdab36537d6c664d39037f5631b277d54dcca99b2855c00e0108339f3c1beca36a98bf52f727b15848066f34beefb538595d69454ae4998145a89902399db1e76ed6f88ed66873af21d11dd2b3a26a4d722fea62a017e9c5a8c44d236254b16e1b7b2744688d7746b499fcb2543b47d561c5687d8b18b783241f7be18ab6dbe56de21019cb2c1fe3c2c0f742123b8a9596562d6ff22cbd78f133e0e58fd63965376623bdb66ce4f8241a1bbb5ce6d6edbc7afc8e83760a8e7f8eacef8af6dbc2879fba94fd72fbfe315b8f9171b58206ead81c0b2b9b9487855883101af0894b3614dbcd62289d26b00b80c8388c59181878d6a4a5889c034fa315f0ed27f03cbfc7f1223ffbb8876a96fabda1277b0f0512fe2b1e2fe5ce25b76c6e571211ae9cd77fc383e63cbf422ac76afa084aa950429760780c8d5658105d9d8fb6b82efd4eaf187c0fbc93d0d01d78ee0d72124b3c861668154cf73bcaac7e2f12744c75b2e1fa7ce52bded77fa8625fb7f267d5f135c779f1ef4075b72e15996eac7fa2f1b7a389c138688212386ff2720a4cff5d0d944e40cf01dd4d33b72bcc78c6452562bed1bc46c84a4765aa85a1594bd0eaa0675302b49fd8385cfd65681fffd9f3de0037d5a43703", "520000530065", 2, -926727091, "ee71102845243b377ebbadbb27c73df1e275fe151fff1a91bf6a9e08cc638e3b"], - ["030000807082c40301700cf73238a1ba9f952b17491b2253dec3089b191a8c056f411050b611ee284b020000000965ac51ac526352ac65ffffffff04a09d0b0000000000096aac6552ac63ac6a6a0f6dcb0400000000036552acfe83170200000000035353534db8f40000000000025253000000009b7ff829014d83d400000000000000000000000000ce5dc7803c475ad6e4237b889ac1cfc8f4f56104b12bc523868408137d4c5cf1f4181b3b91e27b342a7cc71da83881773691c8812087430e7c25c888fd1a149607cb0b938814a205397b5493187337ddb8965aba7364605b0af021474016056f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815130b706dbb66b2380c9f4fb01b878862f40fdad92905c71759274b3077eea720383660d6762499c571a46ddb421d09e60ed080c8c98767a8a103fd3ccf6d6cff4856ecee621602a8cad61965f65e5b043e2eec1314dc3a54e5434e9dab7e7d392c4273f9a4863e9d2d84df22ee78f4590a5793f7e238f49cd14a7954201f30215622f2a177b685ed0d675a0772e79c5fb65fd6898b438767dadbd4dbac14d9d022511132d94f5dad1aa8e5de5df5a97669364702cd6cdd28d788c9aaaa8862ec10b08c401febabb7737e722f3024def5b9dd4174b263a28c9b166adce71f95f0abba85970c000e6fab28ff1c36da2f957a4e81bdf303539249bacc3ef664a001a7502229cc5a981734e93d8a674a8d83517018b78795dcd22ccc737ca8347dbb0d5a3031206aa33e5b9e088e201bb3821c8119c09b1ec89017ba487e9cf69b6ffff341e0202575558161ac4a312607e7427f379098ea6621dd9d1c232982444e5432f1c7b031c4e3114f464998f01100690ac26e3c53595268101b52a3e02eeb3de867f899b032ac3c67860274c4a17cc3035994016b62951ac65d5b3d48f58b246c8c7f59643a1f23de8d5921b73d0dbc0501acc64934f6fb05e09152f2479b7eff075d60ae1e135e6ca3cdd98b7fca6396f5a2c2953ef023965d03f0842f07cfa923f1825f52c1329a867685cf803d3c36dea19e0f1956a739531bf1591ab4db89c50aa1d92d8a5520b499639d7a203915535661901c1062b46c225553a62708ce21c6e806dc9259744b8f7767792ff92da7f061fb602d8e257ced816bff78f21d703c312a96cd06d77a011541e1f5fd6eccb8067e68fe816f862e6fab2673a5c6fee0be4c2e6cdea4cc001a357982862076bcf4315327dc450115d259d50920d71ede9611e8591ab8a24514f5a982e3a27bb264b845fc221d2f6be203f12c7eff106341149c0cfbff4672507842b200903148b7b38a0b6af1b458371ad3031fabdb9e967ee9a818d280059b42c6453acde91e0e843b9aa8704ad8b196efc02a99d878569166ead2a1b5c9b44fa32138e3784dfe30857199c41b7f678ceca662da8ac5fe0e22401f12829b42601e2e3c7dd70ed941b8368581bec5bc6b2fe052620a4fc6c02d6e20f3ce9325fd776eb05e0b342873902f0032a9af95cad49f0774a7df066e12c00b607736736a85127765f3dd973d065a085f2acbf85f094f174973886f95bdfdd4c45c02a717681fb41bfd0b98c933a31289c214e4b1ff17873154fefc0caf6df4ba35ad779b49d4c436f83637d89acca2b2a83700dd6ff360a7c694e7b50aff59b705694bf2e799eab71fde73236001ffbb5155dccb6bbab74907b020e6da5b38eb23e472cda57abe9a93d7af950ee4c20d69ee95aef2c84675f63e13c255a4b511bace8ca4dd12ef9f68db126746b57c94bcb4f05c795d2a7fd5a9642b25813ab4d69cada2c4de9a4e150d487f95437aa87b8fcaea8fd6b0f7a02d4023ba78271da828c77e1313779fdf0db3f8e39caf150676a393e1f93eb05ac496eca99d5093406fdf3f0abe3dad8cd7794021406398bad15d5eca4d7f03d5422b0a1c4180071542e20fb99b57d37b372afdd7cc68905e2691c3259984f1ee174f5bbf553b07f0b4a6a1300f3b23d102073c706f021bacfc1eb37702c17b89bdfdfc0df8727dc67989112ce617b77696efd1794da7d8a2fc421985325422c5c1ab26021d5db32e42a913a9c5d3028c3480603007793bed5d469ee3c12a957dc74c39a808887b1994ca3a7840e6d5e4d71233428ea5bf81a510fc42700c0ed8a3c3407adac8516c251c83f8440ed116f765fc53cf8c3161baff66db1506ad6a2cf79f0caf3265f4cd075b324ba28dc553e80bdf68c046d1043d82161ce2b616043dfbf3f045ddac20ecb9deeab44d2a2d0a92daa02505c32c11dd1905048d1240a004023032c79c8b45ad125f18e164182b4d732e2432cac5fbc01982c933cc50141b836930236616cf921b6d6b8cbe562050a7b2d0d56bae811f6eec8ceb3cfbbe74eb189f6b12a1f166806dcf75ce5bdb43544c5cc24d9e54475fe47cd1f7874ac8e55ea9ce78c1ebb12a28e62f1f66b91c9dc9ee04df1b270d1045c838b50f88bd2b48bece68826a3d2e482a69a068ca591b32a9c10ea7c72e4987119f6c3739f4570c178747629aad2736e52a69665bffbdc544412ecc1d31eab0543fd27e6f38a271883a3450838287f4b3dd2494d529840fd2dc6595012ca1e427a5f3c00c543056ca12dd475eeb830daef15cc6d2280bf1105f0559d0c1c63de656e1b0629955890f7fb06182ac7ae89307c1c13e93fd78d627b4c8d0010cc4d9c38478b07fb87834ada442a670b217c6a9442318e56ab9bdb8c6ae083b0cf231f589a159091dbd70232e9d8686d3ca244aac8038149240e", "65", 0, -125438860, "2773aa879e03135823514882b423a7218237c3ebe427a13f7101e94d7da4852a"], - ["030000807082c40302802a5f05c9387694419a8adc4a5af509a40c3bf02c668c8b6e41a29ceef0f451000000000163ffffffffad7e9ebbe6317ea505c45c580fbc382269b0453bc959e4f0c1404481d1790adb000000000665656a6565538fcfdab901adf9c9040000000000e571ba740000000000", "5265ac52516aac63", 1, 979218886, "73a885b3e63fb7e391a3810af747d06002b7989480ea52b8602e7311c8db6672"], - ["030000807082c40301372750da3b37bc8243e8eb2ffb109aad68417fd8f7940e72c2a9db2c8c80b53302000000026aac06340c110444fea30500000000056a5200656a4afe1a05000000000100d96fd7010000000003536a52f7c1b503000000000700ac530052526300000000e51009ee00", "6551655265", 0, 401929485, "d082796f8e749599bdb04ba657cd04226d69a81577b51e75d7c5034f9b0b41a1"], - ["db8586520336f6687f5ae51f379947e594eb6b8c111c189dbd13a6ee3211491e7983181d0d02000000096352525163ac636a001baa18c62f2f9df0adbec66db21b7e1130bcb43ec96f2ac8e9ce9a18b869f8d2b9d8091d00000000030065515d141fd1da74ca8ae64afa7bc1b8564f45d55d0a6f7cb9dd47ead3f3bb4cd6b6819f03ce01000000095300ac00516a636a51c2fe82e802be0b400500000000096a656500006a006a63a979ac0100000000026a63898a8801020000000000000000856d81020000000075c0cb95e9ae1208fd1d91726a2a6a81fc61df32c6febef9d7c11f4ea7b248a759c3e9ebbb62d2ea93572d49f4484dc8f0cf3844d4db1d7b21637cfb0da7c43e5c7b30f2ce4fa9a48c6bb66bb20783a0f17579f60a22f885705f0db85109b3470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072d8871aa96655c503ba368e506f7c54da040482a964cbe31a93b6e3f4287398bdee3b6c484e5755c246043c8eb8315a5507b33164b540ab4279eb910b61b9caaa97f3e6585a90dbcb8acf06f96e2f491eefb7f0435b12683c01efa06ab8afaa9fed4defb73812398c90e0b318616957c530740f309d9c4305283aafb145b95a022a0b79a47697e5abe7b1e6bcebc9d0d3fc59d63dfc90c40d0c7d4532cdcfb9a802304c8bfb22bc7a12939d018e9c026cd0bbc89f03bbcc38b60c24bff6b95ef3bc0b01a5ce5af8472eafd6eff3bdf2c2f44fb5df144b6f95cf0e1219576e2adaa2e9b528cdde8d19daba5bf1ca539385575e45369f4c4909b1998a425a0ed554e8d7020d26f437e708aa1293c81498ae99ead121c60b38632780d03d974824c790a25e0215f13001327f1de3435c7f62d24e84aaabb55c919533f351b6583b2ba6ece27a03107aef48925e518207eb96920737c4ad06ae9c4c03be75828ba5d023c48436df02181d6cd2a98ffd11a6ba4c1fd40dfc8a3fd45eca4c3dd77685f642ab83284c20030e540f14035c372a6b49fbbddff1e80f3aa989f39d1567d4fe94391dbb6d4ef37eb7a09b67eb012c3a985973f084e42bc83c28f7008d0dbe7f6604612d9390d4ebf074e0968a9e3717e612a0d2ffa6a1168629a5613bf46238d8ca5e57329c9e6abc4979a76613161147e97f3360d9acc5c3df339d54a76369a5867d13868bbb7a96df151ddd42be53582990830e8ac29befeed33eba0a52693a70e8fb42442428c7ae8b814124abe14d94656a25782a014047bf430e7748bd300efe2f8b9aa0b60db37c14152dfd2c80593363ca6c86229a0332c656eb69d1dee2bafbf3e796ca5047369264369455744380f4e463d26f6611be5d05b96b4325a94161153bf9eeade93218869a03d6c4dc6d8bffc75637ae9d13cea89d550cffbf5460ecbf041e81f17d5ae18ea332fdb74fac12a41a978a0d7f03a01c2f163f34924d433aae7816ca0c659726efe9ed62b8e7be8b56ef2e3894313602ed24b4e38ab61365f5b3cf53ea8ec436deae40f7aa78b1466407311f08ae86e5ff0aab271f4107945cc09babb0723cae7ffa4385ff70e0ded567442bccffa80cac6a84fdbb99f3fa434126a964a7247b1ae26274e5fe030553fc8ec748fea853d19afdb63562a334fd3c3981c428c10e25fcca8c7e86b6fc00cb81c24c03469ee9bc1197b1bc9d7d558e655a14f9ac1335af880e7b70ed7e2ab26a99942268c6f665f34f24b757bb141b689a07c3dcf17c61c6acc10fac6a611e823b9b3d3c3d338f9bacfb372fbd67fb4076b3ba8ae087a087517f25b5e71698275cece1ee585dfca7d00512d3c4733661a96edd735549ad995c8e4f4beb7dd49b711e2828f0922084752c7fed8fc8f6f2efbe3b1f919f5bcfb174c887c0e345e57611bb3d13634c579f0006ee61c5c99bc4994f6c4310dc87a356c021e30298fdacf4cbf8e7d26544cdb1945d75ba7f80c824ef9fced05feca91a91522b1b68ad371c7b62db67fa6b287efb3a7db1aac7bff8f002aec5482810c317c622d24b29fa3bfd54dce1637f227f0cf2eb3be1537b8e406c679bc1c28e58c5bac3814b99049adeff0e6814edb4e3eccff3328e5078a9ba41c69e5ab7aa057812bf1f631d9ea7ca6ecdb62b7ab354c62b36890286c2744ad77a1c9b5013ad901e4ddffd9472b0c59878e65821432d70e1c79b9a4932c40992d208e0f36615c6dc1a29c3b53e6e1cc48737c8ecae4b8b39d0864605cb3d1b2b57eec71d6f45655e97226a650fda956ee8d03bdf756a573edbc31cbea0a4cca7bf0882d12443630d817ba71f53b34b8299805d5c7f1977e3e77a73f41597d596c235627dcce75bd3ea720df0cd879e6623bb8085f27c8af2324801cf82b16254110a3124c2b9d25e60121a6854a30480beffe1fe9ef4965908cdb907bd33bb967c7dcf219fa7d5eda5942cb3170f92afdee0b2a299ced0f89217f9b13db6507d87843da7654e3265972656ed018ce77dfe08f96a3868251a96d900c079dde6e12f74ffe5aa42efeaf9342bac2626e8027d7e5b30a34ffef0b01ed9ceefa15f9098b68a24ae9adbe660ed36da5d2931edd71883d499067d028ed53dc860db748fbd3d92da9a089c4441a290390d263cbe9bfb14a9f52e5e4b9cc5dbfafecac36af1b19dd293d0369ca4f8447a11648b13b602b7ecf8422e87de096868b2c1b4f92cb23f61203e3572ccb9f609ef8a20ae4a5c31511943e66dbe56a39019cc9875d0fd5274e6b730366596512e07101f05000000000000000000000000d780b71fcd65a9108a4f43ca5641f505459668eb07ae57cfdd7a6d6177f38771a21ddd32e9e9aed7dc0a8f2a53d4421fd174a7038eb44a6d6fb53907e26168d1c1a2f36ef66a16a9ad975815f78e8b7edc5b21aad53c318865b7fa28b537032600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e7819e55fc0dad3eabb92f98e038eae65599a5b543cfc5aeff90b97e8f6309ee185129c11f4bd5f5524b6cc29d208e9cf970d901f0d9783a01211a35898c2cc97c45df943fc299ddcdec0c39e54b08301f7b331b34a46d28bad3b431e48296406dd81c1cf89eb21bbc5b7e50cf2aa3a90682e1eef05c68bfb6bd5dbe3eda6b880313282ce6799218f169945c75cf8f338a6561ad91d0f15d6d94fa0b1333dda25903271c60dd512b5f46687e208a9038be4fb0af9bacdd3b83b74a6f4b6192b5612b0a01ef9b2ea7bafc8e3ef87d67f1c64cd53c0d96aa62cb47bb89ac6d4d8302d814ca217aa206a54165d784e0df4cb2d9a01edde446db6a2775e5b69b8d36ceca3a031663027f9a8f5d377b498145a8245cd3d12b5a2ff86ed9e0dc7eefd39a1c3dd9021225fb04901b201420f6443b279e00a048bed5e6594ec1efb9eef1f7931126e30203c43fc2a931484bc59704e307cd05847ffd546eb59cdd91b9f965af33790a80022e44bb9b3ad13881ef1f609db1e3440949a4971dd0978b67bc7d5f076a0bcc90020dd68080ed08364d7a2be8aa25a32e721ee4d91d8c811ff6d9108b2e40ae8f3409cac2e1358ddaec031a3c6ac6ce6eeff5af377b9973003c360f491b6682df6565b1b3ae75a0df150df68bbc0d224263de9f1f85d86c10d143f442af15dc0cc8491cc065bee299161b552abb776b54eef8dbae41b7f70bab4ecd2a2653db854c5ebc9223e483a78d80c7f2c6f6f3fb17e42f8eb39c5deee154a048882be4361f5d4a795a5d67830541a61fc71474512bd40ed16a2e7f8428f8d81ce65df8663f0e6aa3cb93ac0a6bdcd051a715bf513d4d5681c652eb2e8e621c8fc70d92be8045f03e27e25f25c059e2267446f80a6e65e4f61a4d574e16ab540055865d3c6d52f9006464fc847f3409731b653da8655b5a286043ff780f3e900f0c2b3cce5da9fd818ae7112e280b39c7563f52941135b37e1255a397bd84f5915ee6437301a89b05d7cc0eba29ec97555d471ee83a8b438b75831431915ec400f5d1401005d9c0cd662461a42da74c3884b02bdcfea04c0d4ff7457330261f9569b15b3ff3a5ba5911fc4aa2fad1bbe644b5180f28cd68a36dfcb8507994fde19c58f49c2525dd508ac064169b6a0c825b4de5f4d5be30ab2c368921e4950bdf79d661f28dbac3cbf89118efe33a4becd65b357e6bdd4ea7992edbe9275b3646a83bf80d1ced2d0089075a00c613fe7037825b7f661cdc0e0a78279e1d7dc0e63ce836cb99b6740dc9370f21f9e0f8ad70e10cdd60f82af72d696beffceed126f40e753ae27117c4a68ac5a1bcd7a9a05fcb61f0e2e6db52f3831cccac0ea3cc251b8e2217469615e91caee06451b7364b89e6869139c572178647e057c7c9195b0963123a3c79ff5010570ff69fe89a8925a28b3caa8beb22e961377d6df0266b4e7a6b0fde93bdeb8b9a422f9f6290863cef0ad937710378d62e0a13af37a01bffa46d5a5a2bd5423e9a96521148a62a19b512ab579a216db82cb8ad32839d1a609a600d25c05231b8fcaabd52e6b318b88ad327633b983789aa01d93145515ee433c5d1fe2925970b1eb212cc2abc6a926ad1e5b56390cefb779c31e6dbc6a9171a7ba60e0b25679061b1c316c44cea0af8a3bdfc79a4167f24eb1eac4c5dee4ece4883f54b19a33d44bc418120711ffb2413eee6db03b1aa746cb939e06284fe91d6f3deb5684e2680fa1a77d81d1d959ad3e123b6c62ac5c45d6fb3de4ea79634cc648301a08f3085144ab8c0d99679310bfb8b246216838578f268a03f68702af592a34071bea971bcbbb99354f9851738c04dd0801b790baeed7a8499ddb12bd49f2d3a207a82cd9e2dfee196d8798a69af3fa21ab681922eb4b63d4b1c126c38d892f9146cad4c8c5f5a741fddfca4a39b1acfba766f11b391fe29a09672ebabc201c20f913e507737fe4a7629e3f1fb350cf4f966efd2250fc509d4d53d5321756f6f25b42e4a4d618ae8d900d2fc8833e3ed47250db7de31f7cf99c4c74d9c52ab066c5b94b04604dc1143319ee54ed35e9457fffc4e45ae9b510ee6cc9491581156b23336ca7c02ee1fc53831f7dd24097228f5d0f4bad64ba3b5f39a5b3ddcb6c818fe232d776839010a40ea41446a95ede69ccd90c86ee6a8a22620b671c14ce0eedba7cf44f0429586720e585a4573df2c17e13835e1f8c507df8fd8831ab1696d9bdc0ec7d2f0ba5cae9b0164ba14523fea223ecf3a3ffc81ae747dc98e0f2923db096484f70483fbc082a4d3740acd8b4ae200f515b13269d05b1be5f147330bba6a4b4383ed47d19590dc6db2ea4c83ea42c83c966527bb9a320de00d4b3d8c514dc6e53c8f621c09376d6c4ac03b539ae180087b2c272eebbaa00d316ac4a238dd1d65e2582097d59e81f426890e", "63655251", 2, 799619452, "f1c86d62c087d52db3c3bbff1f6a94557a13023ca5dbf9ba743641fcfb31ac55"], - ["b63e174a01026a756603f40d34dbb3f529fc948b74272e30e4c1e06016a41468a51a691fad02000000036a6a657bd4ef9702b7716e05000000000552535165acfac11302000000000863515251516363651bed323f0100000000000000008aa2610400000000519a91eaae2b272fbae1bbaa1d33f4bedc78956e1f3480baae696aeb5ad0976a32634d8a388c0556c57992c86ccc8f0fd0f8ac17a839f7b55bbe0e8d490826ee21282147671c6dc488fabff1313b712abdf98953b3df05b717891f7f2d4ae2ce00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000694307bee57944627038c692c8e959d4903efaf6b3c3219e31601a8e8af2ea14e5596d3d3d51c49a460f2f1020a03c9fc75f8188b2f01cfe7a9560cdf580cc7764c50427ac910343c2ab7f95bc78cbb15bcc53b5bd5382d5014c7ab0fc139031a3e6317f41dc09addad7c63680674af0d20905d0fcdca55e4c3bebef21c462ec021aa2c655c3f4770c77d4506ab52bbbccaacc240bd02f4d5fb6c2d8ff8bf985120304681fe717e85d8e9ad755e7c88a486796a16ea63adbb2af1f24f85fb96165140a049c6659e7bbfe888f1d11ba4f8ed891af0f265217fdcd382352ddaf5208c172fb343b1b0cbf5f667fa5a6a1c33963025559ed592d27b93176821e7afb24d59f0212bbc50d54adfa28e55ce3757b90e5a8b52bda8cc9a7c5583744a57c905b55d5022807a49494afe0cb5df2f08fbfa375e37b799a6c98b3927e260e2d7f3f1fbb1802121464df25d9c5bce44b69f4d578843a1f27cc8c341c13c34dc9751aa56ada090212fa6a81f6ebf912928560ceffa7bdff52a8383251a1855db676591e65475e010214c6325a7d6a5ab2c7ba44beb1a328aae668e8cf639c071ebd300f97a9e5cfc8156cfa9eacc8e7d68fb2dd5ec1a00d8bf7ff296cadb5dffcdc544f239c95a7f089fe1b2596171db924319e8852221013542f14809af112795f90fd8e525353f81314560cb9ff8e154f2990c8c3b2f9fe62fb5b7ae8336df57103fff41918dd42578f2e8702d431b49818d38c3b35860acb3523363f66133ec368ca253442c4eb1a5cb957226b4045d1b3000142b63c13318cf27046b0b53f65036cb5fdddf3e2b107f6c00238304bc8688863c59ada0fc5083fb2ec8d18232a3d134655c8af604092fca84cf22907d986113f340c89a04f81141e1aad56165d50ba6b73ddfa755adff42a35ffbb6e39a07f45afe8726ea135dc412b5897458700591bec16d5634a4758493966fafbc80d079678ea0c9a4f575502011a72891cfc7a2875f881a13aff856a5a6a22ea22afa95878539a222dd0a30529834b85cd2da9fa5f62f1d169069b30b691ca0b18ff721e1cf11683e0c4ed4aee3dbd57a3209c90e2c1e3216ba4f5dcb6547f9b66943a17a98b642c26148aa09d6b6bd35d2802036fefe292b03015514231b19af3d81347eb522ceb1b25b1246e1c22b96bd70ac23d08a3aabea5f7322fc25ec974164b8eaa68eb45f66a4dacc4ff3ef2cb2bb9bdd994c319e841fe94dac796e6617fb5ad70ef0985686614604193270457170061250247e74f01113a8802aeac0f0de269e5a411be4543e20940c045d2403a545b6b2a3794c54616434f08385447a12c4fdc2b43f1abcab4b2d0c8e99576e9d8c3cbf547193d56735fa93e1de435e1dddec0730542dcf749b24d19b9b4dcaf2db0902f4cc7ca18614a50bd47f35f06d70eaa88a7e6ebb7baddf44dfcc771b37754b491c6cf3c092e74b953b9fd0231280bbe7b84d67d8be5c047de89f3df459b2348b580247a7c6e149ca5c22393318e5273acff1de14306f9b51b777cc6811b1529e2f83295abfd8131ce070de3bc5f6066ddae4ffd3b3020753e30d92dd0f5087835cca03c9d92e6751646586f0359a9009de1ce96760ba6983eb81363f0e6513231db163710a10abd052b5337e42583f68209b4754df79c263c073725d3af66627683670313d5ca8e6d32d7629027d054a4b232c1268aa0bc0262347b17dc2b481eb5a9c9715705ad6e30c640e9d7f846f03f79cab3d2280a2d98d2ec661e12b2b44aa8a238c338f20781a6035d6e396f8527175b46616b94d46e54cc8492d07db02dc9684130cc26ef1d433919f6416ab2552d5a5b8ea0fb443a647440495f980722f41c4fdfdd9b4895c99cd784afa7082bb20594000d25ae9dbf17877a75e2f32a2552abf3216a38660cf239d1b71fdcd31280600f635087b4e323608766dd12e412492d34b19422b058a49cc3e69894d13a88893c0bf9a19f359d2c6db92a1f57bb3e62e6509bde0ca08e6a8440cccfbdd0d0b69f552e3f1eb61d86de5935f88504ffd4b16045f23d3124a0db2b290c933bb0b1d880ad887b40efc65109b5f7b5d4a8a1be792db7307f32d864a043032bc535e2d8aaf80ea9e3ba1d4a4c55210f7730ed510dcbac3f7611db4b3c1c3c62526d20343e2ffbc06487b5e23f228fdc07d9b9bef0c6e1e7319cc26ed06b02aa256473aa1e34add70499e67b7abe3a443225911672914d481e686f53536f81e31f1b7b73e9c07d101943411c3a772740adc0d2c4743987314c5ce4ab7bb8aad0f17917c57d67927cbfa4a6a3a47f5c28283083999df628367914312186829c4f280e302e14f3d6d84a0babfc5d0348a9a5b99c0f5a5e0b8058cf89118af740a45f62c4be09c443b6215b54a53040d9ac48f781f6653ba1c2e39614d02017cf1249f505", "51536551", 0, 84109073, "f097daa172234c1bf2a950d3e6b25668c3dc4a391251260ce8c41d778e604776"], - ["030000807082c403033a2eba33d7077a7b33fb276f4721c911e79bbb24b063a23975498335358776a603000000065100525153635c6abd5a2d393eab736db05cefc8063d03e788ae732c7da0a0c11ddb7a6a912d455ddf720300000000ffffffff06930a8acd5c21ce80ab2b6825d850dd5f3a44e38daa5f74459c5464809a52380200000007536a6300ac5100ffffffff0365849b020000000006526a53526a65cfd16004000000000253ac5446dc0300000000076551ac51ac636585861448610eaf6702c5ef63000000000000000000000000001140ded5a96a37d0f7256127ff4c95536395047b269a8bc5e1bd9d232b17ccef3ddc7806e3ba455efc846771e91c6990c005727f363f4184d3d50e8050da06d61fd42a3b2f5ce4d2cbd72cca096c3dc2a06d059e1dd8dc962392d3e34905d98800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cb0972207f745bbf7933b18898316f41be6897152c6621574769cbbbd63b0cd4f7d1b51b3c0da29b2c1d28cf217595e87f535050dccfbcd6ea1fa0acaaecfe2fe450188cac11730c3e05c8a7f14be917a1dca26ee6e7f87bc43cccd952338e648c8104f88f80edb0149f21d70a2f7c358700dd034e616397b43740bd727119f002263c68c15cdeea527a063355a5ae423758ff0f8f4e96abe69354a509154c14d602039c0db2a2da2e581cf397d19acbeb59248a2e8274e529d12cc77eafbcf973310b05ab28aa8fa83a3d7dce8095ad8eaadfd0cb886bb07917f1faf47197a26e973725da3a3758fb7c20807073b67a2458bb3058f5982f76f93bb7e1f8ca3d6b7383022d4842c559e33f1b0786385d5a7d7c1c4b657d519997514e3d3153a7fce64f01030e008b9fe3e0d81995f18f95eb328aeb46441d70f87dc1aebe0b2a9cca6168d9031f6e886bf195d0a9faca0ebee486ba90bdcc2f4f444941a962cac6adaea58e480311ff3e73814b29b9f8d0952d2034c36093010ccfb7fd9804901324e8c01645770209ac757cfaecccb8f3d22b95dc0bb9d1a3d46b14b4469bd29988d43cbc21081beee268ecdef33615419f77761d3bb67dc99636747ca10f49e4fa6f6050a94033a8c68fd85e269b3bf4c15af9f47c49e38aefdc9a548f95a76659a2261f150981025b1b6a01e9a9c42154d683ef782abe2f8fde985dcc604b8fdbbba61ec0a62061a3937860fed6aeb748efd1aee4d8a040c45ce7aed462d61bfa506af5006cbbfdd89469aa5e0293c7853ec7899d6bd2cdcd598891d0294e7cc23811690a84f40cf3a08f2fd0842754eb3814f422ce28274b88f8f518e3811556329782e281dccd2bc0de1b7b169c82e33e8e8f4decd955a82263f3e5a76dadeda452eb2cf72ae7a6d76686ecea04bd5185948e0efd10af4a73236ecfd04e1ffe19229038ae60609734968bd3b99f34f8bb2b25835cdc7fadd291b3b30692a740212315e7d79493c568abd974b49f6e511a0d8e914805cc18a3a4663c167c3effa034a0e39afb0eab081c8061a071e4acb176280b263aca9149b8aa3ac4d25a3ed215de90739b266207965838251958453521e8a2b7293756f2c4d026e4819a84e3be32b6a1615e97811be667a868c1f36134bc18d9a5ab695bdf04dd435fbae7a38a38b93c5e4fba38576b9ee14e6bfaad2cd2aba475ab77f785a4b3ab016591196b3ae91e416580469a3410a6bdfcf324b143157459b15f3d8631dd97753bf85c6b1093b437324a54c9c3ffc0548c40f0efaf2713501cf6a6ad25eda724775cb2fab3a8a36a132ffead8b4e217968b1c9999b72dcce3933433190a1b673c08c374c0c97dccfe7b9c1de1f4a52d4812a1e9d92e33262a7622d54cc7984a25f89e956f2d6af080d400562aff0081dad1e2956c3fa065f43935efa9959acfc736ef8a127e0ae05c0e1c4a08cca272e61d7c49506c8a1d59ba7df47574cd4fa5c4a4957025b9e6235f76a3cb3721c561ad0365ae6bbf53a221eac4834e217b78d4c0d7ebc8b73a1e38ec350537c04c421fe88eedc6ce8a9d91b0397375374c1dfb428caa3815bf5cb6e4f4ae4bd4748481b6aefcd1f1ff938514d8a7fd57f949ad3121d39fd0e9810e741a0ce5648a66fbcedec808ef1af4c56ed7bd7d332155ae6e7efdf859c3cc3888e5dfe59c251960f4f7dbb2d384df4e44bc7facf659b29dc501829a7f0c757d1161ddc1c6a6545d460256227dfe265b41e03f19cd858a72abdd45e84b8d3fd2b8c7f8d7efaa8a6fb54542d14108c04295b51f02eeb2103495bd9c581069323a8ffb2cc30056571378cb24db1bf975224a967013a3f5748cd75a6086c1d97467ee5089f6f8c7b5a6987890205622563ab7eefbab87638d46d331c6a16a137d3c61722405f95e430b86602c830ce88cac58ae38e9226f4e50b3336d64e1a2fde7f15f4d6e9bbf5f75a893075349f0d3dfaa6f7b720f6c5cc436f2ef43c3de79f41ad466242c6e068905f01e57805f817144688ff5df8517ad21ea3b8c6633ae5a30130853dff0bb2dcc084da4c29a3d8d7949139dac3ebf3a1b97390371e7f682e351607df334ab69010d942ad0449b9e1c92d18d91b18cf3f3966e39e267db7937652265a4a3c8a0937f70ea589b72fba1b8d802c7d633862784bad3941011c779e3663127a38c727a6eea3c74fad8406ba355f7c18556ba548fbd6f744004430174f29441366a02bacdf6f040815939e982e3049e882c5edfc868629176279c4979d2bfef6a0011c7dc240fa39411f0b0000000000000000b876ac03000000006cf39c949c23136df056132e3bd3c20358779739c9bcb353c0de797b474bf0a6bebbc66426aa723af2657b1bb55d436fb327f992bddc77add4a53f3313c9c1d9ec87f9b4bb351b613b45e65d0098597ce3ec5da6ecb65ea79902dbafbb12375c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b6f0adbcc35e8c26a853ba8618d4f8090c1dac0addd44fc3fef5871b94e3fb71e11c392687281be1f16ae6148a36b4352568ed989cd2f3e73c962a418e0d1d40e6c542963ba07c4ade0d4ee72a42a4613e7d098d659aa3b6634ceba79b7da44da356bdeaff17c8413dfe51080128320e9372db0c9a667ab6a13453540a628d5f021e16826ea1fe68d7426770d86ef7075c6b5bfbb026c70891b41e43e33f2fe888030f92d2751750d6f49d7551c08f268948619905ee60ee27da9ad7e6b41187defa0b064001ff342261529c967cff1a2c2b17c18b56b2589147d6fce4180f1181536bb0913bacc6af7b42e8688d9947a9ed8a76ca6eed5bb98e2fab8a7af14a44b5a3031c719db1ae033f41b6d481132cb9d6a1f228f90b5ecc2af9c1e40fed449ba35603264bd9dfeb835f9b3bfee562a5881cd5dc6efe47232a076f6292eba1ae31e177032245fd978931fa75c3646c02ce013a1066229c708b550714190a531ef0b8bc030325fcff66d2f826317d4130c1d12f25bf6a967a73342928e660ebcfd5b51092d3030d9f4ec518eabcafb843a1ceac0742510816f9fbea33ae5ebb4f77d99411b6e703f59cddab1ede8b9dd34c90b6565cb8f8c8defdd80751a57f2c9cbc4373d13a39d79f865b221678e115ad7897f6a8de6b38d399e785bd42475a4a69958cedb824b3f7390555ab93a6708e74ef017aa010216121c2c2bc55222941c20d79460dc1c939cee843b4ae8fd4170688cf5a3ad13d5ef7ee8bd43add87e969d81191905f8a79396ee49bf360826620469e74adcfd1e45531c62a1b1f53b14400833f574232e70cf4f53c6f28a69be7be4712964cf32b789fa7d4968d231f697a8cdd60df578141d297bf2d292e7e44a7db6e3685ce1d436e9ea7269167a85423e36f64bac061aed8c18f08d0f103acce7e702fc75b4926a065bfefa2c50ed69761122d5dcb4c74cec68cf60f5d20b87846794c17d114b2a0eaa48aeee2724d38a52c0d9d960191d40e0e9d4cd8919db26bf8feae7c20fd31422b82d0b38ba2de216eff1887b4ffbbc54cc9f73bc0948ec37353b7a4e17ca9daa31d93237baf1b0b45d5ec56a3160db2414d3f4cea51a966d5cdb8c09a20481138988d6276837dc721677ad5dd0b4352cb5e9ed4a88c693759b497a4ef836a4ace4b712a7e6d2445734e1e0094ac16fee43133b8b54abaafae0f793fb86023e47ef49c28df9ed7d355de8c19e1181382a85444c59b32d4cc3f9ecad175d77dede111c4a6ed082f3fe161a55c064c6b102b0a38ee6b3653e1060c542c8f21fb2d79e88498a5c7c9fd3859d4b9e388ae6cad57484abbe24680992f27f3ea4285e0cf88fc0441d05435a46f25b6fdc3c94ca971db7938e7af2fc9146c4177912660535bcbdff52a2e0e853e121bd5860c331b8de79f1865f62850c9327ba0ae4c8c15bbb16a5efc28b0fdb7c7245a331576f12d5be99b5a6a7acc44ab75ddbfc2005582ae07bf3cdd532669aa81794d9218d807b269eb29392e7bcd133937d569978717342f2e03af8e4b63f59a1d05ab9ec0ffd07a2562366ba09f1d922d8bbd08d306729f81ba25a16be509e77d42935a35bf50388a4ae0c02ef88cdba35839b52d35b5d93878e3de357fcba736a6d354f019e1134c65299eca3af778c1c02a313a71321dd868c8ef60597a14752aa4f05a8600e53f30e1a45c2292c613111d76d054847e65120439c8bd61b96f5c13dd43c71cafc61b113d067666845ada06e595eae0807834e96b3e4fa85239162c3801cd70892d54fc63e4a5d8120c8bf5fb7ac26d4d116d6b7c5c7fc7df00399cc2d34af068a4c2e60e84092f4d5ab19f49134efe3f41bddb4ed9d0a08cacc135889144547b8c010dc0eae644275183d33ebfc3873d7a87c7838b493b7988ea7d7d2a259234cd5a116ed90f662123f28348a1bb620c198ecb9bd3260521696eab254b3e3951e5a37e424907023ffeff7f220a0f2e0ff049c774cbcc3ed643a4ac965e3d6ed04990c8796b57e8e1469182f3b370e8d1420d56e03dddef86473ffa11af193e3602e29b78842f24bea02ae7934b163db078eb93ea7865d61c12571f4a229e4544fdd9c489f7e0abce90f7ca59f365fb57f60945a9fe50b866cea82b59e991846af599bfc57aecad4c7b407c9e9f806a96cd07ac0badb2726bade290c953b0be975cadebae0fd97e039842a33468dbecb659a77b65e90454616ff471e6fab8cc3fd7ae0c888266353e6086d79182da7b94fd72f4460d4baa263ba493580a2945dd2f263e0e68ae64ded9a2abfc11f0fc30b08f977afb06f5b68c315997f0a070db23bc22da3bf92d113d204fede92f3de97f9291d197357a8cf8ae121a16b938978708024beb6d5647d84f517d19a12fb2b3e7846dae7297476f010e65257eb23b065520df5cf0d100", "655153656a5165", 2, 1044365995, "1e26790db38fb0e5608e17bebca509dd14b98a29f055ed98a74fcb98ec26bdb6"], - ["8862213301d99b84024f8d8e945885825507aa0b5a73d459c8730d7db4ae9c275cb0f9a6fb0300000007516a6352005300ffffffff047616fc0000000000065152ac630065cfd25f040000000002ac6a7adfd501000000000352ac51dbfe110500000000020000000000000200000000000000002182040500000000862d003b43d824567786a01798172d8b236da9b18156fb130e400e19fdb69f9902917874c3a2bc531b602624d230412e479f0b2de0b6555b62645bca8de7eb44ff8a85f0d07d94f27f9014ea5f30b34763eabdb911a4044d19df88c80c27421e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab2f6cc533366d0bdbb77d29087f5e069141b9a52ca102a014a31b554ec731e10f894f2957b58a92cf715756a2dfff2bf63d9b58f03c623490505ba380af25c4f94b68e5645f5257f6c08b49e8516fc6766a231fa31a0a426281909d669ceb7511d585105d6320e145ca62baf888b0b1f6db83b44617f58298cade4ec31757100215b387948675aba31898c86f3cc5179860e1b0e73d989f177d7338fbc00c2e2603112044a88015299e791a1a249ba57c16ad3ee7a83cccd2bb9ada518810f2294b0b020a80653b493c6cbacdc2644376c222be8619e104d118a433b8505abf722901311586f5288ff67c8d28dd496011b2ebfa6dee2e242af5e0bb5fb76aec3e1d3b0328321d4416fecb7b5feb5d98f7ecdee8412965674afb5164ac1cb2f28becda360203db430e9e7de62dd4ece204bc124f08e5cbdb2eab5eaae53fc0ec6bc46de05703277d4d8b0ab0832de94669fae1909a83133b0a4a1c5936e71660aefaf488dd1c0323f98f16ebd4dc855b613f71d5ed04abb6aeb5d98454bd33b52052a95fdb71cf032771adeaca979a162c20215a255bceadb7dd6d68fdf41b7d96035b0b24ba8373aad75a588de22e55b0531f09e642bb9f646b5889e6e49881198649d4b4264aef6294a52c538e956056ae6c1821fe550175f05943549a616b91278827f33814c716b8f1bf8c21816f6f4f58dce0657abf56c6f9c94c2bd125c3c9fa03ecea3a2281d2334b8a5530eecd0edd83435747fadff289afa53746c5d0d097abf37f449cc7e3f3a5e90d0aa0d4b3b50b46f3b5d09c577eb91b90c4cf39a41507d777571cec758387bd635c8315f5cf17c24831bd53742e32c30ebef7d7c4c21630b9c4a38950e04ecc8201ecb4f8b6404ae93e6195ab36360cfaca861ffe58ac21678fd772d61822c705e3808bf5c86cbe4fa0b29bcfc7bee6b81e19dea810f362e6ab3f94f4508fa8353fffa9d58110cc31762c247d598e28ea1d2f4942da2f5af282216b941051e1b3f5af7c75b44da48e564343fbbe7823a077d976b510a44270d46775ad43be90092f9f5cf92c9b57a96b1c0a5153e53c72c4466e6615d2c425aa34edf8105b9d7bfb96a0830273ec72a13c7a95bb48e0cc310425bc95d3f74dc1ea7d990d70d1d62d350c45fd315eaba8feb28f7e77157de2b4c6c54a404111c7cc351ff5fd3c73b15da70aa492e7aed8ac4d12e10ee335d7534b44bb2da32eaf76c0bd1033bcbaad910cff976c08af1e8b1ec66c242124184acb2b971a0ac3556bc6f755ccf0670199eb9445eb428bae8da76933daa1614de072327a45bad9458a62dfdb5d851128190515e3c43d5b265f48ca8bc7a8a71cd31dfd4c412968959ac2ebfb40e3b5b65c7827da302bbc1aef9d4445ac214a0323ed6a0dba97b5d7909b8177b2527dcfa4b96830b5ecdcc7c7b8ca0a54e63c8357db61798fa46495f09f65dc0cf4af8d7f236d38815d09f14086c770e9e6b46194b630198571c8896788448bcf4ee845e588aafe6f9874906ba3e6ed4d5512b63a10e35e3dad30b3b06921e94812570b83056516713f8d850da7e659fd89456cf953649ef90052d6a201b7ddd801aa1a61ecba90b9007621609fb3971434b431a2c7e15594b4da2f2bedc10c534fd8a41b8dda5eb1b67df9bb0e911f911bb0581afed871770b3e5d3f0a532bd14d08b1de2a033575ab88e8c34ec6bfdebdb71ba258b320464925f442091faa862e5518efd23594d8c489759bd4c700e6db08d27373d4d212a9e4bdfc3a8b4dfdd63c70465ca2f273220cdc47840df952790990fa50ed7d5880a40c1fb54e996772f837adcead413c69271a70d75f42b2b712a0f6c32d911a95742bb8d0e9995182a3d246b0443d6de70a4357b9860a633d2b9fb8601e71208fa3969f9849fa80d80fe1e64b2a0f92f0ed1edf27df699c4fa9423d08feef1cf002c22e34ab076943c0e81c41a40107313900d9771b07e1934dfb9a5d9b0b33647fd3e727ee9c7010596718cdb6bbb59230e6785625ead65c2d63f64ea370ed22643119d74e22530d8f8e23721290504266072c0fb7744dcd08b1337bcbe0f993f4c280837405ed9870f3e6e0f39b7555426abe00de1c563b34cfbb0ca48b05f7f9465fbe6f4109048473d88a395fa1eb37bb74efa9b81ea1cd391be64d01eac640c60969f7b47dd80e2c2fba204b6cb5ec1f91202eeecce181859fceb7a1c7cb01c0db7bfd2bf3a9c574dd2becd8bc21205ac1b4062410529049da6f0f1a43466ad45ceff3856e03416a198b4893e212464647c5cf00000000000000000b53bd03000000004584c33ed5506d096b2ec820830eec1e7edf99e23e3fad28d8b50f58a002ca267fddefb19c4680f5d036d6ba81279663f883ede0d713fd63d0fc9286ad4ce906d3baad801158296484753a32ad7c9124de7b3203447c8f219667b0590643f1c100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000610278c3928ce67906a161932f9ce7b68b4b171b130491b2c59a76c0515203c3d5b483b6dc832f62e852d3f8750384fae02191473aa78f3142b824d23e23e2e95b2364fbbf863489ac66979de0bf731edaa7324017f71036951b40adb054b5620d8471c06111849470222427937f685c12af86ab3485e3732f65afc1fa1208b5020b9e16e6f2dd0a75dd53d8e24cc14d490480ca2bf1d0e4fdc27b5d9a0e736d04031f94a0676bfd1e715da20b684126f1b7a9a2c646cc1aceaf31a80454b1f23e440a06d916ecd95a0cb8ff032b2f56d8a592a3ed832f0cacf6e57966b2834f689b1ae5e943842956701e8f1f48f0c94056dfbb213438badbd1e01d9e7a0071cdf6d402183c6470129442a8ce11d2bc977354a08d6d36fddbbc685c4db9eb05cb63922802289a86aa82031ccf9fe61f56f14c3de14f6df931090c13c41ff1cbe61de4432f021afb23ee9b56c0d7254c94552202f1fcb6a39e072e0b7f42ac0b40e3bb19a14b0322936edaab351094034c9e6d37832576e327c5ed9d812e1d2a06d420fa450785031580d54b3128ec90f296b8d376f66b087701b433f785585b9c9627b5df1689398cade67bbac6faacdbcf83e79afabd7a7845e6eec89ad314c5a30690a9ca86daa27c47caf14884bb517e48635ab166730fc8650cf1411f5ef3c82f1627a2bee039974945c5bbfcbed712fc8e1e09985d7b62659cdcf71f71c42c15060a9d15c405d7a63d610f6d54db7a5b1078a44a79ac830b3dd517638c536dea8fc0d64a8abb78d308bccdecd79c663b46d024f0ebf6a9d1c35ad5c87d84715e18fa1693b89d2725362bd10f5fd89860ac901f8d48b9a9d6b2c67b33b641abe1b24388bc31443648ba211b5cb4699d8882cdace3265b17f34597744e635c9fc90428134fb12029cc91bbec059fd7134894e93414af3f5cd0f4c54a05d1aa9552311009761a63d28dcbe6354bc31e61bc8fb03de80fd6b0df5424513baa3216147428efbff78abba1efc10ef1ac9d775647e9d1e1182032a15458cfec25325a5d038359c35ff23338a844072f9ab5bbf05fb278335938e97cd19ae42fe5b34fc3189d7c4fb1a1d05d10c5a749e85a48b465f3653f55ca8775e7b51b7a87d90e310b4487b4560a248616d514d55e8807a873c48bfd88a4616e36a226ceb233577133d98bfc91627be106358fcdcfdc15a989e0621f846940ab2fff28fdb1cfd215d32ff8389bf99acaadb80bb664c6167a43d987ad0e912420c9e0e50f3026cd85d2eb72b2f1a311d7e88cb20411602c66948577341790c4b1bf340d7f491e36a78d2c9bcb38fdd6f60675ea25c006ee8a6850b8adcb252af378d107b84d49a83d47e5d19fc7430e10edc1421807b8243e82aebd4bb8aecd708cd632b5fbd6bd7495fbb018f59ed20bd6c27bacb9617d1a1368264a99f6b85bbced5fd11f99f6a3a279e41ddec5d76eba807c13e39a60d237abbbd284171a6313038ed3649f370a2a3c87642951b6c6895d3516f35208540b187bd26322ef5006cb13e5221fc97c98abac4400c44c13214924c3ee2bfb7718ac93b37fb40f8c2b14e90931a83b193dfa1e446b3b9b00f3e38210a1fa0f01c95b9e65cb26c883793a6a40d95df623aa18e67a13e0b150f7059e7c4496b7e4699f6f5dc2f4f00d67d0219c7bcd7680d76b32049b6b41354572af7ea322168aa0d6d2750a9b9f6592ae56059b487721253dde2ca5381eeff6efd67aab38dd8ce2c99ec988fbd7eb1d4cad531bd301ed9f592ce94cc9aabc08be99061d1e0241a115891801d2496be4f425c5bae9ae8bcce06fc2ab02f958b755c7bb076b7d951aa9ade60d4b54388c57c15f8e6132b814d46211e6ee60f940051ad63443a47880672e9d6c8b65a44a2926e17baf1716626ca49d4f93621982eb4bdcaaffd6bac346d306eeca4e1563d307690c85defe03a28f043896087c1ee66d2d8889676f733d4d340ea27b83653e793e1c6ff2f51ac1d47b2c7a79f686027f4df18f7891d89eaf9e0d9c62d62f00f2578e4dc0975581e7fe854fd4c2358763bd67bd8843fe640cfb208f5f461913f8da0c227a221e7467f77aaa5a2ac94feeb0b947dd734208e74f632ee8e0b5672935356edbf68209c78e02797955b604ddcec84d5abe13fca408929915eb5226fcf12cff280f954be07c446ddc23e24138a0d8d6fa10fab12769fb3e03d0b58a2c49b7a1075cb487a359b4b39caf7cd128b2c0ada54f35a179ccfd424c1ddbb23aa25f94e565457ef3f57b3a81ea69ccfe9f955041c4b4fe95a9c51f8ecb70f084f7b205eaa82b831e6f17edd9779570795762d7f32669e4452ec90418ecc9b1b188d9800693d255346214fd2572e7bbdc98a571d80a7716398ebed9d2feb48c01b2e32db5b33b7c88497258d5f1828d1af65224c2f8f04ac3f3b37008", "51526a53acac52acac", 0, -1751814608, "a0f4fdcaa3487d198eb1e594fb5b8f00d0cd425e4c1092fd3ccf85ff79363ff2"], - ["b247654904692bc6dbc998d355a9a1f1231eea8406e4ad67f3c0eb354f77040f219360dd95000000000551ac5300537741830731a8f054bb005cb56663732c57c6d3605ed9e141cba75d2ffa507102c458ae4b00000000025263ffffffff58259463289032c46e8e6b55c1159de2754b33f6b20a1939b8a8385dec3a14380000000000056892b95008c92d230037df13062d29c77fca00d37ba15cd2630dde30c32181e65f151c03000000026a00f98ac18804ea9376020000000009515151635363ac5253379604040000000008000000006353516abdcccd000000000004525352ac807184050000000004520000510e6446680128c8a503000000000000000000000000c93554bb3fd7d926c57ba3e1de7d32b1b5a7d2b27aa82d6720f678c3cd0ae1303f432545c70072ef0201d904bdbc6ac4b223dec15ac2be9f319631ad2f7647de3058ac7807e651755d95e1c10a320808f84ece9cfd32bf09e984af92097896db00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0a7e07a8646837dfacadc590ef37b2b6dc31e6a176de9eb502553f8aa7317dd758c2833c3ec458d0ebfcc32cd5b17ad6a00951d6d80dfe017c06c7b6ee20825da5f9bb1d461c3c5705f56b3c600170146b467f23ce37ae82f0f0091ce5d520718e51d79fba05a420699e48bd54c6a7896bfb46414a0439002cb95ae7d7c8050020e77930698898df03f3137680d5bc74dc26e2579595fcf9c8d3d3862e3d8d96b03222e54db07eec80190112da3b3899791a0c5f9c212e59a55bb9fefce86b59a580b04b917ea23fff62e10da84d980f3937fbb09cf4a2d020ae22c3171fd600f267dfc0e1947762e3cac7593765e486b3d082afd46dcb6abae891e5a2ff554cef76e0206619a57198a389cbd8d5d74f397f90f86df8acf9480d92efb4d090c7f8bf0c5032bd57ee2777ac2a9d6269f3dad3bccf2f32bab745d50e5776a5d8200f561b3ea0306098f477639cab217b4562ef3e7f7eecb4c2b83ff6dab93388f2eb212053431030aa495504020010b2c1ae22e68bf1b070211a692c0ef7ef2e63a8fa76382ac55022a07d3284d1ca57341c33294424f9d4e9fbb487f56fbb00f47fba8216897e261c3b9261a3aef66e1fed131eb3469f2d3c28175010ad110a058d285d74d532a7df1dcf9bdc4f93990126e6c3b982c574f1fa23935ad0884b47e3730a5a505a2d096c4f9277d26e906703e3ce242d962cb137d90e79fecfb83d596bd11348d6a0e2952026c0522b900c5bbf0b2337c6fc3486cc84c8c75a4ea3624bb187c5ab5a7dc663de39d6b441d0279f0cb8cf2c0e394c3e2737e8be18a85c860210cb49b562d54c15739146a38b4e68b74677f431730eba9cdcccab826e06954438176b2eea28de85a61aea83c0f5acc079e7a04f729e44110fad665ef9fd1c40de25a272ca1a6aee8f51f521daf4617b111870e2ed408d347c651699a666d6b6c84e32235df9d5fba1be848caba0ffeeedc7e8fcc7f9236e5c06c4fde4c5ddb20d437ee3755aab0b0d999960d07a539aea792a78d7b2e00b130e523420ec03eee86ff7116bc711eced54a7150aaebc12f12269974c71242e8d5d124dca82ae6b4698c2c34ea25a28c9655ba9fa651d867ff49b7f6a00c2182e512e4466c8e4664fe9f3c3eee087824ecc33a91310c8cb4f95ed429237f802959d9a0227aa77d45a366e2809982363674a48539e723afad6d0bce3be29d60f7ff24615d655fdb126c883026cc053dd79c328108c4f7dcb48ac210ad02ab9182d0280d9d5fe5278ded309ee51bba8a945c1c285f6fcc971e5fe8db1a132c8a712f00d3ad58f6b0092370c8904eacf32c5ff1a546eae381f744cf3fbfb2187400ecaad133cea52354ac463c5609ac21eec1f223fc01a7abae2f6026724c4c085dcfe29250e642af0ca7dde1095e41a372856c9930ee92705403cd0a37a8494f4af48b83228a3aefcc908d12247ee519353220d422dff7a3dcbabb07ed801c8be7e663b3ed9383962882e41b74ff1340279bdcf4a7d79e901b49e4e03b19b8665f3984c6b05ce2036335cdf13ec643e48438f4a34c9a8f2a8f1b486eeefc241c74234fe1c2c19d3670a56db0ffbe1745224d9e4a80b3432c397fc22fdf16b73afadcd90d817bfded4d044562e1f0d5c483bfb30b8425ed7465aa3c554a5a77709b0fd4c25571e0bf432d2d5d1b67398cc130198f66e90a314b1e8434f1689ef694786c9466a21ed34a80f10f49e11f1b7501199af312ba0f011103d1b48b3ed1832052b34a43aad9a74eec5cd36018e63cba9ad2511e585b009ae64c8b14de652ce823e0e306168af718370e50f909c9b2469be726d0ef59bb5d3fc46de7de54f0ff7d3ee0c9063455d7f29bb11132b567b75d448280ed885d795bf388d6d1dda9ca85dcb1108f3e742b194e5a585541d989e002a15940e9278552350d99bd30def1b62f059ddbdf1260876c295ee2f88dbbe49bf46cc9e87232ec1ce1d6cbc3a6336fc8d281b53b106eaf895180b10e4e20bf9a48f2ab3cecb156bb07f11514c024c32af39456c1c7397c50eda9b41b07057cf48b6fe6576d61c2da0f6699ea3de118200ee46333a0461302734db00df45d664da8560320d0c0f2a05935a273a2f31423a78cd8b6639eb3cf3b039280ed77e72d05a6d74a657647c5ba5db2011197da89ce402bc3167eaa7c0dc71be29117311e592476b961d0b034402e67ce4c432370a69b5b8d2033caaa65c5b502746aefb32ea847d973294ee3b191cb0f9f4efaa44ead66e674e05fd20746b933a02ffc150c69b9d9609c167a121aa2abbc338ba10e4ad9d459bd6ec05f0931960281cdf8a6704e53f6a5f0f0e6596fb7bc2397521348f7c4e95faf3a2be5c07c0a35dd877514edf42474159d2e09e3cc163742f5fafd403bdc14d9c44ddbfa6b4696435b1e9be81a0b99f8349de00f", "6300", 3, 1948661153, "534163043ccb8049e97570cd21aa18037b1ffb4ea160d9ea60e3fd00579bd31b"], - ["030000807082c4030132cf1d17b97fb1185a83d942f07b52f018c100b58493e6067dd713cbb38ec72f02000000045165ac52ffffffff01a494e0040000000003acac650000000000000000010000000000000000d1c62f0200000000a96403e1377eaa112c8a64be86886260f7a8373f346567826f221513fe5fb4f5809312145c69d6d71ba44e582695ab89e54d21fc56575f0d6872b5842e79e12856534bf3db22b42e23c71596bfcbaf97c8924376bc7df33cc9f9866c8cf5bb5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d7537642370ec10375644611d7917682bf7b3735671818af99800c0b9d39fb280b8a9fbaff544378c4f9d67f47eca81565cb17d7cdee2ce73247546d0783c9e67cc45e1f1fff665b6b3b10d5b5b67c3490d35626584bd243a264f10565fae92ee418f6a6f91be97856ede47a412fe6531a8013fc99974cdafe87037c39df788a030e94a4e16f8834a0354e33fc14033ffcd6181e2870176ef016a8d61cb0699302022a82313b68277025ae86a3cd758e8eba3cdb9cdb27edbebff38e371ef341993a0a007733ac42c29d48659766adaed55b7c299a21bb407fe65d72f3c1ec7ed74230485fad2ad3180cc2e9ddee2938603e981f6228a5607e8e73287b2889efb83bd20312ea20656e73fd0c0c48bca282c332cd5783eb3fcf865770d601e7f5d35d422402166997e3a21cfc2848bded79e449995b004e9e698412f342c06f1e0f56ccc07302123e8c8c05c7d3ec33d97530c9f70e70ea98043ca8edd9dc8664383658bb586902184c096fc6981ae448a9fd174012b92e74adbc16d8157c7ba2e39e77e7cecfad0312ed0dc249c53961321049a39c0f587666ca34713383d3c91abff028c55d52a89ef78ae9efe7d39d5d9b0f407a1f845a91f1d8cf89a49ff71c332898c4d8790912891b3b3803ca5407b84c5c0808adb318496a106b6465c3860f78828971cf430df86c53314e045237d78c65833109265e5de307591c4e77a46d2f1db40af364ac76fc9fe2a368ae98d82a2203cab24cc6ea1d19fff2e17e20eeaf9331561d969e5cf40e1abbfed8bfc30d0cf56c92614e6d16ce1ff01884af40dfc384554d9022c8ba011bfefc2c5099a95eb4cf746aad98056fe4562841141277f1b69c2a9c9fea16fa67e215cfb07385fcd1ae448ec4ea6f3f9462ed04b45f8e30b2e2882bdfbc40cfe0be932a6f2487a9ab73823835fe4b273c6a4ba8d70eeed9e67e960e686414528cd38702716b3208cb45ec02abb1b1680f9a8b40d3bfd555066d628bcb9cb49e869c32f1672cbe04ec040b1b9b80e2fd340ca0c38f09c50803dcc4c94a16bd1474f043fe45fc2da7963752df6ae16fa45519bce3110a33c29c69386fc1cc5e93b86bdc0644661474dffb952b430eec541a92830dc66ce90c6e9c804f35cbd637b8c49c03895cfd71ddc4edbc800494aef98d6474dd0473d66a334383e91ae6d2d322156618a1fc39fb7cbca9cff36a1187c83cd3edc9a357f8b229c7f2b429f9315c55f4baa4d8b3e9229247cefe903686f14d0a283c523509fcec9c49b628be252fc16f71334d75ccbe51897a165b15b16dc26fffca72590c89c27f81e764482c3bd8d543b04ca97d440ef8e24f4c42d6c2867fabe3d486a993d25364245276a94b5af6346c21979e007206b8bbc24a90875e1a43429b6ec673df114d73513348637f4033dc2c0b3e48b94b4b9b282d026451c076563ffe71945d19ef9b67f5b8b7a1f6eee4dd019dd3ed937472e0ae28227d18bad235e6980cd46f295138776fbeec1fe6acf1c798781b82a4e71485d520450d9894bb2c1465a1c2281f7a1c51d9654f7c8cf1ec59cccae7bd90ee4bddd76a6e6a4afe0db0d8a7ffcebb6f66e5049453a350539882e6fc2fd6dd6f9b4e5111340e91f420439bc0cb05d96e99b390c906819151588c08cc682aabff246017b86cf86c0ffa579480d1e48dfcb733d89105cc80c8c22a3f3a45de569453c019f81f9ea1d4e699e44bc83b4935c57bfa4080eefa77a904fe6286d3bb7a2f939ebedd20b3b36bb8d1b12b7ca4b6d29c9c37359e7a88d3788a03315bc1a6627467605053c968f1344a69bdb933ecb2278c20c343db1ee3d264c1c648ad020d19cbe8acdf00d9a1bf094a8ad42c787f1cdc6c8ea579568074457041d25b34c24fdcd7be70397577bc39712e7b61938c48f8b363ee2a52adaa9871f5bd2f7f05d23fef08d5e99458e4bba61ac07a24828214a06b520fa4753ac76a1b34cb234298169b4fa1b2e753daa07c1f52cc6b42c437e15754962e9e58ccfbd4d7064398a218f99014384fa345689ccb0281ccf423b01c8964fb6b962295285130fce0b957acd8999d616057834128baa77360f1cb9a7310f516ec9c3c3204b0302533dcba5c9573549f0f32fdcd8bd115ce910f42b8f523840ed1098743210e850c660e0445674fd06e7ac533cc141eb3bb1b01ce6e82b6224da8efe11968bd73c66b57fb24d5b9b024dc7184ebad3cfb06de3405ecfd7a1d2d68b6fc28df110b7db6096bf1bd6eaefd1c4ffa2f1637dd644bca252c473669acf0b3c9cecd3eec89e7f7d1692540cd09ac1ed4bebe699386facffb953ee317f5f932b2c94be2317274e308005b40855dfc3c4cac2b473b6e6cbb728e2572b6f6239c4fc7b21d626565c1e8b3308f085a7c9dd85d8b781b9bf1cfece98cdfebb89af2c849c2aecb08", "ac51", 0, -1529755828, "c43aa4f170dd23d8cabfb5a5dceeca19047957080ce7cc04fd2239113c4643c7"], - ["a0efee1a02726289d9751eaf5acc0f8cabb69df77f5972298a765fe26702459beb0cde7da3000000000263008f0e20d38a280a3becb8e325d4764368179336af6d944d0123885016fed42d6dca878f5c0200000008ac635151ac656363b5bb69c303c9f32a0200000000086352656a536300ac1a8069040000000001515a01690100000000075363ac520051520000000000", "6a", 0, -1387715744, "77b67cb2edd03045108f28c4d825ebc95f81696ee8f13d81f5e0828afddaa064"], - ["030000807082c40304a8f49e077cc0a0117021ac5e74200662fe5866a07172e088542a82c3a67d25da0000000002526affffffff1b1f102316874c3b9a5d15eb27478cc5f4e381603503941724fd174b37e203c100000000060052ac655265fffffffffede20cf48118f1ea6286b094f63396edb6927564bc1f5361145fabafc564f5d00000000085363536551655265ffffffff482fdf66f05a5153cb6c09ff670d1763a46739505af08e097f936f1011f0b5eb000000000700006a6a6a5153d190673004128b67050000000001000191c100000000000651ac00516a530287f80100000000096365536300516aac631aef320000000000056a0063526518cda38be85a781b030000000000000000a57b9705000000007baa34a728a5537c8e28d08e86251b1be8bdc7390c69ccefa28fde51fd562803304a7fa947fb1677a3bb7cafe8bfbd12cda38f1ee7659f1ec46a78a289584848f75731543e1f8edb12c7d3ac3e5a2a3d7ed6c8c1e350ffbde3d83a75a06bd90400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b589eb727ecc84f5e64dedb307ebdc50964412bbefb3f5e3c64ec8568afd0fd41488d82d498fcde85d2ba35a81e7d314897a003deab40abeccbf81b89c1d84eb57b7199f9388a5d1bb0d3023cdcbb101f52fda3da37f368a3cf35a2c3bc3ed566ae5f05492a44c83fda8ad91963d3b3e37eda1e812d885152bcca379b396b6450307b798b0a6e110991d8f13880aecbd4888983df9fc9eec1e69a5c2d63fb69bdd0204aa1341627c3f0f7268a451e50972b7362220f078cb7c8c97cac85454517a6b0a02ba4ec26f17e1d433a92a97f5fd8b6f822e6790d2d0fd3f8c7fe0efa76276bce877eccc19b52fc8026bce192a4d2c0c5dbdd852ea60c155c7408949afb846ce030d262d680cff0b8c8c2940ad6ddc8a60efc3342e0b6bff20ee2e3e1226c97981021fb6c324906082e669e7441d31e0035c8f68811e7ff90b2ea9af121b1a55913b02132861abe2c336683b4b2db0a76282ab79082f7012192a65f07a99b05444e7cb020befab2f8230822e224b41ccbe3f4731bb428b0c2bb31d6ff536c0144a7ad55902183f8e1c270e113786d3f2df3e58c56f8fbe421d46e6aa529ad5a3fa37fffe8bf86ee7fd7f8979993835c4a9acbc3b1bd0fd0256f3304e29a12a88b8fe50e5dafe38e8e0f86692c88d242e697aecbe28101e71547be654dc6cfac067afc02b5c5b4f65ac39cd5010afe380d62c7508d0ad65208f0259f20ce87f1a64f57eddb69c70a135fb9af3ee9e483aa1f5d37209463dfe18b3bccbc6c458bd81a9d73302468f9665de6e2e28aa348ee4dffc8d60204b74bc3c824e1e1a41576d1fd687373f03fcb37ea759b0eb10a5b1d1d8810abbf7a80c5f2b39eeef7c2daec1c0537296812a1ff4a4dfad5c41453a30c07f67bfd435ac57d1e06b1d3f7885543fc9c5f779788c30c907b67b364dd6d1e888e3881976ee8eda95320fe6ec6599e355f81a7fd208a618da44056373f2becf75ca29055cc39be367e1b20ce91f40ed3a94604465eabc914cec63c9f0d7ceb473324745d28410c075e96a68ba7c723e64d742c8c3a6d99ea3b867779e1683be46391c5efa898fad7c8af9d5ebad73365a816b527b75002f0ad9bd3998f8013413be704ce228c046a5ec214c021481b66da0f3e4b2481ae960e276c07c335eecc44aed37976403be4fcaa03f3fbe72e40e0b35b34158431e70d2a380bb447e7da456bc818e93d05ecc7e2cbbb2113f621c9bde8adf45be3fe82bf4718ded15d4d3f37dcd5b7782688599802b99cfd7cf43d870adef575e77310125622fb1219faf6f6e82472cb20b6fd2023d908c09181943ddf9d9d47009f784b57634e0beb9076bc7bb6a2748a3c0207fa1cb43e89284e2bdba88a73f4ef0b68f6cacba61e4bc71e5fba6267212a2e08d42afe8d5b892a02d2a883a85a61fa321e890ee00821cef2929bb96c105ef231ac9e90e019d962876d58587be09a09ad57d97bbdfe49f9c7947078ef8b8682a5890f20236ccb7d85116ee4329d2c1047583273dfa2d7895d12709e03bc160e5262975e7cc29a92b4ed63297f5dfbb7aa322069f27d41c575f8161a8bd37dab9497de9df0dede3b93b7ba691a0a0acccbaea6af597367b980d5d35e7584016da71fdde314d94e00b768c4c6200aab5491d7f2ecc13c71aae10865d6d3138f8601c7886a9b8d3c5afada94f82b72a7cb803b6de87a9aea4a6febe0c01c82acfa3a0926237778f84bdec664c6ad97bc9d627ad96d1f4b674ccad74e8e9005d4597a5566d200f19c7934e68d52a3934669018a554850978a9d75258698509dc8e0661b4af1081549b1d1e192acfa59775d67132ed62f10d49cf128eec2f87819bf43c0a268fee6d7298d741e1f95a7d1717db824ae92860eee2e344ad2f88cb23b7b313f4c7cb0ef78271883ba7f2609d63a9115e5c294db3e1c207a3a051db38f204bbfa229b07975191f9cffb441d968b7596fc3c37d5354b0bd0cde7e0c1a2688e71975ff266dd2321d131313f3b0d5e09ddef1c6b89f52a89d6f9c63801c73ced0e0c59b8e41f4641c586942b87f1523fe0bddf0fef0a9f2014073d4499312d04a427e7c15c247ba786db22c02a2bbdeda15bd29e70417e6d6e926455a14b22456698f586bd4f2880936fa020f2ddd54163bec0bfe51cfac2764e008ad9fb2206c4ef292d6797120fed89ca539edef4e77e6611b9f63949b878d2d3a737e46280455ed9a5cd3a74d20312335cb0a7ebd7cc3c329fa338276941769a63fd217bebf0c7a35a0caaaf9a26f4f888b4637d188db9597133dd66656418a2590400000000000000000000000088e38a1548367365ccc473bcc5f6c35b7125e56afc9167968e392e75088d9ce01b832c839443975248cb55e95abd3d4703d44ebaf9fb9f5e92ab8c2a17eca594c46fa9848404f62ef0da6f44d78d329f9d8fc0a596fab36eaafe038588c0e59b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030ec3225cff71a471005b4b750fbd197b52ac9721581ba49a239743febc52ae762ec9bc4649e3e0b0063f6350e1fb2d94df3a9d3ea42b19e7c7129bb765f66d1d64fbde9f0215d44e5d2abf880bd2df1a2df2e8465afc83fb77030c24f6ef60b410eff34fc790ca0d21914b549abc008d6ce1da1c608472adba628b9ca66e95c022c5bcebf4c2f45c134405cc84ca9739e6e54ff421000e91b641811d1ec908ea4030256a42e2eaa5329b71279643b84a52efe14be5e4061b783bfe6d13978d72fa90b07c91123f3036b2bb5f6a243acb0c23b6d0a77bda3a0c5b1b2996f817220c38be7048570ca138833e77806230e655df7d9150554d9bbffdc94d699823cabacc803154918ecd9ff6150c85df0479459b79ec130f4f64cae8c7948973825de7cdef7020058d4689e281607ec5f4efe6b4ac5e03a5404dee53734be931f1fd1ff96211d03002faebcd299823b08c1a2374077f276d4a387d62687d0a724158af3780501b5021d9a37ea039e8ced96f3af199d23d3aa7e8414c01e69ced224efdda60a9195ec022249db675ba10717381cafe684b350cc468c677511bc90cf96cfbb6a532604e2ae77a5696cd79e73415f2587f588d27a36f98f5fc1e516b0cc65d9e55b7bef5be9957a75d82c3e1236e51a453428d3707842106292ae6671ada71afb01e27a78fede19e957aeb4c26d997f0bdf23f3bd5596a03992847e7292e15fc8f668d0ff193f64149ba1afe120637b0d69cd54a8c03ec999e1014b261bb35fa1009a03ec6986c3f6ac22db06c0366ae4df689600220c88b5868947f7eb3bd447a0ad88b16ccd4f7e264236ff9b476124fe12abad90e06dc684f1ad2a272212e16d8bb9cb8b28e1ae5bc1fcda8b4579f6a380754ad0fcdcc19d748f799a3fc771715ec794d1f82159636fe2c839e517053c8ac626fe9bcbfd1d4a6121a9507a1e5ea9de6624f453f430faa8bd12a70d96a2b94a97c328358c5295930e569e465a9ccae7f337a5cbf1e36ebcfcba0b14f610469df85dbe49a0c46221646dbd40f13622599d2bfa556845aa0ec2dc55581bd1fb069dfa5974935c4e2b52efec07054498855f4fe51484a15810752e81bf63bdcc87c5b5b2d458b9d4aa9b00beba7e6dfd3c770c0cf0d6fff2ebd57c3a2d340fef481a948eaa30b53cea037dde00c5a28e89672db4c611daad7d685af66160f3022eaac81dc77645a9d12ba3baa54d33203e01818e40da7119f59e4425ff4b1477df0b9db1d928b58e4e2b5b4364ca1973cf7f4e5f5620ec92281f84f63c0fb0a0c872882a4e50566903edbb2c832329cad7fbd9a6e42934cdeece59dd1aadebbcfe735b76321f9a59e6304b71c9188ef20f43e761f9d826ff73cd923e8adb8a8ceee6647c3797ed980dae692bb9bd1b08ea7285ed68e81873fe7a5cb77d57bdc37310c3aedf6068d7be5ff440f6ba3f36e1d5053528bc06c679411064f04be95edd78e0839f9f09192513f81559066295567cef3de282248b43140e46f0eb12cda870218e44616eaff7d70ad461eb044226bc76df05eda0ac5892587feb673a8b0c333668424671aa62687c9d850e2239e526ef99ad80b398c0d681da705737ee8a3f2a578dc8dbe06b779776cc10bcb832aa1a6ad6effc0605bf3a39c74581ee5c28fc2fe60ceea6212f151fc4e4f6087eb7b528ea653f2e4015cdff717087b4c4bd778c5b30ba31efbcb08dfbba52f2ee764c3fe180cdd684aa736fc6d54e4f4fb220b5bbdc295014b441c24caddc68929183e1309a0bfbdc3c2ec2751185d4f362a61b6d4fc966f8195e7029b504225e356f6b9cf75c67cb638327ad472fffa0785d9a30ea66b3f4c8fa8b4dcf6c5f6180a71b6c88e6b0ed3dcba3ab26e46ab05c9a1c1e3467994bbd0f46a798787c4ee639e485eb1be8789afb94290cd3a0671483ed7755aca0b54a0f097e042cc0b3aba6570639cbc6e9dbdf9440ee183c194fb9ec8b4fad1bfcdd689c3bc01e3f026d757d35be257f0df82dd9d797a4fbc8e8887d2d5b64283b79b991ac32ee31b1b24f7e0a1a1a90f675a85390facfd6772e6233ab749f0ccd3135fca5089c5635df45b6e8c72d61f40a23486d82aed267faffae77e1d0e743d650a06b456403371a74f4a5e6be05fc8b43a6fdee71f4f4d815494427fec047b178011474a8b863c583a08bb8597bfc08145e6d84155bdb4147d4367993b435f38cacf79ee7d386164868e88ec665ba2868380bc801be0411cb1a3e6fed6b25ba2d905233be286b9e06dbd4a5508998953a5b2335686bbb6c404fb2191e04000000000000000000000000a5ee8d5a894dfeeafec89d71cbd02aab4828cd074b879d7844fe20e1723a9d7b65918ca6f92c02b0aef626f6fa043f1c6bf1d16a092a80f7766c2cb8f86f098a175d6f1d259b0240a5f9ae9f4a356234f84dca38ef329bbe95602fd5669056740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007cedd596197857eaf93f2713e34ad356c8c7f86c06c70428419febdcba60d11b0650a3966990d56c4301ba4104fb64b29b1ef68f671a984e9aeaae652149f6e0d29febfe45ef7da5119d50509db9f20ee681d9e6b3b76f5f58dad9d64c04e69fead30f57d5594db2065354780fc510c8754cfaa51c0cf018b8a8d9ae09d78bb0202f0707ca77902d79d65585396579c5f87975f0f490dfcf4b4b7286e9fc1b101022c402391d96f0ece4e1a7515f30a2bf11e0d3b09a4cf2b8777d379f52c9960170a02a1c07b06b6dd44e649995acd78740ba779debf7ea5dce2c609d5e1c6785653b980e6b3d99c44ac26e18fedd697215ace9b8bc0820783570cfe0202bbcf2c6d0220e6f00c57e15f7edc100f6ccfcfeb703afaf1a51e2a29b59a4f8c49f589095c031f616b4811141368de30e006df6229b3972383d716ae04af4702184fb5f43777021c3e4b97c390d7b0d3d97a766b49e9b5d7efc4311ef6c54c0e3128af56b80b6a02233931e6ed9181f16bfd19310a9c0d653cf856dd8e533f393fd02005a76e4445021626a95bf60607f4c037263e22064ba4fd5a727cf627ba54e84e670691b9fe44846a437cc3c5ba6f3076fe83e35aad16a16e979c0327ec9291010c197f00b3244bec85f6e64cd4917fc12ebf30ed837048035a0e627abfd949a889a6edaccb73a3c1f1f4d6f395b6a27f612ef374871d343997fce07b8e3bc1729bc8bb90074bd3028ffed0af477b96bb988db277f50ee7d14fbf8517670b88fce52b95ddc3991e3c02d12cf059a4d8cdfa0c3cda68227fae5cf414d5facf9010a6b7e5b995435ccb2b95391e3c454302a913ad89f3f89e1f9b90c0d9d93dd0c201046b349a3a10b474b33fbaa5b327c8538085470f2f3a979c211ea02df262b5a16300900db29f7e3900a41e270e99f7e8ac6773d10540902a7693f5a7600222376c509cd03b691215b008da6040e13bd9f9ec3776a9a612537cc5e058ebc405e98b5f33a529817a8fb3f7596b5836444110a745c60643ce410adae036ceee0e5c1b42102bf00c7e5e08b9daa98c8e697bf6ca7109dffa6bb699ebe113d16c4ae4e09d346bfe35d1d5b17f0e82b3518a231a635a24094dd8e99226de02526d95bf78e74206f54920cea7bce7de542ba3c67431e3da87ca89a8f23328ca8eceef1c99ed466169c54b01231e0de4cb63f981ce7ddf2b55b9d92866757d9021ea62161bc9a30f4c20df42a0660e95f7b05d6448439ccec7c33d74639ee1bded74c60b25eec7d4b6b100d2e8f4bc48c088d26b54d84b307540cae38e3fc296f4048e4a40a532d272b6f68a956138e979da2af63ba527c6a87cfbbe9dfa1545ed320e5aec4ac1addadbaa889f0787485219656dc0ab6e74f3802180c9973a1b81c0400c28f7743d1e307083d73b5a36c4a5c9443d0e66498f1bf3dbb40a0198a2280813bcf9c71f08538f67257e38d6730824048043494277c4dd23c5bf3fd31a96155608f66a6d17fa7923a30864cce9880f46bac892007082e91c97a8f6610ea5706ee6ecae565ffb7d13ddf409c693c1c0835bb6c13da8de3174a69dfe6206ff6332d1fdaf6ec5ad5f755aa91837829cf4b169b311b2442420d6892df7d98aa6f2e6b6a0a4f81edb8169f69ecbd0916e83b453a7fd6808a2d1136aa6aee165d106254ce63efa59bdc2cc4f705aaa3633be9df698098afd846162537f91d577b77db01d2108d8bc222071160ff7b14881320aad1ec0d8081f44c5e51d88953c1bdee0465b83833038c74e2764c36213740dd031995e39f2638412956771a7dda05be9743d51ee64168c07f6b66b2d9a093fb4cd2dc71ee91b85d76c2a1c40b5b059d86aee2de7d6bdb0f2f5a86ccbe77e987bd372f62ea5585144a90cfa7d0cfb62da541645f424cd0fa054493f8abefbf4b00d527228a4edcdab99186595931adc51abcb5cdf0cedd1383d147aa4cb17f55d12e50015c2fe10f8f63294316fbffe9b207f2206f78e946a24834c9ea3c76fad0e3a52507645e514af9b085fbf271e6db546980c4f7f7d98a4cbeb62a4ff509fa034782fe7d51cf22bd0bbbc0291c1e74fe94f838ee0eb0da79ab9121a4a2862a028803f007def50e86dbff8d25e8c6b324ffd190e138e23088111ffd0a4f0a86371f2e07ff5e97287f5cd5b4c37a06b2c04b11caf01c1dea0c67edbe78064dbdf745ab7ea0d29f8ec9734b92f3b59da8bba28f278b42d223566845d68ae7a45e2451dc86cfd32e7a2a0e069ca2be8f78ce5031234505cb451d197d7eef7062bdca0a51b833495667aaad711d199a7912492af15a1085306ef54512574ebe0a128ec6d7ce74e9f628db3bc452a88db4efc2ec8412f48c30c2ff698a7338c8432bae46009d79f3812c6f13ff98abd3771402f5323af537f551a757ac672b060870203f9652ef90e", "536a65005200000000", 2, -1010303400, "35dd89fee0a6bf0b2881488ac30eed90f03ccd0ccc0552cc5467d5a25893c87f"], - ["cbf33a6b039de68cfa02bae3466ba002ecbbb246f5680e46302a0652ebd4144237675303af020000000453ac5365ffffffff263dcadc4a52bd53cad859050acb0e9d4349b871f115e79a0ce59cd99491164802000000016afffffffffa135ce3793719c0dbd8c7392b12e0012c7ebccfd44aa1853d65d0c48f6ae93d0200000001522e489f76046aead0020000000007005263536a00ac899ba5020000000009516a6a5252006363ac7c82a20300000000096352525251ac536353b837fc020000000009acacac5352636553526599da3401000000000000000001da0401000000002b5db344e50cab3dccb5bf32369fff4c276c5200bfc9f0555d76939ee27102723911e407c91fedc1285dceb3d62f19554b916400d0823f238751c8f0a6652bfafd6c2963bac627123e7e27b3428cb7e2e9b68f8b966a8237a01ce82d10e77bcb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d6e5dc9dfd829d2678cbc676ae99d39671ee24644fe47065d3ecb6edd90ebe0066194ed27d8ffcc0476c3cd53754910bd601c9acabbe51f36c951796f929df955fef4934113ef72a5a2524590dc2b39e7670018a97a3ab96ebee0c204da309ec837370e044ea4616e21c528bd07579162fab3aca1c95577912e2d204c89fdad803075bdabffa714b62b7eb1d455769092b76c24e527b5feab528997a7895e3d7d0032bb75aced96edeefa20dbf3e6c8c82fd1ce8c8a15bbd48ac069bd6f25abf235f0a084ba7c1aa208d4ac640bc1997ee9ca100a7c0f149183ae32d369a1d047d3a9044905a3767dc66e2d8ffcf158feb30936034952fbeb01c9ece97299f07f251d003045a613037990ede4d944477ea51b43ce1010f6a03f3c320f315ede6c743472f02179c4b1c588fcc0749582bea46061b7409d49ea3ba13c239ad04e3043f74b5d2032eacb49fb84af02099543e66208f51271ca82b72c5bd6e5553a29e5a5e2c01a5020de521cb7f623990a71f15dc1377dc52d9d043c225218af878bde0f9aa579ec8031def89640b8bf48919126407fbb773ea2826412600b9a7c2680ee97b60c14d0078f2a83e41a49d55dedd53a6121ff54528d9628f1daef247546bb09d1fa83be71ae2f8e50e5f41f068902a95f05b7e25c08bdedefe47781ec9699f705b350c6effb28e3bf8d25a0c13165cf99be95229a83e66485c139601062f59415611f78985bbc927ea89f63526bdeb271cd8b163062bc73d354810c87ac3afa4cfb95550f84826e6585b6f8fc819579d9ec66103f2eddbdb109279c2f037af22032af78c58e749db3df98b9bfed11ebd3f2ccbd7ea3520a2622f898f45c845b73da7c51fd55aeeed38c454af9abb787320cfd9a43051fbec1e5aecff098ef660f7dcc60ffa4fc4ae94780cea235c17fef76232bb11b1b1c95c2244d633c3d7a656c95784795aa70c5ecb23216d2fe32feb547900a0eb9ad198d27df91f53ba9c831ee23cbcef9c5aa1b3ae89b61a4b3bc52a2714416e24ce1d02967cdbcdafd9a54419eaa1e83c68df882622b5106e603f0e068b54f3bbd14786fe51759ede625fcbf3e8e695ca74c365de92cdbb9991aaa974506ef7bd1167de444aba535d7a399fded27e4ae3cb20b25813634d716c55d90cd685899b6d60d6210eed8072bc3c83ac929f6e1ff5925e1e05630bb6e8be4113822b2a314029ebf83055df9a0324ede8b0ed0892175497aebd83bba30f0958c71b94d0111891972d7c0f0eff674f36bd85d65444ef81f51754ff4b97900a2c801b6a83f9d42c2a96395ad22762f135370531868223b6230883052bc5f0dff0c091f285d02b0cb34cfd3bf77b49e4de63c165a6d76c2a8eda43f293cbb2d9e8bea4c9b7851da7afce6316a6ca69feaa80a21c00787700a1b9ff7721fe59c6f0145289113c94f7a8d59d9890ab36afbc1a248df7a39c595b25c2ecb848dcff2105369f690c04f6475f30021cdb593a637b88661108958762e261aef2d2f7f775de5ffe4f164ae7c5338c82081402af294308e584de8e0a830977816a014b9dd9d78bd65a0ac2fe94e9945014a79f5764f5e77970e87989bced7ce731f8646b05d8d25c2249b493cac640ed8767e1e8636ed2ba5361c359509f18edb16d35d870edff2086cd11f1ddef41c4eab500b268c2b1462ecab775bf5411fae1126c7bebe81ebb35d830918e2f5fe801adc19d9288de9553fc277bc98ab4d405f1d358421a5c859d40a8b3e6c541635713c7147ce75113ca5df032c550beb9ccfcd3662d572cf8f28001b03205bd61a1894a0608dab50127ea93772eab5b9751c96aa80bf04f64037e03a6b002e59b8f8b8949c2d48140b95d895cec07f2408d5ec5b90b834fa223a90b183b74076a626e0ed94531f165e6930ba7adabd322693f8773721e52d851410640d3096e034db29e7317f106a2739984631ad6ca50f0d13c4ddff6a65a13b53c9816f3b66ec960dcc1bf39a9b9e9b3b4bb760e6a516db92403cef2e1065544dcfd2a4872c584e351f5f9e2e659bfc21035c2a9ddf9db9fdc03c3ba22a16138b4e71029094d22f078033534bf76dc84919480bdf07675b20171379730227c93d64ef34f663f839d9b0867db02e33610d20949f0c8ef03b854be1ba139b2adc67f74a2d370d4beca522185469938dace3efc29908722ce3f887400ffec5b157179bd0a3cd509f70ed4e172a278c0ed2bdf629ec2692194301410a02b71fb83891a00ec1e7f6202fea2e5d473e9220dc03d17cce9b63485359cdecaed03142e4a5ad1c4b08869f8a82996d99bc2c748d1ca45b0280102b8b6538a5a3df908e3f9585e1ccdc2f8e8db9ac912e067492b8adf8cc317d82679a964c63da7861fe699da1978c0210f7e86eaa5c9dbb840d8921f95fa474ec3baf0e7f3dd201f6906", "5152", 0, 291479857, "f7cc007f7f9195f0a28de434a92d8ce313757b1e065f32d0782ecf205686af66"], - ["db2d2339022f1dc0291055c5ba03c0182d279f8a8dc370aa8ee5fa9a7e59278807e729dc1601000000096300520000530051006129c95348403331127afc460c53765221371b7b94a08e44c35a259f982341c35095f5ed01000000085365ac5165526a51bfaf30a403c40957030000000007ac5300656365003ac92a0300000000066a6353516500d7b0ca000000000000000000000377822204000000000000000000000000fb8826c59f94047eca4c1799630a7efb1e5f8aed7a01488a00122d3f5beccdb0c00aa7fd4fe9ea247972bc5bf07702824ef14e609aaa2792f016622cd5cf0433784342ccb1723dedd43a36581bd17c4aacf641561d62536b036e98838a3c316b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000242985810ce8b7db23535cb029c69f933823e2e26660ca5340358c0367e175ee19bf62691b75bc34a99bc110c6d8a4d29bea14dc08869977e8c30d60413deaefb9a9aed17ebf2e72c66041d926f8afd6fbdf0d897b78a58e1c0d380d8ed324cb4ebd58ccecd477e8769e2a8e144f91826aa4a1a0c26e4568a69628f970d188e021588b33ea6bfdd6d52224dff8dca3f82a6370f50546c90cda4c67d06337bbd2a0204cf6dff5f09f6eb3cba283d7525e96ecb4c4ee222378ba7b00c2a31f2f037df0b055e6e1f798e1850c7c84b0896c971c74278c4efec2dc981b70000b350053b7df03cc39bf67e812f2cbbc945d4d2698ca11fac4c4143c17e9e0b5a57633c7b0a0323c1b4a8b15bf5b1d2c2531f530e7efc95dd6ae4db9d780080f32757b3e230ff03264fc8a783d310be76e50f3cf376cbd4f5111abb64149ac9f2862891476c45ae022d13eb86f3df5adae3eeac07fac2f00b0c895c21561796e22ed3f1e0941978ff03069603dfa17ede2b185f7b24176e34f4b2a7e030150e38af1c0762528ec0ccd3022f0c4f58816e2f40ebfe605e98b0d251259d1dcd7ba4e50602490be1838bf0996d22e370d8672ca5b8af989e540a5e408c8a38b008d0a1f7c61570b7a846d51e4de3ed739aeb1bb986c4048c01dd563b0f5bd7087689a0c826d88b91728df85c927c34ce8e10654f23ef84db78c1ecef57b334dccede96e0fc657c2d50851f3e73119827bc7f11add612c4d43fc8552d224b53065b4ad4f70663d9bb6fa263419923ad2f1b93b9b62974fbb96f112a297738da5a54d1fef8426142357bfcb60f04c3e000b62f2840c8009f43df3e5ab771e21053c469c68ad6f825537cda1a35f33980929c612f41f3112cc605e182e63b4fc99fc505868a637faeb80517eed53fe2694e4c61c84f1cb516666177190a288191e73106dd3377aca085a97cfb725f215972ace0ac3aea0975b780bee1a56e3201eb3cac37c7e4dd1823b67e79ada79e93d8b548e4f54e19399dcfda820d755b79039315b82ae8b9f6aa020e35f5824cc81d0fcd9b4be34771758cb5b2a8dd4e4f241f10bfa4e4a399bb52eb535bc36a19fec4664f624b00e33e70d35ca180c208677029c585528bfbe5a8aabc9207b1c5b273ec0db4e1e60bfa2acc03aae4126c321379b86a49264cd0007ea696799e9b80f65a324a7155568953b179c44abaa2d38445d468c697f1918cbf08cb2330c17f995436587400334d6713ed4c8b4112c46ba5dcd51403948db6b5feb90e89ee76e5686afacce81307e395c5eeaa0a0a891608d20613ba9e67e34597db9451a9fb9411716a235125688f31d5b312c59257517f19a3954134408f0ef264f6e89e9e9b3555fbd810a2657a2a65a137b5722f967be925a81e05c71d9484841e8ff113a79dd633d11352f207a245a0d84fd0eec4428e1238fd2d04c276b6bee5a2023579184f732f7d0f787244e1edabfc9f0c181e24a4803c3f0209b82f6f54971710c874ee8d873cd1642c22ba0b0a2cb3cc7742b5bca7c16245eec97e6b47a3a81873ca27438cfc823a3514d245267d8f795b89e43065f0bba67c7937b475ee9086b51cc2d7d6fe341f89b08f486d2bfc702c59eed1ee0df0abf549f46684930dbcb8417bd2d6890ad1809c7417e679679eb051a3dbc829da16f0e527e92ff87cec5ae3cceb4684c27fe97aebaf60005a1b7d4b61288f4d6f1c501e79c7005cf2f5f110d681297da976d4e0d2e39e5d8b7a4eee585de20caabff22876b2df8c0df139cee1f92059fe43f2c5c1b2bbdcde0da651efc70e4b24e9a944b2905df40cf8181e659e3d0612f6bfb615be69e4d16c40d5f1a7c5e08bc560db742e13b4ef1234152a969d3045c0b7c1f1bc29e85b23e9a81dd3d051de3810613dd462c517ac9f098f07099da4db32e8c800417aa6d5d23d6383fad20f796434c123a9789a44e22fedd0203ba4bc349ad2e537f4873ab2a291c20edbcf02215e45e1cbcbca58291b6cfae32f212261b1169f3d4db1a0c145eb92f68ec8f55033420978c4fab0f7159a3aa7bec8f72651d7ee4bac7fea01531f4f14f4b0cb7c41a04aa108e29d4fd967f5659456abc75b2401cb617498d170db696c67853b243eeb061c41d68179e1176a1e2fecc8b13157502cbdbdae64cfb9a495e2d050dd50bca2a4c542c3ade17335e9afd203bde7c57081dfc42a2fd5f29334f303a746b25b1e43efabfc14e9e0e0f60eee8c9f4e5331617f095104e08b3a6b09239517c1d222ff7fa70162ee9c80cb8a009a4b6d24a28e260000000000000000a67e760200000000d254e7937b9abac7334222916c619290eea2c8304adcbc32ebf2f24eb7f611e6a10f9f6d3d83657bef0b25395ec4370326d911189240690d4f4c28e2ff06ed49179b419d24d535134c5545c9b56d623cdfe480c519880964849f9bcc94dba057000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007591ddaeb1807b2acbe271d13a29d1ead5a8ac0b01c811ef392299e55976cc5bde415cc57d16405efe903d296bbce90a6065dba5bf6e2a1d657b43f6c0c9ab706b7083320f914b0ffed33e2421c4af9c19bc06680ee492be7ef79a88773c8ef034e53730bfb6495f81c18dc82c608beb8c91b85896c1fa038277c3a93d49765d02157af2c227567087a996092aa49257d79b1ec7fb6aa38257e27dfabc4911584e020865070895f74e4668028075d0fb176308d4995f755660aaa5a072a87ad38c1d0a05b23159a95dc6811148c3a20c3319353b1afb0411c3a3b798c3d27eef2e3f55e5d91d2a5ca0ca6e8b56306fb8755668497376cc1113698ccebfc6d7b4e2859c0300c7c16f733c53d020be0852bb17188ee3daa6ed1bedf3542e03d3903e8675a2031d9c5faf7c339d98330aff3fde483046d2ae09657beee5626b9ec028883c7459030bca2d7f3de4729abcd3b88507808f451813f0799152a6e88e5cc901e76287be032700e2f721a3e5c50aed1fdbc8b7b9507a24a017e520d1f7ec2efd94ae9affc702042ca5e45c9f7d9306c7ca59563a548f5c557381efe93272e48994815918d7b98b4b0d6abacc632af6ed753373924aa9cb1616966d561d61947d7878c2a6105d2fdac493b0d392a91fdadbb2963c993868ca12f4aac45610a0a641fdfe2452e1d51cfbb78998d8e760bea51136fec538e6515c8d5be40903f92ebb7170108a659e4a22e52f4e9dea84b7f028c3a55a1311b5c6a3a35341de2321721c9668896505b42194735977a5b6f0c49c2ea6090b66b319ffe78aab0552e7469a8e0f77b0d111d3d2631357b7fedc5ff63761b92eff6b237e4bfbc719e1fffa1f69393374eb84afeb6bf512b136fb6726da13f17f065a524cd63d9a499d68e6001267c99ce85e5801b33473374570e0819b054a6e202adfeb202ec8dde1e34087fc57cd1ea61f6f9568de41f160de3ae6bac19450afe57113e26d7af03c84536dfb0c7dd3ec222eddb22031bb0b4a1c5aedcb379d8d02671f0d7fa80ca1f551049e76e7512c047ccc67670ab03e02f14625e49f0e4d5062bef1ee7a243a4876a3ea5ff388c2e5c46c3001d00ace2450ea01e442a9ff96f5a1b58e8859f89ac6391b945c4d9091855d80abe3f950d81737aa462c9a3f595d2d452a154e85a0e0ed67c32e180069a23955a5cb88581dbf0e61feaf9681b4ed0bc35d527bf2a369959d6141fa22385354703c50cc779fb3e01623afca3d2841b736589ba0ec7e1b995bfaa0d5be40efd7e2bc2a5abc358f9817f733f4ad2ef2d9877169e6138cc854b8289ba171fc1ec390900008b3651dc325a7ee0252dec02d60a8a703ef305b44e46401fa1229b5fa08b20b9adf4c639a17de98edcd601810de1be58ca1d362d41019b511d3906e9848e8022c700ca4474eb06ed2bf93b642850b5385a4aef13810603834e6a465d849ae7808d1c38949bdd4e2cab4034a0b567a7b08c3aa8f92530bf40f1bc6e7e94573888905efb96699700090ccee85664e8f8d57fadd7f7693cf6c12645636c8b94d46bad72eb7dd6fa3d4c58e28ac94f3428a588b2c730215e30f772e8e4eca82c2218c56df7863e3e25c21ca07a98e01e4f578bafe1e42d065dcc8135cdb2d721d0e6081d763895165bb0b61f6387d767d09ecca70c06a61dceaf88b9e9a75ced281836be57a544eb35f214ece39aae212dbc25ecd39003748a1fb163cc0dfc2257cf9054195a3b809ee44fe5592a0575b2d381491635598915ff4057348082dc0ed559d133a18213b9fbf1f1c4dbf0cb99a2c32ed4dd4f4f21cead4e384c95adb20bed013caae28b3e2446bed067b2192e3ad98b0f9095cfe3c6ea7e1fe0ce3010706d49582dcaf5cc7e81a67fb6b2ef900ab0df58a07533c19b566a5103ea5fd1affdc7b3fdef3fac8cc267f430dfcb41c5f0928509aef97a9943a69334b07f06e399250b172cac354216ce2d6147dae1e7c6bc3778e519d1e55fed9c72a54228d22b911b7048d22d8e51eddcfe27936e2b69c725f4dcef37d1b192d0e3b8aff98baf16edb5d8a8a3c7076d1d1a528de8e4c433abb819aac8a01462b22f0475a27b5fbc35d48579e5855d3b6c577bbd2808d8609bbe59db9090b28521f281661952395e340c8934d5ece8edc38c52508dae067fd289627b01d9ad39759df9b883f652092ce0bc08b8feece5236d81fa58e44731690fb0c4653387087070e2cb8a225cc75519dcf6e11f7437e63404d7a8a83a2c240c388d3d999e9533dfd0d28ad5c30ceed1882d542dc78880000000000000000b48f0d02000000006cf0b9c941626f30de50242144ab07a84347989249880786f2cb53c91ff7386e1fae05252ea36dcf9b0dec9f355a2920ac71fc62215993847e06b6a80a809ac021b48900d3df6c19c8c0e7b6b17ad54c5989303eb648e370725a2990bd9f82db0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030903a2f2a65f419e9f7011a81749b8c8a0ca32eee42569fb6d46e34ffb449474472e14e53d8d2e2b9be49bf0baf6378d13aace104e5a1b01dd509357f6c757ed6b2cb93530822e89399ba9be690c1193f170159a432b850b517a860bba4a7c2b98387a4cd70c42648b6a5ea6aa6f43bad4b8b3c6e8667644f85b4fdcbe2704d0225cdd40493923cebb75354ba4d08d35d6d4215468ad25fa878fe25336c33f65f022977b02e2f307be4b6b5486884422ce2ec85ac46f833d86dc14d9c45928ba28b0a05a7a69d3bed00d4b4ea2d9a9e71743e1bcacf618a77a2a104899a4678c5b3b149899b265116ebc826d09502233aeeb411d5f14ae24e0c92d305ad8a2b1c028402193729d701a25969724430fb4f9a9cfb88b5b599b801981aa1439ee6a19b8a850223fa40c286c8895dfcb76de4043b89238f380a86fbace7caf5c69fad41cef553030b353e6978ee909c9a6b9b2a5ddc82736ecb47e733c4b3891dd7ebc5c1988fb10225a8c784f20dd7eca7dd5b7c732a372f5b31c66ad01cad2cd05ba5e1b43fd571020fb31531ca23b5f8af3459dce5a86acb4a2f7e8055fc2d8fff6f82fb3d6ea2c1fb4517cfa8eff0eeec1aed2791551c0215e7e347e49f26ca5746fda995b50adffe11eb2b7ea72a01fc94b8955e32dca053840c0c0ab5c8ccd89e5b47d39b663fb4e9e0750963846de0c9db41fecef46850bd204fd763ee8280bd79ef8f5b6803a4b376b0ba7d901aa0adb682292b88971e0fd6e77d107b48331a74a517298ddd19ffba3d1b2527b8599f675e30d7605cb6723a713158963ae9e32c0f834f6668a2aedd6b311534213330b45e939a0da53febe70577f61cf0e0f26eddb1d633503a60941a5936d8fed5e4d74e40d80ebb040cb13fd7818e2fa073a912d3ad204a5077722ecde2a09edcdd07c5ac10effc8a1cf4267d917fbadaec60afe9bd6b6ed622633a932f7d2c1c7054bafc11effde17525df43b097c10195cf259b728ea9bf3f8f58a6e366729aee1a709e596b04f34f7b9e97282e36e7ab1cb1d4f143901217a375ed7d2a1d2e84c0eb4dfa5dee6ff7130789108b768f1bfe5d72c5c0934fce9fea08086c2e3b133d616795f6df2c11a3585bc80ee7d8b05d49d076749869d9925ff391ab4b7d6c946fa974f3a816fab2ae6827573e970c2e677bc04a529d1bcaee5a4869760c987bd647377f79f99108280d6487ede08f1989246338d74bae43c4f281cb94954ee633716346875569331a8509fc97e342ffaea4bacf7f8aa06f467dfb14f96d7f80d2f83b51121bbe268f17006402dfbf74f5efa7ce6e32930f8d1f3f1a37a97dead465989836f6372ac95ce3c91b1aa556a672f1650c5680ac47a910657f08d9c89d0e6568d75c3058da55af7248d3cd35a9819a55289d3a0ccb9eb069effa57bc4f97cc7493b80659e7c9b1a45c8d1511af568206ae84c72147b8cc6440b01ab37c8d74ada8c54b2f4c4aab9f4ccb6248159166390521a45f0207dc13b118bd11bcafd21267fb53c39beecb5665d9c1cc708e6862752865c8cb275ecc9a7e6a09a3066526e55784a8c059554d93c4f2651ff9c0669683db079ff6287d2e0f32ca7e05050bbff13ebe71e5b187281e60643c0bc9fa7aaae7e9a832bfbaeedf30adaf9f0e61575997ebd4b2e17f10339e1f1835d8299c9edf209b79fe68c2b9a3188f1b211c04f56d92e8f05e43b94197341cd469433cc8b09396070e577cb84af72b92cef4b9130da9b1e958f68d09ab80ba50d2086bd174b15e45b608b5a84d70a9020849ceb70b00c40983cc12adb41b09c89cdd084a1cd400a6a35039d5e531fad5204304313552dbfc268fe29013e0f310cb87e998cb84ce783d221f645898bc5e0f20015e166ce82a30478ab04832e000c4f3b7afd72d7c13bb519a82cf43510344ddb67d54dad1ac7ca86ae54c6b8e88b47928bdb4a1dfcd4bae76f83987efec30be718d87fe846c66a72a70180e7646858f2193a7dc22fe2b7b42fff994c94b84f5ae046e76fe745dd2a5b8d4d1de9322bba1df2697dd3defda817942f6d5728f9f1cd4fa7fc62d69dd673e05999fe5332e8a7b04c7537039fe106bf76e9f1c5a0e470837d584dd5200f198c793c427e1791e80b11d7f572d0b056702ac69d15a5972dc5410bd444ec89993e2c6a5bdf4796ace7004f266e8acdef3ec6103176ccc597eb77d8e823dd07f108707d31e320bb8abd6c62cc5375501e102a28a65eeff9d6284e3a8aa3c8122dddd41b2e1c737213a618ac2f837d578bb2471721ffcf65d753c23a44489a9cb21a7bfc2e59ce613a1bf313260eaebb2646cbccb1bdf2d92ef0e28e5ad8470847b6c9201486be5fe632f3203f0ec5344c880153fe1533c19c61307001df9c0c2acb6f0a8d6522eaa9bc0bf4432df6f1c3ae1fc156611bcd1940a", "00005252ac5253", 1, -707386742, "68d3480514577a4fc5e9011f1a3041a1622d35b8843e01a459c4fd4bf8b934f4"], - ["a7a408310224eb3470d239a910ec1557d06ca7645e80200f592b592f1b3ce2f0dd716466b60200000002ac00ea8a71fc78dfa411ee53409d80ced744300513bd3044ef6737a99085750446fa93b412d20300000005acac5363533e25d2b504b78ce80000000000095252ac5163ac006a656bbdd1040000000008536a51515300005168acf9030000000008515300ac52655152d8375b05000000000163ab8ac82302565fa3040000000000000000000000003808325bece096e7cab0237782ece191b94d339b125ed53c5922c27926650b97ad4ac42c8b445b992e5f9a626ab6abdf7b412580ae0872f807c2cee93db87e0abd05251b28acdf0feffa5d34c2ec61b42c0f090dbab1ceaa4f2c1c292db23909000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007eeb87979963e834890cd9d2c2e978eefaac1fd4ed8315518a9b790f4549c360b013e989d209007653db3ba3abf4bd5138fc06c6ebc21508c8cbe107970847d7a64108fdef2f52a95e26991418a2f33014c7b730aa16eeea621c0542efc173c38decc4f1c9b99f2c7fbdf417059b89dc0fe0c0c55cc5f3dff75e01bd80767dce03187e7f19df2661f8614a8103bf447c7af25621d18426f0f73a6cdbecb7b529ad032204b9caed231c45824208ec4d3cb954079c30f5d505a313f4de629d49360d240b0849dddd656b41bc73043bae454f0510026cf77b9d3b3b9d477672b49317025ac648e5440d21eadf55b50bb66a691f2f5b0c779e3ed24a5e2462332fc390727203145cffd5fc56c6d6d761b1a4aaf6d7964247c2cf960b25cbe2a185fa6161e8ce0306399b299e1a5ff896c766fed4f70044bbb72867d763a35a6e2b120f159d3b66031c6c149374cfcc41ec3b2863fda78a61f3a1766e6ead10e3fd7a86b2b1b5ef60020d52b63aa9470488e257ef0f4816d5def902cf5271a4360e13d35e570c126e420207f9ddbfaf263d10e09d19f7aa5ea9e1e27c33e15d4e04b4ae71fd63fe0393f4b26996532a549a1d241186bccc5f7811bc69cfbc67190514b84f651ce5ef8efbfc23a5662de699b77c12fd68ab2d06ccf8495ee3a459b85fa6c2de842ee32431d33cc3e2184238ecb5e6c6e5febc4674693cc3eab5c88a5ed3e74b28f5f399a365e8dd56cd9d55a86ca53506202dfc2fc49299deca6d0340a2c316d213541fad987acda0ded1696ad012156261dc5da89418fe5b099449fefb7526b15bddfca92578553a486c39dd55d4f82e9842d417d42c00d2ebc580c808d7153ef2847b86eb1439de4f22acf51f2c393f95c7b4ce8e3022e0cbdb48c637344e73188fbc068cd4713573daf346fcb67692857d0915959097fdeb5242cd4be79cf99ee79ab78bb38d85360da01203e5ea1e27f70d536272ce67ca571ecd6b186722c09d1598a62912ade95b01aaddcbd20d31980d553f98f54b94b1ad6b7a12f0aa0b6c82a156dba2d2cab19fc284ac0ee10fd0d8cc57fe5081aef61e98b7f7dcc99c34ed90f4163a5b855a3bedbb0f22691263f7a97ffc1ca2b0b4982defeae3b5771db4ad589c79ed2d4b9687d6f6c792ad4a110786879c9fca840315e1d5fb6151b24403232de49818b64ac05567d93a3f6a8d945b75b567e998733415884e80a094ecffeaa6d372b461f7f502cf7e1e0602f13c747d4597590e960689d1ae58dda0fde7ab28496545beb5d77af141fea7763b05c0453eb3c5e35960533fefb2c91c038977d7dd34f7023831c5d96552908b7bb9ce56597546676bda33ea154472107c83f7ac934c94ee3ea0220b7d2686cb3579a62547b83077cac48bd9d0de006f4ce1f02bac69f554c0e6574994f33e898f3d39e9365612b4e1aee09843fb8c129ab14c733b012a2399d908a2f747cecd0fad8698ba618699b214cdd68a9575d4427d0fc2a4ac529b4f55f38ff570fa8f488cb6396dfb82de807c1edc6b8dce9cf07039fd70e77ce94f70b737b82b76a6111a9e6991ee1589cb26d6142f5f0f9af426442b379fa8c6d94bbe6617ac98e2cd1d37876dfb872f318aa944c7ec26a43cb7cf0cb96322d9b59cccf368efe1efa72e2da63fcfbcb431cd93000d7e165f7158c3fb600a7f3fd8d562bd56168f3ffbca0a9943ddc6d73db9052904166883636155156816c2615279b49f7cfeeea19e5f83ffbf19f1948467d3f6e8ed125ea5c6277d65f53ea8615b1d64136f04c58a6911a99a6ecbd14c7807db32e1648c28e3265314db7080029b8137d6824afc850d6594f871f80ede439939f952436d26fd665be42d0baebaebc9f1a1a5b863d155f3c121c3804582003d06175515142e6c79d4e2c3ef6ed9933c52927a1a89710f874768c372615ada8c64ba4fd65c586a4541066316e2063bfea6fb1a8b38637fe13a439820e6b6a34b4cf6dfd6768e2d76fe22e74d13cca7971445171d88acdf739baf76fe7beaa759d07bb13e66151a574f56613c3c403c547afd718a26e4e21ca222ae3049b31f6d72823c48c83adfd57c25e2dd1a61097fa48f072424f0f03418c5afdb6ac4e242b4239150ca7ad6378595b1d366698baf030c40c9b6731af073b8dd153c075515ecfa5522e8c658f0093e11b17e4ee79b30f28c616ec83f92c6f6585f332f27525d760ba54b9ffa49be9257c42deb48bdcf06ad629642c97ba482ba45058927862d4dd3686a7af9d60c675e96e867fa9db9e71201368062e87400000000000000003f964401000000006f945b2965cabe5b6c26f981d3a331792dab695dd223b87debe8025a77112cd0a6793de542b4568b90b83d3953a7050c2cec682023a9c00f6983f65fec3fc8da419a03c408ce261d8f080292d2a9f519380796846f3fc88d886fea10f5108422000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000846e8f4b9d880a8630b1350eed082e0f853e2da150a5a85be58540472739e7f53abe7d7a6b8e8b3be3f70a60e1b6f93323b037aba20904f765fb19bec919840c71de47c0adf598a9ebd823bbfde5fb68cdc067050262b9680fc1a75c0748c9cee28efa711eeffb4d1bba1850b5b636bf93a354133912a64d0e60636f30cfe2502225ad38cae465cc2d477ecaea77a37e1ccdcfe6323c65f2956e5cabcd55959c40204ac4d6abffefeb842fed4896df0b6839af96b2b0ce6c0e7e5809ed024fffc460b07e07a37bed63d167fb43af313ab2f9cc2b72bfe685c09f33abac7f224a9c003bdfdc2d62cdcc944592a7d63d18f7a3abd017ab9649bb889ac48bb4847fd404c022aa03e93614f9b831f3453eab284a7bbc2eee4b6105bf484c6a311a9f32582f7032a4c91ef45d68c21d03d6e1f6185f94406bc6f1e46f7ec82be4ec0b4daa95c2e03076fb6d2dcc7fdd7b1ff4af83020d15eeb7279b932b3a4c3fac13267e8aef5ff021cd7815f162f920508c6bdfcc218c0d145ecc8fb17f7ca2bba339c757d46b1b202173cc3ba676bfc252d9a86107596433441977244a472b245df3728fe02ce8361a2eb9d3a894ae6b1da98b2bab8f87f6c948ee8ffa3883dfb3f0b80f1e2c97c826af22c41e8cc0e6db16240b9b6917d2951fa1c47ece9b4ddee970c9ae85ef847ffecc37dd3f72a1224fc834ad891957fc76b891a2dc99669c4f1d3d81ecd0772cda815a866f46f0d046837477a549226736a5ea8dafd5e06ae6f6ff08b0148d8b228efad3e636f1ae29595a90f3ab111f04790d69e0866ae79e4491d3ef25a8ad666ec23f888c91c3fdc8d1528b7d8cb27b335a878dae45bea6ec71e1d1d00ef5c65f56a8bd07dcc3842df2a74bc70525947bb8c41a022d14aba542a3d626c0deeaaa8281750e647f265cc175e0d20c6030820f176d511f4538f55ee42775794a0d09321e863067561a7f26f17b0008391f40d612b8c1da45d29747e29f8cf3b4f2802aeebd1f2e47d91872abfb81d9954b3fbe354a51a4ad3b765755dbae058d51795bca6ef01b9ce7de070c64bd113da71beab3a5354b4184badc98a385e083c2ebe67c1bf379a4ed03311a2f84b6404014b78e5021a06eb638cc70781994c1c77b483ab803a77a6083cbfde0405431837d83ebafef5d59f8f4ddffcdc13e0c3d601feb80ed4815697e6047129121368650770224d47eb6b13fddbbb2b725068acab4eb3cf26dc94bf5392a1948427769c1bddf35c2bf7533de575a964d75d8bf3007dcbb06b760d1b75d12cde094ad5b5878bbcf5607a9502986087f3915694a05c3cc35f1edde37f1d9d9f6adb42b8249c2aebf7571842d0f3ca1144cadbbf1b6138f1670139c78f6b165432afccef6da255785b8022199c7a600470d43837e104441dc22c16752bd926ff117674bb44ee6c67ec36387f6053df4df6cb55fed08e07cb0b98d94a71cb4e16ae6b11d5c9e95aa0ed089d72c981c67ae54d6e75f2931c2aabdd9dbcc605e44360c10d4fd0104f365fe87bb20866719d2b080d3022a4aab5bdd1956f3173e04a32750121feb72c95037099d10cd11c5da24d6c973feace9ddf7ed1d72d13625c5efacdc52f4c979de2246cadd860df58aa5aab65001261a5ce3e3057fdfa1714f8ad62083a6f7f9a90291a7dce5b1d0882d804c930339c791f95259be92f5eaf4d83ce201458e72826959dc995659f9c7bb546fb1551cd6ed79f798759734bbe252aef1433c634aba15b9bf44278d8861b255dfeebff8e86f88cdfd5adb32bfde9e669f2b31f078d67ec21df4a92b5b1f91081bf7892bbde43a15cc544a69e39c58749d98950d9a84a2224393e559e937cb145d440ebc61fc04f29271ca9d7a2492c7916201e321031ea0c300e2f2e31f51eeabe28a2f2d8fa744dd3cce81ef37c4ca2e7168098a8b1b4935dd2d7e2ab52f6e754c30717f1e5df020eb5c8c89ae37c0aa9847e97028de948ed090b046a6298dabb3c21914646f1fcfe57d63fb7997f5a05c814e4d3ed978445b888462ec014841f14b34f5b7f33a2291afcd536916776e647a5b96cae6e0262bcd81f6d6ff075dd2d8749b5d4d1783e9631197e7076b27958a4ec62825d13a1b352767c5744cfc8fa59e8cc633a84d79865af73b450e33af343e1e16fc84966a7189f65a4a7058a79035ab926e035b1528752f259b1ca0c89a5cb9934cc8505998164f98dc26d69156d8629e86026007cab4ca5e4849c42f80475dbfeedc5eaa53fe791991a29409d14a1b4c682e7e4ac75ad65b4765a0bb6f3b423ffebdbded603385d5a83f661db31df0e0282f1177e38b8fe2c7b87e8fb59a94a096c5640163be342b9852cfcc8befa407cd1936c696eb560146c97329962b4192eca56ed24235a0e0931024700da72f908bf9e0646a53756d4a7b3c305", "6a51", 1, -1644351662, "71f68734362eb22f0ec786bdd70806653e237105db6c42a0aaf527baf58f6772"], - ["4587cc210412522bb6f739c47970e6dd69f961654cdc6ff6a336bcef86ab9058d2874eaacc01000000025253ffffffff6706d1b5ba4f90fbebe568f7e7849360821e6a012ed991f377dc0d9da57096b6000000000565ac6552ac0e3bdd43307d1507e563238ca8cbde145fab533c5ea8e3945ee6e7a6388191cba8f83538000000000465516551ffffffff7d0516739f6dea3e7e0ff7b899b782502c3ca0d4c520592ccffb75a3661232000300000006acac6a5152651e1ae3a502b6e6ef010000000003516a517a8c8101000000000865526363515100510000000000", "5265516aac6a6353", 1, -488915631, "cb945917d6dfb68be69f22214ae053e039e5ccef3a2ce8c3b05daa7d27817c37"], - ["4feb672501c69f8d1d704f3af0a86878c2f3f4550cd3a238ed534afea34a8a368e0caf151d01000000055365acac004741afb001ff63e00500000000086a6a63636363ac5100000000010000000000000000c655370400000000535e95df7213d68af0816c00eb305da587ab8868fb2aad18b367d70b9f25b370b7c5107ae4fdc9b4294f1b430418f5ae7ecfc63117495581a8e13d4b1b1d18da9ef530daeed31e9c58727ded891680fc3c386c977a102b4a4a635fb38dec68aa00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af214c680007b6fe91c63a196c493977d2f9511c62b18a359ebdb11465d82b85e6cbcd843853d24413e41249eedf8021e6988eb12dcafe7711934cc65821481ad4721e3b2d3ab5ac9480048099a4ecb80034d06b60cdbb6904304ada867d0c8e66fa41db026c7e651299ed2ed559e40e8f227c0fa4ac51894804e8db0385e537021cfd13167bcac443fed0897cd09a594eb0267cfeb718a6870694d3a137610e2202110237b2d60ec3584db5605a5b93e9c79b7d7d443464c8f833e291f658421a340b06796cf8d46ed102d285bf7be0ef738c90629082d0b8269b44e52280dff88e0f44e29390006eb5a3643747753291e6c83ea9bd6b2d4c9bf0903d26a36ac0248a022b1c021c04e22ee2fd5118a7f0b6e20eec2a6ebe2c47e1f04e6015c97daaf1ab02248ccde7e46fa59bf4e5620b381128f1bbeff1830d7b95c902c09c7d7be2921402187c0d758d95bf63b2f9ab7e3b3dbac50d0d0c45441b6055ceecd8fc0b9ac476030c6fad19832a9c3e9f1e034f01f1b2af3caa098fafbecf41aff55240005ebb95030c023f7046363e67c38ffe8af2597e7aea447a4f8da60ef6e25237357f17eadf83041dd7a4348f92aaa55bc091e8ab9e07a0926bd84de46420f71608fb5e930178abe982006949319624a65671e342eeccdf597ef90bdef85acee6d4faa9549745cc29654aca3aee44dcd5b1e0486ecb7ad23394733e2945060db20333da2a47e75b54c57a3d7d491470c1738043a6ee5076e26bff62a3990adb859a68dc2e60456e526e75ee88e01725c4ce6258ac0b60b77c174c4408fc35ea431b49e369083c309a8f10e1a0afec9a1d8796f999dc3fad5bb7e58b0db91ea5269006ef6d124950448aac3576214c951e9113f970615550e25071451b6da30970bad7686bc0dd47b23d3251fdcd0adbdcf14a5516890c3fde56e5e50dfa9d28ad7c09f5dceea4da9e17eb03b894474e4b078e15c6ea3f0f8b861e337b3ba71b2ed15f17524ae4b97f7f4b750c87859bc8412993fec644ef51480ccdb96ba3c5f1002bb043b6b870f5ca01cb4a5b4b8ac51892089bde2deb5792e4b8c11517966c7e84dd4a2a4f8d165f85bc2181e17f35118b6db6134af06d351331ed36a3aa9e3a580c18a1b51f2ec478acbd1912bf3fca5e13eaac12212b244667b8dc93cfdc5d7b42d5d44a1348da3145e6e48412d2c6f123bfde5069843f4878e9a3eeae2b78f130cfd58af4fc24fcb5bbb44bf47fa80f0077921d13ec3d29b3a9967bff09385341edb2e5449caa6c093dc6e5d4085cbe2721d7e6728b7fc4e6334834ddd534c8f3341493f4530eaab37feddb0bdcdfec472078c92adbb75644836283ef6514d9695ff0a61ba1e296dda28d79558b6b41918bd7610b9a6f27909d206a6fe4854aee3c9a21b11336ca20ed836b17db0124660dbcf66537ad7613670a7e6a16caddc2732e9cb6eac305445ab0c961f3b98a2147cda394d938032333368a9cfab8b01cc8f61ee174c8ab14958b870fba174c5081897b5b13bf82160e2e36a4d45450c82f6d3726b45f317ebb6b2675d4ad32beef00475dabc75ede48e474afb9175473266e44023fb71d62beb46cd87c32c64cb5a24c62901d5610fb973bbc21dfd78ff735ba70540e00f2e13a16a14b7cf1f408019623d49c4df9118b0ced6445e5e42ba8b8f243de98255cbf688ee285e9e384ab6c8a070aa37c81eefa426a4f03aa4cbdf953c92674354a29e0496921cf9be3ca864f3a55978a7d4038859ccd786de8e45f4aa7e88756d9a2d7a15a867fb99368bbe9f221c177746410d444e6b3f21ca867b03b1745f9c374f7426993f55f4647143d499b5b266e65fb4d047de126409e8319314c1a3b1f0a4d0f9bd69e35a66952de06e06b726078b94f3683d8b14cd60714a0eadf5a2f59a867175543065fb7ed128002b594d97d04049ff7231770afd1dbe741c57cc9731ff8de4127e5521281e64f2d6b3f25a1b22539c252e44fbc1df2eb6c35dcfc860e4e8155fbcb61e8c8b2f20ca9f3bc1b4d3bc28c5a46a4442efd805c092efec75ab908acefb4954462c8f1b7c579fbca8da17e51a6aaa6a50b42225252b2158360b62f419f9f079cc1483b9fe9a63755aed641705d858e7c9a2563efdda03670957348899b30ef3e921c5d4c021e0a501a5012c21f39b303149b9cf09c52468645cffe43a6dea997400f695575ea95dfc439adaf7d3eb65a129d2c0133fbdae3fcfc6a6e75c4e9901e8df262a84cc3c8686f462a30e368e8919705c02534d7da5be6456143ac7569faf7ab62f38c9ba6132204122bf36aff29c8a79c393af4b1d46ac84af2a76a52f5b2ead4266657565c8802f05368f0086b63b0782714ac2de4f033824dc6c047792acdeebefcacba4eae2bdfe797558230441ed072206c78e6400d33aa6727729d04", "650052536500526a", 0, -1211196861, "e1334257290d0d2efc2a56b9ec22633b60e47d3ca16d90093841ea5ae5e366d7"], - ["030000807082c40303a31f109845908705b9801b3a6dbb0daf3dab90d6268acaf2327b76b309050d0b03000000076300536a6a516afffffffff25ab15f4056764195de8ef52619aaf84659b25ab61e3dc80e651257aa9f12120300000006ac65536a6a65ffffffffa9b5a5fff80118585722f6b72108a3c563234da245f9cd96648635d12a8e05d302000000015251a8437401b07f8702000000000365005300000000754e166c018dc23400000000000000000000000000967d919e02427aad7bc426586bbbe671b04b2a85da8fe23b3de67eaaac49f722d206248279fe0d6617724111a6b1bbe148f71d5d4ea72e10c13de3988a1c6d41d2e226a6e5b52cb2a2d07eafd0bbdbf71eed4c3c654168be91de5f6c4e7dbaea00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ca50855c227122f214a0685d530e0302d079f6fb5c3f9f3d6b4460cb9ed92ea373d2152f9566e6b847879a0ae50e6fc9a9535b5a3a60cd24eea36d2a1239074e92a9c6cf4528b322c6467055e13cf35df7b9c3ff7856da8fbb7e2ffea0e7fe96ca73804a531d116339dad286203474d987212e4185c1d9290ddec26beada5a03022081bda3228778fbe4aafca880f6cfc4154b993c018111841a6a889a5bbdca9d0303b3039f2e3dbdd04148304da7758ce26dfdaf1ea28b412880ba344b411f93ad0b047563d7c5a2333611f3d97d309e4d9f19c89c5140d35a65762482d25efd755d5c7d3b838f23ffce9828c0fa0271810698d68b7257de5af777ff85fa1abd6c15022e7b41d94f21edf00528322c8f3ffae69876b49c6788a47140f6b989a223dfae03276dfb03c2487a6bd0db602125d5f599a89c3ab13621c6070960566fd7277ebc02191cc2ebe59339d167483297ad91e9f6e7e36300e900b5b38a38e6d5f7ccf7d4020d2b1f5dd189f93d6be44fec8cd15f548cf05de5a7e35e2b15c4f45fcddb70ca031c6d916e9b292d619e76837781d67549f3e7b5ce825360b370e6b7e7852bd1a23caf724b3572682f121603708d0d48d33df344209b08e76fbe967870cf3a250225af7912ef9b13ca5493cfc2ec9d25dbeee78d8b4f0e554ca2e7b6b239be38d4bee43f403a1941e7d1094b95b4f2db9f37dacfdd80b3d41d11cf596d329606a97d6533d70797199ffd5c08d25739089f9bb8290f0a126b1973a558dff473871ec107edaea421d507bdadc0452089520851ce8bf5d9c3a13c9a5b810541a4d00dc45b0baf7c30e7ed26557d613e2ef234a99bce73e160652b4ab9fd2a8f17c644b4b98c6a69ba8e1199f9463cf13e5a8e1e2652dffc48806a3c2aa665116ad0913aaa1f10801a86afa12704375e76e80d0beba35c2e848f8e3277403a606e65d02361db395275b3245fe8822617affa52fa9fc1baa8d4073d754d1af1899936898ccc074f597ef0d6d6362aa4e43e09ac9af1d0254107133d485b8dc4c8d499184cc991180d56c5960d05699c4ee9354227790cdd93378f17eb3667553574b78ddd4241c0c9109dff1f07d5db4d63fb909eebc896865892a67867962ee155c1444196df33212595a81aebd7f929d5ec57c83737bbf6070bcc7c0644cbd73f082344348385a234f2ddce35bc9342232ce029e34cc3756c3ff7e7c2fa82900923e2914dc90269781961de1f8bc10be6edffe3e005e2040907a559cb00c87c514b47be59086b66badd7e88cce07039501b51a4ee2391cb6fa84654c04127faedd33f615a8c8dbe17545a59a68c97319e02bc62920e5fed8d82ceef0892bd755d8930ec23454e942dbef93643829e524e22d149d14f8f95ac01aad1bbcfdd816b836b85743846e9ded579666c4f6ed9812c6d8f062bd9a92d2d67ac2f1e524eab17178556fcd2903b5befbfd7ed95fbf8e38c7cdb6eead7b263eada12e6f0021220575bc6f27816662acc71bf189fa8a1205d3b1b2b7ec8b7c749d594a7448ef0373f3da2578ac398a6eae63617bbf17e51b8b9652d6563c73c89ef89ad42a59f1c309e04cdb0c235652a5f770b578fb9714ac32233a274bcdb188b8c0b15be5dcbcf816ae0828a2ec0695685c25b07728094159ec9e3921e23d64ef0a840ecec122de3473722ebec195ffb4e50a5163bc012d5154fadb61cde68eff121965283938ef40273ad3a0b9a035e6d3826228a6a1b3c936f8f105ea754b97d20fd02b591b737450740e0b2de88332835599f7b3a83c039087a403e39b495b5c70dd649dc226b6b9f9807d00f4c88438a15a3f84c3c3d5e53ab0da792738a666ec88f73befbabd9ad0dedf11163363e12002e3d5563cc173f4cd24b0bdfbef1a058f355bfad361abe284cef5a8a22c062d041df970ccc9fdffd85718342b90d2663ba08d6336bdd6f38381a6b1e7cf058d66d66e586ec7a799f96b0788227b9f979bb0fa4c70847deae282ed32311afddd7143eed5d7c26a3a784c13f022365915400431f2620fdfbba1f03854af1eaf6139a295a9cb1b0ed8cc7b47930fceb50801740e2a5e95848dce66ed6b16a468952ab871afe9dee5a9986a8ef03698a5c2c8458d899ad41a7f0bceb3260caf4430a0c325fc276095cd97e7a146ce94b2df5cdf51d5169901aaa4c45a0a13cfceedd1b0594db496c8ec81afe43aa796980551986d11b54c0a3da7c344341f65deb308ac84595a4ef8a574bca69650a0d4b35e740d70c38e700440b3775fb07f9cd5a3d5434f5f3737a09ac7b1cff5ed5e5cc1978d7b71c67d620e256437ae90b46bca1751f0e7ff6674f113e37da183e8bbb997b2933fe0c1e2a39f25f5e2265d868e5bbbcbc86ca1f024beb26033f392c2a6782b22c3006ad9272fdbc2ec80d44c65293da846207", "515263ac655165006a", 2, -809004528, "51ce68a5beb4ba1b639668301fae2cd88e0c58e44d7d70f5dce4e5912fbcbd19"], - ["030000807082c4030339a6b040025f3ff147a8d3bc21b11934daee2e85a7577856dff7429ddfc4883f000000000151ffffffff2f87b891ce87a3f7460552611a000fa7137ede6a5e8fe9499cf27158445ef33600000000085163650063ac5363ffffffffee5ab89613f59821302df260ddc0b56c614b2110e0bf1f748d0be0b09a9ad0c102000000055265ac65537a07738d02d373ce0000000000075352636a6a6563ac7cc40300000000026a65d2a0a256ada04f90031f619a00000000000000000000000000c90480dff57bde8fc2b8ac082097977730feb8f4f8d94e10c10915b306fe9aaf27a21da352900dad176877a337fe35e311254179738cb4fc9e55938ffe47b335f8ebe640bd6811e2f17c0df33204d89a93222c656894e0500aaebf93040af1ce000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004ecbb7279adb4f4e0cb669698133c275d69ffef9c758b9b12101e888ec0c3dd4c99ad374e9871c8321e76118e0a460422924bd09104272807fb0b83dbcd9959f3baf16e439f65c9928b4b1e4352d2b3e273e37ecd6496a8f115e2f47ab0af5139b994fe749c891ec146ead70d9856daa7f27a6c649b81fdbba00c86d3de1fdcb03187af48ba1c9e6f586bdd3bbbf48dc0bb50422176baf21a61924319057548fcc031da4f2b63ce0e5f8be2e42b6b0a156af939c4465b2a2bbd5160d38de81a441160a082003f2c0027a9a53f51fb117173ba1776e4c10094651b3cd92fa2f2befdfb934bf86714a4bc36ae0f1d35118c5ae9bd0efed40d627857e24f705b94a1fad9c0210979f5cbbf173fb83e5f8a5cedc6bc388c4d406e41eeccf81a8ba4d20e289e5021789bd544c6b56c06c7702b502a2ed8cfccde971679060f16acc9f19597ace79021794add067f1f07aef2a925f72effa198cc375b99ca3122dccbb68b8ad4d295903179b20beb8f1548ede2a7d93760ed6c80f9c56a68112af41374cb82b28e58c83032204a8360d1bd262b9928d9cadaa17a4d36a45055de9b6a10053268c75bce88769b2ab39f2a87d1740770b4d8c7ee32cb29ba21b13f141af51cffd0576711c65cc58b8c4c88da4dc99cb5360f05caef6ee295aabb852c901781a01a14c8393b1a9d65ee818c8c36d939cae9f6879a2dd7c1492fc9d2950c76241d72986fd076ff4cca4e8d8b7a96a6b9db5273b5476905f1de3e72b4db8cde2d6c9df803f1befd870405955ee86e76a5540893db660bd3f985e69beff98a0eb304a1cf813d455a5ec408c0fe016bc752afd02bd41f1f62ca829f984ff4876b50f45baf5cf2db6e77dfe262e57681b7b489000f37248a6699f389e7297d978cdfc0b7e0fbd3c735cf0356ec99a1e1f144d3b900a70537692b3025af6f0868ab7813a36c4286d1646edf7198e260abfb2e707f877e64435e6b060141317b905d335a6ee1b5e6b948c1cf7eec5faa1d7c9b31842b9f59d05ba35119a34b1c1596717447a62fad985a07dcfe64cb3a7e1aaf046f8b5a3f36213c0fb22939c2f51cbbebd3611733e46f28e7ceccfa033d5adf76029b86ab110846459739988019c8b3c4c8f7ec449bb88851aa9bdb887b98b42d1bf286942ae63632c1e58953765eb62ee43bb03399615c89620a0c683cc2ff94e796c866c3981f9dd07dc31c8b7374b460098b955715c7ddbb93fe6a2887fc3aa40220a9a42b8a33b51bb24bc46bc6a19a0ff14e0e69efcabfbab18d9c6d79ec2badae2ba7c8fabe85b7cffdeb904843ed2820b7afa04facb8b3c1788dee36f6e0f6fb85f68353829edc5b0898731a279cfdaed3864bb54768903116c9566632ec05e678e2bba42e700af03c3e3793ac7bdbde4424d201d491763b47a8c896d6aea27ced9ca8b3ffee7abff0f676054ea7265772cd780f37fece6451923d3a6a7a7783109b0b7beb6d02b1eb725b4dc2fb1ffcecbdab8ab16aeee2d1d464e760075b47b3df648d56c19dca9da6bdf134e965a2af76b3506be8bbd19418bfa8cf6678e4409726770eceac16f9d4ff199cad809051ef505a89051a634d2f757001bbd87120725bd568d14da73c4a74aca81791886bf82af0faeda628c27631fd1f31cf6c13995071567b0a0d4f8ac4a4b9f5e756d58cf125065a421a4a23ccb4773cf86aa59551144b9da1c8771c4c094ac1bb5548bc9c25020a0a97096a0cd9ec87b58d1619a40960a461b710fd78d481139a1c89f7f2c9c75d9b005e65cddf3c666f155bc6f2797324343ab988378163e638aa75930b5f8de09b43cca727af67617369be6d73bd6e3c4b2e45f06f824d228f6239c3d78664332d0f8ac791e94713dc1f0f72fa0e5bc88299964f2422b5d1a368dcb86a33a38a8198d5ec8c6521621914b21ec5d56152aac1a4ccb6d551a74daf047c511dea8789b1f0361591a7bece8b8e92278819b25bcc6f28ceef7347a5d32ab8b45dc8d9da17c8e141bbb0b9a44f2260006f5126c3483ef3466a0a4efc2238b32bd2cbc1c202e704813ebe465a84c339248e3da4eb4ad37bfbc4d25a6d98b4f0b1109ecb4e31bb7beda934233dc1904873a9e4cf1fb70544af653fc8b957573b77429c8f863880cbb30bea39fdbd45719c4881940715b4bba184edb10ee374283436e6fd0bb9efe631866a0a1d166dffb4fa4666a33579fb513095fa1c4ec46bf00e1b0159d5debc8be5562996ad8f471076193996972dc4a933900b312963478b7cbf4286eeb00040231e65d42698ed2ce4ba52e9802000000000000000000000000d9f7d40fcfa3952f0531fc0359aa131d8b3138c040ea215259f823301d0de16168fa4850656237c529c9f3220fbbcc0ed5139c947bf2407ef3f0ffec176a84bccf76ef91ba87689798671d1c36765f75f5ca7443acd329294428c0d2dd84a1360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022781a84f77559b8ff76c35cde40b42055df6c3791d20365c9d4e8a30797303a7bb33d83afdd651f67f08c1672ef8817decbc1dc3a71da1b48b6f82e2173b7d3252162905dbf5a1a3eed77a27adc69abb53123c343a14ad81de91af6c7a644d21afe26771d5feec641c606c3b4604f44670d836685f580e470ee68ccd11d2476020d67d5191c75d4acc8a1d6712cfee832b060dafab84c4390c313900a91c306ef030bba1cc5042774659b9b2bfa884f50821e6cb4e481dd551537d699c0de8aacd20b008c8c98790e39e11a3e0f382499f360a60c3083a018c3a08c5982f1ffa2c57da32b7153714403facf25ba44391b6e0bf8f14de9375756c26a49fadf350aa108020c2f2de3338543c6c6460a3e994da04ab2f3b61f82cc0f9cedca33867f9571c30230250a0f1c42923b0394f22fe9a143c9cddc297a561b219c0f382c4d748d24f5020d035347039a50bd0393b4097d89bef1284d933ccd487864144e49eed78735c503121deb32a46d4b672642b1bfee43a55d10e60a98e301caa68e49aaa4e565d451021981cbb6dc5cf5ab4fa36053ffd33b9f12998354d57cee617a419729f5d2b644892c78816ee2e1e6344fd5ffd8e64bd441eb976a834f56f18e9f202c0fb3e588e76970bad7d87ccb307d5bbb1709e536d52dbbb0ec56db04661b3777637b07eb71d73fe662c24b91d2f52070ab491702fb5e0adddfb0cfe1bad878a8be5fe77ffa4ebcbb7807546083e63fa8b546324299cd3cc445cbba135fc3d7936c126d125645e845e1a517168401fa2cbc6145f396aeae353820fab43ddd13e521449e3468b2551d457043904c00dbcbda7a632c69c306ceebcc0db377af78a15c23c2e68ca8f9cb3e33c9c9aacd4c197382a9acaa14af413ab9ac793c1e96367376c1ed77d2a1da566d6a16abededf122f3622d9d78b05f476684926ec3dd6113a40a54fcfd7924a4078576e66f6fe63ebb5dd5966eec2737c53511fb0329feb9636c6f89507909e6f7cb6aa7613fe0632e45d2a395deb8dc5df8ffd089424dae2c57536c9659acc0fa0835cf0556655716ad5799f9d02c940b28868a028bf4236ea3a5242cca7481ef6bff2231d0828d68c050526b2ebcef2d3d82d29fe78c962a356e24b63f3443bdc1057c230104b4033ca5e647a55b2a88c5be27f4c5b79c4a8446296102aa80e036f810fbea75e6eca38fe987ed57751589dc465fc75351011eb4130c22ad51c8d4c763e0fe7fd080a3fb86cd1872d3533fea3c1f5f8ee6a7e27bcad01f6b563d090aac392b606ec723aa96b13e163cca498d15f22af2f190233a5c09f68323c3662337bd89c4f3e8f88f6d03e3f8ef0a804fb8fb1b28e467154a6ec38119a21aff166da018ba719c3ea5de456bede475c145ea979b5efd99ce8d23fa931f800e4f7c4536a7b3e82a1f6157f80171ec3a569a83ddc2504f52ecc6242f2d4aeecb0bb364428a9529fd441d362f75d7bcbaa2a2bf56948be06f679f5dade7d87910f99acc3d978f4f5c2c4f49e230c17f9b95779057094fc1220908bfcfbc19a0ac5ce7a6712b06c5a01901b5992a800c849be1c31ff4833907fb8f0a3a5a685b7e98c228021e36a6f235504214b76c1105f5b2badfe87d5972af38f0be9aeac76f8051d605eab09f2b8d5cc6d2e551c4a72eeeb45d701b567b4607c946dc0f03c18f23f6c6f7a36597267c46c2fa9d75885f5881ccab414c8411e87c3c0af7d3a0a4e214166ac9d6233e19294f199dddc6474bad4d2a13675b861ba59d981720009d38edecff7a8ff2bed58c91f794de6af2f8bd1a16c9a16aed70a6ff7d38157eceb380b1db362cc496c93059f687cd9afb46e8e10d69517165a542c55457dd796f84beb69222d8eabac9c980bec0c6e5cc7d7a62bd013597973e043b33c7724b26134dc6e910d29b4f4118d538f7f0a28c6951c03f1ff4eef8fac37f63e730276fe2eaa98be2ecbdc04465d00f4bd769d41e587704aa63835c7f84b2f10832c95d2d2154d6b25decfef1a76776a101e556c56d6b70e35b98e7c26024f8fd8be3a7337d340d16cad09c5ae23efba3d78e5f5a066071b5e595b32562db268e92e4f618c5d14ae564fb98ad8e8f5ea13d83b22b9dab507f3c3a67dc439e3ce316549460d3c702f9d933ffd0676ff89b2e4350635d2a43058fd43aacc6c455d135b71c61bc6eabc10b490f5c18f1ff62fdfe5af616788745f1e5e66beae82db80404922e16c34a2c26defa00ba7607de22e71a52770263c0b8d88a84af507c09a9248a5fb93b9c95b31642d3e80a95f01e03000000000000000000000000dd284cc57258dbf2d62a1e01967c9691422579619995bb33c7ed17383a8211f3cff236f25160e99f6d55d3faa77677fcfb5ed45bc946fbae983f3b885d90f7b5ed24b6fb44b8a87a888deef978cfb4c46ab75b2273a99ac8da3a57312748b5f800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ad2ab502466da6f9a7660f4d29d180036abe5af3be2e3aa673dd0fd1304a65e226661d1560ee00b11b4198ed711641f0cbee031bea40c9df0dcb03f8f3b428fd330b0c844cf173d7b1f7955c7e1138fd3cd7b805301efabed670f67850200b512614dc4de2e3562d07ba916625206cd1d76b48a6b72365aa372ad243f470b649032e80f78fdd601591b8c52292d9e0734c8bce14e7b8564f58a6027b4290d1ea1a0211c5dbaabe21b707b292119a3e458ef7f0d8c42df6823dc08ba971c26cbf31e50a00632ae684a1e25b62ffa4f755fdc13a93c2da93b1104ecda1d147f9d14a5117721e6e0395c6e6b7b3307328f4c8681ef28819d85fdb3644fbd2f1987a711abe031e94f6d3145676674e0ef45e84912f775b9e06c41559fa5aab93f9a3c6e448df021a04700d63af854c299c2ab9605b8c4f097d358fbc5f9adb722bd18fc5c7edff021c838bd487df60e9a656641b08d3734209f51e40e2e85a9f5d5dd65533e3c8e5022f702eead3f3cb8038decff321b608af54e9827ced16d523ae8d7e1c084048d4030106508c591a12e9ff5cecc287ddbf824f4311e0f50c074f38ed4c7ae191974c79e64062ef561a2af8e093b1374c2ac53716d6c33c076567fd8ab42fab21563b19ec3452f3a717b5182dd71c6f5e334a8bfb56f741cae93ec3b1a3dd1e964e549e8d3966c2725fe431fbd62b332be4ff2c2a5daff16bb2a4328ab87e3a8314fc918da80a32b631b21e77c9ef20fea0f016fdd79e5d91a197163940cf4342cb0929423ef40438e5aba912b1ff656a5ce9f41033158c73d2c36f3659354bf9879efbe78961af27b18fbf446275b6cdd66da1a67e6cf8323aa388eba1fe7e1249bc89b9fae6902aac667635794454a1ad8b19456c4a2cd530ad1e1bebaed44c38d15149d207411ff44f5159874f4f0bb6f772f952c84fe6859d0db08b39c92af381390c038894858f449a9e07253a12b20a9103b3183adceaff540cc0525c45796f12b10e861c4cd3ac9c7287c87796dc7fbdac3d6c56e6a23248b62f42b59282d441d3907590b06eb0a1914e681bd8477c263d503bf64edfcdc441960ce75ec942add3c254622cb66b90e8ce56ad41ab1ef7b7e561cfc4b5f5c31d9077ec8954332872ee18c4713212db39e861962cecc96ff88793af550ac7f94e6bb12dbaf10b71895fb66bdba6a247b015244d7739e29ab41566ea1b66b527bde850a3819a3ee15aa65fa5906fe75910e9262da92b0477844f5378fdf133441dc5156103a33e35aa839ac8e4bc2f6f216f774c00d6dbfb7b0b903185af9cdc2fb84a5ca5b316a09a7a3d2ebb444dde8859e793e1a2bf0bff71b68f8c3dd0beace4a9e745b25a2ca5bbdd5fd754cd4552d2014b0a43c64155fc99617482b410008fd87ee81b943caf8589c134eec91f463529514f7911c296a27f3880c16da3021de2d272af70676025b598ccac4bd66ec5d4ac86e9a8f7ebcf5bbfe8de440064e95a3218b5fdc22dbc040948033d5efd4c570c4db47899a62d108a1c5b4de9bcc884e9c4cf62289b226b0d0f5507d1b0bfb87be955a806139df54d4a243a51cf198a743e3f841c706d91dbe71007c9ff581aaffc0ac52d0a75c915c451c1e439b86989e7df3ac51da5b8fd248de0d4dea499fa5dcc76a82741b10b2d87331b396d27334524a9c3ae116e6addcc44716b015a2f70cefaf70837d644e3b49f2708c354d02ad91b18d32ce47c894bcb0d5d2d2da4d9cb5f57f35c4166e04a1e6b35c3d69e3d284c052128ae759e43f7c7b7314018af628123ba406ffacf591a3122d7e1665d1139833c61bdeb4412e72d23b24730fa74611a31751cb4d712c7e77f47456690c648f7db7734440666ba8d61af9e9bebed6b7961a8abc899b33f0be5c5dcb6705114d8f66a17de62f37098e99985970587917bfecfa848c13da43ed5ec5580e940cf0e0c71807ee1684d3cf08282aad57adb346e7488f18bb3c5b3aeaf51fe71dbd0d372c548eb1944d50f7bfddff53387934502a45b5467d49a195ff0605e7e41461a4e64e4433d41a5abfffd9e33d07a84d3304d9bbe90631094644c7b2dc74431a2524b8febb15d74183eb23289a5d155c60a13c686fc8e1421377db5aedd3afd3efc155fbf5b29dafef3b89641894e4999f46df4aadbc831abc73553dd3b553145967f38efdf293a195a7888acf8fd25751d14075215b64c45db112ee1971101e0cbaa9ec1d821716dd5c38a21ddfc87535acad96aedbd36d49be77d7255ab94d35b5728e9f0093907c63c134ea1c9714367cb0c3e714c67b38a59f47c63695019f8fe79c8f31516b9e1727c7f38aa3446ccfc757f5d5234c29470253c90b13351c25ce12aa1d44e76f964a5e6854b21f6ecfce8a45bcfacbed43f83dd0082cbdb9c063791d574d5f553575a8a0dcfd46303", "6aac53ac530000", 0, -2009538034, "d72dd7282bfd4a8ab9adf78c6fd2c3063ed035c49c7ecb3c4d0677df1adc57d7"], - ["030000807082c403017bbe240a1e04a8abc3395b2ab8a4c1f1d07e9157f0c784ecde5f957ebba462f40200000000ffffffff02aa766c0000000000066a00acacac526b8a3e00000000000600636a530063bf4480db2c62a3330204e3d801000000000000000000000000f41bfff7cb1cd95da43cd0088fecf6addd372a870bea4704234baf30518429728bc78d9882bddf240945bbd6251271c0670d58332253b71b8040c0587c3353a246a121a3b9c593c6f5a3d864d54e5c306da7e4a118fda7e0a09a2980a9100e8500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c6a40d5b990a7bd668ac817b0d3600dcc7744381232238371d0a71f12fee92e5b3c2628dd617092952f89de8d96711dc64256c3c73ed8134cff31966c9b24f1d70b2887fd8df02a69ebb755898e8f2ff0f06b6181c02b24ce7f9376feb0329aa6c2e5e6163f6573c2d5f49cfaf7ad2a8dd9d53665d9da93c4b847dbe7b58e8fb031622e838bf3a236898e583edbddba498b4114b7a1c897620abff5c497b474d02032e5010f0d682fc03ad95c4f5574354a9c4125816cbd0505097b6f0f2462ca5280a07e2dd2e87d853405e9bee90227751b395a651f9d6421e69eddb989f65edbaa68a0376e12d747bfa3be98937592db137f9db4a6a40449813c051c1ff41c51563021a2902084e68b7c8cafde2da0a342714d636d4210d77e95d0b1ddfd52c9c5a64022a7ef4eb0fdec3b3a8f0bc49d6f8f2ff1eff1a9b00293efe3e1fb4f7d117cc730309aadcbb06d0fda934a365b0106cf221ee08f70435f793b6f18c3e221d4d5b1c021a127d1f68052725b4a6cc2b4d21f08814fea48a4ab162e664167585feaa5d85030490e41f3f5509672a1b6e8088d0a1d18dda54acc4a4b124f3dd636768b296b4df2edaa7c0c726bdf0b7a07022d211b09201c5a82e36f5a58e35608fccd6e4c050d1a4d126680c865f36b3f488b9c837d736f344386bbb977e9025fd67006658f682113602218805c1dfdef537f32e54edddd74b8f331114329943452cbdcc506b0e224e8035df4e9d00005aa10162b6cca5b12003bcfabf3f4436498641a240a89ffe9066e81716b4705c44986ede82c2aae29d416bda75d00a4fd66f9580e215c9af07f5b15cce48bc55ff14b574ad6d39f9b2a3fed39a05317e7c94ec6ae2dbe1ac4f9b158c5a7afe6896421812e25545196b9bb228bd740b2037514ce1e5ff171a59888204fa42009a4c5f3967dd5f2fbe3a2e1743c18d0d484800cc458dda256a067b34680ab952fb4f08b78044f216830f3af8fb0ab64c7c7dfbe9fe7f22af5172d7bcd35e925587e17d874d87c322337130bc6d31a3f43ff100da350148f415679520ed830b05400e2963755c4b5e18755363a52565ef3bef083b593d9f18faf06d6aca991cf2607b37c7431ef6722dd827961b6efdc9d399b5062d27220832a89c8aa44b8cf7dfc04a99d4dd330743f3db170ff30ebecfde8c9262ad0bf9dce5c6db8d001ecb7272a2d3ddf4cb793b6781d1470d74a4c9623025fcf0f0692021d581b853980724a8881575c9dbefec5e4ee55f19799835a9d444b76692a8b4f7779778c75e556eab8880f5d0220b52b7fc70f08b84fedec1b1cde7ba76c2b5dfa4bc2cd814351c5f01b729ceb0271905c71e06deba4bff4125d39357bde5b6fe15d9f2e9b6e464a94bc6c4fe388eef352e1231bab3fb3c2d939005afe6abba34e402aba99669f7f90572daa85d6c58828e6d197da4700fa7454a17429823c2d71127eeabb36ea8b90c4c0d0f628896876bf7719b9b67e913f60ca9c1cf19ee5e7bc2a35f28a756af08c6772af5d90fa7b37d60ffe9c449bf50a7d36a74e2e770b25164f0386523a174d31b25f7c8bae926d04dbb2d521fa2935ccabe6a20c22b707a60a08e9f19cf889a5854516e6c0c1d9bb93059ab3ebd990d10d9e11954b6dfdae9648defc3ffe762cc811340ebe9411042a9d7af517c62f048ec6501bb1b657678ddf7a0800e5cdbbfb33a359febdc399736e8f4cd952f03b401e6a0f27955f7eadd19b40845c76e5be700f3b2f10109250f8324df9cd48cd4f76ad2a487a60a0fb46a34bd159668021195fa6769ef20dedc58eb8e1482263677512b496dd8600d8b9f915aeb09c5dd6c1e83e48308ea86faa81bcadbc7d1c5eedd34746eb7d911e7ee2f8d8d7e868d1211903e7bdd0cbb9f6d0ff87ecd2e598af114a24db4396b52ae1bad292cab1cd0db19bbe0583f159053514cf13a04a1f26fd9b39bae9b5562c0e4c9a72c3b069ed774819f10ceb9952669b8b847a203827d5a0226d8dc3df4030585a2b4cf999e470b3d3aab08ece69a24f1a246d04df6e54789a09afffdf3b35b5581980b6fcdf155dc41eafd633ee46d9cdf2dcfac8da5c8f938127cb6e5cda6027db7421d672b0e52e44edb5af804d468275adffc14bf6a57e3797d713df98ae12551fbf55467ce5d6ccea7519da450617731c4568b290194207f04cafce6fa5d0a1044e4c1930a511fe938309adc307b35b679ac61116f75f1196e24b454b01de13b45e931e7bc14f103b9579e97844ddb3cd59803c96930932d73706939ddfe23759522f70f3200000000000000008ad986030000000085814b6ebc7564379512a1a3c7d5db457370f430eadfc06216e5b135649a1f0c03e1feae1c923d71da1aab2636b56bb61ce9ada47143fbfbe1095c0e3f23d6b635585210b3b1e4fbf19193b7b74dac8a0bc6bf3c584f081a1f2734f7df6fa4c700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bd19955d062b5d9a90440eddcdcd0823053a6c5a736d276803d419c148448b22dd11a595f694652b58651dd0e9f13ecd529af45cb3b47f3e18fcd5c61254f1545db0617512abb81b64fe142245c0159dabe5836802fd7a9f5d1c139f3b19fd7b10cc4e2cea936040e8cb7af573d114f766f1e805d95088a2ceb0e4867e78a6ba031e9441dfdd6fbe103b7f6c3f9495481de68e0425867f6bb9a2875a41845fb8230318e8c62856944e9f4f30cefa5ad901272584be4cdadc0633ac398068156032910b05d40d212f50f10c4e7e843aafca21edb7bc782324d7d06d364894c2c9a3b17cea7787591f9950c4b9c77aae0aaa44469fba1623a249f9ab17c944dddc3c43c602073c6d2c5817232cd1d3de9f725a62e9cc306b92fd1c4056b2c0c86c1ce4c169021924e40504bb70a901a162d13ea1a165346f6737eb63ee43ddfcec7ab82b6298020ce70ffa94969199f44511b308ffaeb794528312d4bda0ff9b4ad93e442a519703023f079036b4853b82157312c0040d09696425ed101c04911600e1b55e7b0fdd022cfb70b08b8ac52a333b31459e64dc626c94e3659832be08cd6a99c656986788cf591c82206c1bcd1ced2c51c02d9d5abb3846a0a63758b5532b1511ead06b8f87ff1cd2414aa5689da296a50adb306b916af7576eaf7816e760ced600417b93073cd5b1a2a879d6c0ee80aa5c1ab95af864b0bffc266563c7b4f4e339ebe56c9adc443e65369b1c0087f3678f31116fb5ac5208a66a9a27505da90e7e28b9f7e790bab7655b054646ab9d0af3419f6a9bae1eef96b1b2a841501fd30ccfe8f338261beed5a7121ab6374380f140052555b3182e27d3334957a2f00310117bec75c0d68eb2634be8a5e64810ffe49dc7cf02a4b08d33fc6897dbe12920801a35837bf86e1517cae4860244c05d21c62967baaacfeacc17489676a0c64c67b81acb23baf1317c12bc9478ee72e4a0e140bdd59fbfd8e94f546dbd7216ff3ae4aa010a3a3843e7b0490a0e34d8087eda46958a79cf24a276ca75bf4f06cf170d622700c21b38fade26a0835db6d3f2b1cccf1d3c7d87a84ee48dfb2f48e4b2551784718fc49c8066e191b4e7a6c7501fa4affdcb96e414b2650c566ee4dc7243717477da2f116adfa2fd91e554dc4f230dfe950fd1f25fd89357b044456adc4b2f3bfaef6d5ad7151734af90f3df66e7f1a82084ad5621358e1d23cb0cd850bcd5c3ae5afa70f01a3a30b798b3d26fa86344fda221881d0ac2378dcb742c39cc57ff68a86d05946c2da4bf4e5454b2bfe1c57d6d75e32c6c7a8a00b6bbeea234304393ce61556b799b315e89b841c7d4aa0d335ce3c1d9c136e477070476afbb41061f911ec89042d9c6343bec34cdf395270f501a24163c4ff07dc9f2e7eaa255a417a557b6adc38866f21a91758bb1495f69520fd7a1d53ebc4a8da38271935b34c0de2857b3eacc92c8493ffde32396ec3d3bcfe4b736f3230014eed288aa09d055791980a1e3ac700fbf1ecc53644e60d96df6501a1c95c92506d8d163c46b661e2b5c57480cb6ef14a9bd8daba84e8587a856ed3931e21db2a7adf961b6c9b4ab1db82261b49ffbcbbe1586b15433bb6f009f6c3fcadc998d61343dcf7834bd4df0230416053798918c24024460adcc4e88d6a6d606524d7cd6a256d2c33809e0013336c5eb06a630799518147997d93f854223191e7395d2a09e69fdec0b5db0811e9e1a89c985e455e4ed082c101e09e65d8455266e2f3ece6c085f0870810fbf2797881816c07b571e0364519c95deb6e6899940a778d5fb5454364dc25296d8c4e1ff552a22469da99066c958b6453c1e3409779b7ba646ca14b6e3e5dba7fad5f201eba02da6463a0617d58171bf6fb9c7c79656093205cf1c778813720069892bd189d456b5a4e3bb8526ed4264ae825417909f27d7ead632388cea0802beac0960526dc91fba2a93cc093d663e3291104ea55a2046bc6b92caf0c4407feab132cf2d1c6d40e85b1bc5e9283dc913c8c3b8f6293db1aafeac05e90d42123eb1409c6d06dd7cc9f0a74720ad959c1c8d819b49db59345fb8ad573308f24d26efa0d6d9290983b597d5e055e379569ae136d01a3910205474b8e8ef5ad702f3dd5a45c93d9d8644c289ebc56f5f1b0cc9f61540e5dc354e5901417b70cc5d687408918ff10f3bee52b6577852cabe5d768608505a2558704b767dcefc6595349c0256cce9d38bd5c717cd9ec588ffa7d931ed44fa7cf0a8a04a5b8e4e1e5c6402c5b942f048d72647b4a2d43700a97f16c5fc73721d8b590967cb13c17b3a319cdc90cb7adf6fd29eaef18825d457b979795a402952b8daaf2861be03fa69597c073002fb360e261f8049de64430beb95dc3573e6eacd002fb085acd3d13517dac457541a999cace86a7eefee150a", "6500006a5152", 0, -192607878, "f41df8af8c28af0781e5bb5af91b4cf5b77e242bf0c6c0575c11fd3f9c90f3bf"], - ["6ee5b5530432851b5553e0bfcca4359fbb040ca832737ec5d129e47b61071965e1b20f09740000000000d0d78466f79a73bc3cfc1e413ce33b209bac200c4d4de5fa407dad015549c984d75140150100000000ffffffffdf7f20ce1b21ba1fea40a3f0a98c773e3e039076d73ccf70558c0373546ba5f30000000009526a65ac655100516a77fd714ec345c69a8e4d4198ea2f00d9572e72cd7b8eb2d42eb35dbbbfee62bcb74a6cf1030000000653ac516353652e076b6f03fe31eb000000000000f6ddf30100000000026aac9d7f620200000000070051635351520000000000010000000000000000b6646e02000000009a357346f00268c497e00120723d8bbb0d12ab5482a562302386a24d71f8d393cf71f175d9c9f661920edac450dd49a1ff99ce51a943f04f24e3dee4c66918641849abd1a5c49b61d1263fea989e4575f2f579a1ae92a5a5266ac97b6f618b2800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000acf229b444019ded7450fc9554c0e00d09f91ae017446cca024dd9e963ff7163abacb0affae0df2107dfeb75573223d811b5c6075287c2f53482d1853f651c041b8f64291c88a12eb5412840a155d502a6598b7e10a7e5e863aebb1770b5507d7b0c24b4b4b9612555a03117160ec55ea0c625f8c994e93df3dbe3cecc2d000f03022b320738cfffe7d73b9ec3fb8c0eb89b1178c6b0ec64832090f33537eb451b021d10d2f2d7ab6281d57bb5953597bc599f7f5444f24567f423b311ef7917ad6d0b022cfa6c64b42d3a1d5d990b9679d1d745ddaaa6b3699e735374f2937605c7467fce1a3760161ad4373bc65867531d9bb78f83a35aea0caf09bf607ec9a6a484031ee8eddca45c86c33b7998cf85303a86116fe736db78321dc27f1b5c2b9ad3b40327b30360ef8e9e96154516c69806f68ebb1adce3f0a80357c23a6e4b2eb70a770212e628447f91fea53bb9a670382a72057547e4e3786a4eee798acf28c6e1e77c020c77652314b689f0404a299cd83b77907a8f15d250e3c4a82cac4d951347fc1d0228c73e622d1433fe9782e929a7295afbcb0c1dc099c9d74b3178fd6b56ff3724d614564a57411943fd936a0f18e2a64177e608bf537fc42d5b4978e6810334587089ae937501ddeb62c213694c9ad13b9998eb6754289bda381e8a8c1ee980a3568b058dce5cffa78c9be8249ea0d634e756ca772f9d8dc3236806a7f2eeea65715cb8d0874537310440f95d1289446264a10c8f32fd09b4998f566a301c3c83c93b9569d0c16263ed930b3df5945867ca29947cd334206c16defa04098a6ac2ab58c8b2841870e2f857c5d59059ab33724929c523cd5ddf4d38871498bb0fef048c8df475610c896a9e6c2eedb327c110f085e45e71fb9a53aaf7982111b052f1fc1f5970aa6e45e4fe159b9e04577b571417d2f74ffb9332a1280a1dcffaff038d72e17ea7acc2b426ff49785b2601da111d75ed456602ef9a32850f0c002164a40a3c8912d8157837f52993085898d7bd299366e7ea82238bae34914086fb0db4052b97fdc2d0a3aa0df2502e58fc14b653631c2464d19f3b605a9f0500f15529352365da60addc226581fceef3b67abff8eba8b6e6940d3e807e39e4061c2b79dba8d9de1372083fc62af8384d1e4918c97bcb789781750127418bd93fd563724d37216102904d194e7cd776ee1552ec09f286696f7ec822d1f8854089c32759c7ca83a224d976e853d53ff0f51c9941875296bd7f9501ad7047efb7cb03a658415a55af052a35cea4f536c37746a73ccbbedb15c75b03afa29a9a6ad6f24ce9d6032969b8a2784f4306409a2b4bce776f087103160b4bca6897ceebfdf93c2fb316cd5996a82e14022b928a1bb3172f05f77ba4cbf394f8086f712b67b04e905c8be7b8e2f8a9d2232126856099a0d2248b637f41cbba3d64f451838835693d1ca2a8a7ff0b5324ecbfd50ded67f36af4f869f2dccb32439138d9ef64a91c30e9b1df70596ce6f87f94fc6d96cb29ee007c6dce875111609a0102c6d514fa823f682a6283aa0c7c1d083f74a7c1377ecfc048b5ad68063275dc60a4b19fdcd1dd2217a61605cd113cb72bc3e16c104e64c5a7c788bafe3087b8ee1220e836afd158619f64b0cbfe793c9840c4fa0620ca6be1831ccaba60eb72b50ce2d1cd4335a92e4b273766a41d691efba2b99c7a0b7995cf3e8b0e91f6cf14d7b0522a297a51df8e7e0241c658f6b10ecad26a3286dcb582d6b9ea899e91ddb39e9bc33d60da494f99bcf605c5bfccebae0a58484270e3163eafe67e470fc82f495389ecc6bdc0c66a939a4e2fcb4055fcc87dfad88f35cf54ec6a248feee35dbe576e1d2ddb1e16cf3407ff02aecb6c778892996f5b6bc33c597813024f3ebff32be3b95bacebe31a5d02197ea47547a85b7159f965207b0c1f5dd58582eb324e6505a4c432e850b0119fcacc6f60a8c815472ff5e4b171062ab7a1bb4d7a418fb7fc4f3a4a0a6f122fccad941aa3b044fc93b6b229beb633af2f68a6d778dfc59633e9ade7bcadbdeaca3703c948fb7b5a812c1768b52bfb66d037624c692adbc17cf5993f58b7340edf0d4a57b5c0d2098102a9c2eb58b75d21d183d713661aac7094bc9dea42c842ed6c765d075d6741593b1c7d2305e51c054a0bb326d2a26dd4a35bc5618e9faff33408222f834d88652fe53571bd35cb04ad4cdd2a34d029130faae9b91171106382ac65d9ea58092963b4af759cc2ea75485bc2d3c9846ace808242b95fa9f10dd45d407808f1ca6ea05960fd99d743e285c255cbef2a5960b24f84943fd4c15b73bc7b2147f1ea360014500ec3a10ea912c5fe40902fce33861ca862fdfee9fededb6596dbdce2bcaa904bd06bb59b3ff7c9757b1dae24c3094dbce44dbfa13a6c0e30a29cf1b6a503", "51acac6a65526aac65", 1, -1274962426, "4239b8327bd0554f937f67ffbfc96648261e2e1dec923c001dde2aaddca3e93d"], - ["a5ea6f48038b13aa12d48eef8bdb1a0b6bef1dcade3f62b9e0c2147be178daa7fc616cdc240000000004ac6a0052493f9adc6a707fb67c6c2c4b770b90da99ec9fd4c5b15f31198b6d37f06152e144617c750300000006ac656aac5251ffffffff8cb84a2659cf9c1812dbcb698ea0e8d99066ecdc69303ee2ea1e3e7e52d3496e01000000076351525153ac53ffffffff02204652030000000000d48e3102000000000952636a630053536563b6bc3d3c03bdc2f500000000000000000000000000f84e3dda3e5e654f6664b39c4c4e010b9a1648f340e50eae57aaea06efab2878a25fdcf7b7d9f757d1e701dc80d41f8f2874048ad82fab70bd7ae2c11c3967380b49022d328aae6ce5b9e100de9dfeceaccfff86cac9a7e7323546a7e7e6585600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2f8dad9ce536ed95644b183a5cee852625bf05819acec3fefc32301343d7d5765cb500ccb649665e7c655347c32b9d2453460801667e8afb4964846460b8e7196b9201d342e38385c30a7780fb9cf7e8dc95e25cde3beef267cda7dc2bd89630d73a0b618b8beee97d99e2779318eecb6211aa59df3192d5d5a887d49549e9403017ece4aec986d28a96b1e18e27b1ef451abc1871bb5590dcd40d8d6285221b60215f6dfd4da18731281173023480cc136260063456e71ffe7d38efc147d3c250b0a0148b2dbd241e806e20f7dc60734e49d695b0a7b936b44681425a0bb80bf088a7123a8fe259a868ff6f9d02cd6d8ae0363d28d63dd9c5b54cd553a6b64de462d021fbb8f8e9d1a1f3478095d695068bba0907073a9b47eabc71e83b85560d6a5b603023e31089526475320c858cb80d679f965701803e86d2797adb5ae6983b47be2021e9bb91be740f5550d28ef07d2b2a7631e138663b3f6472bbe5dada37641b0a50216e69cac56e066587a7118f5a747389d025b2c6871cc9627bf9aa3bff9da565a031e33e493cc0b56c91c67b85e7234dae4bf01309a346d7a5b0f06b167f29401a30bc1891591e18411644990ef3fa6526c5eec7de5d4d5aa163f8ad7bafcde6bc43b86c0171b78917e8a8fa7a7c8e2f2e854ebb8ba67ff90b07f2cf8f6aec0b24d94279e6497ce2d2f13e022c95c4d1de48c92c37ddb48edd6bec87c5bff33d2ccc523f09d0e42ead6524b70fa36592bbd98eb27ab7b7daa48e8e19440ee670b8a2dd2bc719958ca28418b1474b263e297cd6f4943496f664a524ff24bb0565c239d55d210379e7969fd576bdb594625aab4c5f987d275002693b8ceee6a7de8035e8ff3bf0dd3fb558122835cf708673150e01c7d37041d162cef4cfb898e5c3aba866d1b5b14deacc83aa94d8e9d9ff2f16894b7ee39d63d9e080dd216ad4fb16601d447a244071e1bacbabba29a7949e99d3c148df7b1272225d4e32acdc4cbe026bfcc22831df2f6898e7ead07cd92b5aa2045a5759e41911359b065c65a5c34b4a8fbbccd211a52fdfbe2258d1ea44cf2510c333f9c012bf2b183a4be9c71ca2ccd0c3925833bbdcd60410d065cd629a3d5ead919e76e20da0c330a5b580c42aaae90be36422e34442666d074f43e3cd44fb356e16c37df3d800f57f52b88627802d88c1910d48f0c32dd604f0c0bba433d382a7c19b25a484c44708b4225e5ecf20ff64ec9b1af313e220b2687a19ef7343224c005c65d3441f3d085de17e3bf8cbeea74a3fda0c26759245454ce818764b7346ec0bf7486e555b0ab6063dd38c7c1d50a22280f46a387f1ee0aa918c67bf452fab540c2b7e8951f6ac2a55cc3688388e44b4883a1d6790fd3a68c2d6ad3ac14e2df596e7760a7f040289a313c4daf483cab8d372c1d58cce0b2d91b3344bbc18313ec18e36e311f9a4fecec60301236b15e092a2a5e099b0e4c07ddc60036eba138426c98295bf08f15e44678cad791ae735da29ddc191070559f0ea63e6e953d551d3e8adb5bd3c08fc98072b053031893641ae5500c51460a81f5602d62c251bc46e9ea686b895269d12bcc6998d516078407a50256bfc9cd75d01f663e70d68704f34a337b07bc94c2a10e1cbb012546ffe3a1e6da570c4a5a7f922c236f54db725e369e3f0fbd4d0fae54c0f62c81b1484aad819d00a85ad59eee6b67c509cb164fb85a9a8dab7300d341136f5ed241004b43309d704fff5a149cb59419859b1ddf0d7021422f0e78989b4957dfb53c08af82b0efce3aa6b05de6386a04e545274219b5bcabd5013bfa61260625814c85152c58e70db9e2ab95d673db704b4b9152cc5fe9bedec9205d7e42c20b317743fc86e6310302233f02e8c58ca79a2396aa5670218cad3e50be1e62ff87ff9e82a8c7bb9cf19f204bcca1f02625e23ec5b488ff5b2b6225eb3c8f3d66e200442419596aaa9c33596e620b3944d395bc688ee837a8e888fb2ba5a2a3fd415839687a1b3989d474b24628229daec51709a9ae87558876a26592dd4a6ec5faffc283194d913c4e47fecc5bf6ac4303d4ebe1c17c5803098159a5d51d2ca83fab0d6cf432c7e87152ce75d66e773e0aae7a21043612395d94ce58e1df6b2144ffa3e3399befdd23f0528d7d7d83c065fc2a90aa8e657ca833c1307d79e44b67572fb229f0c5951d1befd52d97cb6bf7f93a09aa381509f9db19598aa33184c8abea5180139bfc48b656a367030d6cd6184fee98a01aa78649f83567632924a62b0f92d4924d867db4dc23d907f04c0b0100000000000000000000000020ba9a5e448585a1e70609873a149e9f0408e5a51c7585532d405b75ba9a3273968a83d093b214805f7a983e7a0b847ba84823c439a5f1a1af07a235ef13c836a9fe48c2416a7fedaab66b74eae7594d971538acb32529ceab357000d50964f400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000963354fbcc36cb9c4b1f068aa2c2df0beb212ba09afb580626d9cba978804c1a5988e67b23742a2df1e46091e4d38bc283fac59b42fedc9310690fcc5da5ea03e6b88167c548a5d08b4c6f37b230a4f227cc9a31a96c15ea725b858deb4bf64838d20064daef76f2c69d52c2336bb8953dcb26c31b7e68a6fe3077d11fb46f0302223e8cdf46f585ab1f789e881042289e854b9a3351b7bff00974430844eac9b60326e5594598cae019dc5c7d651cdd3bf285aaaef601af77a0f4fb1c80b44a738b0b03847e7579f58e3396063558b782de063b370cce90c58f9084d3986cafbfc63bf92518e5be21e1b35b91074ac2747e9641d0723063b64e5c9056d72aa2a12fa20304cbcf944d02206704a27c7d2640c8952e6dcba731889d0e4c07702df9843203032240f45fc6fc9de6a40cdbd0677e205ad785f2388ecd9ced1eda3adae0677a04020559f5e433e66d309bf0fb3a8e462f4d607f935f563adf7be68e5c76f796266d03014b1adc20b1d5857f78ff2b835dc72f507390a713e1ed7413818c3fd50372fd022dcee834886dad019324092e6e4cd17b1db46fb695b035c886f9e47063d812d73e64a5ffeddd6792341e02e9d318ce1e06b95fcd1d4c7b1284e4509a0aa9eb9a0531142d27af8b00e3f45f99953264e82d7fd5d1958a8655690191e6a92789f6395c249aa4d27e6b12712d13eafe3dbc66c3a0ec9b5228c4f059734354623583c5dc182d745ccc8119e0e4eb2f6d570b922214233d32749221b75577e4113e9fa383533e01bb625c394d13e25f4be0263b86efb310b63c255c41d831eb6abaab1cc46745df8272fbdc4912428892197a218a582984f33936d2aabc4f00ad60739b532b70a419d3ab607234ad9ba518f49e8c64b8befd86f51fd471b9d3e08166240ea70515836f18b02723fc61b8d2d13e82a0c59bfca3dccab15e15d5ff7ed173d60be6fe8d004b85ee17ec7acf395f0681db3f6ac4bc6e218e9691b2696507434dee7728c8960750b59e56feffd0168e519163edca851d3d947367e53f1f770fb25d1d662e45f07bec7d13bc19e717639e9ed7791bf0c6725b7411897cb148fb379d6532855da6860629a1773182855e20fff00446391ef037a5976815d0284dd550799a3132359f2fce6b41a7feb8db7f6dd21ba67e13da2a5ddd61a32fdea2c0a2f91579cb0104a1d135ea2be29f7798a84aacef6f98e03c73078a23c362684be8f144f483a368b4a36b06028a8ad8175e525c9011b6e88b1eff16cb2c0fb2e7a8c9fec0c37deda23b87960ddc24484112fd6cbb05ca54da4865089cf719919867920c41f333674f24053f73d7f96fde785fe9d23c9b68aace448d4798284cdda4ae1519fe93ef11523192ad2bd4c578d13d85a30485b812384b3551e135252de4af8123e397db1bd329fe45bed8425158d17cf5fe3f2d811d03697e29658462c9729e734d060fb6716057eda174b7ae07b12225675968b5c040b0ebd350a26d77f6e8de3006a94e8392cbd017d2160986d6064abc86352fa7972d13aeaf0f466233a8d9d02757c99196304f634633ce69d679ba3ffc3a233182f530b8560f7ff3eadbb475c18059c33ae8782cf9fb07418b214436d45e358035350d74211d0f1252a709fb688d111c2b3285ecc11f94b4251f6fded33a9fd5abf4aa1a9f728f419fda0797da398e9d84846eaceac302f214e242d61e1777f432e537c262053143ea25c0a374d27c7ed4651efed140d8dac66ab9b9bb45d1aac212ecfd6d415a35362b7e27d99a52923194b03caf55b1d747199ecfe5536df7e1e48d598b52d90d9f5d51313b51204bea3052273177c62b7c3b403e005d256a187dd2142a5a3d3e2a5d00e0e81b99574fc6dce41b1aee714bebcda4ad30490ad6d7d7fa1512bd659df91aa3fc446bdebee102e8eeea3f8e1c29bb441b9e5b10cf52cdf2e6ff0ccb3c1e4f6eeb8fffd548d8332d1161df7a1a449cf28ee2813c228deddec56fd83f8b7fe37d041bf297054ca4713e4b00e82fceb9892e44a87a914b8db382da86429b087031a8fb9a826fcbeaf0cafc77c87a5392611e788ba2d706b7f18bc58d0e0f748a65c2651e1bd6b00548b66002a21afa8992445b25c520fb0c38cb40ab0d6f5ca2875f93f7fcd56dd1c53052c990fe4be0b6e899cc7fa550e638c59a84c5bac395ebbe962468ad5ff67f28832990c965a86e63342ee2a13c3d39d15fc114ffbe100a20ab7377d6a79eda40e88402932934d007a402e7ba339d06295ce71830ed33568fb84276b84348b779f963409b7105000000000000000000000000ce820aba1702091c789688427267ec812e2aefc6093e1ee0bb6a8fd6c1d73ab84fdd2b0f9f9b1609ebd667ac9512d80dea0eaecedc27d135c725ca53d87eb667c1bc5856daa2c486aa4c6b7e7bf02232b9341b25cd87ab3f210b282ab7952c2f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a8654e6e9880a3e209b57500cb5584a4ce340df13063c8d20099a2a30e6590cdea83efecf25c30d4e447e1ff44dfb5606324a1d67a5e224c3c16011d6605b1a829ac77c0ab75484d74887759235ce18e2115443a26aeed754deec439becc1df7b8fa19b41a6dc8d8a1c8344d96e20d28f8e13fdca436fb557b8e5fe8f8c75c5021b596c9fdd5df8aad6bdfd58fc7425f66192f3ac9863ac7276763aaa8df0d3c5031ec05e4d0301f9eb1adbae68298ed41936f5f9c6a5226d7f144b6af343594e2f0b01e67bdcf91f0a7c91bad12db4f1012fb90e2963eecd56129e04fff592e856646e6f00d8a29f902ec0412142094c10b34dc7df69a936db41a552841295a213330218d2e21d16b6223ad630abf119830b766a4b5b4225b285e566ba4ed384c9fbf8020e2ec7be2056da847f00b40cfe62c4f7c98d4912070660b8e66a3b40ae49bb3403174076268510cb542399908504bc83028503328a9bccba8457cd745e8b9831ec03112252e1655e88bea4b22a5c9a74477dd896d06a9e458897f9cbc5d22fb43887020ddde2a977941182c74db9763b3b08d8e78fbf14d5ac0cc672aa5f2b647329fae76c4b1fa349f5c0bd8dbf6e00ae8fad8233edcb5aff2a8806ad75b2e580514c319772b73e01a45c6eae5d783caeb275b4820180cf031f43854530eb7cf5f723cd41b60a20347f208263910ad15430eb4718dd3f3305d2dfcba622d072a7d3733fae176902ac8541d2fe7ca5052957fc3fa7ed9e1f995e7fca347e383efda75b52e2fcaf752fdc3f54d95ebc6b2e5dd9a9f36531510dc668e168ca597e72bd8dd36050a0fc670eb82b9f0a20d7d7f2ebbb9405d1abd625ec148107c58860e6fbede1a4b879efc48b7f3c63249e28a8e6fce860bfab6808278251323ab928cde57793c9ae8a790ddd8d9505fb4c790be18af67c149cbe57ad8dcf5c69d6b819e20718179fd08073ff05bfe4aaf59e08c55508fa02ddbe9f999079adc4a4999429fd1c4a53d49cd9b34467585bcf82b70740b0fdeb0e815071f7b527de0bab12e1852e178e8ab83db24b43bed0aba9aa6988236ccc830e644524c37aa2a096dfc146e4ebc00e745b5143618ff89f50bc9cddf469070a30d871f621adf13e10ec131a388fdccedbc33703301055d2bdc096aba319ce7b8815713e291b956c42217bf378b8c7a3a6248a5b1fe5ca39dbf03cb102551d3c7ce2b484de77a03edb1b2b505f0b12a1881da166252d2bf9a4b1ccc07fcde93a1d9d8b424db8a0bab86ab34c42cb80dcd6b0bdcbb4e36dcff03b2d0e6617ad368f9d0f3e9affa2f1b838b37a6af37074a2e103403121a839f851a29d33a999344673d6c4a25c6ae2da061ca5a57350a038c7866df4b49f5576c72915476adfbbe11706ae05f225ff8009c83840d7b22782ac590a14662c5c72f4cb480036c6cb89218a3493c22c610cee130e53d276ea6ef0e7fa4cf6b3549f4f027acc1903dc65b9014749402937c9b59eb59731fee4da9a0b416121890b0b1985cab8fb37bdde9ded886ddc62e0137f628f5448cbc240d2bc07d6fd01b043fea7121e31b586eb415c77d647822c7d902d9114b8ef2cea9838ab15e37d06d3c10772d08bc58d2bdc2762cfa230b4ba7784f0ebbca97ce924b450762de55304440e2d193c50d85e81fe277a8bd505caa44eba577ed33097efeeeef1c5dbc87e152d4bf997472d78c98877b8d09d746eb9cb09a5929cb6bc5cfe0c64d17e6438a3ac9c6be34190d5f11e32ebddbf0fd6e731b2c80b165883c27aa8a14410b7bbc7e34aadda01e0fb3e52332af8d72c5d75c12ae253e4a035a8f62d212e9883f3b7b541eb942789ccf97cfe04792eac80b1229ad8c63479ef7172f6d175b725e972a7b3d5201f9be4870f13667097602880139184efc9cbd96d08f08b0f2bfa5c6b569ebbe804e8e92b3b5d4dab8cfb518212e5164508b4c3f9674c180a025e7ddd5a6f2e6fab6b01570db5c233a746c84738d55517b1dfaf174982b24e9860d9e82f861cce41a5af5fa30565ae711d5eba54ce04bed2aaeb04b038df140ceb521a6ffb7c1e11f6f8f07c03bd602ed3c59dd9bed04119a9a96defa3cf4f91ffa5f7945974aad2139ad50f5a768d7b7257ccd0c0cae6b74ac815e36ad84bacce0860bf7f239bd1e37ca5507af56a01c40f383eb7515d6cbbcc103a5654a0eed560f161b6218a6f5e66097137b30c145167a8f2e7f0ef543b85587b9fd1bc12d28543599e113791b3558a407bcfcd0767d27fbeb0b22f0b2d076ac4bcbb4814800c74f18a7b26fbd63371f150cec620cfb148678cda3e5c69eca41a8938418437ea6e7faaced9d8ed0b50fcc14b04d7f4d90cafcbcedfb6fdd401dd39259dc8580a394a0ca76396c03dc1aecd8a2f647b4635149a8ac927e77a27ebda394a06f148af033105", "52006552ac", 1, 234185119, "b7326cd9f518c94f350f20b21e043298d7dab3f5e0c1e8cf6b6cc9b7f150b1a0"], - ["030000807082c403047f77ae2b6fb5653f990658d2fc21d99a5144060405867b2e769ff77f6ab98bba000000000100ffffffff1ba6e55fb1ecd14c703532169ffce8fa85a58638be340b85044516e611f985190200000002636a42e21326f01f7ccf7d8606f095d6246cad9d7ce1188e518d80f7e342d2434e9dd67269f3030000000165ffffffff209f327c926f94229f6c1bfac6d0e06ad3e25fb5f35bc9995c58f420bc79d8ef030000000031dbfa4c01b4147e000000000001520c8ba587f118e45101bbbd060400000000000000000000000023e349d33ae5012f912d17346a7c4dbb537e88fa5e4a7d9b5e49cd52735fd2cc0e3a3df704d56bc2878b14d4fe4b7eb8861bafd18698446ea1f79fbcef7ffb67cae0ca273e64e131f9e2d00a5de1960fb0dfed53f5d3250217d4880ee0f0b07200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d75eb6ac8ed58199518c7e52043751020613914b569c2b3e9476185fc398932823021766225b648a0bbefea41d5715ab85eb06cdf0511e24dcf46e6394d9ee00f496941334781741cf1279802183296b39919f99d65b84ef607213c446198332da56159b146234dc18fa77b6d3a61979a326658354b759ea45321a08d18424c6032658d96d7c928d933fbe73ff3de29530e4cf4b33513f430e9ffdd437b35808c10209c615d4e0561439a03149b189a1258f1c27d4d8420363eaab9972390973a0300b07137a70a1e319a9a267f0e199ffa9d0adc4af3d91a2bfb8d820589724829d50e0a4f69cbcd039b31db1ac0e20a706efc4b8b1ee2ec6a81385a55c248c36e7bf02054813a4d86f49f01f87e2cd5abae701f4ae61c80b32c03ff58fb23cce334ada0211a0c255fe1020f9af93acdca0f52b14b184aac2d69fb335610de27301cdfd45021eb62a0617f7b8d2e6d969fcb04e23c735b8e239132b68160918edca4e0fc61e03121506cf7589851049b2b3b243d83f81111b04a4e9fac5f7cb9947642e8f4d41020c56980700e695359f131a595e89fa4d3c1454f1094d3d0bee3ab901c9545a81286fc6422a56261ebdfb4bf5eb9a608421329030d11867c3bec68413d4f7a67957715c93bd9db0f6acbaed868d80046e2744e405cb7cb72e3b16cbafe1be2b56cabc9eade01abc07d33d9630addcb5ebda8061500fa65f9118859662e0228d64f2625893396fa060d32dbcb986049a81728c5bf5ecbed71f6748231b6a05d0d43578992079195919f0b5d4f259cf3ab8d876695e63e38018a59d11c2fda9f3bacd37d2035c6ec890342f4651347f03320615c85bca18bdafcda8ca11577ca7c470b0787b83dd635ecc8be8b22a56d834ae03ca2b23d998218e76de8cd07fd26db5d842774cbba5de6f018b2ca5c9b72a8caf1db8b3ced613bfe27b09e91869f8d039edd196eac008942591d45215b146d100702a6245155c71b3b65059e16e02e2170711ea5e59cbfb660d0993c8c6000eb21ccea368f4ab514fbe3150e3618d513529efe98c5e6846e9f5ff1667b3a887272c5607129b041c75d1e847cf2756b3a19e0d9f7ee2a55aaf49802870a85efaa70429bb868350249ef93be7d8dba45074ffa7d242e3869c54fa56dc8c43187157fd4f46ae5def0f6e64870d93e6bf80848fa7ccb887f15d5260a5517e6ba394dab0d5cd8220c9946ea88b5b22b570b789ead8fef181123cc672a55531092051b763ef3809aaa41f353e101dfb8c1080d3b4f37b7b671143cad895705201e2a056b1210c929f0f1c1785dfad42e50fc4981b53202a0d217ac2776707a5bb0914bb5f171731ca27e8c19376180aaf175d2944f2aaa6ac5a5330d22c28647c0f886d140b81c4af51d5c206689d3f10abf2c23b78e8667799ec45abc9200b90948058fce5f3045cc1d2ec35ffee4e8dfd5c42809b71a96a79ad0742a18f2ecb3befa5a2e91736ddcd9314f399328bc48e24c019610638bafae225498fc5d91c9f95e7dfc2afae2445e2cf24808412ab05c3f7ea8d1b21b126e71dfc2800273246bb2a90fc3e2b991f8dfc2b5ad46ff2719f6390356d954237312cb7c93590089c91d84cd4f32681492d26694e6d8ea955632af5c42aa8a03e350cc0352779c3eba128316a8bb520744c5f9ebd11f6376d315eb8b272169f03d4b89d2a62434e159a70d0e02b863e702005be638579e9fc1b64b78d99d3c13ff900f7494f0006a4d4f42a08360e20a1c271a1a1a2a246b363acb8595d43b6c6817aef9e4b593e7978a1b00d0d563237812aa74724afedca65d1597be1670d6655644b3dfbb6b2532c51cc52925e7a040cc61739d847a1d56fb4ea3bf1d701ff2f19d4d819fc64185827d69abadf211cd169c6740f1a00a340a03b98f2d313b66d5fe4d8a86329357960f2f2e4249374306b26a9f1cac0031de17199ef4be5b913e11f6a0a997345a9608921a36f50ff418ace02a480b5a253811063d6b256b014204e127c9b519d91ca50ddf43c8c754a512e5ee1ea2856acac67484f67a4f5aed80338ab51617a2aea05c160827ca3e6d0af41a4ad6aebc5a08f57fd8def8d213b542c7bd4f09a2ba42802cfd375589f5e94519dd39ad45ab2c2d993cb440d5e96daa85b045c9b6bcd29f40e33a4b24fb06b83b92ea970f77aa59d2dff76fe4830b16a6b3e95622e9c256205ae93d48e7460f7f074067aed55a5809514e9a760eefaa435e753fb92a5aed760d8298ca03665e6f4b8baac71722298c2176420d85dad5a673d3a703c3200fefb33d422837073abe2a37dbca1e765b741f40e994337d328f102fdad28ede8c9af37948499f371c6c81e7a2456580159b4868cbf9f4379362ffc214977b2f5c86e58626fc8946266249a36c0438eef16b7291712a9ea6993a58768fbef00", "00", 2, 779010436, "626283da48751e0e5049efd7fdf1dac57469bfde50f7d4e23654e52b425ede01"], - ["cd481b5802ad130250c3280c382a3a94ee4fa0798f60f6bc6d343865a7b5b87fed60058f46000000000451656aacffffffff9fbbbf864b29a010f95b136b38fd1777282994145591d8528e36c58164b8aa6f030000000863515200530053531028566404d1afd2000000000002656a5c08e1000000000002006a58b2c40100000000016aed5e0e0100000000066a6a52635251bab4ec29010000000000000000f47c960000000000df8603128d8bfed56a30ef2ce29233599d7fd17954cb09404a827b27f5b406e687103a8654a7eaf8e2786b31f256e9cf0d0e265f3fc5bee94c4974490a34cd4d6c855ffb747cc99ce89183e46ea5934f9f2498fd47af21267cfd43cd3137241300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000131f15402ef1e1d62e47d2f6efecddfd4cdfc6600b8af466a14825bc9575c26c5af49ce1c1db851f6238505a8ae1127378f638c26cf3e2cd682c415e90ce7b83d68e2ca7dd7d811060b56c57a67e9c241a166910b32bddf6aba18aa17ad19a7d07a9922b60503948661f69ecfca22c0b556b9d1c27de7f5ce75c50cffa42f3a7021fda184c28b126b142f5c2ee6d3d63a4a640db850795d69b0f5668f7c1f5b7f502186a12d133f1a88a68e15e822693cf16b348afbde3aa1bcc5f9353f37d461bb90a01a39ff08247ab214ef3b49bb17a777f9f0b5822c6d60c28541337a16d10bb6df40863032068ab2946f069cab6eceb1efd5c53e7db18b59baee1d0600c06e9cf0217235d4ef1bb41179b41fef02a014bae90acc2f63f336c952e32715ba981774a031b30b4a91b2c3f46d9543da3c7fcdf91c6f3d64460432fef16aefd6cfa3b87de0208a891e45bc8af26e238b4de3519a843dd473dc68bd88c0fa5cf9d1a7d1b05d5020e81b9692a752a0dddb8350696bc556368cf523cde78133fc27e144df7eaa4870219b8afefeb9d36344325e2c21f2c6522384b4f56431747e4f7408128ec6855809172e776a1bad68d7721a326e2a0cfa214ea1ad7569759ee316ec99cf46f3f2fbc003b23b16a7b6d5d08a487805e120d997dd0d16820ea8fae6c877157cb3a0d4a2be83c415f25f7a1065b10d803c55e729fcce664083d635d2ef795d25138fb053d06460b4648bbd72d3f94499087d4297a93529d31d61aa9d77353b91065b61e3d44297920635c0e09bb06e79efdd529d8ac3092f1a526561647b18f71a1b7af6788577111c3b3110a8cf37f47cebca9f46b6c04be1117137346de8cf54a2de988150327a7a4a06bd00604ec1f27fc5ff2bfc0148cb766225170e970909c8f768b33457d92ebf1c3a513554161af4267860867de77e3c788c2dbe42e1e0ba11adc20fb0130f53ecc93faa6952119725d8fd7ffded22362ee9c6f5814d145d89addff015e167f37c4f5dad902f8e170b3b40961ec2009f225cd46f7b75576c589d2b1d7b48cf3b2e7bcb4aa61b2ec0c52aa52ab4a471ffd5a3ebb7a646060dda41248c9900d98193be09e924d54948bcab9d92211bd853010653ace6ed9331154ecfd825defd7eaf5477c04c465f845ee46bc32d1d0e740b7d3091e5ec7b0365c55e6c613f2904a5603f93c7df51b23e71d43f7fd3c723ecfbc44b27af635a0c991bd631823067f4cdb5e86b9383a43b289468a53535f42ba15c5661c23419ce618204fd37c98e9e69fb36f7f00bff0ba2e48b0248bca69444a3fed21f423833046a2e06940b6289d884a49e44befedca6b98763c578cc00a66e3adf7d1d58106e0d64e5c90b95bb4b2bfc6f9473bcdc40dfd4ba0749fc2434a1d26dc0bc46fcea5d5ba8083dddf77cbdbe93c386f5e20c16953a664dbe68b48ceca2f040a3f0978f01d57a2cbe82f476aa4ef43d00aa6681e9f36884f9a03dc27156c81c4e59b80016f20e3a18175036d4f605c92e819890fe04104ae3cbdb2fd619730c1f389955d7aeb2b5dd3cb980df59eb95ef065a29988e04aa0e2f0a28a7701951414fa69da5ebfff3d2218cd62808f6e611b9ddd5fa0fce8674532248de688560a34b91e29f14a6ca9ba0b53488d35ff80c29101915be1412a3a87cce6a27e2a758a4ddc2488010eefbdc2f5c267f76cd09c7c0f9723e52a58b59631ae6da9b0e20a3fefe4c4b8f6eae9a91100a5e5aeb6ca24bc16f436440033c73f139ef7315474171d12b7f4fd1529c16eb88a3c943abd42db0024e32a6759f77de39ac8c54c3fcf44d32fb9c3b0ee979db9951bdc7f72616c9c26a2dad86a1eec4ac0db1db42a1ad0bc7888939ee6ba2b8e18367f4151f04444ac8e41238fb35702992bd23394b95b889b88755f2e5785125403fb9b8fd81082c3a4eb400381d460a9a3a76619c06206a86a312df1206cbb3a3ad2d80eb9cb5054841ee18e81c813690519533286106edd78d4309ccbf3f01a3a1d1bfff52285d52795c0a3a0fc65dd388601cefdf6a64ec46bb798ea5c546172ef6d5691eb616c26f6613b6a37c8745da34f4ed595586dcb92de6710f434847271085971e33645a9d2409ab5d6f4f7031372bd1e4007a19294ba0e9f2e3293934aa075c54bd8fc68ce973102914d65b4205a3ad5a5de3c3c1f3dbcbb5b87dea5d3e23790d2a339a6f43a874340958affed536b8d7bee30083c677a5335da35f48712fc2ff39c049101f7bf7f157d4b1f70c0578da71935a0ae09d402232ad5b6c2e572cde0a7cb7dd5c8557ded313e3b6694889d98734a295e0d9695d25bd53e620e4a2647fb39af1a5d65d4cd5660ac0fa7c55d21a37d1042a15b7d9a4d5b1a6c0e8a535a616ce74281b8ad32792242bfdaa4c9da2b1d8266cbb5bcf790b5d00d3a691300", "6500", 0, 536406407, "39ece220c0cb3eed384ccbb34e3e8f9f4fd9c6ebbd172cbc07654aa18a8ddbf3"], - ["1715ec26030c58fd6b950a93bca7262283f941e9b61796d12585def5f37d4814ab1b7111bf03000000085100525253005263ffffffff8007e44652a40f0248e87af453f6a3e509b643d196b5e2039c8f320de386aa6f010000000852536a6a00525153ffffffff0fc2590f4254f52f5d5782df2206d2e762e281310ac950b1be69b06f7177f103020000000253acffffffff032bfabe0500000000016380d0fd0400000000096352516a6a5365ac0050f5aa010000000001534c6f2ce200", "655363", 1, -1344805601, "baacad49f66d20a40f862732c5c5e9e9671bef0faf23f22b4848b203d8ab24b2"], - ["030000807082c40304b931b7dc3d76ebd7deae6d718add13e62726ce1b0b8f681b95b112c4f116b414020000000465515163c426abdd91340a487483465bb4c34ed0d1cb039da9897b25c85c626af992517388bf7e7c01000000096aac0065526a655165a5274d9cdcc2600a64b71fe75655682ca5026251f872c68b1305cfd41341e7f57ba135970000000009526552530053650053ffffffffa1106c2274e02d66b5831adec8c6d86ab7ade93d14b0406abbfb7c1549f8d481010000000351525389455c9501c85e20020000000003526365a1aefa15e5923e5800", "6553655253ac52", 1, 1705523770, "567acfe74e30d625d193612720d6b23193e7a820a4f05bab043eb277f76d88b3"], - ["19f1c91a02e43edc8dcbe574a759a716dd23a5164479c69c30021e4bcb78eb32fe88ac1e03010000000100ffffffff440ce47480b87c71baacb8a35db89d319262b8a975fbfb40c7264c430005fdff01000000046363ac6affffffff04dace3d0400000000045251ac532240ae00000000000263527d7f5b010000000001acfae1e30100000000056553ac635100000000010000000000000000dcac3105000000002f7681e43a05d79dc6ac7e7c8600e2160efe9c3803a49e7f9cc7b95e3f39a659d53febf1362f5f5d0c4b06270e09e734c5f47ca54f332e18bd5fb3a76bbf8dced531a3844190becc57c97b46b63490d454bad4bcb406cd59e4befae7465addaa0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018bc5e81456a1453d42920b99636f35fb7df01c53ad8085ebb39f8d43cddfae8a9d2c0b2943cb5f7d83f13625d0de5c508148f62062fd6ec53ec02597267c18156d4642d143bb86c351f53cc44c5ab10e61f017d34c4104b37ec805d4e9b1fa3586c83132cc5b46141fd4fa16237b6233d91eeaf8e4d0bfd6fca1b50418dfe66022537322c59395d87e7c3c390ce325b886922ff615759cdd39e553e820e117db8021c545079e894fa1d94662617a0e90058057f19338e839bdfff991da2ed1b8e1c0b02e14b4c7710c0aaa9fe366218c8506656fe1450d82648497d32c022a5b80bd06bb7478a74a1c6931869de14cc51243931e2cd1d51fb39d92789b4f47f8a78950225e9eecf0cc4131723d3e72d8ddfaedb24711b146f994d85184b577fcff81a020304357c6ac160a8e924fccc1834402a44dcdc8221f81ef221fbf7cd77e0363d3c032c600b6ae2b6a774c9cf721561e4575ca303a94a31ca452ea756278cfbef3cdb03249d6d1fa2fef7c4e41c1e97d9b74b9cf247e2cc899a291af39d5f5774b2924c02034c5cb5bbb15e7c78f1406c5be258624f36e6dfd94dd509e49048325d2b58644fed5ca862b3ca639338b992fb0ff8f4441ece10194b93ff2bcf1cc7f6b41c40999c795775315dd4caf5be17a5766ec3eb268a39953a623b8b4052ceb075e803e61a287dc077a4d782330e072c1c24f1102d595eb5e513aae7e53b57569b476398ce40e352bf365e5927cc4c0a6c79d82d88f670fd50be8d3a40aed5241b8b5c1f769e3901c39836becff464506797731fbf9199e81c2706e1dc363e5a93424bde050f04aae4fca4660c463230b7ce2a244d65a4d559e4d09906aa9a83b23c1020af7882dc0b3329f7e974711fa66151b97871d3d68ff46c0190339be85fdf9b25d34d842df46f72d79c08e4dedf81cb8334f6adb82e7f04a1101ceabffb639c0f55f002d262d68f4b742652da8024bebfb2f1fdeb0de2017b94d4224063509b1d8d6fae13deb330e4715b25436665676a4717774cbad55139c4ec0628051e7ee8c0200ee8a76cba9c15c035309330230bf0f839a60578772880b1be7bcdf584fdb1f7aca8fe0ee55340be7db367c942b05e871a8c52b9e7b987935a382faedc9dbfa754527614d3fa75eb9c9142d281fe779cc075f90fe55e695c07eea3d97cc014357d9332fdd884e7de285f928350c52d4cb0a1582e323107c0129e96c6545f6de4b692efd228b4c7fd872560b72308989219b8d90f4fbf749d905109fdf49da216596b406efa24e9f555411fd799ddd746b484564360382f372ef97f1ceba29fdf48cd87079e33fcad203194f75ca07ca28aaa919c70f6c4f00cde5f0765a8527a3d30b6004ee03b75e283f30dfff3d260d85d87fac1716fc7ce047fcfcdc2e29a04f1ef35381fafe7e9b0e87223bd75936ef37ddef6e2ac5aca5ce0ca8c085198116cf209fac8ce72fd76346013685c204501ac6b5317b016612351fc231b829648cd512c613a051726a13f7ee51b649fe8f0834185a56110aec4f68245df779dfdaba8c7bfd4440b40ce0e5bc7805a8e99880d836d4dc89f5bb8cbabc705058c11cbc292b271f7fe57ebbb8ac1acb7fcccfe47f442df111465d38837a682024c8788e002e92a1c88a5d73183ea390ca0e650ca8f7a93ce6e52c77f795ee5d577da257b86cd990d23f48e04f0fb5cb9da0b488419be99fa600ab25ed5a6fa4778c416dcb63e3998f2871bdb183a7ca6a10101d72c4bf6f23ed94f1b3204d68d2b6f790388a1dc346daddfacfe48e65beff07ff242fbffe5e95b370a60c09396c19e5a73a7ae2bafded9b12952b98abfd9ac9d29ed62e30dabc2773ee6432a44a241f27cb8efb933c62d070012678afcfa6149ec79dad351371470571b48baa4ce45e68cd875f2a5cc839338a58a445959ff3f873aa017f0672157b105b0d8d573ea29c398e3d381ef53db375d1d3e8cbb5b33f0c54fe5205b5dc9dace9ca5c41f1fa38c2b5ad98aa665502aadc71379911ab8b7dee8cd2ca86666d3ca476f0f94597b7ef695d156d1aa994ab852fa8a286e021531c84c7e04f53eeda586ab388d166dcd9e5984031b9576ce39aded30deef11bb94f4ece30c7c22f36e670b6530d58c236d2c03b37f62df74a03c4ad5c73a3522cd29bdbee84763964fd64c2c05f9464f904a4f063b48a1496e0f03ed2bcf97ddf96d4c51602079a6cc155940556c5e11d0a758659970d1d63a28e7cd7fa235abaac5b74b05ba24d2e1b26030145dc67754ce16d792c32299a8cadbbc417e6645bd2c9488c5f5905c0901f470432175da0e19ef6855a165fc645aa769cb833779cb4dd95d5a58b30787e49ec3f9b6acbc14ad3d8233f6d3e254039d6975450f79cb4fcaeb7833f100bd4cdf8fff8e0f04396b0a42383d6b51b364300f", "5300ac52ac", 0, 1786612629, "371b3a0a9a964df1c71aafc793649b51f13c9d00ea2c982e25e984da27aade37"], - ["32795d5e0185a3cfabc2336de4831f94134f29ea3db4bbbe8ca4fe87510105486a7cc8d07f030000000800526a63ac650065ffad1c3a0417747003000000000865516352516a5351f057a504000000000951006a0053ac51650028d9b80400000000016a7e689900000000000363526392ef86f500", "00005252ac", 0, 1662367146, "f14ac6591a779adc32b5183147ef92deabec38d80b045fbf9da27e5a9192d001"], - ["030000807082c4030347c23eb1889c7538133e85a534a254f28aa597b0c83a3a9695a39517a4c33285030000000500ac005163ffffffffe64b9d8317e0fd34b269ca3d9c43bfff616285876d30d708c290f39e77d868eb000000000100ffffffff64d88b3cc8a2fcd725b2f422c84962d564839e97dc0195fc247bbe9ab44685cf03000000066aac52536a524e591720019521a7020000000005ac536a65650000000000000000037426710300000000000000000000000093aff5f8c85bae1cf4d73811bd0eac6b23c4899a695108381fd9caabeac3c9633e9e77ee847391f40375e43561d05d59b14bbc58e965d69fe1049776201f1466093b116cee74a672debe71ad6671ef0b7f70e30cb6bb1d87cfc2867f49fcd5f700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd67da5323af8b69ff48d0be3e9a5e920277225627c959aeb9e85fdca2335e91ba775cd2038328b43247620491c68c160fda536c1ba161a0abf3f668bc5fa623c552d61b8a8d9fda2e0cc6823807089f53d9f6a517d94d8cb134c9f4b256379b19b48841d0b67c8a47aa780d7b549490d2443914413892cd199ece84b6c93bb8020b9de9bb641fbcf9382944c4282c3c255934678c4b7c9abe40e1905dcd05ccab032d146c75df1fc430a8f23e7e427c36466b69ff52bef9b3a4a7e100a9a46b3d120a08995dfd63cd06d481b67ef63248a5dcf7eb8ee11c41bf36f67ad66475696b66f93605a4433bd31672e6616de351e3c8c6df340b227cd1224f20f88831c0e178022e396748b21dbc050809d931d303f3712b7402a20a4950182fffe775cf58950803117f0cc7ca8411985874df1c9d7e4c68c4279c8b0d490a32574d13be2cfd8f8a02085440c4474e7230ae94c7e6c0660c82ae99e8982e99d6a832a75c4b6fbaff8a021322d0c33b6e0f0d9d61152c784336a24af1e2ba733506bac8c49e531a818e420316fca5ccecb58a4fff52415d1eba886254413ea6d1482b1c67dc4ce0c4451a48b1073deb4899a2e95b7ab671d6b9c8831f858c25b5e2184d5ede739907a250c8d84aa0bbbcf6ad37fa5a1bcf0eae5a2e404ef3714d1f95a4985b028b2005e2c12acdab0a0d607034b2e787e64e212b46247d587f4051c2d67913b094876cf9cca0004a6e306dd9e5b7b76f38bf4c4de5ade5028ff10ea3320755842ade5ca8e08e607b8419fff86981a5a3c67e8fb6390fc76075c8f55c974bfb8f670289ee17c62f564f2f1d51a7e6c34de90ad20f0d2198cd8002aa63fbffb9afd256d4fdd784497f127ebf8b06d1b740be9669592b7762e5d2a40baac4eb7d3aeb6cc46760211793fef932c384a4b3379c38ba73e212dcfe61f2643097146c41364b08aea55df047499daf0787925cff8b340a6b61673e0f7465f77669620e50a1a92c777f76b8d3f2e31b93cecfc70bf9cc4abb90a4547780440ac4b3e06612d1015b3c0462900988c7da1597bbfd39f7e00c8e19783c1a8633b23d898a692ea62fe298f65e15ea8a3bca9e72c062b96b97fa3300c006ca593c34955bd78059ec13ef9c8435c17dcde2b3641b31e8124551ae0b6e456fb5b88bd2bb1fe57b13edc75d1267c16c00ead95494e9546ee0daf53b9ae8d2ad64b616b6bb8a825ba35d331ebe8b0e279ccfb369de28c93d1e6fef8389eee1ed0f18e755ccd30aff8de1168c546fbaab41ee8d3ee35e687e3535af7959c405110b5120cf418f5f5cf121426e9c0b9713cb1ecfcc6212e01971850013ec3370ef0a0d08b73b621ae8ee7e9daaa6397d8b918b29abe30de52ddc713a6ee66a8bc1b43be642c5854c7217d21cbefcca15734c887136bdfdc6095e8e7505d0066e30e0a67499e493899482f9c6fd3fccb298c6e3bc1795d5909326342ad135a6a8373a46bc9937ce55355d603c96efb9eff07bfa806efad36c3ee9a842db2e6b970dd8ae933b192eb57c3614a8b60a5058350c6736a7903d3e0a0fedc2c9132ee71f3d05590f9c81ba1fa1d9cdac284011ca46d4aabc0bc78990acffb292c4b91d42388cc8b6c7d3820158f6716c153f39216ade145db534673d305a67a61f1316989928113c796012e518440557032cd9eeac7309ba9c046291dbe99491e8ea32372acbb9282f6dc6a6e048c9c6ae8baff3873cb320a062c000e98e8d46636cf62234ef9bab179f5030e56594981d3f4bcc2e96b49b5b8626e26b02faaea7b11f8ae5fee654de64b66de2aac7ab768009126ebfc9c0afe0f83830ce3608820046ec4955143b4392c8aeff45039889de96b2cd3855e28192205133e0f9eecfec177fed817584faf97a4fb5fb5386bc3074f226430cf84fe20d0456269e6fd96496d9844507ed8192f901cd5fcb8579e5a2ea02a61d9d55ae5acad9b0266df5f153f4c50b1bbee8b8e8261637c3ee53d6bca31540b39f9b29d6c3708f97e326a4377b454954cbdabaf926ed9611d267676866b186e3d448bf1eb15fa4e02d8f3625364018cf1967f0e75ac3fedb0357dec8709909f260014e1d0551126af22ced624dee721b20724a8698ecd7b3a59159e80672b68f535e6dac3909d4419b552430ef2e5ee2174898b11b8c79b5daef6f1a8294bc0a53adc7b69d5d1304eb9088f1f1ceff513ae25349b679507de8d4822552302ac8a4e05a2e222b8b9c1eb17c8df52790df4630b52d661f1e2746b58224cfc86a35388e5ee029e06018cc09409a8522878200000000000000000000000000e806be0a19a4cd0526a2c3790a8c42fa4b556f579f664fae93f148db3d3d8b48d97ffb0aaf58d85350be6628185d2ce0b26847a1dbc4aefa519d1cc15aa0f5f5dee78e7c5975c16c409d906112e921f86bed2f047d3651ff1be9b984e9affe3c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006190c9c887d1b065614f83415627a4830cf1fd819e1ef295971f8176f3579f395861b8d3e733bf086217e8edeb4ac0ed1ea1c8049c91adf7d4e8315bf4aeb4e8e3d377493633cb943db6f7f78c9d6f20cb76654d62af3122bc7cadf6f7169a11b39d925a01a11326c8741345e632f67210e7be44d6f4531c2f66c1de847ed885020e535c3538777f36b84f82c529233071ecc5d55694d448e154cf0e0c246a2da30213f530d3b4d1f35b8ab2a0cb965acc8a187f82f4e615a7c836a2c3e60ec948e40b03aa086bee4fcfb7eae217e2cc80727dfbc6053e7d8bf82d40e1276f957893d01948762ce2e0af707aea1aad646c7f9d99bcb45514344c9fa79089cd5a986cc9020e7e4b7196354da526e707469dc2d35c90a4338a7697f2ed836c1f672aaf5f1802136cbbc35edd09fe5f41360ae9103117f36d590ea3ab4530e7b9c9a57fa23c16030e2395bc1c93e088f15545b9fb054e55801f4e0299c226142aecbdb610cd4655030300d5b01e34926b7678fb623d5067ee891b27345480c653db6b8bda9fc8e0a10204be1c91321a8a4370879bbcb1c726e134b73a31a02063141409e2b443c69407a0436728c4fe68bef1c5266e2af8f0a11cc688a287b96016689472cf7dbc99bff528e5082f333d69f0c86e795e318ef2b181e47c827ce8c737a62a4251b55cf0aaf6e55fd02a9c67aeb09523c490bd978726dfe5ec81f56accdff475a98213e8ae2ae941835783710440763285847af97ea223381a586463e0fcc17a30f5bae4a40110c5cf98534d7176796d49a67c6b77fe7cb0075ec99828477a353e3fa43d0984e8554fe7135e4a755e8ad8dc1d533e5ec40e544fc09782a8ea89e1dccb3ce1dda2226dd8fb830c5dee28d1c05bb717c5521626ce9484847030668ffa6d2c0202856f423839815c79cbff42f87a3a3fa57af10066bbc5559163d41d3bb664d31141d4e53ea15c1ac42bc69971c38ab06a8fdcdfeda264f5f20f6621b56c091254666e5fe23266e3e6a23b1e8a1b73484273803e2d87028114adfb9f535612a5915a7fd309171f719d569b1055a81d73408967b778ecd7b5f827e48ebaa00f46bf9841643936cf9a294f197a0e714edd8207a25a55f897770e162b56cddd2fe01cecb83779d71f64a5de7b1435d0515d1bfc4dc9df2f12cd0103fe030b13913b943e49eba6db88816b26ff6512b94bbc4b0d53f483cd173cd0894f659e96140271bbcb4c564e71390c0846d7fc3b6d864da3c1300b1f71b6cb3ba4a45ff4eca4bfce1ce13b5cc424d4b80a650b134b061b61e0e752f03d3851331c0ada81a15448a96e4fba7f5fecdb0de0257450bf671041e5cb7702c8c983221391f70f4fb4f694d6a39fde30040cff6a9b504218911b293118a278106ec33b507151d510fcf878a9e7106e132436670cb4f2337c9d4ee075d109b5a9459bdc5bd5a667e4c37c67847b23216d921ecd2612ce1197f7bd6a5406a864bcf04f6c2a4301831133fc125c95e3ed8357ac31b2edea9217df213025f60aa948bd899504919c7160cea1bfa02767a55535817fb7935429f604e0672aee8ca783a426a7e2a0c56f2d557edb88ac1177223a719da088b1e0fb1489216b650b3aaf083f3b5191b1f8d310fa1ad57855499e801b3115ece066497443dc6127d74a487bf7b48efb940422c29d194eec70e0fe8c75d0cc3b468c7bd9f13680c9734968308c175397e7c0757471f21dc9ef0ce4ee76b855876bd0cb4c6a44cabda7d6db1c66a44bb78003bb744127b8a6a3eca00cac3f8ff6372b188a5217b4e68200be81cd49c0876fcf6c441076b70f6a136e76f23d6af60642bcf3abd2faac9aeb696938a2e119eb2af21182a5fb335563ae7ac3c87d4fd8fbe7b2ba15de6b33b403d4f625272ce897287332bc57cb6d12500e32d327a5bfff2f3fdb40d949a3b2aa24c402487db0bf53e5853352004135ff4c65fe423a8eb71eccbb4c3e6ebea1f2227adbc622122f7684619c22ccc2f77e34f60fcfb8fd84e29e01be2ecddde895ab244ab34e35ebce9a0ed266ef4c59968849dbbe4328ec01a8204cc0f20e3e14bba4ff38939eb9e236e208e731aeb7dcbf22519ecc329ea242fea2b652ccd6a91e0e78a77ab7d9f8952a39bcef24fdca36e6612ad68a11157949bb18bbf5aa1a73318dd76390e5d10328a2da0f81d42df032134e3cc479ec2c8e2fea5b969c435c44f6ae642ad7e1e49b072c6f957bd8a337d576e3de762b49cb54b5687349a0d0c1c9a55bd07f61705dff80f6addfdbe418b0835cbaaa1e4adf0000000000000000e9e3a005000000007981b5c8a482fd08da59472f1a53d727e99161d39519a843e941a8a231d70cb4e26e63ad0cd934b4e9fdc305296af337e37cbac4770d6c1afbc71811f4891de4483bdae534f759ca40ca02716a8873314733bc16f8eb6463eca8b71c0144d46f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c8348284cb14d43ad92393f5e65c3615a7ea699fa0da72560f999cb74744a88ab39f3e03935d2a2cb630fda3b6f10e28ce2ccd09ef917fcc9f3e2960a95612cbeb2dad6d445b79ce38f852b5661a25e65dfc9d10015af75c291b3ffd2f7ac22abbb324b4afc880443e52a8c04aeffe6fffbf85ea0af1a11cf7890a77a7ca341c030cc4cc6509a0c301c27ade9d32d89959e8feba33fd59ef2be98d3b0ab223501e0212658481d3650fad8967366de4f919d9f97c99ec463bb78099014b15624a211b0b0221704bb56384cb7a17b8bb57309cabb48c41b1b026282852f319d32c2d45d0967b87e747751de5a6712e0d9f264bfa7e10be97c7bfbde98488dfbe97b0c85d022a51b828575e1b2c40ce9676f370288dd6b507b6e0caffa7fd5fe169ad23152a030d51d9c9a034918c5d922fd9c912ceb442cc455e448dd9371c81ec6f9da5cb3103162f0639857e00249fa6fd0ab96c02c55dd4d8c5825e402032faf1ab912bb1c3021694147066973927c1b83ec9188cff1487587d0b0badc3b02b1a0bbb36f10aa803048a14e26160dbf5238af9a25fdabc895275d8ff3ae3da660d3a6d6c8f53d8d429300dcc02241db68fec8e35a8f6a74d328a91b4f960b2b8fd53ac07d4bf530ffabf8530154d30e9511496d9809d3460e03e69c4c5dd494db509d3287e20bf6a67025542ebdd8f6eee3703e4ed2478eea8c3aaf21fcca5ef3b7de249fedf6e2be3adffff529e5f5c4c8405721266f7c8316fb5f0903cb28b2dbb736d43d245ef4a26651d057ce4dc65e5a10a71e314981d4bc65df03355ce5fa2577ed7aad4f3a774ecb6b9b88d16eb71da91f057fac58291448d1be60357da42da1519045b67078a55165411c600b8dd81c57365a4edc805aa37935b714e4dc231453de8bf70b77f1fb3a5f5f39b3c325a1b43ac77b790219acc066bf59820be123f17e4268ba8505fa912ed60da3eccca1d04f5bf2de564d136ea5ef4893f65c88dddda8220971e730c6f62fc3a37e6bcae79ab7b2c49e75891314d2d44b603a26c0dc234ae1e1ae28984f371af04a667ed2a8bc4611b1770e6638314b301699082bc7230dd36ba291a9b507f431ad62f63660e83e2504cd11d959c4568d38effe67662a131118b69d5f77cf77b49d0db2295f1753ba1d0c20f3f470813395708b8072879331ac421d078a0e5476819079a872c9652f344e2d1b698267434db16bea2f7bc713a53aa3919798739ab2d6105cd1cfe5ac6223e55cad8e1b356c5abd5bce75698cce48ff2127059e2c635da752202856b488ad33023d75d89cafcbd59dcf4e8d20b09704de31ff79f0f5a3cfd98a4c71fadf07cc35d9366014e51caec217ed5a10e5bb4c982cab616779555c4e00b333b65f1aec1804760e7a6b535ab3050e48caa5991b1cfe3fa5e8caffbdb780f7b58e4e0bf299ad58476d08a869a8dad4ddc59c044261a93b94e0460037908175e04daea76addebb20e81718be196f709f9c3dd337181de3b4cdab15d920400b8368cea3c8b8f26f6755a62f1c7f31cc32c0db10631d3b1971239ba1fa5ae16858bf8271e47f6084ac038b39cbf4e4ca4bfec750f71006482da453f352dcd8d5d4318bc9e021b7eb709d37c055c69503cb4e1389b3b7efa979a936f8a6431949eee224dc30ad27066ab252d28ab263b3265ed9e8d9bd246d705670cffea943b6cb45370a88e5a4b09a627a378ff3cbaf56485c8dbaa526f622dd100831f495d985f654bb68551a0019924ac307846357fdd53e84e62982a18d1127b56af125903f49de5eb03846cfdb7381a8ff38e7e1c4af58d81e59004eed49e2fbd80f1cf06e1bc825b4c008cff5f3a8a479a5bbede65d0fa7168fa010e098d9aaafe786d1034018f33367f3b72ea79e4b03fb680dc44451e1f44430f0687cbc8cbaed858737b12e5a07b4a4d3adb553f2c7d7ac17a15ea96003059785de50289c93ae5511e462ecd5dc18fe8ae14b580b71b6954ec9c89044921278f969f0de46611724b47c426d37b3b3aa72c82c684484c11b1b9152e5b552f5ac45ff97637efb368ed9744f01238cb252504020bcdd65a9266e36bb03d813f8cd4ccc1f6de312b10bc901cbc21865586a3b7e59cddf3731a2944a0d6c425d999ad868493d6329e2285542ab3f5dbeb7cd15c2346f7af2877019c749b945690f69babccec6f17a0cb21ee42e972382271af5295a9c378c10718be62a473707396e29431dd08525439697fb8505768dfc6c68064aae25b7a894869a88faa1759160ff1b1a3f287385aca5a30dca865ea436b0a83925e79645fee79e41038635e1b5daa8f6cefd37ae877aa0d929dcac955dc3c6d1a1c8915bbfe438bbf4b3985a0aca4a97ce0e62e289af003bcd77c76d1e0bcf6aa57097e7393f3c1f581726710372670ad394b4c49a249dfb9509", "65", 2, 497516486, "331f07608e81e38c5059ef57cbc83b6ca0462ec41887d3f6887b50e16570d9df"], - ["030000807082c40303d9fdcc1b243a89ad9f942a4d20127060dea73098f19462c04b96f536d455b4580100000000ffffffff1aaefb7494db9145c1d4aa64f8074f9acb4d639db43937664b6206bc50193495020000000165ffffffffc3fae57cb020af9e6ab480775387c95604ea915dfebc4931b77405c47e9cc4da0000000001acffffffff02a82dd904000000000652635151526aab98f00500000000056a65525365000000003b5d4eb903000000000000000081d3160000000000b2db9b792c0ea2ba1b9ca5934e5a88b46156066edea28f9e8254afc4f1576f540da73f691eaa5f53af5c4b4248a0df5b23e561fc0b8cf415a61fbce280a7d40d1d1475b5e8d8659427cdd5a8abf299fe3077dc32be911b1ac3b6289fa1135ac100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f895808e33c9b9d586b71c790378db3e8514a102a6878163b6b9f89ff0f9015f143fbc5b44ce3357011dc8a3b4e1d7642ec8275acf8de06f251c8753e90c9adcdb1c1aa92e6753137012b1186dd3ca1a60a520a53173041d1c178858e524d2a877e3e2314e51e7318000d999318820598b0135838eaf4425d0abdc4c9a1901c6022c66694e8b5d7e31a4905352603509502ce621b90dec411c67290e7dd213cab3031646e9d65e06635b07bcfd5b1e48fddc4efee1b8ac1729dc0b9c5c01c57492170b090c25f0a26f433097f473c3353ec7ec5996149585abb545fb2468dffbc037393ced8c8120e432e4d42eb1452d59165e99ac1ceee6687fa7767ac71404bf91ac03264b9719ef0e0d82652315feb32133bab585bb4fd3be527be403ae46efc3ba64033052eb0b8620e4c4aa4b39164fe49f09a8ff5f89c0855525a4e5bc5fc17da4e1032fad20ace982e906666af411c74f2ebe1ee8ea40eb8a3d72836050064ee89eae0305e511715bc684b03d1cc0cabba6912ce60c5dab27af91cb947755bd0a283812020b97058f433e1e8ed38f81f29f70aee67387c5f944ad06dd8f66cc1f341afaecc0bac13e85622c5d8daf7af6321b647fe110b2519f39a3a509cedca0d84844f103a40b4c5c034ed7807e2cd4b6ba88a28f2f5a578621119f95f45cdf71c929806ab6dec9cedd4e4c710721246310d6f4930fc7c0d8f32583cf3f68970f4e0270111dcf557d464bff39021d1791528e02c10dd49b6c55f760af2f932c74a4fce08451fe35c267c9c2a7e7a77d3d7e301d3171c85e8243f61973bce109238624ff4da3d9aa6f96540ce14488cb18600a61763d86d2bd54f2a5e3412f4c32068b074be6d9d4355d1014606c9bf9a96c81a783689c235cd74504811d42743cf8dd3d4b09a70caae1c9e44875b5edb8fcd31c808d09e79c5e5ccacbfeefc4b5e81a5ac064bd3b992a099aa6a1b78ded750bb558c8671e5463bbd76bbda59332463aff1bdc37026b8ff1e2c04ae3198cbac135fdd21be089372f3d907587731ead579a1a3e86fcdb5c2d4424ff829553f419e6d94a2b83e721fcb9bcc600e3291992ed523a987e16b4f37f8cbe7cf898fb15ff7c4bc0b11b908c93754381b2d204eec21f1fc10d32021053203973397017e52a48db93ff9d7c20a313f3ddb767aa121b9cf73a8adc310ccf216caccb4669f157b15731ba774c841011ea4fb6df8bce95605b140754ce28654643fd7e158d54a6b05f8b11cbd1938004e85dc78323441c6fed569f7eec428751f4e7d2d8476a2608d4ed923a79840b3789cfccb6ae82898e95c70011a7ba5c7a0a4edb79312563a6521f872b8f0146c9aa385c7667120fccf2e1587235656e4b953926b2e5f77a06613df690d89c9ab13cdd2d5eee5718d7d1871718070a7958fdc0b57b3d5b721f089af32e301c212e203851b13f992948093dc0f7da6ef50aaa914f66966de2d952ed1868951b866fae9fa91ef172dd11a13ac51b68164984ccd0e71440fc16a41ddb4d5115abfafd9adfa7cb9a53270b0db1b0085bc2f2c851eed49cfb17d7931222be259d986ad6cb355d803c4cde22cc096fabd63118b78b4fb3e869367a993996d8ec06aa8c016cdee27914da9a8495ab54d1baaa13a0fa61aa424b10333d7dcf449c6ae6ab1a48984a1da7610c361c6d83b87a1f38be38a82096fd4b3a1300f691dea27284b3304ab201bb0e692563e0c2e207954987a180e1b2bab84f9bc2a78106c999dc6d92db3af0f499c74551f191e12a39b9b39143530e9a7e53c1e12ec5873740b0a7e8f93f61a70b04b99bf5040ef2070afe7674565e967b23ad3b17cca799310c197d8e03adb7c54c09ef6a25a75cf2385389de85e483be24b3f1102aa93274de4a9da19eb44cbd24c262328218c8bed505ae6e5ce0423540f19df5987f4eac52c20f59d5afcf3960326c04c8f2a9420a8440bdce1d6fb05dc4b191856a9d8d0d772ec492f1542ee308792489388762e1ba3af7154ce5f4fcc68b11edb14c53ff8b9c7a02bba66bbb0f2ce70321c2eab13974781c0acfde846d0233a4af5417dffa43ea8b142af3a4b3e558da31ecf9a452ecc81969c6cb90d70c8b4fe3b1336eeb1837af4c5fb7bddef2b23a7b81d11db578785824f537ccfa110bc92a83f8fc0fc2c7f85b539f031943f55dedec6d07662bf43c7e6e28f2340ced26ec0908b597454e7b1b0ecb59abe073b38dbe332575c3351fa1388019428692e28fb80745c82953370a8943d3e1dd11b6cb0c493beac2b582cafdd5b04aad0000000000000000856d6401000000007f6333f2b4e54019d566c0068e46c5c0e7e3db5bdf9d6fe81173adb624f1ee092780e133adcc8ddbb72563ce24c32d70bd5e48745119891fcae933f30b73fadeeb7955197adb5e5f8cd072a42dbc4b20ad6fd39d276748e102eaad9307ca64b200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000890bce394f972d9ab98a2168f482d00d80c5610640ed83bb84056882c0bfc0d6e30c70feefeb77040556680b6bc2d0702abbd992d9e249ed5244a626df77b23b13253e87def7ea0f34e1aee21e648152c2fdc0b8445b900d291b227ad07ad1d4968699979088ab629be920d697389aa3ae822c0e8e0364780a9792e36d1acacf02085e0061f1f139e7ca43b089ae642fb46eb52ad3a8a13a2b418f23ba8cccc51503010f96e88b546dac329df535eed5915fd148b3d193a4b44b92e2e7f148245cb30a02fbd19fd728efa8328817f26e4f4d0a8d679d9a23265e22e5d23bbd9b45277167e0fd45f38297807717aa17529f83f8982c4c32ea0e8de768f8b724b79dd802021e932ba5afdaa7b0d3257eed1a9498ac71003ba5ac0f769fe1dca90c6e36660a0306e8236c206a80a6143d2e0f46bcddc6f81a206d93d5e4ad049f5df4c309cd63021ee2341e553303a08509ad96673f4fc25f142da090bcd2301cd72a17e8e234eb0312adfb040e15a674f33e72f083539447ada6b0e2898a3c5ba7c13a484f9d734a0211db4df7e36028ba421d6e96400d5b9579bae52aee4729eb4a222a27bb885854745cf29d4d7f01b55a18a1250385d899bcd0359dcca5b08c945a479f388c54fac95c3407d8c64d4a905fb77d4479bbe7f36bb5b2543aa6ed0afeb6f373683cc3792d35fb403d71776ff5aafd794d14bff146e2fea07d14528c1391e6c6e1d72492636bd72e570df81012910ed672bd1d760edfacea569b289ac76cd8fb63487374fdedb421b8182b2663711ce51f2aac7f522fa50c023a6b523d629d0ec58b4c2c665fb0566ce5a2db7b8f2c4d6a4bb2493b3ac048d9b113325e02e99658d62718383fc324fcaa6a9a45d7173a9a0db4a1247d046e1b1ed1227f40fcb0259ba11e1dff3db9a14102f94636c9636c9c731ffa2641b59e5b33a1a81668a2cfaab2004e4440ebdb24c8cdbb7dd473ab15a1bc813f3a8bfcf9d1484679926365c1c7ebc107e97db22d3696e2c0590db55615c68ca9ee7e2d96d7154a06b110a5b9e886829f4681f457e75cad0391393b996d9937554577bea8f9a620b2e9b6ab0d2180c0ac6da7dfe27075f41069cb5a302dcf60e1505d9f8eb5533737b37115ab39ba4b5dc96c869060eb54b5951493ada251e9e287c4c8e58b85ffc1e93e8bc51d7d990b3a45c7f0c2cd4b1b5197fa6d7988e9a8971da1e16d14df827c34695132707f8a7a1d1478ab552c80629ec4e39f9fd9408b8edbdcfda738a3c691a4d81b09d5a32b2f06003ac38a949e1113d5a8d249296a17a12dff62a2f091582c30d3af17435c4fe11a9aae42212f39c5ceb08b6d5649b05f71f9782e91f039bed6cc1544139c26073bbc4956ba1aa4c62c70e9734120a2c1da84f3bc18384b0ea92f5b3fd07881f7be41cb4fc715cfec70dbc6492f9d82b99c276de9b73e7bf482783857b0b195754f34c586563b88da39c2389cdb0f64402ce6b8b0e131450abeb09cd8897be92420024b18feb91da1c210200241a158b8ce494c957a94150e042a4dd1cb23544f3d32fa15a83b3a946fe2327a2f1f003662a42cfd51b047ad03ef818c806282da6539b95f23174b4908be6bfaa192f87f1ddf275b4282206cc4454aafb2241c1077dc92dc0630750bb51a28d1c3a23f3514303bccc93a65afbdda4d03437669003eab8fade0a9443969a10374832dd8733b42d24d83d8991bb122ed971bf2302f408a0b36bd3cf92710e2e3d6922e4961743ba62e1917b24e03f58d90f477bfd84eac785affcee5f92dd33a22a82927352b5e7256f4ef1eae1cdc2867c76a327aba3dfe96915fa68d7507c182f952bab12ed46b9a01bc0eae5604273848f177cc477eb304e5ba96f9d8c971c9425bbfe385933f157bb21cd4b8e34737108519fd29f5ba45ec4963c6d5e50b9734ea1604ba8c46a35bfa86873a9f062bafd997071f2bcbbd178a9eabba7ef1558ee09700d557e9085dd868298d2685f1667784ce88e689b2fddd162958b16e827ab12b22bb74768df4b34d405a43e53815b163eefa0f78b64b4f1e753dd6769ae0d041de86cba46deacec3a1a9602ee68655274232d5aa5e40ad41f2c96a2418b81c60f14b3b4bbe0b8efa75803086d4904a71f9d503c213d5f37340889c409dd8241ad4573a6bdb39bf9d4eae6f284ae5ff444ed6a6c8c1f5e3a563d725b518b09fe2ff0dab4d4810fed1f4a5b160e30d76c4e1c9c33426c0763240edea1134ae2244c320e1fd287ea4f263c78a54a1382d445e4b28d871f94353f28c504604829712040000000000000000000000007b4a9cac9c4e1717cebba5a097029590faafa73db467dbb8915acf4cf84f7e5b0b562040ba7732720bd2c40a2e345fef3894f82e1c72db4ea3b91bf4cbb2b363e4291deae48f923671a5ace73b5d48380bee08fa71cccacfd666490c2c4c90af00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c8f96fb6a618501404480ddf0074d8654581558eb2131e9519db5801b09de173719dc9670673acaab76d1065d3371d7e26538b0294ea38ddc6b1fbeb8121e7557f9527474e223e960fd3e385ff2074d661702567c0ab51a2ab89db3f60f4d35370c4261f211b071172837c45de8f1c3ec2da8ca68c110fa3010f92060f9d6b3e031b986d6ca0803d094e2e40bca105c29a1e46a34377291dba38f24f02e6b23175021537f698a71d6b764248ce00114c0dfab4685cc4b7b35c13b2f61d27b7b50c7f0a03e40349c830a90b697bd33b58b8c59da1c8bddf614caa0525abc5551e6fa8bfdf2fc55dcef4a4a6d1a899d3c3cbc11774a13c4195b7691526802f38ab170d4d0325368020ea7343cea70b0c1584835d66c1001bf9a9fb83acbdde38977719c4dc0212f00c7e047ed3b0d8adc0ffbb1ff4bf1054e5c92ee8ac1897bbe6462744e7b5021c6395804eed6621471d8c744fc9149de88f8e8ab9d41d5afb2674f3afcb3ea6032c61224b3da8345f6ed8cfcedcc276074752418f9f88c740641ba5725cae0d55031a80fba94bcf55d9e48fbe7cc0944ad977c4bf5fa0189130b0036751eb0f65f3486bcd59c2f2bbd1ca7073e86f6c384f54914301c3816a154f9ec46d15b0330297354dc668a1a3276b6bf697b5fd32a96ddeb27b4ce23c30714565bba7b2f4e24663c190d80c4225ac4e7c67a84b75a6a94b49e6b2e4fdf2f3236c33e79bd7c45eb5f0c5b36a652f6dc32430c2a6f8519120cbfb5dcf442ed47c7196c2164e7ad807d075f0a28b3978864784d108147938c282c8089f8b2042999ce75238cbdc9b05915a6a5e08a43ae47bb629dff970afb5e5f93f0a14dba54f708aff230c255b78ceee7cb4857dd74aa16c5cdbaf6dccc73f6bda55cb4542d4ed49ad4862f4a02deb756e50086ddc9dd52190bd03349e895566e528561595394cacfc19c9d134fb108e4e052d17c55f86f0c7a680a0f338ef6ac2f0a3cf2c8630f1fc33e8aa1fca6674f7329728248c5861e8d624ee52ebaf6eb46ea1bb7b7604475ff97db98923050378ad817de91cb1592d671cc8104f1bb392820645fe29ddbfcd74a03a4ac0ab2d52e75c2959eace7116ba35e2f713bd3618221d50f3db857b8aeb30567a7b6de5e762e34d84f97704f097cfd73f1374fcfe6514959bcac707562a5d5509b1a94bf888e323bb58c5ce91c361237bf0abccdbaa90fddecb596a69759c165bba9d79c96c9251db873a64469609b65c5c2c8a4350be020c569c88479cc145f4a0b07e4796aefcb4cc09f8cf15a58bfdb9949245aad296a8fd652e8ce961f3303d2d7c9c81cd3802d5cadf0407dae476cad8fbcf187207458c8c064d67d1202563308bd1e806e23e6ab1f7ba28af8061fd792548f11c0b4a24fc15b459e83b26e14fd5909300d40c180d26a5177e68221984c0038c06543f11126c048a0350e233daab12a84a66de523dd1b36e720563b4d9676d3c8cbce356bd959e896ffbf96dbc155991a626af33b76f8ddd2596909e9cede45136ec80834059d2a20fb84ece695aa5f1a2a6ec3834c10ec63665a26b3d3f4116238accee95c71c0de56216742f5bf6e2bfc15176578ceb42c2f010bdf4273623825ab92cb3ed4ee2f19a2f28b27b53ded36ac1f0491d302641326da821db187673c7601fcbb89d737ef98a2730e09454f93645d4e2498073437541c3906543f986493a7539a9e7dd973c716e3ec405348e460229ff352f1b1f9cac7667bee4eede3902888ea7043b95f17abdb01ef15bcf73b71f885ea2a343f9d934ff8dd9c2580a98d7e3962f2af9031e10800c5a6e905c3bdabe11400099c7b84e65b2e181891a0cb3c399bc5b25920bdba357639f4a53962fb2c3d47ce040083854d3b4a58d35cd4300c8dc3a566998d66199c1dbcee249aa7acab516c8de730ea4f5cb588df3cd3666278e7fa5c76c09a285b58fd57f0664e0173e59453b59545e21fea1dab201fb80dbfd361c4811d5110dfd7b31191dd0cba285b889bc7d8bc739eee7fdca84bb8a28b7674359a4fb9cd5c7809e89c3619cb183c56d905f50f4728ee7867740920cf191c86bb778b63cdddef898177be682ca9b22c35ffe775b04b16402f318e2536786d4ff6521037be6ec8c21c457546fe8556bbc255392fa3f13ff79e3c6b87586112779c8dc06ddd9ce9c0891e6c823d6e35e5b9f5b00ad13d0a43fa54e62920f8d602502bad345a5244550f1440fa8cd0f5bbfb86794c84c05920c0eba677e61f2816963e609d1524bd3e1f562175da5434065590dbaaa8f8da9dc8e377e5bae74ff0bf03385b6434449c2b30f68b56fb68f18742a787a81a3219989481fc0e386e9589ce6755fac8b99d3830e0b083fe04be58552ec0ef9eb067945f353b70015f2209d4b70ad658b29fb2a569fceda5503b5af160d", "ac635363", 0, -210674011, "dc8e5f7913900e8915979706c86dec560c99cf0bace9db9f31a8ee9456a65bf4"], - ["030000807082c40303f4b499c5764c02138fd1450e654b9e957f3c6313d88d79a74c539fd27011b6c500000000076a63635351ac65ffffffffed49f756b3edfb596eb6f498c56aefcf6261259845a7f37b950a08e911937e8901000000085300006a636a5251e6205a48f8d197fdfa16488ee3ab8291ae7365cffef3e77634105a4e9318e64c9764294303000000026551ffffffff04d23d3b000000000004ac656a633cdc16050000000000fc1976040000000001537518e50300000000080065536a006365630000000000000000010000000000000000ec338e0200000000b4e70fcb010d4705bd1716fd9c2ff5e68714c62ed89953cfbcfe66dab53b831b9de3742d3cbafe687fa2aaa62e68dc361c7db5dcd956d2c1088e36bf133c5941ec5e667f055de0996ace9da6dcc77d1fd0b6f8c6d62897dc1b510a0650463f52000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003dc67933c387f0688eb8ef75e1798f706317d174615203d5e36d74fd2a6e7fcbe7bc33eac8002823e0aacb06b906d9b766c255a3dd0c04af2e6ce074b0e271bf4718eacac64d8a775216a5dd8579da9c64becd2a3bb7eef3bea964a91b4f115d53236724fcce03f3d74d57ed24f3d6bbda6b21dc1dada3468fc2eefb937b3740021c6da71b6d1e3830f43b3de8822db5ab16d80a2080134599ab17c7096290dcfd022eb083f487a6b2747e96b0c8e4bf6723a371b67bcb0c4b5df3ac6e119772efdb0a06850ee497a6347f9f723eac16a06e3bdd31aa1af839b86c9ecfd070809d2f42f9ce3c8a79247f6c4aabbd15d662140db454da8184e790a54777ec92abe7633f03059bb2735540f6359363be68fcf1d265d3756be162c6a4a2d140b1fdea1f039f020bada31c4e9f48c8aec4d36b8cab13f301f8896033ab1bb51ff16eb65fb17148031177b307538760c2c689b577950e3df67cfe05086455c364afb70ee33e250ce603147fea825d94fbd6ba43d4cb50487fd56e5729b8cd0010d9da40824d26cc0c500309b4df6266b103be257550b25a901f35c1992558c814fdd74561f474575834be76d9c88d8613c2bd12b16ad6f56c6c2600e27ffea0252aa62481324c3568964e3a3a75f7f54c63959079c287c14f3d6aa058b3a859448ece3a3c6eff12e6119e7e930d4d8a17b6a6221ac5ab6958a51b9d51898cbeee25f948e93c131baddb5b640eea7c8570595dce6a4792164a3f9ef1b73008d14dfbbba69ee4c5902836b48a2635a38a8feda296aa499a6a70e528b44cb9702d54530c19c079ab428ed48442461be3627407e256224165ea53ea1209af76218672aff08b5de11e560eaa0b9eebdb88d58d6100f40412c9cc87c1abaf28130cb58427e8425cdca3fd21fb7a27999042fd9471f0150e3d6b7afc1b0840a369b512240e90c999aef7d4cb1eccf70684488cb5acd1c3ea59e816c9c349e207032bc99cfff715779835fcd92129aea1a6c3307eb9854fc091012cd44553c0d0c3dcb36301466d1855b12c0aff56c50562e5113db714a54336871ecb17607796ff421fe877415d6f76886b2e48be199b9450d6001bf9022a146b692628ffcfd4738bad8897ec64d0dd1574bab8c5119b599f743f27b3671717428ecfccd43f51947513472bb8ca7a8a5a3504d91d6fef55cea7d5c3da18af1f04cce1bd99827e86a8fd6641c58b7338198deb2717845c49546cd061a8a5ceabff2b4ca0c180836025ff48a1ec73c0869eff7f466c91dc4a30bfb7ad99ca9814bb0c159fc3f975cf69ecd1f08b41517a38a8c8a232c54ac8128dc7787573e739e6d283339788e6a2216305899b26667b85dd3de6ec11f825853d4414229f1f66ed7f4269cf4ae753c44ef342652f048f42f3a676e52088210a03f31e60001eab7535a6caa786fd6d0e8f589889c659c9930530904b3e8dc97b15742df35a64823237c5c6e0583fb31e8f910b27b07bff7fd402244cb80e5c670fd1573147b1bd34ee26a7a9376abf698aeddd8fb5c32999bcd7230da7967c2ada884c43973829b421a94ff310e2ad39e8e34633669a05b35d6b0294e72adf3ee9ec211d8953ffe4b2d7ab7a6a0a0bb7269b316ab0308272207c70a212fc2b106319cea389eb69156d4d49456c58ef46755e60ee262af07ab3a3e142aad2290eb6584946782dfdc9eaee212f15dc8bb6f255e0cbbefbd8903d07c57e2428e651e79b6317e60f10a200fa7a36a1e8ec0348cd70bd87b5865771e03d1c9d64a751500f98d2b83e292a5d91e92a6c7b5d45bcb30371af38ade06a4e5bf086740601da65efe0f52711adb3ea7e560edb26ebb34e222ea7057cb50a86851d84d5df657770483ce428c26b37b84e6dce2e2c524b55d52c896f98fc97772fa5134b36918ffffaa9d714553c3e3341df26035512db5c8be14aac3c4eb658103de6a77cb32b1770dcb971bb6947dcde088fd89811e8850ced351939206423e5ef80a474849a911b2ca07f03beed7d224a190bb1b780914c8c1fc25df5232cb0a50322a3999b3e6b050cdd19766cc9c033a3f1adb4870325fde2e7117c07a4bac9cbc877adb4a4a681ee54464d3ce2b6f89b97d579af4b46df2c04ccc3d2f5e71e1921005db7f4ccb0d31843dfdaa7ce377bbafd2428086f9ddc5a345aa2880232b56588d6e1a7f43d7db53fa0a237035f80389cbcbfaea44076a01260159e1d5f530cfbbf709d31c656ebe6c3de733d64793f0b065023b9d1ddc18c0966937af9170e3e8b9a717c4eb26e724afb641e90949496e4368c425038423fe0742ad5efaa8fe3bf7af38a4be55b7dbed60aefd4a5c170ecc722b5f025401e6b83c1112b398beb070fe0cf18dfc9d2f49427a3878512339dc59fa087930c5d63fa14ee1ee631d705f3f7c2039e94573c59af72c37e02", "525353536a63", 2, 840246195, "ac1ac76aa88df47df100f8d6ac92c120e18ae55b2aab54c9534d696e51c8c2da"], - ["3995aa250464e58ce96a7977f1ef53426d6218250c71710baf57b283876323cc02e1974312000000000900516aac6552655300ffffffff55e26946d8632bf6a04df245e7322a0d559b313542b0ff6078c351c0ebc281140100000000dadd0683f75541a5ab66440c0d054c3a2b31c314df9eb593faf2acdf1f49fcf1cfa45b7d030000000252658776e0ca71723603890b8cff3b549424c7086cbe569314613ba4a4a64fde320a39b14436030000000765ac0000515365ffffffff03bc7525030000000003acac639425a3030000000006536a52526a63bcfca5020000000000000000000170cf5d0300000000000000000000000023a49697dbc33ba319e50bc0465048a624d8628ebf60b548cf35aa2ae5b8d4c00d4abf1e4d5594945d1a7d728aa20079593888862269003f064760fe0a5b14dfa202ae933aa1244a58191fc8532e09d5bf62514a136101ebc0b2a631784d2406000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006756d8176a0944efd246bee9211b598c1a934e3bde8dae281d1e2e00db6fcffecb4dd7de015f71e82db115745b66d3693a8674e4bf787ec3a86e5e6c4e9d77447a63a250d7cba0917a808a2166d65eee3ff3857b6c3c5bcd942c67c11c5fa085713e005207bbea5b09cc8bdb1261efd057831f6669a2b488da6dcd669b5b952f03056afc39f09fc15d2f8aa2aa9b3626a18e82fa1a70567ef24e3ae6eb41da4564020dc1f79f8b7817dad5c752d108184948f34a63a44ada2f464baa0032b25a7b000b037b6c87f9688741221c9ef79a2219b2d8d187e3e8891cc69b12feed7d6f0ddbda681ac8ab437a9dd60273772555cf59114f0164a82d078970f13a9b19245b610318ac6dd4e49becc511119590394f42e8433b7fb6aa107a210476b1a577125b2e02032afefcb530d49c8d437cefb6a630f1bb8dd0136d46b0db770cacf56953fc9e031fb748c30feee3df519bc18bcc10c436a2c1d55dcc91ad8068856861eab6923a0212b50e7307870387b0d9f8486694ab60efc02b0b3d7474e543dad7e1514e5bfa0313ccd51d60112f632d39018000d93d6ea699108066292787d6cf29d311b0ad9dd67da680498e81ba6c64ad0026bc2be94d7886f5aa68af6ec36a9ddd42c7576acb3c7766f013134d679475c1d59bc4b71a2fa815d9aeb0926ddfebe1e14648a219f80453819f2994c79a37038a10f95ee9f33ef5a9d174b9bcb6e46402ed03acea8118e864c884775c72101ba0021531be18a19a9d443daeecd5346ceec90fcc867721eac32c908e413c82dc2fa6e184c6f71863039bd2560863193cf4c462e0f729674d64d35b7c83158a94dc993a4b7ccfafa18670c36b408899bf8c394c1885d26753648189586329f2e73158997d3afd982bcdadc633f8210f5655c7560ab67c723af5963890729f6b759b9c19d0f2c7da33b02e87a77e2db89d2bcd79b3193472082b9a80523522293a6a8d22a169f1110f73f05aaf52edaf7884bd2570f50f667ef8db1fd431b0d60d4529578c2292710da9efe047b352fe246abd8ee9e94d490fb3269da086c394a174cefc20c9a357f79c9b6848641ad4bd8634df0fc1332c57422fdc0a5346a45f477c41ed5fddc2b6052d1cf360e8f621b5e63db3364bb48aeea47a319267c5f00c4308b4a6f3e273a676f07bb70f23b4d374f0cbb5f63457ada7f3ddee0bb8703cd57255e10e8cd85d23bf2c7bb7e3c36517b82c9001e77613ab1e9d39f0d103985b50e9dc3c02682f8b98fb168cf386989ac44b073cd0e1541c8e21cf42149bdb6409a08fe9fa1a950e514c6aca586135d3c5eca1591492bdd594a2ac6b0f291c336f07d157425bf12129dee22a64d1b53e268b226dc1954b42ecadc8c14bbc68c5637eff7c510c8a4b141ccd67041ce7caabb5852ccac8208e7591085d2f6ea745dc23a98aaafb958788631febd6f6f2fe9a1d023ab79ebde098162a1a00e11a44442331dc44d95643ccd826a87a7963a52e76110b04af7a343f072a900bc29fd2608c87833d793dd62bfef2d4298863e432278b7eed751cf4902c459c1fee23ef1e12477273f86ef3b59e93e5421901f21cdb79429b8e1a33ceea13bd752d1b5312004b44ab7a8218f941ac1df84e3f47f39b5d66a6d9002669a78f33464360324e8b747f443db1c5d6f0589fe75e2177be681bc57bcf9e8456808bab3cb364cdf65e0c5c5045114efa2dc83e562534c7952532886f76d0a4df3b9e365dfaab33595ed0a6752af60e460ff32127c2a88f42b2f2232259a12222c230d5aed5e634832905802fb352b592782f2a116e28bf0c35c8eadbb8ce7050ad8117ff7eaab8340d8ef87f289d585f51c405536e306cc4ef313655a338ae58f5bdab7d75ff558200fec74e4a6b9d412a06141595a94fc324722b2746e6ed84c57af0cbcab71dc427c8b74ac6bf55ce11d2164f6f5cf1b5f1ff016fa32e3e3749d32bca9d2088cc38adb7206e25a1331f093b746af2f352c0a5dee95855b45cd95cb90b30c0ff521ebc9b4467fff436ac7cc41eb8bfc11ab1c9ffcdeda7f87b9f0b8542e99a4779c1fc3ce61eb0df642d2abb2fa9d1b75a033c2b378ccdf578a672365835333fd9c220e7b57656c20aa353f77201f955e2db6f8f0725a4cd65f17123b20c501b9061ff276f75d9f46488a84f2a5a70e91a308717f8b0f94ead7046b09cfdc70446f9d977680c7babbc9b7c2bc34c9d62005ec3c10f3f69bcb4db370c01d6972d2a11ae91288b53668450e08f9eacacb05709f10c57465782c6d9d43cdcb35204112bdfc873a89ca1a60a9a4d3bc7614a447e8aba91fa8a7f5f6f7e2fc6cbf666c9e3431dd87a2f3a53c262f9182ea739f3cd4f05b86c5fd260638b013b29e90212f18ded7fa81a52e1508fbfda85cb2904be68017c87608dc374528923cd341a863ee803", "ac0000", 3, 1732170039, "bd6808daa2dc458a24133aeb12ba3b5e59026231985d3d53acf9ce3f8b1d5d0b"], - ["cfcafb23048cf4e0fee7b3cec11c1b4f8c27bf89e051c1aade9e740df82fa989c9164e8004030000000004f2f1d04d69c306d0298d7ebeafe40ccb0f620cc3baa35173cc44a0e4197ad11b7519d50000000007acac5353536aac6fb7186201cedee43fe5ae4da2a58dc9dca3fefdbde43a12b4db3e9d89f71683002a3dea02000000026565fffffffffce29580d8dbb471208d147175871729ed1b2ad3bbd4a1589936119c071741630200000009ac525263526a6a51515711becb042e724304000000000863656a51ac6352004500ed05000000000100be018d04000000000100e7e60f03000000000300ac520000000000", "536a6a", 3, -736151693, "de7aa40c6b42559382dadf56b27f1cdf550fa220f72ab5128b773f66b570bafa"], - ["030000807082c403024790bf93b9caa04188a7ebe5e57eff18058f16d8c33f1578719b086fc0198bba00000000096365516aac656a5251ed33d9e527bdcb9e675d1a71e1ffd2860694f6aff0a1f91230020d656eea98ffa5a9dee303000000046a5163514ec6af1502c8f8ee02000000000500536500536786020000000000066a6aac63ac51075ea84a6be9653b010000000000000000f2cc9b0300000000638f9533aaf678c6479d886aa50b42cc1f7aa14408afa890e3f68dcc4e56fab424a21129de1ce8f53b611971587ae6522691e5918ab4cf8419e667c083902059e3c5a0c5551b350a4ac691db86388440f367fe653e9112c1ad7e872da3a6d9db0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011a5e5f7e9ace5ee63d757196a3326b1b3287b05a421577bc00a71314f3b276c1ec30f47e97bdfa24913df8a3afc49fbc09cf0420c683b1a6007b7226fafaea25545b0c637e4b8f6b2f5a261c9a55d347149183ca4b220b927439e504248d16a74cc4a43a8024f6ddccf3f37d487275f793426d88169bff94060e9dac559fa830315aa1dbdccb026e6f7b6cc65ff5765939203f0ef540658d22fe6c0143e4f1ef802004035341cc08851a01b323c94d95195c827204868a5562b8f970488a7fe43100a009a9eb0d51f06d328f76783bb7b19b670b86b97f0e29bb4b1d4e71205e16aabb291d80c974c95fdfd7c1924eb0be098261f49ecb0e4cf0a2932fec7f2572a12020c1fec5c1cbb43995cf66d8a88b687602fe2db2aeb20aced1060d7d2b7df34200208e818f85c9761ecedc42e696c0bd39b37148d009aee44c3b02c1a975540d2fb0305cce7c167659ca199c6765acf26ccec7a660d6605a4cbac4e8c2c27c4f9410c021bd617549898a62df1b802b2840590a245313787787eea2e28bd3f4121050e2c0300080adc6b17e2b428656b7399eca6755be3652a61ff73ab0a81c15464b9c1fe25b33490deb4768bd0201ef3985311e34f0ed730b889a4e5aad931bc3e4b7a74b1d289798aa1d9cca796cffdcdb13c84a4ff108a251153b32056415aa5a71fc75399b8226e0b252243e8ae62ac01ac3b3a06ae28a724af57fb385dae819d299a9f7da78854de68467d17c013eaf3471edf4aefb0ee0a4991e688609bdff725c9484a4d9f45e2b618b7bd15d42feef64ea9d15ce8ec5540883da363c9d1976bf162f906404f7c795fe2a6c352af8641560b9b43d2db302ae5d6812b73bf0cdbac1ec00ede2bd428f8b5cdc462e640c77211b071bd878550098937a962caf9ee73d7bb45403fee1ab8cff7f0c729f18afe2e8e934acc853531d7eca56d3ec7edb7344e82d6c2dc111ef36b13be7fb36d5d8b23f5e831cfb876efeade79c0c2494f0b4b538329eb44a4175149c835d33ed60e8033edea006f2a185eeb3fa9d6fc52e5f52073edcde75a91e0df39af92462b4a3cc1e3cf992c77a60cdc1f93ea25fcc513b26317bc30270ba4dd28f72f46fb8b3514b8eed64c0f81cd1a5466060a43e315f4ccf94ce61766a3b602f3d08be261f323609fcbaf877311e8381ab0a58b601b091fdcddc00c68b6b6cff110562af30418f17b01be89a4f2e20658dc0d8ca52ec22463bdcf6b59e1a4532e015895e771878eabf50be3fa5d6ea9ca091801bc67183c52296a163136abb4a2bc7f248ef42477e68d2f53a13b1a1660fd8703bb05dc0f78671cb56696ba1376ba54104b86e81497927d00eb0767b610539d9e8816a9a5cc35802c77efe6423661815de09677ddc6ed457ce6b2936d83978f1f5cb3e2151de16d45a5d8df75a2bf56a5f99cd2b133a1c55dc5effa743554e163a3b5f1b7e9ae7140e482d681fc632500b4bca3c64bb82a12e16b7fc1b5bf81257e5aba82a49d286e2c55ac18063704e9d99a1ab51501e54bdf938397eeb8fb4af31779e7b22c234c442b1eca3e3c91761eb26c3b295b52087772d7ea06b12adcda6b90941320dd2fbdfbc7956f9d2044b43a9c06781bae088cb41b328dea91d137386a04f2ebf51d85632dd287bb5dd39f2b0656e4b524d2ce59845f9351cb75bd51b70f8ea0a995212fd0f46503ed96d691c4ca5ad04ae2bec63f433de6d12f22b1dbac14a20837723c43526cda4f770ec32dc7e6eb52d8ae57f3831728982b5c1c0b037e4ab6ccd80b2c3be17d099a6e4f5ec8024679447c4f3f894e7a0090ee118ea2cdf911b2bc3be53e53a2df20b374b32c66a9fb2dcfcbde11b2ef0a3f28e95c678273e39d0ff8aa453a2f77829fec981b0c5b45ba65ee9ffff59a85bef154af7fedad6e33de7401778cc2355331419c4757f81c29e993d11d32550fd0596972c4a99c134211b6efe45bd06389bdbb829259cb1d33eb938ee45d084901132f9fd9d7cc8ec77c7a09f67a2414b98633ef7a8aa5fe99ee497e611f4baec46b4f764f86d95d141a34399996eda2e3a0c2c9e16affbcac539dfb2487c28460811382566bf27d3596700763f8a1d9eedd97b0b8ddfce7279f2a0c92b2ec5de7071669b3e6f8f88d69f92d897e0e72d79d558e20bcd764324bce70b09238908fce59002800feac4d61644d1f1435b5e3107148487edd7d401ca793b160db5dc09878ffbdabacee92b029133417b1f9aed89fff13661cace196a1fb2b4f192aef3f94e5263410dfddc45ea7a951d5c7820ff72e21ba2b40df2e286f90511f1b83114c3bc3241092e81a4b4d2067ebba45bc751095c10748f2a9fdf3c453664fe6d41571f8e52f904bc43e36b9752b3c0b0b6ea79951d4a5b23b898dc592020451959f32f0ec4cd28ea0d30e2849810f6e7903", "", 0, -1280342139, "376142848914a468fc83b4c96b6cc69d3316a96e9c1eee7043decc631fb0c6e2"], - ["030000807082c403035c772832364f3fdf8a48cf9f2b4feea31deb8325af0c5efbec4303671c74b086020000000153ffffffffae934456712326ebf21e20c088a6d6244f14a23152724e255b4157198501f7cc010000000665ac00515263e3aa906f37ef13dd7d13c81829b106856b9c9c0f438152274ce35872425cf056b9d453fd030000000652ac636a52acffffffff0464b564010000000000330f5e020000000002635389ee5b0200000000066551636a526a763039040000000009ac516a6363ac51acac000000009b17bc8a020000000000000000031335020000000011a7f860c43a959166d5584f2c64dd067b1903bb536c939b4e9d110b0164ba5368ba40b397317015f3ec6c9074c5c30fa27bd1ada557a8348673c703f4dedfff4fefc06e5a7aae9a83ec2b6037a7375f12a22f8ef9a5eedc3f95cf9dcc91b70500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060d86710e5059d47ac4ec3eae895e90de8a9fb15b17c97015a2009114ee85cf952728a1f967da779b7f7ab34980f16a0a95238b9304bc03865cb80e6395843c2135030b098ec459bc23e1dec532763a3db3494ccc73f7a36d812d3aed4391aab34cdf56acdc04594f855eb0bed5b02f3175b3315ba81a544c7e7fdac2c88aac0210a9b76534934ea722983a4e37a8c3a82b825c8a99c34ffd617a9f83c6eebc4b020feaa06968d3d50b99005634f968a3fa006a806b5465a04c613338c3aa4d3bf40b05417bf26457caf289909c3ca79023b58b36c621f1cf4e403507f9976f418dc9ba6bb7d7acb3a4c6d0f6f7edf1459abfb114f6225a974a08696a4da5b5b5d2f50208118aa341d4599b59c623c414de8bc29f4b6174bc9afaabdacc248b7338650203150c3b51294dcca53938088060fe27224351a859dd2ca7fab45f411da05384730308abfd3c388be6c8c79376f3630b9190bc29f4a6dc81ee96a5e1f0671c58a9ac022e48e6a4815b65d04025aa7865d35c86e09fd9cf85bb23e43c8b843ed95aba480209b8218206429a87651001f955b8f7653721f9e25fa369712ef819015ae4dd0497f861a4ca4fe07592e3d26e6af94d37d049702f8a76110bd4d6b94001147b8709b9835c2b901481c351ffe391226fb07697d0479555367450a235f3fbe627ea66effb81f40b53d04d9c0cc9a3c4a47cf2384620c3ce2424acff8b530800a640ea044afdd471cfbc0a868b43e92d5734beae89554e9a11ca2ec72ea78cc462dff61643498ed9e088f1917096d29d06c93e90cd8c8db2d6483863f15645add014cc07bd4a79e663d947dad8c6ba3a1bc9e54cd6a36ce25499a066a7c6cfda891e0c5c5a10086bd03b45299178acf58d8cb1f195c592e312ef525fbdc3594443f608e3d7cc17c7f290e66a66b403ef997a04bf57db5e6ca351a360ab00dfee320a60d199c4ef4c7fb637b0f22da9964cfb32f3084c8fb86e14da1490d6378d5cdafec6293b8628df09e7f8953376e26a8b2f349470510f25914883ef7c7ee3e44707bc001ff476e724d32a172e344460d69990e56c35984d42ecba082646eea7b9ec463ad0e5c8424c44b83d9cda9f9207b5feb3daaa43a9770c005fe7d493c7bee6f9af396f87a4485b6435626956f2ac7a255414ad72fdadc34c5151df7938ffe22094f55ec269dcb89a95debeceb00b92a7946bb14e372672c51fc2f566ecc759cd262580d0111713db98dd95ab81376622ffd6a9e3d98c1f0b9a732b7bb16e4e5ffd06aa3850442f7abdd5a5cb39469a027afced3158a8180553161fedce1f622e63b20bcfa7ff1a464e1e65e45c8f402659641f5eda0c0965d2d78607bc913fd893a865315b3cf751c110e1a30ccc3ba3d7b4543f36a1bcef16107a900269c014959b40ed466584e0bd6904f359aa512f9a65923a25909d3c6811b5fb3ef920d456557fbd16f368600e7810273ddb4a40e1cb0193f39dbb857c3442369f827806afdafaeaaa761495f3d17518bde433e06123d2f099d31ed7d18b3e8601067040e8ae957decb259e8a8bb503935d42cdd8ff1ac19aaf7a965815b0d4bd4181390048c8c1b193259bd2a3e642aa79f61c712084cc424e864a50b52aa526e5234b96eb8e02175fe911b7342beddfb6c5f7ae3b9cb168ed1e567cdb46c90fb4ef5ae444810904becb81393306b622105f976408ded3384777b19701b7bbef02def8de752f10a79fa47abdbe79e9a724c4428b42818ac2609ef315094a1005f046487020699e6f10a143aa3f2ca3923eadb0d5ab307ee8ce20ce635fdcb5401ab9341a0c5f9e0911b11a6586eb269c5ea60243c2ef0be2714bae887d82b840a92302f092a526415716a53ffdc175ae967d6e6ffbe263f802a9dda4e94880971987adbdd6a3347affb76f6e35849d47a1bb16b2b3529334bca53c1541db1c842613e0b00d6043f7d54cf2d8aec8f269083fcbba4a0a21435b65776e2e1df9231fcdd989b40cd59f25f7d04d2b9eb660a6a6bc54ec3702bfb58c38ef81988081b5a39798ff2f544c1de19d7430878057109d40d9deb8f434556df336628d9a47813071c23e1416a6c4c577ce0b4a4ee6063417cf5ff2771d87e36eca53fe55a8311218cde4124b28f9f3321b93f4687b2f62409de87e7cf1e9ebc35d4f213fa5967ed53a1c4b4537bcf88337a79278928e622401857b2116fce4fcbd2b982bcbe184e6afbf155cbb1853237af6815ecb767b67cdc13ba2b0d052f715d95fbb60b1f133cc7d9b182d0dd4c9d6347b4a6e0db6ff00000000000000000d7558505000000007bd957ef136ffbe8e6d0fb4307b84e82c47e2929936f7777d71fb1f41c96dab9f33875c8a5d3917ff0730ad65667d8b6bc9c1730872cc4d3fbe0601e4c463d93a44f8a163fe816b55b494ce256591a4945a1a30e85add765460c933343da1136000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b98f0363f944fbab0ed2fc1f3d9dd089f981843467d8f7fdb43ac82fd51d09817a4c60f5202f46284050e8cbaa1733e7d58abbfb0a15e13d0a7fc2b7302664585bc2795f72feb6214491ded6ba2dda424de88f4e6666a9ee0f38702901d37992cf68377b700c0055dee298de27603bf692b42d1e2300b58d7840c864b04f44e021ecd7ffdd373bc9fe68a58513d3f29f50152d2af8dcc362915de0c6b6edfae8a0227103aed2fba1513c6b9f1657fbd0a45940dc506e1155a351909ae39c480417d0a090d0d5c3d4af466f5e48177b4fe61e238158ad8144689e9e80a18d7067a9479b7c72e7e6e581cff9cef59b6a6bd93f19fe13a78c1d93bcd895a501212c874f5030735a031a2162921dec5e76c6465cd3ccb4f07eb6c8c8129bba7ecde752af81a030b570d74eb37baf72e2badec8ec32d4ea85dd4e882a5f23717a754537826dfc902118b121a2e222f52c53fa6840cf60523bb0889aaf484b9f7eeab8ad19c5430eb03081f8456bcd720958034558434b21c399831645769a03fbe1bc0a114ff961d68020f0a005362d09afb269f7cf55f3b3b63a1dcc24aa4ec3898ef1ee5beaf6f42dc18ab639272b1046f284517714a23d14e37ea6e9b46ecebd3b114839ed7b698511960ce6013403bea1b4006cc0e4e6caff0a925f4ff669c47eedf6d1e05b043ea82f1198629d920674df6dc98bab5e9b9758ddd15022677858ec1f5fb57ea9d833b7293ec560638d5a2e512f198ce8158fea69e3b9c890752fd952a560efb491ecbd81052b9f5240664b14567a30355d0490324b1eee0e3368b26e5e6699638167c50e1a34706619be246fd49c3b83f78fa66666e3bbe105642766efdae0b085664d862c67c751ecb4269cc675422324df9da9c74fed61c6d7c3962709a596861bfca219c0d54f852599bde767893d5d5152feace003c820c6864a654643b547ca0ea346b8167a411382ad2103e9f5e6440bf918489bb5325da12d11e9b3b09c6284938c74cede04598a6665f1933288195eec5610317fbc3254969ce0a09f31f72140f9178e03f079bd79ed0278404532582fa8d643fa41e2d95d578f183dd898f12f103f7b67ef98a47450604fb965974a1448641bd881ddf5dee30a28fcc9871256949b6111687efcf29e94bd0e0cd134db01480ab2f025de766f351621f3f3fa5d3a42416fa143560f5bc4770996f342f57bb5285e94410a16c3b239c5b26db1025f18a00bb439445b1eedecfa7c6129a67e09bda656f4274aa270a429a3933e9ad8eb7a41dac3f7b0689ed20eac4c5a61440990a8708f5fc7b5d5a5e8cbd9b460837635070d2ca831287421f9e564899b3fb67bfbf857e296efd081d6dc1a35a4008ef35ba4ea286aa9ab4382b98aa808a4fb5c302033cdea6d2d300dfd168e923bc146ef11a0319c7fd96f09eeedeace929d2eedc14f95a2455c4cb1a054407421fb91a2398532105b58b5edf4107c3bd14941675c470d8d79282814d62590c03ec702b9aa77c3491c07f928f71712a5935f482b2040c9422e897c1feb8aa0a50254437c386d3bbccb40b2140918fb724f9cde31f965f80626beaa225df2f72f2fb156e74cd1663ae1eb95be570d334028c87640d037ceb7483a1bf7d8ba5aecea74079fa276d07f705009e7f415efbe6d74ed27213ace7e861f6d7ec3fdfd3509527c102957ed12e201e2f8f3ffe9119c6f50d64da6944d0b1c71906690acfe6b99dd5a043dd7645eb04a591a1b8d391a7c4386f5be62e7023c6f7a63b1c99f16ec832f4c927d5e6d86c4d496bac5890e1f14c91ef7b3b3cc04bde8a87c11b76c02b1b364b37c5b27611ee0df74bd5dc4be362aa22a42af65100dad1e09bbcc6a4cae387471c272c9293e87a13db5b6a0f35db40664499b463e10e7606375f8717ef49f6b8599b98eadd5d018ebfd03986186b093e26d1382bfa285871630c41b6c14b3be301cc19ce82e53b9f7763a1c5ae9ecb184379b9131e51168c94bddb539cc93a9a1c60267a53486e6bbca352a9356313a8968e591af435e30b3664353a2d89d4f57f0101fe54b5b8f9b97fa517d74cdf4b6c7876ce5d1477ff007cef4698b0242242ebb1b84bcdc86f575e3c8888739a327836ec52e789327c36240dc5d32344160081f84fcdd8e1dd0648c6f4870552486c3fb8c85c04cca285c9590c1a6baac4c7e7bebd0ae29030ba4427f3f94745d2b86939b8df1599b5081fa0b742cd4ddc5537b48610724f79cdf6eb544f1cdebc65ba0e2b7b99952e47bdeedeae8a45f5d413da11d80e9cba7065208d45bff455dc8780e6f1b6037ca4221da8419bc2af206011d6f5b71ea5efa62ef8d52877c8028f42d0b8c7fafe29dc92d2a9a2fce1e75c8637f35eacf3f59ce936bcfafe9482cf50f973926ebe39999edc754b21f5e1f13bba6f6ac1573a0b", "65635365656500", 1, -1947049650, "9eb45a38bccc61146612b3706ade6f4a44b99c3605fb33ecc3de61848f7f041e"], - ["030000807082c40302e193aac5a04ccb7a60d3f4da45f6025e45a09ccf7ac4ae3949a1e9b3a6043d9301000000040051526affffffff5987a9c8c53c60288efac2fd8b87adcd192c59afceedbb4616d34280e96d01890100000004526a6a63ffffffff041b3aea02000000000152e472b50100000000016a5eabbf030000000002acac7d32e9010000000005655265ac5200000000dbd47fe1020000000000000000a38141050000000036af43bbaf8abae9f244514ee55b75da8fb39fa9d1b556ab6f8e8aaae8dbe926dd914163ca1fc2083981e36644343403eb7761eb4c276693e2b9f219747453cff742bd078784340c3789f7812b63f5285ec00b9d8967571475783118fd0fa98a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aed8dbaec5baa8ea98da6d26f3c4ea802bde77f4ca152cf6ab0833df11b6b8151409c72ac0e09ce45217944121c14db7ab53b5c00271b03e63b54fdb243c28765b3b49a900742c32248e253d23c92cf999de240f6c6e7744feac50bcdb6e1f44cd7c43e064eebb8d854d526925036bdd205da287e84e4549fe70e7091a22155c0228e99d8a9564e68f5b6515923b2cc93fc5575a7565f9aa7725541b98fb973ac6032e582227c9472871bf8a40f8c7accb03c03b3de3d69dba494419559a6aafaa500a075d844d0ba48628dc63ccc6e5b9e279b6f9e46d4746a15b06d526df851bfa7a82542a7b7ac946b0dacf3b38739ad613f08a3d7ce2b1585780c078b92a3282a902094b808165531b2af7e1f8b5c071ebe0c46b2c642dea5784fc5bcee07cbf2e180217cb91d7b21b3dcdc31385c0a5b4c099881735240b840b54838469e2767bf31e022ae34c59c959eefdd6cdb88a63d6fe8ac107102c9fd805876af52dbb4a2b22e8021b6a0fdbe6643c6e0a02bd02caf639ee266ca92cc8c29c325225d4dee1c9da5603193a3ac1c1a453c810e628bcf6eacc92f11c420e32a3eba998b12dd41d1c55ccc405c0f2d466cd0e876c35f0f6e34e2052a194fddbcf738197744f84db5f6dcc3a709d65d9e0abb44febeef72f60ae8cf2fb31f31a519e0e7201e3ba88418079698377c065066589414fb697ab6e53a5e73c547f94028c1b727978899ea5907b5f8d9d3b8ac029ca1ab37ac7a48adb37a1f5e8da498909d4ae824af87a4d5807c063c237a591b5c07fdb081c0c67231b1af4b9da8a1e220e83b0a7492022c61183f4eda948a0cf855d30d4256dbd6661e13bb873cdf32edcf75429029232d8166b534597988480677c8af6ddc732ee2fec323a2f87bb0b77fce88b1a9876fccc8deaf0617aa911c292283f0ca4dab1405f2d043192ccebe54a4f30444fc337613053710b02b4ab1ab10b1cc634f0cf6943d6cf5fa6d3628d3a9f98a4e8487a9a34f68c6a56796a3d3c5711cc018eac2b4effe828b2c05e4bf0ba5625d0cb472bc069ad1ce5f9b4ee1577f70d2a643bf172001e70dcecc31af1e11ccf59be03dcd988a9d42c32a59b79586cc51109b10e3b19b0f1536efe91f355ce5e1bd3d99b6d3a7929286810df1771a39818bd56201969c6da8d09b9f8135c60151dbbc246ce98a38866b6e500c65dfbc1928badbce03114f7dd19fd704b408d830ee06ddb91e72d7b0d6943f8b0ed31a74939c528bc19ec3480da574334d5dbbf06c9882ecd0d42c7dbb00a4f64bd7ba75b2fa16711a1443603777f2b6668ac28e46e1633464016f45a9845bd5f88bc6e95fdc422ac07911d9adc6204181357c71be03121a0db6e00486fe83c5053f4a551d20bcaa8b4e3a622685ad9ae4e940fa9068cadf7955a409034c149630bc4f5e08dba83e3378083780b52f9d3b6510bd3897585b4a10194c9159dbea43c16fa2cdc8f272879b56bcbc3bd3e32a698be68cddb2047db726b3f1a9a5da90077c0769ded9af2a0d89ac67468c52b66aa8a6c89f47b780e6b93d2509c35e9bfc6da4d725b775ce465709e41acae1a35bbde3ff86a1c887d90c322f7412f8a63540fd3b19df53940bf6df9379e3c156c91e51e1fd6b1eaef4b8f0bddbddd733a6792d415445279de04753c6f3072a3dbbf481be89d2448420807431398caf37bcb3ad5dade930e204e17a8a8f091b3d6e187f2b2f037dd8dcfe65ee52b0056a78a496d4bb13d3654bb97da4d1bbd81bacfdf97f755b14300b2c0a736b74412c48d7c30ec2c6c3617ac2e9e34ccf873e50e4e79e4bb92349432faafbb6435e25beb2e06323c1817a4184d95ed47676247b53d71e011df40ba272c0548c27d0a9316323e18684669d6061045806f2bfb7017a8e131672103b039ab6497ecf39f4e2ceb3d8169a6ce12f41f60ad5ecb2ef9365334ff8ad93c6d4ef3d96bd28a5be0da282122d191ffc12e81f81a1bbbb5ec5797daff70613feaa6fd5eb41e6f07fa39d52a300d13bee252d2ec20d333c23893ad145dc21a59d71971a33d52b3aaa2f5b181dd98f3a7dc980cbd82bbb13a1d1c7b4c2a3cb1e850b50f4706f6f2215d6194715998e29e603fd3ac16f961e4196ce7d105a116d5c073d26bac7172cba6b3cdcc810f5b93b7d9fe3287a6b8ae06725eb5aee1ea27128c207e89371294e868cd21fbebf8e3ed20e9daeb10842b33985050ee28f2e4184abbac3fcb88095d85b37b3892ea738f51b4f54ca7f7f5fa6d0994d14a7c5d905b4f5757459f22a1dd62d748d819db260000000000000000e398870000000000fba3dd979bbc222d397b4c5a91a5aa0d4c1c41a106dc3bd4e5bd067d01e5f0f855224656b655286143f06a72abaf05a0d0e66eedf14b723adef0512202e9e1d4ba594cb7f0bdb7ab99b2553820aa24a4e79a763d59ae897fa08b5dc878c99e8d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab102422edd995cb9aca989db370c72be320ad0bc02276e5ee9db401081e08a91a3af750113db0ecccbe78672d12c18885bbd096f1a0b97baac2e8c4a7126a63ae74e354c7aeb078cb9450a0500af101f2b55d027a364d5ec608e81b9c63241b087b9afd296d01d4a3159ec65180a203ce6fc02cd3ae0fa0e6ead62d9958e5cf02029db2802682660685d465f0e9815541c7688b97bb16355c9e548fede9862ab0020db2f1ee857917d4ba4b7a341e8a0328564603366076cb2feb87c3e36c13d0070b08be568ffd91db7134714e5c40fc421779c5eb6c9634124923b478617383b07d651406bf18f87dc8c7d3875803bfb0011ac0e930d9bd835aa4e170698b3fb883030a55f0d76db0de9bf9a8453a128d02dd9ca4b5bb6eae3416a8f353406447cfab0316d7a8b4e54a36ebbb9dc3ea102e13caf10db60407e0bb9116e0bb95f4712f63022b9b8b8a322075c26472983cff8631b8eb1dc4ca705fc2b83e0a623af2c894e0032189b5ec5f732d9f4c25b2e3ffb5f091c7a2cdb512a94dd12992289f726cf8880320fb5266902429cc3af8d33a9a4ff9a48ff14c342540d06a65b53fac33d1ebfd934f1246c38403ff042aab21b14b8a26dd98c7f73737b8fd85f703e3b992cc7d29763c7032132d7dbcb49cb8b1da3b6371194b5258e6d137d38ea99a0b52a18216badf9db4227f8f22cc3881170d394bea928de07f4284a7019c7ed27fd2aba71d5d1420a25f2c3976bfca9bbffc78ed729fe7cb2aff0c79eab909ea3a77d24fe14bcf10e975719e42675905096fccc387e8141aa7e966c2a377f931f5b8016cb627adc595fb202c56cd4ef11b604766ac4cb91341ebdce75d61e6cf21b9dae9c9e0e35a5fb1cf5a5727d8e3e1451bf05882da22a8176156079441d05f5a2943816db4f3f4b142dcfbb7e1e22467bd59a9ac33228e42b00e1c222c1ec79591b4f4e09e1be86f39b937acb1a03b6fc966dfbc09be37f667655ef465fa483781d8d6f3a5b0882f5a9d4d27d4425094dee0db3ef32fe023204d9a3a9e087c64e22093226d4c47f21635a40006c9d642d5cd3d149019810971745feefd19ba7ea9a4ada4c81d8130b16a498f42ccf8670a5f68f300f25c8009235725f1dd0e5e25b8c636973b354f6b2bbe549d955a45e4a5613dba2530524d1bbba4652796ea23abc519139469ad5f9ea28390bde277f49d467eecc1b8d198f236fc561bf0683b9a37ee9a23d6b3bc0d13f77b87375aa35511e4d74ea7348f6ddd53ce8915099bad63c1cff40a63f309752af3e7b3e824b62864dfd6501cb50ae0219de4e59e934c58ea665a7e60fca2069dbaa9836e2e25a81736a55a86e04d730f9b260acde16058270cc0343922e6f3a1c5ba6289690a305178a689869fa5235c20b10442e450065c80baf68c783c270b9be37437065280337377d3cb3b59042e0717c6ed1ca7cfc20b5e2755674068d108c87dfd388254b6e32620f2755a79bb6142bd7bc3d63a939a2294379bc4059f7a3cf7a481fce6f34b0232353f82ddee30bfa2587ffd8be6ba6210f46da29f540d7f8f8a8f5c8943afd757c2d8422965d976cef0df824533fc6c874614e072e6270ceae0917c188ed3f2cea6ac7b72a09083c9c28f094d1c3bd81b1a28d94d4d0651e44c212eb4099198295bf373bd532c29f1cf5f01a982037a3800c9c4fff4cffbedc2ecc94875b92719447b7324436034cc2032469f85ecfc04e5aa6a62a8974840af4a93f84c613f1f368e1a5cd0f992b2cfdf41804985c87678302a17d4761919db75e69d7d9f04ca03aac0263c1a716786b498f1dc95d4a45be47e7bdfeefa58ac9c7ff530097d4f6190be492901aff648712a322d619ccf129cd339dc24a7f8aa701950515dad793afb0d16bf2835ecd8047985dd70b8c1970c1f978affa8257ad863558a903846c926cb61c79313426e68fe96f6150e569edc2731a69f86515520fe2a9c3a9921f589f4920d7ecb05167a58b8706c9db04bdd52f817319eae7e31cb98fd768d34db8d070d8a35f232b6b98d088ddd3c6f3723786ccd6d4b0542674f9511d443256ffed5a7fcdeca8437f2ef93c2eef536484b046e1d58f52da1be17641ff6167a9feb2f59f5c9e86921bf105d7f9c9b43f1eaabb969eb75947a4155d6bb3d4754a18f249ecb65c25aa04aee6b1738b3bf55e1c30b2c9951fdc14279007eefc04558ad6e044c43d1e0dfd4b7dabd5cab3e3feb604406a572d29f1efdd76ffe8f627689c12198e228b1e660d2a259948e88c6e6c0e4beeb9ef24088200c1b93597b8a02e04ae55a3c5bbdd7f1294e04bea89345aa0a8738bfcb985fb4cb11a13cda7e5c3b27bf7d6d933f13d286999a556bad42a2c7eca7d63a94fef29aca19a7a2294b8c16329cc3150d4360020bbad7931490e25e23064c48363303fc08", "ac6a51ac5352", 0, 1158050457, "5a3a7a2a2dec231dbb6486ebfb415956701d54b031181edac69c5d1f8b811a06"], - ["030000807082c40301934ce9c4569419841b53e5159b259273836a16edb3d84c877abe583843e36a6300000000015383fdeaa603ef41de030000000008006a53515165656a551d780400000000075351acac006a53268b54010000000009ac63656aac53656363a183127300000000016e4aab05000000000000000000000000176645125844c5af36dca7eb7f60cb0c2d6de26cc33f3ab8a452738634818d7806b364aa6c8d67c1aacd8da84eacad645fdef42dc279c422e04b677dcaa267c4ed07a2537a093f0838be68b87227c88f805c29eca2c2a12799f85522d9c341a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000089b58b904195f33e8d6bc280f01e4c13fd22679fd06a744a52d3b31c1616012432441a6203fdec8089f825290ddac6c29b6d032873ccf4d6d38731d00af8a895e261f48c932c950c21286d504014ce9c27c933777f4fa5b2ac6430e42db50e6e4332f26cff0d3d4b9cc1b7e74afc83d3a90e5a8258d81159631ea64ffeda5c78020a6cd5a73c32faded910125c26c4da2a04ab4a77e859efe1f1f126196b5f299c030d49e0d73ef82d654d2c5351b2e32d4dafe6d91f8c4f6e93d995237800e89a910a046c1885a3340ff55e49ad9f0655a43f9fba273d3a017f645ea844b5ceab8407f6980a77def676a50f6a3938ba2db53967b39625ca21c6aefdf397b2100636560304fdb93b37c91c9d7aba814fe0bab449cb37db2484de0f8b46e071836eb2c8d7031d1e177810c6d241903afc2d6b6fac0f0847d7f79eafe1f8fb73f7cc8ddb28640319a2c59545cce058a344580e365685e8989d3149c24a106926761ecc3acbc1a3020576169953b24615b6a4d25ab1396bf6e9836142c2a6ff6c9029c2ea6e7fe135022b19136a4ae0c0f6c2db5236ccbafd131b69552e9cf5f04866b5f4d507568c2e49ee57c031217be50385e73e417d7c630c41249b46be5b1f25c793b8c0f7f64bd05fa3bb8d98d5a00461cf76750911f57da4aeade2db3c97b30853a73848da789ef06b120ca37e8850994796e71f549897c7d17e65c7af1aa7a3e28013db35ed337f4fc5936c0b64a27dc547135bdebf627a83ecb4708b4c912dd9967231f73ddd0befdcf55540ea6cc0062b0f15488570452047f244a6f723b5e53eb20972bba83bbd48263b8d987fb7f8111b3a1470648a1b60c7d7a0ba907b5df9db648316b585da7adfe3281398443cf059d128e1e5b27418ccd5d0c5937e01a300711ab50aad3df6aac28fd7c8b94460f36515fdd655375da9e71577447d51253898fd1f1a18acc2fc9dd83b14c7a5a3be28072d50b9e607cbe22701151eec6852436751f15b8e394dee970b60033c8799052473351fd1023c4c965975e7e5b19f75c6b92aa23edd63154aac5f710d720b87d29a0b32ecd056624fa21a5efc4c8707dd2987f0863a0e6ba64985fc3d0c4b1800bffff5326efb801241d0654624bd50224a58cd7ae4ec8fe0b2d7991c1420c3edb2fee5cdb1ff94af8595675b378b6b693fea4c30ec8fb6644459cc9d5df8fd273a05927fdbb846ad6fb077ed3c71d9aa4e290b9834c130cdbdc2ee95dd7961fdcaa1b9f2786886100259378594e69e64785d2cb4c88f7c9708ef53ea57c9b744a014d4d38ac02ee70ab06ed938a246045e63d914adc3ddf85b8820d56d39cbdf7fb51ee565f9e46ed46abd27bc8ec50977bbe2ea36798fce75ebf970bb99d6bf47c7bb4b35c20a5b81384bdff85a5469e7ca0d6edf9a152ebdb21ee6ff19e7e2441e7a04dc649f7e9556fb3b235acc45e5c2bbcf4f743b6f3341c394d0e67e220192147237cc578806a02faa532612bae9aa2d54b2e397f8da5fa4760fd1794d96f2e7aeb5772e61829e73d539da5f9fbb3a483462513c7cdfc939c8597bc919737fd9c7ddc24cf2e2b50c019d525fa9cc2dc43f01cee70b05cadd4835db27ffdf00922f0f6d3b31342d9c8565c89618edebe6625760d63f9f05736a8b7c6754f13cc2ecc8a30e2964826715fad7d1fcc772f84ce0415c9fc16d83c52a9e441d1e6990aa55e2445281f31d04b4328b7e5ff27afb6061e1bda04347f1c6d5299183a625d55f92574bc799e5a6dc303963bde427c2dbd89c0f2871a5105647b2eb4b2052764a4092d4398632a84e3e23de81ca5ab172b447bccbe56168630ef2ab643adb12830685499836638ea9aefc84ba56dda938c38cb9fcb060ce95be0ddfe236e7d8a38b21cf6e374c17144fc9061b46464618b5c0df8428286b383d75416b6cb3e47f237ed74423e68e94d63dfb3831508e4be06d9aca709423571b9534298e159cf1dbef2a0c11f48a39cd51b30780b275340447e776c9224a2dd5ba38e5f70e52322cdf2737e906f324565cd240d37163d20456ced4cf3b7eedf5de48dba678f01426254e09b8ebb97086e1fb83e7475949ac8218fe71e50367b1c22da762d6959f0ae00bea13ed9fecec7804628a8357b2c4fda0ee5fbd9baed6c38779f88195da4d541c0288ff4ac1402534a807ab0c0df6bf0e389610f854f556c692861df33c510070150327abed707d21f0d69b8ae8589d8bd929e06eb77b321dbcd321e233e78ee0514ab09adaca9569163f02d23a89e6fd4e1adad0075070c195f10e3ab1d205b6f3d5cc9240b8e81c0f6305cdb18098cfba39bcf7a2dcebb9ac92d8535b03aa47d87099c0b4193c2693da2c25fc45bb850ebae1dd3309a94a50dc0295048b8eb8bf5c2c659ad6474f22418562b515149b23519ad960b396f1c08c07", "526a65536aac63", 0, -762053034, "6267279784c2a8724724d552cef3858ab69c60dd6855c95b965bdcb2a3eccd18"], - ["75d00b0704e30f1dd330bfb8562bbf8cc84f9f723ebc786eb8ece826ba7772b55a071374ac03000000026a6affffffff7d7626d68c71cb9a58353ca009de37e11d2e873a89eb17cc8e6584fccdba105502000000066a006a006a53ffffffff3ff81802d2c1e95fea4503cfd5c364517588b70d31e92161795547f3776ebe2901000000025363e8b77745f442f121d845f91fa6ff77f0442b0499fa23a8988df272c73d4964d670f02d2f030000000963656365536a636a6affffffff02ebb81c0000000000075200ac63acac6361444203000000000463536a51a4b9b401010000000000000000c0baf70000000000752d366720396dfeea3c40e562d84eae74758249552eb7e2336090c72dda7eaa9f9ddae990bc7ff4f59d98dd46ebd6fbd17f46bc1cd832116895811d773ddd0483fa8349d0ce8672e9eed444749ce709eaf50b531948ebbd7fd6218c21ec5930000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005d61aa318480a9ba2eecf0cfba0447a979a9528af3552b882e3550b4c9870ed077099a8587c402ffcf12ba89118532c34032315ddfd915ad8caf90d8c69393535e9dff5da89bd3454be9456133e66001679be181effc0ddb75abe42b9cf7f06cae6415809c80ea476179428263bcaac2c8fc897415167e7a1cb2606b3c93ce9d03171c896604316d9a97297a84644bd4a535783163a9ef2ffd6b68a56a998e68ce02017aa03454fa5148df29660175de6f78569ba37394fab0b0e5b8a7adba5432130a0631e821dd587a2c2413614892a914bb1fd21dc68ea6036861a9937f82c7c9793e556e8e339cba9d991f0a344f93ee932e9e12edb22d093b7b7a0a62573333b4021a4f8c1fc7facab50d15f3027b49b52e2d2189ab0de6098817a927bd21f043c10307f694927408b63504618bbbc11dbf3d7f1e5c0d20bc6a05f07a1407519bddb6032994443711800e1c5b9c294611a85004f508351ea4e0b3c48addd972c356ca43022607671367a9a13d12ef51df8f84948cf7993bdce9516ff53aff95e777cfe09603016edd77e489900b06a4ee0fdb47989780b600925548473e9164360d57552a681b54b0f1e55f98beb0d38967284007c3c21fb09f8f0af22c863c3c223238bdf1c30034c76d7b846d2cb55fa714158b1c63f45964fff91f2525ace5922f5e1aa162947014463a45092287080cb44e0f23ec1b2c9e6a020436f85477ed59fe0557e2a9e22894c038fdc5e727029e7bdba0996f927d77e44857a985ee2b4eb3a3206bafe0daff90a9cffc2725d3257b0b8ca730a92471630bb97ff52554c57d0fbb560a0edcf22f0509506d56f86ea1e22f285a5b0b652168ea3c26b6ea20010ce5e9858cdf40a82d71fb94e6f06d7cb623ed85f26635d8a49cf6508a6944dbdc989b0ceba1caadf23372b2ddd31529db0ebab7a60e87c19afd8146f312716a435aabeb2411ac3f985b1b25b8d05f0a71cb7ec2c73592f5ab22ff508578db4a59736e5c3d631007068d6ab7e55946b27cec05c44936d8a9b05be92096c8e46d09fd0b814b94bae6f14bb429eff5cace228aee2ede3bd92fe9992bca07b1177b9821b337f52ce0318cbbf4599ec8be3e9d4c2ff46d3a65a2ba2149307049ea172cd5e3c88788066243c7d0e983506358de0a909df4ee09820586733574831539872832f1e67acfb59be54b12977f2452d79e5449efebb0e220f451c9ba40d0c7f6454e1d65b8354e89d3bd70e65f7672b8c6a34338fdf3eae8b5b02ff25f51d22a3d8d8c833afd6aa249fee40320f8e56433a1595a3b10de3882dac095dc725369b89570051ef8458df7d65bef68504f808654e816c52b195ef786f50646a2ab20048d94ff8260c53f2c592ebfe57cb6b08a2130bb11406d7883087b3dfaf3f409b509e68ef8e02d57ffb6449aa982a51ed3d566e06e12b4a5857857da0be588e85810c1ce9ad39d3c009efcb5775f36270fc08684f3ece2de01236e22be12dae8b134e8eaecf90eb1820debe9c66caadf5fee769d543f06aeec0b4042429eed0866b170dfd4bdd0f04627dd7aa5950d53bc49a5302071f70a4e05bc06ef2d2bad64e04cea26b4ecb4ee38e5cb562c7ad6066654376a47704f589a63511735f9d76e1796b083475e31f6eb081660fed1a3ddc78940bd980c940f53447437dabb5f9d6547f6fe67fc61320fc76aeea1aed62fe31a683180f0430bd2cb76b9ff8c3ae0beee2e3dc579e0463aba12d070da791bf671703e031f43aa60fa10cad608fbba3dd3bd134732a2d9ecdf14d4a21abc615c472a0b6a77a6908435fc71d614c1abf12d4810448ddb6bf4842850ae813689c799e12a1fbd50cd886c0c5182d46eedc02c2ac90b28a529f113e902328136c5aefb7d63f90f4542e3ca03c147ab1e27d6c75bbb9cc061a68c32f20f2e49217a7c06d7e7ce809977cef1617170a437a48623ea2e1d9fed27a34fa09009d388b2964aa039816dfe0ae9976a3ae583015e03f1eda8dbe4d4efec1c881503ec8e46a57cd6845a60597744487b2b2cdcd8f72ec48a6141697c4a6ba662abf3663cf8a994da3f608151fc3ba7d3fe77b3f0c8cc5ea35f53f7806619491fff238c76e2bac27a619d3413d1fcfa2f2474e488b0b07a816c0a42d44d9755dfcb970dc8eb7a0a9dcae7df452a544852fd911fae54d5c6ab56703eb9a158474d69b37564bcbe8019257728ac395a5e63a72848db6059e2b44ff711f1bf44d4636949eff0e8f4d6ecb85cd118949a1c1bdb06ccd96c786e5573ba207436bc11f6024dfea2a974677fd58c3482d84369e38bbf04ec8174f6631ad2edf1f2fb69abe5fa615df06967747fefa7e7460eae1be2d63204ae2199f24fd7c8345fae5cf582a621893703431c188f14a77389ccdf3ec2458180ab271780fd7e882bcd42022dd0a6b1aa8c05", "635152", 1, 153796088, "c5db35d2bb145408829bfe2114fa4bc9cc36086f460323c94c10d50a72e80927"], - ["6509742f0329a9b959f147e2ff7243eab1305bf03e6f940a9751e47461a721ae2a62b5cc790200000009516a6300656a5100005d51b86ad943b5f8b241d678336c2bfdd0e9c9ed6becefb50ebd9bb3d684720b9fe4f51f000000000800ac00536a526363b5a0daf0d6b3b2ac3aba04fce040304736b2b030368a3571dc6df247103f4149cc7cb9aa0200000000ffffffff022f1e37010000000008515251000065526a8cd3960100000000095200526a5253636a00e6f6e0270100000000000000000e225603000000006439c2ee2be80e8afe3ac2b3991cc0f43b385ac57ce927007c06ce84d0a4081cf7f974f1ff4926a3388f4461be12f00435b499f668f34b12b6acb461b234e6057397e19031722374227f35dfbba2a2628f7bccd71481d7e97f8e3124d90028d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003db57c6c20fead3e158f476c11a89646fc2439e6b60649ce554bec9105d0b834741865eae433517847e89049500e8b69d3affbb28ac0fb936fe19d710fbae09bcb31c07adea8d9228775f3f2db44e2f3d14b7efb85a885bca088b1827ceefcb7607537e4eff95fba8231cb18ed63daebe27777cf7b79287b572ee788038f56e7031346ec11974786cf3b64902415917ee22d5ccfd1ccb6ef700bb19446a61c291a03238f38a247c4c3cf807fee2c3652d5053e7de9aa70d4cd41bd6bec693d52382b0a06fa5aba2c5d87850c78bee8e53c61594c89ec1f5d3e107c882f018566aade6ef16b4e1f959fcd2199c403d33e0aacced8253259399e1ba3b8921e3810746ff8031b2c8a43530c4780053ff5d936adb21d6e619a9ee445080de97c655ac8decf33031c09b162a1cc40ceb2c1c63f026fe0d11564cb508a458095b040c18796d0e0ef0323431f8c64316f66ff59941e006f146b66bd58fdfa8d80afd878cea9cd9abded0224f00780e43e47928cc1d5b29dc196b8fca21f89525756778e8d08f7ea7ca97803093424e36a25da278bae7e2e93b8fc5b89d34f59f63efd814f32956d1ee106c36e6ed849843268f46811adc0c6628632a02c74ff66d5f26de0d05b0ff41af28294614b42da1ccfad36659f06b99606c7b90660bb81d4ff351e4fa801fc6dcf7945718dfee11bc9bbcbc9c856cf4ca43266fdcf30b8c74e5df4af7c3f65d12da13537b0d394c8947856a3b045d711bdecf8dd99b272ece7ab9f5419b0729b143064dcf480fc516c2ca1ee92ad4b7dc81363248ced3fdf673a57db9886aab76b5aa4d8fe50f11582929977717070fa7159d24654e2bd76d815c5e00db594bc4c278e977c431ddbe13ef1f30ac410ecd844d5900cf17b89d587f2ddf39c1a6ffe23cb216fbc041ecf0babdf53e0f045a99b63e5bf4d48f8eb26c687f6435c12872f0c1f6cdf5bd052e08583aadfe2399e8719aa65eef7b3da7fe4e30a3c644c874b6cbdc93ba13c3257e47e106a9ff2a607333143aa26c1479da01cbdc3e137dcea3502b7e2d01b3062de2ea42f82034046cdf91fef5f92447f1d638034ce3e763b46be9f90c9dcc15c11acb392ee41a0d05799421182932da65b32d754f272f6a6f2e9968b511df49f12e81704c9c506c444c3ea5b63b1deae9d2a75b63fa99a2bc93fddc823f6e10e3621d0610f0927e78aac27b6647e4412e3e1e0ce1964a8ba758e6d28ac1d8921bcf91d8942102bdff3875c56720d7af518ec56a8267971e4c8540a9761e0cfbf55b02043e06eca30cddf4c631f5932908c1ff1f42ef290fa1dbf4c40cf86a1e6c4580a25bd9b2f95a8159d3902860af7beb5857ce9605e2fcec52738e2c7a3d9a7b80a7f484f9bb6bafaaa0b9791bf2cc18420bed95f3e4b6d4afb2fbf372a96cb9f869261580a152635f06adea76107d8597dab7c2c2efbfe546eb8ae9ec057429870183c5977a7bd5d6c7fbde904904d788e9b1b43fbc30733b0d776c8639d9b24e2cb452e9159cc17ff97a750125965babfec92ef551ad917959403def67b5d3fe5d8a11d5fe7f85352de9a2d85091e6e2915f1deb1094e03cdc34b79cd0ab1c40f8765057add74417e71ce5fa173b56cb00c31377482fd218a06605c65547ad4249285e503a83cb8f908fbb1b1c4e9f5a42b599f1575fe61c46afc6d7369a95289c554d14b5495f956b91858fc724b50422968e0404bad6685234988f6440b5d9b366d19baa0399c2a477de153f842c4d0914502c65fec8324cb8c4b4da08c7f9906ce59b2c6c949806f34a209a728098769c4c52b3cf69d4d69fd6f115be327b3520f2f6bf85b9f5c8fb0c7a8dd3eba54444bd3a2961a61dcaa5d6ef93f74ef7505342bc1dfe843ae5ebca8a9e8361972ea6e4e8803a6eebb169be0c6e26965344c4e995d8423422260b9aebd6271e0f6d5d94c260837008ef576fb86b0e0ca830fc8e9d0063a17ff316480b5e1784866bf36b42490f56e3ef4448d1ed1a2e8af40e30977775b38c4c44a5184f31f91eafd72015c29c0eee73e451c57fa51bef39056c8ed33317185ae6cbf1b6c19b350c6a88f409c8287ac93b6ca8d53808364b686056b83af8687c971328d18897b7c78359003a32ee18ac296c72ad25423be3e38a5048111642d86a0223068756f17f55a8d7ec1b36f94329ca4ec9d46bddac637db07bf9f5257e3d87e5283ed9953a1b609b141dec9e22bc7bddbc57c4fcc6ad63b27cf9d338497d2233a3b3fb6b7ddafd96a61c854b755a2bbf9b998ad6f2d3e9dffc950afd05d3e82738aa92bc046acd4f89436d1914161e0b2e52ba3464c5994d95387abf6be4298cb861c69495570746d343eeda25bcd2ac853382aa0101bdea71d20d9ec3e28aab4cc3e44ea63499f9009712b9a024cc30a5f4144222e996260337400", "53520063006a", 2, -1098114161, "bf2fa54be3d004652b3ed5ca0ae2d570ee2ecde95e684834c1094aa5ba96142f"], - ["6e183347039662a0eb9f91b8aa60ae926fbdc33e4f61df597c44615d5929f53e70a359a678000000000365515195fd24fd704bf9a4a641a111dde5fc8d53fcb2d6a1c1c65f842ae5918b02346c072e074d020000000852ac515165005165ffffffff7cbfbe3498f532a93bf541d8a569b443be6033ab4be7467049149fc125cefeec0000000008536a006aac000053ffffffff04637da4030000000004635152652083950000000000056565526352e1e24601000000000099d02a0100000000096a516365526a65ac6a00000000020c772d040000000000000000000000004073c129b430746856fc3e1f565c610a6c08942cd99a3d131396afc733151cc64ecafc3e2fe034daebd16a96563cd7e86c839b62c60566ddb9f994208e897c15ad1511c3e1375dcaa7463a79d43ba4a350203f912ce91c406639967264128bb8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007733c3b4e3715da3e97eae989d679673b38a89918e607dab858c953c7762d7712b95e24c6b614f4f4b19638803934a192bbd0fb3fc6f449b5fc73b7c960dd87f3f470537baaf44af0f93d6fce8dc05e222efc167d0b6aa88a2d73a45c990d4d1165b0d517a2a3adcaf2e9015ddc8ca143594bfeb79e466186de2be0477b0d4dc0218d9f3cf1d9a29371d2ccaeebf2e15e129efb45669d3058557861596832247f8031ab85c290f7e5457c19dd8ed70e0a314f9e7125b8934fb202f88986fd5c6d29c0a03f35f44e7e6959678f121fa074b76282156603303ac16638a1f34c7c85fd7a1589c27a5c2a49a37a28a16000940d381039059a93c85c1b688f644b683816155030f413459f3dabf0ba52b8a3e3af5224db2b2f778bf5baeef343d3c1f7a082e77022c973600c44c603bb167134a5ed1e3adc87499ab5c715a6e9e096044ac1164d4020a239d8913bd5dceaddf3fb1cefe806da194190588832ef3291d69a01147647003180aba6af2bc60e60f90c39675930940c5d41600a832ecf43e7e4292331fba0003014bfa7ef32f1b3f8f71952df2735b339524e4179395300375a7d7c9c1760b7d495f9ca9671a2c430dc56daea31d673fa64f674551004fc22e0daf2b9b1a2a72c3b18cfbe680d0c066bbe7bacd9702f9cfa807c86a39b1e3b993fc28cd148c4ca77acdb15a953f0031819e3b535b9bb3ded5ab962e2955af170a0f2e1cc8306a39b76456c34700c1a7abdc2a97a9af4c981a3dfc3c034df7a5d1f9b7e6d959de0e279c809df7df5e9520075d10f5f27eefbe5a1e97721f52e47d9200ff94537bdadface98985a3cbcdc4aa0a3645bdaad959282de4a954c584ebc9f608cf74f8ac607815013cdbbff95fcc5eb7901ed2e97eb37363f5cf7d85bfb57958a7ff5ca2dc8859a3e4a81fb936bed8e71fd0ba4dcec68ec4c6ba9007cb3fef5e613378545a9b48cb0f292f222f739e27fbeb9d07a23371c2d882fd95f1a1e58cd44a9ec365469d277bd91c7a880a83634e303ccf09939e2ad9db3ceb1f240eda185806563b0c057f7d0438dbe3a5a20748df4904f7d49b2d96d2c876a2d6695c811693f675d2939b2dcdc906b8d83476690c9d2ce445f596e8e3dd5557181ed31d499454bd9e7cd86f395681f426e581ed6860ade9824d32e3fb0dda4e94babe4e343813c090fe0ad3b7016cc50747d0a6c3d9592aa203d57eb37940ee1e2d0e1f5f01c90a1cdeaf3e3c283f5cf8401291f7ece525f3c4c167644b2d530a8578ac17e97cba75e3983ceda1ddb4deaa74fbdebc6d238a7aaa935db1ae118d430f56bacde995d818eb090f0f2605858bb8ff6fa2b17e836b8ac722ff0d835211359ac84f3455702088c90f3c9847cf48706b072020a916823d9cf7e262d6a8605ec9f07efab9dca3c3a452353c504fb212aea6b059258d7f0cd93b527c41b25f4861b7cc981e710ddb74f68792ed1d6f5a38521c790140f83779d3d3ce291775577163583273c118a3b7776824b4aad54a1b664b9cf6667dbafdf542e26930afa2300dc3aeb8dcb16b4f907556702ea69ae5a057c7a74ee99de1c0b55b53f26f256998e007938df6933ac55a7d03b3e78414672616d416f1c4e352a31220261b7bdcb99600752c0a1803a9109a6bc013c609bf2acc7bdd6eccef5feef85b134889cc1717fb1c6d1086585c6a5630157dd0c64ef8b97bc69caddf77afab7016f4f275924618c112e6bf65a182e5784a663d966f04391935f3e06983e81adf08fd4ca92d96e15a3fcf956030a006b68e873dd56a392b8e747e19544143e23108afd4342e5a81552a54ff4990db3a9aa5f44288577a91e5ef961038ec3e7f805e72970f607123ea73cfccc8919ad9f438f043d7208d951cce58ccf217b91c093c121bd1f03e1d846331db56dea92ffa5e3502d577756317b67a2e40791b32028c242ff86207d8201670122df1212663f55fb0eda215be1d669b0de68607c4385cff8d27833c70aeee39b7853eea263dc6a9b1c035aca89a642462b89adddec5cfdf9e7398cd33a4e87b726e6de63c5aa48cc7175792c00578361e0bcb32caa0078b2f833f43b72790509e44f0fb869254ce49fa08e97fbfbf1c5ca40a7078eeef1b8795792e084cb0e587f41d1d83a6184e4da26b4923c1f0bb9872f2e64b18bffc91943c2bacdc8a18bab272721d0a94d1e281535b314a81b70f7a28c904f1842b7bac4026b404fc6a239144c58654c6a6832010d9113ba17f1b068222d709424e30f236d343931c3985a6449b1543e222ed171f4cf6660000000000000000fdc7da01000000007f2a1d960b583af79ecae1e4345357d4256f7bab5d33a78b44cb94075a3fb4c3b90e84fc3c3035d92fcf1474d21ae6c7af6985d382309c7ffab1c14cddaa7ef4fea59452db37741429e665de197fe3b3e1299a44000f80f586efb3ce91f21cec0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038d93f8ee8b512f1a4e672eae4c029fe3e0791b909aaf6123a4df7be88c34da50a9cfa2a112d4d5e58429c67c36369caacfabf46e671baf6a0271ebdfe63da4067d3772bcccb6f305271adb892308d9e0eb3baa35ebed1d2b6635478e606ac2f38f652f46245c92e064ed995075cacf6c2a740e1b28dfd4bf398ec25df36e718021c5884b5a197819b44ff701a92af7f519fb8b6699b1c81d78f7d95960e773f8b03212410ba6b5580c6b470d136e6bd7823a7c4c4175396cf2f2730c266dbe815350b00105f60f61fefd388f6b5b68c5bf1438afc154b8c75ae1567e2eface79405ad5c5fb90a07e5d506844bbe6fa396d4fea4a2a1c47d4db5470a2293ae70ff580e0326948e60c3c90f784867d98b1fdb5b067c758dd69f41c69096da7f52c6d1a4e9022041ed398d4790626e9fc2bdc982a47600eb949570be05010286901343a221af02156ec4ed8a5497f839331cf93218a7d942924b3e2fccda9467c008b1e37bbb660300f91b467fe91717d853b582c47a8d0652fd277cf1303f67b012621aff17bcfa022f8916260a2daaee40e1b2b0131e5c39e57f68c50913ea5b2f8badf71f54eb7d6b0ce3140c8d5ce338c78eb9839cd758376aee22047125523f2549c076ed2519067c97ad2de7c97045c39d55c4cd2d49ececc37083ee29e3836e044b521b935aa86e4347cb4bd44feba6b2bdbc77c7231307c289b7f28a7835b4e28064913c038d8507651ece02b9f6e3fc75452f90a98ffcaa0f2e0b44483488d7bf48db9123ba429e60951a657b83072140eb19edbd4deb943130d33d8623aeffc9a8a702db4c5c97213bf28e68db10b44c9318b849c45e48a9bb6810c69f1e04b1364752942483cad6e43c70e3e632b62957af329b90b0c57fbd9d7612aee48d08fe00ce847f17a9eafbb123bd5478a13497daa47272708f748cf6e56c9263597c289d16acb1e326949e413ad6f9da6d2725ac9e73c2df762025f799c3d480368d5c0b0b523ea0a0ee5f273c12b54a07e0cba97681547b5b6a4cb1941cb6d66a31a660efd060c55e0fcc6382a04a0ad12c6b04648cbf6ca457c68294bc1c4511aba098c30f45a0e6e843912752e1391880e20701a49594e7ad9cefa35235362e1ecb134de804b26715f44bf6e6739c68db1dc485c0ee60640023bb95d2185026e35c5ebfc7ecffbfb304cf498956e2916bfa080176871a4b66ce4c109d3adfc6fe3c1c7843cece952dd6ab69efc6e6ad5b4fd1f7a053374e3b8dcee7ae8d96c9f09828b931b137c88108b251b653d8e9f65e3c2d505c89c8b5e1978fd465f9536b8981d916eaa8ffe56fa4e506206b9c305ee50a28fd9fb8c4f3dfbf325e6cda69719fbd5ebdeb244af806593cbfe69401e2ad5bd35a26815df3d09b65d4e30819c760c089a048e7b55854eb7142cafc058df6dbfe7fc2633dacc61f5071750315002754bc9f3d041363ae864759d2841736489aece9cd33642f3898ea2832a539bbc13129090067e5969f43174412d8d32493c4411d2de071632c12efcae7e36cc615d72d0f76efbcddbaa7d74b12ec04772d3bdce6eca44cabbf8b86594a34ebf4168c61ca9d5e987834cd3a8b86cb151b0d799fa16ed8edf89c4c87b0a5aa141e9b6e298fe9aff435fc523f886516d014517e89e69bffdbb8da963e6a4ebe44ae7200bcce926e27a4002454872fc4f0a46d8d73b633048a26ce8f078d1076ad6f5aa9ca45bd8b186b03dc79a0e3dfea0d794263920454f7aafc8ac95a3ed2df8331a08a723d03529b05b202d9d90f22b33c3a5ba867ffbb38a82da1542474dfc8dfa703530c8effd00f91ef2b18ed5edc6bada838e39edbb93e587a7cce07601a80f7c576c70a3b4063574de561d997af166e7780e5f2d8ac955406a0575a7a3d8b237c572d9596ab1290734a46ed526d002eff5dcce4359203f83f85a906cd7044f198b9ef483039d06a2024915cb0913f4bff2df4fafb78df13cfdf5cbc98c7e2177e7437178b22f9cf7a6876ef7316119a21d32d1f6cac4fd8eb5d8e67f52ef439cb66c8bdec7b35022d1ddb079fdd40881de96872d858ebcaac715a180828c67d2e1558918f42172b3123fbd0a931613b6ca7920b631352e9f6015de5f61320f9bc1ab7d413e720f8ba9fa9b48ad311ea1c009eef939a0e66d7e483d301afef05e9dbe61d7c37dd2644ea58d7276c6f8f0339bd11fc113ca1ca9f6612a866c33dfcd6ece25ae01ed7334a34b80354028cc751ab4a90f3c9e2331028d55b488d44c140f4d26ca62e2c5ef85e70b153039bf3bba657defc35befdd2eb5847d4ac46ee7adf659461c88119a7eb777c46d346326a2966638292cd15ae9e67802c93e0b39eee5e9aa92a5b437ef5649f4dc61f4e7639fd6a5818d2a874d29e1011f4d0a41836984d509ab5fc0f07f27f1e842b8a8b0b", "65536a65", 1, 312405906, "1d32fb809b4d35c1af16fc103fc3e6363d35beefd9e24c9d40e6a89f74b7774c"], - ["9437473301f74395c6c6f58573057d7f250a8ee17e56868191565896cae0e496e1218d85500300000000d87b82b80388f8c90000000000008a70d501000000000152fb3bd800000000000352ac52a1d4467a00", "6a00ac00", 0, -480914887, "bd7a1166f76d7fb966b40271751514a527528ee27ef248b526ae4aee31909adf"], - ["030000807082c403041ebbf2e9a217a0889de997e4cffb12fe2cb85a510389b145e4d53c44bc15468c00000000055352516353ffffffff41a0d8c6d41872e73f66d9868fa15782f8c41a4009db4442dcd8aed36d723ab20300000000e7de8000382102975b54a35eee87c6a93a59d9b8a49264b26f6b096201e85a0ecf88522000000000075351525153ac63b0ac72bf8237e03f595db89e6eb7dcd4d09c9f4299d137996917c0f7167414f06a4ff58d0200000006ac6365005265ffffffff03fcc770020000000001659157be05000000000200000ef804050000000001001b5e841fcf406fe603a5ca38050000000000000000000000006c182faa94bd9b0f9d88cab9853df308b5151b6dee6102fcee452c0ffc03c20e6aee34bf8cd3268e25580c4f96a8eb4ef0538e19324b6ba2b4696e766c94333da2d66f8359656e1bdca1290768c9f49278778f443283d47e7d2975f0b285358700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ac2db8c21a1cbe644a3001a869dc8c61dea08983b1a293a06ccc4449a75e23d8224ba6a4a5f6c8a9ade9a52c12beba04e93074089f0e424d2e8812940cd828b6407a995ff4cdc4240605b4d6eb74a3c619e580a432b2809e6df4abd33685b2b4d4baa3ce32e28ab0c4939b610e3e4a818fdd8e9e6a8a17afa37eacdfbd83d4820224b29412bb71cfae999eb132afc3bc2b4a141402f4297563d973cda6730f3c63032c7b0d246095e3585130e4ff06e324017252eb92ccc32070ccd0bc23431634a60b05dc023817afe73ea63a31377a470e3df2a0b81b4fbb5877090758bdd5b6e85f468622b0bbbaa8a4a594118256c2058e04824ec3d9c305c5a4ec1ff0efe213e6022e38b45fd803b3c26377b5ce81adbdf27ef16d3f209b5235987dac6be0960156032fb07542a0861b196e821dd3396a956ed121367405f3767ae48f137f93107f11022fba00a3d6a2bbe5635bb74e97d27bafe407ae0270ddc54d326ec71d253245d702164c91f2728845d4157445fd85813379453b074732a9ff95f1a3b7e07573f6b1032bced980f1332a69b37930fe419996a00bd190d8600d26e743ce4b7f5146e875f97f93fd44d6a417aef951a21187f2de0deef0eda6191fe1a88c067de8326fe83d5d7c7c39d47b68e523d7667b8c14fe14382ec839312f1ecedfecb179f21554b969bf0e6354382fc08df3109815c39a617ef813b231904dea66284804b2dd0ca5367d1b250fe1eac9cae1edbf087e9b6b2ad90f7300f9da4fbc8d812e870ae1786bdf6ed48dd79bfafd8a4d09e69df76e394727848d723f426c07bcbd537c70d7bec6eef2d7f46a8086bdf052299e6d1b8815fe85c97175347f853be9d7bb00d1e1d96c389d7bc683a33ce21ebcb70c77ae09a6fa788bd83ea9024806f326a9c16d419e75f0f0780ca908978b0cc727eb6579951ec09a9dd2f32bba9cfd5553474f8e284eeeda21acb66feaf2fbb3969d41a7f36f5ac19848d345cd475a5b8e28d6d46c6d1d094bc30fcd5bd626b7fc39a721f1c587b648b1bb7d3e5fe9043369f2aeca0e8e49cda1b2b1dc05c459c4a6459932624b61fd3dc48a4dfbb4e10273a2c8a81f4e8890faaa782d2e7b7111630d4ce68c298b082ffb532795e32e56b5220fde3e4dd241eb610cdbed24bc0ac2ad6aae762e8cef77175a1b1dc9ddfe99a0b396dacc4f6b14322596f47347d2c2c330f8bd1cb00b55a7426ff99f96708f94027874feb3185ba175f3cd2cfe7dae20f2241c3859ec7960edee3231cc8dca956dfb6c036ee39a45e1092c944d5bd57fe04deb4aa4a028d170dda2292a47f8c51e45bf7bcdc9b217128c6b0606a61445a5bd4406e53aec43314b5ad614ba14c5bd11bf34978011c3ce4d320e67dbbe9fd8c640c69dcc42d0e249b61b259be00f9731f7ce27be0dc6f593eaca811758720839ae3ac7859894961fe2b7f3833e372c4eae6336309e037ab17e68114558bac7849761d8f3ba6b9676803b673cc5c84a4b236123789590c700c5f1c83c412c22d9c9be906224ae2cc0b9b19c486fb30d1bd222f08325ac2428fc2680dd37e85b6be96f4c2c8c7006d8d7f8cdec117cd1322a8c740e246bf333e7befc1c441f2f78be5ee7db93120d2194dd07d8678161222d07c56a74125b835a013d2c95c3daa8a1bffe2364379f3565821114a77d727261bf5048faebd86f13e9dfdfa721ac275ea0ac131679013e34e88d4344d293fbbd669b5d7970aea783438c910ed135c282806683f2e4483542592e3ba2516183166ec5f45dbe037cae9b4b9f5c33145f73032256a4da8e1981b8f7f029267708cf8216d5150d6a3636bff5afc80c6e586bfbde2370107692bfdce51ea85d28a56e9b20faed68994830297ef919c2e92c23f26b6c3d1e7ce8253684d49a88a777cd46c02e7f468662bdd8892ae3f98fa0e78014dea094b98b189985bda756bab8f928dd9a53ec905492608a85412188c06aae0c260af8f7d65de4710ad73ffac52cfa10ef312e99ba46ce8794746827baad900690aa27f02b757afce2afa3848b9334e35fb16692722ecf642728639ac3a3c60f3dab8e9afd3360e84d5cfb76b09c9658a7e0a0644c7d73f4fcd8f2f3c62b2a87eb3d9a653d8d4238382508b1f48a7e50d61f6408aecb82007b3a7bdac479199552e23a7537fd5dffe36f7e759c06a213fd2d22647bd57c7b6d76d1db9304258adcf843ad904a201ff3de661d4486ad421f69b06900380c49842899d57987e143388288dd55c51472924e57e5375c64e80658d1546ffba98554fbe595439a02000000000000000000000000121bceb5146f64a7d527d2685b63193967888b967ea0bc4cc6c942cb9703d37313f04108f36cba5ff2c5f9e735cff6a3024c26ed9e789a8bbeed12258b02361821f866dd88efb806b9e4b30da17f06c5be2045a8b0bf455533e1d998a53f9f9500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7af57f693050be4c6832ac980daeba1010bbd5ddb229c360b386a421afde3f56e19a26d7085f6eda003297f94c2f91a9b83860b807d29484ce4b28d6dcfe86a5a1f7c19b5681950764c90a310c5699915f16c1268d516b8b9d721ff55b0d2391b6640e2516852b7636b5dbb15d54a5b4e18d4955c911f8718bbe3e122bdc6020310390574a47d8db01dd494843570c1eb200bdf25a299dc1c996101c9511deaa5030f0d6e1e402d5f602b5d5f431e775c87293b0af9b4baf7bbd54cf88754fd3e270a04810ed386ea0679f1a9da1efbbe846c4d483768c5668203fe45bac340d645adfed5d0c482908ceafb3eb10c39d31e9642be4d401ffd59ec9fcee6bb51e4712a0320faa102dbfbdc34866f9be3dae4b14b1538ccc5b73c7446485c85698954de54020e9a33f28c8157b4393846d636ffd58599aa92891d85afc3154c3f62377908eb0317306d10127c021a834f082fdda1286dd79e585cb9234be900c059e349b77b5603137f82fe80a92619e132bf0b61eb331d1c54aab1d05c64da1aff4b3dffa79455030139ca6b1343e26b3d8ac3a9df546c9637cca61ce63de19ee9278c969324fe8dfe9602eaa3a826ff280b9531e60e60000e30ce3c00a7aa748fc3961c8bd2bf4bd3907f16bc5b17804c81b5ea182427c1d842921b8602eba539f0089bf9a3bb93d85ca7982f8fa743eb7998e3a79faa18fa32bc6d1bd028a523d066e8fe026c36e12905608a93dbc1326103edf36f02f92f30924fd4071b97f7247b6a8c579545436ade235cc77054c884e1303451e578f7db2be8f14a07ea2ea8faa7e7b01c9fa872d17661ceeac462b536e4d469e13246e9826f76308cd48e1e430c2291d84d73e14d3403f1e660df12c55f6d6593a51a3c0f7b78e98c666a2386a465618d8b7ea0616975a9891520b7e4b861ec50ed6e0bfb1c9e960d7792e4b343df6bda66abcd547f094627c554fc22832faf2c7aedecae847574ac03fbda4334fc45d810da4f80d2e0ccee9f3ac8a86a14319a37ad707af5dc8993a5bca7f8d1c58b2ed2fec178111d382e2f0b3c8cd683a08029e2bad288965743037481ac6806906009e7087025202683b850e3419d46e9ab6e9cc6c2ed263aa3cfce82927a0d4ea84e809181f45828e3a7905aa43431be0dace1206ba447238d639cacb93b48c416a7738f95882dbdcf380a93f3958533e859c6f4fead8c343de4b866f0cb11e92ecf88e668021b13c024691bd5c6a66f8b5447189cbb24e030f67f2262d821462d3999ef599e106a22eabfe88c7ea622d08ba90bbbd03bbd9c8450a24af991be2663cabbec3c1625d12a9e4244c46776e2cca09b91a31fab18d47afff16dee2d702b6babb2fd2457ac1f4ed57a329dc59ae309e0e52921b6989becf9a932584a88524d6add1d3be568a8b876d4740eb5a5ffe1f55017ae6e78e39f7ba0dfd74988927d325cf68a957126902689d6e1b924fd5ad59db554babb51d5ee871ab8449b7992efd6bbc7e128763c13250a1e053e9ce055c20a32753ce58575e88809246c3c2f4bf84509f9ad480c90d55ef10f2b837ba80d057725947e7a3d7107d9520de8aaab350c1e2362c4f5817b5515fc4336364a5347329496a9b89eb1402f1a46fbec38a340c5df1c65220b632144cb284d04647464ccdfb6e00c623fb855e9b929bdd65a7719776bd6e823fd6446fc31df437099b337bc0a998a1c279a334b6c827f809b5d8d3918450f6320671d367fd1a46e75dc3c95125bc45cadd6c8255706114263b565819d5658845e682a844182f38efaee52706f10809933d35b13af39b8fd42fc362723a43ab7abbdba16d64a495e4e4bfdf80967a5fcede3fb72a89298b1d74024d5f952715b2a5f89c3bf43036c92985c22fc825940a38e1d198a41cb0c2ff3f53f674d8733e06018b6ea71f1216850d5bba624795cc6542e9d57cb26db9ef73911c0e2a208e668d91615ae3bbb05958901de18d628cffbdd11ec2726a1dd47a52b91aae5d5f4682f4c7a76ae28e20ac80b3505c0013ca360950a11514a304e7c38aebd51616a1bb3e1404785a69cf1f42384b1a5ec905951a793533ec62541fb7c9dd335920099eeb681d7ce733c74532f50978e9b42c91895081c4727687c23f39c9ceb34179f4120c0541bada5efe1cb00d18fcf8490ebaf4ef4a6281341d9721ffa25cdc020e9207993c3f9a109e31b34fedfb7f1cfb677cf8709f6d7721cd650566b0376cdaa73545c36ac7502034c51008897df5476d34f419d77dbb3cd391cdc9e8a9ef051408e92474247147f010000000000000000000000005962195a756af4c9816d4e020fb341b05e32b9077b4850263da247ca6f08b560c4735c928629473575199a0271e78790e43f4f106ca2c689ea4507195e6433cd5a15a5800a2d1e0a1c3d8cb8f7ac1b939a82c1fde8180c2ca2a84ca17b3bcba700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000391134915991447eaf84bc2dfc34ba9514904c2069839af6ade8a5fe4d938d9abdc01297d2ba11521a5d6ced25b571f31bd5c2a07110a99c9ef25479974a3848a8f5ff249165b7538ae0cdea2cb729967d618c3520a4059e9c330417d75190a4c88709a32d4cbe318715138f6a9e0d53e2f1359fda395e3f56ce3f68acc156720204e0853cf3ea51a0e855f670bee2da7fe8702fb4ad8171c1aebbc10207194289020d387c9dea0e27013ac7ef6b78fd16195b13d91df41c7f257d61a9c83cd26a820a0275219471f13d7cc3722fd8169d0667339c5f3625a69669b13c0e6586ff0ef44d5d9374e99b589cc317b6de7f79b111cb3ae598f60dac6900831adbc09ee0190321ce887e80c4338427b5decd004e96c790a624da896993f9e75043c0ae3428200219bc501d4375e90da279b22c89b040a3b424364ae70fa11c6d74bfaf0ad9ca7502239ceb7836ee8ad1e7342ad3dfb5d63b4801b7e5282403e94135740085b151d1020437700a9fd2da29eb38365b25646ad459c98961ef3f89cbc3bcce1a88ab228503204148ec26ce30be7894ca1979b06f03a8e19d78de1dade999f35bd5af58aced666a0224161aac939e07145d2f602d1a2394b5a8b00f2a8f8ef3e08e41f82f7962b24c34c985a99d4d6afc7398c465893ba36b95c51bdc2f127ac7768bfb469ee27a56762beeddf7a37a29f2277b6f45723099ac9c7a6031876184cbf282a5205ae1ea30f504021ca57426772bf54db231c5309a652b0ffee392fc6505b96b718a4ed4a0139b5082d9f722f7b30434eb9744b2b9dfa57774c155fa688147276bb252ee95eef0c3d79e773f1be294f6c13c3fe348482abe05f76d0dd60842d333002ab34ffc34255cb963537afd29669a07f7efe42bdd8a9d00b03715518c0d663c148a6c67cb18a10ba8bfa68a54b98bc20381c7a55cd44e5cf95af4a52ea36e01e998eb1968b543b1cb698fc098eaabe5361b05c39cebc97e2fb2bf696f8b891451ca8d24791dbe7d5387a8a276d63ed38c4ab35fcb8996993ccb0df5f51ee553d0e445c8867975fd7bf3d2e0d2970e38c9b4049c0a36d445674ce57326f3eaadbc066d197a9b81d901a85e24e02becaa4f28189c4952cf5d4f75f75dd4f084e79bb2d3087129484323fde953202bae1dcfe552afa020f5febba4b7f80af32d666efd2b7ac9cf950b2122ded9ebdaf459364e10c1db67cb6cab0699c580d1758db288cf7d89a5822041396129af29ee4b1fbae14e2cf61b7a3dc5fde87b88d369ecf36017a8d343c4d08b0b1f6ae9cc8d16f8d5e568d0f2bff39dc11e3cf2373972137a7c59077ee9df2631c9cbdba6531f4131c7a3e1270243c58a5cc0d831cd9c1eff1901f32dbd97a420e2cc1142741298e36f44e493608217bb95d8382db1b00e70bb7ecb9e3cdb2171cc23e2bc12957d37b65d012714cb773fedbb4ba840816baa2dd8703619a3672c82a6b6b2e2f9cd6754c1a98159c2d40d8051a0567ab440ad356dc665e4254b985e6a85784687cc58877c8d398bd71465b22d87c2f639273fb9067d0e26d63a522f799798fb1a3ecec5615386252847afdbfa8ddbb3bc579c5a635219b75a056ff8f78ef75e1ca1e9ab4fa0524a6b0a9cddf70ed6033c9bdecdec44462db22d98f6aaa796bb943971a67eb08df523fc1d9ca6a2c5e3141042a9a1da3f45034263f0a9d68b8670147cb214a99bf4cf22736c52267f19a2ae722b6669824e76aa972a12f8ced3e8aecd1c9ef811d4a9192dd379d9e22a59d4841b3b3e4a64c02a26fcd2bbf6364ec54cdd13e5f0a1353da7acb77570fa75a21d6bec73962960deffbeb8bb307d8da3912f2396674aa03ff4df294f7de86a16db6a2897747e94720947a0fef6a8c373c28cae4c362332a2710b8bdc95390d607b381651fbda90049cb9bd13eec183723e5ea5a2873c8f18f2fa24ecee84f1777fc7d5f8617fedc200dc00dc5c067b99aded785b2588b041b241fb423bcd632a073baf475fce0d0adad47bf398b47ad710c8cb980942ee4b1b38ea500039d145fa406b327baffd741b7582649cf13d8468c7d6b59d188904e56fddecb94cd1687dc668a3eef40abe651fb07c14aa8621664242a2a54f158e82159789d77eafba37ca482744ec3ef0df584fe8716ee4429a13419e6bbd33c0eb328c4ca410575ccaffd22a251eceb5e26726de214b9f36d857bdb7f4972e33e94f39b6008c7ebbf9dcea5a360bdf6a3578243a5fb4c0e0ee35e0d7c7c86d83894bda36cc8ce8262ec34f8b9d10eec9ae1af60ef13a90ce6f916297bb2bcdf0d30440aa4bd046d3362428376c8ecaa290793eb0a08665805cb463d6db56520286191359d01c00ac5d643dca048a11e3586f2a736db142bddebf98e899404b329dd1049e441f8fc63df61421b1f8cb8afe74f525edd709", "51526a52", 2, 608300159, "15d76fef191077394f4b3110ad6768ad5f02f0c9420de34f8855cfa945e94129"], - ["030000807082c4030210da28e60bca55d20d2b5778692c8a3cdcb45d4d8af48349c6a4953e1cb7026c01000000056563655352ffffffff1a6608434d7d8a51df53b350f6a36cc455b57d9f78cdd5aecc87cea489d8c063030000000751536563655165ffffffff01f03c83020000000005536a65635196b33040b5216fb801f841a60100000000000000000000000046c17f867389ad949b77d050898d6cacdabd9bbd99e75318b41983a949acddaa19cc975951c92441ff459c505510ea0f12e478e1745f98b6cd8f00f81390cb40b99e61a4b46cecada586bc2ffd7d39ebdae62bb943c9491d68146e235593a5e8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009cb699deaf926be49bdc200b565bd30880763ecf28551be3e6f3b1778fb55f33bd8e4a97d4f6447cc596138d5dbc3fed78a1f73ba5c0dbef4d771e1e797eba0e2fb9e44b544a7da2d5175041cd6c0350fdafa6252713aa5ed853ffd736413407c7d5c654c96331cbca8970dadc96df02ce82a761d4ec766388eeeadfd34e086c03179df1772ee2aaccdccd9383e6a1dfa0ebc1051e4f9ebeaf129cf884102d86f2032e0b85072749b09df8c114e005813c0fd2c28666ca224e1e3f629b985e030fc00b0490b39949480c02bbb2f9a27d5a4a02d3063b571fa5f7eaa29bc343ef85af1dd53e3161382980ae10c79f4f9b4e326bb61d27c889817d94faa0c4c3c9c5d5ac030cf5c522279d5a21dc517bc139028cb590d12dded98e2e252e2a30675dd3569c03042ba722af28c0a0bbfeb25e0ce853ad1c4623a3603686ac1e2e80acf627995b031149164845b5d494047b9e19ebfc876dcc7edeb6cdcaa63fdc992a4f4826fd37031cac5e6c4636ffa18898d98e1e1c6b901e3c7a73202d7985e10d2cce2e415d590223882bc3ca437d84ab937f85bc26e027fbce253e9ef6db858d0a72c49eae3b295134368c510792c0e4b99eb72e2fcf741c8c0c2e599b0d84a15d86e562d118ffc834a9b16486115776e9c5992a6028ddf70dc3762809cc362a1d0bed99ef30a575a7c9fcfc8a6fcbb09a9648f8331607f17d12445d63d757aa8ae4ddb0e77d39a81f82782a2b7b7369b394f3ef093b76c58f42fb387f6dbe1708fab09e71454af7ba4ccd1f4665fb5f76f3d4c178e90c024371b9346cf2850f26a3e53f6166c6f110883c74fff0fddbe2f60bf08365eb1cf896fa7a5b139d3383b3cec38b32aad0f891ae772fa712d13f90a8035f928c17a9cec821f0463b2cc1a43ebe253e4e70fa4729ee91a418cf92b17d9894773f4029517e759a0d04969328a26ec32b35b68d95af69001878b8df74de10ed7a8dc21e6395e8019ce697ef813db1604f131412ccbc685f8b431edad72b4712a9f8fddb94596c385a9ece8f92e341472f5fabb963cd1c4ebcfb4af2d832b6f8cb31fd810d0ba3f17ef18572756b48ef78f8f536a9d0d30c9f8013f1f5e1f269eb0c33fede99e8fa22e4d1fa253147419ef3520f6033896de291a4b195451a8863f50fed515dd31c78e9e4575cb112eea268a73828b8620df81898c322718135793e398931c5d0adc02d3f554deb9e131e5b74f01845e7fc088fcdff2299e60848be8241be2ba659d3579e9c7ffbcc3f4d9707f5ad42e6a8ccda59c3abd1b11dc6dada9406b7dbe72523117b69749499f9eb094a3f50b0f65ae2e4e56a5ae9d8e162e35486d79fbb94d7639e3f6b96513689f3212a5e430faadc3dbcfba7b4fd6d80a575c2bb3562be39a224879ad4552993eb6abc0dfc371b0cd89a2fdadddac02a3ad4d25dfa64a002094b265a8a323b3152b21624d0123dc10f600e5963645eb4c06d4cf9e756b083507533d4b80d2a14fab7109d1e5cf09f6ee7efd3f94ed96be1b4acca0a973f9749cac5b266dd7b8c3e83b7e7e8b09d6634b20002748475e9daa8135c0725c693bb267ef1bfe6c5aba9dde844d3dcf385699918a3d1168960c978aff690e1c5db079bce5bddc122a67f932e5e19231db33eb4e837c11a5bf05bd33967d59fd00626df046ea24c0a936db7c7435c6f9d101f193f3ee8e180a955a76d91e0a059e0f39be5f207d22694d03dd0f8863ad78adbdf615c2b33474e73c4781a0a956deccb0a19b308a662386eb46b339a42716da9f31b5f151e5209f0cbec2d5b69d9cfb40416c31cb4bfaed64953d4a32466d115220540a0dedf3146abe1d47170e443ce4a001b4b34fca0b3d2b9b1be673e16f36156281083bbd5ee3ef7587197f19d7c9f6e2d1ce2d646d031b949453e15969cb6094ff84961432ae9fd852f705054a5f1ccd3c44d660dccbc3efdc3e3ccf97b6cd276b9d3b753382456e5c06ec7abd5a913b38a7c1c6497157a4ead15471c191bfe24528a3177f25b547c70071db8406866a04adc16a5959a2bf79d98ba737db159d16d6f849d618fd65abfcd27488dd52bbecb9ca17318784fbb6a49ea1b33ca4a355a58c8a0e01b26cdd3166bc66daae348998729a839af661054d80c663667bd00c8507f0e3dbf7f58b77336d22855e2c9aaf8cf5fa410fa5c4cf8b88d502876dfc076789ea3fe4bdb52964972055f86ede713e81b11e70d3b1e844b9629b7bbbf2800855cf27bf98deab2e48bf9b1e0ee0edddd53b923fca64936c55c2a3306ea912b4f90bfc452cea31301d01767f8778827394d3d40cf52ede0af468a6f4b51b42dcfb990c5f96b36964fd006585ccbd2e48a787901cb48bbc1a0dfdc6055ea0f32408c210cc86b966b0482ca91604918b324625774031974a062c06946d44f1a5281832303", "ac5200", 1, -440778132, "ba972a681059a9eab5a4d140d5d105023ebf22a07462dd6bebbc7c3677d2dfa1"], - ["764d0a2404616e2ec1a453676be3aa433ec678ab5c6f075acc50821537e9077e14bde618a503000000020051ffffffffa9e6f03b4a4dbeaa8bff2203a8381dbc48693253d48a5f710cb926b5fef4c8f30300000008ac53536aac63636affffffff9f62988f8574e5f5160cff02dc2f8e34f0eb1650c72e58eaea6875e881071ca40200000004ac515153f922a5afc6a8ea50aa087f073d3792aeb21b9a466215ce7521e3b67d5fa98e1b8db2063b0000000006535353ac5151ffffffff022bcfc50500000000066a516552515159a0f0010000000009ac52525252ac510052a558338a015d610a01000000000000000000000000dcf749f0f686ebd38bf370e4d6771cd8dca401f020479e9bc10007ab9ba20fec90a88bc0df749805c6594087e0c118179a8c8d6345560ab21072c0947d1a0321f32c237effe81f3595ecde775a69c25622f43ad624e20594bd838210cd826594000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007681954562afcfec451e7c2cabbf1fbe081809608e727057c4a636fdbe73bb1dcf0572e860621e3d44a56d9a3b9d5af58c7aa9943068973b2dbb481f2fc937b4f270925eec36c3272b02b5b5acfb94338884f0a068e1aebee6af8a3a1da0bf5222ab61fdb0f0c8939369ac64835e08b9ff61b672a5d8b3a764427893f8d48ad8031c744ee85959cb8b7cd058a58b0476c42b104e6e19095d3d729ba7425ffd0401030d718239764db92e09eb5ff71b924750248c9b513245db5a051544ff0fe605160a060c364a258e31263771398a3193d29aa039843943267bca2c38ac1a4d1d6c72c4bdb8ae40122577dee1e495c546f1c8a6c2603b624f3ebe30f4ae8e112d8c20031f00cea1ec46bb971573b69bef13d11c99dfc3e6e04ffcae77e996b94216be04032c77d6ad61991e31bb3c2e6fc6881054f160aadb9f031920e42e00e02e23ade6022607a7c0a4020c7b0990d7f0d269e548e27f1e2ebe5db3e0223f4b8d7207ce1602141080061b9424551547a42a748c9f8b91e3451be62c12bc9fb982f36068cc9e03202d54d8de9565c6eecbf596fac99bbcfbf023604d12780d17439145d4e144b6385cae40a367a105c59fbeb0e0f2d59986c02d9dafcc5fd14d760faa17d01ba75efd14713f347ca855b25b590a2d3d25a00d7f14ef0f111d3d84015ee5a9b30ab25594916c6a52e8c2fd46f07c72a34b3f0fcde6ec9069c5adf6161d88ad35cf2a0c3d98b77b5eb2d796f644090d1f0897a160613fb1e3a708087f6f350cc933d139ccad524ae8a7417d3804e78fab83a65fe930ccde745b6fb7f5a3a840de7e39b5095eceb88d1174f6dd92e74b1d46992a93ad8e5f70c4349b0e41ac997e92c032e1e1c990aa74f33a75a1757ded637bcde2354a14628ffee9bcc88bd4baf5344eed28f7c2b4b6cfaf58bf0492a4b11a2f165bb3531f003ff6ffe5c9c8676993fb0c97e4351b098abebb34032bc41f264fe43b0168d929bb2347eef313f595c38637a3b814c48c2b1462a622ff6f9c6853c35389a98697acf183dfbeadb8459831e155d51908c79586d91109e08c4e998a3dae54d761cb4e653b675599b9dab89f44a5daae1e845152a315a275370ec9bb93e8bfe64a735fd66715e0a769877a7f72612be81a76cbfadd4102c3c3b3013d544e2f6ac5c21a0c51070fc5bfbcfc5955ae58a2ddeb27482480d9c1724a465b7615d1db0a6404d8bca2a70b1c08200a465eeeb4552b236e9f691ca7e76d35c2d2a4b54d20e20a87d235dff8db077c8c3920216c03e928970c01f19694e8e9331d1a7b87901475b21f687c623b0638beff5371e1f93ec248168bdddfd7944d6e0f36d8cd6d2a2f5152c9f4095fcd8538209eda88b5f434d14d18a8e974554d2d399ddd802dd741da4c2b8684a1632490b69688ab7556c73877330432b0aac1399ac18cb07fe7e0ed3747f4771158b7c066a3ffcfde1ced8c1650d5b10c27ccefdaf1c4230d1955ef104df73e43168655e0267570a620d1c4a9458a539861857d876558e19a565fcc6f1f7497785954d04d8e507fa43fad138200d61d420a9ae1603db1ff44a7b3c23ae030c6203d8f6fc13f99667dc525d37e463917b5847b22e674feb6dbcd24fb158ee72805a4771796f406f68ce789eec4cf9195fca63261095438341537a968c71d01a90896e4c3f2106e410e516bf41105bbb411aeaa0f5d40f1714407687a983b6a70354edebe67db863160c0b907e1efd5e400ac6457c03b4ac7a12acdbd0ecee3508ab35cbbfedcd7230949f915a7f3c523e5db6e3cc06b3fab3eb835473046fa66d4a14ec0b19d47243288fb6ba7eb333ff229d0d66bebebfc84d3b650f64659bd1d46707efad419d3a2895219c480fa65887c2d7ec91d31c99e8f708bd6e107564a3544ae19e0754da33eede118e480b90a7732204bf1f3eb9587c34fa0e9b0bdaf2e40f0e8edbccb4f93670932841e029df08c23ba792a0765a62e58c145b01177ec3431576174ea9224db7c407c34cc4dc7d8ec4a96ab86eda22e0edde97b6c05628542f1c1cfa1e80b3c5a333b619be4b0da709bf95ec2977958ed4e378841d6b57f1eef466d3ae62b3dbd6c3a578f20e8bec210c7d778541cdf0de601bf8a448afa704b31334f7ef09d356d0e3904cc2f5d643490c744b3ec50329f2f5246bf68ca10833ba978189ad591cc2926cf5ec28f676bf83be45dec1cacf46bed5504c2671bef3bb2bd936698b8e391740c1fa0262906a11580b7df335377b8f8d38049a30f7becf738b08dcfe83c0fbae610ae184d9f1763059241a18c5e0fe3411427779a878a11bacd150132651e7548294a57303115db80b14f0dea4ad433f7fde7fb5c4e29205ac0983e4591d2421b2a5d1af3896dc086bd2b93fd0479fbe0a96d779b6759f521da7e3cc131429b2194ab9a0b", "656a6300", 3, 1808694734, "7fa5478b22eff3c07e2883a80e0385c95a505405e6560470710ee557450068c0"], - ["1ee2c65a03f479529dd1cf9e00a322ee432a22ed199af4e6238ad74fe8873c6055edd5698c0300000000ffffffffc1c92366acd025d58b6f64358d4cd6a89390e8c901e58b4257bffe9ae4c47b0d00000000070063635263656a8c7cc1801c1ea5a3c0bab62cde054b36e2d58383e7eb8e59cf2f26c29f336e37765a16be0200000008526a53ac6a63636affffffff01702466020000000003526365000000000300000000000000000a175a0000000000179efe20968c228f58e0c4f3d338c56d62cac49014a617034230e95378b73f737a168b9cff7f5d2948a53755a911c95069e8b9ed242eaabc84d4def3bb467b9211f0db531ca3de393c82474ed0dd4a2d68bb2a7934e316b5b725bbcfd0c65de000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000788cbbe73e02782b7891e2ba792f453ec82dab45c37f71842da7e61d309225b29cf6104f65326ff41885fc385c7dacdbad3c1eee1a7425a35b63c1f5440bd00bd5cbac57e917cf650402bddd938ae9989ea546f4de863974d9445338326405cebf9bbdc40328c5789f72f1f1882bd1bc8180a951d30698ff7bc08ff54c8a4d43021ff1c59e32e9dfe878eba6ff781867f7ca814eb492d9f44c978e24ae37fcdb3d02245803a4426264500725d49fcc53e1c87161f0b5639e8e6319335076812a22440b01b181564652b00d66b0c19b3e2d7c25383b645fe574153bb9ef767e4127129f543a306b6e46a2338976f103676db24cdbef7ed8e72cd0f611d4a1183eb363440206c402576afaed133f4adb49ff8271f56a4e5e479a4b9029e1f2c0d7276deeb40227e145f59dccad558a24899086a114cf0603347d6a78ac373b5189ca0b8c33e9020c7a65536bc7cacbef3d490960db4b6a0b565a867f8b359a1e4f96aab0d0479802254bb1b4f89b0fc414df8ab7a254eadf1d51e1690c09e5c73051fa2092023cf402170a0530d7b6e2c75d376771736def9b6b72e2ca6689851b7dcf9ae179f501a14d64e52c1d46016ee3c79a1a6415a342beffdaee7ac2b83a08d997b895f0450a0bc7172f418f1ca9d63ec913473a9b422bf17672762d9378a5ff84079436db6f6d6d24316a5cb6606282d15a7967e719d9d2ef53394f6f8b4d7c95234f59420c4238fa0f7349a9264593852b700e433d0dcb380e1c67c14949a1213ee9aa0cc2fe288e6204aa0008ab8da3ada2c2544309dd994f044a53f92ac503488fb801c7b32b6bff2f6557e97034b6fb1d39a41d81505b5163c7e5e8d271f28c7f5a9dff8b604fec56b3d54fc6c8bbc69f28b5f755ba9cb267d1ed0f9098f556525bda2207a2df2dbf6b3c24fee7d01f4562ede6e8b67515d193338cec88be2f8f91dbe2ad73681da25fd8dcd2aa3be12501ea193de6af67618ef29e352beec7182c2c201d3a03cef084f46300a0258d2fb54fe770a353f5d60fe72d17356c7d1e7a7be6d7d6d8ed0010ca378fac2a93204f9b4e3f32c8a65c1cbc4401df6903f7e657850b21f327ba591e7eecb56e82bd2d1471692b0204f7d5eb75a6a8d5dfd445d462bab3b4c2618449644840120edd995fdd51979ac723bf3d8a5fda11844d1a24bce31603ed25ea5ae6b80814d60468598dbd35ff3c69d1092b0da3ae81003ef58ffb0d0fb0247f6044107cd59236138b2b0db2dc8368bdb7f95991184319a4a0640439f75034e339d603162161c5455aa5396e414a792fc3288ba2135346896e8bac9831571a7b8ea7a871878f7a8768eb1a858ebed908b32e1f465e84cd2c10a3fb8f56cfe8e1276c991900cb8e7755432c6657646f0c2628cbd9bc404cefbaa4b471943b26f5877883dce6a1b26db5c8bde1bad70bce0cddef63ec0d1e04248d93db35faf3abdceddab11a72f4c0ebcb131de556749190467d9d2f7400ee90426702bb8b54e08ee9305008a91bdb21373956bfe3a557cbfeee50607f56da3201a97044ac94f4f87ddf5430cd9b590d6c281cf5e157185f56fb51a54b73cefa78f9e90392f5704e943ae0da3c7407cd248e5ec11122e675bd5c0af907c2227215512c33ae4fbca046bc52cb8bd3e870a30e8b4fc9c2f2cf3772634a506bb5bbc6907ce9bac1467081cbd860d6d0d6358533181d7e9e68cc184b93108e881ff8111390ed69fa1dd33b5224e308ef78ac446dbd5c5dbf57abac28d77ad86c2ec64f9e49e72f0c1fc81ae1234fe5654b54d1bce9d502f2a8e6d5e211abc88b87452695c1255be466f043a8ff24e1b572b342695a195b15d78263f43e64c04f7f01d003b948f70c10901c1877dcdeb2bd09b5758fda6f087fe773267648fd1632d2c5b51d56a4a85bd1307dbc38e1c597fa91acdd1fb75c5a58155af96a883977c6fed3ff28588e535d0990cb77790af52380a516045ca977ec32645e14be60a16402d6775baea66632262fbe40bd2eddbf5bec7a9e63564c95f726f356923e9db22d248602bf7f2a353d35c43831d5c89037772aeb7106e0fd726b1c430a961f9c0a65daf7284f1ea0dd14de07cd792ff8d3e46976c33c7aa083d36b15352f1012c8aabc6a5d6c385ae946a562aba578063733a8819b373341abddd5e6bb59b14ea32d1e83ad29a6c62974cb1ffe7109f9fa69926d4446ce5ef42765355c76b6dcfb53a5a473c85ed1e566923c9cd3fa6acadea0766a861334c461c5f674c3d2a4f4157ccb04a9002d74b2c347030e242b60d82300000000000000002a5b31040000000089cda86dfe48024a04830b75734c7281466cfce99ade60a534e0264f4e181668d83b7ae1e73234401d7d967b4a47b65eeca0752a1226370878944980ca7514a29634ecc08d3be96220378314de46e40867dd46ac76f7297522a0bcb9769ff7c200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e858b9cadfbec202b50ec4250d377e0e34cb3a14072adb033ba1c30390ff1a4eac9a416365cb69e84682e77bd196927bc99380bda31befaa18776055f8db9fbf1088810b92d2477bf81dcd9ec0e790261986fc69d7f89938f010a98848b5dc358d9d197ee4bff62affad19afc5f930bb74633e8a16a8152d55ba8fc253142ff60320b74c3b8b28d36acd5dedc15f8eed3888d5385a58dbf7f8d0c4ca7d43881a22031b59b6b3545f5af838870c629e9e6eec82321e04478aa34c0e3e98fe09938e250a058444afc324d8c9bea588402e62df1c96e051f3ab37a33d3d651b40d1c81c669b983c0c95c529ec548b0b312f93b2f945a7ca2cb3e45fb005724f197edf1ac1032fbf689cc17b66ab502d264a235fc09854997a62405eb405647f0adf14225e8403166bd70c3eea845d58b3d40aad135878eff2f2f9b959a43f53447c0a4aa26d790226f8c9bdcebc608a6316a7aa30c3d155e48fedcd2ce7a6db51bb537cf4b66e040201e3ae5a09763bc266892939fb488d915e45c3c0f6e3e1424a2ab1094927cfdc0329a333dd5400afeeb416501bac7819621c2cc59a9b2d13e9d6ff472481c6981884a562509623f6a79745266dc28c93657058edf535fe38077a5e265ffab5c7433000ce6d241a97d3747647982e078dc079ff498c8310ce1839da96dfe9e384af13fc0dffeb9dd04cc8845bece7809d7a81e3aa3a725f584403ab88a5208f71ca97d32707e9de16cc454da9f52ac75f6d24976353fa11fa9bad2599a83816e29c1cb0923efc0b94ed97976a912d2ca4d5ee9ba873b07fe2faa0496abb08acd00670d2108a213086a03548c08276ec8a8f92e7626783218d516f875ed922009aa857c1c92c51f2d4e3389baca6e15037bebb275a511bd07354bb49edffc8d6c37b65e0bde122315b8fb4eab15aa8f8056f8f411ae9e9b9059615eeb8655d5e72b02441473a8239b4d2d41dd418a509291507542dc28e32d075ea8cb8b28efdcd0c670c65c53d57c46792da06c744a1549675d3029e9be72891c9311fb3652efc741ebc31862ade8c066da6e4a8df5c76c510974fbae8edf240755deca900c59a08eb44bae58ce37eabe8ff2191aa2cb068916ed36005ffa2091252c75f9a02354d7597b4c88878f056393306fda7d240f33d6e955ea7965ca4d07cb815e1797d8a7e04424c5f57fca3396b86019a585179143b1ac95d9187ad7c1bf0b205781582f8e33691c92143b9cc2183f5fe2d6946d37bd741fbf47b11fb43864fe5811262bbcb59ab8631b7079b470d81e16a4d48942f6c3ae29c9ab106f9a3748898350c341022339d3c924fe4a9a5910e818f31b070bff9e626d45cccbbbf2a712910c293d15a4ee412155c9071c47e2b6d2878b08a21980c1c246e7967202744ec9af13ec8eb26bea8699621e33de04988a7881f6c6edf1ee441f90907037286ea213d8ce8c8ab59e6e4ad084c803941e84c2d4becf16a0ce07998ed71c24c2bc1c4d654e1d53b3c5bc21ac8848f5fa1b45c64f3855e4fe832f2ba65661c841994b6d6a8c351f1e94eb351e799eb143892e074210031914fc7230fb7f97115d484d56792da5e8a0310173469436a8798f18e99cb33a291c7ae37c775fb71f2431a9dff90b8f8a662bdd943b919d6ff3832d33bab87840f128875c2e976eb94964ddec6b5897847cc9999fff5c8858c175b6fc8585e78f0eb99d00d3053c9b9efc0c9ffb3f47cff2242b4756c4c273bca9ba86f681afb706944e69cd8373cba2db79f1b730c721626a2b116a928ff0cbe7f1bf9c6c9882771d2ea7f45da34575366b4a00b1d72643b4a5aeaf1a4f15422542c0cffc18759cdea43a72a84800325b856c4a720510b29dd441a1250492dd64623c256ed8e31a21157e73130b3448e79607c7cff398a19ed5cf744acfdb98b4a66254ae9b6579b33270239b78db519e524b87f52a44d0a344b1aa46a0982218ad56f27346ebc2a489064b4a71fc6105a5a5cf6099937416ab07d3d88a3afa544f163b8555321256b0b048b0386a626ed9c38f0c4e5debc423e6b1eb4cf44850a547ca91f1cf26a622a4a9be1edd181a7ca2421e99ee5addc7e22bcea9be9733a80084ae0015f769e686d903bb4b7e8cf5055240efcc7d62f6226beb0774b661fe81f6001f1c4b41f3f0bed8ae4491dbf6dc92714ef4a8ee9e6580dd54fad9bdcba68b4251eddf63ecea2e321cd47c1e7c400d3bb09d58cb674f39d42300452d8b6057c83b3593884f09303d47fa691dd82f03129224cc9096ebe73ea261ddeee7ad8d0c904112204000000000000000000000000b63566ff8930053e0102f55ba882546352122741d1f327c83a87a1a820bd78eb255e960c4087d90d634f594009e3e08fa64e2988d7bbbae5ba409127ee6048c65b77b5817478da6f6c9b6bfc47986e02cae38a819230b82f0cf641ffff15b36000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7cc45bfca425f166722f5214669d51a0465b84131d1dbb72a92d49d32d8c9d9eaa7a76f48626f684666fc248428a89abd52dcf2d6caf212f8f09f110d08aadeb5429e2f54e9d4b91fadeb802f51d1fa1f2ad74fda43ed88226d0eee2a1c17b24f5936adb2a49845c23f22cce5c3edb3c683d729db39c6cc82107d4650b1ce2e032ca29f12186d262bffea24160f7601c92bcf8616c4fc591253b4a6167facbeb8022c9b41b83ed901e74e0dacc753eb86497470dd18298eff7a1da0022157cc92250b07d415f64baba2555371fc3efb08c1a628a2bda85b7bf09f65cd7acf253e133d3ba4d613ab402e68ff287d1f7d40407998c0bf025abf8cd597c76ace324b24f00307e0845c3ebe3b3c337c85606b9af2befe0a99fd537f45ed7ce9371145aa2aba020258f300e6ab24937ca1118861916e0e9720c1fbe39869bfaf1daf329a3b70f3030574c9f16700e64d13c530635f39caa84db972bba2aa12fc31c9caedcb72b08c02173d0873e30184efc6fc8742b2b75bfb671260379f10a0db2a532b285bad9c0c030a6bf01b392b23add4502cd664e4c0e3cfa1c77fa9790889be9142dc7b08910bb69fc9ec121af84cffa4ae77fbad9ee272d41f92df7e7f3e4f1a49cb21260c3df5bb95d052f7ecedf4527d815ad9eca005eac39ed56ac0a370de72403ad44f5b0295a94d9bfc9ebe70b78cf492c21c79cf937d18b526f839f686eca61c2757b3fe26725095533a01e644c35fe5da3368a7b8c6fec0233386c650e240e7a647b372a222e932f73e312d5715373f0b1a4532c43e9ee4e62638edeade80e9050aa31df69078110dc4a295282a6975fddee9bc9d8149d35c317eafbf430edce4429dceedba528317e02083053e0b1f01416f4185222eb990bb04cbc5229b2d0bf0dc53455201a7b2a77c3cb7ae0a1ade27aeec322f54e1a94cb7430940581bdac0d8dba579e0e2ca450be0d3943d90f8400173f9104a46c242e9d99031538712970aea69e8de5131eba9fc14204ca2b518ea6b6e59846d524619aca2bffaffead2ed9e614ef38b128dce6eae9165a8ad0fed632c849f54a01e445cb5a81020203959e16773b3112068c446383c02b46ef4b3929c4761616300170756d622bf734cb80616b7d8e4f6da3f48a9b0c1b03d331e4e53a24aca78681e00ac477238c9d0846e852f98b56c315c731e0f30479ac68e2abb99def3bf427ce336714cf61696d232e850ea40016c077a83b791217a675af049ccad68e345ac97a4b80a52bdef338ffdd6b2a67423de853b3bd03bf523ee9a96e82c24f14812495bc332fa951edf32ee9c2b35eeb7b9a9ce25ae56aa30efc8a622b3f2dd09dd9ce778c252e1dc369eefce2d1198d9bd4ac7b4d10297841d8d6d94068a65039599180ed9bacb9ea3a65cc37b2c888d4d4a70fbc620aa47eeb8829e4259a985f307050e8555654be6ba87c8e3503572583ca3b3bc8e21129733828db955e8d2a9f2c1ca48e9e07771e03b827cb80544df597fe7fee572402666c42d5d230bc36fbee6cc465050fe7bdcfbb4a07c331c561fad5739154a070418bee42e00ce2efd6895dea0b43de6a6986a13dfbd8d54348a34f35871ff18fb44386c41a020e90d8c9c2b115b00b47f902f39c3e584f634aa4da24ed66b345dbc7d50f23831fb6ead93f9f07986a072f6dfcdac6abbf69a3ea4820be4846ceded68a14d5691dfaac1ca59227fd51272bcff727aa7fc96d19891894b8bdfb3f1864c39126fd203f81f8b2a21839f2cada3fed5f93ec681984155ee97d0bb2ad3dac8887af890efa99b9afcf5e8a2f7422aa226bb3cafb7ebe8d2c33ebec0a131404a6d1461c4dca2a0220a88e10a3ce9ae06c724b22cbbe65a7df5bb797e4e1dd04e51d65baaa997366e4a47efbfd57a280a91d20ea3dedbe378eefa475797b5a1c525f63c901ea048c014e4356404a3b99db4c4a26f57034d6e19eeb6fedc54df62ae42c1e94b3f0d56fa70b7d1413958bf4c861d2385dcc6c2f0c8e6ddcfe83734f1e4604830fa0330c0f068104c29ab176a0dea1caf8243baca4a037da8df68380fc8b7759b544063f6e94b14a49bf4327e118c4660725ec4a223ff48f7f562bd17da454ded81ca2530d947ae766759b17d7c298ad897d11f8967925b567ddecac0f1ab1bfbd5fc87737d686e622dcf5c784520d7bce620ffcc2060d7f70d5e80111fafc0f05653a045ba484634ca86338da7f77588d9066a622fef5f5c0644e18e17f700bd3247ad6240e477659bd5841734d54b69928b336f7db6cdea4ad33fec8e76c015eb45a053986c8a544800fc19bcd8291ffafb4b0f71a83ed875492ddeb5552fbd7714d44416166b47c16533a3a16710d97c686fcb1a9eb57702bc5159698f6c1ff9e6d92be5b8ef5bfce18d67edb2d1f0df40801247cd0830965204", "0051ac51516a5351", 1, -140398311, "50d36a402c3c7af871d4810e00b1d3c816811f2e15a3a8d7d988f74a31519a0c"], - ["404de92a04c744e9918621da4b4e58747773019c392e0e6ed00038e2ac190546f52c930b0f01000000096553516565ac536565ffffffffb888b4a408469de92e7e6523d6c7c818b9e02aee354964439df64d69dfcd1c2e0200000006655152510053ffffffff9a305f7c549daf8d0563bcab0db77394e3895d9c1c2c2d5903471f58823916db00000000085251ac6a51516aacffffffff1e64e835c396ed7cdc2e9619061671bdd65b3feaad90eef5eaed3fa087ce57cb020000000465ac65537e5aa2c704921ad7020000000006635153656a6a645aa305000000000363535204c6ea0300000000025200efe02102000000000465ac656547c86cb203ea37b005000000000000000000000000f1f6d703a43df582336f6b2e8691a57f1a1f2d4fdf7d0c98409beebb92e2960ea80d21c14bd3833d1bc9568697b9719e4c4467425ac793f876085c6fd73c057dfbedd7f69b742efd24ad0dc8e7cf07901a40ef770a004781ccc010a9c0cf088100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000675cbc362fc2b1e87121e77c32e5ad96b309bd1d2d82f456690b00fbca1543c1655f4ca0583b81245af634c3f3e783a22f546be24027ce02d54ea3d7a04013491273970b63d25b336f694a33bd12fa804c86fa95ec14493055f83cca4552cac7ec56b3c861b9518004fde55a068e846d50615ac3412816b4a0366d25b7ac8cc60311547e22dac62a8b893051404aa93d0640e630584220dbce14341b3a60f0fb670327b742a04fdd97b567da1220a18915c67c33b247baa7a08da45b6c689b6b6c480b02ed90ebc7b7575abaa49c8c41a83ce7ddb1701dd3bb82c50d8a19b7601411ef52c5842ddbf6540d3300da7ec0f0a3f880c3c700fa7bae18fcf6c87c1ca6e64f0324a7f3017930eefda75779624b0307df41855cf895b41617f0de41619e0168b8022a51b89ab76e30b0f4686a66d64bfcbcdbd3b10c14c1e8698d3c575143cef7ed020e7b03e8b0c357379f9ec094a05ec8e66b185140357afe1e783ba7fcf7707a02020b2d334e283e3551200c939e9d3e9bbc1423f7d36c51798174ddb0840a60873a033035c2d7a549443750e9c9daab2c0eb307825e100ed37100d9b702da6b9eb6bddaf30389bc9689b7bc87fd1376f7b1c6f32377813698bdc27ab8b5b8b4d80157212926f30ec84f2d6a984d09324803aa41263b325454817ced74caec5c1f02b0bc123f76ab4a10f82d3d466ad8693f6503a899d1665a113409ab19626b7f8146a9338aa0caf441c0b1db24543a519e24172fef630040900886c54d1fcbefac994bd13a8ce2392b580554e1c8b918596c4e611ed2166375ffbfe4539bd5ea07865c9867a106e7765c4436da6215fe5145a2653cb8ad617e8b8687f647ea556d0de56e8e8ebc1cd7c2f350b249131fbd6defede77c6ab9323753d1a817615722fdec48a6fef3062b96660dcf86bdc08f09e616ad80495bdb9a6cab29b942e6c5cc5a801136308ece5f0305301a77e10c9390828ec739408c8c5dd7b325169523649c70af1a2746dcec7e93b6a5a9b739de1e7ee5d900a8ecc00c1f338fe4ba231f677c73c256b79bb759fc1c8eb9749b8ca372b8ae97c133bf83b8f42f4062ad3dd6fa176a9ca8a1326008409028120908f1f3f9a38e40f4b9d47dce945688af8fc2cbabca0d02d0c3cf74014e949a4b79880bcca506dc8139bec2c3b89185e8dd26f334ec32791a0a27e0bb457f72b88ae72b2178231e6a2afe1aeeeac3c63f6f2eb5437d18bb2365632831df2168fc805cf82812cd339a5b84cf78d50c35cedebffdf68b7663176d15082dc10ff3871718ff9b9cc4b1857511b6a3dca2f22a87ee1bc2a858efbea3b0fdc6b7ac6090c852bc9c55e809c875198446c3932db21d20475d9e9adb96a757f3bf1f9cc34105fa94ae105747b235643c8edc006d1ae61bd249a1d16c0171bd51885cea877b334802a7804094ce6fdf84382426341e10de80c1a6c1c40e6a913a000cb2b007135085a2f41474d267d4d24f37730a3c15bee9c66f41e4a73e451c168740ff4502a8635417134f7d0c091a3efe6d85637c80b90a2fbe64c2b980cea25ff1d309d21f6d2582e0a7318eeb02d6e3d0b84add53337ae01436096139776ed0c4cb35270de4770d0ee11dea91396f2c4089456327249b673af45c083be9e29b3ed0c4ea7e1fccfabe6114569ff17830d83849275db99016060e09978274077ed8d15be2c7e189a351bd602e97cca255d052ce470c59e616af2bc69e87675850ffe9ca5ddf013fc761a73740b6f81c40eb11062f8bbfa1961a12d2c29a35172da8233dc42bad489360bb47847e4c807dd1cacbbcd588b7380a0197450836e78297dc382bdb52e7dfa3737a853dd00ebf25d4f680a47b8ccf0b69363cc6d27bc9e9e5196f88cd5cbc9fbb4754727aef7da432b80903f356af9a26eefb63ae2a70ac5318c8b9432741e7ac39b29dc45af9fc429a939399afad41fef31757e280546b218b375ee09feab230e005e3c0fc4b55cd41adecfd00bdab573b90210a91ce564556a1bee54e555fe78e6232cc2a62ade4312b483adcd4a59bf3b8ad7a9142f97969d4e965e9a43b92f24d7e253a53143ea3eb9b760af822421c70bafa6e3ac92336808cfaca47d0aeef1164178c90bc663d1ca0a86a461d433a529dab52a2ebaef72dbdc8d0f6030259ee043af3bbd3effbcf0611dad06a3ca305855ca136a57c7abeb42a2583901de5c24d0b9e71b4191794e6d83f2ccfdc666539761f8bf10833326af689b93921d743356814c38a6ec0e42c132b56fd53216033b257895d573691dcd8000000000000000016aa800200000000726bcf30343901ee8a8502eeb3c0ac9817f5a432cc99da8df0a3e6fae4b91ee41433f7cbf9ce815bd4e3b18f652202e95d89e87a7a9f45f28a246db82b02a2e3b58446d2b74eaa16c543373c5f29d9a25e61feaa092cecf9506b428f3707d58300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d9494b89cb8f393790ef6e67ead35d26f60d50f357aee8c73cb919d633adc9f9f37ffbeb37e5d4f21b83b6e76b855381ac9d8ae2e59c397b3cd75049c137a9da39883a510c6c43efcf404bffb1135bad6028792867a901e28f30f9e77b87f41046657aa008c5d9b691d9246389ed8bee8f702394d11d9aef17bd245e1a73509f022c326893965389b1fc88230819998f1657736f26bd0bec379b256365a24026f20320c2200254575088364fc2102336579ee437bcfb6975e967a6de5259e37291da0b0424da46b708f3896ce8a824078134945be13292f51ff0457988ba991ff26a4d01af9cf4fb0d00327390d8114772f4e86be59d166510f9ff36544adc7b186387031bc9884464d0b3d191401555182ad3ac157166bde49d58bb82ad3e00d6165d1f032d77b26c8564ab7c57e968bd343292ffb43bb1b860b02addf09923d92cc662d50229720d9eb6a2b52aaa40fecba9199e44490c14e84398ce9d440179edd158a42b0305a499cfa9739aa00902cdf1d8ea7333b6bffd169ab183761a34a087d75615210310b95249b37077a3337f87229fb30864883d08c15088f08f96850c41f9f46a288d4de1c532be20cb0b11be4ef7cabe1bae0f9587cba2175b4534a08b5cd1a9aae1d80ee033822b676ca05b088eedd2693986a5422e292243557d5208648122f97494490df17443eed10b9e5534d74e5799a736906db73f17e1f2d9d6aace94b1c6acf739ce4c5741e8389586cc8fe93c631785d21906cdce73704dee2aead38c6a73581e2d3bbf1e01407c69b88db0c3ab7fbae9969fa25c0d41d0a9f6354f981dda93c56b8849850495a91a7514f71af4b3b8e095add831e448df81678087816ca9f19b0c515f110ba2f538b973c8be4901c0fbc824d8b174f8b263ffd14a52eef24b6a0ff6627ff1ab69ca79d65c274d4dc0ba7e7a17c93fadad848a8d2da873d40b0d978c572681b262a789130b22e644be43e142b7e8ccd48f8c1022d3c418a14f76bb8f25853c051743051ce7bc53ed736729271e15a299a6bdf362f35b683f20bff00fc4f7590e2b2929b5d100a697a05d892d2d52741ddcc396a1e5e0be3811eaa5b68d2e98e129fbde374956f8047c63ba7f96de520fb483379cbb69552285e0d7790ecae38af553afaea44513d5ef9012967088d97b8f6307d4f360c45ca767fe5189f189929d7f06c569ff9ab437800e6af666b0d0c243048816c311b4eb89a80e9b276f627a8b652cac2395539a0a6196c077cde9d8597dff71384cf7a52806787c819c3eeb395baaee571ca1e7905131c997832ff29e16f9fda91b60bcffa850e27d2d83b6272e4511755a7a50ea8dfb3d33e6ba4d3785fe34b524132a033bdbc518f4aa5fd306b243d276b9ecec1319e6435c31f775d463e9b4260d24c95ec85edde5e482e021a9ca075e3e0f5f9a785ce9822701ef5c9db32dd6bc8fc7fb3c0a2050b9d536873967b2ac5da39d0d433ccadefb01d1839710c3f426df2ca829b5ab83f9a900bc65125aa56636561f1862cb98567059b7d4c3ff9ec62171ba0652ca7a91d86792690370841884531dd51bbdcff3d02a6c88bcfb1999c640d62b2820fc18b34c6c6171f831c15b164e7d71e9ba0c988a3ec46587cee3d333f87c8b9343dcbf33aef65ea87d83cf350c92b07a8939ae1a9a143b62de9166b3c536f8560c177c9345570973df7f266520598cf64278d59e57e77e2f70aa64b1545ccdddc9979683785a1c8fbe7b1158818dacbe281137907884119aa4f39c8971e7495f77a501427ee4b67702ae776fbf166ffd9ac2e2740e2d8aea17860dde8771fad4969444b4844b745170f7ba84c1d67290b3360f0cb8ae13dd20d1c27035537257b15148856346f7dfabe2df17deeb7d6b4edf170d55c1620e553e1002e97b300932b147baf292e0b3f4009f147b214ccf560d457710296f544fdacb857ec4bf27b2ec9284af20b7bf0fe4c284e4ecbc209aa724e9b6008a2e35bf07c99369a0597f9869fe89a4829792db67fd879ec0f8b80d1e9fa37988e5e7f371a496a00fa9e9268c8cb3cfa412b32666691144898bb71ab85cd161956c6ca3d53322ed3931969d8e698a7bb8b83ffaf61cd5f858d66a31c9c05cb864345c8b24da775e87bc821f74352a32baffdb60a7ba9d1ce9fdfe68bba8036331b917e5a9d05750daee374ebf4fbffa405cf011448f67220eb778dbe34297e88dcd4b30335155c0c5dd0773e5f7871f1b6afff7126a7ff60884aeaea726d3969efb8df029244a4715170a53f5a51fcaf2d1f52f7e55fe04000000000000000000000000d9d16c0f42fa0ca44a548aed3b2820a10946caacc3fd707f817d429a6630152bfaf372aa0262e9fd6018ee274ec15213efddd1958859380c674f22299804c49a011d39bf5e67892c6087722c5a08f968e7221f480a673b4090bab054e776fe6b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1e105ac5aefc76cd8eb7a6613818f01ace57ec3d0b922afb9f9bd12420444e5048528fb22e8046b9e656fbb2cd981b41c5944d633205c26ed916861c87bcec7feb4c63831f191ed1a9ff6bd0169dfe0b0f29b3515d82d3b87f649062152d42e97879f9f9ac7a225284303247aa2e0b8c69a9509c9a7f824f3a1b812ef18410a0204c03149baa5bb9eeb59b47432616570ed30823230978573827904d986d07a13020ba49017045c5542c5561f6078b6a83fca7441dd2db8ac4374a82c187ce7ee760a046779417c83f20f0c25c7fbcc4563c2cacd52e6c47bcafdf5a6f67bc71204c7f93bae66ecbdc329c829148b23cbdec3f18007d3a15d1cc2d9dcba4939b8e0ce02172749a7ede2888394a9cf1b5c339b61f31d808ecab93af6e9661ef133772777031dd30d888aabe629bdc6e840f799f5c9cdaaa2f0d80032f656bc1e55026a1639031c272d87436586c661a0abcf688df1e2fc1fc67ecb458d8bf75d2c31ae9d60bb0226eadd62f6ead8a2ae3a53f416ebac76fbcb3b43dce6073d934a9db911b4b7c9032ae2287304274e9f6fce523a252ad7dfd34cc9da092b209970c830aa3a1573be5e282b43d4dbfa939c27f26b752eedc7239d2af6090f6a7d9748440286ff6dfadb076067ebf94365e9b9537ce359054e2968b79336e88346c061c668344fd46b07bc9dfee5ba96692e1c086c3811a89251e7eb1647250a3e7cf5a705c19b9d8025b034fdac099d1096a4ce659b0c8b8962ead13168d5ae7114ea74f7e6b83886fd97b87e125aff4dfce20bacb72738cc345136e1efe829a610b7cab602d5f77ac76b329cb9f5ea57b0c5996903211e4bdb259678eb566dc2fcab636337e3ecd91eb3a6444cb7c851ac2f968bf9d296e7cfc0519960a90efe1aff45794da70f36ac59b559ee2de0cbb48e280e5e9ba2a435a39b2176d09c82d058e0d9d444a6c3a1f1a04292b42cb62616947b891998f210b4c2f0379618aa6e5e29ca47c5900b500af92a4fd3f1beb7b94f1fff67cb9c7b8a308c9c6b8f01370f49617bf763576714163cce3bd1bc3922c078cf93d5319be5d1f6c7d2713d4dd4e18db0fd9375130c76f7b61afbd3d23d116b3314869e4be537baeedcc2e9d137314fd0329f9f0ca6a9b73e47397b997a24d966cbe26c2c1b201c0117167975b939fe57c4a62971f069e58da277c246a7184b6136f303d8f4bb6e43bb9cb3cf82437ce44f016c448b84b10b61c6cac432917fb0e4b361ee882f187dd867ae5ad5047ecd96d4f4ee6da23066660602d1016fe9cc84d7f31b2dbfb1d5e5766ced5d3545cb8021a627d3392182bc5984089d4a2d234e9e8475d8ca29698568722bac5a7911f98e43d1a0e59cf726fd4dc20ccdd87c3fc652e21803edbcc41566c0006d47b918ac82a5c4505fe5fd9c929d65230500298d2065ec57543eb2dd0ed954c6637c391795fb685275e0f96b6ee0a554b67e67daf39a94da7f7745f0a359d2b6c242b8cab8ddf564b1de3dc7588a809edfa102821ff7601acbacc3b30594ac7ba234f1fe3e42c8e5fea55d97aa20abf4951fe151849203a015e374ba6702d39669e0ac202ff616db59df94a36261fab7285bc9cf0fe99779c57f1e2e7392c91d35c508a68003c1321f56867503348bb5e508ed8af68a7bad395ada5647fc82405ef5103ba7dd608aa6b084a38cb4df223ca3ac3b2f2a8ae98a09858bb3ac75c6308940b8a295b51a8cea099a78cc6fedc1c2b141aef4a381a9fb09f64bac839867c1d413b4f35549876a3ef86328b775f483d7e42ae8d298d3d2de535c1187ff9f9e3b2e7f901493af5232840f5136cdd29113c345e90c9bd8af2222d3a49cf4fc1bcece26f0fcf8dbdfcceceb4ff1d996f4ef611f9f6fdcdc44e1080ed8dafdd7e23b05d4a7f9e082af565b7e86b9ea6ed291c284124ea50191898066269c3cb9a524afdfe47e95fa8c58d014d0904da975409aa2d0a88a2616866bbf528a301d53eb3b46b58d741713943e9993e17cc6f179dc84c0e0a9bfa68900216e48c5cadd35213339e3c5678263256fd692867d96b86f0852f9691719ed7e04f77b5627bde4467e9da3b93beadb8c070203ba4a08ccebdca1a80134d5329f201a8803422759af10a8e3f81aafcb061be20290d33f97a31b92a38702f1b2e6dbaeae07d35aff5e3f2e7683dcc07e40f4054e3e0b73d8e051a50e257f1c6d68d83c3f3f3073be900ef058a62cfbafa5808e1c2eb376aadc9e8b32f8dced0ebc982be7852a560ab0cb41e5cb808ebc92c36626d7f8b53a905949dae6292f54160528d38a7b0439579a5556d4ecb854cea3d9342b1e33918fc4e59a0858507580f89019869749ee876fb1ea8213d41aef0c769abfc48c5b3024bc6c94308c3d024afe5712131b1b960f57daf6af4cdebe10efb4ddf29d05ae81b70d", "656a526a00ac", 2, -1305210345, "2b399838a055523b65693cbcaa5be43a76fbfe9e2c813de35adf123e2d03f380"], - ["f2fd615b034bcc0fb845a4bc26219771aa36397252eba1006fcb604cd7a0fe6f322d30232800000000095100516552515251655def7602542b2da813831c51279e8b722ab1f9e9183ca9ab3a03827c2b619a51f9e701b70300000003635352ebc577befc0b4e2d050939d0daa303ab801a7bd1817634316dcbc011850c9e1a52dc2dc7000000000153ffffffff04a144680400000000085363650053630051d7d5500100000000076a65536a655263b5f4ae020000000005535300ac51904cf900000000000152f9ba72be030000000000000000fe90a105000000000e643c42872b950443e139b406f45b5a5741b007a49e68e3a38af2eba39a8a3353571547044a8775fa070b754f69f18cf0e2dec17dab486f27d12d4a5ea1d09c3a6614cc11aaaa67a10f14b699f508f3727f88d887c1cd25531d22adde88b6a10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000068c449bc0882546f4708738e7f5ea7afa2cf0744a2b3298619eff033da6ea274ab04f996a4ffcff02eded6e452ad5a0e2eda68ed27434f4a26a8dcc9715a782abac408f3575ef6d388f21bd93352c8662d2109aa44ba7fae7f10a7eeca6d48adc2b619d75b5226200af265e932efcef8e77f4f64f2cc33fa891e91fc9da0317103008a1b63e07336f31a0bbf74f8653d813a7be35e734ebbb25669f246fab02286032a1cd1b4bd1adcf3ad0c0cbddaa04ca14aae594681129b5e21f60e3e136edc500a01601845f94d6b796f2f30d9955645c4eafd4a1e13c89e920e9ddd8156950ace85d15b4ccffffe984d90882cde09647c771bf7fbd5494ee20e9a49fa5f4dc36b022453d6c704ae2ac337e71481aae006b6c45b63daf8cc34deb009c20ef137935f032f62d4b7049495bdae252237c6e57b98a0cee1c18315c561dc7d7e429bde22b8022be02541d48e501f3ece4a631306f2352330eec8f0f00933aa55616db83ae4a303047bcc057fc86d570a1d8f55f03edd885e94720784b8b3bd09e3a0a756b16c59030236cd52ec8344418d32d35e89feb24b5afbb7eda5bfffb12a26a782c446224a5abfdb2525796a52bb2f453c37ec2f1396eca7049b0f2db8ab89c694ae5d538755093f1622ba4822c914d6c50088d84528ce554279e2e911b0d646acb125b83afc8af90ea62e9f2f02dbc5ec58d4cb189d3cc3ed31ceba6a9c1d5a19e837fdc6ef800f6359840854dc72d4d67baa7e29b00cf30417714ff4554dd1a867ada6a2e0770dbdf8e2ff51ae6a6c4f90c51354f49451d00a9804d88884202c2a11836c75ff8124dbbb4708669cdc4cd0368174588eb9bc62fda520312356f509c2a78991272ebb85d2190c4fddbfba620efeea93e26d4338d309bdbc56e91106bc7bf3369d1e91b9d3e65b5d96d750f344621c6dc1460a7d4263424d0dfef1bfdbcfd153a2ad359d9162528588cee497d86d29e790ab8269fb18802ad294025d68a3789c46c59585ba806cb19aa07ce75d688a98232d9bb3f67c59c7e4dd705685079103b108d1146e9b05ac694ec9f6e2ef5f0211a2e7aa5737cab87e233dfca9a762ee73556bc9d58e28d93ce8973c8cff94c88e985e1676c360e93af0a043bd0192684d87070bb2eda70e153d89b39287739703a9f0759031ab8b4f0a6901e8e3dc60170c6e32d116bd18c26e7bb834e69f29fcc36e31f195b34daf484fe584e0de5a7e3555a951b3920b856bd04bb183120026659ce0877c5e9f5f379be092c0ea4cb7a8df30150c7e2598874ac09d3351ddcf2b00d8199b916cb4074d9ad8579c2ead2c67c3c6ad05e6942eae27263ef87db7dcc1090c03e97955f38122beab42d893e7a9c575618d4ff83c05fbed7966e8d661226a515faf625a9bd279adec0e1dfde044fd54b7cf8f1f2943bb4014a11c43f6e0e88cef8a220c25e15824dbd6a514602cdde30dbb5ddf50096080c91c2fe5eca5d2629f298db7b49e06b4cc5ae58369f21f86df50e632e5fe0c30d7c364ebfd059b6d35415c5eb768185079656aab4ad4a28b76938d0b4f52f8b1ba0de3b3269bf59d8bc232b78b1cb997e1ffd6cb3eb2e7ef803656921cae9de3a1104cda6dd0f472fb96ad1ca5a583f6fd1f93926c1f336faf1ef87ad731568069223864194bd76a87c176846b906bfe7edd860b6d0e733078651cbc4e222abfb621cf5ca7dc3569ec36f692d6d57ed24e5dcd4bd6a35d3c1326b7c6eb0ab23675552b53270c21a0ea058cc04df5f165c3b92235a74da7d0fc6958cf884a18ec967e68ecea8a412e66fa53604f59124995a032114aa40775872a7d6c4bfe850901837a011d6d83d31fd4c532b53003d7fba740f7cbe6078c5746583989abe8218082161fcefbb33a99b26ba10f27377cd2a7379de0bee93e0f474a3589595c5cd12eeb31631930362868a7f20673fa0c7661cd247fba39e8cbe998f1c2fe9ccf0191e2cf92878b6b55aac2e2c17d27309972593408e80728044bc5c17fc2a38c8dd8694a05c292839be3e29034a699cba3160ff4639d15b5107271f14b0c41362c0adf93753f2eecc28d1d1d8fe00c1a1c0c7e8180607db6989fe8a9927e38f57d56794f0afc8c471bab6c1f1e111aacf326ca68e4621c7364baa4615128773301b35b40c93a4a14d1b984b5df215ce0e09cd9f30de6fccb44616dfab6a71338bd7bd966dad954e69bdb0293818c383384fff99d6cadcd69e55926f1dd86aa2e3211ffabc9f88359c98e9266609a0dd2e6455d4a5aa494d00192329d5620c97f50f49bf2000000000000000083fce00100000000423a11cb54464c65ce883a2ad8bb22d847f98949a2ad94fa968f6680d2e73a7e4f2cdc5a5491783c0510161a78a0bb92310a461e9267812c62bd3cf7af007b2dad92738231a381cc0751fbf758039aaab6d17b9a2cfe59253e119ebf79fbbd8600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fc4f285f7b83dd99960a9679f73b73a46b38c3f2096660a6fdd1681e7fe61fa1810f2b7ce973c4a95937f185857973c60a81aef245fd3c6133b1f302f40a0938a1b45a06f9c4c7b7726e92e9770247bc7b1e8fce6395ac2763321b7424a9d19ec120ee03a53ca582938c52b9bc675aa35eed67f1488dcf7a6747f165230bfa98032535cc5b6044db2942d45fa330d194df7a57bbeecbd59a7f94af978d8adf7bd103062305c2feff1b870158b910a44c047504f0cca6342c51c6045238c8593d1fa00b01e6e161e296a61f6494808d511ba1e4efc46b933534a7192bbeaf9e087cc2e5457c743924e0cf3380e72de4ada27a2a9a98ce0123fd461418ca235c024992130218a8235408a24dfc1a8b33610cb3bf08767589e52829ab7bf3ff4cdc9405322e0326ff0cd7ce71f1348a15c123597311825eff05769a48b667e1e2ff965468994e031bf122b4f5e019bceb9083a70ff57efb6f03ce10c1d8cce2b0476a6a03ace3b40229ed2c2f113e0db5f74f9ad0e25db330e609d0bf71aacbca53f49ab98f6fa4a2031f6cc7e9511dd798b05a6e348e074d62a75ee03001878bbb89d5eca204fd2a14eb8efdb112aa38b319db6c2ddd0e1ba232c4ab973c07b67827a95ada989098e42dde9cc69abbb7cedd2e1ed5986120d9374a12d334ff00786fc110068e910463e2a2241a918dde431947fcf894480c03ab447f48d972b7cea2408911a92f0c12de7ad5636746f6d11c0a7548fd7d80731bc02abb152ea76a1128aba2cd586ebc36776a7d708f08c0cfafce3dc93856e173a892994fdb9a783b587d869b0c17fb459e4b269ce76d85d00964def625f5e18b1c747d702c38d82ab2af9c2ac88e012ce182b9b10213ef4ff1832c916f7eb38f5e5f6229ff4a34f92c62392a49f0f2cfabe8ee666e14fc994dd74db3014e9fa0261810f11a6615a3fd5efa5ddf1893858c2a3bc69f874e462d7f3fb4f57fb186586b7a3c9234c15bf7275c0c8ea8c7654b094b09241aa0d51dc909ad18ac3393df9f785d78aa4071b2336a86c810302fec74d3c3614bd82eba649a49004914b505e885cb7c8655815786db23d78f64b29a74f9d72e7ded5a4a53813e9d0dd922b27f904f70e690294a19eb8c8ea8d2ace67af4230832ed5a63eff6fc3b7a3ec79d7969f514b241e9b2b3be5fd2a403a8e826dcb575ca1c11fb955853452e50a4cc30598e7e08e658a121f51f278146ee89fceaca04811985bfbd0ca107030f83978ce4f946f17a36fed6304bc2c5c722fec71b6b47c9c72440dd941d207d894472856f55d83be5fe20fddfb67417504d8966ac9d0bd80c3584a47c55e1cb35e4339c51b8ff55fc03ad1ea6baec278c43533d2e7ddd3862d6188abd6518ca28938b1dbb2c5cb87afd75b16e8d18375146da65dce057331f4104d6cd96f4a83d6fe0b3e393b930539628b7bcfca441071adbda4aa5f832275f885dab19a9e3d2fe639140f36e5628e3133c2c2113bebf7ce2d34e0b5a035b3bb2ef3eaa8f8b71d115a4fd3aba3cb67dfaf05e4f8b0099c60a081701b7fca5d18e9c834577eb11023936c0e254699b04d756dfb39a536f0a38c726bdb0304db19db2c4105d2b1aa2735b7973d7f69e30a70c704aeb8df546621199613f75a0cb3cc9ccf4c8040d83fa5b5609b3c302caa65c46a484206038a2d82ccf7868a62562c9fe53b5074d5dcaa36ef5f315089bf5e2a819df2b6cca5fdcc7983ce33936a7728242f872b8abe95ab4c595b901294279e402b2f3066ffc9a524f57dfa7582a3f2f5ad9e3c46d1cadff9def43de36c2d0f9535dd87c7e747aa6630cfa910095fc1f28aa927b65fdec04e3fbb1347a6c8fd70c0464d7354ca11fa213ec911f4b627d0ec038515b9c36434a0370fd5f63dced16da7e6ad9a86068b110fe7fe5f0973fb5446732f1f0d1c967e2b09773eb50aab633c98a5a3df259a0784eea92ca365a2d0fb417ad01d26470a147d9d191b5c62018a4a16cd96c86fb3d4c765b065e0dd06a964b639f916ac8020cc11fd076897291926a9509beb7f475157d01f1a36d71f31e9c4662497f1b193fc30edc98a6c33cf72d89b4feebd16043e2d16562c08dc93be2014ad680c77879b8384fae8bd3591117ec64a4c1dab7d27f5fc747281680f777ef1866931e36f9aefe89d2fd5a269a8c723736c0c2914d498eec01dd7cabd32c1f55610a5ab03d6ce5320ec47efea016341144083edc739c565be244cc0828cd07f068fabc9b9b80a02da9cfc84d67e87307d8f240afa280d967b437d3999b2ca2aa1f4a01030000000000000000000000004540604febfc712fb5597d1e68f0193b779d291463d8668185a244e7d3d312112f04a59a389611b4f15a59f221cb4d581b9224604fc4f5dfb7e7c58b31dd947018fbae59b2aaff7d3f9b12cb60c9447039f9e8274e3c49f6b37134ece505817b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb4bdbec3151324c6e042b2940afed76b66ced5f63705c0824fda4c2f10b1ee9a96e02704b1eea0e881b9f3021b08096bf49a95e92661ce4bf46502f2d7d4c8baa0019bb2cba0377cb5dd7bf69d63a67b7e9aabf0b830cf612ce8fcc9273ef74d2577d3d49c342e09c1c2fd1d998e6b1acbd4cd7021407e9b57bf454127bfb020306622ecb87aeb544717f3337a6aa01ec0a7e25996c14383519332c3eb5c518ad030e8d80d77e4b283dac2c42b8bf0112b037776193a8760936e3ffb31c2d10dcf20b02bf3402ef7a180cae59fba99fcf4e2a0dfc229d039e6c26c859ca790cf977f9eac9b409f694731fa3f2195b8ca8699777cee085058eb9ecb3117e0b9262e2f5021bdfbc4568d2329d2efca5bc7adae26465d58b130434433be8e68d372ca0a00502052e24d9fcba1e214082e74e666c5a224275bacee2ce5101e41c5e835fee7f6a022286cfa1ffe65f7d89b1678d65c0ce5a1155614ac5af9ac61b44ae1702a0505e0201f673772b522486f4eb827c33501593abd3ee967ed1bb0c231ee6d2d4c52eb702126a252375953d7106f188f6ce7a95bf0118a7681cd760e137d18d52d700fab704b8fe8526d594689bfef4af93d064080c997743754401d91e4748b8b1edaf1db1f6225332f1661e948c789cb6a637acd2111a5313fbbbb1301f8a5ad551e6e13bcda4219df9243386bde23dde51f315c4f36b25533adfbbf2c399832ad74ae759a3ae5c11cb4d6b09449a06cd755ac9f720f1f56eded75f2a1057ffff11a0a86572e4be98e39237cf07fa23deec1939ae26350258071484b521b4367473f730a8bc9f679b86bf3699a8a3ba9f9c2203aa2605f3c01dbebfad613acda3823c804b3aa161475f10b18c36d122dd1f89dfb2fc55a15ad898b21abae63d28acad5934b7ac6184a16922bd5d643bb543b88a8986d366433a86c53855d81d4417dbec067102adf7efb283ba535603fd1c206cd1ba45fb101bb578c9bc335baec6a169156f33129e637040e8675380f838d170a94b7596a8e44ad19ce54f4f1506b543f4ba43580b1e1c4224540d181b89e01273cc2d46ff8893bab48de4ad5ae0ce125b8826fe5d7a4605064341aee111ff2249ad0c6ae8ff13c4b139aaec148abfe6f6d0693e38011b1df0b87fce224187b0c79023fafabd17586e67a72ed19eef9ed0b20be2439a1c074c37043539ea11c2fe8baedb813cd79324a392a11c07c4aa6984e19997326c0c32e1a304d1d71584073cc13bf61e63712431b03cf214b1705ecf067225e3c6b72b4b0ec12fc3e4dd793fa91ef166c43c4231af84f4e80c02fbab1874a6266ac1065b23b3de0bc7b009de3f2d245942e2bd33d6df9f9934cea2f9dc35e782f7652ed8eba4c97e9dd620eed4337855d992985afe358e3f975464139e3941581d24ed14be373bdc383ef6ff6ca88140eec25a2a5b2cb584703abf86473e1623233ccd1584149aef2da12e959ce3df644fd9327017b8e0ad3866f0d15d53ba058a0a28545ec07b2f4082fce771c461382fa80f22bb0bcf1063bf0f1ba521c8aff9ec3c9d71bb98d7142f39ca3900aeb51818fd35e850b3512a62154a2f92cec58ae79ac5f67195df3372fced99883b037ebdcfef3891017e697e7ba47bec5df79d9777d8371326d6b18b14c4acc27fef8920761b47af1bab4b3fe522c5b3374af5873e03485bf1faf49d3b61c55f7513c1b9ed83612d3b50ca6bf896297485e2f5aebb92f2e94280dc825c47592d335ea924e67d7c89ccb3956c4060a128a29df2b038e1ab964c0e789471928431d124994d687901fc5612d58af069ccdf0c18a597e3e82afcc419c79ebee2c370565d2324d320b02f4fb93dd27f0363af3e8ea54c4d18c1daf58463c6125a5f6bda1ac502096e874023bc7c7005ac16978d3054ba310fa01f413384f67dd7cee37dbc87621a7bb764672cfb24123f65924540fb59986bbf363937a4e0e04c436e7083d17be8a18897d910027a766267713ca2c1ab79821577073b4c4f637126da0d56b5ab591c677c1daea5ad8b61a674d8882123ee2a360e1e97dbcc2f9148a8bab4c67fffcad418a1f282e4b90bedfd2efb9d6e331b8b505bcd2fe8023b5ea38957e8840e4a71fc9c95ef8983056a3ccb33a631b67cb26ce4831879d956e603a7cf4223a1f0950feeb466664f9d4e58ead89cf89c902ed158ce08853713aac023d28fb53b8635b762f37a12c11b20da17ad2febebe4bd3cdd6b0b7a66ef880fe2e6fbaed013352eb9f4fd53c426cae7be3a4fc18407bb5ada2254376168705400915b825fe65ae2271bc82d9763b3230ff9ab854a718f58e0f43447a963f31cadb95d2f3564a0f35d4272b9349d61fcf12c907b67e3b3f9ddc0ea4cd347844c4805a9ebedc8d6bd79d960ba7ac146086bda2586a966e7ff9248ea8f000f", "635265ac", 1, 1709422518, "011f714134a89f06e5851621a610ff8c795a07202828271054fb38ac01d822cc"], - ["030000807082c4030348e7f9c3ef1decc00d520b93b3eda46438e34f7b8e1b39bb598e766df239d6bd0100000001539ef85fae70467f6e105cec2f22b9d7ee7ba931ac632578a52888e5acd28ef8cd39141e14010000000963ac516a000063ac6ac45cf321f52e4f00d8763f4ef801b311d9d34396d3cc4af0f3f301c3adef4e26156f52810000000006516351ac0063ffffffff02d7682c00000000000751516a6a6551658c88220400000000016a000000000000000000", "51536a", 0, -1206006264, "02030e33468db45638fedc609909e45225dfd22d92063248466b44ee3bc698b6"], - ["37c3807b02fd7881c26d95d8a8271e31395fa17aabc5acec484a7648edfd438112155199f5010000000851656563536500527f14618418b90be188e8ae6afff4d6e6b51d5fb6c1a37af635db9daf74a150c372ef0a8a00000000020051a439815001e37f3f01000000000765635352530053a409d45800", "51ac525251", 0, 1218767852, "9cc088da6747554f5bcae07a2f6115081952fc32d6fe689d34f413048afaf1b0"], - ["030000807082c40301e57ed0b95cdadb62c14cccdc5d504a54416eeb050fdcc8178f5e99c37e8ee4b60300000003006a52f78b28b901d527eb010000000003006a6a000000000000000002000000000000000004b5cf05000000009a232de19ad262078d730267a5059162991bf192f071a3946e1944cc277c01bef3a015ed1ddeb0cd315226ca2636989f3bf6a59946054bc7e5930e9e7d25b3651b626c0522d172834449826ac706bfaa0eacebb6a1e249977164490fc2dc2ffd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000032879580647f02195aaabf31da0ab6dd2f6f87a9f00bc5e1e738ce2418b3bdfe8688bcc5b38b0cef97d1289e79d716f18ca5e19d5ddd101bb7a33b837b126caa5ceaee3e9b8cb1a31b5883b4b723e9e0f3da37e451e7f7abc1fe5433bf95749b831c901dec88de7560065f3bab88ec703e68d8f5bed2086a3c3d3f6e9fbc31560206c539f7aba5515e48482150ffe17d8d1cf367d0758c1e17a51e39e7928adf28020d0b48b485162992907290f17be1c6cd6ea6e418064c5432f73ad20a94aa55da0b0671968b4128555a7ca02ca13c5a48c2ee27eaf203b18124f0273011506a86605d7079136daa3063cbeb48ecbc8cf7dfe7caf4bf1c1c61627548ad6b2e84579d0220e3d04d4961e5512fc0054e92806e9861c59ca3a77de8a94be84384e5e7f7c60318f5dd322d14f9cc8df83aac599d67541923a832e72f5006c5c4859b5779b596020251f668762c3c4da5693281ea639e27e7f198096e04219c70e8282453f1335a022cdd13258f94cdb8cf9b3e8eda4866f21223303ce73885859a40da841d07d36b022cd780953dfe1e7c11e8c4dfae4435b045e98cd7b5cad6d558d79ee8466eb04b0cff697362853b39d82da807bbf936ff9f0c66723f8d2e351c5b7c9615d2c1ad2e0ead6c57e93df8a095bbcd05082da3cc27617f89073e2a646f003d8cee27a37eb70d068315ff975bf3968a29a05eecbc256db96e68ade4775cd45573e1cd39932091ddde89310ad42961030ea1e2327e792608d2097fb8b04cee3da6554876d6a77837809b7e7d9d7a0dc6ef6cb2293fdb5c511ba7b016c70641bc5d38fad96dc6fd0649b15dc474af0a1918002119cc71b708e834000c29279994d869cd5e9d5c542ef17c9c22bfd9a16462b9641bef52f367fb7a2f7ab6623bfed3d4dd34da8b500e907c183ccad5b084f86735380a1e662248edb9ec2fcd13de516bfc218d64d1f1e04a6d70db718cdf72455bfeb8513ca288d28570a8688c85f0e603b67c72c4d373d0951ed88ffd2771b5e6096a3706d38d3588aba617f7a3daae6dac1070502a74ab39e6017816a1c6b92db99cd57774b60420d8c2de213166871d3106c4b44783778df99ad66a8e3d2943caab49c212e9d4a02a226828d2b3bf548b2a3220b168920109a61e8174abf7e13c5e0ba889b0c7fba4fe8ae7a64bba21bf43644b53af3b296360061ec5d48cf7a14851377e8e696593d4305c6fba1573f375025ea2eb20fcb53338562988e2badf35b54e4d7347c7fd9d6bb5015807cc0ac1b9d2af0f8226fb390dd8b52b02bcf8e129aa415cd4624f94cf69cb09613cce52fd70d0e2bb379f9b74763ac6767881050833ff8e829af54c72feb494c8e87e4771adc45f41df0298267a3b24a03b7482537500009f89825ee3d0ead9f8ad7936586cf508930dd6df1ec60efbe75234e688e2e4c7ca5448671f1c84fdaaeef2c5b5227a512599dda80a69f9678d98c227d44776006af1f7d3e6c2790070c271711c603e5153c130cd2726b8bcf0bed8b4417afe451da9619a0f780b2160758f6ab9d9f9081d24ac892fcff06da18accb8a2421e89e89b6bc6cc4fa0ec3a0ba01c2783a140d37d5a1fb3ed3b6e15d7017ad6d78e99efebc7995510cc39a0370efd56e11ac8c267a79105d72298e358185ba798cd78e5fb0800459134a3971baacadc13589331636d1cfafc933be661e8210a1874a76c2d9b79fdfb137f429d55e1f52eff78dd5ce2fb2805adc6cf7dc671a9f49d6e3387db4221d179cdf69bdac0698f501e69dda2489b45eebe88c7cb38775e96f8cd1b10af7d0892469ae1bebb17f1cc7eabbe58fbdab84f6b588268b138f5b95bb71e842472fa59f7035ef0569aa2d2c87d385ddb02132a8389a4475dbf7f765c1288fdf1f9d6f3f4eb907a01181f8eee992c006228a2e3693569c68eacc76a670b5cd4d32e63daf04458620f332908503867129976ca2649d8ff55eaadca13fca3b9693c02a0798af41c88a343ed290b564eb16ad8862c11741954dbcb96244a31cb41e846633207f861e16b01be4300f2f74b92b25eaf3f36b2901045c557f08b3d118364ce0c9bdce2ad82fff5618b685a67a1c7546e8cde3f442855cffce99bd5e97bdd5d087144e6bacdcf18fab866f493d1467e31502e197121e859f77ad3ad37537567ebd3b60359449b375e7bee2fcefab94ed3b06386676879a080cf6afaf4a6909900eb22bd28c7130d1c70083a5655d6630ab81ef4e2ebb9d35345e18b5e0ec54613f215a740d62d05ba9e69cccca65817664722d572f8eb00000000000000004739ec0100000000dd03a3b12fc89de710c46038354d8aad5cda5a60c5e65981606d61974ada24a30cd92a437d32571fc4cbbdf427aa38ddf5f2cb7cc391cd6e1ffe4ef5752d0b16a2498ed913a07b15382b43b28db99da865ea9f7e42b07e262de03269c07f423600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ea81d5da708d858359297e1a41cbf59ce5258a2b93c3362b43634a200a832f1dd3966379f7bcacd5f4bad8f1fe5e9f055000d1dbd9642bddb411175b70627f27acd114e63d5dba5cb802ee850e0cb9672c281281fa64dc1196576f8fe987c64d90b3979aa88902bb80bb3384e118f4eee68a397b4c0e8baaed6f1d40759923b50222aec1d4050f8e29a4472af128c9cf9bb3b56c9c31e73d674a5aed9641cecd4c030a093830d7e2596f515f88778611ba3a31598d457b93a999ed6f4e85528674740a04141195397b32bf76c6f2f58f810f2230da430a1af032b87a909e33f792ba8a4778291e53f62b21cfea185696fe2d30781616dfc97d938288d7245f3d19b426030718a65a496dc4cee26a2e9e0be6f26d3e8eb94d2b355b2969b459a3c8969d300205aa71e7cd5a2531c2257b8cf5dc7991b7a5405e8a0c9a074392366b8e0d8a62030f8be47fbcff407569d8ef21029e4a8638687056da80b5fe5708cb2fc2cacb8f021c103fd65c59611cbf3b71a7885303821521c2234228b5edc9836836a97badb902199a14ca134afa1f2479f6a27f193bbab63f05d03ab688b73f8535d3089c33bb887b7ad750e1b72354b15cdd8952af017cc7448a9c0a7e071a8f4abcb776860a83418aa1fd34e40f350aab89179f871dfd921b0a934bf569d8faa47019edb9ead42fc67253a7963fe17681b1e006f45c085c04678fb6ed33cb4f08f4d016ab759d3984ee79b2061c802314ca25618db843f0d90ac8f4dce8158b4def424b87ceb710319854f6f2c3aad09318fe76067c9a6ffee9d7de250d3284a54e018dfce5b34e5b1e5cd5b7abe97b36063f881fa932214a01a27e59ad3744d6075a67632f883ad77808c79ae2d90da4ef57fd890db4070a9a33c196fe5374a9bad063642b47dc91d2c8f427480f1a58435b823f7acda4f127b9b44117825028a5f3f8b1aece3d1cfa45f248ed220b301516d7e105fd2a32c8fb0adae97e151ac15674c66e8d2c114caeec7c3c6c3a8c35e0c0a337caf18789e55cf7e399b9f1f2ce2d7ff0a15949158f5d2a4efab92af91f8ca3895f7f4e1dfa66dfd297c3f6ed7e95addbe1d03adc9b795eadbd6824c1977a7dc9eebc825ffbdcc08014dba2b4f7bf8a5b9204411007164c5fe1f5b4c0d7efe9db0ad3fc920ecdb4a098d9a31d53800f1477ede8d8a1ceed7463c7d30c625a267722adbe9d08b34ce0e97fdaf3e58681a9c5e03dcda5dccca250c27e5fb79fedd5f922f9ea4e70aa303633041fc8de2984d0c11cc32122e239d2f9efbf6cb5c3560b9fe0e8a3631ac013fd2cdc512dcbf210ab6961c2b2626e49b0b67d0fd91c72a4bf50175c3bbaf56973620d8415abdddf41be7229709418f6b036a3b24be9e7f5f624951af5af7a43057175ba30be3ba8332476147952a85a6e8158c2125d48adecf2f5ce7a3803b7499234f6dd9430d9c3f2f990e17226d6b0aff2f39596b79bffb07f519e3c2eecd7c21d889efa9403310dbef2cce19214f2d9d7871b4507e8c6061aa4bcbe8912f59a132f5d089d7cf470830b3ce572c600732797b919ccf02188fb271690ac0620369f1fe79bb432a43cd4a88fc6189d1a9750caa24756f43c89a60d0b65b55952a25bac898bcfe70b91b18a4c78a81312af46f7087a1e33d6b7fd657d854e0a8f1318d21e1b5623f997ebc51ae204d69f9a91643c8c53281e30cf8b31c82e3967314c7da25c4b17503b1d00a9ccce28836098ff6f4f80bd427ec76c0d8bb4b772c3f9fdccb4de2878ed23f04bde1a2930ba021f926c39bc4758b17884cab06083ada26eea12fc83da4e9ff359f965d642a45ea8a64c9c8e0d4210136266b11bca988fb76cef3247acc094df817d96ec3471758caf3ce1ca9845187693a3e44691e6b826a8f75fbfa6564e81424d0b2d3c98bd865c86b4b87a2af07653baa5c238c4c827a65ace274f62f849a1fa21a10a16bce8dd8140c7f1989c1c7fefbc6f34cd08b4f4f7c5ea0e93ec87e6874370e41380582d627865bad91f2c5ac77c1d75113a9db907ffdd349683edcb966df56671486cc0b1321eafb857c4c9bb23774aebaf9e7b6f841c28f87dc5f8fd0386f794f4dcc217759720a0610c0de15054d4b36e0ca4c370dd2d922864da85b38df914e3a18c7cacbf9e78a3e81efbd6052c9c09286ea157b7bea9e27de555e5a593c3f45fadc09d6c4d34b9f35904c2fce2dc0b54502242e0ad4bff236ff1c41c0942900fb4fe755a77ea02fed82345695b421ab5085bbe3e872622f7d979ab8faf0bbd7a68b41c9af434ba36d67001cdf69f4871dcae20a9ad9630f98f1c18caf66e45aa11b3b330389134bd92a866f38a70757a7cfade8dd8fde3d0821b5be76cbb23911cd51c746818b2721a78c0b0a560a6a72c0fbcb0aa7c28cfb375e96b82aa31e6ffbc50170c", "65ac63ac6a00006352", 0, 608848059, "99218d14135d668fd8b9f40ce1fc6f28328220e72699c5316ab5a5ffbe1fd763"], - ["030000807082c403021d77f297188ba6728f2f5292d17cb97eac084975ac8bb16f748643ebe3b7221d03000000025363ffffffff8c7d7ab33c3cacf4bc6df2e3ad96ef684c276ce71dd5a89b37bc1d8a48b420570000000005acac515163ffffffff039eae500200000000055251ac6a6ab8016e0000000000050051ac515364181003000000000081c79f2ff5105dcd0200000000000000002ee46e000000000044b243c62fd354f63a3a628aaa2de974aa44b8bec6d5352e29e5eae591af956ab3809336c0a0b95791605233cd50a380122fb0b33c615fbf7c41640b42dd349dedb12fc43237b794025fd7aa5fb3f3d51fc496126dc40d90bd3d3f0300c1631e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d0665bd38fe6065bf8d75cd123208676656fdee091beb52f5b3f851300d4aa152a9bf83cb08eb1cbe583a673827c205f3a9e6f778f1c983d57623331648e6ffaf1edb7bfc960f4ff9686f0f7c7b4bf6fbf9e96b58dc385cb1741e45ec714f3566a114529d8ab8b49c9e7c1434d48cc27d6a73727a0e697a8d33a0b54b3c29d30021c93d5a9617d34b9b4caabc0764bced9633755ab76a7dd83a6ebd60295171fa1022b04d1d8303d93d93564ce65832ac488de6b29f0ac2aed1822b32a4516e973900b036e7c080eb57e828965c54538b2b7e730730c7fe2c771f5adfc89e1a9e000f6835f5bcdb7552addf9be8123ab306d114c4145d51ee317e14b8da8a3adc717370208aef71324767371e2495e094b757ebbe94a674a19479d6dfbb63d3092bb5bc403279fca5f8f70e633a6618c074e2a7afa1eae9d4d32eadc655c6c57ef04529d460203d1da7063368a68499ae99e921b377c904c176964d7adb5ee7daa00cfceed8c02211d8909ed675f3fc1d7d231c494419a5fd18c406686f95d5c7aa6dcc1860eef020e58a0cef3e3e9fd03793075ec45f41f23a7e854fc4ffeeafb4c4af9c6aad0b550728cb5cb30d2449f6ece02c94261a26549dfcf8e3f0f8810071be5fff62d9f356881d269f52e3a2587db7672c20ff36c195a7c6b036e3b341db1ec58832cbdf56079592b65a50e9355f070b3f72adf80ea033a52d31aa74afc883f4d09e8c4535ef918002ad9d1fc2eeca2cc76ff5ccce0edbd54f5e1322baa13a5aa1852d7fcc9ffa0638696c95c3e9a66cff8f00d16f9a0901cf9799a530174dbc2af205f7f992b6aa69827a672065ad9d2b14034bb048abd37536f0ba3ae86791fbd7a8bea619793d00cf62f746043c23087098a9b1d488b099419b88113556e0a6ffe0e85319dcf5c9f61bd25027810b67f7844534a4053a765ef90c1d86c1657cbd58cbff0e844b30d51ba7f3d1a1097f9d3ab21a6df2903a38f704997f454c78429d2f0f48b2dce00bb89e0986e54867f2ab2539f02368a5b4013660d3c4d90a2c5f031967dcf8a8806073ab1b8c528b375ad1ea7e26ab1ee4ea8fb55225734ed4c7210d58499e496b363ae0df914314cb393b66b5870ff7391b513da35482d7d21bc3cb9f0ff2db282871cc50cfe2a091c63e8b9bfba2a2f189d7f0c614311210ba7a9c31c89ed59c81e25df1b4508c4211e5c04fd5a33937a6cedf7634b2ae30be98b1b45ced47c0c168d670e7f90cfe19ba52d85ddd910cf5719d420cc7fbf099d079742af300655661a6520d5995426108c7fa93ae134a3fcd55b13e9f2fe23d9b2689b99e339efc670b80a86e59a2fbe4c33a7c49a10bff34fe8912ff10b32417ede47ddb91eddae82b2bff04c4177625197f637a3f9841f5a75a3f343f199a3e2bf1566df7bfc44815cd89c4f783bde871937ce6d99d0c2a711bcc05c0fec4182b07d593e44b383a77986d1415ff184e997629b6ef9990a04db62f9c4c08faa003f8374637c1c160aefb12456e33ab06bbe84014e80202fa925784869dc61b645ef310148441904e4489b51c8cf69c173251d97c72e71b45fe0a24ea1583743888bdb60a7f389467414ac750e83eb8e3e90e34d4b28a1e3e4e5cd182a0a97950f08c2acca92ad567dc4a94f183c0bfb942641201619adebfa6d05012dc3eadfe1e6384247eaf747d81f9bdf6680551fd0f5d3e9c1a42cc2862078135dbcb204f802bb6954d3bc3f692084fb5deba55f4a85ac93399ac2aa56276a84bb49d5d88d3b58f714fa9fe0fad1432e2997e155d8707eb9bd3af6506b6098d35306a635a5b2cabc886cd21a92ad648d02c9c2d3c16fa4cb05a3aec766f18918a36928490252be7af040f7df3749d3e8344e6a5bb2e561ec9fc3c45da23c0682d052b36a4c9cbd25230aa7b751579d9a52e1a6a48f21d254c1c6f2cacbc5607f5fe960baf498c153f21cf03901c830e6b7f0ee862b212d1b5e84cd03996e15710f27c61600ab02135774f333766b8bc2f1282fba3931c755a6c6f2593b37a282e58f69d1dbc8a2e4c8fb713a55e2de129e41076999c517d68c22e8608bd715d25ca11e1aeed9f15c7bcfecc855a4090d87d7a8902843713006b4f71e5e8c733e2564e2b5608d4b5113da66663d5ca36bbe8431c628629fbf866455504ee7bae7025ea4b069b61372f3ed1074e1cf82118463bce29fe6208304d410eed8fb27be968f84ba2b01e6f7d390c637d7ea14dfaad1748cd4ce45a1e35d81eb89ce15d30c737155b0d696a37d7b84da107898b33c72e8d74d490000000000000000d054c30000000000760e2351d31c0c4252660dea3977dfa3434157562287746c163904ce2cc5c6b4bc5b55e98cf139e5758798a513c4728e2b186ba87e5f46ec222b5326eb8f94cdd819f09f6b4ab41af73b272ef3dfa4803e6dda833776446ca8174d76e582d46b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006c2e2b2ab92719882a2ee4fbf64999d5fb613b772f738bb8c2c85d0f8de7ef69e9cb636841aec4ddba60ace9138ef884303cedb057badf3c8e3d121af2ef98ce04108deb64df0f9af3e60b13c6bd197d8aaccf0f733c12fcdaa44fc3f07f374b4d2936ef1b5531f18817b0fc17da0024f7f780cc5d6f99dbd4d90be53e200b2c030f53279abeef2d63343079bb0d16e74e5fa5e4b76e457e74888c5d4b442a643b02232a36b56ed55f0ef3f331deb5bd916c9e0b61c37d623392602d0e3f6ec8225c0b07c3239061c7ec1cac689c2e3b8cc3864895ed83a89dea6a5260bcb24c084d5086affdc86134daa4030b287f092bc93433ea8fdc25e330db3a8e9e0ceab164970316c8ecffeb8a5d7053bdcb296d21c51a2c18e9aefb5df44606a5bfcb4e5f3ae702269056670e764fe23b67c8c6b91ba4de0b2f43044f009df5322820a5061882cc0211dd21b1d84ed45f0efe720d48945f6c208b59aee734adcb60787e664eefb38b02171eade6deb899f5f15a2205403ec1f398f82b37d1c6ff3dbcca6b40b65c917f0212cbcbefd59219b714c23f1f7033bc7a3073540abfb3b7453eee7997d706f3c48615409b6f2dac668cd5632fcce01e4667122cbe24e8e09024be00f478c567b18cd9d07c1c2fd5c6c9adc11ab1190924308f0ed10e8d598bd777c7f4f76c3822c4b56a2963b0737caf2a64adc7feeab11efa4146f7980092f2695de16a0e3e84fde9a774b0f8614bf3fb78552a4e9c2695e41782da4987dd3de1579a32f9b81ab55e70e3cf657ae87a201a1f4249ebd5e20d133f0a67bb0295fdc1217a3b5b85f3da211a8fa0362fbb096429b9d814620c8ed33e119106da7bf2bfba0fff70b6814d5f480c223853aa554c229e152b5e53e027fc3ef3f505b11c8a58cad35c6979391a7d95010edbbf9db0135fb2b27c5304af4ecaa61f419cfd940c6d5c7dfd84c73bda04dbc3e5426397cc7f1e676be105711f32e41e3a2636cfe219d10051bc760e448c50ca1c91a6b0687a274ddab7582e9b37d2bf1b58499d6fd6043e6c1a2a6d067da1aca70962e068ce3d4ce37f9b87a83d744603780fe5fa910150ef8846e86b415aacebb4f110a1bcc0cf7eb1e766d5715f6ca894a005bb8759412cbcd7fd4c5e67fa768b5899ebade77149168d0c105bcd860c7dc6d80e783c931b68f5bbbf71eff5c16ce855df3424e737daa193034deedf5ddef4be382a6abd1fabb0d678ca5d7fc7a08ac3a8955daba89c7471c46ed079e31b7ff8e0d3f8a6111379451c5c92b9d1822c542afc3c64b1a15206e378916293bbdfd3a3c71738880869c5de1e2596a3930f78a5d70a093193d75a4c0df689a8d7dd8f59a7ad209db301124d9eca3933a8c6f117362beaa183207fb71c3c0c565bb7b758785bd453cc0b35c093c0ffbbee9ae6c9f96af0be6fd6bf07d8de33a2645e4d2c8e35fdf3267ea1b82f51cd56525049cfd812758712e2a8f71b8a867ea4deddc45051c51a1279ca169693e0a2b63e3fa1e849690b2b106e56146f413665d002912f35911d51b441f79b43f952cdde0bf6b52e8d36ae479789531c5b4dbb3e2d375aeeb34594dd8109a24bac9458d020e5dec126a8d1f447d8e94eb663d0c3e88eaa79f5c0c76b9644aa6d87c2297eba2f10ed9e7cbc1df04b028059bdfe44c9e3e62471c9e11801705625ea0f5acdf08c1d3e38a8a6d0c7a9f7204ae9df45822860a8e02f46d5f973f36def3d8c1662d6dbac13e6d246e8fc566426740de7881f508d9be79e31aa7518c7b1124999681cfd6de8cf7f6874c92badefe63a985d7f446b8e631eae67466d7911a0edd16f64db9f2b83dd85d56b3c80a7bed20bcf9e3e0f0b93f9021218cffc1c426c893fade0966b117a2f04837dd061161c4c8344c2c558f6397e570b4a44620ab0025e8f13e739ddc044e307cec9c0e022458af75728b2b560c3fc167410796527943ad0b6a402dea7e14536b08e50137fcdd3384c0aa7d6a68b82d68aceaff224baff8b6e38ecbc522f3f596ce12a2a78931561aa69ce10086b9227779742601c9a461c1448c9800bbb8d52738069b98ababc1a1b6e949b20956ce9a8f0b02a7cab241524b9210a595c8b3c3146911b6f6f2e5841dce67b4e8ff433a7faab07797d5057f80782a07460a428b00488ad2a92847651366842f6368b47f9ab01b8ebcaffe40b844ef91f85e7d205e7783a60b40a886260ea786a899c2d052dd9344a2987fe3218042769cefbe19bf29a0d6dba8151b610d05beeb346f367d1f1666a43c7d704497b7383518fd967cdeb5ede0431c78498a5d8fdf1b48e82755fa275ef34afbd1ce4c086c874c6518c956f39d2eb2e2c9e8c452af0aa9e840034eb6ffcca3144863150b2f9813f452c841beb424a8863eb6ba0f5966eff62d2b2ec919edce512805eff0c05", "655363", 0, -1670916298, "b9d9bbbef2cc5256da5bdbb8012c4f34ce477bc27875bee47a4e545546d39da8"], - ["8690320a0198fbc8c773aa53b2b8204e6c4189c54d2e6fe2d6bc738cb69c27bbd0ba19e0e802000000025200ffffffff045496ad0200000000046351006afeba040500000000076a63ac65ac6a52cfc8c7020000000007ac63005353ac656a891e0200000000076a656a6351ac654278daa00282e9f402000000000000000000000000e3e4e83ce30b5ff7d5dbcd129b8ec08591a9940493695c13924ee7e40415ea0f550cca456be42ad414d6466cab8d648dfcc9fbfa56ce55136af34f7951121a5e8dc1e444d95935d7bdabf548b564f64453c5d942589e31cb2e327d8f7e713cb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018cde58cf665de933d5a6ec45ff9ef049b2014487187b86dc5d365350702751ffbbd70447bfebcd53092bdbd1c490326adc10c9f0149ee8510b9324e15e7790b6f9d6190200382df15d752977ff9f578b51b5d3c3f87ba1b5e4e90052f5e215f34c19e1068f30564e73d231855eb6914253c8f63e2907d1645ae8f444c2e83e90224df5c5fc37b1dbf42003db1904cf56fd181fc0e30ab13f51d8a1e2231930241020756cf196fadb469c8117168adb0f7a58070cd0216e818f5433b4980dcf745bb0a05ccc378e5d1304597157abbab9520f565e0e4d2ded010c2c29af86e413a2f8b61643389696520a57e65e5c19837e359880bf77e385e7626d848de4f8ca858ee020fc90cd4fb1a48fdbf0650c56df4cb124fd9fbdbbee5b1f4797f623392d21bd9022f78d7353affce71cdd48486d847b9953d8180433c6ff7a79688f66b556d051e0225c9df43800a59f00786cfc5b1852b0a152e9b17746b744074241b0654b1ce3402285c2d3b3f0b59d9fe65f535fbfe18191bbd7c240042014a1d0e30fb61b5f42b032359b059cb28b2b96800524e29398809989467471692a6dcfa9c8c6dafc6b54f0f705183cbb102c3b3b7ba67200ff58f8bdcbb34abd2a05ae28528bc7a9a630a715b86a589478a46502670f8d94c046c71786d47317ead28ddefce64cca202c4b46e123d3338493fb63b1707afa70f3af61bad587b068aa4a9e82aa4c7efdbac55f8402eb6fd51fb091054a6a10e0f6b71c79d9fdd706938e92311db7b2128fd5d21c2d8f73dc0ded2744f68df3e0a2f11bb92680015481cb3457d137d7a9a64447f6131d1e840ff041085e41bae697de8b2300b12b2c118946a37910ae19234a7379e9343a1a03fb90ddf9a3d0852c458faf86919b8f3e63939f755e600403488eb0ca4f5d715c5e56395299e4ccc4255d63d44e9fbc0a4bbe60b059b8a6f0416b590cdff89ce538e58ce37f10fa435fa346bdc82f3b0e3a276ba9675e85d0cb2f6d5f2a72a21a24facbf9444411bd734d399b7574258633905828480cb15d79d970256da2863d038b658aa03ac28b7ea90b4fc972d3b2cccb96ab1c2dae1e255c2c553062c7ef94ce9364e4648123d4fb40d3faf00c40399ce211da9f6c6246f01cecbaa24e59a619470fe98f3deebab01226f6a8887dd4aa3eccfc3b417d50e69e7650ded934068062fd28702f698cafcf8174d08a432c9685760dd8a801a287ff5316af1e3e32b10f2db6a50bd40cb857143c7184d6545bde60dea2e9a85b055db4621c8ec42edb68bbeb68c82a4fbae843f4e29915f587cb587a1a1e15398cafd8ef1422e9cf46d3ac446a35eb95662f6cd05b98d21cf3d80a2a41a8bb538f01aeb7c7f330777aadb1eb599c92b5f042fba72c4b1c562a5267144ea85781ff91f64e0f13402c3c63c37562b87f8cfeb32ee0f7360965b9674bd6b9d513d5ee876cb34da619a131e0b2bc106fb9440f50ae370ef664896bdc87d4b6089a0e625ea723ce41424d77383680c3601e2d78ab0cd1a84c44df2bc8ae910ec280512a92dd002bd3aac854158cc4b29bdcb4692e0bafff1ea5958d5b5c67f28275bf5d469dae95b284dd82cbe1177c05506ca0141e622e7f70e3762e805accf04c2d50f421d78f78bfdc9a38ae35031e0cf74058b1abc6b2921fe32df73ced7fb2813517601428d90dfe076f01a3a2f082f9a2753c6145a1b46d3edd7c8c1dcdf91a4e1d1062ea077f552df6ff0a3036587b7b6b48faf3d91b7064b427db9af1a0b27e35f454e0738c20b5189d45e42de6d97db22f9d6dbb7d74b8a59cd5fe06ef00ca6d6e44c3b1c808d36e332ee73f5d4f93dbb5b0a669b24b6ed4a38f0ed7e8890bbfde5d0403bfbd0e6df379187cd6de7b70e5c234785dca78943b8503cd7b7070d23c6f74138870b80623f6f3337b993c2e5c0eab6cbf080f825fe79b5291ea02e8c9feee0bf1779c8b637a89a440005848c24c5e5548a78f400da7efc18edf432ebae3c5140a5390fcbfb0bb7abbb2ab529440f44c3fd810389998934943c1243e9f0f2e567e20fed955f903d70780dfdd35d6e85053977a5e9df1251f983f61c8f98249d8971b33fb55862e646989490e42db9de65c8e8e2b13277c8b2c9ca464dc830f2911a5e41223346e75682c8ce91182aed5da29befcf2a790a5798fee27973384e2d276770a7fd2438bf711f2b57d86c74769354e77eaf592f43132ff7ed18fa4a0e751db2efa9865a6529ff4b60d55907cd6fc7227612537226b0c2481ebb501ad3675a19966c43f1128816c900000000000000008ea0660200000000dbb91019112d5a0e8678557d3a6a40920a7d650864d8dfe707d3f02c4d9eb17e2e29c30df83a5cdc5f19c560498c298339fe4598d9c7ea0eb2d4103e506e027f30755b32f24adaf348d114b2932bda4091c477bc4eefd1fad615c6aaf07df2a500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000948e4d1ba824526dd11e202c7db071a07b3e83549d72e86fe1ac1872d3fa1b38d6bec9fb26efb263f681a41f2328be723d2b66037f943748409da62b54c7f3273f2692a10571bf562a07f8c2bf27c5b565af8e273c5394dd9af5360fa17cd4d192c426f7768185b6255f15b30afec3d055a7e25fa124aed7b233fd020b4c145a022ccedc6f2effbd7165ae581832516d395e857f38735cc4fbc6f7950c67086d7f0206582c46392905e70ae2e0a40ef9afb00f05a658dacb3f663b5991cd87157f8e0b0110b3a70cc236d2fc433228793181a8838797d977ce200112fef4a73ed9b50237e8324eea379fdde02177ad3d680ad9c2f9fca1159be5f6a3b8f23f4221191d02233f85df2ffc409816f76fc53161b94e35810ef50f4d1583683f608962fa6cfc0203f83afc58eac34ac88caec73b67b6e533b0de7e015ce1c92a1d8f94bb56fe5d022b24a000a99e9ce9241785a3dbf95943fc8dae8db9f7a2dfadc5ca9e98f4436a020a87d2b3181fc486b75f6fabd70af2d48290530900b5b10e404800544c6d88b20224fed8448d5ece72c5d3fca1b75635f03da9705a8b502abf106a96ce49adcf68a13a78e550943ec9076425c6be8c927c610b7e0b1182bd43a83187c454fc4a0f42d53848c68dee1568fc9d952da250c4a78398cf63a78470e78fa77df3ef8284df611dc71f97c13ffa500295598c4f7ca1fc5c4247ea17dac5141091d5118b3fa50e8124ef865aadf271350f5473ee91b53150b3e3da349be1117615219956670b9b95d11633fe97c06eb4dc34866f31df8f149a83a3f84a7b100db216e5ce65a5feadfc1f3e2b6840a273f0ae08f146164d895949554cc7b7e4a427e27004560d3cc180e0b00faa8a4034ef49d001e04adda64e9a1945641fe4d8f3fcc58f2651e35b988b90a951f44767a5f6d5f51ca0c955e3046ab7e438041f9096da3ad6a66e6442b99c3864cfcfd60fcf633f6f0ef8466a86822a06c0210b2626a1db739c233a9c9da3f2fca95ed19942197ce36803abcb37e057b953e24996a10d7feac2cbc4ea53af28ed8325d1775c9393afc4e35933feb9830fb9f01ca204be18db3bdb41cc570e712324d8be297cca91eb1f77c751fa0391fa993dc3f2ee0a6b44d5ad9735acaf86027eb468972cde61f6ade199c5e31052707bcf0185e57bc19d4996c00c35eb2ad54e091eb9e705b97b56f222ab77687c192badc00cd8086b902c1a224e55a5086046865c5bae8064e7420a4d1630eac8735bca740990cd5bf1ffd45c25261fa875295a0653486f8ece626ea692d03501d6f0e8720f74b9634e97a80e54c1fd195eef55034f914b6bff8962e131a78b692b54552c130d5da6f0adce08f454747f0919520a4af97bb50071cd8e8c6b1e105359fda7b98e402deea8fa12f04b1b2577b0dc842b88f2a3e5efa421d785f583a04d51dba333c88a61f547e390c4f4a3409210b0524e893acadd8f8255067b92f2ae0f6ddf2887379288a46e153870475c3dd126e712eef7725aedc136e7b69f460e2cc3db92662efccdde02eb9aaceb5f989cb4b8b35ff00104ef05e8c85adfb81629a6a1a7863c8a4a0bc38f3b09976d0512aa79233484adc3069bc971063f9251399bd3f8e9c85c5cac7862c3b8e76b4854e85fdf30a4b51c5dd74d51024b3a50ae9c4f0f6f5d212916e6f48eee96ea524fe130ae835baf96c4f2292cab1703015cf3618176af9d4392d3f9db2519c75d7112b5aa7eaad6c4a3d8ba7dc5c24b764717ad83805366ae51fe43975562696a6a45362dfd961ba0ea9ccf1800341ea01dcbe8cb48b5323d1c62b06227be0508a0861cdd30ccbc5faa4d1a49c080820dc2927cc73e43761af61d78073eb1c308041812646bbbed67b1f6a9db34a5b6891cecae718daa31fedcfa89b7ac89d8e92166ccfef35e1a99bb3b2e9ccfa859c6e3a8b2cf0eac0334fbb4d7c95f5fe8dd2ba79fcae3ed31d24fdceadeabc794e4f84218d18efd7b9fd472b0de35ec851264a72c3bd26ec9b6c54ab66b47646c118650f6823c347c3c39a3f9d300926643d60ce8450ae04754465d0f6edbeed5fcc89088ec38fecfbd991fd4808981aae3a02dbaf4ca7ff73ee3825dcc89330c2290d651a5017d39d64e7d40d7d1de0dcc80c0218c28ec55de4afbb3c6bba0197201029e6e8c6f20a5d03dd3266f36c225f124ca50c9eb8fbe633bafa7308ff9031b71aedc954b56a392aeeb52dbd5510fdd139fb77ec66221204e3a5cbdd79260b10f9dd6b1698d5d60d6d39598145011211a2f09b60e2d4e1b74a5005c9bcc4360dbea5b68f21a9e61dbb0a41e6bc4442770f57a127912e7aea46f86bd5f8938a73ce07770ba5f820bcf3d0c321803e4b60f7d244ad103594e7df5a73db13719dec694594b20d241c8f817985caa2b73c82d0396ef130f810c", "005151", 0, 1202865054, "1fee130f8996f57f1209cddb36b35e88f1ce4de6d8757579db5e0d75235fc00e"], - ["23e7b34802a645a6cacf3fef45f55fbfb25a27aa1216a9da6b93ffa4b40ab26e9bf2a6ec290000000001516049cdbe9bd62a9e9966f7083f5f85e061f72d43914704878b2dbf531735a8b6551bad2b0100000003006a51ffffffff02d2f5750300000000096553ac6a52536a51ac6ff35e010000000002516599c620dc0200000000000000004cc4fe010000000069bb5033253937a07a38aa4cbe5989e8f164811bbcf30f03ab638684be0045501c4416917acf8d9d363812c1efff0d83d0d226d637999fdf3207c8ec009671ad55952146932df31351977221e94c6e94b4c5e7b66164dc9de53c7b20b2ef31b300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d64203b0571c38f36cfe91361ab44ec666735ab6ca86509c2ea5a94f1bb5404c2f32ada5295236e54a1f1f8f2eafc65e393574a03c32c16c373ffa6333511a52cacd158505e9aa0686aa0d25edbd0269f5f29551a39f7cb8f3ef5f919b414863fe56e7b2fec6b5686889a5fe80bf1b713c2093b84851e619c17923c8acf93225021e0fc0053f053a2d130b78c7eb6d8a6ecf8a0d5bea687e09c75106f786065cb202133149d12429008a5be697657ebfbda5fc2c3f9f7759ea156b73ba06d4d07aef0b0355c2beb37d05b9f20375ac8e1651859aee2079842529c7fb719f0af8fdd7311e9aae048eaaad426573ff8f78524f26d6414b08d5b89ae202ea77d4dbfdf8ce0229bcf99c0e6d1c6c7770247367bc26492a8fc63c0fa602f6eef334bc73dd9dce030db84582c387e7cff9984064f3118b5be6225f634e86dbd7b44c6af826e651d8032010844fc7cc9e547901d5849ebc8da249a53f95d01cc2dcd94feb83ecf9cd750211406a8c05d97af9c24b30bfdb18ca8715482f55609de87eb48966d90dd1d50b0309943e96081b6e684dd7262b5661b39132795ab508ea7cf8c92055cd3218e58ea17e6ee91aa8ca4130dae510d617033e9067673a93fbd139b1703cfc9ecded78fc98a46394d47632e35d0256d02281249c86cc346c2480b660735d8eaad77f93540420e2ee9f68b1c2fe7900c4b9bb90fc0fe1fa7677870e6ab6f131dea81980632ce9153daedc69e16d6d7f953194e4f210cdd9ab337606dab56918a4c94bb2e3e55e300c74e5e137d855cc09a8b3334352d8d6fcf7d0975d0a7312e084a23a218adf882bb67c444dce7e9c7601b0685a4aec59a173e4a5ef52b06a00b51c1cd9ee747fd26662da8e283439ad750c6366c421c6e4a79c5baba6206a363d14c66ae356eb9eecaa61b48be7112aa24a113731e00b66d60cc0e045576f15557827f93315c9fc43f9ecfc681b33ac32e60b8e8bfe13d5bb93926d30333f927ff2a176f7aee8f423974542a24609bc08f76f814a2868e3224c9478137218c30d2c572304522f8d6d99bb61a0b8f30fa9bd67a58d6400bb556926970c3112829b913df5733e4c61978ffe5177992b7793605b5fc1206939b5d68fa5b9b2efe04c95cadf49f30543ccb01fd1f69727219fd60b768c4442e0cbbd44b097720b128d3d387c1d75e63a84d3e289f53c183fb971758c528471793a926f9b886d99a1cf16f79ca6bdb29f7175d1224968261853e84b2c4fd00ce78e1ae95ffab97274abee0d4855b9497647817136a68cd67da30217fc0b9051d75adf2da3f7b16547115dfdde01bb07137921d4b6db7446cb20bacf7c907ffdbc2377badf944beed3106842b3ee2591198ba495302e3b8d3083d2bebd9b15f1ea298e24bcd5bc1e8c479454c381166839f2fe64df2b45d702e146faba913fa62976c7b031269af75b1bb60aef60b915dfd2689d2054b6057db16a7d10c3dc613049a617a6ff38b989ea626099e1f65e04a3ba93df3d162014ecd38e15a1c2a9e462fd45fa1cee2d668682e42c43d3281ad8542ff662afaac4648e07295191a4c796d8867e99a4a5c0c1ed63a830f37ed91fa7a6715c0b7198f56b6f23fb86bf879447e9c98491b2d6ed3a3f9ff3645e949a9235f6e5ecdf19722b4802c91afd008f3cc20039a4f89cb374937e3aae626b41aef2fb44dab6821d501b988ee9293eb68adb987dd7be4611655fc656138ac5c64db646721635eb97bbf48363a05541e661495f29ac2e7c601f5dc34f3c92c21a423164bb4919d9b40ac170bc11a92bfd15e8646a0cf37d6ab76b8dc4d487cc2e8bc1bbe33d3c7de94bd5f8411f2d8ed0da24614e4be5d80ae01ea72174a157809092c25011fecb79bcdfb95ae3bd91f535f538f5e33812d2e537144da2dd1821d232a3a120b68442214d307d708d9c7002718658700151d815c77d8b5b55b7f75240ce6757eb59790058949acd03a8c27c523e1932067bdfec174dec91c41dd9a81eae654336e028d3c6bc6277eb53f47dded9932dcf71aeca45dcf48ee15665f30d042bb676251a97ec417e3c3c3b518ccf788385fab23818135ab17db4d86c138d80a8259ae19192aacf9607f60aaad8b526d76a19af5cf2a9a93238ae1e8518ad640ce9e957aa7e5a6a6eaeb84f219530e02906291ee0c0aed886b412f60480d42d858f693c177ec36933aa2624b3a71a30031d31962950c46834dbeb884e9374f6e15ba14f079f5cf27faa813fd5db75d0e6ec15247a1087d260850335d11faf49e4268e8c027be853920000000000000000c9c29c0100000000eed6cbcc1d07f369f6bfe246a453a8eedd77ccec707da50fa519690afb962ba77e05fe4e33366a064246b3df10f128dc805f5f7d2e35c9e83629e025e30ab7ad4b0ead4c6df9a60d239aa7e257c4e98ded367cf4ad22a6197578392e872ced0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d05e9365a7c213903995c5c95fa3dd0c0798c480bec597639ada78f9e498946867058f197f4548fc6913845542a3019826a1c862f59b49eebf3774a13e49347f3a3e6f7ab9ce5c3a0e92135f4d86349a2c9988406cf9f05b443ec0492923483ef3d9194bfa008dbbacc4d7e51b1297a47541ccbdd1f3fc357c116af01c91492c0227da3109e698e9e5ca0f449e2e719974bbb20ba34b6a7f51eb1c015a5965e12a031d04885d4c81f2ea977224a76521c9141a444f715cb40e881e68e8ec1ddcbc3a0b0772a5f158b09c8456086b201d04e143abf8d32df6563a86afef613051783a8a40eda5c3feceb2a817a6892941f641e9f102949c9de31e391cead423ba0577b80320fa49b29f0eba0828c98067e5ae5e2a2932882e1383dde7b83acd8744be14680201ac14aee7acaf1b22a062d8ddb9a4bfebfb76e122baa1ff96711a97bee7277402171279fe33c445ebc0e3f50755f2d13337cf8b5f27a8b87e48a379657275e9ac022d52291468e2e6d5211a956ea735a80c4dbf8b9ce6bbefc355de7aed6e22c329023023d44c3b391b8b3aa156c5d5afa5b6bc0ed702c8897459e5a0048b8b7f612706e4f156443fb07e5a29bf420a47374f70f78a359af2d36593d15721a53d359f30f7ddcc95186863bee6072d1b171ca6acaa80ea85ee6d93c7bc068a9410628f5d053d0d5092e7a0dc0053df66472f2c658461e55938a2c9cc90306529da936f61b1ae9004f15e0d8a11c2ddf1182306ad010abbf0bdf7ab900f34675a1b92b5aac3fba87d6d9e44824e1ec5b0383ab7dff6e31fb2652cc26c1d3000de3ecdd06e28c44888f9563ba28bf085aa35f0769d6566334f271270b89ac0d7e2b80546a342f9781cc6a401e35d07bd76824e55b602170e7c7635e7f20d9ad42acb88be78ffb0d273d045819e98b1d7c1305d972370528591051201ff3e6fd64a9a4d4718e8bd46445ecc4748ae77a017cdb5e0c6c9dc44545a24fa18bf556f551f81948e4cea198c0fc37940c9adbe6c4b72bd101f416064b4838024f1fce79b8d167cce322c577b5f3e6125c5bb58e8e46b4a783aa318604c08eef4013e3282405cde462c699447d1763d36726f00a055e6d1e952c23e1eac8b25289056d110dc1bca95d87f5cd7cb70e3ced43256277ea475af3a3fd5ae6b5e2a09526edda439173febee069a38113eb2e800bb9bf9fc626fcf4f6431d5585f1cf7a50bee6838a9fb9a25dbadc4e8264be870e1286ee3bc573e34521b8722628b82fcbfacea9d15d06d2345330826186f15b54232afa46c6229062152a437ff83dac39654036e93ccbc3b7a5621b0b3e6cd80e8507160cd8e7f5153dfdcb4f6eebf26ab4108e1286f67390ce80b2dfb88fdfce64d6ca8f7576cdbb82be363ae7dcf76abc0de3c887a9e37643771150faff690f9fb5dfa48877b11159b72003e26466b794c22a286fb283e46a19147d9a4c18d721620d6a1c973f006a2b3bb91ffac35a432d0f1697c2f7309f408b53ce242fb89e637c529696a58b5827ea40488847b6554638949e00eea458884e1573712aeff0e82b5c53c5b0fe74e2125f7b5fc6e6a5278cc9917a4dcce07d53631d5a23a6b52b81f967ebb258ff8ee5f37d47dda35506491fedc227f5e3facaf80278b8f75e846a54161caa1fec7e273b81f29e8195a7af3c030462211c5a1b6cf92a02e3430db263b1e6e45fc0838b47114138a7ad319b29a97224d3fde9af60be0b2b35bcce6982041b907b14433ba44c278bf408aa0dff9a38ed30e0116a6863ba2b626c85e9dabfe21be67fd6411681875f0c49ca456cdb6feee6b36ead76e504a31ee0bd60e823482a6e3534c7ff77f425732224a4f805a5fefa998e06e0d2da271f43a48f0b81a9df9040de80d435bbf200f8d287f9f7d002c877abbd2c58d5062b65867a93ad60ae8fb2a3575bff35308a80dfe5ddb83f21193f7039cead894dcc500da44b8efcef2b5bbd80955c9281cb7bd2d5ba4a5ab4f2cc54237f2d7f992b6f669c2edbc92e63753bbbf662da06d58e54d18488702b28401e779327ec65e99aa24677f0436edc8d66297d6990b834e630e4667b5d3d7e0a3e3dc7a081dd60c786d64db8b64c51f8517d12303397d4a60a7f52db75e541116bfd7c489098c22ca6f3ef4c5aba81573a76f46ad839e8d8a692b36d4dda51b38db6b98fc5a4738038e7131c92d5eabf002c5fa6a9cbb112e6f8b9d7a1f71c1201224bae716f3973edfccc892be524d913bc0eb527bca4782bcde8bc303225b2f35fedae84c4eaadc574edacaebba2a65350d6c810cf52feee25f9938ecd28028b73a05fefb9f1270234ca39775611114bd414e8d2807a0c3ae1394966acaabb0bfa5ae96fbe8c57a4f9a36cd7eeef9615b86e983da638d916d5d9d1094494707d4a45d4bde621d524af1dd6b4501", "510053536a6a525300", 1, -461196428, "53c46fde66b90d6f0d5e1b57ef3097f0a03518f899bd7f3117c1e44337cc8d76"], - ["aeedbf6d01bd5b37e4b2219004314a0125b5fe48b56c5061588322956aa095d4d65135fcc701000000026500a9efd7a304c6f3be0000000000055363acac6aa464790400000000035263525c939c02000000000753530053ac5263176d190300000000036a6565f4bc9644025d48d600000000000000000000000000af1d13dae122b7aea02a0a446818879ddfa71b3458f2e22a6931a5714a2cd958b3be4b1fb456b69db073a3cf3b5e494f3d3668ae2a0d0a9b6898809abc97ec9a9e36d3a435f96d7852010de6fa179d6374369e5d06d3b8c118b13829aae99ef300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c677b0130dcca54ae3ba9c4371b6b57574763aa409688a368e813f376f3ce0679c230d0d49da266943eca2364d19bf3b12e10297a3cb37730fabdb4f8546c49cc9f75f7cdd90a5736927289ba9f8bc78035b5ee4e198c4af46cbad0de436493b39069afd30a36476457e8893a48245ec4e4f137d5172c1045037c4f82e62f75a0304cac6754cac8770e7f1078a9e44ba2a037164046f6bed03adfd725e58949e8d030cd866af819161a22658df3012e695d55e932bc693844bf7508068656c595c060b0224e1262b6607ac473f98a8dc5a12d6da2b0725ff1c28330d620b23f00f9f0c9d6d8e4fac2ffd83ac8be2e793018fa71d97f1530584eabe5dc11342cb043743021f46c6fa1791d875b942a6dba175102f8700cfa7288a7fb62dfaa097721510480310a4e447773b2686ccc7dd87cc32299834474b776058fff8058be8e92e2d98850301299805fc05cf3b02c86c55d06a88908b7c3400b0c9ba3a078220e57d8fdfe602074beb243f3788ed8e06655d3182796e87126aa5c5bef77aac531f41bdb2b3e9020e67f2651db33cb80a56b326491234cd6e5e9f6e9a0b63aaf77ade7018dd4f50cbb4e4632c216f596f9e03f08fbaa322030e2c1d4b4064254b90a3253669c7298c95e08dd8292de8d17e2314f77cb220bbdfcbdc672829a9de269847ff4eb08912e7be60b770d8ea8daf8ba7554da957c712cabe46c6c554d1240a4c69dc447a3556cd80414d3e5853b43c1749c86de6d7c4ccc05e62199cea4294423f2c8a3276e8f05c41837e389daca46ec5b0f64f5956e6fc1af90dfcdda33f6e051070d3ed71c2cd5ff7b905bfc7cab7ab9f4b65057a820d500c804d3a6da1629360fde1817bda0eb1e70a7955173398343730aa35ea9e59f6b32e3c761e1e7d738faffb2705fdab1e4b9fe5af3fa9fcf930c67afa2b309ef38de00e9d6b6d6e88f9264584325075a552c0eee7140dc0ed2b71ebec485ffec94919d1297df69e86d630e8a083166cc0796859515e28cc8464f6c8df76db98fa683d2eecfa3cd1bacf5fbeb1d33028a24427c89571afe0220b1e55f3752bec125f6ca46ce73977206a90144bd57723c9d4c89b0d1de78e8f65f8690a4a4153aeb1ba96f951faef9f8bd4fb47577c5a98ac47e355e21df50003c0e297747fdeb1ea22791cca187189443c799b7f6396ef013c5444d04c5bc60e56cccdcc61c288351a1d9508e4ea54a8e3e6b09236a3f72aab105507bf3e137c8e48043228c38caf44128d9153e38122cc6bdeb84ec990f650222856e9f480cf0724b1fd3d52a955efc8b982c266ca39ddea9a161bb88d6cef5a200fdccf3a28bef6ead0e23571f6dbff75d0143cfc465c31fb729b5e379b61e03aa21a4481d5e2cf2162e2d316f1d7c20fde0c2e30a45acd6051a3ca51620ebe855c294280c9986388a7c62b5bc636efcc88355dd2e488fed7ec24bece18688a3e4dae297fcef80be57349c51e471ca5f28dba95a2e93675c405e4996a41ce9a69792656d668822290b8ddff07b41927058619ee7c92fa717f217e616b97d686dcd30405c710fd8fe37bca0b299e66dac1a0b837e74d43cfc04ace4930610ca25b3521396c7dff7b2b94c78842ab88f4aab21d0fb2f3bcb9b16d668a2f5b1952a56135a228b89582f9533d02d974620bb042ae7aa4df13742b516d03a93929cff16ff0dd5e766758f2e6ee750ee507e62697c9f47bf807a13ad09683133b9bdb1878c5acd0b6aea46d7f439cda0b6e166821da803036788a41b30917f95224e271a151cf69b2581a7bb704dcc070bec396a095ff3109c01b4adae7af4ccecdf34471837b09966db00190d54f04feec4ace8f3509dce26ebf0e9eb761810276d99710f20b31785dd3f94557972453dcb3f9d4afc78ce382881f330aabaa3ce50bef502e06bbdc671970d1609dad8ebea750e748ba1e9c55c93d0c706b7defc16d6b284b316dcacb796642da8caff2505e974f901d06ea76e9fd149cccbe067f8adf78a56dd0c1b48ac55c2b9d7be671ced3e2bd5d117f84d38a6485590b0b636019a0b9a17d949a4cf8d1095ba5dba343b93d1624c974e8a10489980599651cca250eed1811dfd17b5ccc3bdf98473178d7644b3674b8169b4e06811b99ff385bf530e83df26b356aebcd11d6da8bb833ab31eb1298a6266f41366e0be4971e34ec9b0d43cd030d53d6e051b62c04981deece1ef9c6aa56eba4b3bace3141584f7e662c367c7b8e389cc1631511d840b0f3516ebe6483b9067a90d82811dda59fff8f41e60335f755f37f0000000000000000434b410100000000bf1c9dce5a1debf0322a220b741e58f4edb5bba9fb2c4d25ed73b9bc517c0a5a3486167841172df8fb1b906a3c25fe343504b46c05733a1084a94e0e5c07c3d0712b786e437453a844b235f216571c1fa5cfb60bfa6cbabfd003bb448f44b27e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd78b27af4bf9b3171c3d793e1f2bbe47527414585226740139f8b5e1c0525dab69c502d5d4cfa6abb7f8d374e0fc31afb98645dd5119f464239a1afccc53e261eff427d5cffe4c2114e516c47f02f319fc0bd3743a5eb124622a1258c78d03e82cd7838e828feb31c4eab78adcc736022f3a602e8d04b24328158ee85c00325020c071533982b33a1099b3b27826b73ca0013e286b36d08ecce8081473b3b603a02041a5b9a6dedef68d0710eb07e4fc53a65e1413ff0bc5e0d65d746e6ebe4bfdd0b031be914bff9613ab117361443683a85f98e8c1fffdc4590d3aebf56e634133ca108325f068beb6465b5d4b4670fe0c6d78c24f436a696af7b265e0bcd0cb4ea031adf323f256c7c444dc05428ed92796623a208eca165cd7610a5636380164f000329ddbdfce0fb301778520944deaa75c3cc9857c771789b1a121b06bd8ec772d2022b6c841e375a91e92b1f49146476759c817c70438aaf8da92071bd2aca4dfef10209a2e9fa734cef05a2b092b167736a1fe31d14d3ef6fb594ae8ad2f6b334e854021b947ae739a83d12ba76e5badd403436a6c75f4b658db03fac3454aba8c41c29337939b9bfee89aed887b216d81b95c4256bc3a122e980ec23c5cbf4308123b70051f35cfcc970a55ae78167f610ebdedd48751b2b0e098903dec7a3fbbc1630d67e316a808656ae7e5914b5ae6fa2adf0731c20b9625e1969bdb1c664b7f8ab495efc244738d29403ef6edc8bbf1855b53526e04b5657cd64e605995c83733be246ec6d8172a52766ebaabb33fe6dfa469e9ab186922a83fc1c1192000a1eb15456d14c006fbbf58c0c7e4a6f266d25b669e29ced9b1b2865cb2ea857ef0e6f938de3ce980f0d76e5baee71bf7fe4449021e75dcba4d2ea342af0e354205279e243c8317c20ae191b30c19aeee1020ded20eb98dd534688b4d8d119c53ae17d129b9c1c21e29fe6efe7d7c4f694a157d64e181aae252be635cad90527e6256bac2217ab78e9950efc3dfd67a16baa3265c9f8f523e892b3406f96ede424257400ddb5485b7273bf0e9d87dc87fed46338b8e8081e0e43ce10ae6082b8b3288029bc62e8cf049225ceb7ba683f05d51e0d920955e3ccea26343c463b64d8371e563c361e2e6992a7abd04128e0c22094c8c40f2498ee3c61d2f686744aa17f14258a6150e3e349b292cd45550176afcb796affaeb9822a558517b88e6f0a6e58c81a6c90865a6629c849054857d99deab38079a389a0a3ac21af01c2dd14f3e92a7f1e6adb112be9b71bfc8631e3a9f49ef4a18c912539ae99ba3a775c5c6f5528c4301873c6ed379aa388c9e532fad3dcdd63484b1bd34caa233007fb45cc281fad90b78d185067105948d99412ec69e60db07ed908552f8ccb861745ca209276dbe50ea062d3e37a1970600aecb4e001293601a4db4122f0b7a7dfe72e0b4aaf4134a3f5e99ad3db6ee7139e99d46677e521de3c7db59a396f5beb7c9d5f519b667d80f415646572d42a0cf5370f902e9a0e23a5d77143b4d0a061f531bbda03beec6e82a910eb4005532d7ad10f827b2df70572b428909560eea8113fb91f94f5e40abe899f0f7d64c937e2c462f9c273b9dbc4d9c70d0c6b8cb9a877ad60bc5b6488ab5ac231e7935704e0e9abf8f62ef3887e18641689c1ab40500c5ecd92a1159ef99a9c724f2301a104bfafcd94e8d60db5e6723768cd809f02d29a912c3dd519a933c9bf7b9f839481948439fb789002f3690e07326bb005df43ec5a7cb1e7b89ee8af27227469079113ba4515413c718a98d975b6748fec212d953b720df6c694c9ba501cc0cb7ac69e98bf10580797872fac6430a1ab3636b88c8f53ba88b210a57d548ab246df7b95cd5f45848f4bcce5ac3e1f543082ba6ab8ca2c974b349dacc2d98dbb0bbddffcaeb7b7f9477eb2954ebbfd30c9c61a49a2cc6fedb103b3f6732f446b236bd1bedb2cfaa439f5bf4f3035d7b75df8e1d8f34fdbc930f7617f175d562be72d01a9227e9f3f7f98f01ac2c4a2521889fcdf6008fcbb653151f784f02fdbee0fe718228797dcd222a1034328b719310022d2209eed4cb295cb6b1b8530b75304d78420414ac87d48cc4bda2c8109b5ca25d40b0855cc594e8ecb25128477eba8736c9a4369e0fca0c7713421e696067126aac24d5ffbaf6c2c4c1af60d4657c35c9d7e08441d51da4ec4e609b470a43a229c2a0bc8b2527331ce8c4888437e646ce3a5a5bc439f82bfe938a157e8f9b2c12d101e244b011245e30b827cc77728620b38d49f644b8bb703509b131e37de6a2fce53e92b0b6d442daf3cc5f79dfada82d8c1d7dd71b9d07d957f0a5f97394589b59dbf77ad99720d037413c62b82b7673734c6f437bb2c103bb263d5d4c71e2c1e7492e9895ad5f72d96c780a5f2f5e71af4c70c", "516552", 0, 736629714, "7c8fee9252312af76feb6e0612d54759bf87749e76069982b47aa1bc23505835"], - ["030000807082c4030271742c68e138b2098b51c6daf3a00df4094dc04846fa8add87329e57f1163bd9000000000763ac00ac005151ffffffff6eb6869821f90234f94abaa3a821bca0d618d122e87b7aef20f9dd7b154351810100000008ac6565ac00656a53ffffffff03e688b8050000000003526aac814af900000000000563006551522db5e5040000000006520063630052d3ab329f000000000397778800000000000000000000000000127ad2779ac892fd3c3d8572f09a2629de1b19ee964ab7d51232263381598545df34131487660dbcde49177a82f2e5ff3562469b4b5dac5431306ba4f9f666b3f67448e8aca6f9e1f0c0d2eff732647ef6dac595f2a2bd70f27edba7a332428c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033eeebd029671e00f33184f311451660bae9a449a0c853de464c1d0cf0992e11dd2598e4acbb863f340d2a1b22012a38e7e2f19b8f3ef8100b98c51ece1e1e33a39bf84251a5c69fd065b646252a5ce4ec8e3cef0c6ded6f5258d881e2953e67f39b69fff341a50c2b5c98ce85162987d24de9921db0467b7a3c59bc28334b210306f698bfcc08169606795aa7283c4a5ee0eaee56c112b6ce461f598dfc86fffa02264719b2972e7202524130a8ac18a42ec09fdecec4291a1e425665b780fae3540a0409d5ffb18ed596bbe4dee36f51b6b97ea3959aba9907f3b5093e1ee298951ff0ffe6f603c50b3dc31abc26c0938db65179bba92688ab01641885af94392e500301380b99217fb7534e746d2ca3e30a2f3467361da15db5501e654bdec14efe1f03271a7417db085beb582ca7d8579cdd4a635f4c707db633d8edb21b6348f58de403071dae3ebd8665bc33c5134dc525d09d0b8381fc9baff903c26a1c9baef66a9e021e8f269dc0519b1de78b1a230c956dd8f9807fde2996faa1784be1f60884025203239fc8ca134d9512ab2dfddd02f25423abddd5592722f2335ba0348743b510d23df8498370db8a6692a39302852d6e291cf47ae3e49f579ed32ee57d14c5533931a3e2f069d6adea45b4c3b45c49796a12185e34d946d3f9e47e173370f560dc7e9f541f6a4ea3a57cc88d517b24ce2ea4199ad8d41f3fb583136953ae11af01874fc90ec85fa82f092424b85f2db26f94eddd1089aaf9607cc99efff8b9c4ff8ec22303720c3d747f525ce91ab77365870f0c41bbe8833d878e94c48a910f04f49f80aaac1d6cb7735d3474ecd2b710e5fd154e258fe513b882c4bf11191cfad7ce25d120269cc998106304cfee799818eb5155a32b236fea416eebce4fdb56cda96702dcbdea238f38d04060e2ee4a0158a3df95ef0962eb8105bb2fcb3869b85fab78d60427ae907c189a0822b1e8ed324baca4d43ae2793f344d26ec89438141f6e364590baf96eacd8bda66691fab7b231f75884b8af28afb2c80e8636f4070d9d869d475482b716a8dd6f162a8b2bcc3802a755d81d947ef71ba4744df3270bfd15f294cc21d5feeeab2abb8baf4b8cee3fe5a1801783ddbdfe847faa9f5a3cc9d37f019ce092b703e096859256e20145d10892edbeec4c86e328683d7f2769d004d6537f1662170aa7830c561940662bdd3f7d69f296744591933a5e2092aa7b92c58d169da453d1a206713a230042646af11af7e41effe49984ef2075ffb4a5e4908071bb0ffca507beb5e6294f88933a2a23e6ff0680964a279aee7a98ec2c6aa998af751601a0629bafdb2c9b652e23baf86cb460968bc19c6b3ff9dfae670647b7002fb9adc075e03d4b31d6bfb93f9f5fb94946a524b352448845321bc142f56a6edf67242c6babfb859ddb43dff830da2fb2142d658a7800932118619a00acd062a9714e97ad0759283598f762797a4921ce3e3509602b5ac100a33bbba7bb972bab8d9ecba8af2b8b82fa2bd535d7b91a0b7ccc7836722875bf23121a80fd238b043139f082a242461563cacb0f22236461e9bc2452d5733940f15c25425756a3ab61c6ba23bd0f58d5d7dcd14a70b73e0976ed269894774eb79f96e13edf379b2531e7e29dd4fa8f80536cffb13751318c3029711a8294ddb26c65078744992375dde770e8db4ca104236dd0900ce80a0a5d6bfa0b2f0ebfcc26921a28a6a081de0fa699fd895ecaf8f9ae3b26ff52fdbc6017d6a4d6cb05a5a0d29e8ad2db970ac3ae12dbe290c30f775221c1e45e8e433e4df109ceb473eec52eaae18c61c346c5e8529b591f6f067c8a338a180e2a3f75afc7bafffc9c6d22bbc979ce1b0b4417b384cb30f71c067fea36d4431338f6521298fedc0d04f3b7bb73c300485712c0836f407b22ce386a78a8544a877dcad65736da1d110707df2c1b85493f4476b769a4d581254b08d2e694f5511e34a7c00f34f6690e98a5c964431d86762c1f056ee8244e3104497fe9a9a27ab1cd2361ff3a612b713301bccbf5cd2b14ad221dd85a9db24473391e564dc93dfa633947956c550311a560aebe990626547dc41b54321c5b6169563be667f0a2b1c8975488df83dfd814e2d8c6f29d276c19a013abb3359df9bf21190ae7ecce5006c6f00d909b49ae03866d6f77b3c9b19dcb30b14eff86d98555470ddea46ecb6ef8f2ac84f20e80759a807179ebaf4b91bd40b52dda103bf9cb1b62e6bc6a1b822cd8211add3067c218d160606a1bcaa40e7a49ef6a4e245ef07f739b3cb04000000000000000000000000adb94bc3eb7a2fca887fb170f11c8f720029286f3fdf20e9a42a0a3a5598fa981897154c9abcc2e82fc1a0808669961213443b7a2aaf88f5cfca14d2b128f60ce5a8899517e33834bec888d1a517c576ac7603926323dda8fca3b88875b82686000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ead7ac26c0d64224cced932cd9e33af336a5183956484440b238f8071d609c70da2df9ff83729821d71825e00f136f582e333f6663f30185666200a8cd31072513b8522fc1598748d60aadf58a23da6b677317ef27bae86d1e709e31783c15d0fd404775f8a471f55b2f84f1a8005ea80741fba9fdddd1c05fb9c4766ddd40f032e871ebf46f4b36855694b2844e3187f14348083f50ef82e436cff06028bd69f030ee495aa649a56e4ef2ce7502c81039156d5ad3c4f6e037553a19e71950bf3530a03c5d9e57ca3444b44ab26f82c737435cebc10f51917264dc4d66abeec2261646c7061423ac0a80c11b988cf38791660f2e2ba58ba91f8c41db35977beea1855022bc5748371e58c7110906cdb40755a0f60a7f9f45973473fe89d3066bb4f9958031aa4b89ce4eb15151b5a66d66fb37240df6e435ab4a7af08537c5e48b2c57a85032dc9f425996435074a62a61a87bfb07bd4d35397ce8f6e14ae6f19b9b5b32de5022ab840fe23474eb4fae267d51e9cf1705a740c41eb8edc3eb54a334d0f1bc70c03268be9de53e6d9be1c1d49743a5e2437f0fbe973ce71f25e51f14a3dfeb2660f5930e05cd16e4538a2b20d8c2ce3bb8886e055e7060a7e6619551c784dbc19ab56ae14b215baac40c2ee9ba36fa5cdfaad4c0550a4991f79334e7505368db047939964e106e6d783bcd685ba69c1bdcf18e7ba8b83b682b4079707a65167cf4b6fdd2b9d991e2b0e8ce3cdf4587f69868e089743d4260dc1e89e97fd69a39261f6b9dbf23126c030237ba8c88ce7fc18de2d4cecfc9141da5e1877e3fcce1ee5109ac8ddd96fa68a20f34b1afa749eba35e35cd3d47f72029e926d116e119c48fb3509cb892287756bb70437d0664a3d77a65188360df9ce77b4c0d5093c5f74fff8f380746d692822c79aacb25201bf277eb5398a450462684760249bfb4deeee939be88427f7c692d50cf7e920c0bc7939767a888bfaeb31bd1bd519013df5fc32a9ef6de6a8cea32f3d0403ca516bc420c93ed66cea4eacfb9b04ef1cf6f971f52b8a393c000439db91710bb62e235d8f172a56aaa0c164e86f6c050fc72b974445317cb1a0ffd04c33672dfe528a9f88e4834ad95a652611c074994eaab2c611b60e448a03051f70e7defcd02c1f1135df1532761124459b2c0627e36bbe5e43f576c65db0af6d800e801cd0cd9142679f846ff87c9e1e43367f196aaf8fb5f61aa9d70d2bf7b02eafc0bc6f18379e1050423013adec8fb75e9ea1b74dbe1fc36b707a052184922d520425f87ba309188a0a17fffe70f0c38cfa722ce0d4a425516eee086882b03da4496107d88d152c945af24ace82a15ae4e3ed25358ea26116d1f9bab4981130d56525a1b30764c36ce00dc87541d8d70f8a8e4464dcf2a069bc9970f88542cfbca601c60e2589114e9578c4d3965ab11f080a893e8de7c15a62f95783b22ca1f2a17bb01891e80133bbd6fd913d448fc02545a960e6d05b52e56512a693f691a07f926860909ffd823af751e04744ef74812cd544067509bd44821697529c30f4e8888f9a57abab68c4b462806e13d39d6573d3efa7f6550356b6e37e5e6e534dcfb6a2d6b606f96d908d202e56249d25910145f329c6d3e074a5ea74f295734ff318f12a1b7c63ff9bbef74c4909a5296461b14910fe99f4b043406b4cb6ad0f23357f2f50bef1a3228a3994eda3275637c130e2f448520f8d1f14249bdb8355b2e5eb9e1a135dd60708d832d957483d0680ffafd1b55a7d1b9b418b3523324a2d0f9e98d602d1a264c8fa8bc678d78c9376730e20b5733536ce621b48c0ae9924834bd772f4041e552d4985698ca75fab779a917559ef6be7f01723140c68fbf5411d9619d8690b2d6ebd828e976736b6983ea34a38c5f6ad5c61aecd1e138bbe07ddaa52e6d561197aeb134b96b32f0a020ffd5742dcbb4f7ee8c4ede3b65663ad02eab620a05d021ceaee1c57413c7753369a0b3421d576394bbd7a33e309f49165a7831f4eeb1484d628f2505e3b4b3a13eb57a07e7abe5dc60f64c7e3ce30b0ac10c9922aaf2476fececbdf711524777686a74e6702e88d7777e147d4275f9e9cd256f3e5af26589c4983a2b54fa88148f8b1947dd080f47048ac3b78d7836adb43e9f18ededda406bfe71058fdd8ac3eceb4bec68cce144d3b38e78f32a82eb20b37a31ef759c524225d66079591b2807365fcc19332493bc4513c0cb972a25db6ce95f2623aedc89c6cfc4ab0dbd6c6150413ad251e934c2beb7d84ea6397aaefa200150000000000000000c0a2680200000000d4a914f939274aea0c95f0571c53002f34478f9b6c2c2bc44cb6c91b796113749895108c28aa5bf8f822b3d6bee59be3f626a499f9eabdb363e65c66f646b57c456b0224c373cca40fe611c7e6d80569d59d8faad167f1b9e45289f572c5f3fa00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000388e04003684ec81d93c51caefcbe2c62f469340527037ddb222d095f98589996bd1b1448b0a82fdf93f7e986a62db1509078c8a6e85a71f2a6927a1b90c2564526a31faf02c2d9fc346ed4cbd49198c3744045188891ac9dc3d62a0a70b31aef6725343d6866c8c1c2eb0ad0d1536ce370e1d2776f771882c64eebbad136cfd030f38652b0d6d87d530ac11a0b866d022fe7def7dbb9066150e8c1cd36a73edb502264eeeaf5aeeadf38cd7415e1660f05baa160a84c602c7d902a32912e1a4e2220a04a8d8b18c4be1e4e667b8cfaa309502196abb6513d9a70b09c061f6604a9aa9a97193b2ffecfd7f77a055dc90703eba622216b91e03f859a8a0b956b6629230030c2530dbf7581cac1ba8d65f095e5aeffb64e0499047bd440718bbfb3f373a3b03179a66011e63620691994c33b54c1ec416c48424ba7a5fecb3fb550cf5cab2f6022df9db0cc76a3f3c3a950d949b8a9b43ae74eb502a8c259e4b4393552a6cf498030eaa0efd3b7459bd358cfdaa3bf06f8b2565ad53b818ce211ea7f79cc67d694403288b5a3d33d5f9c9eecd4c9447e571090af9d231ef3467b3dc5debacfa3a047e16224ee008af22a451124fbcd6377f718f8584633a92d07f1a3e9c5b9a845f1b66be8b537620c63a60dec91df079cb1c01bb71b304c81f268fe7e34c440626eec1b53aa50551744402ce42dac9c879837a131bc41e8c7602d7a06e23fae43d76b02fae8224a357d1915f105fe4cba6e0c7d580afd9fd95d77d058ae69257fb7529dfe9a192ec22484605642222f52a7138d747ce682682b68121f0ab155b8df3a9e930f193249e5a3d8ca130e5cb2b0a7a3ed264195a19d8697b5dced27893651d4b72cab4c22ab48f0808fd2c54780bfb189a637b73e7cadab87f8dc39039eb30715f8bfeaf7bdadb358768e17ed6de31ebe8415d67a5260a6758aaaa33c23c3702a49f7bb68b73c35206443825eac7acef3a0bfcd91595caa2eada1be8ab77e3db0a3b026ba7089560bf49cb0e05182b7083330d5eb4213f1680f16fe99182ebfe5d8ea75fa7ce10c5b96e21e4a512dfcf085c0447c1f546a793f8556f868e03e082314cfdf0876fea4366791ee317f3b2f9145b2b56ce4f9ba1eedf0d10176746bab100ebbc1f8cc09869f34b5e5555d1d3aa9424a96ac3dd60e2441e69dc4cd8ba354c533624bf65720a3fafca4ab143515642c9ccae3e05339dad70aa0987380b406c53acc4ae6ebfe0996a8e5621b6821256752ca7d6772e7877bdac5c8a1ec7ece05f8b18bd1563a3f9d30701940a41279d7b8db8eb6cf25763bdd3353f8456f032d3838bae3914ebdde5a05452be9b2dc46f37cf6cb152ecb2fd62c8cf4ee3abc99a926e96e07f057c4b154a4bc0d753025085d545d93e7da4652ba97edfe9f06708678a4eecd17753c36fe02682fa3d1d395176249bb9e9ae30e275dc61d056f4cdb8dffeb22723bc037916b8ed87c0eb11c0300a77f5ac0a98ac1ae3999f17f314ca0d7bdb1e813083957b72b1c14f4ea443d344d18c66d11bef6b88a3362bd0546950cdc3a457048ebcf3cd07b43e9f622ef3848684623fa0d29fcbcb13fb9ee094da2c68ab75d5f35d4df22367295a7e2beeee3dc4a441c5ad901874b3bfb940ac9f19fcb42935d6b0d5b26bd4a6a011400515ee7423de0fad5cb920f1a23bbffe590f13cbfcbb8f08168933dd7198079042a3c1becc79eeac78044f61b40298e1a5ebfd1443d80b0169294b4cf3815edbbf08afad68b02ae46c39e5584b0eefab522258a9997b71f7d0073c39a9ca9e04958fa21a666bb12ad504382978cb9607f8500aa478714efd56b9ed59390da35b77e7ecb41f7e0b0a61b85588fc13b0d33f0575daa00541875a26c33d0eb02ed3b256cda89f5d530aa7ef253c4cb4d955a657c37cbe5a17d162b32f61214c5fa1411ab64fd13da717a35295834043b558ff97eceb852cef91f250c25780d43b0506c7b57499b7324b126714c54abce67cac4134e5cabf6821224d0ac140e35ed855cf5e299af3447bacd82be030d92cf4788234f42ee5a57a45c6aaa13e68442c7e9d1d15c4f5d98cdcb47b4fca0645a97c0f703640ccc34c88149ce5de810ebd5b82752e14bc334a4cad473176099a9b584c1c83bdc610cbb5d46b93ac82b2b6ca9ec066930a6ff1b560d02c58dfebfe7bc804d2cc18ed45cd135e4430cb85781fb00442b836d6515a8e9c01d80c281ef1ca55deabf49b21560ea78c9d5898ed3efb713dae12d58380c1509915ad44efccf67fd52aa19e7090e1e5c6e391b5987a6df670d0c5ebcc8f79f98b01f4d1d94a7d1739afc9dec3245e2b4301ecc196f8d2f1afbb36fe8d5ffb59d9a0d162092cbdc0061f472b2975d4a973f023adcdcabe57f7e2143fe57e6ed85bf1305e94cf308024d608f702bad905", "6553656a51", 0, -2062089069, "95df69d9d87b9ed1d2b73a4103bf8749653608da093e6a41f2a28cf62bf029d8"], - ["030000807082c40304bc828f1b21712497a3c3c182672f698ca0e69750685a02c8917c91c1b0747bc301000000086365000000526500ffffffff45fdfd673c1af7cd2d4ef8e2f60c0813fb076145afa93f438b202763e0ca00cc0300000005ac6a00656affffffffb55dae2c23e70411f2556fda1122a2a425ba8d68bd00595204d08719bd71edfe02000000096363655153536553acffffffff0a743e84cc08ef7fc2f00e6a64f65778a4cf25b106f0faae740d8d07865a837f0200000008ac6a5300516a6353ffffffff046b6a5a03000000000089ecd4040000000006ac53ac65515318f3e60500000000056a6a515263aca792050000000007ac5100ac6a6aac0000000046eb11ea010000000000000000aab8950500000000690883ba90bf723e6335c618aae5fdee8cc56e1816259161903dd27d038509b46dbffcb6653db7effcfaa78081d3501ae4a94fe8e2a608d73a30b9b4ee38c58614cfefe615e1ac8126de9c8ef7d733d45c977fc694f5e4b995bd9f1655ac1f8300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c7cca0a833daca5c1bc6db60ed9dc26c0a21b7b6420121a1a12fa167d352df7eee02c9336d2aabed525e70960355e4a8bd2ac9698e9403fd69821b7676bd1214fb3f6d5b28930d67aa191f8825cdea034e88a7fde58bbdc486fa583cb82aa0a85ee8c4fa29de9dc0d1b4d2527c31bfe2b05825cb4ebacaf1106655b99310692d030416065cf49908ba06d8cab100522286625650daf1172e4d70a609f5658dc701021c224407d4ff4333d4ebe59422e5202a2873c2524c1a7ba9ca6d0eaaeeb925970a012bd74b438b2d4550a75077c1b880959532dc6e8a6d68dcddad356e771aac7eac0bbfb74c38a6db24b5185f3c5e15e42c5a48135c8173e576c095dcba996a5b021cc9cb8dc44225d3aa3f0c77e347ace78100a62578acfb4b1e9a93eec499fe9c0212ff22a5c2d46e5aab3b5ffcba3446bb367f2f1a8329ef749d08f4e18e2deeb2030210800368fe2196d768efc936b87adc9eca3e11d81b490bf0dfa4d35544ee63020fdd006daa64ba7738dbe8358bc9b87f4b467d45f9e562c6817d7be0872acacc0224a455f2e5d1baaef1bf37e62a7a1763e332905f51fed05ffdd200e93a7f3cc2ac72caa8cd120480be8025c711ac7eb371dbde6ef52d74cb99d20fda42920ad739bffe4406affea47db40a2903b53f7357e236f9e1d403003bddc317341e08d5bdc6437b89ed9f3e4f08977ec43f7ddbaee0187c6ed9af9fd75f2ed62b1929f315533604e1abc908008f4b9699bb9ccfefc1b976ebc2fd167819f0f757c9cce408c64c22d5d632f6019ec79434d76d8153eda0cef8a1475830325f997e78ec559581b21245c84db03f48553d3f62718714d31e9ee30618847aa1073d8add993711c3dfb67acd32a247b8d923b9db239bf2de9357aaa5a0f3743be6e422481eb54e3d0a60e4935b26b56fd9c246f63ad8d9aef0d3bc788b77d786fc07fd413a1817e1948e5470ce8d17ee0ffecd67e30a984283850052a9f9796e7f97c3aff819a685ec2ad22755e8ceef715e3eabef9fbf1a303f904c82faadce6571b775fa8a7728815c7d0b20e558bb851cbdd3b8abbd00d0c279c471d4b40fd5b60a11f3f83bee7413cab58371bc76ffcb1119001be098a34abe0f4ad3f32478a5530df486380fe95a71551def3ff03b92e61e9bc4de3b2e5707861729ce56c7a116049c2f050dd21144246fc058fbc80c148cf8d9a5e746221b2bb5ae18e216f98f09611b33c5efb207c269a2c8a1372c107c1eb49c246597e4b15653ff6ce3af223d423dce154a2e2c8c13a30c30c3e2eca60bb7999e0893cf8dbbffd28f400eadc0c08100c21598230ace52cdebcbbfdab06b0ab10849842c26fbe467ed92e492b3c6b97636051406e1f3d41a27ddcdc37f9755dbf31b56662e1014186ec267abc9c7e9f8a04dba124a0fbb458074aa9cf8190da4927f3a605ca44a58bb886e5868a2ed88237fd59add4cfea0a91a13039ad8b166cd98272a115aad4ce946d01316123755668829423f37a77f6c6b03ccc5af13fe6595c94ef38a1f955987ba21a1ad913595383cd21aa801c256233b103fee80d878ca3fb3fbee89ba331eb87e2124d11b1e71e968afb0dee689be2b90d8430f5f407baa64f06d5ba7aa00067ce766be0e5d65bb72fe414d80e3242b4458e4c3851b6cf6dd8070c3c21fd87d5877d3d34f4adca4f11b6b319e678078c06e33a9c709e548d0ce6953e6c11b27314451e2dcaccd3b7a9e422a2730dc9164a36c6bcc16c88d4469288635f7b8df01367df72535d57064c0414b343fda4d6520d766563fc0af9cf760bf81563e6e57263fec7d1b90d8edd326c9337f8ca232b24601a7a6ab6e157d9be74c2d7493d7c717800c9057237a7ce357f58458d938bd5db96ab147a80b9ceee1a964231fcb3f2a33f4cbe287ab35c1a9af1a331724c8ee30668d75384f1808d67d442a051dca70efaebf6ebdd1ffe480e87f0a59b96f4cdea2902608e1992ce60a99195bee01a61ce34657be26cb3fe7cdab330c2f521588a8ca21d5c70e1bac7c4720d2cbaeaf0d5c7e4c45956ff6257145e07808498f227745ccb097d57ef537aec35b43cdd08dcc2eca20f70b26cb0f86daa4bfcfcdc857d5576c148e9e82a7fbbb32b96ef5becae80d5187c1bf3c1798b740f029fb34c6d057ae2f9bfe2dbf9048acc8ee625f87f488b5cad8e5ae7b82f14a9d04179dc1e1db07dd60096ae857860ac6e74e6cdd96e029edff6ab1f5e30df272907629d8a7936913424bd913f7b142051f9adb9b03ba2ab58d0122301d461fa04d446677cda77268fe9003288a0725ce455e766b21b5f08638c1a22aa5a67a5534adeedadde93014cd04b07332838ad383064cfb2acd993994548e82632699839bb2638568a2fd6a7cfb52dffa63d8496462ba82d2c3676f7a002492a22285ef4583b32c02", "5353636a", 2, -260172855, "9c53765e7a966bef4362453874ea6505bcad36d4309721d8e32a2509234a1888"], - ["111ab01f012d9a0ae1f85423cab90e0f0c5ac4b603d93eab60b138b198bdc7c7c1541f30d50300000002ac51c40367ac019bcbff04000000000465ac00000000000001841d860200000000000000000000000071da46f81d3bace54fecea29295ebdd19ecad26238ed4ef902b43f795e009130a19908f3c547c8eaef13f88c69ee86c4efd66926daa502a0b434aa8064103027fb9bb8c9bc9c5deb2f1f3eff9bdf947fd3837be62074679047e8749229d6ae7700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eab7b5dafa4b9efe53906a9c95bce8a28e62606a185169a9aaec2c728a2c618b9abea11917219f62c9618d98d0050e87dd8bc948abd3f7c3e8b14a4f612d29617652a263417c864faffec335208eeadd46f63deb8e37f4fa926d0062386e8c501ed0cc8fd97d0537c39cd6a6353aa29b43eb4b91df67f6ea3dedd2e0a581b29e03046479411a4701de3e9cdf92d815523d8e1990422efb4028b9334eac87d16f93030d80986c4f0232c5eefde25a1c989775d00642743e8ae78ec7066f72af54a4200b07deb717ba8cd4ede6a9aa89e2c4bd08a4d32ce9f712edfca39edffb3fbd9358171c25f4d66ee0cf74afb8ad1b153f1580994601cd6234ba4c6fe583a609f2de03029cb3941e6791d3c60c4abb379009422273bfcd6a6ef8619d5699e143542b55031ae26472c85b9d275e2ed2272846d71bd81ee843e528ce4d7f7986c4f82feeb4021e23bb72863acd84e7744c2fc895d6b05e1a3d8b3d3122ed64b7f5ed0753bcdd020c46524e5fc4b501726564abd733036af7881191f317d995030bf3d7253b4c380317db8d7754a406cffe6f5b68fda7185e80d2ca62a4f3c4bc1f34b2aad3a96786ef9569f02a34e6b49023c3be1b2ab0c940b8b5f91e01c42fccc0ddec03e548787fc1abf4e5bf3915788cbebe1d840f5e13d6ad470e54f8fc38b543a0e0bc039e24f730d29227cbbeaad102cd4337131f98d40d1491161d08f4847feaa5ab4017d0172f5109edc1e331e1bc0a7384835765ebe43e3d86427284505d3a2a004c219b25a80f8be266e49a7529d97f12acf08eee9405d160c04777c38f3dad6657366ea68718aeda481a96a78d7eda212597cd46ea9c834635ee1b269492e641f74fe73695d7ed2a23368143e5e42992c7e6234ff09499d21282e2f9479991bcc36fa1fd68d024282aea3ce1273acc3764a6c2d7f17d4389b7423f7e50d7d7107f9087add65fe387306f82b9209b2f25374365cd19169eab9893ec27c1d0bc05ff6e59943cdfa4b29bb49624eea2f3e80ba659bdbd3c021a138cc3ddc1031912c78b1897e4adc7faec2550468519e79bffa33136d749e9294e1c1ec64d45003a1c3674a3556a9f234b2e9c223a4389dae3a36dc916a45c061eab4cd824d5a391919c7049807df24446fe1e47c7572f73dc199be69e4305b35a74455f4e4116ef988df1d12da7b5dec381a2e3dc0143ff334bc4562b39f5d52dd11f53e4c8d8e0efeeef956e8b9a007965d43b5a7d1546dccc3d8ded5b7693db78ee94296585843e68d0d63991ef99048439f44a5ec9bd490338310dc14151c789c939c33541966c811b70527454ac85528a6b682efb94e2461e9c8e799f16d2bfddb990d23737a82ec676836e397823508877dc28658d2dd2d9a4fb99996cd8436414258c146d8f53691b8cbd870db39cfd2b3123e0bf2e56d0cdbdcc856e7d5ccbcb39cd95cf042bbf5d0f2a3094412aa3f7012331908c1d37547dbc7224c3d2c8d78c5fdf46a7799837fddf7d9ac3afed700e65018937b112d91402ae3e97df5c6d7d2d22b09858d64b9020c1902915cfa24b3eb00cfa5ead62e79676cc337d73b00df0ca063d5a4f34a17006ce9d48c1e7526512c59a0eec94c18744f5ee6082583fc522ee9c2cc3d7a0174cc0bf42618f972824c73f05a6c0d2fd42a8ad5f4e295c27e3391d06b7465fa8273ac91f24b497f908019371160ebe3f6d58b486b67d592ab66716cb3b613fa424b1e65717ecb02a0873866e477cd64eb124e1f5acb74c14ffa1ca0e68bf23092b9694fefc7a7eeb6493cc90701086efe59649137d13656e19ec21ffa77ce826dc620f7f17b60e6863cc78e67a5413e15b33749cead118a080032bd7e8e787703403eef6111f8861a4fa2ecd79a139b95c5755c1cbbcb76358bf65cd7885101be75eaa795d3b164d40c1bc4d7e5e3db7f6675720b4db3d9949b7ae7ffd05be6da849fb9a70f69bf2e708662b60e027936b4d89b44f2eb46e85e8b59dcced4a8703b5f7b8f2225a0ff396a661f53dd3ffc470b6de45f1a54bf369c4cc713f0825fdc6040c1264b4f0928b6c20a99f01dceb321b7f7aac3ac0a04ba7abb1b69e07464637d6ca7752876e13fdbf0b349f7b19a8bdce59c542dc2f80a3aea0750294eec4ca044bc44758d382cacfa12793afb31a2f1a57240cd1c2935770ec0e8a117aa2a48a0424408a1e8837c37084be5832a2f811a3dc6019e6d6f3b6f6bb6e796c8eef198d0e78f1b83c8dc8af8c729f4ced5d3e8229dade6154bc63ddb5724dd3ee7298acf5749944b26a8dbfce2fc2990bf9d1b9957353f443ea922e2a63b0fb46d5ba7bb251cf0c403057760b96a2ff2abb36869e414b8814edfc8a4a7fe5367b8b3d5fc9ba5eaf198b5001acf48982a7bb386b42709c32883f5198aa36fff9263c17d08bd44559f0f1866808", "635152acac6a535251", 0, -2020339037, "da1002c217f22a8023791425b3d06656317c9b1d875939c41058afebed61a80c"], - ["030000807082c403018d98d169e994eb33b84b9fa2445eaa3ea41685e8d20cb28e3ea1ce86f1b8d5b70000000009ac53655263526551ac0b621414017492280000000000065352516500518bb49d7b00000000020000000000000000b373e20500000000776e5f15257ad8600032b282fa0586dcafeed05f0a17bc1f11ffa2008e2f9f0751cb37e5ea478107f99e710b8e881e22ba40371224d8e73e623f8c7b5649a588a9e58010acb6907ec820f1300bed1130dbe834336d9534c760e31748a315969e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001274e025936285739e27665b66e646b4d3c4d538c29a5cc4198d8d22f88e3cc99f642c2da347d95595d4a9144c8dd51deeaee97357b8264027df607fa76adbec9cbd1e4483a28e30e9223a04cf072dc8bff4a05261bc2ddda417bea1807c223b2b8f9a3fc88eb44e3a816e3cc6303b3d40dabca67fd73da3c0a7b5b27ca8a74f02071282da4bde5512d03291f48339264c9a7ca48bd721d0c4a0f2db931c9ef43d02272f2416610fbc69f68d527162474d0fb143ff4d350536ace96221fcc211960c0b0759214229bc2714baf5ee45bff3684f30073959e2f23ee62554ff32700ac51cb45c1845ceec09f90170e989459122f475b632bb6d802cd733ee0d018fb2ba0d0218c50c65907b1bf22ff6ee040978a71ac2ec3c9bedffd207d6aba7677c2d74a60317ceeb0619e542bcf68dffcbe0887a7190005d1c47b23c993690b894040a98a7022cebe52aab4129f2915e32cd9970acef2c81c2e4bdc687dfa202d8531e3d3dcb021fad8a38882c536ec2f8b374fede9861774826e23c296b9e7973ee1229afa048021057b75c550d4696852884e25b614bd30571ec8fc325e9bd1ec81f2ccc82a693541d6869a5ed7bf4cb2916167a41b605dc38217cd9e8d84a636eb21f0049a27bfb2e9b92e61450b9964245b1b10ca3baa25244451efe4144340a57a661c95dd71faaf518bcae20c5bbe760a156145ff9a6ec8fc886f619c7d02bbe0b68b9a2af9a7accf14cd829a884ae93de3a0944ee4b683e599f8847944d57dfc1cb59203966ed0912d51bfdb64da138e76ffc80828f95ede8ae2556d4519ae0cc88e6bc435104ab17100f7a9b2b1beea0cb9ccca6d3aafabd9e97f137494672e5a8995c4cfc63b2d9d8c09d755242193e4c236e85ab0bc14163dce257a2746b5b1223ce605003228ae82dc53d6380cfaf86ccf5dcd800368c79e64f9ffcc3c23bab8e3b5aa46adc1aaa81324c3121eeb532c49a59c3485d403e43c59d3606c1af92e60d295e519f9ec024a9834ff0d892b28d37ffe2dedfcca3ea99c9b2bd5ec2f72d890bee64f1a589d7bd34413a7369ad3f25683d525201b13866bf6cabe64d4dffe1fe92dfe571142ce77f1e595d07f385bfe0fca3f0b58d965a465270448e83829698b79829da9b7610c1bd527f08cb2f1da7b091c8061aef8e1443e8819e80fbabbefa0e99503f01e330a8f08c947a1ef97ec92472f0194b42d1fc16b924b4bfcc2713c263db30d5ed789b10f82e35548655836cb92790fee1c0cd205206b9ef2c276ca61d631a735c2dd9630f11937e6b56141d2c85c3c864f7a46f5d796c82947e15d8117d00ebd6c42f03d9ab6647ce8a6ab2ed9f83e9518833d47a3ad74293bae5430836a92ea5e84c22bedb440a3adbe9d2f9d72da6505c8f380c989bb0dd20233f715fbfff75153bb306b68c18216617625462cbcf19bd03aac0d5e644e7409d39217c1a7f51973ace62f8b5ddeac05a2293b7148f10de51cc862fb987efe14307496be6924394a71a29f224540e69ae1cd2c22dece5f9f22077ee287a7666656508d0c34afab111b04dc70842db2e95eeff7c4906d66cd7fa53307b4f554fc96deae511150fe4c3af5b583c3f03a46bf3fd392ae22091e67c0b0d6062ba8e4bc361889d98171e8568c50c59226c8486b810800cdc08297e82f9dc35c9954672acce1b6881c5b4453caadc6bbe6149aa40eb41fbff8d9c91d59eaa48f3576d50ff184be4272e15aa48267fcd26bd1653c3f0eca1c1e0ea30ba8de6d6d18a6da2b744cb11d4f632a7ca498d6e781e9f1f723aca802a2d679b3e307245ca8174bbf52af2d7f3498cf9553ddce097aa8da83ae5e1ca4c4546ba94ffdfa448653056be12ffe524ebf1c90c752da62e46008b151b345464408c4bdc4521032adabf2cb47abee536b8fa77c79014fc6cf011d7af45190c5f287d733554eb90d65103f3e6dd8c6903557c0a57cf41f7cbd234580f1b62e95db83ad72f22464ee55549c37205a894b6013dc6813a5919267703e7ae1479b1cddb5c8d1cf832ddd7136deb4b877ff14ea127a08839d8fd9b92157e6e85c9afd9c290f10f5c8415f1afacc391824cf12f4e76ca9df158c6e66ed702e1975eaaba738bb3abdeda75cef4edd8fdac94bc80e39d88260d2b3426ef9e9ffedc4e80aa55d66f795e42f23c3233dad8284238ea9ff7b355237d3d3a4d78c2cf28870dd28a44236ab8675f5eae06638b09c3ffd6ba7f22e21bc6e50de86f2acfe2745e8c55bbb5c3308e3f133415bb6e735edc248aeb95cdb3e883d8fef8929458a033010000000000000000000000008e0ba358e0f7ebcedc7b44c22f1a1542902ed279d3690de65139457b684330a2fba8e5232cbc1ef55f17ae931c3f407e162880fd34433bcbe01b4c7df2374e676db9d3c897e7f9aec7141640991b1c0fa750321acff5d98996423b3a97c09b3a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000871fbcb0c614811592146dba3b0bb3a2656a31ad2fcdec394bae08ef08c9e0b899f4d1552e95d7643a68ac7cac599dd20a66946894017158339d4cc5d24d8934032cc6fdd9bb051bc2a23454967e8a0caa86257e3cab85b83d4b445872430135bfdfdc5a57439cfb2e9dfb62ea5d51706a53ac2b2d25db32e3c7ab920a7452f70319aba92ef05124815c33aec8004cf9160cd436d6bac09f34d18cee0ab2fb5de80207c8fdf4a288b75f961458c44ff8ecc58f7fc5d6d1f53c235a90b00d04dc301b0b00285dfac200447c309f5ba26dbd1bd8e7001ff1362a510b31f561664e5e59be7ed95a1a138008bc64b4171c509c273adeff366570b59d7e5c7c75889b73dde603102c5d04753d0a48810e2951ff431688b50f23c7ee9a4fcee2179752a7dd6dd90208253a9c6003ae0cf7770772413b10adaf85ebc3c165cf2b08243ae31b12c77e030f76236c17f5740a43dca5b3bf485f3e90e88948f9cd84c7c117900c8a4b77550320cae149abf9b359dc02f15d9f3258f0f5a4a0596b21f2ae5d801d4b6a0beb7a0221512c0fbaab8b2ddb2744b1b3af826ad0259f47715759c44dfe791d1c477c34c4893cc3cd315d7588be970beb77a998e8d77514376d93ca268710be7bc0d7357fb5897e9bff88a7306512658c68668bbcd1d72ea7a6ab1783cfffec4c3699e144e4e58a18723c293a8ce7b974dd6ed752b40987be6afb9b5f89813a16b58f373f7bd5c6bc9b1c2f08000e456b4cbfce8ee9cde47a6b01d7d9fd7a0d4137bb33ec5bcd3185eb83b85ade8771bdf616d2e970832dac8c57b18f1e428415bd1fa78ebd87aebadc748bcbf356eb0fe98ce36c230fc33438a2944af911b0da9cd7304829b5354a697235164d19627ec7e0f452d11ada7801b968e71efb2bc85fa8816752443ff334cb531bf258b6fbce54937bcd27310cd3bcba53a2520120522b3353d40cb4cb7a179149368424f5dcd171ecfea35de0c8eded4aca95e7038f226eda4769427a4dc870d2c0f26a89540189351e43365d7d7e29ad2a8d292f96dac6b17ac1d1a1d5db5f06d12a06d147c696245875e8a0e0a92e5505a64e889f18fdeec046cc3f78dadcb1531924967176983490e823cff033744b4980dfa70b9ae50dc7df41651c4a501cfcd8e1bdc4cb6c213926f96904bf39d9d20775015046b82125a70691240c1c03c725b1c24965be5344f1d6b7148153c889211ea3bef43a04429b4c78d1c9f3c32a4caee53d8c59c7d31e78a54f94d12bd960b07f8c357fa1896e9a00c587838d90f1be332db3b86da5b2408b7be6fbbf23ae397de807d515518060a34ac28e1456b980f652a0db9801fd9900c2e6dd73bc617e13900697229164113074f75c01d6e768ff5d26111fd3e0dfc593c793bac2df23d4813c624bd28fa49c7f9269da8dd4d31d5430a6fd48f60acf3228038f569b9a1ce09533e3fd126109749746594808611aa3c2f8a36fa584ed270335cb19f7721953e8e1e90c3c0522f756d95b6e1abc94de1dc156ea9b8d33f3e595b1161802d22b0f85f1128138fa0805b2811f79f8bc6e8b1f6bea36d7df7a9c4a0fc3949e36a33dafdeb854aae54cddaf75b3d53040a802461865ed70cae2caeda9c870fa37c84d0bb704fb6272b0c4a2f25f7072160fc7681cd7c4ec145b912bc61ba6af97a3ab25849e7abfb7ad85e957a1aa734cc1355369250cedf3a74e0935ab96a9788ddaa97d4ffd913fd16c1a4a0f9899513de50499b2358a8fdd0be5b7da463fcbbd2b3a822065fbac64385015ed535278a8eb7cdae132362eff439e4caecb77eb2a6746f1381fab469f4befca329504702e40058ce2c95c49f30b86cf8001deff15d75b9a4d81567d02be61ff275e352c637a29e0ba340ed3ff4254046c1880608c76c4dd10237ac81576dad80a8001a07718303d03421cc85910ff5d59e15ce11977ee32be6f8cacf483fc2dc077d9e9aeda27428f2ef7cf6e2fae666aa5dd1b4138a723e836dcb21472accbfac8535f1ce5cdf46b4d008a9763daca3582b5c842b28977f53d82af1030997816f0802972c283d235e518a7ea01333d7c45ad07a4238d86b093fc47d255978809762b5cacadc6fdd1565e4ed0e8d54adf0410094792ecc99ad02abf528c9f5efc23c7d63cd83f8f9b13657cd5638d6a010e87f0dcfc909dce6ba109b7c0b5a7cfd8cda24e803611030d720a5001329ecc1c1294d878c40b7baa82986823e305c9e57fe58e22089f5d191cd31e543c1abd5a038d61d90a0244b6365332b965a05405ab04df0e24008fd2423b3e651c086bd9420a29835ee98a6fefaf733a327149bfc2d9fd3d70610d83d6e16becf43f021ce6a4c72eedf9daf71cf807856958f14a1d52c3d41b5c305798ccabe418732d40f564563812716aab84747c2dd79e34984fd03c0fb1320d", "ac636552", 0, 228952763, "e8b67f919ca93325517edc4332e17c0b5eb40ca887ab89e39f8a9d16cf17f625"], - ["030000807082c40301e330808d4b2899dc6674f6d262e93b8109a1c07373a8c5e853c6b03b032d204a010000000900ac51635251635300ffffffff04b4aea30000000000016ae25e32020000000003ac535381e58903000000000363630057dc5100000000000451510053000000000000000001a782a6030000000000000000000000004b85ec8c56d7cee641a4798290aa323caa5f0152a7ebf3cb10b5bdd741e9c1e8bfbfd135b7a43c17ec52f00bd15a40feb26f7ae033d11661a1d657d11e52d06b1a47d9953e84aff5766f23430d4b2d6cf4657fe74bd005da017d98e809f62b030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034e8a3fd4015dad88bdc53ef3c97a62e9402edf12d654ddef3e20ae7993df64c488966a2c046950b49814acf459a3cf8f9d2507fdf4e169245a95986189e2582cba232eec10e03fe7b4f7ccbbace19f657a177aee78e3d3d597c2f99ea2887971a670b4219628543c86f432e432c304cbfb2c18ef836262f1aa9fc32497145560329ed8845c89398bb8359a89f323c36015b7f63952119e590ecacca2e0e18a3b5022b5dbba7151102f2fe5f7a8e78980d1b81cfaefd65823a034da4317c84ba72e60a0204c5e89294f296e57bc1391ccdddfb81b0923b2be0e8452ab11789bc881d6c73ad47a05d662137e880c3aa1beb31195cea21d548c0005be6cd6acc4d2412c9031dcac4405d72e7a59d2ac0c46e985cd678e4a22f8dd36809d5548876e9cf69520301c5dc74a642e865721cb74d7177396ffafc8bc241f7d9710a725901dab385d7022c2095b2a878be78c7dd2d3bc5c4f69977dfe7c662bfd6a0a161b3e3fee7012a03112393f828ac6b513b2ff47960d3e8c661c32fcae9401bc6c7ef7d23929152b2021aae00a9c18deaeb3e7b343691b60e6a788fee9398abf32d8d82a6e057249941c87cebfdf4230f0b8f842a476a2030311c0119c4a93886867ebec028e244dd1c0b7c5b78b3b64dda0d79cc9f085247aeb22a82e1aaaf90bb20fc939c675f11eebd1418349b7cb4d166fd1deb2676783c5473e0fc54efcf2cf9227d0d73f54b54d264cbeb1d919abf00a8cad7712d183419ec7bc5da68d9f584de526006ba83100a7f064a8d0ce2dc8d358bbe985066889d577e56f819950e3cb29ee29e837a8fa4f46902dbf596c94166a03b22982f5cd406b90b2dff314c8fd5f663931f63000465aec73c34ab23681bf96b46c6ab7d309c1399068259dbe0a3dc2371dde25125316d506792a065e70c355a20d79883603a51a3d094add83a373a5308169b12c9b0e56d46c5a2946b1b5c4842a76d539f89751c0eb3401e6a7ab0dbbeccc795d5f61e44ecc0f5861cf1435a90eca193d59863b18583b24f5f7878fdda6344a2510f6a1b5a7c1681f100a2b47319904b75b415dde6b3f63147bcb05edd7f941a74f7f109d5ac98d6b9d7a76ef7455def0d31cacd3f939ba9d027126e3c3767bbe47dee817108d771033d33a007079093ddcd61e2d21c76148795695b0e95e713b2c75566a5479ba9de44414e7ae39567508c86ca18d54ad7f8d7e66aa67faddc9343f0bae700abff2a13b3590b4bcad5f3c64c6af05662165d01a74c5bc9be0c2d9d92d513d4c68b606ff3259e096492154213ebab75f02c9f9e959d4d8f3308098a0f19c907822bc1ba4a22b2fa65dbc315d7bff8c94aab1c6e5e0283405203a20d7bfbd3d8f38a739879d8614c1c0e26fc4c42ff53b333a616d854a93553fee30acc9e28877a8654d7272b66ca3fcd201af4d54c86500f4baad86bb839fd919b869f4310a184841ba4c34ce346dcd6834fcc152d9f8c443a699d1936dd6b6cf387316d55a0f6b7a51c46bd74cc9d50820d379ddafa025c2a37f39b2f7878c5894067e2fb46f92799227d10bf7e15bfd6642243b826f4812b52ca37e8d12ef218a04e1dc6e983025af365b0eed516521b2d9d057f803fdcebbac953cb49716ec39265c8c529536a34e486371febf187df7be42e8a76b35bdf137511b5ca388c2b7c403331094bbfda7771be0e10d142d4d2f88bdc05541353b885ec76355b47a2eb92c34abe81f8ae8707ecfeab8a89b7344f21de892fa757cf116d89e020d1398608cc67097a202b6ce11e31ea0973b44022b3db8eb41bb97e8925639683311fc1233b49f7903bbcda258902dbfff936297e142b76af8a2b04f2b915b63c7c8dd6f9d6b3c6ee96ccc777120d831db2c3c3bac6f0c8776aa995bf41ef0bcede06de10c6a3bd4b689fd633459b303cc40b41013f30b7e63366ce848d1710d8fcd2897274f7b762c01637e197d370be590b8f3c7454db0f0e4694a6d1bc501d145bc0cae883e46ba04a4bd906c3794172ab51dc134d85de22d3974017b8129afb6730c5ef1e25ba489c4110c9584b4533fa72759cba77b10a69ee59bb10e4e437746b918328bcee4d57b9961d14a4b2c1864d7ecf02f60bba6eddde2a2636fd9c2609ca4dea9e088f85c6acb72157d96b0ce73986463fbb74cb167301e355b302ef3e5e376bc836ff246441f17ccd73fa5edc393ddea648f326b3ce384410de03d4bc4066bd4d2203572fd7e761785f454600d3df75f54dbed474a01f398c9989e6e1dfafca34172ff83534dadc6be70d4b66845acb543b26d66e76150584930fb3a4e8859427e6a76c640f9b6b002083523687d344877cbc02cb0bf6af24da10e2f85675ef85138bee56d32c87db3b80ffdf109d4f261276d9cbef44737bc2561ff8bc765b4a9464f790aaa9cdcffbc0ad03", "6563", 0, 920978735, "011a43d55c4263fe53f7d42c64ef1d362c48b22e163c156cb906c9cc77f44c66"], - ["d5d4f3780259acc51360bf757820a4de9b15ed96fc5b0b4fe55373921517735bb3c850bd180100000002525203027a8063439676e7fdf771cd71d28521166b8ff4bb03d611b0ccce94316cae2bed40b900000000025300ffffffff0227afb6030000000007ac0051516a5265496cb5040000000008ac00ac6aac6365630000000000", "", 1, 1415274610, "d8025cfcd45afd92e8ea424f4eea6028bb761af0b7200bc618b37aaf8df61381"], - ["030000807082c40303ec471c2e7b091d57e93f09fb7056bce869bee120160df34d6d0ee705b050f4cf020000000453515365ffffffff895979a9c8ea0dc81ece71ca894747ad441ffcf23a5b8aaa34455fb23d4928e10100000003006a53ffffffff38f877035022a0fbef279dd16bd9a271148502d330121a7d0ca9c8566e9260290000000009ac63636a5353ac6a51a2747a7501dd09680100000000004629dc544dddee2d034f426904000000000000000000000000fcaefa5298a1373e7764199ca476b6d947412c63d27fc9eaa99e611956947fa4443a693455a88530849d1c171291a9f10308d9b64599285f092a547d90eeb050ec905f4b461e6b3988f9a38a3106fb988bdbb2a0217829734204789f8f6e2d6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a29160daee9e955dd0cecf2d83797c763d16a1e02a0037cb279fe7b6343a78f1eed417494b1375635a187c2759312a86eb99f20572837f33214f9da2f401784b1847d7aed252c4cd086aa526f8b9dd43852e38de6813839fbdd2cc5f67361eaf9eba937645bbc2a733877370d5c2bdf8bc00746de167bf6d0d4f7f7e0167aff503283e3c9fac618028f92d8dcd5705e64aa12574fd7e53e9cc3723c1a91899cc1c0224937d612a3b8ad10482e06a4e54f922986b1a05d8a65599ef7a1e29f2418bf00a06ff72466de6d49472d359c25b0c9472aa76b6dd72a100a6bdc53f01b9c9efc0c0c636311b14f726c2dd0e5812a7cee51a70c3a13165b63970563370ff11ad13031b7dc2c0903415627da77a80d37d542d9381f47cec094a9907173400bc3357cd031c9f4b5df56cac7151725c71e6c9cde33fc5b9e9a85a243cb71353aa530b1a57022177848f61218ad3ebb2d36fe731f52f0f0543f8d87b1ed8da03381a9e63da270319eb6e9ef3300d0ed85d4e3c82886defcf4240f79fbdfe9b02154be51e8a33e303244bf20e1636d63242875d39ff88cccb62add3358a7958de4584db8107fd8b04fe9b53d4363c68c88d7895bac345ff4ffa2e36f7f815ada6419180b10bf473b2691158da9913ddfb95dbc44bd4b3c494d08a3d6f1d762845cd5dd72012d4061290875de4994df1abbc8bdd6c5cdbe3a22ca4f7ed947357e5cac6673039f1dc39dc3cb8d8eaca9e438d2ad33f1b1d5e5980b9fde31e5f053489380b81a630802b3b196468d3eba98220bcd937d34954b8c2741b529f28b34162e6bf7972cc9c58ead5342985a29c905cbeb08010ead6a10bf5ef8ddc2cefa6c6730cc6c3fcb68bbaf2b23173d8c36d42acff7b0de0192f4286e6ba11637acee29a9d718177d8fe83995bef8a9ebc1d41bf2abeb59043ddbcd60322283cb87528c44dfaa9f2d32d4946b29b436961df2b8639adcc3121428aaf7396d459a582c0d4bdb811827d3ce621e805265c9c9cb9964104938dd28d2da0b697ae3adebcd9dbb19459a051aa573f5b1120f87e57120010dc174d4fd2c4358b2e095d0652d8c3d608f9df8db418f50f0068707ad1f3ed0c4a4c52bea079721a432095b52ed9f73b29f439116c8ca6c0e11aae66dadf4c89b59b50945714e91651b185040ffe98130138890cca38950020194731bcec8ff6a514fdf5ccf539d63354c53f5163ff2f2cb2286168606e6f68342a7bba9f2bdd5dc5be0dabc44bf642779ee1f209f3e10c1fa34f2984a7e5ad89d6b023d0d4302c88e2a975a6428e868f2d16fd1ac165cb242a9b52379bbd2ab60160971031a5047b89b1f8854ed2975db1e64ae1aab62d0c09378167674615194b4dc3662958a77e6828eafd1d5a597a71ad36a56bb30275bba02f24851e79b43c4e82128ed3addde6dbefbff581632b699d9c40644b111e53a7c91f4513664579e7a8589d8b152f9d8b185e2df0f063d5f9a4981bfb77d5b206dc3979cd3d77d9ebfc2d29279aaeabccf8ba47934645daba412528484a98d41e10c560c671443f5d92569cb32fc0872ccfcff0ea0ad2cdbe376e5c7a71ef00609a89cc38340fc70f502695f6d9528de42b2ebb89dd812428513c77e77eef025d2624a056407c8d0dc1d49ff47b0a464f599792ad60e1af1cc96205f3e7f5f63fcf218660e076db743ba2f09ffc88fe8d832be96f43287b01a53845f91ac39b18165cf004fb5d77ece3def0a591b8cbfe7034de2896f2635fecdf97475f91e4171dec709686fd742864458e12fc331e12e85ebaecea8aa775fe3707e299e90ae74c672e7bdb41f9b5f9873f67e94fbac3a09b7c95944a1596021c96aac30ee39330e461196ec917442d2233ad844847183f859b0c1049a3e8c6a85fb887c37fa255d36ea098cbed8be09458f6075677dfd76dee94e21f90b5e3fa8e7263ccb0f37e949bf0b395f746f743615a2cb63d2f859082eb26d8c54cd732360b03d9bc42c33ee50fc5f8742906258504bb12b261c85d80f70942a6d1c7041e328399e2b98fd5f958ec5423d89d5981d007455e950b6f505da206e5ce2dac20cff4ee89ebc0fcf4127a11205eeac9b836f783bc523374416da607bd783259966872e6fc0f6a7f668ca8461b3342d4485bbd1cd77004bd688e4c6ea08249389c6d4a137207d27cb567f7b1c6fa2fc8879847654056f91812ccbae52b631d87103d7cdb49d5dab4d96ba99ea4e5dc1bc3d2f65ec471de5a9d374855b3e78df3f4c84bc0c1c12fc59aa7975a0df23b01be8b596ee1d5be0b4f00000000000000000f525b05000000001657d5a20c2f4cc73d050d189991c9e8fa5680dfcbd4fd7162ad3bda6334aed16560be653f7e141f4d818fea57769ba9ba41e27b29f4fd146744ec9241bab21dee429f622b4c6ae52891a0f66a371c551c81706d8fd507f8331183c65c0d4ea1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009775ee1418ffd258e44415bcbd865beb607a894c5c61d20d7806b117dc98b54d51593fc569e38f195e8547ef3f05d38ea448baf7159a7eef737bd78651ca38d141975c0b384f451759a51368b676d8d156a4b886ca7870197cf1133d62182065c1fe276eb36fb73dd50ad727a0d454b20f048a07d9ecb93c4be96b201a5843e1030bc668d7e050490cc6e515da8a4fa63093ed293c9ce58ffd60263d556635bc8102213b730ab5da2ead39b58238d3fab3a168dd271326437f082eb57b8c2ca34ae80b05850aeaa4a1a26ee6dc4cb0433c7fc21327c6a0b24b638c68d7b8fdbf0c78fbf8053a3d708523addcebdc171b3cdce9f214e611abedc098ade07c33f0802ed7021371facb57e5d018b838ff5ede1ec9032d5d110c22b8b9ee3d27beb3387b0d18032c57099978a157e220bf83eb030423e76a154e82c9da6f77f3fe2356a8dfa3bf0215849788e889717be549d231fba2ba6cf0464bc141c9a6b5473ecd491e82d49c03098815965de6518f5d98bc5d773064365c7900c3596060ab3281377a4043e829032838874dfb60f1d59eb7692a926919de892e9ff0bc60887c2106dae8eba31b294cdf34bcc50741e05cfa6172a0cbe30663da888d8f37b872f0134e309c46befb5ea6270703684f57da43936f8988dd8625f5c92e7fd62a9bce3affc58b2af05a6fff832266831a7311298ea95cb9a697cd6cccb0e627a5ecf864e0a796cf226d2ae315212706dc8111a2eb3b43be1c56bdee5931e345fe6b3a3c1390a5528df216b83ab5e95fd69910fa0386f956d339ef921e2e7539d2b1edf069f2b1333ea9eae7d3f17f55653471f97cbb02e4324b0cab4a0204c55480c27a8e3cb6e2311022181ebdbf81e83d8c8c10a44efa535c51c3cafc4bb6ccb2bd77b70d07ac44f896df817dd3da75f956bf424b6f64911e791eab42d7813aa9a3bbe6e001d502456d747ac89393aca8a5c09aa23196f288f8364d6877b984d590f6e569bd5bdbaffe2e699d93e2f432b9d3e5cc09dd2db3902fc5278236550f85ef215312a5a4c2c07f25b2bfd80c78a33f8abb90290badb90b25719a71762b26517b3e259b7ece74cf55813b13d16aef76b6bb255df5bf9a483fd4a1ee3f51163f28e58c826224f8805b1678a775a74405f213140dbffa0922ffd5f4ac6f553f0e8ba81b887b958d9a0ef6805e03111f2bebe2c642c03170038c2a638fa68ac910fb942d877dbb08a8b3ac80e3f222e4053a0551a7efe45ac77bd54ca388a7f7a5002e3ac6df67bac4a4dedafa78a341a6c78a4f4247951295f20d598b9deac2ff8552b00df9f1d2fe8efd1de8ef512df74c20e88f0e39b5c6c0864f01e3e9e7363848a0fce7bdd1a4612536e1f47370631eb28523001e17ea18fef5d2508ee18919c2b8884c28f9dc7bf6a48975cc19ac29e555b6ca0f33cacfbcdde3839ae2daf5ec3de08f754a7b22b07721521ffba494b1f142626388b9f46f1797a2352ae7a9beb31d3f80a9d28f07cb21ddc6bef96d425b3ffa8ab08d7b30d44e725ff288a7d73b1926aba94baee8435899c5d264900f52e583829faee807f2c49f8d0469203f2b14bd64ed3af48ae460d387434328709633725e93c6b1a7a825902700d5de92abc625d8fb9a7dfd735a696865762cf89f9d6b84b0d92ae361b1d28894fb058d3cd1f2401418f52ab4c2ab7f901828e9224c5ea8a461ad41a573fecf7ec4d7e2eb023c18ceac3969d0850a3b7414db7fcb9b21d44ceb218bb972baeb8e6f6a9d394d18d44aca3535b5db55e33426a8503b2065ad628470272f9ed4651d93a1ecbc285be6bb59910b234ef3dbcef8aa133b6adbad8aeff011e6a336e190e6f199ad1d3937d3d9546616a5fa9e3ceb9ef708b7f528dcf7eee5f78715666d62919e40ce6f6f296203a032daf56fa5ade0051c9ee53a45d3a4e51912518a4544ebd442766194c7ff116e96654c07a372a39a7422ea13e42da9c249030a7be016a38dc9e1881ed2b3b9392e5ac9821b73c1ce6a7e246fa20ec9df6f27b74be316b2a9431e53713ae1c5329ad23dda70fa9007251292766f5aa65461e727ae65e4f8b8cc69a191c97fd1a1f1d2cf8a51ad41f4283d6fd8541d7b225a8ae7fff86728cd6a8f95e7766d74f5b0b086dca2e73723a5661d6f986dd0a6b19914708b53277b1c9f524c45303a05726f43d4468616f70dbe1ec227f7f67b0b9af3e1cb49b7efee37accfdbbaf1a7ee8a02b81e642f07fdd7269773a043ead78231b6dbf1a91d18605a08b2dfa83f99521836056ffff787b0e2f8ad86000000000000000034997600000000003db2f6d6044aa3dee272636b5755603b33ee15023a807773ddea459f625a2b7e9c6b52026ca525ade0588b01de34833849143ba00f9c6089512af18f13b485b57f4662270a146216281be22d6dd7c6cc129e3975504bd2cd084db38922e7b74200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f662fdac0bdc91ad93c58abbd3abff35bdcd4828182092166acb22d9ff3372f866660ac30281485dc2c41f32d65024354794bdad41d62b1e85a7b9ff6fcb0ffc596daced5f6829c74df4ac88f67ed2c8c7f10b518016bec3f618d5e976901ee6f6efb4c90cba5cca3c40bff44a8f602df1dc5400bee3e5af13aa22505ee85693031321c4ecb28ed6c898c52a4540416df67a34c80e01281d9d8f8a24a8cdb08e3e03230c0b040255705d0238cdc1d4a4e6df2fec14609760e9a7c499000c10732ff30a08b2168ad7968642777e29731e1baa6d6c291e1fa7d05465c193240978e8962b2dd77be01b108f2da8e619905d23df139444c3aada314f67e72c839f86993feb03166036a4828f7f035f56c6ab56e65fb54bde2f1c4f2006392f42b8fbfd5e3f70031a37a6c48375b8144a8894ee60c8e4ec23fa4fad1da2ec2d757daac0112ebc730309c272fa7d049581a5f4ffd83a87ab2213e9c4286b9d2bf062f7444c0aaa0c8d02069062dc14d0ecbc4883faf13160ce0e174ca3d816a6f47e66e8e2d7a36ee5ea0212765361bdb795e5e5855c5fb7d17388c98b530ee21814be2ad47c8b1882a6d71461a4d7802ac100ee6bd373ab600978c301e2eb9e47b9b213297b94081e50102bae2ac87e35f76288c88bc5d13b7fb1b43a611967a3c7e98194007aee63b6f28597b9dae04b7fa0d8c995034ad1fc608a379e4570afd01a96264a45eaa5753569fe7107a21a0619ccf7f3cc2cf721c0ca31f81c2458b90b1b81e6a14d9c98de8c5db95f1a9021667376dbfe15d09c674a3004647a30578b453db8bbe31256a6f080ff5f9f0d8ea939b14fc15344f9ea0d49d801debc65357429bcf20c9f167f3e7fa92420bc2ec5df6b07a20e9c767a497ac4e78472428332de90618359efcf2c7c1715ff03405abd9580401a72a14614d96d2f4574f1d5597a9788a8957ec5ab179bd126d6922aa87f58569966d986024340c54bca4574a388bfa8be79ebeb48c3b93bbf2234e0f9dc9a97e3be718f21a52c28b93e838e09d4dc9de136a0fd258283553e0e86ebc2d727a47a17508b1ef6a4fa4fd165943371e77451e9813f5fc9bddca0f1bab64b90e766adf85cf2e0fe10e3835652199e4c9d7cc2fc5a48b4025dbdb4dc439f47196e30e590d97f49e0657330952fdd797eed5e433538834b0c23afff982399a1a66d7261b5ef2b5e714335097e10819d5d0c7a674ab9841fccdb6dd9acfb84c8f416692812041b239886c486e211c8ab140d42892e1793d325679090ff46a79e69cf18f88a67d8b52cb478179801b0a06495f721cea954697038944441f3dda4f30ff9ea97c52d9f961d7382286da18250083705faacb18ea1ca559e00cd1b12ee8b61373b559446b4ed6b505ce09dc5cecdd5493ad4ad90a92c611ed517c1a30127b3ddb6c56a8b0bf836d389192c1c3cfbfc1ecab0d9e119f43e7dfc82c3382051eede0720daf59e16e8aaf4d5f3ff1ca18e2b112a0184c604a58826b296098151eb9614b232fb56fdb349c155b5069009cb44f2ae341322a0be2f678e75bbeaa071a434f0af16e96f812df47cf448163c90a9fb949b9b926061838fd941a06767cc3ef915197b33ec5f3250851bb8151a8e160af8128c5045794cfe9f345360138671228db2ce5e8d730fb64fbf08b05f4968722a9ceea4c8f27da0c558d6161600928e7a5d3b78e0c40e19fb036aedf32f6b25f9fc264416a2ec0e9f48b9418d2b37e315620f55c5513ae2788bcb88bbaf830c7b51993388f465d9feea140e7f29dead1210917d57d6c175ca2410830291d0d853703fad922354e014528bbb894b5198a50aa97bfdc553806c992fb14edc009288ea6f16a93d33630e05c2502c6e176e824de220e38644df6e5b9f5b4734ddc302c7af119a0909aa1b0c098d98b5a8f5c2172944a1dbcae398a2a6cc180612aa808e5dfb069934a766d525292941aeeba4d70ae59d2cc98739b9bc87ef39d2536e42f6c20e12ca4190579245d92adc0332653f317b409566503e12bece5daa076324d9f88b082a926aaa734a35d20d3a8275d0e75243b3eb6528c9b775305b00f07b5701d8a13c6f690cd542db74485ff5fcb3c12ad1d0bdf04a1a9030f10077019bf53eaf05072d2f8bfc952807111a04729a5dee1861de7fb767598a1e80d6f2ad39138208629fb83c813f13139c4713ae3441c8479fadd8075a742bf98a14f7c6cf54497587a291388ae710d76a9c20c65a033023994a53ae239fc3e8935545a65da9e48ce969b16fd96d61e51028924f34f63a948861d561622d8af3e34a8ee85f072e49e8a95cffee5e83c8d9fcebec7ea9499445b4659e5faec3fea046ccbe79f658de7d5d4f7577a79c428aacbb81da6e999130098bdcf3a02ded735ca30b941dd81e86de7dde213db64c7bdf855bcf0b", "6565", 2, -1271500570, "70a8a574dbac00a6d128cf2b0b0622e5686c2e58e0081debe598d14b2f23760e"], - ["030000807082c4030234f7901026cba6806fda5068131d6f11057a5f371ae7e28a9bb05d6f5402597301000000095265ac53000063ac65959134719791c5109f947404ce9bf4d89c313249aed6b05ebcaa4124c3b41ed8a042f24d0000000001acfb10b1e603ef6d5d0000000000056352636352a0262300000000000953000053515353630091bf4102000000000008196bd0000000000339945f05000000000000000000000000fd4e7b11532fad1c042aca24bd602bc57d11ff70f7e1a942a23177b000b41a25a83aa622e3b01e96667e405b65dc15ed496b1be7c3b8bb4473a5d7e6489290e1df73749f46f4ee0a9b227248abf48c8567130047f98aa2baa8d87f5be7b00a83000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ba3e13d2d86cb7d72459a589921f1b800d9afe244d4d37ecdbd5227f2b14b09f0812ec55310901fc25c06f98f8827a9d1773fa228e6b26ed79e1372c3a7aceaf4eaf5c4ec5e6c52820b584dc25a962eb23b4c65607220599b1fce3ba71a25597dd142117e69073cbfdaf93601b8333239f6674fcdfc36515ddd507ed691e87903266ec089128359da9b91043e0764c3e89ec8a9ee3661316a203526a144cf6869020ce052412822f02865017e86bda6b63b29f8d1920f545ef2992f1953be410e000a07ad78452b3426b2ab2f6958a3008df646a34ef24b75c0d658c279142237c722484012934cb599637cdd27e2e0e626d553a9472f6da7f2b7429f1cbc2bb2213d021658f548e641f9fe7547e2f72ee6e938e54f30a7e909795f42af37c825239e3f0216a8bae84d09f392497a5a4bf51ae230c4fd43da7876801f63f41d114db2a62b0227a429b18c360567ffd58ddf010bcf86afdf035cfde68a40bbff4a9c9417f720021d17fbae44e696d27fe094723e54ef3a804a6463c4adf2997d8d52e0758b156b030ff8fce55b973f0c9ff9e2dde2afecdeb9a53be0e20f982a54e9d183e4dfa08cfc0b79c28ae6f72942166443611fe653850cdee8cbd838aece77077e70e545df6bd16225553470b81d91cc1f5247fa0c73b229ba5455deb713cb15f9ac63dcfd51de60913b985969948d854337824566564ba49062dd09e09f49746d0264a57403b1886f00bf6d2847d789d39ea651aa2932704b84c4dea67cdf2404f1c2a597ef77d4f49718028fb05806932aa2071613056e40360de6ea193f6fd688391dc8d586c1f26a25f1923b9afdb0da2ff50f1e2c200b6243382ddbca25ce666c91b52e4f07aafb3810d421d210e68332ef0b1c5433cc2cc5aa8a3bfc1a540009951750207468bf4ec331d1dc0e68cabc09953106379bc686ac6f29034a4447e83d8f3be608c69b647be3e0433d031c00862a64b40db0b495ffd22860109945d5fb1cdcfcad7588c48ce7d6b60bcfec210e3e3922893f01c22436f64933a8a3a6faf9dfb5fe83de3afabf5645a58f17b2411a850825811d76c276b5902e0efedb12e6412c5d524eaaec47ab0c1fed1e77c774515a5340e00775b3f21f55a389cfce56e00b2fa30a185228e9ae1e9e08de107aed35fe92d9670417e94d51fa0cdc762b1e93a565761d32034e0c0e639786f1169fbb0c9cdc87fcc5649fc434ed382fb80f137256bc4c1091ddb00e426cee6a5c0127d55bd7c3d94e4330bbe4d65b01036acd308edf537e7bbdfe0cc2f32c310c69f74d94917b569f71c0c6401396d96d1c2bdb01189a6fefd178a596d4a3e2ecb70118a97064f3ccfee070b78314983d0197abf23b7edb35973be8489fededec4e65cd54bf3ff1af5d149a2fe747f47f43966dd88c4b4560fcd602d1545e3955ff4a9ddba09c3c0d3a8cdf909d3f33de1638cb4e80584bcd0bd4e48f1001e0293420cfd44dcdc73bb9e5f5cb3e65b0d8fc864b7f0542d9822f892ba48cdb2075eb820ef0a07bea81bd192ee04ee2a65fd0b367a8e44d080dc5a3235eb8397ae11a8663898d12ec73d7b995750c229f45d2fa9bf61176ce5744ce3bc0d2676b2ab8ae68451f09a31ff99878c348974917019651fd21a80cd5ead07b556bb31bf8f42f8abc01f398db6884b88dd9365a5e0718be4e6a373f8cb5ffff716052ae0a367984ba0b10c7cecba9ffb19629f1073ce1c9424916672b5282d8900d72eda272c22754220ec59fd8607e538447abc1abbc2c4c2a91b614ca40572d401bf18a2340484e408ed96c58dc6be84cbcfc7e46998a2cc614e58f360cdf6a040a4948ffc2f88909f3ce08e00c17c1273c332bb86a522d1442357e77fa269e7f51d3c949aa81b6663b0ff74bb9397cccbdc229b50d508534fce7f3fd39e67e90afb3a01175eaa63fb2f691b366ab5b561cf1ef483317fe70227362019c77ea877458f63c0691c1eb716ad5b3fdbd7dc89eca9571403c6f01a3e9ef2b41865771bc854faa8e33c3c506690f5a3fa11651da7fda3bf55f90a7f9913b07afb941a69e5d2b40b6c0c01c485b519e335e63f4c4147067b97a6eac3240a0fe31213fb5934b7d134095998b34c875aa82a4f40cf9608a998c2fc1c1126702794bec86b8f6b9aff5322883ba48d1249612dad9594b428c241606f8a7751722bd0cd17cf30bc1825a1891d4cf95ce669c38a3d56f0f7e8d04bd688162397c682649242a754a17506512fe96198612dbd4f457559fd11421b5855ff286d33a199e98bbe54d00ef27296500000000000000000869660300000000479df9f914919ba6ccb04f749e592da9b5600d282723e04569aa6dae99a349985138309f83c39bb395142c5d8e6ee9c3aa7443705fa73d2318ff28327db69effb1dc382aa4e65eb0dc3e644c0944185a5f63f361e3f17faf38cf5501efbe308d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e19de26ef438488c85c099fd91be859a1edb8b5df131008e6a23679c2cbe374512ced7d04bfa1d46fd8b0f7832fee71e4181bd118ce04f0928c1a88133bf089fb7bc84e995ec53b41cde3a2087bbd02680d367a96f20b9e583dec855edcb27ad77af85f8c13a4dc04bc82f458682552971951253d492a5496335f95d8a4c008003203d1c5733081c8fcd2817fd5b1c056daaeefb20ef54ae7a62f7fe34d3649154032b14975a5f0c526accbcca1e1d58f00e46a33e6a2e66e999b97a70323ac0722a0b07ba25c9ccede69165a972e17d713b42a5b4200a7cd7c07c45f7e4c4c7ba1bef06feb17271023f9ea57f4a5a6cc4f489f86c9d2805b2c9b05bbfed8cab41ea29020a82590611718c98cefb3b24cdff1079a2e33a5bd36a1c520db912912d9955f9020e8432bed05a7c23269c1ae2284d926f2f099504b78f9e5ae66f7bca6a39801a0201f94557b0622df226fea3016fd9fa9ceceb59c117434d65e41062cb2395cba90306e4929eecca9d05fb5c09966fc396a9ab25f4d648f4e0f434f961e160cf9d81020681671fb63b09103481fbbad9d3ec05fe13030c9c037b951082ce3e7a2e8b3a1698f89d21731917716bc71a3b19191453428e86e1d934ca18db772a258ce973df022ece85d35737dc49c10ed05452fd514accb2e6c697703da903ad11718f08888a01700d839f7664d9df69695acf0d5cf73b07066f04ab4443e0c0fd93c5182b5f2ffabdd9e498cb0d3801fa5a81dd7507cf2858c927e463bdc54a27e794af0d53027e956a1c96cafcb6a986c121bd7e35afc6596697686f6d17fa2534f8a990cc5a39280233ce182bc072daf079f3421107b319ec612a54a2a781bfb1dd5f87a28b779ec0a432a8d6a31bdb7c0b465f6b3c751caf840834b85e0198919be551e89cef78a18317ce34f66f159e1bdbcfdcd044a32efd4d71fb0cc63b40d14a5b3d467b7784913a1e865647ec1a567df9b86a6c56de0c96bb52012876bcbdde0799f5fdf9b9bdd467b44b176a1fcd3f3172cc402a2a0bdbda6edc0a872ff3d98d6093872601fdd407e3aefc0856d8465bbed6a2101eb4ba0c70f915b12e36a90345e26a9b2af4b6a61ca27c1609418c4a5ea9a22b96b3622e63495691d13aa6b44bf88cc9602d598bf197c8bdb7b37cda870052281ec9a48fc2200b086c171d23afb4525cceec218f5b13c1ad805ee9f16f19ee3c8cf672e25a362e18b907fdd5c32194855fc29ecb03d57509961dd07bb1acaad0bd2f710d30c82b1451d786a126d62d7b2dc337e4da995f672c23c05c49dd3ae31ef938f008867cab79ed35a8dd6dbd5fd3113b8304f55653a32b745573db74ab90c5e8d5f8d741c75d2795c28b735ee1c4f8848970be6ff13bd4b0b8b14e8d5c2a221459a15d53f8d9bdad089fd6d0c1d9fee28213277c5f23fa3b6f2360b25ae7f8cad78980ee2775b0d0b51356382d7776c1e5ec027f679a994fc33c04664a0007b0a9ef830695e3c9c0bef6a14c665fb5b07207d470189ff39fc88eafd481b092a175130a555268126a877f4324cd5720aef420575f704ede23207bb9c987423daf89be258da161576507a18075efb66f778e70851f82a347645852cef56d66cb44ab975ad38eef77997bde889f04e7fde2482ad5bd5ef604a38498829e5d9f1069738c6d426e545d2121ae06089fa7498f71378ea489536bccf07ef533b4c3c37a2896a44c5439ada485f7715afd7da7d940329d46ce7566be34a4848fe9a869faad369676b3a6fba5d2a9f25a3729dca76f08548c3fb74e4923cb751afe4406ffe33cd101b0f801e43417653bac3ff870add9a6b27dd6dbac34ca83e49889cef214bfdc4fd9803a75594d7220bff0417eb23da4b56cadfd63b1ebe40d10b7bfedf2093a0ab7064c63aea7138adc9ab792ea8204c350b84d37e6ce8935f49880cfb3bc64591b1c766682531f7294695245fbb0bf047cb4033a3048b4039a1f675b75b1f2381a6d6ab2c18f89437002aad8636f557f36c9a15fd8d6b6cf002bb8cad2cd91181af55d4e6330cd9d2f76d9bc389c6925967e1400561fb5ba2d83a4f396e0fae135e9e326a07a9bac3a2a6a63d7be21d5d5e807fe218efa153dc7892f0955ddbce6b8ea57c575770314dff718c8dabbdba406b5ca6b24448ddb9e34771c951d0bbe1c8d895a1dc1d1ce680ed8705e15fda301d71e75448b4c8209162f35c69f6d7cdc00e7a5a3b5cd1d9f321c6e90f021e5235202ee211423eb35e5170545d256ec4f2ad1b512a4f2617da7e5515047708753ac7dc5f2f69d0e02000000000000000000000000e7cc5e435d63d55c82d0bccc205a9cce93c4532fab4c54301cadb2cdbdb53577a849695d610fb806e73ac74aea03fde4e8520f5bb7274925e753cd0cd60b580ccba99417b58a33edf89c1e1cfefc52c98c8a36a97699fa333154fa9e3f8a7c60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b99b81a233edd3a6d05e8ea5fb4f4db53f891ccbb0b17e95578d06e359de0d0ecd3ede8af2a6053f226985a4c21e6b311fc3b09b3e94a2b691358021c0888b7ff842a5e3339b59e6516e3da80d7bd73566549b899f3287fddc35476f2149a2aa0a83c6d862c2faf4ee209ce4d9283d2bf15625b1fdd9ab51a1699a2b43ab8220315b943aa6f8154e0d716033481051c57b04d90734369f6cc6cb323b72a0b76a7032e86896bce11bf86cf744a3f6cef951f942f5c9ee5330f7861f667295a2a43ae0b02625693c261b1f11b0047553a77a355fe3f078a99f73c41f0c625990338a01b2ea8c889dc4932fef3dd0d67080977eb14057b473d1214d95c8694a61a5dbf3d03176dbbb76e06de90c3dcdc4e5dc4b9c48e2303fb3b8b53403b7102ac66895d21032b1e10950a6e893bd65e5c12e4f5a5121749655b274cae4a67bde08fcbb538400304c1d3ea7e10bb79f7afc97333394076a969afbf0f203f41fba207adbf1f4c05022f463ac0c2dc4fd58c667080e74e64dec27bd8d6511a377c016f22a5963dd4cf0201d8a71f4ff8b6aa442d52256b8d352d2783ba1e2e70116f70af86c0cfe693baa3f81692e9683a0cd84b3126e146086ade5ae3d625964a9bd13ac657daf9e505e931de4985c5448c6a4623a7a59d13a69940dc3a85aa715b21de3e162a0dcacadc1ab8cc8d1c05348352d549d4799b747dcfd9ef2af9006be404f61733127b3de1275da454205739cc305183d977a3cb4348310c554dce1df4d34ad281f8f0c3d1b5602fa36ce2663ecc9dfc26f7b80d3a129e94f331c2f5c3b0601ded7e68ddecba5fccc1bdf68a12d59cebbecebb6c607c49c4cd20f36e92cdf592916ad5f1a5e868a11d84439ada30a9918aa208ad01e4c84021bd0de6266f2d4a1a5433bac6d1002c95598718cdb856bcf457cdff756e000cee4192815ae86df7c21a24f7d5fac10da4b34446eae6ec77a5b3ffbfa6a167b89560f698854bbeba6fb413218005f8d53f4f4fd11c7beb2900a6a769b3c3dd97827b29446c49a6cc99948bd72314f9702af7cb8fb3347b8f7271ca452116e5a4c07916ad22855fc030181a91250b2bc9cd5ca0d93d9235cd9588e5e36727f7544c36c7b37e54e7c78ab74aabe2b10e5ab31b961bd8fd7bb822ce5619e95fe471ab778df90368000e840791e22b6bd3940f16ae9293f349aca8d480ad6bd57617312d5bc28fc5912d70290f84d49b7197dc912f44b58580c2240f442bd10b37cb6c2e08f25cd5f4774f4dc47d5d9ca7f6581d0f24fc379e10a267ab46dcf80de1124f1eb79193f54591ceb95aca2bebab5b60744ac23adbf0842a23bae84c8c0aa8864da3deb2555e71bac73bb520bfaa9c0743fd43fc40aa0bf2333bab7671a9b41ae8e30f6b81a44dddb4375f8e11132eac834f09089bc91f9c170ae7fba0824d35860a69609ea6c6a3b9daf9aaf5b815268e5ee25c4b007c6ab878dba589ea576cd9095fe82ab70cbd1736e4e17cd1c707cbba8285f785b8389dad28942f9e95b26314113e515b6fcdc43dfa3389c89a3baaa58ad16a44b4f8f594ab0bb2a2fe75d860977f46c3b18cb60a9e20f6020b927f4a07a3c83c0059317fb03d25a0a7b9d9e87eab2286d5f8430c585469cbb9bfcd587e16f96c46b0f787442e5d91d3dbea2e29d78e56fc051c66ccd33d2fdc0a606ae0aa6e6bd134bbadfb556057f1649676a2c26ceadfc6016fb290ea005094ab293adb9b950bb72b47cf65519f970a6d5679af744ce9db1c7f573673a2cf431c9a07ffda7e65c5194c8b9c046ee69023aab96d40154a2c20e7fec40b0cfe3f0953f4854927f8876b7886074346a2eb8f4969450601b1f0c4d7e49beb2520bdca3f572848601ea49b5cb761f8233da992abd5da56890825876c09a0fa90d71a39925c145469d2cdd9d5d7e8cfa01d929bb7cd6d70049b79c00ec085e82b74174c30c86ca63c7082987183de15710a4e5123ecfa7d38c299b3d037a189bf87810a2d2573e1a5fb391e52d916a56bdaafe9262824dff35a86abb34318df8a577ccd4e79289efb4d7f52d855e36f25039b3db3ddc686058ea5ab812ea2fb3ce5e9fcd1e6ff32b08fae5565530330b8efb2515d0cf9e2df0866d3cd09716bed73785c9ffe10338857ffb7dc2d30323c78bed8a0e3ebb148b24fd6076cd43ce78e6b548dbbd201eba734a52c67e262d96bf4278e30aac8c628b6620a23d4f77e1a56708be1cb32a93f67c3c0437c901dac970a1923679b0507c60149011f94bb0d5abfd92d394283c31c5e70250c4518e49ca0da8c81270dcd57a6a587f20f3ce685b6913f248646029b7f56cb4a79834e544ba1e5500d474915e438505ec761369de077a4c396e68893dbcc4a521865bf85e00b8e8a9fa878efcc2ad013bd6713009effa0e6cccc3bad04ad1a06", "5265535352630063ac", 1, 2076552670, "e06d912ef8c46f9db7db8ccdca3e3ba1b3eda2a33e2f0bf09a4fb602e7e8fec3"], - ["bbd44f5a0499b6bc99aef887f147045ed3f4e76fbb56aa792e66d44e126ed1934e60f732950100000003006551bb5b6ab8b5feac05d568851a0d5eeb04727fdd1f959ed131cb90cab40505a9776e3c865e01000000096351656a526aac6565ffffffffd7a15bc3f1175e7fc23fe72a506dd304fdd944c6d5e59a0b0b68d8ef65f82a6f000000000452530053632ba8aa62b1e58e00e30ff3c763e8056a1f0c7f5a8217179078f5a308cd660619c554a20100000004005365008a8505810123532d0500000000096551ac5263515251530000000000", "535363ac", 2, -256371987, "44e91c735220fc03057042c0f69d93b62b288431489103b36618937418859881"], - ["030000807082c4030293b3ac16a08328dddd335d3623019cb1469528f48036511a310797d93dc441ae02000000055100636a5303482501ffc6b889d107e22d84ce43e20231bc3fbb64e8ab8541f6e8e9d2bf2a2f8abd2f0200000007536a0063acacacffffffff040dcc52020000000007636363535165518d91550000000000065265516352523955f90100000000008d6b4d01000000000053ac5a443a48ec0303f28c9404000000000000000000000000201eada03a05fdd488492638e16c0dee3c83a2de0bd3e0f1cef4eff42a04425efae3a22515553ed2d85bd8161c2df4754d2134a9a5acd217f232953a4a53f82d0deb94a550da11282e1332a583efeef138d53670147ce8a7dc5f92755e9583e800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2813d09746672057d6cdb3dd46a18bb0a27d091762fe4e38896df1f7dc33f09d0e6f698c76981ea22081f65af420e8fe4c6426ce8f765e3c941fa29103522614c442e139b030a5a998800fa82ce13ef6319290681d27ba1950e15ad9b21cd55a799ee9dc9e1cff0dc072c58ec66f4b2b956c66b6e91748fa604b78562ebb8220207744e028d472f8345323eff445df94c4d9ffd50f83097702cbcc03d4b78c2e403305ec80ed2af1a816fa673da5c163343d70559d52de07f8aa67aab96e80b18a60a00ea233818b767f9abb455389da8950d98b4df347a8e0f33ea32009cac53bd2e18984bf072da2436fd3470796637f74aae124a4eaaba11bdb1a5d30a9ce87090031d97018cf3ce5883434463cccdbc84455dd8d38b0747aa0fec094abc0ec7871b031364dee729f4b0b82c27cd7142be9888bda57c2e5b9d830f9d2b8bc07d7e3c62030d933bc11517309ee7d757d91038ff5ff74f52b637c405d3d961004cc62476e7032e06772af378110f8e861211b3e197dd44612571f015ae8d2cc94fefee4ac2bd030c7e91050d92310e7a44c3d1c936bcc044dc86db411ac4f7f6615e1cf2048f7d77aed1cc474bde7603ff7a315afa80ba21a5c5f4920d27d75323711060f3c7b38cea1b01369205f4d96ac94e6c9d8c0c72dc44060ae54c5160c0fc24648e2004b0cff2074d0153b6ad46f5483e6016352a12a9619c674b5718e9187d9a6e6258b67c54384f2a63463d3838b95603850f4f96ff6506903d16f5808c80ebad2459ac10233356817af2eae583672f700dfeef6f3e867fdc6120736a2cef1cce0a4167c253ee96cf6161ec7de89dd824185e8d17f5f3652863abbf0fd01b5455f8dba3c67cf60c400b43daecc7e0dafccd3361fd15d433d33dbaa2153ee4066881227eee4a94fceb2551f4073c5eec6a12496056696992c148aeafcf059af85226630b0321f191793c9a69e079a9cc1cc94b4de1c817069c149cc5318178288f9bdb9726e2f8318ae31e0850a60af907baec45576f9507135822090cad52352fba049cdef5a9f6185b605a1e3ea01f10dbb98c55fda9188ee6e1da76526fec0dead9950d145fd97e82b7a0e67093a14350d25e47ac061679e7b46b164504766fba66cd759f0be227d933bb4f82fb988abe291436545f744deac0acc9d02dcbc51941d9b05fd0f98a91807c7cb84e3abff5d120922bad1f47771dabb5af2e7a44113eee6e4c9a7c3d8a94349463b6eee55ce2da64c0cb371c2e32238b8a8a81e7db4953638b5fb11069b283c26b5ae6c5d1dafa26466d930dac7e597bd8ae535d30da66c4f3d01742272e795941eac61eae8999f7eee48eb567e1d978ca9270b1a9a1b7e51dc870c4eddd6361fd7eca18da504af73975bcab527f13168a4d11b4a58cd81558e131f93750be91dfd720677cb5c8c12812a210c4cc8631290cbe2e3022734e0cd0d2be1ec6d318507be71b2a08a89ec28e7ed64978c3e1646a14f7ab531b67ae72605f2e25f77741c55878bb9632e571c8d63c3c610fd06adb91902bb1b1ccb481911fee1f87d4ce6984e76f68b4690cdf07b68161e8d2db1f07c3284bf86ac99bd9c16e4b373493d07ce463c6fb38ced7bb0b9df8269ff1f2a4f195451dd7e188f0c88fbf78b377c3f3cb8af9950ea85a3779194715654a5d820d634d8783ab5431edc0d7671a27b17d58a5bbec9c0f8400926e5b47d5f27595838971e2fd59892c15f671b3759c183b9a6db2df7d01f0ec177c29ecc35a265e5624e1ccb1c953929cd70b9acea5c2f2a075fb8983df1beb33229a6c1bf7a1fb17770789d421144d7c14445ff4bb6698f8d7e3dcc9680bb8a144c9022fd94e4eb727b282eed30ef4d134a6ebd58f8057b8654aaaf8a15a2ec4a55ddfedb6a8aef6e05ee9b2c388670b4f53ade3c3d4a140fb91a7e9533aa3d9965f4ca8dcdbc770dddc521f6800ae136d96a03272ea6f032ac550e2b00a43e522ae14e83a7797eca19c6ea828f87d3be3b287cd807fe1b49c7ac8e3ae3709d6a0d4ce51617bc60ff41d036bf68c52fa67e79a9b1384e2592f0f2729387eddad88e14194170e969184059bb2382dfd946ef7ad18c597e4f4474fafdf6beb246058a86c18073ffc7bb4e2713bbcba2560dd34ab57761af27f31e315fb24daa057ef557a1e292b9e7b14bc47a94f8832b79c17da88bcc8a1999dbe7b65a5312d02559a01ebca58dbd46f21d30c5a8cf664e5de52f4ca6316a185bef73748ec771d55f6c6a0c9c814f59edeb5af6c8eea24707667d19664aa7d23b0fd760000000000000000364c3100000000002ccb91e522e8399a31fb089fedacd5584536e0eeb8fd00dbb94b8cac71dd934cb7fdf19cd5945137488f405d1ebb6c2033b8dcb45e1aeb681007b88f8be4e968bfc48bea531035755cb52ed19140936a951dc5ab7b175880004f04b6fde879b2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d35a26c4f60ab3f6ccd9e6dab747bf4e1c6e17ebc51ae9dc4e8567b0d738c5efe436126c2062cf589df82efc2e848851dabfc470d05a5ac71cc5788a4b680f5e8bfaaccaf8c9c71cf13088562c8cd0dfd2ad334558523df8971171ab9c8948dd44c52870c53e047c7c8cb8953b3b26160f9e8f597e1d9ac5379c1118fb826a4031dfdfdec4e8712783b77211485b4fb60b43d93b2e4689367b4c1b906668d9217032f42aa3e9170c918341fc4c380b1a5583ee7193c6ef002136dea652e884bc05e0b02a8aad03b3a3ebf9f6516bf26105cdc5836696bc9fb134a5bf4a7f21f21fa9b06bcb2d5f7e0c3182e76060d5683e3baeb1708b687e6f3319df6f7facaeab3c2032e3d9e3ca44ba16f88fd41a0c828ffc0fa22ec9b1ada5e25a7ca66618fdb2e3b031d3a97e65d97f8bf77b8562beca46bebb7e89d08c5f82ac3ec67d039af8bfc51032b40c5267eb46074fd785fd4d91d43d3ddfb7e4e251b828597947bfc155052e303220de800472100fec9e7ca1f9dd2f9218bff01120e27cfe7de1887df0dc4b1f6032424fdb4616ad8a603f3a9a24ca0c6f2214344e42011a6348256992d0af11911e0f2163d8a5779d898f8e9bfb61173386380391b33b4e87fb719a37199ae0960ffb311d65f637181a97fd9a1ac6a66778de5f8254fdab9f2b33289ca6decb5f0a4bd936c60e5104b3622865b7d77e465379f06c18be517602db8a9a6f5247532ccaa1c135f7f0e0376f3b86e18a5f59a3c2e639c4b9e67984522f2bf26df6183e384226728ea4ecac7ea72a872a13d9b657a753e893d7c84dc47b90f12f6dcb86433ddae29e3c8d238568fbe581cbe387dd8cb7799936c2bd47c37ff8a532b653059a7c88caf440a252d367d9c98ae7923abb06d4f58af54dea056cd2651b08cabe8c962695a401b570039ff3eb3a869ca689a7b5915227fea21dd5c790795450155ba9e40b028b549666d8d1fdc3ae2f4d30dcbeda60f08cac68e541ca7d0d04afbd1a6f5e8b6d57ba0d80aa615ae684edf4b77ce535eb93ae52609fb02afcec23eac7b94a0c8286e430a460f5e3ea8dd97c92f6910dfa6cdf96d90982a07446337e8b465eab0f9fbb3be8b27606738e194bc8f8d03ff6cafd72b02e50c052f62ec860d282584f718cc9bd1b60e9cda562d7ff49de1a3644049588c4a82840624bd63ee2332348fc0fd6bb9a9bd5a93558fba278f71372c2db3b1b7dd8b0024b89eaf316e0bd95a21b5a89bbce3c0b6b4b1fa7cc385e8b896f93989e7c2412ecfcfde5b52b3117f20c709326c4ceb367218094882b26a2c6473d45ec1f8226bd43672a3a1262134a2e3bf62b2790c3b0b1fbc89346c94e02ab45c53893b7cc7faa6537223ab89b05072074951058b31f5b552705ca3afd6959f6cd83a8f3ac2861f096e44bb9ca24d13607aca4b3d6ff4320f689fc53502852d0b49fe5c5d72084762f01ffcdf4caac8f321a26cd1ae1fbeb51dfd748147ece02a9dbda56ea46aed177df8ef2b1fd2dff84abc349cdc0bd00373d1362e96d2ee103a34582c1b5d500b17c7d9ef406cd92ae07d4334865a170cd993d013fab66443d4d8704185cf7f03e5fdd400bf64df423d3d9ba8773c60924afd6f1f5b57237199762684767beae57c15aa7ac703a7e17ce3474b954f2222b7f9e5506e6123a5bc5a9f59c25e9a4538891462b6deca55b2d0a18211fb1168a1305b0673f38a4b9b3573eb350ff2b45148ff1964da1c295ece0daf96a7d2c6dfe4454068d39793373ced34b3eba1894c34dc549c477b50c8f59e8e6c7aa03029802dfd7448d09cd2bd00d20f74428098bc564aa75e270e10e19e6117f66f0677c8d34baee59eaa8219abf18d8e0d907964efb9e9631c341068a9bc494222e1758b5d347dd80e9609e1d75e4671943d6e55ad0004dfcafda3f2bdf1fd28a591e43a3aef6f8b305acd46709e42d54fd4a4067dbe53f7ec9f3c7f8f3ef69b176534725f267604dc544293e3b7105b32f9f266c8883414dfbac4e6ace790e1a967acd2b224bc9029b6d089bfd84da557cee8ae6eb7ca7606d0a8ddb2e86c2414699e25d1b77feea302667ac60918d01c238b49100986af2bd3f969178670ff0716f0bbef426a645ccce762da8bca5b04dd05193421553bd6d12cf6f693c715df14b9e50f88ac4c6dc076ce50f0874f0e930ae18b88fb10a546ff64f6253e860789b7117d9b8e7f462b8e1fd50fca4570881d3c88d20439cc0a324e7ba19bceeeb8f709eec938e8c84086c660c065aefc886ac47a7a1c0817f5f540dc6fe2e2f10000000000000000988cf0000000000058b934e69e691259c213688b9c7f041e7921a55d4bda0ac74ec8ce62fdedae3475514897b519451bc7ace86d15d03ac3f2aaef903ea26abaa2075c1c6e0e56e44d6677690489e0d2f5177583651e40b0c21e5704e429e90b07211e58b08dde7700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000892af30c4eff38c0060fa2008dd15f6d7434f254b585d525de490681084fd92629a1fd8fb5cc6ab0320adb35f527dff2f7f3cb2a7ac24d1834d3b219ca0a9341a5c2f608937a643d20d141ed4219d7a9a4e2ddfb6bfadb43a14c1271464f6562869bb3abcfa3bceb1440ea7f00b75a1a87a71f01cedb8e936de580da5c89c8eb031c96ac76d1a1d9b4a45157e08f36b2767dae0c7c4711363fa0c2b3d2e045afa90228f6ce60299dfdaf81cba4c8cd0686b3bd78ad4344eeb721bae54529b09e01f00a03ab5c251c4c354b9df0028d42dd0499335d41d9ce8b909b57571286077e8d18c264a7f7bd65321c7397ab2dcdb7a836b0e26607aa5d79b459a1618de37b8bf1032123ffc23cb84a21626d05c8a04781b172aa6ed5ca69c4c11710857c530e5eb2020d668bdeadad0e15c35fc07dd5b5d937eb63b49692b3a0cb345016b2c399626e030edff641aa55738ed2155e5a0af9dba7e15307279986c9f917c404fbb16e35050208462f11d51e0df893d1b07ead0ff85352501deae8bc261272c3ae5a8a3993740214a05f63a6fbf45163f512bc4973fb3e8fd8ae4f84fcbf3f16078b79f503e4076ebc6541779fedf408ec4f2a1ce42f2959a0574d557c559b7e173044f5bdd674ab732a3f9752c4e826410b1da8793e874d05f7dac663671c2577a23e96a932aa528c5d0c56e0dc384da42c2ae21e10e5dcfac9fb44a30288dc626547266ff51446013d072f28feb24664692aa1763314d3a1ad9f460e9421f1e0bcb6d74b162993b1367538bd7f1cbc911a7ca5c7b2b53d40801287eb710aeb35a047e3cea2009d6d156367e11116f4c9de9559c0bfa2c599b6a32c68bd35800017d0f35e1c270e8a928befb4f310f4a7320fe0a619d8056f101a2871ad1c759fb165e421970ee6dac8a900175fab3afdc7861c25b8296b410c4414d8e14bba97dc5db48991a2feba1993a8037b45368de0c2dc1a06dd35c873806bb92e481bfad6b78f64a4368bb6324cc1573e2e30c86bd73ce2370b60e05753840e662d32836cdd341dc4f2e0749f2145071cc7a8fb4f1e76b25020a8fa13a7cacefb85f90b56f9affdb68a71041e3ef25f215e277cd984f0b294683fd4cac5657786c52d07f230f6b8e337d69898bd2752cd2a4479dd8e7259186686d8b4637a1618b3d42b34c2c2b473b0d33f1e44757475ad1b842f07c1a74d9bbd0eeb032ae291f1588a55457bebcb1d118499de9d5246128f227be82ef709e4af92b57179af083d5fd1622dd82f61ea2b6e58a99c8ca3e899d148d0516b26182db3f7fcad863f655d3b394a500d93be8402e09ee2cbd9365fb81946996706becfe5e70c563ae0fbb5d5d911cee83ffbc2c12130ccf8ffeef884b670ca0401c88c6f8ebbf8d94963f7a0e5dfa0a3dd37d852d09861fa68d4dd00a6fe14cc714d78ac694336db2e0485f592c69ee3049c1c8293af5c09fe5508a05045e8dfb1ef676e9d7efcdfd646119de5a49f5b3d73293c009b882e4e2f1c8668ca4dfd1107aa9c75cf9658d7a3956629c20be2f571eacfb2ca32ee73ceaaad6416c582b4406241d8252a72d5b7e3bb760b44d47b57e62b6148c1372c8e2b054a6685fd2893c01fb7660cd3aa5b9095bc03e73390a42bdc1c0ff67b98a641dba28585f69771702ef9d8bb7d5334d0aa0998567bfd94ad5ce710497550651f8cfde9e9e3ae25a15e36be40fbae982942fe99f5b671c3eb71d578864c0688a10f73d7678712999079c2c62c3528d6015781b0f1805868f1c01004f8365a910440f2f7112527b424e24021093430be868e38f5112a418fcfc416e034bba70452ecd9425148148dc0ec0c15bf6b7dadb747cfb9f479f266d12dd756f732e019bd8f0e0bbd533d44f60284101445a0737c541a17158e11ac0f6d5c32fb037e321bb818cefd0a31a5096200929c3d2c7be1d6522ef6a58a0087c19b19d6328a7193263ca85847f79daaa7f19b5f3358bc8c0448fe7ad774a2fdfae92b4ea6fd5e441bdf9d012dddebd4c5890f9ec59d0cdfecd94d89637a8676ebaae7badffdf6c71b45b41d84af5ba684915f5eaa70909a8beda505fd86e85059bf6e19fbe08636c274395e2626debe4cfa4f6fd4d06f29b94ebe8716fb8a1b2c4b28372e53b9b58dbb7c6d8b50664e3db0f802181cac007aa772744d8ae84be63e7c019e9c09884d01dc8c5d734f2f9f0eb5fec9e934bac124113a951aaff8db46b002cf8c27bc72deb34824e55dcb68c3aa5db8e29509bab19728e2a0d4d13dcbe7400dca687157cc9dee12b9cb6889223b0128d5b2e62af0117a6881bd08d2dee009f2d1dad263e2b7d86efca9b1b82264d6adf17523e31e4f6109e74a3d4d29766a85d5fa223a114c589d8171c647128a860021ecae9e04868075770d3f2db7e0cd6d6e480289e541e058041f5301", "", 0, -623894374, "94311bae0245b0159ae795b1ee95c1d85e9c3657495e5715027f021f0fe19e50"], - ["030000807082c40302dc3674a8b9bca0010e470cdf42716ee3e14107002a5166b556fafb0832c7327b01000000055151ac6a5208c00b1bcb0ae85abd93dc9a0468512046cdd493d8c173cf73eb42fe4cc2bca58fb5d4af0100000000f37bac770202ccd80300000000002350d90200000000095265005165006a0052110de247c65aa9ee01000000000000000031be050400000000312828904b127e6d64ca1a83bcb6b8edde693c6e33724b38f28006f846da2d6d0c03fb9bed04251dc5f8f3e7136cc3a3cf20732b9b4d32273a4cba9608753ba3f6a1ce3ffd41dfcd51791a54ead1b20bd4b7f148e80e3df4d24b98b64631dc31000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001475654906c5420ff6af404442473c504b883e24a6d3c34edac7693aa664e1b7e45b489291af2642bb2dbe67bdf3a21fb3fb2531db4dfe1f08612730b2ebc101d883900295d82a5191a95a221cf7ab18219ee80d8f9bf07bb44512268aff11d24f07bc4d2411651d6058a223109cc3c9600bb7e58d441ebb4866869879ebaca40206c2d8ab1f5bda6e112ae0d3024e308f2ca28fa732ec8f81c2eeea07723ce6d70324072d4483033977a9813fc556ed9f90536cb5f97bbdc99f870ec8e37b7198010a08e15ca4aa8a026257ae6f834b3dd556096052bcc16f5c2c0aaca3d858c37f5f1246d17dddc6d274ab906801d6e5deef90a6e804400d9d1312292efeb7da60030214931d709370536e9d6d6640e017ba54cca3884e43448c6f737146ddd811971c032c15d9239c1d45ed8b3fb8c04d178c46b3ae29f84aa89cbdc95b87df1192a9500212dee546762116e5eb1ab9370148639fdc02f589cbd6844a67c9e12b7a548345022bd2ca8c1ab0b3f03976efb57c523c779fbb90ae5e4e7ee83c10db85cd6ecb45020ec64e575d5e98d820c75ce34d4a8a14e90d4b9f18e8e9309db086ad5cb947369849b3ab29fe8f6a00ca5ae856edb6961b8db82b90a2c83731d9a754f51e53b8a56a27b5aeca90833977473594a9f1d44fbe36d43ce9fa4f6f7de1dfd3e4698a4fe1058ca1e146a39da6ca80f65a41f7c32c1f71226189b756c5d629d524b91475de788277639bd27e062038f75e04482412f6583b44bec28a03fb9cfa39e8c5e22eb17dfb91978c682392d2a1d692c1d2f6a42f3aba1a3a15845d61b5d7d7f8e0e7be01986f529232a33673f698edd3236a6630f535cd3a56b4d8dee4834206c824eb8bf5eedfc96c1d0d5e0feb4c747c3b250fe33127dfd119b6792ddaac9a0c6689b90a441a8f2a0dcf1cda7a485583138e9049419d14950399ba4c551b1db224d2ab7937bdde9a3476f28c87f885df1f7e7cb6289e26d00ac8f2720e134cf4f18401c65ed1ea347e8043d4c6ba86fb04509383385c9ecf88519ee6a018e412f089a5f4622ed7a8699158bc987eb0233acd43bbd4d3cd8cc0a08dcde313f9b915866e22af1d8b0700746da07206604aae28f25fdb8d64d8713b6046c43de5199019eec527c8b5010383c4993bad7b11072c06f7bfac8341eaa94f80c1586bf41205ae3bb2c25ee1660d0089e39f547448e5d000b3b9232e7c1e76cc96972366ed3620befeda721ba40d11610f761a3efe62ad67414dfd8948bf4dec852bb6acbc74cf23a6449703a3203438d3e2121283f7ca468a5400aade6c2a124326781e2459b53ffde8955c48ce2ef26fa70486893755a6e8e5232f6a1510ec3f3a9fcaa87e3bd4eeb38b38623d096e04499d65f06da8138201cdfbc84648709c829c490fa239bc60f1da1fa5f02351e730bf2adcb87c4fd2e02d8b0e02dabea03a16f4ebdb9f53bb52ba9993940893b0fb35dcaca4e4f514308c6b82df95bf3b595c061156abe16ecd8b90f60861dc2dc36f057e0c087106b5e53ec6c33df2da4a9751db99128c39906f084cde9de9cb66ec749ee086d1f826de7c7f927032c9488bcd994bd7bd90922039b894cce0c8954a58ee9ca4ddf6a67b7ceef9890498a72bda3f6d6daa3320bc955a32556b007dc56b0c545b6948be02dc50dfec371740a5dc466165e2f8e0d7009bba6282b38b47385a4978a7fa510a29848231ef8384e0cc4cafff1abc8e688316867df4230a478a06709b9b8d30a2970107b9d63234fc3fa05415f96d4ca22ec7316b856db14d8cef7b08d1924af280a7b00ea5666714725bf4340352956600b0839ad1f4cc7b532f40cfbe3fbf973441a6b4d9f4add00b77fc44991922d418dde1124d32b11d476161696096d46f58ba74c0edc724dc04a919b27e78c9fbda2c70fbbd4f2682f15de54a36c0baa15e7b850d55569ac17911bdc5c36393d7571532d37cfcb616b9f10cd62e107e3066f8189af31f52680fd304a31ead477d39774b2b7dcddb7ce71144a2dc2ab97e458c8f52b5f0056cbe99a85aeec257c52220dd1f225d2b4eeb097d9701be1a2f4dc31fc83ea98ff6d79c70dcd34485dd8adeed2d216ac3d760075e1a4d4bedb081e90879866e4904a82ae959bee0a9a8544e62202c9d5d472b998277dcd1a23fa06f9369a01e217ece9e504c8b7a13f1af59cf760ddca07da1bf13e1468faf3b91084099020d8f1d1df4ca5922a37fd2dd56f726930438aa49fa0addc46d23921178691ff2267772fa588830cdd9f2d7a8fe066671b6544ef879ff610a54cd9c13adb1ad97b528534449a9837c6211a14b4cee1a37acde247de545d3a2a0bc3d2cd0cf6a95da7c54647adec4bdee63212e36c515a0b7cd97c2c2150af4b4b3d6e6cfa64e7facc2a08173cf5f51735febec6e51a4097559536707", "0051515352", 1, -1515639010, "4498aede46c9671d2e304c092477fe509744c747d6af47e119f143602fbc21a1"], - ["030000807082c403039c072a3337271f81fc8e6a2eafb6a84bf7d980699693371cf877dca4425f338801000000095353525351ac525151a2af307ed04fbe5a3f522517c4181dc4eab67cba2ad8abee4578fac9667e133cf5e40d1a0000000007636aac65536551d97364bedb39c77be742e78e185f23e38b2515932441aa330c91d716d9738b075e4a0d7c01000000026aac3af3780f0165869103000000000951ac655263656a6aac6701068bdbd297c402e46312000000000000000000000000001ef782a73f3416cd021ebd837ccb5d7c06ee2fed30d9e7305a2e9a48c1d4f3ed506cdac5538b11b19b2c29a8ff5736be5a094b869eeafd6560fc59dc61f0dea562c32d2f9402f26c4703a30910d68aa76e6e0c636b509a31522f64dbf70e763c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bc272d7a8dd6e0ff261d4c4a183f04a08b4ab28000c18f5d9cae3e42cdfec349e55e5fe122d0a7aace15ae121d2def17b836991fe66dcd99e42458b0903c87d2cf8811a6abc21b71bd96877cbdf4dc9f5045a4263846a958427957d921ad7b80c21f65ab3ed447575fd67c2bde2fd19704e77239eab5d1cf2ff82b25555602270314262936d863c23a16c33004599e06f99374eb3f3052c5cf6d8180a1728e6afe02195f8f51910a37469feb7fa5bbf81a84bfdcf74f301ba2b2b93c3568e6f3b13b0a08e598c38af5f6c9cc0d338f5e318d57c21f11727c18be16acf42e918325600abf49ef18ad93106e8272fb7d5c1c5cd8818378098a2b519d8db3255d4d64b857020896447a62904133e59c37d39abe0f958f0beaf9b19d5956d525c564c984fa3c0219fe13d201cf6d873b462903f7e63232e96ff1f92031d3a0260b4b6d62f9a682020bf678f8a39951527f4e50daab13e00c6b61e4239a1240d24162bfd1bcd8b06c0316d66c75ff95ddaab7ab5a4fbbc783f62e2dd3ce705b06c4e8e604d1eaece450031398d9652b125f13de6ae6b55bf4594039c720e2e301550110beac837c1815cd46e4d1457df4d43488811b3fc19632cd0380c7dd1ac40ea2a554027dd189968596b9c32a937c04b28ede18ace27ba3e2efdb2b8fb3f43fb3b4f356080f131b38e27063dcba61cd9e69717ad62240720dd46fa9c4d4ae65fe26696ab1bcb599e621903055470d2844bc6c9d5457cba6cbceac181cadeeb2131f8fe19d0539f55dcf1eed1c3a4b783d5d86264eb2b28da8c7db823abdf0a77dd15944fb2e17bd3fd684423e33a1fe472ddd85d62683c35c24cb1cd6a3f139a57df1c2193eba31d8ffca62c004058ab29797e524d85b8fc23c00dd42be1a55612ea89bb6b6fd98586a06f57c5676efdde2e1d5673599a6018493240983a8506cac0a4beafa18fb41bf8e8cd4887c51505cc4d9b76fb536b045a51b8ec6bf606e5058d5270eb34ce13a3f038a828a90872aea3d5ceeb9d2dc9fb4d6b665975a54114050fc40dd03a7643175726076c9be4af8113a8cdbb08743d528b15579c82b770615bd9eaeac46c6b9a957f5e5d8e65ba63c88ca1d0e852da6dfdbd69d06d5d1def076118019bff7674a6315acc3e121ab0d4f0df82e382ab0a8e5c7817e60c65823fe724ef08336951ee5ca6c8d906008bd90e250b0e685d975cc4aeb054a4be0fe9fe9e80cb3d0db3c483fa0d3fa3b17f1e8fe441d0fbe029fc6ecb6197e61eaa934351744c3276dac601e2c678fb057e770b09f8583d93924cc35c8f945dacda76dcb272763afbf073875f8b13c4590252165eb7f04d903e5e263a7b58110e7312bdf19679a1774c53a6e3f2523353a624f1bec945345aa741efc6dfbe7aaccc2e410cbc255577c0eda067b94f6135e1254905dcf5b7863725776f8b6b539151162412f20d60b8b04e5ffa7321bd80a5059516445e347b36f20265007e909ab310a4624707b2c329c74ab2b8fc8dd1f35fb133895e4a3c660e667609e938d6d46a7f4d29c195ad39950dc8a39b4d4118ec9113a92997eaf6fb07ce8435313a124b4707fe909a7f52b61e1d0ea29e04ef4962baeea98d978587e2ab20815730e5fd59d1bf47dc941b82733f029fdf2ca42cb629409e988ac75f8dde4f846da111f8c279a3a0878029127f5c4fae6db14dcfe00078446b5caaa21e7025f313d6516b3f9810ddf02e3ff57a21b7b21f57ac0d25292090fd418963f7580e54eeb798e9c0b69ff2f98a2b6bbcf480d6221097215203e39c717bdb2cf3cb06b5f2212bb48d5e5ef4bc76398fe1b30e46ba4cb256dcde1093146c075e9d982c495fdd9fb465c8acb84d1c7a67ca5774fc715d5132105774a70c1645d73a9c8aa1269f3ad65b20bed74defe093d2c2b3afc1033c2ddc456eb0dcd4870ec3bbb3728953d3b4bd4e41f3392bb40225cf217ce31ce8124d6d2c10157aadc57b8a8fe62b80fa0a176a07eeb726c399abef959459f6ec7a4db70b85cb5d21bf503264edf2b38411a780c80885baae6d14e0c3f8736abd686091423b878d3f0ec00679792fddf2a7c0f3f0750f8b19e5210ab1bdc3ae099161d1eab89f5a3b6b8499b9e88c9bf8bc687a616c6f13b1ab320ff126cea9c92d02eda03ba6591ca24c034e2b9565ee0ac9c335a132bffdbb2a28baad7e0bc84f0d3dc9c271645f69039820747416372ee9b80d3d7eb716ce777d41e5c0edf567aa2e2a438c9c0a93e49a3d36cce1dab159f047a0de34860651073f66936e2d4d6a09de79209d500000000000000006c47f4020000000071170401d5a33382ee461606a5db19e34b7a5d08906c2988d5f134eb46c8a409a632c93ea0b4f7414773d2f66897e78e6930cf02853c5646afabb9cad77aa39ad11d6ca04c2a39a0bd6b3f23553367860c8d39edb5f3b9c2c0e2810ceeaf06d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b6d267945df26ae75bc65da4745d41fd60e3ffd407f084bcac55ee872b9059b857a4c3c6965c164fdca17b80355bbf1f85a8cd36050bb5cfc7f733057ee40fa780ee2bd32ec6644cabd479fea053d7f1ab1da0b7e84f259a5ada7f0b934fac9b4ad017d62b81a262993289a59760e47f1b55617d39afdcc4e8740793689504b5030a6484de488a0fbe2972d54779427ed3ae34aff322e5428b7e32fa56a3116bd302271105ef82200880da7d800776d09f6dd5191c2eb0339a76264096430e51f8260b07ce51b817f21367dafb97cafaec571764e974668a7ae61f04e554b424ac06155c01fef5af8eedebe7862e66f0f1f2b2070ef53ad79bf997fc7613777791668a030db3c351a3f4a5a34fdb25a93fd8b076ffaa01874861a459e60eba9933bf4b130309016af0da281d8d22bd18585a0815b475be5b52a8745b959158ec2c2e178c80032df28fc70de0064d18a4b1c3fdfc1e87afbb0c5c85ff9465f2353fbc3882a4bc0220677a58e88c384c6caa4c658ee274dcc1d49b74abc9669767130a4b4cd53bd9031e6e033612fe26c22eb982c7fd7aeb3a751b3e47990cea4cd1fbfa024ec705ab04cb3c1db5c5941c64ac925ba5bf1f2ab01ac8a149a06c4d1c7c039abb5e44ac36ad4209f63fc5f3d053a53db18f9ca27b4e03557a8783145a54429915447374eae68b57f16750e6e560e035693122127aaa9140fea5562bc817314d4c068b8c962859301543cbcd1dba69ddae3ff77ed1d35d6d127f53105fb9c38855bad1b81d14000dce48d6ca7c9fc84b2d12efb683934204d67e86ce58958f490ba9a717a92f6dc53d8183473db5e3afb369801f99dc127e01065f14177169e39345deb916a9d70fa87a1059c00ad47eec73d572430d09dc53c805dc4c657642aeddea25e87ff7fd55d54844ec05ac8febf5607a449cb3991b3c7a1553203353fc9d22a768a5ef97c09fb192220203c5115c79b159ac1d54b533b213f4cc33d9a34e6fa9afaaa98e5f1bc724b470effa755b9883229988ee1e830e928622235f16d876aaac29f3b350d114f43832d28f071b22e209c6a6ec24565bda53b3b3c8a1ffffc38abac41e309517e35aa52b435bbe851f7d06453b53024c6ca561a6077037601a0a6b1cb22017e5dbface1f57c3aa718f49771f8513c67a6fdb35a1d298fb0ae6eac679ff330cbe2825ffc5d421e448b7b27e8263e282353b87f7848fe550485a781a957ae2c4931d1ff22b1911b9fcda2a151c459a88b323b6821aa08c841f3c6d5b26c1a4aa588fd25d50c21c51e8b40dfcbe9350e97b1e2ca1b59df4f97f3a9d7840e8335754e01098fb411ac1c67db175e4f63b51fbe97b1fa087ef00fa76956abaf868b4a501d37c913735b01368006d1c93f27800d7b1cc067a97bc94fba9f3282fb7c70cc136a983bb31ab5a69fc75f180189ad2fee668f8a4d0cc05d2bcc1c50606ead565aa99f440727055c19188bc71ad42ece341bb0b428fd4b6ac46ebcbfa2c5e415f6a2e3d322b9927b71d29ed52b7b6b02e61878be5770f72630db259b92fa40c7f8739e8ca771e954a0ad236494cca1204f4116816d3d020087d23dd6e3bacf5340ced075f0a03d46df0be56d40cd41ecab2ec798c57b5a76119e6655ae2da3e916dec3d419cabb06af5f3c4e3efaaeb1308e4a24d42653887696748fd289848950d62614704a20c644f9d174899014e24754d4a158f5f0d6621e1e19ed607aaa8789a89cb9c7c1161f0642e4a56e23ce381c512153991d98b8a00a4b8717b11fa6c8f714f0199433d68b0027cc83521580dc0db92cedd5d9e2714db656cefc88848dbd6ee6fbd9c9ae9e387c462699a1db10dc51032d4c0854ae4bd6d68ac3c8b3467acb53a2d5ec974232045f50df2857ed908c25ba35058367ab3dff517df8d4150874bb6fe9b7371d5a3bf53639b2149026eacfa016ceef0620fb0249ac3a2280b8985d81432b9aa3b63d75ca825e06dbfe8126a59a1acd7bc2448a587dbe7b5da2a72db6867e43976ed179139ee74b34d63428446c1b76ea229e0708af7271842d758e6bcf0d527849ac6eeb0fe12a0f24ffb29210e5efa81e2cb53ebfc6e6d6439b33b735665301197211311e474d15511c8634ea8b8e053479bb174d0b8875697eade1a7cc44be45608fe89deb0fed71505c6a48a299df84144486ca24cb5f549a035950e60f851f1e804c1caf9a415dca1bee9e0a6fcaede8f8e3e390cd97d6ad81ef1c2eaed7bda25aa9aae97299e9a18d39118896f6680f839035823307bd62165b4dfbd25ac1aa8a61ac69a206dbec2b10deff8c911010ff5e7b66a2827cd16848b854ff56f7b130a0a47b3c411af68ce4ce9d61a6a55db21c423b5cf13b0ef9f8626c2b2af85a11f3fe277c579ebf43c2d14967490b1f2104a111777c3b603d5f5cca82703", "ac526a636a5365", 0, -2120326453, "0e1edd52319bd616d4588477aa407a159505178e6b68872065fd490d2d8398a9"], - ["b9333c2b04506728f74c38f7d98c605433ceba61cbeced113545cefc788d243e4eaf2409d702000000015374ebd0553d4a1cc004555cd3190d185f74473d4fb27114d5d567112e3508c6f2119d222401000000001a54e25bbbc3d2d63275ed0c5869f494b77fa852e187675350bbd307d6eda7631cab623201000000020051ffffffffe187d220904ed3c9f141f0a3c9c95c58040ed20edbf77c40b2909dc6ea76e79e0200000005006565ac008fab87fe023c090f000000000005ac00005363445afd01000000000100000000000100000000000000001d7058030000000073460978266e65731761146f0924f3dd6f8f9692d190b972eb345c6c891c85f2c9e3d32310f030f300d11039c7aef440db2aeef9e1251275bd5f5666d43e20dd0c8d56d2496b89b5b6ff4c4cc19d58dc9ab1836f04fb086c51535717d2d026e40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052e82645b34e236045c371d66e296aea387fb7ea4119ea4cf12ba428424388762761c48fba0b28ce2fdd6c7d61e3a06945425320fea24b2c516b7c84e6bb52ad7b87a04da1c0aee5c05c730594561c02f7f26308ca7b6431b52d51d151aaebd8fb23268bf4e084c15d483a642950be15dafd7e7a62d11ad8e6f91b795444c3900326961634cc039a0c6bddb454c4b3b08e9a71532d4bdc7b7470272358b2896b150210c068eeca4cdc2b2737ae6cef4e916955382622278ee408ea57471cff5ef8ed0b076193276f3d7f5e72c5576db389eccdca453a143242119ea9730296a49351c06b46f44a727166ab8126be08c81dae0f3b7b11e744bf39b95727667d0244ebb7031166493427bb85bfc995b6c20261e9b27c4ceffd9161ab2b0d7cf7a10cf97163030316aefb3d7c24c7d33830ba78e8dd4e550d33542d0c013eac749ab780cd6eeb03063679f3a9c819feab94d5d96d4293f635f743b546ffa4d11039149f2c1149a60206c853e9c14ebc6a6ae6988ef5366120dca4ecacaba06bb33655d08f628c5c68032d91b0e6327806a7a46361d1edd247b48db2516273ac7e5aa8ff9ac5421cb9c1703610d68675e2330f1f012299b79030d6e972f36be895e7e62a5a011d53509048864a89f743d4cbb069eb5a84161b0fe0196fb0292863bfa964060bf9eaab4b7a51a4621d1a54119182aff3c8a6978dd3e774ef3b348af4079c3fb55a5873a2423354a134b588367daa1db235703ba639a9414aa7056fce9c645873f185402ff8dfd41de945dc927082db9937d8b61cdc7c27ca962f4cc02dbd0600140283132e6d913020ce375b6d829a76c6412ea86aa105c4bb5ba6ae853ba8dac6d2a9c97425f47db81b865d693b961e4b21c0c5de5749c46ed9ab2862133e5bff314f3a6fdbe2d82eff850ea340c1549718eed660447c05cf9f77f02e328bc04218b78164692a18bd96eff42b55a32514c5d73e350836a8c00be21c2427741e6145e5f68e62c0f8bcd23c7c9ec20f8297db0035177703d827443a206a6221b33f86b2275ede6230862c88246cb372610813cceff5735124c10a32fb85f6433701cc49065de9f170b03180780d35de6a8c016eee96753f5985bd98dab9b0c37258c1179bfd3e28b274ddeeede6cd7f3645129949b9e79bf6b69ba9ebdfd2e8da190afecbc2c69dea695f5b42e2b957a07f25875dcf321046739d7c4d1cf2425bd8e887186f334834a119174e481da7ec00b6255ea5d7977f2dcd6b89377e15b81b8cc0acbd2a3166f95cebebdc29b01fc148ff9d0b0a3fd48fb2b2bcd1ba069c2c0ad4c2b6ac766efbaaf4f41737287248307823c147ef41e11a47570540f6a60f477c495c24014605d9db13678b6e5e38b9b1b26edb8b249727b01949fa1dac0b945093114d8b5d8eb88cc92aacdb856caeadd2f3002684e347d88117be8b015fada4af6b9bb75e69f0572251b11de625b6f93a2350a341af07fc14a7c588be3178ad7a638c2ef016cbd6c06424d1ee2ac2e516ccc75e31b8b2435463cf0773685d949ec849a98bd1674ed8ae084cef6977739cd96c2acea9856473672bb404714589892ecdd1566f3bad17c74995c05e09871bc40d5ae12fe07906585c8fb4880cc8479609907f5bfb93a293b5c8bedf00e9f3db7f443ae2b56ff2809d895d77c6579bd4eaf6fd173e561ab2b520e690b5356fc7fd3708e65b63883ee07564238098f079026d485b101ba3051e5eb4626363f2f75c9b166cada8450b5bc556022dffb6a2202bbfcfd72c82fef6fdef84ca1597b843681973639dd772256a57ed728802d41e034a72fe7e50b14c2a062f54b43715a33cfd7908c40b9cda07a30081236d6b788d2199fa6bfc84f65c6f0060265b35f7fd43017717ffa3c7cc900fb66265e3aa55f0348a5c5eb76a27eb5060998f509d1c83a829435afaebb231e63995df52ed644b74cd3089abd04c1b671f61439f9b9a522e752e587e0fb923b2d51134c4d4a97145d57e3ecff309aaab2712d271f32b5ea99dfe6442904f592d1703040eedabfa0bc1799e67bfefb7b4e5d42970733fe408befc1dc8e557c66d40066376471f0c4934c3a0ede0a94dd0d9ccd0b1eddf1695c631c7b7f15b5b31ec11175b5172c356c33d82dd5bd95a9db4555f9551058a905ab2a40679a59daf80812662f3f42a6e3314cd52bd594c9a83986da95003e0955161bc3649d32a91f57c673280a94d84aa1c385eabc988961ee45299ebbe327ab86ca233b177669d6034e20739126865ccfbf34f7373d1177dd85a8669b402ccd942377adf818c80c858240c81523a967d66eb66c105f34ebb5ad7f40b7abf19a49c6f2fb57ed49bbe49c22a6e92b47db663b02213b7636fd38377a85559fdd443883ef0176857eea5d44871ab4bf455d53533ad0bc222cdea814ddc08", "6a526aac", 3, 1815363895, "858fbe83ac93dadf4a9f2ac2edce5342c154270e54c98340550d969f8a596018"], - ["6d19d44d0370372651f0cc4fc167177b8f5f6a22b460ebce1a37611f7c9065c6e04884f08a0100000004ac5352638f9b385f6897d8dfc63924fe35055176f8362209aac60d51f542d52e35e872012e19cdb102000000085300655265635151ffffffffd296a0fd4b2c5b5a43e2182785160333a24f9f774699ccfdbd220f91d2bed3cc0300000001acffffffff0247ebde03000000000553635251ac19b5b203000000000700535263526a630000000000", "6aacac0052", 1, -2002156524, "499cf005416714c3a67ae981568dcefa12381f925568099d435d793d5123271e"], - ["cbb06754041986622fe4fe28f2dc44970a2080f8afaa0987570dea019d136c5691648067890300000006636a65635253df61de427ce74c3b05b9e869ce0934b4f15aa698c5e7faca196f01c34190339067ac386803000000055300536a636e15849e9cfd2878d616c592e9febe1ee6255935d2447f0bf8bace7b4c2424d36653c03b0300000007ac635252656500a9bb5439f73cb391730526102923769b96f634596cc3c6d1af6e14119e7587f4c90b4dce02000000066a52525263009a1dd62802843f02050000000001651378d9000000000006ac0000ac525300000000034597490000000000000000000000000025651ff28353cf20c5675fa7f5ac71f3c03a5f0d4d3df5f61809d25bb5ee5bcd73df5db12dcf6620fd045daafa502ef81244a0dd48c61e4f557aa9d9e1397175780508dda87d22a6be343636e21ce8fa45d3fdbd9348b88dd01cd328a98804d200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff15d74058056d640e09235e597a2d208ef8d6cc4cbf3dd26351fd6d38e5836eef85f6da8f985c491ac6376f198832161b96d33d53ea2b3b598195f5e914725df045bd9cb6eb8ae2cd3f5ee322459be7cbfc903a56245e8b6cde30a9bcc165da2d9842241cc9f5efd77f44535c1be26e856c1e16c5c7326fa2482b40e75a2fd0020cba5751736f92cc22d4c376088d3e1dd8fafaf9dc3befabc70e38611a9972a6032aa600c53f9cf6f2b4ce18d67a224e673fb970309ef973fc128c96d98909d5d10b002995fcbad943d0d61b664730e10cc6aded3e779f7ea6de030219e3c7903c2b2c8d29a2ac85c4ec6fcb3f02ad38dba028a6e98cfab383215b4e412a9eb91d5503196a372bdd9ec26641e8e267e58031c3897eb41eb757b60ab36a1ed492d0027403088349a4b09fc5aae6bb038017ab8cbee01f00112e1bcf2e23002f7f29df28c60220e447f6fcca876a062668de8345e948e0f8550e5b788f0431413c933c9db4fa031bf97f9bd60259be0783735744c2b19d03fbd19014969d96052817db46d5d57e031514e13ef8acb3db3b9a816cf4f22033316bbd55dad8419b74a0dd206a3c92ee0691a70e8498a810fde2edb15dbebd2c694409891be70d1e69d14d890c73ec6b6e3838d26079556f2461c9f5a1d7be4cfee1691c35e4633d11af1bc247ca4f847f402bcd1201e8f561c00e45651e99c4996e9424c470bf79ddcf89f86215d727b4d7b2899b80ac3390f0de45cbe330eea0199358b31346a5ce1b2edc822821e419c7f1c27cdc8c7b60d6ef265214a576f840db1763a9a128e9681e70ea4d64195634da8a1b76ab66e6c26f840623e5dc12ba670c2335139f6282d305e37b4c4ed2cbda78f231eb604d448a16415fa9f4f9ba2b5087ce75ccb31f76a2f1b9ca1fc008a21a3ebdc13ce433fe16159f1521f19291b19a3cfec375972e15ee5e8e5ee8066c1375c97b18efc99e34abb5d751f4d261ef40437f37529fe868066c854294d3249edb768bc4488f09663d8df0bc8196b8571767df6f1ece2ba4838656b5287dc95bd76edde9d81759b7b6e29e90a8ee3ba7a232056190803f4824509727b0de22a2aa0c18d697d9ccd47940bcd22d481114b5571047b7a53cdfcb0a550a5f61de69685b3e06a2bac92c2765e78863da630c93a509531c3dbdc4a50921b00c3664f0f1778e0e2de12144de98defb9bce64e0b3487037d9e64ef2d2cfb835abfef7c744aa20816eb57ef0f2d2a684d245fcc44afe00984f4b944a3662c163e297068de51204905e2b287be6acc6b74d5fafc06097c70433353ce8d2d5ce38390a36586b2ef43d7934703258e3f56de032be3c2b48bdb5642842bbdb0b7d0b76a871c9d6bba64b6a0a7aa4688e092f2467dd6daf8e59d79ad8072f82786880d39831d86793ce9ea544c35b582f524fa1957e712df7dab7c067998e54c37366d19f212cd0c95597776f6ac632fa55d8859ad762176f07c841cae25c8441365a1abddf59c2f203a4ee7ce4e528e85843c5f6f42d02dfc82c6a8574d56843c9d65b304c1652756af84822278cf8a3d955968233440ff3540229de027797ea851064bf555b665e5cddfedc3cb6c689ae12d0283e1e980f7fc8f28224f598d455d25ce99d9c78bdd64c66b014eddf0099eef3f741b453d0324b64240a32650edfc0cc2dbf57e42fde1206280fbefa0192fae3d5eb6a28f09ed390534cc44afca1da18650b0a547e50fea9bd57c2de85fe98b7feac895d1b89eb4c8e7c54f049ddf02910fb238b2f5897d6d81db3d8aebe80860639f8b76ac644d439db913c5f25a78a0f889f76058c009fb88e192f678591256018b84fa58c1b92d965080e7b437e09e35be775314e4de30de56c318c2a99cb659238e6d7072a8c480006faed64cc0d82bf57c598a5c608ebe1cc20407df44dbc0bcc4ce8cfac0cb1b6b1cbc88514eaa352ab5dbdbd2198c5841d7813929d79697ae7f04e0f7c0a22c8c1fcba1456469251a02e338ae662491903f7765376f41de86e25095eba95fdb58e6ff21d949ecd3478c9beb754216a5e3adb260228e44cf1c195df9d2bbae0186f0e4adde1b6aac5c02cbf66f81b3c38e5ee56033ba7088d61af1d4c0a75b6577ef02e65daa08ef8d151283d65691db5cf165144d6b31f1ae7a7df402ec6baa2044fed95ba1caec962f5ccd71d34a6297800878c227eb8a5cd33dc34e724c099439d144f100565f91ddf13ad05aee82e4fdf54fc57f98ad8d42cf9dc243492c33bd50a81af11530237cd59113b151219b2a0d300d2729b775412040000000000000000000000005daa8b6789aa2639d98e0df4ecf460a918a28d867169508f6fbe691c5af9ef3570ade8e3af10a43a9442108b06867306e6f094b830a3243359d0c1690e486476bf7185e49d53162f8eab3f4b8c3637a275ae400bb78c17fab3fb499b4f3effbd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000716b5f044f7ed5b2c996028252bf3d80222415fa1185c4c133bf3b8c64ce85c0a87e893304aabb872e73d0026df216c1c818fa3c7b84023c36257663001efff721e03a1bbd5ac0c1e7bdf241fc017d8c96f0d1178546b6ee5cf4005d0e652f144d48829f90fcd7f14a14bb046c97400911073e69ebfc20d9262fdb763c38d916022f0cac366c8e5307ab933634038be0d189c27432c23f877b4af3b88e7332e9ef02218da60ea3f252192e260a96585ad669611f39a77cbaf69fdff966d7edd5e86c0b022fb65828161fb1e37d93b92059f46783f877e93b6cea65caa905374472a13ea23c84bfe29f781473a05e273acce18144f37ba1bd32d90a19e42e3e041cac3402080b229094358e2623bd1a64f7f060c9e6e36dcc0a7bed0896717a39528b06ca03202cb57a4cc4eabdda9e65bcd73498604bc7022224e18478ec8e138561ad092a0226b072a6370fca4b73bf83c20503270fedfa72a8af863ae24dc4bae0a4f110f3021bb2ef9240953e8324c63ad8cb358107466d03913425d2f772735acf75e55341030369bf7e1ec205a4289f286a7a5b86f6c16ebbcf80ffeab13e566014fac93690e870b18b3c9f28ea2e598a3ef5c08c85340ba1d526734dcf533f60a212ee7ec4664169352ad5beeb10fb5f40872702bfab6c8f3c190b7488e3912ed4ae639525ad4e31d58d9a86251ba90427113d00de7a2d2d4e3e609656cab5ccf0bd410ff875ab39d239aac029b8640e88f1ac78c51ffee047e54ca8f0848622640584e3009ae00894a6b02509f4dc1ab295bac7a41fb7e0cad113cf84f917b2fc0b8d41a72acd8de4992e34213b6c67da52709d31e62a2fe9fed17aa4e8209fb7785db355e849a75d4c882acaa16d722f7d25f751517bbe66149cb4378607ae1bc94113517eb407511344cc8c2cbbae5ec4011a0ead64c03d28fceddbd26663bde3f74e1602543cb81cbd4ae93d855ce84a1225d3b181390da2514e09ec14727cafaf5dd64de348fd6e6d5ec9a9fcecae1a2754099b3ae21cbb580356476ceec65d837d07b467ffbb69069a716f0e61fc45c4c82ab538cf4697789febea78ba04290f996f094b0d8aca4f9d2694b6db10753dcb637d5cd63f1e7d79a0a6b860863ab985e0542be38f0771845f91b2572c0daa15cb81f1f0aca9df2d5d0f3472f73819c676d1776d69ea331e36bc4f1d3e798f8a2d1ce02089000540294f8e9ab69a37f6468a494a5b2c85f20c9a0c3caadc87eea1593936d00d53a82f2e7cc8c250a8e04421ec43fc364b181e4faae7d1718be38f07598033eba281d730e7d496ff59c3beab5213cefc494330e6955eb231a4b9a111343bbdbd22a289ac48bb204f50249f5d203df73d1d2c9999126d6893eaca504ac8c38f64d7be50c88d34925d37137400ba3800ba497a72ddb362d4adb7f9784aa07d7bc4557898af9b5b6e5189099ca790b32a9ac3b87689b0b15be76c1115a8a95aeb073850fc2c2d1614c3b3e31403aa2b65a2acc1f0b67e959e1dee7594b13ac2d630dd880e02f3d09ab5fb55b82f8d657af659ca2a794e5151b8d14ad5781da1e59cadaf8b4f922b425f67c82b143dd15bee72ebbd73204ab14b5f26b4b858ff70c9b88f2e2771b919fb7777020f7debc95c6ade59f863f8dc039227bd6e8a17e6d86d81d8cfe2ac76c2114c59879cab50e31588a60a110a5aaf294759f75b33a6c666241cbe9a4dffa8067f540604d4b8d19121b3767745d718ffe40907fc0e678c822a710b578b6a5ccf2eccd6aa9f388b82770d9259112faa1889797df3d2be8c725dbdabeae38d0a91d2c61ad93c2825306257ac759c8860e368ace4c8e737e3ffd549fada505a88b48aff82d74d28fdb86b461794c76d6844814afb419c0b932dff7e8338c6f95f872611bdce5762f4552b7fd7e17f91c58482b48bf13190c18279bbcef1295ada305009df41d75c71a829e564b6be29459012eff84dbf64d9d38844293207025311d08cfc613103ce679c0152e85133a7fc2c8fb59c1cbb77fae6f65854e51b9d95c3bf91934c8e36207fb4801f4e8821192735bb5f2f67e0c4d028532bbb741e3c3104c22eaaba4b0ebce4a9fb7042328d87ad96624c24e4fbb6589b5fa71787bd8bf43eceac2247f3128a6c83ee8ca0d84d377d32695c468af98c7717d0968a4aba7f534fffbdfb2abc483b56c47a46e70d37bc60db47339284788abd9b15e109d5842470fd6e44c2d6e679e4cc967918706cb912a45c34e6c527e3b6ed1da7f56ed5b57250f29cb33b6e1e9fa30d40ddecc6c6860000000000000000a0ee6e030000000084a13a6c0553a4573ad0a8399a0348d103b66b65967dcacb32e76d45e12aca5bd1151f1d8e7e4f28c832792c89c99d3b64b1aba9c0a4e79d730a8e7b888e76f037e94274584ca749d653ccdaf93887d2f801d16654bb36203776533cb5d9e75f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001deaed7d0d3fe963caccc4b340c1972d06d624c53c28d3a0e9961ed1adff41dee657061bb80862676b62892586366058240698dd6823c374894eb174afd96f5c3ee67aa5e2ad290715b95af2f8ed447a972a5e501e04cb58171b6085fb152ef9b38c4d2cc035ae391388ce548dfe790b7af98850741b5b19e021d73227a769e9020e4d130a271f3028c9ae1da4f9726c24a4e22752c0586b4412bb3f86ed62d01d031e99b1cb3260e84ebaa3d4a184bc9bf86ea2cf184ff0b9881bbff7c04ee04d200a02af124a4c5a3cd8fdd7fc978b6e32a7230e9b59f8e92b4b7655a8e20c83c18145ae8ba0b1732fdacedf777a5bde892f0e7ca2a5b45d9e5edb324cff3023588e022da57abb401c0b28ef6f6da98b73b7584107b361ba22d6bc0f0642c79023dc96020a7eb7eb8f11ae3fd335a86cdb07d35839b97f687996f8b1c63dc1f6b4b06b52022e28bf4f712fca961b56ac5fafc2965483a247c0a042c907cc18dab8784deb2e031492ec643c86abfd3355efd1a0fac6622c0b4238650ae13d0ffe1d5f77b7e1360209df94b5469b085d856c9f7374961488e367c5146c0474e773531fcc3f13aa99f84e29112f1c731c0fef5aaedb3eb328ba952d6eed2317f4684b4e7a063cdcb76ffb434999a28b53139028ce7d464a08f72c54e7a0db0c7f8917d80ba3637588cdc907559e83bddcc3c4c2f58d04f285707d492acdfd0a5f01d5ac803db9e2e01d4b49c079acc7df0f714c7f31cddfe7a46134482fa274215c7580d6b3740af0a0365c3a25a2e2e9cc381a1f1057a977e128064f0b7d7f66d620a9b11ef810677d4c8608bae0d4e9ae72822eb71bfd351ff0a2ee9b079ab30a1801c4b8f5b47ce10be50c335ecce4c5990551b24027ee1a8e87f215440e6f3f590bdc2d354c252232770f0649e89d1bed62451bb27c056bb72990ac680a38f80ee037e0239c613438acd0a5088b33e0241ffdd01c65b0bc257d28e21e3dff0dae4a33397524461f571da9dee8df436e5b8bde98fe6c5ba62e9f67d4076fcc376f56825e305c44932cd2eb448945df3972cdcfb3ec25dfe2fff1d1d13251d16da3994a0f029cc3a7d93244a4b0099dff006d19fa28e54f101db362e6be80ef224628a6960649b42e8d6d1e21a5cf18bc0c98597cbc3603e8c14ab62b7c53e72cd43064040d5c5632d9e5d15f1c90d28938e01375484d65e9a589ddffc71f2fd944047a8f533243bddaf83d00a7a947a6a9de18c67f61c716f26a42aa0d0eeffe335512b12d25fb080f0e8f7f3439fe6f859ad35f9e4800a2d609a3f551d208e8d92801dafddd594788729012211c6a6b933d93ccb71d24b98fc8375e211ced4f15bd1984c74c3ade9f2132e1763a54bcd192110617438564e44b7b4a1a4edabf2c70923d362958cef4f7cf18b138f9c2c5ab0adbd579e2e4302960c2fdcee7df7b2ba6579945613b30008fc622ff0373fb84a87b630234f95878dfdb48c07b2354a18a01e1be26d6344b34ece4742552002c42f606a1fc42ad6f3db77f7f27292f0a6045518dde45e1a539194c8951e15eee0e4108a4ada138f1d7cf18f93db57cc643544489b917846a3bc37e8de2ab53a93f9813b011813cafd7eabed78873b45ace9bad5ba77d19bdc05abd3893a3560c9d3ca9bf9e490c255863b9e63bfdb37c475b5c913b03865ead447e822e9e87da3cd4938f0b0366460e4f7eacd274f7cf8ffaacfc5250eb973393976ae205d5b77da919c1b2334ea47eb945f8e28f958f3453cb9fb541253f28de2c307be8d221e24d992f34ecef3a1435bf4862a09658fd787435c46a46a9fded5155ce30a268381ab3d10e79f2c1965fd02b38a3ddef5fdfa979460a2351cf0791b1038d0a74f7e6af4aba7240fccc0d0682e0ec3bd1fc466b3c5719c6e968b43b24799d745b58257c9ba26cbf3cda247a0ca1599f29b3aa470b54a650f9b65da59abd241a4ea4e02c25149720975a0e9fb6601e8633579365df461e089e6b7dc44b316c41cb5f2b71d9ccc8412f606c51cb9008bd53c8a2a87a70920b3fbd81acbf74f10f75afaf4b6d02a345d8ff0835148e382a68041039fe343ac906ccf4b5088a0af8042c33958ba22f3bce0c71bf32b2720e32a3555119323bd928582d4e36987879253ae4d6133d6482bf3e0deafde0fd9381e4a60c669f44f4f665796bd20f3eefcae5dc4282fe12848765f068558f96824641f9506381b05246f3738df5dd018131e253bc033cd0415a493ba7494ad42ff7abd02ef61f781558893b12154abea9bb2d2f65d266dd357d007f09f15fa4f19e27f17b17b58b0a28c10c0ec424f37b568a0f064c5dc4359920a7a41c84ec6bafe0617bb7e4711ae2e7569158229b248ffb0efadb984c8ca53a339dfbe68b67525b2ba8c1fd56bec58794babca8b6220ffe91133741ce04", "", 3, -417884945, "269997c89c6f1ad339b329aecfba9dec74e3f98835d512230d63f22d39aa5a96"], - ["030000807082c403042f399ebe296c8b91dd7175f9cf01f529918c6ae63e13a93328b562af98605ac00100000000ffffffff11c4b927f7131cf8208fab2cb1a59ab882aaa7200887151fb33a6775cdcb6c4f0200000008ac006300516a6365419c4615c439adc9f47004ce43f129595360adf842b254f79f5160c3da6a8e4688f604ac03000000025251ffffffff00f4043105065c25f24d5cbe112c2af865bc674c839c03f9fe39d6d79ff7e05603000000060000535300aca6ba268001459dc5000000000005ac655300007276257000000000010000000000000000a139d90000000000e59f7bbaefbd78c385d8716ecd182e6f2c63ce01ed57191d625c378c607eb152cc5df0b1893fba67a4d180eec53d7939d2a607e1c61b2fa92ac14fcb2eab4344c721cb544d30086c13ab1066a592de1e63527b1b86372a5d2c70621d165a673e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008106dbde43e6e90019a08e28f1ae4d5f3f7a59800cf35421cdb0037c6c0e9c97141ce5597dcd793f646815e9a770c8ba8a87ebbe7dd7605fded29220c1ebb500722813123a9a65481b2b2d448ed54cd33b5f1502e729fb62911705c86882a8e5f2bf576f59d6e04f4f1961166014b24b931a416cd00460dc47cc0ea2815a3343032faee9c2fe2393eb8a201c68a55412bb1e0b4ea8ae21fef0115d481b12a6fec5030724f4ab8b5a94dce679e9d4668ac41e11858c8b2ea4be9263e950275c54d7ad0b04d60952a8c8ba891dc6a7be5156e292c41b33d98974369afe4f0d2807868ff34b5299320f2519876e85697c8486d5da46f860f50c125866b00e58229c48f82103186008b4d398f324eb9fa77e59ab0cf7c570225178f4b757d72d375187e9f8ae031c0248368ef5c74eacfd1cbc747c92b1b7dde6a28bedb6b3b5ed3b4c59ac9318030e38ec1d12c362fb69cf80a5b7f2f8dfb8599cada4a4126e6ddabd6ac32f598b020a1da90b0fb6f229d9a7953796124de52f6e3a35b8dbcb26f58a09a5f41765640312d5bae3fff627d374fe1ac983667f396db97fb236371caf7362c09483e7fdfb46c6cc91c44c6e97b710c550a0f11e96ce247d0a881328d95c3e89785320a1574f234e8109db8cc4f3c49081e7e4bfa836a98e0850f7ed5955778b10dfc827adefe644ea291379352f531c24b86d075c89834111618ac47327fb4707527833d7289421ace4daf4cef44d3f6eb5b319138a16be7121a4e87dfb0fa1612f3e99fed3e9567462b173f55b1c5e52a46e39499fcc2ffcea4f7c7153c660c4cf255c0ad0d11b3b6cb923cf4f190e5bb3784be677511fa41ad198f85632659fe60ccce6c0756bcd70f6d0246fda5b408abdcb1c177eb502b00aaa5b8588cb616a21d774d1fc1526f938106e5b5cc143a812a7acb41e733afa6b32af87ac736caafe1a71a41e081581322d1c2bfb59f676f5887158e2cc7cf066ba98f07e4eb7144ec79c949895399c7be45afeaa6ce1e0272912bc9a21338b89110db0605bfa21c1ae48a04b7319954865b198489711af1467b3451d5679ce8919c1ee43e73b8be126733b83f86cb0611e7ab47f74c0b55d6efca0460b879e890fb1d2ecbbd8c5cd6a3724bc25d30d89e0d576f2feb3b8a9fabcb1ed8d8d216aedaa9c0f16dd299c1258af52a959806b3b20591769be5958b0921d4f12ed00802064039c7cbf513f1a0475e8375bc3c3af7c0cf6c2e70ebc147ae38557d051c08f1023069be962e9d4840aaac6fb77cf11d2b146666de928c7fe3b086eb038b64c3ad661cb3f5b93d752440f7da2a2f4b5fa91fb291789658af854b0e178511bb11468fedbe98a60152cabdb2dccc26b71652ac573a46a8b0aa674bb24d3a71dbb1110f54208e838d0c15ce2550ac6c78728dc0ffe5072085ce6bc2a52af56b3785f182f476a4ae48659a9081c3a5a558c4467c4c21d893c8ea684e8990d7f79fbb9f0d51909c29b0b3bb8c94380c28b7352daf2f8b3314879aae1afcb0e0890691e8bb861c318afc2dd358f2fc03274910878c64a530e58e9ecb5fe14190848f5556e1bb1ba654c92e5db6f78617665991eb8e19344b30f4357d0e3fbaae3177659e4cd6e96980d53e2fe293c904f8066387e5c03e444dabd7fca0972d08a14b21011a00278f1e4f23fd4c9aa8284b3764c6a53134f19f440cfe20d5dd9690b79c5d710f773da5e5d56981934e2c8962474a83e1ff2acd53f942d24333943cdb75c80fded87d5eafb40cbb071bea5814886fffb4d03502c0850dc6220c7984f6760ecf06b45ae1540a6a1b916b4712b7d241819ede0f4ba12afbbf62620477ddb557b84b047cc939a60a415c7365b543295d81f483ca94017eddc3a9e2b571b655064f72a3162c3f0db9f2b1a2c10b2427425d3d3c2db3bdd705ac53afc17687df5c2275b26dcdc573341c326ef488b5f968764432435f613d0ca6cb5c57b75bf6ca086fb803c9e331e14489f1cc592e80aa799536ca4d497283e1dfb270c2dfe896586ce359faef2f179fe10c57a8505ad6491804da061b2de9756efe35818b7b7b2d2e2c985ccce6747fb3d7ee502dbe37bf8b5cc3ce3e1f90d3c857e264de9e148b3a663e633f4e4ea20d3c32596918f37e2fdccbfc4e1a7097b327e21c7e91469dcf16c6781c5a34ba63b9015108c4a34dae6a3bfdc11930537866ca36239f506f7ecdbc8a309e77c5f318b5151f5ba618f2ea7e01f12f38ff043048ab60f099215a9b484a075d42d71a4828a877706973758eac5716b79e62dcab97971b2160f62a20f01f672c475e274554e7bc35722efeaa43993a336f768e46bcc4dad2e5e900584e3da96e300de0600a86f8aa4ef7b53f59ae4e28be10c501bfefb0d1cf7cb0234aff18f02cbf2b3c9837d1ae4e1672b640ce9e10cbc0b", "526a", 1, 1452916809, "2c8516815547fe6e0c470bc6931947b97e9d1693f3f0423611a775db169a46dc"], - ["030000807082c403025ac2d11fb0ac10cc60633c9c6cfb1dbb6cb8f5e674f32603258dcc5af5219fe70200000002ac63ffffffffdfa3f525487586d3e347659d29040c78109e4aa982cd210db60aba2f9a04830b01000000096363acac6a5265526a6a1e4e5702fda2b200000000000563006365004195d7020000000006525265ac520018f43e220000000003b2684a050000000000000000000000002ca1dc07d964b1fce9ca2b75c683dbb415d0b7ad486abd34ac7dec4208e69406e9e450c34e7159f54e8965e0978034cea4985669f5448eed83ab0e661bbebc488266626204c863387e886c1868eef26596de9dc66df3b9d32d2b53a638bb1e1800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e9a5281abe56e3dad7201b9bacdcd13d572daa3de83e8ab7f0f9b7bdf8a56277868714ca6b4dde2e67951107a5e0f679b585a08c13a4e395a4bace5cba6384a309a9502dc85048ac6859abdcaf460c299acbe885ceb37b7e6c7854db63bc57478005944410b2ee5bfa8bd0a653a4fe0d55a560479af23adeaf1e0a1972d648ac03071d610ad9d61973413f4242cc0a853b02c0516673b60ee1a9d306bd392a412f0225e5b0b1a41704df4c43c63eba5fbb6a82cd4622b9c865abf5721d474abd39ee0b060f11c2b45e06256994c55e1b15842bd16172eb49c511eeb27b44bcfd1e678cfc008fdd9a54c4b2942d03732021046963d26fd01b51c71aa5cea4e69ab61a0f03108fb336c47007fc299ce972686edc689861479752e2d2b0be980d651748ee4302231d16bf4414f059d044341d1cf2c105f08613b220a201140e741afd35d0d8c503208a6dd2216ea66f62bdf188b588f4bb9b4e45c2d40b065ca362b9fb77ebf784022811472aba78aef61494137faaf7c68e3e31b15d20bb07ecceac478cf85c3c7803044cea972a66e0c44e3fbc7ea2e83ac35021bd458d8a570a1899af39a4521197f649aa3758cb7cbee9a41872426d67edb7f3ca9aba0e75178fb0ce835a999e090bb39308ccb72e3fd31b6d4667c209ba9fa428ce5c87c26042ecb558e8cc1bcc6097a1859f59adb65e27beb4d71cc115b5de51b161007c532de1ee5deb64f6c827b51bed18a5073668670b2cb4e02537db83b518f21ec09286d5868f929b3712738f83b0f5b6a3390513820764b25aef66ecf73fcc303f2d3b80d2d24997f649149c6942d0b5334a703f1ff968126c4c5f03978813248cc269eb6a2a3f10cc2cdb32649e4fc98530a4b34b522e6ffd9603437c81985230e4917a48aff66f06644efa30ed3f13e505a11f3deb46f28a0c0520b1ce0ae2599bbbfdb444eb78a19bcd9629f5808cf9da17545b8ec2ab2ea761d91133ea7fcee92bd6dca787ba8085e3e1c81233943fa3a196dd67600c34d08d0a2b41fc77f4d648359698943a0983d4f222cbc80d7f370849a506931a0c18b5f7be9cd02e93e0a489bc40f8f2af308783793be6d7cb37dd5e33341ed95267b58d8a496fe4870045e67bae451c0d20891e54b7e0c64e25859dd8de4f21bab0a27c79e06a7dd533ebeb326cdf8bd0d803249dd156352d8df39c0ad8ae9a8ee9f798e1e0078c5ea36d8284579b13b83c46959efbb7e9e055efd089e6a7d881eeb26b1de8803d41a282bfffd14b0be2231829ebdc992a0c3a8aa6fb29c599629ca62c543f10cc72584fbcda582ebec8e079b2903429e448dd62d9888a54da5b92b6d43d31ae8e3390f60ac51d63fd8472b3ae4f4f1946f1ac2a804bb0effee7844222922e57b2507ec30f5fb3c97e74c5bb020be5ed35215bf790e205a4fbd30d2d679b86efdf680403c0cc005534d7e533569d947634c80eeb4a637fe7da432af281168688a525c3ef503edcf24765db69a3bbb1159492ea37e896fff7cc84985b3439dce22a10241f4797d0327c01f0f4688e9ada994f64cb92c20f342e9cf839c7bcc51993cdf4b4495f3fcdf54a24ca243e279b1b52c8cb7430f2026f5af902b09f13b7e04a1889707e34f558be78098ab7f1ce28b133e082de35d587dd899c83f46f974e57ac059386073adaec654745795c5465916797ea8d9ceb1d452c1de5e422541f4bcbd46ce324cbed2ffc7c303c96873b64f2038b7f8a5c0cb954b23768531c71bc612633425981e303ccb08a9ba4ab53bbd5e5e13be557b995d0c7bf86defd2af88bace8a3c236aa9af8df4781562a8a17fc8bf7fd46ffdca60fca921f11ff8f1d4cadb55f31f9e844f99f9f6f77d8dc7f99164f3ed653dcd13adc6603d028cf8dfc197b9c6bd4d7c57f8c865c9f182f4c11ba1b9651df25416aaf777631594e5e17ebaec129caabb32f63f6ce034f0bfff48df20f2aeb2928633eaf28fa71a249b78e9a18285e56ab9d760f67d810abd6797f2d55fbd72e799629d4595426836c750935704f66c750b443d0179f4e195cfbbb6ef550682b01abcc1d8ed5a98b9423f6bf51da6d9d333991803cb07c4fc10aa18569dec8b227ff993278d26b94c6ebed87492583c6e00c7a6416d8929cb035a6aac5ab0379af155c69ef785174e4a18df6d48e36eec7663c1ef64416576cec9b6321048bbcde8766977214a9c15bd62d75c0afcf595314ecebc845d268241c83d33edec98e842b413369c8d6d2382d5cf1e8498eea84832630b31a1b3af5fc9828923a61613d10ea440000000000000000340f2a04000000006b7cd52626748f82805e6ec6bd190f9a4c354f97526c433789aafd1392fe55c6384d30f165c51130730ea956443870edf777bdfcbdfdce38e18b675449049cb9d4051d2b12e6fda7a8fa64cba47be62dcaea114665a9a5e32f22e4ec53ff56de00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd0f710938ce156731046c911d7e39fe0aff562c93e9af4f5e19a0668f325aed2a1ea507c29b694cd2274e71be688bf5252e7e56ea932a3564bcdb94ee015361423a505f222aa6017bd38b25455eacf7ba1f0db349c9dfc84b592fd8cd11858d4e7a18ce7238b6100bf158dced502464f5784a86e55cdb2ef1ccb39ebea07a41032a07912781dc088c85bc1726940105326a214fda31bda5e9d975c9abcb25e0aa02200f21a53e8f7fa26670fd13f0c78b63031972b62535a97bc7c8715e35d213280b00b8e151a63b6626b6358c4fa94ec52178739c156e97c887c7e1009a5cbe935cd22ca9219e158587f1255a77af0ac8226f3500e004e9a9a20d95f7890a06b5ec02146e16da0cceab97b11cbaa2c315fd6e1a0f7f7dd61add1245ef1b1a84f96385030f0d24cdc3d374730d5a0a05edfa47f2db14df13446734a868daff4ffdddfdf8032d150c37d14e9d2104e11241d6e4aca25110dee5e14e5efe0ed571d5e9f53212032ae8c7be82f1dd3d9b13759c93d070dabeeb5932298d94b282c6d0f9f4cf2fbc032bea1d389e272392d1444accebb5182f146b6749994515de12367def25883deeac01dc58f17709da31816ef23573ee02b1fd56694f3a7a153efe898866b5e571b9aaf8a88c31ea522ad7bfc787a25ba456d0f562fc6c2502befd7f8f4ac34bc4030c7eac87b42981e71c5c5971f35a3946815a451b8e5c998341b25f3150b45fbfd64ca4efac377fba596e18441c7f85eddc6702fa957cd0bc79952e01358f1322997fd18f9cc165178d7ecdc52ee173b092d796b9c717306ce8de7e8f2b680864dd871316bb07a12d4acf0718f266cffbfa2ebd68243796512e002f2a1e84b475eaced5cad615dbaaf221b3202aaac52f3e75d3616b96e081d4c9da41c698a7a30860692ef893c1d9be4a59801a16b37386d5b2ddacc5aaed805e40bd91fe8cb5b31bd91a31bfa883d28c270e67797e1edc78585dba6df4500988faa19fc23d9cdbcc8d9a6b088257dc6c312ba008bfaeb10944a0b27464561d7d932c1c65318b4b02002ebd3dd2013b19bfecc5782faa176dee652df6c6e39c905dbd216098c6ed3220d45f37174555ef02689cff7c798d919b900de4a377cae67bfd947255a1919168167939789ec0c869631c7b013e4db727ded2851ab47c562a8c0fe1f8a238cbbe3c2452d9c7c564a002d26e3ac484e4dc8930c8a8a748c1b417a84a54ce50c37f951ec9e25ee6c0b080711064dbd1d92f71dc50e9c563f3635a79f316e5374cbeb820d44994b63860e6e2773234162a3fdbb467da8dc52bf91605a2528b6e926177a00ef48085b0bf676181c25c2ad9cdbd262810abfdda135fd9ce53ba57c554278c3f42c17e2aad71d7704f043a90a7d24feab2a4c824961955614aac1bde2040376d061c9386b54f0c0cca3b7bcf39b6fa80f7a0b94022cd6a86a609621e143d51f3bcbb5c15293a4c9f096c0ceee1d4c7d87183204727dda91a23b29d572ba46f3e6be8b14d2c240705f71767c7afda16f4f718d7aca417a8feac54d2e4e825353cb61e66217187f9c0c7319648de141b8159e8f42dfb1fd4d543d2eefa4dc151d2ec1cd8e44b48efef54c2c9d58f89958a9bc73b897898bd717092d636bd94e97c151845c6d5d4fc3b5f3fbf46ce90784e36161427d4210f6799751ff4bc8803ab5745e68fa560473d59f909929d3b8f17e0f366a8c05315cc27dfa914a4acc32a896523dfbefaba5e8b7686eaa3a95fcd91f175c5c1ffbd1ef5b4476dd966af2649ed925988b67488d022cdc62ebe4fabcf17a74a54d667e777c4315a56a60d05b88a444a8adb39800997e25cf08341ff88a05ae63ae0170df73d669987726eebba2e54b7f74bcc41b337c1b1014260be038e306dacd9a8d4d32316d227bf3bae29b2fbc8ebafe8e3716bff6869f6d87adacb3ae3a3062ebc01bb88ea4d8327a1fa77b443ed07885a960522994aaaa3545393771004c3d127895b8c4bd045d641058543ec0ee82cd308c0e7e8a9768fb47a704407234efd747ec2e612c7abc57402261b2293817c7a4a1a9f26061b0da5d9f3a7d6436d3c733d313e87beda89a96b76258f0ae449ecbaf552fa1f600a31bc08e397c323e5f50bcf26ad533316df62218c92dcb5af164dc18652ef01b9f4c6a1b18e0da5d0704a61902ac7857e367534f87fa7a8737742ea76f234550b05120b5df7d2d5273d2bfa409195754779deab968473bf15c4a485cc35ec55e2c8dfa853e91ee6ec2af2d54457154eb6935be05dee3b5c890ed9d1a8000000000000000059d9b50400000000a6cf8a91609c417d8cba690e3d553c867424ba5f5f5f3a6089d6dbaf703d2a5f4db9bb4e8840dcbe7bb41310690e9890bb6bed7f625c77911a1937df5a0166ab9d442d05ac708be97cabd1dda57fa5eca4672ccc5699037e792d88eb6a37c4430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014ef1d6d111bb86bf6ce6bb3fea4ee15947e8b655410e06b7f4395a72b59c556b56239dba24a8fbc38f16f5592bd3b33209fec20a41ab8256ec9842822d239977b40f62acdd9111c2655035b81107b6ff9244e5c8dbd07daa4e61ac27b64d5ad86c928fb10521f221d673d5956ca54a3efea63abc2a34af9bf928dc144ee06c2022829daaabb6e9b687b029228d203a29d928b4f5a03fbbce489dece82febbf60603037437508bd93d70516d2112e0ae9ea2ef69fc213c60a5104b8aa7b8e9c58cbf0a05b2e7c1b31a13eedd4775cf5572a71c2c48f565e2c1881f821e11687e5ee96424b66e8f080a079ea97dbae4a35e19dead33316bf089b3b5ecc685d412a1969f0300092b7a8319864bf3521110db754bce50301e7e45845dbdda469f672fb881de032455961f4fd6308e8473edb7a7a9ffd02b07e81ca93a7994e3aa3fc781d7e10702192c738fb5737f442297fd721843f360d29c4613b4cf1dec2eeaafb161f54af6020bf7c37014d71085526694f6f59f35ed350e2e4817118fee8df560b8c7a74827032f5493bda52d46832a3232ffd1ac2bac5690e44a4b7e3e56174f10d58331ea76a5906fa115da5284fa92439c9c6827799183761f22a5fac82e320ba83c2d46fdeaec741ef396d20a9ac82cc427a9cc834f2c194c11b2a3c353af94d78355c0ef3c10e45069e7d2fb814de2758aa088f36fde154d054c2ae333c5ddfca6d2156e65020f9776b3f9a67ccf1db16a85737c18d25f08e58a823c42d17e26b3019e4136e275b7bed80ca4a6c09423caff086bab15d1fadc4b2a0835107ada4d263affde5287ba4a1a6ed6121c2af8f356e72ec5a5f74345460f0db4dc17435695508c19584a71328d307b0d03048559ec7a3c17d09dc9343762478009fc2fb00643669cd3615f1db1a3a2a93f5eee991a35ec7ce4af9a4a55c81b57f35b61f1d2450c431f7ca8c020ad3ff2e869f4afcb358bf0c2dad957a94ce46d2e7df30327e3f2b38df1e94239defcf74f970f50768c38b953cd5cda9868e4c8b2bc49282f45ccd9ab27963637e2dcb13d84e43f9dafd65774cfa5767b074b2339460da5217fc5206771fc4ed4821ef518e1e23a61f62e399c3e6942368959392ccf0ec696d6ac361e34551480ead76a7b6d641d288c07cc1a99aad2f910568372e85dda17912a8dc0a000a94ce69597fee88a4135d9dc0af7320787f16982c7c2dfac8f70d634b1d9ff633387dfb0d3234e414bf53b217550e74e81d1ff97e3f3bdc30bace2c6425fe999e2fa2a25647ca6ad6c038c8c476744c84e00e2ac26f03dd3924b8071d0c5843c61a2c0dfc77b49e5f2b96d9ee8b2fbf5c7edfd994118cc9478ca2a5b4c23cd078fcce61e25482ca1f79b354cdb69af4e7bc28da6eca3e2d3e79b7739407e26abcece1ae254bcb66859cd399fbec21fcd3bcf3952758625d66adf23cc8384a45025b815d0c75d083a865ee13f0631cfff49b925ae2e5e8abf744c75087092e9a1560eda1fb8391955ef46e3dbc7f6e24f650241fe156cf91aad6c81a079925cb33092d1f0476732428c2065646e30324585e29aa98ca4b8b5a27c9174889a1b61e2d1956ac97b7bdef91c4b0518ca29abc1c07bb8fbce5105211aa0490480743398c8b5e79203a7d1d9d064562fd2658072b8afef54faa4c4200271c988c59970b35a42e43efd1a16dd23f7ae189539d6733a9ebd89831e207b10090f7edadc97abc837bb58207346ccc8a235037f5fee32e50fb44c4c3612ba4b4e49fab1d61d51a516dd02e6907000e0814c00e2af560d5cc9283930263e71be27beb13d4479039c680b2e17d8bc53685b26ddc41c5d98e89336939827f5e6f4e053bdc43ca5a7ba9bff6630435c93ddbdb9959c4ff282c850bdac5dac4cb2fc7a2560b04002d7554ce1dc8330092463c425583be7fd0007edfffc2d39604543ff590ab2a1d46d7bf69290d2737ac1d5ae9c77a274b81af48b90aaa7a813df5a79fb287c7885ca0c947dd75aaaad7b06b6fa4ddadd79eb4100619055ab7d7936f106a445be750c38d7824cfa862cced9380857bbbd77c6e447cbfa0f3e03d26f38860e9ad7a4ae5ba6618915c9e843fb021055710cd2abe9a0252d3cfb4424ac4c8cf0ff55b8a03958fb8123be3e3fe7ff406b6993df2c80af443e790a0c7106991b7add401cfa19da1e578049f6f9b9ddc297eb5bf163e552bf869ad8f77a049454f3c88a4c3209bb1204f85464639bc001d28bbd76252a03a44f274d66eb7f372ec1515064c5cae2b4c5f4cb79f66b51dda123b4b6616f26ecd4255de715ae605ac9c11eff44fb16e8679737083ec393cb619a5330c161a2ade3873da60d20cbedc62729c56ed641f07a9f04242931b6c0b423161effd69c24b54f30484fc55938783955283e5477ac21b729c1923a28b5400c", "53", 1, 443127662, "5f29c715c58f160fc639f2617d73af13771977385bcce56aadf8e35142f146ae"], - ["030000807082c403041953aa7d978e4b3f0c852f071b0caaacfbc38168c3932acbbb8f892a94aa862400000000040065656afed8a9d790e456daa3bf2faf1538e5e02fa1f0117f889bc39812ef7213d2f2bc3242462002000000000290527104f3fba2426d92752648244b5939569b6b8904c5beca9111718d218132406c290000000000ffffffff8bc2548af3b2a2e21d0850238e899b15736215db7c31ee5d895db7f9804efa6d0300000004006a0000050d4cc0042caf1f03000000000663525300536a9480d605000000000853525263650052535c5c68010000000008525353535165526a45d24201000000000553530053520000000054a9f4c2030000000000000000ea12480100000000177292ae883724105f0a7250d23d67d89b51c56cc9060d6d7e9686a2c199a2e61c5edc455f533c1cfbf3b9459a498fe4694c2cbc8d79db5a666d628a3b0bf94eb6b4f8c64bf836834dd5054d090b5e99f8cf32daa4c08ded2507b19466d0756e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006190d26c0cb167793451b451bf29174449ef0c7d2d34903c387ef540fdda3b24baf94c66fd365092ef320d001ac30c2a86fcea38a06292990abffdb6a0484261a16a60ffb47eee8b74381880b9322777c4b3ff674b701beed86cb13755066270ec71297eb3dcf97de39d1582c3f0ecf8a1d49ddca363a55190962d504772e2b5031668148be863ca8cda810493fc74f554246b3a9f91ca53f1ad28d2f1ebcbd842020ff4404b97287be73f87e92f0542cf2ec6e9e05d770288369e928346826612180a022c2d9654c4f50c4fc94e1bb63ad705679c99540b155a9ce40ad50226e3b1dc90b1990c99d4056cbcd72979f389714bcf69bada2a8391c9fce2ca45008435ab0214564e3d979a1d060e622ca0e1dd50e27c1f9b4d0aab2f8542bbbfca64fb4f4b0327d7e16836c72d5ebf5c7cf1f66bc2ade17f6af3540576b16352fcb4f31b866b031e78290c2acf339d698079902c26249b3566bcced59e7eff79dc2f1757dc2ccf021c76f25271aaf7eba2c991de6416e77f0627026b3d2f41598f7a9dc3748ff8f90219213d3e1f4f4b36c19bcce01abc2441c705873809575f475f5ecb19a0f328765d723fa9594376ddaa516a5fd0a7ffca67f8f25458cd5cabb833803a9c7e4fbdfd85891c6f93f24d983c1c04ba17f77ba052b815a192667db72f228062be0ce556558e9874af009629c5c01d42d49e97531b18ceceee0a0e6780b01e6f48933e0b766ea3414843e43865a6691705bcd4f89dff9bc3eef23336f9cdc4357ebb07848d61957c4e42a8c4f6d57e79315fc8577f019e204ac5f9213e55fb77f84f767e80c4f07d08b20ea12d9f1f9e469d5ddfe9c26b792167f7142c0a9991e607ec4b24ae1928d93a5fb4aaca6274f64e1b0dd65c17eba09663c58c0f3db860da09605b6f8dc5feabc89daee68318b76d228d4b48cb202c638e1c4016eb4f2138114874b94551548803ce4ac457c652912e6fece0dd3f201133235c2bdf2bbda20df73c208c97e49224824b14ced9f635475b95a7359659469ce5c9472a3df1eda7eacae850a345d97070d6c1573a8dc957fd65ed43b9e8214dc2eda27292253bdc153cb2f9848be28fad7014e90626f098174b712140af6198b552db01177ebb2460efa3e7d30fa0ef465d794713df595969a41415ab61c57c4bf81d4d76e485a8702c65683adf2b7bebb5154e88a8b407fc06919e25b41011d77b6274fb5aa6234e5fcef6a42d64f73b0d83a4607a8f1bd6fc75e48ed103a0f6c8feb151f5d170c3f821d42fc584719c5e5227e4b534003740a1df98304177d91c8ce25b19fed1cf3e7e0ab54f1b947aeec66047c00965013ae0a3c60064fac77928c75207bca09f41f0f2cb3f18a1822ed5c721d1ebf9536794749a5f26b1d82adc3c7f7c2196125191a0ba189c09d50a1aff8c88fa64e2877c695a1cf1503233d781f41b796d6d76989ce9a0fc7375a3e6a4de541527711d197717af684469566ef1d06b30ae6b6fee54b12b493c4d1161af951aeac9a0e7b896320c188205c7e4352c36d89aa0f8b7ea73db5798d040eb071c6458b2c5876519faaf0fd2e1a19c90622bc98d0adff360f6b682eb3ef5d97535f43ff52423e7b6b3ee20463adb749e2e8ea6938071f48905894ada6f5f781183d97040f024db2b501704fe9bb20db9ec9c1f0b19ff582779c6c2a53ec6df05441a9ee1bcefd049ac21047f77a815753ce2a9f91cae8f146d668f18ed0830aae66b094c4c56c0495f60420c725d24f745fc950ad1749bcf4662954f4acc509cd42b86726b1084e8fcf8ef51e80fd84792f0f71d760d35430576c87bdc2cb9a18bec98a5af4afecb4d183760076d1ec0295283ee366d5c1e95e32149771ffa62a88b40b61470571c3bceee77e911ea99229bdb448d65b2a2bb30a28f839392ee9e205a33ca1be708bfd4ee183265adf821f9f14cffab64708d14fc2dffed925e72d3a19009f3d47cde0eeee329524ae1c1a39720b48427b699b12faa7edb94ed5f6f6256d145acef10247296176d9caaff821d9c2e78c5f88206cad48acb8742cb0bf3d674170a544fcbc2de234ca0e94e4347e23523450ed96d3926a051cc53d5900ce3db0d05b2c2077e72e0f749c5baaa97cecf89efffb2d920a099395bf87633d67ad28c079ff737f5c5346f1712997349beacc9582f7466fb554aa041e36c8e3be226c3800502e6e612690ffa05174f4581a199f0362f471a9b54b099f9dab312e71029cc1f312d51238ebac0e042e53bcc41e77a210570dd0bd768f09f53b534a5ba18cf28bc0000000000000000000000000096aaf5b562ff466d2f6099b491ee19ab69da5ecb7aab36b92e675041142c3bfe78798c11884cc8b40681f04a4520612282133679c521f6d6f4f2efb7dca49915863adf1ad41c8f0ecedb7e84fe319efadf68acdd074dae0209551f71b62208a2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008eba2b4382211685558588fadfcbb7418f7534b5344712b0daf0fea42906d8d829da932d5da2b2013bacb0f918f690e28edaccab1a75ad508fa33dbe370a1399d09c05f34cb8b449963ac3c8dc244e59b8d213754a3ba73fd68495c47142b1bb53dd128948a890e0ade0d2859def78e73748b6006824828e044647e9b42eba37030b8edcfe14c438cd7fd43af30cf751bc47415d5c52b33632864f3cbf711efc4202126a425dfc6ff3ec408d5c7681207e4456e9271213ce6068a1094cf80ee3240f0b026f9c07ce0ff67c0718c7025d9cd61ba0e4312c9db6b8d84777b535ea4bba5b36364501412617389f0c890bad155439ace19a43f48af40726b2f22d7d7421d702187901b78e794d78e7c52076fe06f327ab2927563a534bdba4b7c6868b8bcd76030bfec5c58052dc1170331180d2b8efa43a286cb0a43385cf3ce9c53b4542aa7702288f5f985942072a7bfdf60c08a5f29b0458acd13bf12256637c211c198d49eb0202ca131f268ed80696928a47ad4a554fad89dba01ece6eed75e2123b9814b424031b964dfae9d470771c29b51640de07f8e0280b4bfb7475e24876fa84810b972101a70ffcab3848c91e51a31a18f0f45f2f3dc3c3bc8d8c9afebaadc4e1827aaa05cff19815d971ba3d85ff2b36621a2bf0ee9cd9a857def20d099fcffa5245209622d1245df361ec3ccf88833d84ab3f02590bf04ab76bb960d2946bba125e1ae5a1eba1d199067de9f58abc91f56a63159a778f624f10f7295e43701745097d28d7e752a1764c8d10c2a65a2aa196997dc09c04f7b893fb04dbdac10a17b2d7f05f56ce48a78c4c4032985d39e48b56603ca4ced1b0d6ad95b8439670ad676dda345ec2ecd726172f0887eb5c90b2fa9a45359e59b6301d90314cc6f9e7058fee9e1096a4de98aeadea1b6c39a430f69274a1d84f063a783ca896a97cffee09e1399e6e0d7d46db51f55517aa9b3148ad95f3c7a3f4007190b153a9e6060faaaf47dd63e1f3bff4374d64e425b9cf89a5197fb79da238e9d7aebd260fb4a271328e242ae5689558ed9aed044c082210b63decf0128a859d6d82a68074402b478307cb1f2aa195329ff22dec1af1e1fb5ee19a1ca1d2de3ce9d30392cb925aaf46b3762e53b38cc62e48bc95bac3f4cd61030a99252f675c0cde6898074b1b6631dedbd3053c9386c5d7438da28ffa61041fb81ab3515cbe75a968ef781f53dab2620b222c518d3474bdb8e926759706ce17ae3fbc01a04df042b2c12cfddcde9b54940123aaccbdca1209ea6dda0457f05642254576c0bf0c249204fa6bbcae903fce5af5a3d5c665e694dd3e3807877e733288aba05f9c6aab354d4b5a215abbbbbe8a1431936debbc9d787851df0c6e7cb78a6d0aa42f70df28268418822f4695ee886dd7dd378bdf8ba9a3be6abd7f3f56713ca0a70c07e8b68d4c391f3928f9e9a76489a7df121d885b7b83c6da4adcbcb9a250c5390e8250b5aea085076be17976e3538e2375db1a1726a9edb392cec147a03bcc425d8ea8d6de9dba511cfe567f054ababf32de810b20f90196a5d70cde0e225ef3368954440aad150c1aaa4ec53d36b5021e3aa37f1bcf410c3de45cf6a707a9bd009f7086e0ab47574576e341553318933b692685142f63bda102a6121a601235c2a8531951ea75c230196cb5e28d627d208a549f11f48d4a5214f5965d9367a40d461d1852813ccd2c91390cd405ab045bc3d6881727e4ba7de14b75225b7cd2dc4a3c121d8c6f1827e2ac50e2e650bc83610f3342422c24d7018b9bb7efdeb14082ef89d469d51dc59ccbfa0d0c9255b62a2737839a4dfe39fe8b4584fcb78a6293db856da2c72bb3f0be7878b06d264c9b168018c1cd2e66c9d54a177af0c2ca4f3e20456d0978463af61f3441f756bc9ce7445983033c4e9323977808876b9c3c8a96db7ca00e8e4bbc538236d4d583d02fe30da60ce24312a4a2c4eab133899d1342c10e78308fef37fb86ffb3d9a8ad8bd5b58c7a447e7a6bd87aac951d699c5d302d059f90b3efb2b9f27a875ae3863c2d96e04746d7b02a6bd61b7907af9040a1d3275784d046c561afe1ca63d788ff61ea72cbf00dd6c825120b9cdc58b01275793a581f98e3e730bbe6b47ec19bf317ce1b0220775a86bd18e92976525d297ece0f082d184316ca1ee98b3e9843dd21dec5e17ce4c4da63c45f5c4816c7f306981b64ea760e10c099c4c52bf1a6a8dd72420cf7fdb16c6b621b8ce348059b1126e82c552057f4e55e12cad6628e106bd2c4fc5d8b9586cbb2020000000000000000000000007ef111c330ac2146dd05bf58c768c6a13acbbb251d22cc473d91d7527e9a51f43248deef7ecb93fe01c966f921dc72c79b40991e5e477826c7d5afe6999500c53fbbd3bfc85b768e77a3a63406f48c8862553d12ca130fa27b53957eb248cb690000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000047c1f459b36a5b89da9b7bbae7ab2486fa53f11d64d53a550c9655ddce1bfe67db6abfb74f8b44121e413657cb65d504b7126b2442a31a7fab6c401ad7796619e93284ad6d5b575a58fa7c71f973a2081d7983ba4831fec1c00e7013177c14927820afcead1d2bba812c8978c754593f201c4389f161adfa8390c6c6fe019dbe0303259add8dbfeb93e199ccd088cf6ca543ac20b9be1fe9cd3270f22f861057f7031819d6396a848a1b1cd6cd0f21497ae700324bf1f2673c196a93c7b74858cfef0a05e8807045a6f4fb1aeb8d3e1d2dd3f52995e6015526d7477c5687f3bd87765de6410fe46b07ca81184c4bd032fe9f05c092a0aa9adbdc213f6435a3dce084db031b628c829e13828f00a60b72916ac3f620d2fe232eb0c7e27f99a26bb66b9358021c9e65568ab694fc1ab4ccf098d6a54d44b1a0c13f0b12c5889f95fc8ca56d540308e6a28497b862cfdbfe8edc4c45d80c423a5fc594a511a2e9d9e213ed1cda0b022dd1723a2f171487da422f934107eca83d5de22c8c3572843af17d163aaafe9f03245a50c3a238efb3139eff62bb65b4397809c14ea10d66cc527fa91a1bed99421ef8ee47243dc09a28d94b940cfad0ae218622acb4203a74dbe8ee2b20ea184481b833bb5693d6cff6dd799af38313ba6c711b56e7be96a2dafe046e8e145bcf83c250cc50dfe3144ce591c0772feafac8833b967e6f846aa64b969be3809500fe65b752afd6ff0c74c15d329dd635178e8a60034b1f7e7f2f8f1bbe3081d2b3fa8ee7054e07c8dd86148809f3774f9e23cc7f564f9f2229f489bf8649a62ce36594288f8d22ebf920e462f1cfd2c00b3ca71cae4130bf9febef2fe9c50a79f6ff61c78b2e8e02ac3e082b6fd4d79e83d4c8614f9f201f78c7591c99db47e436f034f1f357d78e5e2c6275f4a8f1318b7c8557c7fcf25bbe040dc900055244d4030a7a23f8481275715bb533c2de19e0989ed4c7ac25b43dadd4766cac0b5a89442c63b8167ee3cd3cfb1cb3ef86f1b1b1317fdcacf202a2178432eca72c039592bbbabd127087bbf8530dc384ab6325349fd86e6d79cd5e69f0a559c555d653eb93d70c553ce915f66fdb8b8cd9d6df675c76bbf18b0675636c4e584a9417615955881fed0a35169a0de7939c42f4ddc57e9e84305c1f7b6c1f95dc9b6327f19fe012dde9617c6aa32c7c44f5499b9be43bf00dc6182eca86cdec5738792b1f0b0e49f3596a1fcdd06edcd112a978f104a1bf7ac664b8e360294abd152f31fbf30c1eb01604afb7a3bb53c6a3231e43655760a861b4cf7617cdcdccfec40a950cdf492dd78b35834388a11ee65662b7572e81a3f5f4493977e32d05cd1cdbd8b9954a5721e19b730935681de1c4c8574c12ae7379e8a80965ac79fd4a3e91761e06c4e97df41b6d3f497b77440fca1f1fd4aae7cebc4143ca62df9dd19f7649c27c504af1a8f84e7ac54f7294ce394719aafe05ca4425a6ac861c56db32cee3fbf76efc9a151aee0555f172350b1f1051e8577902a585a4e510bbd0cea0bfc6d98247213deed887467a04e37213d68a107873ffc9c098cd8248b412100a04a531aa80cb8897360b6326cc4ae9e0dbf054c8bc24f949b586af7f54add2d663a57389f18bd443e02d96c984a6d0948826ac7dd651136e9e6f52a21b4d5c15608676613b28a551df2a3cad223b9b15c2f5713e8cbbfed885fa886224b2ac8a377937370cc551eba8d652546687257faab303b1b54bf96c3e6b4cf0384f3cc1e55fe3061955d87396127df8bf398fb201a5a22dcdc1e1543aca5a08b9b8c49614c604e60bd913e71c25314d55315b6a53eca39c147f50577e5f883c4ef4038e03de355e194c0f9a7383498ec6908ca413f84d983b5e54a1558fa69b40d402a6a147cd2e3660745269be3dd16677ce8d1017746f2655215a5f88dd39f5aded3fac3a51f9130b5b4299b78b13a4c3dd0e8db8394504c67aaefe0f784638edad3aba12935cb2eed1bc104d0b8a675037ec5dc13d1aae198dabdcc69d66e8e0458429768a0dc0a028c06cddcdc63f37cf0af3ced5f99f9577e1433db17cd2931bb758425cbe950407ac7202fa538d882b414cdfe99f42bd3f66b7725618145a9eb86c82564528abb96b0a273a0a1c250155595752aa3200027dc1709866f02596aec2442533703c1875541292949bfe0f1d4f2bf31dfd3c914ed09fcc27d9fa1d891dd6e6c01615d02b6d1684b54c21f0b4a74b9d2c77b750851d53bae2327986c6ebadc7f90aaaf25e426e3f1c9854bf942171ddb65482b1ae873549fd3b5240d7d736b940d379e12061e03e6d60e8d5a9c69f32645687778e7c1b738e965f96eb55ac8f5fd4c31473a037d73fd77d9f390fc8aacb7b68b4f6dd535178a3601dfca6023be1829c1537726f19ee1260ace688783900", "0063656a5251", 3, 353534307, "dfe9e21d979424ae8344199ceaad407b99c2d53669145f4b13723da3f816b90e"], - ["e70e086501789a2e60bb8d0cffe9b16a73de7e3a9bd738b36b31bbb6ec63e212ba64c383db030000000853006352006a6551ffffffff04407ee0020000000000ba5d54050000000007520000ac0051655720350300000000009986eb02000000000165550b721c03e4421003000000000000000000000000dbeafeecbc24e54ff4d4b08f41fe5033405b6ec0f434c9f64a4923044286a01fa53423c088aee5850394894a04679375621579f2c812ccb7ea9840e9bb1d013995e0e3fa457cf956176a0e51c3c3101b28789abea0102cfb5904dba8fff4440800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ea19b3f5a6907a52690da4af65764464f441f3918093b142f5a0445f33394abcf7008ce3180214ce44266565f75421b14f41b1040b63f880af97914527f6a829563d45f64d1e291d3d71a27ebf7a516a927cb9614f06b68b1cc2fcfaddb8e1a31f0512f4bb83c4bd324b282116ad235cc1b06d4ed81b05e2e1f43bbce29e84ff02129681181f31738bbb85980d3f33970a35b9ebbe3dc477d28070cfb9422e12ed032f67db1f2dd95f1a3fe31a7b3064d35a97b2234de71271cee7979928be1566e00b08c625bf9a5d696c673b43ff4ed3ad04bbd2341596bd2fb58adad715479d2539b4d39fa915daea881dd181455d7727d5d6717f997caef2beaba5629e0605fd42020593b6ce84115ac21a8e4cd229a5b7fc66fb00a0edc81212c9edf32b066abe02021f7b071bd3f94d0b6fd95c00d89ec933db5e73c513691bead16c759eb0966167021292666d8fb32ff89e52bed34cfcbef267e0bfd7b1b18d2ad0c480dfda9d653902304f50137f77f8270831e347bb7dde4ae97c602b838791003d372b9a5d702b550214309e23aa62c13ef3cb811e9d410c921843f73bd80697ddf88ebea5d8a1202ac4cb9dd72f0b5dd9f5acdee4767f71bdf33aa5501d588a10b3594328e3549a428b7b913b3ba3832d8f8d0c222b5b72c5011557e4386d35a7bbf4ac622c1a8142d96dcb1afe71f74f747124d51e0252c965976de2c20736a0d5a8ea69162c6c3080a7aece95a4f2dae878475af902df2dab51d98c7534010ec504ccfbc023dc756d398d9bceed504bcdca172110425551ca4db8c50a4052933ec738e40b149d218079a5eba67efd9ba8fbc31108065800d9a80442e44a805ebb8afbf379f0d12ceca60cef2f2794ff400223e25299f42cd0f3d689a0733abac076b21d348472218c5e2ccd27782e8e4494d9a3877e2507d23b41afdbbd3f2b6089c886959c308b45168bdaa4c3bbca397b6c3db67fedd80c06ce53fc212e4e686f3e14af9ec788abc420007494b97859d88574a04ff7a29e798beeb4f3022d209f6bf7bad16a69be8a5253b97f98a281fe4f85b90aaec19e3fb411981ee023ed7d04927af7a726382e15cfda88c912d41d376f50b097b59322e2d834266efa31978d885b9ced5a4c86e44b85356835f443a4cf1d636672a375836d5ce0c939800a222fccf453c6620e5a087b1a6afee098a2aca5eb3767c5141862e9dab69aa04997fb73068d9086d01d92a3fcaae36f4e453073bb2a09051615a511cee7dd561664f63731dd619efd60c1bb7bd7b12817f7b55ea42fe8d9e13ca5b6971923e16092801ded1992a0bb0317fdb5263b30452861fc3738e050657c0f0ccf28dc44e7aa45fd3f81f676f4dc3f22be51d293925e29dfdafb5a8ac7792b4070e104abe64d0fad07a7668ab39f48b8347800c7e85a8b4d0aa28ac122028ec2c84a5cd59955c8eceb16b7dd1c199644ee1251dd21d07505b56c39b1f7bfc34bdaf479f1c918258d42761789a58a4e67147268827d84a4f6da3c0b0fc38738cde7d0e93953dae4119c8213efdbe5fac7302f3c60ee07ae0f3ec39117648706eb9b3f6aaff589396f2eeb7caad3e3d459837f354511e41f62470ee0fbb6a666a4d6dc2f451a8838c8ec1f15cee3b202da909b4bd73899c958025d3535366d8b095c4ceba5ad511b5587891bc099e1e484cec447021e57c9ed67901bf96cb001098cd992679656517f73e02c773d92cba26f2a859a997afb9a76cd6838688880f821c1e2bd000f905c3739bd7e471a505f6ae63a0a71c84dfe8f6ebf9e63daecdf99442f3b5b76d10bc1bd5c8e735edf1eb266d6b63ba07d54287887a5867e98a2305d2bfeda0f97d8face07ee161c7c5e506a783ac8b403d87acd41453dea9c747a599e399eb6e2474d0d864854ffe298e585cf1e5e219cb1e69dbcfd6d8970798d8adb26734896024163ad4baf8dc625efb093734cac6e06957351e5aba782b1bf4b9733fa498cc95dc9255f0500d1da5ad863b5e9b56be6b5b5e9a9602bf4796d41a107a85130fedc58529ebbdf847add160db51982e4895e814340462d32309f183460ae73c1e48bec1f8692dbf5075a2885f206e4e2b952f3ba52be808225b928ab76c674a97bafda8c7c7fb5a8103cf86076940d3c36c3d364665b2646752f991bd407da3ce23fa15ab3b9a913c151517ec575462800d50a87b9bef147dee811d351bc2d3024d16ba2f55cf0029f27e0259ff8635430fa4113c9e38c0002d6c035f52ec94f80a9402f3b0ffbdeab6aee1c0a95598b93dc9098319300000000000000002a480b010000000030d2fe9d68fa485041a608234ecde3be35964931d4e7a1c1911f2545d280e75b41de98ba190c892970aad8ee54914d714161495e58cc95a0a296cd8345adad9e97c65e20e8b5c31670e02b0cab656c8fee18ff1b48e4d15965188b552c6765390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a29df118dd18fb99a306a5397f7fe5e008f6d8c55bbd85ea250fc1dbe9dd01d5afb2294554457941132dd29e044b1bf60c714762a4de84d9b4292ac567de7186c8270e3f4f38257704b14d9fa85353a42bdf5ef3a57a6aa47e676ba52a87f067b29d4c1e0554df3fc39c47c02dfc70397f79c1aef95aca0cfe112c9edf9db302153cf8317bd8363abe4245eb253628d068247ecb4ee569a0b354b6eb759aa1bb0315a8403a4819eaeb95d65e8fafd7ca132835b9189dbcd1e9ff336b0f42b455870b0740142baca3edf0e9c877736da642134e633652abb93812d0ca29d494521c701230c5e8cdb304995945e4a291984dd96e2aaf0966bb75bccbb42340a315678a02077f70c0c1f0aaed207fc17ba5ae3c00171f539a7e8ce33f3802e02a875bdd060223314b54fdd305995a2643aa150e100800a1f31f3faa3f87ff3289a3906ba0ab030ce5c31ddb53a026d1f2c0e3f1bf9314a899dfac656d5ce32d2ea1400943ad4e0210e5d2cb009f5fd0054717559f3e6dbf0deb206855673c4942dc8dc1fcd021ad0327f0098efbbbffa916c968dc56642cad0763beb18264ca251941f35d5993f88516c9800ae28733e994cf3b300282bc4ffa2f6fe146f426f8755bc8cd0e22c246ea857e57836763f5f343b199c63b02abc7b448ced1135b37cc0b91f1769a838adcdf7565f4099054c826f0e26e2063bc05704beeee16ca8b56d0e6f3cadb970ce9d5a4503917ffee5d72868dc22035ba4273402ffeb1c8678fd2b83bcdbf0eaf7943fad2a1edd6fd32c92b5b6124c2d789aed6874dffe491d5428309f0a67cdd9e0b2c54797698c05a06b7acb6e8c9feae7181d7c3f42e70cf7d0b79420d02509eb9704bb38fec20323a23c67a78e76e3facde8701a01e561dfdf7bcfd34f9d9111900b5bc9a0609c43911c40140b64c60947e3e0521a6afb08bd33d088dc74445909d18f0f68f7ce0bc960d145d36a86bd6c00de615c4c95ece89666916a59b83ed33d2738a04ac96be8d798fea700d1a9ef50b5358c6c95c961c67be2ecc7aa204a1eb85e359cf52867086981df2c1f129f3e23caa5762644aa5a017cc48f30c0df7f90dcde11bb8266cf440ee44212f1173876938be361fd31186fad293198d1c4d16305543d5de826260138f6b3df1033920220b17438e97d72b683bc54fcf215bcd352937b354757950cc6c92334ff23784feedc7e2390999d0d359b37b60ec6f9abfd856ce98534ed458d646c23e6148301682cb1bd43eac5b3686be0156b692671f83e5ae1738aa1158744e96cb262379568e348bfa1bf423340e6f7761d9b6fa39d308daf386d090f10ec19d9e7f2d6a2b391c73f76698355b792c4ed50866fb4bb8f874f2ee349acbd988f5f09362dbc196432b7b5c7ac0a1a71e71bef409450d4e82dd2abfc6f005f8cd4c77875caea5752abc908f2a593f496e6f86b9b64cf9d1813e232211abfa963fa2b2b3da141846f11ea4e65c5a7f248af71632c85b65ae70a7ed797629d78339b5f0b484d90ec07645f63d8dddfed4d69b48d0968e37a1acdd92041229110a29b9c9150f9810b59667071c82971ea1c6c2ebe505c89aa6269e6fa31cc0c943795eaf70d4bcb96341322f96eccae8012e8c6e5460571c7213c79aa055982ad5979a9414aff08b7754adf4605dee3aa1b6ce59d9806a6e783ccf376ae02be329efec2efff2f89633bbb99d8bd46775b8ce5d050b8423b91dad10eccb135969fd217bda4815dcf61af4ff981946959ee6d9f6e1a8de573e76f70dd854f29758ea8309e31bac7874c5f7fab902aff7e428fbf2c78d7cacdffc1f33234caaee3c3741a0ce7c49a1dcbcaed50a0a272af8c35911936ba2d3a8aa0818e96509c91f237d4843c76d991902c2ee0c729288983712b11851315bae195ff187d2704eeb9244938ff1bb9ae59d85dad492bca85ea871b1d780831cb91e989f9d13e02f781122cb5df4e4b83735e94538882be948405826f409cb0f58f60684a3b6dc68f9427ebd4b859916883ca36beeba0a2b6ac5f291677cb34a9d02e468c1fdb39317c601ba4cc7966ca070f08d1756b4fb78b9973aa1a57bd641c6a3044ac614713f5e6d008c7d0d737add83df2fd33814e91ebb3bbbd3e1aa0fe9486be87895932d0768804b48594c82a71421e739547a837c5095b2c406c7d699ed18bcedb341628bbdc5ed4a1b2de87bd003ce03b10e5586e144dd35f39e9569a8d85751c3ebb570b165ef6498f587e0a66c875ff3029b9fd69ab78bff34ad0125e0a9ac54fa8b73c19a60ba2684d901000000000000000000000000d584296c171e24dd613edd72baee8563e7e03dd165bb334083550e1e68a9b0a8a4d465868fab1240f7ec4e7f0c826d390b21e0eac5552344468ce59f54524d22e2426197c281fdba6b2e048a5407d293a7530bad5bd1a01a0232e6754caee2b5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c1702874550bc0cf3f2c14a63bce695a97099e3da58a9fe6c6e0c00bdf4842a8844c08351d36c6fc267d93402ca196627d226d44f016050976e47d49284a36e3795f9a597f43e004acac5e44f38eb4ee9b03b4dfcd4e64e9a980271005c253637b05397f26eaeaca2863ea030a07afd8b04486325b0c7b70c8ace490f67fd32030b5db7dab394563f4c34c9ccfc1dc4ab2ff389747c3357102b4bc1c0e8736beb021f9b8ab824c4ce557f43c2de442a9a30efed65a39e3cced2baee441834aa6b0c0a036469a8d77046d96a8d20a2dfd87e6b3ac4b39cdbbfad012df54e4d32d57ea2f77e43990c514a15fd09852dbf62a959813e6ee958e5babdff74766e799320480312ca77ed148d92cc743a0ae7f61f7244ceefa54f52529abb2c5a2f8b6cdf32200213aedf961c92c80758c7653d8301671fdfea71dcdff303a28733d764fc2a4a450213a1d7a2f6ac3e615ba7aaa02987511ec3f94f696ed1971ecd04551895e994be030d35df8ca59362e71f1e37a5a3526d98b33a03f7111d348ce210c41a6df29a26030f51dcbef26bd04aa0a77c398b2d5b5dce371359dfb930f6eeedc21ce07a2e8819e8130a9e295ebfe373ca26788ebf85612138068b581f9e29050403efc81da74d5c588581e17db3d43184e8f117fc4cd55f8eab9f0b9c51e5737cd9b245b0139a980a79d807728d940b159245a6f57e78301fe7832deee0ac8c5234e3c0ba76e6218c3fe22b5be887d152b9707f96d023b40a0182c070ba37c3881e8570a9af4984ce38f64a38fc88d0366e45aa01f72d086dbfe36522c6981f7cc0e347c20a0227f6e7aceb2d0ebef0c8b7f0e13468ac6644b400e2b6262d0b28590f8c57434d093437fa3bab6f0f754e437d003398bcd324279db0042bf30c17317a0ec34810277526d9e015d3667b2d650c3025c55a18edb5729ba49550d5ca7de15e2a1b751d7237ff3128226e3459ca99ddbee16614e20a280aae846d3e77f146c0c8b5cc3bc4fd4e0f5197f981032f69c6e5a46b8e137ac88a2e766280b44b77df6ee2300c654470dfe6d0eccfe6cced918cb970e219291b5e56a57ea3eb88f2a5847f037b7d2bfd9414e70f7af72f1ee45df6a33a8079765c90d2e2fad7c18fb58412fc36f254006fab804410094a06ed57a18f094586aa826fda6061bb84e79d5230a1368d81fbb5eec0f5b2c0993184d514ccf7b40797e298401f6b8d68cee0a7ab92fc7da09aff653bb6ce2eb0b02225a1d8bd28d40b1a642649941354303d52d9ab9d90811ad0d96e921d6c94f5ad481d60f7e19bf0a441d984e4e8eea5778bc3c28f5f9e84460f6784328dfc5f1ee7c8899cf56c34ac9777d8ba93498eecdedfdd3adfe9a55570a62ca60b5d59d5a5d12caaefe1baeafc6da1d266f96b04eec5537c110f2d85e27f5e9783626dfa16fcee1dc6472e164734d2fec98cde5d5eed029a9cc9234121a5321774a2ca58f4fef63075f82dc460cb360ed486bdc41142ea43f54f04e4e938721f86d1f7245e897d3c3f236b6aacfb1632666455d31446142f689b70cbe563e920fd0bf69c7146081e1a674e4d5099bc6728d95e7104675a11ecd5792a761a653a90f9db035a5be539fb0dcf4c0dd6ab0458ce5a1e56fef30d80b4d1dbd08dad6c2103c8ef1057a00eb2d39bc986ada6405ee6c72a1b5ed23ef4272df878abc5d860e9d2574d3c9fabe142d466bc5c9d69fe8499bcf1ce1535cfbd04792bdc70372d76651b6f162eebb89cfc33bba072a033d616728c6d964e235841c60dcadc97cb402ceec69b154be13a16fc31ca2316555aac6eb9d39fd63aedf442ed9ab4763a3e942a6ae8770f2bdff836bbbe4329ec7a7fea4c6abe5c87245fc07fdacb4ac7dc0d62bfc8b3cdf14c207fe61153f9c075b4ad70a6ef17fddec4b0884e7c68682379760df2bfb4a889a008e61c97b98a640627abcd475798e517e803927a509dfa88d096d1dedfed7cbddc33b4c6847d2de8538a78ff1d7ec9e425bc315a7710cb9bf57616139cac079e3b62c66fcbd8b30101cea0ea8cde83e39bbb014566b4328f34c680abca74713f3dd085dba4eefffe3e35dd18ba3e3b8a82f347dd31f2fcef2afbb293ba26ce7565494f01509c89dbbdcb664de7dc53737902100ee0aa1cda82d40acb672a0715505d39e5379a7e102f33728ca9004449c25872f20b677bfe17c7f47fc5e3bfd7c8cd9fa8cae71a01b1e31fd63732ab39a6bba7a0b4e49bea50e8c166e34dd94b819a37ce7ccf4e68524f01342669c6e8470fa5ebd8f1d1f2ed603b687ed2dec51d72cea55010f0f8029cdde5543b82ef886d5170bf544980e68f76c4113d4ad8e735cacb0c46daf0aad974e48d010dab7e0de94226e07fab83047f5e7aaf079ae8efc298319d325cf126de72f9e2291d42f28b0deb9d4ed68d6ef94303", "52acac", 0, 948374926, "2adf36efa27080e554ee2578b462114e017b744fdf560080c214571ddd91f4fe"], - ["030000807082c40301b223b21bd5881969cf50130bb0172e1233c1eda15a8cc62a76fe882f69530cec0300000004516aac00b9d6430b02458a9a020000000001001e5b33050000000000b0a9b962511135290200000000000000008a577d040000000029e3fdc3d85aba0f8e559dbb2f3a8e3e98f6678c5e831d725f7655312eaca2caf9d3938d622d3afbb966bd0e84c9c6839f8c2065c27c34c475ddd8d3f33b3e3dca1efffbaaaa4749134a44134aaacb343f1879a9cc12f395aecb5d26f09cf1480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000031ae5a93d9ffe5c617a1aaab25d63c1fce5ef262d4530e95e1150b9a4a039785f01a876c5efcdf21161d904a9c0c5d8dab06c5166c200b27e385f8add83ecf5e462ecf6b6df05a3fac2ce9b709799d28f66db31c902ed35256f4b035d007a18a8d6be0aa3eb622ae0450eb5864aaac640cf9098ebd57f127b0fd3c00eed9bc960319f9a47906392ad148985f3c993523b61a0cda39e661c4ff5edc4e60c2b8939b021047528a738ae6af7d9796c5e3590653d68c81dc7de64e9d305a41b0b7a7c3e80b01540bcb9efd7511c3decee5b9427d9788957e4403839d2ba1cd095cc53798e60b6c495282acf12d94901d8b026323760279ed283ae74e3bb91bdedd7b6c16f6031bfad03373d3845a08689680afb7c2eaf8af230da6270c53f5e8fe07d786fd35031f14c2f26dbdf640e256d0aa6659ba47feb8ce945e2f2cf18c3c11d98c0dfb3a032dd2a9908ad63f4d5a65d711036465f5ecaf2dc5e20122d413f5a6fee9c255b9033016595f2f492d86f72c270da35f228d3eba01ebc5d6861da22b0f138c3081cf02049ed93a877c8634e0bb9c37a1ea1df4c5e25d94f1492be47db337dda226a737a72f207eaec7618b4bb3d7b2aa3c1856204705d784d67d9b7be98088d949234c79f5940911909798ef8adda60bc0e730a8eb2f670df53c7f3845f7b42c9c06e1dd9beeb17e71f07e31483d19978bce4f9113a7ac0e164ec4118ce44251185dbee230898cf82c904aeca718016ba98ba804b925e900474d04a6813650d0f392b291d8e4c265a9337df83602e2bc21f6cd15fd22b7d235d06d9aea0ea50978ff6f0963a252172396d105949cf0a02f2c828ce6ece8ed3d22e6b2f6fb0abd72ff463b2d85cff40202735894accb978960329c207d07f42799fdd0136aef28cd1c8a40ed21382755d43897bbe54793a122e110aaf1e937940c48a24d8f2f40f0fe12fc4e0090b01fd17502610d589d85446d5c7448cf9dd16cbef9d71864cc32ceabf11c54a6e30e2b90bfdce0ba57b1e15999dbbec83cf600571b2a4a77da04da676e198676226c5287032d6c33837c5819c259aaa355fff56bf255dc11ae38e74f2eb2ddb9d74c9a7b93b9031bf2ae849f1edbc7d851ad9a75daa257e4c0ee0b2128c0fa64f5570bde487aeab57206f0584e6e3f34e6abdd4592ee97606dbd665b8bf1ea7d542b57209f16edd4b5d077635af7b7737ac0349fc706a57466bfc46239a5a9b06afe7a618a453bac150044cef32379e306b39fa5ae53789c5e3f163b5de0a74759567d95237ec4b904a3737af9c561bae9e6ba71a1943fd5e28b7d963d7b9997547163f726ceb1101b98d230652163b58419771b929ecf27325f7265c735aea2e9b737c7a3f98c967d42a040cb7b974609691967d12c7a2092a41bcc9f98072c545c6e3f5ac58cf99597da7f6128a967a85e5d6a408d8599173e2c42952dd38dbaa6c21638ea66cbf0537c86f6f77cf979d4396cc236ac4c059d653f07df09b46d5af0bc1ec29b4e59ec25da3c90ae6d21836f138a6dc93cca30cdf8f0332eac787626cbb20f82e30f4564eeea9b400c64fdce6f858b653d20b4dfe4708cb9f0fb865f74f8870330285642f81964cb9cc37998096f6ca471e097bf6ba3149a6994c4abb607166c3ff9702c39ede1835dff48c26fcad04f86c747cd899e4c24a6ba9e1516229f0837ed7007746f4cbe1e736060ff1dcbeb4e66f4a6619ca4f648cde4699ea1bed9fed8e29b7ae8470eb61f841571ee408c65df44e273cc12731f98067391232472c1611ca3bb1ac0d305444f00d74aacead7821eda33173e1dee40afc19b75f0474ad21363ed8836887bc54266341b1cdecc413904537a91767863ed031e3f41b99e538ed8143e8b834b0d79669d1ce7ae26ff0fdd32c86f710b060496cb6fe5ab2857bf66c79a030e1d74791cdd146f78f1da478fc05420b083e823727be640966d02828327ae1ddd4f626b5a790ae0f2d919a9546a05d100cfc760a8d8c36b282c320c54d026ac9c40a3e34dcf38357159df1aac83f4e213538a920ba516a6033e8a960848c45ddea54eff203e99fa1ef56d3cb4071b4e89a5958ace7008bf12a509e3ccefbacb87a3478f625a351619daa2d987c56462a4bd42952a83ceaacebb61868481180682ccd6524d28b747ae4274a5729bb89d233e0d255a3d2655f0df5f3e5d087aa5811b4009d2e88936826497dc6a0e73497a621c6f867f7ac6d529d469722a39c81aacac905d01981fb8ec6cfe1341b835f57edfc37d49884707aebb6fdd4311f70000000000000000a5d0da0500000000a60dbbd6010737e1dea90e11385fe67636181232516facb8fcf2428299d0c6b69eb5c4b6ba430849280f67c7cbd9a4057223975af07ed98c8d73164b011e125889cda8e2195810fe9f4d018774e78cdf8a39da57f96dac08684fe28804ee3f45000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005592d13c29617b2feb94e779d6fe32ba2f626c060f7a17d3d00af7227c6276d78b832541930e1a0e5f04268df446916023a74d44914fef1780b5a1073af89944d30f3c55daf9f3ac6696a00a33b73bb47b015846ac55e2aec54f8597bf2bd4b9a5589168f2bc8e51d5a63f70a6c5cd6f0a99efacf87c898c3290b5642f85590c03152da555d4550ebeb964e1669f33a4f40a09286abc94d87127dd66a195fd98d4022cc9aaad0f28eb8d6ddb8fcbdc4cefaeb8473f21e7a688d5a00ea59e8f9ecf990a07e5b555cabaf2751212befafa847c017491a2aefd2685dc129686c8eef66df39ae5fbf2c541d389d31db1291bf9499cece43b0ec78b15ec9d4c5a495aaea3f3030fe7f25e25eb3bd5fc550b11b2d1b43e5dc513ff0cdb0d999ea942d9051fc07b0202bce23f7edc4cc9ab45f1243ef64ab3347a5be43abe1acebd055331aa88e867030bf3dfbcfe6fffd7021294894685c6f1ad74f5bf83247e6f374e02da48d2a05d02259681461e245536f6a2bb7a10f4c4a031728c5bb39101d7ad6d81a31585d35b0301fed323718c859a5446b2a2f34f06ba2d6916d0d2260b37c04e30eebf44cc389afdb25e152229959d647587bfaf82ca1c6eba89d9e3379daa6233f0620021fd5a767f541047ec7fff955f09bfa26b71ebc0794dbdec67ad4b1e5d4182cbd10fd07cc559bedb9a43120b1618492c02d64316700905d646f20d7cd4b2fdb114dddd6cd72ce34c063a9d438e5982e5f10d1ff1c92325c0da843bddd5f4d3d377846e1a30a462fabc7e5984c96036b73fdcad2831a595ea916cc50454f02cc227843bc92eeef056ef92895122ec3f81e172404ca4f418cd7d42341d60d56dbf3aa40f73866fd01a4bc6b2a54039e6c0999f8decb28d8a19f0e34f0a8ce4c772aad54a803f77ff8b54e7d1a963998271655b9deb976172d1fa00e8dfb18be975fd008e967c0929b57c4856658962578ee1e2f9f1b66158ec372ee04b1536e1edd2aa1a09d72a3ee96f72e5af50d65bbb3ffb13b6918304caf48515dd19a3bb3246df486ab6073d9f6e095485d54f037a8339092826044354aa0e070bb46fc68ded7859d508f79dc11642b6841378c7254ea016f8314d48e88d655488cd079edfd1d140428b7c0bc731e156aa38e325e77fcf7d7407bece45b8ea106630338fb64db57597fb6ad300298bb861b60b0652995f4ca498fcf8a82331515d7ab1ecccd3e91a071e61eaf27436b600c891b79a9f1631eaef3b5fa21f648b58a1ec57550f33148c8bd8eda23210c9d42c09a8c5841b857f7cdc9201e9b87e3661fe98783e6deda7234e1efcf16f6694c31732b93cff13ff5459b90c392b079b618174f6441632a50b304e7df5dc6fc234f6f4465fd9043e405f02760dcc539acb452efef9db8f88c07e21996d770672069527e31fab6db49806c2d4056125dc9f9f321dd76520187457f0ca9bc0e3b03e12b8d5a27c9bd16a28722749b17e6ceea25dfc227974102d164d40f351a52e02e18d2ecee74227a35ee68f6e3cf333bf2201015b96c94013861fe2380df32795dae61b7eaaaaafb1be1a26200af474aac4b5e23116bd6aecc3571a1aea9c623dd11bd79a8ad57c541aa12a2976ca114c7a43a3430ea56c9ead83965c1a57327036d040f25e98bd3d26ec1ad95ae44e99d7245646f2eb9c32884bfc9f4d325e0744b3f1627b4be2952a2e98db98be34e5bb485eb12fb84dd7922cbe57ab5491831eb265fa24c901f73d46a81ded4a345ab15f77a04690380c0919c21e44f59023a17257823e9eb34d2a78a2a363c0362198d4a88b4126001492d8f54c7f24616421615fc7ba9e31b8fc18fbc2c60650f445491fe0dddfc7dc01b4d5f53b824b1438bab36832fcec678b5a7b2f87501b4f8d52594e0d7d837658bd832dd7ce889e8a2f8a18a8759d3125b568f7e09bbee081e0a2824b030b9a20a928006229185a05f8c9ba06a2e0c33e01444f4d346a88fa22f19719bc5f08c85c76afc58241e916b4e685ced9e66abf13957a63b4e3a0d8d7a456103db8c00479543ad0ca34dd0290e02e111f4366df8627fcbd13d5c9c04c584efab416d08b5185405007a5f3c7cb843630841a6d43ca307269aba2dfd76c458657500160f8becd2edd3057f04c1b6100e5f3b9a9a35d15a9c037343409470d3c48cec136de207c89f443ae06b11539d2ed3312d0937913220a78f6b698a25731ecf0719001ccd71df3677bb294207ea8e540a9622d7a91c5d29d394ceb01f0efb9e1db722bc06382c4f52fd69e77cd33a2def2c73677215ddfdbcdb65fe5976d0f58b3bc598a07d0425dad13161029e716e47727e05ec26ec107d1fc7911cb88d69f47362bd44c519c370b32c63d9cc5722a3868446e4e94e3778ce671a7514fad1dfeca5ce0a85f979da8b7b696ccc423b605", "635151", 0, 2089465780, "f9a3ef9d0cd1ee76b7e401113bf2bda81af9bde104b3c6265a49e58d0f0e348a"], - ["641c631301e1d3f4298846296fa27fcb0a4fa19f7d80053272cfc16c37a2ff8a98a0277f6302000000065263656a0000ffffffff042312b60200000000045163ac52a27d66010000000003515200a5bbef0200000000046363526326b664010000000007636a6a52ac63000000000000", "acac5352636553", 0, 1492925181, "d5dae4f660587616630a83517d74c53f7dd633dfec2f56b08147eac37f5887fe"], - ["f63687250112adcb84b21a056acba36f9ba760a8971b6d5392652ec26a93a6d2323948b8dd0300000000ffffffff024260f80000000000026500d015bb03000000000565006a65ac902592d700", "52536365", 0, -1593759497, "515a510cdde5fab483323bf1894c8f59294ddc10bfd2a117b81f69f18a55daae"], - ["030000807082c40303cff6ac00b90fc588e5288a1b63b02dcd9b1da62db7ff598bc806fabd4f2a86250200000009ac5253006a53516a52ffffffff98af629cfa00e5b64c1a3ee2d44453ffb52d6202529753bacb7a6d673c4f683e02000000095200516a6a65520051ffffffff80da121003148817771fb6b40ab307f981d102322b22e5d9fbd5974c60f3b2610200000006515253520051ffffffff02595ca6020000000008ac6565635252ac6a5d07ae0200000000095300536353655100ac02fa382b0000000001e0b8e4020000000000000000000000003c66294e8732be9f92435d23958c50b09c389a5c603e197ac58121446b869a6030def15f900ba7a78d6e58723a3b33683bd88cec1d4d43614155eca587498f3fa4722c608b311d3250105bc3f0001355e0e5db30707319bac2b2edd2a213151a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000163a518b2c46ecffd1e5a5e32d92202b196647fc4d8096e349489dfd2898bc1bdd12cffda8d2d7075e46fe7f0a8a7e01448db7a2a85c9172fdd3b06d2789076db7c362a35257c28446046e6c8f5a46eece99ca5d4347972a31ec110f261cec3fda5d6b567259723f94f9e305505e8aaff52c2da5c24406074193dc708991d1f0329840be01f0c7e1e73b72e525d359f7a2a98e414b9fac4d5b2357a95435881c10207e4fa78e1633f5a2c117ade9217ad59de17d13b164542508f6715bdf9509e9a0a04c77a58e5d74eb469899a174b625ea663dc6a29a14d153a07e2089aa13f0d81fd275f727de896eb63a28d8a58e5f8744e5665c188b67751112d16caff5abc590302730348a6d624c628a5a859aacd44b0e9b30cbf077ff506bf64261e0324843c030168d3311c9aed837cd0de29936a4d3b9c85711a07fc2d7fbaabcbe1969040df022545f21ac092f5354ea8574d1ada9e9c7e07da953b3344ebf6f7cd6db7b631fa0216394a7361bb7ddcc36142b7e92876c18eb86e976b161241ee6658af938833c3031eacd0de39303947752b4641b2471181833aa1ecdf1f626c0e94acfc97af66cf6bcbe79f7af9d1086528687a8930d67b37b3904b9c6de9e9ca285f94238c732de95868fd19506d938457ad82769aeab514877aeca6fedb1e64c66bc4985efaeaaa230e86039dae1ae32112f0743efebab7bf483fddddc4ac4bf6af85954572e01214439396abc02b41bf769f9038359f687de201798c2811de0c987348dc6bae4d120caf389fd2cd76a790a889fe974f120955bc58c49a9d4c76521dead316bf66d2083cc61820bc34e46a7e47140306a1dc870fa0c74c2d65e4131aeccab0e9c5bdece27f84a11da3b1dca6c8176d98a756bf2a1c2953cfd4e1af4cfc5d430f3249969301598fa4bb180a131d24db207c3b1a2e5487a9a9b8f982521e91b716637a2dcde75304fd0e44784577543d835911b64812a307aa11898280697b33e0c2c2cab7d4d3f426721db6e59ff5274368da9dddd7364e933349839ea2c386d437ec489f4a95dde66a0dc4dcff671472878e4d7911089d350b7718de36d674041a2fd2ace6942390c60d442e57fb89f5fde696b565d6b96f96061812979309694cbba5c45d68a80cfbea13f2d50f0ae7ebe93a4899789f1399926064ff69df02f47e92a04822650234eae2a597d522d3042ea92d0b39244be8a1446381f6d3ab130e3cf80a9068d3f1c3eb8dbd9d564dde830cfa1154f39d11f5eeeff051f1b25e7af07e89ee9eebde3e29c679211620157f53fc32d9fdb6d12e705b2ba9c5962ad24acb361c7d053d51f90179e3d8e3ac5e9ba09004bf57eadc00c2ca6a80a6376af000dd851aee2703ee302bac10105be75c31412ffcc9a262bb64e328650f55d12af967d2c76fb4d4d713f0f95aa45094e78ca308470766a54402007a382cff1a1ae6ed63f0ac78021755638a6bab4a7bda32142e41d1063153217cc00d025a6bc8eb650792b47d734f0c620decd1c79be8190049dc31a7febecf45e0e05aa641d894aa7d267c183e516690e8f818a8c62438e92cc69cfda93c79da14eefd03be8deeb9fe72553a0de7e448d309d78939fbc3816a1083eb0d46f3e8ecf43f3f440b6fe2b04e407cfe9a98f2b6f232136298040e416f38dde6382a2b3f54a4cd356de2659888fab2987cf11e8ebce133e266038d551c93891f579e84116e64b89f1b2d3c5ab97edb3347a99e6224ce50ffe5e9b84f07e59b21169104b0eb681defd2fef61de81791e5886d4ba7e464d649e092dcdfa345f1751bda19f0a133dae2dd49de9dc00b6f60a78e7239c97ad91b63076f21452ea98f05a2490f41179a39432988e590843244a49b4ebcc37325f42499ccfca856ad6776b56878482df0c15d045c4422bc3ee5432708b7f04afeac083ce6eefe5e954043f47ed96ae5b1aef2ec34ea1605dd006f34b158a7ba206e3c7b575295884fa30e71029e5f5348f754906aa50a2701f547bf11e80974d84043ec74dd00e23d7b48a76d7ebdf8d9d9344727ffe20378af7a8613438c85e5ac8584f92a70d35aa4a133ceb78ea5694c681e956819dcc997764d5c61ea7367f0d41ccb229207237cb75eff0f2ced69e4bc7a808d9571773717a5ab9e1ef5b0660d2b264567642e5642701aeded42cd49e33f1847ddfedd92cd58483f6f691a3282db2df1d52cba1285739b1d2255325f11fbf97fb590048c1f547d75fb88b8d4bdc16d8db94793d13b233d5b6437ed322a40f64b3bdc0125c89db472163fea7e2b65a0d782131d7518192b3fd46bc2f758926b1d103ecfd8b136e6459ebd333d1b669322664fed849e70e85cb2f62cd56d098241278a7674f4440e25c4ef6578e28dd705909399acbe808ef5a2d4e55b91e92d58c78d532dff576de335498a05", "ac655300", 2, -979495989, "3fbc30e8e867e37fab2dc2b79bb9ed4013ff512c58a8056f0c4d37ecd66009f8"], - ["030000807082c4030428fb5c58def105d96ebf845ad4151a2f2612ce6da11861fc82445877f67e90b300000000086a65ac6a0051536affffffff5bf6778583b290a7786431cf476e5eed43322aedefa446b115cf304718288f9402000000096552ac63535151510035d493bec043c8458b999a8a2c6dd5802a9fb58451d264bb668fedbd4f3005223d0fa01902000000036352ac6c1dad08dddab82e0686f7eebd2ce8f1fe53032fb8029025453c4af4807b24069f72907c01000000056aac516300ffffffff0155ad82010000000009655253526aac6a0053021e2510000000000300000000000000007000950500000000f16f6f1264767445c85cccbe32068c189886897d261e18f73b4736a797b41ce5240f0dc7fa64891160e895616cb548f5f956b75ea1fb10ac47589223e5a0c6f3e606e51110afaa3a5e1a03e0723cbf6df758f81c89f4584ad8d1eb631be3bbab00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000119b27182bc53bee67e43e5869005764ef3f10f461c7c3bdf21105869d1d4bb60d14b3cb290707d6c9c75499328f430b1dcd49465bcbd239298f6c590d5fa1773b16ed26aad047a5c0b8e1135dff4fce1a75cc47b22bda936f77384181fb58255813570d35a1c284bdf6283884545e1cc49a4e3612eaccda5fb56cf99628ff6102278b25add3cf19c56760291330b4fecca477732de14910fe904f25d38bb26ede031bc1c83ac8afb5a6796bd9d5bd3d07c655b0f21783fe8f5a0cb6382adff392980b08ab813734cbf5298bb6c0d289ecbd7e06bd8e40b6b71eabcecf1b1576ae2f4c38789a965ffcdcff64b5a063150801807489b3489b2cd128ed8e18daf0e1a8740224a70802992f01b88b00c897f54cf7919145b8b69e60dca569b582f92505bd8603112f958282c7f67f2ce940f6bd889336ee84d959d04a4c23ca16c4ade422264a0322963bdd53605b0a061144837e13b69d847c2fa1e5626bfd580d4d3f33f3e8b1032bcc183a6ed34c248d36c7100432f6550e22095849cf9f8a383c0c3c69a06d21021a8b6c49c0c442332629299ecc5729b4396e5da90d5ee6ffada121eb9d28cb3392ae954b5abc83a5e929688efa38a9d8e13189468820ee01a6f4fa0c29acf787622bf0819acbbda02fc4d91a0cda8548b4c4e2cb24fe3d3fd91485703c7f0385ef16b1b70924a477d41bdc394936166cf3eb3981f10b1ae6816181cf706e1272b95aa66f607f441936790b4ddb67e6551a866becb3eb2e04faa268f95c74c80f9f537c62f6b2b28087cfd07ce53305870a976462ab29e24a33251d9f36b4dc9444b2e0c733056794a80f26fa6d8fcf337efcfb14de0c176add217dbe8fff815c3f503628725cd9ab2eabbb3ccabf4d5391eb61820d657c56582bd458c2bb5cde1bdfb18fb9631ced800de4bb1d319ffe8bd2e53b0f874b0a94048c09a6540cb9e04611a8b280e8f14337bb65b69ea0e9aa07c04f521a5ff62366bebe2dab76b7e0a61810af73d2eb881b615ec8238d93aa29bd639820bf48453bcf649d5153c87cc61e85a39854e1408672223ae259d1955f280abf24c0d0809ffc088181b592f78f89f65aba78528cc716ff5191d125bb80919e069f3fb2e1ca7ada62ac12cf074b4c4fffb856694c9ea73bb964cbe36e49d4f96ff7a939cef696b2399083ab787f7e18b39b202338bcd5fba1a2cbec0e52b6c093f085dcb3992a1d44e5fd650ba4338de945820a0bb50e534e81cdb19024a3a94d86f3f3e314714a60aebf5414d12634832f2947f32910fbac4b617753c49be1a02a28f5ea630feab80f22b5ffd6ef325c39890bd1c47717b3c082c4f6ec731a4493e08dad91cad1bdc844abda6ede5016980b618b84f91e7c0e331d9512688273262fa0e9f05850f183ff44f1dc31dc7b95bf73aa9c29a15ead653d03328c3ac73fad04534dd60cf4ff521ff4c0881e876a1c39f833842ffc78cb719a413ba70baef38a70e739726d776c04b27101651c97c7458aa36aaa95d48e765f48861451e86022fe5cc485156ae3235f931aca02f75d2e4e6a90a0d6af60d7fc160898ce70d2149d8ec9a5a1ec9605928c6932bc0bfe961c34df554f9c6795e9faa52b729040976a3dc28f917f634f61ed5f55c1844736d65872f5b436bb880efa0cb6dd28d0a2cf03cdb8bca15dce1d498037d1c9f452f77bab7675ce0b462c57344e7b225fed5d376bf4b3548dfeae051ce1ea26d5f872f2d9a9b26f4be1a5a616d3528aec9f02c52cc7e0bef9963b2217a4f29dc050356e691e000f8a3faa21954ec7d47000047f548041813491d305b3ef24fd1dd3019df466d270a7a569e38f3180d54e578e18c8c8021d2d5523131be8c91fa336ab269433d197df37119616bf838a85a23825e79163d43a1a9188de006f44e93be7f010bb4f0eb25c8c9e58452c3ffb9d27dc3414942ac040251debc5e787435d4e9ef6fa2345cc799ef872d9c8f6ae749028473264d6434d47bff35872d461532cbef4606ab7629e608eb72500145225135e69d3f8059116d0dfca19a10ef943f2f3795be1eb7ebb7a643e4811a8c0a990ebd5b04f924ca2b49c1496ceb2fd66296735226d479c925e9752610bd52afd12600ee9d46806c681f858139716da1f24a666f8f065f7b5a338fbe073beee7d18e19d32f476553b49271c8a625574ff18dab2412fc7a929614b4830585623230b23cabbffcb704d9fe82c4efc8994feb0ab803ce687fbd3bdd4b5da5989378a5143aa8a30d4a8a15a11b21ac8560e69d1f4925171ed634498b900000000000000009dded104000000009c35fbb4a3e976f38ee3baa11de72d1d7d005ee64d805dda724f4efe856cdf8ab2b0dcbd5ef3223096ba6a8d615a00ee44a15895fc435bc3d3a732fe45634d36839757f407bc031e5fbeb58b1c927f56c300cd765933dae84fc636002cb3b0f100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c32c03fb0a2dcf91cc73eb29b669b0cf153a155859b577c34296bdac4f6261c256e684f0527fbf66f90c82a05bf6b8271b1a428ccda8f45e15f0bfc739ab3c6f2c4c0d61a66ea9f4736b892102419e368d6dabedd11f30df65d97b97e3f561986505a80ce1d53c65e3c3eac830fd7cd8af0f7516a2dffc447230d02ebc87337d0200a7b028177054ac8abdaec8177b2d424d95661ae7a2ad557dab2cef52ccf1e8021f07cc7258fcea3812e80a99e1ef7f9dd09d800c33fdbcf18bcb8cf24f8e884d0b056fc453f6d6f5b0ae466816bdffc24938f0c61334ff86b839499cf465f4bb1085592d46ed8bde3c9f8a819af72b49fb4205939da2a4a49bdee3aa7ecf073271031b5cefd5137b02526d8089006c694fa3ca72bee4f451192fad15326e8e54156703073344d96c06923e8b723171dbf8f6933915c1cc06026aa1beb9f02a8330340a0202a1202aeee9687addd9e4f719a61465af939abdb5d46abf70ecad6853da6d400325615c7bcfadeb604018d24ef1e3b65e327d3be30292ead59fb1316fef0c05ae032d8808a6f03c603a7eee39f28bf43b43f0d01910a07e300db5d6d8915d3da70631db86aa2c6a2b23f76a77ddb3011db2764e47782b80ef165af0e45287de0d5e340ee7be17bb0d5f6f8f7b0fc86e9120ca215de1fec4ee114c37694a351c5bfc9dc6d3324ff199626f59df10f19da4941d7de30053673015a9aa83fb9e3d562fc79a64b1e1f8b8182b66838aa07bdc9b5024fbab47c706e696a96067a19009b3815d30e70a7a75e26ed4c51676942e4eea9c83bf44159b8319a7ea063288ca06ab3f2a3b6be32a9fef291bb264ad66b79dc3c68343b3e426ce8341c626d8ea96b9eebb951a5cb6425283a66e5743d3252483f529a0b0cf6ce1bd4977b8e73205bd84544adffde7d58c7d4611aaa5d9288e00d824ffab8f2c5dd1f8ec2d7c96f44f7d7818f66c6674502731134a63206867d14c4d29c14c25cb39796242a5965a448c977666d5209d13231bd549495e5e7415c51fc23d9b335cdf86b26fbb5f77f8a3587509a7940a461b957e3eae5e3642f0ee21718750288dda5cf6786c6899f77c16297fb59f0a08603bb6d6e4f6dbb1bea288b39941e69b498572809cb6bfe5e13930f3751ebf4c6fa9dd9d64d0db7afa6a3eeea2239aaf2a5ec12ed2a0862cbd62f74a36f27a3ddf50858f1aa183ed0b72ce87e3674d50348882629042b0e4dd4f08bf21c6d92351f4c1ce388a8f748f0f0938ecae3f3c28f85d0b563c2bdbfd9bb55a30cade16fb86fbbce6c437a8496885380b6de4179a301aad0079ac15e335aba79609d885de0b995ca80dfbfd1867e9d4f7ddbf1c206dc6442fb4761282da8d2773606d8c8eb1eac359de1fb6bf7832b250b3ddc96c18df456745fde5911aac647afbbdde0938a0db13df8c66e62771a3e6add0a034e7b022327ad7bf07a44871921670c3c1ce052a8620fe10ee44a869e17fe64e33cbd1b8ff93972eaf9298b56bf220246e8b09a6a1066ffa54579bc729435e0a1cb41414137a37a5a14f0f1710dbf77ea5ec6d31b15e1512470324683b84fb5ffb217c488e54f78c034917960dbf0ed784d2c70d55c6b293183316b8628b03d6e99b7cc016eb4f94bbb049879c4dab948ee078ad0183c94e065f4626594ed36bf4abf9b6492555905ce60b4792d982ea5f9197132f1a0aa0fe39357c4671561c40eeb44333f5bd8646514742af461f03a98479717f7d241cbd7c02e11f687dd68fd32847ab796bbbbe7eec49b463e6f187d35dcb93003181d5a75a9119547159f5cba1928c28a39e978fbf993fefe498f58f549fc584d6e781ac97e001cf0247fd4ec1bf8da34e241bade0682f5c7ee7660e978a728968a0f505efa895a4985b6d4168700ddf36a92bf959b1f6e350a4dae4cd1ba07db7da55b499a3cbff50aa1c6800631dc915509ffad89fb31bcfb5aaf50df96abfb98eab836d49280091858f569422672b5bff9891a77d954927fc14aedec97f20da5f4f15bd4a799513ee12c9ea107b59fa52517bb4ccff8dcd628f31cfa9ce10382b5629de3c93eb53d839cb17f30c48a300ea2bd6a63d81f059561f5bb0a75919f9b34446d6e85f462b775feba07f1f0521d3b2890108951b2568f474f54965362bd22a23d8d9e3b305d9528fd7fd1a118d18a419750a4d06ad6aa65e0a878958bc7cf6a2d0b46db1b9286cfe395c0fcc0927da81314b0e82eb95883cf99b2a0ecddb74918eb88a39477d9bedb513b11d9182e42bbd2d77fd807a127fce7774f9c7650000000000000000963aaf02000000008135354e7e55543bd8e1fc81fae21ff4d00b626bc9df0b6edbfb55ef989c60261d3333fa5c127486aab6edc2156d6f489a51a050766d1512600aceef53d4175a8b22b7c6cddae4c1d65c20aaa40477c61c67ebb12f8441b98db2b270b0da529d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000047726b31d7dcb8925278bf97cdd37322d23da3a7f109780ff5a7e856410a49734e1e5c8f141064a6516888771e8284e9ed1bbdf68dc2d7c658a0e8c3a2e756a763b7b98ca6b923d1e7338ca84b20790beb06935b910404da7c80851967a57ca06f495e4a253441ecc2b8094f5f58bb501fcae3ec5a1cdd55255cd1621a9d2146021c105c70de0d1534d5a7b015eeab78e43bc24cfeb483c32954064dbfd575cb1c020c0a5f8e26269623cb9011a2005cde57d5fa54f440311933999bc19c7e8fc0620a0825bd61dfd6c5b7c6c69dbe47f002152a79c48248a0fb43310487a3e486a771cfb9a1826c08bb48b23fe7bce0ebf05248555d76f24cd4a95235c32a3be3825602293508ba1d8f3c77ecfa91b4a9565dbb293f178e6a39002e75c0b2dcd848e41003030446d23e53d08fbfb5cc9618f5ae385f8890d4198a21107305922e75e27f180224122d4d69c8f2c03a1f59b4e30700074dbfd9cdf2c240da29940678057779f50223374fc18206c6d02db728deb26a8ebd1373e5b1279d77555c2c29b9167bb82f031db3c9c754bec9e1d73db0a7be3f1167d5471d651bb7ca8fe025e16dc1ef52d285675970b119ac3a7e70b9bba39d2de91201bff573965acb400da4d67280d350c405b06d0a7d38266ec10f9bbe6c3339e04325fe5c02cb6e2a292e64b328d12e9a04b4b6ee41f64fdb8c9526a0df0c919158ff02567a8572fac7decc1a4c29373057f2daf687af85467f39302602a63f9faef01e902e56e8baedcffa6b95e425653269dd789b0a8d015df66d0deeec4eafacf4b5091f49559467358b45a36a096db592de5d3140edc4421f2ae6aa679eb98fe09ac9a1ea8683505acab5d2c8591da5461ecd11a185a1e9f3ec0c240c9111296153c1b8993d1ef47fe2c57ded80c0e19224841c802e4b8877bf44b257ef5377330e95c6366a49e36a6963f17853a6baaf5a3285f3d10070dec33a7d1e4c00a0258f5e2a48ebd59edc47beaa4ff8d03337b34911b67d41f808d33c609981b68bd07a19c9166d55eb820cbef73e5f0e5412b8a33813ffbff94a12a25d708939d85d95773f7209a4baa6bac58f45c9b75184ba84511fedf99f81a6415147db1c266a38e13946648d6d8749de346d13048934472886d85af05a927858ab434a500302658e49a890925bbdb822a103663744680cd349931bb376c5dd38a321d726f9e09d155c7778bea1c59f76d0713787810a9267120080f980509c5891ef9a56af3411620b1fa709db2d29446be35602a2e254465f9ec429597cf2540846c3c06594306235ae8ede049152ebc1bdbd8f46be7fd8e4b682ffc898e77436925729e7d70b10a00fd9e1aa95e77a761115911512a911ac3521704d135dba606c7d57b3c847aa924e9aa2b58fac56d5afedbde8a12fd3ff132096fda5fc261f8f5b1b8a34f7a8fd1ef89d47787984aa8d783497dd6c8c0b0ef2fbe91e2f46689b1db65faf662ac9e24c659c9a4d4d4647c488c31d4de7a80a5ccaca1b2928fa54577797a5c37e1848a6cfeb1ca9f48971919dac6ce21d8d75f7afbe3794b9488f0f761965b904acd3624c6d4f527e46e9bd4661a3eb1c07dd5d708fa8bfb1dfadea90edd392f39c44903c43225bbc8320861e3215649b4b97dbf63b89ca9a82317d20697d1e828385e5d96b959ed687f2ef288638bd497c0f1023339a27ef24ee1c52a2a43864f02a90daf6657c9bca80bc8aaad21f46127e8d014a20d0af23c35f80fdfce1baa6c0b9a432c332767250ec846410314fbd69421ead815f9d3794c06ffab1ee8011f3f30b0923413f8aeb97f69a85ac9c9b270a3af39ce7325469701b4d21ef6a5e9e2f98eb5ac5a24b484205d391e4c209bb26f323acd70bed6f2366095859153b779529a080fcaeb2ef2b580e0c251688bab1aa5c7581999cb762b30a7cb09f1bef5b19579fdbd30f526d91dbe7f689a925033021a66242cec416eb73adda8f1ac02c747aa79ecd825bd13a397477278e61e65105b899a889bfd7e8b16df4b4cd46118bbc7cdaf802f1abdc3f0819f1d0e51856ee88075f087ecac1bfd3cb6653af2619ebdaf7acf95939cccd9a29467ecdc8810b74b0ceee4a57ba8c42bbe666ff07cf4319f1361779b9769f023b9b539fbf29be05e4a07c1c7b601b8ba0a8d06063b9688d2fcec756bffc1395dfb7910fbf494571778005d496a464b9982a010b8896cc337a401cfd257f08d8deec2e8c6023f0c5dff046f59b0d12f4570ae2a34a9c3104d32548ea45c22af2638e2113fbf4014dfdc2e1e0bad79b5db6eb25b0edd2419c9e5ec37ad8d68997f2f06dfd3b5833b9b4585f32366a98103696b84e5c516950d3a28ead009e39309afc2a7b134bc4dad8aa0e3fab3b4580ac15de5dcd396e0db5091b8d0d1f9e82fcfc0931bee9daee119af7716afa0f", "53536a635151516a53", 3, -1636258823, "97c576abda16be6fb79ad1f493c8d957e122665201dfda1eaf41b05abb215db3"], - ["ffd8907003f4439c737addc24e52a10bccb29bbdf8a54ae39e51c6c49f66fa3c01696894ba0100000008ac530052006aac6affffffff0a6a22625b5eec41fc0ac959f97aea96f09c6352cf55fd9de4dfd357bfdf0cf8010000000153ffffffff3e360bfc7ebf0cc0c9428662067c42947a15c130c3f2fc0babb7d94fcf99868803000000066a5253630053ffffffff02cf3cb00400000000026300e2b58c0100000000065100526a636a00000000010000000000000000f6178702000000008ce20c3b99d3587170ad3fad0b3f711e3aebcc2209f8adce390cbeee400abe26397819001aa478910dcea3c84af46bab8a81728ec20110b5b266ecc337a39832b208f2c291d1da1316432f86460ccb0f59c2533f232a2fb6c76ffdedaea1a13c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004f0e0e04f62d4800ebcb36cdc2b697248bff780f0130c57f8a2fc03ce77cc549b485fde09c942d52783b45c2f68da7fa4167516d77d2192267df3bed6318536463ef7076444084eae7a9f1deaf6a43334420a80dd5490fb69c84e7b06af15cbe91cc75c3bf1a9ab644a8c90d9b5ddb74f71e3f4c942a8be2509682e7b05e15870229e6b5fda2e30793e1d02ea28ad74fb021c7bb6eb116a48e6d2293cd9a055fcc030ced5abb4b1ba396a8a9b6946dc60f30791e775ee618b697013733531a516f470a04cfe655df642373d571131aa34c8599199fc51cb278f48ffb1534581e434244923de5663a2d0b49e28a50034b69d2ae4bad3fda3bb3ce99041bd07210c7d41f02135ab0a9491382f25496c9ec411f3ad0b92dac88579ff7d171942e78a583fc2d021125f9b553f9f8dc7e0983c0a5cdeb4c713ca62d293918f08f6959d8f7ef064402122087b955e021f5493fd2c5685241c1889ffc822eff48ea4b4ffbd2a6d1cebe031eca76ad5d83ee478acbbec3beb21b73d5022603d17dfcf8bd66908e1f3e5fc1032853516fdc23af8253f471c7e152daf10ce8c50c638bfb8cd01586f1a90f3e3c921c5beec25ce019a76bc6b8093f051a9cff3fbe0191dee78e1c7ee63b83c7b97461264a4f8dd788b958fdf575440f5ce5ec6a3fe07be565fc6a52e9de6cb55481bca36006c5ef4d41d372aaa8b72ebdc73bdb7e05ec6984a66c1ef2727ca60f0dd1530714ba2a6fb77042adf9377d2bbd0d2097df7ff74d04453d8f7976b3857d3e6c1251addee91d95c97d60a09f4081babaeb473ac118a4b98f0c2d5c482d3bb95ade50c79ade5c85f23ee850a19cdf6e0526db43704b31e0ad7fb6293ad76e17c0d620bbb7e2b06ea7c63d6b625ebb5d7cd00988af06095625f351124143f38d4e10d2d1b877c7fe8bdb3bd3fef2e9a8f27f1317c5085def828e9ff15685f332fe1700a22ee082a3ed9c54c4064520beb2534556026b077f8c3b3ce9855d701f969cbae607c806516bae3b10fd80181b92c03565d4105ee1437a10b5f3a31e3400659332c199e250ebe984a8375bcf9803116548f4dda6695e9a0766bc1c1c20e5f3a56173b4f632ab8fef9be1004e1bbf18377d2e42cd0683aeabd6aa99ab45685ee4062b7fec86168debb5bf06d2572a6dd62dde0ff4e59c30814029b2783677780ad0381020068ca2aeab5836daf63dd9444368913f37109489e6e057ac4aa075fdea1f5c38eed5580afcf96eead513c910daff6e4a7afee0e6c1bdecc6abc5a40f67b1e1fe70389d92c1e453a2f7e7db2a6dfa3a0544753a110f1ab48f9637a12d27de6311899aeedd9e155a0e4cc45c0d989b6ad2bc11a60321d7e75df26d4e75ea764514cfb6fc3a989149da1b12e3ff16bb3efef2fc500c480dfe56d290b12b9b38fc8ff31e7f78cd068aa6334077d97e484076ac5d4a470ead88843c6bd3123029b3522a7ea94d11bae52bc54df46e9023ae51685318b2391d9bfdb3164aa209943d025ca38e4c12ab928eca88e32e7a8e78370fe59d284ceacc5bac2bac2a41b9e2ede857dbd0e8cf3843edab019158ce34728a0838df3f03c34e9a97d050fd4339bd8e90c2553971168896ca6b248629ba26f4a922dafb3b53ef68f815528c40511382b03daa944da778de301dd3dafd65cf25c83b16269779e21e50f618faea6b5b0c7ad34c9cd5425a300f829d89177ea854641ca0f0f1cc443efcc6a2a2494eea81ffbf80132e4d01aa0f63301b0b50df7457405222962d7de63c3140f12939af47cc0f0739bf3f08ce25483f54caa16ac85ff91bfb73611d478839ccbc077b14b47873e54df72ea1fc8f3c4f66a1601035ff903f3160b42cf59684f98cd33640ae3a6e4b9a6d0741fc31083168676897f8096a567f5801e46d15a414bcf5abb1e9e4d8bf8a9bcf453218e059055d8f2af65b42800639b11f20e74164f3f51702cfd77ac9cb76b24a97b1ed96ac46698fcff484c27c8744b07447b2abec281eca33466c08a83036e031f5c3f11d67f5475dc3005991a3196fc278d1832221af1236673d385078bc9afd79f522208937c06d3b171cfb1abf65936e4359773abe3d2254093baa772c7c0732f8725343aa2413c8b1f5e898e81fd60685ecc2249229f0bb89811f61353099db8ad69be27874525eec3f8e9814d61d5a6e0e4f73046412db689d8ae5e0565bbe131d970ad34c1f7fdf791a7b4283207b4e3dea45c15db7ec12e671c6fda88fcfcc698f02a186f785ec6352c940cab939326b0cad9515b322ab12d407296402817d18067e7ff5de2f8233845449983dec9dd92c3cf11188bd69f614a13fed359e6692f2d543b60367f1c272648601c384322d08a75912b18c28e41c40e4849bc4748c3bfaee718ebba6b9840fefbd43c6dbcb2bedb2af34bdea30041edffb01", "5351536a5365", 0, 942676388, "d370df3ab4b2f05a4c0c5738e1b192cf4726a329587f3fd2ffedf07be884c6e5"], - ["f9e6b46b03606c2e01d282c5e65e820c372519986aa54cb63005007e5345b4e8237147c8c60100000006006a6a6a5253b256d739c86be430ff568e08355d3b57890522784b854c3fd22bda7282b65f5a745ce476020000000600ac0051005146756957c567e90eb7b4382379e44c290e62db356d76e603f9d0d2418dd742f5a99f915b0000000005ac0063656a118e6c390401d2c3020000000009ac5100006a5351ac51bb337005000000000165ad95a4020000000003535265ce29f3040000000007656563006a0053e259496600", "53ac536a51", 2, -1457217317, "ab083c9e4f2ca125bd14bb670a76df10c174a0190f88ff69413c7b995d2d1670"], - ["030000807082c40301afeaa2fcd3398e5414b0947ef07a70c9f1776a12409c1f16f0ee30992ec9597202000000076a6500525265636d0f08ad01cd100f03000000000852515351636363ac5d4597690000000001fb19e204000000000000000000000000af00223f58c89eef7ffa4a5987c6fff64cc1958a34daba6d85bdf5495cddd523ff4ac70d774db09f16dacac6cece932d279f5d00e747f44eb965583465025e18f7ba41278ce5a82c120f524895e42669104f49e793a280972673ec40f191065300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e882fa0096e690b7a4cb386049ae0527a0f7bfe5102e0d8439b4fe7d2fd3740173c2d7b8145503134a1f659beb8d1ddfc81af9e29db705802c0391a06ae6951a6542290629aa6bb2564ee53337a5675b22cc66975400201fcb3a4019c2a50cc2d828fad328c8ea3f2400ee81e42c93e0b741f8997d8d5b8b4f6da75f8b3730c6032f1e36ad1b8bbc316aef15fa11dc09ac88b8f66ba83dd51baefd4c76856cdda7020b51b89a791b4f79d28652730a47d28a59ea9e07bd370a7f6771d974ef3e698e0b07543da6938c107f1bb89926a766ce1145a5031ed7b16730aa87c80e5b3ab5a9c84ad8d03a789a8a61857517c2373d3f91b4710fd7f24cdc20252c67de4637ba03045ae98837010c60136f0ada77386b4fcf82abe82a967c11efe2b60841b1909003068501224f30103fcf0563ef99052b568448ac7e29a2ad36c2f92736344779fc0208a785667189921c1c5fb347a753bebf2d59ee20d5e77cb9585fea7dbac4e5d0032a1ec4ea3b9eba7d868fbb26381275571a052fcf518af960d20dfef052ba6c410327f6bf25bab8110aa897ad0465ed7135513f971284eaf287980d02e681b22879587b299ae7e025dd82bccbfa9ed8461d57651022e10332f3b374486fedff9c4c875323e25b332b57e417e417d90771d7f186895a6e7fba9b791f1d55c05abd114a8bca24c20530e9162a7679747c9cd00d9929ef595ea9eaa6438af5b76375b3b7fea626065b15df9f21d75f4536fafd6d7765da6ce7c43bdf8b9149f4727c9e5f57f01e1d4f58348364bfefda8a4ddb10c9a5174042588da6298d31840f6f68c96716d968ea6cd70f68e5b4f8b425fc2c06f4c2fcc68e7010b0fec9d60750d8687b4afa29f89a7352196f56bc7350f58e8df469d2ea843f9e2db4ab80d73c998b995112e4cb1845d53b5cac7dfe5004fd4e29e87e83c7fd798ae3bf316b20f4c0688834f854b5a216153cee2439551e8f712f670efda0292772bdae16c618f1aea03bff780b39816714c27a84d2f1966684e0426faa62ab475c1f7e0145da8f4487a3dcceebcd0d4df00c99b8f57ea913878acb4272ca7313f06c9c69ce542d1ef0120d87e082035867190ae9da551f864f796c12d96cac91cfae64b1f00160e29d38a3f1803da2f5eb56e414ab32431d0dfc64969e59f2333128223ea395834526d3b079a0bf4ce0ed81aa9e932556877463a78c1e9c4ad230a6e13c269c3d18a2fb6ef836e6d2aaef4eff3ec174f706722e12abb286b9b8b639eba3ca47b38f1cfd0de53646fe114fc1664eea0504221237f6e0304db6ee28a3825ae772abbee39057c9d9e0606426c38c63b598a04b4d5757d09524d2e00b560bb8651f92c7620083ab5ab43e2a57ca0dcacbe0f698439d07361e16847f21b442e31e8dea19158a7617006a4acdcc28d6434f6a87164647a4051682a089192ea9fcd3f5ae4aba23df05554e5d7045acb2e1f9060589bb37dd597cbd47e4e48adf68b14b4d39b2e20d75399ffe4105fecf75087de65793e31ea3d46794570142bcc082ea877e72a37e49aec50b197c66d93118260cb19760283acbf3a18b7590bf86607568677a9aba8a04c8013af79e47a3b0e24ee6cac739cb546b67288d732a217113e2e2fc489dd5fbfa07549432207904f658e8095b7729b2d22906e1b592570d175952bf082e3d2eb0faacdb24e565ada7c235d4a80c5f486a1ac3d4389308bea7eefcdc505fe8502ea6e60da17cb79182ef9e25ad39dc3863a3b39ce541a7e9a871b7d591ced112650b20a5fdffb4e98d775feec5f315542fd253a9ef145a7e6cbfe09aafdbd7ec8e75ff345851e1473d4abfc37c89459cb922863432129cf3bcb0643cbc5bc6f861fe9d98a435c2d5163ab983311228a2bd23f7ce1d46c085014b2296246027849ba3daabd1f3685f849a7542c1471bbd0ea5df0044377669292244812c251862b168a271420ca735710995adfb9951cc057766ea0231adb250959efc0c492eb7794c5a2021426e2f24176912f55774fc9fe32c305270f94a15ed3def7ad9ef98c18a63a44f833d703ad9e48ae5c5f5f06f70ac6c372347efa8fdace35dca1ebb7bee974a6ff0993dfe701b042ceeb935a3deeeed111c07c631dc7c7175d3f9f62e81022c5e6e2ab5026761fdbbd6f54a5f6834ec4eca86c4de1bfb5d9eb17d13fb6c5aada4d0272551af8ae9c629915fbb00bb932b1b7fa065c545cce36d8ac5b898f5d5eb5a86579a20fa7fe2817ab661a906e0e483d8c7030be3487df9e667ea7e8555e2fbeeb1820c4531fbe8bbfb217a35613a0e2877fd0f5675955d5d87408a6eca39e819f8309af7d440661369a09c0f94be8555f48d28eb829080113f5953547b2ac7f9565cb37a9031234fde9ae8cee00d37e3670817fa30ad9608f5b2e372d232fd51741f04550b", "5253515265655153", 0, 157408316, "502cf4a784c4852ff0255f4bbc103588cee14b94f936c46e82a6285d8d72db12"], - ["030000807082c4030245a141678d93249978984593e0d27572d06e2689026193b75ebdd0fb9c24a2c2020000000451650065ba6e996bf3b72d11a6de9ab47fae1d49b17965dab89d526a1cdd94977f144a503b75b59b000000000865ac0063526a52538fedc75d0456f8bf01000000000035137e0300000000026363db63460100000000076551636552006326d7d3000000000009526551ac636300635129c048a489c61ebf00", "51635300656552ac63", 1, -927341002, "872a3d504ec7a4c0ec77b14b2930c87480d6784e2cb6bc0343ff6aa21adae4d9"], - ["030000807082c403020167ed2aa2b4cc4d6ce13f933e2029ba32fc64787b1bc15e28b2767f5c950e1f0200000005655365ac5214ede714fdaff1874a1fc0ab7e7b43008afee285e939c1a74fd6018d52544bb5f2d0645c02000000030000005b27365e0265b47d0400000000006901150400000000066a51ac63525100000000e2a764a600", "0051ac6aac00", 0, 1002849087, "033b79010c11d93a09eeb153946e611cb0cffcc08c261ee8e5f1f819580f5863"], - ["f15f8123048f582df50ef5fa9fdce0aba22417beb6879ccd2765b83f042c67a55f1f34448e01000000056aac63ac00ffffffffa44fd3f90950a9c97e0f0b465eb299c57f34263a52d90e68b68810b414327fb20000000003ac655204ee37767d8b515bcec271c1fcb0281bc238ce4d7109b6e9eadd3f0f6bed7e01e921d5440200000002acacffffffff08298ee1dc8c80017b95139fbc7656cee5b176f75b643ff9fc456e4d3141b27a00000000026a6a4520a63b046cf08b0400000000086552636351ac65519e278c0000000000026563f926ca0200000000025163f7137b0200000000066a006a636a63dc26b8d40121eac301000000000000000000000000cda7fbf7a302614a5b58120a7d1d8229cf2f4890a81122dd558501d4f9befdfd5148d651d645f5c1eaea2c9f9276bef08fd0d1299ce10581fa38772eccc7ef166f2ff36f32b34399b3d9005cc2f68878d45b144704cb1300c45d13abec747937000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007784db025e5e6d47f51f28e6b00af62a14d7f69668258e65ed474d59145421b75ca0a1cf1711abb7e560347276aa88d0f69fec0b22d3ff0e3c456ddc5e285738caa328deaf98b82c667b05cc2f78cba40f6f0a319aad8dad413070593079f6f56e238ee190a215995958b3fc41eede3aab384b0f3475ac29befe287ed35c3dc4031adacde96695288c61079a31b14da4fa1be0d3e91209ec8127cb8e6fb09142af0201c6c9ad092ce34b5f119057d11b8ccfa61a66f1a1cc00a63a9631a4b58f17a60a0675172aef35cfc8d5f335f4a7fc67365dde3cc87bb3e52a7b6f8817714083c0d6736ed70ae7cc76e6185d617c1aa3e762beedcfb7394373acf5b284269a41c20321d97edbd2185af29667137a36f5f82672432a3d0cda500b15c2a0551931331902037d0bc89ff56d97aba66a6b77cf9a79b258dfdca4e0774a4bcb47c288a81b63021d08ccb0c5d377f9048c9a9d5d7941b2f5b612faeb8560f4fe9b7ce1e00898fe0207b685217e5f731f8fe18ac9d497c4bcab191f5c8e7ce4cd03606f0c3a5b65c80227df14e8980e141274f024700b63a3f012b1cf2ba5acdfa6b2a29c97da9dd9e330e925bacb27ac328f5b5016f588af61b1e720b4d5040a2db430c3d9090db7a360579ee3b964004674dd3c50398e0bd7874571c0ae6bd00dd1b329b01d94d39876e7fd74c48138de5880ec1dbdfef406df1978037199afd60cc72ba70b97196338a50b1e5146af370b77c303e68738f2952854e35178f77da44f77593a048cbc373411349cf052a3e07bb9b2e775f306d1e675fe13926074cc804988556795186f1fa32111b5cf150a5e67dbe098f6385fafd776ea8602d34b675572ac11c83fa7433ec258471e9cf9aa431410979266d65d9004ed3d3ad3cd0efed9af121e90e85cdfe5a1a13704e87513da068eb0df4389f211d38cb509f834eff2399bd946348746467096e5e5357d6377dff97ab248985456b8616d031980379b861394ad99b2737de91d20a1da7f68747407c12c24743bb4a53b6c15260a4d3f675e463b03eba1e0f2a495481a14e4be5f0ac99ccf9d6dec9d14b589ece2aec40b81bcfb9a1f15e065a50a32c501234043d6fe5c756f6c1c662ac2a618a7daf409a51e581f96feb8b8ac08951076c8ca106abffd1eb43011c7ce9b11c74c411a2da07fb41f08c2b5c4af184011cfa821bd1392773f138a79e0655a3f6241f4a0c4fca29f2bee4b862b8845b8b9db6ab332ad42e12b60f9c029ba94bf3a5f16e3bd6baf22506b74a0fd0043784f1fe10c768a1b31924beac03b583057b8703eb16d899f222edc343b545d7505b309bb92298a702e2fd51ba39be01b33c09f73f030a338b08c363c714ee17c9ba06b9c81b725b375967454677cbfac41bc8ea14280a6b10bc8dbaf9a1c8f00be7cb62c1b1437ab7ffd485fb0d190bd2faa225e737dbf1e6e368633de2a7c0e7d474e00c429a586d11560c3793fcbfd256a48d3e54c6d5f7f8d0147f0e5ea429687f361e2b14852cb48c1fa6d0740f9dc45b8be1717becb208141156308d90ba131b52d756801364ff01c29ef1dcf721a18ebb3e062cdc6c6325db187ac25ab69b62f0e60279f0de09f12d7657dd1412d7aca59f05b893904706602fbe9ba429ba120837be53a73478eca7f442cb9b307c4a59b933c05bed76221aadf85069a9cf9e4c6e19934e0faa1db5001e181dee31aa0b397143e703d33ac3877d6abdc639035a5acd7c2d8b824869600cffbe9fe8d636306209af8de8351807914803e2cc259f865d38f61636f68bda8a5343fb269ba29fdbdf655d0d20dcad8f8dfc38bda3867663c56c7ec02a0fbe53ab3e28d3af1e0a90efdee7aba9b8fc2376adc28954d600a99ce0658ab93ae416359c53e59226197f8324d3169c5ea876dcae2f14711b27f9d8f78eefadb00ea6a33a6e6965146ee08a64f50d8af9af5e4e6e1037ae02d8826ff1784adfaa3be662f51fb48c900d2ac915bad7b3abb5868f7f32a52b94d18bd866a9c7da8c647b0f4ebec9f3d1b0c60f44ed6f42bbb5a824528ee9b318104b7d5ceb00414aa599c2ff03de58a5701f006da576ca038c140d7028f06ca96be413bfddc2f430dbf00bcd39566f9cbf523fcf10257537312ac4e1df1ed6239255eecf91eea3a0606683da9bf6992252e61b98c52069be1a624fdc058014cb14d83442cb48fae5f037351e8f1212005366fbb0ab3d9146f3dacb4b22f6dff4d01008684fe092be2564685601027c76ac83d3d52498f126dac2c51ab2e23db1c722fe956c9ef703394cf08ef5701bfcee3707d60194479dc6f2de0782d234b685c4d9f5de6500e5d5fe8629333fac38f12b442410be6ce113c8d2f24c772b9a6c82abce9676365930a4dfb665faa89caa6035ffd00d6e0bf17ac823b14897c85d96894de3de307", "535253ac6a", 0, -994397550, "b35cb8a06496928df98099c8f39cf5188edf9c0d2528dad9450447470567311a"], - ["48d4f15f014862c7387b2ebd0d85b6b5d37113002490b60aaa57c45b1c53081d5d4c9e71c701000000030000acffffffff03d78356050000000001517ecd2304000000000500516351514f2f1701000000000500535252000000000000", "535153006553ac00ac", 0, -1283359962, "4afb28a77657a37473826b248731b692dab3766ca0c7b0656a055a88296be2b4"], - ["d5b09a0302d54cdd1691f727e6068fe3ee886a4f9239b6de144bcdcfd3fd77de0c4fe315210000000008535300656aac006affffffff628598866484dc9c8eaa2dd6b9b7e88ece7b483eaf9f8ddcc9b841485413e4670100000000ffffffff01e0641f02000000000463000000576688a102801571010000000000000000000000006f973972226b631a3c3892d13b020195b33e35306e8192e1da65365ea938bcadddc469f94d11fa4cda38e7efd2d67480802d5d702463eddb5481c456d970351b71a14cf025bb82111d386923478718d384edc435f14547cb756e80e83cb8848900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c64e254ff4b3c2088cb487b97eb238416ea7203c22522ca2b3a4c93ba3e2983458884c2acf68150baf43d44151bce5958651b0d54bb4f90693e1d899851bfe7abd36178e0437820bd1beb193cee5deb14a5524b22e4ec0b57c6562edc8891ad9ade4a05939910622db2eac0cfa3b45d90092e128b972d2b9182ba2d7947c96730211f44e9dd38f9ba09d360fafae6b39c01fd57d6b6b1e564f119422658887fbb2020f1a2f817360d4cb9bfecfbcca116e17b467f8131b0cfe9562545f26a4f1c4ef0a060d93645a5282d75914e3ac0ea73c0f0fffd1f5303526c3402ada48bf1c29c41afa148df98dfa0ce1b50af77d434795c8bf3d806f771e71c4266344ad65253f020f8882a6015a408fb8cac64e4ceef3298813888f1f1e7138cbf4f224037533aa0322746bc8febb5a0c376120b468ab409f47b8a32144297c7c7617437d6141582f0215fb3de7ba233c060d1991f5f1a6e94506445f96b70bb917e0552af8f791430e0327eea09edfc32071bf17c0ee73a1283b157559c99cc58f29cef8a94517bc3427030f3f8b78a7139d00e71f25d49f09d8aad0ede942bdae3f7d4f9fb10a4a681d06f6c0d9c8a785ee15777f0f67f66238d4346c9f635a027df8dc2db5005b0d2e323f8acc67ca452a653f52de46094680682b98a382a1cf4b4e2981b4c7d208add642f8c06072e6491a3a9241ef3291aa673350ff4dfcd7d190e30c012db4f09b6c079c8f7a89e4e94bdfef54bde03cc4a3e0c30676248caa6438500e5bebade8e501c5f36f8f8f972f18385bb766ee97a5c63fef806cd52d3692e93bc96c62ac1ab1449f187b6ec22a648c1751e820603366a4995fc226dbac28f450df3eaf7fd1e8af48ef3558f3a65d383bc84b0f298c3122e0faed14b15c308ca5f074f0ec448ff88f2cfca5adea9fc41e3d6346793ecae937cd8a96f25c1296b3fba17fd328b1cfe0e49ca1f4c6f7f973f4a71e78e5cb24c643725bc238c604dd893ad1527cca3e5fac26df5cd91ae3b4854626e3250ce6fe197b7304e653831a1b1d47840644f2ad1c1fbaa2e782271ac2a3fc282a56cd18b12172fe9b4c4423c989066fffaa6f6c27af5fc3a0531f0fd8d914e9387e3635b68c0ebcd7ef674dcac2414717ea9ee28a0b60b03e2cf56d91a8fb165d510a85715c1cb97696b14a96fc6712149afe10cb2b675723f4f23f7f131380b3ec328ef405c39056312b6a4b9eb4ae947a068834d1ff8fdafa039541ac0f1a9a68117c9c2449b35d8ab06a6e4e6f34dd45adec46faedcaec0ec4804358f52e0ed2a90d3a9fca6485f405f44a92a00cadc52c29adeacc8dd5d2e799e0117abb90688415e3f2e2d9b43b800c1d46165e4afabb8833153ae93d88fff5cfd76d905a5d11cbe7ab1906cfa3ff998132ee4b08c0dca09c4cdbeee0309b09a9d2b90a4bbc6eae170f82d783fd29622a4e9caa2fbde4c9e4229b6a6b081dd35ab280501bfe11b5ef1612f36f2753412a3108701f20ffc1db42c90251b137787308f15573f87beeffe4847ab58acdb9a9456b7b4144243066a8863a489509c6d98c8a26e4ac1357f26369062968f4e9385362a90ae8fef4fc2b8df6a9cf11236d18e7d7f7ebc09e4b2e6e93e62c5a9ba374917f0699b3ac0813e386e291789f29761a4fb93d87eb2d0d6c6792f10c1c42555f074e8c7f409fc624e3cac54064f1963e1e4ebac00cafdc698fe676b1a4338a84e787605bde27c017219fcbf49564a1f7eb8f67f9e6d0c084b3d5073572147280d7b7b04b135047aa12efc160e76eedff54ec6f89f517a8fa47f9a1d021224b78a774e6d161c6bdad4c53a1875636af032c81a05b11ea1599cc43e9bf2648c98c1cc0e8f434a4e461d521ff1d1ac2bd3957d0a47a30dac9c2d78111754928375c78ea8f0708434cd261583b905c653fb057df9239a6aab8a6bb46a7106ab326dff6ec7da1f10bd2d87d5cef40b0f2c1016249e8fda7bb8eaa755097972eaca96fead122bf59c443a0ea1e7a6f696b45c3cae1f3c28523a5121b6d0e3158d2eb02cd248888e31bc914edda30fbc6fc8d8f0c17061fd0dfece0caa6455c9ed4c93c71636e765991ae76de8aacb2d12453b2285f99189b4816c7a8190490c1ca5069375347065589304ce09ec5e2ad6a71ab50d6a0b4c34acea0cbc1fa78947615ee7b3a02ee3fb251b72303ec53487a0c00251c4febedf10eab76dea98dada2c524ec34242e1cb57ae294256ecdbc29fb5afdc8d2f1329f5f91f39af0fa89d67f55d5fac48d319cf9fbb8247585e7cf4c9bf943af900000000000000000306c980000000000ed8b19b2f11215440819e60914694f2a7ea4605b3fdf37100d1a97e8d594975d9e97d72f9b319b6c906b6bcb4b29e2ebe30337c5014661a0063a7639520fdd036efffcc2474f6c0b0f8540adb94f9aec40a859da1772037bf2053583356daa1b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075675b59bc13ce78c579b48c59f3498f0ae599795d941059967939d9cde6a47c5d96029ffab911a6ab48a0b8ac5e5a87c870a6028e4b8770cd77f8db3c1c6a997c0fb398fd900ba9c9ba3aa2287054015f83929ad2b241807dd91739588fe23e454200669824ac0d15e3384c1b3bfebe4925cfe840fe527285fb9775085863bb020116e2be14eebe61d12756ed22e4cc79cb05db30135e3f76f70841a3b18b05d60224d9e146e110ba8465d3d703ff8f7e7908ba439a70fadc0b1a88aaf6cb2e0dcf0a0252aa2ae50bc331e5e13490b772f27cb79e08d1b66d8ccde99be2b465f0be997d4d74717ebf31cefdae9972ed14f82166ef364c06dec00292d1b59a9e0404e303115ebc8f5e3f59665bf85856631225f08dda7c92537830e83538b361c9dee14f03275f9278c298fabbde6d68a6ea6a182b2f25b8ee57de28c5afb44757dac3b490020f5dfaf6ac6f3ad9d69ca70d42046522e8f72f8c7331d35cef1914774a1b5d7f021e07966770ee83ac4d1fbdf66e2bb3c8733cd5817be9e83801e3657759c2c51f0214f9e7e1e4bd7def12bab41e82267be6c8dc01a5e630af9f4543a16fbcf7ae3480e51842f171e0de1264d3a97cac0d65d3e81b79f1eb617e4f507e235557611cbbb0d9b6f1e3c2b25ec5ffaa3adb890ca6db8515ff49df11a496f4fbb6778c4cbfc2e2ba5ba0194f3abe5fb6cd7361b293fa885925a7badde11e5223c35ef96105c5fcb79095b19aa2fd34ff4d5aa6197ba08eb5f2da8800e5270748529985c0831988c6efffc3823b908377f87361d9734907fe63eab53b16a517c30d93b6e48e35749cee70f61043e38dd19f4cd88a61d552159957adfae0feb286adf5c8732d32412105c658a2e6a037b38647ae8b06cf0cd843b680903f944127b9135a39b725663f2b135b0e2a027bd01ef681bbea65209cf29decfc30c3971b0a915d24306386834b0be11bc3a70471cf0ab387ae953c3c6f10414ade4fc44d8703b6fe64d42535e7e491d87666ebd8b9d6e16f606a60f12b4347746e5a07fac1038f8251d05ef473924220d67ec1ca65d1d3094afd6d5863045c4ccf5c55201e2f9c44645a074c215a24678829d12481c4e173e3fa9b580658768e5e81a3155c0404241b58a60eafdee10eaa1b76cd03dd45d45fa3307d522d34092214741b29761070a76efed7501162c550656d529d9f327288182fdd6dc90f405a0c1bff25729ebbde0cabdc556f9922aad51540aee674e94c022aafdb05f933ae9f37ac4a045550f300af77c755391d15ab1dddbc63385c297101ec1f3ccc7806258a5e85634022272185623289011fdb26f052b8eadb2109e77744d19b4dc87e23b92ac82a2e53af0d328afb793760763d05a04dba0ca5112eaa3e994e866680bed9ee0c94c06713476dd0573bbeb45c2ba0e2348095ce440b9a4707a7c4be42c434b7c2fa61725e071cb90601272819502f5ba9731eec86571c54b4c58a74accdd08fede66e8f9bcad6086ddd4436a33cb383c247060aeaccb5d99792cad00f469ef97d6445d78434b490035f70bdc6fed29cdd44ec150b33b093de6353d7bf6029537b6d9b47dcdf5f9099e1097feda299a7048edfdad2039bbf1f776853ca0b306560cc2d4f5a89543e6b9122df76329d357f7829222ed77c71c4d6fa4a76fcd8c32a6729bb2709fd0a17d0e6ac0cbc67519f784113f00e40c4a8fa8a2ee2d9e367f5981b1cb3b003bb1411604b038425e4dec9a5ab3e674b820e5f52e488639149dd15698d5b4f66b5ca65dc4a75659736a88db65474bc85df01c87492171f4ffec7c502bf502f42a0a252bdc1d564c950eb2eb628c2848146876eb7735c28c7f3926b9d98c58118b969f284c0b9fb2264d9e2aca6f88b54f7d985f558a2734d6c722b2d0c70d61deab900961628e1bb102239e040f89368392c115ab9470e2b938c250bce53560d682b4932e06dd8bf31bef8df2110c16449fdeaa890ee99f3b1ac166ea119072a7c7ecf079b85e620b6309a05ad7520317a522c07c61fe40289da504088ab98acde017fa08ab81f71542b2f22eba9646b93c2c79e9762666592a0225b6ceabc10fb60c9ec5d9d4a3313dee37f723c33a92df85432b6e969bafca96ccffda6d0020aee011dc8321e6c1ad5ec3ad27f3be3baab5b9f061c119e7eb36105ebbb937c2810577a41a881ea8f432c63ba41475447eec1aa9db9162606f2d987fadb2965fcbb8a040f493704db56599e587efd763fe9333e26e7660a629dcd9276f9b5078d60e2ae755f4e0fdc3afa509ccd7614af3493f0a3a69f113a1ddcefe3b7303dd80b5d90372304f69a9eb3507111a7be17fb353fb51142f849c60d3e0ba1d6cfeca66f0cf41a1c6988fc5d5803e0147674491ffa9f222b64c3831051ef9dbc4f85e19f5f9a83d5d3f331a00498b80c", "ac525252", 1, -2064367891, "4f56eed55e111ea5a2e52972836722b33b161739d8eab0944b810daa1bc8e1d8"], - ["6008ee3804a20f64df705b842b76b71838c69bdc68da6ba4c97a00b007e652c080496848d2020000000200acffffffff126ebe476801a1091783abdcaaa4a9443fe8c95a8594abbab7f76739ca588fd700000000076351ac51005300ffffffffc3ab927d9d9e2eead9753d2204615920b98ad6f5c0954c13bc2037a92cdd193b010000000400526a51ffffffffa2f0dc7379e62f50497a53c94672ee8fc5af1b9af40453df1efa08047459d55b030000000865ac6aac6a6a6a65cc42eb270446f9fb03000000000252659af4db020000000001009f8b2e010000000008ac63536552536a6a325814000000000005525200635206f80a1701000000000000000022938203000000000b7d9d11ad4ce99271f9906fb4189189afb073841242f1032a72d84b9597e73161c28e6cebf03e2bbae13c070ecf8faeffc5e60408533499bd91c20b39356ce0dcfaefd94c9ee2fcbf1a3759f57aed4d790261926d5d9f1d4eee2f567151583200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000445e3857069d100fb66e3fa2152c0d8fe3184a4cf9cdff39ca46c9aeb6262eadedb83b600f139b0fdbf2ef0768a0c710c006e6ed3cc593ce19ab8cef08653fbdeb899fd10d3d9785078af2f21cc88eef1c450013610775669891a15c971ed2ceb0c8b17d6ebc0e2882796ad9fcd33a81782a6c3d2bddd9835439d749a31a45b00224aacc71cfe12d09b938f1a0ec45a6d0625916e09cb4d2db267a23e26382fd7a031d3b734480c97c9388944fb4531667bb0cfb87cbeffc6ba0871f8613cfbc7f290b0258db03a5075a90645993efbe6a1e97969b7c9c2ac37dd81d4bbbd37ee0781baec6513a0a17c62ab7b207982b713831eebaffbae80bc6458858918265ba1bfa032adf53a92b9da7989d667486e63522a40de665679c264cd2b03eb3b4990ef32d022d85569d1e9ca98412b96bd6b0f12b97cfcb6e16f3a63ebc63e85de8c49e683f021318a2f8ebbc94a36b59d60dbe43f71c0117a07047688e8934d295d564f9e74002076f7129445abb3a817f0c063da7ccb4ec9f2594fd640ef7ef9f8ce4a441ebb003091ce25cb9c82edb1f497d529789b368ab27e3f9fdcfde9f613c1794f9f2c70f4fec50e7b82e205129a5c952044b8a56663eb3d107b1bd0d9ac215c581750580d50f681d424d6c3251b67360def85b1f3c6b82b80cde710eb6292be57e9a160e74c5d39288f6261ba5df3f371052b7939a2352bfbf8cdabc4756f4ae52281f18544f386eeab0d8ad79dc09e83e0e4e9a615190cb9061111a1dbd017b7ebb282f8574c79dbe81bfb69795375c1d4637ebe229e32fca0ddde792c574ebef7771b1cf74b6daf6188c1b9b6dadc16c525cb7edf234ff95027fc37a8ebb1a34eb7312379235c5410f5601d1f9ae7a39b63fd8f1eb84fb097a811427943bf9df7aa442cc070b988a6f7e117053f01c21c8c90b99b6034baae869d76fef9ae22968921bd63ba85aa2a70364863ec999537f08304f0349bbaa2f6fcdd363a5543a52567db9800218ff9806b7b2db29185b97a43c00b85c69bac45bdddbf5985e04977bac8151e799ab9befe71b465fd366f3d963ae797c3ce7490953b08961bd923ffe242dce557de14cb6476a886506f6a1693ba62ec82f2d700955b5e13bb7839c71e2eeab50c3e1585bf641e99e3b0f1ba0be915a0640d291868e14b388b33572bca9f6dd142b699fc74a2f70430f4631fc98148e68660a0d713a3ab277e0a6adb14343ea233f009d432873bc94c0f4c7488aa52230926e4e993b69338e306af1c3044ddc3600e9e9d88337357be7a724129693a07febd446f9ae7a0e40fdffb6b2e2e41f311ba5649c515c517fdcfa891cdee0e20a94ea3e01209f96ef5f289805e957e0961720de1c08e7f76260f26cb26765eb6d0bce1a89e7450345fa96d33f8f39165104e4dbdffc25590653154ebd2655217c8221b5d43e8a0024a7c7fb28e85f68b53f9d8ebb2c1fbd6947ca71eff4f2595b1a7f98c3d78ddf1974bc9f4a9293cd495724bc1b3fd77d7018000c330cf942b44254e6faf1b315359fbc9369c23bff6a7fac221dc5d4a2f8453dfbcc7c1d9330002ecaaeb014047df9139d931775402243d46b3a1ff5541dd9caa8cb2bb0de33439d3312ae700ec0d912407f6909cc9aca4489737fa42cb3a10c3c0453fc13673d71f3a5b26ff070c0222a2f3ce8945b41aa31e6fe199cd7f9dc1d1b221471d217535af4cad02011b38bd98d2e229fd5d867456e164531806847b77ebe788b94a4f07674a3c750bf07061f529d149988ceece2e7a42499b2a14d0eb750df8a919ed88f37b26a3d573434458e38079ff0bae9e0bf520bfe2fecd2a24fb2e5dfddf26ff5d590d79a492e8dff52e72912e4074b6f50ddc098e15f30b7f213b8dc692015771a863bb8a2277404957a39faedd9d452227aa6a57971c79e58f92065e260d7a8463437f6fbbd75af97cd65ea6a09dbaf49125a992e9c0ab01545da3b344fd841e867eeae49a764fb047ad2ce65d8ded5c0cc71771dbe6220e24d153bee926cd39e6e4f94ec4b0ac3f98bc3e4bf232a1193186447293879288068d5b6e8786ac5ea0822221d4409ff35ee0107a15dd82be7cd4c747b6d8ec3e18152c8814030a7a974cdfd98d56b78426128996f575ecda6f1d142287da5c07cd9f62c5d185511c7d57f55f9bcf99009bdbcdfc9b7f204d102904396a610b51726939f4599a8f9b1fce505f07d0c5a700b3c2a59b85b5a8030d16c2c19a38cc6c78a1c5015a9b6b4ad464f19140980d959b5d15d47953ba9573cd7d22e31194d21f6396262a7bd1b6162956b51a1f4c9f30905d166d749154d5d5273894fa816c42b03f5b7d78443bb39594e51d3836d9782cb13b214b4083eb71465c6c926b6a47b6c386589c0edba9f2c5368fb981726402d55ba54dff4faf7c77548023e2b5cd907", "63ac5353005353", 1, -735250881, "e68381293eb0152134c8664893604eb052b5a3346735404d366a33d33c18b405"], - ["f31ba739022189afd64e765c632aa6a97c3854dff2e6feec7d12b9d554300e6fc6d6f355620300000001acffffffffe9980c2c64814f763acf1e06e45038c5c913edc356b9abc863fceba04dc1fa3403000000050051000051ffffffff02140467030000000007515253006551acbbc792040000000002ac52a5f79222010000000000000000749de00500000000c4454ead632210ca18fe18ad6ede65bec93c556e77de39fb985967eb10b05774f19f6180afa06dec45f8b6a6ade89d0a2189c96812271d45fd50189a3693db95e3b300fc0ffa077167ca9c4688fe61a1ff415f24f668ebd1df3388e922cb789700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000429389701342aff59eee8115237ea4f210bf1f74dd3dcb49f539f080f00ae26bbe965ad22a039cf8ca814e6cb4e7531f4e2315a260b214a453ccc60e9a809899b49bcfbf2da731011616ff0d0897e6fd9b03bdc974db78f4c0bbc7e92a3305481bdcd572b8204dd2b41f3ca741b56ab6d26a43a1a7452261b49b2209886a2108032d1d68cf27b229d2510746eccf4c9be6ed4d0b86e59b5727ff87d7ac81fc1ef20208bb68fc4c6b296fcceb6edb8ecf33b3184b8f4d59f1a3d3e90c4086b8da368c0b0023e0982a51dddb089d639607d441f758a67038102bebb6c6535e1f81baea972b6148a1686d4b9acf2c5e7a884f5775b663a2b32955b96cff7f5218132362aa031d0900be59c2e13efc7296ec34fce34ecd04804e2c51ca02e242c8b334d1c54c0304ee0d41b21a975426397ca8b37d00066c2b631f9b89729fe6cd26600a81ae59032a3dd654d378e188070c2ae093a555520e3670bf293c127205f5d7fb70eeebad0220ce0a7a6e0a3532e6a4663311187c34b78cb8e46230beef93062fb4e5e021f602246e1cde872a2df73e225eb25e029f2d48f0c979a466df7e9c7a910222a178a84b6ae4a22d59e8b44eac337d2382e7fdc555f356e332d8c9a9eaa131ef2aad44dd2954fe59424725e36b0f1e85eb1664b66f0182a0bf09a1c640409c8af22a7424348a0aa1b97b7bc90c960ab910dc376491fdc3f2a440199eb611a5391beeedd0b97e507df6a5762c389a3a975dff57e2c7c8952060c425fff8a111bdc581b00787f316096b90ef86fb7f573e17ad96ef5774c84db63d3cae18bf9680f007aa25f0b53d0c50438642fc153f436d30c0c01c72c2b5266bd4a3906092e425d3030fad00e20019e76bfbdad9e357a90900b94f1aa0df231fae32c05db354e625fbd8f91d5a8f21f787bc184466e23db48001742892b6fe862d27257c160e52bf8731872d4a67e17f4e5b5bd006aec4a47b98426f21d764ed25e16dbda67be03a03cefb95b0e8d26fe171e0d050138068e6ac1d4d9c3cc123135d9a3079c4464ffa13f31c53d6dad4e360dbf72688a9819cfe008cd1db6eadb1c8186d7dab1395eb3c05b2f5cc11009e42c19259af6f7d69a18f1dbf71bec38f63576ff84323d33cda1577b92fcf90a97eaf4920886f381d78b42666ebd8612ab353da01cdf6cd57866acb7be28e78cd84594187bd1a10e34361a38ab5a05a8c3e25631d7e24dc592df44bb415aaf8b07aa0c2744de1be11651b13d38fadbf41d25ad792593bead097a6e0fe62595ed839188191c97ab8cc2959f5d93d0752f3a20afdb0c21d0e0575457ad1c12ea1158d623b520aef9e9ba7fe2d1f45beec8442fad389607a6128a3c2125104b476a3974b8d97b5d9fe11ab681e1071d730df2d4d19d98864e0a7413832b77d6a85c40c68db2af1f94b563704b8cd8f013392c331b3358f4733a2bba01c3ab9bf94144dd3cd77b131cba15e2bb0e69691bbe1aac6d75e6f0988bf525cced34826d49069781dbe8bf1dd5f1b0da7e8a11fdb7a2316ae1feac6c59746d1f2821652b3b27772649cd74766b14b09a1d482a3d96c5b5cb73c871f57f38a1abae0256af2b5d0eb50bec398899680322d2ae2e57c2753c0bd8d2e85544eb23e7053e973a854cf905ef9dd329d4578532478a1868e6b2b0ea10b705bc5574445ae5250b00d24a47857ab1d201504df205b7a7cf24eb15c8d5a0c85b10b7be82d0d3fc9b003a977c87f0d936a0e6b41c4d9a5b873ae12bddc6a74104c3e320b24372be490e4d96ecc0c3c0742b0deebe34a600af7a75c025f274b5ff40dfc30644918225041df87c6fa6258ff852b6e19e2eb5f5193b670c152404394f8fa2ebfc92104a27c5c041430bca45202605edcfc6934b7ed23882e473411fa627cbd2b5f68a8bd1ad98c1ca0fe39142332da65f871893aaf22d0d9c51ce39b398abaf3ab7522d94f805b1780b63116aa3b417a0e05866a66ea6f19caa7925fc2df238ac6aedbdb6355ad98bcf7f305cad4b7c25aaefca86cc5147d8a64c853153265071591469171e114f2a9a537b79486d3d48f96907ed340a9f08b757ba2441b8b77390fbd4b14251f214bbbef7954b80ac9aa0b24ef1dbaa7b0c7fb863de47248689c96a21cac0082a1c83d056651aa9e94ff823d937e8e10b4dd0d8eadd34ece97e77e65bd0395581f4ffbe80872c405c44ea792167f5ea044e8da35f526dfff4b7050ebb565164e90e4a5f347f43e7a327ad5c4e7b93a1bc13a0a86232aa93a9a4e2aba6747bf1868d5207a1e069c4ec8926caa7e3f886dc738b854eb72b180b821f87bc005353ceb82ff30403dd0c41e6dc4e062510a7c264db933dc74550a8ba9d28d29df3aac3ceae250d89aa1332bb3730133cf4c58f532a18ffae8dfaa9f90ab48dacd8c177937d72bc59d0f270b", "00ac6a65", 1, 169717943, "1fa342f0f90598de8f0cfbadecca6a774aeafeb8359d757fa561ecbea466adf5"], - ["030000807082c4030195d94a78028684d08d544cbccb56b709589e83c951dece1d489822fe8676257402000000076a525363636a00ffffffff0409f31a00000000000600526aac5153eec9660000000000055252000063885d3700000000000763526a00636553c502e802000000000465656a510d540bee77e0b5e1030000000000000000c49c770000000000427b5c86980cee9f60f094ff79fe14b9e40b5e5e3831689a8e454456aab00165f7dfa2eac3be31bc8ebb765e35a2aac551128726f44a3ed416e4d2a14bc79956f1a9b8f8018afae3b229e5253efb1f7b5f9724729734fa27939352861a2c223f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000983477dc769f2cbd3b359d7871ddb50c1984e350b0407690b7508fa0dcbe61b28c1fe132706f2960decf95884fcb5ab9e3c520ea5485aaab95e552836089de10272915812a6c1023a4a1ef7fa8a99139f5eb6fd7adf1d52bd6ff5a9cf6d602e12cce7357a8f69b56007f39c3144dd46f8cf2e3e95b26c170235daf9af155d055021601b41dcca78174c69f8163e2e24714f614d71885d8145422dd8bc487f19b94021890576f32aa863de952e8b0aa12336e9ccfe371f6e74865dc5825df2944b8180b00475e74a7921bdfcb40efa282cac7ec463a7a5fb39de38ecca1c41b8e4d3cb461733cc132b57868fe4e5b1192dd2afefce6ba817b254a4fec3b0bd3717864650211ac283abdbf8fb0aa29ce46c91869ca8c2691d1200b29fdd51e08781beeb0cc02224244a7fc87a4e86785588f9518228dc1fd1565205be1967887d1be9aa6fdb9021a5e0e8181fdb839dbc1cd0b3b651bb9fb3a4d80fd5fc90866b8e0025b0f55bf03147b961b960db55be6fda68e89301fab2446120aa3122b41b53c571eb646880e03240b445de27944ac5a57c0c6b09a05782fb12c0293bfe466f317e9a4f7f63b388c98e79d3de6eaf130a289b01bdac3191bf409863638087e1342c807396917e99b7de980a4f0d0ac702f1d6cd14fa1f5d2433621ef588cd711114fe99b51f0ea2fb7173a75719d5ee348422c8e79d2e07c2685f6b42f639862e14eb6903d1b51c4db92d0624aac9626dafd710aac2f28619a2935876c344593360b269664ec342c1a6294ff0cf5319c0f0bd5036c2a03cfb148d6880137c7d203a1cb580451e52cedcf1dbe3856f221bf6d6be6b6cfcbe4dc788da0ad253e96354c6998c35f857be30d115166d31ca869ae7b8874540f88540bbf4b58b2f582204568013656b438832dfcf9e65be5c79a65d79a39e116f03a34d94800f4bc3ce2f45d5ce03b6eba278c12ebaf94bd6df7da6c5a7714de07f05b5d0014f422abf1884af8afecfebb608eaae8140f9131ddd4e5dd2581a41c781b59265805092cef952b65f6e023055afef5d59f84eee43a39d7c96497fa2a62906f8841df4c4557d0381d4f6dea84aa85370730cfb97f6c4573accd16ca1eba9ed7cce2c8441d1e280911cb6415f64bd3c61b429050025a5ab8fac7ce3beaae392f7b19132d10f59f1ccd36e9919e248dbac8c548177519132e54778f30f6c61ea2441505999708a6f6864e2a32e372396f0a89e91f0cb9ac6b541432e3c7a6de4f7a087d1bce7405aca6bc0a92b64e529e6461bcf31056b1375c4063f668f51cbb28636f23d56fa37a1c619a71e60932ca4e1249eff30713fe22647c270b6531509924e9db4f2fa499c2007298e561262a9d38be418c6ffe7bcb505153a936e7535976aefc93fa1b34f7ba1db1704c0362e10cef849a5c366158ad1765b85c0681dd5ab415377aeb436a2ed54c3116c974237b878746c5f73c55fb56b378bf2b00a5eb2ea2f1e7c2f4c47f61d66265be6ff02b3e57acb4458efdd79265e6434f72eb05da25bdd6a11c0d58b6315c9a45cd174122ed70fb61546afcd85aa96cbb4a6db49cc530dfa24724c2ba3c1af3e554c82bf434a789aa8a088304a529ff266fe7d40ffe67d3c0078958725629a0b482b42f8a6704e7af8cb0c32b73b001e55b4e241079ced9b95c3c1d70616660b91e41faf7e8945e488163de7c2b8e687c3a55e23897829c5a3e30dd5ad12bef37038ba58f17f538b91bd5a6ba066468bf0ba86459dcef84a394f47d8e0c822c3ef13de710ff1601336df53bd95adf5d0219f7b176fbe4315ce06b3a295df756c16ab04e7f07d3647b1f59b42db7f493cf07c379408d9b13d4847f551e095d87db088889126a6bf1e835133b5dc59ee5c385b9c4ab673b9efdaa67bbcaf5f45af32213f0eb99bd277748cdd7222963cb751c87002b8eaa51307dc0e737a10954ec3826dc73b33e053a8060e0c8b2eb0daa51ff508601c5b24702f98fd8ce464d5093ad575d14968ca07dd73eb8cdbf24dc6533182dc6e4d492e7d6ad51613b54851858a92ca97a6986fdad8d0aad7e998bb10fb89ee3046c09f5775855015f756f8608166b12295e75d2b813cb2f53284936b6822a4196a8facdf4aed7f7d02fd98b214179e564c28b38253d055b493100748bd168f87923a01b39d1e6d8d351d0ea09a37ea2c51d1c86cb0b87ad5ee7c2561d53fd588994e7e3c572e4337be3f09d2b5fdf5e4905b0377a1e2710cf437d9115995399249d19feda68d0f313ef45303146db15e75d58256cb7cc6e0bcf000000000000000049db220000000000673c0fe43c6214bcee02a2fce210e6aaff849f0dfdaa61da9a575f177d0c8feddb1a12b558dc94ca7bafa3eacce3d5158dcab52458ca1bc6e6edd903d95086325621d4e7fa39bb4412b6619869c90cb6e843aa9173d7bf0d866da27d7e07299b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d9f4f4fb6d6da5a9d6f6e88bd0ea9d552123d4bfe97badae3df8806e072a42216cf992bc865df2ee19cd9356a09441a2489012bd59d284b2b948d58477435918d46335f8a18b028346a41c95960b3774b815cdff3b86cb2e56f3e78d4dca0972d4b49d05c61fe0b95d8fb30c6ccd648c0e742c7e774adad80bbdcc77e4d890ba021e5f683c769c4d67cf5e6552b12a38d688c1414d8dd9c3fdd96f1bbb6d20df8e0210c1728550697a1696bf9d06654ec6ce6ad740b9730a876b6e44b3cf7f6a72f20a0405898e206f20023566483785c25b416cb8a1099566cd6f076ceeac27c231f79d70d80862000f5185a53e7f7d4c7f9ed43159564ccd6149024d926eff5718a9030d01b35c75e0840af27fa0163bc9da1d2ddd9f559ec30e9bfbe51c334fbe5fe702226dbd16b6e20ff28567d9b25ce98158e8abeffea51dd9aa658663df6118c338022de8aea20354e80d8b94ad479c94f6c0be5301f66c32bab15930a7747ce28dbd0214af6ee8ee12c25d9f4ade769ead887fc7375dbec557cc12dccae9f4ea05ba010329b63d5f521f5b89e3214c95296a001a5db5bf336d9ee15a67fa98c966ae97757eef01c1414f295b874a98ce495f16ce9172b76c38f64c63c1c4ef1703bbcbae18eda10154d8dd168dc5daf17e7c09fbacd937ce14d51fe204b40d38923a6ce6f8d9afd3ea91c0f16c860b4e6dfe5a2580b6e5fb2b9dece60164528ee103de969414c1ec0ffc780382760fa679fc47ca5ce68de033b85845994f2ae9127ebfa8f2ca1a45dc58775cc3415881424eeac909a0615587600a21715dd15bb9d60b1faf4f250106594122739b0143b2880eb810220ba34fe48b39279100eb9a4898f3f2c4727aad3b67797ffde961242032a00419fc7434cb32b7d1c90203197f4995606abccd5d76e50a99c534c02b0e2dbeb0a622bb8bca0352fad075de8b799c3c85f2b3cc3e2d4400617ab7a1e0f0cec928a4bcccde9d7ee662baa4f7a1e44ed45bea09d3d4dc00fcae57edf91f3be2e829a62ff829ec9e7e61677012b3654ed8392ffc3b41dc1255d1437641dcfb0e247f2b8e80f7731144590b5e83fbc8e44c34ce23bfa142921944551a8813af8ff05b2dfa4089d6af4b7622a431bd4924089a11c04eef3ad2f3506c9edb24406a795f5045688ba03f6d97aa43d644a773db83ea8b64b13b25632966d373abae7be9ad275590b72a0ac55e93ee609e9ca534f5a0ed859938cb55af885ca12f6a79db3168ed2d641b35cf572b56ca51fea5b05d25380058e2b819ac6324ca60c7166d0eee16e6726d1ea377ba4f91eb19deec920d76b846c04d025b098c325b271273835331012fe21cd8e36cd4cbd86f8dff6770b406f98d6a0e30f603ada365d6e12a33ef0aa5f01f600526daea2d7dbe9ed65d94a9d091cd4177e935457a80d95a5182247e91318fd25a7f04d37855acdd07757f7af182f2e7f0096763ed29a64cee7b345c795543036047464f7cdfcc9a11149cd295fe8d429bbb1c9b0465d1eb4af2027be970c1437f322ca378f1a2f92a6aa217f1c4a1f0e0231f28beeb895610925769813b68a3db36e7c097debc62df543570ab394c6b090a7494267ec89fe2b29cd8bb620be7f28ad641253dfe5dbcbf7dc4667e8ad4e0ac0f95d2bad0dcfcafad2436d0ce89e054166e1825b4c9adab04d46af4010322562d117744c717598e647d5b1b2b05324fb7a721a01f2e18b385b3658374c30163eecfacac000d666e1ac056ba0d4a95b43b24669eb6ece8823785b0f858cb13745d2f28ecb4ea9944a6826e21e2e5e09971122ea0f23ddc68c661fddc8c91fa4177a5e260a7bbd6205a713139e038e86965cdca8d5e4233ce1bbb519b0c074c680f417b7adeef2f48dc6d19dee00c5c1d09c589f162c27197b1397a1e4da19c750f8c48e8d75ec8413c49d4df99312a23afb71b8e8675b7d6a87044cd22ee7256394cadde3fb3cdb8793aba4488002fe94d5dcbab17f177bfdef80a684b5fb0aefcff6c03f0b098de853545442d2792ad9152173e7f4b1fd9b2026da1d66ac162b970920f38c17bb50bfe082f615fa7fa894fdcf64a126a049e6f33605340a3ef4a249fd1a7eb4c25423978bf0be83a60a3b13eba61fcab706a26f3b351fb8953ef7e81e2dc79e90a0d19a5fcfdd281d4eabacf1ec11b875c1ed3624e0d2a442af8f146af8220d927a4cb4a748128835b9f930219d6451081f516065830e66a702d3a3b319b4933fa4125e7c455426aeba3bf27dbf51b331f487c2d6e8813b6ccb02f811e00c6a899330d58000000000000000000000000006407df8cce4615318af1e4e93a33cc10f0abd6b1be87aab60c068e8434f19f33e398b962cc71cf517f51886173aafe0b8bf021e5dc70c98b3f2adb56671d053ab5158d83254aa562b2fa55f069c1d1f6a5b560f49a9475c0675a708ad96a889d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088b5d2333ed876ce6dc8b5b97687d747b843b6145d7dd819eb2a6dd333ad19017d45df945163f67b65bf6c329a8fe419cbe75b0be6aba2823b16dd0ea139c10ec35615aa0831bf1df9863ccb211b07a9870412d1f09eacb17423ef7812557862f808b04d647c10fd6f2b55868fd0df818ee1926d425caf9407967226330015dd022cc9fd3aad59b18d0289dcf9842d640d00ce97311c0a64ec691014103aa0e98e021eae99f338cd3a331b7cf5bde1435b10202b7acafeb7e6ee83b6acaf79ddfbb20a08000ffbb6a380350bc1737b455aa659d6613310f2b75967afb1179d2101ef0c65ddef01fd081c06301f755b75a36a9684822d55a8e4de385af9ca14fbe4c3d00217f9072c2d01220a169ffdf55a4bc5bec47211499ba4690aee055ab6cd43f0aa0310fa91fa808bf030701ebd09834a2a382af7e94fb30d12eb9c248c512fa305bd0224a7cb64b2d34851729718ab45e1091266d6d93ed45359619dd61db2c4555da4020bb385eb8fb99104914f5132c9271dd83997fe2187627cf9f7342a13b3c1bb390313e3cd74e061bb1ad281b1e7344e5958c02373da87c1c82ad29350620d38e04fdaca7a42273ce0fba0fa9a60e4b60add0fc74c6674b5cadd9311c8e6353ca7029522ee5ace03396e8ce5f9d233d4b6ec4f76f06e02b30be8b24539a22ee2e7f4cde3bb6c97aafc5aafeb110c6bd944d5f6c0236f6be9bf860a94a7321c6e53c24514cebc4cb35ad30dcc6a19ae514808ebbca67fda958a61b342343aa0641ce9a3bd09a8432853e14c236bc7d68ab758d7341296a92a0abb5adc2248f548f6512f114c21327466557e67331504f3a2765b0a86ce0b0ea0d4a55f8f9afe97bd1ce2193e44c21cd3bea3f1f7dac5f934971874be8c5c7bf3f84d27d7f2b86d0e68f2b6c43dffdea00c85682f799c7b7af0a6104d0e652d4f236f102c67d1ce60865f0497a18a54b0d5a5bff018419e2db29898e19c2105fff9056729a950b66e68588f278eb438cff0e6e36d784f3984dac2d905e49de32ed55c6ccd7ca5150afd7c978931e18227bf4fbbfceaf02cf210d0c1c3976b50dcd6b2ecfb96919545b19fc8e01eccc98c591ff7a32cc90f09ac9b4a914ea68a904bbe876de88a16186d4263b9ab6fe1514bfb5bdab7782a3bd5edf8c9d182923040e401a1fa2bb067582af047001b29746eb00201f5c043cb55340eb3be870a9db3f4ba70daffcbb92bbd0cf5f92dff6b65dccfc7dde829ca0e57cb2d05cdb98882b584735adff1b7759a1bbc09588c13cda95f28ec770c61bec4060b2899cf89b3df049b7a6a272fe55db1f2f7b936a7dcbd18a9e50b541856fa3a55334904427e04340f41d98714cfc684763472c32858da66572ebc4818fe449d3bfe1715b262ef91b2f32354233d0faa51c236a6a157b34678b295aaa3823ea83d2e2d196e5ade0166d75661f9747607642b298b17bd20400b0198438eb765256a3903b24845c73facedb2b2968c5a1c56518bfe0bf8f5f6b4b27fae24a21c39ba9bfa644c4ca6d6bb803d0804ad92d3cd07cd7071302ce566127a3909f3d20dd8982577783bdeb4e4b672cb344c29826c05d473486a5388e0c6675a9d8b9ae8f0cc8b98fcff3ad9f7b3c2103f2d94f1d3014552173ffeb701c9db83726132c241849a2fe5f9e93c4284ceca0f6825198d813eacd627a838b77904a971effa9d2555a10d06fc6c7b0b8341a345caaf050fd07ed3d352aea1ed6548aed9cb1694baa21f162175c97fd6015c98e25efd6b0e76c8b736eb52e008f94b98bd96a4f2fae0d428a8cb1804a37dae3b038ec841848902c340945e657759bdd00eb861e291fde3e2f8a173a29d086a370295764e4cfd78525bebe0fcd9a8000713d6ceb80eba7a5dc9c8c1653127e0c71b0b097743702547721e4c317646310313924102d582fde825980c4d8413f1c902a5d49ce5ea905d1b62e0bc20eec2ab0e1d8cab7f12ba955f2567ca4823fb3f367093e72e440c52e6354b64ac7526e8d0e02ffcec59e1f660e0b23fdb0e0206317bf60f09ef36c0e05b8e7a8c60a06aecc62ebb48e63ad60c3994c1945c8b294e6e8bd62c4a5fc950898c0d6cfd0b8df6dfa78fc1dbe0063cfd6daca8d0a507702eb84bcfbd57246cc76609ebe375b4181357a72a9f73d29c045f96885b52d68b04c168b7348eea89d46a9be61d17cd275d63415c54e59e8d66d2b9bfa07d8bc958bed61889464744f87b2a19451a1f4412015938adf4e43e44315a85ce0d58c20f08bdaa822c2c76ade300626cf69f7d216529d22a146c26a6bca96436e374964796780e0f2f1ab4294bd5541c1c07db33b4359556548856c476e2764638972b24130174e622e6344ce496dbe561492b6e0b72f135e7f1fe87bfb680f691c04336c36b60e5089da9dddc373fc1ba1aff380905", "6500006aac5351", 0, 152517674, "f078cc996904261f8eb4faadbf9be3a1054d6ff12332714b8804ecf060c539d8"], - ["a968771101634e9255986926067f299dad8bac7c794fce2e7a96dd556b17a6f440ff5082a9030000000652006a6a5165ffffffff03a3beea04000000000079a5310100000000056aac53636a9538f604000000000023ecf74d0100000000000000005cd41c00000000002e419abb5365931b86260bda553b07014aa990cb6c3bf482a939883be7e89048d6396d66d2bb59325470b52d943b2156aa6efb9ef3d130389cec17cda232c4549de3c6445bd8304a593e7983fa6e87ecbfdffbebaf001517b188d76cff0f9fde00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8318f96d4c1b69215f1fb772d3cb6e3b3e113642d9fd6695273bc76fe9b9ab0c90cba13092f5c2ad115faa32748a4b2103c75d0422ee6a86ddc713f4ef5df3791493e42930f69b1e12edb1b018d64f3c88b8d1efa9895987e5230fd066871339ae6998660f4646488f6999400850ef1137ee36d7dbcff9da0652a7f626ea15f0206032dd9d6ec49032522cb5e642cdf93fb2a1dc9a334912284d00aab846242b80200ab4a740214dbcbcf061f8ccec85098f42a9745f04c700994e2fd30ad1189fb0a010ff723a4ff146491d5a50ac4c56d9ef9f9a534beed94271f79ca11105c1efc190a629f1cf4a025360fb404b918fd3fa801ae556bfe1ca73d3569e801b1faa3030819ad8706a77c1a4d12b8d630d146f1355a58f53c824dbdb08d128aabf11daf031493d3f718faf34eacfacd0058f3a969d1643941fbee5c7ed84e51929c53075e021dd6887ea759e89be46910dc3485fc56388758b728736e595c05e6c3e8985dfb030546665f2eb76fff45b0fea9b20c8dafc3d0e65114800cb800bbd2683b84a74f02253458174daf06b62784b2f7a58e65b16428b2c882a2bd76119dd46895b49c23381603253e07399c16a7600a65bea088981ee11f277e20e374ccb0e264d222d9263d22bdf2a4c4121f3e7a8256174620e4c014833a3a940bde6a27c4e51709e934bd9f9c4d7ad12b449003d21f06fa3f4047e962c4874c61efec67f5f8f0e4fff8335fb6b198aa343ced4ce987daeb96427bdffab83994616674c94217af850efd109effca51cd820e240cbe81234c1b14abf323c1ec397b5351eaf48e46633777c1d75e77e4bd7df62d6e1953beedbf4e93f0780002f0b7e9c1ba1b9ee349ba16912fda9eaa73fee6aeae2c9e6fc989ee84eb34d8939e33c409db0a46b3ed349a2437ae8412c878faffdcf5ce6a0f9bf7395ec2972b46d7e5c2b2b0d880afd696f8ec2f47f0b8dbc6b9963eff2c5515953d73bf6f34200d4b919ba5e4356c62674955d1d666012ab814dc559ff2922b06d51f8d3dd943d34aae3a1c69af46664905e5f3caa122ed7fe4c424702a7f34d3755d03449613c0507b9c934d9bf4b36b117f086ad1ca8ec7121a450fb96ef0297784b487d7edb3e3316074d636a3925c8f60748eea567d1ec3e7744706b0d65a2a185c05d90aec63869b74ed97ca127901c5de05f3305c9a4526713bc8b1691feec0e366d853c4277a3c3aa8b2d59191d0470d2420725b309b1834ec7afec919f6b80562c298864f4cf3a52f9099571580c02f45fa95bc2753906908de9c60cdb20432ee03fadb257ed3c1af4ae745b3a162080d5de2b2bb998989db9caf78ec095a4181fe4a403b8708ef133c694e4c5875ec13e5185d24aef0cab9e4b7ed1b473dbb5218b731aeb66f000f1a62bf1401452120f60373feb39ce1f5a665e1ba8851db68921cc7db1f6cf64cd60fd3e2d1caf2a2b4c27907108148943fed4f4ca0a86fa4d16e8c941b24ad4fe01a75a143ca72b6ca343d49b8ee84c90eecca3a7499bad7d7cc9136bcca1336761d0fb4b5a21cc2b9a835698198b4f78b0e469a99a2e88bc26ef45ce6d83cdfa06526959a20c473a135b14bbed810dc572a639b05f746ca71ae510bda43f00c8415574aff656d6ef7e85686146208e2ccfa26d0d4dc040ba45c3fd7a2ad871f1af68f3d54100cb9612041f1450a06763f60f6d8eda1ec0fc1d41ed155f5fdc212349e649a52a8fac0d9a2c8fb961a70fe9797755dc7f0ea903e06a96648969e88a2f6996ede6c6a1d66416ad66ec10cf5fdf80f09eb826f001a152a4ebd222a617bce28e6c7788eba4553a5342b48e49102b0b02a2ec8b0186f79f2416699c8b223af44fb6480c41906530ce2fe43a569707ef7a0684ad888f6b1b80382958c7eef5d36b155e0a89b93ae8192ed3df252ad26de72934fb57000d43bc268e161b8e950524bd9604fbc34869d8d6d206b7dd3f03f8905b808f67f6c36de174886b1341483a20778c9ac46311b25be22634aaacc4e6d6692f98c6fe3a055b6ea7a648d8c91940458f0c7b5ecb7bb923875db9099612fc14f17ffda165ccc9c072586fa26145992468fce0b3202162937089caf72a0228e85c889143a6968e7ee5e702ca3a97bd88520048a9ee571183291066d7aedaafa1cc03168137fc29ebda3d6d4433a1d78daf045a34e8f1058f32214593995349d25e85ab6cae92d82f52a581816947bffd5c1d43e1040ae99ea521e596023e3d0e22cfd3e87ea0bf81e09dd3582e29e65c7e1208c2acaf4aee70969cc3fec0b9d24105cc915a686b07f891e0700cf2c4dae2f93af30164bc4bf8610b7be26abdb767107ddc4c364e07b5c156217ce63c373317b73ee82a41952efc552724c7e2c52e0c48431702c7bd05c07ad459bb0e67d0ea63e1ae5c3e7913eb303730708", "006aac5153", 0, -943551585, "0154b6af0fe2e3b611a29448681e555d953d777a1f4be994eaaf0c867d8a2a3b"], - ["b73c651704e976f4b030afb12fbb91e2c7491eff78da9081f876e2f6185034f222cbab273100000000036a5352ffffffff847bcd6b90cdeaa9f9b9037212ead3bba6d28444daf5bc46930b65bb170d20de0300000002525390fef14990c71995d4709b97cacf45690dee61e8dca723d357608bec83b190cfc0080ac10100000002526571a96c6d9ffd34160326e4ce717ff950508b68306d47ecb09e818af443f32c5da0439ec20000000005ac65ac00531ab1ff5e0252f52403000000000153dcb798040000000007515252515251520000000000", "ac00", 3, -1700621042, "76a9e3281baae93a08ce29a188794ac563a016a3b70a19ddf8c0411981c59ffb"], - ["030000807082c40304c914787693fa0dd0e89caa80871881eee2b6357365e0d639674226334fc95bc3030000000400ac65001bc0f1c74696ffccdb30aa81c2d175b21cd5277f91d9249231fb89dabb3a29c59253f80e010000000900525163525200636affffffff84e7e4c290b6b3586665fb3c26b5bf1e66afed0dcdcaa1661bb83570884ff81f03000000040053636affffffff21eeb8a26d75bcdf8caa3fb1ab6f522f18454153949a9eabb002275190a781360300000000a86cbc79039690870000000000056a6a5200ac8f9a1504000000000151537a800000000000036500ac000000002b1cfb17010000000000000000660c3c03000000008b5ffd0170feb104e257a2fdf5ad7a2e6adf6f0da99c803cdbae270072b2e7362ff0899647c16faba5cd846a865f1bb1bd6f6bf2024c6781dd7e723a218d3bc9d5b6c366e39c74d1658c1885f1f7836f69026321c11bb6634874d78f2b9d7f4c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffbf3a8b01b7373ac40032ade5e16649243fdbbd4061d3e8260d3dbe61e1f9301d2f5d7f8c35987ddda505da488c79010c606f917f368eacbc9e2b661107df1b8078fb49646b77b8fbb388e43fef1c983882050f7badb518f9fe0b9094ede9c8599e338830fdcbc83a6d25aef6728a04d2378c6330e21c17fc6e640e90ef70f020ae2189d4cb32136c52f97e76a8cc75defcd6351dd73ac7773141125b2fc2995032309b32eea8b8021ab6137be13f039275baf1bcee2dafc5e2c44989c0937e1520a07df1ee0d18b0db74fc97b61f69e3d29817755d49b0e79bbb27686e990de462fea262a86984d950c99c04d183d8e042471f899dfa3b56a15d3118ec02d099011020bd0ac8194c727f8964a3d05a8583c24d9aea241208ad3fadc5d849417815b94020aebb14a6525710e67cb55d9b6078b50aeb3f958525accb9857198ebc6922ea60308c8cc8cd09271163da0d17fb03a0f70ae45a2a049213ffb837255eb1e5c577203248f5d03cb4542295623c67123976137e06943334f5e9d7b11ba06a79ca7b1030201092d33e79bc3208b76e626dd2c7f003654a7393748b1481128deb335c1f8ed3acc784d2762c10f501d79cab9db4a2e096b179216d54ceb97e1cf4e193ad8977a90f739212f12e7ccb40f57676e2099a0255d75ceddb35db439017d721caa6df8e77351b8720ec48ad41faaac70a104a5d9b1d748cf557111ce123d813ebbc9f0c3f0acb817a6f2f3d029e288dae9e97bbd9e7f5a3fe7270ae48ecac8fa928119810a39da935f093cb53a5af1d1b5bc6fde9e36c160fdac47c99a8decb07bc9e22bb5c77129664fec79d9e99e279f74a9c9e9c33a7e6abc55bc88932ee4b15b20ab803b3cb86ae82b71bf5b4d844652b76fdbd8c1c0ba60316f5c759714a8f60b0e3a66ed2cdef0cf23496039048171b6a591e1275fc214693d416f3d33f973b96224d2fd9c4f124dd544b2ba170a9e75e21cd8c6d442115c0c09a61099e6cb4826ee2135e035bcff45731f96cc84e17601486a022ebe4513effbd33e6869329a71f53e9ad0c65db6671ecd7b67799d7697c0bdbadda6907712d74c7b74c0d4ca6188bb5976d590f709e3a7b3e08162233257a227e5901240fd6ef2aa2ef2967408c36168525e6ef483d7c30a6e05cebbda21babdec70a94ddf440722fc10cc778c8176853c277cceea359101dff4cebe65388d6b4c911eb0c58a2282199ff31909a58e027716a32b322b6d0b521a7d66cbb97dbe26d81567b11d2bd0670c6eb719a61fba1a583b6bcf462a79ec9f7fbc499060f5b70fe96116a50e4792b0969e3f3e5809ef7fedc37e4c3083c24c916ac706160c32c8dd3b9093d7f32d1a8ae1a469e4be97bc76a805a55fb0bc5a1503e55024030999f6f9e1829cf5df236dd3f4661dac130ec4554f256fa357266b67d95bb746cd5ff915c60a04edfeb0168dd8e0b8f27e6ed089e035116a2e3cca51b6cb585b9a687c4600b92f1613a51026ea958af876d70d87e3e3f37e5abeeb4d4d417841fbc584074359f21a546ae7108f65e1946501d8013116799a38f4abae111d9f06bfe42fc66c094af360c1eb6f925d7c061673a51cbed76a90f9350d184a7175de280a1e19a5ca9cec2ee82430c4916ee23b894eb9cf44087b3180ece4e88136cc079937066e926a2e3a85c36b765ec200dc8a6ad0ec2167c6bc26458e95a20d5bdf0e38eccaa57b2a872b0c3196fee07262046f6fb32a1d8a20ad4ceae8da10064b55693cb873cf255690e17a38c335c7865412db7151ce12a70548b9d5a4c167fad9c81bfa85daa80176b0feb2a1b3b23861c57a5db39a570fb1bec7973f6a0191238aaccb58d1b74461490c74442861e0b43e546c37921fad5d46488b0ef6031419ac37017b97b685f1913221d49cf331b748b32c3ff3721cc1c245d95299295d90dab1efe92b141702a3554994e5f9c3382cc0d80d5818311d9fff6e6a619dd03d6b62df38516b0f7799655922d543d76e71d34a7a493273215fd073fa7e8c1768b6e42e94a26b644844d475e9c570bcf6c927d76bf3d013a7d371130c3cf527bea6b60f000852dd9c7ba519b589ae9b66faeaedef45b78f24f1e30a3ac0d8b256407f5f9437102e9bddc2936accc7c3754fed768a44917fd571e2215eeea5ec4fef094c6de7e2f06803a00a83472a26740659c765a695338c2e5defa7dd530b4dcc098cde116cda6b4f27256cece0c734b81d48f14b93a15a22fcb2f3be9418968bac301bd866564e8be0450a8278119f785a6bd51ad5ee89257f1eec37641c65c298ec59030efbceeafbb41cbb44fe1893e8f969a9ac207d42a2dd61e409b755b911acc612a1e7f759b7bee9542e54bbf306be04ba7dfe86419c254ad12d2309c52c9d85852233c73754a19aadd0bd4c812e108dda2a8495763309", "0052655153000052", 1, -1039718550, "c20f4d3698a5d602e127f992617d10cf25dfa6c106c00bb40b59555e71333bc6"], - ["030000807082c40301b9ba48b4ce9ec07b72de39a0859ae8bee1edba41998c46b42dea36e05bd279f60200000004ac6a52655c34c99c03919dcd03000000000451006a639ff7b90100000000086553636a655351655d00d502000000000651ac63526500ef6436470000000000", "ac51ac65", 0, -2023578091, "272ab4dcb556b98f62fe5fb378629609ecc6e22031fcfb6a4b104fe08f0e29d6"], - ["030000807082c40301ad1cb16ce7de80fadc20aa21baff18e770bcd34cbdaee7b4d75c3b9003aeda1c02000000086365636a0051acac5dce93c902c378c9040000000000ba138401000000000651516352526ab17953d60ef74bbe0151f201010000000000000000000000005e2569b42a01d604304438f0443e555a45774bae0dd601b7853a8e2ff701bba1bdc0d49a56cf4cde0f357bac41c0833461ec38500bdd26f505298701cc669e120baa50137708b6b0207d9b5702938dfd02af0d3b2b883145032d00d796f580a600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e19fba33a0a92cba52cdb860b594191eef9b34ab8b6e20bac4dc182fb1714c9f07b6474729ebe91fa616f78829e18b53ebb6ae12fdae66c493426536ee167f63b8678547764fc8d540593f14b95f40ca7f56d59f14c089af1facaf2b7facbec03513942f079bb08de3edb3002dec0da83c93a8f944929ab6f497b12fbd7f4ba30316468416d2ee24ad07561364e0ec47d33575bc2dc850eeb80ee8917ea9c71b3e030208bda19170d77bd25fe3e38ba4c32634e8c59bff3560a2acd458ea213b6d350b07038d7a0513cf5f4f0f7634a965779f384b7ec5e740faaa770313338107c2e792701c423ac090c1f848e654a41fbb6c96c85ea6440947d79f23201c61714f37021d5f78b3c4f731358956f3430ff8f2720548ededf6070412d0b4fc0b03d183b202171c9990c53048d6706b70ec68b7f6edacd4e41b2265a07864343a2aa1400c2f0308aa3d6e08a0ee4d6f38035a40f61a8eb061272ae3c3ea77b322df383c64f0790314de5302af891cbb9066476e9868885261b7e5d2d5545816fea066b5b434c94b020f93b12910f8c489f6c0422564497fb4343ad4471b24737b95da02eec6212bd1bc848844e50e43ddce5654bc8cc074a54ac4e0180ced5483ee4367a1cc983a1321a69eafe2822e9dd266e037950810d44dc409e74196c02f37c9b5b886a4846ad8b5fd8f362de96205dab682a53f271952370240fc49f5e1cbc94b116351200a30b43ff7179bc94131d142dc1e8ca40010d293c8c26a1281b954bdc5f5e3f1f9a8c511171bd4ed4588e7d904025b304c85cb20705a3eb9b4c952404e07c9050b61e7b88eb38b114bc72eddfe1dfa4f40d242182d312cf932564d74a555b65765b6c0e5f8fc5b5f27424fa05ffc7e140a5721a351e98965387bc35bccc60b0f6e4ed7f1922a1906f4b54705b136a57ccb9ef0cd842be253a4992dd5c0f23312f2644aa1dc43b8bb43d4dc814cd438214786917fb16b9fa55b7d41638903c00f09eec09a6360d30a17294a3c49528c771d2033c5adcddd67297a3092bbc81ee89a7e1f982b8f500e2f768d4214abd13557d9a13e5914d9f6ba9145178977a75c5d43d9bcacad504fd15591b2eb764a27b867528ffa5294738c128cd8085c6cd66067092b3104557e952af2e69f2ec8b2d4b6116f82aeb86c6c928835b196ba7265d33b672aa5d82fd8cb301d7f18d79603318bd5b34b642f711132c50d1455940e07a7111103163adc2d7b1369eaec124bfce9e26662bd9675c89a15586f99ae18556caabb9487abc6b6a3e4e1ec41e475643d485ba344c27f8be53e0ff303a4971a00c20ac0f2899c9947418b72e1fe9acd9f01c43b13a0b1d3bcf6d68f21f86a3aa7352666cbf358ce315d00d56785fd71b2c891a0ad9b6bf722b1c5b57b2eb43bb707cc48d6e8f7d85552b4041f8b18fd14d1dbea859b47264faffa02d2417a0c87545626ea84fc82575baa39648867acf36bc2e02f514477016872fa86e3bb096e3fc244ffb9635120abdd1c32072f8d6c59353228d3a22317fe462f10723e2434f46134bf5290c74987a420c8332fefe3fcf63901d11caedb0a6312b30fd8dd4d05395ab2a9a982694eb9cf3c67c045d7a0f44ab022cda2ee39a29a2158c609c581da4278cbd3811cd003f1885ad35dc4c3dd6240b9f5e89cef160618030af1901987981bcbd5ee1318f60d0ee6dca07baa74037a4213b2342c933d1fa16ad7580eff3e6583920fa5f60154cb3b5893d2b0cf82566dd737be5a77bffa54f672fa7af03c1cd5e4e97919f7f55fc88200f5040fce02ae4375cd475f8a38d4a93d6e165ee20864fa93284707aae469d8c8d642dff83f3dc9e6ebd61750d6ea21cff81465aae1d878518615bf9dd3ce375491d7abc9aa35e79888632f647687328e3608a43bbaf0c1a257506539cb5b93c77f36e2b5fffde9d1d7fcf7a2fbe136f7201fd0f936ef30cdd17b160ce3fb7d82fed962f6784457358b91456ff41a2e7357d9c8088881a1ea42811076f3ecb14b586db7865fc02ca57d4ffaf840360477fd6fa3cab8191fb1ac9fec7f0a01ec541bd9f4cb04a054745d484e32f9c2b67ef7ddbe3c2534197116f4ac5fc9df79227a86c3a171d690cfd4f9984f3ca93b7075231d66b4dfd0ed05acee0e7078f9a16c891e81e581315e4c132af17fd26930712558f595e5979b6ba5795eb0f09c57fdc4067076313f66a545f9fb5eab461036b14070cba230cbce47baad65a62cc372114a80388e960314079676b8794a256942ad3d2fcc836ec12ecee386e876a339cc739489f16a822602b99363f7a4b21b043d460c406ea8c81157f2004ba46477cebf174cb981906750147abf230cdd7216c8655236f33ea0a2fc73730d36bdd5670aec2c4b5ec4f5bfe9c51049cc968992c117a6e0e75519f8a7d3d59bb47400", "ac", 0, 145871548, "ae846913642fe9096c6d28ecabaffd421579bce46cef07774b9f6b99fb088c3d"], - ["5b32dc7003d90d03629efc61944d638add7ff73fa03429a7c88410c9f85c6f4729dc1a154e02000000025165ffffffffbae04f7fd48a122996992c25fcbac6d58600185c4b2f18b089589281657faed20300000005ac65ac65acffffffff56be94a4c01fe31b3989d30b6a32a246a8ca9a25ba86db4212bf4b93f01767b003000000096551ac6a516553ac638871071702a00014000000000001632565f40300000000096351656a6365656553e126f5f602000000000000000044a5ca0500000000b547761145fb02a7095b00534b0ef13d35950dd4aa030ebaba340a570d134848cc1b57e70873ac7134b643a8c62ccd0943cd57c02b5af8a69275e884e5efe327eda861e7485fd8d759b77b873e01ab2c286dfbe9ff5487c8c59a6f7d0f81de8300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d7e3886e263042ad70274f2544f9e7c59620c9442d450745f2c1adf2ef6f71a02b49b56ca8194faadd433159bc78b1c6845bddfbadebcc60feb41bec283997c36c668d43285cd09ddc1714805cfb454eadb762d6febf4b92482795f2fedb2d530b284573c64eee307af5786f46124779dd1967faa129fe630b9e554a04983344022221482bc804d34ad240e2f5607d82bf2da432cfc9d8512d42418ed4701f4f73031cc03d89a98fcfcce66af69e245cde4309deb0189f7efc63ce8c48c6d4ee25040b016504abec60821b1af8f8b84fc0146b2763954828b51f9596951e674ae4958f77c8e1726636431ed45ef86df4fc683eb2e91734bf9729287376b4e8070c6f350300304a7fccbca6947129c7e2232d7d9cec7b680a7825d8f459f311aab5a64bfa022bc89a9797f33f119ddaa1113756ebe095ce2e31d1d67a20b5d8ea0ff18f73ee032e17b13e242f7288d7bba7b454aab664b24cf76bddaf53a50ccdba4a9ee4c028030a55ee32372fc56b13e7712df8a2ee4ed054bbade1822ae4c751d92e6a27ce3703013dac89352574e85ef14a7e1ed37b6278d507d9ce1744dcbc9380f6fabe719cdad017e6eefbda0a33502fd483ad7a69b790259a3446bf1fc506212faa3be4d0eda58a311e10051201223775f48b682923f1c13bf0fbcb4718e49ca03c5bc04b7ac1bf93b95816576cdc80983d7e07f4afada449e65eaa2807a180b3f7fa17b455b1e7d6e3080bf58b4cee2b822f54bcf0d0012268aa6e2495a187839bc7a499287888984dd76094ef48eda632cd8ff04b8a481137b17fa0d46f12d26aa537b246dd656df215931e509fb128d8cc99d46fdee05aa4037a286b33aa0590369e2c5812506fcedb3173e3e3c2ffb235e1170f00b587418af082493ed8908a66eff729b0d6185ee3a8d960aafa9ce77d1bb15049975182f9bc7b0e7989e42f1349110d1fafc9efdc73a53194cbafab7e088330f2b6889c3095fe02914397f4e963a132b4f47eeb45a4835bd6e1c424e5ac7462b98e25af7484980d07d8f28d313dba82a96efcff34760ab1b4057ad671baa7bc682c00b3554b414f585bbd940ff3574beabd8c297a2b236d2934ef08af894ccdb33792858767af54c7b3c7b7c12e0a7c4503f130ff39c87c16ce90722aaac695df51e7e89ad9bf302257b34c75eaf5ea382255747847e80c4de8580ffd125c197ce3526079975db5c08ea085e5cf55c74e11e0c6e0b5e2c67b82adfd334d4c2c6115a8d0486280119db866f8b9aa1fd43570aeee250a568360a10a32b1aa44ac32bc459bea7cab17fb924ff2f8e94746fba2b76971d657884beedd32290ddc10568b06cbbcc34782322809da8dd5d1fd7fc71ced65637a14b43a35d01623977473ce1316934d80af882bab329144a38f7291768c19210b58188168b72c0ca1d7af7513afd94d2f5f7d63e314e73e47c7c9c65f6cd37c1ef7984eac7c3cde05722dc3bb343852f36d246552e3b312703a84036b1cfd59ef93cefadb1578165c1b31f29ef143823428e27507bedd1ebdf976d38a23000762cb4d0b81e69260bc1f89dfe5e586efee9f2bdbc380dbd0964dc5a5b70e8ada956aa4e74f65098937be0f10494f07d1dd1454d5de3f75f2a4c430fbd717ea9f541573d77e996c4017bc1f38202a05bd5812821a0d71040e1e0318d8bae4042021585621805bba0fa05a4040d2ccd1cb8ff1de72497055ab39f65425ac46f23070d434bfdcd23d7e8501e3c88a668ce8cf6930b28adb0f2ffd7e3ecab345f96af9104812030ae7c7712c486c8a8755354ab6d7d768e9d01f76d44c20b2325f23457f231eb7022b7e33f4b7723b5a40f0b2ffcedca7c1ddec9d879b16efa2feb02405d2d658c78bd3b45f0b73afd73351f40b480ce5b946e4c88b8b928491a4e89a2184cce24f40240a209c5cc6dce528ba91e7bd3563df7ae2b74931a6db38620d7573ea905644b61d1b86bd44aa61f935f07d202f4779346b6f0ed7bc0fe69715bfeebdc9428376680ef489d7f71d0f77f570fa175a707612d4e0daf3965ac467285d4b620d7feb600d94e5cb4293c9b6145876b52092eac91c5a3e95ab8568e9afd489647ab3f52570d43b3f014b8fc368a5d8a97ac0232a48650395cb0010bca37eb8faaecfd3ce985235e819b08c8cd0cc76a573d3f0693ca504494031670a687058114e6a27ab4ab6841dc180cd4c693c6b902d13162bf58885f6b826f7ad447d88a59a1ce7a780a61660682ab195c612b6a81c00a20846ce9e95607f1c4752ee3a732fdf9bc4c6bf1d4ec702000000000000000000000000bbc3f1f0bd8cfdcdb2926b8f52b108b510455cd68784338a72f25ce5c3ee47afca000d33dc9640b27efe79cb3c0e3916a30dad15c8c7547d7b22cdbbcbbcaaec31594bcc1e42ffeaa7e39f274d474278674abdf089b17afa06582e625bca5cc700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c7027a114d3fc91c7022996d3f1ee825820f7397bb31384d685417565533701733fc978d63af671471859667647849d21f8a37a5c8dc9787e8d1040fe16909af9ee2bf7e6c7851bd6dc667cf369091542fefe5ed3d989cd72ed1f29210ae026d3a0075105c2072f42f5974481dd45d4595b20b81adcf1b2910b4188409b6e0fc0308154b3bf67fca2abe3c281ddcff614f15b30b8f535f4009752f1111b84b696003123a276a5e8b057db666250773216cf8f8456d220c96113bd361f6191e21591b0a0573d871a0fc8dd55990f8791cf6638b5b9fac379a0f1a72c65009d80254a495da11ee2924ea7f0f2d20f9ae4e00e97d5309bc660bb2898b2de7e57ba0db29cd022c0278e7c7f4ed6925588c54e72e4ef3a5519d8dfdecdec1d2fac8f60ff7c355020ce89ee8ecaaf0d6f0dd2cefa30ff4aa3fe14118775319c2a6d2037fbe4db6230207e31574ac2d80bee6e9cdaddf185d571cc79eb407e72f2a40dfbf1da5a3448903208b9438deb665e2f421d9ccb109794feb8ff9458a5e8f02353452c1ce2f393c032d9a65964e3278b4eadfa188d4789b6ebdcbdc86cc60eab8a15de10f3d2a55619dc04ba579bfebb925286a44331d6e318531951aa3ba7a7dafad2d2bdafeb1377eb0f53ae2fc3a4050e76012dffde70e87e95304813c3e914396ea88e9ddb5ac742b058b01a5309e4767caeee426d1280b8275ffbd8401d955b2aea4baaca0e52d935dd07c6a662244160d5265054022f879780162bc152916b533f037dd10521308d90e9680b3b0938f5b7c4cb810ceb0969157579b3f8a1ca7412f158fa4efd5343e18b6de66b631293c9af3c1020f3057ab990b5c6a37f1bc0222f973d2c5fa43df64fafb169052af4c0c1525a39b21d389f599d728cd72eb6c33884756043a01b57a485f734164522dc01245ecfb035deb2de77bb1f63c0cddb3b9f470435c8c0af8201cd831c5dc7989f386e82004a0db67481a36ce812a12e5bb5d72598d62ced168ae0c88906501c8fed7df6ff025b879f159eeb4f689be244e6fdb397216b360bdc12bba9454fe0dc9d16cb79225139896f39d08fc43412046d79c347658118a491858741f703f6d7437ef6ba3cc6a82893c7a14d76b49bdc38e2580ad577eb40c1f1c445f4618fb0d14ddecbb19b5ddf2cd4212489a48018a982d13d91c337e9c568cb3be2a9f31607058fece5463203c2ef969cb78ac54c1d9a000e950cff0afcff3bba14ff6e722b95395e1dcee60d36e22983f9b25871cff743114de362aed86bb2eb69a4eea11a7ff9d59d6ffca67fa64132894fce8b2b5932ec2cf7fe2a8d9ea58d1d3c1e3e638597497f5eea5b23d5611a2668ace99c1e00e68ff973becfa8cc19733e8bef95bf96e5b8adf1f714c7a02b607d92262d08d3eeefcc23bdfb00f4ec3c8bc600487dfbaceef7431042a4ae8b2326ad4c35230f8fb12a7cc82964c9af945cbb3ee32655b322263764ef4222a2e6e8cd9eaee42249427ec97e0e6e4172759033212b80bc1a0c2e9610e8766e8c0974002bef47d25f804481ecbe2faf2a11ea53f62db59dfb882071c26de61ba5d0ea05ff21dceb3eac6c66bd11b8f1e44a69d43e90af2db29cc0e1106c42f2c0bf7273e5ad407ab199b84b5239be6a41efe5027741bfbe3feefbebd51243a13663201d49f57ba67e3e2748e83de552c5678e5b806b7f176d701876c33c482d9e9de8b3b97ce6341d2ca8c8bb4719af5d8d9b6718b84f21e6ccbe05ed7e422f436302ced14b3e86958be6bf377174cd339979d37301da5a5ed23489970206ef80ec29502882c3da924b916b6bad71d70997b8de89410665e14b627825d76af5fdaab453965a60c6570c5822a46bbff9a2b4ad997facd128d4b1c1172f5225496c270f7a1ec78f75340c21e8ca573f7954bf567ca679a56637208d30c861d90e2497afe6edb585d4223ca7786abeea42b3c84f458ef747ebd56be739baa87872673851817460eda4270aa0d9ced7c617a8300195a3a254e4adac5cdbbdb2ba6dfc7cef8820b29168eb5126c99a4cb58cc6f738eb3eff507193096cf2ad507b5c58fa4b07abdc59e7947c13d8daa43400770fe9285dedd52874b8946c7e2a1d92276e523152b3970187163a94fc58de01f41a5eaecb3ed2cedf4932a397e48744dade3edde92fa431c2834aa8b510191200f4706246e6b544307664a3121d89f7881f68dbf7cdbec4c3dd13df2f08e7231f11b9a64820ce295c13d7175becca2745964552903247cec4efb02e85bb2b3c1b8994b88932017e42eb72e9aa56a4a4b3f779e6506fbdcd6839cb79ba24a01b4712df72ef6219ff9a95915f938f03c672cfcf9401d9f3f88d8fb43b4bd497c60ba47ee7bf5506eb966a295af435dbf5628dae0abd75f88e5b03de9064ff33464be53961af2b4eae1d203", "51650065535251", 0, 1336680212, "0b09db9c57c617111c0081e8b09603291f29b1e4523407fa9223e93ea5ead733"], - ["030000807082c40301a9bb7f1e95c67e1e2059feb5b41bcda0a3a39e38c1e7fb4b0d0abab5f0584f50010000000453536aac64bd9e5c01af73ba02000000000751635363635165000000000000000001836d3601000000000000000000000000f6106b2d074104f76788d446e0b1930eac3d118c4c2a4f9672ddb930f58a7b5f39627ce4431b1effa8bd9746f3ec7bf031a8fff45ccdcc1fcd0166fd8c7f89ee52dcbda4a43210aa69c7d11f6a34cf9fc539ce47fbc52e6ffdd8ef2a6663f52800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a5164af4b27828f0d4398adee39758e40320a5d25de4df462dac40068633ef2e04e5d6b957bdb22adbd900ee472b97cc8c4494738601f49c07eb9e7a6f788cec2047e828b9e7c915cf4bbe59c287bc80e1270e99e4f0462adcd1d3b9b13599be4c0f950c124bc018e3905186c135baa7c6a616f11eb2896ab7d75fbf63b774fd0227b48fa7eca611dbd7b72566a49fec156d25cf29253fcc9c85b20449fe642e670212631fc09ec400440396ed21994ae6bbe018140e96b9cf88ae10b914a0c593170b02afaa731627a05533d94b7ea73553f44b565e566b0819a5b687671df1805c9a733b6025199a3a05ca22ee4a0dd990730a06ac5caf706be77b09ace894ffcab2022be7a064ac6ae817700dadee2e8a9e88defadbe7a13ec57b13ec9307be751cb002056ebf101234a89d8729164cb1b2eedc8db161b8371cad7fc64e1b289297a5e8031efab618118f299e15b0fbfc73de7855140d227d588ac5fa3d473c929f9bac7b030b5c64857c6be25bebbb541b294ab2f6336c4cbc684dce0d848a53968161069b021f10a87178a82d00aa0cdaf4d6fa4fcd6a05135213183694e6ed0b8b190c02cccddbb9e921aa482ac9a91ca4ec182be40571f25f717c229485651108f45da4eca0756e66cc843c4ac48c7cba5ad6645c373347959002f778343b4993be481001f1c6f576f0087420d20871165bb701161ea0cf4775dcf1a353a4338f3d63e8043d830e9b21cb77fff6e8fc22edec5b58ea55c6e70818728b2874f4d991d7bc75dbeaa8f0301ea67b70a8f2f2914479ecc7d61d5cfa3b12d124b3a00bf6a250a2376c0281e87d6892902fc6e41898727238fd440fcc538ec9b9d97d759552e48304835ac787bbb6e3fe3b875292d9524950380cf173bdeb53c023d6854a6428aec8cd6162853c231e2ba1d4c368b36efc204ca6a200af65a162d885d088993e991df956bac1c56e8d34cd8525e9964a7a274bce2df7458f7e82ec952196d37eecaa0f3ec157307acd112733bc49061d4b402b8e500da3ba79960ca19bea73a8af605497fbd0cee4bb4781fccefe668dbc9d0a58991754ce92d429415e2fe274c40f7e6c3e997d78716797f566ed30253f743b2c889a710bb7502fa6134367037dcc97e100680b9113d204b5a3484598ff0cabb6d741964c07cfa03a8a4abade0593d6e04c400a2cc7725dddb68b6d9bd71aff77d77ff553e36ae88959a53c7db382c129a5b84aed119b54acaa45051725a2c30d6f7908b2efc47181656fcfe6d0615ab0cb521c9dfae5239435b4796e1e787eb0a03a6f9870a1c317f3c89034a6562131efc3e338a8b6c38d80a4a2ee9faf51de897d0ab139a427e71932386f9d8c90b4570ee2b3744898212076ee279cea5e85c6ec3845ed1bea80bb2191f22a4aaee046af0968c49878fada040abab005d774a1cc8e0e82fe432c13704c416b37b50c766664bd28502f510cd4cf0f50abd345833a2ddbd95c11768db7df54a10b833ea58e0509b2f1e8718aed977c2c5727f9d21e64cd8f4196790bc25fd17362cdaf76b4e5e9d8890939b53d44f06a0ea8d918377f0d16b0cc12393f3c78a8361bdb5aba794a3a8a314ba836ca09b388c1fc023d040faebb780a7bea02805d37365274cfca4818fb400fd046ce03574bd5e792461d03bc341a45e0f92def2032a17add0101d217944f422f7588d8e27ff5ff88d0f73e47564de3dcffae3e5b6b466d9237c4b8d6ec3ae9daff7042ca37765c31750e17fe7ac98de072b3d3d325b4c049ced0886ec1067f2c1f0ac7d1e1ee66c4701daf40abe28c4a6d7d3853030e551bb25e490fdb008365f1d3491dbb0f62fbc319a3a5d0a866eec0fc884c65e1a8ab298905c4e7a88574c8299bc5e3ae18e5de3c2f71e078f8560f3e3e6c51f6a12080045cfe2aaeec7ae87baf14786d6dcb29f8d60f6ac323feaabd67a69abc604ef315111dc6927f241f4f9ebbcbeb24b8e0620806e22021758727e8b26c31c0cb11433761ea32f61dafcc5ce8e3f76b9242cd91fbe3bf689e2d6e99764b92d7b228e6fb9e0081a3ceddf80689695ae7ef5175b45c822b639c089c342118d34d84b14c2b8d8bdcbe1a59f9056dc2531bb7ac4ad8b370f54d0282c71c1aae25d3e9e02e9ffa4e7df5615330dec0775e58f86a9a64394cecb176400b0e91010f5d9cf209b52c38c10740fffe323217df948bcdc2d8866ffa955e65b343d7fba6ef013cdbf434ed4028bb6c0933abddfb52d717657f623387374e175c9a2e792f2abefc3944bee45f4e71a3936bc63915d4b25f1af19b670abadb2361f9139dac1c36e94c5c24794ea814b3b6ec734936913277c723fa47fb059ddd3a8442c0e9357f6354819c23dad90ccc081d6b99e079aea8c160cb7cbdd8369481f173efe2d69af7e00a5769444d744c04b3448700", "53526a005351000052", 0, -1914054718, "89301751211e14216c8e3008d7aa4a82672ca7d9af4b2d25e8122381e2377d12"], - ["030000807082c40304863b78da0a8b922a4504a161d77fc830af416feac9452074ef05917336f1097303000000050065acac00679dde0d55d1329302fb2d97688b89db6d0149cea1ad511f844fc052cc550fde8f29d3ef0300000001538061b25c9f01ea636004cf8957abd03bcd7f81050a2b1dd87f518945f1c8d0614a251dab030000000765acac63635251ffffffff146e2a575d6a47dead47b18d2982b60158d12334bf540b4d50bede3e12198413020000000463526351ffffffff0199548c050000000001ace4fa448600000000010000000000000000c35da50100000000868c639a9e0b29d7aac967e8e6499d0153069ab2ab0c377bfae980d57bc02b2c514fa1ed09ba00af2d8b27a1e716b94802c702119761727189c78ae1cf4d0415c14f19d376d9235ec90ef8221e7e443b1f74c6efe55b88f5a58962847b85d0f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ef3ab42c232b68b6d6b00a71be82b80ac72f9bba69807caef7a9b688bec160eabb512cb1cefe84b3fc97bfcfc76e157066dd43edf51d375f09de7260c59deae7d64bd616cf7cf025b8c30bae13d2c49cc556692c93e0a3cdbe4dfa79b575769fe61af91bed773f56c23cf216b77a414148f593c8a78eb5e03ba456ee9bd71d0f02109f18219c684b6f8ebe2bc026af4c7ca899b20da47246bf78c1b59176651c650207b57a20bc6887e15cec43419be0f9a88b5010e358c1add04e976c646b09d03d0a0082149ac63d4e23edaaffed088e497657abbc94fd4b06ecaf1eda7d8fbe32f3d455256d5075ef4cf2083d366d88d6870baf5d9bf77cf41482746cbf0a16b9210225486dd434ba3f6260bfaa7d3766e9762909726f1b0d360ca2a9d4417b97646e0322ac61b936c93b1f5b8983f5c27f2fd4f2f540b7faaa19276d3eae05a9b41d950225f8144b1989095e83101db10296c0973d8c288eb388f8e12c684a9ef2c868e903299d563639f5747e3de40e385c333d7fdc2bbb9b6f86605f15e6f11fd68a90bb0316013ec9bd5ec53047bce0952869ae3c652de9c81fb70ce89a4b1b457717fa41963cd236e6d8ad32591e2b649d284bfdce72ce072114e826640ed0acc6218e7540662a92086ee96966c81acaaf41060a7f31815baa11bb21ffd794df4da957a0d1bae608cfaea5ef0832b07ac596988e0221597b596aa869c375bd14359830bc13f52d924a23023275384b3b9ea0f60d01c5222145a0b8bb114fc2f534a4c894210e608105cce8335da9943cd53e2c303d83cf7906532784072b3eb7fbfdeb89ccc293bb895ae45294eded5f6455d4a3de787ff108e772701875a0b9876e7ab611ea031f979e11292c197163876ac9c3f8dc0d1ba36760e9c2b57cdc36791322033ec5c09af02174106d2497440db9710ca5a02273ce2f7e944bb1eed423ad247b9b1a251638f1535a4972fa4089769b29ae081efdd5fa7e04b10fd33f7857a1bd69a01a881dd16b5bef201e04e843c2603dbf15d7f06fa92b164ee5752029570fcb10c25b70bb35a12373f1b094ab1bbe10b57dbe0f65a72430fd9ba296aef0189894701c94907ca9100bb2cea74d7e257e725e97faffabb9d0efc45634795ac57191a7685371973b1d766a49ea2e6f1bce03e6695ea890cb6ae7bda052248f93aafc6f85ef6771be98c2a085def843591f932d00602f30b7a52602b2b96617758e093b1bff0a6805753ecd0a8a6961acecfc3ad6d3e6f99a92849213ced9891ecaa56ad5abb0c5344ac4d0bbfb98bf8acf8f0bbc5eeebc44a29f04618018a746ed2c682601702ab1817e8987f03014daaf17d90497dfa39be712e6f87d99df0e4f604d646b479323c0154ca34598594a70fee782fd11e04300a16e09bfd28bcfdc97a62b95db0ca34789bafb8a615e4fecc725bbe7aed17e3993e015962dec10fa65c3a707e2aede0d68667ba18a8f113f31b404b6a33c6aec4569f414cb60e580797dd60e436c161a3dde14b510ecfec4318b6d6a170db4a01fae661cdb23f996b844a4e25d46db6189cce05ce55fb3a71c5570653730e69a4b165d0bdc57568e9dbd6e3baf587e349a20032569286c6eb605f8bf12f9c46a43f06666e967fa6b22dec2bfdbe8498be1ac7e0cb58db1ff3ddfa6e1bcb48160286427245a655daed15aa6c40efdc72cad5278ade06798da8000423491039d9428cf301e27d123e1062278601c4481d8dc7d02fee9d7e85ac4c9c296ad2e93eef51794f013caccee7883bb2a26d674f961c7b418858dcc2c22b1e3820cf263403317c36037b7a4d7b6a528c74bf415e0b5c43a3950bed157d906c72e12b497d0f6963c8b4ab3b8bfa00a9335a74d54557435b6d55bd642f6923b152b7e57728a199ba6516a2e0baf670796792240edd5751d4db66994c8d4906acb8ce4dd32fc86d3f8bab73d8aaf98d37e4487f627fb001315ccc4667e8568de4a8598adb01734d395eac761fb54b201bd9b8fe594f11037e8b28cb692483b300efb4f08ec9fe36c6b03cd6b81aa14e1692573f73b4d40dee2253a5679c8a6fe141bf93b4fb56019037cb4f857495e249bcfc120135711a648792ce148c778f82397b59c3f74dd65b903e093039b02b1de07b093d300c0751996e7b721489f943f2260941e7d34a9f45d8d8aae0cfc470fec23b9e49e6f075aaa272b4f195f241b6d33b516bcd9f66d3d6deabab2b5b2eb656f62129660eae1805fbcd64fcd84c0e28b6675f2ab7ee511fc21d4841dce44632e7d42b4a3368af02906e77241a7976942b8503db53c36b01d4fa31a378e03843f03e69b9a975de24e73e5edc33aa9d5b4b058cd5d7f49e51df8b1d51de46883b1b750256e23de0556fd4ad882757c1ca68e3f312939230761f9066ec21d15f24cebfd58cba0a4318279f40c", "6a", 3, 975266797, "e81ccdc313857e1fb639e11edcca9c65b07884095d0e7c8c6e4258ca7c8ae283"], - ["030000807082c4030240e30d74e703f513a895c7bd743b8994078962686a5e322da4da1084a8873f23000000000151537db523dbb389b385559f549229ad82f0acaff67c6a4e075a121ff5c2cac50df9cbb3a5000000000263653765038004bb893002000000000152174c9503000000000265ac249de4000000000006636aac636a5355879305000000000500655300526f80fab958f5233a0200000000000000005df0d600000000008bc75338ca68061e56059b3a25635f6c5c7fb273bc221a42688bb5a1806c8a7d6baaeb124b322e99c1acf7a8c88622808e4206c6d4ab52de542a5e79fdbe982eeabfadea4e0944e89829798fd4dfaa74c7cde4c16a72154edb323bb1e11b36c500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000407d2cc1cf16cb5744175ec471bc949238ed95198a0006c1b9d0056da09083af1cf39f728e00fb06626091952c8f7983f5af6f38885ee2043a445ecebb478cf2a85631ff2f06b465b93a2eb7718a102243f6c0755e0992dde444f89a99cc88892b350601807792c57324098a8bc3f263f51614f569d5e9ab00badade87f9b37a030445010a5cfe09adb45d3b62e927f469fcef764030cb2fec6dc2555e73ab9e9302079f8d1cd556e5cf6efabed443bb37e0ae4e5225772fa77eeef012486dc8dd160a012d411ebc651cd6490d355fe8a9a9d111a0df9ae5c1f4b75dc09624d20e99b9c98ed08d3fd6a5e7edf21cee59615314f7d291b47185f85eb700df82b37ba581030b8981f21b1b89e2c7782e9731b1f9c241fda04ab57ff2d69a8a6fb20c2d7f6e030ba3dfdb8b0861f9e2b1ef27b4c42fe6a87d2cdd594b3746c41dacd5a6f6ccb3021c27e3c723f36ae239aab5562b162b7d033acf0b4db4c6b9710932d53bc6a5f2020bc34926d447fe75ded756fe4ae63ba84fc86f725adc990ae691a48dd619d0be0315146a4c29adeb0bc593007df84e3e695a106da36178bdfb56e0b1257befa2537ffd617bea76d294bb1698efd83e5940ac95b3faa1774207b51f4a6f879ea8e7251a64af526c15d0a57f61994509ec5a54a04b44b757c67baac39865a1d23dd9750d98e61ec17eac020dd13dbe689287cfedd8ed9a754764e59ac2dd870c1b008bdae69258cf00414c48e4157f5598ccc82aaa100f1426bd1b88c185f421559ddd997b90241d016f4614a29a54dabfbb0e7f20d06e4168f1f73c02738f939c0d6bbdb504140e47b29df9031850db1ab7e7256d1adf3d72c9a2e23eb1783e2ec67d372960eb88efc9e39a9dcd5f57cbccbbeff4e61e09eacb612aa7f63c17baea8853d04af1a91a3776f91b4f91a5d70e05e8fa39cc0681be6605d7ad09cbb1f124a0a302ea3fdd41e5408f7402833de25c6219c5c8c3295d83edf7a8075f51c08eca89891f78b922ad36a83fac77674cb07643549d55043b13551cec70e918a87d4c1865a926afcbca8c594d83e4ea4bdf25a55bfc8939f79260b17c2ed244838e8ffbb932e787629d5777582c1abb8d5ac043b7d34a371f2ded61e2d811f35f62e6f69e4b6118e95144391f512e8e889ba931258d2162a4008249895ac1078412d609f2dd78058369e4bd72b93102208b3febf820c4d5b24fe3ac5f0c28279c4bd59e0d02e29f303a30d76d333ccf49eb2b069562135fcb0ee75ed1fd8d66a35a8a996ba7d2c73a722f5cd01fbc45613a7ef1ccdc71ebf3958df68b6ca7bb3ed291a13dd7a04a15183e19c774fd2f5521acaf4bd2b999f3087a840804fed8ad3e5fadf475af4977e9337577346773ebaba2682fe3554935b15bcf592ed009441b959ddcfdca43cc2ddd16bc2c5432c6584878975a69ec2cc65349e88bc5e1b2adcb135eecd2dfe894ce011cc5bbed0031922717f7494e0415fd4f41205b8d4e52ff1be7b4223086611c5a3dd103a058b6b7cebe9439e6e93fa51eba551d3f10ef413800ccf88694b1afabb25e3b4c7f91ccea6caca977c7c563357ac4c65198e49baaf507f40e7da1c58405823e86be2925a87b47ce67b5e3a6daed544301ef1a21e0401a1d54249a2fd65a4bc823c8565f624aa0ffa0b4e4cfada436c417bbe84cb4e4bd5d25fa6d7e81f6b1f3759d731bb89086a66a5915a36645f84a3a35fa396b038484cd96045ce54e77657d98945b3faef60b0d7efab75f125359f1f96d056338fed42ce1092afcf096f5463facf0cb7348c627fb95954581de0545e166f9e4d492168e7a7d756a6febe4944e28b877b9bb283b58c9b40bb6243c056e462c37303b297336a777b70fe5a2e48099fc92663e6e850e641c115c63e3a419f402ad93071c0eb1853b847f58b5dd81ecec651a6456ef622259ccd517482a57dbee7a00b1c0cbbe50e36ca3d3b8771f95ecf8b8373d6f31e9b0868b4e7584a2a6ada7efc9b4e7e86af7e878559e13d257de9156fd082e0fec02dd2f8106a31664bc5d2076ca580783a9035838daabee2d8f7b3e84f27f6eb7ffe93179617c555743d0c5e08016e0afe0828407988a7b528eebeda49476b3338ecf0380958c79f38cd1c8dd01d51be4f0d8699ef39e74e6832bd29f191f3c32ed0d85aedab244c4144ebf97422a3732965ebcf33d15bfced193f9b48158f287e468f2582673beadd0748a5c1bddfebf83f9475ae0fed4899374ed4f4beea3c63db53c4a4198a1aa9f9651f9958c2247919c460067cdb1cdaa0000000000000000ccfc8f0300000000bf7655ae0a81edf19e314cbbf174ee5ccb62b1663364965d29b614dd0fc77e3d6d48eaf05b5c1d30cd52dab741baa2ad040bb9c06048bb1729a7d517f445bdc15984780f9cbd14e97ac82bfad0bbe23e80070d36f01f01320019318985e57233000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002012d30e5598d467ef31697dab6b03d24c2a1961698b7b6e6e13b8bb02941bf3d8437f23c3253ae97df1b0664a0d2fc4a9d386bd9b658b86e91a471c53a9800bf6916edfbe4b4d2146f40e6d35dd031f379364b323522e153c17b8e1c24fcebd621aa1249c9db6aa1c0f7a80ae4775ab63cbbde28a99f355bf774ea651404713022da6dad515ffc6e0f4f3dbfc4a4ff7a1535b4ebb3b05d3c830871e840533b41e030b3576c4e3600f74d29d33d4cbcef516d64e45219e01054abb90efec0a52bb330a08550890031004be82913b90c043549920d6c8a4ca4570e86236720c74f44d55aac24c1688247694bbcf414a1b3f042ef3ba3e9a3d0c4d8ad5bd04be4a38b3a103210df1876a94d494ff3f135bb32069ec6556a74d889a347fb891ae5767c012e70323383a877e33b489b86961b4be85a1ce5445667961154d67cd601b2f104839c403058d6471f80c41ea37f0ca233e8333f1eff16e7d6bf6ff16f1ad679cee531d6b02245171d4c5af752bd95ac73552dc356d63b6ce212bdbfb81bc8aa772cc7a7a94030a774af35cc39aa1d3845836fe8d52a371d4b7673810c90aef736e0bff21fd50a42e076ab67c69d062ed13d65c371867ce47e0acb45730766ce28f468de88f0c938aab171847e15b4d180b6b769f1cb6a30820198e7b768273ee0cdd9993c66230c425f94f334ee700ea57b77c574408d2a4dc65d0ac01a9c86860dd32bf5e93d38b0aef224b94f6689794c4644956383b39a22dd9a2cd3dc1daf2be9c36eb9b9bdf084be276aec2b21f8dd22a1fef18d8894efc8509f2b6578dab036cf8494e0d7f8ca3205312c2e020fb39bad4511619c6afdd5a1d44a81a822fa91afc8a519ff0797e10237d2507f08cac444ad3e6d4c36fac5970719165d61738bcea484c4fb120f3a931213f5e2f555a05dd5ca617400b690d794eea5203be93b2ac3dff4d80a6591844c4696c2c51308bf5c6a509e97f9a8b0a35d06307cc067d314bdac927e3c639ebb35bd72f5423b54148097bc90caadadb397b87d36b4c4f0ad46040ab3e12a6ad37a57a5b2c9eaedddcf9700f57998ee022a2bf53fcfd7937b012c3787db20233a5d74ec64345d0f52e86d139d91ac678e353553ad78ae0bd4cc328cdb6f0779a25acbc30b0a2bb6fd55bbb8a6ab618bccf5527091a4ea6054873d06b813f3e33115e8e9dad01b0b1851052a65262ed0f264c61e38480824281aa3d3d2817247f038b078c7116b95579a5a62d9c4d6143291910dd0558c4572c3bc82c59bdb0fe5752dcad20ef48239f59af5d395c9f79480a1cf5f683ebbddb68991cfdd5c3059b17870a449d4ab44f363418cb9c50a8c19320f9ca4180c1f75438a6904e72c087d5116c62cef556434f5a43bef6a9b029556779c36636b2e7c217652c89edfe6ec019718aa3249daadb90f9f68d6f2ce6ab8dc0a57e239398eb2cbe16dd74d48b76d6bbf08822f9c1055bad5d0a69f64158c450bc9987885a8eaae54f2eb80ef090e1f00d43c83651f2dfc1434070fabe4ebac972ae8e3a7b54f5b8091f8f811c9e432245d9569621438113f72ef97627021292a0d1c0655b038f8784ab055a5f7b25cb334c8a3d6c9f2c820c9c89a1ae7ac6c0a8322fab5b6043c258a0abca9a1c34543c0ae5c43677e47d34f585ec4911838a72f50dae9783d2340e17d63681a34fc925aeb5a008a4ac8ed4f07ed4c2408f31ca358207c6671d0ee8743808bb7175d6e294e5ea7f56d66083750ca7dde7b23a2655026ea569bf976636678ccddf64d6f492ff1acaf8a8e48c98c4f796aada193807a2ae72b8163bc2af24cbbd75509c6d8d638322dd26588ee760cb4342a53327147eb8a1901a3fd9248cc41f8af39d682225d1259c6c603884fd8622fd8281e0976904a3e2b96532f293e9c8e5a68b0e3b59c669e942898159604cedf298a0b40695a6e50ac14f2524f64e3da78e414fe261b5bb84ef9925faa547c781c12906d99d0298bea61c0c5720a0e2dc0554e25ff198b56f78c70761bb0afc480f16a794c40e88e9d80f4965fb841139c71c7366c9a642f864be7a5612eddeb020322263e038cbd42829ad772e4a82fcedd4957b638436f57210226e7b12893203de3603102b51232f1dd8d9f6f78c589902f7d252f201eb810101bd8b94a86ddfc93597afd5f7c71911fd82b2d247eebd5e6261906d6e067e2eb49735c83c93341e5fbf48fa0d6762264b6c9664ce7eb1e2e5e14d17086cbe8249e5332f96269781c6d30a83fc952b3a8e4d937b7863e5f62381d40aba2af543c569619bed3b00dfb9cfab16c752874ad2dc6e614ac7cadf5f58b22e16fad7a52a788a03e9327533926632dafbc9a9f7f4549b6d5d381d97e4f27e4c9660da8944efc0dfcf5e5246cda8011db6daed988ba5045503b1d51a961286131f3ecc0f", "51636300acacac65", 0, 1814192179, "3c3328261a575c3ae84f27a9a067d5fabc8bf13d7a76d95c0507f3f15f6df943"], - ["ce6f8476018962431f4f070bcd80ee5bf382b02efb5043be77a885bb7292245788f75fdc670200000007520051526a526361f99c8d034b126801000000000652520051636aa8326d04000000000865ac63ac63ac00001756dc000000000008acac6a53006563510000000000", "65ac5163635165", 0, 1159448175, "d1c8dc0bae676c21367b3564c974a5d054682d101b11d094affbd2e6b8684a82"], - ["030000807082c4030347785e519cd9846056fa9ee161926835920accdbb7ed6242acee03c2b3bbf3f500000000056a535265634bba9a4ba7eeb63d57f5b05997fb096dec0792ef04244c82ca045a7b8ab96166dfa3847403000000055352536363ffffffff256276fb5cee6e5dccb744a0b26871d2e9fd99289a5964253a8946c068efea430200000002ac51ffffffff020ab16e030000000008ac53516a00ac6a65abacb804000000000000000000c495c88000", "6352636a", 0, 1575258685, "d4499313069bdf8efef1771bc3e7c14acfadd42fe9729bf632eaa91161aea61f"], - ["030000807082c40303a3cb3d586562d07ac7c4c3cae833da41634c17e77d73122494df33358e5f109d020000000700520063536a6aba7764c6670bbd4737130ab018c64dc011bb94c6aece42552a46afde58bb37bc01a70e090100000005536300526affffffff5850ccb41efad498b220a4c06fc432900954517b8a6f2fc043ceb72cb073f6b60200000000ffffffff01bfdd1f03000000000263ac0000000000000000020000000000000000737fab0000000000d381f26e7c886bcb5484b8e83c0122095fe8e00232f617b09375c0a662c0ca8491e1152eb211e5fa390add407f7287f34cd5a755968b3c0eed6996d2e4fde8e04f8ca4f31ef1f84757f259f8a1a4762e56bfae37538cf1dd337129721e2a37e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096133adc6b608e8e02afd886fb8b7d19f1733c4fc07dfad0d17b4699d4c0d58a787182dffc319ecf2b7fd5e5896c6b9b5ae149b87c70c3ce3f30c3d366db283d661f1f37709204d509ca74e8579e155be28542b561f007587a1171ade0dd7d66093a270fd60a4b6fc9d5e80d2a4dcdbe4a5d8354233d33133c4e7ec4ad733f5a031ea2a591b454f91367547b66b6d1d89a1e7efd644d19fb0d9e0c48900bac2d23030ffa930caa80050d9f4c900e6f86288f15d6bf6bc4d88d30f0f4e24fb38c6ee80a009d3cf748843794f1d59292b62b42aad2eba3833c445f72e1b90d55d50580cb0073c9845efb443d9d6a2383cbff259bbdbfbb686f44b97c437f461fd7f11d50030978bc32b7c77626143bb21b20e0f5f5398d758c59ee2cae06e80e196b66080a021c92a80e280b064c0b6cd2b50a9ae2ee563a7fd83862b503e90ebeb0b38b8e920221c3675bd50e3cc0fc34f60dec7359999cea657dea43173385a6d5a7733de8760305013974a2cec353bc676508101551dff0f0070242f285bac76bd874b9318a830203ca688f120824a54bf8c16ff2883087942e4d395add378c1c3f4085376802d20565e8ef7028c84511c8213bf1f20f5c91aafb8b17d772abb31019a540e1aee0aa26e81ae1f5142f82dc97fb6aec187475f9b59afa7b5d72948bb31b4be939da8f4ec3c1d2059feed740e148d265ac0a1d99b53bcdfd98b9ea058a7426d900ab88a627ebe1d246e193365bab29a3593e76dfeb97a9ae54e21552c7f16055df7adac31935802a5b9339a736e57bcba06cf5846e662a8fd8cc6b8ff377feb728537ce69574475d4a9882c0d9aeb6b736c3d94e7cc19071aab0337f677f032ac2c50b7086073c41db20d5b6bb6984ed87926300f297fba434731845a5c2d345ba7e0d79588a83e70873f87b8871aac8f027fbf2a56c795afa146c8a2f74c78277c3df9c3a7fd3d3cb32b72162ca7d237609f1c6a869bd2f113b39d26c394cc05033fdde727f0311efb3f3bbea123014c9abe7c29660781c859648b9c052b48deb683acc115a9e25fe1904e5f888d9938c41a36616b5d7ddc05de3569dc0d9fa76718c554eb66d7bbbf2592405bc657120ee63a51c0193c6aa57b06164314c799aa3d834310fe273c26a823b751cdc9d38aa3c3d667c73a1730b8a5e7f57a0264e53c3b6b87d35e6f20fd81421044c4bc16f1e3243710db6ceb49f489018d206c778257620476493a98e332676009991ee0e0265ee5aac123d1ac23602f5e481ba6b5e030b87eeab3dbefe3e9d56c6dc304261b97c88ef91f1f226b963a25bb253230343173bc8cce6900d31a630051e4f5ec8886748528fbb82022b240a5d2f0a51b16ade9aa3d7de218ead1da391b2456bb266439a3cb8a8da3a3c6d59602e6188ac46365dbb94d79bac23b01c5c76f8fbbab04d1fb5f40aeafee811143a9acec3b179181a95cb1fa34b9fd9d000c043826f8057f12c4f4f62df29513d987ebbae0666ae86d8306f6300307182452b6a8772454844847a3117419f22a33d57b5eb2d319d1b233f1aabbda339e730eff0526594ee5776a419dbad9a01f6a7e3b552b7b703117299bded1c35b4345b69d3ebaf00249be5a54f65d41bd4b0962a51dec70f1229b9570d6518a3f854e13f045ec135c86cba1e29aa5d44ad1412ecd78fd3e214ffdff6173b129e71da824f0a5333b60240a4f4d57d3f667fb5d7f056343c1ad502649f853913ee57f161217a0a5eae60bd0ecb17f35402c065439fe1f18bac50cd8df033ea832749e59575b289a6dfa62925743b8f3efb630248fe631459242df45fbd9af996f8f32590bd688aee08f95e08974e22ffc80769ab97c4928d92052f6e0f5c76e32e79ba966f4bf0e4caeec2cf4fd8267e863977e20e67d337cf110726889bcda6a89b5ea001e528c80dd83701756b184293c75996c96fb54fa3ad671ccd7b4582b0d8382f598f74825e586a89e47e4cc13bc31a28350db1635cde79de585c74467e9848bdcc1396f835652d891c0bf2380c1c91fadbff88d1bcd85735383a02afa8075879ac40a3dec843805d70f91b35702adbf4cb5c0703046a3ccce2fd7bc8acb5beb0326d2076b21a5d83df3f67504e70f969b39333b324362eaff57312b1fc1c161b974d1b4063549247ccc1b897d7ff81cef9cbaf9b4bddc1d7057f5277fe70dd5415fd82766b611ac477ed8d9b48eeb5681db4088af3bcfa58c9957bdd41108896a7d39fa74e79bc8fb508d0ee7eb4204ce72e8a6e194fd77720c4b43e649eb3573706f4f24e139d720400000000000000000000000037c266a53c196b7c8aec44508750c41d25574be2eb8e9e909d2a52dc5a93ca03e73bdbc3eabe67b626847d54f5d5668c363f7a94b5f2a7468713013ec29cab5db50b7e66f7e786698de7510b57fff41b3f47ad6c8a027dfc415ad8b9e7eead7b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a62f7158745a4658b5558f649e138bc3ce2d215bb091f62a61fedf47808a06919ff2f09b3dd4e8807bff0747c32c34270ef78cd4695919128c167d36f835446933211cf0deaddfe25d15b1a3bf9ac023329ed7e5c4d997b9fb6c896253a6f40f612b61fa87f614b45c28632ce3e386e3fdc96385b1e4c0ef04790812e0b54f021d3db5cabc6af1dcc945e599293032f178893c6187abdcbd9c642296c8cce46f032d94cc390ddfd7a75ae0e76cf6831006632b846fb6f41d7a7afd13cff976d5810a08e67032950dd0b2bd45d9289f0a8498883c286d25444fa52c4b29abfc552eeca0f55ea9f6847ca1ef5b303c76704438fbdfef3e05962b463f7ef16f0a519a0c03195e604f02ee0dbe06fcdbbe3877915ce7ac3fc47c060f2b6718b81eea8e8f06021076a98eb05868baec887cf92c501a3479704e41df9ba4ee750167419a801c9503258c5ffa64d5f30c2470504dbe89038167c1205fcc44ff1c6d02e88fe3c012f3020fb4c5febaabb90b80a88af6e04a41f518cb31279f37a56b990cd6fc107473d50213015c9d136960bef5bc9e996a65fccd0c628e8410ab9fe6c3f8d1a7b5e375b175cae0ec0a482230e9babea3fe37b8c4920403dd8ee2bd8e97dbc5df966b9f669e03cb0672197882a3999bf3d86dd3d9dd17c63de9a3e9ccc562e685120b3bb31ef259cb370f78b902159671d9276fc9aca01f7a3e28b0f07b1d334b637979ad4f5b21467b1f22a47eca26a1f03c717e0ec60e9853172adb353cbf5f93a5a555a6f190a0e64d1e88a4daa7136408786f6b2d1253c80eb6eccc6e0b6c27ac4cf775ef5fcc32fd17027ff8f7dc5e71810d2920d184bd9ede1f7ec0598ebb5bf30821eac2720ff9338b3cb6168378926a5cecb6bbad45c04e2df4ac755fb5284557c235688a4187f4bc74e533096a0e69faa308600b911367c1cc80a2d28655b587330e5d479600518e67b78a5f02e1d484276c43ec47af7b690fdbab041a081f66095f15ce1b8d187faced1f2427080958fa40d1bf85acf325025e42ba23290e8c45cb21bc2eb37fa2cd863960446043e4e9b53bb84121dadd65d714c9de0115cb08bc7ec26b88bdf82118a6fb525898259285e499df68e75567802262ee50f33a636968cd98dd073d68d7db6dd3506f8fbbba1c1f6429f4128c0f921c0c7ddd0ff96c08903bc3021b28af1f55a7379b1ee22144c534951d05731dc219db60bcae8830f14ed57593606528ae8e3c05360951fa736bfd9c012d08e3aef47aebbe0f56ab7b87cf525c9a873699abc1e32165342f39aa9d58d6402924b9320c263eb81a1a2a327289ea99b50343b0339209e985a0a747dc9a660feeb9cb0b4769b9630f1ef5d13917b55d220b8004272eb3f21eaa8aba2c3e812959f9f5a9bf3225e98dc1bbd9ff94d73926b5c151a640e78b03bcf4f84910d54e62b9d11a106cb0dec34ff9a061f6247238bd9ccab128ea50f3812366abdd074c2fd4d64df7083ad44dd01ce2a2e620c6f8ea8aa40f80e8b3e7e2af5730be2f842f46f8ea5825cb0f188b539e274bd524ea2fd4e7f3f37925e145b9ac2c0cf4097b0bc377ed9c02efce9660c1371b255c8898330fd8a901e89c335fb4520931bb04cc7abe8886c0b4154d3ac917d74eaa0013f54303216c5d46acf94655149bd0bef267f92cde4c5c3b2ce01653a0e906c0911dad90bc76f488806913c0fbaf31f24570ddffd3c750a3d1a9a602059b63e8016f34bf2a74bf15d6345f13a8e056182f683d756b800787f8afd7e5fc971cbffe1a2e2ac29c0a5e1f76f48d8279d24733c479b8b2ad2263ff250c39b4d4cc1a28600f3325600707fa418bf91016388ba71edc8b7c71584370b30caa53527a8943e4a6170c826eb1ccda73944fe5dc5f63224cabd6d59ec78a70d89060a6e24b5b3c588bc76ef9e855cc3c1bb51c1d4fb3470d73a2f83e4caa15b7390bdb5fca719d55b43b783e654a137dd07a03c42c6cd03da23564f9f835d407e20ae9b3f72b9306e4501b9bd88eeab2ab5e634a311dae09a3fda0999615a8b3a049ff33fecf88415711e7da7594238e7c9982ffb7d3ecd0bfed1ebefee8e8025405280e79bd652e3ce3e660e227cbe13f510ee53203fe73fe802852854cde193316e58546a9efe4a1c89c7ce65a7f876ceec01e0f72274a1695d6f9df103c3c40a2279b547b12cb421a9e7c99aa7d454daef0424fa77364460c3a6f88059456684d5e837339480dd6918261009f8305cd7e3dae99090cb1ff6d489f7deb43746ba0b1a024524494a1ea87260a3f7a3d1f724726a3fd55f987412b0d4928fad954a7bb2fb2281436ded4ba0c926022d2028cef17b4a30af7f8e5486b4b8f8fb868e32a366ac8a93c230cfd1e53e772b38dee7826b8f10dd9eca2a8dc0c7bf2392aed6162f49c180fb6039b96a408", "65", 2, 778055595, "367985851d713fd970149431e927946daf3663169b262febbcd269e9251257e5"], - ["816b465e019502304a374871e40ed138e989f56598b190e4abdb5466dbb3144a0a23b7d7f70300000005530053516a56e0d3b504b425970500000000065351acac65635a97af020000000007516a5151ac53636e6bdd030000000006636a656a656314921d010000000006006aac52ac510000000000", "", 0, 965875676, "4fedbe84a0f400e64e43c0258f7b63310f90fc57312c1dc2da6555db7ac6b918"], - ["030000807082c403011e336af2bd0b165ea09f5fdde35c116fe11bc2a60f7c3c6f29a7027174f4ed7c030000000563ac655251ffffffff02b76481010000000000a0db77000000000006656352ac6553ac8bf83d0000000000", "6a6a6a6a51", 0, 158105416, "2df1eb42215e6603db7e8f685b133220815231e868d1f1907907bdd29f230dda"], - ["030000807082c403024966f491eeb548cb9fa7da77a24b71f44861ee162d77ee48237ab8c64117539302000000066aac656365531a52d8a7a568fa4dc49430b3d35c6da3ba4bbe1cfbe8d771316ce09dedeeed5e132123d7010000000951535351655165635398bd4bd501ccd64300000000000351636a000000003ea6d56b0389456103000000000000000000000000ad58b48e5c892a268d647abb2c68217cea803c614fe2231e0aefcc2f8aa9afa044354f8776d907ab734871324a724551bf4f0976a3f4a8ea6a00668efae9b806bf57d8f597ea596164776403db121b94f9c826f7b32d5f6b8d41cb25578be5a4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bca297967ee2b117bbc50d4b2e336615f2461a7f55ce257e8d8b07dda6a7d032ef1157c45f4cd99c816dd3dacd29da53cc913e132992014ab44695f7bebe3a70804f725fea69124bd4dc04882947b755a8997ea74de9ec2df878e87037ed185a3d55af2b11ffb549f41345bcf52c9fbf9510694cebcf70e17ecae09af251a680323368c0e3fb7a9545c44d3828a8615bbbc3139982ce06f8c70ea0d5560aeea690214a19dccd3bd9accfe69c3b363ddbe2d0f34cbda4e638f6b38c9d8c586cc61fb0a03fbf4ec488c46769035c4ce42ddd91d6202f442911c93f8acd993fc32c692525141b3f90f6768a6ef7dc8f1412f8470b5efc7927a37402530deb48feb9b6933022924316566f648e5a77ff06055a275321f701c97eab9856d5df74ae703167d74031362e7c15de013677694c2b00dd857cc0266cb17f5559432e4b4862df7da9e9e02188b9d5d84c55f57496a02d84910a28942adcf16445e8f5549c1c0560f8f0f7202016734341b6bb1e6945e908e672f174fe160911c26d7b8153d8e0afbc1aeddec0322e56b3bc680cdd42fedff60189c5c733d0ddd0b87e5972ac45da6c6d1e60d8cc875c86dae09b59c570d4e51ca1248b9a0e0fae621b94e9d0506936da1b38dd61376798ac92d51363f1ec1db581cfa7cd1c525f1768398bab1f68cf65c155670a2f41b5b1b3e776c08f86501351b4a2b98c9ab8ed7b8b138cfff01a2f69d21474381ee1e5b95abd037100b3e50ee577ff93967d927d7de8bda15d5261c30e06efe518a9eeb1053f618f995e49995541eca952a85b2590b92e52c3823b187e0eb90d4d75df158624c6dcc1656407e314a207d6e196ae5b6d777333a542e539f386d735b602992f47d343ac66151599de16b7a4d3862ef6733b3f8d48def8fd0a187337f989f2a8916716ee6f547f7cb772cff889c8cd272ee4a9a62709ff76218e85ee7ab3923753cc55410fd3de6a2c231e9ff3301ef115b3858a670909b8c469a4933dd7d26f85dd8059c58e5176aedda96ea6e726f42afb7b3a5130f812d73e03a86d783c693df40d614ea50197c6c4c1670128c1233965c6e4190a3bca92e3ac2c8afb38f7b11bbf6d6a7f03e04797897d7602d4fc5a6a08e30829806234b1fee2b951123c02c77048e94b6dd3cb71c9828b73b7014bcb4715a79be87b3fd3540467f46ec930ae722b01c4ac17bb9307f76d315e5c659dbe51193bc82984cb5d84dbdeec1a0a524116bd7a1c29a987ca2edb52668542e82492ca5db655f3058ba483ead36d43f02799fac37a13875d4ce4390838111c85f4c958c0b0dc624baf1e35ac2711fa81ccbf55c84fc2354364f68b905c38e0a9af3ed561530bf0325a6554584f1d07e708f1cbfec75b5715a0366c5269afdec2d2502b9d4c1f3423918bfc33c4a2cfb15177bf86714e47ec48580c81ce96a359ccdff0b5a7dcc4e769ecdbbb2632bdfc0abdc9bed73a2638abd6c197cb4af447ba8d0027a473ac1f27704fe90a922881e15eb225741c767fc641e0db48b9cedbc05fbba051e905d5f9e97ec17387c9bb862c683f3fa6110a42b7248117d3f1a5f2e5b7065a0550d44641e39942224e00824d15884ab227905048ce17583199a146c4a5e7982f4425f74ca0d44cac925d1b9fa1a86c8b7ef212a3cd475cb102c96abc63ef8afb3ec0212b32325a156b890dcc5679499a83093f2f125fdd5cd3e699a1d800069f9cda135015a8c6e49099de01049db473a27808aab5620155afc6253b1bdb33479ae7001fbe9bd1c575e7e53f7d25b35429f5327bd589ec6ad4c8697139e8a30a4d9b2c67ea89c19c592cfbba5d24305ec52567b4e64ec553672c521a72bf5979c37c2a1b4c165cec225efd2efa5f7d6ec0ea4410706829b654a1beb13bd5fea8e8e688d80584d3021d451d8386353b60428173efcd3d8091b01d0bdb6d562b0b857a86b413e4448c6cdc2583e997b3a48e0b429f0017f98fa3f43c0446e41e2e022db2a7e8692f74812909df6e0dd969aef8358ece9c94df29a2283ce554886c0ca73bc7e913bc862203ea501af105c9ae69fab8950bf4c9919a6af95f8fa50c3d7cd2265b8cb3421cd5138554b7b8000915e51c6de97a345c252c6e69a728520ceb520a2068c591ea1799ad9a81457f541abbaa081882e2b716e7fcf031a2b11462841a01d187232d25ff3b575993025cdacd289c6a107fd5cf9a6c258768e15a170cebd5aed2510d9dd09816a6fcfcbba3291a75c2be106bcbda2d01a7d4bbe1f6096312b6ef8be4ca8383a3c2a8a78671a738e956500000000000000000000000000e62523afa1d5a05b642c4729ced5c9a2e525971372b4773d29cf59c888efcf9bde606b72785a59b164ffe15bda0e89d6538756e2fd827e1d19f00287c77ac36878a0a0fc71ddc347ac9e7daf60ad142286496ac59519ee6e5d3db4ee9e7adb3f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a69d9106ff8df01625c589edb6703bdb003dabbcd7398c12c89bda743b1f2e2954f03227ab14ad8062dd42ecd22651ba5c6b8ba0e11e9df877295d9e238ac247c9bc5e3ad202af1994acda2d290613ab599b66c77e77fc66341b00cd00305b30efcbc10c9603499eafd3edfd318108b6117b1d7cda29593cacc71ed1d79792840203c0ad7ae4844edfa4688db4f2fafc4f76becd106088b9b2f5e17e53d0b97d17031f8bc23be3f4e0e7d36a6d1f4c7e784b6ca0325db75fbcb19c689ff9289abb2a0a016e7cbc639e21cff376a5db9aaad5c9215e761be25610cc586cf1801ae52118b9622e2030ca702706cf6ea2b35511e7163d5a0d67b63e41bbc50cab6e672b38031debfe1d40e9dabc2597e12e9d6040dcb4e91ff8066964a7620e00312164a7e50222f42a340839c8ea5f8ff8907bce068f2a6d73dfc4ce8bd91d7a1ee18b73043b031efd8b34794d91a7f31a8ebe896e895ba22d0fc4092fe5c2fe31e29c729ef915021762fdf5b84d2b9226a5f35d912f00ba12b3025a09bad85778d50eb1b0f34edb030ea1e3d36e995b1f5711864b6bfc6dfdacbeb762e1a183fe30c3ea90d63fd81cf578ddc6de4b67a300030b17a51940e3a80c8fdc05b36f57b1ec8d31e6b2db63b02e88ce90989fa98c5aa61bc7703c2a8a5b030ef9d4b268a2c3edefd4166012ebef7372ebdb6e262c3dcc27b806b844ec1176211f9237623d0168522a9fe14b23b2b3114835dcbdbf1f325f531b8e1b2dd50d18609bc603967fe5cb63aa7e750e29fb3c24e121e453d54a2da7c5664a1324267248564d41dfb444d7218a5b2f649eed2c9a250fc55b4bac89b7e4cbc1aaa41616866ed34e778c2805082a802eaa204ec720fab5945104b4293bc226f4283696b994b9f34bcd5aa22167f9be17061801581b40f269019d8df2836342ee6a9f628402e1341dc49b0333f91bcefead29df2da11eda4b19ffb805a789a22a8cb251271ef1da91a4c4da2d1787a31c58ab39befd2c10390a0070f224fb4d9c5a3a549cc93555b728e1bb4c9d7df510fbe16015d1c645a84fd1b3ecaa00a50e5085160afa222285ab78a129b7cae93566a20dc53f335b1f9b2bb446825d1e5c965eff64dc1553246e338f10af4fc950de186288583c7036b52bea84e8add77ed125a9b8e6a10d605ee6424d918580045e1339d2b5edaab455039c71d6b28104b39e2712349321098db4f5a0c6fe2da15362c54643b62ff1d2f759ad3b32fe1b05f6ec06e25b3c31b72c844d97cd3199187ea6c60ee3b0e9978a07387f400f96902e904fce6d032996238b1eafb0f7f16ccd02dbc1d817882499fe15ab259326617d10ecbaa2c3e019bd291ced24d3a1f25e791fdc9c3be0e0ce11bb22026d7a6a445c0f09051fb0fe74e30fb9f8639b96c9cc83f417f4777966a100d105e4cc25c26f660ea01ded0ddf64447f9b186d27699a6f38345761af9f8bf2a280314f5345d37b3ed47317eb9f6a82f4a60b5705bc1bbca996550e2fb7cf79e7f682484bf700cd67653eacc31ca8c228f4b4a030452e0244e68abf63f86e00d7985ff64466828259f61b0d3b6f17bbd7b7fb3c76335a8b668a878159ed191725b24e453918ff50b0135ecd0a25908adc6933dccb5952273af9f11de45b73f531e0ee48121ebacb1d177fcbaa8bed24a02b1532a0891b6d9cd9c71de1f64e12735f1bda0d5d5fe0ae0ce975a34d423853f44b3334216448e21b152740d121e266409703513538fa2e6815ee181f081e2c2c352efffe0304f8988e3b09e520815c3096d82357355f75e8049b045af775b8cd861c97149cb77515c399898af604915d956f4dc75a0201b8ca82c524af96e9ed7f0cc16f1b8696b942a47b65b6dba179ff6cb3d005cf97935253b0b470b99f4b81be2a3aafbfc05f49f0bcd45ccb5790ba7629e38656754a08bb889b4ab776be7898377b7093679eb1232e2c9c7c7b571ade3168bb7b62f66443d57928a95b663162c59fdaff640d6c4148a6e3dfa3a4acf00471a96e5bf1e040ac0882bc421d3b89e0b4d35c9cf6b976edfdb3f6972ded99d244302c353e5be9cee4eda28eb6a72c2ce0e76cc3830f8c4472c90828c1e21f074d509ee0a489e506d02ded7cf9e624694b92f9f7f38c454dcd4f8b9c4611c366484c47cbe5fef4e9a081f7c5f4fce3f1cb1096302a3176e24d83a0f3ba7ca24ab9f4a92bdcbf1f879f0a90050cf428539f335568372cf5f05b3fe0cf6c64405c7cdaddc164ac88334d0d06452aa12db40fe5c3bf4d8766c0ba6d5eea7bfa2cdcd7b06ea4040000000000000000000000006039a663b33a35d82160657cc7043853ded2246768010cbe16cb6a1aada224429c76d23483cb886edb9145923d233c3bce2d70a2271dbcef322afe8b308986934870fa34af4314eab0941a56ffc2e464c861262eadec7e40eab4088bb720b6b20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023a1ff69369140c2774acfa2f89e60879530235190ffab1d40bd5a4c10e1447b132a913c51825ca19bac8e6d7593233526f9f6d19f483d6be51676bbde6a60d6e99e9c7f5f13016dc6b898f27ae59597c39b1dfed83dd4bb233c389b8ff199a51c2b7e8b7f7015ca44ba1e0d3c2e1fb1d1cec7acda1dbe58f119ece7846f8ba1030d024cf524b0f9f2b6cbcfcd170bf4887f35e6a04d974f0f740d244ea7ebf9ee030a7a354d66c79e3393785e80b27229dc4812ef53aa868f8dad06939a8d5cacb70b08b98918a2df99127e7512d2f6089e4959ef3e8d268cb02b060d9de2c077907576d3849cd6860a091dbfc2604e7ba456873df0f2e44c2e81f0c031f4031e982a021073a86b535ec99f1a9e3ef8b3783e7bb4bf7de54ce7b7884f9069868f5f49ba02071f409ef3613754dee1a57cbb88d9c5b702d26953d576f12bf037cf3ddb5422022b8d2c75504119bb192fadc615d99ec338c75feb267c4016ec1461dff3f9a626020a7a022ec7661881145e08c978fc8ddca8685186642e05a9412dff2c4058fe25031ad421b62a3b4c5a880bfa2e11be63779b310c7329d09d05401c0107064269d6ecb748caa3e0f1190889efe84d45bade136356bd4ec5cdc4ed6b1dde24a4b57f45bd634f17cde6278e0ae2ac1da927cc66b01d4e17e90dd8019b913816cf7f2b9a25cda54e0e1391e4b6a73feac22bc489ec05857b4085c68aaf491c0d0b41d6dd2d6c8711f471654d235c5c310999254e539a7e6314e9b1a860180f8e9a3a05d49bd93c21f0ab2095717950ac6689ec88d85d2e38cbaf7930f79011ead6b60bfe53d3e770ef469a14699006bb8e619c4585776d7b721147a207490c2d0641f125bcaadd2be4efaa9e7b7075e0dcc45f543c9c3bbe9da887a0b3ecc301006b6277f8e3a7ce0e1ccae01761263c73a77f3003b9ee79346df857992ccd726ff85f57a0f78ccebf1dd9aa1a2e6691f0c313ba02c04d93c761e3a06829c443eca528ac1feec0792ac20fc33ee37e554fd70aa0ea6964088f9dd5c6f54908fd11fff32f6792e7fe9d9df7c12732c0895472988947174ea7f41c03222aed8329072041bf3aa914b6f5b5e6b31bcdfeeabba13d5e7b1d41461f6a060361cf9b3e21ee0c2395fd650d6c5fc521703585e950fcb0dfa01f6695df811d27d0a4fd4b80553b484787ff7466f181da4de59db2725646a5e390a5541dc5c67098d411c57a9a360b62c62fb3869720f056e358378a257d4e5ad2149037597923f6029d526e9bbfebb076421d57caaf7a5f7b5f66575cc54a2131a0d9f960a67aeb499aa16e962db642e229fa45f77709311d7aaa9ccaa68bbc84ba91d3d9c65e01c40f4da38c2dd6a78fd53d7e30789d03364fb30629441edf3ccb84c86ab93367b630314480d9b8165f947221fb9d9f19e5d4c2cb555ad5f15311a8b3bfc815ffda64b1a1b6a0bbcefa626a8ecbb56d15007df67ea6cb0064282535e2f672f234b9bace4ed3828d50de28adec1e3ea8c3a0a22b4a6dc5b23be62d86bed940313f411621401fb380d5730386b1374f21f7608692034c485c014bf7440a1209f2456d6f022e7257540ec5f1032e8c9e23a2df799ed9c86404e1315c60977b9cee225fc0f0c6dba2c89ac4575c3ef2661a4a4acbee5bba29b35ad679a664e02899bbd2909e532d13d0b64a834cc240c9a71713e9ec863a015a0d4c287129fcfee887ec55b093f9a79b44f558291659d03b1fe07f95b7b80a28540529310f7424629ca60263238004d7bee1eacb3cbee8e175a2f1178e413cad70a5e0edd3260b3144142d8c1f9e6e6ca55e12a53ab3d3065d0360bc162cf04dee67f2d6c414c33ddaab058ab200b5a72a6a195c7c9d3289bbd48ba7090ed2402a80715fd4362f41bd8446b606700ead4e857c3af7e21ce267d38f5e6c2635ac4a7c31a73261c725e6f4a62b72fcebc3f5922cfb2b04bbf91334d23ed2d0eac40b9fc16bc7ed40e5b6138dc7f9f88130e225b34073175b085f316d5fafc1c58d379e2a5c25c9631557a9eac6574e013b19e6579d59edadc25c9581bb02f6676b41a339fdcb3f8fde2fe68d9f15e0b0bf02f0f4ca511362c19222d2e02ad81fc6004b7705de50bc472932d25ed93859024fd633b0eb1aefb0b9aec2ef7f1495fd9c3935795447328377322c658ed49abd3adc2fde4de86996c46b217f6557729394750e1fa2b206ae4ad0ef5a623ba150ebd5d98c2f213b56eff3cc8f92f72fdd6097c62658235549fc19510e627bf6e2af4ae904d8d00d38dab2e87012b8ccc9cc5c97b143132475ab68f9049b0133349227abcfbf46bbb0bac34ec31c05c9ad16f85c08e05f773368bba3816c3fc222ef36e9b4b888379d801d6b01e0b53763c5747a43279e06c3f5f0fd08ada761b5e3a6d0d637bf8c875f5c6699e8f5c8d40e", "53", 0, 1937199825, "28d677486b586b5424dd9a9d74e67555b68e1e261912ba10ca3853342cf8ef0c"], - ["928c2d05012f207996e4098c81e933f7931a7c22b376fae9b78b44111a338f6b170925253f0000000001657c78e06c03dab19f0100000000016366a739010000000006515363ac0065e1739e040000000005006a6565000000000000", "63ac", 0, -70492488, "c10085e5c79b5ec51b01cf66f3e7cb4f5d34d70781603bef15ab35474a4c92c5"], - ["df03c22a02882e5aa2bea31a7dc42f044771b195f7798dbc6d476e1bbaf8d6b9c787c050bd0100000004636a5252a7d6d8aa5a62fda62cf499a89189555c9a58c84cb5053d50148ea71ce4056cac6fd01c6200000000025200956cc5e801d92fff03000000000363ac0000000000020000000000000000e286910300000000ab44d7fbb6b24c2bc3274a0cdd2732aaac383ba4ef8238cd8af15477b07f0da93de1e6a95d2bff6cdd03f6cf44b23be25f394b5960d7a17784c27a3c2a7fb8840f3a39042de9f4057cf749f209c365f4c2c3ade1a77781fcf3eada80ee3e0228000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a013fc969917a933ff6f61fe399208d0705fda5cb171e2596bc43a680c614dee8c1c44a8509b8b6ca6c9b70a3a1e95dfbca959e74122549b63d8ab2e0ded85c912d777c7b44f8d4c1754bb4d13d4b2684d6a9696f19b1641cad574b5ddbe93f87148723749235e251fcc874a24a64df7d33ae3d26290518bbbbd2f9b7d197a40210cc0e76e5381c8b3192dc62d13551da62b109e293477075ef5d80d1c64f63930316522785485381bd441997744735c6475cea7731c46aebaf0132d44f159d9cef0b079419bc2e34a7915c6be22fab18ea742f19f2043dbb334c10ef055a4170cde45d1e296153cfa59a94c9703bffb3d38275418e2b5576062b64e3e9bc55fe7eba03143167731fdc0786097ee62f30998c9149d626bfc2dd366be054af83483e99cd0311817892bb609d8bafd71e5a95c3dcf83d566660efd9d26749ab4be789c74e44032ace8748d96f16ef6c4fa1dc53dc4771cdbd524a48f6daf6a4b636373aecec84020ee976027f9f788b0f7b2f77dd3de114b24ecaf561475a0f2fe764e41efe4f030322f7dde492dd9d88ca7c398d0ce6e737a398e3974358c9a2c17358db481af51462e5263e225c7dc4d3ca831771eb3d3102fefc8dd5227f0c2c42ab0e2a87467eb37490cff17a43ea858b631b3a75a6feb7382947f82e8a02176fad5c8b0e091fc38bdffc879f8467ca4d0311d7eff57816fbe66810fe77aafe5cef992d5ecdeabd195ed1731b5ca5d0dd321ec488fd6f43be44e91fab00557834934f4b9a06d5c86bb62a7bc757927f1c853e80c5f22e5570c0d69201e9fd2c9bdf9581151f28a135a05117f79f85df4f261d50b6142b9c9c0ba5537c4694a4bc24e321f674948b24a441afa9f97a2ea6e76e62e1e34f63f3bd18af41df6e25123417b95ce05db903f78ba0775e1fd6d3ec5826a6ae72f9b9806855df8ad72cfff8f590269b13c5e7a614f524031cfd8466adbaad05b323339dd3040382b1d19ac7b7b90c7b9214077d367ef65b5f5034f6908e30174dad987f8df7e56d5cdd4f2683708d648123dcdead41f6f51c4b83a7ec67c90d5260926d6617be39f95e0ebd6be86b9ffc1833137aa95102a4bc04ee4275cc3a3a4786f14e9f481844b78c955f524a2b6a1ceb6de6161be4b717abfad35c79f0611e4a2ed9f1342c3c78951f2d28339f352f5ce1480cea05b87b6b8f28d5d4bf08e3701836c3939a7aff005979d86051fc859897d6aa8437c275d6ef2d0bc43a1932e600b557e95880982d733d64e2e279b24f25f755e926b093500451df61a6761e0f6d9b4deb6b0f678d21cbd47d57e08cd850d076ade5eea6e7f4e94bd08cbf5fa1e5b598ec3e1c8719826323d481173bdab18b35d3b6ddf5f58fee673e11f84d6b0eb0ec5661183b7a0c32967a9b31663dbfc703757acc562f5137936a6c360196151f1c64e066ce2c44c92c883eec7dcded8a1e01e88311d26a17e2d277032f963f7091ddcb1c1e7d6a508c6f551fd19194ec06c8f273a55ad9852fc751b8aedcb0fd1a1c7bd85f3455bad0bd71e84e9bf1fa78a9f1ef528c1ac80c8460ebefb6c37bec76e4d6cef6a7808b33b719bee8fb2d8559928cdb32a2adb928b62e7b1d7d206723692b5905218b2b209c245d32157fc4472a332fa0780ddc3d1acb3d33e5002876c2c25456421261529bd8d4e042d370b9b3c66b66b12d454455d826ae052fecf577c6629f563859dbe1b1a3456806d55a9d355d1257479deb088cbdd59d7730122f52d85627010af2c1aa39c3c3043e4d2a438353aa24577d6d35a1f367949cb9581bc4a35ad2813a01791638e7470b49862d5b71c966a1410c783f85c9717e08052dd05e83b6862dac5eb5cf8778860794e8b5a7e382990ce277197a39702658a14a8002e79a309a2e251073077b51ee14a5ae7c5a1507242c75a4d3ac6bc5751c6fd71aa4b66621e2ca41a007efd2fda74493fe1e766701ef210307feee20f9664f5bea9e4e73565628968b146f458067d3f5d1b0dcd264c7f550c85ffd1d4e238190ea0e3b7bfd1f2d28d5d40d41dc3f41d9c0f3ab1dc91639554b94a2f26c445ec0a80266af4bd92d05dd90415a3b017a12155ec48aac64905799da4bc2c96def4bb506c92767803e1cf2856636f741a23616ca63134711daccbb1db8296bd894321b2866f90d2cf0261db450bc9b3927d9f4592c5e722c0e1719d1ff1b21c819f48a9e326caaa83e6aa22c1a8c1665bc71a9309a48d431b3b8a7956038c9aeaa24e09b14016add06433742603082e8fd73df7dc03689f51b0ebd0a9a160000000000000000000000000085d215d3560b9f035036624b91fa7fdea5b40f5f06494f93dd46a339d2fbdd5d617d407d30c8a622ded71f0d48f9648b88bdcd69f7b3d866045ebf2a9324a56f4d1172d7f1be4de0f995a9b56623dbab8e62fcc4767dd27f38f68f579c07833b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000224a6afee41028951a9c216685a27f6ade9918edd171944606250142a6479ba48f4db2f577a2ecd67a79243ed151e7e723fb87c7cf174df4cbca30f2a18be05de91af2caab34f7c49485716356d85409377c78b000e43addc1282e8ea7c7ab29e2e47b6f437df0848ddf9c566e2dac2646407ea14ed172050316d7ed129452360229ddef4af965b47850904f49f3afe8bf43334e600d3bc31abc04671acfdc445c022e2e60aef30d8d1ae95dc2025ad7179a6f6fd98c9e7569e1ac4e225188c1331c0a08c5867987dc4f795b3194db65b6be390257269b175a04dc8a1453a755f7dd2cab12f99214849ad59ce93187ddaf7ac954edd4cef84548d1007a8fc09aeb4b2a0302cb07de62c3da046654d819e6d5a300bab09677212dac40b9f3df90546df23d022d24c87d02b38a8435f62a092d9fe0fbf956cd9978bcb7855ada2972cdb015720216b979787b7ee056f9b86c69d496c8d1c4b4641cb044fbcbbea024370d45dcb00210769cbc814f46ff65f6689f295576fd86766477d11726341c0a5a9eef34e0030213006633cf7be78750080bdf17b9f215cc1821ed0ec1c848ac75b7eb570d0ee4f82416d9fa406c24c0b73c89b5dc8f334e58af6bc8f5f38c0fdb6fc329df8f1a8239b06faac8b6d4389729042aade87b44846726f21f9443786ddd01f7ef7b51b4a23ed7b1802e24d14e4c5bc50b258734a46d685c7b6864b011c2babdf7b88a91e9121488b62adeca8db6f234c7eef819c88194487e7d98010fc18ac93dc8e6172a18c894b1dc3b81b01226160f2f4eacdc03e69b26d2b5a2c9e8546e5c8d1d440abe56d06fc7d291ae9d7edaaf4c2e3df72a440ffe837062d91e6badbe36aba0487b24596aba000eec127985946f54603a9fb0b6b56ac7276bdad4230d97cee480ee3476701f42c82eed15d390ac4b121632e54ad9b62724d8d3803a3917fee9cec9d6f8031dde399fda1a2b429b145250179be20f538d6977a4df2cd11288b7954b73f8bbea798afac994a4fcd1ca3e0a26ad5893c643446d007d5f053cdc69ddd4b2ee5597eb6b9bffb457080902ade42128faaab13dfe334f2b6fc3c2020d2251615c8e07cad95653a02150c38be7f5ba7df273cf0d9169f6cbaf1d725e3c619247d19057ffd3f5aa87a57aa625f766db94232450140b0e94b6b194b0b27f27a333daa897d86bdc9539bfd34ee9a03cfba1667be4f9e4a264f6b68a4f04885620b4dd40927cdb7a2b5ce4fd2c2f547084771b1493c5b0d60840e0304e00b269c03e6ec03cf3defe0824ac11ff6cf9899f0a89c1f65cb7d4b5d16088935979bce9bebfd977310487eeb1156ac3d2765ffa1aca2421a473eba85958898f77ffc6b3d363616d7bce0e7196cdea6bb3827a9ae8d6ff8ad578abaa8dbdd53ab286faf949389815c70cb195c17eda0d126ee7c617893292df09db266314b4d08f8683b7d3e9a5a30ab85fa135cc7dbec1c79064c3d51880c226ead2d1473c81dda3db495718f25cfab44dd3e11c83770d97b49c76dcb338cd382222c1b513b0a649eed10314cec73c903d70767f18f593f0f5ad907ca4de19878b69de28f50c62e1932930f32160cabb655f17850265c2c61628d7eaf7829ff5034f7b29ce61245c2d26017a449feebce1644b6c8890ae2f3db808b8ebce8cedd70175d119395e1b978c24e56630aee23337b000b5c8ddfcca93f9b726829c0df46807568401aaa55244418478c5733457772b57f2d460decc4a6c373ac08b940a3d972ea82cf88a09faeba349529e207b2ce29a3f482688850dd059f1ab1c38e820d3199141d583861b1f68b2baf022d1f7fa3631f2602d119f59de38622559b09df90c4cd76b1c782a7a45fad55941c0d9465d3577af27d8592941335dc453cb2664d60c000f590c7c1e1cef3747a05591654c48186aadf4d26548b5dbdd9f71c6659a9631bdd110cca991025c4ac614ad51959159041d6f96cba5db840c63e408fb18446265b14ea83b6b61d053e9368f88ade29e87d98e0f249627391cae47b6cd86a20e677687e70402bacfd2a634598b4c00d64976c80c85839eaddf48a6f07fb17331db846b8fd8ddf6ce703a276c4fd23804cfe4d9b393ea328c98592a6c95b8b1f1bd9bea41c6e0564964fc42ad227b1069c2c4234f3f2dc5469fe5d2127e2b62f113fd8db698f4d5ba1cfc69ea45f1d2db9e4644612832234d3c298d51a920040d77bb0993438fe0085456360e78b633bc716cb486ead6ae05b5f13c684c9a2755f1f3b421e482c8e9d4a5cc42a661fce7bca03931c7c3fbb7761c66e0f5365c273019470ea24da1b4025f09c746a826b767de542f420d3117a33ba2304e233a9dac9e1a962e1b304a6a10b131afadf153a356a01ec578cf745e39a2616f7f0934fa7e775a624342c8050498546110d8b1d9d40c", "00ac51536552", 0, 389849693, "afd5d9e14175882c1ee9f4269027aae3cce361626c58395ed08e4391045f7587"], - ["a1c4cf3d02c0fc0239942682a6344b3bfcf9cf9ba0bee688d79019bc7200838ee14cff9a600000000006536a526a6a5356634aeaa1ffd1ab50a3a5e73fbb35ce4e5c102b59b44316d796c5e270a75a0f4b2b398d01000000085351656a6363ac511f5b7db8010f57c70500000000026a510000000000", "635363", 0, -113093599, "016f0b77bd440cc53571f2bf1e8f118c81b7f882c3983e6eca1313511506cbe8"], - ["e313a84301ff9f4ffd6499da379245b1dd210d88dde114c91cfbcecd712d9f06bb352e50f80300000009ac6365635151ac6552ffffffff029f975f03000000000263537b8415040000000004ac636a65000000000100000000000000004d5df305000000005c762083cbf956b86e300125e334da124404f28eb83d3c12cac9c8dd962029388b0ef203f75db5b7e53be27156891ec012d9c220fa9b536b45c9eff837150acebe703eeeb964f275cb03d49ee7add22e9284b70f218fc9d3a5bf301cf049994800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f3a025705c523b951192da531ac4309d5f0a02db1bfc843fd8bbd7f98acb1a2727215bfb4a8cb93799439c54f4566751b06a45129e51b728b07e00463795e3cae43af198ce10fe08af340a0be6f8b878cc1feb1dd364e5dc158ff70e2b2fd7f2a93338a25c9a4689efd7fc304212e206463667d2a23a66bc947a313aa05b27330329c53e1bee32628ed009a7f650f525dc1f67bf369edac400ee020203a3b58768021feef6f880a5a430d947c6d6f8fd4b63a76e131b5ab20619b829c591bee011930a026d35b6f5bb1d7a7e1163ec3f42c599f4d0154be36877bfdfedd02541830cb090e153e55fc2a2ae797a38a27ed4c36903927a731fd87b4dfe976be0361bec43021296260bbf0e42cc1f5177279c05a579580f37ffd0758e070edc3882721642290302db826d4b9b14c8f3c3a3e5ed8abecf4147fdc217fc6ee8d98a00a1d52bf32e032c8d117ca70109d1187a71a853b1a0e0c93aacf2710993f1bb5212353e95843e0215bf26f7dc1753ff441ae128e16c579aabd2077d3e1f6bf4260fbba7802c14f8022b64ffe34fad39c1f029834d49b192d46aff64a7c9190f30ca0ed62de4d26b5c2b03776a6d866b0edc2a713624650756cd24bf6011146aff7a303534b641b6ff88794053f8a8f187fa72ac866a5cc36d8c2df3e86bf1bd15825c7c5e79ecfa183c95dbac340b2e44e76661626d514136871b62cab5660e23366797920f7b71582299fbf18e76f36ad1b0fe7c45eb7e368e1705ffd2a85adb4b8163eac9b0e309a2d1e3434c1e869f9f33a0d8cea190c3af95e2033f699269c086c76fd990e970a2e9b04d33643836d9817e2179879df0cd75c0ffd986cce67187e242d9e3a5cee81662f80f71e76dcb5f238808352a92a99eaf58674e4b99377feb6d8a606349fd57b50e69d48e8589ca22d224fa5e990325a6efa3e56dab253e4a8be3d23e5faef8e1813afd0c513f2e48ad0cfc8394c872c6d288c85a1d8b4291593bdddbdf86468c1f058cca1cbdcab284fa6d214cda97666390675ee0af9b672add9fd3140ec551b28c61ed9242af0df47b84d41c7a9cbeab837837a94d935438a55c2d99fc24e956c4e2d549e3a18e4bcb8a93b23e5a87848fbd5866f7644b36af7b1edd53216aa841c58d5e9f3dcd57ac91ce3d036c3b9daf5d14a2c02dd891399f9919a293a637977e4fd7f4cd776bac209f30d1469916ebe5e0b4d5286af4fb2a0761520c112d80c9d9e542414371c77261b2165613f6cd751518119882082cd4a2da94e6dc2003d78578156d4390362897b9515bb9a5f18b1dde3edef29eba1bb2ba207e914d29b73c8b7b662c39aa69faa932b3db7ce3c280f7cfcb6ff082e0a005f2403bcb64bb3bc7c894cf36f37342e5b7cab0773dfd6443c59b3be45fafae03ba03f22cee351a545ea6555875fc21f3b568165c926957ed70761571bbb9443aa3b7ca13106a47a3c92639606d473ee136b3686b57aa18e8917313296922d634a0b4671b07dc9aaf5527a4014a159793bcd73fefb2395d26880ec0b1f6a7169a0ed81b24c299751f86e37689d4831e22a5deef5354f52aae30928b7e40e905ec060d598f84e716a7fc1cf4a864d4fb61285b6645b8cc1d27b1ffed8ff0345d414d59193a7c6aa3f82d6846ec4f480b6c0b181514167561845466174a7cc31ccc28c7cd1ebac166cbc6fa1e6e49cacca5bb9aa79daec7c4d43933ff444ef764085c65d2a1f1837ee7c2d64bb84f1a62dca89abb88bcb683457ca2b270357a6aab6cea5cebbcc2764de0e228132026f6e09095975cf6dc23a30930fd39b1f874ef9689d5dca7bd2e324e491498f354b685332bbbc6e45d1aa63e540b69e82daf185a0ce2f28664579dfe4e6ebcdb5b645bbfab29af6cba73edc4becd9ff1a8daeb5f65ad42fae54bd84260b0acd8787fa83eb392b72216671800724b54399abdec02d85743240946e466bfd38d2fafc43350484a0823c1b1c08717c1a5ed272f0881c98c01f6ae0f7b3bb24943550fd808451d29f42657a7f23f153ec2f09252333d74c07df7b91ff0f2a75da0f922aac832d6f97f0c78f4a21caa4af8e282bcda6241c38c8c2eb4f50b60da10a91b693cb4dd33b40f16ee58d54967eba62652cf12894da5e9bed449386b12508e4335acfd20769b48a8cddf9f86201f7cecfbbc116f42a3fb22c62a8eb7cdabfb45ebefbc0f4cfeee0c13dad8fd94315174ed0b9db529f6b5f4f5ee66734d5e95175bdee81004cbc52398633f2c0b0c7259c80f4465fd92394946521681542ab5bf7ff059cadf8b0de63bdda466e63d3924c6d82200b90640f3f97f1ce9fd26c58961149758180f87b71d4299ec5f414b730b1932d44f88376f8c52c73495c07065e440dec8b93bcd4b48560d3514fb54d6fb400b38fc374c8a393b12adc2145c519945040c", "5363", 0, 501567340, "7907932af3fea21b122f96a84c8886e281f56ee548fc84efbd029f57f9107c37"], - ["030000807082c403027155546a619dd0cb20f9d58458834564084a56f7c8fd1b11a4d2cc13c5e7564202000000025200050cedebb6b6e4c58d564f7f6a01d29f5be394331dfad5ebeaf744b0204f626d48a38bfa00000000005e5bbae504a40ed50000000000003d4baf000000000004536352acbeabd302000000000153152cad0500000000026a5293185a330fdae33200", "63525365", 1, 867093779, "28ccc0d68b1542da3e1eb9de710a5d33583f9906dedfb20a647c23cb6ff57bc1"], - ["030000807082c40302f3008871dc6ef04e8db36d47e85a83123dabc430737c749bc5f820ebef36642801000000036aac533ae1fb41d413761f23aea84aff4af3b467e5f2294a57c35270a730b3c53b9c4f9e791d630000000003516565ffffffff02f0ddbf01000000000500ac6a00ace4243e050000000004ac6551aca2a159a7000000000300000000000000009d5283040000000096149aafd37acb7a42614851631f2a73f723c13e8dab10f6cc7e4dd4253b831d628cfd35e76e02a5574bbcee059d3299558062ba7dd0cc21aab608e41e400584605d5975a750ef8aa8b5c86513ebd7af864d0191870b30d893a527b3133b539d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000089d508854b8d5df1107cbd8e16a99fc2cb5cd65e0420c71692ff1b534b3ff4e091afcfa8c5be7820c049c5b48234f1af9ffa39116acc7514feba3840b996d3629916988b0b70c3e278ac0c304fc7f91389cb4b42dea30710a80828efa7974db7d450b4da71efd6038da4a03f3371b1ad02014d0b27701531770bfd38a5f18cbd022146834b6308160447dd2dbe89062257aac207cf8e075856d226530e1c7b93b9031aa6e69587d0eae6afc706fa34b890ec416edd97c772505a00af4b096937c3af0b004f33d2de74e7a1a086ccc4cc763d78ee0b04b9c2e508054fd792e268c139f43f15aa19eb1276507fad6573c082356dd9cfd1e1614063ce32b414944a48bea9021c081a40a7930be486bdfede2ceebcfa973da9639cb14582bada501c89be8c81031d03f291180bf2b99153c224e222c50175d5c27972fffa593cedca919b8d16f503227c4ef56a29e174e6cd7f73fdc0d47402178e9f0135334d5a4f29719e5678ad031798424ae3c754cbeca072f7f39dd462ae7cc2dcdcce8cf1b4386c2e80af9e2a0310cd719075fb2c6f89335b151b03f7f467a5928b076460ed1f88682ffe0709583ab8df9b5b4aa1e7a1379c50240af449b6180d594646e57f282359d53cc44b87369bb0c2ea56e800ce17b1abe02e9b1f568ea8eec6d7ca379687ff38f13ad35f88b3fa075d747d2a7305ce4db33de27e6a8317fc714ee5caff56dd87a81bf7040ce74884f92b60e6eae7c1da334b4329c49811ded635057376e9d0f3fd919e2f8e83c5839fa83a49c5c281b4fbcb8ee006a0bae66bcf5816591b475be78ebc8240a480c974d279514d132fbce2194a22c04ec7d2367b3584ad8e00217ca9da8977f99bd5ad2a594cfd64db05265f38dbd6e08b645a6783449508615312e408fe45aa52794539366796d937c1b107284d67d3b599a5e4a870b2bcf7bba47988e9f0e388b08e23383f89b7856b118be612a93cda2135251e54af9b8c6ec8c2e70fe5470f4ca8b519e5e1e109c2986de38084c401f81b7c4708b9fc7a016cea0649afe2a6bcd214e9d523a4a370470cb6baadd522fd5098dcf3f81ca880c1c18f30c28a629b96407053054206c4fb41fdc799bd37333245e2cc2d74e35c3a139bbcfb704552057499b9a767a2e0b340a78bfbd98c6c64c220a411dde3e08473f4df57f1fef874481a67ebedb0f0e1d8230a22c29780397d5def6e1196afe5d7e9703a551a75a933b718f52111409045b3748808d138d0e138f7cca41d5173f49572639a91b2bda806c89622de61a074d6fbffc259efbfaf6126abfc6ecec94dfd9c59e7993553733d7e57abf0f7c14bd25f72581c2135e4e64e93d8b1b6a682aefa96d949de32a052dd1f9cec5cec72a0bfd77e47848c7c6b502d959c3641fb9ff00e3d68aade893c81c0c40d9044186239f058a30323640da65927ad6c62d23272372966e747c4ffeddf3954f46b715770fce5dc40a37d2082fe85a2d85b8f63ab77a228fbb094859dbc2df413c832ae8ffb8e66314ee3bf020cea9a4cd807a5f49f10fb783dcc7e65031a2785593226c0b04f488e91127b42925dd84f971f530dfbb0183c00a91e4c0c915c5fccabf8dadc4f7406b22c33162b5577d6380873e45022aaa00dd2c41d4d84b30cec51c56c221e7666114c04de704f3566f32e3d5e87cd4f6da9bd65f6fbf780ab9a6892944b5d8205a2e243fd0e5847cecf3557eac348ab02315fc170af8566fbec6054c9601e89d91964acc37f99a7f5fd1ab5de009159a1eb57aeb0cb8cf5d1eec56bdf56ce9fb4757fdf8a9f58607388a643ed4225940fc6c0b6c3be39645dae67419c7c377446e454789a139b85bd565cbc48901ee1b08248fc49d2f13eeed84de757a9f182eebd4a1012fcf84900823d8a99bf7f01a67757600a55b99907f46f24334c741f31f410420578df19fe15b5536bc0bf9e70ed73d89bb72921ca7caa7ec01291db9fcab4b33acaf2f1f52f110f7c4bbfc9a1c462216c615cdfda0f4e2174e0a7cc3cabbd2567a9527ea61ae26623907f7aca8452a9b98d384d46a0997e752798a4c9fb30a74893aadc926012323ae22eac875c5cf86dd5535cc2c0aabe3420be474c619d05fd6cce51f4290347ca5722e7c8f4a0a283b407c93ce5fcd0923d5c47c4ea1a41ee22d8a79733472fa6821a0db0ceb23fcfae7eea71f3e80838f97fc0f229d267ee47e78e5faf7873a4abea08c5700a13fc9b95cb460136c0523ceea31baa3c3a7b75ec94935fc0ad4c8bfef43bb0ad8b984ae60d09975a8028c15fa367ff02000000000000000000000000a34a729ba62111a37eb14167467fd8942e807a51397cd50db323516026bffecc2ea7a14dc4bf0ed0226ef5f4a2b1870fa15e65223628cacd09efdec132e5c2eaad0a8411d6fcbaf45a11bf5323649b495037ea699f9f2c88aea590714e12dbae00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d120fbc73306d87e7ca4218cdd0b5a4a1808b98919581bc9b8098db4b78f16aa580ee7cfd12c56ed40bd2d8e9e49de4d9b7f14df07082a1a12aaab102b49d59929fd76c655518be246a2f9561625619b736e696e290643bfe26342a87da309e6ad957653066757f1f2bf1d941a2a97bfeab144e33d701f0ef16563c11e9794dc032f8bd1a85fab8e55eb31cdc4cd32131a656d9c6102438c42aa6485496953dc620226599407f46e4074b3981917e08eb4dd257b2f137ad4f001ff034cf1b57413560b0869eb2c56d23ac6de1995131ed50639548125e726c785f337756ff82519e5c0aadbbea417b29cf7860dd845b8ea79214b3f4ecfc0aefd35b55688ea699b4a6d022be325366e1edb9b255ec24c7eee01222f17a1942349c9f11df45991365f34ab02114168f798ee3d7cc2529a8d6da9fa0e890c8e5449f6ec0c35312c488143cbfc0208e68735c1eab66c2d929dd12db61c914e604e59cd60ace914bbafa8b78105320326ab431904f47034291096f952e38249f89f616a6376435b22d1a4999a73073c021f779593f9955af7b094c4e465e11d8e203b72673c861269e19b197c5e6734906a37fb0561f74c0926c7d64b745d89e865810e834e624a7159663653f75f8519d2a662c8b7a755a34883cd19a460c775dbfa1ca744123dd61094b213d66491918d884ea8d9c50232c94d47749f509ea1af82ee770888c10f6c61fe3bb215a8c26c5a94b711ccfab46b95878b4a1e118d6e13c0f81180f82f346b363255b195848d624aea926437ba2cb9dad2e98e64f926843536096285bc7ae87ac4a6662950047f32f5da1f1159a50c4def22328c3d4d4f54ccee6537b0a7e2c88f8d97caa1d03c1e89ea50bd531c3c73a925e52eb3483fa7fa77fd0cee2699a271ca08a65d04912c42bd7ce74409d175df5bca3282aa19ad0516accfbadb668c215aff66de7a1f35e70ab032e4b871590d15b2ca2bc843830cc275c1719f21d23be284fdaf4425b0c9ff1885e7a9b85555886a9974f7a73fd69ebf2df9b8c1c2e898fd436f667f712023b2f2921aeb748dd5fdc73e07f206a336d7e22802f3b479dbf5c1162e0f999c7dd4c5b964c9d42d1d05a9004e59bc16f464eaa864bc17c0e45add87419e1b08abeec8e0f6659b670b34c1129355cdace42f19081707488fdd5c598caa1465eb45f1e4be85c0427b3f624430d529fb727faeafddeaaf98b383d1e362e9fe22b29152efddee989ed951c5d5d9a4f74052ecd0642d8d327c810c73d7e722134606d7bb515d906184a3cc446a74f409a1566d88d12af2efabde6dfbf65c8bc19fb8c4af00f0cbd617eb7fe8b6e3e3620dfb66005f0f5a9f63d324da4525401602f95cae626ab8d65c3deba2609c3b003752c3cd51bd38e76a9d39beb463b4f3a8a101b59e36f5a947a3ae161256ac56b0a578761f84e2590a1d3a6866163de1c92b3dc127384f5a384bbe40c7d885b4dd1a251faa24d0b8f56706c844871213fa600bfa0dd683c7f1a3d54f52cd9980fbc4c3a5c7d94d56a7d0bb3caa13121a6134591d6fd17c4c94404a269366d3826829a8500595e801016d8dc691d60c3e9a8374c8181d2c85be36650a3fafea568f204c5369ea67403fa125de75eae8823376a42e553334a0adf64f6dfe449971ae19cd34fa24663bcb723ccfdefeb7953f807c5ae1de887b372127641e98157376f70573db0e8c6fd468016b1a7be87588b032b6185033d40f65966f9dacaca519518e6288ff281efdbf25b33157c259ae6a4f64d846d60c24f3c0bdfc2e9f2704b919d834c20c4a985a3d1d8109cb35b981ee9b68b8e601b64c50aace7d44aa8abaf547b2fe25e9852e82b96cec1b74a53659960fbd62d401ae7ee86a70c48e3f23dce9698706524ca384a110ba2f10d4e38d70108c47e0057b1b1c58fe426626e8aff103b75a28cdce1b2d7325ff95bf9e3799d345cce7f4f303806853e221c0145a78e25e124e1c90c4759b1f3e5932e9fa1d3140aa483952f50e4a4d8f0a5c536b40c9cb904815fb7ef128c5694a9f68c5c49093eccadf8dc3d46fc7c9104e876004dee8510fe5865e41a16503de70936244b98123b569b869ec34713746fb542dfc174a687703a3a7773a27c520479e69af70effd8db80c6f4b3e07b80deed62a7ac78e7204c9d92544bdfeb5fbc14b08376db5a0c37928f5a599c24cfbebe80d98a2b6c7d9ec530b1dd4509423ff565725c7bcfbe5fc970b0bad970f7c99eeac8f51ce11a44d07d880882bfc11f1e88e2781de76bc3dd5f85932aafb9500000000000000004055790500000000da9894cfa58c16d2c3e64aa04255a7322313f9b327c3d35a0f34c17d83f026554d57ac9d4d4c32844f75f6b1959096bb17c415511dd0badc7d2f5500dd550ada9f52be0d29700e2f36563687174d1305d2356881356815a09fbf8f4e817bc6b900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8fc55dc124510e019a66597ff756ad57aff9d5b96057ca85738e553e1a125a1cd82d8d620eaace98a11e8d2960ec13df57ef8b85ce5d76231b66066fc7878718ab37efa59cdd2066bdfb0dc1664c4dbca03f7c5c8d90311094ed8d66a20eaf68c91071356140c3c522f390ebf9ab7c76187c2d44172eaa1058da111e524678b021a300e90c59bc87c1cd72850c98206447ab4a8ac61c0cc8e32cf3261e4b8aa310215c5da8ae2abdb2a569f5084babd52c34c359951a2a2a4add01c85bbf0ce60e50a084173827559ae8be1d9287014567da14b50a174a1a58a5de5e43be0bf6cddeb3c306a1cadca914ea2c7b6dc8ce1e66910cfbffddad74f9788dcbcd84026024e022a9490215808b53472108590e9f387fbe93ab474b7071634cfa3c8ecf4f60c1602227d6cf52b3d88368e97795803766a1affe1d6590a5db004c10d93318c691b240312111669417a1d94f1ef2838782c2c1a0d1eeac3dea2e7f0560b5f486de5b9cd0317c6786d0a6cb0c6d68b49e6ac521e52ed9ce59ea41606899eebfc32b6744ff60224876cc3c99f41c06d7b1e87590707572cfcc0a5da7a0bdf5495ce715a915572d38747f9e71d1194d2f8446b7e04b2853033dd2a3310c3bbb9c21fdb87bf7e02222f1e64bd1e4bb0444625a03023e134195fbc1686f6a774f250696cc3773c2fcbe033119c4ee22e365ba4df3693acce1e1c9f0961d2f6ac544b118e985a03cc1420b275109b54d1bf9d28b5db56da7a7f7385b6dee015ab013c2d6ddd3ab5786b323510a2f214bfbd92bf2e30bc05ad16b11b0c01760749da649f9fd1a3377adaafd5ce185e57a7587389a6ba7e1add6efb3ff2a24dba6acff296da1459eb630bf29bf76fa92b1cff5f48c6f17aaf86f9ced099c33e57364caf0f41b7bfa64762d4911346d8da0fafcf35c5aa1b4a36b825a87650c22cacc19b81e8d5a93d29a7378609721d9e60e4ab5205b5352333951e32c285f8599b7bba969877f2c644b0c8e85764e18c65a0b10165bc5ec3c56578cdd4f60ae89dae86670434d6fce81246d8d44d71ee3ec4eb015379df42fb5a84ff2f420033d1d0f4385ed662f9a116c62737cc699db7375eeeab176e990af1395ffc3b21b88780a59adace5f8b9043e4c1cb55b1eeeba04b7ab1fc886cd74c56ef8c99650812ed6bfdddf176fd9329da5167b05f70c9974e1827639dbb73d43726a7af62faac79ffa8cf21e3cb1b6512db289766939fff8e4fa2f70af5a6b76272811b5830bc429786e7feb2fba526a93d72f86962733a77e6ebd94af45f5b91e65dd44acb0bfb875354882676a0dd7014ed1f230f9fe737cbdca69b4bc372c09865417502442fe359ca2ac3e45c1a0ea5550e42e2b840f2045e76894b8d2feb053557e0c5503198773ada9e8e195eab2895fd42cfb104a4a02204f8727aa38813b32a58b5e057494122417921a6b34ca1bfc5292186d25d2d80016b526b68a6a323105fa7afd393b365fa55835c553fcc60778fd6401b92d326be2c16b5bee5cca7b64f7abef6290281291d93df1517bfe3c0755302aed8813f793b3badacc89eefd241ad59edfcd87c7188ad29d6d4da43a083f85cb9b3eaf2d0537122225a537225d67690c6c02f0a8b25fd3f33eed770ace35783091497df623c645f24515bca8a499027db977cfd92e32c7f24f79d08c3d9b5a766b53d4a60f07d9fca5efa092c695fdefa8d8d9387bc70fe6500710ffee745b35a1dd065a950b84c132998cac865043a3667b818a2446952a3b62ee35fc16f17a711a6ed487f306cbda888b36a272e5277ce98373d6f5c659dc0594366276bf4443bf4993447007991a47982dbca84fe24e7976076042e6741ccc118c0a34032e4c8d850f1ae1ea3a9ce6f5f66f9236984ff335f016a9fb6fdc634dc87881feabe4da3a63272ea89452c73b6887ef1340a9a93c6fa5f91458613d09524175214495651b027be6b04bfe6ec6437cc94383d07665b3faa87cddbff43625822af13cc7637ca2c00b985d66469c60e2680c9844fec0daa86aa078773203b2dd2f74d8eaa69971a26d0792f48db1ea2e15e08730d131721e43cca64688c55c242fc5c8f2d2e0bf7868f5b723db873972e1a805d990677b5fca1f973f352ab4695757ff59cbd7564e6d4be80750ccb21ca8842fe594b6e5e459a82e93a7d266a18efc12746193555736396ad9f159ba6cd130e88d8b32593c2456771bd15738711ebe384d6adee0338b615e9a79e527746d05e24cda525a8a63775534ab3ec8c46091067b1539711172d413a0642e22223d2350229cf5d96e41ad4f4e161ecb8e6474a271c555690e028baae181dc275f3303fdcc1c7120084f35af322644f56cd8e0818d11254384562c742b35cb6abe2dd9e98b2862f56d6f63e6df49fde3b68c95f3cd69eac6f68930a9f03", "52ac51006a00", 0, -24310796, "1aa1ef591aa6da973e5b1a0dfb0aa23af7c136e4d4d4adff1762c2837c7532f1"], - ["42689b7f025ee6f8fdee363085d7d2afa91ae36729c9750be316729624a98da3127b8ea22700000000096a5263005163526a52899872ed2164574708467e9256c1b4cd898c49c3f5755cb44a7ea53cf59647bf778453c7020000000753006a51655263c29a70310409b0d205000000000753535251526a6596ee7b010000000008636565630000516aa3d9c90100000000066aac6a5251657acb7800000000000252510000000002868fac03000000000000000000000000316f76ba7e69eaff00327c565312f8fe5507a505af022fe0b4eabf122924072b6d04fb98269107252879a38ad62982026908c4a9ac2f7b4b4c52c5dae1b056610f0b866e47976d3398d05d3d7f34a315a010f373942a40dee087e6bca6aa739a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f6f0eadb02524350b42f09fbf1260be7e4c1190a4d5affa60fc69afaf21dfb1a53c94d3f7fc988ef131ee470e25c79d4da42b5c58026148f13268282be49d1f00116e5c58792bd809d5e0e4ac1f5f38b1509d290d14725d78846471c2be65151c536feeb6ee9fd548bb590c6af4ebedf4d66a9bb84059379c14a73f610069e0307ecc3a85a55b6dcec36b6c8a4ff7ea410991fc6ede4ec8a83e86044f15a9b36022a506e076fb55f44567445343e71e138183dbfe374e9e4a5b0e41f7b7e4806980a013dad6a17fc0230e562193632526444fde7bf59126253442d3cea12596f6c7308f66872419ae4553404613bf6cc49fd21742b002bea852a9bce91a1177f6e0803246a0fed7411d03471e414374982da53c02d65c21695ba4953927f63ed7e0fba0222330aa03e6918fc595e567bac29f00f1f12f22be43dba7db1f0548f428b036b0212ef2abc0b343435f0ed656e9bd0dc70becd1764a1c819bc7b6e59fffce91887022af084ceb78b0bf2cdc5b8c97b66a7a494378f597d82c2c900bba8a31c16967d032741d8bc52857cfde5ddd966c5f651531db9709a87ee8e649d3e21c307bd2cb68ebf741da774fdba69a37a45a09f50c73196ac4d8030f69e2033f0e79ecef82187b6c72207defda3f814e9f434e98a513a2f19d08975551a58afdb489aceaf366baed35e742bcd03b76f4d13a2d5753d4e9886d8cb8f4dd2e358445c2c6d23a373a053dcf71ee9609e791cca486c14f1eede5aa75b169977c5160e3ae0b8d48f5854379b7b923aa6c0cf4732ac4f1f926dea4eadf4a303f32d0a6a3b973caefc6b330ed13669a65442b0b44a1a66a3849d06a5fd7962e236583fbea7000f4c2f0b3a91842af2e87997c0adfa8b4e611da8663e75319791059146a55bfc8586113f70f8a214070a2ccb69202dcd3818d7b921f0055f2d29c8ba8b0cf92383d96016f078bb2f04823264fe6a42dd27204faa542b5cbe53c742aa4b636e2c9f07c41c7c56719a96b7853fd7237e3460fcf963bbc1143154f9d29e22a6d3a2a37bd61d4ae5937ca4596173473fa1936bf2fd0ef899532a792b09569a58ffcbc427e875c9fc8d5b837467a32e3fa69e41cb029905139664702f03bfe003ebfceb16c3fbcadceb8b91c7306fc81000e93b5c0e188ac4b1ce5d111e69791804537dcde190429f46e02194a737f7c5b37d785aa2226efcaef35f1b7c7f17a58a43201e69d8830a5438124d2a90d87dbd8ef4d454c67bd08d4a168b910dc2d1ac0b97e837ad5129ccf88d9520d134dc0a09b35695f963f47eea63ad35ddce93099339c706295942661bf8554234c48dda53c32f045e52ef524f2415ca1ca85f8277e5c1d70f07819aa1875413b858c4cc8ed1f037ee0db7bab6ab0ab7d7760d85dc7a33660b50d991b3e47c8c69ec56f606df961a8c0210a34bdd0c8fc0b31f14ed6fc80871fdab52df6f7b261aefba987d0d051a9cedec7918ddcb1949426c9b83fb990a9ba3ad7c81ae0e769b4e69b7478bb80cbdf547691a27eb79e6441a1baa30795404bbefda334b0b949da2b8b51860ff17f475b20942fdc5d2997142e5784def57442df274c17d3135d520b7faf14919c888fe876e94c2aa8d1b38101b6c6b8b33e06ad7b3c0cbae8e019b2f3439ae867e8514492d7885d935f326634589293a78fa26f16a33cea37516e2e0cc6642b86962e1f648b6a43e369e0060f70a7bdb09d398dbda10499bcd976f6b383a57ac308db6110cce91ab9f2b75dce890e54c7013ba9e37eab7e8a271ebafad1e589978418311f76e45feeb2fcbca2b5b139cd2a6255a9ed5850b176d5a1dc8597949971ecc46642c73fc09e8b3eec700bf0d9845200864cd35cc3bf5e1441e3f18976e36fe19bb64e7644b803914305dc903436b27f95a461834b95f53f452166eca8302413b0d1c024b7f1a26af799ca323e7bd54e35d7a927e42837526f78e2e29f4bd71cf0ef98753405697e74bf63aa1fd40ce3abd494750912104c5dace1bc36f0fe2be5d6a1af647d46dd7ce5206bd2e5d62f76aadce49928681165f74e71c289fd9f3e108409006a98549f67ce69851960aac48457ece571e48e7412237b4b92d89c37ff2a21823580d8d008d97e1b495a3851a25492bc882d1e18d749bc30bcb418d04295150c4916ec63fdc943b8bebeb741b4dcc2e17ffe9b57709067da41c3d6d7f4a82f4ebba9259b7ec6252508d97c71edcf2c245611b6b848ef3fd5a4a959d25960b892dbfe4bbe7d9f0beb1cc46b0c44f8b225d7524a85edcad1fd3a583309f9302000000000000000000000000dce361b7ea78f98442a2c04adfda7f3ebd5ad6fba433140e3bc2504b3339bb5d7b7b8c6b395f7aaee7689bd7b8ae742ff2a83a1002553935274473ebd2eb24b50c0e2fca640f7a6c3817ede25e8fecdde691038818ab7d2d53c2c12ac875e5bd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff4bbdde3b3f7acdf9eaf19f3434093baceff1c88106a0cdcb5a5bd605a5845d57deb8d610c227699ca29efd5dbced9cbd7953c38bd69f887a87d7087fd55193902b2bd109bc248dc7d457eac61acae2fcb952fa7873dfb616123f270f5669d6ad8d065239b51c2ac263eafef17466978b3fa4613ca78fc5331582cc14f544720313bc1643ee7662ca9d4ed6a1c3c6bbd2c067674a5657d5927018b2ec6ccddc1702209c4b5bc18f22022dace225703868a32b929a350d398db45896d776f76818f80b085945eeaf08a4b6b4cbfceab90b52334607a6eb757650267e7aab0a51a37ac2e27d292f2ca56c0106c23bcbb8cbfeeff6101bfbeec4f13cd3848dcbb0dea96e02136c92d6dbd0ebf3f7f33df60e7cee5b9581700360a784e301dcdb484c99e9380212627fd2a7ab77eb53f266091384fbfe454b03b0d53909a57bc187bbeb51e32a02259e807a43d03014f568465024f4fa93313ce78889c71a6f8f47fc257f1b167e031dedcefa03907b51fafb59588be5067616ce0bb363a55019b2982c74b6ee4389030251dd4e4071915ffc393ed95ebfadef91d7098cf573c2fb745ed0eb1bf36203c1e9546f63932ea15087722d456352ac2283b92896c0585ac7b8984228bf27e10c6da31ee6739f2a36c206aaa713d125ec5e91a557369619625f9e0ca3f0911e9748b3f464221a1b05721f7d455a4834b3498b8ff75a588b15ab34de6dbb4641bc1809343016e5766fbc13678a2f51d44f896633c8be46c2c2cdfdf47fefbc87694446a0b9d242c4dc6a6d80ccef7efbeba54d824b432bee1a821cdf3da19625f9f0689df739ab976e3581b688d235fca0d0db8955355290e7fb8c2a19b350ec0e1cced54ee3dfcaa3fe5d732f6d437fb18f37e59d69d5a06eb312d6d75d3bbb4a40fa15d5820ff5aaed7cb3873cfda9faf8908d493a31d6b25af7de2a106298f50fb655c1c22d9b1d2c561a629b0814d7633f59d2b06d020b527d4835f073e496ed3b721ec4f78405feb01f1d6740072df89edeeb075b4d8f9679d580ae905543fae18d66661122644507eb7a1e74f52611642b62165cf33cc42dfcd38acd3f05e03a41db1e5ceb16b24c4936b6942cedc6ce78cde67f1115e695506269bfaba908cf2ab98fe36677dee7c3a8da79ba9d353c19de8d75035ccc9ab0c7287784e66abc5805f2bed2d0ce18b8dba17340b22ed1c7e566430618314c97fbcbd1b2ca49277382e6c7a4c0a6614f4213b398632d2c23eb0a2d208ce0843d159a09b1df47d223c1eecb6383e9cf9e8c11886a292defcb65c0e57208d5ee172a27a443ece73a634ec435230af26d6e391480e1a7a46112dd511b09f73e523474fd15938ccbe86fd2d1115f19bde8804e414aa4b4b6a8256bc033ac36895fc7df25ad6fd93dbc6a7bb2c1ef32d243dbd39c17d310169a1ecdc507f45416e7ec1b29067db3a9fd6b7bf9544453f8a012aa3b3983eea3047121e07b8916f2d0a78a45938714e7450e2a1f210a035b8159d53ae5d66ba34ccea42dd6388ea6b01a14e90cdbac8c54e3cc717ae00d1c139c4c11ecfff9f72cdc875846af8d35a8d8a1f317f5b23773b2e623f33a24d5c6d314b94962c68c37e3766a76cd5d16c9c5fff4d2a8223570bc5777813734a44f9d4413db53489a38a9c6577e214a95564e93f152bc7c4a8304fbbdd9025d3626d804006fdf6367a35fb3116b1aac9fd75c317ab0899e8f1f1c291bfe8f67c23915fddc022246d6d2b062899eacedad585f16b2a768368e7c9e5bf46185be4dd8239902edd3381f00d66115eff8b8b9e6b25d48fc3856c3db1edbe79590462f3d2e911d063375daddc239e8c5e63bda001b82b3b90ef13b91c333881c167e08336f1cc1a8db593453d5d95b7c268218af3fa975d4012e62f784d600ef28de6eada7da1b9154605b1f4f9c40b05780c7dafa405aaffda5221cec33cc83e787fa55576f87a3e2e2913cb72eab2ffc195effffc79a0af64447a30555b9e25ca7501d124d208a1c230e5e392497243617cd2767c5dcf1b543d4dc3e80b5bce0ae9304f29f45bf2c1e0dece1069c8b1bbeaf65fcfa009f40e5ccbc6559c331b1a4f4affa4e7c8257408118d7d0f66bfc4de80f34895bba37e261d7341ea007ffc48be8b5311655d49a746472474cd0162640b84a0c67a6a8304077691dd3208197f7cf7f45c8f31cc5505063d8dfec6df60aceec1d2603c41e96ca6e662176ec85aaeac86ead40f761fc1ce029451fe090558a1ac77dfe369042f64adc3223dbe851fb36e85e774b4806c131b08c744b3304819524884189986b3ac7dff8d09d8a0c98906f06b2caa9cfe745c06ef7d22694574092f432a75314df13a0d1f3edc58f58fbf740ca4a518eefd8acf6263eff317e2aea7c779fc2b5bb84d18837f95014c94787ed8faa3d06", "535153ac", 1, 1465094118, "197e3aea153cca6615f974ab1c1c058baca8a76b164436d202594bfb098559c0"], - ["03ce5c36016226e86c97e833bfae411b43cbdfac1c1f5b2eac4eb689a12570fe1531c138510300000009ac636a0063655153ac80c2f43801217572040000000009ac6a526365656552519b50bf480189c550050000000000000000000000001f05deec952874e9d9fff9d3f2273578bc55a01220476af124ced8aed877bc7298e6adb70ff52b4f1c46cf136be6baf92847c0b25d5345f74315e36f419541aae076d21369dcb5c962e6136342ebd11589bcb73eb6b1a535890f1a987ca3cdb6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002be9e856b236d1d8fae25d44683701201b49cd3fde172d10d815a3306ccde0b1eb1e454b4bb528756a7e80fc531add568b4427b9428807f8e4e0641f69a1e666953c1153e79cc05e09d332f5e0e8a8ab243d815b27f54ceb2aeb191222c0f0737a91b24a0c3305016353bc657969dd71f0caa5d8413cb324dd677c18ebdf346f032482def9464b8e1c4dc079d2fcfd385b7491ab063bacb40b39e91488476f7c7f021094abb7df4c9a6b5ecd02074c8bbc7519918f130245cc8afd5789d90b4512ef0b048e00b5c97665ba2ce7d666e5b37dfa42759b527c1745dfb5194a776879f3f6ee208fc1fc9147d2a9bd2f00a948315a1288fbe26ee5da6fab47c12d839542f6031aca6959ad87a518671ea21b0d87ae4a52083d8ff69ec680760f43ffb9adf9a3021bf642a8e9e8d41faaaf3070529e41a976eef51f398a14b80d2d40099935cff1031b7160d33f56dbebb1f95b5bc38ab1d564d6bcdf7c0a3fdd6948b07e7e6297ba020240c247ec2391975425a31ba50772abf23880b9ab8f90fcc62b49ab248240c103151e1913835ab3c16988f855cd295d8da553a8cc7d5f4da0575343f7bdafdd7a115236d8e60663593d37adc63f8f0f22222f443a52b353639f521203a2978407334896245989c6090b134bbc205c7c1aaec5f62a404fa80cafb03b8fad18a946577d82e7ab6249e418e3f716e1c5bc33a2958651d74fa5e9da179d3745be4e60329052e7ef16def3a2d792d12d8449159d495adf0ecf212d206777588bb65f7c1da84467d033921623f650c575593ae33f203284520f536640c1ff9d9954848417d16a2bc4278c912783134a89600a4358ca177dbee9e34af4807dedcac4395f76b350454943b8f6bb9edb67fa5c87a6082de9995e3208c28aa1904da8de31b7ea705be8f45601ad2e9c648869c6fd930a5eb457e2fd5cc3f13a249e1ca11b52842739ed9aea97e7d2fa70965bfcd1f8e089a30c92b32448163f9ddf11d821b0d3e1324c002b7ce824f6efdd793bc72c8f404b913a37e2881571b20eae8af6626c7dd84e390590187f12913cb8441ce3f53aa96b1c3a4545aad6210d0c0c37a23f7f1e4fea550fbb9663dc51eabe7ef64580f1276da870a7e21572497ee66d8783090861ed15146e51b8cf831ee5648173a019cda477cbf51bea8407032802bf18af45738237bd19d2aea82d48389ab5158e4b678b694ff09aef4ddb2e91dd447a67b534117c8e107d21d11bafc626e40923190b9defeecb04bc60070338bdf33199ed9267bb663fc0efdf7a3edb8ed02e942aeb7175b2cd4abea988a668bf10f8e1b394924a86960c9305d7152cc504d080b3585725e56ef9be2d9f9647954a4a49ec7138e48324251f450080ee88a73a705d9429d621d7c7c9530c2e3fb6d47a5bfde6b77f6313a731e83f2528e1a38b6f25001f7bf103001355e77a5ba79224cdc9ce5fd1bd259d5dd93497a55146b342faa3c66f30ffafa63d2c922d03b0f8715d40009f0b6e89d986d987817db7490cb3b4dc7001bf5fc710ea4e59bb333d129d7128da352a9dfdcd68844b5f203ebb912270a433f7b6f12d45fcaec543cb143e6f8603b904582acf99cbd5371d8a811b1450443d22e95a2555b1062abeee21b73821b6eafff2d400654c77348e9ec72db0362ca30585e34d0ee4ec6e8b8ce17a98e37f1c4ac7ef4f8b958c927ace4bc253d13c3665565c112c551a4ef5311d32b2a40f43d272b2028b2b2c41008aaf89a3c523f0f4f2e6e58fe5e8a2f9c3733ce6143656cb2412ff7361cfac2f63a56ca3c5a35c359fc8cddfa20d5658ba5060a98de2de61fbb0a369fabbff709e4207b8df24608f90d576fcea9b12c0bec59d2efc42af01aa6ef31080cd3be80ad21a26da22614e26bfb16d1227687ffd938853a653485180f72e8104e7cef21f89b3861cf70c2940851cf2c02bf086c49d6ad554dc7a244d9f7a94ed730be9ab2b1e59f88df18d2c8da1ce865ae923b4f0f22adb8214de10a516afe048e29eb79c9acb0cc3b08cb8c32f3046574ee628590d1cee971194a5d071a3585c503584861ef3ccc8dc55de0ec9e98ec9c86eac8d7bf21cd92514289f1b5cd21ae96db227f17bf9f6e8c92a5e9bacb184aa65eca5ce231c497eac0cda5d5a9038a3f4fff394ae3d15b7d2cd31ec363c4ec4b53abcad2e5e0106c0dbe9725bac071b7927bc9684177a1dde1bf34442da2706c49db5a716c37d003232ffdaa4f9e40972c8318bf9dcc7d52565d76f2f2298bd93f257235e843a068d9141e3bb53abba8f6c5101e6a222c32a2e452509c2e3192ac1232a309c4aa57456d1e0d8440f860053a6978fda0baf8bb4e48693ab61d979b09a0f81b471abe087e51694056d3b808d69a95aabbbe4c008ed0457bc6181b19e8aa2589f5463a4e691c01def1c4607ad06", "656a656a5353535251", 0, -646376177, "b852db1e7caaa8afde923498134304be69c347b6f9d793d70e90fa7a79374145"], - ["248d010301673cca6b9ac14b423c1b3723d45d6e7f00ba037e357d126182e643b44001253f0200000008ac63536363525251ffffffff03aa884602000000000851ac656353535365ef1b830100000000076563635263526345050b050000000001657545551900", "5263", 0, 1768826249, "9896431246a1c07bcf2bd79e653bf0f62dd7ca38dacab5082553e4e9ed46a072"], - ["2b6cad1301ec109bfddfa3ebb6f1c17ed67b3e9f3e4d9f25746051f676aa01f26a4455685d020000000061350633024bef02000000000001000b080c02000000000265510000000000", "5153006a51655200", 0, -722294687, "6ff7c5c62a68d1ad0f4672e67f80d28b260708db573009aeb50b4e3750e399e5"], - ["030000807082c40304d33c2340e260eafffe6fa174532e145498c0ffe794e7f8d2f8bfa35781628002030000000752635363656563bfc896712f43e23b8790aa965e415b7491fe2002aaa7b849f2b66ffa030c3803c2f98e8a03000000036553ac90c5e64b3b1f724759dad7261b4b50a514e64e5208503b344fd4f46bd6b8ea3b89873ae40100000007ac6a536a53006ae7c82ec5fbaaaab4f8bd20f50ffa253d104481eefcc1a029b4091d0b53c3141e13445b3e01000000016af32899160469341f030000000000cae5f4030000000004ac6a00ac3dff0b010000000008515252ac536500512f0b5d04000000000163960aa0ce8f91221002d7036f03000000000000000000000000598ea350718d020ab7dd1b542cbc804fc0b8a06a5bd39125e4642c180eedfe6486c350178723aee891ef3a77b00c0da1e04bed873078b9d20d9fb482e5e9f55a37c547f031304c6120fc72c191c7f15ac047c0587ff0ac894453cd1afd8a1bd300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ddbbbb7f4f7777180116cb26cc19705c48193054b33968185764ac7b05e6cee7dd245705a18bf5d0dd64730589410c275b332481e19e45dea8eba3ca8a304bf9aa55707a4e89b28e40343d6541481f42c6dbea5f811a119120827f507fc751c4368e5927fe93511a1c577bbcab87f05df55d76298eabb9e6b4d0214c6cede7ed022e676fa070a4136b5c8242145a51365fea914e8a5fdc3d4af3db4b8894e0f404031bdf80cb124a96e8673a53f4c447025e9d8bfa29b15f0ffce45ecd09566e5dc80a04487c7e1758f115e84537fcd2bef02e1add294e81aa5be16b261e4c614e789f8d341f20742abd9360ce4823f6569b6cd473d948f8a69f76e1f3c9cb6ebbeeec021bc8e9d060414ab30a2c4ee2f03ee74d0e181ba071b41516171c8f0a0e0243ea030830fef851318d181a6b1d34862ef49d174e02ce21d841de0d006aa3a0c39933032577fdde8b787b38715d556e61965805d0ce8f8de0636a4df10842c400c0188102169d8309569041fe763c914a3f06e2aca728bb019d8dd70dacb90d583cff72ae03135897998edd3e92cbfba5368c398a2408939d9749d4c70e81715a07d80654398398a7d2b10d2384861d9e6efa2be1365e9c931db64909627dc26aed87d21b6852e19bdda767efdf29762e58c7c3d9e3d6c3183cc84a0f08d697807e5d0f65372d647b3c3464c41265c89f019a2138a50c2fd1062df9a0a4ebcc5eabaf385868dbea7daf0d2da6b872cf3be5438d606a974e69bd2e6c9d18f581e054a1039d3ce0f60fa9c81412d0fc1c39eda4e35460871e60fc362fe837c408efb7e13eae8544da836e00aa045014914c79a7d8e25d02ce6a85dce434e6039f65be7c91df88f0159eab6a4c88381b64d61c0e54e32a088fa5c8fcb03e766f036be0c10ef74e2332f21f692adc0b1725923f7341a29181ce76f1f91e1dcfac9920859d5e005352eb8779732c23220432dd940763178fb8208a7ce295470aa4cac12707c29a7876748f5c8e66d4080240c0c993385963a738447baa2ede0c255336022758d636d0ef14a771a401b67ee7135c4e2ee4101af419333133d2383c3904fd55b8f357078e0e869bf0992cde4f4a0405e12c55ea16fddb2127ee16b20d371f9c0a0d3d0a3c36e90cc3709a0bbfc302fe0ed0b19955be9f65002bfc1611cc7f4b3732a7ce1b2c9fa8d5049eeeea137d8bf1bd3236c79d4065e368469a7099a0ca5d89abd615be5f0d6c1667e397808c1f870b01bbca8be9bd76a82414e2abf1ce880e7d5b9796e55effff43e35a6a71c2756e4db498aa64e8d2d2bd12260a3a0f52216ae9b4450cbefe39615ae2ca2824940cfeff2ad4eb58db6000310f9d54774a4cf72dcb58fbeb120e9b40b3115e50e0f5b7598155a80157bae56aef2b5c67455c62c3c60fc56cda277b140b8a94fcceb3520b37d1ea1af976550b64e20b569fb093ba847e6a869d638beafe0197ecf5220a7ff8c12a671a84b5140ec4db66c31ba5424fa850b7955a77bf9394563b9c7c7b48d17166f4164b580f887b1309fdf3df0d28a15f158902a7a78f3b6c18599c5711df610859252916b899ca448f6c5eb4d527b4a8d9c463cf56ef6d5629d587a99536f4737a0755c211b992475d1bd092f47f46693a86ace4b1832a74fa23a440a01735877e93d6c4602e2dff2557f7ed11ee0be69e5d81c1f96788204efc56b0c53ff9f66d2d1a979395c6e97d033e3f6d1330dd3fac8595d19ddee9fddc440c05a59f869f1940723589690555a33c557c2b09e4e09cd5d9ec05a7a19c720b6a9fe58b081a0eb67ea35d10c8c358544e92361c510fd6bce08a8dd22f59c442f4bd672296b6106e56cdec77ba4c67d74c8a4499bcf8d3d796b4afc98ec31104230841d46f416b5d8bad514eb1c13e7567f53a5c0653e94c3ed36b0c0ba3832f3fd470f415cde6c45f190c0a522126cb71414ead5f59af8a5c80eeb7ad68c6df9a12351cad68179a171f0217857d767646bd102730e6fe062d5ac2524cf1f5854c39edbe5da4d6a8d07ac31548cdbeb22b89a78b1129b6d611cb92f984ea5df2a5aec2a8e53a8e618c6e56e32b9d40f770fa257a641f0c50dcf357628a996cb5feee0c076183f53d16abc4b6b0a08e32eb703b4bc17cd20b6375fcc09e6057a36cdd4342cbbfd66b795ee4b7ce554cb25d7136b870f4cbbb32c43e8123bbe7654a2ba67b4bc85e0be1503ebf1e6524ed5369230e86d348ee3c70b77bfc3ba73374b8348eb0c22a1d2bf7c1aebdec86f8ed229bd47c71bd13f2640846d094b1c51d8dc686b4ce02000000000000000000000000e46b38a2402611db7ec9dac82c59b8e189fb6e2f4487c9188d57565febd0491195c74f76cfc5d3e03fad08db10a20be5622292c6d2ab4b5ad98410a5c9cce237ebf3a5ee59f51607473922b3ee7bf7428368d96a3368a427235b8e395f7f7440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b025ce99bb9ab720cc90ada25b2141326931e83a4aee4d34c6d7d180942eedee2f62cb540dae9ce590c3244ca8d5060b6068f0cd36c6036a57909caac85e66e6971fa9e765291ec43b3f79a9032a3463ed890510ae8f067b41c2e824e5a31209dd4532862c42b9d7825e8ed7dc6ba43f7be3055eb1db6761fb8ffa0423ec2f40307d5a039883f66adef196653f14ee5ea4c244a6f68981eead3b2612b2bab82a7030431fcae6a6070c17c847c0079a527412e31fb71c54db5ad7a4f29d8037d69af0a00c8644fcb6394f26718b23d3942626e5f8262553e976a66aebe78aa8257d6acbf2d4f323a2a7ac0e97a1a621b9b5c4e04ac04b40f22a1525a6a92722089f58d030608ef17a016d0ebf742b328b0b8805b4e26abad11eb47b662a79814a0aabe27031206b229369735b718522d27010f6e9b25aecf6c988f9109a2ee2c80fd2949df031b769253cba0da7a52121fe1d974d8b4f90a58575aeac8942bedb7a4014367430320ff3587a13d7377da4271c4f8e920ce30ed85beeb040003c213fa1804f5ee0902144f58af8a94d7875ba2baac454e3ece42b0eda14fcaf236a8f1a10114554b01faf5e2c3646a4d9bea3f4de8cea0cab042128441c96ce8c3d69192a3cb2a3adb81f071c9fcb66e43e0673a621d449756a41975bc2ebdeb058169993906c7a47d36db8461f87fcd5d3720a907105d0c60718c14a1ee4fad4694dbcc23e2db0bcc1896d4abf18ca001a9772a9253a79554d8eadd8578233c7cb7ea802953c323c9cb8024746791cb03d1b6c15475869673d1cfd3c28a3733352edbf5fe26e3f1ad0c09d8f19f0ce97027c61f793d40360b9dac95fbd8048f8ea64f523b1bc47a3ef4cd9f97fc6c93e4c6eb392a784409c5365c78119d0bc01f12316868c5446380ddfec829186f963b127a8f85429c90f571637359d919f9c2b2bca2456506a6ce71ccdb673db71ee57c21ade95be1636ec8db15227af403145a364087d947e3fc27a9e42406dfd1c52aa5512f5b57dd584054d5a673f47186ad7f14de458c060ff063e8aef2b5150f9bb5bee60971307cc1cb188bb9f1bf974ee00675141400bde6868928cd3e2aa91375098e8424185c8f222a53ee5008c3e0e0cd4f85eb0fe73d47512e50b167adf9e2932ed052d4d6215ada69a29d828a46b3ae143396dfe17dc98b091137b5f819cedcc0465ef7557143078b1bcbdc19b14e7826de6ca921b58b876f437ab17603e75f938acbf8020ffbea2c8739d8c510f2925f7bb99108819959a5200bffe06a0f071905833681d613e0ba414f02c4719e0d7decff6eba2bfb294dc23ac30e74fe6273e755649cbe207ef700e3445e6f5d8edc95df41a3f419d29f2e2b48dcd4c230ce1abec3a0c169e77a60acc1cdd6427f6906e397b0274903e14d590a882dc2aafc445f815420a41492486dae0ef56d06b5fddc0f3f3dbc8a2c11d1b1e781e56e4324c8c426152632ebd3f14e98b9087d2ec056008f7cf9485fc58733eddfd94918c1ed47b4696111c7f453d618c6213c693799936c8cf9de59bbd104ca877ad4c030a95793a7116140efddf3a6d698b1a85cc2e47d8e97cdfaae6867d1e71e5b1b3ef711008d1c910cc9d61c870726332ac2c35c356b2abf2540602f511e4cbc0f9895a1fc16bd7c324f8d4ed3000b64d9234cde4249a7fa00f21da0a38e53b003d62b35b5d723fc33a42e3874bdbd49b4c05a0512f37e8efdbb3f77177c34bc80bcd5d4f002ba9b68a84b5510b1a11ec81843a7ea4f6507e3c0a0c3df03277f993d209ebf9f1b5c0bdf0674667a784ea72412eb1c628d6bfe98371ab595ca1e35703e21997fcb60abe37e0a0de7432a640bb536b5cddafece6b941e0bd1e7beaa6c63381b26036cbb692880d60ff42a1021ad03713128e8a9b0efec41aca36d95889a89c31696aa7988f7b3db5c217994192282805b6cd8e1c6ace87865df34e09f818e58bcefa3579f85de1fa9a9362feb6da3ead864b40b642163de8612b1e31c654ad7268f91243c6b016a375da92b45a9d558495e25a819a9588fb2dec13bae6dda4805fb57e8ce126688deef079b13fc36d0826f34e35a10903eb7ab356dac5cb6d232df5a8f85d96a58a57219c06e5867619739e6a69bb432ebf1a3f6a509327cd11b4efe7f9c5609197a734f0a6511e07457ef1ea0e3295e209556c47bd86c55ca0c3852d70f4b2e3c0b9c67b92138b72206b06d5e60dca8c6217283596d251a23bb92469e18a67876b023abda56fbad04ea60ba444ca04512f39cc631cd535e587c441dfb96b6b662deaa78feebeb92dffecb99a3f2606273cf92d6d51b2a81cf0eff172326b4e81cccd90a3e8048f017111f75784a3822e6f886c66f64cc9190a378b4e50722f98c27cf558bcd08bed237e7641b4e0a517a2b57b9c02431ead92c02", "006551635152656553", 0, 657317308, "8baddfa66e2da9beededc7bd0311e7c07bbf6bfb76f885c946da11165a060306"], - ["9d8c005b02df44ebc76d8236fe32f8d8c29dc22ed69dc9c235bdfee6db77abec3a85b5747c00000000056500515165ffffffffa8d4577a65fba5b1873e7b1ff740f6650c23dea2c51c4e8e4b64b88c276616970000000003ac6563de2c919f0159c5e30000000000060065005265ac279b10ad010000000000000000d06347020000000003cb909aba87bdd61ed7e256447d7a304a6874dc88751577b9bf02fdf16f2330356c9a273f93dc2a4e8a76ee1fdc930474000078b66dc767832fb8a52fbc31f9d72b7d7685aceff79210d772ee508917fe7f1effab66577d2aa8180ac6f063690000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000048a98c02454e8d0324273e80f023e99c3311495d3e63dabee1a520d7fc00510af40291f7055ebbe36c245f2f884ca1b73a0b5c064e54bfeae101c2c45ac109b8fd0c35e1acb0c70629f0cb4332c5e841b8f818783d7c4bcd3b2517eb4edd9c08fc7746b31fcefe8ded9043f82a31a3d3bdd2eee1fbde79fe2dae5ecbcec4b2cf0222692a2e89b50c11cea9213acd621d3f367eba76e458ba6461018bba25230a2f0311e9c27b0954b0ab897ccaf9c0c716dd0081059fd8e766f7554ae1abe234768e0a08a5848f2174860b94a765097b728c09fe4d9dfdae35d33727059762d7b524bf5c1ecf0b8a674a6e16ca306be04aa1ea479e469d63b38059f56282f78a7210bc0312ac970633bddf6c3a465789e2ab49a726111f8ce3f1e6fee8a2bf2f8a18e5b002227ab6df1cd3b3ead39aa9c1dd68b8ab1fd4d78497578c6a30b1418ebfaa9b140210d87701fe2933fac5fa13704b9468d11339faa30ec03d0f0ae50c9c45eebfa9021767289b09d6eefbc63eff6a7d31c250d3e1fa9507b6e695cf2b2e0de8a77c7003305e91b2ef96f5289c782534d7fd9bfaa89a96cdab06c30b97023691cfcbec6f49956957fb77690af4ae28d9066f84c0e06278cd6d1563802a0776e6a635791b3e50527f3cc9f4058a6ca5565a883cf6ae682ca6fc80f951380a7600340e1d3fcd322323caf1785ab0d96268326c11967e2f62e154d3394df591d6018c8bc22fa0863661a0d9b37596a4f93c53dc72edb1229f00210953d76844be0fd6c5630389b5136cba3da255537ac797dcf147977731c70adb76b69660b851686302af4b4fa5ee91f28b99e7d6c141bc2c2ba20846b3c126d230eb7b286004b5d2e3c1d9191baf422aa80f03f3c943e349f762f1369ca2f68f9999e08876faa3cb92353fb406a6f5050df44ec1eb891f3dfcc67516bc6c74ef4411eeeb9125d785c0a9c9e1e7b59556a57d659b6002bf4e1322835f9c844bdc8e73b9dcda18e60fb89f9ecff39ea1b31db35ee96736c896702538fcc2ac651592a17427bb9310fd8ee6ff9b874e7257bd4eeea5c7e26d5c369e863cdf40b6b47f00805acaf4f7a47ce4df7b8be966698d9b55a8959f3a3f7c7d4e5cafe0fe1b6554c4358780edfb4b92c2923bb933ba052086a2b5aac5ea6f8d748b684162e4370d468b7042dbb0c41e27dba2d644767a0a0c594e94e85741d9d3ca87628ab0ae13a98bf460b12c864cd0f6bc5ba362f64b28fcee6923e4a7a3d38a64e43fb9fdbaed0250c96f192b874a323048377b00856945fbefbce7628f1d1439d83878dff366a321a1f39e3d5dbf94b8f9e581a5a2ef3823591fbb20641a1a4e0ba4646efcf070ac719cb9d2b59db2ab3ebddf1e17b9f20b1a32eb47254a30b18b536c51a6dc7c6737852c45b332945ba2098439374e12ca5535d2aa0a4f9a5dc32b30e65691fd222b70e10bf1bb7f5b178c085493254e288c8f942f0d3c9e93fba1c3f03f506654783072e44b9b191576df0dc55c6fb393e47db7ea3cf7d4489d70654322e0e7a9ec81f67f84da02901491254329251e838076151398167d05be04eb03618957b4919c75aa7bb26d08907f1e9c1bbf8c198f74bf8e2b67964420c16a6706ade44bbe90b0b01b9b9ee302cea0cb0dbf4245b0e7dfeec24b8744b2419ec04db25263f86b3c765c2e7d7f37bec33e9cd0284ff2dbfdbbf77e11c9e801d0eab04d64247ddbddd1dfa078e29ede69c612ece4c0f600fa180ae3d590958a41f68b142d988ebd325d07a57e55663953acf58b3f9a3fb96f62bd639bdfae5ac4bbc4bc4a270b917469c767b6fdc40bd64cbc340b5dac47ceb56dc5f28f3e4975a5d123b879ddc291f3b42fc6d8e318a8be0314d0a59d863b32de09272d766baedc2ba6342c8cf2dead6db1a5cc0a6e1afac01c684e52b9799ba1390015bad35be756721156034323967935ead4cb2525ac7d61783423dccc81c7a659575869a700c70de444c9c8faf0a6ccc6f1bc1577717ff9b67b96821ecbf6de7ea3fd1cae378f3b892561993d19ec9cfbc124a839312bb79969215d6785204e15b52b31b33a9ac63676f9c97768bb6379c55729fdac9afd41d794b8d97be2fe638fea5c03e97d52029143fbb27ae4036efc0aa960d5efa60486288a0d6ad9329d52b317d1555d4efb0090b2690e6d7d4d3c9077235e623fb965f25c661f4614326f70e754e315f87d3b2f706ef117aac4b8e2e89dfbd43796b4271d8e16c7fa4e6b6b3f53c292e17b35b536b683460434e7d359a7507293179f1d87ee420dc47d1745fd869e12d1ae384277cd3fe91464f238db637578c550396f5a92fc5b4adf041d9a57e9b9ae9ae36eab9248d3c683a26419fd27c01305cd76c5c1579da1142a967a28feac0dcba9034c78aabf297f938c2d4921b47a7761c2ea61a24f302903", "0051516a6365ac53", 1, 201488168, "8e0e369b7105c266c06e991bb7c6580ba1749fe9863c3fda69574d23f957d6c2"], - ["e43e304a037f0ad97ddf1f6b33795bc1681f5480f61be3d45f3e8b714acaeded7257b2ba33000000000753516a656aac0030a2563d83fb21d65b07bbe79d9d800b2dc120ec7fc0cd301cb732e0c82d8c0b3be22a79020000000965000000635100516566155afa7011647a4b2a23f3aa19b8f6fd917579682f0c887efe0892d0161691c8b9118500000000026a65a107ea8104c3b62a010000000009006300536563526500bfb2aa03000000000953006352006aac6aac67eee400000000000800636a6aac6a6351b2eaff020000000004536aac650000000000", "ac65ac63ac", 0, 2117499319, "196055b1782aff32c5fa7ef35ff1a9e17fa99fd26e9e3742233b049e524665b5"], - ["030000807082c403021bfb2a9b33f4486201a0e24720613403bc7f49e358893f78392266f31661abe6020000000363526affffffff2ce7ebf3130eecada61199746f7efe262d1ab50e9f149e1ad7ea0a77892f49050300000009ac5163ac51636a6552ffffffff02d5d12b05000000000653636a6a5253140fce03000000000000000000fe7713b3030000000000000000fc208100000000001e6b74323bce29a6ea66e28778d94b3ca9861e937e70860bb8404cbb4f6a1ddb911291b7a9a6314978586ef80f11bd8be892a5dc166afb6f226d8c8d15dcfcf055f11333f526b3fff70209ca277f4befe6a69c919b370d99a11daa451943c9ea00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000253f4d99e8883d23057ca57245eb42798a3b438eabcbe0b0d89ea7a17f12c1bb63c30674580bfc400d0e59082df02ff50c93eebcafbe4ab90274416fbfaee3e11ed0cd0ae27f621f6267be1c96be34149169d598d54c1ee016ef5b3e359b0c9e4707071123cb5a7a911ff7ca3b9a5511fedac7c2dac66105d68fd5a45549cf1e0205ea4cc49affedf85b23702fe5f450a56ff728dfa31517e62cf314a4a1404ab303122bef2432000ca8b9daf0a1993b270b270309785f37a83a8d1f5816e2a852870a0235df1c8839bdc8b10d6a3fac0e40c0f333a9780d3873d224c89962c4af60dd9ef243b993c176d57802b60b36a57e6ca14f01d985db5d9966d21f89eaf86946030dd0043362207b60396c5e2d6eaea745825de3337f8ba38f168baf93a91ce68f0320496b448f1418a7b8847c02549dcbbb943cac578abcad108c568c3c5dffc4b7020febff0fa0740a2cd8cfd8c27822ddf1cfa467e07263fd70fccfe9a1916471e7032016e561b9d080fdcc9d5a04dbd03e28adf9e1e6351ccc869ab94efc3d2595250214f1b9803c3e13762ed350285104de7086c50f8ac4e278c333c6d5cd6741cc0aa75ae33ff9a43823070e89cd12cd125e077d324b81a4c8e89bbf8a5634080faca481aa40bb994b47df2954735bc4ec72f1d1e865f82f67822d94b034937bd5deec13dba785b4e1c89a15383270ddfba3902cd7e0965c7e5d03e8b67d563be49c801e03ac48d01154f373fc6bdf43c62eb82ba8f989a962727736d5f68230bfa25e30826689a2050748577a42eb4bb3fc7fb434e6b42b180f3d92860a320a63bd1c341d2a4f871d84da9f39f6467860b9720945d4441e549337da6234b934f16b0b1b10144043cc20479bf791321d119924108ea292b144ec16a5cd885a5903a5e6b6899ded5419d9cd30f9ca8c8e58b8751c566b67473ebd536a058bcbfe77f402150f8747f462f52ec3fb54838dfd4fdd78a2df34febed0f373afae73fc1599a764cad107cb55555d0f6cc133aa70de3cb369dfff6f4d27dcc08d026cd4f4bdbf0f7776d47d5bc0fa0c7a05995cedb15b1a45760760172fe545e25f2bf9ddeea8469bd245afaf283edb3e6fef8d2e8337b5220ae446d1412b76560708a7608f65e33db342ba67a2491dad7eef5ae745685cbf57c2d261e371318d882d1c79615113c1c8e045221e4e47c4ee2184741662fbee6130d2fa4f87744dfd20553f796945948d6a3627eeffdb370336995ffb2416744eed642bf212d8af67374cad0acee8993850de84f0825556c0a1ff77f949542181d8e8e1a06590c67ee5ced16c03433d471c125ad4fc6ee59e46f789d601e1ecfea1f29c0abdeeb110e9f32c59049fe5032ac1c7a326f707d5202bc4424b079cfee3b93ea80737ed003f2e0586a356dc9d2553c630fdafcf74f544a5bf902c8093521883ea6a3ab7b322aefea3cbbf495f02c19b91d7269bef3dcf756ac268faba088b2568d6b3f340c8e1fd9ccdc8d534fdcbb029007c38e4d84e9b5e0149ab5465214f7ebe4a5013c46a9c5a9f8f87dab52f9f443a2a89725903f173a49ee50bd55efc034d04e81f0faec296b828012a7d5707303d30a69e477f975b2d03fa2868ed997b8b2b28c65673a38257246c82f324d42acbae0bb3adec6eaaaf074081948ad0a1ddf247c06819f86b464f16e8022da0b3d30c02921464621c322150ce991c1fe1a66570c5c46209ae8dc8fc0f90f69402de912066fdb7b455cca08cc46a5487c186a9c1876c078ff1077788b8e8375cd36ee49b47782c50469ac28d5539332770acc410be941c6e516e1479a3ff3d2e39f273ca65117d5f5094346d1489db100b6afbbe15c6013c72965a23efd66a316a25d15f3fe9dcee5917b0f94d29ea73733bbbf782383f14c3cfaf64d5db15dc149b0a130a81ec22237ded48597af2ddcd2b9090b9038aaa961b270f62db772ded25fd3761f438ce748cd217169794e3dad9ef97aa3173386af24ca40b3cab46a27d7b03feb47fc448a48cd2dbe5b97cec021fe1a048be49c0285e33d8cf15ab2dc10a67aa9877517970a574bc282f4ae9ad94fca1a276f0ffb0ab16dbef9f3a947f6286d8ca2f971c413ded99fa149b540e9df40f1c9a9cbe539e1af40ddee6aa88b1a2e9d5ba0ca443330b7dbebdedf6afd40f011750c5d09d8f6af8c003bdb5754be9958fd1f3948705073e11fd9f3abc3267c871b88d8a6d1f45537daf79f30ff4429fd4fc07675e5288b671ba850e74d743084c0fbe63de622f196d6abd9948b49869b5d406ffb9a3000000000000000072763f0300000000ff44876b0b680977fecad54173569ab85f798bdab8247d12ca9a6cdd319ddc280b5c1f732d77244364d4e07ea2cd8c36997b72cc5bfb107b5f3032a67b3ff82e5724be91506bf2ffcf3953bdf5adff9ca1e34e34b195a861aa8e8b8fa29a4b77000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e54ed2d8c4728a1385e67e20280575a038ab197ba01c76340a69a1ba46a24076795b185005a1e327b9a5e875c8d2797dfd74a33251d392accc4c765b0e591313244c62f1157300ceb7f8eaf699aaa9b58e38d76c268377d7c30ac4d4bc594626570779589a022e63c4c753ac2d665ad968eb3d3e022620fe4aa4bf2d368f52802128dee0830f1e36f8bdd3423cb8e208945a8b010efc40e9035bc3598549282d7031a2f0b4d96b2549d470d6c8f1101b27ba4b08cc15d79788f1be26c6a63bb90d80a0086e68d0a4439e3818ea294bead76cf261495b415ed8438d7d44d9b016369059aca4805cdf3801ddc928e1c3e5a81e9a0779cbc682a5ace190abd171369155d02073527f12f7cd55df015642f21a6dc359c65ff1babd66125986213e8b1a52a66020d22b46314bdc2d596582267ec31994faa7aaee83887ecb01458a44220f4e00c020858871727c12eb8e5dba085b4d6f294b51103d79bf3a3fde1969cf9b046fa83032485ae266b9480eea38a25325b28ca6c5b750aca2c94ff1c1094ca8a4859c615020db80886f5bad7c980ed0451db38d2d3b7fba17d2c8bbc2c1ca4a152ba4587116ff4df0a47696f7d83ee5841285f3123d867e84434d3c01d23b2ce949e8489c3a5fcf408544d3780a508327c1583b3017fa0fed501cfdcc600dc7bd38cdfde7a4366032365c3a8997d2acaad3d82bb2d152eef42d07a20232c81d2f3b804d7c5056d76fd690aee32b42f285edce508bb7630eba25626b813fd8b530ef68a294b7bb4f2a154d7bf5477d2c7bdbfbd0e0acd25eaed8b50b19dc46584331517bbc7f66f3849e2ccb4547e3578657cf694df1c5a588d448c4b050bc6e52f41279b51dcb4ce9eb115ab15c0e1e22ad02a05b2fa306cf385aad0189c720ef76ff65bc379d635146f710f2b05859ae5d048d7d00ad09c1e5e5574dca8d5f1dcb2b1cf5f20df277794491c713f671f64e1fdb7399ba5d9e188a91cfbcf7305ab93880642d2f8a37affb2d0ded29f54cd4347dc699214e2f7e0aa75dfcdb11016c4bfaa36d12251d8488b083b7662c0812d058edaf87f7ab9f2c217406047bb687c3c3b6af9f264d0570e5c5f7be63e47735874bbd610c0469acaf31986b3d5f59c6c557a9f834330c65689610c1826be2beb4f7a87d6780f344b39cc5d9e6c85b0069a96e795e6aff1774c4f42d3da44e5c88f490a82746f17308be0df45d01e98595351bdb9e959da3da9b61a3f6c02a217b6ff15db5881f3b52bc23d74c9d7309b0193913472b2a24c528c91313fce6a765d727a78118b752f03d264b5233e0999e8acc8e3fe92294e275650f40996df6c11be9bc9da39ac797763c79d621dc4a4ef671018572e892f8144258f2f69474f27d7ffb1b853cde29b174ba465d8ccdf14ba45261a160a2389acd03b341f3f40f0f6b9cb78170a1d1c0f84553401bdc662cdd021500ccdc79aab321b9c00533bdfdc919a8d4d513330ced6f80e05eb96000b11aeff18fb6a90c7203c11098b7081d5fe962305549ee7bc02e619c0b3cfbd56705c8863c8a0f02b0ee0c30a73c9959b9dc9d0cf8a12ed6b2015c46a4081bd0b6955770211798b56d8a21e697a7ee1cd0553e6a276ad8aa35ceccc3c97a8d7fc241b944b677d1e21a7514b3a5725c71b3a12aaa7e69ab9706045f42f16edcfa70c47bd6514abdc0c7939b6d6775a5d6210ce69f1bb12f9bf8a238619415bd0a006ca1ba64641fc3cccdf82911ad8888e582d2fd32c26e220275fc0f352dd0b46ab4f81ff2c9c11bd1ea00255f705ac8b21363e045c2722e1d1506be8dead50c636a189644a3104d40d184472635526609a19b96f146046f337c488a5d3fae34f144413dc2614027bd982a1f1aecfd5e15d8d5059eaf462b3508ee76d358f1e06a82541b02c35fe5e8a8dfec358f747cc1b47d8a7a3e1cb732d674dce9e3fd110a87db5f5a895a3ee8a3d78998f856bb379874b11b023add8dcfcc3e058461a3becac84feffeeb2ca9da6d15a04cfe646e1716613e4a79f6f2781dff6d0aca222c144bcf373dfc2d9aa918258bfddf26fb5e3a795f9faa6395fed7d25e4e3835a4d69e8eb362ebc909727325b6716e4fdd81782d5b10f688c003b6345c99078c2525566ac66cf8f146c6499aea31962519bfa6227b34b2c88916c966270bd0c4c468286c156262f2cfa72eafbc23d73ddf9a92ded016be4261b44cad16197d90c476a4a2fcc90642e1af9c5d95591a1858bd32b6835b98c207550f09a168316e9ac8ce613edc59646d96a78ef2f010cd3887f00000000000000002fa7530100000000788fcb00691fc183fc460dc72cb0980a7c9b2bc922ea8963e679095bcaf0b0c5e59e6d4befeddf93dc76a105cd70b2c178641c3603e9f5b299fbcd16e225ef0c6ef4259e1c7a60bbcb30ef1bb75ce199b17830c371398445577f5cab564d903800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c84ecf28a2f6730290e826c4b833a057d2e79be11df48359ac112ced004ba1b9c15ade670747e32769ddf5d6a05e5962299fbe513176a3fa538783272eb1224a71b18cbb89a2b62885a6eb2baa10f36f53c60fe5157e8bfc3fdef1fd6ef8459d82c11f976a758a593b0f8b567088733789e4dcdd974fe4b1a7c8d016bc01190e0218caecd9985d1441b585ba0b7b0b3c40ae3a396eaf7948b31dcb92838e7938a7032fc09e5258e6cda50f8e284c389c85500bb625fc0ef14d3f24f3f8e12b9a3ea30a056c0c0d1127ad4a1593ef2e64bb6ab00c155b0a6b8684330da22789fd2cf5f48c9c1444606eab3488323b5bc05626e837fc114c7022ce1026e888f067468a70020d6900e109b2bce471df1580ed0013badf3e2170014842fedc1dd5a922b2db50021cbf353dfc5dd1485bdaae259dddff6797f9e423bb19a0f133ad6c9fd9d8c6c803270ab1b6472bd8ba3a2335a415a3f5fa9da126e6c3d3a2ed8608a6c09f8824b2021be231b90e77796e76c01ac9170acd1f5ed852056f060f8acd80f0ca753f7b480208723e6cb27f3ac3cd8779713db93dd360ba57bbcd4b5b1562ffe1fa0ec0c5987f11dff3ed41eda598b85afddb346276bffd18e423cf139f7f6858a9f8fd5750c4963462fd705de2914759981eff4fc08ffdd49c70bc52dd3be187716f66774d86d4849af308ffcee3c9fed067d914fd7605707ea33c99b851f568191d8a69ac5588817837d7c67799843c6c1476a7defd9451e0bdb008c8ea567d1d276e24efbffbdba1c5f263ccaf01271ba0f662f919230cb2369827d549e390dd37de39c5006004145b03b0c6e8edea5b5e526df2ff6b8929484ac565ef1b58bf681a4d0540d48a12a422e6a19376523c55bc57e1fe68b1a62a5a795e895c3d42e8c834bf8dedfdf11f7b70f03259b2f0cef24a30e3f544c7e79c894637bcc8bf49dd87929149037344e799d61936cad5a5e9c14e2789ec9f0f1c016db9835423d1b5fc790f2383ad7b596ca8d44efec9249c79f78d9f28634e7282d916e743f1b52bddb80e1a8daada1ebe94fd2c496eaf31c102cfadd34b99ed00e35c158ab7255b61cb965278459f14f746d4c983306562bd9a391244226b00f1dd767dada5aa614c4eeb610c74a86deb0c0b5f24ef7085c53da67f84ef472917d18ada926f1c6c5ac31cde953e671d86090ff19f9aa72f8491633b313d51fe371569e31ef5ce30bc7a6b1f3fd888ec092864a38e325852d5150bc6adda7e7bc21d3140d59dfb96bea867b46a62fc13a9bcd264b7df0d8d99118404a485b9e41a3b4c230c51b81ea08a63c3e9be4331a8d7d2e6f9f4326f47f9d39b3ef35604eb9616dc780158683e34fe060d6aef43881daa9e27665cda4f7787c79ea5595afcc7a0515e2fb092e77ad43ad02cb1f20e7ffe4eb75162f555c33d6f10caf2c39b74bcf5772608bf6778bb31d1b21feb1689ab3288f363185d0527e43bf8e058e1db5ca1ada141d1bc8e3e97ecf615419f7f0248701ed82ef563b1dcf4a94b8612fcb99a6ce31b669486c9a15bfc0d3163e13f715ea85c11fb6f4a6d5adf4785bac111620916baf65fcdbbf0c27b783951a1bdad8e1007f061010a5723a7bdd6c7413a5969f15f74daa7342f069901464be7019786c34f07f9d13e536603133ea9cac3a93e06ee28f8d1c4e6d910de4851b03c820c66dec9bdadd8239f60a6a8a83d124665d10f964d04c989cce99952dd31dcd5f5b931edc311aa6cab82d9d06932a0ce893042e7dbc9ea8ddd1cd12efd624057943ce8cb4b9cefaa98f4c740de9c24c07f0273e7ef585f39eb9e221f291c79c9f1781876ee12a53ae1a0a1af20b1da4a7b4d47961ca74536948a7f52f044eb18d9a57e08864742eae7c0bcb734637abd1fb8505dbbc0c397e1425924a305232f62a738efa4bb3ed52233a947dba5cbea90834ffaf6347ca3ee99e3296a837ea1755edd051eb7fab888ad0bf90c19b2150a40eab53ab3893097d5144740145f674f0b7bb04b23f6478b34096d6af7c7e9126e21d615de1e91a341eee158031251485c4bde62e3c53c053d05affc83fad2c888df06bed4b1b938119e5bf04a626cd9353c029da5abf7bed895a325c72fca0049bbc90bc69b34f4a8d84bd5acd3fb944a25c862a66fe6a4e0c5e699510074ff760882ab8cfe043b9ff0462c9f322dd766a8ec82dc43c1ff25d10a6fd943510945edd3659aad82569735aea9b6bb110d55c52680aa9605e6d9e3dd794d009e64a9de852da3fd465e25856130b82c954353f2f8f9d7dae82aa44e59a82dca927a49fd811da0b8a24f36752d645a02cb75ad263e1f6932097b4bfdde233775e58ce1678e04a2efeadd2345b118019b29a2f78e920bd64386668f59f7f1ea30b55ca36702b332bbbcaf809627beb52422338531a622b72a0a", "6a51655251ac00", 1, -1258661535, "ceac83d6edd17329cab369cb5f7cb97be2719fd8d15884c87d9310b697022c3c"], - ["030000807082c40303dd6f22c18aba407e1f9221b0ca1bc8228bc976f682eaa8d8fe3581c9015e91ea00000000001067048ace23a3ade15215af94dfedb5d14388e2d758048a5fc5f7369e586d9e9750494d02000000056500525151ffffffff669207bb0ee2322a6a1706be30c84c369364f9e3b957d064f34325f3b5aa5a4e0000000002526afb72760d04cab9b0040000000000fd1f2a05000000000965536a00655252006a7089c80100000000086a536a51ac5263515f1118040000000001510000000004dec15100", "636a5251655252", 0, -2141732540, "9d8d43af584144bba5103f801d3e2955aae8c6e506413bc19ab9504648b2d907"], - ["030000807082c40302461b561b6295e3ebbced261a6c636aed9e0ac088c49fc33adeb0a5c22c5dd76600000000016affffffff9084276c96f5a2db30098477c7d5cf779cfeded5c9d057d81c895ac977b26b720200000003ac5263a33d3ef9022cb3160100000000056352536a538cdd220500000000085300005163ac6a655d762ab43cd80cb8035a44cc010000000000000000000000001d44aaab2412286679fa1e86df8e21d9a55c68e3f7ce4134f427505d5274a00ceb34edee56b0997475bb273a2a8c3f8d3ec1125b5714ec7e2441edbf3db634e614219e13c561e16e670dca0e83ca02cc0c1ec86a9a710d02dd4362e807ab17a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ccd28ed3730cbd46c2e976b5a9b4f8695cc45f4a60e06fd5b97dd28fefc6ebb0baa9ef7d8a96044538e68dc212a6cd745a9c1a8e2be5456e8bcbe7e01de5ba93bd46b2e60102f07f6cacd268e15388c5c98ad46487e05b4c6acf817c15577f924f0924ad1792619898229de6202e9515475ca18b19f1204156e9c94cc809f1f503066d3a67f666548ed57c83c5fd23b2f0b2e664a8234136e522092941cc3a3e31030460f132c04cca78b172e69d26ddc39bef84458e30b5c2ad18b9d59eaa6aa3fc0b04118b28e78397b99f0987c96f36b61df7907df32481d7f323b73749c62aae21787f1d5ddba88485582767e24626f367d0f121b5acac65bf8bc2fc9f35f25ddc020299cfc19448a3a8527689d346a306e3ddfb30900699f7ba797cffd02bc928490201c65aefd41cc64771966b68b913fce3075bfe28d4481a0b35d894e1b33f5385020024d1fa87a7c9f7675c9d2d2a7d6d0b7aa7501e9b748c9b4fadfc35b3dc574d032c6376b5eb6b92aa8df876bbd38136667726198d924ca4474d99c12728e2f6090318f5ca375cd29162ec22b4300fcaa8f95a2d1e8a0e73ebd9c5c23de917ccbca06b001b9b8035a98152ba3b33a2fdce1054f5ab5062c2980f6b1f67802871a8a4b1030ac88b72409006b943794481e687f61871a1a22e8cb2287e4b4178ab66620a92ebdb9d721c6b8973b35d66b2e5be8b7e3fdcc60424d973d3b175e67aa32493d70ea5bcc5273708501bfa037813dafb03a47f536c00e2f73f1da7522be64c5f0d018817dfe741092864adc9ddab5154b44455f99ae9e212154767fa7e2fff1b8ed49b622aa76041a4f23e28eb555d8b61739676403cc584d0681f2b68fa18ce94b58dd3b6c7861fd3365e45cff6cad4ec67685e4da79e254cc098b9a6b4f65b36996921ca2e28e0774cbcf71eec389735b9bed91923d47b1b45b808d37f82f7a69cc95c5284e3f1d738ad9d15e1a3a4830ab9b48aa016d2c6d96010c119a3c78ec2e367cfe552a3b77235ae07f2e3e9578718f8ddfea9a1eb3950dbca6f95cf4710d7b5e6a02748c9bef2f698a8e1b4a699fa6dec08351dff3f3f8593afae94c548a21805ab3c097162178ceb48d13e9c56b811f29a75244705291b850927381fc548ce319e0ccae94a68aca434e864613f7458dd093d6aab569df99928e71edde0eeee83ad22069e1ed9c5ff78e35d7368ea809061117569024d4e5b96afda96eedb2700650cc3208eb4a014767136dcaa9d50935aff262e9bca0904a915ed0e44e6f2606d4e228003ed20e365b19d8d5706f2b207454cc1f4426048c5ff3470b5c0c3f401851938b4e59f550e54f24e6694cb12fd98cbb7f1f728de11473fd89b522c6bc9f0901cb260b1f461498eae7dc0f339391ccb51b17dc89c1b5e2daccf7eb87e9c075c493aea0997e991df3f1f2ef094bd06e16ce084f8307a93e3cc494f64c02db1daf5cef5159f3fcbb35237f1f3725fe1cb6d7b1bf7cdafd6639a6b6af7bfa361e618f266e493e45d80fa4eb013b5cf7d0d05e5364c8bcdde39da1f3489fd2242df98dab96daa0ad046bd70ef86b59d307747ec11408c822851dc33b1d325d47a892be1b96cae56260c175aac39bd0aefe870a34de9549fefc8781908e6b97e499a50b442e69bc4aea5408d0dd956aaa69667e2858d8f40f397c6559086125169d4fd67b0f648d6affb99c25e72fd85b62d52884dd69a829a202d19845e963e2a2f588dee0274d7589a466e44cef9a5f61c80ab5f5db989b218c0b08b1c97c706414c51cb7b7b8d9bf514ecac86263f25a0e99cec6741dbe15556aea86e6f8098928c7db780f57230f7e2720d5b2dfc3b6ba60cee1e973daefffae8057122075284b238f597e3d493ce7082d86726071a38bf010b2802eb8dafc8e18319eb58d3b82c9d85a9a19ae554680877d5215d1b0914616cd70c36477d16fe6092856aa09475f40d728725190f957f9dd65296702bf6a2c430c0004c2279db5cfdb651239da3cb921e3255c3b9ab9ecfbcc3f7adda695269d68add73c0d36930537a3ac52ac2ced9ef1a0d597b31178b021cf49136aba3cf21dbd8e737f056aed2449647456030e81af9a5fecf999537d56614abba769134cdb44e9239ac62120d0b5a6aff8d717e99a2541a0a36483ca79b4856e814030cff20909af2d5a28c510f6c072ff717844e4729fb4d9c142a04795580b528fa76fe3b27131138c6ac0caa18d5eb4980615c1bd8e1ac1936d338998aa4c35428d675b694c21348b9b071f3a792db7503c40c75b50a38fd000000000000000088fca60400000000c82cb5a81c05781ceaa61eb6533168835cce205b2812edfcdf6545d3fa36b5f25cd194b240013f21a720abf05aefdea6c2bf344cd64dbd302c34c376b6efd79c1e42251714f0c5ee978d9a51c4b3f7e13f600fd967d03c82493f185fbc25e3f5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007e4920126d58fb8b32157bd693525ff42050fd9c49cf84421fc5d6c0781d0501b680ef608e9392fa098ac021e564b3775d8713f9bf6c507cbc5eae1c035f6767fd67d588d9059a50f77a0c61199e5dc6fb4d7e083032317d97e33644f496de546719ea88db15d5efa701ce65334bcf1ff0bb83b10b8a6f343141e9db9011d045022c2b71c6dca24ade819672ad2329619d835d8f42e1ce40836a4144974c616daa03268ed7a7dfeef5cf74d9609d4caa2fbf8a39057ae531f572b7d8d4c574b5ec410a0404ec02121c374a69802f5b6ebadaa8e84ea83097ed47800d741e0ca6083fc11c936ff90f12c75f4ca7197013653dd89252e2829b5fe753e174418abf2461720312d59eee6e658af7a48647c1e9aae38dc12c3a53cb2a23a332ca97ea3ccd50b3032f3f2e9bae09af3512a22774862ae4eb9863cc07cb9d33fbe67390a9e1a43cd403212338f09f8b9c8c69849ca1be50d9b87b7edde3010fac5e0095d4164332c6790320db781e7dae9ba30f5851b85610d9f407eaf06db653f6f1984d405b0809fd810208965b1894fcabe6bd439f6b3ee0387d4cb0a350ad323bfd5f21af78446f1756fe9bfd38e5e545356073a3e79a976f4220f366a4aa623fa7be50a0866d28be64900c6d6e04fcc7de5e5edfe6e1dcefc4327b76627cb9fed1a83f98e597307377252391b477f59eca017d34287e3823c218044b9d4039d181e3fd747e350263e1e73f935ff9735cf48a0d6dc68c3d100faa1c039c49280cf40c874c7bcb404528472a7d003a8e4a7dba4b7193563ad6f7efa5e7b97e664538c19604e430095abb12c94a0cbb099ab9a66745f04ce61d9f87e4b5529ff1b170880d95b8cc654981e385ca0156f930fe9c99ed83e800a46dc23de0a7c8a1d6c4bbddd867e1e82426d252658d4149439fc92a00469ba9a1ef26780d1c177da2ddcbf2896c25eab7b08c728cba6d95c9cb69d633a694f3e793d091eb6a5339075fb8e50b654cac96eec8325ceb999fd726e8ebd8d540f382a2d0763588e935913f3ca22a05bc295a526690b23609d3758c55f614559c8bb4f7fa7191572cdc73cd7f754d9f883dcbc9a2e93aaecc55bec6e31e58807f85f03d1944667d6418cb02bb783c0753dbcba34f618962b60d23fd44d7f8d669ccbae164549b55b19e49e37f57de03a08c09eb5bff2d6e4a9772b464b9c392739755f738b538234d2f9ed1e1da93a36d32b382b358e6c408a1da6da9c9b20c149cf16128994c8838a7ed958dc9ea5df0f8c05bca6ff30fef2be8889c250fc3567c60b4cdfd68b3fcde4191950cd5df21180a500727cbd7a84f351b3bdbcbf6d9213baafab4cb7646adb6b69b168666a7f3be899ce7dddb1754cc7f2598a8ec809a19dc67f6153bd0189fdbfd5e36382b6cb9be4f9fa6ee4f85934526332485f6c0286d06129387e6092c9ea4697e26bff41ff0bd6fe40cd68b4cbcc1c2d8ec8b2df44acbfc530fcc264c4ba045cd5769af163185053c9b0d3c36b80e5e5d87ea4f6ffa6395d58e21b6b1d070c296a46d33ec84b6ebd82c790a2089be68918bed15453c3f51cd044ba65dc45a56830efa432f1a47affd54b9ac403059ef8b145563551d60cd80d7a59db9c5ee7094e60016c34169c382ccfd54bd1b3fa9a226ec0173080a1dbe0b85992a309cc42aca0574c42f4cf4a95cdde7481656894161cfcf00ba2a6def406acc2a09eb3b8118e03b9c34d591a1d58fef5e0d953a2640ccdc99812cc1198642da4a692e2b401175781a06e947bb8a82c18aff4c71516d115e4dbbfe38b143dba01a60e311c58db5eb41c7794a4dd0dacc992aba0fe1fe07fc5bab20d1f5f488c896b0d2194f83296f574c7b6037215e527336483530102b69da0cec2b5ed98ce532d8a50260aab0a579f8f599266c04d629931b03532724693f10d7472da84feafa5a810d4bf1b77c08779787d2f32e21ba5f11eb762b0224fb42151f978c9f75bf21cd57bc9773c2bbcb325aa402a1e9f327621294b4ca32d472fdec34db85405f01755c33daa283f12a6f8d9281ba0fd99c6beaed58592dda159e6321cdf82a06b2a494a7944cafee1e1ff06e811f2b9c9c1b3dff6c412cdf102140b1d893d0cc25a2be90ec89884a4adf07d910e4599851338ab0dab009f6827c863c7458817e087f1481a0458f80adfbbdabd0d005cab81cdff080ceac7dd2c77e10178572a23d624fe46e984ca54bd9882ae8a713c444d5fa5f77ce3f348a75372e630ae2155725ea5e2d8b5c341861fa247a4b16833f1c4683a47064ce5ea28b000000000000000006517d00000000008b5829b8c834258fd34dc89b06bea9d9cc567f5441ca2a9a51b01389edcb6818a68638d0fac3bab9161e71a39770d1403ade00c098739c61f9678877a5eda92b62d8b51130d76fc1ae036ed6ed04dc6a9c8c323efbc98e971dabbf2ff47c6f29000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007c6511cac86d4ae8ded1432b977a4b57fa1861645d6c1d20a423573517af102ab28b170a58d4dce4709daa657d8ee167a81f215455f44f404d91686bb09d9afe6d119641315e3d93b4f761e276bf1fc882185783272c73881b6ceaac2efae9ffff970776552f3972b67f776d68acac166ab305e2942d672abf106074a899c4060225e29df76a0474a6608a0ad211b72e0c403747f83e136dd3933082c05070e045021c4780872f83dc99f57f6c4ebe05c4e2fe4991bef8cb995a1efbd7e8bac299cb0a08eafc2f0dffb0bba99c68cc056fdaed14650891a40eec9707c1aec9f80b1edb885ec5fb7ceea5ee42f69900b83655296d1fd1601caac296db740030ba48103203078b94280bad9b383b7e475fcb6db8028590a624c2b834f7d4093cceda4ce3330207f00d3effc3f36880e9221ce2d897bc90a6a1fe0e9b26bffb5a2cfe0cc8f5610315f3f0763539c6626d78a212eb978343c717e89891f33b6a304ec7ca04f4fea90309373eadbc006343f7bdd48b3a0fb7ff9370cf7c6d5b78ec3c51dfb49b105d5b0308962eb59d46c496154bd1e80522023b395c91447c084537fba41d768d27367e1a3e9ad84bdc3e5c0f5cf5c0cd7b28e2cf923c0e9eb6e70793a07517e3adacba9b07323e421996718912a4265a5a931f5ca63def5b50550d1a5bd8f0cfc1d490a7eb8f507f77220a3475b97ed500090e82cd0b02e2e16f85b0ad2f4284d71f0d02b8caf3ed1aae559bf66142cd67607e087e4323c6168af9c516e04dc8bcde978665308e11eefd520cb81c2346a4df0640b43f8b711d25068b6450ce24812c24637e7650db0838923b92ab96f0051b1704d2c45187e13bf71c6c189e09909bcca61f06efc4e12adf2decd086fb347b6c2b93217f943a600be9b611a2ad2788eb6ef4d78facd2fd87530db7f24c56f8b28649cb80334022fac401ea2f24d60fcb908bc7f4549fa0180bb24c0b0482bc11042d3603f67b9a0ea69d34fb51c9ddd5f6f453a7adca68236ff78f8cc90ed605dcfc0defffdf05e4619c0180eb6f091353a6ff8e48562cfbd16124255179675bb7d8d2f9686b219ac98cd4a89a930520be0d956ef891f1289c3a47aecba047da3ee770fafe8cf3076cb0333ba5b5194afa321c320b5f28e5cdbb3173990be54d8ba2bba2dc82c577d5a858dd2b63551da6b11b5dc5f78bea82fca6620978ba46927fe4b682ac89654152b93e669787626ef47d456bc12537bd1c8f452d00de7f36ddef8445e9b03ff604920751808fd57e9ae2ba290886f260433b75348c87f11128fbfd01cc4c10491366e59c2e536249137c5ba8ed9c031fe3a2e06f7196f7544d1f26e9ac04ef528d289585683f7ada6d07f53036a3cec9aaa0e5a459c9113e785fa567f801463bd8ccef32d6b21edbcc4fb0c60fdcbcf333f41b726863110de5358655faec7dd91cc0065c70291272e4369940666d48745ddf1c472c1a7e3a4a532713516bd38c55ce165bbc8e1a49402cd27a85c6163f4f1750e0290e2adb42912ee9ad20fdd6fbc1550ecf64cf56759dd58af8e272ea19cf4de21cd75a9433216f6ded2c141fb2e9c6036c209a24ad373e140bac426d0d485f8ee57e1523b983c4940706f7655e47024f97ff5014d15c52f6171e459f02163cca77e5e2442921c34f28d5da8ab5fbb5fe01cd1291775576a5f0ebd4cc576ea2228ee15cdcf04a332b8e3474afc816840f5061457a9c5ec8636281425e3164328f856506820cb6333eb5f9e862ef29966a0a058d49dbb2020b20324aa4a8620766fd770e5c24b8a47cfc58500b2a10fa892f9887b76219e18452303c676d972055172359268d978617fc7c33eb1f518488e63ee4154af46ddff700dcb0e9f21ff581ef515879daef55512dec9e32bbebe06838d890e94e11a2bafa54253692f146baa3ffc083e518255957e0db63407855eb0d092013e65a6592f9664715203b22b5d690b4197cc1b6ea3c9f0cae8189a1a9e7be44dbd684b45e6cc8ab8351b124384b34266f55ad4e6185e12d26491a11d959fa11e72b39bf0d1db486fd69c17073f4837da1a91345c080176cf71e3bfb3d4d5ad492cc2e9c11c9f5441a83480b7c18b3bd702a14fa8ea00de8307736cd15a942379aba9e7f4d4b80d36dd7fcd2c4885c7b3e5d1bf19a48b10f16c67959c069f3c065e86d8f44886bc98a00a98f22ae2f055b82da06d8fe6562e9a06a975387c4758127aa5f8a3e3f0f414c0e0d9322a97d927f0b8dde4736fb1c745d40884c5857054799f8b56df167877baf4d9b70eebc2f10afc806fc65b1e4ae5cc2fe3ed3a0fcf1dfa5ca9ce1e58de59831db53e19ef64c706f7102277416195396d8cf0315da96075803e14f342d54b69b5298f78c4ebf449adec5a3737e71a2e18261b76d3770bfcbc53bd10fc43329ca10aea6dd03", "5165ac6352", 1, -449094173, "751171cb6bf738ce8fa49e9023cf4df5ae5cb00e7c13b35ae60c5c00068f07d9"], - ["8d32f309045512eb43c624cb4f073ca8ea370ba2ab0ff99d9b73f4c6bd04e4be8d3e38c592020000000251655a08a6392f9b43448cb388b40eaf0ebcbd4f468dd66fbba785414635c3f5abe084eb00a00100000003525353c57fb9dd90d233c6408b2698977b19e68733be11c58eca67e2e8062544a42aa28c707e880200000003655153274926228d438f9cc07740765a80eccd321b3fe646da007a3ef37c6089e60c39650abdb802000000086563656aac6351acc054a02b021674c8030000000003516552aba4b7050000000000000000000100000000000000008a2c8e04000000003a0307e4a6e246a67b395cf55e17e332212f0eef7606ce0b19b755483cf9b2a21ced741c2584b29fcf5226036c8590d08af5abc18d179727b23fc6effcec7afac02349fe506815c1b1169113c3ab20e536c24d0bfec75dd97935a88845c982c600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e4825d8e4c8529047e529ba2d392e99915cceff7771f9b547e1b1466e9fa37c3c6e01700d16eb34a80363eacef45417960f10339f3b0672351be2c47f7a04cb176e556ac1a423721660339266bf00ed5e4168d912a81cec0e6ca9c5fb797bc70ccc4ffe1cabedf4e6d63de9918434b144e8594dd596ca8e9e702e4d7a2cc9460030da10c1591258ddbd3166c42c7d58932a8f645c07acbc3e6592ce5409fff23320211080dbfd855da1ffecbbcfa18d6a59304c726a0a21b1a2411e675a2262302190b03794c7e04d67e36c7ff20ba26f94005da6dcb226f655188190fc7545f6eb5420d13f7a14a2276e5ab7408aaf0dac8896b9c9eb1ce871b8fbc7114637a3c085e022e9a0d49dbe1f54172641392dba9c5b48a1fc2a6713cc8ae54de9c0b71d37619022cdef34f4e38e73c5f7bd45b6664476640175f41c68cae6095a6058772253ae703144ebe874b97d32161027705dc3d3b7902982e9ed9ff0c3fa42e1b03373e0afc021c024e317b1284521fdd2fed288eff379f7221c6abfc5949b6e991218725463603141f8ec5bdfea8c64d02390778a7f294017308d8301f8e5cab31f4408846e81788f84891d41b32fb9efc394bea8ac31641155310eab661a77b4afe50180eaab39a225240122540f45101bda169c7a2994353feacd28515689035d347f7d17a4d0da96927b47eb0516e87fd0942f84ce635ad0b4396820f1aeaccc831b60153862065e16606d48632039bfb1c9149eaaeb5a44cb9407c0b099f283b17ec0e8dc1ea42ceda9e4cc09287edd54669fe94c15d1b0d4d8faf7bafd46007db548b42188db94c7803cc86e75dd9a62cf57c40bcf344ae6289413b75d2670f078b30ad4d05c7ef1e7251c44277f15ac4fb5c3dbc1e3265db72d7112701d45ec73be3f74b78f5785b0ef19ec67d77001deea66dc0be69a1fd653016d21ac12c977367e42b4e9497ea1ee3e8b13a8506eddda6a042ee053514a3b0b9f127a6293492edf6ee492b3cb4bea095d68ce30c6c24da4be91223cd252e80f68a8bb8a8f76ab5d3806cf060bdda27ee2be4ae0f2eb4ec0e062ff854fe6d646db4b3669d982163accec447f237ed237bce9f55d204cb011d527bf790ee6431174d7bcd647fd1716a4ee062f75d65341e49e4fc6ee3641766b59070692640ba9850e0e8b37083697e5f47a96e16995635a173d7ceeec8a7cff85a187fdd562c6147fe962bbcad30b39a26c7976274f30824dda501ec2d4ef071ae92a4be2b080fede66faf0b1f9e8245822bfa81267b9fc154a206383345f478dc6eb03694f6b7684fc1565375529acb8b2f902ec3cd823a1831baad143097ba1c1820ac0dd5d244979f46c5a83032bd441821042d8c33527a028d82b44b55bfad083d7b947c66642e593e5ed704618d4e31cfbb9f88749495705a530646b9771e1b9256e9845998e7acc519d178ff4e782166fff7e415f01af70614456e1ba3cb85b0f589f2d584fbdaa9ce8254cf51b5ba960b1c7b578f6b51d1758242eadb2059038920291963ed4ecbe88ed0c7876ca405520f2dfca8ebfaad56c3c2c884e185413ce9033039a48add278cae3eabec85c0db5fc290646b6fe826ce33b154ad43a729bc2f64b02bcf77bc5b125c9c9d19837ac1fe804383f2b74cddbc72b3b9ae3e850048673acab7f6cd48b27c06e7c05a106da4b0299d30063a7e99d92d16703d53e77d00bd737fcc89cacf61246f66206b54a2ccb08f12dd82dbbad8ac24a4f597907106e62350dd5b7bb8b60ac7e48e00e98f294d2b1b2b6239b9673315f26141c949ed19d168a191890c88c3a3a63a0dcb1303030b173cbc43d690b44455d976d8ce2c7599269bf6d7ca2cbefce30b42888f73f72c3a8932662059fb620166086d1aa0db3c2471a9ee1d3632d5ca2b6e153ae9dc7d12d1c7f823c36eb019411debb2fc6369636cf16c48c48c42828bdf789bad4736bd104b5f8058c68d1f3719beec489013f2c04ce09bb95180991f1a3798c66851c791d5934964bb499a6fe39f89ff9e247e427d1f10ad5db4309c498bd55b91ac3e8c22bc8a73834ab0513d1f58a335eaec77dd66a874ae0257cf8115235b78e58916a2fc43b7638b2ad13c08c5e41f923191c15a92f7cdbfed34a917a8b86080297a80eecf253231af5d9c69d0a0b26417b18aa759ed663f7cd0193d55a8c5429f0f40258907efa2b4bb675d3d015d44e0afe77b43d63ba37e103aac60f7b236e179c1db806454792b07e01d361dc74f5124aded53b8969c5cbf7e0dbd911a76cb9bc492e1f7c5388989ebf5adc021ab383d0b5e8cc15a6f0d9b71007db2d169a386511b8222405dd762551da005cf8c3f42079d142a212b9f6d32571dacdceb5f8fafd20dbbc54a1561fa44c1bdf266f5a60a8b384cef9eea77eee2f1cfc0797238ab6203a5b6c706", "6a656a526a", 2, 2110609730, "7c76433c7802ec4be39bcebc9c0e4942f6313b1e8f5a039c58435296d17d0e96"], - ["4f4abd18025f4c80c8f482fa8146e4114a21560422f1e69649e7c60d08813c693e3eaccb4e00000000015280e734189c718f44bff3696ef0fccf39229e9fe6133d769f68aede88ee3708bc4b669095010000000953536a515100525352cd48b21303d24ca30000000000096aac63516563536563cadf3f0000000000050051515252713135000000000003635200abdb8dc400", "51", 1, -1561790416, "e249a8db08c867ee7ebf41ff8ca9381efb8b2e507cb825e0f5afc406a7bc6e4f"], - ["030000807082c40303979efe5fb6171475ce34d295d9613d2a19a6c7b4e8dd80fc7f310b4d780a66460300000003ac5363ffffffff97b142e8964a5b83845e186663a56c601b89411279e78e496c4830b11c4196db0300000000dc55d62d3deafe19fc04b59dec5d9b1560f4e58bc79958a1c003453420c8472b2e737ac3000000000151655c187f0345ac690400000000066a535353acac26c96c02000000000553ac636351d30889020000000001000000000027c8f5ee020000000000000000867635040000000069b6d2cf847b0f6e696f07ffef606d3487d8fc57b686bd19f373c6ce1d994a745fc5a6e0cb09f8dece124e91b036f9f0e030d817d16fdabf6e72e2bfec72d3bdc6bbc16c15be36027df79d0e01a264b4a7e2d8cd42284a8253f3c2b5b8d3ad7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d0650b0bf866e9ee78dd85f87359437afaf29d84ac175ea57ddc46d5790e6349e9717aaf31b17b30bc1abf4cbe2b2df46bf95dc5cdd95c0b024590ffe7aefa6a37324fa519c3b668d9296a5fa49498e17091fbb1e54859f1e9b80080541378c4204ec7e21f840aca0f8d8820d124e52d48e4557777d8ec4dfa346160f142f913031c281fb6fd12c2a7b6f3fc5c4a7fe9a0ee74e5ce4451c7a493dec92697d2f9e9020901ecf02d952428f16e0c85bd0f9a545647ff441b11abbd2cb02e08a3467e860b054fa3212e082495ab328829d8a8271e70d5278722c726753dec6e8ec90232e30c3cdcbc83fc468b48b9e2744cb97374454d88a1673e2d104024d575b317a3dc030f08050d2e5fbeb4f374475a8bb6a878b6a84cecb10e3e3472dcc7270f68edc70220a6c32107f324aa8730b3dbf32a3f3315bffaf5c04439f7062276402faf0338032f33347bfdc26b422bcfead6f976e42978968baa621e02b2ca6085d26a866cca0325a7916be2a25523aaf607e5f8ec4ff23eabb1d849523a2524947ab7fe13a6a20207916b9df7e91b8fbdc08b7f5915b701a00025e4843ff2a08c39f03b66c199d6e55ca2677024ce55cb9360195eba98ef64806a9995433e59fd2fa74d62158da3f270a9d787035acb3c85008feb4c43c48a3dabe56298303bead4d66e485ccdd763431b62654536afc8b9b36e5a6810c014b30f85fcaf39115fcecc3c4e3038ea4408a62737bf3f04dfe3c7b494bf221f2db34c8a6c708abd91629271c8a37ab13666fd4be05cf9c51150e19f9293c57eb399cf9dc038a01f0b9fe0c2af713f9908a12cd6a6ae732a63de240dd356a0c97836c0ba7b73b209a54963cd2f304edc54833dad2622c8d1685f998d5d9568613a94401a361cbd8e6fb20e680cb6389074fac49406232f9c6841233bf6b69059444b201a53d58b46013b7849d91243ce7b633ddbdec177c621e7864e9fe8770f3b08ef3c173cf07d993eabf04c9570e9024ee44667d028dc825278f923538b3964699a6f3a74f5c00bf65ff340aa6d0c86acd4c5b772aa4a4764674f5a9cb5ea874681eef238e5a646f199b4f6feb7b94c61c748f374ff3479c570ecf2152e2ef9b0546ab343c7f63f4ad6119addbb8c6584c877593870e8cbaa168b9af907ce2c3c52145c1fd2e73e2b3012536959711a681f755ef36d7a7692d7378c16dd8f785e0326b3a2671118d4289e4a3264864b80d45c904b710e3f68a66a69ddab00ebae6610d6fff5d8df54668b1f669fe33e7b45fbc96b451bd0330a0850c2663ab0b0c9fc7168a7d01acaa0412f8917c498653e5038274ebacf87f1efa6cde99acc3799945c733b7f01511793cf617940cfe9b26fb4e7cfa3e9e5fb1400a275ff2923c7804476a75a9f885f2bd68cdc628c6b94d46d0f07e8826ba968555f3171292d5e90a2baa4d5bb5c8525b4857bf170a51a6d89874e27cdae9f66f16056be1f1f624767cfb567d1d0fb8c933f93183ebf27e6edefcbbfbb936b481de5633a7e1ded150ba76f1f1c5c5cfcc0d4f3f0cd2880c4542a4c5e87616b3ad9e0e6b32c30e83b8159798769f704f9bd248d8ff0a5930fa821709fa6ab4cd9c74dcebea8fa8c0ef52ed3c43acdf1733a4414137e6d2d76e1807683f34e77b73ca4f99565389383f756005a9c1832e2684ebb480d40859510b05940d43ae7f3b1812f2e51e9caa74a7b5c0716af77487440e7d88d273d96db861c386da1582682c9b7d52675a77744cd1c652588fff81b2da2ac8b9a0365154604302e0b6adca06987cab0a367dc2ac11a1ff0e68b98c4cdeba0477bf897e1ffd94b3fe05c4b90b3e789bda2c6134a77fcc0715814981b926969ef4cee9a31dd9d65803f022c707a230b88cafc0a527f044c69ad701433241d260d0e6da56a8313742352f90d13e0c9f0cb7b34903a1c92d92ef868dc67e522ce6fafed55e3b4d46427c3e75f48b982fc7487eec3990304630126800f050ebc6bf5065399e16068b0dcf265034286f1978625c0003d0d9ac7e147350af756091740823068e74bd871bb36dfca85bb6bd313300f7e6025d131bfb3f415fcdde0f17f0a50a419c645414c51dac69884a4c0287f65d436fb265cab70c0809924ca924df59ce7238aca4b55a43b01b4e0461893f5763b2eca5de751a29fb4e21395f2f2485e35b4f69d897eaa080a64e296b871c32b03e7a6ca0a1b6bf52263537462d789197fd25cf97c9ccab9a6437deb1d48980949428dc1838302aae65798c8e0ee8f35e9e61bc4520cf6269a7030542798fe000000000000000023ac240100000000a2d474a5f46b680a295cd17ff9fd63abfbe73afa50229583b52011d814b4731f818c1823023dfa7b8d8e9bf51f9a15ce45ea1ee079b7e30e379905e510ac65a915dd7219671006ad023c0800d51af53624a6890d6199ebb841c449ae21ca8c2500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029b3849dc68eee0d3970c6d90f6f84fb0d01acc8485db63637b68e521580e2e0bd142ba5314d1e09af6f1fd826ca8076b6e8d977f643106c72ef6619a33bc3e03e4d062f68c8c3ec940287e4c6b82addfad64baf9e7ba3d2756839354628f8f2fd469336ea7c5fe03c1510b88a07922ad89ec911ad8b2bf41d510709e023bf0030a8bd6976483cd627040f2812e320e2d4b269472c0ee0fdb7de3cc40233c15760330228af3b138cb33d2e892d8a598d67f9f44d062317920be3c67e7fe18a7bea50a0535f2d44a998b128a83295d75890d9523efae82aaf666eab7a04a2c8b746bb3eec1acbe7778f248121a1441fcd3731054f29949369868296f57e36c6bd12ba5031770d0d2fae9ac3698c0c4cab91ca308b947c673392564b25eff367e64ea3a950316f153728a6411426df1a6f3a3d005853ef3ff072cd1922cf86137cb6d5dbf2c030a8a768ecbcb3ad075ccd43e5f30240b2f9f75fc94271cd7ce779455957d3e270222ea484b03633c0109f1e8f87da90a0d4d0ed4bab4dae070e5b8d981552cb836020c07f4fb5deae30412242bf482685d7294aadde644445aa3937f9ea20898301c1ce3f0d7b82541b0f01aed2cd808dff9cf245e88b80f50d4f3ae2dcf91b0bea052427ea589dc43ecfbc5f4b91abd6e51387906bf259aa2ec08e9b8b37a3cee91405ae27a1c3558e26af5d8b1f872d90a4d42ff231d390a5864bedff78c275d34da9f119b5d14f70b92d42d8b5f37c2a80ecb28780b95e77611f902b085c561523316d8d7c4b4b918a18eca0476ea12ea5a8ece27efcb17995a97d62155b5cc77135a8e05310de850b6ea885ec29d0bc8885fdfe11bd9215d33675618ee88c7130fc6d67612c3f3a03853022e4493ce85f811451b7f0d31eb9a1c7e89dae19c898e27ea2c760ce07ef73890744915d30c932bd9dbc6f6720b31d9b6b48f1fa4010e1d15f1972401ab220ce4cfa5635051fa54e25aaddf90e35731026c13c6a6448824423f2e0b251c8e1e5a083bfc5648bfcdaf4d13356fb9729cd42c1b2fb37d783f03cb978f3ec17b34ac1fd9114766de9522dbf36df2b0f9f2927144160f1c39e8b8cb40979919af0fef957a89c22c60878fe95ac6820c32fcbd07b39f846ab9f36afb09830186242aed1b594e9eec61c2e2a46bdda6d6d53eefe49a4cf25959e0ad4a072bd7ced49e68726f08443749b61022d2d418bfa17ba1a89c8b62b49c41edddf397eb090676aec3c05e5c37e32323b8b574d8d65dd926b7fd445bab235d8751cd57d03eb650ee2b04ab7af15055a4175ff77154cf4511bae07cfbd6c873c443a7bec5137c569f7fec77e0a2bc037ae7d7d60a8b1eb3036945e420be9b545f1f829ff7dcd9c7d1f629d615849f3b8626fe6459ed7f29098cd3ff46af3a642e2d43f002eeb53f0d8ac28e3e00ce307c149b178b83eb2d47473445f9e31c49395722007b8fb1d92003dfad360b78f3bc24a1db95fea222bf5f4b21d94d75e7e67760856bb6489f4943ec7354e0c0f50a85cd9727c80d389b51eaf18b49a118e9cc566e0c0d7303a4c90bb112b1ff9c8c899535cd2e4a1d9329b77dfed05f36af3f1f1a943487883e1633e939dc9b26f1cec2647015a736c2afa8d87ec5b1b307f5face404f437837a471e37d560fa0bd79c2233a6a9849728cfbeffc47736cf0491d62b4b0b65284827d260e8a8060b898e6f96c390c1acf1f27cf5819bd1e9b6788005c88261ba30df0f6ba4116ae3ba2a4e4491c6120ef600856713cd65b40d9d9c5f2b7e1b82759a94756f796a2da05b35b86a9762fc07de90201b1ed6b8a79b5e2d08a6c8b3a6cc0ce5a8c2871d5c9b21892904df3b7c6cc158bf590f3b126c1d9be7d279878bf078071115383cdd4a947dbae71742d1622f670477fe32e0f55fe1a60f71bddec7905e263136a88989334e087bdcd473e803f21f4d0fe96c83b770ef5b8d0cc2aefc1199dc90eb5305fd753d403803a128e502e71584f3ae5ee611a234fb3b8a1023b384dfaf6abc1d0ec95489209b500521efe4eb073f6b992e3bdc500933a3434f014b7d1a4541a80764d1255ec34a0553b3cb7c033e18afe5a615a90af53292677bb2e789ace182dbb429bf30ecd045eb04753aadb9b3d981ed443cee634cb3cd14599f62b92a8ab32dd9f79ff3995c04669cdf8c2783e1289c42a7562ca898697e1252143131df030b94baf99821a3d9fc0ef5b7af453da94e1d490d1d06b0685afaa3dd2e7d0c975ed85f937f2819102520290d8e9308352d40e2a93407773bc40a0dcca27b16eb5e0687ace46b3f62b5b5cc0a167ca92c68808a8a708e8f5868f52556ef3af285a67ab943b89922a95b9fa55d0a11a08f2551878453c286c76d4bac3920a941d2525c9aeee939be5f0e9e9c071d87f32f45641d5ee0f0fad885991e20a", "53510065636a656a", 0, -862881980, "a6ff71aadfdf381b53f275af4834a527744094a8b4561bc99ee24820009d8dfc"], - ["2c3f1f15036c61c0791a6e91e00ff4622d0afd7902423caa77d8158fb8cf71381e392628dd020000000100a9173e6d50e9c0786b76985fc45b464549fbb70144c536d4e3599f3ed985b8277171bd150000000004ac6565acffffffffeaf7804b402d3ca8fa7a9ae655f144310d6286c3609ab33e163c71c9553e22d40000000004acac6a65dc0c2d24027130fb02000000000452635253f3b0980500000000040052ac6385ce1777030000000000000000dc7845050000000078b4a9fbae2df458b1c87c576e42e89f8c17a9500ed631a955f2bfeb4be06a7c04897f0419c429192dcafd97f413f3a8f3e1c2b1e90b126e4472ec34260359fc0402b06f4e1efa213f6a0ef92d65fa06f2225538cc1987db6d0bad369dadea670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d0a4c05c12224948927d9481f0a047a2109fe14d34c062b36a450dc85ab54eb3145595d71e844d70a9721ca0ccaab72f3f513acda35892ae1af76d829c2c92047cb2fcb45a00d9a03ef92320bb475a2dd50f90d68e3cc04fa0213139b73490938f8c328132744ee886925370c7b8c68ebfed5c4b6a6fa42b5c7e5c825eaf3602288bfff19102beac144e68df2e2d5ecec225d290261f601d33ed99fdadb9f96c030423bf05ff6fad781972746a835570c092400bf34e3c49804f3964aac269b0580b0913ccfb194785d1803767e6d0f3b5ca2438c2d3565da8ac6e04e085f91d33ec920367fbd45677c7e54e5f56f06379de09354d4782e0df88cd3b5391a9e5d8e10213343af7aed1220430c373b672be0ef2978b49466cc42b5a8a5cec63f15eac0b021416689b422b41316ebc13f558d6ee17dbdfa8ffd4be967666c20cc1260aa229031e4d69e0c3d21794de2f74987e69e83d65521381e07a7fa3b414e0fcac5a79590300836186b88723f7893b0178e61a75085965e87554906ffa27020bd124b9e03b0210ba2ab21f59d3708205a765b2c2cb0dcde7d2d5d1d69c45322617f5a0bab80bfee84e774e882a94ade6d1743256e164b8bd09fc430b607dc5a0cc49e90bb1f0a86a1f0859b5f7504df8edad45c3c8fe9bac1a5c15765cab600ec484a25642bf247e1ffdc083130c310c93d1c96d448cddfed6cf19345da7c90c7ab8ecdbc52282a004d4ddcdcc65a0b33e511b11e1bcf7e48fc150530963759d6a16fdb4dc61e59b6b8e9d2872190ed95b5e275bb5bc50ac101adaaf7565ab0b7cc19bf46289f7ef57a30db90e045f4b743a5503e725863ec929829bc573b68f6ced55ecc73adc412df2a4858a818aa657f2e4371eec88b86245011a4ab8514ec620b89767f61de7d7fd5f142d1b8429f9815ec6c76f4e30d237210e02565c8e25409944d669f96aff93f5ba1a03dad2410567a8d449ffb94c85ca65dcc2e8e0c2ae22b85f7d3b2ee6f6901f897f862571c7cf167859f525f26c66b2b78297ea9c19f2bbf8f826a83bf3c9bb8786bbf6528d34d05cad0a7dbae8a759913ab274988330013be2bb9bade108da263f2c804b6b3e99a105824d700a189b9afceccb8340f7e8cda920e2db1d735ea0eb56e04c16df4fecb43de05019079d4f7517f29ed5d274e8f907216bf77dd01afe79df366baf1a2afb9987e4c71373f7db206d2c580748ff43cd7f2cbd3b571aaf1838ea72ecce6b893a01efed91e3fe0d8d36bd40f9a3bf6c29940aae9b0624fd80930c7443cf6d0fce3cdb6f0258d980e4c025b8f92542021c48936d2887f79fb2665296ec378e0cde139041fac81365cbb82e5a2db13243f8f3eeaeee5eb5a794f6bbe119bf283015904f07a8f3e1f7fa2b353d458f6152e0f34b964911aded7c5c0abfd9eb60ee00600ea4fb4ad42591d9618a7311e6725b9143d3aa244f7393bfa6eb7125cf2b14b55d32d9e5a11981412ad3295d83d17f2e8a05a65bd111024721f325f5a3cdc93a27b1743cb73921d5f815ff8cb89dfb2d6286f4e2a261d684c4638fe7d8ca074d1cdad578924a7ddd0ae1268ad19586eab1e5b2fc593a68dda3e52cb5cf650a7488110cdf63286f59cd60be9677b90da5af4d591caad4a8b1a4a54e2d25e277c28c0098ea55d9a45155b228e0a00991aad56917688b400d45568360f792ee811c2dbcb2542c7a99e7ff72914a694839dd37245c6f8067160abe612e0e77335120e993dd5496fbaa4a19a22d55658c40c8ec289316717ea03833a61e4f6455403fab99c64fa786b78df0ad26c9f9b66eb317517f33327122573158b60f1bd74a9ec979ffaf8cd192a543b3ba6bab2dd19f861b5fe2a6732f4b149f2a2b1267bbcb6635a98537beb23044fe8ac0545c2ee44c81e1711aeda595792eb3f1251c169dd2974905bcc119d62a92353c22e346a3ef49ad93f54ab0e0bfa083d4c4349c7be1923dbcb7806797a1f2b5fb7d4b9ceeac8772a070cf2b40cd885006cf15529ad7d61927bb4482a3dcfbb144d42c505c4deda5ba50eebc46a6e5b9e381130a4e8e33d21d6d5cb4509a5efb439d5f396a95c7a3b1a76d2c1bd8c5fb82d63b3e77adec688c5cbb0b6eb5302394e17d8f25c8a47859df30cefd15530a397f80a00f9a06e111746d7a6d384f41c22f7ca2e6b65df9bccc39317fe0f9350040e8441a30d0431a5df8a8037138d1d23112db36f73c55853e9213ce28395cd223b24535498eef5b3a491bc0a7e9aa2687a4e71520aea1a5222e513d64c841231e5f1fd1b182cb0300000000000000000000000034a9f42f954dd131834a7b11293c8a95b5ea011ea3c5bd7061dede58e813f4b9ae6b913da7ba7b357416ce490a50d0e8e8a30312ad227c21e7a8dab2f5a362eb2ef0ad56ce0957e1288c330cd013913bc86e847dff87867ea1e30e8cadf3eeb800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8922dc51113bf08ea48a40681b713818af40cff45177182c42499d9c792905b21eb793aa4e29e96062218011064424e92c98af386cd2cf9cec1f5dfd411f2e68eb1055281a3a9223d1b006170d6914f5a98c26558a09a7875be607c5be9d8ae24878f99326afb619f620047ebb7d2af6cabedebbe30cda76b788be1d309d76702058743b0818674cd7dacabea792140c10aba48586f2ae999b7199e56b3e7c08d0304c5ebfcb91cd210022adf6f7f3af9b67479eca46fbedb298d87fbf6517908d80a07f1493b0e3c91b8dc72570f0cbb277defc184fac9d58db536b0b49429fae45d6a1a120a7e2b016af7c2bfad4c4335feab06c62537774bd451cacbf38b75b3e5020eb3773452f2a2044328c3031fec85115ac15a9c0af0d0f0b668182531e5859f030812c121da8f7f6cc12522d69433724bd549e02df2098401a3b32053d27daf7a030dd314839367c8d7af55ed7b81c37bfb3cf3558f4cde46b1154f8b421e61b0e003117ebbd5f9d010ec5e6399fa32789f9795453db895097a8d97df2ff7399531bb0323231368739493c2c1a4bd3bce3650953ad00946b20066d5f67741620aa4a2ab05fe161193e915baf2a43c52d5807eb59248c12b47f9b3501756697cfe1272c184d54fe78cb9b1b1b584d1f9d803e28e5fbea71ed7e8d96fb1fb42a0255470f5e4dd9c91274976a2cd091118539b688031be771e66525bac07627c9b9ee5071fffb4d7e99273fabb94462369b2772d2361906ce97471b3f403f901591a67a2ca8033cc0dcb28fa97478ab1b6cd51dfe4636e3b50d23f15802e677054b7c72d74cd855ef2b7aa5821824b3fbacee8fe3777f630befdab09b036cabcadabb271accbdbeca718dfec07cb86773c449a858aeed6f74ba112e1724a9ffe9519000c12d7da2647b732e8c391c232977900ff4ad84e1ec84455bc05d3d0e7183cb48915d39036abdbd7e2014eee88e87bd16b30365227aab2f5c04b4473a01660cf1d508358a23a9487fa0d8265e210974c6f7ce33796bd796d943777e521e9d10c743093e6190024596a9333e823084153ec9e76465830f03618d384ccd4bcfdb1e9006286a8f398fa5d90cdee4b44fbd5dbcb600dba29f6567cde25299ddc0ff67ab497f27d64c35d1ce4dcef980670bd5e95ed61d5364036f551b892cc3a162a51a330496cdfd2d6d708730789234655a49001d8e973689852edd37b92d2ea3f67767f4a15ff392fe03c5e6086887dde0a84f40eadab4078a76cf1c0641d13b11f5f4cf93889187fe563379e5c0db8da8b42ba9e866971ca9028600a7bbf0436abf494f52d201eab323e63b306aac8edc97ae3f02c08387d51cc9488553ed90c4a5a63b12e72101183a5fb375dc116a96be4fc469ea57f856c3f11a21c5ce0c0dfe34761f3ef126aaa68a22e9f09ea799e9ba98164191c8443a303b52fcd341f35ff76de0a9445ac4c1dbbf5dc3bd3c311e92e8660bd583ccf5ef586fd46d362b75ae6e6f4420772eedd83580b5cdad1732435cfe8f75cfb06f72666c014828d235b7c352d107afd0cb802091334542a8acb7ea104f6af467d5ed43942dc1275bb7897a5849ed2e43eed1bc47acc1609cf742fd9a67b3b981a6218ec0932b1ee8eebdac9af101c88c80f022b6543e453917741f9a55c07fa475d8990b3dbfddd4611104d8f1d32992816c2bb21270438d03415457b52bd7c6badf9c1f6f7596697d2837f1f4b1c98e35d6367d98b616fce8f99c1fece4e6302ac107d2f05814597bbd45229c9864de2a1129949be3657b9b6f9cb4bf2ffc68292d9e63678e9154e211b0613750566da557f40baf210f8a6d6193d406cabb67fac7b46ed574923cb2e39481e10687528ad4f31ac4aac36365d02f535a2a42c7048a59a03cae4fc125576c0bedbb1c23ff91c7f1e3ebe2f29f106a18f3939243b5644c52c81e35b5115e1eae4bee7b265347d79f83efcfac924bf8ea0c3fabb53d8c9290db3d282e0e263ef182e7955cc68fb0328f713a6dd7271ddd08994f92fa711d27f80d95c69661afd6ef00cf41e4c95bcee1916164b8a9b3f5e51eb4248f88d33d8b1bece8db9608bebaea4adf498dcf167ff87cb2eaefa4d27619804b9106ac70055ff216b2ba952a64e1c7a8bf43f08e087d035540fa3592c15a04b393f24f2eebc1be9bc4f87d7d2ad7d65b4d9899fadcdfd924a01d32fd4e5b7b654c4fee29adfa6c63be5e1058ad5003f561e3322208cd4731f3e026c603be5a86785dd4ceabd9fb2121e58d9ea9ed37ac06845ed21a7c91265f0aaaaa52bd5030000000000000000000000006dfd899c871a8bd7115cea8e761161dc5bd132a89be15173979c3c06a5321e9829e0af89e7ffe70ebaf8c776f0e0c92d11f860bdaf07986180273022cca9ddb14fa0f9fe4301ee544a4797ce34063f3c7b992c3f8b7bbd867be69e6f7fb293bc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000957383d1147b61962ab6b6bff1606cb80ca9f9511a391fe31946d7378ff2e00bccc469cd06d586c9d7a21f36e8674ec205edc7b1442cabaa995088f36899c4243a1c8f8c02a9d896c8a840bad00d879e479c45bda52456a308a8b35c86ff1aaf372f56a5cb34a704188fd7dcac0d271a70593dac91b08c9a6c79123a0c6e37da02293cc90b40a49484a87111af31530808f9c99142f7663a09c6c55f1a127e267802222e68ba4f5052a63f12af5919637736c153bfacf6f3b0fcdf35c0a59a271f770a061398bb4b0ef6d07382dbe738730d4615244edb1b6d3ce927acb31c766143c6270ea571ab3cbc2bf72c612eb07e791e6decb1fc9c6a5eda0af01ac721fabd930317637a323999c360ba178dae31fae627bb8c3e84895684dda9a99ddd615b6bfb0306bf3ec2f39c2b945b0d8ef59c3d34cb480aa51d57628097637a8a5f045a2ccd021e96374a3403d58ca334cee992f9e74dd82ed93c74e2e4472364feaab2c6d642030532cb6ca0041d96f59869d6198ee09675daeaf50386d9fe5100a226a2966080032fa6db898d0e52dd3cd5b14fc2741f09ef482850a74a5dd7d6f19fd0f6e74272454851085d490bb80d48f1acea576cd1b8902169c515c3772dd3a2cb1bf5a9eb8f7793f1d908b0050a7cdd642f714830eda286c845b685d9367fb3eb8768fb7898ed10a70d2686c103a3e9d65564b0bb8573ab3644e27c486399367c49b6c133f11daf11eb2566aa2b6b48a7fc8629729a9b6a757b8fea9c47b51425f38eea6a72d3d3c94da343debe450a536ef78381207f356a95212dcaceeab14b0600d954f46ef6dcd97ec30b865df2cdf97b9ccd94e3edbf1acf8882f9daec2bdb43b86d8efe628856b3da0b588184d6a6471536148a8403629e90b537b7fba85952240aa60c1496524183b1263b1722398441b363278e8067f49fc0789d4b2a619abbe83f78317bc4da38de19abca7196a6e0d2870eadc3d7d3e4f64e40deefc82e5abce9b34fa06dc2b899859d102278b875fa0eb9d13e589eff5ba370fe695a06d26b31381944b5fa8fa35228698a8d99f8f1ca1f39faba2aac50f8cf40560c4d2e4c50a28cb9e1b4c2e789bd1990b0f7893ab66ff26b141e670096d7ef02e80e519a71404c6bea9c6a3dcd4d27ffb5c47903014e21fefdf5edb04f0d55cd6345f73008a8409d6caeb6630ad38a9aaf1e3df656b7eb04811bdf349efeb465fb019272572807728fde9baa7cb70d3fb47dfa4e04df1e01faae9c31cd6b5da79649615cd8be87a2ade10ad194dc814a4b107d17a5d41129d0838ec4bbe9a731f5b87835a50ce2065e03f555c707bfa00eafb8c183e8b86ad84c07b88d176e92fc1b6862018e0d4d804cf056864669ad00eed47a16f379e09ab89dbbdef8384ef84d3c26f33d1cc168700a4da99a2e1cbbe8644489caabf6a4be2951c1241257a893daa253fd8b81b5b8b9c266a5af81775f37eb1d8e8e5ac0ee6ff2b458ceb59d5ace8918157fc0477e1631c8b0ecfd13ec2d0c177b629758975a5b1ae13c4b32b166397376f0932557b0257fab3f4d9ac1450d85c7e5dff74d9aa4656644f1d7fe86c91f851dcdba31f4ca46c770ea0aaf4a3519ae36cd5cccb575938709825a1ebd8d1d66221d4ce750b3688e10bd9d2e3dfeecc6725bc5e06c657709a6c84777a0fac6369e9dbcba5c68ebd3d1843ea3a18ee9e30edd59159a4f2debd2d723ddeafd6bbbd6c1112e93e868e4fd0befc352a1e58fc9802efbd41c25bd82a54147b8912843ec07a7f6a3ddcd134bd73fa863735f36c822a429a63d562f8e31f86a8fbf5eea4a145e0f680053ea7b41f50afa4bfa31b37ca966e72081d3ace7a514cf6cca05a945a9296cb77fb484e9f4f4c0f5d55d44861b37ec7607f44fde8d3b9977d9e774c8340b969ce793b361befc5dd03478edd65b1b08ed14ee7632f356550f2b4353a4d86780adb071fd44d548938a9b728b3cc6e0af50bbbddb8dea3d59728a34d40ec69a4b472cf6af317411c0cd6038e2748f5c306a1c1961e5d47168a82981e2ad392e81d59f81ac41e5c95ce4b5cf7d9de94e9b7ed43ae14211e68a721563e7b0c8ed6b2726e832d8ae26eda443ba84b258d7bfff1bfe8ba0338ebc0c177e9752401adb59d33702e4bfc6d703d56669ed86ce4c50413a7d635d549f0cc25308ba100c770bedbae1c30f94425bd9b1336d0be26899b27ede87d61d001966c8a30ba8cdaa5cb7b35d04ce62751bc1a16985b11f5dc079de07168e79e41bd6f255b10dcded6fadd66f36f053209c933aba47b17da11a3fe998e11c372344705699711a0d31eca4940f013d7dd8bdd5ab17dfec378621d301219b34a817e3863479befdee5da38f67260b688f92a1339550245fdc682976c2c06f7423de88a571e6e0a6c761fee66c387da0547cadca09", "0065536a65", 1, 1081782396, "d9d43207c1b7796cbd7b5d32612a3ea770a7ec31f38c34294699a448713cf43c"], - ["030000807082c40302e227e492a98eb1ee758bf5d09a38cedea29c9c6db0935169132b849375c90e930000000000ffffffffd3c73d759b9d81d015fe2e542484ebf033217daf98e8a66d0fbc9e44adce01100300000002536307e650df04c4d592050000000002515221795b0100000000085165656365536351df04cd0200000000045300636556e3290200000000004a4cabe900000000013cf8ca0000000000000000000000000094944f6bfaedfc18671e5e3071d263ab655d8087da4c2ae9c6f26261018772b6e38bf55faf757a868e2d321f5eabdc887d0693e7415bf8a80e4db5c8ea56f9ab29bdd51ce957158298d3294b927eb006f9cfbaa4ce23ce2eb5805d64c34e636d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009fd5ebd7c7c951a07f2c026a31a5e17c19c17a0d3769715302538247f38a9f7af7ed70f0d99faf85c424ee91bd3d12bc693f4e5ffa8df6dc76fc5c385a9daf87bda6a3d328bea0af0ca8d763ffcdc00c5ac92517f643601c8e5528afa07685f695175752ddbcbda4119f53b80451d94858828421f11a1e316618c46b9e63818d022deac08b1fada04034c139d609862867d9f08de823b758ddfe010862e6c5c06e0300d602786b563958941d88c0a1ba84c5ec6e1cd0457a7adb953c7695ac300cc20b01691a261f9d9a7cce16054da215cff2941164345a81ee804425ab9df10a937c57ecea1bb70d23e85a991d7a8b33e016ac0754e276514133704f489dfde4221503197a1d04919d603237e7ba26341ad8ea1ec4b4d5ebd7412844fb1fea598339c6032a7337269ad5a75ca87dee309747eb82648741310af442bef93c4743c2789685031747a195d0a522f9e2174739cd60bdc3ec3c818c1822485c8491befc52a078d90210062eb57ade0182c37870d815bbeb08355da7d82d6301b4bc0fe40c956e3969030994bcb392cbc53670d7fe89cb1a621bd883bcfba6a18a89629fc7c8ee320efcafa7329ac5fe8fa84173c859275166a84643801d34885c01bbe2539daa7e90b8ab819d1ddf92c32125a19f18aee025620d31d1cc549f4144816babe45d9a1543e49fae8c85aa14978e1bf5be575f5c727cfd810ea356aaaf3e7bcb62f417e480cfbecf07bccb97626fbacb1f1e9a47197586296da2c6d72ae21a9eb63966661ee4c30576ae6db83ff3afac5d8803246a28c3466be123cc33dd6a8c3990bc80fb124a3d08f1460ad1af3ae5a6fd6da924f8995b84b4ad4f46df00f76b5476b12967e4fd25fa3b87e5ba030aff248a7d353a25a3f27bcf3fbefd3fafca55f53192d84a54b572f47186316a8e7f99fb71c4024620629d716a412a2ac7f9b00266c3c9ddd101bcd7a275b09ac4ea837dc4a96e293214681a48e14b7f5d01263771ccf7075dea93da07dd3c29365b4c74a5690348c1f5e2e9babdf22857e9041b99764198111900ec0215539fc9c60d6cd144391c4358e70ad0e797288ebe221b8785463ce486e10ff06fe949151936c3d0164a612c52046b56c4702a361239e4821ecce66ec2643257e3e7ad79d81657429db386f6234b824f04a5bbc875057e8ba26660d0e72eacaefb1de44695ea2844c7e45b0e5d5173c257e745b91d6dc1d53c0589ef417189a0b2969baf0f6ef67c3a05035ffb50296539ccb0c59ee57c00e9a5796b553619539adfb228e540fe4343acdcdb47573bd16743b29fd0b8b0b06e8417bda168aa539244b401c6e63290d70add6169aa10acad307b904515c9f2db0a7c4300ec26d696e2102b7719d634caaf51ab3d8d068e03e2869eb618d3c692f495b32602af5fb4c64cf18e42eed8faa6a6e3dabaab3f32979372da2ab51c9d2c6bf85d803f1ee1d59ed676ec72afc76efc62c698d58d8cbb2fc174946a327148a7f2abb97f379746cb51ac82b490059302a2af86c3e953ce083a745257ac9ee0556dc89ce5e26809d41d53bf70a16c79f7f956417bf4984562565e040f729f26ba592e254e1badb09074e6c57949bc14437bb8e44ec2925214167008c37cddcc48a0ab6a0402a9ea5c26a101887336e556c91399a994ffe2159428086650702c72b3bf44877c4f1aee562303100e36e3a2105ec38bd3dcc6e58614ca731c666de480e62af0ea94385c532bad3aa08258d6171d814192cd32bc2d1083fed7dbeaf6519aef9a8465f9802539ed2cf2f6dae9fb3f48ff87c13c2bab5ddef52c1d476e5650d9acacfdb83891d8435db88308e3b8f6f5909dad298224349e4796cc3d0b33ee3cf1f23f58f9207a329877614c3e881888bc622e468e64884d744a405ce5c86bec625a4ee7216ac62342551302124f432f119bf37a567fbbf62cbeb79f6cbf7639464ed3c28fb1dd90bbff9e33e2a3a0329e8b7050a4d8ad5dfa98d2883ee82004cb754202893bd3a7d95b93882ce2c7a3621e8439372b73f15b592722fb1bab60fba538ee88ff027e661f2ca946a74d78bc9f628de769df40883bef9a1ffd4bce50ee5c051e846ee729335ef6cf7c471b7af08bdff201f065cd7f1bef5ec676cd42c87f2e7cad05985bf529fd42dc13b49adcde6467c1ec35705c51c02238a5dca6d7f8d59255c26c34aa6384d8b226fc662648a61a8f3db964ead0add234f5ab84dbfdf26df4294e1a3457795e2824efe6a0e0c50b7e7c378b369baa7c758e8846caec8f3bb16702da6a558337c52ea0891a853cfd4e43b1308826abdfc74aec6b4f5a2b4b0a84ff5b8bc9229abce47f4cf2f0e34bb3c84fef83d77f9619a76dbd2ea5b606b379f579aef1dc9683a69133abf2225b25949286bbd01cbf3f0f78d53b212841fb2c70eb43ab7d00", "650053525363", 1, -67580916, "f2f7fc02447cacfd94d121494b1e7d35a61df4bbebd7925c365941f7b8445962"], - ["2d41733502caa7ca925ba8981e3ee9e45fed3d9e2d32d2ff7f7f3403b740418330e6facac4030000000665ac006353526dd93ac771636e6225bf8fe1ca9241e1ec0cf36f34853e9a7de88357cf1f44a9a421dddf01000000025300ffffffff0279657505000000000565536a0065fed75e0000000000066a6553526300c98cd6e202919e4a03000000000000000000000000082b27cb48181dbbb191724891fe4346bd29b20cb4e8e5030a66a7bbf980dec24eb281783d863d957bcd8ac88fd90c2ddab6efd07b11fb9afde897b07ff25114df121f8acaf2174ed120c551fc232c940bde330738db8363b2e6500ec9f005760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066025f49076cb1b371c7ff953ef83317279191c6494ad3f4f5e3a224a17ce549088d1690979a80fcd59d798cfc9fadf61ae38eab60bdf4eeed028ca2ee01c2579c6892e03cdc6a6c06db19dedfa5d27404bfb80d919961e49d5c2ada97301f0b639c076cc2380621d86bc5373587862dc178ddf0ee81f8f8df37b44037898f140207f007c7dba16eea4a2c7c7e443771f4285af0b5cab40a3475f7c6eadaaaecfa031125ecfc317cefbe2dd000ed01f51f3dbb5db246c1fff26bc0df63a647687d4c0b0793ae940c742d7686d739e75749552f06e2a69cffdd276b8c0f5ae89ad141d55db454f747abf4abf2b62bc575e920ba6e6307c4d0a3dfb2dca243e756ae7c19020a9054070cc3d39971c1ec651398fa65f766ba87e22f122d99b6709dafbda7260223f2c95b8d1c09ba4105aedfeef229fb52d45c52f7c9c58a35acb78538424e4e032f7c70bc0e388a9563240178d52e7ae61a961da47ad1eeaaf93bc74ee55f525d031ae16452e7e794e753876f18a9c092f511adb925bb655ba9f2f923ed513593bf032ae73e3e0f0d0659f5b4cd09454af71d6ef17bbf03952cf0072f5ee43cf055b9ba27bc25588b47a1bb4827a148aeea6919ba391649cdbba2fa771f3f137a101b4983193823634ad47e4737500b0f0cfffd1f94bb27673e012c9f603cf2f1ca39c70fde757a6c477d49149d0aeb2879435f19d8e922172e962daf244ef14cba4d323a43eef6fc26a3a5e4a4c9de4e6cdb375c58f8e40885fa9b5f1547bf4af9b4acd4dfbb980f560071bc43538d9a91026e849958058e56bd5970c2b2f80ee9295b0c34584ffdb169256e68ae7c20e2a36769a762b1b33febd7e5705bac5074e3e2768c2953ac08219d43e826fb3131d233ced7cccca8188ffc37b64a6a48c17e72e71614e061339f122f6a0b6ec9f9fc82ae757370ec4c56061f0df3f14bf721ceb79d70ffee2628f1a3689793adc1f1057277d198e4aef750ee61c31af160fee77ac129a3831c6e1d98cbf337ef133ea8633d1caeb8c1079ffb0f9babc1cd25674934f4773c622f375c69f7c17ae369cc645b6076833f0af2e407d34e7baa686e4b2e3fc898d712e4c0f4b0b0a5ff667c1b7108003859049d42a1be422ec49a4bfa5f35337d5f8928df77980211b12ca23b425fcb1ecc3cad316fa97cb0d6f328c7565bccefa1c9d3d01ab368da2b79a6baf582739c61a11b864391c11739c822c62afdb11bb86e5d477442165c42c6b8c09a8d29c1336a1a156c6d822a1e9a6658be941fc28beb6e65668b793830aa57e39ddd3f9e0942a272192f60c4a6f892daf4c52d19bee4bf48b4b212112db0d4cf4fa7b586700cf3c22f509ec9ff65e11c014a7df9373fc7e9928864433e22b33df70645af0246de314eb1fde9359b54291181f3c095f16afc13a91e114bf51b5ee87279a6d7a6a0f88747d61edd21f8ead6042049e7f0d719d522427caab79c38d66ac468376e3a460fb1c08001220098370f0703dfa6af10f19c66a1f51c30ae7e39901715f36954fbde1f921aed73738d061bb77a2775e2787ad09beac320aeae50573364607d070d2b19d882a655d59273041aa1635bea24ba7550c9e480c0b678d8c057568b14d9bddc2a65676ab2246ace576d3d02a0a42df51bde07af3785026fd641b0f7e78a0dc4fc55280bc8277b7e2671d9c50c1ae60d6aca61d712b264ba9b323ae66e3089a39eec49a1eba5a32625b90a4e4c4c061c040cc24b206c364afa1e0f4b0de881845d777e1413bf2152a5220d30943dc7fcbec5d0b30b4fddc599df20f8c24c2f7428698387532cc48ee028ec0e02236f6cf870066cbe6d8f9f104de4f53c97201609f838f1579f4c766d9257dca2696cf07437b16f7e6a2689e1e0b49516dc02cd141772f81fa9f55f2e73808db686016636d5afefb9a216ebe4c2948fd481d7e94d4cdeafa20b75f74897867aeec3f199e3180e40c45d2ad0b3f1497cabaf52e5c00bc57b1972f249893f927f1323ec2229b9c57ee8184797995bf5b171491845c8f3807714a0e94d0b2b3f35343de72e18df7f6432c174d206ca59176fbc1fd91f6c44ea953d40146392edd40a9aac872eb658c92858bb2823cfd91dd3889977d77ea3533c2b131b81aa5361de14f0e9b3b6cc11d3f931a908a5fdeea2b4edb4a6cad29bfa6a2efa478ca4840ac4b917c3767ca798b855faad3094b9eb7cc7a360ee10af9dbd4d78eec7a111608bdea2aae124969ba28df07c01f3ad8582a6a6a7ba9e259b5913b93dc660e89648a225d70486f7655d49a00100000000000000000000000086f520f42af30479fcd8366105bd4ec7f8a7d7d3ada898c6cdc4b690e6d84a7e2e025716d011a9a54ebb3e0c4d400ec68d49ad1d5bcfef3c1bb945c665b9dccdbf1b68e403e0b0f5f868774c9f3f9ce244d334a2fffa98f325d36f7ee2919c88000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003daf6bd13228bbb79f676e8045e15d869b1aed28bad1863d6993932ac952dfcbb39e8d2c6e01d4a26e3a696fc9945c45f17a98f05fafdb3cfee4640b876d8c9f26d74768b38ff52141183998a9e4de68f4b5b949c56c68a46987515a5564cdd357efbb31fe1c783f7b551ef921b41d98660c98616b4a3dbbdb1543bdc1a932df0209162456ba18f4f9d4627faf88d2d3f700f7e70f771940d608163edccd999cdd0211b6b38218e0a8e6425ace76afdbf30c1ada89a244e4ec6e5fd3cd95a63514040a08a42c40a660e60878a3f8eae678ec3df9669b0858616cc5f820afcccb79a8675c7f844f21b91caefaa9ec785e9a576ce7409048765a4ad445aaee51dfbe7e5e031fa6c25327841573f67b2a39fa2f3520b98c26b0699d8ef377f2fd7588e31f7602015aee4e61c36d46ad7a222c87f30733f818e96869fe153f252cd68c7ade5d740222086efac32bd9f2a7afa5f005eb9f49a2bed694e3d03edc1dba261fc0a1147002132e7406b81bae2f5685b8d0c98096fd6ee94cccbfa188d165f034cdb393e175020606411c5b8711497062b9315483b73908ab2dbfd61e45158b385203f7d5c07a0082302dcfa3cee4689b480b4b62b2d3522c185c6fa09cdc7a03023e3fb3dd1636365269d7b9c5a22c2cb0b2b32d41cde3645e9435c6ae8f3630f46701104c73e72cf37d4800d0cc3a040c0edb449d7798cba3d8f50f54a03790448f0257c8c6fd687a4b29b8ddd07b053918082a82940d850b3d9e513d2565b39b88aa8dbac73d7c0b495abb83d5330672a364276fd043a6ff92f4361cd1de77c295a219ecc9e3550c6198945388ba54578fbdb880c4f55e2397018eb710474cd412121342e3a9a471b829e9a38c4e58ee90eec5f5909f60801f374a4b8e9550d49fed90a52032053b48a955988baab8f528b14a237741718b20e10aeaef849b3fed90ab746c381797d54d9507b3aa030a529e3604724592a47ccb636eee890df80a4f0054a85d97542c986f5b2d994cb60070dba2aee8858335cdaafa26ca82cd15291201cf0a7a7d6e062f1d41752e91a2128ea2b63cc776ad989c42c041de2723b8e66dba1941a4b48e16f0153793ca39c5010fee412fe3fabd80558657865d42d7457e7d7d2648f252a4c958e0528678fe5642ece630c66f258bcf16093d9f5a356c8032a75dab764a2e9eb6b8a1718ced92d601489ab64b2135ea280049135dfbf74f4ee00d90295acc9e51900da3fbd651760062b062cf6026dcfbd5c2d9ff8a8afcd1f8bfef3bd27f520464602a6b4c244c9fae4dc4a6de639158d5326951e4868e549747520a6881e67ca073278449e0dbf9cb61f89c8a3a2afe4854798e8f312972161049347ab6cadc9b371b94ff106e260dad9e5eb85898938aa9448f2c4cce9bce344d4ca84540f329792dcc872e531f3e50d60cf4dd0c9a3f8fb7f00fe2f82829d006c58c71c66c1c61a0454f4846081595ea8a53e371b8aaa8e419a82791f5be0ce7c12b467dd8ea5e54c5736480fbd0157863266cef89eae1a2aec4fb5d1c8c61374f4cb26f3d25a790dd489b4f3885be2a06e63bb90b4fa53d34cb8c7288afe30d8a2c4dd1ae791ce5b63a9f372b9ec92ef5f6d6d6b4978d64893208ed43d116cb5cad1a402a939110a5dad542ac764d4f7b220985eb80057dae43b8e088ebfe59390389de2566080219b139ef9ad8e8e23e54698564be2c9c86230ac6133e00faab98cf923ffbc8047dabce2dfa6a1e3664c650bffe50a5f0d0880a80b0bde5fd934da020456b157e179e8fd6a7f96fe0dec48b7c7fe208896aaab7920745d6f508c9456daa50920bd90bd4f9df4c1b2d9e7ad4a275621393702dbe428ad77f6d903c848617a3f86253095f0eb72c0b753bc57d5897b45459d1186db6f662d1d9f04515b696a28f1afed8d9b1381e4284b54a6c89ba400a1b96c6e770672484739b6dde9e58ab367b7ae396b51981ea6f3868bf965fde90132c2ce16c4fe8452465567f0535ac92532ca2a8a891f5e87672dd6bb491b3282304c2141bf759196500cf020aecbfb467c62433ba63c08fd8a5083f9325976134731369953bc37e604373a63a884df51de1cdcedbd1ace9e630aab33e3ab2e29faf18d64f3bf2995823bd5ca0cb319dc5b8cb46e0fcec3e7ec29854a574f276e0418eead5599c128ce3e6b3fe65898b7b8d3da80dcdda4c7c7cd592136df93bbaa7494b26e95d38adfc70e4d9558222ad7c0fc11625b613ac9c59b941a18e4d4bd1f1e0e758a776f4182b42310488e708b7357032ea3af1802903b23763f7fbeeaa1a143f3b9fa7d6bfba5682f84b3a1ab3a2f08953dbc99685a1269537e9ff326bd812387a21d1fa5e7cab928541ed1d6b291ebaa633f10acfa33ba5f8d41a2cc59ce7d1d9f8f1861c85f326536c77c85d15edb0d8ec0b", "ac515163ac6a", 0, -558688080, "ccdbd7c021cbe480c5cda899747e321d10fcacce02dac643609cae281ea7dbdc"], - ["030000807082c4030145b3e2de268417d817ae0d94fe8bd70b3ceb6d44a65ca9c360a5a997b280cc700200000005ac00515365ec8dae3d01a1354e0100000000046a63006300000000123eadbb02f18d6f00000000000000000000000000dcc739ad2d434ced35510e3963c62bd7cdfe13a39ecd3307d9394f33e784b74f3c145a7548fb31d99eebf03eb7fcc52db40b58af3882d8e2e029808803f15bb53b85b0523c3ea2cbc27b8d36d1b4e174979df13bf0797f058de16809bc949ea800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e9407f0429809f0414a3b064e04ede68be00e70fc4a755763910e77fe99bf86b69fa0fb72be3c1431335c948e4948add98d728c241bbbb8463d1546e0c7e7b06a54e5ab4e714cf157d02a22a30075780165c4062f632d75fea043cc01daf288223afbe20d30d486ea6b6e1a2ea7a68e155e5d9eb90432a639cdb0ab1bdd7c5d60314730d2ef6649583401d843ce171e891650bbe21a80bc37bff735919bb83890902160b345feffee001df8b3a76c4072095ecc53a1979cd131c91f35976cb7980ea0a05656279f7e476020e037e1b7f68ccc0b12694eb9c566c221a38624a0d8cdc40b13f3d0afbb24b2d1b78bca290c111bda97e8e5e8c0f44106caf8f59eadc7a8503046e6b9935a357616088cb9afa6cfda52fa4b8c7ceaa59626f7ed292a3723eff0206e7cf7478e8cae5778432d336d652cfaf52b1cead6de5de31a4501d8ed80d5703217a6bd3486a08959c66d30df0cae6e0901c5e4f76fb4aa783796d291fa22a3e03257eff35f5dc50ca1b302989c8e0e00c3378fd8052cbc374c2916dde58372f7e030e11065672866404aa6411b744cb3b2f998064a20f41ef98c943514912fdfc04f18e22d45fb8e1509edeb3c8b23163c13b96e3d505022a74147ca6077968e3e0aa5c739aef3c102d6b5f90e2eccb855e4c6df3d00c8719c23a60dbae1ef29699fdb133a098fce3bfa8d839bf9fb798daa4288b678604132fcde9d9190f775b033428b00c0a1d686835f58bfb4a8dfeb6be65099b64c380cd93540ed9862fd2a93765d9b0a1c436dc87765c9b0de08f5e03511df41ab83a98dcc99188bbea2b0951f6a57d931dc9dbce7fac4f27e2d4e5d4e0bb07114a37da5b1280c2cde741316e4034ac14e9692bf32ca1db4023dbeb41e7b291193592ee1471f4e3f7af689fcbdde9c039d3c9cb8177f56aa75c9f0eaabdc95ca62a5bb1b22cdcbc7a7494b86f73d66303b2bb9f844d08068162d0ebf8eb9a4daf7d7f0d3f6fe5d184a2ea8c7a194208724e0ee5e7c059c918825f05f57ed47f5fe502f00a5f1a0b65d6af2a1b39ffcd5b609513f1dafe8162f306616b504b95cb9b425e2aaf0d63c7e3475267f3312d53205ea05024ade7f4cbdabcde0f97be7c4030bc6e89418e5ae55ef53c362be9a51a26bacb9654e3789bf0a5b8919e5a3d402a8dfac33f689dacd0a5ca0f4bdb99795e0916ad38adf7094a7331f99e0af9c8befd6d7c102b51fa8bb847e86868e6a1b25a0c5eba1ee7232ef3de987fac9537db88ab081b03dbf4176f2cec6b2ac91219d4914d8e4ce9f41a7c1334c15fba68f157084023444dfa87b73ada62010e621257365180ece816af17c2f9dd3c50c5842788e2a25b43c312cf43a4588e14bccbe3b4d25e086e4d43e67ea6344603f479415c76341cf01fbb92add0208f31791aa0c5e10fa9473871cc325912ea46ad1ca8c4077c3e092bb1314d41534f0ab7d8d030739fafd54a3cecebbed4d69301aff1359d756ed34a86f70f2b8ee4ad9994c93e3a6af383107a554876d07b696ed26b39fd0d83c0d00c914a7e285b2a425f56a74294e4e121c088ce814bcab421b5943afc9824b9f90283324a53481c044571273e2a246e08b74ef78bbfb1c5724a727cf26df0825031ca564993808416dade0e518fca98c834b4f89d3be856bc5711f1e72fbdefe14a56a5228f9bc3941f8a84d482f52af8a3e1c3037c47f5bf5e88df9a1651b6a26edaca0c3ce95cca2ea8b0f0494859304754323283d9fac288e6c03d9a41e06826ea37407beb7ee0b25de941507cb1d207a69a8e961bc242c9d8943f33e6f1f66d46bf075b253f4ef09f09e623644dabd97e3bd78b928cec5b4fcdb0787164820ed11125a6d0e041839da85bf305469d8640f5ffa80d9f009c3d0055ca955af04df0f76be041abda4d9fa8c3adc60334432cc370760764524fc086fe3cf2854a7ba823722854794a15929cb224ee9932791057c8092a589df44bb866ac1226f5d31c4ea6cfd07899a98007d9c2aed6d4a98360d06f77f1fd5350988e39e025255a070d5269b6279f6403d5ce53b438c65fd4f126407af77e9418c4771fb4c46e9726e0bd863d4d5582bd0f3b00d04122eeaaae036c7ed0ee8c3339c92abf3b5466e5e439dbee7ffb7109b5fdf0c28c293db4b02099a0d7f3c0176629ea3471d6859a6af4f16a38364fdafcb930b6adbfc8d87bc1c26c6538694f0375b9c135c7fe469ed5050401dca16bea5ce2f64dacbfc48fdc1cc8c39d48e6647456160be8849cd55357aa2625b8fa2c2d8973f7bb7186b1ac7a4fb30200000000000000000000000017c3f7606e64a71a3b9673cf6d9dec5520bb0688fd602ed297bdc9fc1c45a9066484aa62c799733d829a75a7513dfd636f3597ff4ef7d53015202c6d7ecac29297c9b220242b948e1ed81562e42b1ab3fb0bd5a024094b024de08680cca84c64000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b89a8f95b06b555a7625c63df07794d207541df46c08a70f25a94b2193aa85f9f3333c53ea62b518120f0e05683762e7f9a2605f4a5ed908318a4c99c1a535b119c3f0bbe47d5fbfaf6a2dd431b1a2ff43ea403357d318db0280ecc7f286ab7182598803697db52e8a5027c4bac2e1b70a48d3267dfa8ea5dc98934f83a8bc3020411cd18f0c152848f471d4cd2fa474a6df7930cd61c04844aed8a1965368f31032453a8b9152c330c647ce2a52d0119ac0ba98d37ed00b213da48ace7d81ebf030b03c191db2a5d3e432eea97602494c06243810e25ac823cc3cab9ce2c945b332872800704307c69c9f7a09e62be9321dcbd52089de89447510a2674e12b4c5e22020a2ce9690734f6fbbc897fbdb05eb14354ff7a4faffd8d6d4b2d37f8978ab5210229457e29467f765304bf6c4ca35b9c4daf0c7e91f15b1910bb3fa9ac83924b69021087333538922584ccf70b256d041d6fd08c7267b92c1b666c48dd5533575c9e02202db7ef2f792c758565d4e3183145d8cc78c460f362575ec78eeed67e670fed021823a06e4bf540fe26176c5aa0470192a56cd22602dd0ea694ba86713eb2478316f5ce872104d210f121b351677ddd3c49ddc395cc5f71345d35b414a807bc9dc1db77330a7152373d073bb59a676889c6bc5414ce183027fc2fe4d4a148e51312c5df37da619c5d01434f472bc20353453ab741719e3797c4cfa40e397762810f1c6595a1cc4bb69a7ac32107db30c15b85c94471d6cb4f6ef5c58d56de6a94773b60521175ecd0f75f08d992c1517b6609d706eccdf92fdcc997bb20185faa11b6f52fa6f9f6bf366412c30b9edcbdcef9eb1ef60f63e0497ce60576ed2087bff50de7c0442e70a7de2fd134b05ef0ea73ac30fa229b214bb006079a46b1e8a64b91073ca355007cc317ecbedc1fbb74cb5163afa97196b1db7824a03790196bfa56f8a17baa388463642c400004a186a717d6fcba71ad855426963ac72dad6809ad38f86af126979784a74bf8344a8fbace94be6b76801661f8a8c61a1ddec4cc8cf3f38034ef5a36f5bdfbf53e397b3c765901a664b9cd776e50ab2e9e6eca6d8a7de4840167923bbdd8dbc639739ac1d109ba44f04bedf57f00ce95b3c0e5a7b580245b311987cf288ff2541e9c31e7576e8e4c825b668586a142deaf970f90160ef3fb72ddf3068a07daa666ea8afd99e6b6016880e3e502b5bea3e2de2662e5d146bdb20e1de16d4912e1bacef63433ee5a8c561a4e3c4952b6367790012be6c3e15e23df7882b07468b2a2bf6eb3b565e85d14dd042164f67f4d366085a83446ac928efd1c113a06f5dca2ecfda08b4396f2547377e999977ccd91d21c8acfc5166090b08efa4f8eaafab3534b72755a50e94fbe8b16ca22f313d77008841e13ae1d136a4ec62336204a93664d591ca418ddd459dda8ae995fd5f262e0cfb1febfd7e19d0535da45f03f453a5df31fa80d6740eb43770003a1c3f6939638949f4cdf1c965ff6a7fc630c15515ad22787affb0ed50e3051b6ef7a6c176c05343b9c298611a69cfa2d60e3b5e185b726e1ab401db0715122fb788eafdb08adcf7007f6661b81b5c4b9c73d1907e73ee175877169d9739b0fc08a9911d0cb2aac45ad062b34269faeeeb443b6b7865e40a89eb2ad5e9c20b7f0ad0cdb60947566dee3a7e1b7e5d20d3203ecd1337b4fe027983b7fde376c57c07adb8d910d68246e0aa152a7a52dd630f35f987e22e2cd67022e93529d44814abbcf2ff43e95e66bf6a486198b35b71de7c647771e2a597842cdf67a3ed72d257c7e6f9d07717ec4285960fefc09a81ee11541629703edce75718a7498716b4a688c50a39324a376812c177b37617de764b0215d499b6aef5fab4ad61d887ca9e2effeb7353b25eaea6aca72081e9336ed0a159c445cc550bfc8a24b1951f9498c29559fbc74ca61cb9b94f95ce8684eb8a5471b746275c1beadc2820948e63096ae4067bd7a39a9021250bea082dbc4ce0c5c7b70b0f31df638695965e410f75fc946ad2de81cba9d4193dfd02da326bef57000fa0edbf9ec0bd4ef4ada3b0d42e3687e99b856016beeb12d6ec523f07e13e3a38c3e4db6ae4a526c0e92129a686904eccbc4b3922d008a1edbcf3d2498edf22287b62f05a1f6022b35aeee095f9e3eb72ff900461537c277da2dec03f95880904b906f7426268708e330d80f47ab3d4a46a630bc420e4459d1915cfcf3c04cad8a956c9a74890fac16d614bceb5742131b0fd779c1cab986fd65868d7192024d3e8aa4b1b69369812d25a8b2797b7f43e4c8cd69d3f6a070ff6ed20d194a87c9872aabe20a2eb1c2ade26258585021f0c683276ff1dcf8c3ba1c228da43c9e56844ba1962cda93371543105767909b7780ba09f320597f3d01e4844e5936fba72e01", "6500ac526aac656553", 0, -135270863, "7d4dcb038e201f9f3450f38f92d78f05805962ee75bb2c6c94d82fd56b6e8c35"], - ["030000807082c40302b93c29fd075fe1ef5d16f6b789d4e3a7b80fa6789db8ff3e101c8c57ba1caee10100000002ac6313a87603c1fc0f48c95041334b3c7ecc4bf17c0809bca82a9aa0d8d17d1426c4cce2f44e0200000000ffffffff04b949450500000000016aab83e1050000000000581145020000000000c1c2350100000000056563ac515221fa35f100000000030000000000000000993d740300000000ad1ea26285e344d9c9ab36445d5a439bf75f9dfb7b15845c29d54e0c1c0c2572730f52ed7a38dc85cdd2a75eab9152b35d9f48ad1f5849e6af6da293184d50c1b307e184b167374893ab4ad2d3928afe7dab93b23ee823f21e89f772d752c0eb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b6aaf5681f3c6c614606ada89b440340d067045a85b0a69d20f580efb5f429a90d327b2d71aa237621f86a0417ef2659fa8e23b00dd7f229ce93370b88a88ca89631715a0a36058f19041dd08017f16b6c311be7f939486b2840e7ff21b2edd4f882f6b9bc74e38d5c3795704910c98a5aa96664f78d70f1178f077e7acebe710320ba235e93587a4ff3e69d55f386528311198581941186215546050f727a7ae2022dc5b1cf3e69c021d401a1f06fc40a89729c6e5db357ebd6084df1718f6df34d0b04b2f978f3cd90d82bb89a1a40ae5926a5cae2af8e83ff10f88a58cfd6d5301af8fcfdaeaa7a4adbcc2cb6345049cf3b1ff9a4dd2dac99cd65dc956c48b173a2032ef442adcbbce3078a8220fde188cd20d0e570ee1f343227ae536a24f15c625a0216518a02940cee7ba8d9046499dc8960e18e1373cdf9cff51b394f55fb1ee80b031040ed77b23e3936820dbb5417324d6d187ec540dc73f24c16b13caee681e89402028b51cea9dfc81e87e5a1ba38beea88489a553815b96f7d1d69c9630fe7a53c022d61303fcff7911a601de9e86e2feedd72bbac45e948c2114fe4b799122b0af149369bae855534a282cf89db1b0827d95ee159b88cc25aae01df19037f56886b25b6732efdb9352ff9096459f7716b9825e097a5ae8f7ae2083300783646fbbef45302048c988a9e82de7da939426ced13a065abc24c4875657dadd3d7a1fe5b37c9129e71142b1bba28c570cd709e6d06a8a9417bbce73c8bee0f5e339ff00bdbb53351813d8b5d43b3837b8636b6f6e4f4f742d58417f7654bbae5bc93679c190b286d79a35c5b51bff64beb7b8611c1a0898fc7f3caa4822becda5e91baf5d64118d0be4d805147a6a9bb22a3e8e8c253b5975eba7d3cb64d33ddbd7c0f09bbd4213b1c30084f531a036b4e4c65a5472525184877b11cb25697eb692cb45cd207872273ccd12008eed213725170fa75ac19dd817db85a45e5098c0dcba8153de9ec5e990e7b388c3540aab1b92f40923f68d12e81853d180bc342a528591c16e86ca75c120b634ea4bdc0d51f5440ff4f2b38d38506ce8bf2e85638f9bf7f6c70da4c085d0a656fc038579c1efdfaf4ac4633408610d008e3dced0e9a6521a7181a02e9ba5f4f9ccfa3092d8cecb3c0f2d0ad95f1963a1a753fc3faf6b0ec824ac234fc97af4faa051d6e0f0232aaa48232d2821b9d524e15756e3dce498dc676a5d7d0c232d8571c4a27b9d2c093ec2c42aab32822a0a9d43782166e6e71534595e3b591a246126665a298f07d03f9101e407e4dc0e98efcb45c0d07acf8b2bb02edfa0942db77a74f3ba3903cebb18581c5c932932f75fa564e5c4505d93040258f3ff73c6183f7cbb5a12a27dbe27e3ea67246088e40a327f4ca45f499e5a87cd977ad9238a24f63c62e51b4c8b3f4c87b765f0212483f31d8bc6d9928fca7c38260d5a0bb2229be1422a51f0f2f98d7ca227801fa8b799003bbd2dba404457fbbbf76165df2c101800758dc2ae2a283eb4e743eb79ad183581af1eb0e9946951998522bf13b7fd253b9b580d726eadfc4205bf582f53b67b78d02e00ee76124768998160b9c29daa4362db1a37ee80e6c7cd8c16936d85c2b7a0b01439aac9f0cb8f6a11b4046023371c9ff1b313c298865c4da5e30233216a6b7a7095d8fb4751ce166cb35551a50d88f7c850d969901e18418460cb0220caee231f9216a4de218f9c513c73af75424e412d1bcfd6252caa25d2247c7f710a116e9f451df92a85a1303d3b95261f8f3ab1c4cc0b39269fb2d6808cdb008b852b59fb926c57289b2956e6339bc293ad4261f3f7baddeba4c94df1c92ac11ce03c68125f651c9251308ee7549631a8d759e912e862124816404df86077b53418f785c545f2b48bb7fe87d93da74d69802d001b99f51993e090460d95cc7c28cf92795c6db528ca4b38707889d3f8417f37798b95fe07206d3231171d60709fb3389427fd5e952b1435fdb862eca88c4dcf95e038acc177589b088717cfd96753d64ff4e0ab7c32f54a09b74ad2f6532d3477e4601b1ad80e211a94598596becd8cc5cb00603b49e3a5bd71406c414c084fdb7233c6721ea18aa94b8040105a32cb12c290f0e87f0a030ed0cd8d85509384c2e122cd5b3870cbe54c1a0c1f1f0c7e1b57b2aafccd9305de1f963244c03a89a26b434675e7bb6db072cecb09335a762c10eb272830c350d86636b27cbbe71da699f32c693220c299e0f56124d48cdc75fcf0b065222f4bc355125cce217085b1af261250000000000000000f087a60200000000dd33844fba233c307a483e29cf36f4ef62adb601a1268c0b97760caab69acd66926307c980d7538b3bc866312f7acd1c55a337ba14ced372838eec9157d57ecd629c45d7358b54a719fbf3d4e5a967aad0a3aafe2df665c41a785c2128f77abb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000067aec7838b8d8e3398b7ab56cfe912d66f5b90b924161251ed83750a6f230772923c1dd664f502a519eb8f06b116155a5a6c6ce6d59821d858568a42b2bc8e0817f37e4e4aba74047c9b6aa4d169b02a35273ce5becc95ac5da3147d161e020dd2ac8e61d1f36058298f6a5d72e0868ed22dfb4b052f603599469a63e9c34acb0218f9d52d6e2f659301c7cdfa5604d9247856c514f3a4c6953879d55d8d9030250212dd446aa0b46394e8d78660e6b36b8bcbeaf1c4c1522347a2b2ce851a3ae3940a0513b75f45c32188b2edf4adef606751c187a27bf32a856f1c0174a3174ffc65d9d6089342aaf899baa30d5fff610e852f97439af50fa3023e01ae3e11c8d18a030366e1411c93152c047c8a4eaa5319124af1a19df052ca0f402f4993f16a18a8030dd9fb1687625df2db13c9d3a22d980e374f4de2d43423d7e3d8974d6e8353c6020892315116db7a849f6104f69d29d7411fab866e85fcbcbfe85d41a49e5d2d2c0302adb076d1956fa6fb8ce667cbfc6d8b06987110c784110373a4b002a911f3f60228b27c2ed33fb29803b54f566e4855f6c7f3318aff735c420601f70062b7b997e9ff73945b0b3ffc67cd49a1b65f33d67b912fbcacc97a36f97a3e812f69c3f13a1e2e64d1b2de5dbd9475e097f2ba20481ef19fa643fa9107bf95f77596a44a3d22b95849349139a002a2f023c11696085dc4b6833da19fd47e3cf755d3763792d3d7300c5cafeebcb620a3c4e7395385384a8a7e3f7f087fd6a10e6c9227db59339f1b4f4c0b9155d397ec4b352b375c5b20a341cf56dd0813ac9fdac5805f8f80e16ca932c6dda748aba8ce307eca8a649a409746020dff687f0b00b585ba8b8844db1a79adcdbb28fc9fb9a545b087a187ef2e11c5624250282f4e23940c4f82e36b40ed63c2b033286f9ed79373c42c4e3b2f87393cf6acd35c515fefc50f690b14484b12d6e2daf215bf3ea84373116ab5a5fe64a2c3f26528421b4b7c5e957c794bb1435743ec67aab01c64eff9fa586c5b0acde92c01e7c8307852b49c4dc4632503d88e36b6380bcf816b803355d94999a68e77e742c0b1137cf257ba02ac87fcd0fc8cddd1b313f3775cf8e7c6375ebbdcb3dabd1b04d11344fc077e296e4c94e3b44d313fe506742746610445d8381fe01d4e8aaab1db85ad295cb243b9633e9087159db28257f3b20874bb632465123dec552aeb87f52d05faed33a8a67f53b7223cd04e1b6701e05d6fe756132d4d2145e9b82ed507bf22a37d8381935681be9cb0c8f5101ce6c5de0f8a2d1914dd734b09ff31ae65499c5f61c72d7ea5d9001cd17caeb3bbf57baf2ca6d1f69e0fdd28e1c5a046e779e1be954014f7560ae6a42682b439e4e45b68ab4901ac5dafc56c9da82955b83981009f5b06ba13070060dac47f2b03bba600fb805489269e27a39ad78d3003e617a71100aa39162e85eeda949c7fd45f8143ce952eaf96754089b62dfa53396d0fe5d3a6dad8d917e6bc51aaf62457441ebaaa53ce827b7a50b1e21a46d9fdfc9f0e85c8b47351ff48cc7726359e439c44eadffbb649c7e57f983204d72c121250c6831fd4b781921d0c992141e50e79004d8a821a2554df7704aca531f9ab12401496f51a081cd9cd9b34d19bd4ddfaef7c3525fab8affaea7b80f7eb2fe642e247a8192c8b689a19088b7ff730c49c490d8ad57507a838f143fd6ae76fa1503556c0a7904a33a6cbf880ca854a4dfaba13f26c3abc9a33a38ef81349c203bf50beb26cb70dc7375fad86b56d086977b6dc115426dae761ace69841afb1ef3b7977856b43b93ff3a617191520451d32b95371411c306ba00a550da36f4f0cae9b4295ca58f144f26a61dd89efd5e8c7e733f10c9f5ddb0d9b5c59fe52d79d9f15c1ce805d69adfea0de2ce832f1af8e2f90e019414623363b6e4e90350bdbbbac246550d091006dfa999a9af9c73e717a0779f9003f9559c0ab9e1fd94b76af37c073c286b7a3f435c1330d747bc5fa3276d0e48058c89a1e222106e4279d30af1bd0db9b6c39ee98649ae140cb526594baebc5d3440d747a9b6f32daa51a04a88d3c9c7f59e01efe9d639f3321354eb470d8800472a67778ea324fe773a3ef5d444758219618df461db29b20a0d89a47e788403b551142c25372761d4ee75d7aed47262f7f715f880b8138aa8fb5cebe7cda4d1523a2a1fbfbf1025481454fb5e276c809209a6144265d44fef1204c761fd7d4d521e84bf9bccf6387c4e2964df15c29ccdbd59fbc38d622d597d67814720a5d1f55441a020000000000000000000000009f1c35717633152269245814ba0381a952f17cce76f0b3d4b9cdcd0877e43a5e55d5614b10120a1e08c11da3efa2a91673fb3845a313d6a53cce95e6dcba1ca54615ccffa77f9a87f7b5c834b8cae27597cb6982038c205c2517821d68d099e2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009fc9a643d60fa40c68d8708db724328c52ee5892fa7dead42e0cf190561ffcb1dcc7a5f11b61f3d7b0b5cd36b996a993fe69de208c43ccd6097c1951f0e057bb63fedc90c614d8216279dc55377eea032f6d397c7b849ec7d0405f537d6cbc4ef1f401196234b9131106d151e9d75e67a6efdea18cfc16f6bd3552b1c749f4c7022538026394deb39d59d59868cf368d75fa447d6704c6005e60d1f16d111debe703000b8a1aa1b23aec5585a90325d5fb97afb7a10c859ebd390db5bb657e140a340b04605a88a42c2ac88ffb21c4f6c20711c6af52293ee5cbc669632e23a8553fbcfeab00c3a49e6505e7af6ac6eabeb7ed521af2184ec359bc55811cbffcb9352b0209c9cb56d754b15cc8fb8eef16b64b9a321a27c0d7269821debcd90f6be2305c0300044234c05b831f9e690d79dc4e16804c2895c02a471b02bc22dbb5b2bca4eb02189c329d2f9953c72168e13ffb13431a10776c2d1fa445e9bb5a92363633980b031c3afd215798cd2d79282ff65235e7ee1969dec39f6580f01ab7ed95214689610306248d60caca9db8c520d58b6f29125a9021d3b8ddbf5d33057335011483820f6d3c5b58ab6e0abbd125577504a6c696402caab88d8fd5971f9d73a759723f0c9094a9c9a0e3310b975f83ab63f22343de99a86ea0dca31da947369adb6531ca7b5c5bd4d7d0bf2bdc87f28f31688e68055a0cb6573e44b958bad2e507a963d48c1d15b1bef3f3de9a4d8909e6615b4b9b8bde5b04f0c1a04636317c12bdd1a173c838e2d80111bbe1b15f974f57a33a0eb0053dc48864b4449502fce00875538b454250c7ab2475aec1fa599273c295b29df18dbe5adcbad8357e67a2c16f7086af1dabf0dc29d7488ff58af76aad2bf1c08927146a78be1ea50f1b18ef11c8000597d50cb91ba11b2e1a50683eabfbce9c06d5daf259d77055b7e63fb81c5cd8984f5ef0874c103a7c48319283da561925d46d7fca4aea8ec49654cf0fc71e214376e1fa9a18bd55ac366e4def6f51ff042ad64d39f20d42a2efe364fadd3bca64ee48b08dc4339cdeb9ce229fa040cdfce993d654f599912654e679bc4e13df1d5f789a67c4674a6ed3e84b3f0b185dbc4597a8e789ef3466c07426df60b9667f7c5bed02477977e2242b115034c1a8129d23b21d6e0fd8b9f648af4c01cb5df58ee56638ddea08990c9da5968f91a4afbff57dcc921a02b540ac90628f43e055ef9b72a21d9ed837e37c3e79c9c03ac320237b30b11e2ca7780e3afed9acd9673334b34974bc43567ef90fe3821d7d393d5c8fc09de21e06ee90050588090ff8015b1433b0a20f1dbca363d5ba25cb80b95d709035360c56dcf0c2ec256a419ff54b3c8df8f92aa54ce6acf7ce42c3a8a45acd9501212535f27c4cb271653ca26af336ca6466a8ea9df4b283bd915d8fc9e9cbc1aef11f2153529bb321bcb48cfe2ca38d9d90409fe792d06102278495879bf90f5304e56627ac6c6a8bf0cbc333df379b551278b1400caaaeae157b17bb5e3f53b6b8898b928fa000ddcf0fbe527d4c22f4f55f9ec9940b33afe58390d8366bf211d0ba3136c33d71085d724058aeeaad6f8d6635e62a59d744ef83d4237c56fea1d8b8ff7deeb06df031fe246e19804dd66f8066b6b3428089bfb4289c65dbefeb7086f97db261235bfba4e5ef03b8d21c8730c24f369cd01f20850ed5e7776eeae39cfe39312b121bd10b48e6134e97f1e5221b87d2b508ac5454531e7392929c32259015870612b458de7f208d039a0cc3eaeb8cf92c8a90016a629fc378369a27024e39fcc8783660ab7a4438daa93d40ca39c0be0007e2f019d70bc3f3e10db6fe7071c915a43de7f065ddf88c6daf0773d14880e2452dbe2953f342b9cfb0b07ee1b60ea170a76fc5258bfa03c759acaa39c9cd07e7e09da517817ee2c82d05ecf5b6dc3af789cb58c9a36a09e0077d7c419488af31cbd128d7ee187529255798a095586b7264a569d7de9ac32de9077b94dcc6d3d09c8c2635a996ab9de7b686c8cbc6db0d7d2d8cc9815b258b56e8307830bed7651d939dbb37a9e5bc2fc031523c3a2082144150c05db6349691fc80c648ccbe1c8b38636341cdcb7d4430d486937794464532ad731b09be5b74dba1797fb1d39e66bd75c74932673094ee747458bd57ab2aeeee741f971c9d8be7c7a89fa4c41b47442f7fff06139d43c2f21b4111f3818b8134868775242c6a22ee526c8dc7a7c450d06441946c0e53172c7bd3c0e32ba6f66b4263728859c4a9267d34870deab128eb2fa54bfb4dd9d25c9e3a9494d5ac3754999d2efefb76126579fe8f9bff50b28007cddc6e7cf525b39d182dd03a3b982831b9ae7eaed3a04ef6e585067955d689e3d8a48d7fbd4c56158f8b8291cb61099f7f89c7b35b55ea3d566f00026a6eb30c", "", 1, -1864769365, "296dd33c87ff69db8d6183c295d2d9228583e64975f54e6afd9c4990b6de6aeb"], - ["c4156d28020126758ef4eec8a347da25a75990c06c82c6bdedbbadc09ce332f2c6542d4d3801000000036a6a63388181a8395ceb0efa067b6785b686848e9d3aef8e1c4e1b38c2c3386694b37a5736304a0200000006006363636363ffffffff02b9c425030000000006515100ac5352308b9e0100000000015100acda0d0100000000000000001a70d30100000000a7be4363b1d57228f8fc4e7cea2b531693c61885c1ba0b06307a1175d45d3909a03e03d686cfd4a73f1cf229e425e6e1d53d29077ee122f9123aa9169909f32e2767d5f5d1c7bbd1d9d585bdd82cb59ce516fbff3e8182f9250bc537302649da00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000169e181001e8696495a2b08cb1fdf932909d9ead792b6d2023d202828431a444cf61a1c2929c4380eb3d9a40a5d0224ac193c02f4a231a1881b80dac5b3f287f7f5604453b8f1351b4a97f846ddc3ae6ea72cb4b33e75a12864570d66b47b10e476d120dd6547b8e4681935e7863c99b1b5b883acf1c74c18f6e54237bd30080031d0e5978e2207728220bbaa8386bfdd38238f0962b71eff295a078f0887d677403058e6d946da91d2e5f688ecec21b657f503889243342849cbf98e5bf31e42ac10a059b4801016179ee82280d15c0d78f44bcb52e9b02d4f8bf0f845e34aed23cd2e6d34d106439875873d09c9a08285c6276bce58b29148fbe3624b70ba835a4350225e489ab6ee2f5bca928745bc7e7e11b94ff9b1dac3fd6278940b6aacfab683a0301c3e6f80aca8fbc963f8a9559032a0db210fcf6c0923512f9427bc22cce2ec0022037774b274dcf47dc0ba8793773b8dae71d92dea71d9a3b64c72e88e51df6f4030863828b210d2ad21f849a926e6fb1dd7117f5ead3d64e8f8bab52723a326f2b03192e3751dc583e23d74255ba3b4d60513cea7d830f450320eae329afa4499d594deea618b177ba240a373859822dac2dad0d9d97e37fd7d0263789b735c65977dbdc3e1702ec230d8d63b68dfdec7c62cb4d9408fd13bdf8f3a00e67203ed32056ed8841537914da21efb5cfb85f99c2dbf454e726a0d82c6d11a8d44927574583c32ceb6c9e8261e9eb803c6a75a3a488498ec1e5dcca08acbd5ea51608122e4b4d4d3df89ccda4a10fdcca7f4db460e5daa0c10eda59683ac22c1dab8b76ba37a933d8181d6302e8384bd775347b6fbb613032f0c4b9af86017a0bebe7d2aad5f2bc08ca8101a2c98ceab876dc75fce6557d74f95215ae4e802c6213fdc7984352284a1cb3aa5e3966d72ac57a74845ba33b0091104eb23f21d06c97b3775e0b81464839cfb79a5ccef4741c149123b95ba7038718dbd10ee50d0f15ebd816202c697dc9ccb41a593c4361528ec9f0b2c42f908f45978d92d1ad4c9ac2d320693f33aae95fd05bfd33de19eca66bf459b9c2c7efe8b7c1fca7cbcda658e1a10ad2ef75472b2e583fd3ad1b3c63c4a7c863db4d345e16161cdf1ce4c3e77b599e3400e2355d5338ec12540a05ea7dd651492c85d968ef7da447ae54435867739e58db82e8c3133efcd0b376075bcdc05638f89c1ad9089a1db8bd0a078f982942cc02d82aaca7eb41f42abbbaf09a1a691909ef218626b919685ad2c06e7678d6566a8dd341df9b6ccdd11b56e46f6396f30e6420b875160483666ce26103acac13faccc0bcb0ad42f3179ae4b803ef72a3dd934afdd518b1ee2435de19b3b49aa7843de29f1cc5ba17102f2a7eeed3eca836eaf5633cc5acb5ad5e2a6928246c2eaa836964610127fe2a6b827ec3890cb62708d4dc6087f637c016846b189e8568dd6adac90d88bef7518cf0b5ab7fc5d8006bba36c8c44b680ecb7e69db22d529d332b8675fd5e831600ffd5d1b5d066a4497f4002baa63f13a3051b0de2b9ab39d52af91aef6ca1b33e112db2c653ba1ee1216088b7fe391cf5c9fa37097f8def3797404af6864d3d43c824a5032d1e13df8584ec4f805bf37fc544c709f9d3f883b4b734c645fc426c91ec45a05504db0daec146a5394bad208fc552628312d59598f0e371f9cbfba0f383930c2c001daaedb1b5fc97a15f9dc81de6f72c7d7aa77a5366422dcde94343876aa654de36c3bfaf760c555e921a9842971f3e968cc5447f6972de031d6372a9c276aafaf43b43080266d579980c7644dd3739c1225c41110273f443edaf5177bea976d74f2484abd26d038d512ae370c07d61669d317276809920967bbf1407830cb3f39da81c6b96e178c513e80255f33c0fbb18fe8f2ee561013a036566a39f1bf182fe6e46a9778f7ce5d476af4e08726fa704e3972c8c8f60b1726eacab0444f11a160c7d8a65db24a8d74a55aa5005db5fe2fdb481cd954482f2d8a98d84ae6cbc08985c51e6595d13f128d1aced19abea7116894dd02e33c01a81935fd3b88c52d57737668b1bddb6179c257729f2bcc8e88e1ac6862cbc358fb55e8b71b152a56dee9b6fd2680f0297898be4814441cdd6cd243fec3b6e31b12c2e50cbd406089ac96a66a52d28cb7415d9b872c4f071aba2b65d3a7b18c05342a83563f5097262215cc9893edc066c7b24a1bf5cc1b28f6624ec87f1463aadef80e2d0a376c4474177b3c54467b4053d9fab9d96d3809617c741e424df002ab47fad7a6733f9c6d705c7f2797ee1de28f384e5367051b9b338809874cdbde8ecd2a79dc54dc8e049304de775917af1bc00771cac90b9f5c1cdf1f4ada2ba61e4825d2134aa3dba1301fc96c2262dd2b0de7e02fa18fb0934367f55d4bdd404a84d70592552c0b", "63", 0, 716681394, "c080df47a0d35664f8950288839b3415818497ca5bbd16e11e4a7be3b91ed283"], - ["030000807082c40303afb5b47d67accd148b207e90bbec7a6691dde7e02b5bd0e8675a15fbceba3fa5000000000200651d0a15feaaa8d7127f91b14beb2251e2a6892149594037ae033ea5199fbf007693e5953f030000000900526a006353006a65ffffffff03f70005b619aa74a21ea1255e08f7c16bd458a6581335a97f875e71a41f3f7c0200000000d36b95bc040b704a0300000000045263530085f2ad0400000000004dbb3204000000000752ac6a636500ac11b2b3040000000004006a5153118c03e40ef814ec01802e2501000000000000000000000000edcccfb8b61c0a24bbcbdcea5da085b44abecb85a820f1d86b97d47c7ecf52cfa822225d5f4c651af656cc27a08320a078246670f2c9f554a7e50b97ccac2fa59536d752aeda22824d107b8042cfd02ee422313271dc021f4217ce18a8230dc1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ab41a7d99e9d82bb88b9c5fdcfd91014b341bffced109341d9e32a0b54a6f6da18c05b0bc0a545673080989261b608b08cd9de0f130d98300d828be00c78cc02ddd5df0c42530a3b27fa67535a1b38452b71301db38da0fb62d2b78e251d1a144bbb1508c5f2bd60e1df041a515daad621b77fdf0f5619cdf30fbef8138edf50309faaf861cded2664908bc583b3bda15cb814453e24d196d944d546b566d71bc0300b8cda5689c353b6d3c3bb0727181f5954d7de6a514724cf10dbb1fd31974fa0a06aeb8e0ff3ec288f45a50a73b36e153166a17315ba6c48e9475ac14a8950dbccfab76b005e9c2d6f9ff9ca422bf0c039cd68aad834e3e4c44df4eee5fc5f4f2021134fcc975e0170695545d1540dc5c3fa7b2d5de8f60718c2a88078bd1a27bae0314bb2e9e56f54217c8366c4328e4c2455055fcf7692adf1e6890829ae1e92c07022776acc56d031ca83a24e03c46fd7656b2d9fefdeb0110b5b9a3b002f32a4ac50207e4ec94cba4f5427d6cfe3e66f1ede59ab8fc50c9124f40767f3632f270a6f5031365b200a2a7c1594edf366c44fdcf822ea0ccadd3baa807a425c0b024e47ca3519b9e50fb3b5a3e89d86d82ebad0bd3a19a491a80f6fadba95f446d8fb37b462d08427d8ad6b3b3dfb168b4dc329b9deaadd348b82ad8461a4c72c54cc89cee1b314b93585640d8a635571108c1cf45f06006c74fee36021a7fb3b81f2ac425dab3e5108093805c6b522b16b0c33609f83ed0cf99810b131e7831f267dc9ad05a14477bde5f79cbda4413a27464c8c578c03faafd86079e3bfab0104bcfe8da231de17c5a0afc01525907aeed5cee0585919644109ca5eec5f29d1cf4508fe640c2a9817be4d6e9e0c761751fa6e2a956796367120dd015692757e6dfe7cac8ef11f7e9336c5a5e3b7b9ee61030172d6ad1cb9554b7230cc29df9fd494679196f037e2e3ddee545c848117d6edf29cf21499d6c43abe42e62833ec95c84e635d46a5fbfab29ea2a1ada4243ab4295f75ed4d74fe83b9828a916d24a34f2379547ff16c44b09d842900e091a2b1f9a2d175b3d7c12c148353eec196347f8ed6448d64ee7323f2c2885f89ebc385f97fba3ecaa6043a47f438be7136af28e00bb7c0f07ca8f35025dc90c479365929b66143d1ad257ee1217844ad79ad49fef998f6340ca1be13a37527f61f03e6dc962902d6db7f7eb70a63055c949f6432b780cb6022ec18fe1d4267adf02bff536002f6873239b9995bf96b3918eb42133e33fcfe3331e7b13e08f7a596eafb718fbbe351abc2af47a9b79b319aa553b78e335cddc48867bdf7225497a9eda984d225441f80209120daaedcdcc78a7a568238cec0f146713d94edf43cb63dd033f6211a8e84417d8addc0af51d9d9375aeb0eec8403355a399de0d508f77220c0191c9979db29638c0376a270daa0cacd2cc1de75928eb82d59678241416b0b3e25b2b57970dbf8dafb9165884f246165e3d073f4b656ecb4dcdf4d58f78517c554bf3293bdc313038b51710535a588432dbfaad4fb2f7405b9d54148090e6533f1813a34831a017f2609d0b47013a97bc66442ffe326dfe34802c247b8e017eb8cfd9140cac3e4aa3a3545eb28462c1f9df19c60c9d65b2f2d10b7f75024d05779caf216901464034fbd9a4a84a2c32f2898ad9875512f9c3d812c3092532684bdeb2d832525dc3a1279dba656dcdb281a5151c4bbbfe104a6f7689c0416a43caca06e1a37e9794ccfd1728f1bcf205f45b74cbf920954ccfdf28510b7fa0a31044654db45b6f3584790db9f5898d4a81b49aef8a2ef6415450100d03a655ba3061c0fa8853b8be3bac62d9d045927a9797a3632f2262efbfd8f67aeb6e3344f2d3b6d62541749efaaf1703d78323996ece1d4246ae9a5a4ec6a3dfcd07d3ab5242c1e3c71a5e69f9837e9855d74169d11fd2c9246145ecd841f83d4cbe4fee9f3385e8500d6bf8559088dff80177a52391335bc18f176984aa1d3f7c65d6f292d7489e6fcb377ace63bb4506f3883db3e82d110406c71ee5cfac72ecd724eb83fc16bcde36e01b3c76ee689d3fe4d00551b0bca6ce9bbc6183eb66fa6443061f3438c146be161edc0fbdd1fb20c10bbfeaf38632c690813a1d5306b6d76198c579348fe061bef030c3169a1627d3508776ac746c74d421878ff0dd228ef7690bed3c55bf21d4dd680b7dfc90a1bafd65e5065f734c1cf1cc117ce84ad6d2954b5573604d0b65b6955e2d4e1310f9298dc4b3b508ce7936f50aa42bfab3ee71cdf81ac83021c7f0a7da7979b896023c23d3d6c5006d32a4014a88b7616531e2659c30f589b107324bef6723326a50f36b44c2312bbe00b85e24c07feaf571ac6ad04b844245de4fb9dc56b58da9946d211798f48b5ac7bab8412056e14d19cccd083406", "6a6a655252516a0052", 0, 1245979144, "6f836f9d130e50e35ce6bd404f979bef4622470f06c6c27f63fbd1ea5d1351a9"], - ["030000807082c403038ffcb51b49f28101b888390e6b1c1ae834df9a97b44f8a12dabf622d0d6fb44603000000065365ac636551ffffffff7d7098734df0a39ff46457a4b633315a02805778f84aef106322631a6eff45760300000003656a63ffffffff712fe8f56979b380eff395fecb7bfb3abe7e25543bd83c81d1128800b4a66c7603000000056a52525100a6df573a03c63e56040000000001529fc8950300000000055251526a6a4a12eb050000000000ef66b1e700000000030000000000000000cbd4b10500000000927ef357fa7ff70a161ee3de3c461210a39d3d022a59a24b3fed14779b6bc3612a2b04b1a72521d3054454dbee5ed75593a1a0bbb72d29838e3b921513d166dcd7b335050648cbeadb9f43b26a1bdbe718e1cf912d67c9180674c915c0bc3ccd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a014dcc3e983885392a0f3918e0493576e01be010ecc49da6efe96a0d71248b3c8d3347b22d7982e3704e3582c5e9aa5856b844c86d5c18d652f87727dd9124606f616635749ed206fc573f51481f1268d631e7be5915ed1851c2d853dd281fa7bb9c3ef1cd585abab88df13ee2943a1f12136f36d16bf3efaa221aa80bdbf031841d07f4ec73fa405ab0a9d56786f955a729a3bbe49d694085aa5a7fb7d25fd030341d2462da20eeae72c911388872a2cbc757a6c3a7f4bc4e501224ae72b96510b02adeab5949663ce306dd486374671d77fd4eff955a01c900dd86c29de94c4ab1a34597d52610fe454839f5e20860fe7d366d57bb8d4c64cb6db263c4f7cd97e021894397a3645bd9067ed7a0de85ca3c0c6de7de0a61f37c4aeebc8db1b040c70022d0f2b0e7f89cccb64d6de7a98114086d34ed3cb9b1524d98489844b7013367a031eef1518bf49e92d50616628bd49dfcc4a715ab9e56c2945a05c64a309a0fe8e0214ed26c0085ab7136183a17fe93dee44133799a769294a6eea41c66801dfa2d3032f1bdbcd930887b0cb17fb797f80a8934cde3ace33e090f53920e6bc731d1fbac62c802cfe3692b4342c279f7a8267ddee92049020e44f14f6d139ff4e5cbc14a9b90b18f2da2cd1ef3b401dc98e180fe661150ea36b87a54b8f3ef0d740593644d70a6170a4bb917d1075c1ca9ad9e01191fab9a12a7f4be442f89ccad63c028be913a4da4a768ba821a36e26b6f54cff76524e78c67419b48510fff345e3668440cd094674211f839bf0292ada35187936cbcbd0d247a87279ebb9e79a92b404ed53fb2fcd81ba19154de70d96d515ef6572feb8ae6a0598303322f3802ed4d4eda5d6de156f142ef261e2806dfbec9abb06f9d7c4c38d419639f1b909037c67e221a921625d9634d5d20e44ada33ce56b88a787fdb0acaac77cc5b28ce82b5dd7b90584b8c89ea083e415aca17bb3b2949efd2a6e24e4a49fcad6d2efc28325fabcef77bbfd9941f03ee21bc77b9080e40f3da617043aa4af8209850fc18b4e929e1e864d2a587d7d0eec5f22fe44d56d6618b70495412df321b875a28614482384b25fde23a05a620128db6e32ed28638ac56f2265cceabf9dedc2f220d7d0faca43a540d0f7a0c54c8f05fb68c816a88f097be544ff69c3cc4261aac81d958d395cfc12c25bc0aa0b2fbfed68a52f6c1a24c2784bfcfe5b4e3b390237ea7e28b6f47cdea2463b0a5208862ada10785bc1a228f6003989ec18a82dd87da6a0bdd163e99624bee01020950bc61914a86f43f433c1f4e66a71e37de6d5565ae4813fda8f8c389978c190f52129ca1459b8ec31fff84d43b443bafb03eb9fbd45ba8474a9745e38ee0e0d5dbf8a8c9cc270d3f9668f48b551a8013303945210ea40351393772243c9e3a9eaee1b57ce2645f4ae0853c211d84389d5196ad61c99a5eeeb85ee16d051ee2f3c8ec1101b0dfcc0a739436e5626a709c6f995c883bd4f9600e2b15ec55c56e38ba3003c5e54017d459773d178de7d2e1c94b80ecfd98065c9851a0690876c51b32950c348b0ea9c00dc19b0add6b061dbb511f787db621dd8e82cf2fc29847c70098e13ebf6a2f2b4c3404a1a7c4b9c45a07045cec87e0f7ac772dc366cf459383c6073278e7ee7dec39d70333642eaaa61e50e0a0339daeba323c65818fafc318e0a4f7da5fa5fd088b8f0cc1bd8dca5c22afc8ef3bb3bfa1efbf80f2e0c3b9f2050116e8a8387c3c3a36a82ba77ea5cd15d11db2591e5d4d45e45c48b546805648d280d418d7eaeb731884b0390a99e0199a9332d68cb90a0e1b2c7abf27329612305861963ec46af42b2b8a4df1ccbca70a12d884e12477cf445468243e5c181bc42813239fd71222b47d47ba0dc793a9c11e12f09cd2bd8df1398acf4d218206f2e1270d262f6aecc63967571e7a79a674ce155f25d9f610ad92e0cd12feff66c11fecab0788eb9ecb4afd96e27f91007fd98936b37717cacb1f7357a883ee8a2ef1add41d5ed97d5526c8f1b4d79d0c3ecc32bae982ab07e8d24740339923cae4f14e1eeaaf0013486d4ca9d9d2bf81ce6045696769b7aae448bc4354c3f69d040a26ed5e069fb3d5e1c318b334e9993a951c2178014787e604db2a84bee4ee6ae144316fc81095555176895db64e235f0fcbbd40a9845c9c82f86a519048093eaaf0649301e727b5c063e65954875f8fbfe21f90affaaf4c7a8b17373c66b9d02b30e64f249e600ad7cad6a560464b66cfb1428100e8d1daea1dbacf62a7ad0c4523f2e7e1af40500000000000000000000000057d9fbdcad470b87284d0972291dc4f0e0a3d1a54a83a3fddda16a98a583117b1876aa21a7c2c5b1c266e5ee3119bbe8137d794d66794fc58f0a373789e1e3478a10824a349b57a5a6a8927115d57b9d05f17fc743b505a8b8d610a5f6f1ba6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fe64885e9cbf0a31a3169b9d599df2918aa5efa35ba0fb7d53c4b8210b0dd77ccda2559317eeab654dfe0fe24705520acc144d761a55ad89d19391600c6d9f8d0d95de19df7d42652503f6dce0ee08030b87867d9574abeef2cff5bc91b134f3a612f43103709e51cdd5a85d8c64d277bedda8a551986327c3f58ab8265fccd9031ca4d0e66b1d49fb8aa9d3c1c003b9593c1fba7ebd492dbd6be962256937336c0222b8c0ad4d3c200378cecc519f05553ad414fd28f2939ab3eb95483a2a2bcf8e0a00b0a8399d95d360df5e62fa7914e476f767f971c11fdf8f168a0e42406e3d5c1b8706ac9c212845bb44924684ac4e3e17ea4269c8cf8c60b4a3e8d4d65f448703032c704bcf09d900c6344d0efe8a0e36a3f11cbc051af55713e0ce30c4b93106032a9be7a580ae3b280c684b173f2bce3a13b4eaa4e6b56655d05cdacd3671eeda022bffc6e631c9b10c758edc2591b20b5008a87dc6074ac57b2ad0a999613b5e57031abfb737d33e27841a8820e916f16b47fa8ce8db6074ffc851a1d1c5dcd15f510207676bfaa746d2ba75bf495a6f2150efcab35943ade2809bd6f375a9ea8f34f379f3881c0d39338f05b358ea25181e7eb9d90e46076005b145e07a60b20d22aeceaa57844d347112df42f5a07788a4acc393743968064a118a9ddc0340e595cb6de5363bc505c573b20b0bd785a179d9e3ce328858478fd878212717fec035635aab396131618bd696738591798bc60c4ee0e84d451384ab34aa1ed63cd10ecb73c84fe8927c723a98e4acbf463fb12c473fe10faa3435c7e56067ebfd952e03c01a7378b1465f19c9a4efdc0fdd323d90f6e05d7d074f99f853425ba7d3e7f2dd7697e187303eee5c1a8c20f4e5a55bca638abbb6c69aa92e004ad85f9e9b0c14855009f3ee786f226f5e92ed722a2ed5765fab8382a25f20e4cfdb5bf9ccf9a54c982bd9ed73bb78a9e1edafa639cf6f0d68c8f76f94d2bebc2986578c3e91b4928083d67af95192539936ee3e0a5f86bc196060ef87b63867d030b5537de49a2fe4a919517b3ede27a93e2b1c5ac81e5b7db0a03d766b6128d2d60d0c60f8ea88a81c3c7050379139792f6e37f395248570f96301ab6d947bd412ed477dd87dc519eb9fa6294f3698d63b5da1503f40fc5fc0f47e155cb7f5d6e97dd406e90220fddf2206cb35bdbb2485e1efba81a7742531088d211aa7492235dc65dbf0379e19f4f7e7be8c80c5f06a7469f6d33d37c50988aafbd0ee3fdecdde4d9f36423c6c739e40a3e56c29f9c9d1ec65438fa784318ce2d30acab68a4ca4681c84992fc04a02f29ca26b6d54962eb6eb6409e296d7291fc762f2dd81a3d1eceb585a1f08c19cf1bdaa907a5b9ae5801841b36cada103a6b58ba459162157feb73697ca941d2991dcb3cf7ac0e561da8a0501003ea5fde0c59b25ff29f2719830bf7c0a756fac5e6a3dabbe1d71b58d988884657eed06d2d85433248a1845c409d6298e67e841594ca9792f11012f895899fa6194d16ce662ade3e900f1c163c6f71a8033a655a9545753b4dad0e034ea84909b96aaa22ef05c2016ea5acc4b35978fd9715759a28110db9f8e82ece3795677976fd6b83081e6f723f318c7ef2543bd297fe6ccf1804f83fb0503e8e77e884917f14139a25d52a50a3709c357e350ee699cad4b80a41aba46accec4b46aa5be2f1875e51569ad290e0cc91cff24e44037b6b5ca3d399e74a97abecf387a8070698f76a7367dce9067af1c49ef02d81eaa41c6dc69c4a3f5e7492d32730e578b82e00caed4f3ce9ff8cf7ea8e99e3094ccde9ad4df5251fcb1d18973b12ef16f2990c8b9d976904d72a1786f942ead505fb7c72705317e521e29e03c143c9021a9034b476b2e4e118adbf6785b2e4f78617b66f353db971e93d22fc08ec169603ed6db40c5352d543dedd7f90cd1081188ef55676697255ff8226c7b71fa52916b639c2f8ac53d335acdd40a24de3e08181ba71842cec6a07434de408e3e5e1960766895cc6960ea246f1e215a4e96a1733eb3cfbd3a31f14a40eb7ab73c40f67514dba0565052c8335341829d226e5ee73456ba182ef938a6c1e444e7a00a9503f244d8d19006e5a3b8de2aa170e61a5b53411550a1eac8e74b727dc338f4739b39be44aadafa50f54f9932c1ecaf8a9426e3aaf46bae9e5cd085f40f56903ddc27b3233bc3a595bac8fd8adb49274a6f65b8c3dc8cdd0e6738a86199bfee189c31f6efbe98ea1112ad9f8d7b121e76ea78d92fba129abf99786592ca74fe06fe00000000000000006dc13a040000000000ba61872d3b6a5db63f9d7d9b3648df56c6d2875b9089e3f36a7a2d44f347b50a4edb766636157e67cb2bbaaedea54fe43b74d90689ddedac5d3d40dd1e34c6a506da1379bb550352cbfacdfebb287cbe97edfd766d76b8d6e24310c5ba58ae00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a43a7afca00b38e72ef87649ffb4f7b97b8f6fe82f5adabace782811a6a17275b0785f96432c773d96545187d5e2898df4b8ef98b2090eabc5b8c17e6bc10c122c20b01a1c64d9c85462654e8ed38139656f4764036278922c732b77b767ea2f6ea7c9da91e6322de03dec23362979e93491c7e2bd2e72b8a9886e405180c638020280edabf69a969ba9613e8f9ab4ff50e89cd97e687ed3ac94cdb19456c13ff3022934e2898ac255d1ddb6dfcb2b8b8f03f30f19ec3f68552eef10be73ea3e2cf60b03f70b9e19c85310a03c01178e90da820458fd3930855095cb2c29f70c8e8d2f1352253aa6f848edb4e26d76878e243b57392a8c46b1bb161381f843424b0ecb03133d0089b17476288479cfa84a05c6655bc4881908400eeccbd17b885ab3011602047c93d74cf7f9f1addd456bf4612eae8fc8526d0451779d262443adc98574ac03276ef5d5afff976ef198b319b1bb04ff9b485aac0d1172bb9ce93191fc552e39020095449f824a114c8a802eae32179d85189bffdb8a17132696fafe99e8fa7971031dc33fb56ad765d670eaf2b89869e064e6fb5c580c4e1310325a5804acc309f2b99e8ee0545f69a1ea39a4fa4afe3ed2679a8116c3a42bf2852b2b620d53eefbaf4f8cc98c20953f09d5257b379bfabdf39f0ae2bd36dded16abd7d0900837c725409d01d8e8b93c7e37d784644383a8dce6866d772a824bd367e7a685764b8bf2e9cf446a61a01c676cb4cc675befc337f73991fc592cd06a0bfb7c3d739475ad9a25da16adad3f8518a1ef287dd8ecc678e651153cb27096681df07cbb5ed64197c5666d98bce5350821bde17ff888a25c7c0293f0c9010549231e533d24bb2b99331f4786db0072704147bfce4621368fdae2ba058d65240f4e18f12a0761612ae339a77beb4e48ce5bdde9f22e44c3d3967f66ede189a7d3408c900a779a51585001f744374af503285d7e480a613f4519d229b1773136325085dcc7ac5c13cd15b4020d116fd2d3c554fbea4155a7f2d87b1d870f5c65da86debd66b730295eb32db448be2c815606b8ac49b6e9a53cb2094aaf48e524c0e90ecdf6c94af7185c2bd06103d143924e72f60d9d52048c28d86a10293b5841489ab6262ab5b9519dcf1fe4f13a334cc9b4f95453734422dcee59a557e96d3c773d693f020105a7c76817e9addf0ce50801717b856434d58d188f876ea1acb70b77065f546f9f79b686091b2b51ef393da8ce5f26335a629937dcfa7d35a8dd6338895024c6335c2101a4e5998bbbee824b4cd54dd4582b7bcf4965cfbfdccefafb23fc86dc25233ab1ebacda8bd7d32810393e0b627fd55dbfe9607a40918b402b078606fd8d1c3ac9921b4e12774ae1a841c79b9b626fccc79a52ee2a38e919818edeb1dcc96cabe4f27d5eefda2caa173fbaa81da69d9f7ff019a5ffa0bd5bf3d45f8e9aa36cd739d5f6b87b5514eb91a14023808cb68c9de343eac7eb7b1cdcdf3f5a665702e9e65ba3f0e73724bd98a9ae77003c489f14fb31dcab5677463ec95eb051a7bac425a50a01418dad99a984d4194fae4d348e1eee56100f2d62efbb35c61736bf30eae524550ca318a1f2677438233b1680d6898428af3ed8b8876b0b140e72ccbea7016dfac24c5e97268dc656f7ad8877860bae96c7429d40f76f6880c1f39ce230d06d67a1d62038e5655620ca3ddf9d18094b49bd05379d81e361787d7f990aecf2b856af1768fad047eceae3ff24ec99a9bb603d3119b48541a424225cd6efa48d6d3e360636ceeeb449e5b52b306fd078f69ab5150d0ffc15f361d548f53ca5d7cf4ab195b076a31dc25a0aefc4d4787c7c5aedadc61291f88c0f3968dce945389267948b7099047b9c4b3d5ae7fcaa87cf1dc31ed7f90a55b82b96ebd78d6c9d4bb39855c4a437418d762ac9bcd5538ae203fc9321396d24e20bbcb9fd8966b7d48f2ff13aa7f05ab8c755c52549102849b839621b7021b1171621e86c2e2953f2136de63e72f3e4df7987948ab9909260df1503f1b01de54af7c94297a8f675c99c75c2bd737260f072bcb37b47c7de2ba4e581775f8fe2c0c9fb9f6b5fb9ed0aa587682f13f0327b77f328ef6ce8310c5f989e5bb9524f613869452839a506e1e712c57b989121dceba14c158a53d3f3d9f0a1eb25088fc0a8baf3ddff745877fcbac13bcee60c9d1b1c37d492cbe1b1a4194e7845c2271a625d11ca53039fec0118ae674ceaf6cd26aa6142b2200b2481e5a8678d9cc3c106b804be1469427983c9345188ecbad1f759043270d99076bc397bb8f093e26b415dc133d5b25f605654f4f6ef76cf67e8d511736cfc992ab46f85080d87025592281bf56049e290f5dc18bbe028b7685514378f67f5f770c33e73a3db3933b247100231ae01e88902aa7255e68b9c0831cffb08", "636a0063", 0, 1681192472, "2ee2c03beb995d6d7421fce405587d7fef7eb8a8322f77abe0f4cd2fea913675"], - ["c7ffc0030277db6c493049b3f6b6ee12083f04aa36000a9552aa5d84928e04e5ca7b402c71020000000853ac63520065ac53c953d18b6352fcebbb405c6ed2f3f4186bdf8ad471eff3bf24a5e1a4da55f054758323790000000007516a6353516351ffffffff01cb85c10200000000026552000000000300000000000000000b449f04000000000609ccaf7312b098c7b59404e1c82bb0f75299da4addba0649f4931a4e3bba54de788ca912b1042ae608811f38412ed80a19638f35a05f328316b0f1b279680958a411a32cc1f68070478ebf095048c4aea4e44ed711404075a43d007cb9852e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e236889a6a76bf71720618fd73017b5cc1c5810865513ed32d0c70f511b1597a99beeb4ee04670e8d8e09fa8a222df55c35d2f0fba9d9df621ffb2f7bf219950598cb241055dce7bf854b46a7e81b7109ed2580b44c6404e9cbd760c2d357ead6dc81cfec9171acdc2e7ef087f43a6acb1ac56ca8445ac25748ec934d1ccee0a0321d4126ff8b8c5c45e7b63a47b01c8e2e82e518c12508989ffb4a9f9f1a64a960223cb1eff999d27bc368d4ffedcf49be55071a925e67a65857269ac6cfbb942090a06a2482cb9cdb5808d882a708d3b84c8765d17c1d3fb78f9a25143f2ecd1f18a78ac23e4d9fa62c5b8d2b4223f5b6b8b6e203c5d0fe27f19421ae07b710877e4022f8c2a5175f7680e40288709683149f2ea0cb45491e86666ea51e2082137cfc50219bc274dfe587d4b17a0c725b24f4d0b31ddeead2d10adcb01b7498f1ed1fbfc032bbe929204aa16bf29ac982061c19fa8ce24d40d8577153fd6e4375264df813b0327170bc5fbd29373d4ca66daeb734a86831b2a94e5984c18eb60a797ade652db0322699ee096d0ff217dbf2f8e3b8cd0258b34b662704603dfaa3bc75760df964de24e522c5eab904b6ba507c68195ed2c67cd1812a821818fb746b1311d403805d916b8ee788505d4d1f5f79a5f0154ad2306f3bb18b9aad8cd5164b8c349e72c9e74ecd0605f952874bca6578cf0eabab13de90b45a4973e85fb735deddab3088a33c813d3faea04c4432e869217e0398d6dc75219b167094c36b80a205e067fb303ac04e4b7b83476cefad6c70a6b66225930e464cfbcaf733416e88c5df6d792f322c7f71867f94d991660cf1d472045a0e9f4bc4cb5e8aa3cdf0377b787259142da5eda52f59cee24d2fa2b130649ba7c339a32ece5223910038f00345bf9fb3e23ea4c2f43292c3cac7563f91e87e7a24c3e604b8ae60a9a0449b8835ceffcff957a7ed84d26f4fd31b3bccd0c13ee9178d3050159346906b6a6470e3ec992fce594b1cf3e76cefed1103859fabfd3183aac1b0bb9823642a37c0fdd77f21cc079f63ce441bf51cdf644f4719e4f09a407167d0bd41d87d5001da496ab1d904afb55e9c355f9c0a86c9ea47cbedf82751087fa8465561742acba5492d08b342845457e41699437d5214b7e642d84c7c3f8cd20f36f72d30af7f704998d6f6e03ab5f00af6260704b2ab5e171c6df8f4a9580b18dbfa8396c68f2f8b274359ddab890c19c5d5e0e62c89668a992f92d1040cd38be99aaee4ef16ae9c654356895b8718c4951426c7ec24ebf965dae35a58f3bfab953a7a49e5aefd5baa261dbbcffbdd0fba2a1a49e7753817e3f85dbb678dbb3a100f6240a17016601073338d99eb904b2855964e3d6ead86c51109795b862f0ca780fbf44043bf951516757e6f349e4f4b6fedf6936fc421a374f8cfbc98b2e555521946899c4f644ff448fa06857c8a76679da691b6460d7dba6ba4d54ec8d28f8faa548483d5d887bd9a76952aecd4c2b89e561a22d6a3e898cf65f96758757b79316dc1d09416513af21b3b458f778f86d814ca8807f25402703a7954b8deb7574079988bfb1c1c34cfd58e7e32571407ac7016321d601bc668e249e55045b4fa1d9ac9a9056503e8b1de603f3503a814083d40bd1ac7440ffc2b8e1b7b1317403500061bd4cb96bf930cfa37ea95f4b5715beb82a0009b1e4c4dc559f66926f64ef789a9740b54f7f3d2f9da959105810296e0708cc5d966555181bba3239a5c2de7ec18df4df3deb9e1a20a417268212b1bff4d2c854b7acac6330faa33e333a52540dd6e719c2fe920ba6c0b63861886d1fb118e9941f5295b0705113fede4051e89c10a436883245645fd7cd524d19cd306bee370faf79ddb96acb97f03a11b430423d6c8130e80be3f5ee39db0366023315ee2312dfc5cd0a76bf2c526f3ceae17c734f2d93d7556cf64a52eca4fdbd28cf09c014ecaba69a73a1494ee5b427c1f510c565f6ef837ab20f309fbec95733402db81bc56f06588d852ffd79e41e3dee6706d04fb71c0b25b660c534ea86d522ebc500aeb8507d0041a78d49ebf24c0a5da3ae52ef8124694d52a8572300c8f774d5df39c12280525641fe6b9067a7b473cf5c008df8d54bd881f3a318c5272865488c14e2b388b98fdb2ce427e7b3bd8f1ef36412dbc3149c09ed31ca600d60a8f637372841af46bb22d7f22540a4e8234e938e51d90b8131930301f6f62b74c652d9cb00e13abda89ceff9acbc302bf775acb9b8ee5785f162ffe1ff2544478942db9e08880d000000000000000031e6670200000000e30484cdda2c05beee5622167d77a16a78dea3005b2f1d3840a2c8dee8f6d17e2ddfa4a175ccdfc6c954aa402418b8e1f3fe9a1cc2a0d747a44f238b5a54d6bbc540883fd86b23efe9f5f6353c7c6272ef30021be98f6a0d2784ef4ebd09a2b2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003fe645787c3703d7f501c2f492ac9781530f5c5baaef1584b67ebc2d323332d336867d24fc263e68a7cb813f5aa9b33e53a44680d8fdf477334d3862efdb3f30ed2a3f92bc6e10d1cab9293796efdc1a6780ce6c09580b3904100aef82dba6da399f72e53abfa7733fada33aa7e647e1f64543305bee918ccb83f15fb1d3cc3a0304736be745b5716442decc932d9d2f8faa54a26fffca4fd585a931289b726cc70324d745f43e9fc16f544ca06a4aadbb839aba5798874a7f293dc0be5e27c792960b020c2648195c23eb85a9ed73bb6f5cc1690055eb74028f9193a26cc9ff82759b38146da4e69c3a32eb8a494287815294ae39de984a10fcdaec28e68ff3b3caf003303212116fc82d3ce2fc718766801b807f13600db93e076195cbf29146f6b8400314f92c02fe9df0a7b0b78eb38ee2a91053c4616fb98a41ee2ea5bc54a5d11c250312c08bda3394d797daa5ccaa1cc6f2b55fec1d36773b0fd8c7826943d29fec8b030e5b8b28dc734868e600201b233bae9fbbeda9730c15afd5de23a1a244d0fcfb0327e1346acf15c89f05478569fd4d26f21a9de9e8f6954de7396e9c805648c4194089a5a9323d33e2c93000d650f9a79cc36a689711690050c72431e76fcd1bdbb81ac32c2bc58503ecb8f78bbd4a8b19284c4a2b933ab4d8c55f02fd01d81d36f3f8bc9387d4458a10ff80e71a3d2c50804ed40e7d4444c09b5272658c2342b30481baa53913a1715bdde4ce5cbaca44ba3663c5216b6629690c054eb454643cbb02e3eafc4cf1706f6fefb33272e84c726b5b7959597123363f5d52a0ed940609b9043238dea8aba58f20d342a982a976d0d87d451e5461b399a288cf8d587d190fab9b41eed2da8699f7c03764d314c8768ec77dd1f140c1cd4c711d22412520aff9b8e11f56180999ba2f5a355ae0a554642ab6f4be2c21644836b7b824c2522e2ce92a51444b051094d4ad1afbe2cff1547904830f176af3d8d924f5cdad29e9ab41f180b9adc1a01249eaaa609aed12d478657d5babd9f493d4bc2b7ef44e69971c92a3e32079e5c95fb76ab5df4685096433906f2131c67444a8e71ca37dc17ed712f84de44693e2fe3ff60fe3ca5cf5384bf74044626a4a2863d885437df21556f6bbf961b4301c86f9148640b7e57279d9479a13364afc652b2eeca392d1055030df413e4229288522dd076b7183989e3b51d586f0e5a2362bc3ca5a9abc61960154f93576b2d6692ad1def53ea9a4e765eb55fedd919102a87cffd7d85e1845b1906d840375ad3a7320fb9853f05e00aa4d4f4930a9e2842c2fe25e7a9ef785fc7b4d9931269f11e0fd9c5e3538e8cbdeee3b6efd29bfd5815a801f05d7ce2ef33eff9b45f46fb092743e8d37cddea15dac5006e93c8d26257cec69d6a354e537ca86051eff77ff2cc4c103edc1664997e9f419e698cf1633394678e8197be0e8aaee03ea609d2d48b0f91da52a4466c9c0366ec595f581c3a0cb1fe6ba21f56963ef8685ff3cca447297f8453cada19f523fe5e0421635536cd65e7d9420eb070f8b156cab7a8479da916b8ceacf55d894ec511a1bfcb966ad766cad96e9e684981b183a1d4e3fa26d5b584d4f52543634dc39e27b084516abc4d12aa5f48a6057720b1d3bd01be5cf62614ca3fdf241a8058b064add9f453c885d4dfd0a07b3f334a90c9d45de33d4d958d7c221925acaa2140f8bf7ad3e1eebde9fc1d0839475f16f8135a7fef26c140e1021cb99a7ab23cdba775376d9071c6632dbedad7f3ae47215ff197aadcab2b322d53527aa12bdc1a839d4bca44140816cb5fbc0ba3ede684bd6defb5b3e333cca2e861bf639d7415aa8b8f8d1f0f9bde6ca5f03aef7e49beb166c1aa882f7ade9d145e73cd6738b55379b94240e66046163644f6d2591bcacf774782b479ac4a95b220b86c3a2613e48919137f866a1d1fed651f907f196d13cffb9c5742c0596968f16e2a85e0b9796629acc3f6123afbeb5a13a2a396ec7e57a8c2165ff041d7f83703b33a3d2f19ecfb7b127af4c108aafe98ed281f7dbdb064f7e05f0cb4760df68446bc6d942dd817eb185a3d6f6000c9585b91e0157fce9a5cb0b2454403cee8a82e35b9de858bf9ea34ba90de3a043f9509e47ca8914deebbfd3884be6a1962c6f74087e15a2b8a014d8f2fa66eb5e17a5c30d224d0a72936335d2b8e5e5992213af86c70db5f3b81738df481d695bed878683c6f8f9379fa5c54d57dacc05fc73bb6339b990a180d2331aede3389d1fd92ce8ae0c44d6387486154dd4730000000000000000b5fd5a030000000036c4718ac3d43022a6df945f5d9182fd04cf0497039fde06cdb30bd4f453a7b12831200eb943912aa670ff5ea80b151750b55b1167a31f37eb82040c0a12ba95def7a22a431ec08105c059b5d8c0a0ae70fbc62d209bcf434964f64fa38c3e2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000db8426f0e3733cbaa4c7e0d9e4050070fc3a8bc58ba4e4ce489b52a618e63db04ea988cc011834f372c4553d09ef4e86fc3304797c5859c30d6d8afc50d7935e4045365fe09661686764d18eb961dc70352cb72e595be5a21731ae51c97c97be58a1d5acebe0dede1d62160144bbb4d865b3a7a0cc156ebd451798d98a16e1540229d1db466d518174d32785fdce6c7de2de5cef0ebe8ee7460c7a49739de864870320be5dd6e9a80098d8e3c5dca282592614e4256d10a072f09a7b75f816b6b7d40a0551db0ce961b40808dbb9f2c21cf449a812d350926bf2e763706cb5d033c3259a5d8e1a649a7d32a36d4e13c45995e82ffa8ce2a0b3cdb82982e70490b16eac022d27122556088ed8fdb48df5f6e3cfb1c21519bb476205391dc5a0e153da587e022bcf72f6e4f466aa45429cff03e860cca90744452fe089a8b1f2e19ab20e0e8a031788a20cf75630050e88a53e1a0b99f04def6bc148838c6f5409d9730b2227d90229a043c306266002af3f9b31a09734382a6159aa4a947f4d8f49001cdb80b14903160030539f40954fa3430f5086556ec7a41df146c3d92a566208c4502ac65c0f1f2a8b3a5ba8c7c58315db2eb1b84b6670dfb949bcd5305da0f54e31e29abd144e55fac91326e8a4b4ffc52fe9ee62c67015365451a22711cf8e66e9312549b19716ce27c0a0f7170e3658e8509507902305865cb32fa101ee258fcb14d285213da444224a09dad7e2cd95c106c4a698d1f873a21a9459e2618c332a46f5cd91dcafad8161cdfb4d1ef6babd4602ffeb96266713ef86722cdb71d76e594f06fd357bb0ed9bc64a8ed036445565659bace73795052db44e71dba2bc11f029697ca898beb5e19225d0961cb58989f9d749e67773b64fe92f74bda951c5c69aeb20d24c011a6ca001a9026f604e768a025b43233f72c1113a7b1a2d1fc4a9958d57488d81a8a971534f01ac3ec7f16615be9d3992d76dd758b18a2402a44da938e856802d2bc8696fcb5d40a879f59fc8cfd0acd5a874a34e93ca7b1c4df1a3d56187c38e308e4e267450076066a55675359a7036f3e87f98183364a4da24d286fc78b013d0ff7032d3707f99b81b8cc0fe785d49e676fd420a39e27060a3f0c684b3f53f5c9034656b2149d30bf2dfb3c8d166554b16f7f6941597dbc84ff9ae19250d49455a7981716ea557eb04dc496829abe96cd3534a6c13064091fb55506d9eaa53d236f3ae5aa6cfe8912388a739c3e9f78004bc4d20e203f972b4804c55d9a12188159cf159a8320a6ac31dde32bc514fff2047659dd76712d90baeefaf2ad11cf7f5a47af2f831ef3370a89eb50c0ac6661b544509e4c6c1755cf6fe8a7fdaa46517bb54d0ff97f05fc10c67f2da2abd295e8be7cf732c970de78710779a431fc86ffa12e0c5b8071d8c7d6d33a298a2a297014b10119ab5804fa69b095664b0bf9d3b4d2f4fb9e16628316df38be87f0567dfdc27412145d27fc5e6137cb38fd10056278feb1f9ebcdcff8c8d8e15df44b9e7087979ca1618097ca5a6ae6210fa69174cb48d563daf2bb69e98b1b943874415cfdf72a89f4981e263e0c3f06bdeb18d827f4b177034a8df66fe87e68e7a86a196b4b4d1a1147df6ec11d49ec56b1a563901cdf392ed170dc2809276d73010d49e0548a40bb4f01bce33b569c2fe27960839499dad7405fd8100ef1236f515129edc99afa9002fb168901d5f37efe9299ef4820505aa5d7cc7df763ed55f17deb4799d00c7dfc3aa96f234112ab256a19f36983f722466f355f420902745e52dee257eb65e0d0ad0436ee030c4e34e2c922e0e57967fb2655f31bcce1b00aa826ad225b988a792d7a8e2da318617f44df1e1195cbfa9bd3c67ffa7dcf3a892113a161e0caebc84d3088f00689fdee603afd819867e59ad09de75c81d7bb2505b47ed58e29dfbc36e02bbc7b82908bcdafe61891471296196cce6d7b98531a08b0dbde6d03eae4b9b622b05cfd1ba3b9f9c5244f74a555b2584c8f7e2214239445469a1f6cfaab5fc3fe346a407b2f5d2710ed00809e11b15497cf1b0dfc56d223720a6edf5f7fa80fa4251e72e691e4f9240a6a1f09807a0225e79792f96c92712715a14dd14e843f30a6b9732f81dcf534974cc7c9f19f4903fb1efeed493ceb7d092272ac56c655501c23b985eb129876d232243bfea4ff1d9de9fd415d520bf6f9b134df4fc01f0454f2775092d550b2a67f43d06e902e64b56e163ae43aebaa8ce0d4c45a8ce0ad8a655ca37e67b7a94796d622070358e50bbf3d38a8f84c54b22fd66f819ea2d65f61d62ee4f78a2ff4b291e0ab7e90bbf06a452296fe46dbd80c1ee479f036832e8f0467b08c03414a914d18f0766d9cd1c74e35dea8ac6429a70d3b8eab379b0dd57066ca3869d0fc7ceb6249d2bdbabc305", "ac5151", 0, 1104836853, "bfd576459463db362e13a854488d83d3a9cbd37d4e394a8f3cb283ded48f585c"], - ["a6bcd85a017bd509f0aea493b6c282bc2a09d2cd715479dea3764a77e4f96c270b0b97ca28010000000852006a525100ac53ffffffff042154be020000000000d6b59c040000000006525153ac63531bdbe601000000000853ac526553006a00f1950e040000000007ac6a51516a53510000000003dd6110040000000000000000000000005e7b28b4d058e3f8aaa9649165f322964dab636db6b244c33fccc9731a77f70e33bc26656f89b85e1d7f1d42e8ce9e4ddb731667a434907447e1ac6c7b3e8260423d1b5f1e7e8593a4fbbbb64859875cda6206971f64cb344ca16990e809d45c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f0f49f2ed663c8118efd74d6465687716f0f6954d6df6ae2330b67f6a38364a94f135513a704d3458af1cc62a4806381c677840301e64b99b77693bfa8084eaf887318cc9831aafa882da558c5b328b0a58148f875338fcbf20574680f558266063c218000a8b5f4c37871ab1dabda7e7a15d485df0af83ec1cc4ffb997d60d02216514a5c04ca1e6ce5e9e181f9b017d4261d7c933760c33113c295bcab615e0031cd147ec6384d90d6e9ea0d89f8c3d371f574973fb2d9d574a782a187bf22b9f0b075138b8deae540125f8efc06a03d0b744c9eff100706f647c891e207ebb0574606e12e475f62eba95cd49cb85f11c5c66c9908996d54d6c50e3e01ce45e927a031c97b61d2f481b34b8b0c797545a13c1f3cbec4de0309306d4511c32f7865f20022cbc9e74b8edc2ae93991da2d51a132db106c35c887955f31bd95d9243b9379b030d3a6d6a4dc31caf2685c19a72224d6a903fc9fb594f5ddb92dd76fc3ab7321d032875360c3081826154c108d4b316643b5de86da2cba8d7919e0c51c34a9d2f22031a0363c75e6d194719f73ff45a016d5231692a60c144f145df454f5410d8c91cc194cc70f7669e71a9f30cf97b490820707d0ff8f3194cbf16a81b8df6cff5f82ea2264e8104ed3314cd2b7c8920e0a8fa278df20a4dbcfb53ef725ddf94d70460ed6eaac2d29ea8badbce473a9471f373dea41a1e09ec66529ac3fce9cce143408f999305140626cd33f5f07160bf3c4ed7ac193762663c259aa511a4ba6ec9d6b7b555493d4a21a796a3eeafb575ee2096535a8e6d542963b4fafc16d601e2de26e7198a75b553b2202a315eb68ba479f3afc581589a9e5c157ff44987ce0d0e6f7d2cc8f955dbc78a40b77d96f1b7016d3e40b436a41b0a40e11613b32dbc59b64918cf97542f5bd72714ce37554c58e70da64f103abdf86e1e36a9d8448356d82315d1d0207306607c8a1e0d8df0049e594d5f34636e380fd62dd4965a5b69977085e2947ee3c9e6650416809ad16949d8858ae05f72eb733d2c1ee8dc41b2be43f66cf352558298526c45c72185d9009ce1bd4bc1c366e6366d7ef949becb19778746fc8bf35775486ef60a52b276e2e063249755298585d1477aa900ca19cc12c2d507ce316d3a4b1bce123d24c3c835ba9fa7aefcd3f272e85526b9d7f71a113add79c9d01d85e4528f675c4ab948e440d76935d78af8de459e912b8ede72fd38a6074c43c99d664d82c10848249bd2a2ea953bb0911ef4d465668d7c86a42f6163cd9feda0175bfd83bf879287d1a3803049436a6829879a0a5650b76f2830504d6e5206188feadf82880b541c6fc7cd9080b9b90cd075a951fe24862b0850840c0d884ce9f59810b6aebd10c4c037c6d276238fcf724cdab0d33932c63db72e2c4761b6a7090adf22b134c8cec276b8a61539512a4ceba6d6bf7eab0246bb5be8aa95c064dbf00d09a2251574474a89a7a22c91a5106f4778cf9018db52aedff37105518d67f3b224ce5fe69e10b3a9257d274a359e278c3968dbba8e210ea08fa5604999f65c37e5707224da2457dd5a30d2edde7cedbb09e31e65902dae3fa9d43fc3adf9bb1f96311b2c962acfe745f9772cd2e882f26f7db53b842b9998bc08fae79b9563f418cb9e6d24686eb800add9cbd6906bb439c2cdaaeff0e983bd11698e8c77adaa94e3f996270afc4fcf7d386f14c4d9d8ed66b18e9ce68ffcf8bee3da31e718d29598d26a41819c32bcee6558242fd5a2b41c116b21b275eb3c296822e666575a53c7a18b4c49beef4e1b5453a49b06c704f0166a7e544439cca6c74e1903f719397105b87cbcb446268c18730c97790e2126d9104b055b36cf130e9036ea79dfe1c4e40c97701fae0eaca4139ff030642dd6a455841150101a87c1aaf1b7feb182411db3d857fe3f68ed5f797866c50b70a4a0dddd5afc8bf6588cdb1efa05f91f74dc402d606899f45c438a2994fca4045c257a7d6921156a0d8b027a0f2a39dae8073f8df3b5c69de83c2db1ef42daa493d7c32d694a6d5ef357c9d0fd01bd112f7dab6f79110e7b9788e36d962299cd1522cfa0b29722cd0052f678b3295e86ead09536e317c26512fb427482b0e8cb4fc8841b8893a4050a0b984bc2e9f85517c447eb593a59f1cffcf948e9a0ede6971bbd4aba4cc75635e6f8ca417ce0c603ac0d28408114669d10ef637fbd36ee859e50a015dddb8d92f42aba230f8b691cf3ca745a711b3f0138f281143f85252ec6e3b0686b3674eaca018f3361264db338e1cea400000000000000009c36ce0500000000bdc6c7a5c09f09080761d9c78180bb0a49a4bfaeb8c7d7e60db08664e75ca99d46aa03575d6e9ec8cfd467cca5fcadd0348bfdd295f345dbe3b7c2dfaf556f71c6e8667ee432b301de1442132a8f73f5c7a8cc6f6561972061e78d54a5252f8a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a65f04ce5734b3185fba7c2bba1cb84fbe0eb8a240234dbef211f47eeda9e8632ff4331f287cbe5f093597348a3a2a3c761ff74c9c9f554f2d43a5165735e3ded39c70fd743e7db4e32527c78b0e5355c50a79e4e6c7da999ff2bbc910f26d4c396bf8c67e7de2468b6ef5ea0ea6ce97c59e2318ca08e7a4b975ca836dd27cd02243fe8b9509eeda9cf3ad7d378648d2bbedba288d921f8d046c96267cc78d1fe0206b364657a0cd7668e7bf1f09f47ab756997d496ef9e4877165b50afb5ddac410a022ac9a6dc40d9f913131970c33351c5d5d6dbc8fc98bbe82a75faeb6d0fc04e0966f0f7fc3b27c09b1704e78d8d9427fc83f8e5979c8e3bc3569d69b1172c160215e3b60d3e6925f735b062b567e7aa97f62f7ffda016f1a3ff1f89ff22c0eaeb031b68bd385a50f0e49bbd5526fadcb76ee64d4287dc3375497c3e7ce717ee068a031fa508c14bfd9417bb096a23f3fb2d7f1fa73fe2fa4d05a8e21e20a17c5c78f80223b6be93f7b13933169794169e87108ec31e08e4f312869b99ca6e52a491ba69030d32ce0d903feda9942184e603d04cf7c2046e68228a9200cb26fadf0b857d3ee06a0d1f9b9fcb337d669d1e0d5b5fced469985d840e1062efa5367f2c46955acb482f004c035dbc9f66e6ac22e275c3f116c9b473cc5ba653e1e50db2330add732e903f84973cf85a185c713a6f6d3e7f41d0278e70c05a7c5ba293e3c675f4a52758f2eeb9e095f3c5b3b55f04a045dd29e3e6294841c5344460e0246c6b0e7d9fc4a48b1d0f7258f4b4996134aead480cc4ee15b6696a784de7d1253f1a714cf3c1976f999fbb0ee46caa1f26f61dd08a3ec2146267f238e9b11caad4fe51d3c92c3ace3693eda6e9f27c255e65d1d01ccacfd8b84eeea5eb6f7bbfc0896eae7c8240e244f65213cdb33f31b227aa0ba0bc8ec77c7abc7d4deea0336fc750b8886d73af44b4edddee66eb4974d5a7f1834097aebc6899789216c2c9a7c179865df5fe42fe459d6dd8752419c7d82ae03099cce0e7890fb55a4997141550e2bc5a0c2571a8f1213ff9bfb86339e46e38f907394038f0275d0dbe4dc555ce877d6fe7aeecf2bf8a2666c61fc797cbd089ce14df444b3d7f261b1bf59b088b0f480c5ed6cf64599de8871fb24435d63bc067ea06db34e789fc57b53d7b5bb1094391fd28ce5a45444790ab581cca1dbdbea0327678e2976fae0784827e91184224fa4be6d28a26b11f8e720bfafbb1a1262fb2508f0ee519118f250c61c00c3802780b5a6a21aa6484e5bfb45b7618120edfe38ca46e1f2dcacbe515cc2840be35cd82db41fb92b128d1dac7eebfc981d5278df7fcb5214a34c9f44241fc1ac114dc3224968e10114b18ecd0f3d344fbd132f079e484d5a7878a629a8255203afe720711a82220875d51dc6fa1a30c42593133923aed8f8418cdd263a7c88114fc432a0fdb5385c0d051ec75b595008529de9d2a09429a7bc7167fb96c7d9914c6285121ab0a61143297615d14b1001298e99d7f0b785614430afd6483bb35d3373f07fe8a32090eba6a72f03fe919d040bcdc0d418cf2a98cee1a5afa359fc190252a44c06c0207949ea644453db7bb5cbc21cfdc924df7f8a4196ad35a6be860ac7f73ce37e01f200b4ce81f9fc1001e701ac8e68679a2fa1e22e413e99e6bb27578d72e42ab9513a0d2f5049263e3d2009c9a9e9ca6a4ee185eb2daf620a06f6466461a990f9d47af2d5fdb4e9f13c4dc36b8fb8ac023c5ca117e7882bc3d2edad8a2ce036b5e6fa93373a46899abe1274fee7634102b08fb698aa969cb4b2732b0dd56518737a15fc2dc5a04c74b7ac3efa19d9b95328679ad2b73cfa302bfe535a52c8848654bb6f280712fc05ca24ff961334c5e6a49b331e0f5e1b9eb346f1fbe6b3f9be8229d05a41372cfc6c5709d4022e8d920388b5eae8b836eb6f9a229b64a184155bb04784d2f3cc6b5d03b86a899491ecb15c5b05a67e31c2c8b97bb60db1ce1ab05a950655306a1acee5b77f157efb0d61da5e5397fb63a1dbe38e4997dd08900768d43fc64be57ef8fa8f8c069b0620ab96e77da8e5b5070b60404c354c80dc4374c658287a9e848c7ecf6fe5162683609a50df6889d755cbe54b2ad9207b019019f9e6a7adb5e2ca4a59fb5c1b8bbc3c936c7bddaa96bd3aa26c751ee314acd3672af8787df9624a07a7e51b03254f2608c7824038064a988dce1dda2b83b99d9990750a0a050bda76a98d50db0948fe5541de5df8e51496e1e004b3d35ef830c21434023cf09ddc561da1ecd00000000000000000000000000622a2fd37bf10df0f94a19ddd6bcc1520e910d7f0f50c80b9d550e51f9710eebb5f8ef36cb1ff7086390d4fe7bb0a890a41d41fccc7409053ac54663aa74d05d604760a9f7effcb7ae19d440a8cf29f267c228a262dda42777866e35b494adbf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b36bd9a615fc24e2e982c100a72527f924764c7516b1602f3937757c4525ed435d0acfc827a0deece7279f4517dc207f61d6f64771e53f15918bfa0b8359784575c89b527832d6bdff820744a5a029860e40aadb79ad3531b0b70c79db4f2684b8e9ef070a69f5993aa60b3807a1cc8f96577fa680dd04491403822dace681302243e0d946c0c09729a7cd6d0b2004229aa33ac9e5888b04f1f8c7452260dd18a020fc8b314cb45e1124bd2855f799c1b1e85e6a7e16eaab2da75ce147261bb1f950b045dbb3258e8bfad31fe3cd3840db9fb1b63483b9941733a391491b64c7b140b6d81c41b8145e8104dabd848e95c31e08a2fb32dd990be5ec1c6424d0704d96903015df3569449009c4e157e38eb631743f62a0ea39a6be5ab8f9141e29cf0ecd70322111470b60b99049f580d8bec71134833fe80781988c1c66ddc78aaf783d81a020dd68aee00ee78074ffae9a5e443a7e2596851004954aed43c73139efdfa2b94020922f51dbebd4899365419e1f2dd7fc3f492e75dd11efa952212053dc8e16d0f031c4b2de59ce9ddedf53dcd2ead766b2f52f3138e230ef548253a5e5433794fab4465eff5658e31b27a35e287361aa639597aa5416b8921eeadb8451e3629349a3f3300f4efca8f6292fe9f0527f6b4ff4e31f923aada8a2c93cf716abf6d414294cbcf65d66ac6d5cf45e5077eb5c8e06c58cd921befd8d5ae6e62d9ce63dc09bd0f8ab4f7fa65bbccd8c8733e396c82bcc0fed605d5b34c46e1231b95292cd4994547cd3120d250700b4092791b29f4a14d41ccf8576c5bb99de070da777c32cd363fde0de625daaa2e4124f420f7af9bc60bbeb9d656e8ba61251f4ff334f32f24b77a6fbbe30a7586e48e5486cc204fb143a028785b89ae6eea6fb5a6a2014952059be422dc54036f85182dfc56f8d1de362a963a39f316964618419a74cc1872239ff075ae369d3d9c43ee0251553a69fefeb0482d1a3fd8975ed76a427cfb5bfa69795e040cea16059f6a8ded4ca05f797f889bbcc8e10e702e612a6a9784a5ac29c83fc1b8cd3ff46bf9789aed28ebe8b9efc0a6f525f0a56af509e65ecf05b598382e4127783c6ccffd5c5da16bca36b34daf69a38ed6d60ca6bca28b449669abd8541c8d3184dedbaa10b2574f7dcfec84601c438308661ac44943cd8561b59328e1790f5977470dd51908bcf6941c234c71eaef1f4544ef5a787b5e515f5e124e0479cc3eebe759bae1be388d534b2b88a8d57094e35c72c88eec343b4c7e640eb97d5444a4c0b485926b730b9c290c1c99484744afd394b1eb358fbbb6b1514af1808e120d7ac39c09cf7aafd3ef58a63779b86968c79bba0ba3f8e4e72415cc9b1517e4163bb9ad8dd83b5813bd37c7a1256d4c26396c4b0051e0ab120d0db5381570ec8a4dd61816f4f429d12ec32192073a08d5b0b23076eb88c8e278d4672fd1865d07716d001af0f38e67b3c9d1476f52430ff764e448366f58277c33fe0d6fca19fe49db944f42345fb19b040439eb588277bd7a491756131e5bcaaa215057e42ae7a4ec5899eb1ae474e6c6c2125a59483b9440dfc2eaec5928c51ab8106083afef72e8bd74998c7ad1564dbb15068251497dd96b43530b1654d7c8971b234905a1f11a6206343c4c35156e3e011264eb3183a8576d77c39cf43fcd919a8a9a1c7246cda2883dae85d6215ccafc67f800699e366259daa5fa3fd585e8f0e821773020bcbcd716784fb9f24d07925e06dafd31f1c0d668e33ab94964c2b162c911da55b8084d6cf04bfb10dcd366fbca4ff26327c1907ce9f0d6bbf5734eecf274fa6d80a63a9c494a2b4e56439cd308bdf788832799209654009f79604bdce92c5e3b363e1842fac11e2125be977e9f3a16230b9d392023d2bc2016f2a0dfe3a9a07e822978324596ad4b59bb323c582273cc1eb4fc70fca52d08d63031cc5117a4f8615e88b48c368aec7f6607c4303b4d270ee22830b1644c07e5a290ef0dbe18fbe1f3a49101e2a8aa8ed83af839d43cbd44589744f2d0480100567a4aef572b45e8647970c7471fd219c8487254f711e5e696b6ab4dd871f9fad482958d49f1ecee151db078ee62d1064224e1cb0a61fb4a31090f36b1f12a31da68b79dd639833c30ed0b90d7fdd65e5ce92c830432a1e665b48766042fca2b46e646c1a265d3c908bb7f6c17b5eaa6be072dd4c9df58844a0afbf56934f0091bab1a8bb6ea4d3d78fcbb86d3b60ef6ac7be7cb3eda87b9af5b13bf828dc07178d881c897e218a8e70186c76d7ecf8b4643850f5cfd48da4541421869b3f31aa7e5fd01dcde0504c13e34d1f6d8d774fb4dd7d7992a9c8d745ce82dda465a635ac55de2ea7d75947827207337e33f19d134999cd2e2cdebe9b95d8415a3a1adb9543507dd5a1b1974a6185a5e0c", "005352635152530065", 0, 1384987576, "11aee5007633cfc8739a8417a2a9c8bf72f9b0a334e2b82bd83ff5467a148760"], - ["030000807082c4030393cf05d1230e57a9d96a953a137c7b8e0ae8662094c0590978849171ddfe8170020000000100ffffffff1b2fe9a55979fb49cde8522e816557a23d1367bfba0b95d6c9b1b39743c58da30100000003636a51f1c7a3971f4a4a1018074609268dc32d8615cf2a689e2e368b48e4687417fcd0d3980bbb00000000026552ffffffff038e1ad0040000000006516a52635152b476be03000000000032cd2202000000000852535251536565650000000000000000032ff20703000000000000000000000000edc0f91dc1e645025ede4385b64221461cdfbb152c383df2df1020b613eb7d3909ae5d906f318ba7119e32c00bc3a007df8611c02844c35f7c8e5e25a3b80848a8a418108aa70aeb708a9c8904706b20f3a68874177b4e444e2bc1069e48a971000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006c7397253378a6b95c436cbc71eb13d259bc3c605bf0113d0c49b55fac311f6f7e950598ce1e196c44f344391c78b25f95559a4db1a5499ef6f804e094faf88b1be97f0c7a46d4988919cd05768d7fcb6fa10a1e168d4076f0116f2bd716dfc417a8412c869de9723e35acc785e7998565a1d6a4b681b7cf6be7d0cd83093d21021500b13b29a6e3e36deef2da1da409ef4165c44f05c6c6f6548e09f93df00ea3022b94b2f4c5d37726d531dc2e799723c38ae2cf076a18c045c555a039b68675460b082210768c5891f7461c7234fcdccdbbd261e1d555a7a920a78d849d9e9bd3ff7ab3708ff6df3e8427310aa33a7ce1edb9cbd2bf42a512b9899741e2ef907732031e934c86b94632f276d51353dcb7b95fca18ab0ff0db85d4faa6933ca481ca12031048c7db80de913250facb102e9ca21e33c9e51af7b39887a1f089f0b8ad4285032b22eba918182c721ab2fc7f520f078d8f8955780533c706250aa9dcf580e48f020813e0e0a0cb869742f31b6c189b26094f7d2fc04a3764c0564f9cbf5310d8c40329c750bf30c91003438cdbdaacf6e29f1554a6478ae5af79592e63d22bd4ed4878dd3ad02d4f792ef7d9ab5066cc73c93d4e184f529766dc204b2c085578c97f80cf167e65f42b7e1f6e43c2ad4c09adcb3fbb87d7cd1335c2b88226caa3254d54567ea2b6502f3284067d3af47ba34d452b09b11030cac9679c4b3c4daa9b9a038ba25363385eea91a686e86abd2256d130eb4cdcc63fb43456894b643c11bb309c702a7c15fef845b9ef9924ba1bfb0479275fc504269d251aa4098c000692076bdb9052bee78bc8105a4efe8b375b10f2dcda00a5002003a42bc3a8e554807bcfaf269e0643b23d437efc60dc7c31106617e3eec21ba0a42de181785db0a4a737bdf9212f9394ea791974551b96309b16077c9cf48ab6b02b08bc27171e64ada25dbc6918335d699ce40fed0822f4ec7ce500b0b88a4de999d9512e4765806fe5ee0ef9bf743b7f8acbc06174b8b21816df02aa3d4e7ee4c8e6a578dbc5bd4d019ab7c09828a2dbe034bd0675f0737864b831e27f3522a3201d58d9c60944590d9b5147cc2480459acedbc8917e122127e262a2475a4abed9445c5c56df9d140558e05f5871887a78217b3bd06e025f209d6be2bc8465909347cad61bb86bb0ba16a847b81e4797d6b990883f30f50fd20800e316c9290b27e78c52cf68cc6c7b3187461d3cbc0274e9cf42a730f59448c99dfa71765f612a6a494291f115fb4fe46812aadaf9748ce542e6f38abe3debf55330b265aa4d3b947e41c1fae80a257b8f426f86321b0d02e16aad7348feda7f9e10116e2593611c0beea32c01e33e53a542e519683413bee5eb9401b11bce176d4a4a2e0ccd46ab9c6dd174f91c2281abda776f9264eba2043c0ec9fb632a2ffdefa97693fad7c31a96c78e2834d8e13386c451297b40587e901c9119a7b3d532e08be113c880e20c6096f50cefd1690f3b7ba8f837b510b290303f6a4e7fea41f107bf1aeb2e88789ff6946be3f849293b8e1e6652e0308fe6ac5ee98a180fccc22f299629fe31c2db8e688910b8b60ac7d018583eea1b37e51c741b7d5a3fcd4b78a9f9b70a35ed03e0f072c1d2696394d5a642a2ecd4e5b76db3b72543c2fc2e395070d5463d2362d02616c11b00ae47432e658bfd93f8a4eed5070e7b9fad177d5f7b893f7c8dc432af811cea51d390e23dcecdc666ecafae905eb7020957038884f4c249c893eea128b4f638f69a8ff917c42719ea9f55a0f0902bfc51a165d0aa078679ab107bbd8c56d8c44b7ad33d8d063769174d18d41871424c6bb2f25d74ba501164ba5d36bb92335398e0fc6e6c847788e18af6ee0343db844f34ecfc55d2c5d32a486d71f148f9704a8602e058c946ec36547fe4377b6cb4c594efae3d400e31d99311c692d9f7430864036253e806add8e04ef11928e3a8eed9eebc6aa623500d5e0b224043e6061eb10cb40716a50dd7a2aae43ebdee63a1291d3b200b438b6b7741ce0b738d85a1bf923b49b1f03a10b11ce24cba88c07b6d90724b77469446251878b937275b8ef78cfd8324587bb97cd6e6dde670a69cc90f2ff5b59018b963aedf1ad20ffa41136ed50b28b93952e5e975ec1d974c34758dd7f8416e224022af43bf05ead616fbd4cf6a87b19d5fe26b30992a57b19a2f816ef1bfce33feb04217a1d3e39ee862dfe788cdf5331dd2fce2b9ff17a1cb192501c684dc71a2c55d91e1a22cd078fd02015c2bd29bd658307eb80ff0eb851c6c020000000000000000000000002faa3a5367f77da7791ad881331c70ad9d01957971d381f8d2e8e2dda1c135d942c91db8f62d693a063e4e00e68fcffc3cc8cf2cf3567cb24accc0d0374ddeabe0f4395f1d29283edde6c9f0646bd5b97d9d54cfc4631941666565a6cfa8486b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d3b7470714e1581d4b4e26db727e3d50c0f64e1a4aee08be548d4c1c7fc03a2cd2be88949955013a531747616b5fbbd456b020ccfcf88e6114dfd65c240883506c178cb217f837fb7d0707aa489916ef88c633ff5ca71038347dd418cb8e3b02fcc5a643892ed635d3abc1bd6b645a671b57756c2a9e7049a0f0515bdc612a7030819c29cf61c84a903fbcd66667d2e1d20bdeb71f6c4b5a76787219c5d81102803291fa91eee21d8a218ef68ee8cc370316eb13137715d40c2c9c58cdcd81166110a05939868330d66196407824eec33630d380684fd532f4840ef50e65d594115a320de66c2a242d699c5980ed91dee3652d7ee36cf65ce05399afecb38d9fb60da02083175de6fbdcef9644cf166b3dc55c1caa624ffd7f7d2dde9a47325e47d2bb7020c0af1ce26c78777d9fb1056a8a0f43f69b95b3136f2ad1cc9f837fa8df32a1b02271d070273a09c167b2f92f783d15b6571f4f35ac3b6b897cba16e65e0f8a960021f3cae1b6e5db48e491bbf48c7a87d04404fcd4be7fd820ff5ff4bf8c253ee0e02088279c191370fa68dd1c1f01961b091bab32b1ccafc31883da709f9753af0b015cad1f51665c2b4ef284cb178a8039070a4cf9ff472d4efd101df5d2855b08dfe4c12ab978aafa7fdf6d06b9f164f8f52234989b4ec736dbabd1a777abdea5c0b3c78a91c7ef5356898ce1ba0293f74f866d158c102af239289636e275940a6f7eeed34a9eb6467c3d70fb1794d94856d7575928ad9e77651c0daf22b0d0a7d4113a3875e1c436f5f25de3d756f518973ab2448df34c2edc2826716773312cc10c23c8c18bbfebb1c32495fcae6ea1851d1e7877061b31e25005f1420e89a8ea1c2041f7fe5ab82be82df83e10e0eb91423347dcd183f0226ded8d58b7bcb9e15f215e6a74d8c586eb79481f5a3f6b86ef8d2e39f6217da73280ed8dff302f6811b1dcdfa0bebf60b2a2db593f58676d8ea8804c601ecf6970a804147ff17239df9dc22a8a8205d77fcc85426e5a2e696a9fe00f8c2c2400a06ab9c7b81f3ffd4c4fb66f94ed89914cf3513079b60c7e3796b01b9e99b1b9c761aee32fa3a3529bc25cfec5c11044ccfdbe9e9916d0eb7e18ab7563c09f0efd5499fced4d96013066559ee6b01fbdac33542385cd83796ea11324889d47b67e43c7be81893cdb6203a2ac39942c71991bcc50cd382745104d238d3bd9a7a4fe968acd8afe70268d4d19155395ed168c2ffaca86ffb2d90a4f110984b2e6ae252bc297b3d054c84f3ecad1bbfd34eb7ca8f8435669ff1cb9cca76eb4254c59fa23c96db3f42ac37d010460b9d71b14fb3686b0f2459a785fe06a32a3eb4e188d80316f649f764a34b301f657b3ee9b2d23f12d5535ff47f4b3367427181ccc6594f2d91d48e929604951fe1840fe5b4ec497310ceb418980805777fe4bb277594c9586d58b35662fdc09254e0ec201432057c3e29cb7e490b274ae328e9b62427acd94f9b29aa4251fde1594d6c8019a41cd9dbc04b5100d94c82971e2be9615ad2531587138a31b2fcd8883b40f1254cd75ce8c92fd68c2040d13e3c33bec0c70c08e86eaaabe42f19370e3317702ab90e36146a2423b0203a58ea0bc73b3947e73f7a12f81a41a9ae0c3bf7ee1c58919f62f0af85b310274172c9c05af6d81a6d06248cd99f3f857f4cd19ca8491a8a333b1b3873ed3a74637f7a0c6448cdbb88a1ea00d3416a86369c51b1528af67a56bc4888a75526020b1e6710f97ff19bc64cc3f2736380ec89d0f5eaa00fa04df64ea33303907e7e3eb652eea347624ef93861ad295bcd17682dd4d7c7fc85f9c9d91706e52129cb7dda39f05e4e11d3282710fa4e568efc5531dc1259a0cfbd737089a6724a3d43411553498b733474746495f1be4d1e130766de1148183723fb54b474163e6116c23c4598e824b6ba90f36829053546fc4be32ec1b69fd98c71121de0dcd9c78db89539c5362a00d1355bface7d80d120c03efc4398bfc0667189a84a39c4f0b7329a644ba68a34b89cd14728a2e4e839a7206a6d1c68f35ea1a85cb0c4e3549e50b676de7cb226192a473936292d83c78e5e749fe8ebadcf73c8d6f74dc2fd5739857f6a8484f1cee4986d4356637f5decbc434996b925189d1750652ce3318eab6b4f3be3890efb4c8cbcbed8023786f87cf2bfe4e943f886016a0dc3ad1d59608740b5f0f53246db7149fa7e00eabbcb2dfe44a898a9d0b2054ce92bbae966543641c055fd9e3eb48cc03ca32b07cccce3af67bb1d01cd0b509a8997ff1d5200000000000000009471f60300000000a9c169a294f9b70129d2507f42c1d98ee853cbc953acc912af4835b1c09d76c5be072c1ca0c482e3e6505870a993441223a0d1ff05bfa09db66ea0b58f696aa19ae53635155c2ab1db986bee179f6dcb274cf65111d93914ea3cb6ccbc68228900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fc537d81bba9442a0872f2f65c11bdee42f98edff2431c662b2a0b8a763583df38a59d6914d7beafe7f63f760f14857a958bdd8a13ca5b5210d89d21557077731193c64ad82987bf0e2f745cb0950d78ee5194a1ffbad883456f5732c594ec7c21ea08edf7668f6d69babbc1ef95586d2f1fa2fdfbbfba8a428b4b9c0abc23a4032f31845f7558647d0df52eef7a3e54abaa1697cc1fe3855aa57ee51e2b54e4de032c124b38588e79fa543f858371090c58afdfb479434fd89c144f64e1a2115d000b062d99d8ed283ce6efeb78b2cc13da5ada9f425edcdc4409bc520d8198797fd3c0d168af3e3767031586c77b624e6a99ecec7f137cb8a7bbbbe9ff7f3f92a912022be3dfb545cc3f29712145ec706f7de2832c1807c359f897633a9fb1a9ef96390311720f918117be735c5cad600aac2be8ea2085a8dcd0ed03df704e315bc542e402284abbf1d0fd941b8a1e14fbdd51d7abf975637a66b33df06325cd01a41aa9520318a9b9ad470d1022e445530d3cb12ad98fbe2c35b1288ff0665f440216a87942021db385544dce7e86707a8766b70894445d47c6681e3c6936f08a37b633b03f4733a2a2d071fe6cae6d2cf9119daf3b649ea8d03ef89996ba5cf7522693db8837aa26274024453fb514dd4bebc08a89bf2cbd14a9cb842bb4f54be0e79c38a433901e00bb93e949261de3f3ca7620caa3541fe47bad6b857835b40222347cde732b021b35db2b8acbffc5eb3dacef12f3e2f503427b1dd961e7e59134f76f435024be684e6609293eb5631dc7f0640425a5937e8baa9d35a77bc658a956488944384d2d1d5872f4b5209638fe121c8bcb9bf0254c8684cc995cafbecee18ce9873eefec18c483463d32077f7d01b361dbac89f31827e505b3e04c8686d25204113451c3217d0bbbded87f16ed6ffffd7b0dd336e144a295fc8b3ee605d38cd19342fe28af6a0cb9c3d040deb66b725113b62e105d90ad03a08f1375ffb6fed58538e12b6542f08d5c2bbb7d1895e941b583612a047a4f348d9ee1280aad8270b7c785a9cf04b2cf1874fa8e07999b57f9426d77b60b0fe46ccebad723c9f26e3fe83a1f0f58c7030153828aca2900d4f2092af82002beae73d08ce4df9a466dba100e0c939c4fa783879e9eca7b3b4190dc4b369e9a244ba5995c00ca8beda3ab9b554c9493169ee6c30d0bf7ddb8a531d23f7a22d342632bb99171b91ab033603c41ca3410d334dc07ca9e57a8498fcf90f7d523188836e7a8a377fc441bf785603311f5c45037e559f47f6cadd953449f65f3ae3e3a1cb72f2d0f55cb135f3d837f41fd36e39738041d6789c26dde9ea00f86ee97f9ad9aaa608c8cb92b1038e76ce22d1e51bd7c69e4c88913a60935bb028b4ad05ebe2a6115808aa5228aaac2942e85016b1f550b0d0a30eb0285a7392afb056c8e2a4b359e1934978715a52af318a9e91045e5b301419149752efe22cdb95179ed68a8f87e795b991a55d92654dac4d64797a4c2417e41847d56a52e254fba86a0857bc6e15a264cb4d05c16149c24dff887260744b56f4433eb60218f01c9d713575ea6e7ed7995833c832f094182748b727fe4b940bd9808353e41c31f9567cc91485af0aae29ebdf62e6be98fc60f6ff45e87de1e8154f6ece4aead4ca976283997327201718d8e11c75eb2c5e6f927699651aa7b1256940429d0de3c9e974a1d823c6c311271b3ecdccac4639469e69c22103b824dfa6aadc134efa71111ab224dcf90399d37d5960f91e795264967dfbaa18224c949db5c84c82ecc675cda32e363755fecd988d85777e338b7dc3d1a1150f304300ccc56dc6b2baa4cab771e2e3f551e00cf35657b96db35b08fd1153f698fe4e6b96d4ddb4ea559aa8613540fe42de6d7ae22c8c72a380003b454253e065c5c374a54b24c05418b37a23db1ede360cdff8567d517214512c3e1a91bc16c21aaad00124ed4368668874d40e00d48ec3625bfb9f7cd36adc62fb6cb319637a838511d142e812e17396d90b2e5ef09efb933bf4aefd7885e2c65420d209cf426bb06bc4b14be9f4b73e3833c6b687a5c725e09f2ce188be3cef74fad4f0c8f2c9f5dd334ad2f59ede5d8b349dab2834bcc2b670b712af2ed05d5b649121862298e3ccab0aa09c9de79a455bfcd3a9088b7ffd0e951729d1df9181cfaa0397068f09ff36b43f561d7e002c990d407cce4c7ae47484f26fd34e10466200f05667d7a429b46166e29c0f2f1117192d0faddb28220109157e82414e3aa1096bf5ebe705ffec4e6b8558279097b576c75944b0779063245dbc44779cde1592b79e2be26cfa4421933db1f3e623199a99ba3ae13132f0e1c0274c6a3f54d5a8cc2baff7c41240a96f3ce94c1a754ec22b1f7fb31aa799168e746e599cca032b65b58926515a9801bce1b03", "5151515252", 1, -2016405598, "f59828f3889b9657840d63c25492eb704aa48509ca1864c9fc312fd36dc1808a"], - ["60d4b86f04b46647459da06067c35636dac39288fabafaa463f7b470fb36bc2c584f651b4c000000000353ac632d4f70faf29e347dda425fec021b55650f2dbd4a916b7d443a3e956b161a0e636385ff21010000000100ffffffff43833578dd53f52398ea89fda542f0e88db0707d269991a2e4b7df99387147130000000009526a655100636a6553ffffffff18579f498aef1724ac1e51c63deef0538354547717c53592652bea7d6cae1dcc0200000001ac956e2ac001e592190300000000045151656ab247a5f800", "006363", 1, -2057479642, "4fb6be2921fba3b97d501f6eb1a6b0fbc0a95c14ecef8aebe9a076423dde9b76"], - ["10288c5703834cf29b0286bf94d353c90a7e3b88b71eeeaba401395f47856733625a0e3576030000000165a4d5d4d2aee9d6e0838414c7841155e117d19eb4952fe94a3bdaa9fda77bec2208824b91000000000653000053ac6affffffffa0a69676ea453e5c9bb80745a10496fb68a2f8401a3714b58080a175d193f28b00000000060053ac655165ffffffff022ca9c3040000000002000075c09b02000000000665656363ac650000000001000000000000000003800b040000000013c674d9d9b6caa052b0231208ce042bf2f0e07806d13b0c38e2cb67890f989af5064d395548c8dc446e8fe283a3c3c08af088a0b9a992ef52c3d3fbfec5756f568a114d2cc2013dd4de707db13684d6895085213e6d217814dac064503dccea00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b05b28b10e78fc5bd79e48d3d90510867547ea7aa6d91c7dae1ecc30e8d2ad942e2b4b7a3066635bc884defc324ccdd00cce59cbda0e10fa18b8d2a68606af84c4a34d0466eebbf0006bafa09de6686bc83a35def8f2e048ab6077527098659db4557076a07d213f17103a9f417e9ad57c456b084d57150b33ad4817fdf809b80205758c64e68c6ec3ff6153cd6528dd8026a7f748fcf7d4d792772d8555dc0ab802220063aa0a40301569b2ebc3d9348b5a054a9183076f62f457da43137051cf3c0b02d45707656b17d2d2ea42e2e3624a393ed3ab9117adb4b84d9d1700b782943fcb01d874830f1454d344308ba9b2ca7a74a5547f8d8c345c8a2a64ddaa15ba01031be8ab5a69181161497beb8eeda229fc517c195210f7e8da3c07fa9aa197256b031cd52d146097d95152db88ed63e3f8358f9024acac8c8028ce53db15514559480205024edbb0548790ee6c8c0c196c48c6f016869ce6705c0d6ff948009d1e255c02095676aa64941a706beb67e397fe86f3b7ad287d65356e4491ee8cd25fc08707030544e83d1bbf25c0dcf01877e2c3e2877fa9862002e9295063c8bffe3f2868f0ab7f5bdf3d81c0d223695c8bdb547db353dd339ae7430670ab0943c06a99198de7756fb9fba7bfc06825efe8b9976d8d3a6e92a8cfd2e3a9f349f6111432c25faa58f2ad4444a9a7d3d82cdcf8444a11c16f4f706a4e5092992a3a365195f6ac9cf5d50fcd15588191d66e92c2745372968903304f16818c3c8f5ecf1d41b5e27b3622b8c33cc58bb6fefd116bd8631f05a7c4bd84baeaaacba437a9c92ff82b4fd463c5c7dbd5618e79c33caa445a8048410e277b18b71f49f923367ec4aafac4124cb34d116e5da42ce7264a094c10c015939eed2a5b0002d859c70519092b6ecdf97ae1649af8a826393f19bc60f5d17993bff85b36ab1036e503f13372d0b6592223db47d683d7456107c276ec13926496bb6dac38f6b83bb567dbb437b22a5ffebd29245e8e37f42d179f62745d7ba174f8581ff59562cd3acaf14d78f413a24d5f50ad73445362f2e1d21d11986d0b3ee877c49123bcbfe92c0d4349895537ca9a280025e486b40e4457a249bb9f07048329abf9c858012770d82224ef286db7dbf9a9a5fefa037c291ff86eced13448db44de75c1d096deb7491f376cfcb05393c6114f9efe14059b4299b0d1c99b4a1c77295faef0af65658dafbf38828bb5a1da20dc04ab25b59704716c4f32220b6efe6b94189af8fc85ceb35ec240ca4838935fedbab5be1944ffe430068ff24d672c1bc354135a2e46f1c236504f31a75719b281df963b059167a2d7353f90b1628212649ba838584aa56dec10a30f5ac97115cc078be7a71c5592e9383055127a32bbc1a86adb34ce8929a2d247d655ea601bca62756cdbc5b93aeb1b671fcc8dda3f83a194bcda1fe72ad7636c3028c8d80345b8afdefd8205181236e496c5469c152eaa9eb333ce1c43e85696cc902860b6f84ff1f12bee2b7a696e1f60d43e26848a82dd7a065f905e51771c6c5ac81bb0a7b0e013fd066e4d783dc25a208b24a1c8ebb2080947577e915e7083d21e2ce1c6e5f5760d538e441c52ad82e0f9bfe5bb88b028287e1bb147b55c2a763b91039101b7e4cf2478577628fc128a5d4966f5681e3def8aa1c5e1f4cf41089b5db8f67ae42f3d5b8756f3093c27820f8c29e4f2d28db319075f0dfde973a8a333d351636ac475cb1bf22a83ef3ed9cfa0b4aa2b9785b224d846e6d3a38746c9b9fdd687b22e4919fe69a888aa5463bca092f85f19de7cab95c11eb26d1f186cc27301f507e4d90f1a09cc173e20c197040d880dec5eec8def6f8719b8f4b0671fd9d054e3fadc69164b00a666bad9f95891eef6640f7d71693d56881b9f23abd57607d08e141c5b6c1963d3925c23d51d27473c70d5e16ef1cbe43c82df507644c9074dc74f20c8f83a8ab29d43c995a40c2f4836292eaea0de146f9856ed047f889822948cf53bc33e9d7dfabf3bbb537083e9c16344285a34c7f1d4c9fe9ce0243fc7879b7bef8f51356cce49526d0131232d0c8e7359d7cd4ad47beafde2d5bbcddac1510bb3bead69a75ec56584d360922de807ed37ad65bd0ccbd04261b53f4b28ba6cbd4865b8f20539c3d039b99f01c301771ff5a078dde0a95b733c629d3628819c9789fbbf5f7bd7c460237d09fd35c240e4886792764855ebb1a782e1d412724a7e24b867b3a0c3e4d528ef65f1381f6193b1cbaa0440f8c7bff312ecabf4a7cb6badec0d0811e2c06b6bdeaa526142f2f31ee1e6561ea0a6aa9bf59138634957f89e17713bdf85a64273438f22311e04511e9bf12067b481b6151e7d118feac09d10277f87a2a52bd296bc1cc9a5f740f1c3fe1e8b325a6907259d353c351e4e14961d079edc650a", "635200635352636352", 0, 1247706242, "cbe2cd78202a170a5e413433602577877956bd7637a13fb7cdde18808bc9143d"], - ["045e720d04b2e1e3baa4182e2499dd7e570057cfaa14f20d8a90cfd2132f6dcfe9b87e656a02000000046aac63acb2b42a59ab6cf6749995e310ecad321b47bc1ac49bc2f3aafe4d89c916cc0714d88733d00300000009516353ac6a53535263e0dd6499a80d4e93e6632c90ba36463aad347b29fab7c872d0ae0891d32b33e7b4e88fec030000000451630000ffffffffcf23dbdcea5a7f6a9c5d2f1c57004681c5d411df41066806069220f67fa88b0800000000085200ac00536a65acffffffff0438216101000000000153489ae3040000000008ac5163520000ac6a0c6f4f010000000005636a52630022b3f202000000000951525363656a6a006a0000000001c7972a00000000000000000000000000d9d9556beaeb38fcc0729203479941316c3c856df2254ffb6c1659ff07e9a51daee2be7c3e27923e55dcff18f43ec7556d29c6cd1f213019c58b4d26ed24da4b6243989e57922340b80e113f02ace304b7f87f67968a97a570c4f4d5e64685c2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ebb629a94b0719b09766934c746de6fca9585b0b2a6ba4f7533eb949114330fd5907a05ba51807d1ccbc3fd32abe1e54bab2fb3a7cd2a0813fd615cd7c5d7f70282a8aeae28699695e9fdd59a8f27f78fe2601f62c3f19c23ed7074bbef486c34ba62d64cf8d94ce94ba2cfd563a77251cf59c51233e5c99559e989c16d4f7803081a4e6e81e56130f339e2f50f20c2610d28e20be0ed7922f3820e3ccd5ff07f0310091ef34a752186aaf3424cab5ce18f36960306293c0f7a379b2c97f7dbe00d0a06221a50ad05dbbcc9a08644551b30303fafdf82ed53ea9aec4ef4e641bcacfeb4e27ec63a5a57b6c3e2debac8891aad5b6f6aff585affb55fe6cb777dbd27590324fe162ce3114cdf79365d4b7ed6653aedde31975b1bc5a5a30264c777f6dadd0230479ad6bca608f2122970bd66d5f18f9803ed34220232ef516d04dc1a0301fe031c3160df336b803cfb8f4c31972f76f5ed703434f4dd57814558a8b526c323e0032c7a0b4ebe37d513ad171af1fbedf754b045df11a061709f51eb9c353cd942560311d554c5b7316e840f44f41d77c2dd56db08e09ed14e1cbb2b423649e4be3f1033cd5607d596b58284e2aee965d78cbf0ed3abde66f0d1095ce9248aab0d8d3bb277beb84e5fdeb128458f6b20b40b5181bad2ef2016b0d3d2313f1eab2dc9a7675f4aa9b1fff897f7c499a6f0929a0ccb1d06cc0f0aa312b4a3426a39c11f6d9a71d3be21577b452064b21976417c2ecd3fe4edca05186a30392ccba53d58e55c89b9c8d74b8362c52ef6cb656746d55989d72347583ec45e32fc6281ec6502c5675509221c853c6ff15817866e72162913d7128e6a4206f4bf94021977cb0a07724c14b919e6f852ad274a0a639e91a724d27d0f9c40d439f596a938be9441c840fdf2de7b0ef2a5d624e752c5128833d1485b32a72e6e7e0790d4e1914b23266988af02d1708f0b494f482f0a8751908b5670c5f911965848bd8eb623513af27298635b7bb214644bc44468f39e71484e3d16fea5d08a0918c7eb2921b88fb82d5dc13d62cd0164a9a32d10b4b1e7720c4be940e844a3c2a2d25bfc3fbe74dd30f0a765ccf9bde610bfd95a80751add3cb15d9204467cbef538abd46646d2a7ad1f212cb920b6dabe3e11651fefaae04ce7850854beb90751eac958ddbd616cf8764916373654faa5cfe78b470dd1652503eb6291ca305ac833d69eb6c2d2f75096d6aefdaa6b381d62758335109252ff3e3bd9169c508f13d182f448936329b10b86dae33f9682c1167b093629bd7d459e5b41135aabcfe8fe378e99c0e62d43e9ac5df33fb975d347bcb657437b32b4736bc8611ec9d70ba596400cba6f61dc0d85d5f21119f95faa5168110fd642c50dadf9609573470c96c461b018ea75330d46ea3431efc66460c564ffbbd62993b2316a1eed4aec341f97fefd440a745a9eaae839d11db613362c72fd088cc365ce5f6ecbd9c8aa87c32e83a5210a9faeae77a058c71f6f5d9b0c648688989115c90f8ae31c82d624088b0179d6d5f79c7bcd74466eb7eb2b6aa825f3f875cd3aa511212ec2dc547ebdf3b2bc682225c1fbbce510a1caad5dd1a60a3fd7c59ca8cc332fed96feeaf50496ffda1b56d5ed1adcc404d9514b5b02f3293d41b8abf90d75a9cd56a99cc7e4ca488a5a88858df97630df52dd9c0a41cd6df62f6a0983135f36d0afead72547c898b111b2d74431a42e3059c4cd6627d82a4f927c42f48c54d2877ecad6236f43a4542fa581459fa3c9c202521d3a2ae7542e33cf03707027f662cb15ba08df22738186fbcd6ae73d2a89d3f3652a0e1ba74b0a39327cdddccc33a923375607cff59dbb6da29d20603c83e79fecc488fda7c664e6ca71036b952a587049dc6a7eb2a44e57162df1d4a48b8b67e9ed46c8f3a29575da18f2ae98e805949fe577f8094793326aadaae356a8c85e3447b20302b8b462094251f0031bce158f5f9c338687f11a7c392e1c1170ec55f7cefc1c567dd3086c097dd33100d4fb23c8f67b9053b284e751b8e67e42f9d0c75b7296f199aeecbdb43110fc362414394f6e097296d26b3f07d63e8176f99d211cc5d8100ebb21b4ffc6179e334f8b4350db6b9e6dfdd918f902e38b4b9e2c3249751a284335d4eec693a243d25e7a1efbd5a9458126ef0c7a85caf9cff684c7fa9ff7be0f84a958b686f4468d7d00380c77586b56a8a256950a5beccf613e10554b2942bda68cc5927c2bffd6111a69a6930fb758fa18bbba9c7502f198b7c9d315ea8367ee32f764d0ba996fafacb563b95a9f8fe271ec971ddbedc699cee49f0489b9c86ecc39dfb45eb2abfa5437a2d5279145fa867fd19decf828b37bdb90d3f3f2f88eeb07b5304eaa9210c5daabb80905edc6103730dfade5353705482e771158242050d60e", "526552ac", 0, 612626910, "9df73b749160cb1d5784083e2e065f474679ac5b05d9196c562898ba85f29698"], - ["5dd2094c02ec05f027949f6e2ad88570bf2cb64eec9bb306c23cf1503633ce09473a0b6519030000000165ffffffffc2641ea628655ab826c97490ae6575e5fabb3938b9eab6a9a7654efcbb6647fe02000000000050190f021402080400000000025151e8d3630400000000065352ac63ac65b58a57b2010000000000000000578cca02000000007af43e3166048e7cad4cb11fc426dfea9175cb908fa85adbd468f73e39be2c5636b46af9c730000f2830bf87fd6b8c07a9846e50209e3bddce0b40228da733794a644c22ec6201386638e780c480d24d4dafdcc605b632a87485b3635fdb5eb2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005245afed75a594a8f1c4f91a112b748dfac18bfdebf92977bc50dc699d73e06fdf6a184a667f74d51c3a844d832068e46e77f971a1c8d4f9f6f25a87f73d6c5748d43fa1c6ba6b117e70f2ce0f8f6ae3638aa259496364562cef3b203f3648207ba99344cb2747df5b5ac205d6d66716209be90a65ad3050841305bfcdd59482031c51324a64d2971b29bd83fc757cc33e67f6c1c5b49f9b4d707f0d5550152dc1021304dcd0f2717f3accf13c2169da6d8b7da36f76675a1d62c4bb14f5639c8a7d0a0632fc864e383bf6ab08e8fd23f8b3ed55fc1a7a124776186e861c5da282dbd33559dc087f3cb83753cd421802e8bf41bc77366b7cb34f3e80205b0af1cc78220311660364ae4cc7e21ff77a4e2fa3fb90c0757355e1aaaece2165d72d6f9cc5dd020049ec1a851be6289b1e08d177731a1d794baedb3a2ad7c345562e4de4d10a23031333247073ff8fa235c238a27f6e3e596ff5fd28b0561f74177f4971c0c77e85020b77f9fc4a02324d18f74a75e05d2a0a05eb39d77ea954607f9ba560f7fb2d13021b05194fecda920ef0520526f590a70ea7f7097f887c43c0a09b95c26eadab492f9760f3d3808a6889f8b91798ae87e81517a3a7de3365aa02eac416842e0d41a73bbb5a7522af7daad45b51fb43f254131ae6dd464f2d05eb8ea3f6f1c21b9e4339a00d760413f107ca5185e2f33faf8bacf457928e343e5d68c0d35cee6f53b9921b3a8a46996b20d2e614d6458591566c051a471aabe4ef7514312cb79be7b8c6865eb139445f888fed2cb099a8f7d606b97b91c5fc14c83c91d9f6a2813dbfe4f19e272f6de62bb674f12b5283a3a99b09ca776e69c870eb19f6b70c862e310065889557bfe9b677de94b928324df02d755d5b6800b3c930fdc0526e4cbfaf185d8fb762f86a0907d1f86772a22200dbc9934499e3da1fb36e1f375d0f56da2ccdf88c9d91da02ab4a6386cb86d4ed7a9798352cd8e4053bdbc4319beaec42426a772c92bef97c0f9e9ad0c6ca4119ca9cf19c9b771d0e0ac73726b7450cefac436fcd97c7b536208f92ead38523cba50d80ad09cc096f99e4b1ad00f9d95e4effe8a4deb83cd56a0fc022a07a192acce63f63200172b842ae909453201e3b6e42edcbedee1eadf1a0aed83fce478323e4746611d50a85676a5a2c4409ba829f7b0fa4d8d8e94c017f3846c98706ddf7e8a8ecb27acd6d1f83cb2d62b32936342e2f065b79b7766f7fa55ea7fc5808d5ade982843aa5853cf00b0f475c0abaa2f9e17d11d0e6524baaab8052ac893b42140377136a62f668ab94c2911b41196cc3b28f6ef94850eee594cf325fde6a64b368eea5a765bd2a45bcfa2c6b41be2fb7b31eb943f9e62b2cf7da2c6799f6d76845fb259de05c77b715582b7a62987e327c4bddfdbfc1beea9e53549c36e0ff987e479c32a7fbc875c1698752bbd29e21566d466857f4fb38ba106c9dc790fce71c751716f910e6b908a860ccd99c73b836fba9d951a8dab5cc0ba7ba703571abcd34c00af6079ab82e1bcac7be3d897ea9eec9f3a80173d7002e368634058e51be20e72a0c5a0bfdffe55612555e8aac2ad077566f12cd8b2eb3ff75fe5f4bc14282e7f574d5bce754eac9c774cbde497954b1f56e8d77caf46391eb4520af344fa2626c5cdbee38f3ececefa7b844f1f40da1532b1d7cc9861695d24ffa9eb59480dd03b1454d6cf092c463b04343ef3900ee4f6e34e31ca92df0b7cbd04a5c97a838dd366fd04eda502f16830be9410dc78b27e34bf6622e67546b23ca9e04686ae8dd89c94823c82b1073b4ea2a9c26eb292f78c68d59d16a1ddb624f054223a181be357ab90c2969705f92d3a3d04e8b4fe653747d14e5fbe6ed152218e28f3208aba495df5aea70f4cbd9939587a76c2921f4eaa55d569271872da657e80def2ac5599cb5de05ba9a4ebfca86fe6ba02a534f232b28a8b3075b27c4496243f487929305e3b4d151a256a29efbba799fc02562fa834dc4c4d57258b17c6d80286518c1a4d518611fcb96e7a5e2abb41eacf0ee57d588b8ae82fa49254134bb2e5f5a50bab69b1c851d683c061941f7d1ad64210c7d21a9564d99386a6c8827b57020a78905fdbddac9ac4e2d4d94db5ab1999132330eef5dc9e4125d7cc6e7b79a1cb176db4a3f50d191676fb73d3a8b09058e5ce1a3a691994baf0bcae8b685ae05226747d6698d29ee2b68e57c2614bc933b63565cf8d67b0ce15fb23d2bbce44d1ae6ffdaddf3de34120fbaa4fa19d184676e4bb89c849c85d487629f8680a7bcec9901fd2a82d262575f0ed12bed0006ba15914b67373d3a37234298c88e769e15d0fe90257a037f1d8b9ab6bbbdd5f15cf48d78877b2385a1143a6431ac733b6300c78b22992280c06d0c2d6804ee04bcf3bc749e6431d5a18701", "51515263", 1, -893801797, "bc32aa08b2735c946d8c88f2d3662530ffe7c73b88bdad51243e12bcdae8a492"], - ["65813c720455d313ec4d8074f77fb5670ab30e4cdcb4cd20b41b60fbefec5b5ccf4a0415b60300000000678aa31c362d3a93dbbf3492ff25e392d3b9cf735b55d3997d27fb789869920b4bacdc580000000009636a006a516352536598898658f5103ac249888cb0fd3660c3c47757736f617e75612e2c96b887c4e581a77051010000000165ffffffff57b576f28b59feb607fbc98e50976574f314edb7635206bc06978b16ba8037da020000000663acac5263518792464e0298980d03000000000452516a0027fca1040000000001630000000000", "63", 3, 1796291103, "69fdc980921aba720feaeeebc96d7a0a3a642afb9f9abbad502db9502d077199"], - ["c8b3024102346e547130029fe8541623ab9bc8413e1ea404499c0afdc0cf07c399b53c094502000000085265536a5363ac52ffffffff1bfa319d2e1c08d6a78c5e15cd63ef9c010f377341663e4e85db4ce57e0177ef0300000003630053c97718be04f77ea705000000000700656552005252b43fc10500000000096a515152acac6a5263c4c00600000000000165f91e2201000000000253510000000000", "520063006551ac53", 0, 122318710, "8a82ebe3e2138799a4bab22b954aeb5d6475f935c8925a0d9b2a53689a028562"], - ["030000807082c403017b2be0e9e5f8dc4351882f704d8f5408ecea397c0b3f3554ca3c7965c2c4c7710200000000ffffffff013d7419000000000002515100000000b13c9272010000000000000000de9ed600000000004ba9c2e54981116881ec8b7965f07bb225beed1f1f988b79ea94d6024f1d35f124cc501a7db84c5efff18724a7b70a68fa775d7d7483410f7c70f137d716e58252f7ecfc9514ec0b5b8a48ce768dc222f0709f1ffe185f93cf595ed342e481950000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045e6d8c1f9fbe3ef44adfb6bb71a78402cdc16a89134eb718c3ca8b41a8476ce99f3008151f704b193e81437975787bbbf7922eb904e6af1c8247e60ce78fa8f181750d60fa1e4182f1e379fa3cd6e12d15e0e2b25a17ae691f83cb01cdbe4d6a5dcc29075fc2d38d4db1e973bf42fd1f1858a48d735d6a9a1696b144605f04502239976dd319a3ca81d4f2d85935ce234d2b79969df18ec2eb6dbf9a07728dc43022629188cb2ff4743230c88b68ea770269dc89ff604e5f07f339630214cfce4970b02dea89e95732751121493308ca8455991f76ea19166684cd5819ba02e325d4c804b7c0baf0c887d6951a80bb9c9fb4e13f3f410965cfe6e644bbb0ac6c903f0022b96cb4b8d4ccddd6ad2cce58f28164fa6ea3b19203b491cfd0ff224944c214102027bff6e8d85cb036fd913c4ccb81cbb989da5aeb875600e62f4d08f5ef93065030d0b80ae4f593d191d10645609c9b7ce9e1e25d9a568b6f517f92c117f9ad1590307f890bffaea1cbd9f2d8ad6328aab83755524eb7d6657c947cf69af69bd54280228123b007704b8894dcab24d3de40c615e21ca6cc983b3f866c22298538675ef7b480514d431555a55eacc628905fb379ea50fa991284fd60b848719565c57a6c93d3551b53a2841b996582b96f4516ff55b234ac6a76afcebabaecc9ffd4ae34823909d1be9d5d733c0ef6f1e89a88266df0a7a3d0e03a8507b07cca98f8ac4d2db4b13af70e9acda445fa213e313f0070f9f15a1b1c894c557f41403c90c1d1c3461fd08fa329b02bd665f48c09e15978baf5c105bbcdaaf0a9138b7f26b12876705887d8060eeb3842bc4d2744fedac20ed89490887dae71ae1f1950538d35df91b05a7d366635d04e641a0dafe6cf0b7cba79f624c0f1732783b8255d0c103003f51ccc93dc160ef1f467f25cf9a171235b3bab24aae2c5aa8f004991643f3eec6bd368d57b00dbb06a595551daf7bbbb75ba5874defaed5a1eeaacb89592a93889d08f7cf211dd8c54d3f017e6c8bb7c7a345413b7437a51af3fb7deef178f4253f911d37d18fdab3163f5778a50e0ba6847a969a754621a320d35d70d376b2395e65196ca6c5115f450cde0380446bd17322f8d352783d69deee757f68c1d313c93ca994646b5cbe713112ad69005caa1c7273b23064666061da46872bfa308ec0c278274122b684f024390bc336cb5f05a716fff099055ae9a8efe6c282e3608bf97b8fa4b5ab38563a3939adb2f69430b29faa3cd3c116535bfc7526d3797c07b6598e6f5d470bcdec40b77d2180d7c1802047096f36ef52872e34ea73d1064a943ca18c9a08b9050695ab61bb4fda67553b909c85adc9295d00f367ec515362c8f69ca99f3300eacf6213abbc486f39a11c936bd0a43b52dfa8bcaed63aa207fabe59f808c1b3c1de60134ef5ba3ce11837ee82ae34286a4ff5a2802fd3a77999fc3b7975a272b27fdc966e0abaa27eea14ee13645443b8d4d68e73295d2f183963fe7c6e815f6d22eef165f15905555afc1678c1ad2327a8ba8c8edf2bfeae8690f20ee241434cac4bf9e8b19bbb240cdcf43d081a48a3a40d90975c2b9db7f1f9800e03dc80204087902ef665ee6e9065663482d2a39d2d26da374e6efc8283e3d805a614d89deb3e6809e347d71cf769db5a400d5ce632cc6335fca7f374e2410d4dbd2e123ef8498cddae21b026c4d48aa05d50cbbd1e1c9c1268368e9905dc90ca6f2273206085809802e1acd7df117861b4dcff785fc3adfc2bc6ca7295863fd9781b1a033dd21618d9a3f6bc0de070b0aeea39e37fc61e6f61451a098532fd136668c682cc14edcb9be411062af7fd52fbd89bc044bccacb6b4dc813087509a1f412404ea033dcabdd307f622ffbc363117506537a0b1a5425194e121737ece8f3d1d921492ffe9cc981d447417eb5925352c4788c72b9fe28beb27974af1779f29102961c79d351d766881466a4643cc747c9d4482763e913eab0111df3ae8589738cda7ac53c4c357f5751e1118f6dcfcad7eb9ab3b42cae4afc9b071db63c9892bbacca7dfa0c1394ae611c182c88c77a17be37610973b306ac89c64629f2d6785cda179aebf4bf7830d4541e8e613623624f59a1e9e264565e59dc6a7034d9fe14dfe06058866f7e7264f21b0e4e22fd7a0e1e5accbdef2eef61b30733b2aba6a210da46e9fbc7e0ae987c883a6abaa5fffb5bb225dfc397a48b67a5574f6d21c611f7661191db6c04e96920e22afcee56270ee30846de3d5266b882f3bede8bd5361cbf0f228eaf7e5edb18d0c20628c615e2907546a32a8b53a3ecb6d815ca2fe595165e304a2f703aee494d9ae8e57e629668b24c00f4e3e87a1405f1e68e7a5f2c20f94e3e41b590dbf344a593a025086775168582a328463760ca17161aec2f3754de3f6b09", "00650053", 0, -1934303442, "f1bca49bb163408d00c331617e4adf6f40aa5fed96fce86f1641d7115deff2f8"], - ["030000807082c40302b87729e5c89d75be6aa1b778a0404af547da9b46d680ab0b17e684532a9d6b1100000000056551636a52f42b9f21fa29ec6232e30a6799c209912b03787ee2560618eb7ffa57b79a6559272a059b000000000300ac008feceeb70256445d050000000009630065526a65006300c54d2900000000000151000000008b40b24803206ee30000000000000000000000000067227591961ae8b9a830f61cb09b444325375569b46dd858a79a4ab9d0f147d7cca2668656ed5485b15dc137e15609c88ae6b6666955b2a812e76db2e31ebefe3edda574a581c402b4f82693a1db5bdb1cf80192035c3029ca4b9c222566bc9600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000821ba9f088d8da35234699af1aaddb78fed6db2d48cd990e1cbcbce75b86d74a7723a73df2c9339a00a5a3a217e729c23343f8429c5cfb6f1dcb25092991ef750f3258c877e9786c34dd9ed371a3902a9c57c539d3ad94cee38b75489c34a2472656d55f7c2c543299acc31c208679db8314ed4f6692ea95a6af259e4b8dd637031408e885ed44aea5206882f24f6ab78c25529159c826a6623de9972079e71fce0224463e777bf303967c5f9270ae78e12288e1f4151cfbb2ce5fc009fc26c3d7650a023003d42148400f203d53fd1eb079e830c3eb683e5c9583431cbf55ebbc5c769ffad410b790754f03f16817a59bb429ef9d14f931b3db8f0d96c4b3ec3009930329f70d44725fc79364caa81acae973b7ad69fc1d17afda6fc4386cc7ecaa23a302025fe9126cbbcc1759bc74b9eca2e3aa991afd05cd6c77fc55b7e2881f0a051f0207704e0d0ae3ac338ba810787e691fd55f52b52942c68cc7cfffcc92a79f83c60309967fb7b8325e8fc9504fdc3ad9ca3fe5e7ea87c320693619f30953efdc163603096d04fd2927759802f016c666237b30e0206bb47daec657d448248204787aaf79eeea8246140a2d213cdb363de47dd709c8b8c11fd83dc4a24a9aed27f99eaa06a1a3c1655bbfbd56b347e424574716eb7a4f8814cc4d5418093ac8e48da3d59f9b9e8244b6486ed5a1d8d1ee4ecc4b16cf5024083b587c64521d9831560ef0045bf70c96cdfea7ca4b24041c56cda51774b5a17db133f77a6222076d6bbe81e5159d9fbbba376f3110466e4beb16d5bd7210b43d195fb1985cef72406efc6afd8c5a25d845305694098fbd3e152e9b671736f6c0b41f0ed0b2b8c2c1b02bb37371e50d72aae00e42520cf09535df40ca59bfa82c8b971b360362f2068dab2649c2eeeaa1bd6c6a1ae95902bd84262afaa6a77d962b75e6cd09f1ecfc8cafcdd7ea2935ec5c2230ad91357dbf1eafdf4ae9b9b966f1ea120e5b2adbd3a263d2a07521bf8b193fcf06f3ea53e7ba4eb328cc1d67373c0ae84f2198be2e1d8c2567d14315a746180b26d28505113c4fb11f7371eff18ee718806792836b90bcf5fd32edd3e0d0de06b7957d10e8e27dbdb17e3e20f8505640b3cc38be3c4ce0d0aecb808ecd312fccd3f0bc8d4315169f7c913edf639e342bcb68d6c353dc7837a46996704e7e2e50741a5eab8cfd6d8ba9611821678b44f6cce0ae18ebc176a2e20c5804fb926f403698d071326e9e1f777c8a39ba9b4e651963597d055c46d6329e8ff965f5618660f50c977c972b7b39a3c6d3390833edc4dee63e1445c85b2ae051f815c5b28afe5dd1ee17ee4d48dde973904698a312b4ce859bc94e1d7177a0d396a9edb98be40128bcbe1b9d5cca58bb416ae957dba4d306e6b9e8ea6d30596cd24b9679ebd84d74ac277e06f7f844df47d3bf2d3581a43feb666184c167b09605ce47c4a2c16a2fdf618aa003ab85f5dabfd526756d467b02131930393b30b4f55a709345fd4429581505e86b97d7fae346fafddc27be6d2bde32614645516cc3005c9069ab1e5374e9397498ffbf54eae59464f2fe8d3a0d2969c51fac1bcd8e0c57091e81965f913505775219a7af5bfb30620ca0d9a0bd0052f6109ccfea1cf41cb5b0d66f84f6d92a64bd6d79cca4ee8db308508fc0707864fe69e0df89cfe5b727b74f392c87b11676f3e4563eee36f9744a7f5ce30c2e1363270606491792634cddc5e4db51ce1a1ff817e127a1c3581d0cc3b00031fe68b7a3d4532ac0ee0252e2b175d2e1467064c40853208e4a9efb80237ee523a4565a3bc45b9c00047c6aa434c66d90518783e28544be282aa6da715a495a7f3468927e772a4ca6baf7a8a25e7dac691dda5e3e1cb7fd7078fe19183504d299d5e84903ef7aa41f41f19c04c47fa6a2c8f69040c4e222779c94cda81791ddfcb0193140ce56627627ce3eb3e4bac923eb25972d9c8b529efb50f2b31a4e485363add19b9130c89d381d41d9b46e6702899bd70a57b54714f907445812c8f65da5c7b7315f2f48e96877f600f532cb934083389b686ed8504b8c72f8a7acfa611936b6fda14ee2a3005652c3356488e1e87a52a451cec2bbd6b829b6cf80ee22d64a40dd8c8516f4a17925f0275ce603f6e2d0f0cf13afeebafa46a0f90e16b0573b33b368ff5eadfef7662c461e779f2d06d24bd5649e4ae2778ba50c1c03ae83f87e4454d3b1c69ec8680a412e922d97a1ec2b6ac330f78d9eb6b3a99b899534d1d4155d03a5b35ecf198a19d92e5bdea530bdc8875ae949040000000000000000000000009dbed12cea685bd641016154cd79d2fcdcce807a2e852a9a4d6f0e510aa9851c9ae04ec2405f0bb4a1d6f04b5128382a5a2da18693d30e633b67149f0f872c028da4ba352aa9633f42f13286f7c087b9930aa22b017baf201e5870c09ab731d200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af9e28a911821b5805089326b92ccdda769fdd088b5c1f9d1ec58eb44923cf955a36935195742d91af07319c4e7df7aca19f472cf280cb8384580f4435467be5aef186f2c5fb5b014aa74156a26b8af76e70bda92ba701c96f1fc4b35baf4bcfad976bbf96507d713222e9dcb676a294cdda8f55ba2372aa9d2c00c81eecf74d032efdc38c27fb106b531a5bb485cfeee742c9928fd59e2827f42fc62e38b19bd50203bf4450bbc3d4a22c1c18d5b82ac0b12b1a1c244defea8165595e6e9b2ced750b089c08c0c05119e9f05200d73fca4e03a30793baaad8c26d4a190d927d6080fe5363bc2d8bdec9bc53d70db45d1fa76625c054a0bbd122ebc9e486a10b5105ff0307721ab0da055fd2f98ab4c87f004493ee79c1af17cbd51357c784fdaee5aa810300a36a75b20992fbbb91f9d2632d16ed7428fa1f7a5cf4e0d43c91c95a620d5f020568ebe55d75f3c14af4cfa5ad333067a22c29cce52f2765e0873313f62cb156031e48bddbd2145622809b3946fe2e6b73e9cd785632a98116538e66cab42ed2370302e856addcbaa86c1e9857d7387e88c7d136d1d21f0f5ba23315c98e16968963277b6166e5618f9c0302ad0fe6adc46956e9d6054ae702b943ef677418abdf7f92944f68cd769e9d8387964512860a76078826793d2fd3cbbcddeea9b5db78a4abc7f47474c5baddd2d65da2e356aca2f007aece914101c3f077fe427fbf632bbf77907e71be20b21550b479527a5d8e7536ecc7e3cf89e85bc14ccf315a43509306a399941e075b63857c36839892a32ff0ec1ee7209d780503bee5b8feea0def255385dbf518ebe6d9c1341025f53b15c5e4af4a2fbccf8fed32ce38e9c009f998f6e976b691d2263270a4cc63f37cdf5d01fa9109ab447f1c9ec4cd897306539a070779ae9a971bf045368fd3bf33e5535bd81fd58ae6b792d959373ae6f260e2db2673d2be7c73672d589cb0e0887ca03839154d2fda6727e9897ae4bafd226346be1956c829cd56cd35fb5d8125c94f0b17d20edaea1287c2e8a46aa49ef33f02276a31678bd5418d2348ecbad7fa68de359e2fc2bb76d27694641a9fdcb6cd185f36e8f18db257056646936444bc12d7da78b35ff6740aaa6ec7311cf4207ce8eaa0b4e3e82c30041b0712949e2515aace3834080019ef1a7154ffbb5a8d275c1d4bd16b6175522f198fd132c1fd3377bfc21595796adecff1bc910844316bd2cab5f9eca6acc169f8c5c730b4d4716c2da30c693fa09766ec8451846f9a8479e05dfe41f040ac44c32b2d116019f6846682a9d590b9e4437422618548fa666bec040f8884bd1f3a25bb8edb569058ba1fa56a799905d1e8a46b4f298b531ef9ce6901980f4acf6813330244fd7cf6d8e424f8ddbadcc7e2f6920ec35a71ccb0a10bb5e963a93ef5bc5317797296d9ca9ffc7a6d113aa94a286cb33f4df29c1efce4559977c4cebbde42f1266849055b769b8d740e5adf4883691a9ecb83457f7ab75ae1e5368da5cb78b8fbf2f37cd4afa732a1507a75476c2b65dc70440f41ae4142a75e900634449f2de034287e2bca631a0b6173aac4a58eeac321ffde929506eacf993ad090b729097bc61add3818a65a51878e215de2da0f9dad38cf22394e6c325df2175967048d37caa56af5aaee5c2116eec7d7bc4f0fd9503f648eb9e9af4722e5ed72ba3e753dce2c83928c64a19cd1dd82dc3b9607405e53b28c24234e2058aaf907f23ede6612e484c2c33bd37372500af3512d81ac253d5e47f37f0bd777c71a41cc31b82931d30e412816b167a281fc029ac499cf7bff362ce2b2074bb45f86afe029ca05611581574e9717b8d492d24b3169f629a0c284521e1041a55bf2f6a58375e3d71a60e379b0b9917556ee8384289b4b73a6c74108bbf1cdaf8cc6d3af2134abee6a7bcec373583b4acff7d91fe401c43eb939c8c33ab03b73c271d7a90ea59c42cbaa7c07b4f74238e0cad090c99015498849e9db0d8627d5a35e93716eb7bf87466be66950055c7da902892eabbf9ca2cc06559b07cdf5698112987a21c7665d6e1ba8e9c1df13f9f2d3426118a16a7899eb2ab4b36e2c5c77e78769559ab3e244a0e9d60c6641258b746cd57acd00a54ddb27ed2722e57350904c44518e403bbbb85937634db7ace536f543581a77dd7d63b3e886e1ec7a80fb570bee5c8ad27c1562c8ff4b9a8c2c6a4e0f888317055b899a5fcd6a528b453933ce94216e1a9e5763fab81c5876f1122b6b3c7b037802e1b1bca3f0c704bf8e6eec992d1e1c6cec660000000000000000dd58ab0100000000a4d63883132abf00efa80e5a523ca0d9801f22c6e53b5f264b7781ddb30f405aa7573d9004543d9b763642fb6f4c845d10f3628e108a9482e38ad6233dd902b928e991ae4b2e0b76ef5447e03ffecb0693c2971955c4af5c600c2978f16e726600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c3908f7e06a0f2e6355e57845808a707ecc2534971524313bba59da34f7364fe9e975175a1bcae8a9bab088122b312d7fe9d48845ddacffc447c6f00fab8a2a10cf779b78e2ec889d505c7da2472285f9440b34e08fb3686b5451689d8620ad5e80e3ecfe4fa768eb1f3c1e2a40476e7b2488b00046cc41c936ed78e25e3b931032c729ccf70b20c8264144d60c8353d1a9d1532e4af549200d9ea8ae49a0961a60309934d3de5c879120647ddaffa5575a9f022ba219afed9bb6731035b941908300b072f7e0a70fcf071c72ded6767013319707f5e228581a6a812867c7ec97864cd173f47ea55348bfc2cdaee18f2d613fe3c644a8ba5840ee1a97b06dd4d39e8b50219d035d7bb33a5daf7cc56124accb8a5b7b49828bcf2a8a52ddd33a7f23b63840323df12f4797a1b1e7494225882778685b86aaaef5658c5aeb7a12dcd20468a7e0303b22a5a20fe7a0d7e59600d9bda0230d7d58f3761adbe62606a3d3bab406689032dfdef47b9561a955efb501316675a66b66f625e94951c8f031e65c52a8dac450220bf6b2254e0c2c9a2ebaebcc364410c0f9fbe844a664e48e1ecd59529ebbf324404b0e47709ec3fafdd36eec68efc844bd066dd9ba529d1ff1b3b9ca559a501044673d532fae1260afe61613e2a44ba886e5255dbdbe8baf0d368cf615699eb0e3b1face1aa42f6fd1a264c148aecb9f659362149ae2715a0b175c6a4900bf73677cbd0cf3b510135e530bec8d88537a3535e72f9ae92aa9d14f1171e25c244486118e687cc9a8009cf6f0e263cd6086d4e7db283708fee365a2b4d3b3048af25f68a80aff096e2ffc5364e1226e05aba582d8d9fcc1f315dcec48bfec44f62db3bb7ff1a01396fe74f1dc737faf01d5d39e53a2fc6d8fc8546c37132d85ba2270c989e520860cfe7ad6c2683c95d19debafece62ae917aa73736dabc277d25e1932a99a8503d052e6842b09de517ce3eb0a7ab471e4a846d8373075ccbe33c9d7eb6c9ca490b6175f44f464104779404b5917b1dd7ef7a46e3db627f7802d8bad834d00f3c94392911d9a12aa1b112ffe9b4e51484b1c8135f6586072726cd5c6b2af31049dbf917a64f763f754b80690a3d401f26e6090bee24b1e0711d8eacf8c6424ea8498bd806df70d1e31af059c216257353b253bc92580dd7d3533c8ab77f4c6a1b5bd455be8d454f67654708afee5b193c29d061204f93a285697b96d8ae3e92c5fe98c106ad2f2dc627c47954e036cd04212b3183d9cc2eab8ad3ceeabd41957b06c3fb99506b6f1304cbbbb1c8547fbbb689e6a25bb8e019242db3ce46a594c47e51612379f7f99662f3d9107c9f861fb6c03866c37e645f32db3c81ebffd8bb32d9c2af58d5b7a0f138c871e4dce7a005bc1b0edefea09437c6c4f9bcf2d32c9cb3504257427952ed79dcf88f47e15a8d31a76c573a912efe3691b168e8a712253383305a814d4a2916ec034a07a6272125340624102659c6f2602f372e2bd581e57b0bb16bf6b282ae41975f0ae6e53245f83c810d52218c68d81eff30785123a1163cc5cfeea387eeeed55f45e895b0fa42a39e055b5bac750c12cdcd0d88ec78891f8f866dadd08dd3554aa3185c8489f0c999131a9b2c049dbea7214920c958b74b04c4650db44b08388c85a75c2f812e4883e8184cbe4eca58e230cccce4aeaacbc01839960fd5ca21f17591b3fd8d2d773916ce96ffadca9cbe8c66d0d5454a0b6203e33f2892de61424f887b21e781e4e7ed19168796698358b789d42ce0ccc1e1a9d6f82ea3cbb98a0179dd5d81d2e54b93bbc64ac1dc65e298d5b8cc78f6cddb9b604e5c914df3b191fc6cc101f5b7c85eb94f6be78aa1dd525a0e36df481b85bcca6e7110d0c6abcc76c8fe50b0c5d205546576d1c11fc37afc7621070ec9d81768e8fcca54fdc302d371b1f26a92c146d99e9118d15f6201d44e9051d09de59dd66001ab4d5d786f416c0da6cb9b257873ab9aca852fc25ed435cff700a078a9c17946e70f0047e4e6af8b0c93447753708e107fc9d0eab63cdf3dbb19f9953f46a5a1a7a880097522aa6daf15c0ea97fd329c1f433b0d3013f0036cacfe2e8fb281c239384a5ce9648b3df08860a965dd1310316cd996f2324eaf30bfa1f055dec77e7a2ce6fbb1913d0d7d9ce778f0c8672d48a9eb357cf55081698c4ffb5a6166ae3226ff428bc0452d6ad25b3a6b0ce18e4f3d94ae5994f92b5cce4e41e0d1814cc6c69286ceec99e20729342cc593a4818c2e9edc43b67cd4cc2a338d5fd21da116aa7a8291c0cf1d5baf43028cc3cb12a03063dac2243cf32bfb6d8caa58f5e2b2e14be5e779343150189cd90e4f65672f3cd6f801afddc6e4f95bf80b26f34050172951d8a4966842dc79042e6c0fddff258aac26ae2195f5c603c6eb08422ead1b08", "6553ac00ac5300", 1, 1552569636, "55428fd9026c9f156ba610383acbba1b50217792170795f79072c9119322dfce"], - ["2584b42a0456187ead17b2d92e39b74939e6978966855a5ef213a544c851dd87a4bd01d512010000000751005153ac0063ffffffff306f7fd929ebce7eaefa0db685682797090f6eef8cd7fdc9a024c573deb07cae0100000008630063535300516affffffff7bff0cc9d48cb7f7590170af42df2d49b65e84d9cad87f733001626e6abd6c7502000000045251516affffffff752dd671351009ed15e4ac5e711badbcfe66689eb1155a86e53370a92df1a72b0000000008630063006365ac510172b22a01a96ecf02000000000000000000030000000000000000cc68fc0300000000849a924f8db9d6bed25f649b81f8d8495a9d2857d55cb622cd05f77a3a35d09172990f1b49a26ba8daec8701d40cb4907ea3a3a66166c048190d8c536b3686e5474214247b3e8978c74acd17ff8aa9bac8d550b18921d0d23cfab4c46c4981fd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020980c52d14a38247bc7f5b7d5f7d50607ba99ac069566e2b7f47082a93963102e7a2fb2e8d85c947700cbaf4d3afbe8ceac9e93b73292311828249f2ad8860159c12c339fcc2ce5cff8ee4b8b63a7ec77e9a2f90e5a6dca628e2de8f1716acf79495028bc7835f8155de24e016917126d2b8c0bc8e5a0072e7683151fc79b1102177528d1e7fd126195237bf81c8606ebb929737291bb72c8b85293f682c099c6022425c49968a07c7a97a95d6f3d7a4437ee75914169d2c9c470cd56343989164f0a083f4e0e57fa364492f1f22ae5b60b634c995005344938cb29842dddb5a82977550ddb21039b90c3efafb96795375b5f56b7eaa616d638c838a6f50b09d6dc3a0210c3367b65715ac38d206ef8d460f91d42d21d1ef0613825e03f41c6462edabd032b57ecfd1641fb48a52797c2238a658172ceaad63501718d91ce2294d686e9730225cb9f62a213c957873dd2d0ae5340aa98ef5aacdbb96a6d0671a9f49ab5a88003251633efd36a15338c01b3c35d23e6d19bb310a7882a4c769eeeeed716ea6b640305277dcba0aa61a76208348dffc727008217db3b1516fc3665682ceb35cacefccbacd27a2dfa3c363d72c35094feed7fdf70a12cabef15ed1371651ab9a9cc64927cc3e51a9422f92a75c14bfe452cbb17415f9f0efcc52d5e432ffaf8ac024bf6f62673973dc990420ced0874c5f7928064445d9fcb5172bb61fc283a2a3483a4c2c1cfb715d61ec8fbce8b2889fb9074e79db9b45ede60926737908dc7f638572d18a3c5ce06e26b64201862dd3662b1447a4f3987baec7b136c75dbc88bef7f2d62f4ef20e5959ad54ca59e228671dac0b46df176de0e22c314e96ab9dc44de4552ec256c4ea40facd91fab40ad7c1a908cc95e56d0c9d4961b86b64d39014415ddebd4d42ec3800dc37b6c5ea52c1add0b875e810eeef1b9fdfee1af3cbfd23cceb0c71e5985afb131dda79676de45cf62db7498fc8792d587a548ce9a27b862cb595245fee79fba5ae0a058a07c0fea6331787ce7ec0fa69dc7c053563c57f8395a4365170f22546b0de14ea1b442acb0f6012bf7fc30e6e44e9371112c621780daf2ec586b54035fd0a9f2acf3be1550afc68fb5303abbcb083e16f889170a8d0f56c48d671d33ccbccd4f4b11f8fdf47c8acf5ec968fc608f97f49364093da3105b73630d75f6128fffe0a9ab77cd0140d8dbc8f6bc093114df237aa11416195809c020a398c630f5549d410f178e8eb468a5a72690eb9b71f3a2a7121fb920270dc9c29e774ca6d74666a902b066d244c31d30af1aa82e2a784e2fc9f64208ab8a88327e306c0313cea5cf495cd13df8e94d9ba6bd51743719210aa7c999957963ce807f1bb9475dec9779bb24721b86e4e82f7ad9ccc75cd0d26257973462a27847aa4da31fa8d8f6d3aa87f8f81ffc051154e6ef5b435a8ea13dc6e4dc796203e6243d6f31560a6a73d4545f5219376dadcd1a30cc675fdc95328b51d47e420f3cb0bc1c4a441fd4daa2f4ac8f987fe7b276d8dc65e6f47936896e0d7a6a7b1b487ff5e4f2fb4b3d10240376059819c7f9b84e341be80cf4b76a05c1c86cceae36c8400889379e954dfabf9f88231712fbaa0f5bac62266458c5d8f982b85b4ea65a3e327366dffa0d9462950ff434b6850c82feddd0cb79b8194bc70e81253f3a68ce6a6b3403a62e400d78b84dcd35088b42a726f72d535fd9019dc17147534f3396907c3742d8a823997c055cb1922eacf02272cf4ffcdd6069f2d119b85f20cf3172a258cd042b589937a3979d352cca236deae6685b7f29bde7b355cd8587080e2673b1723aa51fe6fe17e2cf3d13142e86920937eccf67bfc9ea38b2196bde231df5eb0bc4f6168ed2c4236be18d352a813d4580a9aff39dc25e5a209d38633da7c74b02c603f6f2d014f9448a3bed7bb5f61d9f2f56fa833acdee8b6cc8e910f073a7efda34224318d8979c45ac962f5a1aacaf69c14540322f9b68572002767e36c77eb45cc2b69536f90b9ceb41c6fb211116f659fe4c13a0bbe4cadd04dadc4e319976794fa18ad03f2cf8474a1c8d4bb0a6b9f2270fd36a70df10926d39d1a0e9850862f2ff3ce1a44c4e315fb0a90ee02015ad6f3106d99efa0c81ca1f3f03b98fe4920bb918e3df3e361a51c082822b6f2090a3966342eedae739f9b9116fdcf3835c7a81db3044ee18ce94788e84876c90c22b56d93946c2a1d7cbfaaf6ae476963e7de885790cc6540058ab0db24b17b11977cc2f143c3ae54e37de93a606af396eae86dbaa9cc77202000000000000000000000000a68926a0597b35fb29a1088476d056081384715ef957b0b461eded90edae2a38a950537cbdc65e2dab73d9efe0e78ce8cbc4caca5ebad66c4ad3a39f01839e50c46a929ccfcc63f42b2caf2df4508c2f40eabdf8547090d0c3082ace7441ee79000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cecfaa6f3140d8174bf1db101e64450f6ce2d6691010ae90db620cb0999f7f6a77f9d57c6c0262118f6acb70fe5074cdad339cf350751ae266624e2b29c142061675308dd78078a086cb56f54db1513a9a9b2066809bd791f8964233fe6cc62494ec76819f378eedeed2e1844daf0d4277a6727c7e3a27d061aef570ba6aaa30202d068bbf14be4110ba2ef85956729e5adf720ecd34365e08b32eb62cb4d6b06030e78a43b2083a372fe1c729cacd9ad0fa637fc07d424f2462e5646b85d6b01a50a0432617cc7206abc4d804ed9e91d8e80f90b64af5908212c58797f41102678748ef619b63d092e9ab71b8c8c6cfc7be1847d6ed11949bb0b9799b48aa218b9d90314416963af9aac19905cf5e0a51f2b9805600d64348a96c4435c2ffab80cee30020f107e02a6cbfcd165f0dea5cf683a14c7a563b8b1c3fd464c4bdb804ccf3c450208c81e4ff30c6ab3c82b9eae92851724cde55bf8992c792e51e9c7aac3406539022079bd733e05f86b4c8fe4955ddafcd0be77da62659fe4553e36ae5759689af7022c118ee2b1374527993c1e454fc987db78abebcf457c98bde8ec0e036f2816a10d76c2b9109f788a3bab16f2c168a26ea7cb2cd64a94cf610840f757c8cd27a393d0ed9c7f82401807baae3b05dae4fd0c391d37b9379b87f65f8f2f387a7a7c037ab2d94c84bf60b41ebef635d156a89ddf90bc9bb47de27cfd992273cc81187b5ba24f7f6ec17e5d45fc030b749ca557f27b0e26fdc47b1efc696a133a43a2456ca00adc6995f56347904d248ddd51e3d8d279cf3f8f14ce407765ecc53a3e6108a96bab3b29bd41c988152e6d2b8ca702fc0564585b4dfaa18002bc59d2089917f349c117920a5bfa9fa55333e27a0126dc214771d2f7b85e067cbf5f04d1dd5b068c9ad894b5cce04318145cf3aaca097bf4f156f5af46da2300df542248343b3d8c471aae61ee6f4937bd08a8629fff6decec59e1dc99d2e517d53b7260452261be7df0d70bca16a4516facf4441fe72072b820602aaa3004ab7dd1639731e8e76109d38508d3f267c55cf04b3414870e3f6513e3f70595efcbf2e9ce14e70ed5ec54b9869196dce1cea01376647af28ee0d55441ccf9e0d0bbda4f6bda60b4bd8f22abc8bdf37948f0e0d998d214411e8cfa8c03786a1bf109a6c54b4eb028a30fbedbabb2526fb438fd4d6ae44de60524a97f7590a2b28e2b8706c4dce5a8501f38d4f323e8870694884823cbc294fc86a176057098f670c6da1bcb0de1f34a3980acecf72de27cadb688f018c77d6f3d83547427f41a03aea3723397427e6c0b98c76147c20b145ce83bbcf65fcd520628c794c34b8de57ee0945147db314b07bb60589aef5faff6ad9936f2521aaef425f7145e81a2602e7dae24e81a24d74c96fb06f168ff08bdebd297e0f21bb22732b7917e02bfa04fb2001bb7dedd1d3557b63ce2c67ac859635c03f0e79b030b60ef31a700b96b63986bc22a3dd5e64ff8f6aeeddda901e81804c497abce22060621e4a4460d1a9f10ca8862b4596a3831f4eab7fc21ef723cdfd244cdfd744c48c5cbef37ec73cc518a70f01e8f3ab321c66ac85d9739d9227393362a59ba5f5476da6c1b1f73d098c96d37e44ec75cf6b5c013673649ac4606a3cc1a72ea7c787da7dbbfd6a6fac7b6a914327ca1a62242981a407a259e18fab96ca3a4ceb1863f51122024c28c9af9cbd072e22f3f0580691c087a2e5dea08181b92da8567565be84e898aada4f78e62d5927d0fe1357782f042027e549fe5398c47a6905d2b7448e699d57f121e19698c3cf320f1f370724bf4280bdd210a82ec4a9e9f3e36c2f0c79f44f852b6dacbe4a992ffe381535b5ccc9ffdda3ed39d477041b310b7fd738fd96c0726ea4657e256dcb56f0b2609371f0cdb827ff80868d880ff059ed84f8b5e6a816fe6fb486c0b3bb81eafa07ce2f20d9d400b51069137109b3d2fc5216f9681599142a4260b4f27f07e8eab51c92f54d4a58b9d7154240dc673b5abb615998866da551df3f3d1191e5f1bf09f301780d806ec5b15a364fbf51a6be6ec249e80303f03fa0108555c0dd6aa447770e0176cfbcd51576adfc5c698b1e096da25eaed1101b48c8786533ab7e115431268f10ae8299c97e6a613e5f50075aef7f5c2762326a86c2034ccf8d9166e4e1ba623a8476943141a68ffad259def8d92b0c649878cfd474826ca6d40e47da074ffb79fc8e28d5f6e340963abd8e60a5d695ecdbefc60aab96689ba86beb623e1e0a280d308e0a3654d2ae637ce040000000000000000000000008f2bfa9202e1b049248feeb6808da74b54070954991723cc31597307655c476c78f4b364dcae95aed98355642b537c68eb46814b80f82eae9ea3b1708e5d25f8c897d9b40e02ea04de264035a8ff9028113199ae0a7fd899c24b1fa1b092e91c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001884a83b06b9d04b39ed838ef07075f91151b31a96f4073b97e0a2ac965e0ff4292f3e7e12ed6212df3157746b0d9b6b74ba92a791af66e84a68e8fa6a36c84981966655f4beabfa4195ded07e44027d8bbaf91e16d64a1102efb4425b4992137df99dd1f28a2165033eb05a865e6d69a6e7fe9a80c2396705bdaf7fe0806bbf022532637cdead0f2bbf349f677c22c75eee498e3561b101a44d9ac9a0090ffdba0225619719d6d7fd8353f4277878ee15610fe8d3121af91599047beb2a27ef58f10a0435bce921efd141525e9942b44d55fbbd16fd96c00f5b6c2c6cfcb8a982ac16d045d84e215e2c9f04e9ce98ab132e2d4efa370dd0c072e89e6c364ceb5097b6032916c41aa5480deca1364cc45c392045f0fa893390256f828e9290a6ebf3cb150221cf5c0ccfa63e4decc9966ab1914eb5ec4d5035ad12ca6b5525cfe7ec520c0e020c3c7f43ba078ae329ae9d49340c419ed112d673130046eb5dbbad438f9a4268021b79e0bcf74a60e5348fa2266af4bedbb2d9a7016e558437fc3f566bad84a5c60215379e7aa8caaf89a9ed8aebc082fa62b0a3ea830f744bf6149c40c63fbbd360e5f1aac8e97dac9a4ab3843ef7c091f627f4e6915e144d448247f5d89c05d057abbea784b4006095b550acb5b7ed7154021ce17ce3b349c2f601b83c2ae14bc61457b323514aeccefe1c5d45b2a6c13b30d470cba4ccbd62599d995b57a5d08af930aab056d743da486cbb7ec9a25e278adcaf6f2bb298f79b7646da8dfb58d271a3265c6f91ee6113c74fa2d4010c88a3a54d91c5db61e1f9d27ccef5c70987e4a255ec14b8d0cde4100347706ba04a52ed26e592de92db1b54263b2cfb463fcdf68fe4c9a08e0fc37119c2f02fed25cf2057010f86e69fd5529c7a6898174a1feefd85751631fdb8ae1682ad04b11d9e64a3bda04ac789b85bc559b3e911a1611aad982f1bacc3ade200dec41ab800269a3d8bb73f7fe5360891dd8cf8668a9f0c23f8987a53e1fda249d0d5fdca8a66a92b688b8c4aaf79998dd94e0675f9075072239b3c2fa32f21380c8385cf16809c5dcddcfb71fe8bd7dad91446ea00fc13609068a2aeaec562e92ea8f2aad33edacb04ace15aed334fead6bdc154d7b20fa00ec42b1330e210a942a21bf1f8db659c6a4dbf78a656f8b565ec8db0e7a2a1f1fa21e831f10e3eec747a80cbd614a9060c6785319b809efe4c8579ed3f0cb13aa052457c9d1963df0a8c638949d04c3492fc123c27a6f9896291eb1c76d57a1e040fc72ee783e5f81cfd5ce5d1dc691e2cbdb868efd6be5ba8965fac7c251275b6de9525309fd6fcaacc89cc2f229927b521ca68c996a4bbe2386e4577cd83d82a82f69da3634af645d08aa0ba264b745cc992cc593539efb5e99f38702659ed65f303ca29db46e884ac0b3a7a6cfcd3e24a371dd7fc9f56369f6ead46cd519aa115529d80071f5d13b81e7dbabc2195528eee15111bc0b31d16912e6254f413a68db20840480e063cd8fea231332b1ff10d0277c6088bdf90213138ab0d1d4524cd2762e3b99d5daf5b85ae31d6a848782a5e8501e5fa58d942aa8a9e5ef6def10dc9ee007ecb381b0f27509c31eabe10b6db4f0690d6bc714041b102dda1893e817d4e8f0906a06c7e734c5fcb373447286bc45e2647da298f6dcd31c797174fdce6970a1b9109ea33a33bbc19e57b17017565ef3e901c97d1f857a0eb4f1fb888657492100ad95f2c8aeffd9684716fe2ca8909dee714c4c70c24dd75966fd8f9553a42e3e38a6b77be4897017146d2d575f2c4ab6f206a9dc881e32e43267899639175b9aad2dced87ac11582faef0cce122969f955bb21d9b8d8c3b1ec7b8ba6f28ae9075db26d3c48b57db295d7fb082d7ddfce5d20e3234f5d310de6304398a81d15ff7194090b097c9e185a013a8b9bbd16c1c4631305d3b035d8b5dc8a8d9ee9456237d4fdc4b0e5d517b025f97140b7656c005c5532d564337f317d6985ee93764c9cbfe1c813efe51c3baf3be224fc1e4636621b46b8666a5cc9079ddebf8ff260102962d47e6bf1184c6b08b29ff0063fb3260bd4f9f183b11cdf03a95da06542eb5f2589e070b431f2c0d4f2292c98a99ef64524c004b6c6f15d7ac734659f4c0e8e18b1c0d4e4580da126c8e42e2d79de5fa39db7915a1952163e888a4aa4f7f3bcb7d4c615e70b40c1ba0c877e01cdfd6539af39d091615ee57936a42358b3062d1f832aff5bd2d32bf13c6c593be081ce588271b6a77a7739e6b1360c42b76687733fab4e4ef9cd36413b041753f4461e5385b1be3ef30b9e92bd98ec8b67e3841b1570f7f3831669b5e79442dbb31873e7bf4aa5bdd14edd7e198459dcd8f41d039e0c5e53850506f495e469a931964cfc17885f6b4b83d2ecc88090112246e8e29fb93479808", "6551", 1, 419363141, "536a340405a1e68797029b8e2d2c0377df46d5d3ce84e78d037a2729f2075f66"], - ["030000807082c403031c6dbd7226b8e4ddf8842451239943072a1a17a1c0335e411315a30329e880c80200000006acac52516352ffffffffd90f3984ab87fedbfcc2812acdf3391325cc3e78d7aa988cea9b1bee09622c350200000000ffffffff09efc1d9dbc26910a5d3dd343cbbe510c447107ac312874f389f1ec683ace97d0100000006ac65ac536a63ffffffff01cb287a010000000000000000005bcb11f600", "5352006300ac0063", 0, -1925464276, "776a71b725b6a4ffadb4ced0a9e900f735b706ebade3e7cb1e6c5b53f686cc8e"], - ["030000807082c40301c72c5a966f5263cbe60e244ac62fbfdde5545b75a76eb332ca75cee5c8f5480903000000085153635151006a63c739f9a70186d37305000000000852516a656553ac650000000000000000030000000000000000ec258d01000000008b52b1c66e00ff267e73dc28e50f31deeac0e2c7e94f6ab0a9c3082cec9efbbc6f30b37431964fa62ba446c57d584803dd2e718f26e6f2304f7976212761d43d3891e8cc07abe2e8da18c38d1b5ab95c5d8bffbfa8c2ded3c7a2695bd90b9d010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035146592eb9f750a0fd63cca732be79afefee32fd99bb176d699f2982ce409762fc8ee80be3d0a34697bf5d8b479a325debc21361ae82e415cbd448624645901e087e14f0b410e651d9ef7d83f951e0448928ba7927233c64e59ff096f07cbac8a25c458ba2bb2296fdddb50173cc791aa7c5f1dfc7d3fd0db0ceff4e22fccf6021d721415242adc872ca766bc528b113a05d8e99343ff1ff11d66887e441e18ee02102a1c4f277cd326ff2bdb6905141b82361af53b6fa2461a33ee6ba07abbd3940a06a0ff919d0520c17f5311f167e7e1cdf0aa2d7ad1ecfa5fed1454ddebde123501eb3174c268efb6f78fefdba68a3ea1d4f50a731ee1d5f5cfe643bba17e0afd020c564f6b1c859e9dfd03f74dc9f270a13693baa048bc3ca847ce84683c37e81b030f4066603c2769d0363c5409baebea169d5794ddbb4deacf676d9e545796d73c032447183fb60a772ba71d964d24410118db34e3093b9ca3043eaf0893e46bd4b7030e76eb94b7071b698ec69f07550cab8bee1dad3ea5e713f928f1896bba37f1c502233a8da2a5089c6f0f185ea9267b4b7983cc153e5aab40c6c651719198cf214eec620aebb6e2f973ccef9b125bdc25d04fd7512fb1c3068df7bc60123fc003d6600976cc1c90b302dec9c300197793f5808fc095012ff56e8a88bf5235cc69c13aff600b164f499cbb777822465cd5f14b55010e213144598efb60a6db0d43253cfd647d037d6e6dd326c7af8f7276b56bdb76abd6de3cecde3c83c97266e4ceed3011fe4a0bde5db0291596629ce2edbb8e60840646ef12d600b2c6bbb5abb0f69caed0115db03340d80ff0c0c81772fdf1691a5d0ffb8e81f447237da985530b4b1fc22f6717976200a9c1c0163669fcce3a558b4d245907646821c744c982a77eccaa3b3ee1b9ec89698cd11797a3b9052e610bc4331acb702711f6c2678714ec3016a1410b63bf94d0695cabaacd5b1a3c12896fca0363e847489eed85b1eac87a6d75185ab5ea03bf576e7ab15d0e1cfcda62202f0e2e79509836c1384ea9be5ef36d6fa94956ed7d0a98f53a32707299e3b7f2ea8ee6630265c8de44c0a63dea7eaf04ee33be41831b120141584e5ae043b00433f096599f7c75c47b14aa11dff958ca281a667207b3e1f17af33dc6c791b542c6c4afbf9564b1cfc573aff474e642bc736a388d9f3c347407f8b73b0c442800e9910ccda1e9be9ce21c133245673c9d9b1a0bdeda6b3d9c8a5e5cdd78b922e13b0b698e93f55c5cebdab64f99cd31deae0f851b4e6100ba0e73289d8600315d15db3bcb8bd5c52db159d93489cc7f7b1ff489373662eab7a9802297a9818aee4a99715e89214ceae1e6d5ef1fd7b29efe9cfc2c8ba737e8de592ce353ec7f3fcc6f4427f27af0ce4793d5a3899a9e90f41665b3c55c22286de9eb8c257f8a098acca0b6b8bb0816ba4de3e3f3ce6ddd7b4d4df07a9c2bacbdeddd93d34e7576c40803899666bca03108bcd8989a3e05a15220c8956cfe53a36d2dff2e5efea071b48e13a344543fa145c9d17ed88ed7d42d57396b7235e32b5cab6de75d09b91ebec8f19f2d3d43144059c0d2480476a37f3c59755a5b3e3a9cf5b2db1bd8ac70c3c0fa0dd76745f5fe74f807b206e1527367caf6921c9c6504b2c010ad8dca8da179be6c4990f6271df1c5f4263cab016a0b8f84b676488cfdd7710b9abff19119962dd495fb0b94299860e90faf9faff385be05825796216f3379488f5f79f64a7afb094a262f01a0896381d8a16760bb42247af678faeb01def4fb0006aaff126d74ac406af8e06355f8fb34f891b441baf2d59330604f6fbb90b4a0567e8c05b2e9c1591be0ec674498cd9e162c733d56b0b49ed16f55e3c6c3d6698213221f25da7bfc746b8d1492c66984a01e05dd8d9f9da41a44ee58d87934b8d08cfa329bddc53ee2773dbaea8bb0bcf3a0197f46c68de2a5956e10bf522c947932b78582e2cc1250f45a53b20faa65aeb420244abe71493192b060aec7946fceeede234cf30906ee444f8bb5b65b263fd9164da158c9b382ab3fb157dc5104da8b9df97b5ef2db259c70c68720a143539666681e53f84dbf58a297c2ecd9037e918589027bfe608e9c0f3bf494ef3e482fcd5f07c6c4d99ce438f54055a61702588694d6235befbf31cf1ce6b25f07b30e47bd3ccf3a5d2cea1d80a1df1574e2d523be91c6bc256abf7e0ea8f2f79a0bcf3e2b8ef6508b6a6bed94659488fd4e823d48f49d3c3893765d8b5595c60f31961d992a78d9621ade534ac6a9000000000000000065824d0300000000521d17f144843c69e9b8481a4fd14460a94b118edafa723aab9d325aeb9cf3b1a3525068f90a4570c8f2a54947d7463e0356284a4006ca376d7a430ce40c5eceb7b6693b7f94c69c87bba9e845439b797a45fc1205edac2efd0d4c90e5a711f200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c9e207a4cdb23f8d79f6ceec65fe66ffc30dd0a0ace05b71dbb025189df9b09b69d6b3442661eab02b1c486819d6f618163f2522d6996f8076e3f9c83625d71d613dc1b8924c072c11e63f5e3f26af1615478d283d42c6bb0a42b75bcb8a99aa56b5fabc5495a3510f702eeb95019c007b7f66aa4867ed3e122e163ff326a840020d3a415db172955e49907dd56bc0eec367e34baa184b9218943390e88951e6e70328cd0252adcb0892b3c614dd3a597a44f52655b6b7f546ddba3f79c152b6db860b052e00b08ae0f44def84d512f88026e7d28e0792e80ebae8a43b5232a8a897f8e573d1725e834bf847082a557eeb556e1fd77c7eff0c3288be7f337839b8432002279587f390c889c9bf50be71186c8ae42d717979d1348dd83e53ec79efe518980203dca4cb6fb3e3f820c80fc0bc76d45c275fd020b1426f480c399ccbb5ef941a022ec930eca4c4042130a16732c9b7232e1a1d9adbe4080bef9d0ec793befd14c3031f6621bf3cf5f7144d655c4588718fb813c015b0bf4e4c4733d2b53e96c07f92031b5c4eb43619a5484fbfdab2ab1cc26fb500e0a63899c4a6e7345e0a9797e82da53dc853c7499f4e4caef6720cc53c0d3e7cd8cec309c8df21f9ac622c048c6cfa73436bfbef3d63015f6a356d9a01e68077919b427a90e5f8b59af27d30acdcc0815ae960c99d63216e5ea97885953ed42550cec2e7c609c40b65853d12a3ccf783cbdda92653fce96606a9d246654dbf9e377c1d80c011b6932fabfe9a32c53c6c74e52064b79de11ddfb5b9370b5731d0d3c8acf88b32bfbdc48ffc80d60adb903d8daf35cf927b1b56fb6604d9dfbb25f640345dddef43057a1da883b52dfc461a17fd165b16a8bcfda97bed27927ad316aa6c171d43939675848e0419ab05b4c475f5cdc187bd81c951453f7d4e61669bf9b20865643421996efac2f194472cf1de153197fe0a8ecebea574502f54a4715a8059e4fcb1544e4f89a1aa06e6c559bbd1ae3dbd3ed726b06787928aa490e105a3fcf9a374b253e692feae9ebcfe917a1b3a83f57eabbef3a120de74506d5b5448d0627ec41e42ece99e98ddf16dab301dc37d7a989dcec173b782dd1ecda3cf3f6fa13f669761ec31a8b99c578dacb6b8e3357d41ffffc80066041d57a66f05ad55d1979059e00b5dc5eebcbe411d9bf18600c726870d67d8ea644b1d7ea31fac5da17fb966060f7d60f6faac1bdd7fc894e5b281733c0717a07e8657e9f5d079ece6a70fcf41082090842ec60aab751d48f38a8bc23ce9c5e2eaba73a13261a1a3f3ae2d5759b148b5f86a3c64db0bdf9121ff94bfa1cd8377c1017365e06250ffad8558dd797eb4d418c5a020915cc7adbd247f1c6fcd889598b1eb936e91881b3b474ff4a3ed14cad77514f77c5d907f2d98d2b85a14350e7617d694ee1721f8c53e4f217a3a9273e60c565bd145d1b1e49baf431c8275f179ed5bfe050c2560005ada553c9ee5d5077c1dc2bf604ee055456d87a408e360da513f85f9be72f5fe37cfe130d3d6bfefdb24b02e7ad5d6edb393ee3270873be49a282197b4314b20808483e67a3775c65ef62b0122f712cd58d298dc1ac1fd68a2ab6c3c596c3b8249df86861e5d38834e2bba18a04b2fbb66f6379e60edb42dc168b04c50a993c92d487257453e4bce64272d005353051e4b681d4f39b213fe788cee6beea92bce039f8ac55780863b7ab5c562b994249ecc96b4d2074a831d63c54f391e4c1e589705873466cdc8433356b177f6490521340914a20eadd3e3b1d1c3700d980ca0b641b3d60262a65da2baab1fc6633f6b9c746f3eb8f3aac288ad1cd29bdf013aadb233a34846b63cc51870b8a5a073efe7ab2f3f57b52459726895d473ffa807d2d92ab280fb976ad2e8c597f2e874b98efb9735da0cdae70346ec63e13c93e0b5900a26fbc191eb0be61d4d0a5641f574e5a5d0ed0bf6c550253feb206bc5e8228993d8369ed24905e9953db0009716fd69977b58995a4e87ddff9591e3634241ac9323b866fa4500eb92e8e98408e41d56a59c0be97619ed184bf83c140aa9fe0a8e1394a0ec7abc9e89fd27891205ed9bef50772d626ec177ef18dbee5928a3639a4e138abacb3ddf43ef2ccb1a53c99807af5d87b2d7d47347676e5bf3ac4adc84596b87ce76b6b4bf2247f2af5c8a9da03396f0feef9bf9f92272ca6eebb4c027c087b305cafe07d47dcf34ae1c69f3d429c1989860dc0acb97bba1e2c55411d6a53b99d4e2d012ad6351dd89ab6a5f2bfebb5037dff0ba820000000000000000d4b6f900000000002c723c645e729feb7935aed658a98c7e1dbc0b9cd3c3e06bfa5bdcf24532aae7c96004dc92521796912567daca788fe280b4f0f84e70bdea68f2bf138b981baf1a559980bbe87eb99de159d8e54185c3d9e98b526d30fec493b5269c35bd968300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b589e41dd080f3fcf04118a5a53f2d14e1a6d914b81d8c29498d2853d31632afb99aa12b697fe2abd47d8727edbad59a06383bf8079dfa0dd333d9d4d40650e0e69fde4868ce9bb993560f145970930495d0ac65d16426a9b0171f9e284208ac540e6d5c10e0a3c42d3f030e808ec5951dd3717f86070413b761831d2d02a92a031371a8db564d2de86784a54d08edc30e29d5d63e072a89e5098775c6339cb7dc022e54b13ba784ec31fd8c164ee6eb3c515fc0dbeb36427f2ed9b80b53e624045b0a02cd3832e31c161309b8247cf3d8b9fcaa37eb7c0df39e69bd895262a6a355af37c3562977ecbb909b7a374c5313f1ea7184026d5ab985c9dbab43cf4d10c8e003216b62b4f4aa51fbcc5765ca1911dbfb19b637f00ebcec4347a1a25dd21bb602020888496f2a996053dae602758fcd815d8eaf6423f1a532aff8bc49a8a38081a4022ec1f6cad0cd9ee3f86710bae3955a4efe21058142323ddb725c98daec69c058021bfd55f365bb63c22f2078301ac9fd4c24bd7cffffaacbd309ac6e432835eb4602046f49d474c8823c308a714f0e525b7ff31a85dae298b61657006ff43d4c60347cd27c78da60a730274391811810ea45c0d77a9f325d1588ceec30319888794b33152f362b481cc7f396991959f981f044542a916acf5a6da17cde0ac23760b1857ddf860215cd9a4bb065f7cf7af6d56e142f1dd28e8a574740b0ac828cd522e1f19019ec1a080fdd818e2bd53f2a4036c1592915782ddfa945356da14069fdcdc55222306922352b8629a9ba58de280044c0c33808a75e5b459f41bf39ccc22f83e03b15536ff811e49a5b47e06c1b56115f6492fd3582af017c94b37333bd0346646c232faf859a0c00e3a1bf76b591a7ff3cd2afec7f1ecef880ffc223fceae67368e255c017abc4f33fda752b7b77570170296d315b4b54446143a5884eeebe0b552afdf8883c520ece62bb55c1299ddf83c0ed20b4d4811c3e53781988371136ff60cefd1826ee7aa33b452400017021a6e4884963237410610e53b2396161fa89827c605a40111625068790da789d7e3703e2222842ead5f770dbd49f7c3cc72637fd4ccc2c740fec9015949eaf3ea792c0fe2f2e172dd6a7a4e55824543793bf308463ede547958bd1808d41b14b9b5ad8c28025925812e2db74c4655bdaa8694f5f4c9f3e28a12b9dafdbf2c527c7e383a94e3512697bfafb51182d168e30799a4bdc4b98d96b0120491e7e819f2a9ae7db69e998ed21d781a6e89ad5d8c0a87e33cc473216cbc65cd435c203acae7f25e577fbc01dcf2db3cceb102bfd06143e085ff717f1f50d371f4607f6c80f1b1f5110cafa80273884f1a4a172d8a19eb5e3957b6cf7644f53b01a9b5b86532f2ee8d7ab3b40a64232e454415707f5a447d35ebc21f193b9cb1d4e7c451e2bac1f4c7000b0e3d57f5232e2cc0855f572fd6d59c4ff5ea5e8fb757573bdd0b4737af417e1e3a19b9e81396cb92d7519e286444c91d904382a02e9d9aa1358aa8e499918dd585897bc697db568668559f403cf783b2a2d7ee08f9d0b9a8c94fb1038ae7cb31e21edeef2d3ae834975c39d9e2d944edcdf7dc8a14aea72a4c785abac2bd51a69c13005047eec1447adc94600d837a05e6e6dedc637e3425895cceef4d93047ba4b7f4df4055ccffd35ec15f3f57c351bde1516b52e645358958e0d863f0eb386c705993aeeadab74c5d5f7ac11fd51b7045edc13733b4d74024cc21fcdd54356a24aab523b69f21f8bc166c039e15ee6c9d9679614b719e01ee648a5cc2c4e0bc6a3e629e8b29e841f292c9a38d3a9e9a6d12f1c5874b0e1eb868cb9992518949c14b298621f70d7de8d5b91f8bd3cd541fd37c0dc68ed6692bf803ebe4610d49bf28684797fa63d04607b06ae1a54c0857be18e64b2f58f5d8bb46b4333ad348a5af2486cbc5bdabfb4e7464fae2af71779047edaa19a69864a0ee0ec9891f2a8a9264e2b5a3facddfcba86633fe7fe71fedff3bd97143e03a4d2ef1312f7690876e7968e861c82affc676e8eeca65e690ccab2285138eaed272616933b7036dc1c5da66ab7f0577008a967d0eef93460573e18f5b849178fc25ba252ae71d09884bbaa5c1437353a7738fb5a97c7c482de4a21125303fed2e571311fc756bc881dd030577698f9d0a79f8c87d305d3c063530d830c7cde74f45ed3b755d702e6785a7000c1768711b20c328a89950838b8c741759b9dda0c4bb1f817797407e19c5863880cc9049863849827448c6933526c284c495c52ace4f65116e3a277a7bbec2f90794abb25bb931dcd2ae23e9d00b50f4026408dae2ce70f478032264fb38f5ea043213bec8880259a19603095833d80bec7720a830b2c97c711020251903450bfad65d17d3013ec96c0531f8ae0222a69c5f5c905", "", 0, 982621459, "d7e360fecbfa4c34cd6fda5834591541c70bb77e7b60fd724137b9101d3129b1"], - ["e53bab1e043a00fec35a0889b44076cf629207e9887d93b6d7b15016e8b133f0f222b2c3670200000002acac6a241545ec8eb4c1b37f8591d21e7cdc43960bba0fedd69379682a707570eeeb5731496002000000016afffffffffbd780447bdd8775e555e25ae35b4c08ab4c0f78b218d4173979b261ccc055e9030000000763536352655100ffffffff55013800dedef788950310a03c72fb49e844bf55efd03dc0d4d483e70c64543a0000000000807edf540260e904040000000006ac5251526a65a989df010000000004ac006a6a0000000002000000000000000039fb4201000000001ec90e5f88f7a4e42279490bdf97587857b4b4e419f4dc22899bbb28291a6d7928ece83889d23612c607d3386aea57fa3c7e8bd2498e6cf966226bd2aad5b42979454c916c63ec23a35f448cc46cd934682bda55a8c19932aa336e894dadb7b7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006ae4845c7acb64006f851103f0ea0a4b7172175b5de7de532ac961562eca10240efb481d07ea42f7d9b61a10002492e00eb5f7988537ac2a60c15e04c273dcc164d1a0cfd55929f354a4e614e1a7baf787aca9eff7751374369b2621212875b47d42dfba7287d4d11223712d423eefbf28922fcba3682364ab21306eb54d15a1020b587d39c99b5bb7656d85fe55123cfccf054d1eb835ddbff7682b859872fdd70318ccdee41503a51afef697891edf6e173c33d68ca09dae209407eb68f7bef20e0b0133435ed2be2e2c9e238cae6b26b5b2ac6bb7e9437970a914cd4054e3086a664b99a0fd0dff21b2a09fad7b6343814977e914b66eca4b9d3cb22cff7ec9789e0203b59b88e7a1c84723b899a6f20dc07a226c7cb3371b03975be6cedea231743c031a61be46a851215eec8d7585d9645db0c26dcb91c378b189d74cd0335670074f022834dd46832dfdd68d2fecb1a4350d2eaad4fa1f9742fb40005780e29392c34e022e10ec1976a78a0bdfe85e5bfbde70b893602177f1884fda94c3c9ced01becc7031325dbf95bd9fae181bb5f7098a907894debddf313cb2903cf6979336a00bb41686f7a1a6d9caba638ce687e2a5da3751eecea300a957296e99a5af93fdaec2b661d9a130f16cddc4514228badc1e6b6473aa32f11b32a98947a2ad486830ed36f0e9b4a58ad0e4c61796626424f256a039e870c1d690feed704147dcdc093e8c337a84fdbd815c4e41fead5bfc05b32928936e078c171001c2c2fb2f61038f404f285d31eecd2cd594d1518eae08130d67e3c39c001654ccffe73a458ef51ef7c3a03e968454be7274bedf6caa513cd95a2ac01db29daee7138de6351c38dcd5d7ef8f0d3a77b10046f93610147e3c833644cd3fef7b306fe4dd20b840304d3ae4e666b3fbd8445930c0a3598059cd1f0db41a7e498f8f2781b365e18fb40a9e6dfa6ff1caf5aa08d2af1fcde6387e7b2b9d7e571180ab0ae29f1766aacf85513a51f80b9ed3a10cb360681a0811d802d85033dc0c88856f1f942fbd323c141b8bdc997ed01c451a2a23c4d8d10daadab4547cf613eea9835edca01d47e70ff7b7cbb9874e22c9ef05be6884334472bddba6e54df526a8f3863dbf99c926ffb8e9767912f9ad777479d7a4432a7f71d722417bf7956b45db963b1dd736564752744ce416005cd6dcdde6dd33897dfe0ccfc806cb2c831aa6acb17e3752260592417a384d65c2b4f50ea9b0d89daf435887dea8325ea9e7ba736bffa6be37ccbf70255740f3a50b2ce58ba5e54e1d19461a299be35726eda2fc9cd45e5d83ee858f6bc27ee23fec81c1af4669c2b6331ec495e4c303cedbeedb1b882d9253bc53a2440e833d134f225fa33b7033ed6b2f4ba0f35e30a76f13be08c041239f2d731bae2366a053f360de8a1bdd3c735053165c4ae8823d70f45d98b6b1d1fde80ad0dfba26cea963818d4d42cfa0c16a3a545993623fffe5d6f8de090c41ca993e04b4a9a552defbc6c5886365ac6e4aad1b7460db2c522ae67692cb43237b07e59d581b5a056973d242265585e8dcec33b0ae655b0d40c183c0dccf4b6fc130d07f1465b60483c496450b5c8bbb7724496e833c62ba64bfb2fba457d3d777a0187e452820b4e513ec7cf46b06f4e69214bcd27e13a80795c3d294f6d68d2dcb6ace6e586655feb5078aa47e7928289fd22e11e9541b12f974c6d02b3abbbd9caefd96bbd5c95c3fbda02965bad76396f6eaac1e445a77242d9f4513194b17a008a76dbe69556a0cc1a4ef2b1f543382bc18031c3b391fb1f8095af2fed38f4503a317930958c67110c7c95ecd838ada65528ee8e1a22790e634993737b44b54a38defe2f052f39f5f3881d9009fe99867a8df9ca77e6c6a4326784fa73b12ff8700f967448c21d4cfd30f1cdd944a86d69a58c36acc6e7c952dc5a47f2b4b9363a96037a5a5f1c5bcaabb042cf5af59a9c74d3ba60106960a02ca9facee7aeaa9ff37d1d86f4b4ba898fb4120cd664bf5f95b398b2aea4c2f7c7740d2fb30ce6510d30404a142576cccaae31102c9ff7983b56b0d96eaf04b7bc3bc530b891a9481bdce4c1f42b650fa0781ec962b82dac921d8954ecec827d7b2957280e468de315d3247a88f716f79faf27ca4398a11afb1cb437d4b59d371bcd030680f9fedb6e58fccf9f74ae1876cceb228ec6ab0f908a00320635a939fb13e94875410d68420730a1e3feb41463c67c2a9af7927db9d9384a30504b267cdc9d8defeec6aff1c8febe6c237f3f06bad9c0c7eb1deec22e3d44030000000000000000000000003f6d3c94ed6c249b928535bd8e2ca6e2b3d812c39e06caedbfa8660822010de8e184ed369fe5ede73b2c152c71773a6840e12bfb243f948356fb1de3b4b391aff55004f8608f911e14a57d31c4e52ef9dd95feef5db347ca42ba7976f8d9f888000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007914c3e6c9f0cc9980487a533a9add875ae15740af3e596bb51e2a93d6333011e79df499d498254686b7e52a83e25675618d0dfdf5faba07c1e1a3c150a6024f401db05545b2278eae9ea9c7208032536d0243b94a7e27c0d7e57780e2d3b61ff6ed2d2e7d125223a9944d082615adc282901aa86d8d37adad13780e9fd31e3a0210a902f56c85a05f9ffe3fa7a1dde803679fc40df7a93a2756c1dad2ec8452a40203f9993460e338f7cf3d76b9b8c07372f7a15e818fdbc66f5426ece3550f82890a01d0dbe3ab5e37a69f40d72a829264c144bf7215ec969f3fe8930fc808df89db293df5fbc16eb44054f130c13b7d7c9238a5444a34fce59606c3c6841a87b743020977562ab4dc35ad40bddfe8cf2dfbd27220ade21bbf376ea0534e7d5c833aee0310cac3cf9f59e3d00bc887ff12f0c84fc0a0b50a9599eac9195bcaff294ad4f8030e4efb796a25f98a066cdf31ca016d1530619741ac946fdec6598236b3916ae9021fe725725ea9b8c31cdd192144912e8f8bef3d0675bb1de5d976e068124d77180219aa8a7492a1e3fc85580ee7cc395de19cf05e46f64da7c336d6ec75cc1a6eaf2597c9c156b2180039f087ce2a14c6fdf652a0dd9b4fbb86baa3a7a455b4a0ee6eddb5fa204102a21481ef324797349b397288210528a74b8c6d5430ab497339342723414269f21230a90d94f613dc6428cdb92c1a12340a33588677eeb69772af6901810bdf4b2218b4ee07eb9f69eb34190db7afbad3c0fd666e8a513b8c8c0071b617cde3d5e6d07d8f01b3c71f542573354dec5279e361ad6f086077afe93ed5667afc2c80257fdd6a906c61a5f8a794b5592c595eb0f692ab02e7e3d2fdb4a93f3853b67c2f9d89ed3bdc55ccec552b693413c86d74ebdd3148ff588bd09b781a705efedfe6e1d0c3f4c192c3770bcd0e14d5e9d2f9000baaec1a0c63b41cb13b4825131c7231f5f82e63c9b2e504e994eb729530643d195a42561295292160bab9889b4bb42e898cb8a63d34e816d01828586e935871b2f8eb4016dac6200058a5805ba6ffadef2a00224a4fe7244c41e01282b748dd72095b0f4005b255361412ef8d1e339033adbb75938c910c263129c3089ef017472b8701a2f689f9cd9d712f849957d787f98d8af785ce361127416f473210871a29fcaadb3cf59029dd7605cea2931ed00a7f9d6396890c7af6797cf8b124b461d3a6c92876270a535c8fc7fbfa75cdbc1ff118a704e7802efb9a5c444f0499a7d89f14b75068339331733196f2834d51d4588cbad046b21e99f2407af26012f43ed75c525a660d2a256187a074c92fceb34a5d99be0cfc94d70b0850a581b5bc39ab030f2c19ccc22950dcd016845b688c95eb094ea08110ee7eee019f9b7f4970d66b8c2be003b961c22b9890c1aa27dfe81dd19df59df099d39847a2ebae182107e55d6d5cb5f46512c5a4b32e7dda99ff5d5452b54f727708c01601b3698d0991ee020de0cc62d03ff5cc2b85420d1cdaf17e7e4c6180b2c718e81d0cf6c67132f2df11e15c4f4f20510634ad7633a775b2fe37bdf8a2b3aa3f2e35a2b1d99df1458aa7fcf5a9b806ba3b66cad976b2bac5ec3ce762b5e67993d6cc9a877641219622e46a8bfd22941d56eb8fb801041110057926ec521649ed10cf2abbe6966853f56a2767102af3a8860bafa57b7e7258e461ca53b71dbd6d495e9c68f48a8947532046531f9122222775547081b9c04bb5bc5b3a1bc0a7964cd8fb4ed66bf21c943a1c6e2fc8428786dacb218f9f61d427e37f3bf421dce72db2d40771425c1450cf2d01a8e40e48acb1b4d7e9521c5f3e4827e3e443f45d7785de246f35fb9fc52742350f84d1ae2ebfc207d0cc1686b04cc52bd6ef27a5111a7184d99f896a9f8e52d7ab02852f06c293d845c03329feb8a78c8b7432c0e3427ae8fcb714746cf8223442a87410b6762ea8e2817a6c45f9782de546bb5dd42069679993b891104704616858e96aaf26460864dad1d7f1c439fdb49bef7ce4b0604a418d98ca26e2380ed85a30f6e082a35fc218040b6f60e1c89b98e6086230ee5e2d49612b2f2011c574a540c2069c05b3fafe1b11541d16339c353c2320765121e0b04563d754eadb97a884d3321370030e89c7f3a3c8587d7d10fa1de0407b6cbef005641c04b031cd43befa60ff293c808d1fd977122f5abf2b0103d45623fb27a8feb23109e04e28ecfe2929160f82f3fa71c1a50fbc4993a186813113531e13a14093bd7eaf8d5a0bf42a524d569c156d40767e75959c8c2e25de726ae14b698491f5ca51e94b081b40b1a59a8eae60e4e58b76a3b24b6d45b164f932c43283b10fd09347de9f5201efae3fdfe5e2ea3babe8ee9cfcaf0a5f082ef5113af7f1617418d53f89feda7a2137f327e35b628cb870171a64da08", "63", 1, 1405843030, "b582d2a56468ac990946c9ccd2ba51ae643d04f4c832d8b2d5d795a11f5df35e"], - ["0b489e440393dee39e6c08c933943cf32883bb8d2a9cbfcd5d7c94946e0a0fed366c6248b303000000046a6a006affffffff33f6dc0626fc2518425065d18ce80dea1a70dc0f1e2286b69c46da7b7b4b678900000000016affffffffd99146eafedf5308ab7540d6a42e0b8849f153c570459a317d876fd6dfba8df5000000000025c931c1048315eb0200000000086551acac6a6352acad8528000000000008536a63656500acac7deff0030000000008516a65006a5163534fbc3e0500000000090065ac5165ac6a6aac0000000003375a08030000000000000000000000005c6b7691d04ffdf82584b70b76eaf2a86f9f5e45a547c0562488c3c82aaeba950bbd97c6ce32d719c625ea59e0d8dbf819d7e885248898c7fe541932db4fbb9edae89440b83f16819704e0bd2aee8fa2e3b99806f15236e46a009ac3582ce16c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083048eb42284249425f2fa0246d2c30fe2eeb82e80ee9842a685773bfa66079bd46c5bd14a7b98cd0f8bea871108d524ebec0f9473dc364bff5fd07c7ec5569322a671da1f09c58d17a56d9016933edf794d77ca66daa3f37308b5b62c70d35eeab2dcc22a3dc0208504774dd5100b04863807656f20646d8855d847653b2c40032eed67f1a7c10a7abed405ca7dec2c6e73ac1e6b7e33fbacaf81db43e054b812020ce957a73ce96752a3f25ec5059638f9cec34b285cfec325509224ddcf65d8f70a0621afe3424ac9b50f3d0933cf572eb400af35ec55a35efde8284e549e712aa612e14f41bd3da7b5b9b38676e3b56bf4b51fabfcc37599a15d69f87f542d4b830222b09e909b8824f7cf07c16c4ef12e9e503e6b3b28963c5feca3bf176a237cd902224c40abe3aab1f5c28add2be797b6f00f528c717d4619f3a764f549b9bd646f021ce72dd992b9877d3a50548571ad23c41367a60eca9c2135907dc8c3ca68e1a7020b3f21ceedd0dd83b4c2ff3c76f90632a0b4ecf7381ae22528c79e92887bb5db0326ffb2e370a573b8df0fc0711e4caa3b3a2a4c227135a92fd6b8431aa55d722310f23ec4a0c69215db2fc1a94f673061d1a16ebcd5363090e0fa64a577605833eb0fb61383bbaca092a2fd0b4496fa5a2fdf01d71abf5b05cb932b4328b4a9373c4a9dc806e697b2516e9a2b98310e0e56ee44e4386885d530269db690232d4458a5a2c6876ca4699b3e8d458502bc215ddfb72c0e01563427ad7f7eaa2e1c7d6ad36d6cf0e3e6b74c8bcec27a5f338e958ba350f7999a068a60790562f5dd2a0aa33a67a0d11ac2e27b5ec7172f01a927ee15501819534aeba568bf22f6e4acd1be2a02e71ca3804a78342e9a8ca8c1243bb665a88717a19dee0f51b739987bd3d628fd4edb8a86ac641d9ede670410cfddb4bf8f539fec19a6c2bdb3f51c03cbc2f5305ee8a6306eee3b01357d91643bd14ad08e056287b3b188d44aac5dbefad6b1982378aa8bf5fe52642b71d1a65830045ea7e2ef43b046dc2e6a9acebb51df128d90dc808f384f19be013ae62f6411ae7291077cdc6d4e90004d92f371fb0bd906ab84860f6a76b9cef91275b966a55ee6d34a1e5519e157e5c227324695d922296b33bc6bbb696632d101ddd58dcadce21b93156beaf6c9f0336e0530c2d110a81c2a15a7c6751d68476cb4c01d54916790f4df47a339fd7c3d110fa1f0748e616fb401acc158bf4b17430a2d848cfaf74102197f8b5c3c315d52f0be5cdf8420c608864d4a7d7ad552c6a397930b0dc620960117a70c43df9dfef78e11c19ef8e50b0bbd3ca051b82e34a92adb4f012167ddf906afa20c7201ffb25412cb48405b8bb8e067ac08139c59a9ba6edd2dc1fea941010ee63f787ddbc031c64391fe5eee33d13fc3b3f42e541a0002d691ca245db484b573b9631568d2b903525dbb232fb80c6fb88b8521437a36c53fedcc37ddefcc3695ebed4b1e6ba404749b43cc8fdeabb5f69c468e689b1f44c598d45eedbe11cb76a8f67937a9504a41680aa518616c56b962e01a9f0adf4f2fdb65c22825cb4523bde1c22d3d2ec347ae968ef55a811da3d578c852178a2dbc63fa9450be412acfc3f04f55afe17abdf8f0faf0685e41516aedce6b6956de5fac08e4047a2415f7e77c24ca93a57931ee2f90d21d7888c7c63bedee7c8414fc44321de0fe86492c0d656eb6ef0345f4a802ca3979d5213ce6682543cc19ed22f93636ea5a886aa85c237dd0a7b124a35ceb9df716e651326985672a7a3f64fcf9dedef229c253271f686394b5067ba0f3942880b574b8f7fa8938f64432a4a2deb295989089147a7d8e6e7a5b6b7ed388e65e3509fc8290d2cd76d9aade42ddada163e8312d287c5cf13547ed8dc97251ee6db42ad22760d0be5e12e0cca2df14d959f1b80b0011462f05f2ea059bb99e4583480d37dfb2ff95197b20c0afefccf9600f279fd3fa4cebfc2683b897c6f9c4fe838a0e480325d3077ef98b3f79c540de32b15bbbba309e2ff5e09d1f7e992ce435799fd926d3b636e601b4b0804635049daee6aa325d4d127a5dc559d86b882b135dc52fb42e696731d19c1913ac79547fdfaa087c02ed723537a313d077aafcd98ac0c405ea82ea1b444c255ca284d29cbc7d8daebc377dfa671f3a201870fd6f9643ac65240efc32aa87dec50208293f53ff06d30aa0296dc36c3eb8a673e6a411495f17c3eda7622355ac2a94c75879bbb4b48e8df1ad35fc349feb63e57eea87efc39325239e35a55c950600000000000000002828e30000000000758579573f357ee62906f50d0af22d1210759971004d2a8b9129f7483a29dd9185b2a02b6d906e1ec5d11cf472dff7da86b305866116f2834e51dc44e62a7f38682f9dc71b5f8479c993cefa91ab957b4c52a0811dbfcc70f085874fa6e594e30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074fdd88397c76a6d255ae4a5602981eabbb162d2d27a85fa235d82ed188ccae3d58669169eeacd5090e117c5f8ae61da5bb99e3fda614eacb0914f2cd9bf1f70fc762e629519432c715be01ad340272143fb28b413914c35990d6c4e4dec5f97ca2526a9dbd125a1b48e166e7488516b801fcb0d88ed46e4f3723d44174da6b4022af9363e0d53153461ad5f7143a59bf95b819900b0e0dcf7b9359ad9837ec315030f8934d1924e5cf9a0ecab85e97e69df88ee9a7c8e10855d2b70a2d6d5316d2e0b051ab64752d09563c04d558a103b158f32911c3ff92b7a896cc465560e044619659dd951f23d0abf5652536df51162abc646c06cec7810ba7d854ccc5944647a0324e689ab0c7bb0ec6a75d49cfedd5f3496011b5efa88142750b877c317c42c4e030708d8185c069e7f8956ef6002d1fd9e853ecd7adea4e424d91bbe434c8069430219b5b038c23f2cffdcb65dcfe9d1b2806e60812e00e7696819ef2d0632d5184e0220276b6cf5086a15c6b45d25797155ba70a4635124b72ec523130206fb4ca9fc03281018024a61ed444c38bb5d15c8b5d966db405104d9a98b870b9a168bb22b99cd67e57e0aba7975725772d20297139ac739cb209f5f689f30c33270d516ffc9875440d8c839f8c91dbf93320bbf89603f4b7e258c1d035bb168c4460a6f6fcc7beb34a715f2aea26d1f9564f58886d54abead24619518e35f2ec70e313b4a1952c71f3c22a49b809d68d00879a9a70e720a22e2febd428a76848476a301292814d0e460b6a1e5d58aecdcb29b099e1a4cbf97aa3fb546c6eaa93d500c64409209e07e3efa5b99e793223a3da4e85a234addf15a3e10e3e4bebc00fa4d5d1c7fd08a0d3e9b8ba4610ee3b3d90039cfc81b14586fbcf460b9a4eec45c0bf93e44b4f555109242d910f7073f6c8daa0121ba4eb9821c04e3bdf5e02dc2b601c8f641f12294dd8183b5c12f7c767d636c665f77d02fcdd3a9bf1da8ac962fba9367d6230cc5d1c49f6c257a34b38bd39e769053821e2178b32fb81dabb23a1fbb2f96f7695fd3fa03cec7b142c846b04ff7ff61d0900e5d2d1e99140253af5c4540567e75562545c19891f6f875957e8c34b0f388c09cf998cdf33adc2286e6ae703788a560eb33161a00007c1004e8c0b8ac51dd980372c6e92f41225d9e8939631086b3052b99172c9dcb484bce9d965321a982425424041c669b0c93341288d7872e5d49b27ba0e3364077478a6aa9359257a0dba7398abef17d8bcde879eecc497dbb3ab070de1a6b5e6e1ae36a7635b61e243ff5c2e97d6b6807e7778cf98d4f4431745a93caf5894acf323492adcc12be6afc936690fb34fd6de944765475bdaba2cd69843eb3d144e8564d5dfa3de14a249d8251a7e6487c2fc1f5f5c49ec0575eef33876634943edac18ca4bb72680f943ced57f09bad4befb232e7bca6accfcd5b9735cdbcef9ce717c4ffbf836b3f3a8db3b3089af9e03693c39efec61818c007e5c7db507799930d1f1c4f403476c4a3eedac41e4cfe2636f57a877a35282fddd29df9540d68b1a30570fcef1cf500f2e937898ffabc77147c47034259627f207a05747c787113682b6c4f4f3ec78c8c5245ffbd44008e3a6f4ad68cad934e4b4e0f758e62744211e0c30e44d34fa68b7c773c3f54ba72d38e3b760639d271618fdba669076cd6164e497d8eb8c30f61542ddc2bc1f8a5397493ce4589543c592eef8094cf6ebc0fbda139567ec51ad35488eddcc6220115b86c214f832b3d00a07c60dea0cc439cd53425ed86622a17a1467a5e63c47b2f2e4e15c62cb58075d48cbced8eac954569770a639fdf9aede3ef055e965a77684c2d9e0727780753711d541bb2b154c7b3c413a6c050711b4d56fe6ada4e9d145338124c3551e7f14a2ddd8995f5c774203d8e99f0823710b5f3bb8de4e7f802b4a20f1e59676bd6e6ba471e00945fcdfa7e86fcdb32a04b3af2a1e0a15e51775c6e581abf8731589592b9b726ab7666eb7d2585e281a75f9497252845ee27935090f59802ab8525b1e00ea06abcfd4171a7ba9a5bab9ffeb312e0ea4ac019aed95d2749216a745e42055e803f13de198786ef4ecec8f8f637c1f1dc2cd36045cc12e6fe720228b8d1533d4c8f567423385142cff71b3bddac63200d3d17eb6a06835928f9a649519ab6bf8ab5dcbe1e0e84189eea2466c08847b9ab9e30b28289f4937bab01d53a581d420c25df3ba35dcc70d9539ae7261268b2de02aa25e27016cd44e5fdb3ddccdc79880c2ef4a3786041f54c9ab38f68030000000000000000000000004cad4237b07e59773ebbe67ec8cf38e9c84af7de47cf755ceadca695d00f1b40287889f0afc8aabe2cd5a19a54eebd8b4e37502175018f6577ca0a67da981e1f3f39732078e1beb34f8c4f25e3dbb6ad95ab02a8741de8c59843dc3c141a22b70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f2fcc484afa99fec8fed3c6e883fa8cb4d1f62ab77c7b966961fbca98d7dd1e0e8037bc5ad5022aa2e844a74efe6b95bab369ed9d8335d86f3ddfed4c4dcbc26bd19d9a1fcc82995c9f390d4ad34ab29659828f131dea945fc080a4207b6120a6f201875c0204bba53c4af47c96079d110384a2a055214ec4ef6e5b13b3ac3030b46874f5226c0f0ad8afc7058deeb6296cf45e5f3d38f684a75684d6540412d0329802c21967f19a62ca60336609eadb281124cabe2f6c1ca48ed5b01ed6223750a083e18ea7c5bf9e97d70ee6d4b13d5cb509b95540e6d65dd9689ededa5f3d4cc17e14b53dbef0eca38a6565e7f747edc5c011484f518b58467d7076781f0a1d802088ca9e3007976faad9eac2dcf20fa7ed38f8fb7287b3b5cd02471ac03e6f1dd030a6388b12cd1bd7a96f4145e08b56cb9bfeb4a15177951009d537ba1fb925c2202163ffaca63e7e939cb66f62a50ffcceecb08ed4e1d02e9660eb259b464e77eca030275f6582787cb77d46d3bfd84116561c497352ac55b91c8e18df44916b283ad0210ea3bf060f2d08645e1301936064035734f8717b12b657278ddd1f7eadab4c81e67a615728c1ec1baad49720052afa991152347c88c4dab3ab046a6cdc46ee10d5582c35b65c173880b8f477385f642306a258814b05f0c722c8c1ca35c34e370837f95bf6406185b9c47c388a16af11451d629b7090db737387f49231630b13644babbf5675957b7e7d665cf7aa375c48322af1075258bf959c4f6932038cb652dba9e5eba4ae6746384593eab2b5532c0ae6daf475aadda6bd5826f9c6656011063123497524dcdd7495e4da964c23cd5b1bdcb0c21927cecd2b20462e2b7eed1c8f4d1071e55b29f6a24b825436fc038db8c59583420e0495c8d83374d00ea9486be31e1a8f46fc5f506ec03ed23e2eee8b4a56f07b1befa84438b711151930282215ac194932a1c9b7ac391f5d361cdfd0b1db58e7d20b35c15076bd201f5c84d32c81b82b2d2afbb15be4b0f03dd490a9ce7e979b328c44d1bdfaafd9ffd727619c4d1b3abdc386157ac0f9d3226329d115e2e10efc74a06b6b555c523791a1f0e93ca8fa43987f18264fa5598857c05382119dbd2215162d57cfb7c3409e0f3126e4d9a1d9194c493c108c75767fd5400e76bda53241c82b65c15a87af0a9dc5c6bd2bfea903f243c455e14b6c65c7471a2654f012a32077199c277d3553988f64f8a4c43278d2c2f2c8300bc7017293ca52bfb01e77295713e1d6e794236ca1850bb4cb37a47c3e80705498cdeef372215389add63ee03d499dfd064868d8c9ab5b92666287613f196356770b63d1f2786fb07c1a6453984199f0dce94d20c49072655ce10ecdbe9d67768d0a33069786d69f6205852f30a993a447e68fd2caeabde451b76124fa9fcc7f9121a07480a75b8b0db4e4e1f3397694b971195911011f30c976e87708fdbe0340a2b78bf93b007ea91a4ff668a4a3d2ea5757d220719386dd022393b4caf0ee15c9f53a6b324650aa4ef69f137d72a687cccc6418ad9292bf22fe453fb26cbbe59b86f93c4d7c1a727670b0b6c7a96df3bf864a29a8bb06b43c136cc75e95ac565799d69899912573a6f4ba485c56d208c698bb5019a44302c2ea9f6bb3e53b972a9dd8eccdb39e5ede2b5e8c12ee4c110e420e3d312aa54a2e022c2dfe2720ace43df23bb7b9fbbb519580bfcf0d248b2f8aad31ef70c24aadec1947cbbf8425de0a8e7fa560824dc2034e29239fde7f0c8763bb08e6c726b8ca99b37a502649f2fa2c4c8594f0afe84546bd9985a11e81d3de2ac725431fb1c951976f64f12d8c25f4ee072cc533b5ad7ce9b551c3ade7b642da208d5fe276eb7b71b727106c5ced736e4ef5202d59a0f0e6e8ee44519eea42499cddca3e19c750b15c08fdc9bde801a3f5dae4c4b0337e66031ec138cd3129fe458a6352bc536fa7b21bcf3f997c9980490271f583fbdb2ca0af6ad1f5b4feae0c281a0dc0c1a9588d27efc58e66d9ab2f72195987b62a7b2d6bf32bb80eaaae67150c3601d8c0f9ed49be4260fe6dad57a83406b6eca28c7dcab91a6c9363d134a465d488ac99b6e8ab3073090555dbe7f9a3e8344e0b76dd89058347fd482ad66a55001770165fb4970eb4fa8865c1399ecf37947a1c8dad1ece4f37b14e7d98efb683cc990450a791a03f6f3ef5e5ea3eb6aaf9ce3d032ce35e1783236b761cb0bc9b64624da8e7e78edcde62dead4883d3213f8dccfd23745aec0351f1553dfd6202f606cc45e92127e309c0a311f4b11772c46acfd86a08823e514566956537abffa3e4c31759f897fc2b162e9a6744f2775d528daf24b7d2e85c1491366d43448582ae07aa024c1d87e45eabee5a24f6d1d8bfffc102a888a928be654211fda11593daf54d05b28c8d2d303", "6a006a", 1, 1217623205, "72f744daaf38b16a94783a4daabeffbf4e4252acbe963b5e0b33fbf28a82e443"], - ["0bec283a0299a1628f0dcd9363e923fe29c5495761f50db4922e14360f55044683cd2d391a00000000045363ac00ffffffff8293f4204535d25f47bf53ed9f636323344503f50961565be65cb0c27d388a5a02000000096a6a51526353ac5300ffffffff04c988430000000000016501cded020000000003656552b10713020000000001acc2a39702000000000663ac630051514c64e23500", "6a00006551", 1, -431155489, "917539af29cddfda028077c3838a9e6bfd23f8d43d87d56975b1eb344bf66870"], - ["030000807082c40304c1f58eb3206a41a7f002d954adb48538873cfb75679095f49b1bf0c175b9860c000000000863516563636565524b9cf844ac6736dbf54db5f5f69bacb583164329868d4581527ad305f7d53fdcb7e2381300000000085251ac5263005353ffffffff9909520098efc2536d7daf9f652c38e32acc10d588cc8a9dbf3c1bb8fc2962430200000008535165005252656affffffffb77b88ca8a709939a5632d8b610a24b165475ddb6b1e9576b1deac2922fd6a3102000000086563ac5365525365ffffffff0397d0320100000000025265741d0b0100000000086a526a515265515104cb4802000000000165f68038625865c18f021e0dcd030000000000000000000000008cea4c2bc88a8343527df440304d2884ce3ed823596f6408ec32e0195c00162099c4bc14519bf0840e7b818baf6978e038d619779f9bc0715038779c80492bafb719dbc4f02353150d43d41f0c8dbbd4848295ce04a4c2375ef669b20d082ce6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002aec6b39671c4baa7d4cca435153350f9fea1e12d3ab178c48138e374d1e91dd3c0997f4d4f9d0d42b307fefd8d34e1d4330423f0d16b2fa62fb64d88361c170e6607fae24ee96b42a50737821cad4180170b04d6de7ed89361da2789703547543bee602209050d27dfcb0b70231361cfec31e9e88f916bf18109cb020b0535b030334a71ba0b594c885e3b2fe125a59ff74a39ceaaa324063285a78ca54a02fdd022d892a23d3088af7df6e244aa0777fd31a90100ad2641aa3377bd0261daa48280a015144e559f97f95c02b0681c59448570575e934dc48c5a7614d8781c117cb3681cb8c925c2f979f4334d6c4db8b41f2d23971013ff6460e4cea10b8f7dd5ed6032a9f7df359a2a54bf3a5c840edd9deff0e332ef9028ff894c7d3eb64adb9208702194f2033d7b9a7633a549463b231069b7078716e0357bf5fda43294a2a454e87022cc1f94f20712628d85c502e998e71f687031b85e755b631a7824c1a2321fe7d0209184c2f7d87ecbac15c353ff615dc205aceb710fa368f9d50c724b89eb6be850203e92248339a6ee6cc191a4d0be19bda122949c310944e86b2c2d90032483069d33ff27381e69a964e5952e5427ac254e15b53303d72cc4951fd0c2f633fbb6861bd98b866e883ea15bc8dff5497ea7f7a4d609d8612872ce14e2e87a52e5d5fc46b0743baed74ca31cc9a31f69ae240d7d4585bc0aec7f9cc39fcceb5f782189c3d2fc53aa8c80c60a3ae5ce32c811ce3b918697b25aa3d397d8d82f758c6c7ad2920be833a9b73e6e7b5e522e557b9df4b14370ecf4c10a9db7e7902ce5f5b66759819148364477b7dff30a343f872ef988fec8553490e7679fac9ff1e190c35382cc5e6b58603bca7c94fb30ebbae0d68d5ffeeb6ebba433dc4fd0b740cf98d1ac92a9bb280da03b8c4cd6ab3f87c75818e1a33028aa07f3c796432277cea3ec51955c54c2bc628dab3285400d345ab665f28f101a901976629d8efc36030cf750ac363ac1929ea98f7f38785e9c2b33fdcdd6f0268b71807178493d49b2bb1418c58eafb9aa1c81e6e2208bf606ad07d89f7d5735089689ba3c34817316b813d59edde3e882a63858f04f741ed5bac166a14ae194b2a370fbaa75644d055b35cfa48fc411bc66edeef36edf1f7f55901b8dd2d7926a1778b18260e89c2651f2dc347388000b37a54d853f8263f522504f592728e8c324a763e03f68364efc14dbb1333d89b9c3beaa9cbcdcf963a0aebbd6201b7b55f875f1485d6dd0bb3cae7c544ebc1a0c2da280952ce7fe0f82288d5234dea8a265216d11327ae1779997323e5bba48f9184097a2d5b7c1a19c211385e6a6ed6e5de701d8f4444a0955ffae777e4a7a8d4cab28574967aa127e73adb490971ef809c4b90958602ecb7fba56c4c6467e11601f14441b6e43962179910e9389cb1ce4b9dbc60068a2840c7a664df0c92adc0a2d2e13855d07c75939247ff6832a7f81d3a02b22fa9641c0ced9b1ca518155f2b2c42adbcd9ca5f6d07b2dc2a3887fccc44b6e8eefe1180e27c55b9820a42acfd0951e02f447d7eb33c7c37a6aa59645e40c4b1821ffa9faad1ff3e371168cbece73efa59c573484bfc609d8dd91768ae8641384cc1476e6e15cc9740ec8bd3ea2b6f822898591cf0265d214952c99e34be1482dba2ad4168ea686b1af3065626bacf0627abe5f5f6124f301b0803d9f47932ef539be30a6d9997e2d966f88c5081ed564a37647ba9c2701f929107ba1d080ab488581797e3acd81038cb1249cca67bc1a0c757a0dbdc0e962a705bce6dbc09c1c4d822e3ad64cc9d9b6cdac9fff6010e0b284a57a1b3fcd1326073b67fcbabd57819c4e04e889ba8c5ca7d671a69a7f50e420f0af5969d78ef54b4267d377af5bcde542f5f7f70a8d3c57235bc7738f431f8253a071c531b412d9a25a33af58fe93326461047577c6023b23559b6df8951736736697cea8490fc9d59ae6055971bcccdb933da7534799ce4c381d4162d103e4f1b62a6ec868bc8dfebd4ec6c2d1c21220c5282972130ea031179be02597dd167287c7651897a4fffa1164f96d504c79d9ee9387c5cf421b6fe9207766a54674138e7894620ff0fa5a54392cb9252625d66e8c7e286e334ad64d2b011707905a0da7394ed8855aa9f05f687dd71fc90ce8f1a5c8d2db039bada2d002694ae4f2efbca9855851e07ef94798289c32245d2e0b1b62d9b8007d29c4a763cf3f7510b4cbd3ea42cf3b336c48765b3b209b56f440df90e02425b6538e60d83bfefa6cf2fdbba74ce270200000000000000000000000073e02f36993ccaa3c0e4f8c5fb6af53b4bc9fa4f3c446dbf839ca5f8419eac6d13156d36d666325b23d7e9fd7f4bf314be97da150595f30150dc629d7f30b628cf82b1bdd8532f43e189414aebc2e51678da681b727138fffa25cdefbb07a37300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000835ee44ac1343a744d2747660824f148e56d69d7a010d17596dc5f8863aa97bbb486b0343520422e5bae5b596117c3699ac5910149b4de7f01fd7be8beb213f0e14106e5a182e9eab0c96a02642bf0c937af739355c7a83a2bd61dae6e676d86a2dba666bf1de80da66365720afe2e028b346ac532db8cd7af10ae2179ee255e022431fbfc8e5bc39bf0eba277e2abaed4ab495a9cc08320ab772b1857b677eb3a020c81983cfd1a86badf767944b0e5eeac79514da1590b07e11c1701c9902ce7bb0b039f57554e9871a1cca161d06a54066ad763fd7031681e6667799b8b424f04f7c39102621521a48bee1eb4304aa04d6cc4861dfea873f5bcadb0c88e4187d180031ba90c824add1efd36852533ae8a9fa2bbd39b5b9ef7f5e4a37d3489a72f14620324c50357ab8c5074cbe8aea239d78b5999f1743436a608a0a330f48dd8414d3b03241d892d1483773610c57012b6c3ef2f84f4efd1b1fc84da6aeeddfedd5896760205d50872134b737e516acc0310bbe477dc5aec0f6bb54bbcc55744082b0b2f650323ff3910e72d914c193fae6307047e2d45a0a4acf90fe87db871e0e792b909d5fe86399a3afb99c3082eea6feac3ac9f18880acc8d629a72847637e11de6ee724ef496bea761f0fcbb4d94a985a65a7b41a82bd2891969e621b1e4213fdf45b98d56a263237c5c168f35e3884f1989581b502c4aac337ff0d20d17cd49cc8f288b7e8c530058e9a836cde4454e023cc49c55619161d3ee355c1b6bcdbec9438b84f02bd8242a2348b295923a513cdf5c01e24c7ed647fac2645ba8ba26778bbfad109dcc74f0488a1273bb6f265504e0f5c41f1c495ce291a0e095780e7e2ee9bb53a757e9911b34ed396d949f18ff22dd7d7f56a1250ca623b7c25561d50220ec2eff7669868c9581623db7f99473cc3f688bf98067f39f397112c5a38bb1ae2d7ae87972945010a8f839e5ead1b305f79bb5dbc30353f15b8a4b161f3e9c7803653c9aa07cb98031f35b7fa840e3cefd9108d2f94eddccb54e106ea044ff340647271a6654102eb1be15d06e86c4e44cc6881933f5657f5e57569271b8d8643de8096b668766077ba630f786df35296d1c225302913445399b2aed55f57cd514631aaab5ec9fc9f13271a65d0513f0bf0dfbdadaa24085c05c84ca18a1bfdde95d7ed6954947d71f9a63ee7c3ee69c71273a83d8fe5a46eabac99b41cada054c01733f575164af4cb041511a2b2117d21bb99fb9ea897e6b5fc5841dc089d228d573414a0aa869ab947907d2260da8e6d6c7f235dcd9012f4c391bead7149951342aaed07900ab2d49257929a99da4124cab62d9875d0b53fc1284d8a7dc11da2af5ebe909fd85fb28a97fac712bbe75cb796f276c7f68127260ffc506b2c7fffbd9fc08980b15a15ef488695143374a123c414e425d0b2ed5298170707c3eb45b9178d45b292a36ca7c3ffe4de8caa345e32925326b4b3b672c46cf4f8723daa20b291720e66ccf27e4651eea90d8a501f2fdcaeb5e866a4396e1560357e8bfaa9ca0aa0818281ee17f5b2eb829463550a5f1cae4427b34b39173da2acdb13b119cc8b45e77f123d8596672bc3227132bccf753bf4f83369ed1b3600c059fe397dca22bbd86ebd7960ad9a16a333b773731f5f61be7228cd10594e64ab47abc9f4865fee82e748371e74a589bf12a3b1d0f412bd98d08185274083b4f71abc0e804eaf28853a25d8eb817dfedba795c2190d328371f697c7ac76b37e045b46d8842012561e6becd0ccf3e1c9004758fa6f5dcc604d2ff91079728b2d00b3d43ee0ebb162cc6703fd6c3f13a801971408758adf100e92fd33fe2708b8b2a4cb9a0ccaf6e4b68bf11e3ca9cb95a63060b05adb66619d8d58b61df52f237eee3b2e1ae6a2b8a9c96e1977fc566937d69c8d407800953af19cf9017937948a49ef315a5ca1e95c7e8074f47c6e151ad15ea3ab08aabb0cf377a701a02bae0a6d130e37db2e0a1ec35bf57fcf31aee9022615e143c13284d739b8d3c624b11c16879d5567614fc325a2fc0b9da7a9348820029212a57d859d80e72f180b158b98dbff398c4f5e45a8e573f978f6cdef696b3d9b736cb136357edbc2d0e0b93497c006a326435b28210bc2e89c605af07d122e4f12d7f5f5f817fa284487d1eaba7c3c8acca5a075764f6a8892db0272ad8d2d32649bf5b23e05679e0d469f15391cd58c72b2cc31ca9fb5a626f1ede4cdcac739169c1e703e4a90813b15eb2f5120a1c11d863cb84ec785fc830b7ea80730504f6a6d524bf7b963314cf5a48044ed5b02d689f853aa4c530d232e82ab1a54bb19678fb4e319bdc7289ab8a85a8e3172a140f9c25c75fc1f1f75ab065a2f8b3b4514e8b136fdb041257ddb82cd5878a96d1c87e406443b49796fd800de206440e", "63", 0, 536404369, "f03956f56560651635da2c821a6ab7e9efd802925f33dcb5a66ef19bb66d047d"], - ["030000807082c40301b3079bdd90105a16ce220df42f55e8badd3f15bdafd39b85edc13a711729dac30300000007ac52ac515300ac8ec6f21803b41e9a00000000000500526351632e3bd302000000000951006a51006a516500b854f0040000000005ac6a510053f3bde7aa0000000002f7836102000000000000000000000000554fbc99162f3ea0435054798073add1802a8a2e54b8ab572511bd68a44e00ea3f3853daf06141533168bec823bbe863343f65c7679e9eeadea7537495a74833ce423d95c3a0b20457441cea4cc626b6c2d3139683204a8c67f6ff09364360c1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004777890946f1e8b532c98ba0778e2ac21d2f752bd8c5ddbf020fab929646f0d0b84b36a17b8f85c798e1569dad8c16b85b871c40aacb3194c5c434e2d8d34a3f47e9a1c6778a16b88f7ed2ac555bb254bd6588320c4e1a10c555d95b9361f71a4e53ae4a81dc75e4163b759e5a308df2a2034df4bc72be38ed1ce8620a029ee60319353be2c941e580ae5289a30cd9c511122dc3cdcc5bd83da43f60b94ee0654b020b86b63acd7cad441bd76601c95e3fd0719fbf6e9fb7a150e04837525542361b0a00583999509863b40b158287cfff2345989a8feb45b1524bcfea854ca18251d9142bb83cad7fe0bd56a366f02a68e7fe54ffcbcbf89b157e480205569db3857102227cd6667d0b780868f3c084b343b1cb8d4af07056e27a73defcb1889fbc771a0206bc378672b31109620603bdc2e0068116a6408cdaa5c37e41b28f01d2905997020c8bcdbfa4b048e4a363977d8ab1619ccb85acd875e45f58928cf3130ca1eb3f0201eaf5a4effad6d747cb0366752d5275db625907a41d8093a3e94d769b1c8f01022b8751855e981bf06cf3d685e2746f86b067494f1984604d2d8415d3a71f1b29185e21dcf69545e51436fd3581eafa196d0e0cd552f2a25697d87e275c2faff59c0a770cd6988464146f52a14b8a833d013a4149501fd91d935d38ac21e6940ac6e23633b06d59b9c14318cb092c3a42edd3449aeb52438d4c59bcb4fd8bd68f59d88d53c520f72074d0169b12dcb82b40dd4a5a031a091f03538d981cff00b624697509e90d1fe2272231a196609471de8f14bf765e86b6f30a96dc7e77affe60a5d2d8f0f895ff6269e86ce4bf5f2038917c9084327f5723c53c48cef0efa8876a8e3989ddb41f3b73c0eb926220a26be85f4fb6dec1f4e6781255a830b1c3d7dd443d14de152727ff8dca8f6bc25e9d1c4b46dd595f6a787cb4c374b78e4ce937187b069602b37c69041de9c4320cefec057fe94d366fe523f0e199405745868d6d771e62d607a35d6a4e2bc9ec68c32aa46e573a4d6186a4dcfe78e8abee25efb4a6af9763e7efd35495cbbdfea78d9626e6084367056e4d0e57f9e88c50246a8d7fe8c54ed455a7c770456a2c5b2592a199a397b48a999bdc283d7936ee4580c0ab8c71683ec63189d39648cb60b47381ece5723422366159bdc62e38a99eec1af7e43aced7f8b9af6efd14317e10efc1a6c90e5cddfb719b5dc859cfe086c8e49dac28538c957592f208f1edf49857aa4a0fa2dbe779f105610a1a0cbce9b5436187cbec05e8b51bb9cdf47437b0afde5cbc97837ca36743e2bf17a4bce095a348eafe94ca056e741591d63ebcb562e6e61603a48fd07f9b606c41dbfed699e5a1bf839f42c4d67274ec61776ad6c39f1d71fa27862b5f7c106ab7af81df77b702f3c741768bb771217afd76358b90d19b4e46dce5eefc9ea06328154ca142594186c919fd9c11f5b8a4bebee1ade861f561ec899d991d6e0c4f3f56c6dfd12f9303c3f6087e1d0217d5843ce13fb44eab3072aa85903050c1d32dd2506cea8975b0021753c3378e303088f2b56cc0ac8f66c7b61e4f524eb6bf4821da049caf37937e2ea8df94155674ad951869cded4318ba4130ba3ac7df68f1c1cb7a22181676d4ba499b356c410799a8121bd42f61d763e7acd7ab3c93c87768be9033a96e853c4af4180c123d4f14962c7a6871304a563667f5669edf8fdaac7fe1f10302bbf301ee92526fcc84cea65599939f5857b04dce99f64af56ad121ce5c9db92b1a3d5af4fa7d229d15bbaeb9fcdb636b371b6eca888f81a09cea4aaea16e9ce1faa9519587f0c4ba1b392b2307649f911c65ff545e02c1b9cefec1780743f6d47a9d8ed11c1bc8f19f8c0fbd04a8f70aa2fcea2257d981202a283d5f9e1f3031ee5d9b6627b14ba20523086d18ed0d7091cc8e5db4341319c15809ac2368263d9f29db2956a1890e7248c09f2c8e9b473777ef7ac6b6fdb34876858885765a66028991a2b192615d2036e28eea971928119b5db7957535c1a2e2be1fe7d3601a89c07c27db66a811658c9fcee626f306ae628e655b66f45ad7e5f837b5287a747f16c2f0ce7865d2414eab7137ab2280447bb17b1a33fca2f676fc03a153afc6b63d2bc33246ab74495a73489e08081b1a6b7d71f8d6c2f844107c2cb467e409233f44be4de7f29b3cc78969b1fe878242d38f93bcd2dcf0730a165902ca9c62428acc64a31d6568bad997345c7ae5684306bce68f18c6b4c2130b8285d5a526beb6bb215c8fea1c1b0aa765016600000000000000007f0699040000000029d3ff579def44089df3191f126c6e0924bed1e6d58a680eb278177f1aaf3de6f78beaad81fb837befbffaaad3824e141cb65155784fe67d7367655de0192b074fe9a1fcaf7a7f7d5bb49627000762b9d921f4d31b95fee578d7a5629e165b6e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000089cceeb832d1c782e55719eb2001b428e8f6ccbb70ab335168dfd5f3c16e3ffd81e27bc88fa52af61a1137c550f450cd8f70241c976ec50045dee0f33133824ea88cab39eed962255068a3e24a3635db0116764bce0df2a26d1c4db7306dd347a3947d3e13be7365298ac90d860bed5ef583dad673ae8f8fc1615523e480d760021033f6baee96d0129f843dbfb3114041d359ae4d930f063f10d2082d2aa9eb04032bb6e6aa9fab6ca2ac4ce3789feb3d671285e6287019b9049e9e8b52f11b188e0b040c2a8ef1e684716ad323738332afdf664c62617d821c7a2a5988ecb00b2ed80e094258161198185a2e8d3c276cae6d9554008f6bb12f22b3dbe8d2ac97a6c1022b22958132e7725c6ce8f8e4dbc1d95cefb12a065d422fa63f1ca2fae48d32d403280df6bfe70866b4c703847fc7c8bee57424067d719a84e0a07e29622a0c5202031283ca9d509e0c6abfbe7369dfd3b74509aaf4f71b82cd4ea11176e94ab506b10304583e51f52450a991fd1e5c487ec79ec9e7ecd9a1c64f23da05046f3a85a9e2022f60c936a2433e9935cfb1705c9f913de391317d10923712db12f6009afa97f8afaf55bc8365f68cd4b36516eaef10783ecfe4339de7bed8e9966c479bbd14053d7b1b87bcc1f4418fff4fb3083557d36bac91fe37b82ea6a6e32b37b2a85a33dd5cb8951bf3ddd37e1bab01a5b66c13a9bf4f0a9fad8f3c9e3405259cfc16dde2f6275478aea5f2232dc148fdbaccd02e401e27069dad8451d8182bce9fe1b983e77a6ce083f0e1ef753fd4f1cfbaac658fd936b30d9ce310900ea532698ff661a81eba87ada4713ecdd580e86a16389c7a610e70273fc60b0c93f1c3f8ffe0143c86cb0d8ea2c362350744810352f723b600c46b2c35b638568ab46c911ab2494e5d49a806860f98792124de5288750857a2bab00dde779e4623628338ca130211908a2b160d454bda01dcdb474031e80c1a2d18a24bfd1906191299c81ee3b663888d21ded1aea51d26e11b252b2f88caba2a7b5910f4bca821416d765b0a95b5a3235dbf24845a8eb54d07ba3e6c2e23c3ee69c99d846d6057eca3213d1d40a84260e904c54650683396d3951528829fe75ef599390a231580c694d738fe2bd92155bb1c8fbcf7c2f4d3fcab775572e9b97ecd7ee6fcce8decee685ca2595c0d96d00d73119e75604c208914839df45b93bde38cb348c85736cf20eec33fccb517a6b97eeb2be6190a17db23376626e567debb035c3cc81d5e27a0405836a7e57c0761e312a052681eb107f79cfc9f6bbf72c831f0e6af9d29ba21b7fa98b99413a78f0f3e3d9769d41e5a3e4baca7ac42fca025d91302200bdac43198fbb2a161323d01bcdd6db5bf33aa0886c57e18cc159e313bf1c7dd09632cc11ed204b0d29d3773cd206fd970f0e261e8d877ca37c9315eb69d37402cdb92870b82a99a06e86c83a972de62d5693887c8ed42f72aae151ea57a5a6e84da641786162fbd198ba8cfe7f8948405893457c5c9aabd2215cdcd7d0e8212637b1401307969b37eb45a252c219e3145f8486a897509699c88faa9af5fb37e8a9bf749d949ca79d5e3f5cc0560909eb4bd7b382ec36e8b3abbe15631e54018bd6295be7e6c25cf0fa2a20d2c239fa06567d91593dfcacaf3a979aab21693ee277d25b554613a9f5923651cc1c72081067963a584c6c10090c271bd20cae634f4dfd964e0d29ec8797e66afd539ec418aafc5c8590fde75a9bb06c80b55b0a5ea790fcf4157dc519c9f2c6857894e2b37ac6dbd486072486bbf99eb18891f6534b02323d742f6191c7d6e3fe39ac1e63ea05b36c7927d7291309f2bb3602733a787a59f5b2ef1c60b4c1c5911d8c61160a664853c745c2a742bd77991b4b371949b032221fbc72968ddaccd13b76a06f0da4301fde52aa5a1b252c6997b53150e054845c3ff1e614cda367e6ac8def374482c383b13fa2c827bbdbd3e0f44a9a88ba758c6c0ffa688627bb02687448cdee1ee518236088a04ca82ad260e11f846087850b759c616e1a57b594f5c8ca1845bdff90d180fc1260251710429e6454e05a650bf410f0721c18f5d919340f50d2958507b71c4cdd39a6360c514613f122528f7839c59495a3d2335813024bae24f20c77d215cf81bdb2650fd784efb38979652c32054f387f03e0bb322faa2b8258a5b946091c76bf03b7595607db34ed0dcbcf01a622091d8e2799305c5a1ce0a1509d4ee121c67f3f653caf9947cc8428c8da683c6c60cb544086cefb643cd24439f7aff7a44a6908998ec5ea2c62a7e0fc24a98d7692f84d3f7d155e5a895052002bc8c713e8d612baa8d160a1df76853a24f85bf6aa442a37522ca83afb3d778cdaa8cecf7e8fde1914cd86f5fbc351ac3273c719a817805498cd2785402d05d8002c88b03", "51536aac53516a53", 0, -2015926386, "c6d898af3d552e75aeb0346d3bc35f3430fd383ee396d1cfded4bbc125c231ed"], - ["030000807082c4030353b43a4cc3d4e5f2b68f230b66b03154629b7dd8dc1467ea004a146580c4258a0000000000ffffffffe77cd47726caae90c55b7ee6d604816ffa81fe640320348360478623ff7239cf020000000765510052525265ac8dc1bbf74017ef504e87ed31a80286664a71a3b3272472472e7b5b60f113869315721403000000020052ffffffff0420d0be00000000000765ac525351ac000a908200000000000453526a6afeca6e010000000008acac6553acac5253b7c3ec05000000000763acac515152acc76b136d0000000001ad1a38050000000000000000000000006a77b412a37d625b69e552382ad4058dd686e9e13219a6c891e3cc572cfa4df22f1693f00278fd29f5cf11da66f50534318b3b92b12d9a2cb4748869aa39b53f3e8b5a23eabfc305e3ef748981ac723e6585d1950e36e4e69cd551b50fd75ba50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085fe70d646a56e655a10f9d0b5e6f24a25bb35fc424eea40b6d0c1d2fb6cc90024a0de3da883582e277c0e660d92c662cf6f0714a1719fe115e85de6ad63f16fa801f6c9ca73d4290f567e530812d255410e0fa8932e36fe7663343586fba0511fcd643ce65b8ee9601e1fd2911681733fa44f270536fdf25910c34f7e7369f10221279c98f8a5ca2e3b71559bbb4bee18bf14092369cb3267925979127151081703194dbc4df872461216d3237e2c49aa8d4491e719199dfdf99e364ae1dc68ca1d0a04a52cd87df0ff785bdb7c97d3804c9cd1417aca1c6f72215ffcd19a9d37d6d2dd727b050f5d5fc2dca02297f45cf20decb161e9731b50bc68030f857faabe110327605a853227ab03fd7f6c6b6ddb1864a79d3a9316ed4b46ab9f085dc8eee77b021cae209fb55dc9919a12773353a48e6220c760712debc1e774d70086e9c0bd5c020aedfd4b352c22e870c71fef4a2292e517c839a653eff96e0bf1d59a4a4425a0030ef283bfb2272159785505f982e1083b6c6f8776d33ea27a0897d7f429e8bf30032e7ae16bdba16b0bb8cde3b282a9e5e25f79d38ae320132ff27f8160d5762bdec3ecf2da4408aceade41ffb43bf666328b0b86b0c539a678d124cf8e280b8331f0578aebb364636096fc156cbc2d330ef4180a9db0b32b1046571db067b6a932d83aee6c4cbee5fea41f20ab4758e6d23c753975d2b3ed9aa249de32b574a7ff43dbd5a0c9d37740dd9d1a9735bcf96ad31967131ea6f43bbd84b5beaf55f7c9fd120b43c8a13dc20bf936d6df652b6b2b11494bb6f8b69e072369f95fee00bd31a08def0559cd5ff7a2b932af911ef7f80cad85b653fc911e1a6bcd5b6f087acee39438e9a43a183adef4fe3d5b8d2cf026ec0057d60555515858c51fe3abe629aec9687ead8dce5302b7dbcf9eb8dea9f24977a70ed310bffd216952941ddeec6c2e51a941443a59e806ea54d2eb2b58e4361bf66f78823b9211291dd6a735e2c711d719fbadc181b35e736290928d7fc4cd96d7e7aefe571994c16c3ee207d34540fe0c024e3079e8c8a8f90c7abc79fbe2ffeb2465b1e2cd8f4d9176cc1f24c93dc2a38d12e9cee3346bae3e123eb2c28a3abe0df869b0e5d6b77d5fc92e934804b4840570cee1ba086174663777fd16905d793ac328949fe92cd7ccaacdb547c23311c5eda140ceaa29d8813770eec8be00b70143a586024d2c216c60d3805889491cc5aad3a718108cf24799912c17a12f48cd36c9baba4c4e08dc7c522882f4445c967098d01c4bc82be0f7d4806dfa0004096d3d5567489c5d900b42ab70fad1f1587c90d940e621842c303fbab1fb2223886c2eeb116766f1bce7f6b0eed032f040fc0128aa337cf0b350f41482717ce0c9ea1cdec59df1b866af9bb2aeae2be0cd9f31d48bae23e4b7202508367ca92d1973ef73ed628ef9db0d56c79973e8d08f1ac811b60888f90320e7606e4c9b819254d70906d54fa09da458c71fb5224e471cfe9d16d0de645dbbac613fbd206f542debfc04ffa279dff11c5985759245828fd40dfc8c3feef84b934d26ea81b675d2a6d448924ed9359ebbed67e6755743b04cd3f06ddbf923f9a965578642170d6c4b9da26a7254214f945b724e0ff0202a3c1de2ffbbb333bc66ef8ad5b4316035b0f0925ba49f9cf37200d2eca1f2a82089c20ed2c2040ff32cceff7c241b349e45d5990d80a7009e82a2b9d6ff680b053bfa7442fdbc8103374ff2edad0a92f30a26270573fee344f2d211ed28bb3ac1252b53654e611d85a45ec0b23de09c748caec8e966edd3482490cd331f784cf722eb6db65c309e6600671d14cf519e7592cb4a06efdfb53c64b494ce7ad1ca28f603cec618d21873393e938e13d7a17580c1e168e2c5793c9557fac33c156cf6ab780f5b2133e11d2704f634c26bfc0ebba1cf4d554719b9ab12a6401ad9afee7cb2299880662acfaa4406db9eb97ca8beb0c08a946fc6a504fdf6a9e9a0ea6e6da1d28cded0ba63bbcea925cdfaadfdb9a839cb20e5b9fdbc1104616a8e8f0b28d13ffcf9037decb7505f097cfa7138f2c189f6c9e2c406ceb3fd17628f1bcf4122353767ce2f2c78926121ac1534069eb4f372112c3d9534eaad5a82054edfa1b961e4d59997d5ae40b60c1a6e34bb2b04337ac291cf31f2125649a6b50e520ce574a93075c5bbeb1b67023565a5111511ce55e2444f5f38c77755140e1666438a5bb68818d3445ce926fee581369e9a1185aedf3f0a2d42a39ed04b0cb3f5b656c6a1688f9236d59526555d0661650a0743f4882fe5757fbe954876a4b79cfad262825d8519033eacbd8f64e796115eedc8eac1ffbfcf27b8ff80f834d7dcc3447755ca9ff75d1d87f4f137eeff756b471a1faec48c18ec4a3f6b3e14c7b1fb8f302c66034709dcd203", "ac51", 0, -1538484427, "e776eae5103ee2392d36d6e51566c2c79322723d0400f5048ad92277cbcb9719"], - ["030000807082c4030303a8ccc8568ca899406f648d850d5d3a6fcc3549889a5d80c7c9b48ebb717235020000000463acac00557a3244064c355ef33b4de9300431a88e320f91fed6d6a6812ca6573b4f7dd68b77948b000000000465636a51ffffffff786bb5e0ef7e2e13f28079fda9dbc238f221ea2089cff5e45c7066c536a6355903000000066a5163536553ffffffff0453e9a60500000000046a5251acf79a210000000000056a65005251cde05d0100000000016ae9f63b020000000000000000001df61458020000000000000000a11192030000000015c96f4e69ceb02e792ec5581da9c34bf3dd45a9fe8d81485cc14773c01eaf94a39ec129b3755b917daf7cd3d1ebeba83e84c857ffcb1c9524c666001bce838758db5635de6923bb02f5804cc880b168834aa4e034580a8f4311efa4aabd25c7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002933d964e26bdc2f0077ed4a1d9de5f2c1233c5a5e56e31b4a5b99eb6bb623b751c63dc8c1c9d05ec711aed683da7bc398e6ed8511bd2d9a144592fd6758bd2a5c60e1c6433733001245e920cf2dc8ff0720ea35e20ab002c5da97763534ee9b0fd84ad8fb22ce1d3790ef1c9047c5de3897f7adfd48477b5fff387afb7736cd030979c6563c94311d57b3353447c509f8110c24f102c5335d003a2cfd0fcc2b2e022926957e8bbafbac9b85a2b976ce37982b467181be50b9f1b84bf002da76d8310a04ab9cb0e205bc7e7dda8f6bf29657ebd8239c6c59e0b82fc5982a73e3d4f41277816ca4edc9c7722f39c255cbea46ecbcb7855cba23a28373b36aa56b4b9baf0306b39cf560a259c490a2136472b461c5fd6f723abdbb90521ebafc06de1b640e02235549cb255a6876e0b49cc1c9e57dbb4de7f4ed02f05404c0ba2ef207773a1d030d6f2ba4ff0393f0061616d80034ad862049d9a2434844da11ba61a47a0f53550328496d39db8a2e082139bbc58322dae8b3fc1f5f5dca7c2e01701171d4492ff402051f2eb8cca31bf992ccf9bdeade028ba489ca1c92df7c6c04e525f57388aff33a97ad262bdb8a33f2f4fb2b2980a8414d7c4307d79a9c99726b4064f671af5da40960da4205a1bb9c51e4d32d8d55da230aa3c6f69c7b2016789b07592dad088787d8d8e1a1ccf2ed1c70cac251b62750a7df6dcb154c2592747529cd5d2e69b9a5209394086fd48306aef1aedf8502c47e7f050f51d46f9028aecd424d0fad4aee7f861bed151c4743ee586ab5ad2abd23d85662cc3c62928846137928a0a0a601b815d8d104ff55d1b5bedeff1495ab2b41747c49c6dd152b7b5700968e6d61ba2178ae2bc5158f73ea110f32138175d7bd90ede4b4817ad0983335abeba22e1d7152328015300d0b0b5bccaa8c63ef636e0612d595d0cf9659453d256d2c5a10f897875818dc5765880c5fc31cb24ba2dc7bbc38a133d17644c8e0b6a7b2ce27f1b5f91c1ca06798543ae728cecb86ae4c35032dbf482e90645fdc5d73a44c4d758618761c18af58f4c642e4cef16556e4d02ecb54d3afd7eb2e7ebd76bf5f40816586bc0b685695946200d27f62182a553450478a0353e2c3bbfe0dea48fc40c85f688bb0c9943c81b59546d6130c1f94918612dd70b9e447537a698cb0d7a910b59b02d68e0ded926fd54d84370223ca617ef53d688a0624a90cab5bfca05bc5f494d69c2e3fe0bc88fc7b1b281a320f77e36d61d933ace52f807148d49a768dc1466224b969839be54220810b5e92e68aeeb04bacd789b4e9afcb47cc52cca0cb8addb159dbd93f6c024aebb5807583d14d44270322a84888960f7a054cc98aa9b2c780813c2e7e42844d1e3c9565302ac60b7d297a7ee5cec176fd77a0d4163124aa784a1274aecc7fe777f44374554a749662188a526196e9f2a674352935b17282ac45725c4e2633859684a2425b36626e88e0338b465e62d2abc440f551803884a0c562b31add8c93feb898782abe31b8684a1faed9b49c8c0f2eaada2dbe4dbbcf3b659936d42fc1b3f914784d27a759d8b5fc89fd23e3c08c694e430aa20e56608d2b2102b65b6caa1afb7e15201d18e19af136b19e471856849b0cc4d1281ffa7e7b6e8d2f190dcc88bd30088520dad725740ec27505164edf862d36ba24368f0f2ece9582c23941690e2c99f3f10d73ebfe853c302aa643cf19dc2fb085d882f5db055a9d941763388dde557b623233b522f12af53bfbb2d5f5d9a3880396b0b893550496c9ed90f736c1052e0b6397ae0df3822c7f711a3b8d3ab0d17efd5e889c992e0d956a1b9b7e80d33e6649229ab4f70a1c79a1dbececebb8ba533e94721d07609183c2eed020f30b0c7d0ce9951a160807e9d8385f1d3776d437a7ec1416f25cfd08d7d6c6f5578788ed98f4960cdc68ca58c3f57b195c6ab96c7386a70111c526fad4190659ce284af7a23462c710e5561ac48203062863342844ff27a5409af5af3a4687993b71a676c8ef179cab446a7f60edec4f192ddf644d8d8226e8eb4d06fffaf1c0c82cf931becfae4a2c99a51104000106f1f0baf14f60314b70709f0eddd0230ad0ac783e5b2db403fc2b7f999568e3fdfefcf406fc67c74b0aecf7e26479294056446eddc684c3c4f2dba8d13ec09223aba7f63c79abb3945138ab6b4d070cf34c9869788405931ba79ba034955cce28801e5a0ce6c0fb347c5c826049b71f8f090a47f7559890e929ba65831677889f14b3ef5fad350329d29d741600cbdbf0e000000000000000009ab84401000000005b23eab4251260068e75e82dd406e4ab11d7150ee7a08e0a7ed8193b22a8310572812799dcb5ee2697a8d66beac9fd1a1ddc17f50c25c347737c0cd42b56341b7cc26e445d9c5355a2a60f4ecfc5d955ff0893fd594e8715f8467bc39394785b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c014acec6d89e90f381e2638a861fa99f73c7eae6e1eb2de90943d036842a8b13dc247f12598c4fd80cf5d6fe8b177ae6b1a647d927eee68e8ebd6ae8f973ef946916a47555c02467c5b483ce7ba08310e9a7ea2ad85ee358f9767ba242412060595f0fa427c367b17d62e6b08b4def65c311178b5f915294c7f9154ee655213020e952dd89159e477673de2884245178eafcc1630fb2009afce07573b76583050032efd075c9b8d6182b0716c4287e344f73bd4f497d0b14859aab103458f2afd8f0a04d73e8c45597f28d71df8babbda16076b4c9b4a09e102612d5a1fa81c353808ab4aed3d2557de2e809bea24f9e95aeb844e285bbf2b12dffdd89feca524b815022caa02258c2c20f6127867cfe24314e3fcce3390c1f0c939adefbe518d931f2a02147f593dc36e2a1960c694b3f8825ddeec914dcc9d229b030b8f383d0a6c54cc0321cd3e0f40b75ba658819eb65f4d3d32b05c2dc3d1faeea0f67d1c5edf949b4e0212a727e1147615fb4ea6c4d4dcf6b4ea62ae4f1310567176470b77d61a433b1c020b9a6942f43f41fd59d6891894ef476e370a30e25fe1029c1c92bb1062acefc7346b340361142a642679765ed4494b3fadca3f8dc573b10fee749f3839c203a0e94ae116a6ce53ee36920650d5a9e368f211a57489e5628fb982c6276e5ffe7c36df4a18e797f35118f527e4665eb778e987bde7f4fe643b4e38e743a51c630a8bd1ee833a2ea8094818c189da4fb89dcb9dc96d3e571119e69a71b09b31f1aa2289a3e08079249a0bb750d19f6cbe110801d1a1b2c96ed96ed9155ebf168afbecb869b6d2dd425d7b53a55835959acc88728a36cd39dca742c0e719a62c3a3b23dc2d0bd4d5d91dbae4b474c8988f196654b164945f455bf9b9e86992f31306cc52d1392b23343b7fd99366c6fe1effe1274aba8744bdf86cf4956c76c381a255094e4176450d9d4343f13c4dffc3d18da0e0114829cc85c24efa2accb0e73aef3c0ca80046b2781b6b9a212d1f698b3d732a3b7f5011fb713d1b6df0001cf3174b23d2b57001c5d9f50f2a98e1698b6ec37d9023f67281fcd0495b3b29a68d1d96eeefcfdddad6140d40fa154ce0afae396d5c10d75b7b2dfc95575f7ea42bb814fbfecc3083d87ff1e10022fe7439ef22ff9944cf65be95cf0f9700b651949f039a89bc09ae82ea7475d41fdcbbee26ab936a17df9ca5d76556e6778be03a8c77478daa4e094514d8ce9eab9702920cadab6797b288a1d5bc05dd1bc88d9bffc8ba0f71448ac584a7e090de137bfb68222c717c42ff94deecd574efd58ac4be140e882e3dc15236ba19f8ea9a2039f2987df7d0f1858cc9a9d47baf1d97739c0d24b836458fa62ea43c3466598480f4bda38a4439dd3f4630e9889f9963d8c33834aaeed2d3f83cb95d14164d1945deb3fc8da57f8481f80b1f77f89ab5301a22964b955237141645ffd7faa0533def46b2b363f68bb9373f312527dd95a4e04f1e5a137e809c69430ffc2db496ea61d6adbc72544c07f196165a8e669f428913b7e30ef7f9a5e4b90034102e8a42d7bd510dccb3b1b758a5ebe356a71de1a5949405382ed578529ee2c81603e3ad8f594186e6743e1073062a7e70560d57db1a3e2a49439b2d628b59b994c81e7373ad1862e3572e91c174336274fd7c15101e5ce22b38508b64541d60184ab95763ac62a27aa93a2317e3c9a38b51256fdcf1284600f30502cd35f05c14759a6194bc152fe5281176c19a7384d1fedcd55d628d6b878da041bd359a9fba2e73653e57667e1ca3a03f3bfaf2bbf7e6ec3adace9b2fd067dba0badbb74441be93a43a85399df3ae72eb75411793b329f18cf76b488a24083772f33792a51d9a552021741a01726445b7130b607a21ed17871814e82f44753fa08cca6899defef07a21d717b0505018f5e1a8c8c184e8ef99dcbb88186328917eb48ce01b5394b97e42b09b4b47575c982579ebaae7e22d6de14ffa39e50fdb1e3787edc73bde2ebf824836248fa79e745631d30b0349402f8459a61cb628e0aaac00e72f536101bb058bc5725c6c2081c1262c22a0972466fb5a5b45de7439e2fde35c152eeba67cd94bfc8dedee61ac45e050e7e7dd8ba799975fee28b7f790ea1ba72b1ed080b9c39256bf2675ae1106bda4310fecd2ffa5078c3e135fa42f8745c9cf6231797e2508a4c78c56d3ad45f94b3e04804dfb3055c566fe0e81bba53f987e79eebf77374939bc9263a858556b8480548b88c5fd234f63a3c2b156cb5fda2cd8b839b4c331117cabaa1d4cac5c09dd0502a224d866616c80ff3ddee99b521e55e2d399811fa391e698eae74a5f78bcac02bf19ca628f1abba7dda3e4576e600227c633c0dff007a56c8249afa52e2225fc948cb2e92e26240ae7c45dafa22138241f0ba908", "63ac516aac53", 2, 42175151, "4248c8ab4abbf1f7a8f32795bef81bbc352ae4c582664629cb22c8b5ea4aba0b"], - ["0a97c21203650da81a413affe76971c48c5a9035748b8f0fc12a8163ed53dc2d30948750a90200000003516a65ffffffff72341663f2a58218942b88240832a61514e3d0a4eb9f90169795451975e3c5a0020000000153ffffffff8f16a9cc16e977e81819e92d6df2804771bd97218bb250928f9c5b6a90a2d8a6020000000600006a005251ffffffff01275ee3040000000001635cfa5604020000000000000000e2b51103000000002edc60bf57a1f179501de2aa352aa53cb1530fb4dca5f9489d380f0bed8557f1d43aefdde9db29fcce64eff50abb43c8fcb9c7297f653edc871c3efd7dea08f3597decd3728ac6c5394aaab9925f763a942d8ba6d47174e20bf73f60704d129c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bdf8f28df482c3aa4af6f96fd7a1df095313859d9dac0a36731485701826c7666f5ee7c11319adf11276796df30ea6c90ee0df6167f730f8c0e5e9bb0b6ba855887161f52500dada8007be5eac647a02e13cac180871b3d50325de3420fb28f7fd9a53c6c690f26bf400d69fa37d22905409bcc36c0a832bf85e8e46b18f2541030ef55bb9cd7d47a08023c6a5f93dcd1507f865f2b085fc243fd4c35d3e59ef2e032f7abdc8a15ac1e5ef88fe11ba5eca92213664665e04b58b04af352bffe8d1920b01f7b2cdfdb84cf76051bf8189b1ae568b268170cafa76ed500a142cdc6085d80016d843419a22574017e6e67d19e71e737eb7463282f3c3004768cfe7388787032259a8fac283e76f19d4dbb9e03720bd5914dbc7a526bd8208f4bf21ae5fe0b103165fb0981d89e778d6b1a6d87fe5c0c9f56fc0408d911279f789445936071e72030b698c078c2affafed28391f0b38d7a5926ac221d1b40827e808a4958fd4758f030292f569e16171f739fa646b1f54bafbdf0f0cccec0bf2d5c21fc6c802c598b602306145e20b7d9945cd213112885cf60b7c5aa71a39e396618ff53f0d43f2471da827c1d42437c5c1dac59df73479f442ddb6896028779ab8a715f816c04d2123b4366da33c515280975e1719361eb820850818e94e563d0787af5ae359f667986908adaadc96946a512abb9bff0480fbd3401f64465c08e6525a543441566768f7d5d84b9083c63ed4b551ca4c2c9c54ccfd77c96eb5babeb4f00ed46d6930fde60e86efd23133ea60940ab7516f5d6927e9b04d7d0f8a065f34cfd2df832c86afeed700aa164dec352c4185cb689b9a7de544257c5da23a2db9f6e5ea9c4636e416d1b0ef1efb51d324e8dc0dec89b01fefc30fa469c0482b026b3c102150a2b031a87038b6713b3106a5ee5f07b3248f9c44390883ecc47190196e143fcfcc14685955622fe25aee2ce7acc8389ac54ddae30c9bfef7508600cfa81c76c5b0f9565ece44d9a653b07f59bc6e76101a7b63beb48a03b5cbf97fb5dd59876bdc356420050911af6d7788bcdba99bd4d2ceb12b56a8e3676f43beaf5b6c4c49be2666ea805fae085707f085edffdf9489da85e86a3cbfe7f805ea14f95f06368de8ab08a6dc6358c825989a330026c8e236e82de36823fb3f3aba58a2a16a31870875b7c0e5e2be62b9530fb605a52f8288df4bbc62afa7bb00163fdf10764e9f891e12652813a1c1af54d3fc0cdeffc9dad2c12388a1ce64debce0752ea7b18e1e6137fe3c867239f6360146c5d6d2c295e1c74aa0cc0c9e2c596b43ba50d6d3f164a55bc30db12265330d64cb7c937f66f210ef0408be56025f7f41d7d2068a34c5a43a76dfe08d8f7b8ff24e90e70f5bf22ab646911af19deaf88704f117e8ee7dbbb138dcf40952ba191745ca4a619f84755c17d55345ccc7a6c70dada3d0daa1ddfb821b042938b3308aee9379ce4bfb4054059c000c5d95b171d6e85dde0ba048a4c2925f02acdc014c62be3d3294455668b00497961d9c3ca9e1897398045b55076730d8aab825b3485f90df4d2f6e083b6212aa9010ef9eaa09e20871c81cc06f827a3f59030f156c3d92b57d220c4233f0a9182a46442fb8990b19f2cbda39bd168dd961a1abef69d2a04775b90075b6d05bcded412b53222d72303cea0e09640db0ed187746d1b8af4c22f6299402e1a3f4971947c5abb0c8bc3c7faf0b22330d892b1129205c1adf42ea1cfd37b90730965ba4745865c7026bc8dece8ab3c8fa5a5121a6e8ae2c36f23f863cbd8d5662b0d347534821565d4707702523eb22aca15e894abc3a0691028dbfbf3895ea50927f79111fdf0a05605bab4d9db03c5247898846a0c5fb04cef6f63307ebd935319a8aaa21ddf47e5bf3424997374e432061cf15080cdc6c740ed3afbe68ab4b12cb7bfd34cb384669d883302bd9465fce76f910344bc523d13108067f2c47c04f4bcd261c88430446789963770402e49a8e0067d624f6343691b7ec784e0d4959ebb1377505fa6ec5ba35234bac7efb6814912651caaa4726ab9f9466eb9c7fa0fc61b14f758d1e7b7af96da561363d85d6084ab3f1ec480440d1656dba261b08aaa653cdb100960fae4192deb9303bf9d56f9e8e053475fc2aa880e4dcdb7944f3cee57af2b5bc6e447984484cc7b4abe2b32de596a9d4161a80a49b0145cad41da163d22a424fa554395099fbf7771d6b1a68a85d2777e83c94dbe42b46445572f6f0a154cc338badd16898fe66195661e25a091403b3e2b73207ea0000000000000000870eea04000000000a5609abd0e63282a0080ef2c2dc072ad9e2887a712301c4d4c8def858b06fc03d51b3489cdcc7c6d57d8ec640ebea5394be01f7a1179eba2eadc3f16e496650bab1fa74449421a67f1be8be57242807dd24a6b206d4a8d3475e793ff6757bc300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000219f6c952d0f70054d8ae78c9b118e0147799942281eeb5fd191bee59a8338044bf7f98773dd17b6412fc571f7d36773b98b45d91a246cbdbb5a026100b24abb5efc47af6fb3c94587cbd624b4292b5a416f03599fa4d1ee2e159e2844343a64c1b24b9c4eaa4c3fcc2451c729aedb6dd210d49bbee37ee0db7b6285ef8e8c0903231df0b65cb27be682dac6e15e0d027929917afcabaa49daa41054ad50966dd70316d1f83c250d00ed955de33fb9c05c51108e8f7a721bf81f788e5b71985852660a004e360e1633e459559b4b4706935f70454b57eacce29c9a69b3afc7c066257ea76822b5f1bb6318eca790bccd9088109ccdde2a64320f2b86579e08abd52d570221415539d30df00f626b66f5e87d9f2300e822e5c35d75acbab1caa98c1daa1c0323e550e960bbef700b76b89a2e254af755f5f46af54a7f0ce3284fd268d231c2021ea883e9c853e1387a7e46133b7666848da8a1b00e13a61b70f3008d1fddd609031688e1fbae6cd9ca84ec257635752fd113ee82654ec2d66c840915e0228fb973031c4a1bc8ff1abdf34294ffb1cf73690de2cc13fc095faf0e530fc6f854c35b651432cde22a6cbab9079b97e2e83f29e5842e5f41c1f43387a389d25b2f53c94b81ccc3a0c1a4347b9613fe0c7151b6a50a9cb3b41594c3fc2d1026b2404f090a49fe1933e950042d5b29fc40bd8fca3c2c1b00047cf59d7c7d994ee33871ac1c3ef5d090d3a1a86064c1783b0861a1923d6a658ad86f65570ad470c68e437dcb9aeb151851ea98faf4d297371b1fcb1c2ffbdb74c6b0c5dc2fa453749af8d1c6b91c51bb00440c826f07f7a4fb60362bfdcaf9a08be0bcf11f0e1f778dfa2bc4d016891799c52cdd32d05880d9308c6026b09aafb9623f7221c21cbfac0bf59a056467c03ad3b7b78d6fcb1dd2e8ed396b912a43ec243d42a6cd4ca1561bacb49f750bf1dea65d62427941283f9995cc9ca64df4b1720fa9950736ab3f553b73fddf0aedd8a877017f7eafd73f11d14b2008f3fae327374fecd596ca51a4a98c8f12f065e5521e48cc179bfefb8c5ee72caf11add3af3ffce8c6a46498fff34424ab1292d66138e39fbb720319554b0dc1129a367400cfa5bcaa4ab39d5a279b38843dbe2859e77512c34f4737fca9843c1ccf94603c13f1d4d27dccaf8c6d713fa1a2953c812b550d6ce296de6fa2ac175c0c27ea3001c87f97607dd3c47b55240cdbb82cd5c9e3e4c8de7bbca8aff98c1fb1dc8f7dca71387b89d88cf9cbc740e944a061a82f825ce0f17f91ad241b384ef6e8b6ead659c0357b67517a6f8620ea613b5cc50522a4a39ffa5e65875e6fd6f1a245182986ce1d9330efd237ccf85d751b8e158613341da2630f692a3674c7de744d75fc45bd335ba077a674996e142f1eb94c15f626a89d09cc54ebee45e14dd284d37a159291e418c56d06a554c37a3ddfaa7d425cceaf1adbbfa72ee8e97718f0d079a4123174fb3481962ed3459fd805c41faa51b50b4b97a610c3a58bcf3731c57b230862bf3ab8e1182811da296f4f97f860bb644e22058095554ea1962f9f5a78537efeac9e1d699e1f46f92f08b9afb22a7af567dc82eb18355cda18da801ba8adc3dbe63cae21d2eaabc8ab3d76ca4b8446fb4fd1ce647970aed3dc418964e5255946d371687d2b71fa50409d9da893c7422748611e93a56b6185f28c46de225adab51e554453165f8bc475f95d84599b938aea20f99893700040d5fa7448a195f7a49d12b0692bdb7198463edbd85fbb72986cb361f4f561a845f2797573bf9fc42eb87dfe22df91c0af609fa0fba472812a600a641a8268113687bd82b58ba784ae9e01422c59ceaf59b22ee46da3f0967f9f7a8c874b5679cebb9dd8d497fa675687160293f1a9056161edabb66d9605336226e1c3c4eab6e7d28084d526b0e86ee667a7897b3a996e4b60afd297688f2c506c2e6a40f1d7fba77a6b298508527d31a21ecd61e265ef7faff6463ea6635a1f05145d349433f2329d6d77111a7acbd9b79736884299f83ad594393372f39a103ac1610b8b7b4cc991c778d60473fb108b10f56d64c54453876dc889a9098b1e64f41f8962306f7a2f9f3f4c18a6cfe9d2dcb0efd8c07d3da55ee253e71962ef54cc27653613f251f8d98613530ea7c2f09680a204d774cd2b4af033f3ae334b9dab3a630619f6bf13e224c913aff214a7839ecf29f0864e35957f7a9fdc4b736d0599bb145216095e9433de19970a092bdc3adcc0555e203c42de18e81e2a9d5ef86f019fd56beafd0d8c199daccd5e3ead5be76671c09d84bcb9dc9d7e8ded210617c68b53415d44d4a7e2e3620aee17f91a71e5202ed50afe47029495299345ded480534be5d6a5cf865885fc39422795fbc4c1beb45ae8f325fc9a9568d7e3383204504c00", "", 1, 153873995, "9dc963558e8a5fb2b5bb0f35eea42eed3d228b8015b0230a9c894b5437cb2f86"], - ["921ff61e0317883ac25026972280692a2fe4ad3be07ae65509a9d1c47da3bcf520b0556f900200000000ffffffffeebc9086ff431df158dde1aa42f3eb5b3085f44ec22632cb1893376bfa6dd6cc010000000251522eca9086fea9cf2591d30e2a54c75cfa0095a807112a56cafd1b431737083ccf2ce006d7020000000952516a0000006a5251ffffffff01061ce0050000000005526565515298b3e1f002b287520200000000000000000000000054160612cd12137294b9d05ac9642dca61f5c66c1eec1283d3a032fcda95e92bcb5def1edfe211208811443d4f74f5e3ed33ec09ca985597703c76bc9e2c581060f99d11c809263776a65bb96f60e419a59469b4bcf84f79f54c3cb1adb4950e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003a9ce873ba214c722f8bd0a04b4dacf5652813a32b0086f731a2f124cb5c48faa5c9169c9f2ab8f7e9e4c58ac427c1b4ddbd3b089da7cbb79378b99442c19622d50cb42943e4fdf8e505bb67747c6780dac96bb20313da98c024a9bb45352a3eee033b6b6513833332d1787b1b156b38ea21c0ab9f5e55bd566b7f30afdab4c10202175e16cd295c25b68785d18e45b2ef62961101cb4a4c316251dc990a0144340309fc891927d708101dd0791662d515aed35f285939bf0e4ca23280b9d32d8d350a0427a44494d3e0ceb1a5bfc96ef6f7f0d5b540a6e6f53cea082adab932e17729c4e775f4930860eb9f78971bf306cd84e7f6470cabe8e08197756dc11d597a1f03099bfb7403765672c8c0e38d442c58fd5580d904686a3e70ab67502f39e53ed8031e7faceb5b3b94df97af8d01dee963c7a589e7bf7f7e5d41ecc31581b1450274022cc8ddf8e93c098c86d1bea23386103ba0cbea56b9c12e62866ab90a2acef38903129e7c03098fdbc24f6a9feab491cf0472b07d2d0c95ead393ee2c78fb7664010328091ce80b8af0ffd29250b41ae4d5c2d188aedf093603fa9149de64e51427cbbf71584b28fffada013c570ffe416eb7700daf053d12bf3690024bbad2ca3245e8bb96161fe34127b1d9a9b740af37db05a9ac94a8f7a3a9b528a9ed82e3c72a4d455feb7b695be53f2d023b60c73576db41414c27ed500066d4d1caac33f202dc2556e5f3c10ca43d6facaac04f9f5767df8126e512f839b7c13bfcb0f0a0ce200520d58ef15f374492fcb56c4411cbbe531f8fc98df3528a256c22777a3848399473110488ba972551c14e22a8ddb9d3170d1fc0b7297ba050a9775eddf829ead84b5b310e3f8edcf85e0892057604ebbd99f6b25742bcd249e4cdf62cd9ea4dc58d0fe6eb02dc9267c07bf9765c63edcacac213f4d69ea21de29c6ce0caec13d6a7f1831b4785d85360e464b03d1e5c23b9a558e74c98c666c8a2b3f2ed863359ae1291c9a0cc7e273ce79a4e2e729cb1df581f7404f82a9948e8edbad396e1929acd3ad579d30c194609b8fce8474ba0b8fe12b110e341f272d8baed1a8cf743d372907613b4787bcba4b6d864a4db5621347135af62f11b82976813592ab44a640445f1a303ff4c5ea591484568939f6aa6b9cee87818febca361a0b0965bb98b9e93755b6dee4383c3a3aa94d79e3ded1c7ac499182e7ef29b8b0866b6a686ed6d1cb125eefea7f2dfc089467fecb1d94af9d6578f9c2f9754240c76588f71d3c44790bf800068d1fb0bf07ff003698eab8fd714d5c0568a18a0f45a8e3af5f977e6a7da4b5e8c04d22bee7953331c9fe96dd42965b566e71b7b9e510fdafb45280c92345e9f8aa70421079c76f492872bfa58b499bb77c9744ffb946e6726935e77ff212a8eede49ac4834f085069b1dcebf9ba0f7525919c98781c0f721ea9bcd4fd05fd7ed0c5a6e0d7352eb8a249bd628bf297da272ef1c58797b048ae474ece215f9f297c438034a434ae9bbcaab4600cd5c64598c7bcb81f47068fcc1a273818b148be5cbadfa2b558aa820daaa5930ea320a5f102861bb0dc0ec712227623d991b930925011e0102a1da9594b3f93d5a0fd4c31c020826717c56247df8e0cb4a8dbf57a2c8ce3da589fa931405821cd353d817863a09b3a2b437c2c0bae7056e1924ac7d0ef539e4f84c9ca58e51b2ae888a480d8b574881ac74c15c9de334dc5790a58f2817652211f7b3e7eecd846083e06679902ef4111e7149d94c4be9475c818d31903a8743a01456387abc9fda80aadddbf0da6ac4ff4bdae1cde40d558395de8f3ae846932043394ec2db4720b7789e14d51806f20fd3fba33061f1de5da777db00c1f6bbfbbb9b66a294e91419ac6fc6d189581c080315e812958c8df7935a801d3734471a45f228469c03c2a5f9f93ae3dc6208c22274c714cced4db65992b70ffbe9f99a66ba303eb32bc36e28e413ad40e971d732e84d85246deabcf025c7d0352035c6ceb7e6ee42796e10b8b03b5c51940470842440e67a5451b3624402f4579df7ea27842d23ca3b44fa1cce112e47bd07001f68e66a4f49a6797c1f363045448ac64a218f922817fb743a9d556f43b365677761570246d8e6bed9f3427fdfc1fc387853bbedbb845f6e1d312960a7aedb1b7b65b3cf1202ad42987572c1eef5b6d3133fa7331d831f5c3de5ac253cb5f405871905fc7d9d6e787db8cdfe37d1037924fceb1fd5eef2944a069967ffb120114d8fc5f81d893cdfbadf9bc327b27a7ad2c270000000000000000792e3a02000000003bdef696c43011eb00db5c7362819c1e4eee535b9d863ea3e8e3cea0a97c1480d25265192a1122f6af07e430aa3874d6dbd0c20fd1706b8c3a4ee0fab7d84f0f852eeaccb070cb51db8be3cd003dae60664758e8a94bd2a8526dfddb39a70c780000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034a1461e511945e4933a7cceb8079971ad7b71d6c26c90c79ec688a320bd3802285209520450c39d944c77ca31500cc5fc4ccefa0a0b33e4a7a81b1998347c3b54a931e565f2733d4c6951dcf9993a7af42aed04c37a327cb72fc8b488b40ed8e3c5e4ec9b4ee258763bf5a452887541aa1a9ada62bd513233b2d8fe5ca9e01e0229727fe166b657c11ed4fc6fbfc4996704e6d92dfde94bb90e4fee447a645142021947d30a5ed749aec1d3134f482ca9ddda1adbef8165e5f65aaebb4e9df257bd0a075593c7f0075e4612f6bb38c1a5e579ab7651700c9ff5f5ff8a981e95d0e01ec5855b80eb0f9d514a8705c6aed4264ee980ffebb80b10e1e9db677f709e792002262dbd6c8b7ce2282781fffd55f6a20308dfc036c765ef64a17ae7a670c27da902062603093ba3d9fbfebda4ac57e668ac10a7b3e3a9732c89e6c65aaa77ce4a29021ab55ed50e01e97d90c6481d18dff5b8e7d2a4a1a6305aa8b58fc2848ef860060209cf60c1fbcc786cd32dfb582bac4dade03298a765884fbd2a5fac1dacfe4418020028bb6010b0e0cb0b9352e68c7f5f9a846ec6064c100b24c36d6ddea71f6d918a8fd15e0443752baf5e8cb3c23157439fb2655f0e634c043705297ce3f81e3b1c3d72234b8b1babee1bc522e795d4c394ddbb488919d5fb6abc7910a3136eda9b10a553708ffd6939472a81c0fe18d1326c47f785d0f5667fb794debd47eac2e7a9bafe448cc282076b8fd860432ed288c53171e7782242aa1d0713184e102a31876240a303a59c80d13e82283f94dbc2052aab6a329ef452615ceb72c7f0d4d7740d1aa425159d00e8befe860ba46f0a919a5d5da7366008f1a698b35fd519124955148e1c811d9847fc394bb78985605c406c52e6412d84dcccd86730c0198b5d2f8d155e81d5da0d3adce872d61cd0dd6b0c5aaec29d97e92a63439df2bd67ac652cc49539bf85dcabdc4cbe3c6687d84947cf3c8a241157f1c7a848f390e7f4acc0b093b0e18f03abc376eb0b8bd1122aad65c752730f49c295b48940091c08b29bf6c695a181101d245d7ae71e6791455fe41fbeb5cf0f42de8711b0fd086debe9dbaead1a345998199511e0401a68995d8cc1e4f3fd5f5c86134a6ecf1e651e0dce684ecb3085dba41c13f147cbeea6fe5fc0f921f83906fd0b4c1b27aaa475f747fec54986393997ea685276529995aaee444feb90b4a59bdaac32fbb84ce1a5bb6265e8023913a357b01c8966ed9e0ddd87f3fb0b4c3e5ac3d1063de5e019e7d6b5e08833b618f58d6fbf484cdc3fc7f90091e379ec7881c78a97e8d7cb5037c97b4000d3993140b0d44b4aa50aed559477b66c60eac298cb16dba5ba61f05eabc110e822f9ab9b13405d4a816c0ce3fa8ddfe560645f113398e72bc2f085cf5fe3391e121e6115895dfd20aababdbab9f7a133ae33e711fb5f46494860d72224c7fd06e0c8002965bee1e2f594072eef6897db110d87e56895399271a97a567562f06a0d124b1ddbbd1b21175fa6ee5f81b573063332ea487816bd25a88a13634a93aa4cd69df154fb80011ca85a1d0ea8db248b7cd4a7f0670c89c1cfdf1cb37e6f8e6fbb88f4817e5c1dc86882c931c44be897acd1b0bc690555381b9a7c785a7286941d3957dbb528ff970330db2954f84b84d5da8482b753ad672c8591dc36341823f656013a97ef72329a48390ead6620d4a76c7f3c2b9ea44d08f1e392f72a696c776053b75f6c21ad73047e4be1eca3b9112040d011ba4adce35c5612e388befef785b5ef82c8c4269ff80d1f5f1fe8e313dc2b53a7a73d03751a5b5db7d0aed8f7adce1428c040197a3584c79ad4413597e751da4305cb9e802ae4dfc50d9a4bf52c925ca5a58ad24435c7d64c46f59ac3e6fc1c9c6ee43684bb3dc30ebb77f154bc48162e4088781d19e377950748be8cf84fa65547ed6004274ff7fedd749f37a8c27e62e7922a0e322eec5197570999a4c3de384740b2e0f3360d945be2970c882b8d4b097053e9ca4b9bcc50193e62d68cbe3f31a049d66f9d0650d1fdeaf44ec56d16e8cd7c771addea87a4368062a7e139a4611b226003d120795758f496969a29a2e90c963c904a739fed6626da4d7af00088b6dcc1adbfedeb4b7b425888d285c40fa5f5533fc9a0746c84b7bdacbb5bc36ea3d47eb1b8decfacef642f423a2223f9c46d7a06377b444513072be6eb8bc852267c65d3990cca0fa2acf402f489e6f0ecb6bb64878fb4e7133c094aee7c69eac20400112e38365d651bb52c0d0788a7126e9580e8ef3eb4095319beea253d712f274aabe14c3f4bc267fd9c651911eded2a5ab1652679b6393ab4fd77313a50c4eea1c4201da15940f7be5432fead3847a49a0bf2ed2a7ae5c7490c802805255b0ce9c3eab4e3cb365162d58ea20ffaf7760e", "ac635263526a00ac", 0, -830375959, "003118766e6a6b68992379bca4b46f0f8ce4243c2d1ea7e21856c0c223d998fa"], - ["030000807082c403033f608084191c68fd16396b6343e2687b51b7e91b201b6150d0d81b2fc26a62650200000009516a52ac65ac630063ffffffffb4b58b17a6ea7db0b17806eb6eded5cdfd5470974ddb45bdb34585ae0cb3722c01000000050063525353fffffffffa37d3491d91ddbb3d48e8b42ed524d164b01361874580cef62ea4102ca02b60010000000200520dece52603a60d32050000000002ac6ab921b0050000000008ac636352510053630be29e02000000000851655163515100ac00000000be9e134f020000000000000000c66d670300000000570ddf7b1e5dd920a90b99554bae7e8a5d3a7f770a1e7904e5ccc1951ecab697d690c2df17347d068c56f5d56ad88d4b149e5cf549a711a763b6c424e42850c7c64e25a5b8ace477fdc8f3afe31d9b0ec4ff54e759e2bfacd83cfb20dae1c6d60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072ae710da3e4bf4d904725e26e8faf2c54a716d5fcde94a547b60c7d278f7fa4bb1d647fb1eafdba705ac3bfcdd909869ea20f1e90eab670c5a0fc379f2761be2ba62279213916bc28368b32f94b53aef485e954f202310f5f3028bc678b03c0e942da72bdb12e520fa5f4caf9708b4d7a43e34ef2038a5c981445d31feb0559032cef24c7e5bd531d49c05b77a1e72e2b7a1137ff0256244f6c35c29916c3ec11021be17d96922eed57c0abf2ff22bd7c7eb98093487d65f60b5946b90ee91bd12c0b01eb66f10f973c5c16625c8c74e66199ea1cb042679961f09df2ddb718faefa0cd437b97faa90adb13524271bffd60597e75f825ac1ac74e03e4a72549d3d91402144dfd77720b28b954fed38e8ed94f5c62ae191699dc91496f178207d1f24868030ad83ad03341c629b643a95f1ea46f007be06a108737e4a387215b12175c3e34032b6c6607eada77ab0114d68100ca57243f7d65da79a24a0b7f45cf39814e46160211ebcf43f50ef90e2d0fbf720f7fa4dc10c52365109eb92ca7aeae4578a2b76c022192a04338470013e62d4c957c84400392c9f563a97f3b3948326fa7912846be39592780135f218cc49c9274476cc22c05dca84387ea1deb8466b6494730b0286c119513926150fa4834c37a3d7bd989d6866213cb4f3000177b04a712b06a33dfc7d0e4c11ff80987569fe30df48596140b54829971749fb9187b2473507fb23a138cdeb2e0e8d99cc2b9974b08ed5e3de6206fbefd8b9793179415a016a2db29ff2bcfb27a007bb2f2c045b92e283cef46426494182bd9d0563b08f6357e2b1e136e52de890e31e8900cbabbd9ae6786d51f91dc1e2f68204e54a09b366ed5476b9855bd9554ddbc22917f6c06a73cc9bcafd39b510212487fe8e4fb031c97ce0284458f70a853e66f278e7b0f57e37a5febf016ad1359729456da4e9db3852a52cd0e7084af820155eb4fc15f631f9c4b33253b43ef150ac456a403a1665dd67c1da3420106a1fc4eb87208d7e0296d914226b0e279838eccad63adb2d237e3583ad6f60ae98b53ae43bb2d70e93128caebcc80948805785d921118e3c940b5f94ffaf7f91588c967895e9e886136681c4348969829809c2a85003e5c10180bdd9053e8d4bc4fd35dac216d2c1f28e01202536b6495977769edb5d628c56c4e01e486e8d7312632559ee0dd2282f5dd284859d1b295e893d209ff4b28d524f5d3688d86daf649121eecf235c696870a6b23ff898a5234be5a1b30ee67ac40faa1f4bee37f5f81e67b4f686cc1369dba1b724b511c945ee6d993f4c6857b7d926e07084dbc67ca93fcf4a09e0350239445fc423def7535c9709dcc06c38a1f633b062bac38ca403f51695ae28e52c995fef98cdf7fc8f2da3de0996cd3d1a8ec687f11541a67c70459703580d4b78d3c2377a1d57fbb67f09ac75a522d4bcab3c6b1a2a5c135d4e08a82f1d6fbb4f79f805b33ad4ec07faded243c09e28d675446d1021e84852e8a3431293574dbb3241643105a9428b49a06e7a4f230c27ee4d67de1241f80df940305d50b85717f2d8e18ca17a0f55dc314eb8b5f075fd10c8b66d67239f78784d7c0fe8c2cc90d4ac8df1255fda418ca9c50fa1f265dc945bbdc8a55f800aa6b271296485fe5364f59037735308b8c967eaffbcc09630c69999efd6e82d0e3eb7e70c4705bf13b7683651c995760dca8dd1cf933aec0a4cb811c8d946796f30f094f34659f5b4bf3a3f848c7ec80fa6d31b426d0f3026a35ae894dccc090fac88393c75b084edee5516b67776fe2f81b7a50ededefe14f5072371c86275b7d84603cacc1648bd48465a76e8949ec1de3ce3af4bf455f9d3cacd6bc2b610696561a3e74588139472df2793a1933a5a8e70d98fa43f1a91c5539962163828a5119086d9c11647bc7ddb1697edc57ff31b8c7a4ad9c9940a59cd6db412bdf1e6a809c7e84e8b7a68a2183feb0709826c64f191aabe945c3bc5cb18bc306a355858f13063305393112a8f3103b9282a98fce3a7276dfe9ffe960044175415c5071e8e0cca281f8647436886e14b9a388124646ada5390c9e362457e5f740733f7b9700388fc0951fce13bc5000a6a3620ca917a1d776b2f7fdd28da27d96d8c22a042463317c108cacf043b4c48ebdb17fdf947a65ca950e079c823298d19614c4955489ed6cf75a583df539f20c957a9479d8dfd630c1c54afbce7bccd70321b84d260918f68e4157663c4780fc07c52ace580a72f7feb17ea7dc633d7b3852f9241ee9a63bbd5791896b000000000000000090abcb0400000000bfd8a8e05eb5387481530c0ee1eea1bc5747c3d603e9589737367ac6a3aa258185eadfe436c115ad17fd96609d8d8fa5788818d4c50b955fbf2ca40ea2b4082d787e1058878b7bb69969c052675390b9e7efa4076dd473cb158d11da1295d8d700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ec99d6c14ef32705feae28df5ed5317ff82bfc23a5512e7bdf9566aafe63dc804bc6c4cb9cc0038d232830c91e6eb992a92d4adfeeecb9beb02e701d1fef158934fb16cde252aaf868e4e0fbb6ce2a53c419a0aaf0333881d6a5935bb766052d4c9ede393104d9100b6bc922dc76a8086fcec69ad4a2193ee458098d4a3947260314ced99341ff52bfcec8590145f4a519893b2c9fec0d5a179e7bbbce5a414e5f022c7e3bba4ead9a0d7e4d006bfec46fe100472e5b1d43fb61d70cad5d3540df810b00a7497342cff29d09e8d4f81669870e5bab0dc4d0e228f10f6383708b12f9e0149cce74f37d8a6a4207bb7ee40b483b513c7c7fd91fc5ad24e55d8478c1180102283ed4bdc38a2644e1e54761f9413a9d1ae0d1e8686269b430064a0f94fd35ba0323feec9544bfb2350a569c6e28b3dc0ff9ac4d0f3bbfa64f1a88fc895a147f6f020a8cda2a757825db8051ada2dc1e9719591b5719aad063ac693cfaa76d9969b30312ee4082d0133ed2bbe880d8d14ae080cd2799046066beefeafe1594b6d13d6b031796f1cdfd0cb0d0484a12d31dd09658e93af6325803b3dff90cd48bd600b406ed81428c3267be1874e2b050a7604f44f903dcb92e805e7561b6844d4f49d925de86a5d9d1fab16181a9b3f7ed3a0d736f023c397be2b699ddb0892ab044892aa0ac53b1a6b86379d216c16b91360b3dd8f91f8701e85c1010fc42e80e9e87e4d3e3bff626c1f65b725b233963342ad2186ab9948c09010884a55cc228dc85da85743560bdece05fa310b3245b3bc7ccb8a399e6ed54e064023030af8871d7a128970b39128b46defe96bb9048a3909d712fb6a2afbd86f87d91eb20088a250bc14f0c7d804494b39d67acccd57854616a70270852d56d7e7e5928429004d2b0f01a82e5834b9f76ee8bc54f9354cd52238fdfc1ff6a57539434259762dbe0f2b54b127d7ddc894bc4e02d580e7f1f1858da68ba8f37560b82df570c5a3fdf9544b01241c4e4437017fb6cc7df9a23698cd85d1c69eb7b2eca06ce1ffef86070c8d7ed744ed4315ea05d2e8ea4538131534003ade974315a4cc52906482bd3be7d350b51de566489fd121aa6ea002d2b8242b8752e7ff30ab94be86fbd4b65617a6e45ec0cd7c823e774992e9aba51ad28e631ca789b2d15275aea346e0ee15e537110a1a620bbf39bfe0684cdaf4c90035cab45240727907031502a80f2bb921b125d39be71e3a15a72b0b6c24d7b57c1c28605ddb8434d2184e462f6e9c754d9a187fc764a6ba90ddfc07b9003c3e03aa5f9c613fd882e3cd076c1657f028d7c1fd0c021c8aebc7bad104c20edf6f71a2b5e2da57bdfece15ed0a435cf522b997008c6d11c5018fdd93777432ed541740a1a1c2b759dcf20da05e4323bdf0331aee38a2b1d59e1fc8841b92cb4d9bfa902450c9d9952981900d6cb8472004aa389f0d71eb8d5f662ac81577cc45141fb7fb07c2b6a73e5182279926f2220fba3cac71a83afcf87972f93384ec95b51440c2423c37247fad1a6a1215f065f59fcfc8d8afde8b7628fa78cc23c4a41fd8ac5a90208b5c3a2594e0196c5dcbf7479a60a34b262486d11ded36d2a5e3abe18ced0021fe6a47f4e561eda864de5103895bce614083b39ed52c99eb6fb9c176c066331b185a315922c706ca01683a9e677d3100d52f1b6c0532c2d752a3f9e5006e226d660873266ca2d1dc2c649c4209e6cd1c427885c86f639f8a17fa589288c97130c09f9e39b02494c18b9960e534ad6e7bca8eba9e9db3451f8a5cfbf1cc787d903e29bc55275c71d393498508a31a1ab643d6427935bb56784e9dfdee20c45c404d8e86f626cdefff6bbdbcf4f5b306ac72880784a8af5dc2b592cfa5caac3938346d25314858f4c6244616f27f55868852a19d99a5444aa182227201e87e312c185f46802aa9b9712ef39e27938fca7cd2408f90953389e0725b0daab66eccea384c53eb9fba6ba7b98d69eb08b15b69acca973fc50dcec0a6902e139e576790547ef3ec35c41739b0326a660f66f48787a50fb855bbfaa620250d568b9e16172b64d911026792726de86b9fc3acd537b026543cdaeb5656e406c5a36a668f68653514ac849b1ec86d572fb7fab3fa81aa6a17966665ea145560201b7a0b3882e320022acec3f17001e152e0a72f2762de755555b4ce84625d3b12a41fe70e309894acea95153f2a53910d915a2d4aa2d265f3b82b453954aaa4c666c2ccd56bed6a1554201bf702d7a00a41682170c5c924fd818c31d7e0ce361c7c5bd050f800a59c69188a2d940467e2dae3af0433c91675aa2ef467ba6faf8a98de32ff3b73d80fe9f024cfb18b78566dcbb7e6b954ced12059b9a45cdb92d34d4806b6f736f19b0da35305155361e52f6b11f5c7c56d783741005e8c9e82e79d007", "65", 1, 65387835, "c03bd4eaf1f64cdba295fd319424d090f7bfcb2bd70994e79c92f057754517d9"], - ["030000807082c403030e17798f5794ed17ac8893628133ab0e9206ef596c68abea1496a0f1257720b80200000003636563ffffffff68ced25e9065264030ea9c90281c5500fc5f9907abe8fb36e744fcb2913f952f020000000163ffffffff51f1aa006dd38f56dc0188ecae07041f7e83afc085d142083ad77e0aa72cbf83020000000251655234bb890226d709010000000003636500af4e220500000000085100005152526a63f9b5d6efec99ab7002dc358d0200000000000000000000000004000185288791b353c9d5ccc979f9ccc65307eb91a7938bc96d7bc865590157e99c6604551be2ba91db80586dcfd7a3880aa45afa0fd5214521a3a5f07745156c5eb61e094725e24b5268c5405c9ec71aa076d1d44006147e5183255f71adcf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008af441fe25a416cae266325801ff4271ff1094bb838ae6ab7e743fc5ae58fd60d82acb7eab1e3b59e5e6df8b69d2afe9c0cd6eb20fe09c1294dd24e6e06007a35b4c7a9f6a3a93e321a93695e6725a6f3a009093b2f279d0b7a9fb978b9f0e7ab9d2f2138be974d6200f16d592a9e6f2e542c85868a1df486cd9305fe46b3554032aa2bff4007281bb2932ce0c13f15bd6b9ec7f807ab6cafe2f905867fb21efa6022ed0e618b0c9adf40d539fe82ecbb648d61da388ad41116febb8181d485892370a08e554c08f44593c5a79d54b36f9d6ff5ee2901816162ba7ed9f84b24f3c6d574cdf5f850876cfc789ef595b700d52e10270393d2878b716e92686fc30c6319b0316edbecfd137a365a185f2333436478f0069fa6bdb27fca9290b2488580cd3560215608ffc2cf6475e7d84410e5c20ad7123019223d028e94cced6090e4f19c68802016b25a4be38162c5b13283ca6532ef02eac9575cccfbe8de093cce2c9f73aad031ff4e850e99b53626e1306ff3dc8f928c8676d3dbd4844e2b546a72a7e1bad90032166b72b692c02e07e58549b64d1a779fa8d464237856a3c1dec7a76952fcc5d6792ada74c32e13cff3684844a5d429509a86d21b8f390196849e1df6c8cc9d83ac983042f77f95f8d8ac72e54d2888a4327cefa6380ad8ccfd66ec5f09c9dc03520ece971de674ed29097182594bafd5eb1c43323492b15d74e41b975c315ef25307cc64f75a18f35f02ae163a7120ab635515975837ca7297404242b332e2429bb9fefd3b87e724ec27242cec8e92ac2e288b1a0f01788d701c61eb30b71536cb1897ca54d3c98ae01ebfd4419ec7646e80cd243c3a4615afb682e514941cb46d6996f3fd8daca3aad28202523c012388e04b477af1bd4da781b2286b524b1da4fa8e549cb3c6ed4b91125d5fcad22834e495ba5c8ce8d96f688968f3b5d0067434dae0ebcf179af75c89846afa5c237793be39c649bf02ed5b8ab820b535e15b7e54b3c576129a5a065ed71c5f6d434ce4eedfec7043e2609f0a308f05dd6d02ce012af1679d6e1ad8c50855f0c355364242e036ac551d2782d16c7bdba3e478e8bb67dc8fb70b21cd4029a8df1b70777384d8df61fdc3ae15d9770773d0d10184fd316ea8adc6c6325230896cbffae46e5fe7c78b0b1926e5bc779833b3a170515a6119c7fba0ce384aa6ce6345ead7c60c9f241d7aa51c70f625ec9c5395a9212f8e4765865b72b00479e90bebce4c2145c59fe0156926bf211952026c1bdf24b671ef595112c360e44d896433c82b911a5d898f689c61784ca4af552c4f1bb01c765a1355f058da455b9aaba63876f01627ece299be407a03c34f80ab7f7db554e8de69c1d8af3c93b8a02f53881d1a6e94f92f84dfdb58b0ba0008e16e50f4b360d53e7a1f1bf508f3af6a4b8a7694b8b3e94834e7d8e0b8641aaf9a511f8b5cf461c624ed2422fc86355b91986ddbfd23e50ba020e059143edfea63bee8add8e242ce7f191e338fb880f0d76d20ecf31fe9ddb2b692cf09d1953a2acb305a4dacc07f743874f41be1a0044fdb58955f384e1c0e8f7bf99bad8e1792175c77c8ec09868d5c7e97f31fa50be3d0630c343118b3a70a6608d6af4536ec13650668ea861e02bd0741dda698fdfd8232e4f15da3581ac75bd7cc6f389e2059a535f66a8a98218a0122f9d687d649aac9bac76148b744a7dd64c5d81327b0bd65d874b44866e770823b64cb1465e7500a5ff5479649beafe02bdff57692bd83c7db4389f83b74da6968e7e4de532f0b306fc23e001fe37b93a9050e2c9b7286f76afd707d59d352732665a6d3f01b271e0ad16bd473211ef03136c640bb207e01a212d4b6e2ecd726b57eb327458b462a02f8b2098c9f00a6b0a600a67ec0b77d828bbd2cba1d6288d34f9e494497863228f12e11fbabd68ee8fd002c397f87d90a43d771e926265daf472345d062e749921a7679481a45f90e463bc79b604e67fa799207e6267aab4d3c4bddd573b359ce0c38a0a7dde9aa3993bd782cebe00e4bff7c0dfa053754be83c5eaf0b68c30a18eca0639963b335f5fe0982d97acbdf1e1e262bf30c75b717822ddb5118453c008702243b8e50e29f379eeb6b471494493d3d23ecc5b5500e3d6871ac12695a8732f0a5f0649fe2b86076c15f30105fe97f8a722019e8dd4cb8858036d4c3c6cbd3835ac3ba279db6920f697c30163212de4a826e11793a825f4802abd747faf9ed2ce4dde31c9d0b2edd5ecc1ec282be3ff3c8d5346997ed678f781bac59772ba67501000000000000000000000000fa8c71da785ffada537112ed5a0810c79a7bf775712ad44e1b759cc3f4acc5bbedb9878c4397a0d8f3b5cd00c4693369f1ae8cb1c948a9bfee37266196243fab87a62b1a336f054f67553fee6fe75fda906595d5d01d4e0563b4f24ae98091b70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082705d018976367cafd10fd153a8bcdc105e807e14e1a50ce31d61a8d6bde17b4a088e993a735215e7579684e655391fa72276b055d5668a35728b0069630e256dbe76d8ebba2e429cf0b6ec54ff4b1b63a5602b4c00271c0fa170c0137d6aeea75a09379be107dc8eb31f07434c3ccbd4da58e117612b15ff98cd766cab00bc0209ed273ebe3693f66ab989b113604044f85adc4c6db18f61e491cdfd826f5296031eaf27252775a3de2c21ec71834647ace33c195bff2fde268298d6bdbef34a400b075bd89e22e2341e54a62cc5e6df6ae2373dc39e68e956e7ff57d4565ed64fcf20daefad646e8700dc362e25413552bf2756134eaced1cbe76c6e9f0bbf7e3f2021e3ca866353de02b6d6f8785875bacf6278bfd85c9a779fbc7dd6e949fc3513c020608d24aeed9d69cd71a3824fee8afb2b215da0579d8cd04a7fdafd586de3eba032d7f47bddaa7eca9f1a35ea4da188ce0321fab821e953d25ab4e91f3898e0dbc031e54beb63d05079519fb555ee7ae78eef93068d01f73bbb022fe3e4e4db2ebcc02289783c3cc1bb7ea240a330bd8bcd090944da42168bff3d1dea496ca5e90a6a563ce9b94b033fb6d853dea7baf265797202e4eaa3c2db575942c5deed06909b25b07d3318a3d542a9951890cb7f7babdb75f81d7d2e92572f95481d39fb86b0e3494c34f66dc986fc06bde18ef35de948445ed455875418d29aabb2320dc85c58c8c169907e797b7ace3a2ca2c3ed53d67ceea97e925058901cc2fe02167ad328bf6616e8c4a7e854a42f80477e14681d5e91883eacdca9914164eaaacf624beddf4cbba9df162e12d47faeb4693b01c2d26495ff5d5891da3edae5210c63c27ad546b32ef8c086718682c8c1812345b604bff90f39a2bd3b31eb99c9bd56acbbebc9fb66f509130efbd9b1849401c7ee1312d5e165ef08f8f8e30e1c0e31221c81ac530ded87df3a894a4026fa178efa3316b22dfe1b263b4a62e769ad8f24378801ac4687b06ec000f5c07feb6428791744e3c5eac3b88bc82bd59195ff26d2d6a028ced3c80ff9b1fa25edeabe1ecb9763e4f0e07626faa43b84b5be96c7fdf51b5b1c88b62d4b4b8693bf04e8f9700df129408983c429dac9b51b1e630be42de54ead7e37637c1b79f753654151105507d208f671339fc395157d97a842bb55d5af77934494d1a880602921d71b0547177e7b76a7521976a779db1a1b10f43926b4c72f23656c4d7a22f63860bbcee3a55534d661b8f172d9a0b150d5376d873e205f1700cea759c5284766f3513b7bc326d9aec8476b36fc68d05d46ae26c351b7c3c0b06e0d4b759a4cd4e1a9fac585851e3ecfdc5f310e39e7ca280aa4efa735bccc6059c6ca7e296d6ab7ecb2fdfdd0a886f567931fd6bce7323862aec8eb1958765bddc5054291d011929a430e220a6cc5d9f8822ff972ade049b739cec2390553f1e5f45d4a7e57dcc5520d99f73df416b3a4b5a586f43c5f00b0b1919017402aa6984558986275010633631dfe5098bde15d61b91906e8b8fdbb15a2d996ca294d9367e337261c65f3d8bd463342d05cc33b41e881dca6645d40941647e924a9d9e309a6447e49979110536c42dfd466f4db78f824d5f2d60a7124f0c1c0c724d74fd57f5cf278e5743ffa8a394b7655d670181ea980a07346aa7dbb59d12d2a1fb153bea07a4abcad530ac32dfdd32f97997c265fc55d184a499abed6be5a1fdd88d406a56bf6b973bcff9c72771f3216c99628a843cdc5a5d037f20cd8d9771a7aa9189d74ad3260bb2739c85f9eddb1dba5ad763408fd6b0858281352e240e0eb944be0ce6f8dbf295185f4e487024ea6623cbd1c9d3d7c0083ef82c0a2cc5c3cce09b2e4b4feb9d3af1fa355e8b3cbc23131c9de6f1ffacbab83d1ada16b108b6321e4b348854ec78d4045088e3a79d5906a8309262a112a59221d44270099469090677754de289f4e378e1012871fb746db8ec4d9a7b837bf1ce7289d609573923755c6e9770155e2f16adc8f6977c405120819e5428d2f7c1641f419b78baae39d1f83bb22b29e98856fd1f1cf355651cb436451b2dcd8496e467caee0211cc733aea0b5ba9f84e3af78cf6240fda7e97dcc7a1f0ee2789210ba65ed713377ee49caa3a2fd380eb7aaa1d4cb672d0efc504fd821d73727292bc157dc251c2e8651833b093fc626a307762956c42fd6d0957633c6b6c2de1653b20e73b93b09393903396c32b0479fe56a3b77e392f8a39dca03b969b1fbea7fd0c4177e0497d38c596079d7de318c625e7ed7ffa2bd4af9f9fcc7b31ed694e84f8bf08792098a550fc1e2e0be9389faeef511954942365b392d9524406de8cc1b8b16e363b193a5c58c208147bd865dc2f6f66fa6b3aa1cd100e0a3acd83a3f8425b30ef303b552c96b82ca27db6ff04", "65536563", 2, -1219933221, "d23885924cee2137176a8dc9dcedb41e7bedb1831e401ec4e6dae1c3e02b0fa2"], - ["0ecb863e04500ce1feef5c2f90aad13a6d556931d9c0ca768fb78af95f48ba5cc505dc948501000000026a63b63fa82c75496237f833eccdcbbbd8dfb919340a3e21a8d38b73a4720b27ba19d16087430300000003656365ffffffffb80b57c69b3e48d9fa17eabcd3ba0a0b92c8df9f0c2d632a730c973ccf722a6e010000000853acac00ac00656affffffff4a85c3559ffd68d7c58ea264b89604250a3cc80c3d072abde9f2f8dd651bc19e00000000056a65ac6aacd3e86a3104512b0004000000000900ac6a006a635365650b60000400000000026565e2c026040000000001518627040000000000005091b31a02ae1b2505000000000000000000000000156bd6ad05a3abdd6699a03a61d80c46e749e6131e7c3c962ae54e0163e8bb2f948f57b75e7effba19d7dc57742038c9d38a2c9457909e7c2c0142b8431b0aa30ead64daa0fc66da592e7f25f74ae8becc7c737fb6e9ecd0538f6cddf23bbe350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045003565ed57a1179327188bd8c523a22815f8be24477c44ea72f91280f56222834937d2fcb85c80ae8f0a5fe8d07b27183e5ef1a3e52da3149f41430cb39a959736b1679668ed5a9343e881efc200ed494067dbdf84db7ac89c130a4a2604daf1312fec89496cb40c275b5f05650b9b77127f291478b5b979da8b97ad40d2470306f25b4890d37a1fc11de5e3f48a006c34209dfbfa87344f8068697563917eb8032e13a747572f6b6ef540cfb8b69f1b5fc12afd8c70f07b56602422dced9348ea0b0034460898b28b94e10e9f7529f58e4a3b773a305d826a20b11f667d535c910b14cda0f2603104068e6b5a6eec2d136bb3cc4c179a45e02c1c5329ba0e4f594c0217b2960033b341264fb32e7955e19977de751726a56d1f6789a7b448deabe2ff02137d18b72d578bb99dc64fce44afecad3e81c23f04de240976ca28191fe1f2ee0310b34d6a89232301694a3a0ff8dda9d85e4adbdf2a927534e469ced9c68e450c0314dad989b8b16cf9bf94a74b619e755d74e4751bfca6a213026d587fa665ca8e0222db03ab6392cafe33b3ea18ff57ed0ab5ab8d40c7b7b7f11fb074af41cca0253d986547114dbe5ecf9c1f04df44e13ff930b59ad2e102a0f81be3c182dcbae6a3e8c3aa1d40cddec53d7d5c1269bdaf5e77b4eb94c2b66bef821c0a8c0c12cc614e1a99a8497d61915bee2f351195564f4ea8f4670c9f120b28cbc4a94f4f717c0ff1324f71516090b35e8afc1bdc6b9d4503b431edf36638bc8c9f66412e61333a2adb2e18557d8da8966ba010942dd65ec82f787c2219187e8b87c823e6cc8b1802820a73fd318e913fb18911a28929611463cc045c64dd1a85b8efa3333090d9c578f256329851fee77436368ac451153683caee67e85deed91340ff1d5aede11eb75b89587a1a196898490d7afa2b38d725360bb1a1bea7fedee3eab2cea42f05fc92f5dd800dee44a0f81a53ab46c20d9ad6fc7ccccdea24f7c56a70bb258b4716a044ef2ba2af97b919315a56d3e3caca783980a7f103e73bc78fed92a4a56cbc3660e8aa0f171d47ea137cff1c1f0567f12bc757e689af07bbedf1396561c9d43b6965404b7eb3b9b0cb7769145c5025c5fb7b26900d42496762b60df931e9955b04e86c03f663a81884d23bcc03b41ec54b84c91676b1e793566d374ed22927f939309dead6a73d10a17780f1d64fbbb312aacfb95a2b1f97d4a0496a3da4b683a3d29be897c80e5479143a8724a13dc6d361eadfa0e5205e3631941068d5c76e0ba3b870d5f9d884642144b8446fd4856859e5119845f2451dfae5d85ae8cd16a820cf81be9c7ee58d18dc6f1cc3ae2b87b502c22ba69048597bc80bafdcdef610e3f4c461d2140c3434f51a00050a7f3a2609382bd7ab5cb9f572e832c8137b381c82356b20d13e837fca99cca053937c171bae9c7e03fe3df63df5c6ac4d8faf6c57eed8b2f8245f69491e6a7669c2178d5f64e5baed73529c4e3542194bfe64e3b11a2c7a39f10c49b6effcf184f635fe931210836222e7310dc7feb6c6b484a47884ef53cb4ba7a45a5a09b63bfd4c43b94025f92b0b20369fa1274502e2012d3909e15ba7da37bba9830c494a246c618d32ef8f49055c6df5c0556f1cf95fa7ce43888d203f3ccd40d7241c5e84f0a3da79ee5dc8c2c8d4cbfb0b68720340eae25334d947952f9653efcb6b2d962853eb33703f8890a8526953b142be98049d37d08b6ee38b0c897787f9f990c16196af3add61e03a1db2e4f898e278a328b399eba2c036dd0aed1e3188b00779e5f7c19aa34873cd4367a000c167f340026ba4da7e8b582e648789506fb3f1c66dfe56b10b8182b72ad8cb6a777c88ee9c45c46ef4dffdaf3b109620534bd5915297f5634023912f4b45fa2bfd84b8c80ead3afd3555e169a9d40cb73f2329ae839867b7c8640a6dbec83c15393f20bfd386e689c41e39ec70446bffe26497b0bd752dcdd5838c58dd2a6721c3c302df9796ebfe6030438f214eb08c3c2a4d053eb6b842d96d063aec7cff188238293cd42165dc6bb952d3f5496c4bb37458b5b0512bd75df8b3395f1e1539dd7054071beb5b601b200972922648f29292e309a36133ee58d37e2ff7b263bdbfb7f06c5492d76dce47b77fc83a70420b84e5a8aad0c620aa464f0061e6c6497e7c0e69f7773ec20f77694b7e24ed160e975a8f97306065472ccffdd6bbf071e08ee6359f1ca62e5379065c6e89707a07774e29ebd0d2c632ee875b1a5901efe41257915b0579280a3cdb94c8e56a0fb80000000000000000f935ac0400000000dac3ba6e889c3a310e607fe3b9ac368e72d3be597145db37c7d3f398337b190a29c6c255527fbd82ca758b3aebb2a698656da510cae9d5be23b373a2f9fe870f4e74de92a464e0a3165ae7a3c828a6cc14a7141fd6c93b64cf6580e37461e740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009efe5467364a86ed3cbf1d960f9d4c563f493e7513bb81fb2c4b267182884391438213fc42686cb6d1d9033293db1aeb70c80f548613401d7a1c8a4814d550840d7f4c010230acd40626bfba201d67b0ea62359eae0fae28f2d044154e5abc7b50248cf0192113f7f1c3bbb9c2b257b2c331f8aab5c959c7e4a430dfdfa8d84b02180c21999f7f23f010e0ba4ecbba4938c1ce9ac8f53cfdc75b7a6cb669bd2f89022ee46eb002dde0702fc76e39663836421a9b5a2355a21e81534499ae1ff698ac0b02e6bbd4728a79cfd2894c1372f1347ff3323dd2aaefe3c9604d033b4ae6929603f0cbfbb0750c1635085dd3595f4a6bbc94ba3fb5db8a48c7a968201d0bb094030e01d1d0afe0bc0d69844e4a6de99723d09e623ca47c5bc8116b6a23e306eec1020e32159608067e333131e5b7076ec65e56db5ca6a2b090578691bc15771aff3503096d24646a6781fef4fbaa3e02e69ae7d1e5b5365968d783a0b1fc3bc908c5a6031a2c53ce92a8d9f790cd0b7ead112ce7d2809c0510b4425b49934108067c36f902096c8287740c8c95b3bb36ede9015e6189ac2940cf152991b9936119d95f17d969a71b614086ac26f516a3d98d98108195f81f8ac46549f00f09a63f377e2bcc8b1feb8ee657482c307ee10d89814bcced8a7c8a23a712fb09852ae38d2f2a1c7b84a9f27ddc88c6d35a5251de882a942982d3fa0c9e6e21883c541dd08d56be6370a3c645b9c4ef6be473c5b0b64eb30eb877f7a84b8b10e09b4a96e8faddedc93044f35541baaaea6286582f0e984f2bf3528b058d662eb1fffae64e480f2801e7ea136fb4e007bb92bd21f3c0a1d4df3ee6179f11682f8dc1fc809dd197e03d16ba595f3c45c1739b03f38cb3f1475981ff406f2f9f2b05de7ead2d5d88cca15c87091be9716affeee8d2326b8fb93a9f9e127d357972c25d033a34925d13ee650c9150b855afce51e8c2596da1baf0e8cfea4f19f4e8142dfd3f673a851e1e59373d6ae16eb773753768277fb7f9d637f1c461b1b0420f54dd71208e20742e07f3fac3f06880f838448584db283d72fe4c07b9c2a2050b7cc0bab5e5cb45441d33fedd5e9f184be9892dd867e0ae058b330449634c119a819e7e4e25d52fb216bf62ea2a2b76ad90a21e6afbd98a570e4eaff7f87ed1d6e0984f20c020fe9119c57a5337aa198cfc183b8fe165b6a94d5a87e795bf9df2fc5b5bfe163172fef77de17d256f58e823e11fece067ef06e02a49bd23bb1addca9c8197ff4de686eaee930003605ac697754d1f5fbe7759b8de2a9aad095e7a50b39a7d4d475232eca13794c141f67f8390c2e3841988a075a7af2a50c4deaeec29486df2d9b6174850822f4e411da20d3881e0f4875e7c4af968d033fb204f192ba94ae58ee756c6fb2e097797dab67c3745eef40cf46428ddf30ab2ca238f44e35827f8624fbdb7f14b45f152ed0ee7de0dac662ce70412929fb43409651442dfcc298fb96953e495162d1c672bac644a3d70cc597adee8c3b02403a927ac3c5ead1db6482d62fbe84988220e880a68ed6d1f8d474702853385eae8199e093f814c65bbe2e793adfdaaf0558fec6b7a414cc9a339b472e5fe76c395468d87a92a2d8a367bc0954c2463715eb78120894717864ede44bcc87c0e991b5793c7a73c920a79f00fcd3635775399299efa2a088d978da994f09dff185b19da1a6bc6aa764ae365fd01c4887e93968c7695b5f77c7e5e59454e4f4e4f37e614755d0cc6bfdf1dc46a9f69580e9176ee94d3e770fbd3a4b4af643752d83d2d206e4d79e571a7f17caf24b40939e37b9b16b936b3a7c404848b572701d10d57364ba4dedbad4c41a6319ae7c7498e0040f37e63593a37d967a966fe007d174f7ff1f46997a65df2b14daf57445bf6b6caa2d2aca5c4be1c0118b5b7a5aa644e25bc6b91ebaff2a27197c77b78b0cc7681f8bdc2a590914f35972c047c1b9d37e62a53baee0853e146261cf789be5cc7955880dfa76bab09f486704584f975a529f005d5a1f2afd5d8c37ba2ab2139287915dc397b1f375a285f34180928b134734104fb3206a057cbeba49733a97fded08a9bc404907f7aef74609537f40441ab2f39c3a9a77ab340d77e71104fea6113f53757bcd7f93c61a035ca49a5a532f11702b80cd4b8ea00569333c4da27d07c859adada08ea4d77db7f9a2782235a2bf3ba9289b14c89f829c44b11cb363343ba4399b79179f285fb3e4d3369ce98686fea5cc3045d96e1726a61a8478e954c9b435e9192eb946ef53e7170919122d6599ab464c0240e27314bc558d2c5f71487f0f057e785e5adb61b10821a72124bff6cc18efde7a782899116377a1de61d7cdd1b623e055b1a2d249e64be02b4c7fb5ccfdeaf11bc45ff4db8e650f0cdcefd1ce542cee0c9df79fb01", "526aac6a536a", 2, 1654129253, "e9148796bf9da53afa5c23bdc1ff81244dfd8c58b0d30f3c2e378699a791ad8f"], - ["4c11711a0129b01f53b6c9b6ecb80915f73343f45eece5e0bc497eed8a39cb35f80d397940020000000465ac6a6affffffff027140580100000000096552526a5200656a530f7b6f0400000000086a526552535151005c45942f02d9b76c010000000000000000000000009f53ec12add5f16569b2f01fc17bed2444561879c695705fad0abdc7f9919d86ea3c821498d1c3201bb92c242ad3414fbdcbfc399a440fb08be18eb3c92eee27c9bc7c0175a9282143758352f2c7eea0ea9dc57cb791cab0a83ccb1f9e5d5d6300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000396a0a1712fa06eae3105739c48691d8ef08959b5bff18511806ed31d62c10cefc1bf3a463484bd227d02c731962711bcc4d50039149cfc24692d01e5c62b57113fa8b0a2c9d62eabfcfec3b4fbe018d73e42bcc1e2c4b7e3a80bb43e86e2a3085c397577093f61fd4cca955921ab9dfa949c975e440a66f8a89109bd2ca084803191d09cea8765ade74e30497bd06280a44b34c61ee33a566963b652214bcce42030c1da33461c9bbe7bd62b8f7c49999475adaab45125b6a4c7aefc5382669241c0a016f06f1f17ab14bd1004ea040338cb68d56e2d87c93cefad2f2084f1347621431d3d36dbeb03d9865407c00c17b709d58bd7a646961636c145f6c8166f4868a022f42d201fe815286003f9916692d1e2623f835edc80576a7253832b20bfc50e90316894a103a36e69d00484e80d471d8a87b2276717bb11409832a5910bb117eda020fefdc385a76159840d8dfd649359431d44444914c92fe0ff0b4f35adfcc52b6020b66fe380eeaab8f72afbe5c0a3a76a138b580d092f00b085e504522a8c87f92021d3495ddbf25ae826e0e8635b6ef8e31bf759da3d47dff10c908097cfa5a22de41c60222691beb382b393919a09778ac98adb7b21b064cebc9420bc2106f4ab21807992577c5f76f369a1c8dc08b5f430a0f9ccb3704e55b08db54a72f19b04510688e9dbf70e17745b2db1b7ce9191962cb730a9a1a286627485ca08e40ef6268e06a7e044d9c007f3414cf0dd106a21e6b6d0e5181e5d85d922ac6f160a12373271907027a84006b8d44b899027970734440228ea4e754a32bd137799db563d9783033ff6029f25e1c1291a218ab7efc192c143b03207f561c7fedf24f8255919cf9c4e725ee6c2b998345dbfa3a5e7cfb37b3306319f9bdeeef9b536c4fac65683cdbcb69601dcbf77c440052c39306764aa88a7178115fa8b134e686933d9d726d3097d2e5c6340a1acbeacbbaf2037f4432f14cab8459eb93489479b3f32c8f6546340ce1872b9f8c3b2d59d4e7309745c840618da0119b9797f7696b586b84702eb9991af80a2059f5cc39546f8c2d0a302bd5d2a2726998a135718b9c6a9db85a0929dcfcce4dabc1d7e3515eda6004b969cbaf4cd92e95fc64a0e67c747c819af33d18539492928a4793b3a674f7faa082ef245abf230937131cad3edca8ed940bbcecabc8b4efe9622787411dac7c819dd19e6a33e9167982f992daa0d89a4ad757af4b9468c16934ac56d37cf0c54906ab08707e686c7ba765225c8629d0cc5d13bbca3178e3a4cf08914a97f7b17b3a2f46d16dbd7a19cf34cffd29c0fdf09f25438e08bee2bbfaef716c8f21a1534da6afed6218b2cf06ec2da2a8e1ecd41544e08adb306e3c47434c6e8f1497127c72eb9b12fc6f68e11fc4ac1a7e7f38b63922b04cae87f3e7afa6a0ab1d9d41cda72af70a157f962aad22a23fb8b99a508f9976572d0b4bc83a31df6307578fa8bc1a778ff3f877c611431b1afacb2d3db88561eb398bd3a00d1595a61034e70a6c557be3adf0b24a31b066d965c4214d3cd6be6b6a39b61d54f526c7c5a733cfa9685172fb6a096984efccc1879bbc7a861328317cec16d950745eed98d069b285423b041d4b5f3c0f947e329721a2589fd32b71735fe57e90e4f1ef1b065eae8dca0221f2fcef76a0133ae5501996fa85868636d7f4f78cb564998063eaa547a057b8d2cb2e4406a9ecdeba94a4323e36937dea56b8ff04fd2dc0632d73ac4fe7708efb1f878867c2754dc182e9cefd06edf0cf496641c1d04501f69e035fce134363d0439760fd78296b258fb3e1360061ce8b1d2c41a352c4d8111a1563b58e55b5de6d1b03c3c2bc94f5284ef2b9974d24e02e46917732421f3eb130298484a9a6b9750e8e08931671790ef5dbb34c5e14b00f1f10f17b71160dfed39d6063651a5b8d7b5930a4d5fac418bc0952988605bb4f668ba1d9779bfc1dff9dc0dc479d149faee77a7a09677d267f7cb01fe7d7d7bba305fc02260d6f29248a4f1d106c162e7bd6833b7c78675175a66aaf24aaa66ed209e51bd50ddb41363862342e8173f2232b48a19ae5305b4a62461b4100a615cc1c87ff8fb0a4763fd84873d54d201556672a893a654774bd1ad7efd228e677f71af2ab257629a36100048e77d3ef1c61e3bf0493c7132bca09f31c8cfe93869ba4baf05ab2a439cfeeba393f58ed313bd231f146feceb85b1ecadb9d9a221b8da74bc8b0e81da08672c47776e799c753a4557a9666041db5f42590bd2750e5f21f410f75f8356bab517805000000000000000000000000eb3b2db07270b349d9149fe4807c1cfdcb52eddb263e61b969223f10cf5c13875608098e1206bd6d11d78b0157d179bd7b228ff37856052603da9ce866fdb150c45624062d851520e6d857f0f889701fcf8ac84a4f2359c6fe3d0a0c9efe085e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f73aad56d44af201e0b3dea9599b33caba6d46b473daa2bbc5dcb7591f7836aad9549d4fde8a75d374c9f2fbb7cb9f9eb1d1a6fbb9e21bb22c43d7231ec8a292caafe2318538dc98d6861b0c5bb558af23bf0a8988d7b8bfd8f1ebc634ac248e77ad22a8c246f7aaec2580d3c692973e83e46cb56d6cf708649ebba7de7d340e03057fef6db29e866a731a28e7925169aa6bb702af7b7481eae7c77c376482b17002134d88b1e6b4206d80804cb50b9308d7e2812f317907a4ba1d06853da24b58a90b0157b84650c4bea48b2831a4f8928efc154ba25f6211f42d8b936c388e70d30921e46363d2050561b16ccfbc4ca8d6e0cdfb3223c875d7f86661c45786d3568f03297957497b0aa7c542621ba1c0338f88d8b05bea30e8be820b3ea8b290adf8b803273f544c1899b99e2af90a24bcd4f431d03bd701c54f81aad44b9bd2c82e5c2a020245140ae19a8f5ca4bbc59f9b7e4f5810087c7d3f8e652f4e0525c4dce631b3031f7efc7e140f0eb7729528007d91b24086b5eefc1a870321ad1ad7cb25b3b927020acf40ae5ff9a96370fcb345937c7d95603af7d26f3741c9de97bff3d1f5e574efb7e8ecce2a415ac2d76b986cfe5c8b695a5e5957d5b43d60df133bbae65b9cc7c9734fb9e8b5bb7ebed892d36655e185a98231f9640cd3065f4df026644974a6d96090b5fe7f7b3ff5ddaa010ddc88184dc7124410557bbce67fd664376b500161f9ac5096fdcda28fded1a38b42b909a812e064931aa750d95fc0920614e3566422420d6a0149685c20d898995078fc3927462a6e6a0c63230a9778be7359846c81a574f739cbbf73d9d2b0c806e56d19a1fa0feb09354efaa8e44d010e7bad1e510ddddc5048feb371efd71427d5ff3126b443859a544e62232df90920a483d923a6e612b7c56f276d7d8704722c1f8ce78f66da0814a1f26001648f092ae3c3fd85182ea548ec48dc631b9549bc5095f73060fb9566c66dff0dc97eb4a72bb3c596845ef8a4143dde6753e59bd4f912c7225fbb0da80a7640b024b6cf6ce51bd239ccb7d39cbced5be3668fee56b5d443d40e5cbd40a84ed10242441515428bf86b24736059b139a51e7434ffeb43cac5d62f4b22e5c7d193371910fd40ac7606abcafdd917d774afbfda380f5240f256aeb1c1c199789994113492d8891fbc51743ca397fe2e2fcadf8a2946393e55dcf889de5931cc96bc9df30c6199e8fca300a55cec7f023b3e2d93a4f896d5f6121d76de796b8ec807fa547e149c151fe74837cb4ec63993565d3476726934292b05ece4cf935684365c0c822376970c348fa50c4bdb9609a8d6d8d4cc1fba30230b7786e7f275368eec30d731ccf5902aabcacc5b08c2d13983dcd7b8d8c8bea8b75be07cc287985e9eee979cac77558e40d60752b583336e4651b5ba72cb1e3d15dd04b2020a827192997f58281aca17dcb696280223daf1dc78a7f0775be0bf9d63692ec9294b6d2108a8f66de68c56809a1abf2b965af422b2ecb450560bb8b5e1d1cf93b1045bf8c673df041e60a089d55a5cc27c3f04170a66f6772b228866f219a210e6ed2967a375b7c6492be487fdd3965065bf45eaf052639c11b0c45558b3cd69fbaeac906b94b8a65684b1de20495d8ef0b0d4ce2eb310cae53a3b15091075e7a404eee71c0f0c40afcde407be50ab9052ccccad6c007c8c5b90611b82428c0380db50625cdad5daca5e0cd59ff3088990c9fe83d905ccd570d82afda7d116e02631a59b153b9619d5bafa512e5d205d506373c7910190785e3160f6e51a6d80accfdbc8f1c20f75c68548413243029a92d605b95d9514fd791bc6f8b99c2a084cc3f811f61414fd346db1d04df949426d77de976fd5bd62916532672b58ddda6fe3dcaecde7a6a8dc35cfa392a5e351f38029b1693e096abe36c4bbf603f35e4ca45e55ea0419ae5137e307c15600669edfc43df8bb1d6288b35877ff94ad37913946876b70560b965a5e93e9e11813ba2205324e149a8e38275ae5b9c4e5f6600dfac3a2de4ec05339d981f3e619321f8c871ac0eee39e16b7a8564e0d8c9bd9e146474582aea3e4922aae8ef6295f3fa0d747c5938a9af76a2c938b04a1a9fb802439f6966bc81d58582e8675ccc633d31e597bca76a2413490cabf5ce0e4ebf8d54e59e94c4b456c3737750206d3df8ca889378d5a72578ec78fdd7c5b48b6dede6481e497d5bda528f198537430f6bf15c4c6e87b9e1f6aeab66ecb1468e4c989351b80b63577ae4b7c3fc75050100bf94dec8f396ec77f498f857eb3883867a6c34a96d516c99c8346c084d456067573e6569a2715f638a5aeb771000b553a03dc3b64f77dce9ade827ecf3539289285dce0a82a1c69b9b07c6720402c389ab9c076956f377ef6ab7309b94ed62260714d53bc690c3f0c", "ac5253ac535153", 0, 590162905, "5c54b0d516bc05826ac4e0592b4defeb80ec0e4c9685b3ae03622c13c52b3e9f"], - ["030000807082c40303d46782a8253384333daf12a7a322127b4d4def71ba7cbabca716da50176a6b9d010000000465acac63ffffffffeedd8882f2ee3a1a08f16fe8ad729ec054750d8afc49a2b57c1ea6b6130dc9590000000004535351630f9bd91990afb45dfb53bba05d3b013616e503b5c79edb6d89c2019d23ddef657d292a7501000000056363ac6a523bd16a9604986eec05000000000352ac52455ac2050000000005006a0052009a2cd600000000000263001d5a4b0400000000020065000000000000000002ec9324020000000000000000000000001d028900ba566e23d836cc56c416ebdf47959fc56f8f5ab2299b6d13b695c0507c09228173610ef8433882634052fe8da0f387c7e94e7cc2980c5240a4bff13f399b62ab9e92a9c0fe1a97174dbe17ca3da600e2362bd0bb02c5f6f6400c765600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000201aa81b9c232473ffb8736706db1d3a52159dda3f117a38002b99cc67b083b88f04d4601d7c51f4ea35c8b2bc94ef435076b8301fab2944cba86e6893c60427bc92c7f355e2e0dd37c1301bd0e7c6f38c9b680fc871849c07ff95c5f738eb4ff52f39afeb7efcd60e313e4174070c516d13e9769d9209e6f88d8badfad5e294030fe80750b56fdcff59a7885da647d1ce7889f146f88a9b62aadaf78d756bb171020a8c372a1ea2b8746d5be26de8a835163a1ef6f59397d09d80f7256573bb56230b08f1ca9f396b723223f2537b31b41c051c21508ba9dff347af31640d882fd20d3807d66b1176e73cf2e451a921b63b9c993001ea4df263d99e47888fd441d1ef0311e101f7943044daf355e91670cfac8a3ae70ccfa316eb2fb24772b46218dd1b020249b2221c15cefa45888e55f36783741a4b3762080e4ae73e849bc5ebf7e0ac030ee8a0d7b2351899036c06ad185e96e3de0cd9c9de2d8d2f60076d68147fc8780200f6a0724d691807fd236b8ffcb8056f5908926d038015ed64b78964dac94991022227f3fa8ee23532dbd84581b1cdc8338b743eab320f74fd4c9a3cc776a4b93814cb978368a392238214a18c4af65dad1a027779911277d261cd38bbad2e37bcbe4f406b1ffbc765268eb08d5340ad4b4e0492ec455aa125c5d9b96956c63c5bf91b9b9c262dbfa533d9feb0a11e2ce82c47f27ef45db49f3df86e13fcea12ff3bda65b053b2c801efad106df9acdcef63da275e1bd3c1f828682381b16eaa6f08ac070b3b72c4fd9e93deb6b1ae15aa53a15bfc5fe753e29385ab9eb47488e009c4fc59b54c0f1eb3d87253ea57b451416329b0482b66e1701b80b8c31524192a57ea5f8b7ee746dd7a1d1b63570fbe61924ff4d7e77d0ac211c8b47dca41f5b524f463384bc4547dd9fc3ea34f7b600928db46c620ee5bec7f869e31ed142ac047faf0507d854b137b85c3ea3d5256d682cdbab0860dece0c425c41c983f8d26005889a9c02035b0f8f94486edcdd83c19c0402e65f3c9989eb8faf0928c5674f142f0847ec7c2be60a8fcb8b7d0978a97370fd2e96e9d662498581d65e95b179397e1a79ba074d34ae8a8e6275719485725cfda6d27d7554864d8cbaca8fa38dcecf4efbb8d1fd11618d629dc63c0c50d675ec42847ed09504f7ef1ede3d58ccbf6ddf50ba92ceb66a5d7e185b791a49e9432c2440bb48a52875603113b4122584c2c3c6ce7b1ba297b329d155c70dba4325c21e20932375bcdfe8c3385b0fb91138059612a6545b4fcdbdbc3de3b07c3e8d19557c5e55a61de4ee20a79a14f3f0e9d1251c4c9071570d603ef3bb783928ceb4f115c907b93529bb4354e5e14f1b6174247ad3c20d845607e38ab02d3e50af6f294f57fbfcaedef1ee9eacf3d7af4d6df2d8a434748f41ce7997d4681a8a06fc63fe9675261f50cc63b89453559ed8159fe2bd16f42564df7c681973f77e87d5ba39c062fab1285731f32f610ae0a725e54783e8bd585e5bba5727404d09ed508a6a00d7a26bf454e4b96ff116a0c3e730d4b8345bc0081221ede2cc67e6d39578b2007448feb2944e0b524e28d4997e0b2b215c6964b1dcf7bc5d7d6e841bf92bae2979cbc48db981c43862e33f350e91b6be7074436179f34f04de92631003f873db48050bccc72a8583fc7a62609d8b1e91b3ab02e6cbfcfd738b4563d518d79f06d7d6c7c238daaa47e019570bbac13c376cec2c1afdfb9173f89bada0f32dffb8cbbc9ba7e6a8a2644346857fd979d1451ef328c5820365949929d91941094f55c088f0fe632a34e0376a0b5d5511f6b50d1080f0608fbfd3cba296b511f388014aede16b2d687ac449f7c66a6c1a2561dca2e18f5db1cb6e87669746c9298088d91852ca2bb07bcb73fd5e0c1bfa68e13620940afd402ae71e6eaf7d0b7aee8e7cdc15afd7098f98b5244ffea34c447fd6287ce13b6dfa051e409a1f900bb9bc24119117645287001e6b359a4d2f4a12022f396797afae4d7f0332690b6960635cb42f016b91ae08ec15e16764a833726ce82cbfe0dfd4e101e7381dc2fad40a348ea3c2ef37253c33b912ba30c2bf50fefd461911fe68158103601b17ec0595db8d91e4c11a3f0f76961e83eebaefebf7dfb77a4f0d28dfb30c3bf9e4cb7be1effce9e7ab72240548b56507edb2f00c35e88c58a2739c48b5e4779de7a02a7715e91334bab2a549f049d633d85047eb2f45babcbcfdb89030f3a2ff811c5cd4111bb8b65206bbde15c0ec8cdca19ceebf9f79c12f243988f9145d4823801000000000000000000000000f747d9b8b5223973b2394f5a7f781c6f64478f15351ca3382a7e2f652353f39d5f9fc3fe4998fcc15a24f8887873b7983c1605fba373b7411d099c28326d3955702a2786eec6633a6da4dab378eaf2245ef242257076f68131d2bdeac6a3749f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c18d70d04c1eafe1802f7073cc677ec996b01ee0d00ae5af0f8032776c890ce31743b747c74911dcb7c5718c6b139241b4870438466bcab96035368e43724b55b06e6d316eb2e79f9f783f95a251e4e9356d4295f1e6fd6a6ceedf9172b5472b7ee769ebabbb14d50b81071b83ac177cefbe2604ed54bbf9546fe87920dc92b0304f52d2ed44f9b6456918fd84e4c945f3c5ba4d2489364a533a95eb31eb4d97803252318ed9beb14a2e1ee28ddd3e36b182a50e95d52af12dd13d00de1477c6e800b08f0d94d867ab96771b8ed69b72bbf9e1f2701e0a1865eead8d52983ac2a3fdc50c664c238207d8bdf582bce57030f2cb21216b9445c95740006d3759556903102187169cdb24e3ccbeead6af934d121ab94d0e693820af4d76c3ce286dee0402202248c4c346ffdf853554af1226f865661f6d08910dbf36a74cfa73962e774b9750226728efa633e61b08ba5afdf70eecf489c237b9b819165de32ae11296d7ad45f031983c16707a99354b556f077261b988edc3d441784c4d0214a85a43f361a80c702112efc83c428335ea8cfb0104f326fa6d96e5f6e41e44c271b41c13cb44b79dc57ded6068f79e098ae2af74848c7ece533f0b0720e97b5baf2cf4df826246511e252755725ed6709581e090582e2ecd9ef03161d766b1c343086ce3c5f986ca889815e559e802827cf15c5125357d8e510feea24db9fe30bb8f5241035bbdc52a3bb65a7035dcbe5153cdabee1c10f002fd35321df975ed4ea175ee83af9fd5ab55908273d81b5973b0ef9dab9ede758690d104e11f249a04a2045c8f1a5a0f883378b8fd15e431a66f0bc430c6b5eb5212ba3bcef49bab735eb0cdf63f7d291ec6d738d2402186a9e45ad44b474336618df4b4d9a542348081ad9329ce2b8dbaa4e4405f4138691b7dcaa8fd0d6194a008e9e87e8b66140bc6d0a351b3250830f82d54d161b4ee2bea35f1eaa19890ae89c271bdf4793a0df701baf05d9b750943bf73e25f617c720a31841c7a1623ce09588526d187b61fbbe11d013c5727e43aca206a2faa5894b65197b7a2e277e65be9ccb48a8d94a45091971a59edb31bac8549d7fb23beaa561e18465649f4a677ee7afdac6d6b98ec258654d80d5cb7d231f5c792b0167c189be9dce29e769412c051e688dbe3c0ea0144e06285451802ddfa7f94698456cb81efc417973aeb30cae032097c355b3d6bf1f977475b88c323f85060cdfdab9f5c9f96fc4fd8e4732f8ee36502fa6efadb4c7953a28f0641ccb744fb13feba3bebd3b701b0f26260ce5db1b2ea5753e0f8e2da6135835aed3272b5cfb88e26f6fb8e201d6af8b77b2be1caaf91eda090e1a16998e3b414c1fc08b8d0f488fe76e2e406f4d02713a8ce4bb17df331aa11a0b0654b780aaba16e81d087c57a8773d3c426b326daaef3e78ebd9c0964d01c8ea2eaee25c5dc0f2b4da384d60b11761488e87c1aa56d11c122fa5319b73f1cf41c82fcc87394b23302c724d2fb8e3c898d9d0c3eebac8f1a75f23facc4d954f8a0290e394fec4e676462259e74403d3adc3320bd4285790c567f40f8c406943ee54854f75c618c573a815964f4d9867f6e5c0fa022a8fe087d76b7aa0945785ff657361897194c8922ce50a20d08ab3ab2660ae5b29dd29c3adb7de71261fb5de39f9f05a8ce8f5b06a7bfeca3a905d2aeeab103ed454f5dca73a7267aaba7893fcfc63664d515fb916367396c4c8a09e737b8b74f3b2c82999e3b7a1acfc82645dfcef15c8fa26e485a5c98d93aa5ce251cbdc6057e400374a05f42afcccfc36b53f6a57d9f6bfbeb5c560a6658526bd1617c6ee276fb9f161841da9e8bf8d2ba4093e4def8429620b3622907e9e081d4e1bda4194e5f50af9ad4bcd83519b86ff80779b291547d89dd430982cfd6bdfc287c7a30d03ad2546e8fc0b6bd83f124e91aa87e68dd0ece184990d8e112adae79003797fb79c09d6d023703da695a2bff1a0dce3bf9fff54db262eee49ff2a9db08ed4d6a9449f183b5611502fb777594b9131603eda0f5f87e272fc332a812a8340d1807054983d64943d14c52a58b283060b75433ae23fb785658ecd746c54a0337053e04212084f5cbe6a5352c4c00eeacb6dcecd8f14159a6393ccaab8315c9082fd541500b4ea8494d77d32c31cd7c395a6fce76b9514b894df849e3e43d8ed6788774ca0fb9dc812cdae25c63e4ece38dfd3fff3f8dc56c842599b4658ffe35b8f90b78168c28ea66ecbfd9961e37dec29e380dbc84e8096d5dda9e04852aefc8a8c7a6bc83710dc7e49ca5b5726e1925c471c8fc9c6785e3b11279b1b514b2ad72894c16944453e11daab73e497148241fdabe9bceba27d82d58225452a593f0993baeeb58c8d702c365a005b4732bcfe6343adf3b10b4b38dbb8eb6c8890374e8705", "005153ac", 0, 1961892261, "10c038da3c183192c7406222a1ce9e63fa74cda0fc1c98074341286b8375a6a0"], - ["030000807082c40302d8356cce2fb0b5a6f0c2787424accf9b4913c1b17acd7cad73ac6bc180fe412d02000000055253525252e2fd14ddfdbb052e02783a095a2a3bd7137a7ff72dc07f005a4d45a9456f351bab86a868030000000263638ec9b9ad02dfebad05000000000552516a63516fc2120000000000045165655100000000000000000272d40d00000000000000000000000000c3512176ea8d7053fd49044c7b0952a8f4eac961e419c792aa928727343cb3aee56620d0b615db32a808d8b7f0bc6ee3f1b2e763e85930e5985e6a10e42c8237711a09a07b532f56f1ed233a509c687e5801d8a304ac8fae359b0f15a0f81dfb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c3d0fbd5908347b018d35d8420ebfe64813ef72c77bcbfd6c23544c03f9a9909e8a85e9c87c3a2a38e3f816a84549712dc4a202d9a931032a6625b95074946e21e44639e821d018df4ff2dac1eaf9c44393f10a1aba3a070d43390255df4aa157019a4b6588dac5fc442025033254375a19a6cf4935aebacc4a681a571d5e084021ce74a10591cbd2138b99d53bb9664815d218000dc67549df93213fd368b7a5403277d7a6c6c7fdeb27ed24aa8c4c996ae17242cb3cb8d72520c1702e78a4fe0bd0a08657ca868bb7c50bd727fb961052eb8feb80b975d1dec963cb479ef0d6d77276beed1853189d8d7254893fcd2ca108006773067a08907ec798c3d16b9551d3703017f7fe2cbf396e3e8f22413e4db57ffa079cc7c093149b11d793093fc7ee7260212848ec662ef5d1a744044689890fcda298e49c5336883be397cb728440084850305a81f1528cba880ef942f84300952d338de3e120cf98b5b5cc810a61824d8ed030690326d8c90017803c21fb02c354a6642fc0645ae2967374902f93a589e1d0102056682b0e18106983d5598e7e23294bc9cfceef989c42abeac23fcafaacf196e03f31b7b3ed8d9bd3ca8f59fcfecbf242f121e564ae6937f4f8b22577e22428389d127b9555dc40aa0ff17a758bcaed37318721180288220787bb110ff2c7b08817afad900d2443bc375b7b5946abcce0984b89b072762756efbe9542a6ea95c4527923d1bcda36b23781f5717669ca6d21c982dcac4828d9113f5d3344b7b9c48c16f90b4838d27c7be7841391ff1fc30fd038260453715d2ba3795351848ddebd5a9542a03d17f7a4bcb39f240d085c648adf93bf63eb4277f06bb635eb5bd3c599f3337605cc17e9a37f7b6f177bba2a832287f76672e5bd23a1b50d1b8cd01787eaaa2d828cb1ab685a3e53b84edb5803ff5129275e59ee52f98e796a14197c7aba3a19926a960e3c0ce0a67b501f3a454508af5cb228805546e6df156d4889321d374ffe046691eaf1e24d897cab29cde239b85445ee9ff09b4ff8286d7f93ce7ddf6e0c83d080d498ff2b3b90eb615f53478b912f61df6b570d954f948966a7030b8a976edfbab44ef47fcbfb98219575c05ca864832304aa497214688682ea66d84ae528f10e7662b838037a89b0d375416c589cbeab2067275ffa615e03ee1359baa59aa53994bcef1ce6277e1569a27722acbe3df8a17dee8c6edd4ce42f2f3bac88f55e346e4501001fd4ba43ceeb5398d4ddc08608337903891d6173229705bae9c4c14730a6ba8b3d28c6eb8ca830d266e35ce8b90010a7a5db908ed4f0a56945ac77bad214af79e96371c1df2217c724b00a883daa24bf84db76cd20a27d4b49a7c2597e59d891c7ba502ad8d64ed05c10e9dbff3bd271cc462f155738087311dae5402c08be9e4ecc19c3e366e367e7ab1aa89ff5ea3eba85936b62380e46dac0b0b2fa18569fe57849dca30d199452f7dcd47c28e4149d4dfd49f51ca997b3edbb426ef5bea275cfc8ba7ad366d439d30eeb8ba578f7c8166e3a2f0770972dc6a58348aa6574599a2c13a74564996da2fb7df3fdf4477d0574667651345330cdd0d4013443a62ac4aa0c66c755695ba9238a8abc7d8d128dc8e435aa7e8a0fc4a2723f071ba024a6b298d53506d18785c4b32f0d6c0793f7088924619e69d58b07f0efdd98577f058578003f0026f05c0fea22269ba393fa5c111ec4da6399df98c29a4f2b006d7ef8661b5724847c3b0259ad22ec0a7c65fbaaedc9b0dba4ae2d161ee79ba68dacdd2a26fac0e86c5c10c112d9e1976a37b50c674cca9158a328e47998d85d1c37bc9c183e1cb6f1de4e0683351c014a3317aed1b00d34a063e4ec6e6e93b9dd3b3bfd168e9ca675bcbe88fa14208a44f4b46a7038761f248847c9d3f8bbd04504a92138675839023e945e666a2f9df1ae390d26103d5a75fa01443808c635a7b6723fe631c39fd207020ff9648aacd8718f714b97bbd9e440b203fcacedf76a40c226e179ab32cb2230f5e2736a2762c01ff6d87348b98679ceb6c077b1c20013989050db1bd247f80511d8cd5366e351ca0a21053b41b1681d2e90b2478283d8b63361de86c0124434ab3ba39c860ebf93a41d94c8d395fc7e4f0dd9880cdee0c531fec201abafb7e762d3ae1ea8b0af1304a917a7d14666df3d04a7b60d3881802665dd6251eeb55325b028ebe60d2a98d8d5f1551c4846ce308c2269f331715d4aad2c03f52856e930276e69a59db17a6b493b5aa2bbe2187ee1d236ac02444614df5c2ff010000000000000000000000007300d9f126dae1ce9ff1ce49fdda266b12886d2bc5c41a5eb8c6ea0e657d082f0f6fcd4c04322faf7517288fc4be24d23e4d1f9532effed8bda4969155423a32c8806b2779ca2b4ea65554fe2a23d791efa046cb964d80744b5efad6452cf171000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d6e8f07c474b126b934d14bfa7b51cf7a17c339f627f70742ba631c9d1a89fd7889c757741098a6fde07221f6b3132776650a5fbb41520144f6fc7f61c62be4832fc837b9b5f46d3f59f821bbb011eda66c115b1bbd4044cf21d817062cd70362b613c0090662c973697a28156e0ac80da2b92e2313d324f26e13129d938f43021edd96bc90c8880caefff2468aa278c840d799da33bb995f5058f9441edf9e580329083a0eca3270e92286df5fc2cd22633ee4ec33e4343f764a292d62827096930b04b6ec459cfd0e9e68a13cf34eaaafe93414d04c6debbcca5f8106883bffa0f4b7c4464ccc30445977f798d21415a704e9e44e361bb3f90a647a5daba33bffcc02064279ebaf97ca6497f13d844c481f06bb1447c8e8febe3d79ccf643ad91d1480208312711d243bf31b40f08d6fce179864b64809ef148e3e2752a9b2d84459d2102102db66a734343155dc579e13587fea33345fac95f18b54d842f19431d5ea17f030f28bf31ffaf54baf07dcdbc34f772a087f473ce904961227fdfdd7e29c29f6d02155ec6b4431b802bc71c29ba9a32450bacb77971b2839b40562c1ac4d623f7142a1cd28c55cf1d447348992e06d9ecfeb1ae3e597b4e53eceba2e4ee836daf017fd61c1ec5fb951162ab38db965c04bd3cf06f5e1f20e59d542627263a3cb91906e3b28357cd201ca92ee6901c9badd2f66d2d65af0a50c27808459e8d93f711bc5522d78338e696f9d027a70c33632ec3349ab7b366b6b444eb3babea8829b9e9a26b88304e2dcec16018ede2bb91835a473054b5b1f0aaaab3e837cbb277debb78a18594531ccbf4886871c973c2d11b7fdefb71c3d36d9992e6904ce3fc7c6b5d4ad1735cab42976b3cc127a7e09764247ea39ecc06a1ed9b76830348df2930f8490a9b20faba5251fa4e63a1e1e5f79f84f148a605b6da4023b9fadcf35531e5b7aec4496cacff50f313f0fa4d415aacfb6394726c9d5b6e18ca0bc931e277770109a31f30b744438e740759b7f3dac46ffe1ed25fcdd9e5fe1930a42cca585329cd2d3972ec05a197fba2fd697d8eb72b3e89173184e35c6578bbee86ad7d5ec34fe2ddc1755c531023c0f241fb776c4be361ae4c045e5fd24c1ba1329e301abfcbfb1188f4aa088c7b00ac0a4cc3ddbe94eae156860e0534584e0635db58605c490b94049274e2bc650fdcda7016bab95612e943d80529600e366177670eafe714f914dffe73d316390109500c58500dff81e8d208402c4c7567c4242cf3ba410ce6536d50176fad498be0095389db07711b2537cb1a6b990a025f0ba4a6d6e4214a4cc4ff0f962b983bb89a54f65b0d0f0fe46c9604a9baaf2b48e0f8871ab92c97893ea8137a89b8f44a8281b02a5bb93749b8b66daed39ec8acd8885383a6a6b10eee32404b4225ddcaeae9a55887ce4d017cc6e9335b8a695b14c2137210258db0f4647be843aa456450a8684ca6b95f6a9d6ea078133e100e94a92ecb31f2c5e029476775bdacc6527a02cf65f4217421f6b1129c338427f76942daab74395b3e9642d969c7a3eb02ccab17d230314d19123fe3c2bc2836b08230ebeb7232dcdc0b9585d1fe3ff8d87871c56bcab3bcc4aacb8b57a54cc32425ae0f6e1c4c977d2e6d56dd044ecd63e7b7c986ee02ea8525e54c68c6cda562a7613bd85a19d35ca63f5dac4fa990c1cc3ab008c264aed4f46c0e28c46469209e416c64686384992351a98819cb9255e1fb4d5f56ffd900f7c5b64f97232777cb52e2df2fc6aa136bae7f166543015b722ff258a988c284d130dd615ba3fe904032aa520a832472a4b01c129e266948bcd7cbd3c01717717c4c8340357031b17d3354f2f4d97158c9e337334eb9ef79bb6351898a092b14f70908b2b0f305b4ffc500f8930982de85cdea03b1a301521ecef69139d5070c8ac726904b898fc1e44012e475444616ac23aba8fc03b1c0bf205114f5b46e81c777d37a44543469382f1897b22037a6f162e8671ad6d8264823e506d5839cf0a5c3280006dfe3d02867ac66b161d52d08abc2213d8a900316d6b912ba095f919b713ce8c9c5cb13c8505e3b5adeadded4af0394b73dd02d7c191b04de620e0a1c775405eeeef51d13c74d0290fdde2c5368b5e4b5cd35e9e8b8d1c1ad41cc92572c9f21e97d65a417b98185ee8a3e0b9ab45fce93ddf6a4941fb8d07d8e3c1965df777c1ff5ef58f8582fcb9b0508653031b1b63ccb7345c1f0c52ed97bf5431cb7b4244fed28c83d1946cb8f6cc26dd2dcad476bfd10200dc797ffe5fbb872d6f59f92c1694f8c083716c7715a08748d02b30a45333f0ff462aca2660fc5538715fdd5f823f8b5801e2ec5e31845fc8592d9c3882acecf8a28928540976cc00cddd8357d7da192dcb5ea95048efe28f2e00f3ae1fef5190211fd0c", "6a5353006a", 0, -1861803510, "48209804e28ad1a343979e1a5dce0ed14e4ab271b996006ee4a39b176cad39f8"], - ["92f5db7903f9bb257764319389eada5054f79898a63f4e96b770dd47aae92b0089cf3c5668020000000565ac630053b4e3ce3fd883ca3b9e5797f4d04d683ce88513dfcce3c7167a9e31c05aaa863f854239be01000000046352ac63ffffffffece2b5e93a3e04570996ef66730c37fb903db95ff34536780bac955baa7ee42f030000000165ffffffff0277fdbd020000000005656351636a1fe6ec0200000000065200515153630000000003248c4b04000000000000000000000000d3c7c89e8f36123521a21c85949524950b428feb60ec77a0448d60829304fc70ec698a8199c9649c7d9ebce14637c2aec7765919566e02174e0e2d82613f00819db937b82bb34f72f438859495cbc71292707b1637ffd8a85827e19f511e4fbc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f92338e370a55287da17270f46362cd314f8f299947b2e4b20bb8e93519745ab76e67909058bcb535ac76e93d00d52f6f69caff8161d6f0a7ae6270465700daa3e046b02a96961972a71ec5364d19e122b096abcce08001c20cf2989e13c5d319f8e8ae1de798e3e4ad95cce1f3b2406ae62a9bca450592b2eb04b98d1d71ca002210590a77847271481bf71bce3397ea0ca55a7a5421867198bdd655c1cdd925d031730f1c9ae699a54f02335611c24554492dde97e9bb767a3e4605ea16f44f98b0a0366f7550342cb621ce86597f1824d85e7a09c279de79b3d9d28173f3637305e6a6e6f79cb0db91461c77b83c421cf1f2161a30329b447ce08ec13bf0ef2bfba031744ce631b25e4afdecfc34071262091e6fc00027c954e25298e627afe180e62031781eb62eb50c9de8f1427ff63cf4760661e05ea9b33a7498a95acfd1390b81e023030b39fecf4a753af79b9e3674134c889489f3d2bbcfeb141f230c29e54b2650205059394bf3dd0a4230c31462971961508d497b418a93e0755941302a372dbfc020306eb12ea8160839f639b1d21aebeb30bcff098c9bfb04d2edd1c4d47495394d7e05222a0f5526a75a4ad04470d6ffaf84f4bf1ff9a43d5b4ed6dd8abc0a76138ef3cb983d090ef22f4992cc5b356a96a2470af8a81b1157961d9e69bc655a4138f0f3d971e84d18b3d9974116ed661155e353b4599275a951d5e693adfbcdec5366b04742bf6994c7ccb8e23eeb4c993566986f249a0c25ecc776b31a90278c9bc54c15ee6b702ed6e0380fdd3212f54cbe3def219a6f7201b5040dce4c419b5382cd6efa70d05ae965aaa4ea7fbab53587f45a534189addf8626ce9a798fd1a30fe3fcc0ce1196faaa4c5d42b3ac7af8b7a9ee682d089fe062cb2f5ba8a6d9cdeda2ac341d83088e4f9f5a124255244b7bc85ac8be47164e19578cfa70010fd18e7a4d89a9cc29d410ec78d267d78da03e54f763eef1478fa38f54c32c398fd123894a2e3f8ef515155b755b28ff4c059ba2938ee79afeb40682ddc50565b5c9e017c925ff6533a457253e827625accf66b6a0e7f04bfb5fe0b7a01a738b2f83ed4c2c26fe00b4557ef767139955ca3cd83823cdb35f058fdb0e2bc4b10c47c8ad8802b38eca96274317afe2daeeb38da196c431ba49b20153459edb3a302db5c578bd9f4917f32d60af1b765d68742868aced17838bb8903784f20fe6b4575dc8c71203117b864f5dfbfc5d10d199668623e17b78a4fdab8aa1675537c82dc0c30061dffef8d6ca119cc0fcc01a4bce595e3385bcdbdf8a6ef7210c3818380e3e6f49ed60c0fdeed9f8fc586d86cedf3433d0e00f67eda1f4fa5e6b2397a70e46b29c46046893bba167752fd508801d55a8feed7e5369babd8277d7ddbd8e6f6183cb6d08327e48c4198fb54f56bf2f492e34754658eab94fdaf002676cdf94d0a4b34f2bd075ce03425d8ee93e3f55b1910b585dceba8f9af4b346f8e9c090f16f17cd09cee0aa00103336f761c8d374ba3f8bb3cca53efdc12622c34b0986ac20e1c645dcb4edc213258b68c122ac12daa08f3c087af7081cd414795a4dd29d2f69b4165915b2f66fadc07944ecd1ecd842c2becd936c071ce05a89ae75b4712d0360bfafa91e98fe4d12b34c15de7cef4028941daf9fa7c0ab5933112e00d5dfc215d777a25df44495f2e877828ba8c3b4070f6b74839ff2b722e643c5f874aacab52976906908c1f9191b74f0d20f090f29341ce4cac3ae3da6b58336069b00440bdf0e8ab2541606c48281e5de6bf80e00ea3f5ca1f161b06a2d4d299c8784fc271a985b5f1cac322d365f9aab93057147f454e9e1bc3d5d3671b824c6c5ad819de13aca1e94f5cd6a91672b9dd31dc88747f5f6192a1d9a828dccf2ba50a3b52c5ac807d51d3a9d9cbb78c8e6c2af4123b1636e6802710158a3b0848e1517b464e2f5c4b7f1a1e6412d2a522ab860af090fec481153acaa6e961b03da29a7116507dbd316973b7aef7a8f4b295589c1aea4ea8701fc5fb0746e041766027d8bfa6e1b8d852d0f4c090f622111bfa905a45fdd699b9ed9afcd0c3d84451a34433fe5c357720ed3439b6228c5c536e153031839a5499e466a8b244cdaf2dda3c10c52f79c5de0b6c547fffefff6d57804166972c2b70d0d27ac32b3547085d5ad645b97e1c29b8ff7a1f92145c81598ad841104dc5ab3ccf41dfcc03ea60fd058746e73db78f1cabbae3fa7f831422e759a35979e485a09a52234e0def84ea505fb2e2c433422457345719256183000000000000000029dac60000000000b77f0ab0665c61597b2d5eb48981d8841912952f0c63c4b8f8bd7cc333dd1a91fb7f071547752c32f7500cded54231cd8daba157ce3c05b6befa40a00bf06c48d2b36a72d95f8df73c202ef9cd7cf3ff04fd00330606303d08a5930a952c63460000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083e985ef2c5bf3253ee113eb7c487307afed7a88ad9d47f8a91e99b4171e94c959f3ddea41c418e4afab7935e82dbc169f282b5ae9e86ef6b57d0db76c6dd6c1f9cd19873cded4a0fd4e555cc42a873620e8eff507d5a6705f24bd89f9a6e1f594c5016ced0083855dd5a1134e7f9b1b5f81ad0b67d29ecdde08b5c8e912a89003271b4f85ed19bd172e1b95081e685e5a324c98fc01ed2fd76d6f3456f0a80ccf021b659293b784a7132a88112a7f81c0675b40507857434d5519e144c2b7284a1e0a04deef82ef0bbde3daa671347855a85921cf4b3db3ff7da8d60e609872b6cde48514c686d4a279b066d72658ac5d7c3906ebf2545239b5ac1d502adb539b492e031964ab7edc91d74986062ab77dd9b192996e1fe51719b1a9a8627d09f1177cc9020ce4bd06139d750d47c7a596672f5a5c357174eae1e8c5a2b7d36d09e619d6230327e767eb907ccbaf0027450239f1a72711a8c32a13069392ac4062d48ad6f5ac0218c1628372f4372de9c759611b45a0bff3ad6f4cc4aa98c7a7574ea1a3c2ac680325011c1530e9c393bd1adddc0a797b32b879419bb28c50f8c3405e1a80fe22dda52d286497a33386e986fe8610ada0ad19e2dd400e80baae5fa9baed352a6cf034f54f7012ce3e501ef0f47a13cf9b232e533cc8a69ea78f86244150705d84c276a172209882f45024c0980cc746c75dc6c3c2d52d631a3c3bd2a50062b028c72cd6aa3764e876df031016f52dbec389cb496cad58489cfd3f697a1e225ad9507a04991ea1f8da87cb8f792aa317bd5c081adb628b35c4062cf0663ec0357222efb0172cb8d5e20c8eaae3132c72e20eacc5a2495d943e14329cce06431a362d398bdf4ea51f0d3213f188d979d9bdb675863aedb6d569995e5474488f37043903ee18967050acd43ad5622304d6cd06ae6bfd661192d92625add82721e5e5b2489da91174f608a0e4fcf213de2799ff591ec9a42aaaf5176c109fe8652654ed530d52c01612b4077639eb6159b4c3b189f3784e37f87dbb13b9a34c4328db60099786e8b60d9b85c549a783e9f77c9f96466e48ddf3373a9481678446bba8d44362800923ae1effd3218214647904ab9225ff00296d6b4a7846406638e47d19a1298f09b49d9700d1fe4b56c5768c44f9be574b845a5158650b79e2b36b3ab853bf666e3c705fece5b927b391d93068a0fc68366c324e75ec9fc35b36dbe8363a1d16025e0f95cf728d76ad13230680d0f0c4bbdfd962469853b05c39610de6df91607315640663b65ac78062cdfc2f9e8df1f23d0f88cbf12805e9f555861f77eb22a8ad4782fd38117174c218ae9544f67c0ba2509785090fac89ba4acbaaafb0b37102b7cc15eba8032fadf9d6d39c71b2d00d97c499300e8a4bf0f69b1531da2fc82326a301349af693371ba7c302cec893702c368d308945f6b10202fdd402f33e41c0a0a3399c03e29b9fa143925827f1f7182cfd1e945e1fa609383c7d8bc973877f8bc902f7367a496bda07e3289a0071143cea61d02a9b6cd316bd0a3d56d82c152c3ea3998d0c75ed7fd659738d1bb401411d41c8b715c91db5957f537f03ddbfcf8b5eb6b6935c29f22e4ecc0abe78f2f9f402a5f79ef7784f00777acdf6266d163eba101972f42a3feb4d46848a375cd5d770877e33ab15c4a440a625a63a3c78a13c261ac985767df4d637227b55dd4b11d7ae04650f53825bef53442df5c87aa067532ed90755b11233c801f454d0870296a9da2ffe6392c8eacbe80dec31473f9305a37554749f528001e95e7f3dbea8371e2aad5f5b497d2ddb8e29ea2803b9c3f25a20a21a21346fe53cb5ea887c2713649b203ada8c8c77ef80c12dc03349a66b1e5305106a7dc5de614229bc9f6c9f735e08d2ed96d4de96e52a6a4ab71348701b2665bc174b50c0cf901e863f63294a60973ad82e154d844a6c386691d4138f812a94f3456b789696f2e51d26cce4290ea16b78a2a51d4bc2a50f1a3747820bf9d81eebd9f5332bafdf265a5075745bdaa6b4342934d21c3131909963a106b9e1d848c782196bc70d4632f0f22400fe6dd3dfcead7545d0490c5f2c27df78b5d42590cbf75ca34c700428e1f6cb503e5002a2ba2a35f423b215cd45cffdd6608b99d5c4eb37b001fe68591fa2461f1e5d3ad5e03766f6ec958c27c7393202b139df478f55a17ff823300196cd006b8da43f49202dc1d5b9f2a333113e9418aa28dbcb1b35103ba615e250710cf100df0fee110fdac037c7f12630ffbc51970f8f6f20fc044dc5a300000000000000004a13480000000000a118d4af559143bf6175bdbf9b246ea3196456352a1cc3e7976a05713ef0722a6635f570ea7580177263a3ca9d0e530701c5c871a94532812e8fbf53e9531ab3a3bf8d4f7f81d13f884c553d97b55b04d0fbe16ce545095350edcdf8cec9d4b900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f514a77e9196eb269ad70ed6f6f8226007cfbcc71fd806a99071174d5871e5a123692690ccf0c8cf75145a155358a81abdd02c697ce5ed13c21a4a97b12939621778973ceba4d846c898c9b90e301f41da4d384ad6af0a9bf81b5fe282128140f078ff1620d6103c0095b5322670524deac2cf6a9110c2dbdc418584b499b669021201ac06a3cd2c28d7205307304cc76c358ed117b8a42187c9a0623b04c3d92c0216ae621872ab83a9f85b7b4e3fd2bb8780f39bd98046f6bf4e9e6adc6196ecbc0a054374ce3b54ef25f7ac214efb457d42925954fa9a03dc9d48364a857aea28f6c7e270c0ccced867677a990c77795d4386b412ca2ca5dfe07d8770e4adda4681032447db81fe14acce418d5bf2cf14dd311b0dd101c61023926da873bcb4403a670315e7d27897a78f4fbf881150500b8bff6e9ae981ff63700a38846ede949737d6020cfa5becc44a7c7967ffc0b655de7d84c8cc8c17fe8aed9ee88ccd7a72962841031d69e13706ddc45089d062deef33ef0ab97e21025e0f4f3817b975f91d13529d020650e30f0a0c1f012490767643484249711c810201accf5cc99a09af9dafb873778e489642a23eb789645154765d9e5446aa5105e3894b9321094f2e2e5b0f74050283637b5d5e8a569aba4dd70d9112ad1a9dd258636316b1a28828b2e027f7d55550a0f9576a53f02fdc5de174d696315e593fe1d2abd80d32dfbde5ce7de31dc392c0404ba0f8203db39dfa1cf054f33d289a5b4d1cad2c4963bd967ec5565223c20c530b67b349c0d5b60864ee5c175df942044e9a1c515fe7f90435c39f506b773977a5fd153dd88ea9ac4358f8cae2d35ef4ffc6cebbe40fb7dd90643fa4af8b0819d34d97eea474c106de035d6023811738f926d1cbc5604163030a89f36291d867af41c1ed49cfcd8c1212318cdc4a0a2fcc5a80eef95d85a72aee7cb03deba120ca6ea3c14160590ef286f549f7ab4e48b8301775d7e1dacd1572c86b7ecdf69b02cadd50792ed72a0348357e54468dcdd49996d9d7f2d887aa5f20d6cb3e2cbb1fca34be3354e1481b69aad9b90c1b72e3dee4e89b697869673a7ccf70d5e0bdfce2d1a085f82f88ea3bc33e75ec83373b64cec6d78635943b3f5262ae23680231dfcce1f17aedc7eb49df49bcaed86cec24e04a887e9f15139077065190e43cf3b404f7e9f1c3e6442fbbe9a0f9aaeb30f0aef388581e9be4c25af72959f7f67ebc6ea31af6bb1d6ef7199af9cbd9ad2a88be1416857925300dae2011e3e96a7714f5d126533d795bdf8e29939c1efe8687923c630eb2e6088ca2105aab1d884c6c92ec420e3bbe910da6791877c4d53266eed50f63b30ea160339929cc055f4c80bf79dd86fe8b8bc53db9bddf1c5180006210f7cf50f9383d3d902c0ae4c12ac8b0c441af3a32734e687f579df322e56be400278071b30d335b595b086fea0f979a5e6a246430d0230115194f38f6f6a3ed7497e569786a94d5284adb875ab1c5b7e0a9c4fce7cc48d64ba19152011e71d94b977459c944a03bc5cc9b3563abd0664c491758a0d557734f8ba2ff98052d36cddfb6c0c97e5b548fe2d05c2c915772fb321c912aa6468517a52feaa4f21a35437e3e550a2652ba0892ef06531298d973afec7a6555948a96f1e9178aee9d370cb57fcf6e48086acf919a44a68837f4e1895dcae1a3ffaa614650a97c2e71ff35f5f28cdca3b246a5ced885efb178498f6b46677703ddf25529df96e489728c3e4f131d24eeee02546021d058c9bf5efc618a4e9c02b86d171cb06b4473341dbf6b96302db2b652c14236f9277222575c289edcb52b18c83c967e3748766296c6135975911fdd27a2f801345ec56a21b776c25b3f37409e61a433395798199d1887618cc8a16078bf7bb1640fdf8314d704cfcc4b25d7f7908efef752780349b63c22c30b21b79e7388d951d7d9deacbaf0091c22b35162d876131f9d42e92ad453527574190369ae210260a1b1dd5d31f648ebe85918d3f423ab21e73bc073a6b3e0ca84263cfe99cfbd3a5a29ee7ad12b2660a63abf574f3d548c42be95911a8a8f65c778dd4c9acdbcdbbee26f1368d5e0adb582a2a0323ed1b1481ed014b598f2907cfa35ea370787050ca2d992d0e1396abe8a13089dc4b8abfbe5db57c766ac833a37200966e74acf45b1120a2c811bfa55ea6955c89f137a8de8f48f2ab5bbf50466d54ab2b6af32d73a87de929e4ec22a411600a1d058861ced85b488dd452ffb35d372c12160e9a1657b1275d93d3103c18905ab8ff71f352f98a646892019899f99ac59a5cc1178ee12dbfc70168ade061211f6cd685ca9287f65894cceca90ebf154d8e4a213bdc6ceaa819f3b2e9b73253b2c31561d58233f849b40d97acb45eea4e715b5fdaa0838029118e347d2bdea7d7a01", "51536a6a", 1, -1884582293, "3289b801fdfec111e4eabf7dc078af78d00d1d9207042c2c6fd09da5774c85fd"], - ["030000807082c403030d5918371c3dca29603fbaf52f3162cbec36661e03c90ee08b4ff156e0f353f0000000000300ac51ffffffffe56c542e79a72a4186af0875177ea412193a3a441d7263bf568b9855aee1d5e500000000046a53655346810e29fa27e066ba5004548753a0bf8bc63ad3fb458032c7c73bcf37faa2b21bb1b81b010000000152ffffffff01ab82b60400000000095151515263ac636351cd68d44e000000000200000000000000006eca500200000000b019620d6b7d3cc849911c674c32492930a19e6a758aba08dea0a7e13182cf00c930b4620a9919cf395adfa31f8a96e75ea11d6dc8fc97d2e7b570e83c8690cd4b9e99a43c5e4eb826688b6c8977e414a3cd17dc8d3e3aa967420531de704de100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bab2da5e1516d1fd7fe38f0b9436ffb2b7cb4c0c93d23c9ba617f13d31ab66173c947898ecc8abededcb3c6f7901d0ccbcf033b63739b0451905d2834acfea8fdd27fd227d1eb90113459b087a5cadbc66d6bc8bab96a5bb1376d87a3239c535b1d2b31f932c96b6a32f90ff745b8405e773973e3d270ec43d0b46f76b0e57850229042d5b3cc493cce342fa1bd14f20d8ce5030479736cfd2154717b523ce1f610321bdbb926f736c6c2c7439a18fe126c871430cfe766ee3aad65a992666cb7ba90b0677f7972c5d193566338e3f7da333d890954de059d729366a9886ec33ff08134fac4c5eb616aacce65a05ca34b9908ae331a89bf489d0f17c7bc1b8742309cc0320f6800692c39b89f7bf3e4236214e0879e19b5096696762d5bb9c3e46c2f83203230d1d360a69a1692af7d32b9aefbce345eb71d1e016cbbb4c8cc895d2a41169032e8c6e846183b9815dfc5031272ae14a0bb568e9f27136053d506c738e8be32a0317aad2e9decfb4d1fcc9c33a8c3386b7a84cf21e8cc94673b6f173ad0236e640033006a326de768f59c4b8128014633b0fc9f83e6abc4413960a4541c72a45590afd80d0929053f7fbec8b341257b1462923bc6a378c74e7110ac18a2c3b22406d0630fd54bb00879edb78f637c374bd8078b4045a039e2795fd5f7e6e68e27c947f283d035d2b51479bbe4e21a7db82d0f2ce05f4a32c0ef3c4e13a5ec307228d21b2417a30f3d126f89bcfe11b9b5033d6ba439d743a3e12a093cecf79b53f8c42caf41e93e618e17287a53f2d7c9487e3700affcaebca19f60eea43d347e967d657401f96df72d7ade1fad6ec4e0703cd8e68d7e4d0565234dc1bfdb9fabb5da90470de87a367cd5883783cdd9fd3cc29c4b83b03212c1c5116965019bdb40cee1b759409f5e145721c522b22f7faba2ed04dec17a0a39959bf44ed6084b9689944e6eccd8b7747a5ce56bdc374fe257ead5bca4e2097989b7ed2d837e6b133e46292d11eed2e577b766a8039307b51d4ddc34de4ba4b4549647b3a79841a5d494dc490a3d1fe78c86f5965f3ca309fb98a3ebdb5ffed1781f6421c196bac2ed6207a0c8117f5a3aec932c2832f7fb7d4aa8d4c99fe251bbe8de4dafd9f320bba6c2abf4bf1c97cb28dd221c304ed32fc435252d7f452977ff1db83c6d3a4c7acfe68d1d17ea9e1398c98b3a16b1e771fdc66eae2df871e6ea1ed30901498411e67646c47eec15314b326ae37a0a322c3980e39d5785ed0db356420ab66a79b47e6ae3d55cfeaedb4115286843da0f6a67d31c58d90282ada4ca8c1c8c7e5e795d794618dbd6f5df8cf91b94b4417e2349ab424a6a6803e672071fdee0f60d0b816c513e9fbd09d69147e3d783ae0932a925d95b45200df4baf04597b56c64cd72b7f73d008d76e8ae744883850562d9550336124092e1f355690995121b4694c8b41481b6ef064fe24c753eaea734289f4fdeaa6fe89127b2325018959b50bc73903666cb316caa2d31b13b9a9a8eb8f5daf981224362fc844fc6f44d5595fde3503f4c6d1df453886f2be6ee7818893b1e58467d0c115a12544a3cf7031627b6324982aaf7fd5ba01a56a5f0f4a96ff1e6104a39b96d259f12796afde13d72ced4579e10b91a9c8ffc65c27a04865a284d4fac32f8049ea7cae5a1dde8492e347ea582b5fa8ce92e519e6a75bd11c3d825c479ecd9a511391e03c33e2796daac2639af375c99958e3841625eecf4d9c578cc786a5aba533bdff94189c3e88534b05c8ae2711f03a6d0cf97ff38a0ac88802ba509e6f59fa9d72609412092501064830038768c0b47609eb85a74d71528ac1d26586450dbb51623a8c3a0ee4ad79b0ac3cc5825e66c6a29399fab2a8029396367e6e3579781ba77b2cb9bf786212720f4c41537f6a702e33fc44ef7c1d177b6ec556e66390da46e6edfb08ff6e4df59e49432dd74b97ab5b2793f21161757ae7a840ce93ada22a47f12780c73561ab5342abebb9b22916c8d30381d439d321ca44fd12002785d489905b0365c0ba66aab77dc79673f98b79acaee2377fd3a517fd718450a7cd85c217783ee7d9e08f30ea2d5480b00ac8a8ae4c0c004ed89bf4a35697a7ff75ed47778249c72b4b9a5a68fc93967ef6333e394811214c5f749a5c5921c897abc0b9e40485cd92d14151c6cb24ebfed9d0a630ce1577326051758adceaaac2512a6d887c596ba6c2f1ddaf353f3ef0bed9c409a17d9fc0d07156f5d65b96036b2436359c2adb3aba8148f021970dd40bb9536901c2b8263700000000000000000f3ecf030000000020e0b4b7cd5f83858c9583e48ab27ab1f600f65811182f9c70a3fba4f50294c2e456768a701bc62b8d4b43f44881319ac474c34ccef437c461558db33c362c8a2c7debcfcdceb5b1b2e48c240554420e6790c643504d118b340dfc11416511dd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b9a03614ecd3a6e9290120c40d53ad91c58c4b1775c40814d29469918be4b849bd0e2769dac4c48acb30a1514f148ed588a0c045bf5ad309991e9ab865fa699fa5b0689e15a1a3ff4be01d0837e19d2753a3f12be3d09e1d3e56092413487e2f7cf26e099dc9730d1262e89717a42d178072b5709d7527ab572a36850f641480228fc64a69b4c1e0fa91aaa4e55911b3a5ed850a72491cb05bbcba48e367eef2d030f08dae0f7a1f881c3a3045f75f7390e506e9035a10fec77250b03a9de88fca10b058358fdec13932f410ae2c64281952943be6c1166262fb69a66e6d14dad7cd32b04338d0f9562dd101efd7acc2e8616859ad1f0e852195e127474177ac4196202073a596662d917f9f73b0c89bc58407b8447e904bf06a7c3e2a0fb6bf66280070221b1529267ba529b24fcc6242e1689868f27f0cae226f519106c567a6b549ca9022ad307965bd4539c187d00dd9c1d98219cb321856ba13e9f51ce220bde42c248020e4392b2df33c11fde7a87d0b5778361ea4b5ea4b176c2a93f2cd25c51fbb7a2020dbd6464080bc4adebe4a7c5af46470529abb0eae7407b7386ec8d6671c9d38c2bae5f24c3073b2e1f7cd9f978d9642390283f7cf581b3b373c668e92a5015d62a353991af29b2af57383432cc2a41ade550197440ee706d034120723144db9c8040acad69c642df09cef6e0b9c426d8ba20434f73dc362f5f8d6ed4fc6562592e0b7ae8f0df43ca27eac0174246f906fcb57921dded5cae9340853c865496fe8f421ab6d6cfa2291eb7c876e488d8cf8010eb13b48ead36782d556e2b18af5ade8b015dacb428c60d584aa2e789e5a1e9480b2b662c3c5517e089ff82844ab0ba45ae41fb38c85aa9e6723d67c037a47c844d5dfee888a5a4bc1d472219842f5570e2d5ab98e2ed845b87d29aec679bc42d93a517c44e4e2e402998d1e55f1bf7169fed46f0b3d4bb8e4a0d8a3b53992313553c2ad8a739c682bd530b9d0ccb3f74cb7d1adbb1d45348bf44725a215a76e65fe50e11fded864b0ff6e7478d954c4282fda847e1106ac38738130bb011b0590de3c096f24fe553763079c923dc973bb4cf2ff25ffb8f1097991db4b7bf2f907398ffb25a16ec44c4621d6ba1bf6cc59b1e09116917a92e5a5500dda93c3162cece9db10c433e8ec904c4351ce81ed856a33b04d5879e7798c627b0ab1111919780a434ac2c6d898f943dfa28a6f96d017b9a5dee3e3530ddd67b3141f09e93e9aaab71f240d30fda4d2e29e1f040c5054416893d6f379348140b7b1c481da44cc74206da31a10b29932b85ddf3f6149324f6c6dc440654271353e4607b7c5b45768e922f63e38749c48c2c77885adeec0f96671d836fdfdcba91b0d348f67833923b773c4e494042f1fa8e3ea75d170b24680574905b5b8d545701341d3e28e3901cc3218820cd731201986ce9737385ee260c3ca947b8c585d44c7454ddb272673627383a5048dcf79c6122344fe3464f415bb831825c5edde2758634fff7c20ff8727b6adcae7b8fde8315e2a1dbafd5f0b6d419571141cb8a8d072a6c47affe3b8eaa68a003d574ec5a2a0924fbe40da3f2bd206ad9c378f55b0ef3487d992477c7ba78cbeea5695aa9d9440041cce18fd3d8f293fe808e106a882e3b0a424283b04d89b8f8ec12fb6ba95e2ccc1d028b69cbd66604d8ff8b0003b7811f1422720e69376e16e82a73f82d1dbe5f550d133a6ffb50e327545375870f96c061d0bbe54d2beee792c209c37ecdd6f97a510a632e0454df9973a08b6547de069bb8c1f7607ea8b43ff411a04896632ad9ce0c8877f1645ae1bab46f92b1b1b1a5483a87049fa2347f493fb92c16898b2387bfd7d86afbc9eef663b9d3c19f7cb6e3a531dcbb78929116aba43c233f34d1720381eded44cd23a43f46241c98328bd1fce138686949d04db45a7bdb3f3ce3d6f9a54c2d910f53974c3b272a0561a6b0332a5e3b2e443496638df1f658d2e92ec76c048cef007b72a029fa4efaa17dacf16a507224e51a1bddc9602a91a910e70dc99d1d9b80b5bc53cea723ec374217ccc3bcce0aef23c6cd80e63a09cbe5f932fb0d63bcc80e4beff8c4708de0fce0110680ebfb664b33fda87f62f73d9b8394128af94c52615f7e59cee4b41e09e118b8f1ab89597b05397784ef963693c85cbaed854f612b8612d64463fa1e3bc289cb820cffd11e7e652fe4dcd24769e611de102762866e5b2d781b87abc1453a02165a4e405e2ecf51d98e4d8910a88e438da04583f91fad5d01f39a65695ede4e4d8b4ee42d3d39c26667b708873b6717840419ffd5678b96a7618e09b19b7d8cd56b68cace641dc7325acabfec6ee55da97373c11cd49b90d2afa0ef8c2aa3bc07622b6d71b4da768e998cc4b4ec5364867a0918669e9742dd9dbe7e0e", "ac52", 0, -67442654, "e6a9d0b1b2e2ec551ba469a6ba2c2cb85f5d08d51a6e1bde529236c98bc59585"], - ["030000807082c403031f550a1dccde8f01af6c6225f3e6839d944b241625bc8596665891c3cfb1767f0100000004515251ace85f8d1f085a5a4fa3a8869842ffeeb30c9a2a45b9a09ee9e28628e8563fc992083560d00300000005ac6352516affffffffb0d27fd646aa5d3c2cbebfe4af87260998ea3b05f00490fbc89da44951944afa020000000753535165635153afa5e593035435e600000000000400536aac6890590000000000075100526a5365acd72bc90500000000076a6a51636a655315dc6a1dcda86fd20200000000000000004adc97050000000015fdbd26b9a3c09d776c6519cb714b23c0b9bed431343b8bca4228989e9af04e9747da1f094b9c182da8da3f8051176bf3db987075f569c03421cf09013b841a109c4c3eb2c9bddd20d8a6fd274bea891f1d9e0bfd8b1474a9b6dee067610fff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016beb788a97e77c3947155707a65664f91479631a66ce35f5b25a327cf2d4405f8cc0fe03288297fe26a366157aeb6ef105610a28adcd4ea129c0b675bcb807d1930ef2d4b0144c49028e4c7bb267258c2dc93ad48b7c4b258c8bd876529bd3e6db4f62d56cfe007b35fc28994c0abd99c2009f684eb33f8a5e4a139e7cc28100301ae82e4f811e5edcf4126911662a88f0260f01ee1652b61a8d595a787bc1655032608481527d34e0e98969454f595198f831950cbb217de4ae547e87e4a3c59e20a0483b3450c4a6fc39be7137eacee6b1f9c1931894d98a734598c50aa3a8f3396def93575fc700c20775b69e866aa43c4322200d0d6576140078b79c1802d91ed0308429f1f9bcfa0e1863bc4b62b56fe276508e494e80e1630eee4d0b99717ecdf032884cee8164779e4c7db99f4f78fc76e59275e0761039ad8da9707fd45e7731b022638a5c993a0d58767bcbda2e89f3c2de95f54fff946c2dba320d73c3221235e030d1220d6a7ddac379fee2e9fc4183083ed0d36f222d8bc97af78caba9b26cf62020456ad72424d0db8946455685ad3278db5379d28288e6e38be0adf6b81cb78a1c5f0a944754060bf8ceef0a9182ad64d224fe24b15d9d20413f44f7259c6cba0cc2673e4b926865af6ae2348dd414398ec17d0fc2bd1c57e19e7ce03e88dd4e8a31a7134c0360bc5475443c5a3e16d7665cc83624ebd3f154f24fd6d92c8f34ec2c58bd063355cda927b3e37a952e95a3e2d22bbc8dd875b93e220bc2efc7331aeb3089e93b0aa25d0d99c7b7af6972f64509e8f6dc04a6ef91f25f257f4c9721a302915b69468182cb2f293dc59892a2140c608bad2f0a91bc24bf1778df7dfd9489ab453c16e4cf7e1330b25e98e49c74e568572087fe699a1ebad483dcd65492c11a794ba53f5da1d6b9fab185ecdfa6330a7b4e67af8e286b8f2930bacc45cfbe8abcda67d21350c3ba6be0398ed84b2b50801d5cba20f32b0baa0bd552a84edec4e7bf49ba15af188a7ba003aaab38052807728c8bad8cec9a4a420a5a97da8f65dbf7ec5b5d3f0877de9ad263f2be99f7e2249c7d54d1e3c491b5670bf685cfc0b4d0c24110748ad95a327251a6855a34966bbc966811770aaab7d1818c84c6d7d45cc7721bccd07b8b70fdbb0a467406983353f7b2d34a6cf99351b0452dba40012cdeb1d8133ed6993902835df81f2405f249464dd13eb810ad0114a5aa608ab3650d109a6ced810229cd3f42761d1c97d21676b0d0ef131961cdf7050b747d154fed3231904e27ddfb13e6a4ccf4b3453c4c8dccecc0c4a0ae0f7e5b5817bcfd3e5aff18edceff98f22372921dd8866c8367b9d5c82a5d3263acebc7244cba4fe306e8fba3f2d0e9127ed21571922e0166e08b359c9cf28fb920677b7922bfd1f675df8ee631bf03c48fb76fcbfca9057383ee81db163383fb77a29b11b964286f64546afd71370ffc16d72528f6ca3ee3f3c354bd0a7b1ace0c6b217bffc12ac982af1f74f8fc2127182a595845e7037e4504e91368195d0f3a167daf840745726b25ad16254d7c3feecf2656c39e9aad54e4653c5abdc0e56f07301cb900eb9d2e0e2f698cf9df84c5d57c7ce2405ac07beb4599459e424170e6be013e9b66db8a4f992a12b18c44661995915c9320cbe790ca5634ab22d4e8c51ee16ecaac7a38a35e566cfefd4eb5c16b727c46e0beb95dad9eda504646f653ec11190b5ed6bed017e4d8f4e89b50fe3947434509637e8b1b56c44b08847269897ae1b4fec5ea430c94f278d22f7edcfb1863f11a4694571f336e08aec70c649e82014df4e24cece6e0d20ff05973bd61cbf50058cb609305bddda4495c97c228a827e70a30d8d45879aa479be9d0a9a1c6c84563556962dfdfd93c77a398693e686c9f20f46be1616f136410223c1c7df484608129216d4691dc40f12df035184f455062c7af19cbf61fa5f3602b2e074ac7519c316fe3018a9a0e54f7c922dfda669878045a67d424cc82b562555e4a53de2356019a2d4b4740b3cadeab05eea30272c9e111deca8327e3bea6256590cd383573cec70992b0407d66336ee5e6031e8d7dbe77a057c4d0209eae29ad7605a4cc4d31bac4af51aedff23466012d6c4db5b846892dffcd3d933c8a70a044afce5544a23fabf10aa8ca70155fc5172f885025dd885dad517823373c11094a8583b9d594829ca9ec03c1f20ae7041b683fa2a8a898dc89b595c7258d0853f396b80393d97750d6e99cae30183caacf0cdeb49fa141c3d6f4aeea112fd30b489090000000000000000c811b10500000000fb1b3985ffe663e90cd133961478cca69fcbe9cf2348a88deb6e91d9fa65963dd41c45afb27b38e5aab7eab126cf6ba145aa1d0bfb7970697fa0221b3d1ecb777214f95072e7d1c5970b572d5ceaa86959209c4757ad3b8b87fffc9d9abee76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1149a92a0bb8a765d7ffb734f6813dd4fdacb0f167570d05ed18db0405cf6dd8685499d0ec65c98825a3753a6dd8896beab45e1c15e251112ce3df46ed4c93f9549b58ae76d8cec20797641ae9f4a482e4befc08d6409e13db4ba618866734b73db8e0e0e6875fc9dbe67e35fbc423bf01421eb566493222c9797a84c662902020ed31dc0a3b5fc891299aad543ee815a6979b8fc149125566619468884757f7a022e37c4e9ad074029f3990bdc2d09529abd4df678c70194e514989d4c7df5cf640a0484b35be6104c57589dcfb0e1e9f6d2eacf9bca99535f59e5f47e6f2515e670e6a54d23b56b1497eace5f031cb57f9c1b8ef68d2a3844edb862b438c61d03040303c3fce79bfc415806b19e4e52152b049d2ee436c80015551ce8cb52b4fe4de903145e8b3dca867aa790e4c68c35ee6bc6b4cd4ccabb78e7852bce4df40e39d6a80217645c50aa25ed5dc2f0a535e58e7487173e25ceedde79e20091a7257462f88b0313e4ba859ed2c0ecf680149c064bbe4ac38430e9d87a62457fac38e2740e1d4e0217291dfae24904eb91a32f011c107dd8831ddb5602c221930af92e202026c38359a8f20a3ada57dc2e24a8cc92439dec1f93550fea58ac57a58f37dcafd16d42c14e8c3dc966618b77ecd737fcbd41d3d6225b64887dc72a42eacbfa7f520467bc0c7607ec322c9fdef8308a2d8700aee71753c4de50d3d5fadd67f8c7e7ce7af0eda3dd41c4724d58c010dc4a9b7752d97603a71f094628a39dca65be70afbdceb5241356dbe886bd7e48382a01fffe0e247477d8ce804910ae3b7c53ee2df0671cbe32adf5c9d447602f10461a0e358e6b4fef2d8cb0224d54a9d0eea93289114b83bcf1e88291a9f7e1d20bcc3b51dac1684dafdf0cddd734437bffd2a4c85022e3d95e8901dd77ce697c0a6cdaee1a5fbcb56fa2e06589925d34f6ef4ce6962cdcfb6bfae63a69b0161fc98ec49591b9db4a2d8ae5ad903872a3800077bcc9fd3d2b6911cf0f070dad584b2a750e0fa550239472521db02aa2ad07299f8ebe864fd89109374494b3b3488a78588eb4165aa3dd12e3c9ddf5a61aece4ec14885618578cce249a04919cd6c0846293fbee7d4a90225a5a6c9ecf20291425db03eacec741d1d2d313ecf7d045a037561d56bb9564b83aab3b4e3130afb12e9bbea91d43be5104a8641286446f965a7c4c2cb6881828f7a44f11dc06930f4afc506eefa8930e19a2279c0a91479eacedf69c67115b88c72331115fc26ee0294ceb8074f5ebb4cf0ea93529873180d9d5a5e09e25548e395d580164093fcb569fcec0f82694ca59c7827937dcf3e7c3ca1d6615cd7710578bf482c20e77c8b02f0411887cd5b4dc1f180251109dd9a10137ad74f890eeba2500bfc783c009b5ed81324f77c41fd1e0c0c8b41d6f93ee3fd1bfb6dcfc349972968d1dd6146453f23c2ec6d2c55dee8a52e10071481b96995878c4e7cef91e7e8c78eda08a1d3febd1ced2c1a1faf4f113f8324b74b4357047332bab01db358ce7467c40c5e8bb2d9f9e29a633d96efcc5d5a1807857d1e1aca2b485c793e3e4c292e28764cad22748eba6b8a087e1004aa64a780823923b6a2876016068408a766e3e524fb16c41584d4000b6bde1958ac806064930d0a0a54b64bcd670dff41c10283fb8b345a2e8e71c840efdf962d24d5d2787ff4300ee39dfdb01c1fcaa480dd499b6327a75afc773057b391142d3c390fd5d59225b09675ba2b9283d0d090059820800251ca5d843940834d7e11e25aaa8d0c16686367193c889acf9120e9fe899dcd7d744ab1f5427b90a5748ffb30831d7f6c29613ad2e639b303e61824795126631e4fd9753eb459997b5a72a8ecbdc6768c5f251e884599642354da20fa021da8cae73521c5aefed5cd40260c853e274a9431b289e417e52c0b147de5a6d28c8b1b1293b802c5eca16b6d2bf59c70d7326551596cf27aab20c7a074d69c2491908e4d584248a50091c0fd223fbec13369b7b01b4e8a009f11e81400724328cfd9b384e3557c5011bca8bfa8d58abd91d3b98f58e9c4f1503c5e3ad15c2308fbb8f9f5781837618b0eeb7c822ce6902b9bc69dc18f05d8e6d1966d2eccc751609ad4549971c7e957396980b2d2d0df6c1757b146bcc91739f4e8868b20b7964e18c0163f89dfc8db39c7cdb58866c9d577d71f49a3e6dad2baebe2b2efc43dc840c336e08ec1e31989147aee29ee484c85520d64e228af8f04ffcaa05788e6b6cbf00e92773e9f67bdb3552290a0a48ef14f31080adccff04a8e9ed98b057169db7a132d780b02d05df6667fcb8a64b56b95c96a89347c9de2bb3287381c2069ffb23e05de63c00759be6682d54078f0bfa7e7a76a1d7c91ab97b4f7fe8689410c7e0ed10930bed39c4c42bfc7ddf342460aa202e0e", "516a52530053656a65", 2, -737874743, "4dc999d82d7f077abdd3c4c7afa2e4bdd1adbf6f7f290f4118998dda009c67da"], - ["030000807082c403020436c11fda1cff413dbec6221271e36d4f619593a0a828f8fe9dd21b26b12da7020000000153ffffffff64fe35c4e2773816c1120c88805b226f7cbf6f9fbab1f3ca236b1976218961ba02000000056a00acac65b7c686bf01339b730100000000070065630063006500000000ce370541010000000000000000b7ee300200000000c960f810fbcabe14c7e0d64b3e7a858a0c4d1b1d9a344e8b3a97d1070a2cf5bb3126445233d14b592057d74575e8af074941cb3b4493fbaf59dcf421c4e81479282b091ce2f3fb1f429c9dd53b1aa91f9879fb99107379cf37d6d5f5dca256ea0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000095c7b53c380514238628b176bb08be9b6557e529b4e9c05d0223dce782f091b33156d4610be802ba910438e465f572145dc4ef78da861ef27dc3979ab8fc486917fc395137108953abcece9561c1906cde83ae222c78a1070ac56b68fc7afb082f896cef4295e9fb789bbff241d1e67da441302291becb3886d4c1311d2ce33c031fc33437850340a67b7e96dd189d829cd4c828c7618488e6d26f3dea8679a5a30217666c9f6b9e0917b60f67f7238b980d73e3be82347d1cee169521a86e04c8500b053fc1eef1cbd358683360c4c4cf56b9986a0a8311ffe837987c573949952bac10c868ffdb804a45c438a5780f74f9220b018a2924950004351b0a29a720b760021a57c0d13d1762fd66e73607690b2be3e46652ceca5579934a35af30ee218d35030e2b0fdebbb55169aaf4bd9369d7da4ce5f024b1b0ffb8d001eaf0e2288dbcdc022d97d52e766bc7385bce8f73ec9b24cbb8f790f3820509facefb89f7850a6e1903038b29d02eaae5e14d7a5a9a586c0dce54ca45853f4243848c6bea8d914eb2e20203ea52a308600725b935f804a3c80f6fe5372c2f49711dd542c6333dd8c481f354b0738a7fc3c7281c30e0437ed0ec2a1237decb6c38533f01cf75f693711edf7d917f81700e3fe96109ef3a19dda2f2e6f7c44ec909cca2a71642e3ad2dd932ff429c8833c9c3933c3b231e4b9525eded60e390705ac8e5210145d36971cad4ae66662dc071d2610f140e31634599c57063f2480767914efe20564ae76812cc9c55ac62d0a1b094337551328473705e46db3d7c3e82256f5eec1c9480812089ca850a282cb1f22955b4315263121a58a86f7bc54f2a6e0d4d3ea5028ec27992ca64dc587b2c9fbed804bfa769ee5034f89e533d3676602919d0b1dff94f85a224be84125da5fcf1b63b31fb9817b606c1a4cb639a29cc99717288e70cdfb5ba7bc5f00d66a98a3942ba1c4487ebf46bdb6abee023dbae553b50770a74f7c4812e2898ab5be97beaf8aa49b0e22887d1eaa95d558574e1413cdf0f0b31b06451f7e3f9b9f2901629b96b56cf488c6ab4ca5dbb8a70aa06bb1e68803d23290ec5128e99d8ff76a0f849bbc66e8a15e0c8ff30c1a8ded3bf4b0e43e27ddabde419070d0e62f297d24daa48ae3cb471b4775b31d90a0252a830d04aa9983dfe070ff892371c7567ac7604bee789276a834342b61afba01035fd1520ece64d9fcce4ab100c1aa12cb6d502b6d010d0c3ce716df5e0a37d8b0e8e8a009cb1c846331896b170815380863e9dcbbb2a23d8dc7c1a974ddcd3f94c185e9fdb0f340436345b7154f0c5adb4a026d301f560e5efff548163208a4d172950605063aa3efe2675895241601a4f2dbd8cacfae0f18d9472f16a23fdb22c09ecd354a96ca697413f9dbd016b195c5640bf9eb5a850c9ba4cf174ebf0422d2ed0845cedb39a61de358287173c88191ca1322f920d02c3b0b5a2e1cf4d584c543591fb0cb1511f157561146264c502bfbbd20a67bd5c29938dccf10d7fa9fe116f6e4802f0eeba91e20342eed0bb47cfdac9564900644fbd5a6f7e629fe3581b058d5a8601a5f3f09dd000306b1f6ce1f105477f43225dc3431566bc567e4be2e87be8c1dcd2e162e01b6e46a11d6a20c9008e07235dd5a7eb6f8b0748990fa13dd3befb6f62256314e3c66ea9c4aef1787a3f73eee8126c5667e8dee896239a36303783e56d01e58c1392a8f54d4f9f6958f3e7cdcd1b92155065b901e7182f232994e8f179d426ccc0bda2de01d514df8d087de1a706fc328653f8c65cb57128bea336d21e0563ab966a9961f0e152588ad086aadeca354c98ee73937b499f978528a4afae59fa9e600a2ed1e31e564ae4788c1283d4839cb82034d56d25feefdcde1410c556d64d198830de1899a1dae871254c1fd057eacaaa4b0bdfcdf001896ba9ae336f68ccb5d2d234749ac54cae63ef42b98b664a10a1b478376c8b74d01a05f17bcd15afe7a4b89f5b9ed484531f64fc77af1d44843d76aa876eda5ddb6e65af2e3c9fd296a895db887ff64601c1d9a95df652ace0496d1121eabfe027e679dfd2aa4f076aa1ffa6f01f597dbd22a9cecb07efb38f2899cd21efeedd93daf5c1369e7a67db4ddf9a122b5a78a5a75e478c495e1ba1ebaacf66968784179c9408c5a6a2954f57772b66d48b69039317f5e6cb9f43c9bdb18f87b060cccc37609f9db6ba827c3705319a8bc36695d35645912093a230d27b9c6f71919f5da19647a80d489297866488b20d5e5b96a71965651606714bc3ee6e80b655abf10600d02bf59e21ae89bff4925301b3dc8edf3ab3c9bd6ae6169f09cb20c4cd66bd71d3cfe8029b3e43ad5af8996657ffe78f1e20cd1597b6aa66578e7a7a0cf344e74244e3d875a41a9c74f476253d16809193180b300608", "5353656352", 1, -394093438, "8b398c609472ede6ff0b4c38af73d3ec42a09fe3194735607dd0ed405b25a3eb"], - ["a2c17e0b030ba1f8ee1c5cd01805560fa951b1f7d2bbfecabde8ee7ff9b2ee4db07a6e8dea02000000025163ffffffff6bf4826538bd931404a76762540d112a5664d353a2a01bf15c4ec9e2f5591a8a030000000153a15adadf227c03b6be2db2bda97b4cfc99b4ea34020dfc39c2ffa0e3fe0858ae23d0c1990000000003636565ffffffff0234fde103000000000263537f350a010000000008525152ac00655153000000000161ab7700000000000000000000000000f7756dfe96f70f41c90d2ec2f183de7d9143ad31413de8a692ab8674331fbb8d19bd34d3bcc87b156265ca1d4ea2049fe90045d401a7e2a57bdf345663752249571cf220e9d72751242e587e36557d5c3124799a91f23dc4450316ff866e804f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004ba636127dba2f6281864965e09638c3990f97b7bc8dcdb03408158570d116ab4468ab8fd3da2f35161946ecbf5d9846ffbb2f08d6eadae7f6449d53f95e4a5f48475d3c96de9f7d3213eff38654d32d554b7d3bd07266533e83184f2ab42ca8644097d4a61540ce959ef0c7063ef8e1905f21f957520d51e9c39fb0dbddf8e032fdd5bb6e3b4f862ef9657b64bfd29367dbd63c2395b0c8654dc63bdb79f9bf40317c84da99c49792ff883ff3dd116618e7c6226695c494a1f205cc78071fe3b330a039f97a4e0617c507cb81b8e65eab65086e748068d0964bc15384e9bc32999e760aa41bebb55f35f6a850fa2d863cf45eaaf7fcd3cb62c51c015dbb5948011c60206718ac7103b1cc8b57052b07ae723fce74f80a7cefa408c567cce789d2ff080032d909c37cd2d125e5ba86a3c97e6f07e732a4bc2289b6a3fb3115f0b7b0774b603042b3dea819551bf73b8c2ee51e1f6be73709597f0f7f0b519bcb5346971f98b022c50564d1f396e26145780bce84179e32b993c0ff2e663e0f76df69afb2941f1021232c92980d3104e3f26bb2f8190e974930fa308bc1884404c7f2af36e736e507aa0770edad5cac333db03ed7d88d768aa48f6841366f8f2064f71d85f293a4d3097f8587f206f757af38d3753938fc8f5c42bb4011d96582ee1eda7e2803ef448ef595203b8d9a47690256ea23a5240085622089ad5e1ca9a7e048694b04575542c56c2c12a21bd79be6ff6d83be3d743dad6b98941d6d1a808084404cae032849df65435323187333c66d01f61b48ee62105a3b1bc0a85d2871d51e16fc90477504c11205859f1d118c75e4cf585ec1598a03f4cccaf714f3ebf0aa0cc79d8ca55320aaa556a5141de590643bcc12b8295a8d6edc3b2bba49f8627c98d83f419f95218a0e129d3a7d09eb01011a5f107e3b7801e00262db11d8d1dbc5c874132b77306f80e1b022ddc11bcab62782f43080ae5caf09ede513c27cb02beb74ce0bce6a9a9ea3a67628fdea99b7f370af92b3952d27157b9e373864f842bca23738518f656d52527a5ddbd7c86a00d78d67feec6cc942459ce3a45514351c066ef329904202478fdbe8e8fe41a0e6d3167d700e73e25739a2d06346bdf161585e2a1b1ef687039e6b0c404c3cc105a7447539207393d4421792b90733fc3798d5eaabbfa74ad18ebb353ec10b40dfc1b5ba4233e0b4b21acd35623a137efa0e6d5248b2ba9a239bf5a5648edd9eb918307fc2dd446b755e40ad3102133bec39713429e65366101227d8cd731eed503bf1358bae8297f82efdc4eaf9f8f909db4124c94a2a75623a72c344392bad66808e26035f60fdf925f607f135533fe256fad38e389e22c014e8d5aea49187e25fd11ff1ec8c5cfc8b18fd761a541b9c332a1db6df684c233ee8a84482afec041dbe7c6e64e5080d4fb37be722a4d996bf2be62c13c79639ad2a7b8f849887d1d2f45b83e2d7f1a1c7d825eec0d4586ce8064bb902bccc29bc0cb49753989e8c22218fd035d3f0b5d2841393adffdbcc74901c7b3805a88ede8e189ddab0adc5d3d4893d9e89aaa174bad0029504e0e48adc2d01e6df5059d0203f5fe93b5046fc1b7485ff3841e611ee71693449956dc43609aec43fa71a8fb478451bbaacb869ad193e953b9161e85e5785ceeba60ffaf8587262893bb71f882158bbb602606949f30841f4bb50f694f860a7c6d0e46a8d0422432bb1711801e19c87aba989c577023139c505ef0071ba84d5cd5ac7b94a0ed99d80955b3a647707c26377b3445904e04efe8e236f3c7fda745e2d4f4e9727d4b86b42c4c14641832214c1b443b02ad926335b4ad04ed9757c3e497991311883063c14feaa522fabe87de0933181f77071ceaf4a1de73903bd4c93cde841a266bfb12bba6cd0f199824adeb3aa282369b5660c07f70eec21f04fd07a965cf248ee78713f6ecfba1f7e22288920a2cd08cbee367f4d0dc497ad7347eb4053cd5c7b59ff3a4326cfcdd889d3427deacc26f5afbdb8b0f29da08f72962906d17e11902497a0bf17259b53643736e5d9f039d6d7ca742d6c3cf2556a1cac78f24b0fb46d850f47c01264b7b216e7985a6a4921e2e677b728cf3c2dbb78295268868c25b0efdf568eab97ed7ebfd3302355a79130f55b6a8da595b9ffdf0ceffadcf2ea0ae45b1e18d9ca3cfd8201366a36211eed23c71ad71451701c7dc9cd2d89b2d7b6edf56179ecd560c27ffbf733b3945ebc265ee7257ed9cf4537c761c2bbf0de0d97be924c54c50544b43b08971b28e6c4a36f1f4aafcf1d06b7909d8e1d8b6b5751214f21a105655f3b586824d24bcc911ec6b75fb93ea3d68f245e69de9b638e8cbed546cbb67be399483902c4da16e2200dad3a8f89c41b87bae30c3fb5f54818a13fbc56e6b70714b6443f308", "515351ac5265ac", 0, -1155137881, "f432c43d014d1716558d50c079de9821b09274fccc5946762089734309792f28"], - ["030000807082c40303c380277cb6a00c6d8c7e81ddc7a4cf14dda0f81d56699de88f7235c5c7e9703200000000070052656a6a6552ffffffffadf2cbad7be0a7f6c09b3f217fa8f28018c34df6dac9f095299b9b43faf73fd10100000000b0ed39b4f38c6f3aa3c3af0d4e9f2b86f12fc4ac8aeb44e62f9c1cdfc1078504d39490820100000005510000536a3155e77d02b8fd2200000000000451535251840c540400000000075153ac005151630000000075d8b15d010000000000000000253f5a000000000071f4caed00f0947897b87418dd09c7007faf316e5c5d6545370e7a8270ca1bcb605386f27fad244e49c535a879eae03831c6dd2973d6b9c350ab4ed6ab7aab278bfb4b28d7eb77a98a99539a9156ff8dd6a4e3525ca0f45e6b5d1cb4f673164d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b97fe2a20c410c8009dea4994c3b9df62155cc57ccde5f3c62af609dfd610050fa07584d910d910694bcdb7fd7b0be9f7058eea635aa9740677fd7113f7d5de20c64ac998f400c902b13a9f97c22367368db468c6fef77f6ab8602b7800d96a684ceeaa87c016341ad399924abfd124fee5c9a6793ca7a50fd62d92d161238c022e4f9116a33ae34aea7fccddb1097fa1c33b2aaba895fab492f6f7e8f34a9fff020e1e017c2aa79fd95a5b0f1942c7c71a8d141669f7c46a08286196b760c5dca00b021912756891e489b46e0b82896132ecf4b579d0554145bdf6881a88e27c502e8afd9f53b1825b49725df1abaa5c89aeedc6dc75593a4c089a364aa8b224fbbc02049c5202a79cb576143dbbcc72997f30f590c04ff672c25bad14f34a25d711ed031e6c6a82da59223ef0931a3a43fc8dd5e5b3c49210f1bfde9cce0f78be1365ad0201933047eecba381aec86401bee444a35b8d461f8f26b3a10669b0005eda3143032403081a37c8e9d222e2b9ab41eb4639a45628ac13f757bc2a33a478f7231ec402292acae6c9fbc09446632fb989fa4718583253e1f5f1efe312895908f342fa6c59ed8b0e13298c663fee1e943beac7fafa8530801cbbd43f9b3cf0d30b4621fb2977e079520ee97d691cf000e6c7c01d3d8ba92ccf47cd7993aa77bd89abc406e5b55cacea9a7f0ec166b5bea44b478ed928a0f83a85b831b25f51c9ff14ae88d8ae135de194bae7ce941fdbed7e8ae131c81a084d4d7bbdcac6807822cc38f6389f38fa5306f3da644567124699431e140587cbac3441fa96c70272e0484ad8e85de02410d672cf619a8ef6ed988d12ab96eaa211c330ca1797642711a230b62bb41385e4d4c83ad93ff86589ecff77a3e17c193015c430db2264565fc554f114a490d324ac97d6df45277fcb5d8cba622f48f2941acbf13c6589dec14ec6e427b71b62a01d126b833c6f39191132eec59a3e372c1996626c77caf1494cde3ee46a15454ed626cd1bacdd6809f968edeb16bbd2ea592a1cc766270e735f9106c4424de7b54e4bdf73202da364f3fe7cb1bd7a0ee2f64778e0acfd984e0060d6ea9ddeea65e01544000e08c4baa34abaa7bced20692c68cb9768a24890ea46d95543ca8d2b5acef803e8d86a128ed01044503e341682287f4b2c1be5994a679a56299d6f91615d2df7e560ad1a601b6cea510a10934c7720da2e0f38c50b1c15c49975f20e82727e45e20a562fc2806a4092f837370d914b7eb0dbfd20f227ecbe3f594b345ca8bf6b3f9f5490294ebb0b449935b329a80f4ca5577c1624d342e49233656b87c4edaf9980f6a4a5f26c0b2d01f190fd23ab817544bef138538d3e07efa1826636311c7d5b805d1e0ed1071a655412e892e169c53abd15e63cb630f920f98e6dc93d0c6e4f59335d0ba45b1d524d6a184ac0bdb246352603849dd7e16bb6960e6e2080cd7daa172b571ae440f9eee8ea6ee060fafe1a0359ba35a28fe110f974b84ceb2883b5b98704b946b330dbe9c52d615e78a9e88adfb049347f3f377aadf664989faee7046bd6476537f664ec1f8122ec8561c38de97c1efb7654f463a0b925faae3f3afef50c428cde400240470c0a9afc76c3f68bd227a7979321b66e63c81d96571d0427b1ce8bf246ca1b5196296b798ca82404ad0f8acad1301b2390829842d835c5806578f8069c660966144af7c338d026452e4367f8ff186a934e2a09d58d15565d0ef7e1f37a97f3e7e92e651e6a76443959c27731229603f396c6f27df6ee1b2c80f09e8cef8e0227e823607511561350f66ccf07a24e3122a8ee9aee5550024e5495d3eb551db8b86b5c9dc569055534ec8b8862bd1f9823fc644b81936aaf6b79383f1ddc235097df4003beb3486b62c6b6ec11e68e382ea7a489af0454e07ed8cfe8115d4bef3ed294822e06aea333f0edf4613fe9681c0788fe42d9718c2e58e0d23022157a9a0777f656e99857083040089833049d093a5becc19feb8acdc270221ec6ce2a86ed1ee725c0ec6dcb7dc344417d8d5b194b320f518d2c6e9b872830dbd3158d53c23dd1f9376b5bb1591423b2802520de15f336a780efcef99bc4091402cb1b35f58ad5180043027d6ce627859bdd5f907d71602fa29ee10d247a5cbf0fc04a112765df09ee7e6155eb38afb73cf56bd60ec824a81e5839d19780b6ac8fe09488e14ba9ee3e73f709976e2a9153b4e8fac0efdd2ff99d2e5e3314bf1873604e8507fae11bbb207afa9d247f67988a267b100d61a4617afc1c195821952395aae51e7e0568cc73a00e4356bbbe39372f4e148f83fc6866c1bca2b129f396f2288ce78e83cdc006d379a6d5799fcf7a7ced362c675afdb965fb16773cc034dd92d065f48ebef3d4c782269493cef8783e162d06c533bae286c9ceb3a606", "515200", 2, -832650420, "06c5b2054173bbfd085356d17ebf2b65b3e55b3d455ddd9c1e7b7ed7639f761c"], - ["030000807082c403039feee03dac456fad1219ecdcb32ceadcdd951b7609cf1482bd22436d5e9eed1c020000000552000052005e5d648a3b37c9488bd56ec2e21137af92ddef997bf08e23e80008cef7a713fba6af770d01000000066a6353656353ffffffff4b6ceb35304f074f3e53d3b72f8995c344df18d2bc3bd91f3943751b9d035fa70300000003ac6300ffffffff016f8c380100000000096a005265650063525137adc8e100000000030000000000000000da6139000000000029dbd590e90c006f14c432af4a84624430d0aa5f512b1f443d0565a8e782a0f639414b0dabd3fd68b1b2bacec72bdea0e2fe590fff0a13c713e2a5560f004381e26a43d5e3a45b23f9ed1efea0a7fe33e11f26029d5332a1580809dfc2ee1931000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007903acc964a1a9336749fabc7198c553b17862ca23e164fec931c2b85c0779cd91972cdd1f6e4dc04271cb32b3af476273cdcfb99f0a6752fc86da4e8d9beae023aac4a9cad9705fd0b17a7209c80f90e77946f856d86ef617451586b1b742762a1d30648b6f99f0fbdd0c22a67b7878bbd077814835c93adb45e991ec7ddf3e0213384332330bc1b33bb0b336e48f8c16ebac1330110668e99859b5aed5b0a53d0321b724208930be0ca87e2eba9dc6805b1161d0557a41a94fa60b2d49689462e60a0217606d7fc1cd6e97a4e2cb6b2843d252a7ca72dfb7b433f043cf8d1f47dd139bc177b40231d5eaa614a39b6da9428bad76db59bac229abe7b4af2172c8329d030a39a949e1367c08bcfb6761e19282d2fdc1b974596c3fd6b2d0c54194dbcccb0311042c2b79f902543e0b04fb1a465190869c432353b6d3b0aad502483c173616031f9bc93b7cb510404bfe488296426c0b92b240903dc8e04d761fb883eaa75b58031fd34cc44a1f1898c848d13df9d5cb127fe99d9ee4cc94421594c7fccbf18b240226cfbb111b9f5dc5e4c7e51cc4ef4a871acfa275a85350b2ba747d1ca044e5dba22f7238154832af3678d8bc22c7ce85ceb4b21c47999ed03777e2ca2978d9579fb14c5ae6430c2446558df72edb66ec583c2d62f6b4849f9ae8c080fdf72ccfe336fd9fa06bab827af16f8ece7d32e41c7448dd0734d40f2f7cfa321194c9025f45861f280d9c1183f4359a877d0f9b53d7368edfb53975168882ca4c4b5fde028a6e60ed8d3be1ac72a689a1b091c888274144798ec268d979f20dbc4447c36c53f9b7cd25b408b4f150c8b932538cc8a28319823b09dee3ec29e5bb18bbc8c44996e9035f18945e0f06e581bf242c73f913cf9932928fd8d91d72d2cd96a73e07cd9a25db850c403304bc0c572acefdeb3f68508144f75da9bb0c17c0940d745b798c35b7e467d57307fcddb09969fd89083d18a65d61f2f672e1395f85f2a718193f0bba0be9a50e5e7959d88299bc12e3fbb32f54aa8e72d05afa8064f9dcf20ee7adf23a1cac9a1f4560133c5686e7ea89bf063c382bf2406ce7c1f8c90d20df1b65a8776d159b44cc5f0ebe40f5cb816f2b9091fe68ac2e9fd286c4e75dca922a1f058339e46337ec06f4237a603d62c4ff0ad1523ed9a366c6ead5b277fb0ad82f4b6a108469859cf4909b71f7e4a95a6e638647950487847f45214fd31ce616f6272d86914eda5bce17b3943d8a88f951b396a0d2f01f85bf5c35e34aca06afef2a6d29e2f9cb989bfdf4b09b1e8cc76801427a453aef4faf1994e7d1008b8c2e53ac0696ece863418e19e149eda8a8caed3112e81f52d140627edab4a97744f0f0d7accb7a9d8178d6ac5ac04dc95254065589ec16cf19809145213f262573bc2f31a089ff3488672842ff92115faf5f1e32ba8165290ff3e9a6d1c44686ce15fbdd784a2e61f9ce265c882a25184e7493e1c5dd33a0b29415fb9974a991dda9894cd0a6737ccf8c5475515b3db778c52686b192ff2e1db7410d2cbc93b51b504e6a4b1ebc1fa60ee9c618ec1ebb15ed4723451c03ee56a1208412b0d3a58e9a43ded4179d4abdb18ceae7f5a4f9f54b840ec07afe04de39c7b4ddf712b7196e0c3d53a50ab5d704c571424b2b038d21f925191b4b39e072d3498ee6cdf3d924190b75d02adee722564dd68131af58017370c2bd8956a1ea72565a7f49e80f3499181ea96d18a9ba52166ee9db51139106b07b93e6f26cccbef338c61eea86ae97141056c8135a1a8d1a0a0dc31f7c04236e70be7e07c5a4500e21a5e42f0377639782266fdd2643b9ec52c426ede322bab7a1680bde70049bcd3709b4dd9d4bc296169476a42bae82628f80a8237ddfa363861553e60eea9060f7fe61023c22098b4b65a334bc34b80c0173e4e0a865685775b49723b5cf46af1c6d8fdae3de770a0a5e38e390446f98bcba11343e889598aa8c1317c7a91589ca56ab7151161858886ecfdc1d0ec0cb775bf593525c820d74b820655d7219c76a2e7e66b6a04375013add1143fa495a46b97034d5faa2b1456c4ffaec6d8f879addbc32e6f1dbf5f33b8f1dce169525428943b7697ad605273e895e35d1272ba1a4189d81530545b6b41ce73fac7d7b235f0a457b92d0d02f67c749f990a813c13031bbf531dbbb3b0d8fd7c738c720b2a502fd2eee5b09e4ca146995cb7799bc1866d00e0ea26995d12728ebbff43c70ccd4b569dbb7dd20c138c7e77097fb0ab72110c3e749ab3e38460553efd0ea78318fc31df6040000000000000000000000005cb12fcef9ee75dec43dc8a8a4bc1a90769e07ca650f8916d9d7ad7852bf6ee855ad2491940158668e67ab63fdd9156ab832410a603ca81a11a0fac8b7a3c038de2caac4e0cfd55e960426754afdc641a359f7dba3f57c0ca93047d9ee55b19d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cef7ff4780694733fcc5fb95c8cfac544701907f316a6c770c1b2e7fbea32420c1cbe4c4fa7ad89a330e377cda87b6f9b06320aa704dfd2d1c29078655f58ad99820cd2935bfd5918ee6d10f4fc3b919b70177ba54eff87920eba99c68157e30f4b7fef4b589b44bc0383dc936b88c554c932fdcf28adec2c3d36f7f8eb70d2b030cbaec0ff33a147af14d6599edb32a3d3c73d9cc79bc1fe5b62d96ea1781e70202235b505ce6b82c99010e6b469f14b0d80d6e9ac7398eb4f40f051c705fe07c9c0b015b650f80dff095cdc90f0365aa86e9b9a6907523805147f7610e3f2c69abcf66a9bc9a134b3f907f468cf5b5497dce0c11638ea2628b0a574435086e89802f0208f822d30a932d48fea406911b86c57ec4831ab5937d3925a438e6a0acdc0eb70310822f922d8e4abd1be98a939c0b2778e2178cb33c8570c6562f91df7e415b9c031350ff4a3789707dc5586d321a8986dee44d776caf51f68a6c22f36bc6b44d22030f3bcf00b2507e5dc5fef9479045522f4a5edd10b6eed54cd9a8c93c0c21755003234765b45d6bbd27748626380565d58d9f9bd7c635e453f78381af900f5862c8bc9bb736be67efbe85328fe11fabef987d7086c97788434b2cfdfa8f0b2b74bf1276f8b9165ce83371bdb1a4df9e101eae8af5149c4e10eb0057e65fea47c469abf97d3fbebfc2fddd9755c7aaf71abffa7b72da2ed0ddabff0dfecdc8f98a18c2788d6d0a008ab9a1d5db2f10b8625a61ec56764d0adda736ed377676a0616f6f2b9f653f468cb6e78a14ab3948deb03dfad2b69ae6edea7b26e7787c6dd334d7136dbeb3c8506887813cdbc9b01af9aa63d3911671f72a4e2543d1b707126236696dc2dfeb3b0992490e6e548cf8262777cb10b3920f77eda93c5dae8e9ea16143a9c548b1d28381522c5c60f7eb351cb1aec21c93aca13ddd26cf8f9485a5cbfdbb0a2c0cd6d758f8cd342b2325877d0234b1a8af745e17122821c970360c0c7d9ff1a4ec216bb44c5f0dc9db38a6eafc30640c77a58b8d4478d226cf53851f10091d02d411ace7d18b1b35d31b8c7998da9d35d0bd8dbbdeb5aba17221156669f9a0795297207a7e06ea8506f92cd9a880167327196819482efcaae67605f5f0d2276387ffa0180dd5bd16baee6809a90dab0cfc37bffe9d56e5362517d7c864c912b916439b8ead9d0ee023809632623b17be7c1fa906c586dea49b8c69becb24d151beb0b4943e661eac4d388ff26a762a535542fa075c4b2f5c952fa6136b33bf223daf7ab43c1317aa6ba6a19e39e86d9e0e3b9f28befbcaa2907cfa44cd640a4ea481e153a4dceab0c75327ca958e7bff22b29e13406e10b772c3c24d85629b0ef0645b292818a782b77de87c6dbe2ee2e7ab9c3d7a6daaa158bd6c62ef6e3802e61719273907f57c25abb54ea413878d283b1604a269bdd4f19a53ec2fa52195bbac4eeb57e225a8bfbd352cfd3a8770afa13611fa77b7f4e7b567dd28c638d792142bc6de90dd55f22b11a01e1de61992d8bb24b51c3c7a3d031fd36720b60d7c4f3738671e33c4827e57a8a612bee0ccce4a3e7f09ff756992e421551400f0e202e2ae85dadb6ce53f7c0472ab8af8e17e93428a783c9ed78fd8e7e5cbb15c8f04c28930add2bdf9c77f69e357e8b19bc1d69683a3118b47c5836e07e1227ac200874ffa61239762f21654da2ba4c64a5774e39e4331e8b54fdc28c5c67f4ed07fbdf0387ef9b516d9c56471bbc4c2fb88cf44f7abb170bf7dbd87b0945e2fc449d65eb57957b5de6864a99fa9f435fff515c02f135fa49249a3bb5bf4b50511a6ab7ca9b31e68ba8ce7f240e8557c5943409f736e3bc09d625f7f4f0a926f0309586b462651c0951821251440e9b3520e6482a2a5201e8a2f6fec1421255aa1773bd0f7d659bbb581eb902bc80d7e72bc98b531d79dd71dbe20c78297ad5326e06bca2a0aecd3915bec8457381abcde439c51fad7b7fcc6d4f577b6fded30f44e554f9e899ef5114422f9919da0fa6677a9e2898fd2de7800abd5c9e822164535a07caaf01871a9379f66b004738831378c865a36c1032af8cd6a96b3977e746dd5d9263515bb1c2a8eb37f64d29d28ad87ec77c86071627e7026afb5dab6edfe21e4ac35574ae9910a96af1980cb184851330bcaef33a74e90d966906e44b50d4d9ad04328bfcf74859223386c41034fdbcd1f37b733312db9e45c0254996cea103f3ad0b1a8834f3559bde8b0a3c23357c71e98aa228db04cedae89ddcebdff7d13dd4fc0838c643bd4b5000000000000000055ba4b0500000000e302f50a8f61648e7f70451ada98890ebe51193a413c5d44691e47cd7f15bf23396976e3b2b899458f7c2fbadab6beb485ff1b6e1b73eb7f73925bcec62cf00502139a34bceed94439e8504901cafe1d1779287cd4ef1d5dbe48f839b527132e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007bba3ba3f64cbe6e184701bb8bb4f41d3530e110b5d5fd2d609cf832eb318916c4d22ce267202d966b72bc48965662d54bd3938b88d76a2c861c7f81b6e97f599671117e55e882f363a6f505db0bb2710f839eed3f231dcb44861c97c3b6ac09fb80a09420826b5cceed910e1e0602bce900105899de7e4995139789fb15a7ef032ab2877f7dfc0d3baa623b1eb05b296954311354b79fb2eb5b2bb406b786b596031e7568d6daecc0112067e1eb9bf85b3c9ed845d9057c465b190cb74ccda772f70b05e34b987cb1feba39da555ba692f976a495253b0acb95624a6034441db9aeb78ef160c06c06c5bd7661fa30aeab6208cebc15ed00de3536b3b74b618425d46b020ae25ff2397e53ff0b8cb98716287f1444aff4a0a32c8d7b4a1802744f3b062f030f0b034777fa6ab350ca75487c204669e3977716913357540b9de46112c6f5e90306331fbf23680f573d247d91cc1bd45d74bc31497ea3cdc07dae5e12bb5043fe030bfc02d6098d34a6f47df727aca9d60a0699e6a8fb999380b13d9a3c93739848022feba834cee4386582db73791ebf1632e630556a33e5b836724926246d24a7c9a25934433978ae35d2c6875cebed5bfbd518c546ed239157376902bc2e7f2521dc12057f3d2e5dcfeaf9b0b4ec56ffe0ad049c13deda23791878a6bd13cee605dec49e87f98b98aef1caad0a2621899fe5f56e9962a1441ee70ccd10349a522fca89c6e557be3203a320c4077ec73d18f8659fca1e465c0ac55bae1fe066a90e0259228a7c25b28af206ba6be5541d6e73110f661b6e0250bdd60b915ba22b323d2fec3e4e223cf21bab54a66b8f9d24afebed03741e7bea9d494d2cfb60f6efcd26240b814f6ef796696d4f07ece38f8d6a9def0a6fc4550befd428e012efbf24b0f9218ca011b44433737305ca2059e88b46b3a4cb201abbd6ebabace2aaf46b04b5451aab27bb058c11e61f527a72a10c84d805e90d101d34af5cc7c3abb2056ec0e8a91c92529c565193da1f55bc0fefe573dc1ac85416366a971f127d14c4a3a6335c95a2f7aa7e5638bf6353e71d7fa6387132dbbe3033b0834fee6cafacb583030537291aba4c90cbfe3009156b9f639412934b80c57d9ae4fd46099fdcf755859ae957409501d0ef41d80f1a3cc05e0e8d471d3d5f7e08afc5f10eb3b093f965272899189246cbdd238b6a7b1e76eaac0d4f7b7e6e7329633d95f5574ab91a4296ebe326e55d92a062bc6b06df465b68604d95dac7e8e3670f4e8ae5e3c6498791667a97b0c79f49edfbb918c3d89f634cab25ec5733ab619e5e38673be7466db3d5298f0fe6bb2a3c772e1c136070328f8af6269db143c9dc63854a803558a1f26b36a8beee91b46429ff7fc9cd8a73e304de34b008b20c5969b123042424acdaf23a91eb2e5e4302e73c0dd81199df631f05215d54be9a5f0fffda2be8f1000b84d0c00f09843370f6d1b2be9582df3ee360f1f18212286d4794520d9c63c9323ca247ebf4e344cb08679aed1d470c323fbc9acdbd1469d8c97e3709ee0b62c5dde2446b61a5ab89ac0aa323a9650fb485a1a26b2d84df5bf5deb0e55aa0fc75a6b2bee3f885324e81b57be8e982f3132e51a10ace783d41961a8505958b26f26dbe7b361cb6b1eda82ca9bba7129d2d7dd45850bea79e675185bad660cc95d1aba16335ead227caa10bcbba1e6386f4aac96d0e4b310786b897741cd9169a4268d079db35e767d6ff51094d8a31c2e008ab25c9a0916fe5276fae06840eb8beca355c270a4ac4483c352dbf3023ea7d6789bdc112d0c7263943b9d4b33f647b31c0f7c95a3c311a09f015b2936deafcf4d3f967ac229f5a736f37e9d8e5449e837a5e4ebfd505925aa9b77eab27ff57d6670be85984d1f11138aae3ad1ef993f65ac5d969c8fb389291b43cab1e0252024c1928295cf4e5c162239bb10d12e87d3d539c6accbf30e880ab39386a31170e45bc32be2722f2576cad7325c011d09123b504e87519049c927b1f05c4cd1fc4b97e74bd2637208ea7692a4d5cdbb014e1eb5da84d945778843d9fef7af87872d07266b093c934e7f021d8b863a6cd48d010b2e7935f2750514feaf9af53e8db0f446e13f64e02bbba3465eebb5fd8441144f76e341bb6496d00c36772a6f60ee79dcbea4aea3b59829af2953081b412e015ec0a32f54c871a4243c80675f69e8d4ba6b6d061d52633caf4ffa36b853eb4853845aacf803258f26e04846d2858d88b24e3bce22d9f087b748b833f6be7ebb111bf54d5dabb20a2b2c066010f4a7aac6469ff264623b6ca691582118fbb624219c54388bf00017a845a4a50e998346a9dce817b3b9b595d93c72353aee12cc3849cbdb5dbd6b44bf98668f320d8ddad7bbde2e84e367da645b3865408044e3cbda2bdb4e2089d091e04", "6a5352ac00ac526365", 1, 289338202, "eccc3f08a2a31cb9ed876c92e213341f6dc4890e50a2e85d5ef5debaaebe650f"], - ["030000807082c4030305dd6a8f969983bab2ad591d67bfb74757d5931e5c5e2b9263d4f4a9e5b866fe030000000651ac53655200ffffffffca47fd64244e715e35be1d451f344391ee81ab68483efa0514d10fdfd3dcb3840000000003526a6ae3cb17375798d2f8bf1b6aff3e24d94eb7de8eadadac39458d0e19ddaca740341d2d4aa2000000000953ac6a510052525165ffffffff03600c5b0200000000016a2f5f6b02000000000700ac006a5152654e21af00000000000852525353535265630000000000000000020000000000000000a260eb01000000007fed2e7517c750655d2e3621663f859bd1e1f4d6b8e9c03ff0560443081ac0a106883f1992879f4d2a73777d63abaa532852660dad7fa1850840097ab3e6b13ef9a5f45154f413ff47673ec7d72fb3fef0a9e2c985fc40d93ccaeeb8c7b3a4df00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000896732b292b4c8c60d0c3b58299c1fa7853aa1b4d2390768a49b93ae0157ca1050b10f654c4cf7cc5afec6c97f713fb66c756d51005f0f4917c4929af0907b9a1d7a9c43d16c95d846135cd3afa0abbeae04999ac02c3264710cb6d818c6d4b3ba53e141761e066838863d0a3783b7e4342fa56f86b26dbaeeec5ccab6b10719021dbb5e51d1d3abf896f9792573a221b5a317f3134aa956a054d58937825e6923032fe1625fd4b24432d357657a852c07c1e21a88c3d183ae4f27c0c5546d369b400b05e471f8ab3131c9b8561953dfabeba4bbed1d0ce563590e41af8898e1ce58b132c636dba15338a51fe4de12fe4bb3491b262d8b8d612967102531ca3e7826170300ae6c39c23774345f33f4c282dd15ae6313c63708639a391b8d702c958759b8031f723f9417697821c5725f82fc1e92f782768e67471b262b1d238a523dd4cccf02237e434531d2bb4ee13489844f883aaf149c78f76dd7d8264a3e45f383834aec0316715b3b821556d5fc460773abef849dba7205fcb439558ce515f53f027d6f5002221771a2168554a751ea2db2d5f7bd78c3c409ef7362c93596145405e46f8bbfbcfb475d5edb9ec9be5d87dd0d169bfc1c9c740a9d55b64813051e71113b53646d3a4464ea14794a16cfa57ccc5739662370af0513b9e995a1b23df88391cd2b1ed6f9aa6defe578b01122428b572e51a1ff274223491d11795c6919482c931710b35b8ab63d39aa838a519a1814b52b65c9b2d99c9f0dd4eb2cbe67449ab5bbd73dfa732db80faa480e2b7e892f7eade0da9435714a99c721f97dacec2c01d132fa418eec503f1378e5ad4a566d7cfdb04aee85e910914735d95e371da5b2a722f11f151adcabb5d2b82c30982923d7a4abd83f8fd26511c38783f2122116e5b3e57975e2adc73b8da23d3447fe34d5ed40fabb109477669ae0f0743f68e41b5fa20d572e74c002ab276400826dbc5255a809628fdaa9dcbda533196e2c7f5c4e69d9125fb326cbafa718c6a54c2f462f23ca0aab69dad88767b1c616393f663d506b721f3cc88e73494ec12f40702c53a4b84ecba31fae9647df389725eb21d91836e0a7512c4227da6cf2b66ac62771ea2b5134a19da2c524e27dd593ee1c3c4bd4c56e003ffb330fcb39eb3fc0311e0f1700350c780411b46ea5a942fa251680520fcb391f66edeb5128e7482698b551248fd4b4c39d26c31d7f6a2a52ec6a678e5b0747bce7f909237b7f29a0c5038338c9307b051dabd35b3455f07872e3fd3881966b69f1a2e1bb5fb898ab0973a69fcdc1e94025ab473d0ac9a8596fd1cb0af93345ebb794fdde8c3708840c78e205598af669132b312813f7a80ec2dae5d7f7c06cace962f5d25418d8d93e3326ae2232caa50115708e16030a059d62a124b7325309cedf365d4e9f8c1ccbcab83194d501e82e9139089cee4178b692a14a5523d32809e10fbc32347709dd85f90235ee4e1858c99128b63999ed03e7b957125bc08fd7bb5758386f0ef3ed543a7fbd717ed3f99485125426527bf11303a8eb2b6bc6510234ed70eae91faa0ab8acd9c98d48ffccdcc971e5fbcb484c72a4cb4f83eb5e84d2e596d819feef3870d90be3a8f9688403ccc57e882650f8c5acc1748d19e31da6fa79521daa5625042c1ea36b2bbc6cab05b7599dc66ca7c63b6dd94c9800a927c1cec97cf206c3272df8683ff617c8c26aec94a2e745015672843e24c28995ed2913db2f8999c9dbde09ab9d0bc55861995ed9ff40c48977d966292dc6e0d516620b24ee7ed794729afdc609966c5645acc29032d9c0fe943737ab06898ef6217c9fa305e2ec13bfce4b35bfea4b1a705065542d72c5c8f8d0a2acad1ec056fdd7f7b4374aa3354cb49f9d9ab2aef827a5429da8dbfe9d2dd7dafdc4f96c23f0729cbea0e5e156cd497184273f49fa6a5cbd310fe47fab8813e19daf19e353c758757a0774b15d34f1a63a43a9f158f1ed4942cbda56b0cc80d19f6fd186070c58622d09146ba3bd0ff99d5b6b99d7b892cd41dcef385e25f27d495d09482db4a40d36b73f5af4d25aabc36f75759d5081755f749aaae6c2f83e04e1a0adc7d63b73eb0e6ec561159125f0a013a87381d5cadd6e80a21ef785c9fb6046114ba55c9436f0f40096ca7cd907193c5c15a96e9d9a80af27a9bcefbb5d573d8a2cb1a7fb2cf7622f2357b7d47c601473fa5bcca8f0b6fb75895ce4c89e6b5aebf2b52c5e1d1e8e0d0bbdf2472607dfbec37be08ebfd8a4d595516fef51573a287499dcead6619807db28d5d82c030000000000000000000000005cc571010a643df9eb297d04c43ec8a266df811f46d2f1e2232bde795e9ce451e28da2f63016de793b2cf99eaf374c4613dbea47d5bb8f8d7123f34ebe33531d25ea27ab7a97ff275743a4ae6edaedfa9c673f0844e33faec86000f4cfc9ab0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000467e72890966aeaf15774624ff7ba244eccfbabef59737577840c9f611a1539db81efce022e249a901caa8456cb17cf6851e7e35aade1eef98b5162e76aa0f463529b085edd4476eeda606bae4cfc3fe97be3f7c7ee623fc39f61fcd24a8f25410eaf18c70a92e6574b4dbb847184a0382637f1f3c77591e6d247dcdb157fe01030c206605560bb5d3cd63d2c179acd05a7ad7df91e4b0a4cae0fa25fabd7ba0060319c993840e8ccbefd4cc8d96e4f0ae936192d0bb12350a1e2acec97904b7803a0b03ca6eed28ec0ed7db843cb6e4a98297347886bece90baa19f006991e243f41a709c5b55450804433b99c6122f89f15ff2ccbb043daa78cdec72bd38ce707bb6030ad2b4e073ce8bef61e25d73753882f9990fefc61c5689678cc0d586521504bd0310d2a6c9c8971e52f5ba346680e45e2b06db0e809a05188717636b616c9c9df7032c69aecb1fd7070431ca6c117a68c12e7e1e45ea9c9929d6d6370c4519b5d4d0030f3f5c8b374c7f10e867ab1d98370b8b67708e656feb83f345d589f7dc244ac0030b472b0c4bc67f0820f59a32da2aac397856769fffa51f0b2f51a3b1d6446fb7693e6a87f76987066d406a201d76ae312baddf541fc81061488b75edd980dcdfc76846c1bb6f3e5b4f6ce0fd855f8219385006e5ba73730b824f1ce138d206c737ef59b29d70bbf3fd4e3476515a5a02ad37540c5a8e79dce37b990f193d075224566d5422e13bcdab9737462174423e703125f32b4634fafc6fb8669c4b255d78e210823532dcbf71fe7ee8a33b90b0c6bd38684e607290c8878bf78178179c7827e5b7ed52699dcc62598204778126905239587b797d4669ee0f906c96a267aeda6a3a9e0485a2fa2b3a40f5c44f168830cca3c9477d564bd6fdff4106556de65d02610c7e42bbdfa282eba0f16e063bc2c89ab4b4c64c47332a4bdf1510ab06dbf76cf392e058f367de58932e94272784cac2d9014122927903cfc23a415fabd3f6ac24487f3da93af01329204bcc0cf222e644ed65590dc4a59e3ad4ba8ad4810dcb9b495625b77bab2ca52f6fe1e3a0f9c0f04b6678ca767a6b57fc5b0ceffe958627e09e0fb46c4adae5801ce64ec6c7d866e38fd1e2803ed7fd7e708a485cc2c807d1977d1bb1ad6ab4e771d1589fd860169af34b9b575ff207dc90bb7c8e3d87528860e9ff0ed0f7fd35b38f65f120f500a63e9932a788bddd839ac10cfdca705e2618ca415a422aad6bda4fab0ad88672b4b0af2914eb71421c2e8697fbc59bba3a7e99c12023055712d370dde0953640848e1f62e374b59ee25bb489bc09359fc9f4c68049944439049cef87bd7109dbeca175d565f5221887a51397d182b063687e00872fff3cd7b0db87ae605f06445e5d5591693ce61f777b517127fd61a9ca79a2596f858e50c070a032f225a41290ee374e869d3376b661dd435a74de4b7938b6169c171fabad3b2e558209dc59c1959f1b2619be32a37bf954677c07ca58030399ff18ad46e6c99182ef72e39fc01d8b499a4fd9414ace8c394dc957611939ddeca044f6c4428f240436b2f5637556403c3fca7e9ca4756363a49ecfea51861acf701ff6acc2768d72c26ce5a46e5af15e9281a4b48f5c9692a61a74154d31e2a2b1773fab28af3212a548850954f13820f705f3348f6ad65fa0d8a8fa2b9b622e27772984d42ac2640324eece6d752f1ecc77f4308995c89a9f853792abab9037a640c6daefb501aeadc76c0a5ab25083cd1c7148d5c0d54d4c9a82fd2cbfe6f10f2e2d3ec8eedee85f021f1442d5161ef1982d7d63117fd8e2606b70350dfa301a32624035736698f2221e9b76ec591141ca89be49243dfaab8113b0aa58b90d529a2105e80673956f9afbc676c7cde9311bf1f8a913b7d479cd5f620fc80d57e9426cee9c7b8a0817ecb304f66ab77e4d60ae81f5942398e1025554ae6bdceae1ee5936696fe3f4debadbed9f4ff2b4d6c973c1f840b4afaf25d0c1a126549d9846984fcc51914d3544a2af3eb9189d709f1498073588ca39500a0f43959ccadacfb4d09e1491331addbadc6213d7df5a81c503c3acc2b8048ebbaab8fbedfb9089197474200880fc3892ba122a8fb87730d33327b700d97f8d87eab66e4abc679db9279f81abcf8c6ab492613926ea443e2d65fe8fe15adbb9823a7f9e50620bc9ccdc19bd9a981e0b685af79a617b8e129670c704fc059c6fbec31bf6f357ac7769cf1ff9c9e3e1d93eee629191f06f80350d8c7e2a76ef8336d6441714b661466985095c5eece24b1862c2b6746613dde5917d307131438a5ca002b2171eda4a091a8d6e9b586371243be691c4112b02ce26d9f979d2b50bc0274fe54fa5e7eef13952749ba1b25eaa6cfed0edcfc75606721d5e72e90f5d8855c6916b5fa119273fb376b9a60c", "ac52acac5265ac65", 1, -1596436324, "1fbe212f95169c0243b7c0c308fbe9490d73e29a15bded4c91fe23d0571f7332"], - ["a7c8436a02992d6fab1cd5f8261c512e7f00b0c8f8a5c7eb7578ecdbd22340add55602632c020000000365ac51ffffffff1588203354bb3b1aa6e01fb1baa157f157dd1169ba0ff87f680401d43a57b1fa0200000002ac00de9e05ba033dbe3805000000000963510053006a6a535211270e0100000000036353515ad4850000000000096a6a526a53630052630000000001000000000000000089dfef0100000000ee82864f250722496a42158b7869183ced0fe5d6d2bb6fce161103510a919d5e881790f3d9ee3392ea70341957d9aaa833822ac88ec763d8915cbc50a52229373ee99413a2f3fe7d9c5b1250c864a865573eb4c5b8b8dc715f3d0b3348cec7950000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015bf8027edcbd76e7b201ad71283ac35ff2b631d0f284009f9ccec422af1d4fffafe304264711ca706090fc3ffc56e9e64cfaa9903d980495168ff73e85fe362c5324e1a099a708bfe3f77d8e3c69b8e481deed2e40f0d9ea0d73faeb1fbb40a30724374ce6d99dee7de44b34eb9fca3245343b8427293c384262d5659f264690202f23dfee5996c360f27458a71d44ed10477cf635b078e852cddf7ad9b0842c0022fdaff64e3460f278ae24cb5081e52df73fad4cd1d7d806736405063510177460a00f9aeb9f7fb958be590a24efe7a85551c14cd90230f5b9d146d501e29720f9586a390d87c7f17717a699c786dcd8e47dad2227656d11ad50cb91c2690801ac80208feae5ea579a446a9110cf1bf94b2f396c3bd3f88a41e6d420c582afc1b6021032c112e07f74814f9c43c7043a669b2bb9929c05855c2138b7963cb398c3f315e021f20e9be1b474d9d1001776b3eda3d321eba368ddf2b0e3af7519a6655cdccf10202683d27be9c7a4e626b357fefe57e0f2a665fa232b6ab67c418832b29fcaf9f0209cead8b8a77116fb7a70ea9695c797b76321b4193057c2fa1f889b49daf7fdeb0ee8cc9727d681dfc0fd24f2135cb560ba7f2cf156726d7ecdcd1e4fb12f080793456b44a0773f8692cd0f4db9a17d94bc71ec2ee12898d7b091efe8b4364d3bcc2dee5d08647afd91b32c0a4e44eae3f2a7cfb8473ce892b132565d77d1f6fb33918f9ca7412085fb846f883c534247da2faeea78495fea9ca1301b6fff443604ce11bce151266e2e8a8eba76f3dcd522803b1a9f334aca58876a5756a52eaef088491e5313d58229b024701002c509084b81de9302b40ac4285f44ef56cdc74ecdcca5511a3ed2423595d9a9d2d8edb70215d2dd2b8d3438e4a93e90675d69ca023da5bfa000e592b869c4c5c8ae02e4f546e75587b3e42b9c482702d40e3dfb93b36de41a5e8c79782449f47b9507e20ff78f2925cd50f13443d6c83ba977a37b0cce28047368788b205c20a6ae1623bc0eacb327f95d2422e30695b776b508de03092fa5e3cf2c5715dfa75288a23fa2013c1a72e40784f70c54670ff206e1dc540c128b3ccffee36dfdeb242cc8236c7f04f592b1901e5acf91c51e873f07be8fa072fbe0342bd8732f6f5bff3e373e4b7a6c4d7a6fb5b7d6909ec85c3b53202ec6d697430d569bf5d095b1212bac39f972e83193fc55ab58e65f542d62d19e5cdfcb7058440001ee80d2086e2edf4f91dac2d6fcb273609827de57cf493d6bb63a6924db0daf213246ab7bdd637f339dadd2988c1694c0732f31ef844d96efde38393933075242f60f623d21d158be83266260b00bbcc5efbfaa325cf952aa0dfb6947abe91aecfb8c4ad6e5c7afd89d93c2993d74ff72e9b4f7ff91b93b3d16fd5c3f86fb6183ab32786dfad9384790c9530695ee4f022c606c6d0ff3f9f6db24204cf1fc933b66bb409176b17e4ca24f088bbf6465b054b091ba9eb1de77a38e827a99e0cb5fe153b970563d6786de9cffe650045d2e882a3fca81b3e2b07f0b330895650092ab51a139dfe0b2cdc4f41754f114390c15970026651d04368f78f914e7b31086b9821a8a4f2f9cacb1ce4669237bdfd811fae6bac4e36750f6324818460858d8db8ab3a20ca8aea8c96c03f67f4415392ec64472ec1b11a5f3d2d57c0c2e90a73ac36834086ebbc7ce0acec62b45a6be604d345c847ea81fdbb6dbd128de6d508597d49b8b19f511b0f2ab7698d20747d6be13bcc3f09fb387cdb6612db2b35bce825b4289c12d018688393c015e083b4085c96b5ca73262a8dbbcd8b44e959cd67c11ae2a23b1dcf3aa1c9738bbb85161223b895bd8182fba1b68a7291ce7136c23bd611233fb2497315ee44a1df57122443d16afbbc0de132cf4641333d985c77fc9d8b3918492885b888152c79ae136bca22a7afb4cb3b8dc881de6a9d456a6533ae57a1a949586c8f2f71302eab55e318171d89e8188575bfff982f84d1ba2ab575c618b0c861445fc1663d371d4c2838865e4be8b282d9536c10de2d458747f760350d2df783218aca2dd558b2a95f07e0c361f886ee3d3b52dee4433cd21fe99cc86e42ba034b9688826d23895c7e9a76c1f81f5d52cf053e43c21aaca01abc0036dc0dc229109a47ce6648041650ac0e9fdffc5751d6f1def2526ce4d66da93736e8c56119961c3e57705f536ff6ed2d18deb67142b72e5694703e7376a4533af7aa69a108adbaf9cbbad72f908ab528a0f7f4341159a0d683fd9b0319fb1d6718860aa746ef3141adfbbfbe7aff4876d4fe581f729a159682bbc0cd87f0cc4bf8f77803ceda30bd297185637a9261dc71c2be82d99226402ea2d944d31f81bab6f14ff5d6470457ec46ac31ffe0db794f9147a71d57aea003f72313934b5dc389d1b702", "ac52ac65655151", 1, 362522668, "1494ff68ab98f1a1dfaed41a593904c88eebc4f8048a8e2723c3ec4d8122f02a"], - ["794ca12304db39fcce90272e4cad12646a6125e6ca77391a853d0f26b328c014c4c125148601000000055251526353ffffffff4f408c5168b5dfe807d64e2a6e6d282993c64583100c18e72b3df3606ecb87c8020000000352ac51f75e238df1164d027303c3843116f10c3a7d323e20c6efd0558fd7123d0fdae0797bb382010000000152a39431d40d679d4eecb8caef717a1c921a3dc4cbd7bd18f770a1feda8cc465afe062e136020000000853516563510063acffffffff0230af76050000000003005151216c64050000000004656a006a0000000000", "53ac0052ac6a", 0, -1748581836, "5553d3d6fa42a7373fd8b30975e8adbc28f2156881038ba70c360b908a1dc90e"], - ["0d58d55501012984351891376496e88fe8d7d4cea8462eaf61cd12f2c6cfb1b731e4bd0ec0000000000652ac510053acffffffff03201000050000000004516300639e1f790000000000006917eb05000000000000000000025c2be300000000000000000000000000debce5241ebb30fcc386e41fbfa84015328afc9c7c922e43e2044c2275880dbca43fa87c1e497f69ad0e93c3449917a250beaa2979072e9bcad19e301ec9ae217628c9e21106ad2ed60ff73c4fee0e63a371f81e9eeb4dc026f33a12c7fd090b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ff90436deaf5fc68b61f54ee30e249171ae5fd10ef17ec24f8427f2432df7c1a246918ee793d9e6a0047bfca99b79079346177c810244543c257ea5da445d299edcaea244cd46d703dbb6200bbfc43ce89f318e0f72a8e2636880d35ca637b49a49c374b39601a87d0ce2bff141281477f748fd1984a229a9453eb512681eab0211e052d8148ff998edb2355557f039614ad57e15882784d976a14e084277c9990318320a4aa589eaf68855bc61d9dcc82e1dd0f827db309bf8a4d6836d6f773d9f0a03dc3e2b0764efd89c654d77f868962a0f5c3f76edcc79ba3b8109c0e280415f9e893afb36ef6183dbaf6336578f1077be7e9de3568c5729ee10d2f873b9dd4d03132b26f92c25ca34d2b2547f39111e10851bbcc8d95c8e529a99e6d5fbe2b0000207262845c2edae0638c4e76d8f438e63d270bfeb0fe4d7fa53a5db192c9607ea0311814056aadff1d695de554e6fa59c38fb1323c314b37cf16310c35e4cfc358a0217e80e7b1b65eef7021ea82de526124d462f1163d088c5f3215966a895e6db19031f0e008ea3214d62fdb820591ed3c4f02a1cff65a1d9dccf4afc2a1396ead86661d0773247777b835de40960f0a9b245c2c0f268454d83651f1083d32c357b0d4b674e2db1383e7360086f2314c21ec045d2d5cb579237ed2c71b80c4723166f1c18e2a12cf61438f49b626f0e299dfc33d6beb52013058ecb4057343026f58c342e136f8539d81535128e14741736fa48bd0c58cbdc4a4c2b1cd5269d254d661ac5d086986c78f7e9e64fd278be00112e319cadfa854dc1ef62a9b174809343dde174d2ee8e99bee7718f721a74d714048c1e6b2a312e81315ee51845265df2cd451d8a16bfbcfd483027139d8a67bf9311ef1ab276d8878cdc0b9d2fadc00a084e5ab342463d739fb96f82acae43d4b33b34595ae09a5b0597031d661120651758921c98e5b991088de998d9091ae2d8707367abdd4d59acd3ca7b23ed7ea585ebb5a40c0d5c238fb38bf1304809f33eae4d77aebd3296ab5140cbc04c2d7256a1efb7cfd6bc5128008f6f058a65a6b37f74d51030310c94540064d47e893bf42e3b69bfb8cc9caf34e44a228c114731067d13d98e8962f5e1011454c9557af9e6de72b37057a8186287cd9a48ca1997614088288ce9eece5077b14910fd297d62723d96b4211af149ca3d878481df5a1d4b74e66dd46dc6e6f73d566e8df1ff9762b18ba866b7b4dc2b2a9b122672e2fb2ec13b46147abad5caefd619c75857fe7c4294a66398dc6807361a650c84d34c85db6a9aeeca12a4be3770297a95213a2b2f3a3be8103f1e374fc589d5a568d4ab18e4effe75d222d3105fe55ecadc681dcb7f8fd3e19c2fc93cfaa3516be89edb660a7eb9badc2e5cde9430f2c1e38793e50ee9328d4f13b2489691f90bc11a4098ab2f82bad6d2846ebaa051ceacfd4e03d7457ced9a37c1a2d7b4336332ac8396000aa6c57ed04b0d846e70607b8161adaf7a19ad2fc7fe25adf765bcf251fbb7173cd635436330d80aa1bcf2c75936f1c76a9c1c533b2e574d63397c3a224b1b9fc634771e6d33bbeed8a60d8e5dd6cdc0e1e131c490b6a50d1c528557d88d684456bf2461fe09e0d0f1240e5a2f408c486edc93abf5a2a8c42b8c1e09f2e146a4508ea5be94e1745a58d826a40e8ff8c00df0b7fb9591a5ddcac680be02bb3906f3da61eab5736de29ec536f7e0aaa432278cc75de2b40916477e3b9fec0558d9419d323ad0b241625f2766007a9308fb5a3fa6a117cb4b4500ab0374d8dffd802b4f3c58bcbb6de944c4bf6f4804f11c47f592446fe73d1538008ad03eaf2ed64cbe43fac19d0b3426c03f5abacd1cf5f0eda67bb54661eca3567d2aae0d6eb9d897b9e27de6cb24f19a373fe8ba764b93e9a82e56f22b89b632d2d642b84742dd95dc3c7287cf0dc7a2040f5550c858de924f1654f9fcffb928642a32cfeb59765ba165aa315375947ab5b8e4fea78d97d3910830895efdbad6891e443954cb20ad8ab4721a1c98f9974c485762088f968a23f9586a62f770f6e38446726f58e6dcb5ec48c0d85cf648c0b3614a7d048fd5548c635df63bddc476194a8a16c6b07f832b5378579f9bc63fc3ed0dfbf90f7749a75fea62da68495f85f4b9cdc7e5d58fa78b7c393ee2d4b4ef75abc458bb87d0ffea5ce1eb4a644934c24aa06252a7121fdb6de684c197f5b79c57d88bade9180cfcc66f7464503c212597d56398f03ddd23f4f5fe481bb11a45abb3ccb875ca847d4aec781cfc0b9b410000000000000000e1b9560200000000b4be56e244715bb07a683c7de7e4482440d035691a081c0eaca3993cb2637195caa7f34a34969d6975e2166cb7bf8b2df92a919e78063b94ab83ee4f78c26d959a8444617b7a1ca8008a6ffc300dd9d816fdde2c6443fedcf51f387ada9b17bf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005d7720ca1f44c2ec698013ddb9fb79dd0839adc24143a33870e39a2a368d74f4ce199c12807a79caaaa4697d0c6e7f64d14e0c1e2b59f608797e5db0fb2e1f756d5a1900bbdecf378a9f72d825910043480495db8579a37dc7a3a2c4c2ab754d944de1e106bcbbf81e855a053f5994a1145328351b02a1bdb09c41c1f597339f031282f1a469da6103cfa8a628fe5c94bfc32729a2cf16efdd6aeeebab88edd674032cf31233f075f8b7a8be9d1432ffba92652a539027bf81029a52618320aca7330a0679d7e4cdc915ed6c4f7eede749824ee3fafdc1e9ca2cff2e556f3eeb61859e63fca7d5a2288e278eefe8944aab077067bc841b6395f49116bb26ce873c41ba0222fa96e76497233d076bd639ed5e8b9e1ea741951bf98691f6b9f53910d510be032ad505a8d89f7b2b37719e7fc95bbb834046faeef9c190fe2d9c050ccf54db88022a4cc3512ac9b796a3de2070c7acc65ee229e32d6db2ef45f051bbf93ae4683b031101c98d7ef5202c0887ea38c3a7cc2da9a0d19c10639bdcfbc4f7bf353503a60216adbab575d86259781a3db0e357b159216b2f4169ffc263fa748fd82d7e323c13bb81c5b3fdd3eeb9dd6558f8b2bb386409b9042cb3286d7951505cf107c35443fadd041ea3e8be54f8ae083d1b4b2502f79e5f8e3200899e3067712e678205d17cbdea9eece7b8c133aa8af23073d6753119ace685b494412051b5043191d0ba1d1ae5835609bc276ad5a460583d82f428d55db9d62a6c4ac88eb0bc485f76088d0e834d6d9779eb71e6774e49b55e9fff339863faab70e2b95f5cd1f1366ffed525ca5a109959aa32f607f900cc00de49bd9a4f974f66bf844263c98dbf68e51c16b2ca296524d88bf7612de9a9d5b6e47d4b5b52a3b731616bc396d695fe19242326ef5cf8b27f12068371d649beff8c6448d9dad53933564561c101e72e784582efa5fb7397f660b27eafffdbd9754ee68891d2796a9e0d4e616f485ffe681751443dcc2e57580576667753ca43860af61a6f2e32631a1732d388e59b39291a5bad97adab5d702d6ddeb5d59059d66237a20654e9bfb9b06a394674cbd92e9beded6b220ddad62eefff484cfff4ad8104ac6c4c3fcfeba346904b7010426987469ac06ec094363086b908812572de154562e9fdef5e13d5d7176efdd9c1e89d3a11e2d0e64ef0ceca580d7fdd10f2112331e560ee66648ece24ef854729ce620045efc0c774098fe7e9e40d9895dfa208b184266ffc366293ef4457b958816d2a98e53484081dfb7400adc198e531f888d180aa1912c9a73c9b1e231f05e8aab5d48ad7dc802b4ab71945cf943bf5d46a6f8d867ee90ae0d87f3c7396736160bbeba30f18e9c8c0809fe7548db39f044ad9ea11115b57cbb328e0bfc73fde21c036605a6dec8ffaa2d32142bba83bc493307aa28ec7fab4bd871102a65e22260f1c9a26215ea020c5c0fdae8758dc6f452d605026379603feeea796aa7f516b03fa3d30c3d096aaaa14afe98b43a0c6d5929970c99eb7a6632b6bc4475c48dea03c91d5a3412efce6603480d85be61ec2f0ff15b35e4481fe3b57c1689e61c1d135671f0b9736042823ccaf6d1f785602c9f9d7c47f007e83465179b09010d841f5b9e014fb7f5d105896148275a26bfbd8ef22c2aa350e1fef1533ae8f1e89e916a59ab230d547e32ab883b845f0bbf51c9a041c029472f4938d91e592d0d84370668f5537f77b4c0bf90d74d5006c7e56c3f45b7201c71aa2e186cb4fbe627f776c7d715d3b9bb7407c8ea475cdee9667d168d4991de715037d108685386ba7e10596abf18deec13e3dfa74fbb06cca18122fe108a2e0446ba44d91a0a58d8ca12e3b3cd0420d8db19df5c165ec3ad8e45769d229d2581891019471f05b71aabc4100940813de9f2549958685809b74b33333283cbb22cafb56c57c7b19a45e03e178b06804f600529b9c9397670b1d8835ff59a807505582141fbc8eb5f8aaf5fcebf8ebb15293a396a118e26993ab9b905f5927d0993c0358c7485603e547963aa85fa711435e3bd9d2abf78af2d703c42843875d0e6ca9c5e30832b826522036040b0313e82df80c9ee89e30288dd0a5b3a04e0937ffc5973c57e093b2520c24c2fe666be66a8272847d177deab5faff2f1f38c58341e61ec568ba87a1005a79de686d443c937ae2fd684c28539bba9cd9074f55e26c1e4a69ea5c3ea432c8dd6f61065814c6da06fa8e77423f83ace464a5b45be31923bc6635faa48a0a56c9bd6f50e5895af7fb88e68c0043480867089f90418499c560c93c20ac6303969766234b52dc0564ed403c7ee3e023562f1a3d5227a12c4a62cc8e1a747eec44d8137ccf7d52aa12814d171cbe422b3f783ca425a66723835eb8b0b8415a65f2352e891125b7dac581acfc302f06", "5252526a", 0, 1829185311, "f244edf8fcfe38a887a8348cf689cdc8c5f4a516f45403fbbf9d9c3888b82807"], - ["030000807082c4030478b9b915d2f6c9374764ec47ee1c653f64d31127c4e3dbb7fade5356271102e70200000005510052006affffffff3753241d34ca06ab0d1c25f33b2293c39d831f8c160d57471184d1ffc976363e02000000095251ac53636365636affffffffd8a5bb623c152d205fd5818f548fda39ac814f22deaf7473d96dbb719ef91bd40200000006636a00ac5153ffffffff37c28f8ed42658af7c8c3bb10f7a5655e6a311ccbd9f518c911b3e4feccb2d240100000006acac6aacac51ffffffff01386dc4050000000003536352000000000000000003e58699030000000000000000000000008eed3383f4ca0df91fbb473e76d923fd671ad8f0b8084982c5eb43249c80752fca89eb68cca4b83bf2a9a59abe52a6bc7ff0319afab73ae53bb3377893ae403d246ee2a04069c5fbacfd8c034673e9e8ae38453fe2aedf08b0ffeed0cf6061e200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bec8cad5133e947030ffc6a36ccce34c83be2ac15daaaa9386a57535ad04f9dca9f2b00144aea4c34bbcbb9cca145f3642630dea1d2fc742d0c207da8b4651304ed7d8d129503f7c387f7c192f25e088c4e75865574239b8771b91296499dec85cbe969a1ace117019589f8e24c30f010b40be8142cea2a21c52831926e215140302bccddc9f6f795318484a21daa84a37f67e344a6c79329eef4d3ccf254c7e71020391acfd60e14f5268b2943dfd51496bfaa60a68f7cb95e18c3a30a42033ebba0a0581fb4e4c0795abb7dc071c4494fc0e9968624a388a44e59934883bacd9bcd9a3e642baeb40d37a560fa2661f9ea8f310edfe63eab3b2e11fa3667a74b872fc0225f1255b40dbcd9f7cb085ad2265f259fedcc764d751f7a4188e88367abb4548030df82b701bbd07a46e2c11d7f0a5737d3b2d1007da9a637acf3cb0985d907f29031c893a3e9e34781cab1cb1b3543e93dfec083036973f508816432e7e7389b642030f53e632544723573db5e59f201b2aa195fdb5a07ab2bd54bce9b87cbde931410302bd69f175160a9c2a9f0fa47e329408acc47325db294deb50b1473dbd35146e2c2a605d237974ec81e077412d8b2ad0f9cb0fd324fde524884dac921a9c522e3f69d52268f36c50dbadef2619f914fc6c6f448c7b0efad436bb9cddc44f83497815554bea3172ba0916e24510d2712003f08aeae03b5c273603a1f8b3103ad3388a732a9030d7f97e7708149c01f4514b55afbfe6a1758c6dafdf3b6e29ba79dbc5fe207a3f697ba3063f38ed98d5e7788d88b8fad1a0f910857edcb08ee89d9eefe84b196b70152a95d78bef630587081b008d954a35ae4ed47b44107ed11ab7ce0d4a7885b6fdcf16f840a3b6e55cc599dee8ab79e0c02dde9821a960f098aeccac4bfa822279c9c87a0919a6c0354b2246afaf01b88b2d0ffb25976c32e0e9254c92c48ecc3e989c05f8dae6b70b592c28479e91d75b78ecd321920de15ce4b9debe0ed7ba56a70c67b1e79a0094f193e56acf70698ec26e207139225b5da328d0c44ce93a6ad377bc527ed9a1fb6da56475a1332714a77e0b09053162b02510026a7d37906059424f65880a6b6fa47abf472aadfc969fa3f9fa1837154e5db96dbe91b8f7010232ce3cf7f45fd28e88ced1d7ff3b87a01ee365c6beedb6e25a66db2eae5f2e8b636d6de38ed1fde90b7ec54fd85b2edff906874e65a20a6ff59fb6e54b1543466eba0b3738afd44a1b8bb5d041415e11b724a32b886447e4df1c45ec4f243e6d1ca7e604fc8946ee192fe2312531847ec7e120016970298c01724a5f09211746d001bd90340bbadc1adcde07c12b67e2bb1d544209e62e6a8112f495f7884c01bce2d61c7f7212bfaf8a45f4c7f0a08cfb35bae5b02867bd0dbf44b2b6edfb9a0432802a0762f9fc1dce8604d2311140625a5b05451d7b91f322d91454caa867b7a426ee0ae632e6cbf16db24a74f9e65853c3d98fa142d3ef82ea8ad8e235f20c946a38724dac8e8c7d4e66e5783aeb9ffacb1eba4c79a82908edcb43a9193e91fb654688fa1c72c18a87dc5c39c3be1219184d0e70f4443890f465ac4cf4a915afb68cabba6b21dbb3855a525d3039269645bfaafa7372cfacdfcfd301b9ef3bf7c9e999ad8175559a8f0e0f4e2c94b238909f20180ae84f19674868ed4af7662c2ec59ade922c82b1a3752b22299530091ee5b0bae424243cc6413ee19b69c9c4bd868626a24bb9752573dc7b6e15e86fe2c7078284515ce041e112f1962d284f80ac9e7139ea51c52f84d84050064925e659c223d587050a7ee010bdbf33953db29549518ffe624b5840411f712c6d5dbca89854e6a9226199958a7c7677f1066fdf24e25fdb367fe076a51aad7733ef834fecaa58e138aff27b179765d22b59a80497030e257b9a5eba880c8273159708b569a56a93f154105feb49247b5f1d5c1ead2c8596481c07413e742ae9b87db35741015098c96c0208750e4f795d14b58ec5494098c34410fb639b4cb078c667961c2d184a939589817ec9ccdc53e33b89611907b86018568b75dcde34336d4d740de991205a6b581d39a5ce4e16d3cbddf2c78762d3a71765dbec4982935621353d44ee4f9d4d7f14e3c936f5db32ea606a067131d1e58e2f066e6ae442ae4f9f14d13cf2f1e1deb5ff73167f6749f7332492d48d58ed7858c0f3bb153be4f2b01c4f9fdfc46db84c907eb8d50a907b0c835a25f1378c79e68e365022793e841396c7b16fe39a0b93e99346c11b9ed0b1d9b7d88d9500000000000000008e8fbf0300000000502676225c4ca62fc411449c0b208c2a67d834aabb89e4c2591a8fd1df3419982893612fe5543a2e77b4e11a57a00581176314d9e2c5f7a5ad12c5be08e39e76a92897eefd2e91b31c8196e8d4edb7b5f5d8140da39d7ed3be1264fbd791b3a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000829de1628311ca8fd453d81331a9269afac03135bd2a80923a6fee26c1ca43b8d90cfb9e1be614b8d3fc3cef2553a6e82631d19f7c699fa040f40147c915900600715714620e4086d3b8563122413fe4372bd4e5029d05cd059eb895100c004f7b3f634acba4ca58752cfbfb891e7b06e3f70767676e7959243e2322dc217da402263d362879300536cee59f1c1865271b78edc86315dd455f91f7b3ce824b14750323b8166eb96fed2c5ef9f1490e50f5c5a922159c64a53db32c762695d65431320a038ce354452b9c9fe493d22db4e9bed154084ea7ff96bd9d1936486531d635f7c01756a3fe60637e98f225564e670c3eacfc2f039dea3b0accdb509362f5f2ad02042babd86400ed9e3579f3e896cb263136a0ee6b90cd3c64cfd9aca0dcb7d7d1031493aad6ac1d5e1cb3c086c1946285a1fb9cf2c00751466a54ca0a3dbc280744020dbeb2b3f440d47bbcba6034c1caf776cd2748696dfe3de00ac321e67e56fa510319307310814e507e9090ba130b9cfaaec1695f175447fbc0e51d2e120c050abd0302da241a15b5d61fddb400ef7f01dd74ba59f5788ab41fa467b23afcd24e0ae12fdb54dd544f249fd611c3e93feafde3d4cb7e5672b8527dcbe1c0b30b849133f38a8114a703f95fa54819127cf71bee73b735aadce213cce99f172726f7bb0e681663a23e35782e9d46a190c31690646d73dccc356bcf651af72ef87e28c71b2e06bca4baa3c3462776b39dda3c267cfd19121230ae436e30cc64f20f629fb5a6e6b74c6bd5b063a07995d78b4131e576382da015dfa72df8746ae38b5b706e2a5cbc64c0355b9292cd83e1d0fb1e2d16afaf6c1eec2a22e02153af1e841ce1b3a31303c489a2f7bd68ba7507baca314662f95b333c5fc2b0bffb17f9d57fc4c1e140c4fe29a291277c57ae180b689a7e0205c61992c59e5159a904e626d32b84ff260337ceacadd04c0521a5ca18287bd0f936e4f488e7031a7071ee5b609fcbdbfa6f6f14be1385c23a30a7ca2d10ea61af115021ca6ce961d9d262042c70f6b08c89eb3f12729f1827d076714f6fef4d84bd11ce556452795fe6cfc52db1855ba4c29eb42e7f1de425e8311d711a74e6f2b8ed99d1cfc316e85d23e76b90929da7d86164ddacd5b294ffe2d99d6733f460e77c97bcc6e7334846af6a21aab1ad5e49a18508461f1877f3886e341eccee4665d5f7fd4a2e32e606a0b9c0e68760cea88b73d13a6c40cdb6a72c7f6cf397ce96d4c2face68a4bec62a4fb6412a0ffdc87e279a81f707f1c459123c24fd43abbb8172b5af0fa5ad02d358333ee7a243b7967330d228772fcee4c2d1cb7c10a8d8e0812fb4591eb8a8f34d1f8a5d86fe0e8390af71d6a9ed1ad5fdffe0e73051e83d7b13596c7e089172b19f083f87d0ef62fd6956eee8b07e3f0f91e4cc7374d5802edef3b7d99da3d796660d1c0e57fca91735ea0d7d405b8ffc450f06705be1ee9418d6177b482219c4e10f9ab56ec2891220bda4e41c8cb6d2f516a657dd05e622f741521fdbedd13d68a2b26d61db38e6a7e4a397da10fba17621d8adeb82bb352e17f9ac45702befe343122683b9c17291fb0e76965a0d8bd6564afa56eda34ffa986451cc3ac6dd7199106bb289c35838feeea166bad04faef4eb0c30a5dee817f8a9d84cf32039f3aaa42f0a441d72a9f99ba09483be6a947182ca3d95f2027284ac3edc0bcb8de65b5966bfb963e8ff899a1c42beb9f9004f28eeaecaca261e2534239f4b9d40fbf3b7fedd8a08e692d733ea09a259706c95bfa361617a415813bab7a96af6e9ac56489e2508f27d918295feb96aa7e0efa135815366e3bf3a30537e6eb961946947ba4437217e2b708baede6844cd2db8db4f8e18cb0b2941fd724cb56931d243d1163120d4d6a48177c82b7fb0f5a7bdec246dcab1fb47a10cb5ee60bc1689e6d0b9c752638fb3cc1a5696ea980c83c99f8ba291cbf024cdb0b2c5fb0a1d053c5334f63866325e721a18979b1615df60d1376d0810fe1edb6b59c38c0e029848f13d8a0e2f2b7f7ca584171b9f47dc5dd9323f33faaebd408c2f197f2ae8316cb6fb62b8b5149cf7f2ae5923bfa17662df1598d9a22df937e206bbaa3a374a3a32a60118b78f560e9cc9272e69847f471319c5299b98c8501655d7204996c5787c95ae1c81076a99bce2084a4f74b08419e51893b03436351d0099a2b98d616e1f08e94639c11c73e8054ec406eddb4cb9123b2e04aac51c06fdd10ec64a09cbf9668e37b49108ba0e1425c132c39db11e7cb700000000000000005e4654010000000064e6a4740e4729d866716a65785058348ea8018eae47f57a32b288ceb0ddb069721122d1908ec7cc14f02ee3639bc626748b103b6aed8eed89627786515c821b8cadd043ace2179a9440d811a419e8cb79e4e3090a542ea616328a911a2bd6e600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f41d4e1706e9edd736ef5d1c8d4aad9a74b5d27f98b08e5802f6eaad37288df394457b24bf986bfc930edb0cbaed9a8aba1b0966d1e69710ff0d0104d4b84751821b467ec933dbfd2117798d74b8a06e38ae223e7f9f16369e2621fcb9a4e93909e7cd41ef7fa2a3eff7906a26edc9d31173d8b255c1142249042c21f9a59a2203165e088b54e2d0a865d76f0ade60d911d80047fb8429476fcbec202c2620e11103152a6cfbdb708144a417260f4e0d299a4aab9c88935c8203daf4e9f16480b2490b047a86e7f3c4ebd60986e0ca5af3f7ba7c9e7dd45264da83aaddb4f14781e682bd0a55314d73eed1dc81689b6387bb3cd0ac9d169d2373866f6627cb871901900224de5e2ca1441baf54f1a11827006675bd76380a7a1e9c4a0607e143a97d794402076e83102e35f319b7f591c1546e0b74a101ab49304844f58d162594da95e81202239cbec6c77efbdaf77297f2aeec5a589b7b91595b0305ee527e5a7ea18ede36031e952d1d16292a231114cae0e9f5edd26b57177a314e7c8feb77433e72d968e50302601db1a6a3080e80d1140198282c852d8b482ae7f111c3da56198d7cf0142f9ee0e16c013c33681940280fdfa652d7056e09530334f529424ecf11b92aa9999c25766e6fa3e4ac35a6c52108870b10cfaeee1117349f09318e000ad377224865ca53127d1f84bb8251057534467300ac644f93abec7e440c48e4c1376c6fc9fd2ae2928aa5f5bc381c689fc7c8c101e0eb3cf96b52aa224d4cf02923fae775f60596fabe137483503970ffe8ec6c9bf453cf9d571fe38cc964d98ae84ed05438325a4e290f40d8b2c264712db00a36336e04c1c469d1fda5c4e3c0a47eedde66c75fb7dc783ed6778a4b478c9c87c33efcba6d3ea6ae196201b962032fae03815a0689386c807c91253a2b5fb10a482ece2d4745a34b5340cb88a85627454867cb21b6973253865756ed11c47539bb7d65cf58dfe1443e99f0542432172109b3409ae0c58f5dc47aef2622a3ba8c731a772de146b13db993c454dcdef86bcfebb9dcb7c57c68ccd44baf0150ee0a1d56a0564eac092c045115ce8a2327e71612f0060668b11b5c467f4a3a66b270cf14b513fbad6fac4d8870863bca150446ddc7bd1262d7bfd9c826453100b4174338d112817081739b55b8cf10c6353fd91ef6b98a9acfc1b95a9021f0539d114180c99c18204153615ff3b5df13b2afa0bd4c9e2366431c3e621ab27917097847c4774405e1c14be204a5a710a07f8fc94a5668db28b5270712d8e8f5f9fb7672eae6cac7c994d0df2f4a1e73e4fd639feddc82ced44032ce550c6dae652486d63f03f54e935ff19193b8cc8ca8048f0a310f7b41aa9b5df6cc2af07a94eec32c638e10e18cb3daaef3dfc0be8598db404ba4e0c2229349ca46a78a1b4fbebff4dd94898fc3018d9e7fa63f038353f42b8a1a8d76fe7195434893ba656e60b94d7546c06e10a8220722223af30873dd4145bf38d534e63ba06fa9b1c755db5dacd922081dd40593fbf8ab8a3a942c298605c82afd7ce0bbee4270fcf93d778c98e655f4bf3a87a8f09fa6d551587589e7755e4a50c49022364d4ada4c594707943feca1fa48df8432dfea8dac6c7deff29b30ea0c27f5b4c3c3226130063826763c060bc016873dc774a25fb36eca184a7b2bf09f79b1e25b42cc6e7f6eaee8f4ae6c475c0e6e7d5b82ad9ea63083ed4f5e216c01668750d7021a57c839fb875bb3abc116f488bca2e269a167c2616324c31a104b3a54f4b50cb564a6ca39f5748c0f9680d4a8469e1c18e5e32ff1d46ffa88ac285b74230f751831d4e1f7e2ed5b877a8311b561b5b4532858dbeaefa64b66e363214f3d6bb7dee9982c273269896e8491ae0c845193bbdff0a5a51b6ff311221e7f7ccdfb11d375d50e70451cbd64ea98a520cc5d215234f4c797b349ae7451dc6e83659a15c9e6708f65ec00f17651cde2f525f0364625fac0d23077d95ca403c9eb18d8a64e450d8dc12e234c5408642e56ab888b0037ddb8943345c84a991b59d3fa15172f0846f04ba361672369e1fcabc97a94a46748a3290ae98c99f9bc86b7e38e1932cd44967a0f4fbb3dacfed044fe6a7ac59ea969ee1dc3a9127a54167f173573c55e45f3b35841545b7bf011a37e85c15f2c63bede2ad3c311b4e42321d806e04649a5e79fc430f352fe6be81e2e5815b937369c12279036f781b33817d1925c7830e7327e350e534c54d0b37c8af797e2e9eb5804a867851b692cc42cdf2ef70ca52a5ffc83ad24e61b728bb9e513858f52c670d4d61d6b2cabf90d0e7b3172646172564d1a98cd2710ae83eb9040e946397cba11de2ff9a84948de523322aaa3986afcb05d9a8c9b8f0fd77c3133a97312dfe44b4cd30623b7c031ec4fbd26d73a16352ad9aafc03", "6a535363", 1, 1185061483, "cbc682482b8e7ebe00c1d56867bf6c06d292659616750f93faa32cdd585cf50f"], - ["9696f23b012c51c97197099d6a25e9a91bf69af4c14148c21a675126e8fd54c5e0abcf2dbe010000000465006a638c2c0e150334761101000000000351acacdf724a04000000000865526300526a0052af643302000000000453635163cf1d4f0b00", "6a63635300ac51", 0, 509805746, "ede2b24c29e8e50784e01801dee43710599f387eb3903239b7b130cf45db1b5f"], - ["030000807082c403045f31e191dbbd06983e4ec11fa139d93bb45747d8b5480fd98ce8ffab58d69113000000000251acfffffffffebeea0d63a6be379248a9cc4d53f1e79ba486687c55580bed8b6f2d0b1adeaa0000000000ffffffff2338323f2656963a7f65df712e7dc2044a4cbab5d0a3f204d1bd90d5255e50d90300000003536a52ffffffff76f2b039bcaaa16f9719df86ef8614776fa76319193a98e1577a75894a0aa05600000000025252ffffffff049f530203000000000663536a65ac65ce6a9e050000000007ac00ac006352538463c20000000000096a635363006a6a0052504b41020000000003655251d37fb492387fc6b0010000000000000000a74f890100000000212302a321765266e09f2fb73692132b8c67c0fecc23a9986be74558e2a5b217c6017928d062155b2f66303fe6a9a67d636b895a4685ee9d09f2be9c068dc9f675b9574036655a19447d357160e7e2eb215385a1972bf1dc9fa2f8c01621266f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000702963f29047173f66f39d2eac2cf47d380f002ea09f98afe92bfd6e6943355f8fb42577632100cd9f9f46599953f8ec4583882d62540d7946ec1e02eb170cb1c2640135339f1fcf38ff741f64f692c47e06b80aea5606a4c5994dadf84dd62e1a770e4f6c170b29df64baeca5c333d84d8e80b88a0446eae1b1ff42076c1cb1020d625ed540b19cd27caf3dc6cfe58a630670ffc8e3fecd0ad4c2b1fa773d4e7003103882e8bec799dc1fae285d9062d38f79c464f56106791ab23981b891e270100b08e51213c0c2c896760d2a3f5ed38f6b675b67674546b992e2ba4788c1a1ba1ab7fa9b7925de009c83e699fe41c07aaec2b09611318f98abec32f026c1c792f3031ee1b163d792a190988d8097de30fef30fdb29e0b006ab2602e6a6bb9957cd8b021ba6554c4f239835b379121f30f70ce714a32ed4dc2c12153ff2689719de5f69022342d5fe501660b6ec6d7bdf38b62b1996b11bcf2a2ff5b97c1208177dafc2bc03081fcf87f13244d2688f6863f6b8b12e6b43b11071b2439fdf34a0d043335d7002067e0ac422b5f2d833ab22ef34becb3eafb1dc89ac07ad641a5260ff1976b18f9f303e6426efcac771585d2c8c3e888f9f1c55437bb59b2ea1f3547009619d13171c9d772a049d53c825e4f38891ff8b030179004c8f1d9e3e8e2ca772ae49637dbed8769d5611b87585942881b9b98d52701327f8fb52066e4719b07237d79084b91dfb9cf27df595644cea72b91883d2ea446ccb940bbbc30c4b3482c6f0376c3d2a9a7691c3a2f184890f639fbf16d240dfb394fd31b3b1bdc0f97e6471fdfe4debab7f5ad1871ef0e89ed516983a79d46e51a2706447f023214a85b7647e7e450b9828978edc9df38abb72619c7abfd40f1da85b5e0f8422836ba0e0c15db8aac6a38c5a39e45197ffa08dd6d326139439f42cc03d59f3599cb7768d379b15d3b986a3bb5b8b14cecac0a4e3210ffb431a41250f348aa3ab48d6ffce717c8798ec66d2f9523656ab37c569d01879d90a6043f2252f2ac6468934687a9124ab4a5e4a42917fe343c27636c9c9c3762cbb203bdfcfc356b1b133686dc465459518ba121ee7eff63a8eff0b76a5910a56bc1cf9bbb781da625a5d5eadd1be7170818c62db3bb64a6a2d79223c94b487f755a48a94ce9e3a879480419a17b7d1409fa094bf506878bff2bad59100cb0ae36ee8d21a0041fbb81fffede06ad07509cc76383ba08c91c587511bec84a35b68e091e4d67fd432ba8139cd06b636335f0a98504ea79817804a4cad934667bc5a096dd85f846d825a7eac68afd741d14bb707edcaecf7b8877204591854be83beb09f96a46466ea0421a4fedf82d613ace87c1a6b187c5191cd41ad03ecc9550ca3015a9262acdcb33c38a62ff15f6e9c268fbd5c0c449dfc20314d25b8ae6aa324db0b4f92ede07fc9eea356397d5495e8de374705fd29c9310595e618755a7835902ff8dc53b6e98cae6d7fafd6abc29ab72e362a62c854f8b127046958ec3ff815c3dfdf5c59d1df1d5d792c2ddf84a3279eac421ca5b8cc35fec862f0382068cce1d944245cf65058b858d5a4afa5340041836e2b625bb9c3f80d475e4037da445820bd7e50f176b78e390fa5a1d69986f486b5efaaa3c615223b019a77fad13ba8dacd38d18a0832e31e5617cc4ea178f244f2dd9c22fed0fb91e7113aa45fe1cd030ed90bf1aae91fef0c3978313c4f579381700f2230f28d3fae958978f7475aae04dae007b22e7a7f3a960babbf9b76b68f7c9e46387652a08b00ad2ca0ce9f9d69e27955cf4dad39eb2c0809d5772480eaff47e6ac5d6d02b622ce4635fe1092c295c7523c9f00900d69e4e2846298e1a6a0d2b07029061e42931a812d5688fd30cd350079f56ab863188ae1fa541c0da0422ce064baca169de73555abe628bcff2a3509488b02f07ba19f719376d6d45c93d9b991a964e11ffef3c94ca3dde20970d4ab5ff962fbd1f670ba2932d5abcf9fd18c763f4238539a7a70e50fa968d9e838dfac66bda9c752db39b936fa2efa2f8a89dde8e15c126657ad0a4018820b69bf5d397797e5f6d9e77deff889ba8224e42ee141f110c58603985443fbf0e4f985a3aaac92609c431d7ca3a2e7452e57de2d4e4ffffdc4434a3bce2b078b09acd7f73ee532c28a7e63a59805cfeee4761655434c6b24d7190bb8eecdb2428cf499bcfa88448483c4a6ec6d14fe5615df2d3b334f976fb934d83fd1daefa0a61675cfef8799364be8cf1a87aa133bdbc0f063b11d7cfea10c232f61a8ce4729ccb9756241e0735cd4e5419f8073eced3fb8431860588adce3e95305adad4d20965978f4fae6a7c63f27718bf86cc0c68aef62335d104da42827f9cc56b05763d7cd07c4eadeff63a6f90c20961fcc120e4fca537128b8166b741802", "5263636353656300", 0, 1455348102, "e67a4842ad42650ca9363a88fcf2d61d491dcfde086a040c55f59340156f628f"], - ["030000807082c403043243bd56424cf243ab27346fd0608f774cb1f7232c1261a5463c41c14dc1ef5001000000056a5100ac53ffffffff0e8f726021b25f9e0320934d1d50d0904dbfcea497be3c54e23abec4bb4d79910000000001ac680701098cf706bbb32021aca3b2b2faa548eeb79d0a15183c41d4b0b2aece18d033b9460300000000ffffffffa41e223b5bdf7a233d519d897ca1d610b9b3a09c830266198aff31115427bce602000000025200ecf07c2502a4cd62000000000005536551535205c758040000000006635265ac65510000000000000000030e021f03000000000000000000000000a554b0ab8d34c64680d5593b9f87ea4735cd268c1a5b9a0519af0f85a54c7eb1c8fbad6b80ba2ebb6806e56dbd1f247f56811f2383f2ecaffdfbea5489c2fdebf1c5fa756d0fd8ae961c91630feab8df8b2a4b2424d38f30d0943f5c56258d17000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1e00ef61a30800cc88460c9372bdb352251750dae899e9fb370d79c13e7756f8799a804df074fac25263646bf53b23e11551475533b474bcbf674413ed6ef31acd574c57c0f7487178cdf1221ab25a823624ea0a20e2f459a4b3ea2fbfd8ae9730769bc11585e11365b6814efa1827948e1b0aaa864a1f7f65efe05c340b0c032634e1e9982a495d89ae5eb9efc75c7c4d6e4db82ef13955b2a49e33cc9dc8c60215c950a3aaab19d5b19097f1cfbbe6ecd93ff58b3c5df8d9a8f7498a9cc41ee70b0456ddd586786d672cd46b1f8c290f97e14215960dfaff61f691e5b4bcaad81f00f0c656b2a560b7354b964d14d2c79da143286093ac207a7b3af5020a3019cc0213de5d872389c8ac9d30e15d2de16dd8ce37779f850eb9b67e0c332ebcf92661031ca29e9385a3ff3fbad38a03b3f13f8931ef136caf4882c54988634be7ea029d032f19b3f7ae309f19a886eb5ef2273767d7479006fb6328a256455b3062eb1b530304bf4e049f9349dbe7e68829b5bd90b886ec68564decb103d8b080b9b0060629032576614c8595ac1f7117138adb1f44ea3e16fc0ecd0d8baf8e8ccf29781579ce6bc9b1f8a0068b97963be85bc7376415eb1cc477f8d39919786025197977f7f4217a5899e99c347a17e848c38e74ecffbfc98ba0794744fdbbabf818f3ad15bc5621ea8171e6503d25910374b6975b608b6fdde143a482e6ebe3e56795cfef97ff54c54ab3b79ec0e1ac192e2f02643ce276e984b255eea23fce42d4f123466acd30c78fe0b45b73ad30f7799f1f114537b381d3620cb292bb0869f71f0e1f9ccb0791632c4644c2e0c38e080334475e31483810ad3367f53a2103a9542ca972ac270048bd6cd70461ad9dd81c9136150c3dc4373a941f6aeb8694a9160869a66ac1335698c65f43ea328bac9c5c038b56605418ce5c812e2e7f244c299927f09a97a1723829cbdac270fffb67286a2ce8efad7a1d06996cb9a6b7e6599f9393cb61b9ac6be5ac739660ee1c42e3cbf67d01ea5aa2a87f754e8e18807de6ff2346a548e6ee237012d79598dd3bea152d375a288f6c1504ef51886c9cd15f75eaf67a7b798dfc411ceed34ee95fb93e66002ff1030a8ce226a7a12bc82b3f004681300c9f9072e4641a9969b11e33f5f076b0ac0a1b8fa8ef64431ed5192a0e66a4416c41c0b894415a8cb4a0f2dee77492b680e8f3c4f8c82605947acda729ea5eb06dc387e8b5eb5d56f606777db9902580585ae2fb8334d671f88e177f22980cfdda5686afa3591bcae342274afebb36e87cae106f280fe941b1599f36ff60061c833515681546f506f5a71c58c6645486cbca1e682ffbccb0c81cb9a9cedec82c98e2d37f83e8fe2bdf24669c77e9009137288f757e17c8d5ac0867243be3c07db99e5980d126f3315eadc0faf05c60ad4545d98b43ce8c916d82f1d6a163cb2346f4b13b2d5b369d2e89a3170aa3c37c5a868b9f360536ded71860ff3950b234163d38669aedb4e9dbd1e6488acdf533c8b86458b3c980bb90a2f8a50c4f9eb07122f9c47adb9adb5339271fa6b3988a4d1b06ef6b5d564e7d53b0076a19f79ece5f132123434148d185dd4ced78bfbaf27fe08a283eab9044315089c836c7e1b6967a40484d3a576c9ee3543e56c6d10db586b3d6348166937cdd80c250d2b398565f0f0fc91ee8bf26817af72794c47cf63700b8b83ec2929ee6fb459390b3bc96328cc4cc8c6e0cfead3be32e66add8947c24c3789ff059878ef5a996c07168f71a3d4d501eeb2d2878cd138804c9ebcf82e06038247c6daeb164145d8617c70213befc9aa203daaa6194d653314e6f75eb16f24b74ad9f4bdbd0053bfee8b21743a246fab4bb5dab94dfd0452a6b384d3bf7069791d21534baf6ccdb8135f365cf1fd222c84396bf4fa0acf0428528b992b6ee96689a780a9764026092afee42bd53c3a4f8267d9922560377260db83c90a988279fa448ac27da43fdddcae9c5c15fb74544e19d95f463dae0144be60e455d4d6271e87a25b362b3ceb035a3285f857a1d2a3df42a45c05c135a275094badcd91ec09e54b4fb096c6357eeca7bf5a4e58ec867175e6a81cfbd4d8daff7340bd9125c3b19bd3cfb90c46a024da2a5b2f574b3e9a35c069b75e5b9bece30b7bdba1900b9e258cd3f49c9f4a55dfa67c71cb785daa681d605d62b1ed1217103ad078bebecaa6ee9fbc255bf37dc7b1035de3d3c2bfe5c8e76263a366d307377dee1f7e00a3b0c8b12c5c95a3a6e9ed80f74ead4b5b84a6c9c8a11b98c3efd1100000000000000000000000000a35a0a117f1ab3c00f52d441bf57eebf08c8086c14fca9bc84437eb140374afdcad5cb57a06ca24924f68ecbfb7d6245a5dccc812b6c78532ed814fd732441d6a813f8a160e960ffae7862260f117c7ad1d863c2ca26dd32beaf424720a0ddec000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000310f43790c9225b25a628bfdd2f18028e0960d8cd3e0ecb66ca3041b0c306c219910135aa05c0ae8273e29239ec63b51995144f1be6f4f50e8a9d9f575902b7d5388042b9c2102782b582779d479f3f209e457fc0c561fc56dd57dab0c3c97dc9cb2b276ff96ac2c801b6b417bd3cf3646de557f1b168aa52cf2c5d719ccff4032ed34f36581d7a3cefa9d52393296aed14de2f2f8dc52971ec6afcb8bd64b3b90326cb9df6225b01f7c506793ff88bc2179e49c2787c125dbbfa4a36b101519f230a080e1810d0b82d8d09a03636cf4e5a77b925f45363d04b946f7483a2057a50f2e43b76fe4e9f59a7fb30579c28f3e204e275d2686cee3de2e568c5457e214363022805311f2418d825da8e0b8b68bb4fe3efbd633ec5cf253ff0a0c11c9e2eda0e031e7fe9b6a3a8398475ff394db5e08af44dbb43df5ebc27344df284f1de3fa8f5020c6cc45abf574eb7ad757f343bfd9107723842345b451d80f07e6b038cf766d50319c227e1df4e1319c097d022f997e3a5ea8e30c1cc9aa681b7a05fee440448fe031f060f5c4aa07156d5f2a76a00bf0b2d697d9a7cc34635821f424bef276a4b03561b2aba7726700182fb2691877edfea8600e9f9b660d10b5b06cb61dcc158bf47bd31dcce8f55b1ce9c9a376d0afdea11b903860ae47b937bfd4acf0b9594831b00732e9d53a906345410569e1dbfaf6ad06a7d064d37789819627613b439d6698aaa05fbfa216a0e7be2b08adca04fb7d59ae3316933776f67556c5edfb110bd9caa6ff267e4bec75fc8142a994b5d46f210a89d703eb0bc3eb656b959b9427531cc2a8b9df7fbb79ee08dc2c382c775e31d655c0478ee0bd472713732a42925e430004c568302779c1af56978d5c2a3f67538b6945205edb244799050908de8750bfbda39819d4a732aec12d9c5209ac154b015c68105be4018053011ea5f12736c9efda341704c453bf0a1164d795b838841102ad8477cb16f0bad01cb2af1a595c3692e249c7fa844922b72108b56005737bc9afa442846942638ee23a3aed0592936a475265dfc7f247753733886247d467af8ea751eac2dd1f6557f05a2c8a0130e5aa20d650ebdd0c9ac55149c3199ca27eb76ad05ed5949d37c672038b026d3332bf74413d286eb7a723697e12a5d40308097f6d71631cec1bd12e066bd6bf24e350bcd6d4d2b116fc3e5d710e3784fc8d8e4cf401091bf0be4abed9346b1e23f53ee2c1a5465747db6102926193c0003a74ea76205666348c8b974030631f38919637db6f62cae9a9b61b46e91a41db247311337de414250244c085ddbb28da43d12993bdcbebbd440f2aa0bc7ac01db72e7da7b47326d003da7d43aaace464e82f66bcad056de10e839f1182b701a1133b752771c2c816c26600321a2fe6caf0af065120e16e6f207ca7a2a9770b4eb4bfced10b5fe75643abf72b4dba6b66f6c13f7d6f3fa8557cdfb581b14c0beaf0b970ec5eb0a9ccd7d1253a1a6c3136fe02fc74bb62c0756a810f762a0ef0254fe2ac7ce115516b341bcac060542b8ad083531173aa9115137745405ff4a65b217447ab7137aa2f521c26216c84f50a1a416de21dc219dd815759657e6a2192b23d304635984a840b0bbb71250377ba737f1add5357f4fdaf889f2097ff2ab3d9b1c67e05a638001c203323628ba492ac4467ad023b6a5b69ffd4939cb32404e3c536c0d6adfe2f87cdfe308abc4c198d642758dce849042c622cb735952cc3dd2d6c3799141411b7af4035e7b4e42865fb92bf587818916e9794dfa430d956ead3945c4e056c52ec3a7c235117d8c2f1e637d7080317cd9ca0510a9b1ef948b4e30c263a5890470976a4fd40c1d7f99dbc6962774a746c77a1af3bdfbf26e0fd8f2c19dad2221e00f6f335e9b629d28dcb97e48a630205504b3f7e9a3420fac7d7de8f0ea73bb296f55dfbaebc2abe756bdcfc729d6abcd0fb95d2eba5da11e38eb6465006c54009641db59f1d864d8ec4cb9f68dc46c253f8b4b209cd60ac5add74e80fd04522844e480d6beb490c990125beca8c32c66799aefb661c7f92d80a4aa4530c60bd9186230d2a437ba5080ef103cfceca98a11ed858c912c1296493f63ae8db81bca56ff06b90fafe41b39078cf43a9df4840d2516acd4283cd9ed692b321480e5205a48755eb25ebec070f7750d23458d872b89b43afc06aac9e76fe9fc1cfe380b2ed40452972ab3cecaab2a87b1dbda82139fc193e51ecf090c0c9f0bb4b435c9108a663fdd598ede41278cea8491d1c763c21a91d400000000000000002a7b1a00000000003d181b76f776682a6ef431665a6c8ed79c756adb48d99435ef0ae820371f5f9a7ead8e5f3c0fd524bd9fa376c181d79b6d47a5b62a1820d4c35b22b445675127bda75e0d002f52099a351caf05e6d63ace53db947172e831515f2b376466f5ff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bc01ff256ca1502e376992cd09e9efc54b51eff698bd9045f2ecccb1f4f89699ab9d089faae71c3375cbfafb23a8cc756c6b7107ebdf4f06c9f2511da26d6e0a1e6c3943c9fa6dac9e483519774f93c9ea2a6b095fa8eaf1a6495ffab84f9067e320252db3f797ba912240a0c558bdef4101855a7d77439d2b62fdb399cf11f6021c9aedb251a5179a438f664ae1eca73ef712a0679e3679d42a7a43670db2be2a031add096dc33ca9b80584d958cce8dc428de3522aeecd05450e4f5e5e35bcf8480a01f49e806d82c97809d8ad62a2f28e17418e0b1215d0f0cab5650faddcc9335bfe1540463b6d27e15c3f9dc0ef425d1463852c853f2869ca9dfe7dadf704ea400320ec139ade14123f421e1f96fed091655f57f2c09d5a32aeacbdac05c0a55ab90328fed00f889db9e709a36908ba00a21b031dbdff9710d416d72696ae2fea38be03039c17242d6c05a4efdd9d2ea764122edc914ef877b69b980ef267c3237056ae021c84ef1728e48b21d6850969d4a8a59ca7de6a73970e90501b7e40d16415975d021916bad640c1d45d76f8c065096b1d7f5fd598b571cc28b261916fedef13ac30e0d56c4e92a65c9f69bf805dbee29b8321a469e7c875845764bc0656deec041bb807a2718b36707bbe76afd0d64d6d84b94c3558290d5d8c587f90de59382df74ea3f9b09f540372af6ddbcccee40791982efdb9829e34829ba3094f21860b9ea584d1bfec9e4a98d53133d84083d5c879ad0a00a98bf900162e8c8f7d1ed2f13352c10e6eeb141fb942def78fb5725ba6620b85dd3b21d934d1846a8b667495fc7cde3ab9e15e32b5ce4c8717dab8d060bf8fd5e5402fb97eb1396d461e920633fd8f86ff4e8e0d2f364ab9c835f276b9dfb6bd968a0dfb85a272e4bb48315232761f09ccbce862fd73ff600ff9311fdcf1e44aa288fd74f8729eb747aec17c90774c5a8ab26322f0c2433b5e01a9f9c3d8125d790f77edd25321d40990e07501f027312b5e006f20e0229af1ec293885f5016f45ea383610637ddffbd9b8cc2c19d6399b23c35c1763157b6df5b672337a859f240cfdac9d195708fa42a568b26b758709304efba6619e36277640955e42ed06f753f4392afab1595c505370aa2293eb68197d40de7c8151582df4104ef8200e0d0b5290e1ec49b7f494fd43d48c70dd0f90986b486517a3fead5ea70b7deb29a085e5a0ed71c6a857a9254339e58f132020aff87428149e363a7cd05e62cacdff7e91396a9ba15969ff026051b9edaac2b87e73b85c30d0256f95a1288fe3240a6bb9a5187d19c658505960962f75590a5a6d612319105f9aafe136ceefd0f52cb5e355753f63a813a5f4fabe5423d7c14d925b5759c34f4732d72f6654d5f5558417d86248a8e31836c7b3eb2b0d2964d16746ab6fe1bdbabb9188f5160e4c21da5889e47737342abd9d3f3502a72dbb6c32daf99959d17a58d0f8fa068e768b288c982290a5826b7b6140552be570c6164a6fb86decac9460b97ae0281d34a33c4ab6d844ee49d788e1dd30fb0518d880cb55410c034e71f97c857aa366b1b8be7db5216fd08f045c409702eba4ca9aa895a5662789426ce3e55492d067ff2bb1d387da007afade7e946904b3172980ccda5c5cf491dc3e25b3240b7954e39159db078d10b3924e458a4d79e9fca5a9cb087edfd0731f97d87c6c4f855aace04024b7378f7e17db9859c821c7e50209719643b4682d977abb381033b99382b11647b6f105c70d02e9c52e19138c8708d773676e2117e8db3a9b13f7a1bd11cfc84c5a71d238591782c17df3f05f55e090e6b82a792bcba2ea8e8f1cee667250f5d513b2df7521d7a11aaad37c7e3a278aa5ab3b111bb076ad787439b9e378fb3d9fd193125301a65f8cfdad858af60c58deec598246abe82b9985dddcbb65eb3e0de6365d674a61f6f7140e339979989677d0e05a1a3030271a129ce0bde590893bd9f79f98ea47839f8557ddbc55944b6066e0c4e879a61ad3175a7fbf2866a7488d4011ea25b8a3d6f64fe86d6da984d1ba63ec1b60e0503d44e0a75b530ba9cc2e84cbfe8a4be7c8e5d88a360a8a26955cc12ba962a79bd81f37781bbcd58025900334870622044f87d4f251c8325f8efee22aff2129a9c5fd0dce2f4cb6e158e243d57fee21d079d6e0ca5fb06ac87b9ed3ef0305558eadef20d0fdf32b2d0e8651fcbedca575bed1eea497d28808adbb2587681cf32e05dd9458d39c04c786725b298ee8fb2ee4614c6b4b3d02cf46e511888562d1cd4f6aae7e4e3a844d5dea5f44a827e766a09fcbc8299aaceff2c689f6ca9ee401c3af566719b573ccf7eb717f39ecef26da9f3ac21289bce108c88323ca2c3229aefdcc0a941d1bf703e98ad2116781f494c8496280ecec2f41aa136c5735cefee73af808", "", 3, -752462647, "8604a05fef09d4c4cc633a211a64618b2cfb2fa844b7c55158f6663f0844a2c9"], - ["cae9c11102c6c64934578274b74c0063c9c6d54ebd630417bd79bf246a71c11a54997edb7103000000046351ac6affffffff1438181f7ece0fdd561f89482dc7129c85f748cf7ec0fbafcd637154821c69b8000000000953526a516a52516353ffffffff011c0d4101000000000452656563569f1a180300000000000000007f77b001000000000f490817b914a34a81c949e86b1477f7a7beafe649f799e549a661e63ea18a53e6142cae1388d032cbf03c2e74893d98a2c8cd4aef7b86775762dbb6ebde81a238400daa0caf4a5edc148a604268369a9929280e015c56d6f5e21c09babffcd400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ec2f1ab4bf4ab382cb46b6dbadeda6dcda30726b29b19286fda4f1a11ad37ac130c43baa988b99a0e6f4285b1cd9e9d7830c3fe7e0f3a1d4995de7ecfb0c494acec760324901d099ea2cc522e7ed4792cd29e0935fef1aa8af76ba44a6a6f51f69485c6cd2469ed6ced71605f22780ed96b0aefcdb1a47f525eb322a33c989b80319b11da74033ee927d09c04b88d82395b439523f1a714e9b00a85b106959166f031f169cf489edc4341d6e141ab5cc3146d0b32722dd1c4dd012fe401c7766802f0b02329b4fa031da62193efa81981e450d51da16522a029dffc27e55b746c5a1286f109325f56637e01822473ac25f5305d31de13d1210713fe7cd1943ad453cca0224ec2068af49569b4cc17a44019b4249e8e581473c7096ef4fb747757829c0750309f216c7a06db7f7a39e68dcdf08a35f907fb0a6b25e526e4a8fa838d0457b4a0320e8ee88ed9b07d90a6519ce5becdbd2c6acc95246ce07cd152481636af1ea6c03011a91948954b811301b3077152f1088556ad28bb345c11a2e75b6442dd6162e0307fd11e28b213e9a06f5f19916066da32ac3552e4fc72e97aba678f0c57807233b6e6d7fe1b577d65d44f10012f64367405d27537436671a04b2cbe1402c8d3640115f3152107c037d7de9e088df0341b479557f267297c5eb7f37a8459d0486843ea8cca2b7906643e4d482ab27df51528a5537a843aad482e5bc750546126928eae024343d1481af6e8f2f24b811ea44b5c69f5fa55c50e446d59b7854d86bb6b057a6811325a317ff1ef6292a99ab9cc049f77c576e9db2e719680a9e2f030080ab1fa332d00a974bd9ac7c7086ab135c922b155d65ecde1e8344eb5ffd80d8084974be82d24c4d40937138840383b3b5eefc3ff33d003f99c770dc53e36ba98c51ee1c00f1bd138f3f83d5c2e9e85d46e7d36b944fb4bef040dd371ee85f41c943219596251110ab0ce7a237bb376cb23ce598ba8d0dff83694e8e22a6377bcea36184fb52c1db2310fa1119a3b76ce797f064bbbb5ebe19b48586831f445a08ef9259d057ab753e8f2a8a80f368dde1915d3689c3cebecb55171e309f363742a6c2d66c72f6e1e6c4096b2a9f207eaff41c872fa4db53006dedde906f6a02d33b737a47c3ea275d00cd96be15d423be5aaf6ee8a575459b89dc96396b89d10ee17369de3dc0bc149afe94765dc0eea90286a6be1de70dc4b94211a5797b1bcacc9f935f89f452b2e992009b45c2bfbbf536c545de33cbaae3cc4e61cda5edeea5bebb33b147af6892ee24e540959db2d5ed9953fe0eed00d4e5aa3c8bfcdbf88cf2ca88133aca07a44ccf45e036795ba5dfaa37a50d1f0bbc63a7fc99c329cfe7fabcd72739b7c77e7c1f90636fbd30b093aaade39f9066337d4324ccc50ac166a3917ad62d1c98660b9e60275c7a96da9bd88686404f884afe8b3a562301f01e3c1fe61c8fa2c98d82a43274cb6b0de8b6edbbc97090c8adb26f3ea1be02a0ac83347525d7548ffa82119fc77173d6f23e0ad7e3f4d9e410c49cdf62382cb33e754d948fedf673d871ef47f875b45edf13ba48c0d36ce39cfe7142dd4ac5d873a25f001e31c2526756a847c719dabcd74080e51997f52eea4a5cd778f458718a3100346a020effb8ad26a209f53258efbd339dc6da54f34339c6b25b9ce010a74aedb865f2f3c167a077e8ca921e18272a8d54e1e1d9e3f176876eb434b3b98b6dba8e6cda6693d8e0ce82ee21938b119cf014b518dea2f8b7a60108b72138285e304f45bf73f49eac568312728ecd93d6a99efa65bf56ff22ab2fd4801b3f15fad84f18c5bcdb96fd1b8dac45256b07b6eb1eac159d7550be3a22d681ddb4ad54e7b1d7184ba46eb48889bd56f9ee3a95393cae70d0df52138e5f0b54e126fe9ac33622679da4cc41374a693cab7e2e197626edb3a1699b85e8f653edd0c328f67934ddf1d373cad5f916d935815dbe0667b635cd34d68e82ed466f2e6279f93ed1c32089c64359b1dd19356ae0e251c2fb973ea487956b6c29b571f11b7578f91d811c7e40ca21d7264138d5be10c701c764b5f6a71746f9a2a90542d150ac3ff9cd8968af322943991fc672df1f008ff4a75f417e54f2bd7192294720446cecef1b2b8020ab969e8f37dc4d5cc342501fe338568f95fc4b8a0316a5d080e8794cf1b1dc4951936d62b278687581117dc362d639c9012c9581d867070f27a3ce5552a2e278601f37f214d598076369e410a8c0e4935866e9459d36f02a085b5c18b26d6988dfb2202bdc4421a6d55f608d050000000000000000000000006166b1402ad3b14946dbdd9faacd1fef332914fb97d95d8411847ac6ef402e99423d5562e312517e66aadc38760a35706af9a0174ec1aede5b1abc4c62740e4e6d8810cf69b0ba047626cf8a408aa980bdc702ed2a7e876485266f4ebfb4734a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003a74b9a55f2eacd75be9c440d73330797120a893b018ed6d2a18dcb14f39ad34c3d21266f42b12443a2a30e8c2662f0d77bc896ea71fd8803adb3b66d6aa8deaf2638beeddc4974bb8f627ee94bb3267bd1d45241ecb962170fca0acffc7ee55e279111e2f3dc278b6d37c69b2f8791abb84012836f8e5f2bdba7c2932f944d021c9d12c21bb9b88b0a7dfb503ff5242f07f2130121170ed65ef3e21bc93e0bb90208ad225e4025749a721c6858c59f48734ad086222e867a6a9d4662dc9cb8d9b80a056521eab2ec67554a3978666f9aba11a6770504c3a57157e72420b9ba6ff4a687038338518d36cb2735ce8eb74d523c4c8fd21d269d25b707e5af7ebc219be70207228db4587c4983ce7ee9bf3e0bb7031e0371870fa9a4f1891e1387056a700b02044bc39d98949adc37319b13ff4b862a423eb8e17692cfbfab97333c504639d4031fb759b86b2fc8f680891d037c75a61bf4b4257cf6abf2a74cbf8f9b1237c3d903220b66db450bbae80f4004c24a2a64771cbb36114d4e426944ec3947e62cef5f032d90f24ae07d5f010a2ec54d25e5d04aacf1e831fd2e8b7ff2b8123ed36c4091b4f9c0df6c1b2431c03197ba42a4c186e50965f85a4ff18436522031a8f884c827a28b666344a71b41cc18b852719bb8825bf0dd442c397031d761331757cbaf49be2d811737ea01d78631a92dbcc9ff5eaeaee9d668cd3b75d99f7cb8c1c2aca369d7f4f7eea88cdde31a80bf40a1517aa600170bafa0ae3defdde017a0f18653d0ec8007a37510050ac55bdcc90fb74143bf04a4a3a6f2939694709665e83871eb8da769b81fdb730068fb861f572f2819db54c180c8203186e9ca17c99a1d0d382c7dfa79ff1d921d113780b5f5de31602f2b7b61bb0b6642b388d9ca9b1283bf2496570916c46bac58e32b7bcd8b1b21907f1704d7dc320931571f5d07ba29f20355c70073e43159d3512ef68c86146ea946407f72db50d6d3b3b3dd2cba3ac044b067c620747412682eb2bccc5b0a14c5115508a72ea87acc21bc5a1295633d755672f6d3d957219b53eded849db78f963e719986c812247870da61a357440d1f6973e87d806c4e49f9ee54c4faae07cad69f911725be8f079437a8d22f6ca73f76befa28f22449a75099b45a9be99e3496cd4731e147befea0f7c3b3df44a00c3f252b54814b7f816ede9b6203aed4df2740ffc0d4db0313cfa765418134023c844ba449d3e48a55340ccc747223e6888a3faa3bc2b63ef386c3a49439e56896672acdeb72557ad0d445419ae1bbfcdde04ad4fa5401a69e10fc52d858adb41f28d115460fb7961785e5f7e6f00443e1d2ffa17ba0619f50776c6f0b8e611a5732026ff70d74ae4265dc477db243fab153a9d13128ef918e4866ab5ec144a3a8e187c5d95b86465657c8d224a3825fcf2f28878b5f2725ab50ea7ae28b44dd357ae17f25a6f7b7bfe6397852687e745790a45b5d3cc0c1483aada72795664b026afe878c8884b7bae17dc5006a63c92e2d5aeb79116df19222d605989dc986009e1cc1a281e1565ca88e7094743f0c14679f417b5d1a80e3b1da35fa69d2d3610f03fd1371091d2afe127d33e611ea01868e3544b63a5a4913100be9d2228a3cba311a3dffd611518f15165fcb1f8a1162f3e9bcadcd13eba67ef0c61b6e327fa578cf33cb74d95b4d9b5fa931bbc776503aea270d17c10535bc922f4027eef1788af1c849a86104c4a2e9c3fccb8406ce11aec07be1087af1125e4e596f38e7864dc641a4f456d0e2bc0f8c71ac1c13c7c06ee00518ec85e7856b08b070b3b71f519557859f413da167b7c0c76964c3f634f0d9fc7b262c390fa59b7ec75822602b737e98b34f4ba0e01ce9328d2eca5b5d0c03503230264ce1d3a059fecae055083e6f325a7714df95b7269e564bea2f8ace278dd5ce7d42e47e568b0df45195254c562186164e8256397580dd0943016eaa717c9ea669f258fe1d7387795b4e59ee3e9bb16f821327bf40eac1a57c4415f3e0284ba6bdcdbaaeb8033f1d77fcba841103eae87bab5186b1513a9767e69e0e1f47280ba59707d272811fa9f6f11bceac578fe7e5464288dfafe0936dbdf6a44e8071ff41339867cf41ee22211c57c38273a50af57d3f06a7b7d182478eeefcc3c341dde18a5de7b019b3b97732fb3bdf93630c32b756ca34f2f134c40e432e99c9715c9b463f83e46a6c20ebff059fd2c8ce0f610e8c70c5b6ef7d5935a5f6ed9037ab197e5b29651f82769262f5004b7b3c45721eb8f6c2e2ac0500000000000000009cea290500000000ef5bc8f69c26caaa6c3ae74af7cabf44b8fb7236b421caebf588cfa50d33b57f04538f5a3c9d48eb34bc3ad831f97c8b53b5442d8a0e05d2a50ee19c6b6eb070d0c15d205fccf0b08aaa3eade6aa741607d8598399a295973a6ac5ba1b74a3f5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f6963309c75549327dae34100de603e3b6bdce8822c69dcbead1d47932e783250beb5f721ccc4d70768def43290a26c1885a86903e64b87374c22079583d278b798a6c798cee06a5704f7052489e5560762d313527b595ece865d482de0676b8032557b27b5f262cbfa40c799aeddb59bd377941402e49be56ba44503dc2344021cd9c3a46ce6695cfad4310de0fb636f81fba863813370bf4b2ff867974e60d30214bd2580808e2322509c357fab5245a6775c3b494d586459237e2521b23f80ba0b081dfd7c685ce945c6d572f819bf12b92549d82e7052a475e66c91e294a75d7d1c8906320d4e19ae4ef5bb2a57ce5a4528ca1fdf359b7318d22fd698ff63728402064ead90aba250d882938f9d75c9d37699af878be6061fce6199cd770b67ee7a0312f50f909a004c98ecc7ac4c7abf39d53165ccd05ba2920c5a40cd2b1a167c460315fa7de456075d8e49891515e094061db92842b31a501d50118d766a430957b5021e08581dc47ad41a33af4cf7633f0bb738f425e0b8c8058ca9edb9b6050321be020dd79e41a4f29590f4798b80838cd2b7c32f27312bdeba2db1b91488dccdd6b18f8be0edf5b7148e23ba5be3b42b0d6444fa2d2ad0bd09ec473c8cea8f8852a05ec5147abc1cb934d6e1adadab30374094456947dc4aa318e27d2f30f9fae77f8dbf67311cb6a793bf60af5aeafa5d969ee6003fdc222e9528e39a84ae492ed9b6c7b57a8c7c24466b83d8cac05f770fd8d16cdc6093c418c5666312c3e4bef2c7fe952364b52fe6ee83e453484ab2a3d95bd681f8871410ed13c9229c7c1ec4f8ba8f82bc34ffe7f4e943cbe58180c79b0c2982e13d3db0fec998c7fb4c3475cffeac321080542b56703e4065d174866494fc091577a5202a72c74272dfa36741b46da9eebd72be8add0e1811a2d7564282ba4ff53cf23e9bfa0789e34485950ab5eaf50fef25b74a826898f0219747488a5e4ed8a6eb7eaa066a66d28e4d5b7b6f7eb4647397a682d214f6c8108988e110991dcb03bb7fc858fec9a555cf48faeed7dab4c647e9936c8f6ae47dcd12d456fb9779ccd374bc15f95c7ecf9d4c7557943f85e114c9ae373dc0fae7f3c54e5bfc87b0a6631f6251750a6130ec870c799c143d749e0eb0873aef95d6152dd4726cb5cb6412cd984830f54b0756d5189f9bb9672a34fd5375ab334868c371515d0f9a3da25a5c681ebe4971754e5ee694e926791c5976438413eedbdc0786eba6091eb47fe09ba70c87c1b5207df9be4b206c5b7985e3f01218127fa63cdb35db30729d6994d751224d3108d678e3e7209e6f6ccbb4604498da24d78e092332d318052ef371362f28625b0efadda33fce511764c971ac02aa059ec317abff87402ebef511263f07f4f67aabb4703468e39604cf1f56b4dd1b45c50fe84a3f02447b3ed8f9403a6a81c441252920b234e6edd177f4cce0a6c9202dc043137a907a2c0bd76762d3b75b0fbb2dd9387c748a5b64b8d561987b6ee6d093b8d406fd7f9a96e34e8ea9ef39fb96ac266865d9bbd20ba03ee95ad5be2137f7fecd27237e30e833efa4b1db7ce6e12fa32f073c186471a273cafcc54bc959fe78539f735a844d1fb942c039b3175c5d27221b6da39dcd32f6eedd8dcbbd20abd159505b513e5f31dadaa4c5d457b3cf8f2d529bdea39a422369756c213333bfff930b12d2b5d71cc1d5fcc9a37bd9fe4efb3f7cf08ded83833653f000e84f43ef193e3821de9b842175eeea1c103504b9b4503295517bc3a7779c0708602176fad265f12039bb41aff4f39a7b7d31b42d474e5e868896ccea51260446e05294165aba09ae62ecffb3978731ce812e048fbf2309aef1fff85c2e8822a5d8cbf9693d9e148f1f1d0c8dc4dfe5c29a432e1ce57368a233a862f56b577f315ac9b9321365380a8ad8cdc41ac46ca18bf95d46a9ee2de4b3056504c34a64d32db91b5581c17b97d5c7525531c00cdc1d325971abb9d6606883f056314c6c9cc7280a360f470933187946b06a15165c4ba9e224b40367501f37ee905241527ca72654cfb120d0fa2a3928e582d17ac74291162ead26ceeea98800f8e1bf44d197efa1afb23158612a7e52498e776e5884510a402329af22d7016eaa4ea1ca7c74b2777bbea340853368288e868e85eef769e94194b0001bd0d0b4908295b6dfecb02482aaf3c977c2b81cd6b3a9ef05b685f06758a00716976c362718716b781c0caef2f4854a7cbf9172e50a57bf1e6ac36d63b37d1c0616dc94128db3a2d2577e1a88eb34e940a88a4fc9f976a0966aeaaaca146e422940a6bfeaa81d0515c1fd6bf089765108c6e80787852229c401a4cfa4cc85269591610f3c3944d3d09021a88024d6c67b80c504387699b0bbd1c5f9a71f6f67cd070f1c8cf56474d870bb72ef96d9e50c", "0052", 1, -1525758058, "818a648a13fb7a66fe6a1668773eeae0bf8619ef66200d5521db53e7eff5281d"], - ["030000807082c4030155aa002badbd96184f801a1940ea3d663efc3e97b923e4bebce99b0ecd6c50f203000000096a53530000ac6a6a51ffffffff042ae1ef03000000000153a27fb704000000000551656500001d766d03000000000765650053525251b29d8c0000000000055152526553a4a138aeef4e340e037d694d030000000000000000000000000857d6af41cb03c60a45f75a0db696cb6fccedc520a690b25cb31242c325691152e546240c2f5b90a2c4506981bdd970ff3bfa77f6c3b8be9712bd33c6048aa35e87d11efe53ff840deb521eaba884813efa0ef5575444ca72f63eb19b31fc7e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000992b66affaacf323be7891d87678d74060cbf35e4f05fc64ecc4de4305024d6bb9e5d524a3d446f213faa4b2d8528ff604b674a4d49efb488b711874f3d11f8602270a7d12ec83cb52594038be52758c7bbfde5826ce8246b7710c69ddd13d8c4fde1474c6a812cbd12b32d2c81bd42a092ddec96e1bd90731976894c9e5fd0a032366cfb8267948d008c5c822af4ca01a95ae0bfb78505ddc3075b04ddd996db5022924c2649b505fd779e0e26512865f70c958a1dc920f8c87e68ed5330320b9340a04bb20bde2619c19b607c46b362dabfaac7270489c6c3e11988c994081c98e3adbd00bf9c4f08941df6bfaf4e3eb07108fe00a293e4b6846c674442cda203abd0208fc79db8fe83673f60ab4b97ba42892911035c2a82131862e688da1555ac3080224d82111f0792c2305df9bb2fcedb9a2ebc25396d4c8fc439aa3ba39568cb162020473748053780ba87da9f10bd48c0c92065cac3a47001a71be7dedea86c88371030c65f0ea85e7a5360763c706a94b67e83ec11ab5d1c2b61aff8f38be004164b8021f7a58d60de36401ed233d207c02de923c536486c8ad838c13822927d7ce6cdcf539b25e136e2ec16926ca5aff0cb86d62e328f9b283e036fcaf68638429666c0550038f04fa27d576c5cb352497876f3a85c18602b878db495f0fb608f6dd5e3fe586a964f83a114882e6b0118a3e2383462a8544fb4fc0c15f1376907e2dd82e3b9413205f8226b7c9b0d2caf2f67dd766b23940cb3b980abc4e084fcd94d495dc6ea92a054203c3e6c2d77c2e59d3ef92dd56340d2fa59a9934fb8d9a4e7d6814cb9ef972ab349075f3a1a6dc334673911b45d7dffd353cb0f746460b43ade164bbf27240cb05b50c26e61e3bf9ae203f4f0b04290b965c0e0e2240eded550c2e8ed0e5b7c6b8daf0000e289f5cdab8a5bebfdcb9878c113dbca101483f84e9631a8e9c4ecfe659d07c8a872355942880c4c99f0b44a8cec14ba4b0e55907fd46cfe49d696f8852d11931d0655ec7811bcc75fc9e671bd6d116389657fe13436befb8dd814a4d4a5f84dd26bc0ea68d07daea484f9c44b89377ea2fbd4712afa0a5f40a6d03b796de4529f9fac137325254634d1192451b500ffbe283da018c9336eaf0451491c3132f0260323e6db6f48ee627b3d6116fc1688930b736622f50306e57d7eb399a6270f6a52aa93b7a317d4e2e15a7af9f44d721ec65fcb663252ca16171fea3502000043736683dea8adc87d682ea1f9a25f9b2567855209c417f7af3861fbb2f0c47cce82f784bdf7eadd0ed93ae85592415dd9b136f7ef56fe07a2702d74dc65de98bd16607c342be9baf6db4639df06ccdd12e159eaeda112aa320ba9fb3caa22ff4235e6c12e6a11df90675f8ffd8f706a7e822cd337e8fe17245f762fd040a093b7fda27bf00dc09f0cb56e0de2c33fff487c272d9e18fd805c48ba41bc9d05efc6321a952bb00f911feddbe2d5acac117ca5a7923613df760056def246161cae2a728a928e0feb2dcce7814df8a79f286e7b80cc2b9617063acba4d1e77f93231d2caaef96907998ab4c013e583dc75bdb830686a75db90e3dee09d133523aa248383ab46ac5aab04b9c7930543d128154de413e7b6a616348658ea2761dabcccb33db21fc564ff6148dfded980fb06236abf7d1dee22ff0dcca9f4e3dc7fad27b4266cae0027c0b48380442ae2eb527ae0a20c5a5141afafe8a42ebd344ec521b4ab66dac7f2a947d2d82f21776399829f8ca13921b2ee82add74c930476126d55963e3118a8d7c8cc922e77b3cabec2165aa9381cce841ebbaaa1e44de1e8dffc9df5f2a09e9a529c96d1ea4853a77d646bec21dc6d707327fa881c40b5ed839e2b570de3c70213b9003e90a0469ecd602d7ab6f5cee24429fd6bf48f74c1a2ebb21c918f2ff090fff3a4f69135433b79d3a9344a4b817295167f7a2e991edc42becf3f644e8500281181be77ea35821d61bf21e52df2b880ef104cf5df7c7dad43d48146742cd3e5a4432b0e2060b1b50eefaa7252fa988e03a8b1e70af7e3d5de3be0948f7df7924ce855c5786ac28d2d762cb54c25f833ad1002b8583be394d73b18d00872884515e6905d1d905349b957ff1a2c9cd54c4137ab971d3167ee23d41459636c6db87b1dbf14373ea1f95c83b51f319e492436bce7c1be765bbe08dce9b17b3f09244e9c5d8d8cf787d37f82e9afe758f33cca9ae8368ef6ee1e58d1d863f42adb83153c285fb42fa9bac0745a3f33661212be549684677621a3c712afca0b0000000000000000cbd5ce0300000000b3e297bad5826e463e08fe8856b6f6d8ba4077573ff62d2a510ef4260f8fd77c1663466ec5ae6181787727b89580470209864733ce65cb44adb5008eaed6c69bb06908155847ea8e5b9433fb1d3c3e38d98a88dbb44f8f5d4bdc190ce60b9bff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045effe3e979d66c535373a81fb92e938c499c379d16647c230e585d38c367510483fac0768bcec322fa32e6b1e9968ab54e0c3e316c63ec4f38957b064b4ca92846ec93924d9bee3dcde3bba74dcdc9e3b88b0e59d5a6e97050b8de3dcce6a17ed7594cacee5a3619bff7e4bf25e1aa88c02c4566e0d625cec7b0687ba31071a032026b07c86cb340b7b6be8539074eed0adcd5fb0463e4ebe48497b877540087302073ade9f9acf2be1b4129f0e9db53916365d7152efb864443a579f0081bed9480a00d4d8883414f6206adf73228ac50b3a49c77c1916bff7ff41eb31364c5ec634c5b32c77d80757e45c287be35eab22047b7f8d62d0fb05ad4e6bb1777ec4d0de022549e204fd92722d3611ee436c9cc35891026ebe1c5ff663380ffa46359ee00b0318bf6f303e07a42fcb61e5a20554b896d31d014deaf1560490242dde43242dde020edd20e310e4410ab655897a5e8fbf17fbc55d9c41e28b92c099c9cfad6f4c07021d23005240139f713f80336406886a279a123583b90274d9dd41b6e71df7e2bd03049c656123aa070245fa562fb4a43febcc5305fc47e72a297dd30cd1d00e03e7248b8ba61e47783686c08745c79ec7f67e8e83ce1cd0e2dc269913dce13a6ca4cca6c3eb38230f46aa6494f3fa4db641946bc8751211cf44094b24353514efda33e65115113f28a434599e764286624662c0042295f935f9fb5e0d019432d3657eaa1ca0ee868c2d3d569f2d06e565b6887cbbddb087a1878efe347d35e2c2675a8691a22d12b622d0b0bb6d691d252fb240bb8e6422f610d6ee374abaeedbcc6b9e57135afc4996d83f3a16c59ecb3603a9bd6aaad9cf3644a176d8ff704bc561c1d3e201918b502dd5dd5277ce3e75e036d6b9315d7c4ed28a9fed96d8747d0087d87f8aaa896280d8d1fbeb73fd4faf94ee51f98a03c7e54d64df9c3500178a72c2b37eac59513d036cf25453a1798d1c4998e6cbe6fd8033a7f7f73f8198f0b75e6f8fb152fbd56cc1632d3eaf2a0c2614060a073c864777b8b6cab88111621220486b37cf54c083c2e36d2fff36764360c6cced2e9042d5073cc06689bb6167c219874c104d60d2b507119642655a34e5d8244480d743a0e6c447f7155d6fb55dd425bfeddaf59d1517da1f7cee21a39dbc915c5d3ad3cc50d31ab9b3da3f8257913da677338af3b461dd001f15d2c9ec919a11db73f5f12461a9bd3525ef1faa94e52cf12862597d9edffc73d9c7238afbeb4efed18b39f52eb7cd204159c6819300a44bac29d620c5a6511e7bd08789d7250829ce511b3efda2a0074d4282e0b129a81ffdbd8791dc7537b7906b081a45f417b0ea925677e69fe1cad628cff029ba904467f7a88b3de46d6120bbc4fb81117f5146ef29d8dc4991ef96e52dae85808b0c1835afc3a5a48a7a62a43048acffceac5a84242425d16a3469a8b8034f25f612b2fd74e0c3ae08554ba52d0afa8b45c30b253959f7f38e607bbad927ad4e22a8ce9d116c6ae0f115e17fc4cbfe43328969cee8847ea8e2929adbd0b7ddf05bf43a2167f0ee19fa061eae25548c77cfe7d483934735fa99a74aa3d7af6cf742338d1555f31537bdb77f6ffbf33a646e0d3a348d4fe64edfdd82abd8adca9085ff7817a934aae7467b74f6096bcba283ecc113c9e49b1285c51158690133f2dafe7a0b256ad42c04545949d7c91d441d7ba8aeddb52840ae6df6adea9598468dbbb45cd277545580532a380b59ec99ab379c7b8384aaf4b47883b86b7d33d739cce98fc3fd9fcbb44086c80ef47d3b73b6fe10ba51ed7c2d474e17c0e0d3f064e3ecdecbf4ff6ea8f013ecd4aeccbfe11a1f7c88a225282b742501e7509980a29d402812af11c6dece9312b790625e06981c5c7f2ec9df936bdb3115229c90a56dd4a9a96a9280df4ae3fa2f88dcbbf386139951b5193e452f66d2be64fbdd9a43b5fdb3bd0190fe78cecfdacf875fd7db0faa90667ae203c1384f1f1ab082960ae3b2588b064032c1120376f986a19a789c050892149c5f98a68d383b5eaddbee479eace8011af71b10f114da59f134b13fb7e13fcaef7c0f2c2e6bb5b27d9c89d9e57a3de07877342255779de7bae7bd36f5cd7e8267fa8403ffdbcb9da1d393994ecae3df5f2d90d065cab8d265ac5aa9606ba0dc67dbbfdc994968a0ab3acc37317d726289e1c0479e116ecf0338cc1188377270c46262e336bae59e3b7c17fe488abe8a3cee155072be2797b724660c564582db7e06a334114e5e650e24e59d219c1e52d7f44c856148c610650100000000000000000000000080ceadfb63b418289333a0d80f90de498507cf2b31d424c354e3016ac7f55c4a66ddaad20be524b4b43db04846102ff82333c6295035a42717093985466772303d4a8ed3550b21a0b45ab0b8bda6871d37b156bd1982cfc99f0fd010bf0e8b6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a9335956f221928a3069fffa3461047cc1f524a01ba904a753d42de46b864bfd05b108300dd6dbacc2f877bf398de8cc90260f0f0ae256b9710cf6b42b312e7e1aa195e8c860345d740677fb42dc99d60684476ea6d81b832567027f3aa7a3fb42ec91c5c5c38ec80e7ef2c07fb559104ec7511e5dc74cdafb58b61783b0031a02240a03cc9272b3ff4d9d6358fb5647e22b3b3c4603b69aa43667140a683f27290305b0f155eeb9ad56d1ae975b8ea8839518d851f680807126ee0223626e8ed8d10a0906391c56e8028341d145205a1f81f7046e288bdc8abd1f01b2a8a3cbf7fb2aebc3a4053f0f13d311511ae2f210f440c13b6292fda4252df60e0a7e7cc7a7f5031409d9ae11570d5fa9eeb803d64717dc926405c77446d8d0179535d4a427f9e503203c772ec34617657270e83db9924e3f90fde4c99022ab5c1e6ceb4c8fff1b7c0309bf9f3f7684ee437b08fa18b8e976941c7a18fac0a38a3bd1495cffcc2dcff00302d56e086e2b06c1001bccc3d76af5520c66583abbb45af625d184638d7eff4c030d325dae85c5317f9be7efecaf174ff5fc62a1900b586bed633b60ec2b89fba19ce62f1c4284865dc3feeeb3569914433ccfad58493b333f1a87d4e00f97f882e80d4b3242b0283fcc3e126adbf5095491908d3fb809616feff8d20edb2cf70f4b465064323956d23662b09967069d5b7f7dfe5bdcced4171453674c47ed599585c83367b97c10fc790b8b04ba0644181a26d5f07d51f93c8e1483f7b330f70ac37d664253a302ec926568ff751639b194b594b6c28423216a7d0b637286f6b51332dc75ff0d2a69c6934a9604a2fcb772ed8870097ecd982a2f82ac1ee6a97b361a0fc9a2c3d93ff80834c8073896048600909e4ad15e50f64b4b3e6761c01131122c23067347371f808e3934ba905126a41909dd5f975c80e74801e0ba564b4f2a6ba0a27364c860e2285e058c62dd3c92901a5542c4514867149d703e8ebda062cbd584352c5d72c588338b05401c394e104703d941087d336137029c6238bae2e25b87b60dc2c0b50493a52c4f51e57680d9e4c7e7ea739fdad8c98aadd174df3bc4fa6ee801c38e7c767593cba5ee22690b86cd7bde14318ec36c7dae322d5dad0aeeae7c25c3178442cf760801fc553d002efa9af9879fb2469485bed630a4b9847b6b0c0174c04affd268b86b235bfa24222ffa714be6e430a13e732a66e39e0b657f44cec537f97356c3f5b36cd5da612d85ef1fd7109e33140e4e8f836d3079ec4c33ad5f97cc618341478e42e3dad269ddea28bedd4d03103b4cf3359db7ae2b8d9e4b4d5cd870757772728668a688e297d0d944c25ee7aebef1b555f13386439d568ba9aa4ae33f77480ce9f3fc60a51aa83799ff23246c0bb049b41dd4d73b94475b6f091105340d16c460efb1ad1b73d9b41ff127dd94c7eaa1eb148a64f5d7690ed027d9fcd82e9e6255939ccd88e5811ea619de69fdea599ea8bc5b7c4e713ab7fb9da4d4e5189ed1785ee7dcc571593d5fc8acf098af4df47e41b937a3a3b60ba1a8b67668668cb81f2a03507eccea76b47c9d297b96dcb45bb7166e1c9ba7ee49d9649f695f66e3a60eb9cf6c4b4baddc2e5afb20fdcdf0495a4df758e0c4ce8eb601fbec3646bed30e39512c0daa568ea916e7044497944eb03cac86e4482734b94e449d8497026da4f4f2b2134a2ebad57a5d3bc01efbf378ba9274e4bf04b83ac6fe8f337975f6204884cd3011ae07a2b6405d3a1ba08354047e4ab86a30843aef47e4d73f6fd28009e32c4b778a826aaa705b8c4d83bc084539150f8e3c562ae771de269182b3357f630d40d4d1203e1b21f5945e070bc5437d50b5146256cafb0378958a97d61e4e5a4e19e4be01472e063cc841d0418dd8159cb155bcc8b35dbdf43822cc89e60fdb5d6e6e1046eccb034c91ce41ade9aab4df54a1d341d2d752a594f2408eb4527b87be4ad2c4f229855f4fe95f8fd5d4d324b7235c08fa60653b5ff1cbbfa75e4400ed4fbfafe1a9b7b044dbfa591d10016f27fbf2806fe85c1ee5cc9c4196ea8a2075ac233d17a20029ef0262ef9d8fda3eb27e0f998578866172015fa7dedbb7e25a3d08a63151b57b21cd0e5140b2fa7e79ba4039dcb613c3978da7e4eaaccaa39b4dbfce79b2caa6ae0ff63c36d167566df7e4d2c5d1ffbd648e83c755e8d40b2df6e133535433b8f17bc8317d2fdd3c5e9a65e174a919b319d56b1a11f7f09e48c9363a9d70358a60c08bdcd7f639d64e08e34259399908019b3fd22b2e0baca5fb7b2850930b8da74ff1086ecd6dd45910e7e5be549a999ee7d7187b6439e2d94c794dc156c184036e6d4cf337952c9f6426b335e5ad316245be8b23af1f3a73f3c67fb1f409911ac1f9b452098fadae1c06adcc99cd4b1db6c1870e", "ac525353ac6363656a", 0, 738873910, "30f9285bf94e0ea2061e7468bcf6df6ce045bd5a580b33743b54af400c6628c9"], - ["af6d3d5b0412d72e0cb3b2687ddee7992693fb6c8a8367913458a030e1beabaa7a62c7be2700000000066aac53526365200eceea4be0ea25b8ec680ef20f2648e96179b61391b5541bee42ed49d82804f0f9264903000000036aac51ffffffff5df5312394ecf49bdd3993ecea407640dce0b1d7328b83bbf7a2188ca5c8ebec02000000026aacffffffff7aff748c75c4a5684abcad20549860bc85a490e3d22cc4cf7ca75e039bee2de7030000000152ffffffff04f1949b0200000000025253c45b01040000000000eb4de000000000000165134cb20500000000085165525163ac53510000000002a53cdc040000000000000000000000004d7d97647b08b2e344f0fddf98ba8185b0696b11a40b569f2473cb2759e3f2128dae2106a815d0cbc84db101d1fd4673af936aecc6b9b1eaff328456502aee59460bb372e2d1feb26d30eb747ac27d487a37e36d7e46715182d15743d7afb7f800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e28a5c05c8797d15bbfdf6767c60d5ef5b512b0fcd3e1d59c6a16662837b8f977e80e5c4ed1d2c8c33840e006beb687a28c1f39b63fe4fb49ff021056b4560790b3de0f99740854c037b03224d3a8a18ba7d60c2f5431e334483855eb36afe8bec68c3d7025fc146109b0a087dfd442c319a5954a364e41251f1d2ad12677b12031f9448658402b44ecdafe8b54e57353b2fff7c615ed0ce96d68611f62286468c022d7e1c997d8d55b1cc7a8fef458b0a98f8d1b808c27c40f4ced0bcd6f31e6aaa0a01e50856e89f74efe6acff5052a9b00f4d8bd4b1220c8cdc13671f63d09b7e478d95d0797d0449cb47d343bf59175c658b4c68189d2a9809aad1f91106c281e702173da46c1708ad2e7c5142fcfccd4958e1e5dbdb0d738322d63f2711a321f186030d0b7c39dbbb805da3b876dd4f87c5a0c8101ed739d69cd976b18c5846b0160503188595a32c2e42d111b59a253969c47111ae5cf0467a7a9c76b21b1f69129110022ed31a80cc8d92ef3d8a7865d7b08803e5c359ecd84db919967455c3c5934969031ceb69ece9bbb398ccf30bc82e1d9e5554ec4d5b66ab1489fd975e7b928f3d80a0256c1657041b08800c66c1b2a1d94a639c00c24d08600ce25522abf049b69ff4175fa7c30f5654eec0dca68613a18b2b255fdb767a538e15a20fd15b0480c14016222c1bfa3dedaf1682cc48cee605979482f02f53f9fd27fd8dfd8332afa66aaed38995accf741665c065a440de1c0380bb1ba7f3bd2d40fe8b60f0e2e6062e0c6cd0a9d89e64281e00971af14b52d9fba9cff7a438cfa497b6c7a928f9a870d68af07de56f43e6a11b8c8b4869481951e9b30ae071c0e7fa1279edc20f5772bdac17e636d8bc333f7144ad33f343321700727a5afa18f573b79d8b3a526c0f4a242c6f1b8013a1cbcd48a0e03bee0c4af41831c2be8bfa75868457c38258799bc7dd95b445bfa87663a993d5e81510cd6b19ce4d1825b27a2575604b07a5dfa338746507b23d930ebd1988cf3989715c1e27dc4f3f594568e267e73349009c8f4d8e8d5a6c25781378eedf324ef6869099bf42980b82d5454cded10dbbeb326f24854122a953e5df29e8123e128bd6f570b4f2cbbb1a3964e0b2fbc88bc1ab3f1330f35fa6c9adac2201b8e130d2ecb587b39afb3ca682b50f8676659ce941dc67785736975ccbd570c1da1888c4f9be0c596355a6a3931477a0f497636cbe6496ae17fa3435d32746e229ce851e82efde594f2eed31e47a500f5b326d656d8fcd085c24de0b2a4c71b05366cc2e67fbc9fc7a07253337b62a78720602b9a725d6c7509ae8329b891d14d0ca86f8b75a1d5083b3156122446c5e14229a1d8b6ef9ecf4336019762090b0528922883b6d34d9a4108915bc9c8eece4d38372bb101b2482facdf3b8c3c23e74f8f3061378a02733592cfaf76951d5e8ae54c151f7a9464684abeb2f00c662669adb311c97a840b2346ad5d452c4b161d52bbc7c14307b82799bd658fdb275b3132ec421801eb697e1518f9c7f3b7329d59462cdfd674ca3bcec2009a3ff6b2d218bb69a2bb705a2450505b962a9e38eb6123458d9047a2da1256787e47d33bc062b03b77833fcdbb6c913332036d8ea28a6614b2c52c2075558da832dd9089d25ab6677a10f370e3a4c3b971ee5ac9426bcfd7dae455e8b0a5a280152225a76f00066128e020619610234047618b310c5706e7a60cfccc6d6b627acf9a97b44fff94e38de00d98dde55dc0aa0b962003662e83e51628f7f989cd54f74e6e85fff7e0f016a3d44063e9106aac39f960f8ee4bb17814c20780acb3782b2375b3b7e3e029d10101f5105545a5e3b718392e1de011737fa6f8f5dd06c7cd5349d4f9339e377f6d7c5cb5c7cfe34b7938b6b4fc4b21294116062d199a262bf4978dc2174f07fd21d7018fea4b8499fd137c253ce7e0a798f7079e2f6d6096490db2b62427fc56f851e284367f8d71e845ed6ee0c15bab6f671075b2efd44d2c9c97c5f8e8ed39ef70f6002bbc50fb04cbff6b6786485198e1e6ed0d114b7c742a816a834df4660710506510013052534ec0ef515319c587d61817a168fd6dac13095edbfb6d0f3edcbc95d6304a202a83e859c2bd591f7e514df274f7e5a28e32cb62d29a090987894d4f035f3963a1a66f9cf150e506bc18574ee99d95078ea2509c7e8d1affe8619a504e507c443698543611e514f37c1c867ce48194246d5128d2a57a6919f3776f60956ffeea1b1ca5b08e1a43e1268148402caab497a70c2e9c61c927f910000000000000000afc2760400000000bd3a5985fc7543f860bc033911742134429f327354011e958faf07e7617ded698799bc7da849d0bcb70b9cb1afa834720e3885bb32ce5fac5041e9c274d46509cac6351480646db3a88eefcc1d949fb3227952381f5546ee7ff821f67e471e6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d7bf52feabd645cbc80d37eb725ee648918357884087c0dce44713e7c41e2a6773c617eeb035ad8b1b5a8a8fe6ceda24e1708e9b1e0eaac2eef0554c119f6ccad5adeff657031bf553cb79185b7172ccd8d1145a9593e0a47632b55c35851048f7546cd43edd53d6b3cf0b4165082a4078ff80ca52958bf3bc77b8bd9af3833e0209d95a894698502d8c64adb914ec699b5354b2e137b87055a9e1b1999c6735cb0217286ed488ac2d167bc673a803e6826a73704494d6e00cf99fe18cf1d7256c490a02519b196d8e403a779fcb8fb2ec7b662e3e4e696b29d1386df377a939863c201aee018ebdcfa717bd63fa8891ce2be77d9aa67fa887b67af77a70136504d99f0313c396e9d5c78ea9ee6aa1570b3a3794a10e6cfe633125bcd0f98a58458fc50e021fea4406a5fc29e46315a513a13571fe9f5fe3444613a67569add30c75163cd20225920023439146e229dafad56c020f499e2c6904cf23196af1696d13839218200221e2abc7c06d38837ae88ddff8619fb0b6c8ed2296e05a0dcdc1f4155ee58d350324b967fcf87d6ac1fc6d776bad1b9135daf9790d5ba58ec4d856d5ac2fb5cd2e63fe84f0a5b995ceb325ae273cff8c7487cb5fa54ff63527d8c274efa94cb0574a18554f8bfbbfc2b8cdeb0ca6ed0d523bc83f43e7b78bda504534215fd4f2927991947d2d0d6a20f6e3d9eabf517038a847173d5a082a71ce5447b6f07e003d23346a352a643ea4e8dc19c6d0edf48ca2878d83b3011d73ff7620575bb8a3bda5578056883a0921912dfada7f21409c63ea9578428a001c5a0ee561d0ecb5c5e6a6e63afed6f6560262f43f0e77dac128f6348a85eae3b0bd58a4322bbf4144686a84d389685734be2dd843d50a209ced11c72c6b7d6f79c9cca0a5de85295a7795863c5c25b70639275707019c4d148d0fb69c45794164c2a2b1fe0048e5c13a829e144c40c1a5a512fc665c752553e678e6d74ce48b1c36441f22b5357ab818e332dbdc2edda0aa367b522e1acdb8daa248b40536622c8dcb0536be006a5d7d1282ea8f08f41f16b36eb691228d7787c9ab35556ce0342a04371433d34f2e3b7cab98a3fec4ac60d499705a93c103038798f30b08fb2ad65faef82917e3fc18e3553addcc0dd61eedff8db63f118884cde3665df2435a7385eca72d5b8485d75de6e2013e020dcd66f15cfbcd56e7009dde92be4041b8f595c7699def551423a1a7fc31da83d42eaa14508aef02872581a31e8a0732bdbdd41b16782a2ca0c7e4b00b5e1913d2c3900071f2e454aaf957a0561a783ae999da5727a34dc8601699f459f49c3a469a63cc5f8da9121bf2e3602aae0bad3ed1f934d526c57ea1aaf01ded10dbecace09269e6bf8aa1a43c29fddc250242cb18f39213eb838c3739e7407d35424aec0924271f941e4e8440dfc96b3b01c2ab27384efe7631bc6d8e5eefc3dd891ed0c6b0c8fac66550f79967e96c2b80edda01e9024cf2994ec806bfc041b447f903e0eacb5f39d1100ed2392068e7785700ffcab5cd97feff3d885f0b58d24b0c316473500b1e65e32d8fdfcc340731dae1264ecc66b4989b73526d71f3c5fc921b92076374fdac24e686148d8de8bcf1726b4a7d39a13829d682c57af699977276d2eefccdbbb6e778c09e7c52848cffea40b06964048f9b45892758a835d412ca846cd17fc0ee42075ee2e3e994aab51fa844dbf268b91b42b1d905cb40f663c437b03b661bb9a73f48802853e32991fd1231899638ed4a9aae25f83058992c5a2c80b3d2af71bdbd269dc4564ee3335758e3f97a2ddccd00094826ecdf1f57c41323bb6c66c262f0b1d2a7ef202ceef6efa73beb96c3608b1c21998a22f1040d979e45d423b68665e7edd261109bd844df8298e51fce949a71328da0952269ad22d0900b1db3c1c8805a6d5d03933d434be136b61d9aaa7c38a49417a01aa5b1bc0d730863c6980a753902a1841f4424c2ee2300caeed9836a0bbf4788110ce7ce7d2f0c2839fc2a7d04de49c05412a70e381c92d37b9acea139bae48179b24402f78a6429964b4b13d8c7cb2c0814563ddab7e1bb84b6c4abd4f209627aca35e4505a95135645c79b1d4976b48a8080043d079284a4e0bea227785697e62c4cd15ac3b83a9b7954cce386efd8ef6b9e6b83667506407808181c5412995edfbd83806fed6f0c8f1744e1b2b660e813349bc18f9754daa243aeb2103dd7b3aa4751bbb7be5fc9c7f625e10c7adcac1611a7ddd500f98c6cba327452c03f762d6654290e61e0a039f7e435aa8f0df8d7075ba878cdf723baf5656dc9675cf6f76501302e959c58e29256722f43ee24cb38078183371945fda6799d05ba0b69f41792cad80f053c25c6fedf443641434c92069c52dad98c410e88465e225108abae6665ad00089e0ea9890a", "", 3, -1676373295, "df3214ced4ecac15b188894cd9e79dfcb5524ad1865386f65d76e67d3e45777c"], - ["ff80ca1a0244f6e21d58ee50b3fc0043c4618b88a7a335414512ec9e0b1c91c858ecbd2dda020000000451655251011c1e88000199291ce0b7e1e3291219693796f16c4e840367bf0a87719b4adc5803136b0300000007525352516352acffffffff034e65ed03000000000365636accd63c04000000000763630063655352a2557800000000000752006300005152b9f05e16010000000000000000e43e2e010000000069c80f76bca6d574cd9439d55f10a78b5455a0bdfe09fd0767db4f84d5507ca6949abe81fd07d724a7b61ac71feaf41e864623f958bd9bf7f57c976d66758dcffb811a854376351d62a978f96ba9fac67109eaa0c93075aa8854ffb88748cc2300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000648ae957f42d4bce73009557803d8025d4bfeb6a06ef126fc62843f7e815c146d47da2f24763f6f927dbf978ef68bbcc3a8cdcc97e49397ae36d0e941d36eeba6d8bd176fdb2b2cdf730dc0225c6a9b6e6e389c5f220d797e7d150015adda08e131c27e1f9c07ee388c7aa96af8f1de36f91fe6d49b1c1d4c36400e7ca4c82ce032911cab28dc4e71e5b8c6168851dc8e4092e594d9d65a05be6079dd02f751e08021613a329b57e3942b25ccb0381046de5618e516a7e34f5d5752848c0b52a89720b06ae0e7d7787a023b8a611aaddbf83254f8df573c2b36e08e068b348153bc896a049dbba55f41f97c885c16389bb5b89cd55928b737d1b3ae36a9ac6de4461860225e52f25b6ed3333e1fb6347bcbe17c1e1440af819bc9a73e58ca65b767a69730216d149e397aa66235408fc36ee5c55b3ecf7e543c36c2c8acec586e4c57ee54502085227db29f2a34ba7ef30e429c76c5e42f09a6c3bd89e6e4dae3e4be5c7b5e80303ae7520b2157921a6400be40ef732e21b8f1f9d8c6473bb03c272c0be62435f030d2978226a1ecaa054177235d810c9967292ba4ae2376ef967a1ae77c20ffaa4f6c32df2e53aa80a3c3599bf8c8e6406875e0b9624cb9e9df92df85eb080f3d8867d290fa63368a51eacab05d71e4b93ede8a0fb5fbcd56dcd1f759ce15c3891ff60aae8612cafa112af1313b28a803da76031671a26d403e8aee155496dadf0253b0261411790510f1719e8d7966c347990f62bfec169f9eb08714e2bfd0696447c56ae5c60edb619a3d9aa7493bac381154faa251185705b47ae7cb6b6a37c8b3fd5bc0906122a51b49c762f293c1cf6b0ca6ebf84e2a8a28bbfb26a529e8dafe9f7b99ba25ea129767e1a200badb3772fada8c20eba13b942c203e38b78428186bfd93f17e4e0b50a3df94f03aa31600706b7c3433e04c609fe83bdb8cad9475af756d5aa37d54f06f5499f8f8908252d6e59e2e848c276be5acaba8550635646451b6b6a218d71fd8e173fbfd0fdcfc63f47a5ff51cf73e4f14c59b80874e3fe17ddba8e4cff788b4cd53f56c1e0bdea5bfd691636de0892c3c88974e2f4a46300a67603ad3923c59493eab4a29aba5fb31cdb6633df62049f891150677858c1ca75f1862ddf8a32e78c68015b87881b17510b3be4a484c543db6ae57f21346b89fe49fa37d922190c372e88bdaab432b6e48ba8124a766e83e5d8a16c8d9e3d14eeb8fdce291b6608d072882da0bd49a8854488fb79ec30ccab9ee54b6c1e38add4f439b685731c95990e7dfc983598d3d00392cb0a8cfab36b4a86fa0852b5b322cbe051fa82b9543edbda96376be2f42abb935598f4bdec16db430fcd5e15e1fab1cf23fff5e286f79157ba4778ec3ec42b1e1121de1ccf65a91926bea06bdb832e1b7a6846f56d9c6a595ce97837d2b19f3b60af623ddbc289eb78f9f6800b2db7aa660827b02c1d73ca7ee901b6c768814d2f9d46c323c0c933597fd3cea36b2224d581e054b1366bd83ad41110b6def480321c9f843674f920eec142b090df944c559b6ca8ff24adeae02f638e9ec9708115899a8a62cb2ffd19d3a814997e9a198fe8f5fde7b7b30ab8bf6c633648d1f8ef599613760b286ebc606486126c5a4223ee00ed91982fc3bb29f3ce4c2f47514a6841d2c34df3ddee8e4f76f8ab69bc0fb4d72f414ee467eec9d4533d1268e316a7f7a2ddf508656eef3ac7fd00d5e65ac2e6a393b2769e32cfa8bd7702cffe68ae48db780614258b794ca934a7603f0559ae82ec7f9b3cb142ef0b11e9592b084a19eae1ae121f26b6f554c8a735d29962893ac321ab368c916898deed53172d5a13e8d4a449c9684354092a52cd3c26ba48f1e82d4d01d0853eae85c60968b775d5d7769d931655fda6db27052e36dbe6cae252f23ff6b1ee44f13c2d197377204a039ab47bffe33bdad1db8a1f4bc9b941194773d28a247c0b3d31e5e6f11a4d21e2b85f735617e2a6ed89bcfa541f9cbc6e1d2fb1fdb7d1d95b4d8853c7d3c1629b6a0a2891b5dd0028611fd673f0fc8a11a1d98b5a29aebeaebddc2c5345eb42405b754b05452dd6f26400f91af33043832a1cb75549ce7a27c1ae845dc3bc5a82fc9d9467596c36102168fd2eaa5245d19477e636fea2daea3390bfeb2a620f47cd304ae0b799a7382851033d265f7d99ab704ec8be199993486c1ff371007e1dabf89ac912e6a20f5581a0ab097e44b7b8c8c0a891537361746f1212b22111ac43f1497e49464e02e9b1ae2c8f698e957cca01f277e0ab4736baa80b74e5c8e7438504130818f55c94349f49ee4c0da6754924f05d6a02832026deb856a3dae77319689cd310a998878a04b9ebbad6f3a1c6451206a56cece8d59b19ca60c1644a3f89824aef64a19f2b696cb8a0219c539abf34e999fc0d", "63635152655165", 0, 604360391, "ab9557ef7d197a6e3b26a79bdacf6fdcc6e6c0a5e409b56bad48cf1fc219da76"], - ["030000807082c40304187040e04f761bfb5f1efd2f42e461ed4939ccb97d7a918477638e7dc811d2f001000000025163384fa1cd78b5ff1763753791c8ff31e7be263df3b2b3a289f717944e31a329902f33c4f80200000004ac635351d147353c3e131ecbe666ee90e310948d5b21fd72c79071ed6ea5006dcd7a4755164ef61702000000076a6a520065ac657f80363f6021223db3b80a197fb2fd8da33ee6f54e5e98acec2849b517b94106ac2db46300000000008a44128504b0b7a20100000000096aac63526a000065acf6243a01000000000553515263004be62d030000000001ac2b92f801000000000900006351006a51ac52665ce3d50000000002dcdb7803000000000000000000000000152d02e1e6954b230dbe34483fc4f7e563bd8e11a9fc215b93d8ae826b0c3a9c8388282c21e17f36db6f9a8e790e4090a0c9abc81ffd8d066882d034e85e2dfed18dc05d62d0a9692169ead7e93bac387ae85d0d3082dbf2b88694cbe5ac57d600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000374efeeb4f994f26ef9600694b9345bb47c88828bae3bfafd36994d37cd5a0e3a4f6f9f17db7dd5c1be2ae3093efded1ded98532a9b403e41b8889ea3f8e6cff80a53a816edadc0a030619d428b558f090e1f10ef8ac0b813d2ed62bee8945b800b0efbb83ab052ce443663ddfe7edaf3bf09b62a0c7634d2b6f2674c9411304030e72eb8c9ca06dc4f0de19cb18ba59c330ddf2d191c187cd38e2e3555810b5fb0302756bbf3124018ccc7ab3ea7f97cd43e3fa6b4a9438e8b512ef38edf290474d0b046a62cd9a3bc42e6f60194d33b02a39a5230704803b4823eb94f59d7c07841ee758bb93639ccc2d34dd6621137f47d74a0d86cf1f1639f9f1a5d19bac8b92ce03293fbd694e7c41b29ca12d4389bd94cddefa7a53aac0252f606d9c0319057b70020c1d58c7989727844ae778bdb651eff7e49711c58527ef6e1890f919886f0edb0324ddc1e5a5432b205c7b90a1a8a36b9131221edde5e59aec915c87330330000f031cd082ff4c4deb3400837e0ba63e881eee6e77a98dd2d66a7fb49c00f3f7d239030e505dd878658b05d8732654c9fee346ab18f7b5539b0fbdd504f815cad00463db001f0a6ea7fb430dafac613bf0a804f6ff145ff22d921fe50f327135afb713472f593559b68101b0560bde221cb74d24a9e72c33a7154edf4dd358e65f304f57da0b318738918852ed41773a2228e0f0d3c65f51661302c33db732c447e9772e39b1f16057abc1ccc510ff59fa22af1c163f833a619c3dd6eb63a8ef58a22cff5deee82b5710dbb4b9d75359031db1675f7fdd839ad9d3a65fd4990bce6e3c2a2518c4956dad549190c8eb52806c45c860e0f960ee7151647483d60a586a2c5ae1ef36df07098ce42e7e64534a18093d16768e9e4e799b3c795fc4138d193a1aa3173d53168bc501fa45dab12590d5ffe89471e4830380440852c6d9f58a4e61f510a4fb2fc50575aa18d8648b3659f4be2f1b34005573e29131b51f94da993894e67560086c7d68eccba68b3e68c2b51a59794ecf4f959455b6f3d2ed8c6488c42ce101c09676ea2f6e090cd147ac83af879cd64cefc6f2197025cbb929a94b7af36fc078dbda0c32fbbb723164968d94a48f2e6cbcf055e80190eda91b04f9bf7cbe7e18a96fd9e26b4c527280180cc3c7efe722a04ba80cd810585d484fe89d884eb1c1be7eef637c8e41dc0460916071eb7fb80341fe03e69d8bd1ed9259ca31d9e1984fde6791efd8d6c54ee964ee38025875bec0d03ef683c47051669143e08faabc111a8b9ef715780076f0b345f17519b5beb76e7aeef61867d1b751ef734ad1b75bb820034381765ffa2e7685fc64150dd598d0a3b3849bb50b499642395ca777c76da65cade0af564f05cb538d453331e786cc5a5428d148f5d7179f9b3b212f20de66fcd077fbae1666d8b2cddc80cbe60df3e6532f917453ca3783fd0524f486f872f17e14fcb39b7076d5489c3acc21c479a63e8b396218e1cea79970bd1fb2799140f814cfddb6b5ef5a93768f7cd538b1376815d6f72e8f4aae5c3be8be59823d1fce39c6abba569f4292d1d77df7922a46e241864d0c0e4813f3836590e3af1bd7cb09768643dc27410aca589ca539a8a31e57b611e66cdde061e123a66600e333ec9911e6b5c4ff2db95293e4cf17a1b1491386174a2e561e411eba2a4fca647f6afebfa13c0a249d1687cd23619c7aaf86ebc201ab96b0e7465db523109a301ebed5143e8448953ac230a0db3f6be9bb65ab1196c72edd88a4019e2b6304127f124027cb2379a9e63c81ecccc35fa5e6ca6360322d1e7bcf53d5443a12bc8e02c5fc6501305ae63d456a4f1aea30634fe2b3eb60da4c839c8682906a6f46cf48a8b907475ed5cc15a4a67836a5852b22365de80e0436191e2a0548b4e09471d50166ad5f95cc6375f52d95356b1b400b70244a608d3aec5c8471d7eabb9a9ad1e95cbd989cd36a344fb3d8be89c04f2007375ba557b6b6b80874e3191fdff987c91514c2aa594bb08561744f484913c1733dff93f92be9f5aafd6e11bb4770366baa653ffb208f06514fd055fa1bbce8ef847d24f67d764163564f94b591fefe0e6940e7724386bf1e081aaf7d1980096ace3335048865d19afada46a6ce332e5cd7dff583f0810ebfca6512ee44386d3350dde556c3b441c625ab8cbc4ca0beb425dfee105fde3aec7c2327c9dc28b29731a1aa0e329b5bf2e1cec7013cda536616ef3e25dc7842acae12879027d68875fd4334d0761a08587ae098ce04d805607473dd933b907900000000000000001b654f04000000007836eedfda3fa7298327262cab6caaadf3ede21598d5dccd15f351f06ff10e4028c7dcaca63018c86e829aea62ab7c310edd881c6881e2ae49ef2d7036d5d0e302113e22e5bb54cd8ef8e8775310eae7bb9876f3632fb8cdd5eb6516e6f987830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087721f4271f679f0b9681c7703837e79039e5000a1eef29b86b609172e573e0ef29cbca5917322593b3a2bb91ce8e4e53b5dd8a0d8c579797df28ae5d0a19c8e002579c04dedd0925cd621a08784ed66a2857f9134d317289b849902d90721c6585a87e9dc3f9ee503fd1e6649f0729620a45db941a36a554b48314d6688110b0313872a94166208fbeedef9f3be14f5cbe21a550b9acab9885df30c47a92d489f020a61a1a29c9888bee80dd4c2b06ff95dfaca7535168641d12cf7331dc9e7ad240b0863d46daa1800a1a072287991a1eea45085865fa86b284b48ce58d45b52c972992e978b209de855ea882e53395db9bfb904cfb750b78a47c033fee3642be0650315fe6b337a3be7b06de18ba045f8291a7409689992a1838a4f2341875946c45d0316895b95f288732d87791242ccf4f15190e3a70baf46b50cb30519b5bf801476031f64ce738005f458378c2a4ea6f9858fac3adce9a94c2ddd3dbcbb2db65e35a40316ce4c6e6538a41a0c759074a4de9729578b38e990224d46afb15b459b7f5406030b06aaa1208b63b0f1b91f3708807dcf03a6a5bfa37b005a97d00ec3c6f4d27b5fc67a924b71a43d11be3aa1705edbb81c0b73fb390cb421112c8c645197d5e24748547bbccaa476f57041a8b7a527a95d11d3807c24356031b74e1c6496937ce164d36856bbabecd0b55800e4103aa9db15f5f0cdc0d5b3f72ab27aad4ba4ee9a355a59430a6929c873d9f114e49d6e8fc2d96671346dab24248a4aeec730bdad150968024d0869fea11dfdce7e517e117b6789b6678168c4e29f8740b0f3a24069a3d16f4c43f7da256c1b2e5a1fee386a54d59c04c1fd5b4d960d530850a5396c167d77b04a3b80fa41792dbedd95353263fde1a1fce57f925bc1a9b7f3ed81a045c1a255b84703ad1254f72439723e8993f72e7ca56f3580c1ee06a8f748f08cba4645b8dd2ac6a1436b498b87900ca991c0a31ca1ee9fae7125d2716d76687be24d7e8e6c08ec8fed23877abdb4412e5514612279cbf8ce4f5314fe0ea2ba07bd1e350fb2b745989b7894289aa5c12fdfa3ba3a96999d7d483aa6e8978338921eb5840c59d37e0c6546a503a13ff3dc9956b68a58f2210ebc96410e7b6764063be8a7701a2aa4cc21c83692cd2fb19c99a1fb7185a500920414845ce2ea165e53d79e673ba57975ace06f0f60ec1d1ce492ea96c2285d30a14a27fe63430a768db6886ca7cf0a07568561b19c6247b9532f6b399efbd8644e3917838c9d179e292f2018c7b4fe5780b0012eb63c755c0cb0de8b7459e246e4d21ce95ffbdc73c5786788e7fd68a2d57471e69bab2d06a642b5a12e88d7618572e6febbde894c24e468815e7467c13f519808a919dc71868c6528aee5a6a641bc2112cb1aa12841c41b61627786530d8b71c2ad0fefbefbe973c42c030f88aac8600b2b15853a3738a29f8c0e05f4a25a6ece6a47be96c0e9edab90629a43b4954d415bd6c149c88e79b0cc13480fbe4e90565feab9a9a57ed19c54ddde1b41ccb3dbbfd6ce658166fbda1b3a05f770f5c9a4dc224ea1a899ef6d90dd221cab8d2fee38a76534545fc5ece1d9fa5d1ab2f3322027ad4b5794aec65357536a9b79916e97e7a00eb2c941a6d547bf56620d333af590b9e3b7165b18092a71660ab573b83ffe2a7d1cb00cc9e94fb7890328010cb6c0b2a6942fcdc533725a7a21f31268775c61916ed3c0d853a3096fa3225de3b0c2fc137e7cb1a733c4dcc1ef7d2991fe39f29b8a56d35d4797971eb39419ba8425e5351ae562944facb0a36708423ff46ea00878b1b510479b1a44ef1c43f1b291968c4b605dff3f7e595ccda8758aac76f2a901342cd90d47c877b3598fc3efbadf8b5f709be6e6b1277022e96897782bc776918ea75a4fd63838935d1ea76c36e56af57268bd8789c3f71edbe83af246555d83dd753abcf3eaa5861163a618ab6ddd51df0a133fb81e45ea258b7bd75dc89069efa0be5f8302569b1d90760b902c5ed7a64fc8ff65200259502c7a4ec29d5468dfea94947e90e283264b8fc3448b0092d74048cb9e19d6e270399b4d565ea0130b5dca24dfa96697071e883c1de05af34a94a134d6c44f7f61149271f8ebb72b490741e072c83a830c8e8e2bf6eef9c4fc33b1fd7e4113efd268781297e1d648e12b38ec0ac05d758e531f37ffdf02f843f2cfeee368a59f03aa1d212c23422e5e1e2e6ba4d8c33f7d25bf32ab5c6dc2c2b5708ed5f74da801c3a1264b984b9b6ad4f48179b4ebb45ff612eefff534ab6bebff63b589e21e7a14dd02b32d79ac77d2a191e8ea3999e202847e7a77a3f36300dfb530ecc16c3e2bfd9b30a91b14555c44962dc41653f974d0cd936f64399fce3a94a58a55e79e31d5160a6765c7da9fd35920b893fc7bb5219f864901", "005153", 2, 1183617490, "ccf08f90e2d4a2becb043a414db48b7ff20c422a1b1d78bdb4b20ce564cc6d4b"], - ["030000807082c403033446fd4a2c1f8c326061c6b23f54a3640e62f82538c8e4b3dff165a364ad62c9000000000800ac52526a6353acffffffff3261850efbf155fc721a35112af7f46bc35a8748445b3fbf81ae9827aed70a95000000000353ac535137a8c83fd72dec9c455a2ffc03c0c453c4d1e3d5658b7efa1f71e5439a017208ab5501030000000951636500636a635351ffffffff01caab320200000000036500530000000000000000012d82ec000000000000000000000000006790b0bf23183fee85cf3511b935c83b9119155bbf239fa47d1942720280dfde4831c2c5a8dbfbc166ce68401b4a9bbdb1188d2511c952f2f916ccb21d761e419b501ade85f9c3562676e7927d6661d09bd537029b8379466311d523389ae06f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b54942da9769aa656b7441a873a6da7c47fc52d18a1f313051e5bd19a68279d2e60c52c85d97117331399f7073afcb42da38e4ebcb7e8dab2d109b16a1835c75981d983c07102253844f44f4936d40d63f76db74a6960cd9f15364284639d527001207c3ffe30ef1c0e2015e2c85c7340d5cd321287eb24e86cde51dce09325a030da2045990d8ce49ed4c88edfeaa31f5dcb8cec346125abba8852ea62dd36164021946af402226c82c67fb3ed2abb7d4041072b7f9e5732ba61d8527c4b50ce1160a076de9c083398ec47e01ac05ccf893c794928f4fd50100616a86417d553a6e31b93d671986cfe2c8e452e2358f434196d4b2081724fdd6c994825c9baa0df3120226979ca0ba3e5526a567d70fe634f4eb8763d39942fcaa1450643c1293da4fdf030e12320b962f649dee0e5abd042cd2cb1cdc2b514082c8bd1b7b9c74545f6916030122ca9d0dac8b07daef09e9e4d445f094860bc70812362508a09ced4220cad60210b63daa221b2de1142c53a067ea0744572ccc33bc0dd76a3e50b03db4d7cfba020e493a099c72467f532fcd009b413849163b22680a89c93d01d22964cfb274c454d8031ef43a7ca1cdb625954ebd3b9374d3e66613a5164e3230b35a98c7314978cfb7d0d0a85a094821d9e0610df814871cd2ac9f83d1addec0bb4b78a6793b0a9579f5456d37c12746aca35870890104ec3f8260f46e0d166b623aebcbc0d1b6b7a170f59999653398cca776d3d17f6d752aa13c095128abb77a35663228a3cb32bd2f0909694f0d4dd13597941681c14251d975ff282689867be2e02b51f24f90de558aecc1ace8f6a1a71d7c1e7c4a72201eab9802e20f4ee27270de542f043f7b7ed615e03b124a9cedd063dd6325fac5e83f32c21ac5d7019ce1f0ba1fd50b0c6a5958c854b74d5734f2815a13d1feca320e7c1c65683139acdecef694ab8c27d5c807b81ba1b5fc35961e309e0eca11ba7d51a0ca1dcc22024a9731d01e0719136c9c96355ab06a3f141147ef36a6f53871ac608c96802e8f699a0ca062cf22de0bc26134763c1d3ce33687d947c49ac572f05a45dc475d09db1284ce67cdcee0a751a4807066426295dfb7795f8afd54acd1991b594dbe66969e9019b8d34f6f4594f39423b778e0b65c44212b60ce9609ce03a50543beff4b3bd4fba00fc9470efe9db1b9abf2a34c119673a94b9d53e2d3091e2689075af831b62a65eebef80e4aed0a4f4585bf448609d2e6a28411349ee6c5202ed12fcf80a079d802a1f0fd03ef3d9bf2ae9d97cbe705b45f5a8b20d7314e3c844963a3e8930aa2cfeb7eddfa6adf9699552493fe91b426a9f501505081371ff72beb63d1a3027afc47250315e001f65fa31075125c252b8f09dcbb749080c8888fe69fe07a0dbd36de1dfcabd9553a853f582ff784d083c5df9c86a419c183981498089989a0a7cfd25c1483b447e510c76d5045959c94daafd694a6ee066936b9494dd774b3b876a934f133d45be4caea5feee8d642f4aded05fc83ec5753508056af32cfbdbc66e499c1d58c231e4466d5b75d67fceb35358d7383ce5af5a9606b2c1fa1b3b24c2b95f6f5e9d20ad78668f042f926a03a941d2d5105e6e80ff371c1b721a59d547b2abfe5b17429d8f8d2f518cc88e9837b714bb149115393a1d56c4e5ce1d4024ae35c569b87b8b51f86421c86791ae3901c7080e8ea4610ee85487b236470bc0473b891e8e67497b8c5a17a589e368783f249f3d7c4f887ef1bc69d1d9502e8f78d16e6c6ffc0c1268f502e63ae245871ea911bf555a9bfa59b7b2ec27eb066711db596ece599f6ab728a0d0a5e48bfefc1bc0f318b76d042f55b9c402f8ff2782d426354b53e86b218d549cec674a48236558d00ecf09ff599177f0cafec6b2a3ab2d6eb58efbee917cd3e339cc6f40e5231b2c883d7cab6a77fbdf5e06d40b325c11fc121b57b68d81c936119707f4a7f2ba3cbff526a47c7a7ad1831599d911df69f0fcfecac8b322ed422e3dd10523a53ed4244f8f61a2734280b6dec55705528d0cd25015a3d951cbca9a848dfa4bb8808ea024ea37492fadb8531abaa9bb07ddd5e454baf897c45f659f77704539937593dffa67a1949112ef0ff88f4579ef6f2a18ac80a55df65b0eae659398b44433ab628a0afef686adef54c6e55a96432afe6192cb9128edb224a3a957ccf74e88c36708004a63fd57cf0caeaacaebb5224a8ed42e60a0715e8b7b2100851ae9ce0abb69fce03b9f425c1f9b062f1c97c3f8f31be9d2eee2b482f5ee69665b92d9d7b18962b0abe017d44f876719077d1856d818db54e6bb1cb960910dcb44c9368aec28508a380a83c1540ba2f401d49d6bb9f75fb803ff846519a928fd7d9a1fe5bd4951cef147a6d1eaa120dd68cb709c9ae8ba99db4f4e6309cf70b", "6aac63515251", 1, 1130282694, "6823d4154db9290677f51aa1950f9beec1c6378c6203625028c8d7f2cff6ceec"], - ["030000807082c40303d69cb8ae36588bd6bba239a3962bacf31ef712948460d9f06dead409cba81ea20200000006515151ac6a65ffffffffd8ae81085a04eef745de366bc8911ee6ea2448aeaf21ade462a6c0977c39fbc50200000008526a6500ac63ac52ffffffffb63af7754e56d4e0d8740b5cfb5c155a74c225f3ca18d27a8e4c11cff77e064101000000025152ffffffff01686d350200000000035153654eeab87a69ca72a003118a0e05000000000000000000000000477606f844e0ecab75b18530ac6e4bf0b59d308fa56a7cb60e4e21e0db9d3894fb063fbad412ae603a997c5820d39d82cac1c3f503987db9c5f6ddca677a0f0147bc9706cbb516b6dce1b3c75ec1f961adc1d8ef812537bb3a100f01f3e86cfd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b3187b49986801d8f91bc30323ddc4384d24299674ff655cd7b7ae1dcc2ede30657dbfa0ccf5a887435e708518a16dfa4ce1f860908d0771b5f170845ab3d746204bb3a243c09eaf49f192abd551b0c643a30ad0b30d119e9a238a4508e65135e64f0ee1541dab96649e086d6bcb83b6976a4bfa10150ef9615e46d4d0a409f0310e618fa090c2d94aca17ea9c51ee39b24e49e014a550eaf2ebff3aa30e268d50323f7ba72f02fc722029b672626c620cf93c35b862a239cd3af993dafaa10e1d10b00d317c4e75006da6c2d74163e6668f172b0855df49e4eac0e4e56ad6409806c470ea4c1ded7c2939316df416271a61d789e3477a4b3c72a669e3cebe460ed620222faecc15d02748e69b822037d582b69e6ff597c82585dba53745036eecb10a30315e014a5e6a899475758ee292c18df64e7e02c913c1795926cc2bab0094118c902027b220b9849c7e5d7206a9e8de2c97c83768b61650462a9bfe34cef4fdf33af0311433f6797a923677b1a1de1b0f28e8881d41dfa87110485cc348bc2e958c542031ab273059932471d615fb7415bc85c6902bd51a4fd8182c883fd3daa99aad893653a3e0ee970aa1be9150e738cf2a84660c01517b16d78d805959a19d78a5293edb4750d4b7cbf590f4d6e244302d5b07f5a25cca8bce0120b3167fffe02bbe02562144f39ab37ef9251c27021ae6d51fe6583df06030025db13c25d5b2711b76a58171a97fa23db67a962ca2c2b9774005159bd6819348a7b69d443cc8eb4dcdb3cd51177d107fd924f1582e3a615572a0fa256049d19b807aab2776e7d7fe3d03deecc268689f35a61823e8ef7dfcc6ea8c83b0e100471e198ad1d926a8c003b4d695243a11e7317dbb4cbfddf6c24f111f866d6340776a9119aa8cf4d925dc24c501359a560344946e9e15e8c9f195d21c0aa9d017629f1ce6c5a4de19494a612e7725a75193d905f4878200fe03f20886a294b135d6331e738d4052d413e12a30d1b3b96d62aa78d59f5d4f92456998278631206cf1a233c92c9be818f8e59c96b0158a0ac284ed65149685a70ce44986a54153d762b5863dea80689b03be253a8ea54188c6ae28696a4abf4768666b35040a1c9fe5fa2316d9cdd994f2336b0b37141461d17412f4cccc8158352d27591dbbcf281d85272c6186f19a161b901db03b859c567d9ef18369c7a2b6312b9d2ed70d3f745cbe82aca5dbb777ca434a58df038e94a49f3b89cc40d715cc49b2e4a7446b7a9b507b0757b8a6a9ded34de83f93abff5aa416a3b509a7f0ce7b4bc7e7b5ae8c2da7fda402d56eab2da83fda399850e9809f2705fc318c6ef0f005abae35fd5a433d40776022adebb0359af0c924912001aefc14737039aa308a807652139f85de341de538e8a9be32c36020498e9898543d0c72c5e0134234119232075d335af51d041f811bb539c44534ce8258c1eff4a85d40466dc9db7f0c3440b80902b0acaf0c11fa2c15a4c4b32fed4a610600992dbe0745556172d91560ae32ffb26d4c3f3ca421901e51763d8ed0142325cff953f5280e8852614d6be1279b56bfc39188548be425923b8b2c90e458b93c9e261115082556844d90540ece6685342cc94646ffa6db6e5fa3481724b4148442ff58c321855139749f8df36a02eeed1e7b1ded2ea4a679f480f7f12a42439e9c84343b4448d2ea8e0d8bd2f8c5a911b93f42f583422d0802169ec78d1ec6b3b7a9e571534512faf435e06cb5d537a51bda4a7a3f63bec759111def2ecefe89920f1176d7227e30b1730b0c99b11c923ad57b291038ab4434a2df40447b278c269cec3681eb6b6501f53e96f01dc815eec588c1d327dac901a840324221a18c299d38064254588086bb7efa8bcd6b7c6319e10c71970b5f7d439080905eaa01147e6c2ebda760b714efb604abb33fc0582ba1427c0bc338eaed1c222482c5e4dac4875246c6f2e38680e56d599fdbbe197e0d56eeb0f004d043348a96cd6122cc9c1957dc1209edc7b4794bb6c10d7d09d4c76086101ea0e7fd8d93072e8b03199228e6be053852a82284a6927372819130985eba9a943fc9c48da20f2c0d7dc7d3a6f965e680cff08f7bd1b057b3bbb294c929c18dc82e27dae823f2e33128a625b9720386af96416b5c45d45eb59db48942dfd789424ae4ce8df32eed5e8ce93515bd9f0bdf532786051e5552d289417d0b08ceb7f24db0ed6e4793afe6237a366bd0f4b8762608d8df55364f197fe35d1c2a3aae45c6f6b80bec3f8f6e43d0ba2d16fc31b4883dfd416736347010000000000000000000000006517881ab91360983e39e3bc00928e05a17b8d28fa701b1e275b522115760fbf353f66c3964cdada279f495f824af3fd4d1151402d79e4a13aa9bac661a81edb0d2f98a12a5d3249ab9762e40d7dbf887ba9455d7dea2f930105181c8fb2b67f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063657f8b2d25c9be0cadd13db0326642c47c617281977d5275523f82786230933da8bad669fddc0585ce23dcafc62e7bc2621704fcf5035d2045e3b451ceef6f276d2fcfe18afb2e1420e8f8dcc4832497a59d40e3a6dda089366b1d5a1a35987af2a44dc37ba8ff7e85374e9c70483e689b15240fa3124a64f044c62bb6d04f030b0cfccbc017bcc441cc8515798c9affd45305aab00a63014d33b281685d8681030a4a86d5fc6c60dfe6cef4ef81ef55005c1d0bc79b4d4f724225f3c903de43a10a03ab3059ab3e3155ed9e9670aa747ca4fdef5fbc663ce489da1700ae6253a27d7b1d07fd57d382c6b798d7a0e5d9690c50e492988108b4cd04c5f1186c6cb17f022d0ef44680fdd0728edbea703edc6d4a0338ece04857ab2e709d29934be15a3f032964aa7a554c25b04fd0457a39df97e0eec20b222b6f9334e36bccb3d2fe76f3030bf6ac77a11fef4f3ea9044f8d5293031774d7ee6767a9f0f85726f5641a7fd903093bcfe48ee146e942c1d67b37119317aabfe29faba9a5a65db1fc63d8de518e0324c07a0e65ed3f2e2fd1e4c97864606b7c0b164d588dd2f14855851f36851b1265e17ceaa5580dffa473f7bba61e97f03b19f580bdd99a7d2a9c666f7e8f0ff880d521bd62cfe7c5529ba83350e2349b5f8ff8461529aae2fa6d9448ad6af3751b984dbe0af3c0b461121bcf75ff4dbf58d788d1fdcf09f249215b54ee34225910b5324b0e7682c082f5b14294574b35520b0b8cf3c8fdac904e4d01cd7bcae694fdc5bc8e89631de124ac1d83dc1c6ec5ad049c8b978d2089111368ea52c3839c2406d151bd370aaed6ad761612a3296b7398001207b5c126d79b48a265cdf64f0600751530d4bd08ac3fbdf725ec4284e6a43aee4cb1130a9fd647f1b31778727c7716f6b118b1c171a8323c33617d5c81faffb506da48cf85619da0e373ccfae51255f3a76caa9db011bb84a8dbb2fa18d88bc27a138443f8bc7b7f68c172668db9d9608e17952eea7d2f7be1b593b6afe52a95e05d2b4212a8b9956a1f8b578257e7650a1777dbc98470a332d5be1938464f1d8d8ab8310fb62d2e597cf421b4785187bd6e834345ce6b5f7dbf1fcfb309728b732964d79baf47b8d76c0d3bf28a3f36f16b6be684fdfb06307bedaa651c18e7b05d44413a08e126cfc98bed6ff929f4dd0232a6dbe2cd3d40b8b2cfd1bef1dba02787dd2a11d6c82c8710f65a5354456b1d3fdd5ee81f3f7332223b9d29ede39cc10dcd189a67249244c63e3a0a8b1b6668f9757a8f8dc0ce0be138b279208cc5cedb58143cd6719e57d37df74899f876a25637dc0873c87c9a6d8ee555a501b29949c8ed2e71dd0a04ea1f17280138d3962d7924585abc031b04522cb3c0235ef9d39a3c1068468ee9bca387736afca688c2d7ea6001e590ce83abb4db4244bde5dcaa2667772e71c1939727017d66108a55eb43adb2c139aa0c4328964bb6790f6edfd49cfdb87a294887b6a53c6dee779b57b47962974e21022e48b0cae4c74f07540955af48f1be1d76c8f7a35985c246c07474117bb2f3efdc11e07646d411e145a1746689df88fcc623bbfb74eeb6775e0d9c3e2345aa18036fd92567e34c3c9da9dcad9789be442dc819e81fcf52c1993f3780d18e53fa030362fb796fde26e43e7d3fe078fd8c09cdb739afb9d3af15f83f0eace93ee643d4812809887e90bd1efe8825971faf3bcd4e91f501327be7df9f90da6b77811d58734c7cbe8168050cdda41293567a257ddfc4941dd51eca897a1b67120b8123a930a481cbd0051a9b7eda3f28325da3ae74abd419778e0b1bd0f247a775a785d03069950a7a1e8f9e15e883206e90df894c6693f51363e47938420a167d9c8ac5f6830e51cf2e6eaa5dcdcee7b33206da201cc8b4a14e2252f26e480e828c36830b999c609e70341832a4700855345196865da5511a6c22507a018f3d74e0d612e18a0abc9af8f048e1859694937aee0f1e35961784001ea17ee7751d7c113d8cf2b726b39e7ab4f4a502831776c0d729febafb9056eb83c256c6774f9ae2c3ad6cbfcb79d8955121fb54a211fb0a53f32bee2b635c8fb2d24a4383d1529fbae1f7b14f72643d260fadaf74da673fad210d7cc43eaa107e2689734aadf23dcd21fbe0ca0bf3ce097fb97d847dec0ca534a4a8b27f81f75fe21155d37cde4450f973d951b10c3ebe31a2535f0e101496c834ab7d1323cab4694159d1e57d55676e1da86636be060aac449225c9026e88a3e624ed186fed081940e40e93b319b8cc0000000000000000e831010100000000bea416398057f6eb4b085bc866a440f0d35c1136a17b6457eca4042fbc505fc196f50d87ae52f400441a7540fdfca796714289bf362a5bbdc5aba81a1de085b1529a76275af93c5f48adda342970cbc20ce459f7f5ed961fcff2102cc593b84d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041c107816d76c630a645cb073a47bdffebe461236f2ed9d76c0835d7addd3225d638c5ea043bc8ca87809ab71bf2f2aa88dd34d79f4d6ea9d8fec34f5cfe4c3d18073e61c32691a30c3d503d38b5dd27f87f31622a279d0238a13fd3e92d162786fd69e5ed7e0e1fd9826db7e6263f1f12e13c2c4cd239c54c7aa2b4cabc05d4022cd512b798a4ae33e46301d9e04b650e533b68e44555c4ff176c59b17d92bc4a0302137b83120adf226c322d2a539b280158d29f2d60b3be3d60e79613afe944c40b047fccbc97c7b85981bc1f45a93677a06e23a629ce3056c3a03666397a4b86c6cf8a694eb8d9fc14adece71b35f5adaeb5d6f86de3d206a72c718c2d91eccc6a0308d01151b486cfc5282091c372a41d3d5326ba936035ac285061b439b4f2b2750316339ed13601ed4f159c992b3695ac236bb58f07cfb7ae58e686e339471f025e0307e62752e1a250681428cbd85ab72a7f238d20c676c11b92e8a411b66b67aed3021f20f8fba8c5de7d8aa2e919718cbc2106b978f07dabd01895ca25b9aa3371ae03126831c9c65f604e2ed5360c8cd2eac90438423937aabc44dfdde33b299dd766a011cd012dd74bd9c81372b1fbdfd27cc719008d4b1d8f6c99b17e9a4cec29fb65f093482bf40400a8d3397678d7afc0333a2cd39cde90fe54080745419665ee500453335338d4aa36dcb11714b39e65b7850e0ef796fb5dd865da285317e1057c2c208ceec8ac9f22976f114e1563f478fe9f40565bde290a243c47e3087e1beaa350bfde43096d7355a23992566aec3c4d4bfdf4464a5a6621eb0b115a13222a76bd7e1633879113d4709d120ef02941791ec4de69e95d50a6ed2c911410c0eb00a1ccbeab254ac1e3121175c19ff33fefd560ed26eabeea36c56b66e623f4e51faeb848b27f54624c0e95afa199afca06d9ffac7cd16f51c4c63dc64bdbaff3dbf2c15de773f080646009f3ba69ba2a5f4556c69c7da1f6dfbb35de98ede6bc773fc41fdcb97273a8c44d3d09229039d6d37f73b5f8fbb3099804b89fe1f3026c2d8b3e8a080a65adf0991bd0b5ac83f8f55776fb8c824b1389e4cb8619e402aad77628445adfff66a1f8427dcd55201b5d2cf7c014f001f38c7c2d15bc18946fad8de49133338c12b7bffd39daa62bfd1d111ee3c9adb29237105eafe989d8774d86ef53afdb3f752601223bea90a8139199a49d32cd7d309a722da443b6f2e5b038b52df16116c0a4edbc5f9c49d5d70914b516ebe0da490473794b24508ead6d177525de9ae2b842581f181f8efc58a935850a0be309cbca8bb0ce855a89951243d99e5bef17ba0f1e56fbfe0253364c4d78ab6c0c9d70cdf1c2859ff7380baeb316b03a553626a1c2ff457eb9f199aeb0eea963253d37d5153ff74402d518d2939bb4adf3d51027f7af32f3e65c44e91303f2a663f1b633134063ffadcfbb48f9959e2e68fff0ba80a73af3ef20c7f528aecc74b0aba51fa1003d55df7ec3c665db2c029a45abe196e2fbe5f713a43010efeeb2b64cc4f600c860f84a37a3844a40fcfcba730d88dcdeb704107cfb7c635616b2aff3fa3e2509557613d09d5ee9ca10be45d09106d947b2a4503b8d3659f9e7f70951b4436165cf2c9bb0916181e9a660afcd82429b2731b1bbd39efd1cef9416d8a950835f3e806c96114071e233c8ccfd68c5e14400f9378de097608dad3165d4f44a6eafb3fda22acd45ec7b39b3e002d79f8cad6374c214948b62e0c2aa8a0ece9c2ae1b992b471419552292e182d16a8cedd0f09c7c77e2be49afe1b998cdbf53615ed378a39bba7a09bc3332854f22be223f4e53694520b67046dbff56fb1af1f6ed9629f12490516d3ee6b6414bfb03869af35ddbe7cbec0249020232be49d5dd88c72fced5621dd16136f1ec71f57327c14c8ec4814b3422687b4dc19d64cf26e71d05f1b11c909a44c8804aff3233270db058cebecf600e5b8451b68f109230feb6a5f304b74d5404630bce72b53969d16b8099d24e583780ef042264e590364ae7322972587f0263e5c3b5dbb892992c4a6df76e350df82bf2270271c6ba4159656404e7f32992820934d27c2a0b1db9deb5c43b34ac69795879232ff88ca4fa902075b1aa39c13c7feaefd90c09f1fb414162a7f14a4cb245145d2ee8cbe62a17356a1a724346f5013c58db5eef50044b6af183067876fb9d38a6697a1639f59431b89b64687952759ba2ab225582649416448a7aeeb3e9c6ccf1f86462cd593530d2afd9114d5f2fa51bea3ac6d42a23f6d89746230e744b11d7049cccda6d8c94713950b5964f55acf9e91ac05a56b439c755c24deb8c2f1617422b6f1230bf9b93353f7ec764adfa5eca6e21183e3b6ab426c66763fe395c22a6aac7ac2e64f8db8268111cc1e0f9ef748993435eb5b0f294be107", "0065", 0, -2129456816, "08ac968a7ebc129999f6255ef5f79b925d9df8e60f4a521e2be3de3f38fdf882"], - ["030000807082c40304c3edff512c3211078f3592d09b2a164fb25f4df4d40cb32b8769ce5f3e8040aa0100000000ffffffffc0be5076d63b94ba3f18fb532ea34738fcfcbc91a03444f7ad9594b8d1caa0ce00000000085253ac5263525151439dd81591665a633be35ccf3116821ed6a0e594c063284da5a368ed4d72316cbe07b5f400000000065263ac6a520003bb5988b52563f2d6bd77c304d6fdce05624d94c2fbe550d2a94b1b2b10fe3e6de9f20701000000075265005152516341b7b83804f7cb7b000000000006635151ac53ace25fc8010000000005ac63ac6a63ade0bb010000000000aa07c70400000000000000000071ff1d8d030000000000000000caf08b0000000000417aa33d4194808a665e557fb9bdf454369b731631a584c8b8059771dd6b055c15632d4ecb3203a8619b20f5b8fce98c654cf3eb1cea36f3cd0e81b6252fbd24b2ff4183395c482415fdd8401ab6bd9bc192cbae128fc11a8000d870fb6487a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006ee0e7fa04cd958912737516b100825c10b146cff3f53bfb5324b5ad1c5e77020ed2cdff5bcfa4c0d5097b10caff25ac6564bb74445a16606e608c3ef73f689e19f161323be91e360e121dc74783c0338ae6f70db668d46345e20351f3fc89d91477116077e5775a11a23c0755d244334da97fbe0afe6d9930c040a14a8cbb42032a490f8aff0347d256e4062ef20c24c99eab68a17e7eda7bd9b850653dee9c7d0322bd382508445fa0612593e50bf97a4da5617b9810b75d4086791be88384a3540a024bc576c199af80bbcb8156eff79a63d92a938cf8c7bc043b66a55c9f351c8884a63bdc33e0afd6cf0356e67dcb4738eedc89b0a667c1fe93d5c9c80c2eff9a02239a288ff0e5cf5a519f6ebe8df697bd391c74a64f7b26a4caa71fab9c233770021e24ae0bdae0b6acf18d38007001301575409ce9270c714c67ba861952224baa0212b1b77d21e580e9369fa105686a0767252b5d675cf8dcda369757db044afd67020ee781ab7613d927f1e197c0f9291db3fe321a000680514c6f795d89891400e60200eac7d76eb347f4f5b6d03c11ae1373eea574380a3c68c04e520347a3a5eee78048652de729bd8442025645e0ee5a914bfcd84ec65a436c97183c88d886483a230b692fbd9f85ad35db1246ee5277b0704b1e74e5c2a75e08aceb642fe7b47ffb91aeaa596020a187346a8a57fc4caf6ccfd12a195edb9c0a2ea02fc25ea8f9f9365f0ee93d381b3620a42c9ecf47537bed03c9614b943118db7c8b6caa9c8549de73804f74c4e0675ae0330fe6fb452a58ecfcb6ebc9c4093906a055bbe0a8aec4347f542c0b92d269532229d453df8aeb4cb5864ec961a661b10802c0c4757a21d94183025d05c25a58b8da04ff58c49b5a7b05aabbcaa5608e28c445cd6495a40de770aad41dae4e731ffa1a1cfc6a394bf3d83ac33f22e00636d22c4fcdf3332ca20531f310bdd3a9bee53f04534965fb00c33c4c58a8ebc2f4ab8c5f2091db9628859cad86c2d9c52dc19f831e01f2da97977ccfe27f5395790ab2278b2f2b3593fa4948c4bcfaeaa437c0d68da19022f19a0917181899b1220cb08a26af950ccd96e9937aea3c54231531f603d5040033f4b307de3b55306e7b1c995f2565264b37738d74f8f6abd72b03e4a02c83934505ed2a162fe15c67037b69d49f64b596639d5d17db1e9475d09c58a41deb6d4b455e3927ebff35da1af878b9f4f51fac1689bd622861ec4e963b55293b9930c3eea7e6339d4d1307a12bafea17fd3f9063f2f4abfb7a4bdfe5b6b22f8ea754080cb26abad1400a196c4a8571dce1d201bb2bfb04a140f956626d248f8182bb2ddf5239160a8b5e98807b5be51c3e6893247fa19f1e22391e908dbbefe8b8f3ea7aaa175c77d620d5c120073237e0d38eb62540199d9f770f21fc9db7b0e851944bb6c4526c3c9faae166a08edd5a1e54d734d3d37699a0b42396f9b346538103059d860250f3e290c70f8060a0c42c4ed59825e26deb6d5547e385a4a3e413107bf3deac74bda14e514d25b5a51b2fab09dd9a8cc4ec5e816fcd20caa2e1b600adbbd7349f534a5c62ce12667eba60982b589d27aa2d9d7e6fffbd2e38322b5d6e00c9bdb4eaf58b6bd59d73045829b70c77fe981bedfe5b9ea270e4998a9062f7f457391f8862a7a14a419154ba77599d375a4fdf66a604fd09fc3ac7951bc5f23fe9cc614dd5865a569edde2655d86a384acb1f47a6c6529a5d4caba53ad47ff1c356c7b8d578f514225248947e12d07c9736c857c4009266529330f5539ebcc765fbe02ac88121cb41ef959602dec0d57dc207024761b55b161a8f9d089e442340e70dd2b9c65197d6cad7cfd7cf7b50ddf5ff68cd7c3936b7aadb2daff27b55f7f33ebbfda3e1730a14cdad19c40fa084e3f9bfb048d819d3d14c07800897acdb6b0a884f947c7130d7f469e91c8050577087862fc0fb4b1ff7f3a7678ebb0fa3340eff507ae94a8172cf94ec6141466ab7cf2c4a639320ea27b700602359570a2a278300e85dd1b389171d1b5e8768fa436f754e4ece74162b53d928a35d9cb64c4df4e3a082f1f610cd8c19573bb25d9f3b21289d78ffb12315f1be73d3ca1a5af908cd8a4f68b04dfdcf8f54775207ae2efcbf1f1b9b2e2891cd579d9f8617d45a305e28e3f0c83307f91c186b9a7ebc625530fe11decd170fbf5f17855c60ae813ffd99d553149a0c4dd3be4c98a5db8cdf3314eda8f4c715dbae93da8b576711f73024319a2f5651367c6fbb9047a419a939871e6330aaaf6c61742f2030000000000000000000000001f63c13708a27bc29d8bb5dee2d1610d51aa955696f760a30d18c8508b0539c981c2b75a39a57c9d432147194c1955f4e4c8b47b8e1f9e5d7b54c0c43dd601270c583c1d976e94e7c7974020ecfbf7e3776ad847c1065483d4a9002e4ff9c250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d06e7f257adfb0ff02a39c2b476670789def8a78f3f1b2399ffff241bb52670fa739c978edb25a459ba73c621ad49b67bcabf7dbb0df3cdc4321f6aa828a52800bd0624a3e0e95ba13294500d72f308b425e50cd9fc3cb92c79918b85cdc0468c719c5ff4ac36562fa3527af6e64589e268fe4c2cfdb625d53efa2e155f3c4a022a339c100cac6d0cb99ccfe74c88dbfd4bb15eaaeafaa5bea774d8401ce61984022586710d5e6bbeecdfba6bd45ecbb8208f72e6ed26ec95dfdda5bdcad538aa770b0282916b3399ed8b72a539ce3296f92141a4d118feb138adfd0558092614f21e40e67299b5fb4a94f3fbb59da45c8caa9a0b016708ba67dd6ae0cb4a34d9f4af032da705576350c222a45cceed772d032d32e0a86472ed24b9e1aecb07060e58b20227fed6973ed188f36267ddaa6986deeb792cae29884500f87a34c63bf2ac70cf03298b615de5290ff74c0946094775d337bb4633a8e20c74feda745886d315f13e020f456d3766738712e54827a8879ced83bb9da94daa515825548cb371f8ec276802197cec015e8befa6d71f40a3ca2986e1891fcfaf9cd426413ecc8bc6ec0254c74350a134c12988bcf615bc98ec8f00b947920d1b803702e24ec225cc99c506102ba17d6da732ca03732efa7043e97702f36eac16dfde710050b431399caec6a1e4d817844c73de7e63e9bfe2efef02e3ba4b0cab3d91cadb5e9700492c4f6cf8427742b792d529b09e6e1f9fc404925e6b7c12ea58977af732c8cf2f5e0721fc001c2eef19185e109336175ea34df257d8e5756fdbd11680071ad00c655356a2ee45a86e63178ec131ef57f951df2e841c4299a442034567717d3b2c4dffd9f3176bddc2bb1c5c39e03d015d004a73d72cfe88be880e83c702188dd7b15e1fab9a407a7a6a29c97e1002e4308d088bf78f35614b63845715d9792c0c05d2f7011a956381f9ac2190c8ad95b626439a7b5494304de02b5b341b40d6f00b8db79dba2c9bd73a9a982a2c14fc7e7851826565a65d82c19a05881203181d34cd923a40c028bb39091aae65b6e8a0e990a4d73259229afde7fba11413f44fb2804d40ba22d7928ce10ae8fd71e4ae322e76c0430155013dedf50edc8f3585bb96f8b920969884112538eaa5302a44c7277bd6ec3b5da71821f6e9904879fb58a610d6282b4b66451e7e6579023bfea307e6dcc1fc3d1d2b8cbb3a82593d368b25153d308068ef9e1b9be26a3dde8395ba4ba001cfeb37b57bfb06b07fa44b83906030409c1c0fc140a610fe024c6fc5391e36aecc3ab9b1e91111a71600dc69f37c64a08474ede04c6ec41dbd7d9031e69c90daa637de174560d8aa25c91ec5d5d7b206afabee1149194020d1bc6ba56be0860f924dc2093d87660b44a85985b1b7faae9d70200b472c591b34008c1da56725b8e4f10de824ffda078e8ccc07a08f7f808d1a91074491a8252b6e73b9f250a9d38ab0440e914f405a99bab7dfa6f08c30339c903aeaabcbf0adf8df34be66dd2cf354cae3147166d0b7983b7f8e31554fe4a42d502562545df92be9407334f050372f4c00e275622940e6e0f72875396d4253f33961cba685500fed459fbb6f9b74e32744bb280a542c58eaa148110d8c953f797c297f83004ab7c5330a383cd7cc3a0b9b1cef69e336834b1d965ec602f6398341967250ebd3d68be9d650721e5585f8eaf8edecfbc44a9c90344da9dd0c9e6654804b3d09e45b2ab65f7f715c399a6a9c88d5f941b28f93b67625b928470499b83e2005965a77e3e9a26d8a8acc2277bf2054f04c9b772c4755be58f286dbe5aa36d98ec4f45797a1f34784e294634e7db40279c589ec405b21c2406d1096920b1ea6b5253c0e015e11591257ad52dd7f7772c977401ec00d65afc734f0461b516acef2f0805ce7ec21550556e1db4a5a1a1db59a0fec5434547548211a130044ff1ecd6bb7bf6bef499bf9b65381a09d6ff557033ee94702a095bffba98d703ac0d97b7676b303d75c469e3c78db6334cb63db3b07e24f3b6fc6628cd10714c40e77dfab2f4e6a7ca236d106498dbeeb79c6b19e0bdd735fc47cfa6d07b53eacf50528ee0ce223d80ee88c75d6912c9209a95cc78cd5a609a03559b80bada49ada735e8d918e867833f497fe840b9386fe94cc43a297e3c18715f806e0a127cb0793cde5435a11905be26c0ad5419ff357a7b84ca59f56fc278fb55a9df0f429e3d58fdd241fea71e1bcaf614aa79dc9f3f07925831556ba93cf47dc0c36d136b751869d882aa0d2244e1d7be20000000000000000bed2900300000000c0d583573bc2f7bcc31ca7dab68cdef3766d4580632d4a2711914f94ea5e1b579979a083c0898645b424095c239b3212feae7f871cc5aaebf7b7da6ada6dd5006134e790fc8013513baa04156b9cbf5fb45ee9d8807c012ca36eafaceeeb1fd3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006fe94f3dc25ec6bfaddf1f90a56041ef917f6985f92a3ab00f07d712a3eb4a3256284d9a6f1e4d5d406bb5237b27901c776799d3b451b6b076f08c1fb45ba2be0f4fb523712739fbb8a23fbb8fa5f7968f68dc420143ba39f02d278b72045cb1e9055ddb88761dc9ca6656f82d7e8420f4720574524d6c1382239fed4a4b3723020bbaad329665f01d3768b88759a359bb57363f882a9f1a25ff6ac4e63bad5d280227129d2cd0b6929d30ef123b72c3ece2a78ad3aba87a99bf680d17c49d7f07270a029a285ae9d92f0f6b33b1ca5790381b0ebbf96c67f9d95f6c34d72814439c37c34b61b53c337bcaaae72142642e5207becfa94ebe623a2a08decf852cdefb30031d20ac377235c767384c3446580cfe415daf565cec7d22e4ef645e079e938d62020a53d3ce4bf6903b617b730cbf88e560baeeb8f70a321bfbef0c64de5ca3fc1a02023d2931feedbc3bd8f0d5b79c6ae723113cf73edd09e589f7415bffb3bad3bc032521ba0757bfb87709f06ab9c878f264d73f7e3ab664f97eaf7a73d3b4fb50fc02250980d75c0e860e70ba03828aeedb7b9e42a67c5d3ee7a7fe713236dc8fd838c114eb3e5b1920977e5cddfb9cedcbd6c5acbd41df2862a0e347ff63612ce906612c95cbf2fe991ade784439125d22535019349af2576e6c536faca569431726f22e136c772394eb1209dea5420819a08156edd9efbe772ac5df54c3de368a78d496c54747f22883c76457ae57bc5be08e4ee87695ada849ce572de189e3213567d4b618bb11aa3a13c01b68c0dd58198155f7aa559acfe71ec200bd99ac671ec1a2937282536cb4bed14dc44b3af07843b1aa8fa1ef9724e3eba8c9a123f36bcb7dbb11375a266e68598dd37cfe88accd9efc1612c6c5552e23875aba831d9c6ef098ee804c2c19e8593c3f8f348ad054027d5d656f69c04c7884ec09ee40f6037ffd96797baff6951d55de4ebfbedfae70d0950c3642cb7f296d8b53635f8b5cbf04a721e92d9eba10dc3420d394129a8b323eff1b9547a7d7b01a68f8a9979e019cb38158c332253028bfacc66cb8759804c3fd935c9c8c644ab3d1a339b99e3555783d024912be9eefa1f679f6dd0577939f4963209797b3a18f5ad75de5c14d4e2b7bf486bc12c60a264a9a4d0f0b902fb1a097220df6ad53acc8db97cc1fd5e42cbc9933c9c64e596e1f2c962b07aaca3bf69d52765c07fba63e6757e3ec4302adb0e1ecf93776c070c99bfa3528d447948b4be078824d255c81e0b8fbe3c093852500e4363c382537657bbb58e09d136a5ac247c92e4a4f556387dfd1d30b2cbb664905e9e36e2cbd3a5ed10ceb3ed4eb2843cb7a06344e4fad6d24b490d4c8d0177b4cff1db2df84de9fcfdc637823764e2b70627b942be1b51a78429681ffd6786829aacb8abd4884aff964ea87fa6052be015e64dca38cac9c2147cf3d1d10b62eee973df6d09d19c505090750f1936949b4132472907b60d48ff29112a4041a3cc5e998be57446f68f7ff3e4586fcc7b7f0570024af6130e24e8b74a8b80d2e92d5a423730ad5f86007fc4117bbb1ab8dfba27f68d3eac74b86322472dcaa882094ff222c0b8abc09bf06a0e33a9b5c444fac9f407287ce077f98dbb797c9eb1da542e806d7fc49300eaee538f3fcc11ae2b5249fda5cad2fa15329fc583ca283e8174452945278e42694e37cf66044b7d2c761197b752cf47df67aee65c6c2220c32c9ccb7e784401c7b18d19242a7c4f544024c2a7c3e1072086d8c5826a533b147e44398cf87675c0b222c2982db42650e8faafaaf9026006fc743a2e1edca6bee2e2bbf6d18eb63ec9b931bab02fb5a6c0079696af2f61bddd8315f315cb74edc7a98d5d1cdfb5fea1a61af7db10d98e606ab6774b20743e450eea688db02d72ec281fcbf4523b8a88688722a326fd9466b85c6d81deab14545de900ae5c1bee601db18db67c2c10cf7a66edde0fada22013bda0a8f5bfb8bf506ba08c0075496097f305e1f19f74dc3db64d8de64289833eb1d86ff819889004c4af799f36fa30722173d9c9816f2e7c0c40ef1b0bc9f7987471f8f98d6807a4ffccef4159e9ac97e67d036d8155cad98cdbf9ded62bdd94b262070fdce7328891a179b029b2736ea2e0659bc1b39162e41959d86f7ca6f330495134b1e64ea336433ebe2d77e1faf1aa99e07481ce9425ca08f30d4bb95588370a2b3ce68788ec2ba39c674868fbc19711c90f97463b20e84a57817bece8348d4f79a33b56d38a94d9ced625b6281884b950ee21cc20eed9b16686565a534d825c9087a6bf61825b5ad9a3e5ba6bba1736076ca22478412d9375267920b04dc4a214fe3bb486d79b62ee2fbeeca3fc357996e47507c0e2138cf80c24614b04725d7143f91ee26f8e360f6913ba6a702814681eb3b8c07", "526351", 1, -1991775465, "2b52dfe01600aabead035aae8439492cb70ac3a056561c148ace9d17404f1885"], - ["030000807082c403046c0dfc11e6ff566bb1f44924486c2e367bdadb05d4a8c4ac4675c0c8640b005a00000000086a636551526363530925190c5a950799b1504be0c26989f4374e231f8c62dc16700b53d945715b03a370c09b0300000009acac630052006a5153ffffffff19d63fb5337d20e6ae3cd422280a10f5c5e5e8e78d0280b7aa6bfc228beb69830300000009650063526553516a65fffffffff3f238105119150aedddd86172a651e64a94ff4b26eb978c04bb29a59162e7460300000009636a65515152acac538daadf910277197a03000000000865ac5365ac5363536cb1bb0400000000016a5bf91fc4000000000353649205000000000000000000000000884d868f115213e5aa0aff8ae5c800c653358dda549fbd0b8a239dae24393a87b13b74fdf03a23aa39b036e6c4c4780e8c2d61da70c69c6f5f6dba5355da0ceafa708b2d8d6689900bc813eb0fc9c343dbfa7a4258caaabfc4f4f4bb3ec7d3e200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4f66c6fdb3e78465dfa182f2056ae29f315de90c460ef3bcb9722ebab5416ad4244d16975b1eff907e78b989d9b0df1836cd1e57b47810192b5bc9e185a7a0e53721c035d8c34b0eb478f1aced1520f5e1385b7bd1b1f71889ebf893a1657c19a12671b3cb0a52a2cae6872b52d3e97bc8b7d2ad630b0bfc6cd1148c3f28aee0201daa65142e44fd3ddefe229724b8b26ab6ef2bfd59ed690672ab665b464a37f023039529993d5e3d489ac7536a94bd7b9ebb58d50acb35fa450c8d0ff2e1a468b0b087381125f0b09fc9c97dd0defa99c51d1ddcf398b73d58cc5b5815c836143e6fa4fa37adf770f729b95bc10a607f603b3da09f13bd9c9b94eac09a79675273d0218a1a7e8f12d9491d77b0f91a9f24a55f07ad17ec55d6634e57c29db1b4beca7021c284bc51711e6d70196cd0a1cc39dbee415f5292f042b14f272f4277eebec1803272a68be3051c984ed909cffa515a1fee18f23c4555305a940a39ee4dbd602420309fa120f414ef727aa92f9b084345e01385c21482bfad1ecd7d0375a03874ea8021f616e78145f080585ea5abc45ed0d1624b3b70529adedb081de85b8468c2de82d1bf8b6d0016fa04e658bf97f146685ac2e5cee370d7610f67a57ee7a88646db1918453a62140144931b895ebd793791be213de49960394a3c54b69cfdf1d4bed823274f028c6438b18d0f24cdbb4f9b91f558cece56130b48cb78771e3b6f12c118c5bbe32e5f5a43b8cce653c5bc5d9d02e3401b1ba6e90bc38fc5e1a15d54076259af3ee6067c1808f97caa581c3a6cb0f1839d070e5b1a27ba39c5e61484821c29b513aefc912c0b6ade437667362d56c486fc24004747638a96f26c4a35983b2fccd3ddaad99cebb0b90797eeab5f3ee466ef1fd3772640c53b67c0a3849d8b9155dfd38820902dcf9b89b57754b3ee4a044f37a1c8d12fae57a2254933a94d3fdf6c3cfbcc21164743bea7e2f1d6cac3d650039a4612944616dc26690b33f189a617a5beeeb4d921bd01039224d54e6596c9211cbc7751ba71d85e1d32e6baf2f500cbfd8fc3f0884700f6a3333b12499cd0669c01639bc28b366080bbd20ab85bc47bdc135c9f9ce945e8fe1b6b108b0870014f8c7aa36d4134afb4213587145ada6840cbda3df7151814f167bfa4bbf89942c2f8a92e0d1273d95b94232b06bca3014775bc047de46437b27e022857d145e5861eb5e22782b37963ba581a7f1348e858dd3ffad4d13aad862c70ec381d94bbf73ae2e141fa6e9a752655edfef5edfaea13b0765dd6d3f4daef76177ad13135bc2435695300fdfb0d95c3871eaac85f1b530828c972004e686a29093aa723dcd97a4fc2941f6e4b6b13715f0ec879fe46b0d480d715cb229977eeee6ac4b120a43cb1f924c31c189275dfe204f032f02c3af9e2f6aace9d5df62188d171ddb03c44f1a0504e641ada72771ef2fd22fa28bfac5c52a379f9bb821b19334b9eac142c797eb78010f70110f3fed416104d1b095168fa224ad8d7c6ddd7a440eb7403da0bb4865978c4eb7dd886c7454bbc910f4ad683e492003f3a8ef317e81dfe17bca682ce7bb86165df04574ecdaeb2005a66bc0864097ef14e70e7755aede943254ed99f1e456c55d8b3420b743ce6833c988beca3d84b5675d58c69d8942b4b1abd18943544ca3cde8f0fc9cc46a84b6236a0dc3f01fca47837f92dfc76ddb9007176257c9729536da40219c6059861314ae1140cdb696e94e616fca1e6a84a418adfb6a4df3b424163da12da00ba877ebf91f80842cd6e17c7a07bf5eb0a1cda5955ef2ff2f77090376db736aa016dc12c06fb1f977a4e8a08314621b1140a2220e51930c6c420e4a22a289c04a30ea3d6da645142051d9cf948e506a5950e9feff32d4094d1ea5ebfc50423b77c5de6b4c03c91cd98121afd55225fbc8306c77304a1fc38798313b92e020e20a121d1346831a17c0b8d6b09b8822c3db8e9b561503efd9a622567a11563e91df2efb725897d2a64166c50e6c41c674571e832b63c5e987e3418f338b23274947ccb447b00c22b46496eb1feca3df4f4c35b63cfc27293e1700ad690173db31842837d250059408e7566339e03209a6fb8879f729469f01434c30664a291affbbc220cc649cdb82a5eb9706f2625c41698b49c3925ce9226148fcb2e1e710399c3c7c5aae911b46372294ef560cb84b9717653e26145c7b2d2a1626edb83c97743b47997acb11cce25733746db76b2c3d4526d5b0faf548b25546c4f22c52dfd899cc3128f7245853cf2558be0000000000000000418ad30200000000939fce3ed857ee2efbffacf0a96983adb714db1a8f40bd6721dc601fda12ea2339198cbe2d70d353e548b369b8b49006f17c0293573cd6c65f847c91f8c1b4de983890e4b44a346796cbc6ac88cf7d77da12a788fe3f7903373e632aca53882900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffa11620d21e0cffc766a02c2a2b27dc2dbeb9e47e56f1d19b4c2670bffdfa4d8f55f481a7b73c90d9cbda502943a465d977700e5297235497f0a19c374e26e59efcf215e8d2ce4d31d576babbd3e480da40d19507ba314f27710e0f77b0ab3c17868689bda93898bd5ec169be39cb72b1eebeac63616c8331813203307e4556030032e2f163c92f9362e2e9103ab8b87803459ede4d7f4b462fb51f2309b6f7270213c5ae869d79514b4e1e752246da24fb1288903ad7a84cbac90699b8a59111420b05241b6c2a40078f44a2aa325567d0e0ced78febcc9dac2927b5dc87f0f8d53e9e4be09049ee937a675db55c1895576661f13b0266755f0088eb8fa471991e710310fdf23a2f1b65df0d57372ac654d62b294ffacf8d5686d19a4edbe55f6892c60229208f683ab1fa97c0de60e546d7f239a467497a9308662733feb42b427b995002095679ea7e07e93d8f49de494df14f14d4af1d7b969fd98453e5b3077a972127021a040f83ef3598d85c67d2d5793a6d68b756aba66892dc70a3a60d977229757c02149e4f1cc53a064280f1094c79755ffe331770fb2220f789b72a53bc2f3396882ff8239542cb8a726192a5acd1a0bb94896ff98858072262522d3247d73ccf8dd8b49c80bc1a4acd36d8f99a96dec24e109f3bd0ff508eeed5ca9398593c1053382aee4a2dabcdebdfffeefd3bfd0bf39837ef89e919691c3cf8ce590ec997a1035cce592df75acb8004b77ebc3ab3dbd7dfa2da56116b1cfb2b249631704e4cfb16bbc6ec4eb6cad19c1f9a92108ef6fa6a8d685f478a2d70ccb243da4cd5df4d328d638611b7788753d0c4f1f80438f606d8a3710e4a545a44a7e2e0dc3b2f88b69195a93121e65a804345da279a6ea8722fcaf04d1efcd865d499aca1dde895ab37298a9f1d62c0c74529bb8c82a7bd1b30a155c77129a497b76c14c55f19b57262f26b2f8533adcb70e631983f525cbad17e8f5c7c78d849d78e5451c326505fda9806bb756b5dc9826e4eb3069040c2d0ead2ae3753b07ed301ba0789df6ade66d559e75b76565ff73c62b8746833e1a4a54ddf5179d3cc73bcb1a8cfb595dc6e8250ae9aeea88f3161e327479a8950f914bf18ca6e071f48b994e67b7fd89c68813bb08ee6d263b9d5dc4d347ef28c305dc405c5586dda329ea5dfe53affa913325c6a28ec6fe675f5247c38fea5c6d55fd23fad07491f46f95fbced95a1fb0843d082da5945882961dc11ea7b8818ec30c569d45b8ef53734f635f4cfebedcfe6689e0c86a459145709c9d57e8fa5deb6d23398e2679305228252f9ec8d581d6abe7dc8305546ac3509f3dd93a0295a51a4c6112a4c1ddeff68e9f1ad3f0a5d8e58e4f6f4de82934a3d60b2b1d296aed4d30d9b301eac33932ea2cb042b3cb1b9af5a0bf4653c8b96d485c6fd57a404119e021fbdbc2ed23085360640299f467be65f6ce8f86083a41b92ddc33afc53e27566b542fab1e9d4d97f482db5af281fa8e04b183dc2357fbc18d1cf3eb06280d0862dc743b51b4210bf1f6ba694421f8334669cfd7d03df484cb4893b4fb36ac87b1651d846afd9c8cd6625653105685fde6e55872a75f3adf8d8b071d9d70a412fa4a07edf80879c4da83ca2d2451845b4d2c60259c1005f89a6b4b5f695dea41741d8c606da9821ce49f1a654db10ca120d36ce174e5502b3c6c827dcdad5f4a828b620e701b6a9c5e75a5788ac5822d019a64df6eba3529344766c02d2ee802846aa8a68c779379c53e212860b03810a2858ebf71891d8d2aa169771968f63ffe539fd846de0a28e5e2e94439d5bb5da6e1cae9f345a6a19b12f20252003adcdf24f53d900a659bcdac0a6a7d26ff6c66243fa46b35c39113abc839704f9bd271f85ca429e6c262c4121471444460dfcce5fc892266b820cfba4dae9cf79255e371c3e07bf0b96dc33b53fbc64b34bbb0aab0cfe22b556364d1de9928a9724d615095467a38eb0f87cbd7ebb9f41590005270b14ae287aa34a5fd471f0401106badba033757b981bd25e3a4c2759e01ccfd045949a515982067b6b6ede63723a5be4ebc33d02a2c96e625d75a3eef65b083a66856a43974caaa48f227c499c5766e6b67941710c112a203a6e4f33c4ba70cc401d321bfb629c9ad3a57466e8fcf259d1e29d71d13d23f34aa591ab52a5e5da1bd236553c9c584b728706a5ff99bb9992f1b54dd4d9349e8264272ca9b34aa88173fda703791f93bc0c65cf3c0fbe0142c995c42721f1923fbba6506363148b7148e56594fba24336ca85ff6202000000000000000000000000ee375153af4e78cb10a3d0ae4a133bdfed155595c93ad56fb1b056421f64c2eeff8c48d388654bca498edf773f7da0dc45429cbb295ec7491aef7d9ae56eb45ba48656d418e65b9ffb390e46a7bf437ea197f07349207dfef0b0d5eedf4017a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d343d84a6f4d0312b2d95e5153e737235226488cdf5cd2ee990f62ab265ec7a6cf2ba6bfed75f766a5c47108cacb89ede51264e3916f1c85e2738b1e3b320f94ae911dabb620db3c330f5126b9896f3a0532106f82bf98c7ec13aef551c564134a017b225288a1bd6d8ea436bd3d43c4080fdaf261a479d363bb340a739a75400208f5c5f6568334b6d034130604c3c95cd888721ae78fdf44936150c07fdde99e03139ba37326822068bc2ffcb7ad90aed410748ae9ee905cf8d6af2921f4ed13170a08871232fccf497e762bdb357fd6939f782d4025c87b11db0eed25cf6f8db0eb1d604fe5873b82e356983cc9dddff30f36c9215a68e3bf11d930afcfbe24256103003b4885ccd882041df18baacaf95aa08ca800b02ecfe0674da0ec073f4ac948021437d3769886c980a146b28cb4be16188a020dc39e0ade60dad814d3d1ea53f502275e26d40b92c2df2999f4f71a7f9efd315da873d02f553fe2d5136444a0ddb3030bd88f5c99d6c8a0fbb98e08fcd46d887f57228672e404ad564bee1564f724a1031cbbfc191acf008a903fa5366b3b39938cb820dbec468d67278b6c540f5cf0b2e732feefadebd257ddfdaf5e0d8f8b02573b0efcb356f47f3754e0183c830620e703a5c6b51b38cf2da92917056eb1a46dcfcfe1a08a3be01c0a7f60c291f22b481033b650d4763f7394da9934ca70b2f388164ee1235e65c17dba3e49e69cf1379d86ab19f5e093070c3d26b0f62ed9f591e26a0ce0c4ed13cbca8ee96eb7349c2e9e4dd1716a650545c4e62261ada1a500c835738b0e56cbaaff19638472dd5e8c8432c988aac01b1038612e5129192cc23fef7ecdcf94b577842b32f6f63f7acc878004167b894d489e2363cf92f5a2811578a738284ab1e3c10c1a0ae3bb4526c42a8c54b0ef582ed3bced293af2d19279368930e6bf95978973c07944637d9ed4901d259e09d11f56de5bd8e0187556bc9bffb132a9e103d1d43ed3d9e49aee82b856f506989933fc5fd1c4ace5f93cacb8412418458c462a7f15764f80112a60195688174d6674ffe5ffcb880adf7902cdc915039cbd35abf30a857605ffa7ca7a288432e9973a2af775ab41dc4dc872038c2ebd4c1e88c0758424223669690dd6b777ec45ca201f35882b5278ac45d802219abfbd86edf8ff4342cd9c592dcfacc623dfb7259c40837cc8ef6cba69673925cb0eda2edea50f72067309523cc1ece3781dc19813415dba61dc2dc7e2273e85ff239c60247cba85942bae1db9857d6f55602d26d50855ea59f7b5e710cdc48fa86af634504269939c5e5e1d49f1e7ad58f0e7fcdcc64ed9e351da1c3c6678e5aa4d76c057cbdfcde22700bc23374d72784e0a0d932292a817d277357af7a346fce455816cbb769f9be96ae4b56ddccdfc9c7bae0b1c5eb11c93fc739dd109b58ca77c098e69c4bcb7fc39fc44dc6f708e96bd54f63f985b4075ac62e1ced4f57b4f8fcd3f552a258b4920a11a6c8a501ce4cc26894d278cb29331d269f1a7b0cd0a80ca10ea5cc8fd3cbde398a66d1becfbeae35f243660672b979351442e0da1d890f85b41f437d99073a3e0ddbebb0127c9ed4a0bf8931b371956554e06cd56e533fb4d78d913bb70c2acfc4f9834c21f1c886a01b5385b56560be59b8a393062d10da58b457ae9a447153b5b65ccdbeea9dbfb241c45466eca85702dc32093598b6094b43497c12a8ffae06e40f54fe39ce074662de3471fd521629d202f21efd95c53d19ad5813d4013e0381be431f4f5ff4c61cd575f0a1071b8fb695ea86b487c9a1f0e26a11ea11d622a1691c1ba4d6349caff0887c3ada436dc6ad49717c04b407ad1b7005a27bae4b4bb906cc622c2245a9af78cf712aa0aeb553e597b6d7e942344d5e8194acb99333d8d00f8bbddaf5e0f35af58c92f06082657880efaa0a0543e6e0e62a1dc160a21cc58a2760e29230914392f43fa305b4a76932af3a8ec8150d031664ac16e150bc4eccb62ec8523e20df3db0dbb421eceafe27d6be8adfe67f5e4dd3a0a25bcc10f81bb17aa5f5a29b7bed54133e72e38365fc40ed9270a7bd48fb958cedb16c6390694a87416c144c8542ba5650d6a3272ea58a2c40573ce0bbcc82d7c5dd5caca626f436e820875a1f985a9295203468c63da4c7185cd49e7da02555d93eb3c269011078fd3436b4c052a18e2070ae3afa8421c1db739fb0d0dabecddff2b83ccee3f577cf53c075c9c8ae7b3fb18bf4c82f2a3629f570f522c8c919aa109073fdc25be92ec81f67b621b49612dd17799ddc32ad2aa16286d210d8186ed1b1ca930483a0eb1666710410ab621709d85cb403cc6988861810e385506e6ac18571808d469db371a7cd019b5b13860f3c090a5f1df7a0b095f1a35c5ffc5b466aaa7a671333215aad63900653dc90c", "6a6aac516a51656365", 3, -1767500385, "36571608beca9a9c9ce5afcea487130cb47262a9212934465432bf14e71e5fd4"], - ["6c0abc11040ef2c84563de2bf8e1f729769ab5a12f2cf3cb0f4f0f6eff80378d588c56112f01000000016affffffffe3e3a26c7acce730762cc0ad0b16049704f72ce92a53b97c20b21cec856da5e903000000025200ffffffff47edbd4cfeb44172b713ce43497ba68b6b205c2f44317727f9e5500357e95ad903000000015398331ba9dabe20b95ccdc084f192c85cdcde623d8428054f8a3793b39e98de3edd7e8eae02000000005bc46c1502131cab0400000000046a526a0021249f050000000004ac65655200000000030000000000000000ce76f2030000000064a365e380d96f6f3738ed150824ed0214f405c3f460aa59f232cffe4871952024439d571e11f8768473bab758c1d8d7703b21d0ed10fb3700389c09cb1c2433018f87cea3943476e80b90b5383753b71fe34f6f6ad5ead57d64678fc1e034cf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a55a5a1c50058e5b41f756ef9d8659fc0b986fba0faf533070f27188a0cd851948163d4739c84fb3bb1800fbea488a19ea55d843ced5dee7816422985f5db0a15352c2f3c317a4705be2b787e857b9c2812ecd62d38f442270696ea58e0dcc4b216d2de622fc9826cb40fdf419d9553d48aca6dc7a24f278f5b2c3488533502803050dd323ae37a7ef19628b2ebac72d556072f7c53717d503e449b62a0f69910e020491d8a39749710cdf93dc2f08defc120d7ca4b4bc49c568801546711fcc51f20b007ee28787e7229a0a8d2a965d2172c1641f69e74fdbc5de5b48071efe0f03a7e8dcbbba22be312f44dc41d589a579916881b9dc1a879e06cbfd05e4f296231c03008a0e3fbdde66bf3b0558da3ab18e0c7348ad0929e5386666e1d55bfa9fb5be031f0da6f145b738999608fcb862e5c7ae6fbcaeb2abd2603b883336060483712a0325d292551a36537dac8ab9d67a949a3760f7257c35067441b330eb09deeef9c6020b601c7b433d1161ed15fdab4abe99faba381b12753eba1024d849b30962147c0200ec711f6508c7cd6ab979590c2b2db4dc71626e01cec067141d97376584339c41824a1469ad824e5ec56454d3baa8c8084938f529ab0a13ba06d8934c9c54179b116e2aab6be3ca7f187fb33edd4e5072e9202d1cd8dfaf2525e7e1c4731823ed56f2240fabc2e9652622aaeacd7521e1815912f3668aff65dad62947cc71ee951e35fd4d5506c92fddb3e7c0e7e98f0dff453fa23236e765c7a99538bcb730f90e24139de8048d079d54b8f49cf387d707d6f3f61b667b8620afce3ba08956119f0f0d619465389dcd0e61f40b1e0530bc84fc95d86813631509185bafd43d21ad24ee515246e8a5c35e73fd627676d237ddc7df489f774df35ca7da19e32111cca8a894dd1caac5d3760e81b7f350f33d4a33b10e52bccc3ce757bf7522b747d024278bfe84f4c2ed05ceee11fcb453c16de196d692c98419fb3b251720db620be824eeea016b2c0511d006494e4574d31c32a8fa1802244a97f8140b9337e80f8892ce4fe4723f6126d59749e89fb33505752aee37dcc34aa875003bc8e64473b3e2019f2e3d2a95ff856d1a64ce441ac58bf0070024e2515222610cd535ffa0005e270b7c1bfb242b9a4a1749cb937f50773d10f04484e4d6350c22f72250459815855fcc3acff0b5c0161794cf3babdeb5eaa538dc29acc87627bc7414951852c8d8a545c895b400a0a9a2f11c36cfec674884dd73b5156268ac1750233c17c74d0263bd34348a77e78cc9e70c2c8b2e0226a1f15af7e35425777f5516235d4e4e4eea7761c01cfdf7ea28ed3bd9dba4f8a74eb24dde3cad9e7629e86404836a38ffdaa4dc7c98ee22f3c97e0e7d6b450bc4e309c591198b0c4cd98ba5b084b6cab4a3ba761bef7e9126636f92f0798f123d0e9c578273bbaf91adfcbb9af56efa5c3eb8ea76fd919cadf78c004b6129ade74063ef5eec512b3490cd3b893c6f05a130d80dd8936779c8e02091d33e7c22c4257d903f452dc424e39a499314eeb514e739cd5e22ef641f8d1122f04995995b900e8735ef829a7017c51f74a25985a5c4c3a024e2553117e5a5b374234fd32a56b82e018bd1434b2c9fa6c5a3aed80317a9c4851d80fb8429b76e6ba02b57ccdd4a33677f4df067e048f44e5bf5cc4c5abc03fb85b74ae8b6202fe80f779e0c9d4e17ad94543231cb9a70f8b7a2bbf59cfa38ca1049172460428b730afac1fa75061bd322f334938117b678aaeab21a4e47aab1cfd2c684def10da1463de49972bc41a90363dfc736897baec6d9e842af88ceac2cf6a99d93e4c909fbda843ce19612d36dc77f71dc5fbf92872582733979c0704e79ed3eff5cd4bbbfe4c0f1e47aada31ff1812a425913d51fbf28ddd5096e798a06689aebee050efb1e35372ec5db257e21133fd25ace63d6169949e9beb72f25f116f91eb476fbf972bb10360e50adb9701d06f031121034276f2d8ca8e56d75e8697562d663b3117d6b786e8fba33561b6acbbad28118b07d9861bf25b7e0a607bdcdfa6322c1f0cfa1c2dbc1ba763c116ac411138f857a661f50fc8520850a966a663abe5dd69a76518ccce3fd1d6a2a6554e217c317df4147d30667eadf32a209487d0450bab5ccab84b798c23e3b41e2feab260a2245d93135ae1c24ae3752d02e73ec1868a04bcfbbb8632577102a2ca3ec21e773b24ee380e35e77b661982167e063c92a8b7ad20df98fde6768cd780376e0e93a2d4df759256531d7753a81b56c2103d8e400000000000000007b108e030000000077c8207151b1ca5d3c3ea975e5ff33fab58d2e25a1bb6808a9f19a4b4562d2e2d65b982819fe1e24b14cadf963111ba135ba98ffdbb9bf6e8150e4805f32850580bf4317ab922ec45318594bf539a63c632175a17c61857d787f8732bfe05c69000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b684dff33739d11a4f790e656693773d2a5097690dfd24bcd3ea5401168a11f1fa2bb9d4cd157084555eb4a34efdb10a01d2091ac19aa58aededcbf56c361ba765e9c0df47ff8de7cef2be353b76775a52d8002125a06ff91fb588072905ddcd68203532056131913ebf64820bcaf5fcee58c5eae6d05b314be0b341babc8f6032a78b4bc7ec5332b6a6087a5ce6e020631fe96b7da1b453859a6dae7cd1ccd0e0221fad45fc80b376517b79e7f6e6204c11e3d52e0af473e605c81f4a539c21de30b0517d0de3dc1b512963c3be832a7e07fb5a3c755e7b3a4f4ca225e24c2ec895099ebab5debbfee02d0bbed5a55409b811135a630a0436698a8db85c047d5ade403184c376420766786edd701f27823a0e3e094848598bd09dd251808669d12056c021a78c46bef4bc933874a9babab68ad2284915451b94e4c2073a5721c5ff35a98030fb730ea4a92668569e2011877172e56a9ac0b545d90b4c6f83da05e1a973196022ca18f96ca82674ed2ba52086ff2db3b23bd680ea62f6fa18202fd0a154cf0e8031527f9ba6a76675cf4fd84a67c62ef87e1385ec5c2ff4ab794af26ddfbf4144da8bd8f41029e24917c60b5dea48993edec3ce6b657cba567bae6f35754390e5b83e75f8794a50093f5e83b8aad716a4fb97fc437865bd5a0fcb6145eada3227fed66941ca9bd2a6deec3caac510be937c0da01db36ae60dfafec29bc8785895399d304cb600385f76e2bfb5d27cb2366f303b7e8d7a4d8ab39511797cd2552c317e717ab839f7a89670a69ca62fdd319159924bed7292cf64bc25e7d7dd255d47988733aad6fb165ca1299ccb7831ae8cf37e2c4d613286d339c63fb649267b9f1b8f93aec5de78b25591c2db8181943d7bce63d05d7bfaae480037e23d944557a55d16df360accadd8f917a7fd03dbdbc7ade0a1855a8c715a5c7cbb9ddc84b259e15d3736078b5efdcef6ac16d36acd3fc6a309d1cb4a785b2445ca8bf236a37c455333f286cbce5ddf878205a673cc5701b93b831149e1029e278fc46dfa53ab345858f03af268768307f5a22b036e6e29b2e348b57dca87d8d1fb77614383a533448099d0cc4866f22f210c1e76d8d965ac5a4f132a45f28bdafc4ef6af983a458f3a73b62d8c11df563ae559c34a2451fc17e4dee18dfab40c03b3c8966a7478bee830e50abb26f356a6aed935e7a230b496ccb05ba7fff4b64c3e034051c3205f480c09eac88f225779f901d02756043c6aad6d5f5cf19e0bde8abcd501a2bacf38c8bbfc10590d338f2f1960075b1fbcbeaec8e70b4b940d0faf7174e4a708079ba9ce0e338b6581466ad79ace4cb3b65bfeb1c6c6d900529331892707b0e1a413e76a5aad48a3c66083efa8e4943048d6ac0e489c0e65541e36dd68ff471cf2d89ece3627b620acf17bc7279b594a83f69c9ce25dfb1380e59ee7bf1faad1c0f3ed4351ef398adcda01c764f61e3ee8ff203f6fb65505d4eed79c5f9afe38ca32ef3f877c0ec7d7e888874eb45ece31cfbbc1ed877e3e6ecf2278f3afaadf0aa6378733dd99cb4377177331936bfefe5114a0591b681f994e2d83ba28f7920e29d905831802fbf3a9c0c3e3d3df59b2be07a0e8ab2ab25e7da3c416b309c48903c31b72ecc3b9e0d4a67e4c5be402d05f674b2ab3c64d41c0516753e9424d2f5bcc2bc0a52e011ed6c24666f97935a818352db28b9bc8ab217214aba82fe26e76d65aefd7e3a9f7d0d5aba279649b91ccade94de7c18aafb29c95461ba44289f4b0e255db0e7c644c5bd1f9aca5a996e40a3fcc56ad4fa94f2aa003a2007c89621e388df1709f7e47867cfca0d4f08d718587e2b8fefe166b2c91b67dd5e951afef2f240918033c55567171b8276bf3723e31ca2d1359d2082688778768b28458bf1951dffececcfc4b1b52d940debc60c2968004040d4c485455fa8c6a30c0ffe67a0e13d66d1139536ad60d6ca7ae07cf8c05b1e03f85b0cf924725a6db0391c2646b0effa9688e894e82bd15adfb82428a25283fc943e3efdf1407202b3bac6f29a583ebeabee00f59795fff9d00d2bd7f221a60ee634323fff63bd6e44c9b148e4ee417fdd4b3a38ed15d552b38368d5d645f834d89b7871d759f711569b0a6205c0950894695a2d04ce3254d9002e82781e58e8673348fe40b47fafb097631614d69f91dc61ad5f74b9a4af43b6c81d43b75d0c912d15cb5dc0804e61592bc7b5943ce09e0f94533c5ab9842ba49753b2976204cdff4ef11ed5528a43f27e405cb4e891c65b860c13afca6600000000000000007bcd4304000000007cf626be9fd788d9dd79f6a49e56c7a80704eb71ea1ae07941b101b6ee73d8db7d05485dd60925d32391c7b6fd067f266f068cebbb644063db7bffcf1a4ad58a95e7285d8d4f17d25de9ba95246e3a59050ced66eb510a0c9d237ab40e91626e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003bb65264f205d029d43121b0b2cd2209243ca806b3c5157a3c2016ebcae4fce835fbca2d596c2f29df8599d704385038ba6e74be4c37aea9912ce465f6a8478bc4c8afde606525d9c00ae276624134ae8e01f154e50badbc20d29494593e4b190a371b5c4fc4728b2f9b1c1489fd898f44ba64d9f454dc8c45254f4111263dee020fe9bba9407abcb45db4cc2e62dc0f0a930a93257cbef84fcc3ecb7d9cef44c103215c695ad1feca44073274020c36d2692ecadd677244ce2cc766dccdaefbd02f0b057f198bfdc7cd85eaf6a268e959a9aa5fffe2af8359636809fa96dcadd28c25704cad06b9d08b7625dff814ae70307b265680abca0f13ee23d62e5b7dc46bc60316eb24e8cfea8933f9bdce63439b99b37bfdcc2e14933e3976043bdf7edc1701030cf0b5cddd990b7e016d8842084fd7802d43ae81286e77d4fd2f13719251b4000209a3d76774e4bdf50d18096388e4f98a62d0a074b5478e8c58bd842503a65f7d020af179f4402616683e45a48e50f1dea3fb833197e223bb1661c22abae579ec1d0212a396f3fb50209f3680a65245fb19b7b60b0dc8de14d31bd24beddf81a3d348f2f2e74132e2ba641b0f6db88ad056b7b494b847825fa4a55c072238136f6a356b7b47ed90cd85ef8c2ff9c2f8d3ae6b2e838926fbc03dbb9977f0694d2a2b7d1125c7880b7d94500dd20a7ee6fc9acec02ccd24cb1edd55296d08267baeb483e151d0ad4bb9e34c30c59b6f83b6e0ecf42abd3486e1c5b6b6f5c66f732eafdc3a8bc61b3401ecba62d2dd270870afdc34fa67601ba0239eaa52cc8255ff07b7eb864ddba8c00a4f649204823abc399fee93ac835504d794679fab3ff086d809f934b199515b1cd31d5a1e9003aa64412f87ec1f54745bad5b6b6bc97cf3a2778de19734c12fd66911c14863143c6c8011865fe616d78e283b05f999ffa2561667133affdc6e7a882357aa9fba89637a76fb93f9677ab4e8f4bd8d14b12a9505b31805d5340ccecfeb4b91ac9ba58f1ef15e7d7276614d50db1134d58073a5f3d4934c3d7b26de7feda2f1820b640cb60bd8118fbad3bcbd10e9d0ebde2e8aa3fb0455b1e5c7794d60d8cd80fb09780886fd08854b28d724a4bb05f903e1b78367e06d5b904444c8025bd0ab1cc19bcfce71ebbc5eb5a0220d4151567ed8dd4a261d4b6f4c787bf85a804e6311db266202b9acdf184c6f44fd3fb705c9a730df2f08f317e3c1da905889777faeef7630f0a117ad8362a215753c9502cc116a129d22fbdd63d6c95641b666f25e2b5b66907cc89636b653cdcdcf79ce0b7f5f176b7d83d8cb09e1ca38c21d9d57f9fb6239402357fb6e0493119a894f63ef2b9844eb4d008a6fff15831573ef91707c4eca434aa64d80b6067b07e92d3de496c677a4c48ea3a6f5faea2fc2655c6d3debcc65168f383477a4b3dc1e18678cf7c6e5ef8ddc5926005467672156e3153e35de2586f059949ffd336aa2ccbe063ae76b6a0748bf19ada0f6233925ffcefd2025abf72bcf769596996d6051dc20c474e42caff47d08a76340c92d70b43a362a18b5b3c03c1a3c70b0aa849009fac2db0f7fb0a964c2524b803bf0301e7a343b6a36c56b2d3c83e71f413ab308dc69c2ef1bbc7a9a760ab25d5f557ac8ef2ffd77508fbb177589816c5bfefa90220a7ca787fa2aadfcb10039208d39b8aa90b2e7f0e5a675cd4a6253e84e96da521d29d28dc83fc47edb82a5e41e374a9921d7602627a6fc1d574fea77bcceb66515da7edc91639fbd6baf0408111b9d7ca5377f6a602ced00a1bbbf38affa71c88e93caca44da4a2c9984dba412b2936e763150bd1f3736dae1401c0e088997755e7ead7944ea7b6c678a346a8ab852c617e98589706f8e1c257aed05a987da6d6b44a0f2b1551907f09ebb34078be65619e62426154dc3d8e6698ab7941ba3e2c525154d94590bfd1c1a659dc85dbefc1abdf3ae2a6eadab171603d60a5ce6daec7088aa011b72783ac5403dae9ba30f16a3c03158bc211e4a94ce3ed506d8f129686d66e2f8fbf1922284e878cd166b8cb7f9203a0898791440fba47c1ecb000bdbf41a3efefee8e2705f65515282c90b695be98567fed87c529a6e365675645cee17720c8d6cbb9577ad38462adb3209bd41534fb7d57e154b8d842c433a6a2de1c1a4246c17763a00e1749847158c932bdb2d9ad833dcdbfb6d4dfe14d6dc07e35653a204673d3c6a56d833aa4d5c2d2eb9fb3b5da93cdbf550ebbf83e0e4c63855932b7b552bbcc41903d9ca6f3a60fa82cbb56ef9992d3b617538129b06a80e7513c889d646d3dc92aaedcfb56177cf640308604c4d66743392cf564633d910f37a7b4d503a2a8db87759a0576ddc8a9d02f727be675b03fd1e7cf7bdba05f3d1c4c3b21b3be926aa5436d2195d6f5ac501", "636a6a", 3, -2142735693, "7f94ffe9a2a16832885b254d93b8ff38390501a4096ca3f2194c236288dab08b"], - ["da83195204ecf00e5da5b832c1d25fa68fd710659c9e8e40ca61804dd8d068232ef1213bec0300000006635165ac65536dce7097737f7a9f5cfe3ff6bd441a7d788eabcf23e11364d85c4b311b348c9933edfb970000000006ac5152525363ffffffff54fe8f6f0f7d791a987dc6a3998d2c943a38f22aa84fc1d492723061242875b80000000008ac53536a6a6553acffffffffb6008c1c68932ead3ae1d9a12bf1a8531e3c3f2352d6e26bbb930aec27a57b12020000000100bbe81d1c019ba3100400000000045253526a000000000200000000000000004191ae0100000000a72d67a48a89cc817112e3fd0ece9f92a871fcf835c277731f5844f67c4ee8c21b904f3c8011100b5c4e12cf155ca90f7ddce750a536aafc188527a05f06a305f173830548793943766f3e755a901691d24b8744e109ab3abb026b97d2abb15c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d968a4af53072f2c169872b955f05fb0acfabcf6b7d2b5a9ee4b7ef56ae84389721c8bee5f14e265268f26bd1435ad8f73d20bd3bdc428fe985565301d83502f6feec460fb2ef4024b7b0df1644dd8ff28e604f20127b3162ae8d813a31c67c86e8208063428c48467e4f04916c984ac7e62407a9c0218aca2d4255f31e2da6022667dffd68c325ee382493e9f00c6e33bec69e147686ca7c130748d09cb0f93c0204f8c94f2a37a364587b53cbd8c744876ce47aada722d0cd7da737a4bbf2f8b40b0833fed4de64ce874daa3c71c3a18880f2d1d17fde0106ac9657e9c44950894e592f98f58d021bd4a9bc24879f2fd52b115fe4d5591c062a068c0a82e1c3715d031dc0a4e2cabfcdbc36b15eb86226db6c279c420ad437a3a13618d74b44a02007020fdc763f1b60aedb4194104345fb1568370f7bd1879ef7a57894866c450099230316bb68af6485121e54d68de6f102e15f8b2aeecd9e4b0d8827ce4580194a7d7d0320350858dea4cc1c5bf73eb73bcc41a400dd6584800a8e6098084573202dbb47022b21201b3ad534df1384c5f4507209c1accfcdf58145f6e59eb26f1e0fb29898c7c9d399e32c176eeb191d721f412b99e478778ee0f4ab84577af7dcf856b952be9db5078079320eb8c0c6ad11238e1a0d73bd3bfc1c9d9311db555bc1c7d6fa174e37a2df5cd234709e027d2d2b39f8b62975d72669f5ef59704c5014b5d269e7af94dd378e743d055937613d4c3ffde461211a71086ba5e7d01a8b0379d8f87ffc1f42603bc01decef893ea5b65821923bcb250b108045b4245ef692da35db0b32f37dab884c4a999ed42b76e062772ef1d09849e549d02d9426d4536aefec508db9ea6222635842f412a28fdf856c615388a36ee3c66750fa10fb3b09eaefd2db2c91d543d03bd94ec88900b40c472caf2287c5b5bccffc428b6f4a2aab955e8aff29c1db72f5972371e139c85345fbf71bfad45ec99bf09e6f51f397cd606b9a2c2442976655d2e14538646bfdafdcdd8debecebad74dcf3456fba8609012f30bc757f14e3c4766dce8f981e2bbafdf825e2556adc51c082890b86c130ea070da64fdbb7a497aa31e9c1c9660f47734e6fd18fffb0393d271602483785adbc0140868d011a6796dbcb1d934a4e5acfd89612748cddd3f2217eef6aeb0e389aa53396571f8b69d2ac219ee6bc47c9e02be5ce5309575e1231c893e2b08f53baefeb796da6200fbcc8b2104f1b3b7a4691d977daae0657cd74bc76defc4c92f936cd37f16441daf87162d598371c512330d5ef08181b7e057b4a1789c7fbe0621f336bc8efc55f490439d04b2af63203ee22c62906ee456005ec89b3fdd4dcf807a16d43632f7a61876b8a5a4794aabbce7663a67536c41336bd3cc5f35b423fe3b8fad47426a36320d045bf0a893a92dfa4c9a2f1dd6179e90119ab11495fd949c2dc5691674e291b25da06cf9ba219110cd1309cd617812f5ff89b25cb4dbe898ba3b793a75d2720778837a4285e30aa5074a3bcd0762f17531c927ea89ac703b20258e5017eab60c350ba96c78e8d490c6695d4bb6f655e8aa1dd34e851d44d1f9e495619198f6931a110f19bc2136442c9faa01cbf114debb53fa9cd06872018041b13d978331aa0264d9a5d20973ca331b83de256749850ab5456848018fc4577ead18eb49704b8333c157511bf11a002f410b15f9e64376ff7419cd05300b302e15d1b1ea4a0a8326128207fc8bfeebfd66dd834cecb6db5a6c95a0995dcb4422d01861f6d72a48b53e255886f7434559d3d2550eb495d58170f5f7ab1d4b00de1f6d9363405746cf1cab15716c6223a7c20b86c2cb9d5516dceac61617dc1bcb788592192e5bd6e1b32dc6ed470c612a70f2ee224cf7833e748e781d4f895f7ba0c6f76cd39709f510cf9755bd57e65178b9f6cbcf2a8fff7fcb86187928a87a569ee4372bb334fb33cf41dbfde6d1afc855cd3e66df428e2f3f0160a576d14c5d1fe78b6a7d372d57e08a8542827fd7259944c046d766b021964ccbd6f9dee9ba2da545720893484fd44aa6693eb5ac1eef90b23951977d2f55395bb23245a120a1ace5019f85a1def88771d24887115f744f3fb3109dfe6bad5b339c99f1250524739abf6799f3748613c5230674261c07728f6c48e91a93210b133b36b06a48c180fbba4cd1034b2259f60c111ee1c1fe1751eacc8b346d19f990177ce39dcc265136a41f5ec7cb79c66c1287901bf38df2b3f3186b7469986d0648f2a5a63640e0022d244f855544489014c00000000000000007f89e5020000000074c9725952b56eb5de1016463d2ed0401deb9642d02997ce83a4cf6c6a37786300633c9801d3863d225515f8c5653ecabd027df3c4142029b931f4e92d4f396413ff1e0c9d5eb7ddd607621587373bd33e5894cbd3cc8cf736a581bb8948320b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f57d0e698ebc842e73937ec3d3da9ecb4337e56a959333e475f7aea72961d88bccb839c3e4297af5a1e9079a76932131ac45d8c13fb1d0f8858166bebe325cb3729f4ee882f7c0275fd1102684d7dfe3161dcf82e2e198fc60391378d5a8bdf3600114eddbd2231bd5dcabb483055f741c0310a50e78a487afd49d7b74116274021d9b609a88194db15a85530b8cbf08780d1a903717434b11c4b652a9ad59e96b03287eb3257723d1e7c007e54e4ef7b6419568ba0fb6bc26980a442ce302ca4eca0b024ffb3befa6ff4c86dd87355e33e2569d2854336041c84708f296e660a2552d3329159410602fb9d5f5182f3ad356ebeeee0d676511ed6ffcfb942221aac521020c124ff52ad38b73d3eea0f14ace82e018340175a8e16dbfd21df9444a9cc73a03148d8a6b0afba9a5d9356f2ee567cdfe6b44bc56dadecb1804e6e5639fcac43c0225acbdaf2e545019463d6acd0cc717929f29a07335bf4a1cd9f77f501083291d02148b7521250022d7a7138a86e88cd900e722e082a5119da3fe05349a079a114a032c16a44238cafd198d8fadc50eede847cfefb2f739f592688089f3cda94d7a1b556b66290c26220386a1bb2c0e647ca896b73c4767a4cf56ce92bbcdce91d7819e577241494d0d900544113f488209675db8799b7eacd842db8534342d6d4029b8e2d78565c8e10a2429fd397c5a7e0d2f66a58f6a72c6d38c846c86cb70b15af9d51f895d8a680d8d5da332203c5d71798f860cae38af8176ebba1b0726e761e741e39396f0e424be1e6dcaadad960dfb5f09be14b45cd2d53b3fd85bea2c9e1923fe25eb6fbeef920726f2d664ab2de21c8118789b6d8b6ba517b9644320b8da0eddab4f0ae88008f28856c327f9c911fa757d46c0ce3094ee59da5206b415b21a7064fe3cb2bf96872427d9128f37bceea58a7e28f2e163d73ff68b8c1de6b4c1f220b4e70616f8c996938b60ed38010bd2e5ee4b1c1ee26eb583c5fe8aab01f84c1d9f226aca5db2f6528e4a83d3768c0d8880a1d9f8d2021bde385ead54cf44f1556b57b18bb368c9ff2f3eda582610b0428d321376793a3a6c44028dc7027409aff7d56aa100591a240460fcd288804e1307ff5796c24e3e0d3c567fe2d39128381048b387968c0d22bbf770faaddcaaa1ace94a4bca2296a7f92e8ef51c3a269af79e00ded2f5d1990e340be85fcd1334c8b14b92dcca8b77f1efd3abe2eddc077dfa53bc5d96517a15215826b39f4ff3beb08288c12d3fd6d3d49f4c6ad9fdafa5d0d4cf999ab965da450672c7e0fcced8cd77eff3f239f17859a2c45a633db10e017db2fb75f77ae406327095367b1e519819d4b1ae2ccc7e2d07232245a985cb36ae8e41ee9ffe384109ffa7048fc4283b25ea18ba94ebfd98c41c61f6994bffbb694261dbd4ee046d6b287763f0def56a0ba65208c428182507f1d62c2072cd469a616cbfc0acc58896cedb9b984858ae66007e6319d806be65c1c3a8c241df701f1ed59eb78f0c9e4db0475c92fa8bf183287e102729f1fe146da2e08248438be977ab2ec4459e895f7b9afc76b9f5162cec1ff4d707704926a9aabf8193f9d97cfb7d455d642b471a9bf30abe2086276ff9efc9b2843b942713679c481c303428d20a9a264825f4a4c93ea1b7b50b5aa5c0e51da9f233983b5625d148ffb9c11c75765c76b2ef6e55fd2b7e4fbf6b86e47acac4f13d7f31d62f546a464ad8c4728afeed08acf0a3f04d919b0c639a1c13031094660e074162fad914f6e6d389d1a54a156d5970ded715c36eb0cce0a372e530d2e11bfaa9c3bb10e9a9d185d32085b678cf7f3248f2904fd982e41f156048014c9e7b11f0cea66a70f373bedb51c39e4f58ed6e8991665f97596f2d9d6d573fbc94eccecd2c2aa82ffda5646cd82c6fa9af35f17510d2b905b0f05dd4a6dedd4bfbbb6a8e70196ef0e1f08e576c04d054b3724ccc8e5bcd57e3e5818aa4a9d48be2be47b2aa8d15219fb09330463cf96ca10a455c50b66bf17474de857615ad1991e7928e2bbcbc0a7891957cc2f5023409e744daecd53a813cce6a127e97d4dddc39a89c9a4bc7e2689de90f81cda92215d62a9ea3b1887d7159d04791383690e2003d0f0aadeaa6fb0169a40b0adc76692d607480fc156901d9b039eb0efd5d713807880d758a1d3aee451fab5c795c2d0f9b517cb76bc8b147c1a15e813b05419757f20044b9226f85560cdd882b2f364c499cc969b1ff78379385003f910a97dc2c7fef84b13c3e3bbd58927edb6b3b59038d9ca84e77e812d0c11c5bab4aebecf9514268f7e844ea8f2e81c5c97235746710f440b26a74658707de955b0f11477f338ebce9e7d5ff5af0977ccf78625b9629c862ba74eb75b51d3d2f69cca8c5f242f0d2eb79a981c84f946200eecf86b29661c9590b", "ac", 3, 808115694, "40cb9b881ca8bbc92e379915694de2904dda67152d693c9313553c00d63a1584"], - ["030000807082c40302ce1f264bbca43b936096742e094b5cf9ad7ab9e6c4f3f60f0edd915442eaf467020000000651636a6a5100ffffffff5fdd280fe4132d290db1da92e6576fec26babc688f0be10a2fdc163c90cd04d10100000006650000516a639ea9a0be023dad0e01000000000553006a5265d0f29f0500000000026a63ee77393e0000000002000000000000000078118f00000000009e3a495b3b965b7b7f85b838e009da4a4f1f96e3b8f4b939cbe5679d1ed4628544aaabd1f77a58a716b8e269b422e74c7239f8555bc1e615f4b59c1dcfaaabdd765f8529f54454a54436d8611478fd3b9c07083230019fcfdb20799acc54346300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a9028a7c8206497168a2550fda71d48219577da6d6395dc0ece7c72b03fe09e97590d63f35b996a662fc2d0ce9c9133873fbb9682baa1035cb79b58295ff804ad0a1daea24e27485d632b221de683d526fa3690bd664900ecbaebe3fe14d4236f538e6519fa31f241f6a5bf71cf76d1204ede9fa5f1887927d2785096c4263d1021a87d1858dabedf12305c8df9cf8bee0184e60f579df03d7ecdcf09de6c2562e022c81a07919e0aacde64f28f73552b0b203d5b589b3c61e580ae28272a3767f1f0b073ce542968594b39a3fba107a45e0a62518376d1f94a720b73c79f25d4e9f2ab356a0e00d2e3a5506dedee0e31a056d7e92c3ec4c38ceb1bfa5f7a5e8620c1d022004f7a4b0be4212db7f9e3e71c179b20d18ea6c6fedbb089d27339b7f65544d021a3c68d5322360bae9f7c66429f48378d8bbbdbe682d09a5aa3fa6ace9f5e14a020a95eb696753617a21685795cd874fa3f105a5d0ffe6c9bcb1ff99347656ffa102305572386bebbcf7556703a40ee54e37832f45488e9f56a4b69ec84a76f6caa9022ae820042171c8c8659b206f5c12c61112220c6d215abd2a2ea04f28e6fa39649f5aab7cce29e51a8c24e7259c6192895482ba5a8503ad9395a9e5f1057e260adaa5653e4355d55e4af522f590dcf5ea27a8681f0a50499a451f253e742aea5a7ff06b7a51495081ecace3d43b1402bceb94864c52490293464da6d23c6e3c24b8f24210aa468403f472afc90d612394a74a9b196163c600f2de3a0b669554610c7405b44b4a85d8cd3d8174cbe7a1eb3dfe9a7a12a0aff290da025c97eae3fa7f776705a810888d69bf3c7e83f597580b8318283f477e0d2789f08e7f48f16bca2bf31285f10ab0eb446c1c74d82401c6dc1115d47ceaa4b6c130790c5631bbe5cefa7305842a48000e0f48152eb30299ab94053d0808aef1a9dc32e9461d3219d995ca02c643218405905fcd195fad72d6610e79bfe11c7893102bfa3679ba1a612849afada7d86c818255eb406cd394abdf85ab68583acadd1d269113231c097fb4991af0ca751f090bc426978b96288d216674c332266ad54c5e6bfbeff17a0786bca7e9531b9eec47a2509efe0fab1e414d6ef22b6af0db281aaa59215cb7f349ec72fe060b25407797a539d991690a536b17e009afb9472d5ea834ce53fe8fe0296b58d9646548c53f1a66b94eb01436c740bc970a9fa00e872b34b0fa09ef2867cfecb5d16a23ed2e0226054f27afbe22845121bae1039b456d167a864b947efa8001284ca54615ee98f7b467554addeee433ababf73c3e45db98b17796b5a4f519e8d32b4ba2a51639027969e6260025517698fcfa3b23d6b930bb8b6cec5d317e3ef6b16ea77053250060eaae986942a60a63bf0093db864764f14eb916b9b231a8cd25d6ea21ea9cc5550fce3512394f4b6b65796b7d8a74b15f15745db0ab0fbbe7c51105bc1c291e1f93dc1c58d728bd3c4aacf6eca16edb8e10575ea6a460d183eb34420f0f8a5efb45024330257803b08b41edd8390377002f01a3a6a91a93936e92be7cdcf82aedcaefe1f75447bc98417a2c7a7c1af322b0a4fd16bc9ec2d558d5bba96ff0906cd11bcaa8f9521207baea0434b1bc23a1781d4c64e8f88f8205eed2275f24679bf744ceb200f7178d35cdfd65334bec609e012dd3f7cc2b680228e4c3ba535e92b45dd3ad1bf6f9fbe9e23b6b27394a3f0191b1d643ee1085a50c5d1e514f9c0eb8c97b9299d60ca9954133dbb4bfbd2270a68e43a83af9698af5b67f743f27a2683d089e8cd6a4d12dc650ce7383ccdb92708f4a57bcde4218c6b26172dd92cf9909e43fc86339f92c25ebf1485871146999ddd8caf16e92925f4b8ee55b185be786e468721b393f9576b92fa3a71e65857810314091b27cb09a592e9b9e872f6ef68c2d37218cfd0333d6900fba6e167e52f2df0b6371d54f8f1d88878f4c152d1ce30c88ad1adb314c662b096c0dba00faed0897456d6f08f241a7b0f098c5f34fdfc7eaaea190efb3273ae3e42c04fe0d59d389c80a5eaf9c6c7732fdaf5ac6992f92d4d915921c0cf7de653795f8ff6931ced698dc8042ddc4a30a0af22f0fe865c560cb5bad421d5f8bdbef10693eaf702f263aff284c02d1d88e1316181dc90cc294239d57b115cf2e15643faeee51e8df5de87d8810b9ac2bb078dcdda36e30e9d14f90bf8a278f94cd9ee4ccdf1c5b7dd31e42684adc98fd6c3439c7b2cb62846a367c5dcec1b9be438e2cc060636e8a591f37852bd1bfdc7ae3dea816b5480000000000000000cdc2b2030000000055c3667ebd73650fb16288d6a30cf9c663b6ded424e33810ff00bd99f8b002070e7e29118d93d2adcf366528a8fb9f7df2a06c8d6fcb0c5377a83f11556445030fa6d901637f3d6c610e4819e60056b5f9dc23bee8db464f06429c3dca5694e900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a5026560d9f357e46ae4b0f9414863f4315c47cc7c1939774babe2fcaf92a76927477f159c958ab5d50391efa60b6a0cc8bf36ca384900befceb8e2049ac3ee1dd87a90e38abe476478e8bbfb2b3b843294d1f939097dcd93d1777ce1fab362b2422bdb64e2fcb5662e4bdd1ebfcdcbf43bbb551cd3b693ae879b6fea1e9af680209b240086a4a008def64f56ff9208e6e14297bc69988a1e57cd10c8518a6e674020bbc5760aa425af5bdd22832302d886b25afc57ddffd816ba691a6ff727cad6d0b0478c1e4a9fea5682b48a60dbe53d4a0a21a4ed7fe92cd63cedaffa23be1efdf0a2d6c5b8a16bdcdf6960aea468f39b3e3c4499564a002f7308f72ad892be0df03274ee85450223a0f042750a4a980d985ed63338cc817774d5cbd1b9c3e331b59032813cd74ffa66994f0f82f9fad74e7400f4acbb14db385e25107ba824048fd2103283e4ecf3d0c46044ce84fe79366f4af9b9a557c6cf18c032c4e151a457d4e68021a4814d04b1075f61e692917f23b2c6141cb254e246e70ce461c8ff71324f69e030094b4c12208131d8649e838c7103a5458f9f7fcb3f6501601d57cfd88e151d1496797ae104c38bc10017bb5efb6577e1088eee541d6adf5d4a4a7dbb2b5b84dcc2a4e6a1074cccec6188c3d415a510e5b09a3648c121b022ab0957876600ac837261b7320e63ee01e248eddee09f32fbf1826f7195b5b0598b9547178f3925759ab243cd7a379d6a785ec908f7b5fba3cd4c755e5e81121e88bd9b5e490dd15eeb9c5842381655315895d37d94093eee0bbd8850eda9da550fbb6ef0f5a4a532d0f48f4deb730a71678872fba8e3eaf06ba198a7d51fe805e978dceabf7b6f5896f399c25d50d50dc6caae04a5df8edc8eb5216f838e570db567d704c5cd28c1e241adad9acea3c6f3fcb511869cdf272cd04148f89ef0f533467f52c4bed975194d32481f569caef9728a93e23e1c708a7b2e286b5e53b136fc2b8f54fc53b6da0bb07f9d8e78c9ee28bac8014bc17a8b388fce3685c0f8fc030d4b30aa35f4139554568cd8a154e8baf3f0d12b52e57f1d49b9f11970ff4b56a3c33958794af6ddb594395bbac4d73c4bd658852971df279434d7f2ff72a8f0a0ea5b94033ceb640ad76dfae5043bdaab94971af03a5326edecdd052358b64b85b6a41c2bb8acb83807a6b2b7e13567348bf223ae8fc3fd6cb264cc70c3248c3a09e77a1c2942c94168ccf72443ea2ef797a388e30e7f3dbeaa66ca43430f81d3d11f3f555d747b476cd0b8a4dc0581ff7f9c0a20d791520ce90eb39237425e486018389e71f7994a930306caf6ab8c73eb8b7d567ba5a32ca7da08841796729bdb6f9394a462b37357e737715f320bffa846f130b3f5e2c3d3f34919354ce81e3092d9e1b7125f50ebadda1f569f1014ab38413335ff223134ccd9c2e825bac1a57825d7e8a4bd736543a413b927bff2671050384628dbdeb7456f029a9df5d1b82f1e04dca4b7b9c42ee24a5d4dfa23a15473c4e9845e7b9bb8f8d9e7520c5e35ca0a9cdaddb2d087061a22ecf7065bcfecd5e46350a8756c60f61e4df149810ab5b31baf7b003627d36f194032da73ac912353f1a29f1b8b8c4154576464764fc798fa0561f65beab75acaedc3b8ee95df2b65ee15412bdb24c5434af41e2dcd4b4893cb4a384a012633f8c33d3de503593f386842a81e4c155383050d2a75c5e02e4088963a44f014c45ade36d980a59dae8ae6a27bc9c61b12027ba66bfbf928c42ced8b9fb73da139d48d5ab96732e4835ccf49c2064559101b44f007d5bd915a47731921be198c4844d3a7c10a78211b1ce37c6e67b0a2cb53854caa95b9d6aa6b311e3d1c27c426fa66cece53cbec38d9adc4f06ff27b55c9b41d45db870d6b6abbff763dd7df20d00e36c2f9b72b87422dd3ac4a7e931df237437e546e3ab4c621ba1283b70f2ea4fe6d2744fa74980da735cbc88a4ebe7e10c4e98d3a711aee39313696f7029a6624e87314829a55638471eb12ee97f430bc5202669efc2446148d04b88a2445c5806d2364655e81af3f06252898db76bae8df5addffd166c43b69fb17cfe9af9726823dec95e8bd7474e663ef41d496766cd96a42a5f9debf368565ba6b5099be5cfb6577b086fc5702da90273633184d5477a53bc1c6a7a77789fe4313b4433a87a38fbdbc40e00042b0a289144610d3d66800e063f188becb23a70e7f930fc6f7ed9626b5c4a1b182d83638fd22100fd99a666df5623577c97c71e469f48cd7484e56d415e3b1882490304cdedfa7817140a62177b44ab3ece84ba2e75949a8cd25295605a3fa241fbdec38cb2f5a1cfb783cf3a19121732bcd2dd6809da21ad7231352f8f6fef7fafa5b58c1837a56759e93479a72e8f10a3218b4924f5327e4559897a3e2d4efead08", "526365", 0, 871267564, "07d62fb3eac6a45573046ecc74004ea3f3704e1305ae5d7e22738044d7f59601"], - ["030000807082c40303a0736fa57dd5ada504ef8033282ec3b21683d9a11bfb886e387d0f9a7b1bf0ac0100000005656a53ac6a41a1394d26deb5408eb96aa381248be154e70e659b5190fdafd2a22acd252c824d3a8d07010000000763655153005165fb5b9f62cfb084b4a526f7bc45c93109aa0b53f948b85ee875ea4a4dca2e25169af1c80703000000066a63ac536363eef02b1b036f9fd1010000000004ac526500fe5ee10400000000096553ac6a00ac6a6351589fd703000000000025af1a3000000000014e9b160200000000000000000000000086047b91e65a8b5e9d7f2414656e45ae4930a3fb26fe46f472c4fbdcfc5e227ca08037d6e7ff9b61c4d7c6f3c56245a0281f817ebaf29f3d926e91688bb483080f6aed85e8092b18eeb345a2dfca80c3f93d8774f39ca73cfd38d7e8b4dcd9b900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000743f852ccb10ffcf8337f5cf35894c868bac2cea782e0d11d2283779f71a48b2224a5bee71369c97108225ddfcae5f777b8e446bb84b9e0573bc06a315bb6b029f051e13f643e7c1a12744d98ac59214bff151f56c1415d6cb55fefc411b4193920345ed145fba66d5dae2925c34fa11f3277092a810f8de076e4c9af17df54a032ad37351d0ba111de9517a1b9ffacf9978d09439fd1a89bd727bfc46d04990cf02182371b5a8f2919f979e01927a76e5805f4e98572cf0e93689105b8316eb6db80b080784174d7f71e860ca98b61aba8f6aca9641d031a34ba57ec6e9f564bda3bf1067ac8c1f0a80401c0af8dc69236bc1aef10e5a63a97d066b9a5b2179112d420321b8649028da0256a84f5f4d81c9082ed9a2c5c218964f4dbc9e0dd41c5f19a6032cd4020c0d583e91fc80b95c4743efdc69a929d0bed6a477739e0b879fa4a39503295299f6f2315e04e3b57d86afdb8afb9df629075475727df895b5e8f40d6c6d0202cc298561a6e1214671ace81c8991f233acaca9a8302d43d54a79a1f35285a0022296b9ae39664407853e319c85aca49c5e4866ee35c51b4153b2e0460e4b1e0a9f801c2dc62c17bcf3bcbc46146d74b86073f4f3ac8008354dfcefaf041d9caa9eac58f938b0cbd255e8fb3a281232d62fd3362ecad6bca560fa5792420a7d5e3b2c58bf79d2bbf7ebdff418ad9d4ba6e033a0a9f2fb52190c5abfbc6c87647e64064c29110883acc5289029417608d880c8dbd6eb4eadb9d63789d6baec4060f291b7812605405155ec820330f1cdb061d58fb14fcd6ac9d03646ff129d2c455da0cd807afdbb1a343a8753b0b28f010ba97f2251d25632414cfeca28fb89d7baec974927e9be1be6912427792d2ba3fbacb7862bcc184d2c791d0b3b5d1b3730474c4166cdc68709bed5c6eb4226d1ea4de38a400869cbab79eb3f3321fcbf8f09ac6a2ec1634bca9de61d1b96184ccb33dadea6d0b4a4357da57211957f2300a940a92b1c77b539bd373b127cb03162a64ec404d11b010b4bbeb9e4ce701a37f30f9b730cf01b1b364e6768015439e70c00e7871f359f7f5715739fa079c56b39a1d49dff4d771e7ac12de5acda6171dd35a029fd0b213947655740645d4718fd72af0fe57931852b5b399d0fd52021fde561782dbf594ee79ebb995d1e4e38a8263095201ae3a7f31f86dd9243db2f9ddd04b9a8d4b265ba8a21f48011de2b4258112afffd12c7d25fa9556b70becf0dea844f14b034eb7f44cbc13bc61fc8421aee1f11b824fad8259f3085abcaf72998b42a7de149727f6623f951ce0fa5bdd370bec6918bd9a12e8a8109327897c3ca6ee97e5c0913aec13216ccc20d06e9f3b53f0f73aba01c94648cf94de90b5ec172f2ee6a54b7c981934057e8bcd3e19934556d4c4c17386e925103ba64397f53cbdf797ca4be11b83872187c2d55b03b5db6f03f6b686bbd44ee906879bbd6f805b79de1658dcfe7b10e74528fab8f607d5e5493172401fe416b1caa2252954fb1c5d987330606c469e093538688e9f54469b319f3578ad3103c9c23e7b28fb23927285da9a2855ec1543bad015bc012c0d92b3ad564eb4b3977bcfeedc46733d6443625eab998f40453c568793072a8992a82170bf8b79be14bfaa98706cb6c9b4d05c1d20f6385c0428b9ad0019a44741b62dbb5283f0805b0602f435529d7875db1cbac71aaa7c292bc700b25eb92f2769eb3ba63a4e88b19b9d9a9a7516a1b9e026fb210d6d69c3a05cd5e78956f1e9a81cecb0a63f68dbf78e3b4e40de1debca0f02db961624976102c60312dea1ed2689d3269714fef0620671446bbd4df94895b0e32dab6ca7e34548c8fdce3fe02dc42027c0a9d31f2ca1c9184a28dbb84a18f8efc11b3164e705bae29dcb9a5b3db7699218bfb3b3b43ada679a24295f80ffc1dd245f15e52c6b1fe6279a642ef4c2217c11640bde6beaa32e97d739b00d4ec319c8f99b51ab6a9dff18e401940660647b03d6b73566f0e9dda2e3dbab0e4b884929e7c875e4febd486f0010da7280d2ec94a161d9c2992ae2846efb96e695df7a35328881e7f8a3ece7672d5180369be673c6ef9698ea286962d49c5549ba87a4a70b7761ac0aeb25c0af40fc15c7a3583a1beedce31eedf0af44ef963fb000721fdf9886752e00c6733809eab1c62ba7e1ae8c2c9737e4043b2e9ea2f6fe5f9330bbca3bb935356529c3e8f30f74609d18cc6edbbf72edeb362d3aa3b89ac2f57ccc47b78e56390f5ca7f794d29ecb4e011b6b44fa446b004b3daab8da91a426e02baec7eefeb5b6b9f7a5964da9985dd9d998abd000a378ae40e4afcf3da617ad9fabf47ae2e15188ee267bee3dea7018413d341f6069ff82f26b07fdba18125e508a764d190cb7f0ada81dedbcb0045a14c6f843753fae00c", "51ac0065", 2, 1230493620, "464c5cd474bc3f99b6c212f925167a926bb7c47bb8415b4f12a5e61430b1e3ef"], - ["030000807082c40301cc8e5b476c1ea66a372f9e0756a581fcb5ac167a1d4a770903365705f550503a02000000026a65ffffffff02d1066703000000000352535312daf20400000000026365c8e694cc54dce80f00", "ac65", 0, -750754052, "771d258f19a8002e7943de99bab283260800d5ca962d1a0e04923ae49606ba8a"], - ["97710a4f029afb2bb01df350b75400ab11759e4dd8a29da11f2a3924b0586d2cfcdb556c7c02000000025263ffffffffef2e83f2a7bf6bd9a3b7f3e9f53b657a3edd2f9cd0ad5a1241371dcd6e3be63d0200000003635252c91c078803753c350300000000026a53169ad90500000000066a5151635300aab9700500000000060052526563520000000000", "630052656352", 1, -1910805984, "253a7539cd6c931424344b1306f3d9ac4c6b8b8ff03cb7537787a3033a147f9f"], - ["030000807082c40303a86787627e86d55c22344c2fea4c46f42cfb2e6ea29b18d6be94d82bd481c4560300000007636a0065ac536a57cc15126aee9e6e4339bc09580a9ea00f4c7b6a5eb0e7a9f697df2335e72e6c856674d902000000045351ac527029df2dcd9a8084b66368ad69f53bdc0d9b576bb2b04f6a4827a05dc3fd7d2a00b876a30000000008535200ac535263636b93c2dd044d5922040000000009006a5251656a0065516d7aa30000000000055300005352cd7e8a040000000003655165971e830400000000075263635151535100000000face3c24010000000000000000542a460400000000aaf55f31546c6b2e41ac7e6fca70563ac267ed8dac780023a00c6da0f2aa211ebe2acc0320b87fd040635cb7ab33f9aae1c2d7a1cf5be1a13de6f4939016c789c428a3eee78bb6e178cd7287c479de17effab2c44684ccf695b96fcf26bebfd500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa46299e471a3e6a9d993650b35724c686e2035d53b5360a73f56695c7b0ebeb11ac6cc89fa4a317d047ab74c52cf2248d49474caeb84e7ec18d9418cda100d7dccfd7174cdf25ee1aafda7b204c389878bb6736804db1b171a4a74cfd2c390d9f69fd2451ec496451574562f87ede44eb1a5290aeb7469c0a8f2e2fb00c3702032b6c7a4fe43ba50651c05aa506ae928d10de92a487fc3ea9bdcf112923806e940319cb933ef931fe211f8c9d5b7711e9f2c37ddd724a51664b8bb520589c5d02930b07dc3fbccb80632b63bd77326819592e9091a129d40480c84171fc57e9b553032c0c8d1b1e27f8ab907884d2daa3d1da97bf4c571192597667f81566728e5d840211e336b2d4ec6bf70767c12232d6ce3a629cd15b58317af6b7bb85b452c5662e0224edd0b179151bdbe89e9133e0e597a3d9ca3f1185e23bad7e004a29528a7ad8031a4a33105df81a5d07b00924e4641c3292c754b204a0908f844cacebf9c3e168031428bc19c61ad2b3f1278349e15536320088fab8eb50036cbf3d432716321894021ed3683057b28147b0fcb6f0db0e62399ad1c91d2e551e8f01fdb76b3f3731d33c1eda04c228d015c89e1604138e75b2f0fadc51e6d3bc5b9b55b6434065421a20b834e24dbca2b18a7bb1a11e994beee97deaae086fd0060831ce6a0336cfbbdfc42bdbc1112dbafe943591bf69d41f14a5835673403aab23a80a6a9726bbb26515bb06b10e6d09d0a38ceb806ee9424e2d03f8649add218bcf8a87f47471663f8cbd99fe851cb9ad0ad69c73e05defe89cf0d9a1c36e82d4666f3d37d5eb62312766b28a759fc66c5a4e44bfeb06d13cfe0796f3dd40328d5de1179d1a7748791e1b62aee44379212b34ec2b1384ab0cbb9440e31e5782c4424ed1a280ab14cce1ef559662a9f498af361fe857d7193257dde723bc44c33586125fa36b33ad1f60e34ca1923aa08e78403a229935029107e5f3c8b48e32e815d2e2f8f4bed3d70625505723c55cc2b45b93302d8533c1f951e38d2fdf7541f3b23388c9efb4aa63b1ae2cf316ba4d9288bbd0f43b897fde516cf1d387b4267aec139fc3bd744944de5dbf6b61932c35f54d34bcb0f417006206425ebb500fb9a3f66d0e035b76b047fd9632ca5ea33c6bae7c92c015193fdb771a949c182d417979f6b7d49b9b25e95acb324b58151cffe5ded71dccb6154f063a61a2fb917eeab80d21e039f2215710398367ef6f83e1e176ef98058110850d0a627f4fe3506249cc3afc2b3e937f86d76f10ba063ea92d5cbefed994278e89de4f8c5cb18bf6db431454dbd1196222bce1496514e1e428daa0778f1eb28d58c730a2ea4c982ca7399a342cc8b467a29ad901678368d5cbb2d3cc440bc24b451519baa0376f845ee026939416f6e7d152a88e8533fd70f3f9d88eaa547439cd95c52d5d3cad38a7663b7ecef542d5d9af80c2fe11197962a21a03e7ac5d0433ede3fb6984a3421e3eafa049973fc2c13f059aaba5fe7a63a3219b13228e6ebc3e5c1f362bad51707c5ab1c40eef1172b69b7c73062b7f82bf022d7fbff35124f5a862c9f55d1602731b8b608747d0f5f903c10f801d297b6098e4403bda3c9dd325d6d1188e4507f8c8c4cdd219d1a2b078f08a7c00924a3be5ee26760a368a60c4a0c70fa32d8a85a02cdd188ff56632a88a7123eaf02cd47220d45bef9ae9d236174818525dff79185c9b79d7a6081dd97f2e8c515a281b6b298ddc30a1c3d26f4b51e8d94367bcc8ab884231d45f81994dbacb67b1e9ae98dff9a24d08ea3c74d34738b8611ebbc729bdcfc192075753aae60c1f2a5f451eff9c62a07fd0a5286bdf6cb1d20aa4cb19f31e6c198bf1a45c01b0c31cbcf98b60b5afdc65324f304c514f7fa31ee6fcfe41f542059b668e31dcd980cde4af853d536412beefcd82aafed51a1f7947bc66a4045927afdc43dcdfceb34938642f23bee5d81738e9e87497e3b68a175506487b12233d88a92e4d3cf6518e9a33b3e708a1a7e93a8c8cc00f4d69ea73b207b0d52793f6930655da8ff54b9a97574cb94bb01e05543f421dd7f2fcded5d8098ee57693ffa92db0f3400c250165e7740227bbc540b4331a028fe721b73851c3c11096256c487b858e2104619fea6379acf541badcf3c41f55e857c0ca4025aff243d944add65a07101b909de8fb27adcb279897c4643c0b6155ae9067ce73fc5b35d836a5642ecaf20de468b6630f0c748fa3415c981cb1ca1add98040d33ec691eae9b5ca0369a719502d5ecbe323ad755c2ee1646235eeb248b91b78023ef379713a0d04a02fc0d825d16d408aa70a6d443b0f7cd8b2776af466ef4b191480bff4a9170e2cf02d1aa402ffc776986c6fa23bd1e3c598daa2bfa8940c0e43fb89d8a5eda755185f976e1a2b06b4f8f54071f0d", "ac", 0, -1010377713, "e1a9e380389130701ab0c15884ebd55cf80e0a73fe75efacfedc727d9046d260"], - ["030000807082c403012fc7dca3ef5bac44bf19063e865b8806a12e70c13554b8bb07102bdc637748aa01000000070063535253636affffffff036089010000000000086a6a53636a520052d8599e000000000007ac516352006353875762010000000007005152536500510000000000000000020000000000000000ccae790300000000bf02c6cd42018075a9da9b0de495188bd46bea45db2287ec0f95106826dc225042ce4da7fe2a5e07d493396437062ca747dd18a6f83778be78e535b002eb2e0f57dcd594b0159a6aeebe15fb4338209e5dc352e0697e7eb3a03f64b4071fa45d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040841e98b307a2b72b0d2b35231ba68cdcad7cdc1785ea9cec54f82dfcce84f3b15b8cc887eed23f96ee81a3ff54915dbc3289e0c7c06ed58403a7de9cc4680917f8797b2521232bd9c9c9738e9949b16c52e6e7b4669fa6cebbf25cc76a292ba732f38165e53ddefd92fe15685db0053c7e49b85f2d3b7ae86db41763a43e1302270282aec190c46c02b75b43423ba24fb1debddc3c0a4b52c75300cf796309190215990788a509624cf7ff02a884dba6e35c0f49cd72f8e6f828c75c54e47636180b03d8fe206d739f12cac6b28c1b01811f957faf06a424d1c38d3f571b2af0113dfba2242094cdde527d13629e3575881c905f0be5ec56aa8efd8cda5657bdcbfe0327c2108df5d33c3fd01fab82ebd2c6c26a93ba42d2ad1ff9e9775c0cc70d215e0315807849d9909cb62f3eb74a6c221b6137e0ebe000044640a0d8ca9831f5395b022275b2cdbc8ed08277480a50d8a6ac3fe67f06b1167514b9678fac77cbb884a30309334944afaafdeb7af8d2decb3db991ab7a1731d0fbb4ad808189fc6de48dea030d50b304fbd40b34a014ec2f985c212803e608ac93c4a6ee0b5eae152f3ec1cae9a9a8fac6c1fdcfac6a4d1d3553ca4d985bc8324f77f7e16763aa391d697af101f1735e64cca95cce6076c965ff380e88206bc4bf46399058a4626910634627a6404fe1ccc395a0b534a1b5bf824761af14e5949e9aee12ddea0713d217d7489f1dad5646337ade84324585877011703871d4ce85e36a4507406d9c86f69dec23ccd5936c0bee262b1bc0461722e020367f1a8607d01a56e3927343ec083da27fc6b001403ea82b7641707f2e754892a2a5aa7c1258622208cd077c2048211a413b94d5bbe78b2011c9f7668aa3df1e66499c0892962f856a3efe2e1b27412d636fe413cf9c916ed5485664ee8ee6fd480a647ae9bb5d2e71cf8d6201d502dff9cecd6f9a3344118c70417670cde1e3d019bce0dc5efe67a84f52d25c6534ce8b5297df9ca40212cc9692188fb297761447676bb2c2a3859be27370fd4274477cd63a0663eff50e28bda83f73c892a75de4a9c005db2f30d18d687d22e7d642f12219ee1147d0b13eaa8d8885d7421c3d0bf5cea2f30e74ffd2fd5039bf068ebf16135543b937cfacf5d068a5c69866e4ef6b09cc9d293857fcc96494e1cb26a2dc2a5f7b43e279487debbd53c7927a357faa82ce8e9e84ba5108f838065a4010b0513b83b40c31cfcbbc47daa834cc4d85cf685cb13129feec2debcac227795d71365560c6f9320503afd46d1d2f487fdd0f51ba6a284b63cc2a027fb807c8e2f53570b8242c7da5e2b5dcc7bc38a5fca8d2c42272f893b9d9c6154af682e98124a22e1e6a9c2c98ea399775b86474125c863e474967f31c4f0c0040702fd2792173cbe2fad0cc72cfc2fe0791cdb3c6744cf7577c1959391d8a4e30dca925d4fd979f04b48d62d1245235be7ba6ea2bbddeb9b872943cd8f0952478e493414196642c6a3f8a92b0d8d562de8a411637a0bac6de0a24436dab131517a7a87bd8c1c62e6efe9b99820b3084cd578595a13439976f3f67d920f5a08c9a022d4e5e91aa0101b48fedc8587c3115e024158a706f9cdd701a7a7729714c813ddd31ea93e3c87ee642d6bdaef7d4823ea91c8cf58b364d373dcec48111a8ad2ed70a6dd2d6686e976e1913784f0e224be398900a65dc8f64cc393276a86334b59605acf8e90af92fb7910a5947aee54b41354b666c1f68870185d5cde873f878456e5432f4a60ba132b43e08288963ecdfa87fec825200204f1a55d372884ec8a2622700dc1b6bdac91274bb445cdd3128c107706aa6af2cc6a28d7b0f5641f82a75bfa90e99c02f05e24540d3c213f1cda80b82abe69b1192cc92d2837a9f71bd3eb7d2f583e7eee1691ddfd1343fa9c86a62175dcfdc34ee77c8c55f87822ea975c9604929d080bbcd5ef3f7c4dea0c25f1b18f8303497cfee6fd4fe3570e5423c727d6074deb3ad58f4f9e1b6687565a1189b8df98a37f8a1ebbfb4b7d9290399eae578f59d43bd9e31a4305ee528c7c6f8fdfda1831562f7b668fd27a8d484f91b9956cef844492ddacab01420640acb8feb90526880dcde4bdd6fbb4e22587e58f00aa42daa005d66e8aabea30523b698ee4940954191467e5990567d2a18f747a14ddca23ac67c600e5d156e8188b9e4197c8d387b0f76358b7005e448b639dc78544c9266825562199be3bbdbbbcc10b8eccb923088cebcfd83db57a055c6cbb5326e3c8d9ae921a9a8c88926efb6ac190000000000000000c0204a02000000009a08418bdb593e2764fef9c6025fd5fc76c51e146bd2ff32506d3214071a5ad3065e8c798bdb144a7b29d0acf4334c45f264a58ff427937e7ff7883b342a64b0a9cf3a629a1d0c48906ba8ead8d5ae4f1e1bee33d1fe03cddbdc44d8ad866c120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006c1901ef622e731bec2555c170ac42fd5af85935c954deee1029f97d1ca447504a625c657ed81372d9e3ca61f02ef7ed6505c0222f096d37daf26b4cd8c119f6ca15c3bd7e0e85b71e219b993e67a59f5853deef0ebb0a4ffaede7726fc16c9a27ec6e3c599111e946d8ffa34a54071429835b41e1c3cdea177d2a09fdeb4a7020c6eb6e2bb1ca51063999ebb6cb8b0c5a9a6ef36c72c7f784ba38d2cafa90da1030bbd15d6e5f273768eb0217818434d4154336c0497ca2bcc3df427ab4a5fc6840a04e2e422f2b2b36e87be0aee1c806b537e7e295012241dad9fa9a94cb7b7dfcf5a7d4d4a3e6c178e7d716d5e22a3316a99ba8efb65d1438d87f52c8b7333497c0209fbdf8ca9d0d46f53a09ce47d474341fd9777bb7bf2cd1fa299a11f8643b3580316958ef5dfab8b0f1d002e3a2593ac2298b122be6fc7005a859e13ae51ade3a1020dfddd4085c8975af7656d51330e568a4e43fb3f1496c4e75eb884f2c9c01a9c02137f7d0b97e6e0eed45e90aa22af81e6485ea3e0a9799070b6f93840818e23cd03136ee94224ed82b9ea623e23c260c3a454e0d963cfafcbe8cb45f89cf8cfb40b333944e893b8b64ed76d28544ab098abdb66384a24af39b1d6c5c603a0db3ed868a4d40aba2f7f0b3f4b937ebdc617bb770578b33e55c38fa396fef85579d5489533a368b5239d750658063fd5b3be6d0e1cd0386a1f5e0c64e41b2d0c497c38aeea1c44a9cb6de0b35e131c220b948625ea01c0c01ab74a31f925bee1396315135bd107053f863d28b71d58c2ef35deee9635a52661f1efafaf52f14911df11239355cae749be8fdf46e505d5783e6668aae5aa371e8686153869d3921732c6fd48a39222b22acd0fce2dcdfa30ca08519968558186b136e8e20249c648aaf0695ad72a0e57e913fb8b7ad8b8e845326314b2709b34ac8e98fdf08d26b106f1f2a6f7f5d006d4af0920bc45d7864ad15677593650cd1a7755bda718224712c9d2e5e7906923c6cd4458e41e7b8eeb0f0e398aea61bf6a165be50de6c46cf67071c951316e1106f8b39fe9c893d5f267134823349fb8ce918e5d47db57525c50cf67e79b2f1ea26b4b2045d30a188022867c2c11af05a173c63ce828f0427ab6ede852077fa7d2338df9a8858c7c076bc4324e0f2eb1b37003d1274a1dcf4fb39c8f5b3912833026883f50606cf4b10476fa334811affa005b12195eea3551707ba4b4578771d24f8afcc6a0a692f61c71b1dec879f2c9c5f0c1cc3e8d9bcec4bc0d78d2066d06bcbd23a22889a4f9f6aded5c5e6e87d6fbc8573c3335ec386f3307bea085e854e665e9de3759aafd604e2d1e64e771b9fc6b6f592023951faad7bd10789889f320c31e76db1f54ccafa8a0b71b5be6d180d86e0502859d162e19b5b813aeb651cbdb0260ca5cafc90f6ab7572800b904522fdae5504144a87aee577f5306465b1d31cee8f01037c885e80c70746f2647a8f476947e343905c43a6ecfc16362f18b42ac9f748689df53a1110ddb643aa690a062bad268e8a29901b1cf755a0bc5ae498dc3ee136aa6d58c254e3107e8a5290fe0a2a36b619f300f0be72cf387d24255bd2de1e7861f8a01995652206b9c537cc8fc8660b8fb63d4d8f4dcd5d9eddd272cc2b59b6c4b43afc882ee9c338c1f9f3c3a2d8115b41e72e9484d8fae60281e02169c218951513176b069d0b61269545d51fe17b1007f642f136295dd94884d43e3b3d4534496175d2f67f90cfb208fae98a105bb3850b71b16e400c3af1b49798c113455b7b25e3af114441e2c27a4414779ebb0f99726b76878486477cc9f58817867e2e3d050ce1e49c702ed691494216b5f5a9189fecabb70d402de2c601fa684b134b3fafc4c9e59d3b005abaa44f3820d8203abf69ecbf8f1fab606f662e6d036bcb9155e6fd7cfb1edf2a6c97681df755236dd77e1d752b477a4aabfce985fbb95bb6bd1f3b0ce346ccc67b6cd0f48642c6f8dd2adf99e749e266d4c1f6cb7e5a870504396152ff1be2df9bd2672bc18d591ff40bd69648f852012c9f27e89eacb008feb60548fdfbf56818b690221cd987df37888ecdd32741f73a13526d600f191d28d5bce097db9e9b7619c78a5419cf1aeb5ee96e55030933c4ce3ce4d4a8efe6bd8f0d932b787bcc9cec0f090fcd3fb2e095b648dcaf90a815d0e604f07532ceca1c1b5354c22a01f23f0feabb7f2d22252b5db21d2375317cfcbd33896d30e804b28f22c4830f2fb7cb1637c2509c1125604d7465b66d07f5d9ecb4abdc5bd702d09fb66d4a3891f0f35326c4afb87a913b832436b9d58391395a2db1572981118e973d52d831e6c356a3cd7c80dcb54c2235c625c93a4fe3d474aa7a5407a5fb3724df607b0859bebd854e0502909331744f11b9cafe4c291aa16d7f601a334f903", "6a0053", 0, -1172486978, "02cc5a6441d23df3130a6ad385d68b80c367b537d1679b8e44404b742263fb74"], - ["974c5b160116299a967005a2dfb9b2f55754031d49187263f8c2f4fe21485bf09ac07f5a850100000008ac52630000655152ffffffff047cf650050000000008520000006300525187a00b0400000000076365516365526ab5559c0300000000003b109d0500000000020053adc9643a030000000000000000b16b250000000000aadcc73fa8892abe5e1a9ed09ac9ac444636cd5fa0663822aebe82f89a8dca3c94035e98ee976651fcf4a0467378606ed7c3f88a6512e2398dd1a51036865ed54ed330797b7f00b6eb642ea2d8f7fd2c7a2752b9a386cd93600420d3e4c78817000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f4e0fae68d640efeb18cf5313e2e8eaf9e12842a2ce406c8f4033e70a32a2c017a567e4af7918ab6b39a0d90f729fe0303725e7bc7282e3ccc1096c303fd98cc8609775d7fd4f42cf3f0fb07f622e0e628ff1654b524fb7ecb1b981e46a86332bb88918841dc7e7c26a7452e34fc04e89c996a3995c113da76c4595ef9427ae021c1a0c6117dbb022908e044238d578f25915df1acf7797870d03025e76e5f2df032340551f431e0fed86e42b0c890d2810d18f3a354fb678dbaf5fd1877b5215240b0227032bbc7d7e80a4807d36567edf3748972c5b5f0aabe404d9c8902db6b02ae84fc8a1bb4a679c5198d4d9957bdaf41aaf79821dfb3ca1a5c882fd1c7a669802013983d1b7fb1358a0121967b15a33d22bddbdf74b5b99476e6d47df8a8babe803181664cbd6e170dd8679c74f2a42c25a1b3232dae860b12c60601105788144920224303e1543a2792c7a57756caa8bc6b4304358b3a8cd78cac1b1cda695c746040317b7ad960d21e3e5090d91800c5f6a5fe023984e261f771c2c421337b4e6ad27031e38933a38447b2c64e20b836904ed2ccb3f34ce139d3adbc720627e2be6bd90392edb1af8b64c54200ad511f0b3130f813c6dacc349761c4f2d7c8e47bd680137cb4867b6cd9f466918f3c549cf88ab84dcb0afbe103ee60a3176dafaa8e55a1685f6ce0361e98de165aa828891d2285bfbb2ae7b2a879b10927a751ba96ff13600c88bf1663f5387256c66456b1dc2411591a93c3eb4cad51d3166df5cce58339172b8cfb13dab832b0633ac5c4ad362a81d69013ef13da18f7188c02a2c395ab0c4eccf31f44f6a67e6443f49da16444411531af0007bde53d05c1ce08f3d69fbf32b140b804184739f366687b795662fe7b69e2913001d59c291eb7635745e84a8582626f4c2231dcac4ffe923527924a34dade3eeecd4e8e5a9000fcd32671a482413e709e177fa351dfcd97d679ec433169180e91d7d00308a4790450316310473e723c7d94ac1848a917eef96a42611fe2fae1947e3b72e0113e2df8cba51777f068266916955286114e8d6258cee02e3530ed42c483964b9681adc8b6fea847fc8c863d22381907f6f69a4fa400016154de7814c234883405ddf59fd1dd2f85b05a6d0d0a7c17adfbe142495f5dbe93c74df25544425cbc42d450c4693f92c7cd6f4075c5a104bb1ee76aa31c1a05d0ab964fb9c07e842b6442146f436bb3b26908fb523a77bb7c835ee857602e9311f64c8c93abe51b3c3ee564d37a1ed25394237b5c6e4c4683d7bc99975b4c85caeeb1e0ad030c693a77c201c0eab28f8a058f25d77ece25a3e2500e12abfc2f4dd6f716a934600a39ce7edd8f3c9c5246ea50d0f5dbe468d672f192f9e1ae6f6d745bdae9278ca701b5cb11e17e08cd0a3f86a4d629d676e9b3aa7554b53e5defdfe24e7377b48ec98cfb02b21cab5b7a99239d0aa1a8da940f0028461848120f4be3a6ec645545efadc20d070958b28cb6dcb95f372f7271307a43d7ae225bb92c6aa21f191d2af69793e95ea7983d91e3943a7f39a4a9d849364bc615dcfccd97a16aba31491bf100afc5a8e6bb0d23cc660779642b0bc5436e8faed5760a070626dca07bc52285c74282b42e9bcd85555841d51edfdad8837112dee7786cd500b9f29181c54f182dafa506654039decddbc580bb3ab68606d555b796fd527fb9dc24098ddbb078d2aa5397cde2bd30292bf6aeef2bf85e583898aef470cb8c6ff93dda90612c534ff00a5c6be26dac0f9c946f868bb5b1781a7f76703efc16696701c94cdf739f9f0412e0a213a63379e4173d576a65f4b7238d152aab692cf9cac53bca89fdc15ea7c8d7975f42332eeec8f1da38ebbce72c188ed6539e030d6770789c14477855a53d4bae27f462c3880e578834a5ae190eda83e715ddab41f66f89b30a29386c8ec68a38b451ba54c6b5274a4a7fee2e41308f981b31751e91f3447a809aa3a361eeb47616355ea1a5b5e1788c734f858de780c0a5353317457af4eb7cd2c97c5d17ba62798ae962a73bd26fa32bd4bc25e01da80f76474bc18526191a9f553d19ef4265e2b0da6454adaa6c860567fc13d38d2793c20eaa2e049a1640bebd032a9afd014331256df92df0f89fa66c9d1f1169ea3f1d2216825b350be942bb7dbe87813c49c05c936bae0963b6d04ada1ce2c66530339b4fd144cba504fedf541a981efa2d6fea2f9a5ec4addd95cb75fee4e9041f30b397f1522d7ac2ff0662cf6cdb63613de32ea08c360b767bfbd5bd97237e11e3c218f050000000000000000000000007c8450513042d0e66ab19b360f9600e59e9c0eaef326c9b53415422849f6a3d6d49f16c2366493067ad7b99ad27df8b24a753b80e5ad3d888f0dbed812cd8c3a6aaba53432851cb7dff36a160b7f917ba1fba781c1fae8ac7747745adcdc26e10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028bd5d18d5f3af2c6a730cae149f0078be8c04d072f58642d2a90491d3cc325a26b55fc950652d21f89081e1cd91604cf28b4fe9ed1caf7a271bc47b082f4e8ea0488cb67343a51059ea06ccdbf09d9b15a8e5cd9a93039fe1627e0ded7fb3ed948f3002a5929d14053ba7c5fcadddd967f1ede3dbb21273f62f18092caf98a4020284b3f4f49b0597495fc8363cc5708de668c22ac20fc30f2c10f0c1503e9bfa0222ee57ee4eb8a623c1a19bc58af5d145ab1c39d57f08efb9244d465eacc8e8920b06d0144d1ed79f836a786e001ff207d5b26bdfda0a4571d6849f7fb9c6324642bf1b1e52c44faa930a28f6d736d21c31b7a37531211dfc3b6915d9c5790236dc0216ff0f86cd4ecabe5c30ca7a6fc1c59e5e69d247ce8d0f10702360b26263bda70317614efecd1c33366a419294f10c6d4fbc38b6686ae65a45c49583a617f60ec1032305251ef7047c0f33fa9496dd5c70afd8e9a9db94cb6a25dfb2af4e67e6bd2f03188625c4a9cdbecbd878f30b1879454e3ad04d5fed850f9505f7326b489571fe031ab9986160b86d4eac7f8deb007ab37fb1f2dd0e2ccf0676f7a8a9ff5061676fcf836dbbe05ca22cc12691d48105f766a0de1dd3d6a1f95e382ee7f76c1163b7c27b5e90b9965f8d47ba80180ac2ae2260e499e8cf4d2083b1e9e8ba4f18f599eb51e6475210d0ce7719ad1a6700a266a4156935fc09caa925118017cfd63ab65e7c2da2a15f25417354ded70072653793a70c0a2e6a7f269b18102b1549b524d1b8f71504ae41c7d90482a92c63289ebeb0463cd9088b15e179b50c5b1cc494081535ffeae302dfc5e4fa69f0afa4e3bbacdab6d791a5838aa70063bebe5d3f9355a801318c4634e15f0a4f4b896a393a941155ac0f0968d8239ce95393f57f7c55f83cbe1050bf2cab9657ef3c49740815a33da35c568117270b198b92929bf8ba53f07cfa5aae50a5b7fb3cc3638c3f9fcbe43fa996ed70bfedd60a1806ff3387da900232e556c74c0f873aeccf3a5c8686fa29d6e96f96247a9333848a8259a00fde293e0f08ec42a393d5041e3d59f72c06e57fc97c8deecf76f749427b5095e84953a6c1138a504716cd6c84ea6b05bed930603ebaec3f6f5cefdd407ac433e52af6317ff13456a924a5b690d87032681bfec060a8c7a3513c3d6c60d15c5a6d69deeee878e7c8abaa34ba9a9d4e52e167004372ad78a28d763b2a0c4147984c22ef818056e0c9a7506511272852cd1d70dcd53b99b44d7c4412884e9a787ad4f55fb78df0d80bebffbf75ca9e3a6d1a365a7cab72979d1651470e95b5b2f64581efe8a1a4df9f324ebc708c00bac68ad7dd014bf2df626aa711332f5ec81efc2cb36ad27c2217e432f78e6f2e559c7e09f724c883d714034c8eb750ca8758efa04dbcf564421a7616f667ab050b0aa20fd222fd53e1aff193791f1db53257a8081fd3b2b82553af367da8b830246341303494a3bd428b9739447b13bde87e19aad1d301e4b835b183c9b220497aea519efac51d3795bae5f1bd1b65761fd485652001e82dff352b8a6daaf30635ce3731515303aade0e9ba709b67f40fedc8f0f5ee7b0c539437e60567b9c4f25614710d1fba4eafb9e05f9812a5f574eb87cccd5f987a6c80e008b64f0308d04af93e78b4d844b0dca5fae6b67b6bb88a155fe411ad7487d0276a7b6adaccc429362fc2f0095770db559699cac8e6829396542d39d464917eb377fd0737fdd187d560092b6ea5d5a9b345718b80976a43268ed649c3635228f0073a0848c36e5c81c161a6f8cc6ccf4b6b3558c29d9b4360e119bea30ddaaeb459cd684576581c5665b991c99cb7fcb52f86b8553c6993dddcc631fa9b41587b7fa3e19b4086bd0847f37cd31abcde222a0a7933578d6655affe28785648c21039aff9bf8b4ca4fdd3ae5930d928856ee99e1a3c0789cbf1fe59aa9001acee5c9f911267f78bbd01c7be2413f934fb8c675612ff22ad01ea9e2020bd7b9efa7d1ee3006f9dde694330373774fe6e1e6f5a1a8f0d5128eed9a25be4e945c75b184dfa7a6fb662543a381f706f630e5d197e32434604f98e8881effdda2c92b523e0cdfe25d5fd0ac29ee596ebaa355ed3b299dc75ba33f3478a465c66784e9656b68690d2a717904c50166c13fce6e815cc8ff5099111ca9a09be81067ecd2b75aa621b693279ab2ea72afbf15e79c309ef08f75039e1319b14696e87cc2c720db3cc29935f0171d30c4fb7afe2d82ce4fb10a682b01a1e7a256a2616225393600755650fcdfec18000000000000000047212b0500000000e0d7d7dc2e1cf3bb350ad0222a510f2ec0f97eddba86088c4bb72fc7dc994fbcdd420479b32f47090fd50b67516c3875bf86dd70b9dcc71ab2f7b0510221eea7e0750a2281d4d0724b72afea7b09e9ee4a0381409ad825a2b0202f887d8bc138000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006ad05a478b69548c750868ae9e798544f75eda15bdde8743532f7a52abe58cde96f799943aaf8f641db103265e5fe160f18f5babd42c885c1f220dcd5d0b13de79ae00c3bfff1088d46bb81052c4e7910c0f593038e0ccc7d5d5d2247c2b8259b109c493122fe2e12d32a9a7cc242f6a5f10d50de932776eae8098a24792294a0308f6ce29adf7b37431bb40afacc37a9e6243668c4f3d694888c2a0aad85b2f92032559cb7985d60b848c36f535fb75a87cfc97b74352c653314823dc6d2c4351240b05c198c1185a20ce106c6c17344b0fecd9fca76ae72b65438b1a5f84d73be1c82b3499302958becbcdd586f8659fc3cb4bd9fe007e0c0f86de5242308408a988030fce58c4b5971c8a8a9131a2daf99d98b94112dec2831b73830c8c282a172ba70202dc778a75097294f274b29472c7f23ad707ee3b710e0e837ac624f57bb32a4802020501986593fd75db62e3fd8fbbf7ea803ee5a6cb8b3dad0e24f45a098d9932032b00b3bf08d08bef8806c6f692c93dbc241f67b2b0553360a65e2371b8b87b25032077cdbd735dea0916c189917f3867b43357906e0e31d284af13f5a8dfee6ea2db87c9575a92b66f6408cf4e0cb272654db2f1aa6b88e610192d24c56ba39c4b2323c28eb28642d07b13214f0936e08160810bb31629e84f34144e731a8f5dd04f69473f2442484387615a2c6e5f69a1659274ce9d2c8afd5be9c7d2391be41595bfe5c56555ba0248b633529c8e10b5218d47503a77d3a24b9ce516a5df3b69ac75c605f977f9360edd7c3c22fb123ecb071957384dcc7d8bb58e7ee8d1f2fd8dfedbccf5780dbaa429bb9ad106df82f2ded0e49ac8741f7c750963898a72eb4dd2d612d24aac3a1826d4145f5b33163f985001832892b58355a5cc95772c4970c4c9d22d8bf0f0536c6863ce14e093db8a769cc4d58cd3f069ab296839f94652444ded5b4adfc9dc0f27289b784a158d13de9d34f0d503599e04971ee7daee0c65f51aa42cb2403b7434bd897c229ca0381d793737ab8cfcd51289af3e84ab7cb1bdb570b49837b9732ffab7c993b366ddb23895fbdd611043fc3035bc704e04cea7ac63fed4aaf06da277642e2a3f4f4e88dd24e9cf64532863dced6560ba4f54d0e531bf1c948961690e2eeb7b79e03f4056b8e5c30b039c511aae9c3f69a4b7f45f009e1c792900ffef0c9d59b13e09f30e7e5dc5f6859f43bb4afea0e42b38dd845ce7764c3ce62dfbae00ca03c9988178d6914884308a1c5b811345202c547e1cae884b1146a86367ca954060793719a226d0ddd7aeb8d31e5daa6e5162150207a9ec7fc6a5062fa4284897971e0f0eee328513f57271aae2c361f9efffb4e68ed043bc7a7b70fa02eb98d5920d55879275fbbb65617c8358b26e2ada5c5cc90433718b7af9168b91fd464dba5667a4f7485b60bba208ccf6f12ff1fcaee53860a574aeebdd5a6d8e3cfe3adf5e15108494626b657ae20dbdff45e0ca407ac8927c2c457efb355e2b7d9b08f04c73190bb927a588769c9403dd984bb9fabe9f03de01f4c6a929795ad6e3cc7155bfe02a73e1fdb9c18d24f05bb164243d0d2734387f7dc6557837f1a866b838d3d1bd0aa2d58dba9dd7b4694d7af177ee3e2249da2371364c69f0d6b4be7ad9177574ea5ea34dfc585cfe6624e9a0b14e7bc2690c48802966897d5ea8ddb2edf814b488ec904843d2f4b80c177db7ace5e4e74ce66d94334729e389763e3d1a69a3192700b7119b89a61d8f47f692b1e9944ca16d7ad1fbf2235ccb187ca53bc595d1c6386857e1c7de6a3c3a46daf1fb106d9453eaa0d8337cf499c3ca7fe34dc91bb2954129471a48da29f8fcf575dc9b693a0af33077ce2b5ad06b4ff6ac6c320d2fa6aa4a4e543c8d67e0e766b4cdf716d324ec0fd9290db4a09f258d6c5429ee4bed59540a335bdd156caf24cf7ac9546c1dbab9fd76cf453afffc3dedc5f87dfa9568e6c4bd8e5d8a64dd9c4b82179c9cb9fbea95c99d2cb75f2eb3365d744e93016a6422df7e268070b0ac4b1280cb8fe453354ca2a217a523315522935123f46d9dbff5f28d535bc2bde672ed7d6da747b7353c00fd2d469a68105cda97853ae47de1a52e768da0d1025d4070a6608d7be7da2537f963fd94d2902a367291a73cfb9426d60dabf26adcf226b7072f4321dc3e8d17b01743b96215778d362f0b37d2478024f3b08992aecd42e0f2e889cd29a24ea570227a48e55ff9b0051b1516077ba9de1f41162c9e6720e0c4a467f1aae39b7a3bd09a475f8eedc1915e8dbf02f72fbbb9d45fffa89e46a0c474bb3b42e2fc8a386c75a4e436fd0abe96079b96d063d75b04944244be19dabec0a838e9abac6102e5419867af450a1da0a8cb885e255a7f8b39f478b924d6465eaf2d52e51e155c304c87b2580e4c07", "52525253", 0, 790908008, "23a59e4969af2d4685b3297bb099b649b121b70cb1b48a85c1f27a5e853239b7"], - ["173ad90a020819bd02ff8d930463c944bc4228272b1ba86335933ac1591ec183d41eb7714f02000000066aac535252003bbe077520231d8e5be3bb0fa7dfddda89342bc1691b378cf7ef995201442e6ac3c783310000000005acac656a52ffffffff024cf3eb040000000003005300b4951b04000000000551635100001afeda0202cb656f0100000000000000000000000061e4509a79c315f488b4a4e9a55c3ae980e9c1c19d742e5fe264e49a59beea9bb2964c847476bc46fc65a825b7b39ca62f006ceab1a2f6eba33cbd931da343d48742020a0eba5da01e59aa0b00c9065044c753ffbeda5d795f9681776bd645b40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082ef840e883b566a2fe2580a136477223ec0ca1c0cbc69a3f4e1cdc8ee85e9e173dc49a2a11992207754d68052f851fc9d46ba23b0fb6019652ee79c9cb4f46830acd0ad929bb7c63f9a512f836007356e6f8242d053a924b92a7994c674156897d35d332077a78588729b478698282083f9d9e0b25932f063cac08e2d7cf53b022c9d47b930ea7c0269e6e820307d026683c615b8ac68b7c2ce96bce7bbec897f03081144a414352d6965ee96c50ab6696fb0cfd610c3e8cccfc3acee841381c1330b01a0af6051f1d165596614ad5d57181365d884cf5eb5ef546a1f03eccf938c0b935e033a23c2951b3424e943ae587ec70c6acae9a0f5833f51922d2aac26b30d0320a54cfa10665b268614c0c205c8edb2fe6d73ef54233c92c5af16886f7ce852021589901b8202d587f2e25e2c3c97e10efe070c063c672e8d5ec7e87304cdd7f50211f8b6381fa2aec43875dcc57676c7ce582ae19677015823ea72276e3ad6009102263e6d8215e46d96034008a0308217a735645164d1650ee4ec4cb1cca45e64af0206e66aa7edfeb63b1bc4406d1ade9e91ce8f330b6d5a44a335aa55c219361e684389fb6a8348d58de1e65859bd7c18f85c4106dceea287678f07ea80c454c321771b6d887f7aa57198b3777ab3ad4fe1c5ad533ee7055fdebe2f476ebca852cf1287659bb7591ff4d05a1f19624e9dcbac1a40a2bcb27b02a8719b146cccfe8c79babae0c91503a22abfe82b29d1d8e625050334690ec7fbdf0d19a7e8da7aa297559d71200679611ebb2fa49e07a316c31f64abc29261981c78cefd348ccccf1fcc2e4409d1f34741f8204911f10bc7c4151efb6c8de639ac6f4b488a3d76160f62e5aed94c7a14f1f9b3567dabacefa3d212aad6ca2a24cc716cdcd3024a3435bf19caf05f1b80c67ce63e5cb6df068ac336f121c44c5d1463cae52619dcd7be68f86fece517c8501de9dd38cbcdbe9b45ab52e51c0cbff8b4ecfb3100af5f6d232dccb48247f9d1df67a073f28b1b1ecb551fac8ede4fc050fcd13f1862b78a19c38d25efef702aa2620adbe350b8247ccc06b292ff3c27aa2a2eba0861b5e52bfd145ca14134bfff7d53eec287d24d9fe16c28f83bd2a58f37dd45c89f8757d5521a822f10ecc2e34a788271f17d547c1f640ee670ba6c798f7561d8fc9c09fb0ecd010aa4ab7f38d6178130306c21b00cb0e205adebbf474c05b53f6bdfa87cd36f15c177cc1874f74c8a1a29620d4857e66577b4c2d173997f744c45b36349fe7b9ddd0aa4115806e4eb6ef615f1aa56f10a9577b8ffff101e8b4153c9200249e9650c35a5b7d38f59c10c23aa46925d3593573a69ef4bc1d893d1d5bdc08ecdd39433244806d5112ce606d8eec6a84bb571a65e872bf4898fc21f6776b1fa7c2f090dcf09c09764983c9f010e3937bf6a25d4a35161d2f8bae0f5b3ce9a49a1e65429761ce42b23d1175ac95cf7e048db685e627d2efa8a8eb174b6d0a87aa7cb39c44da1ebb8b6e71cc042390f755b45350c255cd63bdd206a12f41f3d98bc8d54fe79550413c11293c80b9942bf85eacca9c686346d3d1a054338603a5274dd7f0390e0e3c1b96fa964b637d400f17d4e9887d460354dd017e7892b3568c7f18413c755de66e4e1dce87855a6d972a1740ba7db59613839632e0db2206a8f56fd6fd5e30a34a712928d15c53de7307aecec0e7827b85d62685314c78bbcf53878d8716fd48ce9ef57f9773192ec8398372ca3a55a3bdd1f6bdd5009ec97b38056dd147b41d72292c972325c977f243e8232d90991d6624f5ae9f0bb9e750e52bf33460b54236286761b428d146f48b486261ccc750367661de610e23b62a9c49c95d83cecfdefcaf3aef7ff081bec72466d17205bf54c10086c266afc46868590cb507f39d8f307a7be218cba67e07728f07a1ab19cdcff7d17c5da6b0d47adf2c13d54fb3ddcb1ba254c77cd438453b62968f13d79902d253b639c107b52210bb01ab3408873516d31fc1022bd993e0e43b7a4b1b8735ff6805ededd48758c094cbf877434efbe0a75ec78e091cba261357c62e88e9c535a85f997d90e9ae0f5e92d9cb341e9eb484cefe6c03e6d8e571c161283e463003410847047cb7a87dada5cdcb88522c7066c73f5fff6d2a1e3633d5492da4818093efcd7900b588c0f41f3841935d9dbee984c08e21a1f549707b8de9ab0e1e7519f4c4b1597e6fbadac46d9d1357987ff7058ca9877679ddacad699a1dbb79d74ad623b0be0741a19d2bde6942db52f15426213a1410000000000000000954a310100000000542a6ef742920fa47d0fbcb82e5143879aec5b2f518a2a6a2aa96c660436555db430423691815865a83935c1b93ce9c0b0737570dab826cc3df00708abd82adff7b704afe4257d787373eab227a63205c4c761f4a596b57c3be3a44519df83a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ac14388ddb8858978345267ffd4c2cec7a7de4955a447d4e8101f6cddf03601b044d318515b2df2d4c2598cf125686bf31904385c0f144267dca2624337131f9878ec1d5fd7a66ee56ce860bf7a66f274e1b41c0b06d98e7ca90b9ee125d0bfc93b43e895edfb605bc42ede34db4ef433eed12c3a80538b543c6f0a93057204a022e87628020842e89e3e7fa4aaca5c57d1c6ddab3035de0f065af69f726cddf54021fde42bb24475eb155f39dacd8e047fe7708c7f1b55db3432b7ce0a594ab072f0b06fdc7512f593a639d2db3b8bb164824f681ed3a30cd23bb6b696a091664d6a6f1f5ba09d5e058663d576ada3a7c6294e0a823ac45f55952e04e11dbc431a0010202c9b6d684577a35b537b112a2adcc7bd6f996332cab56283c5c252fa50317cd03102083bd1fcd067738b4f0f02a01c089f89d8af230e8b53d38ea96e1fdeb41b4020ec59f13e5beaa6c8ca56aab6c8cee2c50e0f3cd129a9fa8954260800566ab1b0216a6cc76faa30976149d5e012d4720a79c9748a95c986e3ad426719fb6e8948d020f170482dd738db293db710604e6bb0c838ffb606c525ad78e24df8a4508e3b454833a258f2b0c511a3e0634b66cf9d9e75bbf823b1c826f80ad84a0861afca966522ddbd8b4d12021c8b1c99ceffd85b3737bb557b5d9bde60852f4f25d957cf17c6f291f7b53dd8745ddbb1e5385db529ef3fb11adeb2738392640367f874baa36e9e605bee828b16eea55864892580ad9f4bfb084832487678b03bdf2aca79a185a5d2abbcaeef8df26d765b1aaf66d275d93fff5683f9278d729349dac182d52effd6c546eeb1e7eb8bcb4b20b30120b3706f2a1ff89f49ceddda732b2cc9388bd3c55cdf06b0a23c2c59d9c2d6141fbb78a75be45fe037e8fe69eacac5b193c24083f36d3c0fb9bb063d9b53dbbb532096091664d8b940b69debe5fe14f1f667ec5649faad473d21b136e4377b796c6fb2e0fc39e0078a3b877c3d1a7033cf2fac629e1c0b8b464be791895b86ff6b51a235c1b49cd45764ff1765dd83896749aa42f2ea4dfa02f7cd96c67ab9177eeeedfe362a93bdd79a90879102a245cab57eca30fa74ee259e10cd779c759aa0a3dbfcfbf2867615e5bbcdf6eace33019486b222e72d8f97e53deb87ceff97cabf008027ea935811da66eb2c099d1760bbbf49220aff53beb75cce60c6b8d34120ec35000a37f8b6cc56df689e757326514a0c38d082ec0b0006f150cad2060bde417b3475da66489f00c21f7a34862bb396fcf51d5f22b8219b8882e145e278416d23ca3f9e8a368b718cbe2b38bdc0df2ef1f0120e0e0e3e25ff24d1f4efa762288964c6f4dfb56ab86c1fafd95afa252518951669d2a8f98fd156a396331569a48c1ccd941277590dbee2424ab5d4937caae355d0755c8d0eb84053f203fcc1b3232367864d888c53fe6235f2de21c465ddef32d8bdbac0c8531cf67f88de79ed44c6661cb3b4a4bca65969a00d708365c6189c2b26997bcccd61f6bb4314f7d46ac3e0e8a407d60e3dfd480d0cfc24385ff58717f0b8222626a86aef238f7ff6bfd0a1a5c930afb94783394767762d20b0a03f4f52ccf8af1efadd2f50398f070ec9d522f6c2210b7ab7fd73cd2c023fe437ff749fea1f82a443d752fa339a9be2c68473d273d5c3c505bd36c0dc2428ac74c8d105f499fa03e1caa8e4f49b3c2217c869afad9e39b4cdd88790352612752269f2d7c48133860bd7bd9e5827754d2f746f01c7c33464ee53c76d59db7ccf2326e2f07f266e0f8554a93ceff99b1f23ab66090f4794fd94417d279fff152d377ecb130798a8d52b2c6c89e703a074c0390a32b32703d85cf98c40537bf0d0bc278264d71579f84c9c4d9adf5d0887531cc16da975ece94d2f3c82036ea123029e194185081a4d3df5ca9d05c154949b94b1eb279cef72f30b68ab6427671975a0ac4e4e21f8c4a690f818bc4f51edb21f5c2ff13f7e838dc666c31384a17b107c5442d5ce2acb3a84a46d7090552ab1a17a8ce434344fe7d740bba963d52ba5e784213b76760885db932a796f62175a68a0203a5bae5243c75a579f6c6a9b48805628f5fbe60bf971102b9efbd52c7e462a327b017ed7accc70d5b44fb58c2434ba2a6795f9eb5246b10edb143af0e9a5bbd5c08b0a341436325caeaa84468f13453a0bc9fe668d46266d006083103f76a3bf7cc93702209b41e107a103a725adb3fee48c9a40350fa6301853a1c665114e316881b28734fc9bcc24c347b88c1871eb9db00941bd51856e8ec4b7f5296f867ee4bc6a8453963b8990080ad1f67e7e87425c5e88fbf214c1c7565e711e48c4c7e95a0e87c3a572d54ab007eee7137393fe04073f3e9db8837acfb5c8e7a67ab19a9d768682f9fdb01062854805313339d9b773875aa74711305", "630052536a52", 1, -722499343, "7bfb63b5a195f844863ee699306c87ee5e78d969d7127f5af933a1b7fd2469cb"], - ["030000807082c40301d89345e1bea01418a5ea3c443682babbe9a81f3ab6853ae7a794abf9bc880cf3000000000851536300516a00008e97741d033e86bb0300000000025100d95295020000000003ac5353c15e6d01000000000853635365535253acede8094deee9adde00", "525151636a636a", 0, 1351671606, "f07493ef2463b58d472faf851d77b605a210c0f5d7cb0c97849e3aa9e4cba925"], - ["ee445d0e01cc2d58133fb7b0553858ecb1d037bdfcd9eea3516023f33907b746b331db2dca01000000026a00722df6db03ac03b000000000000263ac63d738030000000002636a8c9c2f020000000001ac0000000002726d2702000000000000000000000000b9f468b3b6c1e4ca64895721290def497ff43b3d02d045414bf1591c4dc701572a4235d220baf025f6fa6e3e55b6001f90bb55ba5bc9b8f2956da0b9d0e7c3be5d1c43b23ef68e0ad72add2fb554b4ca534ba356725eefb7232cbc1f2f519fce000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000276f2580ba93118bc4b0070eb360189a2be3e6ac0d62dd1453bedf6c312685e85cb050d46806a71cc75d3ed75645aa484fb4fe4a68965dbf7dfaa0daaa821c668dd76e05804ac18eb0ee67c2009a778ca671127bbf782fe99fcb9145784ae28cd8a73de3636f711423d031154191d7084d3af1f04a93689b15e9bf6ce385018031333ee9f86852dc8f550b56e94c6288be8ef843365b1433b5d04c64a84d83dfa020fa3a856224b5215ae9d3a6343c9eb0a4f0619bfb670c489898b056edc5ea01b0b0885f1a0843664e995c0b130c1262069afca953c511edac7a62a9567f0b99515b03a2dfc8e9a8443accc88492ea9298f07a78bca6557e302f50c54a21e40b81a032b49412fe5c21758c3cb7dcd70fe6494e8fa32471ed9f0caaddf0bbfc48d50a4031eb237edc9dda1e6971b3b3838c537d5e5b45717a5fb14a883ad66e21e916f91020d3393b999d91b4ccbcd76021d6a50c6f486fb009a648d69e8d1345e6214398303175f188cbeaef2a21f649a2ba365e831c0b9e12796f1771c516e19a6c7072891031d7a9a08f36ba5a844cebd4dc7c77e4b623b2fbb80149bd4ac696818346e2afc580273b27b089f34d203f1a74a1b1d2846751d7bed21bfb4605183474ff008f24bfdc137624e9e24ff47e870c8ddbb91d605a66b07a209bea703e69f2b452dd7aac68af664e3d1e8a3a430ade030d67f251104baa37d2a949bfb5df477dfe26ffe349561767311a8f84c1f5ed90188099309056258be147c8758002a57efb296a6718ea4d332f3d383b1a8ed9a265e34ace5ac6fc11105e10126f6742b4836a35b727208766d76cda16f048e1ad2efdf6545d1406091826ee568fd9af048b58656d9d4731d1fa26c845062c43730a7e281e441cdf03914d1caaa1fd086cebf9477b65a395227ce15043216ae700d8f6339ce6bd51e06b14fa9247062d1b63695d479447c07c81dc47f8254d1e868a08b5b5d590b8ca76a8d0587e93e5c232ea6d28d941c6b420dcc34b096115428d2daf77c843ca809640f71175201ac071a70355ff1143dba5a67794a9cf8f92afe4c27b498e4400cea925ff2b44e33aa8cdba474b46ee93585c9dd8587283fe47deeb0181d815e47ef39af963f7bf608ac4beac6be8e7461b8a85be89cf97300e1b14a1e6c00f1bc9cd0d75364a1d10db795feba848023d622a08f90f5487806385d071aa19a1c0cba409c5d7a3c53f6848f978366b4066a728e494f851ddeb6b3f6c25b0823b671f07bdc03982b2ad26b60f9ee22e987492bb9b336f63ef4b1ff17da78ebe6ee09011614c68fe883f0f260202e9e0119cb4e2253222bf59b07e1772a35e1a385c53e24aa193e6b178a541428b511bf1412f171a3031ff2b45708eb2744101bcea4c01e3d4e5fdb9b591086d08a6515d3e8c25e6ac6609dcd7c8ee09d4fd7682b7fcb5e9db4557809ee08d0bfaf8ceb4a79a40c85facb3e7172e14d1af41d64412259a3e61e7a63615e30fb89dac1f1ac36ee93f1f366f4c9f0e2df7aff0dd5a14aac33f4844ef33ede22759d6595878cae25ca6e75179a1994bb94800957fa6a195f14b426fcbadb15cfe9c4f1ea5fcb6a8f0ab651005e19fb645de6191461722a0d210882588ff7884db999d5bbe0c8c724262592ccbdeb4b3148fd7b550220fd6e7f8f1214afeb3bf594355fc46e7bcdfa2644a2baa7500b59f46f5b892b01824429c3f3b69af8e6e3300e70644ac0c21c9e0c095c0a256fdd5a15dadd69433b4bfb08abd09e7f70bc7f83c5d86d1235b66801aff14d0d465b3898b3b75c778bde2d7f07c7b1ecbd765e5f78abe4b51494b6f6b439835a495de95358383dafea252b198adf65e5131427815167f215a2e9eb4bdb41128db7c8aa5463dff2bb7910a32d27cc1d50ccff49891bc67b86b2a35d2634bd64c32a3556eeeb31c24574eecde1f649872cab55f4decb02380dde4d8aa0b58875cfa64c93feb1e16b8fc62f2f5cb9fefc67afdba9b3b927cbcfd8c680cc82519e26edb1cc7d66d105f13c84ed329ffc14314ca9b6a4561ab732b1f33fa390b5651cfd48fccacbf2020a108685d81c56f6c549d32be6e1c02249a33d13b8a5d1ab73feae86383f20d04248dc8eac9eb110b3e0652577a568230f46843ec1eb9a483fa73a6f8d724cffca608d8579546bfaeaf072d9984f99c53966125d723a37d87e11c42a3b2249f1a93c70d61c48d0d9a45ea81f6e50519709eca90e437b6560588bcbb324bcf33077d6b2a3f2366567663a09c8e81bb74bd0c1109ac0208eb8af20023d90c6d8cdab02000000000000000000000000879043c4ea039a671d4f56683afd070b962520980fab459c9aaad19e76ecaf00bea62c0573f5c6cfcda09948e9e7593dc35c02df41894b3400279a82ba8eed0fef78e70e307253190603ed1537db7d3671cd047f0bc786795bceaaf471673d9300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c8b1f900f9c8858688f986c55a5d01dc396512e9c43b7191f9cbe5e46c381a1aa0950ba12199c68bb92e5154a078e8166c7a5fe84ec689c9669a70c57cec8af36a85807924ade3919d6147385d3ee110fd1d05872404eb5e7f916f5e1e64a3cebbc5f6c4027ff6c843125eb9acbc8dc0664f55e88449eec2a702ed1d8121fa3b022c9385d1e09bde7ce57ec762cbe69d046e3ad52f5c1df3515929a592d6f050e40300a31cd46d07f62db0f0f8636aadd1a4298adf851046539312265e49e7f328fb0a03c9a6b9fd49dad66e0a088345e6d01abd0e460d06683280c77d42b0f1f6612b8c3a9d7d59b4da6f5585394a6b204b93eebf599d530541cdff98b348bba8e6500328ca9f463c7d3c4a32fe763370a471ebd53ebedb16ec9fefdcee87808a8698b103050772747a6231409586c32e802bbcb1710edf4c77c8614f74916514e1bdc05003091d1425bb146067257761f96eb411685bb8e9beee174417405b956e77053c77020a3664a003fa7482616d92096baf4d955b87f8a96200970756882b4549f2a71703289f95a10b1a54274799f5623bfa57e15f812fd063bf0c6979746d415235f33ab439e501de06d30e85eedf8be31cc9c3f41fabb767aeeaa83a9f759fd6e6c445a7f749c014764396d33a0649cdea730415d0d47c6574693f6942b73d90baa05ba21d913275a2877335d97e70e011d1a9045707ce485f3d75dd3aee32a82ebb827a9407b731ae8612a5d1c15c6514e40b90cdcaa8138f30194c2d7949dc6a6d8f2b03acb26b28ac4778f210c94574b6bedd660db60487289ffcb7541020b27016b5ef92faaf8281ec482e34b95a602321b45c9a623a676dd847155427ee798449640ee945b71c5df7667a2f470981544adcdad8d4d6e5713aaaab9ffc59df58798b849ff4def7b1baa7373c40d45c248219a66c094481eb1330de70dbf03f5c6a6ca13a3f00a4d2b01b0f89585352c3e0c69636572fbc30e2ff663de0185444193c933bfc2bf03dea75353168017087478f30e058c147d5a57927db7bad8b652c4811e4f09e30a8612aeb511b7dd25580a652368f9bb7859da992644dde9bc03b11577c2666d3749a252d4fc561f165c032bb43bf5db65562e771c30effc88a5303a33fac985d8f592aee3928f6a7f19f6a1a398389af34b2155d9ff4ef0a49857858e3390a63af9c42932972244d5319ed068ab16beb8766ea040342f5f008f877ab41085f55bc3db6ebba4326cd5de1d7c97831692084fe0b158cbde4553f4444391fd769bcb34d77a5663272f183930ac62e54055ca2b7a319c8ad1c8a53571a056a434df2d08d778e893307dada064dac0aea89a954f4506c08b8a0204f09c3f79caa66460cb2ed7cdec33bb92d8abf0d1c537ea9d774bcd6cf274847dd632dc2a9f19673f098d904bc5a49a46d4b835a7a594645a2066ff54c9e428d8a239dac77c01cf63963cd403105145b32862909983fce7c45d888c3d5dc70beaae68a34cb72c38efcfe1dbcf445620b3f9e9fecb71fa086d9f8b5c3abe069baa78ceeeb1b49f95e436dc41c4173959156bdad3989acc90646a356767eb2cc96e16b2fbef7886fc8bd022233a59375b36c3bc529b87c819eb24e22166687d61f3def957e77bba6083e24c4e0ba5d499fd319753b8d208c29dc56ec13f0578350bf261abfd714bfc16c88389179e407f91ef32bb9e83d62f632b3540c889fe4d73f037cb67881d008b46f29044d7f9bcba0f0e3bc2d628b825d38d1b4628a7b1e776ad8647f72928c211079077d2f40285af0273b3e73c210a8315fe913e3531809042fbd901645946b244a59f61c1dd72eccb101bbeb0ba4ce72f0197e85cb31e3502a6326e866b9eab8491fdb290c2bdc670f549c610d2ccef686c54360b4ad37533d0ef3b661db18bf12f58c216d7b39c5c02a367e348baf90060018c1423bc909e781bd4a5f8b18d734f98483a4d9ed4d91e13387296f5193da5e729d6fd331dd6ae115b01ef3bb046dfa659f4e40e520dc6147dee5516c4fb335dc95fb9608e3b260e95f46f32a5e8266c8cc9c6f96886f2a089d7ebc600ff0b1ba45b82870995fdb8746b5e91feeeec1ade5fc00241e6d51d42499c2b878073b666d27b6408bf641ff580731c7f3a0222eb1e8c5558067541653aa85d4752f1bdd209f33ef468c276398413f81ce7469286c62724b15b5cb236625e4a8f4a4c3bf4cdac476e9f9056accbc1d9385c6eacbd451036c1e818d2521fc5a31a8ac7d8874dd655c4a610ad2594a7d334b2537d46ebcf27779b37ac1bf38fddc0251e475e9f233b77e63a31a6c4b8138cb0a7377e55a6551195ae00f2f0fed7eb2f7cb9548aeb6183488b2a58c66e56dd0703e320047511dfe8904f1dbf848a4470d4c1e384f705ad757328c5e50c438fd849b8a8a91f8f277400e", "", 0, 1951588020, "6738e7a53efcae5567ce70c44f76e6ec259894815ae656e94291c12b227daa6b"], - ["f314591f0347b3e249e48b530a4333957fd1e27ba3c227b7a36aa3306cf2be38f3e9259c09010000000900ac526565ac515200ffffffff4b170635abe7f250e005a73d1db907968b5f5ffdd833515a8452106a9daf13560100000000ffffffffa9a00e1f4bc6473e960c1ebaa700d7db08a7c343101083b635cf9a4f7b1378e8030000000851536563005151ac61a397b604928a580000000000096500005153ac6a635316f0b50500000000090063ac53535151656ac5d2de050000000001523e48a401000000000752535351006a51081784ea00", "", 2, 215765995, "926c023e285d7cb5596d7c5fef1d96359b84bb9788fa0e5a37773f73e7aa673c"], - ["f673a66f01f2f8e6bb70e18c465c1bd69a0e503bf900e5d36f9a06c7abdb6b5ea5c488ba18030000000165ffffffff036de9a5040000000005005151006abf7a78020000000003006aac8aceb60100000000030051520000000000", "6565acac63ac", 0, -616043844, "f12756faa9ffa36bff0c1e57d8442f1bb47b3f0baf564341dcea5e76447d4c0d"], - ["d3a85d0b03d059da2d4d76f5dacb1fb899e64812b51d5251f3f829ea000c4442aad8b527dd01000000095100ac006a6a526565ffffffff89848eb9b84d226d7daaa1177967835066c201a33c66d781cb2d64a5dbdb04ad0000000000fffffffffa42ccb5e72d5859faf870dbca61e6b17f8f5acf82f2ce3fbede7f9ea2c302390100000005526a636a51c4dca19d0269948b0200000000076a53006a6a6a63278c18050000000008ac51ac63ac005300ca864d6500", "52635152", 0, -1308867735, "a0759ef84d7d84a2fb762a800cf0fe754c343107e97a9e180d33d913bcfd19d3"], - ["6708991102817c34b863188312fc8ddb0e5dece103c75d6707564ea2046066501e472a12be01000000066aac6363006598947ea421233e9cc94f50d029b2befc01040fb6dd58153087c96e1f1ed9fd55817a04830200000008635265655252ac52ffffffff02b95d6c0000000000020065beed6003000000000763ac6a6a65ac6500000000020000000000000000a3858c040000000005352f6b61689d88ba9ba15d8fec546c7c90e3058641e8a83c305b712af9f923c2e22894d6ba1a160b7fb1c834f7fa9d1f50b02cf1892b6be21e4d83ff76d56ea52da3dce22f9f3d0196c5c8d6e7fcfe9f1a7acb019adc08bdf66e99595cb79300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c4c0999f88540a47237beaced4cfe2a716962cd0d47ff76c712196b47c60869dcf50749f4dfad6d3966c522b4ffbcdb2a0782025cd294e226efcb9caafe320f78d13a3b6ae209223d119e5cb54781eee3d2cfafeeec16869fed8664864e160c262c24daa53fe2499f182b3bfb76e0b9a989ea6bf4b7ab822b182f2d8dc259a6b02120ab9d7e767930296d6f00790d1f9dc63857afd30d50e04821c0ea2ea0a72b5030881e57bfb44995bdbdc444ba0034fce77189a46eb8d7831a18912c9c7e4d1470a086ea46e0d23f7f818fedcdf7bdfccbb5201fbfd616515b229053d3374864f01110f159b07593f71efeee427fcec6ced40b5a8e9408d4d60edd050d9c5c0b96d0216aacec2036106f1f45786e9471d0d9a7d0a04e6f59c97629eccaac3f22a096902139986d6b5e9ba24be47504c41ae975f38a2217faa343569cf4f039533a2c2cf0325c495d7b941c6e91debdeb9fc607620d5c536555288363284a46a10a5c3eb100325f8e47fade8620564bf70c6df950354d3a70eff9757332ce20ea4998c8aaa8d0213f74fa958c94a5e11b32787ca12c65c377b90d657f3966dfb63764eeae6509d2d511aa3869afa193d36d774acaf2993421877fda1e5595ea95c0d622c131070245a7f1a5f70a60dcbc892c8ba4e7a83fc415377ad052fdaa8364390c78fd0261244e8540fbec5402e60380e85058521952199422410f4dc6e370dedfbacdd904f16e099620fe511fd98e4ce1aedf93fa1dcd365320d8d2a72685290be0b336023fd165ace30f86a694704bd86bf25d91fbba068b7bd9fb1121ad349bdfe3f2f6ed250a3b710c843f29e8985cd796ef0fdcb91b1a0a05af74f7dbb5164715c9ab45bc871f1b333b45767f1d20c30fef7a9db68c19aea39d74b90a6dabb0197bf4c8678013e5fd803314e433ea9c3cbd0b2ad049d14b866d7ab9c8673cc17306e41fa222760ee4f14521e1984ef86363b9a5a7cfb7b03ee94113fbf49b2704fafb7898592860293d0832697048ea6c46ca36cecb2e24fe8914ed7ad2d82bbb577290cd06cce00af982c79a3b5d4b7a8d60448c34431b1a82778b86c80169d0c12e86e5e7395ba2204ca90199f856c41aa765bf32a96ca2fc558cb533db25408c3ed6d3ba9a2b0aad65699b0ca20df126325c73be301c381147c459b7fc7e54a91d634538aeabee80ed7800364b24fe1589349e4c8333c82ab796a185532183886352cd950943ced4b67998390e5f2397b8b10463d38f0cb8aaa9b73b515cbb9f7acf1d952c4a8ebc07cadb554af8c0fcb627de76dc8815177f278dafa202ad678189b10d98528a2849b5d821cc2ce221c8303a65266330a8b089f743b5000c3e2e3d047a90257fdd2e836031c106bbcd3225368ed609d9c598005d03519f27761394f357bd74c365e537c59d592daf1371fdc84f0973ae5ac9a74abc5ee7c4367b6c191fc555159cf40986576e77d9b292b9f3c30d0ea2bf3724b5bdee38f4c08f72d2cf45407e229322a3b242bd18b1c40b5b3d5e9a0680cb3f39700edb63bb97cb8bc6e3ecdcad583ec05bd63e13f503a2cfc1ca863d9f25621d1d03f44abbd4cc7b4bb3cf4fae2ebb1da2f34d6bc74a8f12ad121fca7f1294190930e12a9341d4be80ac6f3b2d20688f8cd1c1f8c580704e6cde6076961df2b1aaf0dbdd2a1a7b4cced3c5b592fdab2d48332642647e73aefe884fd36af047bdcfe00f783c0b577465ea18f10d853fe40cbff570a3a837f27be6b9e2283978c76117e26f4907dae9e9671e51f86933d78b0a96be5f31970c230bca858288e708bd66f2c4bfd153096ced09e6fb680fa4b5b543ee8d93e08315d277ba8527719e4ee230aca66081fe48432c5996eb8a313b871310e0ff2a796eefa7ae067dc0e652106c78a8bdf838ec71adf63967ff4865f6b9473c9cbcbe2e32ce4f7e5aee827c45d0f59640f8bdfb151f693d88699cddd7493eec79ea45765b17cc70ad9758421efcb2ed407a10ff13e1e7888ff000ba71e9952c9c1a5d0c311ca51eb8289179234c8aefa8c6d311ebc33c03d6ab9b510591e6e25bd2dc56e148d1cfa6ebcb6459da38436ac7cc79f7196678659f7df53391d03962a94aa044d8463b6be221cc373d78d60229681958df343424bf31314bf6b456016d0a556569d9d676cf95751145cca3d1ecd36938d17b7b13f2b16062a48060c1cdc80db96f1f5603544014ff70612bc2eb7492d406b1d18b9066e9762838345d595166aa5704d1fee10d75c2e763c757113d37167804673aaa12b2491f788a4b9920000000000000000a5cfd600000000004a5edf806f2811db56a213a33f0c2f2d313bb5672384347d685c0e9343ce8390e6928c7dfb80f9c298be604e7dbb550b6f84e4f00d5f4f8a38918ed057e465644d60c935f185ba7c1cbcaa3d9c85754d95e1752751728a61a7e675acbf7ffa9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e75aea73ee1e4a9ebbeb2d99d86b1fcdb09d5d63739996c41f9c2956aa31303316e528cd2cf07368122d43f939eda623f70baff1214da48253236595caa597b609fc9534c17026b895c029d2cc8065bf4a86d2b66a52fa9e98bf4f29eeead866f4d208a3e63b4890ceb6cd05d787e3f9dc21c55ea07e76fb83c29c0a5b4f9bdd022813e3a41e59b60c935f49868a1f61eef8182456223a018d775f8b34be88ff120310152021bff48f1891d8387b8c2e75d6a0e910d9ec513e264a34dde8e7ee075b0b03aca1840e232605f4529295ec440298a1f0373be3b592145ee1ed86edb00d47db98339a6b2f29e0348fdca67bd7a5a9a6ac52bc245b1a25affbfe01bb1739e90221ef442d3ce45cb16d004e8ba1f84d167275c58f75e150298ce64f1378b8fc610312e6d45dbb7f036928b526fc5f3d2dde40fd249fdf082b31b2b845a787fd02670226888136a6d08906ae7261f0b444fc63be22203da2413fcc1415316fcd1ffd4d02133327a0ee564dc93b62def0ade887bfc0df021763fdc1bcade4b52216e4aa2c02220dfedb5ada99458d9d48c6750eae4ce4e45f768fed500dbec93335d08cdd8f446ac03e2eb6ec0d5b60435f9a30e1ac1fd8510f8a2b583ed7db08cb0e145ef6ed5356a5e40623e1637132551799f33d876e2012a1f985f4cfaa90528ca7e82f5b7c7b8e362e69e72de4db25446a91b8963476c33d72b984bbacc6e02edcf879c197494047784b1a9a53b28472dd9898bbb8fc3011dea9b6932c01e32a9a1c3cb91e3f62d9d8dbd5baef139515647366c892feb13dbc6044130dfaad5429003fff89dee7ffcfa646be192ebf2299b0430fd691f27ea2a7cfce4d240dd6c2588ef775c82091e17869db73598c388ca907bbc5d92be90fbbc813f1b6bd77edb44b378e89f3c885fdc4ec1905fe1eab2ed94ba846ff9ae05113bb3b0e448930c3c122baf558c5069cd96e68afac6ef75d4eb3aa0834886dedbe34b743a979af618e7facd698e96e3a5e6facc307c521408a55385df82470b14d7dfbe1c4ba9ade7df2a706e87767708963bd8117d577928bf53e365a68a1e93173fb4512a3090c0872a23d7e8c4d129c33b9e8ac39302d5851b8492138e192d0e526442a15f6ddecbb6c88726f99cd9b3f8c9381ba7332d76d99159fc479641d3c0192a22a026b46807f726a872f9d7049598aeea87266b82429330a8f32ede832bbfa9760fef4dbb1d6240771e2696b1e507bf5fcab4d7d61ca43d7c1913fdc68e68dd931e41ea2541161634f94885252bfa7c7388ea35b6901f257821a6ee51e8f3c6c56a3a35a0dde82363fee1f895906e7d0b7d05ebfaf0162b714e809acb0c984f2ccd4ea5728e359ba90b159771ba4e46cae581ae92c1fe775440e55692d130982671a9de7b81a8d4ee9d46c6631920f7b50395c3a0876ac845cedfff6b119903a6aaed53ced3d36efbe4ecbe5086ddd35a2d453f8c51445f7c49df1b1a8676f7cec4e231fc0207a36ee6525f4c526a9b2ee70023f47deab85973e9bda5fdf7901d08326e5bba1af5720df27ff841e3b62dc2d4f539be722798698b5fac5f34499b6d75fc6a90001222521a2cc0e4254c5ae02117051c413b7cc875890265238503352c3de10df0b888af5d4f358c277b438c8a12ffad855b358b944ca8bd5475b4184a5f23db4afa3deaf1dd41fd278925c441e23ab8c2a6318605f791c75463c89a82045bf6cc43f7a07bf19763602eaf6283a17649ce808c1bd989f859bbfd360ec515677fe1f11e451ae47864949093a2db26afbe5cbae4da1cc6779df315db1d79607bf61dd72baf56013f7bde2d52a46a22f99c30ab1b228ffd3969f861d32d0e32dc09c4ac2847fe61b803d6e1c72317823c7dd9038f2c9abe6ecb285b638216a4d03abffe9f0b013e61771ba64ef1c4f3cbe0cc9358e073f8a04a63f2fcd0c61c8800beb3bf7a8f20c0ac138123033b5b465f5574bbf7e8f8e9c7d3c6e11273528f4b91133904ae0bab1c622746f7999c2b3510942ceea467d43ebc7901b10bf71b6736a433ac8a212c9ebe9aa179ebdd95d5dd500c4933a9c3406375b4ec8da521704a6145bbe0c31e34aead5b7ee2310e9323c21a1526f5933534db19c695a0bdd50b3ac47337596da1b96ddf92d6c81993b543af9f892d01d1eaa3f5c4a524bf10fb161a968d4636c1167874ccde02bfb17ab9da989e787f608b83a7b4660f025efd298b0db3a6ecf8f004dbf4d24c01872bab467d6da091193a1530f5e2449d468cb7269d5a81a1e19eb9dfb4db83cc475fca49569676b76a91064ada9e89624ced7ef9a91265edbb9556ec49d0ca01177685e509ed86a2421fc1204114604d20f29534c2d7c2ea059419c19814631da2d63362feea3c97f2e64c3a137c3c7feceba3d773ab587defe90bbf44649227a0b", "52ac5200636a", 1, 2015348980, "493653fabe6216df7895b3a77e0ee524ded7d14424e4cdbad70e00bddd5ce398"], - ["a5d934180221188505e245adb7f139eabc9d4f47800f6adc4c5850ebead1e4be2e50e67eae02000000085100516a006363539ecda3ab31bba875d6b7b9f06ac9df9d994a0660ecdc54dd8bc12e015b3bd0d87e9d8523020000000353ac65ffffffff03aff1b40500000000055252535351099d23040000000005ac6351536a41b4ad0400000000086a516a6352acac5100000000030000000000000000d44cb00300000000d84f21627d0e51c43a374dacad7020aef215ffee02cb4c4c84b3d21758f1f67d57c875e144bb1faa4e033851272f7a89ee41ef343f94b90673ca98e27bd9a7a2daa702364f5b23a5bfdc4631fa3a6634e08469346ad13c20570ac47dfa3127cc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f6755d8ef38b7bb2215cde7d2cfacca6e524406928bb84b3090f361f426212619d23208760ae3eb8e124db4d5d7e5a4673cd53531226ddfceba5ef087561e5f55a9ac5c2de12ab68f7ba5d3d4732df4011002a3087e37916ecb90d09422517f18978f7f848d9870c1748e1fa607667f3ac5f80916b6e3748cbfb9047a4643877031507ebfa798c6c06ce75eb8ca65b7e21d5096a9467419da72f941145f5feb5940222ceb6be118e60b15875d0bc2cb081878944e5a6312cba8ce94b217e73900b6d0a07cfcc0f418fcf8fa4c6379e0544ca29ee7191295d704406fac365614d88a94b788fadc9ba7018e8aab745d06f293d4b261fded59a660b184f71d979ff9c57fd030f4ded16cb2e43046d12d40e25d86b39c0aecee3fba4cf8bbbae12766619b44a030e0ee45b73e0bcb1bd246d5b4bec242f0f7c5abf89c19474eb3cf8919bc8501a020857756c7eeb10cbc7f46adecd7c76077c156eedf129513ab8fdda2dd7cfc400020d60fd49af9056815a2a782c836de880c7687e991ef94a2c01af4fe81502dba30328ad748bb4be102b816a481320a79e8c5592666031b144d65c545bb85da8d8b8ec1a8b248efc3edbf78f65c4d79a77975789e0793788a99a1aa27cdce01d146db40c6ca17e9dd9e1b5091089144579a68268e937ec7222b52fd3b02f2e20981351b8f0a3731ed2ee708249af5d067fa48b754f1c2cbeaa2bfa26bea9372cc7c4cdceaf09a22cff1d636aa011d3ed470fcd415090d0bde042d96ee0be6f38d4181d521524b92cf5bd5d6431eb90e04045ea79ef704e0f39eb0c152c703046b8d57d500099c29d0196a528d8641610a17c1ea10abb93ed3a24419afe3cf70aae584bb0aa41b183e86388298a7c1d47ec4621509f43d980f8104e334f967f686690e963064177fd2291aac4f5ff3ff048255c3d386ff5bd793a19bfcba892603d1ce5a1f20f466f621a3756839f204b6184434374ed81976f482c7ded51c53d7a6073c4deeef8e1ee5863d1f06e8f50866724ce9ed24281d44cde2fd45595fc77176ec829250b2b5befc85af7877be385853427da641f661dc0ba345300511c94c9606d5b49eec1345965314b0d8c83fa272d2bb14c851920df3c096c799517147bd70878679e73c33e3021851483cde10d242932fd249f36ec2ca3b4e70733ac2cbcb00410f2490d27fe7ec50abf54ac3ee7fa1c57d95cfb8f839473d2d3012652db76471aa748319e9184b5ed9f7a7a1bb628178860e86f0ac60a55de9ae06660136ffb08f9ab2ba3f238ff9d5e5abade015cddcb508a6ab7fd8206f6075fa388cc057a009c60b8de3dbf2b6348542b9e2ca43878af2d835ddf6a36bc796164936cbb7b3d6cf582efb9b8934aedde6d4ccaf23dba69dfb8fab2a21e998f9c908c140ba9bbec4bee82ed791832c081b031699e23f2e0d6ae2252232eca4736833ff846529bac614e99a837659acfb71d518196d5d661da63c55ded927b8bab971616cda2d1f6f4be602fc0c624b1fada332abb9bf60517efa5ef9356f6c445fdbb213f3ad987d13bb035926301331eb38c576767ec52c0abd43b4ae2909cdaec28f69345f89463115f31c93720a6883fd6020d059ed2c2809683bcdc40984bc4f10f99492a9e3f67debce3a79a0ce87870a43df8adb7fb5e051c622e1b3ba55e4a7865cc9e1049881a585ce34ec440a218fe64131ca19b3b177d9ccad0db98445505879fa88cb5b0e0d443ae34603c2079c35c7179957bc103658863a5c2ef815160b8f1f09a122e8c748c50d00712176f4e01c629f3b64b0153fc2ac6804abb0db5c0ec2e430db3afb93b9357d84c39bf3266d7e2ae9cde2d217b8b430b34831839780cdeefdd9cbc9adfc9a2baa3ceb9c7c92d791e0854282b1653c93d5bb763650100d3accb7b1cd88827ff8c0e6b69d531f663706581f0b581837dd42a883b4983d2105906f0710e5b187bf586c86e4b0c190dde68b5965aec1bc283c5ac4380a704b0a0572e161eda66ff002a8f6c3514adf57797c17cf799fe3d307d36571637474c7e3aeed0e4d0def9737a52d6c118e6af10f2c11b793095375963b5d89cd018b508cd287e71bc7c825686a8e4aa06f021c6f906bec41f8af84d7d7000ddd4c46a7bd239ca94731cf21319da2234ae428c424483b6cfcb135e79a10aceab1b9f75f0553dc32287f3306fa9c4de620a2da51d5bfd5b2d0852dc78cbddfd1bb01e57441bbe6055b6bf9f1abe70fd90d1138ff9444add8ed78fed91da05a70f2949541cf1c1d4e4069a519ce907727fad0000000000000000cc9a5b0000000000e010ec99d8bdc7c9b0f80f3a26e764a720b1a6aeed211328cacdf4b7cb87f479e87778390eea69fa1dac9634c024874a2401b6f01e9c06c9e2449e9b640fae0daba18b4f86abc04bb969f1975d7fa4d09cdcbb46833e36f103d6a6d051f447d1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000506ed7647f2502be7dfcffd52e2fa08e4889b43492a1a8de1824c4d7e0e2173f8a2860ef7525c6af0bf8e9917bc3da1155c10972555210240a8012d1909f396f95c2503df8fa18c09b8cdcbd86463660d793840cb830f8460ccfb08919b5e789fb23694f65d607515bb4bd3adff3329883f280330b5f3932a27400ca69b31b702145ec08f130d4f65a67ac9480f206e0017b76b6ac6703d18b2205cbe5e5238de0310c312f6aec3d41fe79cf9b48312faa7c167559e122609f66807a2200b9744cf0a08f1c07edadedf415d2b0043b3d1521dd9ea42a95f869944d1c58a6254d51579350361d63dc06fb58c88dbb4a6f46d491e9ed8304f9b64f6a602b72f9eaf3fe10303180126e831e939aecdfbf7c7f1514877f6406ab67a9b5def9d5291715ac00c022744c542e0d69e49f69ba6ea0da88863b9ab59508550f4f89b7b390a7d12dbe8031cd8fb0e84de797e442ec21881d341b19b233306f5e8695e7c3b1e92d05258db022c7724acf879b89c790f8da191f9fee90b5b1751b64d4747b683e8baecceb5c802172cf9f561028383d5376a77309694add154613727f9efedebf9d4ba46247d9e5756cafc9ddd1a3f3e2cc68f5611e311ba67189ebf2d467cf1ff6ef94cd10fffb104e90e963a4d501094451832dcc3795ca8844aac48b1629ed031d51fb49a377691354c0a1cbe7a45867c746ae636cedaaf0d7224c89d654d759896ad314be9fb8c9fb4f393ebea89ee818dc00cc7c9eaf4fbc3c1038c1160647799e5510d74a51988ada1f7290a144b573b587e6d65ea56ea1e081f7fe53f62ff5bbe3dd533b14dc514f6f4f9c7736aa02f7f34fed3807bf55da1b67b63b5fc8b91e0b6083ca6283e495e61949bb877fd6cb140a3b546d78cef07c88f40f0b0cb8340bf0ee239bc9a836a6eb31630e4f9e6b6bcd8db564af64a941b36cced28cf21eefd287edb4adcb6cdcf2c3d47e6837ede4ec2399f3953980d507dd2e51e7e028b5c5330ec68b3e6cc124c91d77c9c64d5ab86dac2518773e4227377c90db85c2e9a9f98a94cf7f84f66efbc750a491f4efb935503ec056f0186512f624e4df236fcfd2fbf4f6f5b593d4cb4828fae66eb690e09b9bb396284acc15283187faedf0c6168fd0ee5044944425b7e77aa95658567e0ca971ec6f19e6035e6ce92147680b735de603409d6f5656a5b799ec8de259419ed3791dc3078a858b20c55b2ec526de58b777df9af190dbe0fcfd826df6f4ae89f893cd456282fca6bbe5e0f1347af940de22748bf5d566309d3bf48814b5ae8d1086ef0d434a8cf3ba008b686ff1ad16bbc7e8a2d6cc6079a20c41417b74595f07c58c0877f00d194c4fc303e58aa1db58d7ad0385b4163fc68e7773f444805cd49e84c03773b0d6c1f101f65620dd82bd80f890a07344d5551dfd41eaa5a2718c4a4d5721772dc943baf884cc02e264cfa44907ad71a8c3ceb5d8371089d47593acf40267626f2ffa2b90d630fb477b875184d99ac4d06bdee1a922386c6b8531ac0316b293882af7edebad731f0f9b4ea97abd63ffbf484deff35d269ddd8ee44a33fb5883dac4f979ba65d179daef42acb71a77aadc3e1761d7b482e221d1fb79a692dbc420707a82345a707e059bf8e0a1b420bc68627ea6a29dc1553bf859e8b8f8322078ce3e27cb18b6d0bd2cbdc83440075c40d8742ee24de1fc83ffabdd850dfbb6322d711e46cc176cf850758cb6a7909d6f6e47e054ea20dc7ec83b283c6c4eefcfe35467962781005a636dc0763a7ac64980df7c54838eae96c7dfd4cde26556b87fdff94a26015bad30c2af47d563a3c125125c381ca63b33da5b3d42df4e72d65f5c25ff9011be89f0f9cbb98a08ea35363feb3fc9faeb5470ff596c21a18bbab594f00bb2075ff3f0057ebdbe391ded24d5c7241a1085f27dd4e9767bac331e235e2a23fe0faf79f606c418c5d96aa7da975589e1b6993e14a1aa0923879ab03298047cf4e494008597df5faaeded2a13d4b26df55c1d0e1376e5c97aa05e794b0864644f2da572cfea52fa87a383cff9925993254ed4b3201d6cda9c8ae38011909b3a8f2bbb6ef0455790fd690fe8072b729deb85daec75b52cd2f7a9324d1b28b164edf0f75bba1ea7693ec7402a8b0c81f087026b9625ef64948397c47fe7bcffbf19b723dd73d893152edce8c519b6124e0966b681bd615f59717f0463a85f265ffb59994641927d89b9982764aba0e3e9c892a115a98c12ddfd1594714fc76f58e4f7bd65afc97584b311025863a0792cc1d512233dfc600000000000000008467d8010000000000f50537eede3de389fcae15b8726c93723704a783e211cccc52f403d274cf097b59ae07db58efeca110ad8aeb41f845f6f5a5f2eabfe0fd9f5e65590bef3ca9226250fc6c364fccf9f1c709cf4b9f08825d69a2207661807b4776c6d8b19f1c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c7df3ffa2f8b5e35b66e038356906a5c93f5a5507f2fd8773ee588083907dad78348e300fb3f4af3dd2241688165e2d32a8b89c28294ff7887e654741297df8025228ba7f629e7be620e07db29d6af4de2cd75a3ed685ec08cb9beed2891fafcb7f2a67354b02fe03e8d7ce6c13828dfac1e7a5f44fd8858df9a7eb31bef5d200315da6d09029a709319a2439c47f3c000246312286b62b73898da5c882bb31b36030f13c516119733a50d8ff430897afea263125c8c823af43da64b12cdd3d274590b013bd98e40ebebd86ee4f71b5aa3b9529b0ca6f1e7c566316864e27da2947037fcd88df255cab61be03940eeaec8116d0f29940dfbbb9c9177f3a3fe9354060602266543b7a4fc7428f4f2edf0214cd73d4ad73a95b4168d980544db3557ab6ae9021d4fed651031bc782c39d50b3be0eb42bb37b855843b9e3c35afb86c718887d4031018318ef01efc743223d00b25d583a3417f96890e45c7520d1620153a53b0c1031dbda853dd70d3af6ab8845fe3b7ed49128d32add89f6b140741c6ea91540c550219b63f87a54c48a85596dca08db03f8eb48d48305c4c8130d39eb6265502b0789314812850f5ed40b8bab870c627d7681c3026a37f67890b58f601497c3b2fc87980a451d40edcf9bde5809c71980d5c13f42facf3247b528fcd8f53d0c5bf283877747f2dee20c9bc3fa173310f0f7562a27b4a42754312cf2c84a7a82c719ad8b68306ff454733a5e7efb7dc131ea8d66c1e63c3bd0f0f5ec38d96f861e01779cd835c73a7f93d942eeaaa08d7693acea766d20de343db9282d9655ad8113a7dc093745a59212ed45a91c30c39009f72299f6fed8241ef4fc90b732bced26a7247b9165c90c9920edf04e97e7e07b81fa0b30e66d11db3966da0f55ee23b31442585710a884850dfbd0ce363a49fb0cd65ddae84237b6f912fa5dc87398fd20cc781b441a5cefa6153098d1fec6d0a03bd448a8a936f76b53786bbac4541f68bd81661f72652a730e5559325ac394c2058a19a9f97a9fcd73537d2681b6b4a1b442d41ebb023b388f026760b7c277ec0a44a35bf4f8a065aa373d97873138ed99695a588042602836952daa8b9469d964f213172757e90b3e9cf307c9c0426bde5c649a5cd07d714a25942bdca1f152a1263176e2e93c70e61ba41659a034b8a4142d8fdfeb32ce2701a37c773fab1ed66b7cda7dc7940ef5d681b2bbe48136841104ac349bed7913b6a2896ffc13945968bc605fe08af99e06d5bc50b1af768e969aed3f5a6cf99fb620abfe18d19ace1e341d9ea5ac44aeb32cb358b60eb18db9b081ef8008fa5d21189168ea86323af74eee60a3327a9dc1bb1910e44c7639edf2ad756fbba6a0728576a9377a0b83bd69b1bd71b1818de3960f0406a106ff67464601656cc3c367c12501ec33a84cd2eaab682884f1ce852c8feb8c2068719fceaa6d7db6736196dadc5bb315ef72ebfc7f1d8d84d8ec169d1eead89b869f07ad2272efeccacf5eccd32ab7a0e06aac848db3bd12419e1a21fba13d4b9a80e6516afd18b33fc57d78e9fe59796702bdae14b10dd844480f632cc8d1a26415a93c499fb683883f00800e4a49b35695b419fcd36e88be0b897918bfff973f02583c4fe7b29b353d1addd87e076fa50c41a83687decf76737e5b0d4a67f67d9166dfa1e912ca54657ff634de5e00f54bea8a65d2a6a6d7fbd14555fb2e860e95753ec32b3c66a2c8954ffd63be302188bd464c589dddc479c1ec49c7ef08b2b9ee1bb7b357857c481e7648565e94d805a91f857afcd0f70f017b4a0802fa8da44c061846f1a2d1320f30893828f4bdb1ff1157437f7c0aada8cba138d74057b0e18a35a19c67108af6f0908ed8a4732cacba06bc495284efbd64b6ebcf325b94f78ed7ab8b90e86915dadbdf62dbb2d2140f164adc6249b8001a86a7e152f6ddfb2b879a37739b2d53e68b92439b411df9579dfbd3dd90de7e1d6b29505be578d3476b073835a858eba37409a3a5e7fad6272e05b059a64732f3076bde37ce511e70e26e252450afdb640339c2ce58a1475d0cfac88203b0938079b4031de83f773b2b885a8647f9852119a01579443c03110a95c6a80e3b6f74b5cb84294b5a5caaf6a9340e63fc20f860f7f89a46005d12ab81600ffec15fa023ff25df569986c35dc53540261e922ae9d40f8cc063f34abc3042801c9798e7a837fab0b018ec19fde5a2f7bd9fb3f8d0ca374101adc386bd07309a743801cc2a0287318a42e67151e30753998f3706fd80a2f6bc16832106ac8bab6d8bd1c4d265dfea007c267bba4e72e568b7f04ece01461a9d58a0f5a2c07764f8a339708d6b170c41fabd3a8b62b1290553220a4a4669f2e2d4903ce95a4ee65dc370e623346c1a3ee4125d7c7f70841d1e1070601d542ac6104", "525365ac6a6a6353", 0, 1820897368, "46c63e6b9f6bce1592b71a0cbcd95cd5f69a96cde01445d3096acc613db50580"], - ["030000807082c40301700c9aaf602605a10ab2c710ae502aacf603d79e60921b4b108b8c9060882fd800000000056a6a536553ffffffff02d6a9c50400000000095251ac53ac53525353b750a102000000000551516a63006a8a8c8f1d9d94bd01f4e0e005000000000000000000000000d10fa1d6cd91b8a33ab63a5bf1ec72d54884997094bff530ea1c7898585de9a1d6ec55931a5fbf72f65c5c281e51e37d4b06e1ed75e56371cfcd92ebe0175099d719d07a64cfe5d941ca4defc27af585b70bd8ecc9f486a7ab9b745781daffdb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000872a9edaa513e67e97b095ab9f6f2d81daaa125772b4c032cc61a9f22b385cc9d1ffb2fdbc407755e5b91c15022f98b59ff46868bd1fd817d468b6a6cdf5e5a421521f8aea1ccd93a6f22c9a36db8bbec3e9342f92bd0cce46c4748de94ffec3e25f22ecf69e5437c12c3051251653607bfb41094d96030a7104c46aa755c43b030db512597a6da31a56efe2b2c619d3c2f107d189d4ec4e8ff800dc1f3948743902023e2279cd957a7a45afa2db0daa2eae0803304288cc454bd3f5da49a4900d860a06ab858bf64b0e902416d218a8f68eb30c46540aed913e782214f268fcd231088b8529dd1b022fa35e783aab8e5ef369158e970bfb80061eb3e1dd8f6516aae00219039c61d30f7c0e9b6476963203a10effb8d5603c2f5b5bf022601661970d12031e68c24021725fef095f54a0883b799da96388afa2aec56e57784164953c2a7d0208a5df0428a68cac3d96463a280f3f137f2305bcbe9102479dd8fd0f2e70dbd8030065ec1d1231c5f8895de9c2204674819cf3609759b19f0e584fcf52a5f491d50322104259629d734778b99114bb9297ed61cbf983261d1cc5fb0f416cf23e952da9ac3808e35cfe704f18b7b9afef3f7595cf332acb3b2ab8a0a7a179853d53557187dc9040988a80b68fabdbfd7a9e2eaf346dc6d5ca8f511ab68ebc8c2dd9281ed443c274f4b3c2354d017130fc2242ef5a0af399418fe0c3841357a430d405d7a8aa9fd3eb7cfdc0a06d04076c069f5982e246d76296342fd0f0e7628133c9bb29724bf0e40208b5824d8a4a5a5dd83b88eca985763f0d01837d374ca8f605a7d23302401a5c9b40fd44843ac9f997c4247f26d19764ac7f4c57c6783c763d9ff92eb00bd6abba89759161f06030a1f72d3eefd5ece3d35db282a87fe8f6c5edd3b743a6911ef0eba1f1c52bc3dff7a1067d38f3ac048804908111c54f63df293b4bb96b018073d20f9a8ffe37cc6db2b8712a32e6a0595cb344b664e46e7e72e451ddd51f03105a4f967bc83dbd132955f0eb4c3231fc0393fc6830b599135518d24e93f90035d5b4f3de479597f23c910dda6943e58e34b71ce8de2b781efefb5fbab5460db9c4be10dbdbc6af73c1d8f2b280d17cd453771d48dd5a88f4fcb256444dd20caab668caeb024c0f78a8cc24d0384da16e125b092931b5509bd589c94ed2b393e963cc7a4b066e031c894efc78ec960389d062d69782bc28b43975d09ffe7560b02055a2f7ab54b7ace61549dd018caf3db1bec8ed75da8e35fd3b51c94a06954bf779b210bb9ba1c84d4143429a53a0564052b1fc42a064bf795537f0b104b9bcdc3d59dfd110424af98e06bd6cc6098004832ab0c41e03666a2cf37da9864cab704e483cec920e2ecc1c355f1eab5635e455df9d10c89f8cee927b7cb3dadc57491fcd5c9bbcde17eefe232bea4202738e682e6ec4cbf3dd6c4b025853ea6dd58cbe08fae2c7220467943d4e3321c2f7c51ced8429d50a4e751f13e24f7781f7d9022fcbf57b8c69967db473848f1e4e6c8d8af712cc434cc22afe0c02c5964b19fd8c33320236d85fdaaf38167d5b22ecba057edfbbc74f3769d1dd9da61bac2d86bb510b06f3b0c0809ccba2cc2fe56cf9af5b24edeaa0ffbf25ecbde7bc3686527831b735a629c2204b73bda14ef3cda7a0f61a11a257003b9a2077bf7af8d997ff1af598ec745904734911415feedb12616c77fdb74eb2139c8c7492e6b7947ab2c0c57d15bd6331771e59ed30ed2e562c6490ec78648177fcf78f3f18a7b97e495d3f1eae2ec136a511dc9eb24243efb2c8cb489942fd75fb1f1a80486bbf4129e5710e5c3dca321ed769e5fd1d6ccad87d3d1dbe22943001e5b3b80702d538afe65e058dd911e7a5982d6d684b88ec4071c6acad1acab9d66c874da7f28da12114608248c88e8a2089930872b9113f8e572e945dd52f386001150bfb8da6e8181868de91e26cbb92ef9fa7ce18df6c4947a6cda5c7997b7198f6db28cc2d2b8db77f3b930ad257484c27a4028b96301de1600f9916c6b7bfe1a66206f1f43df702d5d80cfd395443f5d338c1b340a5a77d6c2d96d8d22dbe10fc8f9c0ffd55206ba440dd10205318e725ef779bde138d0f18b333d3f3b7ce5fc30788f007c23cc09ab8465ff4620e65d0a1a7227ce58c3c636c2a92a625105a6d8717ef28544fca7a9d7d7ced1272a20af3a7d553623c994a53a4676dd1eae5dcd2e2588e9051f1f40fa11caaa5b176d74b75c371139dfd497f051b72297ad9d3e10435894c3b5c5a2da2f9d793495b699968ba6215965462c3b7a7417d955aba213542597de2af3dea97ed326f464e9ed5ae8452343ac986527a8d2e4c2163515b3e2ce69cda730caa1749b033dd2ac0b7f7228c676c0c726f45be8643516c6f0c2bf2e122b9ed54f0687c2803", "005151", 0, -1191423958, "ffbc74530e9a3bd6855645559c58a124acbf809d521badb2a9929a7713d9015b"], - ["36e90061034b7c735c9a09487cb15960b70a2a5d94afea477422410b1c132956890d5c81130300000008516365ac00535165339653b5b1da484bd3d28c82f8cad7b23ba7e0fe0fb320c9955ddcf2a62b389149baa4880200000004510052008995c607d46271cc7be76f8e23ad8aeb8dd87ed6801b10e53de8820bfa37427c2967f70302000000086563acac5252536aac04a824039b1a3b0100000000002e408a0400000000076a00516a6353ac5b097004000000000000000000010000000000000000a7699c00000000000f2292634c46c04df93792b89b8280af5991121f5927b17cb6123403a79a934d7aa6ea1c9eeada51df708730d9ab1dddce977695744274b83d494d051b0600367e82d75450a4f11987a9362eae0efb20535e3312f3c0b89ccfb40b28edeee1d800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c96617e2fbb3005b303733dc8f46a21c1dce4371155a0b29cf583c0ce89f18c690a35c2f59a9724ca2e9f88870a6d4ebb6181622d3b1f0d986791801baa260ed547a11b9ab8c6a2a8b51ea077ced9709ed32d5b33c237b8258c45e1e4e9fafbf106761f7f9b7be03455fc142c555da9cef67ac2f24b5fd5be1c950466bf649aa0201f2ac27c9e9e935625f5152d4f6c1adf8d0229ddccfcdae5bb6a35f2065d1b0032321f4300ee861838a1237c443867c9d5333bb90b946e0adb204a11a2843d0750b06c30526b55284ef430b6680e60d17f467dffa0e5aed906cca4d24504490ced8c2a597d9c3ddc7760952563b48ffb432cb4413b71a6484052346914dbeebe0e9021e60790a226fbcdf0fba7bb90ec572f6dd4c4386711ef88b434c16096586985d0307a2e8f43fbc136b448c8a8834d4df41dd91822cbe75d314de1748ffff9664a1020b2fe27309499e38e8e239e42bd8378d6755c73f9c9a52d5e269ec4e21ddf26e03206bc2bfb9bb512328ed9772de1e715d6dbf0153a38ecffc43926d141a1111e70312866910ffa4f31d9c095e756d64563306a12e29b2e8a1c37cd225b1da9e32f0e205ec22937f63fcb56a7c219d0b279ca9a9ff0d570980f2342d53536c0265591872cc51d83c48155c68a937bc06d365ff4f8657ad6f2736e35274dacb715e487e33cd4faace8fcc59dcb245032756f6fcec36b82f2f5781a89c43aac42b7cc4bd152c2f994fc97ff9b2209bbbcb18f3ab4f8eb133afedd6b82101b380b5a26773fb5b8cdc864db78c88753faffa1b22d08511be490c26e78bf6dbbaa7939c6fe5fb907173b32960ec08d86efa2ffb95cdd397bcea376bb78f6aff5defd017a90df32eb098fd34671bca74c7dd5f492485853954ff0d56294f87e92c29ef361ad2c347b56a2953b906a912617d400b20b8d0524dec8632e805ea2998ab60694abdaebda4e97b638d14d44de6c3829fcb7c1098c40ed2798d4f60d3ee284ba65cab2f7c968a97ab02ae92c4a8520c49e13f1bf350adf1a867d351327da6da51bfec81e6343ba4cbc638fa65e9e79d80b5f458293b22c5cccc00d331d538da3b5cafd3449b34ec815ab35bd1bf877b811a8380f1a104bc105c36acaa4ab43a07e585db20d59e47b7fd49b6988190895d153a9bf079086c3f216fb5715f49b79b64b317b61b531dacc1d2b80e6c0d396d45057811ffb0830fbb2bf8c6d97210a61ef1e95e56a54c8b150f35d881de97dcb49b61adc46fef8c826f201992a7e5c0f78300f913bc69b30c2636ba9d2c8e9d05fb8f25ea99928b7173311fc63c187f58f1f40c8347aa5dc138e535083d51a1a831a4280a18636041c5f9282e4537c6d6d9c9c417a618f3adf5e15ea3e5de477ae589b8b7df6b53f9fe55a06d2ead951f0b5e64d42a0f3d3f4e18f343dd54759dcafdac5fbc4940db5342a6b70d34bd8b36e2b2545a00c87a1b0034d36785fb0d60a859d6cfc099db0f3008e29aa7d9f1d6b57c4fe0bff22ec5ddb2f8b4ab10c196f39693dbce75f2556363cb108a108f0df106e5b844f0daae1d95388d727b45740a2659bfbc1713aa1fe17778f34bb6c01acf515c74fe34f8ae7fcb8aebbcb26cf404f354eb453273a6a613c039f0bfbfaab5b4a60873e9b6bc8b23dcb3b7650d8efcf2a7b7fd338b008b7d7db9ad6de8741910676f506e9670f633391b8f35351370e6c580fd7c973c46258805d64589bc9d3fb2360f675a3f31e2c9a757083e7ef4f4db59cdf75544af4fdbadd36fe23eece5ef021c73940670444d3e4e3cbfb67941015aaf1797ad05ca032e7b2f48486d34dd32513901dd8268806168291a5433f5819a0896888215e87bf10fedd45036a9ceb2783ab8ceb1dbb03dc0ad4e8f1bfc86a2542bfc3907b7109b509ea99886c60b8df1961b261f7ae74ac145e66387dcf769f0e7efb28fe801963df78bbde4eec6edf74ab45ba739f0dd75a5933e590112fae1627184d921070080cbc4f398817856d719bc24a8eb25049dad08125c4222aa89469d6a27023bf2a0c1e10dee249f004501ee483425e26fa26610fb2035a3d9577f0438fa31dd7b209dce8b3682994e44ed32832edad8da84e0ba614a0fe0454d01f9e0eab22a695ba55c514d533187662711a618b60dbf70309e746fd783fe38063ca3264be01ef8dba82bdb705d1d66f0cc19aa0fd655b2846a21c80a079a378542baf740e9bb0c79d9eee4c3f736c7ec2735b4324941237d061067b5458bda1bc9e686c216ed4e982de8cf8f74b2230b9dfa970313b24072ae901b4b8262fcb7cad5b366ec941834c2e904c554cd68901d465133b3e55c4536c52090e19f01b1a186839408f792a55914b6d1f29575af57df4cb0ccda311411963c41c665b6e00947116195ede6661eaf0e5f8d04c4fd4de10f565d2c57090c09", "636aac510051", 1, -1889338686, "4cb6d3910a04da2c21932b1479f2757ead6357f819369392d61ad99911e89145"], - ["030000807082c403045437cd0db0e95382707869086cd52966759dde1ff17dbcbdad5bbb811a7d74a80100000005636aac5200ffffffff8c4a26f2313640f292f59be43f7a921c792f5e2858b4e59dad6a50aa515d32910300000000e6858c79c1f38cbe3de06b94abef7613f470ace0de6024617adad4f11cb3c64d968718fc0300000001acffffffff9bdb9b6d6665a28538fd83f71c68c160d83635226baef422ba87b7b82c5c22ab00000000076a65ac53516563ffffffff011a359e040000000003006a532617c3df0000000000", "", 1, -679737577, "051167fd9601c37822eeb5fa51ec116fba5ce7e0324cab9523b6afea4e5b8590"], - ["8ee13d7f0223d62cac9e290de58b39f874ea82dab44f37c076a4b8ae9b54df15776fb3722f000000000100ffffffff0db8b84190262ef9c20f911da11827aa2a6cdce74e022a1f3094a44153c70fa70100000007535263536aac52ffffffff0413bf6f00000000000753ac51ac525263112a12000000000005526a515365acf3e004000000000165e2c325000000000007ac656a6363005300000000013d2e7504000000000000000000000000be597b267286f38fab7e9d2d50e36b1f4bd5795f1e3eb690ac50214d3731a12741e2a22c6c654e7087f29e735d561c5da7e62eb3ec97cb32f03becc8e797fc263723546a462775da0e5d8ccb8c116a9dfdb71530fefbf2b6df16012ac0c02bb8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b288b035af4bb9c439bc3def943f893ee8d12a473ca449e62f046244d1647a7e06d68a7ee0eaf8ea2bfac5b2bd7f7bb93f693d4b898ac3228c71e6463a07bed40ab644ce15c737001289e8bf2a794f005d51d16035acda0764eba75cdd266049af17b0b42c4d28e093bec7c154d7dea823dee7b1435aa954d90bc7c79e29e2a020f606d53f7ad9db810c3a436ccb6d25b54c0be1b34b363d631bd1fb597c27461032b6121a13a466831db9454543fb1aaf69b50940dae6e375af4332ed72dccebb90b01e3c411effc4f0da9683817d6afd7d6525a58fa7f9da1ceac803d465a8d0882897b9684f777c2f20e1ebeb4439cca5c35f7ee99155805f2b51e5d75be3ef47d020809cf60f9fe830c9d0cc99fa27217f3f5dc8e631124e6032976ca2b5bcfe15c032ad347b2e0f2f74ad4ddf43face72a66dba8ddfd44f0fe4cf6bbc22dd87d8e0c031e61081132db72515549144dda6f782423e58ff3386297dc986bf6e42ce01c0d031e585ede4eac7188190cac32cfb2ee27fdada0a6507f11e7f51697da7cefaac803241790c245fed7b423484255ce4aa1ac1e2d1334d0dc5c47c88feeed3c17cfe4a6e71582046f15a56a79a87ec06eb32ea9224a71f8cf4b0305c02a9b725d2588426529aca46fe8f998c04da20c1737e418c9cd3caecaafce10ed3e033ba61101202907a3563e51b6bb4b49f4d721b9267cd7bd80e0bdcdecb5fe7e5085022cfa10fc43f146a5122222d12af31e1f4fe324e84cb39d51e9dd90a82ec28df894a9f49c70f7dd09480e82511f19061cf96a021006c842e6259119a6c4210dae8d619e84b4844e608ad99bd6567a7f3cdd610da5d34daac26fdd4e1fafc6eee0e521209dd79fcdc3a08ae0a442b2432fb0755f3d774bced9045fed61d6cb2572e463b6a574d1deb4fc363037288a266b1f6bb0339135bd5cde3012532aa86f4c2a55aad4de3746bfb48f02ce00756cfb5c702fc09e7013fafbc971f746e4fefa007d475502d70dfa466a77305fcb2c4af8b3bbb397c5619743a14e6951fa8b5aed4dd367519aa245700155e8d2c4fad62d2349674673644ec2df0dbca2df4e7a0cc7139fcdd03122635341128dfdc0b9db52934e7e7890bfaf24498bc8d3f01c8c7e0dc31b103f4ea22e4628cc8a354bbb8a1256358460f2fc4eb0e940684bb2af35210a7278acd4645c9e2c651d7a1feab401371cca12844c32cb95cf9fc2c7ffb85879f22d22d30e85a34bb0917eff6577584ab07855d371910fc87a4b441036f38d19b388d7f5f430910c2420205fe1557b3a3575a32ba7b78e4c817994f315c370eb73fda09e55d8d0385ba69a14d034e29997ff271e57e988febfd67a8bd13444ff1eb69d0950ea50ab08ec4c82463bdb2f5ea1061c0f83d01b3b096591ad3f67c205d1fbca6a517e9fc7929ce2b67f8fbd87a5cfc202cba6c7fe2f851256b48aa621829ed6c6447a559bb5b0d9800ab97201a965ba090140c55557dcba4b3f2e5fd93cf035181bd620f62195635e467b3a56b0d4c015ba68c2f82d535394ca75d1fdd9fc9ed0e9dfda14fc6e61275e58d58d5a24d653813497cf3f18f2dbdd09b0ee96dea69aec6a8df31559aed70879eb2356eace9fd2f5c61566a138c0dcdb0717d49e85f19e48287aacabd3a9e4650318811d7db38a27b5c6a36f4dde0fdc1ff3b00a6213ad1d41c427f1a30872e0b7bcdddaa39db6ca504264b02dc4f712f9e23d39511f24bce8562c82b34819eff3a422276b42c7f25b09ef102be2ee3c7dffbaee45a73cbe3e0f1b7d047190b59389b1a3b5505350b457f8d249f4e9ed45280b3ded1cd46d17e0fd35a1a110adaa6be9df9bd6084d7945f510012965ff6e69b6562df869008e60a33a7ce1e57a32718cc54ff5b8a4f1896d799ba7bad105f1e8d2a7c612f6e648f1e85151ae39b561f570e42d9c2e03737762376bff230db1f5e26309e09b342e4832f85055eeebd8692ea00863758797338e254c69f1cf9ddf3f796dd3f4f54e0dca8d3e973716e5bf2b398938a13f246ed391af81e69908d5a71983f4219cb7cdaed6e6a45c0a1e95ce0e7bb6d5aab2a90ec105396a7256056fa7bd7787d63ed793da79608d8b045249805f0aff8db9ecbae7a265bd96f756581744bda4327c601724cc8a6b784d01465345933e9bc5cef5ceb2dababa18e959531938f2d9b9614a4bfcda757e70d2786e132a4605a60f11a907a965576cb28ded328dfa26f1787f1c009ab1aaf1345c7f9316615ff4e4dd2ffa4a52bd23fcec957b4ae4c7633057fa6d6bb03c9a291c3a905f774201e8026e75141ee9ee440fb0ea08082a646cbdc71fa3fa4e1604e0117bc2981d841d494e52b5dfe92573bdf8f5ce122502f1a0a2c8c1850d627f4238c002e9a9d146d72a38581961d790e4a80675a48d8f1b212bdb81c309", "5351", 0, -2129220502, "390f2ebda9b090ba580b1235ff4ab8c150b4b31d040234af252fd1c355142c08"], - ["65a3f834028a1b0efaec22eb1e792513eef6850516fcb01ce66df0c101033d0019cd5a6b5402000000095265535300636352acffffffffab2633aba05ad7d35c5dc8718cd311e564bdf891e148b3a491a74d14005f171e0000000007ac6a0063ac515200488c070327214d050000000001ac3d02ea04000000000465636351df89450100000000016a0000000000", "536353", 1, -1978627126, "cb9e83c235c76de64b3cc04975bcd16bcb29d58945d0daaef26e1c9a75288bbe"], - ["030000807082c403016d3496382976511bd3c5fbb9d921adad8e7abea942fe7aae612373bad50b5bee020000000251002f0e2f41040620d003000000000465536351da9347020000000000c60f89010000000006ac63535252007ff037040000000004ac656a51000000009104751d00", "6a65ac6a51ac", 0, 188031827, "09679f97ee894a00c961ae37d7104b74ac7f880d78521eaeb0edd5c1c3f5d453"], - ["eb98a27803808afc979a0a491ee05b4bd324659365c66fe397e4093842818fd75cb111882300000000080053536a6551ac51ffffffffd4c834bd3d478b3bd1cc3c451d18d8fc733fa9b349509dd02fc08ca0723ed0b7030000000963005365ac65636a53f53ab0331a327e6b5a78b8da0703ec9b7457ef6b6695f56b6ff26f35ebfb27b4b806efc501000000076500536a516300ffffffff02e6c2a802000000000153dd7693010000000004630000630000000000", "ac63", 2, -1584587241, "faaf27f48b4a91f2b539fa0c7ca60daeec960c31918ba7da0286dde21df6c23e"], - ["9862da6903e9535110787e01eb6514a449e45d864317b7708c47326c21ed3e7628a200769e010000000800636a6a00005353ffffffffa64096d3add4eeaa7b3cdd0b2e821dddb382daea1beaa7bc5f5a135dfa25ae9a00000000096a00630000ac53ac6580e1a4e9a6203c2ee6f038dee5f781f0f96300519c7b0b4bdbb17efd3e858176f4d6102a0000000000ffffffff04abcdec020000000007515165656aac525969840400000000025165de7bda0200000000085300656a00006aac3e853a010000000007006a5351ac53520000000000", "6500635100", 1, 1952637042, "1068e7e7db663989c2dddca45b94d26b74204a7d837aea4e94256ffae10a4496"], - ["030000807082c40301bbc70fcd1dd910af3cdea1d5d1da60b82f0fadf2e95e8acb2039c0cf1c2ee98402000000025352ca0e49f603f14c5701000000000353005202d50e00000000000953535152635251655362dc07000000000000000000000000000000", "650051acac006a5152", 0, 571605632, "635d95434bae619770f7f4a05fd0da3a4930b5a959af68ee9f1c1fdd7456dbe3"], - ["c0c5d05402cc1f41821d06dab65529bebb5a9e39d6caf8d6038f785c6929f4e166d10a45350300000006635251650000ffffffffb19c3adca193e96720f6741c8a66acdf3c59252271ee3cdda094817a0e78513b0100000005ac00acac52ffffffff02a4a98900000000000863ac51636553ac00fd56a303000000000700ac5100ac656a000000000248eab1040000000000000000000000002ad4e305f21ce309dc807a62e6634ee24d252b207ab5d4eb3b960b49b3cfe80e209cc6105e192a2e2984e0df487ea2a79fc2ac7870a1d9e95345be50bcec0df9e680c5232686c5852cb19c921644d6776795d51de6e5e6292a31d39b8ae5598100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb62e56500f502632b1c0c3b4bda66952c2fdf94d3b0f662ecc5f99f551f52e179b607643e169be6562bbb870b417e3ecdef630094f88f12bcc3a92b20dc501196236a6099001868c228fcc4d4a6620b7296943a0de2354a3aaffc5717795e49dc1d8825015e69f85be6f395d524f7ebc56fb58b7bfa99a548db52806d6ef3c021342fd2cae8224d0fe6cc55f3fba9e91de7b28dc265942066d0f3125c3a8ca4503118aa1ac83ea508a9548038ca02e81923e8407665eed7cabe3a4c2b39a75db9b0a04d84f73bebdcee7b4a234bd78404e13bd99fabac6d8d76e407c7d36b7a37a21c2ad76740e562724a6d69184cc7ee4659f1089fd97de39a9f25fa261207ac35602131fbadfc910713f412241c36312a205ace378f948297ee2d5b599785c66b71a021314876d988c96ce953bd11272af370d9626f3145fbfc0ff1c210b5b3b2d8bbb032e400b48d50650bf91932fab82f0577ca3b24dc4ebf6612ba1ca4c7c7109550a0301dc779f571b1d34ea6bc130e42cf5767e91fa278814617da6c3bb6f64ed06a7032c396a1279730130ef7be85d19e1adf1af284662531781d78c8d296ee1094b9fa8b0fc0fbafae4ba086cdbbf55298c79ca621e236039b72d6a636e62389eeb10bcbfb76934c01d67892983196c3f7cdc26b63044c81dcc479798eb937211847cd3767a702ef8d3bbab56468ad71f5b8edb05400b1eb255e3f4358d7283469937762b961e6e9d47b4a23fa03f483e54073cd3488d4fc745f1fce88c71ebce197eb275bda017cda016cfa64d7ea2acd653f29319af5e36fd42df2bdb820b072f4eedb442fb12f3c1b1a82cd77e272c201326e0944acc453047a91340933385429bdbb29a201afffdc8e3b1a08b212010718c98fe6951d455240e1d8b09da1a480ede26e1ebd95989e0b61c1a9635498db043a81e3cb53aa4735c8ff5ecf2da171de7b5c5c82025be915451024bc5aaa7cd93381c6a2dea0f9949ac3e60444b241c8bc6a874507d35fb72766ca84c163abda1fc338eef8c7485fbcef8aab534b3ea49acf54693191fd5421a72ddc2b7b71d0ec2d6e49cc5075c4114881e0d37e954e8c3c61b5c52ce72493b903506f10b55a1e04a15d9e89c8df88a5b5581fcbfc7e3e52bfd418a7f44dcb1e314bb8a92bd054b26ffc43fd6ea1834ebcbb4cf112d0807b79285a7ef975e79eccb2b2b2e0e3bfafb6865f070a798672cd07bdcec235e7a5062d3a2eee01a8633c669a52f5641cb7204e488c311ef3651e42d84a3efeb4fb5ee1e742c579a263c59bec3d239aa77e883bb4630d011e59787a49ea9c11f0dd8665ec325cbc15ed08298f6b0fc43b5145e9ab8a95c821b49f7cd9229e07a11a4494d4e75906d41bb796dea7b3f2951a3461b063c8cd3ddf0c5ef1f6be0dcfe44d5faf6cfa50d7ff7f4e9411a969ed68bc75ed12768470c52c77eae1b4d013d287087011dafc7b019d77bfe2083f720a03a3403d76679c1e8a32918f11931fe20671584d706f369e86d23c978ddfcead064bb5e1719f33618fc12cae8e89a9aff074772e9fb271f7c132af8e01a484baaf98ed809f73e1b3703c4f2ff8084b3ad6d3a2ff8b813f6e2ff03b68a2b9bc373ea3bc8c647a5889ca97b90f327922ded6119a84db570aafb2bb18690714ded899b11e9923b96cac3fdd3d63f8f37c1717a1773c9ed599ea6cee8c8a1d8f8f9c6bbd7be23c4ef170eb2c2cd5971f560fd7ddccf2268e0765b45d232a6ae327445120437f70c604c6b93d05b6ddb805bb03b88c0c209077f0550d3383071c63baac7778efc44ac7da8f84c7b4d17bc5069c6475b04d9ea4c98f4822258c7952366a8bcc72a556cea54edbf438c0a4895f48417e55302815496876b9ff18a29ffd37f78b6643b6db9296b24357464e4e041e42dc28f788bdeacc253fdd3d221313eb0e27bc4e72e5d31e95e2b8ebbaf4cf79eedbf37537eed4f91b0525dc7f3d1d2834f50009b716c618f64ca53d999551e4ffe2c8be6fc1e166b6250fb60d14e8781d98ff5ffd49b26698db6db33743139f8886285d1956e51756c675f7e7c056eeda1f12fc5690d65c3b8786f3c2c4a063db05c6d04a5235e4b2598d073e2d982ca1ed1c11f20ddd356aa95d5fc83bb51a41cb6b2beac7b281284d85125a2469804e5b7f0adbe2c353a6d9edfc8e45a9970adde67854fa1f9c0019434d6b8f52e2a07c9e5ecbbcc85643272fff597dec0098cd5807a1c0a971baf03222e1c2461a169298a6c59724efa53510dd7cc025a1a02d188d1a6bb2385ef4a6750276800000000000000000d6cc4040000000013256ad5989b98135c971befcce679420957cf4948914490c69ea1718e34cdea261e7e4908ba067b18ce45495f20fc398db37057dc9c507de5fe6bd6b0dc72925f031b83f97960395879a49e457db2c830989eefbbae82779f6da645b6bcfd36000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005f1565b9c65c7de4d57f58908fa365547919b302e935663b92aa9449b1c0a2c0105ad151d12df53668ece2f08e1933850223765b02803d6710d9af9bad165de9a5f4560a5903168bc5e3f165a2d299dc45e8b2298d261fdd0129d5bdc8d89c460e3df8af90a633c490c85b851f660d38f6fe26a81bf7e25768384a3daa0e98830302c4c27a276ebef50c58e683f69b5888e3d4d504f4c8b8d9866b20f57e8c2187031c1f102a6f149baa11ad8ad00db0500b22748ecedab3e2fc16bff411f05f54160a06cdf3a080aeaf6de0bbd930524615424455f37fd02d2bb4b80a6a2c825d6aba92f94810fbbeae417fed35dc570e0db115a5745d74f0bb895a6dbfd3d23d5cec0223186e5bed0191a58449400ff4db0d3ec3211fd86c730b81a84196cb1843707a031596907939921b23dc44002fe7d97e9083cba351f9ea1fdac84b4740dc6a8baa0202fe548bc375cda21d94d074dffc4918a5c95d5ec0afa66180a9f0a4d0bccc03020f41f8f6cb9ef851c7918f874640861033e676ed3b758f9e9f29c80b828da32403006cfe1ee7e3c630c127942c573c94af32a775664052ae5ae3da583ec51c6702d1a1ee65289ac3e64ed88b2629d77f057461ad2d259213dc7597f746504ba68bcef10b3ce541440cda3e3d0f2b907562e28dfb2fafdd0419c93f5405021564e6efabdb1848bc6e4d5470f44146f005c2c5c6bd0bcbd9096db6b964066483b022f8d29cca1a948c19aee6a286bc09841ad5d058c35815bc55ebd93a306c35228f08c0c4d419933a376154829b43f67a723a79156935dd5f11b45bd55be2e65ca0bba234f14dcea1eea509cf1eb5460be5527b5423adf4b7e8f028d49add5e5e066356290645e76e43950f7839b4ce5b0ea9c6001815db5875b0be4e7334fa1145ba0c710ca350522b16b423dfdf0369d674cd649bfe81d662e22cb6b93d03ad1f8778175427069d48d6b0723d1488d2655c9f3bf942ff6847ca3ba66e0761bfd4c84f581bbaf35d7db6c17f712205b0eb7e45d9a82fc4434084a110e873a13611479fbf1ecd86d582e54bc5e1e159280675dec3c86656f4cd4b17d7db362108447e37f99d00c4b4d6c094ac543fb0453440be11382531c5bac0b60a183da5f76e220a24271b9a31de4f97c86b7f05e9d33bfa7065b5c8c77833b0b4983e257f0f02fc9829c2bcdadaf73dff192fb0e19bbc6aaa64cdd4d1ea4a211cd734c10d71bd7786a5dc9989534033ff2d90335575cf13149ea2a74bc5c67719a2ff97e1551e385153970585b27c264ca587b7f6dfd588061356921cb6502cdec167716beff580c1d9d55b076ffa7cf430b45b575ba02eada8ad566d72c7069c0c0ff39b4bc9a6692027a76c75044a9a545794ab120310aa8010a2f9e97b6131afa48a294afb5fd0c0c57ad8e3f18e96fc4b9e0eca9efd7af65f872a9d8c71d1308b01642136c9d4796cb09679005fac29c2dcac35147117c17d94a514aded1e11efd4eefe84bab931f9b66af7e2ed9d96362a0d1eda6dc03e1563791ef99076b46566c95fcf19dd50b2cb24d6c342ba4c38a440fca77a33528a73ba005fc749815e6f5d7023eb61736c7db2b55652363d61a258b0e9331bfa9528096ad3d6433ef1e6eeb57d0a143bc964ecafac520bd4d948531709718032547c76677d0f9f9981d1d1a0db651d968a56a9f1cefe172c2c908771276e17982cf32f9e80e79553f2b52dce8faf59645fb64c6332217e0d3d08bc9eba3abecd913b774e90329db5c871ad28b4bfa6cb68b2b004de4039bb1b6fb63ce3ef668728861898a13e6891c379f7f9aef0cef62afe12ba091e68c8b38e02ea29b480289d10d9d64efdbfb36a8ef4e56e266716599a23aed9ca91813af1c3c8862c20a56f307c48d608e2a13aaa12a1298c99b5af1f0e78cff174809498921e9f2a5b83032631841544a7296fe211bce495af8dc13af981a1ee9a6f3ef6237ba398cc872b6c3386b3c4fbd257cd9fb388ef8a585b04fa430557cdd7e967048519764ba78cfc649bb73333ce5ac1ea26312df684abe998862a77fcaee20453def7fa4d07c09115742c993193924fb22c8111325f0ca29b904dd2993da0cb76809eec49b5dd699c1995ee7ab230b19b5b4f418dbbc6869b47b9847d20e491a2e48f5eb2aa96b40b5f89ad2d541149a02e3f3566e3de1899382481fd2d36e166f89b13079857cccb7c9100bb60b90d2e768c40f0d4e6eb13dd25c457a0d923c01f2b26f42ca3fb94d99bb3d9b86b1b2ce83d21be866ae8f5ccfd1c85978471d887f77fe7c8fff135ea9ce11d0f44a7d1409ecd7b4d47b47b3a2542bd691f38aed96bb9e6075db0e248893293c4a3d6945506c3d94de8182995eba8fe690cb853495e7dc0cedec776b8389cbc952b4d0cf4318b17bc6f4222c777d9e18de12dc5b31c04", "ac6353", 0, 1017031101, "55c7e467da4be3da8f21f7e2f8dec18c564091c75b37071164832059b769e9da"], - ["b6e6564702699fc4eecb0caa26e1c51099036b1702bb7125c70c2ea1762152ea00654296680000000001ac99be656a721ade79533540e9fae498d076ab7e3e3419c0a9aeb1df1f56f88a70ba50df2d010000000165e15fc8ce0279c2b405000000000553636a6a5380a1ac04000000000151000000000200000000000000009f753400000000005ab6e4b85f19e89e4e69e84094e5f8458b6ff9f8ce128b3088e14db90b240fadeeca7d03d1867e66c326da3baa8174eb599c5c4ff650658eea5d121479531a31cd6012b130a1595ce1a0e007e79e1882ee4ce9fb8536c930e9d000c8906bceb9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004848d62f11d6df441c51d6373a600e20fb417fc6c0173fc5a6fbbf37f1ec2edbf25b0ab79b69fc31b63b09deddd65e423a5dc9ef6c27db7cf359208a16092b248bb47e56fe95c27554bd4d41098a168c3bc019036c4149a3c71431f56a19853a36b01849cd00faa2ffbc8806253e9301d3a46291f83b38eab7beefdf8742542703072bd00b4c6c771c221118a68363bc975d2718bbfe1eeaee9b26e797e2fc4e45020f562ebc4fa1668d2a90fd604724188058cae9cb96c7f3cadd095d9e411041d60b05192b046e0aff803bced82642270be85e43ac36ea20e0a15c45b8750bb576b74b8b0826e91408cc441b88b40704adc970ae23b7c5f4972f8648386a4d45e30a0228a1597320f4c0ae98c6e4e0a7c48861a5783449bbe0af3f5d990e02956e4b7b0310c3af90091ff99662678dba5d15b2b998123b07360cce898ef567fa3943f29a02120ecb01d3981ad9cbad1771006b6cd36758d5d6019581279ca8f0245c081835021ad59be1a9f9ab7092630763f67e2d268c0610357ca1501584ff508f1610a596021b4a41f4d7324dddfba967716d346b2fa620bb96a4a414c1a11e5d605e2434f63afe4530de01f19483724f8517b6acdb0d8664f80f307f93e16136148fdccbc46641ac60ed0485fa9cf451e3ad6559785785a55ccea4c8198584e85441731c9a8a739e378ff89bad3ffc40219eca42526ff41d420420fbeaa35bf3b1a11a9b8a8652c971d558d50bca22c50fec7957be88d6b10527473dbb11e29fed1bc3e7dbe01f56d893a994f63ff234c524b0d47d40d9f2e76fbd3402836a42eded28ef4c16a747bf65b4327fdaff56f6409580e0feac875c5eec498256626c2282f0c3f6a021c4d58eec9f48f3df36a1a034822ba900672f5500d8e5211d300036695872a29dbc8128a061a73ec9e804c2355ea7eddb5586935b610628365c7da3f779585f1d192c8de58a34a47ba2125c22a67fba4c64f1fe9c188f1c8209cbda689bc76533905ea31565d50a985a9903543cc95ef0b27497aa09fb6c846c247d803c808e5e779a19255150afcec0563766c98060cc236c79e3118f06f66de2d0fdd1f4a24d63425b0675c093cba306ee4bf73a390457eaeccd3a5671527b24b70e1bb692e6d43c90c2ac3c30a3178092ede3e0810b9f28b3a3e87e1ec5c38ca4d576cca5e39cad9062ca27592e2542d2126338740429d8cfb5a4f331eb1c8ad714b44ec12b9a23225650513e96c9b54d9cb4bed9e4df2ad6d15f613a997835ec63e80d2c4b599cf45d31ce003ad1c7e94ec2828dc3c584282dee9d94b89b9e9bbb2e4387ee50fdb6fc274b07d44949646affa92ece58d06089dfac1fbdede08da89da35596bc94eecc4561e0c47969d6ed85a78536676fd9ce771290b154e951e88b4f09653cab0e9e537d6f380113781652d888b6bf21fb7220346b9b3c56f99fa5a5983f305eb574f1fc519953965b3fe59806fa4fda22b39a8e273c97921ce50efc8f2240ad6800bd72e42c06cb744295e0a912f88c9a04bb2e653188452f5c10bd502034ba81fd35091d203b9480678f9f3afd47ac2250d4e9846dd5227b4401e3104e16d6c9d5a6c5820384ccab3b9bdc6af8af35dc2e3776e6a65391c964284df1614e33a835f60f0d60341fe62a550e41474065b21ea05ce2c4eff4dd254135760abe51f917d8143d09b7ca1e3bd2f76734a7159b1330c91c2baed165ea607c1b6e3a5f57988a18235c10b453bae58566268755e9ffab2c0d795156ee367a73d79f2874d9cc1a093e5735ba52956bc1f5862a2d259b43fda7b8c1c58ba149c2dbea0aecb1916c08c8556b62294dc58b01a7dd11554f10594537f55e073909499769081fcc41b398b51f9d1e62c716c17aea5fe55d7a58d037345b691d781c2be273f831645dbd9a28bd7114e0428c06d9ffcab9bc045eaadbaf9e0c63decd4df547dd88329e89baf87790ec6c3e6f3a4cc9a3183531ad792f36f5f53e36fcb0e18bd3103d666c6bbcdb7930ee92ef089334ca2ff2aa0582db19d3a0c8af90550681d07df838fa7c77a6fe0a591d371441e57f04091745388fc8f2ee6d6e7033c3425d438701045894606f91a5ee28e45c166d7dbcc0c785b39ae691282910d954f3a7d502eb10c8f7a8e9075845c09455bef95ac96f23618ca40ec95a146e8a10e2e2ec01e40f2173e14655a997c7d4d3bfa47f2537592dbf5b598fd29694145fe4a4862d3a02bbd68f50c9ba1e51789e74f0a23e9b74a6bd844f5aff1845944899d5c2e3e0079fdb3efedaf1ea3ac658ea324f2c0500000000000000000000000062ae286fb3956a6a227a3e83556330e1b949d6174bccb728f87fd3f753e35f52edc01025e7a4227993b137412deb58727572b22cd440b26e63e23ab5ff43e585c5e50c3d100a6c7557e705978486602e1986bc397d2012e023a7cc5887696fe60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ddabd2d8b1c8bb6554afa0c218ca118f629487736c7cce84e0e4ccec90641d79fb334dc9c0d986bb85eeb6b0869492628439347ca3470e29a20cb25537cdeaae08baa6b5a37c89de8b823105f8c0e5807463f9fc21bd231266cfc93e55e770de5636edab4b130ca2c0ce8960045b86ab08e9699572351d0a05c7fb7cb63fa40323ad25446f4998bb668144e19122b875388639b85f9dabb08065c5199720f9310304db8318b6150af09cb8dbe413a7d9a57c45a7e120830490c83f6ca0b2cea2b50b028b504c976b01291aa2ce90457af6982c11a46644753bfdb0bb4c138b3cc1225345ac82abe38d69d1260a8f40e061942de1e573bda3ea1545dc126bc8cb7ad10218a5dce3f3adf3b7271cd3c7bc0b9c0e097671e1e070be3fd38cd35b5bab9631032c7a43797a9b68e7cb7786866dab716e7f82ab2ec7b4184696480ddf88985936022918a3324f0f2a422d2c4e32da4283b3735c96219827f17e9f848e98687cdc2f031abc49d366f5857a95690cf9bdd367814af64dab41fdde403974aca8e697473d022809bceb66e510323dedc923fcdcc780fda2b534976ad11091d4801a9635d6d6b9f13f63b8c90115eba2a3c804d8bce70cb73b0c2c78913d4a5a1085ab28db61c78474c68ac910d25ad6fb554fca65b8b1e3fe7721ecb04010a41b868b3694200ed8257716d7ca2c51844e88c41d8ec95aa38e8eb1bf650b74832a08c226223c9d957d11bf4183392f95e54de929c510ebb9a3efcec65154581308ee92563e89a5e77a953dfd59a9b993bc5f8e0df2bf1d7a5f75f66ccf11a6b7366b5646a857e2b45252cb48a48b19dcff77bfd82397d4457bd637b6a86234331e6fc16b1cdab9acd9901ab4a2210e2df7bcb0861f8ccb97495bd29a8f46778b8590cfdddea15ec7bd9c8bd697204ff340997b8dc29b7717fea8498f3546ebe7a342cb5645b134d84ab177971befd28ae141f2dda50c89ca67a11f41cd4e1815b7edb1f3f515584acd45113d3d29c4b81880063325512012ca13aeefb6f4eedd7c8e199227b2481346ff33d68de175eb3d41dac0b16b653a871f5dbefe79da0cbe0e2da74d73826c562ba6b06b9bcaf8cab53617c1df015db09d87fbb0552d7858389b656097a265da400b53d711c1b5ee8ef661a0b440cb406c5d0629c6c2cc3d8d2311468151bf50ffe84788f99f3a89aefaf5af9646299f2b4674e019c90d4d20612ed751ee961fec99040bed88f3c80fc84c34a39bf17d0686a77fcba0d4d0ef4581275352516e23af51a6f7eda9139e40f54df04120cf0184f3b53c021ece32731398fac46ab08ae65277e014fd06218a20f315711ec675be8d66877df2728f3606a2341a2d8567ce2da78a76ea9703fcb94df04c7ee26583c0681337a2538cca83d5411a7b0ff512a559edf877d9a3dac693acc3943c9db6d7e229c38bc8f161596bd60194fcc1e9f9b75144d1b48369e8270faf5b30d42fbc04acfa4eaf18bd6619e7fed0f0c28c63b1aefce95aad362885e1f88309cfa17af12538decfcc65706e072b6bf77528e8ece518ac970794a6f56258e3de52013726785f1f7401b122c8beb489e303c8d5446f14dffd6e16d5a62ad3a7cce372ce0010620d5d0b79dce1295739619616d6ec2c7cad887a0ed7a2ffd0c88b105948f6703ed2700523f68eabfceecdf6e927b715628a8139cc6ce82f6e4b9557384218183f60005841c274d68942003419fdbe0e581dff6e7240250e59422259baed25d5c54efc756b00ec79a6747a151f489e948b6703013416ee12b0533fc9bb98c834cd425d17db7b2ee6b6ff5476c81e6b7571b403d0ad7a26ee0da31346438bb92a6a628b686c1da18eac5b4ebf06dc8c504cf5e6dc44b6248c1a8398202bede8beb241f369894fa7a2dae9678bb6f5ed359ceaa3e5a430a113423d6e3c1bc569054f407f195b96b6e11c82b1536967d48851409fe150303a2340f0fbd2c730a7abffd1f78da55c5a1aa0722e614bf522788d2703673fa3eb57f2ab1398484362f90ecf23d2eda2f0ff74e5fd0e6b77a055ae9e1d9d919021c65afbe29da7b6957bdba9d77b47d266cdab4334c79dca7d69953e5fcdabf73490f50702172a7cc1c6db729abe4a185bced5452932d78ed5e3a05a027f47e7eb07aa7002f46e0eb3791be3a1fc624e92aa702928211e2dc19043370559cf3ae7b2868961959aae7e9939afd9bd1d721a4b24042f3db77204fd5bbd2af666c978d57cb71ac732bf05d7c847cc62cce5529ef502528748b5dd7fd5f7dad176ca3d5c1c175752128d3933467079e3f4927fbc502922c7bcf229588d4d274a097c93cbd25ae012e620502e709e5fced126dc449f615442a9bac1082564408cddc57429f49ae1a4b28b7b6d4e97a6dc893864312e03bbacb40156686160483cc4f3d6e9ca02", "6a", 0, 1351501209, "d135e60ab299fc6df85eea0f58ef4ae4ca982aa9edbd4ab683f29c47caf2e5cb"], - ["030000807082c40302783028683ba940e0c1f5d7be23f2e2be478b25a8c2c870f60b93e4d2c08eacb20000000009ac655251516a6a5352ffffffff7bcb05c7c873eb900c58e5ad70d83b6955fd009186ce0e8c2d60922cbc4c9c83020000000153bf281be0021ee9ca040000000004516500ac2108e103000000000900005252ac63006300d394e5130000000000", "005263", 0, -1740347357, "928f1882265eb3a2ddfa2092fb42b799ac8b08b215d3b4accba84b46b86602d1"], - ["4a25b56d03d5270d8e885a2608ab09c5985be7964bd1ec8ff9043af30fca0fd52ec87b45d6000000000078b372ff2b652323dd598bf525ee523168db08f4b39c4cccce2ce104d54a286e018effc001000000025100ffffffff7d510a46bb185e769490f6c2e74bb1be2ea547b80110d62af7ed272e6dfc91700000000003000063ffffffff038f84ff0400000000000d4c090400000000056565515153359905020000000004526551000000000003b58c0602000000000000000000000000c3334dbbe38cdfd5641cefa65607f9269def2d2791f2a43a6cdc4e5737f27bb3a619f0c294a74a4bb698a9ea653ca08bfc3b3db5b30eb3155587e013bb5ed1d21dfca76d22f37a22086bfff55e51155bcdbc884d3e1af11ecb79dfc313f45f4e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000616404e4eb45c9a334d4e8afbb9bedacf1ab7e2d4c7bb3b351ed5ff8098f27c26f4eca05eeb508f5d18262bab883321710a6ee45e5cee734a59a8522d3d58600e9ef93460b614e47444e26d3a76556b3fb15699ba1abc7d9bc546d05e1be2516977549edc575b5fc171fcdb1f47624c52d46f134bc7aab77e620c3cf7ddc234d0327a9bc454a718702aa30fd47e14f525ebadd20230d1f1e2faca9834400f38c9a0205b788131eb09a169aed496ebf387c6c710671cd1e93eb6a9c97bd8a93894fc70a02d5ec167645d8ca0b0014c3045087e77a11e1778eae41a4ce661469c40385d2ab71355ccd79e46f702fda94869a62a8d5afea3b04b1dea81c2c9958167beb45020de3b9946b6ab96a6597bd01893eb37fe29c645eada302a672f505cc41dfd52d032af7f1786ecb3fe34a7a4faada8ae3995cda97cebff7e5d4b423dae2a019d2f203210084fc25925471c8d6b7e85522aca4c9ea34080845e0f2fdc8500a6f2111b4022e327238a53a4dbbde4449aee066385edf66bb8a3b77364ac658b8d03d92285c032797df24e41911b614be216dc66a45f42bd6ccf2599542bba47987e238973511f7195fcc15a40bd592f6f4e9c9aaebff5c613a4d0ad4eb0e1f5f7c1781d74ae5db04b03b3d421c45ca3b6d9e762fc35817c4bd8e2dab45be8a49d956db7bffc107939fef3aece9f9d521fe669455a1ade92db8946a07d3559ccba6f8832da4b7488dc59dd570091373129f94054faa220aabf92fa5cab2cc93dbceedff5f4de53f4fc9dec93bf60b9fe0ad6f2ecbfea1b566658ffe61c27433290b10b8ea201541fbaecf8ab1f21f4f28daf96ea9a2df1f9f047504913984117229289c4a8f1062decf207a06e2c5fcfce0583675ff4b8f409378d0b2e04580595d65497dd17d9f2201757665c585b2424db2b786fe866e9a5d789636e179d04ae9cf4398471a459cb5cf0cb710b4045c9eb166bf4d370a83873eb73990ac630c99cb282541e3b37ec8b766bcd1bd1e657b439db6124e4c8668e60f67a520fc0209db74c700d3be88c78b50300b8a3159c9dca234ea7440e7ccfe3e58b438cb54e4e14bce135728f07a03d2c606fae60fc1ae96732153be9317420f1a90f1e5afc1c878a6fa77c4c49a1488a18b355bfa2e2a02d0c6377dc4087ff70fc7ce76bf1aa3430c0972880c1d8c23d4903b6c3b91ca8f2eaac2f3f71653b2be069447c3b186f4390bd24226d7055bb897067e600182ed33de6ff9c482c6f3cf8d4c51133bf88bb5db85078481773b0011fbe6876c4210fdd0437942ebcc29674d6e214e0c1abef04516249fb6253f5a85160edbc10900baa2b445dda9b8d53eb454d86def7f3800ff2bf5bee6b8835f58e3d7d9e8816cf93c39bbcf367cd1380549849d9b8c13c8f05e5371a8d0ef53184907773f504c9cbd8787b401185a89e2aaebd67d16ba6dec753dfe1c86c37584e67d14518e07cf463e5a0e36913ff6bcba7f52676f2aed4ba75259fef22dc885bddbeb0f264a0a5c9ac65d1146929c6e9c9f3692a08a04cfe3395a15efabad8dd3b5475fe88d4a527e0715f10afa83bfdc185390256507650d1bb25c291ae57ed684d6c6720c2effc2f3be350df18f5ee1f4dbc3291a0de86369915ecf6d26faccb99d4bd7af017bfa0bf7c8359d598bfd6f90dcad334e1436af54f50b90563f73f30acc3e69d58b09d5afbcc72c9dda32c8ea1f7be56728a1be5a973ab82544d642f3b4a61764a571c9c9e38534bed9772c34e8f7ed21bc466742c1d56219f5633a89ed3d84d3b6b4f3ca422ba78cbdd0bceb7f6e69aabd3835d118a181a8e92a00f743a125e1ad447fb78217f6d363b24b7dffc9a121f9172e40f29db498d787ac8939154728a3260cc7212e08e2c54fc4915fd3492124bf2d188b737fb99eae37947a92d5dd7f200a8c3cdb40b653376fa65f929496d72390872573cb3045c2866c053705a83511a9335279cf27003ce3212aa1b5b2f4d79718ab23db2bb5bc3c9410b7babaf21e4c8e251436ecb6425c4d69221b1e23059c78ba082b4a06d197fe228c24093e2b8c1da04dd73ecfb3fbc6e7ed71808144c816db04a7894349d07bd024243071aa9a973bada336211734b5bbed3caa7085412cc3ac3f77a056c5a04d9bd4937560bf260f8bbcd868680532848b333b7191442ff760cdc79af874502052994ddc1d71ed17c399e63a745dbca3c6a7037935adc34756234935db468d70c1f6f5ab42e1952eeb9f67fdc8757e926590d9740f29949a668f7a410bd3aa1141a3e540fd2a860000000000000000f0628104000000009e1efb0e2b1a06e7622cff2bdf5fb81211ae985d60926e9b8535b860d439b95b4a997c141aca813eb36a7cf2bb2464c951c21ccb7f517168ab501e9bab9c8fb2588f0011ade7eb2be264ec87c0f73a7de2eea4cae42a6d9012ea8b42ee1f800d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c427938211e871c3da16a0df22c523429f631d3575ea59e2de2a5c7c7ba92d825c518f453c048e3ab5b1859892462b31e639d067cd7f5fdc96730bed57cee1f8a61fb0ff147a134f28728f4e42c406501fa5a1ec0f227c918f022c784fc50b9170d0e439ff06298bfb09c2e6011886a2d47566af858f27b533dfe7ec66c5ab210310a44a9cd84c685d2d4db54e1f414990529062fb6e0d1ea72a5515a61bfe91c7021cf5781f51ab62f18514606e9f9732d432685ae77a52ed204471d74370db8b820b057a16bcdf3e0ba68bab3b43ae2454f162b6b2fd5b01da82e627ae3839b323f36485a3e9f1f641181afb7046f74cdceca08ca3f69fe94b817e7c07ab7fa13e8b030d3a3e8ed46ba2eb28f0e94898942512c0f7d6ba8df138ca69bbd16ae4a7f2d6032acacd48ceb493855572b7e2911c01798aedc40619de97c9d1699cfe38dc0a1f0217182259d2462c53b87ae83173c8547f5b4fc6eaf95c6fc7411773db30d931f9032d820f30df9a63e975715859e196b1a16b5be02cf1ea078da884736bd40013e7022bcc5c02b09ce42fc020a0032ae3a76de39255a926bd5522555d6983613ec4abd117fcdfda05ef7f79084c5f79ff69ea578dd33fa880966a2334483babe1d9644c5fae42e75b6232eebd87a8e28acb8ddb4bd242866172d368edc3b29e8c98036aebd9c744caf77ee4eec9a0b2fa13e070cb2cd2c4a97c78e424fdc4f87d54fc324c3d41d31cca003f817bcb055c4f902d2235cc134409101b8901d3be656fa9f11b614885d9503ba7c42052343cd30552d03a4b2f98af879396d39ff6a80b7348c3b7b06541d76b1cd66da314547fa316e6fcf8372c59a4fd1d06fd5589d2b751710e9cb6fd0f1df438abe2b6e3a1a8d9228ea0801b53a5dee6545490e8acd4b486c49ffe0592924840db2ea4f50f77516a1bd5b410b46e28750a1cbce7f71e1ed84d68eb4bc3a97cd394b9de98a810a66345d42c744df2c15cd9696797d914c99c9d32d4805ae9afd6b51e0859efd6f6e57d114ac1456bf7544b259173bfdd6bc2b8a308ae96c7638ef7bd069c4b445f63a25a3d48d8f4abe293e8c575e183e27721bb4c15a7763c15133a74683a150286db581a4b585c6fcda4566ae5270d6342985fec00c7cf49388ce5775f0deacf8511a641525bb2789bf9421a577e211f1b286dfb17bbe9d7f3ecded2807b43f03d844dd58a544216dcdb29387f7b46fa8b54ba60fd007e9100745336147667698971322d8e4eca1d48fc1c7b78fedc4915be64c4f1491d40b7c41956e8c97737ecc2469fe36fed40b3d273c2d9c1dee2e81c7e8e49b95bf011f0fa10e3fb550b2cf78e9dffd92337634c4b7aab9ccc30efc6c52d30c6a16da883753f1b740ce903eb3e276907113a2e3c4097d106da3653017a8e63fc93d3d8d5281f6e9fabf5ad6dc34b7510abe54fe32629c87285b7cc74d835ffd227ba4d03ced8a757293beb717f44a026ef9eee9546a435a6e3a7fe22c699fca44c658c25adb2403ab6880607ef277d979f0c26bbd413f0abc6d2786d105d8398fe4e8986cc99a9edce3d59f1833a81f97738169410644dffcaa2ca3a59c530a1332c8f3c6c4717265d9dc1f1612bc05addb52e4db7ff47dfeb902c1ab57fcaa6c124acf84da10376048d06c7556694adeb89c848d84784ca32f95ae793978369354da9fe7df0bfd829d85e245d870365a4f4a9952703ed23c53567b512b177445e8d6e14be10a02582bdd0149c256a38c176df530d2504625cdf6468015a487f44ced31b447d6d674fd27e59cc86615fe75785061f5aa44559c1fa48a858dd3c5d03cd3a2880c8c29de9229f0c145a236475b99586f8363a86715072893c0a8d57e3c48cbd4c5907f55695062455840b476f4363d48f117209e91f30a2adf2b896ac76ee9f6909ebeaae53ff2ae7aa66cce237cfa2023801d011d7b1fdc788a803af558c1fa8c72343f997192c7d3806bac1de5882d35305bb5ef5b3480d00fd902a612d8e87be5427995a6b0e4d2246dda0009a3863e93debf11e06c40a7a1c12b8e7beffd2cd3fc2fdb929c8d381db43e0d3681bbe5be64d4392c7af742f5a851c19059f4aa72f0ba2b686a541ff61bb554b3340b22b8ce1311efa6f501f01e40081ea36425e38e1b00b31bcc58d36ef7374511fa8b62c48ae177f77bf307b80943e2c0636fdc911d4d24d0cfcb881dd938c54948dce8841b73a6c5b4e288273d0349072ccfc2c90332de63f192e0c45ceb4a376472f6c4e22216dd3f2369c1fd583329a68cf7406322e0000000000000000fecbbf000000000089d8374be648e6712150c092249fa5e2009848a4eac2f172428102ee427340208bc748d1eba9a1c9217afe457e53591dbcf6b075de32b98befafee3b0ae8737630ddee511bbbe3a8b7b553e32db462dc077c1c68ec7a8401b3f22e71d16dd2970000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069c5cfa5426c0105a5f2f9721efdfda6a0a1652b41ffdd901b617519a42c287edd4d9a9fb66841ed8e4a930eed002344200f5b40cfae6e78432905545dd2ca057ba621d536f0e61a854b004989d0379e2f2868bed509336f6563aa31c0e5bdd8f323ce350f446896b03e9b8ecfc66ee871cde4f0dc57d4ded56b3aaa8dd9218b030fe6992eade3ce3d3ce241d0894450a4306290c1e36bbd5916538d0a71cc11c60305d862948ed28b5a2c5595b7789ce30194d80ab957630b0c27434918d522cfc50b05f5613a48976118551a633664308e520b0e6c6ce1bc1ec36824b61d200cac3900b74fb9ef533fc3ad8b1a3e3eae30b21ce617df76d5fd9533e9c7ad2919ac2703173ceac0178e220b60f8cdf01f51a538d4b9389fa0c7bc92ce056fbc36397cdb020ffcc31bab5faf681d410a4aff5634b0ab0f9b038b428ecfebf19cb794454453022c5df61065b62b732b7b91b6c4752bf5bc76aa78e697abc6a757c47d507ff0e2032a1216e5729cc645f3ad20fb2ec5d7cf44eb75bf566f9a40061a4ad0e29a6a830315d229d33ebf8a95b7ce1851d37bc6f326e8c0bfa5867c87b6f5759b6c53c55dd5fa8078fcabd3a23b582efb0f6958d852b499895aeaa7b3d075a72b920e1232386601d57dff6bb1f875a4a6c23be2b2e5290bfeb4fa622830613488eae81f51d154ae13e3137cc297b73038ec5f369a6741e840fe39e59d16fe14cfdac7b39078414778164a867c6ee13e7af2e82f09b7c5b003555bcb5c3c42d5d6d711ff5db93379ddad2b06f166efd0a65851f21ba43e5f98e2061ef098167745b9aa2ba908e4d5af1200e179a791ab69ba9681ed830a52a2f7761a0b75ad62e4e864fae7772375b3dc094710e9b7c326ded22d0b0912934e6babf9187d7e39fc034edb6fd7b5c773b7ba50649f9a121449e063c2669729426cb19d155bb3ef7772141eaca71b97a651dad2cb7e6d8aa06051339d3e743dafa1d13d26ae1eded0d6d3febfac0de594ac4d6cf9fd954cd51f3b5f7f01d794de2ce6ede15c4df9cb0544bf790004395be519a7c62c60e688a658023ccaf7067d4b18d3a94254dc6f862cdefc2108a8b3eef622426b36c873ba2a5af753a49e016d56d33998020fecbe3240f42a2839cd70c712b2a1fae199d129119e1ff4303aa5091cac157bbd41e8793ef1dd9db25747af6ad9b458cc9fe68a67ff532c72354cb5a68ede47bd84ca29b11c6811a256fc981490ad257295d8bbe37877622dcc03fcfa619d5d3865c5ece45c9103d4adab8993c52df5574b2bb8d340763c871933600c0e401a623cbf75d9783b4f412761e787c5b89f18206368ca910ce89444b922e83f011c61cbb42cd67e8ae45c99073e92864e31e4f84fca49fe10bd60c1fa00e69c0aea0c8609babb101a0c8a1fdb78deb1545dad4dcaf21d3f9478c1f69d5a6ab29a96a20bece6aa57ca8cda632efdf29afeceb21dabdf436d0d74dad6173c30e09e8209fb33bece4d17ceda1d27155bebf433e6ba31fea296b37a885b17ad4f5634cf25b181a6824ce5ebddcc51858b72566165ac0e19dda8a4c52972b96b3640cbdd401036cfc9320b69477ada41c6f898ca62d712cb0b94a8ab62898ea8721de1a9e46b54b6c0093f28dfa2038b0acf8f066e60d0e10407db96a498c1c7944ad87185cb4d402040e2946affabbf0e830d9ad841e5f01055e3308ac8aa61aaba404e820a8e59d57e664c3a43217ea21861c01fea207933a2577919f369df16baabe8d9f65d41d3766537c9f308af4b210338d7504c815a6531bd69f0531da32e87aed2e6c584e920424b77783eb4135a895775f627b4e23615b73b3b464512d8345d3590d883f123f3ad639f6d875f6f6a46b652e8ff91f7d5604b9013038baf29a722f6881b372d5b4da566bf759d44429b6abbe426c635662b2f9a6e7d35980efa29a611f38b36aad820a6ad0443228d26e91d9e1da2f391d1ac2e99b0516197dfec25fdd7c047b68cec413ae5cf7b11e1cc3f685a821557838b4fdf25aa7888c7c8b6c7aa813cbebcaa1b6952660ec7a041f36e80ab48980186ed02d2a48afb5dfc874bae36cfe8658727161fc6daa4856372b1135aa165227973688102ea80b93475472572ff42a6fd842cc3434985f0a974a31aa007441013de6f3448500d1ce9a67080ad42ab96c8e2b1ba3ea4b3a1d5a2741d61d15967439e3d1acd6259788c4c0fc3b63f34ed6d567987cd5aaa2bc1a6447eff448c77b9b75c9f6362f08113b8abe3f91f71edaeeb655da7a09c5e1bbd8eadbef836acb6adf3b0fe9ba2a66250abfeaaf024a5401eac87a1fcc208889fada33330e7964805108ea70be21337ad4587952326cecd957c8d7f1f99e6e69da8746e94bc6045d569aa3bb45f0b84ee484f808e5f5cff1709c272a548aab92ebc9eeb78ba0b", "", 0, 1675862421, "d27aca17a69d6be958e9240a988ef3e22e22d52de8211de7ac7d00a1833bf51c"], - ["030000807082c40303c65559687f938e97b303f8741f3dca85ad68ba0c3a453b31daee51d41b40a71501000000086a635163536a0000ffffffff9c3c1086a3a8e9ceab240a31de303c014ac66db8d2ee219226b26b672450e00701000000040051ac526ea9ab0b0da9e6b379e189e053853c72bd8d051b791096fb43d8560a7d098325f9a0b5dd00000000036551ac604532530155fa4202000000000565ac6a00517dd5a8180000000003a4f180000000000000000000000000007e17976359fea036ccc648a276d65f21df0e7bb7142687363b239c42b5d8f95ea43f8c78964bd10920fc296a62cf256857a0a7297b11ba4f9cea85002d527bb56f1a46a6204972b5baa54289dc0bf38abcf76704b51858b17b64907a1c82975500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b45fe3a8445760e8686e03598b847b794ad711d526bd83a1aa814551ca97feea132b09c3522523dc7ee17141d6ed58fa4470fa4cd6117d0a70870659f8274d8717b3155eeae303eb6b959fa6c0daaf1293f272e78bb7b42f0b3bd6a6cacda45472339f1227dbc1d84cf2017538c2ba22c55485e3977f8238078fb37737e19107032eeb2da463a4f3bfc922fdc6b38bc51346f00e7785cf5137c19513389f670b81032a08fb7e4390d7532259ee8e70c1839babacc88bb9dda4cf5b87608bf44be9fc0b02cb2df685d276ca38ec9fa7ef6ed87b886b9010554774daa8983c9499fffc507c725d1c4acc5c631c548dc381a586661bdda0a5de0fb87c54a1f3e68c94145e0302163e051a487e24ccbbdb28e60ee93e8c9ed89d3e69a7f6595342fbd1b1f9ac030fb5abaf7c0731ee8fbc15d3492c2c0e509fba29aefd4959b3189a325a82c6900201189a1011c501a3f413c95738fff43f417f0599050c9ae3ae2ea36ab2774f7f020190b4116e9f8a0a705cd94a15791aadddaf075aa71b3edb0f6b953cffbf5fc9030e18234bc92b6476a0f7eb0dee825f2592f964b2286cd581938306807b39f2a649f69b63d2c79549aef478ebf94541d07f1923b7d49b8e5d34658fe03690e08bb98370e5eb5c4b4f5b56b5d16a2c4106e65d0c43b00c3d73239f01cff306d189b2195393cf69ce08a04fa4190d54b9cea5e627c5e6a20ef84e938fdc2524bebc80e2d84250bfec2809c53751df15448de196ced0e6e1b18cdc5dc12109feaa64a89293aec39424886759f37952cd0a31f85f0ad37102bc93e72130be06312b56823e4e3b9135c09fd3e7a339385daae4496c43414f44519c13f3fa9297072646b2afa6bde6620646a03cb874cb6cd14337f437339bf3edd2b4e6c754abf096185deebb33d8597f2ee844a7acbc72b34e8a0061dbfe47051609d0b87491236e98e21a88f713cfd64fff6bafca25342bbd9ed1d5d793a100a6aa43d8b313038a940c31394ad05457baa96b6cbd44bd8472ed10c0f4e75a4c4eb4c60d6893aa9caf93880b8b12a790b8fc43cb8cefcaaa0635a86288f2d2caedc83da6aab6b36a6f5e42cfdc604ad0282f8a003d1f22557bd2791969db1a7ac2434f553c695aadf63ad9d16f274bc8ffae4cea286b8152a0b87a074e411e429790a6a5017db39b64aef9d19bc59bb3fea7b369ad31e2a9f8c59835cbd339dbca4abefef525375c7642c5a08a28d0335b834a66dae55151f09be26cab123737e739c58c91d0ae5521e23f6e74be62f0de1da66c912de083cd4e2099ae814e1898ca413a042aea9fec396551403fba8cbebe7c95b6ae3e9d86a9a96163f3d607a970a2b63bf5c56fa3f460edba4cd7bf76a6c753b0576b3bb532b9503e75f0bdd3edd99a6034c59c4d3be14aca2658d8c16c1b86d720217d953c92b64e95976c216692fc0dd32370f76d278f9216246bec0047c244e0fd03d56ee8d7b9b2c7bb4bdb90db429e9c4fa4c34a02ed2987bb236b89a83ad61b27ddfa580476403bf91513ecc415271130a96e40d816b154db8a09473248cd5279bee05c23b1f371a97b7e5b95cd4fba0029c623190aaaf5a6e16e01abd6543970e867d8dbd8b4ac08e14e4009b4e18699c1d56cd9b54160602da21770d367e0506b5517c65bba3398d7fd6a75fa7c47a07551a41189eaad8ff9e59f61687e7a2b0e1cf32dbda15049ad1538981d53346c6fabe3126f4118751bc633dc7d4a51def3753406ebeca0d2103bcba7010f691a9bf251541d59de7c849c89faa176eed709a78770fdccde3ddaec7df824d73abc2ca69fddaf6b2052aadf257e1e09f011b52a79d2a5d83a449ec8a1ca2d6f9a746f4ebe4ff5e1257e16da85616222b8af4d32e2acb76958f77cb574455067359de97a6caff314c35b44d1844de36e1f18c93cbc59a9820f2bd06dc349ec5758718083272b1a737f4fc2445a837f4c30ca67ad201a449208f47cbcd0b33789bc8bc6171d19e6e41d4d190c15fd90fbe85bd8b9c254f6344597d6b256062cfdc37f84326df72c17ade4868cc068e6503b1677c39f46b403cfea78cd4bbcf08005cf685ce69e05869d271a38991883f983ca2a4cd78fcfa227a18378f3fa3dc8e25eb32a0fac4be044919bd76c04db4fd6610ac208b45453c21e337cc609c466a150fa458b5dae5fafb4120dd0497e9aff92c1b7994b96e8235d996d2bc6b13c51fa338685b508c4d5d49661c78d87d3d0cee39bf45440cada9111aba9a9d58a17e9c98e36c29a4c48e9885d2823fdb4abea520d160000000000000000d68b3e030000000051bb287a40fdb056428a51b7fbf3bc80e7dc0527880570eec7c6a41eabfe89b6938af90cbeac53b843e1ae2277a701aa3d10a1d8086b785df1258863958a4de1f8d00fe6dc211b54a13dad1664724935de1c55757efeb0f526910d808053cfe500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fca8e32334cafff4622613f53048181e752dc776df2bdc88b32e33ba526f373383f3ff21c4a91f8e2eef190f6953e184e89d4e82da89416a26620f568fc9d37fa9a7f0f3aa722bb0da6a06e299062b9ea4606e56827e4f865833ca7a923ac8bf19ea1a9963fde4af73ed592afa5111230a83fa855ff33506a883855d9cfefe1903052d52cd6816c580ebdbc7a0959bebfa509c5341d768bad0c0632ac4a09a4470022e71129216728e4640577bd0202bc2dc2902385ab3ffe08d9484e4a7577204b80b03c86a40e3a3737ff779e3d8e4d0819857728f3ae712ce5f9a161baaa69b542951dbe3fbe0a9f9217d74cd20a6b2107ccd73bf7f2daad4ec9c6efbac2069563a031ff3a3652a2aa6752f1a75671e2bc5316cba582993e8f0361034fd79121140e6020e458b025b1ffe71fb36c07ef56806bbd2e41d794e2a23d7a6b580931d97992603090253b18d10d9ead023a5a35434e579151495c0940d52312e084a119192fd5e0210b459270e86c333bd428ab82e5e0a77eca3a114af7327e94fbd7fbd81ef9bc70323c3754e9f92d533f3856eb19917d3bb537cde000862343ddb34e7f026cb99d106f6f064304bfc169f0a5b83ecbdb2a1dcd9c9dc08b2b56cfaa09c91ea6bde89d401401120fb88ad88d73fb3445df59335ababfa991a9178b83d5a2e1c8db1d1dc7d2736f97c806f970c3c9f7e11d484c1f9bef8dc59a3fb12c336219a2dfcaf4a2105eb6373aa50dda6ae57edcca3a548ad06bb29d507ce0d69d2f4359957bb219b1d5136caf23aca9f20d6df2f0e0d781db86876cfc589a28e4512156d7a4a6856ee1a8ce20f1162113d3b79ee4fd1b2e30f520bfaee1e89c83216047fd20e610638aaeaf58ccda45b33fa34a20588eb485a0228bf2f2172ed0435fc7e01cf55d53e5388506b06226f223f9072d8e9239f48a68c51aaaf7a48988ce6c9d131104cdda7a4d513a34ddb842abb08674a6c7f00c842941ae557ffdef13029282342afb9a70808ec9c7ce4cc726e3ecdeb6da0848cf4cbbe599d59c4b1c06fcf15672dc8204b9e122efb7849a3f0bdf6ae445bcc450a9df2f33b265e4d661ba00c20b3e8a32b06072b5705affeaeec736264140f2f3f281d14bd7fda2ef423e234ce3e7a3510cbc56e8ce42c2be41c6c55df69ae9ddc36de217595380c1a0c351091dfe2dc37f3f7bc44d5e328a6119474e99857d23dd519e7cc6b99beb25bbb18c310dda614d7603af33d1709145274b887bb9f615a0df33bc74137b9ddb7fd0b4da180c7b2436e6e3e9d69eed7fd99a468b68f0586f9fc90f1653599628c1497d2c69dcdb56ca25d402fa30f4652c1d3cb055db37aef5f4372cdef096cb9f2bfd0e7d7e64e6cf66eb6d982ce25e206f810bfc55b03ba9d5441284eff4dfdabf506b6fb44a98e0cf8802b262e4607d7141ed707a3f6c43938edabaaf3cca9b003a5f5ed43b7e58360f4358450275404565668b945d189c36af7bff947d9ee890027dc66728612cf76ce0763024b69236f4620cbb2d14e31bc6c5ed88ec47e0d59fa31e7a2a44653af9553a264716a804866e883a93e146bededc83daba4414ca31399b68100a9593e24a553c41236bb07ef917fdbcf6fac7bdff736b336cd16a468cdbd1edc50dd98a024541b6b93a37e7861eceea667d3efd5536bbd44221e0202c2b62af75dc573896ade5bab2f48c2140ebb75cebdcbe92164784c0f40e1b01de7757b026fba996617401ed5b5f393570633e135d47227874de3af20059cad069ac8e65a7c9b7050e89df8aac0d71c2a967789ef1dd18532be17e55077d35e48c47fb8877977eb4db90504d5eccdf3ac0b3cf3e2af095d24c6fe917e1472a2ff8b15c38f0da0f56899139a8a02dcb537152192a9314d8880af35d40068bf8e16a1e14e314933d13009c513c8c55c4fbc349e006559a8b06b600b8c11395857cf0ba899c9dc71e2a125710e03268a051f715d69bcb1345838b710e620c31a7431e3888936094dcbff3900b05c83834ec6f107d59497c9459a9e4c0d4afa24b4726939949e6d838e19829da4182c9de09cfae809d4b1ee34545244dca9169d789680cb0bbdd37823cefb824973126239dbe4d0b97be2fe3fc159a02eaf6629b7076d77af85763f9d3e5b67282dffa4e05c12e8af49c1bc971fc15a82cac2689ef2eccd18fdb0e7e85a08dae6aad5dd565bca5d1e0d7d564cce84c18d88f8c834c64a006078640dcd96ed8d18c6e1f0143424501e4f2b6269ce22254bbb52d194f9fc78cf1d00095a6ac8d021feae36f06d392c9d330100000000000000000000000003376a63c9d441c8cfbdb7a00b2eee326dc1ef9c4167506f4b65e5fd85fa3a6e3ade1badb21d6932653eec6ec22f61db62c762c294eb3e9905f8cd08d4914d32224bdeeaae0e64a529e99c926a4e1fbab285cfa73d0c27fc8cbed46f521c4f4300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000706b62c6268ab69c11a62931b9e5ee0990bc06d904b0278d56f3c1f1b8885b278ce4ef5235d711bb3b57614a4a5d0c45b99f3f7af7cff34da5bfd323ca7c32d72910616e7bcbe242a96ec388d0ff097ac7417e55a37e54dc8a86fbe555fa91b0167ba2365c1bfbdbeae2ac4eb2a252fee90d5e90a4a8ff5936ad638dfe41017403072aad78abc13ad91270b0bd0a688f2af8cb7cccb4e425f8099e1db0af64a03903213068c4eae8e1a947915fc4595392fe25e3e418a4f420d056e37b19f5536df70b076558e3a204bb2fe9a32046c9534da33ef7c2476f0210350786f4b5fb40b2f648c2994819f704782475dddd74ea7583fe05cc94e9cd020fe09ab716ae938f0d022d120898663842b34205e90940aca5594984490b9bd88f740ac50c1536d29b4c031abba7cb8adf6b710a9ef86350b73324df18c3827ab1f491d7d19cf545d9faa9020afa20319463ffe2ee7b91e11c6e36ab140a11d8e7cf600378b444d819af1fbd031755ed7d5ee5daf1d236910849e2f861ca95237a52ee0f53c748d36c815cf20e0305e3f3fc3f9938f3f2f0c1dcafb90afb63e869f619645a6f3cd4a9f200f17166549ba3ff2782af2c647ef2fa60c44d76c407519b91f6cb457966398f2edb87671bb9cf33965b8892c766560a18720aa367ba8b30f778f97e29019a86ddabaf689db137a50f06d229f745dd9dee7e466b73e5b03dd9ac774f23ab61ca811b3213af56ff5e85b176e8f2a648ce904520bd58d1422447c0f2c84fc71d53a2fed3761101a5c802e80b8a99b9452898e2f35f9d0d800a574ad7c1a7212785d1f1c34ee2d605364475d7785a8541c055ccd60af9a6503d5f7ec53aa951cf04d45532908d73b8f839e55cef581596f1caee67413afe018f50b217aed743d42a690978ccccb98726afa6d1fe75f1e8a6df27ca936872162081818f655fb1dc2bce16dccea86e29ff9023590ba0c07077879d98de53d5008f81338f3e58eb6bd0388b5e26a1b8061a9efae74471ac8ea0f7b0b7fa9c94f045a30652a80476fd08114c58f1932c1f7faad54f933b93ea23843c2c87beade7f2d1b1ad98000d1e54bd0212a610742b0b3af568807e81c5f3296188ccfc4acc7bfd830721ed82b7167e9e666f43a78b0048f8da7e0bad7fc99facf244dc4f4f1e90b056fab36eea5a45a3e0206a6380086e2defe3f10c89bab4cfa43798faca9a51ff109a77d75c92502226474266d0550b2999fa5ed8f2d00c852becf060400b97236a68aabe6def2a6c2116499b1395e0a1ecaa2a19c0f586f4323459220b9f5be1deacf73c8feb105d008aa0fc06951436b01328d922f6d38d808b2948616519b8106824af7ccbe8b64bcfbab35b4242f1e32d978f7291d2ed36261c3214f7b287a0bba4ec6fe256ca6a0793f04d38292212328d0da5d45dcc4ce8fc81f8b8f129abbf6d945e5d7883a49b31d972a45ec6a6673621af51cefeafecb34fae75cd5832da547eb1680dff64cd0eb1b5e4417fb124581239a8d47f1a8694bcb11ddd9675081f801a41cd7cb8fc747278c6257fb4954b365b8b0c6aca68e307c8a6f9a09885a05b2a344954e408ffcf85bde03920a405b6308dc80e4663d1ee822d0b75dc2faa9a064c61b635a2d2015dee99e8b1a54cdd116c9d758ef8254fe8ba99755ed36d3f0858625f3908279e0b949ba9657d8970d13b197e7ee80b5c9610f4eff00459a1a85817aa86b52726f06783b266c41c32ed91235fafa7c7f593c91135973d411ecb5aa10cf8fb04b75938d38913e1d0fa8d48e06aa1dbff3096461f31386be0e621c2c41459326a305fe201bb14284b46a38f2660a5f6b0178a3d9c47ea1e3f017b4f0dd7d2fa7ec1b2f8bdbaa26180da886dc76cebf1b590c33bbdab013e671907125d30fb2b08315ab0826a0b3b694bd27db86f88a9995a352ee84777d1353d187f69f427492ec5ae857490cdd651ddfba301ff9d3b610e8c90cbca5b40c8c727d4940d284ec4ed3721978b5b6846bf6d7d88065570b74bbc49660a6e57ddc1fdd7635b4904e768b86efdaa4f31b542eb7db3bb3cf0a03ecc9d6119d335277bdcf83f4a13eab5492c3ebc50a85e3d76e3ca7365903ad0f906120515dcba8e29fcc095b4f8ba3c1898e6ae46c6c5fc60f417f12296a9bcef5b65f2dbd75ed3941cadb21d93b131511200d64632189f30619a068b76190ae4118ff91800fdb39ce51dcf23605e3155c0e4cd8f35ac9eb66fd3943c00218a02c54acc28e052a5234afce534b745989c64c164988ecb3d42391954fc46c4398fb0090a76b52c7c1402a0d272c54ad18a81eff45e7c5741600be042b69efa6774e000c034a195813c1f641ac37e0e29b5c01bdb25541e9f2946c671c1f4b611abb61545d327d0806cd45bc50e1d1c79c8611c9844e5e1f01ec39daf5f3554100f", "52ac516a51525263", 1, -47445915, "f79e2a7a2275be70b1dfa572010be7e10c769815d870ebffe4ae3055bb046044"], - ["030000807082c40302e72828d38ffd1b546e63ecbcdece672b2a2a220e5fe0996cfbf55d0682513d350000000009ac6565516563ac6363ffffffffdd2ca0dc8a1ba5404d837605fb6b517740341570078d5f001a64c126df564a1b00000000056563006563ffffffff01a9de8702000000000563516a63510000000009a28de401afd18c000000000000000000000000008407b07dd4c5fb99c9a8acdf1133e7d30900074186665acb5ee595e1cd7fe5453f2335bcedcebb8c1a29a4d75ba33ac8eb1a0bf8df40389f56fb7d9a70a21b524c05b3574f1f1f4c18611e86293b8c657b7fdeb4f8388bbdca1648da216c046200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a820f9e4918f45556d0b3150b0769b013cecae7451c92d16c07f01ab44962b1da101870777b4d7933005846d7ade3f583202ec02a8e3fc3acb55617a0aeedda3f5d289df3104f25f0448e10323acc2d5856f5e663881476c20c163118b4981178a664c9a4b6af82c48717daddbf387ac2e0a89251d58a01e74b6ebdaea88c6050206384181d18431f44345390e9e073d0d348118438b8b09f9d1ba50e2329326430228eca69f2a985585dfad44ff6fea365bce7252d5f8db68bf057395a60791ea3f0a0538c11ca9c7837385be8cdd5174401fe849b51386cce4dc210ffc464a2e6cfbbbb7ed8cff541dd943d2b772d512489d7836b687f2ceef2952289b77b193038f030a81c87c4391f79421ba10a6862aee87c043c5394aaeab59eedd26949b61678e0309851eb9959317cd8ed2aa5f5dca7d8fad0d8d4837a2f25e9d71ec92d06e506a021a39a9300d571feca28328911b9beaae33eaa24c1e734068441dad149e4110770204a1e517f00d600c91ba8fced9ba59035e7f0cd574512d68100b072890017117022590fa4ed2ca8344f8e06dfb9f6c6958dd59144239795519f2cb2f5f9d002b9b20ea491d57f507f7841e09a616d2f99de9c9b96b94f02c06b61c87997f9e7eed7dd773fac6fb1a7a7dbfc45fb89c06481e885577b73c4d33af643d674b9207df714a156c90f045033dbc9a412c83075d7492007a23a3355428614d968163ebd0a54926c8f7391b7d8ea79022df0cf7b88c936a1c3eb30ec0c12849e87e52391a027cb0f459236ff3a1cb0f361eaff6b4508fde925f20ec426142ab8f70ebf9c72bb6af1f28b7d02bf55e8ca5c27cd3e602d4f663d29052292605ce7250cea144a23064f233bcdd76a3162d1bd2c46aa213a0f7f00ff1c2d3e4ab0c184457de268dbe16ce0fa8147417da6713611d99e5ddc985cbfb2ee3bece4c8b7a72383a1204d794afc4caf9ac63c9d9ed148af6101f082faa2e0b8b20a6b7db85be878806927dff01ea617e965c02324495fc20caee14b0d568b9b4a510ddb447d8a22aa282377d2d262f3ff1ce1e91bf0f6e9451aed0ab7ca812491b6e2642b1beccbe17ac3cb672e665f27a8565dcf3d1d41c691ddba7d1d31be76935fd771a6ca8d35c6a2e1005fc9aaa0b34e150b1e33c017a50de54f27800ba5d2a35f019b7b1cdd172708a92799ed541332a3771cab6c41331ba7bfee113ab4b0e4541ff8d4595b9272a253a39b8d1c76fbced3c04eb6f8be2f2899b014d0572ca174dcf5ef0b499aeee9e5ef21cb0c00bab14a081193a93b52537f3241d04a50e3874c958b6099591dafed640c11d76e2436b8fb8ea3ddde53a114eeb8c5a58e97476ea664c41b2747405b24c1a2ab7ef6f4422f6cf315d6ae96ab2bad502c1013f30ce262ceccd0dc3bb070b546829459449b0e3a7e0dd498aae2815f12a9f1ebcb1123e0de5dd0fdc789a8cb4c30010950d49fd2522251a07eb705cbaac86712381b928698571227dbec865dafa77ac84a9b6d517faa0dff4dd5ba7fe06b2abff281179dba64a38f53f1d0205c7387fcdbbcf652a7aeed3e1dc659e09426433fd0a943ef3ffd51ca82eb1bb92e7c46a659504399a0516540e58ad2d4f069d9cb0d5778de17eb743a635cce51bc5405beb95df6254eef128b0ca00839f19d9acbddfaa593e6c3ad151cccdf84918d8140cf81ba19d8b430c94478e1154d5e4cf9bb7e7e71a4c7ad802655af8fbfd0da2a5fca4a63875f7ff0d8bfd2f9aba0b0d452e21164d0d5521453b8d782910f91f15c858d3c96292c740f9d8c5c0d978574b5451b78e16f607c8fc9a90334a4eaa8de5798a74280ce4989049c2176dfa78226ebc21d0ead06a13c11c1b1d11e9f4abe5b8ad7e40e4ffb803383a03bff0cf6113dd1befd52e8ffdd57f72a9520c8de6bc129207cf3c5a3a125c906ad24b149969c231a20c1b9d403f2f5d39bcf5167a249612fee01435ccdbe756207218dfd1e9bc7337a77dcd9ab1bc8f383d340892114c3c64edf3146fb5446467f95363ca2eb8f17dbd54b17363364b9164aae17def8d72eb207088ef3c465b0c22fcfaf9548f1847d683f469b5583da335992564a99d09c5a88fb4b89892fd6e56e4d6d30a2c4947fa6c04bb8de0f56bf335052f7e1026d2bdbef56ec608b8aa20ff6ea157f321a8692278d38a46872e40fc4969f8307c361eaa5394f3a69a8e96ec0a11768ef903858e6042f97309c9c1a49a82f5c01ae5e485d48af8ee94b8e11cab9e3c1da64796ac07436bd13123d63ed43f60740ddb8dc9a4bbff72bd8d2fcc5d9089142864ce15c40558ee950660046e5802319dea7ed940854184307d460c18ddbb599130248c7358c6b31ea4f3e6d68467c022c31f04ff549639f6096c68e0f1ec00499910503a17d13fcd2685cd1940b5cc453e8f2d9003", "516363ac0000656a", 0, 944003208, "d6787e547912c8a2493890c0562069b86b58a577ae5905e4b5e387efed1571e8"], - ["b6a09b5001284972a8d31ab5e901224afc7159d62deb927579af78be5ac223d513690a24aa010000000600ac536aac53ffffffff0191880a040000000000b9f3df2903ae261e03000000000000000000000000147f2f99284eed0b971b1109339c79e4b06a1854b36d85de490dd6cdbdc064d244cb6b3878d820eac5894b40dc4a9743ee9eedce47aa9b963b88a36b73d44f86ce78ae914abc37c8d6d6877e29dfa81b1ae719c03b43d486800567984bdc0ed800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000966c9be848099d874f9e7fd8ff5b81cb240cb69ab96e02846bdf612e30ef6b55e64585435637c9fd04c13dcadbb6fd42941441e2822593c4ec77e1856a0cb08cfd536d96db76205e1fc7ab7881311a88e7817ea52488a5b12e717bcf0bb0438c358220f9c07329713a31d389fe56ad0ce987e49cd61da0cdeca19213446f37c30205bfba4b8cd2b259be4536560aaddd9e4d1129e441a057f7028e49ee7420f2be032c8bb61dfb38dcb50206075362714c609c52664f6140e48670a0b1f93b2dc83c0a068650815d62b97ef3d61eecb3a26ac7efa60c362a58b19c9008130c371fc9c8a58d2e8674590ff1a977a91e2c363b8075ceb5ca4c0508bfe30f9b3123385fd7020cf6bdd2115904837820e543b2f07539d0784bf4f4e28e72ccdb1b2620653b7e021352c94f9d0c47a27fb55867fa5065da9940cb2928747af8b1e8823d9564e8af022545300ae87da1f4f786219fe4d4537ba7a09cc28b20f6eb68867641a36a2d85031391d46dbc1712c1ce460657408b037047ac67d01e1855a2702f7630dd01e5c3031819e11f283c4cda6b7c3ecd80598c27b63939d4307cb9d01b92197f6c5790767d5d88140ec4583155854bbe689c160a4b2efe5f1f24ae6066b7b67f89d37d6cd422a19a39c6623fbca24ac6f09abb255e403f454cce04bf25dd818b3ebfa3689d6cb0f141e71d5efad5452f432e0f9516c67c1b625385f06b967ddb2e443585f71e8d78220c92ee6c484031992a14b61986b614e5d65e045cb556619bf63a715fef7fcf2b1b59742c5e6bfc0380dc114c6bf4718375838aec2e61aa974de532ab4ad76cbc62067c92937fb261a836b213c487c67fe5f08c5f6a268c2ada0a82359dddb1e29a636e4d82f8d7c36dcbad2adeaa2fae649dcf9b806d5329417cf63bb6f0b0600ce5b597a20c2ac2c9741c142fd90091f6da4c9efa3d644182523bc94719083c66dd96416f8d2bf73cafc0efb5fe1c0a6d5c1e04cedcc85db5fe766f44d11cd7a00ff94fe089df63fe15c2182cf7f291de1ba274bae299915506581e742c402b6691a56679ea7b5e294b0ee213fdad6b90adfe1e63c15025d57e45fec7ca271f24d9d0d12d27c50a53b682020f92a371374804fdfb1a1b39924b04104627e694e830777d637787a69896891f028a70c50ff05992038b2aab479a77014c54934638617fb1301a7ae9a03730c72bfd119feafaec6ac5bba32042d2ca664bb88c6823679c64741c318c3c6e5cc53a472913b8f947a7cbbe4932bd7a7badea587300ce6244ae963abf8a1ffd9414ffc7693dd50cfada87aac31a9d2643c2d05a4cae5dfa1231528ee0938613461161b45ac31e416e43280b1fa7f16397fd1acb5890e46c13459279c6631f9dd464b5931764d7e54d2469cf86e436fe84e2d69465b4925d36bb3841ed4867eb6744e1c30a40d5e7de0a7965821d7b55834aad9f1f27250d342c27a995d1cd6a062341e2365e08437918b9b74d7eacac71ab026238d6513510549217680fc4682e547fb06daeb5c4a2ce0939597dae96d0a213c3e0bdb10f82d6f956b50d1f03bcb332903b3dd7652f27e7203b839be9ac45890899f5c539cc7c510d56c03ac733346589f4b598ae7a7e241163f794cb66b8ca7a37ddfd1e30ec9e7c6adb2a205508314abc05cd5a5c2b8e77c046108abaf5aa1eec0ba5b3ef005053a5e1eb646b811f7d9f534b3f6d0987f9f14011205aaf16cd9baee4606b221bd8dea85f746e81c3f44ac949722bc42865515636f98081e2dc853649a13ee4926a1672ca50c2d7eadc3cd59cb1a6840cfda9e9e92befa39f30870c88fae1d117d5dd89d604ea313fd1b47aa3777e03425bfbbd14daa83c968c7f26c2b887bb2d087124c9f0cdcda4b160db8fee48bffabb22dfe750917a2338c666cba8909db3387a695b4e3c16ae366fe3a3b63d272010eebf3748779d3c32f293e3163c0dc547ef1e073da6517f3352ad5afb519d826f33401faea4780ffc630ad0e52ac203a92881080a3883c83ec744a1a059d33f98560c452820f150fd4908772a0ec7aeed181e42f61a6d1ecdbafe16cd0355c2d55f798c32a5fa5eebd65ad0be01660d59697f204bbd9f6b817f79ece3b5d6b0e38468c939edce84a257276ee873461ac4136f87771b597bdbb1a8f12718401acb06fa478470cdd591050c7504f9de0de85006b5ba0c27cdaf58a2f169c093e80be44613a18fe7c62a31caf5d14a66045d0672d07a7c006407f126efecc0f3827fcef2b4b58c02a195ae72d88384bb28a581e10e3c8c95500000000000000000ce69a50200000000fa260d7ea8d39897ddf506cd869d6a3a9b7ad3328cdb94080670aca847e6fd3ed060da028fa323ee0d78c71af127fd29f7cd6b7bb641afb15bb3966cd6103ef0b32981da49eb7b99ec2978907d0dfc08529a33b68a3d7987381a5545551252cf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006db7518c5786b12aaf89b37c76917cb4370e92b7bd6c26f274b95190adccecb2fe06b461a69e0c7e3dccecda761e1f09ce7d28c63c47b5d9ff82406692da0b4a031760a5e910c5b74980b0b9163137c440eed796aa0dbbd3caeb647d2ffa0aebb7142f77cb8ed16af3349d2d8f3942a6d9ce4e0b3c0eea80ccbe5d0cabf0d3980215743e5990be33252f4295f1db8ab28ad3d1d7f1932a221c68ca7dafd418b08e0225d89d798d269e72a7ab35e84541a8552520d4c9e01da4759f858fa88cec16940a0781ffb6d938c22715cf71bde119a3125f457d3684c1a72c8aba12060a54035674120d1622e7f06863557e391e192241fa5ec4da775cf90514ea013e678fe79c02112f0067f4fdf0feac3da4ffa502dc4742da0e983bc2f34afc8dc1c2e3fb52b00310b23fcada301b1cfc1182d1545c0eaceb2b560b579cac2ce2418bcbdfc11e40022c908c2c1c61c1f2e08f67e116ad08bf3fd3f5b68a2ff410abc18064d237d6fc02127bf1d627282d82cfd04926441e5feab1f355b62b9bf7ec1a7cc5c9929eba6c03149bfc3d5a76d6ec76db503f3dbeb3d3735c0a215143ed50a0fe2023599c57d840541310fa892c77d7009b1f96c87052e367760f047bc1ead334f0ca8b84b701e5c1d8771517da834eba6877c011c7f692f90dc136850c51122fc4d706fa076fb804589ec59c8196c9b9eab647b877ecedd37ad0c96835aa3a2158c4bb5e590d30d60ec4782aef823296412c4545c34d0fcb7e40330e06f0c32b75c56ff76f215f8fd7e4bf322c6eb29879f8989f719bdc2e7de21f3464ac4824ecab85fc83a7689b19cc6936912351f678e2f7fe3da2ff67833b8f2d43d4ce0866fdd0fbda309cce070d818bf7a233b79fad1d77e545abd53f1bad561aa145da5c5aa62d99c964ce4dae9f01bbdc914e96cc478cc3cdaed672455a2add47b359ae0551e5510184a27516cef442077fb53b4889d46e76e8598dde04f9e7b27d01dd4b74869f801e093ddaae49e04e3cac8c072655f67ff811639e4714cfe685968b922d701361af515c5030a38e63d753a89790d4b9d8302a2e79dbef4c83b3e8cf53678997ee911ddca8f0dc103fedeba4962a06a3b6580ee6acdd2ed3d81889d184d31e9abe4a2405c10b94f843b738dd64774c2e9bdb1443df5b99cf94fa5d493e4f4052af7f30eb633e2f184d80dece9d1cd4908a063e61c26cbc87f7aa2157ed90ece1e844e4576a1c521f8258a5990ce7ff2ecdb91148a5aee7df70e934bf4a801335e53c5080f25c198d23f39d771fe9621009d57373e8d3fad718954faf27595429ece7a8288a2679e8f902ec179fedd8144ecce8881dcaae57021dd0db23fa83095b3ac70d9a9d68c3e8faac335cf3867f8cc59690a057fe2938f122d87a0d8d8f41ad5365cecdad47fd4c7cffaa40e0484ed3f60e1fc9c4837dd3136629790835f2a9d39e9e0229c1a952b1944621176fb91dcc77a93db78f6aba860117b01a9ad2ccf474ddad445793186dab24e8d6511de098aeda7c70b72190958e85b02d34b772b37b0e2c14da9e0e59c7262c57ac295d0bb94815d19822ab4b150763958a0a15d25dbfb01622dbb8826df40f9de3b522afbb681485ea3cd84d298cda8eb02292828850d1a7fa1be602f79e9c3aa5263fd6e221df6502f55b4c8625b58e2a916ef82725f8332f8517733185d79201d8d803b90ed44852c00ca3c03eeb7f3bad12a3df6922703bf16b0d901252a16040e94ecde1f933841d2dd2de48d479e09912f58f14cdc0959623e6f708cef03e53d1766eb3cf09586f4df0639b3126f44589d1ee42a6912d8c93ce90e6b484a51b924a0e2d001b159bb373c73b93761841712a92da5bd8155c385695e4b6e520ab5ce4808cb68bef49a43646700c2be9928ed62c6eb22db6909b3dab1c2d92b7f4223ec25ff3f0959de83c4e177b04a80d824e036b6818cae74848f200b3be37e00927db5da624f33bd3d8332e647467035693bdb2e2177d3932ce2d907684740c929f559a81b890624bcb82474c4d4a4dbcf69c81882c1de9a7cd470a021244a7151b8e30ffe14b2e4c405e595f9f9346d927ace8d29e57df8a6310e1b4e1912617cfce8d898d5fa5f0230555781d0a49e6960bf3d0c933d980998e8077ce4a40a37012c16252dca4b702b917bf0826a2cf507c5ac2ce3ff24ef4a518361dfc9210de43393546bf331fcbd22c14a469a49b98e7d19daa4bc368bcf2278350c9e3023df4a4114694f1f596b60341e406a40d117051d3e14d87435b116e0f2996ac92ccc46245030000000000000000000000009f75e8a3fa50e075bed5b53e37c4adaaf3a58326dcbb27dcbad3c1ac167d9d807a303b9281cab7f7a91c39b2522897f8d5246707aa4379ca0e896c3368d0c15b63c590e5b3be50789779fa8098738bd8985cbd904edf69cd6ec79c2986600e35000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ebb57ee7ae82a6ee7c58d506c787053e700b576ef4649e5b3ff9f05b301760122074c690043fbf362f52ea77a48a6920ae88183efa5256cdb6b3bd57ca13bcfed8264b648e96ac2fef010a1177d1abbfbc4505a35cbb339bda1e6aa5f6f985aa8a4608477d8255e1abc85d7f3f5951f967e72da78c08a7b89570fb760b53b01021c7b3c71b9dbaaec5c4957e06e34b4c3560e6686d6b56c06ba01bd65fa1e6357031d6659d954a45c40f36f256485757b0bd382137673922666b0fdf956f0f3bb3d0a07b61691d5986471874f8c7d3fd63489a8d817f2effc4ab2d76eeb603968df568d0d25d99920f8be2aa760d73e60de2c7e525eb2f94f7428bb594cf903b857950304a755716c2a336cd9a35929fc5d1b01a1824eb3c5dd204a9ef5209a461e125702050ea69f79b235545b2df874b705423ab14e14afe6dbf4c280467d2233d83f9d03044f99cc89474c3c715133fa79c35ba8a5d336caf96223cfab1a973dd4912698022a09406157f545830af37132a46620a99d90da79acf1035dd97cb3447bc40c4802201f0b46d5684804d79b2a8e38115d4a0ab1ebef1873f8c1f37288421e8a0adbe3364e07e1cc97f9d5e962ac17c7ef178fd7a2aba46006f014c6b876102ef356904b2413a66ddc63ad8994964b7408fcbd1673b237cf3b1876e13aa2a59971a226b85bb6d543159974cc590f5f90ca767fa4cafaf36613f0aea4e670e9baf165557188528010ccc05ea94570ee9bec2214991835923f7080ac66a0fbf78cf775f948803eb509b294df5926867756a6d67cc6fffcc975537ed48cc769f3e2f05d1e7cd17c19538bd2ae583979b08c14202ba52087baf384194eea4df83ee922e2d5ecec2c8f547499e589be6e49ac986d664564d928db40ddd012be33c92fa2d17ae2708c9d815adc0ef64fc9badf44c1c4eded95d1e75f01a9e1d6455c83ad3947cc168ce2b8bfd1c4a5484fc843a4d744ccb78510489449f4cf3f40e8b523094e895a4e82953a9137c23ba009248f8d52df28cfe259e018f6e8099f6461356424123a59c680d56fed4525bb4166003fcd9b44815aa4e126858e392baf5bb511948634cce0b0861d0d2902fe08d9a3c8030d041512e4223cb5100066fba2156e20b619e07eaa29909fc8fce82bbd0079ad7eb4d61d09ac9c00364c99d679076633e870d06a48937704f361d0a0c0474d32a7cdedd49fa54cdf46ba89f331408461c61345c915eede4f7e02fe1120405f5f5bd2dc6a88a64b31c017c9209f7d16be8d04dd5c447f6e9f593ca9c8d1758f0709c2a246687d90a87c6801c7ac90a8c0bf4c16096aaea7c488eda812251ef2798540c8c10d1afdc2783cdcc14f94c748e3c4973169a705ad945a05ee16f29c9bc07de95fc9843ad92d65f8062a86b84b50f8e67bc30fe219766626bb51dc30f6a37273a96b56b2ac637666da6629a60536841e0833adcc06587321b1572ecbdbc3c5fde3b081873ea2b5103c8ff96d280acf07c0039e72f40a104065cd7b2d45830f78313300500455d4d9427b60fe79c39fd31b148d8e20e7b47fead4c766cb6645683707eb9377e50c86a524658c6eaae446f549d31621cdf09942042e89ad5df3d79d5b5c9e4bc02430bc4ffa856fd77644e51fc89153459e346e64c1a708ff5f72889e10c67d37e6933fc4ce447d13fa87e79b470f445e180ac11351233d9034baa9bdcaa1f20413d5e2f070f977a727d6aa56dae09466349d5cdc6486920538b97d8b4062842429cb33a812bc19f01efa1bbf8579f9df7dda040f52a1068f8a99ca778c9d34ecb252412815a6e8f1f45ac6d6443964fe00b2ba209f3890fc7dc731503326dadfe462281f435834451ada28b418804a296927a19f207af529306c045d3a14584b4ac82df15f69da352ba935fb9ee0fe44d47517cb1c2d0c8bb2052053c67c98a223c74c09957803913187e4e5227079c16b77c79952cf6a34e739860f82a2426513636bf9916f79366a4b86310a357e881a45c1a56483b58fbe35dda5103b4847e331915773abdc65660ba4fff55b230ded76cc2bc8e4e18f01cfc64f4bd143899204c7436ff147c5556370f57bc6048d74596f03313380978e7dd39bad641ab2138bda46d76623bf5dce603aaeef4e0d9e7da54ce2ea898b8f2a8ccca4c718c7384d4aea6a8d807a3f83e4da2fa6dce3b108af3f5648a5e78fcc27e1cc7aad82774077502500a8f2dcdfe0378daf6c6b9c46f5683fd2cb40812e2a53a53497a4803dcb2d190618fb1ac4680c8cd4623683696938699391bcc391fafb70a4647654036279d039c9eeef92e08dfbec80b98375c6dd0c5848074183839c3d4f870320833b7fa2a48675a30e49ab9b4f01c24887d1409da0054f10b8cce729a9b2d03df28496efbb5a5028f6802a698fdc705b89becb01479506", "515352ac", 0, -539634820, "f4f36e67218c2205b615f456ae0f5b6f9165dc19dfc5cb9e74576c7583e2f870"], - ["d26d4c6e01e69b6f3df922e9204e7f38339475279489b0a11776f9d21e04bf58d1f4dee809030000000465ac6500ffffffff022d7ae90100000000020063ce628d040000000004656a6353c20edbc400", "ac636553", 0, -697333523, "23b673207636ad58630d63f088e6882bc935bb28e71e1de01cb6f6e879ec339e"], - ["a4e0fb7403b92b81dc46ec5f72d65b9b31dbce391bc3da460d34cd81e1b43b41634d4827d40200000003ac5152e55b199d6b1c3967faa66e8475fd5726ba59057c76fb51b6bb42a6d8a386e6c325ea798f000000000265659221addc3606f8edade5e981b720ae51ca05d462c474021bdc8cfb2b358bf7b02b84339f030000000753535263acac51ffffffff02582d660000000000076a526a0065ac006691d50400000000066a63006363ac19102f2f010000000000000000e2c83f0400000000875259e7290289abd85287450b0d336a815b5da8ff5e3b870134e91c8f1708ba398a70883fa18eb28989739935d6077cc9e8421123341cfb61ec7a5987ff340ee27a8ec0c0a43f56d3fe45c42830045151aad7a6c9668353fefff3af93598b6d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017b0d6e500122357535bb20caeea69b5fd81114cdc619bd9a63460877882e9ef8a239c4bd677e3991df0f5ef04183210f0c462c2c87365496bb685b630f5e1b6e496e7ae61fe955472ac6a8899a5d1adac6d7e925cb3a865008ca6353fe63e36617bad90bd91a1261eeca8127c4dee834872f5c54b04871e7031504769bb55060224a631d70301be8f9ba204f08f5beed9270285de513d8e3b3d2fb2580ee90a1d03095436faafee2b7418cb464b6bd70e28718e8272d3546924f6931bb7700f1ebd0a0886cdfbecd7e9876b6cb18e44b7d465a4888069524e44c97a4c69e252d6a5d1e883bdc20474f150ab654d320bc1dc775f8f3c35019e30eb90e8feca27be8295030eb0a89e6fd5eb40c1aa2079f1a466ecbd8f08c636671297dada5529918edb2e03205e4d58dbde424242c00befc4059b71431ff9ab4f2d9f899d749c7b5059ffea0325928fcfff575e852ffef2251f6ab1cecabf7e38f9549d3a4dcb08e53e457bd702160e5a9616f011f56dfab79439a980828b2d078ddea079813cdb762de7731f3c030ea6fcb481039f4966d425025efafda2c483b169b750a2099f756aa57233f91595ebf27e75c4887319b6a9c315712e555e702d7e8a43d96bf0e1b75924757e1f7e8e2db6ebcc84a94721e2d3056538d08697a7fde55cd06613727a5737e173505221663f53689c3ced2a1615dda3fb639cea50c6f27e47016c85ab9ac7b297161ca2921ef105b86568e3d68a53c89aa49548d0f0631ee55a0e58d0615721d1e06f8cd517416d6a19061e4af79bd3d2aa6000f7a3d10b64073fc3f4bce697c934277d87e0d6f4b0310be34bc00eb88e35e4672c24d9b65b14df315f4f0b25c13790dee4f99c7b3b17e39bb4bf87ab7137fca995d316694fab7982334d7c0be3e67dd7d0fadc466b0afd0bfb667c21b3b3acff492f81d7408c7229d645708d0525cc3bd2f79f56b57e3397d2b034d9c7c3203711a1a2b9b1fb1c4d3481a73ce39265aab0f4eee157e498faf372f1a76725b16b53c7ba6b20a5df1c52c15fc2268285cdbc577a607190db5cb2a2f3c509a9049bdd3934affa81fcb673e27b623dd4c89fc26f9ecea3e5e17034258312405e0c0a3958ee8582b1878922f96a00beb49314ac962b6da22b0b6534567fa95eb182cba785e5061b335f3ac092ee273f8844b5475425c5d7262cccadb87032f9230d844d57b5cb666deb4ad2e44dc97dff7605e3400f34a1b6bd355e6c140fbad69a643fb5be58c03f534b644c29a1c881abc4d1d7f4227250720f43df12bea4f99a5f05d1341a479d3c2dd58b6d34d572a30823d92ebe2f5bed52009564a4c87be6d86c58a09209293764071ae291aa1779e784da6b01f4e7bc350b5d5ea59ea8ee19aad0fab051a5ac01f5625bad8a967b89056e535f66155d7b18a19567dfa1b3f574f0f4f59245173b38a53337bd8ff2bc48805ac6fcfe2d6a4a01c7c2401a71436381dc90b2198f1e468c57ab1cf08ebcf03d36f4bd3830fa42c4940616deca00c7452bf5f924cfc79a94845483fdb92056bce7f67c16f6b7eac9a051db7b7c077f89c1c29f6dcd75e737c499255ba1b199495b1b81221a57a1b0fa6536f157c76243c59926d76bcd7df677fc4aff510f4edcc275564d337b9f61193ce904933cb003a804dd31b0fd7ff8b8dcf9cda2b4bf31109bb4c7e6ed0f17d741b09197b70120cbc8770ef292af94b30e25dc84276f69994e098d1f81c8d08a760b3419907d26976069772fbd14edf61c99e0ef1a2e7f8231f601aba1739ca87d81c2937b3ee55952fc22a0021de9d58a8b0c515a7163907d9514e62ae76c552aa232262bab146b474042614664cba36cb62b5dd75d031bcbe9894f5720faf3b2c52eb56cb3044ae5df335a1bebd1bb9b3eaf89f0643f4aebaf15ca5169756c6267a3c464d81fa6deb172485295569ab15591e9069a2fac7975c65abb777e8846357f61791dfff54816132d8d0a96a4006883f77b1ba80b3c5ed33489dcfa97bd88c18bab352b7673e541625fb27334d9265930b084a443b5e1dabf8c25267dab74fb3b8736c6e2ca42a01de1b157b9ef986dcb53072ecfcf08136a09cc04c09681711ffe3b5e93244ee60e7ef56945efc49104cdea052e68e296cc5962bf79e48c191df036ec8e43a04f1ad1f7e56bcc47546694566f2122749cfc459d5a1d92a1d8028726fa84e208595af9557238782662aeb353692ff5a0646163d94b06012eb5fad8c09ab5f70fc0cb37a43ca5607e3b87c4c16cfb6a8db187b1ec75302fe2b3a8091777c864f96915b61d826407d0e03ad27aead7fc41147713ed84a68089a9d421c1e77f098c3cf641e542a8189d20d31f7b0a32ffe059c6e84b99705fccdf7003c0a19a43e03c7214ce6e63dd0e74e6af8885acdbf5b5f806fa7b8a4298a9370b", "5352", 2, -316574488, "dc8a4b3748bf07a6694274a638f0350d7c938ca268998e23acf556601b38de56"], - ["030000807082c40301493ec0a084efd0f30ebad1879d8767c0cdc5c00f8741f6edb25f8bac5d55d5800300000005ac5363656519b4aaf2027c6e5e05000000000252510ec62e030000000009ac63530053ac510052000000002b7869a7013b1c1204000000000000000000000000f0cc8a038ae00e0991afa699f1ae8760d0cac21681623ff1a09e2f07eafd8507ee6700c5183030cbfa823f20dfde9a4f4e00ffc5eced38453266b552dc3bb2b93e81bef7ee317a12ef3dab7007243d3e75b15c5071950e2b286621ebc2d63bc60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044b4804449efddcf341f12713060d755a0eeb20fd3f922976b1b0a9d09964c385971b348a2425620786d52982d47d300596384603d8c1dee9d8951dec3795a12f999dcf1114b60bc8058a6b8569accd0d1f77bef81fbcb1c85d3e4ba313143c21b543bc268148cfa99380e98ad90593eb781aefa41f87bf65287c38f34e464ea021ded596d65ffe8c3dbcb21c53b68746ee1946b126ff97defd39a0517142d321d0222a49563736fb6aa6e0d7244c00c10e62aafe23cccba8cf079e3ea31dc875cdd0b039331bdfab7f9940bd26181c52e1d5022603c298afa269a9b7cbe2752baac3c03d9399d959baa983b688265066629bee087f12cf1ad7b4ea4a6f66eafb45a090206c448260a391bb4220b048f2044d65ffbe255becba6dc3c70b97983d8dc855902058ad44fa1c7929f0c1ebe173f2223224d71017a81f13f43e7865b604c076be403208be4ae4c2d00aaa0643e07ffb9ee69284498d0b328e40f7fbbb97fe769ae8f032d951568c48c9fa811b988843c7738b46347d8f27e5f0d5fe1b76fd4a00f284103079005afe2c10cd92b90303f9e0f93509a4487138e22fa16bf0cdeb04d9c0f7211e51b2aa1a00292150887f61a5d0830870552794b3229c6cd6b534f996b0c64d7439948378b76cc1afbe7789668201614c35ca90f51f887fa619628e3a80eeab9a28bafca30ccb7e045373bf0826d5333e909de1d1c160c613dc592236dc03b0f159239bf71289ec7e5ab21faf668bc09a747b251c0bfb02eb69e9b9e255e08d933ad8be6507526a399902bbf4876f4b72efb43271a17e9584bc1cd12ed1a0ffaca1073447ab4be3bdb58deea7522ba449d34e2e869f88b74808de4014103231d1bed22b5f576c6d86831f972e2712af704c26eec22d7df4663d0bd9a22198486cf563032758d28de11bdcee33220212e40bd1d52bc9d0a682cc041e5bfe8b9f96c53afaeebb1887cd690707634dc65f227b0354ad994ed8a08a9d06b1903ea0048271d2e791688f47634a7c7687721e9216208d216e455d30b1409e5d3a259e81bfebc7f5055a1096a828bc4df7de8c3da980ea17bbd208ed0480347a63689ce053e285c8f15df96d39d42f2e98a969dc6a6c482694c96d4ddd90c1efd14586636220261d7256fc01cd64a077ec160c14006007eabfe69dc90157bcfb13f93b9d5d30540d25758f32e48364c7274f52aeefc125eaf064f4e07302ec6460f5cd4c04b4cc9a3d324c9f8dd2d250b5ba69c0e659fcf203cf5ddd4871b9826f3ffebaa2e5946969432f64ec0b986c058f6f09bf45fdb8d0f04f1c65b5998d861c9c2605b8427d3fd81b3bd6506dcbd620dfe2c369aebee8598bc9fc2c9074dd4e3a5966f1a4bc37d2e2d62f6db6e94a69fe852b08c03c7e18fa1da9fa701226578476a0b22933ba3d7b387c0c4bd3c8719ca239c64f0c4cebff865d2412648eef581ff9420b6c0e0a2bc1d0399b3d34fda4c9813728eb5dad64f7a37780c309199ec074ae8bcb12b18769455fa60bc09be57c202d9ad0db7b507edc73903b6490298d853b1f6102101fff4e454d67a69875ac1eaf04089f76763e8fcf8efba604e4827c2b4fb0fcaad2450f0cd52ad767767b96f83c07ac6a5f534b0812e056b9d0f5515f0f0e145269cc9c08359862046dda30466e233803d148e157c618960e42f449bff8e9caa910d9f5480bfffd1fb52273020b3f89007a4dd85fdbc647abe861addc3a2dd9bd838ccd032bb1e48d2412a8e6e7ef3a61278dde9857539ca07163a44a06041568ce434b6340bd7e3cba584dda38afc9572620585a1ca372be026403730c1bd20833d696ae316a54425eddda467968fa06e17124af49d04a6255ae401758edf566e16b1165950ec4b746a43c4c9f4e76cd6dceef15cbae3b68f0667d93bad5365c56b18caa81d51d33da533ffdf0cd4c4b6023e89984edcf0c1b64f98ee00f08be513f48a8c5dbce159364de3aad22c847fc043910e4b4d4bdf06402c43f662192a76bc63d30e9548230ec9ebbb3bd34fea60b0c89fd26205e051c4780332b22ac43e3882cfeea73beb8ceed8375f94359be4c30d8b4dd5d2a422d58995352647902fcee9402f2890ca1289effaf26d629bba2d6bb6545df3aa09d59b803a8e38159fff23b6e635b665ab4cc9b8d3ca52117e5932ed8005bced27e7ea43dc86c35d7e0b812a2e1c566bea240207de7a163f6d3b9d6a2d07927ff559ebfccedd0df1a26cbdf03ed3e96a6e746823b9ea8cb87ad1baf7f696e7dfdef335472290b59d954c4097f316d4e4bb05e60758b4049f90797fb4c7ffbbc5944450c711175d232c7bc651d69668017735f9b7e2e761813559349ab533511b78782570a17a7e851eb3961252d4357de1c27dc887ce76e36e623475662f41351a1283ab2ac6469b924d1f4d9f84d3b34b06", "515251536a", 0, 1243876810, "92cbc0b60a789d3b7b31733a2c83b2bf635ced2a4d03cc730c14714ddd98c168"], - ["6b329b4d03c964f0bd7b99513e94d4294c75ac932c6a64d567303da9d007a47c02e680a06402000000026a655aa953a0bc22e2dd6561b071cadc5868e3c37b3d3746d4ada23929bacab1d114b2cee67902000000025153ffffffff7698c832a4fc076bb62e135753e0bbed1119a399aae0213fa3102d72c6d379810200000000e51471150487686c0000000000025265e9c67501000000000853ac526551525152adb441000000000000b0cf4901000000000365ac650000000001d0265f0000000000000000000000000008dc2c70b3578ccd7d6fa7e427f9e074510988f7b5bd548cb58a6c85d9f4a9bb200b62c3f37df8b562c03f5a6bbec165fe02dd66f413228900a25d1d3a9f993c974f02130ae1f6b570ce12caeaec70da4d87258a01e831fb7d1e87d0cc48cf0c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e8735d8c9aa3e2e2dcb7894e6ae9e93935b87e7c81d1c28093b85a475cca5116c0b295fca03aba3ebc64eb64e4c99ac106ed83142e12bb7135d768ba7caf4b36b9df1f830c748b2f4e1003888f8186b89d0a8eab0857372294e1f9ecc1c6c0ff89a9d752df82ddfa1feb66e3f55bdddaa844fe87fc7161074a751005c20a3290308e4ab9f61dda0df4d9881a046dccdac873a7a8d585e60d0190472a9a58d6349021ce65926ea6fd40472c5e96392f6524aa56000bfc93e24cf25bbacab7354b2fb0b0250cc8c6da1172a4f7297b3517e18efe8a146892ddbcaa6ac79050f1ea07f98daff486cdc6f19d5363d504573a4fa6128393158c696654d3dd4db1306463d5e021ec988e5b32816fe66b487a5b310b4cd0913c947efea8cc8b873ba427a2138e003064431350c9d587361620a48bf345457d8842f92c5a41a2878c1bef28c431a5b030c7b0326deddf629c5f0d7a5c69fe61fe185bfbe6d0657ed3dfd98b70a63f4e00201ab2bc2b25af165aea241e4bacd9d9febd9cc06d3f0e50c12a76f8180fc5d59022dd592a212600550f347a807447b438ee22ec3ac4aa8fb03248d826d97448931a095aa5708c31061a81b52f4b8a061ecdb104c990c7142e54bba48ce9f4b8def86676734a20a85ce81db4c82b63ba4f39bafc4534a9eee6edbdc7128b85fc88d34bbacb36b26bebb7c5404dcc83569bae67f39c3055902300dd071d910cf63ceb731dc5164c858157648fbbcffa83a6866e2fabeed58ddaad5c7197aca25e8c104019714f5eb38982863e99dc164392c793608f22389a21a533bd241f77cbb769f576f271de743a47a8b6d31bd4e0365c7e82bf9134e89c980ff2cdd6078e5d8997064ee54e14783040becab4b810ee52ef22e441b39c726126378e16fe66e98032fa162a94901abc59d3abf3dfd7965c7275c6749197e5f6319adbc753e1f3239f09b1f3c12fbdfc630bd83104e59a767e3b4996904074bb6b67e7b40410a06434c9ee9f4389db7fb8ad775afd4d952575d0157728d30493aa9cca92817bbdecbe3613503d457b06f7e1ee86d71f776f194927dc35f96fc8fef18d19910a508cb5a4b0150e519774eb0c8d6877c9a756351809b538e1351df7754f6390755edb21cdc40d153b1d1ab6a19d7fa46aae4ab060d860be6cfef2309a7aa1a6e250383767fcc6d6cbe5049f6c08be27727318149b9067a33e925569d9bbfa5295bf25f8f8f8aa5c2a60319a433343282e4b8834b47ffc8d85a454a08842898a8538cc5f832b2b7083034a7b62328786ece70826eae07a16ff37b810cb997edd3737831a525b1cc7c1a705fd286f4232bfdfdf9a6a4a6230079d612d7032bda840c45ebcf62cc48f0a3a46db4a98288914a2e507a247249a2b727a65130a621b95193f2f47f3a0d423b82af1e00a4d81c419b7df8772c39673fc6497482ae12b1ad39343e1e0fc6e40802073b2e076996528fc72b627af855d3ebe3b6c108092dc67713a41d891dbc54d7ea717725b697f3a2ebef27f75cc4fc13c57f7f2a728d8b9aa45b36ccd0a15d38cadd2861c1a1daea09ba226f64de72fd453f8f1b7508570e452968fa341a784932682a954d2285dbb1fbc3bc74117a380e1a58676b460656118a04c54bcc106e8b1f351d3fd3f51c1c3129db155d8f632d80325ed5ac7931d43efc3fdd4f465a35f170fa53438a7974ffba2932244536ba36becb696b94c438c42cf571f6babbafc1d88f941bd4a6b21bf02daadf17248522cb90e2896fb96a482e93ee8b83c109a4c84f4069af11288531580462b495ab59b26ca6dd1646265f9c57f8d8ead258b19a2529c8817f35b8b11143a479444f0c5f1d5e1494af60a13ebe88c80fe8e38227692a4fdd28c60be975305a8fbcb8b0604a7b8c3b7aa49543bfe7f2903fd00e6fc1c368a76e1d916ec197f46c7fdb2c0f9ee44a9a7e6b25797f4c2e6ad442d8e31aadd77e20c4ba1941be8014a8cd5053e773c56d26003f652c0d6b3c511c1ae190598c462341fd36163623c48588bb16d3a546863ba75fb7101d3791c8e81929a1b7d2be77eec78bb0b35b42f244f9225c402a5b28409c5dafbefe926d3dbafbc82e9949211cc9ab0434693412f74d81427fd713ace916065de3ed6eed894b61658b92929a30e50f70c2e1f270cf888aaaf4f72259a45182dbc78bea2308e95d772e71244190336e2465e5d719c15415e1fb2fba33877d796924500146210b074a0053e3a8e74df3b0c0010736cebc894cb12b91cbb4bded925f8007709f1564e70d1d64d4a1a690fbc88ad9f2a3765eca46e147df148e3025be2c1eb6c09fc498c0d7beff765ad139d08bcdc10afa7b4cfc2fba9c31787d3ce7f5ac788f979d055062dffb0e56ea3c3e6913b527d85b653149cdac6ab424b2841dec6fb4b196131fecbf715a09", "63ac656a6a006a5363", 1, -1953052847, "6ce7cdb595e1f9f5fa2c0fccb1145ae7d073c78b44fae867d6fcc6db2aeea34e"], - ["030000807082c4030197f2b45bba2313389bbbb3dbb29929db9f698b5559248c124e171ab0bf979cf5020000000265ace4f5328f04ff630c03000000000252518fb00400000000000365526ad78d2b0400000000075363ac63636565d5021a010000000008516a5251515253000000000014e9319d0137072805000000000000000000000000f4803c39d71243bad4bdbf097928791cf2613f22f38d82e58a12361648354185e3165a2011d3de1f11702619e9f3d78a1918ab7c75f4c20dc760fd1668856b7e7bef749b7bd12e1a9038020194e9db7bc3fd1234bc57132bde84b4e07b4afd9600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fd4c081b17b9e9cc1828c72bce3426701b564e4777695fed9a47e4d62406ac08e93ad59f9b4fcaca6b4b3cfd0269f437e9782bd0f44f4e515ba797ddb5439cb2616627d77a18e88ed1879351df9478381c5f059244d1ff329d7bbc13c9ebcf87a93160cc067effad7fd7c8c07e99353d13669a5c0faef9b1dda22ec2630cfc5a033044bca62a58ab17f9efbe2139d75e375c1dad274df65d19be582cb41d178bfa02162e881a23ac5a153476fb552b0d12943be8d86da19eec69599749f68b4b39550a038c15bc9142e583be163110058e064dfd1276817a9d811855848fd260b9f406c038f8a7bf79e1c61913dec9ef18786f89f845a7e99dc1536a18c137a4bb93530224adf7dfd1638491a9d93bf2a8ae34ff13ab42af4f54f41db16037024c4f373b0329bc6a8a289420cbfedcb874f23d16c66b2e6075fbc697c11e54a668612ed40f0217e15737ce50120bd2e011f419bdb087acb71950179a21bf4dc3a558a2cd9d6e030152cbaed7c5d444a8766906218ab38f5858344bb9175c9f3b937b590ec464c3031446935ebd60fdff3a56473a995b4af3a5f8fa3f1789781a1dd19c636af3f283f88c2b603ab3fdeef7f02fb5cd5d61e7e027fb7678145ee88dbcf9f2e5aafab7cf7b1c3add4b73e6270f17826774be7ab3d749b868929d6c023862c2e7a92c47fee91ab57fc0c44c5508b0d401bd2b9b2d07a87a123cacfa0401783da5deb403a114c18dc4fb473521e5a54888084e7b1adfb6b4c471ebc9daf026641195e2c72f978cbd8f4197f392af1678435d7255bcaf204d6cb322e834ce95b533686883c67ef58a413bb0e900aacbbfe1d486b93760122964ce3750c7f3b81fd52512713e0a8e7427dfa96deec52140dc2cf531f007b7f52bc080ee611418cedc6716651b3d24be7bfcd730af69e215da5e70573ff47e2105f852a2d6f78843eb8009ad3dc8e237d6820f1c25f0fc077b696d700121abb8772baf6884a3d54d3db3edfcd2164a4df5ae4f54a8ab337a4155a67eaf19e1a7608206fddef902f6ab88c702dc28ef197474ec9a30fd84db69d47b0234377ef0853638179ddf23114b3169ed0efafe42e556fe7e63a8486c7995ccd333ca13062c56106d7df1f98a7345380cb986d80ab4d006f93c0687e4f89e3968c198976eb173f07067ffc1ec8c4359d2ac5629c21f4e70aac123710c7d4ad2411459fbca67d57783bc5cac5a61e111ff1193ed57ac3050b482b40dffb4550609367471db131db9dbff708ae612b905a93714088cb6b9c0356187e193133957d78e6b72cf4f8cffab75f70d1a71e3ed11365373ac17020c1f78ddc67a26b4837288df2880381ea1c5082ab3608a1158ef4b294f409c9c9b743c80bf9a3096f835f425c09e6d925ad538cc1795468597fc3d328bf3c9314cb96b64989bbe51cd0ef1d0483baac791388452e3e6e8181e8e39b9ade174d55a190c4539fe7210bd46b2bf1ac57648610eb0a26ac794147b03d55a434526842b1db0da06cf290466c52bca577fd062e1093bb9cbe59587a5c7bb81932b2c13bc1c72cd6b067f4d793fa6f762700b8a6d808a089a476860bb9e3cfd41dc57048937e020c0e470a6e9c610365af9ae83a1e2e1cdc79e88a3480cb55d4c47bae28594ca9f8d97b835b359009ee7286bd37a72d828cff9f9f24b60ae3f5879c3380be2cf1c4cefab5abca549b7810c207b3c16aeb62baf9e4de91139ef42879a4413f2d3d83a0f2925ef8556536473b01f13cd583cb172f8e0be2f061d707f8dbb837840bc4d5c54bc7067aeb249e35d6281ec1802b8dd81ed8a1325b7e4d723052b125a289db2589e7fb2f9eab3061db6daa685e147f57443016de5b38b4d7f7616964f8784be468675e758dc9eb7c15e0116a08d0da0becb49ecf41386ddefddfcd130ac24ca0ccff509125199252bf30659295381375a5c98ce0b98cfe6830d5f428b9ddb866e4e6336a952a3001b4e6f4dd4dc2e77d75653ea9bb613000b051f0d93dde5e1407c04b0b7d6be10939659b08c44b9a95983352e1c5059b34be640051f27cc52a30c1e4aa6121596e5995570e4a3b318797a4f95e383ae24cd838de73b17ce2b6606eb52bdb4bba9922ff6b93c4c2af11217626ade0e2181cfaeb842fd732eea817b10e655718dab6d3f09e46a4d83140eddfdb60c97b9d9708a78671c29f4f5e5e52af0834a8340773c0103ba6e283a536b0d112041edce4c04e41e8767bece592bb847ececd4b46f4d2c17f8dd98cf71361d5fb0bdddc72a7aa7a37354dc209baf96e81c2469fb4dfa4717333c96b961a356bf3f51b058c31e1f77152cc38a037ad1e76f6b7c91801dd26b84fb8e1e8a16ddd5ce86b76103bfcfd490e3dc187d179b334a0a730d42edbdb3261d7477b16c4f76a9a2f180d414c6d96c960a4d43031a75800e", "53ac6a6a53525251", 0, -1654691573, "d64593b0e6543dd3b8ced7a5c33b915b634461ceb80a3fee7fd95ca41f6aa1aa"], - ["6633dd0c025fb33bf0ded59389030a93c3a83c570257267d7b7f2d3d80e044975bd6ff244c02000000085363ac5165655152ffffffffdd9b4062ef8f0ac5cb192d3e8385c5fd51df4ae667ba210c3e12d7d289b3852f020000000452536553ffffffff03186af4050000000003516563b5b1f100000000000363ac6ae502ed02000000000353650000000000026bd81c0400000000000000000000000083c08c1bc7b6cd97be9f23104d52b7bedf9f5812b616ee48c1f5047f32d8cf505242436f65effebe8f367eddb84fa16537a4f4aa21b91157352ffec76a408bbb51caa7424818d65586650ffbb37a84e3966c2279c279e08ac6d62ba66e82c6a400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d219c48f7e29865593c411e4fdcf3d6e4259b06df727b9a9b6b3509aaad3a2ed0213772fbf47df458dd6c282b35074ce40a2b1754fa4d84f59562c3ddc14761a6ca30141f7ea7efba08dc7208784230cb74045748aa1d6bea5d6c35a29e0a7a4d22621c9d9474c19b832f81b980fd91499d88f2d4580d33b59b9b326069e02fb020fb6258a7a4eb9fbf2de840dd6585606021bddf7dc76039b41d69d20566aefb3031466188438b7376882f87fce5b0a8d1bd9c864bdd1624f65843a1ac5e03562170a035e947e07b1e9e8c0c3aca3bd50f3b98cbc8c36f0f9ffdbd2ec5de7b8a30450ae36e6798bfc82bed869be7a511189e06d69be71f8f1c3d51f0578c51334e093032474cd217c194e65b2e15428cdf0d6aaa29a0eed0ee22aff2aa3a4a829ea1f29032d0fcfb362747668483654775bd6da09685e29c4d80d87cd7b09128619a3f80b03052bd90ef2d65cff85d054dd9ed84574497222d62e230ede687d5d64bc05ec9a020c4a0d0761930c790eb1cc33bae1a4938982fb07766d221b3f6f07a63f087949022fb97ca711fd8e23706411e63fbb14754658916ca32ff37124f00883232529daabf1cc665269022882ccede39530ad3ef4bc2fbe2127f67426b6efa33f9c2a1353a682f9c73bf5b28217464a42d23ca1aedf73978bdd2a8d4f8e0e7ee87cdf5f92afd96e1d2ed6206d9bccb0d93c2a106fc8e02e6bf88e15aed75f3532bc810de0adea438fba8f6b4f77433bc9a496f552b47936ff5873c8a992dac7f61b68cbe53269f6a174c84745c25d5322d7da1dfc12f7bfe36e291a1722899ba33a2dde8f29d29a23d978cbc82a19f4b8ce0b7c6ffc65c1d904246dc565a348350041e9721f264cbe0fa54531ff297a8b819724ed53ebb81af2d6229ca584d79c549ff9e58a65e295df1431a92f5fde54d76f0a3d3944bc4105e3c41b42b91488c46748718e3b42ffa77f68512c2110df9737a0b40464b4959c858f2df32fe96fd1d010fdd5c05bd210a4f106adb44774aa5620be09f2a45d4b99920e4fa3710ccf2604762b0f70bbfe2601013daf08a56063df284605f2df49e09ced1b3ecd72d5859e1faacdb3ec737dab792fdb11d4493f9c1f61bdc84d5b80e10ad1ceebbd4e7eb9b8fa2ee2c49447894d518942583fa83f98f9ca25ee1fa165cb828dc8ed8351034456b9c7498672b8f0f7b6e9dc9fe25be59867e5e29306c9d7ae3ac66d86e504bd178bfb7ad82df015347d4c34e3bf55928f9b7fac66d3d0394ed569509fadd969ef7c4608303a2a68e3531d2e9cbf9ebedf5b02d76948e452c5baff2ff070498895c2e5f07e9bab021e0a9c5d1124a3f3607a9cd7c3dbb367ed14188389e3bac2e64e8e9865716c43bef20caf78a45f371b5da7e4be999601508f12810b8173d0c0e8fae13f197344a5797dcffc6fef63fe0831b1cd6b6f3ea2e009003b12a54a7c6ba0f669ef33ff9f4624c854671d72df2751f1b06c68609c672c721acb96ca431b8f93068274abd2d33f5971e368c7d24f0ceb61784d76e4b0eb533a1622d064d0dbedbc683794cb5519657cb2380d58b72bfc07f109dd24831e3293e3789c077bfa399cf002371e9a8986f60cda040ad118914a54b42493afa7f55cd02ff743c9a08b9ea759753e13ce1289aff67654132b4bcec0bb3ab9fefefc79dc1404e654a0a4c2ee8780c027e32af28800e04586edbb006b2c2817e94f82b6f7f86414680386eaee1ff3e5a2b0a1ce9db40f2e7d4209479a4fc99bd91037e2155daad2b67e928520c49fc8acd5cd57aeb44faf31837c2aaff1bd3091a3799c38dac652f69e5a0a28fbddae20af96018ffe50b0e295d0e2b767e4a4ac2c71416a741a4e6f3b5b205653acd7dfc05c1ab272cbd00192650e73452e50b72ac8aaa4f41c4fa071d03aca2cc9e2da8ee9ea19434367f3581e8e6f3f782d842c3d1b6d3bedffd17398572f384f5325bc348a1a2f8899acb5bfd9cf1ac20631fd89f6073d7eb4fd0c506f4f6ac76c83682a96252236612eec49ad1db425ccd2e971fb6ed72e7bee5c90cbe96e77f91ba660b0a195040607ffee63def070efc42b31c189dcba7b8a2c3a7ea0f054d8fc9b3fca4f29240387fe23f520937faaacd2d79533d1af119cd62dce454cf3f8590761935510d3813ba898cf7d99f76429124dcffecd8d76d70af5d21935429798e76d59109f33584af5bd1247e6a1d29e735cdf86eb372025898ac6fda159cdd0f4dbec0b3a18430fdeaa8818ff1a2797029775bf2891f0b0d1dbad4eb28bebafd3f03bef77efbe0000000000000000265a100100000000c9f42d0764d790ce669093bd7b0043b58dce1b8200c599a5902b4919bc6c667b1bf5f7e54f994a4bdd560cca7c882b7175d6071e30683777ffdd9934142019d9e342bbdc3e0931c440130ad1558a35e9a55d78ac4a9c59f8c608e5f83eaef4b9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005766e1e8194e81b1e21f52a742df02d8454086411e9d1c57ca12dcd0d75020c30c246fbaab97df618ddc8862ddf1a6b789971de6e94be4f22319e1ccdebb201adb496a1b862fa9e262ad1a4bd60f5f796519dbdcc2a8d1222f3cb4d6e9656fc976a16785b04111f6db4006902077bd5e32e78bfd5b64642057ad6d28910a83100219ca9dbbd4d5f02d30dc1c6007b9d5d89a0f2fda1152cce8ce598a8dbb10780c02217fd97ea0065ef4aeecca76820eb6b30ec29731fc274616d96ddb9a22fa8e250b039982ee6590267334260bebdcc1af237e62bd0a991077b4d4c01cde157d9295d416c5ed002daa1ca277bc15de89a19d9f54333b24248eba36efd3c1f0014e900225c2b130d116682c5c30dd939b22763501a45f7afce8bce0665d4056e14bd11e030a56c4b72cd9452e0fccafe200c93839b7bb3a388a80bfcfcd1985807e375aec020f1bbd9b366df0701b9bf23b145a3c3afbca9a8020618aae837f54c1592f521d020a7ea2b7e3fe5e01e802ddf47f6547e8b4e7c3290b06ce5b8461de3b50ab104d020be0c044ba0ffc2008d8f8a8060a4e03a050b1420094763fa43812fd95e14b70f5c0a4f3ad1e5d4c3cc974a581db228284434dfd237fa394a6c98d01bfd90e7aa48419cbe3d55ca4920780f4f09aa064be90d441b6f5458f3c76cb7d6045fe4aff5133bf8569144b278dbe006d102683f770f63b8b9880304de8df727e39b4ed05317ae55a33e5a73c179868f8f4c6710a56d6ff94f17a8784c28121196d1733b96f9287b1b2b81383f4398f45c79a6aaa4fb82ccf9d9559e990b270574f1496fc95d4998db1b648903c7cc0b38a2a80ca8744b19f73e3c80e5546b1d885c4fe48d105f092582ba15185bcd99f2b322a9ae0dc90a861cbbed87b29d0b3814d67d1a6bc960fb7856cc65a9631fc93e51bb847f6302b80f5ec048a3499f6c4cdea892a34e995979c31e6a0a388be94f440d67e799c4547b1e6a3f4da21579f8fd7a786bf71c0f509aac619bfa5dc3d9d34f8dba764935e5ee6f10788056f2732b7b6a2f950ccfd9e2fc7d3218f9fada580fa138766b4146adc89a14c350ec06c2c8ae6d2472c98c3768cd442d433afd39dd46753b7d2bd4c37455f0d708087bc93da9141d5902d67e85790fe865ec39a1712817a50a1dc0d8aa63bfb68d6e4735ce8a2c2a0cf1ea1651fb485c364dc6c163e24be011421291f69b25f9c487e1efb5f86718e0888c37a19a6c131253b6b7a6a06d1038342803c9294e371b21be7f852fca3ca156eca614603ff8544ca7b8143f73acd79e12d6d2dcd33bcafbbe70bd6c39b9f1d8d26d85a5db880968143cc3ec24410408e12a691a7aaee79a2cd48099c72eed183b42a7dabc5d88d256f7682a3a63d5a144ee18709a4adec87f9aa9e5889febf41738a5399bd691fb69b48d15ad8270a2f205eaf5d418f99af714ddfaa72f0730b8a7ce76296cd519d6a1d731bd6067aecd0c815ff036375b36b873c3b92c60b423f9f28dd041af69b83c6c78a5ed188685492e3fddc041c4a9d6f96332bc4c430a746debd1acafffc6d228c927530d274cf93193dccc771b6547f3179f3736ed133b084d4d583347e605d2150139ff8220437dc1233ffaf6342dc7d229fa6f773284260c59b984a2c952b4a4d5cd7d3e638aad130030a625a96c12cd836addc497f98c61af7507c15a8028d11401cc8c2c4cbc12779edefc6d6efc6dc1ecd5939dc99b772510a1daee3db01ede8316bd93f783d8c5efc687b4647c87d6e2133f46f0efd9270a0d62ef02cebadb82130d421484c9ecf764cbd51b0a0a4906676dc279cdad23084ac24149eb219182855935d4a3478e0d60c97e41305d422027f6e5de88e1d232bfb1217af80350444e6c1d5798755231c85b93df4279046d2ed49cce62c9879f3a7de771bbb07b9cc9f547f81de0e9fd9ac5ffdc780de05024a99a74a0171cc1538bf9405c7d5232a432fa77d1920659989be736a29ccc9afca25aeb006750241cdc91495c95ef8542322f45855f4a6644d0295e3dee599b3d1742a3397045fabeb4c0bf6c4a57b36f3d0e6d5a8e04f074a86c49f36ba7c323137511a0668786648b06d01c81f7c32696a84392cd6a040cf51fb6cdefbeceebb58fff83c9a966057e2e77a91a02ef7154623e833a4ef44c327b5c6696f5da0d9092054c12b83e9b3d439cafadc5a03c9de1c0bfbe6ef39b464a0aea3b0cf072bdc37cc5fcc9b51a1fc5f37ca69c5755ab5ba8127e3b4250c717f7a2ed8ea7985374c0b5dd8cfa2a6d996c346dc8a373099e882da41628332c98d6438ea8606946ec8bc437cec87695febe17862970591e5b40aff5e3e7749e5f8f099b7513b27d1269306f009abc7114e3e04c531dfe8ec74b3107449f16046f7cd66dec74e4eef6c94aa6cb572eb8aeb916a0a", "6a006a65000053656a", 1, -1349569807, "205ebfb60bfeb0bd12b296a28bf238f97fec32fc7664471f9979368baf227aa4"], - ["393240120453f43a262f5f78763f60f4f9dd2f3dcbd5310ae9200d8f9a543ae5c6b69b3c0900000000086a5263ac6363ac65ffffffffd2378dd6a3aa20c8d4ab5ea14184e9b855501965d0063a6a336d1166bc1bfe82020000000700636352635363ffffffffd1e160fcc742b8f5b3fca34c46e22285c5e702926c4bf428a2ab48147b4b196800000000025351ffffffff84fe6c70b0ea1616df06007ce0ea37d715e25828b28021cf507cd8977172b8ab000000000563ac52650003cb846701339b68010000000008005265526300ac5339232e00020000000000000000af5bff0000000000573e2c54fd796a48bf45e2fb7431608141955f506192e43a061bb156ee705df1fd42fabc040aeebdebcaa46d555299ad28fa7b3ac6de0750fa80deef5e6e2e1898df792e12bb73c7fc66a55c5ccdb5171c80fc8a100787b6dfb9c8ec58e5771500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016ae87a7a61644f739629085648821712f212c4e055e2b0501db37c80c2b9c913a706bcfdee5b005d74621fcb1e9543e66f2c09b963a55d97319181d8982ebd348a1e79be843a6e46847135750bd4f5e75cc17eb7a53b8cc9b386a12c9c654e6cdea242cd428a59187aa492269d8897caf692a2aa3ee6dd0e58498df5671b9702249d23484d16c035be904cad73b7136a9a813376bd7dad1b23cada7f5096383f021b964b7b3a144fbd4af09a114cb9e20950751032cd836ed1a5ffbfc1ec7b7f840a001e236a905c6b657ac0910beb893df7cb70ea9d84379ccfa9ae8a5a0246a5ca54432f157c9e558bca7e7d53eaab7a28c3c55f8c5b0e6339055841e873e6eaa1020c705e9c31e91603a5b16870b66f8ab4bd4db3a66c05ba8b0051e18aa6e2f2ee032d04834c64cdeca176b9d5cf98eacd233d442f3a4ee42e55a2b3ed6b46e97725021344ddacbe12b963918cab3426b9927603d41f49d2bcb103b95bd1820430e3ed0208e4827d9b306adfea501adb722393e575003f54472aad2c5c8f7066f40b5a4d0209f296163f483a4685e98814814d98bef4abcbbb72bfb2533b779cd94230bfc2f88c0a5b0c7f3f99dd27c7e09242f349bde71ad16e098e6a02aade43b80a080e7377de1e27863f0c3b922dbeb69847d1d81a7fd0ca6dacbf2cb8effaaafabf96df5bded17dd8649c02a35a40a2d053f8c9901da4b2e35b41e2466e126887e5e6673e9afb7f4f743707a15c9458234a9d7916f0cfeec8902a46744650a1ac7fc9e963f93016696467dab861a513ebca6780716ce8e65c8ca03a9b6f4bda2a4b009fdaf479d0280fee2bb21cbc45cdc29a280682a0fee0d55bd1aeb0f5f20182e793778db8c10ef3ee464065fd961b380ae4d165a8a308cd78a4cc3e7237fffd0867d6af782c29672464c116f75a66ba833a3e7837a19570451f977cc0408a631501c638e3e118f29f6edd9699f6518e1e3d48a3ca38b4231bebc3f173335e0b6adba0fbee8a4b07abf82966ae259b2a7bfb9e6a72f3ccbda84059574c10baaec61ac6ae5fdc0097bbcb5d41c5470ac711c4bca4e882f66f009f417e3a619c5aab3db68ca64a7bb04510dbe0f0827ab771c887d9bec01dbdc09f6e9e3c717e088c7e6eae7c1ce639aa0ac9450010b25cb89afbea162ec10a024b70be228d65ffb6af5f39e8e4dd0de605e337bc2c0923a81e8c8c6a01a3fe3fdf7bdf39238816916743a5c2a0cae288ef11664ceaae05869fa627e70a8430d18327119086c2d036d7807dd7797cd6570b6eed4bc5ca50549bc4344e923d0c4ed3bf3e351101c037fca75a415a77487f194a8c505b4560e92afea2e92088340f0e1dbafb10c4609f056018bd2b3ad75c4512d07201c1a905272f998d896919ed6b7e08f51777e1deaf36f402874a47f1459149e8039241ffc52253fcbc37b5e74a63c550cbec234b20ab8909b76005e1e99751e67f4829ee2f39438c230b8e9eda67303b8cb60ab7d9d02bbd4b4d921a15759875030f8737d12230b07f4b5ab7b271f2ee20d309e66addee24e15e1dd8b10b38fdb08a98dac12b6bde887ed6bbdbbbbc7d7927cf71a1e8162507eb8a1983db0167c409063312747544179a437a52bddb185530a43a3af912941d42bc0252417e668588374269f27a833b7137b258638730ac6cdb885ab997995d554dfd7cd8af90d5710a073917b204ec438736d110382c9ad45c450137a9ffa9433bb0612c81ece4e4726258178edc41925c5c829915610d335f3b33a72af586b29736d76a8055e35b35a406cf992dac3cb0688453e48f471a8233511d503f2ece91c0787dede89b81d393544bd2f5f06dcfdd23009389e6d2f2860856c568bd0b69fac1141c945b7fa9b34c72501d9e6d9a1889e7c98aa14e417b2caeb291ec396db7c1b8b7d6fba78e497358738a067b3180d69bea79cf4fe38fbd35019d46a1e9222a72a4ff4511bcdee6b54568482e3e02e21a84270680dd738749683862dd9e36635a3341de1bb53d9f394925849a4692c4a1d818dc54eee2298e197accad7724dfc43b366e5e2fa9b71b74f8ae820fe4971604429c8c41d09401e5f7752c273d9d01a19c3f703a79e12558824a62ff79f48e9bf57cd2b25bf9960d75353849e8f8c344a5ce095f55febfbfaa4727ea09379628f8c8b5930c6b7da115e5c039ef0aafe152fd873993e3561790dc89fc21e34cca1b0bee851a3f39e8d1325de16e1ca9b47e5c7b8320b2aae29d6a9145dfbfbaa52b32c5fdbee1d3f82bbd36615f22776a1a3ebc810564450000000000000000e820020500000000f23928e6eff75025182c05b6ee5d4385e171e2bcfa8d2d1d0f0f6c1d8e7c9f9dfc40acfacd56c4428dcdd720414ad04904d228a635e413887e232a98f37acfd8acbab442beef0277dd2e24344c7d6ac67a17af81656244e34b051d8470faa67800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a3d1cae291673e95cb1ecc550d16c6d182b276edb43a4578a0ada1e6d141ba18d8ed8eb6f6a18a24b59481de0075fc502a4199dc1fcb05d1527d104914c3126ee53dbff0a953ff3e2b0bd7aafb673d81dd5a0defc5f8f0023d1670c632b31f9f90834482ac8589c76f8911bc15124842f6d321fcd68f8e27708b8f6c29bb99420203a5bfca5c6447f1953396a80636fe999f49a848cd815df737db4aa7f3f8ef4f02206c7126229b8be8ab86a1d1677f00a8e643dbf8b2ce1a4b2c160daee9b0da8f0b046731050b69522e94c43d7e3b3e578246f226b4b040ae90054356eadd39b56d729d93da4ef95c47724cd3cefab7df2036f3663766eac0e562e99ca0d3a6a3490201b0a7d454d00cda762ed3488e30e365572715b099cf0577c86f4ae7aaf763c5031798f051a4911a2e9fda739312f4a22173ac09f29aeb1690b3418ad7d66f664b03247318f2dd0e8bfe6273cde57a2c2062d5409f5094d69f1cd0832d975d60af170212b50d267e42cd4f36a6a8c3d5a514e7fe3c08ce13ecffc7935bc7c1f3313b94022efb943306c6cd8813f531294f96b95e54f9ca767c1a23c8b71d85cf6ef856b9fe62d03ecb5d1b8513920c3b0008477b22d554675e697074381d30f1b2832ddfe214b7311ccbf1b261e00d2058d10f1cca77a46ce1cef9870cba920d4951256ac2612a6e79a94cdfe096f904e6e367fcc415b926ba5f4d167c8122d8e004751eec42c4d9cdccdaddb858e01df444fa56c43f19c63095552ec7e14d66cf8a2e3c3f67dd49f30fa5ae34f340319b73f820778812aa3499d965e807f27f239bde2f9442824dbb3ffa0dd7ec109be08d1489abec83be0e3d8cc527985ebf27f7361257388039fdcddf00f62d8db628b03fc19fdaf731c73095eb000206d493976ba69b796fc66bfb289ea772b4f0de31010f85a0c41535784284c9466cd7fa87362377d3a1893f394b5b938ab1334c08dfde8ccf7bdfc5ef10716fa642ee1b7c7faf3816f2bd6199f018c6b1d62a08b3659d80aeaf41b6ad5e7309d7335cb2397d156814b341ab7435d8adb7fec4f3a5dea8fc0e361680ee9a51475d00fdf94fffd783edacb0d5888f43e3d9118f1a4e6a2fe3e18ce22c4fc8884a3f8ea1c080ed992d8f6fe6b8f60cb453b74d8877d99735c24de07d506728880976bd4e155ad3e24c34f6a023d925c082d28566f0461b48058eb51ec460754b742fea824a74ede19b8f58e1082e908b60d07707b7c503de5cba86be4a2777e3d80ec28d0aa865db1a1870925b2e2b5aa62003692816c6ddc52b9483ddea59bd02fd21436e64c930e6df8390ebb6f57780d630a85fc3ddde901e2ea8e94431c7eab464a0860cf294d58359cc0f497a2dba18627f6ee973ec1153b0b98aca5dd1cb791ab70e449837512392e6d4ac5853a5bff6cf76a26cc0b576d7c99dcd42045b75cf1cc2ed7307c38666af8894e7e87f051357299223c2486cd8bb8345312d673ee0d5cc468c021330636ef0ce19c4b3b696eec874c9ac2a859fb1182f60594e4be2584f034fabad0ee34e55c8c9e16bc9dbd243f4f8ba0007875984fd0437a7fa9453ce7491ccf971ee20fe8d62c77543de4fd78f5249d84f572a1b86076110f2ed230fb6dcd4875e4acfa3659d8c7003bd0045632bc1013001d03aa62b1c192d819873c7a62ef3dc5a37f310d1e1a03c6f14cc666f632026cfdd22ddb6482ee6d77fa5fa39decbb24d2909e85978434b6d338127fc2bad9d2f21bd01dcb04676dc76d02babf3c60540cd550d4d02cc9d18b69f5dccf52884ebfa9ff544e9cce27d78f42bc9d1afab106cad97fc7599983f4bdf9dee1091af0e5f92e7971dc79d3910ab32ca43b0b4615a09a2e413de1cf9e9f3ef06e70c52fe9c9826287138fb821facf79f4b703422e530a044d47fe05640ea3dd50d5ff67c2d1c136e220e6c64d6f5461ed5a40c0559692532f4ee78a382895e50638ddf84cf51fb4c7981ed4a7f793861c32e715ceb330565823f8e0d76307be73e889f18154130dba19fe413f47bf0ba5630e7017d877aa0e3beae2f1a6aedb30dd926f79f3a0cdfb817145f8725c8dddda69aa2f781510cb8569d34422c66dd6c295d70c36e5aefe4ddfbe88fd55e42096488dbd5e09fc850c0e0a7cf3237142e69fb8be96f19abca3c574ac066335c982934c792a6602fb8957413e26e5ba87e9643ffe1d523f1cba5968b4325c506599e56ec41645d5cd7a04b22148407e30c3ee2e6d5cbe48e6c438848878106c715d52cffd23cf3c5a78fe7d7f493f0ca1f544e2cc1aef152ae99433d95e15295b165d27f9ba7eb478d7aeec57c3e5f385a5cda12514417217a281dee6a3ea98882bf602d4d73ee6d45b904e12d47c5a865c67764253d6dbb38803960f46258da5a9a9ed1fecb8e493c838b653ceeb88d3b4506", "536a6a51acac", 2, -51290375, "8f98466b2afa5503185f6b1b53b0abe79809dbd23094a3a95c448d4e12a9b169"], - ["b927e16104882bbc31cfeed938887925d361918e9f3979619cdd561312bc7aa7f540820269010000000400636a52ffffffff37be35a53c8956c27343bffe3f39d2e5e483b7615d7f419252dfdee35b1eae5b000000000153ffffffffc92c4d77cd386b26c2984932233497870ccb8f21b92f257f749e1b3b9c79390c0200000003006365a30349bd62e8d499baad2f387bd4235dfc8a59ad82025de40e96867f479f5055cddff760030000000024d9e4dc03f92b2e05000000000019ea1f03000000000153de49680300000000036aacac0000000002000000000000000023b6cc04000000007b941c1a2d507e7aa2592f1f7bf15f88a9a485d08b50e64c64a8a28570d1098f4b2fca17ba268dae2c956e6895f23074fd0b8aff61eae5173b34e465088691d732141405bb6da45c0a11dce50852a8154989baf7de53d5a1554681ee8e98ed2f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000092b012b24b22b3512dbc3ff24ebac62d1db7f893cac81b168432cd4380578fe5e933c1563064e590184cf107cf6700ffeaaad804b443d3998de7f9bafdf34e2f5b3ec9046c895026046e2b6933f9a63aabd8afbec21b833a4db8552e163fa5afea57abefdef7a525de6eed7c37f2c5288087d1312881e287f3db38a3c9f04f6a031c4d678c8517df611d2c2aca36fd3eb232c22c62c9137f5a8e024ecfaaf4382202006d06d7e4bb90d613691ff277d63f5b995c22889e2c7c8db6eaef3fcb23b27a0a02373a25c554c646c90ad71d56c7544a69d3359f713c7f0c30d7f8d271dc8b5bcd9bc614dc11a2ba2acaabf371d5253b0949cc75735c4af36fa64b4ae8987a5c03222cb29a2ea44337663a070aeba1d2526ff9df7e9d7867e08af53f06b827d6ec032d2ed42440769fad2227ef12ebce788d5377b47c374da443047b9d506c61d42e030472f35466854bd97ac8eda7493bbde8efdcaad0700ef915076b8e4265fa7d07020a59d69483e5a40bfcf9604b8b6e375acf8979f79ba210eb415f739858417731030b1a0fdf6cc1f98f51ec0965f159526499797c864866a8e13344bcbc1c63bc7bf9c9ddac295573f37c29d34ee6a4da857de2ac74d51ad90f642fe81b0bfa0a509f81054111607555a8e10a922dfa4f04dcdef1748fa6871ba1a5dd50de337d131cde7a852a4e58afc74120f86b54dfbf8ae389bd7620afaaf633a7b35f21a74123d4f7710094abd0d2bcfa53b6ffcd8e07774828a5e3fd45d18b1f0c4ccad337b9b5910c41e4d56e4c6fa2f3db95bb6368f6078cecac781d0f367c0f4f25fcb01ba1cd6dc4b99721f90e9f5925bae8cb9b6014efd1e23815c133608ab5fe13c2e0a65edc0f95ab9104bf45a79e40a9d55ae70407e563a41d9ac6474bd894c5dd97b39c907cccca949c916152c6104d151d18445ca0092a5349143f46d7d89566228bac253d3873e77693e1f74ffef3df5d7438bf68afc7e78c1b4334c746c05742b8ce2be35ff78eed13c382e326a3bf4e0e6f93c83188126c2f8aa04cbe16821b005dbb0a900d6f62027604ac9f8880e1d9f6943164e0d1f8123224b88172c779c3592356f3ca8ef9d6e3fe6e02db46edec8d0c05b0d73ce61ca15e11ad9fbf540c277c2e8bbd57f4dfa57d0645e98e786bd6edb01d1ec67e2afb979b05485c9a4e44e6f760473687a0d7eb83410d36ef59a51a59a57d20d35792098e8a4fdb4be8da552d6417f59642e2dc6f884b2a13eb2b5660cbe9b6093b9594136c12b129f698e1e477c142af4b8ae095a3bc742459c8be458771420a9025e22beb1e9ae70ae44d67d263c21cadf4ab7d262698b8d9044dac1b3789a34b3febb377a988209244fe4419d5f6d446a9d9c9b17577287edebf616afc66dcb570ffa5a73090c9709f6beacdd736cf3f433d67f71cf2df2c21cfbfe4d75cdb25f122aee41d1703eae9561db362f26fc6e0bc2ac50a318482256a6f8e3a16baaafbb973ebe9cab5e16b52c4b8922d2db5275ac70b19841152d10cb99466dfa3b1e654f4b2384c26dcef4425c6865a868bebbfc88ac34cb570da56dfb1a23316ed92e1d3e0433681b595b51a4632c6b18ff8d71d9f82aadd3bdc3542a0c83d055fac4bf608a48816a932419c90ea43531d3d0e563f494ce175fb4fde3d1764f3b39fb7e63b50fbe5dcf904903ead5b544b6c820cd58c5e5ac3f03e86572e1283a1413c1f09c513c25e30fd9420bcaa85685b0a085e5018d9b0c7bc36ce7e237a92f06b1ab02c50dc0b55a0ea360ada2af50beb39ef17e41ba6b05fb16891345462f6bf3f80814ea24c43c04d40ac9f7d6b72dfd59f1435111cd14a434a5eae3e229f9a6d29a1a83f2924531a92050776703ec1d37d2c88302a1e5ead9d2d19ae625d77416f092e076e59966b61af53783966ebff7768a14f2fbb9bfd95899143456f09f0c60a1237bcb97945be3c630ed60acfbbd7a5e4a15f47d85ec3eaf62f836f71955fae0715173572ebd05bbc57f4a1091d0ba1935b2de560f7d2fc842344a3dc46ff2d99469bcdaab97f1ac8c2099f650bdc01308d39b2143be9644309447692792e2c34e6995c4a40165556a8eb1d9be62ecbd25f0daa358b0c068914204138f89abf93efab7ef1dfb3453c0612a8dfb9ba00f9d16a173a3af7f592faf4e70adc096abc0062198932feaa24e864b93c8f86dbe3f91858721ef78475a15d4b5340ace6f3f2502f2277358397e010c0f7fd3c0031b7bb0111836986f778c920eba9ab779b4aba6d5e4cee9d0f5be0068725bc89f0ff250000000000000000ba57000200000000b66eee59ad5c9cb30e0a341f103f6dba58ce707d801096be7b947e4ab09fa401ede9aff97cdf256f1094333bd8c70cdfde35d8600a019ed8e7e5136c0a647073f8aa455fce1045f406f646e785d8c16240def1b6f17e22875375f482dadbc8160000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000078600da8f1491749c1df73c6aeb05e8583f5c8cbc56a70813be126edf09d52a1992ca9dbfcb50bee6d80dcadedab1e8afad395d2f49d1a96697f46be23a4db5ecf733eef0855cd7d1b36c1b4fda9fd3c967f77e23fe75d5e05bc2b84aef6a081f470aa0ca0f4ba63df883d53d46362d7d6adb1c1984cf7a6865865bae24d1b92031afcbbb93c53f5fc9d945c7ca28bef2806dc95f5baaf356cd73716935622bf6c02089c2aa3ef7978bb2c696cbe048d94de5912d792e9fe54bf71618098b80fef280a073eb563448511dccffb73bae916325f6d5f1da340c91d6ff71cc08c92700ce24d9d9d3f1f1feab721d159d58504575042aef8a6effb28375ae8866899e0d3c80212eb42679aa5b7df6e14a68a39bf983588b1e0f10e032cbefbd25105cfb5d0c6020a4490fbe01dc691305d461fddd65be2f0d2498222cee3c4b6ca438f60471bf2022fd05316cdb52563163cf2340f5785396ad6df8186b7e8082e3ac899e305557e03123b1cebe3e02f42c01bad5181487a197482803a68353dd92dbc09f5ede53ad1020cd70287301e0f1cac02065e7d7f1e587c0f3363d15105c3456dee34b7695c346a445329ffab3fa2d80b58e65c7ea3b07a506e00a7c8e39b3b001d579c831f31b5a73d8ac6351d3842d10c07e6b5d1118b51e8b8aeb712759145dd31571e4de3a2d049fdaedc49fe41b4a5e9c7ab30bc6a1bda2570cd68f69486b04ac7aae4410936ed7d545c20081bfc9f4cf1dfba0e47f0ffe71ae0e806bedcc92db75f068a62bf60617b33dbd5afc475cd86ea980fa17d2acde1a90330cc73945eb583a20645edf223ba61054191cc3431a805b49dfccc38a87c316b99996110ae1894085f6ce464d720a4ddee848684fe05519e75f5fd6cbd67d6e21256c222e173be4ab8d333074d301e6b35c2b63ed5f574ecf7677a52605de32da1a2e521c1df7af1caa83d9d0cc744f8e7fe04e40c2d68f8b3acb7281d00064a4828e5deec6157132dc2f84330c643f20e0850b01b89b20c30b9d766e562490930c73421fda481f6e5fb5c136ef79050cfcc430d879fb5c4e78b6117a7af5c7037971d141d996c8ea4d702169b6bc3bb70dd2751466aa4d801c37975746da7fec1f99c1eca6091a6045ea16c1f05df899f7a9081df5b81a70eed117134564eb9c71592fb01b9da7ccd89639b0c0e8ea74495017051f5b4425fe806751ef54b701d5a6a348333097a12372195fca56e18e9be721d1e0500e56fd12f6fc3ef4d43211c35c417ac456905e479c9305e5b8965bd6b98cc2b5496a548b8e5c571d2b79655f40f1588be35ff7967e0f91c4c8f3ef4f06a2207771dbfdda0f657de9283c49efc3ecbeee754d96e00ef1a51eae61adfc2533a54d6deb364cabf0bccef932f856456041126c91378e64b31746364cae77ada9c7f3cb5de682b2a03307464c362b7a47d1ef1064acea108c0f5f70ad9da9a7a8afbed358163b3ac1b9952624e4d29afafb6333cae414f2003d7b4ece41c3070f5549cf2bd6a6f049821ee3b2ca9ec69356f76b937e17343d5e4f88f7e19d40ca5b9526c14a0a0ed8028ec1a5eabc41fb1bc2bb25664e5c301d642a35f4ce83247d578f34fef00ad19c1a12d5ce0641f5e7e333c601997e65e7b0f05b4f056ecdd25234d1e37347ba07a88a700f649b27cf2e7b55917b1541e93db547ac5df42b71ea21d855df6f4cb984ad802d124eee3b9c6eeaf025a6757556a2cdb014c654acc2f73fa61a2a478f0d7ce3efdfbacd0037a5f3731108f27ec1bcc55945ee73ed17be4c62618383605b26b7439cac246d1ebb617a74037d6d635432e370b0fe8bee2aa842209ef93d950fcd9a6fbfecb5e7b8fe42cf6e0649644d4978f8b0bb5dd7ef32cea34165c94327a99a8a121d4395e58f8cb4ac6dce6c19f487bd22aa62078df3664c4785c5afbbf62c6ffeb3fb037c82d740699107ca29141308958f74dadede34576b92a29e0847696279ef5a228578f555f10b13ed45db6a1c67155ed702dbb27cacf84f138182075ea1da4e91bb1ce4c0fc76abb07e880548055fe45b42e25d16f4e0f8282913fb4ce1da5622b391271041a5d05193709f6437fa3c5713aafb2d448cdc50ed059c1e3ca4a1ee8e325e50c9cdcff2a09faf750994260fd649737f645e1330ba018d2d7fee4c09dd294210c6d9277f198039647134cb6cb17f26d9582ea28e1c6e7cdc285a5293375e05a042647e9983f3330cad4b6f9c1cc7f89def9e3939985d615df03d6a1546e5d4ff98a8cf1615514ec32743597123b167947722cc42303a3dd2bebf95f577ca6cf36d7c14b8e801037bbb1e1c19473287126636df81df8b3267598bdba91bac1e86f787095fe32db6463c4c1ee5960cc9f562c06c7aa7843a92836e19d6d05d2f17542e013bffce054c233ab15f3a4ce1703", "65636a5153ac", 0, -1216581211, "48af4464544099eddb0980a4e6944e82c1cc6ddf738cad9eb33c1b6bffc39c34"], - ["8e9bf26d01e78a2affb026f32b10c6b36f2bc3c5a25c89066674919c2275e221bda1f65d34020000000451635163ffffffff010b6abe05000000000453515253000000000357daba00000000000000000000000000536f6563a12210fbb0945bb97a3841116e6483ba4e419ef0595ec68d4f83f142dc2af892e239957ca9ee905569963b1c74f573aaba90641b0d0416981cf4c11ac9f09fabaaeaa010e51e4ceaf32dc8ce5ef6337abdad54717acefaf92225335600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000179cbd5cf4bc16743b8501f79c686178745329d4fd38e003d227fc5e42c3f9714671b84dd8f6adc383d841af38006d773f9a76da5ea01e350f550306476da3b805b5856a9b4ee6ecd949b073f19aaea002b0d0e51a884485e2ef92ecbb28b15577342027547047dbec60be24c9cb6b5aff9b318352fc11dd68af0db459c38bf00315ead984fd4470b11f2455007fff4eec4b47f08f603e9a1e1955d0feb799e9e10326ad4401e436ec6cac24236dfa5d21cfe1ffae64e84830d4fc6cd74070133ff20a04d4c1b01f88362a42e2399bdff64a4af357592843dc046497f6ffd91949e48e25206147d23ead271cd5c3b37ccca774309a977063422b0c39d5e4afeaaa5f8a0322aa8db8772051b2065eea7006481855987deb6d42e8c17fb70488387fdc1aef0320baca05330967fd85114f12f5068ffe9c912a4cb5b9f34cac14f28da4692a5f030de889614b23913432abe336772f8f4f5257bcd22221701b285d6548bef0d29c02113a64b97546321d854b3d4806dfdac68e5700a48691cf69139e33c13a222c0d0215e4647b449343a0350e8dbfaffe90e8b4691daf124d5bf8ca6db765c5e8e3d52c8cd1fae48812cfd31c486e3c5c95af655100e0e0a2464b3308c66925f267460f4d5a0f42bc7af434a8cc1046f85c303b048e60dbcd258cc99bf5569c8da081bcd6a3cf7747ba9a74440b40fe3b8f02364082d86fe7b24d1c1d818d43cf3c72551548fa04b9751b42ec54cb0a00508c4a927c9ed35a4a475fec45aaa9d5ce9174f1ffd1dbb24f014fb3e790fe611763fa91680c8fbe7528ed0367d98ddb7cdb9fb2b0ffb3a518260e643360f1b45ec172157759be027a586580cd9840c1a70f350ab2ad7f9cacdac29a703c011aac4dba58af05b6756c58f87a8523da6ddce22a0146c37f964380a44eadd5eddff5307feb4047f163ecce3f97053bf1208f61a09f2e462e735c157171acdeea5c7a0d1dcaa0454ffa60c5cc8a61838acc522d049d7c3c3fce98a209befe6184ac23643173a8a8f76ca75a9d5eadee94212eac569a04cf3abd4042e082362bf4dca6ea57916e70a67376023882e8941429b9f370b6d0da5d0caa00000827ff144f64077e154b24989bd0ca478bb0e28d8fc68c18443ae393eca0cba38ad0923ca60ff717038ae1055894439ad47d85365bedfee877d5d87e63a456d9b9f53a8a734bfb3dbef9db73cbc041b5522b1e265fdb37d1811e2bf72980fe3380c62a0ec73fa1294f45ef39bf8d2f869fa24f2226c493f800b1020695da1ddf54b9d787bdcbda322bef031a4808f874d414df933ccff9fbb435bb6d50c62821b55b49f9ce0c51eede2ed6f9f4a96e2a91e381667fe2d7d861710d28cf8e8b4cc9c7b82439c0c058a784a0b008ee648818cea7d50629f62833b5d5328c08dec07260f0da7af1d1ab23709f60b3ee00e11b3d0e48c746fef6725ae98a887d295e55777d85486aadc3c700076ec87f1e965188a4911384a1092dd7e833b9a05980b1563c0774121a175df75147b64dda17a58d0d0571d7a8277b8411dc1157f1743ff92c90ad0be64aac867d4d03cb6df33790152859bd788c9b279c9407a59ec3b0f72bbffb4d83160a7fa47a2123cbb4c12ed6876087605aeb69cb62607f3ecdc625af66d5983a355a72a299880197426f26a4955edad2516bce71d7450b0e6fceb6461311cc57da93fa853a9badc68cb13a198991af04e8037d5f5efc10b80de66c45ed71c18b922db0128e0f1a0424bb07d09403d78b60532ae2441120307efded9be067a6b79dba0beef72a9c9b2ba97f47daff015ff672f3a7f7d95134a778cfc3b73a9d61e10a3ed134226d1d490c0d84c1512c41abeeadd886b1f3ef37fbedd5ea469f4ce89d2cb06dbd8bac0b0697a7fd2de09c24ed08bba770d8b99a3758f7b809153950f3c393f6f25fd2cbfc9e015742def8713d047919baf429b1333107e89d433ec95dff8882c99e484d08754b5b5eb404277b108d2324a345595a591cbdfab37f71264b8aa2ac3f011f23a8be340506b61dc72e0d021c92fc137f810e432dd9a04d56a9ce67ac15420bb0359a9c4b188c161239fa91f15c44cc92f6cc2e10b7d92a98a93135f55d4616fd209e3d4641670143039b6cb8852eb409be7095b31bc12f77194c9f0b7389d6924975870ff43748fba45f90df9ee5885bda345fe164889d0ce92555f8b102ab312dabd07fc0103db139eae5620fb9aa28a350c24295c532b3b171d724df3a097bcc683f183a8e407a13b212cb35d64277635ea18f8f2a081dba67df010000000000000000000000003b322cfa923d5e7b50d7b24b8394fbf1f45fb83e2ffd8bd73fa4933d4e90f99dc956d402339ddfc33bc30e017bf575404f5034b26123577f41b4e2f0375cdcc2e39e7001ac3136dfa3019070c0a0b42b2e6561d74e3fcb142189044343737e30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008f93e8e24b2f3fae8459a43a8cec3ba7788fef294470b18904ff9f8b94155dc16902ab882f951cbd994b795919fb49e3e23cdacd2185fcac25180144425c9c6cfa9bccb69a03cee537fd26d67f2f44e0a908b463c0b8e3cb149d3ff3a0aa2e415a79ffd5992d409f02dfd03e7adf38b0cfb4254a151f5240457095d96761d3280300c9fb3c43e6cb54f49e67eb43bbc0bd9cb7460d415154ba080afa5e005697830220efe61c78f60c6fa3075e8dc2162dac967a29fcf5253d39b41d8924ec3e59730b00126a2d4eb1711936c5467028d8169c592ee61249a74f3908da1168630da86d3d403593445f49af525126d5691228c9a4340b5a057d49907ff77f1ae964699b020cc8dad5d82e0799a15149e03eba5c55d5dd0106355b60787eeced125eb8cf6b0221adc53257f5fe8a0e077cf95bda280819c582b2510ce56046afacad4af0fb88022d3b7d386a4826fe5a5d916bcd6ba39f6cfc13c350487eb816fab3358fd109090314880b0722c235fba2e09a92206fda596232da47461a0adf4bd1163dacc96220020625b9aa1e7794062eadb0df4a5402460b2ee88c21a9242d89a4472437d8eeb8021d5ceb1904695eaa5e605e533c1235538073908e18f649a000a53087c60ca745b5e0da61902440e9ac8b03449ae746143c9ca5571f575303b127a3e06bab8b4ed7f637d714e3c75425209288a427057b50ec6ad1e09d1b7a0732174a09f8b2542243ddd5e70aab6288adb24f5fed336776576f26cc3f052d35812ea832f72e5a3927006cba737d979cf1f668c169363e48315e9c7daa25657780442ef943c35ed5f9ca19b33632e56ac1629339b4a2c79e05c450eb43ea53c8942335750db248ca962ba94e1186f61932a33884508ecb82030d4f50bdefec949627d1b86a77d78255486fdd883949eb2617a6d578d801cd881540c1c8229b114aa734b3b3bd54149f9592c2d4b34a4b7cd5ee95ab49c60217e4b5933877d360573958ab0cb47a1a8564f195d9c2c4518336b43fa54b988d27496ee9d57f32c195d33038e00bc2fde6bc8c6dae83108afe8b81ce0a09163c1f58f5bcf298ce15b9d12490b4f20fb91cfe18b538893a821fc901b6f6042b0fbb42ed4c73883a5e6e130cb3d4331235b4ff276091f552fc9d94cf767013ac7488742d9ec03fd07201c2c727a81bdd82b33cace27c16880a25282059104fa8a4a07b2f8c0e459a06939053c35815bb8ef84712b09073694895a908345943c6fd41730bd154d9b55a08a95de72f8e2442d591d7d6dad3ca7b572409952ee795402b8a939e4558353525715cb241c5960f9e74037dba773808d2bd88eb649158a2b4d0ce7fbad1a8c58312e372f088d893e692f821bfa5d38b8b4a12b5e3339c68bb7a65f6e1c5f3f279519b9e3a74d8029416e4a0cec7ab502ca301faa60e12dc6bbe8172be334f153493b54ed9a4ee22a920891e105a79c835464945ae9365e16b42ef57a6d6762514fe5554b5c4121da5c8473aeae6d5d09439b808a165f5720869219c3c724b9441499590b818ab8969c248c033721e4fc1e3144fe5b6aaa7b412d556c9cdc2ad5622aeb64c70e9fa6b14f4168c4b75c2c44c125ac3a5a9dbeefbd6da47d6ddf4f47baf203402cf9ca6472d5dff705568e46ababe115c6dbad8c4a3978db8617f29ec5d0c995045fc80458f70e35b880701a5da00005cb696bd6d200052b802c384e38d5bdfe27c1dbb66d52218073c9b634d9c031dbb30f586f375c7e9cfa9f87b262489573545c5038a9faaf5ec0597d18b9f6de776db434a0ab98245a269a1aaf4a691ab62ef7f9daca93ecd94df569ed4b9b8628a1450ca2e1abec874895adcbb527fb4304117117de15a80e3b1236cd87dd183f3f48218302484cb2de837486ac46b5ab98caf8b91870776fe9d189b78558934f2715b63736e0565c345da267fd57d499a6690e41ead2111d633e465f1a54bf4a3da5651c3a5c9048ae45522d0c18a103f235cbe499375ba45762f7683738b842bdb8ce0d7d0dee2083d3e95a72bbd14b5443c0ceb956e395bcc4bf6da7b1093bc40c7d762f88d81cdc7f941a90e0637ff7ad8292913ef88ce84d28cae97fe2c9c639304360a60a88e0a297b4a07c7260fbb41c43128a6aa8a6618c7e384b96a9a07a097404f1865ca07b8659f0242e624606551cfea62dc1867003234e8cff0b52a86e08e28025fb68d21d27d64578ae6bb207146df62c99b86d3c1545c78b5fedbc053876f1612c00fe14d4ee79d6b91a154f5731ff538f413e0627da0d6bad41206f35b7600000000000000000000000000deb66b39c5e27f5c581a623a4d5a5f22bcbe97d01797d92d9448d477d8e7162436c675754753d45d601ad09049bb2274ed179c1be136b1b2e26e55d7ae1572c4f1753afd9c23a8b84442b948a78b4aaf0259e7fff93e9a5fcc532b16113a2fdc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057fc30723a13f8775fbcfd9de93b3204b6546b3229fe80cbaf73c2b0ae29c057bf8c7d93a2b4b6ce9ff73dd6f569a2e1ff095570f9e95f13199d6f48423f438d4917aa8567be351e460e3158d539075f94f7ba745db27cc3fe7cd1c47264e62eddb089c88b5cf88ac164505ab3b344e59526426b5555842d7752bc208a40b726031180c4615556179928d58e6f837774670e942f2ee1398967ffa90409aa1efb5203016b71d208bf85a923e7df49ebebf8db25390bff687dbe02fcc327281fbaccef0b010ea13fa5ff4becfe1ed1eecfbea144bbb91a071570578762c912b5351d89381a27cbc490bc3a66cc55f29c32e87f56f678fc9fad3a928f7c65ba04b78f09f4020b300668c8b6188bad08b14202c9f6ef46eea29ff66e6f37cefb846151dfcd4c0300edef758e8405f56393b777f6f5c4c11c629c86fc1bc1bb93307479dd0d9b220318f428acb6b94dc22ec1a17eacfdb5787397d6f06b61493d0e8499d21d719a4e0309fff9209af9ae7ed33275736db66727db5b0a0f37d6f6469cd06d63d42e75fa0206e40807c9cf7b41e45aed67ac0f1249c7eb902014d95cff7f85b87e9b49125d703bd8c04d569766ab41c0df470cac328f449322d7627300b12e477b5f1575d0f072d5ce6f8160c4e2bb457e1cb1f34da75b84c6154391cf6ae1aaf4bbb225d99bb1053a995bdacbfaf47e5044c1610fe139ab4c27c5a2de8f387395eccb862d2965c8cf40cb1a161451e76f6dc5950a67615ce228bf0ad96a74bb6c79ce6fa0a5a6a1c8942c71c1d1929d621820676ede008503c8bf08e9402924f5632136c404c46c9c0163099c73e5903f75e9472bf3554f23d031b95e018cb91a15ab3dd82489440bdade524eacb8bfd39bddf0445c34b9351f5736aa88063d240cf0b74c2b611f0fb892e68d4ce72d685d8298e39894287535551d96e2a26d11b5a645c03bef638c1ec48de7b10036aa8fe0b9434591ef728a5548adf47544c507012efadd68f064286bda3f54a9aae65125db6dc9a0398e62099929cc5b5f08ee22f29d243d990f922b40ba3ca91e2fc2694c221efb481ec2bb9f7d8a2a34d09c542eed6889ed2c83e0c6d89d95f43846318c6dbac7e33245bfb916ac7ebc70dc87469b748fe8883a0066281555e6e1e193efe1094a711def6118e0d70c7e5df01e36f57e41aa6ae53928f7bad92f1b70ac6d19e887eb7b79706534769e2079461b183233cad920281bfeb7690ae18010e331abf53652d3e8a4d5389b3c7181257d12f8d1f33bbce41fe992cb0a4333154ba03e56c7783fa11f460c6e6605de0828c3d42b823507652ebad57f860ec1a4cdc28d6ffae71f70d4d724a9072b724ce2fba716e8058f5dc6ddfd5259a4f65c923a5cc1ff2bedcb7e7eefabcdd9f4519b8b2f9231877e5a3d3c4f014f727b094df92d6d4046cb267aaba0f9fe0127f9b16aebe6ab0a2ece436df8d69b7f984a866e8c3ffc1a92bc76120d5ad329576b6a8249a6ef48cf2aa98f62cd504633f0d176000e3cc677eac16daaac6696ddadce62ca0855bd227531dca6940905a1c4416cd781e5ecdd0717b79ab5592750cf720f7eca3cb602c46fa6113958330afca0f827894cd2223392c7e81c95ab713339b980988cf70c8c788817ec69032c6d689473b09cae039a249af93b05fe8f00af8cb396106ae52e55b7349269733d5bf1d23c900e7c5f8f5054af6d15ac9aa34fa57dc9eae83f9b54b7ec67517a319bb74f44a9091886cf15a1686bf1d414754f17487da5a2b5d07559660c34dfc53ddec87784a28c5d618a40b9c1a59e58ea9b17bf61b10517647ba0b9d637ceafa7be6862fef09ca8128ff89a3c485b5f75cee17e0271bc370f1368c4b035074fdf5299fbf4c9b067e02c66d659c1282e0de80737cbe51fd747463586aada1da8c29cde1173336741d38f506c755baffd4f9a26302396c442226160bf7b82ba65a3bafa436d84985d88e6fec3f82250121e70a06d3efc9a27c6b034178b0beba91713c7c9461d4f076364a2fee436cb17e025f10247cab823a7d454896bd12ae24287a25bba3aa2ae97552d2d72205d4491026ee88a48475a3f9967345fbfd53bcf3b00f72fd2e8dc6ce2273f295518db94fe9657597d1dbaa202c8fefec14de8dc5ba5219851512ab09e5c9f4d1895570a505206626f98f4749fd611529f57e851e331e34e253383ccdd1aa08aa9d1fab9ac475d7635a70980e494c5cd5b90f9722b92458ac03dc91522ac627a79dbffe2047c7ae50047b3f23e84b6907beb42302fd782af67f4a3631829cf4810866ec6181fd1512bc590b359c4fe510d9968e0841a83f5df7ea7afa9bf6612b1906a823b3f91a645e7d48ed8559f4ceb23324917edaf019d5e748fb0b489ea7c824ae207c04480a37110f5895b4701b73e9039c75f8ef700", "51655263", 0, 2093713635, "4d67867139cd1f53422ddd8ca73551cad09042d5a0c032d483ce9b10ec558b99"], - ["030000807082c4030301c59e0b644f93be62660a5bd0276f6f7ec0db62558a62a4b9e56777f84805a0030000000563acacac008b269293078ebc2563214f2a8c853bfa20e7dafece994c6395a1f0a4b2d63e701c92487502000000046a6a6300ae832a4f574d1c54931fdcf3ef1eada2886db3896af1b92b307d11d38b1b501a2db6ca17020000000665655300516affffffff01d3876405000000000863005351650063658e073e49764429940132e28901000000000000000000000000f3e41b8abd9ad29ce2630b48f7682e66fcf11fd746b310cda097c75f1e8181a3727d24d735a60a178aff7a4be80c46c4db20debcd4a305ef1b87c1823051946ed5d2c3dd81b3d8dbd56752199ab0c9afb46b18de42270f30a8125601b2fe2f050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000056403bae02430ecb72af1e8dd9b7e8e88fd4284ad83d4cbbc5fafc065b22eb1b13dbc36e8e1f18135aaa46e24de2e47a9985c735eb5d70a9bafbb83b9d24604e405f4506b564b56be02fc1347cf3b0877db910598232e0db2efb8a6fef6c090a642bf1338d937d1a54e4188460ddee4afad69d6fe92031fb6de2737ae4fe72a0020ea0a68248c7d221eab0d34b7172ecb535568882a178ef09166be6b71de541fc0213c0efa34a9d77d74c4640e16fe7154dbcfdfe967a0291b7200beb4a8fd96c600b02b030e92ec02ca3084c1ec9e345e9e4ddf184b9c3bb7b78d99c93cc8b7f5df8d496da11ae08ddc1bd542aabb5d7b1ce0213305f9e58eef14a544ee1754fb5590208124be94ff570ce2f9e520940485dd2cd546dcfee2ca601465180b85200afb70327b7e6404b87b3a040e57b6445e3c80d52b5a2956a1c3b61390e2be6cc65951c032ea9406410ec0fcd99372a08e852f897fb7f4bdf9735f0f523683220b682224c0303fcfecf980d612e019abbb6f20e76676f4a980d8702ca3251358fe91e5a40770325fc32c798dd2df9b2914fb8d083d13bb31bdaaf88530b83bc93cecb2fd3e8aeb27c02bd7cd708d01fa4e690fa7e138ff05cd213a4d3a471a0a4471b12fe0f507bd7eb6e0d0f6d1e207636ad4e52379bd87d9f8dc3b122b486653d04d70e598c55de73caee4b341fc1099bead01eee9dadc7116b4445df2a5d51c251a9c6c58c4806c63cd778cf4fe290354f2a9bf618288c5df0016ff4111bd1275494b95dcbd4032152b7aa572306f9794111e6446ab5d22b5a7df5ea2bb226b8f0ccd2a028c60a57a51968fa64debb8be73c29a8dc46deb70ec02201a5a69777e8c6b37df5fcf41c35563612fce1dc59b75507fe2e3da6c32778fad833a013ebbab6526495e3e5075062e2a6be93807cadaeab39786413a17a26387c9169e00f075853c6c0e2d52c063ab8aa512465be7068ea543fa994dd12a88011fdce2acd0651c6b57a29cf2c53c159f8b91569b224a953dd2eb336a848613dbb3d79b1806867ac9dca09309e81e49bade92176e7ac45ae61f041fef3ba6f4f4c6b00bcedd761d05fd0b662a313497ff31baf6fa0ac43e87ac1af53b685264134680b660439da5435af1c65d0ac4570a8a87183ca766b9f11b4dae38d1ca347472b3f78f86cf381127ddb25835c562109415ec933a1e25935a742c2a96783be19b58aa17864469d952ce77ae9ac84b370d3f03354593bc197ef56bbe63c33d79b2f16d884486dc13f8068eaf9a2acce98aee9797d8e49b0ae1760fb07f2424648a2eaa7a794f04f282457b0c10a50fdbb14195d38b94b5e1bcac6f92e4db777c18f08d81ebb236bcfcd12034536721650e3ddf0dd0e963cad6f85f806a03ac49229b9fa5b5ab781c381e5ce8ee70f3e5d4c74ccd35d5d601b2e0265723fccfb66b830c924ae594a55c169ed8a3e8ef036751554e7292cbd9e14d8fdb281df3054af02eb550f8151ad3cff450a719cc390a83a617a1405658d0adad01d1a8a442270fcb739da98ce597c5c7ff3db0bba7635b3dee5e955241b06c5704dfeaaf97b276a5944fba1256c65967ae2bee4bd81a1422012ff41db234e08302d44fb49c00b070863c975eef1617bc8a26f6ec1e2757f6aafef2e97ce3a4e3c1d6c724d4f0194da9f4641b9ee064885ffed537e9315bbbcd6aa0b2547ee0458b29c1324ce8678d3160d07f0a9963df42a3a9d93c6c8a2f027c04934c9d4a33f5f477db1605653fb9c4a89fccad70841b266c9a1c51d895ba0a5b3c041671a1b7051a93b0c74b9c6c404653757dd2e60ce770c56a28552815b11ab73d044c4f3fa8f7d19c6fac53bbd1a139b7bdd2f06d7622654e18e7cb1741c6e5df1938fa26803309299cfc52dd844aad25a34aeb1625967fa57e880d90089cce06f9a9079c7422e011a72533f2faf96443936706374621c6f0b633f3f6760789ce8298420a3813779bba46b46d93e67a748241e8eaef9baea7061bac3a66702a7cd291c9c2938ee5eca6a6b99a6ba69784a504867feb64abff76dd4c33e23e1f1da0ef17973e97c25cb9ac78da4566621976ec7cc7e0c1d5ce5840008c98ccc2e2d2b92140d75ee19b28131f5b15a5f9fd498e9f91c26e4bdc62a9e6de18653e7f333db04dff7a19a5153cd177e71d524a3b09f70593c304d78e982837dce54dcd16cf0d5a890f2ebab34bba3148bafe92b90c79d655ab4573ee202cda191e6170419c026dd0a447bb8ae339e8e861f23b2da8f9c77d0809532806e8edbdfbc74d5a82fad5b1f4900ca42adcc1108d578212bbadb10f5a4e201cdb391d6403c84d7e5a297f6d8c889380cd4aa9cc17f5e1214d3a746a9447ef5f0b46ad94d08452e9d989d17444ea4a8e8a6dc1df23c82b01c4aab3111fe28c66476db9219fc8fa45e570d", "65516a65516a536353", 2, 1429609186, "0dad95cb6b91cbd29b93b06c8a731c698af62cf1025b4eb1ab3d223cbbac7ad8"], - ["030000807082c403024db20a77f7383b3a8f0b2a4d731cb229250ed1b438df1c2dd90002052e0d7321020000000751acacac5363000779237fcc4bafb65e2051811c18f2c3e37b8c403a1acd429dab9d45f38408c17985b6b30200000007656a6353ac53acffffffff03623ef700000000000452006563e0eefa04000000000363515144b97f040000000009656a6353006353ac6322f932660000000000", "630053536a", 1, 858978262, "714a380d30781241903a012883ae0c575cad54f566983f35c47154f0f289da3c"], - ["030000807082c403035f09d063d0b40b58ac9bb9681d8a23ad2bdca8b33ace87da0d0c359df5ca2e35000000000852006a52535253535f4d43705b49bf8c2f203089c0b3aa9f298a5fa73f8286349e3aa3a69baf4cf697e53a690100000000ffffffffeb980ecd84b32b485e02e182743ab788d17914b683e17db9419dfc1de84ef4b60200000008acac656a65ac5351ffffffff028b04aa010000000007ac6552636a6363f93bea00000000000500516a525300000000e8a666a0020000000000000000949c2a0200000000fa31c20a503bf33812a7a0304d321f49184db12b442b26dc7074e45dc8ccde4f518f63a18ac016a8dbd831e00b702160d7c57d6f0cbe0f58a988cd052ae572badf6057fc5dac2e8744d113acb528f1f5c2b131331b358b970b796024a8e58e0900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000923503860251077db5be1a2efebfa070d83747211430f53c242142cde7fdc8c3bec50db4d50df073704b0cdcd462c8ac4a02a548cea3a9d8006d0785337aa6578a36740e05b0450431027c925367bb4e6d04b3bb63dab82fecfcc131bd1a3c58ccd9ebca1a1dbedb15f4a82943664277fffd4ca060bab7dd17919260aa925fb40228c66d0050b973ac486dff92deff5981154e4f7ab92dfb024d36012aa7ef07d10303a1bcf17fd771afdc389d2716b66166be9e985390891eab7c579f08a95ce5fd0b05c3edfd5e96dfa1b65f385c4e2fd0bba3c972e9cda9d88f140d69dbb2f5ddb2cc0ace3d9e92ff827968bd2d3b3fbf6f24543002ca36888895d6ab0a3fa1eb3702245fbb01a52e73a1d169565dadd7b645b12b785500644f26c0e13cacea6761b602264073386ae0dba6e360496d7a66c8c28cec81da52a26a550287c91b2e882e5e030def02adc7b1a92879623fb4159f22c9c2479ac076ddc4ad3b8df653f87dedb302117769a538e2c308a37eea12a0dfbc5ac4c03c66cc75b97d0a0d61865d459a060221de8da9beb8f2154feb1b93719ff4a6a9c489fc8312ee132b5463043024fc60f05090dedf18dd3d6e69a8eb3e043735201c5e39debea65b711b6ffd85a525cd1160a67a9a2e8c381ef1ea0b385661d9a9c1f22b05b20fc81d83ef0e300d50a85054547332f182bf56c132bfb756a8676814dff2e49845278ffaeecd185b0ef04a7339247687ec9ad1c9ac22da5bee9225d736d6e24098873d36017d23fbd1820bcdaf70b734f09dd2aa090a82c2345d7565576611e107cd0652ea8508fd96bbbe0bd526303815c5b9042ebf4d98a1f54b4fee97ea75ef9ddddff0243a5b689c0179545bafc9f66f6081891446292edae9030a760b4d09a1d3514a68bc756e964f3873437cd224f699b9d2a5a02e763176b1d6de89213ce7d2dfa48a54d3eb30428bfba5aac098476cb78a27d02e948d7792b344a6a6f61f2a4169049812911d34695725a035d16695b8bcdd2e2f08e27d50d5bd3ff98607233755ac5590616a4231277f6c61ae3b40ae2dcd3cd96e6d23742c9a3bc39c135a37c1cf82947f748da07f910e94152513720d8d4f920cb96a73517553b865cd82b6f71e096a80e30a1b7ce60ba1e01350d265489738cf9751c7f720fcc8fa28e81044e14efcfde7eca71672721e19e1e7f1b3ab7ef8feed5eb66de221c9edd7a6fce08f957126640242ebdddf1b25e93f0643e1060b843dfb2bbe15ad9cf920132cb6610997f142f1e96778b0df604184b0d10e0880ebe6d9ef89e1f99b8102e9e29cec72828d41b74cb7ba0c40a8280b054bfd4c98f6faf5cc42919737dd5a0dd9f37cc483f172368ce9272d850323827ec3fc19415b49b0867ecae2e2231d4ad0f974c87fb4b9ff7da9ebee03e6dd37fd61fd87f77845305d283a8ca520ff07c0b5e6cc9d20eed8a6cafc02a59428b8f9f0426442ecc445d7364f57ab566584e5dfc566a387db0693d6489e76b9de7e79eb578df5ae13bae774d5547c6d6f7e401c9f0229092488fc492764e9fedc4b015264f68fdb3dc9a2975c3e3b3292d5b3fe769280f31def8f02015ad308669c5bad3fd0156a093844f8e695618b4525d815e5d9370a77e0cfa4c8808953da4497cf9dacbd6d171b175f262e97ada18527a2bd2b65086e36c8b306b737007c625a7729c7bdb822db83bdece5952287dadfd23850cef1525240ac16b9085a5377f62a1485c7386025506bbbc46335b8040b7ffd60de87a4b4e6c71c95e0bfc79cb7b4bacc2db6266b5c3f51601dc600102433471d96b90d263c037e91d1e93d49e3254881cf820c131c79dd9efbeaa8a19910ece49b84e82404679e8d1c6321e5ef3951bf6c613ccb84d69d0d73961111f8000419bf4884412eae1254c7258613f446080ba73f1eb58d41f54daa29dfac5eff32eea1969af3cf7dbae172943126a63f2b2f3cd490d89b798b7237949a02bdb2fd60ac96ffccb1b9827465bd416425c419fd45914096aa0496b9c112fe73291f07034f4dcf28927a60949f6aa8989f5c5d571ef8e811ca86eeaa3ffe4a8ad60dea85191cc1805a890d2297437fcf72ce77d623649c9ff9a550a5f907588bcfa9aab7272db2d4be164b8ebea8e8cde99eaf4bc49929eeeee9841adb4f6ec61db59d78d4746f46482defa70ffa8d79b1affd9b48112df1b8131f35aa7772457a5fd75ebad3149603fa30707fcce825fde8a66444d8abba4fd431817ba1afa991ae6ad400227b5e521cd0fccf026e63afc2676a827da7888bac4a79020000000000000000000000000294df22446c07ece8e44a81433613bd9a831bca3cfaee23480f6beb836271ea43253938c457f770b683b31445f50019bdbabeda142bb96c3c5aa2552bd3d26714066b45f9816084149b4fe092b2c471831c824ae43f829dc69257b90c6ada1500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000becca3c95f6291c2f5fa38bf7985d7b9e311f05916826a66fd86aca61d38230d1619cbff1cf012f747e5daeb6264da5a5f6f4c997f84d562cb14c572d9af6bceecd7708bbe90be1c8c8224d3ce38cf058ceebe7e3922047ce83495fd6a94be356b1c831dd423c363e8273df5d3b73568040c6aea300036bfe42bca3287e4793e0205de0d0dfa7af26b653e85f323dfcf85c4781151bcbf6164b8d684799e41c3970225803f7a934450048d3c748eef4899e3172f6c1e368730f55efc9b5478af31e40b020c530e8e200f0b6358c1715dbcea8b728c7fb5c6e476d6cdffea974f3f34b3f12ff1d8b97f6975fba88124d49f6d1cb473d1b2465ea737002e121e2591152c021f6082ebb1e65d76cddf5d72f979f56cecb08aacf7953e37d0c4a7773d9008fe0218a8f93e82495715ff1319b61c58f6d5061cf4bbd422a6925ff6fa809cc6e718022d4dcabd00707fe6e34644722527ea4c01f1a76f4c9fe899849f1ede2c879d9e0306793ad6647459ef05df140c7282661e340dadd4811934888ac535eca88af0c70308838e721f08ad86ade49d222cbc98cc0647cdbbc167375f140d2316e7773b6e2e11ef6f89b1facff43cab5370e9f6ce7fd1c8bc24d97c3e7e3bc29e324bd283a1670bca2d3a754815f7705b79453452ecaa7c352886cbb9d4af318e3a5b9495ed2b13eedf279345fd1b8b6f7a7227b85c4e1f5ee58be63c3e4f27cafdeae3e31021b1e82f8ca2013da14bdd9a4d23cc2bf2ada28b729ae225884ad3e835cf2240c03099961739e4c43c9ccdef105867064a4b98507d65e4e1dc85f030b5b4d8b0930d1c6efb79b6001d70a75e81e0579ea2fc9ad7322cac45fe59eaca596cea4f34e17a66c9a58c69f9c42f23a2ce8a7c53f1571716705d6a25fb69442c6d3b17c605fc9a41b556045d5a74b265b91ba4fc408b9c056203cf973f7242245787ae756070ac2b4b59ab7928a9ad66efbdc7b63d82512ad74fc852baef0bc11f73a12d0259d4706e455331dbd20f015ad8cb4960cc3797f0d3d5e726084115cd267061c98b9c2663baadfa2c347e1d32557d0ac45c9e60255e1a0f46ec127c907acaf8887aa3f63a5bb43f197ca589e2b87b6b0abb43099e9aca201b10a87a4d6f3c252a0b82e4d0e653318c7cc18147cca7ffbdb50431211fe0329807dcea28a557cf92022dc8a6c7bbe83f056a300538d879659f435467ee288d038e06276bc84a099ef84f9ed88742cb2227ae90401712d6d990388b32e4b8290762bf49cf42a824282f18917881fab91c95a6ec5f0b5367abd32018fd8ecfb7630098150d4cd3c75f14c554d1ce13e5398f3030dd00eb8e3cce5fcfb7848e426fa76a35a3f4980cafaf88a24ae80267b08cf2fe37faa0929e746ab720975470d260187675c08a03fe24eb1f219bf0eab4c9aa73e6c958281f645c6e4cd34c37a5434817f108d0677c2faa30cad13e51d4ccee51aa7c55fa2a5bf41e5ad975c40eda36e957de433c47c3b8fb621be86da84d766b0626f7c7d74525377d860c7e77009c6961249797bba699e8f41ad36107a8d058a1a1c547d9076e2db48a8cf319a1bd55bcbb295faf53b1d62c00e7ea8b2d26098dd606d57a5ef298b95ffa9330c7520fd7d2fc7678f92e0b4221f655e2752b69e3a9a1fcbd478d4370f9939517efd9260b877eca4f7bd24f806236a559325c27545b301386b80df644dd902d0823b2371ac94e6a6bc8cb33eb71463b729f192ad07cc337c30f88bfcf2f3a2b471089b9b4355a76dc95d784f35717d70bf96a2cd17ed6788f7470c9b6ae6f1198e594c06d01976a1a6dbec0c639f9d92914b1f7681a77315d441b3d47c43463549da2583870ea8c730992b1f61513a2838c28917d163c952dbeae21004c7ced8350ba25b82be995904aae6bb9c805b449b94bf91cd2376367518f6ec234942091a62b5fd6ce7ff0524fe57b456bdfc45eadad67375e419107800642298ee29b3bcef495cb74ef8c1ab09238e55b330be64ee73177f13dcadcdce35dddbe12dc4845b6aedf3fb825e89de3dbdf7b8e1d504dfd42637fdbdcc9d7e9cd40a86ffa98d206745ec6b08b1e9c5189a28ce3fc3426e96318372bd8c30ac2822feae883559939551ac086248e3657e931de6143b5ed02c8601d1428a3fd95f36c5dd07e49d84c4378150cb0fc4da8a1254d54449e7d039aa6672aa47a8046d040b82195c1fba148c5639444c2f807db3a2e882ba1117d8ed7acc223bbd90721a667fac3e40c4c81b4f0c4544b5522ae2fb4a8a6702d4cfc0c6a7e1d6dd843ebc56dd9b8f1ebbf28b184debd39214c1cbd570e77cd68e170befedf9c2566112d58ac7363ce36bac73ed5b8e6c85836840d451f216ec375f02d9254deccfd3c982ca07bab7b8d262c2ae52c3b48f964ef4d728dfc2b01fc75c32d4c05", "6a630053ac", 2, -1361619687, "f6f4699c9eb8c4ca663f70ac68b8d89189f5808879bb984146381d856193f603"], - ["030000807082c4030269f0f46167658885cf8b3a241d9726f0baaac80925354130212af788c14a060b0100000004535251acffffffff4e6e619208ea62a5011185ef5ac65e6b81d2d27611f462f820c18ee1f798c96f020000000200635e81ed3c01d48a0e01000000000000000000afc4017e0300062c040000000000000000000000006e700cb9cbed9d5b8f9b7364dd032bbb5b9407624e87e23a67752972ed01d6bac67cf3494b9502cfe0b7caaea9e0e39e0115962faaceea23bc4b83e9e4b22924304469b6fd2c56d875f98208bc2f79e4d63bc4a230996104d9b7bd5757542cd8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004b5a3bbbfeebbf3c09213856401715c6d25f4b3ab910a7d5515ceb9a150c33098301e1611886174655761016e0c19573bce3eb7f620847748bf1b5ea46911d8062b3b27b315dd34c03af1c7770897f2eae22d7ea959e4e43f5498c688be8ad10c4eb5997cecc6324e50f1747b773574147ee716917c4eaf62033ca32c0edcdb2031022fce50d61dbc48a5f877344e97b8733e93c4074f0450a36d86c40ca281742021660a822692ef4a1dceadbbb95d9f1aae463b18e1a3da1697f878f058585c2d60b047371d49b8b81922a2f46b0dbaa02e6df85ea716beda546e3cc6a824cc72fef1ddba554f4d777694c6ded2948961b3e975c888a4e3c93c31f0648f3a4099fa10225fc0919e4b3bb9277f7aff097f526dc82fed252bac271feee607e4760903f260321b2eb0d8d6cc43faa0ca78bba79fc05a81c59d3f5b075119c114e42f3a932080215b53c241d38f3946eee05142f0ff5788db894f831a47f44c81e0f7a276d5f2c0212edecf4d7addd734abeb50646b5f8d6f98cf2fd08bfc84b792f933e7ec7ec6f0319d5d946ec4045e96b1283f8406736a761fee8e53dfa265dd0319ebda895d0d4a92240bd8f5d49914f58b8549257a188989984bf71c75d3f390a57066129caebafa1a1ea16c2b864f1ee992af32e6a89f2714dbf09426a83fbd0d4db26fe9a3c397eeb3dbb899375ebafb37f0ce5d63149d1dc0ad6518c4b72ff868f80ec36c92d4c654c0910d224b2be7bde5aea5dd221431c06eda1f97fefda501e8e7a0ee20d226420bb979cbad846fc573909fa83cb20331e5a6f8703254a7d0d0f07bba37acd98d84e814a0bf9fb14ba2e4003f996f979ce44c14b07ed474032d378a8b75c34f39c6e2213d0ec98abacbdf2d585e4b1c198759e2bdea3ed6549f502eeab336c0f012d51c2f5ee4d6e584439a9d300fec0e8275e5f38681fda0ec201b4434a611233d89bdbce27c5cad2e887fad63de3bc5c6a094f4e1a7a6f3f0a2674d0d10bba530ec5b7ee6a97076ce4616fbb40db0109d024249fa4a3389b48cc6dad3f1f17aee1461be7639841ce48a9b56066c371dde95a49fc601121dbe0892c1f46e4a02f286947ad5d879cea75ab7931f0a58df1eed2aa62cfd1f4b0dd90e1f93dee2147f5b248ec206954a7633575f49ae441bb7090caae9dea10f292541bbdbd5d33107503c1c4f5541673d16dde1d05d39292e239901bb0a465dcff46c5f3d6af6bb29d1d18f767dde4d25a33e99767d95097a14cefe00e7b3934ccfd99cb172a93ed52132f6f368152ec2b2537108b655dde2c01e28e816761405914413d1631c5c5b442744ab9af1d89bbaa865eb49d16a85387e7fa9416baf711fabff0b866cfcd962161258187507607e7e5c1f6e3e82db7b969c4e6880014c9449a3c2db2a144cf05fe90022f41101b0a3958608d6267a62edf56f8f32a6cd814cf6445ded5d1df42b764b531c1828a78ff53440163a62ffbb2f63c7b6621ff2f6b5407c51775c662380329cc8fc5a1e0394f99c41a11b9a5cfdd2b22db9b0252d9fbea695f0286200ef646c7372ba58a0cf5f0abad62e2617bb96eed86cd211f6ba4fc60e130cd3a3501afcf7253801e01d12b1694ea9abea38894b1e99155bae2ffb90fba7adf2abb5a404888e873a56a4edcc322c07d34a1ee34da81e815d21067578beeccac6459a1a0df0d73f7973e2b67c328b0a1b11ed0a07ea43686288cab048da6b2c58ff372ae78fa09a15962b44fc069d1629f1e7d6ccef140b933170beccbe9183cec6793827f6e829b33ce720464949e1d93c1801a0c52c55d33414aae20281634fe42ebe65c0601b0c0a51982406283c5006f2bf95c15aa8e276928dd824a78231b56c3ee09649ec5657fa78f5245d87156e7a0c0858e41c05b7d7ab1e3337f99af2317cbef0be4dc923ee58d268a1068c3bc0f617d651e6d1eb1f68d679b9b7d428abd2425938786d6b3c1ac2b1e221e6744735aa079f6ca02e6916eddf35f391657e0be5abd2d267515cb1997ef58579441fe35113d125313debbd64a9f98ea7cd3c517f9d3f163c5278efb8ba57bbd3724f1950c1b4b233b988c56266be2f0b7b63780308b7636c31d25235b43cce9320c466c702f33fc88c0cd2945117f7d11059af181b3e3b06605b9644659aa04721ee613fe99beaba4360bf4c61c274ef0d246a5d7bdc6971cae06608e358ff715189edc91d57df03d51cae284b81253d3dc80693dc5ff78fe1807a38f4476dadad1eb1355dcff85f7dd2234bcc2e2b9c2599f716ce72313bddc00ac79dc0be705000000000000000000000000cefa62d525d4cfef3f70f1857281354e5123d7def665b93bb0ebfdff8290f01378ea868948677152637ff077d35fc0412d9135cefed8aa5dcb91d37867c8cd238718c6c84c3ef92f0532c07f0f524902a00d0162b454a0c79110a321a332842d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003233529205f265d77abb93938b55dbd6d8542e24b4b8dd5cc8054e2844f80eee84d4b41122c3edf106ee694c11a058d18458466dd162afa03d0e712823fbf979bc88bb4729f34d39e1f5b13ac551848fa26fdb1542f78897f8be4aba4bcb411782745d39fd902e87b2f5d181ec157efbc4bda8c8acc5ea5ff720d42bfa0ccf7c021d6f1c9d5d32ccda8fcc6c12a561bbf3adb368e02e9d3933404e5467df40a7e10227186f9426b2ce3002bca96609e171785b86bd1afb8c8c566a168e3caa38c21e0b04232c7d4ac507ea4a368dbf681c7f7f399b1d68f4d212cba35f57608e1f8425b666b30cfbc432112b65156af47536fa9245ae2f0d6adbec7a127380ed25f87b030375017e77969e8931d7e93f9c44ade8421ec018f1b8567bf04518c96e061a10032ec8c8e7b8e45ef96cfe8da0cdff73a0857e19766b54244bc0cf6c3a6587b826022a5ec18a0a957bdad637e6f4a4f24ea0e22933c86ce1fd26150d1c45e281acc302087c3184eb938778779722306a576ccd550806b1519ecc9b7abd96df80cd70c3022251caf39cf73bd797a3afd8147d93a8a661c9238c0d393158973162254f46254f14cb59f64dd90b78995b64c68e7a0824dc33b3bf8c502eb93f58adc185c3577d2e346a45ef42bbfe73ff9ec335f4c2fba118311f8a5495739c10721aa54a6ecb6ce7633a0fef5fc866bd313ee8c12e1da62389dfb4ab14ef17b7ffca0766432921df2ed9b7e4c719c4f44ed0cfdabe8dc590bcb2bc8b817eae5a0099f4037a6730d1c0ab6a5176ba5c689c8881526abd07f0494c28c8d2efaecfe3c5d49642ae7e15a8d0d2bac8bf5393bdb05176a6c97e92039d8dcec7615b725aeb59fbe224fd3c6715e81de2946f9957f6355c7e679daa5175bca472dd0534ea16e0bdd1790fa891ce4f835ea957bc9e8876dfa1e9b6d100c944b2d1158cbbc059af1ef08a3949fe3cc45fbda7357840b076820fddef7ba27c3fde9ba035d531d2e785236435ca6f6e48f7544e69ba5be858126c9200902b95d0f89149745e6874d8aa2ab4d83d8850434199759734e0ce71adaa55a7a1946c56273f187d568e8d0cda8bafae686e31cf8ecf1492dcd5b9869f249c434330504894b12dc0483db14062f6b05163548ba0790ed5bbf759128d835ea454e04a1ba95f648618483e57e7c9b486ec78e07edb5f580a9eb9da698c26bb0bd867c2db3dba622e670f5f5c93ac12db16608051c4c3006fa488c38fcacfae2d1639dbf018898e0964de55f2b44b6e56ac9dee1cdcd5071b8fea1ee01437160a946f4f19c0cd61dbb8f5e09073b25b1a316143d2849b6f9c7d4750ead5c955f444a09feacc7e35988e07ad81f99fd9a43f55a14439c275f35c817be938dc762dbf2a12bce29d46bf7280125a41558fc92e92721d6d8266cf5ae449bfcfb7413dc8d79a7702a1605e5ebe4ec9868bb540ce212f629196a1ad08eb8c26bd2ae181c4d8a0746209876339ab38bd7bdc731282c9ec952b6bbdb7593d16cd339f6c44e10527640e5d8beaee30e0e6650df12ca131b2409d28a5da4954a4864b8c9ad683c1df6d43b12963d2f884b5a8e52fb37069d3633a224643cbd6a70d98afca3b7491384fcd0b98d9524d37faf40b273994e02865b7a4d3b8dee0a67244ddbd924a881ed1dfda0565fed7060090fcf2881cf28acdfffeaef388276ca86bd37f806774405092554372f6324cecbb9667299f9cc48abd51691d9b3a528e39cc141f2bd2ce16feba9073dbb39af5ad3e8beab1a06cbe6a55337cedd6696182c837aed1f0437aefbeb22007f6d95507ba81b6303901de4d41211a54c7dc96c9bcaea46fb300a13d4dfe155cf6ddcfb60537fcf771f933d6e6e087c750695a5b63551ed18ef153bdeb82e6efb54d56af08f565e22a78ac88072744570edaeb6293742aa24c0982964d19cfdc0fe35df2fcdfffe49893a847def3ae70d01cd9311b927b206fed52ddf834f117fa42fc02e8652e371fd8adca337390a236afd0d4e406f02a1b0447bd2184693c035fea429c87ad6ae32b95b53c12174d7638229d3b6f7383c41878698354a18267103b74c643bf85ee689d4999081fb6c10391c2481f60a7edd41b601602982aa5df2a45efc2e9fc112eaad22c0690947b3506e369f8c1ad1d1e954215a6551e40e5c281f9d6c4b1cb6bc434ecc4385f437cf33bcd542d9f88ef067fb9fb0bbca411c4dc55701d04767d1db02f531213d9049f4351ddd385e0db6cdbee57961bf46a339d6ed04140dd3fc0fe37e01ba83967f2b36638355ebfb3bd00000000000000000000000000bd737a3c20518c8366cce5939cc976bcd089426d0204fc4a6f9593b3fe8e8e60cb70107af7e34ff096bd05d12c5a293498a420db3177071cfe60b3f400473a182d64d53e1366f65e83c4a34876c02417cf4e5a3b66ab9718c9f3af53e6d0d1ba000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d154afcf218b19a348766f49114fdd00bd44006c35177f215ed5bbf42c1e7f6bc293ab932a2fd683884d2b86625451868d6520bf0bf8d3f12f372b86c1cec47c9ee3a89cd9e87a7b58a4180e7abcb6659fafe147e7a6fc88aff6687e0fbbe709b9f5f8d4e547b37aef8db8eb182617457f688ac3efbbc12498834deaa7aca960311bcbf4edb6148fb59fa6fe7b9e12112b2b8731d45d6ccee56ea913e04c59d3e020798480ef1d9168ad93b1c7563f57027276765461386a4560f5b728d83ada5130a05cf45218f237381ceaf5c6e0e6e7866c5d89d29b8137727da080df22a3f1837eb962dbc7afceff6a572bf0b1ac17244d2b0299b63e7ef8af0b3da6c96aaf273022546c332c326c02b54f9d8c8ab70623524358e5a93a9f0ed1a46d788448a71c10323e569192b004ae4eaf37e019e0028935a76af2e2f8db54265c3b5adc443e9d60305c4e6715f2a44fa2b1fe04edc0119b7e4fced0e28de4b8d1f43a01494532bcc02265a79b571087e275aa70aa000e50653f6ab56d0be53be63024dbfa3ccda6d6402259e68001bf82662fb39324c14d1f56f3527d3d9bac412208c39a1a14ace83d01b4d15ccc5fc827f295c7350a95bc5ea4d4c51e6a214a8ba9ab35f605973e92bb552a22fc694dca2578c9b6a70e14cad5d2909dcdaa08d1a724d0d8484f32a0915f81221fad24251e7703d12030c41e43bf6ae271e9ee8c0e8923e4809539b57bc59c2b72133a8865d15df6d3c8c32bccb8b450398e7a0226a8bd46a35c2998ce5ea822b9231cecb6b00015497376482e911fe00bcf27dcb891278a3fe7927a206cc20d52b9cf935bf6633042752457284a0fb37142b120cca2cbc5376f969ca7dfa7b54f8e4f934f4cdd8e1e67c1244460f9ae0fdc5841636b7f7766e32af8cd60dfbcb748ab9ceb22cb623294c232dc934981a61a1b77d1cd8ef4cd750ef9c4e0a95bdc1a081f1de1104dd8ed8d3920347ca6c2b5c1d1e4d143e78f6aeb66e293e8cceb27941c5739266b4c1c199abefc08077e2adf0336c7b74708ba846fcf8280d06a43e24161112e9dd1695c428a72c14cea678d3c92acf1a6180413495275535ea7519edba2c2768cf1c4c82f313f9c16650fcb241058baba89ec08787ac8e4b3b62039e45cb65ffec943df3ba41a12297035fc1bc6997ce9cf6c1338ca30d089446bfbca010606dbaa6dcc7ee2c01a73a38640aa643cd0ea4deaef59b4b3fa525bfad236c711224b7a9835e8aa902881e96db2eacaef073e1b64be5534369391cb5283c402168df4c491564ff06487762b4688ebf6545092758f9fc8fc49e142fb1135374a2f9c4c01805b56570fcd9ed55a9bc2b314f9cf5f798ab7bba0b10146a478841feaf1e3b89662f8f10537bf9bbbe334530f6013455078f155cbd48080bc7755027ac16f29e0c8db0186f9d029a4a212d96d0fe468d26f90ed3c9d690f0a1bbb94b28d1eed8559f4e03748f053c0ad6e061e9860a0c119ab8a0c7281fc1f90ba792149c1936562ba83ab21f0e136fbaa01ac6aa99042b1a85f1684d4d1af88338d941d763dd1d03ef36e4efc8f20c04e33377542e2396a8f7b3f50f6b7aadbea3424cec6879b71fbc62a6e882409ebdc53269b2087bd8e68ba360858186b1b9c9d084d36fd5406a1d69ed09392eae2021072e3bb15a031ae667ac535fdd8ec5b806a940e8178e241351c059777e5f88f912ca1ea95581231d35089dcba22d276546b5e66c7312060b3d61fa72ef472845b953aee60bc78259769e40649ff3372f0fb7b2535dbaaeffba6dad3e414fcaeb9c8d957f5c50671edd5786b93142df1fdbbdb2ef499c0f8220435fe09ccd1035020ca2432f1824a126bbc365146b42b026f96c2be37f5c5d9241dfe0a62579622d9c79be0fdf6ead26f316deb3ad6c459d36fb62a23a4f835a2e096f799b750c494c8c6c3fe24d9deb6567c6c6ebb0a025783bf1ffbf38fcd3c864af240ebbbdde4e0f3328c06e356e0886d8132ae0c150c43ce4ba3bb9f2b1a4e3a971ee65120ba8011d7883c96879b9e3c142012d872e1760b22b34919bdc7ea4d22cf93b1b860404c06e0f787d1f3fa62d6b70e7be4a2c2fcb0ac72a09074afba04873b8f24c2d5e72d7b58cc2657179dec36208ad42c50b06d4b605df88556d4a61a0be5e1ffe54a375e4f37f9b7a0f965d25f74628eb61dfb8e1f34685c6ff25709bec8cf9d5e85b623e8d95e71b7375232fe3cfead3d8f7d0624fd37df0f35674459c9501e8876aeab44c27bd55e86e6cdf7aa9832e4e8c0e70c0b0f43bde57bf9e2a41d278c7938234aec375eb2308cfbeace739327376da28972b80092ad47a184e198acbcb86367d5251640d2ad74e79bb7fa7c91c89602ff40fbcbe223c98a8752245911e867de0aa1e4061ee7bbf073088d67437da3399cea36f07", "655351516a53", 1, 554079247, "8bf239fc2dbb32d00b9d1c9bb89ea3d627506c799c8595fa5502f1a0d9190b43"], - ["030000807082c40301f486242dce735b1e59553448e1da77d7a3a2ba2d467ca7756a672cb8650bb27700000000004fb4409a04549c9a020000000000695502050000000005510065656a8067830500000000056a0052ac514de10d010000000000b35283b9bb210df000", "52635365ac005300", 0, -619888487, "66a90bd3bb799b50779eabdcb192f5bc02bac18dbeac68ea16025f1d52a8e81f"], - ["030000807082c403042364a1114e98ea99a820f703bfcc76e1fe1c58c677c6de65b36cc07e2d8f15600200000000e394918f5259bf0f3254ddd5f13ab2de4266698b97c1d3d8bfc14eb9da92136aa5ae5a760200000007535265006a00652aa1c296ba1f1b755caa493334d095ab0c4bdd86a70940ea214c561eca86129932921efe0000000005ac65000063ffffffff9b2ba8f5742c15ef80254c2252e92b3d34628394fa3a91ca0dd0be8d217c99dd01000000025165ffffffff02cf5ef30500000000046aac63acaa6d9303000000000865636a65516300510000000000000000030000000000000000fcd1470100000000c3c3a3dad6b42fb625575aada2c5d36dc4f7a3fa6b4430a32e91f5d085b6934d1f9f331e3cfcf6501a25f3c884580301204a848c24482ebd740ab8dcc1386900910923dcdf2791a01fc7d57031c2276743c457486acad624e90ce51481b470fe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b39803b16ad341e8affaadc0ea1404d1b618bb8bfa113e80639361b00f1d8e146c79767e0d2929184f68ef5bfd043367a636bb1f9da62b97843d74428abf875535e03782b77d08f75c8a4fc1b4f1c7c25f462e6f55686d3cac3b2a72f2fb931539ccf3c7731740191176fe9d033bc1fbc19cfb570b02ce537482a28e3b42470313ecdc33b2cd2a671de80d467a488ddea6d8dab3c651588493cb0e4ca96962860305f0dcb749f56d7d1d638e0614d79e055cd412d7b99bae9c53db2b18a467f3860b05e1e2e41f53e63174da97ce1b0c783aae54e5423f6dea5b167787544b202355481b6336cda1e3f902f1643bab4fb2bf90bf984ad39c01daed870e00dc4fda6b021d20bbf61957d1ae9566d800310ccc5b1df039c98bf41613a310a347a90babc10306bf376eb33e770915a89fa7c9398fadfc22d6ecca1f8d8532122648e74e72eb03029d359effe8df497ebd77d29e65e0860932e84a2ee0a3656fd7d5700767794002028d3adc62dac259eff520f6a087806a3457b63acf18a61b65204c4fcf747d63030d9a70c58effcbfd422151bc6e716c8ace66a12eb73a30c74173687253dc8c6da38171181f9244ba9fa1fb395e49632a7082035c0714e28ef6efa330f49a505695c8667a368129eeae74c902df3add223757e0a3ca343c4a15ba8a216e2fd5b2d9ecb3b51f740e494b060aa881a1ebef04a2f2f98fde3904e30babdc31e41d86b5cb9090c0f646d106c34e23c8048affe0e5c8b4b2f4490f52d1b7b061187f0e4fdb37fb6bd44eb4f684d458f8133d04e5dc946955b26c3485348437b2ec42ecc498bac446a4d9b9f2699cb9850c9ddba2a2a198a650fbedb3cdb5ee70f10115b4e3d86ee92d85aa159db6a856bf80f757cabd8b1afc7209ff2281c3c66ea8a611e8f65db995e8ea1697723aa33571114e6265546de7f4c0d2f97cac79946435c978cb03cf9ab97520d7e307c2c271e374f4689ca23498149ce3f0b127fbf28b0a20729359cafc49dc79edbe694dd02261c99e543ef70fbeda8bcc309423faa3184bb1f0e07d4072333a71922e6d7276820befc6bea5e69a19d3225001bea33861db1193deda5f539f5af47149ca2a91afa4e5c55f6676b0d3dce589ba34d37953f5fc6ec1fe7c8a2e5e7f921c5c394a7f2c82aa7a5f441aa24fbc113cead560401ebf34f0529617f75f5e6c3c40ddef072213535fb9f868e2c3ca3c61e5104e0c096b3c39a4f6e453da4f80efa5ab3a29727073c7635f7b5c2acb76bbbf3bf4c721b598dbc9296436c5d727dcdad1204baa8c4472ef034e43614d216f04d14acf30dcf05b1b7cb073e1c7a39a5c88bb28d5c13001d9f9d7d5ba6065b3c608c9b51aa185e6100d69e6dfcba26ea548bcf01c2cc45f9eca1d970fe9a63a33fd46b76f15ed891012079ecc6b9e0e569da45c3671e889feb058662a4662142180c3679bb3be729c934d32c84b5f1a61972e430dd742e896d04e145bfc422e9b45490e503bc9d7ed6d29301fd4a9ccb56fcb3af13d07f6a5e48b8f4d6250837647717d05c2cc33f34371f7b8596c9cc906b03d10e358b830ea127d6d82310b045c289c763f225bd626c6dc7f6bcca8c363066f81578939817bd8a366374864b298549bab72c14657a66e55b41a9a45bc8c928cf0c1c200724f0d2bbb53c3d15218c1023299159188ddce2b1d2df4274f0e6db096769e664103b0c73a52dcb2c0a6168cbfa65cfc74d5731a92a40a6f213f11cc18592232bdc8477d686ba8be598d10b5829884c3a27da4787b61ae9f1142202436af898a6c4710269c9eb731fb3b85c48b1cda489db886c3a545e62eaf75d29d8e6a58c1161d5edf93789230c9704a7060b58955fb4b5b38a818adb9aaff359b969f8ef60a3814872d75a1d8627043fbc268821a693adbe79ae88f8746a5c90248bd3e71b61a00c65469381951832fb6c8d3aa1e949ea4d782c9f22b2ce36922ad2d4b54ccdb0ae896265aea2216376463392e9ccafea5997675daa38f1677899528476da43ede9f1e15010935cc5319dffec33b2de3756981455bc4396eca0b109ff4841215798b7e6fe88f36a6b22b901d3b9a9be3076c358b692c8d812a1b242685c51da1622b2625b1bdd5436762a01a944ec57917cec0f353d5e8ef5a42d08bb9f201e7fe1f73588c0554bbf75d041164d84730b7f3a37b6ae1338e3bca73fd50e684127fb131080f749f650ecbaf654b4f0c307842cdfbab3c926525e09a53264b8441c15a403bdc70017054e36b67b4d3d9650b09322045101307d37ba83caf3d0200000000000000000000000091dd6433f81b446435bf6072b1e6f3666d40959e785c008999dcb288442e4cdad4b99763b303bdd08b113befb0ee222af075ee2340684c12d8ae82179c1642a12bfa85f5afed4e4a7d597f5d6544455e9a2093f34eace256832e3a447afab15d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1b6eee14d54f65a16e897c23c284c4ad01c8590b979f35afe60bc403861141611bf04da47db9e1d62a8c845be4fabeb95589372c649fa45f6250cb84ef36b1945020748f17f78ec18143b1cbf1dd3b54a9c3846cc2ffe2ed74c4f46feaf79a39fdb454a89b6a9596a83c841d1eee00a44c4abf0ddfec9fdb53a67b25cced1d9021d4937a0135a2678a9184534eaea97af05670c43feee61fcee6b46d9d3dec87502154f485a95db64f0fe2e0bd677eb3e215dc5bb073ab15478f797f4faf0a055fe0a029108ba4fd8cb3e14e0582b7189cd8590fe0a131435f8dd394739f9784cd93a34d529421716815cb59257376d14993867a6b079a525918e7077a747c2c3595c0313b493b0e84dd295c6bde25c0520212a82f26cb91982df49eb31415e4fe761570306150c37a70ce27b7af527241caefa9f080242aec5fb5cfc9518221097f41b25022a5a631f701c71d7647845d135fd3bc849fe919628a3f9248541947af3e4f64c031f1bc6c36fcacc2194668ca5323e746a51e2c724664af932fb6682cd46f2d7cf0226dc2e46d60867a5f1f9cf728f7c5016bc2a0d57ba8aca76a9e6f33af3ab52a81c45914dc72408a1c9911563890939057071b0703b6870404398de0ef08816684a1ad7264ef99d18cf76bf2baa678fa05f9eb72c8a8c9031c25d6bf1184a154644e9a584d284bcbde64ccdf1dd1c9b3041407ffcf4b87a5aff21ea718a4ec3c507e1ab6170836186f21b99d10f60e64d1902de6f5060d6ed860b166cbace6e1f7b247fccfaf7d68e2b9a13692cec9777fd2ac5c1627785039b0d01031741150ad52baf45fc900a7ec59614da50ed25a54bff05ea2f3ad10e40d40365b78e026b0ac5e34f58dca721bb771241b246d830fda65a9704cadfc2a82f35c339df69616d111ab4fe618c17c78a7b0b2d051bd1de7ca0ba1b98fbab8f62429273084709f502d708f686f062a7742891d8d4aff593a7f3e7ebe6d136a5d587a182be7c846c7471af4a870cedc71c7cd1900f85d4fc3a474e8f6506d7752bc42594b44a5bdbf88c08b2436bf52a9176a6ffca836963c3ea9a3cacfb88dc0a3d8cd57257695a4d95d9861c4ac5e9df8d6213fd5785dc2e6c999ad997fdc78d63352265f0de18aaacf6dbc5581924cd3d06c2bb47e60dab5355a4fc52ff4117a2c99a28891aa527da2f00fed18d8d170f19ee01f849bcc453bbccbfe972a587df20c8e66fb76ca0989ddc1ae31a1294462fdcb5ac8a001f3d36bf0191af6b0c7c1c43ae17df1ee0808783a07d28946f9a92644fa625a3d43903dedd9cc0e242c7288b258ea46d3e30128371a48a5ab187bde4e1ac640aa478cc1218d0d5f01080d57a46733aa7fd63dbed0bd6b4bae849b8d42cecca1611cd822e6ee01cf000194675b581f815cc315c937818e50d98d8db7770b7267465e82dabd8583f590de7d1e931d3e854429139fa2bafb93f1aa97b06572a918c540526a1521238483335583bc3ff2316af46e51c03c4231ece9e12a935c9fda39d89f107aa26092aa7b0683a13a47a0b86b409d7344c405018b292d5141cf9d36212536753a5749d65eb838adbc9306bea463822515c3d37590031cc47d6a896b28ca66cf8162fc3f8d84ede93abe250fce5afabd8b717241be83eaf12e06a8b8e5b8f869072b958549991c9653c500578b8243d5f29ae7d73a415ba05649104c875df97a2af0998b9b9b5aa93af48ba8e766197e7f2ca9df47f7d9bf43405a7613b9a6661879cde3e4dde34c7351720e1770f414f7a760830d8fcaa5406b1afb6d4919c323343b7c6da3266f77d88bfbeb98764119e50a177e4f2c50e71d4dfead8de4ec24f0f2a7a519ee89934b056c9f8569c919833a2c16f45b341557010f066639bcfb0f9c5706a997fc3e960988b9056ccfb956068df3c6cddeb7a78ae793aa0465f4f9ce9534c6fbc63699f783c9b6bf2a54e8c5e3f9a5d8162346a25ca957e3bc9255dfe480c8b1c5b161aa048a0bfdff629943f8d1092a74f72967d629e8f0984164105095d7d158e1a3ec43bd485e402010e08604ef05d7d697050590e9e777bba13f844a2b9866980896f10ec50e0d6fa27e7f65c69586ddf997621ecf37d67a5b5bbf83aae029ea605440fef52c01612705e7a3004c1fee994771dc1418e1e9bfc8ee89d1da183c05598381018c0418ce138ab6c00ea1b404ed4cdc11c2ffe46435542bacd72966cefda9890cea5d2001ec92f462387c96a0194b62d75119071b163e5ed3d20967c63d91d2b65fad34d7e8c0840904265c679be700000000000000000d310bf0300000000a0592c2966ba7f7d0d1b80f4f49dbdb955921b35deed1b26ca77e28994ae725f27a674a119c866ed3322df18a82850e568319b6cbd0aca1ffa5056c7ef3285978ba8941e7936ed494d6df31a2af9792bb144b58259e3ffbaf4e688fa46421ae000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bde906152b41b6316d693b44e6aea0214ea26224fe1910fdb0963ddee27d5eb9c1147aad836f9886c27438c5e223842ba903a88e7f88fe9af79da94f8e883bdb3757fdf592df0f4588466a60d6470929f8ef33cd3100c198afebfb9f0a93ff3628d50b1f33a881d3be349554ae928093928d6b31ecb7b7b29efe5b6bb6a1c392021e7ae1afb41ba750361c5e39c6176d43d4411f91b4b0e96f8148cab5c955b3eb021b943f4bebe9d4d1e4534a691d1f876c5ad083a516f295a8595b71556688e6880b05ef0e45eb89db4a17b9f942f066a572a8f0936ed360b14959bfe35d12ad58d30c3174250beb82d5d1067d4201bed3d7059835a8cbe1963103dc08a8afeb19bc032258f8047fa1ae8464eaf6ebcf14e1e13b2368b2e326ffb79f0e75a92c6156c8032b368d76cdb686080d80cdbaae9197eabd7f93de95be7b1c6c3dbb6337c2fc850328b743e9934063c6380517fd1d8bf48aab6cb2ad95785d30a504bb61e94ff71f0202dc15b4894654dd7d61ce30b62583e5ebf230d289be3bd2b78e4d75fbdffbcb0201f0762b7c7832690494aebe31eab3deec4bbb8f1b6db59f39c05728ff7d94c8a86b0a33a575f96bc546ffdae3ba46bd864fdbfa1b03835b6478106eb54de3e1d3b86d39b1f1dd434a7f799c2807cdec62df1fb1f0fc474fc1e3180fb9acdfc321afd11e03675644844ed0f7f99b6586068a29bbb63d2909c1dfc2aaa400c25bd3a14fe758f258865d0d8172fea112fade5eb685678b8bb729e4c06a76c89cdaad6c8d69586dcf839c6b11415adc51b082c3f8a2f322b28bb02609ecd8b09f8177dad72c8a8be4102ff9f78bd62cd639f4ef5cf072940932b9e577887508db429a533a9e625ac0dd2cc6564c6bab2f6a1c049a174b6541f637ab28b557e95d0857ee6613c386ed72b12c0ddd32d26b16d316c6c687911c99298ea3d55978f04089b11cfdaea9ec3c4876ddaf6d9c5de937221a8b972e2f53794e51aa338a3940b6a84c1cbaa721521bfefe9d411f2cd9a9d7fd0026db10161e5011042af386b6c571fdc208377fed045a0517c4231b0bee73d146cc3f0d8e76a254dbfeca5b5ea6014cde82b56721c6a14e2515b666524b9f2e794ceb8421807f701a6615cd41efd2524a1e9a0fcf9f5669b4032757264d7598cf8ec9959e7c87be487066e952b452894aad56289010ce3ced398a2587cd75fe234fa1b37a9b0490da3a29b4e2464fc38ca70b1b0c21a82a223cfbe6b6288ec90cb4483ee5ce60ca224f255a79674c833e5c459514ca97fdebdc685da10159d5756df585d14fb4ffa542a2cd24cb98a30d9040a6488b0f28911df3dc5b1e3162defc695975b9187a1a55810bac882d946a1f64ba219627cd14310e28b88b8cf4e060de8f0b62d064cf39c1f08c0f1414e5bd6f6602a5f65ee793501d4e0a4228457781f2a6b4e889d851fdfc32d5757b534114101eb1a9e791e3ffd83e844f93f6bfc2f2a672221141eab69edf9e69e70ab295216aea67ce9ec91352b89f5003a8548387fa6d25fd4deb4d35a8d2986fbd16ee8a4598894ad6f4f88afb8205d29302c283c1bbe5ee7bfcf14d52583944ac779a9c0912ca8dc385cbaa42c4340fc6f65a1085abf525eeef7870316d8a396cbc2665eae25d9af1516675a6db4bc59972c76907b796293ebd4c6d24834a5c5ebb94a06f103818ff999088b21034a83df930b0998a553c4792e90881bade8e88ddf7dccbdd56a3f3dda3a9243db199683674df3d0b29578a8ef9f654ed264e72536534dd481fedc18d9f6da5bafc1ad93186c65e998d7af1f60db3033736d93320c9d649bdc1611342ed1669541482cbb8cc009b6338c3c2dad7c869ea979d1fe4cf99ef7c652361dd8863e510306dfca7e27538f337f42e25aab9ed8997e69f147b08e38210e918b27569fdf16d421fa9768806205bb7970bb76fc60d13066ed05aa134ec56543c47993e0a6b22d5386340a36b6fdfbbe1f81765bb4afd56382eda8e0b23ba1028313a99c0a70337a8acde67da18551aed0e068f2ac35443522d7b09e06ebd17ade744c2d5bf78d94a0a01a4619afeaef7278bff748296430ea5d62b5988dedf023efcef8283dc333eb34a5e868a0251e4ca3530c7892d99ef4c14bf81f793f3937239adebf410534301eb3d828b95aebca1d4c9780077a770a30acc79c2abbd04c297285bb785deb898b23213dbaca386134f575e88bc0c7a95e50b85578b3926c30244b94c251eaa95bda5b08afb89726c6db594f00ca279df8b309ed84fabfb794fcebb1637e36a61800a7ab65737741e286a1b53138dc6e67778942daf6ed45a25fd50443101e2dddeb5e772232a47f2f0061d7ebb72a4deda2e550b73e5bff95dc9ff237b2f1095a9eaf47cdc19d063ad1a7f800f307dd2cc65d3051c63f87219e05d5c0b", "00656363ac", 1, 658439980, "2d720de6710ed4b61b7eca7997b41e39a8efa8232ef949eec0029fe32e21bbb8"], - ["0712ff160356f432fcdf9f2a67616616d4c7ad51c2398fddf8da4a0d3c49111cca7b5c1cde0300000006635200ac6565ffffffff0fd428ca15b31b131fc2c32f421130273999270bfce103d6a64dba727639c240010000000565656a52acfffffffff5e30a1c0050e7dfe8e133ca6336308c34779fa331a25566a80bc81958c64e830200000009ac51636552ac530051b9f6cd2a03d37037000000000008ac53ac00006352531f1d1701000000000465ac536ae2aadb040000000006525365ac535300000000010000000000000000a2c49505000000001d5ce29a6a86ec14f222fecef8bbac3d650a83fcafbd97cf5d6b9a1d56d6605feb6e91c9f10f0e3adfb36f0e2e6582516dacf3240e8593ea42125bbc2c6e205cb124194963f2622990a3489b6fcb91bbe640027acbf3b08b817024bd04498dac00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000322a86ebf45129c33ef87d856b54741588993c8e4cdeb11b4cf8b90254a51500cc42d086383cfc74625ddf3e8271b697ef82ff1795ea11e5ef6a3ba4e6aebf240880b99a7b57892d4df95ae7120529beacae245f87ff7de5bc8af77085053581338917063f22fd7d758a95d654d6c6d730ee4b1f5f0759d711b2907fd7c086de0226f11061f4dca64336b4a104ac81d8c3048a3d72d6fd90f96a9ddbec093d097502004dc58ea2d5f47aeb916d1e737a60a4764a90f3797f3dc0fd4610a8b1cf592a0a082515f90cee17d907c936a00802717d9ce6d4da2bf83659c72892468bede35fb67abfda11306b923e21a2c987a732d9ee59bb29322bdd2af17480a5ddfec746022a3107fdc6af002c6e73819c12076360d5c3f1476a000891e1443bb79f33a569022595c32207509256bdf1d5ee584161400dc8bb4e950e74fd0c1cf30cd28a77eb032fee3747c5aadde9a5d79203da505476fe3a4844a66886495404c040ac126cab032769d177caac7793c6764fad44f7747b6e230ce83df1a704f14b77fae123e12e0211df9e3dcfc7b96d0b1e02db425eba3537253f1184a8bd6e74dbf2b7966a3bb78079f4d3f062e50ea2a56580e47429b52bd3ae7ec208c8cdb52f0d24a4b4012a93ae68c6f0aba2e3fb5023db0a16376b6e6ff96fcfd98f6828f1facfe72112b77d0a4654a14b45291c2b60b7d28bcf04c6080413f70af1dae2d2a10ec291f8bb838eaeb027341dbfaee9e6cd32960efd0a7b8dbafe6e805574afd1869888e43cc377d7bf77c01dcdc08db011329f6ee7b329911c39372617a93ddfdcaa4f7a2dee20eda5e9933b39488905d9f7c814d9116b94f4d9b6638b4d7ae5ccff6eb9976b343383030b21478a189a32050ed272e4d07a9b3287f89e70d545103a806400cd359cdbc8f72708164207a3c7722a2b280c0c300539a96a23dd8d06b2dc49589916e9f68703fa924d207ed728e053bc3a5b27dd5f57f51f4f1ed5eae1af13a757e3b30f7c9bb02ac5281e04d37e7eb0d8b1f7db706d75744371f12fb5123a78df97b80a315b7bb2c732b3da51d9be2388f2589bef3c7a062fa8ae4b2b72542e2a9e8291a026ae74fcfe5d182bfba1a30fce05d5948a7f9624ed6a8ea20c133ecb88388c4c1ef1d57d0060d3592f2057817906279089475eb945ce899dd3d6e1f5bb6efae027c23a3036e55ab24d25d57641ea962803ae2ba6956a75baaeb535d090e979ced51917d4b4c5974728456f53b1fa15d7921a653bdf150c7e39177b4e31d01ec2e4e6d02d190010c57253beb576b83c11a6b9d6d15d2808ff72f63ed1336c65938348ec4c9fa6ece6ae2ce1e4a195d78df6c1416c042fe98e38bf38a5dfbd9a4b1a4a51443f93f4f9e312d27d5022abd855640dc15833db9584740b322f6b0a87d1b2888d4ac12298d9cd42d77610e22e10071e8e736296b41b1e9987bffc8acf37ea94a92899ef8f6b9a92921275145385c96def865a9a3ef900367532d0cbc66b4a1127c31ff6bd2478544a972d3e871824d75ec408017e71c83b02bd0349c9a770c8248750124e26c03ac7cd55ed4d3023e28a8c5cd84f548d864749fe49b0747998f63ec62f13eee37256c2f9be38b16b17d70f9896a9e0009b74215e30cb5649b7ec5e401952b939c9026a4fff846db04e9b98d61721513735d3cc61c8231ab9a86d00157d161764abccfc381663e5c7766f1e779a3cde615b849f6a3a54208eaba5e8146fa323dda6678fe07496384cc8c4d6f68776daf94607aa67a73fda2488882cc09250a7f77d8db5767c38edd05ce4d93b9a81f685461923e7dd09c896e7e246cf8b380975a54380c476a2faa52f949958e233cf91a6a3a6ce8c0cf863209359fb26b8da19f838609ec0eb9f0a81428eff285be963ed01b75439bfa10054f18a281af1876b516eec2736d68cf9b457305bb8e1e0e501513d9c9ca2408e09996367334e602eab613686ca813ca5ef4b8274552d8c1d1c3b4fb4f29df399b1dcc2a45fc0d60ed14ba90741ccb4a95dfb934cfe9e2bd46775fdabdced070731ab8a8272ddca3b2220cc1331683a6812520e36f62ca832143ed5341490e6758cc7e72ef7bc8b74d58b9b15c65499b353f8d0097aa940fb779e535f14ce53cdecd3e66ae29a15695226863258ee0b9dd550b81a0f96235897e1e3bbb7f72107aeb7d6b5f9797e1152b95c40121813202a7c2d27a4b9c7b8281f18a3000873dc0ad2202dfe88bd5d73cc95d7f64cb911309c3973afc63b7f73a297ce92dca389714d77e6ab1a5ebed539500739de65e37b96e11a0f2df827fe8d3663224fa89abad9d9ff44cb3b56e5f3a5f4960ba95a0db55e46abc0bd1d64fa1206c8fb7c7a974d14e83130ab3e3cf68330398883e4bc64d4eca6eecf73baba1b14db91644cfda3c4c3aea179a836a007", "53", 2, 1586483607, "8f8f08b8ff13d922af3587bd831c8fc8cd2f24f164fbe202ea21d795b5cb3c01"], - ["030000807082c4030401b17e79d111ea228a2ed7e1138701684e71a14cf0bc9fe8b58382d758fb090101000000096300ac5100526aac65bacad6d6ebb72fa45ca81596e02b7454812bcbbc110ef5483c9b3e29c23137ef1e07d5a00300000003ac5153fdb2e5539fa3f6e58ab31fe3a9e9caf19f3aa7f1f75fdbf77a0a22192e1600fc79f2ee1e010000000152ffffffff6334c3a1dc59d069872b97ff952f9b93ac20e1e1baab618870f6b4d150d8f96400000000046a516563ffffffff01912c8c020000000000000000006d005fad00", "635163515365", 1, -604429145, "7728caada25b147056cd63936f8f7a34768112bfb340650fc088412b69f510fb"], - ["030000807082c40302b27c23a55d7f680040d937f578cca9bb6aecaaacbc1fe529dbe0b1ef44a32b72030000000465515352ffffffff3286de7764303a9b9acebb73c2a55777303de645ec701f778131dad7b7e9f1280300000006ac5352656a6a5de024c9020c1cc1010000000000a8e6fb0200000000016a0000000000000000030000000000000000b90ea70200000000de58905b491e9cf9ae15074f9530698b067e36aad3eaead5c684bbeec06f8ac5a46dd3cad214796c924d669e860f8dcbf1061c24265e7d34b51d79b66136c1ccdaee2e92545f49fd4a424dd1a6dd98c26bb6a96c179f0108492f73e48f9e2b86000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e7e1c5bc833e2e2e8a226f75fe8998d035638f6ab76ae131bfd539e7bdf15c943fb29c8e5494b26eb75c253730bc15db569ea734e927f9c43580f90c383792496fd66f5ee583afe80ab00e8388d9f3f796571677e95f19f44fa2328229164f18f48a9299519c20aac958cffb13c6f14c5d3b90fd075a7b7428ac6cde5b9b0201c0d310fe8937bf77fc66df3652e93f2394f5ba0cf7c9cd78dd4887cfe44735031c2b2e297aca9ae6ca07a9b2c0e576200963121502626bc8327d77316dfa7d620a03dca4d9749037939a1812209da71db709fb922371cba3c62759d713267e8d14866dfcb3574323e615db5abfa40c6c1cba4739ca20a0603122fe5f0f0f099462022c13b603c53fcf2f62de40d1d329e6742faa825d3d56e5d1b5e70d987872ec20032126934dde03adbbd06abcd179ad61586ee061931fcc7430aa30ffbf51195461032591aad7a8574e0d8ab59c2b3ce327d7bfe03ee1013c20ac695b17c938430928020315eae5ecf02e981ae7ce0470ed406ea09832881532a795162daaf04a1c6db302166ac84287c5f8c7618cce9abfd360b74e04126dccf5a159b1779b2cf1b7e25fe1b519e8adf865d7bc2bcb6f2ad6e8bbcba73ef83e7abc017fc76541075820d298fc16f7379a7d1842a231135c7c073cd503a1f8f0222b5318e3a56587973494c7895d1ce469a973af6ba14c05bed56cd3a68af2ae0f960d1d0389e06191d45fdb813c873ce1129b95d6e7b538c9d455ba73f02a260bcf204d525f4169ad35f1687c570d8737f8046691fc3399c8b5745588a256e9e8854f5b55ea9c2b6838fb35f07e25d6962282cb5f117d9deb97dc253980776b50ffd557423ba5a8e53ca8e75fd98a7e2d3ebaff97156496199f3a5a53ea2eb82d519a7be1f955f3d6751e8783546bd2f38bae59019d0c74a7b68c49502ace44beec60b903b2bbec650094b12af2d56b955a77625f21ad0fbacee34b824555749100df9e9339f67baa0562774afa45d83f8d44eba58cc4a2ce0f3914da64be66f2c4b92ee0bfb0b4aece90d99de796b72a9b3f79d45c3a397f6e5f9aeb7d35d06e81e59e175233ad99d56b13cfa6824a44d5ac3a76286f23cdbd7b586bba9a97cd4cfbcefbaf4499502f02f59d6d80212e921107ad4e26c4ead4605a8f2671b7948fa083ca43b81f72f671694c7af689fbfdd5b71835186d98a0d34a607ab2193882c5de08b4b6351486ca86660ba06cfaa80ab955b3daae901c5cda9a52ec33c8c1336f99492a7742d239ff7f5e087e544670d76e82ac01ec662259c738dfb277d3243da141f5986f453b5d283f727c03b59683110a5fac31461d20af113f3fee9bd749264b76d7929bc07157449c572a5360a66813d4cb29b55ab1da5eef5ef2dbd87c31451b54f8bfc9055a09a17e61d135cccbc60a6fde70273fc001501e34af64e1c28f74752e56b2583a2d74cf94f4a3ef37fedbf8c2f7536f1ad317234f8fa27146c5c7824955c58b09de196da523ca49adaddf326dc0570e65b334625fbaa0ae723a4f6321a182cd7f74507cc80555f97e53a7da46f825a0fccdf8fad490f6d554179b19c8246fdfdab22fd39960779ab7c3fbc9425e7939f3208b9fe6c6231d3af6832153a21448b12a227ec0d4329f7687a436a7a67458310248ef3f5008c360b975936e0d36552a7cae3d31a4aaf21bc0c60b1bbf578b1cf9a44e03613091bc80da7872faa538b1a8611b882b8dc56d11040cdd542febeec85abf1e1a3e134966652822317444251d9396f06afd0db496f59f2274efbd22f0e1e129caa6c97f2333cde0a1d347668fd69a7b24a28bc46938747e7e56aa3a1f3a2eb6f9bf6724782e6d51cafb3719900cc1d23586953d3a76a40389806144dc8e6b8a3baefeddbefb5fa6709bb28a6d6ca8b4cb319faea6e2d0644a227c8b6f1fa98eba2b54e4595947c06d84a94affc84f00f735b23052051fcfb800135f409628a27f11928ab73408038dc5393e76c27bbc8aa7f3b5e900a4065c76ab341009318f13942f5f144eb111f6de22be47dcc3fdd736d919d74fd465538ae10381e026c2ea1d8bc3ab9e262b2828382e3ea606e973debdd8b1a9ebf705350ca2868fa2c86f0253fbb1edd97b1abda79aa6ae5999fa2b3460693e57d8b7ceb1a347a5dcac5a5958a7d9216275ced3a07c26c99799f2ea12050f53659ce58d63657de417730a6fc7a0088ac82daab928050c83077b6b3ff1e808e3bbb7a6035ca9dcc7dd1efc25ad94c148397b5289b7c2c437f1354079df463785c34316d7411b3cc7fc030000000000000000000000007e6438d7d801c4c64952dd807307748e9501681dcbcbe3e768a3b50dac79016db8d1c5cdf112b24363aab2d7091903c99fdda5905d41449d1bd3bf45ae453314ce1509720e387b912d461731b233d92dcc22d6b4e962dbd860611fce4618086100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4d39f37e0754c06a8c59176192a6cf4ffd96cf418a75da53486f5eed17f29fc20381842cdd636311a3b325b980e69ea90137dd9df6900854fd04d5c87c68d48e478912346b644f266146397ba107a18a2d0faf90b50bfc2936f786e23cd6f785b039e281db0192b396c348d6583507f129c92e9eb2e6671a60798c445b85476022c0d004131a069e6c1a65ef052a470f3d1c415d876bb816b3faebd6eccf974520320d54e5c5ce9176e0e4cbb32e2c759a6e83a2c3a12dc29ce83591158d47e8ace0b0808e1f9292f7fcb2a3fdc7e2c5da9a63dc5ab4384d26f0c7531b2b872ae815df27ab8f4dcefd58023610a88a56833c9e57da5a245c8b1ee5255d8757a09ad40031afd7ca2e39d3df1c24f8831f98a7911fbe1043ba1e45f03d8a50f4440f539900229f90c374d5b243e18f073938456628e42c5e7b54648eccd749ee0aa9c125e6a03161946c68e953d80fbd073614f4edf340f2cf6c0600d9fecda417c03167833f2022435ae396bffde3aef7d98408e01d654fee6e4b381c914b304a29242d2146359020c68f1b7bd7c87f7a8cf80d471e4c756c58d28404ec38d1f5f3b4e76220dd8ea7b66aca9a1c683bd57b0044d4710998de619da159d3833bb27ea9244555daa73ecc56d2f3058b1bdf322834c0a2c72930bb247c70d4f9010f909a3bacb22d26562c0c75b0a76ed055612c435dcabdf1136f6a4e2b85b3bc35f42d3a9d7fbcc7c6f6b1f67a6a923f7d6a4795e73cea79d51f1bf6839b60ced88383d6cff3098c57be70bc97568f1d6c2382d82b283ec1963718a6ec34e9fda773449873f2363cf62ce545ac5619a655abcf67e3b7f1195db581996fc1081f5743520a1d816905348963c8b981848d43de0d1f86e1e308e20e6b5d4eee8f613579fdbc2b872ee6656773949a98ec3d640a64880e88a64f71830415779678ad8bacd679c76883d1c595e80a180b1b6af17be00e9516cc7f60c8bfff61870f57904a72bf0c950e9ff60a203885df6f5672d5a4ea7b6820f1fd529f1a1871f1c2af97ec982eda03176c87cd29fb7b6ec300a8d1fa5ead3fb6d08ce3e8fa0e1190f689edf79def19804a8005b95ab0236610f708d65720d0664616846ce01c8f0718afe7d669e4240dcd8223b320e31c7cfdc98fffd49ab77a9768ba885794c3e2b29b5303f0f7316043a2ecdd2caf82bee72feeb0f09ff7900bfae9b526aaaa201a725e731b885a0c328e1aaaf7cfe97eb788fff75a750a8d6a5898a611d7fbaa44ffb62e82770a54767f50cf3dd5274caa0f6c0ff86d29ab105e50da5769fbf7f9cb46b4ffe0ecbaafe76916ed4916126b2594ac90f188af355b80c38c94898f9fe5bd023a0c3983791f48ea81a20dd19d2169a32ae60b5700477402c53f77619e1565cd6de9bff2cd5784b9374220438db63d4b675de1bc1934b4522c85281d7e7304078858356a5ad640364be145e829a29dd78d0c74fe84bd407f560f037029b3e8fb9b1177329cbe3640ca1fa5155c1c39dfc9acdd66617be04172addd0863d9561562bee49200a5e4421b3ced67bd8cb6cc3d38d510647ebcec3d9223c4a7d6ebd1b4f92369175b90b771f8acf4702cdaacd9af408d95b16a8f9ee8479925bd2ba9976f10e1c32dd96a56c1f81c0592fc60165ec20163d7a0f30d611279ae6b69c7ba219adb9937a4ba439eb37441a70f0a35ae263f0930792ecfb6a80839b5724448aa67028e13dd1cb18db18e05a97240eca0e4aecafa147bae47a9089ff42bf2b9e49b6b75845e3b165febff5cbcc73a6e20402af51e25d2a16817d8372a09ae103cf0fe404c64dea0ae254822148c5ab2c1d5e682e8220a66ed63e947251c667ef88bb814e6f618cccae40bdb2ca15bc57cf19fb1bd752e041963fb2f69e860c4756832b3798df745799156ab52db4fd3c5a84ab764d83b45f1fcb81abd0ee27b070f23f69682f0a12bcb430334324147b6bc24e8c2941d8b76cc03c7074defe74afe4623bfcc13fa2bbd210586cabe6f345b309b5c54cccd83d2029a8063a3916503b4aa0a7503332b12040d33fef8f68cb082cc8f1182b50361bddf3a093a975e54ce51639b7ac7d5633e78c082540cfb4e227f7c21ed24f63f70adecffc801dbb049d334e4fa4590ae0d3bcdf90bab48e316e1500b7fa4cd8baf1f5a73c8f6baa4472800e4b430b3d6c15723bf7d19be95db2e875a82221475e7a3b5ec597db4ee01e00b1fe4f94d0d6e1adc626d32ea9d22f3293a821f93e7c21f687b9881bc99350046dc05bd7cd3a3d72fb7333f3c3deffb2c9000000000000000051d1070500000000d09eed923a2f5a5fb3b0763a02707bb7ca68c594d00e42c19fb417a5f6c05dfbad4bb5cd43e2b3a72d1004a93e2ea6679ffbc0da710151a88e85d58da0ce4609a28e4cac1b0e49de39d4f8f56c348d482c198b3a3c5d9a4de704fcc906396e7e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075872898a807ac74e2bb72593b40b6328eb48e218f22ebc64fe3b39720289c42e7520883888ce5aae48245a08085044d6f9e6976d87f4359989cbafacd954c4d6a370eda40371e6da3017aac0016e696fdb9d6c0794bb911c08f5fc2cbee06399ee62c5ab413ea81a51131adcbb30023ee79b2c59d8e5590d69181b75472dea4032de5ee001394499cf50e0d6449b985f889126947c37cc920c277acfdadbfcde7032509a56d47dd34176aed556aa2e70982329eb9a78f01b73c4fd6a1727c515bcb0b0406151f189d24b1091b53f38713c2be8bbaa8ba89a3f57fcf5a65bd6023bd06f66293c58edb430e8124f4b70ace1cdf89239ab0df9111bcd827c51250216bc802279a3d4a1887ee3a5ea4c0350db180a026e636d3d4835bec733e9ad3830541b602052f6d787a113a5040b4e1e7cefaaab7719e8aef03fba289e59513b1b91b9b7603165820aa16d5a4ae3ad3fa9f69d4091fa68531adb15eb8a8c5dc477a2c80adaf03258c9d9ad44c85fdb7e5abd6015dfaba1c6cca989729f2e03e81d9697e51268f03046d72f43471279e8081b5cc1a73cca9b34ff6c99b8a3bbe7ea7b538cb18adc5a69fcef7dfa3a24c447fa80abbf98192085cc3dcf4e66904ca16bd5a1d2ce0e1961de8fffc6de50e6d8bb780462818829a1630b18578f66d660f68423aee63a21e1d29c9b1d658f7caaa10cb1fd20d035bc0ff45a826ac73d6da874e68b64a6e9d393f13c804c052ef33bc8540712a071c5079261fd13816a48c39433cc5dd1e4e7afeff48c4bf025057b72efffe495b45495c5afd0de7ba22535d71b99328a9abc9b8d18ce8405a9df9c73b497da6bd420f5b32fb578bba99d617aa8e425453ff896d8f07f4df99ef463101227a72bce57011166bad2709647cc1af13fcbfe30cbafb99ec5e292462daf0e39823331051f6125e09a684bbfce96bcb37a34ace309cb92265e352ab24eca8382e630f1e3f2117c2a152a553aba7d29989d24e44a448c93fe531a5d10d4ae0ab412a4c59d221a1a93a7bd5c1566cf4fe8f0957c988a9d9a12eaba44df86ecde5b18951c77749d3d212c6a16ba62cf2251c8ab3e0e61a2072c3715d027a44dc623fb395383d4a6da5fba0d8a473769d56f6e86cb740781eb93a56adbc5afc23d683343b06c0cb9519ed469ac5bc807d06cd37aa92350906a419726096383500b76a47d4cd7452dd2b40deaa1e93fd4dbe0c5e5bfbe4b9b1a51f5b4bfd22cd52a952d206cd82433f9956b421b3a5e421efb4f33f301df3922fbfc610289dbebaa0a4011ff0278dbc64f72399085c38d97e7b60859c1c513a46185cf4cdb4c0c74905a245b02ee02d81e50a7c174f7a487deee89e23d34d707c9cf8e4f2d512e9115f0b726dec08ee765a7bf0fcbd266a675cf5798fd260ec5215557af48a1ee766c1bfae1c155eb9ae6a22c6731685354245d482ff0137bde1d807a6873330f205f7e037034a5b8d6562aa9e40652238765ee29f71a04254f179e31d843c245e40c95ec7035d596c3dbf72800bc2ca0dd910096c686876e71749325dfb411388416c860b8278beb0fcbfb30041af91718fb0d0e82db6a4c80e0ef4fdebcfa7a6ffbde0d66072f62240463e1be6d95f082a92bf546ee2f0d7505f0ad4d9da43c338e1720593bd806d0513e583b39db36ec89e8e62e2a316b5cf5ee53313b584b2229a5ec6a26be57d6abce5216e78536458e0e721b6d947b6d9f32286232d5b409857c0711dab564e21cd191827fd9910799518a3399fdc2daf4c2931a6c7ce21a8d4414a242ea42f11d2bc18bb02d4a7a349de6df6e20c4f09a7eb8d0321da4a5fda2c41e5eca0425cace1bfd4fdbbbda1d76153c3c191a97faa8ab09f26146ff571e3c8224bc3f7b334b390b1120595cb71b43554bfceac4205c35875e0bbba6f7aa4e8fc6c3b7328a19fc9cb6f35fe341a71b58044ee0a5f383acb1f56124868ee2d884eefbdca1b256e49c5eed1cf9c2a0d5a279e261681bf264654bf667be7f9bfc33f71c4b0119bc93764e8a80a6c8eebced0f987b73655a3bd7b1ad12c4baec621ec713ae8ff948892e8b7911be76b96852e74a28adc1b91777cf54781631f58eed9b738f9738572970c541c280dfde59feef104d4d42f6bc04c86a24ada9f1f0855bd0e8aeaaceace14289834ea00ffd9c5f4ebe9f9f73afd9a56762a6174779c88013ec21f9c7f7adcc314349c2a37ea20d1e5f4155508d453a91448915e950a71f36a05e9768d4f70a35df755e30da8a0079df74cd5b136070e9ba4df7409efc7bac6f4bf710f465506a51f2aeecb882f03127236690f3156f2678045a108fd7bb76eb55b3c225db2ff4a100d5b14291f42e4d61e42f50469658934214ebf97c95dfa7166717ba075b8a6f88c776a2c3b0a23343346dd28dde76d8314531a7c695609", "ac0063", 1, -541223137, "3596bf878a4c3600ae55608fee815c76bdd388c8bd216d2ca685f19f9d218a0b"], - ["5712110001d711ac543fedf8c7403eca0b21f1aec513c747929062a28101de3a2c23ef370f02000000055153516563ffffffff024f406104000000000100cc395804000000000863536351656a6a650000000003ea2a7e04000000000000000000000000b676da69b5baced9c3add8cf2b48df3ddbc9a047f841dd889bca86ade748a4390670fdafd24eeba17c40fc7bd731eb4ccf957a7c3623889a463abe23b8a79a6bda4ca751796682c04aab17f82af814299665eaaa73595c9ae334531b7c1d7fc100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e474d9a10168f6955e52e34b8fc0c3a5fb91e408b05c4446f27bc295c6482a70f306f37427b69102d35753ef4163367829efa2dae0d225f24f7adc6e656e3f9e183b03eb0585aa0a0bb544bd6dacf9e2222db670bd23f4cb6a4d755e90710a54e9bd807eca6eff10ba4276ba65727780c907b35e777a8bb00967240dd36a85c903108744f41f4c082b00eab5b15315ab21c0049b187cefdbf6a927ac07bb397402021bfe7ace0e49336c913de6dfc1c35ee9e5b6fe07c4b1ea2bb462b8d7af8a17730b01ec290549f7036e121aaca47e08c635fa3b6e37a3f7b6a42db99ac70c3eb9a41c7d17512c48a6037c57f635628d281ba36333fb00c30c47615ea1c7b521f3d80315e5e275cf8d4089200ab3261bfac7b49cc34173cb540ee2405dcc6dfdd8868f021efbfcf3864248e6c89d43ab9859c2717b1725057af89ca230b9b0ed73cfcc9c02250f779f4ff56c6e815f52e7d9120a89b32f7985e7a3e0c6514809b4d510e1f8020a986df7d93b2bdbbc64c872327c282409e16830a646f33b8f879f551be57e6c02116597255506eed401ddf33d167740e5bc6fa120fb748c79bc60ab51de8be607a17716793b98978d0f27eb141764f6d0b5ce69ec64792974b6f289498fc78e9ceb33243294dbc8da383bd01782b1d3917632b8597b5a539da1791d112c706d2bf0ff8df92a76b340b5be774419a5562a4add36892d8194af4ce4ba7dc7f2aebc526392c77e9169d889544fed76dd55aa97ca0dc818a55d7aef9bfbd22cf01e3e12edec9a5214a9b774d07d602ce19981a4c1aec23456fa64f449f44257a0033ab28f745b3651b1955bfa674cb90185093aa90b1f86a1858e7dd27660a00552b79b74b7e9bf6f37c8ba60aabe56b15f2b7f0076cd874bbaf12d6e7c604536d331a3a11be9f5966808d55d27af0d8465c28a2ca2e37993eaa5d41666030bfc988d2bee90585b6bef93b208a275dc4f4edbc1db283906feaaa0bc900ea255d01ee2675158e0cd43c50a6daa1449ffa62b9a2a3434d897f55a5a8f33b008009e9cc13785bf03a0df2c817ab850792addc1623c308ccc5b68497483f0a50e2be79cc5db660f7a7fc4664205b616425d505cbba2cc5e89d48f7b7d8a83d49a57681b864a094c752087b5e593b6844edb95e399032ace78c640ff9b598109516c68310b87735bd938610bb0aa57a54a41d17aa9d25bb5bea45281eb5ed4c10bdd2acc30035b66a9b196bf3ad332f15cb68f1a280e2d019c710757c4d5900978483a278c485288a06e3b412cf6bfa5e2865e4f2ec96ffdb3589c7d764e9cb1da42e51d7fe9130470389e5cf7c3b206a99a1bf8c31303e3c5b89a84930950fdd8732f0b99a3abcc20a83231af075f7a4001a253753dbe23b4a3ce1299b40847d4dcce7195d61f2ed046e766fc5f897f079ca3b26250b54fc7c5ce2daedbabea0d2de6c3f71037e57ea3cb27ddfc1917803ce0f3cf3ad0145409d1eb5761805ff758a664eb4579c406d7b051aa4c41149ac4fc2e71d07ba1d6e633409e207fc8d317b7350233e85e58be11f38fad5a01405ed77f33a252232403cfc7fc17faed640275db0640bf6ecced13dd70ff4f0f1030bd66a7996d0e38b8777513d3fb3b6e6a1c4423949658335adce563841d1f1048f225e75c664d52eb467a98a40d941f75a263787b55d533ae78720f3713a7a5f10f8da716918dd3379ce4afa53e9b9cc2fdef5d3a153f463a0b8b7f5340a58f681ef3c95bfd71b8e36f8bcf9e04ce2906f9c8d4a94a45a0347324f31de99239c11d7d92602c185acf0e153cb8543ad9b36b40dff57dc0380f55e32bef00fc8dc24217cf07b146023682360d598b9b9a6debf0ef51b5337d5703ef187bbd0a1bca3804d5344c6415d571ff83630d371e2ee7558df166396681eadfdc3c208329b2ff466b577181a4308403a0a745ea5cdc03aa4ffb5bd4747cd7eb85f271f3d0ee83e14967c066f633b694c8937f73d59567c66b51276e6c793f40902103e01c0cf4fb3e8646ee3bf5815df4fff8c74aa2c9e74579b349dbcb2551b1f4b79d435e6162363ddf3cb6bbd7c5972412e0643a87bfb4a25471a6da27bcd436e16f0c68d9434bf2832dc12d3e857522f21e23c4f24baff6ae131ae48699fdc6ebf201651385e92cf71f1aa331f29ed27139431d3fa1174090a898fff8ab14f7f2e7e91c51b73ee7984b778f200913ef919de3ae1268b88e046d2a8b9cd77f1ce332323fb7474dd45d46a038548c5b8109d0069a20c2ed4bd67ad7cee3bb4a9662894f34059a5b192f00000000000000006cb8ec05000000006a2436a88f4403d0c803cc99236d49b7d10f71e97c478ff3957542f56286da31ce756d604823ebdd87998678b07c7f3b98a43df0634eb6cd52cc451b9e9f2b5f948814c441ec7c0126b678d7df3a45ef047fc17dfe4ec9f6b93bef986e347bb4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007e73bd0927f094cf321319eecac990bb4c16f7792d093cdc485c3080a89a78816183b94f4e6c791efdc2d6677e9dc9385b426e211b8b7da302b4e823730c3a51d21d399e99d980bd9fa99d4accf44061dbdda97d9ce624d1218fef7ac64b83715f211810a4b5fa493175aca131ce35737fd64c2b04f653749ec6f3de68e844f00317826dd02dbbfdd6608b0ce72b56e19b30394f1ee19c57fb8fd7a83970e788380214934915ab5428e098814c2104654d5bafc0b37a5eecd29a5dfdfc0df42111290a05210b50636eff77bbcd97ff252271ca302afdaeb8aa4e62242ab1968ffd7f23febf588dcbd739e0b43e16aa9fb55fc9a41574e3c9dc4ba0e9aa67c322672a99030003ff39451bd3ca00b192d243329b08a82f87b3d3377be090a7ee1ec68e6473021e8b9b147ec3b7e0ebfc7198b1d77295c767e829bccc8731f0776991f32f1309032acf4ad8965932d40867eefdcb6a107dbe7b653f2a213e7ce7f119e8dbee3a26031cdecc0a313327479b69c6fbe67604416f97b9dab3be291d2b773952301d42a5032d96bd8fe10ecc886cf5dd61cf7b3924616bfdddbc75622bdec77bce1788a268ea0963325b7f05141c3ea9d9927a53696c322b2a44bb81217cce5c9bb21b8f39e6dd46a5b2217d902721a8915bfbd1ef2d80ed61bc06a34530c5bba96e9197bc531dddf0a5f88dbfcfe17c393b41d3ca3402d98f92d95904b1afb4e608a5e77c0d4d9d3568d8d965393cae9334e0497159bd81e88be0041ffe777d58b2f17363989977f10b4ebed41feff3cdd2e6f9d9c0c5ac7245a0320abfcb39be1efab044cd9a17153798fb58ddf32c5acac5bbeda286d6f10a34d12c9b22105f0c7c0505d53bf9716e2650bdd498ef24dac9d95844ad918d721f1e2bacb28804d1eff19ee37b097a10289ae83f7d82e22c4b7f2712103e48244bccb249bc255523ab783fccffba247b873f048b7c83e66c8af118b3c9508003fe096cb5e7c1d18fbcf0a0df2a4ea01497f0b53771fac46e5318eddec793871114642ae0c283fc0d273124ffcbb4742fa64490a78a44c0994de152ad9f3d7a9b26fe8817e965d205e9505ea62f4ab8b60af73631c85051fce16f017554591df4bc7a923bed8d2187534b9cdb720d04b8551d75769af7a2b88e8b3e001244756e19f6cf5d4a704f6aca7f96a0fe327e222bda24965b2c725c112030689272bc5a4e569e2893b200ef64e13ba4dbdab59b07ad56a9f9c4d644759fa40f31b6281ad4ce7f11a0a1f4d02e67504604ced93e3be1d919b7491de9f979d9e23776bd8cc29e2f341286fe669b8e31da9da43f562b020ad03a26f6b4e089064479b3d96e544abc0001a7216f3f9004dc38decbcd9fd88cb66c5ddbdb7c3580fbeb222398d8c1d989b2c725100f51b14e2bec8aa4708d30a3fe8f68a6885a92121079fc8eb31d110b8102dad6d2451f8c79a68c09089e8ff9a02765d1f2c47dbf2d32a841f4f7efe9194f592e0f517d7cab797ad33cbe4b18eba4c6ae7d33d288715051028770ef626248c6e0e8a6506d61b375db5f45fecee71d42a8d6636657a3d0c7bf0302acc2faf490fb07066b3bc42afaf21307f90de01c68a38a87a2c33088cd3319d033f8e34ee2f3419ec9c0f9f4eb9577208416e5acd74103338c913394eeec53a4c6464cec73ab72c9dddccc4bc48735f016838861191b86dad890217f21d68ac1d257c6b521002880f784c346233ce9be829b60cb93e14ae0cdc85f48ebc0667e5531d587bf1ffbde83463ae37b96ea879e7f268128540f7d9ac102b052bce7446320d76c26fd3ff9e760d3079bcd251895d0efd22fdc43da5042fe8e3f8c6507f75d13d601ad17a577f5fe76c7bc77f60370f470676ec48d71b3bea4499fab8408895eff3037db5f7ef4d1987a64b245bdc79b9def91ecb836bb0c6b5634624eace5ae05bfb19b33714ea4bacd9693b46dcd05bef49720dc69fe9d890c79c7dee8a33151bbba0eeeecc58e57bece45fc7ca0814d05c5a6cf341da2c4966265cd49c7be6f0f0c5d966d9d42780d197271ff4f504e6acfc82603530dbb6c5524ee395ff410d92381a8f86b9c5e6e4f386a8c72f187cb8813638623c9c10c2b26c81675338699c68f7ed0667caadea36bac7ef806460086278513680b1173949efe05f5f1eab59e77cfd2217ad2dd3c564143f5a91fe72c484fe2f21f628eaa0571910211ee2d40f43b947c9df2f39e83502fcf4a6d7475c66d9bb440ca817f6ed70ba0b04e4e79a7bb2ff1662a3317819f8fe06b159f81f66da5e8252b275b03000000000000000000000000bc1940f8814c151c5d6da21c6054db1f40de475ddc5e1395b81283363bc3b0c2df658daa1ed214b4237a86a372b6735da4b2fef0478105b2ec0d309c12e4d217356249dcc6cb3efaedc835c80f5254c203622aedecec3fea475462fddc8e2e8300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c2a288971e6aa9563a6b3c4851282cffa3143525d9654af98ddafee7e6d2e437daf61415a4f25242e2f96466450b772a5a8780a649c3b5277bf9cbe67fd47dce9d6bc3ae485afd7dedd0bcfedde5601d7aa6570ae927f811a991983d8847cface0f10febfb37bde24dd6938b999d442a811649a81ea802692cc7d3d8d5c62647032dc984caab55a893c3f5ecfe495136ce70aa5edcef7b1df4dbc3f4acb7358688020958224f523f717ae13da9c99cb7f83298ec1b6494770b835ec60e4e5d46341f0b04d3eaff4b526721045f1f03a0d103d71d1b63b6daebb19a05fd741015670770aff270e284eaaae321df0f9f18e72750fcc0e191725fb18b6736c11a46e09f430326c644dbd452f6d3e80ecba361ceccddcc035c26611b191ccb82446f1e80b77b032f0a3998ef3a91d0290109c015a67a79e7be55aa7e1ae99307b62270d5b41c85022498c1d443a540fbe820825b684770f539211c375d0f09e7b1decef8de247dda0326fab34bc7a10ca65d013136d2f0e5ad1fb7fd32d8ce226b7be3526c6385ff6402187d39b0e6fedd82fa3f2dc822c5db41f7492af5d2183d46faa251208db7d9ff8ca250377b8f5cf415cb3563b64f0df93a64fbbe1b43d25606f059f2323ed1f5fd9e8855c02d68d275978980601eab9a3bd397d7accaebaec0e511140ef4490116be3261c5709db64cca1d50ccc92e2806b82b032e42f747927ad3a76c383728dc69ff21c24516112661473c2bcd5d8d7187b408e3cac22a9dc111c29e1f0c223737e91ea46805c4e7d609a42da9df81c50aff458ef11d567e7a7daa087adcc4c949b9748bd02aebdace459a8f51cdf1e30a906546ea9329a76286a279ff9385e0f0ac7cf5b3a2ec869483e36655031cf8dcd90d249ea9077943599489c51cd4f5ba68b2e7a1a316a14a764d1cb997445034682fe63fade7f241592de484203ba78cb3cefb53030cd27797f6c1194b06b4adbddc0e9d1c57c2c39fe395fc54db76f434fd1327803f797ef8bb7a4ea0011619a13af7553b78c43b390f633a9e9abe58c4df96716b23a90315b02f3f865c5d1f50aa19da39badf88ec159ce344d03f0e62f77a81d209dfa9d4ff5ce532fe8a7350fa4bed82e38e92e4cda01d576351a08875aafd446a32b72f6ba18ac9406a2b95d7f35d42654fb6fc9607dd4ceac6c10b6fb850ebe4d8c0b7b6b2b3cb0012540c6ca62a5814914c75ec25f8f220aaeee9af1caf79577b9a5c18999a4192207abb8003255e475276fd7ed8f3a7817b278bfd98db68301f26eb3a4bdf6d1718984009a2ac9b87a7261fdeb13c98f47ce6291a340bc5e2c34d423fc73ad561f535d2c39f1484aa482bc254b2c2730a49195ded29c62b346c9979dfafbc068bfaf42db6404cec60791355357ee134e7a7f546a02b297815bad755473e54d5e988c0cc9b114bb7162c768a3f97d35221f3f23a5481555d8311ef530df008dee1d4860fd59cc3d46a8c0bfb1013b629d94ba321082ab10128d53decf736f2f3949bb602f80d9f3f9dc221ccd05ef033acd64bc21ab4487f5cf88c3df7cf840e9b8fb675e02ecb6244b01780d104a0098b828456e88998e71408c279afb35bdd536a8ac81e712ad7f6c58d273e29da28ec4a653bae52e5e349137c1317a2e13bf17d84c24360aee00912824eb99153e052fa5476752f04e64c9f7ab73c80b8835fefb93cdeaa967d1ec591d0c0e3fcec83cf458faad27b8c5dd50dbde3083e455ccf8cb4f63d70fa92260431a839506b5d40e59ad90c91915f0b6ab84f42337fe75d660fa5ceb2eb6c911efd15e5db7a9658c8e4af522ade81793ba8bc4a001cc669093207b2831dabfaca45b550ddb4ea6c6391283aa24a78b332f92fddf411dd906423e9bd193031d8d519695d566252f1a9468a46b2b75b622235740677bd894519f8d6b5911ff5eab8e5eea0a6626a24d2c29f029c4dc86391c25a88f81cc2da0a77734cc59a660ed380164ea38bff782fdc3fa7ae3945ebbec146240d812523a3678e48833f8ed649471f8ef104f141f0dfac41be783313950d170869c35ae5b1877e23d0df90b14224993f901052b53f295dd3b900b968b28697da8b4e79f5c1490a72dfab6c6b0a7b013a3a65189634b4e984a1e48fe6c613fc65b61515326aecf01a91f77c508313eb1a234351663978eed9776da0627330e34098e3de3ce6f3ce5f1652b4733286a3e5226f816748b73b7fe33ae295bfc2803b23410e3144ad75b1aa4f82d425612fe428787b80f9ca479a2eacd1772dca9123237002f0f7bd1681a970c818f1dcb22e59030da817c4a89dca0a8ab5bb17acdb9d2f9be58a9339946a06c69fcfa67601e3d8ea71590be970c112639c918d229232fb841696bd5146c5a6daa7a236ce442250981c085e74199502e4e1267996ff919ab43a04", "636a51", 0, -300159779, "7b5b48d49e5fe640f985fd3ec50e4f076c1016383b7ff0684da29145e7e7bad7"], - ["9832e44b0436af19a2733057bbb88176757b86090985a6ed4f2f5648d2fba8cff0398318aa020000000300535291216a6a23e8a31dcfad16e600e33924c9839e886387c92188bc2527a1d177928db586dc03000000026a6a0ffdfe701069d3538da179c164c6d4fb17e58ee6ad8e9ed68b179aa4681a016302b6a8d2020000000251ac766790dd17f23d2b93fb6e6be8ba67a36e4044ea376451bfd14c2678afc71cb74c9f3d800200000009ac520053536a53516affffffff019f38ad010000000007526565656aacac000000000279f90001000000000000000000000000d57e3b26611225a84eab1fd1a01c4d2f82fe75d5f3167c17569bda05229afa910da35c31801f643ee4e2efad2f01999da8ad8287e06b11d119bfd9ed033de6bc499d7324fdbc8d65d39389c1db9468213538baefad642d40e14c25269e195df4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001faf4f659abe501ef144b0869de59925c7870d5ca2df60da81af812adf39420e0583fc3302865fffa5df48ac3b0fb5fd65f7e4d7f2e2db375b0a51e1ae1b7dc29aba441795f4576665399238197e05a09164db29906259864c995c17dd1fe2519e440604c5304ab1d1e0596c75b31b865fd77d06cbc017e90b7fa13e524c43eb02182457318ab51ec911e7d567591ea9773fd6bb0a982710a5c66e55874ddbca450303bc3c75e39781c489314556292196a5afba1690a2f0fc0a6afcbaece29aaa600b006e02e8ab902cc10bfde64828323055d8d1de28099821b1071e2123f64fd00aab5a4c604b57f672420ad56bbd0e0c4d60e42bcbf3b378dac230926df2a2bfb4030140ba37fae1cc5e05f88a2b1941e0e48573231b12f6d820228fb95af185cac10326d28b071bda873d62c2ab28b74b5c67c7146c46aeb8ea3a9904661b968e085c02157cdca6b27f9c2d0e0ca475f6ecec625a49c84fc75ce624889ee9e4a4172f4503214d65f70639caffa26d5c0d4d8ec59b171aa6dac75827fed1ad54d3c03e95ae0220a2892de90ee5be5089fb285743d804ce59b393d0b0cedf40c88abe209b8d0553ccdc4543762ceb117aca19eb2841b8e9031b5f6cddf8836ceb322570455b41cf03a74592f1c66c3077159d84cf3d5c9bd02719654623fc9a1a3c09857c817df98068320a3662d549b176c704050073590b5249968f7a4aa08c59c642ff4162d9cfd7c9d2575aaa76c1be1a6b30981becbc24dcb6fa34f2db542e2d246136d30bec680121d67f3c99a644007512de05045ad551a7c663a71616957941530af6429f6591ce7e68055a482bf57e6a0648b8af3f2a845e909f3582c2afdd52e9a6fc4519a02a5e73ac7a710069ba8457333a76acdb2877e9811b092c139d5e2977119c05c2d773a1bb38aa11ec10ce8028cac58198c75bb74b95ae275f9befc4ff493dcaa1a4265b2c70ac33e471b168065740939e64e38877e141b99d51986bc5209c75bf08ca4fb660f67ce83f7589436b0d3166ab91e92b678093f560eac949cc43ce7ab878538c19f4558d5d2a80d015f152b1fe46020119e9c1f1566b96c9313dac9ae33ce88254ed773592a8d8c1ec1b6050c2ce2965d71b416abace3a5d45a52d7ee655f8f5fe75a929a9be1fbdaa439a0b08d5a3cc36d891d83e8514b1a477edbcddc52bf15a559494201562c125e70c3932ef3561b4407a1ad50e8535ac237860ba0ec512323c4a6687f060d8a3ab3eb86247d79b49a5b5b7578064cc1b3612cf7d01907aabb7590b822bdf41950607c2952ffa800971191d2ba746d40571a13fc48021d934b6646a4a4252c7ae055449a39eaee4845fe8ffbd3647146b8a510097a53fc5f8af0d3d203537ca1d2424729f2205c21157fc262b544b9f6bbab88cdabf47e9b7f3c0b94c9a638ee613cc97670e5b65dc46e691b213c88cd5f23b684dd25c2939fe00591b6532864044225994389b5f1f72b508234c35198865036838476ef204fd67a35ecd5650032660bb2c681f4e44d72c40cae0a38ecfd5c837fab09a0a982ede7c41decff4f93df6e4743a40507e117594b12c443a8ca2b2260ad25f15ff0c0969e852f524cc9a98b1be083ebaed55ad6f8f864f49cf90475d9abf1dd26f897748fb5b09b627db03d6daeb73647cbc641f719c00b1ade541cbbf06615161776194f9eefb22e15c96673a438bd1d1eb5088a2b581f07c508b15be9e6a2aad596173805e16ab03c91af4c651e2844af70ad83e60e9b7591dc02c5ca1190c2cef3afc7c48a4538bf7b6ce5c8718b6332de942325df34e8a273d305aaa97bb29c5843ad7568ae0eb2a1a8f5cf8ede922921c85e2f840f07fef1c44903aac63bc7b6fc1a054f8a8e9409ed79514920d2dd1c022e10eb91774bc50fbf54daf4b6c92544725fdd87e6a105b9dc095a27d7a8f460697460c94fba96ea4786b3fc301fcea0efbcf0c4877ba2bf3d18f4a23b691c88616cc4bee5e768d46b8329e2c25884c700f23f60b3376a469dd38c3533d8efce6c71edd8700ce156f7e7ce926432a985ad852cae5d76d04a015ddb23cfea20e028a5603a5b5d2da83994cbabfba0267dea5a3f352cf2f628104fc257b768c8566f4c33dcd51c8f4f8c1f75e1f393f1d2e1fbe813eee6d0e1f0657ee0459ec2141cc6be5f93b2346decaf8cdaa21834d48e978b85c62d847c20d02c1ca7049aebe03d12387b26ba9af6b0bd741d2b4e84bcc223fb3dd07eaa3153c38bd1ab466ed58b68db2b6c8fa84b598a0ba8379cf97a4cd181926f8e029510100000000000000000000000077c8dd96391bb24cbdb00e5dcfddeadd31520d3ffb155ba331560faf94b3de011226432da83980b497ff134dd08d99efda122102a0fea7ccc2f9c00b0950c93f79b11d00c59860b65cdb9d08397653249033d2df99a803dd18d847918ddb44df0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041dd2adc98b4a6c591c3b6427605075f831bddbc3aceb9d3e57c00470d0d4b6f6fc67caace25a034e3a33349dfe555db8b38558922cbe10e77c8d08ffc04ec3288ca597ddd1bc79e9e3cf56660a4c131c3721ccb9b00575191a944bc5a1d78f246e2b73a66f70e901bafbfcc3b010e511937133a20a9e4dba9ebdd48fc51d4d2022d30c0c0f1d36a949efadf6e8b25d6b0a7701433507ae8f52ddcf9cb07fda151032beebb9cc824580175ab8e16867e4547d375cadb774c336160dcacca997e54dc0b01ebe7aefc04931df335d0ef52215bb127436b8797e2a2f2cfcbeb388af2c80e38c57c05e469689c549b0aaa9dee0be2567321164a1ea7a0919c9f2d4f95aaeb020672ff7fc2d7d7032a37e5b65ad524e4bae45efcae16b1ae0f3421167f3408ef02095b66123f64dc59ff4c7de75fa28e03f489bebe87e760ccfdf6eeb465176e5b0214e999e425b45a09f682fea44cb00212710eb3146787622ecec6770ea4c8f2fa022431adc717a0304c5c2b36db18824470a627ddd1737c816771c78e120adb19c0020e9637445224049cb7d515b5e8873142275f82577ec140190feac998b5c8f3b18fed1d783ba05cf5532dc612f9fe8ca5cdd57885590771fe8ec94d5308c7421c22d309a7854fa25647023bbc3208ac4e2648e1bab035abc6cf13b1e4910de331cf775d1320d4fbf5a09d0a1cdae726fc99544e8dacc8da56732933111fd2e44711d3b9371aa3c0940e8f4ca3f985dd362ba6bde2b348ad1147308beac5a9592737f10d4099f83017fa14c0505e4a1efec48b27426acf1e8e504067b4e5e45ca6c35282ea52a295028635a60ef399b35382cca7afb13edec6cad294426d0320368b4a37737867a7bf5bda56987ead9b790b306f3410ccda08b5e91436bde6374c6493f9e19eb14c728a79a1f8d0de9255e8fbc021cb0b10e7e7f2c464e167bb87f295dded08d596f1cacf6500f85f11f51237b8730a1718b07be32c17ecde18c663411a1d9ef5db07f937f2df500cf22880f4adae68d33b9af48ce723254178b28de68f08fc1606dddc15abbada49433abcdee0ad0fcb0587a9e7f993b61c4cfd0a4985ee20e68b0ae6300e4a965a666f125482fe97838e606aa35b17fe2766b23fa05178c1e16a1b1045bf7e7fb513fa4dc8b32afaa13b3ed4d491e91ac83895eb1d282a88da37ec5d90388d94d5e9b090c4e822acbdfd2165d4d8a226352be76d684813dff9b93b36ad6921d08ecf7917b27f69a5b15537c19af8caf25e2a19d00667ac201b4d19ddbda63d7030829fa34270170e57af5f408ac960b430338e52419f29187b0f1c22a2c362596e7ab56b23ae92b11da3b783cedc8401ae8793709e8e948524e1751bbc035f475cd59d4c0286c8212ed7afc556f73baef46e863891b26e64a069228f904f66a0b079c1c5f76ca569b91a0c93c76b6909a4b67f04ae5d7e9bacc7866e662f0934696d774ae416e8a6b1f0ce153edd832325ffc8e574812c1bece0ed20dfc6691e33d22b955aa73b2cf08b7e529c7d1bdd5ad6abc2afc4075c020c8e93312712c236ba2de4272b348e0f53242993a3ca47d9d6f83e48e0d83d446d5b59780aaae6e09bbdd18fa3c4258f761354f1d90096c0eb92f663d8acc3f87ea77f4127551d60902cea1ab20f6abca7f970600b553b6c61db85ca465053d199b0453f3cde8bc08991e78919a930403594fe6ae9bd0aef80cea43e897011ff467026d619626c6ef6e35c19c6b11932a33dcdd67d0a59493355f1c588ec385750345cab41784d6d6d3543ad050bb541b774e32e0218e211d1d7397eb2370c78b8b81a54dfa1cb06b9f36dac861b20a232d6e748037e0fccc28a6fc73340fe445d4e003422c8da938458629ab0e37fb04d8a433e85314bed43697abd536e0144a7ac296f1884ecbd70ee777f7f49b3ac65fd23cd1b60c20868f5dbffb925548f388e47fdbc1a4c9a3816c5ccd2dc069ed2a72578bc2fa8c7df2ee76ebdb0008ba13dd3f45572c9c886ba2a74d9751a5d844c165f375844a9e5206a210659c76ae3f59f1804d275a359d4a97ad3f1e962af47c1d338bd31fc9cb9366d8a78497de82d62ea2b48bd488435e230040685c9cf82815313a87007e343286fded07f6108dc2fd45dc4dacaa7668b2a749a5c5f49c2295913f00bb391770a3de0afb2ab179d01acbf1e77cecd4d34802d96124cc70996fb14d6c5d08e1cb8aaab540ffd4b8eb42890aa3cc97f72a9a5aa68623a396e22acebf32e8202f6fcee0b36dc527f92ed6a30b6baf9b4e2d79f06d372ca06c27b303dcd01ad262623c71073691e3ae18b121d1aca717a465012ad293d5ee0659c36ee9595d19fb92103eb8b9eca8c2507f9509ea4e7d33bb74cf6fe0a17ad2811f2f07d466309931e240ad32ffaadd15d0ab3e5add82220090f", "535252", 2, -1720568688, "f6eb585a70ef0dbd8fb60db9cb5ec75c9149f8a34e9e925ea9a0e6b0f8c4ae39"], - ["030000807082c40304db4c192cb209161469da9cc9ea6b01b6c0c3c257638dda004735e4694af1c5f100000000066a6565656a658a244e940fcf44bce30801417c92e6113f18fa17dc3b4d48e8d9bfde845c1e5004f10b41010000000800526a53536a006affffffff22ef4705b82b684009c1543b4c66b39d5a8502f2e3f848999c5cc81ccba62e60010000000953ac63acac65ac6a53ffffffff4375b5c033d8e44a626e208a29278aa48116051a9e226cda8e8863b53c06830702000000036a0063ffffffff01e77f2d000000000006656352526aac0e10992acfe208f00300000000000000005cddde020000000011ca5d44028b6ddd36a3d7389bd32369f64aa628867104cebc37a2a1f1a5ca7ff4b8db40e0e79a48fef4d5bcf8e79204444918a498cedfeb5ebe814b374eb62b58e8d1ed8fb81985622ea73b83b71ea75435af8bedc9c95ebf8ce4473cb65063000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008e2a5c84ffbeffdc9e5d3e7d5c19eff26ec600bdf0b7f0879ef7523de48c039b91ccdb3b58f74dce2c02728c27bab675b1f9eba1c32598cd6d0dc92dacde05eeecb6c82dc76373642da86af1852445e4aae7c6972ff1b6f566857379bec7baad66f5b1540d9d8816b33937e939d48f60dbfbbb194d290789e6c5a6805aa23e7b0329afc81aedb28b640cd2b4930e0fac290ff7179a2da8a57a0fa8dfcc3820e7a00326816814ca2c989f0d6560dcd60a459ce0f1a4d33087f7bec9b2820d86ffe9980b03fbcd90a830e4944a834b4935ec1c6785998e4c6e7cafdadea50b4e33362f9fb195834221d0d75aae4aa775a43d3c997aafaaa04df06a999eb59943d9498df5021859a2382dd39c7fc0d668b9a7f06734ab1d2cb4a817bf41ca86adc9f39d140903238b6843dde58b9da6ba32cc07023ad0d4cad51d153376fa69108741eba5db9b031bcce773eb96725edcef3aa0c455b57000e774c5f277fe52f6598ea2311e89de032c1e644500088c33fd263e3e825dd4f70d4e85a216eb55b4cae683f06755bda7031a49c1a5ee02df894d9de2c042dfcbe5418c56b8aea8af857e99226ba3b7ff589a7fc33ba18e7d21e55402e7d239d713f77b90919904c2fc6d2c87b83dc78d13f0958fba50d5174154edcc9246b31236d2477e878adbef8e7134bd20ec6ef5054559249e1d1f6425349a4f406e0dbe2540626b4adc5faeb9fe6e77be71bf3bc089fe395436b00d1ebdce72eb5397c70264fd47d3052ff9b6c9651416fefc54fe73e6f0d30cf0813bc2a499f09a82bafd62a96625bf89c1ae4fcea6440dd27425f8cd929c3516588b79cc12cfb9b1c6e52d7fe1a9a24513b09381ecc8e2167dd5aa1103846bedc63a5190addec2b7ef629b2bef15c5b531aa2b38fa5a186124627b1ec8570793c9f065474aabe4fe4d79fe84d7a9685b44e9938c5a9ad003feb7e56eb555f15480eaf9e6e2a043386f3cc6dff11876a6451560079df0a9b7bacc6c45ef67398812e00566c8e1816ab74e739712f99a7c2998268a5056f0af6a5063323563a17735fe1d7568c7442fbf18d394a1f8fd2e112a636dbef6cc5a3085b8c4a205bef7883364fae8246b565bbd38dfc6dc5fb4038fa4160e16ad0e295f4ccbc3a3ea1f16e782870f7ab9d4c7b3b9943a93bf21a9022c0e2f0d00f62de2db67d11ac18e1bd6a55049908e5bdb3021b4fe0626150bde210fe9c9080092620a4ba97072169b5c1983b2d4b1933b947317f31a7467714e0f9d90f7e3548ce9b9f5b5f57062def12822ed74295f50730e99c5fb103421f9146df460642c7c7a31176171618a582369445d291ec8e63e42f01724d1f978bf29d56c774ab28033d1cc2e285c10be1ec7bdde8593ac0ed2b0853a4eda82f873c8abee930a86286ca03b9d1c65d1a29800470bd399b680a362890690044a7e859ff543ceed5e410861b475b33e882d47db9b32384f28af22d23c153e24764019be8a31b8b87d6b444f487778ce2198a9a7cd0f83f3bc5dea681e5ffca9fdcd95e250db417031141f11203b4aaf00fea576416050c1a31a41eeebd95e18268a2885d8ad9511103233bc8e02e6bc8e65daf7222d35267939f6aecb9df069e787a6df7464ecbb1e60d9a614c9ad25200f03227192872cb0644116915d2f7bf3a67cf936492fafc112a03c975ee3086514ff3f8b00ed004621becba941677c486cc825187e3ef343d0d2e78bcce9e939b06ce6c9c505ad0d46bcf8b9a4196a96b8eda20d2995cb0f9ec49287d3abb48055c49db5b65e4b709fca272fe27bf6f124c2dd4fb2494aca6bc31d966fc246fa9a4f4895bea4cc35a9c0e3beeb23009166881a573810422109938288022bfc03eed22660bd6ad9146e1d269da20ba9adda03dccfa959d7347aacefb21ee448ed75b9c49fe4be1ff1a264e643ca891b5cd666016a48fe918155919301bf9fc028d36ec5b67e0540335da47105d769cbef61f06c5db56658f2ef850d239bb6ed944be7eb5c5de4a26c39d978396e64b17ffd5ccc1d941351006d881a13ca2d319f628240d413a6f78735d6e4b8ee42e6d8cb3bf8415707711fc1dae43846a05ec0f15db17812462e94000578bc0c6151be97165d11a6d210c6cb106e76a2d7cf013289998804c47189b4bd4c6a6021f0ebf075d6a8f49bff1a537cfe6a5670b95f0043cdab95c33a09ff08eaac84a7be0270abfc114a8cdef0ea5fe94122e1047479bc56fec399fe80589664583d97be5b2f76fcf71f44219f0b12ae142a7b5f53621ae381510a13e5b803c4929b8edf00000000000000000000000000cf93bf29b9e0cba9b07e3649ba67363416403f4ab2f9cedb56f7a0df363bfa2f692af4794f2ff02643210a3286aa810eec1a46ffdaa55a28ac709b7f921fac2ff5658230a064a3fa19872b572de14a65541d2cefe9493c456dfddb50d1f337ef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f044b752bee56c9071effa5b9282d041211dc5165085a4fb70116df2b14dce65459075ca62dd7448eb9a9b71bda1dce2cd0973976e91f940c2f6f79fed8c5e2a8aa5edbccb04235de47b391e80747ec7b85594c87ff349269b11c345ec3961ea33d24bd837ef4e4c83f022d56f20c65cf426b82a8ff9395e20342c551166b8cf030c54567159ab13028500fdc4981a1d599e0d3e990596a1eb1642c00d751ccb440318f58bbe7e5d3bf1dbf50344e359833f6a527a6e9f841945f9b4bb775b13351f0a017f38ff3747ec350302bb4c243115235fb43fdb8ed72ca221cf8126d3c080819622bd7524f4d8e3d9ba02d62c284c4b2f5255c3528ceb41ace71f93176de11d032253c7bfc4b9da612f72d7b2752f35f4c9771f8e45f1d2348e313e6843bc44d1022773a4c82fba7533df7186aee4969a9b3a715acb1967c980c52066dc8c802d3403266d3e01e8b1b904f299731f67c5b1c5cf6fda9abe1e4ed92ee5ec93da49beb80324f472f0f22aa61b043a03ff3bf2a312e2b7711fe7b0789b2b7387bd8df41409030b2cced06b53bde451da404d3d1434e643e02bcf7c40aae17adde4e8165e19803175648ce607321e40499ac136c48aaf8090eefcc7ab204ec59b6153668149a1357e3968b5a88a87fae2ff088b296d5f2ba8c99ea00289e438e7b0b19eea791ee1acf35631c84cce1afc920704ca7bd54432bdf9cd33acc25d8059f2ffea64bb8d3711843586d2c7dfb23a15a4de7ebf42567d3f893ae1055741dad689911830651cfd84bad5f19ec0239fb0d9133c358f88a1a8b9a451c3f9304e2897fbdec8e956f75bc3148ff223bdc8d388b704922f3457029731b74dcbdf45dc62c1f01bee88c7a604acb04be5fd29c4ec42d6518b636a9fd40ab4c368c3a29cfc30cf764ddb22239eeb47801a39af2b23b53caed88ad3c54db087f125d83554cae4f1eb4dfcca2f43588f3972be022ba557c6db9350c6fffef7642a3564841fc567ad5562cf352d703d01e82fda9659b8527ec5bd8fc9a11c43209e16c88d7729079930ee25b441463a6afff3232f7d088d3df7e0d4e9293faa56e69a46562b6a9210b2ab50d1336efb6653befb257801877bd15846657df7235aef88880c623c57338b22b2589538a91c3df3a91f9dc76828b8e60c6b7baf2c529d2eef54e8c2ce657d45e262f272fdbce1aabb4ade7ca93cd40f3be3c27445ff42fca620908d8ee327f1dd89b18fc4d8d1eb13323a4cbcbbbfa6ec958053eef1aad958912b4adf5999013f0aa2d48627d4725b23b0ea21fba03da8a53b7fc432d7e8a954f519b94dadd15693f08e37af41c1bb062369332098c15c06bd4db826b62ff8e0f91f7f9d18aadcd809bad1efa5103cef960e433f910dda92829a0f6add2de32a4b6ea6e6dac63e2011d5d0935fbbb343bf5ac8adc32ad7aa46799c7c1e5877fc850602807417e6bc9cfd3dcd8515b1fe2730f13d23a6b52246a844c499dab275d36b26ae329258e6516d0d23149ee89ac87594153ccff0fdb1e3db3bffc65e69d43ebfdb9e3d1df949557e7ee5df8cf422790bc379c83034a932abb4b02fcf2a7b1c0d332200acc5c1ab33728820b05c402604386fb3a4142326bb5b24092538b8fdec91af181b6536085341db43e399d62daa87612c36ade7b2160a5dc1a2ef717743b28eee31151c77322522e873a712020683735f82ebd5501fa2de519cd53ee68dbae4cbf9b26ee79a688c127702e0233a848747d1b92a0e5af8c7dce2641aef8564b15ed2ec72f3dcb145d6ae1e51a230c5eb60ebbb5e70ce165eed06884e1d7379c10cb7176b53d4991d46d4ddc33bd1e2a8d0dd1209f43ad3f2c1a43bc0c220d90f617a8d641e4a8f5044219bd08d729f13a5871c75d1da74e3b2e898d1fa6fe01c492a0bfc1922bf821459f2c085c51de17a3c109fa065ca8a4378ee8f064d0a9a9982cc84458895c7481ec3dd8ccd354dfd59182f153da661f0eb139ca1b3cea024ce8b59e88382778375ca2db9f0d60e793caea5f35ee665b11c946d9f38585992d61de76a139c166f77950ab9468eb6be91be1c891d08673dd11e01b5ab02a9a6e3ea9132bebcbc35e8fb77929f723e6d0ed6e6ad5e1674578ea708ec27b04196eaeb7d811acc9fae96aeb1bd9490049d84f3756f74335a1df75aa0dd8e6d88a3de5fa83f56ef7bcdec7f58fd57660104a9b9ad452cbe0795438c32549b1b5041f699a2d9b3b1f40ef295f2a86f953a93b1ac08c44e1af4092e6ae5b9a97a632013dff2d3c496d391b98d3c9a4d24a6008a7cbf6204000000000000000000000000f1a3363fd47a0145102430a9add0c510a4631cf938e2d6e17546a92aa32906a692bd8971ec40ce1466d76877091dac530b7e9c6ee22c3a6b2bf4a11f2f04fa8369b5f842fa6cc31109a4376ffff4bf66acfd96a49444eee7fc9644f2cf4b46c2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007204f117fedd4215022ce17ef4e64a61ed8e6ee722fc71437161e16654e30d096d2faa957bd936ce69ecc06626c5b64f404daf65d712dec93a8c4653868f952f65941befbbf214daa785bc67dad3499bda16e4a65d7fb07b36a1de7e543879d51ca649e0e0bfd96103bb77b159a8e7a363837f1aff7ce749c82042996ec9d0140210b6dd0549126d8d88197ba28f085db2cceeca5cf293d9bf011dbfafaa1565b90229921b4899eadc2390cd4d2bc966d40dcbc6b17628c47ef24a2a590c44fed9720b0491bfef8de7d0b4208db0d0ed0d3eaf9704276545c223b4f286167d47a31affefca2162791f2200e8ea436570a78d7ddf665fda6b0e84052d6b95cd09e21da20307ffaa2a8b6fa31c9e8ee6862a81fba28edbe6601cba735ff7eda360ee777d6f02223f5f36b81a4e2a1a6eeb5466e63b13616a6744397637ca24d9e461e20a8ea5032e0ffb3bf79326ab62e596fc7072b9e9984c80916ff71584ebe2860464f4ff5a022e793e9b8978e2bb2b76de61ee71ca4061577fa831db4a0aedbac20e2962982a02078bec99dfd69f4431c9f1059ea3fd83bee60aad290b5ee776a3ce0fa27223f5ce8d830f302d4bf3c1e745cc9b814f14a56504fcc7917a7c7da509bd98b755fb60312ae62050b919d01f52109b19d1b8df65f13f8c5144ecfa11b70c3a96ba691fb53a2e984b29b3996306b176858d416b20d90a894afc64ab083cd423cce4807aecf176bfdaf6bd63398bc80fa3503171c4f96174d05a48c13ce0e5a8cd0bf21b9705d821c92dc1bb849e4063a8067c7fdf97cecc07fc963f73c6bcff6f5fb7fba8280d3da544f073452fd3d2aab877a91d5fa9e6ccab2b3dade4e5fb391dbea29ca6be1f16812c55cebe6472e43f3bf35fdda290c058b864828f3fa3286549feaa64d1760ca7379e6c914d8865efad6402f9dbb01b0c49664bea3977e0735787f2616c1746d52af520c09ee457e5be6a13da27322743647fd8b65ce2cf625607a80621506853e1a4d33fda8cc342bfdf014d2a0d867dda789c495394f892e013b5525823785a38218544c35ed1801399ed6a86e5bac50e804b52250aa275c0bf2ee1e9d286000d3b7106f28f5f1d079666f2249e8be23cd5bf4836c13477b0b01b7a90fdf06600d80fb006442faa847e3dfe43c014681ebcc0b72ee1f892274e52933bcb3ee682936e4602d5be414ce2e0fb5083d6acf575b37487e8e507caa9358b8ad1ae50a1b3a171adc445e9d2416bbc8bc15714d1e0d1dbe60cb0e92bb4790ea9e2197ffd117ca5ebfd1c88eb3c04273e0fe3ec446449c477b2d81c69d0b97570703aa04837b714291aa85e6cdbd1bc2569a3dedad78d7e4c10d735f41853952dd7a7391de52a6ef33d996400b9ded7a24577fcab047ac7fc1c11d499dd8d382017fa1dd964a05e71b14a76d149fa69285b917dc9de9b1784fcdaf107e58d39e5db251f6b8e67360e58dc1c34aff56f32e6050c90447eefa07a51d17d51893c308ce7596cb97899fe9a78573e6876139f7d975d3961f5231e1f68832d3ca7f33a508b7f7435f52472b3115d726ee6eddb17262091fba1abdc82792128fa895a52782f40e3c10fd3339ca044198885c4d325185d7af1f02ba34fd7e2025763f05159aa5ea6f354b8f3d747264a3bb464761d55e3a967fec1a050167589858560390e62907789a0ad9197d2939f7b7096833591f219526da32ef7ac0a8790598f59eade85b0c77cc4a54d8157837c7a7d2abce9474fd3c41dd977c353011eac6c8a9050ebcc66b149a6883e07f920625d41eaf954c17377bf6b744197638cc456c2b28c776d2918dacb9747f783540a882cdbc772de42c7be75b289593488d1293a73acd94fe39fd02640abe0bfb835b1d59fd552d97eaac356b292b908e2498efca809aa237b9d3622a98efb0fcc2c6d24d5f22d172891b03ac8ca0522b984cb1c2b7275470ef1679d9229a0f3a70f5d3e00d8f75a376c3fdd2ad895e1d007b806c19f1920699430aaff6b3287edd68aebcd768cc21cbf065ea4bad0c1632f570195c44bb9017a7c882abc9d1f2db772543ec9acc6f61a8657ff63e6849597a494b69848922ed8dd0895db3df72c725574126037ed4e358b6eeee424afcdb59b480bce7ef8cf549c3307c2de6fa422d959bb7afcedf040d55a2d5a873256c67f444c668487f89ef6b6803c96942a24aeb2e74b6ba793ad28b0ffe92fbd8011d861ea800b858b309a765712e071136891f92b6a5af806e10d52d73224298c22cc11a19de7fd58daa26eec5e0b325993e9498c76023e85d0e9772cfab7bad7929d89a9e0c0cf83a0a5b23d7a5b62fa1c02d078f34a454df32f18e31b1f8ab162ff5017f1e2d9ba3084318dfbab6cca0ad21b1d5ea9d19f0855436eae0591bf4c5ba8a3f5e6dec1f1a2525d5fad43c304", "51516a6a635363", 3, -571507266, "536670068a7e4da08f05ffa9db4c89e1e3951a1695dc2b9737e1b09fe45afc5f"], - ["1a79a5270344e502321b45267ad7068ee37364b8fc9ea27cfd9f5e1c5374f85fdc7e0ee0230200000004ac650053075ff27403d122175f197f485394d66acde2b2f82afc03bc56d0791cdf4df2bd26af74c902000000055251525151dc2ec7009ffe70fb8af2828825ec9c24032acc42eaea3596c0cd74b7f8ae2ed84c63e8d4010000000251acbf6c5da8011cc47104000000000053398cfb013efbdb03000000000000000000000000ea028dc19d03ceb62bca25d58e3eba99f5e8b1ce2e3846b284de1af4e1063b19a3ba49693ad54317ac2ca13d3ff0712d6ac663b497e02d90c20244ca95b7bc14b36ad7a12b703798449ff5a0936de0948e881ca5e0611910b243c56775e5bd2e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007bc20223348d3f54779c0577575fba11f1be75be90eb58bb710bc23c0a78d00a3cce66eb5563dba0bd0a3f343f86cc581693dfa609f26b97b17fafa8b35ec030432acd036f7825b1a32cdd6757330cf8259882ffc75d7eb1dec0d2da91cf83453bc859cd0029c52b09a5555c3adbe6fd5569b265feaf1fb5dd5ff5437d364bd60325807c9d6dba099700ac0c6d26637889c8046b4a5c671ea69c8c88592d7f1fcd030d186f6b1a4f9d44cb822eb5d2922ce7eb109b93a8330c0c917a0a3987b1c7940b087da52b32f2b0f72a60f37ee9ad366df3e26647641142f3979062d2093ad99a6c908835c67c56aca30a36959a7047c5dc0ce38c0588918734927183d66e1ee40214d1fc06aa092c725eff99f5784dd6d7a239f751a16c21989c4bb6093aab2ed4030dc2dba53bd6c30ed2d3a0d94665be143d8e560560e4e041630cb2a151dbe024032d57bd376b34bc4ead865238fb1743d16e49c9c98f17e9a73b692ea1bdbf9fad0325d12c27015c371a5d1f14b1703690f30d5c7230065cfb8ad8fbf4b5ea943ca303066c9fb056f46189ffde3b4396dc41de2c2681ce5cd01681885924c66159cb14464ac9d0a9d4ccecb37a48d56e72d6a8063df200819df7a2a40072b1f001dae3b4ef94aee59e4dbd3555ee0d10a3e1fd46060c76062080450e0b4b506246e16f9d9a43562fdb016fca6b046d7415d6b8f8ceb8da67ee98932df6a16546e4601b7424faed89a8ffc3d66bb80e6d2ce7ae84f905463011d579f8e8379720983d9e51142223ca0ce0c7e60c6083d0229af1051c261d9b21e69ed86f7763d5f6fadc401f4a5b16b9c7dd5f7b1e89d03ecb310c1fa9ab6de1d37e88d59f3de998c18a79406c15d6d7b7ddbb1b40d4ffa30bec883a264162c75e2814d6262f89d617637d3f9c8f3b1f744e4bfa0c3d254b862850786d0239b8563a1cfde5ad0ca5e7214ed64584a3881a080466a9fd41eb724ea31799338ee14a7ec5caad2a3ab4b52f7da3ba0b5d07c4a6e2ab0cc42b3b38b46be3356a8f1526b2960bab12256581f007186816e18da95138a0d98439bb93c2f08f16dd4c7b663b93b85eaf43dc0c95b423f65aa0be95247eb1b4119270d9275420bf83d258663c533ab63e3c7039afb5731da41406e7b670043dce6f00e30fc308eded1a88fb8c73c595f1d2edbbc346ab9a0238cbfa8f192216005728625ea523eba03f711593f725d3f25c1c381fd6003e5bb9d2b861fd27832fd14e03d4abd465b9751d31c4d8ba53aca86d657d1496fc59c11612b64aedb3d49c44e88a5ad4b2e23711ac369c6bffb28cab4fb9e0edd65c41df8ce52c1ce9fe66ca913c858c1487c08f90696e413c449252b4935dc7736d5d66de450447b0652121c6379afc3d5e2713cbaa918e6d275f67ed4a1f7a476f92d0bd6616a27a3f754ca272994d518637db3495ae033986875e36fae5b5e611fe0cc6d5a1814dce3ba4326464c226e20e93aac503b2cfeb0d15bcd0812c6f379b732c9885c4d40b23ccdd6774698c40f0866964733f158c4cfccc00ff0f373f9689aa613cf5176ed3fb8c69d6f55bf4e1e2e45d3ea79b41271ec2bc3ce6fe65c1939ad4e94922e4892fcdc72fa9d6d192f6becb5522692bb52c6f650e41bba5dfb9800fe017b5cbde55cd2b3c6f45f9f8fcb1dcc9557b463c5ea4128fc11f138872beb8f2b2c0025b84532a871469f7cf3899a5eb88617e2cd5912b6c81fe89effa6e871a18f1d4dae8cadc6ba78076d75a868a8ab9b3f8d9076e84f0825b35907be070d17eb1fdac7ef1e863cd7cecaa23f9667bf301c505efa4b21f5b2d8fc8fb0de44c5392283fbd96d6d886d458250ca79d021cc87dcc9282e38a88a7f33117a014f34c998550e3c55b52ab2f604f410d2d99839c38c6da76a3f97ec289dbe3959a0d2287a4159926c8367b24657e27eb559ddb8090145547dadde43a73448389d6c00803c8871402a026753d1de4c3598ef76c1aa516406db6a903a9af0c43349505532475b947411e1e5a6afc7d0d7f193d62f388cbe287510859ed8820b59251778c798f173edf2a69398b7dd53e6c4c5298f897a28adc184cf7401ceb257e8519dbcecff33301c53e67cc28b9b0150310ba5c22251e5c005dbc8fa84fa0d97a50c849c954a02384850d39494bec955da28c989de877853ecef4a730274dfa714a019bef8ff926cbf8a1d16118f5d1b8189121fcbb9999b5f8638175bf87e0629ed0840db20eea3f0999d878d0c100665fb705280749ab1e3166945914f45415acdf593bb3f05078e2722b9dddbfcae3e8cb0b48e86d159b08fa290872531cf9e7f5f7b1cca2940830c2ab655da394038a4b30c531c8a2e7eafd55caf03b3f5cb516ff9aeb9f3a80c0088831626f96435ddc5b8a1e287d39b906f6aaf28460ad0f5da7bf70e8d00d8805", "ac006a53005300", 1, -610973897, "81768fda5166c59576653a2d18203a8a0e1603cf1ea9eb6bc9cd26e3614d319b"], - ["1df84b39011d81c7c81b9125843fabaff2b420b6ec6dd82973481203506b95c933fcd56d1b000000000665006a6a6a527579a56704f71bcc0300000000015201ebe30400000000016531a6d8010000000002ac537a74570000000000040065ac0075569b780100000000000000009938a1040000000028efafd58dd785e0ad377ff8c045cc1e8792207d14fe7bcfb767d16e9fec5f23b3253d8bff87e3f0a960d07065284e50424c97c0e40f04b037119c93e583f75e695f5f3ab7e4bde6342f3b7a060db510077e33ee0337c65719221c6f38923fd300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e52ecb2390e5d375b1ef850ea69eadb95d3b90f33ec7b9954a014e843bb9ed388ca02bb82e6fa4e7aa3172ab8d7bba7d58e334197774cf6d2e23c372b13508f3fd596f20d37b77c4670c8a3f074aec3657746045c17ff120926ab0d7a8e3df761ffe72ae1602cf8d221707892fade7fce2327020bf9f11dcfe2556ccca6f8ff70327248d22a1f91c684b6aaf28654bb0710229584e2f6e82f81d043f15d931de5b031739c142321f5433b8fe18e8601fa3656cd29bf477d700e49607d0c2cea662950b03bb4bddba1d7af9a5faef9bac8d7cd34894ef743645e5274bb53e544f2bb4ed45f1058d4bbbcd9e01e1fd21630487629bd0a0825a66451aa4608ae40d329c16030820b5177c25b4a7dfaef289cbde5b78e90126d1faca3c58f68a468020bdb9cc0322851df6e6790b3d6184cea06377e87fe4b4e7c5f578d9c9518bc36df06595ac0222855cc03f66303039e83a48e3ad118b78421a8e4c1efeecfc93895fccd44c1e022307dd6333bc0bb129823373844710ff7832c6f1efbfe9ac984768b866f105140207a685d5f1afd97606bcb8a0dc4fdacc995522374da77b2f9bf4890acc99fca082a5760877831a12058b195b5d228082c1facee0ea8cf023f30cb85184486a69558fc1a8bfd5569289ea9a5af1ea2e5848b23e57ac71a91463700856d198d40f665e9af03eaaf4f177ef6713bea2800704f92ba1646ad4004c2ae7ec817217d99547b3502bc48dc34f22f0c2711ebf3b422e0601b0a2ed36fe2e22c06cfbe15dfd01970a2dcafb89fde7f317c93388fa551bec4d5c3770bdbc36de89b8ddcac5d54c269e364890138d1f46b49ca6426db6b0b069710e06ffae8521697392d7b5c570cd544777dcfe5fe9658dd3dc3a89744d7990cb694318c6bbd67b461db4e53b7a12ca312a03507ca0052bb1bbd703b6d402884278f02f247b357f2d613100b124e39381ff44c8d238c9063ed4b9aac06449e48dfc668990ca90cd89dbea9b1b09475299946e193f89348279c5d142d02a251614428d1064cef9ab48d8e3113aac356d58a4774fd9dd984180ca36d8d642334a7da7d78eb7459196afb4e401488f3dec4cc5b4035b318a4690112fe11ab14f0f246d0d8e747bd6ba683cbeb668d5588f185de4127d80e12a931f7d0a98a4cb38bc18845144786775360461a80732a4203100bc58d7f63c546156fb394111544bfc01a1c339100c9da14e59a4688098a4bec2ba25323016fa1a7f0b2ea1d1f485a0c0f6b0dcaef5840317b96782827b7755c3aef360d7844e2fa50a2a76c2256adfed8fb868cb9700b332c6c6c96110802ed492a3da9031a03a9c41a957592c94c96f49d92767b60eb833bf19c2c2907a064eb4a359b5a5439166b171cd8accee740beff9b300d1c31c0d3fd262cebbde5b1c82054c1a296bff670b24898270c1c3e44773aa74c28ea5cf8cc5a0a3266546f7a07cd09131776d877902374e185d1281e55b64145b5f0dc8a0e93301142c40937b50ea256259364291f81bea859deb4203791be5c9883eae2deff1803129dd22b644b66ddd133a95d4393544750e28a5d268ef5363b13f8085b6dae8a2ed385a70fe029e34383bf56eb48cce2704576f44d3e62bc07f1912c9e19b4346f6dab22e741571b84b10e269cfe1267d403ed690bb5fe2679e30770a431116259c444d7a0791f09fcc30a625523fdf4f3007070f44828fed3bc19e8952cf4753f66f523214222147e00fc7e9ce17f7ba3f2e8f83a83319ecee89e8c146aa1423ea4345bf77142232c6adbd9499c755ad7acd0672b380e706b6ecff25a18f8ab937856569a6489a494089864a97317c8caa8a5efe0ef88ad8fede57317eaae8370459f36f275ad7045e21cd47837fa72706dd431056ff30db90b7e41d66f207bebb083c7d2db2c4c495ddd72f75456c58d10d0dc46f62b8dc507860060425adc9f2dd8870478b285e6e54195cab412ef65259529bbc13f3250c0541b5d86bf79d37325dd7ecd123c1799d62f2b07721aa3c43fc754d28859b2b29cfffef9a6097dd72e56705096df54a72427d7d125d9a1b162d09283a408c0d7c05ce0ed2f46d831bf0cfaf7dc0cc5c709136e2c713adf66f221a2d40e680feec877fd84cfaaf20bf5d251534cae278ac17b8b92de918485f073a7490432c7239cc2f35873ba6f4f02f87a4dcf59f4726eaf20c876515f2a5bb821d7046a427f353cf0553f852b75d7f030fb427d4c88a0fb85ca745de7dc91a3c31fcaeb0b15edb7f8c85be7af45d0ddfdcc76bb576f6087fb9c4f1258e780273325102e9038369c5e1751c3ffd82f67daffd759e5aa4fbd1c393e271c73c1727897a987ffcbd2f3393c4e1e3153ffb506f38567ce8c99c29898b902523246b41ec94e8418f22529cb7cb923bd55982073155ec1499213c2d276100", "53ac6a53ac656300ac", 0, -748397502, "e9f38761325905fa74d3c8df0a4d3807dbc0b21667e0e745dba6bdd75d9b87ad"], - ["030000807082c403014b1c03f9d6bd384a4697794f937201648b259a0c1b89679e6b7112ef158947b7010000000153ffffffff03cd3d630100000000020063d45ee3000000000008acac51ac6a52005210929902000000000465656552000000000000000000", "6553ac00ac52636551", 0, -118115006, "47ec36bbf6c570fbc881708919817f87a7f7a3be7fd783de774e1f59f127ec26"], - ["f063692101f2199272f96b8e77687af682508875d5457e755fd5219056f8f2b2dd0a679bf002000000036a5251b86db3e203c9183e030000000007636a006a006365d08cb8000000000002516ac883da000000000008516a6353526a530000000000011f7547030000000000000000000000002dcb8c6ff6b53afc42015c7e83eef170b8ab7b4ff2b29ccb645f2daa9aced516ada7b114c54edd6222948445c2304e89adb58b0768e68e34bd22a30a9f7e5ac1e7eb273df33464a6017e8adec7ee89d159b55408f9ee43bf1975b3ac567fe1540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030e54e685fb71cdd79acd10096da8065d4871edce0f14254de1f98e5dd611036a41dc13502eb774bfc2f0c9fec6d3d0f2af7aaeb5e021b91e502df5df9af94cf075c2837331dacce18b7392238f471f8e5fd3ce3175f93e716b05e5c14392b6295c1f2139e545bfad5d4ea73105f10849195c8613e022252635032c8a9831c92022c6cae949e7270eddc26e39a0a66564ed7666aeec7ce1a12797df963c985482f03234b8e5c469cd95d134c14b6010216699f27d429ff2fae280a2b36a6b341b3990b062df1619986f8aeac14333c3cf1af4e0242ac5a377966ab92c8f453cf7a894762e0c5f12eddb665abc1c13af0d45d991f214027942fa94f1785791e59d2770a030707dd35feb485c0d0b55d65e95571774082f85094b7d6559af4f8cdff4a022b02246bcd0588421b028d31cf0b9693458f78dbea9e4570be4c29917f6435444260032839c0ed69b1a6352c48f58f472e414133d2a97c8951e246c69398b928acc9b0031add4c9b687703614ac695b02ac55c3662e607053fc0560450f9b11b3315b613020cd48ca68b6c9ec8827acd66e4c7b835b3c9cbc2c647758adf73bc47fbf42df14f4592c8f6b23f618c5205eb5bfb5cee1188bae7a9ea8f7a4965f5f8e68d6350d6910e3b84e716e1d195f6941fca863e731c8164934b993be00c240aef122d9782df9ce607675a7bf0fac95c3eb75c64e7a0524b61d2f19321919b1b180cdb445902c84978e8ec4b8a3f0c78454e3925438ba3f7d29df302d9bf8121dfe343c312944449b77fa0467c835d663a0b1077492b466eaf389aabaf9efa159f728791af947b27eb579859749119a141eb4b6de7f6d2de0b14f38a967b25fb73553d397b7fd44247a090c923bae4e1008a88b1fb2bf971d77a76d7e6022a6be71a81ab7b9a3f1eb6374860122572fa8ef368351c8c0b63151ff6c883d817671d5c557cb66842501a13e6d496f1d4a201bf31b94bd27e9fbe86ca602f8627b4cb0ed0140d1b08a7e464a36e0bfed88aac2b753322a6090371fadc1f624dd564c31bdfd1e18e3242288651356e1818b69a1b958e6b9f0fd2f3ef495bd98105b862dd6f6592b47de5a4969a3d911683f316fbc0714e50592ae0132b792548c5df2f15f3c16f9b342ac455fc59c00d5939658ad526afc925ea80e711f5dad5a1ef54e7f9df87ca519f67b604225beed7efe9f4d7d1ac6408f323355536aeeaa259ac4d868fa149433ef7b8ba896c8bf48035ab1f1cd715d1d1d4e435f23e639bb91058c46aba96feab797a2ecf84028b9afdec3a0047a86d5d43bd22c3c12af3f9e3bf51412fb474445f0143f9306b42ead51c6bc2c9265668efe6fc877107e903ef01c2fe09897f78af7ae4a8bf81a06142c10ab3082d9bf62bade097d296bc1e5d803a9c5936831e7cc024c04e0e2a49c9728bc00e08efee7c596736db84781ff7315ca45912928ed95ede2bb4bbb0c700c735e290e3e1289ace0113af2b4b42c27ee2542dd0f53558bc8e5c8ff2fac6eac7c7c8d196fd5b6f6db706e37fbbc46c3ee4074329d5d2dbbc01387398c6d64073ce1dc167dbb4a4ecddd990f67e35c58886ae2e74a4eedbae7d148d7866cb2d98a3193fec9051df90997788db68dc8780e0c5c062c87bd70800bf81a15f84391296a47a7171699508e6e12820d55752d680077378e554709872e2ff53377375de9a93ca614ba05b987c5b4a1a7126194e2f9a5fc038d9cf3c5dc383cf373918a18932c88dba4fe8207e562215ffe5c6588dfaa41702c2f99f90a1ebeefb661a1da8e41f935218c82377c59d63b6bf364a67c607c325fcfa03886113019ee70ec3d68617b424cc881f65f666d8a5f02ebee89162a4968b2a05747fbb677e3faea737bb1c823e153d942b258c9e913fdce10274e55d4570750d8d3527db072a260b33cfa69367a789ff0d97853b05c9df16060a048b76995e8a839d6fc2fb663e1b698895d61f92e5b7e34fd7830a0b8aae95fb91cc4739c1904aa08ae49bc73ae4ce54ffb2b95c6ee81871e091815940b7ee9e6e53c53e28fe1dfc039749fe538fbebcfa89c8bdae84e8f6956b8a9c55d0aed418f2109e44004b4cb459e1b5da5ea28bf851b7301d09512a58f01d0bc0035852847294eba588e0c8dbce55bc9fd7aa84e0a39347ba1304ebe4ef8734035b72cf5b79a9a6ddaa2cb353970f033214e6850aedad38fa8aaf984ea4856050b4ab831d2a983e7f4edf193de8d9b67fe38d899eb065aa75012eb5b26e33be143ec6d1c5d0bcd68c46ff0182be5dc67bb09c238301cf5206e273bb0dc36ca12baba1291f44a7b0d1d4f1a28d4fadb24cf75ae2e094919bf0aa1bd311975b9da5c13d1606005cdb24c30f633e4ffdee3f330d3a16470004eee60c4bd586505610bd96e554020e400ea5a0085686a201fe30166b6c07", "00655200ac535365", 0, -1150659085, "5abca6d21fdb7e8c451b7a48ba96daff2d47e0554a09992c2c86bc8cca400c6f"], - ["030000807082c4030315f0322c5c5133fb4680fc956ad2e04e297fa69d748d5ec5986d36bcf46eb0c502000000056552006aacbda687c241079af417dcce30242154c354ac4b8a4f5f42f6d7e777a188d77d5f62608e7a0300000002526affffffff0081ca782d5907279597a47be9de46105e8e8661a76c8cef068366d35576cc1601000000020000ffffffff01a9ed4c020000000002006a0000000045433aa802000000000000000096f0fc010000000052cd2b261d8b32f352d014f722c64752ebbb4a09bc95b0555e98d8c16e222521f5f95a690f29b60b83171bee10d0e73949dd03f9bae76003f73ecbdd874aa95cf0f03ea2e6e0e79f73cfa99d5787f770f52c0d458f4b8d3711d7337f2f74eb5a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000da72c16e22acf2eeea49bbb2ef3b1e1eda8c96587dfa2c2f565d9142311499b87cdfe168a5e86283fe6eae730baeb453edbfc1b36c09da1f6d6b3e9b571a90bc2c80c78198ad1ce44545d60fe839bc98c43d0271a039277d55faf7158cb9ad13220f27b5f70797c8f4fc28082a2a0f59812d09faaf91ab58c8e60ddd2de0076c0302e4ce62e7d7a56fbf864f5729030f083c57a5eb14c85a2be06277601a94660e0305e1b3cd99101fee5b4ff4834ff4cfc5c58af613b27ac9af571072f18b8ac3c30b02c97080288a1eb6957c71f7b08b5d3efbbff51a7ab1f30eacb3bb3043d584b5a76dd12d2484a3a9f33dddaab0d6f8ffb482ed3bc4e99e7c493e391451dbc95f0200e974176b928caf633b41642cf5ff29deb059ea7e680fe74244765007b0eb89020d412d6975ac1953ff8d6e00a1377456d75e0eb98986c4511d6fcf56dced1eb3031607d37cd3b4c7ece547b0406ea4cd7cebd31e43dd5930155347e93db4984e270314eaa5ec9c2b64f3d293aa8c716e4eb5507126d635b3c69bfcf127215833e8130329c0398913385ffa5cf656f5ac95facfe06348d6fc96974af9a2f779828204f5bcd85645b1c1b9ceaec6b7a8108baa927bdf8865bf75fcfe3ebffeebd67ab2f38ec898855a523bf9df1ef75626d5a84be78415446de2dc5a392b63f655f46d62fcc62750acc3525ebf294726820af2d2bfab22f0fd3e07f581caee8c1ac5bd4959af9a5514e7cfceee51dbf3863f22a026cb4fefc582d3b684f6b011883b82486ae9c8a127d93b8494cc66eb69b3573076a7827396d627dd7e37b62ac43cf2ef168859ef647b57873a6b18ac798c8ed6416acaffba2caa9bb589b74fd9d4639ac5e5d3e7996d81cadf512d5cf8cdd80fd025f47dc073600ae9252b707fc6bfc84561df261d94313b9010a31952c3e2adf13e25d545473794e44b30ebe449369ea82c93b0f7c948d9f14ccf688c796dcfdef1bc6f8241bad0cc102dcc67fff60876ebe662b6dac3344bdcb5aead67490e5462fb1e23f7d005433ccc654911efee7beac690805969d0a8e16bdcf1a37cbc570331b0407f79b85c85b1b87b9e11936cca547c2d68da8c4cf0de1f2d3fff03e5ec19bc8c41977eab8b09728156651f9c6bb4d786b52288d540081c6d5b8573bbd4c3d322aead62d5a5b3987c0897c001e0c429de8947fc17e29f8051aa69fd336085176a5660f79cf602dfd3e8118b75de240e1f007f47fca81f9504045d940e5b52126f3e51f365d1573b26db69edfdd49b2d7c89bb23ef20472c314acdec771d16ca18e2fda653afbff7a2acb1779eb5564467be7fe0a206ecd53aa3fd66eb7b3d07d43c78dd7ed7ebdecb09bde2ef4ae897d0d6ccdd36c85742abb95b8f5b8ed5a702fee095ea0c4d1e13e4fec16560ff44308e5e0dbcf1387c5f871152db1706d671490462581c6cb36b9a8dd966feb4a0f01852eae7e081806225c46222327e6c58ed82e830a2c59be66e225a5f4e372890d57317e7883e2b4670495d104e1de8d04152ab2e2e612cfc3a6c1c556b85d7a325797f94b1ad875069d1595adb04db4cef2ab976bdc917f0567c5ab3146873659800dd5f75860cebaf6d429c7119beaeb8cb6c04a9c6a3d2df377322d7c00346a20762106ed55b7599a15cf606b547232804e354544f629f4e8f5d63fb9a14872a6df1013fffde7ae6b9b277961b08ebdc0d9577657e1fb42df6e395687a7062eac359bc4b6967e46cc7fbfc09518286a532dccb1929156c13e0c46dd76b48fe43dcb16661cc19310d92091222b405b778eed95100e25734d79a6a57db775131a97dca41b6ec01dd963ce075b226aecdb94757c3fe008624209e21b1da7907838243e11fbcf2faedbb2eb3a89c858f48cff959703694288b0b361ca12a24cf209fdab02478d8223830f7de434ad34bc5ffe994d2b27a9ea8ca5ff513c4c6e73859e23482e28adf81db59affc2f9d34baa192aa751ddbdc2a01a4734cf3c7e22e7202796b8bd7b2b10a47e5e4b53cd0e78e86444b81ab0a0ad4dbddffbdba361d51b4b3a6b5dbba0ca68304f2a18f3b7017416ea55a1bb35cd03fc8a05f66ec0251a3ed9927e8480a723f1b189724576750a03677d284ed6f0bf882ed2534a6525da4f083fd2eadeb3add2831501ab55630aad22a640774191f89f3d52f165689d3e1bac33db1ff0a9ab458dab6ae1b0068c29054341e34056583a8186c87d419f92d9e204ec9de6bb0ee6f42941656d719c32f61e1d70c43e1623b9b7918df385624deeeb3f0a305019f6d54fe6d1362050000000000000000000000006276352b1bc3b1e4a258d1e66f7f6e2e7f6699fcc76d596871dd9b404a6d4e9b516c277543bceae10ae68513e7b893f6a505aee87e051306688849136d4804725521d7e4140c5d5144284ff1ab508f4947156bfa443713d32a683b81132ea47e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005e179345013363e137802330220b6bdad284027c901524ae79fdf933930d7d909628f0a8aff31cd562241f3702846a0e5f2e5a9f25a13456de615aedfed20c77ebefd023191731d4aecbb5d95dd6b98b662c905712909589b74fcf8a7f2a50f54d34c538a87600abcb56369c3f826ab290effcad9d9a71c787861777402afcac02103ea56a74f759dbc4c85e0887fbd70d6061750ae276fa782009a543ecae1532030fc6dfaa305e0ce874d85ace667151d02303ab187e2534ca86f6fdc78c79bc8b0a03100621b2ab5fa324da39661c41501d8ee8455e49d1d73118814d60fb7179d989e6593c3a6cac939c761f4fadaf50ee92bffa991292b632beddf66446e8ff8a032b79f518a969c5c4c8679c6861d331a1e96386bea8c9deed39251ee5c05932be020840faecf49f13692255b4f3c13f72a3a2543a2eeae008572c0222474ef74b8e020ea183dfca7963e5a46b3cecc051149b0a1998f63323a9c021c2f6da19c627a5031c6c52b56edc224de1aa0cc325a61263e9a9a2dcdf2e621ba5f74a6b2246b8bb02296f12c7a46cad9b813674472e132b310ea1f89aa84cffa3043c64a78a2ccadc60c60e416dace9755f076e8e3e2cd9577b49a35ac2db569266133ebf3cf8855bcc58237ee577617410139f46b481e184f31028dfd9e0993db2478dc4a718759fc08d7ecff8271118eca76d023511d831ada8321fac9beb7a43892c3835ce6b76ea55b409cfc5101b1d0fb518afe51a802d0b88779c162cf66e4c91c309e9dbc49476eb7f09b455713ab096170c77bfb164749c57c04b70a90bea1b44ecb906027679d63954551ede3b9cd4715bfdede08e5f7381e39d16dec15455f3ccb38abc55bc8f0bf6ca4d77db7c2348f2ed7cd279faf040cffa78a399d2934a27e5aa6f1e1a4e20ce6e7645e0515ebfbe2fc3cc72c7736f38706bcddaa3a33647c3838a2e2384c68e4b30f41630bb5ee621ce3f0fdc5707b6ba3935f43204ca52d8a9217b58a26ef97ff83707249c9ed0962e9d23a45aad53a541eb59767afa2206245ba501f3d4f37b0d4e3a8c1085526a5279aa97983d24662f93d18352ec2f786e864b816a8547f11a6fbf3969c4fc1791824c55470e688fa2330c7e0f1847aaa593b0d9956e25750e912c84585d36c5fc71aa093e032f7f71d4c6e7228eaac6e162ea2296f76250957a6179c843811ea6dc5c77bb05693b17f3b757645b3f6ca88ffab563906bd2ce46c3ce53bab7d5fa30b2ee993573a1771e79ee81b65fe75e19b4752f33e5b646692d5db94081766d7c2be346ae81ad727725dcb6c9b0f32f192d86432c10f306b9b6549850ff80d573ca35123f881f75ca10baf2a5bcf395284778687eec6cd4b65afe74ca6824bf6992be23905d0b4bbde18eadbf76297544048666ab6ff3d197c5c820ee3366787fd16b6c06d114e697f1a3392dc07d4397b645eb640592ac41a2e8511d536f8b4f6d3662caa0d90a3b47f687241cef6d23d182fc180f0b97bba95ab7e38b9f4c82d8c10ce5720b38714ef0b36cc98f5d52c8fb4df6ea6fc56fc74261f8cac0603135dc6b66357bd32c9b848100317930235c838387c820ee565faee3e9e0b45c970e460fa64ef6bde750f9992af89d4706cf4b400f8d4a441aa94243ea6ae7777b190db3c24ff3a435ec444e5c40b0a1978edcfdadcbb22c3b5f691acda64e191261f393b540deeb4cd5053fe9a3f2dcc53a06696d87ea482b4b3990098af0105caf33f0a823b32d61260d50594bb8aafb9080a1ba0c5499b99b2e1787dcb760efd4f69529d3b4635a7c423400b43de7b1b29a225ff296c38267a80033d073c853522af518faeae3f1b7276690813adfc81a1bf78ab463b5ef5955f024053efd6446c3b69565c642adf64a872cee608b13ff567835a5fca3db292268120cf1770e9c617f8a9e0353b6f39dfa01b781aaed18d4ee1d982bc5ad25970f22428817277fd588e74428e9a833d83080835805a66b41c06934595c1d5e04745608d6582b8a80d8114654f77bcc6729bf025e0f73fb27b0bb09f9dbbfa848e7d509d49d599e5761631dd4420233d2f5287516ba8f4baf0b7d11b6193c54cc86907605ffbb723746eb841c78bb0d6ad3e22aaa48a46088e19eef310b5563312d08828eff31d82f6c5f343c38c02addcd75d28b23a8dc1c242234d8985cd3ebcf666977131f814573d4b6b74c0b4e26ef5f5dc39004d6e610c2d30d634327b03547f67fea136e7ae001604872cec3a61935e713eb3cf143be517f9fa580d2fe9a229ab7236ff0f65f20ca400cefef9e5b6f4a12775876776cd8573b2e9297a0cd373881f72d969f57d117da35a6c06d9d92b7ed34d62c8a90a3b19c508b73a48e6bb3d5819ad658faff8533b0d739a0086558c4181b566b34d51c2bea40a78758ff1a5cec84fb08", "53", 2, 1471199915, "16cab4bc8fc1a3580232d1aa177c04c285674235a2716093b1b2e7e91df51a79"], - ["030000807082c403046d45b48f7d1512d7437eb9ad31c907bf1874b6c47d8a241e947002f4390c9c5900000000036aac511b24e1daf0d75fc53fd1a43b3991723f3bc5a5f80decf95619cfffc39fbd8e8f691e19d601000000035152acec248673d6b64f5cabeb29969ac0b69d2e2b92cdfdd11253326fcce803522d49add67745010000000763535263536552ffffffff5565504e46f3b892f54881f516d7d3f8ed25cf28373e76a2b96823402acc9446020000000253634c9cba2b016f8c0301000000000252522d00aa8300000000030000000000000000570fbf0300000000e523f4a96f4bf3000ffea51d557b1cf6aca2c01c896e1e62a9bafde98bfdf5711325b53cd4b99f00c9c9b8d270e8132074124850dc0595507d6d1ece228499fbd7d294bc1ed04fd6a63abbb80aead5de3cf5a934ca68b771c9d5702dec0ca6f30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000068bb5532c57711bb81ef4f5af43e096ff624cddac0d023e6882fb5a208281719215eb802a0dab0f6ee7d9d02ead9e2a49094fb58d77d29b9b471307bf86f1b6be46f8a01e43da2f00b9c2b0e082c49a3ede308cecf3fc93e4876568b02b37808ade136fe8103d9eb09ec95761a1c3d07d71edbacdb039a248abd32c24114e89902169c0c0bf4f4c21015a3d270207428c28e3b5822b69e09672bb0570e7351fd470315f356c2f7bdf548dbe71826aa8f1f5db666e8a4bb61dddcb3334a3717d051a50b03f7404bc4741f5f354879527df448e2f455f3f80a37cb044fa2aa3aba47bbceb313357ef457f68a6845cccd20c0a2f23150f757ba91940a232c8fdf3b589b5902229193f7bfd1a15886e21cf35cf5c18e93e1883a6326074b659a1d2c747734280322082109a060ae30ab6fa2a585eb6c7243e58111660ecd09e65ddf8dec7f96ef020b8a348fe7a9c0df053375406b07d6b1037e0a835d4245c10cffc5e711ec5124021ba03661d0b7bd8b72aa1d9229b90c1ee005f4c424c01b38b42dde6c5a91035503048ec14af8a2281c94ea1f275119fce0914d50d0125922d601383d392c3b994f82fe722672efaad31155c2c55d5d69e3fc04b6efbe6971583126fa6a40e18a9891d3b0a35681447cd11dcbfc69de52bf7bb6fae8837bd4ff326dac8712f4aa17be5083be59e3ba44ddc04c51877cf305cf79dcfeda83c1ff036761e23c4e2e53d5a6d8b9bf92dbcb084243502c25e01bef490bedef65aec53de3fc2d4900400f02a34ba8a5078e9c241bba6ef13e11be4a7c863ec44152ed0ae7386f6793fb89f15cbfbb6449b73e4b23f8df7c394e080b4cf13e238851466e8a79ba00101db38f12196dbb6e02b40fc785f9d7d00625b76fd21a95871adddcd8c6d4fc242e882e41178b26630a99637485c68db83495d6b13b33e19f95cf67fca27bcd44c7dbcce144377386c6488099f692a5bd615072f44d8a9de0ed8ed46be406ee8dbb4d678dc99cd8de8a728e987d16bc7bfbf0a17b052a367129fbffaa54db12885d7cf9e280d5db70802baf5177cf5c7a3ba4d3f26dacdfaf44ee3e341800192dec839f35a3c81cd7e62355b29bb7ca72203a739878dfb0f2315ac091d43ee147e627f76ea10fabf9efa4874f481e3f9138bf9eeb0ccc47904612707c339db1b3c8d50de02893f07222ef5775f2b2d796d637fd925b0f186f47db7d01af18435eb0ea55873c5a57fec5d49c2d26c1311cf4db0c84f010517ca9b16dde157bb9218740bddb7fb73f04c6924b79fb2564470cae93fb92034b09e6ed2ada76f0665a3e7682bd4717919faf4c640d12ad5f05a7074585d4ec43ba6b8150081c54cadc08739c258915853f346fa30d1a9430cab03c84e25f3d9597aab1b74b26af3a21830c41119ebbf17718e640f3901f2081d85e11be38637988c363632e406e68fe603c5e11c153a92843561c9d0157574bd37c505d907366652536850e1b7d9fe90d238c6eed8a25532a8d6afb250b3caa0c2c983332e66dad452a19a361cbdf3705c832ff186a0f8fbc34bc2b8c1e05a949ea5f9a23edcb0c0d986aac499f5072af6afe12d6d4e34ba610b81de20192829ad95b3c4041612ed2512f6ce860948e4404b6cb03cbea3cdb8c3dc1b1c7353301fdea09a9312e3fd39ef936bb82e2ee905a189a214e2a2852ea467d0e974600d62e6201eb6298cca1aded8c36311f49212f23b59824e43a0db496bebc02ff14e569540cc47d56c15182bf4b8bf41522e8700823ddc24c2eeab856198ee4ad3c6a53bfda9da68d06cd0cee10478e395a0dc9bede1ceaeef8a689ea391b5b101cec8de0160e119d65e6d698c9affa5a2d69cb7c71743c1b0c4fd6672f0b33a527132b354af1aa8722a438567a08e841f97b5e9d8011b984655f6b128fddd8b14d52aca1b422497773a416ae5664525439625c1289b191c7220cf7328da552a521d3bf2714921d483968dd522f8ce1e2e52b29a054561d1354631f89c59299c64947e4fe75ddc68700efa0395c1219f6160de2178aaa2123f40ab19a8f83d2b48b5b15f31b47171a650e54a7ac2a8fca74e2405e1586dde8cf802b959780b4899ba0e74eb50ffb21b57be8b0fa46ca7c30d38a73413f5a683b4a844752fa763fe89c9538b9306230edadf875ee3c6bc639c62d1b8e9e2bfb94af93a1417c6fc7d9d464f4cca93f6cfbce9930c4ebe133de0ab3bb5d066e9dcaa4bd2094b73973b0cb8b9e09000f27ce1f81b5545ef15e32f02e4e55f0de1e1d812fe1f88254154100e9f1fd0000000000000000e33450020000000072a47242d873eaa7e7f8405f43d50f608d1f92e00156317b5bf3f9ed4d4502f398947f0210f7d49b8207216977e7aff53b82318559688fc9d8e5f165953afaa26580d706ef96cc593d426dec05226392084967239bc120e8cca3f839b0ade9ed000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002aeb3b450404df34f7c8ca8e4d0aa4be9247725b3a5731c5051d71e9ed956c613a7ef6110447bb27abae4b320c2650144e0cbc09adbbc8a4461e085ed743aeeb85083d6bf5952d54df7397b680bfa98a6a3011069fd4fecd88cade787d123c062b2046807052b2744bd4e916698ffa388eedaa1622596bd5b342e464ce2a230d02011aaa91343c0f5a7af6baf21d6de99da2b3f06d64fb77013117bc2039387ccd031f299a959e4af0c1d37cecd1f5dc8344b92fd53c8be7be6cad1696b5be9d87560b0782689162815aa7f4fd04c98724763891c37ff6fe23a3601bf56ae7a0197c93d3e0efde90e6ce48182ed31a9d5692e0b8f54fe3945557881dc06006e1d6e2c8032e83d6bbaf14481cd66892372f5595118b166d7e0e10a0a389a22eeb1c280f0f031a84dc8ecfd24ee9b273b10b40981c8415ffede0699f14e6f1a45354be16962d0227fe11e852ca02d8f9291f8cbe96b3747a943405b3e96d1e433848072312ab0d020fb170d069a5e6ac7bc4bbea21fabe4f43bb9a60e54d6f58bc35ce37c78577e2022e55d2b1fb519084e707fabcf45fc6a337a9517c7281299ec7f9c85d65b4a3aa59c438d7a7315e0e01ca7945d996ccaaa4238202d98cbd84057b81f383e159db09519d0e7b7e621baf2a4918f734f7ee507e7e581e6a31232d7e4a335a9af8033e262ff4db0a7ba468c4c7a23969bdd1d22fb280fa82b3055819530e52e4e8a78aa7b18da31c2c82f2019065838f38ddf5b77bdb91b7c59b8b7316c3d38ceb88d21270c605374de51535ccfd9f46b8faf005335bbbf9d726185664d1be8d3b7c60b5b63681864f1cf2462360f766d3b383be87ef7b961d9cdefbae5d669a3cf75c6f465d4f62f4b54ae8396c0af3809a628b9b57ce5cdf58a5c8d51c6944450c30d1430b584e5e0e03444e31dc806c4259e63f33f9f16a433683b467b45ed221259ee48d7a13e6afb650aa63d4eb601dbc080a4850d1b937c752e6f5397da1324c78544b148678374a48daf99e18ac56e60a33a3fdaf22731d56f91e25250f2ef204e27226cfd041a06279252206962993b40bcb00aaab1155de3c74bb3d52274f1fd27341e2be49b687a8ba1519bea38b3f98e2014e1736e81be0a4d780f6e0eafec6ec49852f84ac7f514a91ce2883b3c6eb55c3c26db7aab545d869d7e2349b3a28678eb986293d153569381f491c08f3005aa6fe12984d25f66be64f82af0a834ae5da58a77528eb0c1307660eb67c80f6cdb2827a3bbedeba950089b0107d1a11b6c9aa37c0dbc86b85675cc19911d7ac103391785670d243231de325f443ef10b47209ef2c91fea7de96054c65630bed10763527a8b4b3f112c73822bb718440d5496d066d3dd1112b9e67b3c54934228bf48f6bddd575fd38b56e839a7e6a688ef8bacc783695fe6d1ec0e2497ed454b95a5e8c4df8cc0c9f5f1c8185e1412f101385fe9340a476bff8867a1418861727fac8903498fbe3acd2f74da4e163eddf73f2e5909066d90b63e1477f12f9e68fe1b982c108a74bc28fd5943c572475ad36680c9bf7a3170ca453b83b3c0dd8626ff69c5c3fa9a7cb5e2c25c113a60c2a9c755c17b68a99653c9d23e8fbbb4feb79b0c0e761bd6050e2bac3bf60b83f931effc394ccead3fa0aac7a593e807310230672242b2a33724896ec6f7838c9f4c8ddeb41cfaac92bb5099506c2c0dc6d76d69d51839f454d2ef3377ce275ccb3dd7f6e590b6042916c0786623c54fa363d80fa0f0339f38552b5834f8e67a404aef597b550eb5f10bd91818f2ee5f563136e0314c8d9fc85d17e4d656983aae11e2d6dfc193688c72949146a332c21c8edaf168ff0bb0bd554d97d33250dba8d46496a0aad46492626c01932a2c3e3e60e8f774b4b33a39f436f2504869de238adab7e6feadb0a4af4d8fa45264fba2febe3ae3301c8d18e24ef3e04c5e7d908a106567647500d46bfa404d9c7ed09865fed3f7823d93ec925cb4d019315092e4830ab10cfba8fbbc79453a7881db02b3fafe1be08d058ccdb566fe4872cf0188991c3105971548388a9d51f60d59d571ef3a614ca2223b0fe1b3a9cda31ad5a2226a0446a73151e06cae250d0870e59c1897837b669d47866738f521ad2e0e0f8e0d8e0863ff8c71b8d89e0987dd14b8b5cbe1596dc030e940a8bc805696e9a8d9977b83f3ee681061a22114df30aa6f616fe4b70003ab3276610f1c6bd3a42b483f05f80133bbfa28d6c69d6d1c2b51aba1c3f103523f01db16e39fc57b04efb2b809d61769b7611442e3e5c2489ef6a0300000000000000000000000005b03f930535886bb5e239d44d56f91f9967dc3b2d6f3dc859470a8c01be3667ad84eabf13835a9a024a3bffe75a4b39925d6a378937634862a41f9bd3623a45bfa9cebce62f93380b362c111a761bcf63e32ef8a20890b40b82c1dae3180f8f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f1f490752f2770d28f096f49f97050538cfc0fd4e53431d3bec87e4e7558a7bca3bfc5a57b8072ad2333d8f0437ac1b6740225a0975bff0f8d352ee685a9c86a5bc2b75d68afac3859a43a611e382185ced8b9d543bfef657327e65e6b148325b772779b2ba982d58cb4cdcc365265993c4c8e49050a4cc7a11d6db60c215b0103103cb39c91f9ab383e48d3bdba25ec6a4f506ed36344dfa809e74deb18a68a63030da684ebe2dec8afb6da9d9bae6cff1431a9a912b9087df4502cab0927c42a950a054563733d51bdaee4a222aad551f98e9a93291a83e20427cb421cbe397c995d13057e63b50308e29a1e908a51f1f69363fdd5430670031f145f58f7d8795fe2021cd61cbd981035eaf3eb06231fa536455f9ed1d4ff2b24eecadff581e16bd3d10325a289978f0c4a3fdb808951391b8fb633cd0bdd0d50ed8f4d7b0e52e5ea8ffe0310a416cfd4575b2e8d8cdfdfa88e69d7d26197bb2436a7b78428eeffebf2c091021990701ed539efefa8a536ccb63da64ec44db212f45fe1c7001596cbc3ba2581031f75ae8ec279d0260581c2ecbb51b6b911152b9c25d5da3a9126075d86a7d205daa3427e5f9514259e8cbf46cf971eb7472eb0b07b6adc7b5ee8a67be8c1f81a5c765920bd60458e59ed8e44925bdd041253e22e0619f5f17da3ca0a87525d7a5545d2819089e1444a1d67e2d89247c231b1fa9672bfe4b155934ee7578eb4469837a63a430e9b67a2527878d8eb5ae9bd09c610eaaae6978d9209a16140eb48be35f9a69a20a06525ff4059ad2637be6093d14ef7dd532e0f19b40e3dd5c0adcaa54ee1a04b25f8902d82d615a456d529c6cd22e036ed4d70de296f1ecb5cda04d02ab246769cba308fbf29cc45d4df253bd4c54c7c8380dab10d2e3ed38e88e95566b774cd2fe77a112c6604b35028bffc9f7fe16411956adef175ec2908e1f371f6c08b73245a7cce5e6b97635c7db3e6f2b48f2b98751c03da7d5bfb72a996e1f7da180ad74408b657f81a539e41d6e26e06a6b43cee40f963cf12aced00477a0afa6d7fd344eea6015b72431a90ad340185fbe09f52aac7afa0ecb6a1c8546daad2038c4742f3bf82ffc149292bce3670e6cccdcd87d73c97df47362465c6cc20a6aedac683d53087e5f5f5a263b58319faf40de8a3c27f0e445be384d9e3f68dddd64d2063df79c85b71f6ba1e2bfab5f14b2cf8e4705fa5e654465b1b4fa0ffda36934c1728e46d45c60d96c706cb7cf263ca6dbad89c8fc4020464f5bb7dde923ccd389f840ba3580440cf1a9953d1478239741d6e2fda051c6b3eb18ffdf87dd70d6536311263e1f1c5e0aafb7f5e213138cfe278fafd579b979636d54aa7e95426463b38dfa0b93873770128fdaa8c76aa221b8b62e5dd6df2b107f1c20a4e152595215b0b2668bfb86474a0a3ed9988d1cdac6b4745929c2a9bfca33a39aa2306c74fa881cb0cd2027673ec41b9d9f538b960122d3964f343e9c2060e0b9487f37ba192452dbc84aed2fb1a426a6c4f0de7a2c6115ff2c81b1c07ec9d0581d0e4486e597a8e324c66fb358ed090a6dbf1c0d2f71ed49ff5b8f0ece0c23bc4bede6af6193310df4fa9b81e6a946ee8d66741475ab2fab678451de6664f863dc25b3b8e3f30e0de5c9ef5db6469506afe3bc7a934aa32865d5a8e6f32c1a3cc895885527fa705416491331a16a857b746be7d4bface247ae28cc002ff79e6ce7f3902d8e986a86f3763a41ad62c131c319361fb94184f0749304f2daca741819d74073cf5c9a21fc7ea9d4a3c045258e4777d3692f07cb3d54499b3f4ecc35a4094bba9cbc2dd75b7bf99360d2fe4c2dda0b611a692c34c06a685684f57285d3d2feb84fe3d6872b48e894965e0593ddaed752846d962dba62bb33d6573463871241f80bd6b52f008b4b011c537adaba4fa9858dd8fc71ccc236043417fb1d9045ae2aae47d23fb773218052bd0639f2d3cda77a67cd3e2693855fafb1f6ef4450116302528178994ef5c3f547e68140551da7f4811ef6095e0057eaed98d6011fa91a313a124376f9a583dfb65451016f2278411921e8244d6c9dbbd69e5cc4a3c38c181ce3052e7eda49f3c7f84965d8bfa5381de70d284ef230c102ac4a5e85a34f6bb00c3cc3bb0c8e4cd96101f7fb153bc377952730416104d9e658f75cefaeae2d18d2e22f75f3df6b3eaa4cf984d94c271c87fb799815e7afefe1e51f433b75d778b69ab4b30875e91dbb22d5dade7676ceeab1b08817b9fa01ea1b704f43ec000ec3d2762d3b7ec351810704efdadde2614995b4c6c125d9ad0cce993b1b2f76be2d92820342464d667fb0f78628e288e2518c7ed338f4f86df9deea561b0dcc7182bbbf96d48ddf33cf78953a1bd0ff3dc5122ed9d7609dd07d7ad75c58bffb40d3942efcf8aff610e", "656a00", 3, -1514010366, "e477232b96d00e80cd80282aae4b471f4f695803e234416ff4313bafd5f63afb"], - ["dbb5e84203bc91e2b08eb1c1fc8f44c636e667bd2d283d3a925e60b386096353caeab1881502000000086a63635153656aacffffffff65308ff54adb2d2d6dba3a47400053b5a9bdbea402b991cd4bbade7e778b7961030000000200ac9587616fa48f5dddcb76eb8a2b97902d2ccd27953e86e961245aca9201914ad971ecd0d900000000035351632ad0660101039460030000000008635251530053656300000000030000000000000000205429010000000070ba961942616f4501e4473b57c5ba557d56992974db2579596e1afbeba20b5cdf1eb7b42cf8a6ff352471ebe2a6cc5c182caf866159be0bf67fb6ae4cb2b1ec47b2d4a96beba61f651caba60bfeeee54783181485fc9359fbdba73e429a15b10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060203b3254b058f999f060df3f8ec3ab56238def146225d8a7b1e2939da6cd4f3804da67bf0b9bf81f28ff64963db329f57002ebd653300a0e308cfe263834a20e58e01b627d9d98dbbcc362a5e805e4bbc300326f155f6907b0950afd98be8c4cc5d6af12561a0e5fe38ad4b26f447b10c58c39954dff41c0dd20d618d299a4032483abae99f5c0c09b0152390d49c619774c3caf8a58e92d22e0fecb7dc7f7290319d4e2c6070337a2b799db65296717f31dd8369d9a74b435cf7b9eff7e34d1900a02e530c25091a36a078bafbc379f3178e3aedb03737ee7a5b238c285e9447307f7936b6ad4f235a3f9555b4a2c0b3fbb9dca855c852fcc85ba755ca1d859e6700300bd79e33f01dc4199f0f423ba4cbf267ce55c129ff7836874c702a872a634110218bda37bc1565d8d3e5aab4133cb223b12a69ceb1ff11f5b812fa4f35841700c022b8ea1c1ce03aa3af0faec1aade0037b5e7707c8aa2d63929fd0eaf342e8750b0210d58da73d2f825eda359deef3974926380cd02919d8bde790b827dcdf62bd62030c8c07db8d3685768f3fd2ad11bdfc1cefe3ea8acf81b6c5bf0ee0f62dd97e96662be6e7ebd4324f4cec9338bb5762cdbce346cd13bbb6552325c8be6d80af45a1b88c502bb095cd0b913760d663d030b3dbf426b129e0e051e4ab0d88cc07943f77e3fdec416705d633b90da8b221748bb6662723dc5490d20e207154519389a7bbbe20a4e3ff5c03c28a9272a2face52ccf7e84f2c8f850067d416705407a1471aeb0163602fdea663f7ce5d1d469af1f3b64e61e4597ba69da11ec55009177ca85dac9b063bbf7e6d3141014caa149d60bd45d276e9431678feb807a54e69c39260b67e1999f73a9b55d7843775f2ad12ae16a85113802fa38e114a3d78d1bf76ab10c85d941ac3323800754976cf0db22e74499f15fe8d6b0f17638b4f790c1428bcc53122a0484219233a55759753d87f202f478846760a5fe93f0a0d277d16eefef0a1aeecb4f0811b50504020c92c42348841d0d8dedc8f8b837f17e5062c8c76cc29dc2c46884b629bd19889149c6dcb7c62971815559d14c97dd640acff799363a41c5219778a041fc5e8a85fdfec5e0e4ce190bf7ee7e806f6c579332110812c2aaafb37f92d91bc1e58ed7c8badb866cde1c6a2cd234c56119833bbff521df8d2d215d5404fa79ae6c128916d5d9a270c043bc26f744d3f8627578cbcf0bd82587717b75aa49d55dccc8c85258baf1eec3d0594f8ace091676be37be3b4fd42305b0867831ee3f76dfe0fba51530273104c72ed2286d54f0fdb7770dc45273a18df2777abb944efc666ae00f180edf717a89287fa2a8a90f5b25a3423ed974e42695376d310074bd4a9fe20d81ac3ae59e2d0b4aed6111185e73127ba5aa1f24b0987e40373072c7182cfa8d1a91aaf5b1c8fb12647213602d227c1d4efffe597be1acff7ba04d9cd963e6be366ab540240559dae17a3825257c5d002c409b6d0b8fbb25f5edbcf59e6c6722b7b8214515a757190be4aa758e829d9b757b4a1c9c5c2093fd88ad69b84af1a6f6f637eaa5d1e249340ac623c05903f63cefea47f63c3028f23fb1fe2dbe63826ad079ce5d36e3d2da272142613d2cef4252e475a2053d56a946dc7516586fafdf202656e1d1b1af3f77e36dea73c9e54e5aafdec5b4bab8221dd45d93eedb914eb1faf35b9dff428ae1c4cc8921f3e36d142051719c4a0fbec442357385516c9d0cbab33817c9d1ddb1213f5afa0b97abb7d7078cb8cea7deaca6be5e01df664f24d080675883fb9d0a35f13aadf83f3e652b4a8e7bb06ffc330d3a7dca755c508cae553743f2d2ed2199f1c4f7835fb5390de8953917c6b10c521fb4885d44b7fac32d104bfcb683dec7fa3019bc769ec677208825ecab27d609baf29614bd275cd49f437802067163633db0fc88b76d6c513ca227e5155012ca2585531681e5063118e571988439677da9ea5f8cef2c828c47db2498f3a88b11bb5da67c3eedd1b2477b5675a1a1514fbe52513ce21f383ea0cd3726726b0d8488b22b9472bb232f659574403b26e93f6a48c861d38df1b10ba123b7309b95c288c7a1e095a750eaa7f9055bf715e4bf650317b3e1c8dfeda137afad57e6e2bf7de117b16d5d625d8920f6ac0690f0d946c9ffa7e85ca033fb138ad04dc91add2b2e5c3c70996ad9f25dfc2a96d7962933d67a956eb80e351c842116cd54caed5c4d153cec1ca55e1a017ce81345e47a56d1de0f221f7e5f90a0b49cb1f9ba1d49f06ab0af00000000000000000cfcea8020000000004c5b5cc789c69255c93e3064e804551706802e3d8eb8274de46784f9c669bc4d836b1d7596a4c91c815fc4c3d9c1e7b7db5d0bb21fd4622975a1aae63b37a8dac6c40f2861a0cd4de51a573296c8f110ff03e25b63ab4bcf1156cd10ca62b1e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eafe4f8272f4d2080bdd1bfe457cd1c2ede5f844278de7b9f752ce08def102c3505ac5689b0345d517b2941b20322faed755576609cb50b0637ea0f2e6a2d509667c6dc27702cc6d89f0e2f56d787fd22e8d80367f73708dcaacfda71f471467a57c5a34d61cadb947b2c3c6af49c0842b2da6e3ee6002ab31b9483ccca47c42031ed461345a2638f1dbdb69a2bd954fa8c8f5f10131c4c04be22fc713367356340226e24d1744232cf0698788200a2f3d7411841c0457ae9467f878ff2c4ba24dbc0a01e2e1c2e330dbacb43a09f13203102fe3a69f1ed47fa5532dc571a127e2dbf0145db5da9fa4ae5d14255ad4fd7c571d65d99cf1195b5a9a0614051fdcb63db30220aaaa18c9f765277387e3e16ca5825727743024b93cb0243c37de882efeebd8031923d32ebaddfe43d5bb0df728d8b90fbc947c4c92390b64cdb8ca857346d9360204a383da6cdf44f40d02b029c3c9888739e9d77f7dec432ef72251cd7606c1a10225c7c0109fcdcec2b7cf2f8b6c48d08b0b007c94cc48f19ef097bb7ac60b40fc031a03fc8797ff4d0f18228816059dabefcc13f759728e09169ca1bab299c854141f45d6019597a4164fb3f5d1cb20ab8f5f9b8fa10ebc55e56e199271004727ce6984cbfcca1c7e822b19ada0943fd845755bac564e8cea112e320979aaf7d4a0a741463fada9c76151c6a48b772f3b3809a99a56b9eae827218f5c01df5f43815c2b2fb9dbebc00b09c6463c484ed528914c1c132f5c5a0c58353b5682a57770a6984908854c9bfdd21b2891ead02d56ff4bb09350f7cc449009bfdc57b607919f1de2ab87b15704ad4e30af4190db9ad678d64887fa05a47817a8d57a8fe6adbcdc7d90b97311472dab1f33b43ad64326af4c494ac307a3dcd9d91c4f18ca51b6268dbbe34e1d70823ee9c78afe0b2d1eaecc27d1f22674c91604799b493df06d6a5a5274d58bc29a864da96afce380a3339fd0d107d676c4b377e65391da3e78950d5ab83138db406110d9bce7c0eb8eff1bf4ff88aa09b1604621a21ebfa437506d36264e86cd368423281bc63769d9d6fcc990ec7237b8d7dbf14b06b038056a121b13082a1330ca3dd28c3ef9218b56afc216b91c3c487d3f28f3fa3c21ed104398df0eeb91b4bc71802bc13aa852912f470f726b0470d607d08c173cdd129dc4b7aedb0fd7bc07ed2d3ebb67df2132234cfd14fcacba84cc26ccb912ef48f0be43fe5b2ebd9de7c3608a2a77fec49ceaf0ced8100a173a7f3b2e951afa2116c57556f9a80557ae7c6adceebd7378619da41804f7d2766e5e8b6086f55f873eb8ed389c9b944feeedfc7f7e973f3746a2563b0b89067256b0b07f7205f5e8d9a653688e5452756577342f9d055e230a30bdc0d447705633ab7c61bee9abb31ebd1c1c153beacb97fb08a4c687edb794c2fdee273333e57474a66f05722d6a9fb526af4bda0e476428ff6f9974af944fc0ee294f2304f8ec13324aa71382d1c97c2ddbe1f82d24ebf9abe9902e9837543dafd47235fdeb1574833fc94f5e7a8789d766fd3b648efa3d66c29cf04fd26afc0770cbd762ec8a562765b63846bae5077c7f474734f8a30ea94e280b91820b3a9e69247aa1bdad0e7cf6bec81487d8f233e3e8264dce9425714ea83ff8cb97fd07d69b56ec1b4198f5e8a57a5ed3d14e09a3026a90e29c5d5a6c1195122d40c44a73e9ffb90036ddc287e56acaf0561dac8667b7aaf8f8aebe90e8991b19f2db62f9c7c1856ce4f9410e507184dd8b1bafe8695d0514ee8c2fcdd1adb9f79285b3cf8d730e6ca6f7d83287a2e5ea11f17acd6570ff3105ad704c99ec4d11eb6a97cacaa7434b5a8489df2f21414fb9fd2fe776d9ceea1dffc991037e13e66f3016205de2867f9645b1dfa71356dc92c136e4c529eaeb2f6eed4ea07d32b292ffda8a740f0cc8b654344ea0e4675849ad7bdd6cdb3643d979a83b39e5a593e5803926aa73b9e54c98f7a5b582fa36ef479b5d40fe015b0d32f1d83862a418de57cccafbd38d0d7da47c58c3076c1c00838b9848eedfeed9f8e53ec1676b306fb2c3c771bdb7728f32865656e57c2dab0d60e40ef4eff590b8c16dbc9a168b48bf5cb7b57b763f68befd0d3d2f0f25598f4c7e6c0ee02325d0d5d46be40a28f68f27893d356731b374d63a8d0712b3a5690bb77c36d59a2b285e68cbab4bc07ea0d576d7d5ad49362256c9620dd314bcb17329aaf6a59a4d46c3788ba253342007b356f7237932f1058b54cf050f01e7f327f883aad6d56d95cd7e1650c21df100000000000000003218cc010000000017ff60ee55d2b48bfd93aff75cca431501dabddff77e2ea25cecdc94475fe800595f955ca75b404e4164849c936afd82a422f1a101d588975dd1913b440a16e0961d62d940f026d2a0034b7d5ca8d94c95078be012a3632b70aa8a1c8088d33400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cf6dd828dd435b8f4c940ac4829e4b4dfec72281cf58ad3d28f4e97c567d13cbed44bdbc3dfd1656af53fc234f274f5351dcc498206246318ab3cdebdbf240fde714290b4c1554a214dccf1577b9fa2b458f9fa347b9733082f9683dc069bf67c7be0e5a617c48041e49e66a6fffcfa9066e12056b42054e7215723ee1aece40022673645b6af33758a4f0aebc65b8d067b3d9eb424a6b536d0009cdaf19fcfc0302187aa478f6cb1ac6732941e2d4549a44f476f8cb2c89311ab3fa42083b65b53f0b0059d959248b6171077a1777377ad97cdf9daa80ac4649d9775f1f2ee6bd3ef9e793d27d78b4e9ca56e1e53f9034790bc41c2ec572d97e15f34e803019d8c8f4022a9c23a4cf6745dc793954a59231237034422d552eede75e143a429370c5e5fd0309607701fed14cd9ba0fc7bc67acd3643b065f719be3d730321e5d99a2174416032c0ff0f7cbaec96d79b568d8d04e15c16b4283f99d92bfe43e254cfa90277995020f1a2664fe63e9752adde477aa3797c5492158f365d63100fdf0711439b4ae9c032978212215e8b370e353c34b57df74169ca790769ccab655d9549416b7f0bba5d6250af76cce9f82ed97f948ddb23a0ca1da9891d17c58bcf81f53afea17d80053adb3bb300a6346bb052eb65e50869d888549de9ea5691bdd6af2083613a7e75b5d86b23245b0c065e45c35d54d647bcdff65c3a4addc274f970959b228f7be54a39c50f57f25346998a0516b46c10508d7a2ff4c3df73f9b403992e76c0a01cd88d96defd77125d196bf8111e36efd9bf65d5dc0fd1b87c69b636e7224f3559cc825219dfc80d4355979fae872d3935b3a4822182120837e493d6b8ba81d4a52dc629cc558313421945a1f495009cf87c166c7d5b3693424da9b3f0dd9b416bfea74c1c518ce0df4aaa06317167a9a5a50c87a1611e0c5c1c0293d303b50e0a963106468eb80802559a76e369ef5ac662521978dfa047a5c5b07cf96347a641c678138750f2a2f8a8ca667562385cf071bb5aa0a017705428140e56500af9c909f15891dc478c1d5d119ac7062325430f96752d5769fa1f1dddce0c889ae1182bf022802dc48328bfa19b410411bc750b058dbd51d0da9487b8027b11c00ce6462b4d88bfa6b9d940ac6f893be5f2b927421c94ef833cb84e1af642f79a62834a241b2f40f225e1639128efc0a37cb288e1c1bdd45ba37d635eb5e6430b0ec0a006efac12edd8a6e6cff166231d220593be46eda387d540a2757dda7d7c5f02892272012d3b0ebebb2239053d3fbca8c344e7db53f330bb12106d9009cad2a298a833e7139b843fb5eb2aafbed8825533d98d17072310104b1faac45022f99d983037d5d4165319392c818f6962a025d6b37f45b28a30b3a2f1e47bb8caaaae02e3e6e5ce81cd5b951287d51cff746690a5236ad75a9ea6099555a5aee53598c3616d49d9f9b5848de86a2020e9469830ca40a39b67042f3bd71486eeccf41dc13b305c98c77d56b656b01a08f2a37cd5ebbaab5ee1fabebb1d1d38ce8b70eb1fc8bf1fa085688883206b3cb740271264468bfcb169158757f03be9398f22c220f5769538fb22ff96109fad2b13ffd778c53d99ba302f79b50164fc35a6c3c7452ae61826e12970fe1eaa9e5e0b6246a44fbddc8aab9662df075c54763522e34c6958c1fccbfa2e5b846ebe129225f184c9af2e43221cdc8009bc771e920b40b09a36772774502e44fc6cfe08590ae4a7cc78c047887905ce25fc986fded4d174ae320913df0a1e188faef98ae74a018666fd92311c909f37d523b0457cf4a9064c2c683f97edcfe6f9909938a8aeb18509c659ea0e194ca261c0f5ec5cdc8fa4dfe9af2092d66c81ff451c0293c52ee2f07dac709a446a16ceb07e7eb686cfeee2b8cce7268593f15822b40e40ef8449e104542f8698db7d77a32ef394fa3788ea5b8ed4de6ee9ede755119ef54d993a2550789dbe2266734df293596a248dbd3520b61ee95859bc24aeb6082edc03d9b3c69d30a525ff578cdff68b1afc83ce59ebc8c2c4b723dd4d7444a26ccb5a4aeb1e9c8ee2e965f2a2b25cc3a061485471e403ecd69a1215da4a0cb073d3ba2da14086407985ec0ba177f6c31a0cf096709757e31555922ce5dde435a7f7e9b975c6419277446f55eda42c6fab7e4b3ec5ff324fad7062382946d67fb4cf1c14a6a557ae11ef9d534246d67d096d27c0daeb1268462ae212eee6ace300bbb3755589d48b8ddd8bebbc49e3932e8327526c2b0253ca75049c8c27f92a13252574120bd299970e29fbce596bf309ac73468337da8ff789c88cf39c84b3fcb70eb38c5dc3b95db34dbaf4c606e83166aefb62ec8a39c3ceacde9cd638db0c1b47d653efb56630201e12b51fd9ef0e8a84da99329fa4ec18d0283d5bfaffef909030e", "00656aac6a6a5365", 2, -331585706, "5ef6e0e1f8b258c55e849f4238cba36da79f530f398e78b9f929dd71b3d2c80b"], - ["030000807082c4030247fba6b9c0075b3cfbb254b2edae6fa77de380f4cbd1b3aef0d51d6a555878bd0100000007ac536551ac635146ee6aedde8ff68833306c32432c8497e9c041747caedc6be084861d11c5b8077e96defe030000000651636a5252acffffffff02e4f4a70400000000070051636aac6300cfdeea010000000003ac0063000000000000000000", "", 1, 43885721, "23efccfd1506f139b3e60d9787bf4e14991d890c5df72f42e37a000b629f9ff0"], - ["e03fd3420285c24dacd7d9e822d61cc72123174dbfbfdf6a5b65b25dd84e4769431a77e9e201000000036a006affffffffdb7eaa90dfd003b949c2fd7ea88d7d1daa6a1856738add464850982e44bb5f0103000000025300ffffffff01f0403a0000000000000000000003791a60050000000000000000000000003152822e9901084182b7c9199e5de96649b5b50d3deb766faa78055c735b98e6515cd3cff0e1bcdfa9b413bbde3e04684aa6665b94d1da620d49c7fb67453973366786f122744e98f1546ec94626198112fb419c61362a0401ce7098e3fd87ac00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cf1ff53362cef4252cf74311a5e6a7681ea85d4a69316805d5d5beacd72041458b311d08b767332e4a3e2b3f12cfee6a447c8c5df2e54faa868c502172191731f8a32a178c0ad1a41ab548d2aad9077901f12d0e194f5beea5de5c1555712cdb9d9fe4c0144dff34cd7baf7f7195fff10b0007c2b8d934c7e6c1ac36b482d5f0022c385d9401bfa673eae8cf15eaf5481f5210ab2a8c524acf1cb816224cf0ac68021d86d81758c4bbe334c56613d0aeb31c491046a55cfb0a8c650a177dffc46e010a001cf086eda6c98e49e0d04e18759f7a99bdfd110123ad3d8c5ff8adb02262d225c2f39e4324d5cfc5bed89eb1058280db49cbe4c63a04d92d52a724fd4bde610225f9505b244c0f4912261115069a9397d2ae29af6b1fe7ab2440adc3ccab1c7303020fdc864668844daa6769b929e744ca6016aab8871fab19381811535b6141c40312fbb1f168fcccbc8549a4d881879c7bd9c105efe50589b6e726dc895e0dba3b0319b9a5f2f02259cc8bac0190c2b2d2ecbd9c2ce4d772720f840102d026b8b560021d256dd109e63a076e4d7d7388a71bcf17189d6f704ef6aef2b2cdcc8f1cc57d1eae6c9ed6b5c4981b83bc023e9751463c95fbd02885273b36d72beff4e0807c101c2d4bb603f3eadb54e4b3ab29a6fbd0adf74de85f7bb7c7db2ce01d683dd8926b5f04883dc688b1682c0fdec1670cf56a0393af4b913c062133341a9d7b0605b33f4833076e46f5fb9a113fd25dbe71772bae329e6865c582a92f3d53463b653829565ff24fa5c7c76ea939d00818a978cb20881d558ca4041816470af5b81bfbc46741790c7fcdbfc679bdb131f8dd95bde7c607b7b29456e929eecab0f8402e21f2806f2b9ff7a0f6037dc3d8efe96b68bad31b677045121ea30d14bb912a303f14d88629ef7d6342220a7f00235c999ef56669d7a41fefc6cfe6725d1397d8beb944502a3c8586235bf5d7cd6685b551f76545317089af37684907d55d43bbed0c001cfb88131dc9653fe0cecfa9a828f8a676e47cff570f5db7232e0a95d583be4595dcb3f27f350842f0858b900e7711b622b7dfac998fa9947b13835dfc0183b5b8c81bfe87550b677d5625342536d8a82c06e045b70ed9e66b26be46567a070cd43fba8cbad22d422e25dceb359b0a18ce6c473010176cbef97c99529d8e871aaa6494bbe72b344982d433e79786cf2c598b2e7dc91f0c86d6910e792fbca5d7d7e5bbd848ccfad40c3e0f52ae1a40abd0e59f0b4cc549e43bcf1290eef37f02416cce3a6943bbe857c4e217101a045cc146214dfd0170a976aa21a8082a1537f74b7a53b408aa5a59cff865bca0f2114d881e1acb41d929800c9c09cfc6b47f53286c77b8a7f88585e6fde88fc0e557fdabdbce3eca4e4264085cb3ee62f0139079406259ba612861d649cbd6717460028b105c0ea6ec5fc82bcc872d66cecee0f2bce3adb77b1448d06a01bb8cd7cf151a01f7d49987a80c98a9bf306b0ed05603c0cc0606c579d02f0dc3f6c07ffeba6e4a589bde7da8bdddb2486b17018c0e7f2db0f006102bddf1a751be12508d1699d5ca23d3c7bf622d6ba34ca163423085f6be62414a15e4fd5603bcce202a13cd8c4832ea868917108c23ddcca1cc64a1a446525d29d782574bbb15ce251277c123ce191b263bb8d8aa87fc1587065278ac12ea0ec70fdde60e7aa5ef0d80d233f796bbd29c5bf733842d4355fd5de22e4dd73631037f12ed400f426d5e17e199aa678115a8ba968c3abbe2fd6381938f3ac3209f70861d12ca8cd34615a0dc56853207059db89f26221f44b26026c8888f127c7685ae54780096b2c18ecab8525c888f6138c5e6f6b46de3e2bb8f61da491f662f96a56eb8bd48efaf308dbadb01ac1d4cbfd9dfa290e272cefc89b5d4a0b834bdeacce55514c93eeac5e137ed9a1487da3cbe4bf774b69a67d304cfd7ede3e293fb9f7039f9e081d797cc103e4df4ff35c82478c60a5952b50b1e71be69235c7964859d9f3879ea12e7a2e70b4b4fda91e00e839d016965c6a22af59ffb786182d40f5922f330e522b630fcea3971d553f5a75337ab3dee61dff90bc6fbd9ed957d24628e40754b693a05b6d1cbad78a862ad10b948440ebc967acc8dd9384d78a34b69ad3b70d701f17272b177e1501993484fd8d33af88cfe07090ff4e4345affbde4dcba0945d7a6b3afdea86af0103cde662c41a1ef47c395ae38f0683651847ced5174d51e10a2c4e1e09470f8a5250157430c8f1b8d28b29b8e36270b37d05954654468cfb899b400000000000000000000000000a163fd20a7ef43c9e5a0c14af01d02037a05b7b8af917e8914874d2dbc89e9a76850e4e88a398a99cfea0cf28fdf17de5e0b6beee71b2a5f69dade3c2b2adf3c7ecaa4e492d8701052fd7a60b5952a05ae0336ab396aa07b2fb1986dc785d73d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a243c9fbaf0e13d7ee5a04d382752941fc409263f55db1f5f1df1cb36322a6020f9a528edc0491423dfc70474340bfdf52cfccfec7ebd284ee6c317f2fe1e6ab327b045775327294810dd56cd35f377a6fa610eb9d5871b67f496d8510c416e5e093c056dc1fb4d2833a0676c55e07a3423e5aa52531ef5f53b40cbe99b0c7ba03008709988f2301efb9b7af3ead17969f29d8387d18027d6c0adc4ab18bfbf16b021353e41d508e4e4b9eb91ea2609e58a9e0bec8de89475d8ea5f239affabb679d0b026fae2672778a6d259e3fd4868e2770a2ae51bfacfbf149cf917c563fcb8f3b3733d637d248a1c1ff32eeb8d73782ae1c3d3643ed0c36cbc0e19dfd14e328ea021bcce69d5e8d9722a5ab15d7a3763ad462e9847bb3c94f6eaf9a32d393f87bbb02299cfbe48f8dff4e72d6152184fedb06150b260d720d33638fa42dd981fbbb19031766a5ebad5dc3785d99551d6248e869192228eb9be1be5379dfc5e986475ec4030c8f39bd3c1ae0b3c72cd6f8bf450d87713fc91eae84d75fe25ed0400a81a35a0220570eba33035fe6095061be61afc9e7c068d8fdaa02da970e7791e2d305e64e0d7a0a5f8c9630f056fa54cca0f8a63daba11713433cfead2f0ec3a6d23955c97af478b93e932fbb1d28c49689fd6daed46cb449c4e5378be9e089704e13c33f76e883d7bd19a3e71666e67a502520427b888a803fb74f6da4c423bb8c5ae34690f0901b764ca5b5998e8b0c5dae7d3179b7bf1489e3b75ccd5353bd14b70abbb3d447e3f3c70492f032b69e7daac4e10cca777203a06af3fc4a3cdccb5e1038160396710a79dc333a66fdbe26b4da0c9a87936194be8023b387ed2134f3f2b2390665d99ad942132a7950303c4743a489b56e4d303f14b23925052acdc944d60877c8abdaa0ea2ec7b48b9a7024df037bfe132331749a1964c697fd98c739cb1624872381dbe4d7fa8cf1986957e3b066fabc08082f27d11e83e4175c2d35342a0fbab8dd6a7e04951162075ce33a722168050185c0a4ba8f8b00bfdb011ea59958cd51895297e69ff9da1b2250196ca6a525bf650c408707ebf8e90742a3142347daf2c7ee885672fe74af841620ece8ed1a686efb8e69b6ff2b0178e56b33845b8b03caa92ac23ad4258156b8992065c28bf66b0de824b4d8350f899ab4cc344c1654f9aacd68038e8696523fd7e641b3cd4f45a176cd9dd82600d0a57983da8e8f0a160b7a2e7e22ca9b91ab1250e7b6ff05f06978fa2890292664c66d852b01ac79e49baffd012ad03b961f73f7a40bba503ab1442aeb3ed8d9dbb528df53eebeb0c66bbd632dbf6da991c573ca103eebacb73a54d711280759826fa845b2b3f2df91e41041d3d34f722326be8ef6e859b639eea737f6cc9102d39e4c35050ff8be7ac92d60946ce146727da872b1ac3a1e4fd347cf38ad3f104869958b4ee26096aceda6f4aaa634dd7cbd0a2f537a371630c5bb9913813527538f3de6d79b1f13e8c153851b604bed0c701c9084bb3639ddb2057fb5cf234d9f66fd84ddc6dbb4685413184d7c95e3b3ec5508bebdcf96c9f915718c19876581b45b8287a37ad89975e99324d1943ba661a707dd9c2e1d2c31c1294c436de10f9e26b9efaf7405e1a4aa1b05cff2a4904424f8f6bda58da8152a45415ecf7e39f81eac2c27f5dcae4427eb2657963e2283dc7001bae0f466bcfc367b8bc3fcf93ed1f9886afe9309f1aea3a5cb3864bbb25ebc790f2ca44e25a1cc2d39fed4574e80b070bb95ff8e6bbd6aa12d8af073b4b694a18941086721a5f69e8a440fd1f75189da75ff5083d6bffaa70e04bc36782dc3ebc718c82664544e9d2cb3534001f1382f1cc2810e5c30f416b880d3ca4924b2aa3c7d6bb51e963f84f239dcc3d10eaaca704dc1d515c8c846cf9911ef3e9570ababe64f1079a67f46c4cda2d9f7102e6331b9ccb409408a0b3bf5991eb04903284a98980d1d75a2cc9094c105c9b64d429bc3718c4e81cb47472f8e8dcec1bd5e13f0c0d62cbb9b6279496e53f71d71afcc5f92e4a1dcebd5dff69cc3a61adb85d6d160f1aec08c7293fc450f3f70279e91cff81f167af05d742dbf09f386375e5b90ac9287c39e2d30a15e0c4469d41dc906ba196842628fecffd82d5b5ed0007e4ab78e5effb1d98415de3c397a6b02ee69c311bd7b9b7901015d4ee277c59dfd09ecc4ead3b97bd891a90bdaad87f43a83a8691255188421af19c94ac9708659800a727cc125bb1bc2adb104bf8bbef9f3ed01ad344513aa88e9ce5fb64ec3295f1d35030000000000000000000000007f72ea2840cc7fd9d3a28062b322e12e3e7b4aa622a62033a8d7acc49567e7ea7949a33c2355d11ac81d5f211de0c0e2b7a991f543fd3bec9d1cbecf097654ed9e486482bbef468ab8c8fb89d4e1c91d3d2791bda43f602d31ff29a68d997b2a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000909a459200698f64bd6bb297dadaa11fef2d73039c6b2318cb4b0196693d4b46b34262086bee7edf7cbc38d648f7d3ce72dbb294a0ca3f1ebaec4de4c0970a2b0ac4f9409ac1eff2541fcf9d03682fff5491220781fd5dedb4654aaf75da74568cddbc2ebaa75c2adbc1758228f80778939209ba1b756826bb2219b61c522ed4020036de46ab254f9dbff8de6cdd1fa2f021d26b48c8e80cf56c0f495b12696505020d98947795451e3c410741bbb0436e0c773eb30f523a8828f88603ec79d79d3e0a07ab74a4314bb7c3cf617c49f9e3e43542c157ed425b9d5c1d1a5a81cbcedf8bda85a993b9e1b86d9a8f1cf3b00e1a0c9958053a5da3db881f8920aeb57cbde90220ddfa7887e3dca0f5d5eaec44c0edde5bb3a47de51aa824b618d2739e21539802299feb4c7ac163d8f5b81aee896a35c8f411d2e3275e55574cad0d2bb663c37902298c10357773a86f7af230d5538e9d4d6848e66fdca158df545db678b8f74daa03189fd7354c03666480efab29230a520556d2f799ac056649dff08ceec2584f0502182b491e4f699ec486f0e76e185b0d12dd7bfbc95bea54972195cbcfe69ccce5556ab4802c14079ac015a75356dadadb70980298ddbbc3351d77cdcc426b38610f55e73a71dcdd74c1c819ae200733367b7b9325530bd3959b89e27758e1b666acdb72159a497dd12b63cf05b4586ea62afdc2d55468c526af898576513d1742b5ab9bb5281936a9ddd60dbdd509931b89e8cdbaecbdeb32bdb513f4882a3db478e3212b356f96aaef2776ad3656f0c0bf6f896eed8aee8acaf1ff0f209f78f074a7e7e62e5cfbc9a1083d059c97aafcc720aa6cdc3ff700a0b8f3a79edcb5ccd2b9f2e3231b7448591c7b05ccd53f835509236354f1ad3a466b8e74cc85d7eb5e93ebbeecc304faf1999674117ec0e7aafcd25eb88922af48427c7403d24f8ba4396d08ecd89f4820c36849d5a3c9a47c5122a7fac1b8ff4306b7cf0becc52659b4a474e4098177ac74b6726b1a21712b700046d1bd34659b7d76fed27f94ab2f3bcfcfbc04c9846e1879e83447dea095597ec88da834afa30d10206bf812e393dc8c6f58bf0f28f57e82a220bdcc7a53baef0455acacdec94f63f549956fafd69af124694a72de114c77d109056a1f5ad44c4e4010d8dae65b8ce4deb08e2b71921c0814f8a0a9ebff2de2c1c33f90e3b13c1ff58e53cd9d2586de2322bdbecd55cbafa897fce5a02123df9fc09b38d93ca229b9f075fba4471363a1acf77433191de43d424796e3c103a29199fa2151faf1e4145203b63a3b74cf4e09f4d784fbf133ebff4c4b89850cbb34dd53b5675d18140fd623ac0ebf2b4027fda04cb136725072cdab8c1c0a44e9c849323ab8712cd7ef5274e864b7db580ab51347e0d0286931222d3c0329e0b7f953a73e95b5777063f4f21c996b2dc72c9cd8022aabd2f653e5d662c298dd5d185291607904f8f135c694bd54eab52569bf5d1b9716aa91add88c56c75f079f95f0239bd3d112a147da048dd966368fbe97382cd26cbe941c2615663babaab1b869485e805d7544cabcd11aea120b92ec2a0938276916e0622ab364c75e0eadb6c7a28938d96cfcc289f996b2476e2eff38651d32d5dffa66fb96ba2db8262c363448dae17fbabfa978c378f9c54e4e660c468a364b39a59722620963187687afb094ed51b862227a61d0a67310ced52d33c3638180d66e3b6985f12f7fe798d5a3fd939dea092b274ef2c78e2d37fc67621ad69767d260d10f338e74772d752e665e3704422b46c8e8917d4175f339525335e5f2cc30cf62e0a8ce75d51735c0eada8fc4ba33ed5bd1f06f50ec5fae1de530be9ccff026f67c74397423ce1eba0fb12d4cb4f0c31f0456ab8aec8151a29b6ef80ea3fa702065a3d687295cfc7e1c442b6a1990d211e130c641683e5c6819e9b7d3bf18df31267aed442377f18d4fc2589fe007664baeab21f7584808456deebb18ee6c67c26ce46b2b38a799e50dece843715090b943ba7c4da25dbc0428e8894f08dd72b5a3d10105c5f330ce9b0d108390cf53b5cbc842f386b048eedf6065a522fa2a14aeaf7636aa73372bd432f67b1a34d9615e5e6ea1711a666a05ab5f0f7a330f192c9cb0bf181c1a7d74b0a7c001e3a5e2302512ccffadb5dca0a681fad01a252c91534f5df3db587d49ed80a3aa2872a3109f5027bac2407dcf10ede76bcd3ee0e8e67f2ee2e43a6d687577860be5795bc1a15e3f6bec79240b649f726bf922269e6467a532e19e524eaecf3e83ac4830b3c0b57e65d4a6842063b245179350b3a52e1cf18afe1f2a4079a260c9b3412300f2a6a0b82f63fdc9a7aef3b432ac6beb91d1919147bb1d6c02d2f9b66eaceb1ea98c2682c3847a15052054d160fed17b18879c5dbdc74be180056d06", "535251656a52656552", 1, -834111688, "9cd0f63fb14ab2ab4ec6de48eef93128086f72a24b9e9fbf94e55bf646dea046"], - ["dbfe7572010734cdeb4335d71807cf9eb3d64366da190b66a39927151a60e016a239855cf203000000025100a2891c890197dd380200000000086363636aac5163512b3a89dd00", "ac515200", 0, -1496075478, "1d679be7a8d1c913fd938d59b683fa01e69e2c993a9d39a088772c998b2cf0d4"], - ["3cec891d0317570f5658525e8bb2542ad242aadc7df1de30c9235eec4aa70eda2242dd255c030000000665ac51636353ffffffffabe17a627cfbe008a7d0f92119028cf26142d3357ae8eecd234238071b5ae55700000000085265ac536a0052639f344669488b5a6b0393076eed8dfba8d360dcf7d240bdc9df38af6a23f93d33d7cf9e4102000000035352acf6f5476b02fd3cff00000000000200522811fe010000000006535352ac630009515d8e01db5347000000000000000000000000001418fc1e80cc1ec2fe32d2eec080c703fb30d18b4fde3a88872c9c844c46969e0e2e3284396ddfe08621392e3801750877d045bef255ebe79c472ecbe2b996b5605ea7b122313d421932f5313a25048e9131dcd0927b1c0f27e5ecbee8756c3600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000be7cc7edc16dc3255260cec0865d80c0b5bd921c7686d41de8eef680f5887015ac77af16b1bb515d2f42271d5d41cebc81f5b37b973088099509ab4fadd70b3ca1550c9fc124a23434b11ca67d5f997a2968f71a63f66f338b925f5ecf8b0bafe63bd93e9e52f1b0be10526a298121839e5a708e472081b1f5d9bd95e88b1c94032ca7ac98a5c063f7b01b96f8adf4bbe9f2e2eff272ccb84f189ec98deae352b7021c08b9c0d66abeb6805e8dea323dc70a273afcad7f145d89a0565847f17582450a071bd24a79d7f1c2f935719cb19cbcea9d4f338d24231d8f7edfd49ef4de8a19fcccb6bfb59e390c1c3e5467be59da800e8888d2c942977616880c4c28db4852031318b88dfa079bae11284608dd672553557c877592e8094de1cad2ae0332bc5802139597f6158596633c9ba872d8937a928274fd0c591059132d49d09501c91502022eb1ff9c1c78550da98fa244bcccd522575c9564f162857d5d617038a0d9512a031b4f1eea24b69760e03886f44fa383bb15e1ba2fb2a6aac2124cfc43971c61d8032dcc56ace1331b126171b4723b5d8e297d41298f189c2c946bc2b7f196a6ec3877eb74680c6eed586a38654e214e396839b3d04e378b79242e4751cd4544fdb9102e0d2475582d0ba558b9c3bc09f40152a669765c765c3ea0acdd36d31feae98f69bd4df29139383e2a1b4fce1b3ef695f6573219090b7c651912b80167d5b15fb605ecaac633149d5680132c9a8dbe8669710a8d441eb2a5dc1bedd3014bebb0f5817bc35a0676d3b118904bffee0b48e3dc5a83927e4e52b46ad0080dd1fa51d82975be54dcbb7e1a89cdfc211d48ad1d3ccb88523902a6b7f2740a53385fb97117137d6ad27a28129e5d543cc497535424c4035b2f319142aa3df5acc61e8592ff21e8d553cb61c07691aa48f640aef3ab6a26c2aa1e4666ed76461f0136f4333db0a468532f5393d9c670fe3632cacd99a385a18862a7a25321e89f5b456b1b07fb59133bd1a8c9db4fe9f44092cb0a77cf835b5cb39c6bea7141624fa25e2e1c1b8318dfad99a9b924b219f75f2cba01f221787323ff78b83de49fc69598e61c495bec597c23b3de037a9904975e031a5dc7d82f5e19d5cde3e7c35c3760253a309f3f0081cf1a6b9741e6fa4fdcb29d5cf29951a21c7a08fa940e8dbbee9e0eb0ef420a325abc04aec968fa49feb7e379bec6e522359ee305056dd45d054d7202b24010e2e59b036293070e7d4b346cc051adb57fdb32d5d2fa15868c5f330ee9fd265e55c95cfd56ecf8fc3a1712e9cf3dda37e0dc51479e850e16eaced1bdfa87e4cac4bd4ad1a09b5bca08fa0e23c330f7f8dde8f02c6a7c6afc02216ea00521ca7824f08fa688e5112ca822db78e8c04952c81c72ae6000510fc06b36e169e7cf1475aabd17b16ab92f572e3ff37c747c4838a5f830394ada4f703a673feb259f81786a9399351c7036b2b04db94df4d7a1ef27db9f922b006b0cdb1e5a3a9d759f236cb294d24d37f0bb54ec74537d824f9a460a985d66794b1488e8a77285600795d7fbacce8944457f19f77609a8f6c8067e4ac127ce638fd27f5ba4235fb968d34d154923e744ba74bf5c0f5d0815c30a7e292c078acec5778c8ddf9126fdb94a33e25b4361fac7d6fc9f07e781ea394fd554e2e55d6fb9d9c62ef80219e3d6dfc8184932efe7172be756c7a8cee293806f4c44b82da3b9709c2be6fd823746846ccf55f3e15f190bdd2eace71dcabaef3eca31358471021997b2858c219158d028a26fb99271f3acc141bc7d83612a488b7b1c6a976cd023d3bdd575c6532faac85897f07d4902cb9665794bd02ccfff0ed57f9f5f3827cadb811043ef43ceee0d190f7260d6f3874b010c548ce72507f059f9fe0e72a581adffb00255642e6cba37c24f6922a0666c45b0db41cf89decd9d093515b48a8ed2cefe279aedb9b68f8011ac9d8ad31a05d18e612c1ed531d9cfcfa5391c761d203347bd7427f25eae5efdddb6f6478338fc83dbf2e5206d4e5978eaa4881aa73d35c930b5c8abc945708b10444bc6b6ee17a354f40a43fb372499f73f79bf5b6488f06e51560689f10c28c6ebff5b7ace1a2af1f9d85de5df4e58b90c38e3a6535ccddf274ed740aaf849592ec46a7f02ff785dcc39c261df0a421dc7733cb52012036edf49ad84239c6a41fcefe87d1e9b68a14bba949bb244a08835676c2ca1487d13dbd786b3620a79bd6c8d31cd1b18972402d9aa74fa9883fcea22777f31e26d41c9477944ced698e66f403baad368fc75810119a10d581d318b4cc0426401e6f5521aca35141b6bcf21f323a5ae70f222db8d448134a565652f0622d90bef7ef6d393820086eae8a25a49ffe2fed40364796687032b81bf431592430d1391138ab4a1d850026e5e8cff78d4388a0c", "6a5352ac636aac6551", 0, 1380502565, "538fe7f781c41b1293988164a70a75f1ada9db38edfc2c99692e11ef16b09474"], - ["030000807082c4030224ce0bfe62e64644564ae7002044a760c6a58a0db1f827bc57f054e727c75e560300000002ac63b8e0fac22bc46b91d4562508c864433216f432b9857fb6e03ad690c6402554dd8db26ea403000000036a00acd5dda85501c0ebe9030000000001530000000092d9a92f018daa0e030000000000000000000000009fc95e35111c18058229a6a3a5bcd12cdbb5902bc9a47cd575c80ff2d4064efe4e8a6eff0026f9638138ca13b9924b76f343580797ad05589cdf7cfad81240860fc87815d990a5c810477c9057176c5e987861e6c7a2370743f60a0a13790bd20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027b976d2aeaef4a273194f1826efa60a78783c980ab286f4f08cdeac7c2bbc24a25ad6ed6d07b26c5a869d31bbefc60ce189a688f265e3ec42e7311d0d780f0dcc1a891e7c03ea37a05955c176ad775ca133c331426571acb3f6701548c88812b370885867af247db54c05af79d01aa0fbb5444e8b27438cd1d6b7639c21396602271900dcae98047bc63a7b1f73e817785528cd752c4484d2690b1ad5682c054d0321f0c9c9e8b8a939327b8f11cad9e7c13b87805e02de2c8a585d8609e71211ca0b031566a739f64431564089d948eb5f23681207b487fad9956d28bdde530da23c1f330154dfe156610142a3992bf078e66a2ee8c9def60d4bef6e4e1d1b6ee8b6020b84fa5ab7c7b3cbb2776a350a98672667abf2f4c44330fa3e9f33fb69cc84fd0319a9791c383fcdaf0df84a3e0b815032d2357dfcb9cebfe2818707d4fcf0aebe021ee997c6254d472e92091fb0085d5833edc571ed7c93f2966c048eb73d87a79e032247f0f2c9c6e8da474c13e15e20c6d42e6658e46c74bd1cd3abc9e9774aa9e6021f3496804d3078eeafcc36b57ff791d6b2e9c8837262828a5b563fd99f0e4c9d7592a359ae092c1c3b7c29f0e5e9e714ea5fc9bfe1baeeff58f60ea1d124f0d625752140a655f9e8cc6d4d96f72e2b37624b66da875389fa271abd0f41aa9ae49062e8de9cfe91af0434c7f7fc2a40645a82b4146ed7ff1f3f32c191e85f964adb8119c16c4aa43390fe0515b944ae1cf802acee1e1d5f95629ddaab03565aef0b6db4d6c730596aa4fdc53a6d083a31b5edea46b804710ac905d45214775ee838e58fac6e5750352ddfc358958db8436e840a40e32bebac82dc4d9ccc374a3cdb58c3da8b7eccde016d8eed8e2f125ef05e427589a88c2b703e2f6c4ee00ea30cfff449df24e9e9421d1a3d13885f571c2b01c19100d7aa138873c515c26cb239b22549bed3985a261fe10846fe9f171d16fb6b21af8b7e4a88aef7117a871b8abe84e98951ef95da1a47ad8754a3a9e94b86a6cda7e23644a0cb7bdd1a9148226fb6d31a0840059dc47c3c0dab1cf05bacc475c43d3f0bfa6e9512acdf44e17525d86675d5ff5906c3ea56e05025ebd505153071e7cecae0c0e7e6a267847a1ba74bc65f425100b636ebb973ec8e5b4a11fe76ca73939947963e1ee491a54c1984fdbd7b7341667581c841e90984647a92cb3d0a7ad558a61213941a44e402d2f812015d7e5a7b037fb5f19bafe75b4f04809f59da0d6292effed6bcc64c4dfcb8c82a4298b1ca8d286aea88254900cb8d78b36aa7c3b9cf7c36d41359b2dd27809eb59de540541a7bd7efd7bfeca8d1e25c81da7048cb6a0345a8c5d94cc51cd62adfc7ff72d9bdb41ec0b7c07de7b6fd4f94b202ab065acb6cb9e754aaf778bfffb93bab9f828a4238472c8b55ac0d9ff19cb3e539f0baac5e243443e66b076e1b84dc868331d91dd6688d9cb326feec631e7216587dd2ceb235a07f6f462f4bdbd4748db07a51c9bccb728daa1362cae386719b6eacc436e0a4ff4376f4056b4af845df3137c9518c9c6fc3dee1b3997369a6a0819df537f54ee022b21e008ca60ddaab088908108ee51e372ab97f910deba5e6f0890c0b1f902b40aa1fcad3869cb8e93e536e08d3e213b230ace13a0d54f96d5a1c93ae9fa52550a424aa68ec321770d49bf5087e5fa8b3a2fb126795731a5c8bed89b4efa8e6d749680119d26381830e4b836fc06a1eab44e27358011e5a01d34281d15d4958fd4c25baf65e84b5b6533efafd568bd3402e8318981d9247b9c7b2592bcc24731e1dd3f98a2443ef24b221c8c69a7d46b3803dee75d3353999b623da3eb7c8b12e08dee7e21fdc8517a8eeb0aa478773302108364de84698721d2c8e6d01f7c33a2b50701b63459e69cacb782b2cd4565b638c0b8741901a7fa08310e1a44ee1c2ba9f4bc2e4a7f42dc783f16bcb1ecaed1aed4b1605b5405870f683ffa4a359d3c34e05a2d2d715778ea9c8366b96722e3ab647d09c6f20b68fa8aa6d0842d4a34c6c2a2aff885e2ffcb7fb5e25563223e21c31e7dee27e5472dd486286bd9b264591db2ada94e165df4dd3518cf00f4c687cd566afd1193f6374cf13c349a2cfe1ae4f4a80f603a245fefd708fac9e740f6ff483cac655b15182badba850c908f8de065b0566c4e3a4684248f1d8c2d48d0719794b18523da5e4428ec69d14024d015353bb09f47b9219da36acfe2e217e4aa6a2457cfd977d72873a3c2a16689a41d0812435e2b138414582a096f305a5da49244201e350643295513782c0a9987079f36ee3d1c5d0bcf19a50e81b4d35efcbbc9e8aad21c698a6c49620f504542318beb53e67a6727454f265b26e9d380052ae860dc3bcbc5853160f99f1933d8cfbfc3bd054c74eee5ab9a7e3b824efc6b101", "acac6365526a5352", 1, 1548863344, "cd8916abf95eb28b176b346223b1a27c96cb01cd321cc8322775f82774fd2d22"], - ["ffc1137c04a446f4758fd8272da309ea4d67d032017d522ed5b97dc4922483bd405522956a0100000005ac5163516570a9835be18f61f81ead9ee035e6f68350f80ec546a487b88ee22b1f468b19d6d9230df702000000066565535365533f219390f3e4ccbf98940957826488c66c9fdb1950e2587ce9316a0fc0c3367e86d28ea501000000065252515352539deb2c7bc67af16dcee77630a2032b525d8db5a999c5ef940266d9c813490ee9bb63c314010000000451635200ffffffff019ac510010000000003acac6a00000000010000000000000000d8ff9604000000003945810ba74b2379086cc1bf92cc72b581c4ca92fc8b3544d76ac10a34a9851ca9efeae2a7d2518599223ad98a5122c079eba2311ca94b0d8ad3c83a737c4d3a05581e3f90d097e9cb6ec245f397214d5b4832be3d0ead716821190dc464836200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c56e5a7c6190a4d88ed6b3b54dbd4c60cd77e6d72530e411fde75f3fde7044011b3ae7f72464f31bf809ae2b3c10e6d729f1e8ca56900d5bbc2b277f0c7badf79c4c5b15fcaf5608e2e187b61893220eb32046ba028dcc103beff2f9462fc16c10fc6d0de44c55ac38a8125259443dbdf0a7e55a63f8e3af41ca05a7c3d33cd0020c40907e3e42cf8d0d58708524eed675d808d345d5251559c7c37bfebcbccc92020b7e5e919d21fe30fc3029fb6a44259d7ebf76bbf6ec884999e07df7fac775e10b049771ef8af1c838054d73d6b9366ab4b24757e20d3c010a2e160508a9c56dde4c33b934ce50c7804f28017a6f18dbcf1e6ed45937b7c1148aba94d1cc7c48a2021ac9d3944e634aa2d8602f09442ac08b417e368f55928c35e0242f996c0e41a80329dfa158be568b5a3dc69b2e4839abeeb6b28c9a2131b488ccc45fd01b155eea03292e3348de24eebf0fe1be3477db6a7ecd00307eee5881cb332112e63ac7a8f10208b38e9010a72bda5e5a71647da6674b22c341ecd50d1a0e70523b508453f67c0209d46dad7575018dc5727267b9563e1e9219d6e4d426daaab3d37b7c7d83c25f3292a8df598020717f971f7125a0902d5b02fc28cab4f3671dc0269d86a7c4e5c6843698d136cd4331c5d24fdad44062bdb95d7b527cff44a8235588778e23a0f27f5e3e9411731a0ba955947be463eefd8a07cfadb679a862bb156991f1b3e221d39eb7bdab868e56b04fd2bd6b95f8f1cb41dcdad17bd8da99ea376307117d4dba9ccda7e7508870977b7446655dc08b4eaa5d4bb759e3f6991b627e8a326686002234748cca3fe0ccd180cc5a34449c73fda69c76bae59234ddc4b10fce8155cf97ac73ef07882a23c3c63d27e6da36f17aad19d4aff79d6a185079c145bfde5f37ab19529375bb134907bfc5efcd98d7faa796abdc05a72ece7c1761b80257b55cdcbfadd77cfb6d0a9bf49d751cf1e581faf81968edd8ad9465c447509a3fc816b05e1fac5692c542a7693461cb6445288cd62a50d6baef5771e13517d8ed3228b70b1e764f35d96230d0e81420abc9bc1e2c373f1e1e74d857acc1efc79c2555940f74e7106535be0e0093383be8b3fea829daca261119537e4db3468da6097565e33fdb6d90adfea36f3fd48b83370c39ca7ac797a077473e18e9b65972ee400e670bfe2f43d7a1804bf9ccd9b0226c2b7a71030e00206f296dc885f995012ee48355f4f35a0098dc44045acdaa75a1c71916359ef8c5fd84ebd9059b26276b093dd807720f6720e229f2d28c99112c58240f4cdf69efbde837212f91314d9b25f4daf87b00189d9851ead930db655c34d4e771f1fe0d04c3c1d275f0113ae32da40c8e036cefd4e0764b489909220db038adf06fd43a2ad3306dd1f476652c22ddef73b803e2fbb7c1d5790fd7c3e954ff49b3046c4fd974505f94c310b2be9b26a816cfb266c27c6d52947959be709ea9ed5da5387744daa22c5c305c4a6989a7463dde6084c05052ec95d8353b40361eb8e70aa65e79f357da70fb9b4e449a7919f1b6be3e9085370903d0bf152e542b4556a90d79f62558ca2d2ebd4da05e531f19368df1b8ef9e5a7f9bf2c99a1995ae3e5f08158f93d730549c45c7b78f1fe19b2337046ca4f416063ebbe952931ee6fd33e3309a0640caa6cf48997630ed52b9c478c47b04f08a80eab8f664f717e5648a811d0f04310cf2939dbeacc32a743f9562fa8d8e97c7d0abd25bf9330226924699a16c1180ee66a8cab1f7c1140bb6c3bc5b3b4698d459806f222c13ea6f2865632cae882c290e0347cf07cb88eecee8ef51645ad38200fc9f56cb2933de82b75cf5dffbd565ac64391ab9055b03ffcf6bcf5802acf433dd4fdffc8e0197f707327361cfb6c09c6275ff2765c7fe932f1afa5c4c7d213fa37c817c0e66dd1d2d3116c9e9b5f903ebd5fbda3d933e409da5bd98eed8215e2b6ca8a69eeb557341aefd3fd0f721eef401745e75ae22fe6cf2fb35a2f28a73c360e896e225fbdbb3ba593cc1785b72642af86a0b37f66464a95acd4c2a67322719f46e3ba6ae19e54b6b82adbd1116f81a0b1c00df2b6e9cecc9b3576ac2933f534be9ea17b57d4f43b9b882912dc56963ffa12b63254c3dde91dee49971b3671745d9a200614ecbe10b724b56e4e752b45aae6318e9aac4e6fd47bb330e79e18fe769da48793d3a8ff576a1d495f53d116e6bdee601c79457ded36b51445e6006993af1fda3629a4344648fabcbcdb064a07a1070398a8f45196ad6fadfc039428d0e467954a3cf922594a28c2aa0d30de4de014a78d1e74d35a45ddd467cc0a4ace65908e2b68b5b60e6287b7d3d6a7c6033d64406740bcf5411d20fc9bd17e3350354c2522d91d854e2e77850c0654d22a995b642c9c77779a9137bcd8d2cc10d", "0052536353", 0, -536981457, "5f93b18545f4a746540554af387104e6c79ce47555cd8ca61386f62470dd03d0"], - ["ffc9973304724082e889931009a06a9c58f07bc0d43662fb7ec1486a5eec57ddf276a62e530100000008536a6553ac51515215449dcac0a9d1d33f9d648cbd9e5b34cf35e9999c664816e00cb7274d96c72c4c6c8f79030000000952006363ac516a636a77c81c87112d7c8f88f11b21ac2b2e6f79f367f2d593b592825c5eb3c71a8bcc12c201a301000000060065655252639d414e8d3dffe57092c2b250cb468f653efac618ea989db1a5a8273624f5104a1eeb60c00300000008536a53526a635152ffffffff010968630500000000036a516a00000000030000000000000000a75e7d020000000028012a22a72a4ddfdc911354033095018ac038feadd019ea3ab10f021262295a64531af3d00f8ac589eb5d45319fa32d9e9be133a27fa280918705084d03d82ba530283f0bfaf2af305279451068a9f287e9a9d3db70617eb7e95fdbf9926b41000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f426449851182684d89387ea111ba1060eb223b892395c7c3e435b1c2d8db6fde92e285a32446ff3485812fc6083fb3d9e954651a7e960213a067f059af12aa61c1af2a98efdca527c4769944e8a572b3e21b32f4cfcf94a2df2d00fb9f0cad826f72d74efa9cd72f66563ff2dab7dffe5b34bcaeeae36cde2ffb1d5cc156860218ecabec6334b19977e2d4e5b576b5b61dc1ee464a9296e5410f99e87c114d7e02049017d994e1580b3e524f83e4d25bfb898997ad1b73d6eff6ecf7fea92fdf150a0001d7dc25737c1276186b612545591845e93e314c1e73ab850432c336a0940550f3c0785b3c814e4f30b80d0dbdef684bc2560c2ac6583cd42be1f861550b4c022b81c24d61c7387ae2aa2538ba7891f344c9e34f1b5ec1d80d7063ad0ac045760227600a155b8fe92d3df7637dd00f1086ad0860652e4d5b3c97cede80b35d09e70302be08d0598b9689ddde86195adbe0bb62c0546d2b24a9eec657f735dab262f7021f918ae8bbdfc837730bc4b9b6699c6ea2592c025c95324edbbea366478679280323f4d7b15e8aa6d2fa2421d81ca7741eedfaca1cd45970d4d7e386aabe26c8df9265ed8ca555dc8f648d3e0fa689c800ba108e15c88173a27c547963417df65914f56edbb1e4cd4e3547530d752503e2667527270070481b8485034360d2043b0cae7885b8efc98c384db00b32f1f8232feb440c873260b392017ddf179ef19f7e8c6c713e408460681a577311d95364ef2ca831070c4cad57b9048fcd617059ac8eeef3aa2e30bf5a779dac3e51bd6de315f77f110c27d390e59f718f3654ec84b34a657135c1e10aac04e7886560fb2a7d7b030f968d75bde9b896a339ff0167b2006d6773d6b69ed7f4d6c5dc1d07a2d951f5b5d992a913049bf686b86756181731ca3a27ed2cfd2121df21720458dacab2760005ad75d94f8f1cf2b47d4b5c6df13fd3aa5dfcf4d0744046a3a77e7ec8ab527872aa175ac58a9ba6767a942a1d610c4261bb1693d1821942ef8d8431f955042f0884c0a08a1181800fd3dafe8d8b8d24cfaaa5cdd899032e9cc3b9f0498846776992ecc094bcb315db138dc5a58a8d575656f5676b2747385e6b581210c4873056bed883f8087ab0c08c9eb22cc1229c5db9b4de03b081ba25b661c11ad496857bd1ac0dd60c9d0bef5d096d6976a42a8e500ade7cc31a58c8d8a61f91a2fc30d587d3731d5a87879174c3aabd5b643317905d184cf1962406cdad0694ec680624c6dc0abd97699946a43e222aa4a7b8896461c0ea9dc1fd922c707caa503424ddd9949b13ac810b68e7524976646c5b06ac05e81ca34fb2a13a38f06d09379f0ac50bf2ab7d961c99523af86109381e649f2047fe73eb8ce51b4e50238c1c40e1b231debc00e9f7b0d061c4b5ac65eb7f785686495d857746c87fcae9228f184e2b76307a59e9fd739fe3b752b4c716942a3261fc5556590a4c5fca06bb20d9a303cbb6dd92d123d6489d1ef3abde3d9128d4a8ba164412130a9ed93484cc7f9e2277d067950a45dfaae276cd8ca0c9662711d064e7ff623d2f94614d870b131b6267a3c1c482bc5ffc79a7954b0cad893342e35c1d3d0a4447cb490ec343b840e233a60b51804996c517770e1b2e7585cb5af9d2d6b70f443a488083c6f39e19a58fea82b8bd5f600117fb707bb3e56f4128b2a372dd5cdc76f67be22acebb624aab8b2d70ac5f50c88f687b440cce80a0eda47902216980f20ec44543e6b10d3735371254097669f740ccee1886ec3ad80a210d662756a15a4ce883024f999cd3d28988b40a611b6e78dbac53cb6ce01a62a6cc50a020eefa4d925e551f082dd49f1ed1e6fa9521e587506b295f338fca969cf673ec65dcaebccedc0824315a897f34587932c3505cbd3965db6fee8f318522e2b0ad8cd382ffe3c488baaca6afa25199d97f39abb8bd7d16385e1754d72eb8f5ac27e949455e9d8bd43c2e17238425eab3e58541bf422448805c43954972d5e933140886b7219edb8f3a80f7098f088f61c7a9d46079ea9ec2fb3223ccfe61feb20995f7f4cd5cfbfc0352d59cbea7d19995262390893d9b9e12482ede2c956e8037c537729cee8cc0e9b862690031c8f5d5da66178fd13417dce32a6843ffb6b76ccfb3f6c9ecfeb402d80969b97c6f7fdfaa117276adba5f9ff67f69bc08143893d8bc5e9dd1f8d0ab161d8aeca0ecda92764b969c26251bca3de99af8e5a76a3745fac341fb497694fa0a957caad544002b978e92769f002a4adacbacf47bb4ed6641b0fe3b3e9f5c4c03000000000000000000000000b03903d27d5eb87030fc9a141c8e52304eac40a95a567c54f7e18848b1baeace9d268e3f28616649086077a7d2f845e226eb085c1774860175e35989bfd4cda072942c183e6cf5bb0dcc16f25b2975bc5f99b49b0d855c53794f73e3e7f5c9dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000781fc3e4576d536efa1484b4d6060f35ce20e7c8d851e5e9187ea94246c00c413e5cfc6f6bc9939d8f46ffc279dd83f18473f9206466652abe6c79e227b9ed087155592fc4314018c59b3e525ef0942e91df7555b1a31219e7d6555e30078a934ef3f58c9ef7e7675c98bba1a3962dd822577ad6e0cfed979e53edfc53aba08c02015b2db95310931a35446c23e35375ef6b4c82578e14af24a0dd71589712396c020d2b34cd02824e876044539cfa0d9d28266e8b6e5582b6adc6dbb8bf6d9f9f3c0a00f0435ce565b6e6a4601f7a8ff9586fd060d85954ca91d365cf1d5ba667fc10102e19c8ac57e1f9175e0e9e3604976624aa060a21e7668ee0aba7fcde18f44c022c650db58887b32c53dfa16f449d4d5ab14935a1cd3ded8bee7f648f70189e1102281fc1eca4ef054bddaaa20355e8aefe04eabfb34bde900556b99cc384851b1e0200c17ad8ab057da9ed50bb4654d9b4598ac723a0dfc76034314bfc6b793b0c2b0212231adb5b15ed73bce198f2e7f5b375e28427503c1b75ac577abafdd5040f38022dd7b439e49a4e2f555d8af24a6c2c3c9dadfa7fd0001ccff0e302b9e64c268826cd4521df8c96bc6c42b98ef106add5636507c6caa47d7437051e6cbff5d9b1c31673b71ea25b144cb3cd94a63501e82038c43447c75d5af532447899916eb253d5c6859d7582a881bbbded32d0a816133fe55018d211fb679894cf97c918e9d4d5c9022b2a2d448ef23298ee29e41ea69541302b0a7f7dbc2808ac987583b9af2e81a2df0e60044fbac39489520f61673ffc739857bae9a46865e6b077eb48e186847631f683d275a8286dea66f6469a2dddc94fef53b536c888c4dfc9a1a27d1ef70ca4d6d81dd5820b535c624b9693d3a68749ff21170976897c9e8967c6d1fd6f8a963df77b1117a1d3458d8e400d839691434dfbf4cc4dde851b2d85a8915b1da1c0ce77623b5d9940c3b08858a18c194b6789cf8dafd970640a830848833382681b334cb437053bddd9254b05337795c32fd4b12b0dc5f61f24f7d13083324c46593a5ade021d28d645e4bf8d45c7745ff7529920d1e7782827cdfe7ab1b904ed696d7f7def24155925a9aab9a64dc6db3eac4d9e9f5c105e09e815112ed5164f94ceb99eb0465f4e5d9ff8283701ce9771953515bc861d3bc1ea58c940f055545cdc8945c1b483d2787af5fb756a46eba42475256e09e3c6a568f537df2ff704ef348ca833fd792cf3090be2a415a403fde0d5b059f5245461fde20b79e61890f4a48cd40adee09223f75356b7f2b793a57c6a67b77b38b588183809bab92bcb615654a484698253fa4dc62b4aa0635b77efb2f2287048a5ffcae246529825259f50086bd376e1541e3f5c32a2821ffe3b8898ca6695140be14089b383fa0cc75b77319bbd5d0b56d7d0b8f81131d0dbd8a87364fa8bb77e1864d0cad2bb181a2ca2afe010195a0f791325d3198d77089c7177a7bf0f598efe90ae72b46c72e255681a8cf09fa80512f74903928fb0f1f7f791a5928e71fb28ee7e139f7bcbaaf68bc4185deb9fefb1fbf18f95d4209fffcb1c8ee08cd8e10ce4660ed8b47e0e8725016c37f7c9fb202b243b156c83f8d1f3bb08f7f0feebf9fb2b844ea7eeb5376d1159fa0d939fc8e9067a5adc4bedc17e5aa02d552e8de92e720dddb82457edfefe1547c07c76e919b880435b02be58944fb3bb5f32a6360efcd602d0c0712e84c9a061a3b910a82b7d2a9ce50f023e14b278afa991926d4b4f201b96f65c95b80c061f1f2b07ebc953ffc46366b55f2b12a7e924650d2e87c926f8e2aa6063c111b92d86cdd6eb5a34a3f9d3661d9ed5583d6ed9bb06df529f8db2b4d453ea6a4730457182f89071e039453cf655d42d5925eb44986b2d2219ec89932cf36e9a12bac5664afa0a773cd096bca356076f96f9e4710206923975d364debc1a5f15ac96870e46065eef1455b483e38a46f0bf775d08853c7a3095d3dbb893c987f2c12c9707e600b1c69e732c3e3653dbb6eb079e1ad641ce09050d39317cf06577e167a18e0b2e6ebef020ac64d82dcdfee9ef9a6dc47bb8db3d4c9055bbca0dc1c2cbb9e626bfc6f1c6a7842bc357b616e4dba5cd1b3de6d7d9aff4e4f30a2b932ca118bc433a0477c84451550341d4ccfddfc384b129833aa752295b99d5b80b81df589857fe7269a50d333476b74497f79735aea965a49cfc77411fafdc66bb2ff94a042d3f390972bc11e1f00ad2c12cdb401da6dd88a6adcd7d72b8c032e096209799dd69a6bc60491de30000000000000000280b9e010000000068f5cad81c8818ad91e23658e3820c52b54389a715a3df64d5a5329de335a3b52ea4ded028dfa97af831581bccfa89a500a75738ce043d8bfb48267ac00bca47faef9d640cb02611078895e6700b1078dc39d4fe34ccb8ed168ed06aa1beb653000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007d7c4deeee6dca1b2df1c6c77efaa99983107ffa4e22d05627e837d29f666ff244031286473bd26869226c1902f4ed1fab2dea695276ea43655430d5bd62e2a9f8cce9d9431228b974e6ea420519c695ab0b95c15d40e530942b80dae41158e59805e06501eb73db722e7a55b4ef3bb2da036b40c430c4e7cd1dbb336cad5b9b0321f84c6435544321cfc388b6f615e6863e1052a33bf3bb7e4d88a0deb2ccc5380324832ef94cc2038187ddb2274344770ad748a6328ee43b0c9d6181876dbfe2990a06b6fc3de6da11a7a5442f2b53b3cae76a81d1608af0fb674da6d12b3af4cabab900d73d5017bc793b533d7a00721daa9e83f1107780bef524406937271e3761032380b83e03ce0eb9396d9c88a7037d808ef439ff8c2be16c99220eee58d1b6ed022428c93457c5ec955eae89b29e6049fe5467f367f7161456c1ac331bfc9618bd0218b07ad1e11fa6fb396576c83a95d29cd51a9a583e946ddf67aa9e7dc5776c82031f9eb51a56e57d8c06048d7e7c294ca9a7fdcddaafd3801f687ab9798bc4a64d0219b958ceb463e7dea32854fed2197ad7c9dc5caa131bcd48fb6429834f1a4938bd1c97e8d71292f938f3b5703a2e9b6247726cde9a18820ed8e327205b55dc70e6c28b1e7eaae121bcd35126a11bec37785171b79cee23dd2220289a2e6e87fcb8fcb46050d033490b223412e95ef51d5df70cf1ea656e30cdb362dd634ea68903bee5f83d97fcba1a4ea0d4dfcc7a6c97c9f869fcb7e002290ca1eb717e65ef2553ebd9882eb97ddfba845a0668074473a52ff700ff4c506621bb3c34f979ff07d1bf64cfb0cfe645b42350e35e34a973feda96b70b9119bd485a7f6c21701e1e889e5c8310b8f2955f8de49cfcff2028b4e214adbc8696d14f05d55bc0da635d20f9bff77634d503de3e360604644e9a035e0ef318e40b37508316f3b3632478caf71cb8201334075d484e993e5580f77b591691acbe741d249767c6e57798bdd299dbfc2212ec4cb2fc31c5204eab85d535e9288c0320934e34390fe6947b11c84bca2b3f4920643c7976c600dcfdd63c55ecafc0674057ca856a6adc122d42bcb26a22d2b0d1947f7034734812624a32a45a83cc6949e73d2264bd70784412c605140a0cf149992232928df3069bdb56d36b5143bc741262f025f13fd121825bfedcf1fbd25117d96647b6f8a29e4134c605537505054fcc1ec634dde4a96c99fe872e6bfa00a8160b2337b2a0b1d17a86b4990a317f8a937ea86fa246ff46e58cc321fde45bb4fb5ae550527cdbd0adeded4ead8a4bf702fa920511573cf6941dc0bdb8568dc5db0bb66a85aac0244651ac0d8a3475a71f7c96124314be0a7cd66b30529381f44a9ffbb7418d47d015bf313fe25c7931205e51fdb135e67844ef874ec5072d3b6439d3994df65d75bd3c82946f06191a425902d82d10d20f5b4ca7ec54ffb01204abe06cdb4b639110544bb0648b878b5d7ed6fedc4b75fd052953f95f4bf18ea145b951085e59722728017f1df7161b9d65283f50c566defcf8c4e21b0619fbc6648c474c4dce3f64ea4d99caca11fa37f5e6846755b9d9b9d04a56372dd2176284d8346d73371a61e64e53590b2585049d462cf4e7ce953b22fdcf458dc68346e71004e7c149e6e2a5f3e50ca91db1e805cce998005446fd3750fd7d815f8232332c136bfea8c0958f2f511f6314b9e4f82da587a9ba1b908e8fd9b7513a441a89814c34a510c471f3c3271337ce3560c3c561eb13bb47690d391a50190aa7d653c58c9576813301c00d91f223ece10481af9bf926f5d4b6f1aed248c9a42f5bebf1d40f94dd13a462f012c8edc13445a003cb2eb17b3dc4f441db94b820cd37e4e3d0bac66314a8cb88644ae0cefb9f4958774b715bf1e51f2a38ceb42bc413ffa0fc259f5db5b542b94e64beebee8365f2b95746cc4115c299836cb1fdbfd9d35d468407eb34c6c490bfc41f87ff75c88ecc46969be64565de7ac974dbcfc44be405847b396be8439af6e17eab7e8598bfe46da170ec04d16a18dbc35e56376e8cdf4b08fe647608fb0b3fa3086d8a05628209f52be6959c59a24ea487b54e8996a919900250db41c0c165f5fc29f4084a8c4d9521f601702ae2b4d0c5846a27d1f0c17623c40f3811ca528ce2e1becd59bc380e50554740c04a7cb6107056c34d76c1239898c114761a9ca2b8f56d6f00443c7706784a8e2880eac0242efa5677675ed01b0215ab2a8349a64326b8cddad69c6eb95c66c8089a7126b03fe74afb6fd32fdc4f1c33cfaeea75ab05a9ac6e2f22debc1aa5e0b944294cf9a0a54f710dd0c9d207bc93150c319ab94af58c77bb7a5bda5a474778c7fb3b47b24c715ac223a77835cd4217ed34d2bde2f76aa77f27a7a6c725f3ce80f091c54211d685519f6f8bfd0d", "52006563", 2, 854964687, "0148c93891fd814ff24f47cc50bf3c0af377fc994f631a0836dbb82f43b36043"], - ["030000807082c4030139fce31706ca7b60284ea754fce137c758ab9ce2fb8737285ccd1fdb6d8ddccf01000000025252c4f33086014001b000000000000265ac000000000000000000", "65", 0, 1388787259, "dff6ee1cc09c826cde9eff8349fb56d7dbf429f96c48182e8192e7bacb52ee58"], - ["8a2f0e3801e2864e96f9e849052515cb3cae39b753ceeb0d7dc79460cbc9271a4471d7c8aa0300000009ac6a530051acac656affffffff038080ce0000000000096a6a53acac63006aac1f683a050000000005006a63ac5194dd360100000000045100ac5200000000010000000000000000467814050000000056a5eeac72010f33733c2d8139f710999ca376d6a81c5ba50b2e9f7f35ba6f55c1c1e393dc5b1d9390ea4ac87e504af82e7f20427c3e93d82d82819f026302e4d835648ba3002f451039ba2482393fb98cdacb6366fcadb017440b3804e5873100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2f9c0b3e589604a02f3d382a7eaa8e78b88616b596ba0348444e5e4271a89d92960001db93e35884a363f648fb8fd59ef6ad594a01ae6097cf4bc9e65afc5e236fe156c88b565b8e1126f78eab2fca1b432d433ff37da6dff0b2864326e448ca812a857556b576064e079286b36d84852181fea95fd7e8552f1b078cc95828c031f632ebbe77509656d8406d569f652cd62a8ff68c8ad40d8912fa2e9f8842e630321e4a266754be551ef87d4016e418af64ed7bd448a3d46a9149779a2b9338d920b01fe70fdcb6e1117521b7c628e4cc4449bb2ef53a2d85d394956058620e125af539be032258af55c744aa2075eea943043395c0a99a1a10a4138ccdf7f05b796032eb77baec72f3ce4abba586726571114d863cad923c685e3fb734433dd55f567031e354349e1647e59a18143f7798ff1fb43715d933c7b10e0b113a453741c3cec03031df6fdbe3dfe810d80448b258aa28abbb6c705dec3d4477f50a85523bb1e25022214bb1527af693f2aa50c5c192be51d6b3cdfa9f48be49af54eba9799c15781021df3c090a0f94cd1572693969eca9b42664d49b0bba03cbde12e493fae1a9ec5593a4339bfcda0aabc7d35beacd4474ae54afb33acb36f4f37ecda5fc2d4beed8cefda76053539c5ec35d4806227b3414ccdbe0ba836acfa3ac675f21c031dc5c0c0fae05e8576b06655fef25125e2333d799dfebfdcdd9debb3f3330671d8d3cb72d35b1fbe2b66faf07154c9d780ae46ed32aa02dba1c030ded13fbbc8f76cc2225156d783eeb26e0556b38e59da6c6ed63603824ecb2b91f7e8554ccff273b5519b4eb82567411577fbc01717e493cf3fcb7e6f6749b8ae2d469b946c8557227a9193f3d40ba94276a8ce026aeaee70ef3533ba2d68857126fe5b40735e4f0786cd8f0b1a46ac717445982cf13731a69b15956e281f22f4b7eb2b7131b421c1b39d83c2490575d42c706ae54b4434028341bde5b60e786ff85c1b733ca570a4e8baa9c53b2086ca6ebf61635eaa0bd365767f309daaada6985a4ffa45b05c00390a0bb8faa3fa5cd4f12a5e1682e0455fa263fef369e843662c01714d9e0a1edb207917aac7865f41a5ba993c48b1f49bbe653ae0d4d5e022f67340c59fce5574261e15656af3159c1cf6929506af7475cbb024ab5d1ba6b1e606ff7ba704b136c095f84cc6d2277595c3c7fd758716c3d5b34e8e163867f1bf3045d2cf0912f4cbd7b1e25659cc3aee817fb9d9c536aad07806523ba9111f9abb3923ecb0a200950b916e1dc4fa392a5d77e7ec7b2b896a879233a4ec1bffa9f48180127cca4b29702bd847a097ef5c0b2fdc36f362639a1a16dc621e8452c6bad4044620796765dcbfe38e4f3768c810628cdd85b6ef30d293ecd9bec0caefa62d9a6b2b21e27ca99abbfa334598850af0a34c7866ca93307e7275ccb16560bb5c643e576d4d2e1301bdef2b2b03629619b8b7aca57e09b5b80b249dd172f02bd82dd5fcb850c8d1c7fbd5367259149d50b6e10a0df5075beec435acd172b6fa8fed8990ae9f7fba94f28e6538944a2b4a5ccc8679a86f735404ff3306444f5fe1a1b6894d23ae6d143a65aff3d65e24fec89b78685909da708852d766c2b64fa7d1c3c469750efb63c807b013d829b6a71e8b2d82b296ac89561cd16bdb82a75a47a981c34d032966982ef22589b93c31338059c0ea1d561e9af1c23fa8563aae75d850b97a12bd11102719672f90e5eb673ee277d6c3cad064f3193f7d89e005e83e0f58a78bea5b662a5c4a2c13a2afe30af3ac954a9ae4ffc4f1a7b8b442ee6569030d527ecb5ee79c9c417c7e490cd10250a55b9e4a4ae4dfa89d84f8b99ab206b7f006499c6ec0cc5e66d3bd364307f30e6ea95e3754935babe995136b1f282f3d7dd2b6a779f5a70e030d1c4109c8babc94ee63c83c72e1724445cd44431fa17ce11c7ada24e463b6cd552c4debd5a42f9fbd87c2a5e3a94b0c47845c53fa8de74e44c280c1c3df7612ab7f93d6dca4cef70e17e8a0908955c1aeb6399343e544aeb896b6d21fdb55ef3e1092958d8a47a0e50050a596e23a59b752bc08ed5e66aa3086e392552fbb3a5aa14bc727ade99dd6075c36080d50df01fa30a71352df959945dbd0019952d3e9f4ed92d6105bfd90072baa6d6a65c5bc9555dd7ec768252bca43948c0ab0c36e03353b0a5eea13f5deb15c6a54b80ea4cd56fa087b7ebc95fa4947673c383dcd5832d8bbeb317ab5271e70d1e12cd269166c02707dd933f2805d1b8ec6740cff98b267e2ab823079b6071b861b47cb93018a6952e33a6003c361e684424b323d7ce46235afa1eb219f0e02117a75968028b896545661b8ea5997d887bfd9b625083eb4fbb7d8c367adc663f9f69bd1b1c26c1cbc1414a84f7882e1d31fafb67cafc8586f5bd0c003", "5251", 0, 985564103, "5636349c1e4145e67b0c8bbe51ffade5228cfc0d477fce658397a0f8b284780e"], - ["030000807082c40303e775931923c3cdd56225a6d3a9ff6a84ce24dda64e4378336098b5ea6471e18f03000000066565516a5263f4ad0ac4716bb83e68725c43d3e0693d6fac762983d4a4f76fa801070da76657f1994b8d000000000465536353ffffffff7712f736dd10e605f5b07dc60f5bdd7167ab16542f87100a0b82edf881c86271000000000700ac0000ac5365ffffffff013e591f010000000009ac0051ac6a6a635163000000000000000003dc2a320400000000000000000000000055316bd534e9c2cf64a0c6f1430fa679e61c965ea31ed96ee655665bdb814745f542a3dde5d1c365085516d58c9f9c603d9175d0e32b359ceeb00edf66829517e29a61dce186919796ae868cedcd4d2f86db131118d43b897a722a34f1342f980000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011c3116f32b8d09a762768bf01a65998d4fb55adfb0ac47ed68c0bc8b29e11bbea1c50da301f2abc5f253f8a18ffa81ac52f0967ddd2b48907a7026ecd3e8d3322582b0220d35186b135526a571e7ad0c4d2258e89acfb0a3ac1f3bf9f270ca10a68398519695287d34c584f9f8111e1891cecccd7a0734d43d78f2e46b657850212846733f4491fcfc4e02f6b3d727570a4fa7f6cdd41eff4646009106969be5b020f6bc34ed3f795962c2ae21516140bd0c067b89ddd2d7e48225f5b89f36b36280b0730c0b3e08fc4246de472a76a4dbdc04695f432293446524ecd1baaa7ab7a8cd529b0d34cdea5b53b3a179814032ed667a3ea7fd88fcd34220fb485fb9346100217a13e439fb79fe9f1cf72429801027b56b97ee14d5d04d4d93373ac3ef20f2d032fc8562bf2af533daaa4c72812b448329a7a1a225ef1fa952dd9af88ddbb58ca032e0423c64c6baee08772a97a4894d2ce006675f62f45f684b1684eaf0cf6173603256e090e744b61f2805bf4b72e338e89efe307773c742951dcd21915ad4a9926021c81265c54f3149a14341cd6d8755eab9b2c2ad2dc15a0a00d1e82b76082d756f5858163531fd08f34cf2f77ede0bd4b486be7b43df1a5e631b42e3b2c50a91538419ff790b6f76abe40eb672bd5c86736ad05ff57e67b6ffa404f1364d98e1843b99c61a30956489a4b5905cb4be17d44a52cbec82cdd3810b6964416bd898090122edc45df169128739dc068450c309bd325e6f821a2240818ae04a7bcd4b0dafa047a8f9bc3259cd9c43e89e08af005f7f51d6328f71b40719ff1412da964b50a9e30973d08fa0c3da7e2605248db4a2e7f99d7a26817ca3547cd83b0a1b6eac856427a6b50e199856be54680aad2fb006da930394ed48a4a93006d1334fb4c610c8d97db504e75b7ced5dd490a42a4984c0e4e11e1a67660e0588c21bbd267c1ff1fe6c7a40bcb8629f7c5f5a2177c89075b325473b240cf180d33595c5110c823cff2c00903fa57c9b882b82f91fb809c5570ec904c04ffbc90a3abe1a096ffb9c5be239d4796fbe7093df2f8c071c041a138f711d0eeaf33fc95699a02b713b9272aa68429dbac2f8b79c5c67eaf8036049e5282cb92ebd48e1e37c721419a7f699ae2d5e68c273238b661d6ca8b33482f14c06a86ec0d350c32cfc99a757dccff66fab4e6bd5a2fbabf424eccacc09d3f4391a6f2be748ecedf4b3c1b746c9498618cf0016f28354fb77b4ed672ec3978f04cc632e5d2b460418b913334d55129a0f21ebbd572940fe7443b3a626fc70b3a6ed3db2b8efaf2f75c49ec1cbaa40ad2171979edbc0ab9099a896d20bdc8983bda8134b8bb6470ce4ed2b7099cb242570ce4a0411d02c4f5b44407eb06ff187bcb2b42bf1741e5be192da93b2322f67c68ccc6495044fc1fef754d9974330f143204fffa114e0db3537b57f50d86939d73e0eca41410f608d7ad1475c88a6d2321f5d45424bb115e74ab620418db186d7e996c1815cfcae5c32350b5b38eb704084b673a703d1f3eef930c6ab8d2183ca380106e64cbae0b8d5567b7cb198b1a9d66a8a9dd0b456870e73e8fab34f91c7fa6528536f55542e6a9d2f487d73bd1b5121697dd337121dc78abbd8f4dfe5ced8c0abce4e055e08d41fce34962629c3c30feec801bc06e185129b49d615931a954c9a0c8bdb954cc535f031dc5db36548bb10519ffeaf422cc0ac280d73a14733fd1738df2b39083d63cea4df084778f0d3f7db736e9e2511cf4aaa443e70af36b03b11d732118b660afb95ca921f72336c12845958c210a002a23fb4775ed9e58bef950a05a0fedde471dc14a6f7af9a419e61336fbedc219c97f5aa1b4fa2aad87f2ffa87fdf8dcf0c0b4943ff0bc3cce1991b4be391d9a53976274886dca0f4ac75f22873ac382e7f2d3b0c2c5d09b282f4442e888d84e2c26265321ac5e7cb65305b19674b34574fb0ab6b08fdef5c153f1b40c400665882ef233234d48e8b1c0624cd27fbca3c02dcd6436eca9c0da4e078a5e5ff96f1eb02db275b2ddfe8f7331c0f5310f5c23c19106278f67c65092e0bd9428c485e387515a8af7f398ebf983dee709eef7a2fb4ab2f3af6f1cd085f2d2305d429066fb2acd4279738050edc848798e7094ae2cadf229f9b1b145f1333e0345bb11a81db23c9677dba6b898a8e140f5e2d95140d78085ddaeb3fc05548c53d2c743a0401e20ca2dda37968d18a162e3130b8479389394fc401c205387d4848e9a531fe1639fc81d5df3be39e97e072e11a53fe9a82ab0e33010000000000000000000000009fbc8324e1d13ce3da368d67d144e4be3ca7044f17dce6ac5849abc5ec6d3f72b5198fd9ea2e8ac762fc17da5c69a3e47a057e435bae3fc61eb152a9217d0318b596ad18c19bb04d546febe04c752f5ac27a5a4ea4b5dcb5186139a9a2b0c2b6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c5b1da4e1cd75f8c4b0397da03d2f2f4d124ce5662bda8583b70c4fddc5cbb5fe8953bbaa97f1fdc5c6fa4143aeefdf1a7dcd670919708d21647cbc96352c017de8486a3252f8b51ca5a05d91fd77526cb72a712280f4cef50d45634b8d5970b5d5ab8ddd301c453eb5eafcb5062c53415f0fc148a02a72a2c405f872edc2ff03085431f8f0469fa70742c9e1eab9c2cc23076733db54a0bf5b5783a1468ebf1002196795fd7fb608b2bb771fb96eac426cdca4fe8b21064c81e2b2dc460a3c870a0b081faf8d285688e56a8a5b1957b960703c82d1c1a99b27317037e9b953871e3dab8ce1eab18f556dfdb4667a3cebcdae9e0a7f0569145124dc68b908ccac584d02031db8dd2056fdc4653672bc5797738379e2c9d1c8a52685a47b65be0b744548032093ffa4ca5ad8b4c8bf4d2a230d3abf6b76f74c8524428bddae793454ca564c032a5ea90e5c8cd240d2785c07079d2fe670eb25e1312b5742b9fe8b95eae718ab022fba787685c65b29e9ec691408d15a6c93777211b4cc75a45e2bafc3a40f11700306dc3385ab6cf2751709970f8c6f183b1c4f8e5eb61060e30d478a3c30a4589e832e24d33087f4854f609a27e6ec6504d65b6cec868279d31a66e60e304985e93b3539d5cf8e0585fc93ca4ddcffd487a4f75f5faf9c372ffcf4e85249bbcd7b17882e88b66fd61d4f6a67d6d58b5f02e569e1b996e83f7b54dacd84a1ccadfe6a8f9ff8611dee8de8a146460d621dad8f72376e707eafbf2629a6dd971b9a37c3453dc2bf13cb1177498de8c3a4d923809d6953d404c827ac08247b17804a45e57748993439d44335a2149d8e554140fdcafff72f9033fd7f7b582719855f60dd26b7c07e5a5f4158ea9bca231fa38b29772a16683237ba361173fec25d0696646fec448fc5e4987efba9c0d620c3d9f1d593eb0906e87b3d08aeaa3bf938c7d5f4572d4e6d37f4ddae2448f258560bee7b71a58d1d9ac82ad8abfdf6ffd2e12b955520d6ca7bfb8ee61e1a7583c54a77695601bb8acd2ba1f213299c23316cc2815b8991eb3c27252e632f31bc0f13e7fd3ee202a492a664293ac2b16d61d1e4b432086b7751443afb3a86a4c3002e5ae49a07826f0cebd79dd882cf8dd78cac56ea9707b4a3e67d9db99256b298fd18920bfb6245b724f35f6fc6c9bc41c920f625922c6e20aeeeae52cd11e633c92ab66df6d855806e61fa9f3485e9c38164df66a1ee1d0b11fa5faaaec949067a9539025a1191589671901f63ca353c6d9df3f33eaa93bcace1e850ee755aa544fcee7dc9da46c63da0b426ad64664a722e5bf24f2ad502fd6691e034163edfd9674408ae3f805bba43546d20f215097bfeb76b9611da064e117dbef1d8830c3bef242364d8ede574f564471f6277f6676c289a4c06c22e4e7076e11a02effc7c42798fc0e57796cbfbd73081fe9636f5c199dcc7fd6611f1f75466d25e00aa13b2023b8dbbcfcfa511d3e0cd12b12f38326c048d611211c67068f1160c8b6ab1963752c0492b48932cadf29deadb83a9e3c9a65fcf585a33048108767b4eb74cf80c08b4265edc7761378a4741ecb34bfd0c9ec197967ee67471143fc4837ce3196db129d61d64ea03638b0c3cf38873f6dcf61737699f75518819865c91479e84220ae607039e1218bb4dc62ff8af4db9ac59bb8d49d5e9d0b98e1b8deeaccd9e0d998dc727ba1d024155154fa1c6b24fd348537e1a6391af8c249b0f6e0d20d6fbe6e6a6279fd7f01e517f26e259ab0b9fb828bf55727734047c5ba1f1a0949456ddac80e504fe0d36970b884c8bee2fd853dd7cc0937687ef9d4d83d2cdce17bf009c38afc4228ef3f71a52c0b4835329a569d0841d88f8a7ac632bd7ab50ee03005a7836c834dd33e3c4fd95d367177500cf664cacbaaa936cc84e38081e71490935819dac3fb24cdb54d37960eb43ee3e0ea7c2b13060d7b0347a8cd83b7380c88a468d7fa02c0299b2beee7fdb902c9fcaa4063c3dbcd5a65003cd30edf805470c5cf7aba357066cd6768599f48394d09f7505ff66ca73357f30b28f13f8d791365ad077716fc77b1389984172eaf9c65079197ebb76845c94f04e6f7110529d5a1beecbb6cbe4a6384d379590af2bcc58679cad63b2e5a1b61456d30d6b9620c60f541b7a81a61396a6560f93d8b2ef41ffb603217d3b26cf6a26ca5fcc37b30ac9171cd36b2b0c9b27e5ab391db608556fbe3573700b23cc23caae568abd1a0dedf3e4689a9b68e333d1564a6cbb3a9590d7aa1a8880e0cb5324a3db6ca00000000000000000d59d57040000000057baa6caaedd3285ebf9ad9590c6d4bfb5afa661657e328ef2d9d5566bf2a6c0ad51f844898e89a1248a403784df11d81c2780fe753fb4850fcc3713cefc009c6783244e63cf5ba7f9b0d947bfdaf829bde457244e095b6fcf00d4c5430a075e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015787ef3616f5386373587e50bc297669f6cd74583fb2e688025644fbe1d367f45406bb96b0b046bf1d1b31272e1ec8c71434c50560ce32b0e9c14e09613cca9ae679fd6222bb2d84a717c4f37d1e5fd13d163338e2ae43f04ba3fab8bd5bd0c823cf454c0f86da1e930081f44ba477a7e98596bfd2012ef029b6e5eb3444c46031f745754126f352a0a349d086cc656eb56888a50757ee0031d939d90b34ceeca031486ff809f452a07feda9506ddf312069b74fd62dd043b6e72d04adcac0a4edd0a021259c6c6c4e3b4a02fabf437fa3b4359d9bdddc21ae6c12b1dcf8b148ed85d0542805da6b85237e89d21e25b990701cc7a740752fe8fac427ccb80e0d09b4d021b9dfb43a216621cc3e348f4ab68a075986e959d64f955a94111bed393907b4f0329f0bdafe04ecc15735977fc94b156561acdba53a6bc56ef15bd37fc30c21f870209aa8253020893d7ea7058f50873fe93839d973e8946a2043f63a220234abefe021e60b197034c3248c1b5ed5f756bad4cc727f167698d2608f0d0b8669d12211c020df4645120ea59aad84a312496effd36673d77ca57144587782c80338b47471a73943cfe24663080aefb1233ec741bd51a97988c4ed32c5c12a9cfc0312eaea09f35e18fabf443017ce1dc488c58a8c150b619ebdf24989e3494436e238e478dcd88220eced89a650e6b909b6e4ec5f22d3a1999bd5c33691d8e22813f4b4c8ddcb8a358f67c49b0fee76909d3d5a0c64b8e880454db585bcb89327e5807f579ea8c16198835a0eced1ea1fe49f274b6c456d6a3c95d1e6670f44849258fdf31a22b95eac7e6d3d0496c79f0c0166c775589ab6e6df1ab1e09cfc07163c90fe03d96b01410b558d6a4454d2800b676ef764b507db4cc7d0dd85c3e2f2d225bc6997fb69215ecedd6e6d698240c83e3265df390f225d2d28d0b6da3bd24cc696b6e0ad854814165a1b13bf7557981515204008edac544e138b254100e41ecc6c654bb79c3579c5438153fec321c5db1b0055cd1699e2506c12a234727f82190cfe0b15d0e3218808a5fa413c50b21699feeef6ec37c6da092408c1aeab40563a31db3f7d12012d57e4e9facd03de613042964cf7e8f2068de23a120b6d47f9d8e54c566eb97416c716e37926662073fd7978b8a7a2207e37975390b8fa39e7724ae7742a48058c79015fa8e39ce51ef1bdcd1094ca7f9b990918c971836c8192b14c4bebec4517027412251d3164146f1edbaf4d3ef0e608a6625dc5615e34695b9047c7a18269bffe100d915e5a4c9a10ee2a4228ef60f5cb38ca0e3012813db358f0557eb302590ac40fa5484143624ffbc112835e33820f8941f8a03912810c3ce129a5bcdfeae56db184650e2bfaee7ea4c2baf7545a10526eb7241be69d24f7a33ad1081c1e686db9d5d98b72fcf90c785f678240262e8b20e6d4a9545ca82eb174ac8ce9bbf485790f89d0ad6bb4f8372fbd679fa5288f7b59609f1f8a5169c7f71f32207de583ee9b7f7f25739b6f321ac8897ec9c521ac10311e9c0fffa2e3ac706e771113a6e58e01bc3667a17e5e90b91433772ad6c1693d77cdb78dad4950a039e7566e31e067f59aa07626f58c419cd056b62dd14567c118044afecf5cdd88f10502ace2c5f29ccea591e344d6779031148571bd3ceb6ba609683315b24a1d7d106d5e7efd99b0f09949762b1f5fdf3a1ca478936006c0910383361382d43a6c73a2a737d149eb5ec8bad7d6422f37cbb744896fd43531adfd63aed6dc2347a6bf313a5c5fca49e5b9b605e51268569b24c33a1c5f69007cd39d01625e76a57c35a508172feca73762e955b14340968eed5405dcbf891cf4852bb715d7a91cbbe5bfecb734ba4dcf12b90a6528f0777e3852a21d692bb9b6d0de63a96822e98fabf9b0c13ccd9ccdcd450f7f8f37841d1976076e33dccb3ed5f1701265663f33715089baee502bf68da9fc63fa2a4633977a168ab9dd8afe5c3a3a4902ad854677e0e07b517a6ec609306cfce3a2dbc1f20a011be444c4d944b90dfc00c771e163c31e2cd4fa4480860690bdf039c1d43d72d32ac63aad1ada46e8b2ffb7d8b9657c89236aed28197ab12b4cd5e2f4c97af477d2f88a0839486b8ba971a936d89cdba15c9bd97f14011778b26b5bf3d912068988ca9406d1ec7dd1a9e4b3e477e547996309a757bcb957e1f7614c90f2f7bf95781fa0c72f8c3e7733f81a5cf70d56bafc0f36e47412e97d4110d062dc053f87f245410670d1e3819371ba62dfadebfb47808b54f9d1b079e8f60f53d95ba5771de78698261067659874a95f7f6959acfc8d6b0fdec4e8f7e070a03f02cb1e4aec5246c422d2a88220fcd01a5511bdc9ef560c6a7a51269993b3c38d94881b77eacfcb5f7b5fd5d398e51c8788eb9b5d59fc081c2dd77fc8c0b", "5352", 0, 1452504786, "cda609be1c2aac05c088e919c7b283586434f5a71148d663fcc1fd2e5cd6679c"], - ["030000807082c40304eeb432442c679b4ab0f56d68ff395e112220e4c243af440dbe7ce325625bf2a101000000026563ffffffffdaafe527cf53a9b086a8e62a39c8903baab581fe402533047abc05713fb39f810200000003636a651be36dbb8e4bf38049d0fe2aec866e3b38437b35867bff7926bd85bfc2a280071b20cc3902000000066551536aac53dc503881d048e64852a84576a2734f8fbf451471aede738afe938ba760026350cccdfab902000000096a650051516aac6a0060561c4201a52fb9050000000006536a53656500000000000000000001000000000000000074a6d40400000000d05c40ef631f13e16fdb6627d5357faec535a90b4271ba689b37d6663dbc3891c9879a9aeab62c8ffa8cc8a1a216942dafde634f0393c117efbe09ff2b8590eeae18e174af6713077140df0cb759933345bd5a6f2b6bd6fb0a2771d831a33f0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aa26f4ed98ba659671250c476293340f823c2a5f17381c77c719ad17de3120ae1a0414349a298e68958945a11817a5dabceea799b2dfb991ed2f6e8fd4a4f8e6c996794ed6594faba087590ec6390c00ba38a253f01cb6f3cf71341fcd8bbf2c493c9a9f864facc30410981fcb21780157aa7f45f7e5ceed296fd52067dc0a4b0303d8865167237c2d6525de3dc1595af35a34364267594cb426feda050bde39f50325e3a5ae52406eb78ffb204914cee7a05554706493a653bb03243dc3905703590b032e303a818c92466109db4570e98f10a92653b0f74f58c013baa3404dcb1f9ac04203b03ef78db7a13334049cf308e4316594ed93a7abbfa360387b2057296b031837d46e925485b40756fcf03b16d9d6a34734d5b2c4b023b2f6485f9188b275021bd8e180e72801cfe6b64a636098a3ba1913efba0d0384d63ec3bbee89f6e5cd032c5086e123f77f5d687da423a84bd2fff2254ac872f6a895c9f2c2d6b51f1c9b022c6ee428f6fbc585eb1ee316c606afd0e2b4bc68eb1d24b4d4b75299b4eccdc6020800c82c51edaa6088c4dad818af1d0a704284ebc8dbbe5edadf30d3016d23995a1e8a94c9f9b97dcb43c3873154dc2ead3ed19825f14c4548719c0a34728323893c2803d871628190f38f360f0fe465414bca8ecc57e15f3748d38de482618420e5b47e8412eac90e7a507665475f632d07d41b5bf8d9ad44799c1de66a0bb658e87b1ac5c12be6881b26f40c7cc5312a181ea1d3722317d956f9a110edbe36f70324283eb7308a81a66efc17b1cfd207158d44e48cb733cee4fef8dec967e6d472614a3888dd94dbe1373f683e28e17d3f90bd211919df0be23af107c9429103703d42bb6e423301bfe54ed75edf7f57b9b760469020dcdf7f54f70ec37a0cf991e3b18d05b6cd4c91e6998bc2424e743adae9cde0e16723b3e0857f1ebfc46a18a01f632fc59a8de7e405a1d4b1a8ee8e9922431bd4cd82955407f3c7dcfdae34007402839caa0ed41252ac3960cc188e1ed7e53281162fab44bfbb23733b6b8b22ad077d11251b939540cb083131b8ccc2ea94dea6caa5795e337236338bf0cb68439f55b688ea697ed8a9893de065b6550867c1cc8ae0cc361396a31d1017092924089d5a8ab787f2b8a29383367e6aae543cd3b198bdff43ccc7c196702672f74a9c7bf9fc1fd0de02100dcbb7ed2773dae8333b79a9480510ca709dd6e1333267417fa0cc75179016fbba44acb0419ad22fd3595b25b5df709f5325848b781c7809363dfe6a93557599c228776ec5c1ad0d64bbaf3ea00a716c64152e74476cfacb0ea55ef0959d3a44842a5d765747aab1061cfef91dcbe99baf1d9abf0782252cf08614e2b7b412dfe81eaa268a92d37b955fe797031edfd77b5e4ddb3d8487466d9242241df92d45004e01175bc0d176b15392538cb94f1b7e1583269d9ca9528160b88fe4932bfb32803f09e7a0f2c1aff2f8bd8f7357dc7905f6a16096182a76867f9eb510f3e45e6d0e655af1bf5be4ef9a867ad54eff178486503faa10835d01993a56ec67ebb731fb33603f414cf40c9f0cf657016c652828e42febcdee6f598f800b7ee4536db1eefe274a4609107b166a164c0f01c8d41c0e9ffe38d978ddaf82aead9b9793fa14629dc9a0e241bc85e16c9eebd6bfc71a3ad6a1d7d0905058c6791f1ae48fa80273ef03a15fabc509cd12439f143edfcbb65a9367230b35293dff5cc244321c7fc730ecc5bd953e90be85337a2dbc7f2ac99c9c6fb40521cc932a81afd3089a5e2243a24872a05dd1276cfa70f50792b174217e7974927a7d103d767b3e50e1351abac438a651788117908b95f8fe5e6e4b7f569061c7a752ccc2303440e82c6621cdd13fa48aa8b810c98cca8b58d66c4de2377243f0871885672e13f5c876eb1b95477feb41f765cde2517a030107d6da6331f7566fe879ef7d884ee3a62b9f03aaec67c3dd7803ad55ff9e1c5c0a38571ee278e856361d419a09ab65c9e6186cace6bbb1b784bfa38ace83aa508b38d0e4883ce3a1bc488c4220733cc19aa33c838b00c517efd551603dbd1aa84fbd9b9e9ca144f2b9b697a8ceaff7bd2fd379e4d830601931324efcc9f49d9f8b012b32b3bcd75bfbd869aed5ef311e33216ad6a9c123efcbfd018340f1285e9b3574b4f1833ea85cbe60d77ed7e52938fa64aa90dcc7500437deb86dc90f9ae6cf4d163451d068c9fc3d4ed2b3a22335ed81db487e47b984f5493c82347ca04f53f646c4dcec4431f92ca1418f9e26f9d045e8b716959f9aa18181e8be49745e395352b3d3a1522dbe3375f8a059b0c5fe499f9561f70036bd432b9732aa1ec14608f9c8268f9654dcd82555ba4f3f13636b0208d85b422006065277e1f20ea2cb7e9e580b6e649594b1551551e75e39d2ad0d", "51536351", 3, -14748556, "1d4165771b254bc654047f003c45e24ec7759f6b5f639aa98591e6ad94878ad2"], - ["7af6c13a04b962a90c67adbbc827e1c852ab8499c774b7f413ebc23f2eb4c74de96904b7720100000003ac65517459cf06925338c6e85f82348ae2e3108a3b501af375a2a7d7aa2cbc60c7bf1750209f4c0300000004ac5353511e9a74974f02b211252dd4a5e470cf056951122c74d8fbcbfa907f28e007883a5e5e2d780000000004656353ac202972c1de57e6d20ca381d6c353dc724867cf298f187754a9088c545d24c6f757b3873d0100000001538f23f77f046338a8040000000004006300ace87195030000000003ac5363c9190f04000000000965ac6a63516a525300da1f610500000000036aac6a000000000200000000000000000dbac40500000000b5fd3cce7d5f974e0102aee4d8814111f8e595690cf3413ae21e07f84c51c09af73974ca901b846cd469dce68fa69e97de148e9a0b8a1f98fa8bc985264688b69169657b93bb14f08d6fc077fe1420db1469aac89a146303ac352d1a43b259f400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bf8a0376e5d515175353626591c931e32c3e906298474fcc632581b28c5d822d22a25ed591207bd8bf146d76b8bb7429cff19e1ba05f233f6ceca5a530aaa1ca20959a06d0d68241d1c8a3bd9abf0df3b760e633eb7d48701b36a0c8be8333e4c93b28ad3e869f85d1915c97074875b5ccd5016eef4dc4ea7d9cded102724d9d0218b8fc203cf867c3d10eefbe117da9a5292b733d8ba264ba2ac8df2135e3ff5d022bdb7824cc00c25ecdc37e905dff79e12b761d72d97431af2ed09371d3a95b710a01bded2de984669199702aabbf5ec45c4b900ac2bde9b21e9f1ab3cefee35871367082ed9998609e73a21ce7001da79f86649f1c766f8d5da802621936064c14021c9e0e50c0ebb8d996a773daa63b0b63e50cd79e16998d3799a41fcf4fa3089f020cbdc1a52ff542b9c6a26e82dbd42d8a1bdea13153684a60e70571bf7b2b6156032d4bb7a5044afe56df21e24be640af96769672606a7ad8e9c792d6a18bc92cd7022e03583da4d5e028ba3c803a8771f967e8a52da88b24cb2a167f01d7c2a27e7b03266e67167d74a6e877ec5f3c1dd0d5194d4a2e0efea57db9f36833943b1e02b89953fc273c7213295058c0361db9062261bf17cf38ddd503f19b223220c69a33956f472067586a02a53ae6a9cb655589a863489fdc46a0d91c3e4c2c8dcac2ef3830c4da2cd9e1de0437f92c55c54f6341e330c4c484cd1b59ac008a5707bd3dc5898deb685544e1c7b5b63ac190f0c6e8165a48d9c69def711792832f44d23172bcf3707d9b301d70f8492748fa7cf1ef6dc638fed9d0c4f0734d87b4d343ba4b6647c6fbed2a2ababf47bfcac91cb0985b42fae0cca5cf75d4ab11f44f53580103e6d6ffb9891bbaa8050636e318c5f71e422e634385d44cd57bfc873baa07ad66dfcae1dc62582736f30c48c47a1206a1725200524d6554d6666c465ec7a98745cfc3cded68dd34109d29813c8c63a113aebef95622cb07e663fc178f9b1ffbfca1a6b3fd5626033c26ff7c50bfcbcb09f1afa77cce2763d3f175816dc4c582f09d60f7c7077ee1c00f37f99efe0664eddbb54473250d306100d9ca5ff7fe602ac441054c82c1c0c737165ed60fc771b47a8f50a08a12bef6ea57d71207e3b9389546bcd1178889b40d21d9618a8f35794cb2d885f9a6824d1bc46caadff8178e52055dcd4cdd28dbf9d30131f2e1d96f7cb2803794aede6a016595cc127da3718ab0d08557f569541792ee8702edf74e058d99fa427daf6697d1c41da89efe611a06b15db55fa2e856d5b4ce518c6f531f572747e64a72068f5f331c3aefa1fd52cb9713a554db9fedf8a396ebd395180e6c1fc17d1ec9aacf94ff0e7afa6a227e378611e0f974862afebd98b570e5bc7918993116a5d9bcaf298f45ad514a417cd14dd07745129e2d9a27f5b19de45ef9fc13c5542a32ef8d5c65bc00537488cffc754264e016f0d93ed55046ad7e1e496642f396453df1fe5d9580fb899a44248b44670e270fbb94f091016df4bf1c6446cb9f516b2972f88b5b565dada656d802491fa0a6f1064c99e26b9caa49eb79708d8f92d8d54952f2bdc50c1dcf2852dec01c130304cc68562aed9761d53797de47c48a5249f084fb4ec263dbb4b5d6b91c8902f100087acf544e8c4f3f05e6c8967164f9078c607d7e1dda615cb4d467c84f599193682261a50165f5da2797116e8326fa5d817b61b01efb702ddf6835efdc3ef9e98ec995928aef64ac8359796386e6ee7e192fdadedfc598ad0c34680b6b7ac9dce66318afe39b225ed30ea385100ad07f5701d68d6755231443e61009f619339b775b332b109ccf86352e5e3014358e2e67b91ad680407677b8a38de16fbbc8e6aca21b46eb48d1ad97131fe2467c59dc810bc3dbf398944e7a10753552cccabdb5e38cb7d99b5d177974ade815258de2c0b20a6451870f3365776929ca7b5c8e7394c2fb279af4a5ca984e81eab7281575504cdfe13a6be35accbdbf64480fd58f5e452c48ee21b573ee08f77c32b25433c517a30ece0f06e17b650d0073117989766cfff494e7369e04b60b779fa121539d7a210123b684ae09b22674ed69522af67fcb6d72de7a7967be00fffe01470c24526740fec151f121fea1fc675f0dc8f0ad4dfab3babededad7fb88a2977e7b2d2a7c47b55ab6ca9beec65afeb8d5f5e0fcac14647eeba8608079961a546b619ac8ad19b2ff762aacd710ae3e6a8bbd4599e2a96e94a2786fc0eb753865464a04ddc9dc824e776ecd6687485094294ff82cfa4bd23541b8680292030000000000000000000000007725d874a54580c68bb7b742802efa1e168d6d2a8a3a51955cf255065211e264c7c6503f33c2eaa37cf93f7dcdc4511ffce1876a2652c27fddc7ee52de7a3fcc269efb21a1ac5810ac8aff80deed1d957d89025b84d3de424bed952f20997d82000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006adaca5c6f27af2d5411bf9ec5a7ab28c2987c9039b6ddb5f82dcc0850392d35cb81ceadc4cec7eb9f887449cb5ef56a65e888768e3729cbbaa8c534fd0041e24c6ff0305aa74c38a0e4989e834617c1aed9c282ee2b70db636ce557bab4227205131dc2ee35a8dc52f45ef0372136286d6b93f09ba72d508e432314f1b0f13e0202da989d27ddd64fa45614e3c03e4a9f0923e63bba83b7d4c4323ce996ee07f703131497264997b65cbead2b37f7180a8d951c06de5ad2d4602bc8b4b5320cfe7a0a016ab26dba52b404f6cda272de9a6bae118e502c916b47a4c3e4e91847fe5f6d42c80ac7bd43f37d80eb6c928473a6cde2d4bb9b9514bb9f461a7e1a680ff9b70219594f12501a26e460833ae73bb3913a54bd61f96335eaeb457ee6cbceb26fbf0312c743548e0c9d33949a7309d36de419d32da57a8f44e7323487b32418737e3d020d05bf8063d21820f5f1b961359e2398bf834084d8d7d937daf79f49841957d3022a7a22e5daf38da53a95dcf746b55d4e33ee1f8ecf14ebc1eb2fca18f285747f030a85521953bb1e3baf5397d154baf7409b3d84615e95435f33b4c8f6821a22863fc8228b7b24aff22e0a28132779a6598b7c7fcc78328e398983b311bb04971d1a9d73b616e56a55f5814cdbb4ad4975834f45f50b0b8a32e9f34121491f09c0f1ad8de7e7a5f08d0167b90d03f5bbe3cfb952ca3f290d7dddc6804290ea21bf45ed209fbc223ddb02f2f6e62ae6279846b4b2597cc1ba8f7db68a01081c54954e95c376a1f52b42dca6b7d98a01442744c499315337508cac5c6573cd239b0a8b11ad50d4a774da74a7262113e17329b48e9be71208b23b764c1e6ad752f6bb3116a478c82ddb4b1b8a570c5af40e0268e8dc51e1521762f6f81af00fad10418b592a2a028f9dd6e793af4b2450fab26166e6989f1f8a7bf0e8cd80dc4bdda26f6ffcb4d74ef7bbe80ec37e84fccc8c0061f24520b06cef0f04e9643762e9a343dbe5f4cf9649a75a875ada0acc39f007ec51d0986ab6adde235904fcd748fa5ee427c4b876da6f16a6023ed746e2056f40b2b627dee0c2c2593f5411fd1d6aeb90df6ab4fad8f2c3ba9d910f7972d42778c51531e9ac67628b9c0b1c07736eef5f43e930613d18aaa1328950f86ddb717a8e8bb8326dfe8508282eb0a93ee0fbeadb200df159adc7229c771136bf6e8fdcab16824e2926566045027962f557d80972364f7b20dadcea0d3b4b0cf710e1717baac78d4b77d5819bab8c5bff61e536ec24e8b98a29ee2c5cd2ef9ab80cf3af360afc54628b5bb7044f9531a413f1455089be1a1297d6a21931f637c74a0b517185d6b7b3bd7568a8e6391d5ae5c214f6da785978a1cd5207f47eabe183f0f3e2fccf46c1f48b2e1d957196d7c674e5c60c123722a2d23016e8669105c257b923f234751401f4cf6eca94b3e75abc9d6f13a29172733269ba6c113aecc6f772cc1179c19e0dd04e642567a7cabe6185acd1239053a2b6c504baef118479d3b7fdc96c81f9d3dead58b505db3600182b55ba90f6895cbdc3a7f5fa189d971d27a956a43d2dd12831bbc6fc098cc374d077ba55c277148298689140221e0b2ecbc7d2152c6b44e9af2375d0e39a575ca1de75bccec7a73ce849c32d4aaaedce46e04344c12b1401d66d2b4289184053f4de4d198b0955328faa2dc1d66feb48aa900318f4364d7ceca6f5fc46a5e55432c937d4990c144334a5400e77e4985159af04fb9cdbb15487b6e3adadf457e36859fb1e539689812d689393958ae9fcc17a2e1dfb852b07462ecf5474480e011e5f5afb3f1b536fb3ea4024523fb4ea375fbdf48d2eb8ed465cf115f479efdffe20111ada9f2afa468d5a5317c007205ba383bb2c5b5433bf2c94c4ec998d31ac955a444f5f6becda805fb9dc200bb79565bd6409379764e6eaa91f27dee415076cee10498ce1a9a77a6447c3034e1211df24683242bdc053a114e70c4e1828178f191b548a0704214da158ca31f4add13e0523f7f9be5a9c2f1521275e6770a64d36e154a341212171e8d6def95cf2f2d8cf44fab42cad66a61fb518f6f8eebfa8dceb8d6cd4dce88ade1ab12fed637b100edc9e5cb0720f2256cfe93e172d8375f55ee96165508f12750e4a6b0577890c112b984030c1a148dfc772e5e3e0c9dea0502c2443feb6f84d1fbce7aaf943f63e727bc45ae926fc36a5a4b5c335d0274e7c8024d362c2b837e601d1799da95cb1eeb3e2271a979362c546e56e7143aa02bf5568b976e78b56c2ec159ac24a43960de5b6e7bb9e82e85d49c95d7ed1c202eaedc4e52b93ce3b2a399be9c97762cbad207224aac5dc361f3f7d58d6030fedffb901387f23598d8876f390ed6cda4da48e475b18182d44f2aa426fe5e348bb643433d990487901d6e68986dd0c", "5263ac536553", 1, -73179230, "998fdf680fa7daf9e8b038b9409858771c2dfb92162c58c82e624b00f8ac81b7"], - ["030000807082c40301c1e7f574fcbfd87608e3a9a3da1efcf434899286d417b2178c3aea3c60834ea3010000000851ac00536a526353ffffffff023194350400000000056353535165d9a7240200000000050052536551e5dd3c020000000000", "5251", 0, -809257030, "81d1ff9b165022ab59331833b8b7ee521b648634deea45c8a4d3d521c2b707c1"], - ["030000807082c403022d40065a0e13584c6ba56628b7beef94aaf42ecd5305eb7736960fc977a8ada30300000005516a6a5365ffffffffcc5b44316bb1a9436dad0799dd05eb81a602c64b70e58e4d0c63fc4cf4a46192030000000563acac535382150709037bb022020000000007ac630051525152d8ad2c000000000007006351ac65655230c360010000000000094c770267de7422015464d30000000000000000000000000000733b68decf6b573bee9238b991b10078e549c82986a57349b48255d76a43754ace314f33fefee42c7abc39efc87f2f81f5c3aeed71f9741acbe1bd05c9c12b5d263683d44475446789ea8987023fb2adbc3e5d16cbec3a0474bc6a5f5ff30700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000defba1c553b1b15fd6bf41db399ae0acbfcd14820d21aba721f733ec941cdc48f3c129bf694113d07f029e83a3f1346d837cf6d0c591fcbcc5d70f08f45c02f2688f272a3dbc13b8f4bdf8c906f8d59efc94731daa70725c2ce5f1876be627de0cc8282b64362fc0892b9a774f90b5b6bd08b050fd5e0c71d1d60495896553d6020152a499fd0dcd22b5ab035e17c5cf94951db005791fd28e529e984677b7a188030aa5320afa84aa8af112ada7db33a23d8f5780f9c6e7108a97ccaa16203833810a040d298c3809c807cb8daec5d43e8380c6f936978f2039707c3e67c2530f2e54f6a0afe8fadb08636e5849ed6d2ecf91eff020ab1c2637214a69d4d70e01b388021ca2efc00c8a148c3d078e31548f63151003be33a391450ca6773c54aece5b080228def0c7293cbdda6ac1a91f3c8f8d01e6c5e603b7c454d435f94404c145b0a20302a6867bf3d07dcddd99e2eccf59c92014fa5175753b41a9ea5ee74f5653522b022297b65f8223b1f064b725d32816c86cadbced2eb20df10475e12e9de8c764060226e59530c002072f7b2835bac3c82112a7327139647dbf1e8c86987ed2a42024b4a92bbc8d72a44e7015c3cc8ccd6bd2f885b859c429d117469a3fea0d1f342d39e199a7c2bcf6953eafdd2506ebee92d4af1dc0e3c3b77eecc4f3c74afee5568feee1f4c8d66780bf446effa8ea9da591ff9c757cd5faca2efd86d912a50bb136e107e576384cb284d5a40d30b390314454017fed44ac3ebe496912c356c81e1cbc340c706a950446613ae6ddc64c4351eb58a50efc336ca22e01ec9df39b820e409d714409167cda0d83740c5df1fd359bfbc759fb097f733484f6f34f968b2a2be9d02d08160c8dad74c6e09ded40679cc15d74ed3ad2e82218bee4926755d10c0d8f147fe364c08be2532078b7ecf850377d4451306f5b65c6342f82fe17161b8d751bca440f26e4d05d4caee4bd13c10ac00af2f01d1b32d844118069d77df773e16a39eae611d5206f379918f023a7c6401ffc90abf4d76396abdfb10cc79d2052d6fd01c52e9f8f5a95a617b8bec4e1d4dd212035da2a00f0e0d7e55b29e5e8c9bc65516028f91c1e4957b5b7adc6e8e77c8f0dba6af2ec410f95645d5e4c0368306db33ccd441a705b304093a5a25b9956261a4d292d67f6ce9ec3d477639c327c38b39bd9bd7126d2a936321b3df3905b5f657a64f18cc51cea5dd8e2bd663ae67758bc1bbf67c0b59aeb5a504c017881cd3a0b430e56684a281cce43fdb6e2937bc7abffcce7d40b24e1c510c736b31a7b006860162a3df545befdfe5934f88c0598ac7ebdf9241d9b827c7e7d8a97e12828bd6baabeed8a3eda74890f70bc5eca91e93d561820e9b4263afd04f960831fdbe6a057751ea1b1c41686168e872867ad58cf00acd4a62e15f4117930bcf9adabbe6961bb48c532666b883d2cadbb896f5db446a538286265f7d3aee12bcb5308c87af6b3bc0742748f6107f40aee1640d3ace4bb03c01b39650d34e61320ff0d88cc3aa71213e79033d60c1df72e5687c02c5380d87b3f549f82fc85c3eb4b4bc8999df139b901a809953d16f1797b3d4af0166e21bc2b93de0a809eafcfe3dc825112caa5121e8e868d71913212ca1998708e07ab54471725f485c6456279e4dd07e260e23e4f34679f035cfaf87b597c118be5196fad2607646191e09e08ab7ecda920f2b7a8a2ff85cd7c95984585ed444b0e60eae9f530e200b3f6188f9652ad3503a2712c2fb6597b975a325d993bb77624d4aa5e530c64d9452963e953de4d9db5430a1ffd708700d6e1c204d351760889c0f84e730410700b4dc334a1591a0bcd4e5c4101a4e27246acebf3859e2374fc54150b9a044e9a8cffaf9557f4e604e87ab798546c558bee5aeb46d92fa3e6e5cf4036507c4efe972b9c3a6e6dc183c61a3c8bf9e16b88fd4eb3e622756f5371fd1e362f19690974b904d2030ff11a8511b5b86f5d28a33ad18461c5d73f2ccd8287b4278916e7a97f61a9f206adbcb504e9a1e4434a29fab4438eeee71051ab70747f8059e4d2906d25e37978cbfe35988bff12d26e44c9446e33a52c552742ce9b6a440ed37cbca674497d644f3874865e45f8a98ab7fe7c112616e1f577edd321813c260c268aa33c0dd83fff564491dfb6e5e02caf19bff2ae82bda95caea3c01e1a7f8e1745ba697a17d55755bdd0fcf77b400b86b60e946097fbc77a3a4edc49f09adf68a565cec4318e7c317179b57c4e3ebd19960d0b3de1194b21c28405928ae90844d236140d6661780a502d54e92d24a6ea6cae4e64fe46b5138742f4c5225316a4e651bc2260d682d5199092fdcc47b3f25b7de7e52810356e74995fd5564024f7301afe9c44b19c1ddadf766677623a7460dccbdb20e160d1140a6192763f3400", "005151ac", 0, 494386571, "e33107acf90709e792678f39213a1040997f66a46629bfe9b19033b66ffb9138"], - ["ef02272403d70ff232a36fd7be423e716efcdebf37edb72c6a4c87b71360a0cf11f273a9af01000000046352ac6a50d42dcbb741e7da1839d8a22041b8b933995507a53dd08407038bf3e1a6f50055718646020000000400536a53ffffffffac57d5d834d042dea251386f5c4e7ef7a82137167a9baca545b8a083f72657ee0100000002ac53b0fd12980290de2d04000000000500006a516305386d0500000000066a525100656a0000000000", "6500636aac", 0, 1949719647, "6614ac92d17018a0bb92616117eb3ca58fed28239d97004a9855fe66bb0302ad"], - ["030000807082c403024efa66f2847ffa3aea6bccf2db064d6da5ba44f091089354b3c79a1333990cf10200000008526a6a5300516a63ffffffff07027b6935ca9140eaa4e54c6b89ee9e72ad26dffa9efef6d3ecf01b33c9e36c020000000951520000516565000077fd68b40420e0d2030000000003535253a5d070050000000006656a526a5151565358050000000006525165006363563cba0000000000015300000000d3251eb10200000000000000007edb3f04000000007f66539b00a1077911339d239a6a368690459987c422fb9e5568fd363ba5ed0f46ed471f996deca10b1c1d820a882aff89463065491a982506f92ce8cbb04c9dd30f358c32f1cb6d90b582252b59cc089590daf9ff1e157613576f3036b316d4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005286284359b823b1f839ad304b69665ab0c55f29de29a2e7e106d4a9e9025b881d2ec800698b78a056f7ba2a10a9abbd204b6a1a794372cd85cd24959e56d6d30207c6c985faa32d144e3a0eab9d0e839e270b207b758004e8f3a8b73e512587c53b480b0d95a713a0aec0fee9f36d139fb4ef93882a53ccbb6c77f796fe57250208b98692af2b9461a19c78a527c0a9e49c0e4dc904bf8557b01b3470efb828620212439cf35cae375380bf5c18a1d792b5322adf0dae33dceb30c0d059155352860b0184b37bfd929ce309b2942f832e5153b6f1457659fc4134e7a24a9e1ea7b2508fd1a17d7b3c6f8d999660a55de432c18ed300c7e46c37253f72b9e66bded8f202117c31d2ba52361908953b2dfd44acb11ca51ce284ed07c773255d3ef0c2d129020f90b8f9bd9c6a50c7520e974c93942b5e4705b295bf95e51d6b5a9002480a7803109bc4d116c807b7625c3ccdfb9884da5d6ed242c75b99ef40bedf7bf1f29d9b0218160ec68df7563cb4361d72b30163b1145806c5b42654cbee8d75da456be5bd022f7cdd1810e2917e71e44c526a94f968dd34bf7598c79b6974e71c0e89c15eb00f9e90fcbcac59a1f037677b760566e1969a5b775efe31ca64f14afe3b10547acded410d01386a4e14f51a73cad185ba9b8bd7ac7f4b90729856e16cbae7eac7ee46434246a627932e9d232dd34826fad0f6867e8eb25bc48b875f273154719fc626b1347ada2aa4658cb3d3446e93937c73067300543c34af15a107ba4f247e0bfa94b52b5f1ecafb3afd102328ebecb68ad74ef58305b3fd8ed4fe2484019c9f851684bfafe81843dc4428b4f246a308d4e9f8c1adaa2b5d54f9c41e269f979bf1992afadbd2e51585257ce8d4b647a452816ce4e4fc19d449edab130c713a3eb4257847cb6961baa21690f69371d4c9ba83e82c2400b3d41bd58d6ee13decd6460e06b326394902442a845a47382d23478dfc6a6c39789295f04d6a44e7dd72b18bb10822587b415aa853e5dfc2055ac2a8b0770156bdf948e2a2d5af169feec048ce083c120fdfb5c314c475e0e8fce60f6618230dfe077af354febb14893ade7c3a217913b855af41792598fd1a157befd511c9133977007305d4d91118a65b26ae401aca6832c60c0620cb4fe72f350819a5d421cba2c845041a7cf02ddace39bec257b60e6e4ca55ec2d364da7cff96a554090faf1f6faa7947927eb6295e49606405c996cddb764fbc1ce73a73fcf59b4eb39f9003c6a5a882d66496ebc646da459e3355c36502bc0180ec891b34e55787bef12bd802bbc59104bc79517442893d872fd6c18ed8f0e31a7eb1c6719c9d2b5cd043f75b9931509ac6459ad103d87cc389652435dc3c6546ee1832d3ae2e78b6cc29d612bd285e5643fc898ab2b5497623f12fc9c5664a4560a1149c481edb22aa5da8c403c867e51e66b3049b2e5eb85c1b5980ea4b2f12cf306db170517dafcf1591251b513878bd69ae02289b4976669baab5711a99571f4f4d1edda82ffbe6d3969a7aaf7ffa887e32d29c06cdbd970d4f4c07ab9c7b6344911bfd8a998c936d09da50322a3c783a947439d0797ee715f530f5ef614a77a77ba5927ee18151ca196dfab2396cf00840141009159a4e0290eb6f11e2e5aa4d3aa8e6032e94c1707a9b82a4f7c1f6376a2f9cd92493414a98e53209ffb088922f41ac41cf3cbaabca3f19330df52ae4da03cdb1e6630073e99a1faec2a70cf38e9c2a86dae5f4869dc5e314899c7087fb4f4b19a44cc6b0aebec9761c6e37575f0e285bfea2e280f2319552aa975787fc0eaafbe1aa61714f6f3a9238ec8ca99f802335903d37fa678c4f7bfdddd7f5900045edb022116153d1c6ead04aff700426110608eddcfcf0f66ea06fc03e8cf3ffbdf44f0b2942af56d823ab1340756c7f86c0dfe53c9e20893c999c4727c1572e2b6c8c9b39e662c955bcfa88b8c7daa0e481e6630b68061a05a2362341444046a8725e5476891cd1fb46da4afc011a9451a3797032569e1161b60f84a847cfc3654978a99fef9987a7c4c47663725d06a2bb8132d3ce3b8c2a779b2fa40605835dd0a234903aff4d97f565e718a48485e80bb8737a269019755a5b1ccfdf5a21936b78e684be058a5656e9b7d98513e22865d232618ba44b788ba07e9e68d778c5f3839bec34a32404c7f13a50e1d4e446eba50a2aa4cd82b46c0cc4bfbd6c62358bb4a47b904899b7194728a824cc04b608d5a6482ba55e497e030fd8c316accb7de87691f4cce855307823162d5bbb0000000000000000b993e202000000003e6bdd765f97e2ddfa265a4d8225d8674285cb0cc99f0e7c03d096de53582e0389fc4ee6329edf36ae6f59c6be119432ca7f063f5945fa30050e3bf75aaa9dac9480572a93b70da77685046d270f03f90adf12c8e9f1344ab8fff50d4eca7ac3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c1e49721b772140bf74366d880fdc6ecbd798010a55f13b92ba4c7db6fd6592c399d0c17e8b18abebd9cd7728965ef49827fa5e0b79db597e4c3b9f37aa40ec77219f12932c0aead018bec087e2c4d8272a400606a1d3b57094924d8494750cfad56835dbc8038ef61171021543a323c6a44721326efd4d8933ec8af279811e022b2ed1a3ad8638c0b375d6467e11d02f8b04fdaf821d8467ffe54648829a4b49021a84ce143ac989a4a1ff1dc0a875343899c0c86651f66fe3ed8e18dfbdbd6c310a03da4a20a9bc8dbfe1f36fd776065fcf267f786e00b096ef84b8c8e0373c9566f5f4a5a29a4c486e41c7d32accb53a6fc3cd137c361f250fbcacbd2a64bdc0dc03014cba2d4ecaa1a06e53929b50be734ecd078387956c96b7f64bef1ddc13c0f3022ded7598781e65705b2285313309e9c6ac30515f2b41d36ac638d725c84ba8c002022947f6f158f29a27a2615b97692c9f03cd9705312b2bdcd264135d2e5e51170205e5d2382fc2a297b9767f2942593db8a095c94f9fa0340ab4da399bbb29e4d0020d8626b86e218ad1708b9eee0ef698ecb86de05f4bc928d20b73bbd92055e9d1fcc37b414849419d797cb756ce557decc84750dbc9a3c1715162fa1dbccff2ab1846ec70b9dccd9a12327e466fa045b30cff2889108bcc0fbaa073c45d09cf4b32f826a48304b931e4b75d973d880bfd9ab452d384b6414e99170e2d5bf15deb7accd99b4c98aae0235e741b590a2d007dc8a57f1141a5a10220c0b42fffdc49c76032d051d02dc3d49d38a75ca2e64513ee592476d7b7974ebd27e62ab3519221911f49e5463e358deb3c85f872abb60147996fa0b7f73560a1b58ce31889a1f7ee4380c8ecf3ed480d2905ceaf384114cea07cfbb24f2ad34f12ba3371b45b0e6b5eb0aad67608bdde0570d2e57fc626fa7e62271a583639c74689781bbe222f77d5f2c9e4171e8672d1ee8fe00b413a79b1fec7eb3dbb9ac4b8fad43166d27ef0d580cc9d2ffe96a486b0d2551f05c64df92b5e3f23a6b07327eb43efa47c82fc0f6f1828fd1bd87298e341e5bd1c5f833d22341a57637e865dd5267ad98c374552bfd5c4a5a1468f3db1285acfbd72a8d0df3199688e9d9a840e85c8fc84c9ee81b332b0824f6d37be7cf46119c4475294fdd658205d3b88363f821d675aaf6abaa44c7e6d8d0d95e877881ce4ba8bfc8f8ebb6fb7e17d392220fad396edca6af652103f931680c43b7488401d902aec094d827763c92c426f063e2a5712b14b7159ecc80ced83248fb898da28bd40f7d296863cce5cfce85172db3922d561c2b3fe6d4441bc7ed44ed2f80304cc38c7340dcae14eb870a72cc5bf9f74e20d4e8b1b5076a65d14d638b2af898a4cf9ffa64613db23736034840000ef0350e2361cc5699ec8dca287d7dee494fd4397c6a779961cdea738643868e41087cb58625959446dfcc9ec47c13368f8c7c7caacb353ec75b19fd843c60df5b6b7bff6455e7b12e91cf9dabf372a991de2ed18f5e685e6490a68152f5fc0d3b9d3a8dd590815ef52ffc0b7f6afa03db880f37c27a330a203e5f8d6bbd7a3baa75336b221ad4c6bee7c6461db9f25321e005378a8da18ed6fbc135676ec5ce69fad4a803a370557c751de7c5fe137d766b43170dc5224ca3f477caab3d12d0fc70bb07c89d44785fc230f332295feb59e3404e505e48ca8eee677712e032ae521cba8c2cc78fb6ed6f46e01dc5bbd5d2f4e9ae753ea6684ca0ce14375323d5026ac4f8ec1b5e91a30de2ee1b2eec9fa42f851d7c83a39a8d99cb834ead0c06a7940d583e15c7c7b46cbd64126a98e5f4702cf839f99f5d4d5dd1a9503a1bf9a6ce7e6fdc7361721b6ed395dba1a57328965dfda01a9d0f77fc6a7886d8433a6a37f6abedf605c85ec80ffd59bb797273dd0721b299452ed9e9cc5232b53cc6a4c29ef692d9402caaa18e7bedc6731b32efbf75296a69b99c2e0dda34c6d9e1f2372eff4cf5934efb576707aa83be6c5a3429b0872859543b723cb6365e4a3b1fde2f1853c3e835187f016cd7f8740105d1ca21f35edde42a3da653b4e47cebbe1b93dcc26add060234544b95bcce5864ad6322f18524b96c785d2057d2588e1e9519710893e561a6523316bb8f51eb15110882a01a9c8bdd85403cbebd639fe2d800aba6d46737bde349d39b0c560c0e8f3edbf63f6de6fb3391c645437645fdcae17d5208be2ac8864bc4422606a244f22e24b5cb7a1cf598256913bbd3fc78fba4591359f7ab62c38fdd21c502f2bc6d819ff5c3e005cceeed4a9540b760baeec2510da216125c6c3450f96548cdb0fdb374b16285346d31103e244c3f1ec4719852aa5c87ed109b8be0b37c92ebf3adddff4ea919384c4e650b9226ebb9ba3d1eb43329916bac45b58496864b8d32c5c757208", "51ac63", 1, -892992888, "33bedddca1c36a200163a1929dbf062d37106af9f48ca67bb05ad5b0c4e56ab3"], - ["ed7f4b140352c8b96de4ab97d298a7cafe2bf73e453f080bf297bbe48faefa63421d270e3200000000046500ac65ffffffff6efc1165ad424a36fed86405964d0a38e2d962c20497945c6ee54f9ecffdb4b801000000001dcab766d35cb237b53ab6e19749c1208f369e4a818ac959568d956068d0e22179747d52020000000151ea5aefa2027c68430000000000015221985303000000000753636a6363acacca7c99e7033be24e010000000000000000000000004a54093df1492308dff737ee5ab858c9b120af7bc6f30499f9ed38ac7fdfbb38ac507ff2a2c93af6bf1726c7d014464e232a0bfa3e1e36dfbb07e8b6cb932eb4e1f7d81dc7d619a438baa27eb5b6bf073ca2b31eb0c2e842c7ac72b0a1d78ef300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a954952b5f8fee8a4a8b05402109c8c0202ece253a27c980e29f4cb5e4838571e1e06b5bf36ac1da5a6c032716037db6b5cc8c79334725353d4cec8dd6f5b9653fdf659b7bd85b31604697968e7680e1dbc7576e4863a58c6dc5cb9bb80310c0ac9a066b1a240f323c81d7fc8fef5a526cf67a755181e792749887fa88b14990030911ec8bc5dbc60a69fd31541587c5f472478fb9ff65bc81f374984ce479787e03241468814dfccf7593a10dbd7c9d9b23529e769809a9717ec49f6dd127c35e320a06734cc99b79bfdd656f2a918b940f93c0efedf80065d08ae81b60894519482e00028b51b1ec7842e072d95c4385b251642979fcada64be993dcbc8606549eb8022aa4f57031104f5f33ce50730b3540bef4e587b9a05b6b84bb77b73dd54081270200ba77b1e1200bb68b126bb06d6b1b54544f08b808dcffdb27b2480a16e8160e021d681f71f783acf01703814d3cc1345b369171569f3d00c645b9382999c11eab020ab0f2570b222af24261fdbfc18ca9e25f5c0667f623a532fa9035317e1f808f02243fb9b741cc504d1ff50df04048587c97451c75dee554091549b225b71b75575713e96b9b16a7158938d3640d7eb8fd0ccc3f3246f8f3df2fc413d96c4ec4cd02d2d05154b428315fed2421234d263982e7075a13a8f9918e3c2b13d9d814446db91fb9eb104a0cb13c6e4bc5c5264a14fd2b3146ea06f3a38b5d278de05d4c00b500c9d8c86f8df0c6aeaac5347ead4282976321b8d700fc31b40a4e4fec5888e06f1a6127558555a7ee8829583e0ace93cd63d7943860aa368b1892de94f402b87f2ae95ee21781a5ea6f0c3c4f637714cb2b5142f2cf1693e0722088d33de56e20983db3d583a4e6bc4ac45becc5db8b8c7e81919bf2c74f70f4535f96bec0176c4f586296c785cfd23bc5adb91b7f7604754a9d191f89c77e15a5d25ee3d2fc0b1a9ccbb36b838687aeed943e76b2c63c32d031c7bd3b34a85baec37012343ee5418cf8ccc355cde92ed002f021b8d1e3f445d7f0eae057f82e959edfb45a73349aea4c57ab779f04aefffe963472681b47da315dc46b4ceab2d4ebb908781946745fe29b54ec89db53dfb8c2373080df1f357557a5d564a055cb51976eae65f99b5c980400c91e9e0fa5589aa3c06ee5a0e8a62116dde4ba561160a99b7829197d965c2e5bfb90ddbf2a86d8e47eeb37eb9ba80dffadce7737f9e5c1b3e22f625df3ea3bbe6faaa429f2d46ce032198328262d226d8e576bcd0687192d7527586c93e12074ef73a7c4bb14afe7eccc35500979c1c9cd0f964da617404e5f35e5d354a7c2e44baf9f4468083c4ba5c35dfc736c03093bfcd7685845e14fc2bdf3fdb5d95106d1b2ced1f84835d4664a77979f316ee2c8d1c4d9439066b6156c94634480a4f4b488bd8e04309ad988789d436636c4e72605e6a3d10865a67057b0b18204660e9ae9f01530a0d7997515b415e5319a4a0bfca33a13e97eaa92650f952c2d31de572992415ab68a3056dc94f27357410ea02ba544abd54f3c6e579285cb3284a9fb33ebbdda87df27a49fad8fcdf1b5aa0c649af6bbd09559bbf8aa71887cdbc8a8b2ca7016b8d0dc3bb34809e7bf5bf02d6cf958698b461e8aca3b0854ae853803127d2bdb8495d578a79bd4ef9030a35b4d9771177504d886559e48a81ede02718e0c8922bb2d938d17f2e6176c6fd6e730a8ba44bce399e064bd6f1d3e2855c36174007082c1505fd27bd8e7e63372e9d3a013cdefd1a12a64af31088fdaf0eef71f075627ba2ccb724d385f5f8a11babc7d9d35bfdad382a5f3dba9b72b11401225531e46289888de6d2b71c71060bd867e6d899acf5a714efb9510bb8aa467afb1aa9fa5445c302d22cf686338ef99ca40a9bac41c3088544ef8681dfe17e64325e92f1dd849739a85868ffd9d8399f99883320ecc0e628c9d91d322583caef1d8ff27b54076b03a26b9fe62e5af135ca93944e8c271ffc43c7b3d25b9f0dc2c9f715d7cf603280c1571c6284ff42ccbc05f873f8d8a5d39136b3fd6cbd37730431cfa20ebfd6afd1893a4016ee1073312317fb585a49b52165c5a05345201d9e97f4ce93c3aca3c669c0022b8b7da07fa4f5de61da9582d384d8920b3d8648229ee3c38e93239c99541bcb4c36a7d9169c51a137f320c958b9bfed81fbda9ec3391406dbb8bbbc4bca6442d30e22bc235e4807bb5f3a4605e4250aebf0513aec83e11630aee51ae78a1cc72e9f754f5156e7360c65a8829ef97f33a8145e508b3cd473635c63e47000000000000000033200b0500000000721fa7fee282593f74f7a15582b8d88699dc843612e8c8f09b17f9280cf74f67f3dfbfe08f3db2ccae02d26350c589d69b5d4bb0de0f3f29f3819791c15664fd17496f407d779073cb447c6f7052da9113987f156e142b9ef14e68dbc0deb0a300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000db90a261ef836b62d12d823a6401e754e8b44e889045c8fab7c70cffd463e12d390a99a5f53b4638a67ee6bf21b692d3a444ddc58368111a359214c257d76c77d6d7dce54d071c58b2215eb797ad41da14bb1c230bb92020a7065df16efbe71e566c5230d6870290323c371110072117a92a59ec2b3fa209594466df5e3a39b202284267d40703b5429d8ac6a8e3d391b0f095ac6a8a15f51545b583417e0a517802298fdff15140146f5e4acca71b9a0f3dd559a57d1e914a59d951954285cea9610a021bb3b55ceb81649e8aff7429bd7f46e59f240fc847af1e6a55f04bfa090bacc1094b7225478354c51353239dcac9e336d8ba6d32d25a032920569b27afedb6022559bd8d7577048423e5b563d70b7236d7e6902d5d522e8c0f4caa940bfa31850308eaec782da599e05fc6ff9d1cfd4b5cf5a6dbf6e333003d3f8cb1f2beed6951032e510426a4edafaa44d123ff41a0569b81009f04fa95bda238d563144173dd860301fdb6a27ea7c22e1d86fd2e1489cf8e5937cab95fd5a4723370de5b2f90f66a0224b6ff7f938e977bb4fc59897909c56181c53b42cd8fbc491a64d14e25e6de15ed8294be9603b24d1a2d6ebf7f5426d7043d5b935ac065132027063d3e75aed4d9aa686f21b240c0d652d0a0be33edac44ac44f19280f9af85bfdf8a16cc64b5acbb9e5e7e3565140c354f79d02bcaaf500f1b4bc5a5daec4e3804d398e69d389b0e91ac46973d26772c49efe858b7c750f4432b9799d702fbc6d74f728ed81f3db542c30c3b5463c4250cd80c372c1706fc2bbeae88aad986e8b655e67c044d8e202af5b51a800bbf5fb250c954e6caed8883d8d9b299256488b50db2df39a60649cdcbe5850734c2f7ae4cbbf489c138ced03edb5bf8e7e13a1f847b96fa4962addc2b9c9927f853ad780ceaa82b9dbaee86cb43e1a387ac50011051a8cea491c81dce3b4e29223301b3948c4ce73b7703e2833ca5159e07125aa630c6ed36e30c328992cb1b6abe8a0c4af62b3c4cfe33c8e68229a1d2357be0fd050bb2110ac2094cd8f0bb4cba58c8dfc44f60948559e748a7f69786cf178b68c860feaaf698993baa6c765c418c5bfa0360b45283f1b309cd4831eb58c907331c4ffebab04992f9db817294b5c79743538c52c30855b7f9a213c68f8bd023061335bd0053390c268dc9fd57e94f241ab20af8e249a17eff0e60051ee33e77c7249f3afd8d400fcd9cc4fdf03b980b3b0c83714d8a809c5b3c4430e8fc3a69db87842184542e884bc27c6deec8e6e40b48607ece3079041fa050735e0c3066ce0d5aeb35d88b5ef4bff3c303b1a9543276b0f89f418c9c2e8426d5b0ce229d9a800fb66f4f82a729fe25fc2989247e0773a0626e388a34fd49e0c0794c89074ab4d12e65efed5173b25205ff4629ade5f920a796c2c6d8f0df51d409c44c6ada1919dac4418cf4d617f29804ff41a879e0a5fe16dc855cd46404e642bd6375e6279758d074f9c57d47515f4dc58d9d9b8af1c73061ecd14243b9f91399c8fe23bf34ae6eedea015f9d9b27f56072191beb4fa38e5e839180e061abf489ae82e51568ff57fe28978ab32fbde4ce7bf908a93eb95cb47831a84eeeae0706678df0d0a6e9e46f3b6c445c420fadb6ed2057bf6918492de699f0f01a67914d3295c8c8ba43af60d89ee23d452eeb3326438b55fe25a7e7bc8e0427cbbb22b70636741d3352aaa71460a12848d1fad0573fa33948b670284dc784d9b5aa074089ecf3eb860651e5cf9cbd4775f3a9ea71cf22cfab6dc1a971120c7e99b6b9565a934d3fbd640d2eb9a66e29b36b21596c106ef7a063611167bd3ce9c1e06ea6c3a497ddfec901f2a95eda1df23c6fac7b8176e82e8500dba7b086833af44820dc81c6e5b4b1d8a35501ce05d116ad7427b5443c9442395fa6f37fcae067040d09d342d75a0d0187e3d284622135e257eb761a4b7ffdc8ada5dbb626e5ccc7546d843e2c915cd0f8d99f931be2dbf7e10fd895a892cc66083370a841cc13bded6a4ff73297fd136671e3ea054ece6c072a6005e4769496a6eb6d60873febb4bc418b00208fd3daee3714c96750501d5bb24df3b3470d30db6f7a9f537fd0ea85c8fb6ce861ee5f73c30c7c9e257d951cdebe7f3e1e8551fee972a5da2ece51e4c40ec8aaff917daf0da262d2dbb6ca522fd9861a4be25518b6874734413897394b7ebdb49718484ca22a02e39745f6ea87d5a0330e09b12313e54343c47b5df914405be6d172aaaadfebd4e960a171a4ce2ef2878170523df4000000000000000051f8520100000000c9f7631c41b4c143a5429f2696f12a0eb6f47b32072add846d03b170c1553d2a512a3f7c3a89b6b00106ad2c344bda643ec9c7231854a3b288a2f3d005a44d45e4233a8ae8dd6d8736029e671314dc0521bc3bdcaee26e523db43e5b13994aff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ab1724cf44397e065b8d8e003de3e23702777b7f0411f8858011dfd205229502d23cbfc12f07672da45b6884ff91f8f50e0b153427189ef3b73347dcf79341c5c9a85d4500f67dacaad8dffb500f5d8bb38fc3af20ee706b16a6001d84e8fdd7fa000151b08c0ad30b567b81b7393befa5257e09e95854b431563f0354d4a38032c16187a93e4d50e764f6a482773d0ff5370c274cbcf8c48404636b9fc8f80330215f3a17063c91398452e1f834a151c96e707078103c99784be8aee1b5d7ee26c0a01d729387f3ae4daa60331263116b36e6a5558fe3b5933f82c573a0d388c358429375652ae4b95b799442f2f5eb881aabc4073a95cb8e56b877d4699314f0910032e67eda8d26eb80646a9117f87abe36054407058d32a5ce4edf2f95686ee56100209b3774acc9257da4a2bf7776e1a48a2ea97e495e00d25d7bca8b905e6d95ce7032dd9a3cb1947837b2062ab24d4bd25a383edefbd084b7fbf2a254652a3f65763022061acf66f272f8e1dc5502b900e75cc747ea1ec39ea693bb47a6816e79c9884031855a9fcbd88852bfad2c7c74237d8c971a003485908ec4d64382bca455a8f429904aca3e4bc17b967a9d3d50c2b90521fc4789e42832acc5f89eab7232a4cce91d78604194dd81a2c3ae075ea5753932b264fb472812b74e9ea1e9737265956b7f205adb917b7100db6613e171c11eb6b753875bb8e0535d95bbaf0daea9e6b4227b68dfd40595c11fa01775c27292d280a6d6cf980559e79a1092c10e66c37c157d9a2ef63d8154c7aae3f0e74255d7be54657f87938a0e161440508c515ff26d42e77d4ee87549d373bdc1f71307bdabab7743584640aec045d173c56081b589382d4898047c6348667f0c5512753d7069ecd88ed4376595f79f82f23ef36e749cfde16dcf36b97e76c59315afb896f8c082466bf8978455f40564b72e52393faa897286521b909db50ee6eddaee99d69e0cd496250eea7cb5148188f6e6f286715b89d4d6093c4500aaeff8e6439b65f302a00f5db4bf5da3502886b0bbda54ad07f550713cf4fc63d083b0e66e24a80c6349a497f7dfd628dba4ffcaf1843372ec779591d0e043ac522cbcece2105991149c2b2a630413acfbbae2e8115a192da6ae02b89bdfb4186f524a0ce41322723341e0c9ccca57b14572633d8f45de612c1f97c06d8cb6f6ab6593c1a4bc46c107b2f188bd503badda224fb63bcde1e4f9d093229b552b09e20c58969d132cb91a12e3fd96e18f8479fce66554a0dd35ff2146be450c87b5bd92ab53334cee32bb6375c1d636a319e19b271fa0ea04546475ebeb3db79d0fe42dbed986682c5f278ef73868c423671752b35a698ce4abf13d7e20d0bf2c9da335b83d197e15a8ad9662157b3e3d1875b080d653398515e3f0a54c918eb2b296b3b2b59343d90b0b31f9fb1f77a0f3e8866af48264f97e581beb62c419a99ff851558ac422500f396e375aecb0df99e79b213b478b5c3d6ae97937c6b25a420b50f033773bb65a55f3f97c05913b4a7b1f1c2518304ad71282fff3459288c3a8e480ff4045d42d6e4fc6947b764d35714da5647076429be2ecfe5fc5af18b29a3b1c4ff33ee20d98f0d1b33d9c51e9905684e2698fdd57e7df7d245b652b9bca0a04a700b34f225a4640e56c8d16d77826bb141eda3599130ad0a976b4c76b89c05bf6951b8ad233d4f4b4dbf499f33572fbb727aba0e8afa8f2f112c813afb8cbebfc7e2e91de87b164db41064839c40accd0d483709648c08202e74e0b1908b6a41c7c59a97224f1be25c74ad2ece3287337e042ceb9ee18d210c200401a0252fd7e3c522804e0ec9d2165f2d220a878489a4a83f8bd0316f2e011cae28ebdfc01a26beb99a56deafd9ab2778d9e5a860ada3e5a193dd81e85bda49d2a2bfa7480fcb996633b5d5b1d8cf915978732f62ea4164bf857a6bd6a567b54162cc85d6fd3933dc4e7d138b44597232af19bf88dc8926c0d183dda88728239cb7b69ff15b0543b5c88e027c65328d63885917dfa03ec1e7edea587de697e02d913e822c105e5fb732e80814b1084bced1e23d2aac5aaf5b43d7715e79719086a642b1003f3384dbf6a5fe462720529ddfdc0007a84f293046cf500694f6270443329b1b3f5ddb1bf82246e2c3e22c7c5fdaf399879c9a5387e69f8df2c71255aab37abc072af447316f51f14879aba3be33a4786d973be47ee65ad4bcf64ef781b8fb838ed17155a23d6726d876e10a9910a62657540f49aba69b9ef196b012a378b9d4da0288641695a1bb81444caae54e0e9c3eb4f45f30dc37da0909dd1b28cacef95513435ee60979ac1c2f8305880401d1d2eb2e4f4d05fd3a212a83850aa2d688908ffdacc58ed575e978dd6c9fd61560ed36b6f8961e6afdf85833150f9595465b56881e07", "acacac63", 1, -2077872966, "c8ff42f61991ef7b798f47bca6c8be6ae632ebe4383324d584814791eea113e8"], - ["030000807082c40301bc18e648f219541d4df2939f06320f8fa5d003dcbf0dbc5b5a46c20c7aa9de710000000006ac53526565526f93734d02fca5b4020000000008ac52ac6365516500e747b9010000000006655352ac6aac36b47d06000000000100000000000000007942060100000000a5f370c6ed4aac00980e1735f200d6231a0283e916e06a386ccbea3cf1017fe85f1aa5ab1a9d209c19a6f5799b4803f9b4c317d310788e9167227a519bbebb8452b86bba6159147a1dfef856888a9d2cb1d75524b982bf954f9245a1d14ea50c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c24a51ab10bd9cf3630decd43021aae332d906bb27dbf4954ce6b31da97157ef8aaefa9a19037df89d99d0ac001a23486f2315216378217ed7c434259dcf3d974089729d8622054cd626351a902075db5ee233dc30ea8fbd70165d67dcff05c53e9e41bcf63699a19dd5b82123359e86efba5a73f54f25cae73cf5d9db3578f022123e3ec59576d5dc7245ccd7a5f471fbd1db33b2e5abe9dd4187da5b4f9c34a02293d8e89077382b3823aed27e3f88a5e17a68c400b7a46aa9dc9e4c5b12bb67a0b03ee82ce621a8e430aab3a1410a24d1ba63d40aa47baf626fce04080e7b334383e4a9233a6c8b3bc0c930ad6bab8d6d043450a66b3052863185d421f5b49c661022677df47e920c37b93ece7a4b384fb824751789931478baa8679536a4587ae53020027a416ce2e3826b5d4be73ac752b5fa8a5c2f2535aeeffec88114897abbcb10314be328f64768f32c41d430727b22b6be4628db3cc0ba13d57100e84f3c23e340315ba4d0ded29ddf338edf1055833589fc4e3b75fdd6ea006d39f9f96d84eed49031b2899630cd55dc2b58f82b47011fc972a23a10994bedf313dee3d375ee3066e692bde1b8243fd5cb5bd3fd505b88f215c1f46f62b71056657d9529897b84f9b72fd46c7d17b99ae14834c284e1d51a81e1237823bba621c93556a5504701a9dd03d5dee6de7116953426e9e423cf72c9c7fbb85f0069aaf3b2b7deede2233191e41b869d9fa851f58acc5d7a09d384164b60a46346fa8811a5f06ab1d36ca907c6fac729062aa86f12a705284f3ba634f0b5980f1616e349691d66348cb02cb032268a8733703d2d39096573f3c9779532bd6399de318cf666bc0cc897255ba3558b84e67c758b200518513a0df8deacf95096785734061ef3239fbdd86e7b8b7f37bd8ba59c09a75244bbc70d233cdb4c177c6d06689da28a9cd2109a42d15dbc8ea422fafb9b2ad14e8f6db4ca53da1e49c747cb836ba394fc89b8e11ed2ec7e310de074797a80cb3602584b9ea0fb4299b5b5966adcc1a5981280307c5706cab9e12c6b614f2cc920b74dec147240ae2c5a6c067e82decc00f88429a7f6d3d8f1fafcfb40bbebce55fcbe2e0e8fb2cf3f6e440a84147296cfa71fa91d24f8c1af4cf98426ec5d21dce15dfa89080acd581d2b46deba2fd9e3d81ddd999473585f801ccd0f1dd846ca1f07dc13740c5d99f8bef2dfc31bca93a187388ce768bbf9abd10a636d9ced22db6fba81eaf41e148709da181faf9a5c24dba97ed4cde3ace54500fd44a06ddb1b3326f937f0cce20b2f0fc67d6a36beb07fd89ce74e94d40f96557d0da541189e1bf448cba947a5eddc1ad6bc445bd7bb582110eab828aedc3e119c53373a4054a1cfb65ae2d542210a50c48365c4920f086caaf563da82a3ca57d479d78cd63cdd38ece7edd636f1a713cc8013336e51489ffe7b99c485c0eb28ffb7759d5f55f74b7ade55493f4f02cd5526b610eed21f69011f42ffbd4027165b2d9765f816d3f6a1baf82d68e450b12108d810dc45d1b213effaa6892464357c91c489d5d49b8fb506e3c6631d705b0e7329991b38fa7f92d8872f1e2c6aaecd59b8c1284f37a736f67ffb4b00d31824f70fb0815e1f8720aa2ef523dc0dba8ae7e918e18eacc5940fcb140b11c219e5bfac1bc08c1ef54afe156db603aee909377a058dd124dda185f08ccf7c4dfbdcb1a03b03063329e687a17e5e45460b2b912a6bd6281e89f21262bcd8e865a301a5e6ab987d796e5b2bde27887af43e57e348a361f2afefbec89a8c7bd9d2148b6382b36db22be878f2d173eff0b9574f27f1859da47eaf302cecf71d0dde06c42c84506320522ea4d014c242d91d0e0965fd5ddaa616f478af2780b45b01f7000ed4ccf2553184ab670e336b2371320be3d33d639f67705f0b89b54661cc23602600312acddf0df97bdd92bf1344197c70be5fbd418a5546b947152a4b58b659afac8197888ada4f51b5b74fe0397792cfac550589add06e5169c288908b995113e8467e779b8798f48803d6136734635c4f8a1fbbabb1031d180d03c580b9a476892236652ff45291b96e352471cfcb8d370183b93fda86bbdf2e58a899a30aa3f3ce6b44d687f4a09d5b5642c7037cbbe4dc5a6b37cd78eb355e1b02cbf221b5f350bbf5a39f24565d4b795c1f51402e4f76496b684bed8fd47f8e9a233a1730ca3f217b4213dd456f865500f3877b038bd10546e68aae827d3457b10e23fcf971fd0095c9aa3b785b452dfaf7497cee2b721fb4ac2b8e4d8926e36f53fc99930a2fe2276e8941347833467f543dbde3e4fae3c9b99b1776ea823083aed930a18941f938331ad8e85ac697ce161c89bed4ead93133b78aab8a3289c024472185b55c472775617e3bded80fd203824fd734878a9db4c5da270a80c", "63006a", 0, 1258290660, "1ced8c9aeecb300b8249bfdcba1fa18ea190783d75f9245a756652f58e60e16d"], - ["04932b0603896f3ace8436ff23ee3d8b5c48091c61e034e336e324a793bcbbad2836ce53320300000009ac5200ac636aac6aacaf334e320543be2424fa01ce3fc30520814fa6eb369618156f2697f7309f5006f3a83c4003000000046a52525318dd88b3f644306e381d611826cb9bd6bb9e20544031fcccb7c9abb913d6ccf1e0fb8f0f0100000007ac535152516500e2d5d80502316ef5040000000004ac65516ade31f90200000000016a0000000002799ab10200000000000000000000000035a5ce3f659c756e8ebeaaea550aa8fe120e6a0ca29892e05428139d45b9695083c917c8690a8a644a47ac3d6c03ddc256fe0d856ae845e81b569acc4c8383dfd76b6663714e0e1c9d3a6a8f34e34720bff3f68d1d66d2500ebbe14980ca480c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021758f1e746900944a76235ecd3fd272fe689a26f49a815d439d96418b3c2317ffc7968585ecc0de13bcbfc00f9b59159f2d37618302271dfea386626d83bf8e973448f15fc10d30c0f538548f03cc713201380e5005a9e51a878b1b76226f765726dce1a801f3ac5b50f1b1edc6a5a35a8554ec4766d736bfd44a217182f032021a19f64e16ea8d76f8864ccba9709b7963e84b230dca2af6f9ecd6f5561ed64b0202e116a985a009b587b7e3d8f2742e2b864b901ea10dcf44ec002ea244010a8c0a08b402785a11678a6746912c72a268c21f1ddfcfd14cd09be6466a38220bf0c0845793f2b4e9fa8165eead6b7bcef2223f0768f5f195b4774014077936424ffe030e9dca98bffefe1e2b5996165618b3e4dd4a2f5b7051e12cf0752b42cf587298021241a8f01c734594ad9b21ce21f9d94221195eecab6bb0170569d70b2cb5460d020b8e3713be8815cf0189403b69ca13842c0e796b6ae623bc879fb3ef283db17b0300043469fb3108b2c6ff0d90a4091c3ea803675054bc15d1e91607e24e62b8770228f2982dae0af12829527e57564902c39cb108afbf9642e08f5a6b74849b74c32be646187c2d7a68ec6bbe422dfd0ebda2b17430ca24bf52a154968684986f6a32228a311ecc26e4453cf0329fa69b10d8dd39dad4547039a522068f0d34c8fc1d34cc1cec75f7a323892aa9e2578a1a997c01199e7711765390faca838c5d33919d055b8332f8585266b0a5206778644151e8bcbc90fbd2c61e36a9d3d9f11c85fe609edede65c5f8ffa948b489dfc21dbc85f63b5d4d0d656dee6fc5283aebaa6fd2e965237fd5d9f0128b871fecc11916d85eec5364e7d412d9d73df924441283b9ad388d48369c30c74586d250e36bd344281409a1058271496fbad05ee3d9b3e5b98f0be2b002aff4c5a055fa154efed555af939cb2612705e9b39284cbaacce9f1a11f9c057492e3656788a46e8a889e104e66a35b7a1825889d78cd4f7d38a54094833316764103c4429061abcf8ffb081d91f43f98ff06ad07a6f9c8b73750eee5747bb513414f79c613c4ae6039954bab92a570e57b21caa98f73bec43e74a94ac9ac4dd0c7143ccc5167c1a1a776f1354a785022876d6ddfbeea7cec9cb7120bc2f2c04689a1215d101ab46195c50b6f50aa0fdad671b794bfeb96801eb8c47af335ef928c6989b46b1f95cf2301ee8c8038c9a78aadfe79467a6c4dcdc9792f5825b41ea6373ca3eaf3385d2326231237ed578dcd728449698b65268669e6ec0fc177a79678cd521e401290ef44bd3201bd7d8a7915735b0962cc8dc8065ddced41b5c27023273c215afc3b2a2ceee1790560b3bebb215ab2c34fac0e344c0b9fd10b8639b92481c24951a9fae016fb4b0b69776330bf62b98f6d1d3f67b7647ecc1697b2f7c625e8a1b3b8bcae8a7e5496befd5589a94eedeeabc8d7e1716263097eb5e13884d748fee63537d516d15a102e4f8cc12d9f883d3978964ba267632fb0fdba9d49032cbf01a289bca2946913294f9684fd541b25a3b6519205d4d6d5ec8054fef1c134cdf51b00bdec63160fbe80b5d583362d2c2d674204bed046e758594d0086e56f7298abe3156bd5ad8235fcc5afcabac79f765fe5db431f91123bf12d01f97af68aea4867d18ab232bedb36afca3c66bae142a1e86ddb54ba72c30002181f43aa124e95c4f7533fd83c1937782efd0b57ef3901258814d50f615db419a038c696a6f82ddacde62c48db151ebdda4855757fc0828da296d766b3fb1a7decabb593306ac03ff136b4f6a5cc4a1080c86043dd34829253efc85d929a5f34c9eecef4b7391466c0df11d0b5b52c99ab1bd628de966e05d1ec2eb2ef4cdb06999c9cc11ec7f0ade69bb9d81b52a2c5fe6f6041bb1a7910975b66a1d98db0205b88711e15870ca9d877208082c54d84e9b6472aa4f58c61a9c8baa8928be04163a1344b002be0a5ab21fe034f529f59781018729892ca73fe5acf18b3a454085a6047ad19984f6d63fcb9da47b169bff5e437ed849999056129c1364cdf2758181c43f04399c55dcf879dd254d7410216c0d1ec48ee63d5e6857c7e57b4e002a114a8865275efd418fce813f85b35c65431b9855d850806972b70b9ce83c73921d17e149c5bcaa326802ed7cdae5501367ea58caf0e8c32e810eb5169031b620c296116af4ff8ce192c5fa2dd27bc246e87ec2f7ccbef30a4f7c432ad6a806ff5259e837ab0542c987cf6aaa6d738b9606ccf68b08f0ecbb67fe91192e7b2440448c567a989a3d37a7ef604000000000000000000000000753c3e2dbec4e908ca6c730deedeb333db0b66e742ded13fa5f3548cda1489c8990624247758727a424fbf2e3d47f74f24386e0c9cf3cc17cbb5a018329b5597ee85b9514284240095cd5d6af3ede26117d10dc0caa62d0048d11e9f81706cf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d0517e571259ee06091e64b794bb535410d20dc56e998146a90a16e1b1341278b136c45a57b3d76861e4a6a4784ec26f9c6b68a49d2a507e6b01d9afcdb679bd5690d716286247852677da513724d1a38a65b5eef44f73b69e932902c73e8432f8730d01064c66bab0875795a407d9e13cf0e7cc585f4b7e264a87b2529675a0304957832d5858528aa44b94e89b8cd5403b794a2fe18acc81d8997775922919b020c8d6066f4ccdbd34cc55764208797558d696d448f215bd89397b9781ca2e3190a08e6c10572862628b9783495e6e23ccc05ee70d1696032a0aed78bcf0015e3020bcd4420a799fac4967d5c7a9926d1273efd8b476e526b8814fa93cc1f5357700202f970052a28237b1a5dae349fdab3011dd8bca33c34a571d62c795ece3e4a27032ce5205c81920199223798d0d10953b1f0900097cd75e3497b3ca7b2c2a6670802001697a5d7ffa6b42eb2b87b2d8750c128f07e757c1b60582e5fe33fee7ad9a90311b7fc493fe02589d37abdb2f09a18e25cbe4787422270a86f4e99d20f146c4c031af931f3d79685855750eb31b111e6f8a86f8f6a64822720c07e210456ac277b597016eac24ba1cfbe618ac2052ec96f63ec3a0c6dc3582149b47343e5b2dd04eccf4d69be9c5be28ceb45f73f291add0ec1dd705394f1628be433b217b3a513755f08b70fdae76d70a9fbcce0f0e3adbf96fe8d259b99ea9768d2921fde2fbc18ede0a1c1a72467e1ed0e12993bf23be5274f0827baf01e4052c0a6719ca6426600c4c17387ec3e4d3aa8774d50a7610b3cabfe2224a14cce0d49531172445977c2f6f4422c709a433eed172e7d0873b0092001da5598d9433c2d1878fb1f8bc85edce2781641ba096340d0ef0c4950528cfe11616c0474013db3197c6b12b3bdfeb4185b719ea33adb58978dbaad1e690b5d2f22d380b9db84b27224378d22e16afced4454f0a9a2ea193a7e8fba6bca841e97da6eb19eb3368039e61f634ad2690b25080827fe083bbc82a47cd353ded0eeb822528e953b6eb782e3ba20c233d452bf79025f61a2917603ba0d6150fcf331bb9b62116791546e36dcfa359b4ccd8b408357c5a8f9529164a650a19d93d1ace6ebec628dc7b4247d8202208d005c71f35c0eaa199258052c7cd94cd8c771b82d648af42e409be9ea07701988b153b421759e2008da38b04951c3726f341b575c37702f62a4d2e6f5b625a4b2a25a180165bbcc4566e5377b273ef2590eb480e365559a088bcbebeecc138afd4772d82c55a802f2e727076f1ebae73b407198645662483f3ae044a91dbba68955fe591838e0d9c0c6da9af97bcd702bbc8812994903def738e7b9435f97433c9ed7620ec83b32b6ee8decf2cc03b38374674ffb6f9388405d83606e8ab58a305ec5c4d226ca0d64b341d15c5a7bc7e048818ab4cd8e0eb40f3dd344663c0a76abac28bf51868f72f6fe5864d3be8fb7fd6a113e1b8b8d49b891906ac2efc5f3fbe7a9ee045168e20d72cbee0259234d42527a492abac4dabf8641e1f53e95bbe0ed776899c3e1d4a49d03f0739b0b9246f4108a12cc96afa8257d9f45607810ae1c3ad63f2111d48935aa4569f5aaf909a50f74e1714ae53e87c754503ea665365dbde98a39a353c8e5c90b15766cb844d3463097e169f4e0b0476be955dbf4b7928f262c56e2630116ab9421fe3cfccfa34e9b7c2a3676e61e974ab056611117ccfcbc8d557f84b6c4f69e46acd42d55fe494d86e5e4805b6440152c3a94a126b73a3c9782f080ca06d18612a2872d61b0343ac2a2e6c58b884a1886553cfd651afc6b49c81fdbc869c837a295732ed85cddabe0a9328b476896301b0d2a459af949c60c9f5ac1c5c43deff7ff0ffd35065bad42899ad2ac352eac2d588543616edcb3e4e0fc84b9fff3c6cfe7809b90d9bcdc96aedc6ab65c07333985c6e25136a92b9b8ddf4b5e9df1d8d7d0e4c2ed84d49da15ead589466f193ce278b002df0871d3fc2495e3f6a27b66b2a651cca00c6b0d5da27f581691a97eb436ed090af502e2ee9136a359faff9c0854d0b763fa7228e71ab864f5a119d8ab4be4e1e37952d95661a77ef10abf14d838439f4726fcd4a9b5637358171938f21ae7e7789ba3575682a1d8d49f47bb53d85ff9eb53775ac8301091a57d96006479ffb1b6ec1cc28289892e4f3735068e3b3b2a783a823f366236f6a094d48e31c41441731acbdd3ac8f1ff4947c238ba8907b61d9f38a06bc81fab347b1305fb84be62e42990519bfffc81fa28ce3d2a2045abbb49327d2c03a5d277f74eac7e3c82a5fc85d81a0ba0891d1ad77bb49a977cb7f0f01b2e284075c6b4abaf1e70eaed5017d1c1ddeb1b8337436b62111473e5a40550e2be60c727e728171ab6959ca6a691baa97c32337a264246ba6d53f886e870d", "53656365536352", 1, 1499264036, "b0cf3757dae4ac24b50b3a06391e80a58f4695857a892a0660b71408f87ef8d8"], - ["2220864e014c15f10442d0ce593261e027bcb2269b48f8417787f6aa5d003785bb451c75770100000009ac0053535163ac5100ffffffff01cb1a56000000000006635263636553494ea84c033bb1b30000000000000000000000000011060d67d12d8d6a92fab420b3cb8641f21e22df6501f029ab187c189bc1590e50f1d28abba9e3ed6f0d555bc0a1f1da43a1561c216f87e612ce086eb69deaa3ff195b67138c681a367ca4bfb2d390de23a0a89c002da7434933f33dd57f14c200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003611f5790d815b2b8f0267c32fbf555b8d6836a56ab5670affe93d3b3f899a420379c8c2fdc92b341dbacb8cd1d40a9708cd071e86ab2b95d8df68348050a919e4dc6821d32ce2efcb6c0517f4768a666cf5d40641d4dc7cc27990ab0e1f328d3e6d3e410b019afc732aa1e768c6036c24f5636eb443b28c284c33d2330012032f0fccf81e9354cddce6997a5aec9e58f95c046f187f8f72fa21551a59e4e1ea022d20ccc1657f954606742a42196fb394113849a325fa48523ca28dfe48ee52560a02f75fe6c33ffbafde2b0aecc90b532a58d20eb5f15a601eab25c190490ace767b17cfb881cc1af3302e8456116507db92174ea3338be54e597edfc2c76bcc8e021cdfd2af91b2238341f1af554cf243fd7460ab71f91f39e692e04dbe1e7a0204030de125a5d37a9b1a661be3bf28954efc11fd58cfbe00bbad76f1c902ad7bfa510310d224b8cc0859998e42bd359693b958562b135287cfa7155eb05d1d1e821d5f020e35b30f479a8c6f8383ebd23725336266175f3798125f3dc59c96f3e31cef7203052b5bcf98a22887680f8dcde56c3165114ddba5d4923c6410caf15322f9a92ecf639e4b93397b8430c522928f1fc2f15a295feb124d45ccdd4e06ce0cb2708ca98d6f64c7ca390c784cfe146937cbfe387f1b37b7f7fd6318adcbb9d7195d6defbaea65e007815a956be76e94e0f5abda3450c5c720b2368e38d92ec1ecf934462a752dbac3321c755cd167a729ed92c5c6248edcb78967565c38db8c6ee0eee350d87c39e954108647f6a4786888844c08fdde9bb824ba45b216665fb32547dc969c6ac59691df4cc47c78ebb1c970e4f01864660eba0d14a943dfe20b81b5289c55d4ecd1567197e67cbc1b71e547b1ec23910cf94622f390ce76febcd988a2a27709e3a3a346973265b12ff12a30b8ec9ca021df54645d83f4ac16d5dcfecb9467aa1e973cbddc18d87f4d73a8c079c019565e1c574b4af7145726c00c7dd6462503cfa1ca4f2c7397768f543c48f50d1dfb37f1b5b000f78486bfe44fc9a9879bea3f348d7f23950f7ba028f3b7212974533899c39b515a8fa53d261980fbbe76cc337e0d92d37430f983b068d3e3fc5a8dcc10cea4da8f109ebe695427112ddeb22788acfb39f41f4f73a7293e43fdbd1044714940087f3a1930f0df79426e2e1c909119c5dc8b7066868d95251ed95ab1dbb583b8d179222c414fe16ccc793c882b4349d7b23141b45328f609b1f343c7d843641e7241ba17edced57de3da1d335e1ecb275515dd7c8604143b6f0e3c3211418b9b3d7207809882d0b1394877cf91f23485dfa3211da9dbc0d1f167d8db0839e18efdb9ae59dc8d9b1168f64b387f87c0388c23ad0a2a121986cf2b5db24348cee8ac85276585be8e69e669c765bc848d2a8dfaf7bd6dfeee90297beec1a1af8ad4e9c458b176e27e88a341c43b15ebed32394a5a3f100defc0b824acf364ab7e9bd08a06fbd7c42e7bdc7a704effee645d9d0dac26046cb66b0f055d2c64aa8586d7eced7b66008eb36f6f949fa230da11d121e2abbca4ac122f6349a4c5cb011c25c0fd70c63fe3bdf475ecc4649135d60792ee80bfcba8d6736ca3c86462a624621e09149580229e2337e66ee1688260fd80e15f56b3a04b06ba42fa04aec672583a201cb4f58e4827efd551f66e67d30d1d2b8797f0e5eacc03aa1da2ca34085a0cd1e80613bc05014e9c3d3ff87cb647f022ff715b3238ec6e61856f28f7cc3ee8663b3b5d61a7cd88aff9b79628bc6fb1c072d3aeb7bdcde141f27da39160905347013d914a695cb8a618ca65e6904ebbe1fa47ea465517f521836b53f4cfcb82e072419e1817b699e39d5cd298d39007f8cbecffa80d8d8970f852e1ebd0f9f377029a4b50d78d541061e6f7a3fe00da79cfd973b10b79ccbc4734430dc14ee487ba0587ccb48500bdd422f85ed1a9644b8b045087ab09863a83a1b12a1001518e4f690d7a54e848ab272eb9d4e56fefb8cd927930c9de872e0a23530e6b4c67a42351fbe4b87f174dff6c18fc4d3a5f7b6485e6b87356866295c640b1eb1b89615e540b2de3eafb69209398e9163bbff96a19cdc90a29aff21c24e2713d306d54b94696b0e6651bb61824d2d7b99fb3bb2e315722acf731a72a21681c333c5aa09edf3e2139d9968752b0306a16fa122525dbee4b197d7188e83cdb380b2f43e59b63ac9b1879771811fabb651fecd33cce485bc4c6f342a39978709eccb4efc7e0e3270b4a06f4656442db4ea79b58c295ae632e0d5cffcc45d100000000000000000000000000c5e78e03f6c919c2b0aed6aac3e5858aa6e9c7229ad660d67222ffd0235767f1a2b16715971bf26d9b76974ede88ef1d557208c8c61eb0ef8ef1800d99aeb8a049d831347b2e7e107e95e2d5cfcb6c488f6e6559508711701cde6162f9fc7641000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f1eb95d135c449b3511f5fb91893a2bca9cffa12b84ec959b76316521ca53037e4033624c7fc1c2fde0bdc8c857d67dad78feb5afc6c73cd0087de7cc46f22ca9d4f79127a57839b03d04d2bfd1636f8f01898c143204c29aa4e1d06897beb5a6c56c6708b4cc2226cf694a0a06b0122659d2cc8ee03f3214bbe8468915f2120223b73be0404881fd75d7d083417288a6681eea7f5d06b84b8337f852a8f06c2e022ac687209611edec38b5f8cac69c132650a9551bea152b4a303eb928c76635e10b06cabb2d5c2bf32711ac447303868a8960bab47b3760fc088ec6613ca05ad9cbc3a956794ce61c68d5c3c0a6513d99655ad17d21c9c94d4e9f11e277e988eb2102028ddc780526765ad2af6049a8c1439360c9216d0b250b2ccc206b7354e9518e0330644c1074c009ea27df05fbe77811e879c2e498d42838fd75391494ebcb0bdc020af8a6860e24bdb00e2e069d7d2db5f044d24ec60abf2dbae5d11c3541abc56f0214e253a544a6b83d884df39c237195d44f134e35a8e0c4e9ecaac7f141cd2845021b3ce68b9dae73ec85bdca80b9690df986afd23af1064408b378c4932a5bcd847798b42df1a899a98f4803d3fd9ad985040aa775ba1d308b1c6500cd0fc23e678a0715dbd6a4021294ce446b62ce7b32748c7173dc20cf05ba12e4c429644e30d03f69ac6807e0a4945ae30baf0d075542ce1804aa4681beb06af1d0317450c5e3b20580a8e4f119f3abd45bd130051434df27fdc7624c8aac20dd34c3da7e6c221f4c251d7facf3fa928a2e1ac51ebb7c4252164d087b145d73a717f5240ea0703f4ebf26e4c7c8be26785a4c32f1dddb9362ce94975384f8be7cc8ad2dab66ddadbb5f6fcb52aba8dd8290aa7ac005f2df5628bdbd9371f7a98e97c2f88ab560f60635a17a2468b162f6c1077d5d952a646e8aa417785ef9d6d8582dee0c3f93350cbf0b2227f1c8497cfb7098d72e4a33a8a6e8017deed203e733b6acbcf884edc4da366627300bf4bffa5c360e466622818dd337edf13184c551ee17d8cfbd799a11543ec53f15f58fba02cfc70cce7a62452a73a46fe9e72f34ed2f92f84739fb03dcd0ad2c1e34d3d6fdc2a3123b1e09586e5b4136cb31ca05d6d6daba66cc35e4440e6370e321a1569f60edd6b3ca5ee92dd13d9e4c0d9a90db3af29bc81c56c773722af801283d774ab31872940b486e984473cbf60cb82802b13b752f6aa6a02c8ea5cb23b7b84d5176dee151aca1caeaa580963a9aa57d7c336871b18f898b409d42a9d7d0eaf33f5626c875882004351626fc3e113acb01a68800b73df73382732d5cfeacf5256050f2dae27d15a2eeae7496f410121d8c18b40c23125d0b3d477ed4593739b424bbd9c394eaa5dee7a83e56ade426a4e204cafd53ae71d5445d9d5de40cecad040eaed8919045157d31994af71c799c1f02bf7fe5da3717a0d0f2c0b11ac24c42b0053eddb05d8b57cc8b983b07a7564add118af5bacce5c2ee3806b4399312462eefa372b2027e703a404430d79e6cf586a5b89c0d2588ae41362accf198f1cd7f2505679d9463fb9c2fa70f95beacbeac73fdd9c167428cd8c5aa51cca39629eaa444365c765f9d1ac8b8066efa2098306673d1f485cc6dad255064836f7d264c6865dbbfc138edb9f79a8ec210dfd39bef33aca3ef27447d3b7ad89d8399bd7d9fce42b83c528ab5de629aab762a6e1a29de32a1cc1d11da4af2824f7a84cda8a72c80c9fad500e5f6681a2bef7dabc0380dc5588adfc07899a84fa924af8e77b229b7a8d5b030c2692f5a9e1fe10e24d43efdda853bbf77e2d74870fde42970c378525aa58cc2a29ff62382a13b8e1f65a647128ea4904caa097913308ccf645018359738608d89376d9f0755422621a4150dd58512c268130f91530538f8f16ab733f8ed5207dffeaeb83137cc19fa5e31c3cd77053f1f9f1bf4a43f5ea6ea86a8d6a027d68cf7c46397225e1c516f0cd0cc37c2a1c62424c010545d3674ee10f86d121557a49de04581b28088c55b985e982b0507e419817ac222e7a58df95cf95d2a467132f711d7a4976cb4cc7579e7275e4c776004c9bdefd00e51744eac783a8303f787f67b6749964e639f429885b4a7fa273143f8d1e449f08657a3fc1584be9e2ad064fbb0324c778c776796a2d77e9b65512b9afb40d92e48787f5fedcb9889540fe508331d17a2e1bf7a240f34aded203d7e3a83471af42c060a4578443615906bb99822cfc8c5f8e963f53584a58346cf0d5157c83e6bd13b210058bce70ce52e010000000000000000000000000006926c5ec0592dbd7a63262be7f2bb1d0357c8b1891f5f7de64d75311c9baf269b4bc9e43421c626dd9cc44b5ae4db8df6ae8d4dc389f510b85c7ca52ec15620fa7664d067aea9984aacbd4368e66cda6b711b87370152d6514888712d9dd50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023c6443d38200af4c3e59cc125a234a1c895caafe025c245297949ed97c782a363cb0a5ad57700f69597f2acf8a995db2aa992d90db25eee0a1585bc293a1b49880a3d0c3d9bc9ad6bf8a8295c85787211cdbbf9eb2a1b60941a817b27e6581968248bc3487633bb27dd08f50626e69547201e52a5bc00952b87f6e48f7c77cc0315793c479ddb6f97acd6aa21b28a6ef957bbd27f08f4cabcb54e79d7a029b31102292908a4abb82bad0e76ae602eda918c3d93ac38fcc80eb36ebf325077af642b0a02c25998e08a6168f2f6464fcc6cab3d44fd48fe151292e57cad25aede56d19d117109a80187c55167b402115ed3d2fb1ac5b58a0754fdf70eb6179ce856e276022e59dfe1851bd2a9ec2c16cb7d78214ed2bf250f80eb360c90f822098ec80ce40319e3ab63ac17d70acb5177d790d85cad2c67ac19ac4a0e2c47074841bbc9278d0212e9ba10e10c1b6ca92cf16a8aa23122fb35d22f1b0f0c08f80070fa29019269022a3ca4aa455b70ca6d474ee780b5ffd7f85a55a13efd0e56014f1c8118423f30021878408613229ccf17f477b455ba51c17dc1a854acd7de27b04660cff932a8354b43b9240ec76cb8213c2b940ea3936fe64e1e8c6a294b1fe9a4acfff482090f916b318d045bb277eae8fd46652ec670f1bfe1898220da39255f479c5ce9c9c39bcea6b72e2cc2f140f0702b7152a4e0c04c2614b4b4777ed01c7dd06b30a1a91cd0947ab2a0ffb623e7e8ba7bab62bcb45dbb36e546db092840b8e526ff859ac4737aa64fe4eb140cab90080956a64db79df974c9c24efbe4d2c69a98025b5f024c58bf65f8437dbc9d3a60158782c5f8c68f946ee6e5b61ca165721ba77e332339c9d6d6cf97ba9806defff9c4c84fc794483dd11f3c38caff80a61636d769a6005c4b8e098df242e785785ea4c880629c7d2dbd83a14ed8cb5319c7fce77a6cf363aa6db6e60cdffadb0d48f04238d6d179a77da8082f13ac81253c431de02b22948e26281fe82165810549da80ceddeb2060cf34df807eb0bf882063ec983729fddddfe71bf8d9a84587b225a45fc90e94df1a69a133efaf575900ecad48902ab133a649ab5f2d04a2ceb6d45ce580bf27637cf937a5e306b6e5ae8d43688ba9f337c0654ceb1c5d625b95938d7c180b3249be5f459ad64a357e087124adb3e07ed30c7073037b52ee2f12700d67c8661f1d7ffa1ff71d63c947c44767d55d52d4067b1554f2f53c00948f2a763495952214c9e6b21d4f382e93d7d66f54653d3e4337ba25c637030320dea440d1a068a5837590778e5be9ed251e90e57c2b4ae8e3ec5e57eb43d4c9e9c2b0035b94a6a91f745f00f81f890fcf754d4304b92a35a28b04aad764e37e233ce8a97183259fce782e53cc0930024a2a46a93cb2181192f06a2a608b9c2dcbbe196e31f95df524a2cd1c8efdb1d7566c1bd0992fa5b9ec3b77aa75a8b6c82beb4653e40327cc4e1a6c583c5c824a6bdd9fe5c32182e022892845c0066f8f618656584c08d0b9837e578b5f88ba6d0f44e3eaf13d36d849a834f0512ac053369b82ef037cf49893de50386c7dbee49ead09a591df053d6cb5ea0ae4712de6d4de1edd65c4472f8595330e8b2d99a78b6322cf687fa3169eb763e710711eafab4aa49d6f5a918eabf7f3470100e6e7c2115c2dfa6580fff0282e080ec426da06eba852e1cb0cb1ec17374963f87fb103bd54cb8081d386d5107278408476ff210bfd02ecc1f31c09910eec52574707c93a71e6619d76226da550c9a19786152170739a9d863b2f16b0e5da81db9c939d9b0a66d99b67ab924f9a742fa81eef7122c1db9ff66384ab1981a1c04cce9c56c1ac9f16f4f6fa4c54c4c9729d134f1886cdcc5cb6244ddc168a5d694a1bbb5237b11f121a7fc50eaa5d968a2cf37c847d93ce3d49468266c1ee0cdeb9e14c232f3846d9f00b1fab4ea0113cbbb00784fb22554b9e5fa13287c40bc59b6f77ac9a5c6114789ce741d00172b2a10864c9460e8cd1a0a5659744dfea9ad08cedf7290f3f33da6eddf4c8ba0be00ba1cecfad7162ed3605ef4b851176fd06296d01e0940220a992bdee582bdcf500d09f407d9e3217481acb844dc2c95d908078e060c8ea5c78e1d86234e21bc7d83b5f3ebb00a17238ec3811120e55bc1c56d4dd42b979190966a52a344e77a20a352bb2f340dd3cde6cec72398c4cc29a53aaa6bf70c820248639accb23425e66295a24d25c7308f3c7acc5dbeccbd8603d41fe8ae962081192dc320767dd15493e305dc8a5bd93a0734e9541e1d04727256ea19cd8efa755c3089840e1c4a217a957337a106c35120c20d49fa8aca9e20b6bb266e765a747b236fc5e3fd12cdba1d72957d35daa52eecf14a02eed3aee385ca0e56017b07bbf81ecff77be308bf4bd586ccf965a2207", "6363", 0, -568939357, "00ee8af8a1f7d8db7ab80096c89ddd45a18fa5a8bbd16cce0e07133aa82cac9a"], - ["005fb27b03b10de5bb16d37d0d3cbe84e5e7847e11ccd97eb7b801554b7d01191a7557af1e000000000500ac53acac94626ea3a761d9bfd78dd9cb8339fd4fadc55ddf991d8919069ba94a5be9167f81833fb20100000000ffffffffe5b2d1994bd7c6629205c484199b37bc4cdcc447652de158cfe48461973d223101000000066552ac656552ffffffff040ad5ac0500000000045100655379206701000000000252630f8710050000000001ac3b1e2a00000000000252527e9b52ff020000000000000000c0a5b60500000000380566cec4a2a8251aae7997870f23874dd0dc2d58f4d7bafc575bb0362ad6a1e61b82a81e41b75f77ad3afed2f056174cc85602a34969011d73fe636d2950cfcb9fdc070789ac606c81406318bfde387595dfae4002b30e78ebeaec2228cb31000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c6be29dc2325339948b7f9fc1718f48f094fcb4bf785c8a16506880dd373f6ad110c03cdc85a841b7ebf2f563bf56dcfc50aaf1ca163ad9e0af290a9eda234528dca9f442d396b4696ca54b249cb123feff8e83467248b193c9459fe9533eae1d6192560a14618de59e52257447e680df5685e3bc34d307f3dd02606951a24c03142d933420f5841e47b0fce832083aa393e7340b95654dff4caed99794063aa7030df5b4411930bdc373c615ab72512f80584b0bea55d6fcab48a72b382021166c0b02fa4c44077800616606ec7dd3c6e6cb7616463ca9de5885c77fa70aa39fa4cad42b23fa5f1918c8c2a256ec0a7bebf209ffe9df86d7c7b4f0d2ece143fe0bac0223680ff58657a1ce06de2059a7cb8cce076e5b52f3d4d36003c7fe0f0ec49974022656c4111b65ccd9601c2c389f3fc4370e512f0758b1b2f9bd897f56afd1e2a603248aae21ab8bea481ce8662d5f61c43b6a6f47dc83534a28ab7d440420b1c449032a7fde333c223a3f890e3bb8f5b3091b7e35fd593f8a8ed58aa97f2407167902020621e2bbad430ed51f5901b9c44975f03bcfd49b9ec82f095711de8906fb1c2d4ab86e7c6e36b3ccf7168a06a14ebffd26a6ca86fe1f85f62f62d42d6885f98bb01abe31c79a7b1ca8ac279e219b5b4fcba15c2f7b5bf2c7f9f8b1c0e51eedd04dbbd08d90958f088862fe2bb1db956ef6f541f72b218c748a38ec17b0afdf78235fbc85ce04e576954cb4bfa6595ead247258f3b70956c1aea5b1874b399aadc55df8789dfaafce7da9a84b262ac3be88d63d2b4f32860b5d031f6fd43116b35db61b531153627b43eee76475b34bfff2fcb7614f98ad00e5ab5a14115cdb369c1ee0a15fcc75ccc0563ee49e882e70867a630ed550fb97d6e66afbde0472adcf81299cedc90f48dcc5f0fd1fa3811fdf88560081f00d69f75d8ca5a576919624e044f3be95cb3ceec23c1bcf59db2e6a21869fb2f105bec9fb6290b7a3dcdb45b9c00d900e5c62a9b05ad362847f2154dc0d08b4244a571dc41bca04681baeb23f41c75d0c87b3619ce671b5fdef2bf9c79a2ba80bd692620e1c02d9835e625b00c97b6a88b4ff35fdf23172c92369253f968ccc9dd87cabfff118f2914850492d6fd11f22faf9044c1212d14d7d476ed722ad62161a2fc885c24a8a383738417b9b23d6ebc553a0013f125df7706a37a20141208de3977af508346d4496f4d8da5801b8fab60bd9bf0586739f519584b8d14c154434074ef05bf6bc84370789742a8ff8502bb728477ee421b3e265ac65b812a0d2d3ef610fb7d7448fc55015e3e6370733cac9cb7ec7c8086264f2807fb312e803be888c30145ddee70819e17aaddf75b287e91e77ce6d7b60219e8c367aaae7a50d1228483493361b3bf3c9aa1151a2526675cede57cc14a3c1c84cf239a69d546549e0186e71a0403ebac9df273043e7e4ac8252b862b739cff0cece26cdaef8dbece973bf6114051685b14766d5d47b712052d8df7fb3834952707ca0e650e34a302804311031f1a30586c19340f466cd434057c64f388c68ff25655600729525389ad51f097450a9b16739fbf4f8f95d9fd5d46c51137aa590cecf425cc2d1c1cc1657147f57b36a1a2abea0ca82e705c2ff82648dcb4cdc63ba9504c79677846082d3c2591bc3a172cf8bee0046f8517f14787f9b75f2288e9a09e4e85f622c02a893c688752814424086d955f3072d78a4bf04319c4f0a38d4d960bba9e14cd385238e86d78f99ab4d2dd5bb827d418af01b91730d9d01f6c39fdd17eba743af9bf404e3fd63f3293523055412fc5d00e924c7e4bb515344bbb3c6f7a6e3cb81d05dee03ff35f543e3091544548f46a7ec1ac4e64accd08c52108c619542da7eaf35ccdeb7bb7fe16d47525e45c7bb6357c7a11bffae696cb58423f3652ce3d5f1e23d2ac92a6a7a90eb1f22c9f5557f64c22ae1cd5d08222d7cadf017a3f5f1946e480bcd3119ba5662478ff4a7bf77988d000fe6217cf5296bb1a21492ca10d0e7d82f7421a02d8c00f718a8b23cffad9d02f11e55e89277b8d6a7b69b3964f0b8218c98f2ce212fb878d4a0ba4391a3a088d8ba948101a3c0b39d50e73f7d22bdc1583615c05a8b073ba90e8724114f184d216183ff26b022652c3e08724e10dccf966d0bf888ec811280169b2dbbcc7c1ef90201ffe7db47a7089f5e29d69f7bdcfa9b0d0605d5300a89a213a5ab30cdbebd8002d66404c8fd4bf65dfb481c6ee1966c717f1c8c13182017691bce0a69808f2e00c0ed377d000000000000000047255f02000000008726b345097dbb9886e4a7e60113564d878408ab096a3a8ab7bf969c0065b7520d76bf0419ae8b5328b0541ac4791122db15a6db984cdcb49c2a22dc81d3ff7be1b8206a4d6edea5af14abf980c2d122f47b98e5c263729e7f96d6b83d2ea65a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008740b96c6a26c7083e8f63b25346ba024c45ffe520ebb5054a280a2667fa1fc23f4830e382089caf838b5f4f5fb35f75ef4320ea7f5a01adb86ba41d3fde170f300d893246a106f0c9d11e8dd3c8a805bf10d2ac2a1b00a89d5016d08aae5959a47eef3853a8f0c7bd85adb857419f188599a850599d07b997de1f1a35b4f2090210b0b226d1ee8f1169d43e5ce8e607d3bddf62fdfbedc32a32319addffcc30af031950e9b9de1d78d3141a086dc929d76c49bee32ab6e2253c4a1701be0399d72c0a039de004f4a6edfc8c97ec02cf2d614c089eae6abe02f9397ba96d82bccc616ea081779a75bc94df526f63990603e4b03a1210177ba09d7891bb623031cbb6b30218ebc2c02d9d23d034c7db35839d95b2675a7464cf3db732ffd3c111341d12ef032eb02752395d002ed69e51d8782d9701d58969a423f238ccd3446d7a00494212020753c575845af217f3b8d4875d07cd6eb0d89d661015ff59a7915ceef4b1da85032fa4f30ad1edf30f9a3c3d9cbd67e6fa5f6e76f23c7222625bbd28b469792af503155d8a1faef869438737ed630396cee96f787403cce1f0f9bea3234b062c7eb12ab32bf5a2e02cc9f8c362701947ae4237a8f3a8a7be6aaf21d913ebad9364e2e1015f7aca809f338a10ec10af2309bf1d033432a5467d4adf0d38aaed3846cd3ae0452d21faa3432e796844b1dc044c5213cf4fbdc7b2b906dfb927049de84a667cb5372aab06daa97fa1f29786aa9dea67cf61ff4e3fbe46ba6929fecc9b9ae68f9e0a495912618cb9aafff880762dbb55efc9b433dab9611994c30eb569ad742658b9161a67463e8454963950602a66b87907788a50e5024ea2770458dee76357cdc2b1353990cfb231fce7866ff837425900720333a403621bf5de541b880a77f2d107dc7d275155f44925d989fb2e094775ef2937edcca69f2491795ab5d1115a0371b8ba3497bda6cce804591f9abbc30c90ffd035c88c14ed94eace909c1c2d91a6f064d5d56755452f594dfedc8b6eef52d58ad466c54b98a272545462246a440efb1764fcec7cea382b8ccb81472c50db7c07d88a65538f543825bb4d7be3e9b730a1a7a85140b16aa8ac6fd758bf965c9724c7e9a9b07d42363b74f966fc660db4e253fa10a2c6eb8e4a4812553f3c5a4eda18469660ebcf67a0db136101c1c005690dde76d28928c34f3d2ac3e53ad7fe4297bae9da1c59370b03a7a22ec307fa317b2a57b3ac3ce6475f5524be73d62988b2418e80fa7172b6ae3e305e82a71b412bfd311527ddf92a0f194ec5e906a0ea1357f76490b0f0998ff1fc7d89995a228c0ffc5d285e7ff948ac536da8f04d121fcd106188f3a429750b46494a4751a0d3f7edeefe009e3aac379f81f16aa1846e9a6fdf7d45f30d573d308f9448f3850ef56cb2d114ae975e11b1dc10da2fb4c3e70fce2300317413e9d200b8327b613e8663c3d64bcb0ade4e6cd04e4de4a2f8f2e9d431d563411128956f82a925ef3ccbcf5876116266c60fd716180d25aea66290d6ef88198203995d0f77e50e898fa78aed5dde9986e2f3921954e072bd911010aee08f85d75f079af86fa92967f82bd081b6fb05b67fe01ba617a79d80000ea6eab8a36ca7b93a389a32bda83dc8b782c2ab91a0321ce9d90ad3175569ac9d51b700a66acc99f4aa38d1d8cdc6e04f4e2eb0b8a0c1e216ad99f2c88c52e066f485a4c84269b7caa5d6adeb993712a8824b4def57f9db6fabf450e48c7c99c3811dcd4677295cc94e1d2c355ea99a717f52ee25acddee173ba095fba09db1665110dd1f6391781548394b1915aca5cbb6b3fb16c6f493dbc339de968a0529019c7be4a380b53c5da4b307001995858207ede06502961590146fc52d70d82764e6c8a8ce9efa4f778522d7ebc2c1acbc382d43d1bac39731a3c43e8b6c2cd03b89e263a5e493b860ba3eee088fe5b8e92c9a0ee4451751b9a10a707a1c3fa826bc060d1d725c9aa3440607615fd6fb669573443bd2086341447ce4df0ca2ffa4f2eecf90edf679c6b021fdb6436d8c2ca7fb9c4fa474571b7341e50c4387e980086fdf67a6a8df2cfa819fdf8dbe4862bbaf17b16b81729b39915689f1eb05d21d84c4dd2ac9ac239f51cb76adbf05730035384f165f5dfc559bc90a1f11df93099ceb5bbe5c2f290a776ba23e2c6b160e4dec3daabc11e32d5fc3e19ab3da080082d217aed980d6e3e4326706078dd0de9e8e379a95f95877c02b2a23256f76cf3ea713c970e3b49d81bef491a4e03dff16ca3d7b970a525e7fa4b69160c8ea4bb50c505cbd7bfdac3b2a673f11e7bcbbf00e12372528c4c14c68db7fecc22204a0a298731377def74fc603e73318e84c9e072cd2dbaa0f1ee5e6b4f765e51ad0998d2a1fc7456e3f59f95a58a111dbce327de1aef6dcfb06", "51005151", 2, 15336553, "4d03338e8a88941c762617cb23ff42842d629435f6c078bddd828221c41b0c69"], - ["e2fb7816037faca9171bf1fe9107fbcbdb8e2db6cd54f9e39c35ac3cb38a21c0f4faaba08e010000000352ac52820875f4e7f50aa2ff4ecd9ef33fc8c229c97c4257603c62d998c420a530170b6154857d0200000000ffffffff49b63bbe9bed7ccb2cb17b15469421a843070a96bf74f72f0418d72c7d979b800300000005ac5153ac53d6579944049936e0020000000007acac5251ac6a5171a882020000000005516a63535164f78a0300000000035265519fbc3e020000000006526353536a00e1dd6b1e030000000000000000a6d38604000000007b497adf6fcc109f03105d1a8e3b074a2890824f727dcbc877670178bcd5709ab80a0ce66faff5413745ac0c7fafef8a6a4513c2a516c804dd758e5c27982f8b9be8737a6860493d91b5982db8f1fcf8c3abc86bb050f6c040fcf9ae913da35d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000409557fba74ece85ad6167bb4fb9615a9ccb2e88d870c61cafd8931778277b27891981e8d14b71436a455ee38e1fece27cf14985e48ebf4929e802655090b77a86030fbc483a1b73fb8ac74ce730dbb6beb4dfe0b88b185b76e55229ff1377e318f29dc90ebdf0b66f8c6876868da8667401439acabb6d19c3b3b9d8c92bcbb902076d3c42d9b7b83894ea3e85bc9801c2e802a56ba2d3c9e6fab961f7cce8bc7802247149d3c947ef01da81f25d2edde98bcd3f54e57d02e166191c1b02bb6b56f40a07d2dbfef427b25535bdff6aabac25b2d53b13dc7444cd89111905f9fa106089b98a985c29cdc0dd3ff4cee03dac33b895b7f26c610e57eebc485bdb7032a7b902079c1b9fd63a4b996fcbb8bd52f6520eaff07d48a7b48e32b3d1da350321288e0218f7221cc090ccd61ca0c1da2d5f69c4784811cef82dbe9a149ae5def7228c19021b47c7e95aeeeefde6a79e4069784fe53291ba1fc8912dbe015ec01916b81267031a76d7a2fec7b5c6a0378dfc41eb11138aa4f9dae83d17c7c54cbeb30a734c70020bdad415eb8dc5e9b43cddb2a8548652081db1cacc22d5e4622be0df09c16eaf7f2317d2bd5ee6fef506dcb46276f170443be8c895eb21bc9165916c9da273b3c72cf434071418d4032ffbb36092216ffa40e8c954d61127290c8b2af5c8f7e1f603ad72084dd52fd5af8eccc330076939493d8d6223e13e285f335bbf14afa800f32fc5f05bb4365b7d6e5bda5fd086863dbfd1b3f95626430257ee8ef6ef700089ba437e56e10ccdda0349133d3502e0664984920bc9d9fe94627f2724483357b1af24bc1606cd02e1145a75b05428fe4899d4447eb5a2324748f26f1e97300c6ff8b5c87ef55f0d200af7300454f17803fabf17e91f23ce1cc5eecd5012ce698611dab5e816c565e075e30274ea4ae6b3eed56b9dfc08c8fffbfc62a6d24ece08882748981e5f4fb2b1dddb1b77b3bff02e6a0dc6a42b52d66d379453a89374aea43fe0141fe042dbac3c2f9bb27f8b5614105d5c97e019e0b8dad4a849ac88075400d0f53f8dcf64b877d20b8b3760780bb5519591f9664629006b77a738af156e06b8dfcebcc984bcd6f5f5a1d5492e6686012a033af5178a5ff68698a25668a1f4c35d5d4c31b4208cb3304dde824cdaecaa896df7368d4916e9dc8e1317e68ba34354b34652cda364f13e949a23de8f35200ab0a283182d8070683fdc7af70a26d8694595841a84d08744c7b676b616e45b88865c4c8f6854253c753a445494c1fffae278feeb8609af3d0050ae18d7de00094798d33904c232ee960e441301ec48caca2aee3e63ea8c83295366964944f22aa7751d6cb36178254618d503d43a74445a6fd89264903c50661101a444704a12d2ace5083af60ed8b48ad4c64a72a3e3767bb188d6d17b8fff64eb6964631bb1d3ca451425e1208fd2090ac01de708aa7e207c73705c6ba56a8e075521267bc8db9557f7ce96ac86442b6f6fdd7ed78be189fb1e33027d58d4a61a7dd438214db8c4bb9692b11c2e2d06e1837f58d2fa70af1b522fbb54d447b7952a5fd00b415ee5eedc476bf5d0f80b8edfcc637d1fc74a300390f10b0ac0d631f65d6b8a0296aebcba9b95f5d416ff91bf9ceb8d2fae9fae9061cc029ac743bbafa55c179fb15b831ff28082b6200d1c63d38ccc7ebcd133873dfbea625535e3f704524be4fdb11067d82c8c93a45701529702b5fe632096ea4102b9461340f206636fa00642fbf8e321d86b24814af33b970dd4b2a8564e4b8fffc4de8787067ae2be592307a8db8c4665265cca9de16aa95100c856a1d1bf65729eec533d439358e982f01077a6944649496c781f147fdc7b3aa675af8882b88141cf040fd3768d97fbe965d6dd63bc92e296a692be91beba9c0d1e805a3ca0b700f3e8e11017a89deb599711d1ef7a83d3a44d46079271c3db8e95130f0764c1725603f46c5ae48b1dfb67c3191b4834778860c6ed7bfc0757c32df27158ca4dd6608a26b644bfebfb435910d249d40aff8357f973ad62d8e9362de21c4b12c38def222ad7c423fe6c2804bb4e7ac0a7d73b7128aaa1f0e451916c279f5de7be79b35c3f93caad4eca4623cbf9a0f8e96175dae1692d8e9e5a2d1dd19d49538ee4fcf41cff98d20393c9721f246d00010098432d45554c302613235dd923a1f6fdc969d81fd1c5a2c64a72b6e253b648ac7bc11ac8e9d2373f636aa4584f6370a8abfeed18de2b285ac69966d601f68ddfe4a6d0c909e1c39ec50e06b3f50996ca8abb2b4ad4000000000000000062d47e0200000000c0852b83d14540bcd32fd08a79e40594194fc57707e07790f2a90d84271ecbbdfbdcaa648293a1e9f31de1acd22cccbef5b4c423982e773482c41cc74b013bfb505c8d5d4441c05989b4871de7dde9b92cb5f91d286f93a450bf9eb2dd3c7ca700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000059b9af62c491de88a15fd5ab9f8818996ef7715aef8cb7def969b0ec073c5e10327d0a8a27cfb881df32ad5fd638668bd43525f55e7d14814c6b01319e113d88311cf53860f613ef7d08dcd4ca1ed1743f9dee6108c41c8b4f84a6996803b5171bfddbc141c16555da1903bec97f8b1a612680e8323e7417be05d0f468f4e650317903cb795e4a619ae694088752278e7d9d2bcfe6f5dbdb22a9892053ab1e22d032052eb0c654f5287058166ac6ca62ab296db8f8bd679b1d1252cf9139bea0f440a0098b10364bd50e2ad8c0c3880b5e3af2a8721432385330d994c7ffbf5c303e639c12b7ec5972fa159a899b85fa9ab2764c5fce46e6919ab7840200e02ed76af0212e3f34cc4e8df69907581c876e918a3d126f3290622ebb45ffc8a91b59fa79803008837d1b7ff950cc732c73f4c6fea7d230f414bab447d0faca3a23289a5c6a4022c63ef372b4b1b9bee86bf6352102522ef43c975ad4f417d9609017580160fef031d1d7a6241dcaaf2ebdd2d8e5c4977684270d656368be126d5e75c45c64087d0021feb4910a90c119b8ae4820643f649255137e0d8a06bd269565f1311acfe1c497c23960077189c066df405a3711938d7799a03c3803fbaf2f08d40248ebaf5e987ffc2ae985c353e7cd12dfc2221e72c740cd2b859d92dfed32fd11df20e30ad6d05cf06a6af9009b55f72ee424df2b68a0c64742fedcc2a1b6cb532eff6bc1435a927dc9340c8ef70a2e46a832e49dbd30bc1935bc15195a1454168b0c7c8f0ae2918f6540e4d6428efab5ebcbfc5d1cf18d2fb9e8cfd5a6a349981ce4e123153e29ccccd1819be437cffba67d6823655bee600ee28478febb25847d207384ff8f2813be4d0e103f70032b7ac7a142c16fe92cc80bf3fd8c0f737221a4f96234521870ef03a323f3bb69f433e66af671b26d929e9184d436893c46bfcfabe8d485daa538eb49e199b4c3befac18bc7e22becf0691a5b055c9863b269a23c97595c0816fb870156f81001ba92d0128264e079903ed4caa64624befedba681040d9f8438ddbaa8cbcd843938f7dee98b5d2a8864d3799fd56ac9c295b3909a0c826777d7b50bdc98688e62658b6c38760e74bed6f751cf151ff8fd907a5a29a3ad82f98de37995821ca5189dc9ba1b97f7e70067219ba7e97dd58fe39e7546f8946491c746f31fb9e08e3bcb6dd6b6f6623867c6496ad3edac493c99d9b46add925b75036f07ed07f82bf148f5376dd7eb84fc1eb5ce98c00958457bff2698374893f85402361ed170f86c578e8cbb85243395591530a63ce992192ed4f2d907cca58f7148a0e18511dd50c5211a5dde87776bccd42b8d903f2b149db5d808c16253459d66cf8d92650fe8e5098d6cbceaa55c407cf547f4a1b15000710f9c6398494567ba8e065fdb31a032c49c907e1b2d63aad2aef6f1270e5b82fad2da4a0938971bf0afdf509b035eece3befd1924d944e305f7e07fc1e7d6403e870f3516466c73152ecb11a43a8f3855787c9215d7c429ff38e9f56eea9b006ac974a85256eccd68839c048063048ee30fcf4f67210a68c9a3f27ad5b161985c297d5027a8b886081bd8b71c53aa6f2a17c80b0aaa59515a2995bb60d80f2df348af28eb019796acaed41482741f14977cd043fc6dd47ad01855e795df50b9f41997db5c85a1f80159ff85c164ae8b512dd42aaa6676315c880eb2a6048cc06e8dd4730a3406950afe6953abe56b10123bd72f3de7b7194263285bd493b197b3cc9f6bdb95cbe109e6406e87ab5222763fa223fa07f1ee576a5bcc3a501f7da6f6670d8665f0fff7065bbebecbf7ac5bc15a736846e7b167a0278175254880412a1f7c76aee1f786344741de34c43bdfe8dfb48f7d8bc9976de32e92635122c68703556617358f2e12cc41e685bb46cba2990e9e82798aea9a8e1f5fd06566805282499e408323dd196dd8e132a0bed8c7c85e32652b9ee5e95569a38479e76117fa7e97f7e61a76a56cb5a1b37c68546be5d35089e08c89cc93ef828d7a331225a0515a321fb4e0c80f612d1a57b1c186f1ebacd9c0c4e98387379feb1491fd811027dc8a6aee6bfecedc7347e307b244a6b7ba4df6c829e635982463032fbd4e465ecfbbbc5635eae29dbd44a4bfff225ba499cf553e28f350f5f38916ce14e665fd2dbf8ba503f9ff4175eb4d7766255e7318f1f711a38210f2fd9e3005e7846ec57207f45f57b7b2ee2ffeaec4cea18e578adff8e2525905c36687ab4c30141ab4aee52e36260a1bdc5a334d97ab60b4f730b0a0000000000000000b6ef5b0100000000dd6c1cf0776805817de92841f33e28e1b6a0cfe363001ddccee4731f7986bad372de531702a7f6029ea3cb74d825aa57d4adc34d7d5738e2971f136a4521f79816ce49970464946df2945550d1553e71f71240b0b128580181cb4c69b4e895e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cfd8f55bf25fcc48aae8c612528305a13f90fa786d7771e651beb01f56a9974ccbbdd79a0a08ce4e795f4924778a3bb3674962e9c5e292d637691bcba8d1efd5f97d26b5ce77174e9688a38956ffd5ccc2898113ead5c17515372260a8e4c581729fe220b161e932e4dd647c208c62aa930099bd361ad60f3ff2971c4859b998032cd24edf2aff2032fb92dcaccb79f0abcf4fc95d2639ebdb03a77c66ec2bb92d02057b6961a38c5240f71488dcef449ffc3c633113d76b426167e3f8349f1e9e110b0300299973e2657d05ae3d46490275939e74165b005add956b3d298b5a25cef69d88fb649671423a451a8166395581e7c78ba66f6e9f06ba2825b27e18de707d02248be30124a66f25af71e501f9efb5ed499b4f7d1babe6c3807cc1016ba13605021310d7999e98d4e39ce477ffaff92d99efaf8a5b50122ecb6f1899d0cb831e94032bfcc240226d382ea940bca45ea0d66bea9cb6b6b346ec4a3fd435fd5174c35e0208f21bc8e1dd55f1615e7f8132a75ffcb4ab4dd469c111e3b883651b4273637003011c95ed9b24f928c48c1e5a850c5513173fdc2afc70c75ccda97a9fd40899872c8a7824901a67684759e6c61ee16e9aa684b5941d1211a8f657c1f616e2f68b02951f3ec06f30d86c254016f253fc3cd64380bd85dd7bba649ab0d4172840ff3c8204535b56e44555a9e6a6a2046025d0a2e736fea56a4b74ef82698fd3dd0a0240e9a10cd7b6f0d04e356cebb11e58d90c8d94940586d6cd77d6e356d682d2e0b2cd0d59b50d41015537133f571ef52eae6b5f40e601ea97206eb1ff7ab6a640e25f5bd68dc721eb911e3eeec18476305905154e709d35558efcd8b609cffd13a3e9c406f571034fce8b0240c639314d0997e77ce94eea4d9748cd42509196d4c70d2b09a43f448605585eabbdc08685cc5314ca97ff05c1415b4f705ddb98cad82b684445c9bd0c632a3dc724a8ede79ad4a06f0ee2c7468e21bb7d448fb0d8a9dbca613d07a482c0bc2fb0b5bd44184b23db8d5696be65954948f7caead31ca455c14a964c6cf589deca31bc885c0ef4fc8624ee324b2468cde54430373af09cb08945d5f3148574985cd6790510505832030095ab0022abf2626cb770ec99d57294f79ad50b10e6489152bcb6e74e8c3ce28f0654ecc3c5e7cf0e38c92fd3ee63abe3f3ec2f2afca527ff1d306e80117e6e6f387a722b56c81b5fd9f5c33a7c91fd9b3c80e8216e2561f082204f1c9834cfaf30c0c7ecaa09508498896e52fa00d5968fa0241fb4e561135f1110cef491cf5dbb50f4d2d423b7f55ac1c1d9877d468fbed03105fb4b8839d6d11a9e7aadac4bd91d78ff67608b743b3ce746047065e4855da0de5aa57ed3deb504b4ce2237775f495bb76730f4dc35f69226543e60f4db8ae4e71e9b202a0ad9982c2939e562539e22f7335e77b0e950b74e9e85a99bc21732924c9df502cc37982c2b1ab1acb6e24aac7162c78a996dc65d771dc863975c3079b8555013ab2ee8ef2f491599b0e8ecde62ecb5a1e380bde1eb45ba2bbe274eb5c56836be6547cb1b761c8e1726f132483db4a984767a34997f02b6f4d3f8b24cd314f35d42ba0f8280195a4ff6dc93e6d8cf04f1a48f8c77932901c9077690f4da0f464a58a9a62088c6be6c9002b3add3d2307cb7532b6c18d1767fa10a187dc2c5c8513ef1288d17a11c437899b937d61fbad4ce3b59545caad894578dccc95f967c7cb38cce096e0083806eba95c57388d944c88d1f328e839f71ac172f82b00927749179cde185b13a9bcb51b1fc1aa4fa1d91436ee0ac6335f57b81ccd3260cd9d95d414626b268e160f804a1aabec066b975f4257c09a8198e0527176c321bb262cbfc6b028ca40cd232a56133e097a3ff6de883d183eecd2fc677f44b8649a513ec67d7fb55ff2be83b4f3829c4b5ab13787d291c5ff28dd6384fc516a53f407931ceb70750b921f145d058a4a5ef4eb191d6862a17fe938117c1a1bbe93a46e0d87e0474481ea870f869777d21d63abf4b35f6e6c77bd9d6bb17a1d4b6dbf21e0a6877823efb775204cdfbdb8bf9fd6916c9051db6844722b97b987d2ab19e0c50996aa675a241fb26a404b344c9155116b89a93821664141905fbf2e04c5e102ad29dd9ee91a21dea423ddc9b2165b22ac1fbee83d638b9dfbf558d872cb66b6276cd4f0b155b665477eb8a90304208a4304f8fc7a6f90008b976c4825e008e99242d11216444c9a38e52007a9555fb2dccad764d7d514e07ba9ed958c4f9398b4d85af29f025482b39eca78034752366eaf94c4185e61e202923f39832a93418080cc3b6bc5179ded213b0d0747d26c88bc0dcc1a3dd68c266165bfd4b9ba5b90c1f8715d6f411dacfa31d9d754dec7b698d0658af82ec18cf4357665f36da9c129eb006", "6500", 1, -2040868206, "47c00cff81f5b3cb68b3f16bdfbce66e3ac964df03357ef1191e603f145d9396"], - ["030000807082c403043fb8aef31aa48ba4f0b0f71b62dbb33a251f61085321fcf782f08c7e8c9c6e09000000000153ffffffffd4703d1ac51ff50d6dc906896c107241e42dd7dbfce196aa0840caeb6c9fe1420000000006ac0063520063ffffffff6db9176f51a0e70232df94eba54c197e6aacc1287ce5c5b020c93ff2dff754d80000000009006a65ac65536363652ba6d77f2386db0663457d51e42ae10fd6d16537c632350ac950987dd5f45a06836e2f69030000000965ac510052526a6363ffffffff02ff58760400000000056352650063ccf66c010000000005ac525352ac00000000bd1d8cb900", "52536500ac6aacac", 2, 714631551, "f74f5b8c04571b07b70b3f84df2e2ff482fa76b5b8ab336c611e38f22d6d3f60"], - ["030000807082c40304f79d8615bbbe14bb913898bf371d6e626f015776f7e7ce681be671242974cae4000000000751ac6a5263006a55678886e1c85aa6da7bfc8c7ac8fa26af6f66b2b18138584824dad6c59c44e326fc1ced01000000070052536a526a53ffffffff09c603f59ef6f9144bde1d6757087c9ce80659b95561907b7128f14464c990ef020000000565ac53ac63eea828f1eb11c23182816b5cbc49a4a9ff1139eef034798c4c7212f508f46717aada11b001000000080065ac53516a51639bcab20f01ea76e60100000000025152cca13bc80000000000", "51ac", 2, -1044115562, "35a4cfcfef2143d78bc92c0bcaea4584c830330f7cf3b00499ed331917501d77"], - ["030000807082c4030154f4633ee271a674c8feba643ef6f7f36ff56f41b939bff8672120f2e509cb0400000000086a5200535263acacffffffff03c43c6600000000000056484b02000000000500ac52536ae48282030000000000000000007643eb6c010000000000000000ed7e730000000000c41bb2dfa15d9b0ae856fe1727f664fb127b08801dc9e6c738c50378c01f2662ffb362e6c709b786dafc73ad84718120350b51593399e6a3adda4b4bd98fb645101a9c6d2e047d4420514697c032e49fe86b43d82120407701010d4b7bd4d69600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ed873cf75bd7ed050a52aec4c7a4420a5899cd0375494de7f7c3ea32429f66bd84ea90ef5e9226b9a8f07d5a4a1baf667104a27a798b13c6170186b31bb806c9dc1b774f32b6f38cb3e77c2425b3bd7ca20822f0da2f3e77845418341b92bfac9a01f1278140a104f5f5d472bbd1381bc77dba0f5df5a0259a602fdb8a030257032ab1166e32b542b12de0da0867501b796ed7996d0ac85ffd5d29af489562010f02214455af1c7108474275f4d4ef4ad608a5017e256ad6602bd06e0789a6686ba20a0133f133b91af83b183ce31c6b51a3888d1423fca209854b8f8d4f72565653d9adf252d26b00c2b6e5db8afc5278ca499e66be03f73502a1b28b6e7dc1964d610307eb807887ce05311f930d8ec6b5722343f7b3c30eddd864154b43db1200a2010304d2f01c6956cfc42669a8d0e73da96c9c36557df7cefd2541fe3c1be3e6d56302172f6daf87bf7aabee62e7a226c778f6642924f2fc26f379b504eda7f7512e50020025e31b91bf815598297676a881caadcc66d016594f9a0041ae1e187692a923031671ed4ae469615f1423022d0790f7b926afcb899965052c1ab1c02a79bdf0d9ca19fde86b4e6b4f6cfd4e430c5bc0f54aedff13b1c1ba3c2f3058e1f1cf60c1f0f913c13522f1c695d187427d6c0da2419232ada413c4d5321ab1595b3cc127a3052de6e954b232c161886411550d1ebfb68271bfe1b6a6e9e9889092f05d6b4342043c62f7dd91f0072dd107f941ec18393b7051a3a1282617634c59c5ac967cf626d2a8abd88f2a7afff712d31673254c9abebd346e708a70226223d8459c220cfbb2de104ea1385256587758707d2984583aada80e521ddaa57fcf33195a44314e92d6c10133d46a4f2bea050f04762474c6e4e9d5db830bfb17c2b088d394e0ffa220b551749026d9ec30a97b45358fce43f935b4364add8439898af61513f70f12ecaa6ec8ccf1db6700e74582bbf1175f039d256f9913d0147aa299ccc614ce356b2de944ce023ccaebe85bfe933c95f831f99b1b150f81f195e50d88d237ce7a5c11da638f7b494b7183018de2f47823dcf60b2a4303109d31ab88920614c3ce34733555debaee16041ce121bbd85831539ab2fdc05fef10214db760ce6a45da8dd922a8e4e032a7a07027cc6bd123fc714b14731b64b4264f0945e3e0dd7805aa61aad39b338bb614a7da3d4eb5a8179aa373ecbd9fdf97808b39236effaa79a916c5d8f19849d6512880ee20b901c973b6517bae90d9414bb3bf2fd7dea71b461092423145ad4213b8d1f6f7af6bc868c758aac6c81f6a600cf6bb2513143bf525e2151fdc741cf725cf1fb76799af18aa271b687cb216f02ec2739b83ea7f6f797c9e7775583dab036c093454b79dea55d9743a88b6ea2c5df892b8d1db58499556da0e616084a610030e5442b7be775bc0635176a8d171ad86fc5662a258114b4e01fddecea11e84a810e766ef9260fc5590ad86b25fa7b8647607e0d24ed6dfbccc57dcd94164f58db6c29bd02bd4388ea27b2d14023c62ca8c8af9e63a5ad9e1c9a8474e759ae23895ebd05f1e41b07daca777ace0d0b056a97a95ae598132743375a382ce4195ec512657e0566bf8721c7da9d008dbc6ccfc32b843f221d09affaa94cf2e3f0190fc6371a27d677157ad19b163dabc563a2ac3e71e2eb9e79835981506c31de68a9b7d054f0324d1f7b6749269fce296a760ff6b8f1a0f053ec8ff586c6a82bb471f9b5d18fa977e8ba42871775a9f606dc8bd46736aece37f09b2e3af3d24b8803430b39b62c21657132352c5a5dcaa6e4886fe15f8b1b337c3a3eafde04fae3891833cf3938fc405fd215b8ab82d4937ce9a4917f4daef6ce2a86464593dd8d58f92b26b17d417feeed411d821148315f5834de7f03bcbc10fc886ab63aa7118d157c29eaf20dd654acf04302289ee995132b749eafe1e95430cb6e2c9433fd3fb34c92aea77c9ca7317a07a0a5ac50beff72c82c1d5b0c56a27f6113ad87f6fef0d7144ab42bdf5c06e3ae9f8eb5dd88cd7a4bb1adc3f54b83f783a70a452e6a94100401baf3af73f296a06bb06da30328dcaa399c4a528b088f974c49dcc438ee4d8459a45599d65d54f6ef1a88419cd147499b62692fa758000f28a54f4c48415891f68cd5ecb95188ed2981da42eb7981e247f8e766d5dedc1b74892bd41f5c04f094306a0e7f92b741c820a8dec796af61707921cf206eae9e157b6fe7d1132740e07173e3afc2489a0bfae39d7274c56560400a59d17b80455fee72770210680d9dcf9ea4dcc6ca2245969d1b929a0eba475cfd5fc24ed2f2a4001066a5e591050258342f8e82423bf7667e62362fa288437cf03bfbcf4b9a9e7b7cfac5f8b29643afc19027e5927438d1b71f88176fddb97d5c9738296e76c3f7e810e90990b", "", 0, 469432155, "ec1d33586644d32d91e1e9c3c9fe73a5b25f57c600eaba2055f3d876aa5df946"], - ["c5e18e3804d3d954f1b6a67946a1632a5df20fdb45f23e0d7f185e8ea3aea9625b9dac4dc40200000007536363636a5200ffffffffa08f63dcac79a9c7fd3defbf7b320232abb94661f6eac78fc83bdea1dd476a930100000008656353535365526affffffff966a8fc504559e6ea95c0e94da65dc0b0861274b8e7d957af820311086dd224901000000076a65516a535252c342976be7efd72527bd581adefdbb6332fa4334c3c0d7940d2e441b4bf9955f0f6539cc01000000066353ac526363ffffffff03d14d97010000000003ac51634ae3250400000000066a0052ac6a650407e30300000000045365006ae465e1ad030000000000000000d744bb0000000000371ae7c76495c5a5c5f3bc76ea83ca9f750fe4c7e9227571897a38818b40f3de276932b736e31fdb622e991293e98870b8e7e12196fc09f6d8d9c85f45796606c4604f30d72f8faa4bf116f33b93eb753c454b7385411f5b5cc7894704b2f4df0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009443afdf5f1eb9e1f18c544bcae4e6cdd1c950058b3543c02b26e780b98b402aaca5cd67ba79d7288d6ef694950c5ff744769768d384920e267762d7de5ee3d3e2d4d0367961fb7a8018afacbbaae4a6f1a52b9fbea3fab0bdbf8c1d6dcc5000ef403186493ed58a530afe1e45ef4f9e7078aa4188d9cc05a3bebbef6a181530201273dba59a229afc933d4a891095a51105ae7d37fa4de244f0920dedadf759a021cdcae71a465bd6f8207366b341e2e809f81b71066035987236b1d16796b6f4c0a08f29470045f232e2356438b726dadbc5d2d71b84827d3764151a645ba3776edfe7ae0c484c2bbded6a4bb5f4aa87d94714f7d17e999810de758f184a295ba8a021d006314412034521dae062a41484e5f3749290c89ffb53f263781fda76387ae0213460d8f238ed57664d13e70450b296916c9e5ef4e00701b4fca230362b9d8d0030bb020e1618a8caed6276c7cd3ac99dbba1ad2429c20e184c2d3fc48f4c0a065022297085ea3ffa962e0d642f99713c345881ebcb9131a09b374779302d3126f6a0203a17c2170e2d8cfd330cb35c598a7c31796fc14380b0df45b0303330088a96f40f196e16b3c55ccb4745991204d181d844ebd44c1643501ad1276f10c7b5061550e870bf7aaa021d0afcaa6c0006b54eb55ecfaae1a9723bf6dc17a90c5e55db144bf8a0e10a57495090e2a9882328650d6b4f3f2046551814a5e60556c13f5bc08c837586c729c80ee5ecd0a3bd8ac60a7f2ef812858966f72cb1da5a40c61b4fe98a9713bf3a6215b158c433631097d831bcc41dac6e1132a0e87b58ec2a0ce8f7c6e66c2b99fb4902edaf90b840bfbace43406850e42ba822b35511581091be2e6380775447980733e2a191fe95f94e1c04b02d905f078eeb51a7a7dc024a8b56d6d00d6fe462c376bc5ba39aedf012f98d9a70c1e49da7d25768aa74bad1a9fd625b82377dabd35233ee962eb2ee6c471eb6b17d50d30ea51b1edf7dc2aebc569dfa65e2051294fc9b78aa7c9f65820437da2c8255ffb86d8b0442c83687fbe5fefa7993086837298dbf986c2a7226d16353c83050b6fbc03f13b94a6d184a59e8b350a4559fb36bc69a3d1c0be6d6abab26adb23ad450a8c81980ae57f32a1ea02284e17d84357bb615f56a2690c449f3de8a282f746c9f41b391514c5784ffb704080bab86236d83593f25261c02bdc92e85c1919b9482a48e926960aa2b78ff6182c59cc7dc481ae75efcf8ddd57c929f8ba29d1e99b6111a8b82cbbd12d6510744ab1089c5d1c40a0c558ae1f6c9eb70ea9165e7ff4ded7df59153f5fe545027b713d1d1494f1e686195d779ed5353061fb8500d4fd8a09109db341905a6de538971a51dc724f54c21ba872aaad352432cf11714b0e0d6627b9e4f58f789bad442af9f7c0e23b9fdb2ce047fd6a03fc7e139e48d54db47e31efc1220d18354e9ce127700b9d45d4ff7dffff61eaed62594eeed9819ac29519e5ff760c108811f88e382266d4ce975e226f2ef0fe684abc96e3bd32281b6a90396c61aaed6e02af89fb49d14e398a1e1fdee520e6c6212f5c418b1605b1d0e8b53506e457993fcb43042f3bee1f8976503f9d2bcbfb3a6ac185f2e39ed360a81099742ea837faf9f4414fc54b530c0be82e9ee3b2cb1a427c084b71139b13b0154a52af24238ec1bf43cc3c7218cda9eba8aaf55251dd8c75359154b28685e79b914cfd2db16bdb35afaa5358b2580a58cfa70c8e6f5e5a294d3a81d686ea3ad47afec675b80d3c27f78e279df2067040ad854229ce7545a4eeb3ca4874468a0fcbc407f5845181dc7c789345027f26a055e2b846fd52c6354574068a0a4c20c5f4d4826f9957bafe6738787becdc1921290b0317c2b98d00e2d9539a78c6b8b8f669548b4420da83275ce56e15a160af79ced56bb649d6f61cd07830bc9c0e408190404dc7b6fef1dbf75ab29d4999e660dcf1858ddd8380245fd914ccc95ec4bd3a751516ffd3001cba201e87711f09198f16dca09d7f9887a83f9b11a809ddf8f20519e7b3a51e176b74e06ca3d40b1b9e70058e5c88869d8b86c52302175046b1eb11da22f7ea3e30fa922f49e7061437b5303a1f92f81e3b47dde03586fbc5867b136e072eb0bb573bce4839cfdb2871b9aed0f819ebf0a9dc2d35e6ad5dd837eecfe1a0842f5acdab68d6078c24913decffb0602f841e12a93f013fffb2a35731fb066188bf2e1c7667ef0a28f480529694e462b05a902f649c5231591b944ea03e1ee2a1a0a7ad9a1d61addf47a45073a8e5d3f602000000000000000000000000f34771c6f287ca428e4cef532ccc54cbc1b6ecd06b7c0360ddb4990c2cc62dcefb65250ccd7d9c8baed9c8de453f444ac1a7d38466e8b5645821f400f949100dfa7509c09ae97689bc8d134f9e8683091c9b9d85df254bc1d2470a0cc358856a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cbceffeed2ea21dd6d51c52b3737da7d6d7e64e657afa091a404cd2f218b68b07bea7d154188509ab86c7661a2f0a8e69a260a476820340d24767b170de12ead47c8f8563f60035994aa37fc1c55885c004d4f528bb20252c7aa8b24fbaaa4e23257ad016b57fef7e999ff7dbcff490b2e42e366fb98178c224fc6bcf243ea0903223bde17213d42317255e7923e896e2d0dfa66a96c13d6f55eb0a99cf6cac788020dae36af4b11d138e42553fff3efc0b0960a46466d269773518e20375e6a57d30a08741bfd84697dac599a3f41a0222e85613f20654bd36904960dab925abff46166b98fe3039c64f6d9cd18757ed3e64b68f7a978242e081e6b1c45c066f16d9b020542f3f5f820145b4029e4465b18ab20c97ff47649f7c904ea1332b01d0afd4c03248e15c32bff3f7aa69455357d9b594139abf621ac2b098778f5e23836589a51020d4cd9564864ab9d57195a2eecbe4e6acfc0f8b2f24de0deab8c3f922237ed750220f8cc9005bfd716a887140687a62bc953cccdd54f55e1e74ade073cfc9985c30322f2be75c8ea07b796afaa7efefd2eed4f94aa06a8d7377738d724f20c3cd7519b4870b6464e19358e955c486348e91ebc239c1bc7d75646cec9369283f813ad04b5a9da2bfe20a2154a2bb1aa67b6a188e1e3ebc8e88e66acc9cb12b116c9beb711c97628bb0d25c02406c12f7ffe27ddc9d8747e2e1c85d6b3267da7005cb55065f5bf31ea2f121537ec444049575af16685c04d3dcc90af9ecdecb41dff45bd000ffd636d891ffaf56dd92925a84fb4c9fb873ea9df87f2c1d2899076d0e946f812d3845d07d65637cd7cb3359027f646183fb798bd6d871c24f740d9c9586f043e8a421292f9a1e169c0109283a167b540c270701591ff5fd11eb81ed0139fe1157c5dadc940ab29e1187ac4df44209239f868563d6e63d17a2684ccd317aa6e875778fcdbeed1af66aa23387bd1866b9ac5534d2ea499e01d07a53906ed13e3146453c555923c2b83bd6d4e8abfeda003a0f6dcdcedd7dd3e180df510caab580d978063b420560abac1d833b93eb0888f8806679c95c819e7c62106dd0825c9f7730f91a01731182b59664286286d5cfa26bb34fc1878a1626fd222c8bc7d0b37dcca2a4f354ba858fb06e053440eae689722ffe3a110375e87a9bc9239d09a180a01b5791ac6f14d2f7c75cf351ca7a1181cc313a62b0431d6c3bb8287f8eb12d4a6ac2763ba76ad3e32dee3d8c2255d11749344601962c3f7b17dab066143f95e07b7923044e3f63a5b6ad4466e30731aabaa3366fde9b4b491ed0b3ebaf2df709d79bf2e37906a202ba80a874042502dfc9d87c9ae8141ed31c13780647faadea4fa8fcc18f5f9e35d03ed7bbd93fb7816cc126aedbd81de44ea1f9dccbf745dc0829ed04c521758cbc50173df50fc175dd6a6ace9095c903dc6b6664dff2941ababaa6c057f37310d6894983f07204748a336f45a9e5a0bfea2fbb935a50d25eee1245d73c455164689025c0650c42fbd1fb50b8ad6026eb522fa9e13efa4a41ea48663e9172e6b09b28cc4c60c535f5e002b913681e322b69c3ae4b71b9528c8173ef8cbf0d451ec2087a769f3ac46b123d9dac97a67031078bb3161ad44011c12a6afb1df510bd28b8358af67f91a75280579d191e54c0af6545856a3883772e1a1ab446e49843b47cb48810532c0e5f859fe8dd982c51c6baca9e59c2fc5fd7c8a0e050a0bbb14acd80f48d354ca74652e4152fee7e1710cb5e228b7821248d6ea20c811c0252da917cc27af57b91c1ff9d9d7773ea37eec07e9db1f3175b7a86eefd8b4da94100b047c09f45295518c2e0544714ed150e6fd80deaf9554a5a0594b09de87bbb6085f7a2e28039f1984d4da009455db40593a37bdde4abab15edd5fd24248ae2159ba5375bf70e191ca5bfd34c4a875cdd2d5e38f6ebd58eb90c06428ae6c8332624ae1da5b48ac21f78b5ccec8b4a8e2c7a18a10d63ca039e5ca49407b080365d30123aed1cbc8b42a31d9cc3085ad634192847cb4a185389209f6d41e54a9642af85fd895f082cd5351bda39b4bba757117f6c666b968772ed23215849186be118aefab519ada3b0cb1da594066c65c661d600345aff7eef07b7f819a682d9156917a68cad0e38d26d14e134c07520b8eb17f51df04f7510066d3ac194766d777ddd87c299e401ac1f66c140197125cdc6987f2720130f5046df0586ff4fbdb0997689a3abfd403798fa4b95f7ada89dcce33739a0735b534dac454eae1e92ee847c2426477e14f05000000000000000000000000b9470f30eace849e3e76e5473d7b4b3fad05bdbf3b873334ba323a4c0b6d6b5cfb991055f144797030e8ca4e05cf55ac95b3a5070c98dbc38e627be2eef0ffb4568fa09a61bea134297f2867c6ecbb95802f209f624e4c1974962f9b9d595e4c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fd7bbadf9c2ae72958b47f59cc3cb7fe4ec323903241349315d2f20cb856dc96ba8d8038185ff1882218bc7d9c673b73c9f604a87a6a92bb64fe8514b69f1e80537a9611af0575ce65cea32045385cda1b53257faaff82aba7a6de8b4f948ad401244a61ab08e3118a0c6ffb61a529b1a6ed92ec6bd342dced669d932733ebe3020d6dc64458d05c0dbe7ffadbbf87c3b6c5eae9db990e58f3b3e89f9ba8c55cd203054b1e9b87d6566600cde4f1483965651eaffc0fae17c05dde76ece6fb9c0f6c0b02cfa3e36f86b5858666437931dd55af57d23ea5b84ebbda2aee8fdab0925741be2456ada0afe68ee9763ce17b8f859b603bb84b386622a20b358e48fdb8e7e9020688bf1cb409a493eb8a6bfa5a1ae17179fea046212672294406aae1dc86ed9f03053723fc0f1d9b9800bc8a4df06ffe1fbbc0df87ce5ae0e6a2a7651ec01a0bc4020eafa5d092a314901af03d26809a5e87909e767bc5a6741fc0e2cc9f3fd8ff33031506538a5883ecaacfb3872ab62648d3591179457ef046866ae7d630c5a32a10020a6774b93f9f3d11ff5fb1952bc5283e42b04f7b4e1832098f2cf1e9c86b9662bd606381991041b04f7a373282610a91aa459947d3a1f30c835b62fd81238dcf1cbeec0a9e030b7ba47d6797062e288917e7e2e766e5c532a2645850ddb9a2f3135d808b90bde84645b6c5e4bb6bc6acf0278e91606a498febdbf8a76f077e51d4b1ac6325454d5796785e73b7528b81072a92889e3dbb08c2c476e167ca2436c7d862acf030a771d32d59ea100a447d2771539c3f06d34ee09befa4bb26856e1f98edfc30a12bcf4f05dbfd28bb996a3c70daa635cb1bad3607fcc82bdb4d3546f5bc4fc2fd044a49b5f819a7184e89c17ec767fe025d3bca8d0c08da2ad7cb7464e8872190a08a6bd9cc1231f01657571d6ceae8b93f06a9929c6136626ea689648fea7b7092a67193e395d0ede420f5e8e1ab4cda3f57b312517d37d005d3b192ad7bd18d7f305c5fa2f06d4b81f26180a60b8616dd7ae31516cd85b9a92c23f9c6602f839a64e2a36c0e6faff7ada3492cbdc71ac88ad0e308fb05fcfccb04fb87b3f9a9be84b29af073e96cab8358f8ba5722e982375e481bed0150853b46201f13743184b182b382a7ef626d31a941c747774ea4a1bb8f42a4327fbdc1402856e45420eac08ff2a754576fa8f023487fcf6fca4e97b42f8403b8ec2f65c145ea6bced373fef52b127d4a04d14037d7f78b5efafc139b118f9ca5eba53024105ac299dc813a6ee16ddd4c3b2783e5a1df3d865c089f6c0e503317062026951f2a2a3b9bcd38228f6be84ab7e16d14986e8dd2f208959fdd0ec806c3dd7fab64e7461a455d3724575181f67f4a40f28d7dfd588277fd4bd74bbff8bf189723a52fdd86173d062497d7a21db81d3fce6f9ad4b055fdb525fbaa8e79921785615e4f3955471f7dd4bc376f75ef97a55ec0bed07b06000e11802bdad04f6c64ad9404e1e19a6f2689779fe8d73d2f5578201aa6b1cc786a094e83d3ece180707447700eff2f5770aaf2496b71ca4456ed62637411b2dbd74d21a2699ae7669a5686dd42d4f0021a9d90cbcabb32406f7c97264d9e07686189df66240b5b351fac327f82b98ccd5ccfdd625e8a8ec0db1a58c7d78fd94975bcaefe1cc000b0fbfa76733780b1212bda0d6af66be8c1712559e2f677cec8f8e85cdb3b55491ab8979cc082f59ef86df4b40b36c17e728158d249bb4706c169acd3a33af6e31c8657c06f61f2a4b54fa61d1560b015e793e65f544cb9b031a4f2ed41513eaf6f86940a34f6a7a414d8250f29a3a51c73916d350bab276d24ff8d6928c27cc0e5d1dd276917067446c5cdf005d201fdd534511f60e224e4a42208c8570ccd2b0fea3aafd2fc0f134a58d4327c42db5e6e623b5e944c1f6634785fdc2cc056c143f0cfc4df98400324487b62cdd3dee0e40f94d1ccdb1d2a285c8701a4ef7de8e582b101c65070696422a64732d13cd1dd10b37c840cd1dc503ce92b3b7a63821acb3b387762d9da02c25b88d2e21eb69adf8d73f499a05d103cd2a647e4100d7fcb793e5f5ebe1bc43dc47dbb0dd5c06300c79b6f5b91a3a349f1d536dcb9351a9a3af18f5a9d69e96b2b2f863c423e3fa30eee6bcc673933e0c5f08f5bee22cad7a1ab1f0ade0ff9d28d12ce30b734decb3ea8d38a6582150640cc1541ad99f137078892f46a899d8096efb83325951b2329c0f18ea48084a0d7c9930a59d9a4f9f36d4dcd588e35ec80ef47df7078646be6d307c48a9a8357ae7cd5fb357851b3605278b8a006dd637ca9ab98bd971dc008c9f40a7ed94ce8914c423c4fd9b84579c86290d41c2ff27a6d730692fd7e9ecda97ce75621f30e5995e7d51a6b85edf5483eda994de8d999235a48d4752dd35804", "630063530052ac63", 1, 83222442, "102a1014754c4018fdc97f61f0943003b6851305746b0038c5f2ed27335cc64c"], - ["030000807082c40301dbdd0ae62090ba884efc3004c47f21ba2b21fb7029ee72b2ebadded5e28ae8a901000000003a546066033068cd030000000003ac63acec603703000000000800005151516352658bd446050000000005656aac5200494907648019e509017a947d00000000000000000000000000a0896cdad7461021155e3a2a369e8dfb812863a35874289066b5fb139cb6920fb2c9c5264a0d374879eeb00f92c903ca9069188eed039341e817563a2560d607db7a68ce06202f917e2522f7ed0565f58370671563c2325320922a3b6d616f82000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f98e30fcb42639f3cd6b13eb1e7b4a743d1f213f930c56d9e47b8482cfbbab92477bf62318af34386288467b0450bb56a8fcf2def3d7654da00a1a0351da2fbb155d51873a24978a2b4f760809484ef7dfa6582cc2d2b7f494358d2c369d3fbc278b6f1338aa74246e620e770d191174b002b86b21dd9b5beaf694f3dd3efdc03228f7ba36eaa57bb258193561145645b1117d85ab52ca89204074dc3e1cfdc72020d53a12f99d0f730f56024b0e5da200cd795f23fc4ad4aaba2ffae34167ef6200b045e6d2c692bdf188974507824a98050917c1e51e64f499d39a3c7576cdd86ce813d2e1dfe24e8c07a248b15fc68d1b1beb2e2668f176bf87cb97308243815240325e633ffd8f5a375b636466216b735153f349de83cb8996e4cee32e4526cd40a03059b0264d194d46c4746a20a06d350dd2e0aecc94dd62fe67ae2e73f425db6830216f0348eef50408873a60fd69b9b311a5eb45a9c5827fe73c49b753466e7506c032dbee8e2c11a6615d9eb08e40a756bab74868dc9f9a55cca51f135758159dc5603137fda6541f803d9abc738c74685bdc89006addf4555b55b17706dde9bde107b53469f55e288db4a465b4edbe02d4f617346d67ed04a2644addbd1da08093519dc73bcfee2ab59c828f4a24d22e2faab3fec38966d36b98bea5b02bcec0ac562b3c1c9e498dc84017c5de4e5176e4784f6c9b14fe6603c466acbdc407f394a1813364f225bd61d1093076186e55494715a8eae0cd2e0be1486587ba64447c206e14d8d18f0c52e93dbfd5a0c1fbbf17a951025ee9cc19639e78f7a6492fc1a11c22dc2783d80addcc7da707ccbf748fc63960354b46c73bdd85b372e730e4ba954a1a82c6eeaa42ca6c136c52d401f2043d642ec9551561bd2f19446156c5dccff95db29ad6f1f966f84bd140d16f0430aaf5435cee1629093904067f14d523421c3551555c4c425860de63d83361662300c02909e8acc2869ac391d45c8a33a1deeaba17d2b07cc90c058077be6d24ba342e77e57bc09ccbcdd3df73729737fac0dac0f54a970e6b0684fe3642a717a461e0975687fc7f243f61816a5eb1b05327e3f9223dfdae311f95601b265c80b5e4e4f3630c8ac3d3ecfc62947ad3d81b2b4e84537452e7343dc9655c90d9e9b87d9389d1a2a74147119295b2163df78b97c234b7befd33000016d3331687d5192be3955153387448dbdd775805792406d0d033b0626cda43d665fafd5b1a3233d4ed7e9cd15154a67d411b8cb8e5ed4fdbfe7a2510e557c0f7a2a7a37d65f1ff67e8e0b870ee7b3a8b8d4e1360fb2c6097d7aa59037ab42fde2ff0a16bfe0935a63f914f9e717c5ec93dfa2db0fd6a46cea25d021ee2f42038cb6a3ee6099682ccae23334fc25725b85ffe1ff1211d2159a4a396c2a28e34542eebe27fe2d7787d27b98c4ec265d33af0bd5f8cf9fef4cc36399ce67096256421e236f581bbddfbe2cf3af6009dff50d141f2a496925d1955a136ba377aca173d92f1ad60c7a90e6a31a8f8b6ce9432393fb4fd86527fb5d31250097894993be4826ec65272a86ad7c291bea0f0bb0d5d9b2e62e79b14848bc3d9082f7cf06de9e2709a7d21c4f28ee3358f7902f95e0559cf73e64c5ef927257cb353a5f507b2eeb0efe6e18a4da466f8f480da1909bb52bc1dc3d26ce4cfe31407fd1c902f24c5a606a092f3657561be19acfdfa178405c1d60ab39bc2851a0ee4cc67d2f5a597c4f68eb77ad0a55be80f464693e5c5092a34ae6e1747eb191df1fa077cf84ef7dbc9e96a0b36ad823b5639325d073b9016a38b393c6e9aecf7e6de7630b3c627fe5be75c309c68b4512822bb0379b375c27912a7339a058859d4678854d98c5a6e3a99c7ea830a19e3337e14b4f246a5708dfec3c0fbe15875cdc4d25bd6f6a5d2958ae1d02dbfbd0b0c4c41d31cd091ff3a7d9bdfea868633eff31413a791e6d10030222e9d133a451787b6d5d4fab03cc49606adfe4c7841c946984005f6248cf912c3ff0b8600318b232896088f35a185fe32bf6aa6a5ad8d62e5eb84001fd84853296b712ca6e0fce94969f5d18de85b9b0b450a977c9896f41c85862abcaef14c919bc2ce70ba6081d6557e7eef304a6ee20d1158a94199a6ae84a84369c2ddee54c184d31c5f17bea75448e6479293d8f65b5622611919e73ead67ee69bb6e2a2d4be6fc71d2fda2606495692ed8cbd522352da871af5d581d64601d5ca65e6183dca94f4a21dba9906c0f66cc01f856d944097aae27460d7c1f251bbf0a5739da61684fe2595b3079fde154ca96a1dce9cad2dbb2d11571c3ec792dba03159d5ac48c804d15dbbf7dd194c36d26b85bc7e3f7de5ad234e7e95844e3be75d4bc91a7d315a223f679cada324e21e2d5a9ab752b6af427e56cfdaaa6e41ede8847fac6203", "", 0, 1500693994, "afebb5557381ca8619b4caf2ece0808347b186139ae9beae94fa4e1ec8733055"], - ["030000807082c403041e8bec36c2d72a9514f0cad1ad0862150f2c203d492cda483dda63c4fd3ea1a90300000001523131c0500c7f965ffd54d0e466d4f30030f357b7289478cd14f71765e138366f27f7e89f03000000036a53acffffffff43299b4123bf12003bb7b3d52435efb69a6e335c72dea6964532fb1e82696a230300000007515163656500acffffffff24ea31974988f12f9a2b3f116582aa56b0a2c01a053eb5b443b5db29821adb4400000000076300650051006aba44835004d0ec590500000000096a63635252516a0063caac49010000000003635165480687010000000007ac51ac535353002d51870400000000016300000000b05b1b940200000000000000001a308200000000005a62d4de496d0a71d2e0ca147cc438e029b167564026ee58d92bf510720483058d2ccb0acd61f90a689158af80ef426bb6ded3774d081f9b9e27e788d7f0359f3d5a863fee5dea234c46314f45bc65638c8e8ee6be55e816c5ca250d507a690c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f3b404bd4011da479b3667f44450b4ce64fef6b4c77eaefa8ae2e46c1baf3f9ad78b34d5d3a5ff16601672f0317fbb73dffcac5cd6923bfb9d0fcc5e3cdb37b3d2614ee1f8d0ee45fb6255b2e6e5bca4632b8fb40d334ba3baba6cc2515edec20df2ba69c940681bda4cdc062bccee5e0cd9b953576b86b28a602d77ee89b0a002037b88715b7135658b333cf6b7b135e6da4f9c914cffc19363bd775c6bddc06d02298518427e11894fb8d48ea09094e1f6ed9c1b975750c2f1f7e6cc709df228520b036039c09f7f291a7c7d0522b96b41b6fb4747f807b4fcd169a908dafffc0b61e4a07aa3c16954e77d393182eef93e700fddb287254eeae31f87e0616400e2bc0302bce5ec349e07de076791284b9ffcbc1ed5399abddf031b2c6ebc393b4c180d0200558ecdcbacc94e7e5233a8b16633a122befe0c3c0ab3c53b766072767a057b020f578f4264446d5252ee55f8ce75caa2bf1197e176fc93e47fdd0921ca6122be03218b37402de7517588e2bce18dc34afed6a6aec08e1293a5d1998cafc8538d09022f364bb13d1133d48323ee484dec99ec9bf0ab93b1d58df2c0b75bcbd46ea60bcd7b27ddb247de8c3eed8161c7d6522925e0889c6eed6f60d3b2326232d9203e7a837af5992e78ee538fbc735750b36d5fb17779495fa7a52d032a1b611ab7a098feae2c627971e6b6cf9bae1c580c0d97469841729bd942d888cf430620a7e3b50199d4dd24da92a4df89600ed26472571bea608aabaf2cc2d0f3346f3d8f6be8b42cbdd3111a53e09fbe01f0e1c4aa8e57c8bb59702083b6a3f28287ee2a544f03d8bcab36e61454f3f834ef668ed7d4ff4b87a6a7d5414d7acf4d913008991e12c2570d317550def92193cc85ca33fc4ba8601f56d59b1742bd7f756dcc536e008c11d239c1205c3f39b87bf36227a799c83f44f48ff6348b34539b0c7225b0a4f68381d5f61a66283fe8587639e7c53934acb23d70cd3f9979446aa57c1dfd8363d01dd0a583e4c45c4f64f28de8a8536f65f8ab85637b1a23b9dce7ab5d620b68553b70f347c6296612ea31ca643a5bdc58ec53e6d4b5181871c6e548ad5f69c09375b5cd7b3e2f1757308907649557ffa77ecf0af6e2c819853fc7cf2f87cbbd18ddd4638fad23bb196f961f00b23ec161c01719d1b12b77d4a174154840d2d31036328d6ab338d3aa8a5b73604d1033609cce537fdffee94ad0aa34432ccfb27312518abc1f60b45b408012f3d1f6da9da29147fd2d492c6c60c51727994258283e7d150d2f4558a0b5497ba91a4f886711e6edf7127578a000dae52265c309ec5e5b10878f9dc44673384cb25b902a7a4d57015fbbbdc6f11c48aa32e6df3f17709291a2f599e25014e258c9d413a4101dfc77ace79b4c84e166bbbe1a300775187effd4f45b4bdcec9566a0122680a91e9036ac91aca9a50d40e3f9b838713e8923b2962a8d052414e9639f98620a27b65a8322cd86854167a59056f28cdfded525b83d39b1f7bab414dec72e5845277dc81354a78c55b81b1c562e1121cd4b9e4b6126fb210f5fb694bb1fba9d6d64c62868ca4d54137f449e994583989fd8bcbc85e21a39f72e381f78e6d9ae468c86236b53997d8f5e8f538bbe26d860c27b5c42af6ad765b7ba440dbaa9405848871d5b3c5471eeb694e9c3b972a0d8d85e9835a7c78237a3d07db2daba8b8de5617c9d04a1db1df69ecd6cf01957f5ca72c37cfe51a76cbff500096874fb430adea7017e3b9d583463db2a9057e47db1c29ab931d031774f5b23b23c2e2c51b6c489b5001ac602b664801cdea68d2fbebe31bc0d6571ddc844758ff89ab5bf314fe725d10c3110ec0cd71111a509a02b9bd607d43f89fc65a656e756670c4cb6a3ad7d5abc318de9b8c5d579b250398fff1ad98f564744097024df791a0788b0668971b916685f4cd73a62627071da0550ccb318a2dc10e64167449a8c666872b6c87f90776652f61cb62105e122af8b642946429495409ed330b19373725aef03479ff5e374927cfd9459f62e3ac301c30b56dca43f309511b4983e3960a8c8d90cffb6a632572b82412ac0e762fb472b52712eafc3bf547454c6e560e19bf15c409f8a6e2c65d1ccf4631e9c0edb601b43628c16902b0661f7e0e334daaaf9c9b544ee5fd1e604a79ace0b89801e3afd4f41871fbdc9b1fd0fa927b1ee5c8c5f72ebe0484dda5c7410e65540b77da174bfb4697f2b7a365cf5e32e88f212f5ac897b09e5341d254e581949fac8e30a1de26e0426b1891efc7d6682fc7f0000000000000000880e370400000000d1c120e2a8f3e927c82fb9937c17836f617b1109e7b85d8e0859fc273311d652170657b7d6424d6b6a63df14a3fca731a2051178559398b9921b4779fb8271a9e26d1e3c0e78f4062605b7f92e81b162e0d8f4e6ebcfba2176b81ab299c5bffc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043273cd8a27092db143ebe87247e70b2c34899d99e8fef5ebb0e70a7c61e159e7d3e928e91cff26c454a6db78aa35ccc054ad8a97927af3daf29a433aad3180f17cf877b05cde9c9bd952b70145d78a15f807fa553790d075ca1f02ff244a5748defcd1a22033098e4d4b291807e65dd25c64029e600a46fc4d47cef9664effd030bdc2c0cefb05b4ca19eaa7348cd25f37b5e64f4754b00cbd7d959c6f0ad224703223b1b88b60566ecc30fbadeda7ab2ef4b6e740f7c106ad8e1efa762ee1ca5670b0682c64005f04a5e0d583777844656cc6ab52342ad632f30fff0a9c57a6e56a2381b79c39b774a77dc61c439b7747f946f448499ab0139cb1bed968c287efaec02051ed67b59137b78f57324d20a15c5c48d2c5a1051a44e7a4a5bffebc9feba21030c36347d33258ad90d4ac08aa3e25dbd4ac1982dbab7509c21c81fb91e08cd30021960ac5c941c8eac76400b6ddbe798daa7bf655e68681444d4b8f447d1606c3b0202be9bd269a4755e21d95a768d6ec0942b9f21f92c05fe3de78f5e0776890d3f031f041371ed23d72ff958af191e085d62ff57feddc6f26e0e322458a2c5431b1e49ebb2d9e488287cbb9022c6f12ff45fd5ed94227473c89e506b87e49baf4295dc6aecbbe3a2ee1d25526e56f1abb84a3ff269c41c2b16fc5e13946b91251d7cca8511e71aa2d805213d53bfc6365a8c33822f939c55fa76517e5e9d3f7e5177d32fac66e685a69b7cb451f223852be3ffb437926b8ce423ab5eeebdb8b67c70b3453ae59cfa19085e12c905b378813cd565d5b73b66edd737f7636cd2793db13ec0dce0d283e0dbc4d8eb5a90f247cc2313c81fcefea49f56f95718ffc308e7498c277d621066e675eec96a8bfe42959d3d210f3315cd2279d9c96a08063c625af637b3f2a8aa9b5ae9ba9c5b62b145b2a00e4dd96a9cb912d2a2a549eee2e1324c9b16671c955e07e81ad6038d0eb1549f8915ab186314e7d73c5150c098cd59ad4c61478645f62a5f82b52af3afc2bf9601fc58a9412c7171e85c09eafa4b83ff3c7565fba188bdc11504d5931119482485296d90785cb843be4e12b248f9268c2138576d9791a0e69bc3dad0cc09eafd1a92e8c10dbc2a90e52dcfd724738a95cdd051f40b5778e79ec0cac190af024df5a5ba76adb3bd7c45a91efa802274eb6da97cfa5308c05380e6ec6e1ad86d85c10022d808ab33fbb709e51c91cd5e9de8c154b2a6315c33260b696521e49dda513ebd689223c9822338f5c5e5e64cf656a122e3706c3faad7d519edf38e6450c7db280f3879766c2b9e5d7d3d0a861a5205b546a95617aaf6d6a83064ef8e9ebb79d9345b905db58addb666189af0df43b0cc14d673f6910babe9325815b4c62ff5b35dfcd664d50c9c52bda320251ddd4658040da2914ca3d63b0d7faffb01a3a0e18df1909865c48292345012f94a31cd918bde2f9eb78cace935c4b7958386f24f7c557688b8e83283607a06af48394466f1b04f4b4137724b2b038199d8f7a9a263838fd663b439584c6949866d26d7ea2fdf80eb1bb1bd3831b793c61ad27afb524cb5dbbbc9c25afcdd2eac0ab1bc10a82af38738a4d75bc69fd5adf2bb3b51509d256a64720e1451d08e28c541361da9731da931ef17d5fb3f653f3c946b371ab2608e376c0a2c2824f54e2a0ce59c7d535caa289c6083625e7f286202ace19b19acadbd474e5b5f9a2748a5590f0cc89c5905b09e38b9310866fd26be36eca8270183fa860578ca100887532a2cb41c99cf89007f69355e1670414ae0d89048ed0e859453aad34bd116ba5b5569fc1c7dc8deb894739f095c31ef9d2cdc997aa79c26558e7a404dc864e1233db47fef68139f6b9b697d02d812f8b1b02942a42dc3cd5f88d1881daab3125565b3308d1d2292fb2840dcd847dd360e6207d4abb5df3664209ccd1f1e2bec93e66f6b72f77980651b872479592fcb254d912f84c6b559664d4b9cd1a5dbfecc2ffd61da2291fb913c48b7070dc0cad20a31799a108847d8d5d9152b650d7f94b25ff89364c29bc3088a58fae9a7ebd109b0828268e63c61e7d3856772cb10a6078edb9fe8f942133a6dc6e1088339994f1884034cd0ee4a1669297c0bc2eb56e1186163a2bccfb73ae0c5a05f49e4204e47d57890b8e9272f0fccfd8cd370b5133221b1301d520b793684c520f3929ca55cac7b062a059d513e8e9b0cf17c53a144a2f6685b842f260291f7cdb2026bebe48b4845f2d1b51c82523107d459880c509e72b7af5e3487832673844c5c8dc21f7c7c82c517cb4c7e737abb2732369b3c16095150a09cae8fd29ccdad27e5fa8d15225a25fb2bc414d4f3b999c2bd8d8410becf2aa7a7865bf0e671c606781d3d9338e1c3373860afaeafc673ed9f1d12dafb93417416db3e5fdffce37a0c", "51ac51ac656365", 3, -845202804, "60b2ed69b628d671404f24a4172c1284afa1f212b73fddb96c453d41559e438b"], - ["030000807082c40301ef1f92c8fa17c7c718ff3a3e6723a76fcceeebf72297d2c2870444ff324b6232030000000953006a0053635300524f584c5b02afd04f0100000000045163ac53b5bab701000000000853536aac63520065000000001601c67e010000000000000000c8191603000000006154adf4242ff7215f2fb77d2c85bbb651619ff17ef0dfee238d8894b8bd903da85427f016bc2f5b6c522d2c477d011f18532ae4d6c9e37898e69fe2e23dcccda04347d2acc9dba8e69c1af692c2647a2ed1e02f9f36ddc4b8160cc6aeb9480900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000553065ac432b5412c5e79b587a59dd7f443840b0c9d154b2f4e4ec3a5931b60f6e431940806c6ad34f9fecc11d796422d9b477e2aed7594ae34127ea099fdb16dc60f3edce75e9fa94eb8873e5dde24a55cac4fa5146ffd6f6357d3b59be8631650a57c81e37c9b3cc1d69f5471cdc55867567da42a9f9616f84d64e566e0cb7021a197630199c1f5cac9463e76ff13f9bdf63ddd1bfdcedee4eaec25f15056fca0315c31e96802ca2869c887d3fd598f2ef5e01eb3d067a566193a5703f87733c4e0a0631f5e56725b18e5034383d7747ade3c51978a379d10b74ae0522cd45c9e6c9ee1626c3180dea97682567a9fe33080635b2ac8ec544756bccd78bf652ac7b7d02050bb8689dfe41090daaa40d0df189b160ad30de0579db42cd68f92fcb4fd108022e744bcb805be2ddfb05066da49d5260f49e1272dc16b0464348e8bab01fbdec0201b371eddd0143133a2961d9c248ef7d2e0b8f5aad9ef0051cc68690d168d12d0201c1520d4cf56f7a0a1e45e24b2b48fd306ff418e299c46cea6867650d8a1fb9030797fd5cdf8ad7b5a093a5b2216abe31e68803e957fa34f3ce33ab158b3da874790326ffe769e078daad8d26425374621213625e9db486e8d3700d7b1ef70d57ba4cc8a069bc9cbdcb52f8b7ccce52a82c1eef5a74caf4663f853a06afdb4121ecdbc26e5d06e05bb24fac53e06102decfc31d8623847404809ac78bdb0e89eab80b261cf630b2ae6a697a59d65b9856f85fe8bfb91adca30f5babb10a1aca1ef3980d22f4a5f025e3cf0f188386617c94878b0283095845eb8745465f5a53b2c389dd97a0eb2251d323fabf05485033932933def07be83443658011f66fc5677fe9bdbc241ddc10889ea8a4d8ab8fb6a9665adade038e25c3cfcc3ebfe454f894804f71dc0fca63377b480c8beb36f835e833185d768acade13d499515d80272c4fc227a0a2e4e67aaaf6a009a3da1ddc0b75eaedfecc596e9a4e6a98fa62adaef5392afa2347b931d362a5c9154eb3c1e94caa460c9e7a317ac99b609f1d78f3bfa73b1875b8a15e953ef8d0739d0506a2248f8772ad0e93fe2ddef8d181f70d2edf2900451a8efbc76fd3c807c806dd1e7a770e82fba15ca1c121a7bb6514e9cfd314335883dfaca59e212d2871b852e1f26ca999d6c38189eeb6de8e16642227137d2a466821d121451a68928538d4a88fc679a434e0efb1845e82d8dea47d987d8d13a4ea480722d31406256d2e2944c906c3da2f6603e3e5f655498b6489639cbcd4ece38bcedf1a3391f8387c60e7153fa1430e910a211fa1f864c56ce10042449efd0b3a26bdae25bd8b633061fdc627e51be624c6c43e8fba4b8da2f6d2689061f70413b38678cff9839dec8222ae881d3d286fe767a86a297dcbccc9dea1b2527cd16c520b11f973da3b7a8bbc3ca12f1f864ef8f2a912b2a8c54b5b65dcc17446165694a3e1ab898203969b25a5542c10b445448d731ab9a59e822701026cd163c12ff96ea485268e8755633d8a3255a41053edc1481876e913bb46466ec5f38523376b5728c39aaa92768a6cebf15587302ce8a0ae11b955ac4808789562ce5c4296404e1ec59cb15dd34f49ff09e0c01e5c3484baa0643a0b1796a8fb0aa16918de257b7be5d4400d34c3e193392ee8d1e025d6667e37bd770f66bd448ae3992ec2b84a8f608de375be222a387fd9e9c2f130905e7fb76d2925e691b7961b0688101504f6c685c5a7dfc8617fdcdd02e50573611c354e66aecab5dc0e096f419905f98a16b27bad4c74467c2f827e5e3b45a9f83e3dd9daa04ac0c57f62ce4a6e8fce23282c489757cbbb7ad181ea2e9fa012d80aae7a0989dbf193d8d6653b0c08ccbb5f6df8cf6e19af08cfba804a2787cc0f4b99ed5a49c794f08f79854c374a5756fb176c583e48b43f9e5cc738475ed7a9080ed9e8cfecf9eba1dc9f090878ff94ee80470228c811121d9cd85c53e76ff07199f0e2ef55fa0e1bb214979f9000d5b91c9286a850019aadcd6f1cada40af1706fcba70d019ad1ed5fd53f3c2ce655a18cc254c1a5b120708f4fa89a56f239e888230af5087fbc497594f27e4450c82628dc0e8eea7965ef0fcfb59afbb744746e3871c4cb143027f98fa23a45a731b01182fc259bb6dc1d33937853729d3e79c2d155ef9bbdd42dcdb12414933401269df7095794fa9800982eb5145871332eaee5aafea3d971e579e74c421e11996f2cd01d2dbf681965bd764ff15e893a0013707f9398565266e719d4a9434e41f81df0e0e41136bae604b2dcb22d674b4228297b8618b6182d9b990f6fcadde89fbee850cf084d8e3c8d7853ddaea9bd17fa053b6f3daea5870bb39a016ad1f8da04e6233fbf6dcfd4d8f90a15249cb264ea9878a12401b69a1855dad6877837e09354a9318ba703", "ac6a6563510051", 0, -1582715751, "d853c6e0bb141cb9e8a36810d97fcab0a652cf282c11d596e07ad6f4a823742f"], - ["4cbafb3e03f0bd92457c372bc73068686b25da7fa0f4b1c51410b9f2c6c5a1a1d53ce3a9a40300000007006a520000ac6affffffffb309376755f6dd24316a2794b7b90cc4a5bba8cc0c88c2099a8df788c0d57de10300000009525363acacac526551ffffffff3f0989f934e3ba4332c08167b3e68fc7fa75bee92143475ebff4575d12e1b6710200000007635100656a6300ffffffff0174bea403000000000665ac63516a6a0000000000", "516352636a52ac", 1, 1465589836, "83b819e5049ac9b09df7f0326983a3041614edc0cff1f09f35536bac33b09c05"], - ["030000807082c40303f79ee9820a9438c6d5f90805d41334ab9c2cf264a0c6d81fc20e10dd3c1609a0000000000163e54ef7baa35c12e96a6df46363b3ba03077bf5c7e60df01528b5ec66d23cb0727016dcd5010000000400635263ffffffff8194488f55c4d875b6dcd06a1755f6286f28c3c05521345d74ff56b45491ce2202000000096500ac635151656352ffffffff01487931050000000008535152636a51ac63000000004e71a28e01a1e5d1000000000000000000000000004656a4bccb87c9591776d1c2eeab78dd46f0d5c3eb115874bcee6f10569ab04def42bf3cf23113feea488a6d7e062a68211c5d70776c048875f4461263dbb99a52df944a64c9e89b37d22758e385e9ed929a1f1a2bfbc5b722c004d2858b2c2600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000966a5471bc4ad03f50b93956a88db8961d7437f094c92b12b5ffcba6c4eb5c14f643e357bbadca6da7f41b2304abbc758e8d764153c09393ec797f043f038f8961afc95cf6a6a2acdd2ec1bcb78946e1e63a268988ee1c977f4574aa8c5ecddb272d4f42b8a39cefab5c2bf3b52b605d095188dd3e3c7e244feb6681de0815ab022ac20c5b60f952e3c7da243438e9153e781fb4ac9a3b411b76be1a11ac88c3140322c7572c6ecc726b707cf877af65ec828b7677c8feacc19da520d9ffb9f064460a05e4d499673abe1ea10c469ba018c075acb6c48e1719ec60eeabc22f841498cb5c8c7272c8fa1ea2792ee8755b90194b86a5197e512b2c923b27adf0526d2805031077cdbb994dc4cdd1681bfeaa674b9dea459fd41d2fbf1baec530c445410e060303171ac93cb40a3f407d19f7d150c87f5266a08c92bbc87a9eb5e023302631ec032cf17ad506081f592b12360753d9ba744eaa0d456f591b5b0f1e4d953e18982202271ca888e8f75269e4c3402d01ae77348e2958335018c6895b922ce984552a0c02159c4c72b9a6a92054486436edc07e7bcf8194982deb5a169adb47301a20457ff5698bc5227fe6c42e9f7bd414ce426823784ae041efe8a799cc416ea79239033f75671b1609c0587e7a4834644c83a4025f9ce240f042723f8b0fa86bf53173c6814c4387e9145f94a0b8b45267f18ec287d72c1240ed59d55cfa3d9bae8f921d6a7864cc7ffc2e4621aa1616c7102d7bfad0a849b6a2c6ef5c1236b54e4013a6b232e11cc9e4ace57dc9139cfdf4a488a38bed611f92573463a13b0ec734e540a62e0e3d76dd34c33822db3deb49cf555db3d8059a080a3d0d862998731604ad5619b553931f8842834a4809ce5879f631fcfa03358e7b0b89b960d1a334a78337469c96c9b60139bbb364611bdc2688c203ac1895ab3e8e35692343d56979361903b91f78c83e594ac2ae5bdc254776717493fdcf4193ee00ea16f53bc68ad1b1d4308e773d011fef224d486cae8348fee4e660cafe71e37a7dc0d67a92163430eaf5c3fc901a5b840a0982ca1e1e7a0e7f67f5a0dc24e31807241561dc7832bded416727c846807a473c782b5ac94bdcd427b69ac98e8f5301475c08bac627307837c8604112a6214e578919c63e5d3defe23a072206328c10dc8fd4e6aab29223e9011eb3a0365f87f555852c5383d06d44d4ae88a69e205f3afa387802ee61bfa026784b326a511904220e14e6b3798fdd8fa4cae9c2032caef99a257fd3bf9855b0826a133a8ac821e5c7c6e729cddd33869e1528c415f7271501fa157384a447f99d36c45f0b4159458976279a2e88a47a89dc40055b42aa76db07f6276252a19d0afc7a58fb49995308a95125406e50d1226acfaad103b837dbb7d3c2a4dae968fdd0ad8c4112ee3893b0699c616d7574daae5aff67a02f0ef17b898fcfccfbaddf6831f3f191b86731d8d718a8ee451f2cb490cb3964a0ab02db1808f3b3a92dd8578c1088bce37e73269f165c10e7f3f45f3915be561a77caac3bba7e90c3807c04de7113c43ac2e4b18e976da734e0304e0dd281271bab77c17d36228fbcf3af262cb92911b3b59d9e58ed229fb5a0910cc3c3a8bfb9e39dbd492c3adaedac8b69f84a164a8882962e59a5969f37671f5d65d1158274695bcc1e2cd1153b183bac796d20763a2bf64d61dfbb9308dfd17dfc4bed6f96a92aa2a109afaae019215b8917b42af12af556b328306876b833407ef3e5f84cd654df354ef224928649b0ca34a9bcab9b1561c952bea8d38d53064eef13dc23bb65ad1b13426e1745c85481b4aec54b9c80dc8cbb3af11f43fafb5a0856b91a4d7951f3392d7fbb4833e90d21f3bc8d78f385864ac21c0fea350c371896dbd5660b9ea6d2a6dfad081c43711971c52e27cc2e68063763f74203db3a5fdf55210fbf05559922add1e828a05f53fea17cbda52a9b40215a304cab90a7b184c2bb7af091cac7c852916c192701dcb9329acd8c50b03428c269c2cacfc1310e1b1054c4c543ee3b1298234edbd00bcd886ec8996a5984aac6ab2ea8d80e74ecc7c930c42b5938fcdb974e58f1282db928302ddd76227c2af85fadf1b6d90df4b4372af98c158a7426abeb0ee1b52bc9988dbdcc9e3748c2f392df4ff903aa1213f5e601fb6a8d9e5a07be32ba7d6916354d8c7d49d29c30af2f747cc6b18e70f6e93e961c1a3b27dab02ae99fc4b52b85eb7115dfe00356f364ffe81b8bbcd3f5d8bd2c648420ffef7cc08bae1e9997d82e86b2f0b3637605ee952653ad300855aa85f6a533cafc45d6d6d345ec34d331be7522b9a3b0d556913e2ce406097d56eb2061fa84a5388b7c610a42839837e388fdbf8aa346e479265780ce1aac898cc7c1ca4ab8524444ce013a1c61012e6f96b79a650c3d0d", "52", 1, -705419897, "456eec0edc5627710ee37d4f08b1bca665f2b8f969b4ed5e05d9789321b41a27"], - ["d691075901859f2b2c85bb1bb8582c81d391b9400985448e67111977105588426bc7df9b41020000000365536affffffff0139ae96010000000000f563b75300", "63525365", 0, -1380350749, "d6fbc8ca6016c55349885fee7a35237542f5a218f38e7681545dd38481ebe1e6"], - ["f374ba3502977767b7d4704554844e8fa0727bb970487fb13ca7d38508764fdbb7cf2827980200000005636a535163c7356c1a9a74485b4d7a42f42d959c851e342299a894bcff2d6142b806987e4e5a7e77db01000000016affffffff019ef46e020000000008656a6a6a65536551961a6557030000000000000000a8b05c000000000031d8e7cfdfe65e324e9a8ee33346bc45c1aa93833b571ce85011c4fe9fffc3b100792d6b00a15a232eab988526e2fb3fbbfba050c9243c2ae94748f7c8602ee8850e9b21410648d6959e7e704b9ebf5d9c8ca6661d7f6818e72665f461bc9a5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d347b5266609a6fb3451f1cd1ecd7c290e4ade8653794e5c5bb908c61f246da342beb740dc8e936024ffe126684cd3b814131cbd2a00f557084bc5f8b8138aebdee3bdb4ea306fb3b415e6b75280783c77d91e09fd15887675c7d382f29f6c7bf2c1205aa0410f5c9feda81decbdb7cd27b28c7860c6255b5336f858f06171690229a482fb0d38dc2007a8aee2690aba38996fa2140e997212ba6fb9cbacb8d4db02268b5056c768d6cab2ae8949e468b6d0a0d0d42d7c59b9ef6bef25c6ce72bf280b014c18a4dd619929e63fb9eb699bbb9d2059cbf7fceb65d5282edd5012060c2a4ea1ced760b7eced84b71a22a7421960eb7ef843b58d82d976451bc31df436fe02128578eca32a438bd7afc5ff3bd728ea14cb1f75d9726c6ee91c1dfcc53dd8c60228d643f26dbf984c9f42b636ff191a4862109ecf1d76b21b3d48f148fbc67a54022c4d7ea250e4f7dc42968db726b0d57d5103f9ac41a3e99048448d4e2c87f9430316e2bfece2fba843fb6f1991de52a4cb06a36e12ff44d60a09ee953e1337420302164d59ee6433ccebba3284d0cd85e3b7955166989de7f38d58e1100f710def14578b05371261d274c5b17cc4d1eb4bb38766bc49a6a805ae6bf7e25b5feabf78526795f1083c0b33b135537a72b002aa2637ff949bec09e6474f3a28a6d857febe9500c0e36f37514f0dd57e44c1f63da44507574fedc6a22c570f8fc7a9007e076ffec8c6de7f0abdf8dad969e6e721bc4115df8fe63c9e04ce5febc647664744a7f3aa5cb2bca5058833ece77fd4a312ec593c19be5e3781cba4d3bb170fc7c0e4f35299fa6543b09b59d4f049de0d8e8d45d28902cf369c7deda41d32e7c2a248e0c8bf7e8db85564c7f1574c53dde367472b382967a111326eefa42c2017e516cf158e42e349e6c322ad65d34858a2adfd5c88697bdd472ee240417c8b4c3e72bb754af12537cbe881adb856aeb465ed2c39beab147a2bdc5886abafae68b069dbae1c8f556bbc2d1c0be28f6f56bec67d016e029fa334b2608245ffb9535230df54fd5700b3577ba84d8af9858a03adb98e6de636276aef6a7a87096b0b21bc1048d99687a84946e2b3485935fa5cac3869e813b8f2415c3eb5e94d2c8bf2cc0477660349c9942a8eb7e97cd6b458091ef847dd8e5e38ff71fb3bb36aaaae422a114c8761827bac10945ac7fa680e0025f18cdbe201d298ea4188fc2f687f5fa21f4719b80943a5772461510cc8d41b89766ad831572b2cd13b6577b753dcbdef8116e6e768759badddf5f6db08bd64971d65fbd76e499df85dd070b325390153382ce5df6199339ac76965bb05b41cfe534834a57b0fd78053821b86dbc165c07bb1d9f604ea3b41f1dc023a570372859bd4248345e49cf01489b718dcf03e39b20c05eab8250644d21ddc5b4cb23973ba77cf9a396807ccd7517da8c7aa24ead0fe4707ea5deb4c9f07d381d8546990676502ae274a8e2ec39b8b7f0f4789e1a813d1aaf27e2095379e3d718894f11e436c1599f699c042112476c7792b845c35b5edc107d66368ff6b364af5a809baa45bc8dd17403ea29ad4be52e2e3f47fc792948c1642251b39f1a045667dabd2446d9156fa643230da83bedb1c8def8ba382fbf23bc2138884920bdb9da216b2f7704a6c1c69e2d11e26d1cec9f9e209f42db375ad9abde81c4f1316f0c8d68e54d20d309b8f6d56dd0af84b0318eb2c96f8e51965495fa9b4e31ea64ff510c04256220c7dbea12cb4abbf77b93d7c1fd67278b14f3438512df10e856d5fc227c42424d1c9741f12d3b2378fc1d7d3e007580d6108275cef0ca63ef915723a7884997568d0708d2fea78b016fd215bbaca61502e6d937dca6e07ac34b560c640d9fea0c12306cdc30fe82c45078a49d834b829fbda67563747e80dd28b72bd2b3152a871820ef37924c077ec3744312fd094240818949104ba10e20825d6141de44656dd948a4c3b53213fe81121d5651f295c3d4f404b1d4be93034c0223e85433efa9a4f00da6693ca1a0a74e62f8cdf32f16ff4f7506b4d74e7543763f637387e7bbaddb5bfc97abd3df6b97b7f774414dffb1d8bd5d36bbed6e68214f05b65d5b8d98768036f84d65a61e0a8a536f00ce1741790524026a1ea7fd2efd38f462042088652333e97252daa22aa7a01be9dd808c871b7917d2d18d72f4ac967eb64f08ab15b4e638474cbf136b68c6f04b9d79c7d135d46ab0737fa8f0a6c5821bddb71cba956605b30a57287a22d506c065d58a8efd8f4fdb37ad1d2e3f600000000000000000e014f02000000002b33d5027586ed37bfb8cddcddfb0c79a73e71bccad24b3cbb822a5457396586ecd95beacda9d01b5b374067883140668d26126388979a516613df54a06f63355a3a559d5f52c1f0bebcfcf18797610d4a959ab68fc41eb61241da0f396215a1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007dc751439ae91b179a76f24aeab5c29e975254d8500e01fd2a44190fb300793146d19e835cfd465d2bf01c7a47a4fa528406f6e1b7c5b1a7153930c8fae0260a2180c7883ec3a455e6bcc9d0d25acaefed9090d1c01d689c904b97b1ba65b559bb445936e81ffa17cf7df2e4f684395d40fccea5c1869f6ab616acd3ffd060cb021d3c470b907cbc1fb4552fe847b703a72dd3bab6cf22886560b7bd7439f08e970315125ea45cb4f06797116e5bd0af29a125bad18feb324ef7d866932a32d98ac20b02cbd892b668ac6fe599dcf235d300cfc72d9f61353502c456bc4e5b94d40df27688ac871f02e6058ce47673397ab83f451688be278f384052e0b984edfb598a022a4c097304d583f21aabe82c53a62efdf89d405656f99e33063edf5e92acad250209e1e48665e44e4e030ee0d938e3ee7d71f16c8d0e2df669e9113e7e04253f5802269ab28bae8de4d8fc7565b1b4215363356bc7c14e705bd6d2a99467edf5d9be030f8e977e8c1462078cc5acacdd2e01cc79b0831bb82eb17e743dfd5a23c035eb03227ad33a2bbddc0a27c31375390609d6f41772299e61d2a070c395716ee86d67b29a99cc5c3ced249de0d1bcfd6830f15983aef8d0ae30fd81519de36284622f69a8dc3db12cefedfa1f39416c3d66ccd0c18d7de866f946222061ff6e576c2b87fec7bf30fe2edeb4d49b8c7361284f7101b6ef299939e0162d607a8310ea33ecb541b0a45bfd2e0c5baf48389404165551d95b4d55b28c1985310b1535f07f46a79c70cf7b3ef11b0a6e5d2773aa25eebf7546b3e6d62203d7013608291a06425603f29beeebf6610fbbae585b7de19e1802d8c6faf052377d062b63bd44083d14a610266ab562409dc80392da91f6655adc4354f051dec318bd1d55ab6d7e6ec631873981ea6fb0d7aa0198e386656c99559cd56fdfe8dc6ee02ca9b65131e3e3cfb298116f995f19dd3e38ffba96bddfbe7da2e64f191bf3b02bf9591d86c640a4a9411980436b1d165055cad90c2d1d71a0f39842073106e0057cee946ad5cddf760cddebaa04b27bf8cc4f1404be1aa3627da8eb83abcb2dfcf34f847a4516512dfc3f6f62ef987f02302de6ae554acf2fb3677d38357e58e28db87739bc0bb6d7ab5adf09e5ae346c24d4493a7f9ba2b91510474b7f353e1c37251bde873a7948c6176dc3eb3b7ba2a7f972e79329d950acbb2576bb4993b6b38390e768c1ce000c8c2dd1c8a9eef782679ec0ac643fa784a1a4e866334287b7eecad9671381b5c1066e44d3c62fcf73c9074ad1eaa78f4a2524da7d6147243a62bf735a5a3114a692189fae87e744f8f03f4ea61bd757e9b5704a0045f0e70dd860de9a4a872a29553131b0b0db4daf9f9d98552d2898fba02977b25810b9c0f7cef0b03c3a53663945baa90a5391f910a12829cf83a44d8c71f69209fd39fc5391b1374750452e690b910b209959976e4cab09d2f37ce95e4d4c2618c0bb9b8f5a09d1635c9375feaec60440f682bbe9b99094cb72d6d21ad514b31d9ea9f0123f7cc6d5c7ea16ab7eb34e9718e21352fa5647ce5f7eb82c68a903522d9b9c09d7a2f3369f62972b37c110e680c7c938f70272e13193d1b642c37d1cbf086193da4bf62aecbdbbf31d040d3fa89ab53d8767543dada80278b7db443f11121ee982b06347240eb994f6b1e4b2f051852ad640b09d4c3d564527a88911f6ae62d61ae1aac19e5f7ae72f6396fc715344eac20c18503a7ee59b2aabb4f9e17d7e48eb58d6374408e91fcc4f157b18377dbb8ce0508b7bb10e51d101e19c0fa2261b1d88880390816eed5f43e5acb9b1a7205b08299f9d4d982d5d61167c7ec74c77abc5ef1c2fdc191981300725d8f6386688c0c87bb67b5df56ccfaddd243eb849edcab6c81793dae348e4f160799f2c332d25567e8c2e4084b7a83d0f64a4cdc170f12a83e20a9f8741372a0f0184f2aeed7c74a953297a4ae789883bf08fbe06b8f6455c42a642b8b2c9c8f0c06e22c423dabf59516d6d37ceae2fedc9b9f4450025479fbde171bdaab53d5cbc34d56e6ad8b5fd7b58dd00ccf91ba53b980f77d415f60dca326a014bd2ed6f54ea6b78154ef2347a905335a78beeb629e5cb0c17653a68e0067989b7e76c69d347964967178a40aa479e1fad29982e1c1237549156c87aff654d43c9b2d1196601812016ffafc7aa20ad3ac2aa2f768d34ac2f8e45b2da3376fde24855503548a4f32865366126c881409fbad6a61080426be7a8e0984cc9b88632c5ae646bcd1e1b70cfec79ae000000000000000019a7360500000000339e7f951abc7d51666bf1ba96205f9731786c2674ebf363487587f8948210491cdcd1b5f89abee4920c730444df30363b6ea0443f093d14c99a77cea636544e65d4d43fe6cc24ffe9944d5d81c6c02a114602ec4595bbc762452b95c44139fd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065f7707d2903c76ed9867b1657be838ad57161cfcff5697176b97f7b40669b3dbe2e408766cd8cc59f7300a071c8606bb32287ba20d8c2f7aac3489ef4813a236c5cc50c63ac8571fd98d55ad993ba1dd70e4d410f5dfe425945c4e9c8b754bd066991794526d93e7de0c6e8d0b12bec4c4154ef98a6fe71010b91f8a736b45802193ee38df5587ff0dc83d774ff33e15608cfaa2f8ef80342266b5c1f956458f3022cc28202b981dd70d929795800632aa89e626810a660a0b8cdff0b8574c9b9b00a06ee78e29dfe78144c0ea048e97c5b5a6b253926c5444786c963b037b2f3295319da4470d6ddbaaca2b982aff980bfcc66250909c1ae7ae566ef701248e5273b0315196c5e67c08bf7d83c3908f2faa0f8b0fc00d5ae3ddd8c2f3cbefdc88ce3d30210a26f9044f39be33831e5ee632b1d6d6268ec8a99e896a65e52279b186c2703031e9a7fc3bd8ac34f7b6cc91ebc659898f0f48d271923c6379f3afee5e4f82ec402178782ab9a545a06d233994afc92a1b9f4aaafed2daa71452cb09a561b20cda6020fc84e0a69074bf17c628fe3d06d6bdff219736a5a9f2f78a9794dde2f959cebffc33beaa52b748d386af2d41716b11e72a81443cb96ed4b6890d7e76533236e44b189f585ad2d01025422ab2f893724f39fc470fa25c1130ca7b893a492b1a309a9ca500775be64c779847a8028b04ba004c2e5cca09ecc19bc828bb7c465e4cd13d6dab0c100fec19b727c98a38cb9eaa3aee3a5fcfe9487a709ce54f4c62a5f34c12b2185e78ca9e86b3ab102faf25b1f71f2911607452d251a05e66b9e7540629437c0237f84b0db5eba257ce854e32f8cdcbf627f51ad82195cc6dec9667cfb06a27b65a57a097672a00add4312c2620c434d9561c174417c598fd44b8aa75cc277e5e880787c8048d6bb6eca82eaaf7d2f1712fbc4f0d0ee440158721ff7cfe83d69929097f5069424be244efe077ac415a1b0d86331e9a63cea475e3fbdd383f909c8fa54e2d3dbc14123b157ebf050cc29717ef355a0f1d0f16a03891c8d4da9cdf6d0d395363ee9b0b649f2dfcde9274cc5dc2d8d9ea9d588156fe472caa50d922bd577ce76a2895484a9090e49ab672d69526af284598409286e20b92a59f32ce3237694d6e0a7f0bc2ba8b812b0b26179af0cd1c945e43866a8548c681449bd9f23c52434a0354f668e9cf9a783b36921e0f0610ee4634b44b3885d37f1b73e2a2506aa8610e46640614d71235928fe24d3b883faaffac59dbdea05b49a5c506703887ac2a9223c72924fbff8555051742d8cd23f1b7e7396ac6da725c931d6cf778286f9bb16c2323159594d8af7c7146ab3295c77f4e68722e769e4a9e6d693ae11c5474d62f00aeef67134040971390ce639b0ad2f4db5ab1fd3a503c11f3e4e559f9990692839cf5f563be0cf41fdac0830349a41211115e6d06f6e9bf78ebc4f77b1bab8120fd29f6abdb99a542e9b4bb04fc6a3f712fd4cdddbd29ca8e67e290df6ca2a929c0bc53dd32ceaab2135574734d1e290329d69e8b18946f96a317bc98979274ef690f759851a5fa635d9aaf0478ee6247f48de34a9722fb3f6b4950c74433e06c523871a6b33c4b4b8a005c509a777e0bb9fab78e0f831eab63caf92f3295e187c81577ec97004b3289151fe0edadd4ef332c4c6d4317c8043831f0c54b11778f57700fca7d67c2cab68b24cd9f8c5936db8420fa14698f72254c8c581ec72b82efc32b2b58e78d32194da3ff92d355c9a8778307039bfafb09a5c2f94e373fcbf668e508c67b1274e06eded7870f434a0fc7f219d4a8b50db4ec18fd83c11d72f870dbaac99d77da65fa5fc45eceedcd85274109f09d06ee5a08eed58f69a2a8640e8b8bde11f51ace4d9fd0fbefc7bacfb5686d755422dc255e05eb6333d5ec8fa458be848bf667089e412c55ebd622dca064b534ff18c94a5454ef294d8dd3b64b07c462c591eedf54c2c802ce1ab6d1e910a517f42390e2365bd881ab82c034835a537687132d02ff0456dc48c5aefadf75f8232b7d74fb759e57c0e7178f72bf399b455e2550f50eddb168d3359772d7156fa9b92da1d672e41c6161cb599226966fe16361a23d2864d52f4321dc9f90e1cfbb803bcc7f61c2cf1d999e4c0864c7739b2d877d70368ef23733644405991dfaf1c3351bd32d6493e70ae3425d30ed07cbe86978864d4a32d72f9bbc84f28af79cd551fff35307b623cba6427badf5f516e29e26371998ee01485763d84f7d24ef21505378cd5bb417f4028630caf038e488adebf04537c998259311454c78b46b19fd648e84aaa1bb131090ee0ad44c5a070f70244c8a42a7fbbe208eee71c5331aac1811b33a01c9136044f87e29cf56c0d143ee0cd86012c22cc3ce5b95125b01551c2ea8aabf07fc67e63c19dae0d", "516351006aacac5251", 1, -948977876, "069b8342fa1e2ed98d1779a1e4ce2da9dd50cbb785ad8976f66de06c7832582e"], - ["030000807082c4030494bc817a988068778498531fd6ebbfe91637858a8fa2a369c72355c82e01a96b0000000000ffffffff50a7aff65388d4a0fe5e995543d1d58c71970a116c7660f7be9f4c24321214d50100000009636a6a0000ac525263ffffffff49e0a5ef9c885638870224fce94ff9cfa0d323f14820a86b72b4f9e23e95fb2a0000000005ac63515351ffffffffd9cb8b426d3cf8e3932da1d1fad1e08b4a158ab66b14d87eb8ce8058e67c2a430200000009535151635253535251ffffffff025de47b05000000000251518ce07e04000000000151d9da313e695f848003a5a98b02000000000000000000000000a38d22276ff7e8db78e3061cfbfaff0e47b3d2644040dc62dbaec5314a961ca22d5704bf628698b4889a4465360385ded1bbff9a08c77bb11ef822dfc32a6ae4918ea78e5a78814cfc7f357f737178ba42a58bbb6a69c93b32ecc4951b4620af000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d4ebf242b6f789a64f3a1b9d5429d466668ff8e5d3192ee57aef7c0847e6c8e9d8f2a9818b46bcde9ff5808a59486152e1eca8231abf8bf51db941c48e57a959aea55c39e5ff3459b421ba10a632891d7f9704546ac5cee9af8d13ae09d127e020c9b00bb29b7f8f4d52da16b8c4eb5ee6daecdfb17283e197c704e230cd1a00222f7f5e88e3a869ccfbb49e7418becec571507c17ee567815510d9cb52832827021cd66d8678190acdddce7bb656ec9cddd86674b7ff5cfaef9754bea01fa47d5a0a00c643af3bb9876f9897fcfe5a747a0b861788e512fd3c1c36c5bb5ed7679f50c570c1d42e3c95b63233dfcd399055e52373e3f25cdf395ecf7ad55a0fd65b9b031b62cee492644f6370f0af3fc6db842a975d1a5e92fb6dffcdd416652ffccfd80204eb2ce6bce455aa45e2e5bc4d6fcb53ff7e20afa0880f160192105d9eeadab4022c69a4320cc78d65812b990b71ce326362acedd93d0370fce6337532a82e7775022101e832b58a24c130f0652598de21b75d2b525c54025f01332c22ec051a093c0219005548773b282586d928b80f8e02693042b0ee41b4298f447a80eb91250193eb8f96916e7d7de1d5f0b856ee538c35d815502bea3528a3b15e923049630903253d6f25fb54e281994f781ab543d70f85366df6985c6f7b22512812dc70daf93221d1d60faf159e8be8bb500c700e28bc332b4f794b1156f6199dad69810e28e2e4e946fe194a5cb8247f31e85414caecf5cdc5a61ea6114246347f266995092522983ef0e36d10ee9dba158a0c7a6d4e6cf5c5b39d80ed54307c9d05c165625001211dd9faf833bbd335631ec7fe19c7b589c5820e516e22d6e8bcba6eb1c1098c06dd4d91036d3a117e035878a3fcd785eab5874953e6caf1fb1fb661bb3e502cbda88331f4a8037e52fd514465d39281f37ac6b4e94d1f13a628b66525180e750be9623cd995699101815192514102d8475c2374fc345ff91ed8a5d7c67c5387de6d19b9c460bb91d4c2776d2b0745ef5638198a13013e962fe892ce880e1d2d1c15c8ba8726c91d8bf40db4708f12b3425e4763c855214f35073d60ab8bf933d849f42e43de32c8fd65adc0bacaa15465641c372ba76ff7b944c7618674bd0ed34197b0d49ff5ecac1ffdb9af575d5393c5b92dc928905cdd3fd581d6066a6439ac9b3030713d1c4a14ec72719de77dbb274e8e59fd21c1b457b2bd9dff639ff8fa8c369a1235feafa34f5336a310b0190dbba3ba0f936be7cb9e6a4b27a1223a07a0d061ecfb8e8019b55753ad7377c7b9d534f8cf927aa4f6aa07e62f37dae0e0f85a93cea08e830bd048c5958c9eda159d21e75ee581ef3184cb562bbe3a0f4d9e3d150c889c4648152f738e93e9d7cd178fe5ebf9b6cde62ebf9b3e61ab5253bdf1cc699320a794abd92932b745076d39316f3ef2f6d8124b9ad5b3af58a38478296e9ba21d8433483a5361e2474eb5756c32234c6d4a712cb8377fe3eaaeb0fb8e501fc291e8e0db4b4b9b66bb0aa266827c350ee622320fd12794b6217523cbffffd569dfbb370ccfa0abbe0113275555866ec32ba236a1221851072d2c439bcdd1fa8c5c68cabb3b95b3e0326f15f0cb962d4a27f1bcb020bf1f23619268193483d961b2a968d2d5b32b18b831b15f93660e802a1b115e9014596a0a1883742ca6e1c84eefca13b0f8cca1a15e64a476e71efa0313becd8dd6d39b5c1a57abd71a15b40c78719930e8401b1d7135c2cac2d68a270b41272626051ffc0be8b602126769d379abd7d5377f92465e225a06d1896682f533cdd4290411374a113b21b1acc0a097552af50f94e0cdf21fcdb2ebbce274dd352663e615ccd1f8cfeb9bd2c53944157438fe3062cc0ea5d736973f8b20bcc6b4bb23a7b225a627aa529c7ecfb50415c366a699aea9e8f06c8918a6bff823aae1b951e3da5009d5b352c039cda07ac0cd096ad653d1ad5bc7243277b6e9f72c185ef4d93ee24f2469efeaeb3c8f4add35e0c8e39199f9e9e8e1e92aa83fb829b8b4a4222910215a991408fcc7aa9c199aecb693fa63844012bb3475524b565eff648e4e448763dcd27d307e02cac583392a07f66b64d7f958e61dc65cb16ac284ca31c1dfbf450a06ae7de591ea8747d82163de59c4048aa8221be2bc998dd1725a4fe07a9d0e3bd142da6dd8ae3fd5f160a66a36c519743748b6f49ce675ea2804ab785237edbe7bc3272c7d8e616d3e9a0846d34d5adccbe892a54d6df3f63628e6429601db53b1d191ae0938e637b900ecba062ecbde0a09010000000000000000000000001ff4f7cc40530d6a66d2cc2e6c77ff3334ea40c219096f02942e1742a73ff65259b75debd9c6983a1088c0ad5a02412eedcd0781ca9bfdac4b851ec05f9f0b01193f5797583453975a41a6f532a886534bf8256b9ba2fb49d71ed595e38ae6bd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b812b88c8c2fba81ec736cf45ffde7b12f82355f5ccd678b9b8a096af8067a83196b1380479e930c840f80642a51da6de42b365ac99b381d9bd5216c371bde60c22f747e8a04c3ae2480040073fde4dc22423801ae0bea3ee4fcc460f3d9d802e5f9507e2d7fbfd3aebd9c53e5a98a453e02db70219659240e7d2fed6f13d3dc032fd38dba620528f3870195a1de1589da7c9fbbeb97832a811ef869dfced3fdd30212718edeb579fe6746efca72618c5008b1121fc1f0999953f5fba7508544691d0b0755cb6d307cfb367c54d4789c681cf458797e463c59a286302279f544f8bb109b7c4d8c3e0af6d5976d556a9b56a306422fbd1efcab8c316dc3fcf145bb9f46030acb647f116c2be383b58e19c79555e2ea8ab9869945b762eb6e663a66706e5b021d35a7c0da31e546aaa1ef8154db2b77e017bed81c5a0fd115293bd01d38c32f031b37ea252704ebdd75f8d93e4892b9c96477080f235b676e04a83a416eab377b03119dd8eb7750833dab44bba63fea43355be75328270046f96c1c0ed02a31b3d0030a902553a71612b2567a4f67f76ae52145552649a57072ad97a092987dab18fa8e048034a94b6efce2241bc66db437287198cf00c5f4e38f3807d42b28b19f915ed9a16a790280d49a342ba3c37bb34eaf3ebe015a2d531e53834e29d251a9028a8649ac84f2e5ee966a6ec750572907bfe3aa0713d638b9264836ee55814c2f19ca7a095be1a91c7b1ea362d09d62e17e997c3bd08ad092c107aeb325e4d51c94d550ba47ccb745dc5aa719b7b9744e55038c47a08eb754c382769f79ce77482bfb33c1c14e4cef9f83a8c21f12043350970dfba1cfe8207ee65642732bc32b322e25456e2ea1433b4ab61752c1a927ea1a8cd1061c76c3520311c632ca8bcbec1972b829f4013c6a51eb94f32ef4e22449b2f35becd1d082cffd9765edb8662c20014d2bfdd5176045296b96436468240dc84b01b3b7e02827cde2488d19c8c25f93d2aa9e27aa704ad38b7fe7ce338d0cb1d8b2a1dd3f7bac65db6dab75267bf66784ad501cd364b3d92e90d11f9cea0683d9b29b1df41c398aa3d60ff4dd0f324f68af3d2ae1a5d25e5fd96e18c1934f917f862b9957f700e0b09afb036e0897e77556392512aa58977397727b89fd09cbc6076296d57bce6adcc8b891f4a1ecf0d2416342219e7e19c030859548e866065b6e89c9f247dc8d164f5da227e0857148cf09ff86b88cbddde22376faacc141c30b0df88c669aad8c878d5cf00d14c62292628ee1d06378959723884b377d808b7feb31c274e84085c55f9adcfb4d147ec107aaabb142a94b046a0fd56d5119a08e3436f512729000ece361e336b282312883fa52ac6a4f9c5649aa220f01a16ce758099a7318e2cda01fd798970775c5ea8060b1403cb94761d45a08c1813b00c3f59d04ccfac866601e7ca9ff39a0344e1e7c0041132fb2e3ce3ad6e223c4dfa6cda3027dcfbffe6ed2e77da375227caa16ef89b56fb1c5e308416fc67c0386bdcebbd2ea4dd6c852441e8190927a357ebacb1e1273566524494d9a9250e05d6dd2a74d7a10f8b29fdb680ec13fb2fd9d3aa5e42cad92f5082a1926c0fd6e39678870785a3d73eec898a2f200b494581be9205e3f5804bc87aa4acad82b94d13b56ffe7615d3bf91bcf9be6255e61ee1016966f50db0731cc3c648fc09f59621e738c9eb7cc782f5c9328eacc44688fa6431a2bd2ef40e2688e9b96ecdd4ceacbb27a2bd7b3523617b2ee284efa137ff7c4727621af8b85e229df2ac1924ddbf54eed0814f40bfaf1c9915248935380f050fd51088749304a187d5df66ea9a4b771eaa0b65098f8ee4d6094c902d20068bf16ec1779eebd9c55ad4360cafebbc0262ca58ddacb8a78ecaccf7a369379c4b60e469a45c9a266e78a5bc9de2a0e146f29e082d0d9223f99ac66edb4102d5db2380d9a298a0dcba1b907d4c5e91054dc5be5c7da3c79ec6ea70e4544b45f41757f8acc2b96e113957fdbc052bf78db15f5327dda19a7395d9b62afa170fd8c25c60f6fe01bba52533b65854cb41819dc056fa7816cee9cd27bd489d06517f6549e0319d8455fc73e0cc42921ad2fd41d9d9fd34e25cc381eeaa2e01520b60ac0f0cc1f750043efe8c41a49e88b1100ff51de4e2a4e21ffa0b4aa686177516bc89c5c5909acece73c32d4a646b895925e37509025087750c359650116fca30d47f2b8020159bc6a6d73ac987cf90669bb86afb0aae16db356fb975b3b7fc4df6a81938d05e8f2e0ac56d4e25f5ffbcf020000000000000000000000005ae7222cb2148ae4121de8ff321480956b937c50866c4b61cc18b9c7aeb07e1fb09320087a9878dfda3889686c68cf9bef98da76fec8dca3fa20a2753204a45f0c0bd9102153bffca79db05928a1dc3216d5ee7148a460c6a2afcd4d2b93147b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003859cbe415099c598f18094b39966a8d9ef9afe7dded3f2997051d48651c056e63b8e13ad4ceaf58cffe211d7c6bac994177ee4be458a6f451e0b3841b941eec39a195cd0e523e21469fabb5d385e416b37d924928930a416e07dafb3c2e1074ef0c75c605096a6678c615f0b15b6910c0238afbe9d374009b25bc2516c05db9032f983ffeef25aadcfd8a0713827c1e329abe2304fde94479251aff5f97c660740317e6a88e0564376fec4cbfd4ac92989586159f20ccc89210f5e2c5a30a6a06760b03ee5068ec7ba8f03398f446c143cb4a352968e8d504e9c37c148e24ac7a70ae9a9e53db5bd5dda1fa0e110a0ff55bff28c79e1045a43dccbb7a22110314411b020214be553deed7c5fe18927f47eb93147c6ca8de0c20413a90abd96ff3dac37f02051874b725f96357974ae32c761cc18c65fc305fcc75c0f27ccfc14f3c68b267021a8bdd4b8a3849eaf3a3f2ec38d6ff406f2e181ed364fd981de7c1224a0e87e2032d9db5a03d35137c05f74646f771cf93396174926a191af942f9f87ddc8d912602266cea40133b11687d3d2bad0f119eda4240c67cff1edde73849cecb3fd6f4bfaf7fafb91d2c25f174060c71bb5d6bb07c6c4c94a6ea73dcb4ce908d58fc8f1a1273532d4f2e10633b23acadc67acd9f43367fd5a5bd3ad0f5eee9afb6c78d9fcfd2f1ad211e5d78ecaa2962e9e343e8b79da13a96e1288a46af6b6a1e2c613550a5480d834440b41816ec8290761797ba029764512c7eca9db6af79a23f9ce1a691a58834183805f5943c8f3edb9955868c024f3cfed81d1a3727282c8a21b8de00582c54d05d4a6ee56f9853c696284cbe71e71a0710434f68d6a5b7d1a41793ff25b0c38edddc3b1f838235a7c9776658daa08b9b11d70e693d00981fb014f1918192b43f25e7fabd1e46792dcfccd48f6a298723dc47456a7c4cd1940026a7d56910cfea148be51fd1ff47a652b83efcb7cb801e9c87f691025525ef7f841f6ddd0729c4dc2593c02e58bf0e01ba1d5c467634374e4bcf50524cc9ddffc9ccbaad989c6140a70dedb1b51d599cd3c14065e2a9a158d33b69f1555a2cc73f1cac520571be84146ea5fc0e55a6ff6fb494fdbdff2f55adebbd7bce926739460d4d5d42516254751e9a28e9930586ed9e3c1bfda5d9a46359078697dfab03b31534d553c3fedf19f7f9d9deff304a2eaea1da21b6ea67e8af43a81c551ce43dafa5f0fbf828c44980176e967db39be1601e6ebdcd80cbe88548ce0d13b5ca4f1f3d47377f8f93497aa191b9b608be2783e25154eb95a1335af9e1271d1813cc1d46cd566720bda6a1e1216ee447dc00c0a615ec88d9169e7a9e6dce15ad9fb1910bd4918d53895380ae155d9f63fa74566b0286f745bcb91b993be53e884f362e15ce898bb5dafb9c6501453d93427c95a661d24dfbebb5aee29a647ca5809d7961f7fc76bf127ed48f86a2ec109132dff4166f8ccc1e317e0352f9e06a52aea00b4ada602cea459596a4ebc87c415d097bac7761bd565cbdab88ea5d270cce2059070f4a963ff74f19997273ae29f7ba8da3193539ec5c9e09ade1684ecfaf798f873481f25f8181c74bd581691dee203fb005b4fbb485bb57bf82e2200c9a23a381ef4ba1cf6f813e24559a552ce02ec92e00c6f5f52486ea9901d4efc81f4f06e8b3e0b0d8ae9a16c0752f731d8f7b5ada44ad04397a74dafaed0435baf8865a0b60fc9858896d2888a374fa860a13cd0d96089c61875f6ec586919185562a25de94b5da9f5d3d3ac87e342c46ce9de5f8c871514a6d10cc9b7f13e6acc7eca72c8a3832cb4899523c63b6a0f0b2a7e337ca9cb1d7e312613186d008ad2410217453c3e5ecdea5432a62ce3fefabeab4e1c6c3de4cc73deabca99c66b8c52b09c29d9164f98223b15c3fa9a4788c39dde89a3e5f403dbfb83db078df287f03186e57e6a5fada8f4c65cf0643eef28defb179baf8fbf752559217a0ae71206994d7e11c918b9fc966d89770385994ce029dcf14c28c0daeab26fd720f0d2711add0ba5f62841fb761a506346d2375367deafc61d9a709c99eb4cd1309279cc20f61975fc44e0e413c70433ea52b80c6e66988767dcf6c755f948165d673f6853653db5adf84278d38d385023326e5d5ad18e939561dbb4c5c9cdb47b4b9a937084d8676ae55d5a79a887a53d587c510328101c0436f9d1da72b1ad7e135d4de025fab92e1c1c8ac883d5bc52821db5a63de15ebc1eb8bbb37b061f5ff539a623a18952697f37ee224fd4510adafe690249faeb13a956c580207e364b96a6ef9028fd32b74eb287ccfa7f995ed417c64bf8d2360eb3b77cea75097ca2434c43238899b66d6075b0fbfc11b830a88bbf4480284d439a2331c01cde823db491534791d9542a5fb36c5c48f53c69991d95b02", "", 2, 123707252, "cca489b4986b67cacb9e0d7d680eb72f415a0bd7c880198987e9be63adbdfd5d"], - ["030000807082c4030194639fc3c3b18fbc728e29188daf3d7154a21b651434a46d68713839ef9429e9030000000152a2e1293d049e234d03000000000451ac6a63138bdc010000000006ac6352530051b9bafd0200000000036a005242aa1502000000000400ac6a5100000000000000000100000000000000001a95170500000000e3b8253c732606fdd73dcc0f65e2c553f2aed906e5d7d4c80f5be33246dd037d7e0e5cf6d5f6d3fbf5ae517cd44c27c5694b0787624eb6d839a350111b20710a9e21a49a676276844f22637a564f4b294b0f74bfe9601976ae2fec1310aa08e600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cddaaf033dddaed2f4777eefd19548d68f4e9bd9599976fe987551f91ba1d634eb648d4d451e7e75842454effa7fa7a3bd7d9dbe99e26c6fd8dc934fe33e0f3df927be5c8d4a6af94797a17675e77fd54e7ee6e5cf76c5e277fabf535cc9ba7ebea0b298244e4a221816062cb8180ce18f831bb06ac8b8bae1e48438ab039fb90212a74d8ca6e7a9bc47fe3d6bd2b85742d3473b2bb9ed2c5b90bb02617e923e320325d5ea0872c84362019b95944b411727142940b3d25aaa871e20d38047fd9aab0b028c2a98ead2379f5b8435ebcc383c1d6ac2fe72f9bed5f732137078b5c29e7f2b18538d2091178fef493f8b191979523694a101ee88eaa576f0249a0935fbb6020766c1800363f85e80b4e9ba9338a2b73a6b1d9b2b36c86ec116a61564199928030c88ca178fe0f3bd99059c3de167798bddb8ac5ff3e012b6f65076ee36d0a3f00208bc08d139e5bbcd28bbfc8e6d65ed434d83a01d411deb48c61b4cac5914a00f022b51a9c0f025642d8583245935003a7950d0ce113484d4c0154e56d6344fe04a02136eed19c993f00c6b4decdfd87d5f318af465cefa568edcf8e997fe6bd73b5170865270d563a391a15d59a1432655f8b23b7c44f3803caf413b6884ca52f6aef037ee2b874afb8da76df7baf5f5ef9037752edb3cd8b6e1eb8bc3e66d11c4aea0379d6912311aea87068939e6a2d666389b6f551dca61243a80eae271b4b8010d3b6192434d6568fd7f1083394b1a0a9b671ad8102a85185021d17be0174e992e126a1c182a5f627a4fe660cda2dbb734800687a24bdc5b4ef1ad69372c06361f89ef600170556adefe8aa76d0368873a1ecf0f6129a73288062540b409603f48315b3e3033fe5bb7fa1b9c8f72cbbb4a06e71c951a0b6b0b524e7885f0f1022ff68982bd54139a6d2fc64b316f88ab9db96424db2ec5c2602b44b4111446c1e2602dafe13e959db16fcc73b9d49aa7bbc33e2ecd23ba776597800de9448d41d4503938ff493f0a5dafabcfee871a682a25605451af6893fcead9859846420146574e8847dcaed64347a5be791f57e2c32d71a56a3dcb86ac708fa39250b1303eff4cecba9c492eefc94a573616eb1a2e1752cb3e821316a9266f112c4b3be4951485b74a7fdce70d0c3680465db1a1aa8643eccba2aeaf6534f569bc759d7087a87e6b09693276536a8e36f2e7954ffbb285b5bea3a95f2c9e70e01f4598f02d47e3b57112e2440951102dbc75cd14786423f4e284b2f1f45bd32beede74c654f9580b13855327f9104039385d644e134b15eed20c0c8e83debfbe063f33dc873d140ef612c91d57daac2e436443f179a7cc5764cf854ef0ebbc5acb1c787cbfdff0c3973bd18f0e08a6fbe168df0ea5f486d050d453dc403c8d2f647b7bbdfe34c340568707e926d9e837f90bdd76eb91dc86162f0c1d1418291dffb1333a27e00520000b0c7f78ddb61203e21d8c0ec8315213163068a0ab3bfd083956dc5c93bc654bc88dd56f5a7043c3b42429b44efc6fa98027c1f9282568f47b4c7d5efc33e78d86becfc41d139e6c082542f775a005e722312d6b22888eaa28d7b96666378ec63c4cdbf8045c0d4563410150553bb57793be4cd6af756723bcb64f3009b3000868035fbb7b3ede62f2578021f63e161ddce27a63404a634c21a240b5149bf978db21e2bde24efe1647f03ff7505eed39fb88aa330382e143f4e6142e78e79222f3408081feaf9655e9b949057c63e668cc933223b5677d5f69af332f4436ba3e3f4afd66e8146888739fec692e78b4e8419e5d66d2c0eec197788a5e7a4a79ecd7c7b5c57fa685f4226d874efae128991fe790d995b749528ae8cc4f2a0278a1842c06869d3100be6d69fd1ff827310a988126e2960f07326632ba9748aa3107d31e41afb56809ba74e7cf9e63a20a506aea71348c17a00eb1306f2dbd743c70f04d982c1edaddb1438a7e8cb701e77a84b61e8dddd2d2af7338c6cbcd545f31ffb4e634feda835bbd4516e36cdee57ecc4cbf367dee6bfcc1a24732ac5de6ac0f7813f385f68dd228939bb4f58f6b2a6e9689f89e6abd18ab246f6134f16120cbedf44369937588ef46a1ce5fa5e1e3bdad176d098276d4d62f81f8bfdd0cbba50f54001fab480d90f1eef0f5f248c36beee9879b26109a340ab3a7cbef8f8312029698acf584cd7784d4ed219af1ebb8f27bd5a253825c38e9fb7d25b4340d81c05ef7bd95fb7511d647b70d258562d3baead0198f03cc90b265b45d33d50b4d0db062f6990aafafa9d3e120b2d7aec382f885f5ecd35fad83546fd3212d050173e8a65a93d690fdef10c476b1bfb092bd2e775740550f8eece4eb806cb1b6cf9f6732704b81210988e8f1bc053846d98ff232efe0fec1c9fd0e7a8d83a174f3ac30d200f84a2e7822b7370c", "", 0, 140092036, "cc812615036410a37b77d8b3931a74b0e7119f17dfe420dd4218fc32e342e32b"], - ["030000807082c403039cd728ace6a07ed1e717bd7e0a86301d8a3bbeefcbe6f3de46ae9bf634941e930000000004536365acffffffff2f5810e316ed519cf973d6e655e3f3da3d3460643a8ffb7894b43a0c139774b603000000056353ac6a00cdfca3cc57de7ecd0eaea3290eaa5218de5e0f7267121f97bb7285fee5fdf203d8fb381b0200000005535151656affffffff0203c57003000000000551525263536878890400000000016ad0dd5beaa783a81f035bbe36020000000000000000000000007d63a08c4b6f3e51a5310699c3d27454a81dfd039fd4656c9c630af4f2656dff658785b278a7dec25ec1a321819ac9465e63fd306ff1319a20a1c89c5abec8a21697eb9830f3e28ccbc58cb87a65ab278bafe7c108e31a8f370e04934dfcf305000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006ed85c8ddbd66806a03194ae68c6e0abfc9241430146229a3712dde4273cebd6341fbdc8b93706c1b43af7c45e723f26726eff82d7a7f0e579d43141aee11d37172d38ecd34d0b8e4f4e3f87c55aa818742a452f3cda5e02679c9e01e8af041b354ea503c4bf3a4ddf538a5c2fd895690a83e893c5aa2249d2d85f75cc955708032d885fe268c25064ef6f2412708f254f121f94149bfbe8dcaa140501e0071277031c87204843ea15e1071e5397c57d722624617a52d81ae875a9f28af0e24979ff0a05bc6509a5715bd446b82d1f2dc330c70c59530b24b6aa9ed2da7036cc9c2b35772355245626e4dbf64e72c2e73b40e5746dad529cbd345706898266fa3198c9020d5999577c24efa3f12da84d380600b9ba099020675406e633f7dcab20655fb70220a0217acf6e276a698ef4e039918e445a2af01d773d78cd64db5b76a3bc2257021bc8ca4497853ef75557438888a8a8a5af74ae987c1805313e69a8fe2e5b784b030fe0cd0559d3b187a64f44ab1a45c0f4c182eef0910e1db3d1254e933b13d9bf021dbd499858afc3fdb79bff7a540527ac93f90c9e484cc6c92fe6436cf6a620f198e8172e3f7d4a6a21c34bfe5bf3c58dc567d3471f0b1fd2742884f93add4075537a3e4ec072c4db0c079f09872eb4fcc694ce68618410755adb95f7fd68cd0c323f4ca220af43bffc6a9b1aff8cb165090ca9bc44d34197ec3ba8d516804624ad1565800da691e1b0745361ad12729fbc7cf0e359fc4f97c83d00d407d3426ce868ea702d8d9301e19546000447b027b24fac50b45838d31e8d66fc76e8d06e9e253b525c5c8938a2d7ccda58883651ada323f89b5b8058d5fdc17a64de428aab65157073cd9d4a489d656261e6e3ed1a1f78a9c9b0f92aca0257723670e5166598238ba6b03529e986df828310be9742f63e6482694026ad8e2beb06cf7d8bd6673a8baafb8a3daf868597d91998f27d987fc0bb77b1ab4154877ad10fa50f55022335d32e8071a51c590ea05be4ef0d6da9a635d5296b8c981c4a4d0d316ad924daa1b9ff244e4edf4eacd64ab025f052b301f9ba9f4641a86aa245370ae3ca294535c12728169b5523947dd217cd4f78579f70b1062c3a26aecc04dd2ba0982c1a200d8775bd74a109a92c55f6328cfcd0178574c04346f031456a7f5c58bf167297765aaab56369f47ded779298dcbac5fe79f26b5b8025c99a80156157ac1f991d1733a1ed398c3343ee095063d44d14f5aeb00905880fec46f9452a3da3afab5c2713bac1cbb63e63b9bf02aa26b6ed7083abd49c68f193e5e0e5ada8e6e3291498a65badf8755eddafeada09aa91226abc902214f7680e7a9fc9b7bf2de6ce6d06c269a0d76be670256a5ac079d2852e8875fe2b4b1c168274690fb90b923dcbbf8e0ce3e515692c588969b09e0a0b9ad3c8d310dc614995ca5c724f5cd2e92c2f7a5ae08be984bd807f1b41a4621429c2137d40b50c6a28f0301acb5d8d9399c5ab63cbae40239663c50e208777798c1419bb8cff90ea94db08ef966a15373572641116d3faf142695fcc748df1b29fdde3a224fc45a3bd18bc5419e5d95c19ca36920745368d2874ebf271e84bb9038a5473b273f816459e2fe382b4da2478b7eb3910d2bf60ee26efd38b28dde5f6bb6ca17f4af3d4041dfa2925b5bb6418055a1c0088c96f50946046f77dfb245ebade62f16eea2523c89ec75070fd0dd90fb994b2ccf3dfb275ca2084d2865637dac00365fd8a55734dc7ccfe615406875d8856c0d2460d0e09c9426df64553fb769ec7b85b831e595db292d04b425b6c1b0044114d2f633010673472781093909b6cc53296fbe46d534de65ad31786ffdefef13da9b1d6df6d21b7165bbb6f237c37044dd0b15a339ef9a513746c6511496e7d1c3ca402727d21da4aabf706d8bbf5ec8240848039d318e76c8c9f5c038f323d3460e0c05b2dd18fb9c781a34cc504d59e44bebeb90ba35f8de5b7902ca7e09db3eb112f92fb85022ba2a52e7304a7c26790bd2829f08f9fbc2581f9908757d124d9c59983f7e6d9165ca0f85695c17169fb27b739131380c0a5dfe35bd5d9deb1532cc05592eb3b10fcf23ff5329b129b038de61e5c327f2a2f16e45700c1559e3e8942a4cb47619497548f9a8eb0794b583c5b6129700271bc0ab2ccabdb1e25f7b7d69f78688e339eb72b406c0052e4f88d113b6ee375294802c03e96fdbdedcf53197774cf4d091e6dd470bf41039df2f4e01678d47a54bf13b159496fe3c980ebdb7cc986327f86b194cce103000000000000000000000000fcc2b0cfe1508f7b9a7053ebd310aa516655adf00baad174a24de6abef0cfba92cc4e2286d9a0fab83e471135baf2dc15d4074306970b507ee8d4c76da5361939681c1266d95e8bbe3b4839a91c8ef0a852971607154ab1bdbc8f41576284aa1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ddec4d2f7f6e68ff6c79eeedf43dabd2f43a280ccbc460bd10b12c7c4212569852654f1b57af6557a24a0668129be28bfec6a36d6912b85d1a9270657d8249f6659b25f9da4dc281e5fb10dcff430151c7991881303f919c00ca69259ab83046efc82873e15005637e06e0adf3cc71cd7928880ab35cc603a935439c68a31dc0208b0d3618621003b3785d8644cda2cf194924aef11daefbd7a548bb29f19b0c2020e8b681b1aae3921383329d0056226087198d70c1ee1a1ffc0b81636082357580a03720f12d88f8ecfeec8dc5aa7f6f00d17e701d45faf8ffcc455a49de67ae8016e9d269a804f071a4ed6670ffdc33dbb7b2b1211f62e757c445ccdd2b9d73e9c021631140df93dd0910e42ab6df99ae4c50d088fe03e9066f9977dc5dca9ce49460203572a3895146295b3e15be988967742d123bee4a69ca755794f39a0fe22a7fb022ed3c7506d1041fe27f5405e3e67b92e184d3f33f06486e4289b2eb252dde2ba02204f6ee93207e88127be8fbbf6125beafa79d2407c1bb1af7f4526ab60a93999020689dc632e10476741f6a2380a5e1f1ec35bc6721c0d45243d25dfb260ede62c050b1049751992dc69d0bfbf6fe62e3d14757de22534ba962679ca982fbbb27990d347573b68472d44deecd24331e11f12cd7b4487a8beead6a6df2ba2e6552374f9d0b1995feddcb32d7db9926d6e01701c95b98f7cbd190c4eb8e18348844bd2c10d5f9988ce9b1db0dc7eb72bc1940dc6d5625d36400a67bcae99259fc7db6fbdc2b696ec520585e38bc454cb49f305915a0a98eb2700ad92627dd372035458c0c854c970d01e18e6d0f67a5a9782147bdaa74e25ce77efba27853031459eb0a7db49f1a18eff463bab3c66718ed51fab4af33df6d9d98966dd02dd59eb39196785d5081172fea874ebcfabc987e52a9f1cca3afe4ee664532321508c6cef018a95d608a2a10ff31def22a0f025c8af042fa5bb66a27e47befa0d294f80e315e3e2ecb45cfc0ae07be1cd2b8a38758fe892f3d1f31e253c11ea5410ac80989dfb2d6a3f0553a8b559e83898755f6c047b9ffb8b5712602d7f08999909a85a145183ae37bd452c4004e70b5fd80e51ee3a3de04f900c9fb3e59395d45986bc05b181776899de5bcc4540fcda1143a052766f4847a5d7b6f413fd95f5cb0f17851bc30cbdf2bc9d2edee3c6d835ec7e0e08d33c2619ddb16e6d4d59ef6147c4c6ce92ce73ab34dc3a20e8e842676d5e51c973a2b0b0636fdd691888dc8425c9ad70eaa591886f28dfd55f0e346b4c6319eb5896d8f03b2c238fdd840d98328fd0d894d1b79a091bbaff6c812f20d3e693e595b0656a1b5577b5b68b9dc3109e69c2463143d0ecd68c3684f2cfd64ecd514d04dffc07c028fbdbc823c35ccb536b6fde68e3b0d70086d9c20cf1a11c1a47a4498a378ab0f745e4fc69a2923b7db6c3098e939ad2d1aa2cf9bd270eeac28fb65df9b1dd14e714e7f5e824f01967ed5429b1887e3d47d8b8ddd82272571d81e62d5134461bd17f96213821fabac6b4758152d1467c617c7bf90d66efed92744c1f4ccc7f70eb70d612c4c0fca1e8f420f3738d2eea0bc4ae70f49efafa9554dd0798c784f41aade6dd7dd5959431e8ef380b47a69e388c7aab779ef40af3b2d0adecb86e88dc4c7a8b8d74a167e94e9430254ca63ead69c03304a778d1966c6215be4315f6117a80cb7c171f21b48bb262b90f93af5f3f8d705d5dd5755ba65959537d4a4f1f447c7c1f5a16b217bf19224a732eaec728b572f2938c06a2843a03e3a5e0e4b4452a37b2c1e6497bdfbb66e32e70097a4edd95ed56f390eaaf97b782393d63a28180555f15717d055e3991ff32c08d861390d69d998d096bc3de2b86e0d871f4b2e67e56a749a7fa84cd0c5db7385b5ce1eeb4f25b5241d8d5c85cc8b15372fd3600dbbfae472cdd906234cf28e36ad4f8703496b84838d2209a1cbf8a3ceb5a7adb2d0fd43a07d89f6f3bf30d285a4c3fb6b7f6e4b5038e5317c2a7447acb3a09f16cbbf3035133152c45d4a31bd3874ebcb8fa121c55144e1677d2e2d24c03ed72dc998d28f48a8fb55939d9a384296103b2081d8033b24d1e240864bd3b2274d24c76aad8d5d7cefc8765d8f093b28eb5e0b26e1064b108575f1b1e6b9893c27d29ba663d1cc1f5f4bdac71a94ede6f4913c358726fff0c0bf330d954f5f563aab7dcf72f10fdd891e549633e8358a15d6c345e9c11e475b56042b0506451fbab09dc7b6dfd80e8c13e2fc8dade4fce3639467733809d9c6f0000000000000000c611140400000000c8987573ee6db1a8102969b9d8fcd5f40705540da5e31147dcb49eb05566f063760b05364d46f75f4afe4f950bd93cb7068d00db0e46022b74389097b18bd41539d92c28116adfc3c9217b8ae57d484be57517502b89437262b3e1c1d879c502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d79714b76c46420652aee7b5167fe15932074d692393a42195f0adb165ae026c6f564ff1c37d990c5f2d74bc781adadb255b87b9ed8a068ec422be5f0a1f5a6d85c4352c9ce943bf319fbde1efa1c3f937ed98f2e111147bbcf0ec108ad3ca7ae1e10104156f52b22a72db9455e995f446109713c36f48a110be0054696e3350211a53f396e53b87c4bece03304872db1cb990ab015ab8e8ca1fd1478f9c211fa020fc9eee2dae1357da517e313f7965abf9a25a8d960073c5b7781fb50ba798d090b02f56b29fe18398fdc808f53d939b227b406139a95590acab12668d3682a893a9c6f3cec38003dec77e9620cc72800cd2be6c421dd788b2bbe6c6dc553c8a57002183ff96a800fef6027fb443b47d694732363087ed0b79374dbff46dc7d844e6f032b8c58f7e5d787a4d305678348dd2726202ac2a406198774b85854615c69e27d03056293ea4c30013346f81175e6d036d4ffad577740155eeac941b35604392b950328f20b4cfcc2a99340b6d474bd1fdace265e3f91a10c80310e9b5b361eae29e30316149f4717e8b1855b5c01f2e0a7f8686f4a2318fac5a4a6b072d4035726760b1178147928deca348b6cb46506e5d04e59a38e0876372a4823c901833ef72c8040b7200106b8273631773439d14c3ba7996fb7be25e6d1466193391ce611539ebd73943db1e3cdb3726a6cbf272aa9dfa40f1d0193daa362a32e09767489d262a2e1f3fc8d3ee6f3d7e977999e4b1dcf167cfe218bf7d8002c93cb3aa1e317d9969f6fd350175baf9da0cea4ecdb7f7554cc8cb2ddcc1e1c03bb2fb7364bbdb3729fa579a6a49b3ea79f4cf39e87a2638ced64efffccb1192a16c71b4347e1dba870e2c274f1545e0c6488efe734d0857ad71258ff84c99a34c37c16c8e302c3319fbdfe8e63f53af48e09e094d15539239dab8822d0ce0c0e525690627f1970163870552dc2132091b12aa7d28320a9055c7a2c8fb8ee501b765310b162de0c93051d6f51fdbbfc66acf34f2aeee4d480c37d963602f06f994839c020f94f38ba23d02fdf7994efc97c5b969b2aee046beaf50fcfaeecadc3fcd85da31741690b74b84dfc98f56ad4d2658f18f8c0e9798787ccae4d2d7be417c3710335a2d0c6934d283387f31ffc5143dff5bd12f9adcbe513a3f2c41d0b0afc9d5daa08f9bc0e32797a7d943f5da272a870b33767919d0f003721c10d417d82d30f1363cf6bbc42997f513e526dca2e591a5b8578a0438846a04402ea7e7700fe3c333f11b8b48adfdcc4bea770f8379e3c8cb9115db63bdd0c5b646bd925a44c31848bb7e60322c4fc565737a61a5449f16fc1da89dcee11cfbe6fff0bd4b841c55e143c79f5959957d529e389530974f812fbc4b104db9d818a63b3f8edc44c78c5d1df661e41f6bb5e5aacb2a10c2fec54e72c040ea4260937f727baa1a61f4b49d834d6f5ca0a2651707276714af421d0c6ab5e9318fec38522c44c6e3c95e04b9b9d8d373c100ed3d67f80845d4a67a750f7ebbe4e5d3a93cd3cd820fcb01b2791f49b3ef5befb421b165c7fa00f001b60249a5d0519462d97866702878feea3af0c5d731ed12633c1c2ebe5d9fb356f023ca470b0147c0c48480ebd72e2ff8b9d5625c2950229ad4eebbe5dae4306bea4d659261c87c07414d1bd60806b96cd7d334f3968d2ca46a546bef836ddaa3752231c35ac1ae3dd26768b089c3e187b88e221a67cc5729b9f80cef8efdb21803d1a55ba071cd578ff1a2319f68f6f67aa24336d9a09ab235f51f305e2778a2af53b5decffa964268026f8ad23af54fc0339431a3049de52343063996ca3b3b4690e15c336f61a094747b13e7620723d27d321ed5bdab916c21496e582deca437a27a124572f04ff1b90de86ff2b6d06143701ad2ce8e4fa940bc3808dae736525f2682a0c42ee084178305852c40e361ffa19e2c2c74fe8903cd4013aadbb8a91dc3f95a0957959f6d77c3d33306a467e1c975f719d574dfe35ac0138daa466ba0819a99a6665a7a67cff661af7663bb3e342d532720947b2e2ca48c50e0572bc5d6eafa4f9ba4eaaacddcad5753961c43111d5f4877d0e4885c9818135b40641334001ff574ffb2a502423792fc4ea418630f4bd365c02dcdb66f31e7122ae60839d75b2077726cf38c5391ac354fd389c218162cf4b56903389f5bd525454942def50f74c8552779f75215020f69d4c59f9f8a306c7bad9f174aecafbd8546bcc95ea662d49cb6f6d8de6ba5ca41523500e3b33a83a37595ba0aed24a9e0bc55caf302c584960804a44d0f9f9f31f7bc0e8631d31c3f632545546b40a08c4fbf9c4745bc2ae7931c016a8d65c6bba7890668ba3fbeb9ff10f29715f711248be334597a091d5f52efb0f9fb1814e8b6a745f01eb68174dac058e558de139aa61cfe10a", "0000acacac", 0, -496813093, "6c8404ca664de89560c353d93cf1053d50f43d55e5c27f48be16d01fe156e7bd"], - ["030000807082c40303be1a180f1ae6662ba8627eb194c8d0aa8c0d2b3a572da6c4efff725fdf731bf501000000015292b84054e8930311aa4e7e3342bd3eec201f034fe973dc81ffa39f925a64467d1f56ec4b030000000152066a4f68663856cc8023d469bd339a7a3f4a2aa79e3cc5a4bb86feeadbdb9bfb75f4b0360200000000ffffffff04245b63010000000000e396da020000000008536552ac00ac536582e544020000000000b591e0050000000007ac6a526352536a0000000085c9476801cf038b0300000000000000000000000080de8fee83bf7d2bf977375ee88e963b4fa9b5d44012a6cdb154a32c6550e49e0923c128e70964f52e451ab189c2d1b0bbc3899208fae9afe60849cba125211585a9b053245ddc4e5b26890b42351b44e98d042f098d432faf1ee3fb19a4179f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ec597446a8b42a377cb6cf9f81f53f7b7a5d929488bd64481b1b660f060783413531fb7189b3b44908d492df43436e8662eecc75cf6921ac95b750ae69ec3e842f06a5fabda6aed5efbc729aedb87db13c230a18a68192bf30f6fa2717f1ea2f2191e7b21796d00bd14cd3636d1db966f71e1b42a7b44f6f8eaa7f69545c02cb0304e90897a951ad4acf9614b16b16b3f3d44098915f8254fe92cf52650772065f020d8ef2202e60f414aa5b0c45fd440f1975ae9b8ae118014b94deeb81ccd60a470b08addf61371a2b2b064c3d67d6ad0072726415d8d2c54c13a0841a2e2563974ce6f114febc2997bd9977ae5216cf00cc7eb6b9cfe27b4f89ef8c4442864d5526020ef0cbf609eb63b406a45415c9e5d850aa9e22b9d34ac13d63df180d7879e8320303617cdbbc133e5324da8129504718e3293a62126e0ee252c07f8cb80a143966021a52c69e935ed4482feabd27f5753cab822a06793688ac63dd20d03498b026390227f818cdb39497eddba2ef16d43dd17c1b86c23d4770cfc53418ecd947953a8903206278cb8365ce2884632fa057c8a30c4838e8e191b51e449670b6238aba264d3213416565f4247c18650838d0abe984f737e5773762e571804046ec4d9e014c2b1d90d7b478df3e1968d985059675a14e668fd0f684d039be6afba54916e15264519ddecaf48bf8092b805c8f58d214f0ca9a716666ef2e7520c3235df1a8334a57f0434cb49f94465342d645860938e63507d26e9f045a41f9b612e732c52425d24c12f8faf8bd75b972a157f4b435dfa0244496fefed32471085e28ddc83852fb1937dbf941d5439419d457749cc731f76f1e8cc164f0ffc28c79cbb4062992e0868cd744f603cf9458b8bb62239e95f984b94042b9df64fc33fb02bfa0f1363efa17d2daa8593b304da4c68a0be0ec1da5f1016d85a12441cc46e32e16b59fc8f7dad3f5fc6a20c95e6af69c20f280750ec9c7acac8a8478addc15701f6b331aa89fd1e926115f3df4cff0fd4b63990b11c9b9b8894eb08f0da9e5084dee1f33b5ae06fec288a982f55b17c0a03266946907ea5add767184ed2bb2df9cfc3384b2180c51679a15c3c92849c29ad54b634c0ef524b42aafc2eb4409e881f41969a4caf8d7fb87a0bdcd270ac8399dbd998d4119a1e977a43613faefb965aa85dea41702ddd6e7db03d12c8671def938cdc4b8d5af5111ebcd93dfcdedc24fc14187fb9258b7e61de269a08a890379027f0011dd0ea6c4125fb163667aec393b2f2fce747779357182902281fc25c7ef167631302079636ac9360e11d9a42ed592596ae0b24d08c9d163218b803a85280995b8759729b22e1d0ccda2a4e93fcc41f4b62b31f54eb36fc1c5fe88af599280e7efe46f42c6ba9818c1ec27d1b7814ee484296f5705ff47573a7c2e88c93d480aa2c697b77bdcfcfad9f3841b5cdf96e786563ebc87f7960919b9f4c8daa5ae47206dd6ef087f94e565235bdc40ca7172896060a3d74a69d26e52d0a2fe5fe50f393a184c667dc4b338c11f472005c061d4797538f8cb3fd6ffc1ae803553431e60c0050652eb2ec442b5a7a55e01e2e20357b92e64921f2383d979c42c34117b692a2649c36942f2ebf2e76c3ca1de0b354be662559353ae2647127a70c6cbedcc32a3fc0aa20bb5798177685c2f16dbd6a860c85f0de4925f96291396854decf02672e96a639d43858460eba248c5ead9d4b4a991b254d09a0d6c53ec3d09e0f21da217869ce8d8ba53280089faa50b9645129f1ee742896859b30c86ad4d352163223f96119fdd3fb495eeb6c3366a5cff6d69576e800410962f657b546eb179702ce9590957fea3c8364cb4d5b166f182bc52b56c6747ee5db0bb15c3c273559802760b3f45a0c29bd0449639a1932180af36fc5206450e859ed5212bf749518f99bd67dc6f2c922af18b05ffb0a36a59724d95091cb77ebbb5b817f0b46c0cd504f9c41bce9981def4d105a7b84cd09a09a3b55abed844a1cd915e6931b8c3f6cadd1093ff9493282aa1b3de8f1592f5bc6f302b1aae464b15586a3cde1e99ab4915d2754e925fd5fd3f9c2748ee0644f24947ab7352215b856f95ea24ff08883efc315f55c7204366d13bf984577c146cfcc3db80793c24f4875b5fc4e6c142d320c86dc51c65729a52fccd137669e1b9d9516f71862e47863f140fad5375fa44f1f9820cc873e043505c5f7b41b91b3c2adadd0a5bbf4209e1df5a5d4d686e870d45251ef641da3edc16d640207b52a79e2f34a7eb8fc53ffaff841b86ae779bacfde8bc9f6788a62156d9e4a614103320b884cc6a11a2f0c32d6cbdaaafdb0aa9522f55d6d30a28af4963fb0a6bd6f426ef1f9d3ca927a3add977a35772b8ea2e498df8f102827b9b921a3172e675425ad0b1a6acd139e0f2d48f07", "", 1, 1370611179, "38d974cc4d3124ed7c043aba778db043b3429c2d284498e0b9151e34e3a162b4"], - ["030000807082c40301afcc13c6610cd86c373d42b4443f508dc8d5007febd9e862d5d8a1868b5abe940000000002ac53ffffffff043bf0c1000000000009006aacac0063656551a721bf050000000000c5d532030000000001515a504605000000000965516a516a0051656500000000558fefb00200000000000000001a2f6e0200000000c15f018c4a2170bd7a713f05cdb10a4fbcc0136620621b4f8b53b23689cce0b9912346fbaca5c032858eec72ea41f3f043e7aaccd59e766bc9df5625c2ac42dbd409b6ab181968ab0d747ec5e0f4df750b6ececf8307c0d3bdf645e93a29324400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de47ea2cc6993d9822aec7bca1d2fa2a330eeb462147bd2ed8a0749cee3e102eb091b251c83b579a96e93f32d5af465983871960f4c627afab074893e4250981f29f4fb2209a043ea4a9ccfb0d9559a822d7715b816a635864c3d531d3132fdd699292947162bb22675dce7c178ef41a229928501ba83df87dbfa0bba098c28303003cd7b929246597051d365bfcd784310090640092fb8d0c8c3eca05590a6197032affcf3fe636831307e7bdd68b84353315fc01a0ab15ad27f32bb10b225b464f0b0876041433e917ad08c6f40d247342836d977a2d091d4af24d1021ff6fc8460f40d6e5c1d2f69ef3f747804555c13836c11ce7a2dfbc9a072f605abdc5def956030e292f72b94faa1429245874875374b03add688a40412c7d6b32920d2ef1cecf0329a24fd34b8f35a42ef6c53b79aa9fa75638fc07bfebe0cab8ab1db9d2bdd8f202217b3228bc8ec3012d389ca1b422e8ce40cd94c81d405ba88ce0efe69893723002301896ce0d1bda797a53bd0eee5896cd816f36d5c1bcb309a54e015287ee70db0318cf1c053ec8cd280f3a1700c8d158401661e2fdf4e19d0530742c68cf59542722b25ae4f1dbba3bf04be06186f8ffca80351be3883db9cb7eb13b118b49eacb366f003e046ea71780b76c47a5df648ffa5c9818a155267817bab6c60a11ed8f9be013426a25044364bea1c02a079b560b07b756fd908d013d15f61aa94d2a96f4fa50fcd16b8944cf938453a945fcfecdb6b18d408f79f441ba1d14d6845f7953fd3f932060465a1123d07a1c60d2f22ee6a9cb690971213e13e41d5948db57fb2c72b413b2966a9023736b73249984c97c6e4bb08778c508d44eb54fd08639199a11b7b24a0821170927c3e0d7bb84fa2aa8f8f6418a18d2e5b37fc1ed70b56a125b3a52c4e2e522fd758bdad3b426bc4d6295d29cc8fc5abc37428ddb319ba41f72240cb022cde1c4e5f9ce9fefd1959466d6e91dc26811e34f826ed1472e83ae175d2d9b28c1f3f9f8e2d6ec54698cca2654808d04d34e65f41ac188b65612ddf164ce3c6feb14aefa9350617557bbd7a4ec79ee565cdb701c788068c1dd6e95f3d6a3a545a98e904a71b181dbf0f0bcf16108df2ee94ba4a6529a3ec8f7461af747a7b14742a5babb0237cf94ef1bb8996d80713608d1a7a475678e0d3b59ce6ca7b5355106961fe76ebbb11dcde1c44908c3b914f926d7fee972faaf58efd4ee9431376e65e8c123f16dae9a55c07ad5b5606a72b5ec501b51c987e781756505d7cc26432ea64a60f10cc01caee80a611ea73f2ff808a06d26ede84ff9414ff91036bdbeb5053deb94fe4238d19d4059c861572e209093fff843dfa5e375703a983cd97767f6544d3b09e252b1d7997ffd7d13cdc69b7b6019e4da228c25b766ad4f0ea11c9f808380236b3655af0d7cdcd00ad229528b9542937588b6a83ccb2c78267659ae19620e53c22bc992ae5af67ffff12adbc6765deb3267a98fd6130f1b15f081578a12196e1452f28849177e6ef7fcafba11b18c11731b70a809f1de852fce81f51263e9a62f90e8122924ea74e4bcfca679e049239b8c0ae7e83e6aeb0ddd5094388a0681218eea3271b4e3f37cb79cc211bdac504e0d0c6d2277a8f155fd7a121e09137945c19ec3c24924d5cdb15b1c64e88d1268114f26e5f8fc449aa9944d138c2fa7491074c7f458169ccac50c16241805624a2fcb6099621406a11ff2c01183ccfb1ec07411f5b5205a5874eb20eb3713bb88b95ecf5ae44043dc847f6635e8f35fc914757706bc206776aeee89f8231811e69e1185af816db4f33cc60e7931d6c9e2baf8b92331dc265d0b15ff6823e1bff59319fd7922ede797c40124eb0aa16e420f8ea0537aa0c01290e6242ad771bb2943e3ea144167d92b866915af1abec1d46b9d59be9768b529798f60ab4fcc580c3eb066f94c571e6bce16dfbebe4327a8cb80e9465036ee97ef2433efcb06787586cdc49a84e40f5ee4e346fc084dd8e5f9f2bd6207590cf864bc7bcd9ca264b7011c08b4008e77f90e4e0034009a788c76cdc89267ab1495c5110f04b255a01dd26b580d69863d1541e29769e266ac31a234ae46a84fdfb155acfaef7cce1a221b1f959ea5831fcdc39a57a22805668dbf44a88b267793693a328b5e8bcb57f4ce11d4e597e302634fd4e748349df9850d26e84405d1038007ec7b9a41084119de7b9aa2018c7b97c646613bc95702a955c31805ec8134b585abc2e40a6170f29489187f96a95352af027d80364cea6d455911630000000000000000b734ba04000000009ff03c9faed4f1d5b703a9ab352c7f556737b21934920d0fcbd075c6f40306ae61d57cfbc0a3c9437b0d670f79c62100ae39ddb12c2e8c83ec35d8cb1ecd5d4a8045ac73c1cfdb250f924e7a3c1e45101f8fecaf440adb2aa23c131abd9ad7b700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000801c146dbe829e92c142868bea3aca17ffad20bef335ba6cdf97d1f22c000ed130d6f7d69692e1a6cc4c754a98ee74ce3fbfac58674bc37171e78fc27bbb4108065b6f42be46537cc0d4a16ac8392a37ff43602bd5f38be502286bfa9b902f56f999747c404fb45c485e1b91cb4bd75eb1179816395ae7af036dfc75b62dcc9802053646cad9e49957f6a0f3fd8357cc3de95a83004f149e3f987290a49f01bf1c0220b0ba16ce02700eb46273ada9eb4e52d4ee170cf4a8f7c29b3fc618671bd87d0a00c16352c2ad54814e51d5c1109c782fb46fb70c4ddac3cc7c62f076bba166ac98e55640da354a5e39b90fedf0641bf9a5139f8b5d7a46c066b9c4cb31ca003b0229a711a2c5d27a53ae1e9c3dbdae147f83951d3917bc8e253a8c8fa4b1f93a4f031a53d595532c61b8792c5284610340482a82c5c393797b7f8684de1b974b036e0220d74f1b4c77eb0246c6373c93955ac40b6fccad5fd0c64dbee6c20077d019d0031a81cfcd561c3d1a894c4e418da5885f240831e6ecc4028105354ae7b0a360c90323e2436e3949b615455b2ecc155a537d1dcfd24fa431adfe90d9815fb4a822a00f24a35e55780e00fcc6830728f6f54cdd402edd62fb1a479a00660b11b9e13addf399a4d29c65d4ffacf7a270f6c25c971337582da32fa68a6aac22d6ec4ead58aa3e3f68e55fd3072a8ac4ed0b2911badc48f1047b71f8f3ef8b8a3cee18c268949f0fb4a1257f8849de1cdc98422468f7d17819d581eb9979638e7580423d492be3b5753d8340002b0029ccdb0c49b8343d8eba95d9614f033b819d713ca3b6bde36024e6da19a984eb702f71f3f1ffd339f9bd79de25370bb81e00837e63a3fa34bd52df0b004ae350474a6ed21734a5efab900fa66b0fa32da2673b5fc4beaa05fea2ec637ef4235a014bb3509189569ac70f4ff52e5b5afe8511140b8ccb2ea9caf775cf8a8f7327779d03600567ef991442357faefe52fe5218f9e8c68f02f358ca8a3e23cca66308d4f4a82ce3ba2d297a78b1343ddb9dfd8c0da45a71df54ba647a63488df1af0335c7a773db7f93a1fb415761cb62ad774dc0383bb8fc16d299b6b874c8de2d8fd365b229020cf64cfbe7deee56eeff15e3784067a86a3f41a6bd2591ad2123c322ae1a6c2ebb158e5b944f23f70e1c7ada9bbf790f5fd8b9158fe623742cbe6d137b9be23b86acda4d26a726e115d0bcad3d5d46f75be5d266c2dc080ae8ae222505473ac41acc95fcc4c067870a3972ffe7cd3a2709cdcac54c4511b55a2071de034e232a635e1d4c9c7a02598db78183ffeea61b2ce3e866c4b4705f2f3a0ca81db469b9918e05a32437a3948e1c34c40dd97a18a0adfcd42cab45b5f5f7b915167970ce018672a658606ad3e74aa426cee5f6568529a141dc5ecaad0588ed6fc757a6839dc405fba32700ed97d815ef9ed1e239653cc71a7fc72650c9891225d589f3cb894e37b4282943b4262d9d9ffff0d27121786897547f79aa73561e794b1c6be3f2aaab348ebbb5cdcfddb1e58a41a242aa80e8c59145bcc2ee6c9e032be3c1035e866f0534fbec6b55496656aca235420b8889f9d35893d281fcbd09059eabb79a07164c30d98b74788b519b1c11e546f3dfde2a086de2088f88b2445de4d608f38cbc2a60d6a08bf40708f1c37d6cedd0197a1c89eef8b4165fdbc16ee11cb04509126352ef8138bce708192cf23263a9c0ae1dd1c592c344ff7821eac88185c3a91bbc7cd5154d1516ce55087086ae8e021f2f96bda01872deda7205146c4d3864a97ada112fcfc1ec3dd8f1b1cfe1db00a3799e3b6544f79d00b903a139510aebeec7f246da8c6f28a24cf24c47d698d21e3e39f4ecdbc1ecf7b2cc2b76d4c191b4d4e092a4ceba4854833693bfa104a21d37db2e1a3cf2695a0ddad317e6efd5a2688fb2e3b55afb1d609836e1e83491574378592de5f5c92bdba76555049fdd9cafed25a8779a72a07b589887e05b8c92b3bd524adb44b66c7b243c583a7eee02429da64bb01384c372cb597e127ed6253103eb7978d6daa94ee14aaf6bbf992b59246a8ca86544de9840f74341512a9dda5afee85f57d5baf301ac4af15390a835852a254ebe85a7fc43aa0470bdbee1c69f1bc386f3a75c0c88fd0fb31f97e32b6d7ef04e8df31f4b81a0e2592b2dcd466086bfbcf1978a808aad189788b435c1eb1a0c8663a85fca63643e47b4f12428a2fe8f74d42d7db380c8fb8d33094d44561050969a4ae303176b433c6a662371e356634678162010229680501cc64da27e316aa4cf7e75055b7935ddc7be843b3dbea9981c9ae877751f79dd63610b14e78a2de5a98b3107b69bb8153f7f62fb7f49321c6e9f27b41bf240d427a7fa0d62f3823dbcfa626df859b6450d26c63a8fe1386b067a3cde3a0f0f5b0e", "006300656563ac53ac", 0, -1139311931, "56b873f4ee526888a75b4e80e921b58c75b0ed5db4f791d4b9838b6b10026f8e"], - ["030000807082c4030294f7fe0e2f8a96679536baae25e5ee58a7e0a44ac287d23a952ce4b78b99cc8e01000000065253535151008ecd47736f5068e028dfc1dc6abba0dd1617cc3c3e2fcd519e3d9a9a1c5e3d46fccbc31f0000000008ac5152535151ac52ffffffff02db813e000000000008526365ac535352518e69ba00000000000152000000000000000000", "63", 0, -1545143406, "b9fe89712841909407fea3a267096b007d57241ab7c11c5980cc4057d01cb233"], - ["ef22956304678de03bb1e0a616dd0a1d182f60f9d768135c67274c6d641a1d38fc2da8dc4500000000026352783399bb4a8f96b56bff7ceafc31c4bc6548ada550460a42499352671a26b1fa29a4f64c02000000046365ac525c6e15f6e7edfe28948c62a64f9c9efedc5541337a6a41070de588c9765e3b6fc7eae5bf03000000026a52ffffffffa412a3a5dbb42e65adb79266cc6ffd368e8bec17a7ce151a0f2f1b9efbce12480200000001532d4c6f4001c1565201000000000565536a5263000000000300000000000000008d10a503000000009ec8b13fbc6a114c3fa99a08d1d921e970ab491f9cc9ce6e60c644b13b5502913ac4cc2a06c5fe8f949ea8b8dadf7523cb55702783503fd5443ddbd6e4ca8c22cdb9f5be84568de46d69aa63b9ce142e78f39b14174d8ac92c46a4be04afe20f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000357f962b7f8472edeab325fd4f4ca2b4481c048e3f367bd273575ce2856e27ee92ee5573b24e7c008f73c4167e8e2ac7e0226b4b7aab35a521268fcb9db873f8fb95a1844c180fe43ecaae8bf1ca4df8f147995c668b3fea9ac646b54b89ba8e88b9964d580c4320c28f5f3a9b03a1c26edf56fbb5daf887967fa3be340886ef021574b0fc17b7ba04f8b65548bc4fe2c701c637bf5803304e04369288d5adc50602273b1598713d93968852f5fdf2e2e87753050ba87de197f86fca3245abb29ca70b071851648773086638e3ff360106e950cc4bc6bf8a381faac51dc7ccba1ad89ab3057a968e73b3ed5ab6133ee7cfaaeed5d2f903b6b1cd8e4af68243b6e29aae021c515168d6660dc3486b02ab43772232d3d7f543e017e304a72be847d7c4c8e60226f1c6f65885d4bb5f8eef94ab8129aa86d12804ab595e682f9d02554c5bc665021892762038fbcc69571d4d85d534b427deb6d20b50d15bde63b11a2d211700a2020a87dc00aad143feb42bcaaa643cf8a7490cb8a87edf71e1b8764c50b8837c59030e5bdf68075da0622d6bf7fc27ed9b7f1d011d1531bc00429c3a5fe3a74a478b953878dd06b1c0f4b87026f5a42f6722ff72a907aa42885e7b128c6aed64ccd60db98f5ef061870b10bdc149d0088bb4c89c9c202b7d3b75721c746da01f11e88fd79da2f0d76ee05cc1ffcd9f96ca1654f0be3c5bdf0e6c87bf0a10b87016729049ed544bf888aa90c6713f1d82822f09138913f8bbd2cf098c7aaa7022bd1a665e376188e20e8e699d2c1a59bfed7bf6243ac58437900f7f72f4763bea003b6089b1547a0255758efad64c5fc4f0f7ca5201bc6bf7894160bb8617b5c79d0b0c8d751c709422efdd8571576aade986488832f416ff68be9ec6a64edf5ef06eed2d37d7ff5eef1d1ee123cbdf847f97bb23c3bd623029cabbd661a228de25d96fc6682b9c12fc170b4e875df1bd7b3aa17beb3fd845491b641882b0c70300ff69af2e8ad1d7945e1a8c5fb45d3f527a5ac8b1f94cb72af3b18f96dee00fc8d614f89f7f30bda0b93edef170d1b6bd37a4c472cd1da429243013c9778ab906b18b68a042b2cd2ab9f63834d4c9f3dbd6980aa67df7800755959b936185952c9e98ddcaa28765574c22ae6c6c7162cd677ca778bae6e4d404e7380a64ffcd8f8dafd63e611fbd8b0fde11b2716144e2595576c575b9cf797d1965c78862af5eb8423d9f77be025b52d284a04297dcf6265d4d5c1abe92b3b8af1efc854f1ff93bce00644fe06a971b0911e37fec9306bfcb4bdc609e45c32430602cc46979714a696fb5c80618785d6a5607aef312b48cef4aef48c4e55061d764f367314b0359718484b3ce74e48ab98466c7eaf475bb33070a728f04d2645b5e05a9b4edfa0f764845d8108551ffc432097f61211dcbf08a7eae3e52629252ccb295cbfddee017ece43b5382ba68b140d9b9722ebf7d346a69f4953b3855cb8ebf85de32098336e65d1dadd19c786e42d23b94e6dfe96e29c9177bb49eb3005e03df4e7a8633a9b3e13d0649659114d5825ac02dfc556b4b1592871e510243fb70656610c9e9464ec923c62fde107b645b03c1963fb93ae53bc6488014df5ee410fd02a5fd397bfd4051d4f1044dc7751d129e9ce25c8c80f82d29f1f934cf8ebf7e8af5eedffd4df0b2a2fc3d6f63ff96ab75253f95518ab905ce6118a1bd7e95bdd8615f01ad8b2214e69d8c273c3b63ea589efd98a8484ac6fc60d5e7b3705dbe7856e19631bab208408514a9a53c66a63cb47cbb2e0e03aaa5eb0676f0263a227c8182b65578fb23917031896b8f8d189523a437848e38c3eb4c57e8c68606c7d6f7e89493da079ec0042cd6de31395806d527bda7ee08d0317ceaac1653136a62b147f5ed5e21d6405da07d5622db7bbcd3454d6915d3169547b0fb6783b7192525392f515cbcc9c8d8f8dba20ff424234d53070aba590f920c0c8726b89368ff8f154757159f7ea08c4687e7f320f51a108b7b50b9e59da364a2dc68225c23531331930c34f35b291493c26fcba13f114577bc040ab2564fe45f2d90d5c23adcfa6dd2a9211326cd71b4298302dfe526be02b5f8e9ddcd02eebfeb046251877774cdcd560667ac4a4da870b576ff82bcf2c78f0fa182ef692aba9eb8b60f51ff88596d50bc468b97680c4cdee255a5fdf3af8625efb3ce3bc387753d0d7d3679d3d0a2af04e5eeacb125aca4f323d5a0098ed1b777c0bc9e0c5369e8ed86a3e94c95b3a0d5155826beea357202d36bb3726ac9e8df0000000000000000aab65800000000004a569e81a08631091a12010b06d5ffd0d192bead833a683c122f4d056ca097a0e218c6ac03e733787b1699ae5a4d7127e95b4c34f4a526d3a782ba6bb310b9ef3b89d7644a8f9661a05dfe8afa84ff343697afcab475d2bce8567df69d00b4bd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dd94bab3eedc9fbe82d4ae03ecb5e5357cbf66a83af066a480e4b954aebbd56f2e2aa27593cd3c9c9d2cbebad94c9933a18197c687de08635b01673ec84b51a24f14596e41a469fa557fc0a373f0218d614a206738656e9ecf080170fcec84743e4c13e598b3835e53a9e0cedd7e98923297e1b878a4cb0a9faad579270dfa2c021757610651489f514680d30fadcae79afe3f9f829536f0ecc0e23bb35eeaac6c02278d6d319032a9499e4d8c8760dcf0491ead05e261215c66426ade5028fc599e0b06c9707c1f3cb7469002422dd103211aff57d0e8a8ade3c4b7bb0b9b385e3ef1500c92aa8f449bdcd8eba3642483c05225cc7834f0d80c08c1dfa4260352c6d80223f13ec83ca60f654057ba80096633fb3ffac89aea7bfda0d981cb5a7bed2a0b032b6b71f883e5f80ae7ad4a65670bd9bd5041db18b7b0c9e1b9474cc7dfdd54430220257082330fe648761f5249cda19638460e238e9b06e1c64ff5dcf5e3b1b6f7032de0e971123b5232b3f3abcc14453e46e3d458c88ab8456cd7e69d4f8ecb24e5020f7afaa2cf9f029a4ddca43a36ee6ff0f1c2ad4a717137a29128c2a6bee08a07642ac744ac6a7ed4e92011f067511fb30bbddd1cbc55098409e718678cb1016aeab4a7751e07f143f0e7cd4b24a682976e3eff2f62fd7d2a2be1844b23a8dae3617b2f3abce1a107bdfd5371c4e9cb3a61032bc37a75c9bf45f678d9a73aa9e1416acaa12ccb087d6d8802fdc305c576c2b3d6655c6a26c29f37c4f5b2749826b44f85ef814b05b5fdf6956c47cb9b6a6d4de24c7064be01905327c081ce4fb9e642101d87b04ed46f7fbedfeab666af935424df9155c16cd2cbc8b92de2f569c6ac1f1763c0b70f631d09831149e642a4eddebd02706293537ec7f72ec7fc74752bc89eab52cfdfba4e1d7fa4169ac6e87a648f424f9fa043299f21822b29403917a6fbef40b77f4b74424626492d702e43e3282a6600e9cc0704e4786fe38a21983b1190fd4fb9ffc5ff62681850a42fd214a0d8becc350fcf027eea7c24ac7b41d86c4bfc8dd4c5ae5afb56feb47bd4617b3fb9524fe22434da6a6efdeb026dd2b138a56fd581c0391583ef2e0a96fc7eaeebec4d8722c7f933c1d778e77db018866a5ffc328e4dd7fdbbe56306713c644b325d5c0122f01ddeec83aed7ca69d7c29c0be9a03f2c405e38d0ba33259f9baf79dcf506bdcbe9385005d41c703c35aad35b3a8cfb0199e2550e1310aec047f9ea9c61b5a8e996ce15ed27288c9b18412cbf9e48b6c5d7f834ab159ca1c48d26d549ec067507ba0bd9f1c6305dacb64df76a70b04bfd401e75232e5b16f1a88b7aeba730fd11cc53b873e9049153c0e2384700142fd2360477e3f508bdd279e717971fe6f25f74a0db3118d20b13de43fed680c13ed7a76358ad1e314ac5af0a46e67ce2bb2453c1d21ec3bee84f780ba5f875fd04cf23948fd2a1a3b553aa8e2e80c911986a6462ba1af2e198d1131578f29a0cc163d9794b510fff86e8d7489dcdb4edf20cc6c3c34b3f4833e205da95f7019a01f08b822f682642433389fa3788ea43ccf323c898c9665c1771c5480f72aa22d83d8ddfcef35e4841566e5f22cb1eaac4c403ac2c34a8912b2988e10a4f6399de91350b1a94d980bca6761940a77386d1618da0250fd7b05c0ecedca1d48b6a4c93d183fd3d4d9395cc6f7ea8a92243d170da1f9916d57862accb9951487a5f6315600d4d9f6ca932d58843e47c2a503b7a44c6a63e1c86d65611842932137e6abdeba5292463f6fff9e4a2d333e003f11c8a2b4ed2eef90d19c97fa2531f7003cce59a6cf4c77e00927ac6eaf5f0288d0b6d9a69c8002befb64b8a4fac0a960033781ff57264d4164fd00c0392c155ee583e720993b1ebd1bd4c480605ac4b835cddb36d0b52bcf9a16956662d7f66f4d717831cc3d6c6839a4a30842ffb3108d33351f11607efd4edea510eb3fa1ad7753964028e69cb7a9685714736e2a7d4689fb45ed95c9a4ed432fa41feedb0edd88adeed216dfa2f6773852fbdab49a2e1431cccaf4b749b0556b2c1a1fc49bb604b34f55124a9859cd93b6b3b07badfb394c01a4b115048f4158786cc1e8788ae8fd75b50e407049c657f57148f185b56d34d4f2873f7c81ef6b98dd6650c28d12543775fd732f2c140d446ef5cc36bc0a26a35d2f0cc71998b60cb012f481d4ad2bf780847d1f2d96347857d470e52d960b19e985a98108f0033ba5d0280e03fec7cd79fe72c3fe0cee7c52a91fb33581bd8a4ef3af36222790000000000000000955b8f04000000005a5a3934b2947c449bb9de64923ea03581a20fa1e5d1199e30e9d72dff2cc4c82495b092c3272508466ca0ddbcf753c130abe92e3f77f3d1d6d15fc1312e8bc8dd9e9241c50e0eb480b2149a76030eb64ad84aed37031f8901faa6d221dc49a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000680d323386e1ff2c8aace10a3e5ec9d5878e38521be3be5b7f455cbd4a623aab509098b70372f4348d2826b5dc08e4f0bd7d1587be917b9e7b5ca2b1d00707d3b953662f30673d582d05a106e30323c9d2b37ccf291282fd1647e336f7b44f67a348b01f2ca2ddc695aac01a32fdc74b96266435f8061b9d416608d79e4b6c3e03141004519b2dc21eb09fd70441535038b48ba6f6d52bcf07613fe51fb5caebe20326caf21fc5070315c79aad20b5c0e992637d389fba5aab54d19524b22f3fbd6e0a01129628a619d50a83346c9fd3ec1ff014a476c3c450794be08c4ff0a503fb644d4fbf8581ce2d1265b557d3cc5a9b162e3438ae43ba3ee7579957fffcb7702a021d0c36d34e935bfe639c408c8ff3437e8cdeef81291083b98baee0ea0d82b26c021de10e36c0d243aa183a44c64fdef9236292b63b9f1f574ff5928812e9d85208032d03703d80128d15a51236b9e6ea07dd49bfb718e7c9f49fdbc657c8b198e06d032e87eda710a54a58101c44625ece0674ae62705a129fd15ca3eba3bea01e0346020ca4b2d2723c40a20aab115ca967c3ea5c09cbaf7a2466d33abe4bd59329ea0e4747753b5b8fe46ebbed9689641f559221dd66fd12ac14bc20203ed3b53d9c00cc3a885ec0d73bbd477738dcee2c2d8a5c019194977dc2479890b1da0df1f7cafed3fc5e36edc3a6aaa2607531b8725c692f16ccc530e5dab283e73e722fe53c01fe9927747c07c7a0e370b1ed01d09f414625256a8149725418b9240f5b4e3c2e8f1cf30912b8152abdfaeea6936d7d4ac8b4d2e4e89e6e3e8c06f10a2b5a8e73c7473279199d98ad18e32d11d670c100b2fbb1ede6ce9f984eeb11b7f33bb4910587075377586e5322ba42b2b37ad84dae43c3eb43e882b6b6032fd12af38f95c543db53335ed68fac0989f3d2b898a9569533eb3cf210b718ccc7b9298b7b012d877a27c7f2c9985c8617c57f13c2fb468a839fdb7cf2ae86abb64b1c2271e9ee50134cab4428c694bd2623fe3d428328036915f0477b4b38c35a939ddcb38ff9fdd998a0065480c9dc7457a1768947f5d6ecf2d220ba905ce10b36c2eaa035f6fdbc61b5e9f94947d1eb89657ffd998458adf50d9c50df2a743e2206a769ccb95d50a05533a54110b01ed204ab97de6842c0547bea5b7c3a4dcd7994f35dda369d8ef7947eafd277947a248e3f7819a12793a05b16f67b9b79dca2fe2e58feba926bf35f7c427037ca8ed6dfd942147a0125b30415746a771f98a674379e90da2594e1b7aeab9e9cbe35c1e8ed6a05862839e83b4215f5eb104ae091c4f9420d26645fabc142d5605fe632e0c3d72cdc38e719ffacd3e4d313fecdb03d5e1d961f2ce1ff107dd7adcf3defd6b034bcf34e8452b40b40365e14de3f0b2d8a487decd4ec46edbc236ad67f35f5af4b7591a18d2a00113eb3d953298253cd359d4d9fa7f4afef3f7f34c45150e1038369f84a60ddd68562529ffdbef1f6ecfc27c0082d2311cebb01566ef4db5d942f440f2d92fe0806b7c2c05c3cc239eabc5543e2e67c7cf560467bf02a30175a81ac7a8c4f20814f6eaced81cc18a439bc0b3a46fd620a32953ba99a0c8b3b28716d1190cc161a72dc7a52a131e189553a63c05496abe5a904a7ff2ebeb7bafb9b79bb2c5706a4daa71c6e3f28cffa984a7af398128ee7c92a5ccb8ea09bcb622fbe96c51f283d220d4dbf42e73bd9069282d021923fd771e7a9f2ad32629a1ebe917906d14d547fc67f1ff339e87b6520c24e5c0cc44f0cb1701fdca4f54e9b05a941df718778c31c7d8aaafc7a0eba4a3525674a1c9f8ba7f0e90af166a040ce1caf436133decf57add3d9a8c093e13d405a8af52b645e9fb10fc908b35df9cb8243db4d449b887a057a17e1195b457c0305d2217048e6881a2de0bd186144679ae33cf5238d6ae17162e9344c97d63fc5f98d11e853c63b6583bad903d869c17369f046f741a3bff678c859cde1a2de487db1595796abe6e96c61cc0ded3f64215f17e64f0c90908a3c4456e7f392f69b52d0a2a2be8c8083600ec622d99762b9ba713634445c48baa86b950439b9edbe89ccaa69ef7438a1d4fcd378baea09b65079663de0600184e641829a0de226c2971fd3b86a920c0cfaf4e2ca01010a4437073fb37ab2d04aa0b6c2a669c74569c80708488c322fa35915d6766d742cfd604caee5d3d6dbd141a86f1d74a46d778d967b9e84e9376978d9a9c774fdbfdf2b4db9c88ecb9641f5e9057aa22eff77b28cfdb6668a64f804eb5f7ee0d0206c9daeda7d130f58a812d330892e030dd2705bafaf45c184ae0e76541afe464635183f4b7a73ddb817e6677536cc48df28ffe0c5ebeef24179391859879715d5b38fe8ac023580882ccd857411d85e2a2df9897ab0ff6e8bc5f4bba6bac59e946e08", "5152ac630053", 1, 1957783220, "82addde5f1de6a907504d51630df771ae1b24245722a68f5349e217a0c84f0d6"], - ["030000807082c40304df600ec8d062128e30a85ca55819e58bb72b94205bf6857a789c54079c920a820200000000ffffffffc3b515d71bbb432f7189bf68c0e940d2ba890057959b9082bd5171f089f8ed100300000002ac6586e8261c8ca791646745e0b830c1ce785ea45d5fcc5212665c6bafae13a6512a2b2330ab01000000026351ffffffff26c1352c1a4bc0301d38d03daa0618bf2b46442509daf5341a42a4527d549a190300000001acffffffff044f054402000000000852ac63ac516365ac8430a80000000000001a88e70500000000009ceb4b020000000001533f27ffa88564e73f02bca954050000000000000000000000008e8bec4bba9871dfabf1ba7d75cd1cce6e41e1ff36cfb5de55a6ac5273f68cd130246e3346b02fe4a61eda23ff5452056e27356891ad357140528280ab80119fa4a9267e6b664e5cfcc1764431e5f9f4857901dfcec9e5e234d89b5103080b0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c100b3c7763d913f5872d955067616c8d42af40da8465e2d49101a3835cbb2e4f4db6ca3028e88b669befa5b9da5c31150f186dc35237071529434653ee05c382667c137dba745b39c6f9c2c980b42f53be0ee91415fc9304954d23d7e8a7c0bb7d804c57a0566391565da720c62ccaa62fa2dc7b03b597653ee3f7127c73f43032a148057c5bf1c6fcc0c6ce16ee5761ba193f7d023b2b681bac325b4e084284c03267904e4cd88cc2e1c51cea924e9aa7098cd99e55cb6865e3445b5fde7e1cef40b0541e1b3a56da7cabe2806d1fa3f987f12e41711cda2807f6025b21b60022b8333da011670c66b158139f42ca427ec6a9e37048c7717359fc735ab00d733d513030f79d784eca337e0fc867ac307c8e884807af55552505f465801e743a3eaedd4021c779878d31cd55d923e894c63f1bdb6c0809b62ffe3d2dec38404d368fa353402030d2f2b56a681c8789db93a6d46d6e6cfa71bb2cb7c352a7e84b9d18cda61370200f048e5cb271f0d9a533ef83c554e9caf16e6cde71a07a4fc2937ecc8af3680021b9d13cdd9c4c78119b99f55d95386f6da4f2aa3743d7e3db9cb03fd6c1b520c07c2a1d63a3f921a1c7acb729b3b3fff4a03542145c1b0ec65f600461590cdd2ead00aa8a6f17789881151a7cc943542500faf10beb16ec9edd0e1a25d6c7cb5f044e1e1f6171e9503a1cf1af736d6b1de48702e60821f602835c4794f6117da46a52b53b7e12e519ef5657ef45ca71b8275ba346130dfc7ec16ba18956d8fbbf3ef54714d16c2f71256573cc5e1ab439ef8c3c0596dcedbceb7f3643fa75cb7d9cc2291e3743cc5604566673e14a97d3b140f5dbe34b93ed32f53ce71b541ef3ca9e05cd1ee07cb1b872872a1914d04560988cf76b79d6f8c538ab14f1215a6ccb0756f10f2f8517adaee9b7efa0804b8e3aeb0051ea98f0e87485ab3f93b2df3dbf2f9e363a45e4a8600ae9be7ad5202e147d9000f95502bca775b713a8301b72c293f71fb55279aca3fb87ed11a8b50657ef8722db9771fff809ef9debb43f9ec90900d095443f7801fa40d0468864eb44877d787ecd25a6e445ecfa7ec3bda234aa4f8f634f6dbdd7277cccaa03b695e684ac868026bd196af24d2faa5ba7fe8f64efa6f99e6d13494cbe74afd3915f4615c6d8507d9bc948b8edc4fb36ceb1822155cc7bfeaae7c594e737ce1787a51350d5ea2977846cb68ee0cb4a7e8b02ca4ce536b6d5ba160440c7c39e40ed9f2bb69b06f078d95c1518523dad8094b91579b678f33f619f26efb7e2c7d6ce28fe89111e2a6593d93700e6331a3148fcdac38f6250d1cd07843ac9afa6b6fbf02a7f65e70142b7fec1bd25f3be3774a0fc60a7de4afd2eedf436723abace6688c8ef82d0bd58eebc5f29ef8575db362514f0238f40427ec1afab15567b8de187e1ff325bd56a3603c3d6c43913a91f92295e2de000b9ebb6ef98f0c2a304d6fed082ac03e67dc3fffcceec17adf181578791ed912aa834596720c81eefd1d2ef34f8d34e5418211eca23d26303b7781bd889a5071021fa216321fc7e81e161ce1f2591b00d7220239989f10c1ffed837e31b38f1a977bf6f8aee68ddb264c7324a01da8d5927be8c2e2ad510c934b5f4980a113c53ec45eb671187ae256327a5c93db1f366392171d8e46f92e4330fa0d81200530f162853b82a5c8e67f7c437ddccf9394971ca96ef55bd5c79a2435b547360f74deac2511a82ab651437993bedd1e59a1f864bd8f2d6808a1e2e4a546058ec44a04f9bc316cb5779ec93a51d46db783a1a40f524275d4ff6e953a456ab4935eb2cd9049055198ba780613fbaa1e36448e260b9e37b068027a196a2f291ec80ebb6ae98c23434df8faa99db7f93d92669cc599d9510a19b4f448d93f41b2f8617e0cf1eb236927943754b62fb62a131db983961d5f1cb1b0ff97e3360afb7b99a0b773d5f190d4d3ed9c01f923d5ff31c9aaa513492568926f64fa06fd2a7c2afa25f4603ca43ccb1ccc976cd413bb5616f8e4b098b0084b4a87443583b19132224891e2514c35a0b7cf259d9875d8ccd0447c4b9cd4acb3e0e17f05ec82e1e4b4a123620e56c997b5671684b66c1d53d289ef751b1de183a11f683500cfd1303db15a0ecfb9b40f90c051bcbe1104412ed26a892c813b8094c5a7d824caef621f2a761f7a22763b4ab93e093fdde586bc3acbe0f8fd5896e0aeabbaf6c0e3b81f181d5c486d0eea24662ea6e07170cf04a4076bfedf1ab7b8388c42f4ebc9fea882af68ffa8ac9cdabd41d12b00000000000000003830e00000000000448876d2f98fa58533357188450e0937505a3c19b1864ee59043aa5f35c2c9e970fad26e50a6646501d984b60102c6154cb385045a06ffa0f6d4bebcb4edce028a13532e122d69ec4ee982a14a5adcb8354e8cee90a6d24cf5e5c14c6c52463600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000726543b89162356de8acf85534b0f95276086d1ebdec7d31efab3d2ee70cec0b312524ed02a18ed276f5c7bf91ee771affde7f38b7bf73da99bf70d10f134e7e5535a7e72a6702d7cd8567471bd73a120afbd215a9db5e25640f5d29c13159c2801054ab921ea415c90950b986877819c52abf900d94affdfb8fb82516e4f7c40211b29a98baa2e2eb855aae033d8cc1720581ea8f9d7a837b87455df699f565a003192645a69fd347641ff49050b0f086f23477eb267621409fe74d30e57651503b0b03f88bd8a1a5fadaf0728d2380a42ab59f2316090ec8054b5d1f5b168642708264a975db0eb8ecdbf13d8677c562cb884e8c7d15f1bfa05bff1deb43f2462e81022870cbc203322e0e2533714f12383503ac299493fad431a672b62ba7a16bcfb10307c769cbbb8e88afad6be2c8de0fb633d10589c90fa87c9433a0afc93ef2ffd40205b5c03255029ce02783ce72e7d51ac41f754a73fd0d01e31bb0f8ec1a68690b02013f015abfebcf7d5a8fb7760714f1732fb777539012dea3da7656e201d28a2503116f66ba7d07b42f9f830f328d6dca49c348c676b6233aa51c92bcd8977ac72c065d5003beb4c3d95f7a0257279ce4f236fed7615faa97ff4c1eea599fafaf1ea987eb407c4ffa37c6c4363e582132dd8b83cf7daf9a1962ba37458943e058ccd162ceed6569fd1843a06c7ae519f441b39c61e4f0e2d77bdbf2d4857e8f1b5f45d346f2183459a7a3cbb77d6bb9bd640765cb0a32bf33fa10b848964c26d21800c0fc761fa945535c421600dd5a8477f4ea6c75cb6fccb3a1e16b94a651343b7c6cff1a49033780e45caa563386f2cc361c956f8489652299639645475ae459bddf72acaad48fd67d6d5455fafb057e3c38624aaff14aae6494cb2df09b025a853ae4bb6b6eea8fcf5b5c15a6d31bbe32b453c684d68c7dd7051d520755355a561520a40b2ed9781ffab8171f75410e750e883f1992c7c766392a427de0904e96e7ec0393a4a05a73cb63bc0c33ab82b697b35c14fa2679d7fdef5bee1e9ceef73acab5b8dcc22d5b8fcc7b6af81bbcc9fa0885baffabc95b923dc87b779736d161b92d09649689914f1c8622fc3a33a0133687969ba27db34829aa462c26a11ac0f684852318f29a4fd950c6e5c70aaaa65d2806b864ebc921be3bb4d6a4e7d6b1c034510c8c12da52681bfc2db4a61d7d628b16886abc0ef6bc0bc285f2d8c41173588d56f8d1f2edc3be0a8510d6bd2e2d25bfa57985dc45143614958fd654444b7284c803821ae816574141b4c1ad5c495794b99e529f3666f60b29e2fbab53908ae7d0d64ff832329177fce44e7ae2da121dd1fc413844fd7f4ce32468526bc41abaad184104d2cec410b1abcf9d98776bd49fe445852e65eddb28a047ea94592113ee34905ef1acd6d9fc06e6aa45928788bdfda7d3c928586680ed0aa7da14c8427e776a0bbab60a11c143e97bb1015ad7a88d3354570d6f3f390c041c24e27b9ae0926a3086497d75c4812394311c29b30af9c56161939c50f29e664418454da0b2d48ca7c1576da3c6af4d5d50ed1df4da2ae9228a751f867df44cddc5dc91123cf6a3c4fc2d60adcb2166e8451e4411d74950a5798742ab17be8d022ab9823eca320b532b9b9ef0bccf219617b36c58b970278bc675700efa353a54f624f36a161d0da9a52b0893040d569a7b54f090de0d34eedfecb9fd8e9b517415099c46224e649dc780837c9252d3cc4c262874c35ab9566847eebc4cfa3ee6377266b81f86985c2efa3af3d273612444bdd6e0f6a15cdd146db66302e20b79ead61929fb1f8b67b96d2e3b07de28efed4c81169b203df42c531a5e05722c57920882bd00dce2a889533fef2e95d0797c0ebf9f0c8d8891ba22a5a4203061cbd5574830fe154debeb93b4e72334ee858fc2c2e20633d222cf0b1a6cb5cd72a3be44391e410031e1fd7387552ad5b626db155f8bb135e47e93aa73f62af9bfc62ac46682b81c81eaf98fc5dc4518fd097f803925d50aa551eee3e73234b0303165a43a4c6d9263594bcb8d1efe4a68e43d06413d4a2dd0f9f3a934098a8292b273fa971762c29e9f6b20dbd583e6c2cb574d723fb6e2a6f0e19ad68b8c8a7daead60373f53bb1277f41eac00cffe1ecf80702e1a1508a003b7f67b08af2a1568a2f47c2e1b0f4c258b3cc4e622ccb7a99cb69b539cfcad5e3d6643518eeefe04f00f3fef309620110861c9f89a86cfb63dd68c8756dc40f3ba83c0b614f840abeed1a98388f0ebdf0c5df2402363d70e8f2ca7dfb9d2a0a3c6007ddbc217826364647da057d2a742c60a735d083342816390e108fc5b282bf07216e1555be6998be49ba88996fae6b67b1bf928a637001bd830a0ca54974c0938fb980aea33ca9e3c8b1e053132abfe56ba0d912e7d340a", "536a65525351", 1, 1130665708, "7993ebe61bf4dcd3723d20a527d624ba66fcd3aee957e8fdec1e8eade9c807a9"], - ["030000807082c4030487a766978179d0f3d1c23794940d0830b0e70373ade8d0b60804f795dab73bab0100000007525200535252acd5fe9e6a2a6ab768c89dd41d86a7d153e252d599ba7b56b516d4b29c4e3467b7e7b5829e020000000600ac65005263324a23ec0405c53cecb01127b1766ba2a42f4ea344c6c63bbdd9105a182ce1fd0fec3aea0200000006636aac53ac00191faf9e914972196f78316eaf6d7c7d29bff071ef348ad6f426a9f4cae0fee6b841284002000000045251006affffffff015d0e8b0100000000035265ac00000000754ccd4c0100000000000000000b572901000000007955814e514d295858dd96e67964aadc694848a77c4627400655e18e49c55018ab139a0f5cc22dc9d242f131d74bc658563af7f90295839bf3f0e2d2f50e8cb4e22a6f925b83a589857c869ab600bab6589a67a7d46c25409da69eb3f7f584ae00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cef3bcd721df970cceaf51a02829a83a3a2f4f58d97ee3bf3db9ac7fe0d07943b3544645a3d9fcd4e6889f610c60be9798cf35f96dedcdda9ca5efb3242af680ca799cf06c926e44c4079fc02b1dd1fda38e7905a5526eb5c355250eb66ae6cc29126dfe3e3056621a1042b98a59dbd8845b39df06bac81c1835b889c431073502199fea301967e3e3e623d8d20af0cc039de7bad4af9a83592e6d4bd6d16c3006022f00a84e87b953b64812d0116f61df7da46400915eec2b7ef759c401429721bd0a0132355505d7d18dd72e3261c9bd020f2bafc652eef3d5b47b0e5c3f81d173ba2e6bfe8a3a05f0410564401539c4005a143d5c338b55da4706c8973c8bdc3ad90225dcd78d8b40c88dcd18a50ba243c6dbabe6d96ad35067bc5c485912a5ada2b8030e11014f7f555fec643dd3d09e1c563a1417e5f0f861d0fb5c37b23f42446ca70221bf7dc02a0ad1d692de34e4dbdd379b0930b4a0bbed6dff52d282391c8807dd02236a94faf8029e3a5609f41594b8a40c3a91fa4b7e46ec33a5ff5896f095529e0204ee86733551d62c4c475dad3ff59976d7f33085158459e838411bf1d9bce38d8bc00ebd5c0478e6e715f927fd337539c50ce320cfae4722996d4555ed0afc6760b9f2ce1a20818d48574a6cd060675d4b182ec76888d72d4c5c9b657fbc92db84883f916e98ac7f29c9b16cb37a648fee251470658ce613e457b8273de67657236d2ca33736e09bc598f4552ab662420c3ebbfdf8f9bfc4bffe0fec98ecd3b94dc9b82ab0ca914612e60a11113c9140654a60b9b37f93b889bc9a937cb43f3a5d15d5d870e43b79d9e2c1ef004bb0458454a62ebbd6be759c9157cd60a68bf112ca4defce2ea61f7af6bd228c0a78328c35692f213bf9dbbab6803a3aaa565576c3a83a85ec39b404f32e5f4f4b18bc116e9ae9c22b364956331d3a5ff90dab1e25681dc1dfe4d1be3cecc3ae0385c384d27648860e200590743a1cb69561ca27b5e57f556d75e36871c0044aa78422811e8257d34cf5e6b7f0eff10e6dd08910b54a6f5b6b31332abbbf2bbdbc7af07e3b8b4d8dc39973f1628e57503d43ffb62c0aed08bcc47203bd1c21d82fb7eb7b02df8d5ff5466b21b827f53cda6539e37e95c6820dec4dbf2a1c622ed88e1110be73445e51a2710bb1c05156cce8a23724ec3b7379334e2e2ea84a2298ee0b8a158fbc563a320cc03cd0e5c53a1dd17eb5148cdd8bfbe6f5814a5c41fe76283cedbb6f38c1b8446da95ef9c91dfc42bc3a50869f1c494b58d58825ea76042877a8e8dae5e603ef20948da84f3abe0b51e81d559ee75a371b5c498469157349a5c18fe6c0b9c450b607aeb0d42e6575d1457676fcdf61b9e2f7fdf3ef112c092960a6f2385bf2038cd381f3d906dac2af3aa5b9f592bf836ff1ae008eb0bd410cc92cee57a17ff67c72ce489c72da59051f483bcb0570d5dc92639fd931747e68181cf6d3fb919b75f40e9b4e37b595b10de504cad03184789deb7d13922dc2122a450cab6a6438413afbd6dd07c751ddb0f1c25adb920d80f9e997b33afdb22ffdd7295d8a3e99aff032459fe7036c7acd863e1551f4e32ad754fd5666d696af7ecc65069c49961ea0d19bf6854e9f7ef34b057bc6273ed24e7ef564958fe6c04472b80464936086064c89b299d3432855159a5fe09ec7fef8070c0b0f0ca1c80a9a456e59e3cdd6c35391f44a74c11874b98f0026771f8a35a617072fa2c858b7f990a54ff59f5baf500fbd97e286af3de4425c938da7dc405a2cc2a982dcfec2ea4e13a89f7b87cc7fb13bbe3998eab04f2f11f25141638b94ca59d637d22b47825170507eee358b42573f5a97e4fadb7f07637686cd8e6f5d1a086c4adf07dc526e7a3e6747ea8229f9d6fb464dfdd6dca3891f4546aaf41fc0a5b202bfbf01a6064261a8028e7a880d4c7da12c8dedc5bb43fe588516b273a271a64752f8a344e8235bb88d3b6c90a6ddcdc0861bbcc834fdc004564aa904366af73331015767459efa2469cbf7165cc3f4f2a6190b7f4c20f3a5542cf0301d4bf44df759a2e0becf7db70bd60521961858b5b5d0ccd82e0202467c8c9b80124c0d56cbc1dafd1da1a4a09c149046fcda9bc864332027a6f0645dbc73323821138b34203069d9e195a8220e7aa03c7b07c09e26600ea1f8fcb80e2c5e5d067c4192b179499919a0095a30d3dc7c0ae62f2792d87bc793e52f8d5eedea60947d4b57e1ce7995b5ae4a22d8e97bedaed0b8d83f15f62b7897dc0f4275fceffbc06f84335d4affb584df62fa55f9c37c89a8b04bc0ad300d37cc659c736361f9a48225d64b86358565ea5fd4fb4868c5d4893828719454cff1ad3c8b67d0370c8dae90986bdeaa0c6d44458041c095338e035c0579ad2963075433113c5539d9337bd3210df708", "516a00ac", 0, 1653689908, "d94fc1ce52ab499c58eb2994f41d406cb5c09ac42b9bbf15902439d193dea5d8"], - ["030000807082c40303b94ab5fae517ac7f407648b3a28b9f5ad0d30665e6e5cd00f4ff458ed6398c9700000000040000516affffffff4c22aaff6957500e63cdd39653decc4a5a9c5c38d6fcb480fb18f1815ea4cd3a03000000056565ac5352b650598d17c26e18a5cfa0c95f5ac979db1f02ebe58f57ada2c895e452383a6d2dc6aef203000000066a6365536500686964d8048c387a04000000000352acacad7cde020000000006516a6a52ac63f88c7f01000000000653656551526307ed94010000000004536a516a000000005892b78a026701d9010000000000000000000000002f520e974dab4346e0ddfc405092c19671dbbc5fee4eaeea5f4a8f292562ed7a4a9b6b2351b32fa84b145934297652606717dd57c6231d5926ebe458ab2fc29015347bf9178174c7c9f993325986429ee6b1a6dfff19c53f7357c41825fb46c4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005a8435745017d45ac30e4213ea2e59c51a21d98d57cdfa632c170af319c7f141f3e07234476644c50ab3865cff540beaf7e7a044336ca4609e8b8858aa9680a4ab0fe3a6173f10a7a73765fbb0dc927932c5ee955d277ebe5da42df188896f88afa312dc20ae422a577e1fed441307bb8f66cd7cde2bc03321540ad1328778f3032d9c8f23085b3ebe8c3602c532d9be2f34aafa065cf3f7727880760c94144732021b60a0f3ac844b8ff7da93ad78244d06694cc3f6557ad99a65e041f070fbfeb80a00602565da5263a1c8d62b3ec7dddcbae159030d01a199e31e33814624b2663037eceda380c4d8117268f52e51e5776dea3ac1304428b8ee002bbf78676359eb0227a0253412390a4e2614e4cdb46609b89fbe3225e0343fc57012d8dc66bd8da00220e2146dbb5b635f218a787a8a9fb702f690d57c67fa6d51a35b6b189686ba70031cc5cba0f62d17ae6a0d21e824ca59ac65fc8d66c44c382ee525d0a255657fd50328b6c7e039cf815b1c2993b2e8db913cf6beb099be7a28837c491554b2081265032ef306566e8d2011fa17112f2ce22d9bd60232bf5e35309282b78333cf08f89f1f36cb6798d2fcec6bcd7c289fa52f7ca7033583040153e87e05e9f0c624b2ec045903eabef5aecfb3cdb106630388339c45bc2f86b985c35a0a00f555fb54157f193a8819df7d3bc82270fbd96577a84840ea521e2584425fde3475065f812c7e5aee355ef239949539a03991ae51a61db93e2680d1f5a71fb11f59f9eb62b86947cdf112a1b6ac6eefa10c7b2898289bfb549d316a3a43b325d8e259af0aa1aee54430d83290a8eef0b55a67b2aa0fbdb87d26e13e8dcc3b9caec9cedee5ecc7b255e4dc555864007afca35105e6b32baf305299940b09e82a6bef645c3d15192e738f9a067cb7bd07866e8c366eb6046f4c97ce9436b13d1a9d427176389c308ae70df06c86660d26293e452c5ecadcd752c390e1b56e0760edb02dbbb87d35c7799217ddbc5e4b182f40460b3080de22371d4af2f941898bbac65957d48e18c399c554b0b7b1d654290622f9ec3c3e0acbbd721490e35455cfa3575585402836c7a7f4f2f26d1925e57d964f3612a4836f42e99a17e3c6c4c5cce7e3b7200e8b1388fd9f88e52f7e74a50ed90a6c99a90298b3fb50f74c5fbe984e541f513e694f73c131afc9fbc780e54dea473d889bccbb9cd44704c92652bb7178ff1a98c8ca294a1ab97fc887a99e9a178c993ada63861ee9600756b2a28e9cd0c2d7e48171bb85934a7c87cc46b84a5a1b56bc585bf0a2dd2608eb0a1b2914545fbe2f1d8d924f98d7961e9f1f0c79bd6d56a31abe34925dde4032e23503ffd3c38a9531bfe39be9304806bf0fb6e655f7dbb570d2e08a7b694f98fe19a771985864d3e9b82f5aec2f3f9ec120695f87ec5f8b47567f1e1862826a3b964f0bcfa3a6864aab4ab247bdadd2adffb4879e343c2817eff8520aaa7200eae77b9df75e1dc568021a1c222ddc163159eebaa0b63870c7b201656c89de09acc881dc8356815226a18a444f0a12af8aefad88542b1fd8b6f6a0f3c2379d5c3329622ac6670ffbf87b4c8ac9b53cf92ae5b3625328b06abce7f4e43a18e23ea5efef205aaa958c4ee4d398ff06a9bc27cd9746c25436961847f6595a6e101a9c138975771fd3260106ed11d84dc634cbcd935dc96f7284b8b1e195cde66a04a2c3ab9f513866d396b7a9375396cbd66bced0d4f134fecb18995ccdce55b0f9633773931ec7d9c3d33bfac195e1e692ed615f0b736e3883c22a3b2c39bde7e979f2056362717e8f59910622670e61d505e633c2cd99bd997ee80be9b7854f64cc0aa17ccf0686f7f389f8874206212e2f3a7d657e344924f1ddc81179422f990c58538cdbdfa0fdd32a0b2a487d170ce57323f53eeaa663bdda75479e3a8d2ae523d1d8355e3b300a2778bd1d6742993c9ed9eafbc66f62a8a0b48fcae788a29eadbdff94e526330941b337183fa7daa8502754da7746ce1cdd1be8be82afa61a8b125b52235e3ffc78fa817078a706fdafb6747242710a566e4489bf23eddd17f83dfa7b2c9160f0bfd4f222a54e2658df02e3d001516f0d45deb06f6522ad2f998485ed3383e67fcc921064b73edc955d7ee14cebc6636d388bb385c72687cd23a05369af567f33dd5d15b48cdfbf6994c7952f7fe41f8334a408c284121687c7f077901d0543927859f45f3a6fb7abc636cb4cb1ca2af0a8c7e51d68707c69579f33cc710681da73c730f13b99169e51f370b013eedecdacb94900000000000000000000000000f494b661ea13779d4446edd222689dab4c03772cd0437a1ff2ffc6b710bb7202338593fa38ea3c4eab2a43a7453e9ecccb411bf1221dd7a589f0b09557ac741e96d761996cdf219c639e7a99cf6413e5a87aa27bbd5504d1143c4f1b6581fc7f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c5d4b296feb2efe3b1d0e71c43c22c19ce28735c3828d71da3d77454d5b94cb71ac96644fd9fbc3184c09dc8567b3ed2c908b20341606df67f366183cbbaeb79bc6bf3dbdcd008abb07b2d3ec73755e93973c5c696ea4f348414f1803facb730f0f2bdf00cb6c64f51ed6feda617bdff9eecccbc42b4236b6c71ea1aa35564780203a21ef109e2efe40bb2edfdde21987ee4ee5d0e3fdbedc868d1bc5648cdb97c030f29adc77c2cebb3e8b8103ed95b202fc2e3c834d8bf9289b86712969de6b2380a033a76fde285785750b9dfe91db24cdbe8610b06430d151bb8486565eb9d48a82d02ac34c52f8e67ae8a52218e7b90962d4544c59ca3e14e420e853078a9941a03228dabe52594e9ac629ecf591c5a06eb81baed2831d6782afa2d876aeeb1a58403009edeb5ff235ea00d9c69ad7d3d2765e22ced2f1b2a2c9caf26bee3b80bc53b03170b03a0b8140bf26bf0df3cd06b819ded5a66d3ae2acaf7cc25567ec875e56f020dbb01d8dfbc3a27917ce7ba8f4167b2e7d48ec5f848e7ed4779458078e6da210325cd93beb1ad4bea47917398f6f90118f5a3d8871c9e501d80d9f2dd444e8271fb72d1b1a2207f6b0686a46d25387d016cfef0e7e911f97f953d1cc6a50eb9b77ff8ef37b2be956e6e535e01564bb80ed1f9032e3005484f78a0712cc8f770ede56d30e9a24f09e40984677bd683c81b1a2558964bd4eb0072318c820d3f3d54962a961bfdf2db88c59075706e1f090ac537b4b4ab240b0f28c3b1173dcb4e3c86b194b170a143e0bf9dd6c89411160008305f73d979dcb172ff910e2ce55515c551c0ba75a169c8ce07944647ab941708342dc61b4e77ba80054e1950c09f0c75da07f54fd362fbf85c1f9e98f96ae3759fb580b27d9c759b6aa9e7714f046cca08fbe0cd0b67d5992c367abf0e5b9c9e1cec92445958f8cb537c0b0f3b655e697cc51637620e38885c7dca3a670162ca11fe83e1508a3eee2db45c0acd4328539e045cb0dff487b14807db966913f7124ce7a8005aaf655174933a66c218cf4b67ebb0ec22dc2c73173155d6f8ded29acf14785dcb0d9a3811816c3f80cf89f0662d0b95cca798924fbf014d7a38403b56ebb62ad8865128e5786df86286909a3fcb33769988a6b1cef266317658c2c90b1f11247114b561b08fadce6b518ca47dcaedc61d1c8d4bfaf9c0559e24805ec1dfb8828d031a03d8d35dbe15f3ed4e8dda8171ac062262783d34d344150ce69b4f579241c792d22baad84965d79cb91ced002b7f8141225eb50e966ae87030790a9a23bbfc5bcbbcde6b211f5f424b009d83121a23b8c7002197114304efee43a4dc4787c1f8503df4251fac38ccc9f2a6f4c23848753b8148b954cbc504203f8aa5683f100a4c5173f7a6d0e993ea9216fea55bc61ccaa818f9d0a85ad237b8c6cf9df9ad689bc5bf344a8ee6ce446a699473eba123cf959191470e0d0e6afa3fc38f497cba2c5e2f0126fe840ef8735530562d65763ed23a8b6748712029d5c275c889591e2149a0f85017ecbeed813b42ee485fdb58272bdd33f0433885e78ec2764c88e420f03870534de20eac56e46c79ec5f57bb537d6c9878a4785c6a3027e5e38c58b487a08f53ed69dba32e85d9fc72f5e43d3bc683079f68ff700c3f885b3e53da4bc97893d1e0af39addab5c0a6ca115db23abd40763598f1668a38763e5141fda3dc8bc34b98252db8f6e9d526f555f5ab80b3c0d53e3de3be8881337b7bf952ed8f9fbc5423cc07d1fecb8ee3f55232ecc5c70c2f8fe843809f8b89ceacb107199de5b4eab4b727048c1a9ff98de41fba830753a802adb5c571333f1d976b51ecd9aeb7c11a9d859e3c4550b9d566eece4efe00c7044224e57b28bf71067653036e9fda89219d49da4fa5530e64b1b89159e535f90f518a7a36c8d3ee659900bdbf22b1bad6cb92053c6abd51120c417494a25f98ee9664aefdbc4f273aeb8dc32cafb2acc81abf476190cc0ac04ea3fa60c7499dc47598fa9dfe2d4d77dec947633d3c0e7a50c91a0768f5bfd8682e0eeecde6dbed2a1a672d96aeff9d43ce2203ab2fdafac3f94e569683a679065a20934f6176b4528268dffae064a2dab30c27624af9a6206eb278faa8084a0ad82a4b522bd2fe7f9e8222ef9c855c5519f52b3a8a9e832d766103461109f237f1189b6ead2fb7581b68b6645705b4b100fde1b7e93619518eb6454fc716401eb2ef46b02bbae38ade5275fed669b713a3f1c934f6997ca51c9d375fcbc0f2299fc9fa5af9eb102ea250f018c18317f0fad8d9094e5c2a0690213d94a9c0086eef30b7a79156e49733d3519140a60564704b7e0a6eff3945f9db966c387bb9bdbe584f86e1d44d8d74a9ba133db9078c6f69cab36217ec4530b81168191b0a1d15c81b5fc75ebb13254a06", "52006a6a63005263", 1, -689221829, "2a046e60d198efaa156c01d76c0173e4e7aa661d59c65400e0e356902ebb49af"], - ["856d632b03d97cc36ca833ba6c6b41025544f4026a3183d1cd703d694f8a0dcdf49a8f79ae020000000763516551ac0065ffffffff3e5cc683ff548dfe7c75f1116919d94c6ea33ae7a5485230fe1882b8a15157cc010000000853005165510065acffffffff94fe1dbd2dd303b9a0b9bdca91a9a60e570dfe045430e1a15d3eeab17820e5aa010000000153ffffffff0285902c03000000000965656a636aacac5265bbfc9c040000000008526a656a00510053b8103a5a00", "acacacac", 0, 2082278063, "88dae8242e5b0a78d45f10ddf95484dd054b54593a9d628089fb4e7acd2780ea"], - ["1ea2ed0c01661b35c43204da609fc7f20a8b13375306b75a4ddd7d3d237926c64b29eb5f710100000005656a005251ffffffff0437659002000000000100c705590200000000056a6565526ac4159405000000000463ac00acccec2a010000000008650063acac6a63510000000001bf888b0300000000000000000000000028211d5f772cc74dc6d508135082a3367bce010bfebccc5bf06f7bdd289bca7f24844b3f3c4488c580bb0fa028e20628948fbaf90e882b704b2925b05e00a3673dd93548926a395d94570341a7915006394beb7117a93f689c0d520fcf525c84000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007c0dfc344408b7e67889b81538578c24bcbf6cf56bde92f093809b8a819a642fb3d6b44ba007f806b6447c256e63fea0de381b787a7df16935962df680a0e26bd9cc3028ca6caa9ce9402e2d53b8071aa187e330d09ec89db39eca446a47a9ddebff76daf74b1f4cc49c5254cea8921d491b9d0cd55330aaf941b6047cf272ff022672efb1bdb703300d621eeb279e81678c3dfa04e176465b57db3b327d37d0450203befd08198d0563a1f01b94563196beadbeaa08913bc55f1edc37e234e78c0b0a03504e45e7d8cdbf01e9821fa099d9e0c61efeecf94b442b9190839babe77b32da969c75dd6c4d2b0959d41e43d988d8157389bbdd75891419a2cd36d8bf7f9f031de299bfb2805bd2f11e1a396135dbb2c6f0a2d1ad236e25073b2af15bace7a3022940a1e54e558683e0e8585ccdba300a5a9daa6bae7223a232cd876534ca332702067abc6d02c4c2f83052ad867e51d994caf0dd2280af656739f4e75b31c094f90316348945ff615600913201d090d9f6de671d05add42de8a9d42a3d9788c508870209d0f3698278d8f996fc6a4c2eab3e7d1ff29f32d021ecdc39e51a690c86f395beadcf940ced64e760e08bf37306b693812074982d4e99c42fbb4bb37124ae9be14923dcde1443a80957ada6d78bf165737da372e4b91eea77256b1abf4c1786ff6622cfa2f2346790f24562475e7580eca6c2f6c612ebec3dd9a60fe67ddf7ee39c033884fc5a3e8aa4d4d2cfc9433a1b23283f0fbdf036b57cf3f1ad1b3d2c451e8eda8c4e1fe6263738df67acd4484e497a64940fa25d8b15598be643a6f9476ad42eb9af421ebcace1b2437cc46b7c9e804ba5d4ea254057ad866668385f77b5e8c582d38cbc5c186f26702d19e277fc25e36c14b817d7725fb6f11545aff38f04888d26f5a557ea59e24d40764599ec5d0612061e209932e41ac89ca9453036c3220431911b87d082b802dcad040fda1335591dbcd4962f951247049c6289f23f039732517b0f07ddfc0698666789cbadd6c277ac6d13bd4b28c596c3b0788ec278a138ad86cf73a517a005100f260d54a2f2c16ffb4485bb9d5b03237196f6b4f5e6a0c8edb04131a2d30795e32d7a380c6557e6be7b8aa087c0e5632b4fbe623dc2ab91514f1afcef21edf2a09fe15dc994770365bd3a291c6b3fb673577ba26ea8d236e31f5a42c508c87e2948c26ad9b1a8941c2fc64056b1dfd171db277419dd8b3ff624ee144c55507726f81229a730dd9af2c590c2f1c5689ad403f69dc93e90e48253374e337a623ec678deeefb1ab4adf412e50f9668ab5bf4b843ec205d4aacf038537c8d8702122abc27279caae6fc52f9465ba9e200d5e754aaf3f9aaa0286a5d7d5b0f58f6d8a413c82471fc27215ca98ea730e7bacb41bbae29e2729c0cf470e19623f76ba74593fba2fa138a4b5d7e1b29d4de134ff9cb4f56d29563480f8310e480881c8fbeb226ecaba806b4ca6d70edd79a04329d914658aed2ce210085a6f77924461eb48ac809882195e69e19a663eb70c2bc637e8b7db010d8191c9869467de76c9e0dd74df3fd5dd84a51ed4e6f7a631dda66cf191589b02beae83e3e8714bc543c588c9fc507e00ae7d51c36804df1909f7ed148ff2e396dc400b09db61be8b4f6fcff9c2d789cb2a300d9165db553b80f52723b0b196dabdaa3cf958d7b0228a33c8252e6168311b6de16ac591c6e3510df1659df791ac7c1161fe8e6667988c6078b32aca8389ee4ce45c59b9779546cf5987b40af497f30301a2aff75ae516a3c8162a0e55e2b7c9226624876fb3006a954d428294fde309c3dcd68e67dc51dc8701e0177531b845b5ee4e5537d1106ac447b97581687c87cfe5af439d1f00de2bbad8c612f5054fe12b295c35644ae32ed55212339f61fabe2ecde69d5f16cda2466560b21e921742e205e952ce327c0ce1a6b6d87d5d6eb51e3da64a39b5b11ba2c0d8a9f3d376ff1d86c8538f468b46d42b2697ef6c308b7177ca5eac46d573e793d5e367b3e92e58508bee830ebabfb5197a98c7d3bbbd7b68b0734f6c6c4ed15f3f5185b20770cb48f7523012d75bea72fbf4ee242495e90c1955ac69f3fbab6d4121074046c0e02faed77e79e27ad1bd61574c0f1f30c444b40650c65987d7665659906214ad61e5760014d5f48392b4ee8480c1802b6df5ed07f6476a1eae967199485a64ef9ef3d6eb84460fd471817620f7d584475a8053173467f7b2fd4482f0c9a46d9404dba369f1ff2450c78078dc6d863558ca11a5fe0a3db81edac79637bb68b837a2beddff24edc81fb0bfa3f7383253383bea8b2294997486b94768b584e45f4677ba708676d0598879278c36a79e96a96d841cda3c78dbfe15265f9ae9c1cc0b26c0622f431506cd96d41d3802bc2dbb21e7151c1698c3eae00", "0052525252ac53acac", 0, 449901703, "c1271b94dfdd97dd61a327e1e80ff95a2743bf061e389c5ad7699f724b734d40"] + ["raw_transaction, script, input_index, hashType, branchId, signature_hash (result)"], + ["5e02545602a42e82af3fd8936275b73a1b2e95b16efcb885f5b23e70dcd6ae44f5f564d8e6010000000151ffffffff05686834c6d7110c545e68226396524c4c8dfad397ed0f67e42eb2b1bbf24c8000000000050063655200ffffffff0294362d02000000000763655363635165275ee7040000000006636a516a536300000000030000000000000000fb03fb0100000000d3b160aaef2635faa7b3122e98e83903491b33132ea78b17e9757eb729a38565f5c6048f3fca2da6cc07e8b32f5465eb8997b56bffe8175093b6178cd863c2752cb863cb796c49b31a09be62f4210047fdfff15d3766cc68f9ebc950e09b67d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b28ed6bb34bf780cb3b811d182a5bd0c75e6678164ce7449eae980663567f0689be4ba11fa60f11dc139aabc314fa8de020614b413841cae936c18fbcc3616c9199b6c6074a84b7033556ad9c5f801efd7db1197e56226f7259106f6d6731b7b05d1bc112b28d810767346370413f61d79f2f1dc53b3c6ee2275aed7a7f3c6f0300a76add3e9b3a684e73982e9d5230f2fff8ff17bbe49030d18393e21f40ce3002224ddac9caf554d35c425499dc5e23255a7b9e0b4fc2bb044038f0518ab34e670b00a1901a5039ab77320daae1699be7ef86c4c8d66c0e207e4887002c2192da5fa2972556b99721923ef1e1f5a2a2a85da869a646757cf6ab5d3ca855853315690301a1eeec8dc008229563e0e47d369702171063b2381a8db3e4370aec393ac51703090a0f9d36ee799553de8ea8b1094306c7a283fe0af5dbc3cf006421ccc7d6a4031ad4e2e1823aea86ef158466dd96623834fad58a14da1eee0700876fdc1a10c202215205453c17e709eac475dca2402d938257bb04deb5bb5603526b2586beb3d3032c49e1878ef86d85e8c105643b00ec62f8485af91401043ef23ce98fd30cb3eba35446f2ed41b5e0d78ef956d6846054df74d2093fb45458fc992a5745a6d875c72effbbefc2598e9677ad5b1ebac30c0085f1a0134e3a8ab7d56031239319a712c2814bae373e1b3eb2efbdd7607291b03de6069603cc6b394eeb4d8b86a170b6fd2b988df634a6fae0baf87cdaca2fae899f698df301cc05e262df4e83771eb03949137ce255642ef450e113398d3a5e467396de418bc3403c853e22131ba475d9a61afe21c0dad09268ccd1cc07e0c0a57b6a2fd86fd8b4aa2ec875bfbf9a5fbd1e5f4fa39312b78f303bafe070df2b0a7edcd4bef2ab9bf168e635d03ee81d8bfae91d5c283c78aafb32362f1437deadaf56aef9ec2e98ed3a86affc19b787e70eb5a7524e6379b511e04d16ecd037131de224a9a60c976eddce024094204a4d19a10c56fdb227f944b905a3a6d03faecf73d04e37e7817fc4391ce635935cdd168d204e4d8e72af0ef5a3fcf27461c6c8331d8352ad29e0355078bbf6cc51588fa2d2b4d637a4cd1d92de2465beb6c1f60135f46de6777a6c190ae304fe7b2560c73350d0120f65c473920938e6a00514307e543fcc3c2905ab566a795a53035953ef914bacd850cd6200b447545685db289fe4f5536f0b0da00d1120b0acae4ad611a4074dc48c77d24106b6dbcb0bce96bf4e17455367d07a219c8b4c607cfe9c3ef0e9f14cce217f15d7f8a7dd256848dbeebc2028bc79a917cb64c1abfa8c576ff8c4036faa280f5c82c4d91c8b40129f52e8f7597e47827947a29ffb83d1740be4700d5c2aa1fe69ffb6681800e87b30e7b51b638e77a10ea70f5711037c2449245790142cc0cc59e1bb61f33ce1a818305851e878da7a953ae0c4cfc58635a00e8e6b0b049b10be7a38a23d396c2a0a68bf3671fb8bce8ba1a91306edc83addda1ea8fcffea92264900a3d11c0579160012373c274f43c4d5796b53fac8eea2d75f68bdbc673217ad643cb717e016204deb946bf9e9cdf4c5c88b6f88fc546eda8a8d5e1cebbb5cc0bdd2928254d2af481be9421f85b51a31b42d63a286c5e15a7b67a6541078baca5f30106352134eaeab8f79b8f9d7fbba7da5776ba0b124bab500c06f21507bbb71ffd435e50ddc2a6f79bfb49ab95ae06231ea9029354b628a4e7b0629053a84827de842a98b4eba9ea71b07839da5eb3a376307dcff613047837d79d175e5f90179329a7e3459213e211e341b20fea7289ac8cf37ac58fe6285df5cf44c1ffb2fcc67dbf04ea32cddee1daeeec57a624b92aab6177896fdfc3bfa6b1605bcfd0da63a1797619e55a7322ebd9613e0d2a86c5efbdf31b645b96e568e3dcc6df1ff6393843ac713e974278eb196adebc2b743bcb931273ebd5c8fce626deffb2eaccda7ad47d8db91ce3efbd88baf738616286c24bf85d641120f93c8851fa67ee1238db7b9819851f66258bb416453fd62a936314766e1193b28b34010df3725d7fda1d8203cfc6f86f9692e5f8fd3ec94d1cea15f6a583ad83b4c1fb4634015fa1df412e381543d257dbd63ba201f18a7cb1a96121778d0dcf7c4209c48cefd3b26e564db4dfa2c5cc2fa9092cfb8e1189bab2f11fff63a438ac4da0a8f6e4065a9d03178c923fec76ee46696d03329c6ee80a2d97b5e1901cd0d82f0fc447978fb0f1ced8cd9e4c3fe415339939ff340de71aa9aade485085720703014dccd00b3174fdab7fa010000000000000000000000007ce00bbb07e5b60d2ee577ec384b4254cef5d425884b81635df16280d2f9b6aaa6d73c505dbcb08ef2127523ecbc480316a0f802349d1d3be330673f4f5accb5b7998c809fc85a90b76b418920e01b80020d79c78c6d5187a1559c60eae1958a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a921807fe33586fb63c519c2688e90da7f1b7f6a8596afdcf969b0d8e63317e82611b5aa25d6481531831c95107c4c3c05b27c0714ea26465811529f420ab024e601c54355b743395e43bdf04e84d86b1f6b6471969a0d44aebdf096c2d03d53a062feafcfab469d5b0c00fa517643268443add1abfc11e9796219de30f3d9b7031b6d8b5296f09c5299a2c69233f5de31879b944a6197d9b333650b65abe881e103226be708b7b2515804f43d43cc4c45afffe84b9b6d55bda0022769f63f4dd5110a03e9332dd41941b23f81fcb65ba0d5ff783b0a76c2d8fc4645f37126ae6092aa47bebdbcd27142558da38a3bd2ce67f2e417e3e46b484197ade40b5cdabf278d0303eca8be15879936c43709534c6f2aa253d7b455865764c95fa94e903db23f9a0302a2fe2029523efdd366834231bf54ed6ed9ef12341ab9244383d898e52d9f66032bb09927ec9b6006a13230cab1eb258bdaa7cecdfe06730e808c6f482ea9e0b7022605f3255c79b05e2c15e05b0651637533c01b7e6e83a55a0b4453ea0547677b0217dd34c4f0d6af990e6b274a1736d02d18908a747e531f86b393bdbfc620c1a23065608ffd29ad1287429ddb43f7a07f10f83ab9111f34ca2e9b963d6283b7e6b58dd072d35b83d982fdb5edf40a348f721d1c6fa12fd8a15bd031b67772c59c3a2de9ad6a453aeecbacff13380fda027d76a47e668db158a3310261d101cfac7ab678fe064004c8ec8796443c69f5fab401c281529e5a9fa36d130352f27cc3c75323202e47158f81867e54a573d0d9e8a88eab0f07302ff80dfd7b22af273e15b4845dd77261ac19b755f7cc3453a3957ccbe70e794ad30f638a8fc72015d39db50362132933d409ae1241350a875bdb48e8f474a34321c63fde94477f4055288f69228b2c2fadb91b4aaa3cdd28b134877487ee086f285b5b55c6a950567d4402fd2650ec0a92dcca505aef33216f03bee0cdcded10b0e68f299cdfdbda997a6fb279bdf271260b9c3bb74c288814ad2fa4add4e97980f7d81d59f66baa47ba78334ba96f001998a23301308602286c45f0605b34da60585823738e485da9cd7c513b23680438207bee824ffd8b67874a8caf8952f9491193ac0e879139b84c4f927d2d193a7d97efea788bbcd10a8f9e6919ad0009aebfb025ea8d2d5195f8d17cc4e6f7efa2f03be692a2142fe8094aa5bbc48e21130fa1da243025c14806d87f65e1f1d5ada0d563a818747669ad75f9f94b83205a9c8b3f1889997dab69ebd7e872658d9d76156db1888e14d7526620a93fdb5134ac764ed74cc2a27103589c153203016c30eb7402b43ae139df5fdb63d8ee1b29e774f81be2828a46c07e0d4443966802959ee66c0c2e21983047c8f919ad1d359856f93d25a1734ed89e92b58dff8c064ece4261e25558f63972bbc5c15efd9d558a6ea8b4eaeae37e9e5ef6686a058fc0020100f040f0be9450b1b4a9a250c954a854e49fb424f2596256507cddcb8579371b06a0c893e70a663e22c3afe65d185cf503e899f7d85259bc4a14f44964e00392f929034db8a5fb4385784217730c60edb7588f9054454c9c158f6de3d7bc12ec45ffd101285835f0a07f15782e95ac8357ba3258c0e04d1a5560e8571e293dba40b55438d11395303e64c0b160a36a62458db598e6ead56d7743785790b25e8c8c55a2cb911e7727a5d506abbf7a8fe8fb66d59e169d95f32bfe5d6be558a6111e349ad4eda17d35e71bfac80b663e30ae5d1c7f6ef87496c70e16ebcc64272ffe26ed04ab97b3c4d338fb1b7d69b33a835af54fab029b77c383f4a0aa530d397e5d5b856d7b7d6da12eddb6887d48bef4f9d4134b692d0b861f12f579f91ff508a4d010fc012a7f926a345831278ea185f2fe8897f2a592102018ab61aca9c0bc8b90c350e8d2ec91c072774e97a3adf45f84bd207d49a55f5e1cab64e6cdf9bbddb762f2e5cc2155d5fc59e61ebeacb1911ba2fa238e4fba6c90c78738d42518b03cb064de43cb88cc14b845b4613a72ccc0417a9aa1f2968dca04d966b07e8b04d62e9e7d5b7d4bc72beca54d29e98d06004a5333f29c42c3e775ddf551267003617117ff60bbd190252e6c597217d44ff7304c88f76e6840ab9eb744c56214b8865af80547a7c0654c1a4eb3ce9dc1338d2f6a54a4bb4e451a62e6ca39c85aa8a1f0edc1257495bd01c63a467de93b218f0aa9079a38e1c9b8c7e480ff79fc1f8cafc7dd120b12258c2379708d1a24e0f902e366b3b2e1298a3a2d4ab0b4f291432466aeba000000000000000070e86204000000009c3cfaf1a3e3b46eb277891852e89f29d05193958131e648dff7798a59a72666a567b5b02bef7ed7f05b726f7c053f4168ce4cf89fe7d4d8b8fcd3e14ffe8da5fb03c281823de6190451902fec685b1469ddc4dcaaf1de4978bcac78ebfa492f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004fcf01b894237e0d38fe8d1c3cc9eae05f1675288a49078fa103ce191b442829a169a303da551e70d3b545dbdf12dbf30f3804108690a346628d48c571f3328f815b5948361b21218a4d5e91277d421d7e182fe6bd21c1e6a253d36f8ca25452e8da6ad405a6afb5c2b5e0bc8f36cc71dddf3572c47330a9ad3be3c36983509e0325ec7c0697356382ebd46b43606c961d97e3140ea32e08f44e98169a56e09acd022fec03ba9a310a5088f235458942261b38fa0e53ff65c8754f11796042e4b3ff0b0141eeb3e2e9b6a24cfbbf720faa7f36f5eb80f0deb2a4180c6f6ae9175134e32aa02ccfd79a632312ebadd799144f7835d15123ecbab5e2b37d842ececcdfe80308b5e853cd10f5a97edaed9cdaff245d756eb183e38a4f1e318b194d452dd3e503067307e9a97ef8be76baafcd2f3716b3f89b9d92ce6f125dc949b40a5628cf1e0322a81be11c681ce9b8ea0aa2ce247a0289193774259666c461991ea7ff7aed6402285a0772321937f77c1d33da5dd106472dff9d3b0feb8f03f48534f2b4b01b530214207b750eb01caed15c500735ce6e74661b80acbc60706965a8904a924233d2a33129f019f713ac86f2d983a26c9e6d0e8ec1015b007751b68779d54f09a1dc59f7b7bf98d7a47be8362596ccdc58fc24e1e5822e3dfc59f23ff22279d63b147aae0ad982a68a29f2727352f77c6018371b99d30c7f8f3836aadd490e7aad7e72d3c88e652a9c3520cbdd034f4bac2be4d161104ba9cc162debe31e78e80d6170f33383b484f5aa353c1a3661590ce2147dacda7cdb0920952e108848949f15f516c7c4fd5a29c75ac566efc0661402a7d81b531f5f5f84ff5d07e683ae71d4d9057ec2a80d75c8bf0ccfa1ce2fbc9816fbfb579415653a8a431a25c43715e64c8140e4a6e5804363e33c9bbbf6a7abcd9cfd4f3f08bbc0b3cdf7f851282139ca5bfc4a0c0c49a194e6b4240dc775f276dd84de5269edfdfe542d90dab73df88fa6bbcde1dac6e5aa686def12c3a2e0121df9c2a952003d094e2a75e0344a0f573f31867596043a98bf9e2b5498960f5fb6155f581c8481247922dc8877983a19db13cbb9170887948cc568bf7e6de4043a14710093a7f63481c1a4ebe5647d482762945b140e88d61cc0dba67f65c1b545690fee1c4cc88d3b9d782d0abe6283cc087e76361e235687a964f796bff1db9645309ba86a67cee09be34385c16294061f529db5f811567e2f7cb12d6020e8858499ad26f128336dee84704bf2e475bec2303ec2c794289142c35aae2b64f9e966790be70b0070fa69bcdab086a2cf89147710da80196e88fc13a9ac597151038479d7ea11c43cdc6da8417bfa23db4e6ac18bc64014e8e534d2470aacdbde2d74402a2ed4f4aa0bf640ef19a0558afad11cb928c7df60b4ed1e92af1d493dfc18d9f7d00e6cf15bddace4474094108d412ca87feba748b5a513fb10bc5a9bc2138863ec1d74f7924491e8fbae12a604989841590542c11304770f1ecd074df657327c351ef43202ad6a4180bb6f666ffb38ac81cb371108bf28adb6c52ba850d1913ba0cb2e534659ee6a21e24e542866ec08b966510020dbd9ac42d6a28bfe6cb745d391df59f07f72653a087a56612de5aa5896d1429fc3d939d52a40c601985ff4dfbd9112ac6f07d4f6fd201e6c1b85f87c630b8faafde884deabc5aac3661498fda080d219ca9b90e4c2c3692eae13552988a00122316782d2b22866f6213484ce46bc4327a02371d8b7b14b7cb2015ac0e21d3bafd60015a70444a6c167aaa735d0e2c51f84eabc1ee150d8dd17730a530325e65fc6563cfa6f9150098365ce7df399a8192bfa24cb98932f1531f8e27406a7132f6fadd4e121b70376d71b35701738ea2825e681b688528dd28ed888174320016dde9527ccf11d2656407fe6a0126651bcd93991f5857c7d4e7841825aaea7b3384586af5ac08f7f65e628a9a6c6d69695d2021e510ac16816a6ef03d0bb26fba75175554b9162f921b57d4b947efddf85d44863ebe0b665ae25b5a10f5eb00c9ce60da99b3b7c1b96bfbbfda3c906bdf80ca641413b4c6d2279161ec043e6cc4252d46b35c71880ea89935b76121f5b1b86f1c0c14b1bd9544ef96a245c13a3c35eeb48c0d9f4a41b9a8ac8c2862176bad611c15684b36cc195e19e44d7f11e8ef87ce6ed28036add3f1ff0ee2c8a216af64c67205c9a47939e134650d5aaeff067d0b4882492ad582410b3686925623ce11db4ea980f3b42fc71f70d82d367927a8c9d8b8b96fdeab1e892041df82f408220f4497eb1269d36221a28bb90af5fb2648d521cecdf9da5e3550801cfc9f2e00c3d6cb29547f155b7a4402fc6608f7f49a72f26f69e79b54f54585510583217287d6f93876690261be557e24c25f3ceaeb6adcab6970c", "5351ac006a", 1, -247645006, 0, "8794648044a3bac0a71b8737bed22f19e699568139dd27314054c260a3dcfa66"], + ["879d372d036967a0ffd4918ff17aa3bb42e4714b29b995f946c13fd1c37b735abb7fe87b080000000006006a5300525263cbcc6b89e85625570526100c5fa8923fc33c8d8c9d00faa17a7c475ccee261f220382c010000000852526a6563655353ffffffff1970b089387d0d032d939401b8b99f4261072ec65c124f5ef3a923b9130c532f0100000009516a6300656353526affffffff017f9e0d00000000000753ac0000635100f46b9ee4020000000000000000b7231c03000000001e820b299eaaa5a849806fa8cd61a3fbf1f26a3f74d55adb4db131671da6bbfa511b024f38f783419d63bdac7b2211a4063127965ca76a8d2892e89ddf744b19e263a39c8a6b7eae84edece224b0347a8be75c284e909748c60a06b25467552e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000059a6fbc4a10352a91184c1ecfe2e274a64de5f0bacc21756ad863962b8509297df16ad82cbb737cd80cfcf993727b91539f27a205c1ac859e27c0668ca2b42bd4a37f00b35853e84cad3433d9df0bf61a51f0e48588dffcbc01b91690494ed342ae21d1e0141eebd06fac4e875ecc5c9bd4a65f5f5df80e28d0ee6e649bc5bfe022c995ce0e929f99ae7e13551a75e79899f6576c2fae1383e1c60abbcbd0d33b10318d44aed6a0e707f0591ec24d660bc060d95b29e16d59190bc51e0f136dae5230a06581c365d77e084c03fb0114e72c7edded26fbfe1dbd38f03f7a170fa91f07698491efadc886f0c59d0c76faf74b89a0277f3df18ec83b33a5cd975c162db8f0315d0d0b934485fbba614f46bcc77335bcd69a43b678f8fb7b9679f677794a358030b8dc6fdfd174d991d8e6edc02423847006106f9694dbca8c7e1ac30dde89c890305b7e0adade0e530dae3c91c15936947732c5a6a79914f7405156e31f5ef735e030b44f5d4fa009fcced4cce5163ceb74145298d42326f670f287708ab9b797fa10230525eef2590e3fe28ad0182b3ea0d19334388e3bcd41f372c654ac52fe9c3a89dbd9ad688f41c0fe1cdca5cc9dc391415de804651ff50cfafbe8b8383e6d006a90eabc7c893a242177a27f4d365305ed64c8f8a0a5145b866713ceb91acb1b05551d7179c036d0b96084610dbc292a0f5ab55174fade5ef51d87e32daaaddbd8d335ab5400b69da78869d05a6bd490b9d5cea0b216937bd768db024d8fce52bc34faba9890b489836021596c7a8211fdf8609e5d19cc0a08420821f7c449f4c9fa85ab0dc7655aa396d5f0b20d62479c5177013beb56393a86e0e9df02959091f3ad7dd48c6345c7a5cdf1e404d9f6664d70988f292335fca0daced24f78c815860d065e9cf3a79989cbd80355ab8687a950ee2008eb7c94669ac98c53d88637a1c6f6b67e6dd6606eca487b79f562f66111a0d7f5eb953f727b9a85c8bff63a2f5ede403763fcd72e0a2aa6cb0ef56e8ae7d3f61df683e38b76956a75998aab82f908c2a25a438aa703e6b4756cfa94cad34de03ef6c7fa87e16425d53f350f87764f861212e549e0b5e3b3d4a66d17069410d3f44bf222a6fa475b35f4c55cf0389fd9e5d60904715c889514fca82d75cf2eaef1980c12c84f431cd2fa28be53c10b9db59fe821fa970ace9b9f737b8567d2fc603adb671c9004ada53de23c7de612ad4ea789041f53f890e421026333e830c4893ef91e9e855e28ca8c5e4b288e051405c86c79f860a06bec8dd8d57c997b96322fe0ecefa5c499e6bd61554466bd998e6d64e54d5ec9c9816be71952bfb09b9d2bbac61a0687d242e7570e816061529d07dc1c320fb534ff4cdbbec858f5520701b101429cabb8105e33eec79bcc82a8c5cb077adf11e19fae736341fe3dd0c771e88939da0b6ced5316ee8ecf9ea509b81ba325f3458d9391fdd048d34cb8446f15082f45cb0e0004da002b73fb16eef70981efc36706e09c5446794ac6e7cde22fabc7a72b6f00231778f905bc3dbbe700914d073116807b09dfc87b2cd3e5fd4b200249fad95db90c548cf97d2613f0d6940e9fdf11f37c3cffdd319f168f4c26b9d13fc45930fbee831a86d68cf2a4be8c2fcd13783d23d3a79d9b1486b33262b544dfbddee41a0bc734ed0b70f7a5240f4b536619d5ff87afb8cff22d09051b9e43eba16b35657ac0fe345a87d31b0330851fc0d29055cb0177e6ad4ff409078bf1d54978e884bab3de195ab9e0a36ea58bad2b355b16978f2b3747ee52c827b4933cc8d6a38e748c4e6814edbc06660fd9544fae70e1ab731a7b014197f281838fbd84ec441251b9bb8bb4623e7f8f273708c2442fd6d2e88d3c1d919f5e4f19f02e24288ede5125ae968591239585ee7e9b2f39198f62b953f8596b4d312145f543ccb5d4fa1fa945e51c7e59a4daf9dc7e5ad8b37936ef5cb0abce4f367db60fd774e658f5176daa24931f4c40f63e0e3d7945bd316ca4d1e6c789ba2de66ec29272479c2e4e0201dbe37278e4caf187ebb2019601f2026104ebf1c68ee400be9195b2576d66fd57573aee0485ee5a73cdc3d0e617a77677d2a497a7ab96ce158dbcf93c183b8dc356ffe3681c4508379279e4f9e20d1847a7db5da5b250d1aa437a1c40ffdf24a5fbc23e549ce582fe75f8bff187ae2faf55e916285c1249a137decea2830057477686fbc22c107ca9235fa4d2202fbef34cc8066fedaff17b9b7b84312df35ca71603eac5231fccebbf83e7f7407c76ef2416c4c010000000000000000000000002df80b4375f5ad04e55fef9009bfe9438dcf9c810c0a9758a633d8c9c63fb4d5fd1c49e795317128142b39168e5a1d4fe350e1f4c300eff44b610f8a521ad8a639df8f3c52e04dd54409ad04b6a3b03b54968847192f0e8d1ec30ad18fe7d66f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a646caa8594b36f166516ff6d9e9edcb7ecb89a8aa972069c395509ab09c29b817b9e25451fb22a8079367cb9cc12d270786260119a41adc30085bfe08018b3e324d2d1ff9e9064abdbb13721948f2e570ba9f7e2d168e8b67801819a0f0cad44851db6d49075866f7585d85add1b2e2aaf968016f0384a14eacf3d82503faa20327ce89f2f8ab7da4c0ec2863ebf159c01f0fcf833fa1d7fd60ecbf7019f056730216a1cca98e769bd3f929e5d9a425700c9eb86dd4afef2f80a2c328e41e406d490a08d26f5fa5f27521ff0bc50b1245273f43b929ec0e93e694403e9f89ada51975b1d5d940227b534f52d5cbc1b9bada1b8fd38ae7e3251855c83a85ce5abbb58b0217ef6a9120aa9e4881e8e58985039890caa414fe2bd5f82ae89e71d0032656470316c5fcf17cefc284a2258cc13c1be7379562e9836760a5f491a86ac6f69d9d19032107b8b9560d961cc2950de24dd9cf82d44157c1731595f33091fb1e860cd6770210282c512c1a1c98f4cacb842e6300c872ab00fad4b3b8bab260d81e9bcb35b5022e3548e46cbd0c5fbb90082ee2153982cdc5d9be6463dec0e60d4fe4541c864f72c1df53050051026495750beafcf926d9f9ed13ab76dfc6c90f6716ce17dedd8898a987915c9dfe6443ec462c43a2a459db376bd67b2a40e133248775f58f9abd7ed1bf183da2a5ccda903d941870816ee5aeb762e0ab8f3e9ad771dab9f87571e666cb36d903a8ee922b73d4670f58807104ffaa668b3b6f374ff2eab24facdffb2233891bff18292803c10c244294e50b0e66a871d2e434efd5d24b2be7bf725a6013d78876b4a6d59465c77b9f58a94987ba05583bef26a8e984588fa6f9fca73be391010ee254b90524c83e0ff013dcec6a0d7dd96cc5be5cc718f2f4fb4cc60aeb8edd9dbf3e22bb622bfc0bcc8264c5879959be6348a57e1e76cfaf2239627f428d19ef9bd8f165d7a4bbe0c7eef1aacc43ebf543a90dcc60737c42f4bf98832b1695efcf717a3017edd05a678ebecbe5f146487a785b053c8f2ad3c3871365ce3fc23b360e2112bbf7172a055bce852d63b6622439d1092b6e280a7b8c1fc746492a11565a9cd9219e5a8dd3232ea49eb1b215ce0a962db418bc748c1d745bcbedd6ebbb7ffd5140d02bdbed28a788f1086a3e518131fca4d5a942a9fb37ea7af0c4e5b0f501e4d60b0ba8bbcca7cc9ff066763f9c005fb2fca40d9af3a99c99039988d597e3e22b5862964713413383ae5272ea6816c77784b146e4dafd8189fb11c6cc68aa17146c54736f7734808f2421522d162802f90d50829becf84d78fdea582efdfcd6540ffccbc4f413ea2e30f31d90cc195740df0649d42204f722cbac9b320b648ae7777a75e9e3f54f43288b32c7b6b62d846a7dde323997965feedd8f57ecbf545ce8ceeeba702d3b658475dbd029381a9ccf3d8b2dd4c5e1b374523ee1f83424095de396f369c20a0d8aa9cd1613de585fc3cc652150b351f618de28ee3b15574c741239fd1bf9ee80b5ed1d62565dfc65955e0209d9553f89e98f4cc09cb4baacbde92428c848cc7f315fcc205576695001a58cb3412c97171d2e9961ec5f41aedeb712c595f4b2875da538e433fc04dd88f96ac5c6ea63a8549bb81833b643e2579b0aaa5365e31cc94d48385a0a87ed65dcfa2dc3482d81a2c62f55f8422f54b4ee14132946758168c62513cf554fc3816dac0ac4d874accdba84e52c2acb3e2377713b228a731013dc7dbd8ef1abbedf25db915d65534ad544275525b15c16b675dd9229c4e4e5aa7d644eff369673be50e6592fa53b06c1a5fd94c85729539f15f3d68174394d20720bb5a47c847e7a51faeb5f7bb345f297174b15ccd0bd66b708a38811e9f8cb1d74f2ee19bcb13c81ad782738a424dd8d5b1231fa2f5b511fd4a812f3b1c8ff726d91b874c2caff3f2ac7081eb27dc367644904efc5b41376659dfb85b60283e2ab484ee17ed2d1b70852a42bd5623a8fd899503cf12aea4e019798c13c1ffcee49abf8800b4bdb6273880ed19806751cf25aeb29499fb1f517aca3bcfbf8bd812c0d3c193da19c9b0ca7e8305ea7fec23e8502409b20dfefbfe91ed5745029d3e8dc026dbcd41e77f275c167e3a0caf3f5832e66ef4519a4b93d161a7520b70e431a1da02d158d8d9a7af823a9ad609f1da413c79f72cd3ac5a175c27014c385168f6615bc882119311517e866f9f8928d75113dbe59ab3385c44f6b7fbf02de68bded2052bc62dec0b54f88a28a12aae61df08f1cae664488c51670c8bff0acd6e0bc1318361f83bec59ddc7303706181272123511e74b4b2ea00e8458043f353c062562e9f6dc12e2288c1323794bedc4b4814da161f6aa160c9548683a0aba591f0f2c6c032ed87c21dcfc01ec74cd8c5f94272a09202825c1b0f", "", 1, -651329052, 0, "7fbafa5c295fa6c2973b68404e79745dc676b25a57f840b08d0597efacefed02"], + ["5c8a4a4703afd155ebf7d993eddaa9cb3be7b717e5745c309bf833a45bb719243a8cc9dd55030000000035bb644afd5a012540ea4a6cffe39a7114f8351dd333b823bf10fb3932ac40222688cfb201000000015129f3b5ad2f4ef96e012120188e3bc347046be91b9e8f1903ba950336fb79e2e1fcd441f70300000004636a53653309b4d7021a78cd04000000000665516a516353edff990100000000095200ac65656563515357890a3c00", "5153ac53", 2, 370578855, 0, "8546e9ba4f9b02b6f56bee694139ed6b0f356b4b35f4729b34ed255965f97f4a"], + ["30394b4b014f930132b407d2487af11070d1ec8b5c162d6610e045364fd4ee312cbdad628c0000000007636365ac516300ffffffff010e032100000000000500acac6a510ffad1dc0200000000000000009db2c30300000000c0329e9bb9fd76ab1e21beb3049c87b0e2af93964daad013a227699d84301872467f037bad776be5b4b5a42fe1b7b9b224e14653fcc151e07170d4e2e3da00350594ffa6f4049bcf71d36a8a77cdb08905520f71090cd061702246c7fd403bbe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018957946bb936b410dd6d27c6da516d01a164deaefa6c86a6b5ee670f8445c84c14fa3a2f001480657b70ccdd0ed3e782bad6704b53c8b4694d7a65190b2e753cfaf59d7ffaee01c03e0c03cd597508a1986bf5416c38fbe0876ffbd64fd0c44e8a7c68215d232dad44ad351e00390f8484b2041ee077d5da540840724c50bbb022ac57fce7ac068b78570912668a44fe3129e965e5a41b754ac38ee6b547a44040217b5c22b15f76f1e6b0c63f72248c8b972d69d2d5bfd1c565ac65a44687b44b30a04d416adaca8a2a182f4dc038f5d6c29b46ef894f422e2d8585503005cfe283e8c6600a27d824ebae2701a9245719921d04fb591d2b34256fcd9244c2508f8cb03169f6557a2722dc0228588b39b5d0d484b63e1daf37c9931e734375fc1a07160032cf7e2cc9f8dcebf4e908323796d7444a77488bb27a45d7d58383ec7ab4f68150205926c1b50e8184fa2ee9b255cfc6f19ec662a542fdc43e9c42c59b8d1806ed402036514cc980c2dfd351c36ba9a58eb17520f7903e91a47fc40d8d9ddb2420f6503238d5608f9d75483a82da8e10653bcb7a747e3a5b81669eb39fae08592f9a82c27b75852c130068c057cd1526b68b0098ab22629afc049761d7078541cfb897470a9904673109b2856bb09a05c9c224c02784ccd66b79a6d62f53450d714295a2f38cb6885e5f73c6c5dcbb8a4f6727d7b86cf8caea047be90143502d6313db995b32af802e7481e5b5f7dcd0e6e4a5406df58c9450cf852f5999e04d63311f736d0e13feaf495e52ad16007686e93f7d1bb0298c4c4f2eba6a4a039ba905128c2d566406d9390c8aed5ceaf174df85bc6290e67e88c055267091a4eb1c2e74e5734685e62d1c70e9ce1c6a6943cd07e9a2daee41348698f72bf38a26ae9e5063325ca0b6b1655846850fb925c3505a3dd1f68e873cb85254b7acd18fa8b95b3e173b604eb0cb807d19680ce521534ca1340d1b576a6dcf444a7cb090b6104de11905c29442675ffb7aed35f7a1513d9948502968de19e22b749ea933b4dd4ef70d1d3cd13e77466fd659452dd2931f92e8d2665363576eae45509c4a60e52b5a1dbb99a87ef99eb1884de6a6c6751a199e05c001b512f356317b4c8f31af2a24511242f01ebadb40a60a21bdc63e565305206e4c7bbec733e65e7d913dd440c9a9017f02f704cea9512a26bbb32068ebd1ad5bbf78fac6fb76b05da6cd952425759df8dde335e977cc3fab143eaf91900ba007510a796d28cf8a4f378a25277de99113b8a40e75b524e1a1a28cdf8550a034c2c4b005371367d2df6b309036f9b26207e0a2aa5311340f51f556d1198f921e2e70d71ba37ecd09e180232599202731ef4f6e9d9ee2b27d510e828e131b4e61af20f97386e6e3a98d32274f2506843c3fd09db397ac204e5c280a21ee8959743b4b9779b21f3b797d68d2ffe80f5c46f9a8eebcb5f4abbf29a5596448a73f6fc6fdc6b7c76a0b76f110517883bc1b2ebdbc0e034b21e078c321c583d79c2da30c711744a6fd576a126053140288ebe6f50b024d72e2564e5d93b1f3a867d91cef8706dab43e4af9990ce4a91b60987e9f9785e4f1be21627ae4ea1fa605a90dec4d434b4b6332c87071243be60505f9d5ab1ae03d5a04979674b6cff6c5ecba086c5f5345442d4e9dc3abccd5809ff39ca1c3ce11997492e0a3f55318a2b2245d76cd956795d9fa51f34669c23a477032673517342e711c5f53138dd1a979b8503a90d659314caa4890e9747a77614ad5b9c2e805155a6da6b105dc741cba8e3e6d1c61f3e2115a45f709f1d5461402ced771a03485c32daac172c764225a025ec301d1613902b8d817fd6a5fa84ebad48f46bd915dd08a779a11a8e37656bdc26d0d0351d9d329df7d5b3afb5ae3c0a5e891a473d6caf1da1b612256e88fb9424e099944fadcc9bc601803cf49e2e2866afa854d26fdd90c54767e210c91a26aae930f62944db3d7e0f41f3544f30c4928c49adbbd7eb8cf17b4afff74bf077351fd83692931bda373ece3aaa051ddf1337e91c4b5cb91c99f8db99fca72cbcc3691560aa4851c6db43cdc583dd940f6046989ebbb1ce8078461dd033acdfa920babe848984f8405d8eaf6a35425c3afea2fd8004690bdc10c23bd3b3431d6e3dd828f4dca05cc1ed0194715674d9749395249acf2389ac8f4c8c8ada5bfea4d531faf03c37780271a4e1feaf3db24863b1d45437f43267ce3abac84479047be6b598a805a13f46fb50a362d2009ef8d86c3dc442350d0c47bc11ab35e44300000000000000002c2eaf0500000000d069e46241458632889419066001a1b5c3a6896f262ba0c376153ec8398628759bc2d9048ce0de8cf8ce39ae03fbe3f29a0a527e4b0e7c178203f024d0b496ebd0888961ff757dc435e4eadb187e48962641d32365986ebc5eacbf90a27ca32e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005bac891e19f05c6454ac75eb4928a6c78a82f54762e3e7f0ef1c402fcf5a0bec3dd59282caaecbffdd521396acc7f96feacbdcdb455d244829efd696c7a3b758823e97276b21f102f0507a42aaa0635c03a3713211c2377f412ee697919fa27d111c17d0f84c449042c048ef8b32e0835b263e77bed90ca012ae39d6c7147ff80327b4ca4efb2da9a3b73e6843236673b5d74fc94567104ae36516475da98e8b3e0327f533a04798d6bf5a01f2b51010b01b3faceb1ba2816dc03ec7bbe9fb42dbb70a055ba4b276a699d7f5b6656d5b2c34f99c202e8f8f878010902af43704083c983f4239f40a2c8a70ca5893c00d5ec1de4c278f417f5aa5872a6b2a8fb4c6b96d0212cbd6e2a1469b7339110544c03bcf1b6b0303ec0152e1c141ee3997d08dc164022e4aecde5caa9f0e281855eeb03f872a33bf2baddd36390eed6e1997054cb1a5030b3b1f8c2f6b938cd16e988e0daaa9b494caf9de1c40cdaf562f287b92a4d74302092078193ec7c633373d4ab524d08c48f12fc902f133217c6e1def7ee080dc460215251e130f43fc45b1c35e6d97f4edc44ac9103761da21f2773e467af2a166fdcabdd6e2804f992ff05ea8549358c4b19f24bfa7988957903b7d42eed50d9fac149248f19303afa85de9936127b91c04290ab2a7eca90d86d83f1bc1c1ac3fb8f34cb48cbe986b93185940b249846ab91b1dfbe2c453c1579aa02b4c08ba99e6d48de8e42399756531ea040d85531678600b775b4fe3d6d86c91abbba76f816ea80a21ba402fff0c8feacdd2812ac1e364fd6d9636836d073e9e8a04336c49b41349a2324efae2a54547f93e06736ffe7ddd90512575bf3352e9915ab6e679cf63665342905ab6b9cd255b55570ad3c0867d58a10338a0ca85b4ee7036326b5c472e842394612547847fce895269218a7cad734ba2cd5294ace4b36865d5d89caf6053fc23812413acd11cf367504e6ea7bad94d8b481b5ba7b78ab0757114b230516e11c16d452f12d0696c5a3e2047d6c04c445517151609d7ee47d8a9d53572c590802b43223658deb9b51bc118b1a52647e94b88120f4f5b275d94c1e8811872a74f7b423863e540d387255042d2afb265bd78a1d7bdf79525e8275fd916cb74b3aa65a0ea2c79ba3ea7278a6a61671bb8ae73fcd044cf47e3ba8e27b368dea5abe8bae460d1baacad0592777aa0e7c160665bbd2a6dd8c57c651336e5a5baa685ed6f91ee11617be29906e7247c94e74f6877d4bc66886ebf6fc23d41c336c1c95e1e4b16c6c9bfd65883562d382f2169be273c6b7e204b2afe98cc008159029e7b181d818ed360b8d0c2925b54406e09a0a8c8d26871d2eea1a7d7cc697b0f56310871a1952b8fd97670dfa415b9992aae3001cb234604453cd3f8a5d97f98aed4033bedb64ef99f70f5bb86eeb72e941e49a24183c19507b17455bc63b5de3b7f06f36c3829744f2a55efd475916a8670c969abd040f0093bd7a4adc5311bd310bb959156ddc205731a214a6e536ddf52eb29753d84f1834080b2a4ca326d8902c95f5f77c80a124efa77177ab01d2baed457a8d9352a4979ac4dec6eba0a70cc4e8d19d25bdc4370dc4355845da278a1af6ba3ce6cc2a9fbff490d1c938a8f76908929f0fe2dbe30b30c7db586d653f042eac4bce40c362cdaaf791622163d23a0cf0da0a0478f8216d15fd2745fb002e9c8ce8b0360fba8f6ee340c93515f64f64cc9724247cea1f03fb9324065a1d61905fb6ff4c447ecc2edebd98398bfad84a23af97eec475d583a0bb9f05fade952c238d88195e495c71e991246fa9d082d46788b706ef4e537700b86e24e711e04d72e1293746d986eb5c9a14938b82364087a37d51827100e3cee59fd20efbaf6fced296b9713ae7824e5ff3b65f937ed4c6ca7c669400fda4eaefb2c1f08e263e1cb4b76842ee56773b47f5c80e2b408099caaa6fc32e2895422b9ea5f45abace0f805e320309139f2f9632258188fea8a2fa5b02923644e1361660f0eb8a0f608eab629c6a3d9691232a67349660733181ee2979204b410c42b910278610bca8c6d00b98eb537dc8be401244cc6a9c6b565e00d18e46882b168fa86170479a2ae0e194124b3422cff3b2c914dc3ffe611fe0315a69c6f6bacca081bab89156f6f849e9e4df7e87a5180dc0d48a58c7fc3c23ea732699934270b27c7df9a5e74cc4083e1e69e3dd38e9d61e81aba63498811065ceb322713bfca810facbaf54ccac30b6d79cb98daf6c0d61a6fd662c725737ca8d678eac2b8f19712397f177aca139b9b10288b6100ed51a3879a19441806ea24d818e9189023e14fa95b8917b49171230ab6eb34ee7f5a93488c523ea2b2c4a45ea508b663969762f9642f6ae44c8e48d30c06c20fbb96afefb32ce7bde6faaa158a6ad8b44b212006", "5252acacac51515251", 0, 1895062455, 1537743641, "78ff9b55dd6ee54e3228547d0ca3af8c723076a2c4e660fe2f3f2d5c62a2dcd7"], + ["242f575a033c3419ccac6c2d98880cac588703f6e8e61e26f7699b39c598b25a342faf490101000000056a0051516528dc363754289bb8c7b5f0878eae3d86feadd06109def53af4447a2afa12533188dc290302000000036aac00ffffffff07a28aad858147f1e7a7421899cd8a861a9e004f289511140a3c8135d3c392a7020000000953ac6563535153ac65ffffffff021c01da040000000002ac526c2da2050000000006ac006a6563510000000002e5f9b7040000000000000000000000006014172ae6d0a8e994e6911682c3e3af5aad74805f0f5fb854f6effa30d9b4a22a71bf93148cefc484956ad8f092a167bcf67eabdfc2d3db741cebd4c3c157db3798bdf692b759d6e3cce2f34203f1f5d83bcf15d52742286aec1aefef539cbb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026e989aaf43d46dd519a8c27053812b663bb412d53ee1ad35e1485248af03487802227b9e4745d3b0d49fde640228be5fb8b285d8a95211b1a46522e40f3ff3644bbdc3697e10e0bbb1997915dd2483697ac903d2a07674d3485fc365ed63e747c71cb8266f9e4704abeeeccf9c8e066b5938bc069c9ff68eb95510256d0a8ec022a13278105b979c4dc15377d024f1d64a2f4829bb2ec88d08b1512d4a10864ff0320c96feac16327a5ac0e1402c2da8f1a6448cb7ddf2c01b2d41a33f1b705554b0b00681305d7abc6063286a6e1bee9432104884ca8ed6fdb87eb884ac1aad396aafdf2a33b0970eca3fb20050bb82b7100ae378d33858153593b2dd040b7ae4dd00307d15b21e7189aa0590763a5168aedcf245c01496dceb446544f7fef27acb06d02000baa869fd63eadcc0498e6c9818bfdc9af777b3f9ee272b2526e5ebdd2d4ba022069ede1d79c50c18090379ca105d0a78f41063a95121d9d0c0879583c4799210305657e90aefe39975716a4e7007915ea9e27f69e985eeeb8eab2206fa5fe9be9020b6c4458b012c3410c9e0c88565b5181a1476205e0982d9ab668c648d71f4601d9cd05692ea781a919c2a9e22bb1dca02f01fb0e49775b63e9af644a3ef73c2da0a1158672669ab80aef5e80af6e13eeda45ced6e2f7e7a37c63ddc21ee58f7c2e64752ea11b1f5669121fe21bb51c1e4cb5c7f64fddef96275f8f9cec1f4e0dc40e4ebcd864edf6273cf5433e1c5a573824a7835e47100a4e128c7c5dc16e711d31a90acb05f160b55ab927898288eba8500e758078b8f062139c3b8009cdb83d70ca2a5df348e6fa7dbe07e8d1aee11c929e090bc4a0170c7a5bf3b661eb947873db5cecf3c6361ef93f46a0de23c6fd6d6c1dc69da544d7183aac4d1d7f844f778b5ebc198a1eca7fe82b4fc46fcae20cf64db7463d70a31d52a0317b56f8a9cbfd88b628b3f4e85d311cc1013c3d9c909d0db3742d5cc7339eec76d24b6b780396f1edd9ae6b72dd1102b1c9ca221360ecc6fe9ce54e355ce271e183585efb6f3de15554d3e512dd6e07675b2d2ee5dabbfccb91680d8f103a8dd601cd2e5f33cd666dc54a4cfc8acaf18ed9b56b7321f723fe8fa720c70ced6358f2623dca38cd7c6db9f5f20aadc4ffa65db39bfc3cf9acb647d3c01b4d6eb148fb51de65e1c493bf164689ccb192c5a241b05c9cbb384614d12d47d6f198b4e3385f5c2043eaa5c4893b988ebd41b3ff03ae9b5afb475274eb92af415c6f3c3f091c933d821f16a319ffb64316e0bffe065e7a5593b33ed224daa71d27369041fd29bfe5706c9a5920163eae225afed544e4923810a330a6fe88a31b33f4f41a5a78ca94f28297d22cd0b2a74d79eb6797e377c94852225c0a9e205a930f86a87e2e8be1faa1b2bfc9efda4123513242cc2450c67699ae545a50120c70edbf001bf638d35e92157a1165e30a14ef0a57882c1fdea507fe4b13788208b95f421917942af9d5894dcec21e268c814a5f689b277618013a1721a652bdf77c7b333a4e1a63112a0e65119227e9c70d7974ac6c07627630cf92f50b6c2107c76226439c693aa8e858a9a59aeb840c4980f5ef95fbdd8d3ff9d0ad4b74cf3f2b379081ac1f649577942fcff82fbd58c3b0a92b9186f5752cde9d93b856b43c633cd18237bfc1dc7eb783907b9458739239a9fff91838125d9aac73dffb45c8ccff6d6bea40ea0c5ee0f5450be892e37b8d1baa7cca9f4789e0a3525c5453c0850abab24dd532777f8d4dcb60b7fbc26e1401ae8e2be49b7b0c43ff29dd27fa8cca73b4de0e5df4bc2a026ed7d9d07c1281e53e9ab2304ce63bf2b41ee37a4d7e720a34c86043ac800c8235b0ef51ac83e8ce1ea792ea1151e3f226e47b91e1ed4230e3eb69c1cac7cf54af5a25b70f0d0220154b6bd832cdb43582a5169e6629215b593803e736d6d0c9c0ed20349de76bad902cffd0761449f1495c6f02f2ced56a68bd6c3143d38c229d570eaa7c16f3ea277edd0265ed34d7efa1f8470eb5a693ce41887fb6f394164cdf0c69e9d038db0c3ee025cc21cdebd15689df337660be10118b5518bf214c1342db98a352b75674375f4e21f085850a0e33dc53f7af4e123b0f01b93c23291232f9c762ff28e2c6d6b021b39aad42e76b02d491810287c291d25cfcdd828fa6b12d93995321cf5f4f6d5caac616c9b92bbbb01970ca2d19cc7398d46eaa145c080bdc7e1df2279baae326d68b2557f0072a97716de12c1062c4ad2d799811ec375bca41592db03fa115b5de535dcc4d0500000000000000000000000000738e58091021bef3bafc27095765270477a41b653f72cc84d02cbf0a0dc89a51cb9be6efbb93c9732a6b3e146e2e2cd34eb3df028afd987861547346fdcda8afa220926e366afc98bede5cb03788516c865bc08dcd315e583a226e3e67526300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000353b68b41a8b708371f9ffc0a2c00677d004280da9632d99f02d4945e0a2c348b24036755479ece477147e2465a93f06a1ac767dd8b285da2e3f7e2c97ef4fccb64dac7b4e6862ca36b94e3ca6a922edb8079d6279fd860c3685fa56f0289afa39d937105bec8788f5f0e968f1f36670ce88ebf983f95cbfdcfee11d9c9d1a96030005f511ceaebc4acacab6ed1443078ccfd3d3183f83eb1ffdb50a0af98b57e40223d6aa9f038593b7c6bba70254e746613063859fcb085edf457e9e80c9f8f6e00b08241f3d48ca370524001014e6788f22cdc7aa084be08d0a3372fb3654e025d423a7392c925fc16b0bf69f0ae09f9f6917f79e838fdbc60953f39211bff319fb0310c877319e852586d24b31b2cb75f8be7512f0d2dba7cb47114005d139b8503a0215d6862e44349c255f096259966499a66528b8164b1972cdc006ee74b6205f53031dc1f4903ed296ff4a8bf8c7f57bd13a63f51d127fed3b1e077cb78ba05a903b022fa6c8abf1fc0f665607a2a231cd01d1c5e62e4349b4173c92ea12a2aea17df30330101b0740649f7e217c315d09d791af9475f0499ab121de3e4f1283c5afe07a0a131f62588a2e80c455a66c5f0ca5b79026e43d0f30e816d9e95278d0855bbc2538634d5fdd5264893cf08fce942bcfbf4a628d299c80283c430b0f81b7dd45f4d2fb826036005885c9894b79d90a8e63678157c064f19d140959442278b79ce163216c6eae279dfe1c31653114f4d0a06f95c40744da85e16a419875d9a642384ceea98a72f6b68dd94b6ec00de2b06ee2cde650abbcacac0fdde4955126df72c7859befbd2c5996c7ab2976918b1bdfa10690957d1dc09f77107cdd6d314d9a9daa8ec09929f188085791425dc2252eb89bd9505ea53f904054bd34a3533605b8b359e4cd222aa6f55ca7bf1e9b958d3d600440b1bf6c7d02b999b7d248a2ce77759dc46091d0b8bb8bfc9d4dda87b458fb4970c0f2d921827a3f17341d0ddc7e7bf4351c01e767808851db08201885fac98facc1946cfe729db89c5d4ce177c6e90f9cf837e490641c7df9470a0fa9c1e87b1c45035eb257360bcf7582f4f5d890911e440f4017a8c67be7e8f0979195adda057cda6d051bce712b2c2f6f775351b21e69cf25f2b31b69ba480be0fc05b9ccb23bbe8cbb9bba89390946b520a0f0b94d548b567547d9d75c283f6d97fd35f1177d8bc30395546b065c5137e2a6c14feba0669c04ebd384ebf17b1e2a8e2f48ae03feb2594a658d98ee4d41e4e6d46a183371d9f2a2239a0d18cc390cdc3c2ff902cace03437c201d967fe66417b6cec7cd6a0b832a2337cb5c4d242e49865538b913eb8f1c3d86ab039f4f4dbe59e87e3a24164eae05134f90b94adb91b53f94a5dc73ef35dad13aa886413a55dd993bddc60eb8b1cf89f4990025fd5b5bc1b7ba61408a12ae1ba1d38d1adaa678eaf9dccf3332f737da31c342ba1c77012ff6346d9733f7b215451c53af076c0656caa360f64a38d91d93cdc7405313067317213e51e80c3f4c3097177db087aa62a6a5a0ce662f46da0b87d1f9b705d29a98eb2ff0ff85d2e82b97ec718eca486691c35008573772a14296386cf01a813f6189504d17304bf5b785d36bfa35c952b3d31d7afdabf30bed3bbf9997b6e4e727c145bfb16c2ad9f1baafdd446b57d6257525d226dbf3c313b097f6f9bb9752700ee782b07198e0ad32d513352b4603d15ce1114f9a6aed176629db3b4eca0774fa7e76206290bfa0a520209910ac9be9988d28c61433f9559dfff9b2c196daa01f9ce089c66e2063f72c079e0c90f1a2b4edaad3e788c5be2b8a57ca63c72c7ef6ca7b9e0e3e1fbfa621a23be10f115911d821caf5eab615977eb7e7763ac6b64f968fc7d22c8cdaa9ac8d3be3eb3cfe270c7e16c527162c284706273787b75889f42041a48a7e8de9e4323a751f0f286ca3baa06442010dbdc85f3e9a16bfdc20843c2289f2b1543f0d4f961ac99ab6a923ee815139fea569a421d414a2c1e8da9643c5e75b8ec5d1f6a76a2148d82db962e35173e8e864f5f5a0d3a486e965dd6c353fc5444a1937be37b2bbf4eaa65af787fa784973e44cfb5ec2eb83d584155a0e3ff13debcafd39a1131ad5405ac3a3197e3c34f051fbe94b0b2c64814b64c958b2ed918d3e4590d7caa4895744e584e0f978e57a74c7f84e4a2c0fbaed7ff57ed0c66da071a98e639918d84d9905bc6ada978e87c5342ec25a6f4668ae0bb9d6053ba3d0dd2ff9d3b327a5c0dde8ead6a4057be9f62b1c3aab3790b806f54aeab3668d3a0c9a46e465b6159b630ba98972a98f84c7c64f348ab9cc7fad3aad79c66aa1bed9d916ed9d3dc11f18c773f1117ea293c7fc3b17439b0abb512073df251dab2a64dc5de865cfd826b8cf1da205c33eca845a43069c07", "63636a51515252516a", 2, 206921066, 0, "c550f83643cde16d51608d325f74311b458120033d397db306a920271f1757e9"], + ["030000807082c4030432aadf477338db4bcffdb45770b98236882969f5025d90ff545b3d232c7201350200000009515165535365526351ffffffff635eb812b65b6aabe1541cb20037eefffc73eb9b09e9b432e0b4f7eeffbb40b2000000000400526a63ffffffff7cd02fbe31d5ccfe991502f39289e74770aaf4baacf149c32c7fbdf5f0a1137302000000045352516324cc4c4c8a6e7b45fda65f2073c87bf5ff231c13ce70d848f2e99791dc4194d6414a69010100000001ac0785c78b01958ddd00000000000351ac0000000000c30789c00318f57204000000000000000000000000e2b13939166d366529042fcfbb842b46300f56d83591f635e2cfde788483c52c4f8670157344af616e1cb0fc40608f52e06b1d0c2d515985f99f0c6888d0017c2e57af09c09667d476c6dcf7473a37e76989f7de77634e25e1483c77f187c6940000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014a4831fb5a346427756f77c51adde6e745cf06bce0a14697db7827cba51108ec96f81f3b43b3cde4467683202b0fcf1140c34c4be6671eb581ff6efa440d4b5512e4e41f070493e6883a0754afa0731bbf0c2adbe0e025b8d62ee0700d34d25809e74664b92bdb7d8ba812bdb290546312f11b16b859f6891fd6494279f1b900308fde5b28d4ae649dc1cb32db27ea1bd1c85139c9bbe319ab17a1aad1b5d4295020837592715c1101e9fab30a273c862cd03f7f2f39fcbd2d1a9a7c835d05e01280a07e4cc85313a4c058bfee0e37b2e6d615bc90bb1805eed1ba2cbd43d04b87fa68cbc2bb7de1bccf15bc67be7b0e902e60613ff7a9251206196236eab019908710306a1beaef827741d0bb330a2bd416d40104a2f1eb753e852f995e35aef1d410e0200cecc1cf9b889aa985f0c9434683227a086d147fea223230de643b315ef28060313430cc3a5dfc4c939be99393a31fa3ef275cd378c14b4ebd0e7afb3e8e5dac8031e73ea38a3addf79ddee8dff0a52e5a30edcaba4e92d3b348a00504138b5a777021bb02b6878b40e6d5e779c02efed16dbd0f17149520979eac17d68077ee0b8ed20b906a6aac3b6d109522ca2070fae5d906232394a26365e8e12e095341efa9642bb7378894b4a7504b4d78d450b58a593970c0422a70833ccd5cfaa6ee3f6caf41ab43d37f8c2b6679089cdad16c669916d178caaaa97e77764c56350c8458f063c7b3973484ce25310ab92ab592585e9cc3baee9bca29895601e3f8f526b4a30167554cbb059209e0ed9a511858efdd57aea0f8031d5756a77cde9574eda9d39da16b25f423e046864f876897c0bf44006d85633d0b2f9c7d240c1013f89ea34de26cc77a630811272a7e7e1a795500838703869f8e00a8a36ab524c179684db7d93224029a65aaee7c591bb76523e4a5de8a77add09b1d9697ce92915ef1f378d699eb690ed3a034811f0762dd203005e5f8d6b77d5cd24c5758757cf693474b23ce9dd283aeef3e4c9b6caeb7821d73e3d50b2f5defce65698bcdd79962fd930d782971028f3efcacc999aa5e6cc58b923edf220c958a01c7d580bea5db36857accf7c4f3d46e4ca656c425e5006c886d475671f2cf879816cda64e9d1a35028824d3a35aa6df8a891057e686af2feb3907ad5f4ba704164aa98df9761e01daa5639e008fb0362313aafe00191babbfcd0be3b7e32a64456423469686e72a565445212080d21c3a01e2f30276b63d2daccb83f37512ec3394a37ccf290f2287e020583549d57d7210045650a1e123e6ed829031d6fbaa90b2a097760fa64cb1a8e514606a8da66f604386090de9646414d82d45e661363850529b23481722fe70cbbe250cc047f093619182a3cf745a84e1fdcb9c975f7f12390930f3a865963f33febecf18776ab2422f9f549742a1cdb02948202aaad6183a9cc0b86d24b967a6611444d583c439bea5852036759d290b7a8233361dfc816927a853bc0088fe005d1ac8a1ed3a3c5674fed8f6a2c79b9031d2366691bf5a86307c9547105cf69e2713566092f99462e8e3f14c495ebb4e6939f1a5f4d81107ecaaf9f4b3539492e2d7c9571095270313ab74755f78c6713b62cb11f671f1e33eacd6b696a58632610ac3d44022a7c07895e311eaf3a75fc44e14d7cf165901bfa534371779ee234c8a43083c6d25b78555c9513c54c4707a9129c11fdb8eea3f03394b73adfebe594093c930ed1557a191963787070d686a2aeac6565da14682be69f4b416eef863302e1129d0970cdb31f1178d43bb9af7665f724adf8738cac9be7af41334e8b5ba20d89cd481055dc891f3f947bcf311df6dff1a3fcf1b3de424f3bf71b2d39c7934930c1f158cf3a19add5501ce82512148dfece6a037762d7a7840ed550b292c8ed1f0bbdc046198cfb5099786c1950e98ce8ad750b0e75491b4c309a589ad5337b7e26da3f928e9cc931139bb45d742194bff65c23d30a2307a2042be90bd8b5e0cd9f89ee86ae433550f5f808647b4f61ed798d6e1f145fe19f7f67c2ac04945236cfecf58375dd0ff9d01cf6c2383f407ab2f1b7dafe3ae77e35b56a4c49187b796463034a7c90be054a12b22a18c475c0c88d3eb68cf609a7b58073430ff9a94aa78d736d2e7bd41c258506ee9aa12dc55db6a05b3afd015d3084ba88aaf70a7a7e73fd8d93675b1c387d5b29537db3968ee7298476334b9c8cf8e4064f62464b981f3458853994783fb78d79e38b51989431ffb41e3e2c67d36d996e6e61e0762e3e1ca38284b9087d9d0000000000000000a702e10200000000b6ad60b7be679de8809fad4eae96cffb469b23bd3ecf00deefe67ea4338ab351edfa7db101132609e5baec23ca64492936588f5077d1472edf6d4f01a8d84ff708beb00ebaf8352492568b795fb0f497ba4bab5ce47e67ccb85aa1ea7f79109d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000224caac3adc15990045397e239ca653b8cd0ed11a1ce0c4a0ac51a1f5ac58655bd8143400f462ce55d084a2014be627d534262e9b0fa2ba79606f015d5dea12aa786e1d6a9f2f67cab445a67c9802623b6c802872aedee10790e0c69d095cba370ca8989ea9cebb7f0716ab119ff2ef4e324c39ff3303c593a8b8392666ed06e0222cf7c7f75a75032d63bb3cc286c7a66df9422d8e68d0fb66b4f611b2f92a08b0305f7f01110a7520368ef7180bb6f61da03397b436ea44c319aa54749f61950df0a029a7646a5d54b4bce0f53ea2fe34da0aa0daba9e129da7d6859bf4a1509e1ec3f16a35d40499089d87522a5da733c61e451062874b8ad65f94fd23c4d104cb90206acc484c84ec8c11ac9bbdd6a409d4f7621ec694224e3eee583b6983e23b4a103139bd5f634036f59e1def6f859beea01021693a86afe68740cd00cd8c5e1c3090312364c5a11470d70a44b823b0adcef1557b449cc3ca29fd60a07f3c14e2bdce20328024c8fc8f1b29425b7e08c8949df66f4717fe44c27a29b9101d7b20278589702228f7b1220d5ba572f983605c03881d7bb562bba5145745fcea115088f6e0198b7629bd98f072cee908ab63ac10820213ed42b4b3540e911966814b6e77cac067076ce4fb1e7447a1806fd300909ccc8b630512af7978a30190d8f97ddd161cc7f63b776f17a52fcd242ffefc92087091fb9096b3f4fd71f226ac3ba91134c610d2ad7cf9dc8d28062a75944d29dc73d31043fd2c21d73dc2e36ae528d2ba7ebc510eb07930ef35aae73a85f17f73cc7798d99459609f749de1f4c8a661e3109ff7440ccac1dab355237997b26e590285927df5f60ac87ce4c08b227caa5bda32fe9c513d20c3cbd8fc73a23e4db5d79d88775d44562707268682bd051da212239095a8b4ec13cd95bd2dc39479f10da391f34dcae49b21a3a52bd24c5bedc000e871301d507c7fdf5ce9d5700a436df345c873cbf328c412bbca65c93596bcb6c6e5533670e194642ac0e9b14b9140f207b38503ca517653e08913379620e3711610e7657966a58a902a0274e9413989859823d45c763e1c7dedd3e4b7ca94011da204456773b516bcc4555ae996a6efd5d2102ecfdc4695747f3934622711eb404e24adb131cc2ebb62f0f56b046192f30aea64812da3008dda8bb4dab61260c351347aa88a9c5a4e7afe96a0d8dbb6cc8bd659ae0bf310aef4d6de11c9436001badfd8bda4fc803a4c7f85af51849fc1771c415f56cb54cf84b90d0e610d4cf8d2a986d949fdb30b59a57313f0c7e8eb61dbd4ec3329f30fa29a0cb8af5ccb94914911c1d5b8de53c8a87c0a5c0a5340768dab1315047614f0dd867c11bf27a9003f2b146bb0ae5c1e1b0fd6dd0b8e89137a3d91256dd47c0a5dc2fd78bdbadef4397249bc1b3ab3ca2dee045f97639fb3ca3a3df11cdb169688eae7d6b48880b6a8d2bd105e13a861a1af8aded41e07c9eefde63877f50deb77a4b6709b26a473225492d5b426f58c13cf7e8612c134abd2897966fc4494494e359f30a01d090cc85fd6660fa791b9cbc23d3bc78769c6fd7564fe9bc6c6d18e477b3f42bd65439002b5e2e25e9695d2b6b3f54505e42504260a74b99b15183c8225e0b081df12513669349e199acd526fd90566446dfa4065b15a1b7c38788cc2441ab0ddf033570d6194125b57d391ac97f605b3a346b35c9121fb447468bb744dc1693db84f44b08693e0b158d713f9182175666a174f78f3ade2a54b314b3c35fc61bc9372a7ff26472c78991e53bc480c1e2e21ef187ccdefdcd3f24333446edffe180f17c77c43d6b1a52fc21b69abfbb4d3cd2f09fb20228a5954724c97b34df51a5a78401c1c043477730e1c6153511c8a1aceb7f111afcf4c719c6ba90b1fed105ead24dfe4753ff134b570d5cecf1655bce87477ad82d24d6bfb32beee8a0865613ea9b326bac7a2ab9cdf11c0441d399e20df55173dcc6ec039229f88ed04eabb62a96ee8953e560d44b6ca94f11ec4d7d26406956ceae165532645e1a37fd519eb45abf60757718e69533abbc4f2fb43029d1162ad17ed1fda1aff7b8053296e47b3180e8205db3fda54f8a91cb3fc8f3754e3389fc7dacf3b34d7ccc2d5fdf04f24f901a1c6507e981fb236da72cf00e2ff07c8b27d47f6c7deea280f8c2130c3c395ff7c8a07d5b526e10821d9662c93fce91c20b55cd06e26e9bbef82cfaaf7954931b807b249bd8c53a154e034404bf61ccbe1beec9580dfd6ae29f4278e61fc2b34692321f02ae5210cfbac910cb0000000000000000f19f8405000000001bc530585553de42dda46762ca173a2bd3966f03b409940a3cdc108926dfc604daaee2a0e119ddcf6512f6ac8c95e44d33b799f36f092210385cd6f16ef309eb52218e64dff27c60ba8309222f8716471b0d94d0cfaf35d3d470174f26db7e9100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c36fe0ae9af8ff84c4a33b103bde2358b4d97e75bbbf63d59fcd694867d4d52280bcd46177d1e89c2a799c88ea0f048074804f6d4330c5789b759480179a5144296e44732a2a587f58048f9c504087baa241c725cc6546aa030495dbd8cad8f580cee57a90e64ba79bb48d252e38622a4f646c99f5426c68b97e48c2602875b70327ed10c8856ac75581612bc8c421fe51503f14dd205f1d769f07bab5d0bfb4f6020d925e0f592e041987f892e3c2e5b015d566e0c2dadc5a87b2addebd6a9313520a065ad8659c10f4e37478bdc72405729a393c032f99ac793e8d815122b1e5a660a43aa3dc47280abb4164ebf4786bccbb22dc2f41515d348884f44332808e6509020bbb05210c5d2bf7440ffbf37617feb6edfb38ddb404044755643422f5870f12032e6b5c6ca0bb9b2d046d2964789965bb5ffba84e1273b8454aaa251b43ec91cf0317f3326b736288a475ac03df591af85b9dbc66ed56f6fbcc7823ccfe66afb9a90212a160e78ea8bba0b92d48dccfda691e43cb9b47b75f04e0505a63ef33f4aeee0226b5886ebf643620693da80ecb62c0f66ef3ba4ac95d73058867498a7530e0e9eb0f6eb5ded659c9e66c1b5e0a48441d292a9be508f057979b59b5d2ce7c5e24b27388033e2677258b8468c23fbf4923f410d5deb85114985dfe7db3c35a892fae9542a58b187b9e8692281df79c3a15fd008a033b847c6948235027a4b8b23e99b3896d438f218912f2d6d3e4b081d87dd11db47d25839cd4025370075e1c4066d46c1b1c9a6fec2ddb0d280450effecf77c702ad6059b242c4e1f7c5ffbbbdf0ea0db2da579bb087e64d20ecacd602c9b93df0ba5fdb888d28e762e3c0e22dd1a4fc4bd1c1c9ec5df76a665cb416a29380e8808c3a7d2e470c0dc2ad343b9f85288777d009859bd945e139ec1494d0ef0a405206ede3344a6a99729ae7bb32781b83c8215534e9c8e06fce47c03d838ec0ce55a3ae1ab15205c1ce00b528b09398a34018ada80ed6c3ee5f31689f48eda03719cdd267edb915cd8b06a01dde859002dfed41988331ad9dc9007294b5a93540cf988a7843fd263254013000d5971a3e338d8fda5c118d01b53dc30db9ad0891fc16e93af418b71ab2f9b88990f1849e9b923418ed3c119a042b2fa5ffdfc34e25673210c70aad6c542bc4f4cd9bf0c547abf33f4f74b46bb12d9903a79286eb86f9ae62d583a984b28a529d80331a0cef388ba9ab6a535b29665c24753e3250a5754fc05a775600dc35c952d1de69ae3c51be5458a068849926d9594287844c5fca6857964cfb08cb65f72709a5d768d0d36c4e946d7cb22d3da83fa408a17dd8217c8c4dfd45bf0fb5950dbcf72fd0ed761e84d2e5d88d8bdadd2bc2a500460b985512358ab7d49f2f3e31e924d7193beefbc9a4a7f529214de9933039b12e7dcb8dddbe0285dddf893222be1fe922fbbd05e36326b3e00a613001721866f9d12d9f02644391a4147e46198c97b51aba97db165a1e2c30ac3769c3e4b00eb92cc6b420a62ca5b774b5823799547ae47337e6f57eaab22d194f55e6042a6f01fd314ac06b15422a79ec4d2b4fb43bab586728d45ef196dccd879c15589d5ae54658bf9a48da70d8d4da7d48d62b3d442fd5f953968333effab9eba84c67d6160ad63eeede04140f8364c5f38be23e206aa68746cbb0c9f9cababe0670fa6cd61acae0cf300e9cbd00848d62d4a11a88283e72ea4776c4391616e5022dae7a7df89e8c0381795ebc45964461b1fcb1f900d4113f605f838b057402aaec9c87b67827a5e54d0e39ee5ed28de34254b9d09474aa1aea38dacdcc23647651ea1c7d9d0636d8ddf75ebd4642dc6356a61c9e1e34e8aa823c9432058a1f080a6b89aa19a982ed7a58cc232f5b819800e402002f9a7fd4f33b2448a858f640ece7db0986d8b1ade41b795578a7edfb137c2b37be129c86570ed63d8e7bb2bb493d74e4417c646a3a4c9a2a519a908114b1c6ad97242c68b1c018afacbe212b6f3e828f7d75ccf4ea1e7eb6dc87cf8d1904bef3a3bd0334488c69707147cae68c8e7b1e3f6a47b6335aeb4bb2047c2f9c5f43713309ae60a404838c1ae3eca9e8dd7a5113f49a8dd10aebc0a1b2bebb3d58d562bd7b9a2e33a74b8d42fe449fce2a34f535271a0707cc047dba0d3803c441e6a656b57c151fd643c4afb3fd4af582cc4fdcff4345e5be5711017d87e465b98069192a9097c678854e619e8f24c8b5f10fe2ed4b92ba1e1387c09cb4b2b3d1443a446241622e5f8aadd1e95bdae9694e92aa0667a78a9723a81cfe2dbade36fd6aa19c7fd3d3f7ed7ea1d1ad6bfa3194c691a3777d6a38c76377f5d7c9aeafbf9138c11ad12fadc8622429e5598226fa770dd3bd068ad62eaf926dc0051e180f2c9b9ca70280d0e2e1da6dc3e8ca7c0a", "5100536365", 0, -853380959, 1537743641, "61f8b1bb21302047fb9a3007285ed06924bbcbdb463e77d27a812ee1316e5b77"], + ["2ccb603701d608463799dd5c8c69f5b750e0c5b7eaa72338c4002ebf399fd0c993e25865770300000000ffffffff04f2612a0500000000080065526563636a6a935eec0500000000046353635190d63f020000000001acba6be9040000000009ac6a63ac526aac6a6a0000000000", "00536aac0065", 0, -795874100, 0, "bae219bbf0ce1ac5d70eef26737dfce50d840df23b5b8c0de652d5c3463d28aa"], + ["9548b24201a770b4b7430a5ac82facce9a693dc72a2b01e2e02b1778599d7d756dbda1569400000000065365ac515200ffffffff0361b7ec020000000002516a4354490300000000076300635153ac53e151080300000000035263ac0000000001000000000000000067e9400300000000e2f2a3818cb3aae1cd68bb6e46c7eea13d0288830a19972d4e0e009bf38db489b22b10cf897e267f15e0523bfbce59a3215f6147f8f297a17ed2b5f08f88402a3569eac0970e2f0e4628e9051a90a7052be6df84e8931c3c792dad7cdf97eddf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090b269e672daffcc333c85b0d1b12488947c36b8df0e27eb5a9bb848a2868418816e43f4be28d5195cda0abead87fba34f89ba053f4aaffbec82f9d1277c21388890b2619bfa4c9b4ffa6956c4cd1213b2bded009007d940df27fac5e4f395f73750473386be40f54cb41499a8c3598c58b45fb75cd1a101442a4076f168e957021d5151a0305d1fb6302da0297fafb73f1cae9f3ab33ad1471ed24ef903f436d3021b0fb3bc19c87158fd59fec73db4cb1c2889082c2ee913627e7d1a10d94b58ce0a09158c0d53971ad428c81afe93472939db4a520a87ce1474778ac903ca4dab011b55ed5491c00ed675260cd620c47ae19c254e6e552583ff9977c6b6c0461d930320a74ae0c793ce393ec7fdc0cb444fa1a2756cd621a53f29e7b0e8f8aadd35ac02175af09289e2927eb0e284bb21a6790d6b0972affdbe778dcacbb711868c443f022c135575b5e67152247a9b4e463ce37457eb52994b5cb0d59326f9e83251bef50208ab2a5dd5ad97b221d25c787938299215ba802874dd57e98384a0f61bff7ea5030729b037e1fc714744ea5f6370240e36153841c5f5db3e420373371ba66c7e7b244b8f23689ab6f7509c2d6bad3299ff526e05a13fd45a8ff5848ee0c8b5b660a8ce2d75c6d73e224f54ada4727796302e7583b7b6cd1225e7611a6d8b72af7db457d2182da0e501cb8b5904949c763a22844f7240f3432eeef3f8599a07df601a9fe9385317afdcd7d89d348b0095d9cca7a2f7ce18bf6152ce6aa5c61167370bcf5cfb4a4b18f8bcc11dd3d8e43fa76572cca98047b67769b510b7d2024ceda66ecb53434fad187c7d078a871363291e453947d7577b484dc367f743a9bca0ad1bb630b7f02bddc4f025fc68eecaff43d7db539556cfaf8de54d29a3fe64447714e71e7302bd0333b954498aacdd9e5eee8c58c4f043963d8f48eca6116334a0f6120de63288af5eb43cfc3c9115bb5d2e108baebb882db0faec7880044fce6f03adce416f51085ec087290813457526ff66456e89f8768ca7e1d6f66bc9d93199433a5970e5ebc8f08a51a64fe2f6c592f12f124fcfc910c39afb7afca5b4e230ee3bb276bc138ea63fee3ce473618d127b7d08d20e3d855408dd33d0ffc00fdac08b11800dcc8fd707b2e3ebae088acf37e85b8608df2d6f0674ff397dd92f29b79066ecf8b37f0dfe03bdd7b26414170177f49d1da472bed0ecb50ae9c556d5ced97c17acc8b25c9553e20efc77af1a7d93d21ac1f2b5216e84773221b9c906f53e144c12574bb010c5659aaa206066d47c5681742ad1bd6c3bdb91b43abcdcfe90e933edb11c075b5a38d9332436fd90571e0205e68650ea6be2aa266ee2c9781f067382ae41a4b155bc5a8360fb9faa6134185e6788a0aab5d791e33eada26e4813ad455c7bbc916eb78b2c04641d118ef009d495cbea55b29dda50a4b91b8e65eb174dc71cc9f10029f00b357712ec3e4e3c121b950ec3348db719654fde2661db82796f02ebc0958854fb17f4bc7b6fde94f363aea1d0669e9efd82f6d66a830e071f0c5ec8d32827d1e8c7b4ad4feb90e9a76856b5890ddf48312ca9a6c1d8186e816e2f565afe46c9c36df96915f288dd3344dfb34e95850ed027f1b60957c5e230db9c8356b9fffec9b0cfd0ab9272e0d4258a6b474952f46dc4358238ac25d559abfc47f76a8cdec5d2bc458c548cb947032ce102c6e8e7412ef553f59a5552e7d987ea70627c8aa8ea8319477fcf54959506302095c313fc9d16b409e9a39b788e91c7f39fc953bd7692a3f3b8b814a5ea074a9037227d8d5b8468ea823e0a9dadc8bf7a6ef3e50ba48f97de5b832b3bc3e7c7f107fbafc8c71e1ea09ba669c65e9726068d9723ce972a5f3457fc2e9a3ae26b2d89456143c6c38a62dc048df7b0ea24c844a68668a4e615138fb8449c78a8dd5e7b4bfec45d2d1ee4de684058ed8c55c32b7fc031b22b9e5a09544bfc2cea4d149559a3f46b6982f443ccd2552edf5178d960643b054b4c12d9bcf275f1c5dc6193bcdb646e4aebeada92363e601d2ba92ccef68718c875374965b067b63d0e6303ed6f06bc18c84c2a67b4b311afae74dc6cad24fc3f4e060ef9d822a3ce21efb40f8787beb86368691763324261046bf4c0b235ba68f8e21dd45fcd8a18aa261043728d8173b04ffe3ec2005448e74b7425b4be05426b4d433cff70fc8f83fe0b63ab5d8dc2bba33845eba9281ce8e59facf57a218e6f8b3708e5522b0bf1b073bfb2f08d3843555a80a1e217df88558e8fa388678cd89f83b675756b807660135cdc357f1bbed47d3814802f57659f52ffb6f1b3ac1a9113400d3714c5d076daee4ab27a969cd771169648a5170cf997e53c05a9a12cc4f9d82531550dd1a20c78d53f3a5f3b975d1dfb8f8e02e6249e7f7a17952e01", "6552ac515152", 0, 2062535538, 1537743641, "cf3f0cd8e44e2b64df4d0cc6354c0bb2a602bca73702bf3f2fab49c8f524287a"], + ["950b5d39023629a61313ec4fae9dfdcb1f1ad3f2d9e2cd593c5bad0d5515e6b758e19c122e0300000001acffffffffa02d2305647985a502b22b5f2d1e62eeceeb784e3b3aef7ba1e392c26f40d6f7030000000031ad6b660249a89b0500000000075165ac5300ac655228ed0300000000095365516a6552ac636523573ccf00", "00656a53ac526a", 1, -24853672, 0, "9ecefe6fdd4fc25a52b51bfaa808aafe1f9d8e56c1cd3bf818f8db5e3702b31b"], + ["030000807082c40301f8b86e17a2ea0bab7aed4253a76aa8bdf0cd23db22a2f696f027967e503a3c900300000000fc78a108028ae6d80200000000055251ac5251e8134004000000000600516aacacac7871382b0000000001f5857202000000000000000000000000cfd2c862a19409efcae4731fd6a95f24851ee415b88fe82b1f3836747f836a3485fef9f19bc7ea9f1a4926a3dacbed2428c8efc42691a30cfb88b812a58de6335bf9c020205a6100f5dc25fa7de401da9e6885e465ae2f6323c449c52ac6da4e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000068aabdaccdaf7bbb09a6261caf7689e0cf218c96dff9ce9a93cbaebad794ea7444f10d132d8d18aafe2bdb82838d69836aa5b297907337ec5cc9cf01cf2df85ec32ac7085f3ed4270c7970bb8831762da12588b1085889366d47d418a4dd4ab45e98b1f1a51f41432eec344d965ae1e518ea78c4b71350efc81029ae552e8aa0030f4954f53ed7ee13b22d523bbf7964f9159af59b2a02fa411fde93bdf89b21b5021e70dd6f20a92411ae24ff5081b1e27b961fa143d3030329500f671cdc6b46db0a08cfbeef680a035c52701235b842ae78d3d501b1ff95f8747d89ac6886fc9851d5eb8382a2a8b7b46637d497926e04182d712a8c630a7cb47dfe347b287d103b0313523bc47e5139a50df7f6f9995714827c94bde7b913f0ce9c06c8e80662a2840329a847958bf0cc5d723847935296de1e2fc72b6fb09057db06daa37b0a26a782030b18663fd9241fdfab4affacab8e808108d521d11394b22bb4846f2420227ebd030e12a41eaba87bfa5e262f7785da47731f799679b0a9d1aa7a6bbb8a88bc9d7c032d51f415754c5efb63085b50596f3c8fcc6e3ca949a61367b7296babdf0e06a3182a36789909afb45b8c7a463a594d2cd00ba49a22b8563fd5f24aed3d7aad7886aabcb174b45791937d7bbd6d5b3913a6d1108c0ab2fd4ad9acd67434065e2636cef83b779110286b84556ca5a28627e39f3b6ae881e45fe194782abfbf90c905d28e84cfd65d91d954e4b9ebc9275848c7eec311ff28a9aed86f9745d9a8ac2532c3f678312cf5ae2588cee87651d9e92990530ae2a783052e6801e263dd033ac231b380c5f3b05186036019430efca03c9cd327d44f6bdfb8800c9fb0fc9c74d8a9b98b58967ea4d159fceccfad232e39484212c6deb18a888691ba332335e839aa00fc6e9864470762149afca4dab892ce763757f8d8df064449752d628d5146a8dcb0635c8fc81f524207fd31c4660eb059611c76df2892c130bcc63a43e0b67288e00ca6f1dfc5251aff06c3a0ee991d754608e8ffbaf86ac20bb83d1e0ab02ff949468613f8600bf79f44a3ad25035bcd65559e75083dc18789b041533aa741dadc39d197dab56a93af28f6bf24612adc682bea54dd057f62cdae4757680eb8f846454dd97c0567556e9e858b84efb1b0839cb6009a196e1c35f93ea99586373983a67de3f1b919d36fe52a77c4193682b343c8ba7b1255d665d195145d8f53a988a8d284d32dadbdffe554a8c872621cf3212d872cc4ec62ada9d540816a0971a299adf7e1e6a235d968446812f4422bf08742598f8d22b09c28a96b5b0fd875184408f6f86a45140855399c076b64eff21a30fb6f1c6fc230aa2ebfc0e18bca56720f93f18b74f65c3315666c3f317796497f40ea369dcb369706cd569005a6eb6976b0cd839ce1af949305078ac60b96e49835ad2eeda7fe469b78df83315aa011401dcab14ebb3c36d4b5953cc4962710b27f564b53e8b0ab8156eaa4c4825ab9fa85ddda318758793e408b4d84ac4464a1043c8ad2d8f29970309eef9c36ae8093ba111257e149ce0a2b3730fa3f8926ee2723db7334b0769c83f6900f13f6e828f057937bf8ec3b83a0a6318f4dab59f322bb7e144ee9423dea25a576076985671d44c285ddc63110e94aa3138df38e3a61e0d069afbcd508b5448b7e2d35ac1c7e7560912a0adb1eb868b68a2809a12f1b9f8f06a9bc4ec62c88601e0aaab6e0f462e6d7c805e421ac7757933859b5e7511983c558b99bb4db725dd4ffad3275806a7501722cbf251eaba61071ae4541cb420b9ece17edad3ae65b668dee111ccf8173df217643682c0b1d52c92d0dc9e2ad78e24f929a942616345b171e690438a4d9dcae8db362fbdc2415f272cd3c73dec447701c8fff388feb1b39d882cefaf28322e15f454b550cb4dfb25b2cc1712ff71aaf1a3354070d06119a7715ba3539b837c06c42c820e3fa4bc5806f5b8737f3719142e6155d6f3d197d42a4a65ffd7c8cb2fc9980b431fb7927d1ab139a8366293770bff87d9d8eea976553ba98d6fd9809c9c2643b1b7ad69a1d48a2ef13da479d6fdc7132de60f832ebf91c748d74a85a3aa83df99b76f2e75e3f7249921f84addd6597501aa3fc3a68f1a2907d994c6c550221e223e08fb9deef3215673be38ed002583d4459af4ff3a8c2fd755e9163843258b889978b76c532224e27ebfd833d6a20129bd8b154e83eb114fca364151be3075633ca90bd3864c2d7523a15414618b688f4491329af386def519efd925abfdd4e146ded5e1e12b7cd82462b22a4068eee51e63b3395f03d95f35f3083df7c71bfeb7e4b48432df00b8e5aa4c2090eabb88acb0bc9a14998f2cd0998ad208129b0b3d021117745c631f18e691953c9e6f11080a731971e0e9511435ea68658157f5809", "63ac6363006a52", 0, -11369027, 1537743641, "47443f3b578ad952ae9e4c269e18a49bea27cc9c37d609af435627d3e748a2ce"], + ["a0e6d13404ec93144690808f75ec6522f2f3affacb9c00f03c4675e8f163af18e8f126c7fe0100000000ffffffff652ab77e3eb29efebcb00b19aab7a37b1ea3cfbb4e9595792ea2f44ce7b4ba6e01000000075200636aac6aac449be548fb11cd0c5caaba5b2e7c4ebab20f8d829574355ebaeb336370a195f3fc7f46770200000003535100ffffffffada58c0977a9bdb325a83a00b47ea4cba1fb77fb4532312edb5b48d0e4a574b701000000036a5165967347f703a4472d000000000000af4fc6010000000004520063536e76ee040000000007636a525365656500000000020000000000000000911f2f0300000000bcbe948e2011255f5839062eb885d0e200ce385f865ce4e2c0e694e8bf93c3bb8f4a8fe03b9b1dbb9abf60d3db5c652c6f4e3ec941db5b1ebd344e09fc9e56b07ea1d4fa1177d7e11af27ab5a4872e79c89238865693c2b68b4a43019b6c20260000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000092ad22e5475ac720324d84338f97a81c1cd2a1a9f9cd55cfd6681e3ec1aae35700528ff334cf9e141d9f5cb40c48a66bf93e400b8abdb760cc5e064b9b432876cf45ad6c924653eb39f65473acf54528d4112c9d31bfe93414c36d3fa4e420ae272eedd429c03cabe4679fcb761ce31081ec5fa4cbed88d7bf96bb8363329e66032cc015b0395f5c12b63d3783ffc1ee2f89e1ec9d00eb6287af8668716687f9b9021882f7e65e70547d83c0b54e18bc7a5ebae8497f28ecd98ce2132e99442581730a06fa1ffdc567c1cda4895c023d8ff61a7b7fea89619fd4df28a93a98971738e40be43dfa8718cc60d1309f1d263fda74ab812b07f87daa2b3fdaba7ffbaf1445030cdd8deb2e67711993f03fe59061e46a45847c2f1f33dc1bedaf677be4a7c485032ec9a8b0466903d10cf30dfc0e446685201edba2ac47a8b53cb44c59b62f0ebf0324cb7c537e8c68128c009c1ae612f887488b60678dfa70aeb9ebe96af83a653803274da2a8bc3a98e9c151d16e3bbb1fa1b6e0c6bb2366c42a86dda9949ed87b3b0328aa7d9ba21ab86af623f7dc2e9c81711bc93433894e311f68bfe24b15d5119ad572ed597ee46fb0ae44ede56af2a3f33e8f71a6ca88b3318313a7c9e1f3ccd8f774815e7291690d35c1c2f04be001a539b67bb130937d74fe5228868bdb73a17de211467d21fd1639e4b7c81dd90ed3ba3a332bedf05c50f8c195964f85191ba47f752ac7d434fbdff2fdaa099ff39527e930c784dfd574e12dcf6218953e8b8f959214587426de8ed03f638d059e7d7fb8f6d6c2bec81ebf29bcd52632891ecd6fce58059b7debbe302703ff372ea0f698151e84afec782db2fc8c4ddf5f5b87e23f2dce38753084701aad5704beda5a56eb43b633351ab872e312609a96c7fa9977af97484560ec4354404a8a7897224fc93719c9cd535a58051b34547d371e3a104e705c716791433ecd587c864490f52b02883e3819bacdd3bd714fbd7f7368a83b71583537c852cc746b93716b4061b8fd52c16d6ddcf764da9ef3044c3c69ec3f4134491decaafdad5bb8cef9755e4b94557e40ac631ba9bb3ad592ab0589ab0af927d3d329373c4b5d299d2a778eba9c1852001cd8df33f9cbc253b2a29421d0341453c6fbbaa4116fccc0898cf89c21d11fb080b31c01bb362ed3fa29130f72c1592a671f05a97564226bf95b277ea45d0783c0ac512a433d94e5bad05e7d51854ffed34a07b7d37c30f0182978282b515a113b4c5a805bb84a751abf1f4e163435e69368a33c4fdea29734758786a9216048bcebd4514b57a4ba02e2e5a1656b7f2697e868caa8de6a9442f2b25d609a95cc99c98de2b33d9a5459988d3203172bbe09a3bf971659e9368fefb1db32947ae4253b661a3d98f995f24f03b14758f1c46a77ec8f22a65bddc932e5a4c488b2a4faca8aaa3cbdfb1c1e4f3c71834027f1bb20802144c9c5c5ed6e124c72d3d2929eccd6e69973c2ae12cb9ae26a5d91c9f4003f14d9cc7e276439787de687b8f86bd016bc5a0868fbfd8076499cefcf4c15ea12143c08dfdda0fe5defcf76bddf223f27973f4183db66e72442bcfcd4581a186717319f7f508e69304795655336babc1cb5795f11dbd5f4d4adfdd25d340d30805efbd3d39db835404e9c60a4b91842002bf170f6c88a701eef4c2514a2267bd3ecc221a1bea30dfe74d160b6485e5ca9755debda788b31092197257043a475c161e2fd97fa14270a34e39f55aeccf4ebd72d16c84221821b5465c3f91d0bb15b77ac87039305c64744d86c868891a857b186f4befce3e65587136bfa8c18428a8c5a022619cc223ce4d1c9238f1c6c5b9a9acacd6bcf7214571ed681c833bd254aeb773d66228e9a56c3830f72a1ec21c9c50483043d25b3c5ece981d4a1cc69ce9e10e693954d3b49b4744fdff1fab751b9b363b3ae324209b73d4c4d09386553566040744b1127afb9b56a108aa1b921a0d13f9fc766b8ddc8c2ec3492fe5d4dc0a4c53cc983c481fc76f77ea5c761a221c611ad304769e27d1a798f26cf8aa15fc5aab93d55fe3c501a3ccf2821636986ecac354d105e0137aaadc894cf4b23bbe7f5ff589ba7497d21a229ae4315809f09fde49293ce9abf8e3efda38e0b90af1e4b97d3e1e23b087babf24cfb68f3f73266dbd2b42a580ff2a40b335449e41cc054d01fcfa7ab491a2a59a1436eb746021db34d73d963990f5ca6e84532c1ce996a1226041abbc62e6e9fe1c1b0181584caaa8bdc5c7f91474ceac42e51b4715781346ad3590000000000000000f6d3ab010000000084211def079100a7b36011a9a5a887619ae3d111b72a1e8fc864b1830c2bea935ef070d0447bb205d515d00003e9a402dd3c1c551195107879e507af5e1ac5699ae97bd753eddabbda37a64a2bf0d4bbd3932e59568c77ae62600eb1917d24e7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bd4943fc42831d007b6f0316e07794d163e10123ae0528b4e0e43a8c832beac1a4481824184724314747e0b97b6cc92162eb26296f60ed04ae22b28d53e07da9a28b2c6a940d682a75613062df0586083ab02d1b5bda267741757da22859be56e47df9fb9a603c5e351f8ad80afe6131166205144cac9c8e02ea2ea483b4a22032eb42d16db055b1962ae71af76939d5f3ecd7aaa79b43bd90b1b2c1816333c88021b8d3740185197e0643da783ce6bf74c94c16eba81073b4afcf887c8237240210a04025e6b611ef1106511366f973d5b0944c97468da1c543cc401659f4e90fdb26250872c394b99d49d4a98c37a4325c5c0b06f14d33589cb18889b7f578fb00b021ca68433eecfe3c9990edede251b73466f85d462c8354e0b887ea0dd2e6eff7e032472074dd9255d663a51add800c37cc71f2486b5b91f8ebfbc5f3848149eef0a02157fd9fd5d373221cdd9a8b78e7fef0d3620a801ef3e77d5ca4b030c4801e10f03186350a10dea8bb3d51ebe7793ba9108c63597f19a651497ea7f0f686233a2ae020659ca50e1d82adedc641a0b24aefffb7ec4a907dcdd10f73541af3f1a537e813b3d2f011a74f5ac927fba3cb6ede9368e28071b2953c0313849b2c44a5699d65f197ab572243242e3bf468e5b20e6ca809f35b987bc000cb6e666a41cff53204e9be2b877960870cbec8dfc41e8d2b9504e07670414b9914125f7e8e89b31f2c418229af258dcda9580a21c8b00a8801f766176d5cdeac2e68ce9ab05f1a828ec1aaee30af3e5a1e67980271816fddacc5383fcdba290f859bd062d13a5e8feaf5e942abdeb0213d9458b26ddb19eac8ea73e7a775e8b76ca7d92334ad3adcb7365d199e53eb799286c90de246e0fdf30907a70abd62d935353ff1709ef35ffbc8c75a2ab85082e8460ab48e876eeca13287d5b97fcf5f266aa65425daf2331771f65eaf8487d1a09475e8d97288168625640fb4e7ca44e90776de4b0ea95b067611f18d31ba3a18308e1cbd96f0b2d55e395f6d3fefded73d8c2e9a9b11b05e3a66f65a05d707d7ec6243eb979ef50e046d4909330e8d9af204f3a84815a01883925d4eb128b3b7d18e3f5318aef75d13e20f1d645c9df58f778d2cd577d761abe10dcf4eb61c973da026c12a5109e50f98e4ebdbeed99f18aa74206585289ac420c13968c2c79c89a8aab59978fa5889b3d3f7bea9bd5b875e238044096dbb81067aab17f6ae451d18c7de325fbdc5e698bf407286db8e0e38719ef69114ef6f2e6e1e17fe34b442ae571cd9b4a9fd23f742c6f907396b0cbba062260f081fbd2141c8a39dae39705ce29e55758937d6d2288b13f7d4f353b9e2b442f8dc0f82ed08d50683fe7f55659d1e45263a526cde6b2e7d03889c0cc0f32fba09f0257025ac1b8f5a898c7ba9643bb9f449fc948f65f52506b572a86ddd818518981d2f40bfa53b8d9da99649b77f86455a6addc89c5dc9616f853ec5ec7b7cb08375b1436ed2e58314aba0ece7a78c9d4fb1c907c59d811ce772050ed932898a9e693a7a43511a54bb96e23dd342f449706d6bda7c9477343c2d6b7125a16e0f2cac0f5a93b3e5b0c19fe7c016eca158cacd95ef09117e7c4838eed65521976a141b9b0a834eadadab4d1ed75b9799194e11b8f9bc506238205366d8b9b3344021c178326029a47df307470f89b64b7a9a5a4142cb6ff219aae055ebc1a0ea7353fe4077b6e1592b27307e91a2e50b70a8828ac81655bd5d8620901286d411da090bb017e084300b634ecfba2cdb1cbc448f237755f2b2412268056577b418d13896e7db6646b08b4716c404d24edba62975ea20fbb070cc7912d9ede3172428e62c4fe2814cbb1ca1a95b3a6ed4a6abebd6c6d9132c081ddc403c0322475967aa5d547d6c458d7f9431e2cdf6942e7146ff4fb37ceae0b6b54e4ed34412d0b3cda8fc0a89d61eab833d4e25ad2ea426f11025ffa2756e3b4b1fc27260a99f4b82f15b77dcc67eb7ff7d48ec84714e5fba9f737aff3b0b34f1e09f7a4e1d1fcff277553fb525b079c0335870802fb4624d4d84a1c8ddd21174e8256fbaafd11800926a634149b9ff18e1cd67713c8ae2183c396e843610e8c46053a6477d95f315add0dbc5be9ce619a025271148f1f8bb5d5264fa0b944ae80c7276154921d89665b48a0a751f8400edf81fe1b267804a4b11a5138a0a090d9f8c69592b6602af57d08570bbb590ac5f2faac32cf38c3679df4f59ad8efe9bfc75bedc15bbefb6ba8c0fa743f90000b0253ac6c8e5066a44a7e9718a00bfc7578c409d72a09098bcf0411255983f7f0970ffa4b272548deb3d69cc48f7882041e73fa7edc24b7b5f45b46836d9589cb33a20cc911bdfc030bf5a27534f9a48d361ec882e2bedc55114a64884b72fe7c5f49f46551d366238e0d", "0051656300516a", 1, -55310729, 0, "d4c8d09e3627d479a196a7b4a8d44561e97b0ce4dbe9cb96ee78bc7089bbfd2a"], + ["030000807082c40302054c2a8476a3682d0a30f4a0ef0d54f84e9409bb952568d9bae308ef27cad73300000000046a52635171dca7459d3bf071121da104f39783323ed59e79ef4957a1298843122f68d05754202e4703000000060053636553acffffffff013cf1c40500000000030051522c0a4e0100000000010000000000000000e2f4310500000000fd451d31bf4db28401423d5a81b294461a1a4ccae523b5b9892cbdc0dc4a3a7a261c0ecbd0514825ecfc6cba66bacf472d6ff926f98395d9acd15239d9e833b69158503087e519f40557fab572003605a3bcc28e598dcdeca428baf8f2dbfce100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f58af3623514aa73eaf5c55a844c1a7aca5d7f9c34ffd50bb11fed0e7c4d46b8da715a493804128f9291ce49e006ff2b65596f59ace9cc0d6e42164e85868ee45d6114e6c71d87691b402c9a63f3dbc620bd07f154a442587dab78b4583fe8b9339bfbcddf98943c9f37e99f9ea80795995b711b3720483bf3fc88217c521fb70229c71893b2cfa5129f8732f1d9ba3f60bc10849dd6a9319acb9db457b088da870217f98946a7d2467a637c50f5597fe18e3dffe892ac5ce9f578562d1a38d8f6d00b080c64ff4c06aae3406dc4ed266481c5e4e8ff344cfeb810315a9d748365b8e14895a2911b103d1ee0c5be556ed4b767e517600103b0cf05d072814b38a08d9f022ce3c02c14a9bf1da90bdf09365dc4e5cdd012dbdac12a3d6212a2ac4130c60c0325eb3ce6c122eed6782ec931beb57f53680759afd2306cf47e9bf37df72f4c2703018442a8e8d839ff098a061e9b20ce5495c75de8757916cd84f32dcbf07013d203037dd472012efd5cb1b2da083603aa997869e90cf4e77220ea14ec673f3fb01602148f46fe04b4515e25dad0ab2ac284173fed87c4d1e615db945bec67141e8e4c8b41d088c96a8ce72eb7f506ba237028d7ad10f0ba73a4da2b5470001b0ec0db31e706a4c70c30cf2614d1cbdf27fc192e7ef3b06d99df6828086226ac2fcb7e937ec84569e7c7a2b15a97272f68ee48f03b65730c63882df5791549578f56147e1e291b0522ec2690c6d331f8ab7f145969952451e1f9d05a1d4f0be1ac854004ec2f0a682a9b085a1e13b43842ea723ac4e00e5c6b2a3b4548d1ef79bf7e0099b481fca5f691482702f32415d61ff571bd26e20d0774d79e20c21f31d47a3946f014376a2ceb1802368864ea19ebaddb2968f6f75f17362ee19f0acd09d6a429c362eed411a2d0ae2c11965e8852aa83e74981a9632a990fcd7cac2ed3657642391c3e68de48c9fc6997361d6d87e170e7531561a9ec40b098589aec10d9bef74cb605f999136220f69b098a92a7e8aa271d9f6b8e671a0a65704710a6ede9da939b8186b79afda8e9a90e9354a0794294a1c8e14d6f1dd1d83a05acf5de140da8597a0894271989463ebcd01c5746861c5599bf8057f8e9de6a2d313b51461883860869bde0f0d5f6b23bc1d2837e8e84bab125930eff6f27bca926f3c18e88fb2b26cc02289179c4fc039331001be4a4c45580afb169452f84f469cb6671c6ff012a1fa3434ec33ab30f3bfd4a69256fc8eac3c91227dc3e6f9216bcb9e7c2cf31ff36b329c2eebea9af4f1adcbebba993e1946e67317b47cefe2dd0b41e5b708140889650d7f9f397210226b027831867225675d08c1c172cc8e6432895e3c296d84e616de52284e4040e81f2efa9240eb84b814fe1ba968e9b618d997811d8bdee12f587a0622e7dcba4475fbecc2f1c2ce44c1a58edbb9bbc93aa3392e1ae0026ece50fa67caf5cb3a198eaede8c9fca1c8a5d5eda09bb0f9716c3e9fad91273e853ad5b17bacc2ba1b93f1bbbba6788e45d195e2072dc050768d69bd23a5048eca55044e87073de1770a0d86434ca2f23f5310477376b4f3092fa2fd29dcc2e95262c53896eb471cf9f38e7b4067b106953d3123820dc319f6dbce742b4fa444184a13c2a1b81242b381a2adb16c06ba915b62c2842d5f7ceb3b8b9e6d265e8dc10332b3dc05c9573e65da5ddf719d8822b79be793a1eae3fa3ce4fd1b1759fc8adc9fcf4f4ad34509bf2160242193e4a8d62c34ec3f812195074959e022f0e8a6391a520417c9df9b56435180e931b2466bec99330bbd3dbf95654aff9a57cbe8672cef408146b16f6a554fb925e0c3afa1e118c402ea5138923bdbab22d91442290e9866b69eb3ea72ae98b37738c28a23b5662d1f08339728bbc61a7e4118db7dace74a36b159562a2d86b926201e3cb57bf28d3ca26cd03a524976cc096b2dfbd2f0207908e574df6a9a0a4a8fc337a17b072398ca8c2b9b52a79be0f5646560c7f47ee9b6723815e8dd12bb9247a1965021ac869c8d7d560313f8d512a874a0774b2c6f1ec559f963707362de87cfa28432939a37c2ce9cf31d088a434605b188b1fc6745af46f2283634d84847b3d9fde19838a8a7898d3a9c4ba25b9cb70b94c329ecad40d987a48a26c52802120af073273f6a81beb1b10075377d14e396569a390d4e8464047ac99d4d94a7810dda8e6f2cf98a4106299f1ba78f640def243ec388e193a4b3cca0aa5255b68fa2b1eab6d64e915dc95870dc8cee11dbc96d00ca2a2104e027a817e4d8e82e507fabdbe4bedead2e99f3b14f81b0f8f55e20e5628824583d037f131fdf3037c24d1630dd5b7436fbcc25e9b1b2585e7e583f042b178deb489062dbce0f277c2f4802b2acb28c2ba1b5bd90f792b16e454268acfdb18198b0d1bbc13201", "6565656a", 0, 553886861, 1537743641, "663cf6498c2e88b0ed10b731d4e185e04d9bb60155645b5cfda5f56313f1de59"], + ["d97a820f018d74a9850f384996ca3c69ef625ae8afe2ea2ae84fdaf109ff502beced54f8c10300000001acffffffff03849c4a0500000000016a87619f020000000008ac5152656352636a74931a0500000000025365a53f86920369292804000000000000000000000000b3eb3ee060a8bfa32043be6c6cc8ae2dff13558ebfa3284895be4170caeccc0f4f0a160200c533d00630356c1ee0ed4cc7382ab39348d23960b5957cc9e3b728f1140bf7509384dee00b79da948ef8a5ccaf7d7d3ea60ec7f6ca1fef1412d3df00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c2c24b3b726d1a4bc144fecdbed3d8fb72025210e6f6c0fa857ac3fd5591f5ade4130291d870d9adb554634c746bc8e6d9849df0fb02ba1e3cadbfaa22137b6d6b4874dc25bf932c89f18a5a742d3f887980093bf193d598b2d2f908ce3762b31d847a72933ae1e74e83bd48f4f75f76ea71dec244ee619ee883e2df1d2b8103032e8e5fc2d93161966178d2c43169032317e19c5ce3fa5f0e6697dd0105baacb80204158b9b667c2383a916675204ff6c5f7da498bfa1b756846e5b853bf1c58d760a012f4250efd963928eac9980d8fb1a0319616b97b38a5c9db889f12b450dded2df38e6c9da1e29a84d679730537db5d0c1ee6c912cd0b3023afa0a4783018dab0225a3c9abd5f56a0456b7f76b0368802f38ede96328f9caaf03450c2ad436613803214082aab924a875a3e60a666cf85ba68c73a2f1a6844b413c7ccce0beb3e28f032141d987fa591e19487b6c38d50e4854610d3d61a27013cedbfefbf9a97b02ed021a8cedc00b8b5a4e30d6f928fa9c34cb0947b821b7243b5266fa6b64b5cd37cc031e366d90141dfe44a3686a83d1588db4ea0243dcfe5062981fa5755ed278e205820fe1c51571ca51ddca9402d1fdb021cdb3459993c6b0fbd73fd5cb10d86bad333d0738c312ab22d7c603916abd84469b2822e3d47127018fb1187f43790526936ee102737b832344428591f762708f31dc0ef57da493ed5057aef4cae4df02472858088cc99172b865cac0898931264d7d9f68884bcb88011dd29c2c7d3cb07277151902a4521a9b2e050a1024ab6a99b28c6256bc4fb0ca91d50dd9b401eabf35edbd725d4026e2739f96a57f2c36b62aafed031c04b28aac3e40ebdaab00b3d4b23213fe42ce23073de2d3d4cf5a30f8f51cd9ad2204d689193f5d83f67a8a0ced59b61e52c432b0555a0f7ead437070ebe6d1d65d0434f232193a5182cf66ce36e07852ea58170b44c9729cdcba72f18e0eff09ad66b097508141077b0368656cf800d43d94331293c11602e77731da75632d17c62669613441d14647f293714d88c86b901b3accc557c28c421983a0a204ada59c01096045763aade80654d226ea140a51ebc6ce471a5446873f134cf46ec979921370db8696320912717e5152df6dd6962203950b039e39054735b225ef20b3bf232cfafa99f51c86d94201d03418aa9f9bcb3d3d90fab3d1ef24a7b2a5340f2890c162297e80d4deb0bcb88316a438746a44a9ce77178019dad06b4a4135fbbcaadf1bada76f941414496e83cbd33d9cffbf7e4c2048e0b9db2502ad4f9c3fc187277e54479253a4d061215f1fdd330f11c6d9960b4abea0b0c4a174a5a722915f301155f328fe656457d6835ef025495bb59e7ee7db2d4277b52b17506fd70a424c30475f9a467658a5a0a2d23f9092b91df5ad1c5d68a0e042f0c8b8630aa67651a85fb40ef0b55efa513f018ed936d7c7a858520eb28b5188e979fe1154f94b55aad1d04ad53400e9a59f8238009e096c7516473733ef4616f4afcc190f2d9b81ec87f7fd6bd2e4aadaac70dd267cad08db0897c8812aa2cc55a0235d66f74dc32fe7414b99d0d57c09430af187e715c087913a5c87583cb7ab22a1b48eca9d250ebcf8cec3557630bad6270599d7b791082d9d55a2c37a0bea5cd5fd7ed3fb0c4831ae3ab709c81f805d31938b34221d1b317c332d1db3128ec15e3ee4dc58c28662fa64cc55005fe4e3b3ef381216b2dc51302622f91494411ce6264453d513273ccc8edee1b0bb6cedca413850ec0f9dc57a46b7d5f6b399132d09ff85486fba4c71c53bd595da1e287f6316c17e5190fc9240e5d7fceedc37d176804a4061f1e66c489c04dac50112d1ae9f00522a5edd0ca22a60a0aba8d754c182bcb002ae039e53cf2a3ae7febcb05988f3ae8b529f42a8f24418d777de9daf6d8a8536f1bc778bd252f5ccf603698cc5abb205584870b3a8b9fe330c5b767f7458100aeb02aaf7522cbc9ae06a4e4f53e74c8430e858200fb06c512b6e9202749c8b2157f79ae8f29a8f716ff5f6329991f3b7908dcc45c89bc25e98daf86ee2ec66e8ef84e9ee00431ff907c2976093ca3bc588a082c8710ba3b2173d87f869ef2b25883385664bc26ce319e814db35dcef49d4ba7a678bcd2df7a0b28dc7a139776601b4770d48eed199849385acc7e68ecda027c5268bc123c52cda4f9a31903bfbcff34c84ca69f5f383a68bccb5a39616eb9ee47333762861f4ba4acaa2e69db6ce16de47341ff14b9de5b82c0023ced92f38ac734bb231caf451af9005000000000000000000000000f43acbd63a16dd7a99d847e634369d884e754c6fe5337c4f19f5ccf63d3f3a9fe6793f4ed3a6c63c64c4fb971febf6fd49abfc14758589fc64f0d0fe4c2a6050161da445161838a581666d8017dc223b3de7068010d5008eb5822529bb5b031e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040b769715e2e331e750b42256706b356d59cc45c408388eb726bb9dcb6aeb26c58ae87c1f426d15fb15e5f99058bf08dcd65bf2fd8c7c63a4fa905a1c95b175825370c172f4fe903f3e7fff5e0f8099ad195277bf819d4d6b10d3479b6a4449722d1593774211aa0ca0a2dc178917ad4394b5509f6410fa002d852df62042524030f0e92665d75ef11bbc89c6b620a1933bb8e7b0b335bf731d20f1e9bb2cace35022b5d3b09e6c828851ab0392634a10fa441fedff0c5a36150468f43ca0d3476940b00d8c7d93cc373fef27816c0c62f02c94123fd96f93c498eb9e28726271581db83ffcb5bf28743c06ac14fc848fbc8e71a4f2d4a27f82406003cf078671ba7b3022f7f095ce45f83c823f0471e3a8f752cdb045a04d8fb90fc1ebffe134ba396c403010665497bc32ff7a1589ea4d6ed2fb59131365b9d96aa6b79effc5191b3051c0201c15c2ca4774aaca62eb527e9aeb01678d6522ecbe60079d7861442e7ed9e9e020c03b7030dbc76448a94ca86b34ac74886ba836d47eec499eef526482d7d30a0021e1f96d478379b98df8682c45bbc73bdcf9f27c8fc5b68a5915d9bb1d95068a4e822b72b543a5bc1d8f04506302b0509ef8c8cdf687c34cd36ac7b975725c464f31277e43c8b3fd0efb1b8a5c688111e1090f88762c782ffafbb89ee82a86eb635a6cab99d66228ddbe26c5cff15559c875353e8d76c9775911554acd0bd03823bcbde98d716d15cddf7d2e73029c76aa348116bd8e6a4c4655fce8e3c6c18e99eb5fd6511a4b798cda6e9a7f9bed90f849332d8d58125d00daff4d5276ef855dbb56f72dffd12e5bfb023f7b71817f51c847aad80787e15ff0e2b78c06929fab3ef2dd8f8c3c7707d9d6e215a0a28bd3774045109af871c1392abff37d10646bb95fc8faf06f619dbea447e23577e7fb597a8370c6f50addc57e1e6c6c4574511d14740b6be0c485ab3ee4d7ed0042d5d244001248486540dc6cb0f677a76fdf9428007190206971690f0e15027c9ff626c0bba862a67e2b15530161f3a93f3996ff74879b8dab5c94083ac9ed690d8689d38e35363d13bddadbfdc3f0759a6a34ce127380347a43e3e2ec21e575505fd7370c6f1ac9eef2dc4f1ef11b960beaa65812ceb9dcf822ed336a45bf8e5b543ba0b63eada0a68c120baceec0ee1fd2426409eadd4e8489ad7233f1d393ff6ec864347fd8fdbcf0305996d8aa37e42d0298672c6692fe36f4def83892a7cd168ce9f5ccdb243d4919080faac2045d12b14a56defab8da9b4a0e5c6c36ea04ad585c37f0c76c29816f43834ae3cba389dd594887754ee31a10413d39978b9a5eed75007db70a28b4b66f723cb94acd6906bc94c6c3d14ca30e02d3538076d856ca809498f8778925b6a8916ef1b720d71d63553194ea47fad39dba29901c334810c9540ade8f3403225a8101531a272afce58cc8e456500db00868d44a8702ecaf15c05b6e67c9bd406aee319dc7f143380799156725863b7aca2a402e5a0bfc88099c713d3cee3378b18bc3ea4a4cb601e6384fbc2fd774f792de2f240c05f66430c0c8f0115940035ccdf0aeccdb7c73a3c1798003a3a8a2131409aeb3d6b937104537bc18a26edd7089aba641d849c2a121b85b235c6575bcaeb104e901965d7c6d036fb67a5e5536342fa651224420828d0133f6e224ed0cd572d7ae1ed0753212db226d1861e50faba69f08794071459adbdf65f4320e7a9a2f8782c9a9254b39e97906b165afca6ddb7ec4e8c47fbf0572db047193843673df4affaf3e82f45805c8c3c1e8dc0bb5b56f621d83f899c19bb015b5f0752834822b09a08f545e39ce4930bb8e998c492a9286328a447f9175ff056777ce60a43f6edf3fe9cf00f55506332926216cb4a95186a457816948fe77b3511b07e66f0d40565598728879079d1ebfed31300822eed42ef2f674bf5fcbc5c0589d65d17d53a0973f850bd6024b8693b3de0d45c4fb9cc72aebd83bdd77fe45d66f059fe57c7ead592d36b2b1ce689585b084df5b5411feca017111f87067278f2b6f2c6b96cd1033ce731983433f9d2a3195577949dff3e7beaba95eaa0589505aff17032b7bc1bca55974bac6bf3257918079298f53836e96cd215521277ee241d644b6bdba20b076417446c1770f04bb75f0ec2edb418851320d2a3e077ef71fc28138403f3d12291609fa907530b8711c6bcdac7cc9f54d8169929e569c6ac5275f176d181de07affce274da207d23ded67f0ad09b95d3d9df45ed67297e98936e90bcd6e8690ffc8725140100000000000000000000000007c8ac4bb8fcd15da1d105fd11be2c8824104fcd4e0c31722c3663b2f2e5ef4874149c8dce5a48b2456e8806d8df7562c783e2570966880beb94752111cf0d2d9d408efd078ae0f2d83675ab27b191360562c6adcd6fc054d9a7a9688fa8140a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003669899177a6e6400805da4eddb1c8a120886ce308dbc4b03ce1a09904c91dda47875602ebca496dc2afd22ae12a9b32c1c4f6a620b56e7197c34524a378e76e60cb3ec605d84a7b60dfddbaa0aa2208798822167fdd3910da58659dc4ad67eb6b9f512ff1634c4506cc1c65a2c081d87233644f6ae237f165e114ccb298eb25020dbffda8a5d54e9bd6a7e40f66c291f58b5ea7f50aae8708673eabe45aa71be80310a1590420c0e43eee7be087c908103be692a992592ff1f2deadd207d8c2738a0a03980b8944dc049cf3fef12770f084647337cfb4bd0ba4a24b6f42e9e171808880ad1f776d335c370225afcf24b443b3469371b72e21a61646ead832aac9b1e9020d01e927c147c28c9934461d25a4996dadf42cb4629af40c4bf315e2b9eb3800031667d13693043c0b158565cb55904b8c2a3f677c274c1d46989228026488f3c103158f47ed59d280e4e714065d6219b73842c43dfd0a13020c35cc773f4c17062b032ccea187d940e946254f743ff71c1e9c4b552eab1dca0f7b3e38c5c546d562a0030922f814e98988166ddd05ab15961cd495ff477738f72e7b4a73b77d244ded334d7df99383b3787a6c1e4aa452d743865c1373c2b96e14ec3f32604c5f909e357966ce769a79f4dba702fea48c99736872e570241edd83a7029058ac83eb5f985d59f693451e840e22266b90961529d9bae045bb7c6cd73677ecc432c3a997c12f32aba159f60ead7e064d12597b1569eef3cecf4a6ead75f8df4088691eec4e3596b780eef01e662269c7bf9b845cb5692bf0da2b4a48bee3c06ff73db41d64e332188a5f31417b713fcaa775d63a9f0b92298db24eea066e000384e2c41429e058b444c6bcaf896e039db29b5130af526e498eba7af8fdb47fd03e6668fafb88708e593fd13a76d38dc4443914b0c1f902a2fddcc0e41468b1fc36013cfc9bf6a49fd0a0fe209b78722c5322b62de22fd20f1a2bb07881ae960b4859e58008bc6ee976ddad08d0e5d2a6352abb8f0b08f0ceeb8d0d2353c20ab982d4e63621707aea6104b6fb4e1def1c1bff6642070dce52063a36b44ce9d71daa56ac9437adcd849d1302d3e93833fff7739c7d392ad253eeeabf86aab12db31a03a2a6e0f91803f81222e38cabc170cb5baaf05756af639ff4be7916664d53d285d4a141cf880571d2aaee38598bbaab0db86893aced09626a66d71d0908303ee8f8a1d929610ca92901f92240cc3066e5fe779e608d46047900f78df3f42cd923553010a539853e104a2a5e14d5fcc519f222bcac65b89c01c369cbb5184babe4383520a4229051d8bc9e6fcd9296943d762860ebeae58ef49418245dea1024dac0508bcef96ea4e9a8501b0033931af00caa29673663ccefc9586cf64480373affa67fcea0a96ce92b58e97c7bf93f5c8a100812eaa611aed2503bd7c929de8b3029ef7efa01b99bccb6bdb96436139448e84a744f79e34cd3a808c68fd03f22e447dbcc710e643fea5ebabcafec9938f0f589e87ffc0d263eeced5622ae7d432d8a3d6c9632e12eb12243b70b48575851d3b99249a088231faf76dfaca4407525408168905d896261a5256fe3edbbf13faafaa07c69de48fafc0be48204047067fd1a48b7a7875329ddff785bdb9cb1f532125e3d1cefbac44b4a6046d1b05e22cd14311dcc0d2009f335edf3e510cd5c1f466ffba19ae2ee099ab08e36155cbff36a57207f0ce9c92fed5d637e93ecd646c8b29634a281e78b0c616c71819d0b16cbf41592be2d7434e57d9e40819e6e20f408aee7bc7208d48ab8d41001a0c8242c648524c1b1255c147bba1a3f11cc3e328ce127ff17203590f3347f0429ea49c7fce25e0bf70818632faf3e440dd445cb5a1e7abdcc7d3544074c9631b32e29ba28067758564058d67cde66727926a82e99c5bf7938696471d862a0b80cb3efb9d8fa299de66b1a1bc39a6f2dc3ffac427e81ee151d21cf174adcf9f069fd56947e6197ef37a0dab2722b80614c05dce09071771181108bbb17063248f7fb6ce6d631da05fce05c6d01a5f6bb2c06dc8918711f3a4ab058e18bb286870ba3e0e99f038aaaaed98513b8065c6fc97a2fbe70bbc7b75f3acaa2196f6b7704178cc8a6cfe85b9cfedf9259605f555d35172d063cb3609d2c58f1a42d14672c1c093a9c80773b31c7825070666e92e74973ee5af2035353872c97ca4196a3d09a0adc73cd7387d7e67989fe1bf6a9762c1b41900002519bf5097c8b601b48737c0bd7f74211045e5987be1a8dda9192ca797c973cac4e4a28aa01dd5e2933d1c8e68e4594f570c0accdce755802e1fd9c2f723eb53870a701b485c33955c0cc3680101fd80bf3f0fc78ec2a465f767bfa2f25c32b72b3965716d8f0c50d7e3203fa3585fe35d0feaf08f51512399bf61882b72f05", "5251", 0, 1966270095, 0, "96bdba34234c94e0a9952cc891c39b4e8a0351d3e2d481ea6acab717644401f1"], + ["030000807082c4030348c67832cc08c2e4122c23ebbf923675cd539c61826abd2d9f8e2283ab55cd3300000000056a00526551ffffffff3bead223d7840d1fdf2ca3b7ea09b7ed3087ec19f84b97cc97b1bf7b279a765d000000000100fffffffffba232be58749be9423cc38345ca7a4077731bcc2dc611b27bc6500e26209a730000000000b8498862045a939400000000000751636a5152ac5300980c03000000000153ce16350300000000046aacac65e81cb10400000000000000000097920eba00", "6a630051ac", 0, -699615125, 0, "24a62de30e9718a4b82f32592c245e57c5110af864ca7ebbd2709d6cc2b5d004"], + ["306bae660449d8d302515c84d71a542795aa65e5a4c2efb96531f985658b9f00e86ab0516f000000000952656352000065ac52ffffffff919dd6c25d2146cf6d84e7dc4c261f07f7790a1949d95dfba45b14f383a23612000000000865526a516a656a51cf4f2101d335ad47cd1709ad72fdb4aa6b0c0ab04c9a20972971b3995fe2f9c08cd869c703000000025152ffffffff0b8dcabc9fad02fbbb0d1e5d15b18071418848898f77af41b414131b234fc6a20200000002516a48e0503302e8a46200000000000151a55cc20100000000066a52656a6aac0000000003316f62000000000000000000000000006eed2b24cbe2deefddbc99e2be7ba953f4fc24ad6e01d1946885fdaa50c0b994ed89dade8eec460b9994a0399ba216b4fa19d60e581efbbd0c472d384037d69eb85415cd2362330c3e96404d76c208b4ef45c5bde3ca1e984f4797095a55196f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008dd6b20d254b68abca797d19e464514f107d1c8d9559fb99f2c3cab0f3ae21d0787683f90c2dea3c0b82704df436b523fb591a7807be05f2a2e9eb39d231f27f26028db9f3c18dd2c11a8e15e744d82b55e0c15f26237c22ae9e8feffe588d484990a6110bc101bb4c8da5c14d5727378850159394507522aee81865403142e022d47e9595aa0d5775b51d7e1c7a758505147d29af420b1e5cf76088effe98ed6020ef26ded77c6282b721aeac4748a6c39fad9685ffef7822cc9f3eb0512e017a20b02f09377d7c394e214c27fc949a2ecc3ffcb6cc872093c6b8457ecd85f2e001766b860886f851083291c61b60b38790a75fa28d2e225c5b13ea308de42348678021b37e05297fafba334d5d6a81ecf6b0c9d6dd0ea50c387e06b10b50927777339022d9295c391568974e08eb4b407085aeed49d2e5feabc29e4ac8351f00e743722031930527a8e3ec8d05725202813747aa8655ca4fde9b563c3a13ba3f226a1e8e1020c7ebd33dc9e06d42862004f3a3ee65d70190349bcdc74d385c443cc81a553dc022ed8a6e096fac116eab95473350858579a363ff3b29fc528e76436253ef8acd86be686ce2f890c04a0373faaefd514f4104b80ed27e444599e1ebff986b89e751e3eef38ebfd0ebd4c553d7f52db0654088c699d439f59f20a16363bafe95e3b7088aabe85ce63fe654163bfb48ef2acd1a432ed1fcd179efa0888d24d4c5d9be5089aec40dfb39ec6d30ecc21d2da996f3a45934bf80b0bda6e204250b90f450ac0e311e8098da73e3e64239fb112a3d2805c8ff58e4959b1f8bebb5489ae544219facf8f3dd1f6e7089adce716c0327fbce503974f8c66c6faf276c01c9d909c75043630a8753b5c01299c85cc38726e4e13eff264890f6b9d8451023fb77ba0434a086f975dc30dab5ddcfe9784a378268c5bd23328c1b0d919462676c50808e933ed43220021ecd558a318d2b703ae40e82d518260ea9dcd1550ec68fc57525e7b86e951c570df230b8aa62f987ef1f7ad98292860afe744163c21c3ed85888cd2b0593249af458182c3eb53f0237f7bfd5e61e1cd0b1de5b62878efc47d78666ec869cd61bfbcf44ce4ef2b36e7a33cc990b2093b41831caa219be2ba2d02153287d39fe68b9d4a68e51de8951b31d01c2943cff4d3848048970fddb485a768ab039f6cb9e34b0f718a2d3bfebd185b5829c83bb500e778b33c60e189cefd82f42246ab2bc1a274ff9d522d3bbadf977adc06139ed348cb7ce6b36dca456d6dee40574b64e8d5faf17ee44bf469fc51c5920286677893464cc1dfd555b123483a7aa506442e97af3d66ac0a19b365f96ecb192095dda6a83a25b956f4648a4034f827ffbfbe71b0085fb2d7702e9a240363ae405ce19911780a8f29897420fa7f7df1521c6cee38de06a41008fc4e894681128bd9f8de314b86ce0e41b93af2610ca1dc59a500bff238b71fe5de8032d30ff243312e9eab0550f178b02b5377f2be6c069515426ba443c388dc87715db6e8b80dc012bc1be007ca71dd8b93b6d4bd417406bafe65b4a005fc47dff8089b7282abff1138ab461ccc3754bcb4e84f449a0e65b902e0099d4411653230e4f466b62f0e934c211b9f7118477c7e3ffeb9d907eaa04226782fd6a5d9f44c19b688ae64f62a8e3893c4a772c4b220b4c52b7fb43b6a4c210c3cdf316a51e32dfd13f1dc76d04fc80e447d2752d20f01ae8163389429d144a465d0c3b1c91ce78a4394aaf29e3fb486e4578401e4bf378ce3d54a134826d549deb91f62bcbdcc70c91cac36aaffb48bcff5e6c8f33374bce96714b182835bb82e5dbd88154df89355541c4a4210abf31b9ef7b94bf7b5d08cd83fd50b471fe5e17492f3e81a38e303e2c05df13b9b8d277679ef854c2910a6ce63d8fd9e788d811203432a751c639a9953695864e8024571b7f2af3de7ef24852ffdc91c1f73c7dbed2d2cbc8e9ca739be6cebd4bbc21fc7bc82a9af3d04e6701a4205115d3de79422a38cc085369e82e01e0e613a0ca600d429cad723418f3b9896d2d0e20ae6b75bdfa25c534e12075052778fbf3aa987a2babea4e242470e95182be242ec106d86d2974e3b6a6c41549fa3f730497a45fe851ba823097c9d5be7eaa9cbc568fff7e2fc8ce051b273ca2e9e87d47df6b10a35b4c297434e1ae4d44cf5b3d6fcad9f7a035f1887aaaa2346ceb08b50307faf3525edb5c77a6842243bcb5f0cd0027b4d892c6e1e791cefdd286305536a3da20e3493c2dcd2fe32ccbd5377ff71aa013a8d307a0000000000000000466557040000000053eba9ab69b8156f85fe0f3c2bf63bef03476d739002e3004d1ffbae53e4cc33375570388e8d153e1d3dc64d16198e8077083b2831cfec9e8955956aad0fa36915e0c9f6e7fa40eb13d6f122c43684a397521bd57b38d410d26416606febbfc8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d8cec8d09b60305aff2ff5f0f02edf0787e545b4d5997b391e7e67effd1b3f965708a685027daa6220671c5e74a0ed9ca26b3b7da48476e289bc998e563ca6265c764380202c9b1943960f41ca13a452c96b48c3a4147c9313301c6fde3d83a62feb875ffbd3855ff0d5fe334855666e19344458ca3ac224b9ead786749fe8c0316209ef600ca9fe5bd8500f8f981908468b8d09df761ff877ecf9a111e2b1e2f032d2a298b7a68a78f6f62cd076723468776b858b7f049fcd3eae69d74787d15bb0a07fe033e5bfec65aa3add026140e2c8c2460c74536dcc008f90ec6323f5d3f8827093ff32ced9b4b95ac9cfc7b6d128817ee6c0f197e4064fa81edcb37906bd3030aaa8a321e36e75cdd491bcfb212080efe177630719c339d8e89a627606083320312b36725597f4ed288aff53eb74bcfefaa782ae0b7e8375034ec71e0cdadd6a60302abce383aa256816fc68be27e804dbcbca27f0947d3182a7e7c97988847cf94020101a362182aa0b1a06924a87f187e6fcf7e6116ec35e86a610f744491a3e4eb032bd0e16893d48f20858e3b15775babbc67957e1b955b03d25fffe9f2c29df092d817421229b1a365c44481a0aa73383317e6efba3567a290b85b39c6f316090700049b0806268b25a47d1166968c87dbf6d906219727a9dbd8afd446bc5f7352ee1a5948ce85f63eca445d2f6b831cc3883373d0e7903fd290b31c3074b6c031155342b47ebc4e2f6b9bd8707b4811dd9d671cf0d5a3d8dccf310413eddbfd77dfe8c15449ffb0d5e973d6479eac1c65d98eba5a178e7c141f5f544b5d8926cde4fa3e46bbca1e1f73ddbbcb0bc2f33a505655fdc1536d96c13a20710c294dcbd92da37d476971ad1d30a916367c6333556d682aae62fd1908069dfb453bb1944d78aafe0aba4429955a4242f0f9952c9a44a6c1a0efe3f2c4c449d61828c399543e016619796210d92a3860f741ff7eaa2099683f1286641ac9336834e8eac642716fec75f1438f73c0ca19ff5af8e021b12ce13f3341b1557960d5dda8c46aeaa3e88b3a5265272501a76da0d2e3972b11ccff8d3519f13e85984037af5f5241cfd1b8af41ec494a127c893b062ccae99a9142b7c53cc911b7260aa341cccd126d8e423ed9b9844890357e039675816e33e0485162551ffdeeac8ee6a94a65d398db76d14a1f39e24c9f5cbc42cb0eb778fcd345e4abc6d1997f6800dbe60a107d7ce4552a5c3a76474d77fc16e4aba16410fa0fb00056a129a3ef867e5f16a88e3a9ec0c2e9b2df1d515fc22e8391af102c90ee11f61fc35da7c4fa8dff9fa6a1659ff907b828aa6ac607ffb574cabd2ba90ea825cfeecab6d4d265b4560310d3efcf89e74aaa3f78fb92bba13a0f90dc902fe603985a044943e4af548ee35db893c3f2d460f7d03d84d14b8cf0b3c572f021118bf82302d3c06907f1c1f05f4a5d55265c40ab7455c01b75012b691ab8b53c0e2ea52c7290aac8da45f9dde176ed3e4b12d4d77b13800a2a16b3ea3bd21c21e20bf33df2a272432f243dafefb46b16065a10a94abad7a6db7845f2b59b1d781b74327802b54ad1e15f52612903d784b1d832bda7e9809088d68330c7792bc22f4c04cf0ae9762fda74ab6a6bb0e4f6048db4fa997e8f11def7d077ff94eac6e0fa7449a0d275d94dc07a11b2cc0552aed0582a793e43146e21c22d1608f7c82edaa6f1365675074ddb6015572dd7b7f4e94680d7389989a4bd94ac6fbf3c3dffd7a45b06f62d4385ee03d6062ef0aee44fd076ffeecf1e87130ff9f4bc8e98e166a253025d4e1a572bf908fe0525f7905321ef1f7eca15a62e45766a5e94405fadd66667e15576dfab88410ebe35a5d249e6f401fa2173164557ce88804d3404112e7e7d7827f65e36201a080595daafe2ea5abb5eb67efe42df1b2bfadea0b84dfbba92a565bb1287731eba1d1d65c76cba326be984f2cbbfad2fceadf0a65fa61e900bb2bad729191d4b62cb42a2a63d98eda3ccff1a02842b537b3b51d23d7e99d62415ca896aca272b11ef9768387c27eea532ada6925e97a6122019a94e4ecba2ca64e08b20dcf95945f695cb21eb525c4276bba5207f814b70a83a59382032d87704cc6722b087eefa1e12460a3c7203194376c7ea98a8e15401bbdbdc6eb0f837946b36e667be6683d6acb2a05d967819daf16439559fcb35ba86e9b98b60138f8266b3c24bb680d5d6f10485e272c57abd64a84c721d045f781f1ec6e0b9882f0db48883dc18a0a9a1a8ece3907edd489e5dab552bfb0f733684f24d00000000000000000000000000c4e0b1ea13982b3586d70e3375e185c919f05987945670282707261b0c61e6a897be23ee753154c00559b9d7014b99fc313350b7ad71cfd8b380dcb3c665815329fe8a48c091969a8f9f7ca9afa8c742ffd675fc155a9009bd1fe6de54d7abdf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004f708474a0c88c5d7b53e3aa56465a6036b65f5b99312f43579eea2de9782ba5103dd1eedfeba4facb55560f98c37ecd3a047d650bbe97ba83d31b8a3fdfe1a596671fe7bdcd5f026c277a37d2ec23657ffcc21a5920aedc9894d54266acf64de61df4e36204bc0c3e632c7af973f791a2cb06ffb9a44040641e7446e673e4740326e53497cd909bdf21b4ea3964f287bb991f946ce6a6d005deb23a1ab295379603155445d34a65b1029fecde633d114899df0717a65d779c6f89bf6b55e3e3dc030a03848ec6fb9c63e98d2562ce33f49bc3f67bc760ba22c726682d2ecdf9b48f69c902af60c2179a81b0b3015db57e28eb4e19bea7d5ead42ebffaad0d461ee5400205c34d3248153cb207d03f41d9f3f1cf0985ccced823d9a1ffd960f234a21caf0302b2bd51c3a06338b5846af9260ba6d0da3b98a2c10d3e4ed1c2404f85cc710d031058fb99cb9c8620b4167d063e1999e4ce4a27bd3ee41efd167b9d77e0e4cdf6031b831f4489f2cedce35deb5425f0ebe63e03b8154eeaa05d8a9f4b13de3b527f02203b4423631729ce52ea510356b3c253ed7f9f216e3ce4aebad33082ddbee754e161d0164947256cf3f8067d91c2b0a002644beabcb49ee75bf095f654b0705a1f6964587e6a74ca5ffbfa32014d5b91b560cb46ba2eedcf0d0de281ba8ec2eb3d760e826e6e732fa5bcb1c548106717099029785508a3eac09a9cc2652f244c5e6695807a406b952235461cdd107f8f130edbc3c072d57dc193a8a3adb87696de55a6daa259fafbec689647b9ec295de6523b5e910c6242482c4ebedb5695ff5570e14e829df9b45224d612324de3dca8e52583a19fe87d0b8c2daee9b2a5eeefe98547adf882fd011b174c90ad8fde9b558977f89a42baa6aa0afa5d2c5431d2d283dc7fb86516ef11a4cbb855431720661016dd782f32e91a5a8d667cf8845599a216a88a0113aa99626619ad879eac71fad47ac677428d806ed61b70e7fabc5fa56944d3b5ed4b9b93594cb47a183ceebacf62a3ac198f85fa84fc35adba19284bfc408eeee582dccccc65ccc28d4929f347c848b1a3963e9f1edccbb931fae079c6044050e5bd09fddce56ba9ff06d4baef69a08527814a80f7afb2287ecf5599c2923a57be4aca1a7d14747876de43545e013621c4e48be93e20eedb801d3746c3474d6a8290835a8be16c5631f800504336e28ae65042b35c66a351719cbb8a4c5ca93065b1c89d323269c6beac51ec2c61e09d1537d05754bd7777f9365e6108cd177c06dafb80a13ce6ddeaa1e31034e5c825fd456fa70c12a67d9173701b0f6c5f60988d2566620f7be1aa4f14e46e9e0948e3d7bd8fe9174782c22f9deabbec632798d2e9d1b5afce025318692848074ceaa18025853875202b0f829b5826b6018d2bc6871362785e37f1bc802b93eb3dfe96f8e469cc2ab7a2bf00e98aaf406a84176a3026cb82c80f5c8e3662eee9bc480d1fe22d348c76ecc324f7e475ff7f5c932c73d09f84045fd44b1758a8b9417085c82c561f52f92102d01e42815802aa7473b15771545034bace0a7933c11275c22974f24eb78020d8158c935477893b5a2a1f19e1fbf63a7773fdbe71b90f7ec080edaa881c0fc023bb17c30d6b64d2a09568ed6b073b4f645e6a23e0a463c998f6889aedeb4bdbd547987ccbb7e3a1f2434081ed38fb9c93ee418b394883ca01398ba9aa30677090c6990421cc728c06589fe5d71b5ddc94a214bd26991b736069e3dfc804cd4c3fa964ab97b2159d349be200ee9ca417a6840cfc7040feceef72f4939bc87c57662a5960d71d20332b1f940c221566e5ab6a6cda78a7946ef99d1f09cb37e9c19935001eb2ce769cd0685451ac9befd0e91e9d699b66ee7d49c27fbbd2713ec43640d78ac9fbdf38a43d28242f7896723d7d624ed33708add9ed45e6c9be9284e541997ccb586faf0a3eac613cd455da1005249e954024dcbd6835bdf9083f86656e8494b08ed2262ac9fe0c2b2a116bfecb344905ea4cc571bb4bf06b0ba308764d90cc1f4a14d63c93db2e5b6197636ce9a161d4dc0685d4fa982c34878b5e548798d704f564d0e462c4dad2d4532b8170425d79b2ca2e33b25e5d73cfa21a6ba80630804c21926a0ca189bf958385619d5d659d5a8f6d2d6bff7fce5f06223b29c5f63c95d78a515c1e4e928cd195b2b608fea2b11c1808f8679d61288e0a854d30a98cf40b73134f2d1fbbc213397e584bcfb183914f9656c2920d395a6c059e7a4da686ae26f69ba03552a6f202487bdbd84be0a5f0ad4f47c76f80e93a8f19fb1cfd3ac568b33abbd4b55e4bebe975ec21e3a91aff3b3f9890c191c57ae7a7a8c654670dccba399d29dff9793d27da6fb046880e3e6ab7667fc0b767e578fcdb6b93789ba0b01315c96f25d254c89501", "53656a", 0, 825354917, 0, "71c7a4b3568315027864bd6499eff9d8e3a5ffedef6ba31efdd4151948f7219a"], + ["030000807082c403047ab51170ed033da904467bceec22058943741311fa38f003a7af81552ccf3f7d0100000003635300ffffffffca8cbfd6b6643f1bdcdb209a1f299a9c4f50b8f7a9f5e0435ed3f9cea4944866030000000463acac5199a86942ec6164d2be94012261dfbb234175bc1465fe78e50ed36072d84008046a1e072e00000000095265006363acac5152ffffffff4768f45acb65d522ebf9dc1dbc2e57ad86855db41d61d0d55ca1e1b0fafff6540100000000cd4a6989030d0bdc00000000000100d11b9904000000000046f040020000000009006aac5152650053533c745016000000000100000000000000005094e20500000000e2d43626eebb6688f5f42c98de09b33117aed5a9546cda333cf928c164b6e5113bb98c19308ddbb462fa91e53d5a7546f9211c5d7796a5009bd562cbc77dc0b5bd06b2c1590dd3f775f8b3a15542de2e9f1659b5c6fa9e27fa9227df9dd2417d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a977a9dba4b43bfc148ea39e061095ec37fd3e195a9b390c0c75aebbe711b59519ebaa2bdbbffc0fdb979c1360dfda4305044f345f86894f6031e779b5d9c5be5ed0d7355c5e130c874d1247770d08770789e422900e6926067d1fb0235b354926b5eaa69179bad80132aa10416c177550a5939a891c147521fab4393b21ba100306a6aa26a20fa0b36ad8685c185dded9ebf0d66e3fab7d31efc5b5b5354fb1f80316d6e5eb644cc567c9e5de568dd5c6574933d08c399af18d5c9a676e4317dcfe0a042860af127b67435004a5e44e2735523ede0c02257f768fe9ab44f27dfeb826353f18359afe69721e1237004529eb4e8d239ae83f161d8917b18157c59dbeeb022277eb96b58be229b15ea7d545e4273a83c4be0601ea85fcc7710cbeda09d76902185e5c6b5c7bdd2918845b0cbe284a5f36877cbd54b2c926a5b60c99e0c9ec8b021aa5c8ff3f40271816fa033933a83d7a75b7325d9061e535d47c98b0a0bad956032f771b585b20d5004e98c82d1d33b55e0ec46a62744bc7772bd8fce20b18d7b903152b36e68ec859f15e1e95e853c16fa2abe25e30fdeb65cf21aa2113a21cc1a472d048bbbc24063b0200f1fb44995c6441c50aa70ae345fd0877aeb1c1a386a654edf5926fa8515dd694acd589e517f8535df65f1056fce315a01636cd1dfe9973dfd19ea61569b24793093c2eeeaffa0662e969f92b9af1f0b4e7ade8baf7a97d5c6dbab67bd6fc758d519d913c72741bceb0caba914b60a6f3f5d40145b9ed4f02c14bb016134c5da970923d44062ee3eedb375ffd8a019cbd2c5ecd5d0e62e647f3b9a72b1000b8417b14d1f29bd02386632942725d9ffa3ae8671738bc1b1022ad102596461668f10164dd28dc1654adeceed0ee90141ff9157f6d5a862eeb62b394ae965e3bffcbbfeab0dce5067cc206d47ad2b0f926cb69d4133fd970bf4a2ddfd7a21fcd72d6dc29f63217c87d07947a79fef4669775ea7605dd5c284b8c1d6464ee5966d94f2d928a08e7850955706ca6182538edf8ff177ab5ffa013570fcdddb1f79ca646bd326387d8849cbe22527683c8d1566f797fe581b2d1388e087f3e3bf0699705b579cfdf4f4f7ee3076e3a41eeed1ae4cf9eeb706c5afd1811d79962faac47200c479a87ed8501097c407be963374a162e5d73ce4c1c4db9067600ea97ae441513ebe0c08caf63b7301b323ce835d102fdb4337c3898f381143771bd316cc957b077d30957425ab99c35c19a88568e1e0465ffe17a0fe09eac3e54c077276091c45a13494946593c1c034bdc6697f2c44174fbb6248998b572a3e35443f9dce65e47585df05b217bb69953c4d6c8bde359aa20d4b2683c2641c7632a53ae1d2e96e6e7a8e53e1c281e1f980f068eccaba78b25520ae6e0c34ba2708a4fb960168ec3cc13af8cd7b82ce1376b557f09cec36297764c033e675920202a505ab1d6d127e89962fc0d5f8546c9c38c8090cd12b2871a300ae1ac34955e7eea4b649d4bbbb6959a15de02997db49d0141db8d4dcd70972d5dff79e21840224968828b0d0275b7a05fa17358350f5be89c41409870e1c50b81d0d9912118b7af9839d44a4a85410c9bd0d1a2b7018d21f86c74ae1c6f15d37c6e710ecd0d7126cc23a6abde468f7e40151facfa013e3f4668fb7fd76ab4a7467f48f544ad7ca4e5d835057fab8a4609b8c6de7f8a2fb440e6686e0381284068e27e085b9d77ba22166e3e20c2e1894eeda6d4627017c271166d8322eb43833ba50c07e69d7a30b75d6228021344b7969ba10bc99e4e5059c1a74a65cab25102d602ab0ed2b50da47bee9095d97fd4cd1af464c6e4a0c71d05af7ce9d079c536003fd205138f11e834344d537c228adf97fefd4911dd56c446070fcc37833e3b97f8f7ef5044b55da4aa1d1d1eb0d18d63ad51434599cdf24d4c0c4fbaf6c4720154671c9262256d863da0f1a4f95a5b63243976723d5b463171c979adebbd6d70c026f51e9fa249b0a0b76f11441a27986685e75b015db8bf6bf2f0197ef7f14e30aa86de86dc1cdd0d35ded82e36e3c102227cf2a89c7f4d5c067353190d6812e71f87c9b4643efaca0441c27aabe4bd28afed863162c05ba08ac34954fd082e1fe6bba56397ce78913867fe0b0f53ee60d835af2650c5de62028c76e0c4ac8d991dfed26939423b433b53a8ae38fed02b57ff0eef706fb490342218f072e2f1c97f03dc2729129365c3aa7807b04b2ddbf5b532de22f4a2cc508c1bc5899f6e606056953db91c46f034e4985354971c045ede89b602de3c4c0dba9c607e36088ebd55e54a834e3f9bc4f0feaf59ff660085d18598cc38e0b87d8ae363f462bba66d7fde84a9c74e040749ac38ffe3a394330efd25a117ed7e0529d216801e11ecf84970c63525deb4d6dfdbc8f912d008", "52ac5363ac516a", 2, -182386374, 1537743641, "6e15b0cac3d212c9a6392d2067038c9efc8c4f4faf6c700fad6f0c8e81f1f016"], + ["eeb6c62f0169fccbd8751512c7b8d5d378cafa606563738a410a7c73f54b7d5b54e77911ac000000000752536300acac52b8aa1ef903466af6010000000007acac5251530053e49cf8020000000009526565636a6a6500520b4198020000000009ac52000052525152650000000002259ee401000000000000000000000000ddcc8805a9cd6de6f19ce68bfadf137d74d4feb5c318d4de9dd0347ee40a2aa4883dc60b4376b157ac1eff900e2836d10bc60002062d1cd5673ff3f42ca8f2fce3bf610af122c533c9bcf03a8bf6f38e57ed29146598b022fdaee3135f9a05b200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000776bf6744ae79c996d693d7323f17713f35a37d0c56bd9e1492ab0e0dd2a8405bef6a4b47aaa7cc0c7a38606c14319ff8289b1dd0bd2f052a5e5e02e1f5d13be6c361fa38091055b77301573250fd0732aa33ac9b3668efabe907c905a00573200ff1bc16b772e384062ededd67f1a12de9ce9e851f7c5b180fdffd92d1e1ee70329a159d7371508c7b07365b73788cfea4c6d9b986ec2758583e2c1d660e5ec070206330a51ef00b67c18289936f798838c6395ead4c9285294985295f12ac073c70b05680cda46975e6d69607ca0d14c94151e8edce9adcd229d88ce7bd110495c76f464fccc44b2384ad4cc90bb932df9414949ac617d4b5ba48b41c85bab6031b002228a903d4eece8d9041a539cd56c2f0f3d472a8cc16bd0c9a895a2abd9f90f64021b79a063be58403e36b28c179589a47145ee5c83e1233e37e266e803074f065102054e5d0083c800b62d84ee1708efe87adaea0d67e7386ebc5541982bf3f6913302055b8941a2d994d6789c550ade1702813dc8dd3333a5ec1e6baebb572ff699000313831b7f4b1d590b87aa807d098355904048e9d2a13fa75439ea55cb49dca20cfbef67cc8055ade7bd4255f0a3f7302c021cbeffa46bd39daff6d966bd6be0e4bdb8ac3245394ecee34b6bd17c42efe8b499e54c686b2546b628992bb23592d6e3c01181bc95b320a627fc46c63f90872cda81de66470ed0a9b514c255e31adba69b03f84d5a0c60f138dd1c6969754ddfec5e59dd0e73a4f38d9d7c1762b77d9862216df4bbb9cf72738643d58f4f2db3298679ea45d56b640a88a5a9bbd63043bd56203a6958c10f34119954d6138a173794b8cff529690653cb73140e009ad3752309e32ab4e3984da8aebd4306d355010e9cd4f033a213e072a2924d3179f96865938d5467a61f7fe613044cde4337fc8a61a8e799be6fceac8f2411a0578bf96859a28e852b7e2aad5b81c56545b8f60d8b1de49dfa9502d9cff31196b8422695061eb1d693116030fd244d3f62c06b15ff81f16a8bb52d8f5ed242b91351b92df7c9741cb793e3c726df6395d2f1fe85e681a03f5558f73e2cd4a9559adaea52587059ced25a21a46c1154244df51fc6a66aaf15d12c539ab2c6f4894682c1b7a7d1a4683f53a6024ee1a1a4f9021cde4a7d99cf78d5c9c89483f25cefd2322bef3fea383b793331bb8779df53118e26b3663504544b16e448395df7ecedf694f501ebd09bb0244872b98cc7e4996af9acfe3c7cda4df889be3835f82b6df726e1c35dd31807faee06366fb4f33cf72ea9d8b5e1df6b901618a7b895bab3dce8da2d2c7f0cde8b21b0fa001a1b5f2212b00d90242814ae6e8ad4276e6ba73745384d30d3b2d0b17c1dfbd9c285eb8f30311a9f0c798ae41e9dd59b4b923c66b0b1a8f3e0112c7585a06210e969490bb08234391cf443335ff71d893a89455f5eb217a42ddb8f8410e1730969f664d801517e1ffab4e383229314cd3b8a3253d12ec21c29c9e2a10bf67a2338c2b3b46eba8624e58c43e18e1f42364b1a5aed3b004419ce359f6adc7bd5301b6f4890b183c69f4febb6d4292788482d9cbda1c4837201d6f97e00dc937f25b9f7b068400a503c19f7f83456b590a2aa86096fef3cba802d9c6cd49abf43117effde5e8fcf3039af7777425ed75c63f1712c959373f8b79dd4a9e052dd78d90a50fe7df2222ca8c6608e6e5f2c3137c5bc85ad69723aa23aa323218d87ff33b5cd875f047cacaa3cba3ade0cf6ccaad569f73d772b54576c086ea85ba4b4ad126b56c56fcee9064ed4d099ae918f0060999c93d835d97d41a23da523a25f1c23995c60b46ead9c799106c9f46cd60f75b3fa845dc110255c1250b38af7073b1d85b60b28dc9ed1eea005bbc5fa1134c1374c785e2462cfdcbaa6f56d2a120a3f18e3718bdae6a6e357aa8d347d39c69e9cf74bc88fd70c44be7cf5193e573925005cda6d7c6b6b5ffa37fdedcfbeb4c701bb48e56615fd202f0b22602b7cd985d5cdd54c247fa7f56d1b281f668e151026d1ac6dbffe1b5e80a23aaff5e6c37848ad94cf773daca43462446efdc7c3898be372af302296950229aaf4a34b0965d01677f362a783fe0610351eeaaa0c824e58b7e507c3eef497f638fc09ddc48694887675f5d4744320e90ce49159b93a73bac045548dc81e4d3fd5f10cbeaffcbc2cff43f0f931b50cbef6a659cc161d3a0b316ad8e5edf0664e174e39d443fe6dae98bd4e8d06c186cc796ed6ff9b5c7aecec2a234342bf453dceab933c5c64eef0aa00000000000000002edc8c0500000000739ca3b3c8c527c080e170ddcac8b1b0e2797d546920d3bbdde92c207b82228f72521ca5d626bb858e4e6480bc05222496b539ae4565a092dbdfc466b59eefc1425d24f9a199b33141157cc8f781f11272f0af9dde05752aea753fae485c1234000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a716c3c8bf2b41237863519a56478f5e04398e7438056b5541f9f50791fa1a30cabf9d1ecaa57657a68e151a0b20c01b61610e0c4d924b476826517ccc2790fe3f5a6c4f86ccc763786575f1113adc3390018f0aa328ac3fbec6b1afd7c49012c20e2b5f6e7c1b8d371f761f4d6eeb23ae71a5a5871323b69f374da33ebac7b032ae232f13f15ae7251e7a009e6cb02e0e87400866a33502200053ebdd16b0cf6030afe9ada383223e1c891d421957a9c7da2b31304d4962070ec228076c8df59cf0a0877efa5a69d01c77de1a0efa4b1a7df0fdd2f323a456139e6214b153ff9c25261463437865327e344c264aebfec7d1bfd43a31a170aaad9218986fde5ea51b203253fb99d141f3ca328e52e88daf7678508be576fd1cf1aea888a0150fc4ee1360213e3291a1bc7749da8f384d7d5a75dcebc77f585cbadc04d38e249f12c67271202214e738103ce624e6a9479ba0ccdf59674d060390fb17d5e8fba94e579d81039031eb4f388f947f5251d83e244151fcdd648dc16391007c0ea8106f81363074a100318982486fc4950f6a60e879ecf89ccbbd34fff10e7ac097297d88bf14871c69499e68807cecb3fed3099bc05c5877d022b4afba8070df8b28eec17f72f1b8e199b012155626d954b98c0e6f1fb7231018ec1b4dc94a960aeddfe7727ba54b24da7379b2cfd805cb82c218e2645bf821e47655e546065a9fa9ecf572e31fe646169227885d54fea90e791dbd7fce5b14adb89295dea5dcc827da61562b521e49b055fcd614b4e2dc6686efa7afa9bc085583d1ca69fad11d6ccddddaacd420ff35252c9992d76d8d76b6af0bb5cda4ca05ce4efdf27f36323183e51421819d0ee33f823251cac312d6123cee26caa1e2782e53b5096fde1b6bcbddc9294159affd0231864e4493b7df3d3c82b87f48ac5253ab28fee02ddec08c00b4f7b8336d43878cfeeb86dbb4ad38ddda4a29253a19b97439041d6c04c96c1b9bd33ada887587b253d70344ac20d3f3e326a883947c4ee77e5a9b1674018250b9c53e7fa2edc57c1a8ef4c4c1497a56a8c3492e18c2b4691c6521427916307f0136b31774521966c884c3880b864982ecfc638599ed2aab142a07688820d8719b1f9c742d8d4b6ca17630f3835da73b76f2cedd5e378bd09b8f737ab52572c60e025d76a8039116c685928046f5c9ec473449a1c8b95c8f279ba3df2bbc493885c10e2664063ca81bdc0f4c0a121a4163ab504baae3b86ec51da31421e61ae8b9043450c80c0b49b655625fc6dda7192d4c0e062c1b4774cf283c0ccb30b0aa048cb0f53290a5298a3e49b2338642034a5d77917ec71d48e37944681b60c85bdf724844aae816b1dee4f6036e6a3c0f32ed49f4fd84cc7e8853d44d80bd0922d01e1dd5341aedb5dbd222151c2479cebeaff99fce9071fac1653367e16d8afb408fdb66b88d34c5a1bd786f503024d6ef1e60175f789a636dd1002259c1a025608b0abbad418569fa7837f2ac3632874113727a6a1ec7b547deffc1054f4529cbf0cf1e66d4686dc799e98cfa965a84e032394d1ee792f4c07845c08f24679ac58f613f93a1b3256e71703fb314b7cb6f4c0438822d6ef8583af5c6695c331fee23bbb057963567091c9d26a8f733b247d7d38772a79fd7b27e12626a07658da6743af952751d862eee0f9618f1da54d7387a2701be8a895d84d36926a74689a74c53f769e32183e0f91b4157117dd681d06a538caef8148cb46cbd81bbfcabdb622a677e55428838d94c0622d75018f9e040925d8351dba130b95a0828376409d58e7b5cfc52d39928f546253f8e7ff939b9d74ad767e9f9c7ed9ab83f8eb3fbc129b60250e666fd2d115513b92b8fad46f89d1895f0d339f6636d123a8c9b0aa1de479a0601b98ccca1cfd3a82025534b1ffb814da338a859da2b6d2af83040b5756e7d96b5250536157017e3446ef64159fe5ba4d6e5ede2cfabac8e57bc1d62298391acf8f29e5c7011a9e1b13eb7ca822c611269432b771af0133dc93e8b11079e0128715a0831d75972dd2d2d8699a3813aea2e224b9c98a5f8212ff3e4b381857af4300dbbe8d88eaf1d704d8acc121ed266dacaf523700de6ebde1aab69e4570a21d1d996e9b72a0bc33d696adbae52f96eecf44b0c58e33daa31062a74c1864810d2743b730b9011bdde2cba92fdb7d7d40bd5b15cdb399bbd62878c65762951c3096fcd4377d0f821b2c189557971ec4b679e8edf71d7fd9ab30400ac5c39ca16556c893289652e8a7185a2c785c38c56da5e51948031beeb1393419f89e5882ea5306b9308ba4eb872febb95e8f81bbc3ddbbc807b9407e906df946d77702dbb5636931d090774cad77f63ba68a05b6f4a17d86caff88153ec91fce14d26c50eecfd0f5489ff0a4f63baee9f57dc5dcdf00", "53", 0, -1842595369, 1537743641, "c4e055134970052ea5732d6327715c9e43bbf3cc55cdfb59d6510faa69c25f3a"], + ["030000807082c4030105e85e6907ee18edb528b0737fde7caf636b26fe0bbc1e55b8802c91f0d5f5a7000000000452525251afb8ee2103117adc04000000000765005251535252f48ab10000000000065263630000632b066204000000000400526363ea1ea22c0000000000", "00", 0, -1625358732, 1537743641, "7cac171110f7c559bc16c9f03bdd13235489e741f1e087e75482c0ddf82565b8"], + ["030000807082c40302fd0e627a5b828d9f7295d9401aa50f75f73cabf6cd5ffec89dcb4e80c03050f70300000004655353003f7b6c5b858c6294e49097bdd1801647b77b70aa202f14002087fc226ed9487180afb28a0000000000ffffffff04f5ede202000000000263ac0ebefa0000000000001f66aa0200000000050065655365607a9c03000000000865ac65536a526353688f03220000000003000000000000000040bc30000000000009c167667ea9a8a73d881ede73db192e287bc0a03b5f1223ecdbfb64bd4f1bed546bdc0f795c8efd0422ff6eb379115b8ebedbb9ed95b2b431fd0940168c468d57908c138969d37df4da25b20bc058143908d53d1f6bddd82105b0017cfef82b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085dc602b9963cf319cd5d6011be3a1459bad0580c983d5a84effba5395044dab471fb51d056c934a1b1e734d697a8f0f9bd5d3f38bb81c0300c87ace27210e6888f1d604ac79b86c8392cc7a552cca213e8851051ce4637d3d1729343e02ac0cf457e088a6a16394a6779fd0b07396abd2ac2e299c6e845aed555e3a4ee5e593032a4a884de1a7aae18648cf67ef631ef428faeddd561f445fc468d629ada82b9a021ef602754425191eff60b034d0b2d0229c097f42a02d4aaa19c13e8c34ad9a2e0a08797221b82e75182f5e9f218ff03aec044a68f54d17709d5f1f1585dd0759a82e014cf41dc16346149a7603efb9f18bc35619481c2d333bebed13d7e689f794030a528c33870bca97caf72d11ad4c83d49ba7f48d0910a9f6e7ea585b66662b66030238e41ee51af17e7824f4ea044615941b9be5d1e8de543ad3c7097a24b7d47a0328f966bfb3755f290b8ffaefbdab298298b2c41b51ac40a9123a8470a4ee91da031188c9d6218cff5275cafdcb6c0333fb1661b1e73873e76194c6e3672cc180bd0225794867f5e9f27c00fa941664f388fc8bb56f9053ab7a5416476c24b5029bcea2fb7cf2abb88264557a7a3478e7f5c63fd7744cc1799b0966e49200cd462d51cc290ec0b500073b7a5de97982816c7f41de6ce05fb8cb4f13e41f59d801583dd7200822896f6935db1275bbaf011d3ed6cd090c2f4df80260000fd46caa974cdc10b50178e3304206100833871896705a43a16e5b7a89e33ecb552966f021f99cc809001e540c59ec53d8280e726fc5083991eaba4ad633f41c6458e272121d79b93b4f52ba535ea16bded405f21aeb3993ab55752a796113fb783bf9e715d6bdd9b749b1ce9de4a9a5e89d3a1b0329766ef686aaea156cd47897594e805dbe3169b02a3dd62e47b225ef720b777d135f5b21dd7100b77627722702a78345f981106c87d056f19674a439f6e44b34d4ef2e53cd12c63d535e94e34dec32961a307ceecec2f70cc5d47b7c88fe69a22d00da0503de7ff16cc4096cfb35d268bdade8bf84f408eae1a6d8d1f546279c5635d2ae42a770290011e4a30991b1e835e716056a123de58676b9df2fa8d05b089c63ca01549affd141d974f03ac5688c3fe26c27660e6bac1fc4984d3e545f7b9ca88e9072f15e587ed0312344ec20505e2622219b4c5889feb08ce150dc8109a10b0b89f87cb08068e582b5f67090e63f97108b95d308466a5da8fe329e39f11a3b70ab2fd263ae0133c495a03c4dbc52f8df9c920a36d92a0e423ba644e80fd63143686cc9fb4002b8ff040126fa895ea8b6a97fc94ffa2a7fb5716b5a1219dde098162bf195757fc0dc247795a7fc2ccd56bb9ef53d5e5a0a97094bcc0817337ce3b4a4c1900a37a7962c502774b5040ec198f081a0f401397c872fe7026a63f88ffa3899b84d90bced1badc5b1c70834dddd7d96d9ec8e66a49de317b94bbe3b2f40111451da5faf1cc1639ff804edf4c5e95d3e8a97c485bd1a0a41f1264068b103cb256c3cedea31a788730f3ab1dd0b84513033a89057a288f5fab8268ad3395f982a25ffeab393ef56423478c131847d4c216783c220e9158d455b77fff7a3014236b2d2d73b698d6b6a52e6ae5a5b9e09ea49084bc558bd48c9fd86073ca556da5ccf98b915a49b22a6e7d2d6d5b2b7fe524bdb44545d34ab471144a374a91442fbbe3dc5fedf048c39540604723cf27f3bcf51bb900497ff80f07edd80b62d3805948fd89eb777604400100fbd7a7544414ca891be7f8f7e8e5d2761bb6cf47df5671a98712c5f200e1e86059077d6e5e813ae587005c208d3da1fb27879fecf573fbb53a22edc90425b291d81119f8cabfb7a48ddab2d1272e60c7d294e828e2a417cdeb75bfd078bcdffd66af276f88988f797abfb8168b6fb1206ea49fbeea462dada8face3ebb3d147c2ed6143bbd20ca59e855d25c04f978f50050bf91198628b3a40fc7ec6aa7c46813a1a71982558c4475e85e34028134ee4ee28b23495f4abd2ae33f9da7a78306133b7d01c42407b18f4140b773b3634d4e2f2cc6ec45b53d3567ff3a51ab35a8bffccebff7c675f3afa4a592af79c3608bbf0d797677f25d7918c8f6f2bccf80d4607e31b1d91e740ba42882cf3d87f68cdea804f8891731120e05b59b17c43f74e4a7cc1caf53cfed99fbdd8bd68fd66583d68bc46c2529abb01b921836c063e8c255365c8feee96d6379af6230bf8a4efeaf721718636551a554034fbc5bdcd5a212bd92d8ee2ceb168e6b6640364783abc562f02000000000000000000000000d542e2c69e390457644fc88d44c1029f24361008487eb3a0dad38cf788a564cb64741969b88f747ad0914f042570441cc49538b9f9379c847f226062963112044b56ccfd0a650b8ed64f1d29272cbb6ee0ceb514f151dbfa41c60c0e0978b2c9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f6b3e66507b919e731d19824083bda13113898c6c77ddf808684bebcc502e6e3afa41c40846b4a24ba6044a9bed158056c0b1ced07a184e1f6f06473ce3f75121af59b0e8ce0ffbcbd96b498067c83f7b1c258c91723c69bec90c5b07ff6918038f3e15d7a4cdd38981363d1e2d1aeae625086ee4bc4f09e3c0315e12117693021010e745469c9090ae38cd1adbe9390c501f1f5fc7ef4addd98370e850f8782203014083382458c804ff1b855c0dc93891f21d4a6e30447f09edd37d9fa144fb7b0a079a7e2440522ccbb652422d39143b4d582b0505dc19abc58778f1914a795c340e58a8dd32afbcc0a5c2fbd383b470c9fa598443d84138ffecfadbe553bf4d3c031fdcec8e457a58be2451846d8ca19178e223cbc9615ae2e9a6d6d1b924942f87031ba180e58c611a021e3852a650e04acf269a16a013960213b5e11d0f323347ae030bdd0dcb73d0e3319d63739ef81f3977d1b902e5590805abf8343aeb118dfafd032db24955b3699756a531a8752ccf4092317b22b2544ef56ffa64db21a35ab281031c11a2259bda4f2d281bcea0512041d8bb98d14b25aa59740035e39211b7bf534aa454367f2e58f494ae1eb17934ae54f2d2ef8ae4582ab6b17ff980cc9fbb7d77e5a78f7287c4a82dbec872e781780fe2f301c944c9171752f0f76046160d4ea77768c86f368f95b44c82e1a9c5572458bf17d3b052e102c5a16094f8d3a2c7a0b9bcdd6646654c7e925724aca65b120656fa8c7281c41a026e613956528794fbb789d9afeef3c7846bc08444b6722b756be75eddc883eba235768ed1e423b9e6ec2860baa44b6b075fa4e8b5477c58abd4232c1c624793b4315ecb902f278c6a129960e2971eacd72b51d56f334a801cc603bb57c392dbfe3a1b696d9de62193664a350ba3272b6632964e0f09e949ea6d3c7b89f30e7e35ba1e28eca50847d8f884ba71e52e7306cd9a45e7262eb33fbfc53719e622dad6be196f312efa75fb6ae853281bbb90903bd7858499af0c56125130c80758ea96b1862504a1f64389245fa50ab85850bb56303da9e4d1e0563f548e52472dd95892a41e2ede6b65b84db6a7ca059c227bdc0e2c602beff14ec3c8a538e359eb0f0f13711a66e92afb9f3ad18f519304274dea256c4ed95745e3f6862c498d4357655a53ffd2346c7d6ffabb1134f3706ad01b805c79fd419404926a8f1912fbcb3a55e8d435956c28416e1ba10de11118a7b8ee902ba6f81d840402ee11a2bf02f295fd82cf2d9c51d62e88b62660b51920ddf5769b77632dea96a005f96c1b6330322ce26612fafd8a9c87271110856bc939fa5c58aba4419865a46e8f888b46bb0cf04760d6ffaee78a7b090cb96c72dc440d757f915c5897e802f499bfe8d5d710e0a24b1669e57a2b88b8f2ddde568bf41f365c79861eff76183d65d2a5b5c592449be95b574b091316b2e3f12e301713db6672676d4fa266556a4a17949bbb543dc76fed001ef866e44e3f224a4cabc754fc55b1ffd7a669e29fb8d886b1e3f81662e70a7846c8e9d324151431c77ee4dd40847361dbbce9f265132f530fe2ee5a41509946af9ab925e5abbe83b8354e6bf0acfb82763bdd48808857ac0ffd692ce5dc928bd48a53961e898815a7599dfc67e241d93a1f845edb08137f6b53259557533c401b6b64601b854c2791f26fb6bcc851e421252d0bf81de12db8bcfe52bf74260cb241beb35838aa3f02e2baa8098512ef58929be518730088d45e8b1fab4c8cbe000483012bcd3a73d75d9fe7d04e41615f0f31a258450b415ac2a8d13c50c4de4b4f5f8da639eb9793e3e7438d3d41fd3622cacedbd2c337d48be703c16dac1feedcd9411b1fb429e297e92492975e688e433a4a7bb4747d7e73f88e9b6c76bfd2c6fde84428b2d616a71148a2ef10d062bb68d7e0d44d322d76385948b489bd92e03e511e6f340dceaf5d5826c2942b991592a991fa64421d1388ab61ea32f2e13dc903ef9ce36df919ae802258cb7565ea46b69f9e59d0a61a1c5563085549f344830af5ef7116ccc7f727b2ed39be4aa8a1f5fef6f9d76ee80bf0778bd705b7c50cb4a7782d43a52f227eba21ff00df1901d1eb0da1614907e389ec2366cc72e82515de46d7583c1decd84cd4c8d71157b9344e485da97e6adc15378e03853700ce144e4b1c381dc32223dd8f29de8bc2ba4780dce90e5a3541a3f3dceb0e12562f4e1ff105771070b328272d9e506c08eb8bf4ea1216da8e112b1665cafe6ce00fc8cecb310ae84e21fac28613f8df2b8a400f0500000000000000000000000097a4076529ed86d70f88f85b15b5a8370d193a108db8c633254df810ea600ce746994e37e63397f973c460fb5c32400a79f9e0877b84c0dda49444f925dc0159fde9b17eb28e6f3d1c3f00aa69c28ab9483596242361b1dbb11e53dc42a273000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000094d086d25b89b7430f97170fa1fd41e2ef478eca11dea784440407d4dcc12f21884c74154160e41f3b978003fe93e425ac3c40e3bfb6b5788b071400f266829b1931eaabb482af602fa6b6ac731f6e7dc04d1554e4e8900b16712dfe007e92883dcf5370a3b3141158700ced97d7e5160a542042da7431e750f1f55df3ca66f403038e10d842f5f213b6db48ab05d815c7b5075c4a4bd666f86edda3def8897440020a7c9572aabe2ed90b23af2508182f263fb6cdc34a0998450def6be625460fde0a0281608b49b12234e91e9a41ea9e2935db711d2183c5aa911b5e490860e858491188f7d606bfa180531ba6f7b1edb2ab832dc83db2b6417211b1b04cda89195a0320a66af9846e403fb21a15ece4f1af3689a8a40032fd0003516c760995dde22f0329a3a9b4cbcac8d1ce5a5ece4d6f68f3b345d179909518132e513e3245de6ef8022edffff0c97c4de243b7c92b131511935599db4740736a6683a8f59d666bf3660209d5b072d569bc79366edb37ce1bf5cdfc7f691581a6afe7fec94af4913d5ea8032c9afc612bf9bcdf6948b3a0923bf47a74cb6f1dd7b7b2f3abe07f6bb2d70eadb3fed17f058fef8951c9edc040c7e491c59122a57ccb544348c390c5864fde088d7783475563c52484ae1c82d5436d95921ef4d5bcae1f54f1fed2813c1f68c4f84a7b91bcb1ff12687f432a718c9fc49ea788e3c805abc9f8d105f588c4d1e21c2eac65ab277e1bc7d0f47e0765d30dc89e2022077a3e98280c6d061979211acc6d1ff4fbe0489e0b607eb97b30fa06444c0abdd61217e9646f11819e834f59612e42a320d6a7b066c8fd50dc7ec598250a41c9cde9ea06e52bd63b9436b867ac1bd0a9cbce8a9b075559c44d3208a4c8aae456267d6545b2c387379ac042a70929fee82fae0236d34f476ce53bc35d59d207ec23857e62454958cf8689ca58b230b365ddc57c171fd41ffd3e61f7110964f52e0eb06422d20e589da21c8fa0a5b82ae2091f627ffb38f80721a46cafeeed436870eaefd518b37c8621eaacf834756ffdbd731860652a45ec035205739690b3aa25b2a67c853ef594a43387c6d59ed7af53cedd92c09150c661bda9a5cefb165a062ea38d72e14dc7bff647a4292a38758492e7476dd8674c8d09e42fba6899884b974a100c5050ec1f202d4ad650124dd8ab7f27a348bc573221a51f2b7e5f3651630c4d639af68fa114126f60df06a513794d41c4f5a5c70f9908e2aca6be3d86ea5d208c957f51a9b21fc4d6bac08aef4534a8e3af6414abef892e62c6448d2732b5ac26aeb37cf468aa93611c5b2f77c1cddb80b064ef3641e8dc0082d2a724465056d4c6b19e2824720679ef4270d1e4ee0a7c6595c28df420b128ea3a5a08f5bef6cfa4839287e0f620384376a7c09147b8041c3c0d0867a01b6ebb52c53fe19a110aaf289b894edd2a02841464c624e51049ad35dc890b55df5a175a31a21720b7d755819b8436a8be90ae59c69a94096fd65ab50488f72f7d0c1888ce716dbc3b37c994f513bc0ec39c3a972a3108bbb47f72c3bec7dd8f48f931cc0570d4b1a97a4bb1251b583c49ccd415d5410602932701e01e2ca8fa41abf9a31fae36abce0edc4762d93fc4608c8c63ecd5414e0a8c474be15e2f0690b0ce91590b22b74e3529175b31e61616318a8e349618275f8dd664fe9c5126bc61aa9af4b7d6aaec48d955276aad61dc7a77ca8d32d1f56228402a7582ad4978cd7a9968f4c669c2a93e2cf5c7448cad12b99107f75a500dad3422dbdd119a2cbfbbd89645fe1efc5505264694fea3f6b4b12c98856996f19928da046b59d913a1053a75bea3a95f06b231b59c75ab68480d579fe2643bcc470ef793ce4056cbf50a4d3cbc0b39259da986962b43dc561ba9fe950f36545e814037c9447e6d654c547b21bb6c9eb11839114ee69e7a664847670a3486a8f3863c3079f43d9a79fd46c31a87d4c843ccc8870b15ef0c326609e5c8a69695dd460498e9b4c2e9a46f31dcdf4e2d61bccb54fd4041f239688e5b92dd4f2b9802cab042db020c897e495adf8944011eefa30da8c310907ab641ea020c7787f94355ff787d7c862b04d98a66e9cf1ca3eaaf71b0de7abfc44ac8d5de41d0b9cab8235292257a51e8fc6430ece125f62d62adb99958dd7ca0e5708953548abbf9431e40b812eb74c7c5a0913a27e7208229a444daa11c9ad8a468a7d4b0feec8392badf4f3639d6e23ff01338da677306caa94b17f0b410e73a1677724de657eb9ded824eb1b2e800af7fb25db22e7e8c2c34bee433c1b0020ecd5cd5f28dd0bd4a5cf358d790cb9505611fa43e8c5f6c95c4b9a3056fe13001ec214864988ac3965a9c2a95bbe06df6c07e6bdb0d1482c13d9727660b5e126164246f48e13f559dc2c3e5109bc115421b04", "0063ac0063526500", 1, 854163597, 0, "c492c260a1986187b20d471e2a3d9d397ab7d562ce96b5e1ca1560d1b6613875"], + ["2bbd2e6304cbb4ba4cdfb757f9f9b8c45b688b32c007879943db4ccb6c188a7072c61c58970200000000f75d7939dadb5e95810f3f33f66ee9211e7a1ac24bf8907fa0a3dc2bf589bcd077a59a55030000000651516553acacffffffffaacae6b461a9cb0438ca010d4fd80495f318170158f33bbaeb02706d0b74931601000000005021a0ef0aa11e2494227629f74f5eced6536075fdcf9b414d5ea7589f5c4c176360106e0200000008515153536a536565ffffffff03b27627030000000000923306030000000008536aac0063005165b8f059000000000007656a52ac5265ac0000000003000000000000000058b387010000000038938434761ae27c273f7e78e4a99697943d5531281e19e4e7e30306400fc4c90f282095b9e4bfa108acd771f169babdc00c99d0ad31b19cabb19c496adbf1ac5928e17699e12fc382cec5bf0d5684697fb23e4981a3fceb1dcedec25a362d9f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bbe6b9b36e9ff1047bcaabe5caf104f8328453fe61c5ea924f615ebd8c4d5a5f31ae25f4890fcba5a1a6704fe65018ba7458a9411ed5175e49ac900b5751b176b99715b188f4ba6a38ee3b7014c890fa3d9c0b64159e2e168b39a09be840157be6b6b2ca4ded6f4c010cce1b6d5430aa5405d37fc064e0b73d486b54db482a530211bea960d96d045b8ac35e520c47820703cd22155afedd39a09ea9a72f0ec5eb0200482918cf5c214db1760a9ffae380393c55c8d320580a44eb29454583ce2f0c0a0574b739022038be7e55324e4f4abf9ebbb2f3ee651593886265e37086a38afd673e28694be6cc61d3a1a13550666054fd5b4f4a75af50df60bfc5c6dc7629bc030e0067b1c5b2ef064c3e061e3263a0d1ac55e52a85b81ebfa7dda2542dd33daa021c4dff006cb756336b9db0967ac45397fb7adb65ffd62f3af5cc2b034a90bd6b031cd7ca9c8e35e6b8e33996a83ee314772d5492d51f78b4eefbaf8fa5b1d38d64031ecb26316f3f4aaf59f24855be8a04d9fa6d4a72cfb56195fde5fa05406652ca0329bac065666dcc1e235d1c3a1f09d1cd15ea1441ba55525519b207ca4a5bca49bd9f34e5d643d5e729c7164b44519618205e4e38f5d929c0e084ab3cca0da0279ce2bce6d6ed2e50b9ea281e2fd6417d5fcda9937d1ac60068469a01ade75d978699368f02f7298bd0212b22302c66743a31ea90e6556db821be57006605a60b10b26261daaaaf6631cac0825d9c1248ea03b4e9c882af7779e7afae5d4b31b2bc45ee3206d74fd03dc6ba06b96205a5667f47638007c56863767ffdceb5a5268f252c4f93bed4b1220cd6cabafbee1281b44753c53dfdca3e286b1efdeca222c4f21ed5561db876928a4e2d812fdada578e3da77ff1b297f14405487c0070a0e0ae4dc435755d01569b5570dd98ad03c0c196caf14e770c76f85f6c6497b1c026825d8855afff332715cb0541f8c242785309b9696627a3eba88023a5d2b3478dc2dbf6ef0f43f5f261975559fac9ea6c05f84aca4c1d005a1de7977f094e3db07fed19c0c1c10f9f62676b582122d94ec085c812a26c7e62e9dec0525901b8d3bf268ffa4e944c8ec5322db75f2ec2720c825dc39ff5a5115a7dee5b351ad09c2fcd6d7713022dcf6e1360b5e126f86c5e047624b414b87f859322472a0be5308f9783c9d69420a5b212a40e5cabf27cac782b6d01cad41c0c6d5b4c6770855386425d1e0daeaa53103ba0b035999658541c94ca5c647889fbfbc157874831d2a40116bd228ddd7525cb335d3178b4f5cdb32a590c1aff9c8d1d12e30b08693e9972b7a08e1adc61cd7618410fc420efeec4ba471f5dda414d0e66100a2610aef7583b75d557ed3bc5efbd4365ef0fd99a7a6a0a4055167c0da9e1368d65ab573976a6d12ae1f1f9ab3e28ab5228be0e82d39a9ce27098140a4dad8d11ad3637a0362cd1b40f93e7174540cf6525beee092fec3bced61ece26dc504088b3086de9da2d77a727cd087869af20327fbc5dacbfe27143a3d1628f54d76eb43402e68593103e45f33befb496b0a97ca6bdbfb93ebe8c10c9e2a54934be25e165434d8f9fced46acdeffcfd12caf788a3d8a1b5bcf87687263df08eed0e5cc2588c8f27aa6ed067f1322b6599527d40bfab09926f94b790b178abe320b2957c1e4df40e40198c15d8880986143e66183983f2868e68c935ea5b66143364c5699ad83d2040775d83c5ec74c9b3656e2af9aeb663afbf275ce6c3ed39a83dd28707b249f08c7b29de22f756e385ae58b63895fff04bacc1f039fe40cad800c8d43c9e0118505d1d9a95bb2c3cca6b45edbfa11353042d7a4d828d326b68e509d164943917d04954f5044cd705a07853bf155751d215cccf3c45fcb8582106b0af4583d0e7375fccd0dbfe02654903d8ebdefa7540c75d4424ea25f1d04360e7d80d80cc38b3675accafe46efe2a06bdfe41845c4012bc3a6b959ac26829c54207f7094d2f82fa24c90ee7d17f19c767c6daa4a88a72c28c8c813c2cce96efa9a1f91f7e3299a83127e3f4c80b2719aa1b6dcb1dfe6aeeed5888fd2e75e1fcbbb36ba68aa07eea36d04af28093f1d9e43a99b8469eaaa139b73ff6bc06dce45d0e903ef81c6ab8d98359e814ad46d50256937eb119beaaf1c81abd122c83438ffb62ac38c41a5a7f87328b6aa67b4957bbe0fe57787b5c7856d120e1cb00fb4e2d53c72b959cfa32eeff9bd3a18073838d0a88b585c9ccc3f558dfaded7f3912bd4fb5348b72590cd4b404184d25d3ea09c05092e9bb0f6b050000000000000000000000007815d1cb04d5dab1d03665f33f5cf6e667888b31a2cb61d40fab710a205e1e8dea3d98733a9285dd0c8df2f56fb3c72372fbb7e8890468b6e373195a0e885e12076f5017691432d516aa033004b0a7051bc1e2547f716ca0fa54ea85110f56eb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d757e316b9fb5e37a063d9238d8ba33664878393ff60e7960fb1bd298f1be6a9d2709c5d307048bc1f01fd8eb402617b849265912ef9cc1dfb5657ec481cf4f77b2b83c9eb59c6cf7c2d5459000f5179123e8ada736ca800821f27a346ad0730e6779058da9e87ee725bcff8c5829df2129c825329c8e4d4f24f9e4352e441730229ab013d47947804782f6b543c5d3e769a6935489951a3b7885782a0f80f83ca020f2288e1e9df31efdf4433cc2b696e4d263c1300e8b0c930038d9076a1b4a9c40b02202380358719c7918589ecfb9f89f89f414a65de306752917614e7d53ecec751955d9f4532079ec2e16a57e7d5e8448331fa491db69ca8edec778e46f12add021b649099f2c059b8e8195c9057aa0a623c084ec99ed848b58f191b33a5af2830030c767657fbd7d682e2b131c6aefb210cb5eedd2f3f58ba533de06b34f28943d1031f8b3d03a10b3fa5a36bf55d687696718f1951f693810b31e77c9d38c585f2f0021818524bc72f4c42c66b6a517bbb20306abb4a9075b14d27a3b5c21fdeccf0c5030487b7161dd120df6f985ad7fda7784be4478d11a9247ccee1efb558cbae98eec3fdbf2a17f907030bee586b16bd01e153130758742476dda6bd349c4cf6f4b1519271c80934873d38cd64a022092e0c9a23450726933477f37a489854b28834ec4703c437dddfe39f7557edb5b959f361c4374b004e719122352925eb18030d0292742019b7db5b711804cc64dcbf135281a106a8b83038119971edcb32e1423ad9310a7aab795300dd423df848181c2e9159ef4f7cc92c36d625d6bba9a015f67e11e6e120d812b561c52c83a8b586a512c00a1c3e2bc23b22bf0e39669be2f551e81b1f50a63d17affc2ea6f52e283f9f1a818faff1ea8c69ca4369b1b4fe90796dca9669c36c5119c3365f93a7acf3dbefe37329e47138dad9d381097a0ecdfbdf250247b00d8d82ab0b601f70ed9b8f4d89dc1570c89a17d8f20e657e07f39755f4d7e662f147a4a7e9e9121048c833719c3a3751ad16202f51bd0885e18b569ff254f60fd2bbdfd84c890c82136d292c8bb6e29909d5254d1bc8d1ed37cad691a6378bdc2738c3a6ea47d307754a70440b53887d92b27d0712599addc89c37c4d093ef1e856e876c2c40bda1193f0b423657717b59c7b15dddd4ffb14914f462070ec6e3ee221d8aa43c5eb83031552a4cb0686b86840d1130713a0c85544e916bac54c605fbf3243a78af0502fcdc82aec39614acd9fd5e29e00462a25dfdfd5d57361f34c87ca28c757f08e4b329d9a8f73ef1ea85b5b71ccc344a7d7113927d29f9b753929438a6f8738b424bb307c7ace4555f034269d07cf6c6c2a7a3d736bee410efacee8e1417a0bb106ca8e03bd95350ed10338ea92ed81893a01dba9ad451e8bfb016f0694594677ce995050b990e1e3030d35c99aee1fb2a3951e60a9a4fcd7692a2433952e0082bf68e2329763b51e134866457cf72d9a730f4af83ba46d67b59f51d2597f93cd708369d2cd51ac0ee332f4185adf6808fb69f5db20f0f6fdb9cedc5484353582f6be75a3fc1f840869f808d34a0073621ed681f14b60a082e276a2d002f5fa8e9aa289709e71ff367d1a2fc636f1c595d38a9ca125b09b556f1a3820f62ea36c953bcb1418a3f16f393cced8e8ce6f5e6a7f0542ace9e7d00ea5c2446c38c9dda8de44448772537d6b9d23a619cce6d209bafd25e616387024b8e8d9bdf68e223eaafa87394d4d8d6e045d3d958f2b0529664e6c4ca805f977cd316e2ae6aa81373f951b4a69caf5d2ac72e2a0dd5deb1e72641af2e9e5890e26166951868de0c271a127f8d74c8610ed3ddf186140dc7638fe62f8f21f4537b4d5b76411ade5952e4f94ae7f71ab5d7c9471db9cd4c40475980fb0c93758894640cd5c5cd7b1e1996bcd5fb14e513f74e38ef4b572546ebeaed1128e0fbc814b7ea99e9c8db8080319871fc93e8788b23855b1fb096b4740117d8fa1e584da9e943d0854f1febd3202624f6e2591837091f4164217ef0b8dc51fef32c542763a2d8a2d1e2ae4794cae4cc7a510861daedcbef4b027d54bfc3203ef415512406cd4d5ae2c561eaaa09f3f65f19233160eba17485ff6d89ec4c3c98064a112dd2e7b132d3e5f03240bf68a05e054aa0c6ed5165dacc318ff7786f834fdf440a3b087e177764173f13b5a4f64f2bf4fd18fd70b7da143253381182126f4f63a87e69befc2c092806ca24010a40c84e8b950aa1dd9de5a117888d33e1a8a6bbc3a17e3c5b7635e3e8509c48be050200000000000000000000000004615575b24614211197623abf9ae62952f31234d7bcc5f263ca33777207e5e8f182b92f9f78edad0a21b38475e0ef711b2354f7e2df68740b02ff0443eaf87f9fb5a01f93ec1fd97b3707332ade7238cd31c80cef0b01dcea0ad2aade80a28a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005260ad37389f400d68ac1a448d86edc5126574ba32d12c1c73eed35970f0ed2a40dd9ece677e7640989fe061947e7ab59dcdc6cb256d36217aaafb8943658b8363456b2f06d52a46e53586ab67e18f93cee250bbd087bf012ac23be9dcb8970eb8550531e299e16856eda91c339f12915c38cb2d5b57433ff611734cd4f05acf030349f828166ef8b8a3abd90a183fd84ce947f221f80467bcfd3dea20fe0a306f0317c4be24638527a1e3deecc5806c6cfaceb1f39066d56ba1f7602bddac8290970a0249c4a3610ef35aab5ab9032c0d5c4d9d61995b476904273bf670a36efe23ba49180948f871b720082f66b8075c92d042a51586628b5baf48d6a878de9ef4e2030bd772da001458d6f839d441b79f1c7187511a82efed40a64898286fe7b78ef403211fa939e546de0d93c8073dc10dd62d41d97654d0a0b05126cc43a9589448b6022aa7302ac4cc643d58b24e494d32f8c09d91d43e570c603dc8934281b7df8764021ca7a307688e1af70238850378c27e24ae928a37870aeebac16f10aca66ca8f603171450e3f0272fea5b655c5b6985281297d61fa6b016375d26796fea6c0f2b0bd4cc5ab85c067d642e3e6ae83aa5f725d8bcdbbbd2393d2d1366a4cffe285b8e34c2e437d36a92ece69c602c0736533a06d67b854cc9f89702c30ebc092428164d02d9a026224cceda907ea3bc7b043bfe7b47e15380d133f086063d0b8bdb5d6a7807e7c47f62c29245e0201dbd62d3d644eaf84cee27f8ab4acd10b5544e8a22bccc2e68d3a780c653bb0a3b8eeda5f37d3dbf2a3d886c9de56f8dfaab0e10eba177f23f08161c09d1fdb38fc5bb44accab74ff466c5d7d9dddde4bb1fdac173f669f15a7e1d3156a856302d870c4b1837c3fac94e7e10030e3bbedf60525c94cb674338ab62f688028b5a8cc9afa8bce9ed48c38bed49df92d5c6666d6a165f8c8a3cf3ec092549c4cd55e08f9cccf5bc049ec8561cbccba2c2f7502530ebb008e6ccd96bc47f84b05c5c77d08e6ee26b8981edb2a1826dfe4aa86f9565dc7e33dd04b226600fc0e92fe5e37e1bc248db92a1681092ba6e807630e0fddf2ee21d173677bd4ee54ba4f9a3789494b6c3139f5b5dbca1f137308111084b8170caa1402735c33624f5e30db650667824e4ffcece3b436e8f8f00a162d4fdc7cf22e3bb62d1e2d8c4f693c3b1bc6f18ecedeedd08e6d3ab97011c9bb6edfae6853f3a19fef74283275da23bfcd83add36d089e62d5fc87f45771b8cba490faafbd35b3d7d56ed10b291f712d0efa4a1ec3645dc3360cacc3776fb440af96f1a2b24b1cc955c11826500d72b7f9f9e6a9c529ebe4e9950016164bf88213532bdd6ac936df2c00df68f31904b29f4ab42255032b2f8ab1663636408d9495ec37c6a3c07d0a279a2a9534faeb79a1893a220c624153c94bb860e0095562579daf65270445a162df8730fca83b39d63c429ee331c4bb32161056bc46623a6bd70b0a5ceebd48f29900cedc0c1936996067f6157194579c47f40881ec3c22927c689c6f174da67c7a51085acdf8cf4794446395e6717da0db44e942e491e93cb31a5674b880009b6f36ea60b7a552224d7c242835f2464a4afefe835cde62ae821fd84937e77ea08e4e7c069f1714d57661d45ccd5cb72f85b9fc3c21874ee6adcc156859bd65a658512c9a27a6987c085c306e044dad5e11960c0838c0f44a954b5942247cfd80486d4633efd218c916cc3423a3e261b9d44675963f8128f23fe934258f814358c7d0c7ea2fcaaabdb61392fa050d00e73774738bcb1af995755decb226ba8572e6f0a9b7243bb4fc6ac1fbafdd18d588241020b816b59f52cccec9d5077441e706e0effc3f04f5c8e4e31ec621881587c4791ddfec9627970e8cae78b354080a88baf31160aebd0dbbe406c79ac87342aa2d50a73116b8dfe2c4299de7e983c3c48a1fadf83c730f432dd7c3a5087198f9403b5869c118fc70fc3aa20ea25625929825daa6096a099384e49dee30ae9742267008f8745d0ec4fe4fa533321f6f2491ae5c560a8570613ea8391803797212b5b52e1d8c0b0af9ccaa46494c3e391d3b5f0beb595c9b594e30d390876a662425d5e331aacd6001e3fd8225be7f98c38a5727c3058ecd7378779c0b24cca759a8de4e3b1628c429b833f5dbafd10c5055a37787375ae255efb5dc8d47d206633d6565d1e83b388913ad0bfca329ef9d4b8760e84d8f1ebc05b5e49bd1e3224ef004f35a2b2436f2a9e343d390a43271a6e30597cb7a50f83117137370f10e250b85cfb647704ac961d2ad88829a2909cf06da7b95efe48e9bc1702b30560df69780578d511add4a809bbe60c464783f9e664f277f22e1ceb98a00853e83737c1f3c5a0ad66d7d7565d83e594fab97fbc447be5cc9a687ba83e69c600", "6aac6a6a", 3, -1078259374, 0, "1a88f85d26177eaa53fc444a5bca981601781d2d57b59a7c02e259ccbe51508a"], + ["9d107b71037f83c9e09d645ce74c7a6ef0c597b4029e118c95a39792b1da16bbbefb95e520010000000951516a006300526a001b4bf7ff4c13eb36787fc9ca9e12a9f77ee682940d5c28542ce1fb4263a5d6c17f72a0df0300000005006a63ac65ffffffffbc7745283893cef4f62967fcabb7ce19158600038691148492eed12d85b919da01000000016342c47fdd0120426204000000000652526a510000000000000202f027030000000000000000000000006334218e6d0b47947c1294a1f659a5e6a87a76441377b043ae939f1bb8f432605410b5d58221fab6c9b6ca27f1b390c3e2a487d295485c238d74fcb3c287234897b6d37e9781592739eb8cff69724c82919bdc4f52f99a268523b25d3d286ae800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000145eabce5c1e26c92d42fa449e5bb90a840eb096cff08d104aa593628459f67895efc4a272ff2e13e119b03fb0f08dc3627cec41a956bd55544582b8c744282e45692c0f0575f4abc7596ae61bd9ad016004e87721ab93d65e019293328845d79722871c025aff1032b1aa74ef1612e7bf1b6224327a4a172123a1542ac4ec66021f1a4304cd375f83d7a9d03e010a1369b005cb91ee51c8abf7c7f93d6bb1d5170222f4af3f334cde2aa48c00b7d39a9b49ef47f5215174d6859bc326cc582ef5200b00d3cdf6e7a285833f65725e0adb90fd6eb80818415cacb9d1b8308070e46b1147b0afd8758a6ac30c8a2c6ac7eb9cba5eb5d754a31f2f53042883f04ca6fa990308dc4bf586845f4dc6802964e79284b0ff6d7a2f388f8d205154efd8c84630f1021fc161067725051f09ece05ce0d52da7d5a10f3b923d4b9133206a6e1cb55d58022e84b14b965d1227a3ea5d5d8b0d40a120af958296cda95fd3ebf41c8d858656020606ba4bb2540011520338c0c9258dc2398aa33dd1d655461c3b3a00b1294438020a8e8d5ce47cbaf8b45bebaba6cd0c106c9f2fb425269bfd9394060a08b298abb4ccb51323b026c579484650e946ad530c5e2d35ca14548df75daa8ee17e630a645fae026221182ad7f3bc8dbd3d3e5e2c1fa8cced0bf1e123f6e822ba9414421aea9f2aa7029e68803d18b56aae19c4ff8db6fbf7fa6dd853cb702a027d634c732205f59573d1c6d627b96d0fcf274638f1fd930dacfebe78dd71f38332750b47c6f2ac55ff62563a302369826cf2604f38e041c0a54ab4aafe5c35f03104d51ac05a133e8dad350d41f81889722fc224b44261c74ca073a452d8bc3643f0efaa989894bc3b90bc751be009e23a34bd0b9e79a8a6a9eb22e1e05a42228436ddbe6ed998f23106db9d981b9b337fde4e74b86b1f86124add6f5f9b1f1a382ac47de60fa83eba1ccb30400550a0ae7515fb8c3764e0fdab6af1fadfff035497e3b321af2bc91cd8b02da1c9b92591fb73b027b3a39df039625b4e8683fba89194312d4927ad9b5c9f4d964ac2bec106bffaa9a7cea9f5a5180ba92737f26cff9012da301914727385455ec12e52b325b34d45159d2c42d3bda39d06ddebbcf20a639b97688fb95dff74822963459ee1cf7b696eb4bff784aef284f502092fe3588b94714ae004fbd06f2360b847da967b756e0ad4f69bb20a0b9d8ffb04421fc3578d9f93ec7fe63bff93e20507a9ba1b6ee939455dea530500e7924a65353cd5748d92ac578d99b88e3033693828f32588b52fabcf1018e362b47becd14d9c9b591be72dc235bf64246107d987a39a540bb3e2c91cbed379557fce6acfe578fdeec2dc0b0f4c941b96d580a720e7ab7e4c5fe8936f8929ba10eaa10cc85d505bf1fe40bb29a70b3ebf8fc9ae00e3218f06d4fc8e7417e0af74fbebfb775de1fbb2585b6f5ed25291713f18fa94c4c7e4932dbaf70c32fcf879b27ba4864615f6f0301029fd460c2d409faf41121459e2e6b08d41e2e640f72bf622cde375c6446128a748b66fbe76c7fd83849e7737e419994be1d35389431d44ec0b591440b3d5ca2b72dd67642f271f9db9458f51c0ce3fc3c362ccbf9c149c17909b9ee8a6d0a8902a6b60777648acf0e1b9fc65976ba2523a84b89d67ecb74aab7667943f7cd1a35831904e3c43811cff517ca813ef6e6b2b42b581790342239bbe0e6ccb2c7b3a8e08a5553fb62fa0942d72d61c407d5f7ce241c36245ae52d3c983745467a9648f0064d609be4a214ffed443f1803b6a711445f09cec016b95450aa04edfb0151e2ff29a6db36bc661ee8e4896cdae18a681176d2b5da00983688eb7ecf6d67b4bc7f55ecf4e3fa7539cbdae21c47d7c770c3cc535f8e5030134bf27ff8bab9907874de0bc4629913faf639d198bc747d2794d59f5208bb21a92bc44729e29094aa4a5500ee031e322e37a856b1740b1043fe12ffae8ada0352a164ebb8f999b575f213825f6a588ff6e4d924cb6934f7682856069a6eb729e045b0f900252d4167ce8b0be98b92a445671f8a89a54c976ee109ad9432588a5b027f19fefe189fc612f103ee54d149e56602949e613b83a0aa3dbdf0dd7d17afc0b436419b5c718ce692c7304c0c14afa3bb8816278536c2ee1155c6bcf6f64672303d8f37fe50babb8a24216067dd8340fd1396426d3997bf198fa2d588e8579a3789fb60dac34f495d7cb163dbaa348f6145241a397116f13bc30c484e75502ea9eb1f83e7296d9fb41d4560e6800b5e5a1c17885000000000000000080de1803000000004ac7070a7c07db85796c540125a821481752663f3fb8286c4e9bb647cc811d9c5440851966fae07b207895f8dfd6be4eb4d5d5f4f339672243dd184bcd48e8a6e5bfa444bf4034537870d150f50d8a604035ee7b0e5d9f2547c94a1452ddb3260000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000039af3e10c5326f33d75adb8311b1268d0c2e714761953651740bc6b71eba79370b23c16f70e147bac0d6c2a8a9a7f480c524180d0384c3eed47283fd69bba73f26b90a5234f897e62b39f1fd6ca99de920915e2bcd88f0cada627c45901e270a110a3cb163757fdc7a031be80bca24a9b76928ec2092c25473e28d963e2c927702031fd8efab399d63ff44526cf4de1686714d01bfd5954d6b2126a825a75474ba021bb14d2f0f7be5e96514083f4733635c219c000b9b2fbf57ad6d59aa271a84000a0056b3c841fcace92073df6a755b0975d4269d28072a924ace24b080699de04384128137d2b2d6b125c8c4ce9a85cb76bbe0446712b992f13951ed15b39ee036031e847010bd37a32fe9958f40f4239f4d8522444e97509c1bc257de97b48936ab0207663fcdb851293592fb80c44b69b417e2e0ec5e752f458eabb53fda4108407803215c13fd1aa77c165e73555177762450f0fc30ecfcf4cf5a5c2c49d17256840c021a3edfa39568a2434fd606a32ca02cde9253d87a9e83203d852268c3008fd768032e8ca2edf3ede00ba528a44f70f70f104fbd19fbd4352457b469886931a9feebfc5a420bee003dacea5a136cbb23043534387c013c8c3ad0fa210164a04b5c83f4e67f8f5b9b1c1056ed39fd4e881feed09b614b7aa1e0bd3c3cdaa224cb3696772dbff4c08db5efc5ce9e56489355d718084f0bc00f01ae174c133d9ed348e6203ffca6e3d2f0bdbebbc7e2eea7a62537eb5b3e9be3b08a61ef7875d94ee96a8073e9ca7023ffcdcedf4e832edc5cbb6b3443d3cb90e9eb12788a436fe4ca81ff462793d7c04778d81baf1fd11dfd3c7266c26f75da01e681a56647626aff4a237b45caf865c20f29b68d37b6beb99aad7afad6e2e6dd1d7e3badc7d1f21d7f412fff0cac5fb2bf7334d538291db90d7b72eb6cc7fac6615ff6562b93be606b239b0081158813c11167248bcb1a70ff084ffd4a00b2b7b06a79dec001ab0bccb66b75b77dd41c18935d6f034b236cfc8459e7dbc49e34b8def20a9ef4faea61320792493992b021b633fb6f8428e8d638703b838fdebe70b806e93f1c3d1fdcaeed0b65095c079a78f0a7fe51b98551faedc4ccd6e1d49885d201c18ad1361f279c4f08979707871f60464eb753a0f184ea4888befe04bd2df7f3d1804e812a3cde367ea3af54dc7444a01fd0641c33a3eed75e880ff70942d3c4b81eb5d3bbfbc1a5db8f9ad8dae62ccc7de138067919f17deae0fa4a3ab0f90a78fef811168a1ebd62fab131f6f04abfc2d5ffd7693e8d0e1b1fab4b209586a240db47b00e01828de1af5559e0b3899352274c38ece95e4f8eff8ded281cd220d7c1199ada74d72eff26747951d3dec3f5b5a348e18dfced9850fea994e6a50bad7a87468805ee4b6965d470e530ecda6b2f729e212cefa618842e21b0455482fe28597391f84266cd591b105e367a4431987838c69815eb268ebba8af750bed559a5dce692e9f5fb99f9f40037e1c086029b1fc46c33c28b1c7f31bf8f171bf4e3b8f5dbca59417d6edd300f7bc5290c94c38ce56b8ef95a3c1c647c672c2ef132ea4edd64fbf7c600e700a39a74a837aab99ac4182e6f935959cd18dae04fb2b909aa4eb1fd5443411b99e14194224fb952cf34ee6095f00ff44c631b0fe82a9da1e08b674f24b86df9e1b4e538480461f7d67fa3e975850bc7ef769044204f37184a31ae953aaa964932c53f25d65185126047753eef357b48287c22e0eb9c0d601a8ea02da64ecac07419ffb365a607662c834e8f39a8969dc422fedf93c1773a434e735b9b03874251c76705f9a3c2057aec890ea9e25385486776c8e5c5a3f923fbc38f1ffd1bdb7f2f711295b1ec789113e6594e5c66451c392b820cefb1cc7f0725833fcd35a2b2443dce55e3cfe1da2def5f19c891d465385df039f837330d0d392d0eb5a674f0e289c985aa61ec5df9a04355a21ef3f6a3f6643ff5433636e05a03cb8b316b02d42ad9834e93fc7a79fa2e608a486c8d2aaa5c1bf22b8e6c6fcb98af101497662bc53675552dacffbcd794d433f9cb62768e88974180b040bf61e9ad64f66d07239799283452811103f200239e8a11a25475fbf860ebbaabb139f950166e2c8de8c40fce376f6183a217a3f524bd2e062e47ca9ded5ec7e3e2f1db675e2225b3a0fc974f81eac87eeb3a3768da08e2d0534be46b081aec3a2bd86d3663a4b272bdad68e986fe795e9b97aa2377bf8d57f066a9768e6a1e785b553d14bc1d7262e2a0b9b7e3c9ef6d6a464de5643b5d446ef983eb0ea79b9b4f57b2d4a37dbed5b3058bb67f95856fd0e794e01d00cdff395d6083f3d46c4f77666404e5061422e5b8f759a61f464d5c4e458d53872432ab32bce4ce0ba216b26cc4a5312280161e3f2a25814532cc1ef8f0d", "6300006a65ac636a", 1, -730667078, 1537743641, "a73549d59da17c1e94ddace5e94a981113dfff6fb68e4fc70864f096e2c73e31"], + ["030000807082c40304a83a759a16f29041edc46310ee35215b8d667edce0c6f22231079640c8ee7dd90100000001532958a3f2a37f354e11028df179cde4d122b5dce0b90ab5caead5556bf83c467860af8c4500000000016a33f10fb7a9333afe7fa7371b97e1866f5eb42c7d8bc6ffe1396f7ddf2657333018adbb4d010000000365515274c32d87ad81204980a6560d7abb3ee51fb5ed4332de27f2e3d1e9f303c26a92090f2b120100000006635353630051ffffffff03c1c5d40200000000025200b358d403000000000163032a7f040000000001650e3a0e660000000000", "0063ac00535253", 2, 2038971227, 1537743641, "58e5f7a8c8b29c6ec9a62cde8c20cfd837658f41e3359c8e04c8e2077ff0638b"], + ["030000807082c40302044a86453085003b250b0d4bfa3a6733923cb14153c8d8f9ba2cfeb55577be3a02000000096563536353530053539a1cdbd1413482c1685a16a2ab040dcc8ac5bb25fe56921bd1194439eb047a6ebadbdf0f010000000100a96b694d03cdc64c050000000004636a636a886c4605000000000665ac526a516a5e666503000000000352ac5211e333e1532c276a0300000000000000001838c6040000000034953e38492156f4d40c9a67d952ea45c83fb97da9bc5cb86c50c96c66fe20171996c06462e72e9b5a1f3c4dd765bf8f7ff8a4ecdfb277c0c203ac3b75cc696e326f89d50d42bcedf7b139fa8db474e5c0f2f93f4a5bfe1abc11e834f1d3c90600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c7eeae68aafb5376bcf765e31428a4200a605f2fe3efd6b7db92340365bf18c8d82dc06da834aa6088f6ff64f4548f370f7aa7902d8e7a3d2ce3e0326f5dfdbee0cb401fd92fe8ddb9c804fa07a88dca423e4d60452b51ebdc7d31cf882dcdf31e3a1d8b29d822e6548244d6e6a104d42c6ffebd2092e71192a9359fb3d67c290325c6dd6de423c3e80543fd3152e8760f6de463c338e1e37d7498016d39c13dbc0200519bcba1b7f346966d4a678ed99a67c5df54ca464484f685f1841605ac82340a022e67fc681692331c80e0576784198ac463eb34690472ba08d3e36e5981f749bfded90c3c175972a15e193380f00c4a2962ccf4efbd5e04c8b808da4812fab2031b8a7295b66f8bdd9d946fe9e91ac54c2dac1e0352274a799f60e5ba5832caf7031bff273d5873e881ae948e628781f202eb4241baa458405ce3e629717344b3a3031665f75d4df15e85df8e16ad0146ae931a38c471a5b01822e956f6b31e09ff270318dc2f21f299803141c107d045f9580e557ec3f0bbfab08f598a8b1739acdf8803283a6a67c673d05e689c381b7f5212317f3740f6c49927259834bc7223e3b60954d66df90474222e8e67d9207d67c00482a468146b6c84058a3eb88b4d25be155e15ae8224b2a03295838ce02d045b99028a3e033a27e668417b8478416e992916ed2a9b8f4c010f90983ecb91ffde4beed5093f6d0112c47b660f4df2aa5af6366ba821990be1faf3ee7859431f5dc791e6496014f772a2b90cbc2d0aa16c3d469ad663251665dee75065e28b95f709ebc35ee5c6f1b71188c6e1c27bf50cedb927483b352c4d878510b52b0d6ae8d6d418a12af629fd54a05b5d63ed25ea0df024574b3e16fadee84fea054d06b8d0fdf2ca9782e798c9a324b5eec89e76010c9869d6e6b2b9bfbd81cc3aeb6bd4572d36cf8a9802d5a81dbc80425762a000b36a2d4dbf5a0dab4d7428fba7698138b16d62d40ee40d2d86165f03dae09f5c5b9e0bf987f589617c96b1d9b0fee4fa27adfe8389adbf8fa00f7f823cc91bd4df787bc5556e61e01381d05e6c63a58bcb31256ad3182188ead177b614e2dd8f219070b1cd100a28bfbc388158d0fe4166dae44d55502381a25ad38ce3b4d35f7bb2af66e9ab2390f29b7fce12130a5095ab504e65962939734f3569c4801a9c9bb5ce51cc1975069a68e5c02b942756c818318d89f99f68c38282b268a6f51e149946834c12aa1e6b49fc48c09e307f1f80e7fa95a35a30851cf746db8357a67e9fcbecee19b8586d2d30a75ad5f15e08018f2bfbb10b1781942dee7e7b915802a78f35ea54a5de938cb0afc32cd47b07e5a9e71e5edb5a35d6eca4c505b70178fd0783fb34fadc8a09b147fc495a7f2b54383347f087a0912080bfa8c25b3631f6b815bb622c1dff1e27424b8f74f1141262ebe7c91a40d900aa8d643be53af8a2cbeee63a9d2876514c60964db452d7d728d31dc3a3dad9a72d8b9380b4db82f3fb8251b918c368d57af2e539190ef5b35ea73977f0be32dcf42e09a4f1b216472dd0dc099528c8a2737481917a44f0166a97004b6015577b9a8d217c1e7a111f64e08931909e1cf2c81b47f0f2b37e8394e774d8206d1a248a571ea22aa572343fa34ec5e209dc68906aa57af3ba3ab531e6f36c3b6505c2a012cc8ddbde58e52332272eb162f38716c3ce5496ff16126d823e959f954505eb7414fb559a714f435f0d8ee410031e6c46b5431e7ac4abc59334fadaeda23a4fb960c88cee2d370d40cf670cd25530872c42ace1a159dc1e5538bbf19d05e81cd687990d63ea45c8e1898a905a8b2cf77ffacfbaf5c878470a9036c10786af21d54bd223825bad11cc3f8b94c2266001bc2ea19bad97323f68b4b385272fb406414b52eba7263eb362259b04b9536cd09c72e3d19c35480f737e36e0f2621e1f6edcd22df4ddc6af9a9a78e12cb806778211b6beb62955c399785be100dad4751af3dc94dff9c5bb65a8767073bdb2309322d41123b9d9e5b4e9a487c6ad6d7fcda42ec04cee6803a922483bca54b45cac82782fb085030d86f015501ae22166d6489dd68bc5feb3b1079b312a0241bb426e1d72ef42db0eecf1d208a0bfa46dd26dd4ce5b8d39da0e968f72dff7c3c8ac98b67a14b485b685a755ee6b77648d12dfa10ca9658905676930cb13b310edbc50aca2b55b055302bb4704f3e4ba13cbce91fdafe81c557cbf3b4cadca0bc731a2d3a1c8be41b53e91327f0a66457ca31c6b34090d2f9fc1fd250a2ee793181260bf9e6286560000000000000000cf80860000000000e18eba85c810ac6f12324ec0142a161e82e14f2ae40b962851b7303a1ad895eed6a57ca869e604b2794a80bfce1397dfd50362b3280bf7cc28c5a7c6f6c2a26f07598131f48e68ddff6d93a4be6e061e22b56ed5fff4b7d367bbc23d64d73c2800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a6a5dd158934545668df5398d3ba647c306295a7c695657026ff5f1313734262013313713f120dac4fc6310a34ca4184f2aacf718c9b92d16e933a228d519b156daf17772bd90753e6f602a27de73a9e3ca79baf9dbf4e06f8b46872a8bdfc24dad2224c51f0d1ba816f1e5fa62d785e132dbf59eaf69cc01f84e525d1f13d17020c0144ccb70afae2c4531acb923cd92db8c814316ae03fcbf7a4d033967c64140307fc3c9cc948244cb9c710b84defd221890ed5a0e4c1871d70c0da9d2cf681180a015e6d2a45f4e40bd2fbd5ef982fdff5310821e83945b4adc4467c9d0df8710c0bfcf70b72e4de321210b1b9d80cc87daf18a2615c98ca43ffa6d6043f0c534f0312b4374a78db91685c929ff9c15d0f8ccd68923581560e2956c8b304605cca05030c6c354f6da28d5bea8353f61049c8d1abc93f97aa72cca66959734c04267d98020f08bdaa2504be076a2ec7f2f3341102dc9e99afbe7bcd8393c97cb9304357af0303821d9e7861d1996b530517743e40cc3c7c1bd1625c223baa24af9f0fd77cb202051cb2e66da85ef6250b5be531be577dc631a0404306a9e63bac90fc8394168e7d447b8442195c2acb492096f21cb66725f73f6968e3393f1066d04507b178c060ef7ee866b2c0f1096ea566254bf2fc3e42a44df3b3459df88c35d7a1e9d35f340bd605a682c3f491710152abe899eaeba623213918dd2245c01297eed2563a47726573368ba529b0144ef9ebf9dad02d86f15e2c3b161a2f2219797e3c826b723809f180b8ad93a94569de0c59be14fdd4bc5946fb0141e316ecc33975503668d4d5deb36a181c0baa823f0d4a6ae1f8ce495749a040d08df0397f2857b13949fecc8dbb7213c7c1b6e3b4abb8ae60a2322ad350576e6b2a936314ab56f9467ac01b7303310a4cae8d84251ec8bbd0759e9b5445c8da5feb56345a5de80d8294532795efb35010a247d2a6111e74c2dc06e2cb33200e0ecbf9d89ca5f8bf516b442c77864b3a565fac622a6db7bd025da2b89139051a81d617fb6ca3fa19c6f795e1f1b18f372ed834b59d0679c77019c931d36beff294b17cfa2bc52e670412de2de555cb0d0d76bbb57d9387132e62e318f9dfcec0bf92ff3cb64c9e438dc64c181a1ade8a17745afa14839701ba968957f196342c7ad5230c518dc3e8188d551971c1f45cf4502088d1f7e6d1cf6edab7768c79db2715aedf8efa104a33f5b3d5708681765fe244c9431349884b11f0c813925cb899cb927250c1a31350775d951dd03a12ab68b747e52f5ee64f33fc1b00568ac891f485a9745ab637e75db499335a989501ae49d898781afc2ec65d05e518d0aa89f93a1e3e4a736ec987004b126fb1c610ec5af7fd03ac369aca6abe24c483f4922430340e17ca1d735841cc9e910edce0205204b6de6dd7ece1ed7f805ee072d61775922d28ca8d88a092d9bd5fe42153cc575aa13e01286117c3b144b87b20b01a52978bf507248f041bfc158e64cb245aeac6ac5f6ca9709e484196d94fc322b0cd249a5ece024e2195c18bb0be7b2620cd31a5b1e6dc5302b5cdff649a0f8553a8441051db00e296c9e3cdb0343ea68647db7e25d7713796acca87963fdfdb4fde47c9585d76ec252a40c9f51343541106494066d5b06520e9a6079b8398e784adfe2ff4ab8c4093651d6f46b91f3d3b8ff6db06347d58f8800d6c7c5c27a13f574fdb96a3c506c1c462ca477a59fe4abe9e933080eb49c82a6f1f887b49209c6b1f53ecb1062631038cc7eeb04fc391ca7eba1eff99833edc1988a294b1a4951f4f90bf63e64b04abaab7ce1caf96b858da93a925acf31662523c4f6b9ed5f7871530d5ea41511d74bbf0c80dcb9ea5405318129a57a55d1df89b83b1678f442e75e4bc89f51b42b5152842acf4065fc532c01db4c8a4bcc41688b84d333c77f7bf42d3334885849f1fde3dd3276d27412d9a62a594db9053938354721ebf70fed08303bc756dbeced6c0c2192c5e5bc9c99b1f1e83e1418681052d5441e39f9f99682f7a0a9e24e3127cf4a610bdba9aa2510f3418e7ea062a9166f817ff74c40be8b12f3b6a9abccb9bc849d305d6047005e82abbb43bef635fb2c5b96e39f7a863d00ec8a14a5db8f4a2ae3758527f60974ec4e874b810cab4174714ed1628c307db2af92020d0e7e20c1c31779019ab6b873df969fac017b21ffff8b290cfba4fbd30dcc99a53af9cd803622ced8f6b94f6be2ed50befb6646fc7b6a142a7801862d90fa54340ab81a27aa97e0b7d5be842170ac99176018ff904000000000000000000000000c9a5d11d55f079675679aa313bd5f888ff6a4281777e631fb3a4cccf6adeb54dc9cfbb3cf78a1b6d186b21bc0eae6024aa224958f228feafffdc262fd8bb4d029ab5d505d39bd5344ff4e68c5a017b72477d0efbd885043e51c29337a87f21ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e377e83385f312b96c9a8576ad9ec3ef2b934536d1b5a3016d15fbedd06f912df09f3d1ca3f2ceca9dcc32134cb49d2f420f3c71bf4de1acae7f130aba224c0b40993404ce1ac5384b9bf04a20b0390bb86877c298e82a50c3582e5a0a9f99d55a531b869320ffaf95dc995d1a2af11000d170e9e1713b2ede7d7c1595ed88a40303cd2df7f0c93130f570b4574bb0f09f0302edfd490b9267eb2da9242ddd2dcd0214f221a3ecc375507df0e7351f972db85c06bcc7975541379bbfaaf35e6a75b00a07721323c6d14a287cb9234a5be0b4a6e30a4156678c7e4addc95b242ad03a127a3fbcac8b92a98e2bab428ff20e775800fbbf167c92a7d64aaedffe5ea945ab020fe030a8f910f0f2cf471b6d9137782ab12d54e0d6fd6a4af9160f24a68c819703027576f6da6906561fa99a945ff0e4367430b370aa671ed492e323694587d06003104e5a80089fc5e291f245201597e72314f5084b48f497327f010687b615ca6f032a743fef5802e78edd5910b385fff518717d8d77ed656b9160607d267b26cbb50204371062cacb0675b04e2efdd80ed9ea5c6f3ca55e91d72caeee825c6fabac05472d782ebd3ae32d6b0948a081c32e09b053129929278a0f083ea950a1ffdb8545a7eaf3ca9a634986c34d663ac37497ab906edcbc4925b097adc27d80bb1201d1ca0154f9e37dc05951eb825d1cb9642f455f98e2cc975eb467350cc5a8f588cc61ff9a746b505b4880d67b3f96e3f8dc361de21f744dcf47e6e66076d0ab3103f5a95448308b32f1bb39c3573750bf4d1e9b5168e4d5e2de5c9e1d6a9a36bf8515d7f875d799389d691befe77ddc7de0874d5f67e3597a0e1b4df917e2be31a850525682f6f592755983e1e2aa1adfafdc5a1339c87a0c991113a3d7eb1f42a001ebf248447e5b3ca7ebc09c26761058e40bf61fd9d69ad189596f73338f71f6af80ab70c2c9b8dc58e4e98cd61faf4f568beec2f919ccb75e09d604d9eae4f9687386b34b60eaf1858219e32a4be00fd05e792d41a05899c62525b63f7ca4b9c2e3fde79c00589f0a03782f257b28245a85170318c3910429c1a5ba1314750314914d51b58a33329b2d59773e196eb7c127ae82eb5a62b6c1af06ee8ab95dedcd38781ba404ca42bad8999b18a3e222f7bef99a2eb31ffdf3d9f0cddd91f39e0da8108c08eb97f516fcdef99671285d4615d680872ca9fc0d99acb7562be5e5bba293208008ea3a8c4e37745b6d5a0894866bc858d1d0542ea2ceebb81aa7f29669a673a9c7f0fa68ec48a5e84bbf3e90fa0bb411a3e94ce8709fde35d37ad012edb365d6a92e8a584c5e39dd763f0ac9327201e8cf285b053ee095eca99a64b390f364c2c7b2eedc85f5bb84a24e461d9528026e3a468a0825cc74193b4c364d677d45e02acfa35f3d2d857333b814e1c52f9f77814265e629e57ed507dab22205bad168e54f3d5cc173ca5b51147553526fe13f2bfdd1d9170d8a276eae76bcfc929a8a20979ae4ffc7619db76d47bef0b3a86502e2aa935095298a72192377ffc420a29a96b05cbc3a5403cb7832464fee5d60e23b01c62a2b226bb2277a1de1e42e49009c859178b3643900ad99823bca1cb4d1aac23a7891dd8d39d673172fe553a9da0c63da36805ffbf9de30996950955baf018139f38f9608e529826d74222f43fc0b318392510151f2ee9473fbee9dfdbb9c4523fd87442c80bd6d0de8770a16f99fd48b578836ae96a4997fd5e07ba342f6943cfa3af37ad6b262d1286a7c32a9feeb323590d9d05ec01ef633e43e72729fa788b1b4b4378560efe8d7f7ef171da957fde6a1b003bbd8f6eae580885b34652592be0d503aa7fb79e638d5fadb0fc97c368d1bbf955b736225bd874a3cad968e0cb290c79ca624d2faa03af96ec50c4e7dea53c9f968b2867a4bed942daa725dbf4969cd532a8708b3391e1e0daa78f491b6c6864ca02fe9837b421aa498a05cb782daaa7e368a569e001584a529c8602939f296e55c1d8dba1ddf1ac758acd2e96c47da13b6e5953fe76ea42d4aa0830f9e0834c8f5f99ec5a0527721df7aa39b0220f780cae0a67d00df8c03cf3f2353d2908ecbb8a725c4e3c0df206c04bde91eeab671f4ab2e8e5af03af047504ffe4f3397778ac9bfb4d4331706b38a642907190a5899b99b0b558461e7bc9acf49d92564c48c09bedd378ec0bfd5aa6f1005eec3a759d0a1337da51e6b77041248b11be749564cc079e12edd52d6ee54d13d14142e9f0cf3a187a53164081c637930703943457051d2fa342f3528ad556e86aedd214be2c32405db35e5e5126ffc009ed802160ab623ead4975abfbe03d7238c007745df2d216f1bfb8eee1f7f66a7b97cd674df9a89abd62a2196c783add9e1e518a5ca2830e65da002f852b54ac46c3119be4db00c", "6a65530063ac6a63", 1, -1106654833, 1537743641, "54fe67a19eb4759b75e209afd83e9d9c2f78b184990c39b4c04f8587260af1d9"], + ["030000807082c40303ee2a735a34e2b02a835529eb2c7ed8eff478dea6f5e678e71f47d13771f037340100000005005351656affffffff84cbdd8357674aa6236eb7cd83d0fb62b41df430463c68e3014efb5b5320829a02000000025200fa7a2e352fbefd8222b50777a9210cccc5431799ff735405bdf3e2d3207d078a95b1c60f020000000765ac5253005163274d125d01962b110200000000096a00515252525152534d6578169d955b3d0123e83e01000000000000000000000000e4195217920b292138d7413540457fe4a35b59d674f543e8de74300a4b82de98709c5d452aea0b0d097ef6d763ebe93d6ce9b84d4ad3c89d8e8226aa680028322d1df03b1294f1b994c36a71ecc4448409369bcc1e7c86585beeadecf00c271b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a1f385c0ab33aba7810f97bd6c56260a486e96a464ab40cd236e69e149a0bb509dd87a564c49e33dc7bd75be1c653fbbfe3ea7c6681721f7a96ec88f0a926bb191c5b0ffece92a7f0ff4bde1dd1cb4ea81607a46565eef68ef623fd855ad550ae228c1cdf7609dcdb4b2fb61dedc83a83779af7bfb9d00bc7654ed9f814fa84030f15c14a42cc1c15d8ef7ca7d9ec064b5d47fa89fe09788cd879e878adf609d003188125b50b39e5201f523c5c79bb769d349e11c11cbfbd8606d1620ae378dc580a08622ee1a5c4ee2eb07230dab46dd1b23eed97dcf3d95b983956517defff3a556dea9245bc4656a0a5c274d56306967f514a2ac8d025bada689b006138f85952032b911330a14369f6c4a3500e16800d67d1ee8c8f16d5dd8ea0ff349f4c44dde50223fd87cae0d0e08e67d51e79550ce3fc07630d417b1ce774f70c35e67d7f9454020bee3bf11a94f323ab7873985806411834d5d114f8d8f4a471b912e0fc591887032a83a1dc8a1aa05ce18107fefc3685ca6755653a4278bacf3f24a3aa8d97eb8c0205185b3eaa7f1379d3c14633465f31bc65f9695851c6d3f9f9743677fd37667ae6a5aa00dda923ec30538120e17ed86b0dbf4e6f8e19e722b3447647ec5a8d62119bdeacc5aed81aea10a0fc63260772a94ff00ff8fc87ca3817ddb0573f196c7bf98566d6cf6083e11a6c892841187d8503e8144d3c13c20b204a19ec2738ac663444390528b98015bffd374144216c15b6bf13fb1d71156bf9ebf4c0a3f6d6790c0882db1e86277a991305b0ae42e9bdaf2a41ac29897a34cf1dd963b5b93d35401910788b9cb6b79fb77b2a9df8f391420dd28c0eecf8bb70e6b2913ecbeb62c04c8ceb0990e271e1813a6931380751f6ea6cca09aa03f02e93665708295a5c63678c0b851b700264f065a458477c7a6cc90d853e68beba9997e8a5350b38da776d5373ff061b755fca984866cd990bd71eea9bab4928b641000f2489e2a9bea1813d8114dfa3dc624b789d6aa1ef972b10adbb1aa16260c7fb0c0039e99037723574ecf377c7c35da770fb34862acee3c19f63c75a56a02eba62639ffd5528af25299e542786eb245eeafda0694f2d24f47c637b6039763d27cd8835daa6bdc577e72835427ef0f93d546ac7a7cc729888c2f69be3d18e201ba5e73fb9ecda40be927cb53ed2fe8db41c5a11e14f79aee699402fee1e90d14823aab5fecef9963de45554764a03b174721ea064fabd6c009e16b1e9887976dcacf466134530185153194f6025f263912fa01f4347655170f894cb5044ceefb7068e9cc7cdd62d2c9a2a03255fd8431f89791404489588c1caeea9a37a02617fa808ae20868bfea1625e3b33a8003c3221e2ccdea1a4da8ec87a9b966cc746721a2281b17ae1a80e4f303d0ea348a3563f4afdeda0ba6f531ccd9aabbd33a729dfa810a382055632a953b4478d7d81335fb22ad51302b18a07b23447f5b460c3c73faaeaf8015d7c83ce76351426fc542fe4fa7068e668f138d4fcc60930df444ad22faa5808127cbd4e680d25ece5721133e2a4d53c3083030985a32a9192f2565bd0ab12aa303a9c7e331676c194e1ec33b811b4c01d98cb8e1b9042aabf68437fa5bd744281f3548b87d708eb0af67fc158e7a453c61bf6c41d6cd843ba21f35d828474423872677dd0753e8aae9de9ba4521242da7f520cd77581a40c6e2b2341a364a491ba12995a2480fbe59b7ba62210539e7b15bfbf76aac8d4e6e33f7d2959d0d9b27a18221fadb50161dbdcf929c774544ce8fd5d0545f81ffdaed76c7d5b5b0be267d5a399c5810306d5916201de150889ac113c8693e9e94e7e6b3d1f02cc1851aa35e764cc2766bc7d0c893c95f9f83aca7875ef7ba8d7b76ea70d51b1a8f80280cd052c4d4a7902b08c207b2a0631cb4c2c9e9790873028af2d98da5e37522f3770c456d3990512b0ea1c478f532b89cc92f5e702df7b633439d99b03f712bbd54e8088eb51c792128b9db121f3e3aa92532636989a71128d8d13c17862c61965a66186e706dc4a9870a2ec4bd9c8d183038cc2c4cd60bfabd69ea1a857fce405c2b985bf5dbe7adb3e004459d2da5272f3365093479da953348c86f078bd22f57ed32f8403089e1ce0a45ead205731bf3b5571c575b6ec0e8f9a9ebdc1a8efe97ad4a48dc97b27be74c27db6d64625cfa140f88f93802453e96372ed46dd5870e8c293eeaffe996a1a140578b29d356000355cbc001ef953ffc232acd300ca45277a75e2e4baf04bf8dd529f0021b7a27efa066f611a466224006db3619d38bc82801eb265c9a27d0dfde85e1f37d899b620058e876bcd580e2f11849a04d40d63b65eeba862452f3b2b95ae939bc7fa81446f65be5cb1f90b89b88a105e13da846eb5414e033af5b151e8355d29e08", "", 0, -1316219454, 0, "8ae835a94c8679bdb359fd695056d828ca3c31f1f5212cfad93c3a12480aa337"], + ["030000807082c40303ac0da6f3e48c8e38029d7317f3890bd483bf7b8f85a2a170d95aa87352c91a020000000000390f776cf880e514257b89812f0975d0ebf7d7d74f69dff39f7c7c1b85dfb7d7e62687590000000008656a6a6353535265ffffffff5ddc397cbf65c508b07cd92fca4128782444f7b6ca036e707c5771242e048dd40100000006ac65516a5152ffffffff03e3833c020000000000e5d40f020000000006525253ac6a6a19fb4e0000000000085300ac5300006a53e0b9eee43b6cbd0e03000000000000000067d2620100000000752133a620f3c564c34d020d9dd456835c213717e827d79b29cbe7b4da2fcd08727cb7a377a603c4c888fdecc4eca9c8d88f3c69152f5509f95dbca1378cfdf43d58e1e616f1a18670834765b231fb10386c8aa9905e5f0f8d0c31458c9e14a500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c33d0c654edd8fe95766e3e67623271459567211d81b6a217c38a8e04dc87690dd86191c263c5eea866ec291283098ddb70381eaac692bc8f3ad71cefcf580c52893d8e1649180bcd0aa39276d08c2c653b7ae70a4695d45a664b0f1a28c0f24c7576effe001e1632030af5eb36b2fde0e60f6540c7f5e8ccfc1be39ff968f78030a89d54c77e414559c010711095205b1844b17301e8ceb7ec28b0dc8c9127913022086adcca74eebce911f32d06fe937894c447449f4e2e16fa22ff1ff3f96c1ca0b02e66ecda083e0c768dc415e0fcae06cdfdb7d4be4e168f5cc2096e32e01ce59c9751abcfa5e80e0ebe82b7ab4972ddefc5b90766084ef00e592ed0ea89a178e021d4f5c529aefb20e3626076339eab0485128123c36d84e75506b0f0919b71745021e1f8fdb204aceeff849ef4118b55115e4ef98490cade4a9a701f02cff84f291022bdf07fdf5dd1249569aa9246698292cfc7903ff3db0dd0d164105c1312506290206f06067e04d510c8b5f7c46b3e14bb7e651bad0980b11247264f0af12e38f090209180371cd1b57dc3baacd272e379798a37b0de277fc63c77280055fabfc489f9a5f23ad7eeadbc10f246006be10b1c83fe40e49e26566590b1b561887a9f6f2b4d8913f9cd565efea103e588c00221eb7d64d56888dca85542ab7fbd665d8ad9bb7f481f3ffed5a929a54c6a557ae70a0b6394f71ffa598a7a5c86e7f6c2b736d91d89925b07eb3a6d34c6d729f0ceac52fe4616b72941879cee923f09dc7fa43cd46feab4d5cbe5013530719e06b65eb3207154b6d9991bd25f22d1e5070c4078658803a44bee5d492da425a055ce36fea545fec76ab56f7a7c210aca79f56af39a512b8ab4101131146e5bc4054ddd1940f10d3df10dde37970d1ef67337beebc39a66a89b092451e95a73c0b46cc7486c397b38037862448c052bb65298b75958a67609a1d10ffbf09648dfca0cff6f85e2d470dbe66cc1860c3c6154dd5d12f4de0e9fd694832587d4ba821ba77b6ece3dc2627bc04714e73cb81e56181e61de79ebb2ec459fbc39b3d3635effc6febf3359a7d2d39da1e6841a53692d91cb0485d490ff943b60a8c2448cea2e8ebb90fcc5fdfd9c85fc3155ab1799860b0d01166ae056331f66bea95bbe9741bb44476a582140681962cbb56c232aac15d06a6b102a836cf06c6cbc1ff5df741daa8fac429742c607e1ffaf861dd66a359e6bf3c05f36af65c39a8fce697512c3518a2b77034d0b168146bd00bdc89288452d1050b88f4f11255733b04191906faebb671ce871bd16cd64a9194d572386a89866eace82dc7c365c8600331a0ac95d5b060762dd16ed20a8ae42fd3371f6051f53cd4edaede17e92943cd19644176ea2669928fa65d6e0c2ee614e824e89267b60a0f8ab5741038c9ac65a990a3f6fd103223d62c9fa9e699f8f7d508c90fdb341034414f8f10eec10b07ae5461e982bbc0579c048713e27aad4c07ca42c15bc2beea19198d68ec150273e51b3542c4b93679dd2c572d8ebef7446afc6fb108cadd598e55858c70ea2b18e55416119797240ecbb574de03d1efc13ff363b99e21a0c5b9caac26d7cd5254defb42ea82d84c3d54a4ef0d59b5646352a06248ef9dc82224db0a1e7460a0ee02c50def280aaabb6d4c6e006f444e1e89da07d6e483d0aca25c509ebea8e70e90934de9281b79557906b7f556e81e72ec4d06f395254e7410f8336c4a490546a45b316ad83116981b07b168e86d464c9ec0bbfd24ab8312547ea3b094016796e048588eeab01a403a61b38f32d7f97a0d04d0136125e32423c875168eaba1f0b0d5eaf3beecb174d2f78f12d96c9ad439d00f8a43074cff00239d4884e35ed0cd57dee08a3f82148dd0d4b0b7cf9070f280f247654b4a5aa3782373d5ba1bf7b38ba57713781bfed12c1d03861618c1bd4e8086d1236e7e87eb8240e4d457c2bf264f56bbd7f40f72040113741713a20a00f8777bbbcb44a27bc0e0008066730ce12c3eeb84ed013468854041bf4d7883a75cd7d82b1200d67efedb431ef03a6f98bf9c7aed3864fda493f1f6ce0d58554fa0c0968ba81cab62fcd4470028be5036459930051844e162eeab87030ac1272476617a0f7948b4a7f5a2f0715973569f9fd697b3f22b3cad651c6a15be8819fee6270b9464171e38f4572b43f0a02f47e8177d9bad129309255aeedd70f96586993cb365ae420b68c5585fbc1956c81bac7ff6135db053e7b5359e0883e19b6feabfe597147a167a13f5ed55eddb6dd42d63900000000000000000beeaa3030000000094ba1255cec246a2cb254ee5594f897ade62ab2ab2676cd80e3340dc75dc666cefae3369705c0d1621b0ab374b8216c772c5864da06c27a2fb9e2c6970a451e8e82d0e4d4e170849c9fa49bb18828f25c7bc2bc59cb8a823ccfc33c320bbca0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c4954ac97a38acbe6a12c00c40501099a86a9dced7ba71c12b70b36e5a795dbc35b1be9d5d5fc4838a594dcf0e25c0122ba9e5acb47566bd6a880a6395b24b9cbdbf888a9ba919a07b7126ceb3c6214abcb4866474178a50ee5ee6c705cebf1063d3b2cdd214dbf99040f5b256bc96bf0e8f8693eab0f4b0ea051fb01b0fac0a030ae01696e742952a79740d95e588b8270956b0e58efff65822d59c706cde9c260206567887e62e011bfda4e8399c222aa4625c45383bff7ec8bc0be50bdbd6965c0b049f40bd0ede4e043e21ae66e8dff63ce788961f2413372a7cc7f50fb77d2175fde048dfbd963e334fdcc20141ccc340dfe64c3a985afa2bf6797c2fb487c93403252e93cb081c812b8885677963e490d1760b89382d5981aa69f2018074a38faa020cb80ce46056f7d56a6f3d403c8338949bdcf828adb478c421576e3802c7bd61020f7e13e1682da4121b90d21bd1259dd1cddad5ea9c4e9598afed81b44a270f06030280b1383774928019d9edc1d6439bd680fd527fa6c7f344760db74d5fd1ccb60217c5ee94f5b611e2b8f604b37a98adfd1d3498c1a1848ec87227d83ef77f3409ef2d695ff81655e346b513aad0c18b9005700282bc1e0ffba5709e455edd5c8e88e172d769e9c0450c57a167733ec6c7833b3de91aee40d17ed66955f9bf6a91f71b8e035a811f23aa7e88e3c99f024906b3af690584b560f44c1889eb8cca11dcedb25fa224dbab99b8c8b0f201c0764d94ced44c518f56c45efc5cd13324314d4669acab9516d21d12e9066e0ef32d5511e437786c3edb580640f58091399d9497059fb608438da5d82fefa6e8140726018074b0244d8683622e9f43aad37789de12504ecdd5b9a842f0fb6e6bf29b0c530612f71d3950e36f8153ceac2abaf96004f3d635d9dd1d38f0d1741b982559fab6f7b42631e494838b08e7924c29173a5061dc62d9af395651a36e807f40a09dfdbadbf129555a955dc8178a3e69ecfd1511a65389f9cc7702e46d081a952c3aa95eeccfc8202f26af514eed8b4d5a7d7c53f4cf31461431bb59af12e754e25130e57fbde357da94edb5bd799a661df4fa2c51437e25f0b0d374cebd0378ca1c53f330e90e13ee572e1e9a40187e553001ac202996364a2f3add3a5982399545b0184afdb8ffc18e9f7c4c4a3256fb820fae00767b849c229047354840ac3faf46b74e546cc73f113be9d9d97b15099ec5519d08a431146e8776a8d6b45289d2143f3d36e5d506908963b86f52d35a40212bbcf0215428bbf7f06ef843d402367812adbb7395d3f1e23a77ee2f42b9e0dd3f479bfab4097b7e9bdec0e4557c7149f5cc8cf1b006e3c1b62199e243e12736b6ad84aa4c3db185f6d4a55a1cbc514476148a032922cce68fb74d3b01acad5d101e65a5f2d3f0eae44ef888ee7514a39cc8374a532a0b6c40c06e6bb06c7c1d875c793d5e0f502cb5274e4592cf1b910f3032f2aa613025fe5bc55a2e9bb243962f8e972ec8feaa7f9325043596c271a33dc799c9f9f54d493a59276060eb1236dfed7fff65e989313eb270c21f467f5d767c64db96f478aaf04689539d02690e31cc957ed7b600ff84b4532000fe2c219779a28367ebea730043baad82a0529750bc369ebfe02970fffdae4d15e0f9c8c5f8030687595e4408eca2f2bc32bc6d5bd205cf8b71634177857fd1120a91212c7df67d5f511339a68b4c7b542e8b2248494505dd9fcce12f64fdb0806b80c3215614836b5179a5fb1d08213861d1205e00f55a68dbb15f3ba27d0856c4af4e2d41c4ec781bd4c5268fad7072f56bb6c4ff746d8eb646646203fa19fab8b2777454b931703c2e78d2600ad65309046d2572c74518f98294779fa66142b86ac768f8910163c44f0ec597448756e12bcd28df4c9dbe42c6788715a04ebf8474186f98e360d4b36fdd92473c62b55c18d21bbbebe4c0269f369382f8247ed080aedc506cd120ef6a4afc3635d0d8e094ea73020e6744290f535867a930cee44215240572064dbd54ad257642b175e55dffd5fd9b5d0785f5c9610fdd1be0a79f1d741a101752d58359123d4bcd15a0efa7e3bc52ca6a4897cfb12498e541e8c96c588a86826ef3a6e0ece53ac211b2e7065d4f1244ca253ace2d6db41aa166cf7281f81072a6835608db033b676740ee23509e46fe95ad1f64913f22770b5aa76283cbc1409e4e9ab124a90f14db6088b464863bc5cecbf704f01181574c5b8d8c19d522a325116d16127c58b77f2bf757981fbab04209fb4ea4aeeb5dc01e22f8ca0400000000000000000000000088d9010767115979746834093fcd30ff80663d9a4a84f8fb10608825f69095e5e9cc2b933462efde59f0c57cc7dc7bb5a3ca15a20377eb7bd42eabbc0cd46b67a5160ed58ae9659e7f14b8ff40344f312c65b554c6b53a6004bb4d45977159c70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000059ff2db0686f71307cae5d6289d9450c64ef3e264fc302418c26775615777ecbe31a9ad3cfa76872e9f19d0abec466fb8946b3b73af05db892c2810cb4eea7eb440ac327c9be3d7faa15f19e234cc804e17a171ca46eed8143e65db3f594ae16aedf8e027978c18f3958ccfc022580d4132732edf4d2705a5ad99e9164b0da280304061bec875e07e7202a6308411d36bd3ef898cb31027920f6137de2737b7550032d40f639fe17b743c4c2488012c58514aca3bfb9d1969d55dc87312f9e293ffa0b069aef3483d0ea18e1bde81ed0a9e3d2407f17b2c2be0b35dde360418dc5ed30d4a158fbb9bc2683294e702b2ce7280649d062e13c9dfb8654119b1a6134c00f031fcf064ed358d45f481615df10f7faf27f4eb0f9b093ef848905be609d805ea1031cf0b7578dc91113978144aa9294f3f92fd55351fb860617d80463d0524559ab022f9dd6b7a58a44fe42a8242ba0f5097367c242346f4abbbe932e03da7eb4b357031f2800c192bad38f5d96d75d0fa298d53b10b1f376242b5c8582bbecc191d21e0305ea5ce4949e62780365a17048b788d977d61a0a504ee5255f8a6b4feaf0082fd7417729c5bf3bae5801860e88417f897c81f109380404d2800c1eda85105f6e94a65fe2c795d49b56012990c162fe9580e7898c3b86f0adbd6764fa7a3e136fb89503f06458b0ff449e6884f4a571473f68277536a3376532ec5ba5d0d031c00099bfcbc3b29cc1fbe63fc0a830f8107abea55c0ed087c47994eb21ac9173935bee4aa555dfbb804e8055f86e8f0faab40fe3b51061216c14601f12cc0fcec7f2a1fc61fb6b9c4f917fe44d9b08181a2a584e7389506e4988132bf5b25115e26775f0929a0935ba0877498f0380003c765ccbd2eca53efe8b08d2a1ecddbcdaf2c039d2e49944c57a329e7338bb04badef59800dad5067557a0395d0a23b1fdf9b43cd3e6d372070f84a6205e808baaf8a97b2fe20b190b351585b48f866ca65613926bbbcc36e68cef97bb3a7394d9ca401efa9295a4aa97b325bfdccbd3ca39084f1fe2c96e49724bcb764cabdb1ba1ab3bfe93032d998ecac572c24cba74ec0e83fba7537bea3ba1b6f88138a3756acbef44570eb5ebc055be28e48082ab79663b6487a33dbb05fa7023339f9335cea2a35c8fe6b0b263a971dc68f354a1ce84da3a49567cf8118dc9d3f54e3e2cd0f27d5529cabdc16f6224d35822d17f104c8c8a1588b102622b56fdb9ff1be1dd25a5e7ce2a1c3a8e437097ea8aa6c907ccafc2e3a04f9c5741ace199ff88199820f67a5e8256f4bf98e1ce79abbb17f4a0c60fad1017f4a0c0a5a85b8e9ef231cf588d2e684b261e1ec67f3cee1ac7a176ce6d785d3886dcddacdbe7367638d8dd8bd022640cd398d3b5ee7e568e362351281a1aa4311b1a890a90f2b84959563e05fbf507c561a6e369e9cf1ee4f9c87c0c0cf003bea810768b0ce470a384e1a34be1f4d1fdd4e793228c37d8c974820a23fa2595b484deb26dbe87ca793122e01b964d8a11d4e386ee3d92ac183e440b5a24a7a3bed9d720018052175c7e367ecd15b057a4cf33fc2138b564b1cc8d1584442b36802f486ecd855ba4fa1c1ac071db2c19fde570f198cb9d6b9d3e99fa045b6e975eb4d6c18cf82916ec7493c2c65136aef00751fffb622cc237b980ca9f5e2c488f816b8cee50bf1397a55423523a04ffc73fe0ce21877446c0a8a80075bf3b0ba060e00f355f39e6cb5929c19da273faf438f384d752d418f012443be1e7d14145bae5fbd0254e2905cc2a4bb72fecad954f8f659fcedda9bf74f478a344e8d303b535203587f3275b9b4f3449cefbfaf517442a587d95c43dbba57a0582f2fd16399eaf21fb9ee4077747b8586c500712a310ff770387d439b6feef3d014ff370fa3de8b65a6045a1fd8aa363ddf064abf978faa8fa15a62427120ac11e8719dfa984a76618c2471fff1ab1b59183c108d99b7028d9e4fd1a825b671e70d475b34ac3e09b1902734e717910cf75630da50d990e9d7e0eebf62db7c9d29f201591d8bc22ed9b17f24a1e26073200200c17006e2a6a2a16b51cf329e8672c5cc2ad5ba65d9bbfdc93f96e8508d0daaa505568251373048a087fb56f977bf65b21af037f1d5405bb1ccb5a7d860ffb6e5d84915c0b500bdfd807a070cd0ff4ec2c7aa2280ec60d8472212c841c64bb4f7517523b51caeeb58dc3018512fae22d2f7e0e0a6dda33c82aba8617d663d718e26a717038c518c23e3f168191185c3d462ae1f8e57f743601a8c932c8be0008195db7e1c5693c9de706c43d42b2ab9c544dcc6ff2e0c7c75e56c8d27be84c48af5036d92f7a4033ee5b1dbf09b0acecb8103d62b2f82a3cdf50f74523e212eba61129220d7a3331729f5e3858318d7df78b9c48e45a6295d460ec0004", "00526a0053", 0, 234662915, 0, "1f28015cebb58fd9848a36f8d0ad86fa16a41a4a31c5f094f7ca67550572f50e"], + ["2b51c47403ecbf87da7066d60d9c3e1f03627ace780c096bf0106db830641ae288fe03c644000000000153848cd73ad0314cd23aa50f9b120932e592a19a2ac820aa9618c9f430e0f74096ac24907102000000066365526a6a00e0bd823380143ab1f7012fbb434262f4a5c1b3c99ee7784e67600b428e3cc22a77672b9f02000000086353ac6353630065e9fe44860476f0a902000000000765006552ac656a4ce18b04000000000763536a63ac5253488a1b000000000006ac655253525159fd92020000000000000000000300000000000000009a73af010000000034fc516e0dcdedf7682ced2b56ab1aad34aa703a47ad15d14e579612446577072e3081ca3197e0d0fdf963972870b647600bae3469d605c543e7618fd92eaf788821ba81184dd8a4f42f417560803b9c1814ebbff81606d9ee07d1f819a59ff4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006abdf27b174d05d413490e366ff9960dc34a93d93366109b8e84ba0b7de9883311b545766f27dfe868dd11c79242e41f035855c29d0835ce349040c01126794512d016a4699f550ae8818923fc32d673703ae246699139fb14c4d18fb9587863fb47b31bbdd8ac5662c52f2692bda72e8c9cd81686824a67a55a66e37261e604020d6cea0743a6595eccee26ce8694642e15f8c3208e9510cdf5882a2a5146b8f2031d9069b6fbc87378c17a1b596248f29247c0337f606dbae863299c389d830af70a050c341380f8ec20630a8e7807a10648ef1e40bdbb1caf5a9aaf8bf17508a736f5919430b00947733760061ac541843e87f155b937e1279eace5a510cdcaea47030db954e4c85fca7e5df2aa40f3f9961a90e78dc6b0c5f7031c599e125cc93c67030daf0116d9b94d73f49a772dc3fd40b4485e215f5470d2c461a2aad90bfd42c7020ca2eb3b2ce1d301c7f40c4507cf3373c05a674cf14ed63f48cdb7af02c1528a032e3c94fe640aad91b03dad08b5b86fc352397dc77a06604484b3125784f7c673020f201288411375ccb69459edc1ea1f0802e25afafc5e50d60849483f5053e5051a277287417995aa9cdafd54545f05a6f9ad2737cba0c77605b75526f789a1158269e454b681f31ed139c014cc292a837177a6437cf64315e64bfc6de519e30580e3f982fd76b4eed2388edf452d0bcfb3711fb4e44cb20f1228ea1a1865792d0bdeaf99a2b5edc046dc5586e3b1ec3d38fc6d6e60bc0612a4f0f765fedea8b4d0ee9cb3d8561bbb3be12676232a75f430939b03d3f20fa8d85eb2f68e6c79d5e47594f4588870736d2bb38178fcb819e6321ed80b5064c2163a2429e904affa86bffd32fab04fc0b0123155c81e31f9859c0c79ce46564b74f3bacace602fd63ac32b740d0bca60c0e499ac7ee857560b0a612131249eb342d3862949ed70ee85dfe781792de900e2784f1afea1d678d9f8843c34f03a1450aec2314fe6abdaa28b0185dc3a1c7efb00c0476907cb9fd9d363961fa4e0fb136d0ea564681b61b737dadae2052dd2bd1951d4bc7b4dc30e7bb8d8fd64dd7d04612fced00c262be6cc0b284713de58f4bb5a3ffffa16139c49018621ba85b7449b3a5fcb9fe2cc3d0c4dc0454e1769345e226fe9922e7cf122159a84fe5e02e8e8d21237ff56cd30bf81fcd3ef42c743db854c7f0af959d17a25acd28117720e75c29b073a364da4c6a4210b15ca1a4fc7ab4fbca506530a066055632bfecc800f773c93db04ddaef1ddf7fd176142adbcddc9454f74931f735d44e1a463d80cd5ae7026273d963584dd98bcdf888894e8cfe45538824bb276311dcd34260dcd188f9f888aed81df0b38e34389c4d92971496722db930f480c9d45aa3ee48fe576fcebec658de19744b6d4aebd2d0f2146c87b2933b05873499fee309d90124cb02754a832ced74d6c13fd4f835562015d1b56be06d19b207a864f903fdcab01ba6ba0ccd916f8cd6863d4073275441abf528b25cd512b72134d70d17ca22dd07669b86714af854e08bdacd6cf82039c9c68d63fd72ef2aac631bf3aef617d95d6e00d251c2dd526a0fe15bcd24bb03bf32f4f3f03cfdacf1691daac4fee0b242d43c48541dd23da3901a9e4fa9fc116741c9821c0051e100abd8b154b78365edd8e6ac102bfc16343234f57102036ccffa123fb8be34e207c04d549adf6595f4de6b9946f53bfa329e77701f6d2f9f7ed105f2548afd0c37b91f2d4845795f6964be923ddc122040f1783eac1f80612a782a6e48aa92a54e8769d5288d3201950ab9046893acade91aca9033f2528ee4bcf45ef79c1c0d5480af171c48ee8447936327a40cc22ef0051dd443f9922ca51e878b018b0dffcb5c458361a95351b2485eb17d18c055647fe495a31edb731817d3fe9ecc7e8b2e716e851b39cb6261da691e872231bbd1ddc0e9950521268b5db5399d8f42ca2cde557bc965e9eb2b591bda5b8c574ea39afebc70cf7d68631cc8236e656c4af98d994f5bf50dfe2a45c298ad95f6b204f1c15cdece8a505792f37197e2a5ce4c45706d3c1a655c235f433f2d3938af5e9edb589ce5f25245c4e16292ebf7b90cdbb2ba38205933313c43dba24c3d55197bb75741ccffb1fc372537c2038471fbd8c8480757af6a2829ff331856c6052d79ae60b3e80262a87b737c1408dd03971c4e77341caea06abb451c8ce21eabef650d4eff44743a3df924993272335369d894dcc6886194b44c6db582436d05352b4e46e8d9c76c9bb9ad88b6f8033c4c200000000000000002651c8010000000008592678351085b80f673e01c025ed58684d5588a25cbc10b34bfdb57bc127954ffdd78acc20448a4f4af4a1f9e3ac6191bb3f74bcf301989554475659a0774dbafd2ad09d5700f36b9601b16b95cdc2a43f10315ca57676633c5f74fa32bea20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091023f9ff951429fce5dea6600b33a5ad3cb19f96684039026f8831a5d2f04f878fed2be224d78094f774cae8685675ca87ef3626c5de0cdb85dd432d23c2fc1eaaf4656f017402dd49347e43f12ea2f4e558bec2fa0ece00758bb6ce9ebaa3e40e0f7380ac55ddef67688eb58e62516b995d8102a8e07b66e938137394302fe03206b664b9245461a5c86a31633cffc8788b43df86b5bb4de6823d6ac6b721d30032d358fbbe96762145de5a5f08187d367697403ccd29285350940263f0e71de580b0146262a5d087bfb4f1f3a8a495436903a3619aecae661ef2eb6445a3d952412623afb4312ab90d41ed58c264f8d583e5c6361342249f719a02f860dd34bfbf3032c31d8d79125541965f19ef2d94249e0b37f40a1d4d898dc3a43785ebe3344fd020eba1606c58699cff434580324950069f6c7e33e35ff864c71b3274edb4e788f03035ac9555ccaa25dc0aae0e8393bd91d38bc640fcf390e65d3be31da3f15b91002097ec4fddca9c615e738fe088f668afe3df3027af61ab9bfff31dbba456b620202229a7f46e77d343de98fa11c1f7738c17e6ab65197fbd142b6711fd523da2a5690e646eaebd589dbc1e8a5e56db08c8990d52ae8deb036300838eee0e734bcf65b7d256f4e86fe9a15a82ff821b09004dece4f00a6427c5a969236917949e9ff71421dd0f80b27cbab012237be17b38db2c4728020697c3fb1bfd7db27b72e5588c7b91c3a2b61b3b83e7d470ec7d1486859b08cc244070ae1b356f4f497bc3d0262d95f36693a358160743c3ec8eccc922ef5b705bf20d1ed722a15002e45ed375570d5280ec8fa6761c8932a2be091d0e3fa6caeb56c27e5ad1ed0701a0ef6904cf4b44687851356661a5b80f11759490f302b6c2b9d4658f2b974a72463934435277dd31839cbef109bd408481c414e9fd074d551c6c2e1e77249fe358185f467326338790b2afb2c6254ea2302df0e562c99faa168ec2c392132537c8da5af7ca712a81a95561c0cfc25f0e570bf5245c9c837d823a9bdd5410e35d52832721e0e94b66b3891f498cce9c11387e3ce1c4c451a82c5e4eedbed224ebd1562853bff5203b48125d3cf620b95a6a82c431de1be547a79efe6f080efbb4d6b1cb9545f8ef27c9144d1efd8d6f10219711f83923fded66ad3b5f004cb3e880cceec1f475bb1b6d3bc3e939ab98feb0a67a278c85e1d8b00bff91f3019732314d9c3480641fffa676a53f4ab01ae498e8cf456a0092372f0daab4d4531c6c4486771798205da24c484ae4c35f933130a89778bf712079aff39d19c5ad5cba7f7f879f7de020a8880f6d20b07518361c4604eedcf706b7530aa79fcf5ed42909be3f1a17208146614251336d2bd5f701be2543bbb34586623128a6d1cadea2a0ba8cc8152534bcd6b214026f5fa7ac1a9acd4e7a45aac70c63d84c7cacc085864ac32b74370a8f819bc8fa9ecda24ed555a941403ba2c5cee1c8d52d40fe49306910025500f59a0cf2010b028a2bce8bad94537cca98601a7853a1a7ac015cb83ff54a356836a867f211eb1558223554810d7878097f315e66834fe0b6412133287ea8d39e39082e349f004335a9b78691c61c0172d39b7f0c2a26db5a12455216fdb00563593153516bc6c45d0c601a034a2256246d4a104f412cb6f96c4587cfaf320f325475229d55ee15908e6f5852e960fe683dd7f37edf0b7f197d8f5caa68fdb076ebf889192a1f5d2fd46232b4242f897501770152738af9612f53b1f52c5f9c7d2680fbd8f12d1eb6a5ebb84de38e2230168dd072ee8fe0d98aafebeaf029357c5ba704845afd635ccc8574634d156709f579224d62e3c4f99a4aaf9d39bcd8cab87180c43bb750f950a0b1b7875967882a76a81620ee83e480b5da881abf976f4931206e3612d75ab45cbc5b94ea54efda5ed5845ca84dee9e8f23f5dfef4ed3917a3577352128a1956b6fafb12cd02c74cc1bbf5ae0685f392e56c9f9ffc9eb48d729f84fbfe9e3f5de3f4c1923d74e4c2fac07ff0d8f1354d495d7ab21d5e9160477b7681d9872a0f00ad7da493730ce9e626af90c6f20b95941b3fe52f6cab6cce8bc4857d45b38c912c722de8b2468b93cd1b138f6e61772a31a0e05df20ff2fe7a84b4774e1c164375d40c24bc7970b9863b3d38423695de4108af905fff5afac52075eae5f34eac09d03d39368611d7da3b01a49265741130bb1f84a9ef65226af429daccaefc2bf1750c62b6ddf156d23d8b14ada27f0f43b9ce69bf0408d47332db97a9ac60f272fd78b6c61305010000000000000000000000001cc9cd456154846c546101a8952b572040100b2dcf9a0acd145d53b45ea55c5359a75f8248b4f176e192833d8d27680e9c8227398da2ca1f0c7162fb918185ef8778bfda2179bec268dcd225f00db7dfaca40b14a37b717abe3fa1506d6c1d6a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000373be4076c36d25f87c2ec782559981da8d30f3303f4083d781eb7494656fbc2851f50526a89467b48d85d23aee992b828962ffc586d4bb01ef09baaabf225f7011d77ca3c67ecc59e589aaef72634aef1a320778a1c0e08d3b7089541ce94b34763ada865ab03d5991c87bd789bfe46119e417bc8d6257cf8f2325e72b41de602229a55e030c01b3f8c39d2b53d70b499de92d76ba28d1c008023154382343d5403090b2bbc0774675aa5e618d325f6cc12c7ae2073a9b9d3395e035485737683bb0b00362e7fadfa0c6f98fced8e5e167b108a01f360654fa2d6a713ba0aaf183face464728bbf046fac6e984966b6b3578821aa9a21603443547cebce5bf4f24ade022a09e8d3581ea3de283cf4b2fdc03f7ad161df4a9d3801f9e3c7c52ffcd186fd0307b6dbf7916b26ed6d10a285ec162effddb72e07dc7999714b87e04774f5c172030f7e0c822667d69e34f59f1b2ef17e7919a8910041c32e7c232d0eb9142cf6e302054e68edb56bc56a02611438e7aeb9801d1292b30a74c5d335337409511d72c5031b184f045aba9951f57eab6a2065e134d50df5dbc17a8c59674e7645ff0d82240bb08c6f572931a73d79da56fabd726d031a9ca273ec837f3e42ec1098dd6c10664cab87d20b13a1e3b071ddaa04dd839c75c56b43e52efa0aeef0e312888e2ecbe8639c97df3219d3c360e90880cdb9fe855090f7ea60d867b8e71c17e2f48803a5dec76921de3e764a96ad37d565882fff0fc040ed309c0948f76daa6831ab7eb4d6cb2c534c986b703aaf29f4da899b10ec99e1f65ef9aec7526e29cca4884f9e566e1274c8a9b27e6a31177c951cc69ceb908f466248f624cd0f616ee253951731c40ba9cc75aa9c4da505980ecee6cf6c68ba3b8c35b34f82bf3a43f14a152608bbf123a9358fd7683d5bcd55ce668e97643e5005e9b6280c8f5e14092ed0117591ab44ab39adf4f223bd75e6fd2af96b178b1b0ddf60aa95183555c42f64a40b9f011982d723007eefdfb3c32f287f4d187cbbb3cf455674a3ae35831d09db221fc3ad882337b456d1dd1e14ff6cf33218568660accf688f6e55c90287f37c190b7c429a3c6fdf33ac385b9707112f69ed28b38209231a649aa48bf97e44845d48a2fc3bc65498e265e5ec7b7f468939c5d0a8fb92ae28071262fbb310dce10b44f78b998932e7edd663846e88fd52168d0e0e4e25bb49730c45f8aa77c58b7ec64dc85f34edc42f81eef35f15b1ed804aacd352e282227f32d51b907f0faae50d1431cbf08e542a376dff99ba26a0bfc4a53c2f8025a155b9cd2d250ab19c1cd22cd1a6aa4ce4123c24ca0c38e6e33ec40c29a0dcb388874e839cd73337e2fc48215921899f4ab7d2f598cee3ad2a0db7909b33248174860b8ce5355c35895f135b3e9012c66fe3b62a9244d7c87d4390513c89b18f967c3323fdfe8b092c4dd742e07b4fdf0d08d75e47b4d80e0f59057d61bf52d816d47649bc68a59ba64dd66ae2f16ac4ada17ec7eab51fb64b6970759d0470955062bc80dd91020b44982f6be1f59c44f09b58648fb7f6f9d69468c43c85767880cce0e915853f56e1c72fc59ff28ca031b4812e6b29f24036e464ab798b4ff99c5ed7f194e3446af98f72704f09ed6508b7e4103002f77aaedb9cea838118c3558765f2b109bec18202727b786b2cd68bbcb5c7d8368050a33f609c228bed34604af700b7b2c714139986993e8864ff47431fef8647749c5476924ad2a45beef3c30cf0c6bfe9752bdac833321a054c59279d1c048cbed3e58bcaf082fdacfa4e90d12b922bb190e4538f97f99c2813b42788a4b21f26409fb43357b9f88de2d770fd75eb05d9c1504d812e82d16088886764779b9e007d79ba3a7269953b19fe5ee2675cd1726d7f5eef92118d65f54c0cdbc19da42551d1701b5e6c059ca5b1eb836ea23c53ecd436726653d84c86a7676f01b42b80f54154ec643d23ff1b1fd789f5f05869b199656d127edba43275c341f8c65e3f685ede44639ec6e51f6d10b2cbf71820e7a318150e0db865ca5bdcc7ab2e77214db97d2e4968caf14c223b7eee507f87911b85a233dbc2b8cc095e9f45c749d4f35e898880f0d5f6e4b37b7f264682362f7fee47a518ffd3b6286dc7a3541c362df888fdd79b7221baf6bf6d1c7f96c988ba70658e019b0b9f440586305b1ae3c9b36ee83e89fa5bb2db7714b982f341af318ab91ca71855ad0dd489337875533baf9cbaed43d1c4d63d5215786c8f4b609124dd3d32542f2b1ce111d61e56494629d458386362f30eb6bf13e4d3d7dfc26389a636fde35e2608d9083d90d159f9d0a32d1e0a1ca978e18307ae9570b7a5fbb8f0767d917b94698a57bf31d6d14e3a18714a3570be1d569ab6905abab7e723f179b9eba72d8022213245ddeaf0f906", "51ac6a536a656a65", 0, -822971662, 0, "a3f3884a2ea87831bed0b0d2c3b80c5b64edd75b0335b1fcbcd049fb0f707162"], + ["030000807082c40303b4f7df86993859e1c8640aa43f9295cc17466cc0e4008c0afad2dd40dd4f37a802000000046aac6553ffffffff663276dc2944dc70a7a9cd809fd4c2e5f18fc2de96033416939039ac01ea54000200000004005100acffffffff9c8a5a582d11d30ced781bd0f049f481245c2620cdedee781e102c2768bfaba002000000085165ac63656a53005ce26ea704d93a630500000000045365ac5359e7220200000000065252ac51ac6a08fac50400000000005ecea40100000000036500656dcf2f12630d0fb6010000000000000000fad5f10400000000995e5e9ac47c226750535ab5b556aa8e29d21af83302dd3abac3dc6b50401ee11b5d8874b8ea06650ff28f37ddbb5646117e14a934c4194d31e3c4fa56894973b456709ff09323da00969c96d2d8b0b750546455103a581c9ff34a064497a64500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0600297c2292e677f3920031248279e6c96beafb507eda886fb0176eafc423d499dfea832fb89a28f652459d114ecb27ccd7585386e4ce7d6c31e9ad39c74afe60550217b8356378ec8f4535b2b25d93668bb37a47c508aabebb3e108366bcbd0bca6b6d8171936cf11f5eac5749aaec1923c82d79b5e60864104c11828f496022484413574080b26d679479fe3ba257e1ce4f782a8853709f8f1888df679d7ea021dfe99eb62515123c5ae34813153c94e23c4c9a814b529ddbebb2a778d2b786b0b08d63c0ea8881cb45283eee4a5fd1cde344b499b32f5cc974988f03d0b2b239c98854cfb72318fca247238f4c93016da5f9562f2e0ba6e15635b86bce4eb5fec020f0c30e99429655ad4317f17543422af1bb74fc3373f6d3e3ba6b3d71eb28682020ec92f2582df7aac866407dfe9edab19c62f38866aaa0d6b7638d662c5a38e540217f33bdd453db924c18f9c68aee8bd2ed2943d3e009589209855d685e17bf31f031ef3cf12463f20e3b29399407bfcd0f3d1663165deb5f135a351c85c1b728b54031d47b7c4146553f142dc2517d9094941fdb2c2546cefe8de11f3cca304ff0dd56b20891449f2390f57cc07857a3b536fcf6a178cea5ededbd7e30c28ee2f66f29481819b738367f28670922c8a24fa3dba51488545b91e129442d5f407678a352903afa1852363ee440ee72eadc4d49082feecf61b13942a1717f521db4e844a2da60fe6dd6ad6fd7a5e4762b1ac87ba42101af48d0e3e9a7244dff37f2aad38676a8ceef64b6b3bf2ff6f977ec72ee6ed8fdb3f423b4244f5832dce5c41cf0d4c9788216e5b0c0cb88ea67c93c41bca4a6d66086e006de7b294c25797c5dc5cc1a2dc74f57239dc974a0a558925f8f9b25e0837b470a11acb3a2da0af87a93cfc6faa78da6b520073498290b495bd827fe46ea15d99e97a26a4c77292ab284cd916ffe96c2ac796e8e0473db6aa16992d434792d56285de517b87c591545d803dd87e395cc17dfe0c53daed082167ab60e7c6bbc3e3ee4eb1280e721e3b56ef5cd20952c8a1ed54c28ba42c50b289e2c4b933b9029185fae79bc7b4d0a4eb31e8c8dfac7cb853a714f0ad99a0543cc87d37c63e00ebbac58a2896e92f582f321f1eceb02eb8b793208227e4c9ae525268ab2057a171f1b115c91cd7c0706749b75f2e45a18a43b72e3705c0a7e26d03c820283b0540e2b04c14cb1e527d25bfff75d93e7e2382c69c84bae0df846235d93b2fb4a626bc2c3e6cb878fcc5a128fb1b49ec1d27e4405f5f03498b2a760706a59340c24d9e2867c611d5360056c31ad342b9fd6e5d3c75f0d00c43e36239fa1d2b1af5a33f8c7cfb1686f05f1ef7b2a048fdd8b2cb19684da3ba3af997338b6cbd99e481d1285c61aa8888565bb8b4212b2ec423dc8f1d1f93678ef6a8ef5d5e0fed96c425f5aacf38411bf324a27195e731dc103bf54ecb24c999f64033d64fcae7558b4d92b1fb6aaeae1a0e3970857f055f88eef9355f84e1e9c9c10a6909e91edf293c4e83d7528e147c1d194b5bfaaf190215ab8b2797af1695b426991b9fe162cf7133824605a17229ebf4a093d01338549bd5c60ad31c2fe07dff6f5ad1259d17015b4200c8312872c18a3dcd4ff5e87a301ef6dc3157c5b33462366aec85aea666e7d0305d806a68360318a202eaf53af4303f12ca4c7b0871387a2e484294319a9580defa57e7b9f94f939c7a7337684295c218e74a5022e42c3a0044814f5fed55e12c95cba0b7807c0b7c114bc1047f7dc5b197a9e3b0acfb01fadbf26b11338d59ca94086d0a78acff095d058b290fd00ad5dd6d07d0203e82f035839e82f8033c59ec0f8676bff506cddbde050fb830ae569450de307d0e5a1d2f27c88b439d2a5a2b844c84863e7962def74bb61ca6ee732e5f17ffdd4903155def87c035ce78e3615e4480eb4b08ccae982e32085127046934c2aa57a91b854b04720d12f35728c5e16be8449baded04fb28decfe01f82f2ab2774c22e4a8ff3861efce89ee2b9ab78a34418d176be33c691f19638070ac171c56e49d3d7a029ca4928793ae7db0405ed99621fab7d1c035fd72110c12b43506ff0bdd4c50df7da8278d409d5d5ee3aef4c36715d82240997571df7fa107f422c4acc5b48f599250763cc128d5bb8401978517a2ab593a7f16d96f26684e738c2f8ce5b5f0f26f1724d05ea8f25b8a3a0f574eaa12827d52077672fc6cc012da1922762d53beb3358ce7e933270197960884bbb144118305e38cbe8f3e43bc7d6d86342b03a6abf9dd043d0635551edaff25b2f404b43f007d6e0ac087e9e54023b2a037a45bd7fae67af8b92599f022cfd3f2b365ec9517df479f9289b87c3727b29fe06570ce0e5dffa3d19ce0e16e3fa765dd80871c41570aca9c9c2e82e050e276de203", "00656a53ac00", 0, 626294155, 1537743641, "51e764cd3d76e6cefeaccce9871996c41f5d0061472a1e73e75fd769556b6a3b"], + ["030000807082c40304a6abb074f77bb15fee9bd215e446061255cf4465d46cd6f92a829c2385ff87a6010000000951516a53636a515100ffffffffdb8a44658b73c34d4ece15c4ddfe067bd7e90123e82d6c3e9f3291788a87510e0000000001acffffffff502213ee0846d7011e79788df13ad72a6660fcc57abb01dbd04e2ecd36642854020000000078684523ad205466a76e5789ce675846284d4b514d45b21b3b74cebaeace6585386416c002000000046552ac63ffffffff01eb8ee9040000000009ac6553515365635265dec441bc00000000029ee1b90300000000000000000000000083096a304c52ca63ecd18eeaea97c98e60d0565b34c5c37a8856aea388abfe06605f99316cdf87c29326b271e6b260190a4b99e08bb8a3f46094be8cdead39a1c1d8f8c131a5e47c52d1a4f369b4feb9325027fbf266cd59bdfc7fc959d91de800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e105648dd85f21c6a76dc78897129a739b03ec08c10378493aab1a50a92f3d97e686ddb48525d3494abf866d7356b7e4e5057f48865b91b128c724b181d91843dc7a4f7b4e63b24e6894d34046c8d24f8088a7b40022f31e90ec7470b1f444b4ac2fea7a5c930fceb8c97d3bc5c2b2d11a624b7a6c95eb968289d746a800fd430213576799171aadcf780140923d765336f2eb74839d6d09145ab3005bf18072c60317ac301552a88e9fe6c70c00fd7b5d40f7ec64742e7814fdd8aa1ceb2f35f5600b07a199bbe57a002ced968be9dc95e4d224f74292071970ce9975ec9ef5c6a29f5f1af336751145647f4d641442035447c99681d8cd75edc38401e7c6f9995646021021ced06e2b54c73ac83da1beae39b39c4a82459fbc472c60c98653f54e6358021cf805f024dbe69ddc9829b29865d1bfaf3b5877f48509bd03f5f021be05e7fc022f1ce47aa6d904b6c713874e2ff49dfdab15831dead7e525bd540644f47b852f0328d6d437d9b532a23f7dd019c33d071ca063c8f53788b18a7bf48d3052665cd5032439597b7a42cf81e1fa83a7d692d1300539d394663e93125423058a8a691689101a6f1d0bde88bb00c8c91790fef239afce27f957412a99f9a9d84add1503eeb360e768421314a377827b7d4907114533da0f90aaa3e676e6ae03f89bf11a85e8e71f3f9276d8aff410460c6045ff906e14bef3b20a2dce20bd4dc23a7c62507aa829d0715c516232a56e4bf7353d92dc6b46ac02eb3c2f8f6a743da798904c277ae6cb660979cca240e14069e613697a6fe537e498c91f78fc2b68ac94eb1d5b56ad1180cdcb5b9f808863ec16eb2bc45fbecb5ebb78cbe11b570558e30eeb6148724d20d13cb36b960ba72dbe8d30cef93ae575982df95584168358ccf620577e9aca5ab661b8501ad239dddfe265bc8ef595dedd05b75fe52ad3f1cd54680ef6b67210a7488a30cacf895697287a5cd27eb84cb60ab3253c7c1b4c8c47f814872bd85d8781c39c1fc562f517d4795b3877b0fb8d1d894ab2b82f64454775e0718794ef085b80881b15f5fa30387e90fa46c73939d1301cb725a19b65ebc709e7527de111712945596f981f6f81ec2a256d590808fdcea754de2510c8f95acaa2b9a8ef7c84e333a76d68937205afca8786c33c0bb4ce4af4cfd6e9aec5862f13eb85734642c566af16fabef01a9d67322ef3757b1146fbf89b85f1add41e9d67a1c346f7d6a2dd11389edc8a91a76d43bbe2a147c9c5d1bed0e564fcbe0fb2c4f2713aba109fb21749e167f361b78a28f056e57159911446913ef68a58edeb65ec9ee9050aa4fec9176f531579e889ae4dd9b97fd378bf5dae0a48e81a6dadbafeeefaa7b89fa92ee27c71bd3e7af8f2913e80bef36cfc0109f7d0c43425f5cebb7b61f3a68757749078dc18e9a838a7ffd644cce4f55e72f47c5d7054f660fb5c1feca753a5b88edd7bd4f514f25ee79cfd0d1ecf0d1f69b0aadb622edc9678ecdf59d60405a42215b0193a012c651e91e38f7f3109d9dd501d883376dbc61619e71f5d995179c8404b556adc5be857cfd65f62fd8aaa2648ed0e482d26f8eac64e23ab2463ca2f685bd3137cd5e772db7d2bb4fa85cbce215e670cd2c18dc61b12f67927ee85f65ad5d59a3c44d87c71a71cde29d874385cdb513c6206cb1b5ed7365c4e3a3a9ef8b7c5b92c1daf884e23619a05291cd009aa9e55bdae136b1c96268131fa6640bc1bde24a6dcd7dc880288f7a224f381d53d532073c40c7ac8a9ba24ffe829375876a268ad54a47339fc5d6dcaa4905b68d94e9dba55b2bb613da5ebfac7f9ee651d44a3530ec6f0d28d577abde202cee11a840a6e0f8373d8f12c1086a368bcaa20b2d382056932adc402841da3923e8fc7f68b8490e271faddb33ba9d2446c880a1878547bf8ca76f7facfb5be4da80a7e59c9dd1e59259a679980d97e132ac0a97c7ad335e4c4283d5b8020b76f33c60700e3f9a8497a2305a4fc1b3ef4ba8e91bff9fdafd0311b0ff64d99dc690261e9c30451f42d8676022beb75c38112243131c41257675cdd5d0969f9465d17d147da563a530e43c3a4975e3024a99b6cf6c9990097d8027c896a7c3fcd64b1623160c37892070893271d9a58346562077cbdbf455888963f4e0482614a4607eb42b7daf46b788c9619643c8c79981e18d7b90b73159850517caacc7beceb8e3e21be8247cc332a900bfaf39bf360f22e097a0cf0ccfdf63b65be34f7b64f79c5086b429548e25826fa0998ac418d920228f0738253b70500000000000000005095880300000000a14bdf182a136357ec5f1ebdc55d554d6d98905fd46fb84471847c4aa41eef5bf5c76ee12b1d55e69533c69afe7b052634dd3c2186bcad20296ba74afe603ef554617eb4113d93bc016d1e486c7bdc8190870c99f7368decad4de7bea33409b4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002fd2092cfa343408fa7c0e05a1165a1e361da0f26ec2b62c93d246574786534af70dce4d74c21ed2b5fa6be30b3743f65660e6c33b93a4086f96627f9d8b6387cc79bd1c4f79b2a9feafc6ca2fbf123a1dc5ab60c1d801e456f968ece94e91c873c060b76252dfc51d1aa7a8a538bd221236171eebb3785717e92cb0b535005f0213034b01e7ed5b5fe81b9c28f3e4ee5fb200520eb9512eed71376faaa28b5358032375555133299505bf6d990660b45ce703a85d7419eb0fac768b7dada86675dc0a065bd5841e8c5c78d069abfddf3e6910b517f0248f1846e46927883e0b07a8fbfe1b4f6f099acb9b86d34f8d861f733836a89f1ad0b98f840ddd98ea1082d90703127c097006872f07f4091dbdbc4877a4b29074afb2dc92707dee457f56e68fb90312b399ce95a99a4c7acae45280b7f3cc8ffa634139becea60a8f8f81449ff227020d6c11b947d206735d231e22c061040d42f5476063b7b0b8c2c7dd0f291093a70311570e1934e6186af7664ad4155eb7b0bbe26e78a4003b2ac54a12a7fe1350f0030b0e663ada5a1ab85fca70d377bee61ef94945bc93443700e9b12f9662c061bb8b7b83eb7a0940f4978610ef553aba111be640f0dd5844d110cc5024f0aa2f9f59a3cbeb56598694a417565210cea25036f246c5dcb1695a9e90f8e9e84ed0c15131adabb144a050f76b411dac35465dcedd14d595aa690a13b783242af0291ae727b3d8ab0442f4e9f8520660155c12d2daa6ba1a1b6ebb804b1e0c6ff3c5dd8b3f9d9efd52629ad1809ac2dd00f8350ca068483399317b4319cbb81f0559d01ef56c55eafef851ef9fb3bde713234ae542138470ace80e58b3c38f3a6fb7e97dc5427e86274da5ee07c09e314f4e5e56121325cfb47b88d4989a4b40456b1fb8ed583960bb7c3dccc87f338ec04777f2d6d75408ad8de64977697bea3035b1fd236eaf1ee1467f409f095ccc0fa117b02d475af23ccc276c642999cce2dfcaf8dd983540208652e0cbdabe894428aa795310110dc42a9cc37dd77c6ce4daf1b08bd9517702eaab3f3a034b9560c8b2c989d7fd64f962841de15db9106632d323578478bf62e819d744216f4d2acc034b2382317d13743397f496c1ea7101923a1cfaef7c6fc368aa3be1484182c2564dddcd5d271e025fc69df97c7bd0bea8ed6c162caae3c1ac8af5e9b17ffa302fe810e213f57ba9e4aa6bc0675f543fb3eb021d7efbb42151980cbf996ca46119da8ffcfe7a59632366a8e5a0a2d4239ef842b9c159eac1c724c1c1e0dccfbc3c210ddfc23bce001d3aa0966c710312332fc06186328a4ff3f9f28d1714b3df30f4b95924b008a5f52c6642ade8cd3a3c66e4e008d85c1491b0dc2ab5c8ab80ca6172bdf0e21a88a62b3c4f660bbb1ab1792f85d6e05228dbb9ff0ed657ac083baa1d531e3c7ee974de95b2353d01a5936f17ecf228cde13b331208f637be72c44bf88f6dee423d4ee4648da525dc475421f3f3280b425d95f21eb380f87a3df483e165e0f8d800d63ad0f7c91c727b026bac39479018a3564165793e4053b84aa32855ead3b530bb69d5f746f33de025f0016a592674c79756063618f8fe79c138a84804f9f5bcc3460322d94c2e7342d221b12706c4bf15aecebf64a536fee6c7acdf7b56df799f4b9aab8ed35cfacea335f207e9d14a834b3f7109e9601a16d0d2dbffe01389d810302a12cc3b1c4e49f7b1c13c396e6b22c4e8603cb664209efd679a1a3d9616e63b1bb4b0b897cd438c2f5bb02ab2047e6e5b52181bc9ffd8072e3512e55f4c36e8fa97954223fb6f0d4319701970fb953d72e7e23deed4b31bf679c5294e644e1f8e68d6e56ee7525d67b57cbfba5b4c47e024ed09929f7be44c4fa14f0d683a2933fd300f6c0efef1c1ff2a6436192ea47aed425a15fe715d51011a292b67b979f0a4f69b79ffce3bd0af14b6122413aa39e6bd1f546756a18e6b73459d2b4ee623d1ba72f5d4032d76f981a1b182a5a36d7c35245bb08f45ea654a436cfdc95f326c2e8b897db2d752531d487c4013b86f3db31164c2bb1f1d28fa9ed5e415acfc1569d3c5481f821d3e3cc4809c0a3d149a3423337fbc963141ad5a2c164d9b5bebe0291cc84580d8a397ee664b304313355d5ec49006145604fa05c6bfbe45837f966a8c5324d3ef892fa50729d451d4242d3c0897b1f019eeb80f2d3924fec7a1c8bc514674c1e06a6abdd434bcea6ecca5a6d1be87a99e7b625f74b57b85d892c18c4261525864e8ddcf2dec757518e176157c676df7bb823959c9d208a70171c79cf1718dc36330abe9fa6c37f04acefe19b38b22101527a0c04aa542bb579de363a51b642c540a7b0418237617c0c5d927bcc30be1decb70fd406cdf88b8d391495564c1cf5dcb793acf68c1afe39c87d3e7c9e20a", "52ac52", 1, -1081881692, 0, "3cfafcd61cafaa6c97b75d4cd73a853ee52c4a5e1526dcd263e45b7a07379e6a"], + ["e472a211013762dfa79bfcd0722e35b03d77d199d62eed45bed34421052f02441064ee133003000000086a53005351ac656affffffff044e0e100400000000036a5200ee273c050000000007ac635363510052887461000000000004ac53535106cdbe0400000000066563656565ac0000000002c29d5602000000000000000000000000af24d0490e3fb5d84c8b005d5a2e7f17c3379b6668273523e9111b00f47dddc2c147a6f22e0a52c065740493c5ad74f2a610b3670d6b206549007f600b4eb7ad673e6d4c3bd3a7d60ac0e2026dc304d74cc56f6fd91e622a49a6cd41630d74770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019d04e91e8079dd3767e671b3e661b3c3a7f6aa05a260dba2ad73949dd9f12eba2ddddc00122cdf32298f7ffc3470df01a9da2a61523b42fd3ded341598832d465dc445ec5d8608d15cb61b865a548da25127dd320f4263406de2b2ef77441f4bc950bf0b1bbf182dd579ab8dc8716f712ea7fff52c870e40793a2c1833f7623032cc911e534d990e0a5577f4671023ee32103a8250d700767e88ec28493ebe92c020edff6558de0bcd089a0a2a8423a41fea6ba520eb75a31cce5697a66324295c30b0411643a0e9942d493bf4ce4fc460d6d35c3a5f5f226ce2504b304b0da8cbdbeb63d87cd6f1eb6d87f79a887a36bcd9a4c51c8487d932f421b390c8a3cd7bbff0301964868a440451006bbdeb40473795642615873977682bb275fe98fc37901210301ffad3b0c6fa297491b67c51d0e7ce14ed1ae297163a058fb25719b0c3af25c0207734e9da77e4228dbbfe8568d910a91b25b233c1101c9b4b20d800a264afb28021aa2442d7afbe3a40870a886294e558123f26f6947f58b22751666dd9dfcdfc2020c78b1976aa74db674c3c287d9b5a9ce9ed2a21941d8f2bffb1e1fbbe2d90a8407627d6f4f56ecc35f0fb088e2ac1d59ee578066c1e6dda90ab12f4257fb79a9414b3e85d7954c137d0337eeacce24e2ba42260e07d74e4e2602720b65d5bae866c823e27e8c6ddb2863cfcc743199c4af9861b772f627fc409e6b491f6e71427683c406ec2c68f8be426d9a1e10a5fd68e402ac0bc995ab071fdef9c46f2beec22491f013c78204390e9981e394409fd8830c870bb66a4774562b356a95b9edf423c274d0316ab22cbfd9d353e1b2c0fa53052d22749091a6f7dedef1372bb14319cfb860aa2e677ce05c0652b2f25484994b083dfa33ae34c7b12d7b9af70bb9a32cb4746c8756f72b279602a03446c929c5616a0f1fe582e619a4258ecdf7c628028ecdc367554ab495440aad658a753737d53e9039e13dd1b9c9080d4d4a12b5d04bde2aef02a230cf3756050da89791e36b0f8bd9254a5e466c3e15ab0c103d09f2ff69b53a2c5b9d258de1cb0d4234472f54846fe6b54d7d852c1ba447738c021c7a7406aa2d9bc3715ed55e11b20e0c3ad250ad9f1678be88dbb4565df42805871f1e3aa2bec6e7255acee23a793480dff14df408ce40ff98bee22e0a84ff63b12e5abb9b651f511a823de0df26acde8d497f3c937cac0ac6540776033669ee977de8e4241c878dee41a5c43963f2356fb33e13338ff4f8518d8a297da05be107da1863cdd84e8e3f885d62a6ca5f4cedb796c833be578facb14a332f46c49598a38e7b1c3c189b119742b2cf385ae0b16db474e5c6955f298c34176e6eb07c0dcd4cabbe6ff53708a5ac49f1efe27896b6dfe7ec949b106a9bebf1446c0ba36ed4ec8f62e65296b2faf38b428abf5c8a87bc4b9214f47d5c3de117f6a6fffbf08bfd3d87e11191fea7f2352bbb98e4bc1911db914e30686ea2258ecbf893703d802aef69af40335f49a10529ce500ecc4c6a25995f233b07c3657b2104ddf738aaeeca5b14530aaf941a89feac618a1b4722de01d2c04adfe460b6a97264af1d95cb46253797db1caca491e423aaecfba6509a31c2185467b28a61d8591486d0346031bb1431856aada86852b0a93544ed78e6f79c555f3f5f32362c541b28d0c51c983bb14bdd9cfe50537bf1d424eb10107a7a217287f72ecc573333248599d56fdd970b5ea34665c9022a94a223cf410b06a7746f8b144939894c1e9078a43787e9e0edb15fec6ab2344b6f9c695244623d85f1717e7474bccf4af8dc6cea77fac7010b1a96fbde909317a7af1b4428c1c86711410bc5b99c06544838fc21003c9abf116c99ba297f133c546f28258b46cbf158d6635114f3755d7e7c08f42a1749559d21f35745f86d3fc885025f462068756d7f705705234cc6ee5030d38f819ad8135cf40ebf58501e611fe296914ce3d26f8f53cb946a6b1e872e4e909d6f6ef92951d0fb6166adbde42935e20d5acc64569f3a1a2114e36bd9a1582b406f3622ae89117db3540bed9c55b44e07ea05f5db3cfe94330762b0c8d60277595f5c8381d793b6a16838d45627117124e7ffc11b66aacc28b98af9148bae6c6bf8ca5221a1b84d131f8c25e980c2b7872750ff7044a324b1533fdf11a6d526b39346ce4b90e9d387395315ae2b02d6f5781c3137938a4a82860459b5268ff729f10ee355b93506fad00273630a602d2b707e2f57269361d962b42c53a8ddead4d04a942a1a43f28d9b91c9e958d16c4a040000000000000000000000008fa4af71f0b9e94953a6a77114a1efb220bca8bd9930c3172c184d5dbb235f1ac89983e035728989b7caecebcea087e98103a1acf94e25f94ad888d97df8bced5af694c131f386ececffb2e821d08d71677ae8d60bf63c1670a2a0ff3b0c7b1f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f99aa883f17f3132f8361916bc6bd64e2ebb471adfb2b969e44b6cbb755511c01d62284090f4de502ccfd7a4c74a8405c182b72afa2ffe09e11bcbcb71946b899d5b0f662c98df1a74c5f1d489b3dc3d9735415c76a08027ed0911691b10aed151e8ca076be6c0f2e6eda663e2b4ac91ae215557959f03ecbb073a9f04b24a64032966cb4b782f3d630ea94e3bf420893e4641ac3a52b465ce0db96bdafb009eea031184759496f408dcb6e0591357a0c062b1ccb668078d51104f681454c0f1266f0a0124321fd295a99aef1efd3fe485842f854cd99621e4240ec47004c0988303ac6dc4a770f9866904259f1b0baa5a023e0de7c561ec0d9c9b4eea3febbec70f6f02116172c909a38fd56f8e6f8aa698fa89d207b29393f3e7b6a7e0ccf7896997460321534d416f1bbd7c05bbbcdd83192f7a38e9da527be3f35dccf2e31d7a0e3b5e03279ec3f071a5c2c180b169d1efe7a8e98d7a0bcdb48492fd6d5c02cecfc323c3020c18a4ae5dbc64a6d4308268bb7f674ff27bff7ed86813275bbf72ef1b40fe5f0218181bff39b8e9e9522d0ec3c3770dbb36659909e966521668eb3c463c9604b8e3cf9c741737d7952d95ffb3960ccfd9b9a993e6ffb985d8c71b19a13b9dd22a97ef9267b2aa54b89f1866a5857d668c68dc8456d81d98a154699c4efdbd015a05c83e1d7039e0b5fbf8efb95658f6c17431a5bcba34e95247d98bcbe4c00f9e5edf7ed94980dd12f3f9b5ec1d2784c15314fbe39902f2e733c17f22d64cdf6f3c0b390880a6d481a779a5eb1134fd2efe6a244ac9eecb42cc862fb285ae786f9bbfa427a0ec99d468829a51667d47b2afc7dfbdfa05d6a67444f9e7635314c1979df5cfa020abe5f7521fe4494f92638f9c129083c6f0f478541581e43b1120c183194262b1b50a1292c79c1ea67f810bb726af40ef5dd1fbf21e69b6ca5086f64d583c20baf21b6a5b6eac1eca8ec7f656a6403b5aab25f5e3caf2140c4a0fde6ccd07132f56c67f866f7da90eecdbb14f412381c7ed7caf6d5160f0d897541e18e73893d94430717ed47d6f8df437c1381f822e1331c74d66e59f92d67d7ee11433bc2dfb5f78a2c689f01f43a8fec99bdc0b9d50011c73da2663a052581913ba54216a3e4b3ee32e8becc478c7580541c793133e608b0af9ff10ec0f6f2b46a6c50e4e0fd93095725aba51401439fdcc5f91b5972f00dea71c4630f073189ec553488792521e3330fa1c0eba97f2b16353a3101d2fb2b29011d3e29fc10593b35aa7696f79e59cf52915f320d1dec8a52d72c6177a708054899e827a10f167d6ce5fac45902e837687ff8e56afa4492542f71cdeb899819bcd353f5010558029cc1589068dfc1414b12e58c74fa44125e85da1b0bd2905b78e8a96e28032035127caf47b4340064d6c436885b208f1c56faa4d40866babd479b1a6496af08bf9a9870b4646090c9a5ba0b4e670f8e1a2cfd9fadd58e5e85fb234f6bc88d4240a90c985be5adae8e939f5df517ead449b2e0687530b957f7c991d6e52a25f3ddbcc4cee010142c675c7a0817552165454b82b62c399fc84385b9ef55aea2af4865cc5bcaee274a5fe3b1469b236f7c351a5238f07808b68ee4dcac25b220a6edf3f5cebf8438d9d43b9de78041864bbedafb3cebec1bab5f4b5b514fc28abe05da31381e02dd11eb774668782bbf125883f6ee881f209982577385cf041df8cfb9bc0b33f4fdc907de63ad2c9578b5426c26223439fef8d1351f8d7a6ff4a5217545639155bf3e103ad07b084d1799e0493acc2e22c8bc1fbf043495a8620cbc597e7f470fcfa76f414b6fa08edac437b36dffb64215b611b2b6caec748dd49425c7c6bb8de421dcfa17ad1646bd42fe06bf7dc74eea509b0446f61d3bd8c17172c7e7e9e356c3d1c8027e8f88890a5af182392cf61f3b9623d92f6ee254a35b569155f13f9f7a5d7e0e3ceda6c001ab7361538b24e4ec0840fe36b10308051d19238cac7eb31670b80d6bfc9175857215f3f384fb8b1d9c6660c9bc65dd830a07ec1d6a48328ca5f5863d95b949e845112c7ef8e9689cc46caf8349149d8cd45f7f083c9b4882233520a368098eb05b9d605c42cc1605c9471ec1a6928b159ba0aff28b3410c48fc21d1c04e86a685e9471f6e46bfe228a59f6a93e5a3b3cb82e8431b7106da24e734c7f57477a12f9cee49a441a17be04dbfab6c18e617fb64a594ceee3ee144897ae43c484c0dccbbcd35759e3c13c97de11aec33fcfa2b2f99b569aa35dae7b960540861952bb5723febd9c58e4d6451ca727ef98033ea93c84e20f0a096c48f2ebea37af5ea13b98d36db5bb902d80b8947836b5459a2a18689ac7895fcaa78e7da55d3c3638f01135ac651a5ca904920f53de700da4de056e373d1d2e74d237bba1f3cb739c40f", "5352ac6552516553", 0, 1089870312, 0, "04ee7b5ba3479de8b1dc70bf572ba4e4c620784c848057a0bc13cf9134f33b47"], + ["90e2995d0471be5307523b15ae6a70d53b2a1c44b0ae5f70534bdb2e18bacd5bf9de7fd7d40000000003ac5252aef7ca4eb0020b91356277fbe44d87be05ad3692e3d8092d958442f0be1269615ea7d0320200000003636552ffffffff6f7535c022826d170b9b4cc1d9e6700e2cc89dd2eb792120a1745b49f2fa05890000000001001ad209af919c17fb2c0b623a73edc0ab38bcb2851876335c14351b8ed0b67e9fc9f8c5b603000000025152ffffffff01aafb43050000000002516319fba7d0020000000000000000da23c805000000009804255411b230e254de5225f2e4c757225fd131df8cd1f9a874b319039f2abe8675b21920886b7e7f462aa30bc161ff779006157969e4e5543f9821fdf0e7000a61e4f05b67b6a1e449da243276550f62ef0e3ba547b89b0c8e3e75fdf3a2cf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058ecb2d039e7667f7e1415d04b6800c7b9d8d1b90d8bba7924021945d65ff6b9cffb8a4507f2a1ae6f30d9caf1c38d9dc0776e82ccc740ddb6e8e9813ecb135a1c514b65cc25ee794a1f75396c055d9f56ddf6f80a50f1a9f9b7b859834a0751cac8d55dbf63ce89ebe9979099b12f35c063da2c1f755daa8aae99bf0fce12f2031201c496ed19360e62238c8ed6e5a186069c17e2bcfd539cc347603931d337400310068d84a7e477c148a7738a72f8ecf07f78732a2d2fdd20b9a94a1335fe11830a005111b69a06489cb23b861b217f7697c471c0e45138f0bec60de51367ae8eab50d6a30bd80ad2683f4fa30ab06f75c760397c6d92a2711f8a961b6dd7d49f78021a4690e5b1d23f99dadc4b18a15009c4b733919a5a184b0572c574f405154443030d6aa2e1c31df527c6b97adaab6c61bf48cbc09ce724bb456cbeaa50919ac1ce020c062e50d148ea2e2264d7a3f626401d09a78ffef6e3ed6601e645289e6d5e030203364836325bfad3bd72340bf35734d9ddeb6daad36fd69b2c7cd9f4affa79fb0221f9101c81c18d9eadf01776856055930638b6498e1693b26019033bb48538e015c7cd8aba6918e40d7167e2234140422dd02ffe0f04a0ad336e41900d6126a3851444883a646a56b8ae037b6e70eb6bb1e505091fcf02393cb7abeab8c57f3e9ad61dd6aa98e7f10d6de0eeb2afd4895aa6b0ef6c034fa2f726cfaa20dcabc0824a29d271fe6197b0ca2827123d1c289f02092d55ccfffc251e0684e04d0a0cda84ca3aec6b6d2dbff09e139b8812aa0a18127a78a24d46d9d88d0b2d66171afe729a54f194c2e7494fd3983d4e9d260a54b60043fd34c1a0781fb5654dfaf7aec72b81d8dff6dc7b6e7962e5d63be7a672869868dd110cba87d76e8fc3390897c50d879d2fb590fa02f84465127d5543251ad33e1d94d711cad192c036e9431056e86f2a5857e91d1fe3e95908e71e2ec7e0f656d7a1d7aee0cee395cbb2a57cb782537a4161a97b45b622c2277943fc72bc66678f73cffb0bc8d5458481f0c90423d7d73c48045e8f527a509b74da0718d6e105b7cf28311a4c69eff3bc9088aba4278222d280f086a0e5d049fd4c0be0e75c95cd566835d5674aad82d2bb6167054863f7b1470434ced60b7b7876f16cd0cbae80532322a6cb233b7881522360bc85e0a7ca48bf7ada77112de9a176f722e1246f4b36c73afc3a7680a92352717a4a625f5210ec585ca55bbce0bef36057ab1d3d9fa8f17fdceb645dd85954901e30f5ad242ecbda02676ca5aca50f34515c65df73ff836714f81c0fd5d81eb500ea677e6c5b0ed0c5ceff380486a9751c015af5385787afd19651f54713615645c7b650cda759c895386e658a4a28c2574d83e1749fd1159f9efe35ddd7f2286198855b0b36c7d463f7e47fd88abbc3796df12c9e63266e89254ddef2176ed7e99f02e628d2e5cc4f94aec9aa3aeb0a6736c7aa60b9b5e67523ce48402c624f7bb8d5d96b018fbe97e6db9ec8e1ccbbb6e1439b84471dd9a3707e4391d26611655b331deb2283cb9049951e8f19735e70c406f9e888e53e760bc8a2332d29ecf76bac9b2157e1cb7d7a48915a886c4b46a944f83a884e44fff9687d4abf349c7a6375b2d3895397bd82471b8047aa6cb2e280c83d9c061d838c354c565cf6cc2e5413b32f4ddb10423d52b2e824555a0bf0cc8cf73bf50695277fbffa7c1f040ec590503d7dce93dc34ce08d2384994be4df7a2f2935f9632cb9cb5a9631183bb386ee5981492d7ebaee60104d629a58cde532c69dc281c93a0b710b47c51322166e1154937d6751b23c618daeac310e08d26dbfe4915544acf7029af60f2c95598acb1bb6bc95c8418218f4bab5cc38fa3fc477cf5e67ca32a8e74c5d81ee9c8707cbe086f6b8ee52e4d567b7cdaf622ea30d060453c8c5181f5fa9af3358e817de999e3f77451b934db3289b5908013d6cd321393f82de1686ca769af19d9e43b3f0c05a44e23eacba3a490f24b4e07bccf442a7244220230d6f9093fb3b9b2ea4f50d32bb57fcbdf3a369bc609fc324c11485a1c856fb79848d08860389e6c21d1c83854dc8500c43ce81fe2bb36ca71956e9259a9370ab2c7f1b1e4af57215af2eec90a2798f470ff85ca012d7c8a5c0fe8937b92ae3bf289a8c7c936498886e5234db60f4c1aa8aaf7d509190f63e0d762e653fcf9916b3cc6d53e3f4eb0e5bd0be4186bebfff0db977b6921f68e616d8cf070f03d557a280297b209a88bc576656947b1495de9422ae7140bca00000000000000000baf8f0400000000037892c05ea0cca1f0c33c7978c2ea95db04515c2784875d6cda6e170d939bf35d9488250ed5c8412e874883b81c3b53dd12b4062822ad8b87af6d7899ab4e14f9c722b51e2f86ca3dde9640ae356c091f90166411bd16c75fa4a82a663f63a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061127aa79f4319efb1465518fb285795e9f68148568f75338b20a3354f441a03f8bfe643cd562f563a4c3ba57cc3411f10ea7acb9ff9ae9112675faf77937c9d06c34c834fabbe465c2959730578e09fe716faa335cdf1a0fdb991480f27f08bc86239842c2586eb83bd2bb563a2c1ab97c8421a31dee7b69caeb8706538271a030bf78fc81e9d8055ae72e032e767dfee803ec3d66abe3a0656d1522919d38c57030436f859bd8ae4957337a64a6490ed03f1133d84f2725e26b7ff93fa7358c00a0b07ab30b5cd36fe2de74112bc7daccdb6b6affabf7f5ff72d429a8bd01c7bf957f6b6f547b352fb7dc796d489c9aa2b17035180a090eb9cd368e269f14c42ed56031c4089f4eea5e8423147dbbf15aa91b4712b9a36081f87593522fe3bdfbee76c031950b691c7db1e87c1c3465bb2e3465e6d2a6993ef47b357d723bf52ad695555021b2ffb8bcbf70a05814108d918ddc6a451f4c33af14c598cd6f01b084bc4e44f03081316749964cdc8aa537969b59533cb8f1b669fd06ca613ba5b84b6acf9f06703206b524774c0b1e0e6fed2a4612fcbecb0ecd94279551a102253a6fff3c9df7c6ccaae0be08fa3e8c8d556535f0f288cd80d21d8032bfa11ad240fa6285b5fefda6cbb80adeafdc3401db4283075e606cba416e041e5e5844c77da9fb2ae00cd78d6ae89de0ddd1f80a8056a45d6e1805177114666ef0ee201d490b4133af9fc17724f526bc1f8bb6fc7ee2547588cef8b0fec29d897a8bdae6d3a7eb29584cbd4640e74f7c0db20a830ba2d54d94036de1e9bb18328bfb2957f7dd9ae9789b6a33d8cf2fd1d8c2ad37f4b54728706649605326e83bad15f5b78986753a476edb0105479130aaefb5d1ea3ce23f588aa20462c985a8e861c7cd325be57afcf42406f8721f342637ec851a998e508436048a09efad8c734c6979a29a60964809575c5fa47c0bc7573258e1e99e8fb01789f4ac0d23836272635127b4ebcc4d393e3e50cb14a31436623e049e82fe0c24fecb8b4ef7fe5b0dac357f6c4fa8b4db29bba2349a566bb4ccccebb8c60030fc1bdf3b57f11dc81e05096ed94b42c3040f3163ba7d4e225af53ec7b839a398c8d9bbc889d27cd6f78cccce9d051195445e9660cc67057e215ff987d2f54f3c445e7e5bc81468f191a0dd611e44c9051652b1d79b3c7eb4853707a76ce5ae6a1daa03ae15f7cff41688c340ab0392ab4b32ea6972d8f80488f56f461b7d97a42e22219fffdc9f0e09e2f84ce8dc6032b43da5de904ca6441effaea4c5a5bf8251d47c8482e251577e00433b0b9c9851784a75c651abd4157a14da435eea537e439daacfe470a52074b447405d4f5c7f85344af4cfc36de0eebf32f60388fd30e820e84ba042aaa5ff1b6fdeee98e36a191fe3a30b61f76fbeffa15cae16c546e204bc5e3969e15084cc4d79a83102eb6cc63f21e57a3a44457ca9cb90c31880d76a7ffaccfd17a1084a353f336fab228bc9670f3fd0bd692a6cd497f7832188e705a2c76dc622f69c1ac05f5311a16a8ed24993bd21ed1d32b04739f97635990dc84556b8314e8918da7491847d2c3ea711d266a9e44b7449702f4671e5be5368a70239deca4b152f594f44b56f34ba16a022d63edce0ad71fe10ad914826c253f28444410c9ded00956eeddfd71f52ef2f59b11f434d94343bcaeaa9a0c4449139eaf76ebb71761c158280b40130a12da360d43a95148631667cb3d7272034c8b103a0778c96cd883b4d6a2ecd673a04716cdd3f440bcff9847d797c8178d2dca96551ecc2b764af808e8a9d60839ff60218051928b931b469b35c19ce165d759063729096b56d9c5cdad95a68191105a9e35e472574892aec50a2fb43ea22c3f5cc8cb8904c3e26efcb31980cc32fef355323e8326712398f1bc425b1442fbbfd5907f6da979af8551eb307901278dc69256452af533f80953a8cfd6ef313d5427e6d65b56071f3a4d82f531a664ff7f3fdd1f0e40098a99c896910c05868afde6f15515fb0a55b089ed9ec4dab0ec95d3ec6f0f3fcc19e1acc036e4c86b958eb7e9a5d0484308025251c30d349537592cbebfd8d33553c675e4c12931072709c7250e745da62e797d03a6d3e9ce2c87a1419fbad2587a940752455c27a34060299598f4c6ae13e1963b1b7872c4d02c0e43cde4f745cffde4118c517cf27d29deaceebc190c391689c532e56e34b44a0653dad073e687f0346b806393ebd5e7668b692bf61f45f09ef4d96cc30991587620a2703828eeaf73cedcbb40f80f916c199a465b4ec87dcdbda8246fa5b3c7b3dbcd13e1a47b83296a355fd2f2fa6b6806f6e3e89f8ac0569ed91ec0cba92aa9554ede776f390ed946d176367495a6b70a6e22838544c35ec17cbc17ef95b3f7310ec9dd671af855c980cd80af7f28c70f", "63ac", 3, 1413916825, 0, "3dadc90b8a0f60777ae89e75d7b552cc7b9256a3d99741baa3868a59ebd72a36"], + ["4884234604e6b930f63d9aaad9e9538aa98b899c9912ed0ad98c6bd1bae7c83dbed8dbd35603000000066a536300536aa31aff46e33a3829a3b9894e39acc4162d98d00f9a5430047aab328061118896b64e56db0000000007005163525353acffffffff9f143d84b7e4a43ea8f4f24ae0cbc7e6676f5d303b3d6479053f851632a53f2e000000000800ac6365526a5263a36a513f1c5026b33222611d73da280aac4b734b54e09fc24a8537a3225ff61f804f333b020000000151ffffffff03610285020000000000e461e2050000000000347676010000000006ac656aac53ac82f4f82003bc4b30010000000000000000000000002502a1a558ade269df12eb6a49aa78f156d0c1eb32436f1d1cc47657afe412bf7f2e0ca0be0a184fecbb45539cfd5b287d3a0ac151868612204a7530306d1d114d8ac7c86de5b208cb62644bc99c9552a8174008b76df9a47cce44b4abb7f04b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dfda9594161ad14a4ae9f24d076e344217dffa91b967a4a74829bc83b19d68aff085fe045db6ab63638d2c938ba1c4387d6a7d1719929df2ce3d962f15552e4c9c05ddae4019dbe6d745f4dd3e84462f97f27ee203b2a7e7893f594f67389ab2c4bf87bf842e16ac0659cb4f8ef23bee54e4e88e03f51c162aeb198df184d2e6020ed1f1f6613d48856794aa18ab04917e54dd21efaa7e64d5fcb1a079df05531d021da0789fe2bb84dbd97f59d610aa68893d5508d7c9fc124ec33a2904338259350a017bcd566d0510671e234541b25c17e6db4a43d6ba1e76a46acb181af008abcb65f6e325077dca352c3e3c6e4fa48fec16215a6db162dfa43d8a1edc4299bdb703270e42d4ea6d0b8e381a40d14df70fdc4d4f25dfc0275707e8fcbad5a2f351070327df3abe14a6247f2932e5231824470e7c2e1447be1ed594b940fdc4e128a377031fc9b03a7ee2e3d00c42d6e758d9e1b62283bdbbdc3213b6d02d8386d4ef88540223bdf3f1b531d9b27e8c159d739b77de82ed07af8432d6f1d98d06e67de459c60324a596e90a166ee4b906720535e07650c985f6f52fe120aab759f831915bfca712fb4ac915509f75c60e5aeb3afa86e90849a3c408a6c793b66dd2b26d1f13006f4f6434fa816c516584449a7a4a3329968897d26e54a5de840283686f717f4d1275c17157354866f29a02c1ad75f0eaf1212d450a2e5fa5b5d2482e7be56d2a9ca2f3c777ca7f0b465d9f57ae1192c9297d02caabaf20498586b1875d75ae957452251bbb6e2027a06f90a938ebb1f04a06ae0efa4ad4c982cc7babcb8d13b6ff18925b0c22f665b2cee65b29ea55ec8a06209cb10530ca2269425d22576b841bdef8e971f556ee2174fe3e700a690f06c7e096966af4f035d49c7f0c4ba1885ac8c9bdc843fa598b62d39f3ef148d8679caf9de6b5defd1a5d95ea6a280e326b6d1955076d200ae770fb0e2788e399da2492a0b43aa5fb189bf57dd4798d886bffd68a533f86b865089a7899af55b30e40a6b777f8ff79398ddb4a2a875124deb5791e3b12bea2fa7fd3f4079bd52fe3d245ee8411ff1d406959f688998a08d96a978fb7981296ae2ece45c98232b2f7d2b1ca6d5a3b743539f7ecedcc9a3b862505b4c1bb50d0928f7ee5c0a05fb401c548975a86b10f52c0ed14144d30e0aaf058b273e9e7ddcf8e7926d0410ad4c1b4b01f1da4f71f3e18d1e6975436ec3eb35aeac6ba8d726ebd93d6ce2e80487ff5dfaee5a0588e222c85942112307e3f3d17f9cc90e02f968b93c73ca5c87103e9e0cb117c4c109d4dbbd8756f48a2f1d37d2fe57dac2c3f132a96cf2189f282033e67787bde22e233136f7550cdaf547017e3b22dcf26fd478ada0b5e5761cbd2c12cacbaae7d7cfbf1a9ebc1fe777a7c36029f41666aa15b852add6c64cda7cd5b56a27335cb48fcd9ee6f94d25acaec375e03fd294e6ac1b1d75ecddd55e85cf1f4a9d9472c276a8d8408f71a31f78df082e23ef34cd9714e69e26c2dd82252eeecfec582d4fdef698aa393fd18d8122dde01e3d789ecdac80f1c73219feba8449d7c9cad66824f62ea4294459f244e651c5033d7e226cc7fdeabe94fc61c365a1fcf7fb637a53adecc0aa7daafcacd96ceb9215439c8343b8b030f5d0d952b05598610c12bb23c87ddc6ca1defa5810bafedc6727a58ec00987ad0115aae383feb47696f29364ac33af80ddb2bdbb71548975bad1edf89e264b0d66f940f775adb71c0c64cf706a7c85c72441454f8d425a4fc188e298fe1f2daa0d0e4583f0d4c04c64db43cfd30b7e35c62fbf2fd96135a3134ca14822ded90abbfd1d7f06fb9bf5f4ac8b63afce6b147cd7ff046e3097462064567159dcbb2e0f065adb0b55f127ce9b26e8e3f70ca93c3a372ca0f7638b1c680ba84eff6fcf5ce3b3eb067d68bea314c63187f9f06907be0b136deca460c031ab914051d12b74e9a90106c167b0112e04b9beb8eb40975fd3f2528b3dfd550d6e067227ef55526333c55c9d403ff82d6096c4a4e70348238712fe2641275f0faaa5e45f19e04522809db4d2ca59def841cc1a6e7f928f06398beeda7ca29ba3f13da703f5e94fb8e07d0299c96a606ec74f96c4e2f41e00d33b6336f9f01a6e7799d023d71ca1e80fbfcc4ae8fc865ee891fc7700d7d437b6b381fce762227096adcece07f0e96c87e01769ad75a8921e8baae7029cf5fd8de3784b584487db4d518dc67fbc1c4b141a3d75597098e79f5b244c6792d77b7a42f23ec31718b05f224e8b6a0703e38bc9900000000000000007faf0a0500000000937789be1bf03596982497d6ac520ac5968283c5a527777b299563bfd2813f9382a6e4c5dabf0cf3f298e0aa1c20af71633a94bb6c0a9c987c58dd9e7e535b514cec28cfc0374ddfc61ed85c4847fac7e9d96ad5c465a5fdf09fc15b139fb60200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000afc4596432cdff9bd3d041cef3f2cda6afa33379c8b6be4c856d76f5d4964538e63515ac56dbc60863740025510c3a85a1697bc31c9e699fe1afdb52785db08eaf49399ab1ec04ec749b041d50ae1cf4679062eff4a21db48025c1d31412bcbded13d93d6ada65d140a1f83d98f53f458227f607e41a41b281d4832df69cafef031db6d1afa3b60dbe2c6d67769a91ad8bb6ca57e929b3b3602185d4b3ea881f6b0321feb9206f2914a3de1004c8708a9b1d1f24cc7c1aa765b15dde2ef34fd96f900b009fbcbd28739fc183a90f36affbd48ca46300eaa0e10dbb400f683b738666ea6c758c55a16da70c8f6f326fc89840250bc43e7b224b9ad3a8fc7ab2e7a5547802025ffe77184caba8a13e73a23a131670b31ee092116ebfa5d16d6e9af80e6e7d02247eac6c3c25a3db2d89ad4616729708cbfb4621858a3d63668bcc1af0a9014f03060b68f60f9258c0015c844135f92319f52f04ae03dd4cc596608b47bd35707402235325f7685383a7551ce5e54f8d8e456a467b9da1762d64916faf0b4d5c8a81032d3dee86188fc94956d3e0fbfdbe7cdafcf8fcc99b45cdd073ed5f01dfd417a9376fb5c36044869d7c5394a2c0a9a6b7715a6a1114562961e07e35e34227f796e3e4f0e94acaf11ad461dbed58d683c119bff7a2a73c04705ff458a0703f61a37258c40c1d42bdbc2096dc21bd28474d02ff041d0ebf5afab0229caf8b7e334f882bb19cfaea790b8198fc7a3cbcecf3b1f54acffe3052bb335af323d9702d7f6c34db37d71cf2b9aa83eab22d57c33b8ea9995ef7c876b29eb4343ac63fb7a39641fd81d70ddf4e6241173b3c570e19ad80fda1ed7689d076b459e4532f2a4e40962272bd915060d5db97b018f7afd92060386844381bad363978d27cdb0b6a8003ca5701e9de4e2744f254e9cb63cee95c0f34669fb80d74cad83e97ce864d1a1ac47f66d5d4a056ad39207d28425c7b83b2c41c31f7a60a2d684e42fd09fc1d753f1f74bf8db2c7dfa4ff6bf0c352dc9fd038e18d6310b053a6a4bbd3d9fdee31bfc40461631fd349b043b1d89637307fd87daff4df9f6d0fcb5618d2e2151fa94c17665db7bd79028b66f265e1c4c937fc1ab68647065f8ae7dabb23e06d6fac6b296b7bd541794146130abe53314bd6da284e1c186ff96bed6a010a18d8b0f9aba3f660b1aa0ce90d2bdd99900d638f3a4d791cb669326887a98e549de7a0ac682f2606700ac5f35d5c55bf72a1b3c13d5e9e1f6eaa06eb8d86d213e02bfa391443d24a30c2fb0b747fd896f8b31a17ebf9e4f848188bec103cee539b5e8f6e376eab7c9a571b3d79b7097ecc0da2f9986233c1bacac27ec3f97be77921468937cc59b78764d663c94dbcc964f175ee3959eeefed22a192e4bcda915b9e1ed3ab9ab7182aba45133bcbeb86e4db1323b4771cb503e8a61410e69fd7bcb2dfe47403336013f771a32055ae4685c4aa7d9c013ec301bde4002d9c929dd5d4a7aa8450efe9589e8b1b6226981ad5a642c487bb601ba061cab47809a935097fa5576b17ded236146757b3e64fce56f044fa056dceeb34d4a0bfba6c2d8e8d73dd974d4c43e747b614df07f8593a75a5acf927a9880162761c11fc5076ec8d4838a5e144f7e0baf3f09f81fbe2d188e7e7af81bbea61cd3b836c136825bee8b9b0510194c63ac72662377974c4b65b16bb38b4528949f22862cf5b3c0639a9233150bc90c1d403353745ad814e629c2a4678b0fc9c80f9d6b2f98fa119b9c63a935c064308d9b57fb5d6ca6d1a7ad60c145233a95178b57eb5caa9f8ae29d8789141e68014fb4ecc2226e936324e8292fb048e0158d947f6b8814264b81d20cabd960829a5865cf7ed8ca84f6dd746dbf59fa8d79276e4e1e26870a290bb58f7af667366e47048a192058ce1a9beee8f09da59afa39acebd05a08dcead55efcd8d9f070183f8b584fa4cf7b519b84f2b506929c816ab93ca742a7d307ba8ba9016e575cfcc5bdd9e7dda2bb0d6a2bdab387f3ba970325dc208bba9e08f2e55b41f7d1c567e940fd9b12804b35c302bd9cfd86dd47a24f044dc7a01e1de94041e1aab37e69490c9ea547c9eed44bbfb3032222de15d3e1d65fc0c5ab45861316b633920b35bc1cb975f7de9e70feb61a65009c0da0a2be9173d70ab61c22a593d31864d8e8c846c2b693737811bc40dcf565ffa0c132906f09e3d292c8e5af220a686c3050171ac3461cfec43a72abd0f535471b53a1ea90ee9349d393443fbcf17c6bbff9ec4f674d29486c90ffffb95562c0000000000000000f4232f0400000000182965a8054a9429ae2efd535b1032958a4203fe277cdd08578bd600c077221d40b32677f9e4a94a233e8e9c56acf74ac5899b5bba0940d97073a9a3a0ef9cb85bf7a69a3d38138a4d14c79837d9df7fa62360b201627ab7937c41dfdaa706190000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000097e3b57b019f05bd132d3f2339c9f1dff1c077c17ce5616cde0f90be71d58d7ce781865ed3676e344286a43646b9fc4db8599f6b281a232ffcd7b7d9befb2c1686af8e38941bd0f8f5b2d46e8ee902ecafcea808889479c792a284cf2a2de02c939fb58ea2fa985181842a5db159d5d0f9f43e3960b73ead974e0fe40140a0900223482be04bdba521a2d4aa5647e58fd89ed4ce048aef6be4264a84e9ae2bfbda023014a6606f57781c17b16a03590fe69dbdfb38e777355a99bd4f7c208b7a61330a004888c720b2c24fca45477efe324b7fd2eaece0642633a8d8c28656a7ddbc5917786de02433dc9938f24e676c1eedb84ba138c281b671e8a0f9291f9e6860860221e686d9adca60bf165ed51b4cdf33105389cda0da00a9cf4fe2e24805ffa895021f30abab10e88d080ed43c042d876c95971b424f980ee2e71eb015129ecdcc4e0207457d327b9beacf70eff18077358a5f9f1b949d989dd757744b2ac09b516f1c0217b52c1751ef2370aa572cc5cd274ab5b9266dabf4de3e62347a42fc515dcb97030a444b6c6d4b52a25c995df952161c4942ea026004df4f43296acfc47ebabd760489b3e0a1f3bcd543cc4a3bc92159dc50d052ca2add048c6f7ac691ade373143ff98cec098afff337c612bcb78cc5451e73a8c5ef31cafe8a226c97941af59c274584af6802ae7e4542b09648329b57a05b50b6682db3a2466a250164a4da96275b15844081481c302fb6308eda14e99cbcdde773041f7e7bc2f7cf21a85c71dd922e3c69594a5e72ffd7eed520572b775b406c45517797894677d56d13ae2aecd1d300034b58f9dec623cd7d88fd55177b1c8d7324d485e44f0a8be7cbabef6bcd65e8b0d3b7d806d74e5e0c613efda8b4604966a826c8a6e4bb71cb3c98f2e99c67b9d4bfa85841826c9a1401b6eeb61ae14de0467e4fffd15959c53e4b90e666a9d542b9615d2ad2b87c1d8e21b2ac201e012dd0718fc9de15600ba0de5e62e664d2beed22462065ee6a462f9d7f82fe546da40c95c2fe59f1dd5fe41bda58194d34174e7f08ce40e5b8d4d3ef600a9fdb467c2517f082b3a486e126c3fc6296f75b9a761aceb2322866001ccb1e0fc38964cac734faaea5201a04f7d1c7324828d1d2d2fdb150a3c599166761b3edbf8117434ba6abfc7f3c4ad7c8cce0788915128ac80cb625f9b47c8136a78167df5c2b0e0ee9bc16d922d6bfec0f60e8aa699ee7fe29af932dbfafb3cf4eeb6402a16d7f50dbadc2219a358c51def8c15b9246f68fce5dafe9dbfdd66b2e6acb3912829b993dd1448efb5d03f4ab0fb769944e49860280dc4767d78916bddcb419e0ebc547e73c349d05344e46979369455f46271b2af889beca1a8594dd3043e67170b913aa87bdb3dfa0afc9105a2551dc4625c0745db1d4f5c16e47405dfaff212b31fd69e96f467814f3885427f290e0446b8524422de261c9893db73a928c27566ee8a970882342e7df1c3b72bab1f1f235f46ed152e0a2b03541247db0751b5b4d568553cc96224197b0b406590abedeee8d410788da6cb71465a04be9a71bc3bcd1e5354edc848bb7b6f6462594caf2a62f28f4170c7686bbf4d23a34d1af1d36f49c343b7aaf50a3cb5c6b3743ad9eddae7d3a08252f856705362a93a7f80237e1429ca3f3168dfe7ad8434459f153fd050bdc1ff4f79cef2f34b2426f57737306b789ab2314c52181d6cadb1284b47770ee5354273ea3002180a8b0aebf752ffd2656425983af78e5ea9c3e7cd2051717aea635201f07622cd62e303d7014a925f29b57e5980cc213458c998ca9d8b113b6ea423d217d6284c813d1465934b512b42ce5e7cb1f4569a96b0c35eaa2d22be5cc007e3fe0c18e13b925196b5fee34ac568f348f72256985cb63c40f983133eccf745f960d05e81c29d041c2c376beadd4ff0a608e2ce35c426adf143e63b4a03d7f92647bc1590b0e14ae738125985ed690246f3bd45e52623670522da818cdb626469d96c05287460d1d49c9d633227f90ad87c41342037a640c499101ea7642140918664a0019151498c47b19a530fc5fd7dc5dde865313a6d49d5f2ee614dd98529da7f6354d0f82779091ae442b1924f89d012533c284afeb76447af5c3869b0b5455db0f1e4d524d44582792b7972fb474ea18aa2799b490da635ee31061e34453c6caf28b2eb1acdd5c57d6af66a1419682cc640fa2b70c2c31978bf0609b995f34e54f1409c0aaae0b11c7101d71e4971a658cfce937863e2eeaeac2c4bea7453829070323712806e37683380256cb01dddb158e01bcf2f0a7a142f168e917b3119998a0a2bc61888b9ca19db9cff6b62bab3d70b2296dd384cab919aa6f746590f511c4b301c9ef3c1811a6aae3be79c73b4efcba6de6b2a120d05f3e4ae4ba03ee543eafc108", "525351520065005151", 0, 645040203, 1537743641, "bd31f7f0208ff42c1c6e7cdb2b959b3deaaa34e4d9121c419cb2d9006579d681"], + ["a217ed68030eddffe292d8e9c0d46086df84d58587d244c03acd44178ad117bbdcd29b7f7101000000076a526aac65656af07e8d97caf3c582932056a8f3edf65e77470b6f2eb2db8f4ee53e0328b029eb1ab297440200000007516a515351ac51ffffffff9f61e9091b8d1ef3f97d0ae8add39aa2f1d67d72301967fd647cd779760287fb00000000066aac53656a53823fd2ea021c93190400000000035151009403e10200000000096a00ac53ac656a6553000000000100000000000000004f5fe002000000007dc87505f2b143773e258fd68db6c995f33535bf47dc7f136dbdd3d685cb0d0904024975e753b3d290eb37f986ae75374dda792f5c6647b0e000e2b15417760a43f864b1685c3c79baeab53bd8caec046a081cd666c7b90074cfcfece35e839200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d558f8d8a9cad5df51fab5483fdd1e235f1233fa0d427c8b9f6054d1cc759bc1b5e27ae0b14ac7eec1e98784c00b27b57286b963dd07139e1603078136016bef8db7a9ca92eb3e21b9a54402a41086cf8162d205a3077bd1014395d87b92a2bd54d5fee70c980ff0c5410e6503394cbc2c671cd34a20dddd42efc806883bc3760203d6afe46cf1fe5c0136bdd5c4d3f7ea7ca378f4c2a3b616a7687042cc11f8840321db83dcf6f100c4ecf1bc530d4b14ba6dc6e6c66242c76ec50ef259dec0595f0a06aa11077dad62d7df8e64caea7d75fd6ad74fea4bce444fa5b41060f593654c847706e23209f7d46ada0711a8daf9d758433ce40bcf6b820ee7ce4e658f818f03115800e41c468387e691d746c8d093eee58c7e94c1fa3988087ba3a5e7f149b1032dcc49b8acf90fa3aa493fecb6982e0663d1507000f31235a8b5a064a81090440203c2a280592a34139392f445d6b167b62b58829aa86d8fbe05f05406aa28b805031d475885aff1a54f0de7964267753e11f02cc3a36126f56967d5de772a0411ac030a72017c97304f86cb877df1b18af075e1de14ee91dbfe970c3ba5b486bf7548d9923eb0a559cb529fdd4023d2804c84bca4b876b9cdfe47439c9fc267bba527f6679d882eac288fdc3b98baaad7f5106c0948ae0bb0d078be42cf045efdf9db057d35d0c840b214d96fbdcae6f5c44a8131ac0cf538047f7024b0090e8f2f9560de777a5ded3afc4bc8b4bf4b9e033fcbd14c7c492739004772c176c9704dc16b406c7bcc5ce670bf7a00a885adb661c50d40168a59c3363f9d6193f1b7cb62db0dbcf6ef8c022213553475bba7f18d0eb48ac51518d58b6453f2d1d35957b1e98cdcd3b17966efdfff8fdb843bcbb547dcaf914af6cbad7adc9117155e236477a36edcc5737dbe18b7306093a9bdb5601d558419d78bed2c851d1f0d15477a984dc54a0bde0c954addc4d52b34b65d8e34e1cf3c74fd1aa7fb68e9e4e7b045dba565c126166bb2768760b79a42401ddd4d9834e039b812d77be73cae478090bf9dec8e5eacc42c6f14898493bbdeb7e6e1cb4295fa520bfce3db8987157aead398ea96357da9be25ae560d5c3556dd5f8d748131749cac423931c0a56f442a8eb5ab8ba3ee40611a7689785c1d92288e5b133f256de492ffa3b2b9880b7e963ff358b4af26f0704d42f987a8eb823f5f22daa4c7ce5a79c7db21af70a13e5b879f648fb8e5d0a04c85def30fc2ae8ba2ab503513f2967f4191e809b53ce9da75dbbf4811a8ce3ba0f0ec19e3fe19da25fe3616f72fff9f8ca91a7b2ac8a16c9d37663135e906b74b83ad335f9082fb8ca44f5cc0bf66d52488e4e563637311c6690f3c4f6e1d6d9d2e3b8d667b23d351eb7777511b99bb1d62d6719b2704c691adc4e98ef5d05acffe0a262cf5f1f13ebc7b783a4e37864ee8c46cccc3e720dc2cea043b1fc1293dab4c512a8deba8c57cff5a65c54b3dcfcdcf8f99f78bdada35a8065d7f305ba9bbe186daab61258717965ed2546d526ea32242b236bed05e5079f1b591dd22dcc4b6f914ffcf81a172baa6ba59c37815b301d07af8c356c6c81d4130aa17e544066aabdcf83ad462166c939185d772342987b6f0c08684f4f3eb542c263394ef3a1cb6107c718c8ac4b6e7750c3be0ab3e719835645832b4d430d603557213d6d1bc47be5e9be69e1f76d9860acc8caa737e9387a03d5b1ad8e7496561d664634868d1c6e18eb53238dcfceb41a0d6ba8cb6bed1967b271c120d41ddbb5a7d658a7924d375f9a19d4f0eeb14f17c800c4729512fdb4fd964b1f4ec9e63becee1a443423a4b765c3ad83acc9022dcb34cb071d531d48519cf3a84b85f5961fbad78488fecb47ee445eec4a7b3a95f2c68790a0b49c19e6c09f2377964497c5124a185f9d7317708742cc888f6764546148fb7b3ff54d67ba256107724a738737a88b72cf79431c569049ba8eed825dce4e138c18180fdd76889c9ed22d57bee76cc4032b35be562f013645f4762cc32300c0d91205b2af67e9ff198f8a0fbe344ee31b63e21a7218ad83e556624df5de85260ed6e0d669afd68407e1ec767045a470af2ad56ef0310f8b3948abe46c3e632cabfb3f09b5c250432f58bbcc2a63b7753b0f39761b118de18d6cdc1663bd6c5018e364079a3b0d2fba1f1033dac2839d0f7d3b5edca6b57ab55f7ab9c070489484cb23f40fb138f1dffc7d3d5d36de4be0a78d68e014aa5b3e5d3473263230be82d34997f92dc137e765682d32a947312c51d29360a2aaa1b72fa1f21ccbd837d549304bdd5b9680ec7b9633688a594fda42bda73f4fdfbf73ada128742a3c91a2770bfd0117f5e73e3db254532534ead56d89235c047855c30609611e6c0b5f7f0c124f1de155bdfc0f46060e5f74efdae0f809c592101", "", 0, 1643380282, 0, "0a14cea7698e0dcf507c6294dd160b103f810320b5738e0849e56f76562d6839"], + ["030000807082c40303e2d2ef84e2bdb11dbae633935547cb5533edea1594a1165d2a6a3621ae86a58d0200000008ac5300635200515150b52e6939d99ab54ebbceafb937fdb4366f2ff760dcdf2dddb2a60e0d88700bf26da3510000000007515300536aac520b99df5f6246338413b13507a304cccd167eb6f9d31327779051d3daf7259a88b73222d90100000000ffffffff039cf89603000000000200657668c601000000000752636552636352a0aa48040000000009acac6a51656352ac00000000008af0e79802233a56050000000000000000000000000349672c3d0444da0277e8982f065cb67a37455eef72c34d60e46df09876e0bdc76d7dd824eaecbfb30d58134391a1b0ed2d55b04377cf4b11f03c5e3078755fe2e428a2e5617b5d530a53a420724d6d07a25c7f561bf39f6452cbc97f8f72ae00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bacb7eb4ce1fa66d1af5a0d6c0aafaa400ba68cbd989207b5ddbea0daefda9db4af93fa3e77b65531830b1ff1d960ad8b9bfe2dc09a08703152857a41e4645d88722775f69e6fdd3741f1bcb3bbccbfc51e01027cb96398f0845335755bd26ac39ce7d168e0796870a81c2b2191ed1d3ddf57c0aaec0ee7137149a48dfc42361031aecdc7618628a6aa2a21b11c3c40147f438239f30a64ddf7aaf3f2cf4b4c13b03063d5367feb372d6ce69e41d28d89a7a8c0468f76fcaa691c83997756043a4e20a00321298fe071a62b09bad9e94c7da9e84cc6a48111e513b4e095b92f62f86136013b0635bc57d90717a0891882fdc65a7360a9c99e1f922cede68b913fba86a031d548786fef74888e52b8eba36bacaa17e28f48a0f0b0b46af406114466309db030c75dfcbfd77107cc8bb229b98088c3fa4dc2a8875cd921e4487a01a87fb9a1703053692a504813cc81e2a99b68f1360243cd4ac120285445bd869640324263f97021e93e578bec5a4ed0ea64a12a6da11d8658785c8c8367bb173cebe82e8a12dd7021fa37fd2f94bffd2a1df469a3b0e3a551641de86ebf21d0791b25bada95540e21ce9cc8d44d42d6a051d4929a0da48e2fb4a7b813fc4cf1d62b45e250b9f066df35689681468d769d9ee6af67d7936b9754bf759d457eeb8887dda11b487e1a5b5f7cf359019bcc630a5e56c9f211bc95b1ed393e1cc982ced4012a0c9717d24aec054e7f823d0165f6e3686ce08574debcf8885a9d1f1f04cd025684849988cb610f6388e6cc34bbc33dec5dcef64b9b179c64f9d8d1fc8ae8c0a2b4e87ce2a24124d3d8dde8945c8cadb5297a6d7d62121609c19e676ff5a72ac66b79c3e82ecc330e67f323950bda9cd8f4207afc3d59f6e95f8847110bd3ade8f4dc4bb8bc68c09feed1291ce3612fca4ffd9a599ad2f2fdec0ac48070453b4320f56fb463cc262ac34ab3b90725c3b4dc1746dfb656e49e674bf6db4583c7467bcb92376c58343dcdfefded154c2846df419a85f0876dbce8e4ad5f20dc942d9e8613bf0e4f1143a8fe6bfe53d19bfe32c76ce3dd421e09f614319182b401afc3ccb5541cc8d268e48c1f5de8284710f37ca9bc9a47a69f3931d0e353d11daedffa7c78a284ac3a31049ee557551c86fb1c5c87c5f8b64443dc789a686e0544d9243812b321702c2dd646ffe9f65cd7056eb921d6d75d384417b68cd9fc3b031c19ceb63158d89263edb586cda74e6a43167e34dba8ebee236bad7e58decb877a6c044477075d86e7a69eeba44d6f6fa4f8d76e2910f769c3e1ba9ec8a6f069b22a2c9072528ed4d1fe367af56c886afec5e090cc4c4f1701f492583459b12e327044918c71f66e46ad50aef0bed21d781a7062cbc061f19200ad21612378bb61412b0a68a5317b19391d5f26bfc8b5440c0a60c96ae08ac25616a9d6c9cd6aa2a631e8e95a66d19fbd2be5f5327d153f9d0233615f09a49e1ae37660fb36afd5433f84ef24ae11fdc802cc2aa6280e282fe45b81f80d00374803fe3335fc74fee35b2d099ef27a2b0a819d5944920ddacfdfd832bf9b8bb8147132a5a1493c5805e6a2ddba21844145d36f58cdf3083631c4517c1c741890df80cb85bc011d334dac043492fd14cc3c1cf19010fc52878659a06329a5b66293ff5cef580988d8c4afdf5040866ca10705306809147dace83fd51d5079d6f182e496cb973cd64a8b9685a2b123cf6638059fb1cce871f525a727803821aa489f647a77369e83ba48ae914767382758f2209e4cd2ca606117eee568f7aa71b589ea2bad25f23a4f64e9186654a98778ac4c986bb9af614fe4d494863181bda87085b072f337ebb1163c6907ead987e13ed02c11aabdec4bb8a5e32eeb4a48f703e5d38ae9d7733a00a614d336429ef1ee149ee99a70487cbe79500333822e1ebe96fbc5921e0f77a97f74607d6a7b9123e2d4947f396e01e1f01761e4e685c3d3943cc28da5211605c04b89c6e153f4f6616759f962f21e1e85b4e36b33141d4839ef51b24b0a16dd283ce0a59290cccb5f20b9503ca49761bb832c3d5ee64864c95c03ffacb8c22785cd42e6e064abe2812381af98ff8617dc120ee628868e267ac94f0b6eaf30103c0118c28ea45151f286d26a0495b5043fd6326f8b2870c28828a7e19311bb837ba74c9789969b9f4629a19bea2bc0ee5add40b07c918667581c37611bd0b9f5efe432b1bb743849677854fecb3c1255c6c37ad860894d5ce9d9220130815cb24491a8fb8fb2ecc4a9293638e63462b090ed6b71b8318db00000000000000000000000000740c048a7469992b1b08adc74aa29f310b3fd708dda210a215919523fe064bf370a423bb86685f96b8f7597a437671d48606cb930f6b61b767fd6f15b26b13300863335b10137299dfb94ab4fc966c73f78f1943ff3c59dfc4e3fa801f65ff2600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000501f615edc9256f745704d2a5efa0aa4a266772111a0f5cdc901d6fdfb9fdfb519b9b05453e28eb6725c0335fbac709d105656f6176ecf6d6e839b7e87510a30f6ead7cd19e7e2cbe90041699e1599fcb0434ca4bdc8393c42498d7c1dd6443be2e0a21c85cf64e3bccd4b5c1ef85e5f3352507e389bf7a5f0e40a7f5e7e20e5022699193caa71c9b9db4c0e3fe555f21828d69cdb5b4f3a56ee6ba33f764b8fad021d30dd3700bcc0cc707a43dd8b4285e0bd8442371a76873513571d341dfaf43c0a040a18b3dd29d2d0c40e10094c7ce39d2e8b79f86a915705d7d562674bc6642e2b5602e43e38101073712d0051ad36996e76dbc0b2ad25f74b7045477216cc67020de9aba4bfa46b5b659c3bfedd4913199e81489c01602304b14cfa81f7c5eed0030d1254e1df0f81e6ffb9f5b0df54cd90f30ebb6aa5e59beeaacca8a8635bc164030483ddaba6fd431ed2022c96f7c01a75d85b42c9ec2c6e23223de7037bff11cf031752770b96e85908d521597e75cec2bf892f1ada284d14b00550106e6443de710228466c10ac0bb15c9ff909d32b964aa2ea85058a2f050b4c530e543611efe12eface277f945afa53ee205cd5f58beb5b2145d51e47c4f84c4632b2859c278fc497e3d6e83c2d719ea9c448cb2a9a6d6260bcbfece4ac2fd9e3965075c35ded80ca13f96626f40545fe0e5138e69d8afb1776448c86e72e9264cf547fcd15991af75e2a0fdee56ddcc7a1b30fda5bc2e90baeadb1797d2db200168251d4da86c7254f7d550fb2afaaad8726160ee5c3e80c1e8558de0331c2df58c7e12c5d67941ad060e96e19612687f618ad63bccf97fcc756cfc7b6dc0de7857cbbefa97ba8fe6c207c535c663f311c1612ba0c17e93642001cf58be4d04d265a48c1217ffa683110c4dd258b8f23dc67df3af5b7f45004790e8c7ee8e84508445c4645c0dc8250e3e5db09f140ddfd60ff0c59a2b1836f52397a4b7246d6cf5aaa65147c8ac804612d10f33d708d54c0bb703a84307e5396cc95e02af75a3585ad43ea6c79c1c95636eb542a809d6d5b9fd805c18ad7217183151649d8eaf33453f2ff1d5c84243bc16326a5ba90a83426910ddd270935560b0dac3f1fe4826010a92329d379d6c421bbf830955683d4aadfbc149e3437c7f797fda2c4c201b02ac037b8b7f20718bdf6c7a77e5d1ef1b2fc73f66763e4469b97423c8f84dd5466fb18a2b57a57dff07e7cdf8d36d00f7969b64aa59f6e59253e5eadbf7a310697d3b1f7dc776d32c268d48a426b53732ab5b51eff799106626dce3f62a36ef54d9df6e8d443a70443ebc1f3efc14d03f3bd9ca1298e60c62e9ef79f396f807a257875b00db9aac30538949fdbe61494df023a8472506c6daa55a988ab95d4b9d08e02d061bf32abab3eff9933a979ab6bb7261e79ec435bb6391694c8cff8bb1624be52233ce8439baf946744c62f69da5ef35f88dedd9f48b1ba5b04dcdd29e88fbe2dac269778c5b3da900cc8b52c692a7f73d4b93511dfcef895ab5372197e04c7364f65390320136ab73509727aaea702b262deb6836b30d354b4132e07147c025e2d0452acc5cae042570cdb8124fa1930a2f5e687fe3091afc3b5989bd3d14c2fe53861f53a7e2330b8d8119a9d25643853300bd786e0bf1a9e2bf1a979d2ff86e860674814651e553d175aa814bbf13886836ac38dad1d56cbe3997c142c95c2018898e03ff207ace4a2201b02c4ebabb4b00eb42f458057cb2ce5376814e0896d1450c6c35ed184819bf1b77324d3ef49c428dec58d3ac40663d279b48e955b34bd30cff647a0b9152d8b9ad2920e29fd5dec48c385cfc49f6c5c38ba3844f000e036c302fac8ba1b9875cc0ce9b8cc3464cbbacdb61a1ba00987c53bccc4a5fad1971a34376ec282a6177596ebd842ab64efbd0a876acc9f0f2c017086b29dc31ab8b45cd35074f641b11c9111d65d3fa37a3d0c5087569591f85bd361b744a8d4a43b538883ca7826dddd70718a36c5a5fe7a2796307f38887bd7fdbb755badf27623b9e92c6119dfdfb3cadd01738a9364f11e19cbb14f79b7648dd3f25d806b922e6978978a63cefe4253d9530c277eb890fd7008bd74fd62a91ef8bba7fcf8a4f8de12cfc13f506469babe6bf5d1530ad22ac4bb7886ecca5b6a6f3ca4f8b009be05311cfa1cd30b2abd5e279441953bf728e7fb7000db60119cd30fb5b71230f0707997efd47bf920f7c7d58ceda70daa61f5dcc081200dab56e147fef44975a9b9fedd1e578e59f51b0028efe12fb09a9e8043373a301911a2add9aef7d6693109eac1a253b798be0b1b01b926825e2d23acde99a7fae4084e5bd0f89c7fbe551687c2bd840ee448ce15fe7ccd50f5f900e01142fc740c802900a5bd3c21f5e78a3663a0bc459de9be933345052003", "636a6a6a63ac", 2, -919341628, 1537743641, "6f43c986b2f34898ae5ad54da2c66b5e25ab2e0c3b2d7a6e81d9fe65cd060e95"], + ["030000807082c40302de67cf6306cd00e655a30114bfa011fff294f5264937cb05ee1203b92be51e850000000008656565525300ac51ffffffffee867dc9d016b8882ee44b9e9035e2ea727de1bec6b2b207d025c414bafdead90300000007636351525251636c9dda6303f90f5b0500000000046a526a5337e4b902000000000863536aac52536a6a6ae8b70500000000075151516563ac53247874b4000000000200000000000000006e86740300000000e9705d924cf1204fac5e69d5b9163774cf0b3c69ad5ea7a7ad2d6aff3709a92acbd76f1ef5d9c4387f5dc5d8b6ea82982de31691d67ff5dfc0b4d9c849e4977437565b3511e5ba4dfe1e89328b2bf3afaa374903584fdac1d78d3d444745e732000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007831db88308f28691e35443bf623a7ea01981cc0e460e248394bf2cf484c2a7202817110f3b6daf06adab0e9874bb89a5e7f55a8553b565de4e3bc922afb27b30abc78f0e98c63291ae507d9dc7267755d7373460b660652b43987d86d1b3fddb8777c4c906597cbaccfa69a851e3cd9c1f33b3a3567462526fa32f5913722da021156d9c1c6d5ab5a6132016a8fcd606ed9cf26b7d9b102000697a0d5d07dedbc0214e34d95183360634b3556b48f21d6f861ddf94d9405645188dc70f1e8b374fd0a036b7fc88168f108b41f9c59b0516356521b58a277ed339778b8f37481e4dfbee9b21203e96f2575fc949a424a7f6a5701418cdef920b32a5cc5e5c599529967030ed2e4a888aafde85b45c008bf0b873654264c449b2d5c52bbab6d2508f02003021a8b266220b585f81a0ca2f62f0aab79eafd1f645615233f364976543cdc964c032f515788317bdbf67f97902de90a7a25a289cea950210685e1c7523f125a416c031f7c5deaa22d23078ed72af821e09784c762abd35bc6ed8d6c579a76d392414903039cf470e6dec7e006cb231534d140656cc770d7896299d6ba2582d0a017d24707efc0ab81492e84d42a328e154a8b0d38b351f6b65d70fb1add0cb5311114ce8401100b6ed53848f14883d56190a7a55ee287f7040438b26150824a9dbf54d4204235d3348b1f4c5972a55f6a70ecc1200c53207bbf87b349ef5d076f54b566a41788e42f79a12300ce82c6c688c0f605041a25b2cc42ef694fe725ad203b5723d2f723aecaa3a41d381d3992b073799022db70af2ea198211111dccc3c2f6c7eaf4dda7aa43d3f16f074c81a5c7c5624a2feb20e9b3ae7bc25cf30b621d555b3f636e4323008c350ecff5b1f49a761c9909354f5a447d3f89e200dfe08777dd1f595254590b4554bb632a149463a2f63a843e6486b5c8c33e90c540eb67f3c0691b1fd64350520a3c38645d747a0640e2932b96a172242d621bbdcbc646075a0b116c52420788c266065287255611519a450a5bbf6111418f729f6724e3eb1d4db3d8ac783ca286d57393e27cdfd8b89644439a1c55a346ce88317bb69641aab94c50593fc6a31c6827293eb08663edb0143ed684a3462673dd4dfcd087feada0c027d78e98ae68f0f4eeeb15259fa445bc29028fa5997c2de639d4fd6189f9badc7a792f262c1acf6deb0a3350a27c99ce6898ae2ef493f5f70ce4ac7a5c1302dbe3d27dad43109a087eba71b58ad51cee47ba6734008aaba937ba2879ea524452a23be715616fb34695c64cbf9a119764b5ba4baf65af77fb1602f6db9ff7833f658159d0ea045f9beafc94192bd5b7ce63f941de913199130eff166b0567dae9b0a2f8c72ab613fda18b37dc959ff2e48bd66f5dfa7d8769d786779e1e1b8fe6cce9b20f364111a03146d24740d42e9baa3462feef680d6b7561062d940d986042b75d18582e2315dafc7121773d252a79ea4936264950c2858d4c58e4010a54b27ac0c6f70088a451a7e8ec074ec4ea6fb6bfc08f1f7e16223561d94170c4fdcd329bfaa552772c8f2c1e8ad90030e9dba9377e64f4ff06886e4b46b5651c377661892f0e52ac49fc84cca65be3cc093c64fdd32c9f9120bd36ce2f244231f0722eedc1a3c95a65a9cd53fb6d26efa4d271b9e9452de2f598df063822f0ae238984736e971bd5d992ca812e5be5aa2d4852a84d92ff08d6f739b32cd33fc5c9bed9151259cc978dd7d1cda075eb36c3e564d7a15b96f72050eb88cfd7f277d466225fd694629c222d58bfca2070f2d7a975f196dd08ca75ead50f8c98a181c07d357779defc1230be3a3cdd64cf5c3eacbb1d01f1736d4896efe24babfa04d95d3cf5deca3a606b4848288007e396b0a95e068c5770b85f68ca1bdb5a1c6e934db483b4691411bdffb8bb312146b6072745ede4af2777ac074843ee0a1a11e3f7adb4e8a76f933eccac8b6905399d4d4cdea898796a9af15626e490ce963f5576aa81ee995b2d56ed6133e1cb7411de2f296efca017bcc4ded1469a42a57d991cc272e545d1f905590362e76d6daf2e678e5ba121bacd4dd734899ae0e415185fa709337283883281c581174408c8817dc7d6df6e667960d0e5375a0cb84c1619a0471463bdc20712b05275b395cd9e82d309aebb9a0670e5610d63a673f0053c3ecf08becec04ef3796ffc30871bcdea1b0db450acfb2179bd3910cac8bb15a9857490078050ae8f21726cda21db7d1ae0b0961886d96c8c12707a3fd76d2c13e9bb4a001ef8451b68429b2fe0c69659ece0000000000000000000000000098deadb3876d0b4300e5c13269dec8ec1d06fa3ff008d549734308ecdcdade21c429cef0ae8a6611ba0bdae231d58c55e46a78efe3d9f02de489db9144be2e0be9feff7e372b3e525afcf0b82faff2d5200adb40ac1e972cb225fd162b431c1300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000afe725a4e1c35a19080ecc537e36e35056faffc15383a9a09b70584bf3a6cdcc7be71f0535e63058877fea457492f74e2d4101fdcd9aeccb53353e3c9891711d17c6ac552e617e65ebae0df80e4acda0139174bd745fde9cac6b7796c692a7552f03bf45fcf103077d7471284926c910ba12f7bab5c07aad5bb89a2f47cb3b8b020ecc6a81b43338ea7768e08e5a833ed8c4a78282814e4692c6626e8223caf5b90221bd830a2b52deadf1ae3a99864b33d8766cb27bf9eb9cca9475609629d1fab00b08f2dd2265528e583b99ebee3546105dc4024c5e9c56c95866d5a12ab819ace62e30fe02c4b2146f42feca4efad8973694adaf4ba410a65171bc1edbb81b09e602236d5fcbaccb4ba4003265f7f63a81ffd43efc217c2294ec06062ecc85761977021ba79e330733b28b0f0d3a4cac89959fe96ea52f6ec18983ec9d9962b9fca52b0310795f9cbb3ce8a278984bb3359f1af044588a8a5aa0bd43a732aa865f0fa91f02089f3ae83ce35a9c06e050df3d2ad768a3639463b4a75cb11b4619a4606c8d79020288dd64afaacb97376a2a931f7a287694e56a194e386383f49a33260347a3e12ccfbd2432b3d8d2f61bd6e3469683e57e191849466f3aa66989c6e33f6e96d7756aeb7e183c6e718b969f635ea99b0d30cdfc43558f67c3a8207c92aadb7ca55269786e91f9fb63b03236ba706e30bc7923b0f4689af45f6cf54722061bfe3e9351523ae585ccb7bfc319fe86842328043353443e64b579a25602ba4be944335d9fe9e963ce6d6f5564471eeabfd3dda84cf4fdc537be494ac399c6742b90e3ae6e2938db68662fc0399a6adfa5186f9167e2253c7001b170f8aa0fb29d2fc6deb2871db81db2c60a50df6d801cabd0fb66f73ff19099fb10424e3552cb1b6528d003a781c2f79e909f39613d0ace738367059ebb5474bdb1728e47dac8ccd1006f02e3ecf35fee129253f497a7281b333f22d1e39b937573973e88a5dd723814c2d30657008de61caa0f7ed2d1876afe92e89bf65fee4d09e56186a2680e4809781758b3b68a5155429cb5478b419726d344caf88c5d0cb8c508a4729bd947cccf866b152db57e7fad0931cb8f2405786ff6762845e25d6ed2ae313c3aaa66ca9d1eca926331d2cf4867e27c6455fdb3387d8efb66556b2cdf5e09e0d69cdaa90999f1fd1206b1ce5bbaebedcd5306837e77fe3fad7cf61aaa7dc43afe22828aded9ec33067129b65f3474a8992a37b610dd37cba95a389ad22279eea1e5d28728f2ed6c1916252f1ecbe34813db53d3c60b55e8924407ea22da9a8a3b5f4129adf4b74baa7c22782dff28f4bc44a3a4d2b6d19238864dd0662a58761d7f9b8104cd82eb581794db20182baaac4e54f5d9342bbf75d6daa275831ddf4e9ffcebd68828d5c5800b4df067795d92ad4cb4e0b227b3ca706c1a421a990dd1a4ee7a8d0897d359f99a530886562287b7f7126266764b10c46440f0f7349a44c3d37abe2b31fdf9e026447ae8bf498e6969ce4bdd9f9d2a4f9acf2a4d954a3d99d62ea62946acca89bf170c5327828c33f607a6621d45de7ad1b3150f04ed9fcbde2181c8be55a19ab5ed9dd15b4b4f40cb395dc6fd4c72c5e4d4dc310838e522d5854c1944bbadc46c7ebda2cb8d486a756de15b5e156cff22d65615aa9cb5161a80324441d962af295862976ac451fe41a133dcab6d5fc3bd8a99fbf647baff55a015a12d3df5540cb3cd9a2f4b8e2fa7a16bf5982d5590a3ef431312b8f5b0214ebf4d7ea9a0eab1983ffd2be280543c952904af25b14d9fabd4d641081bb5a08585af806707fc39a4b6d1143efad245d6a4e756de08c738360ec17526f645c7696fc16a6979d2f9e80291b64c16296506ca03003dfcb4412a2f06540e0bb31de5e93dde084c9f9947236590e62cfb1b3b34e5ce1e7e7e9fb1431e0180e2a53f442b477b1fa6c59446fcf7eed04ad7d343bd5b302d0fa27b1918a96f4b07eb80938a9b83272ddb6981d2fae4e535396adecf36989108703b1179b9b55fa75d8fa71b602cf4dee9ea91858536b5bc6987b76d44aea58f174c558ef37dcfa4cc72c56ccc25ba81c562c5399f567aea6445361059411516b306c89919b127bf5d872b42932da5721eac09c9ee018f337acd18d146fc39eeb04f801027f9814b41fbfb7d4be1856d6a5cff312e0a6b0662122a27fa394c39b6c8fc92f217eb9cd3a2ace335a9afd73b6fdcdcc334d27a595aadd72dbb2e96522a46e2e4cae652f1c5daf9fc8e6da779a284d55d16ee6781ce8071f28c84641bbc9bbcfa936f64e4d1a260da40ae86411c6c4509e897d8bda9c30ccbecbf55e86c74c7466ffef36540851f60ff0d8ce696abd212e35f7ae5fda06d94be54239b0c376dfbfd9b22972f38a82cb4fe59d69cbd64d51840ef1fb38d0a", "52005253655363", 1, -1955598853, 1537743641, "2eda37e7a9a9c4b85ebb7abf68b0f15dddd0af09c7e2bf35b9149d5b7bdaf206"], + ["45f0172d03489ac24ba1ae92403424d882d3f5933be3dede59b29a024d77850fc3a1d7b36101000000025253ffffffffb64381a25d74b49295cd685eb8e347054b234d33c9d3cf1146ee2c9fc794d3be0200000000ffffffff4f25e4588c4dc678f5875e70c935312a1bc4b2bee71a523820545eeb3b3a8bfd0300000004636365acffffffff01c877270200000000036a650000000000011150ea040000000000000000000000005f76b6955f2106ad6449d5fc519debc24d4bd9255e1c7096fcf57f37ca5e8de61a547f9db058adc44c83c380b867aa0a83593f845aa9de1cb1356f3f728e66066bb4f70a6edde5e93f6e833ef00dbd61137cded56a4867e654153f2c5c31e159000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b61b29a3508102f29235821d9a5f686fcd0a2bee7e778248150b844113210c3af4692c8f20fb8b78d092eb3e296cec477adcc97a33e886125aab2fee07c1bd004551f99d53d0eb7a7b027f0006029d64b96d68b2af285a7ffa604466b8ed42dff840bcd81c8d25120048e53e0282e58bb2ca0c64f8fcfb27b501463e02a3a840324260fa0d18c271b6ebfddc4895d3ca8959a57bba6d0d829a6d8d7cb8e975a11031dd4864528232214ee7275351f16d8eeb86951663923685830334daaafca4d150b075ed17b4edbf578d21f58c3b68190d0971fa38adddaf4b3eff7936252616a88ab4690d4619cbe5267373ec1de35449b1c5a078a479f6fdd7b0485bcfc598313032cda5a0a7a59de825820c70a385cb612e1f0ca78843e0c05ce9d697b83568abb021c51c83159222345561729d28ea1a834956ac0191fa83624576eea24a9f3878703114a83d8bd04f89dc98508ac182c22af590fe29ece4d6f4c6a147646e068c3bc02233ffa02efe2a1b5b49980c34bc38f8db505e9304d43a52973ccc72fde1c07df030417ab257451f1a5db5bb81825672fec673a8a3e23136567445080395c3059c754d7e614dcc46aebefe821213da662591a12545d618984db22a977b7195fbfbed07f60f1d93d6adb8e63136fb9c387d694e0ab3a37e482fab8bcdb7c14a0eff3e4e06f02af625ba4eef718095ddf55f0b3218153f274fab40fd3f0368c1d48ccfd951f74b27524e7fb73de7c3e1e76d4b7fecf1ab7ac00c44e9688799e9a40f40ad6058ebe94e4a8c840adab4ca6bdf0e9bea0e6ffb88d4e58363da52cccfc01e5daf21f9c91e45a2c1980ace2e4587330f113fb236bf7cae49f1314e99e7a5a535e586156e5e58e8bd8122544c39474043d45d6979ba9b4900b881acfbe151a00d05898a072a34079378743ab0deb718bff45bb53379c484c3d8d8e738c0e0d86040001192e13c2afcc81c49828dc6bad68d4ac31a8d73ee572eab4c2cee7e2ee5e9c299ccdc2b711057e7e154ce2bb4e495a61248828806e2043d97e251406512116b17410e309ea47a16ac557d01bacdaecf1820f65224a6edcd667838a6f7b47bf49e3b6d0584204d16e72423537cb1b7a540cfee043161a3eeb85e44b60494c9b686de75e922c53cede06b8e26e4a90f76b74b0f63a28fbd295f2caf898630e58d9eb339c25106b45463fa15dfde240522edb7d3f3f246bec6cc63950fb93e49679090089194e8bcdd9982136013307d2d7d700edc8679345e4fdf3143784944b4d195c96d5f10959cc1d64611a77d108d27b2dd44c064148eff23d709473575bc0ee530da3fa951b99552d20c6eb65e86629009335f8a73b3772d94199282443fe475dfaea2baa4c424505ddcee7def5be65c52dc618f4e8ed41777b1c653af8c6f048fe0ffb4fd2bd4f73523379f2c5520120f64c7672e3a5ad2305bcc6ac1296cd8afd53273e7a60b50eb35e75b9ff3fbb747bf5dba6cfa968a2fdee88f29bb94eab635c4c69b8be77f724acdd621d8cd5c9f4fb1c4ad6bb4dc0378defbcaceb4138ee9af5931a0d2a995aaea6cadca048cd43aa4330a9b643d5cc123d129d60d5831bb33d45cd80c38295a3c94567365833ba2da8fa2a8d6f43069d33d0cd826dfa7567bf6f19d2d3b36a9acde823f5632aea0650a651eb53eb3494f6a23d05938f0246286cfc6f7c9fc03b02be2dd3880860e487b2b7833593fb8aa8f7f44b187d0ccfb4c4822a74df010b850a8d970e950ebee0a57999ecb737c7e45f83f9da5a297013899282d503d7fefce10264ce5f71edb58ad0b89c718943fdef9a67b8c541314fbdd822c00ff02294adc8fb849aa64c3dfb0c00d70a8b2ff4a2ed01dc4f45fcaabdcc4927a338cd20b537df5fef8921653d655a04171e17fb97fd1b7b0a4047a1f583be0e33e56dc725dc4f79b9df730ea84710561495910c17840de2486ce18b5632883c4ef983a1ad999f5f043f6e58e180b82495ef0825936fafdc1da2c957cef776200a1a550138617984704eed588f80d0377658c6937d93d2d249bc21211e5738262ec9fe3f9ac0b1a15ef8694b0e097f64f97619bd11be0879d305243235d50fd2b0f505f99864c863810edbecad038fcce30bb64917af62e5bba9c9cc33111a333be9974cccf78c935843dcda9e0d48a62c65fbebc5e2952a93fd7619713f81296b936eb299de852862105a51ad119d2cef095cae3dba7697b328a1fe1a2aa0ef77624b73f6e0fb7ba546390307d8ba78d63e3c30a2d610609689386f464ee2acee22dd18ff9da349700c3572ea5526b5e039220874a044cea6107f1e15bc29c0f7612bf6e5a45b730d728ba5f5d89372796ef93ecc7a45d5ae3f8ce00bae09cfc16f1846b437c398aaedaa9c98912fc8b1e29240f0c79e70b43895c2e07e84bb4a992c9208", "51005363", 2, -1783944428, 0, "d66b329d5e1fe4a8a536d3673fcd68a7d1824b0f130979033d46ebe2e893baaa"], + ["03f5d36501296434a2b8158d36520013b9ebf923e4a31df04583835915196af34661c16052030000000265001bb802e4028aa256050000000001659c73a603000000000352ac0000000000031fbcff04000000000000000000000000dab6b572147abdf362690e569b040cc0e63d0f240d825bbb37c88d95423edd368301ce931926b76fd4b66172f413c70da8e9a42e99fab6101392eb47894e11cf4b61dca6b3d4331f597f945e4c60f00e2d85ec695f08fe47977793d1878cfe5d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009bc653ecb22d0eb221f7e1ce53c75bab042e2d260abe57cad415edcb2a7ef1f7f57e0f753f4b19daa8379416c48ce2f296d3997e8dcb054a1ebdbfe17aa543e0e90a6bac80df4bba9eee8de0bcd4e0838e855e484ab16eb09c87de510b724e0b4831940e4403f12540bba2ac562e72bc5236e99561a1a9abf20cf9432668def30212fb214020561d2e0041a6b4d862eb798a9917e89a60d869243ded059811ed8802129377fcfb83a91012bf1294b6e40d914753fb5f077ab3455855f6269c22691b0a0473e73d2521f0b61a87dabd42acbc30f49140f34f16462e0a560290189c47633724e26c528e61ce8df0ce61841566718575a19d0e918a1bd480395a4c4a41f9032dacd3423123dbc5083554fd464bfcb94e908a60fe44d9ad3add799725aecd91021f47af3b2fff4b0cff3c2ad3a6fadb86eb3366c19fb978a1924863916b7231140310940344b5f5bae14d2f0c9dd43385a99a45305887368345da028a62470e6980022b04027c166db68cc372aed49de7bb63681ba0d814a34e78a8e3e3812978af6f021b2267d92a345fe5310a8421f6b06f231706dc8cc60e769cceaef6da3693217c9a86e40191ea8a1597663ee79b23f5046aa68d2c5b59920e82463e8bb8b1976c68a80cb1dcb4d50a10d777b634ef5fa9150e0cf70ce6cbaa509179fdd612f1382d93809ced2058838c02aa03d8442a26a1ef21c42604bb090736dafbeaa08df725a29e6a5f1ea609e86baed8c8787d51232dc1540ca3f640043735e44c524ebd0d716afbe03a2a76f7b95b113076c9503a0916221f46156bfdac8fdb1a8d5dbd4432624bbad79d95ac59aff27eb0202d0fc09288d95e58f10c6a667a8842be829a20f8292ea3e38e95b8dd1b432d190483a6534fff47ae87d625f3069b6b396f8803eac03f159dc0be8ed3a710214fe9c4149afd812dd90c927b437b5d760c5e81795c40f6bd16f589fb1a02c6db832ff09a95e30180b6285d4d9998511a8989b34207b92c5602c50c80d9a15b0399d80f671a6d48ca96aeeafbc4106ffe2b3ea3a0814622ea6b16b5031cc05bc1bff587373d66d870c7b8f52122c081bd13b0b1652ddfc0d430ba85d60bfacb0790ded7d30548ba0dcf47b9be5a2616af5fdf4072c12627c3c909e11533e2fee54437bfc7ac19d845a0f581ee0ac45d4c44ab30f4e51a6b95773425da2695992814bc6f10bda0c36366cbf91b2f8f4a3ebee78296b2fa7161a8096e818aff42deba87378973c61e8b1a5d6c57d212736842107951168b9b2f8df133d9c125d0028004f748fb36dc2572fd5203bc119b2e6cf5a5862a60e2e972ed8621253a46b1c68b9212777c54eb5c9c3a4ed389f95a9afafb473e771b14fe9741d6a22fd2fab40109b7666878b61aae88af2d0867f406740573471041873235d46e740672898fe05044817aba87dab5d092488fcb140b03ed9c419457ab59949096831e8988e0fdbecab745c66fd7b22f8bbab6fbd7e892e596aa04ec91ed1b3b2a5dba10a013baa3cd0853001f23d0be413e38dd1a89e5038633d3fc49c92d4811fde2c0b2fd0dc6b6b29f3c52c5f29403662deb96dbbf9314d861d740d081377ab41f735de9efdb45d7f94ed1ae90d9c8bc95017333b6fe0197c6d0e55428d7e6a0531e7a75616c6d9d1f3434e106c2ede717a4ce08e50af044221feb90d058e50f730161e36fbb4594a3a93df7b40ea5752e7a8ef1d869552a49221bd83c37caba24e5bc88b114896b30f9a03ee32dd821fa39a72e61840b8a3a3834091f50fa9ac0ce1fa3722034c4697ba21867d506a8de0e62dbbe16961762a1d8ac79f647096e9f1e63f8db71a66208c0b841588a3755ccd1fc33751d6e08fdfd853a419252fcc59b7c323e653d0e2ef34a96cd5e710025a153d0abb9f1211f8217ac70c0b027edb92fd09c0cc4ddc6b0f900e5dbbcafa1800b1d9a663145e5069c762a483e8aedfead96216fe1219239ff382a9add16564a38644f07ddd341d7d3b2a090cdf4b816b612814540c25bb795c32dc81fe7d445580ec2a8dd4a6ea0dee3e8e4d89cfddd729e3d28e741fcd383b6872edbb0cae0b14692ee1b80de6c69dddbf17460745dc617460b3b7ac804c77104d9c5ea5c31691002865c4eea4612ee803e0f97204862a4b3634f729400ea676eafe5dbc62d492fe594e6099c1b4c7faa3b31e7dc59580e74f0849bc2086fd802794d12b9bf3653f4c3b09dcf54101b8e27653e42c2d5d9ea67fb07c2ddb1757a1a5ded8666c34f0308702104e419b77f080b07f78ef0d6ebb9200b95020000000000000000000000006b7cf34403e5cda0a32b344fc9fde92845acc8cfffdde62c0d3157f28bd6070ef1b9ee5304ae1ab45ee6a83ac39f62c033d3120a912100d8ce2e1126ccc9dd1b79ed71a187f25a452226efbe662244ccadffa06b8d2abf6d04dfd7ce471fc0bb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1b08fdf8c988d6b1c36a0d9dc5a329cd47f7d4c9326061aae8417afd84618ee8437740ea7f9b65eb613b224e8b423f66440a39be096b030b8cc7e0164f6e0122786380b53dbc75aa829933d38c49ac5ecdbdebfd1d09cc350c257ba16cd5df38fb8ba0f6a6aabed7ed4c4ae3abc18d3d44a7680169ca5ffe124cea2317b052f030fa5adbc8606c5175aaf5769bcbf6658785ba0b5966653ed41fc59e04efd5236030570c7d4ac91f18c84af40433bc352d791c2a0f00179fc6f2ec2dbc309f23a6f0a010318e35866caf0e257b8d1933cef7464459477b61539fa52f86f88fec0b988a1ad4e56af092799c0a8c97bda30c46da9f7d756fc28fab16ff1186e177b5a87020c0f59252cb70e6484a890744805d5780c8c43e3d6a09fbfc532ae76201039b8022698caae83aecc76fb21680cb0ab16c08a3fb909cad9dba923b81a3ada71a176021f45b53429a2ce8f518e8d8d2fa663db963f65f2ddbed8f72f7ac00bc691e33f0213d6c7a17fb6a6340ca3ba3d57177b74043deec50aa8e6ee00a688cbbf45a46e02072ff0b650170dda61d226f0ce57811b18e906009d2048a0cd5fc736435b88d7f10d6b9e400f53de07f693ef4366aacbe5eeb50be3bc55834e9b27812f46283a9069a2a9ede5a2c25cb6d118ed1ab96479a98173d576e1414e6eafbb5a776c550141ee631bf3ce9ca393e77e8957689c8a5fd6e1b9658df4d2da3ac1c49efb359b9e30ffffc3eb1b78fd8d71553cbc38082da9af30b3abbf53190fb6ebb5b7dd24cae816bff71732cfa2b1a6440a6bfe0d32e7ef008a56e8360a5b3ef720e452010b0800b096ee303bcdb788cf26473d582bd75fea260972978cd012183d32d24d5642d2b5af6a9e7ba6948b8358a2f66f20077f6d5e9d95564855404230d0ab48f6ebedbec25e7f190cd32485d077b5af271b1c828dff9ad211c71a457f297b126ee9bceb43f49e584b493bda464866cf6673a85add7920d781eaa6044670e5ce8821990e16b731d22a636ddd84c905b896c6fce06c4998865928297e9809e91a0ecc70fb62ebf4ef8c31cf0f5b333e6742a239ec9a23b05ec3e490531ac0b2b1323007991610e5220e24d91b06d4f6fefb514b705a8b87448fdb95d6aa0c1f5c30a3621fabe2ebf4aad21544cc83981ebec0c07588b1eadac2b709c5c5129cfd217316f811b859b76665cc3e396fe108828e13de468ceffbe7574f6a69c9e478730e5eaf3b9ea614e57455486070f35127cf1d982c46f3fd7aa27876588be9d46e8222d95a0ba3912369ff42c50d112d9ed731c99026c464e4eec37a37e6f1f50a47401a3c9fb2c01bed4868823d4653bc67eae1326221a0ce00f90780eda137a2ed0f9b1797ac3aa721690c24fe893cf3e0419d0e69c059fc70b2fb53bae581d540a6c12a19319ef8bf9af8f4931186b45cd50be95d38e8e8acb44103ce8153bb6bb372c69524f23ea624e6dfe5b7e4c1cf5883b7479840d979c92fc561a787ac45150cfe67834c97edb466ca5a93570729365835cbcd8dd0511bab20c8b0f78c7ca0afa4425355fd87bc4c023100f8ea9035206744f68d6f038645b4bfa744f3ccb309f2a94e24e44868da7811041b93cfbf92cc0ec399558e5978be3333ea5bea9a9fd67e0accaf9327ec95c4e2d8faab7d5f41691aaee21e98e78e542b06fa128e01dfe9f67d3b41fa63ea0bb539ceb0be9552a70195a680969657adfa3bc370433fb8144196ba7b6c8d7fcb71f15ed0e641fd51b011078fa09e79825b3fbdd1ac9e72f551d044bbf2e09adb8da48ebaf649cc2083b8b5a01f31cef45fd9f83635023b79ab9f88ffa727a64f3c2dd1b3d1aaed9375e621c976743d41c1de0e77c958d1c9fd285ff6ad7a08602f573275c8a587f305a9de49bdc059e233da6859a8b854f1d31af041156473dda050272c8630c41a4e0f0c74ac02eda6e66b492f6feb2afe472666a7b9797167681624e2b0fb68c70766b227c629e974544da4c10f2aa11913554a502b7b52bc68a7bd0d4653c577095314c75ea1f487bcf1fb8d4f65f43cd1f93363a0f6ee18830bc6c8429103d19edfd1943e0731d526e65f5b4fce01905a56c73bf299e9948eccdd4be0b71bf14229c31d924851e3f3e0f946bdeca3fb586f9aca9d656c1266aef16f3fc333de24593602665703f9ba930251b09b5dc3b81289a6d4bab71fd3c51cc14eb937551c8d19e73fdf13cfca387830651c364d1190c0b082dec48bdc9482960ab7c98c5a2d64c783a0c3a0577aaeb51148ac56f291a3d4a45b0894ca23e500000000000000005ce63f0500000000c2f27f7072bde747b5f07b8c7d677afad128f0b9d694595379d7a5e548acaa532b4539faa36463b010af1e61257a0bb73646c8bb4efbd8443dc77833d210aac847e91d3489bbae95c049e75496baa88ed7bd15d3a549d74a3591df87ada3647d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e9647073e0c732e0c83a126f75229119c8b72a3290bd0dfd40eb09d9a1f12bbd5172309bed2e2611896a95b1e5c013b3459b4b70b8ee13bf15fbfdfca061c922669163f3fcbb64d674eb5089febc6520d0ca8768b94b80e0971a6efba4024ab30328b590f9fa18824f57c01d94edf142cd07c5b15c78e414ced2bda1a336d99b03272bfe5711c826e82c5d9d76cfd36f697a5a52c9af042a9517ac788c99b6955d030649d73d342b3d21ef22f1c2c34235edbdf1ef8b8fd1a984c3c759463559bd8f0a024eb92185aaa996bca98778dc73d9225146a62881455f42d9e9d9ba031dc03b97ff2566ee33ca6158f565756f5e9aced4d1c8563647bc55c46d79e14ebc9ead021a33f51b6f40f046e20388cb5462b9d1f8855029d05dfb882e98fe5392c013bc030cbb3fcb8c7b1502f85c59d5cdb57cdc7000348182b4f785d0cf6ba78b40de7c02183de0988a4c75f644244bb0a0a12a7bf8e8f4776bc7502df40156f55921936d0216adadda201de5f0a3f5ccb2216a3b64c83aceb522286af2d144a0ff87225577022faa1d4de122f85a50ec597742fa58f912c7dcc81a8a3d6be84e52c9b698aea60d38aea42678d3f07a774b05a14e72fe557e67a293b58125de91a96b9c770278e1b7e7acba355c3c1941765ba06b875caba271807c4685737ec4208834d38f1079f2753ad60f821655f0dc7c3e1085af2dac376ad3de4637d4622d95ece2517f55b640b9c7d284ead1de7ae09407b349ce3346da3141f8ce3fb03567dc24e376523073afdd3df81915ff5a4a6fa9b9ee2fd409870f3343a1c526b9adf43a3867a60996b8beaf8e26bada2465a43dfdeab138739c5ab1fe67cb7f87b221fd9a35583b0a7a17aaaebaaa6e85c86ff13c53238d49aac36db2f8ebb0d5ba16044aea14db376a40d1a231d0999271293a70378ba62eb4851613d584e8d13fc548d49619bb0aaf677b5afb071fc75289134d5a55a5a416e7e20848af058e0213e21e15bf98977c65b876bf1aa09981888e14c9272b442f44f749430c09d2333da82c47ae8185252d2e46c27c8960253edd37277856b1aff72d2a06aec4b1a1dc9caa38cc33a4d19e929224e9bebf2447d6f04b697af368ac62f7678b5befbd7dbb56e1bf5a92a0b1ddebf2091443a2e92710605ea92d1b280d1fa8e8db0f4dd5a97b8a02847e2844de4cc9750688c4db2b464d946ae8c038e3fb700172631d0d8223425498b39bda4a74d57c366fb0605c0f6fdf992031dcd3ea4663457e08ceeea282189eac8830dfe38a60a1213b7c91bc81f802998808db94df8b5f2af93303fad43eaebbdd3bd2d2aba60578398f22f05786cc4e4bad7a4d7c61d531030e995c9062df8d1926468222d861d068e9b22e2b600a06fb00fa06b48dda5fa82734cf95a46d2045c954d8c840b79d3ffdb6d5372b25414d882d3eec79574e4088df56d9989a787cb758feb5a8b2a772d6cfa4611133d545a2590f4fd556e95eb9626ca1dac9e236f79e83f1f253879129bc95f28f04220dc69a964662465cf5cd318a569b0e1a3bc9c565504e17ce3d5800b678e7a0e2893e17803722e9fd4bf5406769697d14a0793bd8aa80503960bcc398471c3a5355089fd201a84886127574b256cf72d8d7362a6762ebe0264f2f070badaee3cd8c36d5c5e57d8e37b370086ad2f0c39aad06d98c86159f22136c89f92071b2808ed90885af28746d9b32396b7f470e211fd873100cdabf7f6e0c55dfd3d7ed31fb1477985f06a6e8a430c95cff682fc3543ad829065da892648f4fae5b4ac7f4e62ca1de0259804fcf9085a38945a3c29fc3a2fbc8b2b1bd67d6e7eeb4080c736cfdfcad32d885ba28452258b7b24e5af3c65aec1eaf6192f8ac80420ade83d18ea24b6e80f071aeae177d8b76068458228e71ea695a2c8ba3cee86eaf6e97b14fe3d005da8584d1c65593c05ef382b66b70d7056b38ee770e2e3bc40f30545f174139c968e7de1c195b23ac18839d7d54a7db4d45ce75ffdc4e02098cbf0d9f6dcbfbbc10cd15d5a02b219f4264d64872a5514181f5b92b0587423fb4faa3a8b2f48180b4545230dd4d5857344cde3726b9634f59c6f8db24a8cd856657a37ced48cbca920c2dea887fe2235dc4ceff418cf93a45579cd406505d955c13b125e983f6be87b636aaef3576804ba6d04bd0a323aa3d8d280a872319534d545c1fb799300989ccacc5122704e25ab275c661c81e639f64be08eb3867a734be29a087bdf3186871fb03f982734f1bd3ed09c9bf5d36f2eb0cd3de2e6eabd2e03479c051d313ed286ecd3dbcfad84da69aae0dad1aab57b6fba9b0f6d7b2cd8ad0cb81d79b16f3db8a72bf5c5bd85444378458ee4a88c4f963ec1be704accf0c41851d3b6019720b3c7d677da9215eb675a805738303657b4bca5221eceb28cb0f", "", 0, 2004741781, 1537743641, "7cbd2b3caf5523c4a782dd1131da39874ccefeb6ea7f7eac07e7aabaeab0d6b5"], + ["e5fc7e1d03b687fd905009fd84ac7bc2f0ef0ecba48c9ec4cc4d7609246edc179f705d566c03000000046a53536affffffffbbed1aa3516f63ed4a6e483d45ae3e227d8efa9f2fc2c8119771e4d8107e988e0100000007ac6a516a630063d71d85fafede4da4fe8d1dcece5aba99e3df61043cb228b081b4fe0f356044e32df11f19020000000351acacffffffff0399dd9f04000000000365ac6a9445a60200000000016afdb7e40200000000065165536365650000000002000000000000000098c6fb04000000001302c399146c7ca246f52d4464c973db4c24e5e5887c35f316ab91103522959b98ff8073be70f4ba653b94a69525fb88e464bb55f2bc21d73a46031cdd97606812fb84555049959f4a12388165e49434ef00323cb473f0547ee3b34d88dbf1a300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000654c1ce90477d2dbb5d797e43dc793fb36d877eae41451d000e492d5b55ee329ec988d35cf0566827242bcab8405ac540e4415635438137cefe317e891f05695938d57aa32bda8f759ce9e25435d2f7252d7dfc5a427610d715ae8a1f166ebb4e7ce304e0153f2d8392f315109526b274f4f7dab5bcdcc77bfd725e9f273cfb20213e5e3428f58f92dd69878c5311f306a425e285b3234fcd507b4e56090e6a0d1021d02fba802c8e83ea81336adecb9b1a439e0b3ed8caf7e306b51c5ffe4c4e5f70b08a1b1e1394aa68fb8ebc7a2b245ea9387c0549ab00101b0ea32a3b4c90ebda5bacad9456376f73e8aa9dfadc75adfe9ee9424e2a18f7ad0bae6eb435b90f6c2032bdc3ddd05c89e798c9c628bfa21346e8c40fbe3cb3151370627e1ff3d86b0fc032c6ff5c1fa5d91cf50b74fa1bf0e75a4185de1b81cbc3844f932d63294e63d4d03233dda8627789a137151cdc8200c87c317e56f515f80dbd31ca49a62c61fbdcc020c83b1ef32fe209acfac10e693bfc5a829be6a014e0d92f50936b7c1c95043eb032091a6c8864838d7ec155cbfd5e9bff7f1f869503fc19d73b7498fb98036aeb4644ab54ea7958d89be597e76909f5d0cd0f0d1f9ad682955181e68b85a5b5c8657ed1b79d54008bcf355b5842d9a8ec1a38ffc2baa542df67730ad86b3049ca268997a9d2e77212e43f4d7aec429a915dd8c306ced82bca1ba58981db10ac85b4c74157622c799b34d8e0988a384415d022feae707267876aca2384307f3495d387346c0343e83c9be31478082a129a2dcefe5a1afa3f4c3cf54c5bdad8e577c1a182116e56bab03e7e34365f4002fb54598f31ee3a41b018515dde015b24ca35da32438d1fdd76d245c3bf06c9bf92ece6130d9bd80ffef88ea08e2ad8134618e5ae72aae42908bc6fd23e4a3f70be492df6a5119b13a9d492425a9d80ed07bbeed79bd2b0756d1e0d9554dd76473fbdd69f1e3d555dcb4cd0ca5a6b832ad8c729278ca90227a04fbbc17d744645ff446805df5adc9e7cd887dd4f6a1e2641c64000ebfab01db6474ff69a64458f5b52b35ced6765057b003b520b1cebf62d1e3fe178ed947d1f02ed973be4991f71e71e9d179c62b849491916591c0907f9255bc9da78bfe39e2de526a9429bacaca73a3018cf8b42996268b3171502b3748cecf215f93a57879718d8a708c9248fc11e9d9020762784b2d0f3f78acab8800a5f16314f5bd6164fca5c3c0f8693394da653cfa66b546749e60f512c0e045491aee15447967ba1d4abd9f075cacdf3aac9b2bfd7c1787433fccf7e1abd93887697379982ee221f0911bc4b99f23f908a95bee7f6a20698079e2534ad4205ffde8daaea00eda576e4f2fac6779502a29e2bef552bd7b2823295156a63ba4bed6b2281ca6083d81641914b0fab5fed700b25ea7a67c33b3e24e17ae7ec8ca46f7c40c662c8a70df9e8a378918aba3c18f628b11b94cd9fd77a46fab042b743abab2ef2352799812001b619ec4dc2db9321dd7862d4bf70851c25cc3dde6567b99c3aa0d790e7edf61cd0e4f749dd6532d97ccc153ebe5ad49dff1cadfee608d552e22888a3a7c53b4aed5b0279957fd574800c5fdd9b4f83f71bb389bab889321c073e6e423b30310ed0a96ed3c2a438612af883be6ab02bf3be72264a616c74e8322882773bd61194bf636bf5058984f7fc74a8035c82530225e4691f212048fc7362f2933b8ccf54421a5a97158b7f2f42dd335c24048d3d413d2a1a3438b235fc379bfa8cdff4a438a8ff179de5a2b5183cc8f8ccccbdce786e7981475070999134e023bdb1f1ab1519a3a4b3353cb10d8b806a6e71b26d0d6071eb3c1bed4966ba51fcb7091663f7b13be02b3cf29da8c4222f4cf83787c6f7b16d01362bcab04ae70ea28d89ea36b2727b49a979e00581d4fc929022b00baa870b38168703c910fad97365cd78cf857feeed1e59348c0e266257cab21dcd91de4c992f6b66e9f6ff9140b4420e6c14070ec7300855f0f9d0d0886d77004585b37943c578490241b9e5fdba87f7899ddecc03288ca699245954c4e107c6e0ad21e8164022b1d86dcbfb9cee08ee8529368073d69efa02959a688b79552ba5d8664a5a5207b36acf61908e73d052d3c813fec9f4e31098268b50ae944f50f54e23ead623d4aebffde00385203850fbd29daefc1d1577ce5da54a982275657914ce2d7a72bc58991e5a54f5c8f7aeebb282b05743f2a499840980905991b9a8fd046bd65f615696b1f574fedad378a07f1bdd74d00d6b17dbcccf803000000000000000000000000e56406aeed913ede2214c41bba34cd1dee2f8f75501d18534ab2f18bcb11649308bf3dffa840d4af0004f3cf47f9d459568d91ed314ca25c156afb9f05733e54d13aad4aa2756e2e562b784791e2d9ebafeaee33979306a7fe60b95f6e51720e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050b08e178e5feb736b01545e3157f92d4f022c0f27d32815a21ef140ccca5317ca048773988ebede557e53e0843774dfde37c3e4b75c62ca0619b188a81e6ea3c9fde900d82fd6bf582ea32ead5f8d14254ae9bf483153b188d9d9ddc34f58f6370d4b2e02ca221c9fe8ff1428ae1838fa34e1189cd49f4a65ec35f68cd9cb3b0319e20ea161213b4aef0c47798103310e5c6a1d6859428355309542f445a0f64e021e8db81272eaa5e5a69e0f51c310205c674b1a7c3012e17c48cee7a18afa29b60b004d22ba58bd6918d626ef61b757118e39df294a8072102d005020105863597045b9c187ba479406b054546be1da8495b4260c1ee7563edab6124b86588ee187021a7e29faf36569e80df4683caaf4c103ce270d5709b9e1e8d14f1fdd378ca69402273764645f458c45c9e7589a1b9ab8c273df3cbc909505ae0fb505dfbb08a0ed032ea3a35050c794932d5670188ce318c6a18235d1f6d646f526a405abf60773ed0226699dea0a9c764a2b0b9973d5fcf9eeb73ee6b7387982c7f9a4b02029028ca30206307a54be7f9876f2d85c086c7c96f7e1541e68484f16e58ee545dab8d7bdd41c29ac96f4605790c365a3fa88ec797fc88a27ec9cc652b3cb60cfd498bdc15452baf306c8e636683c87a8af56bf5cf94c14ac76dcefc30b052f79fc0b1f5885a14c26f82ac7cfca501d14bc113200d81bc28f32906fe206493f98bdb04723ebca9c58155b0c92450167ea1806fbace514862645e4c326d1186c3945d41e3a72cf294c5b50867a71eaa918398eafd0a8ee2760d11919c3ddc9aec7a9d716bb0eec48642e2f7a1e9d359dcb2b58828ae44d893346b6a59ffbc4852fd754f2b15ad9e84a372c46f24eb7bf60450916242788ee7ce898f616ecd36689311aad47a73bb4a8c5579f6925fe1f1ad519d3550e65d1b420c3d14959dc209b10a4c6af71ddb8ceb16342ec5df54b8de0609b15f3135c6b287f64f9df42fa078b86208b63653b841cbd1362ecd486e29b87553e1c73f197252726f1d70ee473ad5aa5398aa8103b4456312f85c4f196093e30b5ed678baedc44da6c0a764fbf009c4c2a8431c9b331e185649208c79583f4e3ff915f1a986f033722d923954bfc35f70b97fc4e05a4010758ee5dc195552ab6b34cb50c29c47641ad1665af473dd581c2067821de4dbb8f84ad8d9b041cf51ec235e3d1fa44ab33a52fefc49651fb5358381b6afe1c6ecdf311b52256bd207f72fa6d6cc736ffd6f535d537ec985b5d9db836f1bcd0dcb0abb70243ac2205ad043f3fc474f42beabffdc3b82aef40cf6811a61e3a53c21fc0a13a0dd7061865abc21701d541f0f153d2c2a2968aa9b639f1e21ecab283419d32094c69065983ac490c0bc480b8a29d0ef71caf03e0ce1bfe811dd74250e889f74bcb1b7f3dfa3443a77ec32f652c31cf6a6288b0f5145dfc27e2fb8729d91656e72fa7c21f6adef5e32cedaf8fc19a4beaab1f50925366a01f4d5364c6cfff518341ed13fb00051cacacfa6ee159230c29f0493e9d512104e0d05fbc2bf6cad561aa68e0f8f7822ffd7c2ba2cbaa1d59a12f95e99112552d64af57da628c7c58feede4c5c7d733aecc785168982ef9a1e4562ee8e6dc27925b2b8ef16e2974c3491af9b9bc932769d5c05534f33334a54135bcff1caf33fb929a1b33379a59036271c94ee95ce2f5c9c2be216bd95cddca321df3287a2372bd38f1f6a8939c0f1c890e38edbb795e257dc48c0cc216b0a1a9765809d6bda7590dba4da85636f2ae77afad346fd898e8a22ad481bf3c81b2113a15810fa0f301c00fc3bf916f4b47212bcf4e5ac081fe8f2180f6fff1bb34625c9b86eb084214c256ed942fc691fe8f844745895fd0be154a3af580d44e95b7c7f7cf954ba43f2fcfd697195f4963e34ff389d6de31b9189e77b205fc539a5a9e3d8a0d5b4ffb57dbcd059eb96959e84556809bd33aff869d096702521f7a670780fc71e2cf2b28401e2b89a825d71bb177c056982b99dce0b1352a594ce47a0c466b3973244448a014a966f151cf30bc881091ef065089622449dbd0145ae576cd39256f7061635b0fa407413206371d312dc90f71d1140157fb101c49e0ebdc1425a39d73b4515fe570197f2ecb1ec88b75118669692dd165fe4fec07587d41dc05464cd21101a0970231b2777663691f7cb96c96a2cf6de66585d57fd03e2215daae79c675e8f9c53340e895e3405b5f48c3180eae1ebc8011e1ff777aed74ed1a7d7f74607582e4aed2bb8ad966b9d3bc1213421db318220c2773c947650542c153de679fc1b7f3150f5ab2a0956c71a56294093c7a5e69967d03d05660df48bf556dedbdf6ee57a9674831717aba072ec44fe6abf2d46205a7a75f648f77a5bb533342d6a32a3f93b64112c49ca0a6a221626e8f0b", "", 1, 2062189804, 0, "79fc29cba33881dfe11876e406a4d8970d2df4897e18b7c08312e8e469dc5fd0"], + ["030000807082c40302f7acfde57eab7eab7cf733add463896a94e79c9c621f370b398b80a577693410030000000653006a0051007d55059fc23912335f0885f06a0cad840d161db1aa2452f34c675242da526cc6d99e930e01000000066552515263651ced8fc5022d1d4b05000000000600acac630000575f390200000000056aac5153ac000000000000000000", "52ac510051536a", 0, -1762206058, 0, "7a6a02d6b6114678bdd5ecff94b8b048bd77f6080ce828dcd99162636bdd154d"], + ["030000807082c40302e29f9889d4d847e47f9506ba18778725fecb333040f3ea8a8683fafc99d1b2190200000001acdcb4ae75e6967f3c24adf360401e77a9fb5b4384afcc95b9c6b34e6f516ce72db8f0cafe0200000008006363ac526a6352ffffffff03ee8791000000000004ac6a6353ca63c60200000000056a006a5363a1e8af050000000003516a5200000000ac616170033526c003000000000000000000000000fa1f909f0244b075dc68801a361e7dd783e4b52bf5b80157391595645faac2dcfdeccf6d29e5556bcfa29a9e8d8dd482eab5b06c15a5c6ba313395f01c46091a25d2aba07f9365730132ab00144295fdb0bc4a1f52bf5b87481f611bfb7e4578000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004de428b06480ba2eece8c02229bde255df2aeb849480c84136299d274b61b9602f5de9f6b1dc0be0f8b28a0bcdeb869b247c1b9a44dd9af1cbb4ed959ece32f47493874d82e7d8ea3c487d0660e7cb1096c3772d25aba37bcdaab9f3b2240a29a244635abeba3f0f5bfd7c8e873b30fc98a0aeeee2d0aebe3fd5165296f4bc950303d72f6a522a678ff7b54beb72b0f97cb76aae6ce09a63f89f4c8a3d565d02a6022bc57825f810e9b98eb9915ee6a362a0c96e2807f914b06059b1c44cfde803550b04a77f18ef9930b2219d1afac9883a50b3bcf8ee6ba8d7f8334cef1be786aec8a57a031c983bc2f2f1cba1d2885c232e10302f939948c559266ec27e3f26e3330311e1e0e3097835798e039cf98038b4d443e137e7594e8a9991cab3a053f1008b0327f65c8140888a478773e2d3931099602be4b211fd8203b58b00311e9aa2fae9020d8d2b0165966223a939b35c3085f5f7dbbb672cbbe5b523c8d77ae3ae114f200216cde38e30210928d78835cad536473b3fa8855019d62aae13ae43b4f81656bc02149b9189f9ddd346859831d5d91ea56febce9680c24bc152da487e0f221abeef24953f1fd3a9afd0dad579ded4ac75172848214d1752dee8f8f123bf0c5d218c657fdbe3ceb5905876605cbe42e90350d47d14c4c46affb27a6c886a56f48da6f050f8605fb0f28678e023c1d5d3406f2bea0c5235c426c40eb27d83b202db16e92386b4e7dd46c33a7285af759ca36eed3cda784092efffdfe8b0bb926378a9ae38b2fbccd3d7e6c193bcd9ad3fd44abd05b9c5f7751a085412169ca55281b0ca7c203b8b361f4294af9c9473f3ec5f6a53a70872afd4d60a9f3ded4e430cae35069291f761a0f0e5431c6dfa59d79ea43ec0a0f0a7754d5c737433a12395b13967bef7fe04cd32bd2bfdcd651cb5cab94d10d34b85bb018bf8776d2ec19d780bae4c8d7199d7aab65ea5d4e714737cbbe5ee0093176c6806df76de159f9b603e3b84e57c373c01384b0959090263afdbddaf544d996f6b68d894fd177aa380daf4eed13d3fac77b42ba1c8ef787e87ce9de5d6c98880f2c9cf89004879dd6886215be855a33ea980e42513608d0b6fa096812899c4e8640f570b82a30dac6b7a520a8b5915831e38d99f702756b87af82213079318efb595ae5323ffb5a6f40765dd1681cc4382b3587b3f852bfaea046c0a80e26fb18e17dba26435b97837144853cce0ec75f3ea9791ef097581d6ec7aef1e469640e4219c6891260441479c51d152bd74187adf79338c7cf7b8343714f0a5b63f9769029f4be16bf5c0507b82e31a53efc38639e2f42d0c56b911958e5d0a9c6b94736fa343102b1c226e09a87de8fc25cc6665b17707434c37adcc9d98de2bb41608cf7a7b5d0d9988f672bfc67e7fee8ffe040af3a7cce58a53b17085b6ad5bbc7ed46550171ab4d25e9c5662c8026611bd3570f905562bdbd75ddd90feabfe64b0e2bd7b99954279c3dfc8c0915364dd68f36367bfad9626640b95974b6efc48a7b09a2c8ef7b0f64235dac6f307a63685781cb1fcf0bdf9c06b364235284d6aca5b0c21942f3a40b6de6c13302439ea6833e9c344c628d8793d885c9bf98d760c049058be10a7af4252d3d39a0da855c027c6f2743f28990ab7e5276beb8f92fe5e6270ca1c75a69a4b0555ee2c19c23c60fc58adaf20ecbd413f5166f93b0877ca04154ebaa269c33c1323cc6e372372bc694d799387aa907018ce0ffa13759535dde8d396f1ad8216e9a0323849e09988fa9c6fb5b6f63230ac4a771f4f39ea6a9db74ef9d790439572fce3dced528a9d1378ae277cfcaf15d86a0660bf7de310ad8e21327d8889ca3ff7a1d007a8968a9f069bb629d40a5c0dce994f3d2f30f178370f861076081ac48a61094a9988167a9d29d48d267e3f8298fe23b07e716659e3864efb2c8438ec5421025f5ddefa6fb3e5fee6d7969531ec77206a04224e630b292b3532103527a0b099bdb22a7a42aed536bac1a202345a8839f4fe80ab3c8e79fa7f2663ec684a69c6d2a119cadc26eed8f2feebf4225ee6ab6ca399e1dfb8ab550f0ba79ef9de97075de676848a5159a85da153c818ac368def8a92bb650e7f688d1f1590c91d795b9b6b8f56743f6ff13b2c156bb0e0f4f9f0e8a9c3788d10a55a4c8dfac66c6ab25f02bb5866464c8749628255a75fde919e217b4ef337986a94ca09ee1cb8949c41a05ad479a7185a266ff6648edd31d3c91521018c888a420f1f01db1cca9ba08f30467a3ca5a7a24642c1f7a28f89110500000000000000000000000069fcacf17f3423697ffec8f15e13758a34e70b1ab1ab3246b70788b4d8788560fd867b5d885994932163f0330f93241dccad1e42308cb3e0011a099f20320b1088711a4e65315528b554667f4c0c4b56df75586ba9e3ef9a5fb705a269ab04dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f0ae649ec6e3a3534eb6f6da906946278605554c7544e976e0593dda4ac885cc848d9178387ee568665b45abd6a4a1f5f59d59593c68f3b3d2ede83def9bacb0c3d82bd049cc916e896041f0f19577ec8a81acd0b568906dd82cf704b568abfac11d26607a7d9da18cd874e4c965dac635ae1f51d5e371cc3502553a08e2147e0207106104dfa817fb697653d52e852d3567eba2e836f766d19747842286d4255402033b248bc6ce35d2464d1f391eaeb82a87a21801fd0f8e9521d6b6a0ac96d4790a019b6fb238cfdfa0234eb32122f8ff43ae2e08e58939ec26a5c9644a36fe36ead32606cf44427cbf6e3a564b849e2bd67d00cce2b56355b6b05282bb27ac4d3c02173e92a74b394f1d242007b92bc9e1fc10b2157d6b97612481e223393285ddee0317897f078b26daaf51fa406454f1daaf6676d39937ac6edb1f28be203fc2e71d0328eb897b24b167e9ebd0d15cd48676b676b2d1e5e36e8dd6591a06d57336261d0306545729acb4fbd03e0a1d4393791a6652ff9b0640656602cc422ca13eb4eda503098cf19f3280bbe169165e65cdf4b54f0233885125fe8442528306b6da1d2eb3d0889d5d4d9821f2ce52fe8cd01ec5e833310b5ef78c4455209a3f630322416315c45d7001c560c594cb7625dca3fffa1b2272980461ebdb61aad66f9a4bb25a82962ef23f0affb88492f7f1642e21cd41e661d927933bdd146b99f5cf2e48f864f42e45182a564427598299b9161ec8448210d0292d13ea22cfa815073702dbf8a2c0dd98f75dca34a36eec56f5692aa3356225b65cf5e64c9fd74fa8e7af5a295cdc775cd95a75e2d5ae245b08a2f23c2666c80ac1d2278d2c8b23fcdbf548627a76680188ea9001dcc6b045cd9bc24268543bade1da0250fa272953fd8027371180d77fe08952fbebf23fe26861e998e9097f1cd60bd6d86df60fe91532c672b3dd2e52fe18a2602431bbf69079298f5f1af59e48da430a12ee03b8e8299f42112880fd06002eee05a68594850f5eefd7151db531a1da089882063dc8ad15b087bbbe65c9518cbfd903025e205a03c70ae831d250b37e48089e2b39107c8954d76dcb7154ea1cedafe99bca9a797853a097e0b204340158aece3bf437f0d07e8a4bda31a5ba07e01a974042b74ea474b4045741c35a30cbb263e8d0cfc15a23d0a726844f35ab0b63786058f3c26b44f6cdbfce0987e3681b9cc5043eaf68a70301c5bd29cfe73b0ccf160d3525b47bc1a8e3f7e998e22e35976e0832f1e1ade991ab8dfba5b08de617dc5a78cd29298bf5a02207173ef3e12f3f1259c895088aac6e8e0efc9fda11de50205a34d427e33c880ef8bb6c29b3c09b66ea364a13c5b876e90588fdbbf95f81fbcec32fba50241034088bf2f1f2a8005a25617c56e6b7b9362aa7f8d27702cd85939c43b0fd7d4b5c475fbeaa24234509abf8111620cc7de8ee5d40033681cfa94c8dad2018f21e8940f59872d542630668eebdadf04f700f58d13e4269894ac8d339d972c00f8d49dfa9bb915ff9b490bc23bb1cf70fc50467a78ad0a274d455c1463db277b4b65acb13ea822b4f741b3010fba5952c292b57ea91c10664cb5045b807100bd8c65f0cb91be9a63b85593235a814cdb4082bd8adbfae0c588d266f42b5ad6f90faf7bd75926f48fa9067f119ad410934215737aec8e18afb41683ec986376588c98edb19a69627a779ab44255c8969c05a2ba0d47f3965ab42dd1d15a4d67da8bd14be257394da13048db47840dba2303801af3feb93fd643708742af5c0b99f86818476328e6d46f0775ca08f2384c43578b484019ac6d0c26b6361c180af30a01290c13ae52051a87cbbdd03a3860d01a51e9b48643bd684088e28b6d0cf5c1e48b6176ec944c27b487554e67506bf0fce088f8b88d8e6339cb16c1578c32de13bde55060536186a8f7c41a0e846a6f08f6c7b616acdb4eb5a3c644290bef65e85606da6a65c04b58656b34dc24a6ba3a733f282bafd55dc6762959e93d5462400c3dc5717386a5e4b1e1781f88bfa3f396fb14bcf20ab8c828fd4ed14334f62321bf0b857cd06caa5b5e92e35f008fff70c1d85386b154a308b613fae6ecc7d3ae967c9628f88d1ed8069f639241578b00df47d4e374720dad452cfd18225fc0a42830239573739f12ea834637e47db736f60f8c8ab1864697bdf2268a1a60998b32bda195af5e03160c1c670135cfeb5e5a72d684d5225db1c9973fb711d985f2dd393dc53057f82450362a0f5f133444dd7a42af3abdc5af396b268f4a802f604000000000000000000000000c49d712845920538d0b8586a41040838cdf937989e5a6c4c5d71d02ee1f37fb5ce2f8f35431f021d095fc5f99164d26a822ca04fab14197f1764c235fafd671584ae15d7068e7c943b4dfdf399097f4853bd252b6abf42995ffe2d04bb22fd5d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096165d5283f09a1bddd13d31b1d01d1eadf306bc83bb17c2c3783f442233295c38c83a762bd29d9a210044a8847ef5f0ee754c5a234324b90f7d08fc2850e23a1c9367096f5ac4f2bc9c365019a731aedb0cb0d8bd5e5648589c9574801abecc0287b618abac56499f88b6168bc201c7fdf465b34f172d8d23e6216b2c0f7e9003127f4bd451f3cd002ac0f8e0ec361e4d89967023db024382b62d2754c5234923031ee5227c74c07fb81b6dd0e1f52bb9b22953bd1e4dad8301b1ef2a6b79378d170b02767b91f7db62a64b43ec8722793c45d2199131caf142fc17d3553411127f1a3b0d54c367cc7fa543f0bed8aacecc8cf45400415084d877f47bc21369f04d0a02088465df9737dca4841aee1cf2d05d460964d3c6eb0ae0e3517f83af74128bfb0310facfc2ba4616500084f59af8bd7541fd05a76579a7b34654e43604535dd877032be3d8e43276d96ec06f6c47c28f612d70b50795bbea6c75769f1b2157f31d970211168498eef812f35641682781fd4779473c0bfd70e340a082df0a4580f8644e030a26ffcd932025438ef4585c7a1027861b6b5728a849032457517cbe2dff1621ca06f02a336f92a61a9bad2a5eddaf7af89fcb32f9e92040fc87605da84f45b2a0ebea0ca192c7cf9c52318cd367b9b6ccca5e7231b2662ab347b1d985cfca851d109d1604bd94568975f2f46aaaa1839705e61a092cda6bffc935ff6819ee45480c273a54fc2bf923b68535bd38dce96fd575ebe6c00c228842c31eee409770dc6ec10d4cac8f4551c361e500614b07426a08df3a400203c9f449f54d16e580f695f14e7e774fa830b941c693de54bc9760ddcc0eede1f8d73bd88f5b9365559db4833cd8f16522bc66b9d0abe88fb56e809633a76ed5a1ad195fe7011b552f445c69f05a73c20f2b649f584a9f1facf25909b44d2a0814e8b98dc98d07e30021755254e1b2772649517a1ca34ad494f0cf458e25d6568b087f23302e10d8fa9cbbe6b79d15ab8841d633eeda74b57396c1e311b0551354e983c841a52d7169bb0e2fbabeb16074b66897148645c6d5a5ca86f427860b69c64bfa93197bd6065d0ec8bddc68038e9f7663bcc1289e0f01152a65f0c53a74960a25e09a12a729d8cf22eaf13914cda5dffed4cd3edccbe073de3e6a6de75171b15bf993033c38769411a9a2c1c814c60f0ccba9842d5c435ad4bfb91780ddd6ef335b3856ca2759dd797acef57db805abd7295e5e8070e6088fab2fac64252f8dac2d644c94475106b56ecf7363223f9a7425d99100b9119e0b59dab34cac07656ef16b3d43fdbc89d1b973a3aada8da69d2964983dd125463009d0b0b7ae1190346febe9787a4f2d0fb80c105d0bf23be2d1de8c7d4500c25eac2e06f9322c2c52116d63af521ee9ef612612202a7a3a5e939b9d3d197167334ce8c839b305df533336d209f83ae618f70a07eac683ddfc156f46df1a42a882dd07d48bbb7d936d2f17dd96201e5c2e9167eb1ff22b70aed53bfe8ccf2d01b1ba8a5cb3cddd4be5859c7247bb2010f8083180dc422525fc62a7c3f6b0e27d3200a4159066978bcfb712d56cc3e247312c590839464d99fb6ebe4be3c4be9a4a1c536e595c9f82dab28dbb1812d10acf73289c0e953d5a0a98e5760121c0b507c8b5bc2d9e436fa62b373f36ef7763133f69c86d79490316c51e594673dcabc08b65c6f4c2fc4cb11aead1a279767f1759a3c9af1e945a2abf832a5c6f27ce712ef16442efd4be4a8a439a9e999fe86c48b7465a4d678d1ea54b65dcacea5533004286f65a24f8ad171b88f292a86a0dbb028610cd7c20d3a639498f19f3b7b116cd5b45627ff4c50cdf7462676eea90eecae244e47a43ea0175408c5b8f76d7cc90c92c766394ac3c4aca2640a8c59589e5263ded07898e30c96ff2f53fee1eb731504640afd968c440aa5fc5f810762bd65ba800ac52a3d7c5ca475bb20bd6a67620b1e6e89d8e4bba9048a6e8babaa9d7ce3fbebe00654e51403ae095fd4f749e1570605c37b88a650a30d650dde959e20d47b1fe36ba7ad64c35e0134e27c8a0f600c54c4fb7000ceff7dbb15d18a88767c3dd0d6bb70d61bbedc22443bda78b371050c5d1c17bc099ef0b5768410b3ca10d62673fb21622b21c0ffa8b1cf1639652d103b59bfdf464cf8e61186fb1a353796772bc1bf73b7e970d2499fcfdb28fd353eccd18dbbf2d2842bc4aa35b36aa6b4e961a86d9fa6b4275b91f5a43ff4c07e9a49f6deb3e4e788993d90b098099e106f70e0b3c9c9bb7252d234d089f240c13a016041c3b7462edddb9a054c7b7767d347a1b75667de99227c4813313c6a672e61c1f0952af3ef6f52a4c1bbfebae89d51de4d2b5a08226e21cbdd9256670a0ad76523d8e0d120be82b5e4a1266b7a35aa772223ac81b53460f", "51515253635352", 0, 824019233, 1537743641, "96f6fb15862801db592136871a24643f10f97e376128d3961dce19b32e9f0132"], + ["4e75ac2d01c06199d2460df6e8f02cf734120ad58072e80d538854ea38f438c36b3765d34d0200000009656a510065ac650000cbe7726a04e063e90400000000055263656353e6d3970300000000015136e510000000000003636aac8df85001000000000900536a00516363ac510000000000", "00525251", 0, -506308425, 0, "49be2f6906ad27b10df401845ce5d91da4e019890aecf41d9ba09132881af0e1"], + ["030000807082c403014df762648c614e91ecc2d4cc4e8323c3f2150860aae4196e8c65f286da010a410200000009ac6a51006563515252ffffffff03816bf30000000000056a65ac5252efa72202000000000452ac53532cecf00300000000009ade370ffbc4fa3d02000000000000000025e06f02000000004b1aa1a09295f7332f74e865997733b8eaa3334024fa4dffb00af629237287d8dc9fb40192566b90cee144438f39eef0df4e1a04e0637d86ba7c59d53a5a23c77ce8e1cfb53270e160215a8caa2494b672e3a3e7ed4814648edb2a939d4fe146000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a116711cde87bd72a1ecb37cfbd369081ec131621599217acfcd128e9efbc8fb080f7717ebe34445c299c926570fc71dbc652b5ca18758e153e064226b254b646b03e8bc0fbf0b1ea0fef29812b278a61254ed51b66cead0a5a95b84aeee10d5aef77d7631c120ce5da9132a632ea99265ea24d1661db7242d01477c90af8ce0320b303f94393329885f0097551b2ae3841551b957a02cc0e9062e9adcd2e66f6032869d676b52384ca5b091994db1e082a07671607548e45c320dd822872bd2bde0a02c4b249c861f21df169a8c4405dfeebd93f6ec88da469c58277d1d61feff00b86471379efabe5f1f96af818361acf53eb9dd723a4c59ab70b9160f6def86d93022365e979e5984e831e2640f6d703c2bcaa6f289169a6362191789bc853b2c6040319847f168f5678e8349147cde1c93b2f42dbfa865b24d6a128e6627e122195a0031c683c92a5056f9ac1f53f1bb5847a603d026cf72710da14c8748170594272df021e3c92b1faaac1d7c8c2b1727d08112923bba02704cde7ae049c5df8e273973302162c1e810e3612e8caa43a2ff34deade0de3b04d97933e687b9a6c00e95426857ad32dc376be5ebf5b3bcd3787db479111c49bc797620c92b20858eff9f75a955caee0c9ffa8ffb298d2a2781cbe343704f851c6c4a45374771e8e3a664ac93a681610be7b675cbaae67c32c2f652118b26a18e8479ab0ebc66bbddd583a86ea42bdcb55142ec33afe0b185ab66c6dd5f788be00bc3dcd92bff296d6328db77087ddbf9716a3405e60e6a7061de31c8782b15473b0da11aec5a89588d49f26aecbeda6fc10a44b0bf49bedfe8c52c99c0ad826b336354a585a6b3f5da1ac92ed0a5669cf922e19cd6719d7c874160d757857127a796f4165cb16ba1c48cc765b8f8cb4f1ac7653f6f4667ccc3126e75e595a63aa2f9e9b03e7d599e4b142e122e2fd05fa2524a828ada172f9f31d6236713ee1cab64e385da2fe2b0822d2f27c0bbdaa9174ccaa99fcc7c77a3b0a18d005999b2f947b3bde1a93c4491b790c3708e04e10419f1f2c5d8bff8e467510a987d9e5eeafc5525bdff4e1bf5fbc5dd0a3d2567edd2d0c8ecf004016279449e1a77db117445313574a81ea4ad1e0a2483ead8455043bc815e2d5a1fcbd56192c6761e3b15719abe1b4e55617603da5b7d05e50e181cebafb0492d9f562cddbfc77cc15441b94975b27f3a5bd9be4c9bba7629e189ba94cd8cdaafa0e34d6cd7a71715f78b2b64e6a95a5fcaa0b3d7b2c7d0d29d6d6d031c0a7766b19aea3f7f82b1a168a77ff153d4669a9021180853ebdaad2f2632d636a75a336c1ddebb2292584cdcad4c212fbfa6b86c7a6baad055f9bd234f18e81566bd7ae521bf9a321ffcb43a703009f1833ce37b7048caa8c9daea2b54ac31a979a2287954ed104b6e3fc0b5c633653efe6d40ddcd0010819a20907a427a686a038237da3bd83c7df2e8d9a10e6dec8e16a11d836a4839b7d649625eb5e3cf992e1592091a0db9f1d478fc4d153ac1e667c04b3108a4b824c973940ff97e4d7cd31d5097db2958f931bcfbc70b9072563ecd254887e695eb969622411a0fbe07cb50d95865cfbd33d9adbb4efa28dbdb256f743547f93e2e85ff6c6ca39c9328fbe5acdb3b00fd8339ca934fa3f927eb1f77dad9fcf89be5370d1a4f83732b05303cd8e4dd130d5c4f355dcf6a2ee099cd588d0649399725f03cd6f8688a97f90d3fcb7473f0a5b68fd8ce4d5d93cec64dfd2d9c39b47ba1a4b1a3bdd788b00ae20a331b8d48328adfa1a398b673721355553032bede2f64fe24bba4974eb2cf768370e8f7c5edbd1097f235ade9f64a0dcee2405bcaf2fcd1df8fc49a3dfd55bde39dfd5436e19355174765d53658e0f2842d574799404a3bbe6ad4adbad467b3caba091706832136e38810efa628b65f44b8fa653aefa93647fca9b1e47f33fd47a4236d2a511f7c9650bf398538ccd7892bb52257eaf2866c6d7c34ca105eedb414fb71435cccc3fec6afe4a119d670e31d258002e9f363a47291664d262f31d74b3234b41549f9b7eb3f4f5d862282d563f5c2319c21e36bf0cc0a2b90d9295c5d8df03267024ca82042b1a9f7ec83d9dfc74e127e13aff102d53bf2b5ffeb6a16ee433c49558438ca548234623f7d1177e1dc6862352cce1f17ea4c1154673c61668b3513ed4e2a397f3230bc8da4eb35784a5be808f2f1dae700c496a0065c3eb18bc88d011537bd5907359f68a1594773868ddbd716469dc8f523415d7be47513c2cf2dca185efac66da010000000000000000000000003743596167172f09972960b957992ed657f991d00a9bfa9afcbaa1ad881a638fd5764268f03a3dc10c4b11013d666f1e9d9e2905e49e50d1c80831b0cbc4f30dd7efac87b7321c7bfafa24194e4b507a7a98b1152ed4fa86cecf1fbee8bd169e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a44329852dea6edb5c583a0d24e33c479333570ff0c2d2ae95def6d531d73c891779b209b0fee3f629aebc329112b68ecbbcb639d5d68f7f9c3bbe0a608ac34671fecdc73820aa32a60f35d808f86445e84c31cc2177442f8944fe5b7498e3076e325d8155699ddabc25c2591b897ff6f824ec7f58ed8db6ef0aa4971098de70322c56b0cdd5a1c38b1fd17afa6e1e7febff1edf6288819d4461a64cc5adde2de02252c8cb7be44933c242f8e74557b0deaef131cfbc03566d14cbef90597ba0c3f0a06b864c3de0cd6d617222f605df5ee0667f53b8d3be6d3f00e1b2c12a71c65c40c94f52c44473fcb3168a0eb25ebb1558533a6481051889ea21d0609a139d579030c92fe868452329c4857080eac9c14eaf936532e676d9b4ec45b7fe903a19498031cdb9d999ff92a8a52d5da8b5dfde4ef6887adcc39eeb6bd7862639eca0f2d93022bac4c695ff3c7d1a10233c8a77d52d9a5fc63d2a066b560065a03753e6296f90203578971dcef32c1b1c26be9b03b9c799fb7f7c66ab3c2d18689416f8e169abb022c75b748a789368d0d5297478753fae3bea1412bd6112a8bab98b707c9211cf1d060349391957cc726a2465f4a93cbefa70bdf92acd38a2f46d92e00acedbfde5634052ab309339edf2d22f9653f2b8b2f258edcc1e7c1e94702547be9df64dad8b1f383072cd9b4cddfe154159cdc6ea9210fc0844bdc67caf7e972fa2e6b73a0110dedd3adce95579d573f789c5adfec1684fdda856abf39d6686f9693682aaa9e2798b4ab3dfa81ff5b2acd1cb2c63f16d0ca9347763f42c8183e1de29574ddf22b066c3694f1a3f17271a7f78e717a9239ddda1ec07b3d1ffd2aa365abc261805f9df706b5e4ae8189a53867f89d441e12c00afaf8f60c1342a25d7943068419bd0fea03d3dc70fefea218bb966812ca7b801f2d3e952011827041757052c1ec048d05bc6fb2c8f56f849ba80f06f54e8ea1933f5b05356add231cfeb2f9180bcdfb502bd015f5baa9309ccd42524002162f1cbbec8b31f01afd9e5d1d5499afff5d5eaf6afc6e2ab828eac7d340fb6622d9b73acb7b0488bed7759b002e14a9e5af74dd555163e135b43285559a8050827a741e6f897829d7edf92b3df4539ee36fe65bf399c44a9231483c79e9b50f130319382910a37f752000b4ad6b17eeb31fb8ca21b07cda64a786afaa94bf38017720bc1341ff2e9ab15de8df1b051c4ecdc14c38f6895c9927a139c4c24b04ac4667cfb1c7449d1518e6d9f09c628117843057ed79996e81b9ffc0c85def16ab7f12d30426dfc42cfc936f134a344390f0138c1062f8784ff2f3f39d1d91ce4a083d648c7da2e90fd66bd534651d2d2134da1cf2cc7875326318f887dcd8d37808da80ad6bc7f0e976ea9fbbe2e7855b8e9a7d7413f02918029c19cf15389aa8491e51931b36251c2fb74187b5f141e07fa66c6f11c6b7411768a9fec752c53f9d18447c16a6ed0487411e4051cfb75c1640415d9dcc00ed3b000db18d4915cb208bd75ba57c8c16a436118be28cd096a2c258ac7c82b098c99f25c02051ac653afa7390e49df0c7b0672fffd484388a5824e4721a7363b2af06b7f99a421e2886751659166513f890044521d5c91cae7b64b0fded1d8ff352896f6bee79125d2ba3c45cb50f1dafde2b6e5348720cde6a8bf8d53fc625c265a7776198ce1521a4c0861c493a1df08c1903952f7e2482dd6bc16dc62fd53bde2c99a742d23dd7b97e2a0c9b29126a47f94a2be75992cb13445be8ed159b18425979c52ab8de3267b44c0ffb5e7a8ff624e1158ed45c966bc1dbb549b605630ba4db0b56f35819159879e4e162b66be17259b52896c773aabd8f4acd4d512b74861b9d993cb662fa2e161ff155678cccdd7c08b10d9118034d2338117b929943e064b2d7fec2f18397ec6022efdf1a29924497f9fa4f61ad393da09066e1c08ba93c73da664b9413f43b6e612424ffbe06db15800154a7767f1917a56c14963a6ddd68ae087ec0218490d95a086418f44f1de693a00ebcb83116242809b8eaa7c163e51579cb46d7feeabe7b59bcdf23e2905b9f307f5d2c379470d3d3463f6a02707a2f90a6ead9f800852532d794b1aba12dc3f860d74233292d75deef0658598df5b37778af7670b8b92ac85e670fcd735c060d269f139ed798fc4865ce53ba4488d8723cddbfc06db11c7ca4ba2f61a2af2e92f53dc9b25e0aa27277227174a0631aaedf30005c52ce23be37c013b7bab4c35eb4ca92c663961a32303b335a5a056d98817c79a277959d5525c6e67ca27e899871b8adcf843a57c094b3afd71b902eecb35ceba8de46fd24b29d32bfd7708e9e4e9c8f04b8c1a90b09829b4d51f16f08ffb04cd9d2e84fd8af52e6e0803ccc30893967980b8e6c138aa6974fa271a5300a", "6563", 0, 1658768464, 0, "6a1d07e886868f8fc2d19e38b85fea4160440068055c9ad7488401aabc8a1e44"], + ["030000807082c40304f518e7c31878f7a5b53f6794b4dbea6f87c86e07d5c8f4378276f894cea623b00300000009ac0053655365656aacffffffff398f5bb76d3ead7489f9915d63d703fc2ffed0f1b039aa91627e06eff50bc007010000000165ffffffffd33601b71b1b1b939518ff95127a6a02ad3e05a0fa802713e022189f5f23740b020000000452ac6563ffffffffcd2eccacc4c9d22020c974e3bc4bca467af7d4e01d656703b562b086c4e91a4d000000000753635263650051f894fe4f034bc7e304000000000252ac7ec79802000000000663656a6500ac3b648b040000000000f777c8c14fb50fca020000000000000000e3379b0100000000f007daef034cf007dd8f7ad47813018447559a3c89d936014776645b078fb023dcd7815eaeb11096d30c2d9080e46284f8c0e715a0d17849c7e9c64c87d2790845b32f7b6726aa159c4e1901c1e9a6e910e0d39c55ffc08a7ed7415abdea76870000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d80db5c298db86381df76d8cdfe2431b282adc698800c7a5454b17f1a0b919a32a673a0c89526ac77865b932398d7f7b035d9e6a43dee5c98d95d9bda5c7fc9514f6d1b98cf19723049cb80dbeb742a7aa675117cd68422ed3cca95df86d4047d7d100e5bd6f2749b583fd0896422a5ed372df33c03a8c56aee8f675a512a3022e0701db8edd74711edd59d249917afc29f7db6df33616897fb16ea5d4604608031b6b28e7b3ed67be18366a32565c96fe9b2c389f4000bf80317bc670b1756cb50b03339960d21843fc2fa3c0d0de76e18effe98d380bcd2cbbf53f1d63d13f08652984351abccc47d7c4e08f7f2b7a0285df8ff0158c4b02fc26f8f5ceed38ecd0031efeac909b2ea9746cc1e4fa9a5413f16d6645d69eec2bf0f3e8406d1ddefdb0020430703102ff6ba0a1e7be5bcc6561c0e57d9388631250fc101b052365d71eb602168e8d1a2784b93a25f8d8cadcf3e3e0bf965308eeb02d5f4f894bab1b69dda5032b011876b9cd843acdf85f13f95d64a3eeb379a6947a5bf5ae37e4bf5f677c240208dd5a9b7c96a718e78f3de7b7a5f3c01c4f44de8290c5bd6db8add90b14b7c16d91b4521e29bd2f142fda816e1356b3b431f96293f7848954cb515af15fdf6b0572d8a80f94a4e674aa347abd005f11c66bcbb1fdaeeb70cb2d256f0f857e6809dc79d0e199523ff414b50ea4d85442c2dfd67d62933fe5d860b03e00d9223507b0546e3670aa5935095d156760414707e7f1d36b9dd77888f20d8a13870d87f2bb462791b51dada1b2c555a225e21d0c36750999b23d68a98105566e0b658d4ffb106043fe69ba0ca83f63cfe6d814b366cf16b5d22fee30f02308f848869fce0ab0689dd1e1ae28773abcc019b5e65a7e84be0a213c795bbe0266b2c5a4ee71c0a0cee087f53153deea1b0bc51a88648f55cb87741ada0827f1084e62eb311df432d361309a851626eb2137853d3545d951a97f4b143cfd9963eac2bf5e105c8806599dd7e6f933853dafbc8f63df454228403239e6ef60d495f3d157bf0ffaa1708bcaa284c30cfbcc9d7591b780d60eb6714c8254be34d0565b3becf75ff473444fe7566fe571d4ca2c4222db8083a989b49ee06e0df5d94c5bccec159e4b359f4ddd33ce1284089e205ff4e66776cf6363032aada62dee91dd1391626f026bf415c51a8d4592ef1b7aebb415acc214dc3ab6e3719cf7fd534c90725d866df04f7056467789ad5d850e2ca78ca58aba263c8e08258adf93bcf61b988cbe680364d0a966b01a8fe4fc292b7f45a5b932c432a36bb696106c2789a9048bbe765c9d9c37f416ccfcd5dc8b52b3c2a4f15ae72766d4bf1d6dfb5d7dea69d5bee081fb45b94d4003e4173cc0391a7dad7c6a527de1fb8ca74bf872708f0e05444f9ca8919799d42f7ad0d9d6566726b945ac73d3af91f3e3f820830c871ed3a5d7567e20e1252c227d848d0eb2807919a04c73f6dff09dcf2db8c162e0f030466469f7de9854850ffc153c998c69e0d74583b64c8512e4688a3c80b78faab173b71ce3a0fdb0fc82b20944a63bc53ed92fb680e52a80f11d50743c70b84f336f78335721a34c749de850c9acc5d53ee4f04706ad1bf68bee70287d49abba224c51fc796ff966e709f2256cc9a763bae6acdb19347845b8d3b928aeca44b670a065c92588f832d4c3951b7884f1fc7d06e2325ebaf87423b7e23502d8057574cb55867f034c538a294c41a93f109ea30e145aeb4b7550192b7f28149117288381030dfb31b7c239bae505273e421d13cb8f9e161ffa43b38bc7ad34f47a62c8ef1af64bc54d56445d7d7a32bdf4be3c139c7363e8eff850da39cbca43752385b0601034d93146345d0fc601266fb8a6f2f4213605282576ae80da2d7d60a0a876ffd4faa553388e2d118eaf6ae8830a84cec4fb3e3c3d053bd92a035fa41e53f0b9ad0abdc659fcea0d16889e41cc48d18d9dbe5f3ffadd57d7501c3c164539d47e72995f24a9500e272ce3c8163da1f89fbac231599727b500bf1a225f0b5de53c9a5b2a14ebc38ad3948dbdb5f231193abf3321ad9877b34e241b4d649e97100de3e3befd81a0ffb4ab1dbdee65cd417a6e9d31b47a0ee11f9e2bf45477be20ac50d850e93343272324503a2a24582d2a6daa1aba40e43719d888314c6803365f465791e98774001b49acae16f5fe850b7b5f4285ce8ac2a5c7cfcd0087c0c9d97a3f0b1cb5ba3f64f40ed9af35c97a65935f285d8de062b8c58afbbc3d17bbadb1ab7f5b3343d046e2a5e0ee0dc5e05c56ce7ec200000000000000000000000000ce23af4e031e06bc5f2dc6e14ceae27eae8ad06fad83d00d445a573a1d6e68ff377a06e336a28484422758427b1cc6d02a3c0ac75bd0d5ea8356905f101afdc7a9e86b0b69159ee77f714915ee2b7c33c2c9320efedc9263f34bb7ca81fb1be900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f33398b7cbae0c6453e6c00643e6a3df17faad366c9906a7f1b8a87591dca32c42638ca920892c6776ee84c92562814ef97f704366639d4d205cc431e146d7dfe06a1dfc0e91e1729dac56835afedf01efd57f49ea9be26abd1f8864699e6b61e08e7bd970cae67321bc5cfafde283dff21034323f7154a95e27c76b1b9cc7c30202227384576658fbe6db0af0b0ac374ed6d1aae87c2ac7a9a467da2b55089ef9030fc0836bec4098edb864ac665082dc6eefd386a9893491785191cf060ba127490b07f17c597d850ddcdeb829d57c49c76b97627248f9a9825831aaef51fd1ae9fcbb71c58812c03104b1ca6e2f11ee4e8e8735d785a5e916c49992657f980adb54020fce8412577f70496c673dc3dba0fc5232bf4a31cfd4c86910f8a52b5c86dc04032310da90c11e5db53c96f911adeb59f0234b3ed163467c570e1c916bd7e075d20227f676093b95e608ddb2960656c97565730ed512effac197d3a1232ab3895b90030e8beccaf7bab50cb56c50bd22b75c096f4129f6b8f1f51579ebc7160d90c1de03150c90396a85eefd178ebdefb2a9e4b5c6a734860988c8ea4c212a833f8e656af4ea5d8adfadec68243a3d21f34f8271ee839562781e2b734b509ac3c300da59c3e06e2701406e64dc826c2f2310fe48e4d3687acd278b1746d13a9db19ca37cd783a45a24ee061b3399197747238dcf4067e5386af2f1ebde825034805154c5c6098189365d83c327a0e62865fd99b38ed53f0c083d7d7e8a488d30bc811dab1712fa476bd3de4e205fa599edff7a24de6cf5e2101e8532312f4cf0ae3a30608c33770793031ba8c5d8f9adfbac0ba26729187e11294605b5abd7776c79ecaef9fcc9b4ad5af17991c1a27b541f5c3f5b274dbc0b728b1e161ff199f9ad3feb1ebd8f78cf2f7e3069a20a7a4d646d174d4cd1c624928af639d43d278e4c7f9929a574d13540113bef4667a23ebd785373e7592b4320cd2aec84818334583f7cac062b5c895209a93bdc691a3baf306f919d37c70ebd0c82e06f794bd5331b33b539e0fe79c8c7a2c1fcf639f458751f14bdd09c0772eb949d756a1900bdc9ff22c9c1bf89e12e5207a3b3f50285653ae8ebe8c585d01ad254217f10adff5c8f8c8fe20e8d9c6efb3dc651ae999aa0efeb45d2bc503fdb679c304422a5ceb080555344e8dff71c450eaceb630705b205bfac98b5fb99aae1251f7fb10b8d455d16c2bb59faa7352f5aa881cea425c37088ef69113a378532dc1e7d73aa828c84688cafc10f2b59c3ceff527887be5c2b81add41834abe9e7ce0db873ba45b2787e3b534287370b31878ba35f26b0b2e6a0727f7141f4ccbdf20dd4a2e5544c309fec6a10f025e7c05ee04a7bce0e8ce478690597b973487a6951c26e332daa364e4d4b38333db3925bc575cdf2a4246de8e43e6f17685c9fd01354816eb20c9bba6868d46b9053d83b5dbf08d11d6434a6a6cef6ee1c73f7ce05e212b894a7f65a20762f72ed106a354875ad71ed54523e1311c94b172c703a8c060a1aeef8ca0b27f98c9bd72ebc77faca90a24ae731722225308d292d418ab7fcff4af9f3e08a9ad5e302e8f77436810c0743a9349594846c6495d1430f13a262d79ab574f97895801012160fe99e56e9f1b1ff067422ce994d2b4ad3a253922758356b8c27b605a63c763941de0cdae5d4ca06a27d7f3bcadf9e9987c33fb4785b185bb6213de7fd4fa2582eff4baf9296f184bbb72b88cb7e0e2dd24a5de17fc73ada4bc6e13fe329e7fdd70c13dbf820c632c1024af0b3d94003145afb4b786a330661a7c55d699eef7c949ec7c4d8d9fcba4efe0c0688c24c1ed8687a794d7d0aced71748154477d5ca884a8ce2cedacf3abac6a3a69c0f0639fccf9f42b02b5e352484c6d82c4829fc603e749cf6126d33c2e114518d0facfc1c2b5fdaeef59b59f5945420658bc3f478bef275ce52c25e06b7fe544cb346efc692e35647bab0f4bcd13e56d854ec6281cabbc2dd685316d19522d123e4e9648477ee0013e8544b181985628a5adc32e895e6460ab6f030219c440693add4f587ec74bcfff3fa91eaa7125eaad6e5bdeea88f9abe90f41f581b7ae315c6171441df61e79568598648b8fb45fe5ba28d7f94ea2eefeb6af9b12a9ebce854881f014809ecb4b43e156bb61a3f596daf29e31d49e211a01f4f04f416e2cd1ae97af9d65d64fe6f0f37a2243344333f17b43c5c0f7736ebe6c99c17a4885e496f99f9e92067650ba3b819900c6061a78fd9112a023a71c5ff43d8c355713ed5c412663c75022c2c936f542a24f6f255ab96efc996a099f78f475634763dd79ff3b26ca612d1fd0ce62cf1a650e852fcfe9e13eb37150d60e0f248227c2e41252d36aa9af3b476d2ce159d80b2325f458367e548a08de8c72a93b371280d", "65655151526a6a", 1, -932011162, 0, "93ea30ac925ec9cca5f7195d176ae545fbd35283332ba542d8db57559b035a3c"], + ["9e70f12d03fdc1665240e550bde12afb242b329e8d48f93f6cf8a9c9704f9eb223361903b903000000095100535151656a6a00d4652782bda1b8d80a30255816f290a1d11132c6dd7ac782fd015ec49cebdde143e94d730100000004636a5300ffffffff8cdf9c63bfa36ab9b5689441bb2b773ae4f2c789d9341e3f064f93d61b025e17010000000100ffffffff0214e15800000000000852536353ac53006a060dbe01000000000765656a6565656a0000000003512cb8000000000000000000000000001f84cd34471f1b3acab926c826113b91038c444c8c5e50c5857bd4310af7baa474b84dd869341338489ebab9791fb84bc186343c918a58601f09cb6d2bbf57ee4fb3ab5318dbb2153a9cfd39078a57922262f257791ea24c78246a2114f6c7ae000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d2f9da8b12b5a432514de992452b757db8d9f31359ae8d09003e3f8a4e5e376315faecbff82446aaec7d793dc07e022acd9bd0f0701bc598950a9ef1b7c1b6c3b393222a83af300fd24fc826fcecae8e7180ebb9fa52e521bf0bf167dbdd98af91c10e4c1f2557c7163d4b1941a6e9e915d2dac52be532d8449709dcc6910500217dbd602b703f32cc801695114312ff26423479490c35891b15af13357887cc7020459410165e8b1eaef5446d1d6be9457a01a7242f5a04efbf3d71f295c0544450b063d0f06146058d8b43f7a81ee52a84dd77151570fccaa7d5e6f44613770c66847532106a90d1067995fa3d861d865a8804312a0ec44b47e1450e7c91d4731dc032a9ed1b7bf81b9cf7f472655c372f2d159e6ac718dd7b2ce158a2c8e53c5562b0320a8c23ef0a4a4009286077f5b5ce6a02d71144818b3bbe2d6f8cacb01991aa302058dcdf471bcac7f87ae711765aa5467be98342730705955d977679468d701570310a78b190342c79e7aeda25e0ea58ada678313a7b18583cdcc69cf5e2f0266010230082d306487b0afc9ac811b6610a9549dc3933ff0436f7e5b9e4917ca467504888fce5b2625f6c2d7c2ce15979bff7774541323c4dc8147b85cba7ea5a0e1869ef62b0d5d9993cf0aec76fe285cf7e30659d6a7671fdc27f50bc83f2d7534298c1647e8ccf2117cf638ed683548179d202515a3a9eddc821b121506196c6db3f5fe8ab96de33a70d61c5ff0be62177c4245ebdef847a8082cb768bb76de0b9eff81002ee937b87d95bc92443c4bc284db630864cd16d2364c4f0fbe3d483ba78cbe22a7ae20084686775e2c376b9291ed89f33f5b6f4b41af0f44f7241c1bc250424b0efe7d340f59e5024d9278851bfaf79a8a239725d6af8ba6efacaf534427704ad786f44a43ce140e8b1f050d718f2b1dbcb7035c1eaa67a96d92f69b431b819541c7e6ad5878ebc2c99a88f7520bd8b77d2f6949f1b9f717c369e8894a8fab792aa3b93bbd1b5e03bb74ccbad1a29b8f67650d7fe3e692d8b56cd3db59c232806cf67dd941db906afd53d34b26a18bffd8a08e216bf8f9461bb6eb062c42a9eb5fd07ec7581d07b0105d18c46f261fe42e438800c8b37595c04cc14eedbfff94ee13cdee364e955a9837d7108b3fc6f19e8f26b699d83297ebc67ebcdcb0e69d3cb56ffa370b8963b356b2aeb34e36b9a4cf7dc815cb44457c685b111006748f2802b56cff3b860cfad6bafa591b315d3b2ed2e2c798c84902c58889634a6ce40cc2e0f251744d6f7bd111f34a4a486d7607557794475e392d2d83bb6d9229db1b1003d598609594a409df14713b2afdbc5adbc7c1aabea66a3cbb74c31751adee260517d1ca035043effd5cd8e5e8f58605ca8eb9fdd8a988dc98eb834a7a1006e25242e6b755de3a401634f1403b694ee3692307baaeea71928fbe2afd4881419f7f1eef3a07ffd3ff7cebcb11b5ba70de68d225d05574ad78a91a2f1059213a75eeddf6f90c15a514de89ccd92e006b8707bd6011342716556150f91fe5b775bc852d68fdfeb00ccb306becf844b5c60981523eef61c8158b0c37c51f7d89f83df95fb693bcc0966dad4b579f6829aac686a5bde740a5903040582a4d356700e426694e8ed67bba8b1b28726bb22d72288922d46b64b7b90021bf66b91a65e7675ed8e913a706c8a24ff8a6db96d17a005512da9ebba0da1e7254c8acf50ea0840977a31b452b0e04fd86b13b8b299780893c9353973def67a135abe2d15ef43f303743bd077d9a5c10e00627ea5807e0687c6751f0d95c812b93f2a2f04cd93e201025b36f501d28438065634afeaf222895e822e688adbf4fca6c032a58d1c9a4c4e96e3ace98edbdb38671af1753e550ecdc49ae5b3f1e4cf466251836bc5377d15be78251f7b3381c10b1bcad7367077e6424191ce5a7738ab9d5464104d4239b37ae01b0d257683b3a062a06eb656c594401c41a3ed07aa3407247fcf2ba0bc800e608f5eb2784b33f0087c43e8d0161878089e466f4b87c9221a0dc7b6aad314e9d001ef31d16ac341d09ca7d01f65904672f5c3e29644a280683db79fc59eca3d5ff94dbe096e15348ae1bb626be141168a15732880c59f0ce7d501797183f8cd9f5ad8f59b0288fd39a3ceb97b50d8713e8221db23e6e0b6ebe5876421e94283ca308f13988d9e6bf10439f699bdc85d962709630786375d41d8a6463f653c1b66f3d2a654e478a24b6b16ef170df33a854dee5865b6d1bff2fa962fdaf01fd416f05e09793399d972d00000000000000001d94610500000000d79fc92b92489db5d0948fe7c0626d686c43b4de297dbbc933042b8900ab522e12a4e67801db9f51eac247509623fa6d478c84fb2c84853714a148f5839e8e5431e80509caaa2d4d3484dfff54b4f0f3bba5ecb6fc46e6e9861f331eda603d500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060edce68dec0f4f4d52eb8140522a0e6f47b401ff0637a4828a7b6ba86bc71129c99945e4e6322cc3cbc18af75e2a41ca2d8b1b5f24468f25724d26341bb028750e5ac63c64504524c5c1017560a848b0ec2e911d2d8d993005eed57c05a29476687515ab44df2ba45bd7fc55f57432e341b2530873ddf5836889ecb1ce137d5032021dd5c3708fa210889f312d5da05651b5f9175ceea584844b15d718e09fc7002186845be8a42540677d4bf7a54156876f6aef4ef2fe8e154bb5116948e4fb5780a037cfd316c0b2483745d9dfbe73eca6544f289e2f674648f422de7d922f7f30dc5ca528e73e29771d0f2e6df5f018e08c79985f7ca8079c34d0ba1fd21e7299403186ea57c89d778154641343f121f4a9d88057c84b18b91ab351c0f1d93ce7e6c0303e45f3c584d8fa70efe624cc4e188400fa8c65006f49ca2afddb77cee926fad0200864a63342efc9701aac335aca604a188c08d6e0bbde8f1b118e5714d431edc020c5b0cff7d07ddf658b7f17776a1e40c78c171ef3416d866447c6a1f1d61b700021c7f6cd3f4f19ff4773c1f681a0d47982c94a14ed4f9f025488922b04437b479d76043d9bd4f3ca42713cf4ac3c1d0f052763d942079d60f3e7756e14e629a23f45a76aabf7511cdc57e7e91f20f5d9aa5e6f48b74b6274332799a328fe5043696dba6724d8c11e6107a99def7a2f34a5311436ce8b2faeec35a2c93427493c85f85e1c83d2c7f5eb05eb59d8815af0cc80942951d040b01a457fb247318bd1e2c443135457ced3118a5aae81edc3ec822648bc52be4e1eae41ba5a1e66973a93b970bbaa954cf9bd0f3eb5b3d7a1e6ea8fae0f7e57bde8777f2bd6aba91b92d9be7a3efbe0a3f5eb486b7f6b3bcc5e8d8a7ce81a96d33232155ad7f408ad5ddc0fd4a575e4b7ce67b92a486668ce803637739a2f2a947bc2dc4832ced3df35f3b5a7d5da2f7c421adc0a7635012066bebfa8e62407e719bd6ab7b5e09b7fd34074c63b6ca962658acc60e35b3d9fc61434d09178406cb996043179003dc7a362bba1d056994ad09f0b9b6d50945ff7cf996031b5f0ef9bce82ed83315f3ed511c73df095bf88a06efaaf49740b9dc3bd819fa8ab68806d437c45ff2bed981cadac3424e2ae6030d4af9d9a852dab1a3c9b0cd270e6d576442ac2db407c7e4c8298bee91ee23610dc477a5a04cd0a5afbd25d5de8f1ac91d25926c14e3b15cdcc01bcc5ca059213e9b19e3df95372ad31340093e7ee0047db36221a9d88eba4cd8b660fbefd861031d6e660f77559d45df90fd040d13f98d839d0fb90639d3b0a87634a45d308127443c38964530e916cd1f67adfb8d83326cbf3f7243c8d87eb6b956172eca789245f555bb08c8974ef855432f8be998023c452671ddb7d65d26e85702f25fb8cfe1713503d099c64af1ccd2aba83c0bbe32849178caa41c7ae4234a9721bb1a0cda949927e2562e370d96e2dbf04633481e2739bae045132e16f8c1477dfe7659ce88b228d416fdfd41e834be3a5056992e6175780e98ac489decc31eaabb0bd8524a59266e33e6ad1d25a37992222182fbc02421b14a62ae1dd346bd61ac0bec6f0db8f98bf8ca1430e093eeaea7f182d68078bb925cf61800cf48c0bcc2a0a9c9458f8e36614df1ccb4e44c1c6101edf5d8e679ae72e73b8ee01e4ac5a7696d6a43a8f5f2967533c350a6455c9e9ed2c336db9e0ae0d18568608add7c3046dd055eeb8a02e80789cd2991020cd30e74c0f7a17029d9c05658b1e960758c69fee659ae7c34c37e7f10e37f9c8dc080a373a7bc7cccf34b36106a810a242e079da3dbd80a72812c39179023c368d54f9aa4fe085c787883fecd2b7ad70dbac2af0c4b46122409b902fcf0da62cd3c2d6e6e5c9bee37ef70bb6312ade8abeb8c92fc7f2ef289be5ec2c4652d87e7c1198d59e49b17451c5fe647204c0fbf8fd40833c2d1c48a776c5f394c99d1d73f589545ad88564f6d634c61ba5b6f2fb6772833a009ed8c1d5507c72d21baf6ef23db86a9109a1e83295aea561b77e97efcf14e03480fea05f0c731e6ca611b7fc846960f6204ccede05f86c66339b6ab59cbd6791151b61c20a4c9be72cfde2bfe7497465019b3082dd9406dca8b4869c339c057602ea6713aa2fc52258e191990cebef5704b220e96f743f60e4e78daba8d6060127b5f5e08e2f5de11c5ca5195648ef9c7dd15dcdfd5e957aabb8a0076eb95ac3f5f6aebf4fae7b7190a44ba2d1fd6955afdbc51191c276415380a23480dc4957682707d8255e5b900000000000000003fcb1a0200000000c12ebb8630a8eb4368555e6e08fae2780deddd96e3ac5bb5c19826676ce57c2fcbdd001c24e619282fe64ed3644730d161ad95d2e2dd81f3d69f50778ca79a3f2608e25f61f71ea393d754e6d18e52e09c97eb49d0e62380cd969d935992b6ae000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006768624e7b8bc69fc552ac71715c30b3afc2487397c3d01aa679d4f51c0707d4dc36365b59c72dbf07084fcb1a7c4d634b1d383bbc43e44f380ccaf2fc4d1823dab01f2c99b46524d1bf1bff3ff1e79bb64fe0789a4957dbf29705e23ff78dcb5e5e3a6d255ad7fa38688bd59634cf1c456003f6250c0a41ae4baccff49be15f03243e9c3cb0e21315fccbb053c5e544cedef0174176547e087fe531a120fcecdc020838d7f2241ae6182e1be99eeae42972b12b50e85b25e1431ce05f6d62d802df0a01caa3addcbf7f99531075b4182e0b7b7488e0b5b2b6fb288c5585dcc2a9313ab3a8e4fbfce8428b69b78622ec2002a779a98268fa3a2cdd26665c1d1b20260803081fa75a963723a69896b9af32372b67bf7a78a0e7bbc13222a33e6049e4896203060691335d4f1756c5634c506c534a94b160bd5daaaad21a2076c611bfbc138e0312ae50d420557f76c1b6f8d70369f5bd3609c3fbfd6cc254bdef524394362bf6022f82fc2c730f8f2dfca23d5667d2f9063b550197c8a0a74a5eef5c6efb359c2802305b668c57c8c94bf04ad4385da083eb3fa4b55db8c4a64a1cdffe878ae2e8e6106c164add702397169dcd13eafecd612c371aacf328a5808a904ec8d3d851f1e9121a3a482da0304808b81ba46e3e4711b1e11984df8fd84aaeb4335955d710d7c21b4c95a903529b1c883206f9e46df6e57287b1441af9be2e2d990b904e3572722321b2d75a53bb55ad58f374848a3e684a0159494b673927f8dff0725880f783f55738bb68f48df2a4986037c00894a948abb288c6eeb548aca8b5589272e92cde8195e7dce2117d12f367380a9a5ba8a74d7cb4d8ff16367e5e773fd16da08c2e917bfee30c26024a22552e9a147e97a95af3f9179d85ef76e6614a625427812be9c630466814a91e2971a290d15ea7f4458c133ebe7cb6342e929acbe34176e278325f1cd33cf66d76491dc2c69815cee24ae81d183a156a1119cdd253799b60d5ccdca9e1c9558466307a7a32eabfe7f758a2e6fe240483af5d537317dcd22c9822b8ae2a968ce7e519e8b0b2875461d304a72c39652df4805b16b9e4f1523d91ba97489bf30fbad5ce5112ae09c1744559ed348b641d84ec8749548614de94b655053bf6794437b4aad47f7b2c9e7e970e5c20a6148c9045619e8dbc5bfafd72e5e0de9f00c51319056661713632a0721826f105aa86cfadbf3370f636ee02d5b9028081d97c31e839f8518f708c943caf18b64193bfecc543fd9ba569d243575ddb5900f8a029dc671f2aa13a071347bcffd16687254d4c2bc084e88140c5bbf45467c7f0e2cff1785d7e9a34a5d025360e2ddd4f7de215abfbe36c1b599b53e011bbb46f4682397637553a6e98814f31d06e57c5b7d53cad6d9774396bd042c56b3b5b727aaf560252a78c25d530d6adeb6f788f56b5caccfcdfc07d5485028f9f2e49b0287607889b441dd7230ffe2f81019c813f49f70afa9517a0dcace6b61bd41fc7b7583112fca822b160f75bbf107112364820973f4508900bb844b99fac477804c138a72294f81f4709f8c1b6bf862045ee7c926c375117d98c21f2552df031d143b5def145294e8f4a00ec19d5443556c9ad15368fd5f9603c099999fb6f3cc16de216b855f1d7ee7a1df24688ff9094836d62ace281c0cb606fb2b038e16a18e033b755ee4a95e35970402f1f272bf82531e689aa61c54957af2dcf69c0a477d56b217251ac004a371a604901d4f69cd6ca82bbdc5b5200de46d55bad8adcd31bb0758f9b6cc90a622f9af110086d376504e00deaa0ec5a66aa4d2daf9f20dd26261d695e30de80945f3ae28fd36e332294a84f438613433b8251056112a00e10c4025f43edf060048eab9133934009b7c437fb676c017215899e2e0623e2bb97d6e06d53b28980c5f2a2ca2f4dca27053c02fe636e3b0336b29d4dbb19c95afc0526093363f39d8a536d2f29ef4e2cee662d2358ce87f95420d7a15ac9282155e5a80ada04a51d3bf36a3ea3d00b0ecfc848b051104c1aa2ba1308ab2a2eeee7e6cb140ea9d43e6552b28be070d82aa4b53cc2a4489bd25f0f566a2b874ad8d3266590b7b694f9a911bab905cb0128c63b32549538d11bdd550e7187992a6f4b05130c3e57f787625b18deaca05031c6b261301e511eb2c3b3944cdd9be17bef6d71cf8609b44eac82846f68b6107a6102414c65cebeeabb1556807208c7afa374e2ba3be78a94cf9ba4e5eb886cf146faf2da8b5b6692cdbbb7d51096e4e499457b54d09e96679b2bcd2c63ae7acbe25d51982082a35633bfdb011e82fa86d9fd73e471255e0f1152b75b662f68a6896ca69e781ee9ce5eaf131b1bcef4dc6b5de910b80238b2f8fe2806485f25218428f4b2f00d84cb0c40428c5f70eae4049a54698f1cf16102", "ac", 2, -1620832175, 1537743641, "7ed8b974d506132abfaf276f32a5b957291857bd743ae39d0e63dc402e18c26c"], + ["fde3ee140402730f84162e5fddba3659e356cb47c63187e12cf7f1d12d9f1e23904256ce6b03000000085263525351000052549585ce8aab061224891cdd20951e108dd09e5129dff32dc7a709be30fc3415ade472c7000000000663655165ac5285f2888418a459030b153b689466b3e1ec2f94cf264763fc2bb54d6ea57d37c28e66b67f0300000005ac526a6565ffffffff0b14cb4dc7915830a58036454b3881bf2ea06148ef937d2156d4c3579c05ac320200000004536a63005765732902f293d0010000000004655352acb69e0a000000000005acac51006a0000000001609b2b010000000000000000000000001e3d6614181be67004594b0922b114b2ec0a8d6bd1a14d51540a5522b6c09bf119a895b33169c8b84551a639481a36f6e269b74e1bfdff36ad50ee43815be373a681c5f120b30157a01f6aa1efd05aa00d356171c87b3a9c4de56d8bc65c8dd7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006437824a6e9085af027dab8ee0567f04e77c6cdc30889967837be0523230b26ba171fe7ecd40334b272b3d186c1f00f4f71029b4b812f7992b2c914178885b4690d5c7b16f5db634045b11ab547c221733d66eceeebc13e171fc01d626b285d0844a30dec75215b23f792682dbe450845c52dadf0897a98cae8cb1f72cda1c27022f12c806dfcdb1639973b2e759ffabfac88f663d60f86b724f10ce73dd76d6f40325157e7a3040dd817f100a2e2e9db3ed5aa654526e71156019fb0c22d43a6ab00b00badbdaa55713e9f2d14c10ad32796a16bf3097faade305a60a7613426335765209fa3012ac0b9cbe60a3945e5b297d05c22071f86ff727d2decdb6e47e7cc70204d4983dcab54ceb42343887b618cdec407c14ed74685bb3282230aff6cb9c0f022fbe53db78fa1543fad3ba20424e8fb3360519f23851bd3652f9a2e13e99377702042eb1cdb26c9dcb56b67390d0eca8b40b86446ecc20372651060a525a74ecd6020b8604de3635588926ef73cdced33a3bb133bafb0de514ab9e4dd15a8432bce802026755663905455ffa1688367b5c71805e3a8fef87431bee0cc445cc678d4260a3519ece27a6b2a4d3b223e2d0705c8f49dfc0fd141f430fe7946b5c131f0d2d83dc09ff8c81c27072996d795def73b7a9a5485da352780f7cb5a2bbfa20352e2e7c196b1a21148fa4ded7ab4e638b462ae874bb232632c4f2ed8e296140d74a9e1293df95842a674e1597463c3b47b9e0984b7eb28205758f553abcb1e8381ab1a249f7067618c7827cd720652a96f113ffd2f9dadf880f7c014725740dd31dfa2a8f66612841d596e6a0c4755c5c7f9162f1cf5c3ae759e4efe1f21f7515a1297c0604a45eb65ca1196b5a49626933926509363202e04649a3ad3138a267ea498fef1c1a7d501a9226a9366a66fcf9245d3fbff25c8f7d6e94b3e19df11365b1350d70a87b242e13de8083e7f894aca5ef25992c9723ecc42fbf6426e3984d1cab16d56d2c0e32f572b5af12887666143780f4f328eefab35bb8df4567a5019816129125d7ee1b2eb5bcd676f7234937d024bb9e389b2c07b9aad2e2e4349be2ae96ab994f89b071ea765bb3a2ac45ccf0b06a86205cc45e923f4fd5e40a04c177f4219d843293417a5bde85e3f260f2f8c6a48930a2bb8c587a52abd823f02626ce4151e0e3a0d462caddefc1888c5388af2da2bc3a0168438224d13c87d1cb098656b158794bdc88373f91beed5bcd973dff9346b453c0b8be24ed3ff1c3239f2b37d32bf0c2fd910ed6e21db5538c99ccd43bff9347bc111ea0c854e1041c95b40db2e3200dc2e8b7e02d88ebd04846dbefce45f1e26ef5e8b5f2ffbeb49df7391deb88a3ec5d78b463321ea23a38ec16d204dc5da00bd9659addb36a708f1ae7334ef43a4e5fdf753d4b77bdb4edde19b516bf1284a7aabb191a36af50a53e35063b24fec031253527f86110d56404460bf6f5ed86f785e7f11345c026f694f227259eef9059f87fac5fe9e240411a1d6772d93dd2843a7d0e612f4516e1cfcf6abc71c5758bb04ba9eeb9c196f02f040adae3196f5877da9848ef80ac9dd3d922befc29d8d4ab32e322f4b74f3d9a29d1c1115e8ef3e31798cadebdac323307a639ff20f961e14276aecbcd76733721e36336e386997227a9d28b8a88263bc2990374df1ce25851f37a42e6e6e949c58c43e53a54489f3a3f4a0544bc287350da9390fec2464f66f8812fbce2857c3b71fcde16e4ac93c333c7652d24da3f50f9e6219930047f26be764750ca6d04f467a9964f5e4cb440532b9336693b7a102381fd7a544a77681f599b841d1d6f141b5eb5b73638dee3b4299f1d62968aa512bb039277c53f8df3cbc7444af2930f5ff47d7b926ecef7c31675119b98ad1efcb7c26e4116a6ae0e520726832e3f3253ed7f04d9d08d30eae37abfca46cc3cf9b039762d835c6682507587a3047c3c4c1f66d2f899fb0a8daac16be0cd372e806dfe6dd7b691f162699aa7228879999ffe681ea07db9cbb55c20f5dc0e67a066500abf6f3b264cbc6bc57f571ad6a78a8bea826b8383847cf24dbab241e985f9497ba8037f2061e139279b434bc2ca800dbd724403113ef6c6f9d490b2ea36eb1b139c526624b7878bb2034d634be0f6b5bba7c4ee7189b1caca8b81aa0a469b84160d1a74b8e187c28a532c0dc190c2a1ec2f7712d8d3398dc03a9309ebdb2df16c8d252ad1d7d894b674125fb459bb2bd21e7acdcefb28d23bfdd107bec4bf80399cb8acb148d7c451d9644a351b4795ac21a3e85431c9ee8d006f255c6b3fad59342fcddfc6e194721f865521b97eac2fa27d37eccd12d78c5f8ead1c94efc313e502931263bd32dd1c74b03bf6cb2e37e93c675eda333a6f9b504a56bf7853bb41a684beb7142ed08f7ff202", "6a006a53510051", 2, -483959987, 1537743641, "a9b2a0dedb0b1d4ff7ae9491fce26ef30307bb3f246b5ea79e1ef62d4b9e399d"], + ["4872f0350292399d042bc32193787c6e2a2a11c2e7e2113fa7c6c98362ca450408884863f70100000005526a656aac3807a21e01c4245edf5245acb9c3c3b48c1f8efe63a7a05a811311c471810b7c8983557602000000026365ffffffff028aed760300000000076553005200530054d4d80000000000096500655363536565006835a9aa02da10e102000000000000000000000000a133e45bcb1781bca4355726551e01236372bae534bda9c44c6677e47a1d67bcaacbebbb53a7e1f0518d857211cae16e15288c7ce036cf84c23a4521ce90adde1b4c66244408816ba142b5f15e07ac66b861de702fd501d168dfe1af0e498e38000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004efbb8e9794110d5865bdd92a89181be37327f56b7e7d88a8fdf6cb64bdec3c4d09787f39e6345015b1d90f797ac1e32d723ecc48ceb2366ea0885936bc0e5b470b166fd8e06ffa5e001af039e23eb37bfcf95b08348c34bc645f39609cd7899e34ecf36c0efb8b1112d8d2d0ed7f3f558aad3dd353e2b461452f8bda064fff70200504b32e01b2413f6ad84f49abdaa6cfad8be4279822877e99afd26a144153e0311e49772f6dc579acab730306641060ea00666345059bd2b823d46c7336467ab0b0351618ce1b4b9494328b9ccd3e847363f4d7fc1d83abee7d4bd3d4af0033c0cf6a79772f16daec270b9eead3172383b1eb95c437ed19b9480ceca5d7a88f77c02184b2a201f706f1405dfeb9710158e1cd975847148fb52e9125e1decf2699250021516b3d39437af9e424a06d157913be6270bf993dd199ff2f0426c393853d76d031bf333c0218d4956aaa4de4a0f3dc9e62082d215c7657c8ff29d2b797dc9aeff032b028ee7be73d1df59782ef7ed13d8b0f792fc12ff2f8379c6db5cecfed2e91303025c10608a373ee98decc8346c4f3ed1e80617f46ca6e47a2b2615449917bb9f11e43909235f6ee913bbf50737a32c7fa11828c4a8819a8fb4c5baf1297221e2b32f72cb9c2adb76385f53c327e96bbec7fe5cc1daf41d9d3cbcea1d5e118b45b2444a326e14f6cc251869f4f37911df55de4c4e6ee5506b24c5c9788c047042c323da6f58c7b38ed3183c66a2f22b8bbdb9e494571ee05ce93b6305bdfa248e1dd0ba5c278768dd15f136c7e1e30ab464833d8370f8f74aad42228c2b0d1a3aa2d3981fb154c8e56f31a9ec5cdd9de577054a6de2d8eace70d41fcecfe399655c30ad7f3d9398e580938639119ebd0fb8232c76d83bbd758967a6890da79878ba1d64d445f0920b4adc68265dad5942a184039a755af6d7fcb8c59a840f6f25fc36af383a1411564360d214331d4cfdeea9de9f1295a0bc77cce14cabb686647b912d44339e322de7a28efe399e4dc0bcc2de733e3db6dc757e8d5eb38c36fb0abfc2a9e42c8ef1ea2e2383f2ca3a80555dba312ddc1d2c848acd3fd66ed3c0be0afdf83f22324ac950ab0af1df290d215145e86a53d6f690b8853363c342f6b34ec0bc054dc949a2999d59e310977e386d08d215df4e48d0f716dde1acaf988b1e318f18686304d42d0f62c54fc69f8ff248e321b525bca709651545d7cc07f37a7a2fb0abed4296d045e82d3b14734cbb0625c340e76635630d206aa6d9ae944f163231754cbf08edce4a06db93d52bbbb74ea2b97d91f873af03af6f25204fe515dba93064bd54719f46f43b17d508fddb674593baa03b51fa66aba1cd169ec9f97f6c1f999e247d5095db41e9f61b91e640cb33d60de0cebc93542ddf0b0de1bd487878339b62a6e51e7fa4c79a08f400b6e2fbb9ec6737d903848156dce4e5decdd0f15c00de12c33f5ab78b18223a3818463ae013d0a61c878d9a86bc1031971998fcdc5bdce89cfe6ebb17583e2408d121a945bcb0a15d8ab2d3b9f464ce35504bde8937ed47efdf410d65c097e66b7d5c3b98397587369a119a7b424b9f56c12dd79bfef8d87a18559935c9b5981bd52c340b5fcd80b2939decab4b468ccb192d044a9c33a631896b8a52c4014676d99032bffa8dce97d3dbc899b7c472b173ad8f3d57d8cb4e672705b30b50a0f1bde00493862d84855b2c43bad4cb82308c5b6c0d6aa65b1550b54423e0f252c605b8770684df0644ad4fc78ffed9a45085c75ad3803ef68bb720a2bafcf628b93dd69d57b4cbcd7df7ca3e601053e29e8be180aed7409a4cd19ca40c915b55986ec0c47ab9698a27842be339474fb4ee1b945859492eff907019e43a27aae8118159c220a12ce72d2204e6489eb03639f56c5a6c3e9f8f3faed1c969015d000da5a3be4fd339066717b7ee8cc827242dcdb9e49c7223036f285ec0d1b86e5d579868606a5aae5fcd63d7cfdc5680d0a0a2ccae916832cb565abd29703452693cabc1f6be85957cb4351574330d1306f9c7f2806eef39454db347cd3a4764f91dca2b2d8833d808c8a24ca11c4fc0f1004d9d536ce5d94cab72f1eb7d28ceadb7d5862691e2a29c791ee25d75519e49ec7975862b1fe42a418df7f7e5db44cb4e1d32c1ace6544ff2471a02245d7e7d1f377099b443c56d8a142a50c88adaffcffff6ecfe42340c07297a963f2663edc023492d886f7caffeafdb0963489ab17c6bfc3bee05832f40e92bbcb826e08d5de5736670ac3efc1c3bf828386915c9a853560100000000000000000000000058a4f59859672531e690cd171100fb72aab561b07ba168f7b0f1c30b8d101cd2e744ea3dac5218278371e085060f299b9ee20a982f592e157bee3494a8014ba32a49b3176bc411a04555ca084e54654479a0ce53df78eb1e41c7735a0e46b4a200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000521bccd3fdf1928d0c2b3680619f17e2210bc549e9dfbe5c8e60f664d285b17495c9780509d7ba5bc28b53d0f81a051542b70f3359cdbb2201468dd945acd251bb4a5e0bf72f7685e8d63dc6c361e9b709ce8ffa6b265290c104cfb13fc5433e6d9f1644707ab461a570e4ab658ce399124ebd850a409bcd2415904e5ec90f3e0322eaf2e5c8dcc8833cfc9e81f77b5aa1a48724cabbfcf424845d036561991e84031c74b5917e70130e844ffdf32715f5eedc982c02e65fa486dd91bd5da3ab789a0b065dca42c26c55610713cc4ff859b2aff39852464e8084250a9e1f4feccdc38ea4965a005a1d0f2978a3ee213049a4a10fc792cdd4aef29a9dd12ee36a0fddbc030a801d6c66433358722889684361882caafaa9bcb168df03be3ed350b4f270f3031eda5d237247528ba965854294c0499360656e2467db10740d22a9aa03b8ccb9030fd03fdca76082b314905dd2264f2f99f2b3e212c764a51436e6fd5f72040edc0327fcd08017937f5684d1be7ae336aacbedceac7eb731d3f361073281648df1ec030430b3080f0add10666057d176a4cfb835cdad9bf8088d9177f789af19b2a63ecf53e1068e00da25485443bc3a120ac9f02067e995bdb2920ee165a1c611263d3602a5329e86af65ed8d62bab67684b570b1b57f0bbabeac4201b86a9a32fe1b69efc8629c15d4fcc710783c9185fe310686c74b605b15c1f86237389b6e53c6bb6463c729de6f6a6e30315c828b7839e2f9d1a5ed4ecc9e167b7e653216c7789106db351ca2b67bc680e9a876ae2f9242b6172d1a76b7342e7a5749901f95096616f071241b784249dc9c85fe0b070db01da07d2259d3b237b5b5a7c60099fa6c66311516aeb255e8b16ea9c3ce21b94fe6b23e93cca8f7164c77153170f482844ce443396d8684c1f745a727a986a6d3311bc3efc6410c33726771fe78c39861f2e96305ec256161d1740a45a17d3e3491cbfb99fa09f2a2b70447653df62ec7922d74ef8e345c82f242ed62971a5f44e7e7d61faab0c8f5804f0afacf67102837b0950c7e504e461628934a8ca0310178269a277f3ff89e059f7fa83f124365250d58fbdf3f7a1256676215267e70217335586b77e0a5d8d5952ebb2359af895f1dd7c7725d0b8fe2c83c4af2958314ca1207f659b86d3fe96ebb5790f028ccd02661f65eb382fb7043f28322da3cbbde337d7c17011e2f8d5c6816daec016ffa6db7ea3b56ee47879bf001f0caad9357c4402512ac9460395c6a7516dd1337b4472bbe38738266979904bf3cbf2bd5372e3f96300788b123d163938e6215fb7448937251ff7205bf335f875c99a318cd3872ff1aae594da6a7720015219c849305f673f52e0ac779be7a811884985879af13c8bbfa75a3e44b218c7b832507a3963d1013e069e45f6287722bbce70025f74cc45a67969d0afcb5feaa714019208622759dfb574fd266fc3ed2046b78eb9ad7fb9072ecd69f4eb4a8ec5ddfcc0cd1d94ef9e6b66cc4034a0de3e672cc4ce006d92a621d9d4d8700662ac6263fc8a9b4b1e87b3eeea73b2bac8d57375e69769dc34f9240204933f0ffcd5189151c8941f76f5fb63dd141f962c803cd5c863ed73002dd6d53544e9ae16336fe994822d6346b630190173ce1069472e4b2f086325b438d4cd46318cf218ab6d31ebc136f44b7177b489e1a357b20ca2c0bb3ac3900167dc8675b09a2d80e1b77f875d23c95793eeb0f18cd5ca753cc4f09d6048989c08b82389cb38701537fcdf8075e198dbf2f0ba47b86e459e353c8d540eb6211a48c47d8668f7bb4a59c88fd7e51e6f235897153a84d0cc84352ce39b85e7b66e956c8a34d46d201cf11499263526b814768adc7debeec1237610cae19d1d7c8c9768b95f36d36c4313fa984d3480e23d82863e6ec43d9b23b41a60c05d4dbf427ff8f8dc10c695c8053c61eb2a40a7ff08ca91085ad0a50e6a43d1eff06ec45d5249f6f04a592ceb54e1ec6eda19eda4ac8c4965b488574acdb4b91a2ec4aa2a3c5f856726a4679f07bbfc8ccc71d5f4216b1429bc7eb96819a7cb3a6ced0772723f42b4090adab6f142e0ea8d096c3a60f63b2f7a69ecfe44ab13ca6da1100cbbd2fcbe5fe10a50eee7050de02d00e9c6fe0489a88311c0a9533cee8a67e14d655e1ddabcffd87c15ee4f6551f0e4edf548bc6d4e6cd2d7cb367969c15770b78f5d39173ae31f0cb863d4a8f932025c90d023164a48602f5b92443fe97465e201aaf26565c4d752e077ae5c3debb2e6d105c3446278dae7a2766288d23305586de3f88439dd308d6b0e2fd9a9df74051efddec231f57679e1d9f0b424bb22f77e6eb2a1fd2ee977087c3b5252c614157b16ec1cc1d7314057172f6c7bacc99fa14ab2a6b2175da47408ca661ff917ad55a39aede0ecb41eaf151130a", "006a65acac65", 0, -2122674911, 1537743641, "31026fee894184a8d6e7d2ed23c230a353077ddf507b110c8e07632caa4e59cc"], + ["f0990f1c03782e30e8f8f3cc4d6e09a46554340263de2b11b9fb0f2833a592baa0f10fb0fc02000000080051ac5300acac51b805085b0eb392130a272713a3cb4f3fb1d9e247e0708e652c2dfe00f08ecfed35d99906000000000453ac6aacffffffffc14c20b19a4e1f526931984198490b66d081efb6a97f8e22bb3f5c0d3d9786950100000009006aac6553acac536affffffff029739d0010000000005536300655209eda903000000000000000000020000000000000000c3976d030000000005561c7a8ac64b029002d7ca8d788a8df0d600ee6d2c58782a34c1dc3b662034499c72adb4151b1fc27e02006354f17b295e37c723a5dbf04425fcf5f626fefd82c4482478d4b8436d220cd18cc89e7b09ab5049c504f936457ad30233f5a28a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028022f3329f562e5f52b6bdb0987076eb085a0d8319df0b42a57fc77693e5e48287c8721798295516afed8aea707a101be8790453212078e0f092632176f899dfc2f739e25abe3a46a0d514441208df99e62058af9cb3c38dc8cb1a12cf57c3561d44c9e27110529655b6c58624a84925385f7e146e80b87a4f519a75bc85a1b020bf00506e3e6eb6dd5cca33bd58f8b0d9b6d316550daef8a150e73c56a3f944002217fa4fdf4a75d2da0be42f6fab2a5b3ac3a97e593ae9505c14d705f46859b900b07a506d0e77c68c74f166c43f0053acfbc5f86ccca5b1c50e012d3f3415512322e7c5feda675bfae68cdac7ed4c5a22cf159c6f28722ad62859f5459c6093360021804d0502fd60609fd39d8812345c1a6663a6b637754e9970dea1feac91db9ef031f58b94805e45ddb88f8a9a6aa56e71bb0c5cf6b91499008c558e48a1190733f021d8171ee83ce1e416339f77ae723bf4c98241123a969e131d380348d1d47f63102304066fe798ddd1b5b1d36b3e2798c121e979e3392bc011de20d6337e2c8918b022d7f2d24419007ff2ad5e5678c0f839351d304043317c3aafe1937694559e79ed7e8c7f0629693ca744dc1a1f528dac1137c34c37b87d2a797f30e34d41b391379a5cb87cc47a95dae3c4cae701208c460b7a71fc4d2868ba81dc0c4f09b7ad6eddb4838961dfe5781f71e7b44b82c227907b32d0180e9c140bf733c96c6cbc7446b37be1c886cf405f0c890db8379ce8091190ae9cd7fd3d972462896261fa1067ad85666939a876b5ece69204c19e6839c3ac7e54a5ffb9853bf5dc59179ec7135f718f599a8d70fdcf5cfa4e9213aed3d932e2e75a319458e246b2996062d73592eb8a777283e570ef1b84e4bec39417f24de0f21ed97fbb9f7502bbc8e01d5180b7e26ab7d41fdfe60675adec476b9a114a36dda5d6d311bf35f9bff530881d6feb096ed80a19ddd698daa30540892bbbeb874e79a1993e5b52e502645f28dfe7dfd5698e5f8b11a23b11fcf084655e4026eecdc3f40222030003cbb82759d97d3cad8a387646b8e993ce5da03215fafc869a1c903bb36aeb50475a3b43b12ccb24ceb92e1b26086d965eeb3f5b4ba906a25b6cc4f18fe64179982926d9f02aad8b3fce301a442513317107394f4025a46e14e774412fede14bd7749e964e1c1938a92ad1b2e7f04b8de177a41ec179da85f64675636e6bbe2d768e636f1d338327c90dae7c80bcbdcdba996811e9ba2ed1d2891d7cfe0c8a6cf6c72e27d9476b6e84febe40b8a1d297eee034d2ab8e21a737864ebfe3b7338eae576ad384cfca1515734cc43c452ed06806af5db531ba3d24bce6a90879b6f68d636e68b140f29b9cd81734baedfce8b209047d8f04e63ba7a4705b5d9c1c42a82b6763d5072a97115f05e12ecf21625c9a4cfd66e3972f987c2b069f9188cf6482b2dca242d42e5377cc8006631bef95b3b5e5f44eb3bc2d2c83a86b3830eaca65d18f4467ce607cda286a7d16477eeb8071f2aa329ebd8218cb6a007826d68b1cb28d6e1e0c4ee760b8ae000b0f97bd820dbd93d5056352c18f3c368f0d39fccb8945820fffbbc53f5a39b9959545c0179653f41f644fbab7e4fa60f059043321adab105dbeb4219d4218d247a54a678152d637acb7c8e367dfde56da3038956d9a0d3b1ac9bc5317f2c09b5555163efe7af98b054c2a71a368f3f2e30613e10719f981458edbd1920c17f92e979b287a672e57e2e9f640efd847c22c695cd0e242fa5448af8224e743b6406ff97aaf1442df4784ee2459beea1a1591600f518f823e9890b347a9bef12eb7badea8cbab56d8cab264a2e2c69fe31a13f4b567c6edb3c84627d2e0a99ea3065910d0f2fee77c21b58d4047fd4c2279fd99be5b8a47ae180df3f6633006b6e5296202297da673c1028b19466b7e30cabdde635a90889bdce479043b51e7d35b3fe93f0dfdf39005e8f3ac3fa53073af36a3b9e58ec63be31006ac52fe5773bac3659adc013797fde322d8612e8116af2073d64b74d38b601a7c23027f6315d5438772b04e93ef476a7aa19813fb5cd094a9d37dc9e1acec12f533ddef230f6e48f1a3ef83038f4630c60c4bc5cc844ca902e95d86e71c9ff559b33c06ec80b4269f57c2965786b946f0269498bba770d96d4a8941decac73d11c2154acf15a1d76e9c7bf3146307951fb5a37400577e92d7af85b92abe22428ac47a5c75e00f957736b5bb5b0c81a2a6ad38c86b6093e542f3af1659d7cd1a27eda50d7dc6174c8d3d8e0dd558c7620b6a27a05000000000000000000000000e515cafcdfe74679b718cae4224da101b1024006d6ca724b114a759ba27d35185702656149687dd38bd13cb9558a242b7720ea97d46c64004121183b191cc5c6c2a1f8f0a01efa806e1913bcf1b3df912ffa0493db4a4dc839002473fe7b987800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cc3d347cafb9846bf90a935988d763cb1617f3e115714190ceb5840cc3d28971cca826a4d934817fae5ad5d89e79e523050c6a03daa1ed441cd854620d4ddeef6a93e2acca50d16819fa6a912342301a81b0318072a879a43ff3af7cfda7a783699f2844423dc303118623f0a8dcb28600e296e00185367344974c16e3da0d55021ce8e11ed3f40e19d8a6981162cfc666db8c0c9b0c870e4cb6072159ef9394030215e8687917d87053ba1acdf1905b055e77cba38f5a0ca488f18238c041599b540b01e6c6e034ad630d6d8270a7196090fd9c45855c88b3970e142cf104e03314ab455fa377fb9d2e113b738c99fac38e7fd034aacec4552fca19a112fcc9795954030522099337726ee24ad4ccf101c671110ba4c349ede83c5478da74576a2c4e4f020dcd41004548a53e753186f77de1564c3d7715be71b2ef18b099d7963f49301d030e7e10ba4d99efbf206b865ec90742f4ee07ed26a77fab5718c09b63a37c8e9a02011048d00a6f1161b20e643d81b419942e182feee07dfae1868c07c4b266fc76031822b67a042afeff22dbb66753e07c925c2bb07d8ee7471eb6476657753c4be53acc16413f86c513b6906bc8e5fef6086ba3a6b8aa7c71383f6f255b96c5ad0ded892e6eac8af1ff16c104934e1ca25bad9ab6befa9fbd85bfd8551bf5d0afacd2715b9d1bc3db4bb34ddce5de79ee1eefba07a7f1695e16516aa982df830e5b74d0ea573ffbcca32c61d8dfd65c50f09b66419ab0380477b09cebac9b1dd99025a9ba33c4b6f5bbb637cee7340b2c1dc6530052db80a5c807bdded3d1831813d7c2562e9e284ca3c1ecd64075c34d3dd1b4662e5b2d4d0dfad51aa435b88b9aafa8feed5a62905549e0f41edb7ea716abf09b42a809a6ea10e8fab4edb47042b3c03793fb9903778451a145d07b4a07ce1051a09d374f6d99e5666c4db9338618b67e68eec1de3cd13dc6e95e23a680f743fd731251bbae33cc4dff83525a00bff3fc22c467edfa98728c7e30e199dc2a75f51d943c3345de7cefa120224183361c46d3d8e1e9175558775c1e29f2144f1a7e981d43a1686c9f9ab12b9ac636a605e91ea2dbaaca8f6d210ad8326749bbf1a3cb48a9b9d52ce01e8b63dd7b523df49a0c9e83f0e663cf3f4093117668ea204deb8026292459825000a228a5b05d9b2e66fdccd49795c4915fa4a513a91700797ea899d01ea479925abce7f9db6fdf5d5b28c6613a11c986ac94f4f22e64ab325d367b8f6e9141d6b2f95644b0834ad5a1028dcdcf02e32cf495ae8eceee455439935a8ca0d157787653e7e17aaa8236785996cccd2c9daf24a0da1cc54fbee06591339d921932b1bc01eb31c2cf1a9d7db835539cde1e3567974add69ca274a62adb1b21cd7269e67256c01ea32d70fc1823b4dbc65c7323b327c640b57c455e6b1b68963a46994d2fb54143993647b4fed5d24513de5be9500d0777e008884512cca922a692a56a406166c0e9b6891e630c7ca9f99437dde56cb1d0f06b6447d1bdd780a6e1c5a72bb3d896be73cdad932d25dc438292c935f8874a7d3b9f04ff1299c1991004d98c2f1338cbc502579120a92f141df29341939d5662cc994b3486c951cb9abf28ddb9b88b4850a19f460136311eaf96fb56f08a46998889e08a07909583230adf24c007206a48a5af8d25ef8e6262a75bb30e3220e0f20b42b75cc3990751a4fa52c4efce18154f90abaaa8a31192a760b44571f6f0268db459e927f392a8f6265fd0b2b85eae84e273ae7c466716b5752e6999a3b153651e88b2e799f269937d23a2c624b44531d17a9d7d16a686758cd094ff8f7cf20842bb0bcbee26f3461e1a2cd92972cb0b523eff3a455397ad4ffc1bd97610470051165194444397abb81a126942a1546b87a051d78268debc35e642497a849bcb581cb2944d2e9210c0a29ded86390c98fd08887fa013586ff9f321a82ec19e3c332eb3cf2d7b67efc86ac6db1e4e884b809ebccffed5938390d2b4b057c79105bdd107f2c7ad95b6ebaeba5f4479bf49dd6eaed325d80e80e1719ddc6f7ca221e17ab763349bd3507e67f835ec682e25e16550c3edfa27a92e55fd1e46e93b150bcf6b7d36bc01f8cc60927fa3b6c27d50a5a606391f8ccc87a169b7194a3f4160f4e574157817cc5a36849f9eaf04b349df7402255f185f9d73c82c0e35471852532da5e93db69224e630826b4bacb3f2365b619a84be0e8a2f95cafa203d0293fca081584db63929abfefa57c212d82f91a2a13f5a8fc56638a976187fb765b04ea0665deeae0464f0d1b2216abe66ad46e10639f861fadccc138b50beacd3851692e665129810317c1491ea288cf06c8461f2eacb7c995692450d1f7f9ef091e34626537708d684f28ff9d429f1fbfaf6ebab6f44fbaf1e97cc4a2eadf06", "6565515351ac5165", 0, -1205068358, 0, "bc2bac6591de289c59b6000db54cd45427fd87a20855fa9acdc1f536d3f3af26"], + ["8de6983302ea090b2e59d092c3e451816601845b9e12615f7d97d34fd12d8e2b845b55161f02000000095353656a52536365ac8fbd957781cd98959cfdfbb672d73a766a83ea2b84731d81e19e25fffb85f3e3caae279401000000076a656aac000063ffffffff01374800010000000008ac516551530065650000000000", "52515263", 0, -148245260, 1537743641, "99d4346d2f35912adb3247035176c907862587930b656c051058381b15112c8f"], + ["030000807082c40304406a02b28bf928d8baed23b44bf472741f892f39946e4ce03f2202ed4c742caf010000000463656a6af5895be723bef557582b6256d05cd55b1aef62bd11617b3198b9a674182826e80166c4a8000000000651ac63535253bfd863e550fdd7b90712211e02752ccb0fd3bfb706a61134dfd0ad62d0fd46d6ff5479cb03000000055152516a6affffffffca0781f0d1eadc990afae038303f5e87ffb67141e8e976fb6af38f7e1df57922030000000165ffffffff0444a76700000000000452ac6a528be21404000000000151516f7f0500000000096553acac51ac00525374b4cd010000000004526aac52c5bfde81000000000200000000000000007e2dac0400000000193480a420fe022387e83783ddbe04fea82046495d4560946d5a1ad8c07edc9f3d2a42a549724e26059508a956d08dd38640254b4adfac68b0e87025c653d27070aca492b5d2e7d79598a75f4260e435eecd67f3821be44f9684c08a512d8f9b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009742df9d0f5e2d9005119ba4c3f61f507d6b243ff6fe1ddbccaa1ddf118314635f7a4b9d5a0a975fddac0497c41ec3032fa51bb4de6da0980ebec791cea9983020df597b1c7cadac541518707cbcbc31ebc840936cb9b8bb883c7b8546e5dcaaf45c70cf50291512ea2d97e1d040e28ee5467a632764ab5288fa804c31e5dfb1030051357e23f60ccc5b793a665671a6c5c76041c82406574b51dfd0bb8b488e2b030e3db0dcab1c2c7aef5b4f29525f7a62a3703992e4fecd5dc43b4029051b953e0a0455171a0b7a77db41c177ae316c2e2b4118a05f02aa672d69ec14086af8ea8a418a671f1f9df769a2e666b6573fa31d06a9fed32c0a30c0cf2e2d34ece5b2730311b739b88629e3012a07ad7f59678f3288e1a4dc58dd836f159d8568c76d96f302230a71a533ba1e786838d6fe01ceec897ef429c4763b44acb2a7983c7fcb42780215a2dce5f52fb9108aed3ec04aab3248516491fb68ddd6c825ac38983c99032f022e65198db3c5be31df8566e6cf4d719a9e81a361b25fe090ec272b7c27c56ded031d87bd32a3dd53cf494731b00a46c03c7f7e0c4f3bf7022e3b556d3946736609e7c876dbcd6ea717de902b97b3bba9586c7b3c799355ea0bb0846f25ead7de0718803f7bfe23a1fa9c55db5daf6dfa9b292e781f554d59e8215fe7c13bb717f2ff37056c051e1b764c348d601c0721a1eea1e44b5f6c0b292e6fe94f6a2654c6087690b3ded4cc1a0e50b05e7115073cbefd873cfabc82e12ea3e66a36a93402317974e825d25f3372c4600bfe0348ebdd36be980ec04f79aceec1277801a81bab3dc7569e55e2e255204c8ce6fa42d5ab5bacecb00145d1bcaea1a886c57287358de06be830736acf7557b72083cb443b31799ab53ff92013b54c60b69fe0f94395dcd7fd2fdb52cb7460076c14fcaca08a3fab77ad95bef0961c364aa0e0b693aa7010235c7894408b3e44908b1fda882531ba94bcfd11debb740ae0f99e146af059d280e964baebdaa26081d99d1c1095e09414d27619df2e7627f92b6ecc94358609c94bcdbec989b110bc67f3094137faf0c568b6b2f8038aecdc5b28c90f4a938b77f3bfc2c529fa61312c1bc5da983ae7db8ee8bcfe16de89a983ec33b851caca9dc3ff6919d2291d12b1dfb99cee1b172bf34eb6a3ba6d7d7899d22e1d68fa1a4dc6468d1597b95c3539b4d9498efdf8c19f95dcd68c5b305b7c03b8406d1c63dbb01f44fccb6b05cd2fc01dbd4d43d6501cc1635e039b992dc3a3df290ba099a1e45a5871fc68659957b6876f126ccbfd9aaff7153655d18f140335ea8de2cdec708a2cffcd774c93eb18c9153ceed76ba3b0ac5bacc289de186dd3de741d6d09318d8931d1186d55a8816ec1b1371053792d0b22907147750f39f16c326ef575f7554d79022d92075e302148a52e9219d9907c102333ecc2d864017e7ccc4b6d4b851c9a9ab09c559147aded904817076d0153b286839eaecc1baaea5e22b39670f8e575e8fafa35e5bbd22af7b3e98daa6c907bec49b88468a675c1e8b2f71133f961f50b72e613634de78838e0da8ed73ecc7120a033c25ca0615bc0a6a5664fb4301ec30b53eb5b239db7dcb49ad9d4ceaf409282704595b2fbe72aef37909c67fc465c7ff9b57bf59a11e8496a6139315bb85004481c1a068ceed39bf665ee105489eacdfe2498b88b83a3eb96bdd1ef033ec78b7c380adaa3cc68e85326a7a6b78c484a9a146e4221d4723610db67965965fc963a3c604a5b378cf8977bc8f592f14052638742b111963387d1dbece348cfd7cf1f6b60bf227048848040b6ddcd34289d72328393b7f3c9609e23ad726550097ddbe5045193a6885fec676d40002b1ffe3a6f9c1eb4e8a4e14bc48adb431e0a7866b46795bfa8f5777a11f4059da112945a24673e38aa79a026f5fe97ae343f274ba791c101836928fb7047252b0d3ab529e346d2f9ed508204bf8718ea141042d12633b5a402fd4df3aa6c2e24e05b5dda2724c7eb7fb16d7a278c209af3fed789f1f91b718f2ab60f25465f7fe0533b3a4e42a77fb76e91751de9e78ea08ada20831a79e5cb4b5b0a34e45af05dd15f043cfce607679ac98e159a7d52b9e75d61b9e34ff926c40b3d2d9ad37219e1c101a5e77bbcf258612e8a546cc053a81f7a9171aca64fab1c3613dda44b50aa8d34bc67556e182490f5ef93bb3523f74acbd8a21b253297935079198e9879fb56b15bcb6a1ec2ea27ba21da67ab51fee84007d3c09669627a5b7c3b899f99094317ac4b1b333c5a00000000000000007514cd000000000036e5ac16219452ce30b6c93329c20446d71ce1ca77c9df1446b8369cd156da52152dac6f5c63f170b02f38c3efa592664c54809e4e03f632f6cd920d8a9142f330ce61966c70442ed4508c05e7402a7d04567f4eca8741a05f9ced06a8a6f6270000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070ae4ecb527516ec30886f85eb531a79fd0cfe9bea09feb12009fc45b2732dd1f733eff93b682c5ac61ee94367f81a049b2f74ed416bad32d60eb59f2d961763dc25104f271b9eb9e1f052b95761daab58de008c786b1d29c841144a2614a13f899166a7bee56caa92927778b4023d80c6b3aed95dd34a6053a53e47799e048a021697c7bdc30264d3f501f1cab47900bc76a98258048b5f66b61bc897a8597eec0316945045bd017788d9f3bcbbd392b95942b6890c53d2d9d7a89640049aaa4f180b0512cdd0251ba263adbb57f077b93beaf39e5280f3022d59f4d5dea8973198e75dba4ddc7d8f5d74462b09aeb17519753dbf09f8fa81d8629608f96fcd2f12e4020d65dd8bb539d1d4c105b75f376bba0a61406576ad8350f1fde00e2a3f10aa2f022249a33f9de28a427c8de5461e9d40ae95d3de927404b64938b61c99533ad9770228debbecb970c7e027c2bbe79588c1e03f763883b0f70c51de276b61a1fcd9c80302ba6489b150621ec9ad4e3dc9cbe2126ce368e737b8c3a3bea5a0a7c57f773d022664c1d02dcb594bcc280a37b9134b6626e955dd85febd0f4cb0cd449dc50d800c9d09e3f2ec252b586602a1f2884d16a1b11bd980e62efcd3afe9577e9c830e3d718c00d2e455398b310e226de52922bdb006f1a217aa6e133a45d32eac35eced8e61b7255171e3bd450167108e083a0979cf64fa5485e98c539281b6333ecebef751e1848483ea281086473b38075401bbadcbe1858b40919586b75b050ce69be222241fd0d9254f3a841c55fd5aa7a706a99c515c910b1de4e728a852ab4d9d3e8253e1bde070736043c72218cacf254cf797dac051082df6fc26149fb8cb58e31352a835c2f78017fc53e1849257bdb814740aa5c723fb8c1b6037936cd48ecd748d72ea6683409b862ae49cc2f4ad937b8ce4ceac72bc96686bbc9e58c28cef45f821d33a610e629cffbcbe7acd2873d8892f54725e5e74d03816692f67ca3ac75755f024db990b44fead0a31d0dbf60bf6ff13c276040a09589aab1fb944c29f348f3551f2532fd35b6889c75d30976ed9b03a9ef855350b8ca4e7778994a090894e8a175867f49f6afe2c9f76769321f2689eb6f94b0a76f402e33e3df76dd696662ffe2c3e8cd4c98a29ca73239bc24fefb47080d2fa3fbdc6d6262dfa79a15ce641869be688b28ed9342d4369a98cfa9d1c5fbb9de0fe80808335ea414bb6c3ae0e7cb204ad3cb4789fe0b6730331ffbdc44227fe4984102b81819a436ea2e5505dbb5079d57a2b4a0cbfc77582075d8ffcbabf091d8fb85af6dbc9e6c1d4b4c2b51675e8d4db590286965d4b700ae7610349a800b57ae040e8d7a9e6e83bcebbb55ae2eb14b77574f1e975ccf56be816606a94d3dc7b415a42108f8c674c0d961cb96c45d5a2d77da50e97ee851ef6ad156ee20202890968be461587802055ea308e2de192a17fe481794de41f279d9a0e65101b11fa49b09bd5ef6a4fdea876f49a86c1cd43396945ab42e9f7a9526a24d9d1b6882b9a7b9e76a2e970f316569990c295c1b1dd4a4373426358d64c742281359154ef0e1b5c6bff50d219c22d564f1b354674126443f3014cf0d7f976ca8b97809033de7c7cad96621b3ac69f802e752de74cfe564d65e84d28e64de53558645012a506a4a9f8b78c4ced4fcb1f76350e62b8b616f472cd131f59babf699cef5b0c7e53ebf925feded84711778484d70620c501cc78588fca12e66505f67c988eb1f68bea6a1b68fa366a8974444fc344cf59bf8e26c6ae98a8d6f1f082d18cf9f6a7d89954d0498cf4fbffc1311dd961a11ade6b31ea3ff55711316122c739fb316c3176e59ae5d683daff3bac396630ecf8889f3d66099a6b0dc7301856d42db8d14bc8975e72267f04bf8b00e27fae24fab1f3cdab30627e2a6463e2513cd455037a619e71aa56adc6073c88bba79b48f18c85102c671bf7605242281ba36f4389166d63a3a758644cda74fce7df1f280a20cccdc9fd4eefd4542e83a49205553fae4540ea3ffdabd32c881dd173837a3093453a162ce07dcabbfe9fe6bf7d4ae2ee87d17784252cc36ca30f7c5407f276d2135bf8b6443b68ba8678d590539088267ec83126a4f3f25ee7dba6056ed7b686176ce317be7fea17742c0d81e942438e6d379720559cb2b695dbbf8cc91c14434ab06ee035eea42851385cc3bfe6bed092fffb213a6d181f6c9bdbde029a21be235f4684fbaf5c730674da998c1cc1431ccfaba39d7acbe4a5c360fe6e769b9f6c459590f1df593223744b34d1a21079ab6b713af8cf806f6d5bef6756e7bd51d87dd21a35f8acb23c9230d4453c84e9cd66c5b57cdedbc7680e1ff31cb6221cd4c32b87e6137727ee8b5062c375eae84f03cdccda9c66f88272e7c0ac114f5bbdb695ea6b04", "5153536553", 1, 543070536, 1537743641, "8e13c3e9a0ddb0b40a9b15b428fcda6758ad9ac8d7611b741ccd020f245894e9"], + ["030000807082c403010f9002a6a05a191f58221ead28fbe403ef009641e12ab4fdfb52c46ee7f9185d01000000035363630146a78b04b3b8e205000000000453526a5108f9db0000000000020063a98c08040000000005635200ac52c2809202000000000200000000000000000000030000000000000000d64c62010000000066c31c4b5d019d68387fe10238133e9504f8266ac2de3ba887510a46176743f0fbd28800ffe9a11cfc7da5c648258b05ae27654fbd797a201e6826e859204617b10e528bd95ac1eb2b7fe3bb84c7856af6293ed554f50c3b7dbfd705c80dcec500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f0c23634c4b8647ef29bbad00a389d3338682202c15a00f2c2793f7b0bfd96e226ffc9b07273484ecf2f36ae75a7bc2ff08283cb6e700b43971494ace63b72ee4b8299a613ebbd9180ff6534dbb1df2cf35efa800bbaa93aede41d5407da12568d1102217c7e655ffa4acf5b117e2c3f07c360ee6fb798f0bb32d801d37237470304829455d83ac19f128af9985dd4bc385a54dee9d335ee89bf9dc229955eb3780319f6357a05b21fb799756b22ad58ce6da206ccb055fa8c38b12cce1a0243c34f0a074af783317b6cc6e5bd1658422f6c5ba46c5ff9f7aeb74c30ac85f54f38d6ac3abc6a5bb0c874c3f9bd3217adf39ed718576488175d80a8fbe01d6d9413bb87032f6ac370cbdc4a4b0583560eafb54fc37a59231c2b02643651c863b1408462180226a0cf4105fc1526aabcf7f49e3f053e573738e29efbe2f0f8ce5a3496155f94020de6c1f3ad8eceac3bd1348b295e202fbf90abf0dee79657fb558ef96c720431022eadf7a1bacfac364ee7112203fb0964c6b775da1220880fc1309a132c9de3d3030fb774e42d94b11b886a83cf4f5bfcb58b7012d121a6ae31b20f01efa0056a695a73e7e541e0a2e82acb69e12c92e52bba30b8b928eeb15038b590b488037b04823e78c2c38ccbcad6d4a89083ebaa95098f8bf9f8f15f3d51977eb666ca8ec238ed7745e37a82ce20cfd6f9d88600fed057cfbbeb8573ec5f5896ff57124469dfba706d45024656fe644b1c391a386d45a3b861dd46eedec048712da787dfa5ad01d12dfe9ebd099314c40037faa9baa8e024bacf2b5b2cd0ebf287bbc2373e27c7ad9dc01177aa97bb3a6b81528b62c74fd77152e69b5e379e65607a50aea0518696644848fac74131baa7c1a17cd384e7fefd29a0eebdf0865db0663a72e66e36addfe22f048bf2964d1bd21ace8f409dafab1922fbbcdc5dd765d02e14434a75c696f6108e910224d98f03f207c09a42a1d7f7fd09620963e5e877e0c16c4fde03150e89f952f362c697130c82fe0f22cff8278cfcbddcbe6fb1ec66ed7232c9914fbd18c16ae8fb9c8f39da9ca6a7431fc508693ce8a81aa22b676d80db5ea44d4bb2ca7d78d1c85545ea13b22b0f073eef27466dbc4682cc3bec183b80efcde1b0cf858e7f6673ecb1421e3a22fe429e4f2cf37fa038d32c07b2e55ebabcc6a7733a3ef93c33f4bec3cee44332ecff836c2c0661c4205a9ae1b4aaf4537da0ecb64089c74e01d2349cc0809192c3d2276858f530c8f22c70ac35e33c097411e87c60c3fac8a3fa360ca196a4dd9ba1546e5464336173873241cf34a2f24dfda5797b1639f91c245cc4d91ba87c5fe1948df784d6e8122d5a989751fa7b6375a040ce9da386dbf47baa79bdf339da8cd565549dc1c973194706107de1a27ec46e197616623e5e28eb45bb3708469ab48c501d077d355afc8783b6439e150105350aa188bf5eff1a5f99a820ac3e4335f8e9cd2d40bfe6f947c06a7db1b69f76eb8f466c8dbe822f8d79813e91e4f785a5bf340f8cb7838276f3a32027ed63f06783d3b75f05868c84fd1a6a3e0eb9447a7c0032a61dbd666a0f441b289c0af2b2eb761c2ae4d2f4971bab11ba9bd98731d41bdbfb1ce6a3b93134d01ede1a6916b1851ecd1388a570e10366cb6e0870ffcc8cdacc21ada9ef0b291fc4e4e9d0b0c616e051b75a31a5862f03700ce833e36937631f1e964ee38d47c78183d382dd9fec5a8cb74d723192c501ccb39ceacf42c52d3b28db61f14afa3f7bc3fe1479434dc304ccea4cb527e8822dd1819852dca48d997efe19ca03223b754752818aadb8b59b5b6c2d86353830db769c5d9e18283bf359f1f5bf786ec6e320eb6e63ed5e2185c8cc9987ddd53773a2ebfbfb66832adb33e727e88a3bd79cd61c2bbf715bf03b880a2be9aa2d2aa50396929bd83f03b5050977afa77ee300a977d6b54a090249602dd5a74f9f1ecace80675ba18002ec1d3039f777d3ed429191eaa3725dac9c6331342fbb211ecd2e92268a51348e3c7d05fb5b4a0c8a35c18361603550a2a652bfe1880d886735a1ef1863ee67eb919c8a62cf849b523e54b2c4772b856fba643e0e647e7b1e1c7f53627002d3fb16e4142e431d46b6b69c8e8bbcbb1111078ac986d0ca834c31b520b4f71f511efa42eb2ca95604eb153e7fab5d12b2ce38e9e9511b4827e2bbba6b1ec442b68d230681f3ecda28396d451d6182c233c9617fe98f19afbccd53d2e13b7410e4181fafaf740c2a98966c383fc0399b72fef5e03594b1dd343f29ea546ed3c0af0200000000000000000000000063148878c0b3e87143fbcade61c4f8bd0c4b0a320b2533808e585b70268dcdd8776d66cd1c825fcaea5f4be21e4bda2bd387312ccb82e9cc2a34342c971aff87c20be00cbdc15fb00b2ad13f1bc65ba95d95fdd57d8d9706474546a39dff92c5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e764c4a7c72a4470d63943859a521c56ac68d53bc6ffecfeb800f148a85c19bca0bee5037fe0107340fd115d0901d0627150c62e501718ebb095d26e6b0fd50582460af5a7a0a7e6335c14183e53ba4a60fbb107b14678a8e9b897270a8c26b135265b7a12c091d3daccaa8283bbcfb647daf5d04b0e3bfb7e8a853f63b9aad031045b8643d4207e4d08b87757340c49149b86995c8eb7aed9cfff02c4d4d95fb0323ae624739d7eac157a9b7105481b6fd5f0ff1a3b5ec2195f1dd66d73e53faa10b023e8bd0d67db8e83cba903ef0dc0db1d38c4578cc33e49d22fb59e4c792fc7b4c612ae49576055dd267074d79db1ce9db5369198401671c2c5309bb659329c1031c76cdd2cc9bfc2cb95b5630e6e14dd784ea367372c300545e8df5892453b34f02129d52942fe6ccfeb0208051a988dbfdfed1593b6270760771235b39e0a398b1021297b9f62f35e61f6c5d0df082879abe8807aa86e8f39f55f6d2653d42d06850022874e1e3c46d9df39833b4f82e58ac4afa03f201c74c9135f41a376d0b9d09d5022ad0155a8f139d14244005ef6ea5bf1f8f33ca4d774a4b0635dcf9f77903db44437c8ae0de2131f61a6a06b79d68d64a4480ddb6bf26b532740a8f4390af8f0d48c70601dc1e90e168378197cd6f9987b0be2d4fe52e80178d180675ad17414c2876c61805e85b4bf54ffe8c4d961cbe7a81c87dca37994e068894f2f7e44b08febb06edcd9bc16afbced3aa0ff11b797ea4fa1bd84bf3ffae46393fbcd9f1207fbbd747b5c27ad8f673f9e916e2f6947471fa1393114ef3e8d87c6455a9007d1174919b66ab29d3a715a1f20861657930cde63677b1b878e056eb8339ee6e6874cdc6f1df8acb83dda5f93858983b2806ad34b63897ebe57f7a9bc1aedb7ee9f4623e1b3f4f4aec368f3a2898f343036107c4a9d7351587abc98770aad0c04e52c6c1469f721565962d814bd7b54aaeb4f92ebc663f013d342e25cb2251cea14ff1a94e792bdc59b4ed913113c6cf39e183773fbcf02780528cc7d29436921cb4ae0420b92176b237b31fe9fb04b8f5ccf5dc73c48379e576150d4b387277dab87ccfa88ec2a65bf0f8634920161942fc48d260dc5d7149845f326afec1d084f7aea6abc375c2e3d617eaa5fa840bd41a3cbd4172d52e9921c7daef9cbb1da96c10238b39e156f980fac4c3bcdaea58d11b861982d9f42a379a9397a51d951944be2a8528ce8e05f26081ae9caa6bca34e8783aca28624887d508a861ef83626a0a10158a7af41e02a068d92e603b6d5105428ff9903118d733be5540f95306b9af72c925743423f27cecae64c170725cb99f7081fa6fae0bcf355ad8edf7bc151db66e49402b668b3e791051a99430d34df98e935a81000f3d41705ca35d1f9c3b8612521822a81e51be8cba589e067c0f23a7275fe4ff87c0f67429c5b0195521336beaad35686f4caceffa77ecfb5b9605d9f251e2a8a5c18e4e27551b2548fe8954b9e2f2ef1c0828e0bcc2267ead11c0eba80d9800d4eb089bba226398789caafe5efd893a5d560fbb44dfaa7818a118f0d6f04203d0db98fe4974d5a6205c39c117a2f4f1ffd5011c6b57828ce0c504ece67f02313d23125ab821cf3c0552b6acf81f56ccfe8bf4697a0fdf2317a54681c55eb3ed1bfbb2d053289248ad79dbf2bdc30f565035d10dbe9dd6359a5b76f3eb2cf0895d07e7ab7e631010babd398bee91c9df473ed13f3a3ced27cdaf16ff4259e4c044a751952e57fae2734dfabbc19031011e67e8319acca1fc87da84431b1efb2de1b8bad6adc5035c9226cbac0de621f8d195d3a0c0df3c520821c3c01abe4c128471c6cb2961b759d35be84227d0315253010faae9e89b7674d9475d20be899c0b6d3fc8a7e2409dd56db83f0e03d2e3e9173b52ec74dfc8955c29210acbace3d74db642ff46923ad4cc50cb0aac737523506d9fa2ab01494dc33959487c098ac8cf270a526fcda8c78d0410b5a24b776299c7dc3cb4d51a612ffa84a7c2ccbb5f6dc92e95714ba04d2ff585c51719de1389933497834c7ad8a331a3d7c45514fbd7d67232f9010fc47848aa6647ade0b4b259bf060ae6ef6ca68892fe35da3b598afc876df72c64de42ff457a816217813dea9682c6215593f7d248fc980557bc989cd14ba45b556ab36a713f05379142eb1e964c14a238b08ce29f53e4082424019b06742406f38b6289b7d00bac7f53500448f3551791d4eaa6b174b2ff642af9cda58b8e63d01d2d8c7c03d2341fbe39f6402c54d3436f520000000000000000cb412b04000000002226705b0e632c4c5f1824e081de4cc5fd104c4178e89fd690d060ebc80b289affcb3144c12b78353f02979b5a8c5376b2f9b649195a52311354f00102082252e9f08f2c2152b79fabffa992055de9c221fc7fc4c2f5275fe1c0a53ef899660700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fed3a225530a79ef7105c98a74ac8d6a5dcf9a31152c648326714984e91fac4a39a7d116400aaeb077bf84f2c0af0b245c79f469199968a52c107262dcb02aa47945bb7accd969279d0dd0ed8e791302f68702a22e4473dcd7d6e881082584621d9ee01ccae6f9fd67d6ee315209db1a09f311c715d2d822e513aa23b03dfded02292c2e4f5c7cfa721eec53788ca6714c7300d45211f3b189e0f415d6ff094739021771c68eda55cdfbcf53857ed19e53be6cbe7346a0d97d68bdc7b45d5d6f7df30b0731c39cb9a0c22c1a5ec6f8ae0167565b9be7a2c8424bc5e727f88fb7699ce3ba698fc146e9874536db4ac658a86ea446154112de5533a67d2372d6f76cb697022f610ca2df065460381b944bf751f4598da93835055211c85a8845e8e7b7a3940305338bf2f2a2a7ab609dae87e9b42db9ff46e727d3edbaa09fd8c004964c6d73032cd0a6ba07d867f77cf08a55a34e7bf343b541365683536fe44a86e3961d1230020bf7957ab2dadd6c43307a610905ea669b9c4ea5bf88ed515de6f28ff514e80b030fa7f50501611c19dbe2cc7403a7d3b67285a1ee7f8f659eb0340ae0d227e48d52148680ca9fe4f60ef92b29fb9c74b140e677659db1f8e3fd03b35a33c77de58b6221f414bac6918264bac60a64c1ccb6c018beedaf7ddba0ac465302b2417909154c80094ab1c09ca26eb364fcf6e9af4559f9490f8658318be3a025560d2d959c1c87d59c4e9b05560df56e655c58001b6b7d4a6ab98dee9101a94c1e8de386022fc340129a7df79263755562e7701bc9a8dde2f3e8fe74041f38e88aea1f15827fe3b90b79c889f5ccd2f7a322fef6fe3f4ba6ab13d9644897c78069d938f440310f98429454593a2e34adcb76221f6c6a17204d93412fea2d9680d60272cfb1b886752f44776386bf1958dace356ee6e311da3459f68ac96b6ea0e19795bcf252ea4e3bd4e83203b136b38adbee9a0192b4b819ca85a6a3bd22a676d26bded6775c828b0a4f9b50de0c9a3f1938cba98f8ecc4831f764389588663c8228a0ee1eb5a130d5a95d29aab5e6cf1a86bc39e0d412c777855bc4eb7f2d932defd4d2692317e963ab3f5888370ac2a996bf2fef04cc6367974a9be11288c7516c5d8df8ef1d8242b4735c38c624ce2ccc7dcd51d14a4bf4684e37f17908a7980300b67619184bceae653e0cc7851e769be9f4cde8b468418c30504ab14058a94cf1f9354d4bd2b1680f6ae35fc65df7aed2e97a1a339000d2a47213ab6c1b8c178eca47073ea8ead66cf3b1a322739ca70e1a6c08b4b58e0a18614c3eb18e073808c6cc1de0b6502343a2da0c2f9bfa182850c617b0540b0460a83aae533883530917f9e77f024c815fd6604cde5c5218d09f8697121165097212ccd2da1d4dfdcd4a579b940f264c5c8ceec16d85c02fe0a6d668588bcddf325f1974d3bca89879a8344aca11829742dab922f5a43cc97f68baef6fe96bf576b62a4c23c5ace04b05579dee93f3562806dff79c6f98a61cf7ce762b0f405975321c57af87db510b09ab1dbe9d4fae552e05d84d9a733f55bd3ba0a789ebce22445c4c85f8b18cd9c6f8b7db7a424eb06e628a9277a4318b98ccc9540b3c138383d75e8e8095adb6ac2f7cea005b69758fafed34e6f679a8ba86e4967b1e12ce7dc50473a0f30d4d5d6cae43467c82d1c47ab51dc05f23c2fe26292b2d1b6e11368fbeb76eb7fc20b3b503886bcc71f1c63155ed3b3f8b737a33520b77a82bdfa24400339afd13884cb6e77f8400ae3edec50f9376d3da8a1fa12ce42de6db7b09dbf59217661dd9eb04fe30148e409125ee9378479ce852273a10bc3235ba9bd3029d725c1d79ed547f27dbb28ac572763a9b069fe4553359071112e22b61789226cae29a1fa12df8cb149901a51e4abe0792873c8365f98ff22f225f521660158a1163cff8a8525fbaecbe609f26599dd1910f7452b5be40c9c60022a17d0ce854c7100396c1c5b3aeb3ef48442e774979a2931542e291c833f4bd7b2778df409561496e8e71ebd3d4ff6d8c0c06d373ccc383f0a9d42906b5d4897d4c532301172dab6bcb76b8a973b263f5cdd3fcbe40166e928f798e266ab2b90b7e2ad69f714447c19137b2c6b97ef190d8ff9627a085c8a4bf0681e592893ce4b23725e8a08233a65503da8a3f6a2311fa8efc44e05dd0eafe63bb39fa2f44e64ae32ff5a96a202bd232bac29b72aedc4d640aa106b500b0288db01d9dbb7e372c1b033adba8b96cc68787a7879656d4dc995b7e9b9dc9f9b8d7365031df6d8d87ca5154afa76d38e9dcc60fe60422606f9f6b7c596b092567f6ca1a5350cd2f9a91775a4fbc09a631a40aefb54123cd996b6be934d596020951625d0e444852bb63e5f59b813720b82ae6cb04a2feb95d89cc6476902fcf3cb3e704", "53ac65536a", 0, 2101429094, 1537743641, "cf08a55548ed9cb60fce44f279a9fbe5d5296c18dc142e005cbface218578adb"], + ["030000807082c4030394b977a07f9a5be8a3f72274a56f402beaca1b165c13dec67dee9eab08477c9601000000036a6552ffffffff985fd20d53fcd1c616bea226c03328fa06da36df51465127bc6a7f83a0d48875010000000251530a43af641ac16be6c9c8c6e30f0be6a299746a413a366afa88224fc07a2b0215bcc5dae100000000090051ac530052005353ffffffff02ce37e70400000000016a6834e8040000000003526a6571d2b7de000000000100000000000000007ea4410000000000ad6fec04ba45bb2b1401eb933d9e98a24e33e2d7dabf12b5c8ab973ead214e86eb8604a352c72dda7d9a46c8cfa44ef827bd2732c32d7e35d546da639609c88fb94a1e707b6d7f6627abf65a2979b3e634ec35452d68eb6e7949547d83ddde6e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a1bf5458fc7b2c9a6af1bb05a5e21e4a5c78e8611667eb0dc81e94e801203b10daba153424e31203b194fecb2f4cb87600ac2a5a9f414276b536b31b69af1e419a55d2f226797efeb62742756fe93381fc1a15d42ba4bac8efa49f64122723aaad9f6b7f4404122bca2e3dd979dce0f0356f6178c275dc3df9e5b2d2890495a030ea1fe6f12d2fea586e17a9dc6b81c6718e8d770c999f8943cf5ad25b471428202032cc35bc47d802761e4bf18a8922a301f830c161bf275c2dca3f09832042d7b0b0517f58e75558639873391b1129d09754fef5353263de47629ce6b05a8e015e75ddf6cc032b66b3bd5455520306201e31e47e3224b9d78a3c98ed1bcf75d99170201647a3cd865d46cf437b180811789d3cbf4af31b1cd69bf1a1ef18e7ecdbe0e02172f58ce5af84797080476139b2dbf78e9ca1403ae6daf5438dec11f9b3c3f2f0218e1c5c486f9950db744092c0e1ff104287f630b30f2ff3dec709326c96402e80321858b22fb4fec2b187727ea66979417455e88d5343f06602fd92b263b0eb874020ec71d35c5c109bc969250b1fc1fa7cd972b15a686bbebacb31e7e6c9455c946aec1205c1ce10b50fea6c2b29a183c88daec99fd09d11305733e513bbb88bea974d94059eee9297d7ec01f34817ce38bcb721b276afba04a003bb24ff23a7a2090933901c5914d17c8e6116c3a3463f06c69d6a64ada8b710ea73fb4fa68ebd82ecae22a7fdcdc2dbe03bf4c8d8961b3bccac8d9b20114e79c966d78d4d45cdcd0a2b123cdad210148dd4d8c1408f37d883a3ea11e295ad63269cb6db96e4d83649c30875684b72efd47773f022e2a2b724d62c416961927d58ce6dbf6ab4d679f32248004da039d6a3487bb1847816e7c51281e6262d1443192cba8d48e4170781fecc7221fef39d610af24133e5fd79d7cc657aeb036c0356dcd481757dc60fff75b40a231da92e3f979b9a8d553f1652fd72f1341f2e4b289511b8edd38d5380751e1aa0835691e094fca087480a9f17c77bf080c23760cb44f7d656c854959d8c5e9593929dfd2f82005420f511a84f65b61d69b2a258060d39fa94370a63ffe490f72a778d3fb0a8d4846c718c9f97afaa7a6410cb5f364f300a383922da92539eb9ad7951b07312db417403435afef2e4899c4c0ed87073ddf3588ca518e5a310af05778b80470aa756cd6808aeda59402f730cedee48349087384dd31220b351c6266aa23b3241a5bfc2c088c50d17d3efed515221d1cca424d8a9849fd4d10caa16b12764d04c5de940a1e2b8e6069e01cc63a959c4feaafe31414779c0f8182357c495450abcc71377c130c00b221fe9e3bbca5bce5dd1d5cd25666dfe014174fab8c24b52875ddcd55d81aaf09242cf52daa0bc513fb49ef7e4c23536ad820a48cf054a37c6c1a50f8a733f94536c92955a18543fb4b77968eb7ca81eb1d85c6d586cddbb69bc82f3b6dc5a8971795a7b466d65a4780b95eea4941d89e70df46c270c36422ffa880d0006907ebf203cf2bc23482756c785ae227397a2abb1089b6c35064857ed256976a0203c58e92bffa999bccea5fa30ffa8292565343dbab1e381946a9a6bee3e082ceb0e11e81a8231acd3fc1e4858d1f161ae797c97549fbf4e3b6cd23e23728e5fc9a4b4726be4a5f12c1fc7a99af93a00e183f2bd407955a81c87c753aec5d085c92bf3bde83dd37ddfc99290c4dbc404ac105b84a21884caf2242989bec0a7892887ca8cb79e26ded4eccc9f1df4c8e56e0a2edffd1fd86d50730a0f7e1e22e0fef479b9b924f698b3dfe0abb86e503264bbc1b269596fb18b5531d0d2fc0b074ce7a26c36e56a6c4badb88f824a63fce68e0b26274650ebaf8d5553e09491ff30ea43eda3fd207270308a1a0e35636d9b938fbc706ab08bcf9b3c23e435173984200c6e45c6489d57096adf155bccc85f6f4c5941c6aa72fbe96cec8539e872dbc2dd5181538666b9692df6c53ac7ff5a24fc19b80fe0f67badaea9d72f5d554fb4ee805c85ce860569ede608aadfc6c826c4ed1f57ecb98db1029f70b09fdc27667479b05486097ffa0d34743cd42305f5a8d161ae5db13af2efbbffd53ee89060e9d2831d817c4b6e128efdf14d8167a2f958b3fa12c170df046c6c4a02aefa6e330a4b1cc43e4e6e1d857d1a9dc959fc17b899d32d4472f37b8bf7978a6be212b53beb4b3d05d78db0342385b12571223867667830cdec8a419f619e1c662f2e30d16ffeadf68ce59703655d3125aea246b22afd15e3a14b57ff5a60df3f4086dc339b034b18fbba0a44d164ac8db31c980bfcc1b21c9449d4582a1728c691606cd0a896ddf123d4d55cd25af5455822bee3b81ab06837ababbae8ab9db9649c7c29f4ebeef7be3f542cdce3c06116255a46eb170d5a15edc1998982b4d63e20e", "005200636300536563", 0, 1833328831, 1537743641, "6d35f82e20d616804636a8342ad5a7bb5403a7fee3974dd25e3de9571739046e"], + ["030000807082c40302fa11524d732c7ca6d2f232dbf813a8c2a35955a4e70ef62296866d553f19fd090300000000ffffffff3fa309d0355f72d439b10d1566316c55fdffc4d399ade32caaa9a5a5ff460a680000000004006a5351ffffffff019077de00000000000765ac5265006352000000008db90a4e038168d500000000000000000000000000b2ba6f83a7732dc947d1089bae69ef064a6ee6b0b1b188cd4f36abc57ccae37507735196ce2da562b206f84dc30caa539594347679a6a53a181646424e108cd7d77d14a3a614cbac77619fdd818df7f8e873895d91fb75a1987348b9b8d8ac8f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000acdbb28c2527ca96ec0c099e8fe5c016419590f08152d297208d6bbd395ccbb97846694c62f155cbcb1c56cad8a29b4860edf901998986f2301fb585c9f8370946e1e5757534cac24bc98fc54544c1920bcb9381993591ce945806ad7dcdeb88ac6e96979feec1879f422351b010b8728066d6ffc622736e6116a3d11f2ebd130222c2df815c746f9bdcba0f3b2d3191bd2e7253cc5e30de9352f4587d0398be2a03228ab1197679e12e69876567fa959743c859da65f810d1816e7329dedd3932210a02f46974b3df2e669608a5ac717e1765a9b03de132a4ec0b35dc9565c8ca6f4d1df4482382cbc69dec206843836b39ae1206077741891e1718f640dea49da830020bd5520bf0a28babf1f9793f2c39062f92cc6394d0d29dcb03d871ebe9e087ca02033116b7bb02a823e7e999f48d1dbb8774cab6120ac4bdae86f7e24e9e7cbfff022e714d4d511d1498a07fb75846e249b91203c8ed43e516601374b4c5e3e524730201a351f705246b40a9f35bf9b61297d75f459137f5713db056c2f77cbe4b026f0326225bd45e126133ee7f9ef8e97b5b8e3f8e913a5047a6769b3a096c5830dba92a1dfb29cf3779c4056914d7b536d5ec99d452dcd7d024bc315d16175a20dde409f6d4f73cf3bcdd5b0f9850018e11a547719f1ec4b5e52618d0268853950a41540a79a9194c185b2dfed21193937d013233e2792d6495e378e241e97c2726666b1bd04e9d5205b3717dfa1fbc83f718ca77e3ef3a8c1b3688f18ff17a8c8f69a76675e8a43dd21ff0d9cdd84eb28c32c7dfe422decd140b2cb3ff299c9bae6c0897a389457cc476f3584177a4508d3b869fb02882beb43e56a8d128496605a30cd7255a0c9733b3fc2d8119aac2919af1181f383b5b63d859e17bf66cac579c72bce4f61d18a2334040259441b1b14aabaabaa7f902146baaf9089fcf1e4d742ca3ab178189f28cda86ebb65aa23430ec5b3d412e552fad7e8e3dd56b90873ff7da73e3e8f403d2848988e4583309f7ba0318b51eb63f289e242d4d447f0be6a39436f76886d58ce13a833a54789f076158787e967a8f003924e3bbad6aba5306f6524a212cb5c64ebab0581e9404314deb52fc86165ec100f7ae65899568572cac60989d0b31f4d40208f4cf60cb61817b5e33314ab7c7d9c6bd2647bbfe0036e69a9203185b823076d8f5a03b3bfc75efd486792f4167a3c27bf7afac8ee2d1f674d63247a24ae8d12776e0cf01531a6011d93a877651b81e97ca25bbcac0ef18f0c6a2fd32a43c4eda7f41696cb2b1f895a248d1be306c651532576a834716edcf1b8642a3eb00da40104cf822341a05e5d26cdad3beefa3cc3260990ff8212b82de0d917a2665738b973810eff45cff7da0a0d69e46fc51dd083f928f3c3c96d54b6605e6fe3718f590cb2eb3085bb90c046ddb270810e2dc4a4ba4fbb3ec41f740a3f6055a0a741681b1e044160a6d0fae2d42d96c1dd7fc0a6d9b3cf5023f3707c97bbf1eb5b6966d63485bd2140767c120daa11286b29f8a297d44e16a8a75b5271d5f969ce799f91a4af884a7009a9090d5fa8019e9ea4495a61c05c74c88b9771a3ad100c3a4f31eab1f776194a43d5f1d143e4f4d0eefe79a2fa2cece3c165e10d17a654422c1c66dab701fd60ce2ae39c7fb3a0820be1e5127708281c72c139df555845142cef3962b4e658b4b2e492d2bbfcd0b8a9006c5a389aecc092278b217ab924f98e51e6c9a65028547bbbfcb5570ac2a3705b4e133979d010a4248aafa2003dbcab420bf2b721a53e46229c86e2d7e6404d71518aec01c8638d0e72dd45957e39f006f4103cd4d3007b35bcdd73d6b9f77ff4f046d4897b17337bc31c960e9cbb50125431cb01ca01d1826075e18b131c83f0941837beecbfd72aa87b81af737ead74cd29b583fcd8110520c2c8360ef29ce0718ebfe865ae2ba5871cf68ce5955a2b980c14bb907d728cdc3eb9cda9fe7f274a12077275e4c6c842c6de6422366d5a0a69313c07d61fbda2f81d5e7d2827db503f711ba8f6bdffa095971ce7c4455e1267e919daaf26bd767c5b25a3b2f7c7b6e449f343edfdb91e8e3ecfe9493ec215bf311f38a6f865c87f783f68255b98c09af1815037735118784d8ea29da83ac51dc712ed1fee78e46fe6bf65024ea3a37b6e9473f69238be6bc5cb963a29a731fd3f5501db43b7c7a62f5dfe3f6f806b69a7187d77fc8982d92fb2cd92fecd3d0ae05469b77a19224ca0bc5402eb104333228ef4bdd8eb017894e4f8d714d9e91458687cf0000000000000000c49e8f0200000000cdf42c02c809db67d2b3b3b66467cb6b6fab21c9b3a58e4285025f2fd44b7068a225a8f52bf22302e564ef308980791c078647867800fff9ffe4e613fc194ab5a780f982a03f1711d6fb1445958c11bfafd2349d418acdc4aa92ca2fdd3438350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000092b99af1561dfa145a240280eeacb1bb18e1736f9889c622bd0e949fc6fddd42d3d54504bae0085d1efda910ce1c6fa40242b97ea21c9a21cd156d384d8c18f813b2b1c70849d400a5484bcf164de554d9fee480fe2706f9498755ebac8cc4b82c76949159fabfcdecc5c1e9bbdb16e55269cbbbb5233547fc78d07ca3ae89c103231eb7f0ea452615faf02f7a19fd337ff851a77b1060561058cea83f6175100c032f998d734666fd2b5335bace06e544fd60d2e50063c430651760ff761abb445b0b021c921fb5da1356a6416089a82d5a33a864cf58dbe5885e4d0a29efb3b43a10031e53916f91355455ccd7a340ace90ed749f663933cbc4f84bbe8837ad66233022a1d63a274e41ad3f8fb57ee0430b7a0cacb3af51c2575eff68c5528e7c91cc1032b7befab6129c936e1b67b4e5ffb1776c90a59f0f4af69ddd4447c3885c79e88020359cebdc949d2e20103dbff461e968db7980207e87c9664ddea07a5efe8a744020f4b778b2e75c6bdf5713e8d919088f90f74fc657831a71faa8b147c4020a6bb03152a9daea29c7bdc793215cfb4116f4fa61506be3b3e3a470b47fbbb4bf0c831d769037543a2ecd45fce1cb9f143f0f8b4ac064035e955b2559b04152186ac396de8fc3090cbdec34822566e5eecbf4749c5463234e4d0db822c598e0d6857d697fb26ec6a3b61fcba8db089e97a7ee421f1fc1c233cc840d56d950a81e9edb732eea1bece114133ae754e7f4e7fa36d724f5ebbc76ad3e730f159cdabd4b2b0e2ca236b357fd6a367b2eb66d5e9eb010f890ed130f9acde40569dca933d0870f9718a40312e88fcbd532f3f53df0a27f7c82e743f6548146a53db52ba8593d8614864fe27ca3d50fd23c78fa8309497be76f031cab2b8a8d093011e0c7718a5c7d3100d8207d6f73fac918b6be21750457e65ead5eb82dbd6790cb4ef155c6d47b4e675c617b8fbb27bff4aab67c1bb1c5309d50573799d825551ce509816c121be83c6d756da2155ee08cd83c6f3036ec3b35848d08ec8c70bdc9b938309e98a6ea07883346198030a64de8699162ef614a55fbfc0fdbef934e59f36586b5c9bcf03c73f6b554899738c722bf9dc6a5e898499c7e5a5ad2bc5d3d15a1d545076053248f220fe33beac2b6e0d7a6371d45854e4572caf7a77bccf66b6469d07df5ebe28088ba95c564dc40f3bb814713113690e842400eca129a4638eb6108920dd6de31b264491f1add87ad6abfcb83e51d562481730d2e4a86e7f5b6d19e22a36acd4642ea46196ffee8f05b6e4d1377dfe7df6ee6352521f0a778c64a32876d32e7e43cd0ccce9183727e44367a148dbedda94fca3e0a192e98e45a13df73297c17606067eb23fa04a7c6a17a9ba689bb7a3def8f9428dd58f1b8adf35620772887b47d70301dd02643b350820fa2ba3771639e9c126b351d6e1d68d3d76154b37f889bf3ed9ff2082842cd7ae90465d4d1ab48d9bae2339a756154c48aae8703a3df28893f1982003c04807cc9c20b90d50b0d39cb9b957f2faa9d407dabe3b436b0394f8801d5f81948cbef6646cd5cbe1dd8442ce8f4e8246a5b9dcd0a60ebb8a4b8256a846fa6689c64d5f0a7a689ee3695582e729da684649adb0c21766b6929b9db3ffe5bb29014c3df0e2d2968ab0de7dea24330ef3da2b8c1b90d75367ce8219c3a59f2b8f6ebd0341cf5dfe0960512bbfcf069b8b875646b63e5914134e5628e07cfe162e7c9ae10602559a10f09afd2749f56914281a4ccc6988743254960eaa446cccd4dfad6da35b24a03659220c39fa9ffc3d91d779077119dfadbbfd03bcd20ad51f9effd187f2d009024baa354b79b36231efe118310a20bf6b545baccac1d010e3dcdfe17c41a847885771edd1fb79214b5c74fe37b1d8dfca46dbb05284422bdc5fcfc0537e816bed308b44cc21529d655331bc3795c4dbb333ac86bb67b2d571589a6139003614078a0b869077c323be9869685b06be296dc0bd5ae2caa8e6a457fb996e48728322eef159a5d10c6451e14ccaea574502860209d1adef0ad35a2943382f31cb3d9b9d9b74877494c915f0605d8298541727e8dd49c651dc4cb3336ea931545c06f88ec9c2204b93e76b8e55da846fae3333aff2b19e40ab7e664781f2d32b8761de1def918aa6e9cfb1ee728102a00fc7b0a724996f017ae589c01f99c1929d1711c6933ba4d1538562b15164b6a732e54bc3e7b79be249dd6a92d99148915d2863af2f86b9012dda39424a849940cb6b6faa6784d66675a13c99448acc17c4b200000000000000000b7f250000000000f16a0500c6f01110b52181ddaefae9108ee700d38f73e3bb6295d279837b4bfce75c7bc6a6dd1fc64552eb2e2a2a2be04984b94847515b6ba4a34b4f8cebea3145e63d8ba8f373d3ed8fdf456728f517ec2bb4ba151c3337915c24b364dec5bc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e717c6abced26d18bdc22910568ddb2b8c08e6cf552a5bd90e2a8f3f6d7e78cf4ba369190a17345cbffae43f9ca61974679dd665219da8e120efffe687fbcb1df5fd39ddbf5709eaf2d96d322afc2e58300c6ef7055d6eee8db6f5428245e17d9934eb7db212968f6732053108b12180b6ea7200052b2f2078448c04eafec895032fa9b95557345015ffdacfffa4811d4e355680ff7cdd0abe7d6b46f648f86a720316a65a48b5254e06d8b383065648ecea9d16a88d5335f5b186d02ec636f8b3f30b00304f8a5c8f55e31a5b25a02749b512cbe68e50c06a164530a7cea78eeb996e349528f04dc800021f9c26ed6d4fb669c21349c4ab57acb703ec734a96fb9f8602010f02f7a343367c3c691b5c89d2bd417394b11a99ca9a713c2380374e8310400304ecc91e0552f25cd30f3a3bfb032fcd8a0228975f862956267ce83547110da60213f9fab25f64388bae0af4627ff79a7c58c1e30497d405602e30d71e0f64327a031df971ce255bcacf2d3401a4bbc628bff2e02f37d571530fc5590d5f5ad0811e022551f348ff7217431f76aaab768a8f3721371aec003a12087d26f05b56af891f9dc0ec6ea5ce8c17d6a75587dbee816e066936eefbea1d7a0a48c3b71180bacd03deed4209c7fe28a56497c82072f3a9f17b9d2c64fa472d9da39b2872a33b3ab8b4e353408a94aaa2003bc81e791d11fb9f676576781f9f3fb5f902d38723f4f4cc77e48658ef6fb02fe5f8ea1a42c68cd9d430d7a4f489f2047375eb0a6a3ac2e4e812f8345959d09b91c16738edc96552755462d26df9f8ef51b16c116fa2e6ec5d32e80a936cf25652200eba7d92d8defb573bb5f1209464eebd2305759a5623de1e3a1a692b1b7a6fcdf070e10cf546bcffb726523eff043d8eb667389a0257b8288a233a62e757e32672c925f47ce72b7b0706537f522823be97762ed70f055545a93944b17c27c73ae339dca5ef6d2a2d9f9205ebd9577165a7f52827a8777e425e2f844f7f0a06187be448b89f95149a2221b1a3aeca378150881a9cce74d59667488aeba2259d56e750c451601d1677a8964046906ef169cd5b61622b4a4ce779ad27604f6461a7bbf9cbc2259ae5a96be39653449460e0d130fe2dbfc3a5d449423563ea68915e2d6436e8c510481c3ae5c2498460fb44be7e0dcbb64f64e27ad0b5f0e0f48270fe7d1d91bb0e9042e8a3949acd7fe5157451efa8d8ead3e0fe11e18bb3801def17063f57975fc352cd347c6b88036deee046fa9e76f796e43dd11a213e18bb35ce8707c34de14fff38e38d5353eeb70b9af0d8a971a14f5920e0ecf0095dede7036ee6576e12e6baa20351c196d9b96e456d289e187224ebcc633d767e899981e6bdf98d01075085397d5d11095eedf55fcd8bd3e42e86b5836acf5709b04bd9b9cbb5b6508a8a7f1e92b38437f0136e97110aa9ae79a706af224e8d7b9817ccf1037c7e9ec05789300a813daa3b1f5de53631c88d08cf126eed92958a8b4ed75de718df6bc07ef78fdb6e5f3a953a3e2c8f5d6f3df24aaa6a32c253cf4666abf56ae73a549f6934c4b56a7f6e2b7a485d29673f0435eee1588abca986255f613c754d645d79b25533c8226c0290ab8038916e53803f0956d7a352ab3f6f2c61f1ca859795cc492213a1b9f67a0b939edf8803515e8c60fcb60674135db99f2adb4df08c5246c0fa021fb3392a568ad98909e9493a4229895b16818c655f4b8ee54cd83accdb9ea3c10f15b79e316a14129f949dcf7d02179f9a83aaa749deae9d632f932a3d0cd74afe2b8a7b76f3018418c993dc265adcf5eb5ca457fb841f741c204a31cb0fffc71f0cbc2c83bebf24d15ea21be293c93fdf57be4372d91cea092564fba3ff8fd1370e6b5c458c4535b325e566f3cc2d72058b9bd33d3309ea337c05b3d4c0ce1744c20739a1102f830e45a566dc9c67ecf9d766b2dad77f64aa3024066c5730f56bf848102c137247d8b69e887e00f7bf2bdff6e480e85c3867b1e5d0b55a08c1b4f0da5ceb75e1c2b680b4c2c2f23a4670ed463169d4377472a72e5c7e4804096ddc95b88cd66547e5a1b62422dc1c5bd178c59404141c6e1d6642ee05be560460fd944c36d8d5b7486cceadc3f0b786f4d7ce47724ae61c0e7bf65bd859c10313ee19cdc63cd0d46421f37c148564ed873b94a961941719865fff7e495f015343567e23cf9436aea7b8e4243717403b01897534ac31ccd75c678d50426d48991bcb27f90163a66541230a291264da362a0987be9af5e9ebafa3b4a223a03ce4cfb24016439e26b5ab386822541294aca213db7c9f17b63ce12813e278e53f8e49317967020e34bd8aa74a1498cc35f7075c405bbd7ae13010057435f938563d7a4b0e35985311aa7590362894e4a667e09cb2f385a9d8fb74e0494504", "", 1, 1886359030, 1537743641, "2d20c38a2552e35d12eeb298fda3bdba89b1e793c99215c30a6dd303ec3261b5"], + ["f566496402fe251b9775f857d2040f4c57f294cf40bac7b49ddcf7f5618b9c6af9d975b38c0000000002656aa521991825ec32efb2f330dd48f04ce82962cc707bfa6cb38aeeec36449d66fb4bc09b180000000000ffffffff018870c8030000000003656a003d72c17e0100000000000000006a12a101000000007de230da59b0ffd931db5de30dd5b6054d0ece4794d00753c58598be37451400e5b25e6a84ae72fe92c207f006bfcd23a0350e0625240673514409f82b5e17bcd526f032d299ef7f87c468de8db54a4f937c266fd5f83cabad9a6acd0b27617b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000208acb1c91d5b8cbf6e10292efa0437e8ee4b7f6a6f2272ab86858ef2fe54a253436e9fd650130fee0e5f3e40d77d3d6ae1861a46499fcf4b35e3e1b89459c8d2f828eec5e2258f43d0644ab1e973ea6a8aff25d4ffe2d89f0b90fa6a90d099f594216d53cf814c60ef0173b55efbc2f2c12fcd6d28bbbae7ec886f8139b5a210213734f57dbc180bd073482eeaf68ca0d41c8f243ad7b100f25b12ffb1afbeeab030b744e46cb1546f2d30993ae6d441ef7397a15a460b5dbcecba13b2c3ef3cecc0b037ede8d18c2cd16816559a9b9c75e80289baa7256927d90e708f72db79caa939f4feec3c07ae58ff910d9baaf2edee564e674cf4fa49d6eb174aca63e394e510304ffed07fbc422c9200a86461f89950d9d8e20d508a8d49b52d0bd04e983e25a032dcfd56241a3fbb7698e22776eda0515c60febce53e3546e81f76d2f23ad2e36031910dad0c4a041d7aed4c10df364dc85b40b0877ed1cc98c4b82c97163be3e54032bb9e5d94f3e262d743060d33c9fdb08dde35da22313c7973207df5dc4e9ee37031da0f75460d8d9a1e3412ee72b8558057f3ad4d512052948cbd5434d31b0dacd2adbe2114a96e397e633a39393f248f0fc22682cd089bbd40a71900763432238f98043af936ecc92afaa7cb282e2be67319e6193b432df011a698b697331b50a5dc0d9622a2288ee1218c45c9ce80d3e909b137af9da73b34fab0a612e8703e9dd8be7f0f83768f14bacb3e64a284be94615efa29ddf09ff33f8e953363d8ed9e8d2e4aff2fe2ce5a4290fa8342e9137698bd830a4f435604bb8e2e46800b2697786d9a6a46db60716dd8a7ec2c43ec9f5a79b815a0ba7b4a12eeb78dfac962b2be6505534579d882435e7c8eb4d63e29f57b969a16c2d654e1f3eef6c487d30e6fc1c846657fd8979d596e40dfe993a2aa6877983140060e3a3828c0a9ef8c84ad7b0c0db8bbdfbca8fed0bea90c0b549b24ee9400becb6dc0dc00e4ed9d047e5eaaf99f6cab6921ae8f6bcbf7b227e235419b25fc72e139e3a6f6517c86fac35db1b0400a4819f77ee22422a1f1f0e7bc74daa7866daf55bf7fc829456dfb24f5ce571e840ea18f083808b6c6bd286277f0425f03e1e7eaed657606182108e8ccc71932db74806c2414ddd76f9920c3775d7e4a5daad59bb7b2dc0fca227f0564b694c9339c27df309e62446ec62c10dcc74c1d0b7212c1387054b9250dc889bcb358edf015d93ffb821895ebee86ff15f5cb5ff87c9fcfb2280585fd5e39a4554ec1dfe8946a1fa5cb4518adfb079dc032653f7c7660929c9c5cd03ce1b723139e5fb54f3610f048a7556830838db2b45bf46e3d00ca566326b5062b81f81cb0316241430672cdca11870967213e3ca69db14842c79758973fbcd9e30e894c980214c27645b060a6b89d441c08b680c36fbea083b51a4d24a23b90cba03575db180c070f1f95ba7992ce83d665fbf59fd04772ec87b02010dc619d00aad903043abdc2750b01ffcfcf22b384c99fa678c7680b2c41929df93ac5c2a960504f1c029245ad63efa8fae999a2ae30bc412e653dd2c3f1bff8b631f443dabac929e820521cc571a01518db186c5bf7f0caf8f2be454f068c733d511fd592a1b6237243477ed68a8e1dbf52b49d5d5a90dc466e2ea8f3e5bc82d867948b24c46ddec98e34d9682c1b37be5c75b512d928c2849e64d618d43bb70777d7511269a4e5361eb12dd3ffe2f7626240af925c6cc6af4926d0349ad9b46cd03f3632c0006c7afd79e0cdbd4edcde1dcc75e0d6af6555ab94eaf95a3cd277d2313cb574aebbb5b594e43545d50db4de643b40047bc6aabb51218a9a84a5185b7e5047749ec100fd24613b0e6778702e3ab21439cfb41dbbfd448aa9dde881c8b0d05f796471d02be16111f33bca4b0ef516025f34e11ad00ba331b7fb6e120eb9016e799b09acdb19e21180b3bf46c6b22c185c917b3e10e22cd3ef5eeb42aa5d58bb52322d63d71d10b82246ce74cf5a8f4415ef69a0790b11255893ed862b2d85e2ae593d0066cbd91366d1810dd9a375c4265a7adee7bb5efa636e3eb561c32d171d8c1d139260a300b89e5c0594e5979238ca558cfe2ce7d17c7a1c5230352500d8bafdd354f62b58b9a2c574ba9d568311855f8c4b12a245266653a6e189a8683f1e45298e6bc3949b705dd28f13427127a62d50dab2a75f18105c5a5a3ed501ac50a61add467bcf33185975db725c4836f5db72ee53562790f0369facd043c8b5b07433fa12b7d18aa44e9a32c65c06f5960580b35c7810c2cb2791faac59eb0d5cce31a9cdbc1844d9ae0e163f9ce20ef839c6f3f99692e51d1ccbfcc2664274bb09beac18896b19f48fe9cd8c517b5f1eedfb9af490f2570eb6c5f015308a61e451ecbabc54f03d1b94d4abac0fe9dffbdab0b", "5153635163516a6500", 0, -1865180023, 0, "79aa494b3ed345a3a3f229d19722a98b17f0076ab81defd95ab15933122f4438"], + ["030000807082c40302c0b94b1f39fb256985a3943ed5a29d1154227f06962b55020006247b210e5ddd020000000951ac65006300ac53538db7bd87c0c049082eb28e0a1ce97d779cec1ae6b486b54be5c4bfe3524053eb2df8ad09010000000100ffffffff03a847d8010000000002ac516d91d20100000000050051516a000d8ee90100000000076a006365656a52000000000000000003000000000000000025f2f503000000008e982e50a060a3577d26dce6c3a2bc9bc2944ad18e71c3b2d9bc7fa620597ccab50b4fe9584daf38dfff66d02ac03dc5c99ab8a31a80c503ce01c67725ab913786a8815a85a99be577736194904e58f109055b6890d277c8124dd7a8038d37ef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f9c1685e1713eaef34ec23d258bb529eb8b9b53edb7c14436130d5c809b7c69e452a166d10921098a1adf269a2927e01ece07144268a9879a8673e4f1b6722b50a11e0ba753912a0c07ff2420171e6842525ebb2e475910bdc4ccda8e4cd441056661a1d2c31ab0c690074fcb2ee47864989aee4973ba7a762c3dbb0cacd0510322df49db87a1a59c49c6d686a1274f30432d00179d970822d5508fee50ace18d020b34038c280cf6f801d243fd6b1e8a1f9eabd64dfea60f428b828760c14d90920b0626d2924b8ee33a975f876cd80ba48f21d15e6bb0f46ed338284b7ec6e707c52e92abaa0792f43d42c8f8ef04ec1e8af2da6478008edbbe62c19b7d1b0c92cf033026fef2d82eea5597e186800aa2c3b936eb007d91d45031c775c7a6b3d61b2e031ffc76f05277a790b8d0506f845e1b4fd1b0a20bc4b56066cb6e3dfefa9ce62a021ffccf5edb3350c750af28feb8147610b39ea78d0df5e88ef41999b35322559b03210546ea14e85435329944232f8825ae7bbcb5ffb6c7d89e33e510153a01f1ea021f3a8cda2eabe9a596225c428b408bcee2853fff8b8fbe624ea2145a47703eee23a00dc8434cfa918e8fbb9372b9c144be8975ed2232fc6e7ba34ca9bc0b6bafcf46100df0df2d15cedaf6c2893f476cbd92fb8dfd51ddceab36c75d29cf86d8f00c3ef6b2204be2a5a998fafc974c68191ee0d98fe4681403b26bf480e8066fc530646e549c55b849dd934c79f4842dd698d4fc3d577c0106544bd4af30af6389d5ec0cc7bf60f8171652a97a9526481a6df10fd07478a8ab069ea89cc07788eec4de3b4bafcdfba2309fedc110f2bcd5272d87e1b9364b8813ac0055a3a638fb67cd1ee4e554aedb7d9ca517dd001320fe0a04668cc977081eae108a5d2253a3fdc0bd22327d06a038ec71e725ce79f52126cf3cdd6f1bfc1ab5861fa36ab6b1441a35eebb687870dbd276fb74dd1410e71505b6ccd8e1caacdc747fdf8bd5fe17dbac2085272066de0d3dce95fe26c99c7906ec3c386d8a9dda053c5d56a682998f5deb2432c3682eb2fffbcac16b014e00cbb6110bf6c9f4e5dcad5684e224a6faf99a7d32167afb8b3ac183027b1073aab8becfea4df6750052de5dad66102d4c609fc617d3e7a15b34b2ea0ed0c933cf4c651a107d3972c6fc51e691a897eb08c978ff4ac5186bc8df6b82f1af3dd8892e9f901e1db095d7b7bf3c085acb1875cf1bd3a557276a8d4493fe3e496668aeb6ff0c557f2b6020abc79ac0836ee6bbbeaa4695dcff6cc74bf705c6029f16ff9cf3812b0dda31fc4472f6763175185c3b930442468f7ed87881ad3867bbe53aace2b7f6c29acd905ba7fa44ad705118af373ffd9bfc79eb2a17ef9c7bc96d0d2c462cb33fa9b2394e58b7a205952dfae49d47a351fa00248c4d311e162b117a722d3cc229af7bcb5df4f0c1588a165b089b08f8d4dcbc968869c6d6e09ef30634b7dadefb155d02c2c4e736d150c4c629b09f50ad19026f9db7e2d5fbcc118d80d5e796b100735bfb250f9ee5b0c402b82d2ea81cbc55096bff674c2d8b0dd0a89cd913e549835092b3ccd7a07b1ebb7f8d43e4aa1342ec1cebc1b811da410ae25f2023a404c299e71fdc3563144cd437000e56c4dfaff08f1689a0ff22ae5f96df346d84d70762dfecda9e4344a10b2a4e0606626ac4e413937bc05d58e8c55c69efd3eafd6257170cbc226daf1389ab2820cb10decc615f07a420eaca2c76d1dc2aaaae04ada015e4dab8934fa9b8708c2c3979813599762229f19fd295826fa883a307ef747be787e7d4d658d9bfd55bba5505f90e05fed226d5b1f53c9f4a9a3fea3ecd35adf369563b1bef52a0ec29af48bf91ce4237085ec11cf38325e676c0ffa64d47c21b5bdea6e1c86bb6d11e5ee6ed6a3f553ca372ac489cf1f76e58dbaecbc5616b4b810615ed43e5340d1ecc917d44399146331ca54029b90931a0cfc1905501882288da73b86ebc511bbe61f13e039a3eb7852c20f156a6a07314dd402426ae68e88c3da0dd68f2f84c1b1dc8b04f806bf35cdfbcbdd4a5381d9e18e550a71887976733c37f51021796fcef4439b9f01dc052985d704f6fab58310c5583eaf1398071c31ba42827fd20e0a8912689cba0175c91fc242b3f2320cb1430286a4923e06563c9f1300cc6746672b47c3aa16ba6c12ecdd092fcbf81fa6f3287c6938e6a6731f1359732d37f79c2186d3a40e47d4646a2dddda4f687b2d768d47a4945d2753725109aa0ffb11eff159821fb0c92998426fd49a30000000000000000b66d5a04000000007b37046ba037d919a8e8721e17c9ad4a3cdfbbc74ea760cc66e983464443f2c0e29b096b3322abd3336ea83ae0e6e233b82c8b8ba823e47606806972a142848c7ff5c3463504f3b02a0b27f6edb5a7a637807e24990f0c9f1a377dcfc8959eb50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b32af32518379c41aa8d54fbd63a9bc0981266dd05b679d001f8537e371d33cc0f205b3652959d8014fe5f56d7098e861f933d86988b39df4a744297de4cf0ed9e404c56cb3431a0dab9d551414e3179c406d6aada829160514b7db0b063f26790e2e98e4b4713454fd2c75e27a5677163ffdaa42bc8367e26e992de4be1b10224dc8e3fd9c2748fbab8a4f97122cf79d823c03257f665da6776597a2f8326910302d7165b7bd010ed13e5b0a7e7bfcd44035a55893452d93063b1b6cf9b01df780a00507b0249465b077b293226407598e59ec29e70ce0ea6c172efc03bd3bb06761a95a7021c0753449cffa0292a0ed9e998625b889d5b4d268582933746f62492032a641fae4c230244ec435c73f0ff51b04c0d5c7ed7ea1809bdb5ba0dad35e6320305221e90b819c5aeb91610f175e9e81b87b39bf975e10bebe0b4083678322219022ffeed1ca188d3a4bdbb82cd47019192cbfe5a675a4e51105c323b5deb046000030dd0931baf71fdaad1a36ed69d17cc60a0a42fb733ee76b9176a9d24fcb5869d030d6ba37e80e7bb821f30fa7c369a5c9913481c2efa3f465e950f5c6e2b2dfcc066ed9b19e16bce33d07b22fad0aa12b77fd6fc516e26f201fdfd560918c95495d712a76e4b27b7610910b2e8511d57e99b292f1c7e8e1e2e87d0e4ef7f0c31e24c3912286febc589d93f5d45cab2410df1bae52330a06c618c4758df17a0654df42e52fac58548fdfef712525b2f935fa07d8a7689f04a1fdcc8c495c6415b042020b78200ccf1efd6540082ffb50f7ee6fd3abc67f12442f1a00b8ad94ef9311c4494c219083ea75bef7c093ad7597b73d49518960a9d572fc247673857bfc7517767889dad1cc4b5abfec881e5c024182634753705a19b6d7b6dd5c0daa71bbc805a856ed9348eeb8d0fe95b7a2d22307f298a0422ebd47e944d94c0ba2e714f4520abf320abc274c62100449e155897cace61d270c6aae4b9dd8fc77386d824cbcd6c7145c72b684fd2653e807d5acf4a37b2a3f6126a824ebf4497b2d097046f389cb28a57253a4fe07f43292436fe22be7d75812efa099759b725c268b64331887fdb3390288ef555c0444d6ca6bd65c691679aed8a488370bbdf3c0646177a82a30a1aa63ab77f90ca3e9f02a50db392f338af3ea6d07f3a254b48ef1d5217151f2b6f2e041faa45413b4021687bd3454b5210c3ca4919f304af3e821598d3be8961b0c7e8532fb0c389ea985b691eba1b27c104148b6673803572a44501247f587283023f6ebe602c04118f4707524dec45173caf15a3620b42e66c1c5465e95edb9b9bde55d762dd07d5160e24ebe5c080d72917ee90daf8b2b4de50eb5edefbf0e3cc28dcd4cd3ce2a89ddaf8aafcbb11cfb853a55d3e5b8e73a09c61351a0f4151e9596174252cb6959c39934c4e57b1c6816c8f0c098aba6d06e2e59fe91a02f05a6433e6ad1ef8d0dd0f1b42fdabedfe47a03eec2aef03243665ca43ce533518ec6ba99b7f4533cd30f3b7b995a98fd9bca415a7287c5dbc61e19f36af53968ab4cd52009fcd6d312c3fea662ce8fc4d9daa6d087696ad5020852ed32dcdeafca32cc2e468d0ccc9a429733a79f0cddac299f9950b949620ced65ef91a89e12d7054f2fd5e885693173d72ae030e2e9087dafb5572414685b6323a30f52280777abd3538ee728c022efc78b4c85a9a9b03965c7e802fb7427d2c49971b8635783496d2f355a7f5c6555513714c582fe1743398ab42e6cca3d3c21d1e63120cdae36c9b099f38ee6809700046b1626ccf8a84323a3ab617e40afc118d7486f761c755b0f27c5f6cf58a981d29f36506d4338d8203a2a998cd8d773d58ededa6981268faade1a4f8924b6518a797482d65b611f43c47022ccba025ead3310ce4bb30ba9545badf3b132f6acc69b624f0ccce1fe9eed4469ff7eac6b4ae98ebd659eb901a16541d34d8bb642b1ea9d490430010e86b877d8d528209d22917c16495100b8bc6a651d1c289720b131ec213703378ca2d8ae0e2dc2abbb494603d119f2821c62b3ebbd9f5e065be0f2f81469652315c5451cd2f8138db5bcecb469e2b7762667ff8bf90bd52e8f8f8daa91f624e33725b66fe3bfa032e4336df97caf9580803857242ce44eab5a3c58cbc7ae337be190b074fcc06366f1d3ead7cf391d6173b530242c3e19d52be85ab7c8e5e9e260b11e19808385b283182cb520de89ed2bfe787e582acbb0c81823d8ca827f5ecf4b94721ab398648d3dd17b05f22726f3e6d678a70f916c5b49f0000000000000000acf85500000000006839e28b4b4d9caeefa63bdbe3504a1a077c30d8081dd9e45ab3b10b3aff9a4767ce8597cf681d1f733f3da619d11958a551eccfc4061cbde06fe4a5e943ee83adbfbccd9ae6331f25f93577d90ab63afc8b6a85559ce67e5a9ed8ad6185a99000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c112a672f0f61d1113411c63d3591b6e7b3edc1ce26c7fbe2d6103b10279e7fce3522386973d24ad18944c320abee70cb5fdb5e44d6aa831eee0774da7d803e8a763de0c5a92e123d44a9930063063b68785a455b68dac0bcbb2c00ad075a12e21384253ff5805647b1d9e9587a2a9212195b3c6c1f5fb17e8816b81329797c60211f18da3ef20c94bd60880262235725dbab33bd03bc8f5fd2d03d7f3897e786c032ea5eaab7df33e86052eb210380fceba4436c7146213095dca758190ccfb87980b0136c9aa91852cfee3b8250d6f41091bf402c0417bcdbe0e301d61ef738de7768ce876cc9209bec54547ba9a7229f4dc19bc580d819cf63352e4a22be2df98ec0305369ed2a73038fb0477d38317939a8bb7b7c3c9806bfa7699c856dc577d1c090300d6413baa4f0cecb91d61238791ca29f5793b5adaaa5f6905ffa86edf8458ad031324e054ab8f987be6be671d18d17e4bbde33a4c2d4d84c332554b6d2cb0dba802129029a1b7ddb1f6b06fda9f3a86a8bc710def7b19ce57b70cacb22250a09357032363ca37621fae3a62f7e2cb269525b3ca99a55b2a87d279edbc7f8672911021a29f1a1779e55bb06d3dafabc924cf02cb20133295a89a2b97ff00a1d789a37c0ce27957b538e55e4bc14385e1c4d7cdfb656417e9fe3780b8532916705c12928c6f57d48a86b7ec02847006db65afc15d66f0ababdb308d97e54e84ccc9870d23456377708b4da62e4ebcb79e7b184cf6339143d02b6e5d0d1f532892a608d8c71220bc7901cb25f5154323ffec2daac1122c0ccbaf537860c9a96b528b490b1e870be275ce3d8941a23dcfc7741e06fd2c6bf684f2437fd400c066a9f7cb637fa6b425e22979b0d52d91da9a145b9da3a5657d08bfc7bbf5125a6d9cd5359c8e40f6db5882d23b59c1dbd13933cd652efd4ade47eac8231087bfc8725613321ecc82742e0647948b35a7591f85671bd068779feb42515bab135ed92b7ad98d544b2bafcd91aeab7d6e765c825c3daa353bd6f9354ce791dc013f600abb8b32938db55c24b307ebb34a5d69a14ebddb78c707081797397b7f8d7c77d9a787c7718949aba0df52980b5b2ab18d5a4c80b88bd60e9cc2a888cec83a08ce1f886ee6dd8695abdf8dc06b2ca4cefbddd023ed70c4c7a1a54d0c107c6c2cf6edb73035bd32215f35846ef0c57a5d74efa28afa826ea9b2f968dc1ac7bda3db3092bec00df2b708d300325a75b37de5beadeeaef90c2f16a2cf70db78f9a0c71867bb8edcb26baf8e1cb982b97b266dd4408501f31e910c563a64a94758854c396c870efa11f28d6906eda36e4a21ac16de0862443a2b18ae1c5ad8556f1decc105b8e5d9673b869603b8b96e516cc9ccf305f6dfe5a6470eb3d2b2808ae5e682fd2a884fc94fb87d78e04d4a44b7332862b718588d90c947750808f3b081c7364248478c7f8a737cfd86cca96062127a2851d9a7e8c5f5fa5ecbfdfeb1db16cb0de32c55144e033fdb72fa640e8ae6740a82e01b1fb97ab59f91fdc2504c9d648472df0181688b6dee8bbd717b869818f40c579fabf3e5e242632a86c73b086e309d0eca10d93dc227b388e15bc8b49c9a4a52e015a881f42a74add02cf737b0fad9fb5a290f254ad97bbf7e32fe1e46e1c00aeb810e54ed9cabfa8925cdc1d09d07f947cdb9860234a31eb97e332bc0fd0cc311d63a994527c5bebfdc84b2be5dbfad7413316d679bd0e2d524a62a45a5463ba3f8cd30f7cd792b4bef1a1118d312b1caaa33a106c7cfac6584a87744d5cd7b90cab0d568a0a21ec6fd435ab6f03196745dc1ac3c9d6dbb0dd564d3714dee8609d0068ba35b5d5c016ec9ca429db1be8ff34029d733c0dd260d7b3ba785c35a84b7ec743d044fd31da0d1ca78e183d0f2412605519c611c8384f1154fbe69f18133359a7c9b81bbdc1822e60bba1421b9ccb122a09547643f11d3e2fef81aa03843b986fc45dda209458e76a889e5e989ffb27c89829370b38dd60097d9d3eabbe10e3309054f1d4b07ce1f35f6020a9215fe86388fe2adac1fb8794d1617d3a4b00d691735adb9999ee71b390d622e16d1e39b29323d8f08fc797e410c2f681c913f124a830e0e3a75b11a752f5fac93563f3eabab5eb06543ab7d57351da0ccfdae8d673daef1bcda8dd8d7f69e817cb281c44f8249c5d6b107d3243e8e9ed4a56b4e9f8d19353bed5b8ef42467cdc3c7e0c674c9c14474609d24447e913b5228a1dd660f332d804ff93c11fc48e03eb9a995b9b9324af2c9188931ec1387dd899c3050eafbc7a1f57c6486b03cdecfddc6cda16ca602b8fb4830b68c0c376bc80a5f699314e430373ff6f44f19920a41939da2b7bf2dbbe5eea6aae27fb24fdce5151cc9e314a1f33ade3a7111230e1f529d83c7d7922f31d5b68e6fd88d05", "51516551", 0, -1984649089, 1537743641, "2792dd2156c393e85afbec19c0763f87c1bd57de411e47d598f053061b58492f"], + ["030000807082c40302aed691691ffa1c0e38ffa17c946b60951afa6b2207a3e6d097a576da4bba603b02000000075100526a536565d038cf00532197ac6722aaa5085d33a0344dcb3a4511a4c8e90f97d58b21b6303939df6d0300000007ac00ac53acac6a903934b3045e9a90000000000000905ab2050000000007ac6a6a655352ac565f07040000000003530000ddbbad0300000000066351516a6351765bd63c5fce6579020000000000000000f507f70200000000bd5bde63a025297c55a2d01d656f58a068db3468aba297fe96801d7f369fd67cd8a848f64d00078c578733939aedd77123f0e0399db0bf15d4d5b68b01372dd70719a017258bf5c6bc727235a538c9d0426e2a6d5c69a3cdb6913701c6758e16000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d92a2df2ca2e13c9fb210d09a4eb690900787ef58e642be002627fd783b98a291b918959208f4fe7b8e4023a1a5e46394b8ba09944148e0086f40f34a6854773f581e9fbf0da86ec86eab96480ff28063b422ecbcadadd83256fd1e0e7281c559e5b097060583f05756cf0eaf61e02bbdf374b3a66e0e242b39c83812802df4022ea9b8a572b7cb9f99c8a357d2628615518f7fb268d8d5e91d78953d90d36e82032d2488a5dd4e410d097a64dfef756075910fff49d68b7e7307e78682375e8ddc0a08dfb8314bb793c59ca17f046845967ac5d8ed115c06184a7a035a9d79c4672679391ff89bacdd67b5df54807de0e8ff0762d922328dbfd292fb053411aa3d14031fc5a6060d097101846cf84de6e47f2a980404e977073138f7aa0be5c753063c021bb5ac07ec55d1cc4c36175853962bfd8d8afee97830c0d50445d0aff3e35bd6031a475304eaaab12e8a771bc46311302fed18f2077127a2f2b1cc961fc187895b02210070e63eebc833ae9cb1b1a15630acdcea543613457ef919f8a4931ce99baa031de09f39c58ae6af088165bf9ce4271c7edb18ea0e23b8b87fab70d37c27b9136b129d05f81e8a37ba3734294201c654048c1e72a2cc27ee2ac94c595b1da6d92b8dd001464627f9830f5de71c0ce8c3c0195c2a4008eb7378819b7897c5c09200599882af2ebeaf195b14aae7443a4e5a994acce8662f691f9f97e6ba724da1628f1564f4bf1559733e60011c15e44b6a1a36193c5d3ba0eb90648bedfdc5eeb2818948f8786c21db20635f8ad0615188573e8e26387b7fc74d7f4d53ed1da40846080f78a7a5609158a7e06efc09decf724ecd046c2ce0c5a68feb35882b32ffb6907f5718d299cc1b7fff29542053d6670d5b003191cd4d9397514f94f6eec6fb14c244edf37c10912e7f90671a4b01c06fcca0433facfa21444aa8829f466d7fa7f8af32b70170e71c4c9fd686678706dbc426a101a5fdda90d506edc58a5540d70faadca5b78e37d56856e1de4f73383002a2ea0efc02fd659834fda18eebab1edcaa74a66be3848c6184f12deefa002413bcc0d4f974307ce5ec3b81afb28a142d6fd3c8cb21facb652a16f995c474ee8ee55c0d0917429cbf676805bfd4926dfd4551d27256b695b3016ad7bb03d7f4b4e95dedc3c652fa51fd39f73cab66efe122175a9481eae8a9ee495854651f8ff90ef65dd6083d78b3a186fd0ba383a130a9d9b137200a7825fad25e88af18e0c663aadc1ea24aa07bef4b9b39d7bb913f5aea06c79834ec2ccfc807e4e1b2365ff55fccc9d561f7e9f0e2e0f74f503a31bfc18f9d9b88faffa41d40efccc704620913da601ba34658dcf7916cd6742ac5192f8afcd6db5e017886817f87b80ad8ab8e9d29a390d65cb39126f69e449cbbd46218d04b2c2c14f77910fe5da447c1416aceb1f6f8a95710d20477ea73c9bed173cd331dafe5a694aba6deb67898a114365376c6f848d6d8d203ac5503793557e68dcb50c97d590dd3e0c35145011c3ceb5432b1ce3bfc7218249352790d98f9a6bd366933a91783c1a587b4c66cd2d67250292a00eab9b79420050ecdcbb9744dccc02844001de676af98cefa1b622419263f56e14462e7568d48ea6333b2d891e65f0772bc2f6729683f6dc047b8bd7520f4b5a214cc3744838b35e912b9a296dbe6cc0cc055a9f3993dfb7b6581f9892c26e44d91a009825d6ab44cee4385950da84169c4ebfd8a6048023d440041d94ac9bb168390b34e4a2d81fe80ee726bf46336ee781e9b04986f56ced2d52cccb3c2af1d117aea6bc678882ff3f7168e77af0db1bfa022319daf92362cf39c9656db719fc852b5dbad82d57af59c6423536883b2458e00bfbcfd0422f4ed320b0be8e792889bded6abfa23728b29c995732b9d0473e0756271779dec4f82f0e869601dbb79600254ef9dc0a0464179302690a6ce4efba75c7f5c4d022d13e636d16c5e9ced07195f5842153e8ea855b08c8a696d1de92c41b0911aceb5aab9d23c3d417c50352d8ecfdd15ca0a1f4c8f3f72cc25f4898fe4433cc54767e9b9ba33d7927c3996ad806832835bf995ad895d858fe39f0c3999b67340e22443c2477c4d5f60806fcc4282a9783131cb2043682ca9842c44cfd4a0d59a204f063fc8871a2be2f139f3cf9e49bd41689a6b005b9c600111ea92dacd984d9ef29e134c75f41a51c55a0c32878b977cb648306d1c93a06981e72cdd34db06520548703284c51bf51b0802096a5bb12ed590f4ac505875c7ec088d10f1aa2493fd73aa02000000000000000000000000f30f68abc1c23386671a7ea2bd9f6501ba53e3c5076cd1545f2e09eba525cf00048a75035e3c1bdab8ee99addbf580776afb836406cfb7c8f22d6bcfea6b4b5f92283f97c40e525115b37ec08a0db0f4882e321e694057483cec0293bb86780d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c64a284a6f929d04d025ac679fb6976ed32f4e5c1e7809de33387e4aa2ca0926db4bd6d29b4a87bf54b7cba418b0c54d6f907f899ed8895cb909e7965af098287c8ddc65e17662cdd280f5538787b6c0027b07d932f633e96bdb7912d2b0f246a6fe6d40befa4239c6723bfd16d2ea734d67f7eb8b8188b96800fe7b65ffb23302154c61f45a6cc2e39fd8fba464c9dea80db2b37800cdbaa4abe9a840784702e2021543e1dff28e915df4285722d229ea1d56fbe7b654828a71aa316daa1e93531f0b00142d6b4c3612407d1710e0f8f3906524d48eb4a8666807bfd11fc1a7b4c6824daf6beba3552a5d8c91c7d4688be9e9a5de4643110b242632e0fed94a4acf9003167a261c85d67e859d42bf6dd08f96304d37947af497df403e345fa24bffe94f030f3b67d9959a2ce714193e9832434f2f5aa6b1b2a868da859a5e055f111ec5230205f1ace308c40023868b4295fcb55ff79c96b923edda1b7ff3f2bf3976ce5cc90320a5b49e5874438e0c1a53ee94be4372e76c2c93d2d827cf36e3e6e7e375b4aa02204986842650e88648c8ca05e9ea165a6e8c0eef184db2acb2acab5c7b6f8b10e93b7fed459e914aa4409f447ebdd2d0472d19f28bf773569b6186f59661c4e4b773509e04645003130d99e96ea269812a3c43ccfb6325c46439b9aeca89c52c6d09ea2285e687ac34b14fbea28a0d9c63fe3af36131db5fc721c0a40533dd4d1b29d6a0bc34a9105c255579cda70f7428757fb38c6ace97a3bd30539e2ac7a5831b123de26cc9ce7f044ca3574b44659788c968f682b3c1918ee8c599ba08bdb72a7b990cdc93a8710a10ba526b46e68cf364936107ae038459a7aacade032bfd8100eb09a59517f32541333e7b1573d38cd65143af3f713ae9415c5440164858dbbd637e141120d500e3741c8dd35f46c2479bea9843a61995d64580389c809f4537a75f60dee61d36a53a093f6d3d89972ba1f435e5ac79c2e5da5ed3456683e26710958aa4b538db3f25afb7489fd75fc26c7098321f83c77e6e2a008fabad74f1fad118284310a641b7c064cce3b8e1aa6e0ffb88bfa3111cde4946c87d88942871b57dcce75a996f700b053da606fdd7e62cbe9432537021f310e6b5a7cc0a16b0fb1a89cbef6eb7e68fbac50ef6f6429a6e63ce206b32aad95b0525d631034eb41c15b1026f8b6a89ed20c1b44827c4ff38ac49d2fdad39c8dcc2af2b849313346d801fa5ffacd312f67bc8b765da09d26245b8a8163db7f75e0ea5ad11f12e548b61cfe05336570ad07101ca6bdfa8da1dde870e812b2a77f6050e0082d020868c3fae3a49d7bcc0af64fdad0ebcf3281f7c3b477d951d9b6a4b1febeddefc371a354d6c9cf982ba13d52dbae9c6de22f3de9539e53b218d281d2632de7a151f89b31b73f7ab36cdff650f10dc42a3bc773f207e52e7110924b1096c57ea80428edf4efc03a2dea07aef7b2602cac94525064ce122ab2b8f577bd1387e4841b2be9395a0e5b93b640cc29b7d43a1b2aa7e603abbcd19939807208441dbba78b21ccf5a4b650adf98386bd02a85aca904ed576bc128dfa8caea7e8347e44a228890dd415e6040e6de06b7b8fd5e52cd5346ffb3f3d475032d0372efa2c748d0a662e82d99b8ccc753408ea092bcf5df965a5423338f2c4ce879449c23d1847e04805cff49fb6d8d83d4a667560e2a4b014ad0c17a2191e82c254fd0257c13a3f18f8265819392a59ea6263651a960bfed5880a41754c7ed302d662d041b60d7f07aaf4c47b4f883a1104e569c1acdb195eb5abe2bf8352f4667d6e681cde18366ce70c9dc4c25e4b17c4d96c7b25146bb7414f5c5ce628dd37e0609b58c6047ead40450cf3c2c84fc379894c4058ca1eb1d3fb3d6526a2cdad8cf194229c2e59595bbf44decb896e80fb633b41dd53bc3c64d231ca75adc5893d37b7719681d75461043604029f7039e6a92176ea87deded94f7b8e689c9a7e777f72b7628e4b999998ed68ef1fbc3dc07c5ec9f4d22b1dda1d1c1a7506c35ee7731302e91dbc58b2f5a0fd91fae5bafd80382e6f70336fd248b3bea8b5c1dca066622c0ef0fcd46438728701335645dd9250d08049443a93e0e8b108606b8a5f3702ad213d3a19408815e91a7a67284c17a99e7853b828132b8ee4da389d10a1ed83b0c1dd906838e1ab1df761aaa7f646e58fd5100abf28a662135b2a0a09cc0b1886c7cf5d744cc0fd67d15a1ad7d6ce1fd181263b0b217ac088695c75707d2bb7626f6866d6c5e709b1e447ac3341b3f7c3dc3fe85ec033f17d6e1e817cfe41bdb63dec0fd13e2fc373b376bac3ff057e989a18009103b341a2b69a535624979e11ffc482ad5e5a3004547c8afce48c74cdcbca4c978ec2c0c39dc3d7d9af7d191fdaf92c8b028c4410a8b6a44c3dbd5fc0c01", "52515163ac", 1, 249204349, 1537743641, "2bfccd8ca43decf9c59f3f97127455f72de4dcea37f978a8814aaf7425fa6218"], + ["030000807082c40302fe3b03fbf55871a78f7f72fd81dd900e7a1b550e5c11a61bdf6c803df76b65480300000001acffffffff384f31fdb71660135d02b99d30466d941f62074d6d9321abbe1c33e192ca0f0d03000000056551ac5252ffffffff0320afac050000000002650091330d0200000000086552530051006365c01711030000000002ac5100000000c2fc7f5f010000000000000000d88203010000000040df162bf0237c868f0fadc4f9060a3ecbe5bc4eb05362d018f163af1d4e3ca75d0cc109df742e926862c2955f4f908c06cfeefc13bb39482277f8691a6b0a0275fe27250d66166bc89e4785b20b79c06dfa7e4828fd3e9cb30285b29a3a8b8f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f0f005645b7951b6231dc2dceafe43e3aa77e31f900541b9364e9593dd00f3071263dae30a2d789fc27d76091635481b6b9df48f6789f3b70af89daa4f2f4b5af520ee9d8f36a882cf77e577847e65c80e7561bda2f6309e4652a4b3347e1e5276f5d1cc097424019ff397d9d995f9f575772a41be6be991be8f7fa986f3ee91022e94658d0875481bec9c2e762d3d6993d7501ef337c8d928083e9ed95e30e07d020bd2f75d5b1b8b0c7f5fa40c281b50cf5b4509233011ac61cb2115ed1c748dd60a00e2aaa068b5c223b70c3081c6b5b4bdef41a6594c7dae39c5e0d7175e6fbd6496b078164af429a0706dc8299ddab7e7f150933de7b2632a79973a245b21d7e2021793c61c4ce80d6eeee51639443746657cee9897fb3062a236ed38d5e7e9b6ce020947183ca49502a2fcda97febdc405282aa282f1d57a0cd2ee93b6f6a8267473032d5783ef11607f8555e4d7973053e23e80d15dafe56b6a3d3f9e34268f9b1d8f032bd8a4955ba1a47baeb880d0bf551edf1d3ccac31b1d0b3e6076280a0c4bbdf10319e637344da112e1c36306f5325ee2a78dd18f8ed72ee41f1150170c50e351833617a0c55ee196beb32af8e93ca88d85a8c920697d08f0deaf0c0f03b5c45610844f5e6c116cdf2b8358e1f67d0377b6f5c1029227d102e86c951833da1461a6396efbffc4da4e78440b710deac7afbdd27524d7b3d53d3135d2634e1ae270366890b504bf72d6922f49e9df1015a1f04a5e0aac143c3c4542374aaff924f463c08879c32ce4dc31bc0a905f1dff7c5596e8384511af9891ef8e8c0d0b8b450aab68464f9de4fa2d652091ce9442b55923d611da418bce29a50ec5a845623a7fc796ac4fac7c4e0f135cdde1aa14841d2ebf01cfec51df89e2bd86665bf89aa65c26b727b4ddc6a1f0455db5e152d47f768e053284ae81c5ad35028d1f01492595a26fcd8df8546fb0e8289ca34d714a25caf37028ac76bcc788274f7665098c72ffc0d4b774188e89f79899304f02fbc17f3b08c19cd00d4fb1e071ad462559f1ac8dee56124151e95e318ba4a54efbd1408ee9d3bde4cdb47d32332a9fb0804e969db8a1993a71aec683b1f247c5b3009f97266f7a22933ba14cd71593681a6428fcefc621ade6d02ffe3d3d295d6272264560aa7cb9ce23f897574c3a12f216870500c55d256be20eb804e0fc9b88eb13dc30cab213c8337490c2987463f3ec496ed553526206ea31bd0d2da6bcea233e999abfad255a305cd85641e9f169ec440f49c6edfcc829cfa870718f92f3ed6ebef8c6499de81d35633b2f37b4be3494ae6e79efe88a974b210e200940f2674c232c2f65f524149b30fe9b481cc45280d92c6188a8126b0fba491f56a43e1c9e64cb6a3baa6277003db0103f58652a9b19c39f12343767f784476c295a0b3e495e759d0e9d55afab17c2090371b32cfba60aa74fb4e9c5700560f8f8a95d0133c2ec2874db7a4200ef0fdf702f62fcbb9f86c3058505b25f2eab828c1790f9bfce6fdbae13030332c5eacf7fc2785cefe2d927572ddacc7d696313b42d5152d81fe5ee15193341a46664c68f9ea89adc279b07e766ab688118f3afda76e52b4dfde2060d28297e6844d196d1aadda52115f44455436d710bdb75d9cb52e47bc68f1446fc9f45f604f743931a200cf8f716ea5ac6d1271295f5a582c8a417a10876870598afe10ff18f8d2af7be9fa81b86b8d9e71ef8fb012663b74878db333b47e84ccbe8ed98a4328b332f7ee52d1b365f70d801c6f7771738a83ba64409369da9f8adb559fcd379e17ba4085db36fe57aba8420feaff585774e89a42d79fa4e701540ae142633bd1ca9074f0d10b230d757609c69d4ec43610ad9fb766de88d6baa1600e0e0dd7edb353b05bb72fbeb86297dd17694f0d069a6cebc7e71b0b31152212a7a2ee8498e70f5d4064c5e9d2e25956b1a455f67427b8cb6a0ec65945efd9fd6d105a3bf5236e99f8363591e3ff3b6ad743c745562fe66215eb94f29a2c128f3920034052a929163711b331f39c8445dbbca5bd7b79e3339ac6233325f1dd6ae0b1244d38c7c1cbeec6e1c41af29facc5bad54396bb8b7ca8608f9f52fa1569003a3d0802a43ba6c7e6c829e44716e6a335a4ef5ce2ca390c6738e029f43d96217d12fcd7613034008841c26b1723a54649da712da33332967505821ec970ed573add982568d67027643d92eec353d484135d00161a0d950b92d2e5fdd7e51806fe49bc82e219bc3a34f39f93d29f5efb81afba92e9e4cee52e9ead29edec50754b05826281c4a27e3376c67259a2f9cb8a71e376dc75c3a34eb66ebebe76ad3499f06fbc42d01dc5ae660591527861ead3806b75d191890b4f63de6beda1532742c0153a4ed7c8e9ada5af100b3efd5efb5812dc30a3c29e9be08", "ac52526351", 1, -1396718227, 0, "f7d8d66b18f0c902a1432a3a4fad9ad0fe9763839e0774c7dec3df2d8235d334"], + ["c1f6fc22030268d29309ffe458cd44a6d03792f4391304a777e70d425df4887ec4c23f28d00300000007acac6363656a65ffffffff9884aa97561e2c39725e60aa09e5a153b78d2576f678a8c5918da9925a6834bd02000000026565ffffffffa3d95e050e8cdf4ded056d3d124d4f84ade11720aa08a1045c1b7b31b74f7d8f020000000200acffffffff02c811ca01000000000752ac5252536a51f46f90000000000003536351000000000300000000000000003f25fe02000000006e693e99b9399c2d5e16d1e6974e8e63dcaa5b1469f97e8fca7c4240f5836973ea383fd0c101ea2c280f30407f663a43f2f2c0fa3331ed799ff9045eee45cc48013849637ce7bb6d94dc863b8d00c78a44af891fa043a40726c580080697df7c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ac029ac7807013df151dfc1068b629a94db5f4dc105f865b02a9665685e620eb9b57c10638a357e631587c4c28ec99a7ba8cd200988cd025c0ec8868c4922bba12dbbef2879f2a69ea01487e2b87113d73dfd0c25d75347da2c3d0fbbdb3d7554f8e9da8cd428378d10707a964dd0019147870499f7af3f50dfe6625d089cb20303440d622b2747193b838e69c97b0e6bc39e5c37131a85620880d887928ddfad021e3b4ffcf6a5928bf9d51cb28fd03d024c22e21b414b724bef9bb601860e43f10b0710530f8bbabcc46639c25a4957d98572083ee8ec5b6bc61e976249963c7695264aed82c26a9c247909b8c7660dd8d6f095ed216458f6755cda63e9d7bcbafa02276058486a4c643541af2f18feb6cc6084d7b5776760e1a605a3bebdf525664c0202df0a027fea55bf4b6fbb9a41226730ba1e90f4718443be70e0acf1f04221e9032e7a16628fd9a69b45f804946093be1bccf9e9a92483c13f921ce8c312462e060203926f7b1458bb734e3ba2acd3c2209833013611dc6a01be8e10d6ee3886bba6021235e25d35251580ee183174165d53466f1d07bbab3ac6eeec269c4db9f8a4d2764f37deb33e8260ff77dc3830faa957241357ac7855cd393d6039112780f9875e01f1d72b8f4aae76c23f20b3900c12a786401c92162004d3995cbcdfdfe4fc334266b1cb5cba19e4d915a03a4accfc319fbde8c04a3e202565389d2674dbd32dec1132c676b170715283c3d5441ed14818ffd083823b6b93850b5e6683bb278e756a25eb3630bae7b601f241597ddafa3760d65d8556694eb49e467a3f58d172b49e5f27321e62ceb74102e0b3b4b70765c4940180954cc223a33a6ab8b7d0e977ac00df8c7f61e132d1863b6ee981f655694680ec00fc4aecde6353a843232ea5d4b6c9c185b95393a2e6c95c48226bd9a14b4f329c560870320f3ddc4e7105eaf3de8faf42bc3f5a925e9ec955c2a8da81e9f6d80a2c6c8aa71ef35eec1f3e82f9e8e26e11098f0bc6815f9d015660fadacfb2a734364ee94bf1d27602a5d9ffd1f2623009b3db236c997180a6f25067e3017196941314a5c81a8eb2900970ae8d3155bccd05869fbb27e5e947e679f2946dcfe0fe3351ff0b06468be4e6b5726f93bcd6bb7bdf58148cb4c46f918556393b7f8f38fd3a6bcf3cc025cef05bae926a616a8f044080e691106dd5782c0b5a52c8dca07130b3fd03f8fd70bc4348a3fe9daa89140eb19f7c15c253106cd3734e0871a86b47ca3c1c10e810300bfa4475ef3f89f956ca74f5b738d528972a20d46e2f92e3630c38e4f9dc550473184ef5bf359922a5e4f64cd175c515bcadc06c634244cb639c9a5c32b9fc5e779e338854a6f8d9089cab6ace276146362c381225a57a501f9e93bf531940bc6ed15a088b2e52e5ca566722375d5bb6236e22287a66a1048fc22c0a6212276f98d053fabf9a51c835940baf53602432b68c0b560926d0c585b3f04d8378793f63e460f6a8ac05df592edde0d40cf7445193d94eb9595a0e1feece958d005cb846e59dd165accb25fc5b28169d0ccc36e66c91054527453e1a83ee6c6869893be83525618ee8fdf24e58acc48816939eebe9d5db2a03c963a6a4281c221866db590bf66cf9082d8f884442125e13769a82565a4dc8ff0affdd94303983cb05cfc7639aa0865540fb50766cce96fde33fda7ddb6c0b13542a467fba65d69a8940d5c0918ff6b41c2aff440b585ae75f563d249e0687fd3e223452fa32fff7551fb864999a5c1327218eb4a1d18da391070ab388a6391f0317b9a035775ccf3709c16ca9658025fd157b65e0cc3d3da5bedeebb4d5ef04ad1263e30dee866590665c75d2543ce0ed4d633bbf6fe657a367ea846cd26c719008702a6bc9337ba688c56dd11968849dad7d7208362f83d200a7e8695653fcc4ca00458352a0768c7c82e90c2e650d94ad85b1a5ace802dbe3a767d48b7523e044f17c8eee5f3b70e96cce3d1a1b67f1227946e0cb06f48e2bea21078e4ce3ae51c9f919a39970e79feaa21abcb86ff7f8686d1815b7e5311a52d3878b7ae1c26f9e01a229b53ebf5f6537d39f7222cfa4cba1fe71c113a452bd3960b35ed24f36d86ba745a99de0ca185e8e15a6e64fb6a1382af5b361584293fadca87b807b47e71210b21c8a8833d3f200cd97d59069ef4f0bd4a23ab26eb235d6b79ccfde899a8eb3c90f1b7faf0ed93cc0956d1c2d98b3b0ede6e0d2074321165c17f501dabf9be8e3aca010e5e83aba5afba0c84b90de64df4355d6680552f55ff502000000000000000000000000b8d1cf98ab2fe0b028ac5ef5e74f27c110002983ed06e37cc70e63b484f875034a5245c51c3b509dd711475af593d984ae1137f0efb5d55ba8dda1d1bfcf7c007fc766ad7e359ae5199397758aece04ad66a2521ff92df756fc1a9edeb3def9500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd23b7d520da71174672bb6d70c8ef49831bea25bdfa95e635f107a64544cf57113d0abb6da68e0f6b1ffdf10da931b26180ba4784fb25e7d14532237e04175678b2a51e93b3ecc6e5f5161ce838c6bf213b370a4df302c8d1c3da6243d81b81d9809c68b04a78f53d6e198217ff9300431204f088dc055dd5d899e9ab7588b20313b4438c062f9bf05b001371d47d1d1e28952fc46a9b9ed125c6ba3aee5137ae03167cd4556c36baf82b5e0e678cede7796011c26c211578fcce54568697d4103f0b0420a72bbbd7ce4c65286f4819cea793747da9e08dd3515d3e7f94b8f11e6627d0985f09cf747c321088ff4366ca6a186adde53f8eae506e407c24efb76f8f97022008b575936ce3f412d4c62c32f992a9253b60d8ea2b9cf1d4599ad437f6d6eb032a376a7bb71dde9e24c486fe1e3b8f6fc6d363a36e62441e8010bae105684d30021f23e0c5814731dfa06493a7290ba8d1c5b90f1d62de25c7c8ac50bd970cf85d0218623cc3ca6b38504dd4108f52ccd30a8a96bb964baedb8af934b3ffb5408f180328699fb02b7afce84c4d8fca034c635d75ed89dee5522270d013be56fd8a08bbd67a590dfd60f69b96f82ec482273cc69a76d6f0573fbd7889831eb0467dfa5f818c585de872651af7374567afb8dd881a7e2024bb08322ec6d5cc5bf5eb6815a501312dc8de60ecc43212bd6866ad1e1eb1f900a9a725c3920cdc615d8308a8eaa08411d67aab998b1412571d4d2710acf104bb3cdf8df7cde0eb82dfa43ebac2f9c6e407d6b4cf503a259e5a30c314a78cb1c537d08862dcc2fcf46d021d6ceb00485bdcafb657748086995343046b766d17b633f26ba70dca4ef9509680669ffd9c0cdecc9fa1bad382e2077b2e662975dc318c4d8c256a4d686f2bff0ad89afdb85aa7ebd1666f67a4a45451c534cbeab5edbe9aeb7f48a8d58c960d68b821880e022d12173d0055668c59d79b2047e143f882fd0f6e773b6fdfddd3f4961078433b4b768225916a973f196bb0f3256d0f85f50d79956ca5a556177b6afb065d67a047b473f81e3ec276fee950f4ab73d4f9ea926ac8ed1197fb0605218ec8c697dd945cc87e4e2f6146cb71cecfb1c5026d6e05d1eb7bd691601eab6c4bf6aaa0e3a4604169e579f21dfe07ca72d591633d37b56e31c55b6e2d729fc64bcbd35b1be4f027f5e620bc0448ceb645093bad1ef75eec65ef66a13acb3e1b6d1610921b30b87a8588d00f8e886849c7a7f68ec477bf8c8ef4d73d627368f8176568c45d497c1017550b9015473a7456e96bb6d48ccd454821b4b8d42336419c81f117ade08265093a489f05e5e1d51a5df42930017cedaaabd1cd4b6311943ecd8f394700c8ed97f5df3be7baf3affbee0282e3afa36cc3fee60433b02618c11b341b52be79ebd6336c8f92300ee754f61f760051f98875d87284fe24550a2c00e0bd7d29a9512b10be7fdf62039638e48f2b4aa2195783bf7fa691444622bfd95fe1780236e7ca94038cb700376e5ec8f8218a7207225d28d9ba9e3b3b8022b892eedd5f65504a946c29a8bf7d17be264fbdedfc6c362b529d4c39f0721430e91984910d7bde4b9fe2d384c7a8686edaf717865d48a0225d293fef9b090463b92a4ec7850391ceb383ad2f93fe3228d98b1fc2eed21ccd062960a0b935758e2819d2d52a89ebe752f269a85362dd0230ce161dad2505109e92de333d6e3f174b30b30462e2629cfa7afa7c1ad9b956bb2e9af6642e187525a8f688846ee8696938d56ad7e9ea81f99688233b7f11ac47026480877842f8377d76ad727e50d5132ab89b34b667af1c0e5c2c72be29eb4bced98c60859dd61347165d36985203dcd3d14d3a2ba6be4c967e94d15a2005a8904c8b742ddbead74737655fd18acfda7a2f31aad816304aa0d53313baddaa075a745fd34a1dfa7af2574990df461c2eb6eb5fd84c94f6d67e81614cbba80cbe18aa42e43152a6bcfcd6f774fbef32278a9a34ad92afc1ed3988e4d6a78ceb1385bb5fb244f15452e6ab60bbd9326a081755f6c60624f69ae680e2c2902a08b24158758c8aa1a2ad268e0fdaf5bade7f65c91dcd2653255b792c1101aedb7634da12130c60df65bfb38d0332ccbba7cefe166655748d12f6134a085c09ea3686849acd53dbda26dda0a4bc18d5f5fa51bbdcf95fd5a64d879ac84fabda208ed62a1f8b1ef069d07de1ce4d49e15f2c915ec2c15519b06731627ed22118a5bd85682a94b480f139605f7ca8f77c5c97a809ffe17c2601540c28b444429f4ef4cd9c000000000000000022ac500100000000aa40b6c76e89bd766146eadf163c44a8f1b6341ed6bff5a6a46247d26e64dc9c88af7e1ab1b8abf189d18485669ac7ccc54389a8358b5927fdbe56b428a5f43b57e73c5ccdb4964442f98d044c17f8bf013c543921ff6bb5af670bbbf70d5bef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dfd489362e3899b25b78f16d2d1b4b04dd80e7f6ff0ac3bb799370aca02181fefd13684462c0c5ffda285c0d247d29d054690fab0f70df8163cf4af001cdcf0cdc38c64c86e86852e9c993475e670f7f39e1952249ddd392a8ef7997d45f3c13995fc1c4b3ec9d54eba6a3e8b14b47c5174cec4fc172f72c1f23e80ee40b84d4032111e81840f83c4acd603ab1a5f54c18d67fd0deeade793e9ddcb5142dee9c6c02260296237cf1007ed861aea85cf3027afd8a69fa30e299ba9eb29557ffd5c9500a074d097b4282ece94ad574d73b14564d8b3bc1f7db63619c7e9d9e92966646f685f46d8532432c986839bed3f9e793050ed0d01e4bd52e157f2109c67e61444402053829002964b905a55f4d31c5985559f954e0615024dcd3abde3a4a0a77443b032f86502a4cd640035affbc7f2336e5b47cf133942fab1b7f00f5f8c04584021a0213e9ea2636f98215ff45791075c033a8ce706aff084ef0732bce763b4513a3bc02066d1bed9a3914caa05dee704a2c1ad2dec604853826e863ed8466edc685d791022862314ce13fc680b75aa415a06bad52952b6c333a6d09d7621a120e050c7baaf4c28f77d57972fa637e41fd61f3bb3e5cca1351afe694ea632ff7302055d2bcb525146eec15c344635f008e0e9f632bc8aa6a3657b0fedb3810d4857e8ba239f54a155dffb9fccf76147ded525f231245e85dcc3fc73ebbb75269376f761213126008cc9dc904dfc585b60a274df1e8b0547edf1f6178d25d5895c51a84594b7aa883503c39a89d9d48a4f1741e29616a59520fdb951417d7a6d5448ce71be6cdd764eb2d698a0615e24e927232c57c8baaafc3e2bf290a1d64ed0ec9f76bba8dd8697c2f2856114d233f25ce5be417209e3d001d4d37233716ceb30b424176766bd97d7eb7c460472c0c01d5e146c52d0b4e354ce98644b9c655e7d9fe043d58bd7cfdad13ede8adde26945874a4466f3fccfd7cfe4194777aa2f547f35f4e923d9e9a01a973cc5d59f08be6eb6bf39fe76478f4e0781e526cf44d38d7b1faa918ed649a16a9eed8b490777ebe22c1ff4c4aa463e14df799786a1410c2258532b8e72728d9a1200feda67ba7195b041967e8c20f829b3ecce0474edda193dd6d23406394dc1ca6569951045acb51ac5851933bc0b4a9e24ff80c21e91520326957cedb48e972056f3c7de842d3d15c93e33ab2875725df9132c6ba45537306b96abbaac01efb283933de7ec29cb6f049ecd7656c9404ab0a0ae24be1593d1dedae3af41e725126cbfcf5438d56a5b3ddc2acd753380d39ba736069d9ac5f0e3b66dc2cb867f2b780359933500d2569cad8c9c2c9494d40b5547ad88d51870f44a9c8f9e4d42e9973bd0dcaa2336f6a6dde9dcc545a7fb491d51f714d8cb87620fc6915b79dcaec3471840dab68d21a4f232c50ad3b2c364a0623e11ab438519b7ff5802835602702b5dbff58fe4d33c90cda7f1b9c061fdf280ffe3f46f2b9687117aa4d3386629689602ae2210c4591a6b4bfba2e023cc94078cabdd6737f6b753d4ca0f758e1846cb3661736a801b4a86f068a47a08c5f7ee2915b24c6cb8c67d9d124b2b2604abd825d81252c164a1eb59702425585c5509afa82cb8394475b4bc1314b6bf09fc83c503d10558c2bcfced42e3ad00e6c71c374b6d15197f886e8273706831080b1bb0332bff33bc9b72a2d2ff51e52115b824ab35381971163cee2926cb416d175ed42a7a3c1bf9c9c50765cd0d940d77ced534cfc392a71973fe06fc482e1127b8ea5011c25915b036d09279f0f9630310bb876862fa5fb44e0609829d9a5b25c7fe7ccc438ba7a2ce7313164ce5fd9b204c5483dbb5f79638382727d521e947fc5ad11210216b71d52fc5306e4e2f8b2cbcbf31617e0caff69abc545bdb170196153a59b71dfd6f0babbd90f8bd96e2af06a8849b28b4886554c95790195a4bb8034566da70f265c90a12a79b7855b2bf6c568cbf1823ff29242b23c391a28617e1949e0bf44420fd3ab708b974485a4013993dd9c1bfe9d29cf0c822ef8810e7e97aae00c7be937d3089ba51283c4dab48babc2a5ecf32edb7d62e2f18fb4e54a09ba7638260d92119251fcdb8237d1efe512beff839a03cf1c7748aa418b7f17238f4e8555b7a7e0dc1a662ada675eda65b95743c31784e1f9280e55661155152a4a6acba5fa88c4d5e338df0ef5d651653f00822bc45df8aa20497e14efcd68db5b5696646b6156e3f1c74e6a393acd62e3de53a8d4a349844964cf6ddd3e71b37c72e7961a6c1d7b7f95d8f8c8b490e89817957fc336cfbb4f9de64316292832ceeb873b8cf98361c60380b6199d68a6268e524a0fcd6cdf4526a0db7dd4738c1589da98465526b0f67bc3302e72d437a2295563554d11bb0ea4d4ce9cd2eb842615b065d400", "65536363ac", 1, -1438639344, 1537743641, "5045d8458c88323b644c50cd8b0aeeb9657708eb9c39b2fac3f496f3a10d91bf"], + ["27290e0c01d1dd51217a12ae4bbb661fdfe4bdbe8eb96e88e00d877cd0dfe56d8cad20fdc2010000000100ffffffff04958894010000000005ac006a53534653bf0500000000003e2bdd0500000000045200516a9b1dee00000000000851635251ac65ac5328fb8da90100000000000000000c6bdf0300000000bcd0d8cbcf2b1207af8a08d35bc47eeb05d7ed80ebeef0c58ba7db9410bfc0e901eab49b20ab897a66d88c7ab56429bb7e702bde6732dc32bf18c1176d302c90635cda522504f20bc664b0e85b07219ebb704a4a8f960410e61420577f33c8eb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cbf09c984e5086811b5f712f0a6cd2318e60bb07803045c2d95bc5f9a31343f775141e1beb3e52d04916047f9c274aba294cc6b960d4d4b721a888e4fe61cac2d92680ad20343fe56125453a794bdbe78fa1543d4c120a5205d204762d23060b85503adf51b201673c497cdc9d62d753acff65c7e0855ef7d5eaf5974023a6980209ab5f214603ffd61df3666a7518d1a26da685db629deddcfcf68e271a5f75b703060b4ff91d9ff90e78c44a1634041f0042477850008fc599445442e3e77e57920a01056b1c4e1dc5e902e315fed7c0c60872046057ea9c170fd9f9a6d80248f1731466c44b48e8a8bcc14fa154cd99eaabd58ac7b00050634978dae687739d9b69022da9ae6455a4af931fe142e72eec114871086a8078a13b7b940d78c21d9d6d6402121e6f9587074f9d7f49014120360a07f5abc51c0ca0fe6bd05ced74378d4d990223c0815604f62fc9c8c151180df7b6fada93598a6aec6c7f136f03ddb1ece25303072a2c806a9047d99b33463a79d539fee26e9b4becfa112aa3ee2d56f5e17d8b0225a7a49104beb0c4e0938e373718a7422f3324beb30df486718d03ecbcef54c3e2e016415344cdb9312cf022d92d4ee95bee1d02eca7585168a41c58b63410cb1bac07ae432a4fd298cfdf99c8d638ccea1696e40e40a0f0f3ec37d437a65bb93a7adb39a4ee8194c2cc3e93b474284ad721980c45609ae449dbeb080f5d02a3f0e10e9e91d7e06fc0aa2a85e1df1d7ca8671bff7fdb56d2682bad410f6e03ab4e8df6c5440a406da4873975162fca82cec5b759675e6176e8481d733e83f720eee2bfe7008cd9f624344e1f727a796e386fb97aaa9bd006c992d32c7e00f3a7de51b57571eb0801f5f65c57f4e511bbcbefe4540ca636dfd1e18d50f5928bce62e5a4d3b8349e92b775d77b49bad985ea104a2570a30a56df794e5534d98150186b4fde294901221c25aba1d60124de301504b5053a5dfd9fbe2fad35def338668a63636318e012d3302313642d3b928f7fcc13e3349129259dd428410af1d48cd1f569b134a28ac8c0ee60b111f7041861699a81708170cde862cdeae0335a9d27e8a55536289b09f019aea4f349251793300a86d2289b97b7bb9763d49229ef8e635622bee0e195f940391a005ada4eea194b0b8f4f04f73aebb40739a79947e8e7bfbbcd35fff71fc8acb5043aae108741fecb4cbaa6907b293f46b9b5c7c689b885cca4a3ec9f1b0f788cba4a336d4e10fd2f6d71d72dd7937f4d5345b0de2ee5f3fae6ed419aeb548bf6ae60c09ee4540e34351d1f192ee5cdd6f25033b213afba2eb7d3f7a54314ab092c472d2a61b395748f4f08c6ee48f6efad599f341bc0fcc8775d07f9e6ff5bb2e95822d59aa556550a154a8bcdd52f66530c67ad1ac6f711ed23d03520bec72ac54f76dd897447977b6659ddec4f3af4209da726b0106ab4bb11ff06511cc7d4920d27a5177cff2f81bf721c58afb334824016f9d37024d8ee07ac1e690b00c913352e7f51f1c86d05219e7857bac10b71ecf3b026b713d2379ae977df265b1353b6800e79eee9fe9e305c3c9ab6c4affbadf28cd8b71f4804dc9df661243bbf5b97abc08dd9d7bf377e3842aacc286a8bb8f1a06f6a4dcf73807410f5ce412943d6c20cc768083fc3897c9b73411ba0201bf472818091302190e58305703034f511fe6a7974469a76a0302018ace5dc1ed7f3c6d371cdd4f6f433c23a57b035ab05b926a69351c43b63f5bc111570c731cec196c8f85ce049fe778fdd55b94fbe24d7cb0dac2323ec09f1a4e0ecbfc9809e88375710ced3bf9e9365a9fdf250f1ff018f9c35c439598c1f986c6d16ab6ba024da227b144fa678e960781438b023ed80cde98bfb2b6e5b8242aa6dbafa9cde7dc0b118a5f9f81d6fb1957850364e8def76508e216fa0c321ee335276427070d11e799b2590498e35788b930df623c59ee4db56bf0b884f1b73a53d45791183b8049479301908c29b1d7eeaaf07333b8d7643714f066e18d25f6d45d409bd2ae96423a7f45524b24e26cd02c2e565657a51b5fee9853e3d07cf0e584f4ac1ff397cd1808dd99b3c16c0c910a8088876d97ea4719807fdba7d7eb37334cf10825243ef6ffd11257b413802a7f7c3ddb428981ba467704a6ddaeaea6a5811d0aeb4620273641063b02c99f2f4bcbef9621cc451444cfb6b1d43664a36f1677e9a6bb7660dbd1d46096d13394c778098bdebcc81f97d325e2d1d7380717c98b7fc0806c3a4d3465ddbb2e31afc8c76607934238fdfabc782a813ac6271062349b65a78d1674a383d70a00f4cddf52b4e852aef7c950a52420890c0241aae785899c16ce7df037d004989a12d3d58e547a9744f4c291a2fa47c706b59aeca625a1c6837743a6bfa3b020dff724cb978bf0656cc0d", "53516363ac65ac51", 0, 1436337339, 1537743641, "f5fb244080ec7c9b82b85b42446d4b4bef708c07943a3f8506e9eebb0f7b8e0d"], + ["030000807082c4030489ecb60d1a8ccf9e5eb4b906b85c6fb7633339ac7526ac246b6461acdef479ed02000000008a9520dd610d60f92528f5760bae1bdc0041bd856f5a23bdda8e8080c9158df16153aa1a000000000900006500ac530052531b84f67016fdf7b91ac7d35ce12e696cbff6d4618abb80cbbe127026bb2e3c2456ae26c3010000000253ac1e8439eb92105c3faa5b6c4a7ef90d92f9f7e06803090416a3f9ddcb609ae85560bce2d101000000066500006552acffffffff041698090100000000007650e6050000000003655351143df40200000000036565523ce7140000000000009b6547a6000000000300000000000000007114420100000000920f379adc5168d46faad2a89c6a7f9e48fc493bcf8223a67062254dbfdff66acd41f82ccd666975e08ee8b75ec46862c77c822b9b22bc2a9c76bae5bad31b95db932de0dc6cb151552b0733b4b20c0daa9aeb7a60632c673dc401e91cc979cb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003587675e37745eed3c53b84580e1392ab36547cad46c80b71c5fe294817b0bb62f14a693974494a69ed9eceb722aa79b23207e2a219c5f9ef3813868be342e1b015cf3b073ef60fea801cf4ff385181dae1f4f7c6cb69ecb5637ad773d9e8212b79d7e32232b24dfdf2f321f4b310b2e100e65e37ca1b12ce81674bdbce8b285022fe59df6cd92ff1bdfb19e24a6a63d5e45570bf7e8ed54fb8119f5d7362fe5c20313b34ecaeb8b6164203adaf37214ecdd87787239c980c5a1724941dfc83eb28d0b0336265b110e4a83fc3e28b7e28f4ab476f9654ef445cb60ce1e6e4ba0ad9fc4df12bd9225a8c144ea97c533abeeeeaa0abca73efa6aa206da09ac15ea81ee2e03299de26f6947f58537b4f918e7e9c318195e6897a3fa0949fa9e71230f3b829f032f5d9a2fec49f4cd775d74b88c3aedbff75c7d45d38f4ea24861de2390091518031db087b12836aeb38e6cf1a24b08b2e401f61032f1890e2bd6096ea2a19a7af6032d695a73b42db544de74d259b45ce8b68b083b5315f2777ef8ece6d58ded9ad7031bcb665603501424e25949f18128093efc36c3de737f62e8a700913656b01191a269f9f2562eae421b45bd8c828f1f1cab46b1783ea77dc313699dd7e6a0944fd7fe65d989b44aa6551ba60354819a5a929de69ce7a4a3c826aefec8b73a027fdbd5045078c837ae1822ff3a926a9ba2260bf52f42b41b77d8113ff99f11f11e4edc97c2207841bfda5a9e433346de8f3a01a982f6bcf36aa22f1f5676f46493ac1b6edceb460bf8ed0f68d763fea978625bdab928314e6bc8f9b0c18443502172fe7498d30dd33521ab059e5e9b959848019e226c31cd4fdc93ff8003bce46925a050e5948cd3e14fb06ab7ea2ef22da88cb240f6c382f764f40a369c12812acef2b739467a388e5c56e7c193de77f3aab11e822a9aa498182cf8c23e6dfb039b5d60029dbf55b075fe934f54a99e625d41eb51a2dca8b8f8dbd29984e74cbb1eb8a37a1981b77f847f62e01abb135da23bc843aee5d782691f5137e858d3d04b41a0f068f7249423d033bcfdc97322df7484d5cb661a53ef77e704df84916378b21c324664a9c72ff8866174389f74fff9b3476d8be1be1d4fdb7a38f7a1a1437bcde6e202c28f2e76cae5bb12281f3918adc60ba4679c9e8a93e0c17eaaf78a1db797589028d330578e9900981149215a4f4a047158efcc1beea4473b8de9dc07b80b71551a6f8b60b50df8822fc093b875507b65f191bdff35aff9cd122c21da9aacd81710f2a028a402954b090e580b7f2693f85a15e78a22f06028feac141aaebeef31b9139e3d46172add2a533efddff863e8bc17f81293e5a71f5256298365037f250b306829adf8798335e6d0105ef0aa1768551b3bd967b74cc88e6f1fd86c1ca2ab6b70fd9e45a12eab98e495579da914dcf2ee4939dbd03f57f5e716cce8bd278d1436d2187e9f958d73b58e811b24315171e418cf4de649eb1e84cb28b0f9d9c112b1d69b91877cf8af53619820746c7e31563b9a2c94bce7f30d656f37113767eab22151570fcb4d2fd1633b85c1b45bda5ba65841821e29ce6481af4ade4cf1976584d26d16706d0067ed182f3cc1df6919df0f5c2a9ccedc83dc61f5792ca7fb684ab854d75bc0877c657c6a0e67141907b821f02923f8abaa6c82aade2b1f6ee4024d6ed4da6a2d86f89c168583c9b418b72fcc5ae4d94b585837bfec5775b37119dd62984c3ce430aafff443a2525a6e6cc7a9570ac8fe911c7e1652ea620c4b2145f969869ffbf3cad0fd9ff35f3d2aaf4b16d4e372623c73abd8bfcd447641418a9e0becec06901bf495f3cf117f660f2bfa381d8f7236cc733364eb39c1a41814f7aeaaa657ae1398974c773a28e85720405a9b88f031c8e668234c2c2f9346a99a32d7672efd1d8f3775c70c199767e3690063993d7816866d34ca85ac3765e5b2305c5c7da38295df24047fc4cd68a3b30fa230cd4aa9907d746ed8cac67f296633083feedfd1e8d90976334a66ab79a56fac7fab6e1dc19df86e4a539206317d71fc2c8ad9f221c5131951e85c7e3bb71c2586bec8c2cd4d8330b5ff3cb63f33fe0cab274f6364b2fd9c6a02b2df562f67c2c92169a62b711c4d6a72a5ea12095cecce07d7801806ae2ec4d7f82fee2d9b3a4e87d3cc7fe0a9467031f97523ceb0c157c0e7f5e87e2b3b2c6bf8ea67faafb7488b5a835d81402bdadcde1cdcf15c6193544ed07af1cf7c867a6b2fa3bada6edeae65d3cc8cba9c5a8e371fc4a5944aa8fc0202c6564b000000000000000000000000002bed1a21e69725c8d65b0be2cebb3d96b1b9c4bfb72cb60085fa02d9e2d0cc84a9681d179d4e6479e05053883431871c8f7feb8236e2b98420305b195fbc8e3b81140c16ab14fb049bd796855703e3b587a3ec50d07a1ec22231ec2e2172e9f400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d9f7ccf84a57b94a5bf82c8c9684ed6c17ed43bdfd6533e706f5f7237ab878df5b3f75fa2ddcc6a70e23f8a2271bd8a64cba6567abcea63ee8b7acaca71d84781e6d53201ab2f7aaca1d7a9f477f041271f2a96b53d69ba12087fc6d02ca2e7b92664444ead0c8dd519ea333083f73c0f17b47299e1688ae94d01bbb65494a0702007cb5ccaa47a87519579d9df8bb9c7a38379af728c6b5415d098f2ff07b9b3b03075a32ea73153a6c329378026e6674112ecf83717491d15c03b399b90177c6320b00a309039763a8b8f6a008c583ae45f723adddba627cae73e4a64f3ff16b9d3f6d34493209450ff3307e133f7a28545bc8614f202f058a1ac37b7cc76722b02c031921c108159a7df246f33cf0c2e53518aeda3ccb890aecff9fe9ffc07896466f030569030d190cabadac0f1596c550b00a0cb3df1a77753839660cab4468bd996b032be581cf01b7ac06811fd5f5d873085d20c01dfd96947cad915314cd7c4b1b8c030fa6cc18093f06155533bc046716e08693db285ffbf1113b80d85f312a82ba01032d82e157015522e8d55c5fb2b8a521472b70d0450d47bfe153d24d7cc9f83152a3de24240ae390c9b896f64101a9e4ed8e3a8093569d9d8a8ba78e3b827b051f4766b4dc5bb0106ab2e05d3c57779ccb44a1bad9a41136cc4f4c3eeaa843fe855dd9986b6e102446cf73c5b87e483c425fe30fcfc52245f51cb54a062fbccd119e63d619109231bb8fea1af760560d162933dd8360be092f89ca74baeb4293ab9be41f809c9900c926428536659bffad882ee2323cbcfed2de1262fe3a7b27a5251aecd8d02590e8ddab7af5038929bc79ee3bd23fea85336fc802b454ae7ec935ce122a30fa95ca030c3ef11a2a066a7c38565c886ce5771d24a4d8543b020505b234b902d29cea4f0df305a501b9ac9dcd54b4de0cacaf6a3af245fde62379fd50e3ffa0f6d42f48aac5cdd596218708d8c39cb9b3e410e3ff30ed458e8bfc8bc9037225e4fc728563e91a3cbf1db7ec79a3fb2e048f309976d2335faed305646c6ff225a2b1d592bbcf5f31dda249ba2f9f68f745974ac4afac6fb3ca1ceb3a686461cf210b34a3a5ae1d541b5733d4b5aea1bd2c5298899f99312d3839f591ea00739d78787e14ddee77cfd4b5d1e4568d15de9971afc862ee412ed01dd304a7f12790cddd5de8dd271dd763955a4fe8593c32793f97690919dfff985ff4e662f77da91d049e8dba0fa37955359144fbf1e15c803f0d5057a90492cf7b120e13f3279d954aef3f3ab85d2d9c0b21d75e4953d9b540cef72a2bf70d2d1df8c67e2d638ebfecb190974bce23101599a3d2c6ee68b98da12e270e12ae28bc5dd5fa9a48c43e32fafc4391b35caf0d0e928fa6a3fffd98cde0ec0924362df7ba21fa72aefef75e74fdeded5489c2c67be3f31b912d1a38457ef09761756c56de6f1bd58e0e31cf8e84ed4370288e6591ffd27f4759bd1cba99b63d4b635711386e37e837526d92d2172ab6d3e99c90487e98f68f033374771290a2d87ab2f2ea9b203e73d175a8d407ca79ba7c262aa54f4e9537a71f864b44a46f2e0dc9713e67d8c29154e63bf56017d83c3a9f87cf39225e9ede1cfa972d80123af629ec8dcff38f19aa2cf6581854a9c4b7bea3049372c9e1e58bc387787424fc13e2f9a0e8f7464fd9042b8c581bdc0e8872fa6564b39e33ed9c3097f1f189a83baad3fa15c5cc45e441a5dfd8f8bb4f83271b6a6225e3472009edaf185eaeee868f13ce7c1fc99d14995180ff815f1d4c84ecdc474bed8909f1392dfc526b8aeb0aea16ce66040f702a692653a60f0bf3e563d724f10d60821611ef37970f42a6fa463d38b096d616f45cd1c2db03c0972b58b9568cfe3e6b6d70e9664be1f4f476b791a9e96a415e85a8f4557a4efb18d26447e19ee9c8294c1220ad0e56c70e73f6fd93c629f1cf09b7516819fd958f463cfd1a0765c4081dcfeffb33d79d4aacf31125c2621c9d136d58ee0705fea4d526e67e21da8160a0f62d891f550986e69d9beab7946b10a3500825001cfba6e575098379d66eb7e354762ecc5059b11c1e461c7fc810078e31c524b76f0225df99a2b09cf2e4a94afdc6264780a0e5867c312746c01da52ff7f75b67f3fbdde4211249e1de571bc839242b91a90c30b63ba7e53f219f8e8d6b0eeb4fab6bc5d63fa4780a72e95be70ce118eced9c3da6d4f237ad90b1e54849b35d8abee878b75e6f5a8bc9084b6074ae6530d26e4178f2e36092c523350906daeeb836e1da7094f5155c00000000000000004995270000000000aaffc28b890b97907c3ef247b8ec6bfd494e6559f9a286e292dd4f7362d869718c2262f0960a797d50ff954d270907f9b0707ebc21ad780dcb10b88fcc4bce22fdff4c72d3383a76a0a3d3d25c87384d34d482780c343bca22d306b63cb0d4eb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007100db64b8289217c3f463896b26cdee0668f2b441f1f7e8781c84cf438ef3f4209538e1670462f6eb6ef942923b1479668bb24d02ca902d29fc8f0e3431a155a008dd5e3ff8c73c96d7e79576cea10f4446806fc7a67ded086dbb68f2c08bd07f045ded1910afe1c62af3fd21db457b68e4370644339e5daf9066120fe99803030c15900cc94d8451c3865d0a759b3977788d8798564f623934a0ff149bf713ae02085e7038c6ee9a09eaad86185074e412eb564cb210397733d81cf18e9247b4a50b044b96a363a4c8768a32b156379d3be3a07211fa1815c6f7c13dd43194125956de0877276715844430db91a3178735f7b9a9e9cb9918bde45b893c584c0d8f0d0311ae7281c86e276e26c969325cf13cd223bada5cdcd615b04fedf0dbbc3bfe730306bec11af2e0759e4f0221ec011de179039d31f04d653b898ff374211c8b9c7f030e63566e45d79c56d05aec578a14464ce6415a770ef1fe466c0c5598ae952d9f0229922de3685d18a55df964327a3f53e4a86ebde8d77e5ea692c6c5b3e29a64b70314494bb916c3eb6c338a3a73b12310fc36058c76caba0a8fe36b904f36ff394301e7baec08a5ae81e264f8589f1eb55de6dbb20463bc3c338116542ec59c179f27147ec036467027e5e062959e6107f64b90210dab7a294bfba7907eeced338eac37f9f2550b2f090c98d3a1efdf4800dcf69ec662875c0715bc6b1634ef6b1954f3f2bf84398f69df9cc0a3d67cb0bbd11b51e42b75033c7fca640b403304874c839c9b723673d8d45ecb62b4bb717bfaa900fed3f0b7803fa00d61e559d82408b5144c96b8dfeb7fbd42f88ee0890575985f5569686a3387324f108dcb31709a2b7761c10af460245fbc546fc50463bbfa9758eb1eac134cc0ae57fd5cdade62a56683645d1d529552bba60e2a0623085544f1fe6b32d22f5be0dfcd167749283345b131c88426c1f6ec8be0f708345364c3fc9b53f6fdb712edea993ac5f8d8f0fd13fb051907f3cb4aab3f840ff9a1ed502b2585580dc5b7251dfa601a2761f0574cf891d6f86dbb0c72a02ddad5468dfddf52e8a5d8734bbeb18ff17b08b9f9f4dd9ac29d695b9cb21fe571c42739070037bbf12e1ee929d1dfada79ea7462fd1764b7c89ec396b8a2ff55a3884f2c8ed7b683770808ff8f1679fbe27a9bf8145d66b0bdb1961219b057f6d0449c093bbb6213ad495d9a0a5bbfadf4aa768111b99014891f2f23ae6052b0e0fb335249abc5469ea83c5d705969d613d623e16fbcf4f5d868d784051334f753972ba9475f3677e3bca80750dd7591db310b2966550fb29548fc692abe26e01a78636339e47fe89b71ba0a9402877536e4b6c996f493bbae59b569b39ac509dbda508268d738de11e3aa3f7f88d48a17bf71930286ab135d136ae38b43ccba0e5b8062d9d618707fdd234b0c95c4cd5ea7686a958e75aecd71d5f896b5d666f56174331ee5f0a0467bb7ba826dddc3b4b0f6da5125b1e8ee7b572e175864c133d8028e44ce8b4c0906615697c71c8302940580fcd32551a13052361b66e3767d683f1cbd70695f15ae445dbe501cb26b175c34116e291fd1b657ab81a7f41b7f68e022090b79fdbe7ab468006bb07948c90b0b392d756fcc1242fe394166100c57c8cb20bf0627b32fec0c9f4a2e3f9953bafae9b77e0c2138e5ce0feea277060b04a9cbda8fa2afb91a3f56d9bc6fd4530ee9a3dfcfef5ee3692a3e9227c9e474379e7d3625a9c07b5bc6d298342b215e0fa29181670b43a364aa708cb634989aac1a8ffa8beb20fdda99d5e789ece2c11120f49768c7bddfcd8c9ccbd1844c0d7f98a054d637fe46415294cedd2782c3e7e64d1527a7a2ca5da1f30b84316e03e8651165a7c0ee99e1dd86d530051e911829c86f2e59e38b18e317339f21553df41620fa6d3ead7ce275538fe746d3717555f79afba8f37df803a810bd5ae2495efe0094b3fe86f6acab6b81077b761cec7792cacdcd1f619bb3f6699199697c513106905e330b15b9aa1c12207cb76f0b6bddddc2fc7791d7f0fecc2cec130d3657e8fc809145c4516846fcc5aa728a1ee1d528546f7d4c6450f28fa5bb5eb5cd807ed5fffeae683bf2fa2041d2ea5746775031ce61481ef0735768c541d8e538151347d02841de9a9b066543229a992953e62db2c5a23b4a36e0cad12b1dfa7101710f363d8f46851f81eb6ad52f48424b2fb34d70e7f3c13bd901fc6baf165dc6b3d9c2b3eedbcaf99313b40947a261296293e70781cc08184e52fb17ca9d44935e29b77d488307218dcb9a1e7dded5b7c6783a8b3840218ca859a7e17efa203d06445aaf3bbac2f9006a9a93c8cc0078bf7811d587ced53465089a9060d98e0ed363ea595b218bc134ff3343348a0989bc51968bd9edb3363a3d224f3bbcf7e02", "6a5151536353", 2, 838720890, 1537743641, "88a4b95e973374210233c4171855bf1759cee49fe8bafec2f7c6c0b3e4e4b4e4"], + ["5e71e66504777507c290df7f70f98601230a9ac40ac608eb41e6cb99749acb3b318333400d0300000007ac535200656a0012e033a6730e3001e7cb47ae4b8b6a6020986b185afdeaba2ceaf870cde98e544c8e4b3c0300000009ac5163ac53536563ac1e274a399d5992059f9dd295a9771f17a59c3d97567de9eeb3efba7215c55dcbac1996810300000000ffffffff2f8ad0820e4f4e97aa24606819f9887855274a05ffd23811d719ef579b70c43f02000000045351536affffffff01585a1a0100000000096a656a526a536563639663faa900", "63ac52655351", 3, 1045453202, 0, "0142fb7f8ad73460646c616a53a13821c9fa4810ae82744b77eca2a81c318708"], + ["030000807082c403039f20ead4a79aee4265eb922eb980e58f3fe6619b45deaebcf4554c9fcae338160000000006656553655351a4d8c2ec47dc57d7b6a1626e9e754c424d8190b3d191fd32e00563e0b824dd544a3881b101000000026a51ffffffff1ac751ae49169f100a061a1b8df5c20fbf0fb113ef38eb990eb27a54bf6ffa2803000000036a5352ffffffff021784ab0500000000035251ac8cd16d0400000000036a005315466ce800000000020000000000000000ac9748040000000049461b2c5a86957967f13b96dd6a650bda22ba62f228f6b701907a3c1af763b9df00f9b79308f58630369e488e65a66bab57fd8ee82df9dc76eba7f58ca34d8ced2d71dce7738d4012498424e1d2b4328790a9c58a4ad9596cd890ca8f3e8f1a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff71a3a3981ade570acd7898324eca1ecdb0d685224b421d865e57fc9e3c968a35eb7662b031e3ad3e0bb8b57f3d4297320be4c2cac45a53451f4a91441b9792c3c77441d459eb28ff48bedc17ee65acee543f21fe14d0d8623a1641fdcef02c9fe0807a12891c54550930708323f16f8472be205725f7b89541a50844664b92021349aa99a2e785a0908d0d4949cada6eeee761c959fb46c432e5f946a8c433b203024070b90226585876e68e7a4c7cdf884988854452079ffffb61739ab4a924060a08f08b53f64da80e633a2333cbe33fe4e565ba0645872ccc975d65c3f0f380cfafe682932ddd1297d47b5007bd1f742aea48a9f72e30a090cf5d0a2824fa7290020ac44126bb0cb96d5e48b12c1021a9ddb440d92496b46f0020ee9a3c995176690219bbfcb14f24574f1831cb5621e539b9813ec2df755bfecd438cf043f615b1340307f3b39b332e1cfbe0ee2e79169fd41c676972fbd659219eaffff70bb448b898031d06678719c71dd2942a38d7e8ef76579f84c9414b8be63cf98e6fafccf97ee503242dadba0544cf6823f8b7bd8be6b0d988c3f3b18932e19ef0f7f21546a5eba47c6511ece4475c096025cd5d2a0e1ac01cfe021bcf0d97e8ec8c32dd5b1e86a2f637339024049e39d93570525bbc4ef0f1e5843af78b23b71e1e21fd282ff63e3e173bdf64a79c7e09dcf5186b5ceb4be39554cfb0c090b2782c306fd200c9bf0cd3b74b6263775443c0d9037c66f63d757cacc338611ba5ead4151058d62ffef26a8a74d3e3d37adef2627f9c45de178c4a5e3edf69fb7a3eebe5b1db903fcffbf34e2732d58cd838b617b5e3c23dea8e0503befb86e74c03bfee0906f467c9751c6392c152d4914bfebc013d75c077786e12d5554b40a2b660dcd42ea07520309bd245b7a6800d9c0a0414e33b8e1d4d408137696dfa84f6e3613716f6aba78e189de9fe06ac399672b443f1de1bee4eab3417043cea6568d24befd7044a402945d59a9d0461260089b9f82fba799d09bec27464cfc0331f9dd2818bc6d4b5202e8cea17dea750d50d7ea013a0a4ebb074b2731b9f9923a261942a747ae670acfb70552b24c12fa3afe9e5160c438322276708f625d49d42e359e20ef6ba9730e6ddae9f00d9157c3d2fdd78c72777ea388748686f0a0d66727d8a5f08aa833df91a4d3203e12174b5eccf4d39c98bacde79e836641b04d427644ff1c3a2f150ca0c2b1874b62062161e8964f59c2d2a7ce18d7347cb464e635ef1554fedfc5bd8e2642b8e035fbcbd3f6b2055e486ff228af4b9fa1e5106db143176811de380ea0a03789963f18c02960f7ca4a8239d57ad86260b1cd0e1db7fefa3f238b9c2ada5d78d9f84916d7a3cf9f603c8dd3beb610b9ce851fa4ad8c2b26ae5fece0e9bd961fb1d550c95ed49c0fc081e7f677f81c31741220bff6c901e884346d1ce324ff78b326bbda0c7d9ed459f5ea34f90283cd81b8bd4a24e3e88c78667089d3f1562a3b9b170f433fe3d5a8fd21788fdf3c02d57708660d87fba55555ed8a8296f914b1461b25822f49fdebb00b50e559b4fec37567a3b16b0e9fd4d864999a1a2305f1458a7e78dc80e7d21110e1eb17ae0785ff00bb3a821b0e1105271dac2f3003646afe040f5528cee0a2d0639341746ec41936b8609d1979c0c782a11b354ce140d29799efba918916b2e0104be9227815170e20d81cde0decc2a27816a41109e7e7a99ddcd3d7d45244527edb8467b0fc84c18a6819d6b50550654c694faa9be410dfbef28ca176020ffce98f50f0c5be6ed52a6c04f9d92d75b5e0bf920c4a7a6dd8489548cdb7b9d1e6de711e515174a78525237d97414520785161f7f1bbb12cfba45529024e7d43685bfcc30a21f2767a081d50455d5cbf55ea16129f6e9d54a8975b03e94bbf566e0f71472dc61e59487dec7d5d495293d6a508e98a217f362057e238ae07dcb4636f0d943208879cd7de58696939016510cfa4a2a8cb4d4122d8791c814ed0be137c7668d8bca53aa36b7025a35978874710ec80198054d4dc2e45093238450c7532b801803b18679cb9d4e552911f4e6ffddc5038a27f68e555f8161b79ff86ee1c76d52858d2f1e7ec93cfe331a94a780df1cb062f869b7b8d98934a46e4eb9673bf70c94e56fba016391be2a0ebb80e6c5dbe512013d4a3bb084e99a0bd8e7091d246564c1312bf0d8ef7ab89f76cbe556f9a82e2de6edb29ce48abc15875f4f4123ac67c7f43efe4bc9e20545e7681d538752bf3aecb1d3e475707f44c91fff95148ea04b050000000000000000000000008b37b75dcfa818fada38e27cb438507f09f99d9818d93f3463c89e662595564578f83abd87bd9a9fa1e8813fecc59869fcd3a4b733eef6f6e270223f60c2b316b352badb2fd5d503be9a0e3b3f5d70fd5a31930a870e29b6947bb59214e86e1b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000246af2c0caaa9e0c0b979632df995fcd6c739a499691696cc77f394471f92393bda26a5ba53f8d42ffbcc12ef515374f029e7ef9b06b151fb61143bceac022a13e44de3a1b250da160fe450114c3ccdb6eaa4117ffb23da21984391e8e8412e54805c85824720c60095b31ca6f4d00301cd4b566a76a60ebf6da4bd8f1a619f502201e870095bc35ab5cc621e45c7bbb79d509d416f8177bcacf6af79b3c568ece021453f5fe03cc73f4ad5d52a0d74ee6eded3588ad143b19d24576d13b494b4dcb0a0182af3da2b41d5a17075aa1a5660735646bf1e69b022f0eedc6c59cae179da435ef13221c77e9d4e3c29ab4bffc7c30821b2abd7670f5ec4c62166b28aaee7d022ac5ce37fe9be20052a2ba119fcfaf813d22eeadc566cacd377ebcf76c1c829b0301fe9c7e1d22ed1544ba0e42c63887cd3074982933aa05ec22534912b0ba12a3022b6630a3e5486c9735b36587e31547c6980738679c027afa4ad4a964eaab174402135928ea4340e2c02f6e2088b79512a3413f6ce2bb9fa9835635a1261b2d237c0304d6414bc70d2e3876577b25f2835d702f4d817b7d90b89ccb5a6397008a567bd73541e1672a91a72dfede70544cb03c43536b60331a84c5df860b67007bfc15a07a6a0702981f55b9c4d04986e042199b17f721ab4ea25fd97527b569d54a24bab578dcb2a5a507243c12712bdf760b26178a665479af9f90a32b2c6f1c96cae467720e4b3186c9f505b0d5b0aa83ba6eff46c06f506c0a513e83967a4d26797fe0b5fda0582502a13c6e7c6ef4d3a076483683c39a4c6ac91df9d88025735afc63ada9cf0d79801a7c29bc413c154759061d6fa0c3d3bd54affa457176fe079c52cddd909c3d7736d44d2640cd3534df718fcf965d6278de61481d0bdaebdd578639436ae2a2e1ccab5ae941e64455706abd82de646154baa95acd9e750bca5856a4ac4a2e6106523db7e77ebc3e77ae3b8846661d55017c89f9501396cc3b4921329b2d5679e50d97d52f8c0f898196ac0f7f81b370abfdd1f4dcb435c8dd598092fab6a07ee6d62c8ff44f84169cb0ac82fd959b0db62efd5fa3582c7c550e5893df6e9cd549927bc9e2d385ac661dce6fecb70b5f3793302462fdaf189c00d03fb23a1d0d224b38840fd0d171f41fb93382c0d922c11c4028e5d3fe674f20ce53e190b051fe713374570aeb09c506bb3aadde5d6b0e638a3b96a6404208df9f80cec076f4c39b5334ea7e8edc8c50b674b964357f5570b4e2e9995caac38e237707233ef13481c06b94608d9fb235f5d502720c842a4d37c5ee526c94688ffa47dfc18ec95e2e764356189097256c7c319caa6f6f2191ab1b8e6fa7e4f5a9b707709f1b6cc33fb726be3df3ce0259add97d1a7646d1f199a345c1176624d482d027812ff013ab0a72e6749bc201344752e70021b2e4b04f1e2b9f0b54cd12ed28c27084fdf29d7b02a8952eaab5f496c4a6f10e3774043066d5ab46a5c6a66b4755ce4e325017f36fbd73c00ef318aafc508ba9edd41cb1a41a819470416b218eb3355f9e70156f9d4b686a20395ef490336afdd988b7527b0960f7be22f3f8f9d61fc4d84b3560b56592b61a73bc4fda075f8a971fa5505972a1aee90be20e97985cf5285adee69fd30b53e3eb54563a9c53971452b978f96b4ef0f0954c985948fd871bf5828a842fe1fca01263433f088b14fc8e139542785b28e907f0cd5e6dff0830b4cd05d8b417d6db33c0202f765e643efb84c6a4caca94155c804ccbfe6759ed238d518f4460762b27d9b38baaeab62d09e32a883cbee95a11649aa2a58d7abd2c5c3f521e31fabf562a5e77c23b0eb4a5aff1f187e86149320658f9807a997fc1b40f54803a58f291319ed49e7b215abe9632cd6468ab3a925aa30585223d09da5412d0586f345594f40857ae565768eb1612aea89d4267d12e4c246d62e719ff83f77105ab9ddb3c4ed3fb00b372fcc36576dca9afe058209dfd9ebbc0e86e4c0368d3f30ad64331a08a6040c012efa305ba477f37a805ba7212a0661b1f1174e76afff006a52adca3637c6875cd6d3c378c5386ac19b355434e24e7a8690f83fba423e1f1d0cdd644ae4f45d9563cbc1782834d9a175e81aca903260d44aebcebccf80c6713284d95e197fa2b749c42a6d03114cdaf9308f9ebea0b193f6cc2e72c7dff9583d788713b9cc640b3af6976607adb10c07a00d2ee98ba3800c9c0c1d7c3794856c2aadbf568499c518e470637a869cbe48fd750fd2280454739b2791ce9ca2b20434764791e2a80e247591df6b1c40b635e61b724768b60028bcd71ccd23ebfb9bd5cf2ec219422f79a95d1d784458e7da0099c0d4ce57e105b1aabfbda121a04ca060c0cae9aed2b9914d6c3331304f779b7c8e24a8e8b8d0c076af6b84f52878ec4c401", "53", 2, 134194196, 0, "d646e5eb600c48560e31e02da319c01725d08e6a10e7221b5bdf12aadee691f3"], + ["2010406d0478d9769f380ed8f0464aa75e0b60f58fa8bcaae06b2bd678229509d1c01f443c0200000003005300ffffffff4b8ee7ad5c43d7521560ab6e68f03f8b2899d456f9422926830aed753608b5ed000000000765536a006a6300c7f6bffd3ce7b86a579b768b6ce8a1068942fa96c5e08f382a3f9b2a8c920dfa271ab102020000000351ac518ba4370fd2cf0ff232ea59202874fbf1d89cb87ca37ad13ce39d08ae929d97e927016a2c030000000563516551acffffffff01e0302a0400000000066a52516a5263f9fc3b940195c8c2030000000000000000000000009c566411feb500fd75d098e854a5202f96ecb40326f57fc53d6532c25a93772a3a65f6b9fac97efd15f6b4b7561acd0ff728525bcea62533c9613ba17fdbc424905ac5a04a04bab3cd405ce0033dbfa3409f0d09be50937574a5080382090d90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006af7e9ab5050d0026846fa47a7700f7ecbaec1c336a718251448df128a7cd52977b2d4ac0bd4c3133b85e708422866c732c4245f9bb58cd7764abe7bcbcf2d3f3be762cfc58beba6b043f6e06564f9c932de2402fb60fb9d9e4136da130948a9984c906a491b799210da42ebbe3a04b5cdbe311867a2e311bf73eb5fd801207003052a276bce613130e8abcfe8b9f3517fdf9fbb18f150ebe496912e714851090d030e3ea58f2bce1befc450711f6a3af9a610960212771448d7713361f1ff277d720a018ac68a6844a964aac0b85f487fe4e6f9a5eea07e6fcc14707262112d6e69c9f4e7639c17b9a9eea165b83399206f534646a55ee2d848edce5efdaed869556602257509a07ab0becb59f000f83e5aa8dd98b08e5fb7e98c0da977834ec30efdba032e66cd22429b5728f037e8e6e79d37041cc0e1a6aad2ff677162bde8a0b1266a03020aad0da1ffcc552c2ef593b8ae0ac51978dfadb3ccf7e2452f2483b18fa056020297615dbdf96db6ae8682804cb64335608a1fc087a3403d1986af8923463a3003216988a0206ce504f90c07420d8c0cc1edf3e1b136c138298cf3e8aa77df4c452b746a3484990fada316d1ba40dd76939d15ec8cde59454b17caf36802b519656c0ebbd875ee6a25106501ba9a24df6e5f30fd7b599d04617e7da0d4254fec956d078ef5f3cd69f901bf6791747c78beacfaefb9d1ed708ef433fe0bfd3fbd8c8dbc61b2036f8444112c9470e5d046a02e1086dcd1dad5f33a8587e0bbe165ab3c59d6fcc49ea17eaaabfe444a27d0cef69b69aa9dd6f1f2fb491d8352602b5147bece27ae1091a2bbbe670e1ca39014b66a3615a181f3922aa7f82491df5032c4b32bbc0aed127f4d17ce18771b976d99db6b83314ed9954de69188870653634e589111faa334c45b40f0a32310dfd4c8742cfeb10b67a6823541a509a4a4a56f7358770187cad32708d17f0d73efcfff9af37ee9f61be49d8b4e177f8acb41b32dea20a9fa42eedead4ca0c7b938b5deff4a1ca0066692401ec79fe692e26ee1906be76d4c179cf782270d8d98c20f03d7d9b0bd93e059872e171f7c2afb3185f7a1dc4a95a2a0656b9d56fa90570f2a598e4a17a96ce1ad732e0f0d1bbdfac497244720ac133c12fb1466e72f7f3c12ef01cadde8df7c0d4ff3128a691876fe1391cc375c5626cdf6d922ca2448ea1df51a9b6f63eaa8714355f43830e7f20587adab52556133b07a16caee8d4a7204530d9cb2a8c69623ca4efc80e129c15b69bb861dacba1f234431efb36e205fdee6905939b57f779f2c9814d96d28e3624b1128af031028b2ab8dad24654064a2040518ccb86c202ca6890b43c9e2da210df1e3f974e40a3789a1c14855d66cb717bdbd9e7f6b78b3055f0e64a03975c4dcc18de5818de7266eb198e79d6ccae062711566701af429b6ef28014e74f6d84ae362595992fa6db0fca16a582cb33f62313eece77e912bb254858216ccd6c861b205138a678d04b30c44ce4212dbb29ada68c453904e2b2ee9cf3d3aa8c342ff7ee3a30bf2a230d2e4d4dcf683c8d627bedcdb6f41fdee51dec492a4e2948272ccc6e6de6a5f54c8f16c22b0b36971d3922cc78e21f214a8953f1fd34745e3e8ea6b0b124f967254d557aeadce977c26b1236f005812dd950473c12aacc4f8689e68b1ffca0715204e93f6a43759fc43814dee891c49d1210fb882ed2842308f7d661907c6134b7d3f36771635cc8bb476674cd7d4101215fa72dc385c9c2e6af98b63998f917ef5ee2f94125c4be2928075fa83d4e32300981f730fbfccd28977c1fcdf6859d85efa32aa79f9352790b050031ef6aef9aaad9461ea9d1d62a71d9ba97c1f54bea020db4b83ecf7f717204b1f256dbadd8d8a4d692ea4b564a761e05c215be2e429af38c418dbb54bb191b18a35977e2fabfa1a9e9a8b7fb40e4ae61560c63f0ca161d47e62873fb517cd97ce3e2bad0c1358c67afd6fc37641ec33e0d7b72b57a86fdd0c1224fc9554bc5adc5ebf81cf32fc22edaa1b1b1deebfdb6538af34c30f21f09d1bde1094b77d0b75aeb3b40c4aa80025408ef1143d1a77281b973c825c077c4644276b30782413a182ab549b7496518e847f45c52520725e8c19f32d294df591267865a264b55a33fff764c56db8c850e4f33cebd22238133c7427fd204c9784421a50518b77816c713303454a1b535979774501444557c6154c32166d9e7e1d5d3e390aaf71bdf7e91237191a643f667ba4f93c8c31fa14c07007338c55a396913618c40c2accb48f97c2ccc2cb60c24168e767434e8faa0d6bcfaf3813ab481c202238e0973ad1ab60cd397314e8284aef9d95d463f0844d8c1acda99c0e48a95aeaf14ddf1f725990254a7c0a545822925d1c3a0a61fed6882d1cf03d9f998b9c4dcb07", "52006a0053ac656a", 1, -1362693845, 0, "7e782113b4e8fa2518f8137499af6e834f6c09ee11d248afcaf50f398516dd10"], + ["d2f36e15045238ff8541efdaf3892faf60913e84e73d81e95a77d63963520b847ba0713af60000000001acffffffff6250e30a8bc0d0d1195ddede2f86265514f77bb9ae893746113d82e8cfaff45301000000070052656500635208577a4038cd2f4b5841d4f50c45590b479a33698c48234a929137aea6bd1438d1ff34070200000006ac5252006551ffffffffc105aa603ad21e7d33beb3e2d379cf22850363fe378c981b64142ed3a686f7510300000003006351ffffffff032785d20100000000008c8f0301000000000563536500510984950300000000045165536373a6e89e034e7d8900000000000000000000000000dba6267ea3c6e51e0072f63557b65de056ec2eec84b174fcbf611d24b51f7ee635bea853a7c2e10efca0047e1bfae373c060b7b940dea28efb38050c8bc567b618656c2148d7badd78f223eb4593532aa215975e2a2afcd5c0ead0f217e98d5d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000df6e0e447f7ff18f5f9cb772a118d9d21a6e440bf78a2d26d09087cef75c76cc385246cd3b38611ccdbb6a18c454377136d31879aba58e3f5764e4f875d17704b617c718b875daeb1b7d75aa9226cecf8a6b03bc5988074ff313251c2a5171a5ace9c3988a623e6e7181324c91516fa8343fdc2ac11e0cc701a1faa5fb95256602253739ae2b7f253302943c89b0ec43ca987de76575de974ed73a9ad9a863a7ec0222f32345345bbf238d62da3fe25dd10ef4bb67c728acf5bfc13d303d49e7d8a80b05ea31d79cd2727f5d6cbfdd77202e344e7aff2f1ec0915d592ce2eac918b0c4595c12d71f70651b2c63621936e4e0929b359aba756de0eef9b3c31595e018fe022253acfbbadffe6a0c6aa8c0eadb1c568f81d2c6d42d54cca2ee7b107040248c0214a6b715316c474bc5144a4e53bd8a225adcb5c9a636a86154ad3a29f92a3c4c020e559e4c2cb79f720a85d113177ba47390283e15ddca42e089be4529b98185f10300ddd6d9c6c70698b5c22fb83dc827c24f5b49bc3c22c7494ea65abc694fe597022d348fec5917aaf537fd35399b4fdf1984d9fc0bbc9b3c12d33e8f17354613a13484d1e8d84f10a026baf72cf00dab21491f43ba9f5d5fbf9d53e64d05951a86e262c05aff3af5d048d08fd9bdf54cac19c95fcf2c0900c0ee5042af75cb8c3fe9824e3c8f23f78df9532a11c21ade19a89147521c95eb4918ac13d12f2ecb11bb473b24c2121ecbf888d7d1408aef7ad19559b6ba6fd754181de57cca8f984ad2c0d5d50c54e70f212a4b3f3b7ce9f051388d5af6bcfdc71e0fd979ed2748096f5301bd99ec03421fb15a75bd5cb70ad08375b56b0d984a48647167b1c73bcc7440255be3f6894186f6a7a3d5beb4b902abbe384a00eda5b0742595bad7fe5bd7df8751f94e3a5bea4c5007b162ec339c924497253b476f5d6742b0b20d3120a43eb1aa2107ff6f95f2e01c2b0f9174959099cc56758a511e727e0eaa79f72a55d1c83a285bcd5f01070109f496a355913647305b7cb3f1c7875420b8da8e7b6d109e04a38320e09fbad540740005aa825d77d76a821bd34b23d13db4d27c1c265c1766bbfe611bd0feaa2fd0565d6566cb1cae9834fac601b477e80e06f82491cc0e1bf8e5a43f4d686e71646592badb3b9ad8793a1c95848b7421ad2e52e7592e3b33126e41de69e6f5feea9be8893a6ad01f3f66f32c95770dd945cbbddc49edf7721835267cc97c706f9b1644485a4858a9a352103343cde55bacfcd0a00bd9d9d9161644cb357e4df86264c9df148f3d2a7b73e4f0cd31e402970e5ebc9d654994c4fe9b6b8df5c34d9f2e5dfb9903f61bc3fdeed4b6ae7b292c42ecaebf221bb32600092b507543884ca3e9df1f26b41e22e189452dc170808280280d202d27b95410ac789d5afb27d24368a86843d32ca04ba0aef2b9cdd9ecfceae22f3819b2f2f51f932bec022308b507c4484ff909b7f5aaf86bb4941a2f334654e31646311b4a38c7a6bbe3184d095bde2cc60bb4debe743b69c484569870b8a09e9afae78bfee183fb7a7c604a3e3de235783844f08ff666594b0f481190937e7562cf14a10f908ee7fc9f76c102d985a82c96d732865a76928b1d4ffc744459c4913f6acfe9185aae8d04437cb6a49d8804e52316edf2fea24af1b0778d148b6b1952a8adcd5b494266001713ba355e133f5443b21892666e45135beda511271fdefa4fc9e03e6893779428ccbeb27f170c639221f30f7cef60827525deb98968a4f89d49cabcf9dfd8d4c7b24ac25d147f0abab24064723245686b62a672602f8e1801af8682497dc13ded9efe4587b8429ecd8e38575a471b9036c55d7985a068c8597e39b4ff2643e8cd2e2e47308bfa3a5b630a08d5c2f421978f1cb6e04c3ac2e9d0f75add950916e1007f376135143cd3fdc7b9b85acac47339572b35072360ff505b37731fa8e2e2e1dc7bcd312a2c201a04ec6c28c4905d0d086183c46dc764f11880d95e2a9c25fe3a511f5afd8cb4c4d866476eee12906baa670dccf3d42b5a21581fe9e3bec7ff7536ddebf079a5de1cc2a328d9924f86f5591ce212efd941ab4d402a2922c53ae0efa67fe6467dc971ea76921801992862c0774f65dab2f4ff4557c504789aac59178b2fa11395d88787c813eb760a46bf6e22043b72650426da18bd88b8ab52270b5118e216aef51e0a76c22a3f9843ea94a0c420d9e2e56e7942455f6164032fa125a5342ebcd90b122ac8bbd183ad48bd82abb58733c1128db6a4bec8f3b6d4dcc8f25f000000000000000029f06e040000000013260bd3733fc8f8923f10a7dd1bcd34abe1548a2775c4d9b1ef0af35aa2fdf683941d40314098209dcae307b282b4c3fd21a30d1ef3ccecb5ba9bd6ad6569630b041d0d27563896b4b1403bd90fd2a9ce0cf04b4ff3619f236b52958eb047040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085c700cd7a905cde9e952754db1c3c6ec3f704a90f844b72bc4b1a83a75ecb8d02d1bd0036c65be41dc0d1a73e31a19b5a7bad1275ff9719bb8541922306e1c7c5a973cbc308b26b57e29d4fcd36347b8e828bbb4876d11db0c05293f520bd311ea9ed38844960d17c2fc5d83d13ab9b861c59939757f1463496c98753cf3a4b020b2339730d97bc57be41c0a4e5479c9c8294c0316b97ca193e3e51c36c3f622d03040c6ff9787bc624d92e951eca69e7ce60d80ff327dbbc7c7ff28818425a35c80b06e1e4c8703746cb34344d8d197120bcb497ceb6a3a9cc2cb67d77c0354c6ea6c934a5b5942843982618b62b6e9ae38cada808ab3cd0aad31064b136a7b06731030fd5341697e31239a461851de526d976f2e7be09fa9605fa9185ed291160f742020838ca33d8385a4deb1ecb3a57a1608d8bb395240e5c89d3a99d60a1d366f778021053f774cd3d2795ed215da9d26cf8e699425e49dc492035e48dd751aa160a9f031a429ba07c4816dd03ed37f17d03ce1fbd1899df5d1430b65ee22359b8e8ac890327eeaa0b6574141b464549bd45d4d35284e46e260e1ceac1c6f8eee4ad17fc2eacc0ae2770f98fb950d8e4c48689a55ad6dcd01a7873626c14829f11595aa67597d2f42b93905d0dd7ce19442c5bfa29c907b40dac2b8a3e42ff888c4672b09c88ee3937c39b7b7ccd6488e0edb60fac1175e26aa9ec3e373ce9e5bdff6b0f9f67d4b5a8d22294f29934cb08bfe90b9406142243185cdcf1e832e3e589a4fc1198e1e82e68cb7f5aee35a67fd62ee08ac7c6207fa4bb27a852b634e067dfe4f9126e4abfdf4a94749c98d06d11b049f582a53e786b771cbb56de15848d6aa1edbdd6e1011fb6a982097d323214c879503bb4b872fc1674279c07a1ec5694333b47b8a50f06e10302e3b5700b1def094ad59a26ebb5fbb268df4eb718528c3dca86ffa32d72b6d1f2ee47bc212a931c3cd96eee559ab3ce84a715a583d610510570a4c533f6439299eb69533d3790164ed72276ae4a678c9a43ca5e4bc692723e08b65b4c21c3ee00311d0ad5c5c801778ce2e7f68549a04a6d9e84a26e84d9f82ae2706756b775c3396e99eb21f551057a6eaac05ae4aa47e12cf9ae673c37fe6a0918a565670601b31a2c0e2747baea0e6a2e118007ab149363b5ac4457bcac806ba91f63c04ede4f66266dc3ea1f799c9d09868f8502cffe450af0421148444ce4fdc0eac3a4ccd1a3cc4822d6bfbe0fe77c09e08b22f35db2bf1cff57c60e630f8dc65d06fba907305edd7e17812df45abbb4ffcf03240959338aaad1d849240bffe5fc37c16869c4bdbb2ccfdefb6707dbbbe5de060e6239e2c6109bbfdf37319b2a45dbb6b6a638f91a9acb34a9003cb0fe1e5400e3b6e5aa8d8b591345976579773cfa4ecf8949410490dc342e2c9f02850f3c1c236000ec720f293655cb4a585463d4b61f953f192f9b5e99aba634a6659569825c3b5777ee1998eae70d2d954a1eee80312ef3f8e6645eaf661f10fde64314e3657fec7e3311a4fbdb04614510912e6e78df3d9567e77e0d51546c31d0995dd38062d244b95d50218f184606f49d76f41f03e133f6528217ea3200438753b74d5ec0dd35df942219a51251b6c3ad7afc6d0fa4822dce7f9ff2d9e5c47ad7ed7687de423bd229b1effc080662f5ee74de28640eaed32f6e00f875b9f65ba7d865ef0f79d61c22cd26af55c4ce47ceca5024014700d9e2f374c74f33a088004cf921d0f1a95d82cfd707d0b47971f7722b062e6978fca563cb3e209aab11925be96deae960caebf4f87381a4b78af29b56387a153f7944a17f0703de3ff074d02bba8e084ae8f94305ccb4492b62fa55c55f717893032f9f886f94857db6a4eb43ba1f70c2fb5feb070a77ee4f7d301729adac325370c05513bcb646a9bd910ecba41e4afb0848c4c1ba409df06e8c86afc18bf8f4d49a3da223980a4e868e33338a3b272d735227adf84e61ff0304a2c1970d95b7a3391d73bf8bbc22da49ff697badbb745c4105377cd11f169bde35c57c67c5d4aee77ebfd06d25a185c229d5721096ba04d6aa4ecb17f8d74bc626ab1344bf77715f46d16116af55bb307f13423cbbe6007854bdc21bb4d451408ad312322156715f78a271dc6297232564987919080ce24cfbd333b829d0ada69b400aab383d1fa165631300bebd49fdaf2280e1972271b7a9639d62c321cb7343d28bd61e88bdd3e3d3ff6f74a21e494e703a05888994af9a5150d87c9cff2f3fda7182ef8e238eb22a48cd060000000000000000139b3a0000000000a127bfd457bd685bdf4f1baaef1fb2e2b144d6a59011e92254bce53da3794d384a1d7389efa0158a09284184451c8992812f788b13e297c49b840f1b5f521be2f01b5732a9ccd74cabbf32d162a9b7a0678dc2a06b790cb2b5670ef2c7cc2d38000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007d7274d2f48dec83b89a3e95d1e774b72f2ab496568c6fd91cec3de4aaaf8b7547625de2d24a6a08fb6391ebba0aa86f70f8bf135a1632f839a62ddc1070982161b8cf93ec838cc14873307bd1d83a1526e7847edb416bc4c79fd3b4756e2c813c38ac29a2816fbdb6dec1f1f0407a92aa00b41fd0baf30131135d453e4404a50327f0a25b7da4789e509f1ed221c728e8f3ad7c1c6fe2abd1bb15ce6e94f6c748022d5776502474d3d656b9dddf6f341e35909f76f1ea83dd17bb0b4c4aa3506e3f0b00309f6564e9d0be0db2792ee4c7ab514a675fb2d7b113dda3c66ee9cd3d5952d82a1102d5e53c0a63ac056c59023a36312aa5db6ac0886b905cc3d7966153800320d1d60299c6378e7f2d0c2dfdda3b9ebd419bef1c456b9d5265c779583f32f9021a202f640904f7168e0a70d60311591f9bad2591cbac35ee9c00212b97af6f92031325343769ef5dd03023e709ceb0b2945eb09ea35df5bb9ba7db677009611189031958081f65a448f6e5f3b138e4d99414c6362e4373bee6c2ce75d21fd025d3fe02094382becd9229ff54f1eb6168b725edfc53c9d255ecfeabbe6a49d52f743b13b85b58bda66f5e74b543062cf9e4bb1e4188a21070f5f9bc002e75567a1c0b1245e4213e815749b72e2133abb3d7b704747065acb30ef08a01b57947d40812a0ade37ac411c8c6719b168780fa03d05892c47fc9f4508cbd379a41b807e4efe7cc22727e4ef211468bdd56b908abc4dd0fb895d23b228a521365ba06723155d4c5b661eb266156b0455a05c5bac3c66602b140679316915d2ca30644bc03cc8dee472134848f21e358651bd04744797987a1870d428bf3d71a065b95cb4656113930d7c0be14d8c82470b9fb402206de8fc5e95dba47c5914db6390045d9df8d24e3a389b8131b3a63ae26ae4b4e850ebc277fdf0c1d3cdf0f7a158176419065e8033e57a64fba4f335f8925fbebbb22327480c0bfef0e185abd2af7a1fe0305fe1b8e5a0d6f72e2edc9f69c2f5ee87cc2683c1f34b7251bb572f06602afdb19b729f22dd52abeeb412b8bfcbcee4b186efd907c449396cef966d9bd2aec0c849801f8fed4e9e33c4fcd2a3bb3e5ecdf076e5deb33d43371a2a927ef34a869b4df3fa1fa6a7d7f23ddebb51a40edd24f06f5efd8719e79d8394c5ebb42077c615dc839b93e5a3ef5720d1c9925b92260fba9dda215fff82a3bb68d4922a7e00fb0609e29b410aef2d3fbdca8ecee4a88d524f75a1ac3b9c7cf1cc9227e5b55d458ff99e6518b3d03fd4b5090f875c7bfca50fd32618304a7bd1bf6bae5d24edfb70470bc12f53ed04f21f4b617fba86ce567d8a2dc080e4535d7c666bd83fc8de280b21d224ea7f51aa52ba1daae915d4cf0665b481d8787f546f8d88862ccf7a1b658a0516b6b27a26fb41fb38eb26b89c86d592f840b359e0886e3c2d3eddc7be4ae877e5c2c0ccaf33a438c826e330100b1ad8224ec04ed32225851ffb09b41f090de102624b6870baf94df181a359a36abd1caeed4da31e2fcb040badb1bb254dbee27d863ad52f404bea6b363666af08e340f956e5836c5f5fa838840fe767b271b0782b7d5e2822bf49a94911fe92440e6a9324549318de818a4ac805754743cb38a6eeaae71fe08c8018f318bc8c60b25d21b5210432e678d562d6d8c6ca02b8becf937ba9db13269e751ba4e7e7e59257aaa5c9d0dd68af164226992190581c7db2691e75b71e5623ad7bb6c0cd3ce0fdb1c111912ae3f91e5346b836da1790677ffebfff05509252e828a7e1fc035df69d05c2ec52b809b0f563a8c25e64bd3f2757b23a73a3346ee8ef0388b5c946e28730db2b6497df8c2828cc2fe94b58b1d7fe1f7672fb4c9ade382bbf38393397f252d4df3c9643298850995670505b0a29a37d1be2ea427348f2ceab8fb830cb6f3c1cecef32f581cdc79bb975eb5b8632fc82d5a5c75598ccc013cf6c41c08b0a113f423c59b9e856567a5dc223783c2d42296906f57f259aa3850941d125f1f5b180e42a598bae62520f991924380682b6707a494dbac663f8df86585fe673c2880fb51de012308b1d8eadc1341d9d29910fa35b21ca0f6e6e63bf45f689b47c9e695247c64494763549576cea0a03007e5fb5edec9fd89644bc58f465cddd9628c19545df99a4bff9ead2366246b8588ec340717705112f5bf3df38c6765cf9aae4a166061ac2f2d237ea7407d7720d6bad7475b9593de840fdad10fe1ebbd0b3df42aaf126dc8d2b9dd6aee8cebc9033997e142a387bf2372ad267b4cde4125ff5e5d9aef2b6eeaf3a929c4c66ee38eff7f801dd3484c68a8d416b4b6a590bc40e5bb706a345ce044e897112e4f1b92b76c854f81200b1d82e0d6a2c9725fec242e93dceac6c473ecde01f0a05ab0f6d4a0942fcff01848a359b001", "00526565ac00", 1, -795837198, 0, "4592745ddf1b1869e8f2539966fa68a7a88185222173bb3683a5e3293bc0e82d"], + ["ad375e2201f14022618707dddeb154fde6a484a0dcbac9a024342ccddb76d0e49c2bb8820c030000000265517857ee1202fc85db00000000000965536a52526a536353461d900500000000046a5163ac0000000000", "516a", 0, -1205880303, 1537743641, "6036b54735822133782ad21ae14c9b8a64d94b6923ae37ba0aba6dba3df97648"], + ["43ee3354047cf9aa33096acd502ee5a1d5d6626f567c9a96dfd1dd60d878adc02dddf42ec8000000000563526353ac9f0076b25c0b3de81bec71c81664697cabecf567e6d95e2f2c391a86f85436a6eefe4e730000000000235b9abbb81b7149de27f6cf74a9a08e9067f9a73878ab19d6dbc2306924e7a55e1a4f0a01000000066a6365526365ffffffff97df6dfe72484b202708190a11b35aedd9b8a628fd0b57b181e4542428febc460200000000a68dae8d046e1b95000000000001536c2c6c04000000000551535352000082a5020000000000586d6d050000000009ac6a65526a536a52ac0000000001eadb2a02000000000000000000000000b4d6c69be270c98a4833c30cd48e8df56168c12c2091295d796d68686eae89a630e2e31809ee78604aaaab086ae70e217daeae1fc1c122a2829d823832e4d2b09ea45e9c32e15b083b245b13a108e04df0ffd48e3116a597afb2d71cee6cb12f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c4e3bea54008a348b71f4ac48e4ea160e99aefce4fcb1b9b5e52e71e6ca5fe71c0e838f3f95d584f377b7677f826b86b200178c5e2dd8e67dcb311bb1848d0d5b2ca303e4fd55dee23146867889133e63050adac5562ee4788fbdfa4ea148e757614eaa8f247698e35a5b018be511ca92b23471522efb13e73d3732398c39ae022e36a8fbec697632ddf51ddd048a25bd0348cbc613d1a64a1ad675f4d4e6f91d0210db3ea1402869c5c5d9bfcb1fa32638059165b9f76328d59f07ab9d53970ae00a04e5a9002e95e874dc3ec74020d16c48fe4ec7471438091759dac7db4273393e8303ca1785205a3df8715c5aedb9c2b1a3ab4dd0a15d865ea20e32bdd254546b0213e98a9833df6ec590561c6129cb4ba0fa1909ddf9cb77f31b8570b60922d062020d13f5adc277bd753dbd2aa944786306cc8318ffb4d445add332177a85e9c48802304b4ee7750ce166c26ee6e69c6d6afe85d5ebb8b34e5c1e81458b29b354b59a0300e3c3242899b03ca02a2b62481cc6ca1b8ed9ff79fdd317c6a48eac4a107bce0329b309f1ca4b2d33e0bdb781d9e199f25e3343ae8ac4d412b4626707fd6a6e6ba57f6948bda1cc399e6b19abe1b9a782a18c3e70ada26bbdeddac23d48407c855df0c9b7d8a0e02f1035c1c8dfb6f498a89fb5349d9b960607d4d9372953a8545733f8028eac5fc3d3ffad9d93415b8c28d3db9d10864ceb9c4299162f1ccf226a1ad66d56d46074eec78a226f2c668ad2c57335b1338bfc0c3b480ef7a7042a2722f480011384df4f8beb871216d8dce68e88a40d2e7388128a43e16b363ad2a1c625cd7e9891f0072b8d7bb2f5fa48edf8e6acfaa5649b137c136a7e8c2a4da89639c59d819f69d18ea7d4720ba6f43773477122985cc73a843b4258453e2a53948063e4271e1d676adf8f804311ebd16044c092051296914670d5abc1ec815bd5066b2e1b6433c26056a3983da77f0511180df89325ba958f751d5fb9e47c1750526312e649537c546e5c00cb9420ceb47d4e6cb3afa00dd12a530c4637c86e81f42fcb99fd3e7b655f68d4d182498b432e631f91f4b2b57bf8a02c6c27dd21fd8d43412f19ab6178ab8ead32a0cc524960356e68c5a8494e63c26533edc99b9ea31573198fd7698009d11c73a0a019179d97547aad2e12f526ede82281f8ed9d2c063ddfa272a3ff7821f3e01886a8461e1133b41cd3d61d1b74bb49e60011a10d32cfdcdbd89e614e7858a8fd2766fca75bbc8a9b968e687bfabd2794081e1ba10bae807b00363ff7da31ce36f555ca2753f51fee2fd803b477526179db7eba50b6bbc6b2e60b1e390e75de8510ccee5e2426fb2b8914166b822f0a1c69a3b27660bd2e8fb6ceb901b5bba018a29bfff4869ebb511280e9b364f0e2f77ac7ee9c3b027783836dc7b7c6f35f02b7965c884efc6412a0d3fa33202fa5a1c429e8859fdfb696fe06f395801dd9a097fb29e1a026f45902c3a1e5a37df6498059e4b13d6328efd406759c552e1a706d02d4230773ee812e511d799d7c3e112f7fb4edf75d5a3b5cd830c245b00455c4a8ae3411e75d5167288cddc660508437df09790a466c5f124b083eb994b9d5926849a55e0456ee637c6bfa15af42381c470e09a87fffbeafcd8f9259ea0768b520330a622297d2629907425ed6c3a962145d96c817ab4ec57506f6c5efd769261f3c02a9108003de4223236a7115cdd259e8c3e7838fd4f57b7fdfa6e9103559da8e980c7f61ac227ef532e710cf546c09b737c216cf0e82ed7d3ce559ae11cf38ed15f6eef5708012d6b5779dbebee45764583197574a041d8e41364aa6813fff181bc4e40645aed9b70bc42bf34a9c6f5df244b21550e327d5d7a271b9ff71702848e97735800c55ca5b02330fcd552e9b0d9334896dc7fd661e0e0ac0f84cd60d7197bff126b4d2386f2b80f7c7a222fcd882cf61f281d4bf286d84ff81f998e3f2d6c9f67c151b9b2bdfc13669707d706ba2fc5e070109528e503dbf646c6fcdc116e8104c57ac6b07ecd6aff8e6765f0d4a25bfc857fa46f1436f1a2dd15ae1728e04212983ff985df39eae6c7c46972e420c7ae1011b5de720aacb3f0e04d21dd80974013060946ab348ef411093d9bc902fc635eaa0b6e5aa8c8041f44652b518dd2f0f0dbfa470d074325d5ffd8a1652ac336c0f917be29b5d64dec8f4d000a4ac505cb3e5d66b46a3ddecc81f003d3f07e9f436a925db6c4713eb8c1d12915f7ead65adbb7846f9cee31493536157e8ead2ae96bb5d5bceffec9d4fce06e67bd62f1975d728c01b10038f9acf661f01c54cbcfcf2b866ebe2ac4a22cf369f3462d4b57328ef15ebe75b4aa9b36cf66c86e199533cdaa1bbc1e59f074a4be67e0bc1ff9f955bf5ecb537086a65e58413a6096d7cda1abcd1aed0c6bde80f", "516a005152536351", 2, -1430504603, 0, "341787bc3c3e39be7c96860a2f3d61f68ff9c9032cacc529390de35c80e57918"], + ["61f62673026afb951acebd43042ae46fe7e8f5bda4a002ce5b84117e3d4e58b188f35d55e30200000008535353535165656a60de422b46609c9ee6ae8e12a3ecc6815b0234a3d491d11eb9fac5ab00a8f4f9a2771da00100000000ffffffff01cbdca701000000000363ac5200000000020000000000000000d4238d030000000095451e2cadbf715cf12ae5990b9d2b530050542f1cd9f84b5dae4c624d8ef79d7131f73b5a8b05b2a6decb3fa9f62dded0dd3ef24d70dd1b5d96651c0e7b13739f156df0fec97f75c91ede1d46b8b20c8beee4b586986943e29d8747528409ae00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f86765626d3524fb90283b1e92cd8f1447df0de688355e21f72f3f1529d7810078763f62ced4c4889c695cbeba3656a1df5c1b68e741e9bbf18b0a4e1db287ef534e5cdf85965a2656874aa749d64bdfc1694aa55e95e34c13deaf60984bc3125be1ab8d5c6424c207961df5d58d6880c74cff8bf4fb880187af826f0df8bc32031eff80400305d233fbc2f36605f03cc7783362be7f448105bb362805db4899be031caeb9bf023fa7ef3d23d948b88fa90db253e8720d872f258aea922bb8f7877f0b0820ebf863c2d112f0fdcc565945cc6dacb4fe78ac0fd7291ec34cadf8213b3b5b11bf6322f7be340526acba6588a81379ec8218f4406f06dced52993a5c79bd03278c0845c456cef3e9dbcbcd1e7ae055a7c89e194d267647b86e1c70370bdf60021ac9fb7d9a4f8a25e1ff6f50ada31d2aec4a379d672124410e44525b18228b800311676b903231d7879b7278b1c30eba3873576730ebc0e2000bace0c226babc5803285ae28af9f6e00c3ab0be4c386dc0178ae42f2defe5101801373be2b7139b170307f3805b507df0500ca060e9e433913d9df6fc2f3acc40cf7b4809ca02605d5fc2c50ac100a5a08bc16b95e662693073beda5a4758f449030723d0320818a019fc72882e992bccf8e831af36528b52d2da64286b36788f0a161bce784beaf1338a2a66455e8dcf9b9ab7a93286bc7f9b81e297010e2dec17977875cefed325c9e889690e66d31f0545311f615f7e87a1a80cbe2e28eb2a61c598fec4f683618b7e3beecaf18b69e6f512b17119f860ff84f9f60687b8f1fd860bcc75098df9656c80196164229f857368ee7f4b4384973d84ec0e02cc2105fbb0194ca7040d9acd0f39dd067b6cbc567d034d2836052ba4b8fcd9e9edc810db138481ae4360564bf294b245f7363b98208432dad68cf34c929aaa5b8a630ef3fea970850c7765826ef0b00eed7c413285efb43baa5387cdb7dff7678210781737e622d9c2e12abb878f298857680f47ab1a29263683ee400ca77024380ba0149fb711757c66e424e9299eb987be42f6b02bb2fe6e57441df23f661db9f3ef4beeb0b3bae528fea3c50ea1d6c3d04e2f1dbc7354d6ad40f294a308e97f66a761685ac2d502e966251dc3db50ff129abee51ddac243f46afa97a3783bc34d3d9728a6177bb7df3f85423d7724b26a290d919119c53faa0ba586ccbfcaf34d7b8a90347222745bccedc54ed8964a00ac3bca4d3e137c4b003e49f1b9233e767e4e96260f1bcd278d2c4ce56afd5f1b2eb59b74918b1d469cc8f309e66af873194c14e51df36e81692f010a1cf6ebf8941a2499b523a11f20fa6ff67c86fb474b28a97289207eb2c3503b8a66798102ff51bfc6f91837b99910660e21034c7c6afbb8ff7f706cce24188fe0da2c6e4dabdc37621c0fc0beefdac9b80fdd2c9d346afb3a98de3040ba50b43f154bd1bf92889f3c247f6b090f05e5c7d6e9f017db9095ab21c96ed66699488b8b8a48ac573ce6a146324e8da96a7dc1610514bf8bbbbb8c84aba32ffe0c4b4587411434a9ded5fbf2445faaa83dff6e3123dab784cd21f5d9ea7861d5c8d5742eec8469c9ec29acb167206183b7da18ffa7a5e46451910dcfd1f2534fbe6bf969825cf4621547a6a25cbf3fea816670aedecd8cf9006e6f69c8c5e8b47aaf5d0e968ccd7b7f71fd217c88576227fd512a16bdc35baa40a177fd178f03352460d568c1521472ab0567ae406fcd15edf642b2a2eace23df003dc9c6ae3ea9229bfae94e26e45552d5bad2391ec3dce8b767e701233573b77461b34e2bcb60ec828bc95094721448126e9f957e7720290de570525482504de2511edb2beaff872c382db5a379f887dc58e3b874ad8259f699d97a5df115177485fce72b9a47bb650ae26b6747c1ae8d4f3abffc632d3b1b73c8d6049dbbc87df8d89635b828e2661ab5c0dc1289ce72359246ecd640d5b090e1907f9d1d6fae279ff015df88f875cae8cdf92bb3c328f485a1016f6457f562d8a933caa1c47e9cdf55b2a1220aaf8e7ecd35fdab9ede47c4dff57e5aa5f0880edb697765e5d5c5c98117e12c1e0f86c6155ce6ee72c85eddb90f10d2b435e42537aa877c0be08a7ae8d3d84b8d3e5bff8e6320b53095e198cb3af67044800d3646a6768d6c271f6bf897fff28208e20486d1410df44c8565c8b924d5f238eb6faffeffde8930fc44057bab69fc579a70ad57fef6b46b61bc49e3245857e78cdb82abe2970780330160b573f854afa84dc1ff26b182f8ce4c8b3063349d33d57b0300000000000000000000000012132a12e56c51365b69f5ea56abaff61d337e70846c431384fa6f6464d8ddab8483c91d66a4b27471be286f643a9dfe376ddcb7f2c44cda43d6bbb5c7557ecfe5083489b182946405210209805e9001597419b8aa4cef32289adb79520d30b50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086caecf0eb889b5a1896493f591ae0b7e1bc87b5e76f2c606cd5107b1bdb49d4de5f5e58ed53b851e7a129e4022301c0e41a3c81c9b9b1c78694d8148a2c8de59ad23726a472ad2ae3c559c900a32326a08304996ce75bb25a75ed887952d0cae49e42ecb8750ed597401f1f3cd720d63b1c9c0480b025967f643bc121f8ad0f030ad2163461cc7ce54e4a7bcfec6033875d48ece9b63c50754f5c1f4427e5ef9a021758faa8f3a9e0162fe640ee0d8af29db3d48108f30dd645472f4abc1058b7690b00679a0bd7c2cf93351e4261b78eb7b45b81c76655f714096c69c8f4fa6b7e63c62ee2d98d1b073f60766f4054cbd90cf5b9b872fd6819fce0823056b3f8b67a0212ab32d174c0ee64928d7f48696649a798418f0cd4a67728ad066e2dfd364312031a8acd6fd074470a6661b4c3421378976143cae6d18808fed406e7c1577001b20207f1c4bce07acb441870f9110de3cfad62c52ce4eef1d4be81abf77290fe37e10226b0a817c20210759351ae397db456575678ac64349994ae7312213914efa5d60317e6d3359497f01d0c8b2911f6d3662937a38f83aa55805a968e99aa043130c4616ff73bf025f0d81f411efc58a744b9c93ddd5ecead0840ee77c32fc5811d141f7a1e1dd7d3641300d5d1fef3df700c638a0e538dc40fed2e5f282466909766807ae399e7a7ed08f49e09554581637fd3bf001cdf24aa300f89a2ddfc4e4fc52263274658a79157271fa316a0b5811d77ac91d31a27375158219dc626ab947414f8769c5457951506868d76ed19d673a533b2869382a6756193aca70a1edd8619bec2bafee55dfb5e85f0af4ff75247aa7311461f7749c97eb76675653afdab8a8f840bb9544b938a88d315aeb01d8493762e85ee9cbbf6e0b6b7eeb132f18b5944cc46be85e2b9da5ed5ab7585fb1d986d09c8182d7bdca66c2fe68a56e3068f37f782b171df4cb55006ff142f7a5204907a7fadec344a2267cf76a73e481945680414c61bf6361f4fabe467df30bfa36ea42d1bbb6d95f1f87dd59af93d366fc935744db7aa1b1ce6ada6513bec21d6b7aebe30eb5cefc3f8393dbf6fcc50bd60e82e456cffce2fdb8253923cb7c94f36b6ea31cb65cb7a37d5390ca92fb3a1d8e349a205d69556dd6ae313fb28fe771c29843896abcf636d26da3ebf239468a1102c5e515112392f894f0b038f018589a331c69f98273d378369a54c04dafe3d992194152f3cb54de0b545ef1e9d4829f9f17d41267bf790450bc2861ae8606958eea7d9006e339115cd61eca07739d8d3affd41f6d6f4ed207b77fe7129d8612a1a9571ac22531347e12bf9e786c622491fbafc42ec5b9834f9921f59685f7a5158705a2a0d4e70bbfc4699ad06dd8cacccd4ce85c09332135faec59841170582015af60f22dcbfc754bcc11c41dc548c2fff4bd931ce285c95c8c6d71eab8c7486edcd58d988409441cc7e0c4577904a6289f7c74821cdf6d2584103ab0424007b59efc603240aa2196b2f15025a9c8e7ae6ccdb4d97ed243d62eb23f7b9528191cfe2e4f3d74dcb16f5724e6f59a16c970d7f8fd4a02808d2c345c91adc294cd998d07f0c5ef781af5c60900f883474d218f73d12c1fdb96fe1b126b228722d545a4e2cb89004802376b4e0813b7aa84694b6c6fb1788dc21aa4326d44727525ae7b92b262f0eec96e2672a5346c92a39ad1d799100c4721b8debbdb5366cb1ac68dff53d2924480b5558c37b3303f4023ec9a71703f2ebe2032cba3681352922b813e26d1d8733ad25812df4bf4bb734bf641bc32dd5d31695855dd938c88180772abc87dc5032fa01dc5d25a75f03e89fb8559534ae4a378405cb032df5ffb104612518dab0936e31cea909d87129d7bf02baaeb38c142c82a69f5038b83c5b142847482f0aa1eb77416b1051f6e97f7a84828a787ac680e5f59c235b685fe998028feaa22cb50c387575e2c0e0779e2cbe8316b46e2ba625bcdfe247d9b001e110de751f35a5817461bec1bfeaf0b08583628be2e156ccf074799cadbc58c02b3a194d26a2d8127d8550fec0c7298eaf456559f07297d6a3e9a2b2cb48dccb47e734b08798e40200a7633159764f7618eb34e41356f78009dac7a39cb687105b762508a354f092bccbb1bae093863096e42b564a8c4cc12a44dd002566169095b0d4f382a91f9a3eb79465fc5c0a222a2b24ef79ea6382ed70079cf00d49791a8919965846e194470509fdad71b22b66e0540ad214217a6df97f9bb1a3e32dfa570343ee8352e557708f8c2a4688e6a23c84cc14ea0190e26c6bb3a42a81d22013e41a89dc17be36f1afbff92d01fcef1bf945e0e8b387b8218cf04f4317afb40cba6afd2e36f32205cca5e8c66ce6fc013cf218d6aea832f3a7aa762e3b808ffc20bdae97dc4f6dda3a567102", "535152", 1, -193940387, 1537743641, "c61856b00d438e7d57c2b19d133288df26d73ad6401d44a0521a115c6baf81c9"], + ["d1b3bf3a01efd93afb57a34ab795e4a1c37e1bee439bd37ee6043ea620d58601cdea010f3f01000000066a516a6a6a00ffffffff043ce29300000000000863635100acac6353e333350200000000085351ac636a53005181225a000000000005656352ac5369273c0400000000065251535152ac0000000003000000000000000035d92f0400000000e9da29f909f7baa3f160a24f118aed4104e87d0bb4a24e158234cb5b7393fbc824dc185b4174261b7a8b07769ce6a204178ad18218ac2fee5b182c8bd9e18f86a4badc6e6cc442821d9891097d07ea7a91865f37b0c5910f6a41b24b86b5351a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f9ab44e6a2b64806a12910dde9ee7e955358075b0a0d89df6fa99b4b835869e729e70b652395d8b63731112bc9060ef30759c7dff2b7b8180307da7a3c11637175603d376be5a3b437594461dd2898fc22e084d3453dbeb7faeeebb7b6a4cb30ed21945a3c7a4bbda002f56565967bc13b0f51126cf0e7297eae750d7a1dec7703092f6704f98f4f572c1d9eed2bd30e4b56a7a1af039af32dfbbdaf052596b5f102002a3a791eb1e2a34790a9942f57906c6f13cc829c11e4b31a3d53bcc335a13c0a06435b5ba9d895c6cafbec55299579844d184553155fce3ed2b4b7cd36eeb32d08550756fbadcdd3c010271fa74f078358577f4e67741433bf66da125a8da37f0216cac402f3aec6fa307c1b8b188704a047809e0925be8465f8b74a3b3d5dcf4d020f7c806e7c58a82ea743ddfc319f70022cf6278a277be732495caaf89fb32bf902189aeda0368b662305ede2227e409abf25daaaae983263dd766af3fb94252f50022fa55b686f53fa5c52a582e08d3af339d8b2215859003f878e9a272b50828999022292182cd8dd8714f6cf1abf7f9ebc0b9f3302f825cbf6f942da365ca0e21a3b6e11c21d1b435a486931f0e77c7ec08b79062a1e9c0d17593d4b6409525721e0ee06dd7060861c98d612ef6e8ac3c4ceb658f728575d2a1bddae81581087ef2a9a369c658b823e01c2d30d9bb68cf1196fe8581803b580e367f7c5e8ab767007a0ed5bd0a88142ffa1a9fe35742e2f04c7dd08b38a11502b18dd9e04a9bb0c77204c5768a642e53869b8a492331b2587b3200805ff2a11036b7e1e10db42a77582bb533c483128b1c1de47e30143800746e34ff31cdfca5d3eb7000bde8321938f0e88a9373578562aea2de5613088d2c77a457f0f783a7be86d46c1afe450d139967af24d5730458753c5e503d489b96e1b6c53722f2dc3077e5b2931e8048bbb0fe1f424d15605ef16e0d3544863b832ed9ed67d761b8c762d9149f03e7605ed183f9cbcad95356e9c50688474b25f8e51a136c2ea706934d580d45e4ced07c45740eb4bec22709c1793023b1ffbff0fc3a8fd4460eb8e97d0492d22677194efc2c86756d8e48bd3d7d1d201ac675c95af70a9680c0c021e38c8a3233cc6c25eba1856566552fb59e2a655989383d074db68c27d050cc30190e963cd28561e6b06cb259476632e12fce4e7b7368ff255c63e87a44eac10e68caf129e3275e24a9509976dc80f85fcc5669dddfb873a19683dbcc5c7df5d1d6c943ed8841079c7887dae802c56e1614564993c5506998e492e94cf6d92a877db39957387d74f7375e25427038f491fe891f8e25bb38fc92a6f00e33e5aa7b428fece64e4089447325c7e2a77e2244c4d7933c7db47842acf363724884560a677afd420b5bb15e77b96b001e7a0c10f7d3d2094affc089209c01840bdd8ea159c9fd96b13361e0e9ae46143e4d2ad1217b8133f3757c15dd209190443a9e87b9a281a86b09db679e097bca432583ddd1f4c8addfe512274313683452b90c93c8c607b9902c9fed0dc91f64126d0a5fb764d305453cb91cb18d7638b985b68353dd9b4ea2ce68ea2deb1d48a2ad1af82e38b7d8ed80523c241a881c62340fce96f2c4a2044c45720a607f410d4a1a3408423f9418366c11020663c756e168b814782be20d8fd984330d598c83444f37a98eaa1a45c331f3d2b4a2e3a69c298d27d56b1ca629577d4bb8403f4f8b105ccb3b17c925feac46434011c13e6eccc22b0f3a145f7af5f199a006623a0d59f38c1a379ac7022746029adc57714f5b4c9e1c639639e043fdf9ae048a408b1b1b29e8fdc83d044abedc8104e7111421e4e547e7c2ba648cf4a82dbfa177ea9c9159735e28a68879ce56a9615174221639a2eb89903456a22feebd2e4103da61b9c8ec99fb8abe85426792fc1242bcffe1f3c456861a2fd8cc77c45c8d31a3cc8fa7bc281fb326f8344527270c5eb1deea84b3760945e220fa82b122a97dbbf4750c61df898206b288377a438c46249f3080f98e6ba5e2b9642f4c55fab95f25684697e269f4fad4ee3a4f31ea1f9e0c33c32aa333b6058b7fa26efb0df7711d23c60f7c89f1642680d50adde7e96bab118f2f7f726b6de2147abf94ff3c8e0d56bb73d48ce777839ceff30d1ea1d3dc1d0f7336f1fa3ee0fc458a118727af8c53a8f45e9f4fa4e61652ba62eae16755e2206f5e4257d8da9e8a0c48e25d3894d94169fcd586e9b421baa68629803e3aa0400ed483ba2ac66930f3ab3cf776a272a75aff1db32cabd3edd22779f040000000000000000000000001201113a4f772afea84e5088dc98d802fa78e230d79290cafcbb200f5456480713960ab0b74d800fd1c854da639efbb2f0880daf7736e5730c70b69eaffd5f1bb306e49c41127231239ae51328cb0c1fac535c3ad44d51bde08192983cb3a53500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d053a7c29e2fbca55a36934e729a69d73ffd4bacc3e38497f621f8f70734e10529d4577a96f36d002f7b289447aa676c12dffbfb3617b22b9dc9b887640d9fd1190259a0c543faf4afb3a25870b15d93359f9a8907e176dd04bbf779c7a523093954742b43f55c2da857c7253c21071767f1789688b07faf000ef97572eecfff032754639d3f280671ad4114137d125fdab16b9a3f12d5ebf879db4ece57d45f60021eb9a264028a8aaaa68dbeb9c8d4bab14f62e279a6116d7a42b3cc382ed917f20a05465c7da7122eb540bd317d56a572c3254899abaa14d7db422b78e097cae215c2031051c360ad84ee7090607b1805a9bd8aaf37fd1ed2f125476a0775305a2f0210d00f952b56acd8b99df99211a516c748478cf4b07a9d8cf0ca16e6834472510215fe5f07dfbc8e0e2987a1dabc33886db60d563cc4e2ac8a3a0a6cb472085e910319a25cdcf1a6af9156c9550ac5c83a445f9d6892469bf84c64cf9d41ec0ed7e7032d008c7188908c9eab10d654f23100bc30be5619487eae4cb4919751a1163d12030651892741604210c1f658e2b2df3983f8ab7be029614fe24df1e9c3bbcde72a8d15c1835cf596d55331fc21c9a8175675bb6fc2ccac8a6f8fdfec94b894cf5964d3f763f823f9070647740c294482ba3a22faa670215c79390bbf11b2a14cbef70b01a41d7cea2a5d6b82689a2a773a03f95637f84b287a5ac1b539c2fd526631b87b62a2c2cc09924c84ad17edc8e93da6fc4aa4b882d784fb278d44a9460b3bf0714ede0be8158ecc3155b091de9dbbfa6005841619fcab4509993a9d4514cf99cb9ac9f5dbe3c78ad46ee59881ba7c35ac37f8073f92234485085dff8f28eb990979506dfa9d37af15a16d6900d8d68d2cce2e24e75057f1ee11b56a58e25680a2235d399645783414753a2e3050b34bdc405b829629993b36dfac11173c7d522828d65b0fe187c595bfa8765034c3231bf5a2c04ffe4f10195bd6282068bbff5086af7a36a877c2c6276455dddd21133c1d38056e6a7b124c51b77643de35f9627729577a27246d144979ae2bf9d1c49fe3078b27b458350ce2ac82dc94c790784a2ab0bc7e639b75ff9206c25fc268d68fbc4cc72456ec542717b4adecfaf1fa23e3de17a33544697685d51851a9a7ac7c5170e6fb5e7435e9dcd2f9ccf1c1485f04f91531c21faa4bcd3f86b107a27644f87a64c48c9816490a8730f18a181d76e5bbf73e5afb938e421dc2f642f155cad7f84cc620ca0c7d4d7bc6632b81d366df1db54e41d0de42601bb3e6e21d113e65c3bdb5319e50bd6bf6bff1e9efb9dcd3f593af4a931e385f4eb01673a5069e991ce6805c6b5fc9eed965c6eed2cda964ef0f086663d4cf6acfdb64924c77f2f4b4cb96aeab4114ac14f71704f3c786c7c2a6906f3ca860dcbf73269a0d2cfde09694934b0cb47a9a88e4e1fee020ea54067f478758d836dead19f7312ad9cf0f9de06938ad5661c855bce356fcbbc4bb1054076c55bc0acadf9f45469aff842bf710e7ebe8119a6a16a31555567ce43fbecdf032b76f27b1f4c31ab013b74aa1097a8acf25f1f247c30063e02a09604f1d97ade82b1b7bd90a73c2758fe10a731e7c8d1c4e5e13d6ae206d91f5047fb04283fc5ee1742664faafa45bbb796b068bd3374b199bad5e159c1a1d312df37200cabc9182c11b1b266cd84afc9a9bf4fd3c204fcd07254cc708e363087aec23353330fd93a7392504e440e1da645429af2853253b12efc89185cb03de7c112f287ebf93e8997d2973c7fc2624a05f6434b06d3c044a4c94ebe48a46fbd44e03949471719132d5f2451bba52b2ffe40f9554ed1ee78e934a42a2a76904e37c3c51dbc56a05bfb8097dae069ba5e226ea1feaa39025aed330d32a04ed4db5c7d59cdfa47bf61dcefc5c1a48d818d058d0b4691ac3e16f567d81a0da27cca6afc1f2c0030130aab8a27c05c6e2a0c5a2f62a073097330bc0dd4520b85eabd527e346c5b2402b85f8757e91fecc9b499aed73ce10247510253abd20eed6f84c1f680bacb49ca8372c03ccba1e8cbf829d99c3900feea350d35a1371a01d5e8c646fd2ac51129653e31f5db909540507e291837282cf5d5def99ad0bc8528688ea9cc30bd8b7121e6df3996d24cae6f76d77869ccc4a46c849cf37f12d9497971d0650f2a3b7500070d6017a5dd306287d535831dc2710b0bcf9b35dd8c080a59ffbbee18a7688bdc587b831168116ea22d030fd53b9d526113bb506084126764c42ca56d974e8a7fa8284635fffb700000000000000007f2efd0000000000be749c098eb4fcae34dd694010fb1c846ce059e974e3e8bef2e72403a15504c1e96fa93b25ba7319b2b70dc75ae741690280eacbe0e8264ef2f4e9a7e9a0fd7e1c4bab21a5b7631d1d646e9cdace93832aef767df4cefb3f297ee6a7ae16c06200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cf7435cdaf33c6c5874171bf399094ddbf317327938cc9471ca48aef7adcc6afa81a0791b7a6e1ec2f46e88292a4ae3244ce42a563a70909f6d43e00552d145c697e12e4b915a894cec71b99b78eae331a9e3aabef2c6624354dee0ec2875a3cf16b7981c1431402b32dbf5beaf518ac6491e8546e91142e8f86f9f3345c640e021b1db43e8df2dc3d34eb0e982576052dc8e533e791e9cf413e021c62880134af03005b015a65424a94baaf9a5d12b341c461e8eb06c797213473b4193507fd2dd50a063053f30cf79cb9dd70c414f7a6297123afab15e859dee7b036649f4a08cc4dbc9a4a621114fbcd8473034b1d1247fea6ae5e2ab22e422708cceca26041b36c0329a24ad50c52f1b9f47681ae9bdb9a84df19f9504413dbe50ced00950b0f2a67030afb7e9186835e5df4f2f9844f9d13c35dcc120acde62401eaac31d3d59c90d503013f3ad75d213d1edd57f24b227444d770876b4021e2977cd829d876c90a35ea02006f2b682c8c7d3e537f5878ec05a2371580ecbd6e6641934d19ffbc20474c14030ab99ad422606bf0a71e7e0d7c56dcde1bf90399dddd8223d5eb82a73e4d91091456c753ec3cca20f93e25f7c3e630f82174984ec58fd0d397ff5b4eb52e2bc7a8a71bc33380cccf0562415e7adfd46f6c1fb093358eb1a606949215502cf48987f44c0931818b094e9907af55cd9704997bfbe03a46069d55996a023268a23e963f5331a79f97533aaf4615900fd3347c07c96f40f4dcfb60732f4d3ae51165040f1b2d19c8eee962074ec4c74b3ce375156ba419632ac4d878274b6c1630ad9e960b1619bca6aff37f54e42128046ce2a9fff223c0ebe11b143a8f571fc971bb377992e6287a2d81c238cce3e5713bb9ac4518447f10ff2056c4fe061b9bcdf28a4e905cdec6dc7c1dc854c38ce13dce62c4e5b5813669dd77fe092a5da03c73d54bbb98c28cad5c38a7312eda9688ade0afcabb3cb58f6ccc7eb36f2d5af816fe359eeee834f598746f19912b82c153064fd80dc27b640d99de4df6bff039837df1ab2c7802e4b5c1299ae08eeea7bf0476c9ea1cb101b695b14848a69fef829cceb878b694f773f9dd4fe2b73d3ea8697df14e5ea620371065371b21ebe07113fd8924e8009d96fcc5565f6021a33b6a03adb172b534b31ad818fb8191021a4bc50b154669d08693d07d5479a7c32cbc62e0c9c2127e2bfdddc6d8c2bb45f21bad9c937589c2a33ec868558fb5b0947adf95e1f3925bd624163b3154443f80f0b937b1ee2e846f5d7dbc7f5422ab0627f1c3a80864a18e31e736b6f4189a0a719d7dc045427fbe6323c724333c88a62858953c30284a80d2df6831f38741baafc764755f5461440d3181ba48c8ba1c457a7f6fb5f5a1922fef96846d853b16e7e8c9304db064ef90d6f266d15db7f56b0fab09bac699ece2238499e4ca6bee8cc0a222145f02233ac6433467a9fbf5138b17a4d3d8e43d5bfc830fc5c6543079b06bbde8c88275c609f9ab9883e449c9a8540178b7a0779705c054fdc6c8c6ee63b850f08529281049bb7400cc399a427f5795108fcab617323664b94d84c1c65acf7828e709481f1480008aeb0e8c0f049131571c4f328280471690f41f14568f6fae8acfdf93cfcd96dc6ae7fc10c361e148a1c68d3d4e4f83df55224414b1645807001fc9e4178bd469439616f5181bfe7ab93a519becec742985fd5769977b13f0147e61c35c8fd618de1bd77729d4ad40e24ca49791f0425327b9aa2419f4e8b99c9e13d2cc25aa6e86666111c7da2728b14b6d768d0b336e32c36f5e5f61703beeca3ca65030ba7a8766dd1d5a2e4a799c05decd3c44d7d4b6c0955779c7094ffa343ae958260e4ab2817f40b8846c952fc7ed666df25b6ebb27e8ba079d88ff6617ab11f1bc08c38602e4bddb1f09b462387aacade1529d60544b01a921f9e041554cfb6d0d54e6d3ddc18ba14c3d2d54038274e18c704343a59149a1fb4fda70dc2d98a8482ae58e25e95615e56915191011e4491bf39a337e7242d06a53a82772ccc554eed3a4ec7522fa4acaa0b2c8280db912a64bdf7f899d4c70a15ae5b89a3b70bbd37bc721f79272596ea3360b400900c0aa5124b107e5cedc0b00cfe0b398c81c2d6955cb85b8a9e04ef39a0e315908930d84a15153c85a1def6cb5b7f5ba2bf456a4ebaf00201243385ddb494de4a4bed7caf448bb6ddf91d9ec10e5644510042e949fc12351517fee02af0a549d290a0192e1f446cd922a47868acafe484b6c355e43054d862700476dbcedd163871db2da3fe4badf431aaa781acb650c4eaf1e43474e2e20eca657a5b7e798c810bd72e881dfdee54c8d9d09381e89ee15718633c08b1d3fe9c2945f3a1a18e7c3dc56a06533b97aeeff563db76322ce4478e09c36cce87bec0b", "536565", 0, 129817968, 1537743641, "681263f1f51891990ac96559e14d451ad6db5f508f31e6c6d4f4015620816cb9"], + ["030000807082c40303e0132de2ad505e52641c90d1f6275d6ca5ad6db97b367d52d66b1c8e8cc78dcb010000000152ef412ea4f330e45eea5872845926fde7e66caf398a477b0f74d29ed65971d7cda139b013000000000700526563535351ffffffffbfea86b2beff293b2cc795ca99d3073aa53066b7c18baa1c03be5c9e86e30175010000000951635265ac51636a6affffffff02d99571040000000009526a52656a52510053eee83801000000000600536a6a656a000000000000000000", "65636aac00ac", 1, -1049865573, 1537743641, "19b66deca7baefd5ba4d85cf48a13026eb30b29140864e1f20142dd2e949a3d7"], + ["81c9762304ee9e9f4f1d4e763fcbfad682c30446943dcb4df77c97c72cd964d6a9a1e57d7302000000096a00516aacac656a5204eeb2d31814f6f19492e3b703ec08afa590b92085e2e4a1aaad81e86fb297207058fbba0300000000a45bdeafcc25d2beb8adaee312af960ccbd3e745327b3e304a14c787940276cd011b7644010000000152435362f79c981b6ad1099da982eb80f5855b645bae70aff442054f43b0736292e148b1dc0000000004516a5300ffffffff04c8525805000000000863ac6553005352524bb01e0400000000016adcaabf050000000004536351658ed2e5020000000002ac5334e43cbd020000000000000000a507d1000000000001b583f374191163ff7c1876f455da0c5065684f4f838818e435d6320953581bb4d5b8cc094c726e33be79f5877d06604b29d58f8934e501b8b6f5e831063e61850c3348bd7cd4dbd9325b58637eefd6577f41cf108be04301337009bf5c947800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fc9d42cc6be739465e2f8f28be019d3b8fd6de11c96669930fb38d4a2d32cb88edec98db0bdba92ff95cb1f9587fd96b2c784df68bc19c38604631111449aef1d54601fe8f97d6c4f6325bf9181ec1d0d335ee3cea302cdfc7ca512d1428cdc55dabf1272de7033ff2d5f5f63858c41b6da94a0275816634058171bf48fb61b90224fcd6eac3d84ee422cd357406f759bf630c0185026341a99e5484b0f99041470315eb14fe4efff5df9d8cd01bbf37cdaed8590fe839bb508e1343104df606e0420a086573f91eff4b84f1fc94680ab4f8b55e9d5be95652d3b213085709778e332e4f8f9901ff8a306fccc5c9a7c704e79c86ecafe09b6395cbdc4a51f0be48d46f020a08dfe0905e5ed6f5a7fb949485b35e2aeef70233b2a3d845e0125d19f9ea39020aa6a483432ce92465b0f61b8d8dde9346a0b0e2ea6f05da00e382901b612d0e02190ea3a25cde5e083fda319797931a8b9a3482e3fa6a8aae7b2e0864382d2e5c020a4cbb634b463775731f22763a73fefc0c359ff71a6ee6c26aa5f7e47c9d78610328e3f5b403f0b3537086e9fb5d4ed0b7690b3634e521b06e75b6626faaf0575bc699b832ecff35376cdc1590d56f510dff7aace088ae0a01046bc502d77e708751db8e0fc33a16b27417956a02ca32f3dfce31305babc1c268ce719dd33eaf21b1c3c2162a8784d2b3b205c542bf678ca6a36dae606982a6af112ce2012057708f04f4fac0197664a78c4c95c6e5afad3ba325633d22a3235a29d51a2634b022a489ef2ff624b9efaeb5347ece66a9f29c45c4fbb412668de97435c57a22bf3326173416d68d2fc7de7f2e4c6b9fe14cd0c0f5ccbb98ae807106be0088197da1530d44a3caf3a50f1bdb35eb2b50fea243a94e53caa7a2f3820b1bcba40c2960771aeef8f1069d4b7d49b2b41f4a36fddef2de98bed1059a2a85b406c51a8bb88541939650875e4456527e5ef9da301ee81e02d7fa4fdcd59d9577a1dd66d2c5fa7264d167ba0a46635400c32564c666e8f436a77779c1e938621195467b551ba2459cc85e1ee75042c2b6b2f9c14c254fab680e362aa5542769666f8848fb4b4b2b3e7a9949af9ec0d7cad1cc8168c22fd5a6be22e23d155ed7b11955fd03fa2908b77f7e553542125ce12564d6c86a37a32fb1731c709f36b2b0d178ad6aca33cfd6914128d6ce3c1c5396fa51c6f2216733ece205c9ed6edbb814874284aec7f4e5abb3578fa269fbf27d03c6c557d02347dd06c538a1307a99da55dd312ea7470ca418da74d90c09208ebd7876107cb1d5635bdef70bc2f0c8ea73fc2f990f708a6755fea173197253c771c8d41341ecd3632ac7d9937325e8a8b47eb047db8dc804c200e91dda589dc4f641022d663412afe525113f66a56a87f8734c94a3f605aa104b261a75cc8e68d596dc8ba8fd97f5aa1f25b8e99b92bd6c6a098d952a327998e4cba53f2545f0d1cf51a3aa7981b863b39848e09091e74c0da93438907d36d86edcb659d7e691a38e16fcbf0bc71fd52d47a7ffab6dec2fd8afc0fbe2089d88cda58bd6830c70a90aaa77edd699d77e549b3056ca7bf471250f4316a99593a04b44413bb371f6fca4fcf5504d5899bbf0869b5be34662a817702e8c69b2ba5284005e20ae71df1418d42330cce40458ce726e35f43c990647a05f19e10651dccb39c971ea0252b388a365046507c4d9225f3a7450493801f72929e4a02ef3d9cc7c185e364cf9b17ae4d4ad137c6bc69ef270c96b00453815924bb0f698ad699389af80c94d5951f65fa4dc0209cfce9e1a14aa1fd08d87fc2592313e23ab6b6f3b4bfeb1cea470ce7bb890fef3fbe4c24bab508a128c908e53db143ad1cbcce354729568e6bd39a8d8f0aa957afc79e65c93980f618e7a265c66bbe691caced7f26338a91081627efc6803269dc3c946195de5f53a227274c920e31aa4ad40f689c53763d586a3f681518f5d6126e7f1500f497427c05c3b0f65a9963cb971fed5c44a774a9e72338577c7287a25384cb266f467ccdb6837aba28ef42e5a9e89fa76ec28bbb058236975eccdb8c7f4ba1038785a96a5dcd0ce588919740da7a788a05de386d379c1b3f529d8b1d6438ba0791dead4ad139fb269bd9bc0ab96f26f81c6fa5cd996ce545f870c3a73a4a0bf8f3c0584a08044f4a449f2ad2083a09bcea5892f343bbb8af4e93efa841d0124a2b2c94c89a18d3da3df1197db43140805ef51fcd6aa6e006729a358016c5575d12188ee9e79bf384b252fdb62d1755c97b4fc0d0cd39b0f8328e700000000000000001f5ccd000000000073d750163ae23e690224dfd39422f558a85fca6bc7d49f718710b38289dae07efb22f769e795928b7327992fbc86d51fade7e3c0a1c3e0399df121d3c7bc81ef021ef05033712c3972823e24ce9031f5f58965dd17e94185eb2e1a30fff1f63d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e42185788e62e489df340375d3c063019e716c6874df3bcfd8101f986c2604dcaba822fb0899b1b4e402e3e5d53c3bbe8f8ffa1181c0e7432c20840810c5b6bd384b051e7442e3e4e86a987b5663a0eef166872f35dcfc63f3695a8af9324caaab35beddfdafba090c955ddbcc05b12f0abc212f375c72768e8ccbb528bb1bd3031cd3198bf1c096d12bb441987d07a1966e6b2abf288a479d33a1b8ef125d0d6b0209165dcaee9b54a3c79e1a427d06a9be271f72dda60193603b38768d88e8561d0a030a34e789492a593d0926e5405e7e94caa064e2dcf96897acfca41f568445a9e04914cc152c6be4beac0bc862e0c37684e79d2af69376650abd76101ead89190304d347692c4b8b8524e99bb3464ca5638cf67f531d1e238ece585f01a05eaf490316d2de2ddb5c1a9c092eeecc34d33a63540a63fc61b443206d35ce243cc6873d0311897d5198c673629b24d09d584977841220ed1757959fc0568006229d1194d702123299de7e9fcdb879be2dc04b6f258686568bb6faed92b0fa35a04a0c2ea6d2032359ac50b449e3c415539e9d45c258fb3e9b68bad7c848eba6c58b18f74f6fc98da9073eb4c3f1d66da6b7e47587ececb4b66f47a333ed96f93b70d2ec6dec04a41305c2e4300092102400f3e43757df75cb1779f6593eef0fe6244a52b16bf9743437922b2f67bf95b0d1ea36e60f600baaac143df67d1308445f4a3da95f4f5cd8374147dfe8f9b072a1fab16720b937e5a7355bf1ee7c12e1374bb6dcf9a5e1bd7a6939ebde73391d2d955790eec19d8acf7ecedbfc98bde3d2660d44f161603cb5be94436d354ab8923926dd942bf385b374adbca8bdbff2aea815dca1749a5faf01072a605b1cdfcdf367010f17f2180c56f10f9e20a0153d57574adf2437620a2b15c6b6c1c5fcc34f318dda1f1b30d4b7c594469a17a602de58d1039c4dd91341cda9eeed806ff44628a8ffcc9cae019564381bf97f728d30a4389ca7a39b35ae9b3ffaaba7bea344be520d66a45e279881eada60aa5040e64e756aea115dde6a03189596ae4fb49616b861d456c78bd208eb6fbcf62d6ab5921ff718959754ada845b1f000c538aef4809bf2310d253fd65b2359a99a05e98e67c6a1140d6bd38ea120eb27277b1a16e0fbc6f9a45b49036a638748bbbc6634939dfee78d9f203a272f974579f7ef3cdcd75e32c0f32e5c0c5ce003317ef9d893e652a6aa4adf31757e9f7562b9fa6c5d34567d1e39000f1156a84e52a830554be2ab78903cda13b233e234f4b9ca495a87a4074185123c7e7e3fb0b047131bb02b654ea203f8b20db2776056bbbe86e39a611c305fb9109fcd047478ea36da2b8505999c3b17e62aa942249faabc1007a04cde1f530789427362b9f62e03dab34961007cc386afd6a93d0d23a9c0a9e8e828538b761ed5f98056c5de43e5a7b433d0d8b920cf90897213aeed44b579fa4fa1f29e872e294db930db1cf338dd68b26371e7aeae155e8a069b0e5ed7da21fb3c995dc54a009e85284d7fe15c6ec7a73eb808b5021b5567915ecc1895753382e8f726f0373e3b265e13f799e5c1244d3e1395ef9e2cf6aabb63b91863ed045e54ca9304cc9c18a2ece3845c9b4b8829387d42ee9a7cde6e54869d2225c0735ae75f6f72a56c384a18621d1c4054b227b0f4355ee52ce10e4f5cda8a0c42619fdf321e9f2df87f2dfb994f9c60266299f624fd03ac8b9dae90eac79d3d84bca502ce976e966e69e1ab906f98aeb09a123d2a5953c238cd85fd0eb6f8996c499d6dae69af5f3327fd0e7e4f1e95b967412d8093aeeb4534e414bddb1c1076d726b064c14228f5ee5517373ad3acbcd33643c08f44dd8766d307bcf80e6e20fb3587a2a6441394ea70b85ff5c3d9fd4c3abfb5bcf211345088b29844b639c0a381d98d0751a8b8de2451933d66a3182610d482643e96b4f77a0b426a02bcdcaf7c4df67f404d8d2224b45ea1c81ed90191f4ba2a9eb0081f2ce523e992b9ea5f5bb9fa952a752eb7178f4d09b72d2ad6ee47614f0d3c0a6da9d4923625c973e317516cf63d276b1d2e9aca99ebad18b1538eef52dbf6ba41daec7f6e3120e8ec8bfa34450dbcf7683449c80a519076dced4ebbf280e5d7c3965358970d1ecaa1b3a3f16a4774a62d292776ca483c7fa46af835d62fec74ca12faa1e08aa2543a6be59917d7182d9dccdc399a7c09bc5823364ed6bff720904e618797f4d83948d5d6c49a3e45160d7958da50b65ac2946c18db231fdfebeb192e7c4defa81f8b85e225ed86cd9b4d2bf20f7c5ea463ce7e5e7301b2c04f1ad065483eb5e0d6225e667fd09cb1c1823b70995972098c76febbc44d6e898b99f78ba6ece28c3ef4cdbdf53d4c3d479bb918a729d7a602e94cb967f54445bd7f7e03e7f6d9bed67bfda9ba08", "00636563516563", 3, 785745161, 0, "baa8c3313b9b53752c3beb100bfa81ba3939a257c369ca2c7e2d3b24af553412"], + ["030000807082c40303c24b8139e91f4415914a5e39c347aad1b313811de4d323dbd5986254c963046201000000086a525252ac535100fffffffffdd32dd880296a9af5bb2825c743a7d3e206db33d06e7c45061c53b26e9e37060200000000ffffffffbb69a7cb8c89c5d8d5782e6881ec6fd538a4024afd5fd9e8fac76d18840bcda30200000007516a5365536a53ffffffff01c94da901000000000653535200536ae248de274c9068d4022ce7e901000000000000000000000000d1e7599498646d37b063e3ea601891ac74206358de96b9d031f47a4a8644f00a408fe9f61c232afcdaffc43ea17277df8229017242132ccf2831d25af1509b5753da77200ac47b0b501c8519e7fa2bb0a6b32a8c95038b8f0f160466b184d18700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8b14266d98d5996ce8f4511070ea587f16faec3d6fe7819a4f8977a7ac0cb650a10ca3dee98f86c387793201590f759242c8c65fc8d456a7fad0dc8590e9c564b575434e276ff890332297561a8a20930acfbfc33a8ff6153d4773748deb2e64059ce475495fbdba4e84198d271a4f7e9a9fdf1206e5a83f5b448807662509602220973dbfde5d8f8076a2b4a3bda6cbc191bd3b23860b311b15a8a3c0c21d931022351386c25323df3229c7780ae5bf02432a6941e6c1c316e2e2de984d3c9f1890b063b0e527b0be9dfbcaf2aca4f1fd9998486a6d08d1d21640afad44933672718ae6d431225fea7e7f759abf8dd2e752dbeb41420ed03471358c8b4d33d9647b6032cfeb2bf896883f046d29fd86d10f90b55e6f11e7d6ec4066cb038542d13d57f02283db90c69ee60e3a43635339015cc19e00567a3ff62be28eb67da93a1db1cb303292cebfa0614328eb6289c67eb23f8f4753ad7f56aa56f6e3db07efbacd5be0a03147cb5c4d946307f3d81d1839bc8223343035643ad504dc73e7c187314b8d7db022e51dd07fc4de5bfee9daceaf392974e9c4caebd4cfc0f08037205de5ae9a130780c77c55bfe95ad409b281bb5c99e4ab74423219dcf6845d80b95c1e4c37badf9154a373edc6f6438c2ace3784f21e9f9185ab47f240eee5677e2cd0af802e39eb2dcacaf4a481f3b2feb6647df3ae432254c2a19e26ac2ca15401212826eface2b822112205117ff2cc8fc7f993ecd6ce0967a7fd5fa8d3c4cb63611fdc6a34a8ca368a0e5e6c55ce579aa5d62ec5c59c6b8a297f4844d32e5532ddf305bd6ac87ac56373c07d927b4058a7b8a20506aaa15396cacd1655a4d60f3e78726abb826f82ebf4b9b54d0a87d7e8de9b76dd556f15cb9d998ab08a5e9e07e5b4dedd5d2bb4374990faa42e2b7a29d8f2f9ce2ad7b0c39853a970b9952cdc447e01f986ac1f1fb84dc40cd711a51ba499076c2814897d1dd072cf13185097c36162ce94c211ce76570fb04892d23106b5ca0c8934f1f9861952623dd087f47340c5f6a2b2df80acc36706a11bc0a78eb36c0a9b03318c45dc349e3f3645d852f29e0a6bcd06a0090f7267f15c02a9d97b7f9dd5c6343257297ab9eb6a090671fece723f3df3593ed97f2c31b8dce2442eefd57ef89106bba026405c8141c996603c574b07f0403f55e125dc4910481797a5cf10aa4a50c60a6b586eaf01e1d1c9cefef548d586b7cc3f68f6247f9fd7fc4fd8451555e78a79b9364efb95c1f3e010bb13b74226017852ae2b86018711decc0f1c25cc1d26a8d3f1a620d9a00296046bed29bf719a965a3898e131017c61f6e6287442e2fcae86d301509fe432526e935db8f1085e2d428d0016aa1ad4e328fd3cd2983197503a8fa553325c60be26d04759803578d0748d6603cdb681c43ba5178ce9a937ce14dcb6d035291c9afa4734dbd53dc1a42a7265ca2d4ab4e88a5d92421f1102da241bf4cfdc52a007dfde7c0e5d534f39920669df432bdcadaae46c1c790dff027a75138824ab5492c579821c5568eb0a7a8ba150e0cbc5b42b6e481e528ad4b9ae0811f2b0c23b90032c0915ad1c9e0843f612964fa6167b43ee8d859305fae505028b5a689da591433804f4f43adc72bce7eabe9a9d1aa6f2177d4c67e1eff85f73ce96c48afcd7f158dae939944c861deb71be173775e8817da912e1cb76b052c68e6471e047d3e33a1f64c291fbe9a0a699383bd9068573b65c878a29e8d11c3671d9c989a0aedc00dac6f57bf2c7ec5b89a255a9762fbc744f2559261d67d2e6020a3487589088f51b9034ea277767ed57e0607c6528cdf016d828c050ff1f72e898942fda8899c6484193e7586629fd0591a74e527f0ffea01faa424e2f9979f0bd3ce58ec26ef7fab276bcd44656acac6431fcad02f7874182bfaf31eb8343bf83895dacc084e9e67aa17a6cb9bebd88b12087eb37afb4bfa1ab6051470178d88dd5a3bf210cc2d8cabf554cfe8fec5a8b8ea4251d07afb2f416601d63777a974f8964ecb92fbfcaf807f450b09b4e0bc4063c78e9ccf9d3a671004ab1d0170797e3bcd14e64521666b3ccbe0ff4a7587fa90f65a5539f06e2dc77c235ba6ff4c7f4de8e17736463a6382d0683ab3ad228a405ff70b5673b22c0f09867f6491770d3f8c6f1f9c06d547d7bae6e20fa86911b7e01d989e2892d211feb38d667b7685c5cc23f2750b6713451aa99d8d61817129f47e626efa406ab116af3a044bb919088d5b1470e9620a25a9ee2bc926441e67c3dec0b5560456427f010000000000000000000000002ef1c848ae929c1939655423ccceafe3ebd79c7f18fd131ba135c14675bea30c7084a719a02cb498a5c40abeeb624359f27cb8596f3422fe0b3ac8c9ae07ba13f1b7a10ea5fdc9b8391172426732bbe58b35bee9ace3c0ce48f393dfd0a0528700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aa0637925da04113a5ef8289ba9e76c138a33ee5e51642b2484d8701b627f4378f61d531f43530ca2e242f092e9fb5d0fdf315b96974c5c7d7bdb4b7e6fc193e14bce118fc5e7e57b3d9b213e30b4af95f9676cc6756a1de9605f1d23ef2a1be411f20222baf70c333cc8864d185c4d928f56319dd6ea488f334575440b220c1030ac962f4444d33e8fe9219d740754df071bb73792eb6a1c45747409a31179e330305bafab0a9497e1305bfa3777a7cb5363c2393e241f70ec5e2c12fb785999f990a04437669b054fd35720aa56d80fe2ac147c2faa75e596d2af816667562d797170471114e20fe655d055123e4c2223d9970a0f0841906ec2832723d6f01ba5dc303008dcb19696111f10ab0765e65348f25a58e12ecadd8356e452941ca2c1f7892021a0fdc5f609d98dc0c38260e4291af69dbfdfc5f1a78d91e736de71821539d7a0204dc903939e09efed26239f9fca47af97c68927ef99c645040668f9844ec0ffe03197395daf57044a7138ce630a4aa7737654c0c0e1783941ee82ffbcb3190576902126d3208792fb4814e8656e842b5558156c9a59f706f6ce4b6ae9cee4a3da92ad9bc772c2b99e4c4e877284038beade89f1b399a650eb7aceef61e683c344669430719979a45968b7773d326b3da481ff53734be86298204aa5cfdf7966fbfa4732cdd65849305abe31aaea24e26afd810d4efefcf9ca54ef5c6e8e3bd5100e0839613b771cc527d6aab4701fd623a01346c3be5b921b266d37f04135e4932f2a7941c020413d40e84c7b9b8fa58ec2e1500cbacd87757a1f9bdda43ed8f45941dbefe8986c2343960406bdfb5fd1f8807a7e9430f267db739d0518cfdc299f261499abe7632e650ea6265432e89a47371d379aec133dc5071756fd1878cb3e523d91c06d253fd3cdb726dce237a91d56b95acc5d09cba1b655290cfc80e23d2d72d8d76e6a38b89fac50972a168af2af9a2576336c8bba86ce71c374a52a91b2bdbfb382825aa7592339d50a0116cdb99790422eadf6dc7bff2ff5c9bf72a8c8ae2fe49806fd7b152420fd795f63a969a618be355ff39a755063794f5ad22a4a104725419b048a15215559f5d53deb51c7943315ae4244f001d6b0f2fb2949f068c82faf9b2ff8218b78fc5b31f83a6231ccd8bee97a74b379251fa83bcb892ffc6ea70cf0592b0452e963431950bd38a16e2c921dcf9428e2088902cfc6f896e360314d919474f07eddebf0dc90f8eb6e8a6cffdc22246725d8f5365694e1bf22528adf70d508949e3c61f6f3aa8461337f3861a2aab24a46dbcfc389477400396493476880179d9527172cc5ee19acf02ac3264d9b2be965862a9149636dce5d65d1056f7c6e6d926cd480060f206be08a4a8b14d843d92d75d39927a85d1095193e6f58fd4d8f220854028fbbdc63b570239f4909eae623c4bef519ed2c8c5c0b2d9e337afde3b6de67bf9d1283ea3dbf7cf865b9123fa8eb6a5d0645ffc6e0759a558bb53bd62af3aac385e5b7cd2f0bd22ae7053024d880e88e1341b1cc0a23a2a4ae3cb30c1fd05ff561a3ef798fa71c09f5e3dea307155d5d181208739410909502cdc6d17f6e90d846f302cec21258abb039c32fef675eaa8c151738d68b2d4dec1facb0c1908cca9d4d2c71ac2b77bb540acacb701029cd1d2903db7447191c2ccfbd8e94400743d2885f488405ac64b710618bf21ffb162def562923abca3e971b1281f37a6dc2ec7026c1e180b5a52665b9a47782182ba3d280895ef7d8bee4a3a18ee887db6f36f2abaf8bb3e63688dd90ef4d013ad4623cddb5fd82fea2d58081d7361ae97536ef5106802ca5cabe10d34c439124fcff94f6b862e77a899679f44e6647b4829f62e216d1331071ff55dc99dd2dd6bfea48f0599ece1c165c8b9b6718ccd1ac57d2e7977ab2d8f1f2824bfbc214b8fc362c1f658380b0b4aa3fbd40d7e1e9ae60e17f385d70f78da9f1fdc8ae8e250e09b9c530acf330e6930dd395fef5d2e99248a706bb9e242163e6aafac394a22c40654953720f6b29b8e6591543a27923300d8e139ccf362f071a9a6da6e02e734c4c020942ba3c2cb5e827a7b9acc8bb666ccaef9b9dfd250e4429bfd5614a4d566562577b3d50e1c6becba5b09f79064626856fdaf01947ce106b253a3261463783301918545cf7b143352e79042e6244dadade6ec69933235d99190112e9812a788b9fcb65ab69bc09faf87eb83a029728367659f201b34a6edb10ac2e1fd6ddf3d306b4b0a944fa07277678a78f3ac0c7989fa18e3316993129b4460efa363f5655022382e5f5316b66574cb8babab098bfe9ebcd4185a3fd772823f89f05f4238f8ae5338b274696c90ac76b35722a2cf789ce8e3b3e6a5ca145820035c2a150ed0e1c5facc58300a30298b3271057f703eca0c", "6352526aac", 0, 534640012, 1537743641, "a6ce707837a3d714aa533a503a1d634dae0e64c45cdc4bff8eec593e48a6c366"], + ["d2ac99550459cf898ad093e519c130ecc31ad76c4d22a9f77356c17af2465b0bf472d7802a02000000026300ffffffff13267169eb7cbcfeb47d76b5fa542a963eccf5a90225b5d0cff9450c71f1f9120300000006525200636551ffffffff8b2a6e80c9d9d4e5fba57be8f210d79b403e6d8e953f078c978ceaa38fdc8912010000000069645dc7543cdafa2b7ccff57f2398a6f717c4a011a9b3e739e00e4ca34e677c2dcb4ce80000000002515365252ed5025f0f910100000000076a6a5200ac65530e0ae000000000000965536352ac6300005200000000020000000000000000d232cb0400000000486e6305557501a434a1157edc7abbe30a63f158cbc0b0a87c55157220d05a4edbb4c942556cd684d1f5ef96e43ed3f01ac74eee5b437411c0d7e441d3b874b71021093d7bdb66a651302d2c5210a3a0d7450ee25fd904386e1fbade8d29504700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb9bbf81c48e2cf078f0f628e8c484888bb23845551eab6e73a42ce8fcec7abff2c68bdbc8e8188bd09ad0d0e482e3c894d64e6e67dc09314f75a93a84017134962dc809bfa66a113e47cd3ac55a83f3f39aacecb17a632736a90f0a33b3fce5ee8fe57022df02e1fde1e476b79df710a0943b9c85504d2c2aa089718d1fcff103206c002b07a06b5fec0e5e473e411eb5657567db2aae1bc53b3e12c77c6998e4020032f401253b61fd5696f535200eb2b38e03f2d4af008549947ab76ff88979c40b05550e558fbabcb183d0abab5b6a0f7deaa0c1d7687f5e3c8b80a169e73a7d8603c8624d742a691177dbd65247a1d34ef85f2b02e92e7ede2f0e8d53ff7fb9290217191a2523f4d472405adc58fa1048b9cb2707f9ead7fb5c8d1822f82e78b4e4020c0a1a3945eed648ff93c730d90b4a070940bba6361d4006f403d399e25f67bd0322a0017442ae2f015ca0d1dad85de34a67fd222e29bbaec2dcdcbb4471062de6031e950eec1b997e76eac09c8bdde2af6f2f29b93eb18ba0ef17a55ffd57f89c8d0226c2ed344ff029e65a16d7a24fea8f6cef058b74611cb8d18ff786d95f5a61d318b55867df5f11beaef666360911d1aa05d7aba1943f2b138de06655279a780039c95c78b382980a3a2e0a6e89176ac2f5b67787dd4aabd6d812e3755081296ea445086f9edfb7e967778f5d73d08f87d833e47ce0eb1811b784871f511b29108c54828cf81baf92438e7a3bfdd3800196537c90a21cb13ba1347873a7e60361974725f435d46d0cb43e31c1b7e03768a98466f3bc600f2bc558fadd314b0e37f9976365fa7866a78d946d128eb33682be097e082850debcafbc35998f6dca118b68fd5e1f959887c3da7d70398b68eb5252b81d7bab3ce04a9b620e4ed69ed07d2d94a71152f7fc257011bde62bc37726b16dce6fceacedae2ca4c58a52a604c13072d010ca3a8e4d941aa47bd3a326c9e3f886712a24544fcf6ca99d60fd69558d3adaff7265b731a267000634f3be7a9bd0c340e41c20ea37410073e8c7cc7de4b344a224cc0c7a28756aad455e52c5761db4f8f4b0e64f058ab21377df3868e3846a300209f98b1b16e3406a7bf685c5c941d03a978b936cbfd94db0194cdd5bd938baf83cc357b6b978d02c4b0a2489b0d76a12c0825c169a0226ef057eda9ef55ae7140ed04b3f17765a91594009ff35d6d1f88bd89440987fa60c3fe6c9215731bb3505cc1e8753d052f417e0f0ceb69649bc5ba763202cb92a31121f2c51051f4bf8d8cfe1c4f1e434795eb23539583d8b20a219ccc30850c1a11a01f768a60946aea0e03afc90037ece7230bafd36816b8298cfb9668e2306af0568cd81b0317dcdb4f02f471ec15f549b3ee4ff055bc05b38bfc29e84785b07c5f137a840b778b5b18b721d4648c57cb33f36b867908374f7a3c5c51eeb4b1026dda93f3be6b2e6649166f157c5cbabe7c396b050acea4ccc463fb9239fa519f4decd582cd69ac6efad7ba2a19948b1a7a31dd539a4a5706448bdd36dbd5b0318c0f801847c8e33a5cdda250862ce4d8ce814ea834593c9233fddb731ab7c41a1e044d616b41bd12c5e1fc695e7806eabe22dd938f65620d34d667bb58daaa41bdd8becba8e0c1421af50bfa6b16441333f85cb3f46e894a9e1aeafe8f66f7ed41065f8fa1686cdd392741e72d1e68a5c150823e30c7b9f0ba81cba6f677345bddfe927312a14c4191f8aefcaf8ed804a623f8cf77cb4dc52320b3a490d74146e8f024c91b8cd6ee493307fc1d81416063f9fbe083f16d7833e76de77e5912c371cf235ed3c6329a0bbf840e64405fff256c457567db9eddaa71475712bed4f10384eea3239d0a7d77b5f8d7637c794ed1d4c584d991dece608f55fde4fe1033856a374142a7c8e06dc77d1fbd2cebff9297c82a35b8360c97e3bfd1f3adc17537c7f30d821aed4b0bd6c684e4849435cd256f3d719581d702f15eb8fae9c7fd6c310ff8fc87c1b95da2954285ac96612003fbffc233b0a4b0843e764123845907eba8e346d30863145c0767a5bdc9364002efd50a6a73c5f5ae85d0bdcc44f95f1170a798d1646f50570126b4edd39d272987bcf0b7017a52b8adffa844f25299d3062b77d1f15479917872d44bb6a7796c7a197e6861b593a6f1c38ea9be592b908c14949f266f975a7d9d788650b3054751719da22833ac3869c5afeee06b06d4cfa1f89fe204ceae69b2d182bd7104e4d0916c3ad83c5833ba4b8346cba7040c915a0af0912599b65667b636094b61b1750dcb96801000000000000000000000000dabc4120637139f4f6cdad3540da194572d8d711ff49221f162087edfa5f65488d9ed4fc5503f2967054315044f20997b146ec3e90dcb9611d48e7e471c944181f9762f5bc55d0652268ebf7bb23870c2f19e285b8c5f51441ffad4c046c3ccb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b71eaf75c4d88ded2d42197134aae1967cd92d3814daa316fb0dd4d5a5c858706262d0dcea379002070fc900014cef4a427b32d5cc2d5d4ac09d25b2cccb18e6a03ecdd70d7623b449e679caafd10ef1b89ca80ed8efbb47d898285efce6bc51865d4f8525a6c43b1d20071d824f3a6ae493a05ff269c1f380b09aece0ee8e2c030eec84b156d876e8afb173cdcf324a907ae5320eef3feeda78606a63511d400a03255dfc19c84924fe74368c1f4d20abbf1508c2fef60355065d3c03a046c162d40b0583ea4d65197cf8af5d06c115dfae66b7fbe71b8b42c64fdde1ebe3674db05bfa576669a05d78850d31ec852b51eb8e0279e848ea74763a6865a0a3c8dcc67f0203a9634c7990370fb8604b0d43630a34c03e35a3e2e2bef979cf7ac84c21d0850317b89d3ad0bac1dc93fe04c0b6aa2dd22bb30414cc5892d42e545989f1920532022f08515d6156f44e86f1ad2fcf92682e16033d96c6bbd09d86549334ab86f49e030b23bb0a96956f7ba7059d4e1b2d9d41f8bbc933b67eec21ca37bddbbd09b144032703f7488e4cbf0c689579eb7caf84df3460f11496656002892fd5e92fb6ce151d96484cda16bcd74905b4039fad13bfad057ab2c324306ee9711664a366761a485fae046008404a5406b085a9d5a366a14579a6b984644bcd04da47cba054b737a02ee96a5a9f5a918167a061596a3fbf3735e17367a6fb408617d027b3d4426606bd38d2386f63f02d3cec3287ebdf853958f3eb8fd28d365b5ba69fc6f3c5dee60ee7cc31a5208befedbcaa692650838469c38f0d19faedf19818141a1aea19d333c4ce8ba4b0961388e3dbe4c9faaf103d0d77e89e34d2d00441843692a91a96e5970b57c72f782b188c30c7ce6563af6302ae1235a26975bc97ee0b62f7e835db553bde2364603f4b21f9340c945e3583e66c940202e2e22eb3ede1c1dc2ad601fa37456c2eb8f60c0e765c5d86a219622232a2ed8c47e9af8a7004e53e5628f1a19f2af17ff1c12289c6e83beefb0539105e32f726b596c3459fb3b7ab32321a725c0cf8ecb179e72ff92ffb127b823361d7fbb2f6567a9b64a8ea568541fd75141a0d355f1cbe7eed83a9472ef682f0d0142e879bb9bbac6381f8d2f3f5a8986e8b4869079d4b3e4484ca4305705b5d2f39c5d4afb53ae0a84ef7d15bf624aa58db79aecbba3aa55e3f7b4fb177e451859bb9d07b046b9057da0e1801a0e378c6d0f6163312ef79a816c4981b0b8f3b4c87ec16a1e4a5d2e2ee6d11ad24f2aec528b65169fed3fe607dac58cda151ac403ca378472024165dff18c1133f5c3ff0e102ee9331f07b104375c7188eda23507b4a5d058ead21a887207f8ad9e92b76ded58e821eef0e805e8e4222d0e8038a1c4845fb8f71b32211041d5cecf56848df90577edcb29e3b7536a81402751a8cff9cd86e849c8d71017c30ab4bc2f2df05cc50b801cafada47c2feac9bb7ef1fa1692e41238598f22d0360d3a1ca536580313209f86d8e041c9d6079ca2d36cd0046102b7fa311445d2abe23b3704fdd177a8688a34a3c216678dab40808bf6a7d352b2f31d9b11a7f3b1f73e966d7ed1f27de4dc4e06cd7c7d160b65246e3431546d65a02c1bf4e8d877e6b0f96c59a5853527da45900c831bc5f95192b62f791c3ebe0073cdbaf933d4f312bb47ed3d54671d20457c072c0e0578e7a84e03a56946b4e9287dc27190fe6002e9e4b60d102c94a9caae6e7b7db174661591abf95088ebb36ee780855db81aa2cfbda5c90f528e5f2d873a82836125da9dfc455fae392f5651ca372773874e30f8a9d0e7c18e85955b1bddb78dd6ca51cf5871348b2a6ee6a9bcd139272ccc8653733fbf501830fdc2bae68c0634a6993ef8ea99e34b4ee9aefdcbe2f0bd28d8fcd4456f7dd8ee90b7f5a3a8c2f21f99709f24e9f0b5da854f2ed543bc9772a2887e2658feedd24e4e06e311dca4f81ebe9aac4234b7cba05d7363f11b93b8e3d8c6c80fb0c7471e7af14a8f234736713f4543c39ba08c6ae570729fb91aa53b0f8bdcd60815fe0ad880af1faafef44fbcbd72f70335b56a6f58f2a470e5f4fe9e9cca68e6985bcbad8eec8d35278aa9da516edcdd330926134ea28c262d2eac67b02a3099a9b4055fa63b9035f46ede471626f5b04eeb9e60b6c75a2ff1a59f59621bf8420065713686af7d0009520a7135755f5e93cdbd79d1b95507a3ba7cffac8fe45d5817f9b64f5c0ee81f5eb8ca849016f184b04efaea0854ab65ab23f2910806c5c3b433fc4a3762769f7b242c5b13ef3a87ece113861a62d1b604b3201d710d0ece72f938fe48062b876f181c234810180061017788958d12198f9ccffaa3f66710847ff3c03fc82a6ffd0413d014be1ab0e8bd3e021ea280dfe2f07ce960ae41682fe897aaa45c1a8eda08a0e", "65ac526a6a52", 0, -1737176849, 0, "14fc5790139d60cf1c25f8f75179a9e6c2613a5d2743a57013a000e938e2ffcb"], + ["587493250482835ef092e8260f790989a204d584d83e747a1115a0d07913df1c8f2e1658070100000006ac53ac536552608eea0893e4b897adcba20ae49af7655cf39ba1499d44dc6f8c5c86d0ecdc4d32be60320200000004636a6aacffffffffe07c8db500d04bd8a1703925eae7ec48b42ada5b34a971a2cceacd2c0d812cd7010000000851ac6a5263526a53ffffffffbf337f38b8df4cd8e369a1873141710f614ac24201c4ee14bad79809446d9fc4030000000653515253636a6f56e3f702f30a93010000000000e8a2cc0300000000016300000000030000000000000000d82bee0400000000247a539367d29c3aef66c4f253925e7066bf5de8bb33d54c42be1116a5008ed3f54b5abaa079e3e7977677bb80be7107a9df7797f1ad4a18452b3ee2c0cb0a3b1c790b8f114c464397c3127fbd18c7f9d996b8a26a33519311d8f1761ba3b23000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff036c78fe5b88f9d569636a6d51bbf05eb153198486c47143ff7b2755e306188a52d123e04da7590a58639c21f08426d70d04d5c8463ad60796e29366c0b055281c5a6f5e38bfbf4f7f4661a5692dd7112c2d35c1e48abcc3f80e266e7dfcb93d28a704a0f7b29e8331a171bb8cd40658dcaec922846c1459d9cf0b371a7d370219d6f8e9551563d3a0af9ada128864f8f78b3e1a8785e4e746aa36fc4fb6bad40223e68b41827dd38323d12eb59f76abcf24c2b0353432ddba107f31e2a1d1826a0a081a5a150f87af9a861e3faae88c820689dbf6b3b893b654751f3fb1607132cfe8ca2c2c47f10ff5c034d20d8863940b93fe3ddc515934531ae6e787b4b88cd9022a2dbea028bd8b24ff824934e23ba039788e27c74140e3c907b30251e1ebb84203016081350dae18486d3e4b2537e088d62e837e8719ea129f33f6decb88da2f41020a2d83e6198ccaedf6c0bba5435ed2285c8b2d3c5df57af36114f1c84357d5ec0323d67595267bb1a80b30ef122e00af1b6e44f2ead04d7662a50af865dd11c8b703263ad5c503abb0adaeb58f6c796bb0a676f97bf2e85d92f911b20148af1fbb31d83b68ed9d6c724940e803cc0d98ca2865ac5e468818ea04ca1e4e9a19924ee4bf49001c307b52cea67314ccde046e6053e59eff8685f862b668390886bd53d1aeb93ab0ba048fe74851d1ffc5c6b1713080d3601df0c8b26776e7ed406700440d92505faf504cee5295014c9b09893da2ab2f9cbb0f5a8b28322e66ee859916186286463411bb594612b22aa1da48827650f2de9a2d8f120a450f3b067d096961c5f69df4bbf45efc72e712401d028da365419730135717eccffe23c9ba2cedce794598437be24b59eff900cccaf76f67f9d749d27f9a605b3df8ba2d1cfb20b1eabfb27d15afd7508c9dd20fe7063b4d948b6b0718f84e263f9d3376eae922cca721b5bc057dc21c66cac5307a0aa69e95a1226adaed81d86d71e2e49f328e98ab7388155fca12b7978b6add1f1abf99842a351036ae2c7ef545d27d53c8ec8920dae740afeceebeb858bd6f2a477a14411630578caee762bc0696f37e55ef221c26b9304f6e0f368d4a1ca4f109b5dd45b9b4083654b4e14d42d80c9fae6ab4adf4590cc6de326efb660dbcc8e4863724d3edef93a0204bd8b86a129026d4d1a4b4e00dceb2ae5ee6514fe81ad78db35c4517d978a599ac8ab390510a67b5b4c9b19f8e440629cb9665be377ed393ff7dbaa02f3b0ab9709f9a424821b694e912ee6ef911cd62a24f8f8669207f971f4e949b1d087d199162a7afece5f0ddcc8508a6f73f039756746641376fa05710e5798df014fbbef554dd843f9f8ceb17a5ae4f7f3a4203ac6e33d00ebfac1102961bab650cec58e55d4b05e41e7eb027a3fb3df89d2ca4fe7f5800bc8c6553f29ffc2d90255c7b2807c4e3f5555186274adb132e6431273ea42f06cc35839bb57a28a0d8f2187d7b7cc10985258a9ac9101c07dc6e5070e26642177d3c586df79194c80dd55774c0c6744d133c7e649a1e7ab66c2439204c0ad903222ef3cf3b232e544d029bb81e66922208a6c9465eef86aee19a52b816fd9649c44cd5caa67c545efd4e04c43fe2f12e0cdf0ebe231748cc81d4f72639131eb832a33d3de7d33ad60e0d96bb65deb326dcf1cbacbc18ed2096db970473f3317dfede30a6540849ec810d5b35223b151cab099c3afc89a9903e107e7525a329f24ef3381b292ac25d0c0a5a61bd65fc075f1d1f10145df368b5969740e1db85eefc53bd8b39ff848f7188340a189c2c3fd77cf76cbdc32dd2f905bd700b6c40c8f23839f5e367aab28a51423ce08b28c6478efed67c5a4a4c3eaed945a50a528f55f59b4f929859a600ecf333b7a4f40229cb20ad8b937ff863ad1a86ecbf9c3e23b909b55c4ce81fef6eba4a3dbc9d574a870ac7c69de8be8310ae6f30ce22363af1418cef3ee243bfbb8aef0dd8148bb8004e35c67b6413e16270a5ca68cc4b0496512aa565cc5d796dade76bd718562d171b06aca60bda5f03a07829018188b49bfc94261719419bda6e22606d2173dcf03db9fba6a264e3ed31c2409e17aad543b4e9ce42f32258f8153bce61c018ac6288622e7a7fb682f37bb0f4b903910f2d4d660d0c6bddcdf451e6d7bb3b9ca5f31e677de42fad4635cea5f2b8576dc09bc410fc10c235762cc73b04bd2162e73f5e679469bb236a241461e8b928d90e7b3793c3df9839984cb1bcf0b7a7f1e411f1a7595329be4d46a92669b5d9d4078ccfee65cd0000000000000000f6ab350200000000b5f886b34b2450671d0ca619714a65524373753df09b598b9692f7a2ddc41ff444218e374a4618d9047b53e453dd3c1aa81023303dd81bd2011ef021584212c54fcf27c9d451cbd9245975fd0291cbfb7486b98377a9808d0e6c5fff9f4d74a700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000882ab925adf75f72cbf2df6c4442a16fd340917a60b3870b037af271d4b4e0b89242a5a063e54f999911f0e31025d457b656fc635c137a6785e585b20d06a8b8fc7ebc8834ec8f0c752f70cfcbc41d3aca7173369d0e748b2dd7c06e70e264f7115e7b366ff834f9e753867fc5ac44b3a1619a85c106092c598c77630b3fa5c502038ccfd13c0323d090ddec0bf65facd7b03ed782a7a3076c0f841261b03cf82603205512ec6c93a158e62cdc7e0d9261588bb39ac3b01b5443a4d246f695bb45430a083480ad660ec83c6045f565db7ca9ed88818af8097f835a02445b550e6d44259868f820b24203c418edbbf27053b51928fea6a1a2637647f7c588d9c6dfbc8f031cb561bbdafea4cb4451ecf246576a6b2b7ccbc2165529d28d63ee71f5e4e89f030ea7d7583f5a51b387268cc348d88536752622e92d05573b6792502359fb574e0308705484b17815578f21edacef84bba8f5173135492a254f5958b7e611d4b4780212e8d3977caee40c6a91ab97174fc76b3c34857c9f3ceb2b77732cfc913aab70020ce5cc034374e14f2f5ea606fd6c9cfc6d3ed82c02160d8e65004a8f8e2031424d2089cb4cd0906657a6828fd5b8a7822f5b4253b210563be6697a29adc4dfad2f1b838329bb5925c8b7adbe75ae4c64386466b842c80f2399dde002e9cb1945607099d48348f6eb067c80f63844f9db0c3ff772d72ff1b2c1e571131c2c370f489ff4123edc0f220027407306a6ecb186990682df1691da2cd5e66a2832a06eab479eee976b20bc0960e058c147df82b0e299295d8135a51a3cf4495054b5f152a66163c453a84a97017a20cff0fe2caa9aa82419863db61180a1771202e69f2be6cf53d767cafdf83e4fd297ccc88f7e7985d82a1f6276c5a2441e654a0d6e3793c4e41f5752eb3a4261ef7e0b29136894029d534805437c547fcebb100584c2f7c1998ca470990befe7eb2d233626922f6a65e28c6b1c2338cac6562b82613220212658fe37fa3dec294f43ee38ae3e1be65dcdb358c561b0004459ff6226dd27288acb3a402768e57c816369ae4c393940a0ecf32e495fe67169f4fee3abad9c740bdf658f12ca1b3023d8794a7dac844238aabc080aea913e7cc67b1692b720da8edaa3a3722f35c4e6b36846c1939dc147b39bff478e84c1e6ab078b3cb4e41a8215619d6aac43e25405f204b42d1d618cd2f351da4954dbad85803b387218b9d0e8d23e79cf48ef86871eee9eca2b903fa0e8d426682cd8c918e688261de21a4691d13fd04f7ba149c6a8850991d2c2f85aeee3aed799cd26ebbf810dbf5458c834cb91d93395287f6e87c13b11d7595bb76bc1b08176d69de0ef6f361bf89a4ff5f76abdd0badaa5120ce2ea686f13f68fe9ebdd0530799e1065c6f77d8f2d27eb4304e81574ed10e278baceff5002cb51e7a1ae27e21003f94f1eb835e20d1dc7d6f16ee26f10a992a110d5ac1ad0432fe8013f15061645242588a89cce318b0da31cc6717911beaf4ce9d67edf5408181920d4a6e96b421bbc95b4d3d0a43179219fdb0cfee72dc5d088e71e95aba897f4b259d539303977bdbf390a851485965e4db44868c015dd08d4ad1ff5a3215ecb0bd7975a73e36fe1b112406b9be53eddbe975f7baa537e025eeb7ac975682f49611fc8582b4e82263e06b2952d1ca6fa208b29aea780e0ef250e4d77360875b0f145a0f6270ffbbbc8a92ac19b1db53635ae5b0057e2d12d30e155baf0846247383a53393675de3bf82432a06cd41b4cc95332eaaa33d21022ffe3805a8cb282b223fa036c94be99d4e225971872123941e5c1724c0f729e63e5e7a4f3be1e23caca90713546f22eb5e00e49600ee41287e568608d5cff4f5e6aadd5eb0784e36f4a2a77346e705d8c7e0744459194b18b17d8dd435d5c70275d3311869e0a9dc55802c9093d55066e542d36ed1051556d70218ba3e985af854f493a0e7e161e66267e1f3ef7bb1f15787cd0fcca54154de005e9b86b125ca9f26d7b7a070473698b0ffe96ab104483872983aaa74327a582de56b6bbc0c351b800f952a1e67b4ad2ed820aeafbed2f3f0dfddc747f1e01554dfcac3857ecf6e8f5a04206107a1e2ce170761e90c60dd4211a0e8e4eb7030dfb57f52caf4c0cb324b92c63195e52883014855e7f297b072f8fe9acdb05f25184218bf8f92e6b6f490b1d9d7806a3428f33df666d482d3e29bcd69bcd74c045a09be1f1deb83f9e6755faf083500d9091e0caafbcf5397e39f58583c171cc64e305901337266f91e64b000000000000000032dd1a0200000000b801714af87f8e87f5152c19139e50d01cae36bd7f39b5444a01b024127484f149d3dd1b7082c72a01e4e0bebddc8a24c61906b7edf82f5eec5bda1bcfb4e52d199999502b0d2d224d52f495e6d0d89d0f0c57e2da1f49c5b52f01805b0e0e4e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000864f02b74b375f6a51db2f28475d0e4e9f0e78e0a12256d0c280bb9c00c572c3a8013f2142e699f6c8151542e655d6d1aba0e41970f611a4cb0d1654ac498e53cf38529f3f6d3ce1c2952d67072e11c6eaa454345219e8c1b71459036a650dba03df5a4452441ab24879c388fc809e45a0318cbc6b5e3bd99872f22246f9162f0307dc15e49bae450c86e76b30e61f45bac9ee33c26d71d44351e076d0a1e506d3031377f65d3497243d3294a63a2ddb9bb9759a3389e4d4f848e3602cdb39cb014a0b08eb2527fcd85585a0aade1bef67f0622470a51677c0a61e67a9194d94cf0807800194034a2abdbf4283749ca85bfb5455ba391d54bf7ab45fd2ab3396bf841f031028be3b4d91109a6214fe443822d97689fd6145f8b4770d2a4bc6586a937acc030b8bb431f04a9145f1c766e550f10c4de23a043155b937ed90a5c217ab89ab19030a4c89f8c5feabeeaf7f098d0594c4eee27d1951ed35d2b85756d6b704a2b29b0219f9b2c1d77489742e544ad236ed26d810a4a647f606cd7434d453a6e8efadaf02081169521d023086b6f9c222c9f96d1fae2baff6fdfa7042bddb10a322e5655ed3486a81fb06e056ba50ca58f46f7f5cde7d7816d6ab2df7f8a0df8205645e1b9bcbeb6393bbdaffa6765da69227188ce1be389382038122262cbe7482c63df9fd6d00685e2a94c3cd93139db61116f7aaf9a2b529131d639bab6bd7c74435aaedbdcd2b965669d8759725fad4da497766000a41398aecaf0083d40fd93f590a5e3f7c70771907d3128acc83e5be33080f3f423fe76506e080725e679fb048b73776f0282947b64f0b2e8c7ea2230ec532e090e47cff799188bff2351f572e4577afcf6f9c5ba5c0229e2c7a7237e245f9afdbdcfce05bcc49e3b39e30b16c7b9e9ec427d93fe8c66acdf33202bf236832f41846847dc4961a354d10e248ea120ad74925571a8ee4079ca5f8a125fae66b520c71ae2d7054eeacc0850a66f3c921039ce69d21c10593dd20ff3f846e4b85c2b0d944e0de10c876bbdc32d08a88e17b82755e57628a78546a06cf2cd589083cc5d316b1ab982d88037f1a32612a891bd592e77dd755455c0732460279db504273af1534fc55b90ffba341024458900771410e985aa6c6e80aceea343345d028a55f8390837ed5527fa6b29f0ef8594f4b65f8767d99731dbecfcddc0aa2498625435cc87ea4d5ebb2fd916e0cf9267e4bb7abfc48c41a7993c8532b80b8bb03397ad97a5038320c86367ccdc3642575ff6e89554521f53db39174db0f263f8a74a4614be53313ed2c9d1ebac5788c7893b7a8114704764ade7d4e1cf18bdc0b0a3c7730ceed5bcf2d434a55e0263f07a5894ca1290f9ed5388290a8a72cff284efd1c753d61979f3e5bf113f57a060b77ae25c5283c012d250c0a2dae8365e39342569fde68ebe0b95d15cebf83c2f8b8fb40134e8971dd2f0bc916a2e4f5fd33d1daa01d031e0e7aaddd31bc83c9b172759d93d76c40b2f00bd2ec370de99dc1401ab7660c5931a95d74b3b91b24686a6973f1b86435f4b239efa9828a705c9c55970bcf5021a390f19bf63daa7984998efcf5f6d2ec1c9eabc5367b25a5fc6e482656488b4e3758d5b9d4fb8f18c4f8a32e34dead65c1440e5df33606c4bde3f0d2a532df3078b33bc7c9326259786f03219e97b3ebe504cfc5ce09c9de6dc420daa99da4c9fdb29e3c118c86e6376a42c3bd3a727bf508d2b871894800a1af05e92008ec5337a33f212c3ee007a3619968472d1a100ac6bacb908dd9aa91af6a4eb5dfe7b8279981c248f7a4cad27a91ed5d5b5c86224df7fee323da4faba5cad3dd228e6f10bc74883ea3b79a67528af9ab42269976bec6a7b501bfaba696a4738ecbd9bea4ee3f5ac12afaa4e3d7772cee69fbfc0d5a882268627b93f7eeeaf2e049af5c0f64ec32221ba4163ed94df4ecd99bd5fcfd5af9af51572ced8d00ce4a3a42cbc1ee97df4bddd62974c543840486dc6da5c0215c8eb9ac204e921c69f6724453eb46c5cf322f9288a6b99aad480c8b473b51a7c8b86d52407ae113c4bd6bf55460eff898d0d16da4edc1021ae4fd0ebcf2144a0504f7c58a27553e80d254413b6de07a6b088f81446baf4c3b782295accb9abc1c2f8f595b98daf02ad57ec631d4e71d2807df07cbaa74692d0660a5a22b846e9e3783dbaa6de278742ab62438718e796d461f8f99a4dee39d09557a27b0822172782171e358e3ba1600bfa7b92455f74821d19ed0be44cd35c3023ac1d1886071e0930bc3bde5af4dc254d4107c18231f1f47179ec9549184e66c39002bf2c6b9edbdf9a2cf0941075f76b73209f5bb54866175c2961af3150eb040549cd831fa1c8914d08ba3a6e0c22c4980e753dc69cfeafb00665928001a6a699c9007f08d46f7e9fb05", "51005163656a5363", 1, -1151607228, 0, "b65584b39e4859714ddcf9bdff6fab7529ed67e78f6a896753d7b954dde1d734"], + ["e8d84f1b04dd34388d11680a31ee0927b70398cb4c068f2a1fac80bccd1a4fc01c8d890e1f03000000080052536a5353656affffffff4022a966ef142edd30be11c4660bf0cd787df38f051241ebd92cd62bed6974060200000003005263f14cb34693544c1782f8daa1e78bca7515e616294e437ae7cfcbdf0228b0ea78d22bb4be020000000700536a65516a00ffffffffdcdd2b33ce50cca350a1189f904f86ebc1e8fae972811274074df52e0e28135d000000000153a6f5b42803c7017e03000000000753005252530052727e9f030000000009516500ac51636a536515e0900300000000076300536a005353ea7368290123bc27010000000000000000000000000b5b6423833539f086721bd0e83253aa090fca0ed9677aeaae7b5d0cee1a11cfa1482b8daf926bbb2b86f392def19b429ee1c69976c8b9675d1cdd81efeded34ad5c997d0e1c1f9d882acb681e3ea987d263bb4d1783c177d934c40a3c7e5ba400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e6c614fc667fb709f25fbe6564f0d358fc9e3a6c938c9c315c0b5707954e6ff5154918b93646bef1a0ae468640e81ff8cee07c683cf0398c911c05e814baf0d016a8ee4c6cbe976a66b11907207b022e0b1647544e16b56e081cc3bbc5614120c1eaba0ffb5fc42cb09b4c79754b42e0bca0cf2a9b40dd6bc90da06f85e5d2250211788209954aff85f1ea0f822d86e40d63995667c66f41613f0f44449ebf342202080bccf3000b9fd998c682add4c95d60287b26f8346b455ef95395dc1fc663520b057f1d04da7a1c95c0e91b52f134092416ade70a50175605a3887b4a16427d58374f6f5be71e29a079e94f290a1db94f7e530381ed34b68e1d99a8c4700a495203024e6ad44e38e06bcacedc24c6c9eadf0398758c6eacec4677dd3c7ed9f1b22102165c495d72de02b37247303cd62c43c2aabce8bcab20ac26d730e1a4546e94850213c945f6f7bf6381868412dcbabfa6e9c90f2f845c5c7648abb971d2397103a30325c07db02b3a1f963ec2dd55e6027e70aa3c205732382adf068328d3b32b7dd70227bb91884657678e06e49bef83628231b40c7b87093d392b63bf43303df7953ec9f7177aba41195f56f253c9106bffa8702fb6c46a835171f93f83fe134b45dfc3521d1bc610e2b8ab8e3e102d024f8c6b6f418884a56a7e6bd42c09a7704e811c1ffc0794315860a1b3c2246c30a837e21300a0ce559acb7eee05291f6c55a0adc4b1c2201c398e50f931b44e21acd2e99907598da4fcc59084b2bb5c1a32b8705d46563628408ce0e01d94a0eb25ed26b93f523bcceac4e7668282afb2d04ecffb8757911cf9a55bec1ad83cb60502e3e91c18e2195ab0f02de7124c0d89479c4d43d3ae3fecf4ffcd18fa744db8326d463a4a7f62a4aa1a874c3ffbb00edc1809a08eb998d9b391195274e51e016e433ca643f2ae15c9cb1c440b42df85b4481acfed5fc7460816243f18a05746aa43cf3ce1c375a1445dc919823511a201dda1a882af387669e837e2894da8f6077a42cba755e0df2bd8c3ea4448e1c2885d43ecbc91fb1a0011b816f983840a5974bd1edc2b818c9a405312494f4d9f5df39a2284b11292bf95571ad1e657e46c652813c299dc9f72e74c4e4a769bf7403a7c2016c7a1daa49b63359aa3b47c563865d6d94265e3e8f50e509b146ff80bd1827b95168ca19ecad593b722dd0b03ff1e8f50b046215498a9c197594bbb5b59ed09e2eada7e6450895d836844724c5ad063c9d5ef5ce6bc7fe9f52ba404b4133601d7021f717fa4de6758d70b892f38c5e37d7b58a0eb20f2a113b13224ca725d821ed5b9e742429a5c894aebf975bc65ecbd66c1712f91e0ebdf685dfe3f1f246e71186edf8e18ee1c0cff6b7feb4ac298ed7f4a2f7066218a3ba34f7c355ffa421c3f949a5505403bc2aaed4b4b6f95f8317efed02869e7d77891d033379bf6d008b2bd0bb7e009e31b9da2b73d4082be2a26d9980eb85345485ec0c0e77cfaf3deade27a4fcbcb95e81214d360aae2e90c9f38917a30ea637377e83758468713b9f08320ba108cac340b454fd041886d152f805b1836e97797cf5b9cdd223f5900fd7cb616fe9646a8c881ce3c2571214855f30c6a54dc69971cdb532ace21e0ec5dd38a6e6bb424b50906110a229c37cda74d1979a2462784022762a55effdff9bd6771f569c24d71bdc024b9e942dea3b215cb481a499f102654a12eaee50ba8ccb9fcd32a1878f0d46d676a95ea8641a8f0afe12e0f6a3089e1d47d4ba9ed0482b842ca22d67a930e63823ac183d4fda1cb3978e63e9c6e0b564fbfeab0d559d2d89484a535b73792628405fdec4d3b5f586491fa7af9af340f1255ecaa315bf3271b425fa9c7ef91640d8a1a00ef1c70df21e26db63bdefca9bfc91e6ca32f46b604ba2b42014c74b5453b00937f380b36727eed550f915c03afed54f643a3ad89daec8380e76994cdc2d268e0a8a25baa4f7e8a0140e006622dcd942fd58ba06857b151bd1d843554fad3162c07aef50ca0247d340112794ee2f1efbab6f7cc0fec0433aaa711b65be42506a5269c90b76d331945e3c70091b6d3839b5d339956f4cd378500e904f30198924e5e46ac29cbf4eacbe9013f2d17f529e782c385f1b64dee0a8df6cd81373e91502fa7d374032124297c7905bed95c4bb3d4b59853c767b4552776327ecb6e99a3aa91f4021156e32c376c2fba4cab3765fa1a993fd17771bd2963d20c91e3693909d49e6e823f9f68d6310203830c33184f1765e300aea7d302fe56aac81c6c71e4206986ee25e844e1d20e553a260d0a748929646cfda701d2b80d1682e5442d8dcea4e91124f7bc4480d883a0a3c2e4b20a4ecb4a17d2e638daa308184cd60d3afab5f93b11036244f654b6579e3090bbd4fd7515fb5c7b5d7f60693eb7340e", "52", 0, 618766484, 0, "08f31088458dd9baa56a5e17c0068ecbfc3292160363eab56942075adade0e0c"], + ["a2baf116025fc2ea2a3557adaf5993f5144320a8873ed149d7e181ad2ae227d7d22c26b3ad020000000600530065656a5f015d68675d0f6b89fc678b947c10d95c3b57638062a634ca1016ee126e0b17127e366b010000000363ac53a138b9c5047c38e2030000000008ac636a65006aac6317abc60100000000065363005265656c8e3402000000000952535352526a63526aada9dc01000000000652ac526a655173c435d000", "5363650000ac6300", 1, -193632113, 0, "85a268635642386f3b26fdcd2329eb4da26d261a9614b2a5548970456c95c649"], + ["030000807082c40301c6de028ac738b73785e6b8daee36b2d81196f9cf8d107052c40a9efde60c58a700000000056553635253ffffffff0162710d05000000000851ac656a6552526a0000000000000000030000000000000000d185480200000000ced3df4cd767b47aeac6af04a96dddfd8c88d3520e8a2e0d3fe35506f0f6488ecbd85b0feb8eb010b97fb6468e3f2c0f641b6130cd7871da014a55533eb7638e64a787238112060b80418e804b67ae32fe8a32a95e3778ff40a4477f5970388300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000681000e27f3de08d35bea8667cab34d0750699df4e3d0d2dc147fe71250c4ec9de2ee40ede9d7183a4df487dce8fa51ac1a0893a7a958240c4ddb4879cceb6b3f24ac18480c3c6ef3fa0c32e385c4a9193fd6fa74f8ba9c1e68272f5ae92fbf1558ae5fdc41e5655f43250bd37faca0e3f82ee6f31ec8aaec30899caa0a4a95e030cad5c9896d7f53c355e602c1139d2a0951928513dbcc71509caa76dc6889d830321a272ddce184d974d2c0ddbcb369137c0dd9ee6cadd465bbf9cee219db755aa0b078a27d2f07e6b69e2d076a0fd84f287cfa43f4527894362c642c3b0d66ab1a82787074672d8afa576868ea614164192014554c758d2d4b414922751cc311e590216382a206abf1590f7a512f2ecb52ce806ec11b4d1f8f16687567342e18ab79e021ce3a165bb8c6a8b0277e2c3ffc86cc53e2f24883b2f6cc57e30083b62772cca03279a239d7c619568e4e3172c8e3fc5fda6e55c0e43c7099abe31bf2ef9b3fdef0325e0f92cb5de7be8abad4408b5965d96b9f990a7a620a198dce846d4b3addee203123b5900e21d4280c2463fefc7f818251f2d65d102f49b6ef9c0678f7dd121ec264f18505494ba3f1f2d176f932682985776f20edd504e27902d156a43aab96e4f0f80a5c56e8f10949640d5d9ce56b50728efa1dae9dc2d3bb09fa7a92f8bbc468092d80b5ab6b35633b5ef2dee002a5bbb47796c909d5d53309140126a88fb1cc6d6e76c7b5c88d3e262cf97613a871e864a7581ad0bcf832c5bb85e50abc637d1532af0188ec7124b55a67ccfd96583e7a9157e89fd5ade8af252631a0338928455ccfc740d526412b7e35e8c6e77d9db77109de0fcdaef0c22dca1c95c06e22f8b8e7cc2049f83f89bb7f6b9cd534a4f3b41a52e27fac1bf4196ac12bbdab620f2577f2751f2319fbe56c3840b48261eb200f465f0a28b83fc191736c7cf9b8b7cad389cb6792c5682be1ff61ff2673527a641188d43fd73c93d39036e80f4b29cfd46a2e201cb68f35d13807f56e17e2c2f255abc6bc2e7fc0137ce9bca14c66987beb9f94f93d2d4cc44001dfecdaa67cec0d9daaede2e43e43e4c2b9a1195b51e5602251ac8884323158b7124d613c2d67a72637d3e7cbb697922b4c04a9a164c783b496aba7e1817d9d2ea19833e698bf936865922b352dfccc780d954b3d0e1275bef31116c84f8fe520bf106f064c9139c90a4681ccd55911b9c88e36181407a0f68188d45e1e107ffb559b190d8db755c19ed717b286c56a00381d62f4858f23584f5e012cd378f335183235e03ec5df0e1ed443023ab4392d545b2eeac6fb3826c87c832be519c343493f1309abad3104890e3b86eb32732870e0069b03629c490f0915a98d266d86a1bcae94cfdd8b132988bbec2abf92564e683ec7f7f69c1a67bf6119e078c33a966bbabeed3339a6b48f22974d4a6e13b23b852183a6463af127e92b0a8bf0fc24947075553004ea8e0b67dfb1c4f02b562f4c68eee95cdfeb33704f8d4ab5399014c984b72fdd1d3d4b3bdabfe14dc32263b9e4cb60ca73058067af2845ecfd0998258444e561c19e9725e7a6693eebac2fdc663704967c3aa47fffef045b79ae35387ff9c6b1ebf87c823d0d21eb7702f16c8918727bd35f881f1f7ab907b79d7c6f51b520a56bd9a8bba2dd5750c8360f359aee7a9114f9e5510067ba0a731bb9a6b1a6267a862d8f98b4cb63b62d14010020837b19f9b1ba5f3b1413485150172bb2a0d1b2a0561141c06cde890610f9258c01a05b71ee8f75b1e30ed9ac23e9483297a79dba8035388c23d2dda6d546e057477d11d8b4905fe31132467d2fa2b691d92cdd04510700ee50d66423fd05bc61685262a9d2944d20a7db262ee5cd0ddeed59d29127e3ad2d9b73528afdf5a2117c4938113256c43ab1b49330d8a3774d7499662bd050aee21db09a3b296ef7d73dd2aa37e2e6fea517585aa19956ee9fd1cb84a1f23b33f8fbd15db1e59894ddd32447027db736595150b4cce51dcd689c22f65347c0bfd99e3df7a6cc16efcd91a0daa19a82e456e9e18eed8b76ee4f61378eb634ec05165bcd1f2b025a90253b7a63c9cd773fc522c64b7eaff92575f0146f2571cd745bd276f4b237872401e978ab387976b2be1f1380232983afc613fe8a159870039e70b10b025ce47b6e832195f5b289ccf2df6573db206d0308ed314a8da285d549e18907412454804f518abc322d7df011c4c0cec4aa0cfd9a2ad91760ae327eb78bdcc7345930b0d4c0fe6796fbff5ae809ad8ba0fddb498d2f25f01000000000000000000000000302ae4c416e9c8d0f8a64563ca6959542845d8660baa5f77a3903bde7f6f864b69dc8a464688ebb7480fee31266b291af2db2da21c434a25854ebecc9360bab74a0693a018fb8d2aa3a5b7cba396794f70ea8725b8fdd3aa8d16fee9b93ad74a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b187da1b6f1692fb287aa2686c31bd176d3a6e8af4930b20a28b313705a5f642e4c6c0704d789faf4cdd40bb2d7563b9b20e1f57c0d36861e317bf5fd3d8781440931721f8575d450ee06583ed97a7da90e911e41c6c1c649a731eb813813c6aa0d93b1897ee84f2717b7792672b857f75a675a4e445423a5a02a0345e3e06702248149e1a27b22766c58641b2880a626ee3cb05ebcf926f1967539afd76d91aa032b66be43dca73c3bd2919356f1d86442d215a912d0d2c9dadbcc1cfb603364990b05c8c48f71217ec8aa0186f5e8f69707453e9a17f9455ef9a2104472eb39bbb632c1948340d04dfd63147f7f40908e112f9ed452edbec6e16fdf3fa1720f6eb203231b55db8ad41a9de1302f68c80326d3aed6a7bdd6a83033e3ba76dd7f2cefd70228cc5f59f26dce29c05b5c95c9a33ee10ded6f064c110ddbd592235571b9608b031a8f761cc70d417e399586035530eaa6883577562c6ef6719f06491528d561760218c289f3d91ef338cc2e6bd266581202324de16d750b2422d54e9fa6963ec9df032b65a9e490ff5c8503b299abc0a92674eecb55bca1e53cb35dae9bdc3ad37ed10c75c97f554e89ff674a5dc96385f46fa4681cc7e1c93ecf02fb6452cb2370efe925586b7e09e82d38d656c616fe598241d31704b3224cf4ac1910d3ad575e27d6f6f789583bc548af01e014e3f19ad32cbb419c18c54f779f3dc844f736cb4b6e066eb7acf010ba2ea3e1d96c404174704049b08a67bcdfb3805f7b6d8083992dccb28eb1781d9e07284c160f7dd917a0fd136ec80c642b4cba77469888a595786d536dc38beb6c0443e05b0dcee26918b50d4a0b81ed9bb0d3d3e2e73d2a95b17e632958e811ef34e9b733089e67d330dfd24899595a523bfc18d1083431d643ff6207f7c44c432522eb963f2b36ad50f95c398c6bd5b220e31900176656d05d7e047636f7a619d7ded42770a341d18a49e8d05c1edb083b00ff023316237d19ca7268e1ecf828cd3575578bbef7618fd28e79de243b1962fd02fc0cebcf7a7a82c0444c912d01f3327bfb3e19ba3d30417b9bba78ef8a780b9e52f0af963eee532b61ac03e0349f2d78e76ac13597cdd60838c198fcb01c4cf6865c75104399ea8c4d41a9c1be001e9e6079b4acd12379e7efc25eb8688369a514eb11926d25c4e02c8ec5f2137af03299b4836891cc031c9138e1375d5b27d53cb785b2ab7567d6f3de941c2dcf89addec6c7ccf1e723ab81f52a98a2534c65f7b027e9a9a14f28fb5702772f01a93e665a5eb0202fd83dc502b5082ed87ecf97f288c73b608136767def2a2846a24b6188e5c78784ee28eedbd3280b67dd84099ffd5b7d940b29f4f5068085e8604e851df293def9c8f9065ef406a291ea7acf673cbfea0bd37ba4e415fad202199858f1d5944511553cf9eb19a3c8e07a50ae905547994ed2cd9816a7d065a4c2b962ff6db7b21ef84805c1a1ee9c08ea80c2528ce3a57121fc908aa92db1910b723be39280715f473c7e9f99097fde862528d8db904154900d7dbc8e4cb9fc1358148b52b9434c1efe645ec889c8a84adf9bd910d67b741cf4840c367a012161edc20010be66675cfb1ec52b9c1500559244105840e2be8e62742108b0f1d6acb759c151a46c017614080be5d65dd5fb28096ab141e771d38d01c4fb35b3323ebd18381910ce77edf48f4e3c9db01b3c4a198efeb6e41e0f03aa80953abcdecabdd9ad9fb2bdf87607afdc3ff6e243b3ab1c0ed101b8f5e2da799522dbf5446016708a045982dabd9252afe774fccc66d85586a7862f7e43c52d65337a544cea97d6f03630a624cc854b6d189d593b0b11930efe88f93d4f8c59970a94268051af9e3a95f4d10a36b8c2bae59088b6d57d80ded0e6d50a8b04e8c8bf2925524131858b7d801f969d5469c1e3ca5c3cec415c78590665aac2131d67fc3236d225bc51ab88124d8b1e275fd5af7c56f1069017b83039c85b13b7352c110a2c880998be236033848f98c719eb8beaa8dd488b5221fb4e931a14aa7224d17a062b81d613e801ad86e56686af7dd3c2ed1c70ce13a02a07cf0c914b0d4523a1f89417cfd536aad5e780e74ee06535aba51794534db21aa945d343325d4ed0a4aa9df958fcc413c7d81fd46f1622b154a8e9f139da5793d6b963d35be0280e8854b65acb69618463b71fd84a7d532061cf3ea73c736cbc1ccd7331c0d4f90719574a5632674af9c2adde7a4f757c32f92d23ae9600755a5c1c5004fa653f7fa00cc4f1dc6e9d006d682e62000000000000000039e1540400000000ea5fc8ad952ae88e6371e78d40278418b1164cfdd8c5af5840b12c504ea09656bae4731fec58dd989793d6ffd8e9cf58ead55bf0d02221a66a3cbdd7151b7df1969fc9463263f2a16009660a3a85e960725cb4ff91b2affa3767f9afcd1eda24000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000520b1be7d06d223eb8b03569ec2fd67437100ae70d741133e8eb581b023a0b6d05b1318f61d68b8631dae79ea9f0c150c9c97826691368d6a09e36f88158a53e3172b893126473e20b21997fc8150df44d01e84c22460fd104bfe047f2fbe86bab9c8809519615dd95c3068fdf923e709f970744509447a9b4957ac492fd6fb0216b0dc262c38f817ad021c06ec1a13753b03f983ac01cdf1887fd8eb726c9b5a03294208974e3a718ee6d8b82920f032d150423e42b159e75ba627f6f3af14f5e60a0813158e8ba5f8c7f1f5f999c17e24343f49446e333bc128f0e3d4d57884c6fcd3707d66eab7b61074cb4abb15e95a76707fead7cd8e6cb0c2d6fb59c3eb2f320318fc3796a1a9535af34d58690d09d5b9cb91589d105deb8d2914a4be02763845030eb3195be47b4a3d93f3d4ca3c49fe82cc6c328530e3e384ec9e9a5686fd246f030989bc316f3526bd8591a7b3667e2b6bc138ef091a1f456e0fe59fdf3fcbc06902057e8dd7f92adab90af9686eeecfa90841274c0f7e55df78039eae4845f296f403000c43dc6294275b0094fbe7395440fac7a7bc06d80a17455aa3947234cbd73fe57252e8f9cf6a9a73c372d6151fa4edf5922336d3c07ad60b34eea92be7f8ed71c85942b6a4d780729cf43187e56e2afcec805fb68b3b70f19e44bcdddabd4fdf300f6ebb9b1f29ba544c7d39c938690a1ae9d36e80025ba9c5b2b82c262bb5f71378c9919996673cccde415a2084ece829e650c7223f746a45c3cde6cd0a156a9e283b1782afc1cd7711f02ceebd2c011432db6b8a48216e4f9ae6ccb3bdea0e3f28b40b0bc7d2615c28411d9672a0229aa781e4b97bd967bc5def381a996d8823efe06a16b3453ff53897673de0aebb94e0d0d8baf0c46a10aec5ea4a6a8b93f1e415ec6a0df4820e4de4445498015235445e3409e8ed945f3d747ea669d3ecc4fa59238499591480903ad17ee35d8219676b98e09c0df4f0c2ffaa88ff64f83913555a5ebd5a547c7ca894461cfd63eb241ff3fc92405dae3665a445a203a52710d7f9ee3e48251f0d4676d73d107a58b4be3c752b3a4687eb8e918cbef6bbca2557cf986bb9bc5d2694318e0b05e52f2969a6449e0283e6723cd1436c6521237bc7b2550cf53d92dd7200cc8395c4b83d48d1f333ca80d3e0bd27d725a9fb2e3ba9629bfa947074ce990bbce6fd419c109a6935b0302f38035ebcee5475a86a136c4148163806b306724f170d8b1a2f8d33a39a5154e2174b760ebabe9c0f057754d0a7259555399176381ce91468aa1e4505b5b89c07dd8fc5b84038af4397e15184ed261e5616f36236aaf0a7d404f39674998e4e641a12708e27df9a9644bccd2db14c1dc59054aa8a20481b68e7ad6250a13784fa7d306a2109b09386d5660f1147981ca7bb9e1804b2c58a6613473874fd91144c1a4f8c571764ab8f3d09f76550840add916fe9ad83bdf4b803135553a1f9ca10aecfd75897aa0d87609f36058ad964fc89900a26708c868f15d8ffa82e5b7356a3c3202cd5ca6c21bfb61e8615a38fc680902b451f9bbb50be895d863fb0edd2156e9f65ffb16a11d7539663d06ee0efc4ee6fbe8e55e0c9db2bd7588e8b8129b194f2d2984363336be696fd034332283887562023595948fb7f26264ac8f5c0b1d444e4db7b64c700caa79460f1624f35a9fe24f4ea3c60198e4e9675ccac2cf80ceaba4fa7680b870295c0b6cc88e6ca68739195698637be39500898f2c5a64a3eb6b2ce70ee540213ef0a4e37c6ccf50660cd57d1a169e30c859632e9935782a09ffcce4e4e63f6af6f133e067bdc24e33ff4b66afba47546107a9b55adefa2f35b2d448b77364219950dd6e153cf949d0f515d518b790b16a75439f3176e697a032da5880d4f2f509e6e5b7348d87a5723766dde6aac7530237ff9980e53494e0d84c64f9bea822b4f7ee31e95ba79fb12976e2b1046bc1c93989323e68de5d2cb59c2deba47669ab2a3fa95f57ca88f62438405490001dfeabdc3e2fd0e9bd18ba9480bbd38e7c5ca0e2dc3e9c4612f7df526e7591b01228068ea9c9761a22b39023f25f79a90430c786f8aabb8f6c7ade2ab45c70aad33ac8410b6c5a9578867a999a6edd6d2098ea97380800512fd46e2d2b2dd33de97fc615a283d5c63bedf50f23b48986b388ae7461254e9642ece836b5bc7c08a62d972f26f1e6f18c88895faa2b43103de3e170535474b2ffac94cc20148194985d9657b7f48540c1eb6d75a7dfea5ef35a25b466c8db285e94c47ce2447c780d133f41c8d65a94d3585baf44a74997d996e56f0c1d2b4753ed95b24e2203e74c4d9f4ffcc297d725205ec6bc1b71f82ad0f62064a559a7cc70ea8287d652046c290e12f8598cbbe211dd0e0ea7b0f6d340339a4ff7b52a75b5d02f77ac28e0b", "52ac", 0, 660027597, 0, "b4fd3662d31105044e1da56f5592bd5d26289b7422c121499fe56a144ef727dd"], + ["030000807082c40301ad05ae8a83ed97bedb76991bc8a817c9ea0c1068e4799f30374c17fa84dfaeb200000000005e7bf00a0242fe1c030000000005636a65635269eeab05000000000352ac654357af05aa96b96601a1691201000000000000000000000000cc78b554b828854114289ec6e05f69ac9449ffaccc8a7fb7993f3e035d0cd81f096bde543e718e743432606e25b14eb11cc4f4ad54d46158f22ab3fd18deef829e538696ea1a3a5049fd69a814baf213cd955b3be10e85600798896088838d180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013af7cfd482de04aeec6ccaf563aa5672c6a9146b70dc2e89ab8db3a574b2ce9f43b7b4066c03caf8ea58696ad758e0e8a950e74688dca7e3b57b8cb0a2c6fce3418f87a605e6297a769030c241b0c5f51dc99a98a80dbca55cdccea618e3c440d4ed881f702a6134f74e35d962b03efe4ffe301dacf657cf615ac3561d56309032d325fab191ff03293a8acd1be38cec58d72d44d4aa4cd79a8d653818c2dbcf002200b2bc6c8c8d6607063989b8103167406c9db956c0deb0b9650e9067c9385630b061b2c07594534332faaef41cfc8f1fbe6ed2df5e7c5a8f2b6206b74c528f5d3aa31afa7383368598fafdced31d48560ed313e7ac80c720fe6cf3d13b2b4a91c020f23bfadf98b0db97df4e7a682c0a706572d4b2baca92ed23e136e6dabee79e303151f660a6066fa69f94d1c968af53b7faed5e16b8e7bb1301284dbb86aa9b244022e2d057090973b64e32d56cbdb578dfefb32031f117018aa5038b972d808ce19020f7f3da0f59273ac247193ed276a89c78b10a0cac364352437b9ca04ca8dfdfc020b6def9f508de7185e983072684433407e27ef3ce6a7594c0177daeca81304c84d4aa979a07046dc9302c25d262bd63a1ab34f8e5f9c0b2eb54e7cc6325b843ed738d70ea2ac1d783c597bc7a7d01cb6b60e1d5507dc47a9ae3c5817c452fb1710b933a1141c5c674e52cdbf965cc4b28a0eebad8d7d8711a02d98735508cb0cf9b5cd4cb09f9bcd021b9089f0699fc96757c1f5bbe2a59d623a1d54b44ec25b7ad3baf2dd0f4d90aa3de8a2fd72e18c3e08226e0addd3fc569f649e54ed84c9a7cc31b40537012bad08d8c0f364e7b59b06295661aa3861380c647c3ebeed7068f08da237a92d0929375412a0375ddb80c9a10276ae483efb496f5a73b2d674ae9dc5ee1649bf46f20125c9b0810c9c7a2effe48e2b048c6a679c195f93ecfc1ac6930d735bbb8f97c71c00bfe306ffa22bd59ba5071f03d75dc45755b285333f51eda6c5d1e0048aa06b1bb4577843c455bb8e9f51c8a1c5318b7e2e868c66695e5bc6a920a332598beaa365f42a37585012783f6e50e166410cd5cc491117813ec59359e8875273d95f76e5bc004b30ca192a292c55b368a9b6fa0de7c15915efa4fb856ec0697bfa96e6e3eaa475c79ea37679cbd24a484b8f0908fa6fa1c164be55c985aca6ebeb3e0876faddefb0b56aacec6e85800783753e7380817dfc066f397bb7962e71ff46cac9ea1ac6d2c5d7337011082850dc72d8497a1a16daacdeffadec37467970749e562f23d939bc6486431dab6f88ad1fa9affb1176ae5dd5e860762f4fc1ef27e2cb28b3b99e08baf2684dd11473ea4db6bad908cf5402f2ac20d5d424a675796220cb25abe8320a42a572924655377f880ae712df257e7db4a7ee511c3dd81612b74733ceaba881c56c6a1159b0bb1c72a7472e949c44d9eea093e1c34193535ef6170986a039de22af0ef9de9dc48e332da69e8bb6c5f71c4025264810f8cb564f320c820296b7e5c9e856a8117a82645246dcec6a4f5a7690ac5d6d64feeb1c1fa4fd50307379d06187c98762891dba160e61b9d7e206be583aae65b46487bffb68c5104de435273d7e759aecf7fa030d924b3d5f92c36478caff0c98410f275001886d33f0de2c788074c7e6d31082870ff7bc54029092159731221e981b62421232afc8fed419d41e63ed6df054c0a4e35ed5286207dd66206ca167aef801634ccc1ccf9eca6bb2acc56d71e10c17bcde82ae3520e587d059cabfa248200d80c5efd255fefebfab2c03111dd3a9ff516981f3b2ca5819eb084c8798154a1f8faca5bd9c60b771887dcf3ab740f60eb48be310a2f43564e131a9cd600eee97dd7be7fda947acd47225241c458e6779197b5e2af5dabcb81b72c1b55413c38201f600a3695bcc440c06e1cb0b3d4a1bc037ba99e7e4401d442e221aa4f260be72f307c3ece4f12675a814648d794d4dbefdf0ff17e566ab735cab64c0dc4383147ff4f9f13a3869bddf2f0cb7ffaa6e21df7a41563be3eef7e2d6f7ba821a4134bb44d0f0a4436b986f8f17b36803641be86844782d56023ee6a7bc8f2125ae9797d31dce1be6e1b9a0e189bb9c8ed0a074d2331db7074a90caf0f404a7e9c134e3115f69640809c153c83fb7936e69a8bb2f156548d240a7a81f3570df90bff04b98f868ea53d963a2939c18e96ebc56aa00218e0f274af30d877dd8bf11bd40ff87f265b0aa874416153a0ccb64d192381ea87fd333e628cbd45d38b2ccf97568bbfdc20a48229895310d13005cbad4708b385dc33c0ea0b3eabe78bb8278e0b489007872da5fdb29e17eb3c87fde3761d59d073a9e4f0dcc2c74e3c9c6d152e273647efdefaf22b5c0e295617ef3dac0903c1627bb9fff0010a3368a772962254c1a5d01", "636a52ac53ac", 0, -1168871310, 0, "c4c4236d56d315bd9c81cdfe98eb2aa8c11582c2800f171abf8902b639249cea"], + ["030000807082c4030124b1b40859541b3f0959556d64616c1c63ca8d0cce960e0c979b1a70d228bc430100000009516a5100005363516a5c6b9bce022a8a0d0100000000065100ac00ac65606ce1050000000001650000000000000000020000000000000000f7406d02000000008cb8bebc383b828907310a2db83e3e7c76c409d5d17321a81537024a9aa5cc1a35e7897b151d6c610991678bc8a86e7067fb0b7b2f3019c0db0951a5eda6b3eaf26f4acd182c2ae2e7e80fd01eff81b9135be99a6a9b4944816a3eadd0103ce6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c178b5d95de55d53727b902187ec45461a3c583cd143081d3348f10e75afbc49ce479762277f75fa8ad7d1d84ba4448180643108f68c11ba5e7a062338618437e7701622a758ed6dffee33721b3dc83aa3922ff27fba606587ba8941530cdd093d10eb5cef779fb7f6826f4da351105e22cdc763fce587ab37588940d8d8a36030523758b916b25e14dacf4dc4a33e42c2790653c0a140672e22e76e7a1bb789e021ad201a3762b00c0bcc55309809098a8adee7ef0b29e15d2561d6042c98757ad0b011c46f2b7521d380ba2c9d0cf6d77046dcd62c3086483ecd40e4780b4c50d4b1522e1bf128cfc175653d332f3990b217a60afa4f2ed17ea9d07052f440b9c54021ba8d841855775d42e5785878a3c963c5e370fe4a886bd662a1976fd293898e302204ec37d0a3f81c9cf3058dc5ba1d689f3845ddae7371ef6a721d6bd8c05281b0319d984a35db2325e400160481df37afb23be8512684347684807d7790b61599703200cf805d3280f9a32b1f985ec7eccc71ef1dfd3a39a8f93240fea20e20fa4150219a3f47bdf41df1be9650dd1b6de0a604a04a1b4c85d1d3925582418176174260c4da24a5cff21a4884db2d16e3e70c563667c9512af2e2d24cf980b73335c53d768ed26b8f1a42a392b471856f4dfc5c6daca5ddf7442e5fdaff6c7d09d96fd0680fa5ee72bac5544a097c11575aa33c698bb126b5adfeba9f3beb541a7604e609b86a8835ab8edd9e21171345f8095b0ba80b0b06a0550b5eb1965cffc9eeeaa0bdd981949dca3edd7afe65b8ff0c01f482be0261ff64650fff41266783869ab39f106f6cf1099f50a0d0695a68c6a15019e0942e7ab1b09c92adf8c83c37c1b378158f41fc2642e9b77c554bb0a20d67bde7912ac324cfdff511a5ae6452bfd3e625c3b68f9fc87c20410628ad2744a635563ad530014d47d1e5ee31c77c88af2e7dc8b3696c9acc936ab3f74f5c762a80508f29cef7fe89bad71a6f23844e5b2739dd59de688dced410a98fa781ab64c504df428826d77116e7cb39b9ac45ded14d09beccc20cc22c10d544a8c6f6c7d2c2b4b45e925222c0b7953f77a6a641eba0984aaede66695457fb8221aefe8ee3b70895dec7a2470bbe91886d743849dc5aa9eb8f2e4b7644ce95148974018b8d5740443977ce28160c4db9d2559ca44eab6b64998c090fd69580b6eb1a2151baaf9739d8021fc531a92f43e107095bcaa903b18428934ba71b58bc207ef026332ef280823863cb8123a2561d60273be8b26a04ce92144f18407c492e36eac7b22a34b2bb7d9cc0518f4f99dff4011fbe621ae1cea3c276d0c654d22e8033f4e0d755bc5f570fb39324ff5a4e5c1dd3468b28ef44e99cfd4eef2b89b9943a1d0be085f172715ed3216c1872b1b2f74c6e42309d97f25f44f845c1021463771b4f0c740dcd65efe0cff3670d13085f36991247bea0d111b4443ee1db6f72229989bf45123a9d47272b726295d7d688cc17b3170b579a99bc54c9bd201df2c80fcb7f78f5814a800c417b63d011027e809178533ccd885bbe3eec8f2fd2e6cb8cbb9023d54fc86e353c5155468cae1eba22efaeb7023be147655c0596c99c437e2eeb4e223f1492718e65a836fb9cb7ee9974af12eef776b831b12f271186a00e3a94b71daab195a29a58f31d01855a4e7c16b34d764fbeb64dffec5cfba7f0ea173f31f919058ef8392c0f5eff3d25bfdc093f36d389b893a81b0e5d277fe1f89431a75c97feaa6e4c6bb4d2525aa24614a07511c3f9478f17b5ea9b43b43ec1ae4841949335e25a51dfcb78f01b151c2a19ce5166668daf229afdcf46971b6285dd032d9a5d667504d60c318abc91ba3f30fb04bdf0859183323ca9a72d73371f9a3c04002eae6ec41e1365bc4cf4459e7f8b1199215019cf9c4ad6e57ba87044f6b6e970c1ff09b5c3dd022c9d597b40b73f3d1776ee8c2063ba7811b7f6cb057996ad5f3266be6e1b20665151ca096a7824b99508c11e1370e7decf19e66d39961e983188cb811d09386b88dd7c7c90c60e2f1666098d978d1ca5fb990baf369ff6be7d3b2ddb03f75c4784dfda417996cef47afe5ecd72587439a6c74f6c65a25cde1b265ae3e6017a1ef367a30eff45de3efc47a0f22429c4485ae7aec818a972e2bde3082821e22621cbfa76b97f63a11bd11a0a35ab85cb80774be705031e6fedd73fec271a34ccd156817d447acb2e6dd4ea5611236d60603fe516e51c096544a805584e1f847eaba4e48c9b337f7db27229e930f46979ba39811d29f000000000000000029ae5a050000000077f4ebcefe90266235d23cc53599b0ad86413c00d1244b34614066197282178aa50d17748c37bbef93f8c3b0234016121d1843a5bdae1c6d7cc8218c384d953b3366b79c437d952ba5d1c309e33e823ac5e904bc19816be7f2846ed56343b0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000067453fb995090db8811419a4eded99809c05717dbd7d276d655eaa96ee761a72508a75a9bc4b42b86c3aade58534e5db89444a663f4c1c27f28bf3c173d65e39d3c5bef0a06f0330e1d628d437e4cdfba0612c05980fcc0df35bb6f164335b7041dfd686f1822631d6638627b7ddb91dcb764849f14c71866f61a3c50e5a13ff0304f559bbf70bf0b1fac67e4dcccb98ae90f46023618db01382f169a3c98540b1031dfd1ff592ce49655adb4d14a3f0bec1ec20a329746d46c4578bd72d8c12800e0b062666bb45ca1ce3976eeef313fe2a130ccb26f0281d19272b7df65ecf4e2bf73d82564cda12c4ced0992f49dccd5c2ba88d30c4e3cd87667bf0bdbf75647b9402293ddca9fd642c7a93b8ab6a950df601a0f37e0c77db753813c682237c89ccb0021822a286afb7ebb8e1dac424b1f80872b9916e3c6b7122fc49ce49bf5f09d800030f99cde13c210adfa31247f72d3c43e45a07adc956019ad8bfc9e842b40dcf30030ff0d6b0a6998942bba995a9e58e9bb1d216053e47d3a763de1a20d6ef1c3d9f0224142c42cbbdc567d555343db116fe58b58bdd64a522cb55be8079939567bb6f87be7f1b37789688bd46a1a8fbdab32f19a057960c9840660f7dcf4ebfa57d11d8afef477bf69da791a38773159549576feddb9845c213a4aa5294b6d754fb6e6c4d4cdf3c0dfb6f02b8927bc3d0bcb065ca33521c7293275bff68b0f02c514d33d84a62fc095090cdb8b25c2242f0dfea4d2f1443cc7cb39df8398e45156708c8b3f5b9a2a44b65af7c6c8dce151df7a57e9680f7afe24fd95fd53502d315cea0135661937e843d8607d6dd9989bd9a5e34cef436c824216971ee3c7d59123b76465164e0e5534c34938507bb52988cf9c6723a0a3f9f713d18db77ccc55d6bdb69006c6a7e90315de964292361fb543a954cf4ac86de54c056a790d65dd2c38f3d4117904968eaa5bc4e8e05364c095af4aa50c173137aa7feaf95cb8a79db902d80067d67b80d3a1612de0bad43cfa36ced013a114c78968c086bb1b08674f34957ea8f1930072acdb3580b4e64bcf0e03486daf5215d112c60fae7b74f95c821ea693c9d35d3c2daf489abda8ae8237c6c92afd06334d86f9a58cbd5924ec52eec6e4826de67abd3d433e93b687552d361d8ac420e15ddf320c5de829170629bad92607721abb51b1c8f6bda96b9f46f491321aa5aaa6dad553c570b46ae429d0d5c8a416f5fd24aee545c0c44b3dbb49916faa8cbe4f4b2bf01184c3b2296604ee13e7fed35eee71be6c50f678a41e96e1aeccce47fcdca21121a363e85bb954a478a036546be8d7e48585b5b7a835a6f61ac5221ce2823ce1cc0e6bf78e1594bd3f6f4b371de0575187add513526badeb8edd511ea96c106aee0974dafc4644fdc4b965733ac6e38f4ed1a0023f0d2aea020c5ecc575dca53cfa127717e94cac980addb7f55831cc8478803dc4eade1231ed03bc14749dfb3c999d5e33626b3ef41752479e7f54f4ccdc79b9c615d8a0f59ad2fb4a1585ac6d6fd4c0a687d7cd2fb7f7652b904c80a2ed301f1925a9a13196d2d923ed3f74ade67b0c4d731dc5374d5207694e7c338b46c4f9cbb38705fe6be49b54e5deae5fca64b07a4fae299261b46fda4f4d5fbbedc3be6324fa828d13b43425f5e0ef3d9db227dd1d417d1ff93d16445b49f376a5223afb45d7b10490d46e4763c94c29af9bd1e8f71197c98edd90e38bf78ab37581fce17667bb90aa8fd709019e764087c9f6304085bcfffedac0efe0ebea9e2b5dc422044e7567d3dbc66d1bc9712474a33803db5dd5a6997a947525684b88f4bf19d031bd296d8a6816193c170e1af8ae4530a5a01aef35fd341bf59a60071f570d85cc26a11ce7240229cb3624f2d5ba144627ecc56fb84cba35f95ad273c740426681b8b8e068b663b011b74426a6daafb7f9552cea9b4413283d593b989b635fe862ddf40657a9597765d8d8177d9b5d5443d7edb0147ef5ca18756206d3bd71455e49292aa42ce58a4d2e0c0714712abe567e14608296400630348dd758a64db9d946ded7e0f00a7bcf7290d799e3a883797296c7d3aeaa9ccd326155d4557ac2df67b7af9d805a131304912f81fec17e18285de929ebd87748cb40d4d3ef4ae4b69363ee42385cc2868de014010ab1ba63c51a9d7bd0c274ebf6029a334054a537dbbb490107a2d1764c90ad2c535b46f7e2efd38f6c0b64e8ed9d7b1c25c57b8be2a347f7baf6629a6715612c3b39a1b6ebfb0f4627b111081312df5aaabac6f7b290205c7653707cff2685757b3438c26f77a015d65e49653dd3d39473c1a59baeb10b8838fe7f0fb4557eca55f0abb5c998a947dacd7349c9b75bf9b65edd43c1c9d792fd950c2a5a341fc3a76a07b4e7db784edbf6538135b0100dbb8e250b06", "63525263", 0, 1492178970, 1537743641, "d8e10abc1c9659c9e9b3270274c44be5e6e381a46017765d5663e89633534dee"], + ["270aab150419dbebdc861769f76afe43a8abf6c32bc736d90a2bb550e322255e6748a1c62c0300000004006a006a0b52f10e2e44bfe3337fc4c96e4a3e9df9070adb071f87e49a37b25a9bd926d450937f2e02000000026a00ffffffffaa004ff4f3069cb844f6544c6e52a36b366d6f092c0f15035b08a3e958fbdaef020000000565ac5263ac7f3ec8ea76986b3c0ad17b167ed9865a6f8bc3856c5bb9a05193b107bbf50f9dc82f43fb0100000002005290ee363b041ac6f304000000000752006551ac53ac5441f00100000000086a53ac00ac52636501ebac0500000000065165ac5100518529c204000000000000000000010000000000000000319d73000000000031d6519c7b95574ec9fa93f583be90ba405f0ba66160fd34aef7f67069dff9c2eeeff1b04e2035d298a95adba2654e4e550fe68be52a1d0e0553a1dd73632663636b3e433476d913d7c2568b5e04a9d59775cfb2427e1edc8ce008668909a02d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000944225726d8b0d54f8dcca95fe7eb865dd1fc8e52f5835a2e16294a4373a2a7e4434c0edd946eefad11491bceb57faee38de5f99009ba42d6a8b415e8a2c841abeb07d21d5866543161984ea43f02d6e77dae311588bfe7f8d6d24445fbcc7c40a8eac5c8712de2d41a315690c891058e7f769931c0372ae8fe5884c4ae631050227bbf920a67b5933ee8935e04a5614e4546f95f5bc352802988d14f19977bbfc0229b494540761ce658c4dfa6217f4ad89038a76a367a68e92fd3abdf3e08354320b01c81863a2bb789210934bad1db902cbac45ab44c1fb7153aead52b7050dd133f37e02ecc3ccdb6fcca8826444d494739479cfaaa498a80785e294f2ecab3b5102196992d9c649a323da6a14ff72171dbb0cb15a5f4fbd665de5e9ba0f6d58075f0302ad44970d6f83334542ec554fa9a7ea9766811313e554e5143c6450671219ed0303a78fc06254377730c9531026f7e228e5382de76cfd8a7077439abc42d0ca5b0221412506103edc31bf7a2c38aaab5d61a8d73e2c99fd9f622ea569e0c241e9e9022dd039c767569e4f8e21dc31928d6adca2cbec8aa4677d2a3cf75578ec145f4d717ba9891235a75cbe9c78bfe146976d9e2dfdb7249814e82debe88bf403d5dc066361ab8344a3c8b612ca7982ce2233cfa5be6e7005c5bbb50bbf8cef0ddf2b675a140d0f494b6607617f493bf5fa4a38e1c731f4cc99082855baf37064cf09d586b93048186042dffb9a3fda34a330684e2912901ed45733d8786f771fdb8fc1e2b28d388d0043957c2a78f2f4d1c762dfa1d6bf39d561a4a05aaf165d57d7a426cf90bca38c0d360c9cf2ebc3ae0838cf90ed1f9f88ead5ec88417fa416262822eebd2e3eace4fe3b7c64cb388ba9cc94b6082ec716821060ed0c8aed3bfa26d35028fe350bd42fbca1c409afcffd17ed699abfad3d32718a587810aa6d9f66c9c12ad3ea486ee7eb129ce31b7ad59c56c2b5e987febb0e33bd0ebbad62d1052446d565f775c9643a7b41feb976cbf27a16f21c4ec726a35e98dc6772ce05763e2ca5fe62a42d743cb179df4be330827059242bfb59e27c7743f507dc7b30ff168f9235d461041cb59a19d61ca930af161f3d5759a4ab07e4f824daa810b570f6333b05c40bb221de80e4798695bca8a4fca2dc69ac73a6cf2dc851cc1ffb081c1e75915d791158a79181811e4935a99ae6185802ae6f65b528250c53b80f15f29ba155fb249caeb39ff3c3583cf046c67d533515730fb276798527a02c8c6370e4aaac1b1e894423b95fdfedb11b938c8d5c689ffd0a92c18b22a10f65a4c00e7e2e0de62329ac997023f21a18e49a667b3c11f10b49300930644d96304419cb174cdde3f3e86bc76d843871ccda72d8164c00d489489d5b87118e01751a9d81dbaacc65b7b5166de48ed541e283a7beec1c5bfe70628ad15689f40c686e4da04a6dece9802afe2f8006a5f8369eaf41ae75a4fb806e46c683e1c77902aaa1ee9f943ea434732dc989d176e8c6c444d765ea2f27deb5a86df6c3ec29e6bab02c4bd86e56ef879702f9c0eca28ed89cd85f1c5444003e29413df948d87da81ef97db86d03780d29e5a4c7158d369c6f2979071101e0d555ba233ac2a9517857c0303cd5669ea9105c11359aa05e9d67deaea4bd1c840353b14e5cb5ac3240866bf047ca7441d4522ebcafed6e3c88e5192237fb5325358162f9669446ad43676cf96495d18f938ee38ad039a00d100482765a112d08824968d506b2f2e9ce4f2bd8d84c8222b3861130904e2c9cbd3bd4f8b64f64800524114276d45b966e811414209bc1a1a41a723bd1e3fb51c1e975480a3c5277fd37793c2f6258bae666a1f18753e666d62f331b30df0b911405a4a4621bc8709c6928d23c7354791e1c632df38d47cdced6ef7d13eac6677094cac9c4290bccda0796ca34de3035244d4af163b90c025d731849c9af9afaacfe8cf6646ee06269c40d83901cf7f55ce394b25e13d5b768f09db40d702836cde7a339aa2939bbef6c04287e3ce464882d1883d74b9f9ff5f223af655b771dc739546aebb476d83087dcae00ab2c9d02a346ce6116efaae2fb17f684063740fd65c93e883918437662c24a26a2a1260170424828d5eb85e33f8aec583a438a9e969bcad600e6da27cd35315a20c72fb7d379aa0b67317a3b8dd33631e237935619844273949c3713fd36d6f724a939f849eb9f73084772b83f3750f79a411a7cf48d409f1e78b3b5b0a1d0be7d5b8f564106582dc1b68d9a86cf490f1fccaf14c28a75d5b78e4dc25b178e5f1d11f8ef4241b8385bf02912b2333044f3b65666817cc18e36508cf8db950b641b32e69320c1171c347bd3474ba18c956312893fa8f48b3f549cb82d823080941e51e2e7c9e949f8e7f6083e71d8eea5c16b8f4d8707", "516a00", 3, 1427058608, 1537743641, "47ab0be6c1c5d99ce621eda4dcda8c67660d502392e79ead703bb9999aaa93a2"], + ["9f8848280352e280cea58c7b36398d9175868db306b7d73f346978355bad60e7afe37dcda2010000000951530065656565acacffffffff2b1475e4b3f28479f58bad82e868471de19f99c11c4dbd7aaf66d00588511dab02000000055252006a528239b9475a2a74bf7f101954cd181bd58dd9108a559a694093b5efe797609214df61c2800000000009ac5165516a006a53ac325f18780164ed22030000000005ac65630051309d210902000000000000000015abbb040000000065d4982c408cd383e966653765b17d3af23699f73cd2c048f6a2652a76e91aece6b761b4bd036b19c8f6e1c009e1288413ec322306a355fc450f9bd0ec6c79ea6e88332ecfadd083496ead5e26eea9f6b9e21c4bb41903f658e0192a9375898700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab03d61c3edc3a19c7cf0a879171639766b4fd05a42456dce80b7bec20faf69ceb01951b89b7c597f286a0a59a2a1beb2a6d6817411d5b37911f3cd34e20f33bd19d392c6bd96b11df051c7d9a901c81bfd910268b21bea3b2293e2594c0d06c7a88a6eb8f6502e18487a971ed54944af66d4a9819233a46457982d5b9a2e4c6030e66e72ee69bee10dc901158e6fb2f82f1e5b1899f30daddd48f386ab744195b031b9d505eb78e82668c5191447dd323b21bb98ec8e4814cf0579eac4abb6a39460b07a47fb3281e0c8c419fde701e49b445e43762c9da67bdc43f3739bd5eff8cb724863b95447e93efe072fadba001e4a268a1b11f0b0461fc75aaee3df2bc6fd3032a224b7a86463bb8cfde1166b349e8d52c19e2f2159a066818b8f6a24bbf3cdf022abddf2c0d0611c04a9b0be931d76457a4b3354b9ed778ad91ac897bd304f560020b3c95695419fc2dd86d14934a4df87468c784c672939d927bf1666c9f7cf22b020aa3060232099077ba96f686e2430c6aa2295ca0c42728cb941a08a6abfb3a170200e10bf0b7ec695be60f88b165287196d517cb7d9a22255c8ddbaad21b329a171e30f11bb1b82fcf9f63a6f3f0a0e734fe4d3e85baef577eabdfa96b1c2f13213dbd5149a63e4d014f130f3414c8cf1525157d6a93ceed5ddfda46908da937231b4e2a0df36d9b75034fec30ab3fb9b9f861c578c3dabd668d6bfb9ba39c954ed7e18a2e0f1b186e79810f156022e8e0d00138035b4466c29f1b013dd1e66c804c8f7b44ef0abf4dc16410a8f2871efbad3a780245452114d86f00ac92e703c67f649eb8c45d851a5f1e18cf01638dc79c78c91fbf6067693078567ace230198e6cded74807705ae2921e0d2a10f1023543d1e4cd2885514987b30bfc44ad611c6c08e25448dc1ee297876161713309356b89e6c241c8bc0bc432141f92315550f4bc0f26be21078e5b6ca27167613ebde5ba191d16c4df0bac60ba6823e11fbe6b4860d4e23d8c0714217eb42892fee9506608af0761a19364fe4ed7b191fbf4d06517e1a58de2e40b560660ae91b413a3c1176451a6e9bbe9aa3d0acb64383e4c3ec243dbb62712b078cbe271037f0306a45e5e1df3a2fe49c5ab445f3c9135b4be4072871be5fb82bd0045df7b64c25a9660343155e151da7fb43261dad3a3b48d050037828923b93293ca6fd5bc79966547cc7953661b93e12ec1272bdd9a4c5ff8fc4e9f3cd6eb08b00f10ba422922bcf5697f7f5341a078360e332c54a627b184c7e5721fba39d7b9d4ea8eb2888a60570e0609f54c8e136e2054e1938ffaa725db98be0de9ddee9d2bbdcbf4fd63506b5c603e7871e497a73b4a008359ab474deeb015701019673fd34ec6e72d1d069738063faefd66fa08979739d8b49620868c989106e78a1e7a30654be9071b830fb89b7317f9fb8f57a5df385b29a52cdb742ca69c373f8a20f2baccefc759a6b135ad77cab8c182f6d7d9cd08a225a94a820bc0185467c61e39ab8b00ab72c456d24ff230c1034564a4ae7a8e15a308403ccd946a112403b6bb7d152a33882a36cb66d3c075625862e273c2bb4ce03744a44e6fdae2e30e15e39231f08c66d512ed026a2463bb5bb4d1ec37a1a122860613a9e6b42c6e9a7089c6ee722977bb0d0ec9b330fe3394c1ea1020ac85a31e838dd93894acbcf8ea23b80d8259d022efc9a7ffdb0fce9b0a503f40bd635377de750e3de01d1b7b3ba7a6941cea985aab06bb2b87f40ecc005e0f57317fd8615b694d4d6604dde5fe3b25128c77a56ea61055099e885262c364e40648ecdb77db40bc450a006fc86982b60bf66e468ae1049365f8c54e78158d474c77453819425f1b5fdb4a14e7991b78dfdc9b0548f2c13be648b068bb4b88ffacc6af88292059b57188021443e676831f560d1950f96578518cc3c9650c54bd6820b846df4e3a6ec482a8efac9feba6cd44038338b4f745797d5b0c71dbde2831a596907bd3bd5908df20fb4f43219f9d5450507dff2aef10186bfe993759407879b0f71a82789026ccfb1c6cf4c1c5e89f22255d7c534eedc2ef14ba4fa8877760ebdd1302414fcca4374493500eaafd97e8e77eb5ecd48de309dc7ea129356c6e8833a7a31fefc26a25eb424b468cec037abfe22f92e12a7432aa8cab6ae1737580803656680e53f6f23b1ea8002e8646f6a091297804843b2cb9ea96b9c6a3cafa2ffef70edc85bc6ccb420c193cedc8604bb0bc5b325e4d035c4b9b540578ec5f0fddb22b2a4bf818e73f415dea4ba402821bfe96b00000000000000000000000000ae90e72fcb2730ed5995640886c00aab6d9312a848c110d28096c30988c9985562930f2b594ff6b0bf43e023c4da315593c962a7db950e713c930d7d167bfcfdf464023f2dcc2e82ba5b5e7bc913d2f11b80567993229265eec48008cf5829d4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004f880cdf9869b7620802392ed1a0049cd0eedd74192aae755e4c903ba1de36ab0a9f68ba128e3d49e44a8483bd1d489158d99cc0c056cf4db89e9f9898dc65dde2e8f4915ef6f0d936a7bc5b084683a80075224a7eca3de4bb2af1f36ec0cecf2daeb31d38ca22d9c1574376bf3de23a34d47a4e79f06011c1e325a0034b42f60318f534a7144634f08c0773008b0dc1fbc1257cfafeebbf0089a3562682e481f403204978941e54a920e44d110025acddb2c5661a5a310e060151e64b7bcfb5f5e80b0391cd39934e8175376c382b597cb7f3bd1c9cea5eb3bd4185e409487b4238b4a1e9a5b17f0d8f98883ea0d81944771a9d669b410af2d562a165174a75cd50110214895762605281d2394291183bc644f71a5b08fbdd3341b01ce92d05b1b7ff1f020dfbae9f3087006eeaf1b1fc566660988561db083b8510779da729f8d37c9a8a03283293c1d39cee776176b84e54a9e7eb3e09cd3bb3c2ab2fdd965aa8251211e8020ba95e1d7bc67a24e7a11ed5c270f21ba4e3356607ca4fc8123d97a98e79bcc6031a040a40de4d7eb2960ed436938464d7ed642274922bc7c4c8f0cd865c7f2734ef3a296da18c818267752c6f6ec393ec40c8b6856ec017a8950d81341de0564b9e67de9eb65578aba0f08337f7e498a5046b38e33361a5e55ebf55b290828095b970442f262d57dfc4941f9331112fa36a1fbf34d086b806505db50cc112d0bbae4a4d20be55791cf6a2c72286e9add4464dfa5222201719ed4bb152adfc144c8dd08fbf4e3cb23af2d79e42d2f4432216dc99482529bc5f76d7adba8d358175cc2c50535d7fe3fd324fd221b7972d5f8bcfef26b63397921b74acc8aec33f24c39847b44589d3e7b69988fc087fdb41cddc56f60549dfa56eceba49b2843ed2a1b74bc54cf20a5a9ca9e780ceb9e2b09a19bd45ee0ac4a8500d963bf412bfc3997f2abcd2954c1463e303e17123546988ebc7f8109495e036427b549656fcfaae5cc96c8d7ab70880d20114630dd517f709f5029c1b19adc7d50216391944061c1cebb54995cc4a54e1af64d34b4b5b4276cdf0694204676d6b1a486cfe920f05d4dfa8b1b6dbd29a7cfd9f01776a59eb3d8cec1bfc82e813b651c4e3fcc777aed92a2457f924ca4f4f2dc8843e045a2b09dc89633e9b1ffbe808bc0caacfe1b1ff1e03c3942a08fdad7f43438be941760868404df5b61c387b8c7f52d127455a3ef8926a1dad1af3134b030f668d09be1c59ed6bf69ae78db556f54bb745adb0d00fbd27d416044acc8051acedcac3ffac1be1dea68540b50285d3f1317b93a66fc2f4abd3cf85780c3510a4d20d3233a11d5745f2d1d64c600159849c3cf00f91ca29862cf061f2a66474b3bb4bc37480de9611dcef400f6ec10ae5bfa52c5f580dbee62997e77370749fce4b64550e842679d029c70f4bb3b3f8460bf970aeca337772bc3e0e482c7ae451ca87da1cebd07af4bfab13e3505a1993f520ae9b0eba1241efb42b1fe3a025e50d97a0b2df9aeaa7327897ccc48116e161df45fcfabd088f851d8417419bd4fbc8b27429c3db65d1f030661403197f82db8bc7b6980a53da88bf3a5d6ba28f1d9b8217749ef76f271a1993c81630d6189a092669c22ee7ad2c041ff40e5c8ace8a4dcba5419c6a1833c2067957e0f6ffde46e2dc0a14535452aca4a5ea023036162d925b7c37645f298c6810c990fd157bf784743f0ae51f1a421a343ade76349572ebb66d46810daed8138cf0d66c99334e0be3f9acf4b8091dd111aa8e06f2a359de1780376b1bd86809bd2e392db2d500a37b1f258568ff64f5874b8b7073499dc0078b32eeb754d9b7e6aac03981abb5507ca91cdffed363b16c6ae07ca5b088712b8c8a7a8b2aa4c467c29b8396a721b0dc098703a52c2401473e42ad0650bfcdd424bcfa1ae2e60aa60e39a79c0dffe7be70dfb236324a4da3f5d94415db7585d146dde6acc91d2fef32d94c48027841f4d8909031bb0a76b9e08c3429f93b16c67de5b1603ed37904021f5b8fcb8417d776f9bf244ce0d9167abe1de628f7596e7a6f96cf608ae4eddce02a7db0995e21460aea4ea9ab96b1ed499bef398b6f9a5f60c885fdc35ede0733ea3ac4f65b0156f722d1a085f65764f57d5e74d81b8243eff2cf1fcc886d6f47e88f84427e2293e47841530196758f2995db09f0da51bbe8cfee66871f66baba0f9491c2898f4e7294c7e07fc127bf354efd97eb7d4f41e8dd6cb5b0ec04eeb22ca4596078bdb68c62829d047c1c04433f00d24476819cd867c60892c6f8a3ebf8164d9e9a1b4ceecbca95d9a80f45ed44ea3c3d8c5c9df45703cb949f635c58a956111b1825f5fb4c2831b258e3691d1a2737f22d256307a6718c061eeee881e8dc48cbddd3f966b7e7b0482e80a4979e591104f44702", "51636551ac6aac6aac", 1, 584847997, 1537743641, "7c8738515605ccda50248690af512f118438f1a110644f8c5a4e39c36ac403ff"], + ["030000807082c403023f2fc2f487205c0c2ae0ba6fe8a10442941d0caccf7ca6e96fccd85a69627a1400000000095252636351006353acfffffffffffe265605edfb27cdd904d4f3bcd0fcd25d7177f3c4d53d7a160e92d54fab4b010000000852536a0063636551ffffffff01420cf603000000000200ac00000000dc5f43c2022a86c804000000000000000000000000aeb330493150edc5ff540c094e7efa80d00ef4a2bd986db334613c8e9d5ac0fb6b6ef826afa070a8c99e05463a440b38ef88723fdf014b9afc645bf7519ba7f5cf39f22b101737a2466f57f9fe1f67586181bd4fcfeb2d3f0e21aeb197ba8af4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005edb3cd71579325be76d01e1e548dbfab80af4bffd7c15198a89af4a8d441853e52e1c10f7a10c3f55ff6bbb3b04b23efee208af29aae0d7823241cd2a7f8a21f1391025e6b3293e49ebc02c51efc8af75c4dd26d0a3702d998c07aa166c065d3aefe694731e6de1b72b5a1c585db94b08693817b2e79966401ac946a07d2f57030b11bc372e02dab0f9932b298a716b39d30154ba8630bff2d650afb37100d8e5031dbdad171d1998cd40e41f42f86bc0e8ab9b18d014cf3c25fac10486848453750b0091f9d7b0df3fbbd56781eb5952c7bfa6a870788fef01cab90167f0ecf1ffc1da94ce8754a12fedaa8aa99f29b095edfa23535a800dfc9c6e8fd6dd3290c255020f1b7d6d47a65077194285b96a4ada7d8b98fc3b74f44657ff0858adbbb828110308a6426c89be1ff38036d4dba8a11be5a0ceba27cdaaf9e728e712b4e3150c5f0209cf2ae2f2c76c84b18f48d6769009583b09094dd14dc2f308ceebe45fd35528022968eaa695cc5537b2c21246da4cebce4aa3cfd21ab581835b4f502014fc77960230114b239a87b82b1df3c5ba0a7a7e6c9e02cf231bbdccadd940fd99a44bb3165934018437412bbe4cd8b9d7d3a37aab6dafd39ae80299265a7f498a73a26b4bae6d9a41328eaaf935b603736a6e56919cb5a63e8d520f9a76f9397a8b9e35f348250aab967a85733ae8f6526a217ef12142854931200bfce18d542c27c7091e9d52d164a0ea922776b9f8404f30f913ce908e5eb91005307974f9932f195005c3403901a3a5cf8ba4c875fba6184dd0bd94a868980674b3eb93d596e9f84d686b4f0e2fdbe6527c4add9780bd002a60e2f1915f385a3f40ce58755a5df73e1b1eefa6493bae2395e1df8deb82a2ac7839d782fa25dabb489ed9177b4366b9932da474e18b915dab7d57887ab674460ad623c8871d5653bfc82e3541ae7ef789c8411d69b483464cfedf2a11fedfad755af8c14b63e3a931678550b6713659c2f89ff7de373716c54c5d828cb5a0b9c8fdede0ae8e3b7e40be9c1a4210716122e310c52fd5eb3f30ac335f79f70a88b148461f93b53d87c97384f13d0fe39cbd845b586580130efd77c7db21a36f747866ad04d4f5aca78544ece1a0e96d4725c9d9035bc65454867e7386baa0fbfac4580f147eda4f7f3b399de478a0dc773b989961ecff8b7a2dfd032611f4cd680190be6197f256f3138456346ec5071a11f51abfa4e83f57041cfc716c1ab31538baa19604b52ee85922fa61e9ab5c58d95fb5db1d47cda1192b48503980e76a80fd1b29ac6a7ddfa737de4175842131e7987e638721623e7657df57f4b36839a534792aacc8406b16aafa6bcbf2647300e8df77984eeb6fbcf56da92476a3ef7bc2235b58c701b5f8ee9417f80128537121ed9fc654dd41dcf65366588d3126cb19aefd3efb5918e0bfed31d59721a5e653c4ee90abf8f3bfa818b2207f06135b6c4417644ec5ba1e1a7b23f1946b9f0c8c7e27a13d7a8c7566c4c5e42e002a14f86ffc51966358c729957bcc6a31b72368bddfc177206c70efb225aac6303a6e59b310a59a16eafe4eb3b3793d76f2bccfc000b23c09f3d87a1d26e81ddee361b6bff0f5c71c2ecbc3eee13fa09020c66421e7d042aa35a0ad26b54b4fd51bc573d46807fcdad76f8b79022282a9a5b81d1f38170fb2815eb0e7cc10207335ca3712df9c0ae07698c881b41505aefab261d0bf8b2629319c1b3320f1adc94e8ff274fd87d6e080d3df3a2a233492c63d260e98f4dca6971c278123b2ad41f15b1fa38a3560428d87fb2242eecaa91baeb7d2d0d28f8651c559860c02c4b30bb9d6d67e30cd7467811e3a6ea33b7073048933f5c53d75ad7bf3ae739ccd117c50338eaaae64bc3a37167e10bef1644da364348f8b6901ef36309580f001f1c8dbca929361e24bf2aabba69c3767dfbdd89f63fe21d1f0a283b25f22fba68301df5b8292f825453b991450c7d4d79f9e20069bae0483c94d0c314c8d7b3c704683bb94e93152bffa3474d790bda63c8fc256c78a800d275a2cf4e6def0e9f73b879da290c1cdd55afca86a5fc77facefa8d30f2523cdca0a5046bc0305eb7d9fa7dc01cff6845dbf634b13c2a4d3db00b4be9d164364a4a1f663b65635e12cbcd0776cbe06fd79add901b030ca06edc0755f598e32e536cb0397a70fb34f6d41b09e5a0a3f740f9939a95e32c1a6725ec0ed4e229c6c6cb6895384e9e3c80a43f41fdd9673272082b1bc3c7276b3e1bb3d3eb8efcd8528da8b61d1a3b21d096158cf250000000000000000bb99680500000000970d004a6cc497e36f84ac64ea15e4ed840b82df79a33a715ca1fc991d06be7350611c638d578a4580a37d3bcb8b44512149abf137f7f089f5ae2a45e76b598215dc46b1f0be0922043111f982a7fa1978fb7a8cc553c624b8d7ed93706584a50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033d692bd644f4c4fc03f663c4de53123f7a714f06ba85ff61ae2f0b107a01d2a3f6bb6a87e82d5509e033fee62dfefe4d6f58fede7af1369234cf2135c7104b670e6c136e4c0eff6597c10fd7bef8a6beaf1666aadc6fce90eb721a10a7bb9c6f4accf32ea79b29d3dd2c5926d499239723ef12bd352145a803b92ef4bed7d9c030d995ebe3ae15e10154b60486005257449872fbcff5cc776351dc4f19414430603112a641706900ecdd9eb64444ca26a3e3969f3e3f18b1ce145430e9398fc9b5e0b050690aab0130cc8b0c213db4e16f390d202d7770a18a9ddb2113c58e682b7d31a9175c95268111c66a37b6dbb98b7457ced819c21868e2bced4ed3b82a98c99020dd42a2029be05e81e8ee4b0bfa7983aa9703ab88dc252f7a03f131e19bb0eb7032a5f196c3eaf037007937a2041bc6c3f97e5f11ac23a2d9340976cc1e68bde7c0309e9c85f0030c04244deb82e54aae2dbcfab471ba4a89bf50027b6538127adae032221b42ab81143a94c707bb5ae065b74aa8693a62de4ab31e051fc9c6ed54ad9030a1a5b4fc4b121a11182a31447aa5b0e233db91c423f8a61741d5b853567f606030bfbaecf23c3cd6f1e5a1aad349c4c94bbb81a9afd56c2eed900c544118d1fdde9dd0317c9435ea4b843fdbe6022ab228c6d25c9c778670795700a4fd394306ed2678f03d459610c0cab9fa02929a317cb27c22b383c6664f89af7efd022a66fc32a7f50b1d2f2e702b455d4cf6207e1beb3d3f96e052f8cd4d7da354c5a7067d68fb177442cfa613a1dbf963de2b5bb03d84845443bfaf60ba121f3240fd5ecbd658902f0d2c7dd6f99c2969cb38755a5cb3089f133f9c5c33b3d73cd73ca9e3dc753453334eeb3712e888ff5c72931f469f3105024587752750257964925c8a270c21d29ddd01db6c3645b70889b8337d45978be9fe3bdb88a1ccbff0c7a08fcb94813787c537bbf3df64c21d58d6a826b9ca439dfecdcaa4fa20fb1adf69311f7eb49bf92b936e168429ccd3e1052bc5a2782b8e87d092c229185139c3dbb4d29dc48057b9203b74b78f6645e3ef00ca06f56b7347f264a1b506a157a07de78d2231efac41cc1bd709c0bb412940272bdce2ea767ff3c40127dea2628a8858848d2a64a60fb73a91032db98ce878209555cadc2f076fcce23f194b84f24dc9c40faf8015908939cc39467d85a438992df528f47e86ba37244ad60c642a745531bae2ea3867a96389ccd2c39b1b17fbd22c5b9d4135bae3394f4824659153e3c8c71ceeaf01a4e21a710158d57a184827d33bd53934e022825cb27ae621c9b1ed6644bf9ac3e7f454e3b2af69f1bfd24a14360fe3e253f450fdab2177da6bc977a367d0cbb7c951e90f1d80c362af4d5ae863c599a08d75a3543dd7232e44f38f3d284cf905f7f47a019b4782958687e7cb1965a1bf7606a09a9085a6b4646993edb0f7159ea3679258296c516d9f6e3f8e5d4cac6c97656740a3b28f2cc21aa78da2b94328569b383f6518f5fd387cfdcb18f53bc6e65b272a8a291a4c143474955dd8d5c98b3a0aac9c51ac3b7dad471ba67429f699ff368e10d09035361e71f97396f4919b02e6eb33649db3d38c69d534a9f62b17acb6bb4cbc530c64c3e0874c3e481f635a2beff6dc9f09ad467e7c1f590f8583977805e714d193e5e45b2e7f24960229a48d372379fcad78c81d200a18d732694a32392e62f77183b6d88f7e326684ba4032620e64f3cb193995a2daf2b19be28848dc5fac1f4fb23eded7e8368fe642b123cb3ece1118f6a906d63455dc25e5ee2c8f8f420d6ab580978da473cb653c1fde96ef195c991cb75b82189997d88568e22ca70ebafd620f5753273cfeeb1b492b626c329240fdaa0c9bced4d3ed8d9ae4df2e9906a23ac07905a6d45d476002f3a3da2021e4fb66c0c1af5e2fa9745ceb19d71f9574b30d64f9ca7d444d2cc017117bc30ae579f98f6a83c04f6687cfc9de2ba75d14b09071e8d337b1d04b256ac618924ce2148a29e9084b80111482a23e4ed490bca71eb55288461665f6127d6bbf08a4f045820d61b128f56b82eb160168851caf2ad9fe300816da6a7a114c0820bfa999674a1ff72622907f629e6ed9c49d0d38724f8483afc1ad7e5bea8046bcf4ae4503f176ef8e7bfb6c0ef75ef8cf3afd7ccac370d7376295c7e8696930545ec0caeaf4b6056ce663f2df918a2d2bbf50fecb0bb131a5e11dad980f052bc980cb020f6cb4598874891b101aa71865770e6176f648c4d24872302d4122d1b23aa772ffcb1f0d263a6985ee78e517b0b573b9ea4e0b59943faa643d716f56bc782cfd430519c8b4f4da4b6c38b2b89e87be1d9bf103718bb27533f238275c71305d170fadea7edaebbe95645311d0775b8fda3c07c3239f66a4cc6ebc296b796d0142c8a02", "536a635151ac00", 0, 1706305336, 0, "d1a62890a3e895d4011398a9453916774ddcc502e82bf6b5cc71e00dbf701246"], + ["494c875d01dd01fc64f2b6a34779b247a07368411fa4bcdc1124422d87b35b5b0b93bb6b62020000000951516a0063536552acffffffff04a053e60100000000046aacac6a5aee0d0500000000085352516a53ac6551130a7000000000000153cc33ec020000000008525252006351acac0000000002ab227c00000000000000000000000000d9694e36e3a42aaf1779f0ec735d87d8bdfaeeb2ae605d63457342e31b8af4b99ca111d79b8c9f30bb6bc91f1061ed6be6a7fa3c9f38e3a2807917c67778f56d972b237a67e2dde32c885107498c598796fae52d7744cd6845ecba6b4b863979000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005046daa51cad5193081e9bb93aaa422304b48428e1b18076445bb42bcc5928eefe8d51f6d0003dd2984f456c25546af1de82e9cc0c5770ff23a725485cc8ac96acbe987d7a313dde83610b13534b9d5ae98370ef79eb59f6121625e7ccb179a321692c90b4956611406321e62fc35ba52b86a6ec821ddb433f02f619bb28f4ce021f2d58682bde5dac63107f16c3e71710f58fd3965ff06a28cac98a3f1cf70ac0030d8e880f1e6a8c5baa9f54a0d339a81a083eb4aad8a59f75bb8d73972708f9700a0924e48d15d83aadf1859b6c4b743218c57cda386c83c3111d72eaa75825438594c8a5e49e3b5606d9c8ff7b2e3757529ac66d4f5f0adcbda25f82c0b04acf03022ff1627ad036da9344d82d517aa10cd18f6606d7a6be3fcab7f5cdbb11a361f5030e65f82a40b79cc988b93ae0620ebcdab1a89de9f67fa30ddfc220348e3b0dd5031f7accd6f34e2b95e85cf641307bab01114030b077c5d20c792772e1ee2670fd03304e274044ea930776f43c837b6ea89a8c79336775f93759a5e91722e80ae11b02206a8375ea57a47a6fbdc9d274c1f67fc45acf558f0d735d6b67bea0bef42f4a4bb233b7822c10548f35d20ca64da177699a71c80f51d72a44d21973549a775f4d167d68b00525ee9316c3ce932d44e289fc1f7b424cfb51bd1fa6bb7b55b4e23e5e4e689bd922afc7cd6a057cbd389494fca0d2416d5b2a274b753dce886ca66b3f761fb5a60d5d3cba0e1f6fd664bdc1b6fc4285e1267a2ca7b8e5bd7c74a13cb3f5fd76cf7f7522611ebb20fe1b5073c616a1ac7dc7aa07a1df8a31726f110e31db1e352c5b55c26eaeb1a94af1e5b6bf6221d1f85f6570ee1817abc4f722d201b8154fdec5fdd632ecc1a00c162ee3bb9265f5e29dfc9b5e6bef4ebf73c1616967271a95479df61e1ecbe4d8e8b886e36eaa71c5f2ea6f9922b695dd2d1c6fed1246cfeeb36806e2fda6b67966351bc9a7ad4134325d2e3b412b0f85fc3e7dfb68dc4e557bac3a8acf782ffd5b3ccdc78e8f08c3a752058b20a77e27ca10e58ed988a4fcdc601b0d965a39a3ae870b7c4315041bfdab5d918be95b65813eb3103d72fb631491adf5fbccba5d8fe1d12f7bc6771d681dff006f562579573196cffcc7578fc4bd0f3766855bbd67e037c4ac6bb812cb6cea4f7fbf246d7c1349b3206be03fdc0cb8bda7482b518ed7e70840c0a0e28015c1b1f64dd7617db0a72a6c380f0baa7cc6fd6632021b75dadd27015332e72ba59479dc894f9f1409c285cc515de9385ad8f3c06dd9ee529cb26966f65a947a231b091a1a1c847c81d6076c00db0f302422844c86e2ae95c080ce90d5f567c8f1238d54674d09d6ddd2f9ad2938e786ddecc674bd5927d341d713bc37d13bc19747f2bf87d4634f7d2222d59857e35a52293da6b38b9e6af68ab52140f3078bf42051e611b068460697cad7442233f7e81f6c5d07ead06f1d3db6617cbd1fcafc1843e1a1b063ce40428331f1c17ef54d5b180349d4aabb3de72c2fb6420ae7819a0af65db6c27c55c9de2fbec397d341811a6426e4540246291908535e97937c78e5db67930c363879ddf4fc7711366d224ad49cc1eae26a04377719b8a28fa670c366f0207a3a22558f171b5e2f7f058b77873417f44489530366ef08fdf01fefe629cae196623bc4ca92737c0b432f5daf564d2e50bbb9043df460ecccab0b1091175ceb25360f92c9084eb48ddf91d34e64c206213ed87856f116e1f60e95b24c86fff7f1c5450bcfe7f57bb65377688733e49e4e0309b491683a73129aea180def174b91698623e8e992a0faebd4e95742b2d4a0b5d4827ba55a255de130ac14175a06e33de44990e7a276feecf3dd7ef03d80c343e3cf314f8b4c215e56800ee23af7f2eb6fe23da984eced0068b7bd5105dd6470bc2f9864a19d3c9c91007994ac022d09ad1bc88c478763d6a01a0b3a43cf176ed66c02bdddc8b3b63a8c1e46a86259de9915e3f5ba8f5784740960078c866eee58d67987f1eb036632c6cc10b5b858d1b688c3aec06c0f6e278d5d83bd6879f277ea69b71ab5677722e3d6fa3cb29c01ead68c265bc9b014233fd8c5b652298e62f5e3e4d65ac5b24cd2dbba0a36f4cd6e8aceea40dad6064659455c48cb6e34f0c8e59a46d0c7dac0bcd9c58160127be27b337f3d478d1d870e40ce467acbfee6a9c97630403a91ac45d30186f3199a2f20befb5e43b9c60c0b20fb8cab56d1d8ca51e1c43b8325661f480f60355a834585dd83db216e7c40da42385e27b0bc55c39b0000000000000000f6da98000000000052b156c60195fe475ea8de16c4c54999ffc35fcede0d94a16c050aedc7c86354da8f6443df45319f674c334cd73b033fa4dc91b0a77ecd24b41711f49b6b8ad171d5e982080dd240ae1ee99431944ea634ff7d5f85a85ee3362443c98c334bde0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036ed404dfbda3735378958a18f20903e9cbe70fcf6c735112adb9ee94ab125f6de9d125abf3ea673296eff0e402d30bf6da2d427ff9a72682bafd11d3c3132669db3cfb1eb7651015ac199c4967650c6fd440353903afc55aee30f1f5160ecd25f45e8c53a99105c92d6288dc66bc97679582241ddf503743d27404da0c3dfd6020b905d6115876cfb9e460d372e19d5485a7b1eca76d9bb5d0f34e8268bd0de900301e44632d4810bc468aa03753de8ec74a4fa92c351daa667147f51c5141d2ff70b07ab8d5e9270e124d08dbaaf256b5e8fd3003b65142661c9ea137753ff6e0fd1191dab23f5a931bab6458267f62a1b49e6254e8fcc641ef4c41130cec1a8115a031dea634dc8078a776614cdc69e819e33b1e6ed12d6dc4733707f9ad2dfe27d190306902ff251214fed8143f2a4d8092a49fafc4c1b0a042a114889267f8c6bbd15020cc88945498c60db68da1efe1811d6375aacd63fbaf8abdf4076e63b6febe6b70315eb5c367dbc4e9b955a3e8c9103f1347c93be9de5d28c243c8ee169415a209c0209a7a086e355220b967cb8a0c824b9924282eba1bc2b27ac640c483eca16f9375cc5f9a2503c719e3eb209bc334647b2f866141037f8769fe45b8a9de51131af131df82810a1568aec47f59bb1d5601b33c18cc8bdd0e6f2945ed4d7a02c3058564f80e4379c45fa84a0514eb46eeae0975166364ccf7dbb27ba8efa1d34abfe8260317da3b4583bcc7e7df7072834e29ee3e91dcb1dc0ce616fba19f0b5a1ad960c1c25a8286ea1309a711f6e399fd07501b739badca9938b1f21c8124cebbaa933ad084f3301520e1d9dbe48c8910799381a38c1da3428f807ed504e8e828694b5120ba4edcb3777839a2c59807970dcc4ea3204c0492fa670420304e8fdb38943de3bb7039f826d0f9fcdec652dbfc4426b64209300e64d7c0995da8697d295ba862ed142b0929692ba36737c6606e2dd3792d88d6b166d494bf9c62e5515d9367bbb679c937fed330aa028f219a39a62e2dc65a220cd90cd1255e72a96fa6f670de05ef951deb900f688d6f9f023662398f82a3a74066307bcd27590371c6aacb0dad966f5108b138ec7ccc4e039e813841c9e0667f0d0976a4d1e074101e122e1c659f5a2faaefadad07642251a099555dc8cc68f23490ed5a5ea196967dae6b4813941effb1fb778507e69333d2280deb157ded560b6be72ef157795081503645d539bfcadfbf493591291bdb85fac6e02f7f99174bcb670720686fc350afc5c4ff868e8cbe2a42bafb73c70edc40681bd71b73c3715c19201a15f9af641373679c118055a6980652c34a147d32d2cac6818799fea11ffcf924dfe4e370c325706ccf9d4fc428d73afe16630941a14d7d7c8ca763c72f1f336e30adf67cb3b9b42649877bfddcc131156f6a488668d625894d03e2fe7ce539086a4b4e44cca7f40830c8c939289853119eb5a64b3a70b213d62fc7b1b174f7045e55671bc04aa7a871ba60524ce6499e1e619799313ab9d3b8aaa43fa184ccee9da3680c80469b46e26ccf91fa8ec28cc3669daad9f301608f23e3f82bfe261949c383a00132181d71ed7f3e84ebac6bd0e1ad358973e8893f0b88474168e0e8a2d9aa42019ee11ab56292e1ea3161d5d02bc18a3a8544712d426f88f17a0b8533ea4d322a14cd0660f44a663e66d8fedbfd92ff6562f5b5908ab7f9373914d56357b41ff7870ccc7492f8a7a05d5fdf25a8233cd7d3a3363b4d5c21da9e1b26d473552e2adbddc8b5d1110c05004c0572d2b86fd0445d6649ec00e3a265a48202208ff0e068d2b037d03093b1982a95a1b76ddd68b4fc58ef75aee27d56a9ef9e43aa7433a11270005b09f4c2edd8bdb1252cf13ff2510003dbf5f85171cf2a0c8f1ce11ec8a7c3ea02d636a8d52df0243d7e4d74b82f6f3611bb803f76ebe0c463ae944f7d950cf6e7cbb5c9a047d86231754004b94454e1cf630d46ff728a9d877c69470181c542659a750716343ffdcdf7e0555990ebce658e9e4fe72947a1837bc8eb5a732f05dbf0d39780e88b68b2ab3cc53c235983a99b15c8e6ff0e2ce1467a7ce5bc36ed657bd6f74d826655e427123afe876c6b0956b9fa4ab187a0f1a1cf667ed7cb926e855c9980d123376c39d9c43fcd884d797fe6189a4adcff3a275beaf32e47958cf36a459df0ff8fbaf1aa11ea07e9c15d593afacc851575b92b9450d3da40fa66786703d4fa3d8cc11192bc5ce8b20a25dcefa230aa158dccc2029ad474a194bfdc9243c9df36fc133776906e950ff5ce59533e177a4ccf9323f6a0d89c9211ef59b9e481507c8cc28fe773a5baced7eab9c7a955946dc1e8a3b6601786177103908de416bab7f9cc12c199fef27326994a7ed8aa3ffed20e62cc964b16500f3fc96741ce5c4c51102975e03", "51530053636551", 0, 359786775, 1537743641, "1e6edfb1cf3941e4ba5fc3e92a2da133eab9bb3800e433a7b91c1fef1f48fbd3"], + ["427ae41c01e8b1c54fc4b2bd85f90e938f343bfdd01b101be440c6daac2e63cde67990bfe40000000007ac6a52535163acffffffff03efb621030000000003635353ac495300000000000863ac6a0053656351bf0bbb040000000008516aac51005300000000000003000000000000000002712e0200000000e7ffe9abe83a8455bfe255165163ddcd0c2222078d29140e6efc1409175e29af6667b59383b934b59684e7da81857441514efcf4385db0cf548c50ee395d59ddf9f483562d74c906d0f538f8a25f3f495eb60a3cbf4c47b0eca752d4da3c6d6a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004f4e5093d672266eb1ca66bdfb475cb49e8eb5189f543fe67d9a47075dea873938fdc5722792b7ae2b7e68a76114b54f262aae420825101d5910461bbe68f8cbc967a0c5fa31a588553794a059c05fd3c6edbb6653e2bfe20f5c43f1b8e27f9cf73f0e417aad36d1e6ee3dc8376f23236ad19f8d25339439aaa6dec54c4be9f103225e4fa56f9fff36ad134bdf2e8dbce4e8428fd878ba5ff0edea1a1b4e55d375020774638ba25e5ad944aea24e03eb44e378010bb33a0c801d0259016d14aee7a80b041eb9609ffbdf83e20d0f59bce1fb704e01733d349d5b8a4274254f5f34d043337eca8b6550cf8e3f4876f4febd1e0550ae41c60f4341275f5a70f45fe999430310d13337c848359025d521db2e1741b07ec0c2c5eb21bd68d23aa12e12da97020304aa2e9f3228599820f8c5a32312c50bd37d2399fef54b33c82706ecc73bf1bf032b917360c89c4f1483d44326f0c2298cc04075982f88e3bd96d5b15e45337a89020b3ee1250926060b464716c2b56b936fd2ef569e5e262663aefd6f750407330e031d7073ddd7a2c445df9e05447efcfd3741a05bf5239098c0a7b398230c074c4812ddda7e36f4e955e9fa55635cb452e687b6d3aad76deac3d864dd69dd43bc1219a9ecba21fc3cb9a3d06eeeae8f94b51f4083e6488b8d315fa99fa4919489eb4e9c5a382cbc0579b6f3bd919ab59c908b2a7ea8f83138c6bbb0561e052595fbdb6d6fdb72dd5c1ecbe1d70b897c96b3ca2528057c2208901c94b3444e75206620bc1035c2a9e2423171d9d68c8db00dd86e103ed3b00c93a4849cce25e7395c016ba94889d0af7b8baaddc895f22487b7c4f09bcf5e2503036b0fff84781a4421a1164a2180b3352e986e3b336033efb0e97b975be8a6402a192ba732c9a0c1d6cb9fcab2342d3039588211cd9a75423e4bee13872c4b9ddbdb0103d0da98c9929252d6cc017603a7811b53d45c1777c8bda867f7745e852aee122eca88b85e17b2e9ebfe81477b8f1c1dc1b3dd1af4cf35182f43c1ed2091161c1cdf5b17838957c07f39d4c09cf35da31248cefa0f09eb8779ef97122bdf4fd88c94e36ac7a5cdb9acdcbafa64c75906d388bdcd16f77de147cf2eea0ec236c0c3806361dc43b41d2026b25ac464c99980a5f31dbc7e9a4612e126218773de688d2c8f1fda16165d9ab93511cb3d6a9d0eab691ee8fba5832e2551c5fcc608acadeff4bf536dbbe08fc582c3d8b2e61d1379fd728db92b850a671c676fa5f73a37a5117ac699e3582c13cdc1251ce21f7cdc13e494ec932e58958ee51120f150d409516d366e52a1d3bbf4ea7e0141e5b42c4a30cf105d07825fbaaabcfd0772b35db8415e9a71dd8cd9ba78ea82ab0d05dea912859417dfb6f933b49a64baed7e4cd7c485d8fcce57a54d16c3b91efa00f226e2bcfad1687a462593f974b69ae08d8653fb981f739b8b0538ab85bf5563a0fd17d9c917f536a04d534530601a5f7f382af7c16af5efc6fa90456622bf7bac76ea1ba50ac70539bb819e64b05d91ae42dc1d08532e85f09d073e06a0060dbe069786671b76c0abd7d04b7217cc61391e213f78a1cd38e478e844cd436c1278a7c1dffdaca869e0128bf4a6a6dad43ba513547066329f97a847062758dcbe8afcb53cb233b9069749dd8a6e464add4fd261845624ba193982e89ee0304d5ecf497bda430f192fa394761a8a9fb3e2b0fc4a2bb6bba15b86ac4b42aa6d6e2f4cd93a43ea2e91be3475420360312f2b862d6156388a5f923688111b4d617e118232acc7ab17161c8bdc58cffb1b03b48e0c443468d207211bdcb2449595c594060290a9ea244e878a21777879f0658f0dd6098d16a646f8d4761ab2a436e5baebcc29f5b176c32aac1ead3e8a83705e318d689439ac4145d850d43f23f549e1c3f19967441ff7b66e8b4b6aebd4beeba33c5cefb9820088bcb773a0cd51216f2020fcb7b289278ebfbdd5c4ca8f19e5528926ce10a3b98e370a5a1f15b14abd39e3d56c9b22ac90bb234b0fd49ec2c4ae2409ba25cc94e3ef685aa7f0d60c1ecf187da83f4282f14189f5c23828d53a1596bac695aa8856e808e81bfab8e54f6df553393ba4129df6965970eeb0b14086dac941f1b6e4ef5cf5f64d7753ec2bf56435b4f45c09cdf38d79daf568b0e3ff873532bbdaa853919beeab0fe260f05ac550fcc161b8f68b1d73452728b21b6a8648f5b2c8f3a78d6d85f5b1c5e60a90d1b32f6bb14fde2d049c572c9b1eae033dcee72bb0534a30ededb28cc653849d70599602a7d8e56c010000000000000000000000000d5a48425fd3efb7cf48368765ed655130650368f4fc4266f8468c47e81db4959a0e450a1c1eecce4131c639c0632646cec1629cf0dae49c004095463ba2609adb3d4f365a51c2739ba10c3502a3c22efa97d6dc0de7cd4b221fe9b39dbb1b050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023059ed8068c7a1829ac22536c81510e9863b94a21a931a50af8f32c7aab6667fd9b77bd2e95cc836a381d1bd8d39f00240e40b928ab3fc118f9927d15af212adad28d904af0f4feffb5b93d2021825964cbd70f59326a7c81c76df194abdb357ea30fea03ad64263a9c5622819b4976cfa4eaa0ed7ae4031384e5bcda2757fe03072e0a2921a3552cc27c49220d41232ccf1bc726f6f8ec48097de106edcdbd0f020cd4ea1dfef2bb1124a0a5e4990b295bb4d261a942725cca72e9e213b3feae730a06ae648cf684247dc901009751dbb58e81ad4e0cbbd83f3b52c272f9b68d202d9b47e6d5898c4c41b5ea6bf2afe2606b592b6efa33726464d7532acaa8f440860208b32cae4b13d81e9deded61a68e91b782bff8e24d84a797ab350b6172a38d2d030f5c504499ab92687d77a26c165fbec90ef00b23152e5acc9dafb8bbfc29754b022c21578bbb253c5f36a6c8815b490243e5bec3629ff38716ffb8c2dac8c0d643030e7c3bd96b982a811c4b09a017963e57e3c3e9ec04151d502f938e07ecb3de8703269f5061920d795b3e187daa57278ab1dc2d1d22ab018e2fb30d2bf767ea005bcceba67e9ab0f77beba70f106f16117b32f066ccdcb9e0fc9bdbb4f233f7c77662d5340b3ed38db77d1011e426e7b3cc587b643a2848fbb276a3cf481af18a9f3e4bc971b2a3c0e0d3d5de508cee906eef452e17f584d9d4f0983f3abf85a5ec3dfb4d122348222bf2ffdc953fd8da0137a5fb9fef55687177ac1d8be0de7439868bb9e0282630870fff96fe30330ebe4f718afd7ba85e9da3fcdc951bb8acb515c715b2451c5b7989abca68507845063888c50d2e9b90231973b9113beb38c78d79b897b7c409501f18b8ebc65ecb5148c9aae436ea5eb88ca490fb3123409ad54dde28bb8773434bd73dc7c58227b093fd9c6f259cd1bdc75e724feeac85f21de2461c479bb21478811550b9d8f7a29d6fdc1989e86d7f8b7c61c306b1a2d9b2c6841b75a3f6224ffeaed67e18eed99c4018d02d449d18e62976054fa8c9a0a541f63110da4f2bce2807bffa08f34303001fd63d50153bad302e4e8fa289e0db3d2c31d360d158b3069ca97c958d4f70c350de5870846292be33b78b64aafca87587daff0659e602d11aad4c9d709ae504142544a9e0f0aa707ad5b6bde85158f6ce254e1239b6e492bdf20300c6337bfc9c6ea3e2dcfebbdd944a47438366147d07ec52acd6ccfc9ea12e340e4f1d3034852720bd321e689263265295d90009920ba81ac589b72dae4997164c787314caaf0a5e0413091237ed60396b3ff913bd6b8816370a8bdeca5ea730b5cab271065b24e8ee1338c1e233d74a4e31a306814076250fc6fc71f28e181bfe9fe674c87b10bd0a8702d64108d217d39ca2412de25307ddf54fd6b433cc4e679c9fc7398d475b0d592ee04256f2043ec373578b4370feb6086b6046c7664b64149ff052b750c708e216b49213ed2c0f9c29acdc26a2b02f81b37e13e723c4522bf70fa7fa31407f1aa14ce9e806c99e17e198129d15292ec0bb5961d52f395c73cf022f528c216ada29e548bab44fa409e92e7a635c837e203e438b1816e5479819d4a1a3cbb47011501c214eb3b5a365d38d8e801eb91004202dcb066fef2d28eff51125c7d21b0e7ca3e0bf53e57ff0ffa0392baf1b5167d85c542f8348d8cd28ae1baeb3f4643afaba4138766b77e81e2512b05c37cfec84c597f0f2b1aa508bdd5a2c4de341e3ef540005506804d92bc6cf95558a60220162ee3dea1c91acd10d33bff7fbfce3b0b822a9b5c783fade194e947795f5e9935f4a8e344d17cfff4314e5d4929af483fdc3e386e3e324488029ed245ad6a4307d07fbec658dcbbb977ddfd830d57453c9e67cfa706bf161ae81b69849c01b5c7762e9cdcacaf5c02cabb867506e85029ce5d6c53df25ad6b9cdd7db811cd122d93fb6502db086b01503f036dc2d5b21c4305aeaa6f15d13f8d7e667f11948ccdaa60dd8ae8f2b38dade3bfe4d8eb4a63c09958689d905705bb5f652a2383ae2f214f8124f1f8c223e099887019b7935485e5c5e1f97fda0333027f8ac0fcfe36ecea9c5b93b09c699cc70f3bdc0e1249cb25080bf0a2bcad2c49b6222f07b58f8b1a0fd3b52df0dd5190914fc3a608ed394b75b379240951f6c994327010fa8734114df335633fec4edab6384d028758ba34cb540f2fa975afcec4ff630a202b1926be53ad57266984aec95ebd9b04778e721c1a09cb4458a424d805a3ee5a80910639d2cab5837b9424f708b05000000000000000000000000ccf0ceffdec9e4bc48758099a9b640d6d3d709fa29f1a600b89df5897e98ab70f467b8e224b772f3195ec008fe3b8e27660439224c50556a71ca8268bdd895be4db9340baf298889dda65a412d16b8bc00adb0b73f6ad8db8c5ebde1fa04918200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b43f945eeb2a466cb107755cee17bcbd9663718b5259e7a047b3193edc24c0ee02ae484093ac6063474f0384d2c30a5c5fd5ca6afdae69939e2421f1d41663fff98435f5b81728368df074ea528f2f39fcf102d4383c37c2b22988321a96f0ac8eb2da332ee4436573789d9d787c9982b5028f7cd38c92c277c80be8582934b50223fdd020ecba3c5125d2442f397c414a22097b5905fc2aa42711afcf7f8267d4021faa23636bdc8c31818e72c37235159e25b066fcbf1a24161842fa35f24e0c800a015ec384b12cf219e58e9fe2a5b3fb9b1df587805d004a466f6bade6459200a0f6a7d175c20de246a37c0ee0c0ccd52369528ea1d271b7a5af668cce10f598320317bc539c1805d9639fd96b692314235bee4ab2e6e9ea23fb9ebf92b2da9cad270209e94a37031bc2d8e78fb243e1f2eaa2692f442cafa28883c39a88ab563e6ced030e437dbf6beeb8e49b95e2a47c02ed4c2c5774224bf32f4846185f8ddc8f9c370200e8c9f5fd6c26463a5115adf59f09410bda7eda82a4cf36546075ca48f47221020fe9ce0e1e2ba8e080306031dfeffbf61edc85622bd1ea7c7a2488f8e9044f22e9fe73fe1f19c37cb424f4c2a4e4122ae03edd06a374c5c52da26d57c597781fb873de93bbfaf055717845c19bc4894bed0a431e96957b0e819a79c817e6e8253872aa19de397904a190eb587a79b179b0397cf32ccc45590602aa323d24d0af8a009f30e02cb4acb84e99667871a3376bf7bfd5d678f70598ebc8631f942e99cb15304a74c30a4ded8f31e24e57786391926b9d5869d48352a92102c58b4b7cf4ea34e6e02257108afc8494170e303c65435df6021ff78a2705668f988a91968ca7f07935681decf6e75aace42b44991893b6cdee349cabb15f96291f4df1c7bc571d4af0f48e68509094b01271788fac21e5fc86011b8bc9ac956e0414b7fce027ddd1adc6a13aea82f5bd6a9bc2a0c5e4fabebf4cc621c5d62bdb28ebca2895dd07cfb9fa2eeff90ef1c230191b141e7980b5db641c24806936eddfed1564d86d2f4cc7c24074fc4ddee2c37ebe9c6e89e72e60949cdc49f49a0ea4d1fdc9a0b224c19605c3d42a2cf249cb3f3f8777bb2f694711dff9c04c95cadbb6acbc1af44332118717e4f06417d8c1c7a41d2d9241902581ff0efa7e822cd5f3dbcee976e7def657c8414c7c64147c14cc82e74581472647121af604ae9ec8dde33e786d87608bc94edbaf83414fbece050a9ee79a5698df4555ea4fe512beb74fc68657543d3400a9c0d425ebcdb51ad38e1b676f63b76f90c85f0af0ca056cedd0ecb67bc1c8869467e8a27274b4a882886f1d011ff22d859140703fbf69a3a1a11344373582625a6939147491316fc65b1d8915f8e3e0405407f29b437fa47b97b95c6152bac1356f3d0c08e504c1fb653662eb3303d87e9ec4ed090009179514698f3ab4af8ea80f2c0341a985e58b341f74a8aa0cd53d317fe56bb9f7930ed4676af26fcaf4e4596a4fee2fce4094c40583ac729e651a4f36de46675834d3fef73bb91ee4f6165776d07b43cf31426078589f112e122ab675a5b190b27b4842e67da394e4af5353f58772dfc95e150c25e6d6a58239d5b84d201901138683a1bb7b366a5abf7f18d0f9c22bfa2033a17acf0ed6e075620d95f3cbf0dced41e20443a6af7f7cfd68154a5f4297ae1e4213e4e0328e322741df99277520aba7c13a1d8a57822e64bf41b05e01e4d33e2c3c0c239680397dac3ac45320bcdfe4daae1e43cece972982988346a6ef15bc484c166be8ea264bad374d89baecd79d5bb271d9dcd37682c46653c1661898f15bc77aff55d77e8b2753f5e382618e9a8c96431910d263c1176828b463037f0e092d08664454da6ca77eaa07a1ec2a65699783ced889e0a7f91a3ad09c4628fef1061afd1c2b3e0d423c11354d90c8d52d2916421f3bee3e8a262caea9f509f394f37bb51a152f60ea81d5ca7ac928c3c9269994a3ca81aca0093078d7fe3b2e31415ed12be38ec4aa8351f938987587e1aa78deb44e8da47cae1cb509a3f8702edad8bd8e1ccda7f9641a459fac1ab894bde3639806c4aff34b07ff65331fc79992891a8392ca59f3daace685e5e2e3b24d49de9e1ed50943d639a3c94fdccbcb5cec011f3f4e16993073672dc3f2ef7864c8343d6c01da72fd10d6703524bcdf5c4366bb6df48677c2d4be4f538de020f48077ea00cdb8bc16981d62f294a942477a2b00aba5463eaaae0fcefb7e3cb4ec7cb7d32a5ca3fb0c9df7c58e66d1fe5d648cf6dc6e5c31990a322268a1f65650149afe654eaeac1d438c100a17d9aa3a5966f63565a3b05436933d2d9dfb98f1e391fc80b1288ba6fcfcaa3b174c7bf02801005b0c85da74af045aaa182d8738230d902d72bb875039082d7e28e7867b04", "53", 0, 1758995106, 0, "7e7dd1b1d3ef6a1e8677c116433cd50e12a6b76c42183a5320b3c76517e0106b"], + ["030000807082c40301cd9fefbc1368ef2882cfb15f2d280bc3445ff2b5bf385268d0eff6b50ecccc97020000000465ac636affffffff04b13b5a0200000000055353525352b66e3602000000000451ac65acc8a254030000000007006a00005263515c48e4040000000004636a635269170cf500000000010000000000000000cad2240500000000dc6df03f07118515d7dd865c4e7bd9a2047ffba19d447dfd5b183b1e070cce6b45318f21a550ca0349b5340e7f62860eedc61907a1f88ae08de4e0762e0a56dee5d385425e092b90bb15de164ea8d4bf23714a6723942847aabbf15aee84744c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18a6723bcb107215245ac2b58cbdc85613a5e8cbe5bc560f498136d29a5cbd12f3786461ecc0d301f114d5a52df36b433d60d3a53f82535c484935f83d3465783fb9e87813ad0c073686da8cbb93194b0d7c0e9527b150825617c03bcfc776e65cb4cb9e08bb9b508a2200cd91c2a77de1389c5f856b840ddb4d35819244073021435d6d1e237463ea18e5e7d0220e38b61848c085830dd3202ae99d72353a277032e59b35fd14aa40b628a330203a51554e1a97fbd2d7907b1a5d12cbaf3db444d0b06c37623aa501cf245158c532b14e8a93388c87031488ca7888fb8c0f3c09d2bc3b9b4a2fbe28db7ee0e53b0d3313bda9b48e3812eb78ee5a7dea01f52e46ef20229c84f17fcc5e61ea45d971785898f7050b066dcef2e634ad9352dbabb1332010313922d0a91009941da606ff09e1c6a906496bb3d8240a9bbbc7486d9393c05d3030767e6d5b92e8c209d16ca65443252b8fa24a6ac3591c32cc28bc2ae7d1e816f0324b660067c255a135ba20f49700c89f6fa3113e40e62aad2a6d897c69b4af13b021b65b83a00a7812d52ae7631a0f5b35573c589b9de6f3bbb3c33067ddbf479053dcbca927eef1087a5dbef8211f38674e1524a5908e3537dcaa742c89ba05ddf91d787da3fd24f872253561dcc865920beda58c617eda74724b0d3b1247d093f3112b1e04c5590bfff1a1fbb37739f4e856771848f65d0f83fa62f2ad23465a58d8e6e5eb569179ca72c223470b4fcdb2e77f83207f85535ea660266a17b596643b0c4ec011e52ba947bac50df25dcd6eaa0baa911e4141bf24efbaadf5aab1277ccc2fed23a67b39e5ade96f8ae5455761e8e912e1b5736bc6d34cd6ce1d026a99746fa38876d0f54cefd610a3ea9070ea656fb594d3740c126f492237eedd2b809a85563877061abff52f8d554baecf8368aaabdcd3e1360837d59052cda5e51099bd9ca2b083103848c769595dc348f93b730310857dba9bbfbf2ca49fc916c2c56e1d66d335a64f503b6b5d919b895400f75b845b6dc1095a2c8cffb373e5ad55f091ffa553232cfde6d575ad6feaeb6f7332a26cb9d1633bdab4750f77df93fe87219f6f77f1bec7d310f2b0d2006bfa68b25e4743a5d77da531edb8c5556699a65016be65b86bdd30e3cac04915dc7fdee9869ec1a06515da38a6d0313a2a59d6590fe9005f36b4911d3114bfdb898a445b4e35768f61dd2b303d17f908bcc48f34354d6b9c592c38d44417a1a094996de9b8dbf81f76fe09464920fb106a64c99505660ef676c8756cb3abfe938b3ea37d4dd32be15f065201e2905b88490ac438dc5c878cc6eb6313b3577743e23744f37dd0831fe1497c281e37b1274faef85dc834a9d524c75081901bc1540d40759309c6b3815e5d3286488c2c7c62b615e371a3b945ab0ece0c29583c2e24f155f38c86ae6b482d74f229652a2ea5ec6434fda5f7243299e4a285e2fc0844731703b23d7932d4d35673990a7614b4b10ceadd117f350a2a94b1b8b56389bda14ecc0036d54f0650ab91c6bad8b1896a5d4c74e19b6a5943d83b566cb3951d53bec37a414dbd45cab18867d6bf30b63fd75db2cdbf7213b8e0ed539592d04f7f1f7cbeceaca85e04c00f6dbc2996d574c16e2f1c1e119a56e755daee81fc2264e535ba12febb60b139b7d1c5b888fd97ef948e1eee2ba61d35e2ce88d3189b9fc014b4e7eee9d488840a00f0b7b37799d6696bd5929c3647f5b75467af912a50a75dbe930132958af85deb60565a60b7db7e18f294e82405e762e6ff3467923ec41221797ef4c8d4317a78ea07212ae641dc3357a66262d71c94f92fea041a4bf9c36269fffa1b59f899804373997f88221bd4c59f5ff78e9e6565ac60dd0c43a132066459e7349dc42025197c2609214f47650566b225250956565b0a95f8a9fbcd09116e77d7c0275f8536f79fb838646a610253abc65881924a6c323f96ead438ffa82f05d6ae3d3aeab0dbe0b3678170891d06adaf6b8bf98daca0d7877da197457913ffa67abaabbde7fb13ed70087b73f3207a6f4b3795523f881b6b49d7879355fa11162abc6a66ca24063a9cff1e269ec98221966dea2cb688c22bf8ec80fb6cfed6c8847993f61896e085654781a71656e91944ef4c3012d8bbc65e7a15ca519c9b8513f6efeff8f02a7c59740966328f8581eb25908cfdbcff4a8f23cbf0f2fd741b70c18ae41c36b537fd3a74add3fb90e679f7d706e7a14d015cfbb112ba46a8c0c728521185422af692b3de456996e97aadd3a95f641e189ab6046fd9072aaef2758fbda1ed1ac8303586e3d33399cd03f6405651b1a0fb5e1b54ac0bcd224f10e308f3f47a0139630de9bd4af91aee7a7d2940a7f176cca681a9e36c6d3dc8ec60f0701808a1b32cbb7634e97aa253e212d794b5abbfdcb0e", "", 0, -1013848608, 0, "0711627bacca5071a30f9065c77b48080c24608726430beaca8e9acafa815b6a"], + ["030000807082c40302760c3e83c4df081ba04052358e32129594e71674e36a18cf04d337e536086078030000000700acacac526a5338eb17a452771a4be394381391cade7af5e472c77b15855a4396ed03da1c19023294b9f400000000065365006a00637e55d6690262d8d603000000000453630065f9974f040000000007636aac52ac6a00000000007133601f030000000000000000f0957a05000000004aafac099c3260c21c7a56e5f7366ebe9d2c6623ad88a31cb303fd8141de0a6f43a928065221b7e45f7bdd384d0b0c22e4173eda812ef6bda9cc8d8d30e80291ea015e664c1d15de612e97afad1dd6287caab409c7c5ca429cea8d7be85565ed00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000abebd469fb6cefd8f6cd22c9b6080a45c4da55207cfa5fea333edf80cf833f3146e30d6ff75ca315a18633b067ce12ec5d58b6ef8d032f394c117e381576891bae36c84145be037e9c9299568566eb0c6ae0fb35f7fe7c00478a903ab27935a5f3f451248bf1dee103244a98bb4f0e94e91226a9917364968a227e58f7551257032c94fefc47a5e2998028d6d023752140a81f3b136ec84ccc7ca896cb09a4e8ca020b928fa8b86f2c1b1612e9b88fc6fcde9d99edfa6865e463febb06246cfdff820b03d97ac4532cb025e300871907746baf1ecccebc8741fbcba1bb1cd3979ec4b0cedfe631f0484415fe878955b71855ad29732e4aad8dd994c4447b5b607e6514030f0eaa66fe60b23b00e465a2148374766e43fc309dd972fc34f3555dc3bb593e0206eff0e97addffe3f91c705f67113198c5d18b54f5ca49d97dd88ac49cc659b90305917bec604bd5898312651d44b126edea3d7ee0ac64aa61c7e56bb6f1eea8fd022f1161e3f84de4d669d668018fce528aee367a62d1d2b904e40c91db14173a5a032dfd71b8fc529df5638ffbefad42635d35c3af9ff299b2a40b23bfbc91a7ded345e42076a7ceb2156317c90e9aee789a7efe25be35f8cfe3673d7b0d32db22f3fab094d30e6de4a41a1a9cf777bffaa450fd492ac58c1751b5ac85089c079be172e178729c34c79f6aeb219958538e60e9a279463ab427c8aa31cf93713ece98f73dd141615ca9dffb18597be411edcb40e30bc1adbde1ed3bec37eebd502e297a124cbd7090d09c04f8d358a1f9fe274f911ab65d5fb4ec7ec45c80a3e5446e1ff25ece037f7e5c0fdf8ea0a3f0a40753fd760c74a3860eeb03be7ee5da08d80aeea877031fe08d7ef1cab2658cf6782e7beb5da7b10f9b39db775ca7fd80d375289758c500044ab06e61185c586e0907c323b470f350d3a708d0da9486a1df2972bac68fd2f94e8291fd45fb61f1b31be2b2452830c1323a971d7ccdc54b4cc1345a94146955c736069beacf09d452f28eedeab284bf6fa81024dc69dee7bf2138243b6d50a52e4f2599966fd5372a81e925c50dc20929b0452b6448ecef97423ff2d3b0d0227e6bf1e0311b8d0c6112c7132f9c6647c05cc2f00cf71e6930022e7125713b85fd2dae7de612a8bf6384a7418407c7f929fc58f247cec3d7ce88c91799a75c83508a904350fd9f7e80a9a1f0acb4e43e9ccadd02454c13d9632b9e59b385b93c6f7fa2f6b4684520bdda24dad08b610515afa8d5a0d3097473909bf9ac132a0e140a5f8590b20fac49f4ce61e5630dc730004903b382acf51002690cafda572438c857b3dfde2b90efe95b0011763b934ebec6e148e7b6d999a072df47026c7d4afd056ff788cb3fd41cca25e8892167d6257191818cf148d45a4c0de42a50ec0f161c9017c1d32805ebd9792eb9af058d4d41412473e7ac908ce4d1d347b31678044f8f47bbd90a1a1b7aec96f1547e6af9f256e73b353e1f5c2c4515d7e58dd6dae213202c75675929daf61dbb8ceab7818f2eb4ac5c6c6fa250d0f1d4de9ca027fbac287f777b2e3462a5da1ab229c0714e0f43ae898f65527d6d5fa584ccb70941efba9b06dffb6d03391a56ae69f50235bd44245ea45d77cadb1c9037d7befce017cc79451b75fb6cf37d38c7517fd1c18d6cdb81a7e5ab9dfb3c1509b59e1746fa1a7c1a8ee26131352a85b6642e8dc51fbac7a2022247046baa438c1b89a3dc6ef7a2cda3fe029ccfc59cec98d47db7cb78e9a893429433160c9c6584a3a3f2535f03981994249a893aefcb1adcd9a5183164bccd7013aca3539584d7c2c326bc881fe2f943f22d546c8d5dae3072c41633f422b1d7fae844debc25c6b895d5fd8bb36e3b493dee83cf92bec67c1c7f8964f7fc207725f261755c53602b0094ef0169501b4fb7245b9cb889af4f1377be7dd246ebe6b7c2bb25e5a0652ab93eaa1277ac633f599eb809f046118a3e8fdda1d0ec578b9e45c79d80eed6948c135dfa04f4ae6e621d141eaa033287de2fb11c7e32aa90ba93bdfc0bcd756c2346b4b8ba595c1d173e0810dd33a11da5d2739da72c256f411b97a94070b9b3f5131a416941e2a856a2735db3b8a9705116db704fd9aba0c69394b190724089bc94b06d6d7b69bfd431dc4fb99bc8b0ec89ad6328687767354f27c5f34ffe5e84196105e7a3c72e460688dbf5b2e15bbe926b44904b738c1cb57e93efe12f1a5a29c41235a7ecccdb778bc24b18d34b0c7ea10a86424fa8453a5b7790fcc169d5b148274d5c2e0795b7dcf7bc02000000000000000000000000d0f083c4f73e5d7540406c3a1e53e6e9b28230f6a2f7fa220a954d87ca72186dd61b5be9cf43d6adf294e320ebe2d372260f2bb203d120e3225e03d1ed2e44130c0c377f3f2dc6e8608bce8a6c968d902074b6de6c871867a0766122d20398b3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c7a5242a5e03a640f0c0612f953f5bd1ecfa2686870475fb5682bb42357f15a66c08b1663e32fbac983a9175d619fe222337ed42abb3876918db10d1ec52dece540e4bbf39d23b4e49425d342dc3e0f582410afc0da5d0b5efbc2e789c9e0fd8f5b9498011ef1c171cfbcb17ec901abd3ffd241e94b16f6214589221b7eb95f023005de800eac6769ba878a1169e185d06155269208b2a5ae535140363050244a022a0e27549ca4d189be595450bd2af823d2a22b4768822bc7d10651b33ceca5740a08d45fe935ed5d6a9d8fb443eeb1a2705031029c4517cc90cebdab1a1143f2622a35789de03e70fe8191c43c44517babb842b51c80200e3292c45ea421fd688c031518945291298f998a5015b38a535efc2a603c0fbbefcd54befded316c7be79202195c53a10c89164cbafa355f8593174999cf2d3f71954f77fae257ad180140390220e7f875b60cf588cf937c053c5ec605715a7c7af96c412e0da8f3b7d62ac213022db6e99abefe20f9968f83f93708a5381a89a88e5ecc51d24c505078d791f54d032bdf0cdff5b7a2205d44456fb118b7ad92e5315969630b874b4a630711357ee8330078b9213229c6f332ebe6ff5811a1ad83ea6708675ce2e07d6adb471f95ec6aafd7cce7ee5f0135ad7af16535d6132e9f3484e1580d39281fde308b6f212a1d44257d621335fee2cc10ef46caef70afeff74dba6b7bf322e6e237a40393ad9b244e06d998de52e8699290ac56aafd8f9a2732fbaee9d683dcbb1b8fd007b31ec28587d2f008944c94a91e2b279d914b5a78df87f0d1f40d8f21011c039e17b6836e967cb13b03231829f3dc55bfe1dce546d4fb9350332458755aa4d3c2b3c880da8cc9f106a378b4660fc8c7ed73e3575b405c62cc9c5ab026f58c54c2a9d05444c881992366827fbff1801d1f3cf853fd04dc65dcb83ceb66dca2b4d5bc531c86782f809e15d661e5eb63b7398ac852c90ed7aa232f12a07ae32177496cf67da110d3fec898afdf950b4ecdabfccde4e2db4faeb4c2110e7117c25ea0fe019b7115dd88bdb39114631b171c73ad4f8cd2eef43dc90c7c9f51af30cd677512caac5fca1b90a26f06986701a887509a2f90001ca89a1cc9a3bd703803f5aae01cecda798df51a017c7e8f0b96f38837d7af60f4b78b7d4264c6793b108372b552a6492c8fb7771dac915ecec23bdb48e04d9947f9578687e8b173c42bb92957b102618fc57ade8f5ce040d5d6fb8d657312d1618331c20ad2013f7e1203af9588ef685ea87ead617ae6f579a3f8deac70d21b5c2f6ed8949bb9fb3a35f68c158378fe3cfd31fc634ac9da1ff03fe2660b0867ed3d7050213348519c6eaa6e957f30e785e206115ad183ed4a991061a7bec9c22323efd555fe6e2588c1b1bbc791521d029a82b8a144000ef281ce07b68a99d78463a972651917c306e969bccbe17d05aecaac33e8992b1141056d30a550a9d75f70fdf43897d7db93ae7cb3e196364b17fdffcae4925c945d420f659b6cce195fc8850a10b6b76472adf763b1821bf5ce325535de157b07b4766890662bbccaf4bf8117ae5f07b0441c24c4a98e32d7154e893df1811b61c07cb2a59e420b217f588dba343cf04414873228a126c03ac33f0311fafa25f5b1e02322541562e627498e7b1b8868e2099e7326a56edc2390fd06ffb7ecbb13f5764744542fa2d90d51fbc2c6de69f126ee1b680552c5adedec229c036775326b3c3c20b02e53064bc06a2a2efb46ecda7840c6bf70165c86164bfa32f75bdb7efa7c4a3aab70a335bb405014e8c51469d0b07be127027ef616f8b71510a2831770406965e269def879ddafaa25fec05ee76249976a28ab75cf2b455940c19eebbe6d4204226aa6e371f7264db0652e611f1f35d9f3cfcc861fad88b840ff4c1bd70ef17f43c5a4ee1b0a3f26e8f6cad751f68afdc814a8ebc04848901ebbc4270ae5b95a1c3d21773fe6f38bec683f3809e90cdd594fc03918213cfbe165d9ad714ef18e8c13866e95e7f8560529ef2fcdffa3a17c8ec34e11b157e4b02a8944a03899674ccbdfcf135dae6a312faf1223e12f9a052b5cbc34c58f067dfe6435c39a48cf428e4bf386929228528e94023603bbb112026f3970de540fded66d3c50ddfb609b6896a52d3ad5cd9289f2e59298e62fa721099940dab6a4c882c6a4354836e33d9c136ca38574ffd4e4b2ed46598a4a4a10d5fba60c99c3fb915876b55f10dbcfd3167f738b74ead2d5e78b2c917de0f437c884f53d81a6e7709e943fefd3bf41ab4d4a040000000000000000000000006dc9a86f33904c8a5462b0f0d1f8014d11aac6d3c4cee9baf09322b014d9939b8e6cf57ecfc6abaca82a68dd3e5fec1974740b643245bf1016100e22852f730afdfacaeab9b17ca48905f6f32bc16acca1a1756a68bb84969da2f8fc1f3cc00c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000031bef49611509ddae1aa97b23e1751ed787db578a9e152f143e71244c4ddd40f252f1194d922e2e79c5be70f7f266dc23a06cccd3c7c8052f6636048d67f6cd0050afda73341116feb8ad1fd6e7613613be94e553a2f0fcdd98bfaacf087fd337ba6809e93d91f6256d4e5a60dc1da86f18eae69d02448eea8f91d0c03f3fe1a0305aa0fb243ac1938e72d1bdf89652b8e46b699f9d0812820419aa86eb7c4a691031d1606de644a882db29250b829a050239315241b1178433a98b4f4bd9d139f1e0b086904e1f692f81d0fa67ab673672dd2c085b43902de7a6a492bd1872acad0a4f193abb9f1ab7c89d134f583c2d41476eb6cb2adf00f2f6ce361a97ee34b80b20202e5730f1d9279dd84846136056a100588dfc71245b6754bf76d7ee51216e237020760b4cbbb5eae6dc4a794d5170e49275b1a6c941065cf0b2e5263622975593d021cba5a35f00263a6e3d6a4d9758c58de29897295806a5db93f8a7afb7bee30b6031ce94ee9fb193164feee4ab553ab51867ceb1f92413be04a5c7f4a5ab8ad1dce030cbe2bfbc2180ef986d24cd79ca84a1f03f52ff5e7c5130362fddd4608689234da8d1d054fedc06e30a02b4e165d1e1e56afdda98a62bbeae494bb5fee4ed1577022ce32b96467c8946695b2662633101021ff08f13da33ebf812a122995466e68f2819937ba34a532d37ac3684584135331aa222660e932380458cb658aaa10d4c4deb24e2196dfe70a89097a6a2edb70d83f3423924eeab17debc1edea91fc99cd2c33537b06f732f99b5ceb8970d52b2436ef4d8cf2a71f5346f87d73edce1e98685cba1ecb2269f76ff2a1aae3ba52683905bfc904502e91c97c9386cc47946b5c8dd0d1ae1c16b7ccab8ba5bf528c22ae03e6d161be00ae9dfcd020f04d40ea09e4db84b82399786af11c7cfcf533966f1cf38469ccc122eb9aee46baceb7fdedf5f81884bd2399c5c21824711bf63c8d7abe1cfdb8f5c9d056f3f1e7e22d61b8a5e366b31432d7eb07e4ad1f8d449d6233922b054ce979ee939fb076ed50f4d30f3831ec8faa89a8927e2aeb59f44e7ec8c4c5362276e6daf7e58af3f206ce1a5abe0be85f0da1d2a431bcbab12cbe4409a5c21a3cd424cb6f5b0e726cb342f9ca721cabaa8617689aa178a49e915652fffae4c2c7714de54243bdb531906b3a3caaf23177d58f676a97a2f375ebcf0253a3baa405dba02834710f6024113acb55c0e727432d4ad1a8c68faeb35ed999d9c54c208efac706423c38f3402fad153743da2f6e5d8463d1a2eea0eb9a52688ac8be81d4fdceb2debf04e84a2accbeffb0558e8ce9c71546008125b08eb647f790f9cba525d981f18d56ea57f2c7ce88ea875f4e461733df289247b268d4b21487779d753e93829dfb3c6a870f89925aa037f97e89d8734f4e7cf07bf6286eb916f7108bca762746f4d7180643c6077dc16ca0789eb507f40a05f4e447c3f105ea318e67e83856e4bd39f99ae993763e19301cae3c18ebbd96ab74b534c7dcdac8378b10cae7f616ee43b20bb190b79129683981576c7ef459c65ec55148f2ecc088cfd67eb6aea5027bba41360244c840e429366c1375cebd46ca399ff4befc3800a9e01a721f2c6495453479ef336aa6fb35615d0064a202883fe2e24f9409ecae30453ceaac51421ad0402c32fa97da0634829ef28c6c043fa99d18214c240b4e64f1365035808bd8a9ed8b08fa4aba63cccca14707c49d0aa32b5a43eebf2843b5fd7ac6ee681bb8059975c04faf4aa40f8aec8f9017830e26e88ae11508213d867887b4aa5caf34795ab4d4edc6bd3ebe51d1d8bbef833af85339cfd82850d70bc4869a5be1a5ecffaa5774aea5621cf36e01e90fedf067dc030bc3fcb6a72b5a4666123b7541fc8a6da2b8fb8bcbe649a261bc6d8c6272a1bde477c85106a9d367a249dd1d482a73b930d56a9916d63f988f9ad1661dcf52f4686a6a1f881a119b7ca988b58af8148f0849e88f2f3d2b369a877cf17529c06764d48c58abaa7e8ff5ea04448f601f43fde9256e2e99616ffeead0a80a25cf2a5960fd40ffe255378a8aabbf4abfc2f938371d23514fc44c519168455cfbe4a542b669578f5220025a657ded426d7717b2c123d86264c5a768f79d6e1fe590832a1e128d5c134cc849375e525dd0c1f92e1d855fac0ac00352a60fbe1659ccdfcec4f6ec205bf6695e77a220860e6677e4e9c0a52d0d68b5a5b967140ce094cba0b4b5a08c34fe0daa8dd81d2af78fb0de67d7cb88db1c86056b5d81039a978563d2d974efa52f4dd3c84e00d3a6f60871d8e939b62473ee8206b736f72ae9414ca5fd562ed98720c4bee4800850e63bbe804e8804c333e51c029a77c3cda38bc5863a3229f85e0047d759bdf455ceb623297c32c776fbacb649c8f256c3890cff09", "00536a516363ac6a51", 1, -2078962437, 1537743641, "3a8d045e91cb9fc9b33823224c54d3821c48d917b8d1cd6fdbbf7a96635c4f77"], + ["030000807082c40302b72e8d804f8a5b58ae72b11770ccd78999a671220c2b06303b3a021efff8a15c0300000007ac6a63ac005252312be3e2db995defcfcb9f872e688ff96dd004b4f8a338d0db6b587f9a56fa81b376b75300000000076a6a516a51ac65ffffffff04d4fd4f000000000005ac6a5353006ef2c30400000000060065ac51515366dd8b020000000005536353636520009d05000000000000000000d455ca890200000000000000004a6f6f0000000000ac072ac361d3abd832a86c7121e6d13577a68bb6a18e260efdd07b5a262d1da26bc5ca1ed2c03e69508e54eb2d6abc16feff4dfb0b110bf1c60052e395776af178c2c588c65053db0841332e287c9196a91da8e03036000389a59ffb03f846890000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033a9bb35c856077b9292e1f4f1aff046a574546a0489b1be1ebea0905dc3d4d7eb62782417abee08117aff94abe12c9a71884c218662262342ce377266696f0683c332fb6c8652b23fbfe858eca46b146dab01442db2c21287fd7d39ffb75e1ad5c8c09d124ae0387e911e3b37f54ab456dea0bccdb2313f8b84be84776c5a170321eebb273c836162dc88591fbb2729f919892d92738b5dc6bd160e2b9e4f0e38032ae12c00fa65b13e183944cf1a40472e475700a37a8c8759049f7ad2ee376dfa0b09183c4a7f94580f1cf85c310a9daf934751c68f14d05d3c4384b96561a7cae96f0a1ef7b90bf396b6ef72433180c3133f55dded92a06943e25107e54f48ca8b021b2c501ea2e357ddde1fbdf354d63a50c0ab34e5dc4b8e967336ceb753b445570324e9428f758792db39a8807dd9e232e167d11d9bc4c78b4df564e6bf2bc62cd5022c4247affa8eb56b53be5ecca6ef6f5a5355177481f11b6ddb1c211388c5e85703137dfd46ef7f84658a5674b4204dfb1d4127eb91ab064bdcb009b96ade9489b0031e100ca18dfd15900764507645aa38822d79109e85c167e6b822e05385cb3bc0692ea2671a1f98f5cb03fca0422cf6a2025161ea443db658c858269e5ae97310aba4ee97406ae98bbc3e20a4910038f608754e2219dfd55d2a547f0d6dbabcf883095df095c7f5e12980263e8b1d8c8415ddb9cae9a765cc2812d966de941b049a1e94b3d1dac79136f1282e2426ea789deb667148b945e3281102737ae3b789a2d56d12ccaac387116e11b2bafb8f37c479c7b9570a3b9107a31a072975439967084c4cf037cc0215fbd1ccccf0e883606561cc5c3efbc5d74f08c20290659f8da8a88088f88d899f1e7375a5e750ece8c5cbd6cf84f33eec1bc2a98448aa6910397ac8f1b2fecd05717afd6bf7f60932daa10a9d0ce4068e426fb417863541aba1db1115c1f23396f2715ae824bacc889eefb51661c0534f8d3155fc01fe193dfaf841c9c90a887b16569f2c90e30249e16f7d984de1c188e26c21c832c5d04e0826c8fc65504b87c0f712776baf6498c6fcd3964fd4d3ad62d90cc8445395c57c1083065c29e2a674e6335c2aafd3e59ac168f47b3b260f5fad9673845409957983b705edb3215d61f641648ba401085fe329445023a69c3a2e67a07a8e94b590c4e3ec240520cc3d9f63271f6314284e71fdb14b11e4d8b29d9407967f268f8b85333f26ad8bd37f198c2155471d1fc65dfdd914d91221ffaf0e0730e8e1b890d99000c1027e22f1d4c6f2dcee44d68134a1952684c1ce6d72673694f20747298bcc490f785958095e41e2b4c9206dca7233ada9378acb60624c393001deb9845dc2f227bd44543269258f241836c3f4342c2170ef2d9f6a5c96ca458a93da4c553664ce59371fdcefc4899a88516c41706c98469dd848c381b738ac4e09dc7d6e3aae952296b19afd172575de546a757e8a87f27997a05b79b156ada2625a7ce6fcb0e9c063dc357f7a17be0263ae14d5c2303559c98343193823f5b9febeb08cd33a39d45facb9d04d6f2ccafb6b36a93f34390652d3d60228d4b36320b1f9ebda3c90f6332910bfb986736e15341b74701b0491ba90d8c8f5768b6995925bf6e34f4e96e3b9b1f40d5e02b8eb6a1602b301c95625e0f9f82eb6f870938c7ddad1f2528509b036f2ad31ddfc6b63393814813f717d79a5c13d03605d48b88b826e5f438a56b0b37502bc392da5f435295d76a27837f0baa764866b14d764d4bc3c99719100001b61c0e3625e13288594e51af8630b77cb583b5d3a7e1c36e6f7c3318cff291f347850e5361e8512f3d5239744b6b3426ac2b9a1290c45b1b0bbb10faf51e3bc8d4aa93f6371a0065a6c01c42fc760e89c8ab2fdb6a5ff4fc71c396177cf175decbd8b1457b9ca3db23e393d951452cc71cc771430a7d271bac6dc75a024c6abbf1529302246b08f25ada9cbce203397607a9aaf525218e655269f19192f8be48ec169dc67750efa52709fac4527e84305d01ecdf7cb6842b4a0c091be4bb4144fb71c019204de9833df22e1c33102088ae5bd73992945dd473696539cc3283c091055029d5bd80ba8c332f7b2b545c955e01b6589b01c98631342d6cca25f0acaafcbbbdae9cdb438cd364cd673689a4d250ba4ea8e6f53a32258e0bea45c71f3fa48747a47d2efef0893280e100431a197df10dd1818e27a82123726bf3decd10ed26a5582c1b66004bcd236c725b9de09eac85575fc7ea157805ec64c66ea401194989a66676a9100000000000000008400e10300000000eb00f7ef3704f4b9c9d2f49cc6e9435e03c5ba2b96ac85b3672be499a97572700d868f3aedc08fbaf26a5b1b086aa723871f7aa58976e423c3c33377b76f79bb576fc0c865b1a81510d682f29ce2ddbfcbc37d97cd720fae0fa6e8563f92b2bc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f82167c5be495a1e6234269399670f0882706cc06ef4137804acfc2ac11eda4d644d20bf1459e95c215b8bf56a12a77a0a29d7524c3cdddfd88fc82d163ac7c635bdd55d095f816ef266206b60cafb5bde560d1faa364d751ce2b0b5cb1997a0f1ce01a43193a1b5531decf2ece1a5f950a4a4f0f6299f56ddd2063ceafb75a0021531045e93b12005651b19eb5dc21ac595553327b43a825672a76a20bb269a51020d6db89f21f8261a606bce7aa052c6b167e2c315178586d09403c128bdd19bf00b08edea0dd3b304b6a16efff1f398d736b5745d8994e50f69b79aad2ccd7d0cd5dc32cf10364dc6e430f375bf820c4c4eef0917fe7c40b82e1fcff850a660294c021e1a3db2c4764c4fd0839fcb8399a79ba417640cffdec2b8456b2588b4427be102160db5ae4bf76349ae01ec892897498e6e461a46b6ee2343f78cbf8d68e446da030addd6373dedc374ba938665e81f21e7785289ffcfb6d1b9d5c8047fe98f626f032981b76eec40b43b1c76394e6a74426c8ee4b8b9df87b560c3a658c43bc77e18031502277760886940765ffa8c2d2373b0a8a663e46cec905a3cd84424e8436d3a4e6807dfe2ba0cb6a3d1d70bd51f6cd58801432b07c8548a47ccfdf05b5c8ae3f64f0c3f227cf3d33904f6ed560e0c3637e72f8ee2e66224f6f1a6002a1c5f0186be966e007f7106e76e27251d94fdbf2b5092560deca1bed05956f462457b2ed51df3bef9fba621dbc3e41031ae8665fad7b85e72dbe65ea80dc955721ce75cab1b4e996b6f79aa9d775fd6b4594838109cdcdf68e90cad6073d93af1baf1bdb4d0bc887a027a8fcee3e0ff7c592128dec5647532bbb9cf9bc57b670f86d8a7db16a76b0eb24bd144e3aad8bbf1a15202b5d26d60a4302f0758797f423f0e7ae337b613a023039adf37f21984fc285c35d94969af3e61cfa1c165c021c71ff601788ba6dc3a370f9bbcfef07bfe166a74b567812b4b8bed740cb222204b49c2ddf45301395f5087690f8215cfa4f203c4f145c62c3dcf3983830ce02aba1c80628091284675c62ea06d163e0ded20180d64028d2a6abfe01b7c50663f67233c70341726c1689240466c26bb9a1a03e7ffbd23a87d6c2b9f4e941d8fb954e5f7937b617f6c2d7631c0bf61873a6783933b5597cd5eda6455c225a5a96061563e3f930722ee722b4cf43a508b0392b7802542c364f882a1f02481a7c4180b4273ee0b46e9311aac218fae769345e7ee564afa25fd03dcf2c2224280e0ddfaacf7781286ca0225bc87f966cdf02212805ed98a7bee8766e0f5a5bed3ef8fc3dcf611158b6b5c0bbdb2387e1fa8e310251a7553849b7083a2337309ad0626858acee3c6c885cab5941f1cd0de3edd8f15de2656d1dd27c0ffe9531e87504752d151bb47b04bca1e9ef2bbdb6f7a13d56f77d24f9a7fe060ba82c3099e61da4130ed085effc11b2c71a4049c9e286ee918d930a9d9aad18176e98fd886c2a668e38355d1acd91729ea68982aae7a4d75d58856e314c383abcfbcc5a3777fb41cc5de3a301e294c1359325e045a13d3f2eba1bd1669c9ddd5aafed113c44382dab9f6b6a5fe761a3d115368e3e7861dc9ded79524652e6b8adbc671d946e367158865c8278d24b052908a9310cb91ed6068d743c1ae87bc5aff127e62998477e8f8c5e26246e0c9457abb1b8d52bdaf30bda7b9ffe4dcb1714c9e3797e83f78943d390a0bb49e0948bee8d47284631a8d4aa9fc628d4e2654a9861e765fe875ff498e4c150424d69a3384f4edcec84293f2ad7f28befd69b9dbf30fd3f1c288dca0dfd0fb93871822e238e7e5aff9f510013c7e16ca5cd1ac9fac0505b134a44f41a19b13ad620e996c1c292cb85e8b293455bedd3960dcc665ef76121db41bc8c9a2c43957aa671db2307761a4f56640129637c8454f7f3053674dab4d7556e6805afd5a078fef309d3a4e3da96d7a69205499f39d5c4fd5682fa448a53d5d3a6f3593cd37a4c4d5024f8def8d2ad5db0a1e9ad345e257e90aadf11cc0689880d3ca93c245e22469b33ef6a4cc500ee6e0741c9ec2f85db55a16c51dcbf34e3c575201ea80b875c222c57f21f2eed8f218c337c0ef1f740395d0c957b171b9f8d77f2a6eb2c671244f9ef1e0fc752481094ef7ed48c949831ae2b31deba6a964cfbdd7cb8eb34f2a7caac178adafeee9d75d651250a83052fe422e3b3dbf601bb2527b27ad796fe02935fc2a5650533247e05fdf354ba1a28bb6631b95d31bf6b79a8640c58f4f6a270055d165a948785bc48fddbd9c0746ac155e7cffd3863d0ec1845027af220ea1bb7d8778e825977d2f41c765cedae69951f782aeac47610adde481b07470129a814fcab6746f1ce747e84fa57b957f13587112a013a0a046399d02b6509a954439de0ad9dc8a1fd582af00", "635100", 0, -318154590, 1537743641, "c1530ea24b727a781faa557d1f90df3dcaa5870ee42516341b59f16dbbe390d9"], + ["e11c4338033082f7c3c37c6e0d039ed4425a17bcfd1f3fb325fccea266df90dcee3baff9e5030000000751656a005165acfffffffffd9307f07132e99429f63eef27bef289267aabdb39742ce5def83e626f6bddae020000000451ac0052ffffffff5733260faf967084ca03dfc59bae9f4d8d5182f31bd767ef7f6bc4f9bd3d731c0000000005ac63005263ffffffff01ff1073020000000007006a63ac6300ac67e43a34010000000000000000af79390100000000e279ae93a2a9e17276d02b1f4f46040a701fc9de9e63da54455ae85095b8e432998cd1be740b1d90d913f35a6dc950763304e45e23c0b603859e674fd9bac5e2f997d2a13e3f516e096b66d40500f4d644a8f3f41ec4325abf99eac5c9c253300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069c1fd0136b5ec71d34e80be9e83b58030f199cebace1342da5fe53cd53886546138b9722f4d84c394351e7dbe21a4241851b06f752b36744e29ad4449d7a3bba9b3c0b2cac4913219a169263a59bbb973f615cf884ec2db943cf312fb030c9bb175a533e72e7e211749d62ede8547175cd1bf10c10be398136c3b3aed86cbff0203d0f5e4bb9582d2632741a7db85d522f766381d4738b9197d238f847d389839020637bd9763b65e8cd2eaa2cc763fd7c2686988846c5cadc52cc8ee008abfb74a0b04f5ca553f49b73a0e6bb81b14afb79414e22d5e87e5750f8bd8ac31eb4b992e520f181d0faea706c94006162430fe1d809370c4aa90f7193783f6aa3094aaa6022c8ece28dbf58af1ae98c496d50f9d71fdd760cfbd63c0445892a96f5853e728031ebb85c7e736b541dea920b36322772797d2e5bdc03ad4c328f7aa7330e2e9bf02104c2a1b08b3d3b6aed1c05f51160a89b6c3ad66027be9e6f25626cfbdfd0185021fb56bbf5c6247ec2a08c05962ec73768b21522ebdf95c0dd1189633d2628d21021ecf6efa6d1c4598d7739c72f5925a16b0c7e51532e5d2d7f98387b91d0ab6eaf1d9b617823b7af03f1714c7f62f94fc1d706d860b8a48372d604bd75e66bf974835b3099ca188b1901444c609c37c39041a95d594e8f875c70db5256d7e305ec4699ef53d2d246e84784c9071373c7589b6fcfd57cf3df3c5ecc87d0e1fa3b77b5ff55e0e9485d3eb3dad6727ca181074c4bbad7ef21147881ce6f278640139097e5de7e943fa374867b51108dd8f10bc07d12e02f9f20210b6045b0b865e09477fbf385d3309a56d1dcd4e6f83825f0f9ff9e7baaa3425bc7abb12998a0d8055d113f0ce3b6c68af2a6db65a47349d77a87621834f316ab8706f61bbe250bbde80277f36a9030a42c89a0e88075c9c5031f63e04134c55009114210473c0ada5a627774b42ed07e294649dc300d0da0798f8de166ac7ef2c2662917095e1445f73c4b0fc49918e34485669cc779bd38df20dca41f849aef8f73b574232f0ca674e6c81d4f936465297749f9b962c41f6ef9dea3123a13aa611644b7749afc82bda324311fd5a1138800d7f3facad37c328654026a9c1d2aaebea470ccccd2abf5149de2267504bcfd6362a2cfe4e532a7f660dbe2d9d8afb230bdf88e696a4865ad6447fb63eb4fce8d9c5c528e00c78b63f20fb765ec3fa624d1806f902da227e5b30aad635dbb822bc3628874c979ce39746c1e3497de88d29ec02941caa780a153126cecfa1481858efb001cc8700287fff149fa6ba7b4c4e17c2d8b6035d9aa0fd48feed1b3e65202c15645845d99747599719c8fdbf9319fd0c31d1bdf18455e5801d15d5723bbede556417d41fd43ac013eb7f66926d3dfb3f57c126c8e0e77d18d439d9d81cd6eccb453f4ef45975e2c623bbb63c4e7618896ab116397e0d0cdf92b406b07bb79d354e9a7dd8e8e99fe05d0adef90fdcc52889596bcb02c0ea80eef9ff8192b63502857d6d1f8d00a094525bb345a59cd4d550104c9168eabc562bb8a90a5f733d23fd3fc832d642cd36ef7c3fd176d8fc1bbe62ebf598e3fa4981705a7378ee8e021848661543259fc25d6d2b41cd373565148d07f1f9e9835bdf6178370b2b2f8fe2ee84575aaeca6c65e4ad4bbd48e5c9531dfb39890d6c0dfee89df710a0543bc11bc5d0966b86eb2c03faa8d0d8747e39890fcfd01e3b68fded2015a87ad238da4346b3a2eec1ad1a58121cf3708add04f2e43f00c822eda713db4d54d59e1cab92ee079035ec486f626a1470160da80e7f9dc76b4fdc28b6622942582445e148d17421bd5f86f4a9b5ab7ccf98acb58adfe8ba678791f304f24dede1a22d907d333c9ee9635f962b26aee92dd59a7e10b22c3247f24c022894e0efd82a7ca8b401f5c09c45c68bae4a6b86664f716d955aac6fb54f03e50020131fa1240bf33c19a7a2210d4aaa7ab8ad291390efff9e754011ad9467298a190717d839f3029384be0f0f337a2ee4c1faadb03498dcc2b49908bb812dc09e3540377e9f31200f774a964e1b9ddcb812f22b481f9418d1f9b44c96a1507c88458b6910ac6a765d325eec8c53d641c1601e9dfa205881d283c57a1d4406b08dbc81f5170e8536c7dae59106ffc0850390f558822066976a2e81bbbcdc9e99ae03e8691cdeef3901f31d32cdd57a1abd32fa479cb77bf875e59543d93f1bdf7f54a87b317fda1197a3dc6e7f59ba20f6704a07fc12b354c4acef244028979839f7492609d9afd82736df708b233741d7d200bbb07b4a58a47007fe0256387b9c106248391de9bc08414f2ca1daeb3dc593f85ba1ef6b38545a8be529fc4c52a487d3cb34f82b6e14ad6a04be27c536a778c53655a9fccf0f2d3d47a19c35c911fa3447f5f7e02bc4bf610c03", "51ac6a63ac656353", 1, 1730395550, 0, "6ab3682fbfe8bdde8c71857b5aade6e54c8fe8c40ba4d2088948f4da76015000"], + ["6846cb5401649a2c2dca02bf56e22b44675c7eb955e61a6bc815e265fdff7923474e7d8e1101000000076a5163ac516a00ffffffff0322932b050000000000f0803302000000000163e9af480500000000035165537a1b130903f3c2b90000000000000000000000000070f09a9fc08d74ad637a42233d43f66fe4a3c5d61f37d438d1ad66a38e48910ca1a430f2edc755f61b85f95c36b95ca2f80a5ae1cddc31da0c5361b57c11937379bf93ab68c2bf624068e313445a5edf4f6c01874191f1892b5c467e2eec5bd90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000067f6fdbfd6244b0273b258470cfba06973a46abe7d9ca3711cf89f40ddf808b466f8a830142ceb3a35a80c35cbd7b7c771944e861bbe569fef35f596401019f1cd81fa9e17aaf3bf9687a13155b055ec4ce48d3b2e665faa15bbb553de5009797e12b28876c8619359cea9dad9fb1a4b6e158fe819660a9f4101a3c93617290a0323007af32685702b885bb69566572d75a1998ae92f8bc7eb69d72889e09aca80031553804ba667210882f0e6e7402971782fc9fd2893daca90f27a06b174bd196c0a01b438196562968433e1eab47188f1fbc1911050b983e65caafc82947ca83cdece5d1dbce0558c6597bcafc9db15499641f20818f3d48f2e618755cb792793ba021be357ca56581c881e5cfeeb34bc6ad303afabd75737e6292f9b6a95f791301602256068edba4b83ae1e8cba25f123ce484046be259afa70446e444c726b0b6ee30328826d541d999738ea125de217a83290e7430b02e28dbc8238d5c323e015c7150216d2a4f33a2d3e7165874ff7f2c4279b281badf4e6253c2bd6b24d8993c42a400225e040804129c5b4af5c075842a1b46b8c7a693998821fb66883e632fdc507bfac49a2497cdd93c2cc6290c0a9d272a19cf07ceaef01c02defcde2f152be93ecd3ad07e2a1439047a70d05513e4ab906b6486788b3583b5c6046e1613beb50677b3d514436e7f4855de0e61c900e984acd5c862fc78ee827c6c68aa9df87a31108bca9136566e0aa79d538cc2a0ce478c44a1ab58cdad5944d5ca4c188894db986b156fb35501135beba117da7848f78e6ce159ca789a3ff4e37e49b4a03ae92adb1cab0b47f981225fe78b8980616ed7c2beaadff5adcb5caefec6e4af862604644eea9ced16bee0e60fb4e739a1116d8606ce02836a9219ed0b324f78094ef9afa0fc897e1422c743c1fe35bf2d75a13f842efce2565235f4aa1630e335524ee3a73455f15b379efff2afcf322527a0ad08870153529a4036a6a24f7ceefb4c26da886ee232990b1d5bb7d2e1fb44b2a2652668b3a603eae186943ddac07f63c0df27fca6923df6ad10b686ba391b74cf9fb6c82cb0759c9b7d97efba39ba829f9e7c8b3e9942a97181f08233ef00e9d45ea195308c80339f7395afda8da4de418fd548c4c38629a913147a1bdc9fa4dbbcf2a963a75d920772868efb851ad82c48bc332bdaf8c0db6cda7806290be6b547c996857f876b6650b5e7404f30d2497e14555b2b9cb87ac7a423e54fc623c98f2ef3d07f20442babe4138f9c635850258ac83e964840f495479c77c125a2a60083b4126320f69f16fb1b07d3134394df1d8197daf979d55619b99435531867d732dea13e6981e75610b48ffd4afff3e39067c800f2e8833b052fba0cfe742e5e79a031b2c9142bdd83bf1309de41e02e97fbfc2e59265016353ba98e7ad708756fd834cfa2e450075d909af1a59ab79d5b8cda104f06c2f450d771e8a06ac0263c3069512e9d2c9967cfd50ab56e8e656ba2d281e80dc938b088c656e8320cf6c95d22a11390ab4c9cf63bfd2dd0010ee817aaaa4ed7a6894b8e5e5ac5aa4467ce4ccbe35c94d7d6d4efdd1842486fcce3cc50b8f91508df3d322a2be0e1e05e05a1041ab44b0c9f3c6747b5328e36fada9d9f4d5d2adda73102c0d8b66f95e1ad750c652e69bedac8a217ac87ae8edc70b1917f3c2805cdfd489cdc196a14a7e49a8fb15a6b24c29744ae0a8153baa5dd10a162e79d84fc76b0ea908f74e19e90ae5e2674d311b5ae709c0cbbbad829d2b25262854fc73307d255070a1e4a9de2ff1ab21e1d7c7765ad59e94c84a8548474ac2fa19a6287b20fdf7df7224caad0aafd405c0f18cb9e67f7714cac1efc096676e329255badf334f429885438798d8b0f284729ed1da6e9ad1a7cd0bed5ce8114c17be95e04d5561ad234508265f2c3096ef12a0a4d35f0ec5157fdf43fa050da09c2d5ea7deec8e365be52ede0be9e9da2593a3bec2f521b3aaaa9ae794a9ac3552982096f3f93a11df83894d5520c62182404bc0df00970b4edb5b61eef6d3381bc9bf73522c02defb8e51e186e537c0b409631a0dad763f615fadd4ad0aefa57771cabbe9a5bf2f4905ebbf4e4f4f683aa6e9828fd540cad28d0301e2534abf3c9cfd634d85be5f1170bf3c42399595f7a7016af3b1db17f403e7d822fa93b620e0169d7524f6f1ae59ce9d7745ae129d4e747740c4aeda101aebbc80e6cde72967fdbbac8a4dc3cfc4d4e4a3ea57ac4b3e4d7328750edbc9081000265ec1d796ae4b8ec61b3e861ccc9c6000000000000000006e66ff0200000000262e8a65f97c9d817182529f14b9ea47d2b131987a5869ea4067dbaf7dc4ef48126b8456b2a415049381f7daabddf46e1614bf4438f28ff28a3ead987dde1de3e455a81481058fb1b40076941f271958b3701a4a7cb670c28871523f7da81b7c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aff329f11b263bf4348097e97c29d66b25cf45be2798ea247b6295d46c1ba6da0bf05dd5b72bec9a64a4ffdfee4e8317a0681696d2209a1093f6f0a0d5c96164efdfafc31c0ecfff02e3dd3cf7cd47aff04fa63c8d7354887672606aed2e3c93388643ef34ba4df4f10e013a2524a8976d079a49e26ceed79db22f81c56b3a0e0305ecbb636ebe52943adf31a776b3b124c1dcb658b1c1c03e6bc3a3b05d42a0fc022beef268e82aad42ea80411562964720dc2b28498de5411a7b4d75a15b5e2ab00b067496e6ce62a321c9bd0f1e444c0648039477129166e076d4090db4726625f01502ffddb893cf9070579d74eb3c9ba07b896880b42d139dfa268209e9c7303b031cb1de1531db63a042b61163594e4976a5a6434df03b775b52272c84dd4bba0a0202023610df54ca283a2ffc1ab7382c2e4df4038759eeab6c120c689820ee21ca031800d5a5bcabb95d9a4cdfe4834a69c3856b2a6f268063a705c398625df539bc022bffaa3095e4e124720b9d12c2b5035aa51fb9546ecf5d12a22a44151bad81380226574e70597a52ce95f370bfa90deb61a74c06433c27f289b9079f0de0be8f7d016dbf732852061ad53a8eead976f58a9f60ad4ec91dda886826b3152b7bee82bbaf9a42a4c27148e507ba070b1d2e3dbe4627c39579781341a9fd8e3db81e2da3ac5508181ed4ab243c03bfff5b88ac4d25e03417b6339812a66e627e9f683cf40ed48b96bec7e52aa2b5462230c99a66dd6b20744c2cfe856903a0560d4f95f5581955e1ce303fb9d5a1f65fc261279a88b6668e7fb4025ab96cc43383938c027e616c5becdf0f25b309ab5e659ecdd625b42ed5a5254c7b6f5b9da7723d2037cb6cb121fecb3be6182ed84f586840ab82483905c93de741ae7399be9b84f7ad3a76a52d4ed7f2512ad4006fb359bb8941cde319474d5f6a18397565111fece0b544efd4d1b2a24975e72b8fd6f726d79903dbb7e0afddddeb56b90762349177305a9edf17cc69d421b66f61c49866ee71599c4f8788da6b14b2f05b7b55128105d1bbc97fce3ce1baf146fd7f6b1698e4a4ba1caafd7b8a1bf59259c575af6d34a9806dfe801ac85b99e8f5ffeb806ca1ce043e096a4dd696f31749edbd9472ba2446babcd749147cda8ff9cbae5c22ab9458d0bc9767ae69a180561763529c6fca6e3a7209a15e472df8620e2b4d301f46ebc5752c41b949ddd1b81d52d639361591783838fbcb62c14bab27ca58186dbb4b2b5b9d47fe3b6c1369718b08c89d23d6bbf4bc8aedc96154568356c9c7052fb2986bf426c74e93afc5594797e9d20fcfaaaebfd0b012394bc016c6c28012348686f07463eb736de844c18907ce0462a00e52fb44d5c7c4a94ffd879ffbecb19d8f44cbccdf83483030207e8c5e85a373b99be0cc3335780bcb223f94f5f056662260a3ab29dac90e2f32a5fc148ffb7083c85915d290ae623f2eb22ac558309dbf221a69e29b1493453d51b40feab6b2e5f21e15df1980a5c502054f57f389090a96370de3d439ed26705ef1f5e17a60e186c6d432afa1592f50ba6dc0eb98f8f155af32e94242cfe06a29087b1bed7c5b1ab4afef7bd0dce8f552adb568ad3c63d039a9810a0734db595f3dea38d674cf800bf1b030c35912a6e97f2a2d8aa6c97f12046284fcdc101795944dbb30641ac1a8ab1b8e169e2fd5342f37733bbd05f05fd81aef950028171580a1be736010abdb3858fd6b98bce766f07b51f2594f79fd8d3096725ac56ded0ad69a41962aadaebf3d84a2469bfe95ed2967d6b3e7c1e4aa6fe0b81b85484a61f5f476d6cc175cc15b34ba7c7fa8db5f1c25d957cfc611915db71cc2bab53b95760614a973a2b5d00bee3f0c6dc93bc7155fc2e833a1db97ad431f1193ab119c7bf953b0e29e7da8bf38bd783ea8a1ac0e0eec93ab9f571becc82f2185ceb1af2d105b14714d74a3f85f3bb80cb08880302e292a9df7eaf3bfb4c8c872e9506f81c1cde8682bb3e168ed62b3243fad6100e1a76527d1ad80cef97aec27273e05726701eac9d1b585b63adf3dd5e0f3a91afb8a15218a3b0357f60234a76954360785e6cb21bcac0e53cf8091cbebf0a0205e5336ea46030918a3f123240cccb67fcb811f673807b3b61ad18934e64286a4792caa96f076feb0e32e5f6f9aa721658e8fc64c24e81c8f7f8cd90f3c17664a98d1d27bcbae949e34da8c1ec384a2bd66a6e6d83d6c5d74274497bfcbe725f01fccab42bfba10fd1947dbac418e61fff13b96a235aeda12e791c9b8cc59615cd30000000000000000f94583010000000011d54cee3eab05b1e545e64e0fd5f4274251fd33a73d33f41e663138d4a07c547751c9a6d383640feff58fc81dd3f9cfbdbaed301d227c99b8bf8d2bbc5147d4e89f355cc337fd82adef94ea33f6f28672606521f91c9b8c444b9a42aa5ccdee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000956f7c61117d613f2b4481abd34410c0bf1006c32fda51df0c28fea95bbc58eb119ab51666307fdc9a2b686cef1c0812ddbcc9f70cf0e840052de66ce0bb11675d63da61fef0fed97224000271e14a01c52dbd80eeeb10d7642df70a61f69b49023e57f11b098964d29ad7410bbfe6ea9d425c4c0693cd41c504d0e9accaf5f0205647d0bee47098caf1223a8238610e2d2e8b2598ae9d0b60bdf1f25b75a595e03155483b20d6679ae1950edc15d9950cc8ab2b18ca21e13d1b98b06a74ef1faff0b02f90d88a4579769f5924f994ad31b661b6d26d0457e1877aaf5099779935c247e7909eee334a5d4e3dc31e898dd1aacc1712c2618e25154d245f327a5eedc11032f4c0e369db0a331eb967483a61ce6dea2243a6fedf3cffa8676db5f4f8b4b460227fb4a5885ae04c1e4786d999efea0c6995b9dceca813f2cd0c4b786dfc8ebd4032aa9c8e698423c42b7eaf4be44d937cae507ac77c39fe0c445f7975df96851bc02110a26b01419a8433c4ed1d37105d5862a1993076b58302f36813b68df243727030e37f29d8c588613230a0b0366c89a7efb05da57c05844741e138b52c89b5a1dcd2913c8f2b4353eabb8e84e55cbe4c28c73b8bf272a24ec288cf273db78014677d3a923681f7d6db9e15ab555ae892eb6028fb79009ae488b6dc104ab8b3d23afda4de48dfde6812ea3f0b871e0969dea408283fb6b2cd53f2b2c8e6b5b4f2016495e92ccd62901f43afac785ee489c79a5cca5380cff2d11d387914b222b16be38c17f96847c05ceaa055608cfb675b16373db742de9257159f04b66a7cffaf7f80acb02ab71782177e65b2ee67b689d69dac2020ccf4f040080d297db00e8a4f3d6e063319ac8bfcd7ab85429d13089ffbf9910491bc76bffe62bac1bc2b56de77e49a8158b2b77a930ff3311957e41cc975f8a6e88193a7c7d0a4a29a03606300bf44f5ddfa628076bb85c9123dd4c87c9ffb5477fb8cc51b822882862b829de486beb4d8504beafbbd8feaa2ef0197fde1b1c2443c2936052f213891b0e8f98070c23779bcb1f2488c69e89153e4480820033974b12342f20cd0ff078c0e3364fd107dcf94f4cc84f38b68f8b0bc6630efe334ce513b8817390d31e5dd2e060d30d049adf8c3349ecb55881861a411feaa98a189c20d08829cdf5008eb950211d1173f7679661f6b8081d048e019dbdc860ba8abeeedf51692641269243c51d167e97e60ad7644f1c98faa45f769ad53fa654c13be7ec0a684b55b09450321fbd57ca9fbb6271c9507af516e80dc36b2c205abc315f5abd59f9ce73575b0149fd40b734cb22035587585ba814def9b16c5f37c56e8935f49ca385671de56e4ec13b4d1e0bb772214437ab0d8dbc16b7965696ff1567ade2f6eb4185b4ef6ec95f571db3110b27dc5538b16c0154421ebe5500b240d0ec94922ca972053171eaa3a3970a9e5cbcc7c052ea1976b7c69ed2b939ec54338bdd6ec36b10f3cd80982438bff9d2a222fde8d9f3a3b8731a32f551a22ebc7dd51892b62d016c32b090080624dcb0cc3d0844435af1c72eba586d820af65dc86f052529c39f9662b3fc8d1a56339d4af2f987b8eec0161f7625bdd4d78af3f96dc502c13ea40ae54fcad9f824b979612b96cc41b1b98dff36de89f0b633510c8010359a4f571c35070d8a7a6ec29235ce7d5da12647671d7bbd73f5a68fb7b063cd5fd7e852f27938811bad56b2b2b9b028e47917546d38431e4f74a1cb987bbc2ed5b05a4e48dcf0656f90d68628db53fba3d984405474784c63b2821e9a14b49877d0b7a846adff6b8275bd751d6494e3ec291588166e5f86e2e4a024c56133942e4f6a0d6f226fe1cbcb5948f0dc6dd2c4deb10c2899190b0e2fb64d5760c2ef46f9a6bbea270f75941be3f3974ecdecccb1c0f2d5de294522546f1330e09749d26ecb849ddf08ce198230e54c66fe461a548e0889eb6b7dc8f1a16770c1ad8d85f37bd16f504f7627e384b77da94457889de061c80a1c297955cd330ce635a836c9dce7f56e8fc94f0c978e699649fe842e651006286e66397fc3e3b2948abf9dc64ea30f162dd467e467ba010e60489a47d409814e066ea801a8ea0adea835930136b6783bbd0b355ed26305da5b9ee0d2fdcdd0007a6955d8a994d0a94a9e33f234bae8caf27084a02d7c4ae308109a72a1e932973f0227d3f06ec1322fd9fcddc989a73c4790daef0ead994a562acb83036303040b9ccca90c622ed90c8d9875605d61190fc8cba7a0a671fbc6ddee4105e8b6cbbd1f09cc6dbc7dd020953d75426b42997f60172a023e23d556983564a6103b41b7ab80fc7c57a0cda1e54fd9a122de123b209999249c3e401742cb31127d421d4d51fd61ad9a905fb6baec9805d765118f77157248fb3a7a55370d985009e5516d0d", "", 0, -2124061690, 1537743641, "b0a2cb826ff470ab318323d8893923cd11f668c665cac189d72a140c41c45e84"], + ["030000807082c40302521fe8234fd6afba095ded5ef50674f7db4f2b67092e7c04e8d99d6131b1847700000000036a6365ffffffff987e3a6ba274d19a5b90366232564aa92fdab754104a838f5574ca40e9bcef0802000000025100e187b79903845feb030000000008acac526aac536a531386980500000000046a536353eeac3a0300000000055151ac5365f83e795e0000000002fc74560300000000000000000000000047626105db7260710929365c1327e4aa18490b32c382e525e4f3d841d18cd9fe840e92d927cf30bb5f50298eac4ae74e8ef39db3bc473ab0f06e4fdf98bcf18f3a8547ac1f5a9a1b58042e6401492235669b77b6d9563a1d5952d6884a92e90f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083786673370671dca103248a3d86fc698fde2ecb207bb203d09b6f75a06a07d1f495b07ec2a9a9cbd4033efbab8577d8b1518f233c6cd01ba96ef383bf1b93ea2738e3e7cb8f93784693fc404cfa0b65488965eaec2421902ef8e8a6a7446a0fb5cac6f59d4a3e392b2bdabdf297f52f59d10face5c526d9c164a23a4adfb3aa0305ae0b7157fc333eae618e7575812bf713e8c0c135d275b212cc0336c9972d9302182bfc1c9532e3ff367eb1c9986e993ee019d3085dbce7cccee783f3b6433d040b0699e0e799870b879efbd709e9e53cf139188d59ab6081c2c68128c2a7fc4185fd7eb91fb0143288323cc0048eb107a51075a54e22568c468c3ba1c4223c32d803051a23d187fa079fb726f34d42430407fb1237c5c53fc422b8f3e76736ba43cf022cb854bf5478367e65fba257a483939724157213f04f129103e936f00bd92c79021f624f1aa0e847f45cbc75adecb656e83e8f1f19c43bdf07fda73b524f6a2ffe02075401be8ddf0040a78d9e46abc8955ef27f0fb8bf8a1c6d9da5a7c767fd8278022cf76c96ac062a0662c78a28393775dd312261daff7761fc882c59ef8d6ea7d6727c8160fb826eea8f1af996f7a78a2b0f3709c35dd8d9fc98a9222131b779bf7147832abf6afe77006919f57eeb7d8503cc53bebc1df909d15f4d72614b9e5f3d8cde95d517e35232c5da02ebdc491c4ee7dd82ec0d437229c33824b6a66e37c4fc6ba66922eae6f22199b7da1e7817c6506a5439fc00433f53b2610f72523621fc9803326cb9da1612a6582697575eec0c3eba5f17c41241391db0acee862218c5e6d7e2fa3850b07ed3dea295359a17c7a09d19d0eb871d6693001321b0a49a276ce82470786a0ea33d33306e62b8a98515833d1a0aaa3916f9372e31ac72b6650f14149f893335e26629589e462fbea0780a12bc82def7d7f614d7ce530770dadf4c97f08c5f479ee250a4e0070b3b4769a5bf2ba96f7aa40ea94767107575d9c85c52fd5ae4d4fbca90cf0997e72822337cfddde1dc77dd8572ca1805d3263bc8cc9b7b794b673cc1f26e991881e916278463b6730693cd307b421cb6b78790ef7307563fa3845c0482acb7f8f216da7dcf2b81b6cd8121206187af2709e8ef1aec86b93a365043814a191f5cf41b3135d9add23417bda408c754f56c825d17eb06b34e88d2d183ada5e50e57fd8e6f161a62a57a2bff9e7b3fd04e3104f7b9c68a6799ef4842f62b8db8bfeebff77fb5571dfce70537f881e111465801923b5370100ee18d373a82fe143ccdd9efff631e6f1908d2d5dac517f4616e70fcfc2698de525005278a1a33bc6da800cc75fcc125a86d877ec78b775a4007dac891be888be7d8d3d4e5a4c3ceb5840fb9a3160258a2bd1ecc71aaf1fcfae76c28f07e66d43d455eb069b4948f49a8e462702eb1897cb13fd06bfccbd88bf1f52f1efe92d1d2a00eeb2f7e3b975e2ef5cf27f5228845c949f234f7319e1bfd6f8e4f75ba17b367a7b09dafc2645a566a57373173d4e9f390c3c78b449af23b49e657adb74d6cace7b88d1b1db1154792bb2e0d7ca034a19ca8e2d5f4960240a94c7590925ca5469181f77aa453fd454fd40d65c3044248a375a4b82778e9663fd6096ae9d337e7032f4ac26085a4b502f9c3c2b2832eb6ca48984a9a3b219166a77ab7af4a4625ba44a8c1ac3cc8c9c42459bfdb50116fe20140997b35c9ac7da5ca41070b66cab17c3702348ad7501d914ad074b682018906c6c73be0136e18cc766e8e5c6c608a332dc1e41514d71ae1cbc8babb28c692d53591f729f058e8835d54901f846b81ccb42b8fa73492e05a903c968b4f935943cb88d579a68ec34e6299a2a93d335d5bc138e9aa134b9176f42ad0ce09a882752d567e1ecbc970cf5356db98a9910747cf1ff361cbcb6b30d8aaab77f506e541b3785270d2df331a20b1cd9cb9ada83d9b77b9e5eb4fe6164260e1ff10f07b49979a77beb90c827a1bb15fc29d82922e1155c292f747958b052a73f5f88330e37f597364b74ff46c8550672d6c4b8eb0b6f1f1d0eed3c24fb8cce9ab84078c182795f2656889b29fe45d7d068cd2b5fa7c774dc16ecc748478ac9d7d5d154fdee08d91875d43d1ef808b34714d09892c58de37497bca76ba5948f454d0238f30022705a530a5244202329e0d1fc671cd1c5587ec6eb3c43689209a1e8ed7f09eeac29ee5833c6a885497679cd2430f1c9d605a5b735745e58c8a3eec0209db0d663e0d3f2b0efb5b43796dec3d0615f5f8bb6246ec69fdc8de000000000000000040edd203000000001b54718297458119c433590aa9cfcafc1cb8dc5f36fb3726084fec50b35be1190d54a2cb8a5c291669e4274c098004d78cfb349231cfa2ad7bdd92c5adc989c4765969b11c5440d501ebd2a58610710db2c4c41ab3f35cd122e0b012c5cbf0230000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038c0858916dc989c657de8b0132603ef5d143784808f21ffb7c0f14c3943aaaf99347dcbe1866532389a3084d5ca436a4325c67119e40f71e123d582898a2f1295e52975d84e05a8ffc7bface62517e88908e3f87ad051d1299ead4071b8c9c131bdf9868adde98dc7acac9aee9ca90cfce09e742a7e0ee65f0dff4eba63b2ae020be37238772aef64f487984a836994777290d93f2b17393cd076156ccb832458031b117cba1dfe51c82b1a35e79fe1ee6b5653de42b17b881213e11594569d45440b017cca85f88b6a8247e94c0a9342eb2468bebf5f5fd807d09e0e7563191a00c22e8e3f4f833e615606596110c66e5bd387913351643584fd303dbaac03a8a8a6030c619f75b71300af30dde0e767ed7c29a96a45cb83abb2579f3f3b759228a5910210b651c5173a0b4137b1971d918b6e2c2a3f327f8ebfc9e9b517cac9158e0788031b5c790a318e3ea27f21cfe15974415b060de36e9a695657d3f027b0068873a40320316c0e6773a7d65406149c58325311d9b3619d096e71ed1b6fa75419e07e19032af7c9e1ba456d9e80c40b414df5ae7fd95f8fe105dd38fc5c21316d8e26af33228bb4c588a88b924fed54935c69b3a5e8ac2467865a28b69b312af03d576ff2ab1d825f80ba268d2313f64cb450339fa8a8005ee584e9f353abf3469d9cf235b84c80502c6015da3edd9d5597d79714eb4f40ec5e6294a0cc6d677b302d0734dad4ae63a08db6566cdc4f9b21ab9ba394f2af08afc206a646cf21484d0c02ec39ed5baa5f3bfa88d4b270e3ef81575fc413dae1f552d2aa9b36ca5ee226e1c9541e68a3f72ad5a86998345bcb212fd937a157099d11d89aade8b73137905e6699670847d3cde0eb7dcc553cd54185efa5c22e70f892c48114ff206812492a64f72f62b1f4aa44d401821f6f4ca67ac775796ff38ebe1a222315d0a4ae89523a441503a99f3f1324a54c436d8a4afbe22633127ec82951e79c2c293896cc666c0df1568042d9743dcd8b783174b5e76f0f150229d468225d92ead0c11e492d9e97d0d37e1b80ae4d647035b6141b979dfefd0e8974d25ca5d39a5eb174a58361c420d1932188c6ec6af98a4e933b3171ce9b52f405011b8b46a001fd8851dbf0ecf20a483249c169e20ad447a80fce6e4474c24f96fb8a2b479a80bd807d44655215ee55fea29f452e0c33fffa1181a0d7937cbe0baa9afc2e829fe6eb38fdb5151cb97ccc4af513980edf76a67c9964bf646e0a30c43de4a4d6cafe95fbc304e6dc48a5f98f0dee3f4a5b0ebbfd782ffd2583281698f79bd685feab4f6015643361fdd20fdb423da56d161d419307f0c74899ba766fbda84fc0d93ee198203de74438fdce38f015b180092167c6da72839ee68bae318b787a972011cd899cef609c3a4fda2cd7da91f90fd657be764b15bc1b7e3425b574b21055bf72737771dd52c810a84451f4bbdecd13128a1ae9d05cabcdd44c01985f1ff356fb8a074ebfbc7c21fd47a6a907ba3682dc89f60e640e201aeca043d5f50bd454c5b58ec493b835cfa54156ae2d0c07847f3ec2147a7bedbfe3cfc41771f3b67e025b5eed7dcb615205180af8203001ff2c2e8ad930ef490773b1e85afb91db385b23186b604d54e34b7c2f61c8ba7e6664bc35d69922710c11b6b6751329bf410b6b8e9c971e6ac977f203487689b841b4f2532d90a9223739c0e3f9f74c628a00085bc741c582f9e8f2250e9ecb8b383f06586b59a9786149ff05d2ad4240f4a4f9395c4280d6584c68dfd52c038251452daba750941f9e8f07d1e72a34ecfd210f2e08b0af7eac9ff15dbdef843c20730e4ce7310c68ea2d58a9972fe55857cb5669c240c1b3316c360ec85ecffd4878539e3f94a464541ec94fbe3a00ee63b2a9eb00fa13cb0d9e1d2b32769ea743eba522a44f25c23dede244a55a6abe48ef8605248c5f06821dfb3afc99508526536437c0a79c490bfadee0b2ef99830b75333c212c90e477ec99c1b54707d53cf3b704844bb995ff24267f655e270f7b4698f4b64c33ee3d441b4ba329266a0fe7d5ff3fc34a5cb948fe6f9898ddbc684a66f7563c7b4388dd82cc8100de5e87f2f1b8f2731c59b3decc1b389af3f9f0578db1fd50c620dedcf845820a959f80d2a75f94a2276671603683d8af218fdbc0fb0e7cf5b8bf6d1d2c2b98284ef3951ac5d701d554b29252d9dfb11b3bce684d701270326c8b2afc7c412894a81f9953669cc0b0bd245907d439c5fc00b94597faf1a9e7c832abae74d07a5b5567387fa857d4055d1e5d3462acf0059f671196bcef827d41b9f00fd29909652678ec426ce0cdbd3894bac61c9232150c88714d8995736ed357d7c6de1c8f8feb4afcb1b3cc4dc689a419e219825973ff1a6703344f1b09d7af6552de529e891af24ad520672de40e", "526a0051536a", 0, -319181006, 0, "253402974f846e0e2f7ade55b3f098ea2b2bf5b410c2ca754fe9e7c4b35879f8"], + ["030000807082c403011186e9f4385c0e2c03d8f4aa44397a0abb32b202b16aafc551533d4ac8da3d1900000000066a635253ac63dd4e3a8b0195f05403000000000400636a52000000009f55f9340300000000000000007c0bb60200000000ab96be23e57cb264c7fd82566ecfbbcd74ac6bdcb9e74c0682e535e3e1e7923dc7a2de6a80a02d37f49c897d207cd6000281595ed5bb16cb41e40072aa4ff5dc5e2c57f5da1530af1cbf8e488e013871bf508efc4cb4a3a85a7e1edefc9b1fe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d0802754f53957cf1441576100116af809417ecb3499d35c1d50044f810123991a1d156f9a234410970c2a63a59d3ba9c40ae50b3c71dd0efc21c2756c7f54ab95b6b504d9fa93f7cde34520717f088d51acbeab8edd26a17c37296088315e3332a6de09e29fe354a0efa6e294f16c4de6c6f1434b70583429add0aae1b194b5032d6b2374e5ec097f16d8861be367fd63890ebc9c5484adf7a91a1351d3bca1bd022be4648299618e4d32078b08441b57e1d70d6b7ffbb06e79015431f32f76e5b90a0491302bd8adb475527349727e4329d166dd0b5a25dacda74a6f108e85c4bc7a4cb8cf99bd9a6fbb0d282914f6efe7c5b829895e84669cd72fd30fd6531dba520305235f0e320b5d824e0c05a856beff8bfe18bf91b2c823e1703120c3e757a85b031edef9ccf8178845cda9b0437923d1cd54217596616bb5ad0db750375d80a6c40200d3460e858d75767b34d6db24826bbdf757025f765bff42ab665a3cd4799786020061eadd6faa852c9e29533d4cde95107e300994d10634bde3494b998746d23f032837fa0c547d1e2938870bc4303fa6c0f471e5f79f3cd15bc631ad3dfc1c2880556d5d23cb1eef450b11aad832272b507c4561440abbaadef968f3aa97833fe6b0660cb6489b9ccac4ab37e96ef34a5d0697559d0ae5eaaa1187bc586c87a2a0e347437e0c1fe8669d1103063bc3f97796f5c2d3478d90cc654de5971df201e2d6b8cf6ccdf6b6a0722dd66bbe706987b07ac991847137bd79571e8a67ec8448c86f76085eae8f80300985dbb68e772e52835f0f5c6edce7f146a3b956b7401f4499ed6da38a80d4664575e9dc1b19b8c3bdfa3c4a2dc7b119ec264276283c2387bd2808979042902b48e921ffcabce63a76256abb5019edaeefc1207e89a77d275953fdd4d86c1c63c290c9b007da2c4c7943a4b94be9c9b9e44aa8af3f37d6516142375350095cda362e19fc4b20e83880759d8b7caa8c7b0664f8ff913b1d468359e4435a44a7a767878357870c5ab2c14cd3e1b7b0f8ed8eaad9e13524dae1cb5fab2bdba3f3b5f38fb3b6dad9c4aa3c766649ac5d528ac2d28a0f47b31313e865fcbee4134a11f75559e5d8442b1fdf98647d56a2755b901631b484ccef4d229851b3c2bccb560d2843854aff7a98db3894111f44aa391e8592f244755ca27eb2300e23f80310f0b5afb0c80d4ebbdc951c10985682b786298bb31b6a26a4bbc52ea31ce8a5a401595ad2a74a85bf5b3f0229c965003b87ef1586a42585c71b9301509572df1a2cb494089c67f75c0965d6d7a6c5355d1ecece256aa3648ebd7b7df7aea129af08158dacdf1c8b9fe46a4ccdea60cbf0ba4424961eb7543d162dde961ab7a61763a17be12b5de7619c825cc670e64fe80a6934ba6f2ba60f7a0c08f0a3f2401b5f98f824b9beaaa4eeeba555c312e7c0a0b5d6c4fe039f5cdd1243af938ae14b86125f07360ccf70e85a4706e7c7379677ac308251a58e00af4ba789675e851223affcbc0182807c0fa298efca0e71bd2aa97c6e052a23d58072b7f05758fcfe80a4759c832dcd43b52c95b278d918441a7ec76e1d208b5f73a0050c2eba73114484d3ef207a5c72386651e06d655ebee502318db880e1c61faee371d298a3843424b287a643bbb70d70f35dab1a3de2f0f27c7a4e6a30b515fd26e2295a30761d178620085d9d241bc5018ef00fb39c4362c89d523e675f3f0148cd651198f681b9b4547cb2afb1235282e80dec2a4cd1953ab79b27f57fda69f085384f67606c716fe4c9b227b9020b38993b5378ebddca13872da8f362d4b13d003eae14396f6a9efd0e8424558219e34b74a6bfcb79af10477b4586e684113e4dd3eb2a12d71438ac198c207102e3c6452a17888f6d1088e8ff3556ab8bcecbe3ff23fa1c2239ed6ad55b31b65574b99e1f79b70abdcc266fb126e3611b8d7d200fc23dbdebc2af350c64892984a66472a2432195e87c92294fb0c334ec5f35ca4c7a2a05e229c343ad505c3c06dd09313540271d84019f1ad55a64993b17c9f4aaceec733cf0a0ffe6a0b8dab863c7ce9b0237455e29b4bd37346d7d4f1c22b90c7463c3e7253f3f30fbea8f89be63642a42b7367a6b2516b407a6d740f45811dfd5a693eef28d8414911d536d81255f5d38cab15cf561d1093ee21ce007695300021729abe9cafb3a37c96e31c02693801a76860c6cf58fea62052a6f5de220e9392e5fab463351dfac1809fc6e6bcde57c363ea3b6eb53002f9facc7637083bbcedcf7da0e66ba37d706cb1b58114f0500000000000000000000000025092581360946d024da422cf7519ca72c6c9c14ab7cb18487e3644c3045b6ce8979a9501fd1814eb4522a904e9f8a6d3bdd3145b6b7da1a548e0360913385a99a3526e915f6ab59d314fb64bcc1125e0ca89466b5b651425c008ae96b95ac2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e415e8bab4dad4d1c3126c1d6b440d6bff8602c3cda0c13bf42b108c8126724b9cb23fa8ded423883108cf70a3bb43495b0a4ec3430a6dbb7cd610246bba8a4475a524d4c8a226ec44bc1f325bbbf26b9542820b42c6c7409566c28fdbed07379cbcc9252ab19cbc6d4bc089867684d5e4edc81c28cab119b89467fe8d2e4c12032ff06dc1ccb8918418e340292993981829af6453faeba5588606927faf5a2965030de41a3eb824982988ac0ea8e2ba9858609af301795e9968fce47eb9d98d8c180a02b3d47dfb81e105dfc1512ef59f5562290ac31da01a5b530bbe62470c2dad64496ff7b2a13b42402a1fd08528c349f90ce61b4bbb43aba89d1d2adf3f45472c03294089411fcc463535f1e48fb3100201d75f5a765e117206a8f831975e0d471802077ac00c5dc219e533fb00d376ff61e3de4ec0d2873fbf80c61438e2fa852b2f031e699b39bb7e90f47a1925d5fdd52b6f1003de0d42c88e43745d823ff36f44a80325cacf83ceb647e3ca145f2f9f409df173e0d549b7c93bf4c69b688761bbb89f031f57c81b7616c012f59bd5b437c888f42cddecac7dacb43b883f14d5982c995fecf15b76e4514cc8a4e63bcc79768aea2a74d4dc626dc492b9215438161d4430621dad52d0e4b1da42df458f034994915c15f2be6fc8403943bc32bc96b9d5b16ca7327db944115d6922ffdf6bf9359ae2fc64e1850a03a6e17cd2d67266a1e393c1fabb2af4deecdf77fcdf0ca196cd3864850626eda896a3aa16700a3001a0c50e05dd94f144d240eb0de6b47016875b5aaee5e86356cd2fd085235b4dfc5b940297089e0d38663e02fce7afdb789d261f3dba4e382248de001e53f57f04a3c82bb311fa098894b37c864d431e8de8dd672427637a8166df0e9dde9a7f1ef53083d1937be0ca530a3b5368644213d5650eab07dd7617012aebdcd763cb8f8895d358a091eaebc18fd121b90593aa9c1d8cc07db11c7d863acfb80759b200609f795a5bb522c34851b9cbf6d2fa734b6153cd3ba8021124f75229a3857241704e30797ada96e8ad8ee8358cce6be05b8baa7aced2dc3242b89409c4943e5694ca9d0d17dd704bf4a5f03cb6d35433329dedbab755376a490ebd419b18d30d1c70da37df86c95ba0cc577f6f2a27ddf87447e28ac28866afdcef79bab6911e8284612605bb8583e8ac6d21d0ad289bd59b91e30cb3d64b8fbbb347b31d67d0a4d53d40076ff383d0263f252078a552ef38d4099cf4a9be91c77f805aa1772f0c42086a711d23f762ab4bba9571cfa425f50340650ae22959dfa15b1bfa5839a53c685b663ef8255e9caceb1649c63512957202996f8c0a645db58ed462b8ba25ed8eadc2a0a095a281ce7e0d1878d64fac9fc8d8570c92867dd18ec92e9191b6f18493b630eb400de80167f8d23cec4cfa4d9c5ec13e7e1eff1e7c0766be3399af5233db80fa8938466388471ef032c712d0ee31b027fe6b97f5a31cd312f2e70f50a69d73d94911a87e4b45814257943a624df18f1150113339275d03a78b1d3c61c38da6b52309af22969c36dc3d484add56ef6666115e0a579db395765071866d4b7fe6f1990ec18a1919a3b91722412024677483d8c55a7dcca1918293026b2afec88adac570b2b9ed7a8c8fe8d0662efedaf9926b94cc2efc1e14ff98d6d1f41e0eca2b369adf46f126b682e8f15fccd8fb2ed2a4d201f01d67c9d718ebd1bbae15d9c73084d6872528be2b7a9d6dd7fdfcedd486fdd163026db0a22b86c26b0d7b598c90c6dc85c61bbf241c5519eb095244282ddf97749bbe4b708e57f91cb80eee2f2626dc866a40adec60662aab278f3a4bb284d3c41c730ad4d5a3f5722eb10fe18112739baff5f136cbd7ea1c975af3b0b45602fa3c00791cd89c26589726403c8f225b854fca3cd0c3c3622fd3bace2735317c7204db6667ac5206bc05d446d0dade8f7d8a24dc6c5b50979584568e080ac1fa47204d4af55f80316b20cc14ae7ea494ff7b7c0e6ba7b8835d06a04fd54f079165019dbfcb8e41b8383c31f5c0fa7567011e37620b292b16e6eccb1d95bb77ba93532c7bfdf1bd5a55f8168c495bdd9a4984794de55fc6240a76cb21674efedc79b89629509efa7a1fc8e0d6f42def0981d434747f3ac9b0bbf638c4eed4ba130200a90868fab28f6df0e124aacf8d2bd2d693a08db725b2a5217d7187de8bd72fa6e5017b743e466fe51a0cce9054e4897acc34f559eec7b3bdde8c2a28e8cc3311e46113207912280049c4edc6ef54d3e5551e8820a17b680c7ac403000000000000000000000000b6901f6bdd72a5674247b6351edb6a884ad7ea26a326e71e6a0b7f4b5b8bf88a34f052b11d2cf30c023c3189f28542453a2046f104edb7cea92dbc7e438b5d2c0a2becd5b064181568b65b227473f09f318da5f0bcdf5b6a65ae2a976a9ff3fd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000865d553fedfa2ee74982e213040ed01856062d02035a66489932eca514a00715d3bc42bb133404d8469e7b2ce8218f1cf7d34d1a1474e49bbb1d025885e43e6c070e73fbb22f2ccdd4278989eb62af41d94c16d85ed2c521d7651fda5ca5a79dd551b32b03034c37a2d95367993f7e71e9e1ea7f797cd67af0969cd865756421032e9825b71b1aafeed123a7c47f8fc49af400c4abdfb07049bee5dbd263f8740c0301a9638f4ad8b191b2aff32672ba41a5033b32dcb68403aba89fdda8302a4de20a010168be1f07a2076c0f2c6e13df51b949d63d5406e8a305054f3e9d4bef17f7ceba8e3a958469f0a9da610977c1f98b29dac2c06f38f05abe0f05faf0fdc19d03091bbfbe7a0574e87927421d542b620c9cbfcdc297edf9788fd15d0282e8cdaf0315977f8337deb0ea46fb2af0d9e8e4eb13b7df4080fef38d670fe7cffeb95d7403293a6c43c2f8d900aa77fbb9bd5a62bf7e62503f77c2d279929f0270bb5c28cb02010e7d4df276d38e231897c6ede6dbedb196ad95cfb8f7772302b455c886e98e032b9effa2e72ca86c60ce99588d4dc39925f9bba40d7ea86a634880bc27123c5105f437a5b94dd1352d4f6603664c1eede86a0ad1e7c7db77e73e2eb89241b782b8daae63658ff05e9b7f64cc9c862aaf60b929b12eebe32bedefdff8e938da303fb1176b4cfe1e94d8743835d1a3c5b61a281758e18ff53b90a91e4eabb7173be4697cdb31827356f05a5398aba672a5c479824c9cd90ad8dc24a89ac800f9b8a979bebf4dfdc58182da428a47a1bf65942edca12cac05bde76fdfe130818df402f362adcc0b4847dfedbfa8c1f57dc3be77361786b38d45566aaa862fcae21dcade338572a133bc827e9f3b1ff42ad94fd982fc710b32d48f35f5555992013ac91506e044808f4d3f78d82986eb3e6db91511e58ff8490c6ae9fd27f33fd682386e5e20e8662be0bf692940a799eaaad411b7f30e3f0cef5d62d52577405999ce33236ca54ae46a9d749ce927a44b693b96ef52ba1ee462054bf0866f953fc2f37ae4430c18bbc4d8154784f9faa7cabaa9f158e3adb0e26e27b781a94970fe56e2e8bb18764f42f7691c2ddbf5dcccc224b22669fd87fc64b491e225126675b03243ab9ddf565eb9d3d15a989ffa5b56ca5b603edafd5efb0e8d5e612da8b826bca2c2db43901c0c13c490955cb91b5baa1a49810b5fbcd600f13a03d45cb8303eaa4dceb45eae278567d81bd85ae82cdd727a68e1b79a4d1f5f87188c850546730151e351a2ef238c7d38ac98e1d998412d0186b6970648e54ccf8fa3b5c1dce0dc05a4b1afcce69d24abe17b995e5527fdde2c0894496448259e6ead0419729a6399ddeaed0d6a06c8b46ea7cfd60010221965fef027cdb62315e36d339aad6df9ba20a3d64a3fcda22dbcc92a58afd3e087a59922eb8e7e46915854950d446f5b4f24f8c0b8c041fe0cc4e3b119a8287fc7cefb1ec8365c3c872e12c1f490d85c71b77c14427b9e4baba088ecd6d39eb49fddd2247d301fbf1fcebe575807917b8f5df184d8ce35173b8b775c1cdd8fcae53e410a070713521ee3a8873a30d193115b8fea0664d11d34bae418fe62e32430e3c82ffeebdcced610d9d196f84543b757fbd775bc526b4afca2654b0297289b7d0a32425bad4ba0076d52d47c942007d2f128061ca97aa90a529160c675febadbb1a27dbc86785b1480405fde139bce42b7eedf9bc99fa3b1574eab21ae09b7f214f28f2ea07430e22148195353ead1b9c3cd365d2a8ed8ac5a11213667fa0dde6f128512d1630ebba1d9ef200141b58b6116d8b2b9bacc2f386522e950cd604bf2ba418fa7bb23f8420a219e1de1630ac506bf9bf77db5de1bc97597617989735f1cdd1fa6915bf39bc567b88159593a8809eb514f121a9cef2442c6697a064774378f4a1b09b4e7fd91fd304b2e04286d7687335bba04eeaa4e97ac2306c7b15a38718383e978d3362346ef7f79753cd823a9e6c3cd48ae2f15c625b296771a44c1c9a7a22432ad9ca7311292339240bbb32c3e663a3a476235c9306a09596a058abc8f832eeea3d4c629d9a92dd4874c80ec50b647178c204b8dec9602df92374c0a34db73f9f8d4b72e32631f50ae16409af213cd134edc0859ac8a1e922f3f5b20985799deef72288cf5bae32fc3cad6cab5f4c685606fae7a92f9a19d073c09261f746af1415551360a0e4fac9f8fbb4142959ba9f68915ca95ea9dc1dd7ccc5611df50b1db0e9494bb45c35f131e51d9ba6994c6c9caf8002484ad3a10a70edcebd5c4ac19a236595d7b2ebdcd81ff48d9a44faaf5236d3e07fefc7ee584f25441c2625703ffb92623f166061ea33bce831aa25f1eeaa11afe8f22e46e016277c3255dec5ce1dffa222c963c704d206314ec352d300ab86a380e", "536aac53510000", 0, -648092853, 1537743641, "8a3fa820155432447a5894adbab1c2abe225999a69a170ee4c1c8effbde6eeca"], + ["d73a73440227c7ee5b509f3e4d765377c515d99b267461f0ee2431b0ac394b1e714136d93201000000016affffffff0761b45b262eed02662d576d2e482e1990a0f1bbb8e461618a1fa0854715a6660300000009526551536a53526a00dae24c150295c38a000000000008ac6a52ac5200536a3f26f304000000000751536a6a6a516a0000000000", "6553006a6351ac5151", 1, 1931441140, 1537743641, "ccbfdcca0f1e9aaed9dfc6bb7b0d96adae473dbe36327f2cc5cb91aeaf63c77c"], + ["296207180227c23ef84e5e6f47c45bff8841510e64155936cefe4084dfd693487e3519447400000000036553acffffffffe0b1914a90e90ef62628b15cc14835131197152c5e927104f5b75ce377a7c9c40300000006526a52ac52526d3cd466014a70a602000000000665ac6a6a520000000000010000000000000000900ce3030000000074b9b692b7c50159467771184aa8085902f143b64880825ec478ec086d6a509b16ccea1a8039636a234c82bb6d3e75f2a3264b2bab735768dc27209d09f1d997e9b8b2a968d58da46ffa36500b3383a1c226ea3cd3abd04248452709c872ba87000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004dc59c7b9485662f62d7c961e62fd3400f25c52e8680c920d8acb33a91d85d93c288cc7edac2bb28fdc3ddde9c05650effa380478b9c35e5e7bb584a0526a2f97f24f4cb6f50af9c147bd48353964de218d3804ef1f62ff78a7f8cd8e0a5ce05dd9e37be71cda665debd2aa11aa749904a05a9b46632c1a1f1b922ac10fe356c020437a7cf91243959d22ef455c23ea54c2b52a64ddb0305248a66f8a4193460d4022553399ca089185f7050a22c19a6a230ec721a5126d6aa5ad4c5b019d079476b0b06bd36da68c6d1ac9eb92f5f0d50d31a6fecf77bfb6846e0e9119316b98ce58729d9c3435d9220ffc460102bb70d14df4444dae2bf1ffdf3d946ee458a375ec40330076f4b8f4f8865960289cdc26da59e5e501e2f862207350e807fcd27bbf8c7030e1a79b16ce177bddf9127f1ad974228ea47a552479a52cf2b3758a2798ed974020fb22c1ec2bde9817f3cc19e67d26a4934ea6df3a303e74219dfe18bba74c51803195249acdcb2b1c9e139f3f70bd407d627d4c4e0d0dfa2902a6357801eb5acde03044da0e57786567e1792fa6168dbcefc7b282881f3934dd1896d447ccd81b26a00b3c9788bfb941fbb55e557644af45bc29a4d2e7d2bdeb69bdcbea19381565f88af0c99edc8d31541b964910417fc52ea25fab1bf92a3b24e3b7cb4d4ae28c2deeede5df9e0a6b9ae19199d23cb5e2ce789367bf7e041640abc9451412fa743faada54f0ce71ccd11e24a1e5468d1af751e52995557f38a67ba296e42315df54187b2bacb9b3bde73ddea8da00debbf0ce220c7487dce9b8f4aea35ee15e3ab203de3464c85df8531c5977f35cf6f52c425e74f9f39fbe50d2111bd3c497a20fdd10fd7439344866ffcf1f3ffbfbabbe979bc6c6b66bdfaf18d443786a9febe4e2c681e0fee225fc758a966bfd83048e4f441605f8c7f222043ec28c7e6155698ea20caf58fccd84c8ef96051c68e4a375bae11ad239a19f2253ebd3a5234d311e480544f5b0488890f87eef516e0bf183b14487dab4f3ab30b6e13c79cd4150b00de7f49ac7d05d4f073ae926fdaa03c7dd5e9d42166fbff31ae8b2961315e2c5ded04e076e3888028e5b3ae455f4933d5c1e3b37e7151f2176c7742524cd8427e0b51ff7ce5de2b6c58bd18b46c3f363b42d3d7b47f3f5c867572817dd80195fa8a66ec8022b375b2319e1c040f657f923dd106173d0e79aa1ff0ff1d0f2d93fccf68e280cbda1d5fdf3f4622e6442082db188e141c0fe5e0fa1be1566d84d04978dc301fcfc9c05f1ff72b3ccbfe2d30c60bf53c983ebfe6917b9373198109c4d44ef4c2071c2a0b0776b191b8ed028c7657adf21f2a12a7cf3ecc229e07ce387dde301eab624e40aa71e04df015faaad2bdd2cf3ccd33a9832851030c0968d8d5c62b6f6b122d68f961b83d1ed0fa543549323d8ea841cb22df9c2560537cda1772669d0b925a527dd538d359370f0584ede17d1317117255a0d37ba865e6f17877e0411bbbdc8cad9269568a18651217d78eda4a6f109a770efae8899cc99add742335909e4c815e27c228c8764633fbec2c140c81c9dfd596d4fab458bf38df5d7fd83e0abca30b0ba9c0ccc867bdb3d96be1cf55edb64de9a6066de0475286cb7626e552c12966403c5b7c4cc780c81bb8fecfc5dab3a97a55f4e11cf17bacf0186005813fcd5a051de76673dc7ee4d44197023f5e16bb57f62c572bfb9695edfd245325d5a0a0ac654088901e4ed18b0ac1a0cf4f459263eb44aa18c0e05a433e037ca05add8271efac578632ffe1c1fd5b63561bb60673f8b137504b4107e6ac6d2ab7fbe6dc1db741c9621cc71312521f7ff35eb6abe68ea5aeb173f569dad6650478a4e17df9d536f550079d2fcdfe1e12e97de0381080e0b86fb1c504535defd0481cec12a5b9377b6e87d51e92d1f356470ee12d2091374de42800dbfce60a63964102bb8bef4cec041e91a5ec71367ef77931118b8c8bc9ea028c6cc604a92d142e612e44e4deabf5a8d01269bf42f7d04db392be06e5603003900a2c5939d9a10ec3af5490d76f86f642787a8cb722b3bf3c4049f029ed77eb3feba7a5db36e4bda505d6c512650ef0282a362d693ef94240ff1b03f7dc4fc276ad1a61a4670e200047064e1c3634689cc1bf1698a77e9b8d0e3c0df93d9c06fecb6b674297b75b27f8dd30ce3e46f2ea3a52b9fadea047ec5a3f4dc79f3253e19f1f3e480e484318782ca35957fe0bb4a3fc7052bf01653718cca989906603232f73f36c24b570684ae970e89162859ddb34f3d60afa788fd419074d2f36e5fbc587b49e68edae797845ab3d45424e03cf640db85c653c0d0ea1e7b12f96035ddaca8c1674e120a18a7c3ed9ff143e41dc9fe09d1d740ac12e1a8c3dfc5890f939878e10667e00f25b78f5e164a21e0c", "006a", 1, -1478734053, 0, "a7f43ffb50e55aea875252a7a070a907d04b910df0d5bc0fdf5d8c96e60b41e2"], + ["7905c90501984355289909fb3a37fce3829cc85e9fc5c6a59ab9638ff81cebfc1e9a513dac00000000026351ffffffff02cf58e50000000000008933c00300000000086aac6353ac516a6373ab2fea00", "6351", 0, 1517385538, 1537743641, "41866c3a5efe420d2983d42b51df46ca803fb07e2541f86b4360ec868380a267"], + ["f39afd05031448dc49b0135c4c9689b52305b0f10e845cc570349e2142919f40a3c8fd9fc100000000076a636a63ac5352795c4a05e08cdc773a88a192414f5e90726e5fdb880e9c7cc2644377dc196b86856ee89d0000000000ffffffffe770de20d7a70879e45cf0ac36809fbccb71d5ff453a72b02c2136b476c310de0100000006635300ac6351b613d032029c6de1000000000004006351634554ef050000000001510f97ef7f00", "000063", 1, -300882257, 0, "cbd44def51441339a62776d210e621cdc7d8aef1cac25ee5faf570b0f451198f"], + ["030000807082c40303cb608b37bd8893b7e4bc3c9aa79e5c5dd04da135427a4e4ed0013f2565d7dd3001000000035152535405581e765314805d93e36434031254067358f055182daf857361cc5522ac6ade09abba0200000003656351ffffffffcb14872dd22016d1037f7dc334ba26f5512070e23ecab344af3001dbf45283270100000001ac02c19e0602366d77040000000004ac536aac23307505000000000953635152acac5251634bb1150016565e17020000000000000000dc00930500000000611bb2afb3e739d5c3fe845689d4a740572aa192d32eb603c7a76d3f52684ff58f342f5f9c8777e72d3b4159314e8379c9dc77ef2f22cc745de0f6d119b06bf28d1b3ca662e7105fdfc004d1945f0a1c4b79abc10b7094ddeb0d0fd9e0b34edf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ec8d3f1f1a79aa028be80705b8f41123601ce4065fd63c65e10e02f3c6910ff188c255bbfec1d12496ff527ff3ea778d659f704b767997ee34c30910051ec95197f6570a987da1cbd2c4f677526ea2d48e85e8165e5e469179ef6e7bc47155d2ca64c3a0de26643f4fdc132f6c6f93b6e4ffe5d1042d0aeb54dbd25e5841408c021c3979620ea3cd1a8c86952e792dd329f49fcdb2d4faf28dc6aa29b2b37209240225eb2c245382230524b1858a832395c6edb077d3459c12dfccc1538eb462cbbc0a01c13a786dba419ed8fff720ab46795925c445008dd87d76327bdd8b364260c23d7983ed7a39849cddfc3641e5d10b9c5f13d67f50503d07240e46dced38177403251985d716541c956b6330ef87b1b7bbcc4fd5468e807e42ee5c9a3ecf11a79e0310e359f50f50181b880056c1da6fdfd5a05e82df82ab16ec1147c1804a420ada02091879cc7294a3627ca24b8c1544b10e844167e8e340faef5b55a77c6c016e04021c1fabbd1b2b8f214bb6cffa84351c89a0df5b2ce011ad86c8efd680d81552ff0301d95e138072e5f8fa652a7f1284a60fa4278bd424b286bf66189ad465c2050e3fcc686bcaf3d491bf9e32295d4680a600b09f6d157f3310b79756cce1acf9a987bf0e2621827d34d9baa1a4c2ad7f808dc51993bb5fece001f10eded04c35efdebb0e9675785aec7d4da21d38ffcaf0fb7a0b649a6d2161c1c741502e4b092833904bbb7a67408dee1e47b7b101690264768b7cd8b7443a6814e8cfceb45451ef655f446489e9fbfa79e7e5727e1bd1294f88b931153f77e892e75869865dbc053c6295a02b5d053083f2d15f32ac8c0ae5135bf779191aaffd1ce277ec3ff880697a19c122f6880e6614169479233c5cd6aa37e59e95673b9f93787a7030cd3fa9a2ca784b1d6df0ba6334b068081be4576e99e66c38b68db535ec3c2dea910676e88db924efb1dfd8d6f86d4eb3777540f4a857c1e3e399815f06e0f08185b1a2566452adf439fc946a665ece0f5a61c456e056ca887f86b74e494ebb950af2b04489ce664bb4aa9fb4c135591204e15cd04fdb80bfc0132ca1403ea31569682a3194347ed9817499279a910b9777e62a5227cb5d266919a70046938ab8515da7beb2517e32b144674c3a953ab3b64cae2bade39239342ce263f084024d8bc215cda9f520904c807ee02dcfdbadd50ab35fdf20791d41c2b5042f8cfb42a96d33c2ec613e91518b4d772264f1f8f57a9ff0d47e10962037e3116d4d90efd0e5876df8bd5956e1cb034c31fa03231dbc561e66d4e50242577a93b7acc2142eb4d214aca758ebf4a889bca08a80f86db7b73de76eb113b95e50f3ed2e46e0ff344a0ea6f8a82261f95f5be0b0991d231849fc34d056e0cce5f6098372e8ba17b78fb924f2d7b836786b2dfe3a381baf07ba6495253228943b03f5970085ff8df6487b1532f8eb92ce9574a9c4783096240dd794171c490dfb8886b7551cb9a75708b9042c0f26c40769f3578d45d31c993a892058f8964f46b7f9da6b0c2eace39b3d79b6a8605425e52654ea10d0258d9b3959e2e11b48340496d912a8e37c29bda12ae454219ba5b0f983a8546fbf5c435abbc18f4bff30c6d5813b3dd31e1267bd97c0f764c4ff5f3a543549092e90a7724b97390526d3ecae849ac2eff699dfacdb9e204d0311cf1afbe27c17d0f7c303fced47666fb82d128e5404fa842a398d99d875a52183fa5fa9164d1b2876fc04c746c11b1b741d4694b5c9a2d6fdc11ae931c5c2fcc650364116e14e2f8773c84860da3798a446370d183e13c2d493a4f4b21407fc33cf9c73c9e6c4931a732520bb83ebe4d22350d79f21701469fd679f961ba98fb71db674648c322c1e04baa6764a2ba263eef755a9d1bead0379d1127a0cdb6d6f7086e3cf28a147ffb74b3c0a8e896032d961231e44675ac22ea59308cfedb0bc50c7851155bb3421985f0f173c422284398fd71dd4d56b0febd9458f0983abefdec4e92aaf40965a5aafd802d2fdb83b991fc9350c7ba6c2ced624702e20e104e2925989832c101456a40976fc27120ac25f81c8eda854123c064dcdb99155fa726e21e81b80f6de9239e9102fec39f128bff7eb3aebdbdc49d8c929c112c56460ed2d011ff69ffac791b07226e6422ab2b1dd54274afc337f9f0f3f51fedaea4fe93ad22f4470af808134c7bdde77aec666bf253568783d1f93d3dadaef506769a7f8facd7c517ff54d2cc9ce497bab416d85275cc95b67b64e64ebfb8e2b99155584773dc4bf1b920000000000000000eec07f0000000000809b27435c4803e771ad013b31d84ccd238ac4ee81d23242529e7a1f5de78adce852301c750921c8581acde6729237a11507fe5002d3dc152d1e9a803e9a18967e3b2667b8d67e5fa6a1df131a890065dbf0f9fb58f979bd063aab2efc2608db00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f450375fa4f196d853609451cb8adb6a4bfa136418c13b1bfba1f3996e9df8bf6ddf518cca582d44b824289760e8b87e4b3703eab26ae22ed65f6a3b80aa79a4c8bf657683cb0c73c56116bbc9434bea7e88c2d1bca9e9d3de9bf80808949291ebb77624a038ca7a7eb5a5dc9dbc47d57998b5362685bebdf7002c4f6a9e12c4020fcf2d0a1de659cf6d4923873527b4c165369a75d205c294cc57731d6fecfc44020060c599c3cb7ccca1f9decd573e6d5645d668cac0e738d2f34bbdc527280b7e0a0014a31a8c1f04100c0ab01bdf081b6c0802e0c371def10bbcf105a35559907f98ffbdbc0e412396aa510f372b1442de440e4c58b4f80bff491e1a7cec8ea696020513c4fbc61933c90f47cd0fa4a52ce22c92cf142a1fbfc9981a2aadb3826fbe02007d737b7de4b86a0f6e6219b90c25cf46c437a59b174fda8e480e5dea87ab3a032cd5b027f9d23a4ab2f0744bbdc664d906a0c0fa38cc95f85f96634be457122203268300609e34de29f9618c738d77a2d146e3e5b16822619d93f545edc5897f27020db186cd71f78e15dce9295bd1a1bf9669e6b9c2bd22a8c85f8ba6629016e3f3b27b0a4092e1dae75e396647fafdf969fc91c29a28060b35f052f8bde7c1dd4477fa03735a89c68359962e5e530ec3c76abde3575b5334f8309d38a7d7c080a54626e64ed50a85df275c797795fd9ec9aaa595db569f00847375b93c5350abcbe8d3d4c80f77169a10cb33678413628cbda668131373ff6145cbe9697b51e8cbf1de4aa10138f79d94e26ff72c1deeb7aa7de25757e281d527ab6cd007576bca7e337515f0603f30a430b89dee06fde2260a988a624da06d316e1941d657a6a7840b35005daa3576651dc3402af18c745de3fa1f3150c041e7237b81debaa09e087fd8f185a12efa6333b7fc5544b649f1e17a19963a49aebd50394cc851212b2b93b7c267ea58be753fe04440981c2d8a8f047be31d1a889a4325d3883915f0b2a1e46ada5fcd18f1a4127b8e79ff0ccead231f49ab96d656a624b96f1d98f94194dd7626ec91430e4b87d102f05615d4f8823f0e933728c837d23692ba71b61f797ff4cd5ab710c0cdc26fda411b8b4f3d8ee1e6b9abb83ff15e99e54ebc79f17e44283c76632e58c3182931d73f3d3e5edcfba6554b6a0ccae239cda3d11db6ff2912469880f7e7caa6bba893dc3a85460b96022e52c8771f1125e84f9ad94a5b20bad0495ee9e90b5313c32eec83d0a3e5de3e42279e034ed6755943ed6db40132c7f69b48cdb45f9cc4e95f0f81716703a05c65219068c3f938e677a76264cd7d2ffee4bcd897b1d22b499fdc98ff6f8a8d6fb8d2ef81220428a479b90a192c26b76ebbf55e4942cbf00a6fba99292055c3f72d540de7df226e81e9eef1819e1d14dd25861f6d01bf866c0c9e053ac226be76571c6b9cc26d870d84e797aca39577fba3c6c24235c81cbb63433cdcb85fc7cc6a64d15f51edd5a8fadb87515ed17b3f8651e93c4bb1136679134e00cd7694b8a33d4b4277bf14ed417c43db4b62b17febac63d3d78b742a0d1772b3d82e21294f13dc0363f883d66bbf3ef16b3a5042ef2d214f91402e102bac940479c139bb98a6168f2deeef059ee29b8b6b66deb7887f6042431d5b012f01738039df382b466e91761ebb5c349aad9b8c9cb4b397f1c291694f43f0525592c67feef02fc50f686ff11584375e4db3b98386c9f3f51c16f508199985f87964f46a19cb8464141dfb1d095a44a132230c10c0598c8b099238b440c0f277fab619810874e5ffcbf68c7cac36525e76d9c8bd9b0e9d7252a0a11434440a9be19dcad699214606fa9be056f0aa07f42a46076f8090199ecb98c91182328fa873cfd5bc49b3fdd33242b8443e7c5a76054ed849b64c4ea8b13179e1bcb815dbad954efdfb6d8d1ea4bda247cabde1d2d272b235c687f180be88c429f19db93a8794e8cda8447b4160b4f09374f08bfc44419c476a7317e85c49012c488780312671ab212f26d337893c0c32850041c92efc1c65b39c8a8d20687d407c2906740a3ae8431f6aabf3691b674d1cea169ed0c762f7ea8bffbfb0817ebe4f82c325b5bc7abd439a79d66189b383218f00453416cebb43b99382e2d4017f78099ce63e4555409a899798930ec56a73954eb13642cd371953868c1adefcd7a3886afeae35ecf2793dabd11e0cdc38bbf13aceeb57c5c7a246752b484676576f773a1ac6ba59ff7adfde8fb613ec99fe9710fffa9f94cd6cbc4c1353c0a2f2fc658a22a14585822dbcbdfc461b7a3706d136be2a7d76f6c9b3250219c9b85b162c6ebbbd2cef962415daddda4c0232bdb550504c2787ea5edd4d0c04ca4df77cc946c6695b3096eb52531aae774551fda0513b35c1dd94421cb75f9182d7a7315e225520af282e03", "63", 0, -727033431, 0, "a7d3d0b3e51031c1fac4a7a5c5ac9df3eecf2ea00b722c85aeca8886f5b30bd0"], + ["bf4e0d6b01f665aa63cbd26580f6ab673320df8412d6fa5c90c7f19515d3f64dc5031d0024000000000253acffffffff0312105d02000000000765525253536a657d40a5050000000000787b4e020000000008ac5351ac65656a6500000000010000000000000000dd502e020000000057ab7eaa8666ca73fc5c0a0b83c27da1f534f32f46933795a7139737b956b8a37ab23e0099e22437b9ed8c29c002197cfb2b85114f415dcd3c78ac38b17ba0c4ec2d97ed8d28f4bcde733a74fb2052b8274b0480291befc56b59f7e2544e95f5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b13bed1b49347bd3f27d0952c0e774a2bb9b13cd854524eb2d93f0e2e8ee9919c4d67915f878283e6987b48725fcc8112a5f049872d7e79dea3715989ec916623587f33770cd7763f05567d3dbda2f776911e31078ed6d7fd2f32af37088c36d4003471379f5f190b66a904435f5111a3a8639fbfe6c3880d5960d705b7ca4f03099d8061c19a57292452fe072b38473323316847c4bbe70551f202640c7e34b5030ab894f3254aacc40f9e006f3adf9ca4ea21a242be3f663b78f11f1a0d085fa60b0391870df2dff59c741dc3c952cd08947304795bc9313a81eccc1d153c84665a6773b82fc79ebc856a4ecc8e246d85bcfe8a4ff73e63c595bdc7ccc524e592c50318284599dd213ea5b2b475a07f1b1ca6770d930fbe775e2660dfdecf5709f346032123125a622dc270e5c3934199702f3d2d961fee1ae32a163e429d368e855a94032137fb64b9fe07082979182189a64434140b7eb2fe53760adffe6034013d1e7b0228d7f98caa5b3dfe876021de17a9fbdf98e744f9382662b3d8010eaa0716440003097c4f23a05d37cf5fd1c2cb307fc529943d74b3387227364aeb34365824c5f388e59fcec707e35cfff3b2af38f6a74070a8176aef38ea27a7a7d1aa11c92c62edc903e8a7c9e167f9783ddafa8c8e4b2ddaddb9ea196e19299948eb71287acc0b6eff3ef776937183a1fd71f76ea9d4a2f367190224b4a147de2b94ed7e1162e398c475d9033bb23f4ae299d84a181d22f3c17696b9d5b39f2b09a76a19eaf8e2c845d2e88f71aa3476859b3094142feefa18282ac06b838c393f39aa1b53680dcf325436474d40896e30793e642c592a6334ed7ea152014e61e837231cbce5979aeed0f10e18b91ae943f063cdc97e1762bb62bbb5797a586239734fa336e0965c750273c10084dbd0aa45a9bee3c5feb73e83918ce08508429b010e17f2e515b32ec1135008457ee68e1cff494b832aadef8173bc5dd6d1c94233ab37bc0a17d76f2dadb9ce3b253c00eea61317f264ee3995bf17509a537ee20e4aa17f564177c72a0261f6be6b299682755a9fb42e8ec06a025e10ef560c2894a0f4a315677d3155cae3c1cf178cad85f1071b74d138a711f253ab5485e61d15cabad880529a10a5681ef7dc56bf881abc191e867c375ec7b7fe5dfb30c90f3a5f4d958be725e543903d04610c10a54c714fc8770bd77e9a06663d3e2a58a9ff0b6338518d593c227cf82a237b88721efb8ca76b0240e9c0139b1f7cfb3636d0f9d229ec96f0c511c8cde8d724ea1559bc0210c484e8de579739d7973584e321fc632c8c54d48a301cfd29104515ae1f8d764dad5d7f0eb9d7f174cd5530e77ae99d808744b210c06b9e69b8eccf1ada996b3a97d2f8ccd645cd219f9fcd969a560c1c5eb26a2159fe111a535158d9c8ea23036a279fa373c52765f0850360e0cfdc063d98725b5bd2f28c1caf8915b5bcc560340f8930299df5ecd0f7853be0b0cb3d399385f8fde80b634e79048d4a9d64981f8a5b72087ef81f028ca841f1fe87daac8bcc08c13b959ee1e36c3330ddac9eb7cc86663f09252250b2e733bd9cda9138bb279066835790050b345baa9c389f507ba76d7dce6951e32cd22e3de62e832ad0bb5d3f22e7a562333c4713cc132b15e394be944ab8a4e87b7505b2a6b34efdfd63ebd5a948f4b061332e16aba35f46c1a8f1c5ba15041321abf89f4eac10bf17b1d9d8ae345692b027e2934e0462c1898057c22efe4c44a6ec515b7d3b5cf3399275b52b61838ca1c74538ea1eca0165e3665f9005e1cb927355da6e3d21fa93a59fa09b798b8d3032f7e7963d7da28196cf09895bf82d2947230853bbc42e94e294811057aa9dad8e3cc6ecd95c785a19b2ee5496058b8b1d5c181f573bb7ac6e07cbc256786bf2aa791dccaa51d17a5d8269f7f77f6f7c169bb1aab92a20bd31691f7258982881caf074bdd9e3a2029ae651c186a80e32bae99665268f1476d5ffa7fb92db642c686e3ba2bd9a90ba4cdfa241f78bbb856cd389ac5fa7a68c00a9ff3ed27e2f3f7cb079fc1efe70da51dfa9ca3c79b7207c0664aa426941146c825095022d0985a3459a4137c1ee4efdb6141d3957e272bacd48211506e06763e44dd36ac0a271db327e1fdc9af93da7e1626024677b0e3ac251497b72290ac182a58c041179fc5d98521e0c55b2e8e252d05b68b73c54e548c7f2dbf8d83585954d61f08c210dcf439aecc3ff7c76de09de9e611f136c71476eedf09613ff787c21bcea42ce87cc12eb2bcfdcf40fa4888d5805e8e89a7dfcb41d976a9d14d4944fdaa0296db7cf94abb2b1fc8ed3b72d4748418049ba6ef6a8ca955d2b1997d4953230e95679cfe0bc8f9fe96105d7b52cb8c073d0dce0a3c21509a18587fbfc918a0864d746aa3c07e53b83c11706", "", 0, 1887415636, 1537743641, "4d8f41f40b0fe7265bcd1e62c01234e91750ce921bd2b37363c0c951f4a3ebae"], + ["030000807082c40304c4fef4404f9aaf53627051ba20fcb1a1a23aad0d530afddab5fa2f210ce481340000000006515251636552ffffffff261d8c1f07d7c4b6d33356bd289e84270f6f93fc7a776ed9b511438e6ac7b5270200000003515353ffffffff8bf2f50b4e03ba17ef434dc4d9e27bc721cff46a884bc4ab74b97a2f8d65697c00000000025251ffffffffc6d3fc750a9fdd087b4990c9653a0a20a4632a88a3e30aa0812377c7acf1e5a603000000026565a422ae4c029afc87000000000002ac529810cc040000000005516352520056d70ab50000000001c19100000000000000000000000000001e1a1d2af381737447c196a9af4e16062a4ea252005533844e365bef819008337c36fc4fb61af6a148aca0c28e1841253e3031c39688d9ea14a77d10f5959e975dbbbb7fba62987c41ab0794d8f51a3f083fd47148576ed53de1115eefb02c1d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d0bed1df69485a8018f212523d0fab1ccb6d2b4e730324a98b46bb6478ee38313f364cfc16ecbd80e131432f189ce444f457b8e08807e251a4b137a78d2b283a1e5cafff3870c3a5cbf0bcec880932e4ae39d0dca15c1dea001ff30adcc6066852cdcf60032a3ebb4ecf86e7bb563d0907f7b4e4c8afcb336bc3695950cd0b88020d0bd1f7fa6ffaa8664bbc20d8e37f41107f3b85913fa716a0d2f8bfaf30a4dd02090c5386d76db172e49ba9d4a844f7099a51728f3e9c1bed5037840308f3cf8d0a0185d36de26f6f8e26165df719413202e91eb4704ef979d1041c7f5e9ef0889be4f5b3a20250d3717fc740d39a3da4af1bc9a206301c9382d6f91df0a1ff73980300bf1182df2fdda58bd40145c16dafd64136090b47a919701a02d9f77aee558403132f50d5e01542951353d594653b33e20dc3031fcf5b5bdb7a5b3e22f582a73902091c5146736aab285d0347b9dd094d3ae35654283853e4318993e3f1b4785da702219f443891fac1e9732c4ff516da94b065769d8cf16373d0d3bd6ae3fb1725db0227d648b132b6cb22b0d352e250c5eb019c72c64e6f7c7d07631aa273cb32db4ff4b9589753391dc62fe1ca4eb71a251a51896a5ba84d6dd8dc33a31333ac6250525f9e783eebee55b936221a7218391df6bec78f80d1cfe42ff3f8482ed5e7afd95935a1587e728b3470f872af96e9ec76fd450fe5e3fe66585f798ef1bc25ad5bcbaf1caed7969c2ceb17097d71f195f73be806552ab96451ab1cf177a8d2bd4150b9373bf9b57407561f4ff6c38bdfbbc12a735360e73dd3a64f65db11d71bcfaeab3a6d117aceedd4c788790b110ce891330538a5c2cceaa2a43cb0319d602cf6aaac633703e93b8ef56d7cc3c6103a793f8307b392c944f9e3114a551bb88919ffb4c32b259d88e6256f713002174335af6b3753414756c434121da752117f5921f4cac3a3179c2539a6deff50ab8d9945f95a32ba1f2914497ec35e5302d560bbf04f2c6e03639c519a94504e705bf050c4e925ebed7a87e353dacf3585023bb4d8be1e55b0836bd1e57a31820d22f3bdffbaf6897eed0f70ec1cc7014014fb689678928ff5afa2a13c17957bc3eac74749cadd6ccbbd22e2a1e1ce1c6c644df389ffd59484fe41559a903236cc648098465ffba183bb44eb9edce2fd9a4055ae5d698f59ffaba78104e31dad5284744db7b84c081ebe4cf86250a329c0b9cb5a64352b40a7abe6c1955c4fd85c930a495745ed15c90414ee9377065e88d21f97f919d03c975794302c52cf6e21d55ac05e498bcd08d6806514b0e1d18ca789ff942b4b9e2032aaf9160c67643339a3d93743de6a34c4d2f500dde0d14e33a374e432a2e08c4193ac14be01910799bb3fcc296be16231fa0024939193b3466292dc8317c742c1eef150d9c789105ad10170e5f4e15594d92e0151fee193da746dae0efd8d356ceb291c53ade61eab0921c547f9379f6197a20eac68cec1b3a54ff2805b1c626f5b4d53767e53be91c62c3aef3f3aa215719baee724a4c5169659f51863942a6d4e19440722398dfbb67f16f9e54a7a2015ab6f0c1cb1e90e826dc34664bdce5f36ed2b97530795b515af3f833ff95571ae6fa03e50aaae29c94f1809050e286d0c4f70f81c06cb5bfac4712570967bf83f8923e863710f9d6957a02ffba668de86232e87b076b03b3fe0b6f20c8be56801c1cd2290ccf1340c1f2c6a1ef62594fd532b938b405e21afda5145055f852a55ffd6167313d6f8b908dd26861f6bfcad224116ca78377f43d69314733ecbb43555b8aa202ef03b9cbb496269ab8df969f889eab49c73ac3ff945b4d33446bdd6533d6d93405e5304d53e022e0f8edd1b38ebc6bf3d4aac148db709fc600e4fe23e29e1281bdd15d94ed9223d410a9f409cd8ffcc8302284b4713c267897cdd12c8f20dd36e9a9d9ea5e7fd9bbe643d86d0a6bbf6c965f3be944d5c75f1295e98ef71312a7a15f6128ead6f0d8b969fe7ff916f375431dbab9a6f0ac63c85ee08acabccabd1981a89feb56183f308c92db83ce9ca27b14fad66e994f08aa6909242f6b5d385dbbcbb25c5bde7ab518665f87fa8f1f22c9057612653a5172ea796a5b2544244728826b24088528d848b888e392a450d1cdf42b99c2e3a0dc641330df339538a1ac47334a20e07fa2fe7fa8af515be4bb7ca716e8bdff2724fd03f5a57a665febae50e90aa20b8fb589cc2d54ee8d103a461284b6dc1f749d02137ebd30da6e5d586b2b537eaa4b1b358215c8bea72d3d78dfb5843119516d6fd2d8594c1643db939ec048dbb25d0408f37c082d1a44de9dc183232c4f6532fd336e644df031c2778b953598143b7a9108930aec839d84cddf71741adb31b18c0413b23e60bcb85202e70ced5fcc56394c081805e8567eb5306", "656aac", 3, 1226794776, 1537743641, "798cdb96f2f2370fe9660a095574862f651bc8dd475ea79c29f35402414a237d"], + ["33b5b25b02912947c97d3f628333a4e6a371d53f9de9aa1e1c41a092862841cc2dbcc976e902000000096300ac6a6363acacac2d9768cc1debd3d5668856c7be90df2568c8cc8f6231f0bdfdf733f4775ef019cec62b5f0200000009656a6500516a6a516a5bf8fb3302ddc8a405000000000057d4ec0200000000036300aceedfdcef0200000000000000005c05830400000000adfb8c5dccf3dedb23d46f97fb16299b893c422233c338ccb6fdd3fed05ec9f16ff250175aef57e64423ab71ac76fce79a6e87e35e956f0ec8423a7d97c2c85f9dbbe4e8b76a3ccdc8cda5efb996f10ed5050c32387ee8499c01971eda88880400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fb4e58d73f0bb461d1a5d56ff577333f2697ab7f3164a1cb20c1256b399453b406ae4cb695440290452cb1418621951cea3975f2a02688ff1fbbb45018822d8d8e77f05f0d0cfd13a3115ecb7f48673b95d1929a2d1d874d4f98ad7ba1d298b63a04e4ae8efac79223209b3ce6ef47f5bc03d62c146e927c1691b1cbdb5d83b6020881b2848c7a0ee5d89941869e322dbb881e6df06ef83a5a75e110af2d6143340209511d0292263005be140e1557bc34fb441f8dd56dd466a8100e78fb0b7f79610b03d5d1e63204a3dfaf13ac405bc1c75d81a55d7df4c4356ac1af10a21769d4a0ed67298af3c696ab86e38240308780b40e93f8e61b9984709bb01367a2a3f6500217835f99d1f054fc522dbaaf4b920706659724359356e9c5d6132bc03f4ff22f032e84ef044a4e77ae443f1bfb4f2b3e55b97a53e8a6f17d63893a47241e6af4be0215e1f8469c5564bceb40bfe677fc9d6537462ba23e8007144a450cb0a03319e9031e48ddeb0213c4dfb8a129478e8cf2956815804387ffaf9b15295ec2bbfa0f6b0203c9079eb06ea3ea170c262eeb6a7d503070af897fb26db7bf9d7703a35acafe0683119ff4132170e3e6d628637faed2d26a51d32a5b8301d8bbd6651084c5ddc6b882a661f0424d258ce128515dfeb4069610f21bb8f522e195a89002292c6bcf10ae255eb4eba6c4fb14f7c5686253c5288eb5ae47d6246cbadd8c015cb1d5f9d7c7b71d04eda24e0e5a498856c19325490dc9c7e79006aad670d737ea1c2ba50d0ebaa6faa446881222604661be2bcf6bb10df7052b6bc3c385576fa0f494c9a311300ceadaa3967b5f85a6737ccdc3b573080743d7b8c642ba04f6d16dc5ded6a2438eb4f4456b2be218652dbf8ff29ba44d99d55abc02a599a171c42479a187c4cdbb4ea94f1d5ad1525b0331cec397a52df70dd15a4c1258e37d049113b124ce209246b832b2984dc7e6eed721eac6c7135c0139e0a3f911be30cfcf73bd580eb8a70b58e9dd1f754e657aef9768f02b6cefcc64951840adc7be480048e20f1939ca1a25842f5b19bd9bb8a3a069b3d73e880485878090f637e1b75e1953ae2bd7851c8cca51d6d4d5a90a73913fdc9c0c3cb7ee2ca7fd6750b7160d4ddfe24c9f4bb36ed592d78bf1666f3e6e1c902041e3979c23e9c34c40ec1e85dcaa9c6d297ff3e9b73590c298ac32b618519d54ce35d1d974ed2e77ecb2d5921d4e9d97289f976c01f9f24ba4f2c0018d6cf8b082584ba79f5816167b769dc8a530cc65d47aa0db6b5fa6842a5a6af98777090250a9d7a360bb0cda112def9e00b9a6a3d72167c14703ad278f5affc147f51c635c3b1b18d93072bb421428a9f48092d4b36e4a422851c1107c37120afbe74a20a6af9402655627f07353029a29045d70bf0224bd36c8770f24c92a14af3b3d3865991c3708cf009b256d7b9c8026c01ede7e9bf16c1f555bae8f834f333b184056656e34986c65745670ad5356673a70d4fa9a56ba46b07a53d43c831e1b5520982bb73ac2da36ae3111dc45ddc8eb0c1147b7895f40f7ab5da85aa1d9eeaaeab5498469db7a7d30683f7ba1d92f42eb653df7b9676713bb8bf85b8c829678e57d518f0216254085f809fe040ee46ec3cf5dd6455fa81494cc689c86f091f54024d38cedf64a44bbe135afc8ce4df51644bb449ec08220fec741c4219f229e6e01f31f9338866dd88d2d09d5721d310ed2db2fe6cd756e4fdc07045d5ba60df2f7cfbf53963a91a800a76198ec86f238dd393e1b5fa218f75f720bb80155bcd66c2733a941cb119df089c5d9f018f61c5838f6e44b57434de4fe3ccb3a5683bafdc10131f980df345e1f557acf39c1d1213ec1b40f18c92864da63935ecd1795d287eed8052a1e6a6983341b4cdc97f759cdba34606ba0ce1c6bf4505b758fcca2d7b03f7404606abedd6b1bb2c608a1fb185ad80b6519fd98c8bb9fe492b2817373d72b11bd4a7640e1808194ae0c452415a7dd348a9f1ece3a21e2e00db4c6741075694d81044a16ff5cab5b1fbd72a6fbd5e708e83b84768ed8c142572b77ff8f1300d5c840f30f68c6135cb533044b82bb0d83e37f99dd0b25653477f67eb37fc577cb6954d4307ee257ae7136a0037572d54bae9bb6a0110efb0b71daf25606c3c09dccfa42352730547e8918ae98157aef2ef83854c3a236efb9bb55519217854a80e2d8644474c8c0a67433e2cbd54e14a379e87f7faad0fa09eb872008b7cbaf7c4a2757c2a1a0435dac1952def45fb96cbcea8eb10f920b3f8188000000000000000057c47a02000000004602354fbe6b753f50d024f273e23d932feb7a6f634ce98ed0c5d3bc4cefa56b807a273f1f31a35c25528e1614316911b0ab5d73c657e56147fb965117f241474f04f93debd62c152621a4d1fb0f8a82bd665d2b9c13f58cd94c80ce76f2806e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b7f7d157a57c55d9dbb03527f256b528844e006470298f5f6c6f1fcbc2ac1078ac97813fd4e29fac71f47e4ca657baad15ef51058eafa708edd05f07b2137d54f10a33ebb19e31da4b975cfa8e09128dc236cf8e4ab704d9d3ae6fda8f1c75831da6cb4e13a7d8dd0c23d6c4986af5bae59adc8a24b706505b49b2debc09b7f021f3bfb225f05c1b41ed94da6a94d90a3edc5bc97d07236ee8bd9027012c906f102044a1733bd492d6e3a2d12741619ea3b33555baa24d7c0bdd1371f31650e93190b0463fabe66a4945908b5069726367dc66d92b8c18d28fe8261a1b6db127422efd8dac4338b189d126c029ec730bb6ef07469435922a872306b84ff9f07048986021b1ee5eaab5114f70dd20c59a38beceef66c8880cc56cc228dfeea6e82c65468021822d64ff2d25db42520b5f27d0373a223b30f7102ff1f222a26861163e4aa32020239fbb29e324f39b374297ab04dbac58bb6f4dabe0144086e3bb4516ef1bd770326fa9593294dda0fc49fb804dada4813cd3bc17c8830f118c38cdc5ac8423e27020a728dfb7a71b9733f1736a6fe6d0d8602da31a9d97b720310b4732379585165e532167b8279ddc2bf58acf38edea4c9b2a6f08bc1885fa4140857633399800aa19ac58dc72a216bcea31bcaee7ddd72055c284299b99d777fabdb6cdcf4afaee3aed345932be74ad6408b882def80cda68154faf481358e4493dc56ae26fb5e55c204f8345c9be02699d2b9a3c4252507a6499051a477d928048705aec23a89b0060467657705ca146f31065ec76b33c7c453a4b511b344c86508ac5edc5ef15be7712ee23d0165f077ec9957618ec91effe020e3eec32c43be745457fc4350351949209da7c4a4bfce759c78bd52bda86a5a50d365136858273f642c5ea213fc0c6a6f98a2f19fcf5f98583884605704d37147e184fb64ea00390d94a8b7b5f67311edd8ec89103e941019a6437755e0e2b03c1eeac22c43de82dbae5c4bf451be49eca6c736be2df9b5556cc3434b1174f0417a50111521479c79ea5f2e44ce86032bf001a3ff603ad057796e343323d8c417703fac0416be96d30ad8917bedd631b9ba6d7290570408253b996f13e4a2b964dd6eb6e7856ca40854547dba4a29c36321454d28e3ea72c76c5d9aa3f92698fb5e718edbf1f5d9a9f2cb9c9d33f15ba56ce16da58ceb7c901415b024f30af6caf0348da58b7bc5d86d40d664c8ac32295c65caa93a3ae2a15b9830dba7108eca44e57bcc496d3ce142d1d4e6c4fed43bddb174729c6b74622b4c98c1ccf7ec3ad6e4d309b438394336f0d574f3d4ee0ef03f0f4127afadd5da0c14b4bc0517b6c474d49e85bc14b1dcd0cedc22e998a3e2c0290375da3a01d122c77d0f751b2fc8a2acd9a848c8a9e7e544c330d2a53832c262ea7117f09031e57eddf86dec8c5187601bdec13c242de0f00d9865dcb86ab732e2929992a7de5dd3e2808b5c23ac965410c5e478f5167281b0bcd4628e8870c1b1b518092f8d91d4789326eb127b1e0dbca78fe6eeb5951a79568bb27375db2450edb90d2233c9de6dbf98f05606c8e22c2018f65f6ee3c47e9a01adfd7792dab7896aade5dc305ef9a39aeafe8fb8259645104e19eda3fb6c011546aff7bb451c620c42b0c1da4d078d5db4cb7deb57bbae21a56b37575630bc91c74d8c9f2dbd939426808aa841108600adeb7cec5c1ddadbd025fd9eea7e71eb9fd68b02ed6b7bb68eb2838d2c014a42f2ecf692d1961afcc5bde02eaa19e6aaf9d74b49b3aaa644b1a275ab569612a35f154605bde56d5876e3a698e9b4d3f545a82a2646cae92e0cc01fb0219951e29edf3f235ea7be377b32d8f74b9537e4d81807dc942bc4ef97df99c8b6b1feb1a48832df2b9a82c0f2bb37a3cbd5a803c44bd60fed395a60c7cf31013ee3eec912cd396fbfac05c7f4e8042d2c6c98e8a368f3f78a5c2f4af7f6cca92f2aae83a2e4a15e6dd6adb5f3018991b9fa9bc97c7173ea87c59b1c433637612f8955778a83afd90a98c3ccfc98615cf505c5381af2caedaac77fae5f5108cc18b5edd1c107dcd5388a78cadf502a2e74eb191f3388fdf24818f7fea8b201651b5fd62ed869621e289eccf1685aa9f7c4b720b68929aa43c83bec579d20532cef6e94911d4e064ac6e5326484a1a4c4a05a6bac0a98e21785098c84326ada24ea051d2360358b9cbc85b20136f3b872d0aca50b1b99fdab05c0fe3bab206acc2bd703807c249e10f5fa7b2913a27381ec80df61eaf4597f7f431e4c434830461a3c00a348c6ac327f534bf9cdae0679cbb4eabb7a7f9fa4932b02c36bc78ea4e3ffec143946d8e46d3c6ee8d01078b59127eadfe4e2c8ac33ae225b24b3341ffa94c10cc62fd82d8d4e8e73cc373100c552427307ce08691f4898c1aa33c08e91a8b309", "6a52ac525163", 1, 1435162964, 1537743641, "b1920a71ffc2342efabcb0a8cb9ed3165dbf3cc81d21ef1c5cb48638ee0e9c7a"], + ["030000807082c40304a4915cef77ce7970499d11da432d11c99a983b247c0be086fbfad3d71f5690570000000004636351651b2a7c68fe87daa7c70f1a8aaa32b1ce2af1080209bf4a11c6fe02120172b30933f8064301000000076a52536553ac53a5e79511313fd148f27e117db94f1152c090155d78fe65d3e9f326f8acd0ee0689e5516e01000000096a51526a516a6a5253ffffffff837a9810eedfca95b06aee0d702724485313a213ed14c8880af4223ff879ac6603000000090053006a6353515165ffffffff0153e8e40500000000045265510000000000ea9fc95a030000000000000000e2a7e10100000000bc17b20c112a3d997d0c9f01f2f2e11024282b512f26561a7b4824d94980d6a301544b4e41083861633f969b39dcff002dbf4ede122a082340248cdf3e6866dcac7eeb973b1a77cc868c4c4080f2f0f130e4c8a082606655ebbe5504372302600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035a3cb3ec1e8b6851783cbdac884b2d373fa991fb4d921320b2e1033e81832de4fe23f48efe19a08e6086328bf67c705f31c9eef7bd00ec6319a5625fcb51bc8ffdb0064db792f47c647f917602d76f7bcfdd0acc248c9a094fb6e003e0164ee75769b3e54e34f2144cf3b9264ed598b8508d7a07a4d041c23a414a9d9bf69a8031b2e46548e05e2a60630dd10095dfa494cd2da7cd5024c0a97c3924455ccdf1803016c27bbed405d37245448b8a58642651f6b53daaa38b967cdcef6365918f9870b01e6653d07ad7a47be1441824f6ad3ea8830f29cecbfed4d8ea961da111f871c129901be4ab9158b17cc90d20246c08aa5355f21c71e2a90456e843c9f500fec0216a882f2da95493e3edd4f556ffa0ddf3d8f198042bf4e8b699cd11c273c4609032a9cb431fec46925fda4dd27e9d9c3cc7decfa24105ba36961624528346f0ff30216057266b6f4dd5a6cb6110129f47ce6f024b73ba4362a2effac34fde2aa7ce90310adf2e56347171e1938e7a32b1c13e6d7a6132efd1297e025bd8e0efdf1daf1032521ca3190ac2e668f4582f29c41d3ba9ce8376e42d4b7716595acdebea44990678f19c159a9407d7ddd40f97d0c522515416e5100a1b92e3ed16c56fa81491e73aa007d63c874ea97a7fa4b130900795ce430e5902f78f983e6a55df40a7214481bb7a1e67a682738955a54d59d859e8713b31053af7e05cea7707f4bb7bb85f0c9c1e7d6e328712df2463a0c662fcf09808231a2dd96e6d16f80fb76694860ca127c9ec1317854d932ed8b6a8aac1d078c26b3fd7dc70d1d7671c1a3569ee855635cf12d6b8f17925283f03b0c3ec787172322f31b1ca26aa32e2b76a999ee7fe14e99b796802f058cb11a412e10ba7122b5307d8d6b5855732596e4f2a5e34f204bc733f9c278ad50cec0e871175e9191a413049ae3675e1ac93e86e6c942b0603864072d77d59702b3ac192028fa42229d06268189d31ee1aa184b4e1e39095104e243c78629e15f12a6b7c2e127eab65239d50d64a267b76153e39e6bb43a4dbba64b7d78716152f3196d449ff39eb362a558a9225bdc31ddf6d5158f71d3b1cc93e613814bc41039aefd9b86d6cef9d96be74ef6c78644ab587c1c9412dd224ead0cfaac230a1980d3e8914316e63503f960e19a3a87b74df6b3658c9a7984b17d495c32642a77ab5448cab151ebe86cb67c097fb158a8f13d7c1eefc2eefc77ae44f57fb94df6bfeb53a192b83dd6f69f9dbb77a790bd519ac8e7f52d6bf9024702a60a32bf9c8f62d15128b2e3510e7ff732fc301173fe411245a7ca4e03c1bb3d177bd854d592f5d19a0819a2f958d38f3064740c06048081e82e77193b3c29fd92e9620e21ff8561b45763dcee8d052936a49040f42bac03e1140ac21faa5bebeff19117bcae7dc9765799d9b72c715850580c90a2bb16a9013452caae49fbf2812d1f1ff361699f1fd0b0c66b77f32572cdd988372fd6ae6042e150544dd9fed3b7ba587db487df6151220e00a59056b155649a2b81e7158b6fe3252bddb63c2b078d9a9ba2cf48168bfd5f8ec0f2b3cb7ca5fb4e92b6de0ae5d84bf45a11b1ae008579bd5868d08ae746a5b1a76748110ea4808eeed124907ec715ef4be276c78ff24950bcf8cbf5b52cff7ec142ad4c1c69510c64851f8780e241892175448d3122f5a829edd6437cdd706198e61d12ad698afc82cfe67c14b0bd04820ad95b59e8d6e1c3514f0c39ced95149bf7de31a3256cada3d0930436b49f6d010856982dabba450da369d2568836e47efb1b283e21e6f6cc705c27d0a7dcd44ae3b200391475a59d6961baf6dc06cb5584276b14c917d03b899c2bbb5def006b1ae6a1989b4a7ca0be14144e16e108ab5cae466d5a1d9f10f304c9b1e6bede06e46c74eae4f32df6d691bb9307171510fd8af4f46cf6ad6921c625515df073a7d24a468115f819c7a552573ded8f1dbefe4e06f4ca67d87898333344ecfe30232071e491cfcb4a5f4f2e5bb124159840df9514935deb280bd3a23d476b419b1d22b6a19c25a99f4e4bfd9b8c8e7aaad17dc275da286b65453bc28f6eee565126b670c5983b56214020bc286465520d173259c655e03903fc326d8d86018c216d5e879f0b8f6308ea45ed46a4ccc37357a14814f02684539c58b3d603d334a2a41cd2f8071c25c56a4ee05a3342781473bf60729c1ca334e641dce5519e43d64db8645684994cca682cfded6de65af598fcb9626971583c2ce79a09dd3fc14f3b7a7f2c7bd85558ed638c78a9305f2a615b40100000000000000000000000000019c132bc25d683b8754c4b9a97dc25f4ca5a89fcad3c5dd31d2236bcccda479ecff1b43470b356b81c2d2d82fd6edea402f9a74ee746361f3f2cf31938d6af2e99dbfbc1422b82021fdd9df4d2bc2f19761e703c57b63e88540f5b75c1e04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f1e6fec5e85ce01ead5fd62bdbba17357b146bde5ab4ae183b6bc90aa01adb905c6a521caa0083d9b18450d49391686f7ad63031d54ef11f118d503d163aa3c8f574cba6d5590b5ef5d0cd01baad8375766923c0fd53a8d3e518b1087e612f9a22646df51cf90ea33942971db2783039a8fbbf3d1d47bf0fa205abe48fa9af90329de8a2228e9df32ecce2d10ad697db7cbbe9d7021f5da2263faecae830722ac031f06288bbb4ee893b431c697562eec78458afb7a327cfa83a0b7f6cac3de4d290b0651cc6da5f90d41954cb98d2771ee8effcc0d4902bdff79fd6aa84f4a3f7b40f39f446d662f0c3ee0e293029c319a854dcce3a7cecd783b075c542b8f42ccae030eb44867ab0b4ed49553dd31534a9883665bec536c84edc45c67664ef73cd2c60321cc139e5c464a9f4772ca07a1cd12b31725abc9892d536b0f5bf61308c25666031968c248b7dfd68cdf366abaf448eaa277fd62e49ffac6880c5c8fd88f9f25d0030d09652d92de1a4238617228ddc1c70fd217e9ba8889f1d780a2661ad8e0517b0307f7f5100498c0e17af6ed9b71b55a280df9c0d0cf48f3ca57b89338543d6afaaaf55f17a06f0c482b585b520800771eb2d1b96f9b6b63e88adbfad50581b396cd47c064d7c903896773cd9ecda194a426994687e493c50a46f4ecbaffba7dbddbca0f9d97672cbb3436e83594f37fea638b6d8b3d5c1cfdd4a16ef63c040b20e2cf945cd7c70ee5c8cc89f56c8eddc0c1a13830300079b88160cff9ca868ec22aa9865781e790ac9691ca0a4f1b3ea397b8a774ff96a21e5ff90ed4c7dbb2e711a6bb77f5c8d2bb840f340c7ead591721af431fcf69e77317da2b4a6a4b504185b127826be8200f74fe8a4b439386cc4500cf40aeed1789a5263ded034114e1e1fbfe2407b4cea0576990f4c99e2b0b75e243ee5c76927aaf7592ee219797ebb4dcc93bf5b95ff8e087c589ad78c00bc4116b69747e2143ec0c25150d607a9d24c603461ea4a4da19bbfedbfd5dee5f99c62d2563abc53515ff1dc048b77832b66c86162400b4cda5c06edce49e65c009f69b7c2221d4b91cda797e3848591bb7240898126befcfaff42f1ec3367f5c5415ca9ddd923a8c88bcd08f418eeb2b540af741289188aecd1860a8eb9b27af9e03fc415085309fb8aeef0fdbdbeddb8821c26c6df5f1419cd43cb3c3e5db5a3fe85dca903ca68ad5715b781f6dff83db767e6bde546d9a05f721272ca1990bf134897414cd5bc7ee6a65c9c25519e49a0ed56e32b9a4806ea24815e43538e2d722fed073baf1312d6e6179a73746756dd5dcc719b870764eda30c2b6b066b97bd859a5efd4cd7984394433fd94f788d7953da184420259635bc803ef54d7ffd039395456e753decf83fa4162655226b99812726cc69b97781c2d8c58edd1562878842f031eaabc6cfade445ed04b5277b99e814c418aced6866a0245bdf04770796e7bbcb5ba737d0dfdc61ec8eaec8f13a1d82091fae0936ff61d8de828c524a23b844d23a34ddfd0f218bce97a88c26bfabf0c45def67c0061b1f5994e45f5ba39edd4bfea9ed125964b9ac166375151806cb46f24dd644c2d5a9993df86e41f7c9821f8166aeec2272b8bbefc70788730ace8325fb6a856d97cd4752f3e442acd30428a2eb84716a7a17f1b6ea85e2004b3a88dc883ae3c4918abb34232663cf777443ba19d241653b36fcc75a9b4e8dad280347460a0036025814e27de867755b329b13009c22972e82ad8e6ed15f58fef0b27f260565535a7387ddd3313416cac001bbf19cc44308157ab410114458a37ad62c2f6372fa35b7a9482e3af51476357ff97ff80375355923e1a5703a543f9380c619c413a4d620e94d2a12480adc1607baa2c25699a60a774d9fc066fc5c1d530c594350c3fe44c90c9bdb8a12d78bd592c3db443cf0abe6af5349ccb594248399752df5156fd9ec11e6e1138162649d776ce677a4875caf040c5b1cc6f6c63446a08c75cc37ad11dc63481d8eafe7710761577574749f59d5af0bd55626a91a0f9d6387b06f981b64d19d988c497045ab31b7d273742566004bf5f21fa2fe9fca906e0d929f1d3be6273142cbf151d658309c916a28ad10762866ccb4d1c8e417fc9a76168d62810f1ec13806a953463c3da2429909a8f9b1324a5691a1a88bfd2d8be5bd3de4b1b914ce1d015ee8d9282174db42f8279d4e5aba46665c74b013e54929e43e91975c6677de9a76a663b01b2ebd24506a018a3ec0c91936994c79d4028019081003ae861555f000000000000000090955501000000002d8d4ed7aa8a37ae42931e32cb2898a2c8d6f8f06c5deb21d009709ff066db3969be98ad2e356e1537e7f585409c32b59b7b0cdaf86b9b7b1bf7cca92f077869356b9e1d65c316d6f79c46ceeff648f3ec87032262536b279bf40df909fe68140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055ef6c181d58508b250fb7e3f66b3cac13fa419dce050a6f823fc6f84f811c43969af9cdfd9f9a9b7967320befb768d7cd795398b4e0b32a999af36ca06c4d8ac68a619c9bb523e7f2204a038d0ca406ecd9086966998ca16d11b32d78a23c91fdf2be41dfefdf4aef9061582d46be7ee1aa8f535d33e00ade9341db884c9f780225aba733c772407096ab6ebadb18a387d6a42875e453a488c6ecf79213ef3a6d0304d18c0308edecf1fd66d2e6628543c1aa294df79e38b41d3bffcd500232ebe80a0768e20614d7b868de95920cdcf6a333721d49e7116d7f58b0634a443e0f3b9ed8b7208b1c882bfbc69bdc7ca9673e4af26c29b3b76c4fa3407823fc2aaa722c0222a024ce0275027a73e501cf2ca6fde0f001320c62650b010ab05abf6b404a18020b6fe98dab961dcd1605f71086c0ff83780f65d9f4bb51bcfb97e0c5744432ca030228e10fdd31dc703bba803eed5ed4335f5feacf33ce6d970b14af761658c187030fa090c0f1f456f471fcc82083d034a091f6692d48b332313281dcd7fb693ffb020f828efb2e545990f8bfa87b47653b102b60971d92b8e0c381ec16f1a5fc7bd8878106b1dd10c71b1cf814689d849763e7fbf9964b1276469e9301dddbc6cafc84a82852b7ac0fd23d45ad4fbd6c62d6e7b284f09d226c048acacc22bb6b029bd47ac3ab7350d9c00c9a1cb5be4834834a18eeb2a8134a27682bcfc9c31829c0c16f5117cb664369da81742172f97913c1cbf835d03f314a7799569a5f0bc74b8f1de5ad490c38cb2da4790aa2b18ea93743b93dfd837d600b64b59349a2f0f8eac08c208b4a11a19270a96dead71490536f66ce7d818af7cc2ccd58cc39908e6df173b6b65827f3235e3ddedb6b2ef6b57c209a60c1c4fcb4b5812f07fb4f9f5f95dcc86984f14c941a05d5e6f722711f61d7e36531194f127828f8f7d6de04f18656a50bf3eefc6c30bfa3ceabadc73b06fb1fe5eb3a80203fe451cf8b95eba070a53144be64706f9e55c94fb4c03e5a765848bc2660238df53ee3b157b767a61069691d994d773c3bfcbaf65fd12d018d902933376e79b2ad4bf496fbd4e0b0fdecedea37935d7ff8c264c4c84a4e9763681d4a6477fc2eb27a32980c2c499629464eebc94d677cb8a5df066585f84a71fe6cbf00a8824241a55b6ca688ac7b1549e8171da5665300f5579e0e4f078b12a7c55997e44b0dedf274aa4ddaf31ed8913f5d8f31a2af1a957d780009bd9462c1fd800a9ff6b17e19b007a66c122eecf64accd6533f7589c6e5c2f50aa6094732b8bd213fd49c0ec699778a0bac735ab2a81986908e7aa7fd5389b487b9dc0a03023ddfb50fc60f0867875f6d77b8f503792c28f838d1577646d36bd81eb6905e0d980959c1ed449a8ab5b09f64d3f74bf3bb560a03c7d2be1ff9818fe5018c4ff6edb08a11cea31f99ceeb1c9b9b458955467d0a4001ff39932ec795f8b02966d8b5ba5e9b9b7cf4ac1b4ee2fafdefad6e4d6c35ce8a01c5491357085c7e4ea13c710fb353a91a62a399310be4ab1874da7d7a9123684378e812940ebe1954a58f8ea5e8c72e1d8c87e67a8576a58809b91105806a02d0122630147e60cf1abf9dd5b39f8bc3391ecfe60927d60f949ab3c82198ea3414bf1c071d63ef4399747d980f3a68b080f89c551ec03aeb29991f7631379c38c8a1c82a2a8f55493d5cadf9addf3654f4a39c6f8d5afb4eb36c36321cbc4f2437db80d0cedfae21bca078163e45fd6ca29a3338172dcc6a0d4980193a1e8b2fe670ff6fb3d993f19fe9ac80a04c45bc6058b1977617aec59ff50acefcf3512d788058deaf6d64815da8cdac8395e53715846b2eb69d2279963e05de62e161f9dc55d9d84377522ea29b8f06bb2bb5c7c88efccdb06730256c539eba05da7aac2789e361312d530552efde191864031a7a6a0680d8d488425e8cc458f3be4517092714ba35d177786d9a2f8ad69af9e7e124f835d3f80e43b8df374f845af671ae0c2392423177165042c54313b43ec254c0c987e84d575ece63d97673a054467389c63e564e5ea67f5997a720b60217a92aa9e480ba450e3094c770c27aa3329296990279b7e868aa5cf48e557eac64485f286a49b9b0e32d8c9ecaed5cb924ac47c304a0caabc862610142a54b61a6371b9abd77191912d2c224c7525d7b331f3a4574a387a781c53a5da9fe7db94e8580cc6fd5c72148e14719dc014f03adff15bb49c3d7b2c671154be637c465a1c1e2585f0c3804d403cfee2f63535513e3e1fa4b9bf2f468e1370f0565a461bd7ddbdad9d829e16c77c038652df879fbbd96ca345f6df6f4eef14cf1c3081d35d0afe0727e6c1e1704d2d9252d232a3aa65bc9732ebc04759a18f094954523ee592703ee218e6483f56bda954431d79c53fd9ce002a0b77b04", "006563", 3, 1232283717, 1537743641, "f24933bf3eafaa8b22c81adb0282858ee8667251dc4b3c9af5e1de2985c5d1cb"], + ["030000807082c4030178daad3361b257405660b00002501e02350b0cb2fb47f84cdf539e2893ab35910200000004535100acffffffff033a326e04000000000700acac6552526ac03980010000000000c53f1e0500000000016aa650e8f400000000032ab7cc03000000000000000000000000bc02bc71512077330486a0fd1f53ebcd72f21e138e9e3f2d30bce25f0559ec2712283e939eaedc6a57e344cb621742cebfdcf77175021b5e9f6223ef69f2771d59ad66becf4d3592206c824924eefd47649af92de33373aac6c3d0ad16da940d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090a11c6dfdea22d4ffe7fc002e7c77cdcd0ce30ff7f88b5c54b07b6980af43fd2ce82195c015b7945d6cfe0447d323778cd843379f40588c5dbbf867e07a824344a49bcb0d320e14205422f0d14de391da028472ef9de0ac60a9c0bc4fa2fa0fa4a517dfabfc9e65ab017c71622fa739716ffe865245832a8ecbce99722f9882020da301c2fb4038532751a428a2472bb3adfa0260ad01a26161541f7611a8b75d020162827b062f5b017e14d54347803b55eca1698d8c2082875074c6f7381e85b10b02a67cadce78c73c4f99500e8a8e8f741c9a3497076c28bdb0405101b447d85311fb2211fd6e6b9e4469cb2edfd2c1b50cabbf61590de2a32e65772e8ee1377c02109c80e01b0205d868a451454379611a323f2228ab0bd460e1258324523774740327fe88f84c9bd068027e608031c5bb0a7bed0c7433540d9dff51c131cd0a9b0603065c9a44a84ddd3ac9ec79c0f1e45582299c8d6759aabed2b5b40f09c6f3754902121849b6a9d60e312d4db0a3a9477c7aea3d3f3a738ec76dd9101bf4b8a304b6021cc1854d6bbec6fac68bf95147c0122a68714cb8afd82ddb7376770ed48eae4f917c778c51b4d0b06bdc68b10390adbe52d79b1a55334bb8e1dfe3195ce620485d9ea58588bce5aa399fa550c0a45a976d81be13a617d1b6f7582e0beb459e59bd83cd9c50fb9125d0954db365c068493b59dabe17b8dd10f3aef0d7c6e7bc675315e5a15521dcae5d335f085d00c169c91a50c178849686b1ee7af8f44e1cb02abe36fc4759170178040b4838dacc817792b32b21ba8e4afdf4c918ae1239a2bab8f75237d8c237e0f7b2f2358bb8c59fed8b8394b65d589143b161ecc976906a0da58162ae1af3133d3d4a2c11f478c1ad44b8713638f24c9cf9a7145ed1922d2a724e954b14b948cda81c6bf68d25a0917c99bb0c3721a3343ee4d506e714d8b59f40698dd5c0a2c5e337e33f763ba252dc75bb400302f67b5e8259d51c8fec191a8dd1addd1e9e497ce1832272f1d34dc04232b8872ca934cb559b5e7ed34583e486406985335479217e41fa805478704e7e85ea7d972c19a8f8fe108272c972eabe1cb557166aa617f2d8fffaf87601cdd6f17744b22d7947c42d34ceffff4c5ab5e136b5d5bed8b1a79b9156af26109005518e9b8f7f28467cdf4c9da2eb6d121ba8d4208078dd48be0b40b4c9cdcdb224098da83c9074234fbde41d88d1d01a8bd44671156deef05e5455c2a7de7b8693b1bf37e03b96772013517fc51009cf6e5ba904f858e8855df6837fb2c0ae38b12ba586cdcb44da4ed7c93f4ec249d0ce64db429f76d5bdc7cf3c77364390095024704bb203672dacd5ffc7b0056b3ccde69efdacfd7c7a07463995798f38b978b5f4dbed2af3dfd97234b02ceacdd9a6aabc9003ac9939831b18c9833c1d39c7b3318c3e0d6ea9900d04ede4fbd4f1f68b49adf287e3bfd5170c0afc692618d704b1fe7797a7a2c5fd066d8b6759e01521fa92acb1e30fee973e63d4992220499204e9985a929ff205d5a9349c24182e3d3f36c55c2df31d16323385e030f3e4fb78cc94e643def5e10553ccaf54b72bbfb8b3dcd9aff2307b05a2f16755c9c1b9868519b1ce84da85566533c6b901d8cc006f13e3e2f105d914470d9992ae291e63732567b5e52c2a4b244e840d896f853c4c1d3dc7a6cfdcd7e15c98fec20bd828fd626a6f2c5bdf64e2bd25b7b7b5a95d8e7c51e1b2447b0d8c5ac5b74f9def073f17f1d7d4a09872856f375d9d04344133c1b3708d6e06815ccd73999f7dd8f9e3a587cec0b4d331093ce678d5e8f1afc50b659941b7a7f9692172f7796c1955b4f681d1f6019c8e20a09f5ba686c628d53644b4475a08f5da8b4438560e9fde6ed3b607497bac7597e76d9e85c86c80aac4629e13f76200d45682b673ed714182521b409ddd4a730ecc1dd5d852f0b704388924de0ef7af2d217825d992e8cb570405158ff7f0efeb208b29c07c09787c077753521d88dd50597088c77df8026b84439af41843ad39b219741feaa8cc1b98ac076c0ff2449be2f37822f5aa96ad80194974b68550027289bf3d42af9c2f75d6cbcbf994dd82920bdc0bef66eb14f5ab320c54e19fcc373cf182af779529ab406f9e42d328bb036513fa19aba855a1cc5d978bf920e8ca497a96dd2b898c6a04bfbedb6dd2b3c333e3f4802e975a5eb30bb514c9b8c11c8d4e90ba62c444e6a34ee97ce3a58bafe59205629231fce04df8f58f1d8854fcf5b0497b2d09b493e1cd4978c0ec7422115a00000000000000002c28fe0200000000ffafe7dc915b287f3bb0f88343a69dfea4687cab9c41e8cc8731fe2bcc411831328088a0e19a611a406b67d612bb9da4d1d0c60528ee6a6ceb72a4b1d7a5946c2e77b1a99c0bab7fde8be42b5ce9ef640a24e4aac7446e9e69c43d6370ffdfd500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000403414c86f13f912276313b5ad3765e3dd00b7eb7134946c52c7d183e13cbcdf29206d9ce7e263268d6742d5ee92c2a2b04f1afe4b73c2d1769a7c9257f5682222ad1f1f9ad06d11c58673fa6713c2050184a154db36323eb3800c00d705f07fce23baf2b298d238f0eee6b1ba66bd8104c2931cdc42502723a8a6fd12c05c13031a5934fe1a43abe37804557f6c9cf577d296998a1f69e96bdfedd6a719b264070201e376db9df819f72b7620e56a1fad38b6b600b726b9bac54414fdabd940b27a0b034c258ef40424815800061d2c20df0549022cb13b8e7b61d885f98229f348d01c4b98224478289e5ccb3bfd4bdd6d5bbe39733635c7aa14acec45dfdcddc4570315efc0131d4a40ad983a26805840863f3c72a8b5bea43008bdd5a85d818901190321d99f3f1257a151aeec966d549c01aca89ec5630e687d720eec475b41c09ef10217e5b630d606e1f218550f8566c416c757f2e977e9a121acf1935446370c7eec03232a5c4628604372eafb7782dc5a76634b87801c3849940029940eac117f64370225578b891e10f7691a73f8afe4ad8ab96c28ec5fe8ea30af3ecfcefe118dc5f0dc4f5ef98f63d6b15042e1793b678eb35904bc8803fd32831a8d0d0d36a5ae30799663a8672ec72d9d69ab17b2c82c2fc2d6f89dae7c2bd41a233d44be6a64ac42fd95a780ca83b9fdf1ffd87ee748bb966b66b303b547a46f003b4955cdec0650399d9ae41ae72f824f0c96988d866f68bd4556052345dbcb5d09d82893c10b6e11f129c23cf80b25817e6432a28102c42ca72a95fdf8fbb5a176319dedbb866c5b4afa25d124ea786c31f6b686da7bb5de2e69ceed9689def9c2cf5d7c946d328d9274fa0988283244898d3c6bd0b3823b86a78707d26778135dbdb812b529e9e04a4f3230e8f575736ecd1ffdc5a9d8091ded9a3d96a48404c15af23d09afc0f0bd494dfad86aaedf14a576ab092f16640f2e10ca0ecf980183c6562c2ad8e67c629ea2d8169619301481e29c8be2ed3ea0a3122bd49ad2b2820a9ef23d2e2e0a011a089475d6b01b46749282b955b43dab03ced18be29e4c79c39d522dc6ccca0b8f5f2978011d64b725cb34cc5a2bb7d7e7b0072874057ed34862af2b0ac3156879665b49b60addc1eea024daead794089fb5dfe371ad13e5f1d9dedc023f11a8096d5bc35ede3a7107360119c85cbd7bb4f0cdad49418cad60b395cfd9ed873b3c1839ad64c69142f11c74797d1bebddec55366db471b74a26a2960ec8da8224ed3f913cdff2523b696b2a2927ab39426473896196d2b81b79ec96bf90ce06591ef255145f3c481f8ce22bc004e011e4726504b7d73f463269ab9bf9a9a63a51cac0ca85162895343515452dc127d45492df0e3073c80c434f31f1555e01bf31b885f8a7de4c1d542d4ce2e53c91a39803cd3fcddf8c118e5ecce9675c8538edd9d25267d42d2a0894e25d3cecc4b4a54e8046f8da05eb50291862069ec6fb54d0c8ae3e9782ae90b1538fb4be5934dcfd476584aec5c628cdc39257fddc8ba6452ae4d5c6aaf93bd8c11433756cd83ef92bdbe86c418d3a6f0e0c1395169f3fde27aa2860f009c199b59c45d6486a7fc71f65a50c80d93a69d7b339249ae6fb4e4c00253b4530bd811603e77c8ed7699cf610247640641f930e7d074342181b525269e0300c2d2b965d809ba44c56c09a50f279097797b944d26155ca6929bcd7f5a285c738c0abd11f2dafb767d658c33afa003db74eb7e176e6a32e574fdf13429888b83679efe883390a33d81b2b0f0a9b1e1b661d68a254dc5725e07d193864c440de168fbae2523d6e967bfce2a97d11248d5f4bf97f0f982a3e3f8ed2aeb0db3646a30dc25719841485fa46518ea0859a48f4eeff1d1724d07b4c07938effbf4f71017f03c1ed73cc3f133d9f2082972273f80afd0dd5c201caf15824452a1da0bf02b379e70a9ff785ef18f67a86e385917e14352b46d29fad2188f874328345e645ea213d2eaf92f7a883b5471033e821294b04777bf7fee20f3db25164462321f9d0a20ac26f065733a735d811c24b3965c05af868f5868ffd052c496c3125d6ed0179216a0e2c918f2e40856a17348ac4d2a33a32342571042d66bf027394db45f4c277f7b8416ef58956924489a5c1217e29d1ce76b9cc62f70bf4741079d298c4cd0d75d45655a8b5a59937089af29d538ce9b48da4fe7e2614b666ee7c4a8115a22fc50fedea5fd4990b0638542708be372a83a1c325623d1d8276861df4f447e169efd27b3c9047e8432e03000000000000000000000000f8a201db54b3d18ec19f26d99f8f8c69de9584c24aa3e1fdd4bd3edac785b80678f9e1bec12af623d29d39d48bdf273dd606ec24d0baa28fc87b4fbd937fc0d03b80a3370f471a4150320e330161f27b17686e225371d3d8ddf7410664be908600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4537c3f19fc05ff77682c8c43719dffbb709085c43dc4405cada274fb6900cd72954574c9e28fa0d8a1eafcb16998a541c00b77b6f6901ccd411a33c3cd8b5c0b5b37cd3cdd5105da0c4b5a6f8dd61ce4c9fbf5e252960607b303e6d6c020d3655b5783ab088c1199920cdb8855d70a25e3af28f05ddb16a14fabdb1e0414dd0203e78f401964c31e240d16aedbc323a32b3647bbb64743ff1d4c666dcb1497630203a0181f2da8bf9c324f3c28904a9c61e3e68f1ef33689d8c28ed17cfcfb02000b007fc3e6bd831e6a718ecc44a35ca0b7f6c6042f3e37a35b94a108a729ddff4a482013e22215068ca3be402cf984756a2fe4aed13ba4c6f0208fe701a5430620031d1256092f0c163566da76e68dbfe130cfde73e91c93ce99ee12760258650d6f0214f26b2874c159a34d3fd90bedb7c3d98e11a219dff8d2a8d8a5242f14b211f60203aa625c4b83b37bc19acf1eb2289f35e7ed89b52918f9623a2de7aaa08f9c69032d0a6e2cab30f4dae6c6a823094a5d3547f456bff36f7ef9f851df09a5e89ab8022b4a62268971083bd3a5dfc7f234d4f67ac2dd755ff0f963cb021cda840584ebcf56af69d85e840b99e8d872273cd716d777f015358f86ec63847b401f25271e687631d35462980ce4764a198db80ac3882bda57c3d114add80d4f89f0aed67a49d245d39675ac1e001afc65c0c5bb9060eb74e3730f40b1557e6afe1dbee9e20828f8f21416387ca5a915dbd560dd51c81ca144410aff848cd6926aadd835a6f1deeb4385ae2e4646e20839bc076b1cceecb9b070b6249a7d2afd57078322e5b4482d43a89716b542f0f3e6b9e35bb3fde8e0125d2612ae5643435f56ff107bcadf3e9d062c3d6ac819994abc8e61ba1b37d9834997f94bc302030bd668ecf2292eb2b65ff3a919306f296377c85c6153c50ef1501d52be749d7b2b25a7d7fb8e31186ce1b8ed69c7349837d2c31ab723aa287c35ed342465d64d6720fa582619e3d2204ff7621e6a2917f852316d5c47f1d50caef1a40513706c65a847d3e78a7a80d2eefed095ff929532971bdd053a1275f5758c935e9586693f6ccf701dddfb198206a044fdc02616e18e43bc43d81c036e27e27e3f6e1b7d74d2d07543973e63dcd4d0391528a3e99f30c50c471a99dc5d40d5f9a534c34eee4b8730d4209416ee84db014f2ea54753990a2b66f1d4e2f147c5fd5ed9d45c5b6107522b214ca1b38cdd96446d9a38e00d5d8f05d4bb35b704073df290e9f9a59352fa5e3168f57ea5066e14bc7b517515f2d59a5a8c644bbaa3b6e088757aee0afe44f3da5511626f404821a6b01193c046493196a00ea1188b18c1f4842b4e63a686b52bae4d72b3e7dbd2455e5e01f0b5519832141c309ed11b479d3760889e7cfec626a65a08c95317a143e072e12eb472f8e2496ce0f3cb77a98b75d4df11227d091565de252c4bc7dbca920c9a902cbec648d0763fc6fa9f75107e460e0c35b767044ced75a2b2ae0666d0d94a5d7af4574abb261f4cda25551235600072230edc199121bc3b9181dcd3c0d03e20731001be8d41b94324f4f0ede51128a8d01f5031b1d30ab1d5e73f878f42039a2f2086cf18daf4e5b46fa39689cefe043ae6f5647817ae18fb98a3015f0a08b8498b533ee54e593a37fa9bee4e1c650d60341abcdccaf8a506741b9e1bdca243b6f57382135b962de641becde9d77a217337a5ff1a038823207909f98f391dfee6dfb21505eb0d44c3abca314270cc28a6d172d4e3aedec1308a9c83d1774550172e7694d0bd07e6f29ec1358fdba229f21b9ded1c01a159f1ef5ca0df3d1216806635d43280bebab184167657c79fe2dbbe35066ec25908944f067fe8ff048f46e82ef7e69a610b3dde9ba32d60e559353f690fa085130b293fa2f3af7053cfa92a5486ec8a4b3d3571f69f9b92f9f885ac7ce49bff2dc1b2ef037ae4697fe4f14de5f51d9d98c551f738e3154b1349271fd4ceefe5e4385f33b8385c4d772c46f1b74867c7fc1c48609ececba1ca9567ef2b566f71c7a511a1c2682516e653f0e03b53daf38f905e962ab363cf43734af9566c953a308ed7af15f29dc6b8549c85e57cce6c59a2d99a6c34d62dc55304b11565dbb504ed122371c29c1b89c93a3115de87c6e923e151fe89f8c433550e5b136164c9542a0a56bf0f88670d8d64d464a99f94df9ae17ebfe855798059ffefd3465862250d95f43501eec628ab71bc8ea79fff8e663f7f79960f37e39056228cde59d1f14b1a423140c29280345d7b1303f2a37e8a042948aac1c680887d2433e630ae75df6d6c647ca9ba444df1bf0693e8da53f5d01fd7ccecc533b69d3939d6ac4695fd587127da1f7b4b65290f35c8b16998df9dfb4df5bb76c6b9b94c82bb159545bb43692dbd040f092b5201f9480c", "6553", 0, 15429380, 1537743641, "fce8edab0269ffdbf4e5be4183b1507230eef931f1e287b13a93efa88d906fc1"], + ["c8e4a42d046ba593ea54d55fafa72694189a61456f365474cd3a4934d48c3c043877fd146a010000000763526551acacacffffffff2f0ba5d214faecd8b387e8192ba11f96f54dfd49d6ce04dbd794ab728b3e345901000000056a63525352aa924a36bb1afb5dc68e016baeebab372fc3d0d1d84973250cfdadfe99f062cc5844b6300000000003655263ffffffffd72b31c044639096cc0ed3a0c606881efff36112a821fea9eea0c7cb2c3bb9e8030000000465635300c28403e303f2d92e03000000000252009d81a302000000000151d8c57200000000000165352e5c3800", "5265ac52525353ac52", 2, 1138111481, 0, "b267850e01e0cec4aa2cf21cb548b78161de6c32619028053792501f52d79c0a"], + ["030000807082c403026f3f8b4f48834c0584c774b1e01bbeb3a4b59d61e78a98df3b8d4b38a0778ce000000000096a52510052ac6a6563fffffffff8859108bf442c1f76907ab040205861dd7be47b262fdf6fe4d3dc4d9f36f96c00000000060052ac53636a37133d69020c224701000000000751636a515363ac2baee103000000000365656a00000000959e431a020000000000000000b0fe640100000000071a48b8a4587f2a9bbca6935faa57c19f2730a13341c1b348ff64b7e987ca525ed8a3f62ca03d5998ab035ec69fdf97602c3dcf92fa66d965ab6f274ec3371a6f6cee20c344570b19d82ce16527c22313494a0b756de3377953c190f393b279000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009029b9df2c430fa1993fe8903d6c943517dba33e214a882d2c167a2c3e36a705357fd0d19bd81d76ee6f04c1b8ce25a7c6139a796cef47498622be71eff9eae12feca9b358f18ffcbc30df11600df0eaa355e4016c687cc169c64fefed9386bd82f445fdfd3eb01118adab127509f32a3fa1bd9496d0e45ab12e82e83eb75e960317cd5538e4a4174c279dfaa3566359e1a83852a398778ab13ce252675b93cc550208f08cfbc20e3d972476caa41b8ab0cd0f447f0fbf6c592f86d62bfab6b330330b04afc417d050f7d25123657b31ceda32545df3620d3bc8e59d8e175bd042dc8ecde955e26bd7ffd546d79b2ba21e462f91d3a104181691ddf9677f7b49bd18520300a90e008382735acb96e7e200389a4a4d5c58e5967eaca32e6b831c0fc86909032c95db004ae084d7030de66db3f4e8e477e8d58cd93d5184cd86873922bce79202246f4a5d1e2c172d75b9bba9fd91480c2663c2f230fca420a7a4ad278509b655020355baa04e6a7d5f6a717269c696c443dd50e7a3c7b83218804ef6e5aa91b9b80213294d3481c49b741bf442109e77650ae1a8f145f7362c95f22e181bc56c9942d54ed31c2cce22db0dd85d73a47bbfaa7f147fe597ca42dc5adfe913a5e6a4cb3973f34e62580edf7cb1799444677c4dfccaa848db1f73512fa03e7fbe849f6a1f383c75a4300a648b866a858d43f82cbb7871f3d4e50e17d05af35a211a5423af008ea67d87f6725417aa7692237569b153dcbf87a372f58a1eef35acb85c45b2cba4a44034dc9bd5cf66d12bb48ae8cdde3106d32245c91c2527659374a7c2df4d8204220df36601d15246c2d626fbd1eb9af7340285bfc91fab151502820c07547b2d5f268f421b85b835e43da4e5b9376da801ab3b453344bcb955a9db58453ff3dbebf136aaaba32a1c411d3265a0b40d1562b51c0b820744a335c08267ee12c8145cb239c1249ae79a31202dfe33176a794ee7726ebafc2eebc325ddcbab02071f4901a0b00125eafebf55e70f3643e7dbf13dbfad507b0c24203a4d82f14a6672f46fd22b35d1421aa88a27a30feaa36643ea2f36295cb2f3f0b5cd9fe1b2c6dd59d87edec5efab9ce09a68337fdcf8916f390aec4b3516d555b4246e0ff80609d88d7cb2d20114e1b757e53f5262844524af16153ebb763a027344bdd3da239dee927be4a89972c9878b220b371bd00b70c5ddc0faf0eaa35f4c8d4eee78fe17a6ef9ef1f5d58f06b59cbc3ba109eddc6e539ed35959c468007c98b35323a916b7432048af62dc3a989a53b8ed6f07fa06b7f4aadb523c8f7528157ce609deea40755970034d8df82f9336a534913b572a8da31370e9c79a11cb44e060675eb324a9706e89450aaf7a831974e44797a1e3539a0543b4c2172bab01bff7f8e13bf5a84bc3cf2f5755113fbec260f8d97476870ade1493f73cda1edb3472282ae8a78a278f839e2d7168c8b8f368c7ed6f804e4180c9c46a6447c4db4a56b2766fa5694131471b9950ac3d7a359e4840e754f160472c39bf25cac57fef6bbda5502c849cc669a2e678bb2818e44fedd7a701911fccb3713ea93546682c8954f72be3d2f7a3491a91431803f033063091783b977d704bf7c3e3fd3c5d8235fc17ba46f237439877e7da54997383317dadcdad9af76a4819f1560913fe055ce3b6eb6c5fb75752d80f25fae16b2e263523371de8b1945c145e5ea8e01213b237c7be66a32b4fd3d864491e19b43860bf80604e01e7fcceb2b477269346acb56d7f140b1308fca11dc7f7f77213be3bfe10cb14a31dc388e3e3d10917fb95109b75872198b85c3a4f9d876a29c823a305570d6b49f2accfd20d5a787d7c8fd661f28d87c432a2e6134e2dbc816b315235889f6be28c507e29f3d96c56a31dff02aaeb1480a5898644b904ac94e9e05e539a8f08ff9ed5895ea94417cc3f75ff45859cac964a8fcce4b3194f31ed051895c3c43791f52acb1953f682054cb3445cccb859ac2d9f991ab00a9ff99a5d96da8db9869b4a610c7ea4d336aaf26bab59adf3fa4ec4ad06672d301ca0379ec4c317d964d9c080f3d4ce0a21caa608c89bb824abedbc6c9dbd7d518b3feb8c16fdec69bc5ed1da8d179f04a7b009b5d58223c63dcf18f61707768249d6d1a6aa05a764d00e1b62ca57ffae807891849363605237ef4234107ddb412bce623044ef4e3a861aca48f5b1eb7bd097bf3c01bfe35ba191913a80ce4b86da384f5e90f43a4cf8ad98691030126b98ae14f8728efcd3b5e00a768f9761dd4d4a4788bb4257ca1d04000000000000000000000000239800b727480a70f4a329c18fb4959b795b9a6cef42e89839f02f155069b1089d2d464b0e461254412b5925e85b93999406301731dd24b6132a8437d3792b429efed981962d793c28f262e533510bc50a0c6df6448ed5050f8cb7b4469f259900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d8946e5dd09b31dd270d424f56c33fde2c3e43640643e945d3eebe11e189dad9dc01c1021bd569de5574433b79ea541f7dc908af3a31d42e116ad12575f44bd956196d48676986e49ceadf9e98427905f3681d6f046f44c9686f0793315a3836af90a1f5ec14fa43e4c0f896317fd711760e9142433703201d637bee649a0e44032cb34d4ad1e2438b4a938f2296dc0cea590ef9b8fe9cb1b1c90042239ac7498d0219bcca3f038490dd54ad4c8c75cee60963f0fdb0bfcc78d09b530a99681e21c10a08f88b0aaae21fdfc89bc7298b5d051830d709451c317d5ed2f00e8ead6b01dd8673721d871c5315783d5e4f0844b514a959db50bb7b8fa06e2a2f53f9a55269021b8fbacff215ec8293cc3a334ebc3c3220f6831789506e42e91ee204cf230be3022b8a49b3577c8064cc98cd587e395eebd1d56740914671c45b74f276407521920320b32386c252ef3515ba1dd2278d927f8a1762804c549c2874587817ebc6b31a0325f369a580b6bc6f6d4722bd31028ec935173f7887b282ecb152cdeba9829184030c27407498fb2aea9c0544525f8bd3e870814974d79b979f8fae00ec32eacae750f25d8dbad75a27fec3b2c200a2cf29a59fc218e33afd0779cefaf37183bfcf03c774a970eeb9835974ee646abb3136675d8d696f4549db6bf5abaf92bc7ea6d1f31a77cb1c81a9b7d1625d98513da64404816ce43df25e0cb10f2a3accc4b9d9548963f61acd3e0b1039db20ea18a9d4fbf3c3a0d7bed658ee7b328008c277f4e862c4edb736b58895fa545085acc26a8f6ed0d53f5bc8e9ab3834edeffe8db67af8b0b741fe8d4551cf4c02120aefa432a33e89be7dc661db55539d25df539f143f72552106c8c575c2af9b9cb793667387563eab11c57cfb2ed11942b42d8c72e5fcb95354ff22fbc26ef9ed58bbf148915750fef521752096ad8cb7a271d6ab761522566a4e7d87fcd9a0c272eb4f6284f165249ecc1c382b6174b58010f166634e5696e13f79b7dab9b92542d94563021e56edc7faae44970426e2554d79d4baca4149de739c03b363d7b3524e97afde22544720e903094a45f8f46190629a34502dbc091fbc0c86f687036d24403f82c0f1673c978d673198076d53b51ee52750e04b873fb9a59409cc5fe37d13d2beceac8adebaba4ca3a46d434f0d8c2334e77ccd21e825166a392fd5572f2aa46f681e3014a08e49166d380a85ef8216ce04c7c919a2497c8c7e91da18747169089b7bafd110a53f110ab93cb0231c2f1abb3c7ffc4ff97399edb40964f35dd78c5c9bad140730c28246b591fb13000e81bf5a0443d32f9095ad0033bc73c44701d1746046894f185fac60eca65a9c77486ec532e3ba2ff7967addcc99dddde76a7d7dd6f650744bb03db6f0cade3aa201ad75702cdf714aadf9f3abc75b453c63842cee385aa747a31989d5f4f2f1e8ca001be0fa08a9e53f6a1f648c12e9f9779fa7c0a0f8429b160a32ccb20947fc50802fa1f79e6e1d42c8f896820404fab27b68be2b607e2e7fcabb310d8fb5c0921873063184fdbcf72a164c9dca4ce22152ff62705b097db79df7f01720564f24a9449360acdd0f0128e71e3f6c3c5b821416c51c1a00485680e12c7b08c9163d2a051662544457fb2ca76c30ab66a5a639e229d943f6ec29b87481324c7ae042d64f0a811f8def38a595c509366a31f7627d726b381c1d26705b991830f9f8dc1765ba4520efc1a6be02967ddab6ef5d70c184a53ffc58144b265ba8188036dd4ffa1aa9ee57dbde42ab82d947dff36b55ca76f2fed6d013805fd12bc252bac60b3bb293d863695bb5c2a65f605865b416365e6bdfe4c5affb9d4752d900faca6947968f9b3ca2a9e2018d9e1c310cc448299f2b984e0146a37e2a406d3738a4cbcb4486dcf9c7a6f1c35ec4e2361fd298251c0e864bb2b25a8fd8194e00cb2dd8ae93111f2bbf826a57d54307e46b11e6a4dfffb2dc45ab7f402ce236689dcbebcf925cbd841423593873bfebf7db1ed9268eed43976c5815ed5b71f8369d4c9c43f008b1ff378fa5502be1e0fd8b742b5490258a818551cb860e8efbe31d211bcd0f715a191046b111b2611dd29aa8280ffe789ed5dd163a7daf97424dd0de13b2d2eecc804890bbacb86deb6577317f5a9a51941fdba2cc5d4727c3f17d909ccc6270dedcd6fa7b561b290b212813d7e56891a2089bb0c72cebf4ec6639712d1acb9dcf00c2b01ee4463f1bbef56c7f7f70389779a8fe82b0466a04fb574e01ebff93997a8327c0f399d5cc286d61fb00ddf158fe3d3bea45a801d5347bd220a3ebd272232c4c6689fb17370da669cfd191021850f1f084d0a443a16c3074bc63451ef032ceec1917c966668e1f4637a7e49f693fc9ce755ebfd83269b20f131fb8d0a6708c1095574aafa2de0e", "52516a636a", 0, 199380110, 1537743641, "595e97444224858d12fb151b25fe2d1cedd383c51e4d0a513c17819ff00cf0c8"], + ["030000807082c403037ba50e538faac1edd8700342c0337be49c71da640a8c2da0dd2ed4fbc076e8440100000003ac00634ed7704f9927bf4ecaba2b171d93aa82b83744e153a18b09abcc5a463e6d0a426e2376d9010000000700535300516a6affffffff125889fd91632080d43bf206f04d23be90a5c1733925b33b5ad925c6019509df0000000005516a006a65ffffffff03ec2a48040000000002acacd647720100000000066563ac536a0041d96d010000000003520000000000000000000002de97dd03000000000000000000000000db3e4786a80a7ab4dba869216992d20b43b6d00770ccefceb0f8e4ba8d5f07f8a55b2ba8e702bca208720f3d7a1d2c8a7154a3fa318ddff25de9ebb3d243f17e91911c4798759d852dc4883475f03442922fce1103a58bb70aa5ac0dad420f9100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000efaad46eb45df277f55be9963bdc5fb2ed2c4206b619fed3df77482151218744af3e99536b8bcf4d6b0c7c7ef97f52f2525c463386ce9cf63758226d1335217742a193cf83314309614955cd244d718ae7697cb1ded3017d6ba4bd144e7aba0d72f4546e831dbfffdb05a6eb4e07ee58c1f3211c33e28af59b6c079aa8342b0202268895439a9025ea654820d5f4d933778d597f708bbc5d7232ce73aa6d57d18602003d08318e9659d5417749ec88c96253d31bf0110a9f26ad7d5ee8533a1b95f10a06aec2946d99cba33cdb8452108467872f542db0e19503ed48a0b3c8d6ad56c65d4dc39e4e8a5dd3217992ba342b5e6d6508180c191d40953019e840ea10b0b3030bc9d57c1b45628cfe59d9991f641a999f049e6e6e64f5fe8ab399569126e1aa03135d0d60e04178f64a4dcea4c866a494a11db71c1dca8a6e1df3ef05dfa6c7c2031a5592513ac680fb93101718c884c38f7f380a90dcba2b8c32149945b864402102265df526fac35a2ba3130a788a35bd90f06ae7463cf59575a854a443f1e8736a03075683ae7a0ba1e4400d8b81320bcdd02fcbcfd54cf8f1510c32c28d3b95d5c0fcafa523cdfba92cdfa9bc412409100a0ac8d31d728825c35793c7ddf4aa299b6fb80bf78c107ec4686e45b53bfc1971ee64e3655ebb8a08d7eb1fb922670ca7cbe8984883e7223dbf0e23e0e5e4c7fb2be4cd23b4017607300d45c0b56e728b02b10746b75680d714367c31611052f776cddcc4c1942515ef39fa644075eb3c26e06c77b88f4eb54049c281cbe821d7f390698dca2870a37e37f9afc625e669b4fab32fb1b1db44cb4c9a2f2dfe9ff784b838ac7715127fab502753b44f63efae1c458153a6ca881cbf1c992dc0a1013c4160f11c5692efaf3dffb5ca07e638bc5ba567f150df9ac29bd09d72cc35e2a807ac07a3134887a87417f76aacde61bfb03f9cef1d1b43148b6cf3f24a1de1eb4840bfc1d115d909fab28516d8375e688788338d881e4720ccbe6f861c71469c10da066efa791d1e6d6f5b401fab47dc2e6f6c7c4222d5b5103a7c397087f35ee4a2bc574d7a5917e4d9c47274ebcbc03061ef86f8a36ca92b62d1b961988d6016a32d94f979179e83f740a78c1be15620d44d0cdc483d9269ba7d9907b8b9602692beb01f6d2761a6232a7579a8b3da7d99921f3a4bc259381466805b39fb43a2e1c910fb3fb1b1952ba9390471a344ae29899c1e9928789d1236817f021595379b851c0f0c8a260186e4c4c9c13d320912b410bbfc6e7d88253633e051e438140e44c3edb838c7edd29b7309ec0609a457255e836843849c27e28a9c84997f32af91d9d16019604fbe9c0fd20974bfd302101de15c170fcbf23ab2c2313eb34907cadc96fba18ebfa6c82c67374dbaf15501a43b186b81ac75fae6a5ad6b162feb9e88fb7f7822adafe778b7e47c6ca05d6070cbc62178ffaf1c3458daed82b5d1586d35e5ff4f088ec3b30993fe32e0d053f4dd82c0eb28f1dd5dabcdf2a37477b1fc2d897be258b297a5813c2f380497af4ae99ee3ae030ce76e4cc26b2a9d5135e14fb1618ccfd86c313aa83e6341c3f78a2ff890a9507bd1489f44a1fe79e2f9ea4e46c3cf5f7ca24e253a3a55a45fa5b01b023e54acbcffa06cdce7e1a86c9f290e9eda2b3191a22bd5a27430802de499b626f2843b3db8baffafeca4077732a6e0b7424488c60445f456975e4c086549c473179e1db7a6cbd31f17fa1f3bda68b73aee13c7b0284e795d2bcf5653ae18533a2455f8fcf5ae04d0647c80980b4f6a73a29108a97d912fb18579c41d5d790e8e410b5064be9ae7290680d36de8bdc078742b643f3475ab24d4642c255e7d799027ee1848ed4029de3f63651d6b982e43c2b151c77ec85b629bb45d003991144934715991832008caf0ac81440d9b7ce9da0cf76e6b23595ad40bc568f2a35b55b3d8e22575ccf732b8c1ac2c6ad5075f128cb7648ec6993aeba4764d93fa7baed9681184e0b9b2f5824ff46ee0cc6770e8670cf25829adf3aec3c8bb9435016eda4ed1cd06592238f375af92e2b7cd62f1351251e32db92a00a69d04515c09ccd9dcd10ff1471cf353e1352664b8dacd33299c91e75f21534a639d2f354a75d301ebd0c6eefd8b9a9b3290e0ba1e44344799244bf8ff96c8983d072b48fb1bf0a02ccdf29ee2e13476d3dbb8ad16b7be7a95ab44286f99b860784794d579867ac660ccf65fd03fca25ae72e5b101a68ccf209f68e6de65f7acfcb05f7c0bb19323ee6f21ba2223883179680ab25f00000000000000000000000000231a8486b20dcba44d5a8e3c362c62154aa66358c6f06c6c43da838456921a6796bbe195c222f59a18e31625c7a687df30cf98afe5967353b5044faf8afc7a0f7655c491a6b27cc177ba66157f7471a7d7b21bf29e20cb08045597ce02ed385400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e6d6e7aa3f9ad43c6674759af09ad633e2d9e46806269fc4816fbddd7a928b5f1303744d378fba95d2f373d2085c94f0f29580baa42ea59fccdc41d08434c35892fbf294b9b85ccf59c48c34a42b625157b5f92e1fb5ee94d79e660fb36463b259a2262ba42bf9cec7a2726536886e3166a1e3c8bc3f8b7c0fc16c62aa5057eb030d04f239e1ab227b04c6b6adfdf757c965a325186f7792f0fa89b689081da00d02015e566a405556f3c1ac1dc59e519cbe53276aca213155c41a91ac3f0ab1323e0a0310e77a270af502818633cf5a7e98607b1a91737e82a16bd9c129470499c49f58425dd0fb1777299911e60b435f8a0b649fff17f8a0b3641d733e965f267e02022f5349628e462c68ea7286d796629ccc58c83841589b28b4620fc508f68b9bc70329ca4abcd6d9fe9b03068c3b5a2e4303863d9ca1740f616c59435f809d844a44021cfb81d394d560b88a5710503255a8acf60b058fb2862b3e548d1cc275c0a96a021a7c4f316062c8b2dcefc81a3808ff7df96526b72c0cc77a3f23723b309f16740330491ded35862d1bba9e99da25f5a4ec2a1b15ff85b20dbb4fd6d5a957d71afbdf1f4391750ffc7746d43b5cbd422dde68923b72acc12d5c5183442cbeffa3d2423884781112001fa3d5e4decc3da75ad435df61c60433ff7f3fd9dd1438db915a0e5bc2a1d5ba173c1aa49f435c96eadd81ff6704894549e969b4f3722227b8c2aa4a72dac06ec428544938734944a9045bfece0d4910fb470fe4bfa947eb09b919b09dd6bae1b2ee1b1b65d3bb260ef2ec0652632636b2273605e1a23897ae50e00c1d7a449266ad17509b2a491f862dbbcc52448a012cc4de6dc21b27ef4632fa09318513955c816b37b2666e036dedf60e2d4e4236201da225363dff4893c5765fd25330d16d9f6adfb92673f4b8ae0eb97bb1a81c527a5c35546133a439d9ed5951a3b6229936a1e6b5840603a23126bf8eff59fd3e7202c1cf89f9530914bdaf2575e2b9a4d5c7b97177e3cef5232f74570de1662209dbeeb530735393c7f6699d39cd40b57e4954c24b09977cee692134e55a4139d2e56450c231ed658e833a39f61e495168bd4cd9ec20090d93533c4101b479eafb3553f921da0d8b9d48d661f7492cd2689bd6e3e35f030e65cb41f0cb0ec5e8f17b0fa7df4dcc4599a1c9c2a4dd569923014a8f826771bf99b9ca5387181e72b1a1212760bd311729ff2f443141a791548dea00cb0766302f050cfd06a26b739b918114487110b685febca77cfe87c0c10b86d75ed38590d7c0234d42d0a9d542a5ed6e506d55d4646dfc31a331b0b256983183ff2ac4c79d1807b9a4bd8ce5f5485c9628f3c18bebc8bca2af715079d94d668037657a9dbd540f11dc2d9866e0d229c179a681383b9fcedc96c45977c13e0e48602e00e70982d9d49b5654b3192e8f881d3cae36e7fc58b4d0d81a3e70f03d1caaf8738cfa62c9a6462f113bcd0b630552df74cbc8be4723837c61b8861ef99c913b8c148a7712bab3c39f35ff2d130f9f460c4b7d7d7ad58f790ae67f50938b74b7ff8f5d8df1adba08ab3bdbb92a25500cdd548fd57da121f9ec807c04d5cc6c02321c32f258d29e0008b846656a0402ca60801cca6d884f294b82973831167cc3e2c8c5a305f149b7dfdcdc414c8dce883547c50e1f6dc7377fb880f499b63f357c3a964aed53aac9a3360249b16d81a96eb580a56951f57870df605722a72e9d2a90d6c890afa31bee679768a22788f27960d513cb271ccae6f14dd7fdd192ee684d6143aea8a318ffb06f3091493e269697b92e603985af92408a12e9e7da2db16cd46148ec5af3edcaa1c9bed13e6d7a9627bef0525ab86d73c635dc69f31c536dd32628e57839a0fd13a09f2a54577ca4f73bee8c0183844456d64e3121056442307ce18dd57fb7c5a8b0535be6ddfa5576783f238a934658dbf0040ee2bccb35e7958ddc124d0d873d8bb4447902f8978a6ca9f62e0eedf95caeb4b4e0c4bd4df5b75c8bcf245a84fd152f095cad77396e729760ec02ad01902c944a7636e6a4521e52e7648755c0bcde504b45579d80e7b18e3a0f6f7f17cd58aaee5e5679891cc376c7439d3905063668b13e73dbd491cc3753c68cd9325fb91ec3affe220e86c4854e8487f058fd4edc074a50be685b4bc2da327557772bd482bdb3e46abfdd025ad87541cb6f7a5ff2877c9161040eb3f0ae4da1bf39bd13f19f09b45ba6078410befb3560445980eebd0276e532ce538c14c70e0f0b101485d775a1c9b818d9e87d2dec74e4e85a1f8e7590b0f58d5527cdf1f11ac4282d999cc855fb29d97649b4242c3cd0ec1486743fffeda236ea12bb20392543fcf95e3ebadda9bef4a83299d83d1625a938b25eaf718bb9da1f4472d4b4240931035c700108c830460a", "6300520065ac", 0, 425718778, 0, "c974bcd40f64f07f9406ef8039aabd946a0fe61567883ec1d4d6b1c08e02da53"], + ["030000807082c403033b35f0bf2094e3bcd6ec98198c8b18ba71784a57f2237515ac5b3bef97ecfc550300000007656565655353acbac7fa38da3046dea273a7ef42e5c75163af3adcc2789dfc554696d11ae62d13708f575200000000003044c74a7641900d6765c542eac075858635b38c252d4b78f1e389b3a257ecebbb79cbdd020000000153ffffffff04b4f32d01000000000465536a5119220d0500000000046a00006522342d0100000000066552655151009ecc6c05000000000453535200000000000000000003000000000000000054a3680300000000f8726545d15df80b1aaa0ee6de4c25a9584946cba9959cab4568a10198a5d2637cdcddd235d1a9b4a9ea1bbf323e1a786bbb055c4279b728cb9ef8109d7a2c08792e874f6bca095cf51aaaeb7381f457d2c90cf5bd6c7ed77a9d58e34e818bd1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003736f8514939c74c46b73447bf1923b25c94ac0d8b1246d855cc402c621b4c4ad780eb1721a9482c77290c70e452c3848fad0abd796b11bf0f36b7d9524e79106989f075b5f020e0a5b3bbb033183d39f1ac00f092628d2e737f0fb5057d606e18082bd5ecefd9adbdaefee3f8f12def9af52116043f901636a5df51263fbbcc0308d75fe1cfed7cebbc005189640b6b669148a2bfabc42e58c454ba3df89f7a480328fef2783d5cf81105fbfd97689189488c779f4e3588b02badf8bfda6b062f420b091e6e15daa2b121e5a9f698d96e9382386a4347dc8206bd616cb454d16bef1e09937b9b36ec7257a01b827a94b707ee4fae86ed32e8ec5f87fe3a4d3af01d9b032aec4a7c88933e00080e2fc7b4aae875e90678f2f18b093a04cd8c3e4a6a8b2a0219275fe022c014cae92ab6922106ccdca9169fd0d487fe87b1d2bc258ada96d2020ebb2cd8ec70b6e5443e23920db63c9d51c854fa3f33357ac1d5a91f86a8297802057e5c4d0b27da01a757e18517d3321b55183993a742c5b6f39a551e459a5ab40327d1f1e3aa946d8fda425812689a0805ca792551f222730a9093eeb7093b0153e13cbfd38efe4d6a451600ec95fcc07dcddc001b4708a809292753ca13d6e87030330aaece04511abf298509d47503d1f3a50c1480d1c2a48bc02adc426ecaa0309b4463fa9a62fcc90b7ca97c44188a4b0237c0b229e990eb7a4a9b9203c0215b5a420cf1bf78c1871d0fd9fca5a722457930ffdbb4316bd0fa4e68431f58abff7b2a9464430790521c196f1d46dd9ba0b63e11b78a351ba1d02b9e351aa0c126c07331f8919f4806980e1b6ca87a3028441d6d16776de32a3228495ef08c1dcddf8cc5fa52ee51c8ff9473cb9b71a3f44aac8a374ba7daae67f0faa0c0819ecc43a0dd754385b2c78e8d3d92c430159632361c53193ed6bd5be7cdb387db1a60f58a02a103dbe9e1907f8e3a60d02905cc8f733c7765ae6cea00e60830c3954d3a074d61a944b1f2cadc4b8d9b0fdce091c2c719f068c514baf202e33a63aa108a51022f8d9db35c388b258f28e8831ab54443f11439dd0821ea106224c176e37f164f59fa79adeadf35d536f49152d80d86e364cbe6a08d32387f56f5f7059f0f0f7527a1d362afe0cac734043b107357cc2d04c86af2d1fc4dad7dfa19b781172cb13ef0f199f3f55192f1ce9ab042b421b33e3c61dc919f8341ba831df1f95802ee0bfa7c2b6be2dd64b8726a44ede6e4825c622fa62667688e65834dd75e44f607596c746743f0cfbc87798a0501d88a39141fc8a5ccc2de78aa31dcb6b5a731fa37afd86c0090869674180dbf5cdf8b1b175cc7f7ca4411521157e4d9c6a6698fc265e3d0cb7c21916ac8695d6f67f85e994b7a993844b1b02ac2295217b99e5b51bd5cd0ab36263da79afb9221cfba99b2511c28045f3427934c9d7be5f40cfdc9ad35df9f83892b5fcb689474602e11a84bb9a1c3050be78c9721251b7c7141bbba78f15246f96f46a782df72b4684b369398aaeac80cd621e669b79cdaa83b8a6afede64c0fdd1efa194927bd1535b9e5933b3ed9ec7b34808828b976ddada1cd2b1ef957f50a37c9f9acf17b984b7bbf1f8643dd98ac2f907142403fcd0e7421e3073522530bb5dcf187d252ca3c4d5b091d0c101ba42257ab714440a7daa2370c7e5b005d1d198965f96b89d9aa52cf00d067df202b1ed757d8f37c12dcd79a3c29703aa2dfa8ea717ed5445f596857cc9e869e424e8937b023580cf05653ddb32d0910f3aeaaa12e0cd3d164d825af0635c6a9d3642256bd277ba76eca6ad7c25a13e7214bb8ac3a3b87e05482db7294391b716f6042fb973be25adb97b42feb4cf296ff8436a5a654194feb459039292af0944c7a968e0d2d148fa7c3c3fab745d968a52963b1dcf58d1304132c1358a8fd79b15d146382a096f2b10441465d84318e7ac3286f28db56973fd3ab24627aaf5888cf4dbb626c1891de08fba22f75386b9088920fde05d6e45401de9622130cb9db76b89099ff72c139fb87807939cdc50d001efa9784b9b3d49cab5d182b8a54dc75b7607c968112b3ed1bdac26646ef426204f7fb893bf49409502ef43eced07954eafd85cb4cd8483ab8ed70cc385e0974f728a65162b30a3a3be43069fdae520754758fe7b93e9d57eed9e81f78f50e38a80bf6567134c1633dcd8bb0bdc4efea0ac1b5f4456c8ffa4b91252879acd0e12bd909ce6f0ec2bbe2f9f0a0e2858151054c840a8c913cac1b44e3f11802d63274e81d2f456c20c715f04000000000000000000000000cd385c646cc39a34fe5da2b87f463404664118f1ce1ba62e3258be81de1113f36be36a3e309223bd5f626ed380b7b72355ad53f2df48ba96ad7a6f8ee4c9ef93eb2ae5c2797dc9342e279dff8b15d6323dcbdb6988bb2e37f237c76739057d7e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009b7cceaca11911b3f1aa69d372297847928b06ab2c7b6fc8ebfebc57b8e706deb5c1b93114b3bebc9663b3753fbd3ea8d6ba0d243cbc741a959e39c350ba56f87a8a68243416741be462d11c8466dc2366f2f346fc3bd1b633413136fbf27e80fa2d75a0fbd48feb3916ee75709cf708bd1e13037597659d09e3d4adb0a2d745021f1fc49e07f0901bae7ec8e0eb1637d1c53a11117f93e351cca2a0f51aa30698032e49fdab2381152aa4cbe7fb797ad809a5d1cce96cfd62ebf09372fe06e79a050a067c73306fe2de38e38dac88f2c801b37baf0b451cc1048447376b0e3e2b7c7b7954fc94cc165f6b731b80758bffeb9562897e92d1a7f69acea01c371b1a71c0020ed1925c77cb317267b9a984f1b45fd2a6aec6583ef047d79ab3bc0c422adc45022ae3d8068a74e52aa9b4b19f7a77250824ad6eadbeaeac8425fad5dbbba9c6b503189f7c615ff22d841d31d3f0cd3b6e635fe37ff807cfbe55a95bd0add19904d3031dc17b7c1b5c6e72ef53ce5e5d846359fbf69cb8876580bd2d7f9f2b2cde657002048d1c8a43301c1652eb775ce09206f21f4852563dde62068710fb45c170ebe43b8138a7566feb0521bf6021e3c7c734900d7a4937e5f31e739225a38d1afe8be86128718f9ef75cdfabf0261759db3128ec727f810d8d44e5d7020da8f8d8789e4f6abe2c875013123ec7fcba066179caeed3f245ec916a991447084a4fb5364f9906362c01a6b84fa003549e188acd29c3d484aa096079ddffdca929113ea4c49939db729a228bff0446cb36f0d06e29c75225b127ca338b04996dc19181e80cac4ea3c953636a854182587a771655301040ac0e50982f10bd08304907ae40ba05ac8bad7932f75cf4433dd73b2fff1aeb52f2d084027d67603b80c9c9e9abeedd8657528317f2d30964e503a154154eb878c46662979b952914d247931951b98dcb07015ff5805c9668bf8dc44b0d63c1129c94399cb31b1ed32a60716b7228eccec42d84fe04cc8eff4ff9bf79c243000d206282ffee1a40b161ab3b4726d09ef24c922ab3557ace81ef1b9e4133b695d85736a137fe06c0b07947b7aa694f06a0c2d2de4ca53761815bf35ae2035e6db32bc5ad07c22f2431a8f8939e1a99f354bbf5a1b4ce5aa18bb84ac64f2d810ffe02e947ad9f5f71e824317d777783fdf4e4810900d0efd28be0d2b4f6ce3c95dc7e2e14bea85df9a435ce7b1fb82df3c6a82928443b20e6f97757f1ea6fd3d2b685583acd84d12fb59315fb45f17cc7c6e5021d46a03104aed2f966934a95a2dcbb9f6f1e7eb206bc767c7771b47f91dba3cd29e59f24d2d0375053ce928fb290fb67a90df8d33a7849547f336c6b451058b737a8823e88dae1ad56a0c31965edbeb5db2c6499c44a572465220506d91dc52a381990e0e2882534056969d526ac608f867057112ca2ea98a6032cad777c773a65d4240ad101c1c81068952a0f40c0f1de18447d3beee303c43f573b4e4a68ecb86a52d22ac5cc0533ae1d0039ac882a1d6ff6865086926ba7996069a5cbc87d876047c325b6678cb5fd7337b06fac18eb5d923e367a95134534c129fe96e4e70a0fceb4fac5b34248efa4fad16209a0ba5c2821293fee508ff3861dd8abdccd1d9fab8193b6e9eefd406ec9a9aaa9bfa0083f13ce4ec7e8463ce99a3d5bc246b14c12a5d8d91c68fb342f4d7b8eca21eee939cef0143f11b8e39a4138d26b35d3cc6b2c880c98b59224e88025bdf366b274c1ad0748b4da60739a8dbcad0f7a2c2cd34775f9b20d9a0ac8de096f7cc81a33a799574f72701f2a5e3034d1ae2deb79ce3e13b1a5c11ba3efd37d7a9734e46d4cabaafc0e251067d72f3a7da1197742d776f643e064c66b57001d20918865f4632d6cd319269b2be6c5b3214b7b21301a4280b1784eee0b9fd31d7250fbc6165cbdefc31ac9a0a2cdd85c13d24c77cab0fc6f40136b8f1b8b470c7154149eb482df836ae765e1dddb0a1dd8ed3c083a0cca2e5ec67a705f10eeda93094286387746e9da91e0bb645d37d6d495c3b4ef9829c1138800d8a49f5b2373d5fbfbccfebf78aecbc5d523960ef4b39284d5b4ebfe244ced3debb216de934fd644856c842fb8f5a635501ade98cc951d2fb4953fc56d7ef666a84edd8a50fed1076b2fcb6a6b6189186cc4b03d21f7105f35811023a26e982621e522846095920362fd180327d518cddfe932f65da6da21b1514510cc973265e2ed206f2afe741eda64d9906bf7df3fefa7c1f38caf65038ae9b5d0b9f96f123f82549d660000000000000000b17fd60200000000550899089d0eaf15b78a1ad1a17b381e68183ff78b2be708d8a823e35e244423db540cf9dbe2d3257757712df1fe4b4582d15c9b4d256f6f43fbd1063c8cec5fa948df0d7b03b7cf7c688f17929c55f69c8b8fc296c50acb22d07a8548320990000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e1bdd929aebde0b4e7bf706e195397624039e44d07a8cb4c7c94a0c5f0a22c1a8418333044510179fbad9784fe6f77fd1d08af05d55e3314ece48b6904aa2792715b8fb2418802274cf6f868542db553a242da825fb11cce3417e9ff4b9cc76c8622d1e1ce7bab9131ca3ecfd49a5368db03f285a8963d002c22b1fb2daaa6c0219ce0c0790673dfad6b3e93bc39d2b67a6f9b74b9da3a080525af5eed9f422f6021daa2c8021cae78f7ae7e1617af3f0244a2e968c67f2af95136c0544ae8acaff0b005f3c4319617120c7554576615a0b35e9ea3bf04cc4ddbc77742f139607afc103512881faa3a49c72807c70d1118fd623b23aed87fdb7a08344f64d0cfce6600306dfb372d952ed0f2f04635b0ce01c761efcfec6f2b9035ee59269ea433d5b7502178e5479524c451cd1ff2db0cde07518b2da19809c7ae1e2291b945500120edf021d6ec675def2f02f43872160ccbf4fe71689e8ed8fae2079703aa0b61cd3557f021c3f47bd4ae16d19433fb9561e926331ecd28c4c6e2e06172cb57668989ffe42022a2adc46714f76cf0b050b195a7535180692f643b1b60bcd4b9cceff0b8212c5be42a417302f759bb602489a60a63378836def3bf88d40e39e3595382c71b08924a3320aa2917844f2ef337a77ec536542ab58bab7ff8a262646c9ef85503dbfee7ab33ff08ff48a4e0bb5df23ce3a86648c40faddf992b712193471fe86d62c9033df5658199fb2490a5af4443713d29455d4d00b97029589c5d4218819a1ab9f31a91ae80452d633bcdcd0a6753178820f498b501ee9f04e1537c93d128a58bc84eb91bb598661c8b4a55bcc7a3bc0d9580e3b5516f59c2abb196c349a49ffc1542370da9886b1fc743cadb98a2c1a1134e97e99509ce01f060face67669325939b8f03eaf01e162f6a07a990c857c3253fb613e4cd33d6750aa557d4c902dec9f8f5cda25e1ea0dfb3080340a898290534195a6ecb278060d72476e046bf5cfbf44262cf7aa753121d12f0d181827ce844482c2032f0454ddb03bbeb215545fc307381c633213acd3ec274f91e0b1d408dda672797939f39e7601c8a30c98b3f4da4cbf282e77e8a24172349f7b8918171be4287ac96ff5d184e4236c7ed39c66d9a7d68b66382b98e4ccd0162a9ed2bf8761a911efb8e41e803ac442d02c30dc4121e495e37b1f6b2c2f698c0eba8daf02556c5c4c9e0c0e6922c53d7b60bc93d1314fec0fa597385d67ba3d3ff5b84bce97a815aed52b81b336d6dd881e92cffcf475246d7e8a4fdfeb381613c214602c17eac455a4d8170a7a26dbcb1fd0c11bda66aaf266fb9c99e82031f6288a3d339204f23d2e78032dc213a57fb3cf4831afdad40f66063276a2f9a1ae093fc6484e923a393a0198718acf7b16d4222e3c66a5222d340ef8f0ecf1ec26a0a1ca2e38895159c590c00965de331d774153c7be2269b73be4e93539f861dbb6314f271035f3d464eda337c3d946c34f008b477190da4c557371236bfbd8a71e3ae4b0e5ffd8eb120781b77e9d550972bd092498e49d03bf29a2f9537890edc476f4d2d02f3e6f2c0bc16bcf98d802c3d16c3cd5e3d80c69dbb42fdf4583d65673822904272ccba5cec3d5bbd198e1cbe3469875ccb47b90fc9ed162cb329f0973ec298c5619a6e8e7818e15914d09efd0315f7655e7de1ac5706b663763173bd5e64abbfa2bf98d5f099088b3f0cb20867e55d7faac5ed4a18ec8d3628e6dfb5228ae5f4d919ff0ba7a38d5989914f38f31dedb582be6aee96b44f3891e22b3cbe9a74423363977692c1dfde7d9de90205e7b204ac236dcf3f2fac395e8da2512c2ae51c31474e3a5b8c3922ddf854fcbe5e6c2abacc8cc010564b4e5a75194b327ecd42872cc493b499caca78c4c86e467f1994fb1e9000036b2a5448b7738091fa11c7536128280368232fc4c2b9b537d2c56e5a521d1a843676a204e10de86cee692af1e0c353be7cfe1a2b01d1984b18a822de793131fbe05795360069a1e0da7bcdd49f3e4728b32a1910e17997a4170e0858a845ad282e025cc03e24242193c0dfc3dea8180ce3f9f42ed38d1d2be4b0e32d08e522c5ad1a4ce42c4c372e9f86031bdda558ea062a71695fede0c20ce3255a8e2c6d7f40325f3f7963b83bb13c24b8c7ec0f67a8dcc8e357b534ce3fba3c6464b7ea16c0dd70b4e9ed4f5f1f30e08332729dfea1645a2f61abdd5d5d47876943a611f6f8bfe9ecd7b873765cef62a5329e65cf7b2c2813e742d8b7023ab026d0e04769d24841cb151421fbf32dd1b014393ee0ddd810574502ffc58a206b9ba5083e777b22e6626e467bc0b55c3ff13b86da1f732009d008b85e737fe9ff62d82ad81db50889b98ad0b57a87434e58ba50d23873006c35c56eb05bc971cb9934b6417243ed2de8dd4037b02", "6a", 2, 904344293, 1537743641, "08d2df593d60d0050c7fdbfad4c42fbf9d37e51521ab3db4cfadac87128b89a6"], + ["4b6a506a02a65c165fa41188ec33cc712583cc234620040288a2218a9501793d8040fa2fc00100000007636351656351533fffc35607f3f9135046c2c1971dace4d8db8d07119931dd55c93fc2813defe535380ebf0000000008ac006563536a516a65aba6810349ef310400000000025151b1766e03000000000751536552ac6563cdc1ec000000000009536a5363515165ac0035ca9ca1020000000000000000917d14010000000012e3e9d7d3e2c3c7c059e4cfa94c7c63e378d979c21e2e551a2a6d3fabb9bce235950669e9d127e40db8c648ee7afa2480d77dbe48f702534ccaa2f788c94039d862ac8f327bcb3b07a50c4ec3f01e27bbac3ad6e8cd68fac62ddbd8ff224c3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dd67be699832a975a41234045f0c9ec042ad6394d09f44a1b1e0c27e7d5bd0d72dfa8fcf86e76a29b59ee09a30cac07e324e394b46af3c06d42d383d4abad1943a96855b6e2e0f7a7d3e18a2915e42c11688eb35604f8087ffe9a121eacf57aa3247ded0efaa011ec1f333be4c04a007980b384b839bc4618938e6de6d162f3d032b34cb9e1898c97d3e9fa6c691bb1cbf9b603a77b0fc15b493c47f663dab3a4d020f72181736b745c714345453d126ec8585c263d1da5c9e16bc428105876a1ae90a05bd1d39958069f5da56e3a9b3d52f45a40e66352311ccf583ce781ebb35cc13258cdbc3dd30f7192a8e7a3757a9a04938e7d8f5ca151262a7c798883280592e0210902cbd6339081c002cb9e8820a9dc467792378298d9e1199dc4a217579a27903008a88598b66502a87959e974ded2e6b89b54e1226112f943fe82712d8f82af8031b419ef902085c1e3df16f6be1859ca8ee48a3076dbe10228f9d81bab1f8aae103032ba27028fe99e23b835eddbdd642684fbe2b7e8fb51b25c2e43eca4976c6bc0314b129230cd9f19e3e2768acb517213c4a3d9fb3e068836b8036d072268221f409bbfab23ae2b1dd6356beeedf0c48c028fda9c890c130ed53fbfa4983e56970964fb707c1c1a084c6f6964f2dc5274942074cd30b90cb1d608a6964594f3f4b28a3d2a2ddbca578fe721348f90d7f82273e5b5c32ceb1a8e35175b239796e0c06d230c15fdfa5a705ac8507064fb7ecc1e580ef1b4524ab484020b8a7033e091b667ace5ba2c334e3df85b1d6f7c0c9178b0e6a893e82bf71268e634e21fb25bdc4054d37a5c7c7fc84d60e0edce20e818b373e61b8facb818c9ade3ac53d26928000df02331e000d46607f760f6b2ae01cc4eee809322130fbafabbb81533884e38063f27ff3f218776545cb118b6ba89e9029d3ac349473d85476dc3d1688d8f478ed561e34ac8cb988be0a1757f86aaa577aa86d90d49e1cfac684dbee52217d7bc133955d975d6dc7e6f8e2368b22073ab799dde342b4330560bc61c4947bde5710040f6cecd6f2ec454c562f9f820d4f6ebdaaf871f618ce5f8485de1a0eb89798d91bede1bfa760b8f309a512e90c8e871feb8acbae4340c75204739eee2fe76d8d18bfbb9ad45c44bda23ad44a49054fee7a460887bd4dc0b226f856fe23016bf3f9459d05bd4c8ac85878b6f031c4e1bd1f8257b5dadb68e7d4bace69b04de94c7f61a2562476ae50b75cf7b1d5eed5a41e826a2dad267d4dee9e3a95acea483f021965218b40e8c987697a2bf818a762a5f9d34b51eb8420df42adc600e299ad5150cd7b400dfa011e4f0a446c4861773154f4ce0a0777e6d65767ea7f0fa1b989f511a5e0d07f69e3308ff1ccc09c732c5e92bd743b0f9fc5900387a63ab2265fa907816546ca9962cdf7f11d20b6743175f5b0b5ae94e96d1609983f07944966df917f42f7beb073bdd645032935eea12dfd6e447501b6b4b105da62de502cc65829bc19eef15ac79652d9bed1033ed9a829cad29198512b6bfd3f953344e77129e5868c3ea5175adf1277b7d407cba774cb6e2a316f2e434de7b5f0f62e2f90700ed6d0bfdcdd991090dc7bac1c457d965976a4e49611eec9ce28dc202fe6d4ce501cc074cf890394711bc82ccb8526281f32d0b2b4763d323312980c7013b21a2fbf79c7557fdca73b414d4ded34767f9413522a6e6c069902b06abee2f6d0b1973b6c373e56982143b6ac5a8e10d0dd99e89645836f23bfb6cee52c07848cf2343f990f406a039b69890610daf1125ec6b2cd51431744feb54239c157825bad7de04a586d59e7c91f9fc131c71eda6f0abcd84ff6adce48277ee22ae6e6b59ca81772fb51c496bbc58c7ed6de78ae9c1de0f5523f1942310271b23f7aab96672f5b520c57434830395ebd0aa4d7f3fc68f989557b6a4b536f99d4594d68d87f718c825bbc926d4b23b35c19e3b61dd53d2c6f9a0d2d481e365825a45ca5086df8b8f32df93ea141bb85734b809cb268f659097fb090ee0fd4d42b930a26b535fdf6e48bd29ad179b79a8711cf2905014fa3fc825ce4c5a5b9056e171378f6f54ba1fda5fce512ec7745d279f9289a019fec2d308646d871ccce62392a5f5a89b05144ab5b524e73b004a390a85174b8d61afb80d477db8f3494ac2db143efbcde7b32756da490818a5b3932b0a7447dfba5800867b0cb9051d5e1307fd3d812da67006dbc46b82d80d44fcfecf8f46945d0d9263ca67925465abf05c5a7e0ee3f5cf5a58cf27a0285b801000000000000000075b2900300000000a395fa5040271b1feec5c7a4700ca0af1a5e258f500c6141eda1d669cbf7b257bafda2dbe283ac065015aef74d3cd8c20c3cb4ddeea89f7eabb2ece331600fc33ccf61922199dfd45a94995f76b86ba9ca4d414c996df38ef62a6f9bbcad1677000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ff237823143d1e3a638c3b63b2356849f0ae9e357ec09f506eb15d5f885f2db004871887c81545b52c81af5ad0b9e0fbd329143adbdbea18f9281887c73c29cd2cf176fb5d5680122432c79be55ce131436dce3f949e961f259868eac845f8e59443ed44a417a9f7dcc61f30d21f984f5c78cd953ed885af38a7ee4d0f51f9a021071547d8eba2f09c9cb985231488114335c981a98b5e1986a6b71b50eff1167022a701a7d88299d5a4adff7ede2813c58bc4f5abec57604ba9dd35af326e7bc300b03f6da3108ad0fec4556bba67af0be46728a010b7ff280cc554b462a411bf88eeefefefe6b62e22f77868ff4cbdf572030a2a5fee48e4c1c8db86169abae7f4703025ff51d10943733152156de3766069b5e2ae6c622ac248e8bbf9e8f1e921a1f022c863d2bda1eb58a86f85b8d343dee6582a030ff126c76f5959b6c04c49cc449020fa4ccad256ae4ed7cb5f356fa2b4cc3e7836620f6284c8bcb2b3c7647275da8032984e82c7b069fb124a1953d9f99331f3efec32d55c122916fa51da70de09b410321a16276b5ec497ee3234cf0803e954965a130b5a6bb2ca3e83a515d5e9a47d2b2e71fc23b19505ddc7a259f024c6d584ca1d99de439e1b80799e36385237b89b4d5dff4c8c21de26e78c7c5b928b7ca471355d8e0cb92394f0218dc2127983036ed1bf92c60d209b92bfba41b368280fd42b109dd5a39af923ffa6144547f261d1a84ab314de125102d1aaf31b063a8e81ba424869ddc3bcaf174e06c8396d9ddf008e2e91aba3c8b6b972c7f1e46b83a2cf21f0d8eb573c235d0f527d298013df0fff8b349a9ee5efc4f44cb68df708dc38c9d2ba10c2be9f189faf1cf968159f371ac1f7117fde72146b5af92b681fd59a5952044aecc4e17b164ec21e79082e3e5d38fcf2004d4b4d46c808821309d4adf37504b72f3703358f81ce77db7984afc14017c5a823afc4c7ddbb3afb975b4cf0b37b5354c704db3b8527f075256d3731b3dd3aa4f95c09aa5d58c49fd5e1ac03835f981982b827548254da8dd4d05bb62eccc8d1ec26dffb30dc7a64c18a1cfd4c5ae7f45d6efeb01866ee897efa50bf8c5fb395157fe23e9ee8e1c3bf3db57b62296fc21f54934f69689ae5147374a5a595b1346cf47961d5b2228d141153ceb4e781d1073df4856c1f2fb0a671ef31ab9681a502ed6805aa68a4afedf7ab1b30997971c70fcdd28865f52926b94f5b885524a605016651c557fef879ba4f197dae18d7b5a0f8914a413c07d41d98f34e56743c1c88cd202dc0fc8818f462f354a70e6bd9f9dcdc620ffcaf6e300982367f828d0d3a76a3f5798e6c741bed2fa653a69163803751907106ce73e79ffe91012ffd3bec841fa68a2af7267d013b82b9f6d11d2fe2d6ef6819ada6da8afa8df33041e1fee3d00ec679beeddcaf0ef651757290d9f2b913c949e00e33f78ea5b28d6ce3c1f4e077a7b9397f7b12aaf11595983c3c3dfb782ac7ac988e426c8e7092b00d4591cfad560fc2f212d09d4a3e82596a9a6986db274bd1dccff62219fa01b79c65dad799da4a3049e6571510e743af295bb2cc8329a3a4bde2652e31eb30820be79c9f713190c183d5e0f486d0a6157c2de09195ef29ec1815d1c830e407d4d16913df61772e024d476eb0b63ff26e834186affb62d4c77a7e7d59c07003734ca9a3f6a8983b814fbcf287667ff87454c028b2516a6c46570318115a304816dc2905a7bed87b33ff154d8e206de4826505ac50bc415553791953b267d360df45526777335026fe189630929ec78b1b749f93780c90691fd3866d7157922ced26eec3730d93d4a8dd5f778e05cc0a84c35c7e050693952c3d87b40ce2341289d7e2a84e43d40e5796d8d436e0488fdb678d6118a0a570a0eb5c285e7ccf0b837ec2cd45a64453a0e7c26bdffa3e9ea14f1f884136d5ee5912cd14dc41ab398b380de377c1009359b74a4c163586957292edf4f3254d0d2c07244148205f19c342b96ac2958e58b42e1220a15bc597ee8216f1f4302d4d1c18da1a928973cbb57527654aba9ef6ba684c64f1e6dc11035390fffdfd39f16edcc5c256bfd5ab59ca374d24c6b75e274f48f5cce96a2eb319f633baa741ea9e3e8214d133ee38e2d1539f801d58ea54ebdb88c9dbdc2aa09262ffae968d1c3e8720021290f0849f1e48fe50e162d36b45cd166894bcaf44b059a76ae8327aa7c875eb4e9ec56c557a81b438218dab6a6bfa96e24abf0342340d0c3d353d392ed2327812537b9bce175c671c309b402208685562faa2a941325dfe09697359c7ae91e9804286379074f5bdd78e6ad25db41649ed8597b23aab27bcf77e756b1808d07fc11deafa8d97fcbfc48ee36292b7221c1065d2df1aefdae6e32fd924a8a5a062a6c4fb81167f3235ab1f97abbda5209", "53ac63", 1, -287044860, 0, "33bd0fcd5a5aa40d472bd7a2ed6ee250c7bebb0c68d2841d87d10799a3fca52b"], + ["c835f37f02119f6d7515a85b89d5f534089a93c19aa3aac12a4c65fd77c9a3f787bb1b515700000000076a5153ac5163529f6e342615c5e85e0834d40874afe846d77a0f3b8ac846d290a4aab9e105901d986bbc690200000005656aac5353ffffffff02b69a490500000000096353006353520052516f6c94030000000007000052005300530000000001e9db9c01000000000000000000000000893eca46039fc7f1808170d9a250f77c0fafd7e9449bb778221c46a547a7c9ab83be8eecbf6683b4fd9d7e8a7fec19cd05e8fb43c4bd93efecc8205235a217cc5f7047d4864bd95ce9c5b38748540706e90212fd98964ddf5cae824920c6bbaa000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007c9a7b333c8ad11efa33f33b1eab0ac31f48a54101e975207a355d849d39a663aace70d4ccef82bec844551b09e3cdb6e061cdbc2449ff14272bbb2ba131bee6724a6fd5b99bcaa0655a412964ddfde6457e0286ce7df13617c97e2b63e7e881a822e322fb68ef450a027187d53926adfc5047c621a2dc0969b12f4410d3319c020ff9e7bc2073abfc704b796a757ee0ff765e330623caaaf9c3cabef69b0bf68a03241031c4deafccb94a9dd38aaa7ada90a72ef78b20a05e45ef3cf032140b85230a0423076c9fb7f73e5d629cd5548943a755b8c6fb155cd225f76a82068edd6952236413547158b09c9458dc85adbbae3d42c4b5b2764ca9b6a579342dee2233800200e6e97af65860904b7dfbeca88dd3c7629a403c605deb1372efbd9580981a560322ecf9a5e577f0f0f066e83ebdddbf29478da28c94682bd979dc57e6c263c62c020ecb163ff8a55eac43c8c28d4894567a5dc60146d83786bbf69fabb547d4be22021b3efd99bb28c9e1aa6290dbc1d7e15bc3726363c69f44ffcf4ec016c6f34c12031b44a1af00ce5cf2d791077f2fd6af33323d94e5652320abccb7aa65d950dfed385535730fd43230e13db7cd91f8f303df2ca74dc6fab5ef104a6cbc054d9fc96888c607a827c4423662532e13996d84764f77cc4e4998ce62e2e4062faa444c3c11773862b1c94321824825ae4cd7ff8962e077179e26da930b3fa8ed3d4a9791acf9334d1b7a01213ddf6a6d6b833b62258273081b08a318cb7c07f0ce0aa0d18ce69f5c04b9eabcfb93ad001ceb83521a416c167226e6c769697ce8950e4dee6152faf45176c156bc5078230c5b9f3aaf2c45f21eac3d3556d109eeb04ce0a04dc3a4040e6daa41bd5f87c889955f1c0c1bd48fe7d9d65356b67573eb010ac5dda0eee3515b3b8bb6420c651aa79a3a4fdd3b7ea40b61c2ae1005b857592d9e682193080737d3a0ad248afa197c61b8b919c7ed28487051ccf0ede5613f23c4d55e567262aa88a55835fad3ca9773fcadb1842e5bb2c078a6efcd795ad2bff6609117ed6ae1d53192801d0769c6c62063991872f3cef26e28d048d34e3d24f482277b8b2ff654d5979578d9eebe7d2544d3a28544de66710fdb70e91dc376338687504365d2258ad5b947952606a7eab31113189b64f57034420fe5f29daebabc9ec7592e8cfe29f030cac9e5d9fe5a14b5c804797bdc59a1db0f22da188ee8fed7af6ded6827221545584728d6cf427a70373fa49d7b6fd86e4128b1a01e72e017f4950569c82544704509d8c69400fe0d197c61f37cb817df321b659fd02b227b0454c48feffd9757ea2f294fe249aeda4cdd4c947785be42b81d5944202538ebe94170e1d078425c27fcf19e97a73f9fd01e79c65a3ffd26c1099e6dd174dd56cceffb05f0563b10acf7a5d5fd0a02b9384aa551d596fcf0d40040c63fde909f68723b1bb17e808f185bf64d55430af90a3aefffc8678722242d85de371720f72caba4b47e43b2b7fd04c7da166a1438a640983e969b2edb890702a06e2b40d181ca0f6d824f97eea33b7fe7863659bc49420e4ee7180e00ced8e080c6367e9e471e7b9604999d02d1301b4f26e34f4e6ef09b6ad06cd250d97fa7182793d7da058f7f0e5207632b95ffacb160f4366e1a47a7a91914fd0987a180ba5f2fc24980a66a0cda507033acd5a021b87fee259ec4f6843c4c998b91593cd37c338e64b3fcc0bafba659e326ea54350995f713703aea10ddf50c860c343aacfe1452a5988d671c9ea74638c53fc1d67c2eb1bd90a5b2da2e56ed01bb3e8c5c50389ad92c62e0eddce7ff7428ecfc060919a0752e81d5f0255d36aa10e20091263444e39668df6286e439ce09c16d2db5f25a538c770d84a4f4dbd83c11e605aa8fadd8e2a28b7deb3eb71a7127a90096cddd876b47b71c66b979b3f5630e17a383b715529d1469ddb87a698c6e8b731811feef9f727075a398f518d64816d82dacc3c4cfece45fdd5744e7586aa8c1c6c8754ab62eaea4c073900796550463fe2595fb6405b43a84ab060d654c2646f5d5b43fccf6407a95cc76d328b557a3aa23ae19e4d57e919942a0b9ef139ff6af1c304c509a3c5fa7efeb1f8c6cc25eb6f7239fd15583d075b981e66960e15be9d2f605ad20e543ea74edd797add33764640e6d5454f2435e4bf986058061764b747cfe821c37c0e7d7eea52aa387178b437a0dd774a1044d9f88fca7e08b043191253ca5f2032e4e38bb56446b7dc166f3fb7064213d5cff035707cc1c4a78ff2dad6a3af82daccac3a37d22307b90a099279d7cb8fea458af88c96288f38dbad481b4f275b0bee14c94cee31cc4b6784ea3fdb4919c77233d2e9ca6150d435e8896064b75cd8a18a3ee9ce942c8da8b80ba75a77b2ccbe725672b5b9e39aba5df06", "6a65", 1, 1979779015, 0, "c2960d90cd7835688c41d32bd2d2120891b1669c8ceca5ff24c6d760479724bd"], + ["c3614f4c01580abec10ca01f8fc5587a7fa4ed809a7857dc4823386d3c08e0e03c6200699000000000076a00ac65536565b30a712a03f9f405000000000000f408c00400000000070053655163ac005f5c2b030000000005006565ac513b99f14303eccd79030000000000000000000000004876e8f75d9b81fe6cd8da3ec0661e96412f78421ba9889296e73524d21031f9992302b1e699e88d8e279c905cb4ee5c1bf764a36027c17f4a5d1515eada1ea1d8a3f402f20580dea527ab21e129b229ceb04746bfd8e49e3230836c649b5c7100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b4bce3651e8244074629e2541e5053b508115d993c9a8640fa1bda66c509fed39a0a8c06de1dd8b1181332a43f09b4b979d3ac44a77d6c7ee3510b90a88701564989ddc87d5abb6b46e90fd9596c7bb5213ea7254c417883d70b4334a577db647e1eb92b768bc1d132891e3091323d362ea9592f5f0a4d0bf2658a93a0131d53032321ff87910d05501c42cd07f6f720cff45f9b0ad712ba10981e9d61bbe857c002001630eeb4ca5ab974659127618aec4980b000db565386203691cd733e72d3ef0b029381a0cdb69211ea0f4c84ff2b3613e1d0094eeb3f6a0b68a05532f2fb440ca288bee892768247c1ed0c58d572eecf159c926816df84647f091b77915d034b0206e711a9af30f899bd4e76cf29128202b30658cfe50c4b9cc8326875348c6d83022dfe7e1f578de44c9803fa3c286471ab6316e2f8fd00a1afe3b53f86dc0b71f9021f6d482b718191f39688fb4a17b7df987f88ac9e6fd029ec386732aaa9c13d7a0322eb8a2bfd0316146bcc28b209d65e49a1a2960b6a96b3bac54bba5c7ac9144f03174af96f9f58b136144a6e68d821ec87cdee0e1395786a1b3be09574903816a9b34636396c9a1b95bb9de36b5a4a2444ce72bd00950e672d5a853654a10eef18896ca63604f0b0bdac7f7cc6ff1d791b285994545930956fca66800a6f73c9ba471354c1e155986453eaa268148ac2b2caae030070fba0c6b7d3920eebfad36310601df968ffb024a7240f58f46d99f481d7e7f0c2198979655cd71d88f9784140eab3dde6dabf083740ad7d5dbbf159312d6274e2023e9bcb99efa1e8db2187a3aa68799a70b4c70c68d9078623f72734e43863ab614e2f5c7cca1d55cd54c85545fde7b34103bb884143c12a087c7ad30cbb25cac48eaad76a8e96473ba969b7524554e9608a23aa31186b23e5b98e4fa8a33135cff59eb871167f097a82721c277e46788679f161d5786f1d078fc436114f4b69c164540d3cb48d9d2591adf15af8365a5d8c0474f595678fe948ae9c24958362a98c4f38d6f53d6660b3f940d6bf55eadf2c1e5cb417d6e433531f864b629230657a0144cb336c910105fb1f8d47edbeb3cb9a168e13f0962289d21f967a03c42fa9d6dfc1303e7561f0d6ae519c1644abace2c76e76bb2983b260fbddf6ad080b8c5da4488961055b9429fc238e55e7f771a49a8dc8fded40f5251c1c9c7a079f38d0c5d19ad833387d4d10f7047447847d70d8a68c08333e9f867fb124e496561baed34aa69e9c60d5945b852676e02fed22ef49df816cb70ef1be99f843b40c88932e9bb8d6c605bf10394189fe22a9b9a3e63f040398f7861dd2501d09004fd60f0278f93f0375f2e1c3add8a1c565fca40707d69bd78ed84f7d9a85c61a9c57c92be2ed0cf39304bd287d455526c33f772773af82c98acbb6b6e6bfeda86109f025c040db232cda67017a826f32fb4f50d7afbf9ee05b07cb7a0d3aa64b151515fd4fb4c3c3a0ce5c5a86fbb62107e6de2c23c26a61a99ca67b01f0c93dc7d9a2d85a01e08fa85f6c9d73d2384326a43011edf9f213b6066ef5f8aab61696eedc82545221ec777fd927299a6c4150f65efa3b60c99e87c3126ba85838a9aff5292104c56d380d40e9001d5435c86b96c8aa3ff4f7aa33c293aee45c83a96359c53719fbf61f2f1bfcae70e12114ff175bcd819a831bc96a20a0824993b44cdca38777e6f12c1850eab41507c62deb078cbddae56f9d7cf84735209428c1628ccb12fb3b02887200b23591d8467298c9f2d4e7c73d397e4a28f7fe73c35859b0955ceac8c805764e7440ac1cfad06f81b61d325cf9bd489b45c52b193fa4e69fcf647569f320f2bb01dd22ebafff6cab1533b54f11f55f194c15beb1340aea7902920d04c787136189e090d8360d31c567001d2c2e9d3c73e13d8c66b8b2014dd950c8edc2b0a6e5de993d0e6bc09a71187f5fd5ef13da59a038dc5c661996aa38e4afff61ef5e201223a3cfb858e0cbabf8be181e81136afd0707c7fb7e683644ba0f45435318f23e259c7813b5628ec5867f00cc22a2b324c24c9a63ba0401128988e93d1b16575ed7b5b9f533bce575afe1b104906e3e7bca5d04939cde8590c2ee0d92fc88794756bd651829114dabf83e652c8de57a469e3b7c76fc0226220b862cb8091d8e4d4abf02e008e2218d2289a7099274f5d0c8bc93c61487f280d62250c897badecbe56becca583e8369f9153c921bef9b3057c3050449bf69a3bd6bbc604cc48e6d0dce7d2654ead3184f24343677fbfd49bbfd29a193000000000000000000000000002d6c22a83540d59d1ac6ac7b18734f703d4cd51e7eba6ee533360d8449d385072792911d827885817b2aa42a7dc2df15c82e04e9b6fdcb0071dda6f10779894a415b26857db2efe33598ba72da3ddc38691a0091f4a8ad58811235e1d78fff2900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000be59458dee6648dfa13018e5121a6b747d5ea5bfbf41fae3086d6f73285c213bac7811976996edb2252a9436f1b2eef9bab3c2124c66e453366bace41c2f41e8c3ac59b9c4c67bd5cae87b5059da85d489ef3effa6634be046eee557a5e7cb7223adc66817c5634c10021d891fc63cf3833b29d9d4d60612061102235d0a91b6020fe511a7f756f39078d25c7cf2d326b4f91a17ff4aea2d83c04830d4d29f929b031aea20b947b02aebf5dbb8b99e1098d7c02b59796dda891b1df6e242272f35d00a07dd2e5084872a6ccfdf25a0ded16121cdddbd9df01a7f04e2aac910190cf1e3bde1a0e952993aef5874b6d71c11cc957da5c0f3ec9f0a69a06f096e1282b043021c8bc2625cf7aa178b1c03232fa798a023a8d2f27db43f23b1f308f25df40163031756f720acbf4cc62b01b1e4b1dc1d190dfe26ddc603c4078c7485df3f3b58c4032b12e4fb8327f576dfa9b48c61ccb2ebe67a140d3b9fe4e86d0fcb9a45dab2be03276b12ce1c44b51a0b064e87f9ea6fe30a916c81c03197a47df19b983c23048902213d511ccff8c38df9086e74faf9978b6d34c038c0ace42b57076592e9b34253d170143cd811dd8f9e1f8a3d618ef2f49709dc49be793f13d7cd0f02c748f9a71452415febf2d852c56c77275103665c401141e9512c605a2b41f40d7dc80f70422dd6ea42b0c3ba002e3444dd7c32985b9d14078344190bdae5fa64880a61e5cd892ebea62da4ea1c76798d28cc9943dd6933d13e7c80efb0c2561962e5c87db9612374977b399458132bb9e5d04ae76c7421743036eb95f7181928ff9b85b4fcd7af2ebd5fd30362f679149e915c489da89f1a5cc82b0bec2af7988bf39b6eca8f08314a3d9508c1359cf4f0617fbdbafe94bb3bea208ee47f10c0d983b0fbc6a942cefb102a89d8e36fa7b8fa2dc42788402615cdcb46e250d4e6afde13572f2aa76b99b685806d354e173dab3755aefb9c7d51d577aaa7e6aea2ac71defefca6430413d5a9eb51cac53b01f1e5279623d9eac153bfb6ff6381d6291c07392870a9157a00239aa4896d0ddf3aa47c48d06d44ce3b3334971fa91df3ac5603517d5e6e10009308d2ed07e0f67388cee66a870b23609fc134966713ed93d73f981c85fddee818f67b5d224d4487cc34610a8a46eaad3da4bc7e2ad4e562bd47a92065927175f5cb19781fdf356b00700c7272fd81d68b025f99163e1711cdf505beb8e19aa776500ded4b76df7e4e4dc65f3bb66f51801fa1e04003477cd0edfd6a59bd09e228dc8785c3414bee902b202e04f1f5746c87aaac63ca5f92ef5fe14ae9226056ec1778c80aa83e0b5f358fde8a73cd75b6128e2c096fb4e9ec6827c466261b1e4af8b90bdd8bf27032b5c3b191b97ae86d9b8818a9fc8ef26f83fd07dcf821d0c309383bd1a756777ab06afc1a2fc557ad20fde26a42bbed0bfbfd0dd75561d9544996981d4c7fed30bc6c44c475533378c2cea06cb722cad00cedb1b34be361d61c1b3414366a7c781df80190d061299d4539122a4865335452e58d2253c66f44700332e9f9db2701995f05d29f951d14e362b2ad273010c3f3d383c98798a0e6d76df04afe3bd1c0273d5c9b2e62356d46d0d18f1ba353aee4a5852afa05177be74dd489d0a8d6a5f6837993e73e06194a77e63d05a80b86398a5c9fdae1c52699ad4cf43e4c966bc1a37607456352da3840383dab7f614bdb3a873e51a495e9fcdefdf751d2abbf06cab9669e159ce51cc18d8db39d608d4d0e9c69cb52cf167c80ff3c76057d4e8c4dbee44fe85aa35afdaeb06bb7f9ffa372d97ec389c6c68b52c4d3a1ca6f0d42ab42175b4691b40d882152060620c67cd0a54a7b3496d1ab4fa1111db7a9a9a6a92abbe05a9876656cfee37c09dcc83bb90584a0b7d923c26b51db01284ca1abb6c6f9d1bcb9a59db216b903847503f1d08bf0f326bc1b946b91efdc50d9806d9804799b17f816b4b6c8eac9da4f9f9a485f0bb218318ecfb579f10bf57b5351245c19ad3f69245a3ce7cb8c419c4a6efe33b3d5d20f2912e84b4d001a8ea3c955806fb74e617d063be74ef7fe02cf0aa29417d087e95969e3fe185d205d98483c1365c6dfe314f77f291bf6423e887f9c3fbfc9a05956d666a016ce72fe613f510fdd918805bd7396e92c18742b3709f5f4763b2eebaae4ea0004b0b3c707b1f6634b72626c045de6db46f5838a5fc5e7f0ef05ad8c1e49a7eb161aef0c405dffde32774ea5403dbe38fe6c9d524519aa7f343e4f3821d02073af59715b17c8d2e65bf0f3030000000000000000000000007c080289c5c944fd6f4553fb1d65769f08f3a7b3039f8575a064682a8a7791f43ffb4949087f8a11077c721e3895d683ed6a5e7189c6230cbc5dadb7ad64a88fbeaba62ab8732217f11aec2b4df48fd1f52fe86188fd56315f15644c9672796e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065859b521e5ea68fc058568c0f9fcb2491fa63232c11ef85233c3e37dfbe08d659d04794bade20fdb87f947ee43da83c36ffc8da93e392e7b4f8ab49740ec71ff498beaa080f235b311212812787184340187027c7ee6586ecd875ae6f67da84a66bde9ec0c1bad24a3b4ccfdd0106eb293e30e1e0914a0605f09cb119a14f640224eca89572902eabf0e4d4e865a482b0b813eb942f43cbfff0a74d575ec05ae8031997aff3ee5667306a629d0e424dc69991587b69c9c03d724742594628c727080a04cae317a1608bdc67ba2d8e5f42e699d27d86ea98a4f1196165d6599b1935353f6b2f0008414731e1aae65335d605ef5ac68d402dde0a2f14b486d6292b6ba90311383a21698785a08cbef595abffe15e3b82dc0a988d7bdd95093ace35c7f4150305484e4c2d445b593c4fa8fe66240a619b396ec720075a02f57a8f07624a18c70221bf907572db310c6bb0f7097ead1d29386192abd14aed84d0d7cf34230d518d021bca418d1802c982df643f711ca759f48bc282bf7dcbdedeb86e5ebd01df5401032ea1db96db0dc39e0f006030c92469661131b5e3a4f1a00f1535a555113ed8b13796bc6a927ed0edd00904539aca815f96906dffa0c0d0c3eae75684689f376132b7770b68dc22accbef92f212ebb5446a4e9adcbd1711ee6d115aaf6e351afb552abe4b7132caa14b90f6d2eb6efe9b6dc6e51244f9b046b0e5aacdf4f56990d45d8687adb897937b734e017d6b30ad4f88e87c2a75c1d28abe729d4754250e686d4fe5bfdb333fee1f5d2a9444e1b48e2bdb6d15646466688846cb5cb8930223f2fb89912f5f176540a330f0924a23388e8827991f377ef8c888fcf1164adcfa1841b4a7660872fabaa1b5265196e0ff454841bd54d7956fdebaf94b3fdcbefbe37ffc414ccbfcfd4ebfca1a06fa29871d2ab3039c7a353a3435e6b730e89748b1ab002d4e2d01f000785dc1be2d952042036b610d40afcf3445248afddfa158d80caa41cc9cd7cb37470c62933a8185fb1345f55a5ec0f27ca6a56fe0c9932d94dd1cc266d0860dd9e3721db4938bc45a54d548368b704c1b841e0e9da9d2298c49f7423e309768f038383dff5d9696cb6de48e4fc595f148108c62e71fcab67b2320effefdbb2818637d0f0265d99bd709c437f4c72d1f4014d6f74ede1e6c97b7ea268a35a0f5f4feb02af11a7e41b4f019ae26af02a3984dcf1826813bb7acffc549795e4581c03f76e8adfa81eb7dcede301b62bbe2701e6283fd6a5979d8893719e36dcd79dc94b67e4040442680c06e884cc07089f885c782d96c3d64ded30c879b57d78fa8fb3a5c9eff38aad0261d86e9e9cb17157485239a199b633aad0a6a1801adf84515bb0f6b853b664b180cff45919429eeb3d7fa60b30ec07dad544bb8fe63dac0e838ea0d77087a1eb6b1d6c6d1a03321208232f4c456e1abe6c0c148a28520ab208a3222173fab4a741a6f9f2a8d9b424371ef9d6b586b08466dc454016f58233f1fe60c71a86c3d2099841fb5946c9bb3acf45a7c189238fab8e6947880d13f4b74fa554326a556145235c4cf4d78100254b07119a863cd41712d7d90ec0c90d037d85a08e77629ba39644cc5bcf2a65b1b29601749d818f4a96b4dcee6c3d7c08323067d8d8a6ef004c00144009711c04e134c460fefaff3be749a64c9d1628047c50d5f6c8a153a07006644969a0670799c5c8339938b62494a59604f51e39f568e3fdb3292e7e9b2f0ed6fda32e58c3f2db21f7832208401157e06a83df4781915fdf90b7735ac55c22b0945ef210de5e7c506d924ae5632e7ffcaff5d0bb67124327201ca17208757dbe7aad7e070f91d4f412d487c6a22aa41c0668b3ee66ee0bf9af5134d6eb9b2c2059797e22927be449641689443cd5b03ceb2954dbf4ba170978463952131b251c30e4cd6f05a6aceabf84771f31f4cce624b9c90c0ecb2e81d8d94cd22e0fdb4f1ad151baf8b94482e53f195aae50b2ce8d4c9adde7f74b2870f73dfc1b8197bf1c19a64ad5e8014a38bb9ea073b68518d6aed41ee8f79404b735f9137502524e6b3f0d0fa24ad8c41a82683b504899099213d6a3336098355162070d064edbe756bb60461717f49112835cdea34644912c7142047b922cfcbbe17ea98051cab7abafbe14686984341b35909e4919795e7e7dafc13cda70bf2c8c2db18cfd9b1cf4768a0a0c8d234a7eb5d37fc04234f7d4b9a03e028ba6d081028423c593a675a84078b6edf6376e3c2722a5e17b3bdc744e203d8229d0a950cac047e57d30b9401281eb82c79cd86d1c0bf115653795c6fc6b306865fef4fd271a197af39e6fe863af5f95d1963d838c432afc5b77d890c9ab1be22b4ed06cc0650b9b56c52a26a2df7337245a959c6e1a2d78c5b2a548adb6d2ba4bf99e6679000", "ac516a63656aacac51", 0, -1372799624, 0, "eedae3dbc270e933ee5eed4af53bb3f06da1e3d867665e9578c5a96f0bba5d3f"], + ["030000807082c4030459922c13039878740ee365960f1d29f6a59d28a476cd0da2c55a8a68a2c78824010000000251ac5f53575cec0553e327eee18d5c0f8beab9c46d8acddb340595e802c26f5dbeeb950f53ba0200000007ac636300535100ffffffff1c2c86764a526792bec0258dfc7d55e4cafb420530fdcb4e6348f6569f37732c01000000045151ac51ffffffff0bad84af076b32e8f98d49f14b906e46c15f442ad3e61d02b00f694fb70e76b002000000066a00ac006365ffffffff0258fcc5000000000003ac526372fe0000000000000700516a65526500000000001a74f7de016c635f02000000000000000000000000ed3692e306aa27e9206e89738417ca2154d6b1fdb561b44edfafba5fb69176ab23b59fbebe555ad56946a00d2afcd2d32350e1451af8ef45ceb1d57a0c268008870c34406df8fd7fc4011e0a06ac9a1e9d40b9dd4787d1cf3959a03445b9f38300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c80e1b3deba619b72e5bafdb15e3517f7721c3d00080fd5080af5002d70f6eb7528a0352ea940e7b7d7b5c4759f2b1bdd89f5865d17ee21396d492df278613cc96ae20c433b112b96fdc2b3c9c27130cce236ad250dea987b7b1b14ec22aa50c0a38e54d3bbddc9bc7bb82ad3aefed20707421cc84b8fa38009039cf29ba99f202089be2555031423f2918577d98c678e51d85b9f7abb130f757d5e23514a1ee47020a6e6dcc2ab84505048bba9bf89408bcdba543fcdef464eb2bf124715624a3750a04177908b637d50f2928f6f3c5901c2db44c0bea1021155e24eb4f6b80be3e7c0fe1f1a0366d2a947865173bf9cb7cef9e4f513e6a79c77fbc421630051c6a3903216daebdfa6c1c9451ea3841639c3ddf101547264cc485f9dacefbd278ee4f43022c2fe3ff1f76acd9c08e4812978ca675c87f43300e6e1a96ab30f5af4adaf780022b32dba307f01d23dca59b4e25062fac07554b3fbb5942721560a3e94ff5d9c7020109ef859a0e97c62ed51474b64e92c44c5b20a6a87ac752120415ec51759d0102229ff8a3a46909f59d065c557f5e5c9efcb9cbf0b7c4bda4c8049f6ab265cb1174599247b48ff98f6001bd1359e1bc86811c806328badd0ed1f564533c0a501034d3bf9bfa5a127cd06ae18f40b40288322086fcd70fa7bfebf3397cf6fd9f43134c120b76286a9087b93a03debd361bbd8876a97504017a077f690e6bd87c9617f6f78bb3d65b5bef5495b60c959e536d77a0070fe021e7df117b1283a5d208515499e896e272e7992e685249c78c6546fea68dea53d25e47eab67ec5951845d5f65c603dab3acd95346da61cce4b1a21a59d5b5b02a8030135c9a3371cf486274ca09145cfdaf863a09dae23cde627284d84cc67041d5baa10a7d66a49d8e446a706ad43c4b0651d97a64cf615c776115e6252b152708573fb652edb0d6406722e29e14d4081b2022ddc8c1f4d1965e40c893a302e72aff144175d530ac7228c1ef68ec7e84778d3b75596bd9d1131ce1b5fb674b20ac910d4b1e0f1980b0cfc2ee71d971a0c2ba1c3a6c390a45236534102180cbb3257ef6c173c4ad187b2a40161fbe43fd3490930f5e0be5fc61a7fe2d424487fd0d87009528e7dfd386445663e3dbadde808d585d3c3a80eedec49b148951db26ba44e71484a088c8024261c842acf3032c65b3b5619d7f10aa87badf3598477f1ca02895eed75e1b119089dc7e79960a1f17e69c5c644b83d19b21eb8285c16c7cceec57f26076c7d49d3c9e965451c1c054d395734e3f4355a6dae7aef3933f7aaa2609186a35d0c569d39588e5ee1cb47badd8240cdb5f91fc1393cba70cf8b22beb85a718eacedb9eddf69522469457bb80f16831f729e0a2e9edd02b5548070a27ee6b61c60bf3a8fe198c79853cc669fbd0bc99806a3d306218714c8c026f1cb1bb1c26d48eb755b600bd911a3f16f059cc3a4792f9da88436df65e4b4cad98b01a801c3fcd35646a4af132e0e618b71298bd55e381e2d5ea662c3bf9e61a7e98dce54c3cb3e49e4d16cf7f0ba6dfa35663d8fd398c254a55a75a2550d3d48e0cc083572f3d3958a37fadad77110e066fba7673424ae978b3ebb20b63b83c68e088f338ed4424345a3c05e88368ce9467aa59e0129227ff6e12df09979f3ece00358ad949ee0fc99ca1c73bee7585ddc2dc333bcc9ba8b69bf674843bfa433d77b34d071796ff5519438741963936cf49212180c8ce2388d84eeef135a9c75d739bce0c4e115e7b013f6bd1d77a8ab6505278e93d3bd99a75712656635eb0cc1634472ac2551ee62b3d73bf3e92e3e2f75d3bde3dac409a99c540d03e5f66b15765892f1df9a16286bb03806a144befe3ce5fa8d05be63d60a26a2c7446e61bd5213d76eab563a14f9b09ab27c7b671786d75e6fb8bea3e228d5a5d2ae6b1e36062a4f6a37f8b49d8370a1884f34a74bef1c180ea7c572f9224aace3a9ef2d2d1f479c567eb87a12e5565005b1176f0f3159a66c556754457bd4c527f8ce65c5a1fb870fd5d1062a71d05d769e658b2ca020b27b0633b423f50ffe4d3ae2688d015c9465da4a2206e92f05685a275112053e1f768c034423dc19a7edd633a6b270dd63ee086eef95bfb971709976dde11df1be49b3e208c832a67a56b5fbce455bbfa5a84a955ef9191b762ec18b30215a9f21d3d9b88c823baf07715b237019846f107a722b14cbca5c489d3951dd80454271b553fdf2ea54ef8a651db1bf5ae3d5b89b87a370f16dfbaebf39af27ccdeeba4b85fb7a41541a81196f5a55e9d434d7ba9f9609ad1832201988ec3218ae2b096b7458c928d0fb7befd2a695f286585377ae3f6cb451a172099bfa347d157ccec52de759ffbf4732d6c92ae20a82424ed649997ae65d68bf450b609216451530828da8985b40b", "", 0, 1957292011, 1537743641, "0ecdeaefb4b90e487ccddf02e9bc73f04aed5be29f65add88f3943dc9def49f0"], + ["030000807082c4030249eb66f1d7887320da8d3b550daa64cf629cec26544ab744f5ffcbe8cebbad5d0000000003635265ffffffff780062def0490e2d36c8a4490ff05e724baa6cd4392db87cb1b6539977246972010000000600005100ac65ffffffff01f0b9ae0500000000055352525365bfd5299f7eb1886100", "ac6563005263630052", 1, 444754781, 0, "a168ac3655a61e6f750441f7e7adb386b02fac1262a97efd2bd0dd225f280ab2"], + ["e6e5e2290171e1961977008334a3ffc5af444949fc305c5280677d675c4b4b5430eb8c95440300000008526a656a6552ac657b0197be04074eb9050000000005acac51656a7e50930400000000096500ac00ac53ac53523a11550000000000005724cd04000000000200520000000003f9b21b01000000000000000000000000afe850874260fd620ada5a1608ce8d6b60964ea0c6c52820be0896c0d1cd52407cb0352e4c987dc9c078236e4a185877755f039fc743867e0b900cae50e210acf2173f01b06efb9f7ce8ac05a666c60c7d5aa56dc7c309b011f8fe302187388b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003bba67cf12a36762bc140abd8fbea35b149654c5a4886bb4612517582e9e2d91b1bee175cbaf2c942afd9cda94a2042cc2b820cdd618c4bc54167515b2de7f0c46d6832ef3024a1760bbb4a9d2d87a65be313a869d2dfe366ac68b360787849999f8dc817d0d9ad35a6d9942cc2c06db5c911a35a0112743a92d25219c4e24990324686c7e2abe7abf2e7d6c0ab376cbd0c97251c34b53879a547ce305a30acdcd022217ea9c7fd0fabc58cf9f9595b068f892061a92a98e2b2c4b9861efe6cab77f0a00b23102526e944b46c974fecda56260044ffab95679ca5bba43b69d276cee38bb861fb576190104571b15b030998828e3e0bd3539b3d948984b79227c00669b0319b285c3a871a964dd99b3f558dcc63149dd23d29d8c8d29c0c66f9af927689f031e47d166c80f739351b4f1a4a74fd9cb2b6fe7a0275e225de26444d5bcb49f52021e1f7d93b85f6a152c34ed8d0999ba4ab430d1aab40472dfcd129c4963da23a70323210abbcd3af166fbabe8557aa28f28cb20cb62880638edd7b0330489a273100202f1e587b5fdb15622feed41153e28c18cedbc1d35f95b27c00e8a049c0bb48ae591243ebfab8d559f128570a6e4c7c9cb51612c86842426d80f0bbc7f3164ccb2ddc0a7effad5dfadb93c20ac3e9e590ce161de70e360cc206eb2ad5bef87cecfe1ccc6dbba8d211a3c9233efcccad1f4c3ba64805f55812d1da6b1d8466be3dcbc8b9eef169f33222521a503dd9cb732de0054a7354830b5682958d5e638def9e9bf1bbf94afef78ff6eeecbc794c2561ee1894161e371169dc3a518988c6b774ed6ef4ebcb1a7ea830f9507deb20859f79175b01554acc1da27b6a0c6c828e7c7530373da356619f252cfe22e41e5ecc3705f3d07460b37cc19ba4c1fd1c47fbafb317ba2fcd34e01615eed30981ed34eaf689e3916a2706c5bd90b4310a3e9594d8ceeee058a0375883a3ee3d53ae2005bb27d8391a89ae15906d70b4691691e409547e4218caf2b84229b8a4b05eb0df7bdf9fe96545150cd76b32262428d1b2692bf719107b1ab65e2ebb2548b9208c847fd841acad286fbd362a25cc557dcf4110584b2fefe590e3ac1fe52927e9204b5576be6eba81a535b542a324d81f6e340c2db3a0e2e76e0b9dbe4a7a9c04d166b1e303a475f57225b10a80a308ee874e9d71e55d785d9ae11d8052995a6dfa77227bcaee169b557f3692a1e78abf59cbed37f21dae22f0242f9b9826de4a393d3631d14aa50d29278fa21a112e2f31da313afeb97d3564614aa375967ae3b49609f5feff732ba75b168662958ad13e162bdede4dc9eef471c16dd7fba07a2cc970e58a6e4f6da0258a0b4309be2b0939bcb01f856f1049806cc8591010a5779007b14daead4778043d80de6a2eccfd958d39212915278b396d6a87af0d552d5bdae653a9091e3fbeba0339cc7c99698115e6d4aa5adebd9cdb29f8c195a914026c2312aed7e03ec7bcdec19c14bb3471099ff113c656694a6c5295fe07be7ff8b7685248b99747ca13894b58987a4b3e2d831481d66e11e6e52f1c83c6ba3264b8f246524b648ea8a934479dd04d35f31ce1f57eb405b50b719c48ab3a3d96a52fcbe2c9ced245cd7260ca04d97fcfff8ad732f5445ab606db809775961f35ed8979c4671bc9d52fc6433bce57a5acef60838611dc1fe4f8cb34539eb16eb560017ece625f74c17239e3e1a9cfd57316a759395db72579297248d1eddd2bb2f8f10e89cf96eb1a3f35126718cc3d13f9d585807cd44deb8aaabb965105649978ebd7ea16b20282e9f2eb8c84ca606f6d4af728c7b830ed22c33fb2aef5614ae6c8b145e1a9f1efb31d6c8d02ea32e79df1a735b91e6f5babcc3052676e0123148bd34f75966344e6c4da4f40bb0202850d4c963c033ff7d43a126c9b3408f8da709eb827c4c3e647b474623989bb062bb517da45621efcf452f49df76452e3763e0f2ecb0ef68a41aca658d22b11e8cb89f24386195bdc0625ed00f505457c4483b662cf04ab91abd24027b19193530e73974fd47500e19dc8ddc8676ee44113270dac7c726ede96a6611c5d36c49fa0831ac70ffc07fa7c3a2931748e562d5e5cc529842e5cda74e11774af6160a0f2edc7e1e98b3207d0147d1c57bef49f829e23f5bdd71b02177ea93393667f053e4b2c5a39ac442a25b13f7bf6486e8ebf0b06a96772360f70e4cc941c8297545a66fb14cdfec7af73db8bb5525a48942c86ca2e9121946168e0cb9de76e6334f630aa598c25153f9e1d8a830d6491e0000000000000000f10a2805000000005240333ad9ac4a6ccfb069fc687730c8ca0bc1c6ddb760b56f6f498135865262f2e9513e0196ff728343446191fa79e4f3f80dd5e9b7a9ec761a6cd136c489c2a85333524384068c4fdafdc843b8279c770e8b70798f148d042cfb8abc2a248800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c2ab20896d0504ce1a8dba861acdf85a995423da2e23fc2c4c7941c4444a5a632f9685154dac15eaf8bea48ddecad749f2585e09513c859afb9b541c38241d8b8a8e7c254647086f145ad72c7b924521f7e666868f479366706f686fce6916691c81fc96e8d6c02f70bddfe441c578f4a59a40cba5634547cec55e94113f1a86032c5afcf39105cf560dc13b80a2000723aa74e0bf777fef9559fc2e2924592e8d022014ece609963273c85f86407198f42adf7446c5c29694330eb693370ee307070b015be3333f4a6f935b9cbf7871d692ff5c5876bed274111bc30d051836244060e601f106c2ac304b14a0eeadb2a4da0d7af0483887af1be056ad19079643b9f8030bfbae4fda446fa9452afd722a96eab21a21cd50ef29de2ec9d36445b45131070205bc330a3053a37c221da377990795b2b02259b9284fc2d40e70f4b1bdacb94f022b16f2011b8fa4c6319f3c9e7ec1c92297cfb566d07393cb64b1d070f78cf01e0214f3777453302e31069d34dc69a2d6dd0d24b7ad1b90696dadfa00f5a0b781310324a408135db13309371d0a690177df803b18373695575038f4716d43c41085e4cbfbf70bdd8a907dc0417cdcc060ceeb82edeb89a1ae343e5cfd15d194c9b8e6f63f175512ce0a2dafe8800c61aa3f97670bbfca5435c37c360bed3be7bdbcf311f55e7b19a27595fb0091cb902e9e8611a910f09f1ab0729d0104c572f4db6e4676213598dc347f08e35b7c13cea1a2b321748f3ed9faf1256a361521db8e1f92f1d7e44c278e58f66ed0defda85753e030b983ffa3bbf82daa9cdcc3dcfb58c7ba5fc1d99cd0bedde15aeb6dc1518d06f35f3da46a74ad06fe75666315b12398afa86a3a18a924c2c0d6c5beda6e5a7f768b0b3ba30ae3fa0bd53bfbffd6abb984a7ec158a4215333e839635ba248a5d2260ede52b77a2579dac732b43099beab33be0941d98ea5eba2912dc2949fca23be955c57b92d96fcf4f19e424f0b4749255d8a47e53808a3abcfdefcb2b89589ff8f419e30bb6d2955b9622bbc43c02bd030e1f634c6af7bb574fb22b86731bf3a0d38f260ccbac7af5f3c185bf279af99f8c4be3df27d60350ae962881e2eeb56e78b5eca9972fb8d4feaeff3555349df13937c22760c070fb4e1496ff3ed3ace9a12627e867cef57c1aadd150f26bad0d262e517ad0ee45aea34ee8283c1642fcc4b4acdc7a431bddef2d31738156de056b3fd26f35ef48b3801e2a1a27c65ee6f6e65c79418393593975e5f911d9b944723d332b3604aa54472acaf856de2974e2c8e64df04d6b600b0bcf54d6e292fb48849eb5516b7b4c4a0232ed66d9668ca8adce7f79b2a38449c4b33c298e74ca9713102f3459e8a26650d26f3de78aa594a16db50fb254e8e73ef074785de11ca64ddb3791891728a5d8dffd8c413e277e61ab5e47e161b68b032f723e8f6b831d63453a52f4ec9fd0d8243d178229f36476fbdbdcbb397d87f37df8b267b834d26eec060172d3412675acab09d0dce425a3c753ea06c9bb29b90a193b116a2970608926e79583bdc4ef9423d9514f9e1d01d69e31b247d64fb94b055fa578c4890e9edf57acf12a01b8c71f03b9f0b03d2db9585028bd2924bdedfd5021f444f4b9642612700ecac81fc251d21fad1ae41b199eedc53a567a3cc9d4b809d25c2e7d76b310b30fe89c8814ec18743052847b4f698ea4ce84d60715b6dd585dc334be5d1f8ea9cce43f3bc40cbca332458b6d6d676a14a02e9bf6282ee25041489ca5c2fc9f9ac703e4617c2d3ed78eca4fcbf90ad678d22a7e9bb979712cc362e4dde2088878b4a553ab3d11450b2dfaa1ae589772d5da49c89e1824069fde59c5635196306a9d00ea99a996eaea95e4c02949bf893ce71568914ce9c15fc524d1625c15e1f28db8c1a9e077abc64eb37820cf0cc8cf253d22814099f67de565dca3526108a88059cc3d93a95fe9f047ce876177dea53f0a6d5550d10ee6299e6f49d80e85f3d85cbb7618f236837ef99bb3d12fbfcaff146113e5445a2a5e44881345e3d629b95ae58813ad974a1b76863152e11912a53ec2dd273e2623d7eef3d8dce39472be0ee0dc502344162935de221db3b8a96502f410cccf450d70c2b53a966084250cb8bd9cdfc8e96f45dbe4451a67c2333640de69de5f141742b57e9fc9c40b861a8547fb5d98c538ea976381a1bc852f54f5aa587eb355eb82291eaedb266afce32b4d72f0869f71ad6e0b63643523fcb1ca722e6791945c09b5e12992553a721cfad5b0e8188b0f8d0000000000000000519be402000000003102dd2ae8d5be460197a4e9a0ac79577ce3aff2a4356340856f4e36d8615053aa409ec53de0ee2acd0dc3d9a49076684d3eaa6272aa710a804ba8adf82679ccea256cb551a555135f2d42c63b72e1e3b7dee9a22ece675ed4d87bb1d7a11b2b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c97022bada913e33e8aea02915ad1ab9eb1b3cb759993c673b49cbacf7efe3e4dbd7e4ed79bc805e4d20ba5e5e87a91c6a945f61ee1b20baa796a34b98032b362c2c831b5d6ad2debc723ea03af2b33745cd281b0ecdbec198c5501b93910fa5f5859e5647e9f0cd0a8823779f320ecb4b6db1295d7dc42c84770113c1eab64902055d716acbe2b121984b88bd19d2307a38b5be41690c729aaed7ff930351bb7e03292ccd814ef54185536c2b96bbf417016e87c51899d16ec2852da897607275080b03143d9ae4852bb555c042152354a88a6d3d57af172bd14f84e1e902c8250627014faf7d0583b7a00e595112e5343bd52026553320ce1704c3708e0147f057c4021702afd665dfaded24ba91de4bf24f95d6992d0d72a9320578c0e2e6649652b1030c09e355177747980543ccf6d1937623ade70c06e0d92a6c8877ab287cefb2c00219d5fb7d9117598692460597908e0efbcef6cb4f50e0c489ee5dd868586a7eab030cd7f7e0d065d25e822f177e853b76dfa0bfa5a12d91be293e54f1a2baa99c39030894ed93cc03b76632677265235d38854bf286f315aca4f922cfc5a33769c08816d06d40cb199ffe6068c63101b2b40061a35d5e108ebbb1a6f886e8807962663fff0559986be1debb49a2350105a999b0c48a6cbd6df1ebad50a0d9d3964799e0661f2b810214073cec4f899495d96dc3a63b8c4ac3beff5f706b523da2c5d2d21f60c6d4dcb8530168b24e718cb6724b8ea5ec6f62b795382f5de5eb9707ccb80249cd552f704749a1ec6e8620df0152c71dfecff1487eda0a7694446017f38595183e5b2340dc3470d3584635f71774c366e4f12ce1c3ee8ff4a865a14299c64ed6f44705c247dd83fa43b83d94cee424952a819ab53f3422c5d5cd93758396330311536bb8635298599c0284afbe8f68d16a706baccfe4e89ddec231be735c241af8359508d9835aee21b1945041e2c52a8717e2bd91d292b03612dad47984e11133df6a1e76ee1b338b03928cea9ac357bc47a9934e2b29e5aca54edcd6521ffe9e3e33f3e26df77673e974849fa12709a2d4ace3028d7e5d311211e0ade23899956bf5b65079c104aa9e9a9225fd03186cdea74322e4413403c57302bdb9398e4adbffdbef7f1621fe319756bb265becc1861360ce07c09d2c99ff03f7704fde1dfade96ba4a17aa6cd9190fbfde3d3def39445fe67be8d4fc4f0da71db2ac6a9512dd7a9e511f5ab16362c50deaf03eef7e7b13dabfbff23deee311e09a56da38ad436c0759115a076b148e393e2acb0349244824f0893d6d3acb3e341627696bf6227a63f0c1e953a17b57cdf074805827350ff02ad2fc722fd5bd77258bb24d666daf4c6b635e4f31ad9cc581d2ca3fb2346cfae3b4bd9ea563edb0aea3ef44f3d886def239fdc9fb000714f21263236bc2b48eca50659bb0b6e84b3c2d66c81bf9c832f1e491b727fddb1abb2fd990c3e1109640b44d075fc5ed72a32906747fc51517d2413e07e6f6188e55d979b22b6edbf13b39e0ce65e09509464be072bc1ef81e6009b7955dc39c1a32875dc31e0284648538f2aa619a4918e72865de9893634e2cbb3fd95f36c6a3c2738d7e63b208c1ba27fb5e0b272aadd372ae40dad1d48d32d2105ab5c817ac20f84da0af12c42b927bf572e8046c37d60993fd1354deb7a5604ec2df298cab9f8cb0901c052ecb9ee07a59a3240b73ebc162a9ebac187f9b0043a91042024774df770e9b5e474549e778e7f40843265f57dd019ab7e62d94de42554fc9e0891d457beaef6a533e6e81b64af1de94c49ed87a881f55fde098ffc2b9a9b071a9bdddaf9e6d3e0ef51633f9a1a3b3705a297a70ccf068ca56d9cf91ca673073228939413adbbc8ce1eec4709ee4a02b81d0c0a3d89c57ed42f241585aaf907c0a4f4a9ddabec7756c46facdc1ba904d60e8c9af1f040ff54d0414802ec5108026ba52b7c1fd960ee7474298eb469867d9da55c346855eefc72a8107f61eb4370fa11ac773567671ed246974204d65aef5d4816d864708f93879bf5331f2b15fff0d65fe850ae01faf9e6601155a1ba4907356b89b5739bde3b81bfc58ef691b635a29cd83df522d4f02775ef9fd2488ace361d48655ddc7b30f9f6276a128e43fd201651d4ea04ee3dd2eb837f4fec1a133025746553198b79563b55615db42b54db93a8b8796d8e8f48ad8e351efece26e97200473caef64c3ea7158ee9c0b2353fecf7de32c3529bb3b084d5e5332405907063ffaa1fb589a958ac527690e9dc9eaac0fd23cdf7927cdc45aacadf2554a528f24212c83460ff40d9af08ed9449ad254139ce75de3fc7648c6c5e29023057b57577762aa15fc727413d60fe9bdc2b4e8a0f8d6ad41d6dc3f215a580062d305e633186cd5f47814784ac1acd1346d0a", "6a520065ac006a516a", 0, 1696061112, 0, "61a578064714a2387d9ad1fcddabd1703342c558016de79358f6ab260b0e673c"], + ["17cb8b170186db1316df0d874bfd7dddfdab688341c599217106c6ad6bb058b26ad4c2d086010000000952516a0000636aacacffffffff0423b6660000000000085153516a53520051eb1d21050000000000033bd6050000000002ac51bb6d320100000000016561b7c174035c062f050000000000000000000000007cd4e76c48dda6ae9b92b0c946516228c3bbed23248352394a7ddc3b8489a498b68a3e4d892016eb9857cf8a52e3c80ac89ee5f180b851b5f92fe381d3e4f2fc0d4d45d798a0f7fac1afead5a418f4e97de96e3a7224d525dd100945d505007100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8dd35d3bee57dc3432999b9887a805ae328b47a3c1a6fa7b9333d2241f933ab696d795731f21d8af2e3134581e4bacf3b0c171456f135330e8bff4a4f6d340e4933358e66bd0922abc18d21a9962cdbcc539123ab3d3f8791aead457a62b1bc490de9e7572b1324df3d3639d66712f5693fd1068f6ac084838cbc8da76ac26d03128e71e21c729bf4fd233b08493876ef89e209b0b41fa3ceb265e6463871cda9030c15b5cf784dd7400ac08af03a1ced6af9e956b12c52f4d331fc1ab43019d1390a063fbdd04728eb848023eef8a03d738c644a84031213c4262d323b8603727551e93cf51a93be62126aae544eccac4931c78013664422c76dbb894acf51c8c1030324354ec8e5b3c96752040366c77ef3dc401bb20aafbfb3915207070969c7ff3f0206e311843017f34a3d8d2a6a5eb40d5771f39709cadd8a2805b7cef1cecaa618032e6cbf9b6af6c337d172cdaa5e58c324cca8b1cb7e3639495dca7be8fce703fc02056c35d96f7adebb9e4e5a53a9ce0045a845069e24b9b6d245525c331b516c77032a1b73bbe48a1583df3489a5b32770cd1b3d618de35a80d9644471b92fcc191b3e42f3d5fea30e1f4f78a3cf1451e0b1276271c4197f6aecafa1890fd9df75443c1220dde0b2f3e21bd5715690f8a0c2dceb214856193329e02f9ca6faff95f8c0dbb9eb22675e1faf4e9dcef06e9eefa3db908facd02ec17f2c55edcd03a1b8e109fa0c2ac9f9d4abda33555df010161991a4b012be46d0a053cca163f8a7cf313b0d2829b7e3df9624ce3ad645a72d4e9ef0f08b10428b6f7c8308a40c5301f4393fb0cae80d6677ccb45af943906de7f177d2b903e28730619623cb835b35bcdc1587044aea354e739664190f2857e44bf6fdd0a8971dd07c703072f47e538cd748dbfceecacb6080e2e948664774cd576e060cb17fdaf99fdaf96cf13b2dce9cc2515d43e443c540bf1f8f87c1dbf813d0b308ecd10b75ffba9080ce747400b92d890e0396b1bd094e30d67d46f709469c1429fb503af1e03d0181074def54c7eec184faa8ece8435c2f062894eaad2931bb946de06a1d18d9494144fd67168b7af95f5cd8109e899c31627f8bebdd4686c28df3b05f9903b89f1319491f19d0fd7fe573d2c6490afab858412301b0ce7a67b0e3da5661ad458ad960b4fda42f4672d19011640cb3f39f64003a12ea7f8214f4168b2f98494117d33c0a0948a20e79fd23abc3e619169c50782f128b53cf1e40b2c65b0c074c8c945ae16f6db86a23c85d830129dbac66d94676f658755944938d982f8d2bacddc3ee78751bc0eae2b0abd2f34ce8220cb6f3b3d7b8cc8855ac60293760693cbd5600881170d18ea7d81a9a816a7e5ff54e308fc6a105f45fa91621767957128548d33f4c302105e1d8e5c7ec8facdf6c24bbe3bc8a8ca2047c0e2eb69fccdb1f4795cbc616d7e74325624ab8e746b81260fb2e616364c81a0dc26d602750e3c9c97b958110d06cb523ee73ab42e6195fab9469eb1a3aa0eb5492e15c6aa36b4ba0cc77728180a76cfd90438d8bf3298b7c6ad28071fbf6d8bb0533f64b36825cd342b4634726875cf9cc027a23696f3c8752dffe0e9d20cc627a3775effcacdefeccff777cae492651f90fe8d497b9583e78fba6b623b1a3418a81da147e0a7ea5887d614ed079d52bc34b3a79e8567b3baa68b4522561d6439a56de72a154f757f45de137d714e16a17fc79fc1d1654766833a1bb7159c2592770f1a0b1f7bb527933a2abc7f3c2d1882689f7e72e757ce470d761e07dc1c2776a420f644f9ad456ac9aadb51a05b3591ecd375bb374485e2f5ab9a4c6e481f272a34e79075ad01391fc0a7636952fc58fa6a909433f230fae022d134f9f0b4041ca8ca4cdf0d184e0ea75ea0a25773f6d015eff3d9e734d345a63854e053d038c6d36b35676b93207153fc559b42e19f8d95122dff2cd3f7859d9e8c00205fdfb5bf277fe3fa93daf0e83f4e00d1b6890d92497b3b7391cd2a7c38172630431ecd74adffc99761e6af8f4cad4d824d13f55d4e7607e5663edd5949aafd6db1c8da23f0344cea389de26e66a7348746dfc958ba01142716fdbcb2b5be61f3978a2e9c447f9db572a5be582ec0a41a2aaa14c8cbdaf26106da8653e9ccaad733bf6da4a00aff62e98ea8970313552935733c33cf9a25e570fc2286205f47bd6592c61f0f051ecd7349677f2d2a4ec6886abd9f716b8cec3892b5bcd4137adb28fb25aabcb708a1a751c5432987cc7d424418aea5f65f7e91af6d21b136faf3303000000000000000000000000ab73e035ea2e00f484f8bf78bb72ea4e23a1d7c4f6f58ef003fade4ce64839d5c1823b5cd3df165067df9d08171ec0e5ac430f9ca68f8c8b1737402eb2a2f7ec890ce2103c27ef26b4ed8f000cf9c35d4eda9bee3240eb1124abc150d328808000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f733b6b8bc702a382a6fca298eeaeab8bce756fa2fdb1852e8682c3ee8972986ccc0d524216de40869e3f2aedd0cd885472c83832882519e8752553044ba6b86798f7ce46050bf6e4adae13da1baf4dd847bc87ceb77681a88446948d64ecfa69483955e1abc06bdcbe673c4e1d063f2e5f6b3388283f4609b895c45adb977df032099caa03fe900e9ff36a919efb1b5c45dfa9a94f334de8b4a2529c872abf3d8031278c03a04a737640895cb7d44f5e69fe80821384a5919b3dec3cb4f5e27ceb70a08e93823715b464702dc9d57df2510b0fc0d5d44f13847e375f2095ac31e4f48c7e930fe3f25e4f6741580b98b425029df3a13f550bf44b6c076973f22c8fa27021c3152d33de00ebdb78ab0ee82db4aa14715cecd4243d5d740967d2ee3de3ce3020465c6b1c05432f5659bea1dac5750e08f259e11a1fbabb2c9b6b989652765bc031d3c0a8918fbfb1771e9cd001195e547322c600be840ee4b650e2e424aa369ac031e96d196761e802024b08dd9d6699e2d63671088430fa9228a02f57866de124b0320bd6cc896cd748a8b0e12a07bced52f720b0d0c2c54cac2776f59b6ba624913642a6052cc88545ceed1331d30628957193e191f3b5d36c1f241063da93418c68a1fbacdfbb69001990d1177415cad72a4a1cc453da807ea698a60298667f8e3213d2dcd27f21181b5203f2f98a67588859f5836cecb09a84541548b466d171130145d55dda99bab8a550d919caad4ecf832ce05098e7ed27cfea35d904b8eed18cdf4fa4066e323d1ebbe95a46c9358d968354e675a5140b4288b6492130fd6653b3879e8b24b543de084ff9d0b0cf2974f46b710ffa17d3cbecb9ac6f85980ce6017970ab0e87441224f92d83fba00b493d4aec49869be04b3ca6f78837d18459425c75bdd1503f9b933af6e2c34b79b5fcce45696a370ff9dc4866d2001bcfafc04d2c21971d860f077ea7b3dffdcbe79341c3b5e2a52e492232caa3f3fa3fe82a7b4e99ac7730cee6a79740c732a4ba1a13c5dce0e39c8fee3ef803ab226cb70b66a7f40cf03186d9901f4d8b8f13b07daa2e594a783b62fb9d0da45d489d8e9b9875c1114956fc1abecbb7d099fd3a9c8ea24f1473844d0d2ff82a40b5f29aadcdd2fd39b9c3e552c7872a2976930ce6891942256c772779875d7a263bf9e34e08dff266a8070f7dd2bc0549f723fea69a1b4af04d82269614bd09e11c21695614d882aad8ae7b52062e1da434c52fb1fdafb1a1c1bb5a8cb9f762506cfedc74d38d7eb3e9053569371b54369c050b6f3c9520559334b371e2a5f7503cbe1c9407bde3e81d990812b4772d5688e137a0d50774c30cd9924240161bd05c8c0b97ecca069c5ed781c05d29e62c4ae741b1c8e5adc30788927ef99f34e4ee756c7bdb086c9651e7d9c107540c0d96682ec49c75d34ff615a1fa047c0b3f811cc0443d8a411b7efccfec56314bc713a2a6a1dc474b77761395ef9979b95fda0c1d1e6c955e85e6df930ca289667e31ffe68ca95ca38a10c39e67896a85340f7505683fbd5b0e4ac0a401aa08f358d19a4b76b3aa91b75af9b218591ef50f5044a91a4f49c323cd58b5f8bea9523eb0c1c8ea2c4e3e1b9ea67ab808eb6432e8f04838d5a2a65461ea39c00dc24aaf156349054e854da03c18ef18797a224cf46d78994eebaf6c003bbb9dc72c5b4124b53eee93b5aaa644f88c3e685fbc7b44f92fd5a79d4f70d21dab24ae2c6daf9d5ab6bc178f9c3d496349ab3d40afe7ce4322d743610cc2b5c76e50a6f36cacd960acd641fa8d3a65892da57d0790a1c8889999bc1014147499e3e29c6e72a9c00bf9d1332d3454c489cdb5a05c8e267777d1eb20a707d83c34977d72fd2279abd1740c70fc8d9aee552e2d45bb66d6962b7bc7004731e8eb14945ad9e31fff0af05ef39b723c81c3e71983ad44cb6ea1732c595cea044dd50a6af2e78f8e3556217210d5b522c5602f9104a05c5efedc47754cb6e4781ce36780a1248b088a400f2c4e854f41846535af1590dfedcef24918cc7ac0c9764c6c71577cd1b3bd43c2e4a5424bdda045f3fb57ce92738bd77ebd5876f6c5d28ad742f072a3f9ade77f118f6d7e55b864a11c0a7839058792d1a1a7b4e159fcd9ede4e5c7804291757f91290a3e936da2a7618c82b974b4b1e061606a5517c331616cc5b4eeaa3727cfe5501bd5fd9eb006c74a25208b8b314fd465498c84864f244fedfef727bb753db8506aecc1b8055c7a0bc928635a89cac8c0b01429f4d3da5a6f9827f730fa7e1750000000000000000a27fea05000000003fbbda5edeb96f4328599662ffc8e7f4417967b15041fec333b8a41bfc920fdca9435f7ad8f8dd231b53ba69de9a53557c4caf4bb499eeb8aa6284b7451674bd9aa2396b23e03e6d1851f34505a0af82f8e330772ca54fec5dc9402875c90e2300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1bd4481ae58c2a869ba30b3ebfc0cc1f65d9f374e70aa3dce3139022d82c0591d0db18001388a7cd8674e10e368f0bc8cad4af002ba7e88c86d9acb02f451fb0f8dc8f86dfddda186c51f2d278e35fdb1409e329569c5fb62d7c78daad4e932f6a24f8b92bd9a86c7547559cdba6f8ffac05e1714a9d69dfdbf221c31cc8fed032a55b76d279ef6473672f8c99a83405bfd57eea6363fbbc1905f89b1e33c1000021fe937597a2d3715b5bcf398d26a47e9c4dd1b2917cc9934ce129270cdf29a310a05b00155b2657915fbc2635dde5d32af0678c34b9ef1e828fff9e1b65c72ffb0c202bd2a4a90c87c5753d839f002acb8bc52bd7c6e68d6a5be537cc2f4f0451f032c1c93ce81c746a6b68fe1d7c9e0c9462dd117bf4bf8d2e3332ee01f39c391200228af4ab49f3f8fb3c7c9e1e4b001b5e641a364764c153170ace8842cdf54835402242794c980aa270d2949d8844cc85389afb0ba8e68136c0975f30846a04af0f80213d1322e29328525a0fea44cfeadcd10f9d562a0c61476086058ba20716c6e53030824d4d648fae970ad7b8d0bf2c3bc9ce761ddd8374512ca8b772ec8257c789e21d68619de98f2285bb714b105bee3e19ee1b6dbd07b86f5e2d6bb7ce96029d69e2716c9559672c05577bc6029adb5d2a81514c3fec77e9a401a9e930cb1886f5938de5af13450964db6a7167ec3abec94b4c9116d77021f3176905b7f364b587a4f33bbc6fc8cc20965645ce17fea790e3bd0582bbb842d1c0236c8faa33c74fad4c17b9ce28451235cb04b7c600fb12b3a08793201c47f1a5c9920e9bd978e7dfd62db76996737987153f6ae156cd186f53100969ec62b4f71c5ff6c7bb93927fff8114b3eeb8a9624593d6736f07585adcbb6dceb320b5aa79323bda66e37eec4de4b4ab2f2aae8ccb73a0b0392c7b6fd65c61902a8ff6c9ffc6ea9abc4dd7dec89c3104d3c3f9569837a56da287eb682b597b74d09c40cc813667145981eeaf00d49fadcaf8fbc521767e9e0088ca31e2e1272fcb261802e09fe5b8fb8e1fea229fe90d0c0822c853f24f21095ed33bed0766fc116b24a5a3578d4b7b389ab49d241f3826927fe442a358a824b8739936b786b26b92ead252cd9588b81d78c52b10e91b82bd217d0fde5eabfec5d84ccda33d70f02773a28506402c475a6fddc5514ec7b44807efb423a1657b39d0b84344fdbb53d3e8896ddbb243acaf1dae9065d718668c7e2b0cd4ff254fc51429e24a8f7a1d914b99662feace4d5cc22b1ac281eaf1490d2203a41f899af6035a6c6ec12ba2225074f96a8abe02acc9750fe73389b456b62d3743bb7a8d16a571a00fcb8cccdd6fddb8e8b9890f62617d3d56e3f1c237687f9e972903ae759f502d5e6ff40350e3b684834f2e0feda2a542fbc8d79ff007de9d69b49b9a37b4a1d8bb6f36b34ffbdeb6d82e51559ae32bab3b0f73eebd1c3ca3b018cc1ebd1356dc7bf86b6ff5b75adf0b5f8b2d37c28af80dcdc91fac4e08107448fc968debc1e3c89eb40b2195c4195055e263bf36507bb78926d3db011164e8040be5c0984dcb278e08e6364685563ab1945401fcf5b867d80a4b1ffb48ae4203ab99143c6653d703bdb205d99135a04724c8f1db757510ae342333a9725f664a247955c677c4c42ba70cc413a091447cbef817c718df3d2559387f348124bf5c1a05920917cfd364fa036de34d03a1d950b92feec647429d6928471d335ea9b8c7ec4aeedf1c5b59c0c9cff9efbb7c2528367e40434ea5ff3e398d84c7b505b514952f1a7e0d6430b7a76e76acd93cd80a3ea778dea147eba1c1789452ef64ca3b37e836f667a9f2a024a28b4aa7b27e7dd9e44f02c5b221b6836c1e29a6dee5ecbfe802994a6b462dcaa5eb10316b31fe07ffee106a35ddbf3b8d755bdacd829b79ae8511ca3663d8e7f09f11d881e39835c32d087be7d23705a7ee7f6ae4d4feeb25cabae9da1de2814cc2dfc40eda0a0b0114656aa294eacd4c937ab333bde6552db5d5ab99ddce1ac336415abaef89bf8ac97f25b7773c8ab48bfd5629616bc4be85ce422504223eaf1b9bef0c0dc518b7ce890f8cc4ff47e986e9a741c79222afff1bc9820c29d2856693db48ac99afed4bc32dfef9e263d6f2bdac0e45b0f3f1f832ad4c1b39c6412faea557affc74e9235de05f1611932e306bbde8e36c34fedf9754883c66b8e1b94eebe9b36b8e7786d4a2bab914a200a57115ba1bda6de8c0d65f3033a628c754c0666d3c4c6590854e90dc067d1a4b2d4db0cc4ee0eeb0220de1d8530c6f5e75f59a3c0f745d90b461464a0aa283bc494db42282956902929581277bdba7bcb2a2dc9c44858f029ad4bd3328681eba342c69ac86621941fde31e557157b47892d59fa2f8050f61bd5ecc9e0f637451bcd8d83d81013a1e3df07", "63536551", 0, -1538014879, 1537743641, "533759afc84b7655e0ccbdb4b175b375314bb4ab2296e3d7731adbd87ec10541"], + ["030000807082c403041fb3ad31d31bd8f1950db7b503830be85c7094f7d96e442dcbf8e229ecf530ef000000000365006afffffffff2a912ce8b159aea75d392163a2a1c8d5023f25c38422a2ca0634fcb10d94a820000000009656a52510063516565856f6e59fb06ef6e2e23ce4f01c77776508f1e5e48e4f03cf6a3f24f653607e0b2f9a9ef0200000006656552636551c64d5146e71411873e40dfabbbc4dd54f93978836a3032be6523741f1f9be6c3831c021f03000000046a63ac00ffffffff0251ef6a0500000000086a635252635165653b38290100000000036551ac3cb30223000000000300000000000000006bba4d0500000000f201861963af29c44b9f8b0d5ed42d4a7e0c1c638af349376268f787af8969b45dbc19fbfc5c1fc6c47208792ff19a5f9521c0f0e78eb5a02579d3ac8ca90fa48aef610b7eb5f2b45f62f0dc2d09449e0229860d990db5b57e012e7e631bff3800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dcecdc8a62506cb1d2ecdfd8e7f6b35e8e9a1be27c309f59bfb26895ac30d2a6d03e03ddd9ad2e67bcfdac2bb80b309d89998e2018fba89f946436d8e0bd1c91a58e75acd6d541d81d005dab7eee95145f1d9330112a6b98e55a21633f9b1b224f2568b286a249f0a2a12dc2b1f529c0d9b3f1231496c2ab4139dd37fe7b8d7f020875fd161b1447d5f8f11f55b896ce7dad864d84d01b02d0fa2055c45ba6da230207973a677d13474ee58c8e71646f399e6189dfee4ceb1968ea3721529cbb68030b001c90c9062dc59d1ce10f8e949ce507bf73b104d8869dadc89a6bdaa9d51f603c7b4052e1d6153e27b092ee095b340b5cdb999af79d3a6f72ae5ac5246ac3b90216d539e7b92363fd113cba0541412c9098cc3af11afdcf7d271ba3c1ebd1b7b902261f5f644abb5c8fe90468a17c60cc8ef0c0ef909f05ca49c0aa0c990fc35e7a03266dba239660ab217e21327659764152d159e5ff95593801c749477c12dc6048020589589fd708f591bf8d381f59732d686780e7d798f442ea69d6393630307e640311deef2286e6c86681db7e8af741e9e50b728bc0ea8eb7450e866d574628b2ed21fa87ae64d3afdc44a739c3bac9e8b8a167018c77f221d7df28ad60e021c4dbea9c63c7a1911ddb1716b9c42ca08d43d6f9055254540e2ef649a87dd3ad854542ab0104fed8c34d39f7b273d579ec98ee7d13c753cbef82e16010e4129775c9b3ce3c1b8bade5845f70a19b7d54b688219b3ae3b49a38d8a43c2ac23e5a7991e9a4097b6582fa981ddd3da70e2c6732293a87915400678854269b359994fafd91e8f610535a2a856d3efe853b10766fcf22173c3615006498e3f2e13d48763516b6e958a4e08ef1f02b7f6de8a438f857665fbfb12aa05e3a9493007552537af428210654974abf8417adb553ed866ded8fedeb079a6738c8dc9877cc1747aee1cbdb270684b1d53dc23b7d08bb3d22a9d0815d328f7783fbdc0d32e9475652d98a047dfc959ee270066efbd0be971762e95d6725aa51b99deb6d4e3448d9646888d99ecdce15a6fc40c0dd003d27793301fb435f7579458d07003166ffa630b07edc0247d35421b8e1aea3c8ca5db8054c1d0c134028a6f2748c9b2f21811e83ed33a2158df4b9657672f1a9b3ef8a061bcb78cd36fbc90e74bb9e6aef0093364b05aea653a34b77ae8b0eb101f0efe7ee474e60bb4fb099885b45f689acf4491ad077025c19bfe4e9e4607452a08109559f1c54d428c5adcc6bd3ca5ffeee656b3e214e86df9e28a914dc23618c584ba12adead60202f6278edeeb95d2479b70367bdbcb6eaa7b39508d9a8848162aa30739c94028e772c1ff2b2531b9ca2ad7e1aa2e9d32f741669e296dbeed5eec4956261d7cc16b84de70f71a6d5068c07fee985572833882cccb762013ccbb45007969d8b02707e00074ba4eab9219ecfdc798602ae440312f13c988dee1404a33b03908d5a047d0750eb5c211e25d7dd659c5467a44663e7e67222bcfabf53a38215be3b21f8249f115faf1b858d2c789cbc57f5ae93b72d630e93d8a27d76c3f6ddb384115a98810684137a8ebfc65f6308b8800015d4570c26120bbf7e38eea2be7dfb9ff9d8e7f7324a7416b41698cface3c458707280bfb556f86084c8ae5f7fde676ea7893e2987e3bc8a687c04ccceb2e1dd280dd6e671348327fe811a457897be9d85161fd2ea0a2d803243d20477183ffca39f08cbfc49102cda373550a0b8dc6ed2e65386243f6e93522fd23a0cfa6f80aa01a570d9df81fbd8e9486f42157b29d25dbe9963922daca99c2fa1f6e45f41b41ba19cd76e1929523a1e4542859cca493df9cbebe9d12b2709778d02f490b06e1936ca7d27c1299410e4a93e162f7f0136883cc225387c5d83afee2a24dc2a3b6ef432020d8b68fc8281e37b522aa0c2ac6ea788591d76a7d7f5d3bbbe91d8f9730a376d585c7bd65aba268ede5621dd0142cb535e3c03dbc14c055c00871e708c40cbdd1ff9bbfaa30c853f654ad4376282c8e28fff68813a11561b9c353913d3ec973c4c4f95b4514c380a8e10d85ff484fdd47af0722b8b6b6a84d4ab721e891c1217e69a09ddf41704907c0d12c042c99687312209d262b237115c86eaf644f6b829d63d11100631ef8299b587452c37bdfebf851be702836ad65c7e5f2c9cfe034f441cf15dec176706cc3b5ae2d8bc97805f942d5a77eec6a6f827b1fbece2eae29827a0af74e7f8ce8da242314f7c0faa0dbb1844b1de69163a0b27eb05bd1d7f0a4e139a353aa500000000000000007d0b7d0300000000f5b35823cdf499f7e8f4003a2ee49e47503481f28e6c9107c77824cccb2c0fb8c9bf3d81033765006a19ae07462d5b86592087960d93eb8a3cee37d00bbd8c67b26fbbcdf7739a364498d12ce17b760c4ef5848e30c581dd54cf48dbb815e873000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008afba2b91307eff023cd79f28273adc048058e8d7e48b9be94198b617634d2e39cfd6605d94af55e4195d5ff4057d7e5f3e0a0efd2d8a3ffd8f401521af4493fa659ec35efe56cb3e48720eb2a5e6b3ea2a1849612fb5e13940305a745ce74cf1ccc3bad498c3cf4f075394f190657bda3f177a2ae534f5d6250b4ac3e22f244032a0b1277adfaa7fc534084366f6aa06bca3eeed73dd1d1a7a948a82a42f5f8e8022876531c89438463a7f40bca8fb83df11d52853d34c143dcd35a2814fcf9ae870a039e8c658bce0618e069cab74d53d12529aa2b4edafd71aeb30f22862a8468d303dcb38503c9dce2f697f6526087390a9a947dc8add0baeffead67aa7456fc25031de5772637e5edcf2809eddfb6805ca1dbc376c927c88460802a1a589af4e6720225c5eda7a33f63ec7c0b8b6c637cca5b66554b6e297ad2f8fc30b10e9d09fbc10325518535a2ae5a834c0f834d8979687bfc1a63bf95f5ad50b202ac89022f150b022e42297a19ea47cd4a9096a21965fd3e099f1a75545f670bd263b95cf10e21d80219337ad34e1cebd234d32a7b3a669b70f5103b015ed3fb10d5b57c41a4c26a4b94e3c04b5b981e76d3f4232d81a478956251b088b50547e325ca0acb05cbeda79024d3adccaee4b366bebae0550cc8f364d532cd71e0935f8ed86256f68c065511dbdcb07a0b344443023d3f448ab7de055ad43e53a423c0a61c4215c64b8bf1f1b03a41a0c0a0cb863ef52b782644e672190484f545ca8013de54141da301d7210ca3ab40f80eb85585e3e9971c3d05666e386bf6660a53fec860bb4968c28700a3422f8953d08bdced2ba433d49739101cf435a1ffb29dc20716b496621b30e74f5c58c3c35551ee1c4020cb413d487141635ea8740efe5db2472041db69629c544082132442ad8ff35f2cb77677a89b4df1dd4e06497bf67c07771420fdfb47edb378be5b4277e39c9f1b73f04e46681fc8009a40b1941268805ea389fa904247f70f8b96df8aa80c1b7d0ca943fc16fa0fb86de28cce8a9ccf005fa56d2a83df4e87644d64d95d9100690ef9932eabb978291b21d8fec2e45757232f91bda12aa38bfb23db96337bff7333da86e952fee8a7be727f5a53cbec26cf99d1f1b9ccad664004d0a2ab58744e96ba522cc0d365eece0dcd6e2789f4361586830cf42945d81a41133380563d1e87eabb8a1c32c6a501ccf5d4e29f3e50fdfed9de7fede2bc40b9f457ae48d713f9ea22aaa66e0bd69b3025b695f9423754f99d59e537ec0f95c0abf2f4f928f0b3362ad478ecaab02a9e6c9fc53962ebfe7916be8338971ff17210755fa74380e79f2bc0472b56a4abb9058979f7fd3f9fcaaa86588091847f6eee885c922cd021ed6ca1a57b3ace731328ed312ac370464ddcd19dc7aed4531e602a014f9b561076ddf56089d585ecd2dbb00c6b41fd4d4e9692f20d706e359af66ffe0cc7a73fe1119486b110549cbe01d1e3080f25cb63f30277db863375da853fe8c19b423f7137f6620a6aaf120e5c6a375442afa533d71099d98bfd2ef06c29670a886e890c38623503826effa1dfac0ce0a0505196aa6c15e53824cb0d034053c5be66fc8adc405cbf80b1544affe862b13abf86b248e3d46cf1e261efe1f35859fef2ff65f5c5b0a31f08cbfbd1147e4c751a5d30677fd18e1aa9818ac6a0a5916c7c3de3701651b5d55916dc7909e5f495cb259bb784084e2f70dbc9722d6fae5745785e3d384ed85cb6cb0c7aab4a07cf13d11f82d2421e02ed349a753ef4b16354fddb43bf5241829bc2d5b3c0f4365779bb9b9a386d0eb1381a7eb869667b465aa2b771621beb966014524f4507b71de525ab8c283591623fe9b81184b284249682741008203b887235ec8e54dafb9462e4a4831f5f4b824fb3cc434a312a179854c85909cb74b198bff0d7917016b4e77bab0ba75fd09b6738b13c0d09c1dc5b35ddf5d8a702a89dac56373d017352bd4c4b75cf4cdfd3e4f8167a21dec8b608ea8de3728c9dfec74a27411530f39807c909dc9e61a9a39a82249ae58ca874490105626e4d3b1e459d228d9b77a31117f44395decb18c52f96e2ad22e2ddc29f0f28f91181e9c9feb287b9cb5f292bd2911ffeac313d74ffbdf5041ac117e1eed6a84f3973a0f36f276a27b985c69aecd41e3b4c0eb920f31f4980354867ae10c909a9871957a32102fb9d5e72ef7eb7685e3efa36c103b12570c49d444a84389a8f504c30c8ae57e663a429de08e8e3b9c5860f2ef5c5ca693e65ee9ac8b970716490ce1fee000000000000000009b3bd0000000000cb699b7bb151eb1316cc8dc2b3b0f266205f52394740d8a066dae45a1f36324b4f4042cadd8e850d899cbbe8bc3556db9f50ccfa20e0491a4c5207de443a1aa4b6dd7ccfee62e1b335f5afce847f703ddfc5218ba031083a7f586aa956ed9b280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000092518f2eb5e9078806b87c96065665d6e3aba06872b7c3395b46bd0ffd6e0cdaeaeda30ba127e42bbd6bda8728bc69d5190185db342762c3b33ff8bb7ced805391b42d5ccd4be30019bc2725e306f19f919663805ea7cc9acac92cdc27b5321454df0a7d39d25a304c64f6b341e06f6b32bcb163039760d7a9fc576dc7d7e2cc03060d217a6f2156c95107efffa86df009f4d519ecb02d71825916f1804302dcde0311fa9ef2c7216ee0ac37131bb420485fdb038962b81c75131fdaa3b48e850b050b073be908a36ad329bcc593755384480547a6a0126d889989b10ee7b5d2316c62098dcca46e754e93449b0591ce518d591000f50a187d1275e0cc82f20838f79a0217545334ed16b08d6524d984999de701436388f7744af2d2b9a0d64ed8d447b102231b6af134e6ccb743736799b8d4fad818c385c7080c3c9af5efa00f88ed4ac3032a800323e913890ef55bf74039e5bcc0cada3c2d4c6d1d0588bd2a08e2c9131b020b52807bcb64ced694dda77c042cd6730eda8ff9ec5e031217e29da91cfa876b0207753352da3a4672457412c8590ac3dd14baabdcae68338cb1ab1c8da488a5e5de07afe1b94b5befec5fff58c3a26705176cdea9e6a86db0532b5b54e14afa53b3df393c8c1c42142b0a4b37216697e5f130f58ec60b7f8ae17d84defe6885c6e41100c19e87979f089819637d0c6d54cc26a8b5cd3bfb7ace9a900beaa2a8538bdef8732b650664b54b97a6d4f01c95f8c25e1b99f54ccd2103854ff8b3dddee2ab9f96c3afb6c14476375424fbb875687dedbcbbceb7a0f416ad85654ba56d706660ae7658bb705a6ad8c95d807770bb1ef9b899798f96dbf261bd95a43ac22f734ff53df1aec6d5209b9a47de2a9c3b8344db8e041f65c86eb4a280d6f899e405c9b7b711e32ad973f4b37c593e185162aa9fb694d9cce2d193cd31714f827db864dc333f05b44d0e7e3bffc7c09831754e9a7861a659fe0af3f540dd6675521a3a59a480b0042ec258142b7a3099f8d639a25b3d308c80e1fde849c58741b1e5ed7922ad34dacaabece8a966e8edcaa64eedb0b738d4009b2a838e8edaf93559a41726eef172a6c90f80775da31fc2d7fcfd01f7cd08d2413b0b6601ee757948640451f44106b32d4088069324cdcff0dd3fa65c700270075c68d611d3f35e6c97e29f142826415ea72215cfa6e1cffcc48b8a6623fa724379a0a76b3167925552d0aaf68b698cb5031190aba2055cd3bb818d3ae8b2cc8fca445e388e9ac3f6ea55214f6f461741073956c7a7d4ee858b97d04aedd429ed3290870aa4ea4f641dfa95a74c6b35eb2ca6331b12747c72981f3a6c0cbed460dfdd76745e0f93af7673f923a7745068391b0c47f03ae846ba85d0dac6cf0006e4c8d99a07dcb02802897b2d0fff6db7569282aea0bf7613cda005dd38d5396e2205015b368fa4ed97440b5a920f7d480799ecd909046283484eeaf32fb8f11d452709d16acc8d5fdba783dc5b469f041d1ff5287075d1e3ae3152089f198997cd4ce1ef4223716099fba03f12bcec6292e20d23ffd13d8cac24837508f0cfaf82b22b27dc86878b7c38e2a476cd618d05ad60a2676bb9b34c7cbcd437dba269d09032d0e832ff18af646ec28f5f29987e7e76efad38584e9b49cbcbe2aebcf4c073f81f8abd3ee9f7207e513f8b1156bef03b43fb5bf4886d49ff7d0f60a2cee3727565d73e689e3d53b420826879d20d3d94736322044f7a612302323b208b6a6f11d2dfe96e5285ea02450dbe2947689b357463c7a377805e9d2ef219caeb653770364c0cf90d2b3d3f05a93887c545d700da52c3657971cfb97994a3358bdae9404744ff36f078934b1df3dbfe7f3220934edc0f028cb855f029ed932985c69e55f3d3f491661a53d9d037ff9e6e5e8be3d6c0fe14622189e41cb1ac5d665fa7a79f61988e8821ac02951a5422a785f2313215cb6967be631bbb572edd727589cebbdb1a5b75eb6f924612b28ce5d7a1c264e9484e6173a43b6b9f495df0aad1febdbb759632e50de8b99221fee81c3f31ce501e35145fe63c69f43279727d4d8fd8867a1465980de9627fbc5a3306472190166fec98de8cf1a42564702f1c8e2f7d3988d8de4c3d6c639fe40f1f048fab3f6199960f88c25cd561e8a0915ed8525287e973da728ed170b5b92dea7d6bc996b1736d37f42ebdf9fcb75b5815f6cc7da80cab689d24e819f1421f9dcd51ab6c24c9459a1178f2df43aa39cc87070c46700d67b595a7f56e345d506222df2dc23e146a53634ac9a47a4e502150a7ea662743c73cbfdc999413fa85b2c26ec8638989797c331ccd02965677afef34961f401e4e6d2a7cb5c7efacb4dd0ccb431724ad0d825671247bd380d0b723674b2745e4bb3c2b0d0815a2cc3348b42c6c1400226300", "ac53", 0, 240408717, 1537743641, "710ad41777b62f384650ba126b0ad63ca3c999738e23925967cd7b66f6ab7768"], + ["9cc132000157354c20a6a43565b8bb44202fb5d8ba5b805ea7cba1aef4fb4abd4bb4b75dc400000000025300ffffffff0363bcfe01000000000563515163632d65b2050000000007536351536a53ac23407905000000000451ac516a961c7636030000000000000000e1ccf00200000000bc421d468d3d4bcdc403f70ae3ae02fef7ad17b847df74fd5c2a7c93a0a4850cc6ea8750d49bcd7b7f202a6a0e665bc98d66c8208ea2268f6cf1dde072af6b190e5749f61ec1f8890990342cdad0daaff63d4f08c1e49ddd538f4ee6f5bcf2a500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a817fed9c999a76500f0fe02d8b5328d8e07c473da0087f4c6ce352aecd00ce104d935c134bd9f287994886ad41c5ce950dfaee6cfd9d89c063f4d4bc18bd9815b4d821101c4f462c335180040adbde0bd0a0cc237ea96d321ba2321fc07c79127ff0dfc1ba00a3c174a360f39c50fda80b3a98165465add2f447bfd117d6bf20317ba22f026df922311ef835b9a472ca24584c2a90addb6df2c68d548e588732e0212dc345357bea61ba62e87a75aca262439e07db581267a329f5767a9acf81e700b02d4749bd5878537d3730940dca0d82b1016a88f493bce2725ec7e52d0018b8da4b85a0bdc2dc14596ea961ff14fd2978c2b2df122d8cc5cc2cd0282505bb67202058bd6aff9f30cb460f3e4c5af82e17d6146f1b5f121ba567fb381b6be2ee649031a2a45e9832ce4f0ac58deeaa2bfb61b5709fe1daed2138f72d66309b187e5f402188374dcd6ad55cb7438bc19835810e4a8275f3c70127dcb3c58048106f0a18c032cb9aced83af82c51767ff8bd790368bb501b64a1f8bb61b7ab43e85b909de8a03168378aa242554a37b924ee9f09329f66fef99e3b54f04ae4e1c596cd1baa8446a9f62ecf6da1e24040f8ffb3a3adf09db0a3c5342919b2eb101a259312ef4b72ef29132c13cc955fdd82a222476d7e6c3aa39b45efc8b00a6f0369e0572ecf480ba46240673dbde69f4b5bf09429860cacdceba21d01101daa1edfc5a9115aee4726cffc4e42508e3323a3c6f5748527d74e417a80580b7e5aacb90423199ad8cdf986d514ef62d328f59fefb1b5d892f7d143867919a9a802b8bfc9b22efb73653661838db00f84ccffa3fbd2379f7c505f5b59a4ee6b25d93bb9ef3e922808cfcb1c80ac60da3f98396127d261e8dd0115dfe1a2435c87100ffedcb6207c63b6f57ff9fa782ca31edd3fb93c145aba907d92b2c0ac0085bca5297e7ef4b7877793a6a346d3197549b922187f086911be58dfbc68b571381f733f837043dd2d419c3b05a9ccd8df948104d9a34575f48321d62b5f3fbc199dba1008340d4dc41c3efa744f5457ded614b12d38e0cfbcca3a4411a27a8e589c9c48f3185228bbc07550bcfc601eccb093b572558b1f0bb0b898bf48ed1c1ceb00c37a85b97cea74ebca8458320999f611e81778c87c73ad9f26622fe492bcc799a0c1fed9c664c0efafa1432c345ded17b4f587ad19db4ceb9899f7d0317bab2eefe4b0754610e823676e7d209e4c8a738e52d53b1172df1bdeef3352ac209b17bd6590c79b7e2aec0d38dc07bed9cb02b71f59fbb283b50497787d578724cbd7b5fd0773ee94efc852107bc81634fed0421cd508b18d0f8c4cdc43d41239d93a3afa57f321757f65fc3216ff035a83c949f33cc8583e7dfee9b42ccdc119cca1d39ca3c649bcc795dbeb3911077ad396dafbe9a36c7d45073195fd239bf44c0e6343b4b327401f620bed318b25106cf5a0da15e492ad9ff19976153551015fb7d83507a8aaaa5427509be6d09e25bd515410d64fd68ca123d91abc9767a832f09f8ccefee8f2b9dd1118859e775edc79fa333022ac6da24e065c8131c927ebf1a91f269e9901d10a6c1d1e315e73b24f382f74faea2159cfbcbff3990520d27648ea73c114971791385d60f1121f0b4e6280de5244c6ffc7014af16e5ddeb97abf585353999d51225542b6fe42599d4db14d96b8657b6a09b857ba4b94bd0f8d2e884a8a42fe7c77a118ee6baaec6bd32872179e46783f461fa905bdfcca566d3ef1786928c27c84c90ebdd92695ffc146b4b456c7a287206dfd2a2a512569176d775f20d38c11e729622ff3c47354542eb35e65b2747610a78428c9600143be03cbf516fac0af4c4f864e0a962cc6725635e5a4b5f4402011df06d75d60833f9fe6fc5eca25ed70be4a50af6889b6405aba809bf0db6a3dfcb3f904424aed1caf447d40bfcd3fd1a5e01b96e634428ac83051d4539f49bc4fcc39f3ace0a2ff99045c5d89a060c0e59ddd671ffff673e4750a2a7a494ce05efbcfe984acc98602d60c4425852d215249068e811903b2eac998a2a3b07762e65e80c7249965e81e3649d2b9b359f0583672251d4ae04f0e1cb181aa7c14bc1bdc42c5a38af563c02a00c2411b9cdef271e33a6df348af68de94de3ae71fd1e049e7761060c2af8905e74867542199eadaff89a7359fdb418677d587cb8c95a5e2b2b85006315a3187e77dac856031edaa112e34e3acea15086d80bb81c05440579b25eb3cfa417f2801049acb0b0aa0711dc7628f2cafa5dbd95326095f1faa5fc0000000000000000000000000021a57af3aa4891665b83f64abaa3f20fd23362d110fbe484cf009d78dd8be561ca6706eea5090a56c81686fc8310463bc98f82eae41896f3838f6384312f87766d66b6b7994af594d7c1de131dc23a0e6a30779282a092489c85ea41818292bb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055659da792a492bc96b23df675f7c558d561f5221a3cea83811b18d737f6ce3abae78a198f246d48358bcc6bd8f9f5f6c91fb994b50179cbcf5947b27ce6b695e66aa4d3dfae78f000380e689698956b58fc6e1ce5af2d3c1d92064ff66728e7906079e4cdd685c2db639eef01ea884159e2c3b33f8a977d6ec2984792f0de69020ad2a33f6f2ed3b0549c488cc2f560ee65ca206275d883c7be08ec820699a274031cafb40f2c222db9856258750e998bc50806b0beb5aa73d1444b409e0b0422bc0b052183d47b385075445ffb9d2918ea117f59e703ec2f88c8c9925ab9ba3cb9bcd9db8473e9f9a21dd934599b284280b14d3a4744d4014a3a4ed7927d725d5ded031f70ec485f61b8a6ef1530d0dcacf424de557b6d2143d8f12b508f5bae0b03dc0219b35a7be35fb52a08e1113d550c3f439730c6318f917e53ddc74a034121e71c021518443c0a80fef2fd047b475356befb6e90805d85138166fede98527aaf81460326bc09f9f04be069dd605cb6bfe284de2186221d406f6c1474f93801b3d563ad031a5fe7798b661e53c439152e8e67d42946122069884e1f3c630129fdf82efc90424060c98fb764df9c8dd08be87270d991e94b6736551919d4729604ed237cb881b43deff76bc50899ce1559d2307fe048a6784d5b8c379bef57c4b221372820e1f769dd2ae59fdd1d8f5d45be4f95071dc08ecc9bf553db5d61b0b3a7db809301ef33ac98b476dbd41be11caea54bc6c517f542e9e949fc14dbf4a6342f0235859b10c06f72be79e93552ae2b60a142abae550481809b3b11413fc9dab3ea6fa95c0f6d2503ad45fbb07ccad3afe91466752d6ad6a4008bf78a7efd08a91a9f10fef66d1a33aa471426d965107c2f92b8a61d872aeb11437da0be8e4696cb8ac06a316a5e59cd14d5ac53b324da5d043510c1c28e6535ea9bcd5b8bfb0fbdec8e2de7820da2d88e3c18230b8599cce116acf6913d07a974fc02d878b226b2158a4e769b94ba2bbe87fe3eaa7d56ba42d08c4ce2d77c321b15ec405d3153957716274d01ddf357ca9b87d54009152a1625c80d360d50251e14e590b20c18296788d38936d4e038c49ecf15ca75cbf5452c18d166ef9c35b21ea9719ea1d9e6f14d44cd9c15f95a97e0eddd93438f85f881a35a92d77610dee6ffda9fb8c51c17edeb23934223467b86fc953756fa828a1a600433c44d7c97ea4573a0e8b0c4eee7c6f88244a62edf39ff0d415acb4fe977c5b12d8f6aae85808e17dccb6535554138751493d5a417e2b6b5b222aa8ad689f3413991fb23fcf4d54e3db47c5bd0e27a7fd5b4614644bed47c5074e4b151736c3bab5151a14cd1c2a63c4f32ea4e3b9207b5254c7789d31d423c5f83a9140a40a0b2344b2d291715a3305210bc1cced739f7719b1efd7176469f8a6b6eea9624701d8cf9e3cfa0e5c6fbe27e47066b44cbe650c5f46cef09163d73f23cf38b9948664013f97b66eed9537dd465152990b928dcd9c529d3df58a95006ec575686d1647640663b0b38f6c9db64d9ac95c41f8079a2190485b57c711cdddad15764c76fcf6a96071b2ad473c3f5702fee3b95a8c105bb68d62e7e604389a2566bf4b01cc285d245bd6f9874468e735c6b52aaa76c3a44a2c597c38d26c2fc9a638cf5136ed84325da335451edb45ca72b82a9848482fac4b670776972121ff694ef4dd5db0ef18ab2bc04ba13342cfbab5b421e362d44bbbc34c562df95a65986b41169d30c75edb8d91c2d8b0045afba16058b60c8092728b430526cd0761bb53d414b705140e290171ff18bc7809435fd044ad7d20b5e0a92b50908f36547df6828d63c20f1bfab0a8944c2138e96e85e4d09e1b806208a9623acbc096ae016640c2271641442c0eaef5765ff3741836ad51425e9f41f1ab8f484e9c3f42f1387d42f6143cf98a94f8ece116e96a3b0b00c45a1aedce853cdd717b8d52a807fc75f7c54a2a71fe4330cd216f043112b8c348c1df3a7f6a23c738231686fe7f66d015360a957020d6f5276830f2f9202643f32c0fdf253a46771fea4cb8d830a9150e0e56420959d01ca0333de33b707a58f4a3b2e12bf7a3607743734f7a12c1fbac746c97c4583c041a985dc15f5c6dce70e6e98f75b52075e08b719c9bba737018992d96b8571043f8218818eeb0b8d50c822868e7ff46fa1c0df48b86468f709683d3e5956a0c45035e5d84434dd20792ae76ad13863c9a31509b3420e1ff2108bd707ad0ea3ea4209b999cb8cc0233c47d439851df945ace52fab8e4992a882041805000000000000000000000000950de15ad1ae5ecc60a181cfcc6c941521c48006326af187371dedb9446b7da0adeb87df69131cb1e2bcdd2297641d1c0e3983e13e15136dcfa9a098cdc3d0fd85c84b0df2358383d1c3267bf207bb9fbd7c0f8ca0bd7e0cc4d4119fd3be55a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eaae8e4c925662f7897a0c1a58f66b119f1dd2be2a0513388fd5f3f9482ab9f696f7d80c2bc75e7e0961fde51c0e1d0b85c82091ce310eedf8653be64ca786bf013a5314d7fd6e5ae14125a0333610835e608ff7a91ba62f21aabf34fdddb43609291f7ccdd28d39de8a69c6632eaa09ef704e25f653cc2f36f41ca8c8905aa0031d82f0fa5c386987f7f61ad2b396186cee1c5d1995ef842d046561999994a3df0312edcec6a1fb0c717bc9e5e6d0d1c94ba4c2e8b066805a1b588f1477140ba6790a027dd264f20b38a2b5afd1fd0d19892aa7d045bc69b9643e5ec4e53f7ac7ea0993a3f786b4a54404ec9e81c6bab85c57fd2f6c66c757e0caeda47874fead0d4c0212115b6f683d44ac18ad045ab3ef9642ea447e0854fde38328633e42f1270221022672fbf15fe0552af9dbb924636568a652bc73999e64106413fd9d7de37276270200571d205db8be32cbc9357f48e76663d37844567fc073c7b0aa5f03995af089020e8f5ec593ddd5cf561a44a11d9cc79680d400241c1cc25d99525025d5563eb9032abeb6adfbf9b748e2db1f09c4b33b31c8cf277411c05ec38f14b7ef58b21316f473dec30fe7396569879fc3ce1074e1706d92e04efcd19f29236cca27a3e074a5bb0b0d1db91f0e9d747b0d75cda1e55164ab9decbc08d1838641cadefaabeca66976bf826c0b1e45ff2f67200b34a35e22a1e785e8d11121a3df29931b545870e4d0670287babc890d45c0b96e73ccf50eda69f59de1a581df1ee908fdff96049fe277d8a72995e28075576b4d206acc681b5fc5b0e3969c0d16c5ef358a0479400afbd438aa6c1f66e1ac31bbb4adc1ff4a5c7d92d0718112cbcc12029544672bed9025660e43270f5f49e72ebedfab6f699586035c541c24036539d7aefc57ce9a1ddd9a8b5d897bf8fe400a928660d30597b2a5ed2a223a6bd20d7b9dfbaee0446a315dc9ab8e750b0a025858b3de24b0fa6634f76f2b12c11660748d59e91a79a3e18d0d88122bd1b38a47e47adff9c26876e617c3a4cca5cb9f2985dacec0b892681ac592ba6a9dedc6286207a684df5d441b53ffc16b4cf94d43ce1e876b9bd95d3068e8b0ab4d8a4ff5673cb66531caaeccb99d86cb927f6b84e3c5d72a9ba3e40034d4d0fcb17eed29c4add03fed3c4ae08a7f0175a9ee0d609cabdc3a64bca0f8ea8250ce5b890720334b3606f960f53c4dd961017e06ea8d6816c90fdff594ad245b6d50fcd0f58dc9258950989f954d998d64196b886ccc342f662d4ffce0d1a62e035fd9e5312b109133fb748fe4f4d667d223e1886d063dd38d282c267ed48bb825b28a5813260c04a4e4f7b19901d2343b43f5538fd4b080c5b2b8fbde9459111dbcf0e9eb675365ac63d5c44ae256bdf3772493b911988a2a3dfbd7b92bfbcfde71704c6384cc2b276d44e7545db8d96f943b91366dcb0d0aece81cf911abd9845665ae87a2bbd63b2901a02efd42502c209c4bdf0cbe0800398b49b06b92a0c06b1826574c270d0c8a073f25fd47ce1424f16cea5ad19b15b0565b0076498dda0a43f151272fcf7da042f69096fac259bb21fdcef759b24c09f46de545cea1f91e94d5df80fab9d4348c1a112437e4b348050feec5e1dda607e611be1eb765fa82d8f3c73b3816c43f78a96a215c86214d2ae73f1d3d942679766a23d90521477af675a54e27f08e3b7dc473318a8ff4ae4518f85aa4f0dc6b431ee2403c4d154aa9466fccb24220ba99107a13ad7cb29d4a22531503841d56167edd27133eee2944028ef5903c404fb84c68cd25f9883df4fc5d6acc640b51cbb9b66b4d59780f6c2cdf27394c32fd85301527477e315f85b911c0ea14d285efb6a90a563231970918a0f33db049b1c1118d9655635cf34200f096622250a187e26ba7d26af6e4c53a654b1d0703fd9dbb9984bcb974d5703de5d4fd575ac53e80d341eec79d70eabd8ad2d2320dddad067e8ff03f0d7672f86b3bfed8073be525e05efa59af0e8d792b6a8b10d794a878cae98b25e603de15760d3d38f895becbce5ad84bb9fca689be6e16db4fe0e87f9acb70e9a47919f93303a5e0d87c4093b66055ed559344f680fcbdcd136fc7c5f7d1eb74c07a9d93fcef05d57ba8afcc2797dea7595435dce31c76f394ffdcf6cc701703f22b527895a3bda783d9b229a3f781578b7f3d2b634e4f91230a0554f480b15f6e753f6b1e90ec30a354856aeb0dedf63d7e2669cf8f8284760210cbca04e37846126da152f8f2c707b14148f8960a8b0d67666a2c12497324c4d53ddadfd49b0636f681d886c411a9f3c8c4edbbb3bc070e9dfe11f1cc7ba8cca9f9faa95349d4f16f87012c3f964b75609233634a0112a5c4648430f2662a4d81cedc161781143b7389bdf45527752c6e90931f75e153a82a8f86099afe1805", "", 0, 293341050, 1537743641, "7e9c4ff306069dd46429f5faef4360eb24e2dcf14fabe82168e7cb84fa1b06a8"], + ["030000807082c40302e89bb5fe65e44c3438c4a9321f9fd568594f99840410183d80b4a23f8c294d1b0300000000d7edbbfb6fe95c85cbac09a2228a538585c5a1aecc577858638f2e7fe82057f81f31f4e40000000008516a6a6300536500ffffffff0296c8250400000000065353630053511e05740100000000010000000000e359bceb00", "52ac", 1, 1334908246, 1537743641, "1006f3c4b2ba2f9396792b2ccea1de87f725ce15cd898cad21ca32a1df0b4562"], + ["030000807082c40302b1b3866ab2402f39877a1ec3198939e3eb7feefb5ecddfda9d848fb8260970ca000000000900ac6565acac5165aca8cc480ff253878f9f1f1eeaaac5ee86c56e5b5625f0aed58e540a771d257062c5dc6dcc020000000200ac58b653a102505450020000000008535263006a636aac7cf61d0300000000056300ac6a63d2021b670000000000", "51656351", 0, -1276903339, 0, "5f9ce422fd01deb7c6dd0c4c59e39e1de4bfd31fd7e3f5470e705694b7ee51f7"], + ["cf3fa65503528eace6b896a4bb45ccc570f60be6cc474f4e6e32649c6d4dc67a9388bc8cb60200000000305de448a3362b079b8d6748a27790f8f5791f8d8adb785e36aedd44616a69cf1b155bf600000000075151ac5153ac65ffffffff26bd9006589cc8e34914a300818a11dc08ddfecf15d2b10d5b29c6c922776d29020000000453526a6affffffff0457c456030000000000489400040000000007ac526a535363acf0ce980200000000020052653c7c0300000000001ee2ce2500", "53ac53ac", 2, -685353509, 1537743641, "81b60b7c1240c1e6e8075950a749de2f5a6fdb92288117b71688c977074b3a45"], + ["030000807082c403011d29ecb93d267c645180069041c498f0f763f45590dfff3aea2968c5022ba5b80300000001007b1068f6021b7fe90000000000036a006398b2cc04000000000551ac6551536c9269ece47774e501c5d7f603000000000000000000000000fff28b965b58933a2d73c4198014ce81a3d22831d09328c140089275eefc14cb712928268dbc9830a2e02b22d83ca892d56496cfa14c6b648d581f2c05c19457ff834d65a367be4f0c7818f25605063051da84edca3359bbea5809157ebf3bde0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085787019b8c5a05dd7f070948e23eb6865fb9f2ced77630c438f901b71b98440e0d2762a95815d31787fa3c34d2b97dc9a01dd9efd19c3bca9da30685e69724b16a07b05243194ac1d8d98d15e85aa28af181d9f0a8258988ae13139147e94b65378503412587bbf73791cbec83448701543acb1deb8659f86861ce892392aff0208ca549d36960b9f6b7e76d0f0d2c6da2f54aeb97f5085bdbd5c366597f7e008020afe3ad9f162aab198b6c9df038eeef0f539ebc0ebe95fe53e33a389d5d2ed790b0128fc1fba8c50f4bb7e98eb4a9e7bb510ffaa95b3388f88decae32d12bfe864fe701ad15e2d4ba12e57cc70439f66ecead407104a6f2ae448edd1b072646feb022f1707ef2b3eef6df7b9dee94d4192072518db91d80066e65f7aa417345aa37003131a94eddfe2c403a8af836127f04053f93358d5447c4c1e6be91375bc18af3a0210afb50f63ce0f7fa8ebeb2632e8b1f95c343b67d0c1bf860d5cf9658de32f2f0320c485e142be28073665b7c2011a3466e0777e81095530df80cc88774e235d4f0311515fb8042f4a3584d21a27e4dde6dc8254199e55b0f121fac0eee001a0b681a35748b8ad8eaf87080a1562a7e964ea84f350b5d04cdf8162a309955c0e3073a61e9e04682b6b78e265309237f1bed6485a818f409f3040e6a414a666a5ba5d9d9bb727032a8dcc5b80ec36e2e9732f644e037b8b5bd30397699de65f357171ef2d3193777ac49262c93137a9d8ca10dd81cc89ee899ebaae15117482944526385094bca23e7c6342f1de11f2a193c2ea63ebe84f148384a711a85072494b961708d8e3711b03a4ca345a1bb6d1af3860ca0b6b1085929676f68b223435512df512b2813e16a82424dd084799f450bdce4b968f97475a7fafac904abf4731f5aafacc3236e65635191a5988bb0eb31f6163b07aed3de5eba045f11d467923ff236e4f3c211a5a9496c1ef3801b0a055ab968decb88e331ff726a67176cc0982a54e703982fd82b225c3d74f0a0e826a44f8774ac6ff4c901c674aa01c05465a8a299a14ade68c7770b588e54f683eeea105d3056a2f31f095cc3fc753817199661bdd1cfe430273ef6af5a553bc36438dfd7edba8a01da9b618bae9e6d4e4069b93b8b0b447e35f56495bb0ebeac4645c0ac681481db2f7e10d308d0f287d55d010aa80660ed137fcafd46f0a05ce3de2076a8219579face6886202b89d70fa46f5375f38eb42f0081477958cb15ec9e2cb5a141ca1af778d7f9030f07f0b8bc7cebd7bd6f3a5b9354457219d432bceab9b9126f56efcef7315af2111ab66683372f1266166cd550129f694f6db764b4448195d7ad8dc7dec911ba3756a40852f8f6aacbb23a90bd3b15724ab4ec75563441ee3d345f2a5e2c6c4e62e858350d3d2ea31e787a1aeb3f0c32034e7bb80f6346a4d4053e1b85e61a6204cd4bfc29f85209e3916a5ee4d8ba78d8b5a69112181d8eeb0de990bb987491ae1f577940577e1bac16b7bb41c47f5fb8e11b742f45a4dee3198cdc1e90368ff6e71812546229ace37867e7a9edd1f2ef40329d7a3482d184d941b1e1aa95b767aa3ac6dd60fa80fee798d755efcce832e8ab6e4202d3f40130594c2e3a3fe544238f0c4ac7408020578757b27b94a225ca8a5962ea05fe5d4121ea9f097b37460a27a9fa5eeb4cfed2ae469137367d99831343307605b39749d56253b793c23063464dd28355f30f8892025294ef6c527b98c210f3d202ca076cf394638982e8404346d4813f6c065cc94989d27bb90ec51a72dbdfc4ffe379bbcd42f2218bfced4e05208740d348cbef107f833841e67af278f3740f71291ee6a0ef3668431027e171915a706a21c794cf3305ae34072812e1c971227be776ee215286e5b7c757c03477ac8bd35b0286e5e81cbba8fcff80c5fcdb54651c0c4f258b74e78de152355c43abcadc4d67bd41c76999bb29c79d9c674d7ff9f899ea3973f2ec6b1014b0a83f2e0e21749f3b65c89c3778b45a991f859a34b5c588f28639abca6cc673e387ae9ccc933ae4ed1ae703e7da78f8b7222949788af5fec27d1f6257a4895472312dbb1b448b31bb1bc1f85ccda1d640f221e20f47ba4d5694a3ef90650db20592cf06b9a02044351d2476ebf76087b3b3c57fa5e439f1b63559f245d37b9d12a903f38514ea3836a791b6aeb904c010273fa7914873588777c51812a0480fbfb6b5f1e3b8934f649dbe0df77adac5463f9a87c29eb57d88458feb86c979783e80968337c12940f48a6acd549ffeea397261e0a2fec29025082eb6af1e16b7184e1dfb3c4db209385e445e7574032edc10f4bb4f915062ffacf1ddd15e7de9a3d049d267d34671c637c9dfd96c7d7e22861ab622f02cf34811d1c2e27dbfed0ad22de6c15c41cf8b2009f7db3685fa406c7c007", "526363636a006a5352", 0, -1479193967, 0, "d3b81eccb22c83b53dc1e8660db950c8dfc2f2161181e8196271fd3c8bb1f383"], + ["33e24b0d0474d19b9c9c9498c6d4ebe7bdcfb58ccc2a8a5ea6050ff8939eb71be9ae5b96c70200000000ffffffffcea3377f0b4f5cedf9dd1a585eb6f4b0ccfb0b4dbf42e89af305c10008056bba01000000045100636571afdeea82786900d3de007e86c66f7e28ddfd40060c9aad7eb22a0264d63c8cc13df4ff0100000008655153000053ac6a21d543d8c815a606e5bdbd52aa43fd1b0b680623b41c56531d64d1e824d71937c5993cab020000000465ac52ac53882d330495c6ef0200000000036a5151e2388802000000000465ac000077060302000000000700ac536a5351656226b1000000000006ac53516365536073c0a0037a03ae05000000000000000000000000b2857c448f8e4a68e6644e409e477ee9ec7a42ce8ee2f2774490eb7159aa1a089d15a6c924e0ccea2e42c971909b9c4e3ebd050eb0099fd34fa20aaca459ccbc15a6f245d569a5f1186ec68f6a7d0560250ff2d0c7401dec969c7bab4689430f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d57070937d747239d27aa44e3b6725aff2762e7eea5d63d1717f6fb97173a2da14a29fcca18f38b28275486c6b46ce8749e769e948ef7b1d8df2b0b904f0a12dfe0163aced603908eacf5aa025bee83ac439223d5c84d2aa5875cb479f9c39021ffd1926720b55daeb4d01ea62a017912b6d32aa5c6980c026754c2e48a6357c02200b358b622faf5fa7f0cd2fce901abb15138742d18af0db2e19b205c14b2caa020a2bccb3653a09f02eaf956639ec2631845127e864d3c00c6bcbcd2b215074900a06c417bfd66d161e081c4d5bd22c8b923dd5877bb5ed681c1d75d0abed89e1a0fba64fd32ee5514dfe5635e6f9eea335ddcfc853e6031fd45b73b59c1f91818d0316f24bfa56663507a498c10519f584a158e69bb2d74bd7bb671a303b4ff1789b02201387987e49af4040af852802e3f87cb5ce4e8595208ff89d1e709ffe3e0ef40326238cbdf02ea065ff8de7cda754898593ad28116e9a30a17906147c491ea7e202104ce9db14a6be122589495b481e0561cadef4f42295264eb1ab659836276fc20300d88cedf2244e55dc4b570e0db087074ce8022063bfd5f038ea82fda5506821ac2184d42097321d293881e7371fe187cc14e73846d74506943ab5e43ada089ace3b2464a20f4a5ec1ca0f3380d4e2e88b9b9b7befd099c7a7991e060620c7b1307abc665f845205c4ea029b7053ee70d025eafe2038864b1c6efc21598cf46ea1778c4cb61baaf0203924e367818014e17d031ed48e65903953c8f0e1bd48e5a75cb89dc8d67509f640648e23db6464a88bb7009bd2c9a1e98492f62d71d4b653c69f2284049cad95da9d7271498438ff8599920000da696682977d82f12b60ba0c73a8b8e57bc48022f66cdc0f9daa8646decb63753a4173544f58b9414009d8b9787f88eb83695c3f5330d33511df43fd2a121b9923d92b5261c21bd531f17dbf26daa2cfad13f91f6d10d4d2ac7c544f3d568fa7f1d684bab8bce7f8941eeb6078c6fc8165fc90b24a59eeb986d1a85f745072d64aafb935d9c05cf90c5be1fca825ae2ba2e87e5c6e8a21a767dd87bc032a1eceb4c21471262f0a6a6fd2509ae46f7caf310e8a7b5f64d1288d69491cab83124c7617c87a26f21a5c676a0e4f02b56477289841647ddbd474a02004a02737e786bedf76154fb8923e7b689cc05755702eddb962254b29258a0967831fb2f26f220aa6c2de924daedc835373e3462d4a4b6f5e6790a65bbea444036f317eb9acf81141971dad3e19b71c5f68e9538154d4b32a1a4706f104664f9edbaccfada1af756c831964e0190e658cd34957a08da48f807a06e307334160044bc2a0145df121b5fbb1ef0f340cb8f1a6722cb984d93a698e5d2928a92189b3a8045607eb396c6d3357227baf2db9099d1b2318e2b574dc5ca674c49fe51398602b42b7e85c8874b0f3ba5be27dc8ac09c19d7183f42f2b3b13d5ffc6b98b78378e4273311e6e0ebcf3b2b1ca1ab4994fc69ba5e19db0b55794d66824320ac1129f3eea7fd78c45ee974ac3cbbee5d623a2a39ec335caedafd0611665329185cce3f0af9853d50896a6c12134ea5486f57f7b0d4ab4b2e3c0abc5fffb2c776fff4cb04a6d68c8361224824058bf34c9ac245700c5c8b095cf96be421a69dabcecdb9d3aa7a5608a7aa73ea45d55ed5989bf2d8bdf86b42c34ec11a32a55ddabc0fe48a85117dc1bc508cf2d119c0f65cc0249dea91a05e43fc6a4d2d38a3310f2f3893a048cacad018673ea6045fca9a19dd3a8fe8d87cd7a1236c174aac04c13af2b8ac6317b429fd7ddb6d102cf6175eadb75d44e30a8a4e0a4f82513acd65f87e696aad9ae469223a33d6c2fd449b277ceb3341c3694ad2f5bd2df26b1e022c4be4011b66456b21899fe5c767fb2f913122a1e1b7b0ba2620c89766f364381be172da5949d80af819a5438c79fd880794f6d92fb27545fcf1de6fdc4c7224b4a9a3b170451e3d7b7850e903f21e14b4d944e5999b1861b58d7070580485953328bb30ce4393b74479d7d7c27d59372daf948225bbe5237d8243d8471430c95c49be374e2107a9903112c10a079a3a0958d58f430ce0f49f781a0285c994447a9dd11ee57686f3ac17eb557ff6a1eefe63f8e5f5b32b41dbb42c10cb1de7b0296728e66d1f4f4f1e135c4c6da1b753cb2455c834cf9e2169ec0e3ac6bd080841ec4a662d6c77b1b1983cf72b8247ef084d3a1c398a7a8042cb8c94c74a3e1f9b13a5cc87c2b27874930e0bf069a93bfe5c093a5ccf6f12a1152817742d81527baab0c95040000000000000000000000000be6e81f1c2ac9cbcb66698d20a06d2ef80d2d415f8b25f337fa76c1cf15e10db81b895f7dab41a4110808d6d245b460cced3f179f0622ab10dd4084150e7286d0ddf8505d082841832cc61a2ff06645a06b0d970137078987f0a4bcf4be17580000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000097a79357f6f80c87e4155ffb5664e4fa0b480661496147db42edd1b1297e821067cf335b4ad10dc4bfc1dc6173488cd059dc932807e00c196117374352eec4191a412c42ef347af4c1523929de920c0e03d5d749abab4c789c90a9876fc88bbf49634d9ef0e774be803e7907dbcde5ab9ebd80db6179d75a841b6d79fab4642e031773df126b8e978f409c552591c64647f188e84886cbda0537d356a6492282440221f868e88d9d8ed111c702ee9f77eab9609d1311257d52612f578a90b793c9050a052a24c3b3e17013747476a26c14e8c42cf2ee0160341eccde2b6b971a6fc5f8441afba4bbe2b2a3e0dc20d2ac6019fd68118afb80a27214d581408f0fefcaab0323b75c29762da812284a955230ff92dcc4ccd8c87b3d6b2458cc1c355beae2e90316ea00f933f3cc237b8bd7857429c9aa95f4908ba32f29285cccc8f86e4cbbca0213278a001d5b3821fad03507899b317bd9e388d915d2a6208c0bc2f524c5ba3702101de47cc60e155e61bd2de1af7c357ddd3985d883f576fd4b670427a67276d002131ef4bfdf5f6586dfbffc9e8f6fecda6c95bdf6b9a7c7bffbf54e67adfacfb6496fee87cdcbf659cb96b1ecdf644f16ffee0b8620ec1b3c5cfa9d27bf0a38e1db76a3717995b142995276ecf98de7c9e5ad777c7840335f0a509ac57d342ff3c5e537e6ced1a65da06bc0fcf3c3f0487039473bd1b387dbfd58f0c6d4a78e7eb15fe4d2a7d3e93377edbcd7f4e67a9ab06fbfbb1b6b782477907459f112e030617dff784b4f264343eb3c019dd9301a8e533534ef5556956c0771bdad416836871000671449f931b9dc2296188efc410c28074e24d47d2d486ede317032352cc8f2f30a0aa276b076810043b064ee45690509b1d3dd475b5d14b3fd789363146bcb653aea63c91294d96ce73e20c6b5a892623cd8848f67f7717bdf22796562d3dda81a726da597b0cd98380518fef542025e92778cfc3f31da5b538bf64b1f08c00b6f86eb30b5ed9262658c7cae7acbd572df1e8482ebe10fe6c77f2465ebbe154a386a0fba1092916e034326ac28651b5129993de90e8353871b30b6255aa00f543e896641aa54897538539b88dec027d53cffccee81036c4b522c4b79327d218c39265dceb9353dfd96233143d9cbde2023a7d43d5302de9168ae4d3caa6bfe44496072d669e5e7f27c3c70c798ec851b3957862de7df2aa179a6a8e5b7afaa317e851790a117fc50002c84e52a4b6b70f44ef56253560f86db0b14e5d1336df9db0abac400fea8c20416580d7e0ba058a3b0f155eaa45b39513353a88162a72d895f181c528132d602bc0be5970c46bb21e8899c8056200d59a4609a11b16b8f9abfbce4afbb19bf01e68904c51ad7793e5b1f226763e34f2a6b3dc8ac465df047a67673467301c0009520330f46696aa1a47154f2cf50426538e1a54be0c80e9badd25639a8ee62ec20b4e19f63dbc1578a9e8552dfc6441d0e9af2b2e836d8342c0636dcaca31d0029019eb8e2b0b66372fa3cd178d0f53c9e3e1ce611d7fe0ed61a86f578479d6a76bb56177e4a7c7ab7b3c53d0f8a3b1ea5863fd604ad8350da65eb6b9596f04bdfd64ac4336e7d7e1e7b20691ee8a1dfe3683cf05054d4fa3b74161e6dc6a2bf9a7cb64eb3075aea92b2d8842fb5f729feb79297a50d78131ddbfb73f5d8e27aa723b1f3ea3709cd3f952a773c44675d8dc0288c0aed9be0dae0a3ad0e87ff3836d3af2a4de04c753a069ceb1189f97588c9df0f94acbd5b65b884b22d6995b11c38fac860916aa9154df2b860b3ed794bb51807b7302e5edfcd6f584ef68e73074d94eed5223a27b2aad2fbd0b919f17babd51e066fa58f73037887b5168f807633cc27b5f2e29e43936b3beabe3244d29eab4b8f141a09627b1fa10785c291f1c9b82002e3e7f220a9ccee1b6aabc2a32c9282d6ff1b82ae4415d2b21a60b75ea1022c1695d1674fc384a811f2e52530eb88370c9113b84c9b3d7eb9074c5ddcf048d7062fc524f9e47f5a170213aee2a0b4b112d8edc1de5b211625fb70b21f6b186c92cff1c4b9a8da9f53bba4932c68e626d161deb42e8a69edcdb5d75b0d949895ab4e2689e8bb683f51a283af5f1cc44a228c0e67b0031ecb5bef648a5cb55c09e0cf1968e67bc1868f13e727cc8c0a36618a93e31d2bcc2bb09d4e2e9095eb2741388559fcbb5fe826eef20343f347e1d43a71a2b0807cb3b8adcfb548f7e8be6ae7f4a2f1c2d7e7d84c880906ca75b257f49b98ec4bd178a130b4885f034ac1c92224096a00000000000000000000000000f09c03d6c08bc5b31e39bc22c86afd87836cb8385d15574a62d19b8bfe278e60ed35add68d5c4ef2319caceafb0dea7e9cbad1a3d886cf7e6b8682955e236fa9c7e57a98a432e1fd659593289d5a11f7d8aba5667ec3f6d432dbe68eeca98e3f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c45c6f3390113a29d7ca52b94ff71cc8c06d2b1163fd34ddd37c0781d0cc6e31ee3777af63def329f023d53a42e63bbe3bff4e860066d1b224ffaf36556f875d4609d2e1566fc41693b8c301d5f1c0a9b48f3d015ab57e60d29df00f5dba185eceed51f45d0be9629f5ffc8d25f3d0e51521aa577c33ff2916fb669ced3e7a5d030e1130ae6a7826b4e187fe1d21252a338cee6b24620ffdc6076b89c89f9ce72e020fc744a3de971b70b512bded9e7cf1966b51414c0d4a5ad2cbfcb843702137c60b018b1cb818c04461174e6d1e8b6951c3f3303703803f1c96ce49ded51532bca03bd05aaba4223043eae2f20e8a52945ec56d03769446c55d0785178e51ff95be032fb9d5cbdda096179d259c950f127daa1cd34375cefb134c79c799e57bbc2cbc020ad6215336d284835a4e67b13a761a276622993541b479225650d8ff3b9342150217264ab5390148507b0a0985e77c4d2141720ff0682c7d9de90dd481e350ef09030e35b10dac031cc343586ca7b8e4f8bd9292d21ada39e83b9efff1e24b8edb7a0207a7d4cd8c6b8fb929f07e2545483d6b5ed312ff8b3aefadeb6969c7e0dfab7c5e2a282015b6b916f5dc11a2ffa8a3afdea3ccd1a4f01246c63c90562a0f8a8b3ff897fa7d34fc454a6c8efae927891a53daaf6ec8d191fd8550c6ebbe349c6a3ad0986736fd7895c0059a30aa5658e44cd9b68019b4d2102a1214fe87863467ce746c19f45791cc693c3746fdcf050dd4955eb6f4188581e0223bb9838fb5afc1762c2aeb779f08f085110171eaacc7479477b3824fd51e721ed30bc4955b6d288503a1c1a8c7e1bb7b0ed26624a92cbff6b142ee9872cec8b21a4098d82ae4e0d870ad83fb6af663636281d25e5cc00c899cd3e5deccb0903e913a7a491107a7def8d8f40ddb7a48897cecdd965395676551b4129de2b618b8d93b98ec1cc0b6c806accef62e23d09f1784285eae30ae29e75772daa6a72dfbe4575013e99f3306cea63f461e85e12ec88fd25a1505420a0bcb712a0cf67c7085b47450c9d03b9f47a8acf9f3f603094c8ce5f01edab40b44c6640a6219317e17990c3367e0e071adb4c129eff521c9d880a8d052867bf9b967a735ee2c30802635cb7091faf3628babe44b248198eeb3ea09b67575a62ee5c49a8038dfb86026cb193ee30785ecb36efe79b57a09edff91f828e8fb8677d842ea74b7551d4acbf42ee896f95a28ee876e0d37ac06ac9ffa3872f222bb0cd5412b3a1488cc3d33c106189746b493f5a154893ffe408ffd57ea9c374ca8b3089639f81501e945dbfee99790220cff4b2e54981d4849ca2c079aa1b25e38d7de1aec52ab4723c191abf874d63e28226bbf088c58892f597d1f53b855bd8fb68db3ed48224d3361417bdd2107c8c94bbe104f1332318f39d4dc242b464b47335ca0f754056d14850107852d815a94fe0b8b9f37cfb9dfb2f657e22f2128dc32b66bce69cbd5a7e9bc1571514a74c648f42e7f3c56f5db92410d0443fdf07dd97a190f0af26b78e0101ac917753c884b8976d214f661ed19b096bfcbff67e54b8079cdb4289ddab2fc38cd1baafa9b9218a5cc5221de46b034b70b45af66287ae19105f2fd858b6eb162041d30f758f213ec2d73347edb006dadb2e90139f0ebc8619d3182a3c81ec0dc6499112af2606f2de3ad66b272d632e46506e42acd793379fa667dd8049a14ee1a06bd087fc98612400c59d08afdd03af52b9481fa6cc50024b7d01da376790ca6c6c71220aeafac02b3ada6cd063b88d919d1799f58b8b3ada23bf8620b7423cde8575d5732a93e64ffc00683bdddb6fea4a1a2fce8ec0865d6e314935c2254fbd8d5aec6da855fa5f7ae63d0b64760e12dfbb6680314909d1c7b5a035b81f5a2ad9f7e61c6617f1ae724749636ae8671a3bedb3024db0ccee59e9a13a2b7a703fc1b89f9e28d31aee82f114e1dc5afc051c0f8750815adda0110ac84cdc18377b2b9b1744ae1ebb6b4a4a2e8ab256f07d652b41faed275b22564f39a7a9fbf4b8bd4999457a58092a9e6d9497cda42b7ea17ac34e7eec2bd84e2951211f2cbde13a04c8943225195db05e74ac9aa023a6ab0bc60c4f6484cf4d9c5979f0663698f0a30c6671fd1fed156648197834822de3bfe878620f35a4101f11f34ead0dea05ac7893852e20d1349d07b5467025aba2c74e48715cb8b6a5acd05add3cad45d2e049533192c8b0ed7d8f97db4794a5cbf21a6f1d28e67bc8cc97e1880de7ad11effae39db6adb319ee15417b76d0ec51662d115c0cf3cb227cabb50bc029a7e99a5db036f47d7e2320c01e2d845140e541c1bf0e9de8fcf22932a314c47bf91c576c5f09957be9aa925ed0bef27555a4f0e799d307e5c25b5e82271450f0628017ed6c38b923ec1d51bf37e2379b28a4388000c", "51", 2, 1226813584, 0, "cc8bc087278b8e53947b034c707174ce3aa9f441cdd5e296334aae83f25fec64"], + ["b28f7f1e0377d637bf4cd9af14ab25a1016814ec2790e6c6ae75c2ed82ab6789fbf9098a88010000000400006363ffffffff0721d452b1be720cbd3a7d64a7322ae7c53246fc76210be2d76490428bae728c02000000026a6a2766eb5fe8159927359554eb00a9e2832be621922c6859efa880460e4e23cb76a671d52301000000035365639f9b55be03514bfb010000000004005352522e440d0500000000066a0065ac51ac17992701000000000100d2a2e69f030000000000000000d04a7f0300000000d1b45ab3469516f584c7a298a107f56589373d951e3d2bcf79863b77e8d4db5ba884507f5f68b779fb6ee9d39ccaecc06723b4e0b84c2d98af15778c10cabbff479d602fb67abd6238b161d1905da2bbfb85a463ba0a26b5f45fb7ee273cb4080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038ef2c1d6833ba6e4066adef21838a708d49db0042634cc22b61b672d72068f28b7c3e778535659b9d2be45c0a23a62416dc62fb1ad2276f7304156247f6848187375c166fe518e78a3484a5cbaeebb6dbe1dc5cca4fac90be897100e56c3375f8ddc6ca22c9fa1e416f821d4c9eb06fa87846b06d6c9dcf3098b8c5715bb243031ce55755a0508fec33b5e9e8b3d7028c7a8cb1d366cb4f84a47c99e41902dd14032e64e3bd8435632e11df847a6d975259dda09dfe7413d3c040dbe3fdb7764e7a0b06c32e85bf4b4bf82534b7bd3d7fff0a66495416dcc139986a181ae46bde3432ae2a12a53337fc56467691210336560a7a53fed8985d2a890ce2cd40672726d4030ce15957ec395f414e8991d83b12684158c159a38bfddeaac5713f6d00f34dff0319620c2202f8da41b5613899f86daced637b4e4579c32fcf3cc00ef57e67f24602175b9d2531ed8679398e9eff2ee0671224e116db578c0d814bff153ae96958aa0228c0a164f020968c86f94c3b7967ca18106ff2062aba5d443b01a559a51d34dc020bb764e1ff7c1d8456e572d4f0d29163edb9568fe5276ba6506871a0ec84c47de6c44dea88728fdc3ed26bc52305e30192439956aa1b9992ea84edb3703fcb103e2ba07316a24556aa90f0caa2ab860053e187d72e0778546717c82fa6fc344ec262bcddf83f7d4cca4d284441b753ec2527f8b36045a3007999afd18158a027bc32f1854839bd9a57645b4d895b239fc89a1bb31e0a3c7f9531bc46b87cd2a3f6daf082df45fee2d0fba7e189638aacfe68512251e8ac31cf64d17fa2180e6ad8278dc100a6c8a8acf15ca513165bccf5420c6887875f067ff14e58050f644fc1e8ccb95ee62167d2d1c06547449e6a71d9bd8db685943269723470de0bc716d0a2d83178a962d31da9b4f67ecd6c8667546782b68695a62afb2ed1f177eddeeebc97fa79497fc5a472866ee8a97911156fd2d234bb0aefbcbf03fa8f77019770c0905767d33589c83c30d13fdfd965276f1ed8c2605cf15e9e0dbf31c9bab4df93eec78447d75bed54df0e952c3fdf531b82972595f08a49cd690b3c5503d5adf44d3dd48b05030b21b13fc592efe88fd7e0076f2b8cc059b169e4c2f6b9497f2e965f6ead02358f676e6c194984f0010ec5705dd2d0ca71c2f426b384b40e8f1e222af40d69b4a0156365ec3b640fd9331e68da178f3cc2a304d2d9da0bc79b9c101611ec76489f5e01757e69dcfa831b09ca5411ec2775d0f4544e5a9b2b92f98c58d484893a1e9a074405f3186a0347f62bf6b41d2a4a3e0536c767b6276d9da9990e533907506b1270548011d0c789bdb7dbd877564817cce1fcc7aaf7d49865cc9ab8cfdb572e3ee1d8f625a228bbc9acf8c64ea36408212a34283b49b1e43e1803f5009ed2d042a6bbfa23d6a58b58d629374460872ee9e1b63e04e355d0fbb2e81139f345ca10bb95039f5eeb45f291f52d6846a8dd7bd3e5cc94057d347cc6852bf7462cea16afe1b065206852d3ae7f1dbf2c7e1e36eaccb86b4181842d412efe97860c26bc8ad1857d720b14d8e530f8a3e3e8b38e356f312f5929c0abe652fd40b48d94f91670f95a382c12bb541a8e05000a2dd9ff93ec828e83c95e2abb787ab65e2c39f2cd59b931806ea91dd42c9e8a1479d71e3af279faab2d98b0eb722b435a55c0bb460b71ca3afedf6f40739a8defa49b854d0dfc2bfacb543add1dae227375646ab87d2ce4792e4c92b1b1c0f9aa5d59c77d26b8d7b1439e2815f1bd280eb434ae79e88fc499aad13be4aac53b35523388e8a65fcb4e309bbf56104fd35898c73c218175a6bfbbd9fd2f2844ea942faf13f2fe729229e1c88dad96c7e9af87d328ad419b1607bd9f5cc05a022fea0c9f5ddf8836d20e70e6ad1e5795847bfb19bd520da2158c8ac472694fe1f1e91bec679398b6801bf4dbfd66d4f648aa55df023dc1056d890cd06f3985d153d86f75671485fbcb74a78547b556781b010e4701d0996f82b8daa50854b1c2ba62f2fbc162a7c8316ec945032527ceba8fd69a823a600fe9d4bb54846b337fd3bd8066337c32c815e9e78dfdf5a6d53ba6e2d5fae13d3a9c7e507f7c3668eb279992ab1c693cfb2f8e1db84c9707a8ea40a3adf4015427c3bdc093d266383ab9db2fd3487a39f58fe9e7a9b746eea16b2faf1258c2212fdf73cc91e30bd86c71f5eb582388a61af2008d238d775ef145a7848a5f3bbd9e5be3d78eab0c9e160abb2df24a6924154d76e62bed9233add379e30f175e678b5b3c270000000000000000c16bea0500000000e24dfba862568a4f095e152f0bc828db74d31f5a721bddbfe46e0f95ff107e34fa2856766bbeccbadbbea1d374eeaa19821a24db98c339bcc203d1e55e3fb6e344a18428437924e3dd777ea746b038ec357807e9dbbff773023e46e4f3fe9cdf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b92dd1570589e3136b258f424ba3b113630ebe5a7ecd2fa04b5e56e45a13660f0d6b43e52dcf302b29e788e8ce5ecd681cca9aa6188c347dbb3d3d17d043beafc487b8d8e5ebdfe821093ee4a317e2aebecbd2f255edee47f2a46212fb8649d32621cd20be74acecae8738f1dff04c6a22eee1a2d4a04bdf40a58980a97c30b022757858f200c3945ae5d5a860119208428eb9a84518d8f25abc3e291a9d21d640227757dbe5e9f882d313ed4ae6842b8c84cf8deac748711d09fe43928897f08e60b001453b667cf6fd7117141062a74204fd1fc250bf772e066ee8a46a1516bf9a384cd986069fcd7fa634d0ccf74173a4f423973a5b1b6b2b0bb0747e7c6972f8d020eded90405100e89c4e7d2ce226fed0de22a5c317330181fcaed6815bb279d860304f2d530fbc1108363b6b41a3451892f391d4b908535b761427fbeff0ab4b43a0200ab710f19ba36d7204606cb076c61177c5d5ddde8402b991dd620ba7b31ca910206df8944d04287106a4daf14a6f9592588bffe2ce30031fcbc904d239c9a5a14032f5a3a969e87a8f9378e93ebcc9dbc684bdd25bc6cb4ebba8add9d97a6d8eb193e237d900ca59341be320569a2657688ab3e7e7fc050158c5553223297c7c6d09fb7f809c9f113bad8178185fa8efbdc273b30a63282810da5c0559c1ab1d6fb80732fcb14339c46f0a0cacb49ecceaf859d380dc06f30427377990bc017aaaf93a89172b0fe09e705b2a5cf3c2b6768aaa3573be7f76266be6d5fffea0ce036861fa9fc45c8276ffb4f046538ed0d5cd2d27fe1a94ea0b20ed303619338ba4911f432cf4707296b16062a20098407d310071b54b884c06afeeff41b1775c9048a3dca4ba69162599a2f9f01866a3c61ce210a9884278c5af573260fa9d1642dc5742465ec2356cb06f9e52f2e16528459169dc3925a86c83b1e0bce48c1f512869c79854586c775e06d21f1584a769b5775a03b4a3ac84a63424c94f8a7059e8afdcd1b7fc74f1cb3f8265ffdd53fdd425e0825315c1e11488dc2cad8215717230905b4d3896eb295349cad471f50ff1ac36c272f8deee3b2e29514fd6182a8dab6dfe55d7360b45effee11dc2b706b7a56a412c26fa257e5837edbfb9e5d2385fa25d87f91e34ffe884085992c52d33f59bae41905dadbd430888db3191110ad309c56d2240bb3a099e95d6f45251229b15906651e850995267e5041b498953c37567128a898016fec635c7810dac1e4eaf8726bc3d1668a182e38f88c1b59222156c34233ba596e357a072485078ddb9298cb219ac659771b80f28fe29c846e85f570d83d4456ea9e6bd5e0d46a900b24f949d69e3204a850baedc82c2e0b61363ae3ac81d1b8c3605400e0b1c2165701f8524126a213edab91afe51e78fa8575172b74d65acd573b2c7035d95097ef140e687295bd58e7952efcdbfbfbb724c1c91921a859c76c67b0d9720ce4dcb61145d458b19ee61506beadc6312744d9b0d63735581f75d6e68701daadf4603221ce7e21a6f99af4def3f54477839a51cc6b1fea3c2c45ef7f06f0a5bc6faf9a9a3e05ac095f22d0bb0ae141c116c01e74178aea65b4a048f4c33223cd62eacf5cb6997d852d81b9a481bdd6e6ff3af8b5c9b31ccfde560f5aa3023714508011e3220d87fe6e56e575525d6eae1ebb6d20c4d8b2ba09275eef4c40d1fa9a6f3d76d64bae02d05a9be7d4ca7648daa9d4edf971c2752289071c3528e6de9af836420316d8a853013b0b79e3c137f2881faea1317a19b2fd8ea5a04febf5d70bff82da535748f63f1df1e2df3dcca376702d5f6a8080f6ee17aa079627d6f84426e6d1e4de87976bf301427515db19bdf3a2846d44002b03dc10bde1ea9d71e31dafc1707e70da71da05b6f7783c2f543acc0f8f0c83adf09a375fd046d924ffb59e0b6761a08ad05908c1d6caa0bcd190c79798381ecea1d2b22995af0a4d8947fbcadb1daae9135082df9a307be9c900d9fe4787f39cb88a5049cfd31c435c4481ebef3a78a894cc90f17a538f19844a684af703d393d729c77809d1d5f6c1ba5f1c2b07621a08a68ecc70cab2803d865d09e2b5cc6b7f1222a65833fc4e14f24922dd6f29617bdd690ec356d11bd6e75d6061f6ab3dcf80008a7216735ac020d02b9b870c6e80ee118d2ba24eada2073fe0f5562cccaed217f6d280ee0d4edf7e95acbfb0823051f1cae3d33d8a361669c6f1fa93c03c82c3141765e0058b64d8ccc64c845d5a8ad5cdf836a0dd5c3b7947e6cd10ddb211f3bcf8158162f8ca312bfd3c01000000000000000000000000567f3efac5bb567a4eb184813c71ecb77e8d415ffa858c2208da6e04b3053e12d423ee216207bc38027162d0b3151e230fb7993739af5991b4398af0d96bf9999caf5563c8c3f866eba9e622de004090a35386b8068874a694e0ecd20b119904000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e0d6d0c565be9213b00d147749eea4d31e7da7e40c14378ee4374cbabee36b3764618ffbaded88f569d6df7ee7b8a550d205c7074e4c37a0fc2ed1d7f2b94202638e8bc24a95f72e7c03611204f2a9d3c914af152cb3b43931e1779d00adbb0ce3206a29e75747c8c34606dbbe6292ae390d2e1fdeaef4c488fe24c394f8842022b68dfbbe0dde301a184ee928d6264578803b7907d4a4c7fcd90d3432e46fff5031ab83803aa341fe76e744f09c0459251b55a3df4982cc76833ead55876c2a5d00b04e6284e4d3c9747728e742bbfdfa48e9caa29b2d8abc8a3cdafef1b3a525f2b5320e5b16dcc67136cf635360a3443d1399484393a4b75cd96134bbe6b74f00d032d226252883c57ed9b27ce873456be4c43fb049e809b603ac2278cadc5c63ef0022415ced084cf597c79ad75c507d75d0b662a755b5fa87654e26bbacb83c79d81020105f757a6cc91ecf6f5e4ffb1eb55bbf681432ec80012dbce37919440572898022e71e15d866d1a10b6e83da8b0a9f6f16a0c808bd566f4c2a43663eb7a35d564021d2cac6d8d6aabc00fba795cf0d5603ee4549e433ddbff05982412c25ce290d51397447c31263ed9f1fb63b20681c5ba28feb8a25e40a60e72d2aff159340e6bf2114b12e0d921922267cbe75c4805d36756ad38730ef79d6ddfeab37d5d2af6202c34e3f70f4936100d541c8bdbbeaa619c0864876669fa02c4cec09d98227ef65e929bf01f66d1d0484531065bbcccb2cdfe44a0bff9320fd2babecfd1e80a0e42e28334e6ea663344403cd05fcba2846f953b4438d99dc014ee30f234e0a752eb0325e5fb3a1ea51c1e17dd01dc299b885b23e406656ef1c2eccc9023d1890c0c63d802c68b313d5a4d43cb7bdf6ee4f5eb7bdcdbb05d48b07d69de54f0facf9e292376b33ddbd259f9e4a0c5b9e17e030d6c705cbdd3f5f5d6d1e00610565a3165e322ae6b07709400462a07f8841b4a94568ce147b33ab381ea2ad90431fbc7fd995b3fdf0e8b6706aaeb2a223eaadf02376a52795c870fdbf7d74e42b79269a748d5ff96e860f1b9cf3ac42c0324bb88a9656c5f6833cba858cfc8cde0724327d2e86549e449e4bb2a6a94ab7c43f1485ee4ad3f3323e360eabd765d7977f43c06632e8df5f0025c1c3721ceef6af085742896db1582b605888bbeda51c99e679594f101b9642d314fdef47fa1f15d0d3a641dd521f423c1962dfeea3481d277b0b68f85c108423e936458a8bfa921b026a705244d6560fd9fef800dadeede6314d1de09cb62633625e5064be3473f42a98ca923ca6203f1571cf53bddc39ff25fc9f02b6e3acd86d209751276c2bb72a5acd1916668e7592def48d42dc3407c44022562cb32bfedcd61282fb0b18900d55c5336230a1505f6cdd914445f9f88e1522e1d56852663e1af58d94637b0a2c05abed724678a083669a5ef7e64cd23fa6a3b824ca623dd02de31c27bcc4b6dc84fdd78ad8a2bd2a06ac274a29a362d11090ccd707bee74daad6926788fc447ee7b5548d0e5243c4bd89f227247170c36d6ee9283bab9ce62a6ed70345e4e077c62b56c8fb7fbeaef3419b2afe33f41685df5467e7d3d8edb36e31abd7012c4ece23818ba0a10b943357054fb0b8984900201c4e297b3850bc4574f7a0766be875f480bb195c0170ab0540f56b32b27f9c297696d1dab76a58233d411df9d87a5cab40bbee8caec66adac5eb0d048ec1a48382567727669464b70dfd6e138b3008ca22ae3c34d0b0a8ab27c6b8041b6eaa0d4f8c0353720b415d1ec838208eac173085efe5005251d02829f42d034e7debf721b0d9c0c574816a4fa943ef26955285ef28ec4c5ce8b9c837cac7eacdf37a2598e33ad07125299b25d50dfdc6d68353ae8aaf260146cb3b8e825860bad1c9e0521bc90b5e5953ed065636d89333fdde4928656aa64a5553e7bdda772337ff6630c193076d04013312b35b64e63a7f6035606fe77b821fe0ae9ae453ba472f99599bac781643b37b860a0f0d0e2ba148612a29d2d598b786afcbe2616984711a51d0721cdebbce5ab60a3b871dcf173066b63abdba45a0b3574b31505606de6c726bc2abc0ab7c950e227b3f18a7c8d879d52fd9d4e5fe58207b06c2e6eb459b6fa386f9dc9495a0dfd42527a820641aa9db57611236c397d725d23e5db2087666a58b03d1d5f9cd78ca468f9199e5a4da35f689fc0872a0c52808507eae497f23e8e0e9b9b9da5fa4024642c04517fcbc037dc38c1cd8323b2e4e3e579fbff3a9d5071a7cdd7e15bb28a833fd29d851f3659a7b07135b44a0bf3b0fb56518a876d18d1df0c0968b76ec07d9a782c6633fc7b66b882b1f47dcf86bc82bf248aba064251b55cecf1320285c4cac48a0141f960e1998aa96ed91560637e162c8302f80287723146262acfdd3905", "ac6352536a006565", 2, -1333188795, 0, "4da4d288cafaa1f4b68584134dde79036b02fdb786a81cb75306a23795adb5ea"], + ["030000807082c403019d6b0c83d63003ed926648e8f1ef2fe78690756747190f00d3e970062323e6d001000000095351ac52530051656afd0bb7c702282c57040000000001529eb4fa0200000000056365635252000000000000000000", "51", 0, 94763418, 1537743641, "330764efb197cae4c6033c43d1c8e74c99a28006e893b394a54cda5aad559990"], + ["030000807082c4030214922d934dc61430527308102d1fb8d6e6f4ce6ea2355d6d502512069dc2e574030000000100ffffffff9ab0eafb1df2874c362c589c211d14391450260d4935033c8ab5d7303facfb95030000000163ffffffff0476ece70300000000095353656aac6552536ab06b1d030000000000ca84f5040000000000168e4f03000000000151a7b656780000000002af1cc70000000000000000000000000089edb747cf5754df5545a51ee4d324c8fba86948599a5f70a89cb43f3ce2b14b37f13c84a2e309df5751099085d014e24b6aa2849ed3cb0157f2f9ed53c4f2a95aea9e4a58479d3814e5343afcff2e5787a60c23bb3f5d61e6f9be5c9d9937cf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000097ccff6cd8594f220b17e890e8b62918f8f9eb0e8814c876fe05582d010b350aed02977b63caf69fc8fddaf0e643a4dcc193f9d74fec631269c753b2c1ef74a58b35fd7daf114d59a34bc90bde64f94e7a518c0bf41529b4fcb39fd85431aab958960ce5aa2765eaf0d050ed7d9f14342c3a0ae77b27975234a62ddd3e9deca031a50996c683ddaf5e751055707ce97273438fd62c5214db6b5a9868b77152b0002248c2c219fa62ba72e690e231ef76d93f1ad2a38524534971d9ab86f7c7061f00b08d19709f610208d5dfad4ebfc4601bc9f6009ec7022db2fe86ae67a4e3a6c122626738d8c91d1300751ec7dd31246c23a44c12debab0e8983c6b107a74b46800310f7cdab039ba9122a8c80c5de12762e5376a46dab8247ce1ea60a77509f8a4502150ee6d8dbb9d082372e1c6534e67fb6674008179b1af46d89fa75bb5b2679d50200097a6fb230c83b2d5eea11dbe3d484d75088b1e94c7b9f517f6e51c48597360222207140c5af38529ada901ecca425925e698e04325c19dacd546c67f37476330229293a344adc8043b8d89b1e43bcd44637b58be8336b4a9f2cbd785e56a8e22df31b7dcc475ff08624efcb90bcb54fd02a841123001fe84e4d033f8c8dea207702fd14bf5436e45c8bf6f8f934a09796c4139ca718995b555dd96f98e448cba3e22287ec348002d1d25a768a170911a563a08515d10feb007cc706420e9213b8a509a2ed4be79216311914781e363ca756d52244480fdb2280d5198bd819b45a35dc66d11fc4b7581a105d3cb3beceb4f2d267321bb91cdb249848aa38895558c2a0fd89f6cd61fc13c95e06a652b769afdc80f91d8b02c39a9244c6a1532aa5626bd291fbcedecd384f6123e264bb790c513f6a9ff46a1c11b6fdcf8433f3d8d923c64fc6f6fede9fd9eedd074d0918d77afb6702dcaeb0e2556876942f91e9cb86fb0c9376a81d9cd2508e8527c2299200a65221f2e75dc74b72ce98a1c7dac32e3b15885d60d2524fa2a764a38ecac8d8a70ce3f0db6484cae986e9037f7882556ba6f629f0f95a4aa79c38127ccd35da9a7baf94aa7b824059142fcb23672c5f80601cad51c8d25d008b560bd56e594dafc58ff456916783a8395ec8e3b3064c988739a9eeda82a9ea7fe9be579a4d509e1d5731c2b3172c9793ab7f8ebb43b94b176ecbc40892a36f3ce50c44b3fa0aad9e7ed7f8739888d476b201460e306702eca8b6f314d0e00c0b884f31200a6beaa2388044dc27a3aabc828314c9ffaf26ff81496a9d7f418b539b001394384b7f33c6966cfdb16586190a49f610b7436b4053a84f3e47b26d8a85e2dfb7a6c6f424550af7e39b32481ee087627a3cec6b9d4f1780e0c4b8406d5027dab2288a0cf412b30dd052eac8d85fbc74e3aa9c0d7bea1391312ea4e6180f76558317a7d96ccec50a1b9ec64740dfde68e1949ce7bf497c2fbc2c42aa9a8f1033b4d34e70c61f3b4d1fa6ba197160eaa24a97b09e47c1f17ac11ff82f5196ebf3c1ff5746a4d8896c4ce5276634b173b846d32d8d324ac8af108105fefabe854a926d99b2b8b86db7dfb4cc5bf33915245c48631665ab7afe0992950f6b8cd99f9f9455388f6d1d4627e24ecf853cdbd53450d7a18d1050145d2db34cec77759d2abfaaff7347d52a7152a45c1d9ce160e806b74a9568be5ff47a7af67c31905de5d9c5bd4d3c1919409232385d164225b12de0aeeb41773072de5be3cfe59ed0bbbbcf903e365ba4c3968d75d6d8ee61c85ee19e2fcc376be867720232dcc371611497134d5193b55d5470afd49631e1efd916c0e309feefd2c8d6d9270f1588f5ab44f9690c71813fe836820ca45a96b5b5c182ff51ba4c9f91badc8f2dfa340dd8093553c05eee3677b3f2109af569be1f50dad5b2a123438cc8f622cf97259e7e0881d355b426db0187c79f9d56da9a5f73b5ba45e2f0967f49dc64b05d6a10945df5cff1b1ba82cd86828853971118703dd6bd27570c8fa62cd50814996f2d8fffa4bc46f670a736ffa32785ba9ea2ac9257296284f6f0cfe64ac9e07585812e1cf8363333d59b4efd4c57388e003836cd367053282e89a171fd9b92690617e068338fcc30da44628c9e8d51d9260c896d74dc1375da8482c9aa577bbc3e2e0413d89d4b3987ec956bce07962554090506b5fac30bd993077bb4427840ba3c2d2efa75b9e8b417ca55f59381a9380ccf255273e6708a3ed6b6323579c21350e79b948edabd0454debf03c1da4fc9cc111cee921fdfe631e358b4b6237b49ffb82f0000000000000000f66e150500000000fa7da482ac61fdce32cde93a81c530454bd68b1af30c8665ce2ca42c522566b07499f84400bcd0c4990a0dbf271653980fc9fdb58390af2957e79e335fcea85597f1321849954088562ff4bdc9d58ae4749cbb60ce2c749b050340c7980c1f33000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000652733ad027e87f454b009f71d847e04350e54695c114f5153bdc934c018dea211aa32680192e8db933651903dac05f401980541a9ceb5cc2ae8f9e456c4202ce76eb642fc585a1e5e983892f8af3dc93bfcd992114d2622e5e19fbb7f8a576a99f620d02c55539085645e31c488184fdfc420de3e1f32270c679fbb694731e020e9b64e9500a6568c981b8db758183d40b2630b82422310f0f7bdf54cec420b402097a5c230bd3a3e07a06c3eaac64995d994fa359419b7b77724b2debbee112490a07102be5cb30a927b516b8ea671002c7985d1918ac020a2a8510ac579a03831b04d5b22cf6e2e3be1bbebb80c248e328dbb9b0f802c615727b5d8fa1788198d3031b5918603fce996c2e573b5f7ac572e0d14df6b4508764c16f667d30b89801730227944f64ccd0471e7f43e2a525dc747e0c8f8e2315512431eb8129729348122f021a2b984bb3b3fc2f6c8933c403aef6819e97b93062fba1cee8cd1d0b67a6e2a6030eec5f5504ca763bb67fe55c06e1e37a38aacac4298d3cb4f3ba59dd0da66e34021deacf7477e1ff0c4cc51f634e9b931e57f075e56fde397c9e32d315c39a0b46de37146b36148fbc72e523040a5b81adaca3320547c3a230d62f7fcacdc9a4ebb3dfb0e35a3086fa7be605d4705b46d84f174ffd5cb7389503e76c0961040f40d9e8d236135f640dde1eccda902bba59c6c2e15af98e344763b8ed7f8a7005da82e394fc04fb34103639e1a0bd916e5ca5cc4b84ca651a62429127599e59832f00fdc92370837d0eac3cee14882119064e7be35c85bc1c02465db9a5eae64cc0c0675ea30326a089f8b2e98f7cbfa2b536b6181502e4e68779aed610bdacde29c5a27e77814e54e5503d04b0cfae4d3ad91cc96f7464e22f86b221158dbeb683e567c2a8f387e2f5d5c8ee7952cb71ae51c1cc38f05d2f82b73f455575b250c84754bdd0e65e4735340b14d857fb23cd880c3b7428534e6bef9103888608b5c07b949d5990a7dd7e77d5df0e0ace418e5c268e91dc72704adad5a80ea552dfd8fbfb42c18c319f939bdb85db5b1c778c68e1f9f771155e41eb07451a3b1bb12d04d4dd13c09da7155f78c313e0fff9ec8d2b504af2fd47c9d6194d1987b1d4c47b57566f93ee4f876494285f2a1d4459b91ff55cc46c4924015d672f3957e5f5de9d8375dad709ff0a60861a2ef93932082e9047356032cc89c4ee2fc4d324dff4be57eafd2cd4875b14c4182f7a11ea89d73e1e1a7d6d93ffe225efdc665cd8f8e1f40a51819ef80d3bdee5010de04b1d85f2c30b64b082b1f01fa2af7670177af18d8777df44a413d7cd480bba1957ac5a05871f58a79dc571fc1d600abbc91a54cca5ec446f88eac9f29a87fab627f5f8e0fb2344542ceb07ba94c4fb28c2b4f81b775b7b135a83edb4711c34aded399a79682760071b219eec632a7c4645f22a6825a45b5081230af09014829375b599aa0f993abbbef76b1d6ed8f246d20b381ef5aa31ee43d639e4a2425b31a549e685e419b890b2fc85aac6235bd8c4463117ccb83067884f64943a34eca9d00d920b63b28862bcf8934f2c48b8ac7ad7bb1d09c4e3c20b6b31ef2a7b7d964f2d862a0b1a222936a9a242379a64982a7dcf0f824609fc3d489c74ac3ab32b72244dafbd2d8d62fbaffa50c5bd02207f97386d57fc76e512539a4a68825c3bed77415c90066257111932d0c78e41e4e100bb5cb38aaea510fd0d45af9a0b43010076215ca2fda650dd2eb175cb30d2e879130b6afb4a8b7e5eb3a41241db70c32686d86b3728886b7fa7735a4ff87ef3cea75d32d5293ecef8d5156db70fde362620cf63f0e108cf43561c1768c16ecba14cc76c59bf8e9fc9517cae4c76629e72e64b0fb643f62af43dfeedb75c5122f63ed5f984718fa79d8b276b5af34884d653cd211f650dd383f6c0e0ff68508d9525fcf1ab3414e8a45288d53c6c518c0c5f41b58e036fce944098f8aa890f8b702776186cca4eb921f651d6fc37c6dad04a15c9a47752758e4c3b18e6b88a4d7edba3b1397bcf696efe3609c4df72153965182e6f5bbd07e21332d96fc4dd852a52d0576162b2dc7b9d98b5b3f1cf689e1e17566b465f9300c64d6e8c8e77ee68a098f752a824ecbea20ad4313af3d31e3a14558629b67c56ac1963800067c6d5eb4144e6458b400dab780958f1e71a8039f662a65abfab10ff86bb71f6d024b82fa5a397ebac6bdc1c6160b95992f441c9ed718609723e8b7fccf2f0e93a26d1be8e1dd4c9be978b0e429143af7a75869a1f0c747249b51b845a93bc3186f7963d6085195b2c535d2aacc470ab706ec65b7238c432c111da8eafabc115681ebbd15595679a1bd6c8a4861816fe33880d8d97ec012dd978c72bf5e27289e77a5565fddfb2aecede151f94f8226479f6cf06", "6552006a6363526a00", 1, 1378826469, 0, "231bed6626bfc34adbcef51669b7cf0198cb851f33ec39bda27696fbad913c69"], + ["030000807082c4030350e9ca671cbf74eb3c64bb876d762ec70414a61c5cd6831d219768775701bbd20000000008526a6a0065ac00acffffffff4a971e5b6a5ad3f0d51ccc4ba0561a473c06faac1bf61f668b98b6d279cce47c0000000004536a0000b7dfd4652ccab6d18071256c6c519c6c65f61eb67997ce1f6bb4ae69c8f64bbf2a30a722020000000651ac0063005251f41f9601317632000000000005ac526a0063000000001619529500", "", 1, -2083504619, 1537743641, "1c0c3e7ee738fdbff8927274035e15d1c9c20496b882766e820887c155bc96b6"], + ["772c931b04a36fec0938b8b0e618ecbf238020ab6cad4385477c9ab36aa0ad1e76a4ebb32e0300000008636563656a006500c3d22067a065c3b7165886b2b4a3dd68b98806fdca3b32f4569b7223b27ec00ae66223160000000008ac6a510051525353ffffffffadd3bbfe83ccf9e177e5a154cf66173ccc2112ffe1ca62960b75d4025b8030fb0300000009005200ac6553530053ffffffff3aefeda663d6d82e0cfe4242c1211bc6cf59b63032b700e991f3f5e8c2e9c1990000000001acffffffff02818839040000000005650053536373a3c70300000000066500526552633e15813303b3eb1900000000000000000000000000ebe1c7e9fd4d5129ca149c7e76782ce7bbd120486cab0be4a182d2d05d43d9b5f02e97315afd592d3f46f4e60d764075fa86c4c1cf177e58a89834806036af03038afc00403f1d03b0a31d716fdb3a6a77565d47808b9fb5659b1710027f489300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c27c44efc24e2a0d873ffed3377ef42ad4138057d2bcbd956242abbdbdfe6c6257639dcf1146dcac4da4a6e07f3ef4df4815e78c0de56e0c9c5134cebd321b630cda6143dd7d883546301716431638d9b6f10548d3c3b61dea1448d1b4b7dc8994b4e7058a1312b3abc37d3ae99fdab1a41f24bca68bfd0e48288c83b6555d5c02032205a80099e5a0a3f5f95cd6b29e3aa6f05a4a1f504debd13c0499c9e69cea022a6a964b2288accace3e5cc0f1b9148309ec70d41964119292488cd2151f40e70b009d36d813b84af6073ddd78c37451ea327a91378b16c99f64faa725297f0b0913190c88ceaa3f8d86c3e89c6d84eedff767cc9df8e8910f7eee7388389eed330206673dc53295223bc222eb5a9716449ebd68fb99ee2a5bd9a196d2647075418702046233a2bafbb6ac178ef5a82a99ae650fa787b3fb67c0fde28a437c292a19a90221baeac67afcc6a8d4419230119b400ded3bf6963733f4ba06710f34306b054f02178ce694b8007142da1269b031bc430d51c4b75adda68d3d513125c94eac16f8031191c6d1d3fd562f70878e46b7acd39f46934d56f4697ad46989605890fd86673f4d9ee013a84f1850cb4e0fe2ed8b11109759b38076a66228388c5f63b1987fc20c212bf3b02a44f4680129bc5b5177c35b85eb2daf803f6a1537c4558127602b99d787a9f640f5d3583191d9065a5472decd04f5872a4a4792a68c03bd4162a74099a54340a63907525f16ec36ad8f8bfe0310e08ea84d8f6ea53c5097a0a52b24a43324931229415a6f4883dafc1c803f20e8b1cc6c06ad8060bfe2f95ed8bea288d0016c698d0d603f6525b56489450d6b13e091180308b14966bf28a66fc57e816349ea7632fb240adfd1461ec3cd8662e7b3483f5f07ec59c37a9345d7f122f19f5d5066411ec23813d31976e072aeefe44c117ed2898670277649c2ec39f44b5f14d162f19877364562c945c28038fdc918a768062a92602b414249eb05972631a2a4bdf67dd9da2dea1c23ffa347f0d03a43617fd1a367154639082f020602c1288cd2bdc1457798303586a59c854689d1f4c2eed8f210835acf46eaa089291d01cebf25e1752acac71bf0785473de977b527fb0922f60b5edd393ebb98a751203900587ae767d32b35a17ea7fd88ecde75f2d579c58f9ed578265777b2a5bcaa4331d325d3b04120a663ea4a4c9b0150fd9f42a2672078b187cfac331145ead3535b5860c3799ea61bdc38de097ceb9f236abc1dd73bee5f7e6394543d0c427fb04c272c7b52b5dd0b1f1b7ac766538b1a161b920996be25848474453c73e64c9b91691f5b180d281169aac615b3b3fd2a56e532d64382105f83718d0a4648656fa3aa6ebf1fe24971b78f7f598207bda5da2b124dd60f716c6a192a930f7cf35c842929a6ef42f0fd0e2a7e1238819d79e5f9b44fffb22eb5a20b08baeeb7a349e6ea9b9440895f7777c5e782fe8815454f2af82fdcd281bbbce8e41b369ccf007cc3186f88389cf7057a8e4d64f6d492e08b0a1d4cee6e5a3a86879493e65b774ded3c13526cba409b0f7e5c706836874321b1dbaba108bf0890dcfe138a7af147b2ad9dcccd6c5e6a746a376012728bc17f8541f9cdf48248ea79f1f03e45ad0aa5d8ec2403796a12a40d1c055d1f54447d95ac684f2dbe0252a6582dae94ea868a37fa3a5c16c6a3f3c25a00b426bf0d6d54d043bdee2d965a60dc1b5bbef0c9fb561e6881952c39f45d34ac20f1553372c2cd0e8148fb837623b18a7cae6f92877f9b1b6569e6981492f4689e89541072e7a488dda037492f9b732528f0d76a6018baba69d3d633a671155d94c4c69c34b78454fc32a583aba518e84ffed1a714d2ce2fbd9e65b8ef64dbe2a72a00a87eeefaa633a632fbbb4bf6b42699a4f7dea6cfe0078afbdf49bfff78fa2640d2eb6f238b741caf9e5f554228e848bd5580cb61ff405a62c9d587963dfadb748375811aa8d29bc014a615d62a8b1de534234a82486e7b9aec2b6e3737b38da89fcc4c7489d7bed42e8299a981fd2477d950af745c518fe1f2f1cc1a74c15c9fd60bf490c137d3a84ebeea71ad99ed197b3fe933c82ef490a81fb8327884e00b9f860578e2b8e5c1c2414d3b628f4a5331882652f91580f21930ed827ca6a1e77c52b57e6aae56dafca54d24129a7f73096b7a9f591792b60abf481c8b7dc7be8839529951810df8958c87d8754e513acd06dd48a8395462bb5179af69581b520e42a934b958195d731ff1c0a69e6e2c23263cacbf55a76f455eca57a0000000000000000daf56b0200000000a24e70629bf7e4b389d520a28445ac15e2bfbc0e9f1635c9b449f897e35ca3fffb694557da6ab29308887fd1b6ed2bb4bcd29ce80551bf3e865fc5a9eb341949623d65080c0e4b844d235ad7a52a5fba8178ebab344c1cf8957520e7b0db3ff800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c884a0ebd9cc89a7a51c9fbcbb6fb2f29c07e2b2673e2a96cf94356cfe6cb6ca8212af507ddb75e7ac1ed66f1dbf5caae83665a8e7ecf8bcb836c4515976aa8f6659eb6acec3855999a691127fb97af9320ded78503d800885ce553973845c52f8d2f5bcc45e3c4c122bd0d04bf81406e681aa42900957101616bb0f682f2ab5032908048520578a9905ce82e81dfee3bfdd54dc95288773fd9fe1f2c51a31d1da022012312e8eacd7b8a0a98978ec264f95cbcd87fd90d218f1d4571f6734bb56c10b06ee0b0190fbf5d914ab176df83c98ebd1aa2490e54b45040832366055fa802a36e952cfc3a591a371ef19f5340a3caf4f62d6ca9a5e5545a62b7e23bd93a59e031da000e53d8d9ae3f2d703a4eac3b39d2400b6c9166b548192053c17164850dd02177751881b8f59eeb90896ba387cc3eda134c3986c5c26b3de375f56fdc2386a020d45d1007c31b92d7755a1e32c879ad4f00f4b81627d786a89c2f7b6bf2f27110318addb5f43dfde9b43d83939e761a9e9bc239faa613c877730ed671d75ed3c7102150a4a4bdbc3af3ff51e5744d32ca944e00b592e841dbe17a600baf1768209ba1b6fc72b69ccc3a58e4300269ad665e3e6a4a7a44221d9b0629745fa8d0b05817f0cf1730e53fe2473c76aaa796226bb641dff1d805e1052cc653f3aa89368bf8877d11918e4723233b50bb744278172254f92f44ddb0e6346d681cd9070ae283b2b71eb15247a1cf6e5a8275bd5543e02bb5d669043fe3646eabf8d3c9f3aca0833b3309ec97023048617430e4192a504843418c0f76dc47b94a4a8054322e0c5ffe8e32783a9452b41178f022eb42602a6f21244bf4090655775520f54415987ba75c50a3ea9d982b961c648221b1c4a1668c5926d422aaac70127e12d69b71d4d789701c0c4ce6800d5a853130d12a46ef35ccaa8cf29d3626c200487514d1714458ca5088aacaebe96e0f3cf0649ab544e640fffe0e14b60e6ac9d0529a8f7cefed7ca2e6f6402749fd2f96b716b2b8710d41b4da4b166e9d7ce00d1808793e4b43fdf4b2d5c78367babc250270f8f621cda9f17dabdad8ce360b57ec31ba522d64ea9901d32754971a32dec3a667d02bcd98817ddf80391c36f4055a3e51086a71facc99a67e38ff2b06b6d906df5ad16ca420499a86c3a3762899d38a3478e118f4134bff1a33d4bda6b3c4525cbced2d3aca91ec3a0cde802b243e2e5fd8ed2fcc13daf85be1a33e9366c87c046322ce440b92a8c2e1b74a0f72d96dcaeb4fe2914e4712ec7960e90a1114c7c5e5b874f3c4342b92c9226a28e6c7e836a3d559626b2fe40443b214d8659e0b51a655eb446fd9730174570d660b9a9d94f949f91a929aed39670216e8bd3deb31b3a8ff7a0e0da5f99213796a6d898f366a7771f0d8cc9fcc95548d40a3e50dc8c8084e105ea56fedbba72bff9e93106d0041200bc01a0765d0af31fffba5a5e7b2e20e7e079b3daa08d527dcd13e21d33dfc8a731ddf7e4c6f2ca509a25bc752264daa422dac1efe76b881af71965a04144e14d06184d8d16530f0b5bea0d2f3f199604484b82a23a19a37c576a1f3a54ae010f64a5f19666d4323efb8326076686e6be284d9b128dd3e146731ff6a03c4ec29a98359ed82cbbebd0b68eb8efe2a4b47b07d1b87aa5692bb0e8842486aa130ea29f80b1e1e56bf7f7caa444fe5038fae90fa53da9a32156ffae3ff79914429bc126a8f3d17a49aa6b36d08a2fbd2f5b2718c033cca7636dd5dc4fbc35f2fe5850a6519023d00a87bd8a6c0debd15d006952acf70ea4313de137740a0827237fe7a23bfb940f3a011af38ba9005045c6677aa56f31f1e2ae6052d45fbca75a214c36064203e27fa25a9b2e16a43834fde6899eb775c29b0f5262864954de97b1bc2ebd9493e7fecd7d944922a0b65750eb160b730fe6a5f02a52dcc6f4bcb42ec801ac8f186700c00f6258a75692c591c11bd8543f81c6d6a1b9418c6e58ce5653ff34aa87d61faa7c83572c23d41b1c278338b5bc09a657f2cd020ae4ded1d857619fe38367fbccc1e74b23c7b94cae498c9ac279bf88374f6f6674685664d258afbea3c8ab6a26fc7f7745472c8336f9c040402f1b825dc4b97e93c3fdddae3e4f7d74919af2678ee16f0c9cb00b35601d35ae4379a96b3ed00e79f5d8c6c166337bfe1f6ba7249832ffc4086a390ffa1b1b2a8a98918b7d58626ef3237832e0ed5df85f6f6f359ac650a7900f9580b0433bb2e291d8f42c4f873f1df3df3d8db0f551913e44be75a6491dc187a6032fa700000000000000000000000000084293ee9dcbe1c9b34ee34a6dfcb838a648f5f1e2b6477e551da59070086698df82a07bc05906431450b947dc541e6716be5825b73aa0d41699c3679f87991084a25bc32c0f141b2396ba8f9de9326575ddd7e251ef4a26f0e6a3fa61f139a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f1b7caa6fb9718e5006988783e3b413fb7c54b32cccd1024214eea994395c4573410c878519cd5590a3425860380b33e5baed59d9925a5cecf0538a93bb3a225419cf6c4becc1cd5fa628dfa102e51a3e96b98b44f7d8286697645273ff4d55e01f132737378b6a125ef1f55a6f8648f5d3a915da9130568dd18a6518b0831a0224f61a98fd632ee3a1666cd3b75610e206e079e36ad470000b8b7eeaaeea0bd2030a4e4fd09b7a49dd0a4a4884ba69314c3d3446512886a36e74573f534dc9e0f10a0114bd5982837008676965acd4f25bce8f6e34d8f67b13697937358160aafc35bd14cbbe95cfc95e778237fc50c5d1a433226c977ea522a89e166809ba66bea8032b7d5b6f28f69b64d7fd6e8a7f6bb53fe1f09166ceb47ee34bc00c0f32b31e3c030a767b032bb0df28c305e46da3ff16949d47c7429c8df0bc5f9e98c4c94a90dc0227410cff2fb5001033e263f88820fb43824a1e171fafb97141c80b0f6d4d007403132e5502429104e76fe2a8946c46598d3a7817aaac949c24882c4b716e0006c1020beedcd68d7a8c5362e9d884ad3283a0f7626dac9b8d3298744c64cd194fdb41b5c66c87249b2a15a230fc9b7d7b8eed8807f27d83a6561634a895753c64f78a3d07638adff595d293ddcb0fde4ab0c0e9e854b063fad9c7bd61f25917819e6d28ae76c1566b1dabd3101712541b5fb9401925e6fe214bf9c39e8e19fb7d474732b2644ab158c4980e699fc76270adec5ebc0e7e37be7656d929b501069f529333a833f4467a3424eb208b88b6495ec70552940780a5f08058684e5b7b7aa25875f578b5f562a02e3b9757f66127cc9e0cac4b15e2832477e57928e24c5fc3c456b262ffcefa98b122ea363dc28a21ce7e10bef28f98085b266410df9b133b0819b48b88483c1ab7eb650510a04d46f1df3d5cf550ffb45e60c25d39a07b09e41ad8c2113962cb1fea46058c3c180c6b5f2dcea2e8fab2bb25df46a8b1688316b4e53482deedc3c50b3c44cfb351a475e0f8285365f8771c2470a8c26313dd13b4b43e5b60a75a19c05aee2c34a41e32905378116c3fc6dce3a88cd55122eb8f42ea36eae5c1ecf4b08c4093d6f82b3b4f3b4d98282e2f359e1500fad15bd01cb8bdd03872dae276440f120cb8c8ed19b852008788854202fa2cba4c1142636a142e912e37e35544957175d8479bef605bc9aa45650114dc902fc43f55bce05c8d13412f4ac12bfc845baa5c0d88f9c2c62df0a503b6f5cdeae7f25106226d5a5803a6f671b6d747c938e3538a2c335bd07c2799952341ba05fcdbec8a8f93a37bf36b014df501039a8b6f60040a36153f41ab59dad5f6f8b3a684c010166dba8d835b85983c5e989f6a9733be2bb00f30d7b759c9d361e0db8ff8e241259b64fd19ba82dd68966766e684a8457d215cc3c9ba1f50d1b0ebf4ef7b87457ceffd1984884aaf248318b4fa7b4934fad2e809dc176b18c5db96a9fd267eac74c1ceb67ac68a082202430aeab3deb8136f1b491100d97a6ba1d472cc7702e95175fe13b78d8192cf0616caf56bd787b4eeb1bcab8f7fb5088b3dd2c3435aabb0731921e1b86364bf9907115afe5b55a2690b4163b3a9437531528afe8efe042a17e3ebf157c4f4bbdc70117f85e589adce805fb823743c8c4f7d1bcf0af418c94dfabbb1f5543f91451fa94ac147da4706d43a96aaf97ee2ebd72be0de03508db8e8f1c17f3c61de37098cfdbde4c0d7ebd7661e45de63795b6905a9320cb1957f12be9839ee54f714655223420fdbceecce61f7d422789b2f1a74842d525a7a9c54a7a5f29f2e2cc069143041d369dfddc3e7324cf90f43b08f30ba981f29fc9984d226b4e769960c1231e531c01f59a441abdf546ff7c0cedce373aa0a8fb5e0b7ab90cea300d8e27581b628115142465d3376bce102ed115e36311b00ce304d583370ad459d0a9d02e8e34ad104de96bd777d5158407e49213d2c79d6ff67bce7b15bfd8cf0703b0adada4542984bdc53d23fc86be2b11fbffc4555057f74df1e6a74ef93b24cf3758500e82c48790e8c1c1a77789548eac4c75eedf4e2e0713623afd8f29da0d0c02c9a9ea347ca5952049e290c4942c1cba06ce8094cbded5bdf1b4ebe33a17f8ab64e53139eec1784bbceb208b153e92d05a54435860687e0f8bac82a3e8c7cc93547065505fa94bf511e90c993b6391725f46fd0c313575ccb7f579da84e9660c552e00d53cf57caf84d34a89f961efa354ec4e89c40018bbd38ede6a173de7d4a49987effa2e042744036a1fe384d81ef4d7f61c4418c255134d11a85d7714271b6852b30542aeaa6b962c22f32d4dabcde226e84714ad13138822696e42f631072fef11a37cb9bd53aaa5caca350f5f7ff441b292e9be156253f8cb0a06dfe8f8a1e7f79a348d15709", "53", 3, 1554572824, 1537743641, "3e0888cf03e63c03ef211193b36e05765079a99fb7df3ba640ee72c1a73dd7c7"], + ["162f1741033bc32793eebd72931725036ce690cde955ce4c53d497dbdbaf48e7ae917bbeb90100000006536552516a6adcd2b2c017d7e5eb406daa9b90eb5db6d7ffbd5b4f9a287072d03b62659c2f66593c73d5030000000952006a005163510063c0ca20b072e626661e258797e1b46356091f94587220348f86493f561c030976700f7ad701000000026563ffffffff02b04c250100000000085100ac5300ac53526f67530200000000075251655363636a00000000010000000000000000e4da1f0000000000624f8cb50d7c81ec985bff1a90060c05b0c11525271238ea932859a6422da60fb33c060c6e8934011b03f00732ddca2f17b5a3209ea437f4977b89671663e4e9315e1ccc458c82cd7b3fd957bc754b295913ea3bfa4ee3cbbdf247c038c78735000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814b87482e5de9a029b60998f5543cf4be83753cf4f5564d2288e97b18f0d13c4cc91c429d3fcdd4b8648f1576a17a8d86ed41104c31c1fb4dc1a4cd5634718a4f5ecc931cb17ce5e6a12de1550c0647e023271ad2da206e008d4f94dcb93aab93f471ef21b91eaabf4fff0cc471b7c6fb9977a4b789b4a7fda66b0310045d0031a6e441bf7fcdef2e7da46526939401a0eaaa02b00e2a1a415c1f9b9ce0220d802142376efd7f4658ab1ddf859174e75dd9f69730d119e39b6007a2e2e1072fc350b0091d21e38c5a6be764e3eeaa7d2d247946cfd2a84009ca61dd8eab22659886caf8bc52fbed3a038646a693dcea64c5db8f5fd8b833d3d192e43ad8a52e04c73023014f87307d9aa412a3f7d52e16073f9034230de04558432a89cd024eaa716d30307eb25ab703d575999e0d4ab38e9b252ef67f2bcd6ad72b2c7a1afa10f04b870030c79ab1108100021606030930d88f19ea12e340dcad7624f0aaed6a30d29343a030b66139299d813eafc395e72d74747d9ae40da97267baaf6e969c679f35a863b03115847e4d812d7ffe3df1f3278500c96a4043e20c9cd02e7dbf5c6adb6820bb37cc76b09262ce31c05d5aa73abb26bedfa479867fe09ace68410c8cc67e69d4673ff1d0cd9a55998a051937d13f589e1d0ad867868af1407f4c202750129c44fa7db077e1952809b84970d11e93fb0159e795883d60d578fdfcf8125788c87afdf7c32ab1188f27495830dacdc04ace3bcffe4e1446308403be7fd4ac2e16d6f156a4dce53fb331456e7ebe285227b5fabef5460ab3a144ae5d29dd42238c1f9904c18fefcfd96c6c4fe7ed6308dde675ad59d025ae55fd742ed3c31f10972fe1ede4c1700386b421567e50cca9e7af2e62e8bd1f57525aa5261ed1a9ce070698c5428b212cfa37cefbd6f10e2c94a719e60762db0e631d57127939c36add3265d28526a975f36b93e8a29318f78266a987d20af977cf4422152cf5053c9e8156f40cb954358d135aabf9c2d021db30412c375eb3e75f7cddcbb07da5e6cc58131a5b7a822eb9225c08d3bfd54c10dfbd21abcb29fbe064bc82d16894da0c503a6495987affa38413b491064b9e88efaba74fa34c1307502744b4a5d02e89e40b7429fe7f16db408caf85e8b771fbb04cbbd64e952b8b5c8995e0cc74e003bc8cde208d83443a03658578097ec57cd89fb91d2e9bc10c2e642072f71a5c78298b4acbba4b228154ea9c0ebd5254fdc44017fc45d4564b78ef734c821cae20177d6818537544457a365f83648cd70a92f9d6094703e8491c668cd03703a41258d93578fca006625f52de2767756b270862e89a3d471f8a68eb8da07db589771103566ecb156f179a6cab26a0198e7b6e4f0acb56a9f7b8f8ee7159741274d62ccd3af060677dfaf7c51bef08b573c3ddfc4921ea8c10c2a2a098cb6783c4c1a7a233f071f3737d4faf355b6d253adf99b6d50bf24084e7eef95371cd3e244efd58f581c91792a90d29d431125e0e1f76739d29ab99878674c42b6bba45b7312654a753cd2e9264917f64eebc2f294a77f786a6f66b77447fc31c8eae60f098fb0cd57e8487838ead36769065667626c0631cfa4b1a3b8147e04221d9932374795d49fddfc471d024aff8541571ca5033911f1695cb4a2452bf1c5edc22993bbe5d548809ef03bc2f04ce193ff07377dbb4f5a3922d5c608496785fe9417953020f7a1df7f0974526b703c2ea8a471bade095e2e193bb2151f2692bca610f6088e5e461b1171a2c79b21b27e0c6724e54498e879d4ef68beb46197a646da79b6f41b8d5a51c4bb2a38ca25e6ab0fc04209ac7e953c12a02cbb81b219dbf42b903e9e75ce01d2f2fc8f04879cb27fbacc48b401220e179b21d81da60acbff2d5619f9f71e3d3b5cf7c212ae8477d2401cd5f9fff5bea9e1481b791a288c4494c654250a2737a05887c3f18e1c982661bf5b2643914484872c22ba2546bd7ce5d7bdfbaa29fad30fc1f29fb1e60aa807a34d198e9edf0521db4e162672b3e1334d34d90c64f505f623b1c61c5ad19a068550d1abf37f92c2998d6bb93ddcba826497e7cf1efdedf1dd459dc63cda2c6525be1dd85853c2a0890a1871549f819f41d4b2b93f556a07835b6a6130ee2d41a422ba89a5c6d1eec1f8d3b4584d483bab78f24a0d6bf115330918ef66076a43a52a3f6abfe31af9dcd5f74faa734f7cae434499a9dba4392b22d626160da10af9bb41a8cffc0801a4a2c25cfad69469ee5f50276dacf1d096e8dea6fd235fcc3af18237247eb37be099e8c111f408f8d21a78ced88e496b878eefc1e0b23b6a1ad05974821ebfd80665b6700a05056d168a2272be4ff5ba65c3a3b6ba5de7cc2ff1e8a019a46dae0ae3267af4d5979d7add62ba8bdd9717ae626677a0f017ecb7438301", "", 1, -1382628643, 1537743641, "b229e82632fdd019e3f45083168a62958dc04dd43d6f790311b1150fc03c7f50"], + ["030000807082c403033c03d3aef3d99b381375da2522f82bf34b26398a842656b7788824545b3699c002000000020063f90ea13f2bf8dda68c8236c59f0e41036a12ae35bc213f1ef788be95437be2cf818b46150300000003ac6551ce57967c265687fb2a373a6c25874849c2749fc6cbe189fc25b6bc4e5bec74a1cd9abfb8020000000452525100ffffffff01f7cb89010000000002636500000000728c45db0200000000000000002c1a920200000000ca42a0367e7e9a74f4e014201b950ae03585a103b6efa4a1da86365369ca3b2ef77e768fe6e02277e112cd2abb7be5f73b7a4f77915ef2bee2c2b0182adf1bb8070a21b9e47e8ccd9f1624df6edf4c8342626b9bc8112e60009d53089f50b849000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004b1b9562f7bfc5b911d46646055c33792e91e378d775972a169906162b1d1f51d0c7cc2fe2f49986565da8af6713888ea1180e44c7c466f3e0525da77a0f3dc5d40db1133fbb0cb2faa29587a459ef8191007f6f68c577693389eeb226c99f3bef4a1b20521ab6a78470aac9da869597db35bd9be81e5dd9ec603a2d59b92be1022e356f2b1c3de664b0c0ed06e15ff6d6c355ebdcb20a28218c59e2e6c428a4c202228cdd9e06a34dc5b6fb29e2d434b340797f83c899b7ab28371c7a32857f24260b08fe83e6e1356a8d20c79e52a863e310d940720473cb7af97a3fae4f19e65a6c42940e88b6a4e43dc814588d2f2a49c26c77fe77c8106a83d99e9ba3f7e8f8670217eac353c9a2e91b0ddf39ccafa71addb1da22004c076621acb692aa576a36c4030bae78745645e5644e5e0ad03f3d242e0c518d26bdb8c0770968c12475d5e1e4022fe7037be6c69b9224b74f29212475baf6cebda60d29e35b27982fdf8c15c8f5020cc6feea3426e602dcccb92a8ade5b7b703257383cfae7e2d6d3ed74161870e7032136bed3b9863236a236b492250fb9fe6072ecb5b077a43fcbfee8836f6612fc49a1c7273196c942736c9e54b8c9dbf75ce20cb72702c5a359ae893e4f03325c8823c104fe0f6e28e3cfa44b6284bfec3f49c4f6c5633767801a3f87b4cf550fd5a65a17a6cb72730be1a87fc04d2523f322f709f90c601d7509bed196c50d0c1bb41a8b6aad2a8ddae802c7b67d8f0c7606570a0a8436002825aa25641f01f76de33828617961652db4f93f3875d8b983a44594f50d1b4b1899db54598129dcd47d4ff45085cc675f256306155dc9ede5eaeef4b6d89f9770e06aebc4d07c761915da37aa313708d8799b167c00c89570e2432ed11cc734f131d9eafa3916314cffe5e25e85935ef14af97ec8988ef1b68da8f805e14172bfc3c9b3121bb82c6cc56ce3f3ad0ebc31193576cc004084748e390bb91131387b54296f9ce5a6f6d64ccee114c22211622a2373e6bf6af29a64df0790087f54a02aabaaea23c1da325e797e26696ff51eebd8e4eee62d58864ad561b810b151785e1c5d3ab7e9e4b3f7518a5af4ef0a513b44fe39f9a30744ac719334abc1dab267ace97002b6f52394cf8ecf3089a6d2fa06dc89eef1282b85638f61dfaa6a466bb2051ce1311ef6aec2544eac56db443b5ef45b93e782125057390d2b958a468fbce9f0a811be87e410af2297f7598341f8e42fe5c2c26de4197db08acd38ced1fb3a6495fc80e81bd3fa0cbb3f719deaa3850f78f8942906ab14e49d9746df33259c4398d576ed6c2050d53aea8e4eaec39372a52d0fd98410d6ca6c7e2bc3f63e81bb35bf1e91dda49b3ff82bcbc25f226e83c5fb87800fb644b148153ae1c180f19b489ed4459e5ffbc534d228992dc28a35f7a0f4cfff52e33a433aea6c63c855f978847c47167fc4e4e967c0897b065f8a40a682db252bd592702464a4648548080d8622b207af0f25e5c403f96dcd14f98996b230701c7b63bea63568e2a87605adde7542cb988695f86d5cc3fb379c323e42ec1c84698d8684a52e3d110c97761da5b9c41db628492bbdb4bb82f51d59a24bc50c1118ccdeb06a89cdf99882972deda624e4174be7aeeed669e292c06a65025ae215f1aac456267a3ee19675341c41e110a40b2e3c027998af2494fe7eca8d5130c98758172678bb46281c2e20b10648e6daff1094430d956f1edeac153aa6009a3e10cf749f9902aeaa0cff3f5619088ef06509cde5749ca235a3d30574dd3d8b0443e45459deb52edfc83fbf0ccb5f19add9dfaae2ce4f1609b643c5f1c77bbfcfeb02178372d8473e3a7b8fdaac0e9a18bb717f1cd9b791d7be2b3653acac93a3ffd6c8563579f8b5d26ab4e198f2414300622353f3da782fe1d8c14c5c2f2281d5058d563fed40dd3a49252cbb22c1720f422e26f3beb38e822ff700b2d2cac7df4d0b5ea75b0db095fa7c0f3e79dc0a96030050fba624fd47c7768aa8e7f60e35ed6a2090efe006b89a003d5e8ae84454f940130e4db06616c5e4ccd10d392f442e0fa12556b3325c91816c44192d73bbc25d39c0279d90da39b2306fb1a8c834eadba6bf7e37b4841d2e7e73a0df0443a985577e50fa88bb83b40399142bca20b872969e5ac2c3fe43ec7b01d1f150855b6fe3e96f06b3fb01ab9f91c8a0d782602c17b4a31e8c7b4cf455506e09ebc7090e18e4b951eeba5a297d095a7962ce3a6b0fe1995f99ad52db18a2e55335235ea68dfcc8e0d14e92b61118c5a4d4000000000000000008440b02000000008fff41741b99382ba65865e91b2dcf7e396e6dac0e4ce74d38e13a02fc434180e3da194166e5bdcc93fd544318bd2cbca28c8badc7820efc7c8932371ee2dfe7bb13ba770ad257656788ce08de034582ccc7749302ddd55ff4bfe258e33157e300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eea09801e8c7b7d477e27cfe71b59c0143f55a35b8a922604dc0666555d9f907eba3cf387ddf17a1124795ac64a9a3cd7b1ac054c0d77eda5786df13e781f95ef573a503d2a60cc1b2a0a0bbe0e46bb2cd274c6bc8ae193a96d37180a494955e10fbbd835832bd63e7708ef9f627e8f431661a9c59e7cfa375840d6fcb03d4c60308f503c8f0edf4252d7b9fd57fcafb6149476190653adeb692a31164c3a92b200224cab0f3305287d57f603690bdbe5165eec4e27d7d87138506c31e21c8cb242f0b040f59ae3537bcc8f5ebfb41ca0d4f49e1a63e5eed13d7b764ad8c0c884d266181b6542f35c7147397c23df3bbbb59a5c0cf16e7f394a6ad2ecd6775614c08960304ae7149c8c33871d943e291c0c5f5246160ebb63ea4c71cacc5d63e6e209f830212d1d78e482427a4502beedc0892292dc1bfef766182a7fef87a9247f17ed95702116e40240a23fccd6ac3952b9ca2aeaa547c1ddfbc1745bed13b5432a419ff98021c2c14b7168335cfc88b226b8300447ed0b530465f880f46d15ca18f4d1ea8a80307897fd29980a97abad3c87300cede21e62e4e1fff9ab2dcf8a1154ec8f3a0b2fe502832167c34acb54444a4cdc76a1823083204572d135f65db1ee06ab0ded383f39a34977e9d6d1c678eca5c4c4a3e51b57e848d068f0772c44c4d2a5ca79a377a3f4ff77691e7868491efa744d63645161adc11d103b4891b6aa4fbaa2a114518cb3a10f1869f9a0780dc2806868e7dafcffe20200ace44c617c9bd34b96e561d4cdb88d58d532dff432233a5b23562da848006f20ed54e14ae16206287e19d9925b446730ea5ed7d0c1f2f1922eda5e55234e0c33a4106daa162c22ebeb36081eb76d94c293c5d8ce15936cf79843e657af211651f11b6bd54c0c769fd452299255051165985cc084b269ce4115bc5e1c08e6b383616314da457c62616c719ec5160cbab05f844702655df58fc54ab003ee89f7b91ce5ea667929e49690f9bb786a8efdd99185f2eac8c085748c7bcc7e2cf90b78a5644d6379ee8bd5309ac63a27dad7c23d2a11488c9046962434b5b733b3e3eb8130bfe5d87fed9962214f95fd3a13a60c132700dea71946b31ec3a47f0923e034cb4e58ed5b51ddc53ffa02401f0f2f9ccac9ca895998ff20ab4f6df24bb55b897980cdbd419e77c9e1348e817b2625d8c8e6916296b807be623270484e91d628642424b021c28f8d180ffe97668274e2676c3dbaf2633803fb85c2d90f7aef98578259c04a16ad1b96759e9d4fa79a028e535fc63e06143c165d7b8c33c8d4fce0cd9801ff8862215f2416f82bdaa88f315bb846b4812c1eb8e50be42b6df1bb62faa1e534dfd40e194bfe1cd1b3907c3472be8c4fa18b7bb28d093524a35a9356772035de5e97034fa7a50070ae61811066b4e345fd7509dc88f7860a310f3f5da13aafd9cc121b5af1ccc35b9a9e2df157f8170badd49693e45abca4bf2a75b1ba49baa2ffdf0472ccd8f35e8f68a8a8ed96dbd3b392d99788369943b5cf295e66e5aeb775e4620be0dae5860885c3a7848d47c6c3b4bd917c1de745fdaa7dafcf3381e960c1f5858d2d3afafc52b23499a9d4aefc7bc7097c5792a6b588b730d83fe8b29981e07ae703b0f719a741900c843295c81fc3110420c2d7febd356a842ba570e89d0cbfd6cd47d8fdd95e0e1d1b1be4bf892fd16da7fd2d4d8e3aea0b6613c712c74a37667646e5950ef0b4f083cf20d1c51b2b001a0ce7d3f7d154a3def71a4a6fe49e030b7b0833b54a71397e6f6e845a6eaf54639c6d7cbb48ee244ddae9346b7d844b623687407c669175dce4a74141723eef915b83c9502d021357ec93140b366d48963c891e021677e4329d1bf1634d9ecc511ceeee06551ffcc6d8c1bf881330180d015579d65405bb9c95afcb962adba2348d2a8a73152fd1d163ebe80f297f5041bd3be158d7dc569f079c2f4456e45ba7d8be6d2e7642ddf2a562f10bd8bff18239abb53e394a90a8e176deeec25329a4fe5804bee4644eb58036ef3372b2698153864c9c0c0be8a43a7f4a90e31f50ab625a3852174170315fe63b0c9b646da384c0d1bec3dd4a89e3ca635f746ce3adc79cdd7bb17ee73692a91c5dc266272995e07106b516b816caebb04463dad5cccf1c5e9f2af62b68553d1dbf958bae09ba9478f5b7cbd35c8d28edfdc71759c018abdcf076772605a61687a22d27194fd281754738b43fe0343e4635438b2eff7410b67bf55380c8f8387590784c4c8d8e773b7b08f30f28ad1954957276698662244e9220bd7dda1f4068d589d5a7c21a5e0a6541cbd9504ac07b08c9acea95d51482d19c2b6045c984af650ebdd3962ac8c32889d4bc8bb06bd73e15f50435092f5bc3d8447c838960ff68d0be3de474f0a93355ffec5ef10c209b7b94509", "00526a53", 2, 229310710, 0, "d21a505ceddf1c08977050834530ac1e30595ceb13f25b5f8d00e40b5d996cab"], + ["a878280a01e862d8ebe8e9749ab9c884fcd13d27163f5ffa7a82507f2793ba768f6507f6c3000000000565ac5353acf918f51302aef0af0100000000046a53acac35e41901000000000753656363000052000000000300000000000000008a74e905000000003c3ebaf53a9ec5c0d18cd59001053a65c467b51ae9e543fb530045ca160b961dd601b157165a088cb9a6a30f55d4aafc08b9870dc4857b70494bf707c447beba6b7dfacf9a201fe189bee1978f2ee426af0549182bf6768c56d12b2f69bcda930000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076deee0e9982a4b1de0762d694a9468ef2227181124cd648c4aec0af4221fd1afc993cddae7b9cf72fdedd7859350ebec7f74d7779b647e50dd1034484d800c1806cb22b909c86decfa9be55b786a5e41518b837711dd0774133739a941ea1239e44691574f60518f06d3b2e0b687a19b0d59bafc10ba373d68e03ade4acc16802182c65a41bc40a86af9a3c749436c0388fe3d95a03510f68d9c66c29cfdd3e580218221ce0a90985ad45451dccaef143b523ea8c87622687bf2a20161ef2e5838c0b0483c3c40c41d850936427ecfe4897bbe31163e3de44e45b9bccdc9dddc3873ea7897b9c527a0f91c2e7e6da63e1b7bf41df218207d192f5f6b4829659dcd0b9032ad742e5d83fcda96de6d89ae6c9e12003afc464a5c7c9b096fb2690af9f39fe022f49e265deecc6b832b775acf0761e2cbc1bcb1c0af76a2aec0ec76234605e7d0217dc55b98f512145d79e60f54dbef3a76e07dbd6da7fa2fb7fd94729914c95d3032ff43d30c12e05fe59ef4e320f6e31290f08d4130c1d4489a470125fedaba3cf032769cb48e9245ea17aa71471ecc54a4444c29aaa74d2b04764e11fe9154210f90c68d4c7018e5225da58f3686c24a98d49c6506c7d48933acb46884782aeaf7d0b701efbe76f083fb55c108688bedca34c40cc102533358fb65f1262b8bd4f63a125bf085c0fa52e99f25e55b128ee7985ad7439370a272c02a903f2b61950ce30169aab385b4379891bea86de7107f78d5ea37cfeeab844b0bd6b821add2800dc56bd1eac7f3d0f8b842dc147bc10304664638d915ab83db7340f912cb7586f124262d8f50bae3e20904c79bc45a04be71cb3fa610ad0774e2595b39f664f0f69854f955dc8ba8f78a9a832744cd02ff21c5b1e9ccd65e0b74b376eaa362ce27ab563ddf5456d141aa68a2262cf923982438d6f9e57c470a8bb1a7c90e619ef0b18f31c58836a2a3519fb07fdd9fc623c932a754b137f0a7a3542c97bb187cbebd19f1f8d14f10eb8ee14d1f3a7e68e9cf2fa7c7a8349832efae28dbfd19baf5997030c6d689c9aa2fd3a91de012331db4e0b5bbc952dce2f0305938f314888c0ce135f04b9243bae519b3b3f92abf1c2204761f2ed1ee26256fb15deae05007bdebb4ce2a3b303f2170c29c02916ff6df239c614357ba4d9556c7a98df54e3acf4697a01199c0319be5c778688e8eed700dba93d865b28878d2905e0a3f365bd9c00bbf928d2b4ca6100cb44c8a89caf85896ceaa21f99825fc0d051dd7cac3f7a3f66cd3346c540020d02d3b061e029926118f86e4efd303e915a836882226a939637f66a214ecd50169919f8bf0cf2414b55567e6b2cf5f6fa75c0f48f2933911fbb71b5ac51efeb0fec432d370ae50b9cfcde6a189eba8bb54a669526e60f9fa877cb649a7012318a13c6bf9cb0fa2ebb925782e7b182d94d443851d7aa3df49f23e352629886d13151dae3b4198c1dcbee34b40e4a3722bfaab6f704f34169fb951be5422208c408737b596dc1ebc54c64e8dad4450c416e6f74370635c0f0f5729ef276d39bb6b6c3954ce9193a2aea90f970e2b5e1a9348590abd3f798732dfa563fb2e901847acee5380639f1070c94399cc20637dae16076fb73a12262b8b96a2f03bb06f57b596533ece9e1ad621a38d8824ed6b0af3fb2d0b39b388f3f348a34c64b0c2b8a74fec35e5e4653455cd6ffc6474f39dd68b973d4791bee0f0717e4dacfca309b15961ce50bd9888f53a3413f87372f4c12634962916c6f812c8b084c792b992ebe77a3b1b1ce076cbb1363ae41c5bfa13f76752babc98c8a6d20a1118e7f37529d8130229edbbda2d193c6c594c41cc7e096e36508a3a8e6e764de8ff0dc7f4d1086c94c5b3a19400f855d93955d884229ea8285e9e80b23108ec2a75936af29a9214fa3abe1b24bb85d634895c318f9862096d61c2cc4262a692bb2e1be243febf94c0dc7844acfddf6b54c4f84ed78ec2adb9e32b189124a8428d3c7d2d0c7a57873f2738a227d571251723474b6ec570d8373dec31c617f29764e3bc7eb12719d203f32dae7080ea424df37e66a5e029e4b31eb6f9319149d705abe1ce1b1fc4ed4b746f0ad3ec0dd05594240b637119df240d67e58398528075fd2996b8607b1cdff324cef92176b866cfefba18850a8e9f0c344ffcf5343a097732ceadb7ada0afe8b8f1af5917b33749f46fc9a8b7c353d028caf9cf3ae90e03b585020a27301339b07b5db582213782a9ee2078c9a3ae9f914c099bb2816c9454306c664c399cdfec16711fba403000000000000000000000000e0c8731a89d29c228c8aea6a279284aac0b76fd2b259b44387894e324a6d2d07e5272288d50b52414314bd749815a5398ba663f57a13e9711703ee4bdc372e525d8c38f89ddc7f0ab2b84f41fc371ea6223a238cd80390efd864a0dac54ff1f400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b51a90b431f03f82c325f5ef710bb94c5866cc78c4e46a8a62cceab3535ffca6160f8219cb50282916459cdc4770f8f6ce79d51f64dc3129495548c7e41f03954c0ff8a1457473092ecb9564652a5af98adbb7547b12c518a5661f794c3f75b1e974837cee0def928f10606dcb2305ed0b844dcf7496eb5cf7d48c279b162aca031aad267e75bfc86542aa0206a9167e56b1838dbba77454fbab462ad49a5f4b57022806637acc130b1917b476b8344405fbd6d18919885e7ca3afd28a113e02dc050a076beeccf5b5afa8c590a8f5c4c5ed96ecb5326a0dd88c1baffd56e8dbe01b530b1be2ce47db69b3acc3b83dc2a1a4086fda21c53f97dbe102e1c0730ef109f8030bbeae905ba62f856e54ca012ca10d2ea26e13b1e3ab1189df409ff89046f2000228341b5c8abe8e5a2847f30b50495690f303bfce2e2f211e7cefd20bff99f6ed02086baca18d8ae5e6ff25e3ece6694bc436f040ecc13486919643e2ff5caff0cc02110480dd169e3dbe971ccf998645ec0b6aba2c4f65678c06e7dcb64de834ca1e02097390df3465dee7b28e820f7fba67ce0d070cf7b13f21b17e805f838a8329f3aba6afe939e95a78e3980d4d777507257f2e08d5bbcb074dbb2d55a50d96d9e5cd10ebb3f94747f1b1e5b087021dbcafe6d7e0e17f7e6d040ac0bbe157e530af1ae43c4ceef52ca1a6849f817ecad92d90fbbaec96db27e1f8005456acc006e74800b730780d859e2e4273ca0e3ed5a8616bb4266c260fedff7d316d3a4a104e47aaf652832cf73170e98392204df52b8bf872e0aed616106ee2ca384b024bebbc0b25d60ed0e825f7e7047b7c55fa818040034e063ff3d75e9981f1fc212444c4e840814f165ff04b72d2c0bb75ffcdfb3cd7bbbbf0f6b46553d068f54f732e500f158460be12a5c33de00ee7608f022c68a63296c532746707431067e8cc3cef3fe6165f210691da0d5a85a037e87498080a67fa821b7d06d5751843122791f8a62144ae20d1fd9d85a3b3e7ff10a130326f7d9ad63a6e919b04f304b221b1e9232b9986963a9234885db5ce7ea71673e895bd2190f87514fd09278ea7e7ff7029744a49e780da0af1dc82f04c5b98efef069cc81dd51fe4d300c32acbefe3226cf2af04b7df35b9c7ae49531aca9ef713cbad290f9aca9fd86475c6a5a68791db82d05452c7c84cb6b7a72a693ef455b4ff8d7ce5a93b4f0576c7d178ec233f918e233f5b68fb94c6d504a8094e9c097eab96caac6e42a730cf1abe9ad3b3162934a7d28735e43ca62f616edf11e627be3487174a82f802ae025a82bbd2d8c62a95c2f0f9e7fd5abdde230787f60cb0f593cd3e3f801650e6ac476a64c18f47fbc3b9bca6e7ba4dac24f6aa224fcba9022be23b27cb9a886bfca58e35919205cadbc3784d7516149b6a4d75969800274a41673b6ec48f6f4924f3c693639068c289733dde647b348f27bf44fb70b571d899c9c4828b0bb33889f6f353b51a10bca7f3a512636e8a3e652517bfa84ae31152a540ca333ad25b89187f168b274a08177c29d122c7c70a7c7cd20ee1d259c49d34b4defd85260ff165bf6f6d7911af18ca64759aa9512ec0cc043f8b7369ecd36468ab23601e9b443b5d5cb41ff46b6a0d6c929c75332be2f32f01fdf31fa74f963306f61ca3f4800ddd79b408b3a9d2397406640208a06ecec1969e09835a3b339bfc85dd732be3e2f9861cf816116f6c1378df9f5d58bf53d4cd0f46864e17de375d6711bafe993a60c64d990566963d7a287f6f8ee67daf785b7cc1df0fecf075d64a3733f4d378b47886f4ab61c181cc651062d863273fa1480096d0a09d35cdf347b4ead9fba413fe82c3ee46d8e43f68dc2305058857ec417087a414c27b1d8739875c51b2390b8e199f875026115c2cb8d49bc30d247d5972e1c0370ab38bedfd25882ee7a73cb8ee450a02d121f73072549222454f4a744ad7b3139494c3f3faf90d9d48a126081f0d903e84dc893eccf62126be3b50132f2e80230580ff8e39c38ac23f8a5c2370907dfe007672abad632d8e05d233280c04a6e6ddc00e3c30acf69dc0fa8df368a5116641451377a0f83ad5cdaaebc55856b4c1b96e09556f45e8bce5f5a9fe47690c447630e464c7314c0f06b0041150c40623cc11cff100780452482260c81562785c49c3b7a2c483dd0160ba36e992bdf46b5bef600da8465b94a0d639acf5a6a64cab589fafd46fef1da2fde1dd167af0bebd7eb528c242add59e5aae157bb2f84f19cae30b7b4c336020e0de38eab5150cb7693205000000000000000000000000612767bd01b73c8c81db68b0f6e9890350e24c7f75d0c86081d8c54e2215c84bd12a6db137d84b0d111469587a75818a2f857ca79d34f92e10c2f756f7d6abab01a73231e9e36dbd1229388d74830b2004e12372b5894cebe9b9b54267b0cd0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002655614aaeef9faf7c670b43707b78ddbaf90cdbdfa921f157a9745985b5d2f6b5d024913524861a9e7b3128adafa4cc74c8b4cfaef94ff9167f451a35388d201f0c6fb495cf0e21ec24b4218d0a37a499ae94785cffa0728ceba34b15edc2aa0d44eb596c895896fa6364a4b321461d39f9337cf7a25d6bfd01d7611e716aa030b0bc1116bc8d3c1e2c38a8b566a272c2fb3adf69d14a9a12c91022489a648270224d25e055e130bb1b6c7a4946ec52bc7ae21af29c7b94ebe2017d972abac07ed0a01343b20af58b015d975a829dc6b95b7d36043a73345660708c3048ce84715e104288b4e1432fe8a0a69ad4ecbdc529150d8f84f9b6e838a481df60ed1dc2b9e0211a04cce0742297c59cefdc9a4397a8c400c7bc9c428018e3b5d40eab3d8e0b50320852d91a29a82fb74176193342c42e11b5f8ac937c80a64a5dbf2fae4432557022d03962d593724d5a3ccce1e43b8f7120c1f5690200ff57a7884ef54d0288753031175b15c60aca512a9cf3a287a82b7c2d313a99b3ed3770b9e44f52b36b1af7a03027aa809ca23e9b75db1d623fc28802616666d75af4f6afba82b833fafda437ecffdb6f7554fc36b481480450ce40bcdc0b016be8989a7412d98af42edb1e53a9110925fc073779cfa06c6afe800607a318025dfa94019f742ce2f36f5caa1f486949e2bc406adb7706a4d5f8a0ee3f004e9b1a938fde6cf60a6f30c5fb0b0f680bd21a109e0c09d4c5f4e1ac243b15d0d8c09d8e52a87fae17031c1b88b22e756b3df196fb723663e41c4209a2491a30149285edb00e0fd4acdf2d749331fac4f84eae9decff4b297705376089ae3e32b18a689dfaab4379a6b4b5491266eda496d0721291e8718212236c6adacbb020da320b549c6a8a176cef6108bbd1548daabfe24bcc13e293057b82b30f933c29cd7d53a0f56f3eb0c2509cad4f2c39f24edf3abba022364c2fc7641c0655274f9f42b56549c77869addfd10a253648ceed075f31696784c8ef0d7c4757fcd72f32fab9432e0f50679ef6d2a4c8232e8b01d5609ca4bfb810c0830a4712d4ffca3385a4c54c089f150cbdd5c0612a0de4a18388d4688782ded055daffc71c0254d3c5b9125712eafb71c7201615aaaf8a782e47dfcd1845ed33ba15e202158ebc6c9b6e98c42e5cf7fca5b2523c3d80440c0ad4e74db93554c5cccedebac16ce9cfafed9ffc9adc7e093633c5ec67d06be68fa01619efb01123bfb589230f7dccc4caa1bf9af22018c0480a17f6c73f153d5f461cb33cc3a5d83a9df4098f7b6ff854ecce6a4c2418e29167bd5f145e1c586077941e33407e1a2916ef266904ff833a29d900d45165049782c53ce4c40dbf21e8596b064b5ae2270d29026575dd9c3838d7657dd1905018350e3a916d1b5f6cd7f7fe90204dfcc315d64fb23c72f767148e4a9380d6e6d7b2be6e6655b68b5e3e0eaebe23be65eb3d1f46c9a4d48faa36d890dba5d0c6d1936fbffdfdb9ec56700392fa790cce97009aa39cdd62272fdde260dc655448cd70c31d34585648289adfe75b28b7ee967963b787b9d35d1833333682c9c35c78eff7f042c2b6e6a8b99a52e9e7369e6c9f2b5caa5b500fa2f7f90f14428bf39010f8a0daf077ff4e8c63c9bec91934be63a883cf6545b09256c00cc97d12db2bc65868dc727c2965ed345cc8242258e9d4c077a87efe55045f36166d2d05ab38951b79119d9696f929f61b0a2162e2abfb96d8ddd452d42cf2b17994ac4a2466738e9a09a7201b532149be3dfb1828ab0ffa0742bcc8ae42a59a0b5a3871f010b3e59cc30abff9d5549e6b0730dbbea9f6209b1a40b91386d07514934ece7a070ad4565c9ae9203d7310696b8416aa0faa9d375a10e637c24cc1f618990f1de8605ef80feddcde9519341c8f9e96593de4d83750ccb8a9b99b0854097d0818ff32db8d010b646739884cd1f3d08b38081ca836331f90f1c64cb784da896f1536efb008f7858dc716d3d2d323fc96579410dfa331607d1a52c22b74e0dd86213511e57b348ff730d6aad51d9b62c048d8ceceb713d06917fd7759b8815152ee6fb0e08e7085201bec1bd5ce3869f2744fa9ed6c5fd7ac4ca02ba5b250e51e7952da85b89b16520e0809d9b6d9f60a662db5da20a82f66b8b6fb8d04805c7e7c6d6b678678584b4f4a99994c2c74a4569dbb226e9794814af6d193bd994ebd0ff20f7f9e319c1b8031baa8cc31cf16eb225e51b9dc002e4cab46e1d4a8a4b041ef904b2d8fe4d2435f1bc81e25fae6d2ce6e2a4d9320537e5230011e8c589d454a74cd3b6b6cf3cc974a306b3c87b820886e89bb825124e0fbb30839e47cbc6bbff5fdb89eb49e9544d786bb7c106c99a39571fb862ed91764dfcaa8e4c9f34cf0edbaa490ca2a692d61cff2dbbf6fefa82aff929bcb3c10e", "656a5352", 0, 76459793, 0, "3b514fcbbbf90b5608d06a36d94e7f64e2113dd7514b0cbbba1c63b73ab485df"], + ["030000807082c403020ec07a6f4c8b84a4838666b81ad944560ee49cbf9609a93b79f95baab5f57ebc01000000056500635252ffffffff0b5dcfbab15867ea7bc471ce20ed6f552af0d63a51e977cbc40549c6ce8abde1020000000765006565656353ffffffff0209ce3b020000000009655363526a5263526a8ebe8f030000000001639a66d7420000000000", "655363525200535251", 0, 1164859344, 1537743641, "a9724340952b8a23f90d45ecefa89b4cfa9d91b88308a23374e203711d996850"], + ["5f92ac7e017829c7f975e50ef88b42d765b384e3569286a4239825c580baf1a103bc976ece00000000086552ac6300535365ffffffff01b17dad0400000000016ab4a106f2030000000000000000bfd5bf0400000000531fe4add60629d9dce43d89613b7be4bfcfbce337fe0da13de4549a6658a8436ee391d4fff25288a9830cff8a7acb189c0f10e65501cfeeb9736301e5eb28c267adbcfb1f7428f1e342c71932383b107eb147671d18a34d1a1fd20257b5010b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aad680bdc2ea686d3d21bdb8680b3df9650889aee716e624cbe5b3753dd4902b921440f42011e0fd673f11c5c9541358ac328fcb87084873b6257d0aebe93a3d577fe0735d45cee0b2b625c5994171f89c4b65b417094126d52a2772a394ec8788ec2d4f7c7f0e4dabb0b661b4d021ed34d7b1c790a4070d878eee98aebf29fc0227e7a5cb197ff829c0f5da35f1b32137eb40583fef8839804566eb61dbd22d94031385b3fe24c797b6549dfbf3d9b9c1ceac9c34103f7b9e6ad0b7fbb64f2acf140b03d7734441e76b690809c00cf8eac861c128f1a3d9d8d78bf35952b4498b2b2fc15bc5860c2b3fb50d6161fc7cc63418f3e1865e9798d835c9b8cc19fa8791220305eba55905445e4c4e000e27cbeb73afc5efa7516fb712b70978ee21b5997de1022d1a79aa34ed5b256890e6e558a2573d096e0a6a79f94261394d655906fa40da021ac46c8e9b34847a49096f6d43de65170bcde46e63da6233f0bc26aa8c29d17e032ba2bc2f3d3d17f91f3a26f72a1b837f9deabf620636437cac240bd6fdee8c620323b87877417f6a469c294dcc2bd64ce136400369c4d0c18027016d3cc8042743eae4b757798424650223475474a50054d66f509cb98f7a6d265ba25ef73ffae5f81da10acd08df7747c4724c6bd0226b81ab09f8f4aaadd1ff0473c636e683bfc1e559ab0210ea0261bc61b6430a0d9c4749c9e47fa315898403171df8ec2cb88d4edb7de5b09c8ba8e1679af61085900ccc63e4d106746d2c289d05027ae456bcb4d60f0d6d3679596d950ade4d4fc7b2805bd918709a0ced17287f3e715a8ebe1e4f75a3dd40c6284979b86f17df824c2b970a62b534141181f81ef1c2610dd03627c18e87ce12b9ace7577fdf433b65035f4b4150069a78232e10ea10168e75929fb25ee8685e0092bce245e61a0ef96d70b0326f3cd14d2daf07a1c6f800babb158d7c32e8a82a781466f483e5d2b72b68638c75f33f67a235aed9523dbb935e430da70a78973857a478553d5c786e45fdbd102b22e5efa31455e47f86aab3e24ae1e9528b254d686b824a8f58a5a10a73b4716e38f34d412fd29cf70e693893bac344f8c2618fe828cdb7576be9bd38379328156fe395e98c89280d7a5b636a775d5e82e3e589e620cf8a38e803a49adbaac1e627eac9c2487c363637f714be236cbe2e844d6dd5780780f51d39c2062a3b63738eeac61d2cb499607a0c86c83b2dd9861d4f59e2d65318984b1cd25982b1172628fafd897dea825f026adb359a80ba42a4e2253a25ceaa309017719d14dfa06771d706992e7b0d1c0ace22cbc4d1ace37770f7602ab2baf8ac8ef2d5f5e4d460de907f090df24a318765534efce334c8e006dbace80f22fc63989916ec77006d64083da81c02a3b6bfd3fb1521017894e6f99e6afceddbdd1532ba4ce1549bac3e6a786f7091bf52facacf487f7f1e52c5d4381cd19bc0d0e0c07d056e3619050d9641fec77c6ae6e09d093b7b62c86e3238c3ceaf09071316c5fc9c8b17bd550fe24bae5b60a958e27ed29a6afe653a85e85687aa54c84c76bfe9c9b8ad014b08fc8f4b6c33f493b5c220aaa94f8a9e510a3b615dce4fa8bef338a234b3b42d2d85e9d5509d370497c231fecf3f5375ef3133eb56a804a987f0157a0171d1c4cc78f0b164fdb3581cdbe66a07521ee36b4b721e1fccd1d5d78f114ce7ea6757331e5f6c39f4ca0a83d00b3cb5b77f88fc7dc13805777bf100c161933b123c7ce23713547671ad87f69336396a1dad81bcb23ca4b1c814c9032ce0918620b286f5ca38c565bb4b958b04849731c1e72faf443273c5120a55e6ddfa7f4d393115fc1f8358d5341235994517c0fbb9e8342fcc70858517997107fa3fc61395acd2c3c8ab0a867782643561fc2af6b5c3e7c3a0ce44ca2b932883124360badd0a28abafa07fe0cbf83a02e75e9cf554e73a9ae9e01c1510c2dc09a52c9f6e7689881713431468fa94f2140b3809e13d2d3622e4bafeb15aefd7131912b410221ef8bc9138edcef4a7c018503eed644851db982822b96a658b35e21da24393c216def3f0f052a6b8379b459710ef244ac3a46609daf2cc6f645a9a4c5f483ea681a7fc771c549c965f67b8c6f49869753b4f84e61c561dd422c4fde7f2b063f40b9e222a34a01f8731fcd038b0e32ee8ee2f85080b5976a4c4d855fd8b0492742f01435fa6fc9f5586e2f9eb20af449fc63a72c0ad52f053bf6026e0cd3b12e38702deec75faa62d185c1bfa205b0a31f06f546b441de0358f01920252a400000000000000006eb59402000000008357ddd3dc3c43d4a7b4c702a2e55dcb36c32bb666a671678ad1a717ed6c16d1fcc29ee347f92e22ce67862df7dd58945631f593e68e3106b7547831b925c7fc9246157f2be782ac4b2794c2949e83c05f6d90c4faf678e99cde60ab5b3533db0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034eacf9da7ab10913ce571d68456908f86988b6c4b7b9fe7aa369d32e8c79d06b5abe1eff05f0f11d90a97950e8f02fda98c954220de551baae200859497662fb3bddeaab5fd9a54ac47db965bd42cc32e58013630bf4b7c7f6fa0038fceea8bc05f330246afaaf21005b67cf656b939ef8e9d5eb8ca91024ec8f41a4fad12d1031136b23e427eb3d64841fb7680386ec0c27c45b3b6de1c3155f6c5f600d070d5020f91558985b9cd5327ec9aefcb32acee40b80ca08833c2f4ae86cb4e823727d00b081a823112cdfbc51b379ee9e55fd7b306f2a49a865977dd61b9908bbb80eea93f4c4bcf3802e3ffb1c79f90995f6d51fb3d32f9f23264ef6e7c3b1b2992ac79020ea90467576073d6a07ca382eb885c16d91d50fe03d850b18bbe4072784ff195020f51f3869fb8ae283940bea472e1b242686900d57f551ceaaa9810b0835157c403012b101e5d923f141b7e9584df47c370346b0c4724cdb4f26217bb41a9aae9c4023052a621cb6d403a7cef41c7d5fb11c3b1d16c80a072d14efa11128351184a0f021640976ec2ae4d2994dcd2bea7ad88e7bbb900b4240b8356c5a9ac82e16cccc07a8f7f2af4dd1a6e9d3c4778c29f85a5cf44ba36f189165e39f721ab6ab70fad5b65b1fe4a25b4ab0df599dd978372d47c7886bf937cc38b9f37e0e243918db53ad28e0e2efcdeceec7ab6d9e700fd21fb181fd687127034833aad95bd91ac56f9fc19edbdab6a052a3f06561d93ddf83cdfe8779e5811cd82ec4cc260d5a61cc788cd6d369650838f7dc472a7027d52174be0d8916f0231d7d19ea7293d3e1a90af191e07872551a0e3eb5bd5273f599dec2b4a81184be235ae80777f1c463ac7e4f0f79149c951f62713e7dfa3080ade294f8d386f390ea43f14ba8d612808a92a3044a686d6460082521ba270e6653d39b76dabdffa949afcbf58065e6a70cb7db6a1339811d8680f8117220bda4127ac54f941cabf67ab7b60a2a1eb11d9024bd7a8d7f1ecdfdca7e13e7ecbcb60f6ee3e2c04121526b10efcb990f4f60068811004008b35a6afb11b73e9cb85dfbbedd06b88647fd8ff97aa8d29adea0dd28f2c5cfb426ac647356a8de0e5ca000906ecc6aeae56e02d1a048d3cf34e44a62c030b6ec8b35bd9827e1964f6bb105f51ae840aed52d25271d6a2633b7ea4974d28ac1626e09b5cbf6af830e4380bd51c111c9f7bc027786f6b3204f17f37f0c69b27157200b2bb1be4bcc98028fb5ef9ce72ed7d42bad47047413dab4986b59e959817c304de2d76ce8dc5edbc70f782219c082a142dac3b7942b21b01bfbaa7faef95bde10de4c9228581e633ea647594baba1c1ab9ebf9d239b327b6036e135aa76d6187e677d422bb68806668d4c9c03be2cad9938327e31af90c41daef6e92248464c86a715597dff2db30d1e19210176c3fb99b0ea9cf569cde3a9d7d09f4ec27f392b29d5798ae0054e86a655d23b1baa8b6943f2f09f3708addc6efe167fb3eb8a8e2607c015de81fe8ebd35bdfec4822d79d0a7deebb9f5c1596bc5415a2172b4f590c093c95ddfb3b0542f75cb07d159a3a42e734494c111fec72e580fa65b64e8958bd18ef0f00b4ee415f38c4d27ab0b757734cfcb1c503d5b9d06b3bc75e71d4f6ea2bb2a74781ad26ca24da38e240a16ba538350ed1486e234d50556f6b2d38c00d812cb6d8cf0c3b7b969659ac4f7447fc6b281733f3a0df46518c725fe033c2d683cf8ba9471b033e90f6f6f3e3efb7700f4c8aa3559ccf05edfb3f4efd5ac2257b58a01a48fc3c991b738a3efce8d98a608edaf65fd359c9837a032992838b8fb6415e14bc70603b76c78812dd9f4bb9851ba6d42afa5712ff7df68834104918a07e6f3fea3f98b7053a1fd959f158be29e31fd4c38559a9a694eb0cdfdc29a4bc560db1bb468ee256682e3b0a72b5e1fb6fb392b5e8a35e26784f96a90ce269ae5cab635fb6b44cf8c90910651a633d58fe0d00b6a7a57a140daf2cd8b82df26e4586d059e5503a2c4b094b87dff88d8b1966778a3c66173a6fab6c9e543fcb39249afc3bfd7a8af32dfdd335464445cd615ae2412d815f572ac00f0d9730aee052e8dd16d369e550be4d2b049e30268d4ffc6a45bde544fe5359b9db635811f04b3df07dbd7f5ba0934521a9a36160e2fa3ccb89ab0149f047d1c1487b8f04a4dc194ce87d1ca07408d92615980803acc4be75ab9bd06ca820d98546c58fd32edfb08404b379029f93610d83bd79b9517031cf28006b172ec47eb76c4dd3733a435d4852853ca654e4ae01000000000000000000000000635febe050d8aa2e510073f1752ee7d807b5a323a6d08a0fe7e642956f4a50d00a6f688efdc692ecd7027dddf4d3d12e09ec01fda6b23584ee53ad3d25c94f0e63bda0d91de3fcac85976f87485a16ddd225d7581542c28f7e4cf30e82026997000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004729c32a0a408243f52a065b58bd59db3c51dd7b656eb11681b7f6ca56d523bfbad6dfe03be146c4d9b3f47bcc73cb6026904b2f5ff45e56cd23ecee9be01e47eceeab6b226470353773d2974f6b7c8759479ee6cdad68a67c3fb02b71698ef420f1f4368de2b4a244ac97768497e7317aa8048503810b6b07afc0c8b4b7b68702065e13a6b9ad9ccdb4597451047ba7ff835e57ab2589309bc7913b9451f234b202247fcca82d44158b94cb169ce24bddf3e8b2e468c4b6f18636d808af82c995680a008a79a0188dbf4fc0dea86db4f320e0236d1f850af9ee11e0994bf9ad7459621b075bfdb00925400d4d4803f13a0a83aeae9a34c0a9d41f25402aeac497887b031ca442af3500282b4d752f25e7663616fbe7296bf374c1f719ed0143c5d3cab80319cd9524b321821ed1d6bc3131f43809d9cb796cee111d42ddaf63f6f9287345030c5487ecd8d765649a74f59540140fea30a63bfc2b8ab3763c73755d6f8f2e36031f60b279eb9fb24ae379e2cd0263506362c5ba7155775e869afb5c5bdb4f79cc0326ede959d0253ffa86f62f6cd8a4d28f0b63042bd109d9b8b40383acf38fc21f5f434cffbf17a247d4960c43d25c905c47eb7a493c555e9b80b686877e93894ebebcea3a94b13c863bbc1bf76df6ed28c63a19fd9ebad8ead72bf5e9ee65cf48679525b3833b37c7bb9c26fe8f43e1810a3768f5d53f8a57386fa716cd55a34e18f08c1f793d3daebc9ac67b917cb8622a90b00a987763f1aa546a5d3b7bb6e734e0b0b4899144d78238392851e7f6db0ced96c40b188808162bde3772da2a51f1de9d3c3296c69339c2778ce4d8cadffc781af53a0fa6dada0d295403c964c5f2772b39ea458917121727884b570e4721badb228c6b0ea702f83f1b072b5a227990d99695088dc111bab2f7c9da221591256d7a685e2402e5e3a691c0b784d72bfa24a09b67e20c6c896ada79c38132eb0b87571211aaf0d67a75ed56733c5d299f044b04667b993349a02969f56c47480c9e7994290ffe1eb883e910db536af435464147215b23d2da52a9f71170dd5a09e7be702fbd5a068f2c2587e543fa1de1fd713b6029304decf92576e22c2c2db0806d96892bbfd28fb24c64a9ecc6449ce90e9ef94ce5958445951774cd3bd9474a593b9d5a3b39d25cac160e19c7d23d2015ad5337ea5e264862d3c96c5b2c39fdb78799ab1c95776fc266a51916cb0043f6216fe1f11600fef5141c60e8084e9425ec51e6f95ac4bc2eb9a8415d929aee1da9df20377c570688a1c2faffad6060b491e85cf5421a32a73bce79a229ba86a52fcbb2bb6dc1e3f283c87ecbeba6638892f9c7f6e7ddd0f186dce9601ebbbedef1ddcd853fe967a8fab84a1b7e59fc04eb7a315415d13f5f0b4d18c0ea524c6d2737b7c9ca84817635d6054b06e994579c881d992f829c444b64fe39a3736492914c6b0ba4520fd8feaf65f6d10cc37cb43e3f93097252f08b9a62f6da84ff39f634d649b509715831779a60cc4fd4d201cb090f0b613e7dede44877ecd9bf41014d657157a73ea5fa46d60d50ef3747a143b86a2eaaf77429aadc8bb2e01ce2e59e464d46bb2f9e7481ae1cb2f41c0b56aaa22ccc0c339ba183c4fc522cba4513ac1bbb2506531287f5b32edeb345c7bca3cdb54c5e9b5b6a73e0f7e9ea475b91ce0b2a8813b0019fc431085488cf4f2955a1423f11c69871cd5a04f7281f65535c99b30534587a799d568b1eabeac4bdb42dfbe63c4bf52ca6d3500177f4060c32a4f46e3fa9b2ac55d2fae8a1659ca387801aeeb20e6044a297a2999bdc21b47a0a7accfa55a48e8acf8a95acca44175e66206af9c6e83f1bc457c7e2b202c31ff1737b6496092f12f8cac16f215799515303b047b972027d3efc965d64428a61abcbf8badf2d1eaaf0e0058056adf772724a8c5db80bc995ca2516fa4a7d8f1962305e02543ef4d0f866121d99d6b103137ee17b6ad25d6c2b2f6804378156509a6a2d1262c92b79600cc4c90d722e72de2cb530bd419e993a742c47433038a0f76cc88598a59ba89c3ce3129490e569394d36725df412f23d5897ca80bddd94bc8121774e7db5e6eca139d5a4290216a1f6f384b7d977bcfb1a96b48a5beca728835864036605cea11ac8792a3cd8ea5782e4c33cd5074b2c0878785c904ec069033b507c947e7683814f4592ca5dd05cd31739c09c8bde35634e125a2fe138b6e71fca5d3454fceb9aca3beb39c66878c1fd91d06f94dd474a3cb42792b3cc4a3fdc111a00d0084862fb2daefc754d3b98d179e02325d945993b01685d4f09f99528a85a9348b6c7695f47238f69d6b765e9382d8f5784c06c9cff99291bf79a499e73e018a48408e8c4acc9dc80fec60af2154ae635d1f87df6e3188a0692a05c484093d5b986c447c101", "6a6a526a6a53636a", 0, 616347975, 1537743641, "f8db20a11c8171400eae13204778074c00ca33949b79f6bc69271cf4e843c02d"], + ["0564450803238230d8cf5e0fc2c981926722991ff6300f8ef5a808703a49d3d7d3c4d01a8a0300000002ac53ef4fb6b79368c5aea0139c37652b71ba9645fbf95e8e45075b5bc8aef24a637a7fe25212030000000451ac5153ffffffff9e434ef0af2333caaaf9937823e9c91d2af9d0eaeb76c506018768be7009d3b303000000026353ffffffff03aadf4c010000000000db48390200000000065163516a5353373317000000000000000000000200000000000000008104e00000000000a1c63a23e7ef595e594037f3ef2b66ac1d27e46b579f116134591097e2ab9eb561d968fdfc7d8e923f3f44310afebc9ce011549eebe98994bd9a25cde7a967e53a36b5a74a984122859784fe55b16e0e83b00c23a61442311f101ee38790f25e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005702ffbb8efc9951cf2bead95442f84975405b9de21150de2a042bd0dd5ce8bb7f1105e4a00435d153b54793e224e83297f734a2d0d207121d3b12daddcc580ac3975c330e628e7f087b1012d7a91183c8150f46cb382e170467ac2effa0c7fba51109172ee378ba31e17d7ccac46f9a31b40c3166202553ecb7cd3b581a70a50315f88022157cd444ecb0533b0e1a9332ca0e27e5f1bc2c5eb146edd723015dc6031c14fe1e109c620d92d5d65ce2fb6134fadb506608fd608463bfd7947de53bf40b03f0ead750e265edcb0faa057702774e9d222c987ad5790fc88c14ec3845f1f296c8a13e338bdae779f913907d4f95f30200b54bde78ac63d673237437a0287a021b275bebfa0c65e0ce9e19559782dc91d11eec0b119012882a985a6a04267bd4020cef9785cc54328bba7e3080f5150e46d6b53023e0525bcce364455545da6c08021624405a5d2c7a69634ceaa27c6815bc53190bc9ddbb5a171bfb335d19e9082e0210094a38adb3e929ac0bfe35acdf569373036559020e5428fd1219b581c58502032d97dd50f46f848729e210cbc91fe4d9e66c2299d8bcd25df0ef5bb69fdd27c763d6525edac4b2cba9e7f38c74dcc4f4e94089029885b82b667bdfcb4ef211885b2ebe2cc98209318e6fce8dbe2f27f6e105ea547c5d115d25cf56c683ba8872f26f2973fac8a8297ec2cde67c0726035cf825da1cea3049afee0b3e599cb7f9498b05258dff9a9c6b230261bfda8810d536531d70065078e442b0b3794f397236607558bde2b7a34cd5402a251d0432d5ce2ea28a3dc4a7e0fbe2a4365b0c5ec75f64f7d1da424ab0ad2016d7ea4403ee40109e0820d60469551287ed3d8e0f1cd689a822ffae25e41ad2b71c3ac35471f65804a4feb9c19f2d865522535a7f63d2a84ef908d86c519b4d56189928cadf71c4e1c02d465360fa77671be8e2abd4f597d5b654fa7517a630fdc62e4609fcd3dff810ed5611d681dc481ae61f6672dca27a5cf3fb5a31b77f7a87df0446356bf0274270225830e3a26fe9b667a061e1965f1dfff7149355089c840cf01a67bd3325e883f4a41088955fa96ac132d06cf883bb970ad1e86904adea7ee2b88b7ebfaf7edd5c16b3583f0e94f05cfa01cfe85928db98417ea35c8f9babee10924aa5930b3b7bcf63f1b70ec646a10360af06fffa61b7265126acd8daafabec9274f95aead1949e97ac2cb93f79d79c1a2e8ace4039e8149278c80b9977fc69724ff9285e00c5f8cf99cee829fb872ad775dbd83e7986b4016fed71ad272b1c04dba40d85860022983d53ccbf57545bc24aa961b3d99291bf9e4e5efed72443cfa2d7ac90e79b74f81e6eb78bec0d73c38038dc9569651025af82752aa0b21c89288266a5d6b2d1d24c312ed10bd78359c97c66092feacc2a77e157f3f3dc5ba5fb00421d8974a42ee50faaa478edce824bd24336937229340418d3d5bc7d80164d007cdf6f5e77020b9b082b7e09ea9bba2aeef18a87dca226e393b841d8c6fe6c4572aa11722cd2849d377fbadaff6c3d9ab1ed0c4eb5eca9fcbd6ae586719a32db6b7b5d8892fa74312e143c735837db3ab01f840c75f97cb7ecfb63c6da7f2936094f6bac9bf6517882dc13295920a92cc5331fd9748a342d722ff0316ce3d0ee1001b2552b48c2c95d25186508ad98371577b6535a33e00657f6f981522ff119e0e7067ed576466a1a68b1f9c0c92bbc05c89422272e9d72c69d0d2846af787e1e6db763945829cef8ecf911348a01b637ef7c36ef2988c1c527c178ddfc814684e2fa47b142662237e7e97f987deba05e2b4a80c11f85255157d1a15bd8c2beb01c9f25e2edcd6a8d0ff3148344d2f56b93c10923930302f845b973bf63c6f5e41fba8ecea27054b39b09cb1842ac1a9c1cad0f5d8d0ec3ce45ed74d0ede67852ed34e5a11c3d4673f0efdd41e742741160443f0e1c289fa185a5e516ff8bb49b1807853b4b0fb2d9eae95d0157bc0ee201e416c9cf978bda80741ef1d94d9e624e3a42871a02e9880bb792988891fcf43359e4b27502a43abed26301a3feb17de2a5ab749f8f186035e87890527d6b8da0b6920e9adf9bc8ca354f9368012cd840ee53f7a67c0d0b840d7f5241d096fba6c1fea307c796e0c6b5f41bbabb82ab2c94dbf91b8e322d6226aa85c884e0ebb17024cfe63483e44d8aee953690264f824d495202e6e3da1492bc319034823d3a9e1d9afe2645ce6f98393c2f47e6c63e3dd676898b5d6e213aee9c6d1c6988c54d29e9e5f658b0d74b459928c00000000000000000c72800050000000074f5ef68ad8e907a6732f6235753d56e12083647b4db837fc3603ea798ca08163a3e8975abf04dbe226e6bdc8da466dbfbf494199693cdd75ff5e1a20ce94fee3375442b8c303d79c5418a6878cfd9b868afaebee1cfc02fe4d748bdedeec03d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034988ba451dd9e026ef0fd8fae298f96f945dab782e721870087fd64e933be8618af9561b93c5a27e12e9d222b9e044b059d6a6eb9a2b619724c869e362ecd69f3491a38a426cc3fc20be8f7f62ff0fc497790fabc3fab9332af7800faa2308e3ad9b13e40979151a4197834644b25bd9e50c93416e7744dc2f38539e1664bd0030f29000eac9da9754ca0fbe2feb74dec0f50425419532eeb074b0ef56e151d2203248c0fc89bacafaccb28f46dea8d80ef8a1d59e3d0cd5c98ec183b1181f513ff0b064d942abb9c8157b59c606f6ebefe96775668cbfc2c473acb346fb0662c8a69750569f9354d8278ba3c01b307f20a8ee5c7854b89aa708c8c730db85dd2bd1a021bcf7525b015ab30f597caf7408dd255c267c357e51b19c1fa6b60e1145efd600307e5d60a9677b3b0481d60cd57b119d7b5e9811a9ae97ea3a73d0d66fc20c916020386558abadb6bdcf05a763c93c2e4efc5791e845e7711d712921c95265f006b0320a66f89fb699886279483a655b6720a492181f5f0b0fb71a948f1bfa82cc15a021e89ba7975061e256aedf73a90dd8da9c5eb5eaf8dfbc6192c1fb33d61517a25713306a13e96b26858b938c6fb57b79f93ed36a6c322889d335c61377c5f287044dc8f0a98a2e552de88ef880a2b2dd0baf85a1450c3f9f7c3e5ac3354e24715e67ed9bed087d54706a6669b49c4735db8c88ecc8a5f776c42a8ce5affdb4966393d54bc783850f03597e8945009443c5f23a3c8db88af2807fa692dc4fc02e825f483e4d941f74383fe8d76406c47909447d3de28d8b393c3d8ec276e365d54949d5013d66723f826c9545428d9bfb0ee2f5aea3eb388baf5d48db9c8026c08fe33f44b15943bfb0120b2c78f9f382a4f7a269cfbd2c2fafb4560b6a951b897f67ee13177a0acb42dd5b141470bf3fdf90d095824f9d1c3dfbd3d4f33cf93cef785b272a72c0b287d066dcea8a68da0654e03fed286da304d9aab728cca34aa02e16420917340c3def2b52e8d797f2e54fae88acb26bbd6bc75c83f196e9689d88e06f7d914b3b21036f806c96780b8fcae391903e6238a92925bc6e5669434333c6af5c0d119f42fbefa60c0822b5f2970864d743eb706d83c9e31c622904425920446678a3b0c3f1f85d2c1d4dab11bae541105a6d63195b59077eaac1b9167a655744b8cf7475de9898e9b067eb26882179849ea90e671ba8ee8a502ac606bf3f14fcf3395712364815f2b38b154685ad1c7dcca02bffe2335ba5500f4197749c125023eb4ead306749ecc9d537ff67b25782b1efceb0329eaa651b46debf3b94a952e7acb6203b6ddf341aeb7a6e49c635fa90b1fbcaac75e1e35306f14153664511cf3d7b2038e05b4ca9ef29f53c42145771712355cd16f0b688151395b981dac771f8039fab6531368d2de7dee8892f9843188178f800bbe4c2274d7217ef2cd58b67ec993cb0c939b886ab9c84abfa7923f70069de68675c1b8811942cacbb8f41f1ea4c35240305b7d0329f46ac3f188568fe07227dfed47c93dc02e1c249a219e058b746837a7abb2027198863e2490c45f2e7251c27a35bef37589d6b72654ec6e40701225d8c80c722e9a1887e3c54b4a3e35066b3e9600052b31e9e9eb2b5a1964b67bd87b7e9feae75447a72bb01ba5abfc126676cf057fb466d9b4093f03e8e05fee30955e24782965e57e53adfc47f698c5a315a52584f13ac76d64736f850a1c16b4b947d35ab28aef565fbe4f82eefb1cf55d220b706d19c18ffccc64508995b761bcfc8f4802dd53b6ba6fa5f41e73bd5222169bbd91fb80f027de29ec197e59cdc75c26f300bda8a26de51c68afcdf1332947a8d33fefb5f8d1361541a1405ed88323883601448cd1f6de8353c00c490d2980a229351e8eb336dfa0e4f08f68e16b923ca1d424fa6bb91c44dffa07a1baf5f958af79252355c51f5e993884079cbd9866fa73d98625bc87ee76d5468fd56bac01e82244ce52a4e1bb374e0e4616908da5327b72fa607c1c48d704787e217a9c17270c91db68c82ee584d982996d859650918e29d0e9700d15c6c314a1402a0578e83a8160aaa00b3be586a57bb44805119d81424699d79f88517553d3da08ce2b10ea02c994f3698c7f4c657c1da1bf6bd4e174d42e5f031b2393b7878680e50e4e2bdc9526f52b9567daf991a0e990fa129537bb7b5d1ddab44b62336fc3b488a85a05056389863526c8a54171c76cd6985021edab9eaabbf687f48e7572f301611e9c3485f7a808a82c75ec6467553cef58974256ea9c000d36e7d17a5e5e975cb7d7cb55f1a8f069eaf08ded0147494edbb6ef3d7a9e74c484bf16f129550585da91a443b5e698251272965f0c8208dc9bac890105e8190764767d68c7738ab786e1fa87fc0c70b4cf910f847457121befa303", "63", 2, -515139458, 0, "1d9e4bb22af4663aea334ed05dfd2b411ed7d2d7ec74dd6a93038e9a932d4c2d"], + ["dfd2511f04358f881f11dbb59d1c6f16454f8686e5422a050f83ae578f5cb250c01358c0650300000008ac63656563636a51ffffffff61348a34379cd69d8da9a525c90c81c88f196126512283abcb187b3c407c564102000000035265ac56d9b417f816c07a2ec1960267dfbe816a7f009053dc7590d318fe51038f828b8f6f477d02000000025252ffffffff97c40630ceb2f479206825d8bb295ae6d0b7f6173e07c153eb89bac382fdfd0f0000000000ffffffff023b5d9004000000000551635351637ff8e70100000000086a6a6552ac51ac6a9614d0140108580703000000000000000000000000777dd7b375a75ac1e3ff379dec437194e63bbaa7e1afa28d786ba07d179b0edd7c77f847928f12682ab03f3ae58ccfbc5fd8193af78fa924a751c8e2cc9e6c70081b4a439dbbcdcbeace8c5686b8e799a09b3b78dfa20120b10536c964a5267c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052591fd6a3a3bed1d584b49a289a0a1b42e9632b7c4ece2d54b6424bae362b3b896922b7c3f2713fb52a58581b10d501de4a2a804df65f6ecb7a28986b2f65d5424e8c8cff12b10f7b569c9fcfd89254261cabef4c06fbf6a0f2fdf9804bbedb180d388cbbfdbbea285af5652729f4af6803351e1f21aed49e85162cd81afdca032d0b074b62584e6ae35dab1df7cdad3c4ebcb7f7fbc00a59acf610ff0ec3e3ea020a12262c2324a9e1ca8427c6c12f6dfdb8ffb06b11ee82c1063396347a7f1f350b03d8fe0fb910595b560a8ce4b5efabd6accff615167a696b1697d4bdb6af12674bbd46c7c90732e3e1e9bc79877aa46804dd872e8e1f7a0fcbd2ffa84a771059031550d4a53982580598f1a6e15d6e9fa3011d377815f87390366e8dbe0249e8300226ea097a71b0d406935f0e678d255a689fa69e042e01aa80406b7f19900af3770215ff256f702451c77e35ced80b4f145b45db3365522a446a8af549a599dbf3f1021c61ba1d49a498626a3dd92ed7b7a29c2b1189b927d045b69434eeb1454f212c0324e5e900fcdbdce0d6289da841d914d18e41c838558b58ba4c4de96b2e33c634da383e32434b9a8b87a54dd479694e32df836c7071c0d4d01a92b429d733de69deeb0c87b6b61f7304b257e818fca8e60cd71764f357b3095dff359bd309feb72545632f2ddc5c0146fe45d9fb47df3068b6f83b753004eb2b8391198be042931aad5c9cb40ff1c40b53e34c432af4d0706faead2c9fd0c2fae54c81bb40ecfeca52d2b46ef3e589e7f69cbfe93d71a5dfc5cce4dea9b9b3152be49a7709fd5b9413336ed3451f81e62679445ac87f53475d212e38fda782ee18ec0bd751fa0e87f5cbe746f8af8f8d885ec6ca722f3a004617c1af3b6dd6ddfa41d2b8163fc8925dd2f18d101c2c955ecffa90b377b9930e8fb78695b8ddb9d02886a8ab91922c2b9b5e4e389b5c5da4e339888ff6f9e99a96cd894c569524575850a13b6fd2862c93cfed5dad97a27f31dc46364979d4cdaef959a16340e53805890e77b28e48e963322dc91a77f5b6470222abfb0c5393be611366e5659998bd5718612f8e51385f240b0fc91f939f34e29cac6148e6a27c8f2b0767b04c12407a1340a0cf47207e0c58c42f401a4c64bc13a30b356ec1c812312c15185c063f14045044cde4db19264dd2ec6912da430732df72aac9b8995555742f45ebec0c3ae40122bb65a10b29187f6795233b5dc579431a47631ff7b3471d289c593ddbcdae58826f1209bfd6be65f875be7f722f3b47fd6da2181e0a632426216983e79dbf1d9b8801b81c43db6c6bfc24ef636d9b2127f92cb46ab70e9b7d8720843e1117969ac9a6715cf6d2a5f987d3fa3a6937c5fc38946f39d2d36d0d76f37c7b40a12c17c24cd3025b200f080dfede975259a20021d9a7b39fde912b9bfdd2ebaa6be0f7b54501fe04892ffa55feab04d81b36d18f2efd76b39149685698da186ddab6f91273448c943cf8d463f69eb5d54335a11a70f585af74493c78e4aeb36054c215bcd5f65f0477f3ca11c07ebaa4d244053f84421757feb69139d90c059d231f49f3e5946e0fc63f90cc25faf818dde2d6226c4309527eba1705bc9929529126336b7c0137a76274fe1de339463078881d08df05bad2df4e71b86eaaca2c287a087961d20b4e5304a73f9f268b81ed3d6c31fd1df857870d91bc08fd36e82cab52b99cead2307f328ef5d2fd4ca0e36ae2f2a747bee75a5b611e82c62d3c01f786a2814c3acd86c3c5d254ae4f105d9e32445f37f9eb878b21b96fd5dc6bc96998be42bc0e5bd762bbd57955affe21411f6a5247024b7e0477d8df38a85d886006d712c6b10b8fbd832a109694886ce35fb475f5ae5534069670545a9c475c63826bd38561724daabf5346579593919f6fbacebbf759b25701ebe87cdeb6439b57f0d6ebde5628ead6bb7899cd5685f029b6bb407692eeb562f79883df8fdfa97db2601e962cce2d60d7f433d17c62ccf92a6442bb494e5d320f106bdb8374c9977799727743b04266ebbaa71868168eb6f81249170e97d8e29bcb10bed1c907ae2fc5e17714fd793d3b0796dfaa75de51c49308d332f13172d4f47a6b44277d060120d895f72fa855e6c63e5e64d5e127ea48f51092a0f644db29381c58a6919a4183173ea4a8bb5eda8682ae033cf7323f84cfd8208f3aaa02b6716881fcd7147bb77e51ead51aca6edc6b37de2c5345ac3f85d2cfdeb64a242945ce1e0d8744f07836fcccf6dc54a055d21d58d7aebbaba71ead699e232b3b4acc3f8e72a74f9f47b58535a22991bc3934c67126aaa31c0428b7e5accfddc2bf094538c3f7d4ba50e9e30241979c0d9c2405f022cf6f071d02dff667994735761709de61687ea2a047210cdd887ac0ad1487a2ebb999871100", "5100", 0, 1331992336, 0, "985bcd39a458d7942e1d4499316d104ff81a68b270156fdd5db9098f3e2e2007"], + ["e748f559023562d4e3c76c7a7d2842bfe36ceb82b304a4be4347eac6155842c543c6e2138403000000060000655253acbc69260afe331eb5c1e3f4fcb515d3089f9468fa7d28bac214f4cd06e3d6c6a212f0220d02000000076a52535153526a4974131c02631524030000000000f5a052000000000005656a535263000000000200000000000000005a28ee0300000000d19f1197ed510c3418085c79dd2241b486c122aafc1dd8e68465213c73b76758f0665e75d99bdef44218c5a95ac8acb5472ede3d22c239fa2966aead4e1294d00c0d69c869b12ebd234c0a8cb2fc5c2c6ccb63829c624008b85f2a80a73bf4ac000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b288e417ec9ae4dbca68eb1289406b95e76a9ebe2e665f20bb7bc487e82080a280420beffe818e917574cf17f062a55fa17eac548d97c0264342d134c3687b9653ad918504a9f41fad8183929e5d197d3f7b05653896ff76e5ae8e58a108e90f32abe8dbbb3ef4d5f4adc913aaf786020ba29b1633061fabfb3bdefb5e05a6d030b70317db298c426bdba3ee310749f4569e87d0c23c62f6e6ba84e8dd4c095990201b2013748b9363f2278a8c5719731aec58e8e3b57d380dd122d2e07f1acd6920b02cef3bc2fd673cb7a6a0298d0037dd01198aee18a955c246be42f0934f476799007a5340b116fb3be72df15f68055fea5d348ae1f61f27eecfea0a3b0bd83ee02280f354cc1de83e626b9c4af0e69103acb8f2f2c9ae682dc3adadb03c2b547ef0326eebae365e4f59a8471a2eb3f8e34d77a6e4e1d18ca71e3bf2af81cdbc18c240314171cff837761de54a1e2b9bb2aa869851002cb003e36d8202ffb3391089a8c030d429a48fa0b6ea33caa02f66c7fc8b1e19b8f32f64bd125afb53a869f28e6a80219cdc83f23e7fbe54e1f6453775c48c93fc5da2c91fb1cd57aca9f5595ffd246f66be7f4ae16b0820745cc4c0eee8477250fa21a958ac5d4bdb73d8801559099b0e8180c1992cd2188813fe6995b8077bd07e128771272becc7fbdc4ee7e3ef7fde230c413ce21ec79056db2e19b33c07432a1720741dccac49d88cd71766ae28370993ae5f4616d0693a49a68882896a7802ee05f14be78c9cb8ca9aaa7e0abcc5e7fe65d8769dfe1c0f2465c726a80896804435d0e22c527a151e653f59ecb9fe3199fe3a2dffb6d6b1d599c77b9871514a28c9466867908c4b2efcaaefcb9ea847063f8d2a2f85852de25b3d9df5a5588a3222b371c8434a78b6a6833da0ce27f312606f11f2f04fb0e605b0fe6eca510e8635dc9b574dbbe0c648ad019dcae47cff98be745e502fd4ed8022aeab8a5ee00d472a6d42a46168f7560a5f1d94249ea3878f6628ff346744ba1f3ba6c00aa3bc471567c5b949c6c00c920f8e4c7dd8f2888135209a5bb0f84c23b96e06a1e33983b99192841760850ca3e2cd23e5c3a7712b570d404697399f5e772705a86756a92381d5177436dee72e35cfd6ec69c9ae4352a282e1a4f797ba879c44a0125812612e1292a90fd992ec111424cb4e62e638d4496812bc827af9e92e57ad2ca61174111300051513a288bd186abdd84fc6467227a45d51e8e44c61741583f61195de065b983eeebcf1d60641698d2ad7bb869a089f76afcc3293a44513f896cb1f68e6710ce15ab19c895a8158c2c6115fe13e349bbd4ca12d3aeb056a4df6b62542cd24507efd0b895df3c7e9099db10bf8e91ee55b8451e8abb0a2833db2a30cbb0dc828616fe4981bdddd1723710d464445b13580cc0ccbc5e4c620faaa914f02c6c7091b39375e30ca2cc479eb4c90aae017b4d898b1426fca8fb001a5666f7d170ef987d3214cdee81362ba09c00b57abffb572fe37fa707357cfb216e4723f10860fdcb9119cbbd30ca575a349201ec101dd98c77a024c802e918c5dceab529942304f04040995c5bc21e04f88ba7c544aeb00137d50ad50f15168075e0e50ccb1d77a79306871cb2866a0238721c807d517131a1edc15d2e54f7024a5ef3ac6d9b06eb8969c4cb80ac1f252a6dbb103cdb76129607cbd27dec9c7870b35891f7794bfee9b36d4f581f22e8197cb72ad17cd1a4778b30f00a28a559b3474fd017775998f08ec558a971a9d8082b415cc7a7ed90f97b47cafcb68e848e8b471d3c69cb2a5c9d13ada98ad6b110a4fde3fd892cb1ecf7aed96265b1aa66e54223e8c7d189ae23029b18ecc641355fab7afdc300520308795db1577e95d3733439dbce65c44c1da6d5961d25049535dabf4a3bcf9aff6c30db9425a8cd435363ca3abcc8fc3233d5bcfdc74b89d8ee49b34108de937efc8100db6a33b90c7c9e666f4b0043fb2aa282f91ecd9711a76458974c9515b660fbd182129d39fcafced102f4658bd6e2bfa0f17b19093b151fab57064addf2f34d0a67abb3a65e4a39ad2399a363743b1dc132fe5d9e32eeeb785b6baafd549a8caa72d1e492670c99c33707bf0d884f9a95b7c8fa4224e95afa65e5833f154527fa5f2bf7c25d7f8a84375d846b320bff9852f5afe6752431f6ced1871fea756c837351e88dca221ad3f64ef2ac606f3e16f15a8b83391e829658a95d794a2ea5accba2fd59a8187313c582c13deb4eb11871f82c2bfbf9d8e30823aba2e0a4315210abef5bee7f57000000000000000000000000000e55b19583fd8e90eacbb6e025fa7577563d3e6338ed29275ef485539efe7ae9229d8e452ca5efeb4ead57888ecb7ba6b75546e622f354f40ea6ac3f438cd684f9e566ac2175467860501990089bcec8491f34bcfc09139318fc552cfa12e2b8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007204ca2d44f7a04820eb2c1776449f69f51363f2e67deed77465cd324de51bb87faf51a0d2b1d7513d647fe21f8efb941630b819b9a4d7b5835f0b9cbcaed3567dc0c587f6fb02dd8146ae450d07a60963de7aea624ec21decef401552eead93ab2e0171ce07c23c6a3b9318b6bd22bb1232e87b47c533e53e6e0dafb1efffb1031ee3567f8d7149ace46909fbcdab997f404b75c5a1d16807a203a6000a78e1220202ea7c467917e28826012c9b94b1649c30c83e314bb37cf60fdc207dffcfdc0b0a08221ff4931b369b121a429ec8b4b4fb3fb85d47af178ab4c9a15d9dc911dbffc71aecef90b7854c0a7f615eab93985ac4fa12ca33d02f2d8e509edad92adf2c030836eaee86d9806bcf00a3dc8b5337b46b5289a53a3fa735ae6a877b281b8c86020cef65519918fa83d8bf3d570935bbd83bd9cd5e25ef07c2e9a8d194e388f62502017f548a3d490af529623002fb6f6b5304ee9cbcddecde3b0d9d02f236a631d6032fee3c816e980cd2fe15f07e8c1f0b64aed33b0c51b363e6f2efc65eb1f1c6bf031f961e2bb4473ff3db568dc49cef758646df0e99d25435c2c9eb826f3dbfbfc2ce698305327f7d245d2919a8976fbe65d27b71b5d00775a152e648f0763356fd72750796479b0ef135899ce68226d3dec32a1d34a87343acba7216776db4ba26cf78cef6be76c2b085959fa05bdfe40f055a04d8b17c274e57d17f5993df1b4ba6ba6c037a355d203e3bf79a6a83063fbd6f51cb5febdba9171543606c75f5c5b408b40aeab2778db993b33f2907a000f5605df910083f2ff6566bad41e0b7764ae87f993c8f6340a43ea590c68a984776e71621a19d7719e4e83eb8e4d298fb1c6880e6f68b16bca0c9f822a580870159128e46587b1e80833b9df6694e946193ddadf5ffce53b77b639bc86b45031599169d5298c7ebea65e5dc1274b001b664278de423de7573dbb8329fee73f87e5e9854deb388a73bbe1c43e24f1795a9e9eaa33aca975c9da10e46654d5389d71d83da3e1984e8f752f46275387920858425b4baf5b86c51ce0faceccf299c5cdf3624e4edc493dc8af0d7aa3a3bb881256ef76823343b9b7708ba2346120a3fbab0c1b6cfe840e40abaff5109202a09f1becec625340bb26095d3b5ee3291db18d23be740873775ac03766ea2fb3088a43d733dfcdf409f106b1c7e3a1690f14b874c1af202d127fc032885964181e669cabda4f114d5f86d01128f3a9a0bb1bdc60e59dbd7abbd16402d8b37954feb9d9ace89d97a9d387fdefcb1f26781a55d8a864f7df0e6544d3284d10d4c5148cca911a26f9e0cc59d4427f2c851211df6aaf54c3bbbdaf974465f1590fdc3448e38e9cbaeb40a192430702b008604547785e89fed19f1f3a70523f80fe1b2c08f4b18d9471958bddbe45144a1372f9e3135d94f5ed18cdc65cfd6df9aceca4d255f864dcae163b7fbfa24401a7702e97d95bdbcce3937e04d0a5cf03a60083338eb84367b338188011bc1496679437cddeed987b5124c2220af16b93cf42e344ab7b9708770c506b2813cbba9a03db54b2121794265bdf0bc57fdedb836afc4b64f451986611f4e4016bf16452bdb2b59fa353df8d571985feb26b9047740ed59944c2447d71db71a8087a3a88ea779858eef0afb318822e095a2879c2071c1180770f0e84f4e8bdcca5531aa8854a93a35a40fc797a48f9251d9c0d81ce6b12ae6e3d8d79ece0e6fa21f9d20bf6f94906479346405e9f8ff34687f34227ec375afab27f7d3cfac46061e0dfb206a8da162407aa9306044540263c47d47f26a381ab0918670c174f48d21cb7d7036a54957ca790c60964bc8a5f3f53d6b4e04318548592ece9595afe734b3f43ddd900df532b2f0ac5ffc1351c93f2ce23d4801b006cd6a983fda690502db4733b4e9eec79f66221044724565ceaf16deab18e1f21a6508615907563fd8e149a9b2079e9e5b0d20d85c8f2c9221fb04381fab52a743ba9842b413142f7a2ab6b90fa12339e1577ebec099c2591f3755f757aa91c56b6d930e3317fa8bb50ee55d98d56b8a9c1153fe9246cda7e2620e011b879ece6405c8b352a391bed889541918a605ff5fb2ec5a5ac72961b42e76740594a528ebd13e01422689dacaa32b41ec3505386c011dcf10c981c8b5914d6d71c5847a735adcbe3f6029338dba4a8feec8200b8441eab7b351b0cc2ffa8a73a282d26debcf5501248c65dd13f3f2c1c100e96747b89dccb651551f98983b6b2361ab25353da646fd7fa62f0d6bcb3addc8c972b49a0b0da3b4abc5c942c89cfd0a5bea18d4dd3ad171954b98f9f882da137d5163a3acaab1bb6c6b910537a513f590092339455d9c3cfd88c1d92ea5ecfa7b77dd84d21b4b3035f05a1af4e68c55dddd56625c9b6e29fee60949a34625177405", "006a65ac65ac6a", 1, 1883818395, 1537743641, "dea6b05ace029dc44983543bd60840c93d18c3373c7b226e7a4e961dc72c61a0"], + ["41a7cc6202975a45027b7aca71a0cd353441fdf6e6608e6d11f0c02a175833af531e3e9d8e0000000004ac6a636affffffff42560a9b7c1e65e0eef48a4795dc69d5b825a35dfd14fef4e824ec05a5d3c76400000000056a00535153b7da9baf02f638d1050000000004ac6353acc6cae105000000000763656553ac6aac0000000000", "", 0, -217334880, 0, "ebd7230e847b2d4d97902e9ac32311b52d2304c1212789efa2c40a454d53dfb6"], + ["25096e5d0295307bd40aee81bda793314f6050902255a6450c9bc702f2def9650fee69bf4d0000000003ac51ac16bd23dee7f9e0e97103b8077508de8461d51fe4319fa9559c2af5cacb734ce165f40a470200000000127953f402ece5750100000000065200656a656367beae05000000000400516363000000000100000000000000009b902b0500000000bf7da4e1a5a813d81c52e6b5dfcd1645def061978e0d5c344860a63d2b02cf7d2c9dd81e7ef09319885fe9aa6101da38324fa43a21f17e61fb7657ec20ae8f3756fa54a9c53e7ca18f1220f9c6dab131257d672d18df89e896f7c3f6e7fffd07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c46fabfb93e034da696f7802ba66dd926f0d41e84f1a950ba3d32d0529bfd0ecd4c55386d203e0461a3d3b8e82a56962c481b8773bcec7e0f95ef54452ae4ccae2b5d988f8228785487499d1d2f3b6ccf0412479bfdf087979a7a0f8bbfdd84606fcd4b8ad08fe4bf7e6f357dad9b7f5ab0fef0652d15f4ca0c031f6a54c4a30201a90e1870e6e3858b36c68f748204ed4dcceaea58d39621e2aa5532dafd6a7f0215555cf974b0c0fcba2b7cea6472eb49824197e76e6668e0ebbc9a78ea7058e60a0350d45685c3662bc8ecba820038b5fe383825994e68580da2e9722001a4fa05b00789448079b656324495f1aeafd97b3305c33ef412c18a8044356e9e0f6fd20309d96daa63705053d3e05431f23e60e97283a4859233b30c0ffa3d3ba8846c4e031cebb9effae1ecdabbf6fa72919a937ca952400a115ca5de3258cad902a0a21d030f4fcf33a736ca4a3282ffc26f4bd5fae0546d4274dca3434842c652e5da228f031da599c84de58c1ff69061b8df57b15c0ea1f2a5aff5cc075e09e2d804d1a99c022ed8f0e3383e87de03b9b1eca7eb2e64d50327ce784722eb8a82e5b5711d2e7fc7b14dd300545cb35b1fe467332e68128a4b5f147c5a4a7615afe3b704a9f093d4229d3fe3c2fc5ddae1774be340a768248e2404c57563de683df34377757404aa18de8c856a555f48ca032fb02bc7ed17ef64df7cc138769d8dbaabe1b58307a3cc982a3d3d9d852cda82d134a4152716e64aff7e5435e8cdee71af347ece16471f6cf3819dab1dffeacd7b302c5cab0c49f1ec5a673048316380cd978366a7e6cda5e3534449f7515c78edb3d76eb83c73352e83f6ed4082cca0fea460728eec2b5ee453ac4c306f34070ce44fb7d60c29ed8803eccdd8eb27809b04397c75e3b6a027a59d4cb48101459d4b294bcffefa3983d1f7024d6ed945debad81382e30e1e8c3af927696f12db3456254cb15eee79adcffd05d46bc73a9c0840fef1e5314df43b82ae620e3019f47685d6080dbd7e26e5c791faa89596b93588fe5910b03742a90057da3f99edbd3e119a17648f907e19ead03f0e0c01eefbd7f53dc3937d76bcb783facc360779578fc54ea8326e08e8b2ca6cedb155948d22292e7499e77b12db62d218ffe04a56d90563b6d354bfd2b67a41083dc98606016449d11bdbe876e857ec0d006780c31f4da41b6f158f8a49e64ba7dcb2e4dd715b8d17b251bc5cf4f26c61ecde37434476b119daee28ff3710ce3faed5ca0578f19589aa128966707f2eaad956d0c8807386f66e513e381d0af3464a077df8060229b7c21b49dbb25b683b32c376936cc0d917e323b4a64828fa42226ac4bc6f2053afc03b1daf62c74aabeb8c978b13fd706beb1daf716e230e7a4b86280d2fae694467b6b3b974ed90734b6743460697a346f5097d78207bfcb0ad7ef13f23d1749962e4ffe1f3bc9cf5a38db44b5f861ce593e6125c5be30561378556efd1ba8467a654a9bb1d2b5f4d9d90bc724d0bf5b0ee79c797a8b7bbccf0af39615b9987290d2cc8baae80d45a9397a723cb8961d5c127c66daf802d903cea9a13c988bf94ea6771e2ea13465e7dbbf5ccb0ec277bfde10b757cd2a0576d486cdaaf7098be4d4a32e7b3ae5460e4f38c03695a001ac748a433fba416f895536c5e0c78367385e5b5baa8e47e46bdab7a6914c3ed3949637ac583c7858d8538d3c7d29a0796d2bebe618edde1f266d366e12c063172ea6b377d1a204c94b53b6e3a2cb65ce00470a85d71e6ce06c9dc7af5ea1af62d5cebd39c1ef1ad54e192787a591307a876f65358cb2cc5af67d2426afe2647b827932154bb5f09e6ef9f2c1f4f2f0af5b873b78124253df9baf999444fcef61d1073d45b0aadc3dca23242ea43b1a21064f3a5caa790a760490d5b17a46b19fcb1644e5ccdf3c30533805a6cb3f3e67ed8c53ec6ca778bc34a3050bdca41121c30c4dfc737059458950fc39c45508f4c1020b72e34d87c421ef2f99bfb126ac622de7e20631cc11df79f7910cca8279bab73d9e74d80c80ccb37141fe7ccdb2a33283d3cfd6d6ab996ab3a5f952336da2fc854f6d102ea183c74a2c2c62318dee3c51167710a3d2ea4ea44d6f1a165cc0ec44ddfb5e63b2fc85b1c19d37a59c2081922b5673abd8cbdf8ce51acb9729025255009920f53278136f4366d4ee3afd865a4801e527d426e05692bb187f14c9997b868f715e805dac42ba0951d2be249ce9e7c3b77048604a88d417bfdb40e9dac01cdaf27461ac229f5e88a2bcc3bbb64a54656f4c6de45f3df8b0951c72d1a4607b6a5a13b52b408af645b0bdb22ed0861c48515f1216432058db28fa3eaec5aad4f0833cfccc787716ab7fc7b553413aae698bab95f0ca4926a86376ffad6fe9f8ffa3ebf5fea165ff029d683300a", "", 0, 1689297479, 1537743641, "526ee594c0985a597e917a5933e366962a8d9b1434301207bc7314e747a68baa"], + ["ee9aba2704b1084dba79b294bfae56f408d7bfb69bd50320fd36b1a0aee9910995f72ab994000000000400525352ffffffff0bb8b4eba52e73e5e5208c510450cd14e4b0a24aae0288d118bcf2a2f2fed7850000000000fffffffffa902925b45601f895e0d1cfcf0721748e482dab21addf08acf40529dc728cca030000000352656affffffff7fa2168cbb14f7c2e4dd825d65f8ec711b84f1f1823a41f9d9203ed26ef0edbd030000000653ac63ac6a6325185798012d5e070000000000046a6a516328f74fd402404ed601000000000000000000000000aea81ba4e2e5feb947a956f14597ee5a227f2244be7a7a168be43ee9b0b2cc4f8521f1fe5c002a9b5262663f742aa184d7c9e4e50ee888e01f03b75e151679e18c8f8bf8a0041ee429bef97b881f7482fe04192b4ed3f2a41decac12d21791b70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000037df29a7ccd7d7aea42752b8059776837e68fa0488707bb70ea4bbdb96fe5d9e3fc769b267659e2678ca6f80b437fe5502deaaea46e173bdeb51329feef82a27c0553f65ff69cdc274350e9a913c668d607333d81dc0882a945da42e96710a08818f58866c2c6f149fe0495a873bafd03743aad997393f8d3c2a8d0c866c34c9022b446c3a6b673fad87b6ea2002cf2b05e9edcdcb869782203610e504397aaba8021c8821e85400f63139fae475fe9303ef9d1d140b903c93c64dc5f605eed74b5b0b053537f17d8ca4dc7ba38b68d72383c56d1ae3bba31d010b6d0f1e2af05ff7c389b9f9e8b0ac9164a5788d2832ad8bc647472e77eab2fff0439ae164fd444d3e0214a92238a86b52131f3911cae989ae0e7c97238f532836ebeb9923dfc1ab7a1a030030e4441dd14c74e56573e7d8794bdc8888309be565e2e89b20981cdea120f1031605a5fb72774fbd24bf9bd9aa22b1de5a2fa3db973da3ea1ef481c9105a3905020129aad2006f567c6c34482f5a7df87c1004b979d0ba2e2147c72352d5c79f970305ff9ded025293a13be846c618c19e052a24b340f51b71c5011a3266aec226ea7d6e640364611c268acadd5bdc53ebf1d0c7baed782bc486cedb9ab4b37efb0d3df466d6bf489fc9bb45505752ae3fcadc5dbdfff1ea5fac4eaa33cf8aa1a1c5d4d18999c75fc74dfd067c3f5e8110d0c2dd8eed5ace6673a916659d04f327f029b0546560c1ca92afb1978488f000afbcf16fc07ce982c7829e7dd1479b0df62da4dfff79cf7b3fd41d1ae41761e231d16e8072f93924db2835335e412758432ab20f33666860eceb31e8153b260d8350093582b1b5017d83f19da0bc62a0b496110491335b5338e988aa8adece41afd21f35d52923742c7b59c1f9609d157512a6f2f04f78f6eac248f0139fbe51d36beec18de36f2a60c11b26b296408bfe5ab1e27a0500dac33860fb8ff867a0f35b76204ad4e96cb24c0148c37de455d99d0916c5b14a7c023795103c3fea388c642ddf966c1b0a847f6a58ed2c84d6d4063c8327ff4b7f1bcd84a3173766d2dcff7483d61453bf210a5d1316930d31a141e707d05c41b771c6ff7f8c47b7cd60520336281d7e2797a8f52542dd7f1699edbd701dc0017a5b3a99d930cdd4ca6d954444025b984af5defbf43486383ed561a836d54f2c629f774b807ee9a439f489871e0f0302a53ffe76db2c1da4ed48e4aa81bd17b31d61e0102ab874c914717813f2dc541fb4d99b5179e1b8e82176a828bfe7e9f13187adde560295247bdbc253b408a09e12da9bc88abc02a859f75f1745ccbd5d85b6863fdf7bbe80b7654a1c1b78908d24144262bd3b805794ea8163eba5eb1de871d999d268cd2024487b060cfa78673dae0668884a893e2c1d0dc1c057fb5931fa80783a07365862f4208a91104627408573745fcdb989fc722456fc815b6fbca17472e86920dba865adb5978663a4c903c17a478bd8b2e12081e2a10633803c5f445a646b1f6a9cbafb8222587abc12275c2e0fee5fd95220099346a70895c204f6f15e88dd9bd9b484da616551d10b677f84d14dc2b4bd065ad127108b3cb1fab4e6fe5f88d12dbe40a2fac2b46f6cecf0c32c17ee017125be0a5870b6d699d5850b81536364be6a785169c7ac84eafedb740fd29793f4447c61fddf0210896dc6af98ddabee202ddbb07923895c284d24fb76b4018a1f88b9215217e66e1987666df923ec92d655414e7aa543bf35fd350bd916b131c588b9386edf072038016b149b6545187659320a2481fc926f28b632985554d55d5ea414f5ee6843d15428290c4a41a3c1879262f9481a380529e58dfef3079f9929b351a835466db6c6fd9c9974bae71bc510b625f21f79135687c13a8c481baaab1a7dd8e7656129c53f80240e4a8382245dd28f7ef8a6ee4eb1fd72f4362e8be176ad73508c5107c4735d93eb01f11c40f2da8f638dac5b5e44768fce30798b0c7990298d4abebebd0c549043580a1e749914ca353cdb146aa89f6a72dfee5304ed42a585e6cc243ef5239c3ecb58c5154af8487d10522b3dc0c0e9976428a93f408b72f17fe11ccd868581b0c0ca930e5e2debca261a21d5f192f9147ce4fe644d055c16ab26b1cf25ffe9efec72089d7e7f06aad83c0ea3f10f9f1ce913d80a0e0628fc8cc3d39665c6a8c11a7da2d30d4719460c4b56220b5a6cab67361ec72e7e8e44e11aa24f484141fe5f26d0b559dd508d1e236c8bd8d96a30a237ac741fb6f375f447b14663b361837b1ac8938df00000000000000000504d48050000000070e142fb4e7d5c0901accf5e134328ca740ea97b850d5061e7ea62d5a03dd26019107fedef17246fcc9bea953f3a3e7d5b3f225faa30c786a27d2c6955edf80f9d233ab6d12171a0851cedffeb9b659c58e10a1d77acac4adcd62da5386ba84600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cf0eb636bc21bb01a335d4ba713a3f0931cb313c1e57d6be430dac3f00cd825405f508a0b3457ad8e1cf4fd7de59b5a6c650f78c3c2aeb8002f72acee51dd64f5ce2f629d098acda9fd0eda4285150149fa9d9ee0b92c7fcefaeeb0de87d23710bbb61268ee284442f9119786576d6c46f68b9b23791013e8ed6e2aa0068c7750212324fee1a3c22b15d64fa0132b4868731dc2553dc19b9cabece34e80f04d0020218466ec4315858a2e7b1e9ea8dce80890af8a24d38022af2b0436e51e16a28160a0427fe04806d1e2bf366c865745b44251a065eb717e2b2bd8ec76beac6ef52ae513d091b5cb81291bce1e1cf1ad08259c75aabcf2c9d6aa720a4b879d24022dd02054ecd00ffef639c2795f802ef6f0f1db084e12f66156e59705734e2c38bb268022bd9834b8bc05b22b2b53cf0e4c5b0878baa577dd04febe9edb05ed222823d190317a2b9ff3ea7794b5f72a12792a46e58bc9c15c68ba9041836040a7311b4a9ec03218aca5e95d50307151940fe78cecccd61c4d7c346873f70f881289319cf6e4f022575843401ed4b5509153f845f62a5012e2b3a0e0003d665580809685d06504ccbf7048509c2398dda4e5637af7bd20ca75e85d1c5b7e2ad57735adb78502e5e6a4f7dd3f60742f69e1215ca440e9a8dbdaabdd7f555eb563e0b678b8bf15256f8a6b87e1e3cb9361b1696b67899580f38bc3b1d806dd7819a3fc4703c3bf4ac8c8f503042c5f35a3e0174bc17e9980da86d5a65d562450406acd0202a207dceb8b8064578a876aec64cf62bcdfd04d6fea13651a3eb2daecc160d2758eb226287ac61f3d4a224afc708bce09fa68bd449188a313f0503b9c46caa91dea218e40b09ba942fc82b3a1f7efb2bc3bcc6367a0e9cb4b2031a41aede577ef3bc5d813f1afc141cb2b2f97533cd173d5ccb6e4fc68b0fb710a05ecd9a7cce93258ceff57d1776d785c00d6af396b3f4bf2def60323ddf831ad5956486ea82575ddb9788111427a125670dbeae48279f739c4998cebff9c229a4f9a303dbaef17c7a6939d84fbfc3f002f4a87c182446a15fe76fe9b87ab2a1b3625a2337169abbe7f4fa2c1e82199a367d03397e4db0d1f6910385fc091ba41632f31463dbcddeb65fc175f0d1cde5912d597c1373b62c4f8d55361abfb485a3c820b1dda0a8049b4122b94fe339aa34aef8f30d837bce9cfe9562037a26bf4d9f60e50f8be68eb6f067550cc985a01cf0610341c73dd5f998a904388715c2906f92c33738ee3e4818445b0a33e5acaf795cc36071f0c4a69f22a181ace87371f27a8f1436eee63a3bb8c6709ba62edec720430d9067e7fb15f27052b78661d7ba83cd0a6c8212fcea4043a48222569d67889918ec640b67578e58c5e4a18c12b55e94face13215ce7b8fa0be7fd136f72dd478d7982f204cd062674127b25de63811dad3d786ac644748fb3ad8703ab8ac00528f99560ea54ddd32b6b2d17c08c753e885734c5212506584d960d5308550a5ed8570d7a01c1900aa1697c37d4ef695712c48c08b3ff4b4ad4fab61f308158b019fcde7b8835aa4a067a23f480d9312cfdf4a5cea3c7d826624f187da45ab70eeff017d07efa264c4665e92b1d8053f7634559558a9f097a06eaa34ee960cc74e3e7d0a15361ea9582b5ae464ed223fc3ec9adb7d675610b7417ee34de9d0a0708ff120b86e18d21c1ac617f6678d81ce32d00a3d5ac4aad761f5416e4b4afc8e17d9923ae622a92ecf1d6d35ea81161120f63452176ba5bcf5e2c9dda80ecdb1c641a3e13d1e0a9d7981060b86b7d852caab6d1dfa75d0757024edb692ceb45e81c5ea035dcaadf2f404f4276b9070bfe699c415c73a9ccb8b91014001ab1c24dd24e19f628bba0ac97ddd1112ec55c4962964f670c00c132bd2718824a95621a51239e0d05197d0dd3ec1e01fb719242d07e6004a7a7251dfe90ae9ae91d841f4b95923ea343081d463ee08f7d8cfeae705fe16329b7c914c1192370c5c76c2cabc9f1c5f30e165aa8004a23f6b1fb179b0cc9e69da5f091f54688686449602af1e38c44bad0afddb2926dde9da57efb1264482d9da28b86ca38e96697093b0dcdc5e1562ece4ecafc09f012891c0540a4b19845f06d8fe9cd6383c6995aa97479da1327e45ee0d24ae2abe6e74a7dcf799ba214fb9793376b62c695ac0fd77151d27567d48cb31f662da06d4314afd45b6ebb7a07ce3477de573f15c20b80a47052a224f0e60c7b6acfb24b8cd582eba95bc6d3c580b6323e3dded22ff8e19484a742e60ee5a3716341e415e2e6c8f5d81ef303a538548df553d5bd7e0b7cf4ff5b7a96cdf85e2fa0b6aa6f99f2597ced76abce55f8a52ce52f7e73290455e5fc8abeea5c06980de5ea2f731c5c4f490f106ddd63e89cc274e5486747ce6e059e5e892b424e0b", "656a6a6a535152", 2, 201574854, 1537743641, "bd063cf8d7f582319ae3b957d032035dd8a7e5e4fea488f5a2fcc4a6eff10d8c"], + ["030000807082c40303afc29a4c605af3aa4c9e860424a76db4e4f7e188a4c9b0342a852a6c1e03ebd602000000035353acffffffff54b846bda68ce6fc59bc0fa2f77b0954bf7b33446a0a2ebf03ab41c637ce8b310100000009515165ac63636300acffffffff3b97b88fc262add441cace68840aa61808f2ff19bac1d5cdf82ec50084d1c2d000000000026a53d2107ee6030a162d010000000005635351ac6a28a08c030000000006ac00006a6553ef99f8040000000000b297b7af00000000030000000000000000a5b9b4000000000047bb466cabca0f30678a181a34f0aca8b624d1f471c65a2460b8b6421b390174763d5c3fd3db7b96a1226d694d8427914597ab6f0d705d755e699a59c307014f2ebfda1040e6ef3f9c3449b7ea06f3bb75999e9db515682342f9f252715dc29d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000922d7980a7abb63bb6995bfe07cd3ba4bb38f8bc3b55f39a29dbabc160846ebc5c5979008faca749440ac113c87d9ea33ba87cf285c059663cf6f1538513bf47664aa7e529ee1e5537ca1142c35116cdeb9440422985e8e9d280f2e2987b25856a3e7064e387d783bf470c21e90db3f391e26bc3f0bf62c31bbc3a6ef42383da030bdc04669bf539275525dfbeb14c4f79a31711789d313980f76dd3777ece85770308b1cd5e74ecf230b53ed1f41c8fce2fdadb6b9d4c19893db3f3de60940f46560b0015607c2c5069e9067e7392170f9e59f596e20c59efc8caab5b0265f4880410869c93302bc4096fdd790f5d47be37bc1467f970dc6ec8d526de7ef0ee5b8bad0319f2c3bff2b71205716aea676c62be25e337a6f752c1bd386daddb829c003b8d022ae93b31377cfa00ee0e4fb8881474ba3627f056b6e3527dea090ffa50a2503502164cec1060ba142c1067fa8f90c3a6a9f1418438fa9fd0a1fb1a5b914b11b93f0220641aee7eaee968a576809ffa9ba604625ede4672f2edca50f456d14d59b8810201b4640472c3953a48518c84693016467f9e7cf11df5bf6d10b3a6615586b5d2e748969685c25f802e4833b4fe891024517427bdd0b6b9db07320b72579adc9f409856ee8f6b1fe83d5b508a0221eb67ce2e3b47753149ea2e8b9809de4d3a35a46920f9ba80a55f690b9c662bd63ce5a844e956c85b5c873051d3ee944702c24405e73c9549eadb735806589967206bf5a04c63cda08377c7548cc1ef98b1f445f54e208df593e9c5cf02c4610293325be38db10eab91ffb167e5b384a9a57ac35906eca7347aef840fa6fbaff0db2a630cb64e0fb7b2e7f8a04fa340ec5ef86b006bf995b00e162003bee575e8089a2fdce5384e13741782cf89a65768b74a115598887eec0b05e28b7b77b9d5cbf3ac9ad4ea71dd45265a3dd52c66853813d53d158e8ded93b70492158741af1bbdd3639e1f558ae2d22e027957cad85ae6f58e888328cc0e1b3607a236f1966097295f2ec5e982777143e021972cc203f12d95fd3394a1f51fcb6b4896a4db02019f7ef04d7ea781c0248bdb36814dff52e3dce13f46315df3a53877e7f17761e5c24cfb6f2f0bd2420a7ceac6c4d5c7dfb137c7c91e68106d22b59b4c9372e5cdf4e73e3ac5afcc978cf2cdfb5e7b6e171e78a1478cf3ba27fcc28e2b3d527930b3fe3d8d2d407a8f20dc10dbc7a3f16025d85f98622999217dbc239fc91d47a7360dd8d18490e6df5a3d7238bb4cc94fe9e0da74c70d58939d921feb53756883695a675732757e2661b010f1801db8f1852bac91657b2c955a399876da3b331f049d2af40b95157b59420d1e581f60daa9f125be05bea0398b3a3745cc095b7fe25a868269bebecb149407a927d7bd9c93ff46e6e5060f92feab71984d7dca74e33d757affd9343441030274ff13d01dd9a9a72a6f3dd68a0ea9e1e528e34227bf1d01092098618c55145d7ff3e2c198ad0fb6e8d760cad808653f5537a1b705bcf5529febf8e057ce841f79ad60bf8fe4a5c9407ed32e2f420d4aa670bc9c7ccc4d329e907d2b5d0c3fe50ab27eedc38c7a69f90b3b3833f145f72e5de0628bc1446ffe043aa32502c4bf12bef80dcbabd304a50c5f34b11329d9059c74f4c1194dc43b931372e5478b1e67a3415d2f489f3c0ea92906fe8c44bc0a7c9188dfc94c1d0348fe45b03901007680b28513adc1ae09dabdae0fc4acbd7f53d9f13876197317bff7f19f0146c799f21ad327001dcf76627241fb6dc040647da1c02023d8800d2a8b1fc9b9bdcf7ab6faaeb5cbbd3a4d6aec45dce645f6a0dc074b0ca8ec007c838bf3093489c2740e872d5e19eff39a0a7e144c345a67381562243f7a2d1e5495cdd86ff2f1b27a05373838865fd4a1bd1f591fd83af1945cb8de41253808bb2c18cdbc76e8a5b24a36680867ebf616910ba010061271e4e1bf8d3bf5650625c4e63893634440bc9aa32b0524e73eeecc76c5307d4665c3f6b676687da575b33ee31a997c1c234e9dfb628ae7265d1df20f77b5a829c19b16ab9c11923cdfad2d79fdebca6988663ba1f7deb3c8a655c59ca1c9c786335aa56018c4bd365c4bd03857c14eec1f488e9420832ed7a9eab8a5f40f8fe418da34c071557eb67a11d9aefe6097463da17ce570570710b74f1c405364fc2ec648115133de88acdffcd46e6e656cabe66cdeba446e67a72027af5a8b05228c9f47967b06508e1b30f08695cbac56400692144e5a10ba144ccae9f9f23a0d8ab3d1b5aafe510bfa00000000000000008f2868020000000029ae80b59074f55569e89c76d71a899fba8aef14255fa5906854d1960cf3114dc77b29385871fd56dc42b0b3857ed69cc9c129a6c59da5859d1dee1269e7f128f24bda13633886ac6baea0af3161f1ab8b60bd04183f4bcfa3b29baf5fdc5686000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001174c4b2066b81e55f49b6e68fa6471c9139a6c9f90e27de700cbb3144e809a43dfcb9964f4a688767d8e8041d6cf3cea3864f9a41bf158608e1f7419c9d154c09cf863d589887776d133814e807dd3bcfbf7a0cfd0fd5a91a74f973a82622137f51c0c30e9983a028b8c0803f04d92c8b5c1d47ba8a2584606249e8fcc58d0c031bd89fbb8d294ba80b76bb0357dcce1143d1a1035118618e40d04b53a060a1250222fb43ad1d20749c7cdd46293aaba5f7590ceadbe13131fd131dcf6be604687a0b01226d57c8a0187da6d9d2f9cc9396b1e9b502346c4c537b8ff2d660df599b53611f54e73b786be4b8b94db35006fa1e64bdffa2c1f1bb7cb4e731c3751d4ecd03073cebdf9f5499b412e69a940b72549421e06a56ec47c7f7fb946feb458327d602232c33fa5eb621bac99bb4608aefb04947ff311da7dd4c3e7121357d931214a802175f432e70b1bd9afc3fa8efb3cb10dbfd717ceb37d50e7b376fab57ee74faa90215678c2b38f65bac87054e2c82de21a210b49649bd29a726c684c6ed8e526e27032c4dadf2cff1eab32c765b374a6118f09c7b77b162328dc6c20a5dcf7798e99f86ad400cc664f3ac890ecc940f5bb529317a462beb7e9ae89916b7fdc53ca311c1d4956120b4d14fedb31ae6de4e1c83b8f5d817c075e42e70631e9f98262ba685a959d77a907ce0d91cd486eedfc16028c0411f478479ad0bca2e77f6c53bb7fb2129a4ea301ac45eddd79f9307ed0d339098203c8aee09ee2a0c992b2e581ced9a8888e986eb0823ef877d72f7510947ecd245c5daf70f21c774ac3fadb57ea0ca74e78528dcbff42500b7b5bb656b318919fbf28880ae9137674cf4b45b231076e789d41398d7b4dfb685c41f7f696b97888fcee59db9ebaf7c736cc2a32e079b6ce6c21ba26b4f724ab56618292dceeaa1272e769c92ec8a34cbad00623f804ef5dbb863313dbf4f6311f7a05d849f50fdf2df4a9e806ca8b42e7ebf121c97b85164691a7afe13159f6e99fc85219de802748a932c9c4469ac62e2bf2d2a2b39ff7b38dec1514453a6bdba94be1614c9cbb650e980813c2cc24609ed64fa3f367ada3f696ea8703a2ffa62410ae546d34b0147ad5642aff6c71826c0902e17e9a63c64fa11ad56b39748992eedde2d5666775ab7918c2aa850b07d47467b70f179e515dfad6cbde9fb0df983b0ac896a250e92cf9ce11a89bd6eb1715299dc6a631ee68d8a418a89e9dc299f731593bd1634b7d940e13b5f5c47e2fc60d8e87024b818e8f6acaae0054c852baa83d4f83a010c161e25d4c6a164778f5d307b94a8741567752cf46730d1ca5fdd3c4d063be2ef4e9188a111847b50c258a28bc1b13fc29c6456fadc61bac4b66ff0b8858743f2dad4fab97375a29dcd9dbb760a7b78007d9d46587b58a08fb0dd68d6e5770537132956a6a2957de7b10415d9a41e10236df4a434cad0288e7bfa7ca737e8a0a3f469c7768e4fe8addc3e37138bd6489c623dc85cf1d2ec3f764e1c3a6188d1e09c3aa2e4bf186743ca43a6082bfac73f77c123cf01b1d81cda20692303342bb2caf300d2da5f4c288f125f62fa49f9c6ae149543b0bb0930c8501d9962c9d6dee411e5487011446b8d8b4db8e8c59c7a6875e2794bac9833486ded19ad49b843d218bf5f73061652ca1b158b7c41a0b4524b19d07dbfe366eea649189ed5663e8b638ae4d0ad09510dd0fda80844d1838d2391ea1bffd7e7f061ae2544b01315373ea49df80f5e0472d1b8dc2e20195850d16df084f15d4bb5ca3b3a92f46820ea96237a3fc28f6b3b86cf86359fdc511562a39cd5e393dcd2852cbfb81d3d0acf97b1cae8e8e639abcaf683137a69f5ac48b489ceadc6f79f816ca5c1e1b9717a09128bc98b34d682192c36c030265255d6f31387b0135c3b64438eda9aa8ae2424aadf21bafbed9f2fb384f5c313bba0543d23077dbec14d257963a1d6b18abd40b8a62da4ef34edaed6f11c9af56f738cb6ccbb225258f14bb5aad4287c4920c5bedd5132f569288974dfaaa3db8798b9c44a1ad3727943c21aa316075bbff13df3287241f56457a0d3889ef7cecbb6e2a584a53b008754a1d240de6502b40c557b90a639f04ed84d686d3662a1ee07b22575909751c4de9b3948cb383d92654356a5f8c324052a4f7201d9df43f3eca16016c35a5745b82b7c02ad9633d8c94b54a352cfce613a82af1efa9ad1db862493de507e3f1462a87fa137b9304a8a343dfc64d31276b6dc4b38f202ca4ee338fe8bc3e46627e6b002b57a0000000000000000996744040000000052e02cde95a3771762c72732c54a562f0388edba623b90be226d52f0680b02b9ce1e393f7cea3805ad3ebed7adaaca2278927003adcbdae356508ea4b9edf7232b2452b1aa49987d438c1ab1ab9c4843262eeac49cbb02af9882cc2292e381780000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058a9dbd97f750eb0ed74d41b9968d6bc0b07c032ef600295a04833a4180a6e954d2d4c2da4c61b791c66034473d8e42e9b35bf0fe67d7cf09ff9fd83f7eb9269a72378799f118b095ccc56046e77721e70938b1527481b85759545f75ea6a87df47e21f08e63f111c2126a4a1de0ad50e17fc90ec49d9b4adb7200ceefc24a710208a1ff77a171414a562d96a189b49b246b4632c23ecf562878bf06455bf5fb4d0229158af44883592c02a04a92c18f61e6ac64c704baaa863c3c549195871f33d30b044b7cef19398b8f3c2fd1af5b790c5d37af25d010bb6512daccca3abf81924f2e46de42576cee6f941c68c2b1731bd8442ea3732b3361f3b1afb7c4f9b357da0321489f0c35e033bbb70b070b83d560c99cba1447d70d2d1fa2eac0b289cadad3021d51d8167e4ba7ddfa0578946f50d26d6fd2369bfadb4ea3882c20dcea62c740030347ce43f13b3323043eb85e868f01d90c3928085b1acac3b034a1be8b584cfc0301ba9fe7540bc22574c57d0f48aeae3091cc868a571448dac7900d7da85f5df4022b65ec499d97a94105692f13fcc93d84380862e27df87a6ccefac2624bbd2ab2e2abdbdf85f8c6ed2ed7e342de6370b0c5b5e5bb8c93e60a20475dfb8798ada622234d5eabc9e718769500f02fe037bbb7d4aace630b126d96b7349e58e6f22403626cfcd6b815b943f2140555139be8d780e4d4dbe3c86a3c917adf7ef9084a1b5cc5e810743f122d9517377a520e4c3785ce90eef1d5752edcf1df733eb8716cb24883218c26c908a054178448367c182340b101e365c12c716c45a5e586b02bf70ad1ec47e0a862e5001cabd6d37c3658e2556cc35272a674c90a4fad3ad16c61a80868971c25c8a9e943a8030c782b3b844b8a5fe75326596ba3771c4e1e2b85e88132ffad3dea5189bc215ff9b897efdb8957e43e42f63ca021d3cc4f7dcafe71b2edde33ba155edfc854986b7b8a2d23747c7896051bc1d9823d51a699459ccfd5b2aaf74b6e23fa9f7ce50b531410e65fb8929c88b2903d904f0c419a750a3f7544dc9df83b6e8e66737588f2ae9ca6fecd73bc0644dad4956e4e2989e1e0853335c37c0929a2b7ab2415c0a1d4815abd43e35a1da89f07f10ff214ea1b5f39e13f2e1d9fdefd590c1e1167c607a764342583ffdec7610559cc2bb5951cb0cd5a665030b6e555ba79fd13c50f5904ea09772103eb7b43e24a70d722f48a4f08240315a5fc2bd1743a75c1f2d02e7a92545e287bd2e06193b717bea6ada1e3f6e6e88e9a6870c29c542a23344316e7d1bb5448d9d73de851f67826ae14281af4000dce7480203252e8e2b69dde7c2410d7185a636b7f267f78597708289a3175057e405797b56f7bdde3d403bfb259c886a6a426064769f30308fdb588b74eda59fe870875509c0aee6f786bacf1b565f6903bcafd144a20d3bdaf704fdfe097ccc7dfcc47f2846154c212db6b2f8813d168d57745d23ca20a611dc2c76be9d75af7ad356fe4a82b8884bea2f38695050d8aada6433dbc883d1c5939f67b1f2a37c6446433e0bea0555d78084927102b7dab4e3fdfb1e40f8cf4a516c04db1882cea82f81860ce4c7279d0145984fed6ea1e1ca47025b38c055ae27e57b56c886d380f4b7069b9da954ea5247330ff7039cbdd31fc7022aa9289ca4f48068e7316e5d2da8f1c40d96ff59c94a258c2086f4acca861565e5c60d0c93cd995de306ef08f39c4dc30532743ef9a3145eade4a1c6770d1f376d655d9a2894c690443712a0752bfa98390e835457efe1ce375dfd4e652c639be978911fcb5074fa4e494a7e4b9e2027fe059d5fe3b4f75696541ca607163523cca801d3c54e6c3013fe97779e16c4080d69ace4d69e3ebc7956688032c0fcff94a69ad47b5c546419098aa29799d8d32d8e504c66fef3f622c94c6d706d011c31df10753c82f7fc286e5bfc5d5692f4d4b05d3b21763d200f5d03e2c25194c966cd560220c2a62d3b410c7c36136ec22be095860c6e4fb7a24ef7a3dad281328ac2859374943ee837ae8420703713a8c89588500c288f443c0404742dbd3390ae3cb5c320eafdaa107419cf5e9376945777d8858b362f5100d495b7931cfca0fdd2cc2de4e71696737d3d98b0e7f70b618e15d778ebdbdc249b00a7f0196e5ee819a0e97e45f61ac1fd286a865e2a59c727cdc0eb6e5597748c406c55112f0c88e15465f1d854d33cf8c0aa26f6cebd73f8a9774c7bf0dbd008d273b55d91e888aab95ba5fe6c13c77322d8d1ac7993b0de13efc480e5f69ef566cdcff2e196fb68a44e50cd4f3e01fc5ce86b6dc39ee8445256a00df28e596d28cdfd64d5bfb9e993c84a52ae0e01c185f1e980701dd7b2f9d26470051f0addfa6135987b1f12ddd99c8cafcfc8708fdfd8aaa12383e1e5f8fc3b21ff70a", "6a65656a", 0, 1838507095, 0, "427c56f1d31900a4e9dbaf026890a104fe9e8a1d43c7f3198515a014caf9fb1f"], + ["030000807082c4030311afccd385c1c2f272ea2795d699946d85abd9136975d42e75d20737d8ced0ed0000000006ac655352ac6376b090c6183415b962e83112c3a6785a50e44d6d39f1c72e09e1acbcadc053f593d797550100000004005353acffffffffcb8f2967b93a61ffe940149a3326a33ee17fac982fe27f58c10baa68360de67502000000085251536a636a6a63faf4258f03402a7903000000000153bb58eb0100000000075165ac53516a53d3ef0b03000000000552656553acb687a8d8000000000100000000000000004fe7da020000000099c9379ba783b7e2a322d22c1ff7b3868856635b568380c8f3ddc8d67582032b131fbb5f7413eed36d2134d861a1c6f11a10bae098ffc69612f4fd9baa40a0a660d6a76ae7689dc130c313a190eae9d68681b5ba2c3a532e01f6ae938aae7ac100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae0a5005251546f14c47a253d8dcaf26394cb613151118309708ba8861185b9edd5d530023d770da05c0479df103faa5dea782b5e4175b2914a7e3915796c4992b8fdb0ce8f8c049989d4ba5a83a5385175bf3ccd0d8c2134efb9d6bdf7ba7437e7af93a7e559dc7f61bc80ad44cf9b4a469f5e0a8f1e8884bb341e088db867403261db07af4693da7f21c938cc46db338f4c95d4ff665e596c9a2627cee162d56021161a86867417002c022bd768ba7dfdd594e119f8236ad572b07330f99cfec9d0b0902929343a246027de837e0aea7d0e06d34bd914c4d365fbaf872bcfb342a66967babef39c6d0e7b5dd0507682c4caa81813b92775d241c364e740558b33c1d022819a87fc8629a49aa2ed63449813058aaa26a70672ffc9563e13e49165e0702022e48233da013faeec6395746b0c8ae5503f4895fd70b349962c3383aec49a8c8031e11828e63f3d8dc287344bb5cd171c76766418a7eef09b33be0790a1dd8d3a003005a2f104fd058acc631ac819f932cec86eb84b29b3e7a984a21c39cb233a33f030aa5f8d1ea5836d529eb4511bba38e26201bc302542777be02e991b80518b7567be660138f98fce5404248986a908c199adaeac13b24546336e7ee43c1c538a08cb388145251668a473d0d24e61ae45cf4a725030524c8af1fca02c3cd5fcd883bd9fe72843e70cc26fb8b5566116e0f97f4522996665bb3d0ac3ea8ddd6b85bc60085ec6cf4104ea7e7b64a4fbb9edcc4a6da8bc0dcc415e41829efb2d20fbff02c5f060eeafbe976918db426ebf1f9b4dde02ee2c518f4c05bb9136a66ee9a7742fb3cf7c3abf902c38211ee68e754a7d56e35f453df6745e59955dbf018307f63df111f5e02f28f9b64cb083ca732ddd3a94856f1eda073c908e412bbdad4742840276790fec007b798bb589dfd01d88876078787f425ed76db2a0c539a8de449e8fe5840cdfa14edca5aeee7456d81a4fbf9ab7ec0fe73e61a54d4934eb5634efa4aede85172c4f2faada9875ef7d0ee1d8a8946522a93c407239feaa275f1fb7c7fac0a41ef69f2fedae05daa66a6803999d1b5cf414673dd61e6ffce973cd25c621e8970e6b5007f15e8e7b5a00433dc2a577fd5a6e3295aa81483039295bdb29f59eab37a885e04f5fa344b7c687c79e4f0c68e75273973f7864f887f3fcef607b276e880dbbb3366388f0a2959833035bbd77f1011361e0b23484cdfb75f2a7e04efd9d6e506ffa8b9c1522b439dcacb048c781c0cc7939f223da9d2cb4363ae695958554af657ddafd43a649d969d8af4e97a4b6a0ec1f0904f21ddb7967268ffb3cc3fa7ecd0e846580a045099b25470f5fa3953dc911f02a88d41071832a102862c02f0f692ba2c2de988ebf85d3811f189baff5f2c94d325ebdf918c76211e80c9d45db9fa7af67f0a2624a91609f491f9288878f66fd6567d544b763b374756b0cd9077b1607cebf0b446a9f3af744b85e97612344163ec18fe477bd8c3d696b0ada897d0ef4674b8d026da0bea3df886243d982be15dce33fc15f1dd4d4bf298b8c195206125b4af28c6e7270b5f431350af2ceb20baf6862f60d0fbff2e1de78916d822391c7f10dd52b36373d3c26f60536cd6a5df50ac2d8c803a933d29615bffc81f6631927d24b2de1cbdfb42bfe48bf09630657e8192147bd3d74456181ed7489a2556066c858f698e390673392bb9ecfa998011ff75c064d378f7ba768d0a4fe12d657f09fa3173b0a4b153944600eeeeb81a9005e8892e7d2f9517ea2c16bc52e3663e9e18b459208419e57891c12e10d898abbfa7bec2c93ec2ff19cb60f49604f97d061b8875318ac8985d1b1d8c096f19b0ba6c67881e886ce1f672fdb2157a0d39cbec9a46cab10d80819cb9a8aa5963625ed4d5fb45ee402f6372c2eeec6288e8ee46f3a69b04ede21ded576c731dac53039cbcde8ad35204fca38ab1c05a2ce20a3c5f37c74b08fd8ced6bc775903e8d1994f35604a5422df37997918e851fa1f5749e4bf64454565e8728c6e0fcc03a768a421d3073fd05efbf074dd9ae0d417c033a695bfb70fb0a46ba08022a2b02323fbbcc2b3594985a0f69da4047d8c1ca2a3e8600cfe48c6da197890be3e8666295c05393d8a56986ec34448716c047193799a581ed3c053a42b99c3a6d9b55d68dce8fe2f98d79062695c30df25a622011d8d11964d71a41a674c2730c7db62d86daf888fb29f898aadb9ad19c26213c2c30f681d074d549c21bf08e6366cdac7b873e13dc032ea4e1e65d1becae47f630d96cd20fb948f824cd67535c0c4812329f8b117aa3b7020b412c967104ee38acf9c32bf164cbdcccb271e28f5aa4c188ab6a32d8277e30976a00313485fd730009186d269f31204ce1efc870b0c1d0720c82760b500a856cde0636d3ccd1b0d3a804", "ac", 0, -251925958, 0, "6523b4ae75d4f3546a214913a650b3b653a9d14d2edf4c0584a7604c10099182"], + ["030000807082c403041942fe2904cfc11ade9b5673d5aac9919e79e6454538aa79100a3030b5f3dbe20300000003635353ffffffff2dc60025d85f2897e1ec2861687c2cd9acec613aec44408c63d6795bbe20ed160000000001acffffffff1dc4e545034e38e6245e8976d69be94d143fd60066212699977ff851fa7a4a5d0200000006636352526352ffffffff92e45f8684be1d5a421d1e864ef51f3d3016770916edd2014784cdf4f9c605380000000000a4d77cec0411de08020000000000b0661e00000000000851006a650052ac658d53e3000000000004635265652f41a903000000000565526351531a4b0a750000000002e5ed8c010000000000000000000000009d10a3297c79ed4b467489c272c530cc708acef739feb2184fc90a28822782598dd062d9dc63b7b757df14186c328661628179eeccd051159e2903d624c15edff65f9a4ff57a6240ce487e87d5831ef315fe22cc01913b7cabe45e84495f5a8100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000678ea73f6b58e981bb19687c36be94b502bc83a60e5160a0bca15af2114d130f3f8434b4d0e3ede5c140f4af2a545cc5a2ed975db1597210034f02c3909c454eb99ed01b2ebc7529cb3b4b9864f2b1781de7b7bd207f8b97a726abfe278e59ebfc3b34539117dc75b6ba4ee71ff62efca0030595d36a248127fa30faac4d8460030a4fa80e1bbb8fce28bcceed13d21047e0c3d162c3a7d924e0b749dca20432ac030763dd72020717affe6657bc5ce7f3115ac0ebffda861e787aadc4b4e5728cdf0b0870f0331fc0582750415679409d30daafbbbb3cf5dc320bd665e09066673e9404ed356daa229cca8820c1d958f7d55a47ae880dc2621c9c197d29e562ef15ed021e5ff720b2b69403ba8da3affda68b3f6aecc8a8c8aae36c75f982cbb30c6a7a021e07532fb72d66dd99cb8152f5d806ef63fb8de8ea3b63ac948643eca37d0c600305bcaa4360297214453d099129794956c24ff7199cb95669e35bd701c0359b0a0206587be8f1b5770477d31884af3f5e32f816d71b86f9e21afbff50acbc0401d2021f4328b3fbe9eec7d0573674ee470e8fd82eaefcc2c69370bd3c4d3ce8188c5d62609d6b7c892d0d0441f905eacb275dc15ef000ff32724da43400ee042752ce854f8db87bd6790743c3d644a2df48c4230865de1292f4d666d4223901ef4fe4501875dcbe119969b262104c29c35806af99497c1b480405d5308bae9dbd450de6529ad06e826c0fac4e15464a4669258516e6dac979433f79e5c972c83d1c2d2eb503bbfbd2094544dce83ba38e304b245057b176529434510d3d1a3651c234b51738c7b27232d50ebafb5e28a23f8863ec12aae7d2a916eabe2fde35fdef524f2636856e18df865b13a03d1a5af984c8520f82ca05bb764038527c1cbd3d495f7a75ec0292a6a65ef8f6fc5122aa38cd87aec474cd04d8af177cfc03acf202d9e8c5742adb56348d2723aad2c71316f348098fcdc01c5d008ca35096318cec1058c19736935fcca1f666e17516ea252e871187a4e25461e7d21cf7ade1124a1cd6954b1a466538e237aa1286bc2310e6f468012d822e5aebd0522ce08b9242576f40874619d77152b3e11c364e9c8d4c7b7d99aa38692acbd6f2dc8d9a76f0378978cbe5b55b6ad112439cc0ccb814c085ed7256de0b5c8e599c988ed915d75d78cd8a309a4c7f151ec008eb6db7ee1226bf4a91ce7875f89a919fcdef5c0e33370c295c483e47a10e9bbee9230af9e11f8b53209c03386e307ec5f3f09560394ab8d2b97b9e5d5155bce5b3e490c161e9a75bd427afb378b4703096dbe5e4685f8b3e6919478dc7cbe8b06a22c7acfcebdd46c388491b1d04d5dc5420413c9137ceee0650c4a482653bfcacdf38648c19b4f12961c49f4cfcf888ce94c0460f9f6978e11aa99ea4487c390060421ab389aa6462d92182f78c149594a2acd1d66752a86ee3feb473986f9b9be5e793f99065048c8df7f927e0d7cefc95ac5a0dac07cda77d7ea260de606860b2671f6fd7e8fad66ebe6f682932489cdf084bed74e71da157c64f35173b3ae60b1df56cc26b1d05761929ec0302bedb5c4f01ab21be90a7f5d161d9d95810fdedaced3363b8e8717d1bdecb30f4ddf76d23b12a3b040fb0309ba2892a8d1ec4bac9d83d8529582e2377e0314537f79971fc7a6d38b33dddd93a16e6bd0b04f24b90d4cf3c78f143ca528b6cfc7f22c4161fb62c79ce9dac1cd9c091990b4fb2da872a7e3b4c45575d75c62b3fe47d51ae38a800ff8acc47731676ebe9ea49a375eb2a3cbb319a1246d811b0b5907e2189dc73523dbb3c1277177fa5a00d3745d4bbcb40c7c40f76f49a04333ebb5e83b18b9be99d1cd3840ae0e19360935bbd610dc2328c34f47e6e8f186c6140cba6cc14ae54233f0343cd42ffea09d563b7802beee570db0c569d19778371a0a26c6b3a43ae387c4a3011a8b1a4a9463a71d4cc0e7509d6bede4157e28ca8e25978da9246c5d33cb7ab0221b407f8c1f4f57bed39c556eade97e2875aa7cc754315386652664744be15394c670fa6877c2da958ca592b7de1a8b1cbb9ceb935436b7369d9cf5c1046169b4ca6e445868a82541e63d3ffd30cc24fcd225b21f250bb29620eccabf3834ed27859abf78b29a4d8c00d8ac554fbbe0678ef78f579e8c950b10a585f20d5d8a44765ad903fb99ed06a521acee439a4172dee9d4c2ac3f9ab6482af48a1afb6b969e8800f11fc92e529de9cfd824d02ba17d4763f16d6c5c183c743b629267a2ebf3f904d93a9e7e6d99106620000000000000000ef6aa60400000000af1298e56718edb17caa8f7b525950de97cfb253da976bf55ca6dd1716e6e553eafeb8456fcdf8a8a8fdc8f40d619d2010c25472360bb3fc21aaf1d44094c789190a4c34879cba7e05c9d2fc3e25c79a2e93e2c4ed165157ad4838daa8fe8628000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007754a3f26f8c71e423cf2a6481432aea7aa201889a262b6990d66170460c22b3f17c0ee4c3db68ebcd8ad0fff6b35c27104d9ac47f823ae5b230f6f03aba7ecaf476a10bfb0e88b9af413271a0a91c38adc3dd4c010af68a39129d8179a9e219185d0c4ad1fcc29e62b4eb9d4b770854151d8c2d452121dfb1a2beb40f1994290301d85b5b1e3297c59d0fefe51f5c97a283299c9d16278ccf9c9213874dc0cce2022d5807a588531e396242232497e323c17120e851e8b61ef1da0ddcf432e9a2390b01cbb6eea020e40c54fa65b4dfdc4360b95b26ffefd7ce9fdad6d6476ab2347925cbe694d0803cb0ae8d66e2ed55c276139edd905b2731e5a24077ab4d9e664c020927e6114348fcf1b4c132f4a1d5e772a1c544c5aaf819819a0b01d3ad6f58680216a71aa9a9fcbeb5e7a853379e29e29c9df4220e46f7481a45236c0c8176306e020a1d75a7d6c8d95da6469bd2f9be983fb3fa0e3a02ed47de67fd4e19e7e24ea4022c2377521f0b05f8fdb7cfef0f4096ccba0b755368b187c9e2747634dc309c1002195a3a700ef2be9742c25a715f551d6b7f26ea00a68b4f3604f3bfba4519736319721cfa153c3eae121025b732a145683766356250fdd0d8bfd19e1c513c30d6237d13f6a192cf9f3c3e50156c18e24d183997b8f6bb66d6a9f4546699ad42899e44048d002dddadf0cf7f82c71736f24e0f1523ab9383f8015bb405dddbe74c84f0d2e66fc51fa29432f77cd54e67c82fdb5c82b3e478738edd1cdbcf4b52e91eefda4f294939c8b4f2006921e072bea6bb4e1477ab0e6274012397c2313db36b2e99971020022c73df2e93170230e4c27e4fbe2897fe45f46431f45805f29b449cb71baea946ed16aec0ef7561e26bc888064ab5148f3762ea91e35751cb11caa8e39fbf7841a445524485b1c38e5a10bc04bb32006bbed40500d60ea146d9268d57a17f958a4845504acacdb0201efd3c5dbc8ab247f9cf54ed3648125b642819184e5dbff14d3353ee4b6178d781c6a853526552d3ce3dc5d9f0506481794589b9b89fb4c3167f554dcec35f0fcac58e0986fc0731a67c7502ab4bef85d400f5541d40e245a02c2fe826cc1a0cf28d56efb312f1dd1c6835e7514b923dd5373b22b06ed6790337042bf371cac0cb3766fd1a08954d7fa90469e7a93cf40066e1f4221f1ef0b23fd3cddb2abafb632694ce31384dd9b847f744ec80528a2e076a9ad434aa99a79adf8752cded5c74245745f465d3720150f73e9018dd291366166b87bee89dad4d1c1d650cce9647475154ea0a197b5d2199e251002cf72205b7de81e7656a4ef33374eaccab091507f9a7a31c6c42f653046a00cf814d81304fb6496b84fdd3c0a2ae42031d75a13f4efe8d6fc25f2484bdcb530bdd1accdc7a5bf8e8eea87a2af8de36127fbfd297ad67d1d4bdc65963b4054fea162c2d423145d44b1320ba41c94874e5700fc84417b7e6137a5abbb0957d3c93bf41ba727572ceb822e2a5b516e37ec94425b62591e7f05f5e3f66326a59cf453471535f350d0196e0d409c2844d4489801479b7d6ccc39a074ed69dff6683ed6951d712fba3b27ec4d4a72d844a42902ed6666295d71316ece7974d469383b824c62da68cb8d8644934d7bbdbbf1d14af83ab24a8d91ca41babfc4272c91dee720003e8d56627f3968db355096b6e9a888dbd8bc83d1e45f8352c4b580518d4d245cce1c4ec2f8916c25ac45e206f5f859e8194a73c004ea24d299156d32e129573b4a578baef8bb191876c72e3e85828707ff052bb5193344737d7c7c3eaeb66b3e5886bed96c8624fea658a63d03651087ccd68f1761e5e138f76e9ba7fdc0d1a4b97d55a58d2e1d6de08a89a871060139d3870c597b1d6f786904dc79bd310979840d8254945f7d7d06d0ae73205773bf6500b93d8a8ddc710d4618a1d8386cee33682759311952f1eaad81bb7e15bd973472d16d1b2ed00f1e6f6635fe94a597de4f81d729aa8bc41fe296d0b1eee02c7e7318df27fa9c812e191a25327dcf935ac55fbb8d6f3a3fe56355c6022af295676c023a998211e600d015e7eb4a3c7523c92ac04dc7e0f542cd2c818fe6100b65d5040000de7195cb02bb908d7c7e81be7fbf3bd3080754c1adbd2c5c981c59937597e2cb240472174cd358956838b08bc5cd9af2bf38609e1a097442391e4070dac10aeae9453c43fe64a32337ddb5d31d7601ec4815b8a7fce1126e468b33538ea2615a8e6ef59f8b7c4816d01fb87f541b16858bb84a028d3e44031d239db746327ebe8cc0658055586951a44aca410727287ab000848e18e9b487f5a8a00fb21758e222745e288cb41cae7b0b620559a369e0bdd775cc0cb978ec5fd3ade4296f160d5e735c1d446be1fd97a695079100531b658201e11248a908945cd95350b", "6565ac6a6363", 1, -173165032, 0, "03cbead52f219765a74b1a0dec1a4de550a73a509297a95a335a51079e99ef66"], + ["9a816e2b0474812c6e0bb3a4bb11021f7fbf306c7a25a622a000945142eecff0327bf7a7aa0300000001533e26fe385c0dd2d78c32f1dd3096bb3318d77c859600e10f971878c870d102c9bdb298400300000000ffffffffe1ba8d5d8d62dbbec3ea9938378c1bc5bf07f7dca25efda1a3c02db876ba883900000000086a006a00535200ac7638608ab7d1383ac0b3ba749ab7686d35634f55ddc71c235ca0a1e1f92b6dfaee33a0b7010000000651ac5252656aa9686b560419db29020000000001001d833004000000000763ac53ac526500110b3a03000000000165c9135f000000000008536aac006a6a65510000000002000000000000000042c85200000000006e516a52f62bc87737528f5d2212cb69c68cbde856c63f901576e99ff85c41062fecc19f51e679662e6bb4eb658f4f5a0e8f1b01d75f998d8ac8fb55bd2693e0b0a21a63279846273c8795d02ce8084379eb3b1c22d55955813937bc540af549000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002317e200a582c3901c126937e9e880d01f19dd819bca7406013d20a6f94b3e581cbbfcc7129dcdd63b0eea8e2624e136f72e5c2ee4b88dbe591364253490d8973c54b5378b72630a432f3fb8f936108911b6692b7f93d84e3173b2ba2b9414852c2dddb1bb97009ee8dd881694efc40cc8da6c8c56c8cb26a3fd663534ae0aed030d4699cf9de9a1d6bd1cad403f35e57d5df799e97474bc4ca07d2ad530bb2f9802048351dacf1126ffc0fb39a3486e073e4aa29d8c76c22a401006fc47933f640e0b024c735fc52a93a8ff987d99fdaa927db716ec9401d65ee4e53e279b322faee60dcef2ddc23a4579f35bb3c9ec713927fac7d07bcf9a1b58a3642cb4cc8f6fe302207150adffbc930825ff801e6e8cf7e629e1268594233cceddaadcba0f0c9ce90302c1430eff13829e07cadfc65f8ea02d1545ec3408cf022737aa6510565973300221ce2bee6c128b6e2077fa807a271a0fd5f90fe7e79a70e1b61f4bbcbbda55bc0329534d1d89cdb6d3a7b648dae8b41de06d695975d2ae85734bdc46e03e6b59b70319011476964cc0cfb3ab5c798e5d61be8f72a2789f63052cdee24d38d6b11caad761a8ad1327237a9670091c0529e71727cbb132374113ff5583a3f9a1108d16b8490fd71968289290f4438ce81a257990eba970f05b872d725c4808519e493fe6d75e350a720788d1c9df2b266c845c6c38fefb598506d93926178fb3bc7898dec267e5cc23837dd1deca754bd381a034939ebcd850485cc6f1ac47fcc3db09e293d5e503919d8d0d917136cb19657b77b826f10e70505d660e2ffffa5b03954f154914673adfc2621f2f41decc585ce9b7e5b0a873682cded8f32d1ab89552b751b7d8843c40de64cd036b602ed385366f341b86aa6a5a520b8df7bd0ed525e433707d7d91ccfbc0faa6c11998c60d7e0b1a1acd00aadf9a4d1c21c49ffa2267424f1b77ec27e7536428a289a16ba448f899f23e1a2e0ca38fb4354d8515e8ba31d77346e230c3bf27fe31afb569d6cf1f931f60b33106148b1ad8ffe36d7ae4446c76697e45dd58e9b99b8dd3fec8c41f088f2b399dfca3a1d05de88b21d30c3c51437e93307815ecfbb5306b343840b12963f4fd1bbf8cd75115b326a1b7b62ffee88dd93be70a7d88fa63b10fd8e52b7564e2cd76cef3cef6c94ce093a2a05aed6284f0e65e7f6fd4b2ebd4e94c107ceeaabdd0846a4f445e6ae86b8a4b289a6ea1b480848b35ea5c009b74ce1af7134fd535269ee4072d54ed1a3f22d6b044d1002532ac201ac8a20f84e5f6ab0c00034f41fdc9f173530d797bdd38395e168cb13361433512c11e03900421be057a97c318b0173aa4a049da3506348ff51564b20b8efecfa6676248414f9e24a8c8b544110441ef6d2db5fb45989d7016005085c6e51170cd132db01f04d270a9d78b1e739c543f5c725a85c5f73d587a211eee41e06031eda9cb1f92232bc949ce6af30d8c33b7813ebc13d7f79e576198b1a038e02a1c93852a43a3e9ad96dfca6bda5b0de72994fb4ff781d44c05ab5aaea05092d687f795e38cc016e55a280cde38f490cba9cd0343a9c17bd2a2f06cb37f357acd27af06c73b3397bdf705aff9cdefa51f49248ea1709a69d33954401977d3a5c0e174a34cff22640ad946b6ac23e6c898ba0324336f2f35d3b46cba4bae141f387ffa4b9cd4ebfe0611886e2593248fe6421e301f818f923819b98a449ff594222d1d23554f79a023dbd1961c7ffa24e8a04470e2c2b449bbc2b14d51093f806f78ab792498f9d3f48b5a3c1d2ae5f126175246c69a53f216273b904cfd35c455873c1fec8c02c74673980ba679c901959ee6c1c9c62da1e11e20b8e07e56b9ec58b7c4559236de2cbc0df545292a647c8cfbd3beaeec1e33036ead56cec0dc1a8f3e23d15c12adae0021534700562737cf75d3192811a807367d6f800dc148d4d2d9aafbc377a6ffba9e88c2c0d1a2185d81f1b7e855a6c9976ad87da8fcdb08184e5acd601741d1c9cbf8633f73ef1ba61eb51bab087603b8d4a69e93842a785bf1dfab76a89e0dcbed97383474c658d9c19e1b1d10a14850da34502a2cc7ef3de4640e26e1de33cfcba3b98e48bf1c70031bf21f2297053783ed384ae84f011dd301493a880352d09994ab479e89c7de84b1d9599f72097e888c1e885331c1a5b5fd979f44b800f46048bac3be82f171959eaa645cf357a82d12403b6b30779cfd5aea929b22cbb5f586ce4df09e7b9c819dbb2f6b901fcbee848f7e4e0be17a6f5b0eb0007466fc1456000000000000000074715a0400000000c7d8c353e029073c8d19d03f780a005425d717d03d09dadf8e8d5b4970ae7cc025a85752149352c6e8eb298d5cd45c8042fbad34a97f59587287581cbb81d0cc5d53a3afa91eaf375917dee97c7b3dbaca8183c6f5b1fc0f84a6fc116e43bf7500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d4cf884265026d4a139cf6b06e5b1d9586a024aae7d5d9b5c8308cde390b45dd6d3801c51018ce32495095e9b9f629fae366a20ce84ca24b766e135bf992977b6039a35f81eb4b5033f5b23d37df4e7c0bd05eef398dcf579733671fe013a927cefd52f12d47aa8f01e9a51c47b5bf4b95f6e5e868148b8a888e3bd541c2d26f021e9b36bd0d3f00af9beeb2a55cf18e507267dacdd4ee7ae21e6df54564fa4133031b6e6463daff57232bc7f0d8e82fab8c5f27c3115f0adeea30a35ca461bad5ff0a01046d647e79e8338e1b6bd4ecc21cedfc9519e56fa207586051ef2b721cbe3a34125e12d74b2eb511cd515199a306853da8b1e23510d1c366ea2cad5daaa90b03226e61ef78b512d378124f8a629d0e536ec152a1cb0a7ee9bce52757f561389e0307a6c454b8640214c255e85b835380299ec7d33ed9039cb23a9443c7cd82fd1603112267a4ccd5cb2a9508e409f6cd340c7c9611a2fba1446d4b3d4b748cbb0658022192904708145ccd47937070e45e5dd137aeee708d3376ad3cd5a5e08896fee6021114525b778dd5c5a7a490bb53d51183771aaa4c7928cb311bd2d591b6689701361edf8586b43e110319c716cc5fd6d80797c974134e42a6ffbd2d5848b831d19d4761f9b97e76603a1cd0a7ac547c7327ef9b36352d695a82f7facb145ac6a512459741c2e711136d48cd41ff981f83dcb6117b2d04e29f3818257682df136991e8092f886b0993d4abac46d2a6f16ba85e227f7bcb8d0b98dc374575bb3bdfe134edfbdb6dc96eba7d6752dec64ede2ab93c51d5b7827d13a8d6f1e7c4f3eb54e8a39ff4000b9a479aaa26e657c32194a6ea5c9acab4e9cf648933bf45023e998be1564358e3bfbd201268ee1c64222f38248fe432046a0ad52d11134175d39411d9e89540dfc087612fa5368d1d260404cd1516a07944c7fe19b3cfaa53ae41a1f310952b00d3f8607351170b60e91d2949a421c2da6c2b588108192c768eab456178206b00e3e5df5495dcccca05920602a1ee628853f9971b0ec4ec6e510a76745c6a2a03f8090f2398bd8d84a282a2c22106b9c937ff1b4e673625b1ff8b219e5e176d69cf71071c2623ba9ecfab2e1001e6600d1ca8416522cba2fc21cd5dd62b58abbdbcd223bd522eb5a2e2d9629d3b7ed6646aa674ba285e4eae528bdccaf4404e3fad48df808db5e949a6b8e6a265c3246732bd9f0696947d1146edc1bc27323f66b13091713d680f597af21dafce1d9754df65b0a31cb64dcbfabb291c0fa63ac0ba2b47ad884d36d9dffd2f9aaa10d8f3cd17bd2bc885f3184035b0078c22fb53595d2f06d826ff4713fdd2cb7ecd190a4e3a7807dcb949f84f1ec4249ab3e002197d25df11b6e5d776a300ad11a90fbbfaced62f5372d1a6a7041c573541f51de5510f3609ffcbcb6bfba3dc8130c69a37e510ee411861a7e8c8f2f7fd0c5a875b02b524398d65c0b6c6e4373df30a3789080f5d11a853bde7201f6bc07908d8e2ac5e6f54d30ee3141fbe7bbe7ec185f6d7e3cc6fc02cc280b698f545c7f132217882a97c473629006a4aa6496f2dbaf40d8751383f3d6e748d5f4015fc9f5d8d35d03d0c0e99891c08fe4bc75d8df07ae4ec8a8512f0213527c94b5616222852dbcb5b4b2e150f600748a8d8b75742ccc30a06c69b01b6fd5165f0dd7dbc3e150476644bab46c89cd0745688a3b1a6ab17b9fe824aeb5a316c1b06aaee6b0fc9da73595b5c0ffaf93e3807da35158fbc0de5b8eb8c49577ad43a08075c713555ab2d0e9ff9128c36a21bfb7ef30c545340dba62479abcf96fe748096b4f39493c261eddeeced312e54717b639d7cfba675fe5a82f2c1dbe5adac6aa47ee6f62ae7390b51198e501a26a5fe9ff7f833cba21e72c182c6af6b903a418a31b7c037ae7b68ca6b5955624002a1796471b87d92c7930640cde9e4b0731418c6df8936c26bc10d992cbce66a733a1e5c3678875c5aa322918607bcbd57f330e944af5324f0303afc7699b659525c7eba20aa91635c2c3a0f7bfaa10b91edfd4ac631cebb0a37215a9ee1bfbefdd6c7c713ac148402436b44412fa3e21b4a7b9aee5ea726afcc75a2fd823417e5a4f3332796668299fd3379d964e0643720ca1a52f59884961b3f169692d93b0ec57c983f83adb7390fe4d02f53438679cd2c1531bc2813a58f7349210e1a405cf91c3fb231690daca3ba087123db4fdda21e7ed8f664fd02ca9331255d9682d0538104200bb2b14aca99dfa53d257e2f68fb04719d66bca9c48544e33c24e0f03d1ebd7d36010ca5e226005c2ad8a99973a582d2a32ecd130881ca7991de8fd04644746a77ee2254d15c1873950e43b76be498cbad9768eed40673999a25a5ac360cf313b7786c13097d1740708120b4d20ced8d72174f91932d088855944806", "656aac006551535153", 3, 1275578156, 1537743641, "12cb988927e33164666f24494d5afb7456d37d3a9f6ebcbde339081e8a74bd24"], + ["030000807082c4030491635eb9137c3a686402ec888ea338d475fb9f5c4825304d77508f7982ed7e9b030000000153ffffffff1cf4a33c87d93dcd32d50b4a9bd5b8a770753c5c0f0c499c4eb081c1ea8ffa14020000000151ffffffff4dbc9d09ba03ce5dc4a5fb496295849e99f14b8fbe91e08d20be9cd57cdaa7bc010000000951ac655363ac655253ffffffff08c523155287d8208bacf26a4f4027e95542996007a3980d160ed08764775aa4030000000400530052d38fd0a30374dbd1020000000005ac65ac00633cfd6503000000000900ac525263ac65535226dd4505000000000651520051536365ddc30600000000023c065a02000000000000000000000000ec6959f53b210f357f400477abcc1a57c24c1bfc9267f2fd74a00d9ef476be9901500a292d043500a9ccab2988eda5f01090f166b061421a414136d18d8c8438bcbfdb2b3492b5457280852355d210466d293777ab36c399c9c5db3dea0a075700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e7d55ea8f39b565f6af34753cf989f5cdb30ee3dbeff857296b9b2935eaf00ffa1c7645319854be62f35e88a22817cf23bbc2634c1f3071e321598a333a3d7eb59df8c22edbd37be2fe5a6811460098d38db9ea9694c89e1540939ac56f6736a44a070b81f2a39242c60255747e54a15050c5f100e0ff31153e95530b5f50388032ef429ac4a77b16650087b82d125bb9dd5980356d1fbf72aaf679e6949e9def5032b1d7b49435972d27a7f005d0b3b33c3908da917d48f6807bd3a071a1f1d06f00a0335e08941fe31ed29c16bdd0e346f8ce9cd3a3188d7b95bfe778f596e67fe1f83ac7a8538c76e01d4076cd48ade0d4cdbe89fcc8cf72fa20e3499bc68e98cf9031d2c3bec87b9cc8c5ada02fc4911baf35336c25dec067de71b83e28db95895d703194a7afc591c98fc6b49bdd96ac12d952792eb5fb7c4387a9b7feaefca7eee61031c29fc87c1abcd8194bf4d45d9d4533233a6f0739f171f843881d4a54efdaab00217cbe054ddd5369c901e4d8cd07ab962f94a38c19c898a6f4bc51bf8be4fda6c02120db275535ab52c87a5e341bcdf2f5cecb0fc43e8b3297945bce32de8c8acd3119e77d81e3eba0655b0583eb5bac21fcca72e2f4d19f2995aee666451a3163bb45d08cde530d5b81053a5405d35d1be08de3cb616e16e1831a3be6eef7ba3b80936de457d39de7000a18d65826a28b1441afd410702e07f275363507226735257258a908f02b9a184c4809c08541b3bb3b44c5406618f5cf6375aa4f8306ec50248f23551c552e2a30fb5486b3d17852f9bc773d42f5583122dfc7727266e296b7c542f557a3eb5a2b1225e6fbe4bab9bc76da63703905bc66dfaea986be51de59832a5cde33d5330f72068d11120dd151c96a3ef6f54e86137e8d5ff774726ca3b0dad26e33b94bf99ffca5f3ed92fc417970cffa4efda54638014983ade75e746d18f97d5f0055c040d4cc511499d0a74bf140767211de7c98779a7584a283dd27b63a359ed273f1d47139029f02affd1afa12f03c4b79ddee2bc39fe112e38b597fc7b3fce4c47552cfadd41c6a4f8deb1f40a58a41423054dca5f84e6cf71589a0cbb2572e11c74b5ce609ca11bf501bf5b3f94dc71485733a0fddeb32981e39aaf47c68074e1dd07bdfb51df39ebe0c31b81b189e5cbe195e15ae9da97c6ce253e8baa5ec5cca86f5f917b1c117996690a127de2f6ab3c85ac13adedb930ab71455016f47738a716484342e41f2ac4cb859754b19b68f870a60f68a8955815cfa2ac337e1ab6f747ac7b4d60d9a0bdbb34d9bbc182018f1b574ab798a399cac7064c93709629e4d1e43c48e42288ba58995d2ee3c2266331a78c7a1d61483abbf9876f12a10f034b0b45e0f11a1cb6ba328d773e5e8023efc6be2b4439c36d99d8b6d405c92e30fc8fb59b74c2dc473ec91b28269089ff4783aa4660da8e59b2688bb13e94bb71ada53cf8ce9c07a802a5201d04e62e8d3780991f2b387f657382c7c513057de7a041c6678a1b0568565c963c9c7a9df4351d742718fe91c3773f5c9c0760892ffbddaa53324a1a5669b0107ca0112030772a432170f0bc1b25017cd32346ffbec068f013bc7a31a52b56a02c5e2f8724308ecda69739142f3e1f8932fa451acdaeef5769f5a9d2901c8613a41d37f0cf248cbbbf468f8a5d3c4527d888312db0eeeb8c4199ce074a775b2ba0198c0486cbda0f6994ff68c5988a3c77a7305e80fc495134f95c03be7d783f57e93b4bdfb35c404b385e67f9473571e409f50ddc0ceaed8fd74dbd0d77ac4afd689f023246fa766b5f07e912f29a9c361a4c55a4cb49917b3da6d5d4a8a174125702ecca15f3efba7397ecbc3b2fb31dcfb5fbde75a6cfd7ea81dbf708ccf54cf8baca37bbe725181f9227818d2e1423a961e57a6205eba5a4921e9eca3e1975a5ac2a14d5f672a266e3db8bc589baffecbc076eaaff9fde391ff23d79608772607feaa9a18e1a2d0f8e81a77389560c5d73e6750db3be4a661e3b92365bf28bc303b67a4c3476b773daa014d4e16b4cdfaeae326f3806e18bd828a852c562ecb5bcd4e6ff22394b0669b30878f4dabae261d80cfe8b8d3410c22e6c395536935197fee47d1945b0b97ac76dca3d26e487223fc21c8021f18ae29ed93713899999d744cd98e19ad179d1af791e1f4ceb6232a5c040ca885b4ad145b4b6d4e7908f8457a2265ec945153f9d7aa335e4fde0cf15ced296bc7e2da74c184aa3b2ea03886aae6095fc3e3981344e9a4c24aef44cf87c426767d050d329687e7631030000000000000000000000005263f00f6600d006961dba0301bd1e1dd563865c1651a4fcc1b40bb376c110d728eb4b202bf2e062f43e9d76d0a5f87a79428bfa93da80a4d0188160d6085efc74286b21ff676754d3ef1a2be7bbf1dcf48705bee7e80290a29deb7bda23a1a100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000310857caa3dbf90d83d6ee42fe938cecc5b239be7d965666a9bad346b2e4948e8c5c918c8103c656f7971779907aed1aad7aa98926db4200a75fecc2ae25f1563608c88dc1ee51ae1f98376485b217d70ad501d10bafa81d43ec29ed222cfb2d7527783f47cb06033b4bc79e6ce06046ba4fae190f8cc2c1b6d93ac2b4c3ddac020f4df3dddad032a52b6ccee0e2931e896b008f4215b15d9063f144ef6189adcb020b87a9480a78e5f7f7a58abde16e0aba203ea7853afff87afb271d2ea6e301410b079a456b99de344c76b029727b4780bbde260568205400ca7cec50b61e7d2d566aa2c372b29701ef361d398f52bc661e2b6b37219d8d482c4a5fe80793c7b4c602230e146bbb293e26e6ccf7df4433ff0dede9d2538c0edee9647f12091b8c5f4a0219f33ba001830ddc2ab4a40afef1aef6938002af9f319458d61cc5bd588bad14021cd9f13f5aea1558c47ceb4fff9318c3dd9e5b42f19a382b2ad25012a31bdf6203036126524a142322bd0a03e31c92453e6dc5dc2d69cafa285eb3152f624c3bd8032ccfbf4e8b8eecbff4cfedec83c51abc000d782ec108d86c2e65ef5dd9848d07e206a8c3a9c5f7e0694b23de923b19c84b2c351b00a63693d26ff7707eb5bfc0c478b5beb8fe0f848f800352be080f69e1e7f38bb876d9651d158cf97808b81987271f5f99cb73a1d83e7b0c7d92ed3a650e77c5c0569b2e33e4d64f010f400a2bfc9ba9d59d6541a07ade31360e5b2302d5fbf9b462a58bcae466dc4739bc7ecfc947fcde7dc00eeae3183a448c9f8c8e0af3cf7da24eb7e857bf6f5f0df01a4b2c92bcae7b101d5d1b3903881106be493e46f597128ce1cc1eeb5785410582b8baf856f1a769c90a32f4949af1a32313decab9e8049f1802b5342c07ee89ba8aa2af2687321fe31cb5d77e26fb8a36416f859fea69d4b26b50eb94d52be900b92b08ef29d7fd15d729bcefcf928f41400fd0dec9e3aeaefef7787c7b240ac4362558a330863e0bd853d5954f49de97ddf60a3203db748085ddcef36e486173f8004029012581d402a23fad618e83ff0ce3761dc0f29edb1ff4f849efb447b04d78f99468260fe4c5642b6055fee3cf66615fe646151e16102a2178d35a2333c99187d280b57da8553d2fc88dcc766b451590a30277e7ece2b7338c43cd407755da3dc084fb73294bb8b7386117e1bf35927d3cf06cf3ac12cef231436996770b99ca1c3d2badaac064969bc47661c092f1bf5ff1acc5117c74b0a77ce647c20eee16d1633065f278f5c2f4489df9f9f6ebb73f00e87866273905336c9fce30a37e77e9c16324d6d88cc66bcf210192fc2676272817a5cb8b72047f63a725ce5acb2819d96e563850c84b1b64c7c5c33e96e39eea014df5d41d90986ba29d5f789d9dddd21c5a7d55f340028fe18cb1b413bf23e6f1a22e7d58bfbdd118dbd775f6da3e41e90f992d124c87a57383259d7f40fe6e1c09c762d31fa8afc06a565b6a46a183595cb4884e5376d5f7ad0c3d50b2250ad4b781ef71098fabb5118e409b98bb7496541915b698b6ca540bfe910f81df8482d9d21b15491560bbca852ba12b967d61698f4ee63be3011d864ba513767a1cf3f79568ab35511711facb37863c8486a4ce6468f7a559cf3e54f59d6daf7769dfb2cca24b64491acf0bfd51d0542913fd832578d60e4c64c16c425332b49c993c236029d0975237babf805d3f2a9462cc517fb55c3638a05ac53b20bc500f8efeb41caf27a9af66e2b4bc40b5ab22b3ed7cc90caada1966234a1b58ed2213069c7e3406e38df03847587c3ef2ae002bdb235bdcb939a0b4504adeba5b2a231810f3032abc09e13af62106e064caf368b50bc4e104135727c4eab963ccf3805097983d493790f40a0ee4e76317d82d7ffa1d1af9337c7c538bca7d44ef93d4378a9234373cb7ef21fa85be3b1d648c7fe35c93ca7c99e6ab4db6ae79efcf03ac7506b2c50c2b66732780e706e0ac06ee1b902cbb117ec851341ce9f664b7de674f6eedcb6882799c7d0644829dea99c035bff008f655b75b5bb2a0c37c077f333394731473e9bd41839bff9f64145b6d3aee323fb3681a9c25c7f8c8206cad392aa07db238a00808f4297bea2b8897c0a79915692cc9c2212cf6f3f6a4f8de6c0c58dc276969b6254e94ca2558978ddbb511be0165540bb56c24a1de0ab2c0de8fe83861a5f07060042aa3e8e485a8e02b305597f3bf09a8cb64c98b1d78393875c4396173e196444c13e868d101eb26d3fb28c902b34b24b9daaa4c4b3c9d6bdd90ee621c168c8304882abf32f07f16e160526aec4e6bccc36d552f18bca2ac614c9a9d49f096263226677e928b29eafaafb20b59d3e0793b1e3326dfb5e2d5122a852d15c3f893a7a3524d98e9c0d792c4209ae532e972388320b003", "51", 2, -1884610699, 1537743641, "94e2abf3153f4d9dfc4ac8f36a6044780c25625839b3e0abcbabb2a111c370eb"], + ["fadba90e01d0427100c9270135ca139ca1ba4d404f6459ca83e59a132bb836433b34b751090200000002ac51ffffffff0370cd2200000000000163623b2401000000000863656a510053516a471bc5010000000008650051526352005100000000010000000000000000e863330200000000b1704611a66f406637f5773506911e95ab45095ea97db6a032fd1c609acb8a44d0883e61795854da3533d80dd2530e54b2bd724d1c6dd415b6e680c8d4f8e716ea47ebd9367a2877bbb272992900995596c527e06ae40dfc27739a83ae9c72d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001510ef05fb1491ee051d0bda3c64123b9e85e65d0b3c9e9e71991a6777aea2bb93534c2acb2319b5f008bd709f0356bda6222f26991baa755bfcbed9c31252b99648ca715948faff3bc77ab066526973b7f372034768f9611f84c307c8b772c14b3a1d2a4bb31a482f63267ddb5f98a044bd7724d1f831e4d62c1bf74d15d43403043f890e4cc7f17936a101c5b48cafbbdb12653502577e19f14ad163c325e4b8031791cdd34fa88ace397e04511cb3a2b644edc95d3b37ead6821c4ee201d6783f0a02d15bc3c5ee18be7aee72e15cae3a69e15fe5ca486bcd4da42a0a4362596f76ce3885cdb08bf0ae4357b984584dceb14178bd8d9b51cfe3ae17cb8f52ce99cc022ef4ab7d0bf7a82533d830be9779f5d96b57669948b1bd43150d96e39824ed19021ba9a67f47ac92253fa83a978e683a3803d991c81994f9318f580310287bf6e40210265476d7c2d6fbaa7393225f64b8dd85989d896a9c4f26a2e4205df083f0890224277a0f9402282e28bb13ca552ecf600f997c814713b624eb2c48d4b45d291d02182d72119a5d8e25c9855b7cdf8c83524e1807388bc3749823d413b3dc87d6c370036158cc1cf4875b66848058415b44eff08702946d28af4041331fc14a4a3a4d1b2c9df80151db59f23c36d0eaaa81874ccc88ff2d7fe0591e272c314b5a99b89b3e572e290c9833e931d36f01cba25a096356590be3524f4fb4fb7f23977b5b4a7a65ce69b0269bec36821c546a4843fa886c5a270e7da28f9440a454c5d8b8d7ea1ed08a09f4ea581d7fe0f9e2b1ca0354f4473df67f9b956691a08854fc35decd4d9ccb7ac6e61b67766f1299f6520416ef4c0c7862da4745b65bdbc97524b5b8bcf8bcb69c3e4fb146b6dbc066a3584bcf47872d4b736659813c5edee1909ffc76f27bc046b11f6fb38a474a936be2fb9d5b6f55067d15cbfe04db683668fad14f52916641488b6ad6108b549334f478fb703d729afe21f5b78d37ab33b02868b4cef6d04ea2c4d93fcb3721b608bcb81df9efcefad170919fd6afba04ef575d7e918c87e1d253652a375153184321a94838e0de8bf7802eba95e2eed44c3c0a5cd683f21813b3520ad07d8bb1ab9c50cdaf89ccff20a242913f75ffb987864d6e80bdc4ce4fbabde48a0c00899bc2f485499c9f01eb3cc31d08736de6333c3bf4b4e99dcd74a454cc75fb8162c003276ad7421e2b22d820f952c59d34caeb0f66a4b6dc3800af1882f35ff7b1a77ca50b7dfabbd8120a04b85cfd886f0f91174576acf69cb46dc53e8c9b4d392ddebf2e03e462862f3b91d99d72ac76069fbbbca531bfdc06477f89418c7a4fb5e8e32808beab4110b7bd02984d0addf2efdf7f6621415a808b2b06f9f6f913939c60dbb7752d37269063f6e9642ad0260c60683c81a97c624015c81196c76b5b028c1bfd130f139bedb3da058547a80b2e098e4e1ecb312b278219365ed52b4fe456c7422baf2eb4b8b0458d1c71ddb359ee087fa793e76dc7a2babeb9b65b36b3b1b8d11dfa5b16954a8649f04aa4f352aaf5ca05de9f4dc17cf84c318e8bd1cb4f7b86d423420c81c7f36c3414b6e83be23651e893527b71b242a7d1e629b3741100887e212f71a22c7f51c3271b19ea1c31d31703dfd093cd6ee99ebae9823653581bfa1ae68d69178f5d80ce850987477682a3d8208c74bd1dc94b5434027e48c530765d5186b44541cce387347926494f063fcc875364f7aa7564b39bbfd7352550182eed757afb3f8b901556f3f65f5f5e3dd833b66ebd73165e5a4aa4e30a2ea4f70a8f20acbf792f4bdb67050be2561e3a39aa21406cf41cbf0dc40de822260e7c533d7170c9cf2e5b09b70e1546a105bdcf7c8a8859e17a2cd778543500c627a0ce6d91fcff16336ce3c64a603b5df3ea83a28d9f71ece6231ceb6117829300dd8b88c71274ce18260734c48acc301150a13249c2bdd5baad26dec2b85aa18f522fb5ca8b53d69140f44c1043ae163602d04d6195c2e17af24dced4b3533df6714920be81f19bb35d1c3241d9adaab45008fd93823c934ae832325025dc214d4cc5ec47ba71e9beed0f034169674ea66ac234c5fad216e326bfc4f0a24be3aff899e94994cfd55565922ddb2ba33a1bc94731af46619a3b962832d230794a2471c5cccbd6abc0b41dbd4b43435b1d3f3626d1a8e1f2c14db1bf6803436e5a193c0c7c5138e635c3f12139e8c5c414d46090efddf68b582b9fdc91092f3a7438bb5759f2d656adc4fb57f76db857fefb22f685083682e09900493821f028c69e4c2c5d5f1d13a39981ccaab841600af83049c87773909948209e131e420430916c47c723264293b8a67136d97d37b42b060a255b541576ebf7c9ee2942e9cdae582aa0d1e6f8e89807376444492a4b2e0a2a14f4d4264b45302789940f", "6a530053ac656353", 0, -1761066051, 1537743641, "c73f9c8a0a6ba3964fd0f8e828aee8493edeeaa7791fe131e30972c66c1eeefb"], + ["6b4d0f4e0272290bfbc468e371a9ab2220392cb972c312e3bd199e7f5647ba3198eb68a9c80100000002516a921afe9af0e1615995aa8ae6c61310ddb0d451b4c4992c7562ad14ed67a20ca43d8f62280000000005536351006affffffff01ebaae303000000000700ac51ac0065530000000001a3807b0400000000000000000000000015be29a8c6ee467e8087b93bbd8bb32c1332085a25cdf4b522f60ed453340c92408f064eb8a0ae00d22061e3650268f65c03cbee234b1f0f348535f34bf65e5504b54957dfd9b69d7aff047d2046b1d8bd5739b7c0036689353f83d5e7faa9a300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab22c1469bd9f67add3930deeb4b285feb8b62c5960cc7f314947d798c871c06d9f5775d94753eeb4f2934109326982b94e8279a83c6b8c41183ef7a4cd47ab03cdf1110d5423e592c08be519a9ee36f0fe1e45ecce72090ca1338681ab31da61a75437d4c2389866d61137b6ef489abd630fe4b871520d32995618493078a2b020ec59d84b7775c408683bc45226dbc775a6c54291782deec9a3bf9e8039f8d790201723bccb9f7fe81e935f282ec0348f42bca9bd20adc5929462d31f445300a1f0a01eed8fd6d5d38f2a32589de950beacf4a252a607e29aefbdcc1d2b0ed2d86d84307281350325a93275d2d1df1624fc2b4391baa45dedc9ecbdcfd65c72920da022412defcf8326e8460a84972cd332ef5cc7687cc012244a2fd6fabcbcd7477e2030f8084e24bcd4cb998320bdec3efa40da596600c9c4aa96f71802fed4441cae7022478ca00054728d27df3b6c61420c6d9836b6570a7365880abc2ade8c149e180021db1a888698b2a807e37abdb53c92868d796a6c44254dd051b3f217fd9bb2657031b4dc2246c56290dcfe4bfae2c341264cbfde91fe28602173062c3852175eb43bb1161f62f510f90f2273a6d887e4c82853b0c0b1182810c8dc15b7a8ea394f1ebd9f6b294b5a6c8f0fa59772f11dc4aac305f311d4b9c842107930e1289ebcae4d6a11073a411aa28b6453902f34c22d8576c47af4896a0a45ce5a36514c9f9cea7d6ff386b63e97e1c70805dd82fd0af3d5fc60eb6931e26d6c5f48007778425cf7b810a9c5eda6a0658a3ef3437adb5b9c205c01c5b22422653683f8e4505084502344ce26d82ce7ba2cd1b270007638ac06dcfd411f38ebed27e7ce5e24c6c1d3502ead525d8c9e84c9c6ac4fe5f3db5138ab684524e9bc30a48d24037c3ea514dea27f05614eb56c5c221609b0e1efb7cda1d5332496d2f062beff0f8f045fa6119726ea76c54180d730af70ea935e0543cfcfc94b4f4646e693f210dce40059d009ef6f0ae1d8d2e02b3ba43543aca922959acb39d2cb2e101b5e006eb437f62ac90c0bf51816c331f46a2fce6124de4ceca6a1f1cabbc53dd7d3ab35dccd95fd1334634f189c53e0b19e15d63735031623ece876e43d314609a1a0a705f4ace366524af33ac67ffa021eb67bc9f92f977349f76e9b698573377dc845b9b62bf587f4ea87c9d20d3b4617d27d802055f1b0fbe4689ddb419dd8a1a86f0ffca9c3c8809b4b24c3bc482d6f4c9d546c303bbe3d72919a6224d6f43fe949e77ae2e7963fff2e40932f0f5f890fa256a438e7c3da4fe1167d33da21db97130126ed7b31dca209e9b7252d14cafe1b4fe6f0cbb762c1d7d7cc50f670c2c47a4992351ef32f6e55fc280b413003c72a764591c92fe17095893521bb77af35d4098bd7ee7349c854a4e2a2bd6af1653d38408bac28a206d3a8ba8667d877d95a6c5dbb8521e8e9cf17ab7fe36ebee5b71c53a88c824b8e09792e23f143f87411c5d6e331898190b7278f8d70adec7522698668b27e7f26406e405575dacaa07fd0515e6d575fc5a8a4659b51ed72f5fdacf807daba1a4e2a4dbba4925c4a4e9c9525ed468c6dd1cc01dea730f6f0db59070e0c6c60d865d1ef5a105e221b7c475a4afacbfb3ed6d80f24f5e18357265f9cbf70518c5ccb8ee7376e66c6e7bae9c75fd51e0dd9b7eafde0276b19d91cf46cf786b6bdf19cf21089947b63f4b0d64046214160a59e3cd6ab747407ba4a4dae42e1b3f6941a701e68df527b11ecb736bce926ab742f198b21e04358ac164243731d67dee2c0a02d96f866c52a5b6e0131196cf197f2a4ce0c734b3a403ca30ff1dd26496e06dd9bdca38f16a403fa1667f207e90ba960a426f339133dc56ce6a5c074a0e8cca54f3b2da200c7e3f610f9f0a0cdfaa557f54212c375cf8943bdf4f82e95a63a9565a1f383821972cb99fc267f31aa09f95d2baf588c2f764404f4b4a4eafaf4e1189089a1bd63e407428c88de1495d6a715dda867eac5f4fe933de97e5b488962c9a6af92c0660ce12a8d4d2ecae39f35de06041da1a735e192802e49b5889a2c14b0d6d86f1eb241f8f7caab927faca73fc818e4b57a019baf6f942d52aca00366073a4a307a14d952d89151cf1f40d5075e69430fa516b68bd189962412fc4e388c63320fa38a5419035151498e13ec87f5060954aadfae03a511535ad315b63161673cfa3d7978e27733fe3d4b7a2fb641818e26068bc4b08d4c7eeaf1e5077f12d2c3a801c01ff4dd30812cd38d89d5b1bacc6d13f2300b45c67f90726bc370e63a4b6f61c4e004529f93d9a08a6c05ef4d04b799e572cb322e2829ea63f887d984430ddda5435f32e4cd6546cd29f8ba8de4efb169b743ebb7b22dcf01fa6890bc8993bdffedd028b6bdd72efdfe5e9056c5c651adae08302", "5253656563", 0, -2125964044, 0, "8299ff2ac40693b922f5771ee5ebdbb6e7c154939dac4688bf4ef567f59b96dd"], + ["bb02d53f0439a61c4db6ed60bbc0ad99a5ddd33b0cb7229c124b03b960afd2404b59e205ee01000000016a9ed7a42a08f5772939cec9f061cca28aa6a43240fb75371a8dccc7a1ccae24a908ad91cf010000000600ac636a53acffffffff5db973b61883594148cc7e2be1ca8a97493509a95525b73141c99af4f3efbda003000000065363006a5352ffffffffbed6fe02183fb064275b9c6a01a90a00e9b7ae35478857a07bc048e6bbcc8750030000000752ac5352635363ffffffff04e942bb01000000000100e54a3b050000000005ac520063513f9a4305000000000851536a52535200515b5821000000000001650000000000", "6300", 1, -1143824940, 1537743641, "a0b44c2e32c62ee51abf0b32bc5bd10133f05e33f4edbdf6cc76676bbab049b0"], + ["31d5eb4003c2a184cef99442e04e6dffaf0d1fa46052ec9757f8a481d74663913b9d7fa5770200000006005252656a631b3942f2a2c4e8fba743e3fe3c3fcf865baf5301972d9c0d51e57dbf91f83c8080b8d6df00000000046aac0052ffffffff4844d4c50d769341499bbe26e37d261938d006120dade1b0f4298ac93244ef530200000003ac52acffffffff01dd286c040000000003ac63ac424ab98c00", "6a65ac526a525153", 2, -1226198225, 1537743641, "cff2af9f9e87b462560aa8f51f874ecd0f04e52dd7a1b5d736c41cd305f8ddae"], + ["be6e051b02a836e6e06a9432995c214edb435f8b7845165e9f287b0daf10c3720aa8dd0997030000000863526a6352650065ffffffff55361f8fbee1106161125a2a815d50972823a06a006cc4bcf2f42e99b57418b600000000085353535200636563ffffffff03eb7a5702000000000752510065ac655258205d000000000009536300635100ac6a63fd9adb0200000000000000000003f5269204000000000000000000000000f10c095497d56e9a43b34a30c3d61897645e3ee4191974fbbaca4d7ee20039f7087c5479b08f5dcf2525deffabd131bab7be331d67c2ed4fb3bc61cc1523616c64059f54a1cc74e3c895014885b7f417f53bdf4f8d5ac3775533c3ea7b00943d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e4d40693480ed2f06758a02a96255a12cbc4a45e276099dce976f51e0d5d9409bca81ca1421b64f846ac645dbf08fb2369490eb7566912e51c20ce21ff0fdb144b2da0b14ae66d9c08be95753b757d7c6102e0578e568ea2ae8fcb3c6ff4568c137a0fc9bb3fc4bb3c0d2f29b3ca2805a73d5b513924911f9e6922524b4c0b3022923545af4dc990efddaf192e33254c0c9b21a154664b7c40a9c389895b89c180207d1f6c32f758e19ffe563930a9d25013f78af5c0dc2d41a1d3c7b98b16e29be0b0054787edb75c868274d2883f2e62af587025c10f719a931efcb21df84e8109c2cbeef8f05583b0b9ccd9021929bddfd049a78392b015d8779d7114d9316f3d1030efaa043bcd818a00a4944c8cebef5166588ac7096bb23b43f153e4c7f3edc0b03212dda993b6e2a5bf513715dae946edacb0897514940788e68f3aa2124df5f620326d55817d8002d02a53634bafc2d223d4dd90b8e9583aeb71ea035235f950c9203045a03d393764927f978085e1fd178b6cb3f52518914eee38a46a0d3ed544d75032aae928f3774997bc1e0617c717239f6f394e892b9b9ca533722ed80026b475c77d9d4c19c9782e3370089434458cbec222897a3041e9b697e6971775858c5356aa49b9f4ec97df51d9178c9377a1ac79d3fe0b63acc3f87c3c3a9612256470321364f8a5125d183cf957eb2ae661cccfb3dd3b3bbb6f34a2c2518bc1bbacc7c048853d95ca83dd3ece292354fd9092c179b5a23132e0109115464487d0fe87216c09e720dc2d0e5ddfa3cd67c3733281caf2558dcd8ce32862f33436334b6dbd7a4d00eb9cbb12283e408ff43fb49d8b40a1533b64f0ae67c296d68c9505c639389119e277c99155b1770a2c95cc8d9b8b83e02167df2150472b9123b9093252e82beffa381eb34483ac5f841d7907a8f45e7f7530e62c3bf3ce315d93686f85a3c5a9086fbde2962339f143e031944b58da54014f9b9cce4a07e65de1b6db6e86bfc1fafd7779d885abab9b73367051faa4a75735b90ed453aa8818bbd57169fc8495fa2f79f4e0c029b30ebbfc1d6d30c3f5d261dae617b38facd919b28ae69af5bb826bddb14928523c3d09368cc38bc7835121914ec7ad25716e5f9a1d08c905cc8745d67e92af76978756339697fe1ab68095a5deb1593d39cf91182f24af0e7f6432ae9393a1124f370ecf95e5618da8fc9bfb49f0b4c6b905c31643a8a54754746a91a08ed61a0b49628e1d9d8b5f679040e36bc4db03becb6f01f83eaca0634cd3733fd5081ae38774970f404f92f365f8de964cef12ffe9aecab17882e76463eeee4351bc08921573e54b8abb291a81eb04ad88227ae88e59fc0f533c9a6e8070fe254daf00c77a4c272e24c0caa39efa97469bb9c7cbcc2dffc78ae887cc64c616298c5cd32c303d8422386ef9863afd3b78dac95d09d219b8f1ab2883a502d2b97a9d95b89608bcce291fb4f10dfa97db54a550d277292770736ef1379ffac6864a3a834729ca8a403ac9a9e8b4c676eb3459a0f710d22ce30e0dee7e56d0e47962a7e0b02d2a20a0b0326d576289d21e8a0abe7667b1cc991dc2b77cb8feb1af1715a7d2c64cd0e9d6f41ee94e8b771b94c388568c5f094dd6abe2971f7ac953a63ffd8004b76a9485d7693c7900d23ffd41d69d89a831e54c361cf5599ab5dbef3833356ac14402e6407f1d0584c3c56265328f949ac00582e5a205ca259ecc062f34b728175f882c30b4d53405a2a4b7ace871489d4a6f610aaaa8308606717d6c4b4469b15056e30ae0eb37d68be61fe573f37a5b8c95167839455b0e49e6eb1e59d39871c45b83ad86286b8e0105a98515d8a567ca67025ebfc7374d6cf67677ab2de7254d7030dca952854eb426a7586ea14e158f75714b01a6fb5f94cc48db88161ee460247ce4662fafc8ac9df983fdb959f2af7582bd0e719d288cc471248edcf20ed353b0abbe20993ceed6cda580f3d489ab5792f599f99980d6bab75b51699fe212e12ffa2cf3e139335aca65342230ac4fc2cbfdb4ed2e41c7f8f54ad152ff770ba6e670d2258f06ddac957fa1af5a64a348a5337576972291237bc1f52b0fbf4d8c554c7b4136a0237490f20eb6cefe1775184ee401ea03def83d7598f7180adb2ce8f9eb4d9e5b2898731cb0a9bbd5d7c059eac1f4a35e3ba40eeea0c247b5d958fcd0ddf4a2f38884bd43be30f160fd77face6ac264db2a10c235b1b161cd498ff08675fa1f7edd9ff07c28fe52dc43883c7941d57f33c170e00cfcc46d54bbc14f3041bb067c203000000000000000000000000ee3856af8331c0b27298c9f644197984b6656fcf661bf00beda6d13622bc67e509daefd8d9b45ed78fed06a9a93c699b9f1d18d359851d22a5d89f97a53d37175269702d2c8113d0360723c3a0224dbe39d9a7f56dc32631b235ccd0f70902bd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075be71d76d1d1fc56e900fb3c6625f79eaa01c4500be6ddfde7999f9e8654b679788110003db460417fbc5f13b3ad111337d06da61f152abe3e9194129e77c1218c5556624c5bc1ef081769641c2a4d0f60fa926186b32b8929550035188daccc70202aedfdda0b3703482c1648c44244f1c208f916e5cd3d95e5cd082b6294b021719cf097d890d328d5d10f160ad9823f871e44a622b53e02f5f7c922bc43bed02201a94f29995e748f783ce676405e43061b305e4a738bf4472dc0bd0ff80c1b40b02baa60f7d4d380aebac06d8766e877c9ef62bb86503314ebb19b22b4015c5033acb3937b9e46e1438265377e11db1e058f323886d5318546a5600d283a237f502230d48eb8483ba58c9ee5c846d2f60a7ccddf00055b19a3c7b7ca943002e526a03132a9f91dcf1769e6cc9796976eb59463f99a05a0103a58ac4d7b771a7a1a8520207ba2fe18b3aa21a40f214a07323fe7b6b14274b6a65590aa2c0777a75bc7520020200d2fe11fcb3b751e27aa77e1e14db725a54ffa4df750eb53be035b4f9f736031e5b8d258754a0b2ad96a68646415763bca29aae06ff0e9c8caeb1517b788e22f9c37c93ff7c50513d2469afad7dd6d85baafe9d0a97813e42669369f7a7077fc1573ff40bdc86d2f59fb1221aa0b145dbfc9719f062a06c25922e3cc805faa4cb5e61afeaedb8e0d9414fc7b925084d6e3bf2ca3f93a6ab67ac3d26383a2c62da3d123bd6d30969528da1d69656553e05432177f0adba484f6d0e750babdfa908569808fbf100b85b0afda0a88620d829d1284778f5f4320c2439d8ff2b33bce8fb714e98a3eeebbf11de8283b24f3c90bde9c8862f5ed65145693fd2c7370851acae91ac03d2099f1e9eeb8f0beded549f6072d1570fafd7f32924c0b629f5b952e6ff328db76d987df5fe1217e2c74e8f405c41383d0d6805d1c23594be8bcef148a50394bce0bb3eadbbaca197e1fd8eec19b61f361daceb4cecc987ba6be7434c6d5e1d2e848a37296779236d9a03e9f95204a923c241ca10efa1667726ee5180866c58de59ed75db3775844c4a354123358e3f8481159c22fe7fb7a223493673d0ee52b86e5264df1add893ace289d4fc8cde539e9b96a9aee86c54e1d3f269feed4afb089ddbbea9842ab4efce7b23b296e545ae34d2e7668f0cb8d90e6876d62bd58c2434dfa652769c4c2fec3f38280816ad465cd96dd857e59d15591a7612a3f2e08bed011ed1cec547d612b109d286996dfbd7e7fb1b8fdebeef041151361c4bcd6c2eebaecb567cecee87569c9013c0fac558f17a624fdbde6dc3723951180148af5c0c2e860fa60bfd53e0c7054f9cf07bc40b01bf1832378db9cbbacd2cf38449e19206f25eaf9979506b088102253408cb381bc1c915cf61dc6eb183d0c2a779e00bd33c24d1e26b4aa21f7922ab538d481297104550bb6cd96cc711e54abe68551bbfbd78b5fa6334fd3e378ed6ba26e877b5005bb26f95c64f7fcca93420bbce0ad347b6579e1fefaafd79f6a3a97639a5065d1de337ff3e9a2db12d0f4fdf2b1f11d64bf22bd62629022d8724f34c48c6b4853e001adea563d3361fefb813ecb6631cb55b2687028b0a113141d6f56ca563eb865935c617b26b279a72f8bc4f01e65458853dcb27d05a1ba3a3db1e11b19ee17628383533a3fcf526a4f4ec542b741523946e52163a1cfaf5c705b1e40bb2834638e1a2d85c20ca1c6254d3cf8007f302d9b470199e64220a6b9a4b45da8411ad98bfa324db51ed508fb639de82190366fcef345f14eb31695ca09795279478eb02fb6aaf0c207e86e5b6073ec28794aa0a0d06d9e704d79783ff54a4d16e1504bb7b3915b529368864f06b9dabb7f5e5b350e12a0c5d1f40bd9df02c563d418283b3766946c85f353c3b00b448368ae1c8f2dd63723b696304648de5f41fd240f6a0977fc3c5eb63b018c55c4df58096921afbd193a5bbf5e0d6fac1842c056bfb0707d9651f7371d3323cc3b3be5669d1aefded4bd5af3d552d9d14e1efe3eccf6c3f807841f3459cd926b1bd5ba865302ab67e8b8cf6af5075be87e0120d480e4b606502675603fec0830e9e44ecfe1872e1f008f647ebe251820fe609c1aa35ca832b1c29c63179b3293dd51478db45ee7e8fe63d53a5cc010ba68a456f88c872a5a8d1a14eeee4d771c8994c036f80739e20043df26f7ac129b49829218cdfe7a752c8988efb2473704b48b877e2b72ff75991fee6c86daa95c29dac7a321bf457a389033766a0dacbdb35dd5c9bb3db8f5f495b5e38e00000000000000000000000000153da45872ebc866b8d3726fed19bc473d63e9f58efbf809c0311f1d9ccadb339d6993183aecb23b29130bdf14b03f44d26790c972ef8be3440a60a2dd14e33904f505cb2c95a59ca80cb4ce704fec8cbfabe5a465838be9ae112af6fe304442000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008169149ea0f42e108075b6a9c56a4b24a4930449ab3bf41e1754f5ddd8e2cde049a8b22fa33713d5db114b7cdd62f7f024326d27803abcc5c5d1d90eca8bdf88662ba4675f3e49a8a789a9e0f6f4ab1532003da727a0a95ff1dcfd7435c3e4ceca892789fe4741e83b0f9c50c7bc2a5ca65419e2d2aafb3ce77c260f6ac474e2022fd35db8932806ec2dfec03a96c0f2c3622e9ce53b3f8809a90c3436d6080f430219733232a2439477c8672d209a48ffa3524c9bff80c5a8ef6f8404fb02eaf81b0a072c9f4306607574cde3fd496f73c9b50140a74f8d5620ae497ce340d0d882b314aa7c1b36b15af03baa702e2b6aeea284f7c98e038efda6b9512663187b42a10211500d928130e50bc97a099ba60e57ef783f0c3c3710ec2b02f2790a8b4e7f600321c0930910fc4a1ede640ae122cbb4848a71a00267175d1c58f16478c820e9370321014f98763ddbe41ff7bcb727a1c5ae01d33dc62994be140eecfbb81146053b031cca234c4654fba6359c4602521ca5a7bd518b89ea094339db53947b50321d4402098dc8e208f63fd16b3111e5b892ebbbee816e637b618f4d1940a77536835500241c91499f978be0e83e8a538a572d280b2431eee389260aa70daa26790679548aab42b6c17807a3326081c5523dd1574fc8a6708fe9ff5966236a320629a8fa82741182807c10b57441236b278ac95624cb545e89c515f5f0159e22aaa407f4b86ad2572f2d04b683c0aa13360d620f5ce6b4b3e661f444f442fd7b1bc8f205ed2b697bf80ab3bbe45aa369dd01ee361980a4294fc92e338abe65f6b99c349d9ff27d202301410eb9d214f1806b71dbda1fe4906fb3ec378447ef3abf83950919fd075f79199dd9097752f9195df746ac91c2243f84cba746d653423f92ab13e79cbaa0f891978615d631717137f1926d4fe9f44089ef9ea45ab2482e46f12d316e8ab3a17eaac1847e0aeb093d98cf28ffb94128de71fc73d9f136a1c93ac5ae38777b594306066db832f57dd065c46300519292c3acfc190e38467c3e23e61e59ec765ebf0c2c68e33cb841e8cf929ec477218b12ac1cbd2ddbab97436fa4a160fd6b46898ce80b1224a0c9dd40064a7c07db65107d3a65f62eaae5e2a0b7b7e7203dc70c0a7e81285e7abb0edb599ef77103b855525927cfbfe683d9eeb5cedf004a7931dfe029cf1e66cfd0b7775286e88e13f5218cd5debd2fc95827d21951189caddd28d6a0aaddff382049567d6d487f3619bc68cc79fd4dd9fb7914080b03ce16729133f5329e3d90ff377f87622ae00696c1cf3a43b372e2ecd332de3227787a82a1a008ed3b02580119ee90befeeef9a797ea2f710934f4b68c8069c7d19a2f155d731f12b34066b4439a0ee09157dfa318809c91c577afa77e476a7bcfe0fccdb0e864487970dbecfb855222a9bcdff693514ed22a414f16838032d2492d93222bd06c1c541ae4aedad919a63531e05e0eee377adf22cb304f1b6cd96651f6039e9fc89762607e69610a05a2e8c7404eda5e464d15666b2d99807ecddd7c819104509bd5271eb79b14fbd12b0cdbdd50a48a2239dd926872d0da3781a4fe7721ee962e438afd388e6111200266d93cdec94143cf036d1243ce1d3c9901b4ce2d8e2189560c125113308ac1defa0fd62e586b89787869aa3afaf5beb02d8cd08e3548cb6db197ad31cfeafe25351de62de0d270eeba3ca001ba0ef09e9be9c6ce9944869bf988df3b85a25c0fc180d0911e0faa296d92cfd3a8a9030221a82646f2b2d15ef3410ffe9a8b95f436546b1d150d9df446d95700da7d71153c68ef3cb96ed7d41f0b54e9a9d9c3dd5017018f50429a38195a5390a90e8b36cc546db726ac642431779a2cb6dfc14e7981ed3095cbc1ac1f41beaa02afa3e026a5e2d673f7a1cf4021c81b7878cc362e1b4369eb31dd776d870e7b3c218a7d72d85ae04d4fdbab6657d243538ea0a22f78339fd86b9a873bde8695fdf6769fd8fc0177dbce6d2ecfc06596f4d0a392975f708423f0e20db8f6e24cc12b5a065d2f38b59b134d1877e3ce39ade35caf4a15e5623cd44d4eadf34eb44a74f35eaa347abc400e07ba2d29e415b0e952f68bf6c9577a273d5cbe37a42fc3da3dadce056aff0091a3b8db015e16803719eef02d1acc3dfdeaa8cc4af72956d827c5ed6aa47e4ca45bf7c77ea98cc878b1948e81336cee0db8ce641c7de111e81bfcb8f194849f9eb1b6b4c16425d57874bb45b61fe20d0e33e3f918d89b3c344c3fb0be2e56463672f503c1807f6161033d765f6917f6b1d606bfe8be992c8f53c5baf0764ed9b81b133d575ca8f8fc58312a7f5d922ac1fea6d9a3d7cc3a6af37e6884b269af32d2c0355127b27a14f0963e48242aaa2b5a94959da29a02985492a3aa3a376d2d74a71e374c0ddd6cb608", "ac52635200526a65", 0, -1466349462, 0, "6a7d36f736acaf9484ad73f6fedc84981d404acb5a20249c0dae77d1d2a92e08"], + ["a80c6e02029df34c9188d0a390a3f5b679adeae6ad66e724f1d9db953be175755e63ab090d0300000000ffffffffd0b987931681345ea000b705eab572e03f7834be1843e59dbb3f1f2e4a89b68c03000000025163e096e88b011f46cf0400000000076353526a535300cd05f9f400", "ac6a5151", 1, 173198409, 0, "e11d93fb1733d477305f0f491ea52db85b2ffa1589187aeec030e22b107ad099"], + ["85f0937302c4657eee97d40ac38d18e631cd42ec3392b36709ef992be0a40c163c4dac6a24010000000263532d5975a409c4627894c34266988f27234cc748d22b19c0ba4a1d8d601c2ae28c8948a60c0000000008ac006a5252535253284ef8230129d598050000000001ac4cf8728103a4a4110100000000000000000000000092100efbc62d6491a4cbddce80420776ed4371dbf31189bc97ad1dd1290f3b29775baa3db0d8345ee8e884db38ea02994cf87b95b9f8a507081c85d39e58e13dd878e8ab3a1f16952fa2c4ea97d110ba63371f38270d4ac9f6b1d2a14d9f53aa000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e9f98119fe57e7b1b14859ce238224544934f6e8360d38f1b8f29615415c7db7aff72bb0701b8b7e9fcfecb52bdb98eb774942af208e43a3e1de0ab32bfc97dc5438554acdc5cebdfb3b1cf006e4ce73a4d615c1d57e406beb23983b0eeaf1554125fd743cb2164b4a7155e3359da0d846ba2a76af9a75b09c46a02a9d2bb3b0230632e22a0a995aec5428904f7da9e295dba4bc5144671ccf52a4777ca97cf11021930ffbe56069c02b91232e8e3dfb5e2d9d9e30860ed574513c7c36dee9c72dd0a0850b346cea9ea6bcd100377c16a8fc6b5cdb03c3d0621aadfe884fa637d3248378b3d8e853f9fccb46b0cc08000bbe4d2e11958b680cff2eefa953d072045fb030ff228ded53aa5f8422866430f9e54c7890f1e151ce03570453e2ca84b828c95032cc97b5304337ca7715f02856746f28516ac2aaea971f16a980a8ddb6276d641022dc70840fc21e78b26ca05b6408098440590ed6b93ca458a3671f0dd2b0c656b020f838ff1cdb1db56970c46852f1bd340a0e9c2d25f43995c0ad51ad19df00b850200718dba61a7497a354f27f91d911d8337731158274e3bd9b08d9f8d272b421bcbd5805d84a312c819de00c948cade05424805bcec1e89d266c477a9369aa7fae4370facfca1221c4d295d40e359487d84cd0b46285d9ce28e565b3c3597c850704be9c2211ba6e4989fa6fa7bc6b0086f1e9fa17079ed0e4b1788cffa2312391cdb4e08c5250fd109579d8e9afd182ea43e1ec6121dbbb523938406241360e5f10473071c8ce292c442985a451099fd746e93a8c91945e5e4b568221f1c778fba0f81e5e20ff69b6356baf931585ad1d544fb82f97910d012d6852e3eb3b8a65d0b1fcdf15ffaac0a877644645f298110c7dd97282c4ddc76c65a1a09a78dc0cde4ed82a5f4ced5387fbe820a7110f9743294baf089214b151feba7388cda48b99d693ce125c6c670451e8c119cddbb93ca2f4d89fc1717074e733f0206baf1b9f2c0cadbfec529acffc749f093e05c51648bbf904ddfc0fd9dd017d7400dec7c1a2efc6e0a6a38a85bb1b0772950db6bb117d54e5f5593bea3f2803734a17a537a6722054fe39214e44f71a89ef4cc311539a2473696b5f5801092c7fe058006b113749907d0ecdd3b8aa8bf1475df8c46b87716d4cad319be0cf4dbad2dc01954d257f9df599b54f79690258db89ac662b46d5eade4cd6e12e293d86a4a6f77f02ae2c087ccdfc4f7c82a6bc493ab8e5275a4aa8bed602e21b412ddc58a5e96976a6a94217f2ae71b1f89926b773afe1a64a84f4783de196f18a575cc1bb30bb749718b2ee973b336c3cdd71ee2130dd655b7c256b01d102d1af18ea168c30f9ec16264056a6689bdc62e05dd05dec8355ee5d40cd87f9c21d9aaabca63d9bf3d62ff3a5d2e7ac2db4e64001bfdad2f32ee31c46ca8de7a7a0b4b444f6742efc54a1beeaa49c4f412e34680b3257d776d59574364c1b21c0750531daa278d71ad5328af4aa55d0df98ec2d760c706174d094c5797a6b43b261ae54d529079025c1eff423996105174aed74c2ac93b9e04fba2c89b138d17f53f65b008fae688ad816f804a09c61f53b36390073ad4db8a8affaf85248a2740b1ad8fcda2246c4d0d8e09723fd14256c1d19fab442990909975bbeea9074e928f0fcfe1a06fda225063b6df6d6a30512570f986a963d6c1466eba94ea34faf3bee07ae5aab1e2f957254b72d945dffbdbaafadd8220e2df81d4c305678e51ee8dd8391964c3047a81ab5f656f9055f9a5014e3cd698d1a9eba35806c20ce635fcbf25e77917f5613c5519b66f92fc5602740996b4f4e629ecb7285c5cbfc0dc0b85562540ba5e4b8558b779d45f1da39f12aa4cb5ecbad404cd0e1c31911b8090d66e8d61a806499d83b43a328bbaf4e73fb83c45ec122b26bbc0ac813fea4b88a2e50fd9972c172d1756526f58df8ceae0f0e0dda4114237ee89d1c187b3eddd196c4c42b800cd65bd966f6eb912431531b9388dc8c72902cf07c0009641c0adce5dcb9b7da7c8242fcdd427deb148c37cab0877c62322365c0afaa0ee6798b0bfa9208b17c22687d9f32fba2297ce1afb571890c024871fba736487cdc8f81f33a6ef73fe2645412ea9c742fe35d7392d0f872d4721b357c034a13a9cd86fb705549d15064e6a0ff98422e336a5310f0b5b90bf58882a80aaab61b2852ebb92836da06a0e64a13b83375d66242ff9d65890215589cf65fa98b87bf1ff04926f25d937cf0531cb71f22dbde0afbcfa3a6203026d71053e999827010000000000000000000000004b96a810a71765cabbffb99b37afe175656b5c116775b7a20a3c7d7805ad459a0406cbcdf29ea961f395ccfca51aa6152df976d206a51b9226169807dbf24318852c1faec324d71c733704d44360862e1e6e51db3e5ed8ffbd6da4f64c6d205000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b67146409836b35867e4622aba73aab9daac10345229c53ced396f075c8e02a68dbe86aff24f3702efb9b513ce540041fedfcc4e9da3fb6f0bd6efe3d3d96c0e5d057d25197450b05ad42cd92c79a6340243797db5c9d58dfb7369eeba456f1a34779897d6fadbaccf6728f8168a3fa4539746c4e843c8aab382905e2aa8a26602215ac16e953e577499a45802b2470d4ff6cb287cf40ee37aaf9a49949e61e1910300325c7f02374c51add60bd7cb1a0a980bb69f15b52b5fd6e0de9e64dce52c9d0a02cf68387102e0fc42a8ac52c88103831bc16e9f117f5e43b3a33334a35da3d31133066a90b5f37f264afaa5b93b39040a64a689af48e7222cf91375b0a9d008030ab62b7d6898a51e944b9c731c294db6d4de72b31426d40bd7410daf42dcad09022c092f3f98a47ba55dca23b123bbfb1c6f98a51c15afabbcd66c830f6e761d01030a3be6d42ca9485532053d69c8cea0c1093c8bfca9dff2ec785e2e8d59e751bc030a27f31167719aed2ff02994acda0a1cecdaa33d1bc27baa3b3e472ac03448150325a37966471188d61fd7383f794ce5e17481babb9730aa1db63025204a1ed45181ddcafead0a2bad5f04852f8a2a9a092f0a7e584dd40f58833a640fec97e4243fef6bac589db3a3cc64e6f0db4b58415d4bbf22d32566b8893d28e3750b28846622802d9b03b6e91a97b875276d471d3daff397b8518dd54c5c0becbbe4385e104060ef75ccee64443252fb83b736ae7f8f4ddae3f6ec6fee67411880b2e2f3575b27f51fd29888e6cee34b7a404c838a66741e65c0a0a4b5c3fce838fe2183705003cc2ba19432e01c67e189f54dc01125f44755ff19e175bfe7ee4fa6bb745b672c6472721e365f07f396a525f53ad9db179c43ac392cc1d4c1d08c5457419f17a8d720320a9cb2eb4c35b1cce37692eb471d3a8a35e72c2128714e4e7b8b639ab83aa624901f6ceba735e9d00e3c0b04d97d16e1da220834076da65f9593466016b87d1101a6370f45d6dd4c0b925868b231ebbd759769534dcf109d717573436845a46ddcd0cf9e118c6776602830ca81f13ff168f183beb0d8978ceecee9b4854a6c9b5f59efa746d782c89afd7f31995f7e7893d9dc077f05086e6c8c014d418e6712aea9c18b25a0ba3e2a88677d369f2749b74e3302aad19fdd9d7b5fbbb1087b9c5682a7065049c42ad935e562f99d19320ff810bdba113da86ec807b2f8a1c788b5d86e7faf938d06b92f6b8b201bd99dbe0a8a3002047cdeface34f8c7c6f870017084285c0f5bddd1a0bc4985363705d950a985a0c05c3293af8a023834124122ae627a8d0c205595f5b9d6bf735c1d5037b11013e20090cea2eb42448067a8d308abbab91af1fdd9eef87b6489c2aeaab571f92da57b1dc64d7d53b8c3e59e6bcf71c3a3b7ada1109d621e903e1c3bec2ef14857249026d8c22da8bcb72fd76654167d194499323bce63d43ce201b70af5e47140027d865add3d5141367534a27902f32b0f4c42bf4dc9594d981b2862f6cd393ecf7851aaebe8aa059acd2efa2378d3cc4119737c2a014306244252db4d804e2503e35e554352671d45e8e819bf15bce768eebe33c3a879ae79d9082513dac3e4aa6d6229f556dca0f5e724527ebcfc8067277726ed8e1c4c9bc0c8c4dd32d4f2f4af15e8d4065cfac7b1b1966c21dabda9b6c17832cf5ef2365267bc3bf0d973ad7e3272909e12aff0b19dee1cd95292b5ea7225c0d14016914c219e649f4618a4b597b79bc9113695a07e98f3679ed140ca08f6b9c5f56bb1e802eaa760c49af74f6452d4146590daa886074e5dc8a36d39965ac22036eb8fddf3578c426f1a1794d8789e59166c0cc2ea3d9447d0695036ee601bd44cc03e0e2e93882c1d3547148e2e632f022deaa0366d8085dd184eda6c4a7e5639a76aa0057b4f710b2b0b18bda9d33a3755073ec36b76cfd8e569bf85d88a56d93932ce89ffd37e16331c8e5d31732916f808c2cf093b7e646a231850537aaedf580b8268d5a61812b8df18c4dcbe8b49d2d172ffad4543530ae842cb7208dd76ac74150c49f2debcde6b2f08191f9b18e1d75166958819dde5d2670332f150064305d74e1960ab7e1e774f0378804395bf004baec734aaa3d48a7411f04610806e6052cabc91c73d5f997205ed0055acb6501a03d6f3e6b352d0363f69d9155835b295fa8b2c6dcd05cfaba20483d7eb42d3c1bb17b689f175cbca36f6c6274819a8e3a0285840d35d10168152f616ec638af114a13417dbc75f27989c18992e58685302000000000000000000000000d24eddf4c1e6fff671967ad2b5486632ab1c8003223f37cc90d4a7afb362fa880b40a4ea93f9d5e82222be040ef1c558d9d49baa2ad98556145d024d89dae66454a53336fa747897555964caf21c77b1c62e54f9770868d0684ce683b105e330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004b8888ad1c64c3fddede9e28a20b1419403e2e09f0892359ad5308fa980c1746a36d4fd1eff0e3e75f325e7c5cfd2f1a8c5a2564562428c853c5a2c60c45e2ef5c38d7949ca021e7bcd199ad153c90524967c780af5bf18c00a963f4e8da5a243fbdfffd1d04b48c07757bf532fcf151012038aafee1e4d2c42147b755cfd7e102013d2a0264d2cff0bd215d69400ad40008a8693e90fb88674cf34a8e2ff7c50e0217b2d12b8eb50ef3b03df12cda29deebbbf0c86e73b1719ec1e4f24ef2f07aec0a0630d73dcd7615151c1280527b808103c01948c44cf0aa5e1e53ce145883579fa7fca048db4e2941d839b2ada02fb4f9853f650987c4a6eff54203db21ae87c1021121cd673203bb1375b5cb373a2c799e65d6cecb79d4267887daaca92d23e0810216e705bdd20cdaccf0d0509f99e7e3f7502cd477cc4c75638a77f91de73a476b022532b87348ddaf52e8a63a070ab7b920dbb11f4a1c4cf112860564eeb25499f103229b182dd512940d3ae31b30769045b95946e40a47728313c228041e8158ba19022f9863dac90c0a9946f3225f68cec816c3669322c910249792b65abf958d4cb88842eb39635ec74605de3e0a8f806351265ff416b094ee2a3c94984d8595bfff27a09fb1a16c07e36b4b2ab82fc27719efcd1f1c0903d93d3b971eb905bf0175b409b9703ef457697c7e170e23dc8b8fcb85bc2556084456d6da7ba444d59cf4cc76c65edb840213cf35905bac1f6289c44af4ac4316b1cecb8c7d4c1a77f3389fdb92f8ab1106fa9e4e5b1837b290f8bd1164fd3d77e3c27bf6baff9b1e91306173e0c716f8750e3e6c303c7ce2953d46c93e1ed9d32fca877fbaba21c2d654d18eeb60c68bf94b9a80c1eb33e460534cd98b40e16b03a0e76527c47589dd795879d2012ea3f5b95b2b1ec7d8101dfb363db2a1e12b113fe61e5c0c138fd3d5b32949bcee2374f4a46460a4f63b3660d329d8ce32e93a0279a4abca84cc6a0cf7c953d03765ce0a1316cefec8667f379c8f60a58d85ec3cc275a07b101bcbe23ef2f21cf3a7a04755e7cf4c3c3a9413923f9d0875c5c088eb574a281860b60c784bba6ee3bb6aaf5feaf7796491ae38932eecf757e42a2f9c477b2fcccdfd28dbaf6d92d4e0cb1d42f54abc0da6749b576e9eed55ef04990fbf376193236fd746ded104ad02618099ef651e40d57a619eb1d7700f7591d3022f249fc15f140ab3490b7de734c7d86a77c2a279f6e5cfb27cb7a0168a224fd276c26391b3346824e9de8349c801a2486c6a0ebed7715595c30002ba145938094a3b2163855d9c0012176dd6e4dd0b5fa8d59dcae3ba531d974d2bbfd07f05f0e5284b9fce5d5643f8b429acb2db8b72337a78abf782633b341bf13e0b67beef52e2a4555f444d4eec0680922a5cf59acbec489e0548a9ad30f73e40f02389b97afa4e9702be0bb27990d41bbcf2b35e3b703d430636a6a72e88dad0239d3f40fd977f5c3195b6c61cccfd207f02244158b30c4c80d73e5011259517737960133ff1e54794184a11cc88b71756c877a96dbe4bc965f1df5ca526c110c0efe2e1f227df7bc2bd5ccf2f2db801f24c7b42d91395d80dbfa191e3e7dfdfe048dabf0ce87b69bf46cc391738dcf451568e724c8f2840bab099be9df7b670b0df62f6ae6ba9d05bd66f5e65b4caeea778355df10fa9ccf20eaccde38f6990934117716181fa8315401a2b52931714202f87e98687d5d5f01d55c7c60e4217c3e296b911b4dd0767c526c91056e1cba63c92717735d43195e8171c7abaad44f947f7cb462f24df3d4c94dbb97d74832831fd836936f5c39b26fa0f4e5a911aa584e5436f4b470602b731e4407158201b5f50da923236957d31d7ea19e663106dcaed98fc4b780469ed096ecf75d8eb8a9d588db356a99dbeeabe3d64220a711c27f48296b7b236b012f5e7a57e2fee9d31790701130a1c3a73dad79dfa95318e229f81871c7993dace9ac763510279bcd2e33d778cd81f2592c088cd3729d8fc6ba8ee184c7c32a9cdcf28de5e90b3ffa8f5f1222e053664a9a1028f3ec8a455c24cb2183b4aa33b2a2e8072855084a7538cc94b33c1681c5ba16b4252d9b22706d4b60359a556133c001a20d4c0e7ef396ae8edc4fae2a3487cf1c167ac70185fec73007cf9e9a32165dd51ad86cc2adf13a83228241a88446a96584a0bec749f6d7310c0cc83be523a9910c05a9f730a3df44726b4ac1131287add54b7ce3fd8f4f6e17c1ab7cbb9375959b390375f4a0fe4898c1118fc45c6eef948d0aeff270a3dcbe21d6668ee103522e7102b4350eadf77d31c2c964128f8e332984e5e13ed5eff40a2c1fd6a11153a81cedaf183ad04ce26f09cd9a1b51e85dba3622a0fc55e243e1decc87aeef4acbc025e2dc700bc5bfb34f85ba9280e0b", "5365ac53", 0, -1457150850, 1537743641, "60573e57ecb4e13fda238e6bf99f98ab7c1e3104460f52aad0c7aaee75f968ba"], + ["f76f4736012849bc8b5a4e69a437a1299a28d09313cbaa907f1a86cb87d836a4caaf5cf0b403000000055153656a6536c4db0b03952fbf0500000000016a62be9404000000000700636a6551516acc19710300000000076353ac6a65ac6a6aaea5e302239961030000000000000000000000008d1124be2c02313774ef0f193ad88108c6b573083784d27cb57d16ec5708db93bc75712a05e576231f6bb59e949e87ff52d994dbd4c222de0b63fa5b331140f5e55c3de00ab731ff869c32ad2aecadf5c01d8e6c22d77eb7da8bdd3bdc53f37b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013b9258286be80a4ffa2170983782cd733545fc7482a2451075f5ea112ea6175ffe3504e95a3cb72431418b056038671362f2c47ba01955f5616c4d912b30c16c18835e60ad90538137d4c6d3fb7ea60489dde5739a0717e3b3a1eca3da76cb44146cd5031016934d9f9f37888b20fbcd0f77bc1d97c650e3eaf7963a15c8f52021eb3640b6dbc7f15c9a30bb8dadc5c5338dc462136b584fc27c02122aea4c82a0316104db539bf3fa10c271027c29ece8a8910d74583591b3006ab50ff7d9269580a083a779f773ac6916ab69f791b9f123193602003d596f0498659932940e69bbb5b570efa1f57f417c1edf2acedd2ba79be63129ce2daa92071988b5918dd278c020f6777bd2bb30fae0b592e66398422e40f5853526c3730dcb12da44577ce038203298edc457e2cd3a21b5b4271990b47fdb90cc8161e205e54336243a4daf98ea1020dd1057f68f8e3a906b85ea6d991c18feccf4356387eb6ebbc7976dbac736e690300c190b971e750ec8154b3953a3111ac643589ec324562b40b4eef6ab4ebe927020ef878c2e3935db5c3ed526257f61eb098b7cae0964fe59a6d7b181c268fa9fe71b0a6d6c7d887d1557b509d2cdcb6cd5fba86e888fd5481b01c0c8a76bc66be4f705ede4e7bc11946154aa8ee50e524aaccbc30a4ae6bdcb4c6ba9049049a09572b58373909cfcec62ecda3a4b2f3cbd3c5b8d82f70e9c7db33322abcb52a417b8deac2b1d2d59c88038e37d76ef012f81a59ed4779287dedd2b854decbc37322cdb67bfdaa7644a4d14dc61a4697ec81a61f6db965e1d60a2e3eb18258f7ff3fc21e9aacc1054b93f30c46fd7cbbd221b89ccff74775648183e9b37548b589b8be0aa8a5b4c80d0d73d19fb1dcb2696c196470fb01676b125cab6bf27c7fec124d0bb9833979062c134424370cd36813ccc39e401f59fe11e173236c14f61dba4b758b481ea118aad31307bb584379e54d30ca56c18dcdbb29010c0808e45fd29593b56d78653d7e3d06b61685fb156ba7526ec2b44d9c5c3b3086f96d39adc7783ec950f5c350bcad50ec00486d48d39f022c7286d5053a09facc7fa04bf4e8557bd2ec506c124deddb58e857ae526fa1b9930d947f19ec2d7b7fdb192971b5e37c8aa9be64f3bff41e51d7ff25f3fc855df6c3d06da7ca7455be9420b4db11026590d1b1e902ab4871791dfe2bba14f53fb45fa5bc3746473593aa43b0abcb6c8f441854ea0868a9cf4d6ba113c5d68a1401bc11ffde44fb21c0d28d7b29337cdf220bc124cac46b6b26addd5bdb8f9861cb0c789ce27f5904e6490107b0894bc2adf40ca01652cedc34b5fa8dfc9c5a315210a636a74634328a53cdf5d5a13b2a1859e58f81f79b71a80e9d73f231f06ca46fab99cd2e466e7eddc9f877e575e67229d34f2c0c8c991e643f4602827b69fb1d33929ab5d958ef9e28b120f9256829396939a48afc1874179d132fde9613372feb004281ba9e95e18e97e2869bcd729525be7f1ff9808a803c57a6d44a053f0f63f68e49a22430a6c26ffa5650335040984a122af7ecfb164ae705e782ea2874cf701e97b09c8d75f5bc85bb278bc4910b18094a07ca8dff9aaa97d34362df821922855db10485e803e64a18178aaa9d990f49fdb876f5fbc853596fbbccb451b5dcdad257e1b0119c211a451652e235171afc4756fb5c01ddb4c184e9cf7c7aea610cf5e82e3347fec476a1438a245424b8bbd6b69b08c61d526d4b589d1c7eb8c249c1b037cd3870f9e0ef80a221028b67d32aaa7cb26f30d82483bc09f4323155a4cd9d1ca1c71ce6468e40aacf001ec9e58653a897ffe20a3cb2b58d449c099889aa73608768083aa0ee586fc0d7ec10028d2e75a5ab8cc7a3b00fc0e424d60f142339cd322e88a70cc7494285ab4d4e470822e178a2389bb254dcedb9728a011af45db42a43dea01a0b93d539e5d8fc41ae07bb0b760838b9ba681f6ecf796c01403af7dfaf923770d74df0fa3d340e95dc780bb7b96aa8481cef08a8abfbb6a64abc99c3a913c7a4d5b626e17119e33d48886b5bfb718847fb5d6326ab59c1632c1cc6f2f781b4126e01aaab8077c97944ff4e355ca484535a3e19745966f7e92ee052498d1ff3237c1ca832cb14347c40d255a026158b288a2618f5f4036a92afc2f63cc083799b491d0f151c1cbb14958ed5d1bb3f77d1b10f105e8adcd3df7b08bba0c355c8eed357cb4a161c231921b0db96916837337e75c5561d5b6c6ed97b7af225f01ea95d7cf458fc55d9dd58b278be6bbd1fca0c23a7e55700000000000000000000000000b5686749e5f06ccf3cabf36573aa0a64fa07f0a453b0dbd417d65a9dbdac450d5c3b2badde5f6320b98bab4e3c79548a9182172352a3c7433b5958438c16852b46eda1ff4644cf735498180472f19dc5b03d5517fee30dfed20600feb3687291000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c22d6b1a15ab4bf8b77cd87070a10d90c5456679633be962d84c357ec3638092200ac1c5594647968b35dc11f3845c25f9c617e5d92208fd12e294336b340bf54718148de92fb4ef69e537cc3c440df79e8b6fbb544388a25bac8221194a2d390e732a7d5cbc549878d982af85dfe4ffc239ae106c17efc919f43f071a15b95022728f97bc59d7ade8b08d87a16ad94a09f90ef1d1efd126c46e36bf13477a2320305d5a67590f3759f7cb7f80f8965c12ee059b266d9f8065d561158e45723371b0a00866e1d59489bd46aedb9bcdd8db8b4fa7fb7ff16928e7203ec946e3127d835079f2912330149ce915cb5f8543c7296dbb784cf3f9cd8c19f8c58bbeabeb420021777ab43275907a27ce94781315cefdaec26cc84b89a6852a1f46c1150a0d500030899ad4bfa16068c90caa69dcfe685ef8d67d5c115b7b601c44dfc3b0169243b022768114f14351b8c5a1450dc408d9ede1f0d2ba5327aa52b1a0f6e481dde76f60223c7d6403bd4595325df855591a96e83b1ef323e320bd58835ef1f8d28f7df6f022b6e54ca2a635fb0ea6339b87f8ad4f5663bb66418c24be259b38ab5fbaea6fc4b14d5b1e5712424e312cdd2cac85ec091043f8bdb3a8be0bdc470819755aa848d887010088ae3e2f86dec86b39faa8fae6108c52a9a229b1d02df8cba68e4caf7ef7bb95d6aadb6ead06f783c25e206c73880e4b8357c07a5343ed8e95bd27d846fac5e7fce53a252e158c3b7df7fdf30776192ac784f202182a7bf49a8dba66c71b08bb5b32c62b92cb504fdb698b4660da8c2aae253a06a41b77425e172719c3a663c8e7535f48bc10e53b92f04fbd87b52d057b14a3ea3b1f6d0de9c455ab2f26c09eebdc2d465afcd07cd0b7668965ffa3d4ff6a90f396058a15c53e6845150de2a95ab34d623780b45c0fdc7bc89cc80763bf62ae1743dd8a070469771191aad67c41156ad56387a6b9e198d5c2fc23773fa1de42237713a5fddb9d674be92e400de05209b978936b78ffed9a2da4e0be3a3b05bbc18b427ffedcb4a0b3cea1e08104ef83f8611de39875148de7b83d169f4e08676e05a146df35681f63008dad8ab0a2f95643a4bb105105f831323a05e284b23b838501aedebdeb39c29d98d8ee726aa48f9f79f4d84c7e7d26f250ef0a8a7a63f5f78b8926276fdd70b70daf71f031399ad07f526f6858f42d977bb6cd4ccb3baca6967a7f373f90270433cf642375b053dd956135e8c5012ca25f92b1146f83bd58e01f5a80a9fa9081df102da30c5d450124ec2cbe1363247d7e463ab823ce42bf5ab4ff7eae21d7d5843036cdcf579dc094fbf4aa010a29541c15d441d4385a175717ada888e578e40a783c2387f358ab2b15eccabf3e5195c3ba6b2a6943cbb464fd6051d78e16c2314cfd08f32b84ad509bd04b859002c76e35d157daa5b4539c21e4105eafdec23aaf1fcb023bfa96737d7c1a934fcb55222bbd99eb49eb5c14d7010285c33db0ba3e81b4bfcec86bcad9c61a45f5b085600bf1a2afe03a3656630ef9fb1aea09073aac517f4db175b37fcbe40e9ea9d6bcfba55ad63dca6ba86ec67788321b903ea67320a4e30f9fffd9fbbe858728f72bea471555c25938844899c38ffcf2da918ec6941e1f13e7c88996d76004457e1c503b9251835748a266d3ff347400c910133d1097e4273a5097ce668ce3a2bbdbc1d3117519843250516e1de33ae6055f4cd474c1eb08f7b8578d7691f34ffaa22336e1ccee45b723eff2712c01a1dd770ff0561615503d5821a6a20f0e083668ba26e8f55fc44f347d827d16bf765c6b3cb2e0689937b91a6007d6602764523e8257437ae48bb653ee6fd2a1af9a812d8b17c54afbb027ea7c759ad5ac69d39b796a12ca953df3938968f2f25feec0991bfa32554ac0beac681cd7a9997c3ee8607d0ed7cbde0c18e9528d8b2a9baa715654b8437aee5f9b2412318ef76be47499b80338ddd598449a8a1cb5e224bd75465b90fa93ca0d5b11e1f449cc45ca329314772e9a71f2064788512c3361a60768c057e38dfe5b535b8b2d413daa89d7433b26647e03eb7e7ca6fe6292ec8e00668675efe2c58c25ce1d3e4d523fa6bc3ee264390a3901b07f15e7a444c8e92817c3abf21ecba3bba972680284180e967d01b7a41b7504026d2e0a574c9515241b989d3d25a0184ebd9af7f711cd95e9fafb07e16fe470af14c809b0d3ce0ca2ad1cc97b01d5d911a8a9b1180852392b15f8d62ff3d1d457c6317cfa55c96f9c3adbf1b574283ffbe588fe61713e9236e07aa0d3f85d6730c048d315fa39b87b1020b24d479cdf255397afbb88b0e8f2a9afe529a46e200fd57e50034b593e944b8a061ca48a920b917321ddaee5adde8918982e8452cb705a323df71cd81642c9e2e08c6f26e421d3328714b709f02", "6a63", 0, 684917721, 1537743641, "b2b5c891dd6c7a38c7261d1f7a015d2518aad1ed568cc1c23500aa130a0f7a91"], + ["1fcd9b37024c0eded0cbfa725a3e7f73a084a6432a08453fdb3f1530fb4d4816bcbcc1062c02000000026aac241769ad8deaa970318504c12d34de966399c01d8838d38280af9295cf78ca4a377de4fb0100000008536a6a630065ac51ffffffff04b999160400000000026300996631010000000002ac6a9f5c380300000000055200005253a644ae0100000000065253ac536552000000000300000000000000001670620200000000649b96c827c4e35ba2d73540a799fa1c7938f6f77c247149ca5e04f8002f1dd5585b3786274819a1921502039cd1dc12df942c8b7af455c459a4de24f430b3db2dc688d28942f6374f938223e9b0778024ee076a91e6cd4842469a9c7d8a8d5500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bcd9aea12b0941712621ae8620a3e54fcc0e68ff573408714d1c838b2ac38d0ecad24d04f1de334dc42ed33419e0913f9b0e24546f32d7d54ae86ec8bed4a01a61931dc4fee520c3c96db2e392edffb1ce35a0ad15812978aeb65619732546680a995263819be2c0ad960dc8715a2debb940999e056e18042ced10d21b3fd8090302f58a2adad8cea06432436a99c3ab3d372b6996aec03bcbc7f92ecf160d6b4f03106657b67e88f113f755b5fb4d67641724bcb34db1d93ef96d65ed0da98256190a05993a956a4fe1c59895037b3b2225e1fa3f30628ab64716dd3c8914f7a1319caf664d6a3ae6e20096811ba1981e3faa4b26a9fcfe45c4dd684b3a672d4e7a3a030dbdd1a5efe41068dbdd18f7cb598761af89f2c866888d91539900a31bb28a2e02133bd22a0d1da04733c81bbe88d0681ac794b27c91b3b35eb0771e9390363bca031f5ce5fc728440511089d5cfc3eb6714ccba346784fee8a6e9ba664d3a0d39120329d05810ede62b85560707aeeb69bec0cd17005a0ec3592c8d9ea7841e0a7c5c032d76e378a8090a983c8183e6e14be45a6ad869d1086cb3f1d9e8cc615b05d06bd23e10fa003583b0e9e610acc56e1b1ccf5c8d98b5f5a45e3476391b571ff955b00c6e7a736dd898bb9eb802cad1e276ffc68a2a1001e39bbb733b67c4f04c4d2f6eb84c9317b64fc4fcbb0d4aa27506ac66a82f2b9c6b9f3679dbeed6491bf3e582691e4e2b9ad20efc3b253e3a346b4b492020398dcdf86130a6c89d30ed9b722a069cb85a467626a0ac5f90eb256d5c909f99303874736bfa46cd221b0913611cc141af2924c4b12bb1a3e21ef06f4d22e6b915cf40453e942139606f471fded7ac6871f39c48588ac8b6c111d9eeb6109ad4a208d6a7448fa0304ce0509f5d1d7770213a80f583174cb55d5ddac467cfd1ce0ee2c3f55eee0057fae9c6bbed49eb2faf304d8e6d5d2b6b17df420e99dd45de34a5db1ed4d489e54115a9ae7e9f639a1e6b6a77f4e29cb314c78855d74762b35332bdb9ce27109d7c7789718041cc25cee3e88f29c28fe24ec1f5cc7948aa706cb7588ad161f91675ff1145b6baa49005e05123921836cd3eb264c9c926ba519c14bb9a6afd1fcdef94705fa700adcd1e34d6402ef4108363757bc549679058f7ae8da183c36e8e1a0cc03b7ed8ca5c7c32ea00b24bf4e5c4270292d46327bd9c2ca6e6ae3d3298b4d05e68297f43f82d37d126119de7b8d3da2864f9f015ecb62b41295a8bff6d8231245d1dc6f8324e90760e11942f804d84e22a1704e7e96bf56155e04983a334279663bb02b26d6d538ddec54e27e3d89c7bd113fc882ec7c54542bcacff1c7246733faceadf7d799fffea155d0d078e3602fb0416d67aac32c17f192a0fa464551e738796a28e436d4cee1cf9ac665534c0c09634b3c4f02f745c2c4e27870b64e7e23a5d26833c1ac05acda4612027ef4a56ce3ac881338eae7b0f05d246e9b4713baf5bd90f58f45bc02751642015aaf0e1484b0022c271a4cb534da65018ecfe3d3a7744d4ef9d5e3108ee7cd3897d3dce7743b94fec220a64a40a3bed92899381988f04c45c41809e8195e5773070b40235319feefdf46503e2d1d3e188327af3ac69b65d2017bfdb399fa45f082830fae5da6b77a368778045d2e6e29b4d5b48e89065b11d477235e76eead168b94b7badce6c883002dce7809f3cd5af9da2e6b681831275fecaeb88a5e66ff9dca1e6bf090cd2cafd03feb51b6ea61fa121fd15b5f5647bd172f3b5ea29d29c20e47d41aca7ab82ea4043824f1bd008c8bbb4a588edfe3558a7ca56ef33ce95ebfda1c21665d974de12a21bfd87764c185bb9e4b025046c045fd5a72cf86183e6e86b3c5f632b265a20a728a0849e1c8412170348f1248d21818c2cb7276e8ab1f151022f3a02c6494a869b99885fb407a112ecb1562e0cb39eeeebc54cae84102456c72ad701d4ef9a5edb3445749d34f0cda8bdf08865bee92b0dca99e92cab08dbd39a65c51a525c91402a6f806b8d55bba03f3b5b561311c29d4196058585ff9e20c0621c4933f24596c362b927a30b1c605d5ced1bc5bd16ddc93f3a5d5b9c842c3b845c4c405308a19c7d28f91d3f058ce939c5b8d8de1c4c9f5a1b541ceb5cf7760360847fc924f390cc3f72b6f121eaa768fa39e1ec47446727aa9ceacb1a19e8efa6fd7271d305d900ca9da629a9fb971159d661e9be79912e3e7e1e315dcf490e72477113e2c0a83222a8b77df4c50ef5c3e8237b017d3745cfbe4bac21fbc18e18110100000000000000000000000012af88e2333be99b76897894d5d806cc62fd39c976181e86f7524f21662c339ba0a2e879bfc90e0d9c0507f935ef3ab4106803eb05e295a411c871649f24d423c4617b1d9df3c5d3f419bc744db9a868a3684e13ea476afcadbf33a2db73293a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000da117086030098021b71dc00aa89c04dd90eff2786ef93b92a219f392b7074a8295b7f5c59655376a76d00d78f998af72640d96b07958a3f3221cefb050c8e69c6258ed746772fdf97740797bb51b800be07122542aa2b1ed0a78ef0edb04856d8553655eccec48c092a1eaaaa236d55ff0b5958e666a64977b6bd5e549fbc330229240dcff61dbb13557101d866f1671ec3ec3fc275c6dc5174b21c1b2820d9e9031bdb0faea573594ae35b108def476d1d068d37e910829caa5361b36047cb06760b04a604603c2d201f491456ec62ed782163916b1127aa7996063bb97f404714e19cfe7a6aca3854fb71f6572cb6cbe32a3232edd6223b7e84d3495cb17baf9c3e0224d76036c0c19df6f697d72cc881b4a7a7bac64530b96ef5f161e68f1dafd8000329e7c52d108f32f373f6290696a7617c6f3ef3babd0bf54fc1be71abd96a95db021d7f8ad465048efe8261d1f2839ebd4e302c5a2954c7ee8ce8c9e8f51e358b1a02023a1d689656540ec8a19f5184ea3d5934e0a4402754a5a0ae39b5470a4f8fe4023061124b39705c31cf19173f3e1ac70891700e5b845fec8b5e62b4a666e1452c860944a06a6f8ccba093616f4b031523e74e6d3e18053bec97b489556a36b776ebc4d22c7f3d3dd508ad98226469d79efbd527f887826bc72b8efbdf6a2ed05bf6490401ade78c9a8b8ea2b6c6afc29871c7b4ba226cb1af8aaa07f394b387daa6504fe48b4cadd07a25924fa879d5e952aba625e7b49e6a3fe548a0a04628a01a979939f6faeee2441fe4ad7c2bae26193015ac195495c13e06d723dd6e55cac28efdbaa01dbeb55d8c49bdff68fdabde280b5fa326bbb4f0571b77ce4ee6ab0baa75c8338c2fa456cbbb89796f3b721b96a4fdc5179cedea57a0c8cc1a48b62e8f9bf0001b5eaba5b60a383caa440c177638ac526d061c90dc24d1a55fe7f8c2922ffbf5c490888c95f9f1e2bfd96ca1b4ebedad8fc451c5def11e5775b4a20d13970704aa29a7b7cca2aad64bfb18f00b96a8d85eb1d58dc453740fda6a5acb843ac95c43e3fa68b28b7f57e70567d5ac06cf165a53a6bfb3965a504b15d82c4b97ba9e22adfa37f1e9fb335e1d0a802b6472dd3f519a3a47b9764e280ce8b02db330df53c0b578045b16a93a00073c91e55d0cf16140fbaa949ed4bdfabbb02ad92fb12184ca6e9e5140e9be9f798175bbeb38d4b443eb9a43711f48c4eccdb5ca8fc7ba72f0eedbe0eac582196e23b7485ad22fedf5a71108b02ea28519020ddd9d222526ac50801947ecc50d5297e479532c2c84f535bec1c69fb83b986506a958d929e9b391018ca753441009e70571e91bf6e7b4e7df5ea678ebb2097384d7d2c3923789ebc80f0625076e2069dd719d9bf4d4e36f16106989318c00e67a542f67b12c89e0f2127bafd668db1f36019c59619cca4dc3b945324d617269af2dfaf695783c7486b758dc7a389b5ff512208474eee7b2fc3b461cc430aa5d33c743082f1842766ae739d02baa4a1b64b100207b97e150bbdac77a2e8003873b87fbf065ebdd92a8fa6aff30a782eea67b96b584a502fa510e3a6c27f87a14d87e1579533fa4b6a5ed4882b76df2a9432ac6fdeb327a04381b93cc38d9b9e36869c9b2d4c3d7fdab87a2d4aa8d6e4ce10b899a67ddf687076e27949d2107db63addf0976b619130cb5fa82712acd05b7f50493037c1884d20e5928036ff3ddc0aec0d5de85df1c9cd177d5140e26dba714bea1a354fdbf566782c63aba62a3a6d2fc4c6d9f8afe843c64cfdfd9767be55777fb7f882c2320b20e4fa47d53da00ef03776c17de5da0ad1ecc7931714307bbcffd8efe4badd5378f7a14bdd9499d61305fdcb1413019ce3cb59f32316365ced5382929fcbc2d80481fe9999bcc6dfb7d91eef86f4577812163847c06b5394254e5aefaf4bca95b45f29e77c0fa023335576c631a91d81c087aade1fb418deeeae074cede9236cd164ae5ac414c849249f696b754c994e06d4208932b503b9b67608eecc27442ccaa2b39142611edb16908de6378c111a95beec38bd8da763846e2bbd192b4646c5562fa9e4703f2e8a889cb5612e1a42eefccbe9107ce6681ff949abce0b3ce3b476492976c592c93fe6a5c5377bfc014bf6a891364cf3f35b5a3113adfe6ff0b4cb518821d5a1f20d8b75fe0c03b00a8a72f6c8284430ab37258fe71b7f904c400f917ab66e1c6a82f96c3565ca12674d26b423ece9f590f743f7744bf05aed51278fc31213091d35e19451980638fbe526377b23ccaf600000000000000004d803d0100000000c7d085173a018468ae89e4ba260d7f582fe180596254c390f4169daa35e74e4c7e55470c8d3a988909c1e422fae1b2ed1ad89c4a1e219929d647efe22b492073cb8a69258a50e77c5744df6827cc418a105077e6d86caee594c14fe9f9dd067500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c48fb8e96d84309cff13a7bd4304a9de9d9c877342a328c4cccec2896230f940881c1380d44005f1ebb7900454f91edc98a6ca556ee54ce40540dfef8515e88e6c2b3a98cc456dff906c8308985e0b4d3c804f19b710482577865bc1e42c86f1b0102cbfaf49f72264a096a95c692c50982f8d464421dded8cb08854231f52fa0211dd3bb60556346e68ed99e793cc5a1503d99b255d358b5aaeab69e8568e949c022f97e9bbd41f7989a1c58c3ce54f52f10b3a9018528b145edfb7874f4d5a7aea0b059e4cb49356fad14c082a18981a36ae236312ceab06a0b58252978a1669d24e7af6f24d6c28c24ba1ca054c5358283cc1ce9d051216d9a6a04bd5b8a8da0ff6021c98d8983afb256351b4749daece33b59c10e058399de5c5bc17ddb11bdf45560228a537e35c54cb6ba990df34db41bb9885ef7d3102e8559814d221577aedaf43032b67cd37728a499964361999ec18d72606c8095a8b407ba3f855e3c26ffb39210204046c7bb8eac01d51ec91afd3a9ca574745bb0772bfc8c3ad4bafa6047b94340328e1fa71dfbdee4ef86699fd9ad27b1d2c907a682039066cfa1219f96322d851ecfb53fcefba4dff00ae286715176c1428c08fda08c8d9e4461255dde4977ff20e795a298e2c093c319f64db19619b04f4f9a874ef6d3fb9c0e056247a0ecf636b52ea00a810af1a6771042639597a5422ebce6a652caa052d49b78858c5d711cfa4c9499833bf3e94585b9cabaa4c12d6666a462a38cb1a63e2ef61d18fa2df9e64fe197b489107435eafa6a2f3392fda7c1349bc4d4fb5e644de4fdd02e62c71497f15f486d8be78e9c52fb7449153cb49f57409e1b7f25ff2eb7590f939fdc43b07202103c9c4cc816b72ca3432b3bbc812575a6b571bf32aad41aaf2c13ca8f228eeba525a81601c0b15bc27ddea502aec7f84c86bada71baa9975a0d7ebcbf7831e1c7353f19f218fbfba945fa09f0e746994b328628019e48cecd85031c565f93fce169b73b65f50a34fbdedab0254a106e4d36ef8bde765cfd2adab8042e1ca734cbbad0f606bcf4531492eeb29cd95ee19b20ce48d4f76c201d386d1afad16027d5f8b4e88bfd8f4035fd613e677862c3fd4db37f18e3ba5b0dcc29ff8305114b25415819773cd62895b79c80f0ecab90f13873596f89f8b2f0abcb460513b87b8268e8a1cbf7a6ff78ee49c168a4f21540611975bb31f7371085c50ef7e6d07a3a8d98f73281f19b70e417e58f3393b52c8f69dffcc752c24c7df0d84bf54b7189cfb97943be77d1abaebad4c2afdb9286a762d6b39b9189954003d45b44564932215972f4cec275ec7f3229d2a5a8ff5cdc08669ce430b702bf5fc7764877acd3fd65038093cc1072444cab6c28f9bfc826b5d9eefbdef069e79a61baa03c68905ca409f7f5f7875a9436a11d8da0fda87718db98bf54fef9a1c4d3472a766f670690fc4395943450a886ab1244cbf66904e07b0513c61d87d0f3c072dc11b128a9dabcd2132b90149753e431691ea3d0b718394e3a17f0642948db7f8d87339dd2834af280bd4ea432622070fd778b9772eede722160ad51df125e5dd6b812f43ded9de6643122121ecf1884fa625ea5492f5ee9a32ef76aaf0c2de939fc49fd24bad94a067e1beaa7fec0d31bba3f71b0759b40f6d9a3bfbaeee882a779dc3df2030ded3a7753253dd95bc0cf8692c0f81ee6a32c6001370001e64581af593fd41578c8f81d5a1f8e8d38e757df66606297694de099580f494ce48184a7899dd2d5890a47fd0a747e091ad9a5d6169fe312cebcdad72189bd802b4fdbf4e6a8181e16bf2d727372d90cc39d7a957f64f9eb188bf94cfea5e33985e109f9bb28a11e3fabff8facb217fcb88ae0bebe37c95c5e99ad9fa07220e30112c90af52d1bc3ae4ccd3cae035fe08ee75894b9e9bf46c11937b28e1dcf9943a8f659c9c1b58f51a0986bbba85a73549541d4a336f0c7debc10e9b110674996795dad762db9c29dcf9c9af33919ae2a8e78b7893387cac96a30b6728354a5ee397633421c954d049d72f4dd04c10dbf6f5e7224b205ea9980f6952b7383f40672e331a74e95de5461bf93b52897f683577d4c3da13c443cb6c3ffe2676d550860381b2e724e56fa7ad8c4013733af8579041072bab04795779ee9705ee05ebcc0fbce0825177ce2e4ff3259fda6bf9ce9e473059e6a4b33a2adc82e0efa78837bec24605d44a9bc3a28fa98d6de9d2874935cb3de03fcbf325d3d394e805873288689161ee308b7a5980c1279dd6ee93de22a824c5496e127480be65e03133834f1848eeef947dfaa6bced2f5ed7ccec2747602a9ea6be1a2b3316deab35009a85bcab2d29326d248d6e3a9c118c62c52777c0561fc33ea1ca59f6d3c34b988a8ef2e97dd578b8a1852354542a36c5c20c", "", 0, 838851709, 1537743641, "f6cde7b8f91ebe48f548b50bd8b7d1bf4e2728ac4e1d1dfd9f696c85b0021087"], + ["030000807082c40303dcd2e776cd9fdc1450167d4c82d4d82d7c9096a79c555042e1d44b948fc9963900000000046a63ac65e2070c8748d780659df21dff1292014740b33d1f8e1dfee72af298de41fd1941c5a760a0020000000463ac6a53ffffffff99133aab252032eee5a3a2e0fe759c99a35c11a8b1bfcb9eeee48cf82f277aed010000000563ac635363a11b9a4f049323e5050000000009656a52006a655363536c59430500000000096363535253636a53534515a70300000000025163c968ef01000000000500ac00636a58c49f9e6fdc443f00", "5265", 0, 1228994285, 1537743641, "2e064b811b649965074a6b58f519990801af1dc1ef4515f631aa4ba7123de229"], + ["030000807082c40303a24c39a01fbd56b7a1a3d0213a4abcd0cd2b5a345fbef28e3096c4ca37d769f503000000085365acac535151658ea92f441d75f85f6c52d9ae6939205ec3fa44c6ec36699a764a83ec4d16fd46e37e723701000000065163515300515da691b0d42182ef47cce66b7946bf9e80a6c1fd5e2cc4e59daf78909c1ab290358269f6010000000765ac5351635152ffffffff04656bc8020000000003536551223f68010000000003ac0052ca7ff502000000000953535152636553515392aeb9030000000003ac656500000000000000000165e3dd03000000000000000000000000001b8f42ecfc0ab16be482801640c5e98184a27fa7880b01d865199ed71e3a2e9cbd7805eb35440156312af6f18e109b845f4396221fb7387db34a96bdadf02c59da4e08b5c7dc2dc574d62c7ba8c0992749be5718896a2f87e0843c716231700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012732629399a8daea1a7b8f8b8c877beaf730124173d597fbaa51a2022ac8f055fb3d2d7f787b1a55b7a0068a13a7855e37e2989649b496d598cb0614e0d018f0f63840442e4615400059955fc6cd7e7a111490944779cf8060060f80ad459ac2a1235202fb2234d8f966304b2240608022ce5dd508420eeafa12b2429a234e802097a6c6a5bd42bbc72b9fbb1b1ab6fd81159097376df6a30f30e79dc08733d8e031b2301bb5e710abbdb5495c251f6e51bf0e33024618b089649593b91079632070b08674c1f2102f0c7a0814ea33d4d9b78674d6f33af590c1f6b25da0b954df6e07ef72dad63e53e24ae1dc7f1c8d8dcc443b1c2edaa4d46a515f7448b51195cac022984aa366f5eb2ffddea9a42402597f0dcfa8b23e4af6bc51b5c4c139cb72e53032ef6cfe20bc84a89a218196d52c70b192269e51c1ddaa25f9ea190e1299601eb021ce89ed3bd65981b691f707afe4eea257478afbd021212f32c66cce06ebf0deb032f638abd830404e11bfe86fc3491a32581715f38b97f3d7d2559810706c71cb1032c7716bea41ab28176b924cb85ef5664889c21aeed1fb75ac8be8c1be724b7d7f2df8e8ebc0651f49d1c038cb34e3e45ba5eae10247610e25581ff346bc39d7d4c810777de19fa9e34a8d26139045d617bd27d705172431b81af57759ea29feb5f9289321f13cd610bd43467422ed65752215009a9da43658dcbef9d1dffa57544d4c51f29bc220f3f0b71f463f1e74d892372a8bf3e06313c91015a8904abca5aaf2074e53a94b127f6a1936a4e7f7eacb0f017fbeab22c594d74e107cbc22940a08e4ec8f6157bd0e1d0b3fe72fa73fa66f32ed91765832af89eacb1749165c2bb9906e18312fa016ee7473a9b079afee184ffbb772e490f8279101b4d1c093eb2c5234cc66518fc1744b325707abf4ba443bf330de053450a9ca4ffa8c7f07e08394d2347add0b195f3874d2843d85b010060ffab00bd744ecbe0d750fb9ce39777ef5fa9e160d1f88f56d40762f3155936c2c6bccf19b560887b3979d46eca01aff83281bc945e98c3a1025c9490e3a0350cd917367be0dcec452abec80fd9c43e3cf443de29540301453a524684f3807bbc06648fd2346b34978b5f69f065a95f181a10734066847e155693912b73328120fc5b098a139a3930f595674ff1162a5f4c3703bc8830a41d91f11e12c77de3b3846e0ab99cbc8cd593ea51ba069f5f38a2ec2cc1fcbae823eea221afaef9e9a86e4ac4e1d6d0e37a30c4096c788fd2d96a40941cac0c6a02a7c2484103abd5289bf6311b1fa7203667a38ba36d4341684c83803c5b2e28a0d6eae190136f204109e1ba327b0aee0820ba99f00cdd8c6056d22f0eb5226f32aad1db4fbbc7a66a5ef601a0013f04adedad7e1b076d739335658597e5d96893e8e7f1727435cabe75aec69a955167f44f2c98fc7ff546cef155da11a65846212cd3824d001458a8833e398d3d162b76ee321e7a37107e396482fa69d7d77160df06a9c2bc5438d42f2da10e61d220cd974a13fcc582455268666ac5239ee8674357bddd4db4133b3f82130b912fa09f3e7d027e32919c10d7a072f9c45bae32e98d320bfe496f655a5097af61d2d77385386036d1b665e0c7c86eef788274218a96a5e227452fc09a205828d290e424b4e2b7a0715437da5667fb08a6c7af47eccf054f81b8aa24cdeff323f96c7a836381b85237d172b8390bd02841f73bb3ab4375d8cb454725d7d866d5109946c422a9e4eae89d4cf6517e2ac3f627d7300b347b410d220fea794b8e7470f50a367d3104083122a7c13c0728e31af32d10decca1d7dd8245ca7bdb9c4362cf891dde841faea1bdf80412346e90ae023f9fd90c685bf922daaf95723c468ce678ced0817bf3df351a0995e6424615fc58708cb5565ea892a99411a5b3b9fc0634c99ed2c6e7d8d8b8dc89c26e4db405fc2b8274fa077aad6e45f14938f5a0cb9216556ea4a6994dfc1019d015f9b66ad05d460cf682b31832fe133f3b61afb17ca1ac2c5513f61864440d0d42f7f8e715ad24e7c0325b12c3053345221286aed06760d52e74ad0f16e49ce36747349a1f3eebc60b4856ae6a8e62ab31e4e6ff091f25aa1f56c0266d9e89a3b1663ee4e9aa3c734fc8463dccae511acb82398c56580ef1e1c3bacacc37176272cd318a64d80c967e4bb4c6a0419a4c70a0adef8b9f4e573c4c4be3648c9659a1a4f270225c075402b71e6f14114c116ce989058708802dfeb15e68c4dc735aac53b73c5f6487b8bdcfa40a04f52ae29e04a045a1f2aefca12fdd344ecc8df56a4b17669ae650b9b2420629ff85a3d1f3ca6899f1da16ae674c4fe58997858ad265011e72b67ec93515cacead46da2561202b2b2f0bafb69dde31dc44b412aedfb2a0e24c78aa579ba8740f", "63", 2, -1062287712, 1537743641, "7e039487c99a21a202238b5d571364889de6abc58cc95a00f17d96bd090d8a58"], + ["ed16ab5e01f9dbc1b0eb88188dc34ef9d15539c2c8f71d55b2aa015efb11efd8286cd6f66b00000000086a6565656a6a656ad40cc99703b40c0e000000000002005212260403000000000700515100525200e26f4d0000000000066353526352650000000000", "656a526aac52", 0, -1538454665, 1537743641, "c33bc501d0563557e352228a8fc1536f381a8d37da8ae4506ce527af39ff2954"], + ["030000807082c40303c1d5fbea54f56c55b86475ef2da884f3f8a7300c2c9d94c5c1183fa099380b1d000000000865525165636500aca6eb0ca597f69ca805df738474246bf4d41f99b015f6cd68f94ad2719e69f7fc6e77e80b0100000005510051ac52ffffffff9e9f63115b145e9a0f5fb353c1c081162ef4f712bf53a9f17d8fe4ebd52290cf0300000005006a636563de5dfe1c025ae571050000000007536a525352006ac6f88e030000000009ac636365516aac0053e354b85f6f328d8300", "65655200", 0, 2051083950, 0, "33c0d4794307b267cb7f56d06ac6af935e8dcdc30823a357d65f8fb49f224fc1"], + ["e33a886d02872f61d714d01dd4cc562ddfaccbde58bd58c9c969365efc6b5892a0e76fec15030000000763005151006363ffffffff96f35bfcb2687c0cebb0b426045ba8e390e335b2ace4652183c8899aa4dd090c0000000004516a536affffffff027043e402000000000153b656ff00000000000353510000000000026afff600000000000000000000000000823a57108e96142721d8d632b421daa2be47ba48a9b4f4f6246699c11abe11bb42408b73d150d4b54ed8052a3ebd11bb9772809462521217339de67a5bdc76fac4c29f2c8822f474112dc7da09fd01c2a31794335d66225903ea59a08febe16f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004cbf1a20822ae810d699e8df5e686780e4218c1d63b979422730a713d3708f88a5aa1d0fdfb228b3cb0966d069dc2ef3d5ae40356fe0aa2d98417dc81e85b5b9dff4d110d555855626fc58d61a45eacae1ff4a6b455901dc01e453a898eeaff56ba261ab8dfe34ef01afe7ad2aeb8dc8c58821064bef3256d4f87d4f0b834905022afab1ad9512a74896389ee8bcce1b11b75ba889e5def5e4f1f93626c1c04a26020df256f6c21c58398153f1e4953e325d9ea680d07697f0cf35019ee6fb578d210a00b316171ed502b6bf778148e4cb6aeabf841503751dc4fef083f3e6723323e95bf7d89d71dab12e52cf668588349760d50ce2bdd85d63eb9a50208febd1a3230314b5a6658ff03f862803e89176c2e489310f3d654af13a37018fb9bbf627336d031eb335c3023886111526aea68fc4f125da365b052def290fc75f63c333c5e9130310022ebcfdc57ff2e3b4313414356f521bfa7004d01d42a6d1e6b2f5e61fcf820216bb8f4bbe9b0ebea28867e6b32ee9ea94e8e479a90a25a522da738981c1f7cd0208de32f136b04ffb0c53137c8c625c2b1bd7a8717ade47a5def02668a9942ee89dee181f18bacf275e887da6aa17107efc9ccdae1fc1882f1a6413a829a834ddc7f3124f9bdbddcfaea6115bc22ded6bdf745107559200ba20d9701d190fe8bc8ee5ee4ac4dcab3eab3570e93bb9d507f552906e519ff3d30777c76d6505307d39049a61e9dd534f94ed8616319c39fdfde1eaf02fe088afb40fe8f4e0550c68599177af7f0c69095edabd5b28a69ca3ab94daa6576b73c4d3372f2ad18a5f96425cff29d6db0f872a23140ad1f0a90cee3483b7a70622b81a8af758704c2f3bec23d142acac2056d12d874b60a14decbe0bee5a7167d8971ea3efc2e52ab3a2344c40aef824f94957ea104446fbbad87fea192e0b847b206f59f54a485ee03fd7edcb5833bf660b4fa84f3546b8b42074e5d07371316bc0521e4e0680e130d3d61296ba6907ad382cb383faf37e3eb25b74bcf349bb4746db5e505a160dbf39e0ad9ef4a71218b15a4b7274599d0724d2df38b1fa6d5d3cea3039b9fea565a2a07469f33865c70f49fb87e768de8a0a454dcec223b4e93414765457d901ab299b576803ec2b52cc5ac45061925e600de258c9a8a6afee5fe4b56c78c67516d9c0cd5a65329e23bc4fb4858ba64c0a1e97421c1ae8d7b06382d46285f2c95c20a93c2fccaefb558359839130937f350c24e1b02a05e55b6522837fafe0185c4b9f2c9f2dd06044f129420aabf3afa29e42542198bf5c1d0fb92df0ad40d32f454cd1a1fb6a13c051e7da52c9533ea12a190e54a6d6deef8be9d5e2b7ab0b9c6e148c11c80726ff492ff1c751c0f38f029d7a5492f8ca0bb9c08e671f95367e167f317ad0852fb89d5feeac1e49a8a8ee310cd65b8bdaafba363cfccc691f5dc756d1c2375b9b67470d5c9033c407da68477cee0f2c008d840510f9dbd24b41bcfe7c897684cb4ba54b37a271a47c77e6488336f2b1b686a48113b75f0e32d9a49266e42de4ec98b37b04461131a9497f2b3c7b31d094049fcdb40b9c9861ad22ff8d964b05d064eb7a5824863586f95545359336577568e197430a1d2f145540da4c8c494d13dcc6edb9bd739482317c43a0a7eff016492846815ee121943510d5b8fd8fca19a732523f8de7c456313a9c9a6123952690afa4a0450e51988e24e63e96bbc3cbd555ca82d15d64fe93e7afa004b511d33a9215484405518534b7b48cf315717d7b04e1442e042cb254e83b07ef87326b1f1fb4b5b259f524fc2acc2c242e75ab8a34380f61727f8cbbfe6a4ff362b2a757abad794964d7f491867b2adb6e4aafe290c56f4cb7e5fa34ed20ab7d8047e496ad8f9868c0bca2edd27a0429b8c29be51d5536ba69458c84a4fc521062c96326b69043549d85a885c6cfea5d94f32050db4c25c40130f5e7d7f06d1ad00ba985e927bc0235448b00b014ad7bbb147b4b267243ca8539039fdb320c274b08137aa2e4d24adb7977e56c4291d0a0907556748bcc89d703aae0994e83cdd37d248b2b480d112d675792c2448c67e5ee6a147ffc4a1e40822229e25013b68ec7a8b9f443b703ed2f883f1dcf30777d389b703e44dc5bfbbec709c7fd6825140553680b32707d0194925fddd8c04317690976cc9b0f9a7334df77757b9f5df01acfc86e05ff808f16be31d55cff8d8f60b280b127acb7f64ed605c1c11532f220e722249d62989241852afec6bec6d5408c8a5b4a29c4c0513e05c3c2dc00000000000000007899940400000000d6fd8d0b5231c781dcacc592d6a12b410273d1db85f40222395bc5fc5c3a7fb05ec87bb6708de5f046b865c09f351cacd5ae33936354112ae7a1f5f1aed018c22ad7f273ce1205e2887d93e8ddaa3a7911ac6b7b123f4daee2fcb97f01b19a6800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1c3a74f114d636f58449d7f3f519a50f838e2cd71c9cfe2fe0635c7559416753a5a6a2ef4546bd4c0fd615093b4cf6db961d7328111cf00ac25f2c93d9e390a1df32665d57a58954ec5f5034acf6c004abf6d6d2352f07f3f3d1bb1a54fcfddb057b5969d2484825c29dca8096d10f923fd57e70ea734b04f98969d945664ab0204230f17cea268ac2cd5776e8a8242a1034c3b7c44d60c717265d0be8de6e776021f8294527c6b9de72479b0ad3d7f7f02eb86a3b4b5fa5c6f60330cee3880bcd30a04249da10014fcbaa34d1e32b958d0af78961044b7190d1c44a1d0ce7839874b40a313cac6cdff2527d37c6c4d62ed8166914c6b81f53b00e8534dd01c9120b60212136e7023b18033f8d53c2a00e42e3dc3b670f11aaff1fb7a4d0aae87e11326032db5dc4d659425d0e91fe5ba918d3a36515771994793f5e7143d074b549b038d0322d199a402c50a690853043bb021aa26a86f362bc3ba07b5e3a73845f28eb05903299ca31d5a12ee168542da9e1f95f7875cf0f780266c62b7c651e5460126adb70201b6b54d3511082369937a70324063bd4be83b4c22c6fc8fce5c764d1c037b6968ac1cee26183919d905f402e3a5600816bb482fd1f8ed3b84be82088a8c930fd19aa463cc96ea5f03bbe574732aca75eb0cf34355096a2d109109dc254dcae3d70cc715998fcafba9e7edbd8dafc11ce68b51dfa45892f526f666b82b19b8cab68b63920a25bf2741bfd030658018324a3241fd5ee5e54647a7b3707cf0852dfd2949967354a818790ab58597fa18aab9a7eaa75200ee80b78711bf7daaa828af9e7ba9c35b71b04865775e38414c8aa56b7c3dc4386ab099249157dba4c7a0c104ced977178e14bf4a1fe8360a8d3f7c831f4865795beb35824cd7a45ab90d3a6d857565ba81099e312050369d353f96dd0eb261368eec1b244f2f70f950d8a928f1a1652e3a27e4ae7a8db9b1d8ba2c0b7c86f5abb8bc0046f1ef88f5019e97a26979d43765048a2a18b2c1651e89f26be967a69e8aff39a9e735569fe950b8f17ffc192cc1c15ceda7f084249636607124693153acfb6a3310100f662be64f50b33701a08f2b9d3f6daf25165d43015ac764d79f686840f1eb7c88b3757fc7bb4584fca894d0aea221bd25fc17cc4b3bcb1db52e3b46072ff171bd32c8f4a852e409e8a367bfc7bad9505744657f25c874976847258d2127f54ea955cb057be3a68d3f9188aa9b7b8d69087b27ccd1407f7a38775cc7d1cf2db5446fa34f8761ca314143b9fba3a176a1657a4f8a6ef0a5be5781ea523e88eda866d2b4c0db12ebf297fe7cd7209b16d7bd06baf95ab2e6b025e844eb71efc3957c8bca8aa232cd8f95904692713b60ca4e15cb1fab946664a2454776ea5352f078fc3cb0a790e8609e75b006bdee8d4adcc798a370dc1855b8cc65577802a474acf742b819b8667245f404930f22cf0d57afaa6d1c1abc20abf52a201814b726cbc65863e6afef9509344cfd750ce9854fc6a2bb75555939dd5cfbfd34a522568ce931d1ce8d2e390f8aa8b5abee2087a0e3c5f74e6b15f4ef26a5be096ceef568ffec6803f19aeba4b9a1f82381429ad5e6d8e39b70e624a31c54b929e184d5fe1f83411f4c7b280389f5f0cbd1465654c38821935c28fa606400009271954a69adae6a9aa3f72a7465a92957b9c91f855cac616d9b0e63b947a5500161e69b841c9436852022fdd7c426fbd4a94fea96c636b765bec00a9f313c1cbfb7413c5bf82035832c4394039c5bb1e5cd894d54323d2964177c4a3a9fef980ee154a7ee907f765acdc667f41797c2618a1bc32b5269aae7d495deeb34deaa67737c7afc3f95e106f032cad1d393e6782aa8ae8b6f736f12d8565198817ebf82aa4810c67030b8b9e321cd1a31bc1ed3ac2047c81dc567f1694de0f323a9f0603afdd5baf2f6b27f80077b20b7f5796e399291fa2318fb5665206472dd22dfc711d07af503b51f9f89f6fe3a29e602e9a3c1531f33701288adfed3dd9b2385c9d982afbf7308aefe9d6f6fd03bc5423681f36dfa7118fe7fd99e0e0fae9bb98da5e9097fa7c80ad0cf052da070e87cba20ff8dedde6f9f99065c47ea5dcc7004d2b244a2852748f0023b4c1c6ebdbe40d6d97297c2615527f0e9093724764557f75ab6a1b9b5cbcadedefefcd67577631ed7f92fc853696f9f3e5272b2076eb73ebdfd24f80e0fc7bc5a6cfedf9a57eeee810e5b7a9445a5321184cc1a4ade618480e0199df5d0eb30e460ef7fd651ecc7e20e6f3ef6f6a0f7c0ae1f77557710238281d1b0ff490c1495698ea2d6ba4448cee1e64cee1973512351546ac60facfc0bce5a40a2897f530f8734cad9c3924c0d37f538b9d927d46823cecec2b4ccad1dfe5e6cab4bfaa73f2b5a565912c441ffd339e5d6287202", "", 0, -675573198, 1537743641, "7eef30f298e70c032b40ac4aa1c275e0fddf96dd74c59a1ecccb869066cc889e"], + ["030000807082c40303ca55d94a1bf8c01a337772baf46ea3b684f8269924eb42b550d3e4e04d282c1703000000086500006aac000053ffffffffd0ecee4acb4169e8b5056fb15611d911a037cc6cf802524f38d2556bc200a11d0300000001acffffffff86e9111dcccaf8ac48cdc26edfb07c5790bb869cfc732ee55a2e16eba33844d10200000002656afb5da68d026db8cf000000000009515100005200655251603e69050000000003516552000000000000000001b95105050000000000000000000000007937ba0c26f1e69393184d6f700d7424ad3c765297b4d85e45476bbb0e8bd17f50070986d3c9705a3185dfaeedf70c0d1ae7a67899d0272a536ccb9a9672bbfc965ea82842413207115d47de2f7c459b2e4774d9acdf1009256592d837f1370300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1dd5a51322fae43742b7fb53553baacc0a630dcb3d227ce07a90270aeac73fed887b874c5b237fa2993175fb7223e45fc1bf99febc264c4aa6d38fdd0815682083cca2beff89d44ec3f8ab6c89891d829a11ce00bee9695ba551588ffeb24d0456e87c977233c5abea6b6d42e16ae350e58432e59e05198afede1996d65a912020877410feb490c537c2b9b78475e65eaab32150266cf5e153e2cb8417a592a27021317950836da066ef54773551262f6800572b512794f60caa253f038eb234fb70a01fa27d380cf60386f42cf99a7baa23bc58b0e09fca6480b3eee4fc66737aaf3f0d21e518bb53e5f5353ac03a3c40ae3bb50e8e8a4e08e2ba3d6729990f299c7022baf29ecdfd665f6947d5215a11962ad01d4b9445f2cc58835b6dfeccd4c43a9022ddd757116d7f75081273b34a420710fc0efc389353641d91cad7728b9fbd7f70312f01b5549111cdd4c3882b3417514562533aa1f21e40de77f136e7f0fce2bb303033b49d7c57d0067e70fabc3133f4cf1bc0fc885dd21532d0da7dab4594f5e45020e7e23c8178b6b7911fa7bc9cf166aa2b4fe57e2c428e84a87a3536120234f61bad0ece92c8bd1d5da95eec33adae4b999f2fe14ed1d39511e5bc01295057c33a3d47b6132c91ed0bf8ce87e76dfccd8dcf8d9dfccc94603d45d0ff10aa7a0405b39781aa2dde36ac5a5572aaf58ea5812f3e165d40412466b4c79ed9a8a53b32b668ab99b6ca95cbf2dc37946843780696f11456ad1555ca5fab29aef1eee7a5a81512c0f3547c43622ce11e19590409c2a24df79cfb53e271c5ed691c62af70b62477dca8f99d2f3ec435a1dfcff8828b3f9ce438a80a93391de38e4cd0b3ebaa2a4630cd02a458e709628f9d35d6dc43634d521c67c5d5109182761b006aeddeb2be6c739a46b287f4a151eb7fcce6810c60bef27ddbbe2ec3a5f2cbceefb4a97de5462b20196556b6fa533a850c5762f65fad4d03e45439fb04f0508429d2ee802ef4c494f79dc93f406946be45ce3b2297dc98f45544ae898394cd39a8c47b766757b4102bbe04a25203fd311bc77f72bcf5f2bd6ef745ac2639fbcd3873c27650d934d3384b03af34478ec5a16f15473c83051f685bb0e87a1cf804d925aa5578197dedf6a2d3bfbe117dafcfce09d5f279121b8b51d98b37d22239bc94a024e8f6078b90fc5e3ac7f717e5dfe7df9d5809c9ff3c34b46f252457bba9cd8e317720325eebabc99a11e697f45ae5e322776a14918e03f44441489fa4e8a4c01c9d8351738caefe8352a4f575257e9292e5ab8d09e82bef02d1792f9b879a91c9be67dbe1d2f847b489126e17984c714fd061e44284ce5daf3f3458e235842f1ef8e1d09de5c4c8d6180a8d2ed8807553e54ec1a22b28b8968866aa2da596705469b152042a31a2fb578fbd949bf8743f3a479d432b221ff099e158f688be429ef175111e6920c414ffdc9996432b8e9b26a8cf00df8a53939894f680df3fc2b6ac030fe20af3b94ad9f646e5c2506da50b516099b35995bf05a9158e5e672ae906cf2f37aacfd14931ce46f112bec978de9d8ec30389755c0ff276a11e15b3cd088be052a0a00c9c4a42ed883a28839bd56d3735e11ed38c90b586e78ed2a3a52d23fb5a60d5048204ae6c540b2bf59e83db367659f7f51885f25005ec16f4dea460e431c592fd88c2bace70db9a51546a4f7606255c5c3ae07d905370c78501ff57999c48ccc7959ecffd7dfc9941e9dd76c680e6733a7e4df4893fd2886faf30a62483224957df1fda689d0c375282988fecb6b0dc55cdeb2b88dfabef538e8c94502e71a74e720ac6f30121e51125ccb214b365f4151f73c1acfaec955918153d104ec8df5c82093c99d049a1eef34ffb5df1e16b9561aa1b644a542c8fd0c020cdd9db47937aba6630d87a08df40c781e5da43fea97e21741d6a4fb48892462e474ca46b10b4102ef7f2d330593ff67bbfa98a522d492a950080c1c57cdf43237b706d54b2c64ea56fca7e80f330a7f77ac8fd35f9793941b64bed6c2944e32ac448ccba66c9040b5711408f2f48107d0324698f1aebe0da880c413eaa8e227fccc177a6b966804d93b415982b13b1c324380cb93c8bab98879580c539327b81f3d2d990e2032ab63e138ae504ed4fdcfb1f985542b8b2b8c3405a042187183e604812b09df75e520ebf9da490a99e95d43135eb482482cd4c50bec76a6e7d3babd51859260e76cc69eee9a17e75f2288d6060e7bdcd29e5fd5c0e7dd4218c211f39d25c2ad79280e4d81053f29907b1975c188131ad0f56d9ff30972468432b468260386e069ebb3c608be42d73df5070fd33bb1065e42f04ce7540613ff59cef1e21abccca9c39610ccbeb543ea900b2431f779f8e3b9af3b39a5be2687c37572ae10f4b6fab1ce5e7376ff05", "5365535363", 1, 1268560951, 1537743641, "66abb8ca7acc4344f2886e325826eeeb9184b916f991c62b2c070c3f5c672fd6"], + ["030000807082c403040e4ccbbdc99f1363f81c931785bcec36efe194258ac26b9d281d2ab8afc2aaf502000000025253ffffffff34065ddbfb76e12de218ae8b011c8cbfb90b5fe250020163362c758f7940382a0000000000f5d96249c712d23d8be8ad6b18d3cdaa001c18208b733f8e05e83b06a1f04e82382a1a340200000007656a0051525365116df73a0aada89e596e937d46931e4b0a78638c34816d37a19ded4f7030677da81f5db4000000000600ac5351535368a304da0374d1710300000000076a6a65ac0063515b7ecf0100000000076351acac52acac2f5b7a0300000000030065acff08f1690000000002e0ef0103000000000000000000000000656c500f9e31358f996fb30bfde20f1307c2d646806bed06dc2523f937829d9f8733b8e3b94e3eadec5755c588bf5f669a6a329327567339617a912d8b82251b8f6c6362eb0cd018f0c1c13f4bf6778587d37c4c25bc7ba9011dd47e0b5ed55000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa7be75bab58c7d2c15e201f8b28c73151805017cf4e530c910e129a7f8a54c59dc0406b7aa0dd58e3be2f67493a69e41214d07c63ca35c3aa1350c45a02de51969100595c5dbc29f15e5af5c0adbb68cca7a57ff96585d8ecf9db951a366e28a79996996349df1fc882c49fd1257b711d1c63bb760c40ee3078b1794d8813cf022569da91332cea051628ec4a5e7225c29864c3720361310f63adbc322241a5d0021ec97049900117ec27e5fcf0b3c45ce68cfad8f2fb9fc5566275515d5e2f51aa0b01c3ae917cd4dd5e74076399f7bb34ebc99557d177702175b014aafb9a877d3d2fdd389f0f13e5309b368e0184a3459df2de63b3591e02b75af1c6bac0ed37590221040d249a31620de3c0cba80cd482422cf90b641fe823b8c06aa1b085b15d8b0227b1c516f22bd4969f6b2ae8213b9e64d9dd8dad35ca82c972d692c3314f653c031d507d92fa7f7c7ae84033bdb7e15261fa2926818efd2bc54271e7e6826e30d60209037e2aa7b973978853ee46622ff18be6398865ea738f2736d2359e6f66ca36022b59c9b0a31b1af9edc0da3e8041cb6fb24b1fe9a6ddb3f45b3674b4f39e2b532975b3d6566335266a238bca6542659058647c94529a2f1d05ad946eaf6871d9c15c81a8bf2b66ec684dffbb57c59b20fc05155aba4b66dc8781cac51023525e05d7c32428a22dbf591952d32114176b1f523654363e16178d9952d6647461559a8d8856e345b481e2147becf87db3271896bfd32aac0870cf43b34a69a435fd6ebe68b49e42a5676aa5ea206405fad2be7f68152a51343fe04e016dbca30236723f6d500fb290c40c86b73bbf884b640dfd670a01dff48a93a533a19560bcaeb7f2ab61bb86527ade66a213867fa5405fe26ef8726845bd79d3d16759a58ce721376746be40500dc24bf1c9e54b117a62d617eaaa9d96a9e75133f527af03f79b823f742c29704071f34e7059220e0cb195b140b55bba5a174d8b70a75759f6d3704994645fe6fb0796b56f8f458963a949da46801d1a628e11168b8061f5a16f2230308272b6e45149ebdc6be71354ecf7942d9231c6d198c0b179fd871f51b8b8ae567c0962efd505266147469fedab8052b2c305aada0538e6f7d9173695e70afa7e08787e9614c880aacd8ea943c8fba521cb47da2f86056338e0422bb1a9842ba1aa24a19cf2ac54fd4fb8574952813ef18bf9d829d95d7ade6b16fa0b8061a6e2ecd36ca9feacd67b6e2d36db04664a7a479a7ff2e759cbec42dd2f39cef9fb107fdd7bfdbbdee079606ef2fe98d77604eea04eda6bbf11cda48d6af94ab2f1608c7ea6182a58d5597c3fae6096461d18af3d5f31238113201b1c59887d3d604913189916f56b6d97fc7366a8207d01c6ba8f1a103935ecf0bb8e806a13a88106e16cd81b43c110685ab9d61d4987b5cdac894e66268e50539a824ac2f394ca36a86aa9311ebb3b3b97f1a3959bf0a23c4cf4e283d613d27e0bc2a6576805ce2c1eda2a465bbc3e76259576b3c001b2a52371d9b2ba5e457f4361f6d5e4141bb5f59e096a75469f8d6031b167d36ced439f9aa90946e696a3bc3f551c8e2ddf1ae59e31683a11996588da7f798a6a8dcc9f9a5b021f4e17a28456cf88cdfa0147f5aa5450b20cc92651111a8c73dabac42393c744c0db47b1ad577c249f961e526b0023217cb162c05886cb6dd0b7fb04573d091d42b282add16945c10bd9c3828217d02d513a4268e550e0536cdc4246743a1cc0485b6068ccf9542c2f2e4985b97dd5c78e29879ccbfc7ba10990ca743d69c4ce77fdd9fe50cc8a04e7ebdc327efbde4d7811fcb49e1a2f27a94b576b0a272ea0e49db5582a5c072ca2ca551205c6264ddf6b2d7d525753bb2d859b859c1c5da21e203b1dde36b0e89551b14bc47e08886ba2c29d297648d95033c7c98bf2ef67c4eea27cee29bd68217fa48143955d7214a3e61f636351699b0d96cda55ff990ac9838530109865f771860c27546aa3708336c63ee2a13e95015185123a57673dff4560cc00d751341823adf95c05b75e0cda06da9b09b943c4ee50078ac7159253d70e39e585103a0b0a112304e038784bfbfe7af56f3eb802031ca243ad9214bea57d738e8d2e89c97d805e16a1308272183db76806f82c923d520c9f00f408e90ceacd4b5e97999f3af0c1b900b27734dceb22d43af0cf21a4038ac7b44652970f518b2acb1d8c41e3b034da54a01f6a67231854acec3c5381061f163b085b6b3425242c91b93534fa465d85ecba9a90e9ccbe21daa6d76760000000000000000478a680500000000c611238a42fb594e542d4d4237cf82a559e3ca4c89a9511fcb2c9f1117b08db5aa1c8a3dc906cf21fb1f6ce05f1dcac580efb1fb27f2975d140bc9d7d23adbefc79a66e5c17ba84b2c5d3be136ad75d0b25eec2e8510d8fca7dde8e3e06c57200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050b153646493d0904b6d1b43de68c921d8b1fb53a57bc84d67c8caafca7e448f37f6f649c6286a54190a68a820a9e71152fb2bf2a8c5b5f9eeed6186159ea8c63ee313f4dd086e97ff0f7165ed46e8a7747456fb87922029cd3820259e4f0473993525d5a28200d5e0c246e6b99af602668a14f7f85833df4beccb6a6ee66017032817fdd2ec53a4f915e37229628af6a468f03f2e16cc34853055f136505fd6fa030657bcce007dd9714557f18feecb49eb89def8feaeb00cf33e97a40a247dad180b08ee260161982fdcd39cfb163857f7d07e27985bf59b24bcc448815f8151bcbf41df2b7f6bf6b390eb2ddfa7432f0c271f715d6fcf14a734272676fd488c4f1c02019af459ae5ba06344158f4b868bfa071158e983116ce3aa36bc7a1c7b28389802128a2fec05d03a6f0e139862f1375158a477c0facea341840a671b76775052a402265203588c425bfbe7d1c33c63a96c0fc394c8dc72daf6defc96887f0821758b030daddab4fed03d2f216bdc349791091484359c28b57fb857eca1af32b37b77a2022ff162ffc9acbdb259ad058358ef72355a8b2f39f7c4f6c6d79c08ea271fe3c0e8d36d0c684d5ae284089817d50e246983a2eade7da235c9fe0151110c512e57ccbb48728a2ea3eeb5d7af10d6870443c37035558dfbd5a099dd7adad2b3e4f5f55257c54ffdddb19c314d454284346263062b49e735ac0cdb56c7764859fba7b802af7e13825292f609caff7013356ef159ddf3402e045e45fc1042820546112252deef34580fd3aa40f45087a374a211ab4820025d138bfb0857e6718c594c3584714dae8524d4127963719d2505cf1c48cb07f456c13cac0cfd668d40ba67a57e0d5aeaf457f641551f99770a82d8474d664ee654fdc4bf220d0b0b982e4db7e27ece676bd20ffabb4eddd8cf8b26999544abf9194c7fc6bc0636627ab5ce6566a2068ec2547a30b697fb5ceceb1ccdb0a5fc00eb4896d75e94d4b0330e935df580c8266a7977cf61a769cecda467ec4265ef98ec11d8e7fbfbf4f6343d09b80993b6fd561f1ff0e2775231f82075314acfd7c530443774d87ca3142820faadc2d253e78bb5e990113798a676500a0b53884faab0e18e6b2b5c431f448f75b473fa272f7991eaef9a356a9cc9cab6926e9b679b5ceca07202bb139daebaf42933ca740fc62d8c64a51d3c2757b3dcb12621085c0fcfd381e76069a80afa9e8cc1ecc808bb6985ffd9550edcd7f2f7d8d2673834633a42f8642e6f04dc76a05a2cb64abdee2357b297fc7c292621c767d6a6f0b0c3da55a0e00ed67c08f58f7f3d9dfb356a17e2a4442a364af4577eb856800c6ab21485f751f036e822b097abad79303c615c00acaf37bac7ff2a4a25a9746a87d7d28e1c5b34c9cc02ad98a573cb1871947b43d273c3892094b50404badae35bc82009a0c456ca66abd4a712282149eda1d86436f06cd6c31f80dcedb3a0ffbde4e8c39bf6d2bfe794e5d577c512722261dc794cd383a172b4426396ac276fed72196d9e74f422e04c0f9af113b8969cf696d2cf361ef908e512bf4eae733df118c57600da70c85fa4c459870987f8654744ddb5ede457c3bbfa7da001e8eca87f3adc3bf306df5d8971d7c060b5481cab2dfe5716698ae7616b6183863d3ea2a245f8b4dd0d5f370f7b54be0a79a92b4ef3d5f20206591441685f21beb12bd204664fcef875b0ed28c2cb089874b7a12d2d6bc1e7faa457c0d021c6b427a3e5b741f9fa5e74dda66307e4378b562c53b9263129f475989ce4f051793b1762dda179cb9f8ffb42713e76926db7d569803877c53c8dcdeafa02b5535e73b79edc2e495bea2b1aab160b0af20e268eaa55d77c197954354c1fc5547941bf3260591bcc1ad181c53ce374e1692a51a5c1f643253fb7f973226675f10ac63c15aa4aae4bbbb7df7694e67f00909b7cb786a7defa73a1e77e45fce9aa836017f029888cf44abc21b7281d470e0d69913a4d09c4bf4adfe219edb8d50e4839a5aa482cf12940dd655de4bec2151c6ba6fae120a027b8237835f7d61703f36fff9ab6ea7c4ca40dfff4bc916716f5ca9fa223de0c4824fb77412ae55f9404cf3cd9833f0e66f89d9abbb2c6c549deee3cdccbb04f33b383db86d43ba8ca5610a1527c259fb274cffe7a35b1309709151506474409e1798dc4044c84512c189e4393a7ea0c24a84aa93ec8b7e126e539b22567ed2e33df927bf21547f644cf7c1087e1d1b09df66fb392160b32f32b735e9e1b84733ddc296b3a11d83511beb82975d4b382d2795bb238b9dbc17bb78a1030d893f95c2abec218c393230c5cbf99831b8744c8eafd181164eeb56c02fe24561fff3c26cf086ddceac93d9925bf11caf65459bd1b063d9d079f4357647545bc3ddc8966fe32641543493e16aa660d", "6a52ac00", 2, 2027553693, 0, "f67db42778e385161b644d6237ee5591b4e906aa4fb3ca087a831287dda2ece2"], + ["455dce0001167dc9ae7f35f156a63e5a9d74e7a35b2c13053acd1df5fd0686361a9052f759010000000752ac65ac0053acffffffff04a3ff45050000000006636a636a5100cc58d0010000000003526363804d7a000000000007526352515153004b97fa04000000000000e5a7b800", "52536300", 0, 1203113559, 0, "60ee773ad969eb32659f564139ce408738cb03d53dc9359c610d5960f1411b50"], + ["3871c76d04564e694c0657ee29090bf0e66853037020a0c63b38d3db007876660232d341d901000000036a6500ffffffff1b83e5c6f111d323ec0c717ef9428e31bcdac236f58841bf33379ca2a323fbf40000000006ac5300656500ffffffff1867acd89f016dc915bcb40781f0fbe8412becfee5a8a74f6c65e07c2b50cb7500000000086a636a526a0000528734cfe8922af6700977baa6cb2740605f6d5c50b513cd89d0c5496f35ad946a3752ff770100000008006aac6a00535152799aaecb042b68e2050000000004520052acc61e38050000000005510053ac0001d5ab030000000003526a6a4b9c49000000000000000000000333e2890200000000000000000000000010dc3ead5315f6441f142e7eeb07dd20fc6cc8753718a3da378d17ec8e517185cd54c8efc190663c66a99d553ed0b10c949bb48ee63106e01a6b3e7dfa6da2975f9f9f5dde43e6bf122e6c6596ff77660e97eda6450e8123c4b1c62d77c2db0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007fc3262af5c839d16eabad82d523b829f7639fdeb062e2e8536cd9b3aca64197369a464203801ff6ab3c114958d891edfbb08a24544ded0483b32bc19fdeb04876a7c88667d7508001398d12b9fef088d6d0c2c7f7593500bcc4538dbbf56bd14a0758c3a9f9c9d1d8b0c3f3bf656a30bf1f54505bf6c6538db9573d67f305ae030cd9c6bdaef60cc7d66d44caa8eaf51756fe5a616939eb1d0cedd74425adc2e5031af8e29d31cb0680f76e5b57dc67c15febcc255c75914b811836d5a2f27f651e0b05911721a6cd967b33b34e5c542283f9a215593fb87d183c1219e5a573a40f212e512cb98009adf094807a8326976c8cae55cf667182c373244f3a9173b58fbf0222bf109b09225a1ae10a510efe7f2abff6af6fa9ae7a568f68446f57ac0aa11602268bf5c9e2a839da0f5cea52f137376800bb82b897c163e5edcedea168f78efc02297525037873ef6c76dddc00b5e867b5c1433ceaea645d479c56f1deb699d3e503054559199e83b0e1dc52377c5b2c05d9adf008139857bb90aa55c7090c4b8f2a02064953355b251ec1bc99f658d776cc5a3cde74f0a37b44e243a57d9571b693aa02e23f5002cf9c03176ef1c6e2d100203a55073f5a99dbbf0b35a630c0ae0699a4085e275ea26de4707ffafd5e43108bfe89b700fce9c068b6dcdfbb7e8ba70acb95d76e926259c2d509b569810e7cffb91ffe0a5f561073414cb0432b80c764b1bc5ccf52b6cca441fcc0a5481b56567e105cf731365a38d912534a19f4bc0c09e3913910656e155394b2d2d65e3d0ce17728756074524d4426a5e3f1f65bcc2f536efdec2a1c842ec9780595164411f78cb389996e5c5edf413468555b29e773ad13782cdf84cc8b9be5f8af46e7476f7d4f2c43ef1279a17eb53f4c900cfaaaeb2391fb08e3bfbcd5e4ba20809dfd3e5e5216a1261f7790de651103fd282a5d0f98cc37eb85145e999048d3a3e527253fc5235067bf9489154f7ca3afff2ead2b9fd311062c02f82ae4e04cad52bd502b900bfe68851d14cc386b07319539c437ae2cb6715638e0874eb0805401554e2b63eda98fd2b1217486cf75418451fe175c0653562d71d8b61e5e32fb12bebfd2818ce5b252f4265a9365a5c07ffb92579cab512a2cdcd0bc76a1e7fb2275521e79d2b19eca32e74943b17646eafdc334004d1d33eae8a79dd4a38c190a7994037a3b1aa8895cc534f73308434b8c79bb5a9a5a2a5bce1679ab31cb9c7b6284557ffd9635c187be580e17300b67efe98a9691b1eea3a152bd87d55795c575215bb983f5615f8d56b478f55c6387d2d528fdd34794c15879261343740fb8c78971ffd783ea90372f00783d6940efe8c24ecd85b31bf61d50e90ead4e59c80c008f7209c4327ff50b6483625cce739db5e17b35a702de3b60e7e8490f302ed04bb5b0893b3d7b37e7a3e8b116f6655cd649f9764707878a5764cbc8bb30f0949d799bd536c51bfba15420dfeab886e84f8b4f823a804debf9bf5cc387fc5282712fb58bcbc38e4ea269201195e14cf316d574c4ad16ed50c68c9ba009aac5235e80c5387331d2502210cc4e43cf0ff2efb12e0b23084c1119ff2dc1f43277a8ff856840721aafec4fd3537a2b7bbeb737d6e03cda33fec6a5a6366ce9a21ab89aea86f1b1e656f521d0ba19578737bd18e690a66005643adebaa1d9b53af1fd9627288231902fc560493ab91fa5d8d4738d4638e1969775a37b8c67f86387b42d0e47e21aaaf07a694577a1d7d702b16d9026087f91246b6b1bf4b30fe97cffa2eb5aa979132e67f10cc9b056cfbf33e294dcd28026299ae05cfc116e3a9ffcc4a31dfe31384ff6023fb8e7155e23efeaca878bb025ab460891ee531c3cb94b38a4fac57dbfca4323f2480a59ed6caf8c7b1c5c5cd56b3db0357cb7166c2fcf73dd02fe73eaa1b5e1d9c1f8ac2ecd89213a4771b4dd8811cf71847fb8727c76ebf273577639d11d02ca2577914f81e6eaf58fc3ef3a5370623386c29c42453537477de700ca75ab3a2078c8e6576b91b4747e3c05057b0a5e9d5f72de003b5c66d9dcfda4967b3559d1af0339ea1cedb5f1e558591de980dee404c575552a571d041029d887e92495d642cde894dd4bfb8bf5885a035998f126ae36c5c104174f1476a1669217ac41687799f74b49ac0884717123a6100c3bdcb2c2a7ed52128ae56299c492cf339258a5aa979587979b74208844d2b85dc0cf39b87dedf8b6ce73ac2f890ece9cea870d1a85ddf14d412038837d643debb733238c314d650a4fd7e85bae00000000000000000000000000a13982a6838d137d7d8d135d6467ad1c75bb54f9214116ff9de8f70ad35ac851f6389d066d840c002362bbc401c37078fea5c6b65972412725acfcf411888f1bbcad5918a15014ee5d34d800020d6b956cde31b4d7ecc916ac44370fe05e3a1f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001bb111268022570dccfe99493fe81e26eeacdbeda7c7637709c317ad3621befa8944bf448a9be41043bb37d825a9ceb9e85a43851d55e01972b519575df91ad2b505df30e18e1e439080da9a96eaf58d6341c4de49537a20c8d7ace0451fe90870b874658846fc91d839493802659f99a1189d2c1bb84089369b04123b426d6302139157664e5f2141f5524e0766fd27e15aebba65fac8425584964eecda25f7d10325efd33a670539cc26781a2ecdf4d81c970c85954525ee9a79a3287273533b950a00c2cdad34593c180cc3f2857c4e5c9ba19860e27fae97641ca8ba022772709631a32f21f86094d26956a5181568a8885a3808cf34af18bb06c2269856d4085d02257351cfda31cc5a0d5acbad3aa4a9793f4f471e92f701484ab84aa1f434b5d4021ebc729818348dfae562c3e1564c1bead344a329fe8cc40f5c3670accb4f2e5202087c35f984e0de755ccbfa0fc02f642bc7f1ee8b01b79920cbd35cd395327176020b11b3a2b5872ac0948fc4146898d730bb3fecc6bd97ced95a8db4b725710dec02150568a7db9c31089311cb19bf51c1bdbc97a3402670113b34729c5c1ea7fc3597df0fb797322aadcc19a634a31b22e9b6c2fc4c86c17a39faec68dbedef8bcbc629f5a087d8143a1fb2cc99994b394eda18f692e1c9e97c85c856659ad3d2b556ed6bc657fba3a38760b7ce8b36982e4d5ca2a7e8702a25cb22b327c95f5e8598ec230df6aa01e0313d81f7d0359ccdb2545c01a43bcd4a7741ec259c85defa012f9c363f2b693c07cb79076c49cafadcfa91dbbcb59a9c3112c7d02515deccd12d1003bee1be3ce716974ea46505b71c4c8d7aedbcbc1814176056620a36770d29445e9c1134e5230a675e764c50f4245a23df9d568845effd6a802574afd8e0353aa5dd8e366af453feef6aab859dd305692e42abc791382253676fd7869cc457fbed43e3a5d86c0acfbbe23c0121589890eaab5566bdf20f22668acf68fac9aa208a59509bcfc19ed1a4b64fecfea5cd1c12b1876a5024335e187d0ce86874cc881e7b58d097d25986858f72cdf3b18b861897bbe518949287ea0b28e248b8e19de06473dbafa9c80484628055e31809b34fb4b7d122a2241c8aa0287697e7ae9f987938c494a7f069471cec9ed268a159c52c2f637b5858187df14d77c418d242c7b584e7194f464a73dee82edacb556b44982089da9cd5e0586206df79872869742c283ef27d7727c9277b05c8f2375823a50cadaae366214d4c4f4f7b366a8683dfaede67698a2ce3c1e72c49ab5a5b7c816dc291595dc0d58d5e15b1ed98daf72bdda3eb0d152dfb5a533cda821375aef07612f9abd25afb489a901b95599c488dc5a0bd15cb59c17a7639018e25a582b20e3769a1686aeb97af316b93ba70724111d54bce04cf322f30a43a0ae499a71f91184c395b17d1dc71aab84d28b7c5038dac6333bd555dc003373c2b6bf101a0585b4251fdb3df250e440ccd64a339f4a685c16bea6b6538a8be66e20edad2143f1e1d5086296e0b2fb1a91ce0ed5558554aa29079e6e34aeee56a8ac9751699584a191b1d63309266774f253487c03b2535d3554bae293867f0e5942f04bda2f700d63d967a949bfe8df06fa5275dc217e11b66c76cc86115736659b39c5dd7bcbc52ab80232badef4ec610c9d713915fb3dc850160b71cc6ceb83e4c3200ad6478c79775895e0246018c204acb159c0ea79bf04562f1a7e7fb25e34f8db8ca626a9c952025bf1f24c119c24fe1ad349473bf3f8398b76859225f8b85e2f7506f8d3d4f575124e2d1bbb898e5bc24678d4cd71c4cddd8dae0b5e1693aa2343857f00372d9939119d24cf0d7ec042db4268514970bed2e93940d50fed6a27df0ff7e7ef3722f3d638bdff303c786293e78c4babffe82ebaf29808b700bee24c3b8792070ff74cf1906bd6905cb7a35fd55fbebeda40509882262b2b13ffb875608a9873c527b483e430192c67f3349804449a9bc4cea61a8d608f5096663e275a10bbdca90145de7477d41917f147253da1e411e435dd5d95fc05d01a9b90395811f909c063c0865bc25d32227ab28984ae213014073ce238048874ca09a4f45d99e5b671d1be7cafbfce750102db04d4edf01b00731f739aa8a6555903ceeaade9a1e0cb41c11f00f8cca68f4994912e61b0f2c701608d77fb759f9b7170957878e1a5eba54f88d4bf3c304472f32caa547822c41f4afb48d3e6cea632fff267c8644b30c664132cc38834495492066bd5c60004b165e6b43360555f1bbef0600000000000000000000000000b2fe61500a9abc2bd0364c0629b2cd04992f10e7e303a18c6fc4fd24f63c0c2a01051badd51d83fe3e43247e9b6334ed1ceadd172e1351266a83747bc8b5b33ef26bf3d7d285b055ac02f6667a32ddad64022cdf5e32d0981854db7b8edb6d0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dc0d4aa4c054ca939bab388fd7d721425e0f4518281147265c5675c837511162ecf48e087b0ce0c0b8e98705344960646cb9c4b228555b3d5d58ffd1dd8bb5fcf3634654e68db2e3592868637cd98bf90b80a0207244cf5e2724a5ed272e7dcf53cdd0f95aa42c365602def39489d560f7253b6bd4f602d0e1ab2d49701f0b110327059a10b9c2c957ee6b53001a480cbe0c18b3478b79e941c4926a9fb9e09dc70215a6d175313c2a3182dec9c3c2f7433b17bfc70ba54fd2a0fc13c0f963760a9c0a04488bcc2ac562286fa3e88756a081b56f2d0cc70d00cacacdba2ced8d367cabb8512c463cee272fc1319e5f7a6fe97223667b82b3647f8f7e32177a0b1d08be031ad31432f4454712e603b8f7ec8798b24efda29e541094e6f5122613c6b71fea020cee6cdaec0e47c49db62026e1a6084accc95f0be38e48e07fa76310c5a01db503150ef9c9e840231211dc3c83ce5473093b7d40c41be34f176b6ba4c231843d360326af8e4d7bb7b9bf464a13d9ce44ea16072b4d0846c52ec5230919573d5cc4b8032cf789f6f285faf6b538eaf17ee40f5b5dfe83cc39f0ceba282f65f1bf70bb8034b0e681c846f2234721245cea74778addcb42445f626fefd9d267f2701a03a03acf169dc12fae7497b48b0fc7c3747172679605a864f98185ea65b39bf42e831c751b51b98346891e786a8e26a67b68204eb93f223476fe92ad046db5e3b77d1ed8336e60c1668ff2f29a7c0e0c80c95d07a220105e4a3847842d20b99f5c24463192e69b6bc53ea2f35f80ffbd5a1f3023c05f8f1dcd00386b1ffa062736c872f53151f6f852df57d5b69a1145c0bd2d18b4ae8c214631120e3989382ff4f6f3a685a42898d10d98c99a21c4699affc3667c15d933c15298c44ac19a088ab7e58149f006b92df5c456da7475d74854254ecc76e15f0756c0320fb066870d7556ad28de46b9a36a29b325db7bba4baf5b3a6bd6bcdc00fcee39303d377dd7291ca6be5dc0c2ed03d691de9728913d608365ee5be75f80a4a0039f9f07d5642b030a70d80702fb96a7eb3c97daca8db2d4bd0efda52aee682eed3eb7e907da31d109c6f8893dc45ff6113ac7266b3da3dc2e70329fcd42484c36f29d62f101ded2602ef029eabcf4ec7818ca3e3c8fca465367c3320c2cc837fe2264998c75f2f49d2ff4d015bd91307852f522d489b2276600b2606ad798544086c68e915036a7ae9e12be5769d2be437aa5a5c9f8eb0febc3ccd3818b13eee8c6bd15dc9e658402287323cae0e19b13876a222f8b9e8a5f81b215a249579027206f64a11aac2990ee9ddfd3c82604ca517e555bbad1b7ccbb376f044ea1c4c4576ca8b6ff3fc4391049c8cf662c31d731cccc0b37653bef02ea888ab1273e196dc7b302249a99e926a8b1517d00f7c681947314694a366f84c54acc3247dafb1bd9e2eaacb0330d4f879d9684ea691638729fe8200014fe406d102c3942b45c477821bb3738580e2346d3e1eb0ca370dda4eb63f96f161e363f18df05756d9fd191f8239c583c248d7042455a7f0ced3e07009574bec8127a47890a1616e3e049ebaf5a0b9971eb72149dedc9ea4c56ecffa8341f1eac7b4c6573a806b8cab4ed29d2282bb24db4bb09744f611144b2ad7fa90b30ade67f4f37e280fbb34dd797b423d293c4c9d2d9c7605d376ecda010e297d62996dfcdea5f06383e9d98b4c20d0d923fd423cfbe53aa7c0567e68dbe751fa0b738dd8624664f3b0219f086afd851d749b7cf006a08b0a2cf28c061dc7a636e5fbe7f03d4f57ff4fb9b55f4671b6b8309af0ede36d656059685bc1ced2311f050c88fcef239c9d72754c04bd3f664432cd5988e8643c07ca8cd2ca1c6f82553a11bca0fd5ab6bcc2fe7773a0709b1dd1f8d7c534838923e14f59f5bb88e38fa4257ab7a7e6348e01073198bb691b3d422ba74cf5a06c13dc7ac767447d6cddec1f35f86d66b3c09fe0dff821ab5fc4576a75235b9f1369e84e77f9663f299cffdc86c727a1ea5f90ce6109740e549d6a8eb216089593d8941b48eec7f1847715c46006d746802be79b18b7528582fc6c97bb02cd80b4e9362489ffa5f7cf9defef99f2f55dce90a65fb39b4efec06a10e70e92331227108e038155577393f99f5758f1c8a351d906f8e12368ba63396c599a8dd6c456c2eb109e5192c8c44a880fd5510324c35db32360bd956a094b5cf3934d33ba7781180aee975318e03ce0d5c39651efcdff4277056a9cac749ee10f4932a3c6949333ecafdb69b2a1f1d4c24d55ead54a889e4317def26974629f21376ccda958c13b6efdf703efea4ee3eab891935d8bfd9bfc5916572ab467085a237effa8322703da0f900a3806c6107465cfdb7b686e7b4c457fed6b2c16a48a4923e4b5da6366890ba6a6f30b68dc179b203", "", 3, -2145472693, 1537743641, "13f0128c911602d3f73cb30789cabb443e29f5ea2d7a0c046cae5a02bd74fa0d"], + ["3f1917490262bf7728aa7c82e754e8c7d3cb9970ca49a456e9f3b451a7c06532a97caf194a0000000000ffffffffe25846b4172ca4b0a67a11aed063434f1ae582a2b957f651d441a436c202b6c9000000000100ffffffff01293cde05000000000047aa59930200000000000000000f15f50100000000b601b7f96dd6dcbd8067465471296fb7140a2116805d846232d84651fe077b3db1fe246915a6a2dc903713b1bb052ec36f25e82e94c8594bf52709448f899cb4efa85614e40e0f2bad1fa3d6dacee4fd368a3450f484b97345c064b2e1a53eca00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c9408c84e31cf02b6b8f96eddea3bc8bafc2ee8dcf90e5883fafe2c6cf604d5f70afa5bd06b0bab5fa8e376d05faefac4664513a1955f34f86b5dea9af1f8755667a4c3be7126e3a2949ff6565df3298f2730deb114e02986da8a9d1e33e2b78c4100230157d7ca30a2e37098fe46b3007d33dae6f95b486a28c91fc4d96759003028fcde9fc29a6425033a0697af61476b66ab2ebcd8ee9e0b7ff7588b75b184d0223a70580d56c71f127d631fdf896446ca5d35aed0e9352290daee8b78d3e5b2d0a079f6111da06952019807461eb1cf45a9428afab9d64cac15440460f6c6b9a47a5813ec8dd703cc9c0cd54b7c99c7e19d66bb32a7fb4a7cca7905c3980cf268b03202924af9a07a273665b31843b2518a4b7444583c605ced7d2f4baea5236482f022f1cd646855107c9e8a9a692a435bf2c30ea7d9f49cc77bcac9bc3fd771a71c2032659355e26e88239f8bd9b2982b3a7fd84d4853a67527447149759379e90f6c30322597a9e447b4cfc366436ff289e946be42603f52a76918638a69f6cd4000b420223032856b037abeaadb93e06ee2bbb4a289fc0ea42aba67315a82ea6bcafdc3ece622c9d585f0bffb28b53894b8df5820962fe348a1ec240abeb4dd7254ddce0ca0aac96cbdd95af37ffabf85d8eb7300a10df5e9ffb18cd76701744049c175c79bb8078ead72fc69d63957f2eec02ea925395ff03d5b899a93c040bc709076ac27ef7295efbee23e947fb640b8a5e332f0b0a21413a8f49af5a657bf1f9673d02ff6ae86fee636a0a4c20ec88177cc672ab20f64a7359b6dc2254df38052d63dc411035e977af959eae1f93c49c0337844bca68c414701cda31e0f6e2300848bc3cbc88705111baec9a1fa0143fa64d51c4aafc354c1cd7113ee2b2ead2064c1bed279f8c9e20ec47e6c31d1f020e97f60b10ee8e87280c19a0717abee75a832ccfd8f4fc2e7f85e4dc3437c2755ed2710b1b0cc8084063b6d2f305832a6e5f03ec62616abaae9319e3c4c1193756c86d95002971232fb5d3964764f041f6d7c5de112f0794eedf9389030f33617c48dde16c77d6d1c00d4fbec5f317d1b86361d1052355e20f964ac1b6d127664986a1b72249b11a76e17b7f0459919ef49b413e550fde53dcd0a38b2b68514b716eb57503f659050654f263ec1574319fab47066ca6a4779df1f2787b3ba1ab4e156381b6ff9ae14f17890e4b14f5bd8d7f6714406849d5f355dae9ca19c5d61fde673a1ceb6d7815974c1db49667b45c59eb4c3723cffe5b74d5bb2adc6ddad7885e19cf7f116ba3cb8948ad29c4424cdca12abcdbc8119a12d0167aa340b8d562daafd9913c2e0c4b305edd7867b6c0fdaa5f6e22c33f429a85582e3cc114cabaf941b6cd07ae3d10c353c893d0444611abb8519a2875dd6a4c399c2d95bc1669536cf5839d311228d01f1a28696996b9d4b8fec5286307218437e7f58f6311b0333a8a28ddffec6f4e0e52a1c63efbdb77669649cbb3b7a8ed632ee0da742d581b8c7a468076d08aa8225235d3e82aa1d58df16c4764085dc95c10c746700906e98b32aa4d971bcc91c5f41e8d72cec27221f81a52efe67b9fe94b818f71f479d46a1ef2f304d3e9e6a14d4318f65b82fd8a5e757454cd8123a88d860cb3cc668ea87c0fa2abd92bc2e13bd468b28b84a22848be9f889bfb348ed6471c493737cec9624ac3fb448535c3148f4671b595dbf67ff3e69147074a850bbb2e80418cb5d93b7ed9e6116988ba9b20023e249f232a530f8f7e04c49b5878707c8c2e8847c6ff48083253a53fd7b5e2491db892b442bdd70df712bb050b0d83c30a90f8e11493b5c0eb7bc222350c2a57258bca2864c5c2d45e031d43bef7fddd4d9073a47080e9ca7cc91abe32f07fb2206ec47edbcc75e12667cb599ae3240ccb309fd3f6c07167c347339fa704f703dce3c7fb107a48c98132bba9006bedb9db71c4d2c7f3d00af060f2f16341d28415adba88f2e7f187f6044f8ac5e165fe71e4fa05ce902026e91d659a779f808f85d6c132199f444676bf34c3340635f4bb6219645d3d4dc2d2f8a8b34a78c8832517daf280753db20f67a5dd2ea605701b8769f757d197bdc5c1000eb057f12dfde3703e72cb8fded5f14a6f8dfcd8e4a0ec2b6255029e41c4c04b918e2c2641820843f5f022be00c4aa8397e05cdc073dd2e8155e263b1e226f15366dedf7b2bb153c0a81177421275a88c16c4b033a574230cbe6ea7683a8fbb727beb70216d8943e2370b8811d0f06f90853c84083e80dfd1947e365ab00000000000000000000000000e96588094e211eabf70499a1e781f4f63307db36348c93be08d5ca3a0bed2989590264ec67aa58a4d2ff6c4e553cb04930bcc2212319956716694791a3f48aedda009e48c1bcc638060b7c15b9f21abeee06de3128667653a2c332366212f212000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f9a127aca35c9ed870f35755a8a6ed48b985bdf9b6cdc4b5077752ee861689e661284510e96112d5d27b1bf76bd11151957216b0f6835d6f8bd3967fe403461b456001141a535f7d3577863285cc5b0d42cc881d3f047dfdf0db13cfdb9d6d85f83b2a0d9952d39a4192c2cfd7c56f52e7e27d736c299824c8981769967f1c30310ac75f3357169226c050ced3d647daf2707f0aa424011aab3d831fbbf10d23a022cbb2f6d15b58c11e4e4776f82a8e50ebc3044387bcb1726cdfe9d8f19ebb0d10b01167e92960b907d16c56e966a349ab28f840910e2ce800669cf74653e7ee4ad7c8b4978bf3e5d71415728af75916c4eaa440db4cabfb0cae2825dd9dc238cc40326154303e5520eff1e418c78a8d357df758bd2157d3c0d4eafaad9a6a0dc561002122fb42488fe6e5bb6533f784e0ae301a18474fbe758c3db7c311dc787dfd3b70217e8dd96af229d94364a47691ae6d5edb3d19dbd600579ccfee9f28f08f63ab9021a6f2a500994703fe41c1f39aacae25ce0cdcc596cb8550adea6d879e8700cc2031e64f544d2b5ff3a0e64f60e958d5a7a4340a288a23d5f7087c963f645c8238863ce0ddcb91c39a1c78c75f95d87b3dd7f5d3bb46c2ca86fcb03967871536861f3834d89c6f057c380bfbfe5dea95d103db24e2667a42b3cb0a16fd81cecab7399f6fa6db4dca0846f858fb6c53b750eb674f1a2149ebe723a7182d858c3a9b62d498786f170d7b13635fa059511a69dc751809ce0567d257fa58553728767d148f01a88457cbd75f9e6daf10048bdb9759ada044d0010e909632c603e5e798f5b54456afbae3a83e13e96503aa8d672602ec1221cabb39fd0125d8863345d28d7d89962e6473c1ccb31f66170cc54510ac593bbbf540af8b663ac62bf0cc1afdf0a61d62d35e1c307c8f8d7fc84e2ab2cfd5d30fa0ae01c3ba3aa26031d9ee2f28022d9bbd51a86415cee1d99e83753886ba985eede302263d6cd125dde5b5e3684aeb57e4c2a43113e6d23a7b2da9f0a7e7ad731e851fb1925c966a17a76e304c12046e95c286f9140a3d24ccbc74bbb9864124d1eb1962f2022a93863f7fff1e8f99bbb90903919f64514bfb58aeab1ef8b2dafdb7f8538c10ffb780caa2d34a6bd076f6d3ab6dddd22b6a911c04319ba4159e474d91db7f6400ea94581d713a803c5f7fd76d41a408428886e3231e87ce484a497b65566db73d90b7dde44c7ee571b228f9dabfdd4db588dcd4a0812150a8df8ecaa923fd1545daf2d0dc7906088e7412e9c313842905f07cd08bbbb1f9c0405d7aab9df241321457b8b31d41f944728b34885de7913734e4e7d246e95e54fbcc671930dbf1d7878d16a1ec23d78587fdd500906499b93fe130df3e54c1f2eac9a7addc3e1f686d0d28802dbe417743b957ca0f24134623afe35f891cf03dbe4ce89479dfe5b7740389cc060e18273c7b83f4e3d6504507ac2a5d46a725263c1af62fb861c96ebc21074b7b02eb089587fab56906c9d41647397e35207cd247e86f5bb3db9d71f90a46292dd40feca836df5eada2a941dc52847589065db6d9eb530010b8cf8c6cf495a4cf8094b4950d5ff59e06089edfb0fb5b8c63f5a8053c1b4bf59684bddee25931e8b3c3fb37b06e817799d10e7900baa2aaab8e9e185eaf5ece7bd9b72538e4946191ad31f31fefe56ac4af43b7d94b3a7c9836d9e8bdaacdfbf2c45f486ac7c1c785008eaf0335b9c8e6a51e3020d717d7a57dd3a8d0082f7b8e3c21933590f60c43cde4db9e901f01df534778508ff50867874f73e6389099af1ed861efe6a438bddedfeccc0faaf5a07475dc95b79baade75319d3700e180c958700831ca1e7958b5b7cd40e4df3cfb013e8926ad893d7dd37e6157e272b1beb26ff597873ae3f6308fc7c4835df5cfd12a2d0fdcf9db5d43b77874b188931feb2c38edc60e2a66f9043299f7c1b77909275658ef09ff18427518384aa4a964839e87164f831dd688533ddc3dd2c27ed8947a17f9a11114d6f3c959c47b0cbc0274b4ab363cfe0ee54ec463a26ad70a948c8633e61cd6b1121001e3f5296f0962a7372542c39b0557d5c806d7fe586efdc39aff99c47daa487ed27c398a258f02c4fa73b651767ead85169cfcb32d8cfc312511dcf72e41b8ba73f67e7af6fd9e01b0e2f5983d8ebced039d820ac8db8c74564d6742006a190091abda1cc52fc8eaf5d3542c17da6d28aa8e976a0e5fa00664c4a77cc756f8d9c69776552531623ec7de35e93805e636ca87440dd905f043db9d2c353e508a895477edc0c96f3ba52d69980dcda4f3c89b6f59231d062fde691ca8deb17d1aa1b51eb136eccf9ccc0f94738a7212c77c84593617f4c88fa3a7ea70c42168329217b2add24524282c6f7993073356b318b7753fa537313ca5d81f1b4bc8a0f", "ac51006a6a5263", 0, -141643227, 1537743641, "c2623bc97267839e12196b6497ca08d0a119a7e8a826a8db5bf9d9ef07f6ed37"], + ["030000807082c403014c357b915b5cdc61ae8a83859e4dbdd501dc2a5ba30be9a8feb3271eb6fa476e000000000752516353ac6365c27cd15f034e52ae020000000008526a63ac516a6a6a3d1c2603000000000552ac526553a9a93e03000000000000000000fb7f0dbc00", "51ac0052006a", 0, -294310016, 1537743641, "9fc491741c92e97632a7990387076c07b66c8a02d3c9e50aca8d752aab53f44c"], + ["030000807082c40301c5a3ace94ebde40f649d8008ed7f7626b445431dfbeb17b7e97cd8b8453891670300000001007694ff7c036cba13020000000009530051ac5252005100f11bce03000000000251520d132801000000000253007b120274000000000300000000000000002fa55702000000006ce031987db0821f984e5d59179b5d461d501b63d8120581104338a6d002724434fa24d03bcefe8acdc29c4867cd5254a102220d5dbae5e02e1fac1f96f3b2b52d819697e0b3bb1fe68fe0c53579d21ff2c0c892c0c8284d2f9a0f50748e46c9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009635bfd7b7fa3efd69a870b3c0400f5cd14967be55050135a49eb87f1055dac1fc1ea3d5d63e41b8d997f7fbabb795d0a670e0da24a2f677a71bc3d85556d73f617a6f72f5aed0666748a351ac19ec2b263b3170eba2d81f5d5d4caeabc9bf53df9aa5436c928d1196ce0824364516e20c041d32378246060cf3e75c0b85a8ef032fa51205ac5fa38ec130df2c6aebeeff2369db04e12d88b88a0eab7b73f1d1d8022d31f4f37ebbff50b3dce6eae922960d925fdff8e38424e4aff863d90131f6e30a01771354fea908b4727c0503c36deb0886634638f0caba637553bcf9c84310ddfae337d59c5682f8055f75b0c300e1d8e143e94576807312a64137434cbd4f82030ea80d98c3611601933a5efca8797cedda3ed6a297a4ed9e65683a9728dd7cbd030597f1c34ba8373b285eb9d0db6de3546b1089a5799d20a6b022d68d42e9c8c0031aa8559a2be7e1048e8d5bcda2bbc07c13575c4ad8fbbe936a8ca848e081669d032e0a7cfe66cd1496053b416d23738de3b34142de064437ff1fd71cf93a18e332022c84e526013e08563e1b311e1d79d52a722fc6642655ba1e27431d82551a7f9ef444c72c9fdf0c789704ba14292e1169ba0a6851b62c03985866e860a2e2c20b47d6c4ed045ca26522620a0cb96f167036c2de94f86388ba7de2a6ab5be9979970bf5c034e108e3c58cf8e07ae47d04713d800e09b94bed6ff16f5ed306da9e4271e42e47e5c664cec1aa39546c21c3fd77ebc57a3fc49bf44382defbcb691758d1e6183779a0900144094082b3aa2dc42234adc3bd315a6c2b2c8de76befe3a4a21c35882b3e89150655e798bb68c1ab2c8a9b140d1c468c3f36696cc4671417df8e731c010c4d4a4bb0f8ec01c61d9d4f7524d590b5b678e43ff100cd5c032ff7da25a17733d99531da7089438d699fd1376f6c132d21d608ec462ddd26e3da8da5e857e12840dce52a8dda0651f48928f46772234881abb78aa4e508a898d552615fc7242e65bb30e7d51430c1c6f61cd69fa8d7ba1c85139204865fc0965b531c158ad9b0d81144783782bde21538d27a82e0ac06697f5638b3d5919237bd4217c7c02b82db5400f736c7b50467c529e2834a43f87b6cb4300fa232f59762f80485a613e3210ef3df11c7c9219da340997ae9b1a6202711fec3f814e0c405df5b3acdf964fb6d0e37bf5cc6c5fb540b42be8a2984a872b30c96b9fbc0af5b8e26038ff4f1afd2079eb2c45e8d3bcd9117827cc4bc7ab5ce2fcd4f20b701d98b4bcd1a2127e4403ae679b7af48a03c3ef84812e54a03fedd78842e0f15f2e731f0646c3a49c2a7ac676a43fb569351c0fd8eed7553f0b719245187d1b4412881afa0b73e63971474db4ffdcecbf24c07f0cc1dcfd36807eb1554c7cf919ac8e9427ff92dd44c47cce5dcfd61cf8337ec3981b48d7ebd26218e1cf59e7dcb36ae9c48d867c625c3472ce52289f59703ddeb6c82edf54a3ddd66ce83b9faa3394b45bd9732e9422596de026458b3cdd1ec47b7e65d329f124ff710a010265a7cbade33ab41557fab80d9f47f148d09ed7b7c3613ce288251a359080e86dc8fa9742ca840777da84af81907e4de291cdd5ec92bd0fc9b9d23c097118025b77b915663913098c5131993418ea0479398ba7e942bb88d8ea23073e4412bc6d01dac1f568a2b9f113c101e4161e4018e876c862fc8d83cfbe855ce9a32c0a77f4d3a2b3dee7c5630c92b5686f022871231f122e819f7444c33a87e5ce863883923ed7d70e0595d128eb39b4565e346e8037a2a63c4dad338ed18fa8965ddb936f47fca62fb19e00c95acd2b76fa6c0ac497386d1589ea0bd2c13526d5ac1607afb956696f73273d1d16bf865a948c69fe0e54b092b745ec53a4a9c03c7fbea8658c08bd2e72b78b335f42db0d75cd53161bc5682880182c499095018d0bed143e5fee053696359d1f795ec47a35be7139b792f369b5ed22828564ba3ea5023e1881e3e9d9faa6f579e07a106560e443c6084ae0f83553e5f11c610024151a42aac54577f26acee8374b545f2e4ce5a568cc8c53010dd1bffc33785373c1087d67b9c729d426d73c43bebc8260ef8cd7d2fc8d2e0011f11f1326234af4a756d227c6b6428da525e7c4c3de6e74439edd844e37784c055a259ff2a6ef95ad4a8ce0620919d72977f2b252cd734ff6543a37dc80bfe8ff491a4e749d5108d019769bfc5760e689733b8f924ea231be2ba89c8b100ae40abd88aeceb0b7fcf573a6e6ea20f4a903ee421336c4b60658327276589daa0000000000000000db219e01000000002be733c4cc13797bcbc2317ee99673c63c9cea8f40321a1beb875009dc8175a2928252c487dd2e4cf5eb0350b7fa091d6cfe596f3bad47d68520177d1c340b261ff834690b30342546b9f5df8a3b31a33a3cfc136b936e62d59694c0b967c03a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000676243906418f0977d95d29920b4c39f78b774faf3277ca773125c3fc3f352a4cac5a8d7e3a29047785f7438160eb8c161828f13bbddb8c3f837d554ba63e18232dded5438581992038223caecd568a1f48559b87b142799b98ecd6a65981abbf70c686e06bff5a41e381e4205df7d2da098a33ae0de9131d39f7a919af118bc031f43d19ea7800dcffef9a80247626f6a6e7f7afabc27f870563d34fafca96b460223036d37f2fe9733a2e5f71c3fd0a4261bd8077cf07a90a1076e6c01fe0616a80a091803c1e3777b67bf7d81e453bf3abb507413c8853ecb479339cefb33ebbe115edca892bbe8c5f0e17142e6e4296db94ec3545a95ad5900f9da6aa9cf091f89031409fb7615af0199d71985a598be330d23bce6b347636af82ab58897fd535b610228a2c5ee62c54b682ef8b0aad6590f8474512d0462c05803b96c74856012cb8f02132305a476b4c24fcf7f61db967e93acafc73c6226b3c81f0aaac3d75b51ea30020137c287449b018a69298514ace9454d8daa504bda160ec541fd36a40f0df82f020bb1231ccaa97ad9fe539befbab2c66b51a16147c382aea00780669a19c9df55967fcb5439fad775fe0c2e1f12e51b8189242ce44882ffb80743295779ef539a64870df97378106f209c6c0bc0e34d3fdf8bd4d1bcb457deee28c9f4ef602b471e48532dc5fb0be60e9498f884382792a772120c9225a23ab2b5b12084c96d90ab411f6f872f4f8d4f653e7d0971b11e8f1856924376c4fa6ff16436e6dee73f7ae37be7ada53e9f1bbac94bf5aa090b16cfd215d681ac4b1c3f73894d9b61f52fdee3ce1788bfaa422d64c1c533a503b407aebb87660a83bd08264ee068180f032cef8f8017c38c6627eb28b2a1ea107623156e0f6e4cf2f9929674b2efb9fa6e6a661dbfe90204ebc1889d9a2edd9e03777756311847c7467d2f29daa3e06807531b07a8173c90685afcad7146ce3302f5bf6b7b422ec3c02ed645a72a10b83d72d92b21578f3c64a0687627b80d94af6665502be4cdb7925ab80492a5bc0d2ca67d332c8ca7ced9bfc1d7e833a6351ee5cde3f0245c4c0b06edf7c8c064c29153bf9ee1733712009c93355c0f957070d70fcca909f350458948f1a5b2bd043b33af918a154c26e79ffe066749d7044084418beadac6ba5aed1c65e384485eb682a0e4d1292b158826569559e0c250495c90a3c1b7bc8592280c28021b702963a53c28617851029a36fcbbe692439c2e760249890a59b4a4f63d5f2a91e4a084f7b9c995600d7aa6a4b5336bac07316940ea73d4a8f95ee9520a48661914f9e862e2958b7a9d5c673560989f7aa269b3f8308828d996e9f61e19999434a6c35cd898c751542249056fba25b79bcb49bd6ccd20894e417754877f0ba20a9a744e4badb879d13c3014a7baf611074c423fa47df284e171cbd916e3b4a8d08413bb28fac98bbed7b86234ab965c0b1e328dec8e91f64f0548540ede473e25b74ab6b6aacef631d1f33fd153f39b1944a579a60132759f29ce1baaee98dfb57d1e58675235dc5339af686ccc9156b8f86614052793d0dc5361d5dacee719fb7f3fddb21d38869bd3730ac06400a63727b0600cb77c5c463871afaafb54b7b0e032fbf897ae3ed86754077d6c15d3847d75142f4510c692d8ef25ee223cfb841e1f206b728058628e24150bf6ff60c819b07c0cff10245f56a00b0efcfe940a72320ff9ff3875926db02d0c1397b216aed3afc759904f728dd4dbdde2701bd2acac03e76e69629b13ed20c8008281815103a86097ef645b7eb657fe112add43917bf7c663c75a1f78268d71b925a46a4389184efae16f79bd67f499431ce971252cbca565a0de39ffb5e9ab2bb8f0f83e5367e8bcc453d57d6833a9ec57c8ecdc8f6ba736e5b1c50c31867a94e00e2c10c107036afe804e03a010a00cc5484913f4fb88331f8a5fceda37d82eb50eb7985efb09d8a9d966d606a9efb807cb73d6aa318f13eb08ba301d879d99d55c6323bd71e94210c2bc4617edb6d5073a8938fdfb036fb8f74bc5b0b4289a99fd8d6565ba9e9088b01db2f344feb7365b3ec0db6eba0bd857321f18d1d3128028a0a91783e1b0ce611ba47776787f8fa8ec4d212aa943577f991694ed88e0f0d9b2155721bf39bdaf3f8d3929a8d09b9b06aa24a77f0838441736ed34dc6f38bbca6096673321555ed5ce68098a3493d6a1e4fbdd1f4402af06107ac7007df89583da39bb70d904a0e65046e6057ea7fde0310b4e565623c76257a25e6e71ed87738df82c7f0000000000000000df4ade020000000042dd12d775a714a01bf481528d9aab9e7329b0a89159880a9e4017079ad8bfaa7806d65a0761f97c8737c39232eec3a8d92c7a8c93311f7dc9d00d3a7a3f0c3f7938bfcb96add2afc8b5ea0263726c149866f4bde6b1c29d13b6a9659d11425000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ca98456b24605244163aec7211ec08e7f2296e2b966b7b1bf23789d14963124bb76f0c7367739b283e353479bf9cd0c06dd8d298a5f34b13fcd8de3dde545ae5d959b89ffc0d0b451a89e6bc5b17353a09db7a3ef6e9a64f5eed3b5a759a4cef2ac40b5a274ec1d25af002ef18c872c2581a3b27a7329508b0dc2ed65da6e608032304ed1ccb074afd7fff9c40bc5c09ebae79e78cdeb18f34915690884065e506031a2b9e3565bd5acda392d71b7014e2e12353700429ad8874d1cd46f995c89f780b0333210dc1c7ab3ae191ce1f9d0e1595fc059daf11119ea93484b6abd3ba10ed67edf020dc4c9cec07a14974ce87e4d2a50f73f8de66f17ab81b38910795a9680219da9e505a15c10db8a60e722d322ec00d921869ccdb7652e755d427872c7557032654b8ad0d6e505f6f2d7abbc561555e147c6a833a9d09bd72d55fa0d3f6bf1803180d9d4bc2425d70bbca98e77268e1906f692f46bf40361e83eea13399d10b0503041f5130a3e953e20c78764c0c7d1f361eb5d07df293697f6dbd6f8e242d929b020d65477e34421c9bde6b0edc5e826d6b95bac75279fb5b19a0b067e4e2f8f3cdf1051eb3ea34191c008d69b2df36d42adc8f232ebcede1ff78372706e5042bfc817fe226620e8c312edf7bbb415f516f6a33c7dfbfba435c283cb9983f79e236b362f5552edd0f84f22e5236ba45aa799b57e720773fe7b4141bbb3da8033bbef2a574d98171ec91061830fa52f59b7e26d0a9d575e9003e3d3fcd8eeed247a7fc1133440db119d0b379203585a113476091cb15aac0e72019a7208fc3fd3c44b7ca5032b91f144dd03a944a5e14021505411af938b1d74a86b7f856f663933fcf0e23880b82ed6797d630baec93c735d5ed606032fe2f0b8532b8bd08ac9d444143de4aa20450acbc698f4a40cb768750f1295f4849f3ffe073209c910c0a838ca28803a94d56fbd497a8a02d7422f03996d56ffef09ef72f685a1d8eb20b242ecfff39a2327ca51c5727e8e342dceb0f468fe1bf47aebd5d49949f30ea2afef3f99300ac4159a70e79c28224c1c9cba87f60a08b7f48cce3e71b2f0f98b42f9213e6f7900d6ec0687f4fa1cf73e2275d8b66b234e81d9c9b22771a3f3e3b8110f3977a1aef222694987771d8936afc064263c99171fc7005d7e7fd8dbc57b252e6458e20ea499a963578dd297a22c0bcfaa508231e7fe8a894cdce25a632beed297728b0596baf1b751879d304093fa8f5dd95f57b763cc99ce75a6b124910427b19e4fe83643567b953b10bbe581d8379994e23ec7acdb4925749469ae1fd1d9a7b086c09385b1a147fbd1d8029f21e2f0e14f2409adc08bd44220c7d815ba02eff118a46609fad3056e4265e0f9388eaf4c82eed88667c8b8896c9a295a265356abdf46244949c72996c1f5edcefb8e6ca0b0b6dccbe29162a925865583989c380b231cec7de389f2aaccd5e0d8076659e915bc7db2ef1794948b89ff0a6e4d9548fcd8e836eaeee8c861455533725f443aaced2ca80fb4a1fb53d73f8654f5d245c6d3bc8d4b13ad52f050444694ad79de9db4887f4484f9a39325e536c86921dcfea45bcac5cfc3e5b4a5a03aab77068a7999f3171d13004b374e56a706729718764a259053742f5fea0c6311efd464879d790ab64aa7a43472ad2988918e9afe873341f4aa4762aac96882b7f7a877152d8e77c8f15aba4e02e107613677fb28729f61f49aa2bece4957d8514de8c579814af0b4b6608fe2fce544395fd36adc9a2c07b825ed22eb7923bea585e50e13e21e942889d23595db4a178406b11a98c090879fdafe1596fe7d91766fac550f84df428e9d0375d1585b12fe90ba003db55e4ca62b2eae1d45519396953de8e2168f364add7810f658efe0319103b2e178ffdf01a62842995533026706db2071e511b28944b36a0b2257a675919c1fdff14ff5a06fcccde130b13395e09e0c75925c3c725a05d74d4f6bc228d5713d71b48f4cff10911a309feff0782cb6f7616bfc2b9c3d814297b660c6ec61b8c96799d9c19b0abfdde10a8648ef256df374f9f9ea490ba53171d895a11508dd129a9338bef5c0e72d15f1e277f8716863fe82d42d39f497b732d87b43f9c94ec08260f89060ebebb3cd94fb6499472d3a674a40e0e3b3b123a2178b50386ab27c8ceb2214bb78d3caf05cac7f27c52fcccd64f4224052467dcf427941f1aa458d79b56108124df22063953bf66ba750bfebc73bb9ad96fb89e27b2558dca9958c96ae3899a2ee92dcfc4cf75e211631c042c5b62e31335fd9bc374250b4fe8f4795cdf35fa0b85079a8c8e627135a7f9530aa33872591956f0a559630d332d04542bc998c6fb9583e42bb4944598604569c07181ea28b3e8bf5a8a5b2ee74c2cb5ad200234b3dd752a98e953d404d70b", "6a63006a00", 0, 1443795217, 1537743641, "ed013d233cc9678ddc44d37d7dc1c79ae2af95a9d25c656fbe6194030aeaee96"], + ["030000807082c403045526942d80f27291d15c245be8490b5bb680ea6c01193a078e5ee656c500100d01000000035152512aa4d7e1aa46fd4b4de57d7d8c4dbef15cfd3b0d2d3776156f76cc54f3f7ad1d15f198340200000009516a63535200006a63ffffffff7be8c78647e3f6ea93c399840cad3102370ea3b1721be1fd121b922bfca463b90000000005ac63006a00b713ffa5681134b9098b7dff0d28e2abb1d02291ce198455b33934715390dd4436a6814a020000000163eaf036b604caca590100000000086a6351ac53516353d3afec010000000009636aac6a6a52655253bfacf7020000000003526352f412860500000000025165000000000000000000", "536a65", 1, 1362626858, 1537743641, "a61a80410267407d88aca743a17a42f5da3d1594ef8cd9767c0335bb95f17e4c"], + ["74661d260142bdf6ec0e16ceeda6a39be86a35322cf38d49bc5c5bb3a43dfbdeffe9c0b21502000000007239ec620368abb205000000000365526a9cfa7503000000000165a2ad0c0200000000026a6a0000000003dec64003000000000000000000000000c2bbc88624a484eb1036b3dcb115a9451d9e1966738131089f70f903a5646217c92115d6b6ba5cab959148bf86d4a8c7f805a0033b774844a99ad987a5741e9915d369cf0d597b211843eac1d270f30754ad1baf65fa73ce9d7d76843b9ad01c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb2e4819b857a07e0dfae6bfdf5a0ab06b075e39a6dc0d723e533b75648d60c64812aafb54bc76296fc1a06e099165482902b3295d8c251df94c3b20e79ebf9634c76fff7f8e262773a6d140e55fcddd05fb6543f379dff6e3117c64ec3ec045f8cf148941441f4f8908a3c6720fe108b1697eac81c3c1798277c013b2d6153d0306a9fcb51536ea936972ccc5557c4a29993589fe2dc8ebcf7bb5a8caff60bb92022cf3d51d13d09ab1a202d67faff7f20395b3aa068ca75f5dede4b0eead99cb2b0a04e706a778aa66f6d01a0afd104a2617f90d65f806ab0ea6157a5a527b2f4829ec84f0e2d7fc67b2782763ce9110d09a82be1d39d0e3ddbefe8e66a493068fed032c5c4d24c060b9599494a360976efae8bdcf5c36637099c626fd8f73bfe74ee40320f6ca4ccc70d8921a0659180c362b8f7a7721c4e6e063d62bc5a4c834e66856031f4f653e4a665b40607025881b4ea417caf537e6e0414f5826c948831944a1c6032ac9a5c06ac207262832a247ea517dcac802775c6b8effd108b866ec50a13bb80208e41b9d54a634bdb57432847fcbce473f51fea9cc597a12fc4729485294a5ec4327a82e5f24c3406e53e9fbdb190dd9077d286a1a9ba71809e945e84c83916b48f768d664243c046661b57be3052ceea3c54d1b7f94786bc9ec891e08f849debc0b2c978346d35b596beede6594f50801c122ae955dd690cab8d1516a577c5acf86d543ef1e9375f23cbd2092e9522f6c2369f71631e5da31fa45dbf401cf4b1f045a9b762d05bf97a2785307b38e7a2324d58969a515d87a69f5d4d68e9b724ab94374c99dbdb99fc5725328e5a881787809ec7c7027f696827204615bcb051b5cf0b4934f36b3b0e8a8305aefb8b4ee7608f411dffe511f0f7e143d96db069f03e0a682fac54d60b960f6492fbd3bc3f1ad00bd8ed3043560182540c55f1d9f8d4d2ee0b1999d12f33e5eafcbe338933c613f51a71bec0c8088fd02b1888f496b71cc92086b35907cb873f44ebe5a9584506908b738e7c7c6b6b0e9110b3162f4143380ffc6ee8056b2adacce8106a26166e711b4fdaf345e4f5d581ebb26e3e7385a033a556610e84ba12ca9bc8d1d22492e3bebc4dff5d0939e0144bf1a9299891c0c334b82fba3d2db555864b1bf86d2945fb9176d2a148b9c869a7855fbeb608aa6c6c5133ee308f32cdc2acd027f2595ba61eb2ee152da82dfc0462b030683f01de615c2792aa4a23b8aff33cf167d0faecb1bde81005c5600374665b83d81652f50c9cb4cd5726e55030e41905336115805cc8251f5f0954d5b9a571a195f4809863449561bb15c705a2820c3c2e7e1c1fc56122972b4b2a953de4e7fc0dbb28eef3294fdc34de8b85b1c6a826f80edc2afeccc11ef4350df129dbfb2aad0e857fac75cc7e84f9631439d5b1d2705c5a5dccf7b310252d999f6c0651e8b40d6b79821be30545dd295c66f0ac5cde5a461a32c1cf2bdc176cd75c1935857512d6085f22c915be2fe0e64ea84a04e31158c6fc465690ea908578ca850a9260e1e825dc81f419198ba4e55be9d4934c12e7a1632022a119e04ff18f8689100a702560d6373bab01014ceabfeca0ec07bd43aac8afd3f251ab3d86c3017f06d3ef4f65f635dd1e3b5aa452b4b6e77068516fd423cb8993f2fed23a272f5734b5141567cf09a376e4f1fbf3b856043dddb81efcc31958d2ff85971abc0c776f330a1c358e6e9759e2ef518906f94bccff997ddac0db48a9832547f0dbaf13ae08fdcf1d128a486fa703d0355a35cc26114645f520c63c0503186cbba6533c3db58a7c5e69ef5b93b4be3dbe831013668315d08bd44b01c574cb48612e769b94d104a5984e3a7b9e585add865b3a4d09041d477bd8444d6de87c3f55952876669ad3d9c55f633b24b703fd5c4d3606231108cea4fb1085fc35f66857856ab354fa1da39588eee53275b85c3a1f9bee470cea742531ac0d49923451262e926c920ddae5d6d3c8d84c972e331a5cee6b2caf25858fdf259e9a5ccaeaaa69987418e8f2c3a4b3ed8759cf541a7a007d98b7b951b37b804e9b4f039f65d63851ac1af7b9f5eceb11d398fb45a6ceb9511b4e9376c7155c696bd2bcc20e63462bd3a87d0b0180746da02b616f814bd83c90c20b3f417f12f7219f4c2a0ca4fecfe90c9444c4310aec769ac81825600e02951afa7dc05351dc7b4ca4f73baf483c17f7eaf7b7b97796d8a61ad4bae5bc390f7804ce3bbcb28c13e05411863ba67c8a236a16b50298a2c05c63f448218bda968fcf9b3f503000000000000000000000000468c74a91350b253707fa958120a93020eb90d3af228c4920021cf17f96fb3359161a2ef6a9658c4f87cbf9dbe11fe33462fbbeb053eed8d3b8b676fb9dc0948ee0b33da1c4eb2be08b04dd1a9f5f134601a3b3141c26d187a3aabdf53e1c0620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040aa57763d6a17658c6ee273bb3ca91e050e26514420fb58b09667d1e160e0a8d6ac69bd22dc333cd2e45c11910e3cbd815739212097170c1e9b26f40c338dbcf6e5f955cce94051601c822292d78f920338752f6aadee140d0faa133e3eaf7b4668a5971d08cc42790bca64735a3daec10f3e71a540a39c398705e8f2dfa93f02209dc0c57a156dac99f2669a3ded04908f5c23cb456298ab66afa169802bd02302194145b2b9b8028df553000669866c9228f2c7d741041e5e5ba14e2f989ee79b0b059204f10e155897095961d4b76e68dd3edb7fe4826f52464ab10eab8ac8a64ae83ccb6fc72e7ce47166913841856877ca4d1cdec3ec5cdd695487313fd19a3803126c92aea8fa4440d1dc30574512df02db887107263cd7ed009da037f5c561e6030d97a69cc436f2ccb8b7d8ef98c3a649412c872e895e3ad574c8f0d9d7133d550206f4fc3f00d4cc077dc735abf3eac1e7a17c09dcfa2d5de1de619c335540993f03146e8792a22436181887e73b8ba4970f266c4ea8d9df8b73c0d6d2c2878620970230206cb68b94826d639cfb451df1772208c0fc738f31a5e575674cf5612d7cc08b1a16b7b2d3fc1fc591c7336bb52df1f38306fcd6a692b3b1fd8396647e6329c9bd136c8f491d46cdc274821bf74972a1663c7e374343f229148555c8b427bbaa94cbcc3788b62b4a1f7a508511bbd94c7e7fa94ca67091b9f69f399f27e1a8ebce24e7fdbf6c9aa44b42f45d4288c09ce197e816c97afcf828d35b764c48649acd4ff652a9a21eb860ba3b2e40f396b4314a5f66892dd9cc1ac1cc6a72df455272c38df85ea0ca06369fc1a6f9eeed621b30b8ad54b367b47ac8dd1544eb2cbded990099161e279e1fa95b926c3d10b5cbc7a6976bd64dbd45a4a3fa570a7dbae711fa0d8bc5fc6af145c8b1f48b09d6e2c9bdeb67e7b0458db7943c6e3b0f362294a2c4bf128dd8f6b7c22ed2af9b0f7e537168df58f391857fc52e3ad8bcb67ef52fc8b9109452cc864dfafc542127ae278dab94ca1da700f9bea459e62cc550dedf01a9751e223f213842fc9f2e374c2442000ab97600dacbeec44ec3cb0d5d92aa00627fb42d4eade7631dc847fba746d67dd42ffa4436d262dacf226ad60fe3ed7cbbe67e68b8b67787e36b5bd0916864cce3a17232fc72e14f7dccc5aff15206dab779c526dab683a8b060bfa8faa64821f6f6f04750c3fd4f58a05e3d3b86c0ab3e93e06021888e4a394b3ba4e009ae4d807d4b2b472e2d0e1b0398c34c7ba2e19e4d9f3c2ee55017b7bf4616ef07ebf0b14d4cee791faf90326d3430682856ee04360fdbdcdf724152b84cfd4ff2f00939dcc845483b3517a2a058afc7cc0177a69d5abd892f44b322983f7e6592ba15da146947ac0af1404fa71ed0a108b1944e10a8f17e40f1016b3171967a333d1a98a3b09596ac50e5ff3ef11ae38d5f36127345ec6c6512c5b76d0f21589a14ef3ce5d1df8051104018db11090fc52a6169c3e84458f35ee6ba694270404b771435e3ce2d5c95974d9e6ac4cc23ff452ff327243e2e29f8889c203b4ab558c9050d5680e5e43864960fb122b6b1fe5141b78ba759e608ecd5831bcba1d5b41cfba1d087d67016232664be5cb5385f8cabc550b048ae6aedcd9fb1762498e40cd36a0fb561458c645e8650583cb6f6f724732da8f3339c162cf15c0897e874e8be838b01644f8343e1e2f9c59a7c3d0a261e2f3d794cdf2e2cb28259d5ce180f79ccf6dec3df0a0f7f2a3726bd53b3dd4b80b5a0d9b3edecad70a2e67ee254db017533d816dbe3ed8669837a1fcab658c4d6fa5448eb7a233c9dbeab5f21511337e3e269c858a8fcff31020d6402773bc3384e5ba5351481a4159df5312eb0bc433ae2a8f0d5fbf79ba4f8d80d0a5921a9520828fa0f882200c8f9fc16931b641b836abe8f27190dcec9da93414b36b78de51fc58707d626044df94ba71d599aeabe2e5a5476dd8e15678d08b279777dbcb5180b736ebb777d84543ebaf55ba3e9fae54229a40b2ee9a4f425cb529b1265c5ebce674849a94198ab5f1e551881d766dff8c7d4c48f658fccfa8d4857629651a83c4e6877aa21d3344abf936a9b7b12164d3502d820cc7aff2bee593e2bed4fd951f360e9fdea42135f641b384d9d2cfeac73739ff28aaef36b89c907c84e449e22a5fd421f1538c594e904b0783e3800de7f8bc76ca5329d10c9133fd9b0a1bee023603fdf3ba01db969cc83a8a52c67a90f74d96fca2c880a576e20b0ff369f9e53c4b336a41f3df2b5761a1e0d040000000000000000000000007686e061511d9d5cfeeb694442243e9e28275d6a33f12600015448b27c2458c649b3e3b58f939eab60042879dce2e4771d06b346eac15807b834d9db3193d6d12708bc3650c7e3b01f1d4c6a4eb7c999e96157e2068f82959a0641157bb88c0a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fd886c8eca5be32b9697de34e21115c01a40fe7021b6ed5a960005719b55868d3380fd7b06ed18b34e98b2c526bd91f0928e2241d1026998efb67bc27edd349a66c7fd9e77fd97eda2e00697858dbcf2290a3ca2309785254eea0ff27fb5ee6e9e995eb345ec1f95803d9874dbafbb4b245771efec056ec1e2cb04d3984321dc022028f2387b1760c91d8a355ca96ed49e2639b7185810647b3b32ab8b7e382f9b0314f5cd5e5486180e3d30c75b8a4ab149e1a6007fe7b786b9203e793c5b5fb9a30a0231684f0da5ed38e9a7c81b7a96c4e1f670a65472b4df85bf8ca57d2c82fe6ecb343270d3c81dc9ee5d44d1ac1085f700746d84e38bc3c6bb1743d46fdfdee502188f8281b5be254f404a7a8ed018da8531e80035ead8822bc6dd63c1e35112aa02156bf91028e28f432a482c9ed27158df949e1476ecab93d3eac8884fa3a9b7540225f4081e8b8e7244acfa44a2fd9dd32fa369ffbad4640f0bb7b228c788c67cbc0209ac7daed7a1ec8737e5096cc0ed70bad154d2ef81fc7218c0ed147c5c78b6cf0323d8ee65466422bb9600d6939424bf625b2473f4b127c11e09246b3ce2b2c4cf6a617f5d7b3d2a9883210e0aba38e24a8adbb6d4857463e880f9c780b652f7570e4460812e84b639b9fbec6364cf6a013b07bfc9d0a6adfa69c363affc70e0c7bcc4ea296b1ae9e92039a5bf587e40acd807816da5f8b7e469e92d9061d6d4390f864dbbb6404f105da11e60c697530f6763b2757063c5a451c94e43933cdef39e1c9e5e29d0add68db73834204751bd71bfdb690e07814597c9ab179defc36309d92ea3845f575c2ad43982624c54d9926c3ece82f35cc7bd5e92a8f9c8f10538e152ce3b67865baabc37e3f7bb00ff64bb22ef4941bcd8d364375ef8686ae94ee3682d13a8532953460d3c4c41d733cb2e4a9f3dc618cb51b580b4ae92116b844f79d4690176203d646887bc11b23a3c68155bf086024721b25b964bc884bc0a23fcc1492f32f5c7a7efe077e33e00946de34e9ba9d913be4ad753d1f0e9021b4ca606c68ed5882ff3c676a4e92bb0a5a5270d59b661e492e470d7a9a8f6839eb15c89df672e836d64f6007b1473a57330d3f4dbc8fd32e2fb32782cd5769b887c0db447ab69230e1b38c910519246a70b7a6ba03a52a56f7130888e1834d84fba0441dee27fa9d175faf2adc5c025ff2662a83d6e54219cd27959f336a975617c1f95efb38081ff2939c24bc6b390bb4bc1f7e2a0c32165e4e758b659c544ff31d2974031f3532042c1cc7be90e7a2093e62f2989484be1af2804e0d37678b7cb86d63d1b4f8744264a388019770478176d6ae9cf4e20f58ba5b0a5ef960698e9a5294290f988ea60080812dac6f818269fd41ce67a24600b22a49a7494c0d4bc04af612d2ec6cd142474384ab65efa7b1bb479779baa1032210dc8fc8c8f5b4d1ed507b6966154116a090e3a0673a717c8eadafc13d72951f7fe89af6e8389bfca8e72d895ff17822d44899565e9ae9a825af97ff2126d036603e6df998b0a831bcff034b1f97ef11f11b6e1617b0d6b59c2252afa02b41985664a87fc0cec9671696290ecb7b9bf63f34e533796ffb40d82d0c5c147d8bec2562d73f193dfb47552dd2829de48dd5813fd334b40e1816c9781e3101e242430729960f275909900401cc95dcd9aeba5a5ffa76c50a252b09bad79b412cbce18f37b1babc90eb82ee59f59d11c223898880f4e4b2f1ac86da8fc0bcc8fafca36483c0189b87945a69011289c843d10fa5df6502e7e1ad88664020c811ba49ac88a98f1dcacadd40f359406123eb866d66944edd40363e19480207ec1c2f9d890cd92e1b44dae5a773a813ff00a2ea02cdeda294a4c276c0c95edbcf773e94344dbe9c6c1a4ff23f3cc0e4eea2657fb7fb7a893e05f9c17110ae68d938ca1a0283993d47dc8699639832d32b97b926a0f5b73125f3e6f2232316bbe5f4f8bcba0b27ea12635be94bb89fcf42a155457454a25609a3cf4e9d0786efffe5d18419c858e9fb8917e4a25ff9d4e5d6a8928b40b87ac5149fa4f5471892c4074ad501292520e42875bcf2555005e54d6e9f6fda3398b3fbad945cc946885be12686de8dca88d4f0eab73199bb0f2ff4da2d99f61f815735c9060de539ee4a19e166a193f3126a3f4153838c31e3694904029e57de9eb7f4a1bd008a5df58cff359f05f5d9fc4d9f21f3848c31e37755e59f056d1a166d6b5bc2804ea76467313e047d753b8cc6f56c1d27e3a79256081c9641d4f438d95b76792cca168b363a8dc7689dde5c18ae6dc6acd634fcb0af1423f8fc89ed35c00be54cea298306c413645a9885863d843e89bd77b1f7cb5748c88189850bf5b06cd39e709d3db3766b2ff62f61c92bb0aaca3224c873793fe2cea30eda20cc38bff0c", "", 0, -1023941094, 0, "f44aafa4cff17e27fa25f8ead1690093304ac3341fa047f70d75d2d02820f947"], + ["9683f2650213e092d80f170afc329b957b0df005e5d99f0c725fd9b5772dd93e0d7cf66b050000000001acffffffff2e57c74b8f1e09e74d315ca2d7fddd06c9360c46e6e6fa0fac07e23e6b1df5db0100000004000052acffffffff01a1599202000000000963ac525365530053ac5fc3fe74029125e002000000000000000000000000c98134bdf4487525ea60cd7ab5b16422456503997f0487c830c74c9423054d17bcf93bb4c3c644c5b9f18502e8e92fcd86928ea1cee391ab7948a6e770c5672654301ef4605ed36030c35364784dbdfad0002aef8d0bb24fdfa786dd71e6eec300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a70c80fe07f34540b9d6752529435dfb2963d51688d103fbd2b42c1bab5b7a6bbc65e4ca7146b7b459af2417bf6660af81199ee7f32c003d000ad78cb9ae4bcd5bea22f52d4d208c9f98dbdd7478cf3b9ce5616d4374524a7cba0c5d01f0e9e4c4689bf30102af0f5398ac99c82ae873373b3fc52799b6dc6d8fe3e07049298f031630cf2f458dfa66daa875381f740984ff1a9b0fe5f4594438324dea8c2fae6c0211c5788393e6ee76633e6ba80a398cf920875bebc224981e31db46c2412ab3520a05ccbcf4a104158f12a535ee32d5294b0cd61a6660d0bc548cc3e3a0f8034148721a7decd7304018066609d482cb7454726bdfde048bb0f42b3cf4911848782d030feb0d39ca3835d202a40129ab60794f849f73eac639999aeda64f64c9f96cf50220757e33585d8a0efb39fd782fdd8446a1c9838b93bd1e89b743f86e57fedb5c032140b62bd36d7adab5c13be75b63488a70bc841d96b215744f700f8f43dbfe5302058a29beb9dcfa71727bef253d81747d4e86ee4cb133c6e710bd873d977961e10209029600310ef9c79f01629bdea60cdb150a5dff36e00f7edd1dd2fd34e004289957e4b24d58d88882069e295a3008bdbd47785c44d4083c505702a89833860615b521b3e0ae2e6ccfa59574cdf87768d6f60a1c7206074da3e9651121ab3a913a163d48425dbeb15fa50d50c0490ffd4b318b50849689f09cd123f197ec7a7d8aed1d8954b0a468ddab4bdb85961addcd1238b7cc82f63f01f0532162a1b2f78262470dbb60c4720a2d48fc5e03c507bc64d92e29efa00f1f57a4b2767dab38dfdbcbcab166b7126806dce0f3519472672f5bc1ab45682b29c6e415bf69b999029dd4d75fcbb8f8d75d7e297425d7cb8c48f9abb790633772dc70af294f92cc718f42daf52544fc289ca750974a82deb8f8bf5886ea41ae2ada90f57afb9c12ce71930b93cd77613dbc9eb8929b02fc59ffbd45cfb327462136f81a9eb2c343599c3e71165a3c91d01fd5cb7f8f31d273d274eedd71f21b321533f495d51d8d615fd4c3d982a3c17abbbca96b708042424241a98dfa120308bc80a882fbec2143c346b910c97a4d22dab1d07c1d4d2db2f40d31e4657cbfd6d0e8e3f2c742431eafdd8ea01fccb3cf5de29358360a3e2e424801777fb5f0a7cf212065ac55de37ab0193a1745f1fa9eebe7b575321123295d32d35059730b185ab55eea0b304594ceb70dbfe670b575e8c31e5a59f3e0d6dd0f51c72d8b4fef9a835d709f4f5c6502fa5eaf2382192e78b29d8b23e3b5d6d8b431ed82bf25fc75da38d8151d2461d22e029d76d30aff9f977ed691f1fb146a6391386f8e876a5b0ad6d471e4721b07fe911ffb00b8e70e42aa2724779f9bbdf86dec929a0e5250ed20ca14baa6d2a8dfb906ad80754a4c257b537909eecd9a742734625a11d133bbaec220007b9d19f7d021b529a389149255e7b94821f935b55e085bf0c3a3e0480a99c29adaa788de430daf840d3630192b5cdc99a232a5fa1f30efec77f956f04c9a246ea849b94f8ef2e349427cfbe26067e7382c298f0dbd3d5a80e55d184fcba3ba177ea1fbe21a957d8c887479c9fb9b258081d16a2f1eb56180b50548a084239c4fb9d955641d3c903a741c6b49a252701aac278f0fac00c9d4338ee5bd8431cf93fcc9bd9478989cf0d1d61cf76d425b6ca1f9991389e495cf98751314e39e9c885167e15eea9107f18f8abfd0bda7ff049175516efb562f6fc145b132a48fe9325b9a74806827d25c3d75f828f6351a204f9e77fdd65262ff7842d71bdf04f62c188b37d0a738f4096febd6be060a098fb558cd1043be88abb1b101cea7c165771dc727526edda1c336118c099bf19ccfae3debbc592cb16fbd5c3301bdecd1212dd03731cf89eb1f76cc9c168fe1481965695a214810b1b76951c48e6b6fc6884e79dba5825c2e4a0f13b4e4f16f9b6ed5cf809b56d30addfee9141994fc285588d3eeb837e8a9da1f3fb6cab01074ffab428b765cf9a4d7d67fa8970659b6f506d0b97b7e8e48bbbf7c2c51729b7c35f8479875887a7224d045d3555914f54307e0c9de66443e4e2249db780e77592b02e81b9994b5cbd539475ae0bab8111191bd33d6476d337c09db9b2c9c369a8cca9f5e3c82af300851444fbbd00b3bd7cd2533e060a706589c8045955a2e83d165fe0addb6c9ae131be88769f79ec71ed68dfad19d1a869089618fcb14671a2b445b7a670aa6ca89d2a70e44a5943aff76aca0d20051615d88036678f5b29c68901e40000000000000000594f7b050000000015e9995266ea968d1e190650f0bf2d81d654ff4a6705f04a54b4928af8e9c7b15046c37266a6733dc3ef16b9004385671af4adb0d3db0dd95ba3f7362eb434fbea740bf995f75d0ecb7c5978b27e015fbd11bc7ed3aa0677cd2b378b1fce91c70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075a1adb77e4583102f88a3fa28292c7e32bb6a3e5746b29e38b0880ff6e9a30dba45cd78f3c618aa6c6229b22fd2be4c1168185e3b4eec544f446da6529299053f2707a6e2ae35817561e1564e19859700f293d3a3893d9a6ba0f5c771512da6de09c6220fee03cebfa568b6c75c85c93392e97123d65da916875d9353224b12020980b784161912092c7beb54b3be09336713658fd3d8bd3a55a220d494f5b154032081e822f8f947cdc0909d52d8dcf60d7132acad437492c505d4afebb12e0ad90a08f8bec1e74f65003a918e4c552f938ef599910f4db82dfaa0070141bd188eba5e5e4ef85b66ce8430a591b16652ed8fcbcaeadc7ec42beea894cd4da306dbf20321fdc2d68c2ccc0f2884f9468896ca1f0f8288e3fe0847e27fe62ce993a17642022e454f275f0a8cd2b6a0449683c6b2a7fa3b00048aeff113dea5562b5b7acc60022981521e90916776f7afab8844ab7f5f55a090b6596219de0edb92d03203835e02284b21058a8c77ac2c17cfe24ed64d6855506ecfdc0fa13972ecba4ac4b0006d032a3254aa7aae9ec2609cd40165ea75afea48a764d0eae5241a88a757cd12e8f77dae159349c25b783c45ec633f393c5a29efb666bc8bb982ed3a541df11699913750fcc5edc283a2af5d4d81d4580aff7de12b521972f402c667a1068a8dd13f8b7fce786b2aa38afc8e3539b207b4adb04aa9a5c73d80b2190bd19c2f804ca7023b528e8e5ff2e9a58a5cafcb70a93bdcb12c762e8c9342bcad304686a5aeb1c13ae05d4d168a03645dd3490c2d95eb0a8ec19b3dad641e7edbe77c2c2c7de96f96148d7e28ed1491c90d69d2af98f51c7222e0ee047f8e3add770a2895b1ff06a42d3334e51dcaee42b53ad5c1b61590fbf5c9a38449a482b54b97dba11baa9efa6cd05013b649fde1f501e396ab9c74d25efcaf857ad7a60fecdc721832814e086f937145c1618dd5957c443f5898ad8b067e9298a40cf722fb6156b4e74080daee3856464f3b8f31c622cfc904592bc8a059adaf8d389214e48e90208ce23ad061ff46c86ceaca4caeb744db0d56aaa2766f3e7b7ee810b33676f218147fa1828dbb133ff0737cd5f857b2e39c4e2d472069e6fa55a74886da58040592232ac76645d655ce4e0c0d971ca9fe43c8bd469fc1a0f2f82ad17b0f2a0fd2f30bbe16d3b4b24c2a3d772f5184abdccf7ef61d235c6ad609185548461b1b7fc36fd347d390f5a0201876ba71b5033dcfe3fbc2fbd2ddcde505d8306227ae3b37603a4a06cc3fea58509ed9f61532d81822f4b4c92bad945ee9c649eed54c89a2121602d38f2488e1aca8f6b902fa2a71226088873f68b50b117207257e15222551e509a644b6a80b5d4636cee61478251bd408b50c547c8251d0cde5a3a33adc44c9d20ed40aac44b9b295212681cb989f0b3e1f6ac683dcf56f17f4c68e7c7ddf3493045c552df8ea8093275d12b08cf141a51209dc077281254607dcd78dcdc9d8b7dd82fb7aa42a047c185cc27d2ce31b5d1a05485b0c1f17ea3e2757af3b5df3da83263f9d0f6312a79c1ab9610a2a02933e15b5462ae185588b149fa52cc074a3344e5f5fb8d4fca56a324087f65573c7ba613dd2309fb365786abba8f590d083384ed0f715a707d644a13d0443afe6390ffc042b709eb631af3b917fcd995781622272c28c989a3f8257c2574ba00c4677912cf5254f8c5f0dab9b766c5aa4c5f72012d4c0c9f01930f58ca3bbe0b7c1a69b91dfdcd7c27353ffcf7ff9a408e3ab705168139aca01ae88893c659820ed523a5d8bd2dc223994e449d12f33558d6fbd4ffbdfa99302edb62cc3f68afdcf0a41cb2993bd0d992b51a7e454fccf2c6611a6dd698e832ec98802ff64c83ad04b19cbbfa92e03ea98b585f025b97a682bd839a325863987d689949462a142260fbd0b07f428a12723bf5e0760ee569d044322388a4e1d64074657b4c83e4516e18f12ec5be4f20037b83670d0f6b3777d33bca2280ab3dfe0f138a41d75cab456a0abdbc8376007f24f4313b7c346356c5b2181b1dfefe0c48cad04759301007ea6b330eb3ba351c462d5830cdaf4b507260efa79a830f699a28a98d989d88807f06a27700c14030c734776f47e73bfb0506d734a99d14de80ef439c29362e157982bffb89da0c984939f50bd07f962d5551b2b3b19121fc961a4bfe2231fc4ad01afc49a25d5883b1c9095e6e286e6d01b3e36ce23c761194c8334e6cf19d4e05896760bed4fef2a0e656e06558263fa9ef5b4aff25deeed6aace7a4244e7ba5c5084ade75f5b3d35b62ad795969aa5422ced3534c40d0f2bf072cbd837339d4383ef9075e854fc309ebb8fd039551e1b1b260eb47b7c521bc1e7408e37bd93b96a5d2b6024c9cfbb7047f67643fba9da2490a82f0e174fc6cf64c0379320c", "", 0, 917857606, 1537743641, "50e4d2d6381de2d0e574be95d9d7fad4f9627bbbbda00b10539560f766170b83"], + ["44deb058021a0e2c04fec8bff8c19046a84b9a8744484d5319b8d616567c10415e9173889a0100000006ac510000005144bf614d3edd24f03ed725773926cb730099725edfab2e4fa18ba8ff6e5eeb47caf73a540100000005516a635365c9b71094049f8dd103000000000100487faa01000000000252acddb296030000000000616ae300000000000000000000013145860400000000000000000000000064a7ebb501e5cb0aa8ac6845d2a8947a718dc504ac62f0018795687101d2fd503c7ffdf7c0914c3e1cd929319a51f5e4bc7b0eeecbd865c7677043632a73456fe2f2aada71952ebbe42dbbb827ada011f13ba78d2e971e736f41d2c712cc1dd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d982f79f716161299797f84d8e8f2b18ea59cca9b05e13038dd8ea56540b2e6a6e3074005780c7a8cd87095bcbcacec80bfc2ab60f932f46aee36d70b50c3eb46e38160d7fb7c4fd14eb857fa7ca6d06d77515bf3be09e541aadaaff3a407163452e45f9678296fde7fac155503854ead13c28d44cf480208812fe9e121378fa020235a7e822bdda08a77bcb8377e94825c2fe953dbb2a18deea2ba272fb3089b80303d67eefb57bfd57566e9fe1bf0f8aa026849498ce8f7a69e519d0fa7317b3fc0b03b517e9e9c268f8f2caa5d696f33a0f5c8b9f2819aa8d847f3b823612acd7e185d9352e69393b91b069165ff7619ea2c3ebb1f378d625d66d11c2585ed901560317e68c8ad5ef98b7dcae819ff87db677db2a8d3a3611e4fc7018b82acd9181d8031b55ded2af3b5c191d96153274cff94cf6f6541b1d68516d3ac4fe7d5afda0af0300faf570a910c3dcb1ec2d7d23a4e7f8bfb1963143ea88a1f1a7ef6436caaffb0313c53ba0569351f91c6f65e7c6ca4dd252776200eb0f2e266ffc351990c5c46b02291d28d79547fccdee231d0aa7076bb0df49d3d3fe411f815ad1f85fea3787a45be323485a2460f4bc63b1055dcb7c2bb1732173801bf57ed4df716f0940279c20917c737e8755f09419926d1229eb295bce6be632256ac682f0cc0f966b9a7d20ade974e5fac7874282bbd079a0556a442a6aad8e0b4c8458cf4d968b41deba33e89136f68a28a274dfd7de69ceaa7e1ab3d0b0052db5a5c914aa464b436182faf377e47b51c5824af86415a24239efb2ffff0511074cb9f08e8b0c65ac269d8df208d36c750d1b50b4fc207673a01b6b549829cf09d5a18bdaf45cb1498de15094affdee1a6011e37ddea53e6e8205567088bf4d6a6c1ed10a3c75e7c5b3959cce01f3f091b63e11f3066dfa30fa07891e77bc9593007a15b56665f3c6f49e86a864f881c157f81e8358c6a48baf4202c943f25731e72db2d2fdf35417afaffbfc5a4131f9a6bc8149ba514a7e4c4dafd68b38a050e2a595bd6b0df18d33e024a806bc6384233c70f0ca3058de4a2aa117e726f98e1fde9652487e93e0474052ee4b536e372f57c2616d262f22e4d53adca363b722dcff9b1f8a1a53517fbdd7d614f120727fb98f6b60620e345795cf551a7e5072f61db32b401e80589a780170236aa2991758554e3143a642836aff784f1d23ed6f0102efb16a7e0dab6366f5c3fac9db798ccf019782a8426284251a26d39a5d41fb5934ff714c39ed39762088638b72f87427c3168b4f9f4a4a5c143303a18ef8cf3352b97db3f70294acbf5e3f4e2e6aa709b3b6da0b174b8ac476f7ebd19efbc3424a1a95d2b82f13a18992d84367c192287904bc37a24479f3fbe0926ec82603a61aaa3bdd1faf12d02f0a02104d450a66416d4f65ed74e7638f686c318751c54b1a61256fd8aeb86da2e8c38034fa88bf16832d342698744b9a266e8e34d1ce6c689688b7899374ef8b1a715b8772b9f12268c47491ab32b09d9f3a9f6bdc4e8eac71291e856c9aa30ede0fa12485eab7a32a0e2f4d6e1bb7fa12b90ba247e939e74b209bea44b22b6c8dec1f294bc7adec34d56372872c0d226ec3ea1d40311125b09648ac208a880ae16ef195a8348a2f7c7cbf591a9de7246fbc0531edcf8cd2811e932e82f317a24f92d0d856327b48fa3d735e03b29e3f3915eda8d0b64c59be9a21396d511f5be7bb4f4879bbd56c107a61c3de01df8f99a2f444897c1fe68424040475069a6bb832ee98f3a05309a7addb8d73a18322ebf1d9a5b480cfbd61c5a773d583eb9d7e8b625e6fb81a696cc0f32d04088bca15282692ce881a1b36c44a090188a77a960f905475b9514c33a80e6128df19aaac3a3f29bdec9e9769549b7d520e9c7e0b97b8c9d83015c5f500da26a70ef6656751c3c5dbede70e78395184bfd5fae6d36338496e362497a7073bec4e22a731cc98ea0d298e0f30ca12960d8850d39f9dca5038a1b920f1de4a3bf71d57ec9ccc8461f7c16f667f2b08d543f0b2bcbbdf8de7edab51080a1c5d8fae8b5fc2489597399af400886e3c828f2b9be9b088c0c1366b1ddcf763c9f4853dc34b18f2ffd8c793cc2acb65fde6707d2a78d9f11148fa2c28a1d532869e0425f8f0c551eee178d1654cca9b8c2ff16c2076204e487db0ef13f1d24ba75681d40b631225b30f97ef9dd0614d2e962b318796ad4294a273e517268d0d7b4f4e5d4defc2fa6a88a0c22b94a21c53fab5b23af21dfa60ac9673402528f6da358573bf58f6c0036405e6f8ca3f25f8d1eec4db72d96ff6e09e8cd1aa7a4dbc17091e9718c4600913fa81242edb0c4888380b7163d8183f1c37015ca82d71eddbee9db9dbfb283f2fbea35671fa676aee8ce6b9e81572036250f519b51fbb1198781b196a140d", "ac0053ac536a", 1, -739913700, 0, "4809036c468ffb8af3c596818c2ee92fa210ffc260411aab3dbbfaa46b5a2138"], + ["030000807082c40301ab54f9ba21b915f2b2a8720fffcb938c87554a9b5b597bc9efe4885d028b0e7601000000010003914f19041908980200000000026a6a6cb4aa020000000005ac63ac6353dc76eb0200000000066a5353536a00a7a10d010000000004526300520000000000000000030000000000000000f84f6b0400000000b44fc9939f710aebdb672293bb19643f817d3f862b6c1bb9a683f974a9bde2b3e13663e2c0a31680769607a8dd0bb02febd822f70c7f2f0f363b260eccab7cc5a036cc5a8e6b48eae3632ff004363608b45bb48bf58247b28b32d5e05716427a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000414839a74481c0ccea84cdc55a9e2296bbd1360584505d2e13eb17f05162a23b6a8116b4bcaa87c8c5a25f107da66de3d968889e904d5fe369f1578ff37a13ef22c3ad555f4a90a99deee2d8ada13948019ecf63e2cc1e137176bec052a5178a408bf4656860ca1e15a7a2e2cb43c4a36f55e9ec3f17b250242122e03739d1ae021d272971d01ad58f14e8cf0cf07ab94e61f6f22e664ce59020fe17f8820d428e031df2dd88aa6cdc22639c8833fe26fd2ebce619d2d614e341b0e9f158465ea3660a0552e6ce45eef3f83e48730d1f87be890f8160f740bb7df58e63168a5c248cb721f06d25f111f62970f97c81cbaf358da91a3e8053fa139715285688efee4416031657681287929be655d5321539ff0e1dc51025a27d2efef1bbc503bccf6bcdc2021eaf24f63a65209534740f87d812a1e52f4916b482fe781b27d427e044649e91030a08a180d2ccb0cbe73fd813aba849b936f5254e46a3ae2cd2570d7a7f9b7d120219efba51f3c203ea43d2f11e986066e2bd126854af2220f06fb36543e811e3f2020bf42a86b17103580663c076d57ed7d73afb55bbb79a43639d838e05a89d8c7d96c5d0cc0c1483df8ad9ca5fc4292f0028d3cce4061469d2c25a38b6b79eaae1d33f466f096fb381149dc79b4d1df4028018c8181e48833975562f9a51901e6d80ce1d7659f948faa58f70e91d177c146ee6836c47f01b4ed72f8d3fc7604c017d2ecdab06c6a70c793b96d65a9eca9bdb53d67dfb23e9d93bd828703e9bf42b34a46ccb1afd9ec570ba47b63805db30ee1deacc0aacd00c928369c8a065eea03367dc55b2d630b4b42451652797c1ecbb54b9e71f59680d88269259dadf05f484cb1427f18b325917868197e3a9f9e21bc5e44898603c66eec260fb93f02a7671fe9fe6ea8453b9f88f537be29fdd751271287297c43a2529dd989e06731b34d216821d96dc724f7e74b313d042aae25e84a46dac5f47203c8951ee04daa18a4cc6d087f9c4d6f91cc3221512586c5dbd7fea79e636bfeaed135a72aca05d214bf799e20a09fcb92dc96f5c155d62b864f840065e817b90e928488ee365aa8f65e1c93a51c9960522b24adba726962fad6669d8e460bd56e23353bd2ea49e8e46c4f8e3e3e26199f063272cb99f3849f81416fc3d196fb10df0442de10caf29b13462ac2bfb4e8019722362a9121f1af342e3871a5b0b12ee221fbab24100918243a0e94e2d15900550cb5c6d1a0a7872e4423c9a31f87229090ac3e1af87d7ead58983b46d539e0ce0317cff815b66955cd19d2dac97230a6e808a8d06f5b88b7a20ed4d9d1d3fd7922dfbe56703eacfbbad67136c5e2afd9d4e2e4125a939618a88fabc9729e10296f69c1d43c023b6b6732f61e842d4110fa1ec91e29bb11181b17fd2ea40973d4d37e60680aedcf2701c712f71603d209bb788aa32bbb02c5e934dc36d00dfa2c246faa5aa97ab724aaba57a0a62e650fda99502cb3ae9c2da1d332b40a4fa140baa09a0d5fb49b7d64ad2f40b1aaa8780491623f8cee41a7dde43f4dff1a58dfb1910ded33fd69289af1b850e96e92d60801d510477ffde2668988ea653a977b3f4389ad9e94ffc257be635b9d74b39020a2fe560059dc2b0466e92a411aaf3b748559d5cb825953d8e188ed19b45c0d1b159fc53f8d4f371cce512c1391cea734aa457782c6e6ffd549b8f3ab87242498f7bcfbcd5bb09a3b9869036be5e1ddeb6bdda1568cfe782739403fce220ba2e7444ff4e628df50d84ca6610ade419d826d5ca21d95309b3c82bcd3e02b9d104ad9d9201cadda1be4bbc36a2c49e64ffcce297d78bdd0bb37a1f7842c60d2df253e8fdfb36c928a0878118beb853dd5ac970658e5ed69ee07b4a5f54aac8ac9caf5d2cbb3805c4520170ba8e34c26d45a5583d0383c58fd66a2997e7ad555d03e07a6a3ae7262145e41d4fe57331cf7a0d413c1edf50a9b9b62de0a249c3966a7dfaeaf4fc39c6f5e7176fafaaddb8de7c8b88a7260f8aebf073b285871f50768f39647dc2053c13cfb88d4da5337debff63f9d894091bede7d9f5216fd6e1e81f0e0b9068475be53b3aedda76c82cf3fd9e9f764f89d165f7635d82376e387ba190d5cb07cc09836af2554ed3cbafd94c6edccea402cf378de9f261b5e8eb35b7d42bfd6afbf84966585f6be6326424b345fa2e8ebd4d06bb60f980d5da46fcda939fd2b9c50564d2c8c2f5f589daa6ca0e7475d312810467d00bf9d4887dd6a3e931b63e8e698b7fe4ee1b7086faf7416999f3c9f8d33bbf870404000000000000000000000000e0d1dc821136db5695cc7721c9227e1c1f83a75f61678041c48507ce4d594c3ec54475da854290f83098fbcbe6c65a8f6c4c6a93f0a6ee6d12e3f49eae4311a43b3d957345bfaf48196a77c4b97fa3109bc36c17ddfe602ae40150c0d347f43700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c61562a698cffb4df2082b0633eebc1a11f99ddc96236a14e54d8ba1b2e8e457202a7b6a3726cf9127976d207b28f1527c3ef79523d38aec19b2dea0e6bc22530edaa90173c4d3eca5518f1a3af402f24a103ab73f83854df2366a4c02bc3f688f3b3147e5f2af03d61a9a2be252ebe92beb0f23939dc1bf2e71a535297a586c030faaac8b83e7730c00b6cddad5374e151621f0eadceb24009782f99598b52135030a37752366b3071854533f079dfd9d1b7e4cd262c2ffb8daef145f2516dbcd230a021d80e07613e0b1a4b3d5c4f6ce8d85d324638ac7445b6c2ec0580f7979b371f5b1157c19d48e3af58efe8c45c6c85d4eaa54d8941c9702ef0f1a2f53d1ffc4031a6d43a9c1f2c3cde7cbd58444731c68bbb529772a8844fdc84c742ad72bb7cf0212860c57fc743f48e0dc137d822d4e4168b6ea56042697c9520e665f2745d044031f743e570a6ba0989e4346c202d96aa5de1101301a6584da059df24cecec1303022f3767d45877f9cb693a9a68d722acbf00133947b7793c3d07b799da95288df703281480da74adfd3453d82d0f2393bf6ad72145ce93d3471b6700399578a705c9f091b76e98cb32f17b6cf239c7ab227ca13b68372ad24d812c73c9ed9efe4b5c2dc2fb1883d5ec9c8e848c8dcb00b029d732dd54033b5c90e6c71246ecbe29677fcb387edbe427f476dc050a7b5b56699940d667818874c9102f0b368fdb4c1ce5d8a035c129bf476fbfd14c63d3e124617bb42841137aa7c554c5c13df7aecc75ba787c2e76aae5fc1d66bcdd6e26afae6050c9960da6e28d5b9d278362f4fdc14fa4f47997306e972ab0a5c9adf80dbb5a5604b94243ccc2d5d72884ce78e0bea17676a9ab3bb5e9c23e676755ddc482e068e99ff2309b084726433d95ed325375dfdc71f25a63681acf71e8207eccf8ee3e1f8b3554f3af771a2bc9129ab56bbf160688f8f709b619d4d57c56d7bb56e7b74ffff93977b663631824ace5850876d6a3e619bdb719a125f726a425290eb0932f1f156098342ebf8eb8ae42a7ad099dcd5c62e932eebaf3e3b8a513b9f344099a0467494d7b470560016735c878cb39a2692b87c7a3d4f4ca4ff6d4f7e2d5583047692cd47d4d51f121dd07aeef926a9fd62df10e8316da8699495ad5542d08d32618498ea7f65c9fd93df4bd12676719beb65f272a306d7d0d2ec7f85a3f5833a298bc0f21a573f013c5f740ea37087e1dcf117734b97c53fa85fead1883587e404db8d5961833823953b7eb5eb0d9451d6766e8fee625b1c7b59a2ff3c386785737ec7d80d07406c60aa2bf05c4bb8f571a813e06746395b1d8bedbe1ad5d4ad021fc488a252ba79a74fad854f59356886f0704301de3527a77e17968d4578a0c8cc7d267d9852be3173cb0830e1aec3b023197c198586d0d8721df3d748cc4e85e5ee65ec3023c48096e2967d6ae0bcf6e5788cc2e6d5a6a0f2ee5f04a83ea9a9bffb32e64b7cb8ae30ba196962c991b5e146aafcf6bcea17c7b66dc25f8c5abd76385d4ed108a018c0cc9240520f522449c8ceba84d3dc222c507bef9924e3fad99f8da7c270727e3d2d48eadb238b45b8e46fd99cbee34bf5f3454bb314c8a79d85d6926ae7b77670e489a3d9bfd11bf8353996f1fdff6b84ffee23a9b016d1f2898cf885202b6b9d0b327341ba35fdbd6a00706379bf91926e9b84e1602003cb800fc3933e6d7b65583ecb2d9d06624844f9fc4cfe515a2a40bf4db4b04bd9e014e8878abe1f2c06855508b478c3bdc187f2af5c44bd4213eaa30f0ef03c1e66dd812525bc3c97324801a7c206334cd4c656df2071fd7a3929b4214c866b5ad2cc20b138d2c31edb43fa046771d3f93cf3df2f24f8316572a40db9c32f838a7fbc78120d37e241870c755b1ca86e55121fb555537bc8eda7f42b29db00fd44399ba72ff13005250b115312c0da528b71024b5138e8f643fecfd6b8f86a06eb9bad0878c499fc537f55435982a950ea95e51572b55f0c66c253626419e87ac722bef0fcfced34f8682a18afc0127759d95eee6d0a7eccdaf9afdac27fa270cf6759b31f9e9f62de139774aac6356aeef1f46b0f967587eeb9c6f9515fa9733fd899885ae1d1105d0ddc807e653bb2e6d471cb1c270c76b69e520fde78413b042b09fa73a49d8c1a69bbe90d67ff69b537737ae0cade03b04e1a3f0dc4bc7b6d5ddf74c75b827c78820eb2ca0931eaf679f44008fd3c02b617e10e6d249044fb33d6ffdf4ef2421cd2b75829b185b922b26368e601b587a657da51c07000000000000000048e8fc0100000000c11978c42907d772ba9cf1fd7b4712261da2487a55587a53653515419cacac5a1a9d43dcf978a6d42de9d1a2aa00e15f7b7b36ce1387554a8b56aa27ef7f138a2cd694a60a6d90d00114f3db021f839a3221a65751c1d7192a15aa5e3128bc4a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fd6d521468a898bff68fb919b1f2abfb3ff4b00cc8aa59b99dd9f5e54157c984f82eef466fad9fb534ddd0c6586bddc0ddff655b7c19ba9d2dabc365769c46dcc6931c4081875ac33c4815fff3908569de5cb6d24cad1e1a529d6ed824366a046230196be972afe25e342a683e17c700a2125f569dcdfc129b8face02c300b310302fa824cd0295774e4ed70201713d878ac83b61386c13165aa39d0ad69f61466031e9afd1f69a7e616c2de7782fe3a7697b31538aedb21bab58ddd67865bfbbdda0a0057dced574c9c9b712bf32581ca2f134edc47f6ff2ab9ef1efd794615ad517fa6ffd35eeec0f508d252c96b4f92562d8d48c1d0df2cc120624b3ca4fe574cbe0323dba5ce9c02ee27ba56b75d30869fb58abd1290ebb1edb2fec6b1db221de47a031668eb3de040be99854fdee2fc0541da8a4ea421063ade83562d5575b9b7d039020eb1abc51f4a1b5820d27908f454faf8965f8cc8f7cf5a506aec4a3908bc968a0201ac9ab62418c3bbae24a6a58ba4aabb21c42093a21cd0708211231711808eb10316ae015b7b5869b61486dac4189a1fb65fabc431d22a31b16efa48a54362bcecae4b8bd32f0ba60a7471972ffe45fba38d6c99737b36c02e4a2a6df78b26d8524b1ac9233f5f8a6fd601690dba94a7b5e8d1652f98529e196c82b0f02cb611132efa00c190a0ed0983b814130600f9a030f1481a15cf5fcd3fa5d8b1f5b30713605144fb7d684d84e127aea09abe25b61f48de9f6fdd61daccd19d32af3d3f8c1698f0e1a4b787013ed9a4ba2656e131d509067ed242b1ec4e2c9aa2c42b8f8f5ceb0a777935b2e90ea71bcc8732d53b715b0944bfe47cf7a33694b1fd4a487ece1ceb91478b990c57c45d9d6908e15fd382c493f23e0c81c4d5f0be6893afe87622498262d93694750d36ea27cc0b29343ac7a6b673d7dc375ae2cbd43b633e874af2e5df31b177aa7abce35a4991723135c3a66d4c1adc5bd01e28e0ac02aa70d9030d78de18efe8f963c6102576f288f1a7e003fde7532892e3c802d70d41874284c6e8c7b7649623b982da54ea0f38900af725cb78512eceeaecbea13dd5af1b2591ea69524dff1e48ba83ae3049e5430af70611463afad6eddc7686a4ddee041aa4454f2a8d7bb21c6aeac965baa4ed12c3a34158a3481be99aad4ecef4ffbd588f2440d11b11d35fcbd43eea61eb68ef04c1311b0df928cdbaa740a287fa6406e3f8b6cbfbc050b814408a7cfe3ca0f1fa151b9a79310f502704b4328a60d3815b2db04a4f0f265298dc3bfc04472c399f2a00fa86737bdc5047957ef51891d5db8c5e648324319d27de1744ef20323a258176f0650444d662adbc416214a78831c15efe96de65c6deb39694c148f44bb9c48f02f983ed16c1ceb4682ec7a672c1e4b68fd0997c57176bb4a83b79d1229f73382400bee48698ee5e28934300f7c7887bdde58b023ab57faaf0c9a9d5f093c89d8087c72cf408e2d8dba0f9bf1b5e663f4c2d8a1e3319df0c387cf69b8117404bfa355cbeec7c99ff7df132d942adb8de2cdaa5457940f53356423749c686c668d8f04b862fef3e5b77b61ac0f23b8380932689fd915095d09a9893c4c567d80e48e3883fbc3ac4fde360b4a38b95572bba2bc36de31dc646b15d1ac3e693f00c04109218d1e6c2b49b7e9ddcc38aec623caf691679b85727f710952395609f1930f80f9c5bf20e6f86f59a393d8bbe18524dabd5204f0f28b15453bff7d49075f7e710a67a8f0972cd6e8e05281990d0816bf9c2b6076ae01ebcbb766986f9003bb0a0648f36d6e9b5bddf78d09e7bb0dd76c8eebbe5f58b64aac883b231f4d72cfa50dfdf70dc91597b97c0382e9179682eafe6688ec136e99fca7a5d8c656968fb50d875c7e02dbd4597d9e3d6d51be4694877c674d0294e97ae642b0fa822ffcac087125804960f9d5f1e6f47b44de5baca296ac82f7539af27f72e5e328842a7dec6fca676e87eceb2fa4f4841962d8a6fb717acf4767b845ae22c66f40b6393a3a9661110d5016c6667b072c4630d2fd9eea7f55e87310391ade3ffd8fcaa30618ef605f312eb8f2d9500619e8a3f8724b38a153ba3a169f0ef0c73d6f335443af2fd5bf6e86656c216ecdb683f1253dd1314544ac8c42fe8d1e4a426245d2b2f5e3a19ecedc718cb6a82f9641d124c1d00106ea40a8330448bfaa7fcb93ece348fc719f3daf98ca812a8d6e430f364915f2c9b792cd28c72f697d13e4066d56bcf1485a6e9ed73119158924325201c65e733a1739f142f70e04931a695e6990c2b406eee8a35fb47dadd8797c62f71777c1c5f7f8a3980246fe5ef01984bababbf94bf3aed2ceccaf4856057d3c5dca0913a833ce4c02d9784a1f9447586f5bfd964e1a26a806108dd77738206b1dbd3a42f35f64769a8bc0b", "5163ac51", 0, 118218022, 0, "2f09d22232991bd6e7ea87f5d5388ab4088432891b00c650d5cedfd358ecc66f"], + ["0baa787503b732a490b4d3e412df3724ba135277d8d3721fb5afd30dcd63ac016af5fd64e80000000005ac63535251ffffffff74a6d70ef8546e90b68d30c423f5d0534d3fbe28c2ed08c09b2dbd13300891f1030000000753520065636a65ffffffffc023f2f3e6c6f3ce61110976b9903e9a649e22ecf24d623cd4f44ca423fea8db0200000007ac65526a65656affffffff0272e619050000000005006a6553ac99e8a60100000000020051000000000375bebc000000000000000000000000009f2d7e7381fd456e5288011f03d1de0e3352cbe92f80b89d904647948c8b98c51164c3e00279cea28bdb234fddda758fb1ebccb5594c883499d9bbf597365a4dfeef712f3e2d37b1ad7fdc63f967faa75cf7d210eedf215b48c05d38933d01f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e798a5ee6282e69c14c0c8b20ef7eaddc92be5727f1e459b10d28ae6009c700c0d0e934948b61eeff071b06f141cecee4e9f46b7eb8ba3c4a8220a9907244b552b6203c241feaa1552e169abbe01162e5041d2a231d47acb32e64f904d5cc0433a72518ff40d29a70abfcfb53aa61dc469176184ca5220a23b3320b9c387a40a030164f80051a034d43b29cb5595072263e256b88916060b3cd2f2405020b8d37c032ffa912aa71254898b9ff98e9f43cb81c46ece16a98cceeb7a3751574f7df39a0a090bfba3deb9cede68f56a4b9aa4c73fb9c075c0847c46d29f50be4660fea7a9ab569319d4a402f051d07c5dac06fde960dbf1a941e2a265f429bb907e8616cc022ccd47c922c4030d50f8dfac51ae08beebf3a9dc78e3e724e6460fa37143f0ae030d870c305e13da811355796e94438a35ac600a4934fe8b00480f98c061dd00a8030a696381a83070dc13c0d2bce012eecb18b0fc91d7795ebc9b480c55ae80a176032f4ff684368ad1c8c3ffbf19a005fe176014b3576bb53e15419a95fa40b691db030ad9705b6d73214d02cb64d345cbe37968f8fbddf4360a870f76afcffc609b0e82167b85fb6745b1f8475e131188f03b79d275c86299f3931a1f471570541424717cec6df668aef5acefb5143af2dff87359c03df26819c0223eead2d98543989a437bc55f35a3e59bb5539832fe0f1e7622a82e5734623b7847fe85fde35917e6bf0129a82fef2847d10bfbbfa732212be6d6ef4fee2a562145c6f8f918de57271283290e5e5de0b21f7941e7ad8ae830c5beabd76779410bd1384a0ce4715d4a586d30908a1696abe746a67860b76ef3afb252f0f86263888a9ffed42924625bf87f8552aaea8cc1a1dd9e167c265e7b83cf439eb4d850abb72eafe4a908ba4164aef45bf8920d95845fcc64bf4813ff1c9de0eac6fd5a39e04d2a3b6ace22c9825b8db4a5da4d44d20650e8fb828bc2d4c8c733cf248c0e874cc3a8acb86c1e763bc9e138ce66802ca71e35b2b5341f4c0814bb9557790f7676a4e5c12231b20842a5c38a2669775817aa6336e80e4404a3c08d47eec307b7eb099007816fd691b0a8ada79a3f38a125ca3b192401490d2c78de45c18ab9af41a3f7b23d8e3020f35e9e3de6526b60147219fb564dac848e38b2f9714740d5deeaa2a241b7c50b7873a5b2d6129902abd1d2ac5f6e700c691a79e872ef7395ff1ee11f2710fb1f9e87913303aa8b7d9f4ec3dc365f516864fd10df73f5fe9027bd1cc0e3d48dbe0ccbf9fbe1fc95f2788fd82dedb19ab142252ae81e43ee8aa809d1b70cceafc58718eb580be399f42cb059946d3db696c65ec8f8896d33ec4a474757827f17d86fe4f1caad8edda0df7f465d2c754bee845f545c26c2d8c1089c4ec2c77c8c8fffce3b494277bfd49a1186ea9db91f99a7ebad344c7569f04e735b74e593d5584405cbb265508a658a135b0229aefb55e571e83617e02a1ffc229f7b8d3e7fa3aa84f7faded0f35f702f5aaea425662eefb0828634a028bbaa0980ddccf404539b3eeb7dfe431ae6a54f0970384f5bb1367c24a55804d11e8fcf3eb7e40bc7152523f2bcff147cbe4874eb2f3e9756de827e26fcb755d898c9ff17a86b930f64daf85698817f38a19c8ffdd75aa0fe461abe2bd8244dde0960235daf2c4717a856d5ae51e9405d60cfc9ed927d546bd0bc6f16a92823be1d6f05f9f8c6c4b4a082c002c5162b47840aa8f08614bc86ee917ad3d5b23bf1036c57b06e978db7bebb2eb5a568e6e2c275033ce61e23ef27966ad3b8e69fb8099b236d1483ad3f64933fc1b68c4eb1c2cf585763805694c45f6a46dba169f3b8ba3d566cd182e20897bbee1383d05fa8ad5f31d2503e48fa6b3edda952ed6c9ced812db8a63b60e3bd2ea12ada5004c83e99bb8797cc995c8ffeb7b353ee296dea8afa2beb8e516284398f982ea441791d1283237478c77451800a704d0751510e31156ee402c8cb6effd181d11e96bb2f8515504b0f208970b83e58e0940d8a353eb78247259481018323768f3ae6120c8be42f3a0f0eb31cf29410a6eca1941d98d3f66aefbb11ffbaa901c6b5017ad7af54cb85935f5983e29f32ab0098bd28d3c254cbab98a11c6c56aa183ddac9628eb26d09679f63d96b6829bb964b2490bfa236e2770b0088697727c8f5351fedd3fc3f160a11130922794d1f961e6b1161480df598169248cc1f4a427124d0100b9cff9b25913877454478c36ab56d16597df10bf6c26f11c0445bf350c4d2ef3325e12d476bd7ef5bb5050000000000000000000000008aec8a5a84284fbff1f34a5e09d52f24241105c0ed053bfced5c57bf3f27a07cf3e08dfa4f3450fb840803ec27db7a9aea50bc6a081abc349a41c96acbbde7247c5be68a2fd839d367a09749db1d289e235e70a109733dd31507b2a4337ba10300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b7a7d7b8e41eac9b955dd9c493f0ff6aeb64ea98759d2af7b9f243982b77ffc2868adf56a2f6c0f77a7dde2db3ab31f4944eab2af23ccde7754c3cda958f7e4215a7160f2605b8cf80ec3626541dfc914d2f5ee8aab9f47751f79a471758abcf44d16239b7c1879b389f2f151982ef5b201b764bac41be5bdd2390fd5ff623880321b4b2ba933758be7dde5a0627306452a8a4fb3ddca3f6d28841c231c901eb98030e05d74eb1255ea55dbbbf2aacd6af907dfb6d608e1e94bc6e9e7fbd7934381a0a02834a782a0bd49c1db6a04e5692e723cb6f91d3b749e65eae5a24a42f5832420954a807a9cd93b34de7003d0491b70826543341674253b8f1b055ba8d985afb020513b3bc96d43d06cc794b02bf4234627d6c2e590094a68b7985bad9425cc80a02213c15e193817a86f1fa7cacad62c4a2e3dc3a934599aca7d9891852d3954ba20220d86212929223a5235dca909f82cf1b83f389208332992a0984ab217a8773b7032c2203c984e7b290bdef9df249359b675369192f1bddcc33a25030c83df828f903271c8de9313a7e05902ba93409dcc70a1e45dc77a972ddc43271e9cdc08a098cfa288a69e6ad14f2b0103fe16aa14ae66bc315dcdce1b2852f5fe22565b3a353ae8e6b057e3f47522c71ab02281f49fe8d983f8cd2bcd65818b365bd2e0f162a7c9d862596b525eec070acf485fcf3ea30181682b3a254a9f397a80050bb8bf5095865b15e34def21c5433af6ff3ce356203e92ba038f33ea56e185054c4b53312c8acf44c78f133b7e7d67552748df2b467d92974b0921b1164181324fbac4f2e4819ab8df93aeb2a4020bcd9a14d14565c74bf5f610d44cf5cb28df0c919b11ddca868df0c33baa2fd17e5e067cf1393bab40e16035f765781b7ffac9e218c138bd15c80ab83dd4a918811c023a2cbc44721270f3ab53e62a03b9536d57107ea13dbb288d532b7d1a5312213159abc8feb27d6db2311318ca4800894e4166ede2f0fb4d2d480a09c429fbd6f2fbd3e40805a28d95dd324179364afefce16a205b620aacd3eb07fcc03f7a70c9e8be2e31a930de0b212bb2cc03043e2ac9121c3c58852097f104979d0191fd8c89cd1d552e176d7114042ad0906dd3a4311a4b0bb257fe80eded515004e1146adcc2a74e66ef4f093da9e58096e01f08d0804e0f7f3e6748b35af437ecf4dad5608ced6b308c67cfc4df61cd238a52325ac3dbe3593fbd055ea735eeeb3096c9a0de01d9379f316d95950146a1952b4e19aa46cce1bc7b0f0abc25ac3d8cfbcf7d284b7052ba4535837f2d248dd064f8f3b42172b557028f25f0166dd0a554decdacf730fb84e749a50072eb9d7b861688ad2f6ce26099b59282da5e4a3be30ac7d8bbfdf0a778525f5a64e806df33e8ae24d913075b95da20a3661f422a026050664395f2bdf1b6f3be3b490c5b420c8b8ee5dff3006ba6fa60154531cd7907959f3138ea35323627cf5637c31cded51efa5c4299448f654e940d3ecf82da2ed3539bc4a69afd9894f31ca5ab07941dd4e683fade441b428cd8b5d70478110e856e8e7ca9768f695330e8f70dbba4062e571d7b827a147f3af15d0827918993cc94ae3460de11a027256103937e6ef06b5f7329afe1ddcbe04dd59a96d1fb96eb3d9b53f0984b0fff4c420b6c3697c6315fd096b78a704aa3563fbbfc4170a9b54fc532f34413aac341553fecf66764973021e710816f8a987cf8cfccdaaa75ad33bc925c74b63feb0105afeaa5d4caab95e603d4a4d28b65659e6f25bc7075f1d66e781cccae398ff4584322466c0fc1dae5c3bcd309d60d629a651694c4f573f84833328232297c2b21ad354cc8aacab85738cd5df6c471afed8a96b9d792390cc72bb3cd57106a214422a9d7710e1f1329da23e13636a3d1b261905772205764ecb2662860b8ee1ff31fbfc28adb5f490aa0128843919946f8905c0ce442e6a4ba05b4787fa5efdb1a6833fd040de5d5074a3dd09593cc72a9937c4ab2f3ac98e9eec069dec5b3333043dd4ddfb2385916cc04bfc8fcd7d0bc8d473cc8bdc6c6ef9d67912344bf77f671a9f97ecf577a4f6960de2c4b98b59a74ccc5e4defa76a7fbed95842b282b1376051c3aef2e9c925958e90b1b3ed9c2be23737f1ff038b8fb4a2e9247678ad40d326329fd3224c3a6845cdb2ceea233046ec5c83a92712f096951d59aa2748f2bf2cbe9854fcfc6adb40a441035fde9c6232d905517e30bf6aa1bdcf706e0bf1b85ba6a4f66b0ebf0a87ed050abed951ee59e1481a8ad1a1bb0000000000000000fdd3cd0000000000e39b03dd99ad60058aadd43c347709e6a3b3cf8bc0b010d6e99ffa09990b2c8ba9fc68b8a9cd4d6decdd4ecaa4f05fcacf3071b39058b0f74488b3dad6ef04827ad85ac57a787867332c8206a9acd431700c076ab1300ff8ecd1c73a7cca1f1f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ed00b85072b0141e97143f218758109e433f1baccbba103bb980a81f9e37f2ee9d24e70a29a62258bf9e0c99f71d3968166d30a87796c42f53a08ef04a2f1e5b3e7785e4d521dd457ab85535873e7cc3df5df92fe1f7ee72ad90e26ec34624024681f6a55b1543f730fbeb18fd3e71062cfc76d4d361b53a72758808708e9f90031adbc247ca09759f4e23a06eed690d491299544634a9a00a2d02623f92b9e9db030c9f3ee8632a52897566e7e494a14f0a043cb5de7a0f189274fbcd4bf8d3d6f30a054202a67df17a33d9c6773ab5ff397562cd80bd83da44c9fdaa76d6c7164c3014060dc490841adb03ffb0e8c9729a5fb14c5b0e9e750ab6328dd88d50e1cedb0210ee248e9ead2e1efd2f805ec968f564ae17f5ee3cc8a7b0f04dac258dd21f72030129b506a4eefb5cbdc82e312424bf83ce4677e41db126acedba40fb28872aae020ef8bb48c47c23c445be2010b9ac61e87d9ea48ac7eaeb27aed4b24066a2485c0323c5e04abc1eb943cec7d247d265566b3ee98dc42358438f798700d96f31a551032121ca7ee7e71b5b565d338de123e40a504903e6a1145f7ab1b522a7180350d786c07705453c4d7fe9aa0299e477aae470edf2d6de6bac653e5281bc0864a90dc6cb95240c8ccb241d7f5ae25061985472d2cb82e27f341a88594ace79edf70a0560bf345dc2cdb5c2972995ab4cdcf6e3400b9c8f8d7e5352d6c6b6d80ea50e9dbc677f4528a9a1287dabe425839222f65218519b869c75a927c22e54d91b41a16c33442748bb259143c5a8011c4bdca41154f862bb07734af939797abe91fb2a37e6bb7c2c447445c62c5ef50956ba9e02a14c3eed85ef867b77bd94a45d86f7a58d41b7396619d289669edeffa73245a28591e0dade92127b2a6777557943c8ac3addd7fa2c6882ef71bacaa58a212a262f579b3ebfe281d244fe024bf19b3123ac0b065ed2238c3088770baa4be294684dfc09d28f69bde328290801c97b436272330e72632a2dc7f77b737ba650312478c884032ab9e0d863891fc4b5bf6b344640dc44d88b20984b7136901fb8a8f69743f6813411f434ff2c66a10114b776825369806a2c92b5e8a0bb6405a8054d2cddc5afb980db7c547640c39eaa2e231690937018cabeec4b952454412c8943d6a51baaf6db91ce634ef4535353067b8d45896fd087b2a86d5c5472cb16400996985543473b03b1e423ef2968c9298805ac2e5b81ea46d3e360534028e0886bd4f55140f7ee9c57dc389478523d163b367b3d5ca542503806e4c65941542f51a5c11bd1ea9155b3acc29b3172e11c4d58634f760d033e04d0337f5a9ba095cffee64e35c9004d52bed85ab4c0e2273e110d322ac6e1efe5285a3aab57b566d5cbda9b6b58e157b5046f43f48c6a335d27d2301f90211bb99bf53b2944fa4b0b8ae59909dbbd6c7d2fcb96722e1a589d13d37fe156ae8ed8a3133944d43879f9c39e72b6479eebb1a0d9a5ff730816a6038f90bdc87ff70afc4bfbdab3d1bd574feaea61b4b9e1918b9b69b904999f4a2ec3ee0d5b70ae2bc262080c6088baf6128ff5dad91144394566111ed0fe9aba31fa9b80b080202cf8fc8e41af514ad9fbff4e858cc969cd3f30413df37fd0420cb5fbff46cea90c3b678e5afeb73ecc04d4f8a4d1545b3987846c865df0698f2996535e23ef32ce3cdb4a867260e024ea64f5745a6156cebbcced4a3e4c13931a685a6fe8c351cf33aee2a52cbc55115d8060b9168b0c1b6569ee5de6a41348c97e75b2f20d60da3c45ee0eaff21cb6b608678a1c88ba57729a0b0ecb0bbf15231bd5989227876fca3f46b4e818906104f1c44da06a7b14fc3c59992e35e960530c6fdb77ae4f40a5ce58a666d86d1733690cbb9af25ee170c5ea526249b4e2d658802b1f8ac9e7d773c43d625d7423182e637d9f9851b14b10e83a13612581321317ec87888f666c1565b34eab6fbf3740136e58cf271a0cf0572abef2d954274eaf714564721dd5331be765911497bb633077975b48fef9f02678b0d6e0a2df365e8752ce73dbbb69d55e690d63bc1acd4aef4728fc9b47a3923c79cb2a9ea72e08714493ab80bbe30bd68ccd579e01307d34935aa171e03da7efbb51d296544c1a9c89305b8cc257b589d4c62ce77e60cab442c3235fd58cbbfeaffa2bf2178890e91e186feadc43c4917435ff4108127a7b2b817c78925f1fe54699b976447ef527cec8afdfb64cd5c237c899694d6cc1cc488f8d7fdaec87ea1e0d96babf66c9afd8396aff5e23a3a8e87377f9e8fc8e654528e41f6a7aa556000f0e1a1e739bfebc597eb05fa1e641bfefb5979587d07726dc87fd66897ef46bba81578b7413f53972415ac9436df62e51ac963828b14a483110094f40992c3805968770eafcf60210b8b77b8b071ed8799d0c", "006a51536a510052", 0, -764231268, 0, "156b3a06895f420c38a290150cb10a1c2bf366beeb6cfb4961baddce68a248c6"], + ["030000807082c403019ddc4517e91e65b9327f895103b4a1c6331ff844c8af8cce29d21b8563619737030000000852516a63ac636552ffffffff04f1c01303000000000100f459bc020000000002ac6a73bd670200000000086a6a656a6a52536569aeef010000000009635353655152650000455f8090e2cc7ac2010000000000000000bbcd150200000000cfb021eee9a14326080bce89166f529027959f108ac5da8aeb95e35e031cf7020e1ee27aa911294af01830d920526169f7fd21194e3919e42d6708b6ecc4b980c469aa6a1cd30cea868a2c4733b31eb04ead6e21d00461bad7906917cd76719500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d97f1d2acadb80ab08f8e3d499e65bc546fe0e44d975138b01743a8ef9fc14c71b16acea7db0d2fef50acf562ed3aee277b8e2afcc61c5d844d1eb4028425418b4b327ba84f0fbd86730face59d0dd87d7a0b42699b71705ab342a0c5a1d4eb571bb21b13462181f6ed67863ec15b67be7c3bf15b5c17a610da6423a8cc8cae802096b0c49e3fdfbd8f70d93955e36e4992fc23f37f3105572dbec35dc8224e7ce0218e2515b924d406a2aab6c320f00629e529ba6feb4773f704928f414bcb8567f0b07d7f63975a5e2a7825ab13a094eab8e2119608cbaf325722658ccc31e7c3aea788e050a6e02228e00595094953c497e6453c4dd48835e050bbb68a1b2b2fdb0020802e48bab4a1e7936dad5ae8e7d341bb46fae7c56a65fc48f2bba02b119918c030e42557b87a3e1451c039b67e0fd7dd03c493e89230d57f8113304b4652c55ea032fafe4ae8874ffe517bf807bb888dd8325d00574fe4b404f40d5dc1fd210fa320218a2d46fcebeec25edbf649870b56608bfa7fc716c7cf78624220b979695fbb3032e865adcefaeae42b864e7c5b897132525cd915a684db9961f61a9a7e7e596475be76dbc81872c87d86a783585c86a11cdc30cb12e66eb98b0c711f8eb72a1caafc34a401e58ecd1372f82fe3a318c4fc2967bd61b59d88a89f85bc33d95f9f15c95714b94588167e33254575a96a50ba5d5a784dbae76021fa6a2f76e958a69a552b4a73f0973279ee4943d3bd887308b1eb47db349539ce663ae8d8f645507b3978a40583d9713249946b5f275cf7ed7742530d220d6cd726d3769e3a54d2c8b4df5e2091cb2195b10e6a09469a64a4b14cdc2ecfb10e09ccf712d44fcbb41b08480206eaa7699f8c38c6a30a435fce680af089f5cecf465fcc56380fa364357550194894a9e0f72687824db6f05e5a92e8c8f247569bc0b14206469b5dbf737bccf4968389f58a10aad45e5e48bd09d65326bea6fc4e57d488642d3f998895e03ea5d39f3ef155b650f41482b40b2cde12cf013d1d72082b7f00e3a17273f0bb88af26aa5b7cbd6043194b06a95f13d85a25a591d3fc1912258d31047efabbcc4021b4078cda69bde631b5e8ecbad6c5e40e27e677b58d1086582c4c9f0026182d0c60de2d696b3d88c13ff4181110a14e6f42becbe3079f1061bebeaa4660f864a88d0dea1bc076ec5629cfab09b97a7ffb925e11b29a8a9de87ef3fff6c7a5ae06cb2fa14e977b71c4ceacdc19e419d24ae3ee3fe18821c173c26e1e41e30a724a54b9b1ac57605bbecdde7e61829388f4431928a3ca956aa892d43776526ab98dadb0121710b36f0c5f3889faeed4f648212bf72aa6232a5fba06668da11b9d38f73fa1fbd1efb9e2c65b1936018b84545e928bc42835382625b3d4d58fb4abcd596498b99dbfd3a2480cdd14c87fd1d9ef2251322b96d2e62d3ef29e3101063cd521f1ef750892c257aef8d5e3d05fcb24718d28678f8fcb53fb9264cadaa55f2cb4586e02b1846dfc48f4a76475ca3ead3c5a10f42140c4f025f2b2f7f4c2fb5ea63c79c0b0ee17c0a92737e27c5e4bc6d51a02bae2b7a488ba8304d76d35c779f9a616a44114c77a72f53e9ae90d829aae8cf8fa04e81dd783db6bc7c9216c7e8ad76f79a58676082897c43fb14e19a061a01c743e07b723904074ce252e9219ed2d0dc5780eb34363064e9cb5e1bce2e40edbb2121bd867c2697e2d750c4795cec39f84acd6c5bc453b1e8a67d902c5e1ef0ec9c4ca3b92562c8631c91f55a049cd3d0098c1b4770d06bed824c5aec86843efa8eb5f829f4d1ee462b9a42a003f707af7d3b099882e048544529b9c98ebe15049d9be318d5ae34285af1def3dc8ea01c0de7d15ae4691754b8d9a406d2df1fd63443e7c364bd1abbfb1dae8a8d52d98b5124a06d3bc54b4cd910cc5b03c90b3a64e126a063c5f1b7f8d26baff5fb06c242ab6156674cf10960a6c2ae36fb79f7dc494c3e0e751df8238261c3029a3534fe611866ffda07f1209ab30f547f13bde44f8f65eeae98f85d31247f733d8911bb3baf16b112276ab8ab65575d61aa4cea5fbdb48cdcc7959311d9bb7dc83b65a7a3e19b2555ae7f8bd0d94a22f6276d56cf0af376c23ad851bc0ba0b269ce3455f6b790ed0606f8a357a0c0469a30ac0c1f596e78471ac8edf3bd70b6cbf6bdb84a09c1324832e78142e7d672a240ffe9d77d674527f99c9ff70f29945f6b7f04df480dc50bf5816b2fdc1ca85954f6f9108fe5bfb1bbefb03cb6869243f0808b3fcbf26d19d9dcf2be42afda253a813c21cca6780e37847974ec40b726f0572a7e85c2a21a2f28d8a8ca0f493b74005707531b6a1d110c6b5862f80267b4f6bc23e6fe2599125df7475d1603a38b68a36ce4b93a3d277316af125a6ea498b0a0108cb126cec92f3406", "ac6a63656a635265", 0, -1322206947, 0, "34bc97d239b267a9752530d117987225d74a437806374f5b43abbe275025a609"], + ["7c04bc030137207b948c0d78cef2bbf11e1081efe5e2a4aeabdcad571f1812747ad03ba59702000000066a526a535165ffffffff014c5562010000000008650065525100ac00000000000100000000000000004170a0040000000040fb6fc6eea9a7064cc28fa07e276ebc5880cf2fe8f27ee62a57c67e01f034d0c719c1cfa8ad3f1eb31d5f86276970e3f95107850e908ed254a9ceb3156e4fe862fb112a4f79d2108c5972f8ffe9facc0e228595dcba6ccdebc7b546e6f5d788000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f75ca674e3f6a35ce9001cf28b79c4a92c47e26cd6da57661f26d3e78594fc33d2b3085f5fb86a756a570110ad7e046dfa9fde76efa81f7bfaabc2ffe52e433299c151355ef5129c8d79a100703aab71fa79561fa8bc1c5f091c4eebf5f235d4286a7bce3f66d4c51bdd9023ceb0e563a11fe67d033b0228819354377816a1b03080fdd056079f30624e649171aa3ba8abb2b991c3045a2ad3a78c74a8aca261d03292560d0bcb6ced1c37977c7e88992cb4afd791159f2de63e847471a973bfec50b0820089f376714e1e7595a5d0fb54fb04fb9c715620eebbf31bab08ff2da9a7f564c9d3438c33457a107c375be96732db44feac97fae3159a35a352986be5003020919f3be8feb6079d1dc8ca4a49d8a7421e1693a869fc73aceced9c690fd6f4b020e09ce8854a9eaa2fc1077eacdfd075c141ac0219c820159eef6b6564d99fa37021cf12731bdd2a662731820e24ce6730a19d492f7fc434dc1df867b1744ab4e64031d840188963af464e05e21ec9470ba0ae3f0d8349f299844d6619f52ce402127031b3aac95c81010f043cd825ff8bb8a898155af7d052e450e70540d1d446a426a41c357431e635324b8bbee7c088bb15c93cb910aa16e5ebbe7c789fca7b660aa6b985d3cbb70149c4951eb9296b1ef2e31164bc897c13eca2ab3076892fffd1374ca5a67f3c760020625afc20c225d67ecb0d185cb9aec7fe8cc7cca2907c32fb2c81a94fb5564de4b8bf2ea7ec6bd81723344346b17bf9636ec8a1a630fdba18845c48e66c027018041a32a94b1f0fa884e580cbd4d89eb2ad4918cd8aaf04b11f4b9fbabd91604f661b4eb7545ae9702fe8917750578c9b0284378671acf9b569e40dfbc2d5140990c9090399662d551d3c50302b97f516f3d2a088ccb12a06131a6693d51b8904a9ef95190a21aeef6565b069f4b755a0737d18eff32af1da5ed0620a77e243be12032294f9d8e4a8d733e38ee8b85d1a249ded3ecdba5c4e6a82e7a6c3eade8ec0e1158844878297a29558bdea43f8eb5057313ded3e685a0f46869f33eb8388d0970c4415f7c5ec72e781f16c53d78043595bcce930ec6929b00e786640087119498ba1ae2adf2e8db2aa8d075783e4f1a374afb97215df85c7798e158d65a96e0b64d548c03b75c8d2a813d2dd6332dd6d5198c86f254c4182c115914e87d504412f36d9305db2faeddc9904031980629a72a1ad4aa1efe30e4c66ce7c29cfa3c37494dc1d0c8e407c295cac5a387bb018a33223480f931f5cc0eefa582cad04ec11f6cd2373a40b22354d47e4467c468d0a4983791cfaac0ade43c80f6dba551a7c39ceaac2cb64cff233f9bcd04df45cbe586af6922ea758fd9bc0a360aea638776b25dfea7ad638622ff67633d70e2ea77b6b91964b173a61758f0ef31231e7776892885590438f2e3cf7e734f98bccdb0f70777a2450fd03321923affbd7b6a2d2a03592b59c5b4560ee1f54ccbedbbb60f1a8df2790351bc383ac0cfe54f08058628abb8772b3f666606381158dc31073a15f18bdec424907be61cf9c9768f89a5e2518dcaa678d6cd5497f17f7ed7f880e8633bb2a59b309cfecc8a26eb30a88ca688e1b966742c92757ada8d718a5f7e24fc1532cf420efbed3ccc9175b1ee6a5abb24ec65dc219b7d406b307e86c622fe739aa30e2b23cc75d7edd5549eac0b3b3631b0e6eadce03f2f0d27b67770b9ece412799226e44d5adf47e0f3be19ba7b5d97fccde205907c38cfb32117e1ba4e9ab9f64acfb70c70d46967828285c5836c74fa48c453335753068e5d93bc2ef30dc41d0bf59f0cfd04fd9b6cb287ded001297e8f5da5a6e1badf8bd809c1545c3ce2568a72eb2d3e76f801ba744326d846cf9f6bbf49045c87e10a600a663d8156ea4f1785afd79e91072e03399f65b40dbf4a326081bb41cf81ba71e517d77b38782eaa31a6027849600c9a919758e2b940393e1b0912b9787ed12d1f15a1beae82df11b39734559ed46deeceffb472fa92eb0e3dd74fa7845bc74ead083686273617a1ab934ca9a55c150ca55e0a78a768088eba8d7efb346407f5c4d0545729cbbd9ab9768718a6f1844715a46d6d525940dd692ae4fd7806c7aad4b8b3266e73fe90f36c3248983cecdc72216e21db1b87c04eec7b4ad02e1cdb16f1e04ef46b895409c8953f212ec05923781e64d3096d6f00a363d86e985cb9889c1abe648423929860d7569658eca056f56f61dc7e8ec88b37cad55e10d458d6d5467a05a545a46af88ec7eb78464ac5e157832748be6e77af685e7b266b594501e9307e2d89f53968058bedefc73728522fbe263ebc984a1099749824dabb7440abcef35dc0818f062e35e48b17ecd2cb5dcf71b07c6f8da6c136b865e2bac92425c74f8e1b8ea461be290601d6f9f62d0ad6cefffc0a", "006351ac", 0, 1321613283, 1537743641, "74be3853e09457f377cd56882a8f6b928de160e8b28d118b50887e716141b3de"], + ["030000807082c40304fe46e9ac31b4fcc5f8a8f6d2437d9ff7f8ca322a094d20ffd1b77e8cadad85bf01000000065353ac53636540cde1a3d14fbcd0a38751998c3cc6cf061710980ac8d2830f2fcf7ad9c696a69c3860540300000003526a65ffffffff442743b4c09ed1249e65fdd4893249df88b7f34bb25add04aa55a1ad24ab6577020000000752536a65520063ffffffff21ae80c0b272869a8f818f53e6caec418dc83c68d8bbd3624c27180f85e73cb20000000002515304daf6fc0142c8ab030000000009655352656a6a6a525100000000e434e90b02000000000000000053e49e020000000098a0cfe6a43edf866951dec26567fab566b4535ab76766af7f4fdb89ce825e0d03079d4f1a78bcedfc4fc09c3b5c9a667f5b43ef799c61f658579d1a959c98374dd9ddf24595b836287cde223b71e41768d23d33e3310dadf476435d92ba202500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bddf92aec958c316c9f8f30c9c720104af303e86b15c25c683d82637ab1389cd2927bff9093b49710012f69a8252d1a59481d7ee29431dacc7ac3a7ec961f8acee908c2f61514b0910b4a4b27b13b0cdf5c1fd356919958afac643b61d619eb302deb9d0e1fcac7af975b9883d727f23e74f40ca4de73a213cac25c4db31ce650311a1c1ad45899880748b8d2bafc613b6f150b51e172570cfaa07aec25012c8d103214bb38db39fe8806804598244ed7f10fc00bd4ec7c3c234132c0f5cad6652d00b04e9cc8406ad465e790e8c88647ce41dbea026d4305142ff84b18785f27030b23e2787be9cd75ebcdc943a327f25f7fa6699789629d1c1235ca2ed28c40815b9031caafd40f10a16566599c8a9f7af6db64cc02cae8fc6a59fdd90f6184bb8e06c0305f44e615b148ac8f16448e5a254a1a06b676297ddc5edbc4966663a6147aaee02094b5addcf5595ad66c2f6ac18a197d607a6a3500fd7acd7c9360c8b7133d1b4031328638243e4d7de2a8ee959b5c13dab4dce3feca9e349f5525d6cb72b71a5fc0228859b527bfd730bac0e9d9c6b4ec9f0e88c637901c8310849ae2f535a4204176b26d2afb8a235f35a1e2aa43ce6a462809819313eac41c2e9dd6dd21bb3b39004b96ee4e8e044526fd4529c32b68f283a8a618a435c25e8bffdc00163c7b71b267b9ecd9be6e4bf67429723c699d359e8a42af7d11eca7b995bc039d388c79630989113d36cedbd82e49941f506e599f466b02558ba429ec6010dda20bc8272591027c8f7bfded6c97049226660c45c55c89043cc48edd9f4064961ff2fdb55ccda611dac0e8b81db5bcfeb666bfc9cc64a753796ad097bee394498902bb49461be09f803c510388fb7c333ee893a757829e2397f0e344e3037fb569ebf371eff131ee90e2115e280be37871201f7967134eecf3a8921eb71a85afc31fc993760d5ee4ad21f658242f99a8f37a7dbd7618cc6d50cc021df6cd2d794869c7cd753d17969cc4ba92ffe25045218967f70a6ca8577b16d0e55376c59c02f8a9cb9918821e3512f8f1c582f327f78bc36847891d8dc265027bf499344d599c256041f306ea8e2b1d196e286d4a119a2b2460ef6190477e0a30e0f8a960119b7e3f07abf0c0a6ecdfa0e5768e8457b540acddbf96fcb5f19a2c1beedb901044e8c8079e9363c8cebfd804b4e530603deb50d0a96c74938cae7aea07d38c97c2bc35da14655ccccc569c83ab5a490a75d80d1085497c3aafa21adbda4929b2c951db5b2ce8b09a33c566ed46ef3315467f8d620afc5f84e3a4bdd779b00528adcd0d1aa69c968fd1617861811709e88a3f4a54658703d73981002d60c97a7f6c556183588e1dedfb974278066225aa94d93f27771a238f7f32e33ed30cf28573ab9e3f3009c95f8fb2cb3389b435afc317a8af13c8b6add397d6b2b70a3b8bdd18c34bd6e629a788fed5e22a80f9ea2e2dcdcc0255cb25e5a19a231123b5521c62678d639c88571cd75027bfa58154b556fdfed941b8b39d172d63df62551f06fc4b9fb2d54fa579ffd7f803786b072b0435fb4035cb190798fc213eb5d150cf0ebcf4cefb63dea2c08db57d5683de9a2531f477d614ede510ce5779a9cccefe99aa0dab79055719ad3603dd85bed7888b5db334690882cf35198e6dd7fa667bd9128552ab21f2f942d915c0465c05786f292aa79aa4f6a48e8640a9d5c6767c636680dd100146b65b2ed84a57d1447c01b7a7dc113de7c182beb16e1a9841912e061159806379d6c2f260c3509820cacdb771515d6f756c62d80c4956df36a10ff347f1c636f42a07a469c94c03c60bfa5f84b6beee6094356abdd82f7d1fd6dee6edebf51c15c4eb43b68c353e1d3c34bc459cec49df9165ad3e4ed4a003434107e7c69928b3cc27823121acec51bdb8d8f753dff2f07d94f0c850133417f239f9adc409682735806e6a2c58445d320676ba125479bd13178d73ef574db888f9263c2d2645c0d948eaabf39a98d9e76dc8d08fca5cac382d53da88cae74c6f91da3317d0a9aa7dded787a3efdc3b7c91cc7fc7a01c18462b9708760da86b9f339fb7a22250541fc90e99276e40d199b49727cad7a2fdd9db7313b1dd2a54ac54bcb5fa5d983feebda228a8775d4a5e757fd547de735b63abd89c98b11f2a6d70850ab285a4e1ae8cc3d0e556829aa7b3009ed41fc140f912ae2e84cbf3916d8c2193567dd48e24fc7664b0ab060570e32eb0d2256a1493268068966316e2be835d7a7061996514872347bf54e87853ee19f93b778692103000000000000000000000000d8d097bcf6a5b2b02985edae85f7f290a01698321d939a92dc0ad043df3e8f4fe09d8339bec1ba3ca2b1a8bb769acf306918675570603816f9bfb37a77429bdc904a7c5efaf3ea6b73179149f99e929aec35eb7c1156cc4965a9464a9dedeb7900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c6303c9998c5cfb6365c9e5ec2c5f2376891bd03e1c4990207d46dc89c159092e69cc0295af654b9bf665c3b28eb6d14b79468f73026e33cc60b6629ce73143db8d2de9ec84c12229eca2082ea2555535fca0ab5e8e6e9ee5d5f289b03f683dc1fced12f20a78300082959fb857864e7b91af372ae509e441f9065c0f0fbf1620208b742847b5798da28099d45ea4154a918f75b42a91429472f8ad6e7bc387439022024c8b4f42f668c71fce12b4cef74f895f57750606d3434b90454dec0d132a80b01431a0c77b1b5358cc224546c7c9ae87df06ddffa53b574be69363bb02a7fc73d361f84d7037ac1fedcccf4d9d1e15911c35f23f058c718b35799a08969b40d02220104d62e1854abf29613139fc78de1012c4bf8e275d3426e460edbdf500337022ade20ab2f17287e8e10476b19f48aad6adebac0cf14abc6e6645b64c193cff9020eff82b0d0a355b3e9ce44f0c4a0a2e3447bc9693845ceae40b80f2ff1964ec802078afe47729883717f38d33328eb60e22fc2c15a714d3eb75f3d6a3f485d9e3b0225cc0414561541ce8576702ef23975a790d26e83a06b4143dd7cd962cd2b182f833b4a28ac08988b5252c159c9a1aaa92b3b82595a4535bf3930672872c77d69a1ad51691fd4f837e41b7abeb25f5d916607e1e64ece650b74dc4a5892665511f8476f2da0f2fefd4c0945e046de201eb1c560c6acc95b4ef77fe2394b424005b208cab0394b93374ad13907398c3afa920983b2b54e0ce4e3b8043dcce3df3cba6f6eeb3c9c8c121009ffb22a22dc5349a7abac0609a88034baa326c5bc405d005a1068e02858bb00b19e8cd663d75f8c4311369b004faccad1f332e9e7a811ddc3f6f626fddfe0bc2227569965402536e0954f610b110cdb065e50058851c8a165d3065c3539e8e8cf2dec35b9823960b1924f3fba33b58788bd49b0807aeb3176cb9cd7d63b6e87dd0049e5ba717964691b7807ba106978af5139a30e99d616edfdf41572dae57643cd3c145f00b1182a2269c436811c5b49d965b6ba578ec5a27854f6ee78d2630f4dcfe686b36de48d9dbfbe31797958f5a86f09a053914ed7943b4d0608bc91e506b3d19c71c64917489cc0f096082e344ac42ce3063469d997560b7f779373e8c6e80ad75920491b72e3e4b5b65f2a2d25ab00fbfa17971a43e467cdea41bf0f4824b8afd0ed1bccbc9b14bf94387db8238989baf764ee3d5e974c7babe041a8a3325a31713ea5576389ed99a99a50a083cc91e75f0a13d8bf3c32c923b6c4b3e9f9dd3b804e656c7bf51f6b712c240ec74728ebc788d1f6f7af07ebe61b6095ae1a75492b86f03ff0431203d415f4ef5fea32bd2d8a6e01fc1c809c8671fa5b5c3ce012c459c2b5d8e703c2011944adedd7895f906697c8217b0b640daf743ceb805f21bb2aee9d1f169d34a62b73b2d9a2218e07cea39b12710928dd0cfd8d41fa93b520ae41788717dc69208f6b6b8bc535683eb4fdf0c0dc24efc4e1158a3a7185fae8f54859e6bf1bdfbc0cbc0545bbe02671ce093a7c2089d94ac7dbaf9ffb8f102a1e1e862e9d06bc1076fa7c77b9be6a6968d0077fe75327512e42f512cae9fdd89d0167700cfcdeec2804dd2a38a42e92649db4f749db6b88601cd5008284e086c3db430df7313e00a051763227679e29346f2296d7cadee086442771796914497c4946d49f99b63869348d53641fe04112fad3824f347cb7df69af0dc236506ce76cf91fce8b8d6b8eecc4c90a33cce0397618f7a8cc209af916a221a78c769d1eaa56ead165716cab907332d4f1472f31253a749e565d7a82d9eadb306c609b5b416a4984fb1f8d573a6b6b5e3c20977807b691be334c749507d3d049fb3532f1617ddccef37aee58ef280cc478c2ea0c9b4df16eea84c7d3104c7e6aa3b282af51a71836cc627cbd6a50319cd52925c6fb75c0ced024ca97761bbb84a277b1ef5df0e0ce8863544d30e13a37624517dc2f4d0f5f7ea7148769761290486743b0b42fe6aacc4af0f3dc10bcc51b182ef1520ad2c40510e1bf01dba1ea6b7f812d4d863e608b51e65f019c641f1c380d3e88c41a5d512cc3b785241678eab2476bbae16dc61bec62949781cb4fb8003917ebb6ee00361ddebfe8a57d2efc4abac43c7d873fd218db29b152981c4d9100bfab174ae7b6d0647972321f9d151c0d6ebdf9f1fb92a75a23aa91852bb16e3c87b0e442396eaa6b8de2b7ae75d07b779b5a04c213376cd15d855912a0299d5959547ea02f2829502acc3d8aa8ee8eab6c8e061186df9048438040abb38f46089b5b08bf02f140870d588c79b235e213a9c2d0a0361ba32d114e9ab2402f1eb6ec4c9230d5668a41a207090450ab70275846abac28b2d8dabd6ed02eef079d81938c1857b3e166d1c3199f02b70295962fd907", "6552", 1, 778737329, 1537743641, "06403f95054c86c88e05570e05fba70e7ba90bae2b06537127ac31ad4d71d3cc"], + ["d860a96b0182a97e3204b041c882b2719edc0184d8fc709d62d9f8f17c12e8ced0723613a0000000000863510065ac535351ffffffff0136d5e904000000000652005163515200000000018352b9050000000000000000000000007e375f2be7be80b0868837718082e8df85e9887983a190b52a66a62321c0c08905d5f409e5b92ab030f5e97ae7b646c7bf9522d77c30d90e40fbdcf1442f905378b20d295b033cce20cbc5d905a085068945ff6ef51166d6cb047fc9c98b1b3f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e813ec793e393b85a5f2f15b62f2f11f9eed90ecdc7f09e19e53740b418281fb64eccf99850e8c2ef1318c169283f5436a5cad6bb62cd7f0c3f232e051b55d7e6734e31a717ea60a6cb5018e238733c821e0899bcf94c0d6c543f648bf7b529ea1c16e2f469f07a3e4b9e4e7436c265defab307fc7a7851b948efe80ef16e778022c9e6811de8e90ad5f215805dc7b61f8fd576d2d471965095fb8e0b120451b620327ed3c79830b57f66ba6f4dc499fcfdaa6305b10edaddca67f14f4f826db5a010a018bebd1d5163be763f81e70b834f041413e00dfe18c6cd4afb115c071ad390dbd4423b37877c11792cba3b761a5efed6b0eb1c3c37d617964b30137f7c0c804032260f708e65fb7943d5574a8486bd0c25051e4b21a292bacff75647a1a0f3a45020c8500cbfb72e6783810f1f6ced71f0b5d5ac6242972d6589399d8c98442d6ee0326c14dd40b94441dde1861d68f3f6c3d1bf3cb2c624484acd7aa8766c1fcc452031f912ed16add07bd2cb895329475269c9ce93615d9392503948df1ebccd62c69022ccaf7d36e5e8f2a471da2b4221670bbb91def3134173f45f3336a9b6cf43a21d979cf2d81612c6c0de0e49afef5e0d99aadeb720a3c6527d53c2cf71aa4c1998f8fb18791625e9ee503c90d9dfcada4c30f7885fed27b1ba7d7b25a253abe8136dd054927c580f48fd4e68380d34f93946310bd5fe9b81b76172846b30d5897f73670b193c3d7ba3bade27c37f6bc4a9f7babadfb1ffaeec0f1a5e0de39afcdc4acc9ed4e2fd471348974d290c9d55bdbdd1caf7ae70797a704005d80afc9113aca3e0cc8a80751e353086b371f17b398d9c8049913ea685badb57a73f73b47fdebd7b6c8f2278a2e1231b6e374b6155d3ecb26079ca754e1174dfcf6b8a3f7a68b6efebdfddcd49d2e9dfdbff3642ebbd2398f2258ef2aeab7224d9dedc9e13c71c83281b1baa9f4247a5c6d0c7aaabd0ce7a561bf5251d541ab582cf1161ef3246585af5aa8e8f73f9d46dd31bf7392a88815f29c2289d7f8a48a65d691a0a1eb1bfb5285561b5cdb7a7404172a241595e9ed1c882aab2ebe5507dec5a7e1f6f62cc83d2ff15ff29c3c7bbc6d58ad0128afcb385966ccf90329895c66afc4b2e38e6a1aba1cf8513f9330273f67ef6161b8c2ea8a9fcb53dfa68634659f73a0a35dca09d713969f5f128ccc93adfcd651e0373e33a5ddeea6f939300c130c1e1d5fb9b2f1a5989dd2791f270a075619c3adf58ef45d0698f1baea9211c3a3abed1f2bc3bf653200195b48d862f3c3e31f27a2e8e53e053b6e6c332b98843b1d218b24b6b0d566e3482da2a37cddabd6ba3d04a90246e6b3d250d6d6dd8f5d1d1903df9c6101df5257f96c5382d68efa17c4675dc64197ee92f109947a2203596990a43f014e9b250e2be8cf0274afb4b991d24be9d8a49605d6b76908ac4d20eec243b9856fbe7dc8f3b3e470d7c197e4248aa2d80fdaafc738b70922630ae7a59633d9b2d87c4234b11ffe53839779dcb928ea4bd6441bce44b2522c05a0257f99faed6661ec7655d0bf9909e243a341c14c6d80f8502893d4edf4068e8cf0f22b71ed46e9bb7f199dc3ddd3c90bb13989832866852643a573aef9994b022f79950a14ae8002a5df216e0687b106912f188e1befb27dd6fa92ddebcdf51a301f78f3b79ca44ebd98419fa0e171476ebd4239d476234e2ec777f79cc3b2314a362daf142e608fba223ecaceea4b973e25ba3f40459f507b0ddce66b342dc2da2aaeda28ddc51b039f331fe9376536ab32852b4ab7650bc80148d606d9d99a9790b8097837f9c5cc78eef7a8140d085f8f0a44b7f06e3b4402282155eac106fbee5a98c9a4998624daec933c3f22d79e779a277092daa6f5d2fcfdf19c269f69ac88f4362a5915402a2d244d000813ea29c19597d8091a888a01d3370449daf74a0d74cff931136c05d0703d78ddd2de79126125c8c61a2d513b5682a6fb0a8eb4881dc8e7646dda6194f8faba7ccf6f86cdf642feff50a43d2772b9e8805460f95b46e31a0f43daa928f85cc1bbdeda79e3eb81b4fc4bab5b1fa8334a17631251c51b02509d21bba71257177dc2f64a64333f08a8811ad309850deeef6e39636e99c6769256eab35a75b2f0de5322da7357e8f528027820626dfdbac6d3448efc9d11eb87c8526005ad2c9aa2c068edd5056aa3a20f9291b1db0e00fec4eae223805af6e591bda4b55e5a6c2ff7e223c69163ccf2117036d931d3b370a8e21a6685adc8809c7819ede470ad99fd533775c6cf34776ab05fc5d76fb0dc558fb8f6cece5b3bf12e2de19c4eff912abb6974ce1303b520613c8d52a2dd4605ad64f651fd631f23586a8e826be3f85b4537dee919c9599c19c5eb9a610cb2c4e3c28674fdda4d145f4e45adbf6954e8f2e806", "6551ac52520051", 0, -1895402285, 0, "11f3946e9f3d621c8441d21c923fe09069f41d3885511dbb24d112d41ebaab12"], + ["241d17210201aacd3e8c0829c55f7cccbbb49ebbb63ddc7343f370a092b6a571276ddd633b00000000056500ac5365ef5bcd60c30f8b5c15f72d0a599fb8ccada630bafb997eb167cf6379cb590e0c2aa7e1cf02000000025265b75df59f0340362100000000000352536afb79f205000000000965ac6563536a0065ac0a64f2050000000009516a6552acac52515313ff2ceb00", "00636a00", 1, -1702354471, 1537743641, "892531c0bceff3ac5d3cb503f7de5e19f5647c96076ccf64691222aabf9e249e"], + ["030000807082c403012160db4dbbc18908f72374a3e5e949ee78e8df1d21c652aeecc965debc32a827010000000451536a53ffffffff02f94d51050000000001acad1a5401000000000100000000000000000002000000000000000023ba1102000000008fbd4b452cd3543f8ee0fad4bad4367ab66d3cc36c61bd9608cd385f24581342472a8117d05e8ee66246cdb0e23e277da62cf05dc30bd221d2ad0facd22012254d5beca422cb2f174ca29803141def390fa7a41ff3aada83008a09ab31fd7f0b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027eb395846dfe1cc338ca4e75861f869ed4c41e12b6705fdd0e48c5a6b81ef454cda70acdccd96d308cb3e9fb46a6d65b6a6787aecc12ad91e695e3cd151afd0ae04ab7d51449f82597e344bc4ffe5d7b5d856ddaea233d54305b6830e8d747fbfeefd3526ea85ed9ad230adca9f2e1f519f3c49a80ca9e78b63f04807a1e669030f00e336f2a0bb1ec1b0c3fc01abffec199e7fc0c20bcf1c8c34e0cf8a6c085a031129af17427fdb1ee8db6976783e7f015f0ab588a533d37fd180feb2222049600a08601629c99948e047caa62a1f81af7a13e86b3aeb4b1c0a8f78ca57e9df5f546427a6186688e05e594a7b76440835f1bc3a5269146dfb63ca5f791827533e13032d6894572acd2604e99a855790c07431e596bb371301c98d6f17f19d8ce894f702018730c0634e43616823a215391f4ed5d7eaaf905d0ca8e08a5f0b46bfa8b7fe0214d817cd284641da0eeb81559b30450427c770346971194d67f37513151f3356031631da70d3c6abecf76d56057c17bced3c2015fb0a1e1e536c72cdba7bd5008e03124a619fcd6a8a896e8ac65efd214fe081d39dbdacf19c1a9df85ce893903398debb578bf803910de0912360552440b84db1c767557d0d2d7b2fd3dc0c88c86600900497e5113fc3757e223dfa842fab856dfc55dff642612cf5454b6445067f92c653996c323763eefa9d77df9321ab0534c4aee72b9fa800518ae05cad487afeeb98a74857d7095c0958fc7986e0969de007f5a8fd5d6533b77ac1ac39d6b782528555ecdce7f9b0d6430aa6ac97c31c4603f7352569ca3fe91bd8192cd5ebb0b83a6f58389184fd0a5b7692511596cfec36be6cb87c092dad07ac69b4a04c323d9c2d8c33529458c896e2d44921fc370469281b61e2467a08b5e118d1e03fe3d0bd1e58e2758f4bfca2c4f905338510686c93497ce7e8ecad65af567518a23a06930016a2782481d2e521ec40b5f384691b88ac8023eef99d47575acc438192925e9b962406ab7e90492d62884e6e5a3d44ef7ad9b0e3555a67f7fc8f4f00a478bc6dc7a923ca24a69d536f0fc653b78d4330fa2cad689bddcaa7db63be1cbc5502996f844a23d2f2c73bcef64d736fb75c8859a69aee35a75f21d0326625043addc4d13653ad6c2ca9f8f78513e05b00dab09200eb7402652f95a75ccc80b3ca2f9e52ed5de64bf0ab8afee2067e8f02502fd82a9492bec45fbc3aa8503099c2c5decac1bbdef2f25941028cb8d8f74d5bd73310b9a2f4d5eb684aa5bd529b0c85faf171bd43b032417097ca090863c818e311357693cb36284430e7e808e923f1df677f0de19c781da3b824abd217fb57221f3125a391a5f788f63885ae0ed4ea31db5fbbfd8ecb0f5c597d115f36e20888affc1b86128145934f9156443e88dd5b98c957f8be1c003735b3438f32f3d1d209ff81bfb090fed4dbae259c61aeebfcf176dda18d2a1fb6e595b0e98543765dff1391d2c35176ed9802563a151d5a3ac017ecff9d7f8d02e232069f1c6adca2092f36adf0b969a9d996d120a87d9e43fdd5c03aa4befbcc507d6ea12032bc0cdf83f6790c0d18df1eb66c1666ff60cdfc57b540954c32093ee0e55e683bdef6c71df4a4c3ffae6d9539c33ac09db287bcd036aed9f868d5504c989f4eed2fb9bbc5ead8b4f4dd4c1be62d11fae694f28504dff9068d56b16837f04438c9622784b661fb90106f75c60890aa1967a7f109a7c081385567a243305bdaf368292caf81a51625c014ce9aaaf050f6f0851aae90aad5f124d36baa49c5fd2a09b44f32342bc81d224878e5ae786bf1415b65d879087f4bf9557be65ded8a642c1e2c7b79c310fed82fe8ad9fcdee981f6574390c9b6595c0b8fad4fe1297672488eafc6f59aca3548e99b6dc5600576a3a0afb6d94d69c082a00aa1f607b2d4a938c508d8a4ee3cdd2a60f72b1cbf30a914d6f13fed973a24fc2962e87d6fd2f9aec4ac8fd6a6e64d3e8ef10112f122ebe5d5eea0c7be8dae6e888f68d6ef586f879ba8d9849b349ec3eca7f6ffe8db0bab2b0978392e8ece45aa88c01477ec21ceefe315940a3bfa5b5d39ec24547987c6aba2591f0622145e7c5ca2b4cd363920fffb79a1dcd7e66beb271cc6a843b5e933e8c6cc3c2b3298502c9b0cc1ee14cadafb6616e014db33975226bf0e32e92ddc433f198628cfe5a661191c42ea635f651589943276304359edf4f35fa9b5282910ff0683c8725d124ecfd0b850acad221ab0ceffd04e6238863651fce3143f963ba65042a347524fe6d1d81ca78b81da30200000000000000000000000064e8b217be57ad11bc7a4bf73a0579c66140d3654de4032799c9e4391694c504080b490133cbcb892ebf07faada62bed40bc343854191e4f3700c0ce9b9afc234c93ddb8193b7cb6a388035c27a6fceca140d77f2f468f98b6ffdf59cb305fa60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000095ef9e59f03817b1f887dd74b151552323ca9e758aee6331198599865c111af1bc12e7255803daea66f8b67b9376a71780a01e9c36b5d560506473cef0ebd3afd4e7e82cf94d0565d540d46295d3151c9ea2937c9870865b2f5d59fd1709acc1f9695fe7bd19e8e66ccf848abfde0b4d3718266cd4b5f36d77ab6333ed91cb2f030c7354371e3ec59934a744bc9e1d1876bc5a6777d5cc12e2e7be9f4d0b84dd28021fdad2bd61aa80a25d9a4e0c0cdf3af683fa9fa9e5b42402bc768031efaae3e60b07593db901b4057420d09d237cf0a34c75257955644349bdb732813efba0286881018e62957ee054aa065400892fcb8566e97360b845597069293be22453a0a3020db2ccd7ed941b18021ff4e4754b47bd0ac83889ddb27d07b048608fe77dc8cd022acacbd1b0ff303260480df278c3ce47ccab5bde2035ab96f2018fb7e7561b72021b73298026466585fcb16c2c0760bf30b8ad073ce5558d02b9e481113654c6f7030bf924de738323a6911e6d74b037b5d2a976ed84338d5681ccdd6932543c04e3021df3f65a0fce532d416f45ab8483b58326564e7b163c7968e8e685098310956fe7312e52df04c3de984c16c77f0f33bfef56ad4c634cb8dc768701f4d8a231b957548555a227e8a78549c68bdabf5bcbf1f59c715d0a6d51f59a933d7218ace576de09454d51dbea4aa96606f7856f3ec8f3d1e0c321cdb2238c4060b9a0cd9176fbb122d79b81eb35f220ef6efac9a0c5dc008fb9051b2a0fec87dd462f80a484f8b9dd3b44981206b94433e1457a0fbd4d86e190f65aafb6e9048b99fbaa4ef8dac6cbf0ddda4f6fd35d12234873cffbedd8d571c964d3b031670c4f093438b52e4d58ce70ec1e549e529ea2f43ae09d50bafe9da7f2abdd4e270b957fecaef5d2c9dbc902852b831e6808413ee365b62af1dff254897eef8186cc56a1fdcd88c900060950e87641ccb74704d20c6b733dd2780c39fbe89df418c99e36bd7031ba8f588550fe414b2576c18d70948569c9c592ecc23f676023ce01381bd0523a75c5ede4ecaf98fbe73cbafa48c46066c96871e8182df3982174c0f153b774061f7821d14cdba11eb6e32638793d19891683cbd251de7cc43048628933a2877533a40f0277b66d51125bc7ba68d47b5550c14d875997f34dd02736acd2179783f0f93909be83ecd12b222067135d36db9084e49edef93fc833d7f42b3ff8f9ccac4bd2d613c65cd1dbad0a4eaa052205eb5d7cec17b8f0f778bab2c5a7cf61f36a7d578ecf7705fafc95505a27838c2e146818b469eb8868f5037c8b94d9eb7201c4b62789be8d444efc50cbdf278f6404ad2d455b8c4f5d50f15d74312ed6bd695416065b8dcac109ecdc3b1581328817053a30bfe879be7f6baf31552db8cfddc8f35ed038814ace754c97ce30fbe6d63ddd4b1cb41dc81062b143270cfdb1dd390fdb57e037d11b54fd971147bdd5810964eeff1f0d5ea21252956acb35a00a9ea0260167f634ef9cdb792bf9f361a9d904ee28f0c76705eaa8f96c34ebe77e6816b64446c5079391130a27a4b87bdb89b344f7739ee8d372e0ad0f5481481296ade57d8d7c526406775b0bc3e5eb3f9f0099aab442927f91ba556d13c3c66850d970d886b6e966e42e4c5d18100cf71734dc3923f20738a917ed3a19d35d8d4698ef0b5ff8e13442b7800c2943d96d3f94b5177b0450181d8420595260bb0a9c808c10783908966b1ebcd1f09a338e9c0f6b6587ee6ff8589e2f516a4e143bc62578eae6cbef7555188a059a4027e82d6d9cd31ab41ebb0f34fc99ebced21325802743d5e1b1f9b2430431d6739de4a8431192f4451b797bf148ea55cb84e29424e515bd2a6bf87aa779787d91a87f0cf5bad54dcbb99ebb691dff2ab6da96a3f37fc8ef652fa1a233a7c6db23eb2e184e838e23fc94c30fd2e441d0a4dfc0da8b3d4ae48456497c7145cf4e2e4e5218fb42e581ce6617d60ff6c9375fc0c3d2c83a7076befaf440b153b2469c931b5334d9e7e835f152fae3eff7261c4c3d44afd691f0e73f87768a1e4089d0aca1c59575ad6da57c51cd999fa85b2a7c75ac8fe875ef17e2c305d2a3c1c16c2a90b8052f700ea4561f7cdb07781ef87f129c1468d8e79206f61a3a47aadf511ad835d5404c3a6b03ac2a619d3e25effa279fc014e2044530344cb225f3e9277c759790608dcce5076de769da8c84d4c42bb53a3452411290ba62ac0c2a726399ee56683bce829fede093a2be0d47d6d889301f4f028a5ba23ce90df798d738450480443e3f5108e1b0ee645cadccda2749c275ab34f358ec5eaf8c3a513cf00f2e78281364e5c31ceab27796472df9109344ec413189fd388abebc77d5688a59bafd470cab20504b375986045d7393464bd466831203fdd998f1eabeeffb485c04", "6352656353636a0052", 0, 1986728598, 0, "aa62764d8e4216bd4638e5703c601ccc4f8b7f797b0482caa3fd2bdf1ed4ab34"], + ["3729020702f645aff8d91f228be352d7d10215e6abf4bab7b49d4213f9dbf746271f0f89b70000000007ac6a6a536a5200ffffffff7a97950403578aff38854a4d49195c0a8ed17c8f183cb12f81b96bfb8a3d51e601000000016affffffff037a8d1a05000000000900ac6a51ac52006551143de6030000000002ac0007094503000000000500acac526af88da5580332fa0005000000000000000000000000c565d6fffabd04da753b1325f6e8e3af17469b010e5147e232451e5911308c64aa3984b22ae4c8fac505d3159b5d0a36c7e3f9fa842711458e3d5e54c7c9f0471f97c7197d65ba49e235d2f9c1714282990a4845d30fc628e0cedd0eead973e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086305070dfe7f504b3bb5cf4eda7dacfb061eaf70767d2aa1f0c1c3b2616bc841f3249711d3a1797ddbbed3fcdf29953f0ed5b2a6d1bdaa45781314b4e4a1dba941e0a71f2d55408267dd3d5e2814c4a582cf94b5f523981fc91faad6de8bde6d03c7956d7527605b7e23f1a402e389ab59c01dd47f625c82919a0c60d4f294b02094beef6b9c8ee7ba059796905f036d6fa805328568a0be8534d5f2d1af370f40212ec999ca8c80bee1fa1e228c96ffbaaca563e92d9d26cce5169631539cb52480a067f908b22efa032cd86a2fc61a43fe488b2e41648c959774720a2ab8723dcaa9e93792b11a174bdb52e5dc80cc66024252b8eb424b25a7e4264060b367897fd0309a109d1c50c5746daf95f78300c0dbbb334ade74dbf6b43e464dea0969308ea03151cf3f7bad86462892e240f54deee3799a463fca156c76b708c5909589de7020205ddfd6373d298bd5e1d8312d504a66e7b92e9721583e2ce020b3e05d14df5ab0215df6f6940af81506671782b405a066b768183d8df30ddcc6e75fb04ea78251b021b65725ce4453cd8b1fd3b9f283daa1f989a8ce7ea47656f5fe74f3580515e112abd1158ce274312b098ab156dd4f6d3fc3517e727792a8e69e87a27561e2ed2bd089d8dd9b940cb880a387303305a671d2d2a944e84b989f85a6d04f2092baff0d2145945435f035e6a329010a61d1f95e6dc0f0db8ec09036dcf8873ebc41ebaba5886ae71f294d69c8f6280f04c9e5992d93a82a7239c5ffe4efdfc9d279f655767a732555f80f1a39df9918e611c5f61e6cc7b3ce4152e571f56418a0ed8ee6a4deee6b3265fdadd1ac8a34c7dcbbfe35f8f540d34982738f473e906d696fb186f47883b67e17d7f0fc95e988e2715637bd4bd2291a6dc08bac5b3a847cbc9188b475bd023da9c394754ca2fb226a3aa58f1ff89bde93d7625a1639e56a77484c3843b48bde509cb44beafbe6dd1caa393a7f3c51482bd77a8ebd7202ffe0ef15306a9e38071db1674b86a9120deb3ee09caca5211fbbb266216e44a3297fe3b6cfd575919134fee7ed971101a380c5b80418ad27fb5deeaca66a1f6cf7c1e2a9fd8cdf8c8c26b0b58718fa5c9a363ae7c8ae24494472be71ffbb0590446fc67dab80edfb98a2ec4d345ff575003ff41426ff645448839049288f0af0928a35a3964cb31cd43bf621ba63008936389eba7191b87de04ef2bc3bf42e927cb8e9c273af0ab64c2c581f3c8cbc7b7538d5975a128c690320ff6e5f89031a6a06a5d2b96cfdd86c1101acd63b7a81c1e9389332ac30c19ac8641c67ff9b4d85de0fb747686ee2eadd88f89225dc053bc2ba4cea994278e13f9a04466813b61b8bd5896fa01aa54b3c5812a754b43150445c358450d73e5c3d95a09730faa64147b3f814dbf096f3001c5639db74965bf3adb6541d756292f80489a6011c9287847ffee1f8071f3662172996cff71c795647ee410f88977b9919c4e4dc80c83410d69c518efc6007a076b2110aebb9e4e76df1effc3c62aee867307ca813674d96fc999a7513553b6539817340eeec0cac45c8ed99dad7767b2feeca938a62d26cb6ae4b6c8d46af7ada3e1fdff4ccfa001dfa2d3622db8ebebc405139e565aa6f3e5553d1c87434d45738442be2cdb068b5a4d74afa5204a603ffc11a66ffa78a518787a4038b8412eb241aaae33809d6b2115b3a7fe18b1ee2101555eb9dd393b6465e7ebc806cb1ae9efac0143fc0dd9fcdc9d085798f496abf0e60173650a1a65cfd344f9ec5fd86c49ff0a3ff61cd4e79b66362b7325c28b1c40fdd43d0fb4454f40d2011dba03acd314d659868898b43099b3e1ab59dfc7bd4f9d1dd0376041a9c4810f3335cc1c77b6cd902f89388a668b5f7f753ffac9ef2db1133869d43f488486a8ae6ee1c8eecefde1da5e68999800303e25bbefaf284d0c9db424d0dbd6c33feaf36fdf8252c3bda6d7477c099eee90cb40ec83ce3277f845edbc284050d9377f64ec87ec9c95f04e2ac87d2ee8a3781f3b256706873de6795330d570b5e1be8e74e5ca80b1b680a8a97967fd95627eb8fc10c7ef7adaa8f5b2ea6c88b190a728ae6fd8e5de5eb13b63b26e296557983c1be58fa9c7fcaefeb172b86c93cc94de11f18323cd8b99cb10b1e351515a56db50089c515341908e8ac4283d3e007335eba9517b2f0bd512571a051477f792239fd94df08cf8a8ca83b625786930843a772b5b0b11fc2647fed3b88fff4208f2445a4a05fda1cc71d3676e258b77cff8e56b11386b74a5e39c0057aa2e20c804000000000000000000000000b7dba57292c483d924c98880fdb754a74f512c8c2a19c728b21eacc599e0dec730b109a24cbcd96bbbfb74eaae9875556d5b98ce667fae1f932a02d68fa1408de7ca35721371c4c768ec46766e76cbb1dd3da92c5354b147c8067caecf2daa6300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b87cea796aca0a69817feb75bc71bd0082da1957302936b96966bdb16fa85e8c55d6a686e78780b3b7815a487748c10d8ef86497d411a57a3f4962a030955e46af1079f39b9b5ee8101bc811850d001e6d49a8a663321de4df7137d11a172dbda11efe090f1eb0ae8930f559679c88dba18e099c8eea5cbaf3a9223e481cf4c80209c084f62a62261a2db340968363421030bd93b23463f20df2f43dc67195e210022cafbf74f9170259d6e84cc1cc002c33edc8f7c3930f1987df100b65cb71453c0a0569cdff42e08dddd80de1a145f477c3b5802559894c7cf140ef06fbe5462053fca1102ec730b6096475ca66dc6e9bc3b9bb96f43e8f663a6833918c00fbc20902014be97b7ce202a2de37e14e4943d6190049b9df9ee18ad52d27e4424f1c691403262e01e19f6a4cf7f22d0a5ea3ee39cb105183347c32cccfbad1ebe0bb2cc86c021ca93f7edb4963af0fe5b9e38507cc721355fd4ce01775c5d377a1bf6865aea102148d0615e45a7191d8c951ec8e7142de33402a0adab6d7ef8aaaa8939a83ab360216ff82b2794a0cc2e7fb72944a85cb2ab9f6b1705090145cab9699664330a3afcfc508a5da3d14cfc65e549dddc29747d54dd136d7a27c06616d82a85dbb6e392981d2e0e469a74ee18ab63dc8f514f7d2f5dfbd481189511d930f924bbcbf1aac536ea6709cd852666968388aca63634841abc9ce81335968c9dc4488f8a79c30e17c3419c16f0c9b350503fd281ced8f081ff6f3d8c4f398bf9821950a239dad1229db676f9f8d0397fe91c3477225124c6d191140302c3d21390247a4c4865b66f9f1cc44473b57e540b2e6bb44c4aa41ecc0e8eef2add35a3c5a92ef75a06299787ecb8a93bfbd9f5eaa876027bf666e0a635af2675fe6ddfde50b54691d3ca1af77e4177adbb3924ef5c4110b24e93da93e1a145d29be9841d2dfc183cee489033dbbece366d13310965053c00a4474e232e31ba7912c11ad43a4630dd9e9bed47ceadcb095176922ed35758d70d590c08923a3bebf6469efb6e8e12878b9de1714c833202eaa2dd655b08d545dec215c2096cdb2cd1dc166c60649d4b26dcf021918b55b17c378f8365b9980eab0f17d99f6219410d6ff8088400a74f91afbdcb05d058ba7134c21dc299cef66718a423739c28a1ad942003c73eb59667bea1f79f499345200f0a9fa0a78b2b86e2ef437dbe8e41ca10fdba4ec31771863ab2b08a4be25fc3791398d39c2e27806334ffc931352b0ede22000135fe8d3dee02d79e5783bad6d52f017eb9c31b7ab20f6ff90e09fad2a3d8796ab597c6f53cbd2019b2e0ac73fd7956296c67d319fb27b7d396b1728fd41cd8b752cc4ee9f3a67bc8fc58becdb4d8c650f5de0352b602f493bc93df5b92b413fa66c8a5c5f83db37377846278d345c457dc330ee013a3d130539fdb0f9178a57ff353c7ccaa5346727bfa6cf50f69f0feb38a41e9b6b1e077ca7a108f598a193695e57a93df3b8a7c558f7894c01364e69f5e7ac2e93b4cdb712c0db5ffc9b8d9c04b59cb030cff9212c96d4d35cbfdc0fdbd71c9dee0ded698de1f3893e014ebced28e4bd9fe7b54b9d5a5d3e6b5e2d4878156682aa123a631f4d126bce3de89689b2e182b436a7a0d54ac14391674bd17b903d67a4e1131f4ffac649e1270b93849f253766f1bda40f1301fad6be1bd2128176db7807300ae94c4c0ea530e01f79565f716bc4cabdba7d73dc95cb2b874cc00effff7edf5e1ed44ff99c2625c6a12cae06ae8c48a65a90240998cd9e5393f3baa6048c9b14757566b26fa22e7757f6dae255c7b001caec159370f8097b333851dd368634d1babb68fbb8a92788b4377fd8cd328badf8b203feb24d40dee38d7bc2362ca2d4c2ddfa0cc94654a0fc8c56baa9c427a8c1217d81d92d560bd5674407cb2d27c576d994a7fc4a7569c7993a6cd2762d5a248f1cdd7e949629c2c8ff94c490571d0080bd73a7b8502622da78d520cef08c1033dd8293495e5048f1dc785763d1279efa6c7794aa226357446ea6f94967ec02bf5d981c69bd0c8263ea945302f26d81f6d25bb34fd40b03b7ae4d0db6276f99086ff1f8472d0dbdf1ddee36644259e7dc11331ac3e0ab213fb1f4aa55958ae322b84fd28bc585df97da0adb8dab2d9b5bbee79f103abe55851b4fc66137aa8775fec6e6b6deed94615b18fe325cfc24d170fe91d039d5904be4321fae83b09317a68391fe039c471645458e6c7daacb22dff4fa4ad2b22ea2a0e8296c36f2a166223a0e79b94b3590d0f27ae217d301000000000000000000000000dd1cd389261ced07e0ee1dab95e03dc6298ad4fc4f3250d32b7eab49a9e1537cba5419176f2b64735b78beabd490bedafca80c29103ba369cc0c4baf50180eb3ebf7997e3e6f86aa767bcd16e6081c3edda694ccf99fb067efcb7274245f60b9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000662d8eaa9ead8f38cbeba0b355b9ae6a4f437b9783aa8fdb6e4db060a552f4121adf475fc04c8ee643f5482cd4bb997762a32bf2e46b580d855ddd1e1f2058692cea18c487650f7568555a7601f71b148a506ccaffdc76bcd4153e7bd737a6070db594ac96b4d137b869da25a0e51e043068a3226d064775163b3064947295a022fd9d4b1b7eae1a41f42011d3bcec4e19ec7550177dde7f982cd8911376c2924021a67b96588c9d8ce2b61bdd88e99fd931f0de7f278ac360de33fdf2b6c276e4e0b05d74e039368edf28feff2cb9f3458c2f2f2537d9a7fc30e9312561efed8db3610ea0324d0434cac1e5391ab9a39a137201ce6e5cee2efc10844eb0638a0978c021c0330b7bf89eff1ec677d98ffdf5d7632887d7054aedf11605b4af73839d59d0207e48c4fff4a3e2f6a60c3719be33971b98dc96fb8065cb8dbe085fdbd3a01d3021c07b56647397d35f82dbd418a41ca48818acbff3518e453601dfccfab7365240206308bf2216e837156aaa026af1785859777b7374b3e7478dc4c6655b35ac850020b906c007251c2215b42c379460912618c833a174355fea4a86f0164b63118156dee5b4cad42318a4a7d8bb58531cf870a0380ca0dbcc54d5b89c0332337802df1daca91dc5c07edb82e0f6dc23d75d769af60c83b4b8036ca4a1238d7d14c14dd9db2b5beb17b2ba87952bc34037aac712bd316039acd6d683c80706c711d566c67dcfd6dd8371b250ada5ac59bfa47dcc4c9b537a4a537775d25178aca8291219e64f3fa348d84e85af3d82f05cf330451601fe3b330723195e78529ecb5658ba67d174f636eed1e8e332d8d9ff5cdd4fbe20cff2401a184e17f7d1549f7600fd25d83b3cbeb3169354620ce4b17bcb8a0c522d06a0578477af7fb78f4510cc762287ab216da01e7001874009a911b77fedc603fe054c20ff4517a048d93fffd9c0ec2d0a878ade69bc35f94346c7c797b281b271e075212e98275863ef69c62fef4512d4c317b95b8d3d4c5e130d5bca4287471e619f9fe184b4f3a3e1b52f887d578186586bb9c85119459e4a6f4937aa009c9183242ed5a49b6edf1be94169a001491448db8872aac5c67826420cc8866d98f79e5253a36d7c689a671e3758289f74d3aa031287c46f36c385ca609e5ce5a7acacb57423ddc814ab57a7b98ec7301437a365583adbef044da02f9de97b1cdb04cd69128999408b4ef31855a2f06786c86be0f29a3960e7f9d571dfa4ec3213171d36e4531b37b088385aca2898fd302feba9aefb222fd9dbac6cec8e35c22864209524bd75329814aeab0d1829073196a223e556d12ee5a820a2c67b58a8e28c73b1dc538ec963ac9a1401f645453f0a431abad166fd42f9abf39e2b8ee29a9bb5622e6348592e26f4581d312e40351bf339211133c2ad89e465b30f4d66799547dae2b3e505caa34963608e5296e186d3b52bbceeae49a8c955b68398338d2b87b5bcbd6f4db9fabe126b95497589396fa52540c5458508d18f9de0862c4b46ee5e31491db605658b0d49ab505bb2c093f1691b67b72baea742627d36dde25caf72885bd887bb8942e43cdafc2ba844f37923294b6b5d70de34d1a273ce9591dfb22026dc26d4d1ead14fbd3251c9aaaae10d2f953fa5e0ce202942bca3b9fe903598afaf9cec97abc274975b651b72c284a9ef81505aeede46813e3444865262ec93c755ccc456448e1c8daa9accc26fb0775b35e183ada71d11bb2f5dcc58f7fce3a202e365c77d0a1d1cde37d8920e566714701fdd4ffb2dcf3168ea88f92fd3832cb421914ce763616b11bc3b729f153b76531ae6e60655732b7af2118e1075b2aa0558d1d117aabaab86da2e8a7518c675dd4e37854031df7969c03a260ef33e20741e38d02556f8d6a520748e1b05f79587939e650072e53b2e3b51378781c7bfbfe8f6a4796b518baa56466d9c13a06de6a746d3f61173a90ae69936ac084ced71a29e8c9cad96964d6bcf7f7c557d8cf29a18bb6ab0bf00929142051d40438c437edd4247646665554892bc93a668f5e405ca66a7d3b25bec8f982507e41983ede5c5721d71ba39db23b4b1b7e36904962a46e3994a47f0d7519878bd685e9cf677b2bc919b7129e58642f1eefc7dd369582efac032fee7a8d7f07b2c7178f3d1c782aa27532a73bc18257e71547eedc0a51ceef14607f6c01e1d38b1f1b0316beda9059fd09a3ab9a1038224537bd15743b9cd024316a8a6e78707a32145757fce60c965f788bfd2472869a1f996d94a23362cf47580a90e29aabdbcfda87fb5ba637924bc1dfdbc3e73a503048cdf6a4d820adce8468433d8324d94f6d546b99fec8673e53c2c81a31f414704d524d67426280be99911137e5e68c4bf7867b1e01754a2f5276b69e73b343e1446bc6420b5c12e424e60f", "656353", 1, -921078842, 0, "2926e25463ee4930c71580a866d780c4177b0296c400a0bbf1bb411908f1e0be"], + ["2d921676017ba0a8d98ba949422f88e1dadf389934c32da3cbaec918e829de447bed707b420300000000ffffffff03d536e505000000000552656565ac435d7f05000000000753516a635300acbf54a801000000000153000000000200000000000000000d67ab00000000007ebc4bec6479eb7511ed540a5cd58dc3e3d6def44e6d6a1a12a05670131292be91cc9e6d3fb93764f811046c34c7b4186fbeadeb98eea2d45dc737dd5389a57da56cc2fee5f0bf7d72e69e705c6afcd75a239e0113b53227c0da16e7e3db39840000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091dcd086f1baaf28c2d75b8fa78ea287bb8cc7a020d49465ac330f89e30af69b7b7995dcf9fbe60cc49baa856c93e5a86bf84d4ce1d907435c28628798ba95412cd4932ae3d815b14daff6ad08905959e3a6ec32bcf6ac8c360e2532567f66ff527c4aab8047ee9e68e74c282f1131f0f9a2be799b3172fe0fc31a256c4070180328abd62509e2ec4966e74a50709a68efd611768d2f8590a14dd1f58203467ea10210b908733c0516e46beaefcfef40649157e5025d82bfb7656f2b6ba6571eba6f0b05a13a79ab1864d13c2de2e754db049d259d1c32b42341d82679cb9c3c8ce0d3be06a14173d95f9a99988b5bcd845a368017d4e95f369a3d91d0837e493123d2020b9e8a40301c93fad493a51878975cb88b14a53c4a9bd1519ef6ecb1d74907480201498dddef9cee661bd5e2a94a4183e5405137f060e6d0271da1c96db46b8fc1032ffaed0cc23affbd7d8c809aef15075858d33f9480216ca2da585f33958a71780215ff672d8d3ca9c982e676f8efc1b1050f1cafe34327d8dd5e69aaa95d54d5ad030b5fc2e1689f2e090a6f7a5f27e097e732e8301729e839bfb92fb48aac07fa0821233d1dd3223c92930d7b31c3e3c8299d711bf8a7ca4631f72ace98ebb00137cb211b757ef8e2fd74b447b8874bad9ae8c77a73574f4821c1cf927c7060b6200be1592c79614593047c05b5cdb8c7052de57e6e92c5f11873c29faa5fceb137fae3e514d6c4756924cb21fc785ab881555344a6c62dd8df69f095461cef47dba282095c3a02251122e67511ba7ba6c0c4d4e359c658e21f051505f2ad90648ec4c7389a470de49d6b8aedd5c9f3fd6e2bf58449874cd682537cc722a71ebe25298de4cadbba21a8af98a372f21d7ca798b39976e72db940f44c857c68476ce8e0dbd4b8355ef9b32d75d8190173dc77f8b5585f4c2f14e4b28656e5b591dc238d0060438c440e1ced7c10b160a5c630d58126692f1f4f2fbe5c4ceaf2b977e1a7fb4151c28ff887d3e5909e903864be4cd1af0b6477a66dbd4fbe0a5aad993e711144dabb45bfcddfad7399acae1da7c70df21cada52bf638d8d835e7e7b511ce1e7e7269fa6b5e6be122435ede49ff706c2ca1efcaa8ea7d259564633c7961fec17bcc34ad6fef2c2d144d2499dfaab79ed5d9df486677608cc71de154dd386a5664c3f813594df68b3f239553be42a0d21268a48c8176e2174748054c4fabe0b6a76728999f8faa5a01f2ce8175cabc695a38f7a4d6e8d544e71e29ff34daab598dc3e97d2da32abd3e7d00fa7a859e09c73fbdcd7a21cb11efb0d22238bbdc68ff89680f6e785525c63b105ba3b24eb63bdf4ce174ddb956cc53c0a319273136d1c0ad87c7c0fb29e8333ed7c734c6c0d29d5401e52fc4e6a517de6e4842bc22362820e9b048f987e58beac1f04aa7d56d556bab32d665f37e666e13e757a6c9fe4602892bff6328b0267d1f6b92a4dfbc8defd61d58651cf1cf8e7a13999e5b5be8a388f24f7c0f4e2fd64ceaccb2bb5f19e2e172c241afb00b865cc7dd8c2db6df4ae80b698e38c90b77a42db085facfe005e35507262c4347f48732c5abd6512417ec0e0fbbdabc6c7dd67810b437410fd5c8c6941f7dfbe87e24b3e73a4a07a3a866e12699db4bb9a7b139f9f0e12e83b979750c7ed7d4a83c696dff065b3a664fd37ae7918100a4bd8d80ea0cfcc0264f725a54f76b89ac0d98e5dc2562c61a7f3b3b7a2c09e4cd4761ab98df394f8738191a37826d9a36231beee1efd183c8a87d8a2ffb2fa2f082429fecd4562faf865579395e86d246425a5ed6ba4e34474002515271f52d6ecaa0c8a1eb6a53bd77e77506a357b096364a9eed4153b9a452191359787ff5ad77b3d0f0d915ce2cd19752f1113a32b68adbeb634327d900a923835606342d601f5ce93de4ef409dcf35c198f696deb9216c63ba81e437f04a1136880845c7007a95621dec8b9ac067e5442fb37597c45f28a062a6ee7d836d0b8ef9e3996da6156c357b138875a0d5356c7a3b224b9e1faacc693f4fcf31ee4548d2eedd83b1f3ae32ad272b527235c7ad94d51faf311e5628d5bf5507d53cc1f5471911756364a9f58377cd64be96e09f9bb5a9f84235cbaa3e8d92085c22a2e8e6726f7484d778b761d7a829eeeb1d32dbdbba96591a0670a455994a0eb468389e15a0f058a12dd08dc577e5518f935ebbc55cbec6c56cdf96464f7d8137da7022bb27681adcc2406ca500e26ed001fb4ba446bee88b4feab36439ca2760dcdd8bcd512a3114626ae107070000000000000000b905a00400000000b550ba485a73da8d29de2588d3082c71eb47f2d1ea24e4eb75d13243ff12610d4072e47841cfa3b3791ac0af2ae0fc7c3a99d92760ea142f130fa9657f534d1c94d9711d85ba03a7c8ffbd2aedb043ddddbec797f46451ad53b6e63538a2f2c8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ce2fa45ab7cde0ffe70e7402364b939c16a193323823829426d9ba5c06f8d6e7ec61cb9b38d7da493cefd7efc1ff692d108da60c45e2f227096998a75899cd19289385aba3740e0fc175a78e7a8ade951e0dc9b9260bcd45eebba5f08eff2509a788b768571f0b52162210f3e4c36970e4f91176da655e359aee394598ea48602294523603d7acbbea44a739c9ba258b832a4f38d4b12e71c22e7460f6f2679dc0220e7d1f7bfb8e76bf4e3fbdc41d34e94f87d33c097fdaae59abdb722a7631fed0a0919bcbb29ba5f206560f68cd0e236b55a2a1e300e1cec849d209abe29c0bc1159e9a4c562f0dcb3c655812e91072340ea5ab97c2d28e9f28691bea8097c3b01021e066a62aa7a9c80e202ffe6c84009b64ce376a94ed65097a7f332dc14306f170229af37d7f3b766ea8fdcb33f941e9e1c13cbcc3ba31b94087fe1fcc7226b86e602145227ab34209e1c352d7a395d36ed920a7d08a7ebc63c1dbbe4fe83a7eace6b0322f8469977c7d4ca15b74d073e2949d1359a9bb9a5d7d67a77a3a73aab34e26402061ce75b61a4dd71085c2a03bfdebd3ba04c268cefc981d15a26f2914441c649bbcf87bdd3bcd5f31c7bec79ac49bb51c00c213e492343aecb2bca886d277bb66087fbfcab133c1f5520f3ebb1e7e70868d9273fde94bae1d0d8b61769a0e4a97f8bc0cc04ba5ee9fb3722972d85ede2f4d510e91befc513b27e6494a8b1d3ce60fe9dc86dcaa9be1bf2e0934d3ff779397a0762c1f1cfc766ef1ebbbf580bcb41846a89c6117a3c317a3ea55bde78dd2d3b29e25b6797ee4e822d7fedfdf51513439971465d49074b20e47474301552754410ac27d80b6d05db8d2e73771ae445b99e7efd25387936b83134a5b8c627206a5ae1f6cb98de51a079d9c77f5f9863f21f02046cd408bd5f1d9dd51d6975eb96ad38d456684ea916c8b8c97f1e24aef345d3de976e7a86b8e81aefc0878bef1925ae33f42e49a68808eefcc789b8d1ba31c47d4319023e6e57c9a1e7f58759f39fd298b016c48fa9567d762779855b0fee6be190c090629ac63a4f6e2b56bfb3e6c71571d8453396d591c7e6f8e8f978e40ee4868752522db1a7678bdd7028f9faf12e75190faa2a9e7d2d342b7fc05d82ba2de32d604cb6e3d87355f8582c7dc87bd9ae8dd33850caf49934537bccf2c7ba7d83106d1c56b2881c946b7bb02463542bca756d024b55c8601f0bfa3b732132d3fc5fbc06d27b1d017d9c8abc21c7cf85b8452d88691ed85334322fe284a0454bb8545ccd352a462a49311b564293db8294a04cd64f94e55ff92e43038b02b8126b7ff266e74cad84593c08ffe222044c9663c34e6542397ba5f74a5c938242ba496a36118efcad07413d67bf38afe65d21501f9a97c074da8140de19b960e5000fcdc3f16f46a18e27ece7570f43c07a022b6bd58dd643fe43ae78d58a715c243e4002c1d0a2b73fc7084eb53651df12ffeb91fc9ebf41075497e86859a38179ec5fd889f3aeb0d25135b7ba10fe5ce190a2e58803588fee1d9a835b8cb3202cb82fe11d8a1ff9b79a49d5136390c11b1d3457f8a6a217d4028d30e988770d6fba6e24b86ccf3b97d9ae795e062c28d91d6e5b68569feaf35da420bb8ba7998624ebdb3750935d769a7bc8143fd08c6e6c9430ab555c1c1ca306e7b1258ae29daecc3c519944cfa90eb7178c5596864c96a8124956c0b269d74ed81e68c7d0714fb48728d4b21fe0ad038760fc8cd8e2a825b580fcea1924c0a0d51c81e7f0d7bc2f291451d6bb29ead37de3aebc865e18b9a5aac2a60f933ea311b48bf9560b092f5f5c4062e2e84e58aaffae8c2e4cab0905b570fdf7805389de8e52a3e3b1a9fc9a6e2340df9cfc649cc5a44c5decc49b59019600fbf8eb60fcfa173c6191ccc3698bedd27c6d420218f58a7a3980a374ec0ac2106da66b6e92d04d33dac7df5c493328a10d8a67b94dc2f92963833c997266a31973152d395211a1ffc6d7e7a31b7a81c3dd0fae5d8ad51e70ac414f34c8f61a8c4644d66989e09cada88b727f363272a2cb13460ca3873b0af563d121cd47a45186875285c29053558d0e7d8c6d8d06099612d916b1a20dc2b3f8bf195fde8c96e920ae29da3627dfdcc7157520498648e5731d209fd62d35c1ab1817154ba2079ee4fcdac52d94c79b7a5cf286edbbe78edaa98cbf6e9cf63c70d69fdead614306ebec4f444eaf28efdc795b30ebfedd173b47c4fd797088c685a285e4fd2d527ec0b7643a759f7edb6259f538f3243b480646ff7a21affe69e400a2630c98eda3169795c06949dd93b02e42711e1f9942cf98ade75033b52c2d4f6b70948fa4f6edb3a03799ff329b00c970712e37e375b81b74c1d5f42caa55ba795b61af98071ef1e49369b8dd4c782b6df587aebe2357bed20bd60f", "ac6363650051", 0, 1171371995, 1537743641, "d7aaac82ae0f720cbeaa76a9232bb640290e3298ccce7a5f67bd76dbcd91938e"], + ["030000807082c40303711c06d52af47ee3e47365db5a8e25697e5480115925c99a075bc3677833dbb30300000000db03b01e79d24ca136f8c0ca0bbbceb4a15a82a76884d0835fa659c980313003f12cea1e0000000009516300630052ac51ace7eb6b659d02581ac122a0b97b3d290adae5e65973890d4f9b7ce42185cf3391d466ccad000000000852526365536a5300ffffffff0306b90b000000000001ac6d9e070400000000016a111f30040000000006650052005363e80a1d78b8bb53070191e4b8040000000000000000000000004035b29d2690ffc74dea7a799d693de76e3db5f4cb35a36de930c157eaa195fcdb484d2f76d8d44695f661e0af8efeaf238c89a3435a85986ae70189d2675c0f6765581ae7856315b898c554a561283882f23f3c306f9e764e8d7ea7babb938f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005d695dfd751e1e7188c4b359d5d0e8113141e53fba4c910d5c761dfb43d724635d2f7f984e2d418584492fc4003602c2d827b848bdf57e9c3012cc2caae341043822583b2336a160a8769bcfd51ffbe47657e7c24d09b3856547893b0cf6ed75b5940a3a74206f83aec9bb3511448cd20c71d0cd70d1e22a110d456a894951760319b5cf81992602cad89ceba03ca2ddc89e218f518717ccfcbd0fbfa35167cb3f0328cb92bd5aa0b720d6137092e8a81c8e134cb234dd550049a4b9691f0e5a43380b031ff51781fbcaebe3a6f7653a6246ce36f0a2aac419ae9bae972338ea0b0c1b82d1da264ce33fd699778adb31e506a473e576ab51d9905390b7f6bad8c30fd803068e68fca5ce85fa21c0164ba34b3c1402f940a35fc15e0ea4dac78987cf256f0325b7332bfee580209b1b5b243563d9ca49075846286a06d67541f5625669d5ea030beddf2eeb8fea35ffe450e6dd176cca877917f16aef2e5bdb92b3269fa0be8d0208df136be13fcbac0fa66ca588a3ffcb72074690b89de6d36da9be9dfaf2a996022fcedd7efb21a1eda4b547b64f92ef6c02229033420ecd7550d55cbe0e3dee9f0609da1ea5aab272477e12d67ba2f1ec13b1a2d14f2a29adf9437d0b85ed6d500ba3c3f5c439b9d5e4f0d70ed8d838414d99a0956ad5f8f495521f39a063fa83a620d21cd5dd4325e4d614f69005b5aff74fa42a69e98e5a9b9c4f81390518dfc09abb9703f2ca3c6a9cdeaa700a9f013c6d85a8b2886750affcea41b995263a63057b3eb69c12693a2a1b250ec520d5f15406557d4d7e76b1b0e69f70d0c410bfeb1bf9bd95604610d86f6fd8dd96ba0fcad4b5cbc7456f19307d910e880614c248d8e7b001a71dca94f807ccc8aaeb10a3e367e448b5c1eeef6e4c96186187704cc7417b83947b450405addf8f5e6d0026257a2c3c7343e26fa66726231d3e476f467c8e8d78239da7861aeee4022608ebeb66bfa7147a1c37005fea0ce693518619a2c6209608f7365c415acbb8b5e5f50a86a27dcee42d81a37d44545177f3c73c0e71825e72e0aa5caf5a0e46ffeb95be457e5456248fb0ec11e2991584ae17945d484ba919261bf86361d360748cb50c6e3d290e9c51962aff4524bc66116b09204e220af413172c5bae60628d29c209d576b50896c45c90bc91aab956953c64e55f3aeb7cd6f252e052cf1c65a3661649561a8b35a078efb1a56c57862187a0c3cc0b5cf7413dd7f26a4c40e44c861f196063d33245502d8d0e594b1a8c5ee96888d6bf80fb4807ee1d41bc38726ddcf73f5796966cf6e24e18950d0751ffbe870ceb512ad867b6abf2054a269aaf8891c6a2cbbeb08f88d2c797e5ece5041c1a210afa170ab693bbcc57896acc016c3326d0af6ad4af9c89e039b485e0e480e70754d0bb56c232a27ee6ca37abe6505dfd799194a3b2df186e301d4933bc42e47d1de252956a58ab1457a2c9f0e4a22f1c24a9c6d5590db40148fb8bffb2cea7b9048b116bcedf1291cd5241d86e05a54a7d8896b34eb6976657c0e7c0a6a9958f660bbb96b8e5b90af74916c5edd8d61da8b58a934149495d77a5f05b88429fdbc221eb79d6726430e3969358d26c83d6436cab6574191f881b263ff74a3154eeb65ec125d510b03a5c98e192811bda3df0b9c89497af8a8abb47ed0bee950a706de35b7842c2524c7146bf8848282d34e2e88b165587a04cb367aac35cffc5a59d87676937120b227203826e0b493ba37359f0cdead3e2f92c8138799744746e9b89bba778fe44af5e6d597b2d3fcdac25468d4fe13ab7231131f44830f2306fcc2e73cd1f395af3fa415e5ee60ce89e90310bfb4069b315d6f0ad3da84d69af71e583e6610090ff98f5a4a8c4e00784d10843cabffad96644addc81ac19a3b72558e5273ec657a5348e782588966a1388f9575855babd41e7861e2e3ea6102a20c1ddf7d9396717a93af4056fca8fb15432f55896e61fad08200f7282ccf67ab6b05e483c89a45894da191d7a57f30737bb40211f34ac35cac8370418d7cb4416dfa37faf6f322292a9b6fca5907101ae16794299b2571da59bc3bb5bf47db10ee4ae1bb704cc3487963326c657ed5c708fde2c5ad992642233fc1cc0e21be29703da24b220d001ae651c9890d1092cc195901d7157f81e2f276f66313f0a529b576cb38974f0ffeb8d81d3e2443e6530e3838506e4c39c7c32c37e20b177271e25f0a1a3d1f212534b947ead501160e4adf49652a5905fb14b1332802804abd3db69cbcb216bb04aec6860b16ef3fd706998ca92c851575dfbdb26dffba6bf99d0764bba05cb9a3e82b4a141d70764443633676f047d2d5fbf3278003efa10171fcb407b04fc2906eb7af8804a9238eac5ce7976cf60e58e4ca2a49482af1833b3353dadee3897952358ce06", "ac5153006a526a", 0, 324722184, 0, "32a5b96a7cb1aa2bf42fd5b1a1b2b485948cf0582580dfcce1cfc4183056e02e"], + ["030000807082c4030318d330d36cb794b8223969ede87188a71be282adf3727f993fe941b4833a39430000000000171711af68724b9e2b8601cd57cc9ba9e69b93af4c4e5e9ddb52087ff06592ae06f370010300000003acac00f7cd34006ce648dbc053fdec9905ba6780c362a6ca2970f4a0fb937e5869367cd4e1fa2502000000075151acac6300525b2b1adf012f99df0500000000056351006500217d9a4872d0700b010774100500000000000000000000000070a7605dad432c295ab0563f737075b107e2bdce82ca16ea8004903b40b2c90b7e8777c697992ea9ff8e778d703bd3b584cc4baed3288bfca461b398238e724e98ad5749b8f951e6bf557a68fad288004a081cac57539a4c16f8df8d23f8958b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c7f381bc19cd93ceeb99d9784b69e636b8aa5f02e333ea72218b8752fbfc9e2c99444289bdf3db565c08a061e468a68e44728b9dacf5c41c5525ac1287c8dae2cf01c0f9dc29cbf96c22deaef1c5db3d152b1e1ce8be7b0035185f26a8b508e3dd8680aeef928a19b2ca73fbe5298c917e4de420218a8bb91e8d322ea4713560229fbc0eeb8624cfb1f34adb7d816149747f122ea29d44b85652cd28dda43fcb502217c4c838775656cb8c011214c973680109e2e532298ac02ca59d16b061a5c0a0b090a77f274aef328bb53cae0a1cab214d34a7ed859fa7402be38bdd9fdd0a60c133d88c96781de537633ab45dba9f5d668d11f9f1a5cc9c4472051d37e04f4a1020294c99ed40fb44e087e709ac26f900eba786754c5df91c876d789a79c923d22022ea34988a9ff19df6f73ddca78c26e6cc6d78f7fe62c04434ab73c5345c183ac030f1243d965c3af48ec5b117ae1a0c73bcc364ffc49e185a75c6308d79ba4159c02263b79c6e14ad20826ac8c074c27d0e177e5f30c5620cb691452f0f86e6f5b1602137a171040e617298c86c5af3013b2f22814b21c407617178ea08e8c0e37eb9a474b4c2bd6e9c0e65e1dc7473df26f03487f042242cf2a05b17099ef0680a33a5f546d3af4de571e528804d53642d94afa6b81f51e0a5745269a48009cd64ffd526d859d09a2c1d19130c16de11345b1f7a3089344c42cf00fecfa21a1c827e9a17fc70e79269b620a93d9e9b1647d1b7c3cd981c72cfc9bc3e5dd01e94bc308dd677f9f09a6e2633f6581f076522758addd5b1003873293c8007645beac758f50aee650123246eb140490bf2b76ab3b9d5dc47d0b4ab044e7f8d5d31d1a45f1fd9479c667cda81f340c1d4ce339bba6a463fcdc9cb019cc6fff4ca418c47ce59e206162cefab97ed51da494fac03114e8a2adc5b89c8b0d84fab3d74421fc496e98675bf43d039e5a1630ef9d46af7250a75a950a616be36015bde9fcf0fd87a9003a8934ce542066b5ea3ee69dea715ec66512455d1f641e0d9ff8a7d5bbe2eb1cb6c7294c0a528f1d614b40d284765eb39015184313f02137448365348239cd14d67d7efa15645dca4e18753086801198472a509d7da945d5443078cd7e21c77248d317fd4c6c279ea22e6b61d7a5174026fad82fa6f0e1094f5140997231cc89c2bd15130d80048560d584e70792b2f32e016628e31de524f517dee61fad16d5ecc762cf1e0a1cf51b74a0c940b0413dd7e4f9da770afc272749ea0b214779f9f87915d8f3ca053a5c2b4f307c03daa7811bd9ec9b8e48319feac4cd4726772ce0ae7d8bde4eed708100459e5c112f8d0c2410a5e7c24e9bca8eb723e9550042a40cf9be89d78b785ae9f2d682d4487bae4088cfb8b4e98ef0cab728c7fa890c214da2704674f9dd665abe8ce3369b13434f28404c5ddda6f3d95d508fd731d65aada2152854987e5aaf3a9e31387ad019d34da58f97517925c42554d9423a339c3724559be3ebe09e51dd9ce7a55ffb6bdfd98e8fcd00f0b7126a86c41bb505c056fcb9a9084178e8081257993b09c5dd40694c3ef3494097f3183ba4da7f538d9c715895bd6dce0a6f7af247a1ae1e8871e996944ab79a61a8cfb6145b85953f3b4eaf4b6e77754995a15fa98dfcdc4aaf6c2d2f52bc9560e70f943ad22834df96256adf5600d5cdadde0cab149a88583c2d2d4f9cfd561e87087bb5820153eb9e49d1515fabdf712a7dc0018ad4053050aef3c05070f7198aee421fb4f9f48fc15aefa9ed767d3d1968ce9716259a0dcccd8eab14be9ee5345fe42c000caf209f703c44925b06635a73838ddada8fb32837d0d6efa15d40a8fc385c169267447a8727e874703d0888f510598e07c6a138ffd4e534301c87b468480e6746affcd1914d2d7ef261ff02f42b7206b3278302cc654af61dd1cdc05e1f17c8719cb8594edd0bb692ef7fd1ef21a4a6d97c8335f87069e62e7ff28918e824308a46b5c1c8cf87d08879c782dbd5e2190f1b5f59aaba0ad02cfca4ea176da8f713036247fc1d5ed6e041083fd1ddc47235153ff17958a714451e56a61e25d3fa749361716c02e3aa053fe201b67682dad640c32f089f6642da071925b9c3a4c971fb54f526084fb6d8b93bebc59e41ec1e8f8731f6d41130d642335b289c3f4adc4c70f5bb18c3763620cf4278fb9fb9addd72bf1f7c1f4de92f75c36df67194bec0fbe471c1463975859856f129b2093ccd8241600d3205d2ff3ae2f461d71f6611ea71c884c996f3db6ac17b403df9c31cee1d9a0f83182dc446b4ae7c2175a3adf60d353e0239834ddba6c10117534477ef3e0cceeeadae3442d99c320889edc8bb9cf829ba88d25fcfcd8cf1ae246c4ee6652d02b88630e0037bb3abb16ad327f3c89b4b236830e14637ff1d5619e503", "51ac", 1, -971819882, 0, "53c1a8737b9e947711bf63e13e7f4c68169543b3da01ac21cf926caae387ef4d"], + ["5ac2e53702d28a3209dd8976060d8b5384b0760580e4fc9a2f97b2469eadb1500686407d3b03000000010036e087bed93e091fcf068a8029ea72fceefba89640ab281ef09e28e44a5bf0dd25f6a8870300000009636363536aacac6553ffffffff014efd3d010000000004ac6a516a834de58d030000000000000000bfe5f4000000000004dc5313b9215e639693b196d9a72786afef2e5d117748d5c9f9f8da0eb7cb5e8a5aad86ae81f671cd1d565c59b111e1e4c9c52686a4b4109290b9504586fadd40746078c671aaec0c652bde6f22c8af9635325a58b05e4868c302dd89ba6aee0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014013ebbd9908793cedfc8fa7254b1366e9a568fc1ba0056fa55417f3f8fd39e03cd87cdc0da6241d2c3558b2b6a2dc733414215b1e4bc6105a9287e50e11a6ad2f57ba0c2b4d0d707dcd566a365da2e15c6f350d88d3341266f7f6cdded15c88b2b60a8018949e1d9d38527e0dfa7990803bd5c47cc03f7f7ade40881e8b33502224ef3a87f1d1d998b9ccb4b8b4d667083d2395f70594978ebaaa828dac5473e0201f15124e2534d8c0283ce769994f491852128c66632d86f5caab7aedf9b03570a0745e59b368054ee527f8a46584bcaffba6b4858712b4b97f8c1b3df480ed9d727ed98379b3b79a2aaae8ad5c14f9db5293188c436d556707f14263cbfc3bd410324f642da112ca4c8e108712ee709c9c17891aed5d7e468f6ce307aecba1f5e97031fdfd96274920a5e34bba55e87bbb0225baa7448e2d8b3073c2aecdde1fabdda021313bd0d84825e8c8d4197905867c6ca19c8e3d22f57eff259859dd09bf13d1a0313e091016850b2da47311e4ff3c63ac1eea4879ec09e0703d28412a656844240020d860a1bf08b97521aa26572e41e6bd67122bfaec6f758ea407dcdb32bbaab895f335557e1f914d428c38ed821a4eb8303d90bffb7ea3fb1cf20368bf595278ee063c3941e9cb018c3072e310903e6144a81de62fe6d40f869606bfc5941a60cc5ab7fb4dd6215f451ce971c18d9ecdb6221a3f783c5b4955d8e8d4b1ae41176505f4eee1290e59136dc68fa3933db6aa71fcd1746d320b31502b1da329e7816e1561a953ac844c0633a606144ba525e586c4585326fa6b9c398a3d4e7335ffff333a894104752b609a379f15b6dbf40d76727db33888c9b591720fa2f1cf4fc1d3be08cf88cc65df02a17fd84c0cec4a0c6de22e7164b7c9a080c15ba7b01e5d1e125e507360951fee881268893a0d2241c62045decc2a08f8c440d6d84c403efc4853ccb5f4e2d3da20c700d46141d712c2b9063345cf514404c8c08859dbb98fa08ceb17cb235423b2b1782f0d8d5cf4d89528322d5a56112d2b565519fabcd914c30bbe5c5096ad676321fd3a5bbf0fe9d6aef9943e388716b149c52c613b2571a756be7f6c1f472168a2d4a59be495b24cb89c05eb67cba7edacf1fc7b0139bd8bb87ffcc343cd001f178fef6825c5628604feca0cb51a9ecf352e7276b2fcdd92848676e4b12c87403d23181e80ec9b971156705f5eab00f53dc611e8f0a88f530000a5866240c074701009963b90b645e871b18ac146eea1ec39651b1415bce059b08d81127311261f777aed4c284506eb42f8199a0595dc9688f1a289efbccc96460941a66a941289e1d4699e87395422ab71631d1e6bf3e8be1ca1787e222b80298c4d50e19ff658f134110322ea1ae21b56bf0b6a7040da4f3300420e16db414469374f85c385f5baea4e531b496a53f06c93b23caf5933b86672365efc546857fad58ed80f4ad087da2f319a5ac1bf992f419772727cfb2ba0c6529cd8638b348d6f938d1083f75dd47993926502ddd4786d6fe5e28f92260b90514b9c739ff7adcb0852fae28dcca2040124fcd31e0d826a928bb6069fd6ca22d7e84496c539e8e3407ac3adcd45631f6deb4fc736b123e9927a5c0ec211eb6f24000ad5ecda15fd1f28d0c82d86d5f1b56c0399150aa0e80d59b5a5602804d81b2f5885b0c0559beeeb26b019d10109900696898a09657d13967562e14fb0c62910589e68ee1e399d471299a006d93f0930020ff7168c05f7627ff22d7ec60561179ee80e0b9838b4ae665c379dfcd08d9bfd8e0377c44ba4e5f7ccf6c85d72a95c62c06b85f03353585f61e7d4a147c976a9013dcbaa55204e4ad2cb5733296737eed6ef41280097b78355e96bfc8325a82dd9894303138ce099a63e9c80b030f6b5826f99a433d59c07e1993a0c31b67689901a51b537b16817a20c905a1198d6a4b2a12b9c1346fa8ba2f72566f8aed5a5b41dfdbc185d45f5610dfa87de30139362318057716e3ce612ad8d3c10b128013d6a1315b4a7b5881f17f7a0c3b050f9cca7d38cd97bf0c7ffed7ae3eeafcb6d5d1b6f8e3f017201c6d940e5db932a6c7d3d3d83119c93f3a4774ddbc28e93bac6024cc076a9d12c8f39d007fc0dad73154f81b95a8177cbb2007c2ced647050dc8bea10deb955a94ae2a2bf971bf3d3ae7f0b10ca6c6da00013b996c7985d7d2a18e779f8c728e4d973c2d608730cd3fd4804bd1f53ff45c0ba5721fe71ab45dd3060e2335c441b931c949dd4a9e3d323f1a551c004c49061e778b01e31ce2000000000000000025bd090200000000929ebadef7b5df898e38f59a89e74bfae1ef2aeb90bd1378e67aa5433fb2ce482ac789e5555ee152b56201e24cbbeb9aeb5ecb600b2156020463333d90bfcb7aa96308ca14d92eb3523bf022a9bd78506a35208571bc44c593244312b915961d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000053943dd4d51fabe9c0d95566e3898ca98cabd53a32b19d0321f87db09f4c6c3f377dc5fd7781df5ba5e0602a4435c016ecd1eb77f76b91c5e006f491b16c5678335dfd0f60aa7f17e0ca0e480f307a316b55b77e5ba50bab3ced774737e9c3ac08340f16f3f2bd9706f4c6c6a3077f24cbb1ed278d9790d95b223781ccdbf47b032d5dc0283bab09418f1012be0267ddaef1bd0a5b51c61c6369f7d2373d21e6a5030c823f9d09cbaa3bb8dfd256b79602e458821e16ceffd51e1f882f96dea3e89a0b036ca36eaaf75f9071477acefa2b49d21cebec308fa9441b4bbb3018011b9c6d8659261fd788cc9d6b140be78d12ef6a2832566630b9d801e7e64ca26b706fea0205b4ed88c0673e6218578d97bc086e1d4fa9752a9a33a85c6880eff39d47665c0223946a78a0ad984c55e6407fb3c39fa6819e864afde854753f3513770e7881910300551e3bc7667afd8a03d928d3a498973209f5ab9a0e43ec85a9059d20debfc4021dde377ec56f1e15bf4615e54b68d6b01da30c84f026db525333db54a06e8f6b032e81c79dcf437d8a95310a04c25828c58be015704a374018edaccba05e8ccb07fd233e17b5e9f2695700927835ebb5106bf591363d6c029894e7123be0f1c530097aee7a1d85e99ff94cbfb3addba889efb4bb954527cc6fc3e2ccccfeceefc2e944fc9b4cb96e073cd2baefbe636fe848301236e0da72fdc46c690b1aa632de86d5687a799e8c35dff528c948d5d9258d896cb503dfbdfdb1f5db5b3dd1430818f69072911c183833523474182269b8102bdfcabdebbb6ef2748b25a2b2a0c4dc43e8ee5f7e5b51d142b3a34dfd57e1e33abaaed0135c9d5ecab6945ee4c61589452d635ed4cbdf823a6f49fcfcf82a01a828caafc9289c02b3a26e7bf9efda0301e8ec2d1df9025a32164c6c652af02b360c63c0756da3acb2d8d78f1b6b31bcd77457d32fe2984c8e95da347d96ad5ffbac0555d7a7dbbed7c4c2527d9b51feafb0d3d1e6630d52a0dbac068d043826585931397eb26777168116fef11b60a297ff2b3c878da5b3056f3b5bf9bb48e20c19f6b107bcc50bea9a7bb3b41e5ae926a3840636fa98b3b11095ca19b856ffe31ebdce9efc9f80757a8d4f94d9934cfceea643eecef0d48a82c5ee25948b17c13fba26a9a807c766aa385a6202e543a421d334a96d7d38f8073904dfb0712608fc9da75a075c5f86923136a602d7212c6cb80c944bce89c8012fd84be25d3b281b3c89668ceec1633c0465709177592fcd5df64a9bfcfc00ee539d5eb907b68acc8f026b55eb9d7a90c0d9399bcacc12c8b4dbc69c7f87e3fec8647ce97f28ea2d7d6fb4a497d2cfeb81f06a734050dbaf640bf4ca1bd4e404c4bbcdaaa85eac030f16a99308a8b064832abb812d4d078607949640e1613a8cc1cac5530e98e2d394d9c1ea6f2726d57945b0e7c7f636d117959e7417ee766faa693eaeaabfad04e0a0c0c55e840d13ad3b615614ddd965114d1b63b9f0d1af1a2e7e0fa7655b41471e427bf4bceb0a13aa98f7d8206dfa7c5dbfbb48491f55c965e78d08ebec7650dbe143d43cd3b1ca388267968c8d1a5697a24e9e99d9d3496e13975edb5a7aa4579afe9902bed3f859ad1c2f8baadb3edaad5b14fc64f9dcce7148b7dbc36c96f1cfb6ae4b7439532845058b4139e6baa3d54e06f833ca5481c9b514ab8ed7c45b2eeb3b8f2d70c3f6f2e7e484da2527d29e33e8f7531b7dfa06eb7cecab238e3c725320a4bb4462f1c9cb9d70aeadf89091a5bea78029facc0bf862a8f4351defc2ee4a8a0853152716cf589a5222c191d04195e7bc3a7eaa176c1a7f4b8af7bfaefaf5c6ac1d71a859431bb28b106878cc35ea901300f435708d9fdf9102dd3b1ef6c47d124b75d90035c57a0bdd4d57f2a61c8b74c0254a29f94b3c69ea9e7d2095dca13b6d24155e9a86bbe9cc0027fc328f55822e04e68af96406ff66610d3421c0c4cfa77828a75f87a41fdaddeee9fbae27d6fe343d2128579369b31f6202c313d941576d27b26fb1186a5574a71a918f19b04ea07408393edf287d8ad1cac74aaeb536beafeed3926c67ed7d10afa4ac70c7d93256529ade6b6674e9eee52b6b36868e16a14e0a6d046f22fac7eab037e196ee5d3c2b34c20aed79a407712588a02de12f3382e1a34856b5673fc5ed3ff846d108d0ab907f78de67bd52a37cacb4d11624cf21918545fa8a4cd90a9459dadc7d0d9dea1dc0bcb9ebbbf7f90a66f3338de2d36d5bf966043b5f3a6dd30742ced07d71db9b3d86c800000000000000009f87d30000000000cb9ec26f233bca790bb2602bfb1f21cb3d3ee7d48b8f946bb2987ed18e1b8135b4cef8174f56077dbea9ba91d7bf0d76be4637c44a69ccbe01ad97dbf8271b6ae87f46d1e2bf3161c044df0ef274a30fe001767a32bfca98dd8fe9ca7c1548520000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f589730de927fd0ac1035d1fc3a24b054d5f4d042ef64f5075577f696b066c90ee9ab1bfaae981f7f89886dbd758ff7a348dd4686755a2d997fe47a53e6ea69b8c6e2f915ec47c04c77d2b8eab3447be1b80e13def9e8d9b6a841d627f32013521c3e4e6b924b37966e90fb0021acba8f6df38ff5fc2807fc791fe7ac320500203497b13491ca628bf114a6efb2af67da28993585b5e1282931bbacd5073cdc90204a295f9f43ea99aba7f06d5b72adaab6f8a4c14206e8b9e50668fefb1f2e6630b0020d4876c55e62f8f60614d8308e3cb9c7a518d97f1cad83feec4fc4b6bc17d1992c47c3cb2b799c5b290e783975da04aa69df7139a0e6782305666db1ee34e0210cf32e88c7803b2192e7194c79f665cf4b753489e44f29aefae4d31ddc34664032e28aadbbdbf5a460391e8c0c8853aae2fa39cba3c1fd33b682148b1b74e08430307a07d16a147be497a4095d3e44783e4855e55133cbe676700f662dbf741186e032f1fa4649574125a9d8ae4d0fcf1b1564193b72ca105e4abffcd38761a8465d702142bc273ef98a7a93346f552cda7a92b3d68306e09a6df7281b0d3def699bcbebf085a59c553c47910df4cc0d6b8f669f445ed94d19ac4a986efb2d78079de308d1202aaa378a78e75399be9838a25a3c7725e12b485701e8ca06bb0ee350f901a59c6cd995364841b1d43ca1a1f3ce82a3b6c31f0d716d11d96829f64f4e27803213b252188dfe263b6db419b22418fa96b54a5897df429b67875102d40a82d78439b59930bf64ac43aba0bfd28d86a26abe965c6170ed16d8ae31e3ac84b975583421fddc66706ca1834f3ebfca486eb32b43b62afa5c35f0d28c755e972bf82a1a23647646784890342a99f763d42faa65fa9b38584aa06ef934dd7c2ca67f472b7f32d6c983facfc6c8d581aea74510aa0517e84a935bb1c081aeecdba20d8c5b05b6c05621b0e19c70830d52595af448063fd87d0d102dbf2ad6140eaef0a3b676ab235936f076a55ab851ff261bec5bff3ad991f751353cb40f2d110ea90f6ac11a3eb27f15fab8d44df670c11cbdf37c50198048fa18ab714ec3f94383901a81dbb36c0ed731a55eb37ea2e90cdd553b43f07b740891f6c69ab004f7ec83061c2595ea04fa1bf1ba36be6a059ec8c9ca0ed54ec367c125daa77984115665e7c1ba49f60cc5b9fb48f3028815066677de1e278eaec772cc3ce63e329e42405de91370ed73f0fbd3388e60a9bb7448d32f5538ac1e5ddc75bdfebd9eb67e0e778951b84b8d080d52b45dccbe86542ff8a66e61bbc268f1a3f871bb178c6f64bc9b5550f8d3c45c686bfedf524383535cc4c090d373f67daffea3bd69e76be993bad5f9ac4b8ade460a7ea3b5f74aa177b56e2989d31fa15156940c5b61feddb9299f1210cb87841496bef25ad89cd7a842849cf8b5ee847642ea8ace62842c879a241d6331a241a53560732b9d9fd2b29c69edbae35c8c5552c16204bd9de6e8b3e0c28f37fa590020567a874f2903be920979d90f459785f8a9dba30cc5dec47df61cfad5f44640aec4dada08c520774664efecbbe0facbee0e1b00d607ff07adf9f8272a603b5b197a018262e48f28533e588fd7ceba7482a6c79f974e1d06a789fa4c70cd3dc066b6018d28ba2972998e2ac8dd7db790c6ccb4b80a310fc87f24a50c661d836500943e3b908a3a127fd0db38c251357d2f2e8c24717116f753a58abcc75ef73238cbf6a9d535d53bfd3af9fbbdff19e78b66b1dab8880d7fb69116d8d62a3862df110b5a3d29b3df61e19606557c3446e237cc2941b4d60744d381d272110a4e3cf9b3fe27d1975b214d98166bcebe580475aabb3557d385a037386a3a80fb511fd5851ea0362952a2f8b7bd61ce9766b8d49e136c5f0fbbfe0504438a368e697008ce3fd014b0c881c662e8aa3f97182a48b7a25c759ac02c779a0acf9e16a8a4d7e3dc48121a66de57cfefd3868ead1e922ea766ddf6c8285bb515135ef7ba183776d0d6600901fe451421932bfbc89eb7a8a7f5363d8e6f9b10e4b228e030e864d0da74b2ec3b6e91727ce97d77a6c2880410391f5c75c1fc90b409f45a5cee5ed11969519cc451c551e92e90b77578ef9ec5e0ce2e61b14925266e168c95cb9b41b0405766fc8018fe49ebeeeaaa3bd5209891785249773ba9b669bc2b9d848fd0894016d5ffbc55472a59fbb195e9b1f0b134d1a7026bc1f5e70b00a67ec9d66549fd777fcdb13a2a6d051153b35dd2cd28694770656b4d95e5dc90c14918baa6ac94fb774f555472367fba306baa0677eeab4420df40bb0b13a8c23c9a2ba7d4136edbb743ba022954a85dfc657b43682d3a85903b9f6a596061689f317226cc3d2e6b7e7506cccefb13d5d547a317d04a4e65bdc720071c18a88abd63d1101088cc5df00", "526352", 1, -1643598176, 0, "a9f7ecb68db1e92d9ebb82ce31a5639867269ed3ca095eab7abfa3775dde0e9e"], + ["030000807082c40302e7396043082fb6ca97d730c932ca2c4011769751fdd3d3e26280e24700a63c820300000004ac6552ac5995e6e284d0dcc787e24aff61c32d2351fad1a5eb4fe74383a6e338ce4964fb1c6ae6f10300000002006a4073971a017b6641030000000002526a000000009a3a04ec00", "655253", 0, -1871778050, 1537743641, "50c34360c2b4f3e7ddb2ef2e3c0f0c9bf921493c3d7d71ce4f3b810c09eabc98"], + ["030000807082c40302c9c7004d9ca3d1f13959ee07909a5a1d821b38f4de86912ef3ec2f3519342a5302000000025352ffffffff7a4f76b875acc064f9fe98dc160fc2a7d67af94ebcdf65076d1021c322057fd1020000000165ffffffff01de0c2403000000000363006a0000000095faf090010000000000000000bf996b01000000002d560e9dee93422f1e41a1570b8c0b45daa6935fb47e88fe5d11e77841a17f7801e7f21ff38c0a1d6da7797930fb2a30fc875c6345c036197588094a7a3692634d0eeb93786ef15520e973fcb478af2b26b7ae5fd5ae04bcf20762e9ed2c76a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a87c674a50ba9af588ac63408d77ad23a5623b299eabf89238eae8c46c09e5a5d1b8de1ff70db0a998cb53a816aa3d0d6dd7dc566afa659c4a135e1af880004d1cdaf0ae503da464c577a7a9e13cc0991046f62ff0ed4f1bc9dd2c512dac0a6eb66a9303e352a5b3f90d7c7766a74ba55238008eb90624eb2c5fe65e0896f627022b5fab8b40e23a46efc877859e5a3f31c9fa68b805ebfcbcaaabbd34fc22228a0222b4cdcc28497bebe453e458e478c7fee7088e3c8fdc32e2677e80bfd79b754a0b015225af6fd2bff7846779277a8295979e886b5b5b6d8b6b5a1c9160582eb9a4a598fa4013fb6c8cc7a718a115c371ce419d3242ee3b10806f6cb02de577bf66022ead331a9d98dbbecb7679576127b71b36c0af22bd1eb734eb26f766d7c7816d0309cb89ef700fe3daffc277950e657b5fdbf7e89b4637b8bae4f2ba8378e8702c02151bfbca1e30ae1871044a972cb587b84d2827dd7f6d94ad390d601f0f18514b032ed82504fd9e693edd838fe8f8f43fee1eeaba9df07c30afceaef4b266cdd118020b31d6f572c28510e0705933d45c180bcdc3a024ac11ea39e635383d5755f8289768dd6ecedff332a063d2e5a5ef7d336b17b111ac19fae9dddaf1c814e1dc4e3d172a226d037a8b2bc178518b9f34a0e4c211f76949b9011dbcbd266c328d2b7502d67a7f810f1c54ba1c0d82180d47c851484621481ec8054ffd9050001e9522d281206522742491b67d351dad021e7759e9912f205eb213a6f562ffbe093f7062d1964aea6edcdc0439888d90a6b3ef5b581ed294124e4ea6e0b88b26a802cc2d8131f31f94f06f299dc7eda634af650e9948b8e68f62f7c3c1111b6c2456a2c4938612d25e7f74b85a13226e19ee61e8d24ec931cc88ad487571f6a6248d23f5e8e01087f9cfc6cb77679a0780c35c1b752b1ce5f2bb6986726a570b95aedf3a2f5408165b7694d31ac999bc466481b41ae2d82bdfaed7651eb83532e9052d9b368ed8601cc385f634667b2a8c3f6cab10d83ffab81ad2ddcaef2b18fa214907ef77a3c93c568bc8faa8cba6e04eaa1e57d39e292aeb29602901a293f1e04669b33bd6386e922b1993811539fab637645295d0b3cf535fb0170ba418a319a784f2f9739c349cccf8a274ef828f97c58b794c1d457904eb8825f5c5213d6ed2abdf2a4f7513776baf29f7b6e2212cf7b0307f08cfb094bb15d6fc864577664130b2b6a54534aae5ecf25127a6450ddbb4285370e440c391896f174fd68e1388c7908b676c41335ae2e68e79cacfbc64f2395cdfd7a30034015239ed5127dedc3fbd0c9e36c0724367d7c630463c2a4ba10bc7a76e1970e814918e6b2d55acb9d2d17c59829a635cdd60b7fc73bb03162dff33d4ac819d7d8726f4cd66ee7082fc25261ec141d5162fd6aa26f450b95a289017108b41ceb6f090b92926b3a91331dccb0deae47fcd246871f1c809f1da6053ed3426da65e5149a62159c8699c333e0049e3b337e8fd7b1399442ae7789950f0124cdfb3e324fe24245686425148d867f032cc027124546c6ba3c88e94040cd2ea3d39b6b1e7c252622601235f3207c5af089bcaa94041cb7a90cb3ab1f99b954c94f7a57d48ee1ca82d619df662545cdcd79613f55ff3ffcf8ef84386305ad420915f6e41b764d5406f67ecf506fc9e60b02b415540de1f772c9220670f68d9dcf28665cb4dd995ecb4c6a8ec2c28f55dd45d88e14ee21125e1813b9bf5f90721f15503e9cb439734a575609a915ce7dce0c9e626f7e51ae854ad209d6785ec5bbf1c9c2853dde7fd3306c7dfe0f1520298ca7d5d7c6f190c703041dd47789dae495877398e61bc8f832fc19a36fb57763f7d6da75542103f0ff68c09130d3d66c74e0379ba55804fac69ffd8cc48a3a30a62c4d705ea8c9f458a25f41e14d31bc03697e3a405f073173099e0d2fc20789a15a85970347cc230b23eb915ded39ecef3bd21c7bed7ff4b0941959ff49d5c98f612204e5b7f2ba9e9def1972778aaf8c82b97404080536bb96d752c0668ac5ab8d1da36505398f90392419317471ff8801ff7254ea86ff9615d2d0a91cda5176ed6e8549dafc3556d5099c8af67cd8c9d3e0feb9f0b00085d64fbd4005abb790ccdf6614a9b7343b6cf7a727353639b87f068472211a5f7fee877a819b5bbd7049d417b77780092f1900af72a2b79e7536309356bccc6a172bb259b4fc7799c86c0dd3af8dcdd3697a845f1ff778c5c0d6a9d7064dad3ff04f270f0825b5ea932be9d8fd98c7f7e89984ceb8aac82422ca8483f7005a7e7e79f9d6e2c1a381501d0afc01643fac92de38a6d4f462d1666bbe5187b978c8fd200d08e3f91304f5ae798afea815bfb16e2e733b6eadd23646e7fc328f6aea18825762d71e6327a4202d523b4e0396adc225fd0a", "ac5253", 0, -1831914951, 0, "470cfd066b36a8127041ed9a881a3959f9f3390b0909a93183b4799eb3853549"], + ["ce28f02004c58cd66bfcd746d9979e3b0588eca2d0558ca7d4e99815d78bf3856b79a719f203000000046352ac526bbd602fc47fb08ffd829355ac256d3cfdc5a218a2fcdb1e09ba8829cbb64fb0facf1aec01000000075253ac006a6551ffffffffde51d3ea6d27bd292d388892023758dc0ad4f1f8593a0ab451e4ca5d10fe4ce80300000001acffffffffcba70ff047b6ded75f75de18a2897ca2346abbe189e8fdf9d34986fe750cb6760100000000eca290670145e430000000000008ac526a00656a006a0000000000", "6363acac656aac52", 3, -1719650179, 0, "c1cfd587f09c948befcc12e751756c36687cb92a9bb7a0480ef48f44c01c5c9e"], + ["9ac2402a03379f0d0425effe1962c483b2098181b82dd0661276e0bf880023949c3a9849f70000000009535263536565515252ffffffff2f3594ea95edd8a9a3c7560e279dcb2d5821f3637d7001aa00cb3aacd4a9015903000000055263636a53ffffffff43b3d5d810763d34abcee607288f8e339105d1fdd3e378ecba78a3764e7a764a030000000600656a6a5163712b3c41045fd0000400000000005350e402000000000665acac6aac53dfe9af0400000000056353630053882c050500000000035100520000000000", "51", 2, -1792614044, 1537743641, "75d384e787d8a0e3dfb04062d30bc1b5a69ef8f6498a48d7be9e1eadf60613a2"], + ["b1aa5548034a3ad3f2e75b61eb5c91157f25e16e57c23e0d0d2e758f07741cb57b618f473f0000000009516a52ac6a63acac51f39e5933e60c4c93bed669c7c465c26a0551caa487fabe8ee290d1a224fe68fcdd72733c03000000056552515151ffffffff2b93c8975d0332c2f8ca2cca9bd716e59bda8274e7591a2b6c6e4c922c798f1402000000026353e6a4eeaf027f15ef000000000002acac95a8a50000000000095300636300ac00006a8a27a3f90100000000000000009c7b0a0200000000c697c6eea1209148622043aafd7b4d130c9bcea3f376f0a113a782edf93802a34ee9836b5b2b640d771fe5cf42d7ec69c7849ef458b50e8e224eac18d1dec84013fc63f3d2f7826b4707553981dcee6e153a57174f205a5851d540629f27cc2a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000161b8ee0af18257ff523923c7a2448db3a788bf99c3a680487072dae1939a877d4619d4d3ed214b9f7ad67a8e6a5eb300841c4b85d739f12a5f8db2a77186ee42158e78d7feae382fe274f64beb5f66d105f1dd85ab7e0fa172c2b8c53e531a650fe90c12e1e6964b1d507a230964a2501016fc05eb0aff837d941d0f24969750306a6bd47300ecd20e29f90afe36ede2e7687b9d62da97cbc6bdc4ef200d4dfd1030773d580d219558a915449489e90b979ab3e337f286b817e597312dc2a82413f0b0636bac1f17ea4f78409f2051140a482d42285049c5b8a407e25a5c6b7bd505fcd94dd026de6373ffc7a9192b7015ea6d6e20240110756e9af95a750d9664e73030165556c043192b68d3de04924777a9b0e44e869007bf8d3138ffbe734c8206f031cd4184e8e029df7a37937ef1a7f5875f74a93f62220ed9d9bde775c1473ced20226b94ccaa5bfc570b386a91886894e8d6eab8458cca3ca762c6454d97fd26e40032a65fb08415e4ea75dc3de17e5f5c724e6e85c33401c503c6d994d8c307e1974030e2b6b2b58da8ce117d60a2f34f8edad4cd41ca4cde4c4bcaf521a99c7b29bfd7102fdcdbe83d2786d39f535961804d7d6bc8afc8d126a4548d6ad5b21786265afc5f4f09d309e6b1a37ae81c5449c825bdfa83df4f60638ba196895d958400b1e802e3ab9dfd219cbdedff44b387a69e17314eea8d3f693c224edb3ba2db401654655182b455f39c7f586712f9abee6ac939142c5bd0308995a6515490bcd8a9761d46b7a76e53d40d26c5f1cd396b4ab441786988415bb9048f7ae78e5cb4ca81e484b252ec2bae9bf88791816674a45a5d343f697bc7f5f0b75d73d3ef4d8b6cc7f86552d7df11628ff78a5ba9497fecb3d384b67e0bc23672795e6cec2c24821ebf2d0fb1c78a69599322b2f212789212665df10291044f4f7c5c83e07c2dae7973b375e78c38ffdb71f4174f360d85533b943e69468e857f811ce3278bd60f5d26b37c5fd6e35ba23dbe862e5ffc8b53b26b3d8e4a37792d8a4aeb247215a57801312a285121aa09292ddda4a29874a78104ec630ca7b2d5ecd1811df1f6da70cf97d793103b1d832cd9590cf8d0442d87615d121db1c86203fe5d890ce7571bc5ebacac640d627fdfe56431147345c892b4d6c403668c542ca3b0264845f7c5ef1f791b01a0737f3243c28a3a8ab9f56f91ca7bd10357e21d3b235474450db60f54675b5a31915f3947982473196fafa5cd3fd032f8e3b8e722ef004a57e9fae5c114bd1f5ab920e0a664f70b8849017dbe51dd63c73d15fce7456fda3e097f8bb3143cefd2a962bd94a2df54a633b262d8ed424e1894923e876a681a3b379a2004495c09da0ea68cef82c555133c4afd0f655eb8c9cfd3eabbce528ebc6ff29012b62c76531c7192e009431fcb0867efb85a2d3eca80d94520fc56918491d221b400b476e8fb71b8bf1bb057f22fdbeb6be32dd21b637d8b49e6b5bc2ad37696f30b510b8cc18805a7080902bebd619d1f4be374968740295fad0304f814f280c59c64eb8c01296f1fd4eaf81c99338da20ab56257ed3a6b06bfe623643e32e9be674ce5ab8c5f6bc5d9565ee0f99a20d1229ed04a9194d5b4e0c20e4aa0c6f2b31d54932184438951f6ae2c75f0a869f33572092b941ccfdf92320b98c1a3618c1f8bbb816aade9e9601cac9364613ec0ee63e370f7c6e4e6d90523faf6bb397cb8e155d7e44c42bff1ca1115191366d2404f25b77c0b82ad224ec8245b05d6c3faaa08bd821d68f068e57f5ceed303d164300fef044513a1a2447ea72585506cc594d3b68ac4e2e52e591cf2ddf8533760f98e65181fa61e8400755bb2f7cb4da8f3d7102080ee861d61138113f129488f49df8c68a468edec45b1daefe5533612a9598a74aadd9640914d12c883bd911d7c4330eea255be2c9f51356469ce7513e865fd87f709d406c304c0efa324b07721bdf773856695219171724a6e64b58b7de141a3f43d0b48ef2e5cdc7a71885c440d7b59d425f269078888df7c793a8cb496f67c3aa9a988627586990c5854e151f67eae8e57fe55576e548130d7ee70474842224bbad0543f92d98801a8e90224de60a37754418ff4573ea0d3486c75742c487b882e5fb69c7ec3c86cd89a58ca0cb34e4bc382b921d251e8674e863489dffe7bcd711e08ea5717886bf0680c25d2a6748770a8ebebb0bea710610ef4561ee98f46ff7ffaf75ea122c5d281a582b44fd4d0168066c5f26ea3c50a2335a282b9e48ee4fa8b8fdb8dd48869bd7af63384612c4d72e028f33063c02c63f49b3e9051655ad7721d5a4780c100dc1fe5eaa883931ada12979f2a2dd4a03a76037acf72f076a7c943178c6bba86b9c88fd51b0b5ea81c9edcdd002df6984157cf125e0431d1dbda54be1b205", "535252516553006a52", 0, -1050771990, 0, "d19e17d6c3b1d14bd5c56c303b7aee2d467e9db794c0f9f1a9352bc7dab6f7f2"], + ["0d2c7b4f029da2a466f6816c4e2f51073b89d07cfb6975a23edd420cb34c27e2856164003103000000026a53ffffffff0acf5ea13fc3a14e424f62211076803a8396958085952aedc2c6451e6093a72101000000015358eb8133045a901b0200000000020051b596a105000000000363535113482303000000000865ac510000656aaca456f504000000000453ac00ac00000000010000000000000000a6b869020000000043b6c3152c35fad208d91566316a5f082fc34e74360ef55ec32d7f752d12936150aa496e7f2f3940a91761202287146852535778794078431982bc73127f53564c1a0018da7416e4e7a8b669c874b0fa64588734ad1cfa06578e3c84bdcef0ed000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a17ecab9cc3f61a5ba4afdd163ad39aedb204823bd807985e1128a21a13434673ad542ad88d7a2c1679a947e036f07895126a8b38406db5930274d8faf02c2b583f4678aedc8e16a79a7aa8a281ea3548b489f1a4c6198108b776a449cc05ea639de19d91fde1f3a6d1e30536d35b395ccafff88c57d2f0aab2852929c69d2b0312339c8bd5adfb74381a8097a972a37bc35af58606d30aa0c0b48374843bb4b7021378821fe603413ef8cde03368c1f4e1be0b843aedb7986f47c57912aea0b50e0a028970053c6eeb3ac95270578760560061fb246e8951c9760d508a99672bc37ce1f20d889486398dc4ecb9967397c7e7b301aae38b5f7956bb6ae580f826bdef0313d22bf260cdedff42848513100adf40acbf713ef079a5b5e7692c2fdb9340b1031746486059f1280ea5d72f51e2030f61a8b61e0620d57f3ba1a6269338f132720324f3ff7c5efb81ba6ffc4b21aeb5845de844b3548242acd1917bb3b34b8c63720213d6ed6f0142dc181c300a3aee47375669807b4f1a647f16fa988c55dcab7c5d0218a89addbf4337178d676a3c6e62a6116aa57dbc8a7cd71233a597f434b01432fabbf353c62e8384e09b6bd15a17e96cd4b859fa46f683cd5a7220005610544d46ab8d8dd5dda07131e418c86adac5bb6c1d2db095b65c2f7ad78bcbe6e84d41f900114172b5063cd2683bab4ffa0beab7ccf626db67360b43bc1bc92dd932be35cd5d31717698a290b80fc1fdb9f76c863a0893e0e90286434e48fc10506053fd29b15d4b773e1fba8e336af610277034fe6c6bf07b91638bafe74ccb9fbfb488b1d946c095eafc0333bd14fdb4746a56914ed162d7e4d7da7a72606e8647f1565bb8b82e0e806295eb735b15a3a657be1f8d890406aa32b48b909ff663e9847fd8689a0231ffcf6f0dd85f2f2b2ebce8f6c5501ff109aa9b9ebba4598d9603ca4cdde5a08f0a3fb1d69460887eb5191c85c87afb630bbfbc6239ce54076c5b5193071f808b10c5b436f4112880a5bff0fd2569f6fb59d5b1b59e18b72d45ff78ba6aeb6d494d2a593f3ab8210225ccae9c168652527ab9507c202e082fd8f1e6e3008d8019ab66822e9dcf9973ded490ebcfa1e80ec99b47b7d95bfc2df551c173484909fe3aadc1edd00ee72189a71ceb52bb3dd1df054a69ac23d0b72b32e46796e383e0cd5b68642324b82301704be4ae3b3180442e7c98842c39e1ec9a3cb245c5cbcad592b988c67807d5820b08ce9f1f1834643b2a80716908ae972cbcdf5872178d856b577885ac43e728b40e7fc17fc0b50147ac13fa9feacf9379bc91ec30c2e18102440d664630288318c82d4e4cbc6da864afacd9309f0a75778f3ce97b825101d589ff4bf1ac192f3d9936ddf3fdc2ad12922f88d46260319ce5375ece0b3d0c926e88b4b414cd4022307e35cfbefef67f695a09df5ac5904ed5e4c6b15b828aa62c53b03660a569da45d5f2b7e536ce4f4cd793a19e47f677a59b428e8f3b920b21a290da8e4444c94e2158407bf8210fbea2f0099c9b5516665986f1d75929d781e150cd3a15185919e7dbdd71bcd5f450bb668b995aecdf26a0cf0e2fae4f0005f4f2fe27371ff633cd339f94547211b300436cd597f1be511eb557b800cff1187528ebdbcbe20dafd434d26adbc3dbd7c23a99e644c8cc817eef64048293847531c211446a351736256686e341e515d65ce5b3e114579620e8cadf19391da7394627033b9df98f92192371339a6a3ba7c3b0431602314eaed0974385e28ddbf058b391346d85c8bd6f24c7c54b7040da9fa3d0661a4c97dbbdbfa5f0394d8e54b84833c87397a2c6027d40e4a3ea9a155a9acc379f71efc7e9f3c9fce94f0bf0dfdfdf6524e90ae2be7823e13ae7ce0e6d2d66ef498482697cc0911797d2159189dbb78a8464066d5eaeb1f4664b406e1b70dc14ec6124e6a320b42ae864ae5f6b8a8f714acf45f4d4a982ff59fa2f4cf2dfe649989bcc75f754a35b928daadaa36871d03db3fd66f05be762e69599b256f435f298e8ff0f89f7c576946264376fc8fb55f6292dc6f90b0fc85dd46fec0f423f2c3ba08b2d72b91e270247232520cce9f25c9de01f9c97e7780001aee1e6350ff4f5e255f5fa18a63467252c0de1138f91ac50697a3be7cccd36e0b3109fea91210fa3a12bb8737f8c3a2ec4b353846a4b2764ee9859a23430319f131505b7f6c47c86e89b3ee5c764ce2208b393cf9e57394e292632cb149b8a269b117142fa8ed233de5a90fa0cf56d15f26faa9a7247a057c134ee85d0b30fbd7a15c94db2d958864f5f7858428601b5a82ffa38d7b1375a9d6fa91aebb9a45b48020f7d798aeb07ee816c0dfb633c109c7dfe9ba6b6c361ca8edc36c675db950c6b50bc32c5664de28ba4efa608d77fdc532cba69cd0ae0360404", "ac0063516a53ac", 0, -662221973, 0, "a19dec6a34a21c8177c4a579500ce0a3eca2e80e87d6de7af40596998c28181b"], + ["030000807082c403021a13aeee00556f3a0382057518300f1b820f89c2adadb1b4bf3cc17a7fcca942020000000300006affffffff2f6346ea4747a7e254c5e132a480ee4f52a91be0bf2ec1761d28f9726e074d750200000009635252ac65ac00ac63ffffffff0264c97d000000000006ac00510053acfdcb47040000000003516a63000000006dbff67200", "6a51005252", 1, 161192067, 0, "103a372736b00426bff1f5e0b131ebca28f0f006563d4c42aa4c118dda60fa28"], + ["030000807082c40303385dd1276cc3e1dc21bb7b916cacd9e1821c0700101b78442523a2959d7c96c30200000005ac65515352bc941637a3a5226be300b90acef742fceda9fe6715104796a9256f97f1a85a09512a8e03010000000753526a6aac6363ffffffffb4da5183642f05463116ecbd3a28938b08f407ff976a78a582bb1499fc68f8aa02000000015180e1fa5d01f7903b05000000000700515265005153fdd37f05243f226603000000000000000066df940200000000c862ae3311e753ec546ca7ee9f8433ff157d69406879427eaca94d630684edec1cdb093df91a9ecc0c0e3b6b7168e25e3ecfd994b2031ce3c1408368589a8f5dd8157ac328bcb4f6df07fc647787a2ad4f6d87c747242a12d526d4c62d92abfb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7de715298ec4b52a48cca13eb6f5ea1cc653b867b32ee06e9b69205efd8c9a3466e7d1959b490d42875ce31985813c95288191fe3d4993a7452cd89f2461962c03567d25366193eba8b009338142ad01af99d216925d1579a9635746f840be6baf14fb59145aed7291924f35276e2263d29e76f81b06c242ae94899b73a64c003174d0ab7dc33b3322b01ad3cfc60138d93e8b95c6f1d5836fc971967ca77271802165132faf274999eafa339f87284bc81bd85be5d970113783e29b1824e995ff60b0713a019c1a1f05a34f7bd389666de87a12bdefd77cabe022c0c6955ff4336a14d2644714a05265ba703ba3cbf087e3d3442fab2c6a84ba3dacdb350447cd846031a67f352fffc0ff5cd561ecc313e6464645d633a18c3d148aca1e950fcef29e70327e102761a501eeb80b4d781cf152c27c2bf58f524280c63a8058d5689895a6502106ec72a24c12b626550b504576d352fb4d54deb7e4cac626aa3a8dd0b36ab5f0318834c7cb79d8a851bb62650b6310e18788df808c8a7f192dd3d6a7c3d85509d02003eac82e384480866a84f49f133ee6777aad574d7a048f17597baa06c1646ff7a60c5c4cb3e7493c22a4999376f2ac4af122fe14256070d580c70e66a629e1f89015a6c6d684e152cbf65c20ffec5767ff254c166d9b7c7cb48dd8101ceeac04dbba3f73745975228479dec23eb5c2d3b8f108784c13bb797e917b7040708d406d27fbce53f151026a8a6fb08dd73fa14618f9af3973ac7c86b7e9deffe1ef2c2e279ec525e528647088b0056ec13e3370ad6703cb7ab2c46a9bdd8f5361bff7a6d7856e0a002425464c7ef1605c144669a0b316813dee7c6c524adb61272127ee8a3636ef075dfceca0b90f7726fd1bc6180e900e84984207ee68ee0522d7ceac39f5250652e4bebee1c72dc1ce5323a5f9c2aa280cf211addcea1d2e9f4fac7d693423a8a512a1890f0fec1b676ee45d9a6e3f11bde63ca2b85992d723b50ce63b80cc0bef8eac57d3d32f7097cccb98d4beb8158c76427f19d0e927b8287985c8c800bc2cf378124eec9af8c4c164dc48f4f18a8975cfa0596fe75e1749fdd4d6be3ebc495912df2dd47a9e04dcf941b9a67fd1686ba4729acb3f78a6eb2cb7b90514224caa613aebdf8a58600cfc682181fc0713cc7ac1a658a182a370d3311f74d05d815227afac9a3e8f0c26c5f4a6177b0f1edc26a0f614260eccd8cc4c237036d260035ee0a3bcbc2739b367f3f1f68a852752ba86769891aa3fa25932aa8d3a82dae15c5e119949f3fd8da9d068eb66a5c16f3254fa9743c16707f26c70919a6a7b82553f9340b03c1fa3a237c2395c6333e98aa4115619cf0a6824d8221e9d2e2719b16570003c81612d10c626a5dc0219e610de20078b2dc18f5f2294002ea032f0e01e2ee58e9839fa92cc99c70d10139ceb05037b054144de0241dd80811f1c32a84f1b9ed174dfe21e98afb557212c50e5463e1cc02b70bd558cbf0ed8f0a4f2ae03fc4a6f7e834ad5210175fbe6a164616b6eb3f69d7fc1e1029ab72bfe430b791b91668321a9c32adf674ac81edac479a693cb58195c9190686b1d3450c633abb20aa181b794679976f63495ac0258f1acb9aac63f797ec84527c05fa598411e66acc21af2f61e3c81cd9a64627b2ac6eac7d592f0498ae95f6204e310deb5c6a3bb0df4c8af78c0382a1eb34cde8d81d714974b6e6a4b120497736c4f87d0728964a5488cee820608c2ddfa5be6e7b36d3f46110d439f8ef0c1337728e98d1a0437ca3c190d48ae43cc45443879fbd6130147a5c46aa6587aaf132a35c9012b26bc83d2ba1fd1174d7a60e4634a451385cc9f6c428834f595a6afb0c2f7efa1b65c2561cf8881df07602769eacae853e640a30bc7a3b59022328c2ace2c6f753a3230ed58e80decd503439215b9d8a0d5fb0bb80a7a820a180317939437672f35a04c9ba1324d744d1cad39e3ff0bcee2edaa7e20f358c2ec8fd77bd62dca3360d834b078709078f7d410d82ecb06a301d6c9c340da417eeb34d0e7ac825a1eea664c3e72a115fc374c7ffb7a0eb4ab79b93d1be5e74dd13be966b6d65a4c797dbe29fce82bfc3c0cb48206f06c58ca56117a1a1f1e670d3b36cae41d515ac271df95edb1d2ebeccc84eac1cf5d826052b191ce0232c53d633be675b4896e104a12556b9d8a59f9c93cbb887f05011060a880d589aa1ce47743113c5bd045192599646ca3c96890f735a3a1fa116f95f45517e7df1143c27b7456e8e77ece7798e90407adb78bd2ce08672d401000000000000000000000000ff35b19dfe2d7325cc67a43402ed38aab03360cdcbf3d9c2af5ba5381a88fd36da073c181ca9ed57c25fbe1613ed2612f3f61d592e629d732abedc863088ab0c36cae586463b6b6a2cf5401c3848e507a043329f52e5c1147b37c0372190e92500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000892554c0c869fd92fe83b68416038404a909ee139a791c4d9379026f89d1f8373bed17c53f443212ab7cb0ff6f4ff34f84d8a5bfeb772972dc47d8c5504beaa1cb4f4006f8d5538ab7d218620c4db8f9379c9de1d03186c4ebf4a8919c86e9a7b64a14519ad921652e38796f35caa31a03c2c2bbc5b6c22a95698c992d48d5ae0316da8b01ca7a7d01fb4a11894cb7250ed449edfb0764d81c8e891e09f1edda3a020b7b03106b8550d6ff87996fed91b7ba6320ba7b3ca076d3063544f36efabc7d0b00d474213ce6ae37e320fae9a9307eb2d37ade1629b714d5eb35d906848232f971635a350f7fbe9a23e2205d37f2927446d72532c0cbddc88e5d686597bc61c703239460c057bb68050696e8918c6981f1700445596eb6caab4309cde9eaa5d2410301b23b66a4f007c4ff210002fe40d5188a8f6656633c82ff43a7218850ebb302022f1d05721de59482db28609264d9ebec2f4b5c59b5ef8697d34a7938694f17ed022c8b4521b5e741e63fbc0b44c3fc95ade841da5ce7eb64f8d874ffbcdaae64500214b972341764aca20aecb2f37c4ddfc27ec0817a601ad70a926cb5ca13736fbe554317fb37d10ddc088708c6ef4eb12b0d7e1f0079f70a39f6c041fb0e339f27f98dd9793a0c4d5f617c8bd948ea8234fbc43a020f5bbae908d7d7f7e59b9b34adcab7e5c051243800297dc26ac2add93f3d8c377ffc2ab02a315aab466f3c1d455cc8bc714fc39fe360cda5b14e38ddeac4c7b71be6e176acc25782ce6d558eb7c16e56afe9d4c98e5ac141c4f8eb7c981417cb6a07a9d284e02360cb6fa48bf5c15e9d850c3b7785cdb8faa588c29aa83dc69daf167f682fe30e61f064d66487efb95c9f378d7e082cb3b35f6942e49ab3a6bf84990a7c009d4b49aa241c1816fec5d6650f9589bcaa27ee5222ab73eb9ee57f974ed0d3dc81152c4fdbecc2f64f90945d2dc85f9f03b429fad920a5d8f113a14abea78eab1d361a9c172aa736cdee9653bfe00f91372e128d78f51475fbc2232b736832d64215f9d4e3245994f82b53495d4cc2af108aa38a7896eaee484b737ec70396fd0eb55bfa7ba77576ba73b8c36615ecbf7d450d3f392dbf3b26051a2846e7b97323e0d3eb87dbbfb063bd4aedaba54ff7959e25aa938c3e43d65f10e743b2f54f096353a71cb6503b2df7c575211537ed353467c40557537c4cef8d41f58b3f17e48e5685288245fc7169e31dd0a8814f0365a35bbf71b057ca114fb78d6f4bf1c7b637ed2ff68c6bb84091318621cb4d94509bcb80480a8b4e2f625c10b270ed5b312356911e2aeb6589d25d7711954dc582011f37aaeb14abe30875256a08787ecb65159f7a654df8460732f919060158518b5fb46aa51c88aebcd8b464619544b824cbf298aaf67f4b465505f70452bf74f388b513ab55cdfd39c91399000ff0dafddfff0f433b78e16a0586deddf9c431d8a8986586cda34a2be5ae356492bb8b0f7af38b1ec7261221cb28715a068d588fd4abd6f5bb0fb18f141fdf9092fe33068ab2a64127a7ea4b9c21889c9b47a2d76ad141bc5642750992b2854dcf5b17dd99390c23f0a0aa2437ac6c684b945fc62acc444a39d18669dc91c1fb8655208c8414d6a8ca4a7b77abc0c8830dcee2d9d9ef3adef27fde2a1af6b47f2b54f1aa30aec23c84f0640d160bcc20c86680e70374595d1fac3ce78ecd3e8b090ccb368a6251d3b9b0cf4df49491a9e746fae331d7fcae786dbc3de0165c59c7b56ac7c921fa4f3ff4946be2b6704843d1b32c0abcc79e9f78c8bd9cd4785dd0ddfc3f30a59ab09c91b40242fbfcc88ba65941ebe91e1b8ee97a005cb98328566e335ea1565e4c66f17931dd291bb6b574267609150d589c5aebe899d200a472e64defe8c90bc75a95c535fdcfda1ba3c8645abd9f1b4d22852b3b272acb4a27e3e00f725bd6031a82ad7dc94ba60120053e15fb670b66ce80810f52d3bc08e73babdf5eb7f9b5c5785abe279cb143f14757e10031b73aeb1c7a7e056dc9ecaeef24f556da781e8a2c41e202650a63219c2852cb8cfa03cc3b9ca3985f3ee315482c5398b15dd88588cfda286435d7b52c6ba9fb6a2e0c23135c4f54d792e97dc4d63dfc93b9fc6ba2950054686dab24cd58d4de780e1eb6e2554ac493056f040be0f706b26e4356c4b2656def6afc4b206b97519fa8116753ebcf2f596c3405c75b929b57485c35d0c64db937c2e2263948da5d741370d7a8aedbcd3917ec82f095fb878707122d3ae7862e70d94d919379be4ba7d9712c79000000000000000031ca8d020000000069e0a6acceb5c463269c0a9a8f903dabd17bc7d3ffd2b6ee3bb9b411a613c84b0b5f1a0d5120e02db4f9dfe2b37395233874485ff9054c878a7589d48c559edccd510b80f1724fa9359f0c8ae45013747a186c3f5251d28013169e78a0cf0c4c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a42f5229fc435f733f639611908f40b4bd5ef8214bf66d8035390557a316e45e331885a41796f68ab81f7f7c10b2c849829d6e0d836292d1151d30455377264cfa0a5d64f82744f253cdb5e7aa2e81c4678fcdf865c1af7079361f6a933d66196a775777e17baf9f9a5267166f16fc7672aef5b7a55a1c9cba0d5b2fea3cec7f022164a9770d8900c3c711317d0727fca467ceb9933fbd56e4c4c6c5b2658f6bd5021d8503cf849eaec4e66dd712c3ec7ca0823829d9489b6891dff73c370ab0643f0b087774b6bde70e3b475dc94b7ed47f2f25b79411ba136b324e2a3eebb48710981dd934a2428e8cb2ab9caaaf9a4c0e5a3ee9cbd5527835349ffe6c4a75b5953f021b9b74fb1a2987616f8cb34cffbf877b3a17a9c225bcc14e690c0dc6ad9dd03c031a681bc7f770739755a503c9fb200eb9a49af495f03d170a118d1886cda2089d03296709d92cb42efaec60fa36d14825d8f87c092731e16cec3ca240e6f91e46db02135b3ddd57bbbc0e59837c771558981e47168eda88eb850f3e04a515117ea14602035f6aab2907368e259a69ada582f4d3dae2bc90052f32c19dbd7c370f4dceed3b00d30af8ef29de00ac71c5016b1b43a9152855817899804b22d6b8ecea0cbcd9fa3f58ff2f83e2c890457bb5aab4b0e57868efa00cd97571c40e7a5090e46fc1063c7a04c7fcf2079545b4f38f461e702fe4d476db6a9925fc948e57bf94d2266680d23ec9754283751a330dae72039d3d3dcb171c2af57e1520b767fca3ac4ec8b3762ef334470e086da4770587e128e6488e5b7dcd1032711c6c4699511c07656dad7b0d2235d1089fadf3267412de166ce9f9f2eda545588acff0b2846625852f18e00b6d68dc83660411fb30812fd96e4b7487170f5a3eea8e4b55a44ddc84bece67ab5d1b988568f56532d8d260fd64cbc51838a82bb1c07733ba528b3aaf5055ecf19e715100f0d651fff944fb24c0bf1ed225d1e13e28ac9172a441709a3fe6c184534c4d3c401ba18f78c0224baeaaff05727348bf25462fed5e95e6f66994522ff4f543ecb25078fd027adf0e2eb2879cacb26ca1b0780efd2ea4531517d76d3d1df18089827d090f7fc7777c08f3078a61aabe3c8ef6195ac5dc1cb4c5e9cdb926a303507682d449c027ba14c6200dfdb0142540589cfa7e65447841ac745e764d8ce85e8875c707d9199357d32215556239dd62caa98f442afafdc619b738a30f54d80861cff167fbdf9e9efde407d6db6e779af0c1855f0f252b8acee3855ed3f6a002557b4a493461560abddc38979fea5201cba1ed2d4626a75f1f6c0a036f2b191b220b80c2feb9518f8fed4786cfa65ea118f80b8eab9022f602b3c722d0b3d84971aa18af8d64977012bd4fa81a3a18021eb075a318bf82f7c41a6f28c2c80947b1ac4cfb15c5a11bebf1c3eee32324a2d07ab0860f8e9f674a704fb89a648f21986ec810b34aaf780b02adfff0712f06d8b3bccc31774cc2520b4a21ee7ea6fddf5e70570f0dd3b4dcef128df5c6ec9b18c2433f518701909aa5be2c4dae1bd44740377c605a336dc2cf882ab0263b66e0c49cd29c5f6be99b57dee2d5bf1089b7dae5555aab9648179ead5835e246977c031f0252ebad0d059a9006a8efa4db843cdda01d8d153579a6db6f8effedeff06c753f9958dd16865785b1619e0acc680365a7d4d42b5a60934c4d96774b6f7acb0aad44141749b4a35f8e1d3b37a2406f050fe9952fdc0ec6a3c8ad1e9e3b6bedbee4b0937ffef26446b6bbeb2fa16b2228dc39a46363e0e7f915ac24db44e8afc54c4c533da45e1c1c76781f543f552303d8f7d49725040b24716bc44ca932bc49c148d481dae134c99b9f4b79b3cbe2354bb2bc04c9ef3893ff23d12bfefdac30c4e8d1b4668a7cd95c1328981fb69a3bb7fad3b3f34b384890c52d8f099c20838be39c7e832df7235cf9d4280ddd4717c0e16d39f48b001d1ecef47da4c411814313951e0c037fb4044c870919e91b71fa645d98b1e5a2de4cfb79aaaa2d24aeeaa3455cd077713847023f6619cd6625d13c641f76981fdcde68a04868e43ea7a47cff7e0bd3623313844432ad3c854794c1350bb36f7392393b8649288636c5e53d988f6947dead504f9133b736fdd5d47d1b8999be49b0b4a5425c72df76aaa30b6f36d3d0735f641e1f374d6adb4060e97d906a541e0de487d81a162e0795e016d6eb26a7abb4ffc7f2d6e8d872b221f5604619a68d35bf48dfce9112071dc860f193d74f52d29d345634453bf8b88bb0444af5a0d6773a66e329e65173b8b05ec780bc11bf40f94ba5b8c706158873c2cf1a2c800b3cbcd078a5096f0d8808e9f7081f9e4cb4ee3fc2cd20a1094793020f89c79f51ed1ac9d56b4c47af3cd234fb11172a5605e08a24cd739346178372d1500d", "53516551525251", 1, 726060232, 0, "2366c9f5db5ee54ac7ea9b3071f62332bb1c1b585361fb1cd657e1643e7c87c1"], + ["030000807082c40301bd59dc0196f4d4cc9e5385cb5c7f9da64f7596fbfc72f09f04f64d29d021f1f60000000006ac5153635252c60da4f803e6267301000000000900ac5152516a5363657c18180200000000096aac630051510063530d841f01000000000000000000bed4772b010000000000000000962fa403000000007d88dfb402319bcef161a720bc7240aed297030d403c60c9a8b2cf109a3eefb4901ad10fb1cfe53541f78a5d2c60abb0593b00798f763f011f8b86462a8bef6b9d125a3ab541c8060bf6e336cabf749c8be44e544b50babb24c257e5a0a5333e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b3b244058fd029ba00d188541cde462ce67ee71a79ada2a9ea1e34d996d59ce593254fc7e6605bc7553cad3b13753228ea913e45d4b7a4e2ad54aff9ed0c8ba7311dd9f57b21f639bb632cf0c11dff445d016d395e5d464a95cd60ced8cc1cf9c14fb48c7930c1b79ac3172bfc1744f09af134199d0b7a4f586e70a1b14e0cd022bd5e526b6c4750d3654c353fcf9412d26cffe81e14ead6cc3e04c93109dc36903299ae125a2d57862bddbf8766ec3bb7829a8691490971b3ee601ac0bef295e6a0b02d3333e508fe87bfa1a9fa959203940b7a22777be9c62c18117e5efe387324cd72d4b8465d2d5db5e338b640115693cc4b912da03999eefde2c62e66358617b0230387420d9e889d5eee971b4ff0df47c2f037d1b7b0ec575275951334f7a4837022877b919c9edfebe569826c3db4d390a15cf2ae16dd604d3aa18627edfbf64310322956a089a9f41b9b15b56327a2b39f400189e439d2f19d3564bbcf46c2864450220f600f33df01c0e62334bb477902fbb92311af4e3fb356f8127c33aa44322930217876272a42b91263c427f2f2b6017088fa100c3dbeb4a1a3e87cae786a1c95e4a2fc06f06e1072efdd5685f0b10827c0cbe989c5536598595cc0fda0958a2c09a37b6eb1fd8510cf6711be1b8be61cf1ebc6fb320684e91b6d21c9072cbb1a7987d3d94424d14221eb240122c049fa08630bfb85c875e01ea2470a6c2ce428c6193881004c7885e3d85f0d887e2905b8db796e4aefc9c1b352e8bb656b1eba6f3a4419c966657c3d644da98f38dc76d862c7b0369b751e2e26f7ca03a5ee8aee5cb9559086e2fa3b04e71ffc2bd8b852102bd051c4f7b79437cbd8f097f35b0b4b678d0c1cd1ad3dfb5131e6b0d5cfa8ae31086f61a110af949ff7a8a47187bc930063f96cedd8186ba1cc757e9681c8572078379078162edad0c8bbd72729c362eaa4c9a86cc1dcb8b91e3dce761740683049efed8d00f1eb5959929ca56f5710d33a40488405ce9d951e3fd660542140c7084ea4f8ddd969a73589d5b398c09fae3004bd4dbde9abd86b1c1e688b099ce31877331be58d5038568966e8f3ac4866a2d2fa8e2790da2bc550ca2b48a1cb82df5549a9760b3e5ffde3d0edb6087a7691084a1a39bf97734fef0e757711533fe60cf4cb91a5e6d476e0df094cc28aeade3743d116641e724e1d63ea58f038534c399a3fa4192d64a64d995399818b9578c43ad3b76e0c0ec605980638b46906d52c21dd7283df3395378f05970db2afa75df6422e7dc8f07bb8c2994613ff192db2bad0ebd00db157100670f6df9fbfbe2d95e3f6ab3dc49decf786a1fc742e8134742737cc79e5ad7bc55c559d8352491b3ce376418b1f5782f4c8fa69a558a7e209d17dea2a7682d9e004967b69c76133be770002e129f12367e31ebdf388e01219271d411d6666a46447a21d31faba4fc3cf776f8fd5788c9cfa312c328e42180e0db115056a87fd689c7611a21f3fe20eb164148c7f5fc56be01785c886b21966c2ff2ee52cec4830e61a00884c59cc206ef92e5bfabc4dac5f9b83788ee8072058476b5ddaa056a1e8d0467c381436447e62d244cfd22824f721e36459c493fb65cb44b6f1453fdebbb1b7b887b18d756c673b67b1ede4b813e0372e2080a6dae4264a0750970440944ae9db3fae04d5253b6e72993107c020465e31decc47ff5415c73d82fb94fc19920c7adb94d9145eb5091eae6e217d77185ba2cfa9b71a1f5ca471f0e92fc207f3b55146b47baf744d025f1cc0969f48b89c819ed93d0fea4a402693312d899c83cfecddb0dd1d3d07ae963977f2fc72fc50bae3016094fb23dfee690cf6b09e1a17c514a183c62973dedf58f87cc1ac00f9c281cfde66c2bd42213fb817fbe5a1113d7fccca6aaec43a95808be2880f7f45a61c9babfe10d2e00e00498b94b58f0d78cf561cf34c1d8c8a8b0d318ef47a828fa597b8c3a7fb178267b8775d83fdca8392a4c46ac8d2eaf514adaeeab9b45aa3d45e1e8a2cd56670b6d6afada6cd350ff933ae17e3473a441845bcc47af4d31978039198c88d52eba14909d13f3d9cf85b2d8a282f8466f0e364775890e2111b4214ee3e0b55c7189cdee2baf1426b0637e6fe5554382ace2e4128cf825be800661c9f750229c13603b8611f14ac934fcc9a4c14680eaefe9d00fd60096d2d9c096686fbcc5536ca16b1b9201b7adeaff20c83d12ec5823fa7f706a465d432608007b2840abe0d098bb234a0d1f017fb47ad4972960593425490ba671abe844218ba707504b2bbf3227026a4fd580208006a016ab231b762c66a9905657ccaa1b5ec50421572bad8cbff8855898978e2c64d3ae77471e94355863455539de3f866bcf6ee877c37e94f284785bda9da12845fd8e23e74759afc37197059efee70d", "6a5352", 0, 1303675994, 1537743641, "db936af7023d4350a314b8ec1893fd0675645b0bc9c09faa26071b299491ecb1"], + ["b9fe345e04c463ea7a191300ffd6284909840e26ff496cec256411fb3ddc1f9a44cd70edd502000000056352acac63ffffffff00aacc59e412734d5b746be92b393696dd2a61d2dfd004e22c951c4dd32548ab0000000002526affffffff9e26072cc20515f4cb09999ce8a5b2f93cdbcb8b900fd7ea7813aea8f327d23c020000000951516553655100636affffffffaa87b9c03d121c6844d7b17971e6b5ea11707d030f74dfa803ac4efb08023d9e010000000600636a525152ffffffff04282490000000000006530000ac6300d0d47105000000000963acac51ac6a655163be103b05000000000752636552630051c803c10500000000066565ac650053000000000354de4905000000000000000000000000387281ec24755d90ec97af3165aa9a6d3aff44a795f2d1c35449fccd09763dfe6bb1b24c20dbf18744f59a56bd4744f3cb910c22a6b7707ff0e51dac1d441e733c25300d85bebc56173d1fb8f249300d1098ef55fbe875c2a4205cc1870218bd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000037e91e43ef981bb32dafe7f6b8db75e107f08c3bd9fe6e8f2a9d6a3bd42bf7b8161bfa42e11352e4d866e7b9e7d5ee8c938bfc8d20b0bd39a10cb2218dac45a31392b85844694626d0d666b12d27424bbdcecad49ccdbc7593f7229e1838a8df862eab3f543bdef126b4ef8ef5daaaaa1fde8cd9507c6709395bdba605427bcb020ee8de22fd47becc114e575a113cf3768351f7c5bac5d47105bb8a6d396d631202116d9209dd87de037b3887d575460b1ff9edc90d9014578d339279dcfacba3880b06bcfd05c433366f9553955e97fabc30bac6b30e35c0d198d7a102e62d09142d6a91fa2c721d5a6b24698b35857b031c1d7f5a9760d7908729049519ea01b8de0204eb336990a26ee2089e23ea651012f709e3b45be832761e6710cd7f315032cc0320597119c8cb40d9c5972b99164b51e45acf3c5596ade1d73c2d3709f0d8af21031b1bb53bc47a78558da3193d1b147b36e04e8abeb73bde5d5b224e0add41794e0304c426ac663e66073b7d7ca174e06c5d6389bc5db6a6b0477f0091041de56ceb020e48d9da1145f50c342b0f66628187a46362b1dfd491b0dbfead3ec222aae9ed67485c2f874d06be19a3735482149f5ca727a0741b2e5bcd06ac6e4c3126539b0bf2beb5d56ecf9cfe2117d4ee30ec01d586f74321de056b67382731bc0f9e1c8e28372f7262b20261c325b438bde901f486f10a5bc070b77e7e9447b54cd527fc24ecdd778dd08af042cfb43f2a38e013821a235f34c459ca289daded3170f50d8fd0a881ce0e53155b2cd875e1918ffa6bef94c844884b4aa69f902628f8cd6846c0156deaaf14dd6037697f3b64f1041e9126873880e24ea08611d7d6c0ed63e60a7c3473272642cf6107539d40140a3d8bd486d524cc02b9e9273114f34bf74cd17609e385a611d729e0b793e6a0bb8d6eb5a7ad6909f4c2af52de70117c638bf91588a5cedab198f6cd0d8515d1eb8412e16e5d54af197729604c1a2ac9750ad6c38d5806620c06efde83f1e0c315e285265f1e193d49b88e51e18a933ddc6c3d8974674b7d574ac27fed32c6286c04fe56b87164bd9a7778f0f01669e2e90349d6a39d47c54f9dfc36973307d5417a72df879b519357cec6e829615d47578f95f276433f68be73f907f0e04f9917609e4dca51c3f1844e994e82ad0254142cb1cc1fb6b682cc972fbea5ab58c568c8839559b27af5ab33991117f02e59a2797f88be8262de000be26afeab3f56f99cabb37259bc74e58c21089adac3657f1dc38913f92d9a58453cc6d0bbf5f7427e80e7d41f28b24853f7bdf5662f04ed1d1acbcbcf76c3b4e261859d4003270759acb79b869a0f38671be8250f231786efcfcba739dfb89e6af8aabc82ef57630e7afbe6fd7450b09f1f2160e4cd0e7dd012506e5e0102f9674ed0300041b0ff7c2f3582df9a103ab72e05a9489d87ad75f1c37a9945a0999477e1c37e087cd967a06d3e0b331f7e9105ba03817b35a50000d34b201c5a0f5e288e6e23540c35d85b6358aaf64f1f16972a28aca71e3ea058a76c5bb56f625b450b85bbf04750e76760ba25275d878c5fde776c8915418f9bac7c014fc93f14e1261841a1c70b1e499288fb28c71071785616dc4b6a50cb09e138bc647edb00b11388b91eeeba31b572c53a95325d5ebfeda1cf5584fa07293a3f821400371bfd13928afd770a13735bb55dc355c5e2ac89f38a7d400acb82ddfec8f2366ff224a9fc7ac0cdf2f3a88cf0a1186d72ff4f90f9b4979c4ae1926b12efe7620309116153026675eafe9ba7bc130fb9cd995151b680c509e3ab58aebf72df2e993129999058428f3e536822d70e42964ad85eca91371e0002372cf5e3540a303ef5c3b7e27760e207abb5f7e7648eeda582b6dfa1d652d291c626632b8f045c01b776687e4513578fefd8ba4a48d2fc19883debbf24b7d9d0034073cc085f339785eb5663a2eb1658b4e830c4645c37a3235c8f5164688f346e4e8a5de4d0712b9efa7749209582102f9a5cee2b419a22f37bb55dea11bbba70e74302f28d7d94f67e32a3098af02c7748eccc84280bf3a11f27fabf6470d6dd750f9e86a1d5ba4c6729263bd5101a78d20940aa922c6d45fe1f1cc84735fdea0a975932b72244933f7f40efbd1342acbf3ce06b0304fcc8006bed8f8ac78ead9b27b9cb89e7ac0be7062bb726e33f997c61c29aeca912b91b0d0fa3dd685e9eccfc497e9f7f3d60161b44200de92db7f2c14d80c2364db0fe76200b5ce8dec084319453cba70813c947eb10ec695cb30000000000000000f06df00500000000f710c789aa162361ff5cd9d9c1ce3f802e0b817dccf3f88fc783d71345ca7aed3876213ac329778bc8b45bb1355932a96cd424f3a5614ca1716e7b5c9c6086e85c4f3bc1af8f017114b9d4d7433982e04147a95ef961f19fa6dc7cc09e2cce8d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b58d64930f263f34679932fad8d3fc961452265dcec82bcbdd984e5a2551bb0d1bee16714bb1bf5b337178c14085becfc805d5ec019c822d825a7a52effc57f27c882c96178bff6d222d260025c09853fd109d9784ebe18b5056b6f290d68a86621fe60fd213e723149cb94a340f9519f126e1ec966e130df8a895883307300202077e1fc28c7d3ca4a26fcc697d204eaface741956655594516d682af7e546e81021fca75039f61197a8007a33712a4791b872939f122811928aa60203b0bfeda850a0427b71334e0e8c9d839cb32440c2496449d84e60d875261d509fd1ecaf05eca43d160deb4fcae6977fe08a5c7441babe1df25a5d132829f181f5ca29110d0b20212001582e00eec50a3621921836ad31c4ae084d25da3a6d781d48504d82461fe030d612474107e403c403f2fea27a5018fb7d8820d464a4a84cd8a6e57dd3921f8031f0bbee2861db024f3f5ec4d9a153639c3cc7b7db61717b6269d511fbd5395ed0313f0884e6873fb221c5e0c6270b84904c1dd676176fb3dfe712332463cabfc9a02171e3dd77416e918378e73d0b4e654716748a913818eb52fb3c84f772a220fc753c50e8529e540a53b045a4012933027f73e07ff5a8a4204584bf5d11feefaa40ea35c0ab0eee5b43220929d9870ea4f8e9ab6f812555516efa80a149d49c50f2f96f77e18e889a065503c66b31214ac50493fe824b77dd1490903ef360ac8fedfd0f4076ed47344975ed71e69ea546bab4c87169b7a7906d496725158405013b8c641beeb5352faee133f5522f010134552bf4d89029a63f57e053415765b947534c2bcede9da5b7b18b0c0d96ad2b107ab5fc67bca6c77e147418a86ec11eea3674e324e091bca1bfddc2ff3f1ef7616a679d5b963c7942d78f852d7d57688bf9927a03cbc01801fea8ae42a75d217ea263fb1af731f0e122623d77fda3fc997f336a5a36867a6259ee0201c8e9bc8091394a047ca488cce2828db09030e6d01ed8379168449fd47a47f59086b71032668bdae8ae18db1044d3603834b060b2c4bafd688f2d5f27df5766c2c70b96da4edb48b272bb016c9d5b10440a869b20bdcb52d5c5a210f486a7076ada73eb04d5b71fa890da152b1744d15e56eae2b129b76af268347834599b180e77446e4674da134427832406c1073f20f698518a60b3b004b18fae642ac8eff1b235f4fe33f761c1fa9834cd6f8d07cb66c8cc540257808d5892fa9a16ba3adad9f5df961b9d0938587edd947cf2157254c30514b32b6f7ece0fcb3d79d261f9793ad100136c38b4666198ce55dece37e61203f733cc48268a845c99ddabcf3469052c0bf22100195b3db3ea3041d84bdac064122d54cf0b9ef56db18b52872cc88d030aa7c87130b57e772a32a0f96a60f768a32dff5145d8736bb133b1b612cbc9e70bcb73526195a92cff531a0478ed7ca2955f1d8eb350e29a18981f0f889d0781ff1a7324340eece2100a8c0f24996c9c139953eba1b0d12fdc900f1e488a69eaf34f52810e3d0c7a937e24d517089bb626ced2825b1725b97bc642efd64e102ad98bf3ea3884cf7c19bb68be255964a9637a99ad9b1036f3e1ededb6deb927f949c8d57e97099902c870b557831deafe2d8de01e33e0fb2ee7c22c01860f147e3fbf23005f9c5b7160450ad23c6f8b2c83a028e4bdd22d5a048b8a2026aa232d03467338376152132a27618837a6153cbc5ede0addd456273daa095298e17c5142fdfe784d9d84f68011e94cf4f5f2ee614399274633ee146c67e23c9af70d64a27f32e51324e4b0a2f46da873c4e0ace79ddb79eb449792197d7b2bf315895afb0d14857e09151beac565c85571f0a776e33e1dbc9403efe029d861b90f1ee53781a5a12ba8834368230c08ec61dee255527b8be18feb8550451e2e3ae998ad9cb0fa54f56fd687045f803fbf550e724e69102cc61543456ceeb1306d054497793f5f13ec80de42a9380a3dc58602dac81f8de4717b603ce74b066365fa2a350ee716c454213420de87482fef8aa395fa7e37c5753bcaf13094d67dbce59e121abd6025dd4c84b398344ab058b8b49b3fc2c5516f63b090e57f12778bfb11004d96589e3903297e8f7335d93b5f24077824e141590ecdd6711b709118e676a455e6eb1fed2008924e0cb381776b58b332a694241625a8ebfa0f6984689b02cb7867da656366d51cc655e844b76ba4553c56d26a9e3d4cc472189e4164155d395f5c905b2e784297d73f6f430a1978e1506540377c5859d849a28ff0b50ba5426d4984f38dc0500000000000000000000000076146d911e6dd3afc408cba06f83168290ef466c00e2d14a4eb0f722fcbc8585d24aa0585acf69ea5c14fa904ea738113d435bc74c3d58e8088d4e2a9db0e8c3b056b1aba54bbf90636fbb2f76a412b5211326c681ea47e01f32aaf9667644f500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b3b622deaf7ef8058a1860b715830d55e79493340a14ed637bd6b1bf0de1a257cf04c4bacb7aad5412447a504c447b01492fd01bb8046938b45cae014692f7e3578ac3a38424b75eb4eb7040d828a79c7c379559645f5bb092c2d25a875e2f5b8a9a9fa41206308c98265c87b52472a06dd4bf43d68dfe95863df31f3509815d0304cae73df1070a609f0b4f27a436c58dec73177e6d8bd638d04336aa2d56ffbb0300fdd1d1f7d6efbf8fbc6b87875edcf36d7b11aa16b228a6782c19d6a5c44da50a08f181eab8f4df1c5796fae250e77891a308f9983764ec7efa55c99279def95a196041bf0bfbbedd3595c2271ea89e0e3695823c0bed63f068a97107add7bddc032347e1cc1682141d4c4a086deb3866b8801b0948be296896cfff5e1eb1f772710304cfbedeba6f7745d69eae8b3324ccbaf4debf5c3b34ff9876221fb240d4d287020e8e6275053425a0c214eb91f1d7166675497a3c3f89b64683a434e04949aa2c0318c056372fb7b520951a3f7aa6baaa41937f352ca97da324e6b229db33fcee7b021a103902f24167e9437b79c3f5de5afece5a5a058b9231570965e8c710a47e6a25bedbf88831586f97b0dee1e4cef068af24756bb3b41f7455511140b49d71dd9d906c55a10a96734843ce5e85e1fea37a343b372d49c102a2ae8cd168fd2af9597684331d66f80d09a4bad67d303fee69cd2881f637cb20e8a95031919d09f978b895c930f7cf08f3e62f967dcad6fe64d70bf58357a7e32e7f327d42e7134a27e1857edc2c385fa3c0a6b2ccaa5af5ec1ec0d6e71c7079ba590c90dafb801be12378101c1f051a1374e8337f0134d30f5523d57cc6f0099d02eaa5ac9754cca7f0636e64f20a672e3788869c95846a5765917c78b1991b3ad9ec64749693458b1b289014bb30712611b394d268cac2abfa69000af0d44971b072b041ced0947325563afca548b660b8418dcfc3a9df310ff8775e827671f76c39b318bca8dc9d447f9b8ba32f053e7028109e69486b372cefd61cde7709d54904951c32548a2321fd75acbb93b5885f4482c78928d3bc1ccf4e8af995891108f0953b2a78dc5880946f6919f0e4272cd0bede6f1a573edd6dd2791a062a29ab5867d7cf3df9a5d3f1dd4fba8f3cf949d9f031c70b00c54af2b247a3b2c2d61b6105a665085ef9d5d209aa591bf1281a87a9fc376e1aac7b0c6714b889eea536b9c884d6ce1cd0f3fe3f9d9eca6cab6769f2a6e961a5abdbdfdaec4009fdc0fc5d1a0205a01e2f448d827af6d7970cf29f7426166a6fd392b934da81209b1496dd146c6da4ae5511fee9b4e03039b0beb6f87e24da2316bbb7d9bde6399262eaa5a88087a43fc145725fafef25a82df17ec3cb8b2a9c7ee2ac9c63e73638524e277257e732e369ffb72c73439dae7df21469f9955efe13adae91548fd88b0a03cb63fe66a8e4abb1c8f14fabd80a63dd6b70ead633daa02d132c4b2d7e67054c083cb4264069aae1fa1ed83f69beed45c72181390205ab160048d04a532b7a5ed5f4dad29c3d17e23e891e85fac18cefadecea319a8943f02c40d527ebbcd8823e662685738f1a35be609a220e76d7ef8cbdbf05ab7e858b20b449cd42deae7d27a828c361f0af8ac83bc1c94aac861a6d4f545dda4d06063dc5771478f3b98f977f8df84e98894a31f9eb4d585c2e66b3a5a76f69469e5a7d7835f6f249829c08519f56ebad3e356954c03776e8d6da8c50198a52fe25421c2f96f4d8e8a8b6e136d7866653d798a2aa7733ec8023d8f94de963033db9eeb781bad44117e2cb9f1100dd616c469ebfa7115eb9319308711d51e5f307170d868ea0eab6d63c6843ef79ea05c96847fdf965c16f6ee7d65839135ebb95a53f80f08db709ce1eb2a4213ae555d102bb5222edc816c547eeb92eab46031eefc967107b4ad7b656fbe92437d28236644fbc2c334b10c47af2ee764cf80b296455c44f182146dfc9f8d22a7a21bc0f2a54329390c38180e50526c058b04a1606bc0a42211ed6d47461787cbcca666f2fa2d2ad010f6ab1ebfa8477ac60420ce1267b227ffab941cb2e194f059f16dffb6019f47e2fbb8e384df268addddbbd2cf16ef2d30ef17ba00680c1a4ed57242b96f71ff41562afe96ba436f21843547bdd11df116952500c5a7fe3960f1ef12763df92debc8b0a050a68ab6ec795745114533a3486d2b0b9b23018e6679cd045e277fc20749de983fe1358daacac070d0d321fe7dc4e4b3346ae83af7ec9ecc5523f8b9bd5820f27859f2eec38431451ef7da5fe611dc4054ef74c7fcad3892e2e7bc84ec521d74cdbf0e0cc2c3f58b23ddda97b958a42ad4738a17a86ec62818897202592895e806319ed78090c6cd312e95556ac0317c571ecc4f72a0d84ddc3642f44d2ea43d0e57790cc7fbe9d0207", "ac006300ac63ac52", 3, 1108910967, 1537743641, "d521abc22273fb8f2b65a6edeb07b46e3a07c136397706cc1bc038b4f71d2cd6"], + ["457bcf6d02a46c51673a25f15b89667375cf3261675205071f474cc10f1da5f1fc7d39cb890000000009535300ac00515352acffffffff70ced3fc6ca50f5797f4325941fbdd5d3f759e73e55d7ca4d5f318cef271fd350000000001acffffffff04c62d9400000000000465ac656adf64910500000000005054dd040000000006536a6565006ac8f268030000000009ac526a6a6a51516a63da2e526e0122c3ce03000000000000000000000000c69c1dbe6bb1ae2b706b3e055810cfb09e52c6945ac31c8c5f0a51f8d53177f5a4773b21ee72e9a3d15cd67332c749ca4bae4f744e71cb4a5e0fd0f37c3228ad483390e335aaec460219949118abf1d9e9fab672d648e27c3e2b89118cdbc7b700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fbce6a0e446e486da2ef8e35e58213e609e0382695f1bcebf0726b7ec7102ef94496e4203fb949e69b0631efa58dc84ab4dd9887b069e59cfc3d4ebaf52b826dd894e41f99064265562ca4a228d8b2c75d698cc8cd08eea00db65704ea3b2900cb6f14a85023f6f348ab9e143ed566677cdf38d2c3b1b1fb2e5b98c7ea55b60202224e81dfd53981f01e84fde18558f3c21d1a59baa4644bd1d3177c1e85c3d46f021246999db9630f6b8db106f371dbb494ada33a8244684c1eb83532ae84cacecf0a0021906767d8105a08d2e99924a7dc00c3dc98f05e84a938e0be679599b25d521502999edb100658b46ac68b7912a7ae9a5da126d32797c7608f3e9619cef394032fd198b871064f215704c2bab132583e23747e061d4eef162cc2d0167bd4de6403018ca3d2ff7dc3d7cf79d6a47363c020dceeb146ca2dd36a579d4ad626abe77c02099f038d225f497820869f2b6f70f2977e34dc6cbaaaa00d115e2fde071cee61031b9365c9a50478d17b913029e84a34fadf1ea96d85dc1179d2d8d800385eb968030de48ea9947d81b0d4a189661700a77b2cc80cac04e049e2cf2bb8a5285adf7a561617def6ec19fb6b68107ce5fb14b0fdfbd0d773e4e354b97f1e49a2f8265b79d47ec98159f906ad6a11fc9ca3b49acbfff3b4fc1f0652cc2a4aeb76f976c1f66101920e5735874a2e85d68faf25b37ad8b4161f0dbf2c57f001b8475f23736d267e2548783946d7e65331e6b0e094a6e75fc47ab0d74b447aa4b4e6ae6fba2a987da09692aa90c6ae5479938837b32161d459ca52c8150f3265b846490f2ed785e6e0d25d99eb5f7cc726260b51da74ff7bd1dce3dc4ae289143697604e5af7a888c8cc586aa2f62995fcea1e7f406ba643da68b3e3bc8ea483b7dd1fa66ee3868d8f29d5d2106e31dff86b300980607ce9b71b6b87f12e2c1296a2e6b7da4e1ca13b45b60119e3d9c6ad413b31f3fa3895721714d249fc61c4ce87f80585827ab069dff7c25ed9994df8415276a3960dcb0ccdfe55f254777981e80661698a845e24c72980df0a16899d66794aaf4eb6b710c55b087e093b41da59f15b966304de1f22283291446fcbab2db049239551b9cb27eb2326c69a8364da75306de054aa43038ef228f6decf08b80661d6fbfb879907c53ddc9176bc01bac549921349cbb6541fbe3fabd6a83ef4927a59ffe083377d730968507acbd1c76c1d1c28ca259889e6829fbd4049550df18b6aae02ce1e83162cabc19ece8c6e1c5c19df6d21f8853bc9383e86ec2cc8c8a080b71447d878408252354dafd6070ec33617ee00df74e39d2fcb7062d6e78dffe6e588f70d193573b98f5760a068c857c839c9a583134e4a2c0dc731b853770f1869152f1272d9b2895375c1ffd426e704d2575fc0bed19b74b001281afafcb8b86ce622d290573ea7056e56076369255ac9a6d8bac2d2332c77f2ee6b5ac459bf68927b65b1d6f38b71aae4f52af492f956d5459f4dfbba2def1b1d7445a8b8c3e922e422562fc15d8cf64beb900c26f48dbf0f3d668d3b890c4a82a18dc94dea4288fcbd7dac1636c30b4e8f8688829dd54988972f72e20212ff39e1fa37b9846745369e45a061c34dc571f4301cd90ca88606606a7f88c63f9b393aed07326b05239f2a19faa893175c2954f30dafaa7c6996a1d24a2bb87a4fee6dab56eb218039f7443558f4193e9f505ecec37374ee61a326c37d43d7e08610685d5cf9d3f1a75350ab56a9cae0d1aa2e2340ef8cf48cbf82b8d148e6e95198293f720f6e6d32c70130d5adb65fa7feb82e330576d32e8febf486005d816973b596d471c416150d4d11e61c6a7f5d08bdc21cf7556b7a1dc4fb5aa46b34cde4de6dc9b98dadb407efae7fbce647838f7c71b6ff00750c86a86c86d02af1e6e53616e651bc0fb904e758577b82940d242dd89d7d357c0cb232756f4275e1774a75a78173fb1618b6518356e1517fcf4798a97c7d36ed77c1489d807dce31621bdc3c75ca2c67741cd4c3d0c94edb1199652271c57e8538591bcf091df43215712fe87e3cce200b0a6c295272d88482711e96044e33e3cc3b9f34bc21f0c92d069a1170af46287d291da961bfb0efb1133db58a35a44acebc9d468c5e102766df684dad5416a84f949d72713ac982e5f0a015daee1675e40ad16e1e05ca9450bfe8504e581aa258299a0d896b0485fb58ddf2e10f541abbc97a999e4131c9b5ca8ce4a77b074d6cc533d4f9b39521ceee68f9a81f23a5a75cbf25a9f2409ddaac3675c717a077826432ac715d99e70645f7cecc075cfbf92f46c9725f114247ba87d5b2ed171909f03da7e7400f3146764497dc8be7f5a411e40bffe668355798605be204bc4ccac93a8d1eaabcd3e0a241be898ffe9e1fb6eb4ecb3d2f863dcb97723802e56403", "5351656a5353", 0, -2018095024, 1537743641, "2a8d39fd551d27f9c6d8997d9f7a0bbcc56110694a0e5f66331d017f27f6695d"], + ["030000807082c40303ce9e15cc48db5b02b1648e99c0c139db75bb8a0205eb0289a932e6fae546a2b0020000000251acffffffff4b7c4171c6157526c013f95e0dad0e1e786236a729600f5499a4af035f6a19c80200000005536a65536a6436e8d27e69da74c242eae4840036d42b32c4eac63424016de06d5792bf3bc43f0252e400000000090051acac005200526539e265c80322d24504000000000153ec06a6000000000000c02cbe0000000000056a63536365a3d28be3000000000300000000000000007869880500000000d18a0e01cea3304f1ee450668e3fe7e1c963c8625cda815201d4703a89165a56addfedb4cbcbf428235a4a2c44e17cdc7f3c02409de5df1dc51c288420a461b9d52dcd0a32d802f4209b8cb450095bcdaff102efcb4d9518ae2ef51ad6bb3c81000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fb7bf96fb39573f166799da3f8a48b7ccc5624c44b382f8537c0111fd45c754bed683fd76a8c8244c95b1eebfb7e3d444034c575eb92e6be5404eca30a58dedda271a1c289c3616c7915ce4d365b66c5c2c64bc05e1e540a5aaa2c8407eae564e72b791ae4a73414057e9211f8b42d5c4348014b02904e71a4dcbbe83fd33de021555e323fc575b094eab89bb41b474ee42e0c49a2f4bf3b2465b739412a4f96103189f483eb87525e6822578352c89869e6e509216daf427ef68b2c6b3eb803ed60b02c007ca259b4c4bb0e979d50edb5292948f616ca9fc240bef37cb014a07cd0416dabc823c862a97501673e868a2fb1b6aacedc44a400de1a72f0733e7f278a1020a3e00e6c8ccc04d9ac8ea6dcad4737237b87c8bc52659dc295e1efe7e3bf6b503281f21903a30170bd450cd89c05d48050587782f2abb76740b223d395b025056032f7bd0833f971423f1f208799fc97f66986d830719c007dd064e06096b52608f020cb3abddd831471ef8a0b340af47399e9f6a91d441e7d3005ecbfa344279cf7d032d043304ac70fe8c1ab251dc4a2c83fd3927e5e18aef253ab5a49c4eebc5803e9d039dfc0c51e63cfeccc76fc9b6d234117bd21fb97ad1516f4a01de3f8b66103ddf1406ffc0178844cf64d9f11c3fc6a101d1836ad80dc52832e742e525c89ee652d8b0636ead2ed7048489c9b2152414f047b1fdbf27db6fe6f29264bfd625d814fa72ab97d6c10325ec42224275bb466dc3de80e66301aa9c31c51b3851fa8c8ae0ca2212403c319f615ac40835c55f1e2bdaacc239bf5928980471b4a7d9271f36f452e273aa4eefcd5bd7a22de31773826167e431b4cc0fa8b6f636c41477dadd44e850375504bbae26118557ae9dcf8849c9f06d76432fe82b4c4f311c615b4b9324d337e0cc46b1bb7f85b45abc7f93b768f88d64913750c71c2c967ac1a6280d315855d2d64a330053bf25cc7d7c9540071611c220c22c2685785c16c6643844b02391a00bc87b8c529af44246af3cf69a4d75c03d42b845387469317d6b0582e4e263dffe3589db68c77e42358b391a4aa0cbe120eb083913ae11c2d45d858dae4e84ddbe455d3e75310b99bf069ff70d2a2199dbe91a2e124b9222475a69f5f202ad1ebadd8d275c87ef855fc1b18e9025a263743fcd0094d21df7b6406bbaaa742d295bc274309623ecc332053ef53c5072bfb7f59e607b9feef46502e95f0601f0f552d56450c535b56c819c4c64c20aec1eac6d7f6351dc3a15388c7d56fa97f568b92313b60d08ad9b3bc92837120df2a8ab96e5cf6cc1cfb4013dd09375687922686f396dcb46a58bd5670eaf262df1fb1c39423b1c7ea79281d67352755f9d176696e5f8e1eba1b25df5ea46720034ac8dfc061aee95386f23b4d0e26d90eb1ea88c1d2c40017b4dae107890cd40fd7d3b6d004b908476d2917095c026184641412842fc10708d21010818c0e4663ad93d9fb9c2533f59b47c9804a1ac70445c125eac8d9dbdbb3520f6cbb7a496d35d2588928bcc14d427ee15418c5b51b743fa6d7324375f6dd7af0e4db19171326046772594dfd2221cff7629ce6cba411fc8faea382c8870373283680491d716d6ab825a9669d2cf0baf03b2af851094eb6fad00a50b8dca323b1f4cef9d31950e7a5568298269d03ed99f5d2bca6f63d5c03f178797f256f972cce0bbaff2e6408c01b61ee37e77b7218973476e41e9534067f4af2463c5bb037a8da9084ddfad755d1f8525baf972cb1ec30d4585d71e0a3f284b15ee647f6aa2dbae1a59e20e4fdac9723d0e44782bcfbc7f503d47ca86fd72e7a0676d8b8a2e280f8883589f0ae26d09237077d4ac0513235f5e438135007e79ae8154425938559ec1e5ce95b86d0bb5624493ed2209a50260cd4d8fdf95ac72b582c4714a4746ea24394625844ef5b76c7e1d0282ba528f5f6edc675d600c41cc541dbf8c3ddd9a4c4a5d062dd6ca2609f9ac71d019be3504a547442c74b9d9d3b3465d7816bd320b17770842bf9313802e5f10e67df3da6b2d2322f72d9b438ec5dbef4875cb3c5940d6f594f09e8003e8dd2df8a4ca69042e242fc5d3b4e473f11158f6c14fd527011d954ef901fb834fce4fbb0695c454421f609aa13bf6699a4088102bc2790024ca4bb6a430a5c5c83e307651141fc0c9f0f0bb6139e0fb73871a09ef9fb47e3a84de7895decd3badd31a5e2c466773339523d7ea7bb5af558471df927c12a3dc3840d411fd3f21725813d3dc4f3e09a9f29079ab130b0a9a0de7de8bbdc9ed010000000000000000000000000b6b53b48779b976521679872b16457b25d225518702b0f92a9c607c76a0c1f6c179f31458ee44967dc2d80020d31fb836fc7c9fd8716732850168ad5ed867944560d8dcdde79d6ac310c45f0e5a5282c25eb3305f02c9dc50e438a2e3607f44000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006036c5ffbae073b47ef13824c75437d5d476df33595c820fa8ba642c14fc6b37a228c641ce5e36edf32fc8f4872e1f6a421f4d1b6231069529bd6867d5e99c21a984a132588f2bc6231416a357b23fc9df58853c7df47b7e8e8e77eae0ef74e82096c2909aa465f7df8f85d74fb606b359cd6d2163ac85ebbc8c1ff63d75eb1f0204dca648d5e189bc5b9f23f8b035d0ce087d97bafc411d867aa3a8e69abc36b2032ff50e0ef36c986a569b4f5af7fe7ce18ed5af9d482f74ddca5237f1b75e2db70a03eadd18014f1ecc9aaa45786d717efbab32352f012a757269d05bb826c46128149784003b38bb035684e5833ef88971a4ba4449a6a14b337dfd7757112640770318a671404955d2a018cb6abe903408d514802b5e8224591182e438afc98e44d60311997e3c5ecc374265b3701ff7f0909dc0827b01b266ec829ffc105664efb3a80208dd974ba23af06ca99f949b7d92444892f6dd83bb58d929111596d6dbbbfb6c02035ce4d74462f825b53fc2d1fb6801ab4da26f3484af47b6784db48cd8af03300322fbab72e75328ddf68c0bf004a54ff2448fb08a36eb2e3d89cadb2aadad3886e35a3f2b6ea01035a1c25ee8d01b3f017b19d13fc9599794672ffaedf4e8f348a473520aab5fa401d61c35631fb63e2c61d87996dc79c5165af4591cab2143884cc9deb21654dabe298dfcb2065e97dc033cf153b8c583b7b0919c343cb7a6722f455bde1ac91367b5cf833f38f0bcb7b7ad8b79a1a086f36a4670722581c3ae821bc4b8ea17986839229fad91060660f87fd62eef8e2f7cd3844dcb839aaec2fed0664f910ba8fd8255c53201c887e83bf994f084fd0dcf52db26625090dc62b16265c1c083fe45416f6ebd005d9fb845ad6320decce5456578a6088a6a6c59d5a9f5458128c6c99204ef88536ed9d9b118d047801f42c63023241f7eb5ab1f43b04894e46d88b08a6fc6253d034355d2c4a535325b5e7f1668300632d1b2542d4c7b04bc637774bda02dc77e8f4a21ecdf722ed25b13ae252690a659182c18671eb8401995e20135a266a91c18bfbfcab89b2ed9d6734735e322e8c0dcf1fb111bf2d374be8ace7893ecc041c76ca6cab4211f68b3c421d8c25ddeff177a8e94cfb6e150d0a7683ef6c14c5884444f7f0f97cdb82f7ddb0bc6d2eda1a99a35c67cdfd63c689ac22dd7728c988c34572a6de3ea7dd4cdc39858d395a6c56cdee09e4e86df10665ff76aaad434790640539cbe79d55c7047fe8d72707b7c58ff76a98f6492a76fdbc35ae6b1dbda5351df67467d4ddec71d5bea76f027b4db21f08ed7b1b9944ced2c64516ce712072a30198ac086af9f1927e8fac8b57fc0842c09f33cc71f13732a4a70229613909c780700735cbe75f0bc49dadbe13347fd73bcd2dbc552c90dce0c95ec98bf023e143f1f1ecc2d1d13a53ce030515f64ac522072684382049f8d2979eb31e9856567bfa3f1403875cd88166eda0463983a4b37087dfba4f54af7bc065bf12c8cda82834f4627c0fca11a5e45a0f0f96b6e10d86498535677a9d61f44ad21b7c3c7c21c6beff65fe051e8f254b144d5874d44d76ac146e775b8dbf6b567e937fe0c64ae41a19f6f40ebcb97730a225c79b3f8c6da0a3b112ca764a9fc53fdececcbc486d120b26ab284ae4bf2d86640dcc8a2ad18976fcae202d4e434aede623bb06a8d9a21bb2cd2de7006c1ce1e2570f837657200847b6e12cc074e3187328d6983515bf7fe3522cf74dda17de9a81c505e32dfca7aa5e4f6af13938102da83efb9e3ce635d9e47e69786acb47526328a488bd2dd75de8c8c455ed850142d15b3a34be540046452b064ca7bdb156407233db1dbd5df3f252f43f3d816d5cc5ef32be12a1087013534a1c793bc7a4219ea097bcc109a83c9a6ce477d36e40a91c5a30aaca9e42cb328e286734cb404a4f28e9d6f399cd81076335e637d9d6350059b47a8938c56a2c05b7bde5333eebf4be94bf88b59f70bf481aca33d893592fc5777dd821aec35521b4ff97cdfad9cb02794e83ef8abf64e1530c9110076e4971dff737e45722bc9b9e86ccc1e7959a65b6e8ff19e8e4cb1b9c2ff19c0835e26cdf92566865d58ab32930b012343edf68dc1f8098dd034a0f7b67661c76fd2005c59393f9233ed62122b16957415e85201fc48d8ecb4d903194e2c15dd5bdc74cdbe1136fcd4cca7dca49abcfbfeb1cb28abbcbc8c0edf2b929a3038a5edab1c3a55e1a8f7af3d14fafea16caa2d8a31fa7950636b8d09055e204f033d56d54b49fb7a2fb4040000000000000000000000006b68da4c3b16d62b9ebf575558b3b8c4ee46926be61b3e4e5a0d990eac7675aa1d0b1bd04e7175ae50ffc97447a121ca1fde08c555f078e29a8eed790f3ada577bee735aaff4f799ebe2c8faa525769bc2b5673902bb693aefa7a57bc009885c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000089101ee39878609537c2a5f91f16f0ebe2b17cfc3a2b8b1dfd443ca72d4b3bc4fc03a85fc6a100f62ce7a288265f88b0bc00adc55b372d15e17ff55a09330eef68dee564d439b02398a72bce52256b69ebfd55953d4e7512980c2f522abb50673a0487a5d2d755090ddd85dfa616727c190cc55c83cdfbc413c37c5ae93da105030cc6a6766b72ea3f8c1dcb7051f6ff6729bb9364c42131e4ace60b845b25bba5021d407e2fd3d3af3b3d9888fc8e7a136f8369f0ef66922f1c4924bcb12d1ee2010b03d967d056a7c901e3ef8debdc8d711c28ba344a051d2bd90e2eff0a021e69da1f55654b3609a5681a1101ceacb887616577b117e2a3a30f57eebfdf777a9f15020f5cb8430b43252c0f378f2a170ded10de130f2b13f59415d3403a149a2ae19b0207ea654ab417b45125c92540db09d260615993ad43d5d3f4f2c34e59c9fae182022a61442e852603a580b1535d43a2b8b9467b415a07904ca6aedeeddddda42cd802048499dd5f3813dcbac0ad106ca5a21dc6a97fa1147b620c177bad1888bea93a020927191094c43089680dd433852cb0110064901b3d53554663dc793b7abadabc354a0da4b9660c4670ad22b929cc86bda96037f6b046e309b09ce5fc062f5b14b5be097002f293badfbfbbef9cd50d6d9fb3bb3bd8fbfc30bf36563eda6b1fb2b1edfd98b124f98f66ab3f2be2a95902adf2bc2767c7b9e15c1d489c28de40fe221408f223848de2c50f29b68c7a308a5b10401bbb7a647e9473939be56901b68ff6402f5cb687212072e138b2928643bc5b00baa7e858fbb4eee63bf78860ebd006e10a6932d5c0ae17e0e4335bd490db6c3f20c2cef50c8a2c2b83da6e68bb83cf87fd1f1ef353cc7f6b14dc017d5a01f6cbe6a7cca4fb309517b3a9527ea17c291f49b8410cf310556d8f660ac2cb1c7b9a6e6e27616e1dcca54455031efda53caf3bafbb8178bc6bb5cd6d261d3bd8c5bd3031107bafb556c34fe63690989037b17db05afe90bf827409b3e9648a6a74b7579092f653964a6ca8e7c4f8a9fc20fb4ba61a9e8b7c5740d321a0ed090ebbe1427465c4dfed26f23aec60862f15ade410e6a43d33b5a7e285a219a81edf835f5efdf13cdc13fc693bd1c52436db16d8485927392d00ae983208311627fd315a81a788d398837a390bff2832c61a2de9e63c48fc697d28d9df1c81f541ca4bdd3622ad01f56ed3d7e8e303e6939ef7d9a9565479e418fefd887d152c61c04997968cf2c95bad8190c3be4c57b936b31b7ced3251c30844efda4d3097c99132e13c105d9246c2bf95b57dbd040edcb93075c165ed84f051b2c999769108399937e5c48ab596466ca83bec2c5424b994a1d5579b0689532493ecab3e05099580875554c2f928b9d2f9c258d051f11176da6d5e987c3234ac17876ab7883ba88a459c968bc066e9eb0960dc2f7db95a7ed3dddd6fb61f4ec9484d5fc704af242f5adfba394aeab3f5a60f4d05506d995b1d30481ea5047df160ac285cc5a520323b91799d4f5034d26634acde841feb0a013854025710c48fdd1cdf35b0fd6cae797bba825b31381f0e13c01ce8a1b5de2cf7ff23ebbfccbb17c4bbb8f486b49adc93f53942c5e963faa1881141d0833fd39d9d471c2f36a904af7fe608b9eeee885be3a35056204d4da4045a8ea12bb6215b2b1a9e9477022bf5e9504c2312066d7e1c9187b84ff7da8eb0087fa3e13027c31fb162245815236d5e2b22c06e5ca6f09b6f2df2db1c8c8afe054a6f762fb48edf05e29ce40729581ad8ece39cb345844c607a766727b0ede8be75c07e4760370c5029390ae32edcb9802dba0af39ea51014037e9c0a359c7875299824887d5ac13a7aeac6b4c434063d5a74fb68d59f9bdad76d3d1a91e2bf56efc6efe8bd6880b41237bd23521d549a432e566938d2ae93e6cd0d7aac245e7d589a0ca42f1e004f47f44ef312f34f5fb1c6d07bb07d47d2f192d7c527a414b8bd90b8496280d5e74be213ec74589c93fdbc7f41f56f17066d4d0c7ee59cde6395a0f9892c9201b69155d0be0c7ed69e741d2d2ea3c2c51f0dfc6f409746bfea3ec583cf2ff79e3deaa777a35fbb9b267eefe2227eba06fb4bc9cc3e0bc97a36fc93bb0d09c70f19f0a3c284673e42c360e82c890087373f6379897e8fd31e520016ce8a5ba75310ac95d7f37184efc5d3362b6782fc88818eaf23d446459631e69dfc6e096a91060a74b3f973c3c29d18322cdd8e5834cb2b9554d9f59cf141915fcfb35c2d389bbed12092423fba1ca6aa35cf1d53c655e4798681eb44a069e6f1f85529729ac67da0d5b273710b5a33c19ed6da371b233a6757edc52dc44da9fbc16e63c121899ec905ed5ed1ee618175b0883bfb2000cadbdf82f3eb2d91b220863a198cb5e31515811e40424118d7605d02", "6a65635352", 1, -1163512439, 1537743641, "c2ef2187156f269483e1f53b49f9adee4ff9d516740593fa392d14af9d401bc1"], + ["9b2bf22b03f099fe42f8b421cf0d5bf6687f670d0682122c88a76d7269afc0027b5a331f10020000000700535153515200ffffffffd64a21f318c5091b657a0ace47985fd92941f32d4af93a35a50db637fb69af4e030000000151ffffffff60372be77d29308c5126f1d6809fcb5f22aec8570ad525a3a2baf80f0ea0b4900100000009655151516551636a65ffffffff02fe9c1804000000000452ac656aa895fd0000000000000000000001ebb6e605000000000000000000000000205f570ff956ade2f6b5b7977820ad7bfc6d1220cd77127654971979b121edecbc18825d096e36818d0f0dc8bf005fedad149e07babd2666db1839b2338cced6dac663b2d55ee29063f77d452cac9c900e60f2e329c98e654ef1d62adb654cc800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000450e5ccc797c7256dcf1d6def5c5033b425afe84e819092193a010054227a8a4b9a343350ffa55b17fa8fa8be755968d9af4ffb555669a64ef817387acf90b86c365fc5f17d04da0b20e0ae474a7bd1b209fa5d9c9150266a2d6881c1f55ef0226cc4eae753685ca00ca0d573efa808f0dbf9ec31400c160fea6c46e3c87c517030b37a70965c7cb29c20420d50f1c81a7089ccec25196388ef497f88ec8c387f9031305a1b0b6e5d8115d11e276e03e78fcfa4725b750e6c96a70c0435d9eb1f5530a07730ba3414b6583824199bf733c1dc5489067b64f9cb2a08c42589a1d983a443a8916c24f855dea5ed736e5d5054ca1ee2456c1a395f58c5e7e39355ff31355031f84ed4c8cad8da7927a3158387ef6224104fc1b32bee465452f3dc21a6bd5d6022b365dfb468c797dcf9efb9962c19bb79d7fa44d8191178d4f62c0206a568dca0323f18f7151d911f63c632a88cfb60b02100065130755d8c2420ef72588ad30dd032cc2155497445c39ba267c74b653d0e817213efabc5145807c93fc93fdb72d14031093f7cf6ce9f5b274f2f24cb049020288a36a8e767d0e10b971774ad71fdd82038c118c8811741ac12c35f9da3b706ab0dcd34e099436a54f6f6ccf5bda60c366c5398a1edb81663eefcf79be245cd926bb64e172e5f19b56c6616d2043368d5448f141c66bcbce5ad3ba608c3e5d22fb704845404ab669083ac5d65ba0a2bb149cd2bfca15ee339967337ef991d64077a61670b015be8343ae92ec00037be0790a8194bc38bc398187f0afa045782dcc5552c26f8e902b70a78261928d59fa6191d2563e7f6bc3408150f0a7e6d71349faf75e5b85046cfe88055afd5d3ee28c60caa0788ca2871c73f6d121ef1e43aabb625df1c44df0781748fb1929746e2b1586c2eb5c8d2df59d3b31dab4cc49af0e9db2fcb64b3c694b1821ef9f764bc83f1d5b33828240e3a33aef418d98a98cd1a3cecaa8327b4254db3318a5172536b1684081c9f765652c1a06ba22e1fbf7151d4da0979cda70ae008c1acb68127f75b3a3b4f388acb98145f9018eff8b2a0dcf735cda25ead75b2d7b6d811b4664f3e81b44233940caea844eeb990eeb755dd574cb9711ef7dfd81df7cae0daa5e0357e1106a8edf67057d69e22d55887a573d0117139f076c7ca49714f45c7721b0c7981dbd96951dcba162b9ea9d40a09de853c6333d0b55d07d31cb5d4975fc46a59ceac4280fa78d3ff2e650f09943ee77daea0efa1e80c1ea6c6627505411fe5174fd7a11d97ffc142fd3fa19b3472162fa88f4d9f0a7a68b9e103297bd1c9b2169b73a9843922b120145eea04fbe105b2dc42a3ac92aa9451b7682b921a6a89bcbeccd6af84b82c4772c64a85faea351d2b18d2d8fb7973bc4f2ab7ed8ac028ee14f6c7909ee487ae823ed3b996c5b2cbc06599746a46eb14629c5aa069c3dc07634ab4a3b6829a5e66c46e5d9b875a926f694c4b57e60d16782a6d2e240b3f068ee420e4f436651b29558400f70923670b1f38fbe1549bc5dfb2a14c9a75cfb697334080820712bea4bec0517efa48f29e88b6285659e182553081a989ee9bd070250d9efbca24db3c7223d5ca9f5390f1e7df26664fac0495aea95c1da1273ba9d76499d422e23be66031bb39dd2c6df8054ac8f901ab6309240eb3f45bed1f6789ad43940f92466cc7ce710da6d16c84195e63aa8dbd6d604b67c44313e18afd88dc19186407b575cd8dbf620cb490e82942a911864b91a2bfab2137ee75c01803035bfeca12cfbb9415aa9918e282b2552b81325e2ed711dd096dfc863e5ff1d8a2786b7feeb6b354a5671eec170b362433b02be301ec4d956e8286208f6c499ec7881908649defb2b3e65cb5f6d9d05a843125ee6915eaa401faa24266b7e00b2ab5e6957e3ee722afba0ce113b522af97f2e20b3d38889a49ca00301b1f417bfd40a2cce4c11a3450219375043f88c451d3f2de8885251a1d35c4695c0fbe2f492f00f23bdc3debbe79fc7bfbfffc869fef866d218a9cd28ba3586e628ce7a631d467d3343e97b4b055f45d68679305ec3b7f999199e8730c62330b5aa17bcb674e6e2269410d14b90dd13142f655d357d03d0c49d638fced6d932c6b959bf811369f413726e40eef08a9a72033a5d1b74daa3879bbbc17308728fe76f6bd783b421e11dcfee6d352c4bd65614f041aa0323523b90d152d00d19d7539e270f170e7c1b4c487bf9c239c2cc03bd2646cc3c78d6322d7730c177c4d748afddc12c3725fe9b58680ee695738208c78912f94f87b5887137eac0a19b8d7db358cc0c2e03249b6e84fcd1df9ac417c1a4ad58c11b01e443d8696e1cc0d3fdae4f11cc32931bb6eac5cfa233bff1831190ca656f714f82e3941164cf89a4a9b5d9d0260fe91ed23468e5c4575a3c0f", "ac63", 1, 786336351, 1537743641, "86eb3a0172b317c1edfa4a52e0fd5c98f7a55cd434c1496714f6b45dd898b1be"], + ["2cf9236b011507ae2dfaa54f753bc302e7bef66cc9b359bd5e6a582bec7850334e4eade68c030000000465ac6a52ffffffff03eba3fb020000000009525263536a6365006abd43bd04000000000453006a51ffa3bb0200000000026a53404fdf6a010000000000000000f8980d050000000094d90559b90bdecfc513e57c0f05a8ff8275068f6cc11fda3626a97b4c5b328ec52ea6c50cad175764a42bad4fdae7d29c563939aa078641e133e5306888cf3e476b29fbea9f795bd8acaa50d0d43eba86f1da21b23ce0ece7716d45ee82e9d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eec0fee2e305b8dc75ed21858085850db472f5512cc49d2159558b72fe7d987b6f8d0063b36ac7eae9e69cdd86831904031859cece1f16ca672a9e1d8d15fcf764c14052fce226499259797079cb6b35ebf08b2068a5207c2b8c875e9f53640b07abb61e0723131750f0656b6effb006267ea7c5087ff29d1efe6121dcad774d0300f3e601d992fb39a4baeb4f3c300945d122cc1223399133352fbd70088ed88f02052d5f082a41d344c5a2869e2fa6b46ba2ccd30ee77e88ce11c22484079604230a02778545459786cc80346c552495b8e5d16f7bf3caf24a0af911c975f367dcd0b08691eb42cceaf5daf46ace4c34d2d0c7dae6e9f2e86684f596e18d9623b85f0306aacea033cb0c6d242f83fe63913bc200bba5720d5f33a741330c4b761fb7710305a991a6563376049f09993420008753621e4edcc19f96ff669cce61235ee045031dc7c41eb88006b2cf614eaac2355c5122e5b04218831f97ad055e4c6effd68c0222b3ca7fbd62387e795e2ff18b507c8df1f1db9d2e648566ed30da937cae6486030b4b6f4762ea483ae7d4caa5f9ae2deb029fee8205bb8a799866cc9d4b756c3faaa5c3caa20d4cca04d6a38cb804367428880c7a40e54c6428434a329145d82c052e612f91c0f0ca2ca51df746f57cba47eb4e991255ba6d7b5cdf1114bb0ddc309ebe1b94ea66048e2e54e1a54df3327f4cfbec509362e12d346aaefee74404913a0200a27180c7822c333c96148b5596499e8b11bcd67b6554f09be227143b5ffb28e8eec467a39e9b58dcebd4945e63f3b67d743e7a68c8416380c1bfe5155eb3c45c83827ac839586cef185444020477f0a5c741f50142c5760b4c9c6f8796c929c93d5c1b35341c9bade434cebf762b850ec042872f6307d95373a5d3d141d9d1b88751ea3cc766b45819a5ca8069e9dc40fbd78e223d8ea00a173b00a567c97c7384a6749b5ca6a631e47067ab902d9f1fe30250cb5b2ce0f5e823d9ad054084ff02d8ec1f658041b003a63d0ebc61ddc77a4e8bd66455a3a74a4b9405228368e25ac726179685fa7fe9b7170d20bc650b2cfc676a115b6fc63f9ecf953264ffe06786cc3fd283d699a4108a1ce959ed02163edec7ec4266dff00418f089f1e8a7dc27ab3842e1800a8e91027c456704cbbb45ba6e6b495f938792a61324cf8becbdb3908ad63e036e62e48ec23cd2b592f719e404b9db8e6956b0b45934a57c874e88449fbf25320a7f293bb54317ee59a3cf41715e8651d0a060747d905432f5227405fd294ea2e8b5309c5045a1510a6704241e03e7ceb6d83d2b9fc6f8a42b869a9938eb10c5f58e1ce672b4de6a53902994c2290b4a6126c76f59546f64f1bda0c23b6001e2b705f6673a7953fe4bcf19a738ad5f29e3dd655a8f490d81ef7106332c8ba2842745810f88bd5d5b7da38c75a74eef3d417fbabe5379c5cc1d7561dae1af7d29f50e908eb07469353bf546f16e36872b3e3b4705f332179c714d604cd4c13291cf0a5933a39be7c70abd9f1866252122eeac9932a272256e9002c7dac6e83fd058676a12f5c1e850142fc10999d36d754824a9beedaa8488dd8911a516e0b47415c2a97fb6d55c994123f61c2d5e5450f39de8c603acc5ee80d1f1b126c0416c1cf206ff86b7278fdfac6174200517997d5035ae5623badd0ecc0cfc894b64fde85c0a83b324f2612da18c7c5b9206988af36387b4c1e8afbe2130d46d94940d011cf9b4a5f906d8c4039cdf08e1c695e9ad248d1e4352bb9ddff984990067409e1e6a9262c96a3f9e111bc1e2bf2eb5b9716ca964ff916c77eaed02ebade37794c4e5663a19d7652f5370653bde10aed771d455f5ec5fb9551e4135785b9f074682a8c3fb4b30bdd7c6f0ea43b751833eb9255c3a4096b27dede98a277de780a38b06754c293964e17d4bc1b1cccda2071227a839b6de36b4009cc430d52710a4c254f1d19d8e5bf4245b6a79bc24d11edff32b464af5411c78099c06d2dccf1a4752cba49637d14df7df0279121327ff6502731b34bbf420b5ec689e109265d2d1fd22cda46730a59ab78eefbb3d17386bfb0a4bbd7b55704364f882c6eb858ac5b9c52e9cd04acfa316d30cad5cc4b1ea9a4c95ee5d8e856f68a4af840172dc837ddcda6d11dfa9adcc471d56430eda383f4cedba74b538a01dcb63964d89dac205d7a26d50cc7e32a87759bdf4a7bd7b14926ea5f69e48ca7e91ba99fc4ae56302d9c6657280dd414edd6a8fc1e83c2cb30ac985394256ab54ae200b5bc95942dbe5e5ee589510c1613bfd0be60ac75bf8e0bae1f6971c39e3b85751140e279df435f13dba61b49a9a638d9e5efc7b83ab52c211e1fffa3050a02225d81c0c14dd9322eefda7c5d594c76d965610f68fbb031d15a53e3b6fa141ade4f9e2c023e25d6ed60c", "53ac6a6a", 0, 1334811215, 1537743641, "bf7ae9b757944a784e248d57221ac773acbe457b5c166d2952610e4d8e955ee7"], + ["030000807082c403028dda02a8e06d2568475b4a32bf7e93e87a75d9a65e895e909f75c66b8d1444070200000001acffffffff530f3b310f25d04599c310b6146e395154537e5c65c12b128a4d38e985f0284e0000000003536a52a9e7e9f6010af9f7030000000004530065007c517f7a00000000021b98be050000000000000000000000001fb37b9ed63b4ff19a1c16d60865c69313dafb6bb31f77a2bd5deefac16a8fb3bdc3104924393ba53f3b529d2db16c1ead9e30d45b1c43a020a55581cd91d6572dd927bbfd018f6a8da1895c5139b52cc1b055b9928871bf279c19ac549c40cc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070da99d2623f9a10295a5fcaf2e71112663d9c21516b884b7cab9a9ff4123bd4888b7f9c45f5429db02694b3f8076f8969a2d7648c56436ecbf685f7f931a99d56678cf25014ee761878b6b3d606cc994214150fe8526410a8671cc970f188694ebe21d32b039c0eff67a69a2de9609a478ecc7e86cf8c55f34b2ff2525972cc021ecd6164d3e9a199d05f0095a2c774a09724b9466f366821204bbf5e4b7622e8022ecbd93621cbc481ccecb1642a29e20692bd4b235f6095e227d99e8354c9d5010a07cea20ce202c242af7fbcb7f57c385a39dc522139a57a99310e3b3818ffb03899743b1aad5928a073e115957638e5254c1dd2d64444ece6386127a964e5fc60032ad6d796a1019f079898130f224a6da8962212a106775f8376725f8a740c369d030a8ab881cd1549ea3ff9de071002552d1843ee0dd01ff242b3c281204654c1f20203474221d8e6197cc6074652a12b0c659615bea82ad2547751cf00200c0e92150303640b3c6931432772ca1498ee39faf7df9e88bdb6692fda57ff1921c5256457022bc22fc515e0153b2af6f580939f3b4b8c6c033888843817cfc5dc590c528acde14a54ad997069456224473848666fb83d706e4e540a510664a601abe61db49fe0bf097ffb8423528f751de7e9f4e658eedca303dd5fa96002daa6ae0783af7b9b6398be09c9aeccc1f4157b3bf83069b945cb4b3de6001b0b8069dee3e25bdd79dbb597bfebe0e7c934f1b972938f7f96df2bed8fd67b5c18c4606da6cfb4de3210ad5df292f83458154dcb6b1464a115e447ee47d30cafac6b30ecc827632f3b56fb9d042c2a7204b5e6e90c223557b58c3aecc76603bebb7918975ae1a46ee84e87f27e803ebd95a0d7e78a0aeb12154a158da360006ad84c36869f0c66e5383f830189e2766f68adf6ef9418e37d58cab4897237453983f2ee60e76ecc6571ce4c5fe3ac6577f59b14e1093c94de180dc6220887c0d7e5781180c9a8121e2006318c4d915f79ded5e4afa5550a2bdd7f300059ec230fb6f232d464b7ffa86f018444017a2117844a05dbbe13bb2f1019ded5025651888ddce9fd9c97b41aeeafd043c8184277512eb9193baa185be6337fa59f41124c56b8b61045d5c409ad892d6a19474134ab8ecfc5c3984b4c0b690eff83b098ef16339d39b9c385acb65d53800e187903b0cff2a690eb6509c0879de87716fd2896582373626377d54dd5c627c929d9d7d730ad6f7778d2f4b5b39817f582a7362d03490d05c7557760cb7c9ae120a5825c444a6fb7dca95a11c6fab5bb871becf8f995dcbdbce50cdaf9e6cd82d6e7b0949b9d0a02cb53c5dd7264c12db982c57eb61537e902683b9b8d72424e6885669094f5d8b317bf8f25a3508733291a90aaf804024761641b50a10bf7db4d4763114ec42c0bc23b08eda1d7b52331b1cb305d9439adf8e056a0b9eecc6a894474886ab3dc3719a779f50d9b9242705f9e9bd11ed54c91aed3c34270bf34496ab3ab186495ab11c693ab992031b4ce5b18800e99d1e306e65700edc1b5f597a743351fccd8bef2f07a3037d412f85d06dd6133c6c67fd13fec29f1507d51ebef831ac61619fd496fee599fb3a7ebafa784fb74fcbf012c6a7dde9295af8ded787584f8c9a3abd0b1a5084d540f54017546fc77bdf94c3fdf4500efbd73367964031ce63d1a9661aa1f797cc23e52f173da83594725e267cec9b323d075f5332adde6043284005125e3119fc0466f58ad53aaf15ce8510e5b006557665ff9b402fa82a594dc0f8c46a33cd40234657660a7edad1bda32f7625c2a9ffc55a097ac7047dbfa62cbd48f816f3b8b59984416bab873ba35b7e81ca0afdf1cfa8c8860ed50d33dd87ffeb6a0052ba78854e7bf39ead4a461543c4a17528a4807875e3d4ea82ee60154d5b2b79c1ece907755a3fcf2f24097e6d9429221b0eb6e2e02472786ec0ba732d0ad241056276bbd49f6ae873a674d16b513ec662c1d5be253fd20b389cd50d9ea090094d4fdace080ca1c33269b820f29637c45edefa85d685d92bafa337ff3ef4e09951bd8b47903cb26ad2ecaafdf6957912762ec307e10f9774f5d97f39824ff2e9f1b730c3474392e4bdb8edd10e0926d62b49997ae2e16f9cf272514ba0418e7952f392f00e07c08d06fa23adea5359c283bde5b0c5f50e6f30cb6abf7f5820157e2da5b6e95742836524da496445aa5d59020b573def9e29c82158825baf21177ca525b5312150dce380a06658e2ddd25266ced0440a58878ae66716e36f59c07120000000000000000c1a5e60200000000339f91246772eef35f36b9f2e8efce16deea8c5c1b784b6724d3cea6be1bc14376a4c362dd55226307bbed325a985a87706ae42e1354db446066a5f45d01de0f4294a88ebc6c3d9288b8297c53779c3d8f0372780ea3456405e0d385561f13fe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016d8f37d2eb5d8a1c94d085fc9706192f8aa2db22e35aa70853a7b97da1a8c96e96dde32d66218c40566b175fa6f5af165252150dd6cc1082330b66d73f222d5c5ba45d1a9e6eae467dba32860ba03d688568c9503acd811c4655b7893e3fcc5e1c682fa6e17741c897b8de0d307d16a9863282a988ad275e2e3f458afcd80b80318dba821cdefa8283c5d81956e947b523be89b1529cd0751367000772aef78f20303c8c3aa8aa70ce5c619fcd6c626f202112ba77e3b36c8f0d4b1e2d83c0fbbb30b03328abe137dc3537e1d9ad94d13fa8b5f06769548e4f5601f57743e875ac54beaeb3d7e38ab6cbd7dd787b9468e28d7ea798ece58be15d1f5b357917ce3e293031f295c170f6cfa785847069e69883af985e960ff606739db6a1cec5a50af46ea0322d799b086386e0c0eb4e2fa2c8f7b39f34df3ef76e7ba420ab3c1ab8733a737021510b1712d23038bd3d11256f38f38c4b5b978a5fef8cf67adc82fff8d8a48730307b59c94234dfc5b775d27d5dcfe180bb9e6e57d8c58564b4299a0a9044f89c302132b659e7df5d2718c8f6f8afe2073fcc560f1511fd4fac0855cb77f2f53038c81c54aa6ac3e9b543e6d49cd23e09192bc5aed33767d901907e08ad82c4e894c72c856f880de5f42e85af3f266b0e63ccda495d2fb0ab34e1327e1bffd16e9da611792578fdf69e31149f7768628a3e37405011da5aba6038ee90466180982832bfc5b524135b542318ec3057238f3781c22a5f73c637b8dfa36e9ba69cb60381c7542d48108bcf9c594899fb68bada039c2c90ca08b6a3e037a158b61eceb28daafda9ad98047d90a4ce3e2589df49954d25ef464d6e98841432909cc9d60d8f2d9f98ce4144de216dce99b7b167e863fe2645fc2c26ca47a6bb113ca3477e0222399ad16bb8be281e71b36ae1b4dc69f584595ddb0d896f6471d6a16f8f7788136ba7590ff3cb1fcffbb845b4127813a29a8a8533839fd9903e816a9a891104aab0d99cd13fedb80e57e79dba89a2cac425346fc58ea2a1ff9b533a2abce618a11917fef3981c95ee0ce1dcc3937f5037b92f9d2acc60f5a42c911827c5394ce6621886302a7e2158c1cfbec8c593b9d59d035e4a0bcf0b89f12cde89e57f7b58f4fe898b87b7377bcc75507304d993b7a40b05396c9f30df4701323de2ad8d1bdbfd1172dab439b4f9557f4d36b973889cea2bf7b7d1b3c1e1274d1a1ff87e9c0ed2929837ad729e72f19810a0a6c7017f9ade9de0d21391a5ec2a4d95cbbbaf03f22160efa6c8067c615cd0137bfbec7e6c96111d83a14616afd76cba1e330044431332deeb404fb30693bd5318418f35fe58c48d4f6168d2da1988597399fdbef839af2421098d04ff04ebc259227e2eb0a1fe5a6fc28a0005d6db7c56e0cb6480ba4fe685bce36ae6dad7b645754427320d4e8193f65d207d65378eac07dcd4a92bb485e6c7da19f14e30c417178cb28053802a448e9bc9b7b33fabc8363eba1d182c56cc9c97cdd8814138689a6f82b15fb7e3bdc941577009f7b20abdd13caae19eb668292c591e749dadf24c97d47fdefa52b9f95d95603035d8093395053faefd738994bd1dd567e81a801d45679ff5d7c8ac99a02ebe0f87a3be58a5b208c8372e1be41f5933260e6615de137e61b390fc35fab8f7bd5d022aac5a16470fc53435c977af939283606f5c18008cb5d675cd6680c3c9f2b8e3917959273ba00a0a565f4c832bd0112da7f32a7203831df9d8fa31bca278885f222430ac11afba848dd01a3293929c75163ba15bf0cb40d634936f714435fff39b74fa8f74557242a1fb9d487d2c18faa8bce7d3ec884ef4355a3a19131e604857779e9e45f372ea813d684bdd822842fad8856f25141f08274a090fd55e80b345d6ed254371f993c37cfe75c8ac6122e8efd7ff3583ee0a123dae97ec3a8c7f611ef8f90f99b9082744625a705f61978f90bad2601e7e1e62587001c4430bbc7066c12e979e92541b77c645c51cc6d0ba395c2e829995e9c7f30dfcf862685aedc9961cb078a99246fd6d51dd93fac8acc8e00d0589fbba9fbee1eb7f4bf7a8811745afe0e88a02705c9a492bc9760a24e035a105e13f770c7a76c919167214108a153189e185bb5458c21b2f48f38db8f490c929715df4bec942ec49d8e6376f0a569fb655604cfb5b02bb3d4c0f90bada9e5d1e2205f6d3046ae2bdb7969ae0c6d7f4c1483e68af4d73334e70b37a073fe918245757e143d120c21858dc4274efa80b362e67a5416e405603bac63a1d3f81afe18801b280605d3b6be7f1ea08435235563ea4987b8b83c85f719d8e2e671307bc1aae735479214d9e7da974b9f461b8380bff8060b195d79df5fe61b7dc1f14c2548182795a79f9985c6b5a8a8aa2a2f392f8fbf7ed7b138499310e5eab9ce08", "536a", 1, 619680087, 0, "e4967e2ecc1e0ff0c98e56d772d5a3e7fb2fcfe6e03f092d1d96905c86b0f29d"], + ["030000807082c40303501208f0913c52d8f8897a05aa92767000ae29188bb49e502034896e436f1c5902000000036a636affffffffb0c1adc73af49b20a6b9125bea685b441cef0dee99938beb33ba30d704b72dc10200000001632cb5429005c912c377c9b90babd6370055292549cb55f24d19a577dfdea58502cd2e143a020000000352ac65ffffffff027772cd040000000001ac83723e0300000000056a63ac630000000000e1b9c8b800", "0000ac636500", 2, -1658692678, 0, "798649c5223666573a7b7aa2e2d49756ca2526a84bf2b05cf3f0ed254c201233"], + ["030000807082c40303ad4d794407cfe76f61a39b6a97d344afbdc027564f4cec24407c630485d012990000000000ffffffffa93eeff131489d98ef48565707616cae7ffc2d4077493a572a4cda1a83e0e7e700000000076552526a526565ffffffff0e6993e10532e1d28d1904d72b7dda6b3cba596ab9498da2d9a18ad00d9e4f020200000003ac5100ffffffff04d8b25e05000000000352ac6a67271b010000000007ac6a51636a6553c74aca000000000003656551e4a2460100000000045351656a000000006f8566d6010000000000000000a9c1860300000000ce6fe01e696e83e96a69f2daa6807b0844368a59056812a9712c39e5894ff38ded0ba5d650a3bb776dd3a1fb3eb603c5bf4dba5a3acf617f67518e5fb66ea20515f7a712fd80896e1c6cd70b121a6eeb689dbb02d7de79a5d1029e3b32805648000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006fe84a8db9a06c0ed439e322489c715cc1272dbb0ae10649e8ccdd17d2160ff35c98f91ccd53def83be42c54b83d607b392e82ac22653baa70f32bb454b4d9df7f0bcef7ef71cbd947765261aea8f6c4ff25b4b26cfa41fac92d1351ef4e93fa5414c383de48a18b721918f8eb28dcb28e62ae88d26e676b98cd2fef64bccf200217a297fb4da733bbc6e7cca177345fecb303f99c122bbd5ccec548cd0086c0fa0208c7a4aa0738e88919723e6ff50937073fc73b2c16bbdc8ef4eb13285e9fe5520b0815676e4302fd2073a0659186eb01e1240102ecc19909f2362484825c4b76a6666436cbbfbe145b5efbdf353cf2c97e6c97171b9bf45f337ab88b1706bd48ef02118ac575c4226e9cbc7475d96a68154fc3def07019c640b26a8b31476e90ccce0312430f6beac0eecf8ca8b284d1beb03753b5d17ffcedf433b1fda339785c7bf9032546fe29c6497f2674e4695fadaa5a0a1894f92fce75d8fd40655409f4e65d7e0323bd0bf2d28e8ce84e2733425d9bb3a4057f9458aa5999f3a2dd8b3b3189160b021db5598afd2f4dfb0c39eb166dd41b31857b9aa6e7782ce8b42d6bf03725f54cf8d420c14465b6c3cc6d61afcfede4f84236022511d39887d1066354cd9fc9315a41b38fd384811d7e61803bb22cfed859f6e4ba4f394a96939c127074095b517aab4f28f12fb760aa9020854bce54f9aa46aa6824f38d655a58883af3387db5d4a055920a814f340aa80ca37f342b734752b8ca817e237dc96e928e8c13bf8d978ed518c312454ac4e02ef86dfc01a5929f6e50542cf3bb092063e2dcef32213b562eac2873709f121cd8f2dcba9ac79da14c253a40585ce50fbfe7ea2e351f5507faf57f2d581b5bb8cb010c4a27cd3502586a7fd649067b133a741d8b882b661de23780df279bb76abc170a67865f84b37fdfa04e79d8447a7c71056d3bb301ec7a05f2deb526279f56ea5537c7dd6fd12c6e6491089a956243507571d26f631b98bdb7ddc126090452cbc7bb3311b3c94fdefceeb1f9d6801f34c9fabcbc1a6f4a7a959f4ef2cc499defa5e4caed68cff1da65ab58bc4c78b5f42b8d9a0618759d8c4c2fbc2a5a56cf7c21e0b31263eefe29fa91be6a683181fda2235b235a039e7ca46d802f5c6298ac928908009b6e3f8772ed0e3eab2c1d2d73dc3038d927f0a720a2035d9869e34395053c95137737301a5c74b6a91e5c36c70e528e646e541d15b2217dec532fda07798c987eebb8f7a056ca3e9940a09a1586fd558b235c3d20bc7cdc468a2b7c8d22c6a0de399e25da53b188b0c10f1158058de99d9a59eff54ccb58260c501c21e567eae57f77ce5015867c5744e4408ac041bc362ad27d2276bbda91f9524e611644e1739b869698b9bc7588de2261865c717c5f3fbb5c34b56b4637648f64e3304de5d35545adce5022b5760c28cafdea6f43e59dd16a9f7498f48c436d43155a3b29358d185bc351568c8eb6da949a5415bddd8361310f11e8ebc4ae04ad8bd2bd6330c04abde1ecbfa5cb983c3a86207a928e739c9daf5fbe74676d85d997a0d41e5ba25c5b2e5ada0b898ee1f0240db67bb40ed3d995ee1dff639a5cd5a90f4a1b3b9d7d22a40d6085cd87a9e9c6913e50bffffd088cae2efc42007eeb98fde21d5a62eb1fa6d1dd9922be4504aa7eb1b9526704f4b10dac221a8cf64af5409daddca854d6ca3740623d88cdc829d2910521d5f2ce59eccc048d5497ca174feb8d6f22c9e1c3ea8ed9b78ad1a644d39f937fff4d971460f035c6f9548c6f85a1561820ac5c67e37bd17ca4e90414074a7dd6b949717aa7640bd66befb89858d3a9df73214813eec630a4295fb026f48e025f4d405324459233c4eaad3b0f83426b257f5832efda8230fdc76ee8d01b598e1cb0977a340920ba3c0c164185a7b427cbd76667c0562a6cdc3781fcc42059b8b1867df5e920b7ae4147a1e43ae69007154b462ffe2c4f66b74ce6bd374799e3e547be376fa542d3e360e650a7d57a6d0916a510bdcb616e8882bde3dc72bafe2716b9d7f52be70d28220768c4c328d51fffb5cb231dfd312aa749d97905b8ad0a2725f09c5c14e65804313b50aee9c972709620149793d3c68386028c119bb0e9625f4692ad976f7671b1625a78b7093446616be298f1e7189d87ce94c5c3b88d35a0f7213218c56aa53c30c02b93a701caf303438d9f5dd6dfefb1d534107d07b62a2d2d233b3e34ba7e98e75887a555da8d41c0fd3697eb95ece432a0474a992feb17bb37c8bdb7843711e3ffe1da4924c59b2629ef3c6474e4486b8684fc5fda46ecc49c816045ee6fa63418b2a65cc4bf677a4192d96ccd506574b2494ed74db13d4f6097d07499802c124e5f49d976d62a821e482ef8e660beaa81a066ba5ee17abc3b9c1cbde21bc5d8f8e423b606", "6a6a5265650052", 1, 2140781944, 1537743641, "e84a75c5b99b072396e6f39da123f9120636cb8a4540d3c0c3b6f80b342b74c3"], + ["030000807082c40303daadd539cd7b85a442174ccec34057505c2fa00e35b82d0efe5d9431840f6f8d01000000030065655e1a83ea1e48b85b3f13c64e4be8ee6e638be2ad224208fba77f38606e3698da3e0bab8e020000000900006aac52536a6a5331c0432318be6e3bb6af0d6c531c976368d3921f8f8d0b7b3551cff91858b15eec7a931e03000000076a510053656365bb789590036b48350000000000066aac0053ac51fc01570100000000026aac9a9f3b000000000006536a0000005218324a8900000000020000000000000000c9e8ab0200000000020b1cc78a653a9f169a7078948da2f4da6a95f060ffd3f3a829836085feafa9382e4801094891909fbd030e19134e87b4777533695dfa9f12529ad11ce2aca4f599adc957728fe22cc247fd4e4408d71dad9bde3a303cc94a855c6d427f2eb300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a19e89ca98f1abc7b88dcb8188e1c6831671c520f9597c94cd35df6be00139e7acafbf08b3956cf325d004f084a9984e986cc752c04cf2b7f748167daa0edce9d24cf53c186ce3510a6b7ff3e98ebe5261e558b5c7d6a1263dd03c0824a9d4081fb9235329b520fe0f9a44d967f6196a15dc2978163c2697e4424c361fdd83da022e7031f3bb496a9d50e66fd0a85e36db04b55448d10753dffd952c02a1491b49031721ce86270eb34ea960b5403c6657e545e6cada4abfbd536c7a121d06e881a20b08550121fc3483763c75f30cf16a7024bfb79d2871fb72948eae81aabc7f96bc033f996fceb6aeb35644774dc1edc8679f7de59d72c1caa012115aa6ffcb834402135a75324dbfddafbb49988e7ea18886a2160036046f4a7b06a0ccb189d952eb03011aceaece339b6a6aeaff0a59e0efc2d1ea862a146b17164a5c5a351dd3854f021d7fff0c699bab0ef1d80249b08a71c3b3d9a922716132946dedb638b865e3c5030a6ea6508572308214cff5c2c1cb2c6e0f0226223e07c9226701065030c8a757020dbecd4a0900ef4cad387a29944f14e7d23ce670505ee93e6b28a811f02791c5ccb025e6ae5e457322c8ebc5c997106d720bfb4988a899e57628a5e7e6625753d286a02fb92281158b97c581afa1ac59a4e504c7022726353ad75eb1bd7dd332496c76b8584a30782ce9888616e05a9c74783bd790a7e58cf43cde1d4fa94561098213c2d37a620d288a1ab1fb982ee33721e0f24f9cc3f120746573093ec50456c3688d5575388d3975c36f7d6de6c07145c197173db83a90be9f73b3dc754855f4effff99319308bbd3299a934da3e0c49573c26e007bd0071efd41ff645fb324241002c1f3d9562f9ba309ef4bf3f0217174fb95d1fab9239184fffac1c33177e6623c5026ca533dfc2a65188f8051161632e0a7e1a9562f8ced497e565b3bbfd72bdd5530414a63a59cf873a6872473c26e2af035f7ef8c349a8719fd59a848ed0e1d3f89b8b33b942ddf8de49a6d17f17778d9c444be1129f9f3f422d98e4d1be5776b85a0404cfb38b333a14e9f71f3ad153f7738de2ecad56b641ad55b5230fd72854d2a79f8b320b7938646e726d59015171c68748cd3b7ad9f8b48de59adec48fb5fcd1f5db6798969583b45dde16c3e4295ecb05be82e3304849ecfb18e6239857ad9f8801c4646a0dab410e571fd47cbfa25de3491ba0501bcbf3ddb986e21380a251d7c469982318ad5cb1fef7ad0ef1c6ae9a2ad476d8b29b1d0cdf254e2ae9dd09efaab2a0d50af390c381c6cbe90d3a5a3a2be278076d42e678294ee0f1a42cf9f98fa30beadf8f955d2e45776c709ad0a49a68456b2f12f4805397884bffe3349dfaa1026be4be791ad3258e9135e7ed5bf77f425b7a8f10825c044272525995faf895165a789da7cbb5b31a055ddd6a22f03aff61881d73a4c199eef094b1377f81d9e66d739f532ebfedf711ae2e80161b582699b33b6475a060ae997fe061862a808a86d13bf1a6deb916bb877183574ce80597ecd624e87c3b439c2c8b4d3c52308c69d3bb496cdbff6ebdfd22b98599f6c94a800d8c815ea29e45ae69f637c6c3f756d29e4aa05b61714096c59ec1dc3e69a7517c614adf253516bfcc5906331be3b1b74f111ac85e535e23c90f9ed25b3451487bda0d5de45faa1995d457570e044b91dc5051fdab79b9df7b870df76e3a406fe55dc6a0028a33ac7ea026c7ac6a895c0c04aca307a2f81824ae1568e51aad09331879241d5062a6697c5d474728731b7ecbc169a36eb6d2f8d92823c909629980150236e4233e3f1701e72f5ad15e05dc83cf53db26c18397fad94a913d244f7f043d7578dc7cea13b19a36468e7700ede3f5297e6190d8bbc642531b0dca47f8e359fbc2695abcb75fee6165cd7a6fa138bbd9f4eaad35fd4bf450deebfee6d7643a1d8cef7556d2c7e3ef256d46c195111f7ec8dc32fc1a6342e245a24fe591c1901b19a93775257f8de21d30b9ffb47dee6c5fb4c24002bdd60f972b388a5a31328291312a85b9670e84db8cdd14321a544e6a54954861dbbd0bd3a4bae73d3f6188c71213b6619123735eb449320163c7c76be135ec215d226ab83c9cc2e966e2ebedbc9e970c5b6fd5941b2900c5c8151fdf2843e590a447016791f4257950670b0a0e7bad0493de4892b1a6d2b1cfe99657165291223ae45e8e39f6f7ad14aec467cd138be8d7a747cbfa424974722e256ac9cebc535d648dcbd3c717118b968cf4f0a38b979ff33c931db672a1974830c3d52202000000000000000000000000eade47ee508d6880247dedbeabd59297399d87d31b9234ca241a6a007f561af9a5a63438eeadd55132ac1f15ac76d4deb95f485eb4ad587394d22cc3a7624425bffa1345d3bd86a635ed87d4b66f5116e437dc6c797732d292e2774fc9443342000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b44eb14a0a005400ec83124c91d4400b3272fe43787d52e09e02d284dd2e2a915b3ee13660d4be092012767dc728ecfb82fceb439a15968bdcf3d40a21c6eec232f8c69ee76ed0d4de0530a8195fcbfc337a721364d49ca53c62d0e74fd6c3008212821231256d8a2f5d5eb4beec31dc61b230a39f4ae5f787ce48a7bcc2b280222bb7d09506ebbb4865d48042370710507d8b0977c06f294b9416c873d3e0114031599ff7ad8fa8acfe1b44772f8fa741dac40c24ed5fba57c153bf231552077140a009de59a8283de742b671d0433442729db17dde64cddf11979d23e96158fac09c15d0ab84d215679c7ebe4dbfd9b1c9a6d17bb4b1e85f73ecb36fcdf4cc2c49a030a69106bf527d88c0ecacae60d520f332cf564e088094c97c17a75d0ce0b80780327c88bbd0fe07d7cd9906ae554d8e776d1fcbe00a66af15516be51408b2d575702073a7f0d2d4e2343f7c55da5902999b679ac5c8fb9665530824ae361939c3640020a836dc8601a8634bb6bc3decab386610d31d37273bdd5150beb7ac6dd4bbfa9031905785437d1f19b2366b14f9492a1315b995c26a2c3076bb1a8b5fa6ea313997af6edf00992fc119e66d83250af3ed050874cd770360cb6290c36fc307593502991eaa6ba93c67f3af603ccc7c3215d9f9a60b7a93dbec16004953d720e9a6fa958fc8bae8746ea4decacf3148eb35bf5116d7af6b75299c745760a4ebb4b4c006828950c10f4fc489a133058cd87c009e24db6954c217d44cb4bafbef91ca62d486eeb6ceaff0df71c4ea4a311e9d77d96d91c5f37c86bf19c87e7ab8bc5e8cb3aa2c1cc31e74e67d1f170ac8863f1143ab2c515479c4fae53f18b3893746ec4d7692c7f56d80b26abfc2425889b43851a2549fea6d8b98b7e68d8e4fe7544cd7e5ebf878b90afe605fdcac043ae082154343fae1842c48cfb7576ce809db2218431d978f2a4ed7b1167afb52fc8988500e1e78fb03cb307a2ac161b5634b8d445bd1b1ffb3d1739f3479ac59e10566183746cf4dd2342c5c8267364abcd461c2340febea986ce5c2548a323cdd0c633300b155192dabbdfac84787aae77c46630bf2cd0ec342ce86cd11fc2c9ee294a793aecbfbf0aca1e529f8f9b8478231f740b994952951cd5f81fe181e4e750a969e041353ce24bc62b94e811384376f009e84295b8b10e2a0a2e87e065c1f8e3530aa248a0a2c7e76fb234c2f90128df597543b12daff81bb695d0e724686902a3c9a4a05996af3999bdfdbb715c7cf509d11d2ece09209efd9c053755340f3d30280afc66582042e7c296d378a9cb5219fc123c5d99c81e9bab9d3f92721c9fc063e5b86200c64723d37dfab14641ab83956c41c77ffc359fc9e9f913c8eaae22b47454771e60fd96d95d40b12b50fe1942350ed57ec3a089016ce4c3d79cac4841409fefaeef5b99e75c98baa904930401ae995b29c82d807986ea80825371add98795ac35f6dcfac3c334f8d741e799be28f9b8962ed714f8d016c3a4594d089c312f9f73b6a52ae4032cec2db28c6d0fb4f8c46023fea4a20f6f64921fc23dc87b28486a31bb4a31da42fe530dbec87d47035e7fb1cec0f98b64d19a85260e27c6bfb5a1de18705a2ab96d29164818fa141759b5b83f71aea3c2b55631387e93a35762e7de6842f2bda2835260502ed2a93d6dcdc014b9da9e47bcf5aa2c8d1162b9b5f4f1f26e880b462aacae47e6bc71354e19f1e7d519957c0df13466246ea8c944243971ecb1c5bf040ef962a24d91f54ba300448b1d07ad639d27975116252e452de03f564d4ae376a7e373df491bceb38186f99d4eba9109491c2b6d8642a7edd4fa8f8214b53240af36296978940b382d44c94908a4974ef549f9adb793d66cd7a5a08dcad2919784ae63398ca2990036fc41a389ffbbd158e059a8eb41e335ef202f274e7d2b2e9b395e35f19a607ac9d77372445f950d045be7bcdb479351721384e09ced76a23801c86c9499b4e6486ef6ee1217e5bd6a1686964c9cde205dfcdb0c73e4d8668f2cde8b9a94ca6a34903637e4e3f0bc3c2fc3de62f983c66c689226a699c15bdc56bf99d3600bb8dab97c6d4a192cb984ae1a11ca548f48f3178b07e47a74b7045a6cb489b8ddeba12cd13c3d95668384c1bba7ec70ecf7bc094195f5e05c705a64646b05ecc221bf40349f727a1b4275f1468498eb0718e02cdfaec17a90cf935adb5fca48261a93460fbcf515b2481088edde91dbb874a9d6525cdc402768cbe4a06039e14281621444473bde13375380e05e56e82207fb6e02c4bd56b1bbba59b7778707e4799c8a96b42cb92dedd2d51f2461ff7a21fac0306eb162bc7905e21a8aa9b9b0a5ec9cc619496e7fb31f527d06764d9c0228f4dbbbecbc370974dc877c1ff304785cc388e53e4b06ae104cfb03", "63ac650065ac5353", 2, -1904664356, 1537743641, "0b7f1fea7ad223c7ded7e5ee684e8ac5d4cbfe13311cb446e17f5001d9cb2c6d"], + ["030000807082c40302dfadda200b124d8fb50e5239e3db85397c283fb5c0989b06265806693680d8b802000000025353ffffffff5035260b28f52bc52908de6b1c5fc91f2b8dd5bb825d84deab7786e0a4505ed50200000003656a65b37c0b9f049e34fa00000000000400526a630f33bc02000000000865525253ac520051789a5b000000000003636352018c540200000000076a5200006a51ac6cbe7dc10000000002f75b5d03000000000000000000000000032830894bdc639f452031e1a5a83110e94a082a57854672a2eb4df9f4fe1b5526ca91812f4615afcfe875162e4f457132c76f82b85c9e865abd7e3fe54f7b5c93fac22fe96b7e7074a5b261f858f26c67fb0a7eeec145208ad5c7d4eaddbae60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019b291723b7fc6ec60417295c4ddd2729492609ff052d2ec7c39ae297ee2f1be48124b477e36f765a968f4b818dcd85daf8463f6eb4edd17298184e4287aa2a2dda9fed2c9e367d28b27bc15989e1372c3afb5b0f6055dd338714eaa459685b19403b1353ca433b9bc170de80ed302fa1c28e499b9d06d773c6be8d68109748a0218672b22ee5974e729cf5d08714a4edc1ae3ce016f92d0621b5c83fa29def42302070197cb7425c0d76de30b055964366621081c6deff07349c70129ff54ae858b0b02140c138abc35c46c895ffd4d9d130567c0e255821e65065606cd982c10963646f4c21cd1ebb3257ea463728fabf7174570cd6ed2c87d1fa2ee63c58c5eda5702108ea1bf1c72b63786735c3408e4aba9801801e7f33c01aa460c3e8b72eb9b3d031c5661ba3672a67bee85902de58881bd06be2d3a13c677be3f9385aedcf4587a0320f2e79647b06e3743af3f55e9679af2ae81875a1342682e3166c365907f8b88032c822fda877ea2cb3ec80763ba8e3f3bf61887efd04ed8876e3ee276e362bad202279b8eefc16c803e4451454d229e449b0028baeaa5ee12a0b864a10ba5c6f2999e69a187a23b604d8aac987688b81da1c0ab0c5ca358e166983962105dcd9659c45cae9f44227bcaebd3805ea925dccf93949b60721d1dc7bf92f4f6dd99a5e484ec1caddaf17a835b8e574fae21e9a7cc734f6cbe7f40544912a5cba5787429b7efaf79c658c23503be3a1ce274a84f1d3dba3f58b9f9dd3b7d8c652579251fc7177c8370e7da9b3b439bd0958acc988e4ac12f65fa823cdc1e557545206f3d3b778c00de0c34e85dd8b0739232bd3a38c4bf1812b95aca498940dc109b20d15ef357047d64c9143a3060c502abf20d464583c06618394070a673a3696a176241d19c7d1382f497c9f9c233ec05e9b1cf3141286ac351a9e28410b90a3ffcef4da32462a0c98ac4580eb43bda1ff6476676866caa8249aeec26c7dfba15c0eb0fb4769ab4ac918a91c3214d44cad983a5edd72d6b3e3e3b169a1980c6ca771d65653ec8d4d836724c605c5d305de02c99843c90062fdb124f42ea1a08dced9ea976832df772a76b2f06c1708275821ae4ec54fb4792222fb71144f7a0d31504f4f4339ba597ced1967ea7a5d8fc364b5ca83d6769ce924c4669baa71b86c5e7ec809996fa423cd67bfed68a12eefbeddcc599fdb7a959b12fe1e0307c805643cbc2fd1ce6868d1ce9fba08844af0da1dc95dfb3db5466d9fdfcb59461ed3973821438de0b6cfa46de8304602b6fc066aab36a045405f3e7c3631dab62eb59b9ed8f71913b853976d90e8d95b110ea36c3cae5482f5056046ab03cfbccda6fa1825fee5831fd9d94227bda4d91fcd27b5f946d25848bc6044cf6f74a7376da5f26b0a139d701ba738d97cfc2bd6c9940b34efead87625c5859bfc62f8f6b8f39d14f22f75bf27206c0b0bc0fbbfd790e509519b3556e67e4aa1da8cda00ae05ada84a966d95991630a4aceecc5713affde132c4e59d24d16b99d698ea1d365b3033a8dbc43026b3c10315488d04f0b304d051ac46879f3715ed4a75e9790a67950371537d8ccb74ab964792b3bb2b8a627f1b17be913fed43209cfb2c52066109f47e4da7e009489a5be0a4af1eb74a658c8e7a10930c76c0d2d1287611ed730a4275698971088cece134f16a9fa61cd729525e18523b62a5284d725662ccf602857419f3e3b68b125213b010b2c1c5a25b4e8b5475b805797971b871580ded7223c4cd060087c576ce3f66f2eb6fa0e0c4641884046c36e6e9de9bb16068be42f63f792fffd38ee247ce27f3067eb1fab820dd91cecfea91c22c31f1d1916df397bff22226e51f5f639a298558e05b96bc940d49b9bd05948649d676ce39d380e3cb94f96e108812d24daf3dfd28082d1e7070cd218ec021e65083d4577805165c1c1e3b51f6b03e5c2a32448090a28784026aadd36bee2c06b3572098c0ed91564b6c33b66ccd30b1e9efd2693c4c3cf096459f6eda59aae4da90113f4702a20b7a7346e890506af8daa748b2f934bd4fe8e85462855b19b9323fab80bfd997b10f76e7ea8b76837c6adfb58163025df1ca343ea7903f7d46f2524bccfde7228543e1c037fee9eddb0b842b3f375213cc4e90111c30850b2b7c378b158d80eb4f55aad0db0417edac8b72c4be08223ee07d716ee3fa7abd99823824086ac9ca372c8493334d7c09421a4a7ba70872d65496bde2e0abe4efe632275606690dd3804f28b310c323f1e774b2e85a8e6464eee00000000000000008c5d260200000000a7bb33a7368ebd10fd8e1605ad3363481ea9b29797f7eca996f3db710a817c1ded390c3a486bd2a9c81e76cff93cde2fb5b87fe5b99e27b77792ea2070cc6a1c2eda31e0123aaa3ab864787a44239f7f7bd34383b430e281b8991aa9e7226b950000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033ad6aed308828d039f6c8762e8cc9e49013f044aa84192bdef28a4bacdefcc03ed670c25489615ceafe7138a50716cfeab0fdafa4927e77d8ba3b21dd482722190d5f3b02e98515d5891f20db6cc90aeb68028ccf5d039725b2ac83cceed2390eff19a71957920693eea4dd5e7969e68940c9c6540f4b05cf3f287f17a392420323a2043982e3225fde090332666e77bb3be53b28ed9ed33ecd75ba68e353c60d02026b87b7c8e965878b0cb38c4d64ebb723709ab4e4d84e260a14a2dc0c788fe50a01b665f5362c87c7c44963f2259b14af44c49c08f270fed06f2058b9ebcd949d163872873830e9f4d8e13f71e6d7c352718015b749cf58540ae5aa51bb9874da03220991248a5ce3939d490d70d2af4d360302a97fcf63d653de92098b056e2c2e0217d77d255167958e454191aa9128ab045cdebff52309175e0b80d06169f8da67030559331e628ab79595ae9215399110cca58540ef5232668f0fcf66111068ad940316002da357b464c8e028e045041bc9301ed51a4a030c3e15e5427f97797c80730202208ee67f029ff6d8cd820db9cd508c668c78f8136f235694d18ee1e81f52683cda212f5d86a0afa3ba1d49f96e1f8f07c7119577b86b9fc77ceec52322a9bd8747ef23ca0344f9a161eb380108e6cb8eb789f67cc5e627f1ee1fb1c910091e3995388fe0bd2361445352ccd5f5b8f522c8baaeb83a93bac42d3795b0fe93c1d83bbc2e1c83d3892955724b653206a84e9ec3c4bc0113fa84564e2ee423d018aed8fd00345933599d379dbf784487885478ab91aabf56462e7e6dc03b8cda5813a095dc420b72381093e0d0c8c746a96bd2b5734bcd8c8e7721281ca8445687e789e67cf0cbe2b60d37b757289579355629c1e3f3b88b77f761e8139d92984b8e5a757460bbdd157e99038db67fe729510abd5977df6b7cb5514359875b5096742703dcac8fe588148e044964305beab4e789ba152a33dea0f3ef7363443bee686c75065630688dd462ce86b5f30db37663d8d44dd0de1852097d3d48ff45354975be7bd265165a6b9bd1e1d0d8131e939558ca8dcd68f7dbdc269f1b200f90a9bf43121ec54db976591ca797b5324a95011a0036f4c8c7d35a8edbf1df3077d2439ede0dfc6bc3ac1b3d03443704a9cbcce4961df9fe58e3a45aa6d7be6320dd506e609e72e55916ca0dcb93d689b2405adcc2fb1d6910232bd66a33ea09e614b7f5a7943c84da8972f1226caac792268163194ec28f9298b0b4bc3cf10f62784f366d77585a3faaf2c021842459fc2ac71b6e4de7da7379425198b4dc05e80de3da62257119e319e1db59cf17a469fd5f6b88683c3c4f06b45c4db64cb95f763b284f01329597cf46a92cf7eb2b8747010c439c9aad39acd56a7408cf95e1f74e942490736268c7de501eb6c1f34c455868b0e8d712be5fea1bacaac5df073a6d2da66f7f8f413307a2fcde84a62c3df3f9412d1e0e6307370d18d407387c30bea8a7122e672b11f3abc015930b7aee70efcfd01a68f9afa9bb6e291ca8648ecf4aa9063b9257eea1e68565785534d8b83815143948b6e31736a5780115abf7c251610adedc48b12260e8fb3c3d7ebb31d7a2eb1321bc47f936ec4b80a4f4c4302ba4e4cdfa5d37249b098e101c2e79f7b0a2a38268c1792cd1f959d3038e4fcce1642615d816e0faf80e3f3ef66c46f8b724f7cc2f4fda8a32cc22f631929afc0d8e99badcc8488cf358c62601bcf1ae6aa1183ebe48a266f23842751378eea2f762a348accb15706f7cd81201c40fd4201ea575011d3aac5dc061b29b790380cba84b46cb4916ca676e7011ade08950e803b5bf71f632fa37528e6c83beab656b30507a3109496e3fa49f083ce579e357391d49025e061b599661172feb4061aa9f9410cb182d26eb045e4ea654a942cf9003033ed5b34044a915065feb58bf098ec3cc09902136523c174a1310e7c7734dd6eda46c6e7cc5a30763afe706e845b940545d6d10b3e3d3ef3039f02f1c6bfc51b0645ba8c1e1779be6935cdbf48cd904fe5c77334de2a9ac4929d3e8088a475456df77d5ce340b456df0e0d63c0c6db0de07eabb9816c45d854156076ceebdc47fb7aa94e8a03f3c5dd9fa7e928e062403d7c59432b05684f25b4bc755200956ccb00585a98d45ad1355d2f3de153cdab6294fb2fed396a35373195626967a2bfa71f8c3166d7f0347ac7b259496b499b78f10d0007675a8a8909e575efa6029fc0ff22e3db3efe9eaa33eb7cf2b92bd2603d9bf18eba132f678e613e9850baa42324621fb9d8814c0888dd040d3cc654b1ac91f7b5d4e626bdbf4dbd0240cf8b290cbd1a93880b72a02603169ec5f4f27bdd2aea6127a82ce7ef54da748eb9d8e482a9dc744ab62992266c98bb92f647f379cb3b262716159cfb0110c", "ac63535153535251", 0, 643614427, 1537743641, "ab83b6ce29494b0a4301fdc8df1ea517f18d017f3a2c869ed799845a58995a44"], + ["030000807082c403031c25f7a716c21cd50a21178f7329f290ee832f1bf9fdd44adba1461d6ed7b115010000000400ac526affffffff4edec9b5166f0975f19e1b02260374fdf2811364ab589e4c72a603bd1c4b50f401000000026a63ffffffff1989665513a8996beb593f4514c9a7faabff938812604cd522ccea786ecc6ad70300000007635363ac510000ffffffff04067ce403000000000465516a5119f1d30500000000056a51510065a82bde010000000008650051ac5251ac533283ec010000000000bdc2f61d0000000000", "51535363636a", 0, 550879437, 0, "03110aa8a25b55c741e6b1f362e049c82a1a3775e29623abf6d4567b28494fc6"], + ["030000807082c40301a4166fc370b991dc063f5b9ce20a5242d8bf054a7e917a5304081486ad8b573c01000000076a635151acac63ffffffff048f733401000000000453530000a39eac020000000003ac516ac9b84104000000000653655151ac521cef7005000000000000000000f12ff07000", "00535153", 0, -989816332, 0, "763b0a130135916ec827b235e42748f3afc9e33fbce61eca6f8d3c1a85f75c16"], + ["030000807082c403044f1909feccb190d9efa331a3871571b39b6095db7e022cd775c89c7938e15d0a01000000025251ffffffff3b94a3cc80717677aa01f707f76f955b48dd16b440d3473d4ea1d8e2f485769e030000000163ffffffffc80e04197bddc511f3115f6deb086f51ba0b5fd5bb5fba1fb75d516c49a97f930100000000ffffffffde515f6bd9b9f5dfe3ef8bc3b9b59eb7ebf84ece678e2910b13f76c99ce18d9400000000095351526a6363ac5265623fae4d012ddda00000000000000000000004a45dc40100000000000000001ef075010000000063b2896d2cec310a63ab68ee096937e8e4e5c6be09001b1a5109ca45fe96f161ab028bfe99a32abb22c298fd52fab2855f76449334ac7223c4f3ceaa4f8c83e7312b6dd9d3d2f0c3b92d76419b131644ea203fe3c3cceb25947342b5edd6e7270000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004beb9abca9ab67ca8091f17efac686e02fbf6980ccc3d6c8e7a8d231ee346a26623c7db774029ea2ccbe8d1df120be6979994a71d8738e873a8f68d527003567411f8db2ad8b66aac80847d0b275631cf1b36d36b580ab2940559ac5fcfa7d26983a4f2423db1c5c06179e61bd68833b5e467adbd39a78948c48c098a1b93010204381252ece7e0f6094385165d5033ef93f155de4064f3f50f32c42007e0110402286f75cd4094f14c57d975ee9f0a0d9d9e19582da0ccd9016b77aec3905863040a03a5604f6401d702c381b3750fae6c29eb16b54a39ef21c78630e5091de63af2cc561cabf84878adfa200ff9d3390ef1546ec4a97c13d47a571e8030e1544d9a030c5220ab87497747c1b8b20e4c7f319f65100d2a46c9860475d06bafa917f2600301e6322a5a80eaed10e66860849c325e7510fe987341dc2e89bbe8d650535c6a032d0349e4f83110d589b94017fd8fc765d5a039927493b4326c66c6d0726cf6810305d1c5a576a5d08519e770171e31b6fb596505de58c7820890f9b58c26ef6579032d4fab0e24d59d1ebe6fc907c4c626ab0a6d3e1b263a15785f98c97895485f80028625d61a43fd12c46ab959395a7e62f7e7c3c7d102107d2230256c499d702631c050ed6f230c3976a7ae149308abaa0ff2f8aef681f9432a96a190305c35f341b95b9d28cf36b0debc228c1c0100ba0b1521aea2cd330521fb4a4a4d2d6a6e89d2b69addd46d052e38f3fad2650030e08c2aa6e2fdb27a19388190b546435085fe631abd9583e69ce3ea3d80543bff97b771e584463ff6fa828b839f282161d2346fe6b6ea926cc5a70bf0b3d236596728cf907ef3fc52eac651f38d856438d3f4bcce45562ee34569b591f40cc04c0cf654d8a471a4be5d13665da2e6fa75ee14e1967986358ff19546d000d0bb860d3a009e638fcd78429df2f2dcef8858311e1dcac26aaa670aa4364de809dcd29f90a599b257f4c8c5da9878b0401b432b95ae0b6caa0636b4b94cff1a0616249b336662f8eed137538ec5df27532185b5dc07c3d1dda2f0f90f4f937c485acdb7c5ab670084c811522cfbd979a1e11f85a099b66773a9ca6ba3b0d75c0a0afdd77e827dd1cc9b0c89164364ba09d7031a003915d4f376a6216c6f98da0574f743eaa3e6781cb9cf57e1bab813f8bcc16abb3b68b58141ad2cdd5d914461064705549f45ab5380e07e4b4587396e7fe01717c1ef2d827d20d0484e449111352dd5f0a0167ff9ded24ad1766e31840b3ea5e53e4f2b522d89cb749ef6e0e69bbbbf1ce193ba6fe7b746f9103d1727509838c116b72baef8dd6b97e3e3cfe07907800639cc4173816430cc4e412411a7aa2b1f45b5555310e4091889ee20b36c2a0f8d29829f36f372262b3120b220548c8b0121086394b5d0cb8ac0a8191a3508ba811d07f3c00ff27fe4542d1ca27ea7c67cf0c26fd77c3a6bb78c61b05ae5dec9b49b5918aa15423592bf70e1ae3877228de67710e958671902f3ea21a9fc2f35497c11759734dbbee32a1bf640bddfc5b1dbeea9643ab4cae8bf00943940d0ea9300964e5ae8ed5ffd6628d69ddda03d48fa560ef747659e8fdf042913bfe88841e5d2daee65873e279eac6bd617310701bf69054a87a914871e6ff6b69c1f679b379a29e0354a22b8d9297a41eab7e1c45ead3f297681d1826c6ffc97698db228794b186e419722ea0a84118a5126076ba48e3cec21431cb7068461c706329802d5930bc005f5e2f69be406ae4401167a96e2771a798260bf017553e076c0af7535f38c2519915bbb444ef131939da25121f845fbbd219a07363b9d0378674d45d2f4f60500d96d9fd50a5b4edd610b1cde89db28e30c4bb9493ad93f5dc09dcabcfa70510a54acc22cc81bcfa6abbbf83ba463c1d425a8ab1a3d85cb8918e3839b539d28041ef3085b0297bbef8b3e0dae09a0659136f3622d772e89244b2d5c308b430b39633fcf6a59ada701e2ec3ce1a43ca140e573a7e84be290e0e7dd4e1da11fabc372570e3164528b625c86c8658d51ebe44a55811e64cf8b2fb239f5b68f2d4ce43cfab3cb38fb8675f2c6cd93f5634bbb1dbb80fd24de883c2eba1a12d657b6172dd0b23cf9a8a0305e95d4afdbd102193d7b2df549a03ee0a12f64228bf00992747eec36d491b554d0aebde71d01762b63950a570ddfea268d6458dcb7223ed2a5e877a8a88a2a003a4a31a4d59109a39edc553f70c95659cc930112e9fb7341a1248fc43a7ffafa57b0a6e4b6f01597966807af063d9d0a9577ee121d23ad24bac387d4d25d2c1d1e9aaf1677c566afd5dcd2b2a7eb028f4a7186bd8385a65a0c6478aedc04eba103cf1cdca2c96a1d5d07981b5b5dbdf15ad64053517ba1ebbcc3a08caa44b0fba4013333e56556de29baae996f5a3110cb430f", "", 1, 1357491812, 1537743641, "304b2eff05ac62795809836d422f45d5dd5f44f558333d2e44dcd27d221fc84b"], + ["030000807082c403023ddc465e52b25720064b544d7a503e3566b8837169a9b346b4f12e823b48d996010000000951acac52526363525337efdb08f6e0926ad59e96bde77d62ddfde6dcd54d4bea7566bf4190d64d0df57d8be2720000000005526565525295f8c29802b343f904000000000067443400000000000900005252516a6a5365c5b974e124fda0f000", "516a00636300", 0, -841897802, 1537743641, "012e082d7b33a03642b3d8fb8bbf69eec8d17f6c9067d38a1b7b818ab92c48b9"], + ["b078fb7602f8bb1fcc07365001e456ef0386641547bbf15d04ac7c0102927a2163d1bc2022020000000453636565ffffffffe7452a69106e83f009f1c92391724602ad8de34fd959eb93cd7e08ef8bfacb3b0100000009516a6552006a5263ac21b6a6a202935ab3050000000008535165ac636aac6a0a2c32020000000001ac00000000010000000000000000eeabcf04000000002ac496fef8f10da04e68935324e9fa66a5fc8a2c2e42fc3076e6049575862d3b0f8ca7c887987b56d52d75c8114b9d4c1da9e7fcfd9717571f44d1821ea26a962a91a06b23270dcc2303ffc72ab912c94801385653c74e9e88777e9b1cbe9ed100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ec7f112b926b9296a10202c58dadff3ac73374861a7bccf1fad6074dd6b1108b30986061c05329b360f093a950543a68057e97462c906869d8b8575fe6150ccc6b85b5d73833c5763f911493941153f1321b8e7a1fae2d01db5f5e2e20fe06c8c710e7b556e442a9722ef6ec22b44cb310511ad44949e7e1d011386bbe84c993031d54047ef9156c695d9dba8a383ecacfb3b6e1199b3c9b7f38e294260eff20d5021728cb69313d616dcdbd30f8969ce57a056031a982784d64f0f8e723e594895b0a03a1146e6d0aeb17445991a6d5c107cbb1081cb442960ebb97cb56e2b696b2eeeb62ec49df651278e24b420e9271dea3510fd32233b25ea7cb2ece592904a66e030bdc215ce11b6b0af76dc88e9b19712a1872e2b10b0b1fff3fbc63c575847901022a63d72659c36866b5ab1713da84763c9ba1b2a8a1001c7141e32d6d8a7aed28031859485580947bd8baaad49a097847d5ebae9dfa02400ba4eb0feb1aafbb29be030b5259cbd9e7195cc91253b4f6e8f0a4a157f3281e66fadd4ba89b1e3ee27927032ae657095c527d592b77f5ce22566b9f7644d76724c639e04a47e0a385a62ac9bdf3b6cbc5f3eeb8f01cbe343ed9a199a666a8003b875b5706219817dbfada24da4bc8e99e125fa2491a11ab5b6e9c321f309cff3f4f6174d04a6360e542d6aee8ef6ff513cf75bfd9d243ff9158d50f2a6ce3ef6f74eb10f11e07cb83a7d9b42cf51a633cecde2529d9090e900d4cd44f73aaff971406e39b13755cea538ac4f681ce370d5734749aa8d7e837196cb6abbc2eb0357893e72ebb5bc69ecd2c8eb603e294fb7fc2a00dd17ba26cfde778d9ca6e6b77d0565a7bed0a4a14fcbeeb6ceb26b90f7afcd570db188e76c5c76c08f98b6601824a3cf06acd01d687f3799c38e8ff0635605d7164f160d87074e122ee34c77d6a2413c99cccd4737fab8ec9eeee4bf629614865c7ae1d94d114a2041533cfe42e54c2f1327c5b1d6876f211691416cf9b1fdf380d13f283993e0fd23e3ab7906443a6ad459d0a24259946cdef76e2d886b1a75b8c6007e918a4d6f5acfe0832e1fab387e7f98e78204d7c50d703595d6f99db16ab8099bb99a5776d6d4bf55b2d05b0756a159d1eae9f1ef7c798a463c7ac200807f3f4d03248a9141b5fb094331d7640fa6e9015b4bd7c0352cb33dd9d6656b8725fce34d149f2c14bcda12abd2c4285b8d53131f2b7b595e24fc06d27b011f9967a4b56ebb25936e97604f0e55ad7eb56eabdb4ad82a81658f010b7b5cd8e19377a2b809ab552302e6873f12250d12c56b08b3b2f5c487a76b161c01b87a2f7398a44bf93ab39b8b414ea47c43fe5dab5da3be20f7c0d30fd94719ba522a5c709d42a7dfdf9f733f1194fedcf1ca16f05fd0d06bfae81e93a92a9b758caac23f319e918cbc7dd84d9f1f79195b8d6373d5453e59f281e7abe0fa644a7658f4688b23fc9c805756ec96963f7261aec78cd39bce1157d1865df1449643c85749e82d9d7845d2526552d41d8bfb3c5b22c53ec94931a9c357f4235af3aca050bbf7ec184d7afacb7507c8d3ad03c6d69b3b66207ecaf47ebdec9791cd6ea9c708fb22c5ab7f345f86da5c1a268bccdb1f9e88957c6a0e1f169aa283855ff05a42d1c81f11a7519352352e9e787d5dbc17b1052e4ce84c34580dca5600ce0a04e186128e28c888c66ad61c369d466511a424cdd7236c5b54af58b1470fb96dbaa3caed881ba30cf5d0104d5d71b9b0ec5d47e664b0034bbad508f542f44d630881df4d659cb37118b0f771b58d64236f9926c9ebfe760d54fe324b8129a3a242dc58773f08cad531c212721b0de0a9b44a3845744e8ae05312c01966cbe2116558221c7078390f3b0945109e6a31b6c167889fb288e9e7221c4fd5f15db9814dcec66f3d3713a86959b6d86ac613a3b787b42edfe2209d30fb65dc398889412dc67ed73efa3e792cc199a226bb45e9acb40f3b58fe9bd737135fded502df2d3a821ce539f5f041f64af06e6dc4fbcf695cf041701a8b8a6961c806a6708d10cf602b5a4b619bff23fb58576e88582b03582b79073af1247c537ced861c3a928bdd7cc10d6443bdfa0555e180b9d0b2403f7bd1770855637281db7a365774a66beb11c23b39afc013c9b86cba9fcc1f5432baf708e89068255bae35372589eeff43c558145e2572f8df0ccc63c24bb324784774d959d3f6a99659c43100ee71c5c599a0e2484a88126eabe556ee39ade18377301681328a380ce8d9787c0d4217b12dc7cb4d680f107090b48e9748d81a1773af742673b56573a0032493c2e96a64cefb15ed88ada36c331cb68b4d2b9e273bbd3f2fc539e75cca9628ddbd89c875fe23c26f3bc24e7097ac2db0257cd13db23bc87cc81496a15e4f87d0919a339e56cc5c07958776daf0a", "6a6565ac5352", 1, -737953323, 1537743641, "172a6e2e34ecdafc669cdc123bfce7fc4906e3b2b7d3ffa6b5aa703dcf754612"], + ["030000807082c40303aab1bc9d4718c5aba01b77806c299727c0c277e4b350914c5689166a8f33cba30100000000ffffffff5c2a5034ce23f34b2485da4cdf4181ae97cabd949627e5785b17a8699f252d180000000004ac515300ffffffff99d6d5fd41de78bc892e21f389afc2a754b847ac738ff8de39c6750f4b923587000000000463636a52ffffffff0497c741050000000001acc5482c0400000000086a0052656a63535294e385030000000003516a53758ca404000000000163b1012f1000000000026f94ef0400000000000000000000000098531f9ab32f2d89781859c2c15e29104083ad43b2ed2a08727c1f9397ab95aa298f05eaa229603df4081192db42e0db7a1013853ae0e5ce9e5c5118acdc98d82ea2665e130c12387bbc4a2605a767f5319f9973deed27b28610bbe906323e4f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002dc76465cef39a16844151e5ce2cfb8594e61c8dd38d30ade0b07cdfee09d8b0afc917560e6b6d6373e60802f56ac32ad81c717e5ae62fadb7351537ca50a04c561e71e71b46bc0c8f1ffc30a7b432978de15b7f4d3797eff07e53549ce0f9ec0c9c9c37ee590c91b7b1f5ec1b6c6fd2f727cb3fb309144e84da10e82437cdbc022445988cef85d68d52b1df4cb378d7a6fbf87387ea5c02d9e632b458ab9f0bb003164e0a9cbbb0ee533a703e8ca13beceb9dee80970249c8c2d84635b9eb034be90a01c07c65c4a781a6e6b8eccf393fb7824f7181a0ad828cef8655034748d37e49153c1f54655b284b7ea729a788979a54feac622ae00227da94d1cc15a36af2f9032ebe53a167e2324f985b5df4d6b989c01e9695cfe165b216bfa5b1f694725bf2020068563a64687e58b8fdc8479fedf3d4a6d1725d4d225ef6bc9f053f13dc3fe902096f0f0a03c42eec9280bbbde4e4e9059089b39a1600d901f72b60038a853248030f19782580f7ba4a97cf151ac16bb0bca78a9629893c72085e1d54b5ddd0127002032f5363f34d836532364e94a00b1e75015cfbe9da23367f784a9858de3c567049bffeddeaf312787740d3d9cfb567bfc1c0fbc637c232a2271a333a42f476e392d8da20e4749c4cb1121fc7e4e45c3271e8eae31f2a454839444e8283eb917192bf23fc17f15f14680537ed978fff2166b61fc040ea15cb96e1d6267428cdbb651ecbaf5b348df1d4fc36831a868c78b5ccb58d45f67f7151f44fc0454e0f06a28cf755c806415d2fad53b5e30aba2d8e41bd22df9836e5120c59ef0efc069dc89fbb5f73957a02464dc38e8c9985d0a8a0b4714f1ae19cd00914747726b55479f4bcce79bded788378f8d376867d9112c9060c6491a003baaa2b6c24aca46c021619353fcebee1e36725390c3e203e0f6ffa0719e7cd936a1eacd7028a3a9f97729a6d743bbfbcbb0f8449f8dd91d025d699beb699a18b99f71f2ed22ef9e4807dc027dcbcfea200fd514f16f8a07a478377612d24265a64d962c3a523eb5902ee6c510a96ef56a48a831498304265e3a1a1a118b663a7295709f3e84989e90af138f6a5b162f64e338d91d61b91e21a3acb430b04734ce589be3b1be6a2885c169f404d1d272f06c9bf8f83015d1ec9aa7ac2793b9aa8d511d43531ebc81c8e6dc449170ef5f198e87a34a5a0df4cebca5d6ad6536a9f19bd0ea44ab246529c712f4d5db0980adc11480abd39d5e58f78bc428b986992d7a424b0e925f4f66ea2f916b11f53dc467b38fc3aade40e2f6c5150d19b7d9cf6dd57810d94d6a6c584c13ad10113e706950d76b03697491e5e5bca1c0d599a947211a1248d52fd3b417fb75e345bccd2efc29ae280516053e6e900a5f161326682cc0de4a2ad618a5a269f30d1105e3619b724a079879f4ccf5e244c917cfdaa63ae7d40eb967510ec799d971a93d967074c1de33889533ecaa8b5ce8cfe61a5de7d2ab6d06bbf28408996f88a9f700ad297d27ef813ce402f5c3ab40fc9e4ee8e51e49b6bd0079c26cb6f1ead1d3ac264a96aa45aaf47070c4b4f7962e9b3b1803e04aa0edfa0e6e5af4b1efb941864dcaea8f0d4b0e749a28faaa4d94fb1a412390d6e984855ddc414408d7458ba12c005ef87abcaaf33523a9b24612313d5c6bc8d18931218b1c4b1132820b9eb02b279079a15470aa43f42dacfc308cf9f83278b995efbca1b621cba5662a9b168701dd3839dfaef803cf2552b0f1457c483177b5cf1b6f28854ff59846bfc9dabfb32e3b0d466ae655ba2c68d89ccfaea2062fb0f9e7fc64119f8863f83108a6bfa2385b2d40b507d80e4465c54a717a8cfbfd9854a5dc2f70cdbf297f2eeb73e56fca2ceb6b9b79503954f33964bcf416bd2fd1ac52ab96ce9e7991a1e6ecd4c564549f4be315c4bc49be1b17df1f2fe1b28d97fed3cbfae92c8737f9d200e0ce28a9eb5bfa48f7b39da2b3d457c1bf25e0e477ccec283d5d877bcad6081594c44fc38e0981ca03368ebfe80f2d9355ff6a513befc05149f4eeccd07de83b851cd56ab555194d75958f5c10c4f5de4b3c2b5f4849ccf8b2d6e26492a9bdc8009bba7ab2b85472978d34f31a2a1a9a9e28092473c8b282145457dd69a8927b49a3258e2377cde2397ae9e7bac6f9522b096c1990eb1a7a9a1c38e552510e8a53804565077a4c3776c8520414ea4d8d482eb74b86df05ccb622f25557618eec3cf78e713671a19b7e0281ca76b77a83b393993ecee69b9154b48ebb5b90a7313b4b9cce9af9b24dcfbdac04de204000000000000000000000000c0fad6d22589d9302125b8e932d6cb0a972635122cbe64ec14fc2f20bc7abef28f3b389a57205f73215c94e1c749848bdc29b3603ca48cf1323cc332c2bb39d5cce61817b43f56d7daef648ced1ba648d06462ed5285d26f7d89f18ee08c95d400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bc5eb20b1da56b39c37c89eee58c590a5faf7dc539330b52ecc432d2aaeab57311e6657e5b6024848433154caf9f7f12b3c7b4e9b4568bafb43a1a379a59e0ca1fcaf0d52878799316b0899312370bc5f7d395af1750b96455cfc15b305fc32c52770849bdaf09805e5c3f209220d58a609461ee8d4cb063f732ff30c764bdbc0303dc99ac65d585e3841a52c34f8df53c27f6b65613f55f48569e0c62bd8fb0ea021e86f64fb0c065640e757123c11d45aaf26c830b34658f226d67d8a74ed823c30b07667b54a77135a30e7486445141601dc094e57ef6eac011f4706abd6ec1c6dd439eeae8bd56a462b08973a11a7e22d38ee722528502e5f4cdfe25c4ffd317a90222048f7744235e6d6248af248352f4c304d65fc73f1aa087ca2622892f31f7fe0307c68a4aaef4befa90ef65b8713c1916fb4d387638c244b12238cbf9afa5371b0214d3cb028f0ab0bc283f372b35ae08c5f92484f9f64223ee1aadcdf91b85e290021ceed1b2bc1f521239da936b026225c28c93c1aa4038f509744dcf7c1fc90e7a0317eca9b4950caf1281110bd78c95bf035edd573ec1f88fe82b7fea87045bc35898c89025f6c258f861483757d1da24183b2415b4729bbca26891a6442cbb840f020836eab508bde3c3796a73b5d3fba068b71725ac886e4aa3345818ef788919de2225e3ff7b1a3d75aa293f7f820059b93c3dfa315e610f6714c1b879aede27e1b611f4fd1817f6ff8ecb128d4ee7fd77cd7b0d549f414ba4d60cc7e2b979782d8e174c8e96b4d3a2010e9fff00afb0fe227b91b988c3ac80489c688a80941d7a4d091256225b972a9d5da75905b15498af66f73ae8b9d7922262282efd9e9c7306c505a5ee44da27c82fc92a023662e94422504471005066fefc9cdf53fbd762b50c41402e177693648857fade99df247ff746093a2bfc4df37c1768763fe9e52e16be068356db5da77f53b14c6c2c412b222e54af6894afde0871efceffee3449e44d602ca19ee63b4b5e38343ff69a152d08d8a9337677a1ec3d8a521d9d635f807a3cd1f00fd6d960f49f8bb3ed351d163e8a3818559ba0f740a9946d1be1706affda1cc5116cd155c58bd50fb9caed55a3048c13865317bbba6366fa67081de0ee53d2407afbea09011b944b09d8b72d8d602dad0f00ca2bb58ca51452d729cb8bfb4729e4b0525db761ba27c5d3e37d2ddaeacc668f4eb075e6854f8a74830e07d0159f1182b351ea296ee7e5ddbc885ff3bf7f3a965d0e636301494d00006fc5d9226589a0e4cb35f19ec7c436280cdcff364cb71a3edf414904ae50729dceff0ee1f7f9fbc9789f3ee55ce52da008490117c69c39e76ec112279ce35718f4d68ac1c0f46b64e6b3df390bf3a3b98d993b6a592ab2268d859b8bce4b607dd56d2b2f27bf1909a6adbadf79531345b328915b7010042dcc3c31e43c547b4d1427c19696c327a4f37aa317117314273538c8c5cfb9ff9ea5a9a4b4a5f0e3262a7028d0cce450c8d4aeb5c2ff3c8cc867674e8949661450d6444480ae66d54f1661e0086f2f44fe05fc3e44d3f308652ba1906b21a9e2c183927e097548ab409cb1860cfab39ba27c7d596f59227fb7a7b68f4e4e7b168136cc00f6b9493c8970b0b31e5ce80a7605a7b41f11a5a17ee18b499d0a3ef0ecbbfad9b5e1e38b5c3d92a39de77d35b478d523a598a08836819b19e222999e13abf5c792c4c2cec15261f73456b5921737ea581a5baf32af42741a8e2042976d4da3a52917d03df9c95e5eeffa4557be1d043d6f8b1cc8fc943d8e779ce68b102b35c4e89633f2696871d2cb23e92eb11f3de8ab193e90d0572192401c3b09d36d9ff189da1574bc94c4d36d405021e658f3cd145b872197cf498dcfcb253420794c9591ac36d0219472536f243a4fcf70cb0da1dea6c53e09860aca2d8336fa0bcd8525f753cda201b310692a864006b8b3819e3a2046f132152ca1cd9ca1843602b330de0c3bbb44a3f1a21253d38e5f01822c4659c2bf061a5d1f6d3d6f8394d666adcaa94059bd5b08eb94901a94ae8a3c08df969e92c9e0324857e9c8d39f3a8e0b15220d87eb99450370ae35e3ea4fccc5e8b633b20b1fbf9023ea0f25586021842294c154c95c0e9a0c140fb99cdda55e50dc5d887f1bcfb3274eefbb1b6a2b98f870a59dd1a7bf4e4ccbc2642b9c2b6783c876262a749abdaeb28dda76c228c59a443862b125286e3ef0439a6e8e269a291cdde525a42d89b22ecc07b024cc501fbcc1d28dbb98ad9e5877979549f73886e2d5c33e667169f685446520600c138aa60fc5d3d54a2bc165601e54237023f78ab2e51ee4d325782e23942f07c4a480c82397c66c8abcde681b366888df5edc8d1bcc2bab17c6bc38cf6e59539d67b2af6de5b98c08235cf2961fa71fa92d63c55b0c", "65635252", 0, -393192261, 1537743641, "56f393b2523620e54dcb1527918272113829b3827d1bb31ee5dc6800ae589ba9"], + ["34c9ed4e04871827f4d9c64f429af53e8663eac0c0c1af65abc5f909f8888c7cbd1dc547160200000009ac6a00005252656552bb8752dcef1ac91bae9a92b617a5b177ff101cc80d1902b00fa0255c260a25d6db81abdb000000000852ac530063006a52ffb8450531a7ba1a606d9c6908505b0aa0b0cb08738276a8924a635ca0c1c312cb95519d000000000900000053515265656335a630f9d12bcdc749702d9920c7e91baaa7da6e23b4bf3eec41a5fd0d55010c303e2ced03000000036563632d06eeb1033a6245020000000000a8a6870200000000096a526aac5353ac0000074584010000000007ac6a63636552ac5b71389700", "536a00ac", 2, 1245199199, 1537743641, "0c0b6695a6e7f08778b2dc68bddb95e9069839ed54ceb97d4e3cb693f750a7d0"], + ["96abc322021f5e03b765300f97582a78dcf925439f09dce3c9d0aec85558a7de54ef80760c03000000002df318f4b633253d521ba0219b52fc973568a448c5df91e242dfcd2938f4e024dd3ee3c00200000003ac6a63ffffffff02d73fe402000000000900635163006563ac002165290500000000076a5363635365519533ee7f010000000000000000769dc70500000000ee0c1269000e1a24a3e5842a234d890fe74513e10153e0366e3ac32b4ac807392ff17426b2dccb0593db9b8214bd7391754e3f5369c5cbb0d3371ae4b751520bc992f302ca48479631c8cb049b3b73aec72af3a7c84711b5479ff8721eae2c1a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ffd06882442d141bd855c42d391fc92f801c38f95a83ca6d92d6a18d7035fd4077c0a8705a99582979e5a549bfa4341ddd7928f37a8f81439465fa95a456baee9c37d493298f2e5997cfdc41bb4a3f2fa50729df1826c9954da2643bef1e945481196e79609f6d51fd8a884127c6fbc6cf1498d3f83512547d1af2324e80b5e022671522833def61605dc28e840002321e024dcec57d657ac01a6083020bab6f403064323ce27af5278ea5bd47728964008dd2d7b4163e52e75348b90f922921b320a07dba744f47ee3ead1ad0a16cdfbdee4f657803ad39f475d7483523987eabe73c8ad20d0cb0fb505337d055b85dfe115792289e1c8bbdc7a271e0aa697f47e66032a4f0d977b67fea02a37a4d0f01256eaf8266e0b173f28661172e8721752a1150224f3233212b33dd344d71126266809accbd43439b36473b34a0e01158e41afce0216e9f8398193819f574837159377e44d6af492518d4f07a290c516e2b6a953ea030e0f68cc9eb0e63faad0f64ec6ffb0371fbf43b57402e41437d3d10a0b25ea190209d0bd1af99c41a34d946eaeb69b96bc639e2590d1740eadf4d6ebb0c63dac345098737fa9a3a7ae0617302c4b0a3f354ea89505ef8ddbad3bffa81a0adfd64de0c4e169487fe5bba985b381165fe5faa1b646dc6160aed1e9db83460537258778f6efbeb2c6817338e461273c178df2e6b163c6c4b6e7362f1e21a075c3c7be83db0fafc0a499038f5f3c9f9e1cd93badd9e84dcf1f5b34246266ef6e75fc13be75603594f2b77325bbebc390c0a793dd794b9fd275fdf91a09ba5d1692f8629471aae991d4222005991a8b88e0b248074de778883210355029029c30aac96514df8a57bca5ac4a3f0ec96dd9e0a74c81b851312f47d808eb178a11143f7397704752e963241a511ebe0a175736d648172d19cf5970d1636dedb9c999e545f4b8ea2e8333da71217459a6a9ccb6336a84dde35b690fb7aad41b3e54b8073bcffba80b2e01318ccee458a7467e46df26cca868428eda848c0074c44a93ac6facfb14fd1028286a850d9b917d6413559ad97f8b32fe0934f16674f07b4b54798158397b6750ffb6e14a6090408a4ac861d31bb6c4ff43dd85cc4f82e994fb297303e069e38b1567f8be18ba581aea6cffc31b3f248ef8a1bbc6d2ea6acf75278fe8c3d38bed3d2f20624b9bffe0587779c807b6d62d705a8ed1895a33144ee3554560322a7c38f452ae700e120b4301d59e24c05170a4be8ad159bfef4f53ab4b874122788c50d193bbf6f4fbfdd48d589c2068838a4c62fbb8428b7669e26e230501d68b791fc9ac179797a3ba13f197aa6dc53c6984e14fb0a1cddbccce701b006c77f638ae3ed1970e43371c68bc7719f730f2a79fad90f82a2394566b685baaea7606b83e641ccf78dc141c05a1f59ec52730a7c0b5de8601448fab816913bd74e04ff1e7bdaf6739edb826b9200d5dd78e017d1a64885ce1b6f2e042449afd25b5649e37497e7dd44f6d2871f3c364000bdaf706b54288b8af1b5c78a7990e356556477d31291d0530a550bce40f62ad53a3556491303fed0cd832219ef5d9f76553a861cb872590f6e59bdfd2057d3468ac79d3d0addd3a9caf6600792025ede7049609287d5c85f4d015f43e1d64bbf7ea85647917012d5cba28be91f50d664b919a2ffd6b7748742abbf69eb492a66b2c1fda08420083f6bbf96c2e1ac0743666c21d1f1aff3aab95382fb0741cf8a04d5e7b5fd7984572b7d27b851ae38adb3c2d9e1822a6a8471896ddd8e4e6eaf34f799880f3bda2b2b905bbfaec2b6108dc4badf7fe52256a24285c4193c14ac19407274e9d72a30f82e52fdb6d74a43354a93ebe5d39c6d3167c43835819f8758875f89696ad53c33dbc387ae2bfee2bbc4641d6eac81c2402d579de5f42d6057cc06794a51ef2ee6b50ff4d7dc91b1a43c8f15c2d4603c111944746f9d07081058e53b3c504a95819c25909cc153965d503379c83948e8a77e538166cce86b7bcd76cd00f113e15230d61c3fe6a889ecd42cee85c4102059d50fe652926d9276a7f4d5af8e5f11b80eeb5cf6268340082829bc59ca941cc12ae8878c224873cd2715a0e4c61dfdf16990791080975adad1cff0ffe91c20a5f0c1ea94e9637b3637c0f06d2b31d688531fb7ed0509b661d3968c506859ade5bd04e03d09901f026f87adec5f6f6f27deb64619c44318de6e1ac6c2f33c70274595efef4e62b0c5a65b5396a9c43704ecd0cf4cfd6cd6c25ce76f5daaf823a3dc6c861d0e667a5d63b03343e6f552d25d0920482ece89992eec653ddf684a7ce0d66f5caf644d2f560bb3f907bfb4070d0031d48e9d313d174e384f66333360965d198622691b1723b98e5b0bf43b64619a43ca14aa7e34671ff8c5aaea056241dd68e52740b", "635252525200655351", 1, 1226602468, 0, "1722f02a8528724e73ea62c7f4af2f6ef7714f8ef53bbb593c607c475e4ae6ae"], + ["030000807082c4030460993698e925f709df5e52a1e0ea4bf2d524d8eb1cfc8e3554f7fd4349755ffc01000000035152ac1eb5207ce6bfd7a3149788da36e4faccc7e8f22135b25260d0c7993f21254d01f33ee423000000000963acac520000006553ffffffff9a7a0ffd7dbfca06a6a64489ad6840754c399d86a7b3933fab41592f3cd7276900000000046a52636313a9acc81c5cf365f85d530abb17d8cc8e8931b5abeec7b5ffe1ec791e4a480b5c1d84a1000000000253acffffffff0166774201000000000045d192290000000000", "52516a5251", 1, 605872301, 1537743641, "281222c646722924f5a944bd546d84c0ff73300c944091db9fb0b478da4d4b9d"], + ["030000807082c4030429f257ae68e6ce82b5dbee825b34f4bfbc867dd6d8446e89bd429986062754b601000000045365ac6affffffff358320f9525bd2e7e1d0e9626fb898913957af57c433af0630db6a574099e3b8000000000352acacfffffffffcd404d993bef581e48d660828bba03f10b389fe6bc081de3133449605be31eb0200000003636551ffffffffab4fbde9ff0fb91ddf1a22e35a58efc9dbe545212b73f47b8a86786a2be42d2301000000066a5353525200ffffffff016e2e2903000000000452526500588807950000000000", "65", 3, -1112243543, 1537743641, "1bebe553645a422bb9200d0ed5421486f8257577d48cabdd63d8bbc309ddac01"], + ["030000807082c40301369f486bff896db4ec440c4bc13023c96b518fb2cded4c1ba1d658aadacc45a50300000009520065006353516a65ffffffff0150144f0400000000006307cd8600000000030000000000000000d406680200000000ca77e384e40c7f06fbd020e01efc9ce5a40deee08a08900f99f1a621df6274ee52953c23eb2b9205d8f953c2781384b4a1b3601c3328fc03390f136ea6cf0e7448f8202c87ccfc5a3b433538bdd8959dd8a8959fbe1e01e03429419d7d6d458200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000118d145390425ecd745072dce363de31fbd44ba3c3a7f4e01622e7faabaa538a05daa2b64fef50529e19328c31d84d66820bf3312f8eb779e25eec70f08cb04c01e872f141f04010b79226d2eab2d659ee003bb0e483c7b4792c0bae2ea6b7c5c2032fee7126e7a4276809b5066d7f77a8d441a9f0c03e07c6da815631a3893a022f6de3246325d6f39c51cc50620cc465be98b8b40b734420b02c6def97d4503c0316bc3e2c3954cc7e9861639c7bda0dee4203c65b00bffb8a88a838b2b11800690a0507cb3586e681dfbd7091a06eb6a45482c69259f5a68de26f84dcf6a0766a6f149b900b3dc8594d2ec25e5dfc2dcda4e8ae2d43fe7b2cfea92597dfd9dd879d030644a6904c14f6617471e6f581d31dc9202a0ce0d8fab3ff042a19f67c6363d0022ca04d05944510f04d51c96fceab31469ad4a1604419747a89a631f2038fac140222c89dbf0e8b29421cc3e5a82f5820c3614b956b2aa1a9505bfba833720bc74e032602cd2f11c45723effef919dfed07f288e4e2e0821e74eb74dd81df541bd522030bd13f1e4a0d25d73cff6e4c28d58be2e926cf7af0be546d64a9a8f1b8404fb726dff318ab0e5610e61621ce8063a9f6c828680e6969b0570a3aa1f261bed2ac18ecef4533c194e9c2e6e871a89207a0af8f55d718ba2efbf1eaff399980207d78861df080416d88a3fdc317f6adf794ae4714915ba3d18288971bdfddf646e780dd09db5c8c6d2fd34d5e66e9e61da0bd4282b15370ee72c3bc42d78a9d7a6ee8acbf635c32fa31b0c560167265c6c2d51094d5b88cec73f27c6f3faad29d468206e38e28d4ffcf3ccdfec52d0aebff12c44bf2070b35256278479970c5d89edc774e8b550e3f898509ff3da09e422c6a4afc53a9d924c061be155f57a22491ccc08ecf62302b05c5d324d5843807d66f50f9f34787b30bdb241d44b70855f89ceddd806dd22e91c3411ebad72d5a85c321c5a325a6005be971cbe30542711adea92cb3ab9dc4b0d2d1144eefc27185b08502ea328fcc956ee87249e8da45e683d729b3a195939c30a475d5c5cacc02937a6f7c8f53b26c52a7be71250a5ee4fabf2d3b80ff67c71c3149abc71f00d193336bbf113908e3c2e3758c3bf180bbb356311a6c540af76ac1cf991edbed993f9ad7dbcc4b9e014a6ac76ed850943cb0781d3a7b24deb82f23b576b20058464476d8b91ab3d0533e34874abc3149b555797f8dfb5f6b0bc7efa5156de455b32003289efbf60821466368bad0e07849d1d8a6326ac366fa748f48482bd302ce2a5f50a52d3775c9d028c3f14a9c09941bd60c921c3b845d35db21b8dc8cdecee85fe984285c262477704ed81228fcfe7f9239941a01c5f2e2d109d2a04b799931850a8fc9442335ff83e5a8f4134de0a245056f25d8a84cbff7f9d9f571beba4dd2265b123f264691599ff4097a5348b74e9b9bdd460fdc87d8552e66da25e64570aa868e3a96ac43cc4ddcdaa836e44061ad9cf20168b5d62c5e51cb0085188e28b84e8fbc8f702245aecf8e5bc2fb4a156a278724022368b0270f2352a50c19b8d7c04a106363bde9e57b2a35b73a72ad4ecaad99deb57217eb15d7683c83cd8eb45c092f5794bbcbfd5e22eaadfe4d526c6e46a281bc5f242ce4ce7dc5347d96918c66046abdcbfea3208bf9b43639d49d07419f0a3d08e8099d969562257ccfb65bea49a1f63670227390359956dc51d56f83f6a20ef4f6b8249aced0b7f8d178cc2672b9d08b5e6ce69e345f2c602a9559a790491978e40144204cb1cc10cb3fb696d2b5ed58201b821e4e28c3450939542f23e32ddce40319b55401dceb32d76768e5f5899d6c481e126e1c5dc962a65b881535e0daa1be98bcff766414478d557df5605891f9d289e2b0554fbdb9ef778dd2a1b7d237f9c216932e1deaac7a028ae96ba1b3a4c611e48d865114a97e6cd19538bbb8c198611db8236d3bf03d340491afc53acd6f266f1981bdd459d851da585f1c406cbca503c6bc340196232ce9a81fad6d99e7379c1fa53f79eb727614e25b455c0036740045929495d926562d07112b9b0caf25a285fa1742f88506b042ead83e2e1fd288680f31c75f5b1720b411bd32d38c83df1ff9829e226b4b902db16bced55074df2944ccaa63d35babd1dc82f28e4a9ed7abb0de213382fd6d6538ebf0b7a3e3e0461ffdefc74dabba9884b0c0782efe0a9bad9c0516750bd840c8e8eea30b7eda05d81d5f62ca4b2624cd5d6bd7a1bc6ae48751ab3583927b6aee56ea907ffdf15bda88fb72c2362201000000000000000000000000d207dca9b23d40c4a513803183b576ed1543a90fb2caf9c879f2d3e09bacdb9587764b5e9595867033cb2e403959c052f6ba6745f005520c7eaf8e3390c5e63bb09ecf0b4fe9f0ce3886758d50d1a677cda46d4ac9155e355b652cca88de85d800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000be9c318f271bcaf9aba8f84f56adf558fcaa995492e8ba6056146d6a288577878bfd1e91db628ca86173ffe9435db1df5aec146da61d82e1c9f39905672e353cb742f84584587e5a53b9bbb0d443a8e0c59b74185813d8823f822ed7d022208ac512389044abebeb4238770e1d3a1fc6303de066a8f278a9c8aaefe6c53a8f30032ab84ded7068f1159d00f8f0febaf09bd09df068a6bc26bdada8fcf9ba9ceb6802000838fbf80a9d1237a6e34698dca4075dcef6d8457c9bc5542af16af1da9cdd0a06858221c4bf3f0654c73c27768cd3dfd371461e77c88b8862abb4d9a23bdd0ec6e4e61cb39a9a87105969084bbb2761e10109e95ca131646161c64233305f45032fabb716cc5ed0d9d61d46aa734ad1638a0afe5bae1a41ca7eb6d2ab4f03fa37022f0ed4e3ad87efe0c91e9b37b3bd565e5ef640db6d874cc6664e1173cab3073e031a643de92c14ce98567072444869a378a31693cffc938dcab39f215871efa8f1031a5041974cd01ffc7c9d226c188a89733828a64651125fcd27209e2aaf7701350227b52f8a25203bf09603294a42b91996878598df352ea250b1130c5d9bc56929c23de08f84579294103f0549c1858317878cff256fbd0989fcf1e6902d7e58ddd4c4e35583eb8f6a3d9d39d20e6fc39a032e190befc3a04cbfba0c2e2e2e5ac9920318e229a529b42595c9eee6a2c8cdf166b7da0742210468f7027a500ae8c941f38d4a547c924fa211193d37446c7a7d38d5a3ef7cf43c2a974adf372c505a0e5584627e5144a9f0d5a7aa8157e77042e5b3cff35724a3a0be5d818538e76ddf461f917bf49502eefd7c4c82de675a1569e962bb14ddb73c7bf61e7e3ac4ce86a86e22ad16417df1ae4c9253ba2652c4770d012b134d9ac6cdac80fad9bbb610e30b0a4bb16e7e5e8ac6ed80f8cf5185e17906b39eaaaa712756f6b12258e2ec307106cc3523ff1147106a1611500ded9be53a22953b4dcb85950b423ec3e4d461eceb29bf2e201e25b73bd9f5fb3509d18e0585d7106f95135e0c644a9951ca275fcfb24ae4c51949ca866907c147860b9ddbbeb6e05552200a2f01d9fa3fd2daccfd3fcf5be7773892ff9b8c3b426502a4a42ad3b67747cd33013cbf39a7ef33ce8e5a3fed96325e645810d32170d636bbfec509b8c499114147a94d78402d67d36bd8b0685d9bd7b11347bd9f9558eb94acc88e44ac6d9b94afd953e5af8dcdb5091f24620717a7f179a9dada9a54fcec425da6f79b96679bfb9ba4608c7a0a4ec5984896c437c5d4e8fbbf2af322a9fa3d377eb9e467e464da8e23fa843fedc62fda73fb64c3ac03df253a3edf65a40c63e3ada63916498b9d954410caccd00e948174d1666e1b11aecb6e984c8c246d6fefc6149c75eb73dad98193bc523d4ad04d0ed142a1ff4f8e51413a0d2007dcfa0d50913271589995dd2a8e0ec95e7c72c0b559746b9d821dd2817d7843ecba6d7344cdb4fb0a5f979cadc49bc76ce3935beaa8dad6710c3a80bb59d5a60385fe8591eae04c9041b1d682d9d90ee47e731111c805223917c4a38e59515ea0feaf3c85fbe1cd67547cbc58c0a8f58fe55beba0d21d89a097e87e86298713e812b7a7e405db548cc9d33bcb47aed721695d8460f44d399c44adb32150ec38edb32468d1abb9c4a9d04938ba717c0c68646d8bf25c1e4e208488615ceeb2b5580b0f52ebaf912d5b3f919bc919a8a612e283973f7b445a42c153bd6f02de08ad9630f1388a0b806d06b73190e7c72ab4c568c7d445128bdf39a264497097594a4c4916b386ce22445efa3d19c7701b207515a89e5a47a6059cba53ad14a34de8dc23a0d68331307ab7a81264a5b9da8dafe3d7e3a5b86e3f4189a2dfb1932e1cdb1d5700b2895a45e0023829bc880330324b1e29b149718df8b3194b30c4945d882abe13dced46cec55533a011a4765a1f91b0e8daac865db99e8931ca2e563b5a4d726bb24546dde9d4c5395b637229337d09af9d1205f3caee9642b99113dde05dbd494fcd2f451907367249178bcd0562ac4b86608f2ac3af1429b103360998126b72b719258520067b791b91d8aad243bb63a4c7758d90e6939fd5b8dd46c12f047a54950d18dffd7a42a12d2cdb69428ce8078213781eb5fcf6496ff24b2389888b6e9e31abd82ca5b1883aaa22d0b7a33445d546a41e22677a9f0fc1e4dc606266bc5765c11e870d5eeca1e10049e8864dd341169bea11f66dc9ec75c90391d2e95b2d8395e5eace456ddb0cd99f948265355b60a712b4689d14378c380000000000000000bb991900000000003bab2604ab23f30b4f812cda78fe2eea438fc5b16c0396400ef61a0097175674114e474c13a1c13bcae404a2b7b185084b5bf65a707f8e74d3c945a18c3431478b8d1ea7df9c2cee474059db913db333a2f940193d6d11bd718892dc30e7ed59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009fae7dc13a8bd5d26d7555123d2982a4226477d9c747127081234db67eb59baf7f21e55dec89e2631ff58f35a25cb1d0f2b48f18a6f3000a88a8180b5574ed82eae998378ef0a414af567e6a4cb72ac49afcb9b17aefa5907938f72994c496e21170444704e1c22be2d4c1e6a56c2b70700d2c965ca1318cee063c62baaee731021deafe2f580947db6eb2d76c99b26225880f1073d6b707c855da8e1035501ff4022a97b9017b2a199ac127cf2070219631f9ed8c3566c8f3525739de352b6ebde50a0855b56c951f3245468781a158732a63d0a3a0d0a11677743d24557435ecfc370ad61fb5ad972060116213bb0a333176938a827299348c529a57fbc79710fb9e032cef71f18f610f8102eb79773015ab333aa4cdc8312a4163a35a48aff08796b10229506b560a6f36a426b6c947947b57422484e03f8207ebed52a5ae93fb75bb4b022386f76f53f315b4c035e675635f8de0833d90f602b28d454e726efe6a21509d030f3cad753bb3270c6f9c40d162cd8ec2b2e73101c1003e55edccdf979dc20b99032293b16b6d5589ce5e62e99b903b6150f4c969151191667f10ce58c40be5c03dbbac2e918ea776a912ef8683a2429cc1026f04a9bd2d5308b4e1ebb4792017aa93e608c4c5e456e02b48848186bd1a98bf9251ae91021147fb74a26b1dcf6527511907c0ed44cf2d86d1460ec6f79cfced39e4cc015719d384051f3c3b3a2e68226b01f806e66f1356bb2f610f8d459700b9efcb546c830b595d35f9b5bdceda9cc7cb96c90bd965040c5d819581770c687cf133390984c9476af36113bcafedfa86e1a060d6fe0c6932a55c8a3777a33f5d88bd4fdb01e4911624df16e75f3d94ef400d0192fad858cea6ca5e3f6f767e9d2fc1310280cb980a8504d7d7d971dd634be1b28925866f30f5884ad75744446d892cd13511fcab6d04eff67f178581374bd787b847e75fda324e19fe146323903e9de7dc4250b999542fb09fa9ee2aafa6d41f46476e85682d1049ae8d51290f71c681cb22d47303dd215b9eb150d0ed9f80c28ac320dfe73a20f825889e5794d4ef240e35c88e82378873ae0f11e41f658d48f0c26d5b7125b8508fe424c36d4344c8daa4b02636686ecd27018f4ffe17ea2a6993d425fbb09bc6db5d20fa6ed594da45ce3f9f27b042a3446f94a0823380e89cfc6026170a6d3a6ae52fb57ea0d4288af6c6094eb9e88591032e470fc8d560478c4723ff47175ea5f63f03f6b1fd6399a4d83ebbdf7086e5a953d0d5a8b1e2b51ecf10352f2b0caf9f13b2bd396460986271807f89f02bdcab8e3cb52fabc3e6dd32559c20470d7cb13de23b8de3577cfd2240eda14d678f0bdfc6503ade3c65214fb7f8f0d0d95ee02b3d2c7bf41830bf43957ce87718fced463076e292df909a8bc4020f543f9851dfff222e27bd1f8cf17ddd49729da0a42bb5132e474b500d79f18536c800d9af2e20de6846a14409fd0ca7f261fefaf3753355b831cc702b4b9e9e0eb2755ae605b0a8a44d6c752dd1ba3155aad196b944ea34a6825613c2978c00ac6135b5c7bd358aacbb4e72949c77be4dd99733740ec95ea037ad89a6043724e64fe7201966d5d3060e740a78919cbb31ab11f872193b675ed86a709d70d970835d769bcc14c67226a4c1acc8834a23b8aa1c3f06d77c0a3c8d7eef011edaf0686d1348e01cf0396fa8711dc3646e3512c829192c8d18d99f3060e4e1795957039034f7a50d45d0dbbeaa872c15a1eeeab4f4fe19721a9f2ae5883ad530af1e2bc55e31d2459ec66eb562a45535415a6c8474d229248fb53fe76af1a3ea7f25a45f01ea89fd1490c3ac1f8203c36609ff6a5c608ee8eb56f7d0e3897297e83c1647a398fee92f91a165b605a5528a9439cdd87bd2d852bfbd657edfe6fe7460beb6756e21f25218bf8897b39d7827cd36f8fa6767bd440757ecd9c07b285a882bb83ea8773fbc1ceef85a785e584e2e4a5585a5d9c3f361bf83156bff983ba1ee09a36aca7a15ec8af4fd3de533e8059c1746d453c0dff4c31a22503fc5c8d1ef5f4ba8f096b824b91a1ea44461df15d523d3bb96f1c37680d9e70352db958ca24b59257f80bd0a7976215302d3c59f030928ad682a7941bd550ec84fd077e12a6e582615a4a0ff2c6fd90f3de0e6ac03d5c9241283e0ad50240c6cb748fe6758c777c1a2764d141f936ee5027700491d82b82a7dc50e2fad0c7aec9e465a932cd2fc8ea69ec2ce7e5c61ed5d522b8e09c5d128f6944156f44030cd598edf26de0057fc565b9c80226f1987de1683a80bc8633eb6a2088700f5cdb76915ed6cac9c9f83b12573f79dc2f9fb30e894c7a9e6e183a9e7fa3fc1c7175f01bca92b1483fb6f0e6cdae3d64d7f4644a6bae21cf862c7ca9de581e967719173e3cc52dfeb2dd1c65e2007", "005252", 0, 1214665202, 1537743641, "7ee525ee0815e8cc5d8da270d16190f7992c886ed4d4e1e02d140ab6696f6998"], + ["030000807082c40303e9407728635a2740ec83c6794bf2cbd78c2cc6e95f68fb98e67a2a8040b96da103000000076a53ac636a5365ffffffff96880f40a2de38820cd647ba71df5b32b6bcc31e39d5de09d0d4e90fa45a84cf01000000056351535265ffffffffedc3215c42e4e93b090acc9aba891adfe51b0072351cb773e836c06426a546ab0100000000ffffffff0123c54c04000000000263008f074df00000000000", "65", 0, 870048480, 1537743641, "d4a7d028ef2abe20c420fed5e672a7d99dc1c5b73c9ccb621e6937a9a285f8c9"], + ["030000807082c403048f02f952bf38f915138b9dd170ef14f3bedd7b42cd4790c71bd9d4f0e2c092df02000000036a5165ffffffffcdac79469aa0cbd8c3583a7ee0dd2df6f6c67e51b2a28cd1679e60acfe4f283b020000000753006a52ac006ac6110b90c1f6c26009cb5d8cb2c9e4906b82605dfb23577ae0dd506a9048f007c5b07dc002000000045352006a98d8c9f6fe6d4024b262fde4ec904b228ffbc1fc365b8f1824862448e1083c08a08efcd0020000000852ac005153006565ffffffff0116733903000000000451006353d1a8f11a0000000000", "", 2, 70481422, 0, "fb9888ee3f5fa4577233f5bb3e819fd7b8f722bd8f1adf7b51be6ce5026121f2"], + ["030000807082c403046dc9b425e55d74fee5827df63d5cb278a3069e7873412b1ce4b6d5e92be3a28903000000045252656adab4eebcad2214bcb8c8dc6ae6ad2c785307bcedc7fd176af13e0681b092c52b2515ee5a0200000007656a526565536affffffffa4e61eefa4d8fc4a7dea6a9bf112ddd6fc7bc2ae8b1f114a0733f16cc30bb40b0200000009ac006351515152536aa67641526826778a6dd02b0d734873c1836708b80f6f376aaa57299b746bc9f0efb4afb80000000008656a5253536a6351ffffffff0102863603000000000253510000000000000000030000000000000000cf4ba70300000000d53b88c9a9a69506b18a1a87771e56dcfc41e73c9058d5783dbfbb089c0067860392e052a07a167592ef22ef292bef1fa2644f05afe1d51009b2fc96e872fb8bf7520fcf5c0360caabfc9de51c85ee9711508588362c84984017f71c1e56470500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000315113d782a4d9ade6746825126fc485f9afdce8f998f7d9936269dbf2e61641c25d20665121e4c0597621c0e4d8114e871120ed4781eb1799e5c9b1f8ad88ba2dca415151de11608692489a9290ccd1beca3c6e9478817497004f681e8dcc15eacf7d0b0bf2e0d823a01ed98f01e3a4a5eccd44a2bdc2b5e0bd1c8186dd5034032007f4c0cee6bb12e87d7ffd85974d2e0a57bf32f972d072c16937a470353f230306a3b9952f4282eb3305745e3b2b7725b63d289aceeef460fe3c49c25325e9610a05b4d909022a05666cd5cfee5bc784123c7a0c6bf9180122798de9ba3b362da9ef5c29d1d9ecd8908d2e9116b804aa66a8b13c7bd833e1b62c045cd540ff16eb022ea73f07d45f355e26617f76c605c0f69933b7314177ced021b9676d88d37f320306e8979ef2bcc487fb1194b7dd6039f2a0fc56c4091b1c7d2d5d2ce486b111710210651fd55887c3a6836d2640e2070c029fb2541452537a33b8a4bbad4eedfcc90319b3b8ac977b9455d20ea8f70640e1a55a35ff231d61708121a7e1815d88bf5102155d168243d9aba520aa2b6e214c6b3af619a312f3f1908eb1e5e6d8ac8d5076911880844295feff3ba9981a0d5311814c4ca70152c89ff7af5e1a0aef019dc86af1f7aafc43525ce971bfeebf022569e62c330892426c4808b561d2b69137c40868af6699e50f395ba72b1d773b3a72c3adf7c5385ce1e7ec93d8091a369d95fb20f766e4762e761a98eb370ef353b9102b2b489a28c8820c79e59563887e11f9ca48db3fc019a7aba1d11fabd8f100ea846f140bacad7c2187e376251a6104b23dc65a998576b4551aae78f6eebde9c6a06d484c9d4d2cada478acf5c610c7ba49305d1db6fb51d4bb2c3e15b0d1c3e91134b4c4cb2e2e1469b1907854a4e8d5f685cf5256ae152cffa8d5d900763dcfadc7a04b17576c7433422b44281e406bec91ac828184f28d22c06fbd92ec1a955830dd89a42017b3ec61f93ac8096cd9c663b4eb75c528b86cf4c05fb52cb8098fcaa0f4387d731488c569da1794b6ea3479bf9feaefc26e945d62afd5986f183dcc82e8b41ebfafc1e0fdd1beea5f7e223c92efb7d0afc6a56a5a93dbdd6956c0beb91151aeb98ead06cf088ff4c70a65ee5785fb1524d1c9a2bbed814e1529e2423a494b3bc05839064f14779ca0f9aa1d03243f42a8491be6749d5bd6b7b9291288c370a012d0bac8a392ed94c9853c7dead5743b1feffe8fbd035ef330c1a607c219e65930a2cf2e27b70a85d346d5615ac3289fa31e49b8b8f8f6355a0c1358d5e7949d418f9b2780a5e739bed0acbadda034517966f40ce64383f051d408863fc22edf481c76f2c12250b91cdbffa9f55b986173ba9a578a872209627214882008e20886db5abc660b460e1e98e28c5eb0426743f71cc791d3ac5e2fd043edb79137525c680859c84b36d23ad1e228556c832883c4965e583d6522ce99ec9a20e8972c440e9f7a2da5ca820beff81b9f9ab752e782c9675195724cc7150d6f07fcb0e2c53458b730ba3a1bc4eb7e300b49d060e304afdfcf18f4987c271b195efaf5e94aeacd0a366c83a48cb5ba891856f5b31b3bec7947a6eb8079f543445f10be3c9cbadcbe5fa31033698854ce0773192cff7f716b3ba0a954701510a3b8e8327a056b33640595ea668b8cb4070555388770332e681794d34c2f643aeece4df59f191d4f572f7d61bed0de9c4504e3e6c0c3ee0eb6a281bfbee087e1325232eaab81dad9775b02f585babece598f587aafa64a28bf728751f22ce2a22b3b97f576030fa11ec0b549a2e99fa0711f1cd3e52a9297a72e2867933c1d631e206e6bcc61ea1bde7aca1b9746ebea972ff134ca199a70b2729ce1e35de1e27c846060932183fa781517de5900c9d05b42fb0e60ccd1dba88e902abb4330cf2771565d9ff3788f3d2f36b070b198cef29125e477647a57ae6a0975135df7d596f8aed742462e4aefa8fa3dc18e20d0a3fa3a2f64ff728c2e6113974e353e330103070280aede5f648e661e8e90fe9559ae1b3fb52da46b0d45be3a5853067a42fa94b47f27a6599ecf2893b7b719f430e0b263b88f8bc477fa55d222fdae320d8f744a962ef2283917a5e8b64d75ff7d7f48e4c6f5d3e45cba7933683b5fcf4e12975ae244a4b8e99f12565bfad8a072717d0d8a828db79a29017d2d0b165850b7124dbead77577e8cd82cf0bc14ddd21c8ebfe2d76f4a3a90dbe21e5d6d4bd1581c6a43f8f7ab7559cf83d6da9a68b0515a47f64f0cd7797598271d1625a6b0c09105000000000000000000000000b1f0f214551910fcd9503b1620abb132a07528ff27c0cbd98ab4334b15fe631a2e3ed433bcec73dbab9e73144592070ffc46b507b55ec279c298e2f7321bebbde5156b87f429c6252a2ea591949f210f7334e5f45c0c87bb681869ab64be3f48000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ac711f15669c792b5d97e2f22009c239ef45ff997b50d37f7cdefdaaea2578355bd618ef96953a5eb9f2766d479bdc185433d2ecc30d30f8098e8c4c7c7499c4e86439552a153050a0b4b8c68fd38900280f89d4b349f3480f61ac6d6180c99e46dd458594e07f74ef6a2616a9bbd1b22b08aa010543154b34f2a2bee93e6310319e84aab1438684f2250960c443e3d940748f0776b02e1e11d99075657a0f63d03158b55669dde2e51e42674b1b25ae7152cdab0c01b471007bfe004b29203e8a40b022c0f0c56e23ef86fc11d5e95f67c174e0aea436e588f8534dc8c140201ea34334cfa45ad16999840f4975e06510ecb012093c8dd9d40e6b47e443c6c44b29d021f3d0c05b133b4e50e6a282f193a17249bcd11eb38fc06555a0a7133022f42640229701d7c3204f52ee1dca8e6709f7d11e01b80adc1f90b1aa3d8bd58feb80426030a6e9948e8eb4d0e021d82158672fea16e9b90c512befabcbd6de41c86daefac031124819e6064f8f173883890fb57d3bcb16fbbc968e2a98edf45abfbb5f21d1b030b79953589645cd981331e11f4efaf53f489f31cf3595d0a28b125dd48d9bd8b4c289442eb3ad20fb006598e704732e367b6d81aa517c014c6d20a0eef6aaed682acc53423c86cb1f7d3134380e10f98a5f476ba7637749e0fcfb76065f7dcf299a6a4d6a5d83d8687c261c87c42bed23a345e873e517ca2be84599c8f22fe9dd15a8559e057cf7fef63c372d5d901a13f691882137141e7ff8c45c67b5c8bc4daaea3927d27a5ddf6d21bf14caf6de819ba602a676b0525167cdbcb10d0f1847f7e70ac1683e85b5ece7f6c11a008b4f3728ba5c2a49e8ad323ff6b352f7a9453e584edc5efb20ee1a3c13431ee266491314f05d25c06aee3cc294de2619b53872a8b0b8b32e5c2e83a24ff530c24e43c2fed93d5beb8333622a2179c06b97f16401aa6aed9acb436de163260600f4b1ef28cbd80e80d80b5da616c8e96a74b07d6e50871897424b4fa5dda55a434c3c8041adc001c615d1a520ad0ccf6f5c005d9a5be2511270d2f1359841b6b148dcefecab6db40b01117ac7be918ba7083bfbd52fea38ec713d32fd59009ce66a6ef0320f4a974f190b916eeac499a61036845ad8dc6e6524026c46c079690261ce5133dfa2b5985c91e6dae377a6ab953d1a64034ac47c6dcc54c023a2a3efa8b0c6f8c255f015c346f901b15e4fbe24fd5da5d8e7aae13a8e798d70091dbe119493dca595bedf0bef23ed4266aab21b9376e6709b5d0531f0fef4e7f7959e1be62317da271002f8b399b816422e6a6d55082c65cc0530a071cf3408375412df38a1dfdebf254f033e920527b790c85fddbeb2822e52dd7968b46b25e00c56c7dcacecb1ef350e420a3e786e4d5df91550ebe94205ed7969788edd7ae833c86100f13c5f1d11d2d69752f0fb6ff74d57cd25e2369bc385987dfd3ec291296660ed280ef5d697716336a7c226c209c83ffe2a67951efb7a9f1f6363deb01f6a15678394833febe93888ef20be3db4c4abf455fc339fffa3a68723372fd9191dd9a33e110f67d6205852d122c8ca691a948078d40990b4da0e362559020eec1a0e7d4577308a23540d09fa275db7b18f8ee75044c5b9efbb54cc1a7cc8641a6ccd129667615751e39df19c1f9a676cc2ef55b2a750ea2bced83bece1c6c7e3d8956b499b7acb39fa289ec509949150304455323f24b97d15afb5af7c774e7bad98e89a65ce8f19919cab860fed3d71dc1fba9de11441475b55e2ce64c7436bfc06cc44d0e2604200324888b2d66dd5967f9cc1f4991c542325d35cbb2f03f0e819b115692c5822f9ddd1da75caa24aedc0d9c66e5af848402b054c48d42d2c43aedc264b6ece2acf3131346a11c35daa7f6eb8af3881e0ccd828b59a45317523de54a0a57adbb41fe58dbe1bf9e9d365e76c8ec91439ec38bddf6804df8e35a928a55a945f19a7ee402763064b87a7462fc40dca97304dd87b825143a6a246ffc5df7a5969ea0e241a251228cadd4e07b0eccbf841299f4f2144bde21dd1661a78138dcefbe961d059498d6d08762fab8989b9a2b353e34f464835d56c32353763e7c0683759c635ce7f010cf5a3f383c080f4c0d2c3acf365ae3a177cbca106a254ad1b1102273f7c5afa731f647e1d68b57c28d7c97321bdab63a5f815a9cc364660f8e43066007686a15646887e7e94eb11376fde7caceabb668db4efda3fbd2c92d2f9fb4b55fc226c59c45d1b6b48b96c3e795748e8c67515d0eeea5a5dbcc51b10000000000000000eb150a0400000000a1d20079a05e26aca57598011f18b873edc581c22b4339b38a167b8ec47a415e941326bb31d24ef5bd37a842d87a5554c3e2e34045a4efc9862a7b3afecaa68d7ee23871821e3014d2b641c4fa4280d3a5da487ce44caff61bd26dffd293670a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af6a170f4724682250de20f8aa5cfadcc78d7fbbfdd4a963bc2747aa40d3ca0e264978a316e02bfae08b4df1639d6d309037f840db3fdc54ec9c3f13c30b83332549199bbfb8d36d86fce777a573066b2a0023ec59fc966ca132a713d12fb253a89ab98dd59e6c840fcfca2a97aa27f985e9219d676d16be37297d65b08f0204030696496e93942561477f3a6292f088f622eee52829797e5d06f5fe13f8338e2102221c611936ca35a0b19e679fac9bc6cd0c73dc6ad4b2ae72540fa6190c5c25080a09007f8d22d50b2129871bd90221ad32cca1693ea6a2bfa4899051ee873e2c9199dbafc7b5c0f213f4b5a4399d93b3cfaa86285c105876220c79352d5f582c1903283145fc003e2841fc057680c03f9c1d508bb1c17dfa58e5e954441c3bdb000b03193db0dfb7b5a754f3105b75c70f0d4e3b44e54e484dc14357e4a7942fc83797022658993e5f1eeaacf267ef2202f788aa3fd6cbcd1485de99ea4eba84fa1d83e403277ff7ecab34064ff6a18127ea738e4f799a5a86eb8ce9416aed32c5d086da5e02045220476c8692dfba069a833a0cffecc75dedbda7e0311ad465ec1ff983127c4699241963b1c833191ed4bd6ca11e90a266a248798e4c8e89843c354c9142db2009859a350860e4080bfd23db3b43a20f7910439b4fe34b57001f864f1a1eebe8f4786796cc4611766533d81868700b64a60aee6ff3d1aca982a929094b3214ad88b9b707d9ccd56de99a44964fc5d34cb1277be7c8e2639e28614b2725d3f900cd7fe09ab77653e35e52fa4d8630f747bbda60a52506ff726fe04e2d29c878655b236f65c4f445259069a6afb99418e411f6245a15a4856663f3ea7bab6e1a4260114152750a94b50c45d688a8bdef36db49d70d08947c66dd4130d735db295cf9ac5a6cbbe303821e7f27a0ffc00bb5e56fa7963c08014ed30c4f7d7d3f34b66611c297dca17cfe8a2aea003191ee4bffcab78cc3731786400bf6fa5dea36688a4ee7dfedf690545cc27480bd0df7c60f46c6ec43cf09463f75bc5c4b101e02be1d3daae97c2ffe8bea6fbe19dbfcec4d5070e48691c0bf1b51e2b04b7a13d88bd7f14f35e2d18ef5b47b3a6dd58d396b5a8beb294a9fc74fdada10ab971225ef182b2b33c02021eafeb85ec510c37ce2327c76cb9ba882893cf6138012d830b0775e3fc5d69493e877b3f2b24c901354fe3815ca0119f3ab056454df9839fb4445dfa0e5c08efa29bba2fe46d097d3c470d32495a1f4c2356594decf39ca59897a1c63ce86d542df2abbea7e10d19d729adb5e2ba0239a3835096cc116ac492d3e78ef4870e94f938d5de072a392bfb13dd19cd332a98aa865c6f0880ff36617acc7de13297d9f7981e02d7bd8443c656bc97ee764f4a998d98dfb0dc6f6c5d0f4fe392c131badbc8ccb818d8391c312795e96f30b343f64f56d9458f671a20532c530e3a29ae0fc817209be769ec8d87d65ebe43a4d2796037fae02ea5faa26dd587eaa9e726bd4bb68ce775704867551762ebd0a80fc15b932128f98a880a9d84586e86f7dd400ba7c467311141f6bf2ba0a9d4483f7169c08e4c9de33e2fc19af0e3efb1ff0bf571ad3ba1f1e5a58391c71958a41b52ed17e936d87f28075539864238a0e8249dd3f42a13a1275e768f38cc47f979df9fdd42875aae45d65875997be5a5c960650a99c4d4f277b4d85bdf2cb6544fed9c558cb14161c2525cdb07f97a9ea5f57c9e8ed4593424e0f2ce0a46049c3739ffd5e396ea744f26a85d334ec7cba6d068832ee2ec565699525165a12179dddf899e645bfe548ada19456a7998ecf5b9f792ccec822f781433f8414027c08ff3bee5ef6847f5a59d4858f49bbd60c1a3ca8f369ad9b5ffb3abaf6478167b3f9b4f2699e094fd93ec13b2334bff78782bb6e7f4265d24c1babed694b9fae4587896218de20b88e92e01cb7be2e53e027e0525624ba1b1b0364a6a4ca6b49f42b0357d4a76b1a54e0fee0970174d6c39261bf95ef66e7097ff3669df425401d390d2e89cdb8b4d69946802300e121fc86c441f2329a1242a44197bc6b01ec04796586e290445ba05669a9ce6e0ab72bf094afad36521b379a3f120f790eded52a317a3af7a74fb55a9661353a33e9096eb4ddead695e27e3998a6c01be35674d28b923c15901318ec5a8d6bd3cf9b60a65680d3bcaf0281c789981a5c5e1cd6bc32eba03f31a6a11c3a30e2d336d56ffa5257077889622b33afe8d2d0e2aacdb17314d5186793a3d785983c4f79d755310b35fd5d20c3b6b6cdc0928b08e16632512bc70a29b9246f33798078fbb5b94e01e427b857b3f5b0b1e25fd3ddf6b443e72ca25af464a54900e210d79f2394b40cdb5b3533132479b67d3c34de31a3b629e2c24837b4dd9d4c811573e2abe5b197bc5dd72385a2580b", "526a5163006a5153", 1, -1823252297, 0, "7d42d6e22d7cc3fff4171e9463d90d0a2f5bb35a393cc400349784bfafe8c338"], + ["a5f5574004b356988258060dd79fb0e9e97a36faf9e1eee14e2f61a460066b8fabb61ec753020000000151ffffffff299ee8cd8414e880b4599b506eca1a4eae6816b94184b0fda9a262bde350331300000000096a005352ac635353acffffffffd8dd747cc69fff77e2e2cc800de89ca51e70409e8c27fae72aecff955f141b43000000000651ac52ac6553f83af4b4588dffe191bfb5ee9959b6dedb9e573281613f98612998b5aed7564e037ed438010000000028ba19c00251ab240100000000005ae134030000000001002ac688bd0200000000000000007cd44a05000000004395a5d2647d6851978e823be24f468c763dd3d2361013f91d2937c6ef5a627fbbdf708249f04b554a22c3089ed30fe94b06774725dbab5c71dab07488fea571fa50cddcd2198cf4ef6ac3fd8440eafb8a125ee5c01da6cfe08857567022472a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ba4e7944f6887b9935666c50ebbb2c94b6fc66a4725805116196b9a59ce1a837fa78c72df2ce0018459fc65948c1a92419e740d74dcf2de8814f25ccd7a91c759b4304025304142979e6ba1c5ed507605ecbc05eedf45bc41f119e071cbf52d54270d1e04d929ee0b40ac526b298eb9eebd58155a35b6374c432d621f33f0935031ea4f8a43e45c9ce48b8c73310dbeaaf898b199d6638301ed9833e9946698236021467ac1e6afde508c9a22aaf7eeef738eadc745215af58856af47de7c7f2f6e50b064959b2c8fb21acba86a7868eb3d3d5e2429120579c9fb8fc0fb4bf60a863c8847a51dffae717104ac69803448d0a2c336ff2f8c1d1f593f387a8d5587eb2d4032839d5e228e99a0e12e0b3f096d82565348df6da29c309fa50d7b8b98ead6ac90208f2eaf23bd083bc9d089118f33896bfb249a9f2c4f78a3a866dc7a9929b678203199ba3ed2f5cd264c530b080c38a30a5b66c5fd6bc324b90298065d4cb3f9acf03184caacda1f5e411ef50aa2a82a0f8841b1e51a05e115e86682e24563f095bc8030abae56bb12d5496cb0149320161a5876645724a9117b099dac1e24a800e1ae40bc3b3be58129fa3bffb7ac8dfa5054bb0b7cabd14ab6403c8b26c96ba7dcb1977a1420012fa286c27bad23c581cbc1ff8525cc1d0e7dfe5caa0e3fcfd204c1b18bc07d805a0f4e14926f8bdd69fd5809b55e65ef9a3ec3dd37e2e532fecafc9ff8e626cb24d2ce133368c4bdc6086ab3ece0997e3ba9f01dbc990e9dd79393fde301bfbcb9ec0a97e98a5081c91220362d125dbc5a09bc2bcc6fc26caf795e0329cc4b2575e7bc2f7399b0ade6d68da7633c5c66a404b1f1e88d678e3e4f61438a9b0d32a79674082652db8193b618c38602379422fcab435cb4b52865f3964fd9b336674ab76c4e23bc7f1ae8b2c6b9e11b1b8f070bffae1aa3f96365871151129d21793e9fbfde89672e296c77a7eb332e616e795ae1a1a5b26568121d36e5a394ed0736db15ea34fb252e72cee182bf0b031932e4753e9127a580272abf8d34bfddecaf0f90530d75c5d225dd0507dbe23bc649507c96b9052346e9703b9651eeb4f42b93ecb90469aaa21724ae3367adaa226297901a55ffc910e89b984db6aded1652ed10836de47e8b41b81921bda8bcef526f134454dd5220a20f827732a334a747c444a59719a619d2175a93b926cb491f61bb4aaefb21f9e1ba376ee9bc5bef8ff250f75a43f8591308012fef0b1eae14f63669971e48b605302daf95d0b4faadecbf9caf15d1ccf971bd1cec7012eba63002a91f9120523d064bf4d9b6f78e79e4c306f6763763118866578cc5884d4f04c221cb98b6645af4ad4fc9a4d05bdd6d2cae6e4a0d895954e6197b5f997c21b7e477dfecab196df0b162eb063d4b8486cca3fd64414e2b2e2fd4254ddf66713532addf1f049875ebf7576b202c1199d854562f8134e65107eec6835c26bcaba45660574ef0af525e9fd0be47738b00097ca40a2dcde34cc778594f5b11191736b3e4f7eda55e2fa0aec57ce622b13d3f182ddde1ba5ff682b98a7ef853d397ba677d6767cebbf51e6d3803741ff7bb4edb75bd2509c2ed65e1a0b91c1af5eaae86d5bcf819e4f836488ad41dcb53e7db2315aca63943e5d4d6402bf070c81d13c3442a94068c82d89fbfbf2f1f70bb3625408dadb2f06e9d86abc780620a37636110878404d6fc1a7f8da393610cbf4e92a66ce6c2cc8206b709a4143b6283cd67cb66644b5d7eb2cc52b3904662f0d6f3d13ae5c0df721631e65a8bd90ff6ca6280becd8d5bc19929e286bcfebd96c2a4afe8d03135c22c58aa27e39cbf8b20101bf37d097ce1ba7067156b4a066671d67f63cf7c08626cdfedfcbae4693bab05a5446d727285f12ddd5979e11a012b53e2cd7ba4ed2d592c5bf33ad2478997beb387ca13c9e701733d89e0e4b4801bcc5792697df762e3c89f40c17c33ad1d053249398b9c3fabc81d1c5029943038c8025550e22420c6852636c65c70f38857e20ce106d6ad1f8153577141b7c90a1c9e859ae90516eee6281d8d01b33088f68fbd4c17ed57ee9066cbb71e75f54772ae18f4e24ddc3bcfb0b42012bd1bf501c2c98474f9a99f8b83dbd8e045e4a087af5481c975a9007317b9b3aa639566d7b16f49896feb6673f88ab4891ed32246af442a76080c16227e81aa75735da6698f540dff0ebf2ae709a7ea0e7cf5a8000095f9c01027d2b60955bec66cef5e52e8ea63d1366912ea37c4a6311e7185f703427723eec2e22d404f10000000000000000d0688f0400000000074439289e9d9b0f20ba1e105a85794f67805608dc169bff35b3e5c64150e2eec75fa37f7733b7daf15f3df4c1df457a85e2dec3d860593d8eb07639d1b68987a05e4edf0ac98e0d8e8d439f177e67ec199063b2efe26827748b9102a2aaab6400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bcc436595c97fa67a8ffb9c41bfe3bcba1a19f214981b34b6a57e1908ed0cd239edd73e690af0c56ffcea9483e901b9519f623540d36dd0cd81ccfef14f8d0cd31dc440a81e3b1d59c6371b53c5376464c7275efcf808e73abef80c75e8299825c6b23dbb18eedd43892a5342d68ffa22b5a0b5c4c6687bf63f3bc82da21d2cf0213ca4ffbe842d936d95148a32799daf69c3a29bea4a4a3db301a5589bb6083150313ecce2cf2f10a5b14145e281d09cc0c6594ea663a04e3d323841c1bff4996ba0b08f1a626d79240d9b26ad33dbedb386006771b50be3ab0c7ef06904f4491f17ef37da268970d338941c379e33b734d3b580fbd9f2e80de3b2b3907baab4e22510229aef1660b3574ff0d05812d1bb4586fe2e6b1802ea27df5fee135636322aa5b030e06ecde8b298488a0dc53c7161c7b8d84306c20735afce0f8086c9a69534d340302b2d2b8c9aad6fd5054154e1ff021b044bb01b3bcca13ed4f4d8f67998e4d47032ae2a44ca783b747a88009664cb2ce55f9d1682b7addba1a89647d7729164d410218d6af5897356d73c815fd84df966dae6729a7f1e0b7d94976ddba48b6765c0bc94182f0d6ea422e7446bc2f9245b524093a25a0749d49c75f4b14b469c4066e6eabac55078d186183ba0d55d3ef81d6c30eaf6b1467dfedf7d91caba011f5d9b9b7f80ba6a028ae65be2e51bd0d36568ba4e762b6e460dd6d85bea77251f1e1eb9144daf92fdc2f560b19d0ffac5b0912a12154f534cd320ff8171ee015a73df870b9be773f945eae56ff5e0946f0409af75b13e3279de2548a174f2ac7e44cfe9293ea189581fbc608eae41b4e1c24e772724f320abb238089eb6aa52649ca358b58ed12e48dfd072f82186a3797da154dfe9b053a2fc96bbe3675a7ca976214d4cd2a6c39bbb43f83f1ad455755692ec599f292276521406ed32c9da67beee7b64c35be107eb05189325901694f779d2df10481064b1cb0df450e08ff8b404424009be3432bda28e16ac13f86681a9911e03948054433c8b000c82362cf5187eb690b972af5012968388c4b736f385ab050bd438c8dbf29a26ac19055a1c29d3ca5be72c89987696c9b593f894f1f291f387b2c6e44baf0f53040aacc58abbdc235d5faf4d8e1cbbe644db8e307841bee9dbc80a5d33287570d161d502ed3951d136d78387391a5c2931a5e0b206be75f1f45ff8fac958ae8887e90c9206fbffa1d0e7971cd8cc288683369769f2bc958c96119b45dd1ed4e8bb31ec63eda7022c6062e252c99f24fbc6866d8f90bf8aa0cccb045b54dca1a45cd420ca5d15cf0a25ee9ba0de03637904fd9464a8aeeb224ae03ad05f05cff83fb113a1cc69f7dd575a0b0b2753837fa5fad7ee0d57bdc7deecffcc94a3dd762066cea930ec924872b40f7f80db50761619b0723a6cece1660e45eadcf6830b5e2dc8a25ece6e9fc29b910864a31010903aa15be9f7ec0085fafc3573613b692008f76d585190493d31ea14793769e5b652311bd463a0f8ac9c925fff831a25890c148993e713adc17740cc5da1e0960b908292052a10334277d1f8d642e420a7d4ef7bd6544b3e548f1670b68fe0d9fed3d268bb6a4d3357ac433fb8b6298abfaa413af1ef2e0e5b8c934a39e295750a6d728979c857d03b2ffe43419de7f898c062bb35a9b0a70332513b914e1003c4db2878f4079a28c2bdd7364cf079a1247f897675241032081c781d2c305cb85cb7b8e6a7e04bc0beaa798ef0fb8fd7c319d80a2b65d61547b3ec22f9126a53ac85c75261bdb7bc7a57eeb5b2303a1b7d996f0355c04438b4a69e803753d1400639e90a435acb3c6400c0bdfe938e81a20dd954110fc946bb45e9836f7b5db8c6494a6c180403a8ae35c41814bf08dfa1296a54eb9e2dbd498bb01cf79bf760e02292d38205f079fca7f88cb088b1779507f3088468d20aa720f7df3a45eadf002ee1b8d47c48b56b5a1afefc7c3a6d908a45e3692d1cad97828811cd123c17dabbc2367febafd3675aac6d967029792524679584fd2c7616474042cc811f940dadf9c608e79362d0125bed83cb93422f5c51b78d1904a34b2448ebe8aac943b1e2e5ac232779a87ebe5ec58cd832af9ea7dad01daef851299e8f2498a6887d551abfabcfac50e77d249602b521ba913880243b0de8a05b3f65586a998cd7644e811d4b44574500eeb773ba92fbd70da821a0fb96234301f280ad98d16141f4da51f052595b6d69d708ee46bb0668efe064f3aa86ec908361093a9bf8a67124c49bad610927b11c2f043ece2562c82103f1def51e771f7b0a040f4fb98b54acd82fb12b518d12087c37c7e9b7d186f3317a6ec5da7c93a72e0425b084aaa90065777ad86683043bf1fddf96e77006bfb849f7c0f0d97f0b6282734a973fbf21057a9c96c640d01", "", 2, -284521994, 0, "7fe3017e0c5d83230bf307e39df440d126592deea405f935c6aa3198782ff8f7"], + ["030000807082c40304d36cbf993062594685d0742a93d98e12fb4dccf6a3501ad7324865b07f287a900100000006ac5352516565cd86c53df8d2fd504f8da7ffd5083a8c04c3df6666d5aa42d3d6a00e50f475651f8df10f0200000006ac5353635300ffffffff60bfad8fdc5a2be6ae5d56aa22ab90baa6beff69d756037305a68907c2c4e1870300000006ac6563656553fffffffff8aec083b4b0c471d60b707fc2b8a0b0749807b9a4728e347849c9ca2734dfa9010000000853ac0000526a536ad3af2dc403476a1100000000000400656551a52d8d0100000000096353525353006a536a714d82040000000007ac5251526a00ac901d5f5f98b39e570348109a00000000000000000000000000d5bc1d40698f28c21ca6bf2a90e927afe20eab9b5257cff5de6db8a152b12cd52caa3e0ed6636b97c135d535f1d3aaaf291b573711609900d4ec7c5de32fbba42610b65c1398469ae0a3f8bb90de35c5c584fed4940c06ef2fb6829d064ac0d9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b27d877c0340e91f76fc88896aa36ef14938bae55eb12eba4d4139701554a8e28cb359a6f29cda83428a35b633508dae9570df62e252e5403cf35d7e5177f4b4e4ab4def3b81c774b021803be7421ddb2c4a339dd5861517844c87ede87520d90e3e4a1021ca2a75d5593c404eb582e77ce01cbddb00bab8a958cd685d2a5a9031e92bb204bb5883e3c165b6265da2a5830d5fc562acef247ce2facb5916a4efb0205f36419e6e6d1e9d8e942f5072730089c744bcda801a2beb21c8203795a1dba0a04e83bb24d1799020e4d9d6fd82f553595054de09e472bc8e61de8975b31fa69d2d38a682e3ffcf2de93388b9960124f8b792998b9d1dbf6ce6a8a3be9e26017030a2463d513343ad1d0c3eb0105bddf7043108deb18b47fd515e5a17c414bc363021753b765119e3dc4ee36654c31423c49b45dd5c71e2f5998132c07ffe6230ed5022f5b6424d003a73fbca7ed8c6a96a16f9812a8c5e62390a8281d338a2fd3702e020e84ad10442462fec0a5326230cd8a3d62431873873c0f9583eb147cc8bc996b0302649a704d5b96076c0301a7cea84e6c16e8a15c9b53088aa8249ce2a9955ae8e5e023a36559f6122fd5d89ef0aee39c9de31e6becd2f4213412b279466cf82c02b1bb688d6acfc243678e2687c6ad1b3f6c9e8060b35932ac62525937d0f61ea8aec029b99a58b2086c1a433f5decb9cb9ecdbf014695fe2b92351402e352948df34f600e9f59e4b2689e3db59fead59c26012887b33dab04142dbee8e26de34cbc62a13a0b1a09bad53ade526eeec07d3d70ac62735517167cccb7250a6c3230c2d18c26049a63ab089c90653ea468a44e5d9b826529da1401e43f86095e8d1cc36092b79aaa112899419fb1c6f0ba64653dc9a5d6e8b1b2b7db6725aa0d113498a9a7408e411219d24e4833201bb375f3e78cb377a5bc393f6ae58fbf417384d78275a3d394552048721ade31d363b9a9e12de432a5d8b18f4ef5e18b173d96bbe39c8c74deada3adf060f12465d03976c9c18ffcfc4d1d2b3095093e4456d6645e0ec2b2a46b4cb474e6c5760694a7f672731d3bc2da692c5230942158d89ef0802f41a009fbff3fac03f4fe31acbaf2d7494e348f3787131be4149217b6aee2c89bc13dc5fb1e108c73c0ce24f814b6b0930b24d09fa0db478a10c463fb695cfac99b319ebbd1ed672653eab7aa782b02f9d7c09f061c507bb82d54a332b3eac4e114adf7494891a6d0715823fd3931b3571d170825d6496d2543e83614df73e2a6319c7aec119d82fa87bbbc6f84f8f90bb2c308395f472383a49cf35d703c7e37a8ad341e646ea5b36d200f842c7ef164e1b2f94b77364549847038bdd6a1871e978c92ef3aa471b07e867efbd63f2f34b4cc0a5b1db3e19770862cfb8a8ecfb01e2b9e76dc647651cee6974218d807b5b4cfa25bc9a4b5779deca61c723729715c318f854dfb3a6e2de70ba5b9c5f4edf7f2d8884181a9e72b7124ac2600a7c9125970b3fa3c64e7c2e1562dafb77c9e7521438a3706ea5bad50f63f6789c2d048d20b1a6432b7030d6b336f7fc11d3b2b32a11d42278d4451c9ce18d1ed6781a9c9586ecfb0e234052e64639683f95e9cc943a0915fd6c4f8adb6579f8141efb6287d3841e8403ae580ac88b3f3295148c65a89c91cf0042d07a44b42d851ca53107c8a038ad37f8a41284d55971012aa8a3979f6d22188ecd9622642d58c309f6ab7cb0d3b34862e33ae11820c0449878504f3886acbbf4a7a7469d36dee2339b4c1d1c2899aaee7596dcf0c107f79dcc608c9df79b5f89c8f89aa54a1ab35b204d655ce5044ba709c6d807dc818ced14c2e022a2c5769c3e3b98608b46479d22fd459e6bf8267e819c2556e502ce5a1121b1150e09eb8934581056ec3d22b23dd35c75d58182bc1c340a8bb9986f839660362b489d9dc6412bbc98d54cd27f4018cdc6d6f321b25138cff20318e3eb7d8851e5548b3d60d385b3011a0c95ea4bf03d181244939523e58ec9bf3a0915791c00a19e1e3cc3d70de231b52460ee62b03c5f8e33ca352c885c68102a53a38099809faee402281d2a7d805a90b5717703daafb0949a29dc3db04af8476fa2055efdaf3d8e70a270fe7f4183a9d889eecd525a26d278a51199fca6077f8772da4a37e1f7d4319930fc53e5e886e7610d80d89e47cbd0dd05b65b1ef218587bdf523745758a0d14fffe288fcbd78f0164f3363039df005e88837f9a57d94895ab3ffd1764f01e6c854b9c74eeaa8bbbf3da22818495ff3704d14a01438000000000000000040f46b0400000000825f5d958e49fbb1017bfe10b13c32543ac767039f3f8ca510cc9cbaa3278402f270e6241038f134799768b5f6e6f0a08fdaefe849fd824cd00376153b410d24ee3270f4cd2d314bd2d0fff13083ad9f43b1a079ff00d3a45cd077aad2754e4e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d8e41d98738b91b4f5bb90ddf411184a97ea213e45c812cfefa85009db273294d1908e2003e5f544271cfd96533a7270d3589b5a4e4b709d0eede8807e9057839feb2f3bb48d1f4389a1712a1298e06a7da0dbb397e9f0ebdacf81f9cd424e6e53f7c031e2665c6baef1135c163176d6faef60319991559107636c79b44500a03243a4bb7653ff3d3629535b877635468ae4b08b8723ff25981cbef2f6b5be94e020f4fd9f9d80f0ae5f6c0f407fe4cef3c4f1d6689a4725d3e4f0e093fede8dbea0a022c67adfb83c4b2e65f583caf5e16c2db2010a8c5fabbeb109261746819a9a580fb463e5da5a4b585ae1f422d287124e2d9221f63f9cadd57e3430a66a1de17020b556b2e8c2b852ce82df4c386333ea87b0f7f78cb0c1f639bc20dc98f3b52260304be23c902e7f2414403ef63c861b2da0d758c95591286ad34ca849164d87ab9020bcb3b5a22f5621abbcb63b5ebdfefd7d8c63ae8e62ae093f64516d0d7c2a843031d7061ecfd71fca1cf1da21bbdd0bb134c280436ef4cff173ef358c8c5a5445f02294cfda11e8c356eff0014fd23c183a47d372c7052216a942b5d471073b56fdcf57b971569fc33dfac1916f9c09181d5ca40b9266c2f60e5e1beaab8ecf66aa0cc84a4e6b09a1230b88ef4dd4b03d0afdb008ab0065dc32cdcb751f5d84781423799a307ad241526271d346e07ee0d910ca4cf1a7fb5cf1cdbb25d03f61ada4aff83ba99b9e95946635287bb7201c4ec84be5559abc2fd0520e4c2bc142a54423575e1c94ec91bd520bc149d65186ada22f634e6ee4a91b72b3286124caf35a5f9cfe88789139fd60de9eaaf9ce669954932bb317b23695ffabc18e0175487ad6d71a938a0c47d90f03dbcc0d2f066e403ecbc445b7f44f4935e00fb7bf994b127dd587a1c639fb51aafaa9a62a791cebf5a69653599711b1f370310978b20fbe1894df6b6ab8ff169f27111853e2bea8ef13dc3b47cd5a8cdd0e185541fb96c21f123bd4470062a5c26b3636577ea504b254fa581291732cf395c5694dc332fe72d40365892ce78fe818967a64317c616e5f2fd173f6b27a5497b1d71f1a2a09f917721e43e9b5c895ca2bb4fb92bdc0dce3efc19b44c1d630ee300d0af79aa0a6edece65e846ef7ec009a1ae4875cefb0dcd06a6c048ac5d4a7c62fb1148cb633975cc1653cdc81d93e995f2f2877164f225b785fcf877cffbc58fe2083bd4e3fbc3a780ac85f5cd6ea9c1ffe992f5a42cb179005fc7d1222eb138c07d3de49778984e91b4c3dbc5a080a781dadad800b93436aa6720f7d05cf51718aa1cf96ccc9ba0692d8e89ac9a716164e67063714a732dfba025dfe9ea622481e1658e6f7c306641ecba51b1029bf55b10775045db18bc65034faade97c0808d81b2335cf68c632cda040a48c808ab5a60080a35ca0c142c074bdcbb8ac3ca4eb00235bd0744ec4e2f91e4c7dfd01d58db57e93f7678942775a57e3aa460561b1bf7942eaf43244bfcfa5a437106d6090d1f74e1d75de6b1582a1840ce4d7b3d516f59955abde222240a428da22482e942ddf92675001ddb1a390c945aaebc696586434bc44235b1dcaee11249d787ccb72dc14b67f77ed6f749f5941e5f212b61e26a32773322d3b04316d35eae9ba3d95bbd42dc75b265ce37fd70e499f1f57c2e4ba427b3f8884639c80a3e2268ee8c6c2213c6217c64ba1796fb1045b3dcaa3a444ae5d87790d2591910f65f7e6c95587b8fae324865653a87a457a859a19a438fa5591e6ae7aca26c59e6ba589100cb551405757c473ae5647ac6a25f234fbaf6971cc898d2a6bd4ae73663448da26c41b32bddd7538caa7e12d564b71817422a38967c1a2ba3ebb29e871fc7b687109275d9397f4748957ebcdd3a5dc883b6ace482d403482fb6d208077e7de0d2d00e3f8bb5f6f7d3e436001f942024ac44f4ce7b6b836009875b31f21b4bd47b2b28a1b654c407db0283385682539b87c7932f6f145e4ef0d7d152de98de441ca14fc0d7cc92636081c63a71b61e7544d76b90d52e51ccb3d7fb334d02f9d86909b322ef702065251add916a71267eadd65a5727346702ab41824bc736e2325d6c27cb7bb69aba32bd1a47254cbd343d1c69b48c5c567c121435993976a95d944c81cb1a1bd22c924cb5122e7dfab70c1869c0ced57d0af003cce527da3165e1c760e242df10e2afebf738b473b04d65844b8c289dd0c7b15d55f4b35247fc7a6bb45c0e907156322b2a819fbdd1c9138dac55f7f7b9f4ce27b59ec9c31fc0cbe891aed10fb5be020000000000000000000000003de3f97ccef5232300b0def2c952c30c2bd907ec6a59fefd154a07eb43d400255aae5e249fa6a6a02d86cd4a0b93a33634c1f3c239bdf059130c0e7c2107b3548ca68d943499ac0ced0cabb7a9d6b82341e53958fc63e11153a54044ddefe81d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dc2f6cf0e012224ad7494fa53c0dac3e98cd755f558b1a9f55c27140ff0da73c1d3c80e226997b22d1610daa9b5208582fc29da335c777458c17148308a19829205791dd3c65e39bab3ebe161dd7bcbb9f88b825b3ce86fd62b6c42a50a995abf20728cc839bef8a85bcd5a3b2fbddc61c932a154926cb62133dd969d1e773ca02133bacc4a67dbcbe3a2ef2fc5a25b1b83466f1630150ebb19a2d09a5daa0c20c030deb141c2d0739fbdb6f7182a06387a9754becc5f7c106b37d48e4e8a89a42950a084632a8e1e69558af273d4933ebf0efe2c91aee5db9ea2b0e3ffd37ac5463b96e9b845f37950ba62572bdc49d5473bdc001a98941f9d0882dd3b3b0245935d703288ce28a13717b6026d5e1b341816950943ff1958350aec26b1745077422ab1f020077490e5e2f843994950de0b22f78c870e4e0b1697928ef231dc22b1212f6f80311771902ae0278b98654af2642023ae50d63dc3157e22aac53f74c6fa4366d62022c8b28ee36e118401d718c2ec68bbed90923a2b02deabfab8014b82b9022550a031e9851a5fc3e0bcd5c75731f9ac39d03b66ce68a49ca1a155ed67c58f3e828153f66098a022215c9ec5ae24d18e820bcd6393fe652692a3f59245ed9995b872156978ca2bebe1dd381d55b3b266e357c5721a91097f5db198179255c188e9177e78d2a1a25bbaf30f516ea78ca454db154e6489daed6452a724abfef7db36be025832aefcb69b28470272af65b94b44b9e04706d0aae797d96f78e7fc95fa67e79905ada1c48bb318a6ae79090b239b83a365d320a137a4a74bdd4e0bddb39e7ab74b96d4dc9b6d28b12bf0e9d96d36019905477d78049f9e6e6e3b7d3c896a20306cab6166e805b8b88e2b60c5b97db0243712934e7e4589dc149113b548f0099d536d8e842c46db96f257ad939140afadfd1546031d2b38830aa70e1d8ce76b85172b55a9dcb72aaf3438098bc417dcdd76903df5842079269e179aa3c4360d76990602b4a5533cdf8bcb8d01b625575e78f0d8253a9eedd8aefc9928f7ba488846572c8efc298605c60a97f316363371b28121271ef72782cfbeb35f54dd27da959d5b3e18fb90452846f83a4360e6a36cf6867be8f5c089e1eb2565e01523b6533d17a740ccdcee9c20368daef2909d9b184b101cd9a25c715da8d5605e5b074c4504ff17d97fea9940a2e41381609e717e182c4119752bcee716a77fb21def278ff0914c894e8100687f60458533f429572503462447aaf593a04f480f9d4b9d22a92d44143d20a3d5a353c0e30a92b4adb2c049083f4c8d982b19b289d5b6e6b562d95f44235e546ec4b2c9199570726e759c180d858c8a15387b00277543fe622a8be98305ed87675130d288cdcebb95cd8e3a97edc6a60cc0ac4dffd8f093e09bde3628d5b04db4be816ae91c7222331c3855c6d60d41099e30326b457e84bc6099dd173f43942864f33473f250e39f8b0d4aef80f19e805e2e4836cf4596a28bf9facaf822d33b1eb6fda7da2f86314ed1f1da84d37650fdd9a6f84bf837012823de7440ad03264af7c56860c2ecdfa3e07eada725cfc7ccffee44d9bd0764a3820811b03a5002e12d9360bc0482e929ebf16faad40f9cbb3e4790bfef24a8e6c7933ccd9b074e5f15256531a2dc4740da894f4f0fde5ba6e234da1ab3dd506cfbbf08bbd75cbf8cc7e628006b53562a373bb556b35d5b62009e5c01bbb8ceed56accd8fde2818f5f24fb36ef81a2bc8f5c81a610fa0db6415f31a6c920ef50ea4add8e574bc4807634cb0d20655a3f38949176396026183a06cbdcb30a89b0a5c983ec1c58b296d59b12d366be0667d993688064d915e9be875c19a6595d26367ae8806cd7fcb463e00941028ca5bb548e33d7aaea3bf75b770511bbddec3b2ae8050ff4035292d1e91fe078208da176ff50dfaaf442152a7408eae20df78bde4ebb0431dccccb4c691ca4bb4c24505d73ce485fef438bb3472ba2ced235ea4d16d4250328cd7e4c4a4d3105533cbf1b3962d0f3e89bb48d983bb19e1065ad50bdffac692d3b4f0fe89e5a62709fef2507cf19db5c9ec939bd0e690aab19cf4679d3b71e8290051b0da9402c344e5ceb3dcc9344b0bc4ff2e1736d7baa1de8de731f7bebd5ad9a04e2da13e457501dd43774094cefccdb395e2fb3df15e189ae3b8aba8122fb0a29b01c96a4e7b8277d22ce47a761a6c49ca92c8fcb6cd568dbb88066b7f7946bfa913ba97c248cb1161240f13b2f46f427cf628c7a1a0153d6824fe20e6e059212802bc4cea6734121e03a1d4824b85d00f07a9c226e2fb37bf1066ccbc2a6ea72424ea7b58156c7ea373e65c8049dd8aebea21a2312aba0633eb970d3ec85b13c7bd526ae134d14401c5afce6a52dab06d4fc9b1c8e692b65b11734b8c685590f91713d7205", "53", 3, 1653385265, 0, "d4d06189ba01731959fe3d138c7c413d2035ba831b7b4643066c10d38a42279c"], + ["030000807082c403037b57b295052b89835ca7998305c02360b2f422963d1b522845c175fa08cb86fc0000000004525352654cc1cce603ec8eaafb9aa979d8208f323b5eb9be29aa9d4cc63b03272b450cdca83f748803000000016af634d7e06273484690067012fd09351881565b0711bdc2dbb97f5e29c5ccbff7c16a3ddf0200000008ac51ac656a51655128a8376a01565e900300000000076551516a52ac652efd93c4000000000100000000000000002398ec0200000000f6562920ae95fc5adbd26301cba3cebff6227bf02627b366dac7e15cc92818f069790d78df7b658443b1afb0cb1378616bebb563bf77635d9be966228199ba0c9a213a8856cd80b9f2b1a048bdb724de20b88ae031c0f6f1bb2c4b59721252510000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044fdc54d150d5d9c4b878504ed4b37785eeca8129cc9b275dc9ca0ed94a6e2079c9743cae721c24648e75df2919955ca93caf80ab95fede47f711b6374a959503d57a1c55dd4b6ffaf3a8c756e4134fc9f124f37c7a49f5467ca643a2d9f28bea248f6ec1d7877c0c58b5606f7a0fc9ce2e8b846e4e2b8dffbaf080dbfc7e704021aae40be3fa30e9a0ecf3ea0b3e39fb64895755acf06fb20485759064be7f750021a2fa64cb24868ec253f1940e12d8c84cdb0c902303ca0e33d4ba110eedeff500a00b7a29d8689e7ff47eee7b8bc608ab49312928d8233f1042045fb58d91f085d6434849f9d3eacb3de29ae2c07d445938d5c895e98a25d1f8066cfa2516f9631020350f7702bd650009d15d4f4ce9af4ce16c713c1e7bfb3cb15a2e16a82ae06f40204bdc6092014ce0a1d21ac34bab0772c9f961078a877b22fef124598ae1e3f0803113a8751d30382712a25ba16c32950877f31805185aafd4b07ac37d9bda2a5ff032bb23f5fcbb5b6ef7ad707e1fa9554bac2435fa22fca782f5f07d6e09e560c90030640ca419cd5551841041dbd137c8346cca5fc9ff27f052cc52b0d9fd20758685966f73b5c8ef45129a71dede3de0fa5a12b16fcd2b5df37692660a31a8df50d277a7cdd349fbaecbe6dea8332566cdd9adc1ea098bcc57eac8efe8829697735f006fd7c2b1a9ffa04a55f3171660beab2220f4fa99bb4fadeccdf795d3eb03bc507f22544f69e0947cce62503f8f6fca6b472505b8c45fc2e57c0609b50cd38b676b27b8e3165a87a9cd7c1e90e7d6f28086db9535fb32bd246ca5d44b0115437a119ecc23190edcd99d94b84a9a162019068e81be71a0202db4b2df4d614d07dfdaccf0669b11c27374299be5fd221bd483ca572759fc54ea995e8bc0adf124b03a4b195cc8838c8242e5d7d5b8a408c272e59934e99e189684599ceb76f554b1d76dde9251e72685e6bea6c0762d56a084bbeb278363911f7d69781ed91c0e7b1282c1be5b15b536efd2f26d40e2412ca6c0be7718fdc9f7636240d00187914a10b95f3ebefb674d783b37d8c9b911a23317e1c54f27b335161f6845ec4c5105b3aa63829640696b687e4114989569f9f26004ac73a728c4d2d9e2386d9eb23298c357a090861255081185d0c62cc3f83fd11fcd83dce7067422d8af8fb4dd3c7df1fcb5ae3d3b25f607a2c4d43fde5278b5e00c4e6959ad6a1dbeb8647688a9225480517194d2b7ac13f9ebbbd45af7c0f50cde1e873150ead8d5e92c421c7b44aaa7769c7524291011597408d0158435cb618d822a9aa03c80c7e77b551de57f899e4b0aed1b2d29d7d7de8c6e5516378a911c0b589c6dfed18bfc42fc5438533bdff96e315c0e509655ea6783916fd63017db9f3a3bc3e379ec40ccd377e8972e0047f97279d296afedb8dbf211dfa848372f9daebdd2a810b5e61750896c62f56abc7c2d338936c818e32c9585b848e4c4d443edc7a50eefdf351280fed221134bc7300d6244c9fe7c5e482e7b8c50494792a1297a978465d0c5ca5b5248a26efd6460950b6d4d54e0e1d54a52cd3e7dfbba2ed951195238641ec38ff2eb74648c6c5859f6f65c9212ffe792f5e72fb41f4f9e69a47121702cd70dafc219015a24e268f0bc7f875e0da4d54dd2db6908c74672a45adcbe0f3dad3296ac05d92e4f409f962fe6518f5af5ceea5361fe89c9ee6339eecbb7979cde92bededdbbf007d916e7c3d3d8e1e0054bb98d97ab0ea67410e509ddbe4342fc47375f160dcb44bee1cd707ca0c4bc026b9f5406463732a41e074dd68f712e53571c4d30c8cd1f22e9780a316c15fdb75d865137e55e123afdccc36dd5a2ed4eea76a35bbe422b2de93d085d8faa19e87985f9fc16cbd05d72e0f8f549489334ffdfa9ecbd84d6fde69374851a583902604d7ecbb48336be3e20de2aabd5c93de3bf15654c18012b0b682c79e980799788fdebf586fe8366f3c7cbb3fe976569991c0666b0221e692caf377cf1fd975ed2ab2f33c5c1580352dd881de979c2527cfb12ec71460cce22109f850f23cf99a19f2c81e49eb559096cea20856fa3c361383d2926d425e82e1563a8513cdbe03407b02e76ec52e42ba531929e000d8794c405ed76c2cb8f101d69d84ac7fe619eeee4321eded840ef780c4398df0912bfd5d83e7204dd67461f73c44358639ed32babca5f3cfb7b60e7c10758e14f27a89e3324ff37fbd04dc95517b688e7818685808fff61d787f3c2f72fca60feba92de1cb5c0d36e0202171790e0ae6babdc6a112c7f770e273aad515474a638a2684206d90203da6471bff69dd30a11fbac48aa6d8bfa3bf62fd4f871c5532f3a464bc9ef161bee33ef0c0dc1e3d4762174df17f45a6233f26873e7b769fe48c8877b2ec6e26d200ed3b3bc7d2ac9aa1272ddda002", "636aac536500ac", 1, 1105018156, 0, "edf183602cc4ce4b1b66abecfad5704510549334474464d6f91471dbb1d9098a"], + ["2da9ce0b02708168005283914d3b898be92e3f6911ebd0a3e8f111979caa9ef4d5ecd9551501000000046300ac53996800993234235994b5965b75d7f65b92b955e3aa10bfe32e42d86e51e4ce0235a257b100000000096365ac6a52636552534e3383600163ca270400000000066300635165530000000003bdc39c01000000000000000000000000c28732861b37e0bd678d465331d3589a9566d7dec95ae70e3bec60d5cfaebe85aba2d03b4919e76e4c433de557d8c1a90f29f215a4bca8c55756096655e48a34bcc6c97a90dff1d1e960afc423fb40bc3e7b76029f744a9fe33449b98d6232d400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dbe51bf7cbb5463f8fe61b52911f26bf4903fb89ddc3089261eeba0ee10c80b4d69565698b01c2396246055d6cf8332ad70bf34a80b6f5d9e50e670abcdbb2e37bd85ddb2ff01374f150abf4b2bcfd3d28c5348f14fe1a22a8acecbc4f8ba74b3f3f26ebf6bbaf77ccb8cda3c58448734aea293d38c6fe05336f5e8a11fec904022a9bb4dcb4e529b12dd869aa0b6b1c417f2e940afbd94ce14a42118a81abb5cf032ed54b17b9ccc3592799b99e2b04924dee6992cd1015bc77849d9f5ecc43e4810b0733480b7ff6af8df47f431be84ac4bee232ea6749cb94614d0cdd923ccf30dad72998643d7304297ea18abbb2e45a29c037251755b642aa0544951d67d02dea02164114cdffd36ee905c7ca4f9edd4de7c528b172baec5ec508de7dd98f1b95070203d73451b9037773b5e1e7f3946156b32ed388f98e7d063c92209b5306460478031e7b00ea428ecc5b80d79401fa8ac4e85b83a2b45572faf0423e8abb680b6ce50324718a8734857388eebb91244254efd52106f5ab35423491e3a6dfbb78b7d5ee032c6120f0cc20838be9004e4ac94e65d42035973ebc3a5d0632d3c3515b4606e46d57e35375fb634c05fa93098f2b973eb1a47b6c797dc5f1e0f844ff0032e5ac7f7446735677a9af3f2fd0c97fc6d5f13ef0e93e33bef02b9efad393f86f88a4380d551dfd26f65dbcb0917db26729b7c52776aea669c6a723ec957615b675433a603aeddca282d8db310d15a1e87e51f68ddfa27e6f31e11382ab1c241144c6f9e6c38e5e90465ab6632404efc1fa30a26d609240ca9986831586fc2c14a2367b18e17d35ed046df2876f42c5b7a5516741cdd9f283f107c7a01eadb33f0a688965471029c25dbfe711753a081d9d75b47d8a185c263f696db1d0844019d9cef9d2efc1c765389996d196cd31870d87dbac81a5e6e1d7940b2ffeeb672969e171c2c745b1685a0fa326a90d1695a5d893a0b257fb6cbc80876abc418eae98690ed1ac1948fe74ffb27345fe1b965bf4f6621e700670f975579d2d7f1f282d4bacefa53d2790a899290d76bdc32b24e6572286d22c1836bd75f69dd2bd60e748d420ffa762a60fc0ee3f2fde9ba8ce14779bdea26eec25d1f4166c3d46c8549b40d112887bc84052acb0d4e520c930b304bdc68659d5d260ef845be1711ed5c34ad1586e04815e64efd2a06d0ee0f35be281df18c267106065b8734283ad4d5b35248b53a099c02f0b098a60c6835de8bbf7827979b726faa5e3ddb7d5b01c992167394e441184be98608112b6010802a57f89b1e31c576e5588737a26f0a6c21a245e1d3ba52f19c60f4902f8e79a62ac274aa97e4bd96372eb4c4058538cc50b7847135ce5fa2d5577bf61e72e479aef06d84c7af52b7293a45e8f2c99c151bb3eec5a738256fb359e22bc1dc234eb458f6b41f9587cedda210b8a78b772459b81bc2b0dfb3350862a20438032829d745131dc65aa9637c278afd8a742440d62cf04df854819262d66ebc4aa4d8a7fcde3dffd320e395a1a9017ce083a616146acede378bd6808570af09b6588e8a5ba0f1539291361a88f296ffba227bcd6209a3d6bbffb4729c51172f5c0f6289fa4f9b9c07419f22df4f69f3de7be9edfb4b06b1f3c2d1936bfcad8fc434f4e8a83d97b4f3f414e27dba7fd1eca3ecde31636c9676096cd335cae9132855275e5a92fed0412783bb72fc846c612d19244ebb574a62dfad6e0caf3f05ccde2c03f23142bd54c8d30554f711958efcf876a908ab1da4d577de66626417682778486e4543a5dfe17fd0994a5392fbf3c3826188d6b0fe065cdfae862f0375f84b85df20d25bffdaf26787d507136eb05204d36beda5f132d483d18b23d8a767daa9afc054a4720ce1ef3b8795aa4eae005bb8cd82e67409febc7474fff5bebdcb6b59caeb96eb7c47fd418e552d18a67566aed24c15275f6b6903e12d0b961605cdc8e79c8970ccf72afb6ab43bb0524fc8bfd792456f0e680583bee387532045d76cc6af16a3faa3bd4e0c3d16cddda4c28508f4f5a44c6ea874b4654adbc2a4e2ee47afa6fa5d5164645114f82c18714c933ceed2b75b132bcc5cfc1d270446e153c4e229217e7f8662896750e30e1e08059b30be2b31cffca3d50c8303b8ec36ab48a3b526fdabb965a1277305a19d34ff7339920b75365c5eb04ae3bb682dfcbc4201ce9c7d0a181efcdd2dd7b0dadc08584a2a930ef001f8d36ee5cd093423e7c028c9c86c80a22e0ff13f16314cdb013c4b5d547b63cb18046f5e214862523a51e000000000000000096b7cb0500000000ed5d696d990dae5f718b07c0c70539b796f72c18ca5089395aa284ed9e62c8454b8914f94f197924e609c99bc72fb10dbbfa866fda36abc6bbf1281165195ea7c13c2a15f94b473bfbffb6cd418d963096fe7956cbf54a1d7881e19fee5c9ce000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ec687f73d8ee2f3d2ee396ddf771032d384d3aa3b10efc08635a8b5ab63c2ea991a523f4e99f8ece6b26e9bba13032bb5a7fd9289a279adf9cc9cdd875515152d81c64ffaf8ad09b00c0175b424c349aa74377e538b711acd87b6931d31d48eb702c06c0b359b9389a437755d67fee579a7ea7b79db6e24e02a8dc5f3ad22f5f0222d12c337373dbb41ac3c2975b420ce58f618e05f264fa6bd60be38b4980683d0302ac362f50407e6f0331c577d985f913e1de523880758509b6258ebdc19433770a078c2ffc03cb9ce464b1605e4ab5390544ea6f57d453ebe265e21ee281ff9bba70cdd81a921ca6ef449c351982da151d9580c43a3f2358f42d316cefc0636ffe0315bdc225833b35480aabba2276741318bb1db320d047c27685f0675e3be76391032d7b47a7ebe30944284018ab384f3fbfa7104a1b1cc02a98a3ef3a9fa9faf2f70304cff46fb9debfc3e646d54bc52eb8dbcb1122544a10935007d55253edb39148020d4d121998eb434db1a3633367e3946c5a2a11c9862229c2b91abc8f76e2eb0c031b3fa194b6da15e4a8d6d22a03947c06c3ca81c8ea0b43b68010af5a110204198d445e7a57e50415b9e288759773eeb902687f1251d574a916625b1262106aaeded36e7c6d3961d9002e2a0455bf83eb00765cca7e535fae8cd01be5d3f54e52b3cd088fa24a26d5d85a88b39f0403b8eab5405d42ce11d0eef665e5e22e3bc32bf2757df73b797542fbb256d87c66787f752695fef15853646b6051097b6aa394017ec18bd7cce0984bd3b1b13ba255df28a182c45bd46b1c5161275261ac47eed3a36b903225c173d4d03d48852b24dee37b1deaf829af7fff5e51ccf8ace4b874b4f859f5e678d9836d1c34630d89d8a61c794b06575da9064e378b731ba5427fc6867ca3b0887e5a6d4fd80634bf0448c67fad7a7483e2fe2b745dab189e099e70a2d4ca16ab28f3690f844798d0f24bf681d15071e0b65e2dc49fc664af490e3d7e3913d9b99f0c9faeda21867a569eea659474198d161073863c8fd84280a8d4d678269921c4b9571dfffedacea3e08bff6bd1cfac99d4f338d815d6c9f2bf4ebe3305b61ba260b5ba22af0457486f56ca6a6d514caad29b17b25529b2b9633a2a4b8fb09d886ce63ec107e3077af2e5f740337d42d0807759b65ac533c68b155a65453a8188fb134311806e914a7192a310c381da9e9c76af0937b9c840a559600db1c4cae8f374def65a898fc3acfb16133e0c0d0d96b93b33c4c8891873f98788c323649a829fcc734a05cd567073ca8aa91ec0490c4ecde74aeac2424c7616a68f8ec2ac103964b3eb1ef29382bde80ee4f40544fae0a9cedcea7c28c652f27b6f2a75c04ed49384aa41cb1f2ca12f6aa873edfca4ce595ccb9deaeb51f3e9baa4c5e94ffc729b7d0e1d710a01d62f4dc47faf5f226168f75d432a28a10194ad3f2ef5f747c245e67dc0378e5f7bf0ab7447ca26d618889076dff647274e5f02490f3ee82786e42966c6c672f45b01c660c1a0ea299b24066654ffdef1d2213b45939427aa023a11842048c28ba054be3e0db048b26efd4fef2f1a7d1d33d24c6fb596dc639aa7712381024378d8441b1c930af2427a43f8bf8acd801082c3203c04b0b37d33f232ca3ff04b2241e1de525cddfc9d27c93c673fde5c0f2adf837c1ef4641b07a3029c135db736ac4a6301a1ff552f5da69b44072fd25b33d39380a0edc0a3edd792facaee3548c53a2c692c0450b91ca87c442fd252bce533510ed7f04c2d48ba4b951e258f1cc680f5dd17ed504e44e2adb6a9d7fae068ded399705a6b7061c69b0af04a7a765a577fe5c766ebf529dd2d7fc0db453f59de84aeb9229377a18e4bb8a7c67f357b88f3090fa532c245f027797e55a5a6c933d243e45f9c2ba47532b9aacd33aff8f061f15fb7d6402d30fa9b14aff905d1b2b41f0788a4cef37f3bea5c0bbd938459e0576edf4d8f04f81cc350854c684486a570b46cac188b9c9b38444417e7cae4e37e5cc07384ef195027045e7315b1dac813bbe197ebcdd3e85fd24726da6270fd6ce779f00835bfc46411aa81829102b823e2b643c8bd3845fddabdf605fb27bf7e654b3b38d291c9298fc5a466c0b58694097571b329e49f2c56ebb34f137e20b27074b46671a46d11e2af0c6f5b3cdb5ed585791bb5105f45e31a2eb42f42b0621a2dc5147532f5610f586fec7c74d576f1c1369eb4f703832ad40ad373790e41a667cba97776e6c1fec112c8a16c9fabde3c22b89a8b560ec9d78e3106e08602000000000000000000000000a5f780ab61ab7c33f49719dca8242839adf9f60b24481e88e24202eef5a9ee3bdee0400e0ecb39695c4d949abcf09619f86eed5cc9c5ade2f3c172756c4c00cee3924e7b01448bc7181bc676ac572633d18ac2ead33f9e6b8a67039fd0931d94000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d08351aa872bb3d304a45ceb282450643a4c9c5f83c51f555623b6ba9d5b2ea53786ce30f0a84b255b312c9fe37edfea1ba7cc8785a96ef9ead86da5ef2d3d5294366db0bb643cc5782d20e4d759ed1f5876a5b4b236545d411887eee0e494ca35fa81742edf4e517fca3a881f8a65d8aef5eb7320b0e0608259f65e22a57b6030be9287dbdf1218a1c3b30dbea4f522516585b2e28e90533b4b2bbe82813c2bf020ded87073df96956d9ab4b94fc80ba4c884a9e59e421b22a6667e186d4b7fcc60a02bc2291203a4600ac79b6ac994fe5c265385d94d66d21c4329289166e2b2fca07809d4412ec858196372112b51dbf29dcb5b5e38daa937053e355bed4d3bc9a021a10edef6c4b672d831fa62dd192c20b3e90cbb741a67630f8e121f0f9e05b230219abab071fc914c0d3aaf474173962bd3f81da26db38a787600d0894334b21f603218a7722ba90c1e0dfa85f1684a4ae121e1d74443928e330abc4ce73154dc58c02254f1a64cc75a055319687dd24aedbd15f539173930ffc6338f7418fe822a68d020cddb0d05224c51cc57fa7b84b0eef18cdbc4aa3034266fd74e4efb1d8c17d31a5f3da967d142f50b3681283b2d75a627c32111af75831f12b0a99b518c8982d7c399ade031cc0c60727fc6e64e3ff3bdc5840e7397826cb3b504b40c855e1af1e541fab1daa2eff961ffcee01fc294dee57aa42c0a3cc9d1cade7a00b08875d86f215d8483f9023d3c423ef449741feae2c54e30e4bbc669751ea0b0edad3cdec8a096daba038fbde3576bc3cc23dffaa562bfe9b6937ed84c88f86ac94261c671e41927e6e7d254e13af309fc189dada077d5a75c0b11cdc228ce2d1bb5fb7bc871f44aa1dd1e249355fbea90fcfcf1f6ece2ca9b04dbc7e68a8efaf75fb94d68c3d81a352f2b44fba648583489d21ace516c9c9fba89e47bbe26c7be5895620480f673e0568d52b3fffd09341c2690709a04009ec9283902a659e191fb022a7bfbe3b5104f06f5086c83f1da74d26030e54770d67e1a8b301e50c0a3aa7b60710f8afff0b9d5b0a1a672c43af2b1f484cbe30f3ff26eeb100b181fea89bd9f88c0cade805d646f880caad6a705195ec3d90d2c43dc63a40dd304fabc8f0dee5db3f5c8f1076cc67d9826123d6bd6deb8a918f45134dbbe88e1382897b9f3ef5f82ec95d94b9cb7b3d574161f736f05235286e6e52058727b3f5996abd351bf0acd3b99d8be587ba59202f2179b0386766a15450ef163327a69beaa2a156e460da4b89bf706d8b8fcfdbd85db804adcb3a991c47aa233c37f4d277d433fe8005720dceea2103df3e2dd9cfc2a8cc50b4f490ce5036e852357116e5459cd4dc0910e4aef63311817126896581e104d52476e8a68d79ddde84d5df392bdad50101b98d97b0ca3319ac89ba65a3565aff4476c869dbcdede212dd02b50bf5b241e366e12724fcbc8d461bdc4b01aaae54c2801c06c5bc913a6a407e4199b94fe00d5b1cfcb99524b620686a2d25cd9c932a6f7c37d4616da045627415ed8cbbd881f42b0809b011b37de94f3dec3686a1a81f4d5815731e369977a9738689ecf05431891f569bae5fd764f84eca7ac79dc98b417a81c8200e086ca4618affa7c8da7cd0e816e5c20e767305c517f1027055ea2cdfb866a25f522b4b8c066db6a4fc88e760dc52e2ef5ea26a4b90ab66e41884de1156a77e167d1ca21f62f1e410f3cd0510b95fd8fbecd62cf3c2a385f44be5871133e43d55464f03c09e1a96aa124dccdf9edc88ed93491943c1bed3aa70d23fbc4f9108cc01cc62270c0e2b67387e971f6049cb53c0caf41307beadd2eeba36920fca4c6b9f0812fab91481db8cc0c4e772449211c6e0569caa4862c15b8293a0cb14fe531f644fdb36f5d5cca9823bdca5a598f287e3303c9a42df29e823508f06e381865f8de98266ca7aaaf6b3a6344cf0011b28f610a70140329eb480138dff3d349baeab8a17724da46f2d70f9f99a2d6a592eeb312159c5c9fc5f6e1b3844ca2cbd05c5609dd3e461ada800b8a0e7af65a696e6c6fd1a8d07db2f371389fec6bb7444c4be250e99e81f08afc57bbd6fd2deeafdf5f3b87b90f10c74d238d00ed7b6ba1d86c8e0ec1670436ec9e26cc20c201efd128b1351d011c606212f3fdc428144b7963852c2a8e3483100a3c1970de57b2654c6347e7af37808aa66748e4c40c8119c4afbc61df48909144356bf3bf9669ddc37967f5f1e3bc443892cf6b565c01e09acf91c90fa8006a2e30decc57ef8aefa52be1bc29e8ba9fcac3d83af60993b9c04622e2d8ba8012db45f9eec7b5de59f9e43f5569dfcb8602680c57465de5eb9053edf183c16474c6db933a6918d4d6658a4266a27191a693972fdc3614f07b916f86fa20ea021d5650491b803235949b9c88628e0fc06", "", 0, -268106367, 1537743641, "bab22b58ac219700144c1f8d239d307643d2238cd3468c867d82d6dc79c244ce"], + ["2958065c0233a80259ec0e924dd622efe89312f35d8c9b050c1d77e1d21aa093ab16405ca50100000005656365ac5140ac2777228ca8f680f922ae4c4950b23fcdfe43f5e3d4ad7d9c094038fd785efe83fe4a03000000066a6363535251e9a8c654027bc205000000000001ac8718650400000000016a04c0666c030000000000000000e2f97404000000009d04ab430397301084481e67231a6261c9c1ded3e74d468bbdea34677ab06c6aa6860021d29dd462a90109c199b31579a96e8b0bce1ffce92a9ad1e531c2924f430884b3eaae758ea5adae60ed2b567cc80cd85d90a68a732983b1c54e0e251e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fbf0b8ff16da01e39d4127f77a8988b95b6e8d8fb4178ee5b2fbd8d742e7c3d878d95a9b64546627714c8fa7c4e274eb33d4261f17160a33f8a0fafbbc23231e8815ff2e4e4b8e440950dc7fd804c96fc5386e7b3c4681f679b06eb9ccbde3bced7221a45645a2457f47c4d8aff154148830ab21719c7a6332f3e43f3b674ba020e366d4c326ae0ca9568ad1cc48b6bbc859229822ed4c80184b66accfd9815230201da289a05a2b8b264559426e315b845477f63fae3e0c7b2641ac358d4fa58d80a045437c2b3f17224fc681d322b26f4f774ea7303d851872bc4f0964e07266b45f4ff82bfdd98abdb3d7061d8952bc36cedf803ceb018d1510a2dd0f7532ce195030a9308d57b26db9c6ac226d21a5aedb643c876a33082ab09aaa3bf71b88902750205824e6d4c9f43885a90fdc6e1594bd56dd8e6f089ec13a9cb988add851a5329030287f740b10d761400f2551a140c9400c47cc905741f19d5b95dfb3c0cfbf3f603260c7529120299e8be884c8f36a0957949026c526aa9e06b46f0a38e7721b8260207a1da3f35de3ae616960ade327830e8a50a7b569d1efb820d2970eda6fbc4940f4ff619ba324093f055d11fb30d4c57c68214985802a22e7fbaffd413caadc5255578e138ab7a54ac94f2782c383e12026ec4de7af6aae7cc72ff6ea0104a5db43b4e3e596a962ef4bfa3d33e49461bd116a8ea67dbc89049ab45bc878b553052a4bfa03ea9cb00a34f779d9e8c0d8ad28c9d432fba50a1b1b0185b1bc7276c03a03f01a6b1c1a5861a15228c2198e10abeb49e3875a0bc3cb87482b79459bea39322b402698d857570e33a184da8022ac894ccbf35e1daa28d6d9ec6b4a4b2df491175c4fbb331893e6fc6e470e3031cf9b027e389160fceace16faca5e4534e730e5543667083770ac658359a0e8a3a220a9cb60234e1d86ae2c6615c0e4b370f6c165b8944fd72cefc599e099ed47efaa99b7ab9d2dd898d5c9f146f1a930397b48b668e9734f7bf8c9bf6bcf5feaf3f136974419ff05542a69bacc529883a8ab41b692c753140d6d84b71d8f959f58f868511e4ab77de25f1a6bc3e0764b5c7809828546156190b90391393822185434c49d81baf629b8a9e5ede68234f085e45dc5d0497ad0a4887d382575d96ce802007fbc071d29027c80563a50e423d9fd91994ebd9c548280009d0d6078163a3ee8054bff2ce2e68421f362352be6e08c76e99acba1d5df1f8099cd8ba5fb9f84dfa4f95555eeedbadc94485f91fc96ce874a20a3cc7eac73b07a7876a4f40f3fc30ff092a7ba2ac27cee973862d787e9abe857d9025f9c1576dbe434726af88856d97e402b528e7ef697e9e657d93c7446ae011591942d479e4eb19e23c622b75381ca61674a77d9dcc18399f05e935f0d3b5b225d799effa4a6a337b79c4c2f604d8ccb30a73a531aa0deae1767f84686086c5209e1860fd1a17a600c92ec240bff4dcad7e0f1733d29d0db9e0f716ab353697d108c7ccc2b61e6fe48f336f5be14f6656e2da4cbff07ae1cc3ee369324e1ff5ad0c369d952469978103c4bb1f73cff44be1ff4e348705c710a368d3e3339c9522fb113288eeb9015a94afc2b6e1a9db9d264a196ad5b5ca463726e2a12822107f3f4047b7f2c4f0ed66116909ed2eef9253595f221b62209b70a7a7c3b2dc7d6ce7678682ce1feac20e2f5569a3f9349caca73b89bee8e593039f49aa69e141d2b799e70ed91d4a4e65db715cb1337e15e635416df3d43cb5569b80cff986a64163bd9470e9ac65d5c9ffdea4234c717b8edcc597606122e527070401bf559cb5460edfdbc30c680ab87131d57fe8992025fc5d09fdf0809898a1b9c626be391b17b62da6fc6f3732673dc69dd3e9733134e5fd46f6d6f472f2a47c15d7f56ae6a3d5a112cb85d36e9e1dcff3c1024e4a893d4a0be9bc0f0397f27ae4edc6546fa9142ee884fc4c37e52be58614b6e36f6387e8c9e939dc546331479391957634ff0bf94c48dd36d5b27730b33356093d751a2ea2ae1a410bf712ccb44e3af6318cdd1af692726a00f5b9cf011d183247d5f076787a3ce97dd73bb5f5a2eca62621f7bf3758c07a872cc28c60872c539eb7364a5859f32b18150a650fa879d4268a9105762e9143f559419bf507828b72cdf36907fa51c52de8eb718987c3a7c1614ac927c51a81eba86203277bc0599d5091725805b59bcf5c5316dbc0bc0980c5bc36ddf78cf3d3bbf4558846de7cace8c74987612eae3de3b2166418db504e690e3303ee3b93fbf9af6a0000000000000000c0ec890200000000ea6666bfb6bdcc18dd1c0b74955d8fe0997b47350592af27a008068555722f6c579d9482616ebc9790672081c571c59b89fb10c857f66f6f75fff4318a63a2ba33ece7f0ac43c6a9cb01a012b0cae4cf0ab7c64168cbf8d8b557a2948b79b580000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006018f83a5c3e232a0ebfade16214d7b99e28ef8b5c3dc6a1f38d283cd8fbed8dcbb972a65e3262eb9fa6728a71bef96503414b7b27b37acff4bab3e6d2940b6072f31c7df95d6606180e026852becf635b38e51e23c4acbb57d0c0262589dd1d71cc6d479601cb558fc82622595f589ceb3f118c827e7fb59de9fce14f71ae00022d64dfe61e8c2c7ffc66d3c027c9df45df931f3bfe3c269bb94199f6f0d89bc503291da14b23ae157e0dd86ee244d457d84926f7491a7e5d88a0fc649619f7cdb60a083a2f8409c6629ad17eabccda328f1df8e24026af23846e595c3247ae5cf6ae160f7afcddea4c6686ee7f4187813f91ffc1299310b29504885c6a6031e82d3d022793513cb1bc8f185bf184668e37b78a4e5baa5c2ed19bcfd6935ee1676c2e1b020b1259bbd81634b649b862d0f64f26c704b2b85195eec974b3caa37783ca255302091a3cc3a6910054f58f65c5c420268543605911fefa36b23bdc355102c7029f020bca6e44ee3665cdc2563815e6ce80c54c082d9887e7d3d976d11b439177d1a9021088075dac93d95edbef1d1f882ade4507b80c14c9a46b03024d27ac781a6988eb8272d6efe7f04085b0862ecd0483b015773955da75b1bd31e82972c8360d1073fd55c9bc89f4336f095ef804a423a222fc7f329accf9240923aabca3ff602d42f96836fef8d77ef9c824457e57ffbb371cb4a980a44d47932e298d9130efc48f48da4bd271b90b002491ce3b2cac0cb6940b077b3bf9e47b496fcb8a2a9938f2899fb46080a60ad71917ce26368059d204724c7f87a52c9237925849fad429bae9ce4934d7b7cfa16cceee4c86a9e04787be147c1100ce9c144a36d07f9777d1c4f5fd648e6baee2e0e15866664e45319cef790e5eb7706dd4f81c3c99376e8d54cc5a60f35ae2a14e92d79c35a95bb0bd0a7f63263c69fc094e3f2007b161a83cdc8992356eae9d9a335e8f3fce8164e790b7cdd6cace7cb35bb5013ef0754c81b8d74e61b09f37d8d6ac4597bd54e0ac26ad66f1d89464b2c25e09d8a97aff53fed5f5d4c239e661899fc046b9a8afee195ebad2867c0a2c55721a076855fd33bc7257496499a6dda40db2ae4abda1d4ec9f797c29ed4d5c9bd97de499caead76fd305ef3e4c9186eb0dc2f67a62f18f720558c457b8f7f2c4555042ab40f2d286afe986735d485205c5f72f08da6be1cb4abe14d32d9036ce007a4044200e5571afaa01459c4d14e9f90eb684099bb2ddd568ae858a11f34e281cc6ff5f24112d3761c38fe6c3d85651257daa2a71781da3615d569fb35e3ec95c7dd94f845667b423688479b9d892290f320e36d48b2105b6fc4c9cf6c605b2efda63b9912a12e9fb4451440679876643e0fc257bc61c8d7eccf372ee9c659e64f7b59bf75ae8fa25f9c0e0871596931c792a268fe437482c27a31415228295692d9e274101f307e2da5f725be3be423dfca291a30193f3d9f05343ce13595b2410c1f0f196ecc767fa2356fac48d3fe5ca7b6c26ae6ae49a54c21478a804f49c25e2f8641b8ca90ee9b2535e22b4a7c86a57e5c3aefd3668203245192bd6f458d2e5b62690999c86a67f4ea346e82c0bfe3bee87a79b77acbfff1ee2334d2ec1949b1c5f3d5dfdb536e92b7cd825c99e3949ebb9113642c9b45fed946639382df3afe4577214f97c2f11bfd1a79284d336e276a76058d34c00dc14e14ab2e255ce309d7cd3eb8cc886aa34069be95d3e6bdc695e21474ed2af25479a9f8e91d63bb9d9c6610121dd949c78de0fc08240ac8dfe0a673118bfd96744c8983fcc8ef19a0d965eb2b1e8e6030551dc22770df589c7a3b5cc832c4bcf2ab2013d9d058300999ec5d0c97984d3a328fec8c27976ae1dd37cba94842688498e6911b3b481fe868552d670f22ce1a01e86f75c03d463b46cc7c77288fe2f20d31e9eb58c89def829f272a095574c9fc7b5ebed1e8474917dca1e8bdb016fcdf10e803e18a0ac8887fe425a7606bba9ec35584e72d248db5c6c6df63821372bb266e9dd8fa383fcb237bd0f52fe46d471e0a73d6b094185ddf69d06e1fddfb745982bcef44964517ebd8b35c6cbd7dd50ab7fe7f5c145e77641af508151924fa8a011abe8f1962c3ef500a1d3674d099478399746dee22abf1633ed7043403a4baec67e29677588ae8bd6454eb347a0bf2259e2c63042f87ef9b41459712ee08e46505d9bd1fc1e9e474904aaec6659b85a5a9c3d50bb07ee9dae2de50337fea75f5664a4922914bebc8aeabd1a5c8dc5d536d93f02c42ae33c00000000000000005812770300000000865c6842b197b4ed4200223e3bb0a8117382944d42f6e13ce840345dc839fe4c3e75001d64afa9f519b11c8a628677c23145668cbda38bb1e2be02f5cd68a9617947b708889f4a851cc38f370a1bbbf3e29c056fdef467ed50d82f0081ea84b2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d045b23dd2e89fa54e8d819d79ccd1f705e11eea78ca09bf01f9970aafd3b24b131329082edf81731252bbf399b31dc21a85c15cd38634602a584d87e6130f6edafd06823784c57dc792f4a0a70f1160277c6ca8fdac9d91f962c55f30e5750f7ab8afeca4398d160b2b6289badedb47ade2b2cb7124f5a54886b608d5b7e340201f38752234aa9ebf960b60a74692f2f58a3be6a4befed8f6e6e3f20f22befe3032e92f6561724b601bd58ad3430040fa54bbfacc50e9598de2b3d30ffceaa414c0b06388c0a9946f2a1e2d1d6997b6d31be9a3569aa1bdce84d784c8bf38e46929c64f2875fd7456d83c4289fa3706dd1daa5fa99b67c3af9b3aa13c54ae28f03e50206ee42956959126c62b93225a59afd1bb9353f1ee26722a9e850f34712e04a290329e14e253c846779d8c1e2963f47f42ee489a733b232496462b04ec34c7c1d82020ea56bb467a3f7969427f13e87f6f24cd976194d7543c0bb9ee5b04cb232f5cc02102da0a92995543210ce0758258b235b45d1d60b1d17ed9a81560c0bb253acfc022088b28ce36c0e215245907e2fec63d014ac866c2a9f8eb0b7d6d948648bfbc1cb0eeb9536c933ff602add076ad0866360d4279f97b36c4a9d936fef1a01f4818e6cdca2889b2edc330f0d207fb6e784769ca2e8073c11cb5ea20b14e3816052214c793dbd07f49746866c6e256c159a09996b50e84e4567ebc012bb2069a037bfabceca5d4b3a21a8cc7a4b192cf32ed313ea78df155a5d167ee5adb4927da9383d2f1c07cad6c3131bd45fe4b05c4f2962ddf2b5895a01b2f0704a16d67a43a442d9f09f5ed007faf47f479b1cee465c3d587006f491e4293a1d4fc45bdae7f169063604c58ff0c609d26cc36a0ed9db2bd75ca31c948ac96abcc57c39243bcd6d281cada81add74f60be0d68082d7d08873d8f6b27f96ccb5a37bf225ffbe7bcd27ffcae9e658426c8a2e3e40adf0b687fdcc53eb588b6d0165d37333796fc9dd37c9fb98f18799d4f2becf75bf65d728d7ce37c1b9a8d036e3b9bb0e0bfad6cf7e7dfdd88aa9599656bb7626655803e055fe8bac4c8b14d3b755df3d8bb49d37736c906e085c59a2f0da63a48f62fc557b784f465c719d8c041c29528339cb442c5a1abc1c333b8b868b3abfd6b00b9299c98affd68097d12f085c9def44fe0a3ffa28caf42b92fcbf351c548fc572d76de35498603b9a33f0237c1eba4c96cf26ef8f7b6ad0bd7e6eff15e6d94eadc65a86785d5d6f3986f099b09c1deca2dddccc26cfc6b5aa953971b3bb5b4bb86380af706ce1ed599d947f59ea8377cb5906362cc9e426fb00592bb5405c71f3867e48ced3cb4eb04524b107554226a53f39c00263c8555fe164b51d2e0ff0c05c21e57d03c21ea8aeb1a2745b4335084f5af76b256d07f058d9fba3bfd37dbc6e6cf71340a4318592e00f257c6886fa906d25a3e7188346c2274aa6bb7abbaf6ce216943a8e5ec9ed7cc0f281079564e05c88c45bc130bdd9823809d92f5313b5c4e451c252f5c814ef0304305d92562308efd9cfad4f947a257ba6b187ac3113b7e7d76080bbe3b6e1eef04dbb1bd8b03ef4a8d3b3bd39f7b3804bd6638f890bfd15baa5f7f4a6657a2301a2a0860358fb2f149161adb31573f5cc5d0959bb054b696b0e35152716fe14ff2f16615b95afc1a6f1d2154bfd70e51e7cc6d86b29cc814510f9c773c5725389571f4aaf6c39964c98b51b1d041ebb51cded8e927f38e2d3fab21da131891a19c6aea3cb203cc74e81035bd162cc432fa1b88f711876466c2bb82bbd448bd0530b06729d009636e8f77bfb32bd702352f2c871971aa3ae89acd74e502fb2c3a2028fadb0b080068573eec2dac733581c68965221c7273a738aede130aa37811ba4f365d4cbc14436af60ee79cee23b3bd4570bad1951b612d3cfa8eaf84e46775b2651982d9de35890b836d6aa11c43570a4c75ef270afb51d7d42b98f0afe07eb2212fb6540718a8e3ac4822bf9cc2fb4899c3c7c0e03ed1eea0ef31f023961b87d43de532c220e376165d9645fbb8ee59dd9378e20192c33aa9f72ccf21c1eb0eb39cc78a007c0a53d801b0bfa0d43ad8aa77608d7ac15c5645a67f398da5945728bb247c6ba08cb8c344b818f5ade9025fa72b5a90eb78941d23d86da0df43e90bb4d88911d631599dc99ac4d4030b9e0ed32b32918717098d2444344f37cddd34be09d17cd37e75f70d8b79adf6961ee64651d8d6eb47039bebdd17cfa77987ba3ce57403508d1ee8cd884005767bfe63f05c90eb455a8707ce37cb2871b10a5894a50f5670211eece38c5193ef13f6b7328b0c65a6165f59edf9421d6434dda1d6064fb77b906bd36c3178f64a4c5032278785375752491dd7f61219a23a24ecb419ad7285f3899512a8e569593dcc616430c", "0063526a51", 0, -379953022, 0, "e418db516032739efce5c2bcaf1a55e3f0fce48aa53dc4fa5ee6353a1c6486f2"], + ["030000807082c403035c28a07014707b6712bda8f721a708c06e246b6584e20949d30457bf196de1ce000000000151ffffffff5d433e2b48df263d83ddac96a8976acfeb6ba8036993f12b46fb6dc48e5916730100000008510052526a51655121a09fbb91013101ac3d5cffb367815054a53c1ee9d2326f71ad9a3e50fbc9ba230c1d75020000000452ac0063ffffffff02f83a85050000000008635351656a5151652e00360300000000066a00636365630000000000000000020000000000000000f29b6001000000005dcb3e0324a72d82a7cb5975f2efd19d0b862c7ac247aa75e6bff348591f45734044efa25e55df947f2fe1e654012f48c433602db6b4847c2cac486746115e0bfa7ef9f81280f22525e68211395bb0da4a7d32f5c2cdb00c2746355158df21d8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f4d717f7058066759f27937dc454359563a068f6aa3fded4d96d98f1256a9c5853c36d525edf431229757486a8f10973abf49f09343a186faf50027960e03977f50de46802bc2ce7790bd5b701a758d4e34826f8dc7c8a112a0d8f2b2ff7b053ee44db92363dc95eaa55ea8703e16ce4d57b764451264f1368550f3b330945f0229f58e263188566b983e1b51843f168581aeca107e275066dbcc0549d1fcaa4f031add2319e055ccfb2837162e3480f5e19081c811d3faf7eb4869b247e936fed40b03b612ee36810362965f922c0493c896acba2736141be64afae0ec3f1f94b37d12e224bf5af00dafe177d12e0b9c2fd6e22427fd6dec0d6df30743d6599533a9021512b7720aa32e12d608ac5772dd1718e505e43755d039e0f8c5916fb37b077e030f46643689e00ef6c73c81d1ac437cb9fabab2e350caefa7f15064ebae102fce022974274a7961fc0f06d3990aa08d51fceaf031fb392bfb3e3c08945e868bf681021a2e698055c4660da30356851650487dbb843da55dd546d924ecffd79f79ad130203d10edd1aed6cfffe6926c11ada85f41deb8cf590dfda583b8a771cd6bd402d183ec1bdb7dd5bf1cbc8dd2f82149245af3b39c8914cf1d64c83cb4591cd803beb3dd58e0c1abd94d063556f89e4e92310fea1267a06a6a3444ce04c63c64cee62ad1b448359d408803384836c59db9cea53fe5274b1079b961eff71f96ded8336f6b22a55c3c13b0710fbbcfbaa2c2636339cd3a7f08f957f95d7b911fef0fdee9e7268a9431a154f7c0a0845f3f0cfa1e211aa17ee3530b5ad174bca7760b77322a53b1cdd1a98faa42c8205cd756d9666959a5f43101c74d8b673716bb3c79996f0fd90fc347466665abd7df0f94b0ed7236fd6352e7493588f6ecdb0f290817ae9df503198e832a3941c4eb9c19a87a297262af3895c2b346a0a2a86ef219fd71c263d18dfcc1de911e276ab86277b4480efb2432b1a9eb794297f461ee26a4308710f288691f8a102f114e78e4dbdc87ed2e0bd43b3f888926601c0018555e0c4bb6cce20bc627ff49126796dc2e1040555519bd4c840708a877e193410282b0bef3a49460cbaa4cb3b939e8ff76c08ebf538e0aff3c0cf1e84d17d2b1783c6b05a1a390334e3abbf54e2d4bac914a146b71e74870abbd0bec5ecf21cce057934bda27ca8914700b8a790b25871fb7d8d12c66cfa6f4d40149d0aaab8ab65ca7717ea8b7b1be889d9134cb773f393d084841947bb6cfe9b917297616f99f0b672acfd745fa49e59d6e2ecef587178c3962a0252ffbbc044483d87c27922ebe52b063a62149acf919509772b3c6a298ca3b5f426e9991830c929244474ceb5fa7d49ffeb277ec2fb07e81b0747a6e5ef27833fa75bb71488b6beb629066cb395e719e8089043f9bf3c36f6be9e896cee99c2cb17f639557c324e771118db9cd8705b372793d4269a71de258bd5297c8aab88ade56fcae97ef149241d42c838177cd653a149686cc6b367b0a3d854bce12cebf9f8acb2193a9efbfa5c8dd92ccc7b43aaacfafe9c9881e1b82f994c4d3c8a31f326f8774ad2cd3583d1021e61df3d4398c05893d40f15572504d88e7f480e82bff655f06bbf656f8df4f763fd65a65958964dd6b412b6444727d1a6d47e2f6be8af91350cd5767bd9c3152b9b213d4973641fa9b2c5bb6ef84ab0c071830812b59cdc9b4e34fcb5cc63d6f698935c1a968b2956824be6b31a27e2a29db1c213af47c2cef0a067ed73306973aa6dff39ea6bcbc5101abf9fa79b511a4916ede21904af60a09013acf8b26d799fa6158412204a991226929d6e48220d168efb352574f5e685c88c9dfe75521706e54e633b951eb2b6e59226501e5f579f46c0c45f3315d3515f79c2146710c2b88a7a1e97bce6dc7b5137ad8ba7d24c0b57ed06fedb5bd7c8658c2112283939b9ef6d0bbb3da20598befc3b58c284f043d0f52ab5f65e03d5d9742a18983c226af553eaee35adc2505cfe154f3cfe274f9bd43c683be1467813fdad0efdbc96f2b9bfec0acab1347a9c724fc84fab2343f3f2807f43d4990d5ea519571fe9af81696b2ac154f1b2cb77ddeb9a5cd098776fe7730a3f2599d3591a74b3bba3b44b279610722dc56e3b2bc3357bdd8db7575532829042de2584d11e038eb916c5c6549a2f49788dce95bbbab0a69d80e7d90be695c7067e0ce06984d630e0e8d5faf471bc01c991d63787866e17c85e1d7f2ad8757f168d7be700b50131498f0b55514a4bf4f08869bd3fbf878cdc953787526c898200000000000000000000000000d9c1f723a07d005d615facabe3ae96c3552efce8dd2f489845c4709b5706995e36c1451e6e2b058379e158dd407b44b98325b7ddfdc0b7b811baa2bf0ea946aaae5c78031acc18e081c5ad111f6c87f175cffbc5a16d9d7df9d438201cae830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000323f6a7b39bd07e30f2ec199e4d856bec91628c9da2f7a8931f32ce2dac57864da432b3b7bc3edf2af143c9e7dadd89ff186b1dac54d12597ceee3c5bdac73345e5de832b2357fa9cd78dca98af6f883f4157d9c18fc478d49f34b9d7a14a4cfc71cdf8ec9854a3c1c05b3e9cf61e6640ea57dca3a9dd4c89e7306f8f91240a30322c5e9959befbb885ab3a450ea414db05a1bb9789c2ff931d82e2a96a3958934031355a8f35448e3f9dc4c93074fd3ca365e934805b82c107fcaf156644a81d59b0b0363f009f196266a1312e0463738f4ca8c8a56debb0600f262fcaa4faa4307ffcdc9c60468042cc0059c234733136b2c8b0d072f251ac42e599c0f37b197f24d0318b5d2962badc31be50110179c0631b15db202a8dedf41800cf13c64bafcec5a030ac7cb11787bedf73334481a853bd06f723ee38a8ed7451261cdee6563a29157021748413eef647b64c6931c78b50d95b72a0901b9a3cc53665cdfff252db1334e03218a300757eb4b77b98e01c19db3def1b59f837485b89553989dd7faef85176f031abae1bc09ba450aebe5910fdfd4b4f48bd7df95806692c71dca3b6b2c053292f8bfc8fc19e806d750cad802a50688a6e1c212886e3f32a5b2ac8b744730a042636aba3ef6aac953ac00d23ea69ca2f4e9f323121e0425a1fdea009b6ad00efc2b5416c92afeeb6e5d49ecdf88fbe5cf8f119d8f157b3fa5785a527bf06d6cce0823875e0aac75906d96689cf78eee8e4ebe7228e24ee39b9e6dbb13975ed0f497d8b4287dbd48a593d17a49a9f694e02085875e186c0bce566916c45c233c82b3080a669b0f09ed48c0381d889a2f82dd4438b8903b9bb3e6792af52f513f6e8faf647c6d37a4aab5590d021603bee4628be7ba53a4681f4cc3668c62311430f822cc64141d1650445bd7f320ea27165da5bbf70747c0b0e29cf3016c3aee1c765ff4be251552c3ad556809bbb1ec471536cc0d9e6fe38c8c7e4b189b3fbf9da0f39bf8faa7eff8c05ee0d7722752fb6354def90cec1f6e94ebba84386b405e6243b7caca5fb4bf344fd85f8a477ee24909474c091ed54feffff4cf960ad4f0f72b3538861dcac356aa42b0d925201ea3b081e2912c8584ccb23f0d5f8d7a0a65067de22f23a822674684a718aef6b0da18ca4bf089c3827d946bba2b9ce1eee48a5c5f3d3f6777b1647f115fbca7a0d1c34e29f582679f67e448b823d7ed530d990ca85b9c6c0b9508f68ac173d127f70d7b3b9d9912827379c392651124984a3d67d7224236c39c5d9c2c25bd9d78961ab553f057205530373afef1f2ed77d55a6d302f5ddfbc6617e2d35b8cf036eb8f112c2280661fe143d7df183e2dfa607929fb2b16cb684a17cedeefeb4a1b81c7d6749d55fde6fabf37e5755e2af3d0dd5ddb27c3282886f5e9700ecc58f6b2fa91d66d44513f91f14ac83087307b546212a31edd81069d72d13cf1cf96adb14d76205d0eeef2332187c2adad1f7aebb58e624b2bc7c8ad402cc69164f0ce5acbd0a87021410d9a31fbe73c90251fd7550543c754e2b45cb4bb20f3bf3f2bb4bbabbcafffe873c9f26b8dcdfc6d9ae34ab2b87ef2543d4c765a24416c4e21ac80b69239f7d28127eac820ba35b6d80b2ffb4c61d3ee0c78ffeb371735bcc976032e8fd80ec41e9e41e84cc4645669fe7833a8eebe4d29f85774f979c94562e0eb3120a5292482f201c7dd35525c3641bff17d0f87f838ec00266a3a177838ffaa838e5b56a38b5873443f2b5e6bd09d8a8d4b56e7f56a61b7b16005f7127bb56b1a85e52e8f96f823dab28b0a60c24741022bd823b2b3f4b2e8326c11cc25b4f7a806d5be32f36bdc60a5b35dc2efb980c0e2af9e5e9634c97572b191e9e685f82c23bb648922e1c64b73e3a1b3b347f861faf952972d4e6a69fb6b753573af491add21e50b629b83d577e712c002230cd905cbdf21fbfe402126134a88f4f4a82264e14e3eb088c0c36cf6d513f78254fc8579dfd5ddf139b7a84d8d48a84aae36848d20a0752539b7cd61c93f70e071bba876bbbf2ffbb19a5c80680e484040fa0401b0a679eaf0b71df7c3f436c84892ac530a8c34cf8061bad4be9afb45c94b0f599b70b0dbf13ce5931bb233a17da31b962cb4577d45474eb64a6ca58e738627ca053f38f71fbf748fc4deeae2d21d31687c07f7adfb57463dee9308558088bbb7c7b1d9f5fb944e7b8fc739e43802c6053cefa2072175368eb63fdd7212552ca4c1377504bcee459123e5f9753fa0a3a65bed564a21085ba2b064f7a97eba35c88a70b13c0f3ccb82e63aad2ebe07bb4d62b43cc31d75bb30b585a2bcbb2ca2361a46a1f7ca68108717573444bd405ec314a8246f995434f6b8055f1fbaae1fd0662b66ec5b61fea7734c1b029a90ee112bb123a4cde1bd8ddfc413a802", "656a53", 0, -255701861, 0, "c8ec31ab4b3927345a9bcdf14d9153616dc052335c2535ee594b5cee24263208"], + ["030000807082c403028ffa3f926132b75606f19c88fbd39381efd709547f528182cbfb41a9ae3ca6cb0000000008acac5353006352513f6db7826a03e12b8a957ff70285dccd3d7ce18fa87cb75adc48678dbde8729efb22b5e8020000000651655253ac51ffffffff026653ed0200000000006155340300000000035152635878af7c40f45c0000", "52ac006a", 1, -2105110150, 0, "d64f4f8e16338ee8d37c02eae77f26e3c5a6d6cf2c2e272282bf1e54bd1cc65a"], + ["f20ead22043ae7d479c1c28fba38c6cb3af8298ef386f32a10949983f0a3cac9cde554dfcd0200000004655253512c537723bc98dcfafd8833aab10942551e724c2b1beb1fc7dee819b0b7804aa5bf8a274b00000000095100516a6a515365659b465731649dfaf64afcb3120ce6376f456b6ec8309611671bf3a979f0b3957999ae7228000000000853acac52ac6a6553ed07cbc83a09ca9cdc6fef5c9f749ab847c13f3a9d6bfbfd6ebbc744332b1cea3c98e0b00200000002ac6555b6cac803ee17c704000000000653ac52ac656a14eacb02000000000900ac52656552636a65011a520200000000076363525253ac630000000001cf0f1005000000000000000000000000fba03c6ef1b52d709174576fb2b6931a4ed4dcf36c5dfd1827290d640ab79c1d3f12948387f9492838c149a8e69bf4d125a82f02acab0c0fea24455ac2be0dfa540f93daeb9019bfef4c1480b706b24affbecacd3b4cc61fb0c5a81eb7e919a600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0f97dce65865c06cb214c5e8303b21a72759c049150f6744c03bf8aefea155ceb263f8256c7a3bc459cd2c6448ca5fd5ae1f6e4a0f6156fff6343490aec6d81984a3014c1967b6bf1bb1be6e3740a3e6cae0d3c7d62b5ba82a93d3cc83a8171793790d60753d1abab4e95f1fddaa07a0946f2101dbecbe1b9c18790af5ecd4e0300930674b567dc4a0419b78e4c3fb55bce5caed41886701d4827e60fcd546c450307961e37ca46517fea89e890518e10912bb5a434b715d0505ff83ec388947ad20a0908f0f93cf83e67fef283c8f78733633ba11805796c1e506e943fd13d5c2c23dde55850405a0b3b9fc463017c0c0f329a2df35ef9eac2b8cd8412cc720dd25402147906a08e1fe5480dcbc1427537e697d27a1246fa059cb3e58d75164eb19c5903068d48e336cb3e6fe62ca0f1545a48d14b592fa98512d98e28ab9261d46effbc030cfc6c0f33c83072b96037a705e60b784eb9c4031e3a70295b4221b74d38585f022a87f018d05a75b93d2589c918aded108d5821cfda60cbd6af3434d8208296910200815d0a3b8f5c92e05b3dedd8382d86a4cb69a82c809ce79f8b20d7eae47eb97174914d7eb1f76e9402eb6aae4a43956018ab1be2f955d9ea229d164845e271dbb3de2c5f83f26be3f6d34b2fb700a1d358eb1e265ad1c2432f4454c3840f3a496002599c57e6b642139f6bb01c665cd9e26563324be78a6628d25ecb453216aaa8d6ae48be06dad8ebc27838bed3372fdba8423ad955bd5bda2cfa4a2d9f191c1b136109bdfb53351df1aaf1dd955b8826fa6b59b46a90f70bead6696c634399d9c87cc49527a12a388cd29cb7c300dada6b8d18fc341aefc16a34d39d0d0a0ce4b41a526864ff0ec008c9d0c59c2b3316bf1b0c47c03fafe7697c38968847ae2eaebbe59879b9761bf95ce3590d7fe6b2d0c886b3a649a11f40790edead32585f59796ab78f0418a442bfb813794ad560311d2b479c02923c27df89340782f06212993091732433352829122da517e1350a98a2a5bc6fdc87798b0a89ca6ecf62c3d3feb335fc5ce3559a70b6ab7544e70f184748a5cb6015501ba9070f4fb20f28190db9fc922c87d9b0ea3c142cf11abc07f5e05cfbec2a5e107e8f8ff0ba6c845bac2c318bf20459bc2bce33dd5b00a653d1c72548351af4251c51685787e54330d04015659a5046eef4e8abf02b4b9ac375994669c1e312275c13731b3e2241474fc3b47fdc90f5167a3075e9fbf06d934c3163bd97706a1616c37567a20523d3715ab7a718ba7c5216cee4826ec9f40ee05d0856810c1cd4d6f1aeb729705ebf98a32d02ef3d6eb0c9ff1176ee09d49a2e0212e05a0a74809951406488e290fe8c005ad101d998b1b0ccfd3155dd82180ceaa8e0dd14643e728c5620f24a81ce335c14103eb52a384e56477694d82d65e677cdf55e3e7e0ca1a5d9cfcb03c53465ec99f2a9c93063f08f0ab4561106e1af848074a7f8666a834afd98ad2a2b04184e468750c82a0f4a0df8ee2f14b27dfa89bfaadfef3fa9ee73c042311ade1da0bc33893cc9defe6c417b7b73b35adf391f02cd3505a62ec1849a228649d336b5634466f95c5391651a8d30ad2f253ba703943ea464fbdd0c6daca7769ff8c8cdd753551e78bd84658a1d475b552a18eb574ad2c74534c848ff71444ce434e947d120c5aa8e47c3acccf75d616f455743b140d2bf9d38dc9bb3fd207f2a3d711ad46555df5fab8cd478d7b8d3b8fa9a8e14ff9aed5bfcc76c58f069aede6d993319659dca67b6ce8e8503c42f038fe82f6171496d76d4f3ad104500ba656fe9001846344d77fa52b60ae53e335825a1cc7e41aec8fb25d027d7a950343b316a95bfa134a91da2f9873b8cd2c5e9b65d83ebeb8ee9969bfd93870d36cd2d4800150628ad93268e8c19ab94f213bb4b756ea35392bb5923176d9406c69ab34502df8d4ccdd492fc7921b1fd88b1db870f3b0492b723212e1f2b2ba7f99122c0e4120c8c0ce5a1c70db1018558624c2b19464186139b9984852b5e4dc9eca917c2f6413cfe31fc64c37cb7cb3517ae7dd91553ae8f111d53f444ef4a4f36c0bfe288cbaa12b2db5ccbbe2b4c46a3feb0c13d9f6ec1b8e0ced64e951ce5a74ba1de30892fa1a7d5017c7348b226b5c7461ad15e078f4d85b16d6fa02138d09afe239dd5f7c1f1cf121c900b6d9ea164a6617f83ac4962fb79f16665823577af8fe1ecd1aab99849fb50d4af5aded6f394b4c427681bf314263f09ff086b2fb21c43565fc92c01100797ad977c3aa667cd9d16457347ee237c5879798fe9b215bfdc2d76f952440ee9a2d9f624060b94156f141c8dd77361ad9b953d5f212fe62205626b73fb1aed43a42646ceec5946e21ca743ff26159bf70b16ef6b3cfa5f12bf159434e084df5b971b24eb846904", "536a", 0, 1073323069, 1537743641, "f23c907b85d46c8d3f24c8b81bd4b49c7c7a9a46fd68bccd08c7a8ef0f8904b6"], + ["030000807082c40303508231c03f152aac399321304f0d7e643586888f9e91e7edb217eb00e54439d00100000002516affffffff9243975b0feeca704d959e9bd82ee474785ad8cc657daed3120e082b390e9806030000000152ffffffff47817e3b2fac97863291bbb6625e2545a32ccf62de40294a874d2b7d976f6b780200000003536500d215ee900412aacb0500000000056a5263656377e96a0100000000016ad277f1040000000000c2802305000000000451630051000000000000000000", "00", 0, -79267209, 1537743641, "bcf39b337eed8ad0dc6c8d999f9a1b4ada9bc681b5eef9e807e6b143c2da9b7b"], + ["030000807082c4030169342984a4bc7ae1fc331b19287f87b752c28c7b1975100e51a53291acffe394030000000765ac6353ac6351ffffffff028295300100000000025100801db20000000000080052525165636363edb9ef25fc55ebb002d430d001000000000000000000000000b530b06718ed028a34412884d9306f04f7be4dc117fc2256e98d4077bad71185546208448bc30c55a1330f10cb9deafd7a09665702fbf340b4a587d66dbe443dbb8999eaffdd9f936bfb8c9ea91dea046fbc29065fbd1c25d055dddafd28ef6a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f188c64463f5331dc8c6de1249b2414c4f334e53d1a4cf107e644ce1eaf57d6910613db6266863d5963ce1b228e168271512811c9bf90e865252ceadff06af5eab8878084a1fd445d4a60ae4053ebed71d2aff8eccb4fc521eb00344839c5ab8d0fc06a62d8cf0195bafb9bd03e2ef4c56d76df72831e445fc76208f54725fdd02108a52f7cdcedc996c071cb74aa0fd9c01e4341e3f847ce4afdfd766ebb8a6eb020035e52aa347ca37cbce2f6eb9238cd8b626c8dc6373c654c7c7b72ccf98b9470b014e9330505f9adca3f08e59fed053469362a7cd04975dafce466acdc34aadc0baead4e8a9c1b1c682b9348ef4c1467e8aa1f6e49b37503e3375cdf1011925ce0213d262c06806aa629753d8787de3373c223a317ad62eecef463f436468d4a7e402210fad7d43730feadadcc83af8a67e9856101e4461c47ea662877b13f1f4179f031601c37347dacae5715995670fe3fccaf709ece766ad8237135690b9cbf96f29022a71da30709d91bedda193a37fbcbe331b62e57c0c36fe5a32ec6966458cc0f2030b916e1010c0638d464816cf5ccf31f92bf2b3d87965d7f2ca95e8d001f04893353580a2a692a9d65c3af138ace3fc85ca1107d24e1ebef63ba9e872ca21feb4a0683358b36972b7dc13b1c9555b2dbf8425116bfe0a9118e704d44e03c3e2e5eb420ee132e3de4a38e03a048239737e269e916108e8f37d209f5079d6888a6270917864a9f1858d5c69c42bdb1ddc9a3ff0e0b64d482f5898674dfb2ed1e7bcf40234e34f485a50fd420d51059ded3487537b7bab843300692ebd061409afa115c7728d5aa520363b77ac5ff7939fb4e55c3f8d7b396dcaac8da6e19d6d8d1089aa319287b3bc0ae1b092d99029b0ada8b36605bd975bde4d4741938f3a2d2ab97c13325b5e6327593006e34d99c0d5a1cf58721572ad075818d3590279b458fa7484352b1b50d5c18505c47465ec99077d5ef3935333600a57f424c356642c0be2a8d74fc2e825725c9e10d613ba958e47f63551c9b9c29439a75641c27d8b6c4ab73c76afcfcf7524c7528ac4f0b057b3a1c94712262242c4bc7d7b1d0bf6d121892d59be4d680afc577dcf544f8fcb09ce5fe55e851fb13899d16f3cec0c58976b4c4960c3063898056c67f9ec58e5a106b64d9727192ad676a877fb4028259e6821c2feed2c9d0ee4f02f2e30dd8b7d1d73e05c9e4f6541cdfa2e848e2cf91ef79b67b636d353c29f161340dc4a960ed205d89cf28c0a70b908caec564bf5ef16642b3702548820afbf01ba4d631129d441894d7712832e52f28db8ee6b2def09605e7750a7d8f8c5910492bcfc8367238b6f40cde264121028f90bcf2956b388f9893d8834250e3e48c476e606883383fa83c0c502df159f1fea53aef30fd229957517de1852a7216871673d032c88eb4a596c7f8fbc3e29c9d1cbff9ce28133b481082d375976a78c590d7a57154f4d6b292336c4c5f58a3698618afd673abc41faec6fd785e302edc9287b8b8ac9d10e97df35f90a89c3eea2d28bb8f4f6684249143c3058a5a2d669f3fd29fe01a0bffa5cfbd62786266b35fa6f0c5095bd3b043ad0c45a0fb2994445dbfc86e996c6a0328ad966e93a36cbf0bd35b37e919e805e9421ba100c24bc58ce10ff2347f0060bcb1d654a342a412889a4a626c58a7bd8bbd3f69edc087600d368bf05c264f608318e0ad168146172b8eb41ff0079e763761aa3e0ef83ac5874d611285e9eaa558ec16fb4afe08a96e2e15be204ca65273f2000602c85b03d389368de002c8e1d59d9e48be44c87a1477a5379e45b87b543c44108db797283551eb3dda4a5485f88361a13c62f3e6b1ded5e78705d4e9e2751a7abfb142ba71a2c481df71560aa022726ea1c3f87fb23c7ab5ca1949c861c79f155ec00042213f04c1e0182e98f3a0361d7296abf28cbcd273272d6de1222dfa35113b9a5752e5738aa0d59ca1e90320d78afee5b64b4abba5c240a73207da022e0c08e9a753d101a8e70fdfcc74b5009b4543f34f17f5134f6277e1e873fd4413341162b633b07250c0834339b7faf085b4057214cea8f3ec1056e3f100ae023bc7ce33829d04970568a324d9f8ea9ae3b47c662a0a793ea1f59a7f7f1843ddf45d65bda5638f09467723b9094e759b28b8334fa1ee54ab948b1c27c327133c55dfb8358bd0e5df97bee1c2eee6525483847e81cc97b561bb0c9d7fe60a596f66e9ac4189c5e698082421b631605dfe7cc1b711992a2b08ae6302c13475470a1ef9fc835b46515e2156ba09602000000000000000000000000217f683f2aed72509acebeca736a566248bbbdbaf6b073c9e7163347bceb911c607d2011b207eb077c73f40fd62c9fb5a227050a5e156c17f597d536fa2fa259b7c8b1ff314a09626d3d3de6a2c224077eb8b7496fb23a3a35169eaae1fd93e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081b99d58424a03eea59f802ea4426f380f01af99806c24df0024450b326069707aedf6e8921c3048761efca90309260a5d89fa69d7e2dcc252be6e6dfd883a0e42d5a2a3c61aa8abe7c0ce11d5d28a1642287232133a9ebf784f19c6298b11cac8c513e7ecc29542747b89b8adbe51f99188408375ea61eec51ceaeea0e147f202076e759ac83f4db3c7459f69a242b5e9e7ef1d2b181a3aa6edafb209d659d4900206d260d2a75ae57ab0c67c0fef9b28ff45fde35330e9dc1e82e1743f9acf1bfe0a06e9909f91eda7f21070d0709f4791c751713b61c59f692a8a3d62489f9581c080e00e62a64547291d516d9ac2891e415f6b3739637c3e1b4aebe074e5482d78020985d9be05a807fea1618b1efbf6b00a10ffa12666e5c27f5045c94e6ed402aa020bfaa5f3424c1cdfd897e6631a3c8e1cb965791490223f7a45bcb84550af309c030f73fa30b1b20f85edb2cd809148273b2fd38c9ca38856e93c46d95bcd06406103157427b658fed999b57fea09279a40e6cb6a0661ca9c477217543ca08a4c1912022127f1274480c9cc3f3f48e3b7bd16cad13ab4605416c116e1862252e6af0838310d65e70ce27e492ec3ac5ca210ea51cf2af4c366a17b172ac07fdafd9f019bbf4093d8e0b787f6509039ed0fbb421bed81daa766f8d9b2bc785263c6f97bb9f38d31ed2464c388e2d5ef96ff52287362634724996ae243b9a7ccdb1f86cc7308b583c641eb66231bd357cc2c309b2f83ebbd824f52ffce0b3ecc33dda7e06ee55938247268b61f19113e2f6c67f1265886e68d347b2861531018366d0bc6d8e157f5bfd1524f300303a2744f84b577ca95580363f93f3876696b6f115ced21f3fb5686572921a6606072d0f85f8feeaf323232e0808bace60d10ad07ba0a0a1d190efce3984018992fd8d278e8f33df867e1a8640e1f0dba5f84b4af650aafd1f439bb49be0759af02a92302ba9557caa44c02bdceeaba542639d2523b03b39e361143b6dc7d616b8e1cfc3a19e1ec323047048dac9fc4a9491d78c893940ff7d8cc440ac1328389dfeb16532ce302a6f5e1340f0bd457015a6080005d8db718fcef8b5e8570dc9c22e6d542a1127abb9de5f38fa82de36f0aad82956cb5d0f4e68620cc2aba1546ca011287504b9002f3aaa8b8bf932f41d9a49bc98864ba711566e88c430c6965820b4b899af1d2e215398f01a8ac1c11efdaa803565b612635db3672f54126135b381155e8617827f60c83eb6531e64a2bf289f2b4b87007c372e31286171e5a8059cbbf623a4dec11fb56a465bf73aac45914883f974de694a98f89fbeef371a0eb61bf3a3b669088b8b098b1507d94e6f2b5042a1112bd5f6c71788d5e15f37eff7bb8c9fc17a3be0ae7c08bd52ba49e06d5500d7eb5174392f92d97803594895b8d3e963e4ec05d090a47d3a06027dea955a02ae96cca188d452e72c61b4af8729b5937f9f04643178939c5e28700d0e3ddac5d8dcf24225e316c3e8a3e2c192e9b60a753e8b190a4af0fff20b7eed948ffde178e9d8baf894c0dcda01749bd54e745e1ccea7c7aeb355a0e6208ec94a8fe2acbd3313e5799abcc97638558e6aa6c6c391d904db9f70afe3c811badc9483665b5c333d217688dbff65033817d1686d5a34bdbf8d5670a9f54ba55654c9447e27469c34cfbfc1d4764f59db968bacc9a7e44ddd6099ccaf829a554dc128e37544f6f9057bbed80abbed7cfcf855e16b1a3fc8f85ddf536dccd739e2fffa52bc4c21e9433867263e61b9a64c3593d53199e2544b53e8e82aa78e0bc5432236bd53f5189b9ce3cd8995050da13f38a242503fbac2e285e8cdaefe63c8ba76d7c5a421b13071e0e1cb392ddb8f97dd022522e4af23d2a8e849b04af6f663e5996f25469e65ec312739482075e380f8c8ace8b4bac5535c4ee253599664e275939f5c2b7c22b2ee6f756d3710406de92579d09f7fdfd9b2cf6355af41884c698d1da9dd9c63e9e7f8222944b3a86a5f5343599ce5ab486c03cb5217d070e08e4697c96c3b76b295b679723983e48092b22e191a98327332033be762ebe626f2c5eba10a0b4d445ec8ecbf47d0d84aa20fbfe1d27f1e6fe9591c2565d4a5026c4ccf1b10332e50e7e96e2313ecbd5d75a27c6b382ee4efa6b2de272c1649313fa027464c7d44b1cfee066beabd552b996f275d0c7d93a5df8ed379f030b8748b9a9602b7d0ffe32170dfe98d54b344ec739d89524fed414a2619d54711c1bc60314ebcd07f4ca77343b49d93bbf355eb9f5c4e7a449cae414ebb622e5c090d46da7eb2e1f284c3c0962567c379bf55542c8304d35978bfc89379411c0f57e96952077924184b8f67719c9fb2d370c357f42fb956d9bd3597d1a685f3c81e6b03653a3e2ce44e924f493d2ee14566c24f69da0cbe0c05404", "63635252ac516aac", 0, -1222217186, 1537743641, "c669489ef6e53a59eda6cf15aec4384683832b73fa71c312c6fcb08160044954"], + ["bab7c83904d8f31fd6ac6fa9e8707f4e9c8d5c591143bd33af568464fb9ebe41d20b334dc2020000000152fffffffff958f810714e334a1672ecf8af93a56f173f865a6163f1f7c7622974ca4730250200000004ac526a63558efc24a4bc985ebf1d2d4e4ce4fd92aafab276de62a65171572da20a27e182bad5e00702000000007545bc0676926c6135d9b36f5e7a6879709163cc30ea782063f483e9a3fbc9f866062c05000000000453ac5351ffffffff0263e1260300000000096a6aac63636a65ac631bb8880500000000000000000000", "63", 3, 1468050038, 1537743641, "5ab3f8b05e8b633560a902b8c983880e72bd1ac5e6e52431681c6777890f99a0"], + ["030000807082c40304f8de25198e9ec44c664709490ba957f956d9804e19ddb7b5486d72fce2bb1be30300000002ac6a6da36f2a94f2cc08a1f72e82269fb8e9f326fffd5d1037eefed26526a1b3f9ba1751f67201000000015164ce4495babb8d1c86849cfb2200dcdde3871e5dbc56f0daf3abb55dce5aa45e096d36920000000003530065ffffffff70e2fcaefe94fd10409b23dfef2049b03c556e9546ad1ad9b99fe2e11a578c6e020000000453ac6a51ffffffff03cb9be6000000000006635265516553badb4b01000000000563ac636a0035c86e000000000007ac6a52006a005154be080bbe93801a01e3b35c0400000000000000000000000040acb41b41130c55f7bb46d830df914ba410fac4162d944f968f761f9d65cde3a43fcddb8a165914da4adba77591a84d87aaa23a3bcd67fb5d96aff35b4ad690590d135e0a974a22a89d112effd3cfa658dcff162b31c23da0064a22d9fb528400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e95d18baf3d9124b67c92fa67809d76ab60909d3401c1f97cb0915cba7e9bdb70a267331e1b3afe50f6dcdb27a3305615e0c4ed28caa4afffa37a33700b818bed5d88a8d93845418a53ba40c7b1aacf58b57bad9d7d96fc3e1d412c593b87a19baecbbe833bdb2584122a3a53963a5b73a30a54e60f8be72631dc3a730f8af830223aa96e56063360d6f1ae6a197375299ac02e90388572be1acb34a9b138d987f032dae7a0a4d39dffd9a482385b499b79ec70bdaf3645bdb95ecd427cc888cd6150a01df189cb80501d9845d9ddbd950053765c3dd77f0a78b0ff31e1ef73c241e5db347d63a36b89ddc35e4e878aa87897316db6c6f5be50b2a7552072cecef339e02054c22a04f69cb5b226546e7c5a8df007af30b2cbfdf6339e06392f1d2602c320226cacc0bec4f6d44a1f0a76841c13c9bbe0dab21917e09c17969b36e367c6e7c0307893e58f3e287b9bc6181c88e43be694c7513c74ee948bcdc8a1c9f67017b3c032614f675fc7769bf1850b5aed8dca2c5adcefeea5babb758449b5dde7b68537a020665fe8b34e325dd047a1d45733ae1d46bbbae64140f4c8a52b93f369807e8d20710b15b9a6d8458aaa32fc8e51eeb4f394634d4ae9b751d78464a0d08a81e7d69735cefccc5fd05a3b2c09e927d042126c6f84ee03e3dd1636e95dac248923f1333b61e00220ccd22379981faa550fdd701e357f29a085c41f94a3932d3e2fb88b255c15399b94a2ae1d82072a3750d3d45a4e52e19aacf651e287c597e6cbc165969102e876a59708f3edd694b829a0b802140dadb809566caef324ffbec4385d6a97ab106bc93d87c12185a8be499756fbfe6d6b823c7658e0be4a2efd153db837a16a4b638bf5f8ea62d5da89d0d9881f3a625a5001b7d0371047339abddf9b05d9eca87ae8bc4395a4f7e208920dc9cb3b11dc96ed4906b7c96769ea218fd19bf06be36166d3c442fdfeaabbcde02110107e8908f690299e64b8430b65b920f083cbe71a2c1fcdc2bd7f43aad21cef244b3b6a8406f9a5cffc210a28ec14e67cd781f3071089558433acb3b3ccfa75440abb1e45cf6ff62a51437feaf6153aecd76488bab8b1ff2ff5129b68faf962fcb1e27466507f0c9c28dacc75e70ae1a3b4079e71e6094a38ebd60bd78e373d71667c99306a8502bb1862cb09a2a197cbd50ec230e2e4d88081e39a15a454a64a65ca1aeacb3d0dd0c51e36f575e9863d837413e0094498f4f00c927003182fef5d11d4c73b42970a4a189f3887cbbb87ad5b5a85921a308ce1b67fb69ba2d2395326a49e21aefb77fbc189a9e50bf207032d22c7cf940cd9c88b4f299f5cbe7cd5396ddb82fbee44125ab5023be6efe255914148375066d184eabfa6a9a4e3ac0642272eb407ba97e94bc8f43ffa2f96df1ac53433585cd1e58933743672cf6d5d8749b88bbda59dabc8e363339753543cf2d9e2cb47473dde45d14f998910fdcf8e5ee1b95258fe074bf6d778bc6589faf77188eb6590f024ba17c2bfe37279545c8bfea1d66275da2b8d5091b744359b1f5ea49007d520d51a06e00ba5b8bf4de38e5da53027503a03930b3df3dcceb4eddea0f63a4951a7d453e958c44aaf931d76bc49408536854dcce1d3e73b7d19305dbae35ab560f97e7034f6433d7fbc6e28baa401eab03de0009063f238f84493682abc1f72b0337d106e5016fa0b681305c68d54e5703acc48ed8874af09ba3d0db5ffc206d89b7481d2ccef206212d311bdee884e4af57f62d524f1da10577ab9e8ce49eae80398bbacbb35b4fbcc7b985f20e1b5a6a52687ecd562acd687c631a94995ebefc32d76632bd8b54183ceda517e60588ac4659436212901daebdc83b2486476dc872f7a5e25506dfb188a775ad9121973ba237277d7288df5a59e323dd2b900878e286af25d646db6d657ba82c5fcd46f76a88f8f7e4bbe183bc7fc31504e4f1bb555ebdc38b294dc6e5341de04f441b775b787b266f179a61d44179467a45b339520bc504b0dae93210cf9018d864b77aecd14ae06b7ec29648ddc055c55fd10bdf3b24ea57e93e3b54a4c074733c41ee127f7105f00fc25bc651a34bc5e50dd33b423f98657f3764affe89148d8641c42c00aa77e2085c7b9a1a5e8659e47e92162ffb2190d20e270d174d6e5c43c1720558e98ccc0315949ae586a7ba9afad27ea57a223e2645d60a7e7e4355d21653d450f6afdfe32bc7908cad792f72bccb7a9b678f9a046c40d7f5e00a7b784c6fb916f2824a4092575a878558c025f8125df940334802767f7eb895e85e5b61c37addb60316fbd4b5ebcc1ec6e6374624321ba7b085c8b712d0ab4ff86a6c413218b2645fafea6cbaf8639c62e79fa92e450f8afb93fc1b1d3e2ddcd9a6cb18429328ffdd2ea77ad086e769768b4dff0c230a9a581f1d03", "5300ac536365ac51ac", 0, -44332183, 0, "a6512dd1702f4fd2003e1d0e01a298db44bfe8f7c4c9d89511485333c784c50d"], + ["4c09590102d20aa87db148b9a0215588e0530cd1d349ee127355bfdf86e8894050561600400200000004656a6aacffffffff2f70d75ca6f618c4c81e7325adc2e8bc9a4463529ba4f76dfee8484c661601c0020000000451ac5263ffffffff03a13cbe04000000000765005353536365a4c6a500000000000365526a1faa9d04000000000100b3768cf302c447be0200000000000000000000000099aaa6721b532be626d43e1a7942fa575982545b04d40389f5308f8819000c0ba0200c5b1fb490472e37f85136156c3fe9dba60f01faf9d260ec9133e87bc7f1de17acf304d0aa0c4eefc44f8b00697eca6b745f27206fab2c3efc443738ef6100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d8cbb1f6800c918e1eb4f9ccffb4592b2a50b30e67f77bd3ca6b8ab2c82259dfbc30b73c2d96707a5690fa7b25595121af830d04e1009b90ccced3987877aeb7e2c103a499a01fe163af2fe6e082f84f906fb462d60a756cc065835933276bca10f9547d7d131bb2f9288254cd3772fd0aee5c24276a096acce6e1de0964ea7c031e9c54a01eeb74cafc58cedf370ff273cc4565516b9d6daa57c77064bd6895100322c1d69462b7f4b0ea8536aba6c6ebefd809e4445a84f18448c781a09af46ced0b0016178701e119cd5bf3c07e68566fa9aec43395a9ff0e3a5641a97411825e7e72c0643d144880b49317f0cad0f380d7c9a3175a8ef4945d31bb508ca4e8051d0324908728075079c03539ac057a2fc1b3c9ff2f33137a4723d61804b6f820bf01022d37a73df1201894e787c3a151de790fb099b8737b38793169efe10684123d97030bed7d3f2dff393a24e2884069a9ac03dec92bb2ff3eeb2038c97d4c2bea7e81022014757979ab27b8377859c1f555507d7f0dab8b2554e35c770fe5abf2b279100202fe95c2c5a527a9f0bebf005f230d4dbcdd7d567b669637d6b96c06d45c97a6b6dc9e9fc88620bbe22b3233bcb5ee5d89eb7403d95bbb9657150bca171b84da67075f4840c747e2ecba45436978306829609b9de72d0760e623f264bb74cf987fe8f440f8e3ffe76a25f6437f119a8dafa4df2561fa8a4b1ead0a95285c8735e29b826710cdb531d19c7935d5f9709e6909a488debc88328e1c20be4503b3c4d7a1d463c9349c8815ad0f517c45277284404d664b0d77c96f47c2341cc525408cc89286b1fe8c67e4e10f43bcb02c540d41cfc8bc9207735857ca2d6b2d2deecf5d95acbd02a19e6d13f355b67b7d2742894158dd18cbe073a9f9e82adabd5ca6804bd8abe4cf6b1bce8f5fc9a8a545b0e0786c69ba707e52feb6f8dbebf823bb98ef84312229cedaaf40fcbdb344902a05a6a60189b9225c043edfdd8b5f970b423afce85c1c729008f8fb2c27ed8326e2944491959146bfd20a6511f94b8592da0da89343e4627f580062a3d9f367bdf99bcdadec935d25b457801d44945eaeff9e9ebf976d5ff90487397401e9c57807b650d1045831597235911c1c53456c3a746ab8499ce9a2a5cd6a1ae487c351889c1521b5cd57114212316d387be1ebebd4e99679ec84cac0c8a83bdb09a1257d95f70cfac2ea4000091805c6507fb95e134de9404aca5d385836116194c8b3c2b86898744fc357dc123bd0c9da56a55eec0b65bdf2a13c8bcca4c8f9b99aca4ffac2056060f29c8db4da650347df0dca5a6f6e3ff4b19dd991a4c8bf50c4b3067ed885387fef115e57da298e6609953941c3ef81750470b19914781db337c2f221d64f9f0e24d1be4acfd2dff8c9b7121f6e081363f2ffa7eb11d306a7ba835c8f810aa62848190f5148d56bb8e45fa63185b3eee54757b4e1357ded478c441f4dac375706fe7d8cfcdb49adc56843ce4c396497d2cd650dcc6647390a37355774b77b82832e588e885900b867ac65bf61a0cd8757376dd6470c64661bd0edf54cd28e5dcb7a467a40696e1d5c39031b805ebea6e92af08123dece9ea6049deae69cbabc4e9ef629df76262b919e38a52d97c15f1dba54c4c2bc91f1e86caba4be2c38dd2e5308f2ffd8f5415c0c5ba9c2bbefd471f3c847f4f93e6f258feaee136d03d07d284be402e03b57867d64edbf996733e2f76b479c48bf1e8ac4dfe151333e0736ad36fd327ab897355986b6f748e4366f39a5baf62b75f8ba16ea5c791e9d4603841cb3d3fa2356c06a440f346ef19a63e949859b09ab7c89d1c7d10da9b377d2690feb114b16920a2cab9e34f29d8cd3b1310990e384642ba87e10369ec62465edd8751e49d328df5728362dceab997b84b084e08e4f44f40c6ec63a7707348ed5b57c38427a76bd73c9a2be2667f98af1892418c0557946a71195ace77117dfe6a8406599b7b7abbb96ed638f81f739aac44b2c8e7735b73d1ed77f1dc6a14184edbf79b0e9e9e23e9593c2d669fcad27c41b178be1c65ad01b29f8db9ab8552568bf754cd6f5fd8cb6417b1910bd8a26ac91bbe42c0158e8a9f4e9461441d2e72892050176bd2e812bee370b916cbf168a7786fb991fce8f6cecc00d305ba8c31a96d158f849d79121c1c736a442d6ab5e3bd7e4307a2f16e8b0dd161466c1112cd586a6cffda3cc596cb23c5316a7f50fd313b88bce56ff2ac7ccc3d143fb4f9080eaeaa567629c52996e2a7663e66e25f8c88edce181352f0e00000000000000006434340200000000e8043b522b2f2ee136560f377f925710484f05acdc2ce32f704d2e7150199d51ba6064f522ccfd4375ebbe621f6ad96d39490c158ca38738a84165d576d16d697d7cc7d2d1287ec73d55b9f8b4b541fffd0f27af4e41c3aa8ec2282e6a78ccf900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000abef9a9234d54a7f5e7dbf80e3d594ea9fd78e10560bd852a33ef483bbcc21e18b6e149ec1b2c2d14aad2fef8d430e11fed23a5e07c9f3c51484e4caf65e7084b277e2792a8a316382092997bfacb384754481e31f294f5f1181d1303e94f6aae845cf7d230e1c78d75504813ba6b7c2c5f941688035f74749bc2527a7b1b7fd0204a88c8a94b6ddf65d7a064a6003b565995780b13146ea408bfc59bd08108b7a03030fb012a1740450587d4e63915d5a9c742159208e0c478dd01bc87948b3a7cf0a0550b9ff5fef50fea0e2c4f8258cd351d4060350b54ea2d7ece32230561be7e57acf878bca8910505c3cf300409300079b790ec04412da7890ecca25c31028c0032af3509bab77db245ae6bd1a1817f4528932d67a4900d2dc6aea4c2cbfd7f87402304d695e1f6ff520f9f6e720a71d34ae3272de898ed1533e4d68b690ba5c80b602061b7c720d9fc0825ea9fab3be2530e6e317a343419f68e0354b36a4abcba4320226f2a867edc87e33e7788f7a2a684fe4374d20a985a970ca614453111d65f32a0224294bd85029a5329505672e3cc3f197905d261b613065da1335101dfabf6b11e753c52eb410a3a27929b1bb2f2091e37f8833340f2e169bf016fe9c34a812a1342486ec4ec9d2f1e2d2006e9775dce3870e44fe2f4af2a7bbd3c3a851394ee15f9c31c1234b3f65143e9917c187f9740768f8004786cf74122e02410ddec278f0d65df4d578395d368ef431800cfccfecf6e58fde1894e052c2509ed6cd2e9ebf1b688e87a8c8942a6e3c0d45a4b6f3fe5cadaa1d189dd9116b4aa640152061693d0ab9b4e9bb586aa473545a9bd61d15a10b0a872e774cea38c287f973249354e19b0b744cdcebb0bfb523ae7144a13c4a976554bf81de732a0d0e025a73ce75672193ac3330314e51ab48e66f144b3f990b9919915331291526a486c88f45491081f2263c87a21aadcb9dcf8e5e310ac5121f78931ce8d347577ca515d3a5e2a8bb011b76afd400b95dc7cd2ce5e9a973672fedbfc509e8550d4bbc1d03d4b1d5c0d547c01bd9592c19fe97c12253fdd26f4436111e4f72cc2d7abd6a2d30f9409d9181ce3885d89889002439f8d99c9c58ee02169a8aac0eadacf50fb1b531013751ffbf0464b819048bc517cc0a2d2ebdc35f76b4192484164113b7a4edec2bc39872b022bbee71b6f3871411e292cde1f2a2b14abf79db5b4df45cc7f0c9298b75fb3534b5d006bfe0d64913a7c23fb282899baa158fac5cf7ea6141018921bf7f10901aabc52832f481d2aaf2f230bbab65b463c9ee13c5ac997cd4599ad16a332f72f2b7c03090a181249faf4296c02df5c7880d5ca5d5970fb60937bcde4aa3477118dad7c63997a8ae8c7a57e7ce72c925520140ae32b85b50c7d11ea74538cdbc7f132470573802d10bddba000228e6a1486d33c03c0a451bb5350bb27f82a8e384a29ef5201a4b06122f345413194af6b2dfde968d4d1396495395c429680c4e6118dde29dae8642dd3ac1b8cac59f99c959d0989b09c56d4c0f1a404175bed9261e492f2e2f06e377a86a38288f4d6d35153b6d2cd719b996368d2fee51ceb42209f0ca2f1c02a5e7ddd3e08496e3bc0003fa5dc8719d588862f59629befe13c16f13d7c8240a76116cfffc8f8a411f6a246dfe70c2171f98f95762221a742eded79cbfe22e4a38365cf4ae222efcade719de4e30a19744f352b433e53325c3714c5c1bf91f216d5d2e69321a10f054130bed1131bdf21e2aa602f4ec37b25f80ed653119f789b8698490d6fc3c75aba6b6f18303be12612ad4b85bb13a4b048caaebc6af7669b5c2f3c790696d4040297a93e881eea3a01f81f9154530da05ddc72d0fc3303fa40fe7d870774fd3a02c3d29f1aaafa9a0e5cc463f8949aea9a381b86b051efa5a714ae8694de15e42e741fedab863c0023772bc4f7248396f97ad5732a699998416f30a79ead8f6d712c8aee8d271bc34f94eba0035fa87ffaa42745a13747500b1fb4011fe2eff8cf3fed853bd1122675bfab6c7cbabca0c671a03de12d228254d3bf5d57373b6a9e70053fea44c0701aabf91f4cea73713eb9df7832dcaf30b88feb2a47711534d20432d7a8ba18c9674795b7303a45903aa7c667ee619d1328cd5f9f2c00ade26304c63d31e0bb69d672eee3a7a90e234625e7ee886ab15e98c38a68abbf9125c30965eaf56f0e9c386e9d5439e3a99b59d4e5ae00451591ced69dcaf0c6cdb8fff20a2f8111740024ed1dc550cb7d466f828bc76e011b1ac63eed6d5e44c07a69c8cff46f79d6540232ed7119ef298ddc11d6a359c1b9d33fd40724e1c2a13b8be99523a0fcb033807258bf9b36fc11a887d9e9a68289e7150f081caa5147519218ea026700210876f06f2687749f4aa0a08a29589d676306f66b209", "6a52526a00", 0, -1065760457, 0, "5a26b9b5ab0c0c33baf62819fe63edb7be9a8e4af47b76ace853694631382c02"], + ["227ea20b025e1f8ba772e6a01808a3b923c85dbc44c5be0594f0732b9dee0bafcdf6efab4d0200000008535263516500525130ad7e9d2109da55452131eeb701008245271635b4f0cb96a914170f30253c6c9bb0b4040200000004ac6a536affffffff040a5b95020000000004ac65005213952e0000000000001503470000000000076552525253516a647389010000000009ac63006aac536353630000000001bc538204000000000000000000000000b7bcf58144bf18e8fcd1a92855205974d4c7c581b0e0be3c6211fa5206914d5221d295abb840a7b0c5765c671bc79523bd9f1bc2e3235b93142e70be17787d1531b74869a75e587e4d9a116956bc2e4b7baca665b9aed73d3baca4885889493800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ec0041179231bca4f78b1d4d86a8973e9e4121a4adfed744ea42d1457ed881a09a012ce2d2628b95945c356c3e1410872c8cf41a940e57c3d3d26155ffd9aca92c71979267159cf7c173d78d231cf7b4ba50f202624ee2c1498f06f5358b2ccd73644d011375763dabf23cff92450f82b287fe8024d4acde83a504c09d4586eb03189fcceb76dd6f2b4abf94ac2c32a8004b0f72d32625a836b8ed7611c9f74c6f02228fd00cd1c58f9a9075ad2d2f72cea5b87564dcb2a06f36f985c0eb18aac2930a071d4aa9d2136c2ca73216a90541e7d871c231c87166a816506adcc11b7c0786370dd4cb4286a02263d974e796d25e8227bf15d15a96f898acd8154648601147031df6fb17796a573e4a05474d5ee94f2d7c2e52cdbcb9487a39925c8a1b3d80ff0212fb4a3dd913e41efd2110588f0ce6791e4852231668235c977578202cc21cf70319ef3c9c4b802ea02e65f8815f11766527d43836babbf492a74168ac42c0b4b3021724f0158e1267f7cf71b367183f377dad0976a20b46b5e9659fd9200cd316ac0328ac70543ecd51b16821b5bf859fe4091689235ecf25576fb22ae85c550971fa3b0b761f30820b7e38f02afafb6028a2aabb70d7bafae2eae6c0a3b7b83832565a5a8e5a7d949dc566180157bba4a9be0c95bf368f89705e87b33a41a6f20be7208caf642ec50a832abc7ccbcfa270f0285e4cf5d43a9bf3bc02d1973e07b08e7f6690a2902507ee85e641b4a30e6993635ce93f46289c7a2cb8a9cb10fadc5a317735967a402b401d0c936a2ba8cab8addd94a93948e25ff2c4b23244a2035192a7e8bde28a32a62fe6daec8e9afdbb237f07d365e55c23e1d1162e66436fd08d6fd6fdd8099f994904bc4764ce6e8a44c51de74beaa5e0e9afad2b8e786db447959c0cffe89a047f38681eb71cca908b010af327b58b3596d15d5917f26a95da8794dd7e154475b955c414e4a164c6779796cff9daf0208aaec6ba481a39434da54d304775f06e58e0fcb84b32f7e65fe85d606d3e9e2cf75eabc006911c23b333017afe39fade17525fea77ad37a03590c582c082ea5aecd8befda3c9f02504d031525669bc82c9bc46cf1f389d4ae26d16f8d84b0079a96d6b75e40751682f10bd9af1b32e334cf9d06141d7bd6cdbc1ec940700d8726a19ab08db06690816c8c288d686ca2a53404d5989879e23ffd187ab0fdf8911751b501b4403c51f6068bde63c663ddb25af31f20ce0aca3f3732236e67178e539f94b776f01595019eadd8ceb5cec89a66262c59b8676277cb4dd4296220cdba44484b1627b84fb5146de2e9cd35d8b021dcc4741e1101ad591573d63acb9526a8d68e7ec4a41b47c5063666ee6dae0fb5cc64f2d36ecbaba010f5fb0872d9292d146e2af317f69beb0193ef5495a081890ef350190c5d3b108843fda035491f84ad88094520fc4afce18245fc0a5ad5cb443e9f3155702c4c0e18fda3ad84f88294016e41a6488ce47676fb69f2ddd28f63b308815e482f3d5070365441f33982a15942f9f843055dcc4695ff01fd742046c2803f15aae56a53e698501e6ee4a461618ead5b4f4f70b0c29fa5f3c749dc976a6f540aa68c7ec43f7144b20a0c83138eed5ddba8b6a1831294ef9bbc60121e8c1b13d78cc1e9d813b0d774c7d86cf2fb8d149784f9e92d0554423542c27326ce00721be8646cc6aa5e3b91785113d4fed2c3a1857b7b37457b121e28fec62c62456a16abf0d694a5c1b982ad84977c0c3d12ac4412f4a133a77fb6a44302a140b328b41197daa4d5f5ef06bd7eb84cc4f41593f29b4996905f87236fb5061332f2768e8f7d7fbed4214f07b8d74912b06d57b37835d5b8dd5044722e11fb9c62ed719a957be154417b0124c32be77d372a5d2d3209c43bf018f498cd435be387f55a4aba64aa8e0601948ab3b847969d3309de8c65ac11236de94bf5cdbf9d534c73006475e96c70e34de8466613b23e5e13a6ee9ab784035a14c6593bee2a9437a9fb7b21c42bc93e33e7342d17ed85aafc9b16781ee941871f5f3e99e6cad37860082f3d541386281d313647e7bf0fc2cd7d9465eb401cdff355bc07c49db08bae3ecfc5755f0c8723ee002841c2f65498ff1642a4389b5986a6e2d047da85a1063dddf286c3873cffc6a2eb017889f61ef8f9d69ef75f169d99ca22d0a339de64c6c6ed4af8987630eecd62a3ab6b35be56e6b6bdc7b12df9ddeda2c161c4e61159de13a0d1f2354deb011df4d368739fc8afa2e3f4be66ea63f33ecda1c8e051ffe0670cc8ad8fccc3881a73ec03cc7c9ecb3cf62b429faf1db05d47d337b9de629d217aa7579f158cdc55f0ec2d0fa6f512adfbbf8df48ea282c55fef83166456b3192269a11e8c3e0572625318e642923b6dad9a00789348ff4e2eac1ed2bbd985d150f", "51006aac005152", 1, -548961653, 0, "ec1dde2b2f537c1815d7b26f9118670b6e6740a8fcfd11ace3f5b890ff5e194a"], + ["030000807082c40303c09f5efcd9cf103c2412ba59b785abb7cf338ddd7af6105d78da39857a4da73301000000036a5165ffffffff38b005cb8bee8db0d2cb5e10ceb508898ce4dc5c92d6a7a782f53ec2d4462feb000000000365525139755e2ae3000909f2676a3ef1fa2f60f8b79a1e2f96b1770b0ba634e84b4e470f4fa6fa0100000003006a65ffffffff03b6c2c102000000000152e1b1b0000000000000daf77c04000000000200ace37f02f600000000030000000000000000602470000000000015094f7cd14821ccee757a30eafbf566f440b6e8479468a813de853906757b1ed0eabfe9c4b6664c801e1cdbd7b47e68db579e6fd23a9defcd8874f34939279f6074af3ed1a7839f210b9a89e86d1885bfe8eb05a58ce1e4220f92ec6643e5d5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a302ba5ebf647d8514a7e5f6ba1bf55428a27a002e8d3ba2929fed7ac3a79d3f39ea69e2ad9514483bc9635189dcb1688e951641e0111b0a21403ae535d6470a4a746ab0bcad831614bf7d1984f89c94a7819d4490401bdaf04cd86d422a3aa02a2aa050010f36ccca4e7cf007f0c2d2a4939cba5d5b71ea1197277ce42768e022ea6b43ed8608b8ae18d185931ea11b96553d8cab09ce2fa46777c671402b7a30226544b84498e0d2d536f9c3708471b46f3082805b03b6b156de155234277bfe20a053b7d61e22932f60cef861723da81bf6d4b83bd0da5fdc34c02257ec75bab047aacc3e2891c77edbe5577eabbfc919fb9ccd34ebdcace2de170d5eb0d7d3f7402002064b20c2bd57de3838ac3d8797cd15d49c6172faf4b025ef0f105c6864f08020d7dfd174a0bee5432512dac8690952364a21877a3e31e68100912b7df9a3083032574fc6553ceaa686d4e3efc3fec068a1d428da492d1075270786091a5f1e165021a7c1457e9acc35258baca08a7cf64f92af26b23e07f07dc89120227fee82bff03016be83431a4f0897e84f7f7b0efbccf2060948701b104c375781318a3f2ce4ef75f971ace78ea291bd897a895a8399d9e9c9fe1f14f3216ff96e73468645928f3fb5252898944cfdb911e8ee4673a094d3744353ac706ce5e55bd8b29a0a41a0669c0517c9f5b3fa124d4fdf4c94f445f9514e79d43d7a62a63874c731743e518367a2ec2f0d5ee292709c9bdff519dbe413b4b5c0ccb8bd455893778ec32225b36980a18790403ec8d616ddafcd7d002e97b576e54dfce68ec3aa9e68c83a9cbae78a5b0d2f9bb8ff893e001ff92b55227c58e1bacf1e48dd8d909abdf139b11fed65b661c9507d7a7982751da72fd49a626661da487260ea7f305895150526e7442ae80ec067a666a6302b287e1d6c5b60786ca28a4f72e2dd6b4d3d48d82365742c5944f96bc4aeda5ade00f141737ad4fb51597328a0af5373541956d5448c1c367b562f96a64b2e1c9a7f26018b3c9a15305dae204a0e5bf233f9852ce8a4f5ee8fdfbddb778b77101fa8b0c98d4c7df90a015907f397f230e022d6da9276250c380bcb1efd52e52a20b4e460addb377790df81f229f03c97d0b207534b05a2bf78a135cf38b8ba13edd3aa4d6249a7a91c5fb7ee51a8c0a47470c9be14538ab6f2adfab2fe87cee9d215714a60a19c95411e0c3538009b41fa87d958c9f30c4ed7b10adc40675bde5193a20708355fa6ac7433ef0ac1fa955668770cedd79afc520c0b6128da737c9b3406aa2efde3ddc39f822b5eb59c50005be5a6da96b0d60c4bc6391e3aaa7af025ea6eabfdd0ecf6572a23657927bd23562825166a8b6388aa6735c8d386e87fcbc127df74ef763aeab403d9531eaf78390bf0e9b23a3c632e690dd47c9aa7bfeb41aca9def12e18c7521d8fb286eda3f5809b7e7c12a45dcf52f8387f3f7d9a45f743d1c4e7907e25ef4c0877af054283b40160d0b47756f193094e77a0651c648707fc551aecad61f8b840f1dd500cf411c000ff4e834b3e2cc78c88cf2606cac55781b75cbdf374d8fa4d0db3828998493c7d30352c6a108dec5b8b748cbf20fda37744675c46beab9bf87b6c65adb90b77ca434031fbd670a4d315582352e3ffc9516d0df0f08dbc96ac1fbf9614050018f0fc1631becfd7c490b1a77f231c56635131fc6bd29f87eeeb0af8351a206bff14815358021f26f11c11efd1a45de10f61588881c356540be28eb95fe3a0a56ff0305074c12de2366bcdb7d1a63dfc4804f5570a061cb44ee75bfbdf706d1cf4f5154e6e6b5bfc4776c7f59f1efbc1817e35b8754d36410245da6f0620cd41a1a9bdce92b399befe88de85bc02dcf638800ec56ddb21cdddf924a961043df74ceefd80efb8a242f9150c5c0ea95a2c886da3f704aecada2c32d663b168ab2814e0c0aba2738235f75a081a542caadd692a48715828206a59bc48b5d8ce9aabb844f316c43959ce1c69dcd22a597836426dc0959c83547a0b70de35a03602fcf0ba033916fc7bbf2ff7fc2f44e6b010255edbc115664ede2aa00513fe14beff02a1d3539ec9dc2b096321de779eeec0d9bb56fd331cb78521444e2d47ee93d6c762e0a6208d8535c988ef5c51095c13902786224f713c120d518ed33b74b94e603b2cfd9d3d4041e447a262aaa85126836d2a3b60d51becdc7f060e8f3a470b3ca51de785944a3c37ac5b2c5843f9f489dd39e6645f23eb6b459af6b1bd9a583e4be13958ced7d4f9927c1690f04cd483732f40000000000000000fea3700000000000c9319c4715524cc4a71f26c5b21baa70aadbdad4a32b4e256979cb584b6ada3c70c57d4de5c56de27844b2a0d2d3342eb2c07d153ba0454fd7fb17d62aa8b6f437ac328dc2c99243cfe960551cb15a6222f3ad14433fef2310c1c589e617835800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cac243125e8effa09d1e8a13f6e99c9085bf70d5051d4455f9f32c0f570c8729ac0e294d206eac3758f95cd726086f64ad2523e21eaa3d740a468df08489dffdc244092628bd0519aff8b96ef479f7ced633e27331099abe00353796f1a52e9d82be2f56a52b802b0db171b4e1697566bd1796f0a21a361e988c2dc4e37c8c62022928c53b4d892d62974b0d583644cef97dd5391dda197ef8a5cb0094696d59da0304dfb337006d9082374898bbbe4817135d529a4f8bb0533e9500832760ab83f60a0588191f8ccf07574d5bac145f77e482e05e9789d63b2605f59a60461cb6463545b5c2dd64870a1928ce263e3d962e95ed4f5bef600c7dab058bfa566013373a032d77f0c643001fa6404aa1c44ad23aef17bb46ce2e92e1a68e24ab7e0c6bdc31020f66d3e94ba84ccc916c0aaa26c42ac9ed2bc787a2b0d0ffadd843bb5efdc04803020e64de80be37fefd8586c0ad7a45c6b293783ce6389cc487375f63ef34425c02302966918227797d6b6bad0918caf7ca21f43f4fe389cf8d39ad144bcb5819c9030c2b047a1912c9cb3ac4b3a83234933193532bddd57244e49fc6a351688311c4daf599c66eae64fcd6383cc01d4629ec8f2549a267b5e9e8c9395ff5f7f35c5bcac877ed125b343870102fc00e081b54595c98c87acbc50d1319e3a92dd558eb1e81aff8d3dec40a9ffbd13ea28ae4e06e3396d34c9e0ea25871393e3eb3b107a8416efc52211a0cbd4f94c53d7e941a0366d1421521bc0777c4117201477652f562190d746d772b8580e52971eaf2b49dbec8beb740c040ea147c4b67420d2fcc49cfe05919fd1485864acb0a0277eff7e3103c60872ab2dc555e1432800c31ca6666db82365de3dbdaa9ba6f12cd6cea4f3844de0607fb84fe71f32fd6abc43d43c92dfe807fb82767302c1d881af9184af467db41cc531c8c48d306cc8416e4a17f52a6d7cb86ebb97e19848a776af1b524640226a26c8e0e3c64c3243f6324b78ecbf4945e9991bbb60dfa83d2656e0df4cf081a8c99ae01b151cc8a674794fd74d6aac8c4b55699c6297302602d9625d7ced2d4bc662ed4d2ed23f4d9d562689d1cb236edd9fb1eec64c823d43e5c1265e6daf1765cdbd9f605de820635344654ed69207cdd7a34caaf2235d6f8d2b8e8c1b04c85260c7a24c9716b997a85dc0b35ae00fb21ba266a0867b0e4cd12d56b917c9dccfc024360b7c448020492061a2a2742406de2715a843fbb8130beb6162ecdb2731f3d20e9bbb1e14f599c45d4313a300a8e9439e3f641a87841924b778daa5c701bd6410f62b515c620477fc60669a3e2b87aadc636c786d6a1239186ec234d4b46f903a598491916486f2e6862b81dd62321faba8a3ed71cffd0662fd3ec5fda92cee52ddf23cb42e80469038a6742d82eac115db7dafda37d469fbb6b593c364304892a10448a618c0c534c2e00b64208d85a78db67b0f9b2c21676a419e645d1eea1ad4ddc1b38b2dbdb456685851f79bf136f1a4c8c1483081820fd54b385b21fcab10338fef87bde623d54421e46f58c69d09532b80abeef133922c4163cf404afcc8ac2bbf1cc60776b5b13d16aa2124b8876da31e7970947abdb7dd582d00c17d62c94ecbf6a11cfd721ef539bb6bc337de064fa2049c7af39e57cd6bd753b802d69d55a249d3842bb57b9bde7057ff728530fdd740f5421d79eac8df6df63f79b4810de3c497b8a1d7fb896991a24b37c83841d888b989a1a38120190513f28cd9d64f135ad691c1eacde8a4c1cd7c94c02563c490792316b594255d9792978ab7570fb2bb8572b8bc9c1d08e2396096f888e6695ebe45bf9d4bedebf80b23a2ca3c9157442287bba0ebffc1a1aab33c7e45a2b9788cc286de4536bc969b283f16d50dd74bc6de98a55781765064c30a36e80e0c652c6b779c53a9049a26db6204cae8662c1ac1fd92119469314bc2e376477fa6614f2b228d116d47a79cd1d9716575efef3d676538034e01ffe3d35b8b0bffea44ae6b5ac599d1f5f8552c091cff5893a8664321cb751bb4f16e860621e7351d06229d317e7284b5d46e23964dc1f15dc45e6328b0ae5682cd54346f45d43a83ca996d6b4454d6b69750aac09af004a5ad21e1a86d0f4566075086c5954a7c583a99d6436bc9a4113e713f76e3a45227e6796946479b2fdc47dc451a66b5d00e0018a96f7a2f8e089b0c46ffb7fcfb02c10fdb31d05ba15ab9d7f326cee66fd1e4210a70727193310925958015e63cdfa1e87684021221b639ce4be0a5dd10f3e1c8b2112b70d04000000000000000000000000273a6afb3987a4a04152a57513d541e4c9aa472be8687e6ef7ec2c00b57b71c5c29e8ac3729fc3f47f54c3c9ce84dc3a39c3f4e530c481f056377c5968c88d0fabd1cd3a33a8bbf4b423cc5bdfc18092f70b31d77201e14a1394ae04059a376e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021f14471443c34ec6584c59ab8dde43759480987bd14a00b8c61c5a5ebe5fe0b4ca1cf2869e0bde2fe7e970ae30f3a5069f9943551c0e4b9059ce8b633363b79c9b90d97dcc5e3c6eda9d3f40868f14f7437f2205e961328d0b609589bd81ae61bc9e701a1e5f0bfe583761b23b8b55a8d51ee35b860dcfa9ce84a5db178ee37021f876931847e934f1de6d01494446455337c3176ac95836dbb1fe285a4c286720320bd9be71c11e539e600f2e7aa55068b859eec473c6d9ec220016e0aa6b3ff1e0b0381b5b4c889c0719b5b62c2795697067b4c57289affc857fbe325e0c13d4e6bd7dee58046f45181308a97095e340be95a27e577afb9135d0caed86e86f27d0903206f52264b90cb5ae4f66f765681c6e36c31b2f23e99cbcb68a70dfadd14974e0215bb151d6481e7e142dc31c822905b0a37cfbdf7b0602286218f07c822d07777031f65052b5a0609b23bf9bd246ba2c5e50bb5ff7869f3a85fd272cf477a5a2e9a020fb380af5b8ed4d1229d7cf99efffd27b7ed0457d97c827a5a1fb81fc581ccf4030c419856212b6e78324d710f10ea380359e91067de76d96e0fd9a480f20a076244bee1b17346cb7dec3dc97b34e52e545917acaa427a18676ea6589d851f6dfaa43007e1d9b0b334212dc60b1c0d2e86247cbf9d26faa71a13cc5a85247574f1c383b35373ec5ad7b8b55ff4fc285e28e2f5d51694703ef679a547c06cebfcc438628041b869fb5ee3c423a5066e95d1f880e433ebdec9b8b719ad9d9fec3181a907341465ac505b67e843fc20546b2f2a42078e6b4500d643cac62c3b26430e2f56ce3b626cf771b90d9b24339ad7d8a919f498ee06f895852a26a33bc4f61ff696292d141e578c040d37c5a28bc92deecd6714140f9ef048238e044f2e03b4ee1f90aa67b365a0123e97b3f2e9231ac230189d49b167202a9682ab51e98774e056e541b0c725fa00455858f192c98e6a031e1afd4de4818cd42ddf4e27d43b4ac8a36a15bd389c76d91c931d546c91489060b8905d837d1cde7f899f4cf5cb94c11183126d1040b6556ce0407a98b282eada798074e5c97bb24fc63020fe15a6f6143cda6fa94ec6e3924ea74cb49f4c0b7937f4b258d0692a29d227dde6761ac7d7eb076bf4b869b8abbac2c59c495afbd72ea111443b1bbddc831154051e02ac314b1cb32f32746d9e8a2fdcb1b70fadf21901502154a0359d471a7175774a45bdbf74e55a81fc9f9119f70643e8473837b9f75ac02b961ddf7c187fbaf0f16b596ad0f88c3c5c00e2c51a7073b95f1e25cd301cc8c58a45228df852487a21bfb0813ac77bd93cca83f7c18d659ab564626ba57304cb6e42fbcc3693868160f07280109f927cc1857979873221d41af3a2a9a02a03e6f5d9b5a2530e47d33ac177469f2e92ad2d85053aa20eaa2fc99cfe2c7a7278396874846b3df596a55899abe1e069bbe2a605e412b5a3180cf4aa21b698a0b171289a7c60549abdaecce6e4c244d38e6f011cfea0a500795896386ec40f0e66c84d4d4e91cf3b5672ba146e7d2d40673e69acc265e48afcc83be0f336ad74da4cda94530cdb4637197190a364ec4857d00cebb8c2d08b28c5a0e51972d3b66e6a321ec4b21781694b6d45b7d6cc0d2fa65f51bd2c1cc49b549c5e41dfc7698ae2f741bd1d414b06d4be7a169b67f5c24817402d77329372f2f5079ef02032f99121ff6edf4a2ba752626c653a964752233070f74bf2e492c51d19ed1a94f27f9b29581856dccd90e676e90f5dce69657cb9d9a87991b93de6e9240a81c7f2f0f34248c6f1b4f8c5c7e08ff9bc83aa76946346cede7530cf69de49a736582e7d474a93cf7f72806c67bb5f26168c8d2dd6fcfb5ff933b44fc91d57ce492cc248d561978040ddd58b16ab4e9f6564435584f59f2ce7690266db5d380523aae034b047f3098d67dd1d010199478f182b0cb631c6586156a35f7f2759da450e20036e90d194e3f1634a150ac8991e3da6388c657358f46e5d6d229ebddc6e0c50c73130c9a2d33fad97cdd59ccf652266075cfe0b6b9487747002383562c0a2ed89ccdfdaa0e2412b0adfd4ef95cb8fe87305e9e22fee21757ac8185113f3afb72962e9ecb4da243fe63336935b2b9545167edd929760da7d43cb58d8f5f3bb5517d48ae5135cceb395c3df925ecb2ac8a3cc4d3b72509c499082dd58b0801f215096319e54857c58f768fd1c7a943e00c1ba66917147be020bbf7c63706658a831d47da04b5494f02c864642667f21aa627eade11199e6743204ae288151293e300d564a910ccdf10eb6419d3339bf2bf02fc211a4d2fb9a3243d4d3b5bda60bf88402953b4f81afeed7954afd05d14a772bc78512c6b52571d3c9dbcb5a8016933865d50af0e5a136f4891ff134b9573b9296625002b8a2a3e6150e", "ac63655363", 0, 1179146788, 1537743641, "9980b5e2b8f8f21cc6de54f3d387c1b807ac8a554a1e66c366954f24c238b0d6"], + ["030000807082c40304a44e90734edab04f43397c6309123d4a2c05841af54e334d74662d9929da55d20300000006635351515251ffffffff71b44c35ceecc45dc7432bd74e9bc5c9f72d0d35579e2391834ab392288a7dd402000000096aac656a535252ac6affffffff477129738b7117df6f2817a76b5f4324dd21bf84543d9efc282f79798e156bcf0000000007006a6a636a5253ffffffff8234dd14e0b247ebf97af4b10abd72efbcd0b1e3ea48b4d6ee6e54f56b897afa0000000006655165ac525367a8f1e602861fe303000000000365006317faae0300000000002207761e3502cde30100000000000000006133ec05000000009874043fc7b6959ea2aead2ef53f20a686addf6c86abad7665a3be9da23d5e65af443745dbc3ca2c5347fccec81f2d140a184df6f3a2b79500d20096f1f52bbc2e36643cb7d81c37c59f113209063f5a5c70495ab64c93f046004a1a13abccbb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b38a463e2d60df539d4c2a4c671bf810efdaf5e58c8ccf264fd9814428df3de7a8aef2ba9517d99b91902920b37b228b915c49f7781c706928dc2aa934e513160e454e663a58b95776043e8e2a728e6d123207c62bac813c348e30fae47cdaa4cdcedae154829db8ff2c77a1fac312fc7220c52833f81a098f28209a85a04d710213e2d44a94d3301ddacc1eedff22498209d2c5afc85a6890d7133e1b04f710da030e2a5f37ee768380f33f60ebe75e9aedc364cb9c56767216c8f381ecc6b525500b07b6f6346c605b25777f7caac3297c2b3d0695b5613c9846766436ee43cc34457f95e2a4d66534f504454452cdc4ae30e3126065b25a09b5e149efcbbad32d730323d556b972c67018368edc788572e8b8ab4dae9ae5436d8157b6289a1b0d2e96032ac84964be45bf02b3f6e9e6096d135af3300f29ace6b26211780ab2575467ff0306a91c35bfc566ea35885982ce078c4fe089a14d481fc377538f52924231e1a2020ca66cfaae322d83734dc7dab4019685bd40328747d99246803409bec1fc81770221e30729db4f35586f449f418309bdf0fe4047fda31e0ec5f54fd4ce1ea8d9e8dc96c6ee8e6391ca44ae5420762b59f256566b8fd0a0933934b642c0edb165ed3dbef6e30f9da20ae45867e7af033a2d75f9349f75ac35e574404a485ca6f6c106db5772a063e63e0e5badbe6a94e01cab9d8fc84a6aaa5abbd6cb9d1c9609cdce54cec2f229a74654cdfb922bfd750edfa53dc1703438179595fd1b0bacdf84871ba20e962f30150e447b99e8e7891b40334abaa47339c7a3fbd2210a92af1f8a988f71e0d8078a2bf500cd5ce391b1fea56911adb52dc7b44cbb7cb6a5d63ce1683ea3f5d1e201985e482583f8271fb2dbf76b63cf302fa8dabe6ef76bdb621734782109bcf3be51b09026de7b333924f6fdc4940ade1b3a52066a2d8ca964599ac55c3e180503cf1f357f42bd04bde6520587ff5917d0adf49cfc37109ac6477655aac11bdda44befb12e47b174aa878a30619fa621a61a6f0174b6aa2085373fe9f2497097e9c912784b79008acf60d8cfd5274902587377b0034fbff82dae5d9a66f14f125be7a2dfd2aac179201ba82dde5da64675d916388ee99419ea3e38428aa8da2939a665b643a27a0055e3da14e8e61c9a0a7a597ec911e10bf0d7cd678513df7b6a12e43fed814e724789500d1d57e1cd5d87938a833ab6fe63ea9525c7eed7eb35c631660581127fbac0fc82c353f114d76ce1d95ab1602f73e099212546a451bc4b452a57f03782bbfbd0782858647598ab46d7c47282ece031f1158863e04628be53db46aa23fed4bde857d34aa3c21af0b9e59db3844e8de2239482a4bf627746cb3a25c58853daa6177aa2150544ec4365649539136f3a0aa56d8915e92f225ad872d887282939653f07e43a3637dd8b41c195ff6aab84a9cd2aaf668d8b113af2d476b954c19fd9bbfcb34e4448a7cc1069ba35cefaf6642c9ce0db0376d86e0092c94de7eaa2961dba4e51d04db6d6cbb4bbddc7dadf6f504af19de2451f2946f01cb227060ad0ca3fa8cce323a1999cb3195d56545b4260f7d71df828da3fb083dbf309ac113e2991c3ffba3e90698878765206e898b60a05e36f54b8045b17885a124168a94f3f8551516c0711d19c39227775b1fa4afcf2570f214989d549a5e7a446bc50711d5736fef2c4ad12804d22f0f94ac973fff160f181d7bd484b98dc91382af4ee082a830a9021097d9477a4943b875a24f36e7c51f36f24cbbbf33ff271216998d49c9ba1ee8aab41951f12052b976b170cca8f203f1484c2cbcaae74e4a74736cce5503b89b8b5f58a448fe5ebe1751f651bec49b9ec5c2eec1317b872c11f52f2791ec5c1ff2f56c4988d974a6f60f5fcb6107de81d5bb1f69c69316b0dd5e5fa54e44d3c969deb0441e9dfebfed10f7304f69cb4bf3ee1c6fae3ef501eb8300f73dd2f3f0fb9531ee209bea323797354dde4300e51e96a51c2d58db81e430fd8ff124ab91aa4af84c80c6e079c1c4a413f6fe70f2e23152690fcaf4de8df1264aa3969c3ba34ea323423b335223a3cf9ae649a3c4b5eaa87775f544a44f811342b3d43cad06bce97974f3ccce58eedf8c63164ef8b4400466c34ad5e2039cee589d43a22555a92c62d652ee535b94b5a02e8e02047e21f0ce92cc8948a332d9461680ec7cad4ca46c1e33fb390575751823116f517973eb5fdddae19105737b81ccaca4da0dc56fa75e084bff0df9e38a0aa52fb17003605813b91313eebac31a4205e54c81b8a3ceed8f7a04584917b57dbea608cffbe64c6407ece2e5f5a5d1a73ea139d3695f80d46adb97349eb928c0375934fe339ce2e45218190b39416e1bb76de030d3c6aaa027255667c27e19dc865993bdbc8bc51a844002692f60d", "656563", 1, -1311201187, 1537743641, "cd0e21d4636c0811e74abefbf7b68af416480c3f7413f599cc2472e89770f80e"], + ["030000807082c403048777850a4994e18bd2d68d25d2748e8827c7fd2b6826c809f84a1b35beda4e5503000000026351ffffffffa8f2225e696a218da38209a11abb8b33db2cb089d0800d86b1bf712234eda6d5000000000652636a515352f5657c2ea975e215da927bd04cbd9f39376559084e5cd5f7d0a1948b58ecd376cab653220000000004ac536563dd0d96a023cfc8b60f09acc8eee2589a72cf99114d17b46f92b0f8f5b22f688e7f905f4c0300000007ac5265536a636af84a7e820463b8f50400000000056a000063acdb104403000000000163a26f2b050000000000736c2903000000000353536a11593c23e1b41bcc01d832af0200000000000000000000000040607260f429fa2e4075db48796a0423451650f8ec8b697f0a3632b66362d44ea19445d2474883f2ee41a82c6c8698cc6adc7ba587d408f59cbc202c6c42e49ab10124101d88afc34dd89cd17210d108196a9640ac80b5f6fea0cdff34e484eb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d5a7c32799a078e374aa2bb02f78ed856832a8f649274b153e00bd2e0da54d4b90a9688c487d95eba1c02187e54f7145a562901ba96884a5d41bd171413f89e7069e2c5106a2b68185194968b1e11911d49c64a24c3dd332f471941d63c2e1cce74c3d4296f2f393276d1797c4a217f291980bddb11b3a1a06fb8bd1c48159b02030a80b98752faab1ad08ee50e8646dc3859f1966dfbb0c9eb422c22620b0a39021ff4440cd66c4b12b6df5d978338ff8b5b6d8106a200031e740f93fcc57f3f860a047ec2a906e2f72640393ebf955bcff1b162ab094160e9dbaa2f502f73cd16f31c25939a500784812abfd76ae03584d6f6fa56de8cf97d81b20b4363999bc05b0328b1c5fbd31182ac90df677677847582bb459fd0476f4aa8d8433c46d03087b502067d12a4e5fccb1f66c30850aa06891a66e0799939582a3dbc7da56fc4ce721a031576647f83e1b146c0e9cd663c020cfa6da167f057d3f6e0040e5fb1b8d067ce030ac0ef3e2b040005c8a341267aaa8229ba2b4091fde9b500e601b1e9c55dc368021548094fec2ffae10eea76e85ec96adfa594f50cf7840b2ec3d51ac3ec29a4b8098fe3ae4b26eaa023697d0869930a4439a3d1571021aa12ca945b126d41aebf194d5f662145dd1835b3232488215f88b247f8667123b9c8e8e66f9cd3c896104cfada68132b79173ddce7dd711a19dd1a0ffa5ee8fa4ee23c89b1382ae547f2d76a93a44d0972144ccce2e356b79ce20c027a604d17022ffeebb0e534bcd69840ee8e85c837c9b954695c8629b3aed6d9d9800ad14ac908e9e14e8f3535be483afac4a2c7a6b873779d50fe9075a9f00e298bf6d0b91946b005aa14dd3cf92caf9a3db62a9fc08c14d757091a01d53ca3f0b953bf3e84d25bf066d861565ee93aff3303ebd753b7cc9a7c2d7882e9c982a62643c7eb63fde700a106eab73b1907eb2f284624aa774d5cfe635a4146fa8bea9853e9fe9470339879d090e48a368fec96a79812c0fb59a64573314144693f0a55dca4168bf6f37942a4934a65e5795ac5c569da760a85a1b5923e5e08f6b185ae4d8f9934295d9c7d305a5509c3481a5bad49dce4d8392259dcd9fe02f9b50452f2018489c837b340d3f7b745916954a179bfa61a12a73976d8a23fe16033b604529aeb6194a34736e759796816e1da27beae61986403b595c556fe5249651d2db51e13bc45eda13fc2943a7c3fbb749ffac5ad8490a036b9e31c1aa47cd9f7d99c8dc63e554dff5b079800502305d29cd4bf4180304f60b347f93bc9cd4e65ce51d357d18c99e91c9b7dcb5fe2dada950907bc59d846e70ec3a7714aef7cbf3fd9f143585a5c91fe25c03deef750d8a31b42604c6d6d7317737f82e8994d9ed2055576a4f425326eaf89d05be50267fd746e65c4407a8b6c7caa91be919d7f6e409e2550285db15e1c6221425e3c2f532a40b6c82f1cb362c9a512f45d22d53e2ce760998117efe1ac6f17489e672d79b50d34ef8105da4f8a986d15951c908d38032255f95df353eea877312900c6247da7cd7d88b6ef176643ae59b0f0d37d3a04a91d9f67e82bf9b83642fdc9aa489e246a94f9af3092e4f40a425addd488b886ea4871f9e84fdb2e9ccfde2139b693582961fcbd19c30e2e21916ea1d95ef81115a7ec05c9beefc7ecf66348f58d92030bb04b0c62758607bcf2fe6a82a2f88d6fdfbdb09a7c80c239a9698a4cfa49ca5b0b6c37f7aab754e6eddd8adba72ba41b5d53e4353c02072535095fc09881f6f62f1d9e461db8e4cf06f009bb3d901b26150cd91c3a48f7de58da2f7dbe3eee6d3e3ccc3699466ba4f2343c9928e0536705390add306421432c375c3ff7a59195824d284e9a6a90958d9cad324bb3457cf0854027fdf928aca028bff2934ee17b8b545821fb8e6d0521c7bf439897451f3d84642f6da99ab8d3ed04ae6ebf4e69533c31966159672c11fb2d4e74f27f0767bfafba99275088e903807573a6f0c181b3cf07027091cc5c5aed84b97a7915f65f96c682fd70a73f03be8fee799f62dd974ebc1240c3b422bfb391ea09abc9cf7f0df9ecad38f14e9b6b29f255597bd0ffc9f68b30fcad9828853263e03e2c8ffd835f6437d4cfb5b7a644e45313786a79d6e32b7164a2651acd5025eeeb75a7a810ab82850d266a6225dd2ab5ffbd0b964cda5faad2fab588b95637afada5862b487ea97363bc5776ffbef78256e97743e78b161eac3f9b1d0b8a090bcc0f3dd6165adc706e63a721f6cd65097c4d80dc8cc8665560207539e581cd5e4ce08b96ef9cb6155e7899d415a4a78db7c57dd1a34a4eeaf4a6a31e0512e1a46f5ba3c8ec8f9581b0d401a294ec73e61eab9f1d1b51c3d45514ce274e8a8514abc2e5267d133ca350c46c59ee038ea753ba29c97ef1a0a9d3e5959fff03", "65", 2, 1221315612, 1537743641, "cb396fc51b8407eec4cb9186f667c51e3dd12dae57328feb0e921c401c31fbd7"], + ["030000807082c40303be28ea4ecf82ff4c29ece3d264f3c1d5074f1ce24ce1a8f2da4900963c9dc85a02000000076565ac530053ac5cf90c558120d1fbd85d93965c09e02af84a8006dcf4b60cdcddc7e6b54993e9f83e0f260100000001636479a99de76f2750f0b6198ae17e78a70f10c6c3bae23039c5cb2afab0f7cd6e8c0aa40a010000000351526affffffff03f02cd300000000000752526300525100b7aa0700000000000765525151530065d77702020000000005ac516a5200000000000000000003000000000000000004d4280300000000b6f9ea77bd030a5dc17890c051f7e2c5cbe1d3bc31b29da5c40d40043baf796d86f302bb710eabdbeb3a34cf2aaba4b0e4f04bc37289dfd4967186a5acf0c13bf091cf9da6e2fbc5ead71bb37fb052270ac59bd8537178a8f498d2a0398af8b5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b7c2f9283ec7b6c13358ca6d9092e228c820bb4098455c12ffe7ee3d4d6dda31adbe5e544f1c42ffb6c2a056f6cba03e38ce8775d72052a5c8117a4bbf270a0f0ed5534eb551c334dccdfae0c15904f255417f772a013900566cde1d6229b68777aa732e52f65cb462fa5e30051c6c9ef90c538de3d2be05e224937ea0c6b2b0311fdb26cae2445a04b99f78431b1ecf1f2d5edbe4fdb75490ebd95227fbc3b17032122319a25968931528a9a5d056862f8668c5f5abe6023a1ba74076249263d990b022e4f345e77dcb5019f1fff87eae90588e37585b0ffb952c2a6fe236472592947b2280b4d77ae0def96f802d226c2e3235b0f852064623198ab939314004f6f02265443b803bf50eb0a4140ce20fe750047c889e6b452f529857f0c5702bd60780226316646f158b3a10cd994ada4ad353fec7e951b6c8239733d1074094e4b60220324c35f82b261c13b635f2b846a366c579bdc963ea4904bc1b84ed1bf42cc83c90317c2c705ecfd161627c49291cfa0bced9d5d25c4e12ea1a193e78740314a37cd032ccef8975dc725b8f992597e64c4a50c5013d54420bb5c1878620dd9b6f6b425e5cf2765a7213ff028d2bc4994cede0f9d1bdad1a3ada148a04225ead78725bd49ff0fa003c2e576223656ee260763bf9e60399a92eb8f0cad0cef44898f420658a800419bd7002573959ce5de94663b47b7cd45b86a77c4c47da84733682b0900fac8d4ab83664c313f6a77000c5428b0bb9c0223eeb34ba12fc8d1d678f33e1fa237807657ba013453de93ffb56d36dd22fd3929c54d29487908e38cd53dbbf700dfe5e49464116304e85f5a6dd52a1ca04efdb6be0bc2d635020d77f43b0273f3db132869aac1f9797559b2ef52eea38d54b3f7919ae24f4e013ef80ff42e12ff76e565f23cec9762900be0024c3bdefb98d4448bd7d63ad790d09b690c384701fc27fa1ec6b8f4cd8338579462d6c3a432219aaf29d76f9b541cd04ff2defc7552400d5cfe7f24e831bdaa58d21b83085a0504f5dbf06da22769ccb583b1c47e2cebab8541bbceb2d25ccccdb096bb887255a0058fa401b35fe4b1ca020fbe6fdc25c1b9c8bbbaf8ccb3bd0c5d4943246e1b2ed0b6072c4b6345fbfac0364881201cd7aafaf7b4bfb4fb6cfa195c5a348ef876f97ba55107f6336591487af3bdc3bba41a0bfd340a026c160a380915f50d485b47e06803b5c3947b569a63a6e7a8a235b74a1f828933ecbe014765ca4d0cfa1fe58777c2f019d7a514b0d05ae58041e01a426341469bf71ca079f6f82e5f25667bb7273d410a8034ca89fb665095c08a5432dee6cfd64677dbc84123c05226528eb766bf238e32b845292c85110e5af32133e6581060d2ec91688d0ec4e86dba09753d92cacb9cf1d22b6149ca66a0f9665c66e23d480ebe89f0c0f1f90bee8c2bf7ecf9ed637ca447e5b26d76d8f2a82ff9c33200145efcda54cc667c4ab9f575dfe5d83b6d220bdda882fe2e34a25d3875199b926cf729fdb59fe8aca77a41fd6099cbebbf9d17fe2cc0d1eb93839300e902dae5d748130e67a9025e285678b73e89e1b877cfb15614466e77fb19d209d10f5c758413eb08d1546338c83576deb387a5938a139607a95bbc346c4d24743bb4526104e37d7607ee5f5247525f6938a0c0304b1f1152b66927437c3748ac94f29c8e0313dbffc7057352f3c73e15fbd949247d7bf7b0c20ecbddfc46955e673e9319e2a34633e2493f586509c7b2a7187c346d8b2ba40422dd31479c66d88ef10fa0e5ebe3d02fbff1db150f99ba153b82b9163417dd187fa5a185ed5c59250735d4ffc2eef55e380c6b1e4f6046f049581de64214ad7bb344b838b2ebc6f2327f881c43c40c5670797a33eb7c1d00485058ba2876569c3c1e91e064db259e45ec021dd29eda4b3e9edbf8e128906c4e4084096eac0e7b467acf56b3cce141b8ed62c0784f4e1a0d4efa6320bb0753ffbfa819cb9c4fd92e7a3e37a0fc8e9cf16e15057bf0947fadd5db445a95512e00c0f8ef4dab65f25fa22832731ccf71f6dde180f6ac16beb87dd470096589435537cc03b6829e20bc278a7f0afd69eba31b318d1473edc7910f7916f1ccd707c7b9c745a12ee8048d3dc6a4f3eae55a1f1db060cb51ebeacbaf192821b6161f610af5c9adf43566b8a622a7860fa0885e4f9f2e387f25dc7bda2a70c0bbefe2abf5a746aca9acd40d11e5740d2e8ad83103905b5e9f30c2d4de6d3224887f9955dc688bcb8ba3e8d305aece588c20d8c0d441eeab877612c619d400000000000000005a75d502000000009ee2c311303b9bf42fe194d5f4c3ca901099cb681183044b77967b30ea277d04eb5a3e97553e39910d60198a6d6e9458639eeb77f5fbbe4eed364dda81a27df1029f637de1a29becca58f5430ed5b937b6a26bfccf243d53e38861daf0415f3a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000932f51259213837dedbf40d33d35d59ac079767ebe024f7a038417051da634699aa6cebeb31ebc97d369fc6a042ac1c8ea66654f71710df5e0ae07ca5f8145c91f6179532cafb89cd0ad9d385ea2aed3c1f41fb196bcafdbe1a064cb233c28671e1f9273102fa8a3b90cca7399e2ceb2a77736e67708d11a0ec69e084291b3303249437a4bb961114e3c451421a350c58caa1b94c2af71ede4de958a65281360e030fb78722a2e794068a431e9dc69b00f22bbac7a85fa30a853a12c59bc6e5c39e0b08b506001854086597c6f6aea70115504a2a929660f752ceddb29f951a19402ec12033234d6a415c20c513fa20325d47d78e71e5132c1cd69724a0e10e53f580020031a5e561edd416b76c2cbb33409fc807b2b040c14593eb96028e1be885c0a1021d2bcb848d006082233aee32b3e03ac126a89f36bba56f118bdb0a8acc0312f5021c9347ddf383c6ac90b3d3358949d0283f7aec76352db65d36565c0a82f4329b02047e7286bd501488a97f00731908614cf5da1ee6634a861e5be48583043cd5e402282f7316621a293f9f8cb3eb25623fbd2989cc10f8379d53dde812757e7b1a145234fb1f62f3c684c877efe3e9068fc6be8d6ac90e2be82a94333d059e8a2789fe10d6882807de8badcd4132c93393af2f662787649542df4f8747167a5c962929fa014af4e832bfa3dcfd3644cfe88094d64b2608905bfecfddd51fef63f407026eb807de51b746ae82cdd153bd4e2838e2b48327af12a9c30d156d030f5f6130e81c985e10752e8b36345b7e409e32ef701a05806701c89f3d1a0f348146afd980aae737b80e03584492d3452c26eafbe9d2b4dfbe1809ae292de3418585c8ceeec1c3c05cf6598b1be89035e910da02423ec73acfc3c2fb39de0c316409f4702a602d772ca41193635a21c0b642b4e059304dfc0d1f0f7d0f449e02b92909c16cdc733824dc808418f25b2d1ef92806b6d355e19b6aa88f3f04e7fb6a4fa4f7c61057a342f918203ddefbf996f538af016e21dcc0e2a46773424605268c256ed71e06d771fdd4d4ecf7ffc76c3249cc7128809f2e45fe411b11e508fe00aa9dad7cc73bd9dcc78433effee1f3fd0c33dc3ca1daab9a8e05ee83e710925ce88cfd8612da84f0ef711d6eab5334b9051ab6040785985791c7e744fb168e3ae1254c4471218ab52844446449b5a2fff54076eaf9af81a2ae7264586d9ece60fec53486a30aede71ed72b5ba4add043cc1a4f9e37e1ef19a58c368aa1905812bdcc88fe9a99cf194ef8be4eba942cf915641fe16049c8df4b9636fcf24aa9557a2f4b2ccb460dd21671567dfb84d1aed857c113b3008844611502f41837b740d718a2addeb1a2f56feafe8d4c1a86c5801c54254025e6d2292e9da4d3d48c70e62959a639899a4e54359c5e2b4f85a92905b15ba394b5c084ac57ca5dee4da719d775f53cdbcafbacb51e3910675e7871c3fb2d5fa776001c6e26cc9c4d87d9b159b744e0af9e18b0c9b99c6f400d1e6820973d22bb023609f64e5da5efc8e5e4cbd7c6d7aac6527f2046820024c90dcf6e1fb4ac8a19a619c5259f47606cf848fde695a78ae736a346fb6ec346cb713494413a0ee9e9c802ccd287a7d85546f369780c84011c435db1718f924bf329d054a649aef5394b012bf15a89b78922a16f486cb56d2a65ee06bd17b3c7612fb72acccdb4ee427dc9274b0023fd886ea9c54e0122d8827561a6a0dc0ffa5d184e9a2f4ef070844de61ea5e9d8a33b843ac245c8b92c1926461c36796caa747d4fe075a35e1182ea793c9b3510d9a50ba968adc262f32e3b3654faf58a10242ac1c615f278f4b94f2ff5cb7439536c09bfcefba8d0957db561267464091dcc5707df1c2e6eecd5258616f9b846807655e935a13a8401a4efc27b1651cfb1f80a783fb2550175ed9e0093359b1b40fac1bb91930c6d516b3921c73664ad359f5d733e172721c2f5c286c700cb85fc4772190b1ee74f01d4504ecadf1441c827df20edf05592157e4fb0dd51aa5a1e0620020462d0c9587c24f2ec5b158d251d6b815f44ca1d82a5a9852572716627db9ca48b7979bced80a52792a3d4a3205f0041920da409fac07cbce80053a89e5d58fe583b68b882efade90b3ec4e1e25b3436a6dea905bdcb26b4e93cafc72dbbe00a8fe7631d15f8ee1200bc8d82822b1084eccb5b25a2b73cebedc9010f0e2bab1e6b3ac941d2095557f78cd79368a1679985351a7775587acfff48eb1a134896dc003da84aafc0faacdac3cb3e1762dd6e518d7e6d1105000000000000000000000000714bfae684b1e73d5ae6df499fb010423005f7fc1e5a8b2ae0999d2b445d92be957e1393655470053f294df454a888efa2062d731fd1a948488f5b011e6e3e3a51555b6c0abfc55cd6173a46fa3555ec02b999bafcb7435715ccd6666dde443c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a38a0e7fff9264f3c460dffc4722ba5081ea94f87331a27702d790f73e4f544fa48e32357039a4b96bf6c7005c672ffcbb8d8648ffea86354f5768734a6994243c4974a1323a59655186dd7087161db7bb68eb401b84e0eff198ddc3ae952f16372a0072110906985a066a4619600097c5a1035971cfb4777b2ecb6c49e9f17d03047673bcc144869cddc02701842dbe3c109a4eb79996462d0e328d2ee7153e6903305fcfff8800b696122a2a911289d03db2e4f085871d3b97cb7ad84b7b2a84530b04b0c7afb7ccd8995dd48f088e9f7803b7496473b48fe97d6bd98ad5c4ab34dc5b7f017075070f62a7f335121ed21bd31e1bf7c2135f24d0b38ae4591f8d19a4021e43572307439af22f6292b9ae1f076d913c68a41e79e74e9577ecd373718ea40213364c42e4af25880009fb12b8247c89012aaccdcee0d1c33f963f04e0cf8383021a7c712d5b0c7e11c277421d88182f8a98aad1847d9c9362d30aab57bef5fa75022294d723b9bd1c44ea4de605c3ae3305b3f0353312d1ace00d9baf65bfa778220319190acfdf65148f287b1398f916c0f727efe1447d9f06ed41a1d5efd970a8845b393b32cbe4c59320f7cf6ad4d1a82e6467e6fad3bc26d5972eeb2d9a7584b786be994a0f387919268f41d41e5d6148f4bc3d80c2390d00dc5e970cd942a8de749998aabc6aee3ded988a2b5b7358ec7b8583102a4489096c3605994fdc8ac4d1f71f32bc126b554d982ca8ce5503e13539ce5ece8761ce854611eaf818772c2a592f98a292ff2705df9103c3b065c0c55212da8867331f78882be46dfd47dc0d0adc9389d8cdcecdb1896698d2cf68bad734591ebd8c39ea1b6f49a4cfe28d53c0e5cbe1341b52e694cdcf4b7d3b51fd332c959f8f5c27a9ee0b4c50d5039e226b60798058362aafdcb76622c7d4aede0477ce053bf7a1f6cac408e3b152b83806a0e36568a0a473181990baa60e38d3ba6fa4a0a1f488b7698345c61b3d295bdc656911e15aa7329d5b0602d0f4422224ab6f878996064b2446f715b2c664274462b3f9ec4eb4d724f2de1207e49ac035eb0678bdf45bf7479c925251d1f1d4f615f78a8e5ffc8aef6d30a69c40e201fa83fc080c1a021820397aa9a5083228cb02955f13de728489f4ff8f846b1c593e4f681f8f9e9ae8c8a7dd3061da6e081788517c1a8c6c60278fb29ecdcc140180d9ede0def608a4e536a43d9de978916066384010a9031983ef083826d18cb76513976fac10ba5cd1729bb55a5828935eadea7a8ed201115b0c412a83a73c5d8c5d05ebef3da8c393af9af9f0337385256f30f8bcfc2169999ede6694c8bb11fe43e62cffdf2e500c247a6a3787fcf96ce6d57866fc836392b1e47bb9f95bd608e05895eacbe27e852763307cef51d4c43db0b3a05a936189147d65e1709ab91ed747ea1155ae3a76220d4cdcfab8b1fb87d791ae78ddae11572201600b220c0a8954c363af533dde7155387825647de706ec6c1c8d35a744098767b4c955ea8f57aa8b163afddbbb24c6ec42e288df12b0ef3a13e340c57dd7e5968037e58dd58b3d2845fc0e35519a5e8ceac308a4dc31ff00f36bba55878f87f8f9589d6654efbe46f7119f1b2a82f3f3eca36deb7296d927e3b5f36fd41914e8c182d687f3bc7f9ecf0419950cc0953568ce5e39163efad6e2c267b159be426bcccf5474784b2c020c2fbedcc7db146642beca0c11c45bb178b06a5ff99f4f64c33f9e7116c03511eaaa42b98209f3065c9b57d39f6ac6430ed6a1dabb91c1b0460a34a2abe12c354639e9b00e14a34caabc9ee845fded053a5fb3a11542b1e08613b2910fcd28c2407e681144b42bfc1007452dddc96f39a811f1b2391b03facaf2d68a27719a1dfef6f1b8e25d98a088d37805029f12cca74e4af57111a0f1672245e3fc0e022d7ca129673f9cef922ad9c2e5b40970b82c3c97c702a9e4b314f4d4d7b184b7275e8be94ee6e13fdcd6b346cb312d6fa64029644070bb48221ae2fe07eda116469a5c82a87a71b9b40bbeafba6e395a727d383863665b66479983fcf28941c2f38da957a9c47c58307b926e6e17eabcc3d7e26f617af699371219fae8a2cc3e869204eb88f32aad1b11b5941efcf57fcba2de6f29dcd020a1654e167d1dcb5ae6871e674af0e61b600f5af70c6898784170cc1db6ba81fc32eaa579c44cd39f5274932065cefdd1e0301a55bbd790aa98d82a599568e62db40c0757eecb49d2afc6bf31cdfe5a1a0c30448bab56d6d7d825529b87874121b77396ad7f02c436d0944e38aaaf9cab5c5dc89bf1b25bddab1dcdfe137760e17242ec5f2181cd9bc6967e51541e6a5a7ee92f6801fa4be921b22bc385892790b8b9bcc93b2aabcbc47f63b42ba774721cbcbf375e919498e9e7f0dc000228a5d4bef92fca04", "6a52635365535351", 2, 1526933674, 0, "1b5e610aca8d5f5cba4e040a7dea5b13c0d763bb939d494825ed96d16182dd5b"], + ["a1d4244f022a75fc62d358850ab5a7344dd3a8fa3507c6e9f73eb9a422090aedcbbf7132d1010000000665535151ac52ffffffff68b498cb22386cf87575473b8735f4820bb9b02321708ab2cd3b05f3fe3c98d6020000000151ffffffff048074e504000000000600536a63ac65146ad70100000000086a5365ac526aacaca58b7d03000000000451516a5309b90404000000000400526a5300000000010000000000000000657b7500000000004c0b8acee942554c2ae17baa70f307e2966f1375d552ef0082912208a80a63afb45d39cb15b257666c7ca81b5d78d67e82f249a3440e5cd655c5b52500acbba285a785a68a2d39549b9b437938d3303e9d6b8e368872b039b00a892714135bec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b50dd7498d93d2fe544a888c1b51e4bffe8bb0a49c4db5fdd5f8ec0ca7b3f1bc3504fdf5e98064a7c4c4c7396b9348ea86566a9686d2fdc4e3444f0f70080194e8bbaca2fa3edd29c2b09c5b4910d5139a7c0d75080b509de88aac80b2272a984488562387f0046074dd3b976ddc52e1d15fcacf7eed8ecb5c0cd12da5b951e202282cc43f1394fb6a2e9efdc4bdb26f4abacf3a91e71e87fdeed94575bb3d595003114707abdb16058454c79ad437e90b0f3a1c0a1a80a2093774e9d165c7c7f5a60a01fe89114867b2e85b7692bd908784f964b4f5eed80842322412dda7efdbfef3f5f872f609ac4785c354f17deb9fe21daf0db53d7aee8b3e3802c88d40e4d0e0021760308f182dcbe065905307e023fd87413b5e9a285a3f5c9b1b6f82360b793d02182ffb2887558214908e6c49236e10568019c8c5d6a32c6f31ff7151618574850323f1de6fbc7a0941d30e0037e23664b0b4c67346be13d99ccaa9de48e6e8e44d03083f587d461bb6ca6aa72e16c3c5f67c3f2b790496a608ef2408870439be5d86032978ee7630a5a330bd74bae73f87c67af54ba6861e1a244a9c22a7890fc87ec9ece8265f2d57039e8017ece3136212dde548e1ff7e8ab076bff2d89c102a27c5d45bef8835c6756ba3bd9b4d45f9414a4a5f7f8c7e53beeceb732c51d1b618594ef4c68df1f2869786b053f9c2e735352cedb5f764f4c85f291a7cedf1464e18991a852e6cf62fe8aadac042adc76fd8c37be6fdf6c19b31eea2f08468f80596ee3bfee5889c1f6a52150f4dd5fc484b8f2b17f324d0ba4b100b3c87f14573a2e19de020b16367495fda7065355e295a80779116fff602ed1043e8ac3bf405595442897bba1352717f83b85ee4454338e1f97f260e00194b6cf7e5a17b068aa96f1a64efd4e35c4cbee2b692ed6afa69b8502be34ee10c40e4c1dd6fd8a899286106d9a1d788b84c9c824b48555e89f4bc43f66d6dd51ff87ec75949dd32b67ac4cd99bc91ddf7f3f6eea070b7c38d69f79d5d46aa1519b1c75c82146e4f811201ff591bcb0bee7c97da03717d0d741c98cef129052b86907d9b40bb01e3fe6d2d9552e66216761477b6955365729a50f4c25974e30ad8151c611ddf0b7eddb0c06227617c47c159d9a9d9029f943126af36bd68e91b6a2131efe8561d12fbbd712096f0fb57967df7924e332ae24edf32d29bf26970e3b412fddac94da0194b8378474b84a56f71e66b313a701096efaa773d57da20fdf76e0d266029d34dd7b2b4031bb80f472dcd2589a97431a0db5269237afb1380a703d0c1ba8c9ae7b515e05f520a9b117bbb3ce781069b1c037a0db24e8289989285f5f7b37204bfbf40ef2bf8e1baa9e69789471d6b4044062c6ddd9f8fcd135cf4417afc23cb412da07b8c2427b0f1609b987912deb97cd1e28ceae39a36056742d75570afadd34da98890fb01f5f6d77464b77c77c5ef83d51b9984ff6be52ea214e03ac13d27c81574fe2abbe10a10d1c8f645d7a9fcc251148db0bf2b0f9615573e137bd4e44dfe836fd7c731ec4a3d21977871dd9e676c464ef3d0e34d68b89961c74547c2d5dcf4392e90c2e7204b84909c78b74c8fd3ec11dfb105e4da908e5d9a512c503bff0c1c8e5cb8d66688b4cdea36d600e2112903bf4ce10cf1f8ddac8a6c29a47475444d9909a06aa139575eb5fd572a73f6a9ecac5ba0328b04ce6a622ca141e7875bc06c5a02d47336ff09f3e1f1058b8dc1f8d4c8212273953553cfa3a776fa7fe58c616506b50b89311567e6be89365681e39116036f651f3b807a756741385f86e84408e02443e3292537088b131893f3501a1aaa1f01984053056e9c9532b43931110ab06d408e62b710f0c3db5f6e8d99da3f16777cad95818fd9c1659abfda1307614f05290dc67fab2b6a162b04abda0c5fe075ef8909c49ee82ba586430eef96798a29cabc9defb950f12fd6d3882caca3c756700c397993cf056328841e934aa165c256279590ac242bd90a4a66305349f3dffd165e39c7c4bcd139c56e864d0ae13f40536823befc52c27d9d1f04d0bc64569698c982274ddad94fe3b753f5fca6402943e79695e7c98abbe70a20a9d6bd6ecebcac7297df7e2967ee3ed810c6c8ab7c04b15e202d393918126bfbf577b9b6c079a283504c41e1b15eeff85426ff599965294fc631edc39c6e00fe50ca1ada0ee59cf6bb83948cc3bbd551ff789d94940dfa443537c8b0767609077ae78f0302ccc085e8a8001c7a21c3e5f1f1d057fb71cf665ca60d50c18e70f5ee1afbf1014030ce68de42165d8e7dcfdf2b6dd859cb860d767a5f5dc771a0adcdd3ab5ba15b43a82b0a04c4803e16bb45bbc68d93dc0cdc7c676cc8f0862d3de6454e98fd79c59ec4656da94d622479cbb3e300ac5cd51db4252a32856003", "00535200006a5251", 1, -389989653, 1537743641, "063c95de06a23528defc46c86729cd90b595acff0d066b461290b577f28abac9"], + ["030000807082c40304e7392ef184720aeebf7222e20f9bbfc801116b7311829dc86c74c0ba69be8c020200000002520044c45164202c10e26cca465281d70bf2db168806b598deff0df24d4d7e3b513f7fe51b4a010000000952006300635152ac65d98763822e1644d5c1752be042880f5b9edb12fd19a91c72052bacc798655fe45130644f03000000006f3df6e7399ff23adb256287d6ff323ca5d56e6071149f7035b2af1cf80be2485705695503000000076552ac65536351d0fa0f090156b9b0050000000007ac636365536a517daa05cc35ad900300", "53650000ac6a", 1, 1741047596, 1537743641, "04ce4a21777e642dce454aa5d5a9486e0b7008c7b20797a325c4fc0cef756ec1"], + ["030000807082c40304996ac3f81fe0d7cd6fb80b3a55418036a1a05a28289c376908dfc9c2de5782fd0100000008536563006563ac51485099bfb8f816ae6feb48052cc27c698e696a9d53ae1fa1e7c4565bfa7912f5454fc73e0000000005510065ac65ffffffff5af4cd930a87a02d6434dd88160cb66af0ca857a7c56c8d572db2893d167e3fa01000000026a653dbb5bfec53e120618bc3c24fc4aea63066b93f2bb4f5ea5ad5c2413c56503c2d7de95d500000000075100636a5252ac17a8e74103acce65020000000004ac636aac7a05a0000000000007ac636365526aac6220ea020000000005ac53635363e475b3f5f730db59010000000000000000a83c3a0300000000536522377a00d833fdebfac17d0c82f9d1cb84bf2c1dd807bf3e0639422b0bea27e46e93a4c11a070579488c8381433dffa7b683b48d619c454295c9940c5b578c6480ad296ff8f4d017cec3335896cd0d67b2a60a4eb767a49c41ca3dd900710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000095947dac073d25c9fb4757ca4fe4c140a88cfee1ef9e27cb3d65fb2b3ac45c1febed471c8faefd94c475110ea7f67b9c6ac15f52c410d12d47fa8721bba85828d1a6c3ed95e78a9ef99068d18a4d4e1052cc7f7e679c1cde93534cc6c473cfcef8fa46b1d785330d37077168bb25440ed63da66a2fcde4fcd7b837f1a3108c7d0301a7e6d58969dbf86c05664ecf5a0073ddc1d2125fcbbe78c0d0bdc1529fb7780206e7d52b798a9e580ef04348bc3742c717410d945f662db2e15930ce376c5c850a02f7b02162ed3a13f1b8ecdb10f302f48af7cf5ec1b9d8cbe767ce5a4e915d0d47fa03c4585725dc5647e78a1af5e52b1f4a5e3533798cb34a6af1501b61d9f6032905c3b8548ee0c059ef180e1615b9cd5b6af0e66ee0a0325c034e86647a01a4020df128a50ce1df5555267340a0fb2291db7ecedd6f7cfb8461116b1c682d92c50310d894d4e5ae867fed2d58561759726a934136f865759da67bfad09c2b119b61021fe509a80712d4139453271d3ec93dcddb48e2f5d185d9042478e4584a28572a031272a37990f2e5cfe3fd80e9076b734c2d2ab785faeed4cb2dd01e7f88896efa6afac591f51a2d4de7cf43f94161ccf958dd028f1b23924c9548432867ca6d7cdd025092b437e548bd7d09c8b92347e95f668182f94e3d02e71b5dd73a60f31d032f682fc6fc384dc55efc206067bd2cff8b99c5acdb4033cfeae3f2893479ce2ea913959e182b966508ae440dce4c1d211f4cb94fd484f5b57bbf05372ccf32e218ad86b5cc3a408bef0fff2f3cec8ac200879a05f2f018cabe324b8d18f8dc3c69138c5bbcc6986eafbf0e965638d4f516d3ef5ac557cba906ad6f5363af2aeb2c20f830aa72ae7c3839d51c98a9251a5286929bd314b73cb7f07b610a80bed00fedec87c56e4dfc9d38d7fef2b7e32cbdc8f2a73ea070825ad3df06b264c91e4b90a3f7e07604df90d3e2ac31b40d15ac5470f020b2ad97d73f3b863a79f87e1165634ab54c5b9ed624f36fed91e199f71030be8b157ff6fe045ee7f9e8232c0a19a01c6ae9d8f06c79df2e95b7b64805c49015faec833a794296c1272747217964a2baccf2c2461ad7bc355335d16a18b17413e60625ab73926e6d91c0b0c594f5d9571b64236324bd9c47d96c23e4d3771bc3ba3a22570d391c36b45fa3073d179643ed831f7359458beacbe6338c67d92af5ba04a18b6c00c8ccbe14a471b9855e6f6f64cc9e904ae6193f9c420fc3e458cd9ab9a355c920e104408151a115fecd84dbfa45401b1563bd21eb764949ddb01d2361be6ff560b79cb99994a859c237fb9a0a757f6033bd9f3f09074b8a1de0f17fffc6745d4370a32d647aa13fb101985b0ac1684a029029d4ad4c99c55f2f26ebc3090f3797abe7530516201e30e1f3e86b30775e134ad6b77560ec50a4dc440edbe692e2b277c0dd703b752185fc55772232cbb4ef882153ae38ba81bd232820470a90532727f82c421168a067719d5889ed2c9fd89c11d4a3b5f7250a65ed4aaea8da2243bef3f1841171b08ef649ef8c6c1bb2c3fc740513f4c66866cca0fd79820d50090eb316acd7053c2f01aedfbd5ea218e5c518fd41ed5ef9ce8483571e3bffc91da246cc2f5cdd1beaa0f3deb4c602d11b4f1c2d112c25b00618840a46ef87eb4a6a8629b858ade24462d2bdf4fbc9878245eae07f7fe6b1f039a945a077709e379728e26cf64d8bbee65496dc7923ed8eba3e2ce599d1f4f12beb6dbec9e62be4b79c96bfa5dbd76e94b7a1b7a3fa98107c193ba073739d0a69b66b0159df13f39da65274a44d7f03a6cfeec81e2943ce2be237e58ba6968932e0689ac2a745445874aa65403199ff46b2369c31cce91780f61d81631174127ca6db1691fbb52ef29ae3618c10453bef2e9367775c3823bb2d47947ba1af2c6281cc1c5470392bb07d04c5466d5119479a69adc44fff1d1eb4664d460094a80dea6361dd3e639dc4177704334f6f6a6af633b3264c3cbad966d68633d8e0114e225d23100d88d0c138aa4bf6c7a1507f98d0da12c8c49f3dd83a2db5de842c7561c9d3da54be21e323c3b433c8ff2f62101b98072df10c397c645e8df8fae4bd9f288f9aa01d9fcb4aa166b98f9988b2f292370ce49e3d27db576dc57d5c78639e6e27ef8dbe79c4f062a4938a0e38b7150c0c65bfc0bb09b75a0322025aa7e9d44aa0b1e91bc7c6b08902d8d161fef3260688b00ec5cae58a4c958571d1208c8417bc4122f068848a1d9f14e18213de4807899dd78e6826a0007e1097e917762812abfeaf5e51e011cb04b8b244a3c555260aa3a04fe85811e37f5b8f9862561d91b9aef17dbb7ec35c32db83b4e1d83b0502223c8e1b3cd49f43ecf5b44b7e4018cecc87fe0e20957ab6858c6caaa12b92859219e72595f9a34960ce06", "6a52535252", 3, -1784537446, 1537743641, "1a016bc2e3a5d80cb80722311918673435750bfa839d956ee780eadac5f05e19"], + ["861b877303290a0ccc050e7203f0eba6b0f2ae4a93dfe4d9df0a1dba5fac8110822eb3c77402000000066a6553006aacffffffffebcf1e120bd8a6824a0de0c19107084c3c7ba846aff48a163e8e92c03d30a63f000000000852515300516a5351ffffffff620ac24448a063bcb077daa967be24b2bffc0eee4b3772d5808bb2c9c8a7ca3a0100000005ac53655165ffffffff0496676e010000000008636a516a525352ac61095d000000000003526a6a9efaec0400000000085265636aac005165c6ab7e04000000000151a0fa7186015e8600020000000000000000000000005421794794ad4e5d4be279b9513b5b9fccf42234978d0e30dc79d4fec128283fd8e90035edc1dec3790c70cc6d61adaedd8e9b9c5b30691e40e65ac1fd37972064182e306b47d0bdc51fe6ef68c4e860dd1f311faadc8c4ded60092161b60aa600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000118023b7e7b7421699bd400d15abd493dc4e7620db7d1e537809de7ef4df826efc889c0c664d516be892b1b548a56526000459db84eb2ab6f7ede3fdd3dae3a72b0548ea9a2fd95583fe5a81a22c1d67212db9002f3f523004c9ea085048ec1f2c05a244d485821334f4f1c0aefaf92bbde8d141db7a07b78c3b9bdc5949856303118b16c846963aa3ebb00b44c1ecde54475174de74b62cbe3dce2c0390ad0b18031c36235e2594967c659fe0b4a5cc446f967752a45baa9f9a79b575838a38b1e10b03c181c0fadc56387a0abe8b0f16ae0bd5c9ae4312f072c85adc0485b023c1624a2b6dacf514e0d374fce3bd71a67919b1dbcc0c6aa3c28315c65f643be8f705022443763242db03b7d37ffc051cc7a92ca47446ef1e67d24933fcc46f8ca29055032857b309f3c5456b7e32314311c3aa35ba3079dd962c4b0cf22775b814d417d80217003d51cb1453981b778c18fdd68fd8050292985307767e99a3e52b3d745fd5032968c1364b71e34ef381ce5e5a124212dc67d34c6a0d0f80fd9600678f29d46203198d3982f47f36b9590b3d2810dcea18814b34dd90d82aca85c407ba24717840bb6c4e83bacc81b8e452055ca493be84fa3e5d6dd9cb5d1fb192c7439af7c5f05ba021fe9715a2218d325f2337ff51caadc1e9f608e6f95f3bccaa87422ac35229e60c204472289df0cb135f57f9f00a16ff62ad471bfdfbc1be839cccefe04fd0f252d9e29042e1d24a27a312762ab05baf146deca9fb28f1e22c7df1ffc21aca885b2d209091df3c89b46a4f8241d6f13c35a70db437438c5cf49c59807ab2ede92accd3611dfceacc2c9435e79799b103d32b55261f27ac6adbf5998d6827fe5a29455781cbabceab9f012febbcb533552d716e6a33a5b8b4a84850ea7eacf267c543794e152e91f6a4b08755d72cb044880673ff02fcd81b2b8eba96e2c1c14723709918af56c8f09d39c47c512292436316d4b4802d31e125388d352b0554467f1270e893179ba55aa9772eb5e2734ff9aceac905b9224ace2762c85c581daff02b7c43b709e68cdf6a787f87a757d7dd2f38f80f94c496a0ba39df2a52ae3f7321238bea6a1ea406831c8a546a965def25354b1fcdefc521308df5780a25323e1878a2875b2a57be059b66b75322a6692eedc5de800b113ac6759b38a93688a323b0acbd1e1cdb4164c7c2ffe552d5972a956c98ae50916c66f84974120ba7fd4eddc5b642790ef588e0224149a2d39351756363125fb3bb509dd0c6552e393c1242e0bf398eceef64f22140c99f14dcdbfe12a3ea045762074ce748a5c08f3c854148e6cb05330e0a3286612bb7c73ea6c1f64f63cc9db2a1f3a0b569dbc140b65cf629ba91326717c895705019a6ab8444a62924de996166b46181f27b43db48cee75280074dcc7d6d7ad95378c22c11567118d94e70cf436a75586a7aeda82311703b71c1ed9af705a0c846b88af51e0371e2b6d1b53854626faaf7e3d7d3153ff6d043e0d8bb76489920979b9c754deb13bf2c5ca207bf104404e5a3ed054f30401412b5f1322fdecd9d51404e3c7b4fd782514ca524e46ef36aa7c17923487bcf8e651da096d525039f5534b7682b628f603062dbc839ed252fd39e3e670b9ac194a30146b90c5ade6da1d64d12bb423744bff4f0f9303bfc3189230698bb0859a83eb4225f1346261d124d238900a78e5d3216de551a85ece17ad0d1bca6108c96582c95301a469e99c8cd96942edcc4d084eece01066c2f259a35d31bc1bcbe70e916e833dbb44e6b01b1e5c00eb1cb62aba0cf4a8e5588025d8adbf2d101fd611adc9f368672d68284db1731c4c125eaceadf9c42043137207a7c494cca25c2d118883f36b5f96610dc3564e782a595b2ccf478fab016395b40dd52ae22f596f26119b69e033f363c308fa4e213b3dd19a520125331529b67064105c821023ac5fde713711a160d17106e34407858b15ba44670b93c57f6401bea5fe4e9a2d088874ea5bd64dfee97ccb09c76b2e29f9aa2b566f30c83231a08692b4f9c1c6b82bdb0e8cff249bdfb69eb35e2ce9e9b071d623d1cf5ec6ba20c37d7b7e997445e159a5fe875a79ea76b320a6ad635458be866b3b111c187c934556ad2950efeb294c37c93dd6878493c704411623dea8be6f4e0bbbc40f9f7dfa91b123fa395e16571b4b17974cd8f0282741c8334e1d6a839dc13d3b1ce7850d525cc87756932c59b6561e01f4d0879304b21ecd6a7f350caf87b45dee108240bb111dcc6078048d32b4a544c4734ddd99baaca27f8397eb06b100a96ff8ebf5f4340c4cbbaa03eb1e3012e381916cea98522552368d38e88ac85b98aacf886e06d24af046b7c93453123e67a9f90a738c9a941d450a3cfa5c83745967e6ba8d9f57377c740444b6aad0fbd44cf5f7a408", "", 2, -1888566932, 1537743641, "c052fc8c82b444a46e5c9c25f69e65f4b7362675050ba78341f106349cc4756b"], + ["99ace95303d718bc000780eee08892d081308d3c32bd3944dd76c5608e4bc9bccb2879058d0000000008ac51650053536552058500344bb283b6312e827b6b591b966cd78b04093e20e812f278d31f9f24793faf07c70200000001acc1a9e2abd9855c20ee40773c59fd18473377cce78c0292ec5d2bbb702e6b73a28a19f01e000000000451535265ffffffff035fd833010000000006ac00636500acb7715902000000000265515f41060200000000026a63c266041b014f47c00400000000000000000000000016ed52f758329f8542cba72aafed276f7b86f6607d230d92ad125f22c9952b06c5ebf4cdf2875876b51086e8a5490bd25747dc001ad698372f68fe98587f75928007df27291a700109c480c48c003ebd7e81c7b557354853e86d32124c619e38000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d0f425acf849219c4bcc7e51362670bcdf9030c0ef7e1e6db85753c5061e7adf131866a6317b85e47fc5297dfeb33f77ae4387cd78c02431e8fa3e7972d35ee3c84735a3382759730a14c169852c5293ebee82cf20ab6c3578eef2d04bf638a9f3ddc4e3cbaf5e6e4f4edc9952f40ead4ffa897dc62051e0b381fd3c8670bd20322c7c38d825e11068864d7e46382d9c5344c72db3aeb0bc5af5aaefbff86787d0203d7b4b7e2408a816ad6dadc6a55a3ce5e1467c7e15c6931e6af6f5842a906050a06f5c610dca5c0c2bc5b56b9b9468202b719fc38b0f9d9a45edbf67aeface9916274dee13aad604fd7e46ef0d1be832a2313d377fd3dcde218b8a3b83c48d1c0030330c42c2f317584619a09fa7bd7c9fb7c0d7da2004f658d57f3002b8721a18b0309201275a15b4cec4e4806924b4483a74e1c6b48e59c3056ba69f90f1ca6b455030f4c62d05b62d850cf7c37bafc841e1b0bfad381cf5af859c064934967f36f8a020554bec9fb8f411d02370a60b8d07ffb7fc6207901e258a6446741a387f8cefb0304ca8e634c0470986f0553fe354d2175e87e64ede2fb42c84a670afa592059f26346d0b7854e757cc468fb37d7628c27cde6b97b2ce6e90c206182ea8eb1eb7d7a979128b658092f518e6716e2b35ebfcca06838bfce823cca7cd00720b6c2c50a0b0ab8ba78c7eb22383b341829be7fceb8770ddbdb940453571cb2f28c17be12bbe3a172a37bd324dace534e378e85a5c21421b9fd3def9864b5a6f7cd8a93ab47aa5d7af14e80b35a97e684f73ce54db7edb0443157d026366a95d6219e18d1082e56da19f7238849cb56ac6742cd68cef38810c118ac8d6deb34efe289443675bac6c1878f73609d573d863ed6b9f1b85f65da7237e3cf524bfb26bca9632cb74b874c2a10f9756f7342aa5cf40a07a518732b1bc2e375dae62f5809dd4da7ec8314ca34c65bd67dd5a5f19b8482380627323f74aed78d3188abd4978d234992ec3fcac17585776f9ef5898638c8e7be2f77fa120a402385ada610053cbc6b8bd00610ea0acb7cc201a904b07f9428d363aca01d17e020d751759c98b4e6867f6ea26df784b44be7f4867f86237dbc0c5316ba701c13b7f5b51cd7a4e311345dff2e760aa74778808018814411441c3bb4b297af0c47ba777d8326de5758de5c99c493892ed4039dfc41ab13244ca7ca84be5c13143e1179f50ffa0fe5158de4cf7730f4c06a814447777b1c4f943b2b46954e9ab58b2438f29be8d004684a8d991137823d2d8932ea131d5b3087b721a0f3245fd6c723f01c350263fda950a1e2f2f8e4116bc967bba9c1aebf4c3b1772ae98169c551b1c9432248a066fbf472c809f875dff72451f0e34564a9a27c11ae6fbfc1ebf3f7fa8619642067e82963382e42d158453a4f647bcf16a208891dee02786775d040daf1f03a54580b73c99683d37b15102bf099ee709b0271ce0232dbff15c9e260ccef772a3366d264fe0056e0331b78cef1fcde3d5a6e5216d877bed4a24ba28bd8e8769956911a23352300b837520df1db6524655235ae3b2ef7775e1496f4af08bf4bdfc87d5c8a9074c93c695e5012e80b74d3852a059932fdca7a9da04b7f1b5f5b13108057e11addd5e7c4f48f60e8bba67681db8b4e9e8aed426c33f225a1d2c9f2aa3ae8af8ac5d403e56386d1d8f557b7587e8161bacf5e281986a16fc75922be8db0518a12a43516b2a5c274d1eae894deff853406b7e86f48d1ec1298d7e0be6305419ec2be8cb271fb6f6e66b3c99b5e84727bec754359f24acfad73599ef00f6a4be8f50952aeb364cf0df091a2d17b1732127b2bf02169356e684d5690aa9824818c9fe96d5eefbcc10f7e96515f43f045a9f7a61f770449e36e9ff3d32117d9c2ded4d765902cae8f3cd50abe43b5906d9873f159f7ae1d565b7d776c4b0ce919211761d43479be292be58a17c1a38dca3120a639a6833a98c1dd5b7143ea5252969fc9077945e1d20ad73a214efb05cf1157b5eb46dce75563964985784e87b718625272a1df63d488c84cfcb91b0d77a4aa6a59beaaf89e3cc2a8df274679d1d33fdedda498f8c4b1523259b5f5ac433147a8a0f4199e18badb017751537570cfa4d65d31eeaae43f0a356e859cfb8cbda4a320a03b6ef89b5058e5d5f804393280dc477006e9af47aaf276d1044da28f47986c960d63312b7141edb2ad22110dc02bba81517bae518b3e39d387efda4a7d9ff81d9ce02950d598c486c3a18625c0137ced1dff9530cef7a1b88ce93f2e908e17d027d22f17bb1766e9187819cc03c45be15a3fdf5e6abc08de3dd691d2976d97b9d6d99ccff87237f43c8a8e480571596951721ad1b36ff299bfb2cbeed9f45f6f24d40e142d8374b8c8a1c9211679ec9a17c7375e5b64e6af554feef0e", "ac53", 2, 2048922539, 1537743641, "04c0bc2dea8971be87eb051c999233f46feb9f55fb1a1e1647c65305a0ec99e0"], + ["030000807082c4030371b2a613b19dbe8d4e5b4f55d306b77a572033801cfad3b92723dbcd1659328301000000016512b97b9708c7289951ab83514591a4558b082f0d766d0839a6a83239bce4062a3673e7d10200000000c70f3910b8a0b70676c005a7fba0995c45acb3102be60515ddb97ed1bff115b1ff7d9a96030000000752515165515352ffffffff03cfb05301000000000963ac656a51ac656a5330a1650400000000086a00ac6aac6a5252708f270100000000026a007f10740a0000000000", "ac6a5151", 2, -2009777839, 1537743641, "ce311056fab2e8222b9f641a6ffc2809197cf83811b773e86cf2987deab92b52"], + ["030000807082c40302d55c48cdba8d65380a13e59fa17b2878e06601be340b2ecb18a3b544da28d2760300000002ac00ffffffff7db561ae844e5b619163192a2bbee546c640e93b119e4d82b9bc460a80032d440100000008536aacac656aac51ffffffff02f466e10500000000055363656a51e6759d040000000006516563526a51405d45ccb58d5e5102b536a60100000000000000000000000071c0d38541772766cc273e69d44decc3fff8c1fa05eebca2c93dfad17b6214691686d26f62fda8a0daa219aac8e093608ce0f0339bbf07b4efe187dfa5a954eff286c877c122582a6ad448b737dca3ad13ca29afd2c804fed96840921abd101e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005a5c560d78da29830e36b9693277996801a300bbbf3f9914d82e4c6f15088df20b8fe776437b3fe3a9e12a7f2fd7778e2a80e52d0f09ac9344d43852e8553efe63cf4eeab343cdeedf03c0819822b3f4159cc47f549671fffa224924e8f011f99a38f1f2cab0aebd404941695a4f681a3142f6f714c9fa9daf4b67158792d9b50224e421fa1e11a238c6750dbadc3eb98b846640103e66d1aa63f85a01b5487ddc03053b89050c16fa993d9340dcdd6eab17085b3c89b268957b98152f306d91ad780a023d2b5b9aeb5ee80ac462e879860a19d3eb5c1b2790e8f26d2763b6744d0228ee03855717f5517276f630adc61c9283c9a3dfa9adf9cba1caa99819706981f3021c71c01673b46a2e3eff543717cccae118488c3272ee0363114820c54fa0bd51022eb575e56173af42031c50eeb7785b70a978321553564828550f154626ba75a1032433510c9147a7750a281e36bd5c3a0d7a1b800d994b61e0e5694e0acfdc2b440206a37276065268bab9c5606b3e97b823dd5e70e44d063efff9b75576fd98cbcb0212a032d6252da7ddab8840042d181729f891b06500b0069d79a4e0f1332f1974565031ebd93fc94a296c1eddd3a7aacf4b865b15e84bfb3e0bacd91e5cda7381e6d6b1a3efa6740406bf7578d4e1e68feaa17752a110bd4806e6b76a214bc49109b2a5e1d8373e2817f3a7d932f50ea2ed4388cb83eee1b357b5effb89ee5a365525433b2709458ba9bbb64c724c9ab383929f1ae012f3123a3775fbe377491312397fbfe7faaa8305ae99410c14bed150687a30e2dbdd199058164f237b94291109baaa4d3e25e1728fbfe2820bdfcbdd720924c035eebc39c0d0ac1a233bb3d8d4f94694232411c8669c540e07957002ab8e0b6b3874363d6a501f5b781a997e30429866a506e4e34362d85bd16ba67690149128d1f38a2ea36560d175b07e4c58e2ef03bde5f11f1a1b15a49367a266963a6615b0f24f25d9bc41504f978edbd42ef1b2c5bb5a6f348339e6793b0c5790db05dd2c3710de99ce4c7c1963c5aa2cf01b465877ddd5a23bb1d1a3e0deb5bc8f0b872d2375a4809c13224423dd63d945cd8a3cc3e6aec845bfc1b3a69181b659554d537b04f8411305e1129085ef81425ecfa42ae0fb7f7a06199881fd0f015942b068c096f64a736a5501d9295191f3b4f005e69ab279b3e43f293d9dedcead757f4ef8bc998c13786e8671ee1fdc72ec2f0d3b5c4d87772b96f4e65c7e2c1f20bb72db558083b6b91d0a32633549c284a393d4c1bf503a75d77386658ef2dfa31e43325dfd5620b6db1a9c0172e21764eb634c99b33417c47014f8f8d735efd6a223d1fcb39719ffa2bcef218bb07a5698b7338b8cf0a794ab9d67fee8ab626bc2a196f24c41895da0d1cdb81f7a5d8e493c93ef3e66cec42c315e9507439857cd1370f83d0a5be3e551fd98483e099061cc37b68aae6edb9638c8e8184d102ad2244a9ad1b20c145fb822c2ed768a0229d7f38000fd0a4411a7b457d9f8b211c55fb29b38dc06cdebdf87526194a06ba873fb6a1cd77bedecd8be9aab03ca25cb7608037e7946e5672bc78441e838ac295f2bb57030e31bda9d8824f3768fabe38a34771a5169e47a8d05f794c46d559121d7eec54359e5c2359ee5416d92af1d64600d670b9c19ce84bdc88236f5cfdb4cadbce478593f7f49b94ee1ea66358c9466bb2ed7dfe83dc05cfb606e80ad8e5e90c07255ec78f5bf7b59ce6be40313d82d5103d26327e272f4e52841ee52a09a217faaea3d10e5564e3df9f5ebe8725105e326328a7b7323784d6b05849bd7261978dcebd08b4ed3e9490f654ba1bb26cb443df1af8e5ca21d38315c28842284123c87c672cdee04af99096878b2db7f6d9d70b9bc99252bf59d0f216d21a976557847bee6bedcdba4152c35ac5ac60c05b1b6fb74237eb494ae2b72253feb63296927d8420cbd0ef5c0247eecbcf72b06e851aabdaf59b3b9dff8e3170d8540d33717855e478a889800c9e4ccf66b57e18a1afb9e24a90db86871e7be49f1821a16a2ce3ab5718350a92681836a63de43c5da5777a32be6d3ce24b8ac07baf0d83d497e0ab4855848880be7f4a0ccc382008870223cd206ac964193bd4dfebcedc9584c67bb9ab7f70e52a99629a9226f6005f71b7f753ee827ac0eefd47d3cc90aa9c4dd64a70f7e4d5106e1b15c5bffa991c85f6fe054490860416ba7a8f9e8d309b6956b0c24406c65e5625ab1d0ba8f3df0e74cdce38e8aeca2ec0be73a01a3f70fedbba4bdc5672dc500000000000000008d3b42020000000047078d93ffb9ab5a74b59e08f9a9c221c88a581445adebd4185e4aa003291df33ffa650cddcc3d9c31e83e7358f7fcb32fa0104feaf4f29caeaedbcdc989a2de705af78597e4e5946ab581ba66548b40645906347848cc71b816af24ac6326250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000067f008dee2ca35da54206b83454c270252fcdac728181cbadb7811f18bafa075530399c50ae4f2857abcb99277c45504ae74fc16fdef393aecd2d9eaa9c95839c38ad8ecfd80ba5118c11ee703e0470fa56a8d090ce7eed283817f70b885518f1f8116a1cedd0ae47f40e8508957a92f5b042a6b066c7c10c7d5155d9b6a7a2a031fa5828f1c91bd2ee74d87b6e88ef4160d1f9c99b7d80a676f0d8ab7943f898e021c24a291e70ee71d9dda6cd546fb5bf94bb2e1d4886c5cb46e0a4cd87d4388680a043864a2aa815ac54d2d3c1b6d87ebf3a968ee5a7f9ad12cfceeedc17fb1e4836b26701d596eabcdbe10f73901cbfb7aa4d1790a7b5a1d68c0d4cb1688645cbf030fdcbcb253dfacc5885083d35de2bce835e2db4feef62108b25204cf1ca6bd8e0220792de4c76fe15266f888af1e7ca2633b52187cca0e218617ce5b2214eba818032585a348f3c655ba4525e47fc0f41c7d4f67abf4d8b9dd2865ae35f3160a780c02121559ff98f0d383748c4ddc1439163c285e912cb59489271dc5bb05d8b424ea0318b825b9113dff0a56d1325d4178d6a3e5e367281b12630fd43d8f99c28629ba4a9380b737a281dba7a6a8e6c18d64761137303e1e382202fc529948e8e5adaf80592c32cf8cea2099591461c51544b090c97af62bc041ebb3a1873c18104b4a608c665d117aea7491282e46c8deb6fd27bbee91e5063b40868df461d0c9a9d460c0d0cadc92f74a4a520ee1ae2202494bfa2f3b393cf632428a1b60de087b27b00982deabfff1052319b19384431a4ccd7fd83105eef740445988462811f960d21edb3ede231931884014d6385abcd117f4ede0a17a1eb18beb15a12dc9763a7a77ee4f8e651bada5867d850361ce0555c8d39b2d1f9b6a526197f1812a7a6d49934b702f226676ba6c4033df15b86651622ec8499df2906760f5b61219722bb3119db957cc36665ef96c4ba853732e4d15762ffa1ebd400a4517ae5438e7067a89b795b8359358ef52e5954dd8996b6b64fa65380ebc06d1ceb2475ad54926cafe25f6bf5ba7438df89e674fcbfd4aa4ed7b600cae8d2194c80d9fe1482dd39c6a5371fa24f034922cac4da72597a889fedf8dc0a8d30dcd8545ab8391a11b77f5a35b7c68b6838fc52ea168984e64f4bf0321db5dfa8a31ab671c8ef04ad7b934b068c70cba0d950eca5bf53ff491f1745b58e31af1ea2b3f26464f76fe260decda22e7ac0c7ee6cd7be87267293c6482bf09ba84039519c6c9fb87481929206ce03dd22c7ccfa103f4c3fa968f5604c15a4243c6dae9d19a9afbc1945397b5910e398d1d938cfffaf4d7a246fd55b35880f5655f70e687b1f805776131dbceac3dd3b83a7d898e1c6b79be0859afb2f42624faeaedc029915a8df371f4475ffb327aa670cc9b51042a644a09029a569b96fa125eed32c3a808ee844616c2b80f5b05d91519e047a40c59a64b7eb7eee05983958bdd5add6b4b0b42e4766105939f73abcf88bf8b3cd17eb99b6f2389e7f1030b35a970aa3021d667910416c95395660c424515f2184f7b502a501ec4d4bc3b15053f0201ca01ce62c0615b198d4fee712016e9a6d1b1edb8dc368b6c95236330d7f474a340eb283b99e45e999409f2aa8fc51e6756117a091917d5333445d01b4bcb8ca58b346beec158922c2754f4d62df25db23f69ed40b9e852b8cabd10850260e1c8a73eef50652f61e707b097bdf162cb006b1701dd42e3082c8efd662473e31a91a30146e30a6f8d5c5e2fd05a91c31c6f0c7c607ee02152e9552e061f7bf8ff39664e1384a67e6ee71684f1bf81df4d455f983146d6509b6b9c736a4c7f4382b14c900bb7ff9991cc6be99a035423fb2dbc640e75c20e5715fe4511edb800da71e3bd99c1622e389458701534d7c3579dde632e4d42a1b9b31838d2f7b57417597d4f46c4b11b12e15c429031e332100c5f0b4a5183f6e08fd7e237854c32eeaf640785ed26ead8c54e36bb07a46066b4713ce9781ce1abc888aa7b253bd8b89297c5f0e66b48f24a701e56b0192600b8ccd1623cbb3a1440d9cbf87fe3574c94f07212ad31cdf2144c79deaacde6afff828feb4f43e83a57ee1b6068bb904e0c124a08e3393e41497c50ae1007b9176f9072e3a822d15cb52bc1cf9661338829a150f0358b373c65dc1d4196e68fb628416020d874b027089f303900648b39ef6d4844fce7730f302cac3abd2332405e7c554c3f09c9d2499ea7e64b168dd8a692b276210d31c52336ea66b9805514de92fe578ddd09823f06b802a0addea7f7bb82c9758cf9029e4ad14d36c6b159e7d601fbef997135058170a5cfaa4ac7a37a01671b8e86cd5643efbd51c8e116811f4f40bfd84195da0f5f4555aaf8b83dba389aa9705456fab9244915025e2141cc1d0926f7f01c510a", "6a52", 1, -1806089140, 0, "36f8bdf65094815172977ddbd85c765f54f741e4faee04f303b6ce1db51ec8ef"], + ["030000807082c40301264a153663c9b25c6d9188961bb4215eecd4abe6340fc1e85569f97d1026454a0300000001ac9ff4396701815fab02000000000752526a6551ac6a1e6e7ad6f5f855e1026b5d8502000000000000000000000000d548e5bd42aa6773ce95e0c5c8e753d46826c59708cc81748260debcbead12fe26493a48d458e6baccd6822652c44475db5a6d065acf1e04538f6900cef42258ad1e588461e405cbefd20eb2c87ad9a11858ea4f3262ad4cd8df661b9f5063f5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f3d7b353c02e638addebc5a379f0e69dfd025bd9ace3523d9b86ba253c4075dba83b7915dd9cdde457c51f936994ae18f3aef980188ab30cdf079bebc820c2181e08c44f697cc6e14822a2df441f479f3efbf2e5b238bd639638ec68c014a0aea255c06cf7a1f11bcd4e2cc59749f2ba5f2ccaf59338f9500316e4075b11c64032cc2645d3bcfab9c24f5bed1e0e57613ab97ad83fbea0a6fbc026704eb7ee55b0223f7d2ca52f956b83242ac7b1611657127fc07ccd3dd7b6e739780745eff99cf0b028be6c72d2ce1c55a0a26d4dc9b9133ea12d470df8cf2877e55fae3d307721df7a2feccd64a9e3e968e75d86474fe2c5c76bde5dbfeb3c6378f6966273aaab3021e14e9e2fe6e73a4a65e3acf7539139fd62f2ed1b5681eb22bf38835dbd73aa0032825300148242dd2d77ff096d92dc30d6c573aa05fd6bb0e097ed0b44789851f0315c3f2eab1046c335994ed3b2546d456ab3332990252c8bfacf1c58adc694eea0321a9e53cc107f9bfa64a22fc92eaf4364276f52de2dbccbfc849c243230a3966021d87b6163dc64050d38fb6187d6bed5bb8780e77f5664f46da4f8f0631e9313fb12c0c91cb951bccf1935ace7ad2e078e127aefe9507aeaec5773af999fd5c65efb478ac0d6999fc616c4b6ef07014d5e54553cd82613921ee12ae5a4721121be0ee0a61719a9e51d529f9484766ef6f2f041ef179662199bb0813272a83cf6af623136f5d9ac4faae9141fe9640b8be526c3a6df9a443cdbdbec38908280e83d52dce076ad7de2a45687bcb6da95bdde9b5be3db59c6e675dfac0fc50d2758a370b667ede40fb0872abe3bf31ad0dfc95e347f9ca02d61fd966d0232f277878f834671d7e4c854c63093a8aeece7615f17383c18759cd079c96136e7a923df6c475e2d5757ebfac1559d78e386e0ba87a6bfa5cff43738c458c4fc40adb474c64d3fef215e4ac26d50535e217eba4daca8cf5487492eabc4a048fa1d1a0c05b3f1ddfa871a9211486259c861c098d0c27b1d4e261057f49850dc4ade637b8a6bd180eac1f069b4a9fca321ee6e9a6a2d571f03d41b04f341b02f7335a1a69ed4557d61d4ead243c125b879b4cacb3939d86eb31758c9f96eb9274282dc9767b26de816abe51adf701eacbf094a2d222ab8ea7197534b41e932b25498343cc1b36b46e9143a59a00af545af7cd093ecee58859a1232c496acb6955c0e3420a9255e4844908798d0fc3ace7b9645b0e4f9ea89d4c7bd8b996a88b14b49b34d39a6e21b44fe547b603d5d5475872f62c0ada79868ed25833a0706a7846ed451b4f0de69285e4b913c65baafc8be9a747d0fd222104894aa5349db93853ab753045002740cc66125910fe9765542aa5ff60da709b7a6617719faa32df96d5914c317e4419b225727c1c37beb148e949437241926d1cb5c40aff9ce46f272814a9051b00dd0591011869216739a0c4dec638b354116eebeb51b56f08a32176b543e5cda6aba8ed199e4f935e2db835ba6be634fff01b6691d82d433a541ddb7e128dc1284f77869baae2993060116de6161fb42d957805796902722df947e3ad2d1cc593033fb8b53a48990a9fb0992b1bffbafc5a5e80fa474e52ac19c7164a0455488c83dc8359b1038d3eb7c447645cc0556e75698619ee649c8541da9d95c0c0b336c9f09e4f9432e75260f02bc745deeb9bf57a71c0a197ff6a1ff3439cf0b6bc9c11db8bf6374e09e3961db3f6109a72e267ec3b56ec5676efc6a3c783534efe05d33d1213ac9035afcb603731a96ee958598720d9f16d9fae6548e239758461671c5dfd385121b1af0f5da4db8f65075128d109fdfbb500382ac49de8a4368a0c73b261f9454877d875348f781a1d0010df2898e3d6957da259e9ec1308e9023caab1ec544b34505f2753561e9fd0f9c9e34df195419ab935f47223dd751dfcc9c8b1baa4be0a2f3402aa545f3baea037ce27c8d21b8112f4328849189a6dedf83ecd6777697b2bef923c9d6464a4169ccb8e3368bf4ec7e148d64d4d1e2898b63895990e187702cad67ebfc068ad7d22fa2b3be84f460a0d07e2a89993f619a96781cb9ddb8861a41f43d039c3fec29915cdf133c785cf559df7188e14836fba5cd64711dcd19a8c896ef1eb301c0be5e31954385ef71612cc4cb30c6db4aaeec09a5da9cf1cdbcf38787cc0028172ad8710bfa6140492b004babec3cfbc41018a3a9e7bc809a8019a1528670be14e23539203206c4cad44e83e5f6fc9f93eaf16dd0b8542ff53a50462e6023e177da399bac4040000000000000000000000007456f43fbef09e3d0414282af45ae4e78cde98bbbe356e94a288659737c134b9c5ea0817beb7091a9b55fe8c7caa44941773b168710757823efae634626525158f9f7b5423e753ab47a37be6767289a0a4c68d34a50a63b644546ae5ad003e5c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006803b5fe72c45f57aaf2f0e653489dcee4172782b452d2926026b08e40e64d39cc4b4ef0004f4fa2c7ffa4d599382e79ff742827fded961eb627494455d0d81a94e312b8e046952c1584172b9098ffc0acbd119261b1a4ed9aaad0f7b45cea0c9441732ad0ac9bd9c7793076570a7332f66d8f2d0e5fda4127698627d65aa4ad02252416390d9f3ff4a47e41dbcd9eeb82ecbfa25ad85acd34c3c0154b8e4b6dc8020b99e4d43a6a2148887ef795b311e7d56c9d647c913b2f4d9c14fdba682100890a054e10cbc1bccaf6d94f6121b3f6ad6bf73471ed42c2a0e7926ce45c98cfa015e26047170dfed965f4baaf2f0186867740471328c34d43d82bd5c61db7a2c0b4020d88377fd026a2bd0a04c8f8f86c3e08a399c86d1f58bdfa0e9cc572ff9aec37030d00466275fbda5e44127b1bae79f9b782b0a545d24a89623716ddbc8a58c86303113a202d6be0b79a4a193e4d00bc9e8413b793d7928778e62e9e332d3c56866302079b332e7e65186e3eaa678bc2536c3a2bbc4ea5ff9225a0e035f079d274f2fc030295cb27ce2e80cedac312618e29736d288ec34ea32801ad40e6109aa78bcc97a140986c3bbbc6062d2ff4f77815aebe5b4fdeed3b07cc36507194625afb3e276817f2aa12e92abd5ff5814445ef94a25aafa69d471172ed46d479064921dbe58fd0daf948ea6c4c3bb3404a22d827efc5f2923749d09d5e777b06472353b32bcd3280c5da315aef5400f90e389da2b79e39245b96d036deae5f6617cfdfd8b02cc7fe14d76a60f38bf32aa31ba3edb26d531e702685654d68b690fb94e8210dfe41da44a24bb26e8de4a546a6d8078fed7f20d30d04b73745a6f6f50847eaeedcfa17c6764231876eb3859802a20c9c10652c86aa867151b1a1c6e8f4608bf2a2e4b1f55f7d50ecd804b5dc3dd61b1fb55f0723d48f7636f6e990b476c30aa86d47b2e00beabe3926deb47c2a68d167077ba9c7b2301505e149a4ace48830be57d0f0d94067860829297434fbb467b4f331b776140da735b3dc3a4d5a7f40a27401c4d24bf3c3cc5fcb66c62ffb2cbcf29ef2de5ea91f65787de4573a79bebda6c6fad1b32a031c91413156ca57adef62b47ad89cfcfaa5ff6048a9ef4ede4e099e85c08a7e4aecea583625363b8815c2588e59528c3953e2bd1243fffd82ef11fbad3e7f2b74597d671f6b935bec72f7982e78c8a090afc0ce309caaff1af6baa7b4c504de55cc09fa7836f252be73e6d05e4e33056a543cae0c10bfde00431adbd2e2de2662de76e239f5de39fece02761888b4f8cdc4607993b94730e8acacae591b643166a6962e6020362a03b44559b4b8eb9ba7b41ddf01ef11272c2ee093956b98638ca6c015f66c2b849e2320d372920ed650f3e0c04710eb07108a1336a099c7d9dfbef5573f5f3c679a8351696fc3c096c398e1a3043d5071103de32105b538d16248e48a4a31dce286a6d4b752a8f2e37b237a70645e223178ddda8231543f51001044e859667769691cc91fd04e25f37e9be98b3dc32284334a8ca4a5197364d56920b567d254638b6257778932d72758b4ea88e84c3ec5475ba406456df878d7b05ed8ffffcbcf91706872b6d9b29092a22d8f3a80b22177e3dd1c12e06c7a05dd39d0518faafeb2346bfac44854cc40c05ae5622442688a15d5bee2dd91abea9fc198cf91588c3395b437ce252205bb7418ea39199d5967b55d564424b788bd6feecd3a6378183948601331657cbdd2e52486ff1c2302699960d2423925606a88e25f7109201e0d979c59acdb50e903cee2519f196d66dff304ac5ea05aae7f2f551a3409de6e7ea4f2861c994010f51ecd6f4a50700c1a8e4d263b174e7f0dce44e3287fc020fa329afa5f2dc9331057b290f56d74ea5568d5415a0261ded19866646de1a523ae3ca463dcc4da2e515b03e1a7555b6f7df7d30a0d4bd9057aa8734f20ad93b19334b615ee4b41fdd19aa789c0ee85b7634e768c975c8610673bf7c166681f79d683c195c5d9c5fa3202cd5a2c8d9a4eb2b51439aae25cafe54d8982f4a6f29308ec06d9e3be94115222f6e5c6fa62aaec13ecf75020c0395cc2dc2e0c0709de996cbc1f04a97fd009b4e5cd281dceb19fe556e3efe2a55a6078f021b3f246643fc2040ea2ec39fdf7169f36f131055184bfb8f435163f2d7bd7a37890eaebc055dbc17329189f22d659839bf5c5d94d63eb1c9e4cd31206703ce6c32c4a0486ae5d8bbee55ddf3364813f77ef85f2f42b3c6befea602c37f36e2818f3874033ad3f266c89798f2a3ff3eaecda23b2e7b0ebf89286f79ae2fbc062dd341a8fb0a60794aba352187e360bcbac5a4cd11c56286a473ebaaa9200e4f2aed59cd41f649bcbcf34cac835be27886a347847e5afd76d2e2e0ddeb1914c7bf34b2ff5b296efdf02", "5165", 0, 2041087164, 0, "ad4d2f932b8004ba15b204a3d4b12a1f12d686179de0699a618802d10c7845f8"], + ["948c5749016a2475e7355b7c0aa1f55e0e94590b905a8062079bc961eb8f70c564e01adff602000000026553b279852a0281386d010000000001651f96ce00000000000863ac5365ac6a51530000000000", "005165", 0, -325844976, 0, "1ea694eae1e51fb697936bee8bb182d94f8ddb235cc006c66fe1247ac17aea5b"], + ["030000807082c4030260d11b7ff59529c3d6503b4f8839a9137348e77b9421144438b5ed0f23b383a20000000008ac6aacac52510052c779b21ff6c9438c545035fcffddc3d088abf89202efa5bdada83d742f58944f48bc0f260300000005536a6a6551ffffffff041868c603000000000863525100ac51acaccc908e0000000000086563516553656552924e0b020000000002656520b0530200000000000000000000000000027546670300000000000000000000000096b2dd6bda16867d49219a48ef3809420d19be979cf25e03e8e64268a1294120feb5bc1145a310413bf11968df399ce474eb2ea96b5d1d93ddf3d180a9562d5d16a0c5beab2aad59b269b8b8efbcf466d56ad8b2c7ba1902ef9d8d1c8c40e88b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076f5a372969a2a90f17bc381b28d82d4727efc4cd16f615890882986a929421be5a35973d13c13933a88d40f0ce7e6307d68a11b6b71ab54c0b24d6d5bba48f61e7172c7d4963aa0e0b8ca0d1f258d66040744d4e5aa25ec1e9bb55ba97cd0f85c1505051c19f2291ef76d70103acc859a05542c24e794ebe9c0942ec1798bfe032b5c7c986e8e2397cc5799c8bacc1c7d42ec363a1be629be990042bb6025a23d031f9f06a7647202e7586b1985538195146ee4d837452628267cb8f005ce36664c0b04b4daf5a1c5ac7c7d565edd8cc77cdb44f08932e44d00d0ab0ca74b7b6496cc3b7f1acd4cc12c5ecf6c0567ee7fdf3705a73b33ccdcb68eacba3ab61fbc50aa0326a4293208d3138b237a5fcae3dbd8b5771fd6d85a3542a5509cf61c7c928e4b022719e30c48805219046ccad1706021f0a941324ce37b6b9a7e6a40971208e19703044dc9d3595028997aae8f9a983a8458cf81072ca7a9f5a69a403b85035cac73030dfc55504036f988b685d79002dce1464fef3c2e1602ae2b2a6c5f13fca02f88022edbf686d316b39b85f7f3e66f5b5d7e32514adca35355bd8f2deb96f8055079d5f144fa4e94748f78890b485ae50adb30a6028c10f952e8205262654034ce793cc0f2c0e5596458373db8ff095623813726db009c467f29730fdaf02954ee582426cb9a489ff0d168f33886fba4af0e117f04c124134c565ee75c773e3bd62e0316f62b86acdd5a4b27f2c96c94706dc0a846c2e3ce0aaeac71e9ffbf1e13e980fa7aa95b50c89b30692a06e175e8a046076317aa01cd78c07c817dbaa41f4f908bc070e98a00e96913cd2570231c623314a6a77b3550e21c52e4de6837adcebed80aeb5eeb999f7e4a0feb5c93702a55e763558f075dafd7f38701d4b35f90779251e6d27e96e1d9cb0412f30f10d882f5856192ad2bc9dc46a6be4d87fd41f9ea349bd06131c387b3268823f00553ee481411708c620c11b3ab1065bae3ace5a297eadc855245ba212f278b97a73f12b9cb15d429f2eb6cf23bc62ba0aed5c5792e5d212282de713795dabe59cabe86e19e3d975980239f2780acd93efd4d1f3a091a444e203658b2a05e1cf0ac9032c3f158205e39bd294a1ab36f8532a58264251a43cf57b895db600f489f34c26a37dc93f85e00a0f3ebdd7dac87b2647b53042bf443bd7bdd0376bf2937c73858715e682430f0a1bf06e2dac2703131d21618ecca28004298019b0ce1b3523bd6572a4bd832ab77b9ee9ca49ce98cfe75416ecfdb7aef564a89aa7649d99f5e231a6bd7231fc200ac3a403b5cb243b9a1a84591b1d932c938d0e0bda1769861ffa0a25240ae5962f51f9f13f7d0496957872d0733c1af627fbf1e11f62141de28be8b6f4aaf3e2dfa3e8898768bed00652a413484336587dbdc4374aa8d183cb15d53c0ff16ce847e33d7171a69874752a3ed15f46bdb5cca4870f4b2a0ef17e4b92c54b344d8eb99f131d4d8b691eb12c76bd07a1182a8bd2b4a678727ec2cee166dc3faf9f5668557838d86af0794edc4ac3fbf23b90ae27ea3e7867e7799fe5491a00c92341b67cfb30d1c132ec7e2137fbd513edecf5ae895c674b173d181b02a164a09343aa7399264c2f393e4a238716dfab9f4e21b12a196de9cdd61de3949eaf70531454eeb140f4177de5e2d0e299a5d97ec781215138fad3c06804943f00b06b19c8c7b2c3f0b9318991fe3f9b481bbb8c7ed9f90977bf1243b644fd20b03b3187d95fa6efc5ae30f4a40d3266ea5805ad6ed0f18defbe00421232c945e53899bb2c3f1748c8f9a441b138832f24b214e7cb6ca82aa95744f40cf8dab304ca545f027879bea5b3aa20e386a598aae6bfa0bcd452e16c989d652ab568c6906e27606a5fdfa1306e31530e4d13ecc2c1a670394d6ed7d4982859d0ef191f65b5fbb5e6087412f6ff0e310d88b49d90ea6a76824c4e915ca79aaf22223ebc342402993d296a40d99a2959c6905ead273908580d737b2f95500710af1bd35adf2dcc633de8e64918d652ab349eb3c8d21cc5cb249a5ab10910cd283ef1a8f98a15c0e7279875ac08db6d42a59c014496c81a406ad404801a5b40e2bc100e325ab5b290218040c2560679a501a4a3382a96086b4ee73681742d46c45c9c27bbc2d9f14195bcb64080ccf7929f613cb1e09fbea8eccbc2ad6b1dda7a7f802b70d06b6c8c5756d197d1b9dccedfac48919c18a824e11707143d010f903c644d70af23ebe797da2c326ad00c7ea666a6f2e4a33cc98ce523c7e1c3a96dc1d9286fdb7b80500000000000000000000000070febd97e47a4b78d6a33559486e7cfb2f5e77a3b05673093844df366d14fc53f273db683f8470be5cdd145ff319a78c258289686d326793359686bdb9ce2a0212a7dded8ca8e37789feb23efc011535bfa1cfa348749969ae225ee7f10648930000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090f850279de4acb5de13dd44ed46a76b49819e752a98bc9901be6acad26a72cb11e813f02d73834d2cf9e200533773ed7ef1f7dd2a3397db4c5ba812cbf99e684778dffbb7973da31e8b51750d5beeea29b63fd7c3fa148116191be31c2a84e671905ff5ae4cd1fafb5f063c7c79d450bcb4e33555c82ff3f34ab6a93928c9350316847445e66a9d78b1cd2a9ef658325f62cf5004a7e0a72f48626c61ba0f8d8e020395ec758719f270479b51154b47cce8db904ce7abdceeed4fb9c767885f57f90a08e19683921e456005d26aca4f556377696b85fcc919753042c01ad7a4c6423b511acbd6aee72a265703edf02d8d010d1c35cc2c6ffee2eceaf7ddcfe3f0e6f2031f20033baef6a7a099c69a2db5985ae1679da3e433e9441d0b7180b859aa0327021768700aff3f38c79429c8c64b478216c96db292916027e68f01eca5d23a3a630208beb4736b61186d4e04d17f35535383218cd177233137a544126eae105b8b1f022f14b24f82c9305865a1873b01ad2828ef653ea94ddf0906204bc0125e4a70e00202f61f60f8ca4191f45a8ec9bedf7dbc8bb0c9ccd7ab09e9090e650d6198fd225821fdae912a32d2efbb9c459f8a52297819c639c57b59cb6f6c61605a63cc1c2bce2283fa222143c50db22524c7c3a566c901a0775222b8e6c8853ce4d504fc0fa28094bcf1a188595362af614b06c072aa747dede9f28dc83c23c3073eb8456b800435fcd7f8d360dd463b5bedaa48e7a5429f7168d82dff9dec10c6d13638ae0640951544555d02fad54153f72a353f6f0c48f5507367b84e3c0bff1d74343731ed0ef9c82c4716c091342a03eb78a6da2394a7b9ba7d535e38631e9cf04c7631aaa68bec12b210bbf11e0cfaa0dfea38c4ed704adbba980d0260559894b84c6915fbf00b8832e07d83835ec8c9ff2b9e26d1921da3dc794ad3fadeedbd53854692e26adf82237a24371ad7d467d1a1fd7a0ad23ab156a4edc733d672cecb4a601bd8b1b131408e8b4c78f67809f2889ff1ca214b7a4f885ada27dc5344c24c83c4cd14031e0154bae789d6f6369c16fd8f149d8b31716b4a0439abbdf8376d180dae329224a7953f3cbc9336af15b7395807bb061b92f029d87ac616d61ef00a9d31c182ae0b4bbe109ecfa4a0a2b01bb5d05f4f309f8995c4dfbf1325ef1a48ffbbc532653cef9924eb6ec98fd12b2c7e41f03130b6f59630b6a349df96ff584eddb44a3e3fe562560e92438ddb1abbe9457024dcff0c14e44c981bd207d9a619cef03510a3705bde685bf3b9a13ffd9f8c075342069448efeed40eb240a4661bc2f7e90e1cda5b6f9d927ab7ea3b3366d0b75ad7170f000a40d3205a67d41915ac344adb7fda0082df39735e4fdd8e83f48e4ba4f2acd5966b9e8050b74646420b4c2bab406cb1e85a78b95e279827ca7b9ba3374ac6d69ef48e06ba79ed7fc28c9c386dcf15a756c88656e6d129b23ab5b759ebf94f20541b34a6351e860a4f75f6feb2197736c7572b0756f84bb66ea3665a564514f3f90de218b5d25e26fb35fae819661cdfb6ddab73b6682ddfa1621cd1739289051df8ab6c0239e58b230e8ee3166898046ba0c89c12ce9f3c3e68c08c2acd6b9e154ee5b34f700a0887dd83376708cdd5288a77e094388a32cec7c1a3c772be1d718d248a7f71845d0120062e723bca578be361b2481ddb2512bb3989d6e1b7616102de8d690933b8990f5ae0b540487905f9b77d3321c0831cd7e1f7e922ca4edfa8b2dfb6ceb16ea6659cb9d2eaf16efefd575300e3d3f3d2937dbdbd1a88c44723b50b737dd2f2f06b5851383ff01f5fc22258187dad0c74357c15c9cc092756d9d2d2bd4629ed99c08d040e50bb9fe52797d210822bcca1354b9753b6963a81b8d1faa72bdb25b2c61a6b9c68ef495a284c2bd6e0981100b0b73211140779b90c44cde072be7b543c1067d07499861b5930816b4d7d5d01b5e7a04e9a9c1028632d3b91b1f17e11097db1ab0b64e3a97b5204776738bdff05264afa87a1cf3c50d339fab51df6086508d06f62f970b3716c27e1283a6bdbb85aaaf263c3349ce1c7340045bac416078221c35f81d496be8594ebbc9e7f3fc766a12c949c732c3e5d892abe735b7af1467ce2ca5bf08b6e30826437dd46fe2df1efba1d5a433f65b96067e1841bcdd4658d7f2e012bfae66572ff586390681e9bb2b7a1ae51bcc3ac618fc2eec3f3efdc4ae0a643a2c59813cf184479199ad1791e05363324d23fa3384e6462a42de61b312e5b737565c91bb8706e6e7e02f9a1ac5a163a8df7f7e6e6887e4dea0c14f0904761638286c18426772b04f008530313d6a72565efaa320fe904d2e93243e95606d59a3ae06ee6f9524dc525eafd0900ba2c40e125b696a3abcdcce850b705666d24cc238868ee14c5f30d0f", "63536a", 0, 2112995176, 1537743641, "fc786d69af81262ed3b3352231dd70489480bb9ed707bc3b152d2b3a2b8b3cea"], + ["863c8629031f83d52a62df821834498e2a05e4f5cfe4a3e59303610b7ca1b61da514d17182030000000900520052acacac6551ffffffff49669c4b5da1d4abe3143a2fa4fcaa51b00eb3b77e1932ba014b5ab50f64c6990200000007536a6a5152636583ffa414f5767797ae52e8b5786b75968741f4a79c46229ebb342862d62f689684fec2090300000001acffffffff02d5dbad03000000000153848534040000000002ac6a0000000000", "53536a635200", 2, 1204216542, 1537743641, "1c0512ec15f2b7e02176b592b05b1016b2887b26172f0053f68ad109f6fd9f24"], + ["030000807082c40303b9dad4f54abf4a06ae5b726bbf481cd43a8ed5f615991b2434519a28d375d9df0100000008ac005253636a636a6ecf67387d2f55ca5cfb9b8ab120501e2b364827e236ff8e6d4f027e0ad7da17afdd027202000000096a0053525365516352ffffffff32f838829afa2d3f54d870bc7d860cdf7977951ed85fb0f6297a28e48338e3120300000004526a6351ffffffff0118ccda0500000000035263ac45c3dfd6000000000140071e04000000000000000000000000aa9738ada7024e953c41597c21304e28154f63c983e995171ca2fc5f21232eacf0c911895012320b733a5bb7b107e774f00ec992171b1fdf0775ffeeddd16d12870a05bba8baa22e790eceea15747ba7f71a735cd7f956b1f88f695e0fc0e714000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007d4501f136296a87dcd2fc449d36d385d50d980948a460d3420cd648a9511eca89cfbd958f11a83520694492e533965aac3cc0107be81e15dc727874a9bad1e61bde918af6766f96a633d47e60b64094b34bd7cc9778eb28b1f97ee930d80a6232ebcf1ed15d56dd6f6545acaa3bb5f97ad434fe689c70ca294985dd489428bb020ccabc5ecfaa3bd6ef9544a874b366b60ba639a83a459208c671e6a2691ddead03201ab08e1ec9f9dcc70e07bc8baf9d6a53a5f08caaa45e7572caf85efcd71e140b0453fb8ed7c57dc4dcd84ae2e7f865ef652d49f0b79a5ce34f3b4efe37b3eb1558ced602440533c2b595b1bcf1e7cd07fcb6e9cd7004da399afc2f73cfab6b77030284bdb838bf409d2f7c02fa7152a9d502fb33cd7bc434d63ba06ff404c43eed020050d2ce8be913bfdd9097347949cfc79815ed45b2419895ee690b944b5d8e530319dc4f8afb53f25b373bde166d60d2a4a296161b7c818b5d9ad19b7653b78c3103169028859ae157bb84d4e3b27ed8933dc9111aef4cdd7d17919ee2af642a415b022967b6ee3857241c906e005e0708899e7b274b2985da734b3f1b899e62b6f8b8a3f1799b0547602f00dc544c3a55ef09b3927ed7f06f9bc3d99d08fbae3f0dfca513e3b32fed2cc34829133a340a67618d48e847508247e1d68a6f7f0edf66419b091f219c1e3d88523b83bc2e081e60f4f85d1da040748c1406bc689da8b278a47c2715eb892461623e5b7a74c4113d2cd8911af01fb0aad56ab8ae99d43f4603d51f9f1909143e20e6baf431d91fbb191a1a3ad0cf2be5aa7f16962b7dc671ff477ea7ce09806107a1aa0309b6fdb6d3e5d93d0c41d0899a2e3b7239747249479c5f979dead2533a41a7af7c93b3a66165293246a8ab7334859f86e4f3fcebce113418b8b696dbef62198f197e6231f5811f29e32f0608cef09a41df4a27f8dfce0644c9818ce271fb30ddf97df2c42dcf7ec60f29fe1b80e1f1335875f0c663e8bef06beacd6544d1d28ec8aa8152d3bcb11aa2cdf4eb63ba882430151f79c4670067b3d6160159e09d2267442994f561719146a613f355eacafbb0d61e4d18c35d3126b37e8944e3a2f139fbf11701c88f8b6abde5b7b973a4cd9a98df523ffd645e24a4ae886aea842436190ebab080f6a3f94337725ad1f94412b36df46f642bdd5d12d15c1ab117cf47b020c59ba5c2a2dd4472bda356e780e5d626ded4e1010ed5dbf2bbdaec6508f33992d3f9c97d2e57355c7d64576eff4d47f9c31759f565e6a13a35e53a41a215575b884b8f192ed56ddd977aafb78c5554866b6375b854288d8c65899dae71609a7a2a96075f56de70b047b3da7af29ae8b6f03176f41716735a1b0bdb8ea7f5548f7ddd7d0da04b40f337001cd5e73c91f61cd7b65f864419d51f3ad77aa9b9951c15f8c3aa78a5cd958d0e523918f166cd599a3fe1454db6e7cabdeebbd15813bcb0539ac5fb0b9fb8620edf850ff9e4bc6e09e23f7a36bbdb6775c8b186a965df28f59a4d6eba4f4301891a5caf22aac1cc34faa5cdda7af969f321e21d9a69d2788c7813e3e28367d577a77c38ef74097ec90f6ca4fcdf395b77ce69a656d21deed4cf8d1197e6cfcd2ceb66611c62336a68ceeb131ceac100f4402f5da453d7b8308c38222b68f7e0b6618495d46ce7c5d4ed831c1db53e9620448b588890d17b7b49ca30ddff6964d6acc433b9cc527a4f1d6ea6a1bcbbe13d7addd6631858f185c2bc7c74332aa6416768fdad046e235bf4759d6a4e2102e0712eb2a217642bf8027d8dc78ec37f5b6d57a834bcf18a34e1fb3137bbe228ef639f7c80888b2ec003537b310f971cb73aadc3f0a7260ebc4b73750d01c9fa3ea8b1c9152e1bd774dba4934b5deecdab6e9981f78e567ff868c21efa401b09c8b6aa20a541dbaae18f0bd59157c79e756f8107d7681879b612e3dfaf7e59cddb390e0826bc978e577b111348e216c5b4598d247a7c3a6ae11f0199c6261af1ba19b32a2ccb64d7b04040cf495ab329872b8b03cfaea69f1406b6a7f4ce4b82241db1e097c79ae8a2bdc4b3861623f5d86616ae8e328a158e1db01fa34f43c392df2eb775ed0cc8c8dcdf3648d020c41dac628b445308f07b5fa372790b2335d5ec3d8e969029d0bb5d538c34c6bb4ba52a47e56d8d626c89a1b63422623339dbbc3321c171f6803502654b843cda6a265eb65ac4c7ccede65e9b857fe67b30458e62651510a1d7772762c8e08aeb8fea3ed5edaf46d6ebf75234c24389ecc8cbfa3522aedfefb302eda561c215b78da5adbcf83f4e34f7d5dbbf42b3cd4ce80a1103795850e75bf02f296f9698d4893d543b33103973342d69b9951102adf394aff4ef2c2f25bd79bc898eb85a113f8e3e0b7d99a3e0404e0712bc6cd9bb0ee76b3d97f91b68c5780f", "51", 2, 477568973, 0, "26c34b1646baa31943208553736c064cc8ace4bef262b335cb0c79d18facfd7e"], + ["18c2d76e043714888971376d57d75a67620bb52783eb88d3e0d447a077944cf4122ab523950000000006636a6aac635232d362f86332a0fd3d19ceb5082423c9cd11ebf886d9a20abea10383171b89c60090c27f020000000865ac6a51630052acffffffff05bae8b97f2545ea3083e7477b6536b580a05502b058c5967519ec2cb2d97d0102000000025300d15c56fa7a8402f4e76fd0dc28e6e63e711f821edb2aac886b212a2576fb0c67a15d1ee201000000055365510065450cb42b0407e3e6040000000005ac65ac5300334559050000000003ac6a007851e5000000000005526565ac6af542c40100000000076a51636a6a6a6ab6b3785703000000000000000089800c03000000002bedfbdc4200bae6b99d72d30ab36a5226ca6888c379dff7da9e452bf0f6a1d4bf57360d89a76384e2c9cb66781bbc9c35f3467b6cbc4feca9f6cdb186c772838f81dd0ff1f2072a2bb1710df44795330df44ebdf19217bb9e075b237e881331000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b781471362fa5b6dc17591d1a9a619bae465c2cedd2dbedc30834c563964e350010df3e389b66f8b65fcd9f5981cc7c777dacbbc19bc2cf5649c0af6abded5452870f5a73cc9827dc38cb4ce2c70308c331238793b26ec66af3c8b58fbe0dd0577569075ade8ac5a8dff4178fca227d26d1a74a457d6072838b88d5a0a48430031acc520aa136bf158b1fbb628d044b4a097027af69dc7c10d152697dc648cc7f031672d7ceab0d4f44c4a60ffb7841adb4b33b7a7b4c036443db72a48f964564ad0b06ccee5188e4b20bf48f4a2ffdffe6d5277a93da7b1611a9ff77383a0e2453c55c9976277e52450cdd3d03b3debbfc23e89a1ccef6aad13a8f9ccee1b4080fba031646c1fc03dffbf19247134d03ad32c429c28cb4d7e8799f5974d8ff01e708a90316fa98639ba28633935abf3fcb40a2578772862e2bc4d084f2f70964f0329ca2031fa83835a8f517fd51ec4401ec34ff19b4c823752acafdd6692735b1f4e8f0c50207bcc6038f3539fbcd455b6c1ffcf3fcafff3c16ec80b973aeb88797385a4e560213e4e3f7b6591ed212a55e634cef26abb69ac82eebb5c4b56d573b0598a370379ad54f06e421d28bc0b1ad25531703d39cc79a5f46a0db44dcc70de8d3b503b64c18621f5717f53ed4332bb0903903b03b1cf0f4c0b080a1453905691489589d6e1c75ea06f6fced99f3ca4ffc6e7ccd143cddb74a4052486416cb87bf455c5b1b3c8c6733a90396ec6060fb4a37400eb4e250b1056dd593f75598550f89fea9fb12ad5f4b40ac131f8a78f537cf74ab0b7dc433ef609db09585aa5094c5fcbf72019c791e29aa1cce3668410378b808f139c039eb7a7f993d67f63dab585a34eeef15f52162771f11b2776c4346e9d8d33f10865511142f7740ce6f66ec9c01e7466e556d22c5f559536c821ace8346a5bdedcd7b3f6f503d895e00a83313cf4db58850c523fff36498c462ce057ae25ed096eb46a3f48f777d0ff0e045938edfbcaa1324cbee07e8e994825132c59fac2475865f6a012d8f64358b1baa29b0a89904210ba1eb43a8b1de8551de27b85c86cb4bcbb281e3239fb95cc9d14b506c2fec4b7c46bcf53e58ecfaf8c8f7986aa1cd4856e0729c3ffae24c5caa3fa0e0abddd39df7399b8ca0c6b210d069c89105335afb6eeee087f0a923292716d8dc07655150cd9a7c38a649d8d325006a8c9e9c74be4ea497002519e670b61a27137b11c20c052638fb9ab8fa70a68abc59cc394fc69e8af7fc1a8748d5a190ff01015ef657a335ab2a82b0e0f31f6a05cd7d4a5d71e06739eec82b7ad23df70af946e9595cc25fe68f2c6e383c242ac6bbdeb70204523afb165ae13d1818bac6a037ea6016cc06a591d2c943da71588a4a7d48c19cd65b9610413ffaa69bfaafd824410f85cb9a84d0d0d6b691cd89eadbb60284fde9f97ee17bbe23729f5c3f18520cabb9c82f9810208d129da5bd43c134751318e9df28f5cc6b63a76db5c63657cd351b297a8f862121e6b8701edfc5842eb32843284ac2d525711794d332de822e8086a08c35589d0a3aeb3e37c0bf2808ac87cec419812804076b6c9afe5c6e32a6176fb17789767873954c633f6612018b775c595b294add05e33e771501c295e6b9b2c87703c681836c0c3e99d07fd2dc6032524736ced9183561af02c28fd37a122b3bfc2cdb73e406700867ffeab851b94c9d3760bd42318a8ed95f2ee4fa63dc32964263e342851a5ca7ff9af60297d733e3d71d0b21976e653514c433a37d5191a2008775a0ad1b097d81481a8ca70a736d1766fe9efab276c545f9b0dd15565c9f752a21d2da6b773da506575af3184d29f104d065d6e18944c8fc326c820fac2df4fe2b3090abb800c486d59b35240cfa7ecaad25c77b0dba3a857221bf64bfea51f8f0e7339d01b83ac01512fc5cc97889ca45022093d06f94df593603626621f37fdab0fd8a11fe853ca106d5b66ff7191ca63e5ae2f4be6ee82345aebd29069024e14d23bd10bc9687e29bc8a7b60209ec5c8004f66703d4d7f800a3430deb8e423bd43e0b6814b1a1c76e1717e5825d4e33e1f6a713cc71c303756f1ba58240b5c1eb3f1416843d914bf5995f4e10b13d5ef07d5632b6112587278f6835812d85bd4fd67018301c9c6d87745df0e6904fd7b1f9ce4d8820666d72a52ece9a51769376653ad664e467ad850c50f20b8ecc944b3e422de44c492d15992d619a518989345488e28af30c007590e6d475d3607477a7931740d5602c268ebca1f0f94b9388da1d577dc9339601072104000000000000000000000000a86bce573488082c6d2845a79f8cc3915050bf3251a97005ccfed7ffaed44880ceb9013471747c6d8284ada5d622bee0859798ffddfd4ea30385c361ee0068b1fdcf684ed2c283ed5bd8ca6f0ad451353a431411a58f5a2a2fd0de301ddcb1d700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e63271d7b5597b1cb014033db78a4c76b2d9bdb1e5d31b044636ab7830c195c0b976049d1261054a91df4d2d3d9262d320501b74fd923aae9159494ddf75d52ebf794a7cc8148b9f76d6fc7afff3ce61c3dae9e3d15e040b5143c98cced258c016f0e9d589f79c125283745fde3e898d75f04d5acd41a0446aa42e825a970b53022b698d0ea4f6a7465b041038d24338ccb9251dd87ef6e5193ade031333460c8b0323c4a50fb0826e668d2639e2632fb023c3d50d0f49baba3dcb7854131558fa330b0796d7902f63000a3cc97a3ef366759a50678f6345ff19d4420448338aa54b5a456aa8183f863b985d3dd8841707a81ce7b9434cc53f225bc253a87da1530474021a37f86454809027a82355aa47afb67a14f89edf1ec22644bc3786d3457c6371022d1bdbc853044dc9d514cf88e7e337cc874ace25d1bd9a78098def38276eb5380312bf18b34930e424f6720453237f416d7b32e268c896cafd801937ecda318cb8022b53d185851f9bbfc06a6c0ba98c1bf896f415b7c01a86fc6b1e4619acfb9ae50328f4df0e0b0fbbc16ec84060e8dbf2111791a936d837a8c44389f3ebc11fc182ea9f7b8b1ddd9c57cb467a9ba114e637e6090c0dc8e64ca5b91f340032c21c0f123c25993123b81d2611ef21d2d5ff96da404b6040e64bdb3e6a24b1a790ed6a7d53ed85861b9dd418c8eb3e2d6e56e0c949150688d4e253f1124704f683a5eb3401004808c2b32331475c4509ec912277fa4a6fad7e5fc81322cc06ee8c828385887a462d0a52e4e0a26954b2c23c26cf51c94d8395bdf863171d74dbec1b0b4dfdcf9b36f67db8c5378770c061436bd72569372ba2ddb4dd4e8a6f3fedf3f69917fe51f8e1dfaacc56d5d1be5ee7489dc932fcd1d1b3a78a19de2e4208dddfcb8f6cb507d44b7e824110aedc5131f453a58c8625de3ac3b907f57d76ba218615d3c66681ac1583b07e9e8daedbdc174b4f853aa984421355ba81a2a8ae6d4f93116398737573ef4a385f7c8089ed22c8a1dd252b5626fe2b57104d197854ac809a1f5fcdb5231a43ea7a3b426431d5f24c1c9fa507a90e22d775a2792b5bd48e640e018f4fb5d9121328aab1f502d2ef84cccf325dc48e1a3e4296d397735b509a877b7703f1e2a28588e8bcd75972056e6274c702a03f1bb94808a9711f530616cde488aa5332b5b48d1a12f11cbac622a3528c675486a91b8a5cc113b35f903789d6462833b58083be4f34330479f9c053e2994fff230984401c22cfcdcadb79f55f453f8a049edf90bccbf9c55179af79214d7d3210089ec76c2f4834227283f68c4056ead942a4dd442755bcaa18c4a98ebff709c290588cc94e981101b780f9e812f0eb1cfc906eae02cf79fe110c3b6a53ab19ec787f6e50e7a555415bc82abaa93de81941e8d6525fdf55bb88510557a11e6c44ab00737b918f18ca9c5d8b8b01de8b70a06fab4db6502e192b1cd36b5830163ab014a7aedfefc56d0a2efb3372f925141a3725259f10496c2be789906786a775aa20364a0fbb5477bf97e1f5bef2f58a2b6946adb8466ac650e6a8a7e63eaf2b71ca94dff730120bb3dce1baae46085be6edd2256c30a3d25ac30888b55d61e38c73b4820478ec41c177f8e5b290ad5acbaf6fcadc75c593b01225371a981adf8c6f0f7f404334ddc43dbf1feb671b8e2ad559d163eeced372d9f96c9c929598809e7b81196fff35ef19e5d43afbd8aeabc2ffd58d6973a18303257e9b50343a4b683e32ad932770712a5c9ea43a340761eb0d6c6565a3fd48abd87e87f491c01d7cc79ee1945a6792f7450b3948253bfeb3e2102c345cb80d1af9b0e61b0a6f158731a40ff99050590b6743731032a7d016717bb31691bfe541ca7420cf2a48d3baa8d33099d8b6eaeb5eb031dba389bec0d44e45b0e6dc79a8f2fa3a1e276d79000cf30f404efbb172ea636d5d211bdddc0a01a6440a791d368fd3eb201342d82501055e6205ba6bac6ea6d8c2ade6d2c78231b195dc4e57e32f500cee6a5b8d42cf59a1c589d9b76d0662e8439b13bf6aefdbe418f1b8f56738971b7179561f99dba5133e81534ed0d376d19e73971f9aa5472f13213271e1979430cc39e9b9132c2b8fe9b51cdeaef42675945d5a39400653e6cbf8ea8dd8bebe4fb4b44e6b16e7e714cdea76e4f820a515880f1b2a1349f3d3bf7665edb728e48f8b31667318c42396c0032db716e871d9a03b11a9f1dec27bdd4fda94941e69456db7ccf238c156c87e5047c6a7f0f9a60e5421f7d8aa2e7df0b1bb9cebdfb5c3010000000000000000000000002c59fc262ac7ce718087e91b1c35cdd5e6545b7c194789e1f1b18f63bab83b35e6604f1d0a95a126dc9f7f9b2a490b740bb54588d258100e02acf73d6a1fd05e0711d8fbd92d08a67a30fe9cba517ade72003f36fd2007777f86e5716fed03cd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd6dcaed6727db7670660d75975193da71d294c01d0b9749ad66b971586f75e8945c90e30494574198c3031dc45c3158ce23513ddb79eea95459b608ee951e4f1ba3c118a1898b38e98e17dccb446761b57de060e588b685c36339cf9b3057ab19467baf2c726e2cf5681b5cb5eb13bf844b435687fb7c833e04f2ce30951a0c020bfc4f641a3cb154e9a6e85cfa0cc6b05c9e30e7a69721b03e3ac1035d83571c031bceb198d178b844bc20ea750f426d99ffd597e335ababd8aa977af01a46c1a60b063a7d9761701446575516e4636595d6d5d7b1df7658f865fcf7b494a6cdbf1db75808c0a250307abd787723a9601ca7f1da29253b77c7387c07afb3e30a98710201441f2989acfc9195a5a5f543dce08e7bbe7da86fe4340ad16fac7742e13da2031a6800b7f62bb9c1dab162df61e0f12bc043b52f793d774527836499c915a64e022571e3e914084d38f2a0cdc42fb10ff47a19a8ffb06a55c2af8728b31f4b2e49030869445a8c531f19ae90794ae32b9330baacbe7b60490fd876189332536ccd810327942fde449e88620394979e1ac0ba5252188eef7bcb61e5005cdeca1960c32dfc20f1e346839ab7eb1d6e077034dfc7358b0a95474558dd8d59275bc5e41db0a02838a09d68727a6de5cfa37461925fb1ad6f1adfc71446a720b2f7e992817bf1c0ecd05fc504e392d6675a6923e0a0c8896656f4483d2868d6e50cab850afe4e4ee133cbe0e1a01ddc4eb931ec9ee5fc92301f980ca3d3971772fdce1ae5861ba5ea8b21f13f3da536e623b67ed8268477a6f7e18ef647d0262867cf9161938bca396781cf795669dfce957e09099015d0252800598b4d096fe964e3defb502d90de0fccabef6c2b10640ab8bdd9ebc3f19acbd17a0a43a73f37e9287e46de8eb13b37bbb436ab640f23e8925b8af7456366c34e473dbb32e2416b1fdd403d04c8b7194f45a3d2ed0dd4d40c2ec8e5aab18c86edbc8159d911cc09d925348ee48065b0e347acbf225e385b9caa965d8491053e80354bb67bd63ce008e4e651b5ae894131c12736d1ac1ec8e41340a419d234e1633abf5925faece585b837d2d91c240efab42f166afa9be568adb74ac49c76d3f1b562e5d60d1c65c62b7dccd77af4cd937ed744ff5130783c3381dcf3a743b713ffa32749890ac2d96318d576dd987c3b28ee7d4c321acb0c5aac067a18a50cb59942b8917b7b00fd648802125156e69bbcf650a4e3d5ec3bae9ecdb60f583f29f5f05c8da658d8957b55d28feee0d23e27cccd70eb2d18a59d8df7bf7e77d9e5abb1d866b61db0dfe237398a5609d647d9c4845b7f8d6149cc1cd611e1a72a762c1f60a926439d69f7c70c2f4a1518f7e4600599bed9b263f0bc0663cc0083a0a1eb1baf5e288df4d7bb4cac6e90763c83b8f38fcb3406512af43d34cef072235a37c0a329aaba95ed8db3a4ea26b8d2f23c40f297ac86b79bd9529f889af417e7ef6139ca676d409bfa2ae9c347d93c1c9c47b64c86d929e77e8f82fc23ecb44320d9e8f05d73594c65a1787b312229b47c92ee19c531039eafd706cf628ace4ea8c61b64f934396c67c98e4cc0ae213ba0baef57bdef6e77aaa6683c6bb395f32b5a0e5289f2742cb763ef692623e7be61f627a11c522b28df949e3216470a00c114942c7200ff4aa8d6609cb9456d4844f48a90794295b8b6e446052643d954dd49398e8e7b5ebb33afea5efa0104a3cad8397e0d0c7bfecf23fed0d9e5a40aec61a4b221c1cc095c5c212209397426801959a9fce1ec62fe42e41e8d4e368f99076204fde8fe06cc93465fe86390d1385a3aa3783720b4860598185762af1fc67ab533514da8551b9e18bab16a07811e3de37e8b9d907e5f161782c09ffb65bc8b7c4ee0ea2b134152c78c84a657c93b668c127e19b5d0028a47bf422953f7b9b2b72cceae5fc4f94b32ff0a87fcc1fa36d932eaa2c282be0adaecce04acd39ac9d935a0f5342494213ad2cee3891291724cf01b22d302bb9b3a2c2c90eaa997f811ba6cec3edd5c16b5af3b7798410e90e349a2a43a1c9776f277977dd8c4b7fa846d592d0faf0eebc5bc09187df5c1499d6ad9bc3f020e11487b0cf8f42875616fa669198559bbf7604cd8946b1807ba0d32faf6196790f8646c2370a9b015b409f08dc1806a9e9c32a2c427a5ada240e1e34fc750266f9225435b2330b4f23e740072fbf41602ca835648eaabbc54331acf82184efca8a10fddb52c2ee8ea39521b822d881279b1034a9972389e000d5baf44afad6cd62a673b3935cccbb95d2bb45c657904576dd1a49d1f50cfed45627977c21fe2dd9b902f58d7644d1365e61fb89297bbd1375e43368733ab4a42c8162221fc4f1aa0ae5efc98faa36a7e6a5ea156f0554bae74f1d0ddc36a011a7619f873579b3e8f550f", "5100", 2, 99633523, 1537743641, "5aae9e497b554e4c40b7ffb5a0099b6cff49bfc9b45656b603c5cf055a8f70ac"], + ["35bd1d2b021099c24d37e9219069170a4135cfb5edf05808951e45a2ea498088517d12bc960300000007ac655152525263d16dd30e0b93fb80a6fe9ccf89a42c7f2cf78101f979034549e9c0f4d172635515619c2001000000096a63535363ac535100ffffffff034f90b50000000000065251ac6553002177820000000000009ee1110200000000066a6a65515152842303f201000000000000000083d3e00300000000504d333c8911122bdbe15cf727f86171c69ffc687fafe908fc03cf4e3b3a4f7818ab949198c9964f9129d6cda6c01697cb823f8a1463884abe230d390cf6def8c5a3c84511358472862e39dd9429e74b5815dada516ddd6b728430891f19b93e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ec08476ef6e403ef648949a43a2b02692d689496982f6bb36d2a6793011100e941bf05b07540a32565b41bc42e2fafecd601169038ae84f9bbb7b433316fdabf2d5305b7b31017a7072a5dd88bf30255a018377ecd25dfdfcfbd7ec3218ff54c487f13935f4f190265c06c08a41e493cf76b42d1dc2fcf4e472cce0bef7783d70212cf973153960232262b1dc378ba821225674bb1df0d48dce618d21ce0ac4fe2030d1eef6d8ef2f2fc049a92ea661e8d7fc4d0e70b35d72eb555b08af2412589190a0752c243f4a5cc2701a60b478bfd5018d0578d0e74743bd323bee9bd9f2ee2843c05f088063bfe0fb0ca960512ff8b3605750e4a1e67fd9e9009e6d1b99f53e1020bcd4926aaf57aae63cf49b55fd069d78279f61726c70a1e26be3d0d5290829303026ccef06829cc64513fa4e53d9c6723c445e5dcaf48c969018e709b4ccfe95502199a08df7d647ee2a367de7ca77514ea6a55fd6b8a831ee2fbfa276024922b860324025733486148036b7f2815eb73d0a9e8b50c5ad4eea09ee5e94bb48592bb9502172aaaa7d23c1c2738b28cb0d6484ea7da0b39438c8ec3d07fab0d3a6742fe02b523ad6094332fc2f46b2f8bcd77676fc21a251980fbaad753e0d25e1d1c3fd2eafbfaebb3f13fa4482aa4870891c96e02424a2916156b4ce18909fb8c6026761fecfa6db2cfaa3e3108f5b9db8443709c3e895a3b39687d94e5029f9d06ceaee58251fb5020f6bea4db3b02dc8826416a74fa7ba294cdd3e90d56a57d0a382d7874b26d808944af927c04dfc9c1d4bb8c8384a6af942b9b28e9fa5061d85928a05a88fb849759ed3df08be973f8935ed2933a7fbf604acb93f64cf16cfa11594379c408319d54337072e3b12a5be0b453cf97f58add9c3e28103008c34fba96103d9a6257faa542ec77af697d839b1ac48f8c5005b239dbb94eb1f2ca532653119c50e6344a5420b4a1cf2fef4c5f48fd5d4351be9166f10c737f2f6618f9a18004970ffaeef1a25a9159abc109e644112b7fc1ad573a121801e3e4997aafd9ec7bf54ac44387b07914f80fbe04020906e690db718c55329bc6ab6aafaa3f7dacbbb2589f318783e1a04d2fba5cb3bed11491b5ed10176c57357692127db0bbc0d42aed0942dd527bfbfca5fdf825cb60a5f29a3c35c9229635f98e9737be42bf5ecbb1ed0417d045c5a0eb5a92532ce3e4cba60b50c3d20dd4d79e0b1b2c905d3ce14005c9d578b95df45412e452f4419d1da366323216c56e71b206c02dde5507024f6c5f494d4532efccc4fcfd7238520f79868b9d552f84692f7e6928658048ce827789a3424c081ec51955c769fba33116bd3ed9e3f4ff6c50753809804388225dc4af7d621171955e3bdec833a1fe4e35e396dc8fc7e74e11eaf0b76e6a78fe94e9aa0b1a32cbd297c8ef9aa873e3a250f4cc76c783da4f481c21e4feecd7a9ee65c79390cf64f89479dcb78adcfa678990202491ec48d0fd3c405fed821798cc2b18c7461901e3cfb911215af502f5467d4fc61f4f14843aff70ea7950007e25d872daa54cdd6733e7096e9b553b147ba19acdbf21e73d2024c90aede6322b38870ac564563f2ff5aaff7e2f6774a64d53e0c0ec54a01c9743f2bdbb22a83d4b11e769290179edfd73b5aeb34e8d974d66e819b6a6a2f091eba4922b8ff436319cd969a9a3b60bb93d9ae24c06a48480d5ab8cd0b70f16f260c3b3a619c8feb4e3d005321f566fd8be6d806bb257bb17b75ca43c200932816defc38d0eb1214e365846e7777c9fe96c070d889039b3680a9f0f54930dd52c379be664a147847868686047d210e979507cfd1ba799d42602baafd6bdbffa5c3e6d77c693d016ce6751c481da655a16aa4a16fb9900181b91abcc0fd7856917f8121e7858b90f8935e4045ef616f8253bfc3a497bed56a7d0d5b24465e3512372698930e1212eb3be2ea4b637e831afd50a7e2f837636c2704db7e245e6b01ee88ebe5b12b959299b3cb7797dc26943972117b7dd7bb9655da640921d9c275a0825fa8eb826eb0e3aa11111192a5f6cdbd8c4b7dc82f51bcd49b0667e7705b41f8289425f75908430d71d0d8d959d2df392987429d6529487babeaa7eee769d23b07d5c8a506483c33555b6ddfa13a5e85c93045df95098cbfaf996d6c9d909cb417625078397dd8b89e04ad5cd73ca1f74aba955c767965c714702a805037c11f5c95446558b21dedbb1a36738a9992a1fbeb35cedc0ecdd79cd0bd3044bc92757b3d8cc16f98a9dc16c159a7031f2d6666393f36dcc656ca0d3535ed61a1c48b2693a39e87af09eb9540b5d51e9999156a3a6dd84cf37ef023dae01b435d0383c1a0bc8da0fa74b83f86fe45f060dd03a09be71edb2f1ce69a89afcd0d2e9d61720529a9d29e33a9f21034a0310c52e370a6d1400", "006aac5100", 0, -166798197, 0, "44df50e4222110d976613eb8cb85a456d024275b56fcd4571b763d2414764c00"], + ["460aa51003c994322cdedc521e1064c017a2eb2ab7f769563b23febaf5ab8e3aeacd066d850100000009526a53006352655165ffffffffb0ff9d35922527d106074553fcaf4c346d7d8645718f1a6bff41d2b17577dfac01000000055165005365ffffffffaa8b9985935a75ceafebfda2f2ef16562190b7eeaf377a8b92bfad7497b19be60200000000ffffffff033371cc040000000001518c9b9e050000000002520036c3b30200000000020052f339203100", "515300acac0051", 0, -355966301, 1537743641, "7b0dfe834e2fac2df4b3c6ecf61711cc402b74ecae8fb11c34189f6fc131771d"], + ["030000807082c4030341b01a7be73892a3e7c314b2fc6e316e825b982a47961845d70fba62997a986e0200000005656a636a638505c21bcf8fd5f1b2df3a9afc2d8441e457533137832c2529c46def7c2d0731431faa390300000000ffffffffe5292e4b56be4a233cb8169ce35024e20bf0ed78767eea26ed84b4e8297d2a2c02000000060000636363acffffffff01ed843e0100000000010000000000000000000108089a000000000000000000000000005c1d578dd3a2f7e791c2ffc5491b687d3b8bdcd5bfca246cc2933eb8b66260fac56fa64703bf19f0636ec8595d433e00ae2a0ef66f42b68aa0b056520c65b742647053dd1832f096fb74dc9c0fef0b7cb0811523d08a686cdd132818291e0bdd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e5cc1f9657091e71427649913bad8e967234d9e68ddf1609f7d7ab44f411449647336059cc7122e67e352a66947d449ad41fa1a5167318364c4618295bb5f297eb42ade88b85da5432ea790cb861e1037112695067a4a5017695638aaade6dfdd1c87b87b97c596efbefcbe13099c1c66e1a1bb20b20ce21b7e1492987d4e9db03143ba4a457687531a9f4eec7d22ddfb48fdcac2d4e134e78cda708864287c773030d1d300a487cff5e3aa2a59383b31046266a2bb798cebfb94fd07900b18c83320b01e1f4499fb6a50738083841bdced172c438807450653e143a04145f232ddfcf679b342d081fbc3ba71d3ccbbf3d4e5049805b43aa307dbe709b7473eeca4faa03149a39ccbcb0b3294ace2c47592ca7cbb5b400c9e9f7dfc7f0a38de2b8071081021309849f84e0e2d5210888fa51117d4341e6125771630c9b7e31e6d4eb51fca702090f0e520c5b106b5188c8c46745faad68e3ff7cb05043612d1af0359df38465032ce5d5a0ceb0a9852f4e29fe3df7e7f37e5a71bba7a6fac9395afdb97acd1d520323ceeee85a8cdb99a15c54c63945c3376d2f8fa3c18ef7ef5ebd9a6667913b06e89a18cb59b75fe74d6edd76194e4abde6d543a4c969093cc89005914c52878b277a64e127595dbfe8573354c691d05596a3e901b9564d6812108c067deefa8b599fc38e8b301713d9b7c60af3ce226d56ac6a0cf5588acc4595d5507d64faa15d1d307bb3ee37d2199aae44646f21cf7b72afe07a01aef1fb165a0352f8a563c8044c91547257b7775e88353448bfaa90a760ec0a983c57f4feb83b96b8e547fdd821b5fae8ec3fa1d0ff2aa7af1c3088f163c58f7d9ad10b000dfc71b0ea377b477ba4976f69cc0a4553c33983d755dabdb90cddcfa0c94d528c65c8f1320445f5a0ebb5a28624316c65c61de3eccbbd535a959f05f998de0b762b49993eb9345055c1d54ab95edc6adcbb3ba0ac1ad6aa15d87d0cfe44110854b7baa3c11a84e5708baf8d23bb37a37fca9bb8489e59ebd714f564932ed60d38a1cc596be660b774ee6b9c19449549033f6fc216813eacf397d05ff4245540212474bf35b15c5057f142c34d8fcc8d967b7a4afefcb85824dc0857588fc6cfff5db7f60511ffa36b21033cd1c2426d4701517eb8eb34d270dd87dcd05a36d6c5d44ce637a03643e5f7f7729e64671d0f577bf57f3e74c422e71aacd4baf07a5cb9fa9773125d38241fc6d7b015085c0a339f1b08f58523b462fd0239416a89400f413c99abe964a1ccf502f7a9a14615e6e15b3c480d6fb132951cf3ccc9979638599db972d6091c77bace7e73a4707bf6a154773e35cd5cb03c3d42d4a5a10540d3561376fe928e4622c78dcbbc3e9cb71a5b34a8a1baaa723a58450fbc8f99d85bdcd744e5f49f5d97a1d4fd069f9d5d29348954ba6197e106c1679cba7baa078ac48b8346e164ae35f0a1746d23b28e98ca15bca3d01b6101d4babaef7efab969fb58ef43bf84b57987c924af95ae7bb48b01f3d586bdf493c0bf126e4522e67443c5566a082ea0d46c0fb0f183be648a56ea740e429831f0cbd2de3f882cedb006a036b12ed73d3e86ac22dd71614412aac6e244ce2f047086ed4ecce454ba432546ce8143c6d5bb9aed86f605d5da702a929c63dfec527f5fb6e505c6ad974bd528024c6fe55099ff89f3e2cc4a2d3f012e14572959b92d2517285e5774906bfad76412e7f6e42171a50587a4239eb89775ea118d7b244350bb18cd3838a3e738680d94080d9445fc173e91ee8aa38cf1d6baeaa3a13314d989e1d96305c9813c2ab97e670f2ece5f4519c880ebce754cab5497f109a82cc832830a598c4ed147afaaf375bc3e2cc44092ad96b20b54f3f9bb722b1e71b64dea196f8bd41a12f542dc21a298d6b32d51af1618061c20a62996e0fd7ab83b2a23b396f9380e4c8fc48723b546a7f3af4745e08b9c0370ab75d0dd873c21e27f45c00afe6d768c48f696440144ee055a336887da57d3d62e146dc740bc56248fb7b16449953eb22acdd4e471fc8f3bc2f7b3e3b7dc11b254c80a8be4dc779abee53832be979d342b876fd3671d5b4911d52af6d12f086bbd584fb4c861b2e9d6658aed92d42c8d40e66f74145e847cb0baa9bbbc0817640f2f6eea2e241add506ab47aa423620ad37efcdadc7cb283fb0b180f706751d9ccc220ee26b41383735fcb66f49e086ad28f8f52f44e2d428a92de0510a7c9aa6caab94ea6197685bec38fcb45bcbfb9fc50698b3fcbd3b8cd8d21e72118a5602479b7b5531856e5b42fea466fc57a462da7f59a85ede33568c2a4a06516875777051573263f4b7747310f2f335003307ab5da394100a2297d21c27de876650cff1dda256a790934a068e3d759ef76fa5d93011c4842186893ef380b73223b1fe6b300ea00", "acac5165520051", 0, -252135003, 1537743641, "dc21a7d1280d3b72bf0bfc473288a5d5b977490322af2a7c1eeb6223febf7e9c"], + ["584c2950016b941279376d65ca68a29e1fc4d6e05db5aa5857d8950e5ff9dcfcdc924b7607020000000153ffffffff04db1a22000000000006650053ac525107ab52010000000000e52859010000000003515265d0067d040000000008515251ac635165650000000002c920aa0300000000000000000000000027274301c0453554288f587512a95d47cf4cc97638f2806a491c4ca47bd8c6efa7a2cfc2eb78d4fb32a01a83ea242ed8f0b48df198298227b1f2564495ca27fdb5cca93bc02873c11b6657982fa6d9c94547538d589ba9ded2a138e581487490000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005e585d6ce9a95a9728c955b3efcd1ad204b421a930ad30c9deafefd1fdda7b5997571da430a0a2125e2b23afae8bd3834944063863137ac44935850c2bd28e79b5834c8526a27511cbf29e2b27912722851539626441f202e9aede8eeffcb06923c42cf95aa2d36b2cbf8c2889c96da7aba4ed291bf82fe86e0818aff6fdf7f0030022589728a03294a3f2803d3916cdf064ce40559b3db24c7cababbbf9552d18021b063ca7b790d3f66826f1046a0ea3e00078eeffe6b1c34a8dea0f68f8ac03900a0311c95fb1fdd82c852110e0d4c29b1f852dd8da978b96d520a2f2022cce56b0aad5cec00c8ee3a49cf37f4fa6cff6395d4a43cc6fdeed67b224e2c430b63142031302f04e4152b307d7ea9aa94afe2305b9a2af5335c1c72eb27821551084f36a023060475c8378aa4b6e9fb21a5dcc1a5a088fd868341705d05d2a0045c835de11020040339e07e1f4cb10fbf3274cdae466b355b49b7c7898bf90f011bc5f750ae2030623a4054f43adcaeb6716f42fb8dcc965c182614c44d4a8eab763953363d1ee02061f8441a0d581abcf67a97a0a5382d1187bea64943f4f069e14fa97432022b5d86ba48f7354ab0dcd119c369025f85b34c28d97994b68269a41d32a0525404257232e166dc6f0f2e36c03bc611f8ec482311b206cd194a4a60c470db32836684d5cc400f5ed4879860b06ed1b1d8e45289528f13c9124c10880712505ec5f69f33912cf5423ce2092a748bc4b9c66391cf3f7ee151776843fc72150c227457759d9663d16a999444f041d8a6ebd872d849b04b531364d4aad59dc61ad1e7688c3e8dd1b4d72ba33ade4a070ab135c2607a86db1541b48ef3f8fbab9d09fb3568e4c0bcaff1483867d4068bbb8ebab2cbb34ad46499cba06f2a982e3b847f012a747fb0b1b558d73bb6648d75949786f6d045874edb9a918d582fba361de9153d6f2f61bbf24c060027b7944a895a7dc59b71d322f359875406793594dfd11c8fa2a7542c39ffcaab5e9d0ff3ab7c7238d6e509d728bac7719ca5ca24fa9f37a6863580d010189e72b73f1db7c61f43d74332348434f046301b54bbefdba302bb5a290a764ba230b11a8248ad9807b25038f22a87f6715bfc47cf11ea76c1b859a2da392aa4678bed2ac8621ee8285c9fb632593310ab287fb7681b8a7d4e3da23d5ed177fc171482a385319105c8570d24b420023e039045abe30dde8b22e0a22636fa09b4ca18c5e749f49774ca4cdb9ff0af05ccd3506b4835ee9a2e364308a5a96d19edd02ce75e8798f109df6c1a7b302c5f0e3d776a2f8609e678bce46edfa9c2dd87b629527b76ab0561721e1a3ef486e1dcd6f4925474716e67c829f768c8764c4baae0ada130052210c4baaf057d9bdbe0a1db9f008ea909415d4db6b248826c8bb33f7eeee70b87de436a1fb0b076c2e08da33bc3d7bb104748168f72157df2bd8f5474ebdcbf8240e6c2a23ee1d2e564a77df10a3687a96be4f6f62c036fa89e8e493969d58e2f06d5053a015622a3f53a8100b519c42d8507bd7e71ef39928c865cf87bbc88ab44734bf4bdc0356c9e3da446cd09296a18a537757b66ea72ab2165734a2c139c12ca731c5f7ab777b4af858510306bb166ff7654dffee0fb5778ed3e2716ff7e633e451e64d944dcb7791457bb59d9d360bb4d746f7ee2f8afdfd2dba602e36a30ef28c1291067050373363c33fdf8b69fce18e3016e3f0d205b3b60a3e55a8f02eafaad33039fa81039576eca7dca49eaaf03b7a5b98f4964b029f6b04393525669fac3ab76914613a92b68ab3cf38389b09bd05ea6d6b64e87b0e4233ef169587b0cddc109d990c29752d41dc8b82d24f6ddeeb45bc30cdca241c789fb8806e6e3e31950c7786c571b144454d2da0af3bccc2440eba3007bd85f4960e959a189e61b097ef77083a925669590e4c775d0fe8be7678d20239d18c9948fad1a08cfc0f7a47cf988bf4683f9cc62fce584302507843417fe2451bef434ef2375ecfab4d2e0e818a1195b5b04aa36d09c89b81e226065ef47cc60cd33bbc055227dfb3cd137920888edf91c4c958dd5cef130134daf5c2abd1501959318e3800f6beb4a0b60299335a75b2d210c1db66a8fbc22a09a2a112630e4d75b0b242f3389d051009ec24954f8f49999e2bb89c0a33367ce10a931917f1914892c94fb00059341ff6d14c6654dff42b6970792d6f3631312e6f7b67d152045ff8e4e8410b9ce1ac73ec965a601e9aa0a6d35175f8c98a690423471a606dae621d161b29f9f7c188b73af645b38d050000000000000000000000002ec37d9b90411cf3664d4304978843f167a2375c5b434a6ed0748733ab73edaf97b9a899869eed7fd873c131ad8a2504ca48bf70c797f287f8f2493e4678fe67c352288d40e29ef839ab1d086f83fd14999c39d50f9ef916a184acea572c8a810000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000097ccfe017552dad14bef07d65b651eedae88a62baf787475f0339232500873a6f26db3b44e35be90dac65bda2f74671bfcde1332f188fa9d0f0c43a83b5e270b08d7a22df69916e854278215952b1a494e12a7b0152b33c10a188a93142c707fbbd39ddd94eade57677e90d6db0220f50e46ca70631aae80b5c976408268fff10329468d9040779085eaa8ab1d831e391cf2d409bf56af36cd9954afb2e144ec9f032c5fbfbaf4f2a5c78a2f1933c12b59415c653338199f91f36a14ac1551c8d9d50b05a0a1e7a42f6a0b32e48067de3d4b7f71777be94fad29411fb429da042f44bfa068cba23d50e3c6133ca71b45d86a8b15cbd96e4ff59f1310750996380b96e1030afd6a1c49126aa800319b39ce9e9e2de9ae18c5d24cd4df621bb4d56b8ffa40031238faadf3b9f2d685c3afc4262773557d2b9ca4cf5e946a11952bb344b0877a031bcec4e7141c701da1dd8e51a935c7f6493acbf1406b7b22151f89ae8a9dbf5f0221c45dcd15ef60c03b6703208e42c789b3d21822392193d9680c5effe3f76729020aeb36e1a8f509733bc75f272ade11cdcf882550719272efc5cf2e813cf3982c80ba1feb4f4cbb545a82ba58da9f2600e825dbbe385c3895b7e8ad9df90b4dcda46ee713c38575b2aa554d14c91202eea38c74718a7e87086e972bc37356dcc61bb2f08e4524dad8f83372cdae59bcdcd039b5bea8e97ebd88bc0d7311c9d1e9be4861cff73586074c96b110ca261631a9a5de7499cc1d556d5cc87b4c843f881970373fb487b527b4f0c8775cdc5284479332ec69b9298284eecaa83dc36259ba6f5dda35081c08c2743d6551086406237f02d73e255afe84c485f662ca258f1f412a8072e497b8fac7b907b40eff7b01ebb602142c89f149130b97de53c7aa6eefac12734a6480e86df1e270020f99829398792510065733aa810e37377664b29dd8cc0ef5595b5618fbbda062f4e31f869c8319a5d99f59d09595733e9cd351bf1689453ec15393fa490cce372becb77117b6d6a45978094959131860e0284ea07fb0a7629f608b718996090e2b13ede0ad6b8d798e18bf25e4195b7df67fad3cee0ed2d67668d19694c8bc6442abe30c312f75815a78ec233310f35b46ccf0eac4e9d39259e6390645d1127cb49931d447772c4ed1c30c8f9a07ddf0fc37c93f9d7a860c5cd47b4cb3dbefda496b86db18f4d73280a6e7f0d1add24b3a80645a8ab95eb1504b5ba1f6acc2c03d0642e932f9a4bfa0299142a3b8af23d6ea4bd80a0c1046ac8963be7b01d7ef3b95502d1c6b85c64274b61b1a78c54e6c762c7d8cf70b42047e4588bfe1c2dddb9baf8654d07b5f614315ef14eb2a3b7ef87bcccda53b31a25490998f090aee60dbb18ca11f2ccfab83a0bde32fbc8a28805afe6ecfc3b11bfbe2c450ac77be0557f29eadfb4de4a2235daa02ef4c928f6d10b0d4ae15e75cb821b04e2c39486304c3197333c4759b9a1d0a2a8d55fa66823c02eab5ccc9e2574dec1e665ef8dbd6e629955d53206b08672ff8ae093ab501a7a5750207962287b41d128cbe7a9b3e34518a477f07143a3b8a0dc6b243da4513f45e2b478d2eae773fb2c99b113e197bc25dfa89fb91b5379d5b95460704f0ee471375f5ef5171a76680f48e7eef26caaf2373d705ca5edafb84599a56e8282b91e78a31383db58e86c55cfee5beb41e71c159c992630f9ae359afdc5764e05fdcc1475bd6b19bfa29869105e7d8b56e6d76fe4a3f1f7ca24c55470126c9dbc58a189d8e7da65afb32fb8499a8486328b761fbf26e6620bcc76e4ee48eff6e1eeb93ebde5cfb60a7ba5682453a82441174467cb6372264932dcd74e07172552e08543483592d9931365fdcf0c09b7292229846bda1f36fa8474da19c399fdeeb5daf008abb84a0c3003961fe470791dd51395aab8c5029134097d141bc3ab0fe61aaf38ca235941fec61ddb2963b783c890aaed4bcb8e150f177c2ab4ded6db84c9b65861394c9282e278b9a58e9b30eeb3dfb736e39d2eb2b0e34db6783f7de4e329ec1db17c36c45e8bb0f5be72ce69d84b57db2c1bfe4a5ee090ca0a6ff8555fb6aa36099d17dc069bfd2dfebfbe35e17dd0b9b4434208c1e6d93813f3ca360d0531452a7bc7d2c26b72e5d2915f0864a822f2ebbdf57b128312f7679177a7597c5d77c312ca9a23cdb9689e7fcc9bab518a96aada43c41f595c3f05cac31b11ae8a8036af22c3434e2a762506d6c9d59171c44019f8d6ed4ebaa538b3c008e5ae08918b5f74fd62b0de93eea530d633fbe83d153c8ac4cda512bb45dc3926656bb9fee4f382323423f253fdb08a7fccd7614c403883d56c9370df3c0895dd805bd6f77d8f9c1176160f29856e25f24e2d0720e1c43847feece4ca3feeb606908820bdc57ee44edb8bd4eab6f716d08", "53", 0, -2001251959, 1537743641, "8b437a7d05b25200e3eea8c3e81f8820fb28519c7fe0caa80597c951e2faeb4c"], + ["989ad70004472389f678e573e3565c32db111e238c5acc604066c788ff7dcb455b9c1441d702000000026365ffffffffd9cb3d4dc8c98052127644376000ba418ea862dae6b4ee629cb40813406c0fd703000000096353636a0051656300ffffffff5dd7d6d4144e0d3f61ee0933ef42431df9e642048612518957235fd5c6c302c20300000003516563ffffffff2eb38db866ee8d12af41e4439da531cd93ee6ad4d8e5045204186b41c924871103000000008c66b4760134b8d6020000000005516a53526300000000025285660000000000000000000000000084ab3fd39e171d3bd3583b83c7845e94bc50cdcf83fb2fe5760ee3938342151155fffb8f787bfbebaa20a5fed1980841d5ef1e27a930195cedb676b7f5df9a559046b62328b3017496797de0f292d8d880678b9b9244e39bf0b561df5cf10eba00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b32076df7c272cc85b0b90a0dcf907c2410826ce7d83e1ee9d6f174581b03f9f9bf921e7c73630c8a7195d0eecfcdbc57103bcaa1db369db7150c350c4bc3b512c92cacd878cdc12ebc4ccfeaa79d0c724e76a3a6afb3dcab810d7309b42c8ae674110f8c34677ea1067f5ae89c2b3946d1a7746614ca30e6e095064437bdea4032f273320d374a46577f3293f471d66188e047415cbed35e185a2a7f8dfc1f4f10222428e0191daa7cf5a1f7951f83b73326d8df01b7504d7c5d9f53c23278ad5b80a037a7993f1e546afa0b2d3ac75619c746bf1e0288315ae7c314b94a8f15b12954d8226319a725b1cb8d2c6a0814d61c42069b9038d45d3a14563dc60e97272ce020b7087e4532284ebdc4fec333f936077ab76e1be1bb7cc4a3151e172ad42b056030b10b19f9ee8262a2f68efaab8f7a7a19b2a079484f47ec21553767d6e4ecdb3020c542be47bc8bbf07aee35c4442fe585ba64f6047a7b40fe84ab174895bcbcff02194986c7317cd568593c20d8981cad8b0d05dbdabe15d6cffc7197e1e96f425c031304a80dcfbcd750b71fd0b7cbcc18b4bcd91d040bcfb52f3bc1479c9e5d43a9c74e6f19e1ed38a2dfc64585bd2ee0b0084c515e766907af0f708ef101c74b6c827387156e4f051d0f9fd9417bc71aaa05e52e2cbbdd2e5497483dbe9ede240c89595face58297a851683c5d6f13431d2e01f9f3e8a63784d0f6e0132b39a6a48a8a54639ed56c9b73b49f09433a89a80183f3069a2d1f50c2afecaaeeaa21af8390f19c2e78732a5acf253678d64681f0fa5f3b42a364aa2222944a89bc5edbab5d3e4409c0707bfd992a978108cfea0d5b49a8753f44960269580ccb04f2fdfec373dc99bca95ce3e460b5f34b2674de19392bbcc05de75f835b2c674bccacd56ebe78586b10ba1bc178f4f3ce2cfeec394d1781b1ab86bd8673903186296de7d67cced6ef3845a87b75bdca5d703fb39d7d804efed91ee2594e2209f7fe020c4c29a22e472abeba0f74e79b3e89d77f30a0901d57513dcb8aac4eda8f8818345ec4cafca2183159ad6bee19d190240d7e2b9f6ae5a4ec6964a33aad74d68cf41d17bcab816f3cc8f0a54dc25809de3fa99f184e9123ac4564f4bcacf7e0e74569d6ac756b63d21fa1c7616a06f54ab52c8d5a7cf2e5e503aa03781156c6b898061dc366aa564dee5da8336758e518a82d3948075a657ebaf2aa9366e696f138c5a067e954a40a8c62b589d9e9a337b67fffa2a08d146cd03f07ce1b103da8b2f0157ce3dd6b9f450943d9840020ebddce1c60a6eb966c21f09924536686387c9bbc2d4c7ca498901fad7f67eb6409a9e9213a669fe45212dc62709246c343b752287a41da06a37716c9615417eccdc3a6a272b15c32627a3bc22b4481b38fa8c96ec82fd8c14672b48c98901cbfd0ed02e970d16bc5288182ee1935439ed392e15ed340c81d55e3473580702da0d04af65650a48bf84bc01a20549353c06ba81a958a8bfeeae4824d4e0b93a7d4ba4c07dc3ae3077c01ac3a19b96d25b6d0343c51929c9799a7387f89393f863b331ae921916541d4253d8a9da36d5fd7d18ee25a03f97d41ff221fc3495e9e8c2cbd0d2e4f0ff4e1efecda9817c9c8c19d6fed0425f4c9be5d325235d642fc25d48de21e4fb564110413ed1010a5e65c7126ae5265c2a5d4af98148371a80e820dc6c567d7142a3808371b547cedecc2c0f44294e0a1c7a2406f1cfcff327ce4177d2907478a88c92c595473cf56b70573a12291ee7fb4616f8f831e4f6140316c430e57520b9c5545702005e4c4260d463aaedbee1c0b6b834b3d58bd1b8ce51e0c1ce6b633086e160869f5a0be1e79a1e15f68796f1ddade729ebc09ad8f4b9b032092e664633b934ee7bda90bd6e635f2c29ca4290f9e7637bea3f0a263dc869b371308684af3c585510f78102324caed97c0fdd3bc6d6f2bfe707bc6704d44b1d8b8c60ac31e936918e80a9b23b2447fea0aa900dbabc2e99c609c1e1ae2ddbe3573794d261104d3067bb3dadeba08b2a7ff4dd43165ed57c2cd69614787c79f5707ffef9dd6eca22f85a5c81d000a18fdc010961122658915ce0220977418bdcfc60fbd36704e95a1dc18eba6f4e0a78dc28b6669614f25358b128791b4d3f6011d82d9d1262affc4f60ea537bff72907fc487881ece10a6287bad85f761f249cc03e10f655c48e4ecbb21ee84581fbe3af3a82714fd77ed360bc2d62f4ed67fd78ed97d648446e7d6d9183b38e4e00785351beace0bcb2987af68f90ca4b7ad012152e03000000000000000000000000ef13c02cb60480ed279532f3f83cb16db08eb716eb1b2b95fcfc76ffd92128e7adf4c2657b0a6606a4e13a86e4e4c274ec2335d5bc0c0df37adbd242b95fac56a1cf8996b14e9f64066e4419fc783f35a49b7ae874464e9cb3b49f891543548500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070bb2fcdcd7153c5f229f05a27045316a4b255b718f23cf7f89e523478c401583ef042ae26384d4e98a0ef9c1268962f49cda7738c14ab5a5622a3999cfad8e96694d4cca4f64d0d2693055c806eecd08dd9ef8c764e2e56bbf2c0dde7ab2441e3fa9a19e6c16dfc3d0be94a83f95b9c27ef38a3cf07b6fd1919419e32bd0c102185fd3985677cb0df9f3c201b41120f787882fa5d8a09745b7b9904f09e00f77021649e315e5209c28b3defb9a7728adc5683755e7cfa76f19a54d70156559f4420a0694c07f0caf372de3515aef904c728b6e5a6d953989f5f7bd262a7f8baab1243c879777f940e18c71cb68280cfd8ef01a86676db405eb47dd379b7bdcbd96460304a406c5ac94a2b492d6f7756f2c0ee2d9a2272ef4cd1c8b3a93892e749f701102225d0ad8f58ef8d637a648c83b85a58db4c270a1dbc4d34ca71a7cc2476bfb160321115ea33fcac78492758b7bb63de0c30abb27fa3234e95ebc57787e6e39ada8032edc342eb7638349f9e7a637d55d5841b53d4c2bd250b1453c179416e39b253a0313c13b56c4ef3ccba634d7d85bd875a60c084c2139e3609e9ddc65ea197d7bcc056d33d7e8dcf92be5c1a54ad8f81082bb6cf3cacf3465ea1462a798f3d6f72120834bbefc9fb31341998ba9d3789ca3ad40b1ed33791efdadb5ed3eb6b19aa9afefb36a1b82d4b0b35074841840f785119594f3c0284c6c6662c9f88da8d66e5850bee26592533ef460679358625a01914a76e64e6c3c1f79343b89a2b88caa6d4dde2fd3f29324ff0c43e11be63804d07031453a6422294c1e845453a81990e5e2d6683b9b3d986949cee143dc8fbd23746de5597cdc7b5d1f2c8b756266b62e28c2811b57de03b5e55db85a8b3a090beb73e51d623f625c1c8a3104c8b9bf53e2544d955439491dd7727e014a684c205f9b8cc1d584792cf89305e18fee9f1405e9253d88cf20de32f08c2d27218196a3d6f6412350652a68ae05ffcc57d7f30d894a179673ce5918858481053242208c1b9302df99c30a598c2654d55307a5a9ef404388a4628a77e4825c5ab5a105db2c93ab711f1c2755e1a85c7878c1a1da3c71fb2fdecf75e56c0b8af81901b47a179db82264b1315ed9f424a7be641e8ec13fe004d2699826e5b12a4876a135a0395323996cf669f2f57db14fe43ca57d8f5e19671c8d4dfe80ee99f92c0f196d443b96722e0a1517e28c944053121cb6201155b548eb10940fdaa19be96e42e8c9a4d503d102a1810b9562c051fc48dd475f2e812512d8d5e9eb75d72a7beebc716fdd95488a1409f9496c253347d9fc192c87155e74df679e02d5bf1c4cbfad64260609baf23109ff251f005aab5674b73f1b0958bf127863be9795faa6d9016c83a6b166b314c4dd5047a9d2416f969e9e6462d4a8c240635de6e553eb32f92b71f69a1ac29cf2b219207db2113798eded4c860f11638b07de86ccad70e5acb0bc1656a7820d3403eed61504b00e9b03e836fbe6794b49f21cb3d5ef702312e420ac141f691523384d4b76a016b53d460848dc921ee19c095817c89ff6a20061161574289c48b5b3a5a60caedf723224c548aa902a2d4c5dcdc38dd60a1b96ead2b2b43d739932172c771bc4e819a04afffc5c7d44d1cfa881357b628400d28e8bac70f0b2050d8acac0c171cf20fa64111b2769b602c13ce41512f001917479e0ba40d4d6c155389b92b4b3ecef9268ac4b4df68a0f5741708863daabb03af0a9488aea049213a7f2770c5317b0df257a3a5041532d6ea05d79b81e0f82f07d78b9e4b1af526219251ce3af9350fd85c621fa8764bd176f964f98b79992753f93037a367134a6208444019a7f445df0fc1ddb447b5d857aa5ec4153f0d75886539905d48b8458fbae112ba13d0f3f2163b7e800d1df37f6d9005e54e4e0c4064b1ab6ac27e03c6295c7ab7dd03884197c397698d091b26f1e13a91d43cfc6cabbc7c02e384e7713a7b6b5845c5875ad7527ec8e4f8a160cc8a7b8fc2e7eb57620e7e46f36261375f3a76e05af30d14e6dbf4e687bedf1dff26df9aaacd8874d271cf17f1b91d42797bb4eb591138c7fa7cfa21c40a4deebc3da5319db17960fdf2ce5e36044e23aaf6ec91692f00a0abd9a75553276d13401594d73b6ac2d948a100e374705dd15eb913807e2fc12150faba2dc4d6abe9e9cfa2738c276c2be37a67836adcb59b79260004b3a43daf1a26b367b4af3cf337d42702df6e1d201df728e1705dda120215a2c82d902d82e55c0b008f37605b45c81b280ad3172029bbb729e3ba22850fbded05a91d3785593eae9eb1e10a09afad04c4e2b5d6d967cb6959e9a33cfd0e19ae9e2329f9b86fbb793425daf489a914ee288627905d9d17963cfe600a7aa887a341e34187040121d7fac87f3885be77ff46b9fe809", "5152650000", 0, 1986275034, 1537743641, "35d4149f943c019016f830a91166d63342e127a2818979d6f5d937b24374b383"], + ["030000807082c40303dacb7ffeaca57f3dec35dc35977f8010847df4f27e852a751cc57c9870ac1a410200000003006a65ffffffff4c52db48f959e229cf5364317000d1ecfd5c10dd4ef171da6ac22e039144c3a501000000085263516a536a5163f1159602bc958545e1250cc94a2221a5321fbfad43f693026329eea90e6eb6707865aef603000000096aac5163526a516a52a816abf6010db5520500000000096a6a6a6a6a5153ac6300000000dae09fd2010000000000000000a8a7b3030000000024d839ad957e938c70711ffa299a141d04c89502a5fc01e2ea84933aa2fedf911c9619f19e8e5c721121cc1d4242c6c71aa9c4c54324a7ad3ec2ed7ff1d46cdc656089bcb1bfb60501aa6db1f64d2fcc30d75523f1d42b2b18aa684d6cbebf88000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006a563d4b75b5b130a911a30dd7b4ae49cf4389bb53c8b613f03c7c9dfc95ffe1f9fe9eab3cbc36d9c3c97ab6f4f402c6894ba19bd9f618e351b3abd523422639795de8cae74dba4a78e2f81ca1306979c61e8e98a7a791f85b1edf4633aff4fc9a93a6054c6db3c7d3bc59b8bdbe769051bcab5019ed93a4deaca2d21319989c0325444f6baa40af160ac001d48616c4b00fe1c21ed1c90503fd199c37dba841b0032961c1b33bc1bc0b6528b8eca41baae2fdea1e0aec38a69b81963276920299290a088132f40e7c228fef77f7e781d0100c3a72783b5876d3325ee9747f0103f50272cbfac0e9861bcd98b5a9beddb5b2f3346a454c1494c1d420ccaa02d679a32a021e8e1bd1ab0cab1c7adcdc86bfc84c67d45c705134b3cfdf2cb99812e9087bf70313c8ecd2107ef43340c4a6d86d36d72f67f2b54098917904d28aee96295b07b103231cbe22cdf933db65a5099314e398df9a5976c7631e0c3318a3cb0de9653828020fbc5f2b3ee5cbb24addd6a86a8fcfd1533c7c81c1a1e6ded11b3b2299acda150213e629cc374878018b620157296dcaf5fe2dc9ba4110c78efbf6d05599769c857e5402c3f0c74a5e69c3172c0a89bc9f80295d76d9a30b2a9ab42b44e86d36877d97070edf048e8a98b51b22442caa013cdc715a0620f32e7644c55fd6457063168d3deb7c9d516346561d9f074ba908f2b5d6fd733df0174ec2446fe6f582d0e7630c1bd3d3b4f68689bd83cdd7209354339db8b4ba78009fbc05376039ac62cca978eeeca4d4c067439b4a10600ec959af299a3ea0bae8b19ffcd4c67737ebfbb7eb743d75948e754f22f324084cd504fb9e11f2c21ca9edb16fa2b1deafae98c631abaacb79ca94e115c72e7c6c56ce74dbf68ad79a79ce4c471f97420684b64f510c0cf229ef2932a68014f2c97f5a0c4c230bcd97e2ef308ea819c21173e0e52f450fb0db801e914e22c3db0e47111ceb3dc02e23d370586aa3e0df8e33346d3b34e661518791056e2d50b1d7d03ae1544bc794afe255e15fa689adc148f4d87184814aea9bb27945a64b98801fd6eb0a4b4468ffba1826e5f13f0ee20267f3127440e155f5e888806069a142edbca0cfb71c97d9f2dc40983e67dc1198c4646c0f7bfb081451133031b8e6fb52253be43ed0a72652d2a255d89617f8ea7a362887ba9682b02fb974c61d70477054cb3c569093daa5847d1f63d186ff62b4bddc6c240af4577dd0efcadd9dc608498a8865bfa288b5e0d75f0304eb5d638fe17efe9935947cd427358dc5eed02d54c1fcafabb3ba46b8202216c2bbdef87e338e457ecba9a95780b7c636ef34c34dfc044460bfabc53153ab4f8bb930e22208ffa7687b7255a225821e5663bfbef2f2386295cf19cd7687b8b712517755e639599acf51230655a8ca2ce572f252cfb8c1433ef2f98e808b3bb24a370cf6cd5b71625cf46a908102d5f6f961a308effe206df74ad13d931f3d515f620743a5699e2f87308e53c0ebaabc0a82e658e9d71c8c373fc27a48406dc5a4a21cfd047624af730f5613cbf9504001ef00ac9e6817ea94326a002cef281b97c2b69bc56825113e8ded9de577970744e51871e87557dd24ade8beba867dd7a9412212f5bcc8de5046d9e0306cd0530187c50af9c8049d40a1dd9aed9cd9469884cc1b89f879dad359326dbdf82852bb4dde274c0d384d1989d1cf46f1040bcdeda9adb1484c5099d37d38fabc48cb4a63b9fc3c8edbc31b5a35c9551a827cb0a4b28b0bb8c360da7e57f1bc4fae8c81c7a4812862d740874eeec34aad4cac03b471aaeb69a345aecf9671387a78ba981d02a8f97260c607f6ecd9c87068ddc2c393dd3d2f7c7411545c78b17ffe02aa347c878673dd1b4749c0ff17d98644afb1e718df43254091378ba6d5473dd52a4f9a0ec69dd25099c6cef6ebe29eaa515996deb7df94c8df953ccbaafbe2717ae6bfdcbcb4e79fb2ab384ed57b3da33aea6a1f06a6d5331fd21a1e6e3a3f094396413cc456d58405c03a40cb5b36d96e62be6d6e3b3ab24ef95df02450a16b4a00c17d3976e40913f225c43903c536fb073903f649e2fb4b53a5bb3eeef9947c3ea6c58cb8edeaf2bd22853ed3c53e1540649804f0bc53dd47db606278b56986b45a3a772a6d79aed5196a0280b6d25fc47e427058b48fd63514f38657fa741a05f2ff0c0666225a471322cda24306b6025e2d458ba02aefbb07470af51435bda3df03d8f10b5793f9ef31be9b6464c58a349d2f49594aa80e968db2b9e3c1383a320d23c36507076fef6e3d3ca6f3958a7c18c41ea7c66aeb789832657d67526997085ae296d79474d42b43a82f66f51ef471c83db028bde2f7d9459d326355a18676f41afee92c3f323565689c49334c10d4b2d15b88e172c72902ea961b85c796fd6c09", "5353006a6a63", 0, 1406849082, 0, "b3d90e7c15582d6759eb6abdd01194b82df2b40c5008d7c41f4d8ac2d85afe6c"], + ["26f5273003c4df62a20fe9545dc36fd62a6378c34094b6732f53afcec0566dc1b6d37c270a0300000000ffffffff8842b9e1197a3d345c39b57a72de213468fb3e81d7eec070fccec90624aafeae0200000007520063525165530942931430f85351e7e314e6e33bc1096ee532c46b6a341ef03be26b8355a5fa5bfea9c302000000060051ac535252ffffffff0189daed020000000002656300000000020000000000000000638a2500000000002c3c228cd6903eb7eca6fa3c979f380c9ce1af4e2c94304f5ec7ae5e0c74296b1cab3117f23a69c932bdc83478d8dae2727d7d56e0f507e6d2f746c7bc84e8fd1cbdc0069de123368573144b910b7ca7c7f58071eefdc4ed0f99704497ba4c99000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008ed7913bb15431bf102919dc49db7bfbc3108d4121c64784254a882955e05b9cb89f44ba89b61c538294863f9f2e7190407ad73bf1aeca8f2e01410f25f25afe504c7443967314490f6cbab0188032890ca0595c8aaf89410123848ac508095e4bbcb6f6f3a62b47e44534b5e754e189dd06a606082bf438a28c4719e3d054b1033009dd666a7e0b9561cb1b3b12e947a0d1514c55240948d2115abdbbf1243d400326280dfad22211c26bb3d7b1b231e514588dc984d846534cb67eee579580f1640b08ebd55316ddb040ca8326aaaadd08e87e5cb304ae2bfabc3fb50a41353211a38dc9a436b805d7c4d840e52681f27e1c86dbea8007b174cc6fa2678b4e220a880311620561ca06b287f71a408f33edb7deccf4ea38bebe08ea7fc67212f87504830206019d59f4e0cc15d86bc8b00f2fb0688f1a414bc49e52d457cb6232b7dce20f031a8013431bda0330a83398cfd2d8c010758d106d9f89d621af19f47c5c9a8708021ff14b0ad22ca1989c9f4fd5aa42ad3597a58b4c75d1b7cac65f3ad74ea070290217bc7b05d64accf86bf6590c5ad76ee34fbc6033c39e261d85fc2433df1245e42558350392ae6dc47732634b0635a2d4504ed7e68d7468855a3e87e9651309ee9f234e14d7798c692c70bd6cee108076a051a9ae49635a5a4418e42f19d9b6d310bc88bb4c01d3296b20b31e5e583b7a680415e39c86cc23a02b28e3873c83a3b5df93b377b2d4ae1c0c39ff437fa1eccd81488efd5be8b74129ba23aae82a634a298109ae442d8caf17c12659a65ce68ec609f52b453eef23deb8265dd745130094482093179e91eff75e765c431df3809cf1fb3a5005ce53f6f4283df3efd8172ba0399d1ae57b617705b9d93c898ad5768de8ee6a1360ab294eb00f93ac6324b76bd8708d2c651a3c1dd4709ecbe2bd87a74439d22fe7c3eb17791659b9c4d79e28ac6feed77151c0e2132579a0a545ac9ec95216a33e81299fc62b30c1fbae2fffaecbfe43b76ea00e007223e38883d5e9c9555806ef2c968950812e5ff2996731847cd77d99ab722226c4daf2a67c614ac08696158acbb87dd319485f050c93e82c2b074e11b5dc975d8b5b79fc0bff13061336b352568396d3ad862c977536c9c99ee7f5ef14ad216dfc07bd914f09cee9baa183f9253c4269d3d032b0b66b4d23cfaa2f10abdd2abc0b6753c9bb36f46894e725eb5cde00d33c78129b85cfebbb0337d27041160e7a6097d01adec31ca8882a1ec9d06d713485f6c0b133136afb9266d39fe937a516bdba14f7366abd89e35649bfe25c8ff83b7c0dab0e6b5e0665450df2dfca227bfeed5b1896614033d223339898f807cc042228883c218a5bfa6b5d0495fcb483f603c80b73867292682434913f9da1a6d4b9196f5c155bb7396e69f69dd74c785255af8c859299df24950b9aaf529e69143e3c51914c41813ca779b8b9ab993bb662b780e64e347b47ea224b58f9ecde41acc989478cd5226e3947ce5219bd681397b138bcda16a480de936fd971a2763884ad7f7ecb57d9f631f5cfa0cb1d40a491fc843a52a0b46019b5a3c182fc37d3e7753fa4d770edf30da31b7708f2b864fd461de06e45adb4766e327ecd72ba440eaf632a6ad30df6b0ec8a023707823a49e494c199986002d7878076a6616ff058788600f51379fde74b5ce049d5451c32a7b9034d9df2e2b1c5f1a5a6c9b15b94f9a4674fe6cdb415207c4fc406667098ab31802901025bfd192a8475fde8ee8f648ee30dbd20e50a2b6667d0db68e5534dd3f795ac6716683837b51ca8f5dc76efa7670a08e26ec0e424f02d115d3dfc7635f106dcb9d4e540953d3432e4ad71552d14c3ca381f542ec9b8390d79f18603b4642b56c254ce97258725e05c47e937011e8923d98437caf06f2fb79ce5f4f2b0d3fee24bc76270870ead9de16d6fb9c28f22325cb9eb9876c5813734532a0140223fff407fabfa8a982de4be902a975e0380016a6139b13f04a3f0551db177af4ac6a572fc9dbc69c9c88c343deceb110302df0adef6bffc121a96d27709631693ba6ecce59374bc5242ab841f35dd69ad1ab527cb41cc51ce90297cc356f6c154feb7589350607db8fa156a1ff2186427d80d01a21989fe68bc537886ec1d6cc55d718f291cb61cca6e7cb7318bd1ce14a57e12dd5c00988e43acbe049d36d647cd98570a86d15f3b4b3bddba49d052619a4a49697d31590a83932f37d40619f67617f3e02766eae1ed572fe33170f92d8dff832970a2724ad2a24c76bb4b0b33a1ee2c2d0100000000000000000000000068a7e3d724e562d131c25239de450461c5ce2dd5d84d97c08ab7b177eb140a5f2ee30e65dc2324dfcc86ff78813af3572ec4a0598512e46083aceabed34fd38afc73001ef98f4f0db491e87d6a973d35536b031b51bbc098cf9873b26ee89b15000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005200d5c40ebc6fd7829a53be81231eef958ae02c55c49623457519230a8d798ba8a624281d2e9ad8e9b124d78dd5fb2118e08ba85d163e0abae414f748a0a7355a80efcec4f466070d2102125e3ecc2a1f8253d6ff8636db8821e666ecabeecf8649fb0135684f7c869823b95e252cfc782d2c07e53937d4f4595e2b74be347a022dcff507da35c4787dc889b106c99ae7c9269df7ba8e0deef855ba16b686a8a7022cfc840eb081f377c9d2878f34a8842b66ca86c120b84cdfdf0c184d04b26a6a0b08a305ac9a174ab77a8f1eb0a2bd8c6de914804c827ec93e47b8e296594f246bd513998f0a9d9acc6c66bac829d302a2dd3d832b864006840f9b5e7cdf8cdd0103161f4a3ef079a873cdc3209a819d87174da851a5ae52c1ce9cde5013be0b86d3020b1fcb45954265b266b672da1eee17f4ae2acac0bd8960f927473a0ad0fb92f80221091afeaf7e784f9a205177bfcdc62ea27535a5ca7ef413487f80913c1a088e02188c86035b9511d5493aff5b8ffd397c8bf6a31ecc3cf5f0c8fcc3aa1784a3c003215493480b315c764a4a37d8f543009bf55551d9d4ee47955267fde2863c5642426a63c40c5255533d8e1c6b9b0664199de251c412d5a12cb147c2313e11e12c4e1c3544de2ca429cf223e5da5b2c9c09041698f8d745d09d7a665ffa7440dfc8a4960167942003c44378ea6d5c875facb80842aa052df1bf2a06efd61e89ebad4df4e005b3c97f66b623569fc5062f20b49c63d5ed75fa26e45201094e7f4c0d88abcc63b2e47b5f5c44c730618c07200b56f220878778834570710539696a0690682d1a4cb53678ce89101652d927ab37f8d1bba6abb0d4e6d7e2680f0fac8524c30e0ca71eff9b8e20ac4029b009418d3a920d74485b7b90ea7a1766d466bc69caa850301b936538fb9434ba1427d54a929179d2694161a1990693323a81be58bbba9b8894a91b93f2f7f23d246f5f333753c954e40fbeb07fde0f5c77a1c63ea51dac1e24fa8d1e8a3b67aba35315504df24f4d8b8025ccc0b5089be6f84ec21c8a4adaac0d9fb63dd21ff112116e8cdbc489bf306add8daea212252414088a53764f6ca5013614544a498d5348d96ec5f339867c38328c5362637cea3e2aa4b8c1d7c54a75935b666ceea0f810cb518b34bb25a3e73272c9f82e3e30500f39f3ab4e60adda60da93e196798ff4da52f76343920aca9e88bcd7a300fc012d944e7ae872d409d627b4d1f4b918f9d812c52fa438b43c6797e8fa3e52822ad24e4cb21eccf60389f95f10c52858565705086b7d91dca4099f78499dc9b72a30df205b53a0dccf155d5020c6f28c4e3aadfede2253f2469b07720bdc1e901564bd0bd572b3de7109979c2482c2459b555c4f2e1c5272e66c0b73177a760227b63be4d3388bece1df66ae82e73c46390adaebf89d96b8e6fce88d7674b1534aeb14f8a7ffdd3f57875278b121a9239709bc42d14646bf29228889fe6501e7f976d4f3da2f46cb57112ba7ad054314a77fa26b48931d6316896d7699ca47bdeedcf111767b8ce4197426d02c5219f2405f532fff8c418b8d7045cd7ae897654cfc51ee10d90f519ca4741b728c4f89822e9d064315afdfcdf529a7a731745e6f3ac6fd748a9192a823cb8b61a28867e3a47d0475f8cc9aeaf23e236af8631f16e13e0e74b7e58f53551f1a464d9d0a7f83864454d37b58a7c4847b16e1adbca2a2f70dce7435f7cb4ecbe809ea388cda85b124c944b3ea8102d32775f0c292ea8e60cae7b30963fd433a6b1a73a42267e38f7412368163a9c50c093e32809133f2ce2b0a97ec3c545e0951c5e29510a8fcc727ee36baf713ae27f96da6d5efb4d690b4abba29e523dada1b2513462ffb9bf019d3fa8b184d91e0586163e193f732b8d87688bd7f51588a361d35d887c7be52a6ecee2199e01f352e7e515b793949e501fdc1cb33d4e709ded22ab3357263a7024e0fe5d191ae8d960df15fd17f2cc4fd12ec5022ee494b2f952830364d6c19477378fdb8851c0b73e31cf7511c0384d3e669a11293ee6054cf302bff8949afa5696be41868e216d5abccaaca6fa8553f9c882d881c5b05860099f3a01ff44dd0576cdb951c5d435d70bf7fe3708dd6c74b83caeb92dc70a4e74cab0324ca3a3e5dbb05c58ddd6c1921576d26ec076a0550c30231e249846f297cd5c9417a8febb59e4b6d20ec5b0032c004d97313ddb99e3d480c0dbd6fd08783eefa013a65e5023d9041a200dd69abe45846f9cc51aec19e5c40a0f461ece531dfa0239dd40a16c4d2008175debc35a6620dfb0012c6b5efb4969fc095e1b628cbc22edb5e113152f88b375932c2da2a3b1402bcf8a473d21236edc506adcb3084e825d82fff03f95b4c4951b40a2e36476a243f8a6a04493c281794700ed1b31ffd4559806", "", 1, -1772345326, 0, "27a713da4657abe4f311abba06428e16c815e7a4a3154f8cec8a97185d65e31f"], + ["030000807082c403020c8282358b0cabd07ecaf74c2b9247151259a944bcb50cd8fd3fa1d88e29815c0000000008656a530053655165ffffffff7b0be56dcd3b6d61f265e7dc922f0b3eb33aa8b3c71608a82012c2eca4cee7e10100000003655300949683cb0125e1fc040000000008635251655152006300000000f031827d00", "630065", 1, -1189575931, 1537743641, "199c29e0874f89227674915e5d5c6f0318ab4d20b50d2ce73d4c88f846873061"], + ["030000807082c403034ea9803d476596e5b896ad367b958d1b60385cefb92650903e3f71401e3ca8bc0100000001631a72a24783da39abf88d745c839e77f374fe8088843af2cd4b2701c945b6ebacb6e706b20200000009acac526a0000ac6a00ffffffff7dc90ff4a842a9841503e207ccd28b61c43cb7a2124fa6aa5a27981e1b7268ef02000000096a635253636a516a53ffffffff04e4a077020000000009636aac5353535252ac8c50230300000000085265005251ac526a0136fa040000000006ac6a6a655351118c1e050000000009acacac6a630000ac53000000000000000001000000000000000064054d0000000000ecdd98c16b5ce8786513bc6f8bdf15faef041786b84391a9e172547a90d182a8811171359767df0ac576425a5c94a758349cc5619b51337f1742799e3140960f0bc8e1ea05ef440c6501aa0b1c6afeaef046c3c17d6423c4b47423f92362d285000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b8bdbeeb0067095f7cb61d1c561b8770114f3e4cb6c89681a96abe7f7e935218efbb9665eea65f85db2606d2bd849bbbbfd7afaf3eb20d95130a6b478d9d1c3781ed049fdbcf482fcf6de18387d324a390406b00f347cdce9e133270626dac06c94c37211e0e80922d3f17414291f0aad341352c79fcb727d75c108a86c29720313df485d4509d5b1632871dbaeef87ee956d59c40fec0283beb51b9c7bba9ee50313c1000c78609407e6ee18f40e4a4cbb8837c69926a6f249a2b01de46adec6230b06f82d222475da5aa3a958b17b36eb1b8860e940eae9914fd200284215e5fab454f005241264fc8fd63e13dc063456d103df4fb24040ea85c79df017b8be6e2c02259030267e8b660ea7ea4b7554ab4fe5d56869b7148f7f825d8cba5e3b3fad7e02018c9f410dab67abc1492a17566b77081fd2fc9a470c5a0ea1b91beb70df5cc1032771582c2c412299a2073a765f9f2699b9e29f32425d18fc7d2b41c6c4d1f9de0212c5e01dfcaa3a1dafaa7963f9a5d527918fc46075173162ee23bb8ede1ff3d403262e88373025a93541cdaa39f04293cf52a9807d990b259c74d0fd35e556d08bb39311cd527075e488a48045fd43313dc0ab6babf42697ed14d2fbfc8004f373bd99b3352fe39aa742b69d258d75e9c818ce8219608380fab774b46ea3456b17e8dc8be0d505b2a4cddc75c6544174630274a09aa1734731689f50c414201cef911fe0ae6d23920f169993114485de28ebfc96c421e3ba494e689ce5ed43689e76752d72ef6d819e5e5673ec70756c21f43b5c23bebf5b68ebefd96c26ea6772dc704dd26b4025367602d32fb3869bc46a96332823f4a6883974aa04912fc57110a9dbb9622a198d5459fb647ff84845b82c4d0586604b69c32ff19b3dc0baa0a77838177c7cbce02822220326e4276b23fee77a051d5ee3d72d50a2e341d0b24299081cde879ed576a1f428fc0599cba414f1463ffb74fa7f03996a327c9be3f3c5600ef7a6d65f217697c8b157bf401889a2f432d76143bd1e91cfde82cec9e28c29437987ae3aa31786e4870459420df2f6ae0dcfcb39e4d8715853c6cb1a7f45f7652db66b3c9cd44fa75c18434a239990a2d849bf9f4ccd9cb887441876c9d90d63130fce75f08210c4042b1e3e5e673fb4ddfaf8d7a685991ab0f0c4d3083fff557e5b2e1d9f3eb563ba0e080748e990671e32421494836155f1bf3c18cdef07dab667260b764efdfa453454a9b8bfc341e3ac154ad49b038e4d7cff2daf039df2de8d6a453d265cce449f2901079f3e450d820ff5b29870880eb3350bfba5f3f333810cf12aad5a413ab31ae969adf4c00574cbb53c83d6e0b1138a80150b5ecb8e84adc53ff5080808cdd62f443e9d829a21f637c0cbe7e25672c38a362bbc8f201a3ad6c19c6f572c74af0814d1c374e09cb9743865e717559dd887aeb7017f70621022757488bd04b42b3ccbddface176f68f7d3853d7cd8631884819144f9f2ef46e8e279c2ec85edb1c44d7c91452fb852352ef550bc024b6ccefe82b0dd46e279c83494c22faf32354fcc6239935ca87f4a3ab328bd39cbba562f52891d43fefeeb67d769097d12d6fa7f14b24e1a982e42521adc4158da959f50fe6a9056969e48c0b7778ce9c76df8a3d576558a3601745a84a86614a4c77ed027fae9bb42cb937c97e41acf81667dbfd3d767c791170217916aa7a6027d8495ad5ce344ed843973c103a4b315f0d87e1bf240fa657b247f2fa8d53dd9491b8fffd2338a0967216de4f353117d79e6704923588af932fe02151070264f80f9b3b5fcd042d313fe0a51e010a793e96c29ebf80bdc7f17bd12721e1846d7e857ae481a36bdec29796984b30c64cbf88d4fa61d023276d02a9a060dc8380f7c4cb1b645fd4267b967361cecd7965c9b16f44f9cfe0fad7fcc498fc7fbe03515ed2e42921f71beb7f00a0a443d725c93fc6523ea69ad6bbf12176097e97a16b11ab3cae56a3c38bf763ec2b4bbced38a1b2f791bb6aada495e687d26214bd3ce8d0178e6563dccba6448a22f5608ee12289c799c0da22a7ffc2fff999fba3b8fd1618b4ff34834aba0ec25f6e3b9682e9e0a9de1fa88866ff0d330fc9e9baf1770e6e196924b0774efd9a5a17d031dae9996a060e57a6662c94a15322d4625243e2ef94d2b3975a6a9727b6bb9c14226e14e568245582e9dccc38591a6145e6780dd84fb74c2dfb57ee599d19c5d5dee9340f64f3ef1e756684e4eca41febc9190501b0a247c94bbdcb3a0a0fd3343b4a2258165846ea65fde12c55f25fb41373c21585f4f354e315f43bba44a28b2219cc779e5bdd8f30adc1c801d41c52e65d422010e21372183a0643f1556ceee98dd1a75a73a702079d9e85529eab4f74f2561bc6d76b5414adf2c865864e9da8c029603", "ac63ac6aacacac52", 2, -1660238594, 0, "26ec35daf158840e999ba5cd48517f7d2855df78755129e5c164ed6835acfc44"], + ["030000807082c40304fd67490f9bc15057e30c9341536e61f420470686adb06c2ea9688c28599f36300200000002525229b9a4de68475da65fefe5701580c85b8cedb18a0467a458c48932a0dd9b215181759b3a030000000200ac5bcba627a4909e78aac06d048f9aa14e203849e2de8714d7319b744685e15b69dbbca9c40100000003526565c69bb2b268b3aed686acd5c5fe8a0df3aa4c2d9a832b2bb9f29b338df0affa2143e9af4b0100000008ac5100ac0051acac92290017039f3e9004000000000097fa86020000000004006a656357929b010000000007516a6363536553134048c40000000000", "635352525153", 3, 187069378, 1537743641, "7f9c9083699624164cef58bdd6fd0dfa68855b50551ca112dd14b493c3952449"], + ["39d67c6b02c8915b8806bc625b23005284deecde3c4a7d63719a7e7bcb2f9e4f3cbcf537040300000000e2e2df6d283c4201b5f01813d762b16b74c24b24ec79fc55c68b2aee3d17ba8720595fba030000000151f1e6c7a704e0deaa0300000000066552ac5352aca3060a03000000000752520000ac6a5244379e0400000000056aac630065da514c0300000000066500ac52ac510000000001d78da70000000000000000000000000098a4a0b1f1478bfa9a12c2fcf8dcd13f19278e69b831cf889a63177344272798e4bcc6b6aa320d8af0880a236532dc837e295b4f81c52836c5859e4bb07e0b836e3ab11e04806484868f598c793b962b6db13c6d678cc0ca67c54f380c0d6a060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044b162b8084a5de037362cf676bf6db743111edea42536246f1e402b821112028cc8e6848a7725bebbfc19cfec412ca77a82deb2e6876af08888faa949955e56c24a16af1c4610232387d32e5eb67bdecea9d8bade4c711e951f8cd7345cb6fa9b98cb5930aec1200a419cd74f25753b1336224a61e0b413fae45d8f5d19c932021b785c35609ce37599b0cd5a0241adcf9ab889fe51ca278072809d8bcc6a99b1031d0a7226592ca81f7ac4018bcdbe82bbba717ea89c555d038e0397158d70936c0b034254ad35f66d6f81d2dfd44f41965deac5d2d9a1ee24226e9d1d9ef31f901d24006a24782cdbf87ff250c2834042675e1e25c36338af100db07ee254b7f9a5030390087530b0991268f144c9f26a09601770ef18d17972056ae14df5d4ffb706022a469cb8d646e2fee11a70c42daead68f5540a8f31234da8f0e69714740f531a0227c26a430a50ad178e67587edd876624605f89eccd4d3b563f8dc425f52eb625021f86091f4985d8e9aa98c2abc0279aea4fd6166b49020430f8c411860b3fff1d0300fc60dd73f6723f34080d49a3f8c555f1537071e7f7636e1894c64e66da901f59344b5f9948d8cd80362d33273436138b6e0ff5e4a17b4e41a4a9b1f3b44dbf1e9ccd82139d29fd18ee733774f990412269ddfa1d5d06a36a9abdbbc3ee59b978a634946646e6713513e66af8fbe269603b4d79bf946a587a6297d952692e5bde2b3f2dbced555e8753d7b9c1c44f573a5fdb25667beda5d43ccb82b99050c6a3e040ab23998ad11e56d8c0430434078c76f45d7e08522231932acd670843df288fba1fd18861f4d419545f28e2a738c0ab84c0da80dbb3607966c5e8d72f436b5584ec42383655b969d1553cc6ae37cde36bbb244c2b81674f24d89ec08758ed7734071c9b160ea57a3cfd3838ce5a5c03be508bd13dadcfecff24fbfe9ea07484a1ed4aa5c7aea4ba96121b73a88aad0f977b3c8ed22f5370fdd012ec745fc3ec3e967af76a11283fe03cf3ea0dd418f3543ad33b2862d59250d2b93b68544aa92b148bbd1297bb518dba5f4f4834f9c8b8ec976c12b7204f52f9ba876c5648cbf99ece82c7ca3f48ae8e1bee2b5c526b3863ba8447905f4983536ba2fe80a0a2a2fe9612a0a601047abfe524c1a0bc35419eafcee243e7ad44af494ffab7ee635581254a0b7a3306dd31674b4249d9fba3f2e06ff029c1e7196797b2d5f931b878b0e4c7516dc25fc2951bf1f2fdcbd9e6b93cf6a772b8ebbd4f4895381497cef970c014ba617e4ae813a79422f5cc33df0b5922baf41ed399c57e240c7a404f7c6963e86a73213f10d01eb7c5f14a03e5f8d2ec67ddbdfcf85ce1fa492640aea12c5d25a905e19f1ae6176b44c2363da265c1e6398633b389ed6b9504fd8b18d6f52f6b82c0feafd90888f2c1572f4eed51eb8d3487c32882cec75f17424125f67fad72b9ca070f7e3e3477c1e91f7e709fb60ced2040d9afa68188179eee68040353f21fedd4301359dd3cf3eddcbacf6886b830eda3ab58c8ae88481d6ee42a42244e17542e5109392edfa3938673299c23fb7524cd1f397a69b5715df8bbb59facbb593b1ff262319f5c48a8abfd16bd5420c698fb4df43909cd683384f3f42b125bc927dafd758b4264cc56ac05043776f508c6c27132ef2a1f71e5f793d7e7a72fea623be52d1a9e31d90c0bb625ca006cc7679a800008807150c3da5ea2b5125b7627194c64c0cb9337e0577c018a7d9eaeebdbf78000367ce6508b314f3ac002049cefe7a27647c6395fc3651554e625f21dab8aedc253e68222ce78fd15adc264d90e98a5f386737ece0082e498b1c725a47e7b6f794024a08dba59e4c98a691ebb2009a8ee6cbb63f69cfa492d12aa1b2200a1f20b9d757c297befabc0713984f395f42543eb70f2f75f493c05e17ee35214a5becfef58af2f75c1b996a94341d46f8e6d14bd815296691a64ec60e6fcdbf716206298ba26b813b26a8d35c37ee4c6665174e59de72a8d713c0ea49d9f1e5db875a982a3f3f12370922d8b66388102b5b2d57f05e85406501a52ec32dacd85821f86248545c961119259d9cf4ebe81c08ceee5218047f55f9ded51985848b07047e8f9a7081d259de556c20809fe5cc1ced440c8c495543168de6b4af4d9089df822d87ff00bc03bcf6203675b04202f670707d0b4e0d0bb26059d745e480a67ce9648c7b256d8c3abd0a1304a1910e0dc555610c235638c54a3c7b813381d1ebb037264c9f5f406c39afe7277f1b63aa9ed5f442f60ab7bc6fe34f5eecfc20816240c4b57cadb7f36c1b7aee15740e79846ee8d621e750cbd3dae1ee363ce22806a24e4fd00e129df43fc50ab6d610a7d8658c2d649775de84281a1951bf678f8cd2dd28b816b619cec90e4b3afa3e6e7aaca2bb9e21909", "0052", 0, -224993414, 1537743641, "8ee46474b30f7109d9536c7bf9786ef9c646332b743cc76360ad5a2e2aebedfb"], + ["030000807082c4030325e07f51b47bd66a93b762d9b161c75a6823e589ca2c4cf3e531c74eb77e9e1b020000000563006a0065ffffffff5392fc4b53ab8a17a1f204321136335dd9e91f8a54e1c4aca7ed8572398d25320200000002525193344a03e63fe881a764d42ab6097e02cc0eb11a012f982e3df38847663a1cd84956aceb00000000002b35ac1101c82d53040000000006536a00636553cd32f07e0000000000", "6a51525265", 0, 640965724, 1537743641, "4ad147d102728b6b7d9b0197011da01f7dadf6435d8d92c46903297f06337b04"], + ["c0d9fe6c01b31668262123fd4f68eba62c501c1c221bc52b32579040289f4390abc90f1d880200000003515365ffffffff01cd1846020000000005ac51535100d40173a400", "", 0, -2094712411, 1537743641, "dcfd468e82b8476e916978d0bf169bb22adb1a03e401502cd8eb211c53b7592b"], + ["030000807082c4030210ff19f78e2cc5f130bec93124beb656ff89fcceef5f5f29945b4a44999403ef0100000009525363535200526365eb25d25f0b685cb18e22ee5fc2070334a4192b3429655a0eebcce99071c3eba8b5f90fa70100000003526565ffffffff0303d883030000000009006a00536a535152654e8a7b020000000001510c604703000000000663635253006a00000000f655867001c3431c010000000000000000000000004dfaa701c8d1ac2620cb48d72118a61279ea4a4c6c65603bcf05686c6fc4264aabed356e02ca5428ca36c46cbbd00efff0131f1c0ac8766bc8a4ce043906c82a92e2ea52a94cbf432fbbc673f2f7dc030ac94e0cc176099c8681350c03718c54000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004addbe76c1424df52b0d61ab5bed596559e85679b2f325558e3e3496f66b7e695d1a5c84f1b6b8679803b235f9027bd02920d5a201ad4fc6e5367968cb14a46c7d18e01d78d3982e8b666c79819179e30c03e2d8f35b030d118722aea844380c9af058c863a8c570200d05c1f236ccb5aa2a65b75627595104422b94c0a2a48f031657477cddcfad0ed14bdb5049ed04da299d3a3b60a394192c496110e3c07906020bf557e04b11784fce22eafeceece9008b65ca1db828ce2ad10e97a6b202b4a00b07b4e9b6baf1dfbe7b586d7795792b7de0f30c91fc885a967f81aace7bed03fefca264203f436268d65eb33714a79a6c30f542a692020a3573663eb968b2dbb6022b4de57cf998a8bfeccc32acc721dff47c8e728d478bbdf73b2085095c14eeb402099fc46619c48aa04d7e52031fe5382d62e2c4f213eff9b53ffac509b3f6b4ad0226916ffb8d270651d7ac72bde978c70871a28f95e84c601ba73e212f069f1b66020e29cfcd9bc69c1c5e8cb5663a2aeaeccbe5f8309ea112bf9a31e65f7bec6553032260500744f21b247aa5ff9852def940a3a067322b1e3967136f9bce4a495ec47b1951204bef311c333536cc2b3ea612dc67ff90b4d552c8e7f7f49888c6fbd7ddbd5edb75487ab016f1582c9473deae6942682ca560083cef0ee0dffd42458bb58b542618ac815edfe81fef39448f6a7103ae9203c4fe7ed11b17ed7f42d18619287efee5f386ee35e9af131da926327b2721b2c43020b961e80817797dc2d67e5691ce9c45b3ca2032dab93b968537e8910c8e528583a08cbcbf631d9c9c9a14a89be5085c6b89fc76d67519fc7436e96e47d6b6d33f27aa005ff41989aa59a11805b5268d542e6625fb1fd131319bc6d392ce57c1843b35203d9eb5d2aa25f335f3813431286443c7387940609dad6e7073caf7f92596b40267b4e6df713fabf729a5c74a4923888f6bcf122eed5881bf6834fa37fc1299b70fb4fc5c9640b356092b4176e324c01a0f2146f53149941ada05f6c7e07f3a068ebcf452fb5be80041771f92c655d4e61a974871ec2040c6c06ec8992a443aa196cfc74a64c78561455be327805e2075bb9753fe75cedb99af8f77258fb4445ed0451b3023553704ad4c0c5135a3f51f4b902d3dd48a05dd160395dfc9413da42783ad0ba605b293b1d93ee45459573f15f537e92eafeb85dfec59b086d11ab8333e49b9f83ba372193670dbfd808a703ca6cf94628ef14ea96132c783dae671a56ff07ebc1069e8ec094fb60ad79680c0d46b4c2dcf1421a9baa94908191c78b116d3a09598a54370749cc8fd1f462d8793108947a5bfb362be181605395ff68cbe2d56b8c47ec606c1d013faa9bc8a83607ef60be0f9e599a0f24582f6aa645537eda0df40e351966c5cb955d93c9fbcbcfac61fe06d93d1bb7e33ebb5643106e8cb85926ca473ede8bc6107294b4776d3f1772ee1022fdef84d967b6995c400408ba89ce1e0a544d07b5af047bbe1b5756cd12d28ed29958865e69b085dc50170337684e940e6522d6a1b0b6b1f77f1c6b848a6c048a365f01d81f933961319fd290b7b32b09556d74e5fa63472709812500857e8c62907cad2f6e262c3a4059f5ece842e29e933cf4a1c5eb49c91aa63ef719bf15f5681d42e453eb20005f8ca5034215783e1e9593c1932071ac2a062efd7d332762c90e327d18edd463aa45cd20d832899283d165d3f3e522814a23ea6df31a0309ac2a78f504be50536911fe622b73e9c7ef5fd60a1b76d9a9d426bb87d3549ead9550837713dba7df62a5bbdcf8f8bf61ae5b6f9b3d22a6022f57fe670dd937c1afa7abca2826f35fd98c24829023604a11894d1ffa085ec0e25ca1aa4292ccb523d8cf817f35f73b27220fc73cbced41cac9c2af9cce464f62fdae57054017826304851d4d06bea084c6ad848b88849c725e150fff7273ec7ba14901ff67cb432d6b34c0cb3e3e6d87c07e16eb7863003b6820fa84d8fd179d1cb0315c3619c689854fc20faf19b2f82d69dc5b11230902ee54f7e88f9d438991dc76a9f9ebaf1b3a4164a68d566df9233cd72f696b2c3948c82b9a54aedfbc15e2b40e68436939ede3da9a14ad7f9b97c628cfb4473c68bd446fa9861a9d9bfd44736bea6eea46821cc41e1277abab75663c10fb3c00e2be539e2e8271bfcea33113d65f5ab153f7ef2173e2e88dab32121c6af3b53a0d093a70d6e123faf16a1ad153b1a418c898e6f29c926f365b552d5d8776f9bc62285152d6d367286aed814fcc4c8c6d5e1d702fade8837e2cd3105149d7f49d3623e6a41cb7189a0abff789c8d86f29a1f6bc396fd7d3c772eea3ef7c02f385e163fab21c17ac9ca4e46b4d3a8200887f80fea7ee31e2110265a4b9e305c48468aafb099031d14cf89b6312b14523a01", "5165", 1, 600474104, 0, "10a8a3f78698fa5abc426bab9acd4bb73ca846465de26ef04d3facd559df8c6c"], + ["030000807082c40301326ab09ff96f60bbe306b21b027508e4d205cc2dcf8f369fee1230bab1ec67e1000000000700525365acac6ab25ac0b3018d0a1e00000000000265650ac34e49000000000300000000000000002045400100000000e8a914df61167446198ab9f73baecf581d3760c1345b6d5bc291e9c1f52dbda13244542e2e439f5bb3b048863d294dbba7c5698063445dfd2421594f5085893d4ff15cec03053b34ce846de214f14a7272b1343684b8cd34e75d8c14112049f7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d61e00537a5160e46952e547009bb72297e243b268ad1eea57dc23ac62433662100ae804b04b2f41597d52e13eb9ee247de90a559e470e552dcd01120652ed454ac34c909ca9cefc90be8b7c6042836b2bcf89544c15e9348da949ee2354e224f69928dfc46b67c2fb29b31b0b5d83bfa67650506cd31f131801facb0190709022273108b0af23f8067870e8073cbe8c2a2c7d6595bfb48a6f9d713586198afd00325bb6a501831ed304bb29d485276ba97b9043dbda4addb00ed3ae0e1f8e59fa40a0146d2d9031f5cd1e4bb9742d9e3a53e19c4a345ffe49690db08806cbee25117739a42096ca0d9c9d64efd69b06f40364053f9772a4a83d688c4295dd8bbd174020fb2aead5aa8c723813af41881d0526871aeec9cb6ec5ad12aea2fda64a39901031d57a49bc2b6e2393411a4489551edd5e94078476b553d5be96290bbb2d27cac0318b66af5652b19ae8a5f1cd753618e0a5c35487dc51cbdee425cd40efc895fed0201ea445074b259e89a8b5318588a6181a9cc0b4c311cdf6675178e83645bda45022e7d59b3d2f1c1063dd948f2869c9d760187563c364afbb5845fb650e889ffb70675eae5b8fbaed68739abc37feb510d81dbe1078c51338c883305c0116373d3fc8bff2cb29c4403daf39f5fea1ea8e8a3e98a7d4fc1f21f0f61b155ec7cd90eb83f18835b2abe3e5148c3ef3701fa0d464b8465f9562f5c50050c0fb8f45ba6e694c14c2e55c64ccb01c295f2d5d7ae5127cd62d969e6ae2e29e7c8d204129abac503e751823cf24442e72f9934ae32bdacd1baab99f0253135c4ff7d749eef20795cf86d2a33960403d49a6fcac27b214b02db86604e5af6df5f5944034de08299ae1b1523d29114c18e630b1a968fd69738de7369a296361be43fd23e05a3c05fae91da56ef5552c5939f1d0a643dc3f8a1a736f5c403c31f485429c36503bc2491849b79f3b262a0e4f49e1d9b7e15850d14059fe5963a56e72b26f05a133039a8336c25da3e088693d9918c0d673315589e492b6faa5c0fb2e0312ad89ea86141241a512e7de7312f564c8f15c44c820bc2b48f9be64c4ee97188599a0043db51bb10633397ab37f554ab44d4a2fa64d584bfb768c84914fad4133a6a98697bc657a7b664d89f6884f63cdf23b76e8e87b1fc7772278a2ebb31855d2b219189a29b9077721e96e1e92aa02aa5ac6efe5de0171061ab138afebd2446f00de2df5233af83240f9ee919be0721830cbd7fc450be126e9878315a680fccceed7ad86ba45540194dcf41013435e38b8a1f2c0a9a9b99d0909874d4a496f201b2de8d51f37b17a3e42374651a9af583bc85a13baf3b12f2d07cbb98d92bccf3a6f1f3572be515f526761113972c52e2d5374757f9e26a072a4f335eae8aa5626a24bd8ce6b59af0d02e5ddfa84cde836d6c78c42584f412e0d13c0763eb046251ec8ada38515c82ab83d69b31ce89e9dc3f4f61e418e8d9baa316d3927e0d5a46b2ea995f387e485e46ddefa0cd9ae9d2835827223a3edb4931b139cf38a10a99d53ef9d3dda38bf2b2a01a12d4cd987c223660234b60d4a995979bd747ab579903420d510cc60fdb89541a95074ab6fba5475b2a683f08a150a869a132ba89ad0e0b387692d546185dfef7774b0ef900a453acc34f9c2f1639eb0e705ff359a529ff2869e4aacb2ea2b8f45eb16b2740a481b2cba5863ebfac03120419fc5440c6b596f3eef07bd048bac14018a7322cb54583ed09e8408c4bd1f18deb3270a52113614336ca00b89b67e247ab154dadae7723052cea748cd739e8033812dec346194642139e298f64631497b11047c28f54c3b91c0f4eb384a1ccbd77f499eb87196bf0a4eb59ea67145cf6365bc99361163fa6165c3a9c825ef6a5bd3c7166d290ecdd4907f0a67e11145fe6ceeae4e461839b2b6526fc4ab59e8d88b61612382143b225b48c83c2ee92e4f66f2c2baeae1a7f490b86f7e4271d8d45359f3fb96a9bdb9ad3684327fc304533b6643380af507133f0de01e6074ae8ccc348d80f44ff6ed6f868a7eda9c725792604b56a692f0b39cf9b5498bf0974bc54238406db373dd0fbf137e639e4fbc3b68f064ba29d0530f11a439ef8815fb5269a595a2741a74c6e49cc7df0109032e7001db7b580b406c357f55b80af61f0f970288047851d96da200895118c056b0b34ced437c89a2cb4fdeb4992491a0adecac81ddd385115a4170f7d0757adfdb0bc92a4220a06389c9f672a707092795854f96c348b6ac820d1aea318674289daaf7f4c585694a400000000000000000000000000ff900b2a5a7ec780d959d652bc0718812c9418780135a98e4fcd6f96c17b490f4f4924b967817aab80f24e0742fc2c892425b33fb40927ce624de284796690ff0b21a45c2eb0decb1616c01a40b7d004baf9aa73b631033a62d76c3994cb5c19000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008878d3bde69f732998e9a8322a0c9c2a39f29953e346bafb4dd77e2b75e5a0372894d9b45d0098fac5703725f321d3178aa46a34090912ae67a2b2501551adf3dbff7e42ef813c69dc99b662362e6f92d71dab3c9c0bcdfb82c1aa8de88de2d4e87639b8194f627470bd36feec8b148f6c6cd82aed853fb49478cab09464fd44020e5a1d8bd7506e783b6abaf7faac61b2d9cc392990e10af33e229c614fc63fee02157a52861003bd956499f68109f3e96047297ec143b3dcd82b6e744705496bc40a00d294941bb2a7a3c1728ef4ccf1c8f2eb38e0124389d5e524f006b749be95d1ba7ae5609584f7c3c1fa5e68f815b37ec6617ed93bf3ca56d8455e867503313a021a763e433fd7216091561a01a0d45367d5732e066ad743f93b6ca987270a6c7a021b650533a748ad4707562db30650dc704cc5c940d81a9fbfae4b95a24d2c16d1031ca2298fbdb1be42c474239b3f3d26f881d46657594496fc47b1a98010cdb707022b868aa0fa6c9c7b9797af6ce0960a192ae015431d8a7c344340dfd33f278bcd02235916cd3ae5d3a7de4d38dcc4d3e202b588ed5a4ad47ac3f0588e1b5e1d1a5472fa81b9faa4ae90e97f56ffdc5e5f2c90f986e7432c9b2c004d279364e1b80d2d62922d65fddd6b5548068b92badc9e5209274aecc88392f7e234d8526d830686620a134e25d72c00af1fa54f5d9108c2d1fbaeebead9d06d2f550d3ea75ff17a22e9e6f38c83b522cac1a2a8049daa9a8b965e317b736051f61e166eef05b9617a1d0c88ac9906e9c7ab85c27944651b88b1a522d3ac57e0374d2690b91573c1099c2dbd92675b2c75d8c0596a577b7bc22ff7d99c7d24a0f47592266c4fa5a410a86a62deffeb72d69415fd5b19370c4bbe8c5da02c857a7d49a2cafe27c7e8b250460178c0a4f93dc17e433637abcadeacfdc898ca5d14b7ca0e2a21d2bd5d841fb36665e824a2b1a09e4ee729897f85ab162d5340b3a8860f1780fc7be4673a3adc57194ceba3240623041d8065ff6a74792e346745308feea4d8e783d965791db7409129db7495b21f95f0f341a828e0bd40895f06b30ba7a16f31ccc0f1fea5a09f6007d9c6478f396503ab2ecd13da7ba5bd5d30b48d0dfbc1e31ae3baccabc5d23f93e5e9f10f8c6ac11316a60c88c9a22a9d0600073145318e1ddd7b7a5fd1fdad6ac371a21c6769883b116a80d3b1702613b5a606324d9d5b4c959081685855b5de6b743181a4a7cb7dfa99ea76e21525453cad7b787532d8a9ebd1a2274c8c7a8abc706faf3b789b9bb6e8a2b3f3cbec5821c84b35594bb30792476f7d9ebc65b2103e752c258b00bfa3df2d2582de4554c89be62160d3bead9dadac67d68d49751f9147150da3633e008d27dc554ea00d78dd8dd1f17815dba6a223c5ee50ded94ec55a4ef64097e67e99d1105c088ef1a2aa04d0430a36b68428b8b30fa85225ecd8937d50685076dc9c35e5a4820a29b5124a7e14f5c16a5dabe2c472df7943cfffeb692097a05e47dbf8372b127e2469fdb094d98b74d06eca85f732c5578cdf0b6b8b6d17fc1a8caca446b516df04a216d2368e6e55a3298d1ccf5393dc3edd71933cfa3a02d2860b90eb3e88b484c1d4ef4c2ab0e702b9cbc6dc0ac342aac12e62972df214d7e510ba0002bc3333a7d13b7217a9719696da6045a3e2dc122d90cd0c63582cd40801cb86a2cbc3615d6813796ea6ea0793ba0b8ad64142273dd6fa9c23240c656857a5762b0c8bbe634c0741036b36b86206508d82f501e4e1f9a67ff0749906947ffa57a05f771e6eb5e4b23780a800e92b227de82774d24a4c17c1ceb14a2b4d7c53b0ac73bc586b5d220da277afcf69633bcf8b454024f4556ff0bc382a883db1f69a69f61a9e2b0f440b8d44538d38e09e622e0203bcca2fdc9e61ea6a2692d4fa12528c9b0b345e1ba8c02a18679daa8e6219cfde5e2fff62fc240662cc2fdb424ac99012b6dba0bd3501125af3e8803826303ad9256c3174a7e37a29ab4d539dff8dd24407fe1b5b9eaf8e3b92de6885af0a7e8b9e1a9bee316b82d844ab3c001fbb5a636da74a132a4434fb5940a58e495dbe8f962150ce1807d7bcd226118fb86f18bff65ef724a04e4a25e63d3e719b572d002a0a6c294301485107ade6f613f8d951f66588313dade9cca39b6231e849b1752ba01c30731761015eb997b946792113a6ebc8b0b69de3579d8fb8ebd2e4baef1589d95894b1c711b39f9bb1b4af810f0bc01bb0c23c6bbb77201df41e00f388c8872b34cd64c680028a3c9200000000000000000b803d040000000032fdd341f98eb941b69f4534ccdda49d8d80825ab1b70886f1775ef9ebd2b144ac33adcbe6d778250cf60e41877278a38ce1ec547ff028f0efefe729e43c1d5110dd8a89aad251b07461e7bdd7b6458790dcc0a084bdb56209093e25ac3cc82400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e427f8261964ba2b77c51a264222082d63fbfc74423dfce32af1436f90d2d8315ca70488183d401a5077d8e4663da6c459107d19fc7534ec5deb90f102b8a3f0371b86afa0c026695abc35e4bebe3d002d7ea919272a2b0dedb13f7d95855d4c1eea078271615dac3d8a599543d45a757585bc129e4fdc42d40fd32669f8026b0304e0627058c569ab7cb6d57771de4d0d0d8d8df2a874480246257fd872744f40032d208900a2ada8c103f85a4e8c1b888d215dd59619edbf734e4cd1848501c4b60a0700d83a38202775d9c21b0fcc70d93daed310dd712130275a87bb8309e2bcd8f59829384b4c3b28dd6e0d9942ae650dcef2d28f835bcea998ecf6e03f6c096c032e65505b9673c059c3c7f37ec228dd53a2c766602d979d664c4c3f872253ce380207f9cffc70638b27858a2309d915f4b51b07d012d94d5f62b8e1d406d10576a1031bb1380157b59f9d3290c012e2d251256f5c0497388953cd7dbd59442e6204c8021f7c8355c6dc10f5abaebb1f5880f39562f6441e4b3466a998403585428062fe0226f408709bd798dc649a96304a1c56d2625ae5d5b2ea06ce96fe4f075e27bb2d3414f6a78183d37a6fb5bbdb3003220d5fcd1ce03ab3ed527680cc4eabfda5b550f9b3a407e46df61442ab59f501227badff97960cb1e9dfdd76fca62965256e00deb94b1824db2eba6358738635158c037d96aa9419ff85f10d84304d9fda43a8ea24808f499ba96b4ce4981daadb46d12e73a4ca1ddd8e21d78bdba88cd22d8df2645fce5f2f523b7d40ba7a664839e19d2ddc1b636a8fd51569b059a9ae703778b22e7fec28d91b9d17aff31b00195b3df36e10aab01152f608ff91d235c2225a0287be936e139572a0cd4f720208cda1e7d4b66937e93f4c65793c7ca23b742d70ec0ece462154c2931b5462259dcf8af4a1ffd867f6c8052dbfb7c2a9c5390ccf17f82d01dd3cd59b3c5a38857b7e4dbe571046de8958a08d99b75a80640d980446d12037530aa309b9f0b3ecb1a84fe26d425bd4d7f537b752641d043190bac9432c33d14a5fb846949c50fc4e9c8ea25eb27b00e15f85955218f72bec0055ceec8b023eb148ed2597c49f52dda9a06b7079d0a7a816f21b89c6c5b4af2bdbdfc5e0826555ad57f8dcf40513ce4da7ab8e06ec967685a9d0e055c220a00e84d0205d53a5510677b2a05f918afab8ede4572fdbd9113cca339a93ef2e67b42d8588166519113c7592af2638ee5ce3a6fb3973e73553ac4ac07266fe0e6c1246d2f99349577b74a63379dd5565424d226eb46ee5e71a67a7ffd732e4f85ab2244df274acc6b69ab9ab0a5372d6627dc2bd5b224f2b4eabd18adea97e668b439206bb72d7dafcb3cc881d4f17c8d38ed296e904e0ef5e5c60ca7171aef16fcbcccb95e76e04e93e213182a0ca9f1710583e4858a49dea1c6fda84ee1a2586afca0df9b10585e4598d431830c9d39c56b9cac181abf54fbee2f72c4c756595e7bb6faa14c73e7d5cbb8b1f8ff8ea589039f51dfca8e0a744135c0b9d9671d81b48be034cc771b98c4c3b77fd26b8d2cfcf2e0d3b0fea0430e1e786aed4dc0ff03069b5dfd630485840abf67049b0b8328a5383bef297ba26261f74712c5da7fa19cdfbdad9c88e109844c3ea1a4f61ac1d6c0e9c1ffa0e2c4d3dec918172fd483884ad798d6e000a72ab8372da00f82deefd388c5d25c7d62e3f11aac1b1851f500844a19d6b0ac940433c1c8a0b84f836e838352295d6c8852f04cb1b7ee25e57f16e6208bb33678d1fa0e9b98f36e055e84288c62d9c0322f9c8f5171b5b166995eca79617375de5c3e80d17c5c834dbf248c16c6b447442e01acfee2bd040a9ee03d74cfe50510c113fe121dd9ad167dc15e1752882901c39080df7eae10f1abbe70e9afbdbb271e11cc26cc0db2f09b719ba5348bb80f5de37d6f91c6e6bb560440029aea0c4369aa58034f9086437771654609d2ac939b5116619b4a47647e50df9ec9879f02b51dc27e8e31bcc2414099d4f523890023ee31c0344961cddf53f4104d2a6b03785951f5cdf0ec2f148cf1ff2b515a4911a97efa71c59392dd0110ef2c3e62e0bae5c9362ac158a896ba5a5261047768ea7d0123ac17b5fc8fb8d4708a68c7c28eb4ada85b3f4310bfd6a0d25fbf36f02cc3e9bda3111038b1471f878f6130edd8c57fca1a5481db6a4d68ac63b271ebc4284d810967445edda656c31799cb874cab55d5f19f4b0c85b8b08d5db625993c2548895da1b7cb858f5b99404ae155051df0f52b29b0e021e9627c9722f627a74ad80091c491dec8eb86b4a10d4c8f6a73ef1e572cbcc98db181e9eef7b092e822ecb9544a69742b0e7842e5dce391bee9fb4b6779a14385db472a0fe625a4253896655a8db04f7cf3eb97a37aeebe5fca822deab6fea08", "51ac63", 0, -420306464, 0, "7889d6bc222f499658b2f8afaa4a9b8804b03e12dc4ea74044d60032e71b822a"], + ["06576c5c0253c67bd44c76be6388a8e84e546d4b68ed16d91212c73e3023bc4ea8d3d8e42000000000070051536a6a5300d67d6e7a539be490d720f6a5c41d19f92a782c4fca6423502386ff3fcbc2accec7ebd6e000000000026a51ffffffff02665ba201000000000663006a63ac650727670400000000096a5165515163ac63530000000001c480e904000000000000000000000000d97c2108da2aa2139fe265779969166ec965d1c59cf3c908ed598a82f16f49570164cc987575165c355ce5e109e98b9c94f01b89379bc40fdd5be51e3919afd34a2a51f7ea78d6ffc79b9225cf293af49b4d24bf27fcd265513f94e0b100bdab0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000068c486d8a82b899449fddbc9771b6d82cef57b64b1210d95e21930c346258a34a072c2d4df6617bc021208a1c240aed04f5dfda08e2ab1cd9d64a5a2ce4e0ba1f4599ea9f4a5ab4ea08de5c51cba7ef81fefd5eb7926d9570e5814c3cb85b3750bcc2b01fcb70e1a38604db705f772c5d71d1ebb42be5226c98aae61babe659a022ceb19efebfdda9ed9f326463425ccb0e303256baa5d1d1060ebb07b6463a6df02158210fa5db881d94383c0bc810f3dd44555d0ffce9c682d5b23ed9cd46297a00a0189b1ae42355d665b4d7d4eb861d6d86d873fa425c7473dd233e34c48dc156cebebc3812d180168c04f0accad08079d9459630cdba6ab6e6a437e352eed3feb0306db2ee9ba31194c6b6231bc36079d2fd34771fdf28612a0ad871fc58f2e941d03173d4bdfbe63433a8baf2daf1acf5a5ca2e1d196bf701200dd0fd8ee06621067022f5a5d7800ec5c07ad88a493082367489f123156ac7a797a1149e39dd2dace170213c9a02e5f3b0d6f034f58efa07bc3c341cdc2e5a6e780d86b677630f6c03670032932a7396e38d25e767650b47947ddd75e06440a8d01706e75ec1e5145a249d963136e72db2a6c83143694a6af9d24381f43c8b26283c3d06fd516ed485cf4cdf77da7dd8d023f9047005a65133abdd4f190d2b5a1ef32e35e6812b92c32cb4a5cb78712420d16431e1e4f828b3a639e0389d32d7dcc9e911fc3904b500ccf7269547cd529b6f282ba365e0344c57ca4aeb5da7ff56335e71ed94c929602e4afeddd37756b620c15a3b3052908aca894d0c40f7c255474779a9186413d3bffd8d92002a1ee2136b2f4018b3e4cfa5b05043378245aeb7b33675963536645805f113a835c57e91a26204aa588c406d3751e0b9490b68b79897dd8d447ea0ac322f87fbf554f4d33df8e660a7cf25fee151567497a5b49d7b9a5a11d49b73fd88c6d564018ca9b290c01dff5a8970caa6f72485ac456e528f7b4258f2f3cced2696c7ef5373e755061c741c62b4bdee7c63a02f23966036b40b61383b6562be8c42f54221b393fbbd1c33510e4e0369e927f710ee0c33e0b90c78c709fe754be86bc90686e976effbd33fac2b80ad1f424e0bbeb7c14926f09e707c3977c5f3b0326bfce2529a2ec1c8b3263a214f31a645ff6fcf6dc5603bcc5facaed31cc99666f01a54d9e36cc2565b1ca1c1fd771ac6fdf62b53a978088e0a2325dc6a9cbaeefa29e1c7024ea26e5d06e99bb9245153864cb0c8b2f98bfa70d7ba1955583c1157f358c40549a33c91114b8ae9ef74e777a662b1dc7931443162046d8fff91accb7fef8133f5aceb845c8f8d20e04d6f4204ca070f5786b31042f8fee064c24cb82b58fb8cf9a0874441deb0f5d7e12b24cf71fbd3972230706da0275ca536f6867be71aa4e5ea0215a462e37b449f507eebd4d8f3a0629d331f2051461d3bbc01bd3b15b2a6da67d8aa7bc6ead7bc515873249381c0edb712d48ef69720565791d5251349eaad7e590a2930dd9ec906c93ea2c541027880e88577c06b214b502630f0867653ebd5e4c979a24e5ba2c11e5994a4e4e0b0e1febdf07216bd9e8292842b4688e014c0f80a5985595e863bf41d2a2de473516b9b213658785eaa58ed34b4796016d43f91a70b37c537d7bab52fbaf031eff85904a79d10e16ca9fb112af5edd78c651cfcf955296e31894ad4a415164e0d31ac76c6ca22c7f177662db73a98bff7ce413c9266cae1f06db865924ad4979f5966eac04c1b3daec5a94f1949f32e7378e8e8a5e2a388d5fe352965ee08ffde8cd55619742f6cd12b6a39162601c60c2c7a53fd5818830d078897426f2f0f1974b9c003371cb208130f5cba4ccbb11daac800104a804c7c08078ca4982441924b1dd13c94c3a585583ae7ce8974f4edcef615d914d1284c8d6c6f2ccd5dffa7ef2212fb9077c1b308159e64fdbe5000e3dbe6c61d6beabed5c6322f792be262252271e6bb3afa3b55788386ee297e5e8b102e25b785bf06f914363b61f0b97d645aba97c1b70448ebf114f83b9fb0ea633c499e5d88ba4ab77d5b1b02c248177d51c68c5ec1a6bcb390805e13e4a1b1ee383677294bf9e9f4821ec5b66f1ca2257728f6ce6c67c40ae49712e552d6d27fb14574ca162e844452268ec1d165f042e85ae80e56d70ed5daa4800baef1bae4cba59cf1fdd442a82b69f7fcd9ca7a783a097aebd4d82fb675c2e173e3e095841d0c69f4a6fe1c0622c6aa4d200bf0e265037fb723524b5b45ac063f7627bedfcca1d0645049d07ef8a227266801fb127a88c68d49dc56a672474bebb8b7593fe3826c76afe36d7c8ae339dd44a672971bada33c4602d0896f08dc2ea3e3b76c484c6c4d93a61cb07e7db64a9ae07fc884fd8f10038361e8c4ab4d5648cc79f941b8dc286cf130bad410e", "ac6a00ac", 1, -389512860, 0, "93a44b0e49bf7dba8fbbbe7ed487911818155bf819d9b28117af9e1e28dc320b"], + ["1320363602f21f3e6d70a335358fe452ce9b3de96d96af75ea3aa46d6c83b1a4a3abd0f44c0200000000b22d760f6ada979c26694b91b389feeba0269593cd82b417d16d4ad1937e59640f9771e1000000000951516a65535100ac53458a36e80242afb8010000000005536a5365002523f40200000000026a51000000000307837c020000000000000000000000006107df8cd301bd7ae4526d2b2abf7211e86980a8f3e0559244ac2f53c3480b1e7b298309c8dfe7e40261f45a8c582a07a92c553a2bf9d6cd98d2523673580891dd305da8ba8f34ad97bbb7f7eaf40f51978fd77dd485191bcf618b9ae8087279000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001843964fa07cdb50e2805de8f4e3761c618b333992bf67274bb112756eafced5fb6e20a410681a5b3cae02fb99cf2d4b16c3ecadae17f61f224c58a0eba1e91e7638a9f24caf3dc1e84dfc6f2f559af6e9d240e4889f235639f0469cba9f19ac441b4d15cd7411bece38e60a8b790fa76d0973283e3d70ce61302a60150234d603151a73b3f94417a8e4fcf6b1307f6095a66ef443086db97ad0ce0058bde91a49031b7b738a434fa036932e623d3e6afdd72d08969433e3bdd33a643b2d3b19ec3d0a052d14b9d531ec26f05e6673bc2dbae94ef0b9a493dca2930918ca826f5d571e86bd5d6449f0b562a1691eca0b9a9f0d485ba5a873e912b80ef0f39c6d6996c1032a86c792492b7faafc8877026c07287f447755c0d8882e59fa21d10d446dc7450210cc7324193315f6eb23f5c3a7e339901fef5da6e1059436bbbe518fde1472690200bb3ad330e8463320a600383239d67807fd163bdd8ceecb54a5f861f6b86835020c768324c0c411b6a9cae6747387206b2876c8437e3d11258c5beac60f173566020395a2d00714e60afa26ee3ca989aa840649cb8e19332f36a548de186bd7b7c0d50154cec65775518ebf451452bd946b007b80a9b9083a1339f756fedad416439b4d1b15d1a1be7484076dacd2e9c271ba7ce2ea5cf74d56fd237621fed1ce61b164175df7d34b418404df5131ec36bcb268256487c6a2f943e5aedd57780879900ad4cdcbc009363f97ff85277cd655bde602758d481099181c97026dda570cce78b4fc3dc6d47906b1314cd5d214eacf26f5c6ae28dc0ebba75a2bc90869acd8ec4cb0d18ea261cb763bebf55d3cb5abc96c73ad93fc015a7a701d9c31160aebebb52a20175e8c07ebd0156f5fc87fe25982ef6a9a61640d1d46f77f66cf10c328934f87c7f4e47792eeb76a000a09ac4f3cfb9da7fb4fd000fc32f956123446a853cdd99ae5e5184ade07187d31edafdba263696421833afee3b1323f790cc9541419b1efb1341c5b4de2c8733f87e64798c26c8362f68b390660b77d954105f9f47ca2839a3389f94cf24311ce555c99d69efec13d2b2328ae8be48dca74d9bb2467cb8e1f1feda99240f31043d021d47ae9e332e238a512d96ac4766411c5a7568127085d0a2572a59ee233af9f81d9c7cfa9d3988de4afe9a197873614bb625d885c02e5ba79d747e890e8dc804ec605fab2efeb42096675cb44fbee8076af80afbaaf306122e18874644d346d38924b3d2ef92891f780f08ccedcc2301ca9228386c385a0eb71d783aefc0a346918a24bd8451e14e2953801de5e3aece33e04d9fcbd9cdb57334e9ddf0f5cd7976fdc4193b30f6f1cc1d9893a20db9a1fd09e0f848089989b418569b4f2f9399467c830ec2611c413b9684e10a67b7f584bb949d5a71a9de8821b5ba6674417e838b5dfd4618dd4f82e07f6e03c7e8e01d6857350e1fb253cffc3d5ce234d0938677cf202ce24f941c87b982b256bf5b2a52d7b006bf297da004d8e2b07d39ef5666ec44e89ec843f62ee8df1c30b4451e6dc69fb159aa5c1a5a79f58765621c43ef4b21aa7ea58b2da3a2d0d797d97ee5ce2f14a65f63d372a82a1ea012beb68dea9542886605fd50390711eda648e85e3893fb372f3b849a2516ab04777e95dbb22a6a1747ad66ca9bf41faca937b9aa4a17d4e37b3dee6ce30dafd98ed3b57b77aeed907359d06b7d519ae3c600a2c3541b3ed13af8571e32c57094a8f0218af9806ab841850064a987f4e07f66375226640258978476deb5f56412921d966957626fcffab7c301dda57ccd6c8ac99719c182b1b496c59b6de4c6b878cd1b4a0b47b7e12be5db1fe4d77b90028da9a64a509c4b0de83a4073c14e8647d20179321524fa7d4f1396402ee13e87df885bb126fc7ce417b71af1d720346409ff9d91e17a4356cb676ef32aa97f2aa85eddc5ae7259d95b452b9eb1f2b0dfc12525d6fa39e060e15e761fa5e53404b165f409405c0203d32cd9b5341b3c08c19f9d0b6ee6d2acec407b751aac6b52249e7a1cc52e94621f17a4bb8a5c83f89683b7b751e45cf1274e18c60ed4db3ac9f1f542d9195ed6a773ebd5f1ea1046410bd98f5989ef96312aac8afc249665f1926221af7c8fd1e27168519c4082a1600f3cc860cf0888cbe23f1f9e6c9c0cc516fd650e61653bfc8e4d896ba3437e7b554089f6046d7ef8d1ae13b095a2e438a68c1fbf20dcc26e8df4511aa940aaec325ac6f521f579cc1549401d8bfa97a31732546e0bd806733f8062c5a8f50988f04640000000000000000cf3ff40500000000535fab7d473f4016f819a39fdf708f97d1ee2185ee2100659113aa4220d3ea4f1befbb00f702e61cd387789d2f9f8a8e7fa2ddf6de46daa5aba0b7124e3bea4a2236ff51ce6128d317820714ccf8db31f89ce6c6819c61f2ae03126674b5522d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b3ce7b6f5123cd31f087a63171ebf4e16f3b605b057c55922aa250b420fb4140aab3059b001db68770e5340492ac4224e99d318a38608ffd32136c8428cb7232419514a1e2017975185bdbedd89857f31dbb8d608338c5af865bbac89afe4b874d646d02e1411d68571f1f74715894600d0f139b9d5696bbd9f10f46276098fc0214206966d8cb22bce7e97ccfe1c8c6fe261174452be291292ce6c989a51024fe022d4debd64db13d7a2baec2d8906fe51e30cea2af00ea1fe006750d974f15909a0a0324bdd5f92055114549fefc75d5dc85958ecf38dba8251e260dbde9cddea94b9c989ca5689dd06e7717c94bd82dc0734afeb31906ff8bcc1a6872ee8e4096d90210019df20889f78816911ba9a361e5efb23ef5f7d9672ff72fad0ba02d8971f40212f0df452a5c66318d820226f177c4ed344996f09703152444736bc82c70dda4031f1aded9eb45ba01354bce4ad0f128ed0a611b1b282aba335b4f231bef255f680309ecb773f4c5b141ffd3466ad70808ca3b27979c8b23ca3cfcf734eacc03e901022c22b35dc78aed89aa856d870435281c1535af9a5ccad7ca7e8f1a918c469a3722de7121f76aff00c15396f1e81a26bfa1ce7d03a3a7647a7f8da05be1928a2244a5ffea01cb4dd92f500f70c77eb6c0747a4010dd226f4d01ba8118792d68eaf76729c62bf7e3c00ad167b7369ae11f9c587869d4b2a747bfe6e3decdb3d28d441705a73151e8b3e2556db74c3b1a51df3cb28f89277615b5675cea7d5976173c050995a5058258270e6cbb55f948123a64d7614ad2ead9f06e8ea5e0c7126370f39f6aaa454703fb6d99bbd771eff8234992bee1e53b56a759aafa9091f485b1ab6e4a405632a8c50770b5965952bf79353a92e16b27cc4afdf8eed172a6fcd2a407eb16f4977ce489c15a3bd63ff9027b4951b51edbdadee54d4803f65b0dcd562a4164a2fee5fb4fe26ca92f262873c0a0f2a2a33fd67a7c82043ff9f505a362839d5327c1148ba5a72593d52c2eb9bd7f19a45238dc8fc79d94453a9c0441a1fa01309bf93a2b1158a1403daca579fb6f4952096ac7e5430bcda36a1b036f91736314bd2d468ee587a6bf4ad7bdce2f5cbeaa68ec65b189f355d9cad10415461429d01eeefc7f0dbead6f8196ff6f7929cd269c860bd1a01de2e1822f26cb973266a79758c98b7dd1e1af54e45a4db9d44d10550363957affa19d0a1ffeb5bf5c442f3db4d03c74320d54375b3c8492f06bebc5c880c545c4cebec1c503a2d036827b025963cfb813e1f0723c7c4e80f0e213b8e5502a661302891f91ef2114d79700ff0d0bd9acd90bd38d691c9bfdaca70b0f6be7325d61f7588a52cb64631dd1d02cd7a3c3ea401781108a4f7d08246e180dbcff816e2f597e792217a0f87ed20908fc4186492f8fa9bc17a6632609c7e6ed68962987e5d6705ee580c85ac1b2ef6fe4394a7a7d5b5069b05211a0b30c2d01e677b9626cba73a386678df6624a0d4478342571e4bbe93247f0c0c57dd19c86b3aba9fdbe34dcf89210b8682ec0cd615bbf24871ac880eb727b9d13105d1d8e7800030541012357b3468a3953392199c448218f90f2d92fdc8de15f8fee4fa55af4994c8261a9498f127de9ccf9133268fdfefa96cafa12e1cffed9a4b9417fe7eff8e0f38030369b79268d4d62ef386471728e455fbd318034b2d985dacfec0965f6915a0c59443d423d84f499f6d1bc48a1e46787e26f87f57f642e1b2a5e41efaa3bcca0d20d7b927f8f1f9766c4ea3e6c469a31d3397b11308d5500a7f6b693f1996fb72e3a21442a2e639b644ab23acfdbbe8f97d189285c405c636688039d9eb9347817ad99ab8eca07d0bd9a0c747f4d85fe43fb1574681d4cb764f0d3be830abcbff9cd3b5d6ff67901d95146beb10b47f2937687b98301432912345314835452c62443cd02059e12c8415eb69ca813c59b0dd4b526a75b91a640918a2d9e79e21d10ce0038908f48ba5c8e195488a82bb7152220c25780a714b292bce86da135da7f19a3c950d7b1e727f236e4b86f7bac5659d9c060b3d1560afb8b924320f194465591b6b324fcf315ac56556ecb153d4bb5c759fc7aa328804e6e9c23e3601d13bd2f796bf9369efd60fc16870fce6cfa198e5bfb1253c91fc6b725b3e9828bf0e528395408c1996d6af3d634fc8e19b8350b5049ca57a1e00eceb721295680151c9281358a717c6ba80bb9070800a924df8d7074a1909b588f5fe176ae71cb9743c978fbb1c855d452d67982004a1456b7c52ed8c47d88a005000000000000000000000000133ae940b1d7c8816ee36906b87c00ada166d08eb89a59a9ca90bd9245b037e9c8b1627df8a71b053d6aea3de83ff1d4131067f94040275550910309babf22f1b0cc96afa4ecca35d49d97a16cef07b0e99641a4cb8db05ca22a8366cb682d2b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000759ee370cdff673f092e9384078380e0876f98f2fa67f3d7e7cde7e5e6c8dcdc94d8adbe880eb35a562a22bda0a70c9800e9bb7b7e4bbe7fe4c2c8a254761eeb57d771417b8c5f0116a129bebebd640450a1536cb75303954138c0acffef82e93d4a090e8bc8c7ed040c1c47f4f3dce2a064248189f2befeae9f9996604198bd030e27e77105f5742a540e676b4f1ee5714d6266e23dab8ac4dc0877949a953e3d031132b3a38234292b1225d15d42d4f6e129e6ac0f09f63d23ff3308c350bbc1ab0a008ffe8219d72c1384b0bfd69c1ec277a6a2e3e2774397578a7cf33545aa752cb56321273d481783337b23bd3bc43005105c3dfe45aaa9c152a56d4d2665975b022ae6fe3606453d0c18ad0773916e96869ac0f81824ae32ec5a551776284c0a4202196422c5a2ce78c89f609303f947fec664e44d2296bac3ddd181213281a834870220fc2916a770fa7ca85c2de439cd2a42d9ebf31254f1177689b369d42db891250203a78691f665e4ab12353c180b9c81f4f502e7ea77700eeec2f3753308b1024003295c1c1357c90dce844c513d437e5ce4f297dec27bb82e1cda625fc4e5c64468e335b4a08ffe8e480ada75ec8f1aa5ca8a78d37599184e880911fe02add1be78837f24dba747dcf702445e17c684133a71ca405512bd49af01d1223362221d14772f3b49fe06f4694d991ab06562ddd71f91fa28d2395d4e66f2af100ff4cbc4a9b9e4035a52b3ac216760cff1a6a37e913dc2d111398d1edfd1d6def6e764849bfceba5f339821628db18f7a68f6473c33edffb580be438a8120b882735ae2619c32d31998de5d2195a3c11fc699417774bebabb8c7aff93daa6d97baedfd65100f4c5be069c77b41890c5a95a3b1b1c4de228eeff72f1b0c8e958166834f559ea37d7c75d816a4e630e8c1929f38d07c92158aa5e2ee181f09898b02d1a893e8b73e472f489312d272bc3df37d5460a67852260ca37decbdec11072fd531084733c83ce7fdef70d05f487c97c556349086ce885cf0dac9690437226fb8b1a455de69ccb33431cd270fdc1e6e4d6e6068fc471fb866ef64daedaced7aab5249db29220845e00b989cccad0cf9593bfa124b6535b301a751a04e8a19fb8b344c8593e4f4a63f111565d4c416245e3110583fea43e3fe94fd38cac0dbed7d086ffe576587702187cebb0765658e74c0fe4bb8748e9949c6e410023e80a71c17fc114205214f846a4a7007c11974ec1a8b8051f3c7157123773451ab444a3e9cf80180838f1679cd5e664c03393b46a63270a041d706615c2e577fce29cf363c907497f55a12d3dfbdf22cc8dd88e23619c5099ddf8b9dcd9f0f8f8a0aa39b100ebd8901d081d0c2daa2d154eea2168853b2268c786c7d89f40a83e1ce02f299f603b2aeb56ff9702b62fc73a8e2d2bfcd5d783fa6d0410c275c5501bf69c8a58d10c4b34d890ec49d452c03ab403a62fec2a9ca5e5cacacc58d44a63b59f7484e3dcbb2593ccab1286de5ee27c6e47c36f0fe27080ee01865f0da46e35c13372291110e96a97d3a5f771f539f4efdb38776ab4d452fdd52346a10b6c668ffad8088185212ab454b68ebf48db3770317d2f621cd523aecfb80cf7a42e3200a48127cb69443cb21b81c1a82484fe266df98b5ab82fda7787a58a6719a3d6e2b0dd1257eb9e6437cccf93a951f7e8df3cd99dbc4bfcc9f369ded691389085a16a51163b6fccd66d9fac33dab28feb2178f3c8963b451d577a975fd3248a676470addc517766678e83d7e5d552ee8a7c8f72bd4accc4696b4a168f5e10fc17c3f04b54ba20e29501da242d13fbdb3b6dc7105a1e2e4c7893bb153743e2611d05208147c0ddeac566e27648a562d87b79a66cd5dbf01f4c62cc80f15f1deef5b45aff4409a3557a92f664fb5f70f8bded5c765fa23995aec3cb7d014e7192254029d35cc1499809519109f0f68100fd09bf5605f433d0bc8c1f0314ab16b8564b9c15620de498d2c1f4fb16d2fd686ea874739c2b11a3b39aaa39a8683c001a09a03f3a547d7a0b35489f4a6e3f3b868f27a1fc961a845ac109f5b9ea5caf87c45353e85b45986ce8fb81972e0c517d6c7074875795b8332c83c47aa37086660fb1454f4c2f5ff4c44ec3d2bd58164cbfb593325db3b4d08fce902a36f4bf4cc2a37072d87df97b8445b12fcbc2a295263c8eac3742b82d456fd70dffdfbf0ac428a527afb8ab87db5c55039a487facc0f1f2b1ce677905441dd903c758e5ef87996a2c318c399a8d95cf6b857a2de88416f4631a1d1a4bf4d527d6f2e5284a6e616ac8e9b1314574fc79133c706a701965271b77dcdf6ff2167086425274be122e5312a993847e43e984e4e811e9263b193cae62a0fa81600d8100913be850fe88239ecdcf4bcb44ad4dcc67bfd843d1c22f20f0b", "515351636551536553", 0, 1052202482, 0, "e31f7adb9351b26e8c0b1303c0b993fc2e6b76677bd620161fb6de842aaa1f64"], + ["fad7c83401b06ba876a8e4c84bae2143f4a67ba5b31d8ff0d44f79257872daa162dbd125060200000000ffffffff0318ded0020000000009516563526aac52535236af7703000000000045154100000000000752ac00515251519c70feaf0200000000000000006dbad4000000000011b1bd312eb3f5b22f38e1ed38164aba00bc4c27af0209610ffbea484c4009583bb93add54a81e01c999d07b33f34aaf74ab63362139c99ebf975d46e390cfc0598ba0d8f40c5e800db8217e8743bdf2352d7653b4df0fbfbad502561fbb27000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000346161439a89ce8b20e5e2e4716795ad9532bcec3e5c4d50afb974c3a4300ecec419216b4300cfe743fb6d23bac0ba4ccbb3f220b356a0dc55f724e4086104d860ac684e302b6fbb814b10748ac16e7be1a26d5805ad5a852bbcf19b15a707353c087439597f26d499f441828a26042f8c423f1c51f3af40178625cadd5f430328e76c8c391f69d6addc0ebb159dfaff89ff122d8fc1d4e1d9faf1c94e130486020ef151e9a83031efd0768b3da241832a6cc44bd7a803a2c81a0022039144abf70b08c9d5e5922f5ae6bd24c749d1ca40b1e8d2dc0e569ae99a82c6e27f496d0218fc2de59b3e81cb8d0b486ce0293ec86c057c17ede202953fc8e5ee5a37e0a9b40329b4610ca1e48ae077b26a64991755c270130daca827fb9c22cf3c459a6222650201034fef9795205c0b24228eb72e4afe9da25220439e5363502b43c8d0a16dce0302b9482edac467e7a41af4c6ad7505aa678df32b5ff7a07d46901cb79993ae37032b4a93008890f82f24c1c68e54acf829c1b8c8f92569e7ebdbb886075b2d5f96031ab5ffbb3ca19c5e5af154bc37f3573b37305f3c08328f81afe1a530016383df45913b98ec15054f5ae55fe96572798c05bd2ccd4927aaed9749a1acc993be015271e7dae6e4b021ad793432320925da76579df4bc29c62ac3bda1909511479650a4fad027dc56a0785230c8707d6604acde1dafa8032f86fb424bbfc8b90963de5d27234f206b284251490db4bbd6b289b043d78e385c836a3e009e2597d5c35ffcceb4693fa3107e1c61219261a7c929ac5ecf71f47be56fc05b3486f390e68454c0b4c7d9657adb52c3335f4f8a44d77b3456ef4b21c9f9d89cae868120a6cad631d5c0243d7a4fa51a00fe5558d08652557cd93772eb32694e95d32e19db4e40ed8b691e8db65c9fafdfec9ddbf8ae22b44925deb065ab366fcf7b3fdf16112623067b1a380fcb762d49b36cf8d14d40a5302bdb06660c5924f9c444841edc344541bc75a10e8b70c9f62b6f2b7909e0e22905424ca6bf59f04334b80a7a7396483cc61e09fd3f6065e79ac023654f569a2edb6c290845714a9e25354a58517a0e3bf14ee0fefc1975d2b6a10753b2d886c4e053861d68e0b78cc4063df14ea942ce15bb1f559d5492fde2ae90b6962d2fe6e74f9f66478ae964bc9601d6335e9826ba387812b9027809b92667ecc289fb69476c18e3b78457df7760cb8e2810f26ccd75d3f3eb3dba1f1c441c43c7f91ef941181890227a0fd6352c2127a6323af2e1005ed71813ae98a56b01bb6f65e47d86b010f1d605593d2f7e53f77c2a6ba4c4af22840523cef0dbdc5b99afeef80fe196ff121fd4b7e9249f7931384f17c1bf80c8b9036b8a532429d3ec13ef39a601e73a6ca23e28af893af9ff3fb55dffcd0b157f3919004f491952ca420812a6f90425ece5ac7ded26eb40d2e58d9c0cbad0597b2fc1f3228ecc1bc4a39e1dbf9d8526bb8f45abcc9e637f2b29987fa53cb211e9b0a6e0bfe6da117e1051b267c2e396e08197a6d6ab202fe7e9407e346a89812ef36f249624989d30765bbe3218675fad59e1df114cf34a83a9409ae587b4efef6c0ca1dbcb2f4573e925be6c6e96ca5eaed5e83d600dba688a2644eaaeba745124c55304e07132975c268e87c04bdf1f7eed7dd74ccb405b77ba66efa9fb206827e580d543f9c8a9fbe71b5b6d87dec021c8551f1621123afda20d593371ac389ab3f7bcd9b464b7244e31ad519c60e769fbab3e031a0bbefde361c280c56041abad70770481441f8c27e2e2b10460df7587ff545bf7713888659ce15290b6cad93d2992890578f03cce0c3278429cfe49ea3981f168552b4367215b48b5c46f0997619bf24d1f2ac2decf633463f71994e661536dac72f852ef6d213ab6e586a2a2535a5f00eeb698f5646e1f4444c1ba875d6578e47873f7e85e961864b28f557fc43e5812491a1b9dab35ce19535bbe57869db77b4f41cba24c7ca5a90d878cfedb003c813cf0c69ca1caee1d15ec36e5fbad000383d5d1d728318f1cb83381e9804d4129b03b7ce38ab608d6057811d1da1cbef72f9936878ec151befc46b19c36a537b66b07b49d9b59d907e0f7a242c14f70fa8ea68e9c33fdd91ca0da8ab4425f2e2e124875c906d0f250d0d397e0dd47bfda9ed1ad35ec6d7fb6759b6f81c09f435a5c34bd8b0699cc413b513f0638f7fb5dc75a2370dd0e35dad415af9d30867d8469959aeb1cc9d0c8826f79bdedd577a77110699c6633dc455ce47265d6745c175391caa0000000000000000072a7200100000000b983bfd4dd9c9451fd68c98ca7d4eb3e01724dceaefb6b7a7b57a581c805b8bccf695f5680fec663817930a3b3851a65320b12892c00e76a2e249ac64248eef1cebcbfeb9c830739b2adc810ec0ef46a8cc540eb3f6614604681b05db21319d700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fefd28dedad83ea9a7a1e1eea6a2e4fbb678be5d65e4ba4e57fbd0305d1cd608b0774dcff1f5a8b5331bc20d711ebba84d996ddea34e4eafc24389900306e5a6dfce14ba041d187a7cfe1a861a7f4e062e78d3a996df28c5874216fa50fd838fb30991277f9caaf0867265d79c92de6e99e458e0d1f7ebc9c515c704647187460216d010307db72de842af1ca36da4a1068c85f59c0854f3e2eb91c58c5827d6000215f5be19455f2288e78b406edec1dba35633680ccd2a24e9175283b0e730c4670b030d71a3f002b6984abdf90e0f0905401fbdadad941b66190cc725189ba444c13c2c3111a19e4d83d2551c7c50aced3aa7b984486c78575810f3f48e6a2c9783030da6b524dc507d1f12d59b2f217b025cc43faeb33bc7259492af5eb21864b97a020fc3b1086b3ddd3b3e3a4d36667859fe270cd6355fdc09f53495ea81a1403f600312e75ad1113224f78132f2daa1afd699f815a413f36bf544336953dfc6fd624d0225bdd81cc0f993a144f6236a88e6e6f5318130c516a9f81f616e929b0454d7de0322df627ab5c6e21be9b7252dfc517bee449d8ebc1c0e1c2eb0705b94d23a78d402390f6940c6eced9d84a5037f6f59f84e7a6d03de18e337d99dadfb0bf3b6d38a6e5e8529cc42b862177399779f4fbeb4bb575b426e996b8581627d1b0b98a5a7e5513864df7182908cc716b8b3d67e3913d6ee9bc251ca6d8af38339d5c2d7eb20b9e8a454b51258f2c37293becc03ca7c3908759b5c808fa32e50b80e401c8729b70802b44e5a054d04e5709a36f780fc82e1efcf7f4a055933ec7601b23543b1f7eac20415d8fab64d16d991f179bed65b57fb92947c8c6673667bf7d61c4ebcf25bd7d07252c0b71ee9c97fc2edd1fde69cfb589d369e3e5b58c5280af03a01bd82d9672a4550f8fb97fe26b7f589992f1b6de7cd3cb925f634c3e16b51f9522d12bbfdbc8c49f79f9ed52b6c71b86054a2dbff76f33bf87876f8fec9ef9305367c9e9607088f5db6a9280b1aab01f315a9209629b2d25135bb095c04abfcb9fc20abbb97a8b641eeab794720232ced7b48589f13c9e1b4ea5944743cca1043136684b4c27a0902d64eeea75807ef8ac2f09b3b7f00f8861e79faf30489046cca98a54db7543b41c688c5e402c42cf08c302c3a955f4ef6800eda6303fbd5cdd293fb4f7fef854c8b216bf8c447850ee7e09fd987df32db698ae0cfcf40add31107766dfb485b3ea747a497a0dea0845a8451f617142e840ab14e46c2883a8f3d17b32758d2afba11fd03c281f821ead8f676a4ca469827a938340becf3e97b2c6cc705a61709aae0ed97551545a89f91b00930612211cccca1a16a559119b781441c398f0e181748bd1c99900ba91a5718550c3677233e82ae37a5c48e79292e0222b0f08f9726ab8c3242b6fd67a98ab7e955d6865caa072db5ace5e2177c7221a666171f411e49f098cb088c5189f7c4e6ab806e71fb2c64b6bf396ec347f205e5378323652bf11277a0982e706746e1462b4fbbf414043c8d9879914ab008264ef5c4146106bd471f3bec07bc8e89d7ac6e0befb0b80e5f90471b826abcfd79904e4b480a1d0f0fa3b7afd89608251af07804fe8ce0dc9ce8830e7c0f79ccd6831bddb1e1dac41ac9d9da0506f22e2fac85d6d6f138bdfd3a4f888e25b832480e0a3d6e0f68298287ac75895ee1a95fcf473b61a92e4cb2b96310cc77541d5936bdadd0144655e640a71d5784a3936edea62258e78f4180b1cc8567824e16dda2130524f6dcaea0070247fe279e692c8a7dfeef034748fbd1d156d5c6bf596956d565bb2d412f706def21c10eed246be219e8a7275982c618bc2c1b4c4d348040c7cc570c4f9ed7baa53c6d60532633cec8ca019f54f1b14063e1df08dcb23150c84dc98193315c25200ed0a5472f3c7f11706fb7bd0a5ee72a135d48d8256887eed70f11b253ab74f25f68ea20383aaf2f59d3f76198457bc51cad72cdd206329e181087e9706be79e51abc71d859a3fcd2e2be6791a63da34437b204a2bfa0d59de94ca7500bbd834c17f14a0d88caef57779a1fe24c777963d9ee95df60f2e890d4618e3c3364e916786caa6b1db93a88c6990093b4fdf2266ef039bee48ea5c25b3361c00dc39f454aba189f132c9f2b261a8b98a2e6419dc7c31b06d0a45633cc53d40803934a94ea38f1e6339d8747adfe50c9893e91e350f7baedb8bcd8a4f023a532f1e6700254ae383989d17cab69e7c0d79e4c4c26f8e8d4a75b322d6a5206e0a4872acb27fb5e3eeb96ea1225d076ec7f99c4e760de6523b33e1d1b965c23d5f95a4ffe73d249a35d37d785670709bb9689d2ef9750344b171b4c2599df554a6aebde2df0de077e6e143bbf68955a05ae476df48a11c93c26b1fb187bf242e4826c698d2bf9dae0d", "536a00516aac6a", 0, -389797540, 0, "bbddf0b37ed975393868dc77487707e5f92faf7dd24cc94bc50776e23d6620cc"], + ["71f8bf0902c0e4460f2ae416ac84e27731bcb4cd1a39997a87be3618b7a5fd1f12ce4e72f50100000007ac6aac65520065b4f56fcb78db169a886b191ed6c177eebb9ae7ec3ade43bd37eb293e36148c536967df04010000000765ac5253ac6a63ffffffff04cc0e98030000000006525351ac006a0c9b5804000000000452655263883bc70000000000020052f40a07030000000008636a53510063ac53629979bc00", "65525152", 1, -620424284, 1537743641, "1cfd0cae597311150de48278ba03e55c9501151c50b36cbe5f933b06b5a4e5e5"], + ["030000807082c40303079dbfe198e186fbe5f57af9bcccd9ae0f74bc3fa773fc51df300115a2689fed02000000056500510065ffffffff61c7831a54d903fb9fd738be77fd93409bb5399708672965124fc0d3ccebc90a030000000265007501080461e4798001862b63ac2c9daa5c91e635f69828edd0226a0415bf311b2fa9c7600300000007656a656365ac654839645304a583cd020000000003005200bd7276050000000003525252c3e90e030000000003636a631de2ec02000000000565635153ac20d6b3ae000000000181e35002000000000000000000000000b9e04544dcf7b3fad42cccd87175ff31b916c49cc4aa6e1ea4d7fba974f4ce39152b881f3414929ec8980d44367a5e3db61f3a68d46b4ec7e4eb1c0576c93eff3471e29da1d81f8eec015b924450301b653c03795512589ed80857524efc506c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b4e2bb5bfb4c3973c710e31e9099ba18ab2610f3adb583b0b1aae056ffcd643fe70d59aebabd4970ea2dfe9ddd83ffb51e74fb41ce3bcbf3f28e8560781bca24e42847ea69d8dcc1f8ec7812374561bf405587eefef70948bc28270f8bae4ad8c0155baf7f53ca6f0c04d0e12e75232897cc7f20ca561b35beb012117848db2503002a55b1866ac53c8ec7da6e8e9c8c6ab853cb50dafb64ca7d3f1d79eb8d2034021258088cb60855a604722c3342b483728309d92acb0f680bf2eeaaeb3f67dea00a0790e9b7122dd67c9a7527ab5f771089f09a0b5536ec883e60335715eb3edae7013e94d1e73d4db8698ce85039c960709d955e5604b4aedb0c7f8649230a059a0329fc1ea6fde689d9cfa7a9dedec04c9a91aa2144b00510af0a5478c30b22a224022c703083d021f2abd7eea7d21faf8dd497aa6d6d5ab52b5e0ccceafd3bd24657022b129970bcb74ba82f4353a8f96d6034bb5541092667c74365aea143622cb9ea0210c41c43e73b66450d963ee33ab9339c39960f97508c76ed56216f738ee6dc1e03305db90115d0ea5ba36b87963fe7970e16fce50700ea030ac7e4ad4236d9690289d2948162cd29af093acc75c918d35e1b123bb46bd406ac55ebd0655f875a0c745442a734aee9817aeffb0dc287ea42940f015dd46370c5fe3a4ba70261aaae349867677fd921336f39ab7b0bac87d3f31afcbe2b811189ca15586f83c634069de1fdad2207b4496b27d593fd513c89f2bac416577f74d1f6e73703e7187c313ea7429df7bda1728398dac29844de6ce194ce55ed6bc208371c55e487afc95f9078ef39c688ec66ef22479d5727a7c7755bf620949dbda4a52cd12d3ca2ec9cc16a7488cea67e952077494b96f6953bccdbeb7941b737988c668462dfda39e4dee96376c4ec358606701491126085981bcc263fb938e15eb8840de78c8147203080d8d97d60be84925a18fc6f26ccecf17d604eaa9a311a47250c10bc860709f7b25e25b45930a0e1d0e37bc9da8034d2ead8acb425f7f3c972f31d8d0df35e2372f7cb943c8790ea4ede3d0d298d1072a45a490c50868ad7d7073b6ec404397a1900ba8ec42110dd1c04bc1311718c172ca7a15ccd3ed0b87b10af5aadd78efb429a4ac40d54e53d9d1245c73862466f92029e4c6798d791369c353eb558dd0071e97172f05de914aab06976a93d6786e873ffab34130573d9ff168e516764ad5209f179cfb916e442eb5689161ae60d732d4389576c4edbda9cf0ca020db223be7c3ff194d23d06304b8691cd4697fd86a0b2830a95c915c7f81d7b2493c62edc3f4c0ff86f7cdbf5e9c995baf309d4e4154825a1518af50e2cef346a13683bb4e368cf6b274e5be3c5bfc65b8fcdd53f5e82f3ed990c58ab0222923058b1be4d10a29fceb7c8476d07857533a7da3050bdd45974169c66b35ff6223038239925dd0e9aee2ed23e9a5eb30cc11a3b2877c07496146626d69e4bcdbba91684ae89e8549bb79d3fe8479eba313c1670c35427a21efc068f5d1458e2ee2c89829af835ff523d66f2e17c593656e53be34ed74331bd76702680b29069f3cedef8c178dcbebec1222f87c2f8d92a819b31ae5f78391e7bfde49a14c5c23aed707d18f4daecb7bf8024ddd667ff7a6f505d2e913efd0a06c2496ca011e8882fe418067e46967c1036a871b4f9c0a45e7a0c174a0bfc909121f2acc2c9df4845b9b95953b7846922cf451e15bdda828f647e4fbb62366cea0891d007de9f3303abd0978794daa08edbac13b696bf7ebd3b55006a8cb16a366ca473dd96b7230db97e58f1d05ac10a048f3c4cb9459137023551bb2317324851837d0fd4c2902a4afa16b0939a92e521171635bf54fa1babb8bc8fa40fae4906f568c4a5d1d95e94f7e397111f9a8c8df8abe38f99d1215d4cc26d26fa64177f71120d6c74e7c2e3ef5381d7688f8be35073f1182a99132996c1e0f860ed1453f9f39085d0657300e940f2a9ba1ea69a095abd9aa7bb35646bc63def8671f1a618cf242a28ffb1d673720fe54c9f71e779d05b362dc52a25012d62c65406ebf3128831a420dee42c8d1d629eff02cd5dd953cfe4291935295b935b19f099c55bdec6314f0088dec59918302a1730e0f4be126b63be02e78611228af3f1253f85716ca5886d22d32c46b3c0b43056a17c132fa9462995119808018197b92ab9e965dbcbe7588e0859256067345c2c44e73e5ca15aa583c0e04f007339223d1217b47f730ea2c7b325d600e6d205acdabf22cdfdfd2a48701cd349fd7c128a09dbd7841951cfb0a7c77a83b39920faf4a61f6ffd814bedb9e629acaf60781e22f4b4bd74079bbc7a0d7b064c612c51af10e3bbd7a12b65680718e103c71167243aa98f6a350ca28df35348e417cc07d9130fb8afcb9e7981cb812109", "5151", 0, 1284679100, 1537743641, "e02a91df2901a41f95f7bc8707bb46a100088cf0b2c86746cedba315c4648be0"], + ["d1094b0b02117360f0e4cce05d6653a9d76816b6c0ab0df47a8299f3220a93fcf50e5785890200000007516351630063512ed70b6453123ce52a311ac8d8614795ab6a1f9ddcc7afbaef9a0b622aaa189a87a269770200000006006a51525165ffffffff02893f900500000000095151636a5353ac006ae32f4d030000000002525320a4810400", "63", 0, 183932446, 1537743641, "4800a49d220f7b420f48f3e1f6c3a88304333ae33276d6ed2836399424f537fa"], + ["030000807082c403044071918d6663c860261748cc49f7b48cd779e156fced84880375037fa5117e92030000000453635365ffffffffb1149f2a7d997d5d5f3bbc80fc2fe20dee500ab064295a22580ab91c3f4780fb0300000001acffffffffe4890766ce6cd813db40cf190d55e0f77e0f5ca1fd99dc9e4d69a5ea6ad6e175030000000851005253536552522835ed43aada6cd904231a5a14b66eabe90de4c6581951b3e60054fd10157a97872a47080200000006635251535352869381eb04d2c1590200000000045253ac5302d1f3050000000001516aa52402000000000351515258461e0500000000045365516506ee9f860000000003000000000000000014d3fb0400000000521afc27f723bda3d11064a29cdc41a089ad2fa406b43f704ba504a4f870808f29efe3e77b607e9650b15f4440f7b1cb80c87632d8f1ec6b2fd858167bda1fbb3b84c8b839a3d22484ec5304de73b0c44e52a9ab9ec389d079bac3602e551bda0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c6f6f8a0276cd7201c3bf0743cb7f1fad6e91eee421e62937d97690c413f272912c86142328a96172bd18c36eee142fb7968344d00317b4b0e5e57192bb48a777c2fff2f8f2f718c1ae1bd1c6bc814311dafc654a80434e0d4ac2489b658adec6cd369437c9a332474d5c1024d2a888e246bdeeabe26ac915a01aae9433b69032736afb640ea7c1ff793c0e819b832933033ef21da7b409b8bc63d77e50d09ab022f1acf4cb919a1fb7dec425547feccafe2112c3d38989473709a7de57267cd270b057418e15215fc389d1d75365e48d06d05c39e85f9c275708788ece45790be309277ae95b342d193d2ec61d0a6a098b7e93a5e2321fa4f360904ffadaf0fc657032c96bc98207f1e4c922d77a80093a55c02aedb682fa1a0db9682c7d4f6bedec003094743c6af3579c5c9a9543ffc789c9e6da7be45360a4cabd23b81a8e8a1b54d0322fc3a3dd0e6849f2f0702703f2878f1480e42f4289038ef2c370ebbc0b061cc0317c05fcf56d910a037dd0e9c8e3325cd10d3c361de9bce8c97cbf482d71bb4960316468ddbee0e0f2077791434b34a5c7bccc1b37075515adafb5c5f80e23da6d5b571268db326a6ebd8a5b6496b827f0201e628d2a399700a5c3dbf6eb5867a2d7ecbd78a4bc63acd3c6f3dbf3cd9909d7a1d7232c35bb78eb6278c78524bfcde1f16756ee5c85e926c3bdb95c044decb3fca9f4b71f1a3791b8f3bc09497a03e000779a666556ba079af1dcb8b39587ea3132e3738ef81383c056db0566a90b75ea942e534bb63678ea19b7e668cface6c19c934fda4365d24a3e05a95356a53fa1df2788899de1ebb527cb5bfc82fcdf7c1698f0e9f2b0219e202f0915da33071623c000c324413f9f7978cc94dc7c52a43e418596df18fb87b858a50811eb63e14ea9d0152aece1c838b398a73cc8e568d721a90b4842d4b7e8f9121b4cc2e32269397d1d6acb09d7e38f8b1dc02cd5808bf0d8e400d55f7663334660708c64a4b992bf1ce711ad0167b75a0f2d9d3c9b02c045d66fa8911177e169ddfcbbe05e83aa5026d5ffffac33d60ec1715144fd657c73279647cae3700c92b4cd31a628ba711dbdbbbd0feb131fad9400f0dc73d20cfc2a3468b652fa665ecdf28b9c36256ffe9b18b3883da68b48358d49489cf7cfb7161facf64e8eb7e1bac422612bff82a80c08c730bec87a2ad7fa38f9fe49f82a2b4c4438495840293a20a11efc4c3ecc5b5c1120450b599752b9b6481e33637021f61b67236f9ae4071db8ebaebde7c12dd11ff33254c925ecf77a96a24768e153a63f22b49fa830c90d5223af028d2ddab6732849bbb503f479b272a9cd4371bf4967d29bbebfff7d7d7c091ae2fd9c884d580f7958f0d996f811a659308eea412464ddc94d6922cf2ae3c6c41e2fca1553f0de88e7b0606b56e9742e19437d0694bd30b6ed83422cacbc074d73ec684508c102c8f88a7cb174b6d704d9b29e718e51312339c10de37efefd62f722d5aabbc44b5bdb3b2b7363082f3e0b03472a3cf658b62666517bd57d250d5f02b3c7897c1e3d541706233bff3cbbe7e7ceb23fa08983d9d0f83e745b1266f814227ad3a7a73e77f8f3b0e75ed9d5356c84bceb8b211c3465447f20143aa7e59a2701f8d6e0d57b432339bdab8952f8168aa90a9db5e013e5d0a7e296617aa5463f1c217c420e2060f6cb805a842c0934652146d2e792976835d5b984f8f605f16d7deb0e4387b81d3aa5dc22b1d3f8a1f0a3a16d8579a06ac60b49a22e05eb263ec5ff1af1cf8f4305a67c753a25c7ae47df5d361b825ecf04eda197ead4f56f15c2d61aaf0c9abcafb177aab868c407047a2928b19545864bb3e7e2e4b4c149d2c53ba8eae045e392da39ac2f5fcfa4c8ead9462754474ffa55eacba86e538c07a585dc7f9fc72826148cfc730c9870eb2faca76c96546f9183d9aaa5a927adbc8ca9aadc3a1bdccb23f8cf022291ee467b9aa9b769923d950e300001067b20c66b0002b810a0389e4b1ad359073eeff774e59423920e539032321586558498f9dc3cffef359081ebb487aa25f4d8ae79d4acf50a49f2cf7b4122bc91c5a4f04e1dc8e417f9de220ea405e124f718fc04b5a72533d075e078c51c2f169ed1378397663cdd69e6bbcacd137a20593ff4bb3465b41f384105f63f38819457b462a2c6df8f689f5452d27366a46d6abdc8a94770d20c54c0a574f30776c41e141389b6f16ef831bc5cc9385d56fc925b7279c51bf17c002fe6b17c8c0edb46e5aef81955f937931c5ff3f6506d40c340000000000000000dbafb205000000001b030f29d838b0ccb2a515e9eb0e2a167dc9f820ccbb4a71299f28de8bff4947c5b8214a820dc0a5fbcee48a4e942b360c0714cd35690b7873a00aa0730269886907a7933d9454dcab83a61872a74dc91850e4d9a6fe02ed32e4ee56752c235d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000031679c5093719f316593520cb0bde2229329179ed2edf88aedd04dec9824e44db19fccd7b2b9a713a4bd626bdfe78411899569157b0cb9ea30f06326a891e49f9f9bf6ec8bb7036c2b8b6797923da304d8dd0637e1f41ef07a691f0161e04b1a1ee815e62410ac1e8593009ecd4fbb1bcbe0b6033a6403e89a36f200ccd210d0020434d01236db8ee8780e47bced1f5c457029116886b5d1c7735ece6102fd9d9b0200776c2b9e9fbdfc9ba9115340f3fad155de1a7cad387abc0d5e1202f20b9d740a08d4a99effa3f7de9a92743be11eade341c3d322c9ffa0c225865d3c40f56e3f03059ef369931c9d19e0db0a114db2cdf41f2c9b600feeab7e6f010b94301083020cf31e565644ee9ba063d34cf55c33f9130ae2f01caf94a1c5025e34aa22b77f0221be7ebb451bfef81874d264a550b8b718be82f83ac4d28232302feac477f44b0218bf69a750bd956783897d04a4a1573ccdf198a8646c53960281ac710ccb578a031bc81b90fdb8b9f110fc229a3f55fc9c7cfdb160b99d3ff5daf09a5b0a48d0c20224d820680061d914ee7e8a21dea9b8f8c18d444d0ebae0460943a26235435e7fc62ba0d2d083681e2ce77adaa47a11067657a3efb6381875100695f779e1aa2d4e55df82be16a0e5c6fe5dc57e3407439977e6b5c214c4ba3715d3647e7970b9fe39df8fe3aec43b0529b5320b8ca3214f1b1eefdb85a356197a2dae9a4aceea315e490e2e54c225250778e7c8e0f81e78235927d8f34cd519197e8e217978d0f8f42ff6833edf77a3945736cb09f673be711e0f0ede0541ca395d2b900258b5fbed468bf8c40ea917f754bbc3a8a093fb2748d059dd7f02ad0cf715548a1a97b288805b4b2c2a25a7205410413b03565eef76ed789d98ab547172e3174eb664877c31056d204cb3bbda4ebcfcba61ff5ce848a36913e73c048054db1c3f72c6f8d082d7c135a4a477f945a21b8f544c8034f36f0c6003017bcf6788ff67b81bbe79d5c3d8d4f2f56feaaf4b0988ecb7b03af5c464fbd7d767dc8141a9d4e0ffe3d1247d6086565f01de974c5c1e1bcf392de68534d9bfb6fc2606a57f9c9f790cd4688b292c307367f124d0458240123173ea170d53a71fff727271354ee02beaebf51ec903d693456a2d5e26f5eea455ae045551105148e8eedb19588b18ba8df157dd86797cef02f6fffa874b70bfba589742b24b251eca134646b12227fe7f9905fb82c43c0fe15d550699c7b0f6c77cf2f537f376bfcdf66e783e20d022c7b254a4b2183cd7b01d7079cf13798aa0ee043886b5222d494a29247edb369ba9876e733c43572904ed437b6c0057a342591e3f612953eb6bcfcc3b71c75f35907c7e1fb808f3b4bfd20e6bdc8f0fc39c3830a010c7060cb7ba613c70fca30be248943522ee89be560f6e38adc58737beb2e44bf9cb3dfefb62989c56a2d029c3558e6e4818495a7090874257df344469f8f6f8c55a877f99883b4b0b6660c662830e640956c5649942cd93933f00a99bc3680700d494e232ec3c1a540af033a10f067d51b14591ebba52ba89108676f08871fe6b5e026d90a92e0104aea6628bcb5cd4eb64337bf0b25020b22354b8a0f66f18bff0fc55d0fab6508c5989ea6f6992e64a960581e218dc1843fdffb9732cf2ea0b55497a6a733f3896416f2e24fc787193df33a79a7480d0f1e2d65841d10f5f1af032895eee78e59ac321dd1e46771e63d6eb83c83fcdded90964e0d3b07059cde3cdabe57a7734c4131229b9938a2311d209be00f5ceaa26d4148703f224e6b76dbfde4fb11b0f6c64bd588e7bb88965e5a4cfbfd0990db3569aef0886ae8161cd993efe69f1b78aa666934bd0ce925d14b61219ab7fee8b19eb17d9e6de77ae4263b8ecb0f7b1e30c2411c5f82258d344bcb510d3593f02b859b9e3b88978223a42f95d017080a6af7dd4ea64e268b03e188762a4febae0f60772e969b47682f1af12044fb09e9c68e2a7b941989dc15e9c56ad677d16041f2c7b8ab6304e216ea6e898448f883c2fbba87dad4bfaa9720add445d258af42786c1aa9208a997c7c1b387917fb19329fede4e199a682cb94e780b4ac24e1797d4bfa2d26bd9b588e87f22e7e026b98e9743d0a6a82672b961f6c1d72b0ceaf5138ecfc49ca88ad89972ba2119fd77c407f0bdf1deb87ebb9c1144d66b8b677aa9e2600bf03d2a6962d20d3541b262f5d57ae42aa69b5c9653831cf921b34657c85ea1dd3ec0f175575ff98d92089179e3dfaf0c1c1d1ab679013ae41add7a282bd43229de624f04000000000000000000000000885ee158dcebe93f9dd33607150cf953cb008b434d84159312fe4d57854ac3cd57b2296574390c3eb28cad7330d2670f716384b265c4e6e6e88ab09cb5cc3a0fb3ed5a17bdf7bcbcf209408b117c50e3c7b8b046a20cacd2810743c12d622ea10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055b821f8a6b9c87864bc538033f19e27ffd22b43266ace61663d0481cee154d396f478f91979ca0ac4316774de0eb1ae20e67aa9685d22602a5186d31a52a830842af538f7cfbdd0ece5ffefd49dfa31f178814252b8864956e35c22486e8b3dec64fa8cefb0f5712f06f731c39bf23d4e285d1a5ad27191c168edb5b14ad8d1030174951695b589076d1c8eef7647fe0fde4fd379105c531dbb0e817a2565f1e20307c23b0d449e3be254cbfee89f272153f20d1a2e457c321f72f5dda63b569cf90b00e4697a6cc62944ac21843c084d6f4cd5338afa1716379fb3df4a69ea89ae0567d5800878fc8be36dcdda203e6044300ef80b6adebc3d0943a434630a6aa0980308ecefd40a78736046e0e380b41573d3960dcd36fc885a466e38e3755f35aded0304743dd25e65323662bb9994734c692d02bfa5583ed070472cfcdd5e25fe978c022df00b51646b05d09683e206905278ed559e0d17dd92cd22235b40a05cdd407c030fc2d1841fca5143926b2c0424fa29d2ab2b77b833a47dedb057379333fb876b021efb7ff64eeb696bb010f713321aebe701a29b9f496b377403d97973a28e60c7f22859b3a871670a4bf9b12b42bb912a62bcae331a55d72e9ef94cd468e499b09529c51f73255aa9c42cf685d6824c1f1847d5834bf9a9a6a85a4ea30802da1323fde222ff68e5a98fabeff32df7c87c27c623a8f476b0f278a88f37ce751d86bd1b60e86c349f129921c6e06d2ac114c7bfb6a8d0645d5d53b3bbc9ae4489ef729f9e9a8b8022e7cce57ce7844957f01d50e918fce751cf65849fa52616bf8ad5d3f217aa4c6924a09cea322d4f7f2cbbddbaa5b25abd8c20c2ef736a2daa3e347a05459d98a9406fbd6a9f718ec6f403591f0d39f6a6583d232039e4040537c90cf24141d73bff854d23a6c06c6d29a6a3d5530c4d40f5dce3974c336ff2ee1ec67b3aa197f75f8a3454a62f3b5f82ee05b9a0bf4d3f981666fadb4b803d57aa8e1389410b858e28734605f1d1fabe6eb743eaf104da538b2147dcdda518c5fd19d19e1493a0ec99726173168c51553f88a51a348d6a9734f266946c3d5a5319fb4bb8ccca8a7a594c2a08c28730f450aa0eff13dddd240141267ca1bbceb1db88722036ee723ccc382a7f323c8f98d48c26339be5e0bafdb93ec429a3a149d5d1548886a5440368834cb8a73142cf22e29478f59c502a37ac1ad40d2d18d71d9f33dd479c916cc65688ede90fc6de6b24ef8aa156a823185315b2376b72c8a800c5f23c70592337a6f9c1bcf8ca97b21a777c302ad77ac6210eaebfdb8d9f1e9767027b81c76c8387017e9ec84ec5794ddead3e7f4642982efbe630b04e309b49b0e84aa2b2bf8fc64a85604ced15068cb12f50f8fdefe019db949ccd382e6bd24ccb77e58f9635f91d0b379c6756176b7cb5c4090bdf7311aa0109c5d9d15581aace7e49d647fa2e48f0f192b30bdb5699805b5251517d90f47379f30e8f3c9cb97eb08504819e9739b3ca4abd97b7fedeff3bb782f6d3950119c3f53029196e51dae56603ae3c28bc10a6361182908fb7484fc56efbb3c60df831c7aa685d54ef564250e1af86fd2066aa9a8ce45fbdb8fac2dd5a66c05ce6443071f6417bf29ab85423e64d6e565c682395af53e242f72ebb4b17ed2e170533ec7483e34dbf90a98327213aadc73b7d1bd8bc0ba889d083cea8c800cbe3072fbe3da3f333ae96913ef8ef5df4325eda0d71298e402004361f9e1e909fede567779a997481375efbc1c8b506df4448c397c6af09030d5bd656151c12c646842c2e0dcf66601a10ce9c123d433dd7547cacb8012b0314dd26835674f322c0da46c12065e8fed77dd37e48d1a7449c35370c431360fca6cc3245d6be38ab7c9b9668137136e2d0a6cd8829d11c44362d1c16ef59fff3d568ddcca3df79eef74de32db96103c86a3a7660052abd4d34c2484091957f4b0fd5abeb15a1f6987dafce1474347fb7d76975390b6992a7582abcc918a7acda0bd1e4d04c20068721f2031e1a9130f08a7c8751ededd71ec50e46c19527ddd2b6bec9e8578078c161ac663e030cdf8b1bc78960b725e7703a59464927f8424f146728e341c155104e275f6992673343801ae7d5a52e113eda6cc11fb2ffc7772721bae1570283d426769ec66cbff43ad5b295504e25cc5eebf447285d561942e739e6a2ba85ea29cb3f1389a28e6c5de403a8e1987d5664e657b8d06249575171bccdf0daeaedd346feab12182c40a7e2f132c1edc2041c7cc562fee25c2ccfddedd2760888da9a40dd4bf75f9f15be7d40f82ea69065d842b838f72549bfd92789c515d9d462977f43601de7bda1780cdcac65147b85b30f67b344a5b3fe323de29ae43acf2370854d01df8fe7461710022a2b99b55a6a276959dcbde271f60d", "00", 2, 658863945, 0, "5bb35a6bd3f33f9a47b656019ec7517beac422d4232644df54cb6850de5149f2"], + ["030000807082c403017e7f4e01b5caceadef4debb4919a864fefa0c11ed347e24566d5ab076f31cfae000000000153daab69e5017b38d00200000000026a65000000005d561e1e0202dc2d020000000000000000000000005ade84ffb04a7cec6073d4f418cda7eb46c1ce0ffa059cf4e1a18f75db6fb2a69ba10da09815896cea812099e603123179506d00c4818129bf52b7bf2ffaffca2140aa8fafeefed912364e9596848bc4c84443afc5f2b6745a73f26de1868bb300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cfea7372ae43f7de9f7defb317698c685eb6af5396a39157276e0711942b254ef3e5ce83470f648e6b00c7bb2062faaadceea9648ff1720269d0a45c1cb8ce6d245f51d34b5003568731c1ad8665b4876e8a4fda2230a0d38c138019e817f26b9638af9d75bf199d1937e7a739fd098cd662a4dd0e1e3589cd41e75043d016e3023007b34487558f4da2414146cd591775528bfa4ecb55cfa435e8c1b47727d86b02104880da14251367e96e8f4be9141920959865e829d0650b1616c3eabbed2a890b07f8ee462aa68dffc54d55e02f7b39f6dc1e64852ee47616f1a59a44e4054e793ee97d26ca1e8ec80b56ad2e1a2d0628f4eb2da5de9559c5e569807f91f99abf0300d718ff06ef560b3627fbd49dd80d484eba68aa9e4d7cc86f7cf0051b987d6c0315f4b8446ccc0350018299ac9878c4bffd36a6a5f34d2d4a4aa7b1397323f63902107fa192946921ff26e82f49098247eae1972d62d8a2dccb50239d183c901a11030c2de09940a8246d27628d1e8d72a9247c2e1ee581643c807e0d416eb911de2a030244500240a089bd80de6b6dc85dfa9dff3ffc75ba3510f9320cbac7a7faa580c15cc0c6205e4f713ea408a60d9cb60f18e86b79fbd737b659ecb20bceb0d8ea3e2dd927adbe968efe385eff9dbbbf700ad7ecc86a8f5680da34b71dc362b48044f8d36bd3997568f161002f7a62fbda6b9dc7097510a037296a7305f8df700d15db0959f9fa4d812950bd245c7c105875b716f00cfced91d0b3ceaee6ecdc5765386c0268e08cb09e60c801b8d1f71bf0e4b05b66603d763f862eb2c4ce71b45e3bc7e235f5cfd4aa4e5a17c92e6e387f66e0d6bb53dad2dd9714bd8a4950aedbc66006febb8fb6dee1ac7753c3cb4364ca6ee0665c63f374685209efd865e56fea9d094fc8dfbe0b05164d9166275bd23bef8accb2661db245f33fd14911bc6b824ad3ce9e587a905c739adf52949c48b297e5f318c3e634ed07d391433f0bb826da2389b41d05c597aa9a7caa6b7fe4122e89106e6df28c26509b5f2f29e02ec3ed40d072f173b9a743222c6f77bbc7eda6d058ab138ad86bd1bfd90fb5f3595142dc924b546333f754611855a2a54c8e11a6fb95b3478bee84d2cd6aaa12e161fd9cb133112cb5acb54da857ee109e63a2d1bd4483a3234db5442eb0ba2612971a7a91d108cec0fd8caf310e0d29c53989c2d87b7ccec5ba80a8ad8229e538710567081738ed64510a523cef8f03410d7ab65862c430cd110782e28acdaf0043928be13683a8f71b0d21ba727fdc8eda0ab52dc3508c8bdb4aa7120995f0aeed1e4913abd18cca6e068a17c9bd61ab62609ca5fcd566c2674dcd2d71e5a3278a775e369a38853534262e233390cac64010c30f40a570637cc92df3e14e7403d9ea45f3a761606a8cade1d2d58e7c8ced7c95187782d9d89a51ddcd1c8cd9c309fbc2723b56960f3927af6102c8ca837542fb5b7931780a8e69c47c6d24f09b43d92ef323397f1af6124125d45a1028cc64ff4e63fc61faf1844bb438d6416bffc535c151962895180b6840d795961df052e5c7fd39ba5336d1f2d32b1c04dc03af9d918ba795fb4b03a8f00b78758f3626ce76f79eac9e380384aa0c883990f10c69a53e57198c4a9a33d5702271154e3727ce45f1e9df6e2d9aba705cad78b082fb678968c527c72f1337d20079011e1a6d18d54da08cb35500c0ffcf0724c08588c9d64c078a55dce5784c927090dde35772afe574bca9ec5b81ed46e84e476cc4f8b40933ab320da04e0d3082b6d36205ffb7d4f442f71b8ba5579074f9a8d808806aec396e85861f0903f9133e0ccda1787bab0606e760556f952d077d96b72024d225d9deec485b0644a4bbdf503860c99882358acf64dd93cdb60304ade2df56db107d5f96fdb76bc66801a2e3d18d55bea0fbe2790f3e26476cedbac3bd69ad6335d3ffa054a7f2f245648a5ec2290b984f22adf84d1e6759705727491ccb4a8abd3029d8dba961fdbd38bff51d85f38447f2ce118bc6f4064614dc91ba93223060fdb69bdf1c3ab31268bd322c4703dda9e2e05c2f7e596d0e6535c793e9eefdd843eb03075a8bcd9ed15dff01b19d042194c4f8fa890645ed790809c9351610f40601eb4451ac876f3a0b20ce7f0648d34cd1999e2cb5af5ee647f40b6590682b680340793659973270ba2870b7de70a43bbee8e98214ccdce6c7c2c2dd3f0d818566c4b491f166452daa8acc7d54dea24c4293fe5de47d1bad65719309057a0a9eecf9e2eed623cfa6a2990000000000000000c59e250400000000f33b6d9b2a3c1589cc532a829aa4f05043a278597c84113fc1fc424c5d3fe5dbba517586ffffaa50081343ef8e7cf407489743a4eba04768617e794bc501fd059e9b3d4fea89c41c9a925d9b6c8f0d7385081fa903dd38ce768effd72fee015e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a014454012f5df9d5ace838db478235a1bc31d43b5746b5245124d224fe26448bf95ca8a56175199de0f42746a73ac225e1af369d0a020c2df7e98c0c07f6d9feca2d4f7b427478c6f382c30987e48a30476b20381be09656d0404c2665e764774dcf0b9212034a961f33f6aa126e24dae4df1ac40f86ee02aa72f41034d2a44031d304800b8bf1f7424a4c7f194a9c21f841afc4bc680a0f415f29f57aad7b39e02202bf2df6ef56df804680e6b512f3437de093987006bd391b5589d64e5f8803b0a035990d3f0ce92acd2245d65e3aad7d67ef3cb6eb438724bb4b6dfe49a159abbfd711ee78147a4a6f2514dd56d5c0c6f5afde4506c2d7d8cf3c048645b6886c702249fc5553f4b156b10cc646e43ad6e658852a8f11777bfe32be1847995d50696031fc63b84a5eefe147db08277841cd73cfc53795d39165ea9e2509a452bead7750218edf63e699157a0fe52e7e4cec85ac4fb0456ae7f7d8b8cd336a753ea3928a20207690f4605ce2d23451b4177c7eb0d3d2a16e164ae824331d9d1a9b90342b538021ff4f0c6cc19f9e5a6b7385b7fc903032f5e79b2f57e8fdb3a895c1c8cff96e37285d9cc7db6e3cf4c698f3cd048f2c78195aee901120351511c8ee6426849c9494b99000942f626f13aa4a011b8a5304b46516229634913e5bae048c5627eb91516eaf90a92a06e40f4e6def81d87aa78e4e74837e531b21f88e2ffaa1fe71153700ed0d926f614f425cf70a13a0a757d24f0d0cbb8d6a42444175258b39a730275f0b904d04fff8843766fe9dd9fdd1bf267864576b57cb3eb0895eb279f683fa0bf350c2f5874b1b8f7b1570393379cc2d4f0238b14b3d21f23e74db6e403a699df00fc76c40c4722bd7d0eeeda84f13c5252b2fcfec3e557a2968d63b6d05fe567b67a6c42c739d93a021eb3ca1f1faa449c67a97b36e306f347b4579f83094dd1ca2ac7345b2b8c3d486006e3f5b6dfcb3f420a72cd8f817f88cd76160fd41cce55a143bfc0c8b31aaf7c15c73c1e484bfeedc3c32a7c3ea7772eef71d1d6f84be00a6021045faed139e5cd975db7c5c9d9302180fdc75f9ba675522c7eadd12077c503f5f6bc220a556c502a85f1d811c32d25b6188125ea00cd10beb3df5ab348b915bd8601a00ebbf3b9ec51686935e5dd73de30cf8eb6e25bba5019748f37f35ee757e25e3c467167ba543a1b918f08d99efd9d825eab615b5db70a4b39ddcdad79185499363ddf59b92c40ec2d9e75b2d2f2eef2727e04850cd3491f94ebab1cd7edff0f5f98785e1e364c2a809ecbc97e55c71843695a4def9864c73bb86488d7ea8940acf5a4c687ece7d1a7c64c27b9cf065994aca148cd1eaca50fb173866ad729d23dd87feee2ba6241869beddd3e7a855bec054cc7fadc0d48a6d7abe2e060ac9e64c6b2e406c825431cbee23e03cb606db6593932a991e2dbc7d69df775bfba92b685f1285b9b74bcae077da1acb5a1effd398781555f94a5edd8c505002cc628cb7fa3c03217ad65270526815c173414ea0a1b2965a41b9f5446cdce35644d37b90008030ba41f6a4afbd17d5c5de45ad801d8a5cad7602d23ca0fdafbcc8db959bdb63d6c6c16694324056fd088205fea5e9f1960e2581ccfb15bb9b0b62a9de27be37320d1f5d06c41d33e38f8b67cf17a9515f6f996f34a8ac3a7259502a92dc8fcc0b2f327df8f675ebf9ddebd77d627078885d0fc1fe8030b5ae7079020a3264ada95e9f33e7c4d2d1f6e87d6a2bf802a92de7fc4e85859c0d091bce5baefefe1dbc3af8400c8b1e7b273f6e06faa4b6cf4e34749973095cdd3fc10601e5414645c2630fbc8d95f1377122c97f1ba28d51b5e1865775b59930db415a47fe3e7b1fb0ea67111e2bf91756819835b7ecee94711eabdbdd1eb91029de955e406688d75a3a8bfe9ab1af9d1ea49b595db502ec00ef3a7b69751521c77f4912d83ba1a87fb67ecf96a0837579c339e240264e7aaf78511cf7a688778b12d189ab6bb703fac1c3021a6df47728bd4187001a85048c52c98af963a8d2b04257eac18ecb32952ee538da2ab93a84fec09807a070b1d826ad682a577a9b0f075054ade85603f6592dfeb18f1ecddf90de03208083e1e1a20eec70529d15e8bf4a773f94754c605ca913fc342e3b05e25ecb0e0f4b5b5560608ecc6ceb6a3f3ce349482a254502b833a517bb6e846a7765562294ae010b30e9f34cfc848a742b6e81be3a71d3a0c33277f6afde0787dcdb0cb47ae06e3e21a8775fa684b5c3e425bcfd51ae241a641c1ccd3ec06cc7bd5f04924fda8d306b1131c303896e4180fc435c22b8248e5595456a6a1c2508f8c80727a54e862367f07ffba4858883132385fa89d2078f1da7fb33f12b88c8f06bb88dd683cedd9a262e7fc56f34df3289c58dfaf5535e7313c7b07", "53516a6500", 0, -458615217, 1537743641, "f8331d3057c62ed7845b9e97ba6032bb05da87a6cdf51ba855d43adda113568f"], + ["030000807082c403030ffc42325fe773f2c81b50ebeab65359411c5514d8622f601675f6b9a955f96c010000000465636563cd6dcc5f667a446579ebe3e87cec047b109baaed75f845365e3f2468ed0ce7c5aaeb8a63020000000851ac526353ac51658e274377784e869bcebab12f8ddfa4ad41d2311ca2f733792060c58dd25cb1b22cef5d9d010000000563ac52ac51f931f86b02c5edf4010000000009005365ac65526a526a75f53202000000000153d0a4110400000000010000000000000000b4636c0400000000eb44ebe3e950979ddfd0e1e66b878f9cf0718a3daa5d4192ea741fbef070cfb7f1279a066363ba03325b8b90960e5b06bd32c595beda3a35d1af394b0c9d9b84819a9666997b1c9ffe4364d874a8b785cddcfd9260754cfb8783fb8e7bcd1a0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1293810a1a1294d72b40b75a7150cc83b3f3a939bf009bed6c8ebf90b1cfc3bd065c8906dd4b87c704f003569833fc9096bf126771cc69f5aaf2be59b1c9d9e6b5f2d20ab4464d96257c14e50c06699f488ed749953e603b97390d1bc6cfbf55e30ada60ab42c95c3e884714111034abf51633cee4224ee3a461dcbdb9765de031eaeb387865028844e1b7910c94a964964c95eada83d3d29f2d16b363e971f8902252f5c050f5775e75dc265729ab6fa8a1066de91b256a5be377f4b5bcf4851e90b052778fba1b8042d46aa4e9f2453695764843c511dd7d1b0213111f43da6ed97bf92000d8b00014df0a913559eeab1d00b7e2d5658e38a4a5f37cbe3659d5dd0032f8b53d7b98d932ced095a057e0bbbabfef0d4a74537fb164d3e6ebb457c9a5e02123e19d3d4096ab345f5f0160b2a991a290a502d50238868c76618f67239bcb8022e02f50a0553c69f5cd5c39331def5fd151e5da39f03e95df312073824d2f0f0031016e9db6f79974a4e2602fee4d1e87ca39363bb114a6e6e87a6338e8458c6e4030749b511f040fa40435fd01d5921abe217e7fc462e67ee6c80d717ca4746306f73ef7b8be4d01efe2435f1ec08bdd50bb7bf187247e715d165bce7253231a21652c0c4e3d9371cc38c964e63525f63f88425f8dd7dfd5b5842acf44502c9bebde39875a7000725b71455adcb6a032fd2e7b0681588e37b5365c4dbaf7305d1c451c5832191e842fa556de3b50f45a49abca68cb0e1168cc0dd941931bcadcbb6cd7e39ea71fc71067203abcc30f4b10ed1bc9209df8c46ce3a004574813182c56d735431d7038fb0cabe958c7d683bb43807f8e14899556b709b40cd9e1268ecd038e6b167ac9195a7557852e0f074f0077fc260b5ba4f3704c6193a57c9b325920395091d5370a7718e959c678e7b4fba93d8e04538dad003cd3ecc3300947470f534e8b291bf7faa5c1788b0455c46c66ef002a008cc707abc9c6e27b3a864c988cc42f87eb8654dfb33ba6b3bfddd565a021f141baa983e331a5c1809f5321fbaef6d22d74c5362a79dc659706c861363f7189fda3d351b72280f066ebeb6de3100192548b9c11b53bba67b18b8a37d845f46c067507479abbc1e242f9431217e39a65cbfd5c7e67dcdc29cffe56713c63afb03dfababfdf710ca74b5855d16b8f92b6dd324e52c10746d77300986da47126866792566b82ed4e8f0fb7bdb61fe0b3ba145741f81a8c8e6179a442aa463a462dcd5d606b62f5c97450e07c788024b8d3f609f354b2d2e6f8f28a8259f3709a3c98350a74a4c3537bdbf5b980b964596a5ddfd3fb3d0a726b028ad1ff7de38cd8fea6d951a8ad615cbd06ed2734d0342d9a18183534246b3530f7fc4d7c41b880d6e2b879b2d6e2a4c89c6ba3fe212052887e20e79a68e4b9bbbd3dcc0492171ce34b526dec89e9bc794bf91fc0ba84148203331ad7b2a0d91413287584003c5dd88b4480298f68e935dcff5069daf0542b338ad3b30bd0e1a5bca2bc375dc4f6d6437c23e435bab85b0b10f3eafb9faa354a6db479abf44d3172849c0c937f7efb7c5a7cadfbe49dfa76b190e2429614df7833455b9cac20ad0c20afdf1216761447708e02ceb6b534bea1cd20438b17dc512b4bf01885ff870bac43af3ed66de0821044cd7c9dcf845dc73f760a71873a9ef8540124ec00d5bbcccce6b8b279982333b0d07e023e8f45ac16a8c7439ee538a897827ce07473da21578b7bb073201fa355c0f7431fae8de3506942441a756fa02ca0de97985ad80a375eb0b26a5d55336c19802ae2fbdd2ccc404600f29dd4c866e6dd337fe41691c2a04198af9db10e5faf75de09339bb55adf47ea258806a613fc5b60e1e28d55c4f279d52ec44681c1e75eea9ca82041c7986ddf0670ef459fca03d14d8e0f52edb13a2b564f2012e00af4c736c26c6b60839fa6cd90b872a0b2a53dfb1a0d08e536f6c06076c0ac34b1fbcbc1ee5657050a51cac8f4d409ece48fb78ea992df15af970f2949c6c847da148fa9efed2d972897f2d6cb2fe356dce3416c5b680b67271e7014f12b272af7fc60b04c507c1c41b2dd1147544984c19325138f5823937791447b0978ce19bb94bc8ef9b6847ce22713904a60523144f126da4a113577c80558f8ebe9eee81934b585d46caa42cd37625b528f56d83b36b78e5c67fc6ac93bb4434dc1310e542cc12751ded13aa72fe4c64816271096e9df21d68d6fb7995012bb086d649dda54bc6b37447afd3128edcf9e098526ef3b70a7cbc126141283bb4f8c9774e84427f3d7b1f0d0c7970b5eb2b54d526b93646acdacf8d1f851e65e672c8761affe53cbc8f08c367dbd059a7c368b24d61447c992c62dc74d82bdd4f494bad141af8d0c971ab63ce2bb64bd8441e0ec275e96357330485860c01", "ac516aac53006aac", 1, -89765870, 1537743641, "b97a1a3300cb0e11a5faa498da16bb625ec0f4e2f8bbf6ab220ca0dc0946dded"], + ["27a63d4203fb9f437234b7b754c2818792604e25312374b68c1491bc02152c43e50075f49f010000000081b35da3f6079cd5b217c45f5660b41596746d18a3b85c9ff43ad3e2034e3636cd43e982030000000363516ab0b7fd6350ae076b5d6062b82b38edf014e6d8fee9720355c1158dfaed5096c9e499e973020000000863516a5300525263ffffffff04e69a1d0000000000065151516a0065fc709c05000000000952635352515253515343f5e504000000000100f6eae2010000000007635263000053526540d47b01351a1402000000000000000000000000b1a2b16140bbdb6342daae0fd3b3daf6b935869f388a274f99f7efd5fac3bb883366ff8b3c128e57d27fa8f64b0e234f6f66d09fca46ba347f5c4e54909129d6b37191b084077f70609817e8089d55d99dcf05a65f5231021b7bc728d15311cf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f210673df2ba017ca78299ba549e7c9c06e950cdc48d8f24faf8bbfc9cd37e1b903eac3e2f382ca64deb8b7c49bed26c5f555b90b9d1e5d274445ed73d758c07157863ed7b27a97ad232a5d5fe399f4b235680ea35c719af51138a489e6dcc7514e9320e352c37ee7e22607effcf573ed8ac4e2474104aecf9f07676ad6f1e4a020db6c1f43e4d50495467159aea6726059617c34a96e0ded97edfef442d9c78ef03249f2c840a0d3e8c1d58aa07efc56706ca85d061a26c89a9c534f652d7bdb1b20b04d025352084a7ac767725d748322f9b03787f522f45f2ad6f4651612eefb8ac1d73825b3bc8824f82788a55c82b7e640b58f60879b49f2913ba21f28dab9b15021ac118dd23a6cba8dd45531cab1d4597403898db39dd84b62267d54c220eef2f0306f0be04b2c435f770083c5c9fe4f88caa2f71602d325a68aa6534082123bad3020f5ec32301f367db019c9c00067a2c9d7dbd97da6b8f0552b7d220e3f919cde2020c4aba791555a37acfddc46de786bb54574ba492ec02410f7f41fa414e9e3cf203183f87928062cda659f2e2fdef9efbac42190560d72b50f5d950afa5608973b71f4792463e4da58549bc80503cc6a1577d736b4c5e0b4700c1f63c49ab3997ac8c537fdaa74f0964bda5af674cc1ca6b3849966b19a33a2b9a83b6dbbf1957892f514d0264cd1ba95031d572c3829e845f5ce0a00b3db95fbcaecdef28caf545f1a0da140c53f3b2cb239caaea28e6e4722ac3002ca285909c77ce38da05a43a4e93ef591d6b461ab503adfaa2024d506daa7c17b6768e800ad788af56e8aa90ef8b7f2618a53a60852db4fdc4dd9f02092d772823e00ccef9debb08ea70ece354f7644fa6d7936abefeafdc9b0eec7afbe96bc082359c917941bfe931fb64f8ab7e910f0df3b68e6209dd8979a9f454013ea4f07cd26d00f751915a9409ee20023f8c0564c071095d9794b2b34fca7763b5f38f3fca6d32c7a93c9a1fe37ae872fbf8fb6990252fe69728d79d5a569864bdf2540d5a774c0647a1aaf464b8a0046af977e19f9427b38b9c85348d94bc36d72dc1fc3a62e9562c6f84935fc6fedd758d008644eb2dacbb50c5023a96088f355d619ce82675eebc0a3da309b8c7491e9102198b9e0196c496d46a19bfc97b980802631a75e29ad9946be174dadf78a2e9070ed4c2f9ac0667f046400a4cd56318022f27a09485b0c7615a9d5d9738c9d3e3e986d6c908e168ef1f62a33451c9f40fcec87f507b4690a250e9523cc1559afead59b2a64d5a712dc1bbf0330a0fed32a62030b4fb90c358f054de404e7f93c74d1eb8f474e189a65408de5b9fa4abe286a9125285f8642ee73868ef9a575f01b3e09788be91cad785a68dfdc690d239862d369f57e6629d18af437b5f88002aa6ce724556174ea7c8c1250c089c40df56d24399502ffbeb0fa0d9f83cca3dd821a1db264906a69e915bb6655daa61a4feecd0542f48b1d10e730a483f2e17c8d8ef9be1c6753e499241741a96d03504c14770fa8b4edfbe702f950baeaa4cf38a9e92d92a2c04f4b094dd1e4a5e11ed4495a7a6495876a444e1a53526aa457bbaec02af80cf59b2d5d0fbe3dde3be19139f9b227fc7ebe8c60d6b3977201dc13889a292c3233e3d89f8313dedba90f5397d7983de36fab57f1e5bfe84a23b8f4f7ca13364ea38db4ddea31d2fe5572fe975b29a1a63feb1726ff6da2908747bdd01b1d73ef4a89ea67cda6260032ee3a16ed1e9af255390cd47cae0769d4cc756dce194b7a1d487df2e9f9de8342affe4553b7ebfb41b8671b9ed0db29402c4a90bf3bb04872a5c11466c7ab2cf831c27b497b1bad4772c1c7cfb954fdb9628ff42f5a6bb7bc5ef0fdc1b5967f389be68e740821809d965c2019d9aabc61102df419cb173321665cb7f956ebbac45556578e3ece2cb01e643ef7c188c31ca8e5ca1dfd2bf5da9e094d2873c22479546c83e784bac28d485a0c9fb26bc8fad3e8b1d8980721605b10733805c53a75ef429c3e18afe3a4897d1f1347669f127c98a5f3b4330b417f0b3b6f6f3869537e41335115ecfe17e2730b1ca86af8f260f52e3cc2bff1936e7ee8d668b3880a8755bddee5dd1856fb02091d6b530c18763bd80982eb11d7c98e058cda75e573f922e580eac086708c31b018916844fdb1a4ed0cf62383ea0c1998f09e7d9dd2f1f4bd7dada72dacda4db76ac7d962ace42bf95c8d685ee116754dbfb3fb75e5c6fe46d91247d83589f66d42802ebc5f8449cd1a60bce209968b305ffc854c73e597115f530d428d631e7dcc5dfd463688e50c4f84be529b983429d038aae95ee59e6bddcf710992c26e9b48b37511138f206cb11f8356e7763060c8cf4c2f56362629c1c0c6578097e3e0f2bca0398649c5eb0a54ee18a3400c4cd7245fd04", "5352ac53536352ac", 1, -888341836, 1537743641, "b940b4c2ed342db18a1aef93dca6a70b690427804cb9f201242efdafe56a3eda"], + ["4f59f444041d14afe46a827da2854adbbb2b069b340d42fbdc0cab90fcf4fee6ac0261dfef0200000005656553650058195d0fdf6d0f9db3118c0016a0cb560206191c4e56cd79faa22e3a524c5ded77e52b2402000000086a5151006a530052c78bdfce086427852e28f6efcdc5b212ed421d61ad61e9bcc679606333a552b72f08f765000000000163ffffffff0957c958ca574f1292594770f2461443208391776e857fda702b48f41b2c232f00000000002b8c4ab5016581580000000000036363000e9a9c90039591a803000000000000000000000000f341e94fc7fcf297ee7000ac8232448db8503e4fb0211fe5cc883f151f0c2077ba03ee768158d5abcc0e4aa47efec1dc32b74b81b36bf16f573e991b29581d9464637de91a390e89f78abafbe59b173ea805441d16055da44bd55b36b44d994700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f1326e22156dc505dca584b58c51a8cf035bc366b18d7a082c89167e7a2f92fd2d8c4b35813014bbb7b908700f2631f3b5ba72394db77731c6f860e1b13f58c3a44b267fd7e3477de8e0c3d576d5190f5b095145f2d80d8c34f3da116b12c25a486f27e9719f077266828fb5c7ddad0239ad42bc0faffdd12ae8819f255f40420203de9a51541bb5090a369760280682069883c41cc3805b306856599a4d7e630402304055fcbeb46c236f4233dcec1808054bf05a05b19b197af57fbdadfe9204870b006d4ba38c932c8501560ad83e621a93e15ece54d9e9f0d4811756ff5399c0a48b9c2eafa4f102183507a5d466c6335f2b3d26a7997aa9c99183a4ec8fe52e1d0224a5c6c97932ed3b0354c174ab039bc95913822c900210921b1b74199bfd77d2032a1ce134ddb4b3d2778ff5ba42ce4e317c8f582c116cad17b2c8fef97871a5d8020bd51d3286ce25c79537be7fceb133929f05a350163b83d8a683bb68c5469f35030548865be662c1c9fb8593770e5766bcb89a7d152a698564cf02067f9ed811f90202a5e27af7f7d6e58bc319d73e00daeedf853371003dc400dfbcfb6246cbd42a173deab15e7d511136cfbaad9ee034972812f30e893894ce12ef700253960e82f62e7b2309b0eb83834cdeac73af040431242200d6b1877e963ffa2f696b35287334e3ce73f793591bf954bdc878f530705b75b1f4d09d98a083bfc63479ca88be0166f6005ba1950373179e9ef62fad134fa0558a89d6e8194c0021c8ad964db0dda4a78b4ea1f095becec4a558cae298d4cb98455c9811b03c77836725ab97c75e52c3a73e192041720d8124dd8e6129ff3da6b9acf6f36e34c621a8c2b11ad72be2aa2bdb0397f588e3078ac419e20be4587bc813dcd1c1658b65dd191a933e03745a8083b7dc096d1f3e9aa9bd38613f2b05eafccc5e2f0050cd6dc33fc62bd81711c844f6f22221afa9e34afc186a3e4aca2c7b1339de0f299c37b72fe5366b0e01b7776b36d434a9a90feb71733e9df655598c4a46f9a697e77d97a3b582416a0aadc5e5ae3a4dc63a3a6b7b988451b6130545c366e88262ee52be50263d24ba1d2b162b2316a780ccda4fd8459ae2f5e42d7f3072577f3ea143274c00ed5a349ea6112797ee7c3e5ccabac3bbce9611a08e42127757a2c084f6f6384acc2639dac196f361d4835cb4d5a6a3ca830b20e8d50183b7a010088f284ff7a499dddb82e7ca68e523ec2a2b96530694fd7f9d530f47b6299e7ca0e3ece0aa40e2640071637891e98fab13291afdd7d564ed11d666efe41367f2c0911c7887bc862c8190371e123c23f05c9804475e05784225d42013afef5649c21a1dfa220b3f34a74b085039701923a46379ee856bffe9f7223126295fd6db50b50639382656fb8313286e2a271af9df4ef24671edbd12a130c5870d7c602c59f9da38a324ef34f356852bd32eb5ab6689cdddfbcb15bef47bc2318a42f002a3938f4651817cf63f59d0ee1389517c55fc19ccedd9fd43022feb9bd1005c387a6d7028b13dbd42e2e954f16666ef3f0660e98687711b7771c7c9d569805d94668f2ff2aa165371eaf399cfc9f5cb205402ae7dcf583469dd58ded20d33fb060fd4d45c3b677e3c6866765bac54c7dd55a4143ac55405a26c308311dda87a2904d285e3002c12244f5d6e0d6e1452048f4862482f33180a0440a72328f1dfd69aa6d63790a5040ccf73277bf8961aae68487e190c2e11f9d66298aa72d733f9019c13560203f6246fdbc9b3e47a6d2aec094d8792f37683c0cd7188b7159fec58badd4b2b91574de268490dea3272f54527cf7f3d6105eaa8a9b80793d409df92b363515e047733611bae8a9847b596effebd843e1c52c2fe4b76b89385e93e916d79895e4e78581afa36b3f2fb5777dad6f31f0165e0d5161e8dbc78ff119ce2909ab1ded0de0b66976bb496630261401a4c6cef5f702d98db81985bfc6a44eae5d89db5956af551ef3c44a6d9ddba7ee4532a7c086973a98d29d7f0755e0db7d7391a83007437d560aa9b84c9984d6c6ced2ce4e5ccdd9811cffc66f182c55952c4ef04a60a6ac196e38743444465ba4e70e7f959a1775eeb4fdadad9a0d3d69707e13742690dc561d919879e5c9eb271df2e1049dd0c9caf4b8d35566073d801149f307ad256be617ca961e12e5229829dfd9ab51ff770a3ea99fb46a240c55f4635c626ccfacc2ef3d2eee92e7cff767f438e063de196c22b434d180aae6c3e02f3755640f765a951e68d44d53628fbbadd3b62e68000000000000000008ba13200000000005d8608a74af5720f2d502d6695f3aca71659478bfd6158283e775b952eb6a2aa82eeeff8baebeb23891d9cbe1476752884ea3b48b56727ab33acbb6947fe884c9e14da626f5ee1aacec2fed2f8a030a1cd63fec93c3882bdd4b7b299097255bf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006d004ab2828bf3f769af7ad0b7ad7d068432c22cdabf99ed40350dcd5a5a46da896cfcae3651b769c7bee32af138d625a966dd85d4072acd6b2b4632ee176eea0f7fd9d815454589e34d698c7eeb83c0b2d3fd942e20a05e559a2eafbdcb990dec69e48e19c2bfc9dd712f685553fc3779cd3539a527a7f2447c28a18a881009021da4dc416d7323abe02158a72f98a0efc94f59767e3ed2b25433169d7415c5fe021db59706c128bbe9ee88abe5b2de7e7221d0789241f0e510441b2417b0dfbf990b0474ad28adcc2787ec34c2b35d4d3167a0ad4b98be78768b13ba18abf466d3739374e635154592a43ee3bab61c2f1ce9d8675a9cf78cb3bb0518a0cef0dcc7d302176dc9f99a3f8e9063b641e6270b89b5f8bc181b2dc7202b6f94b9426f8d3f4a030413b2b31be54e6551e17aa138d429f663c360607d4eb2c296b527379dc5b1d50201aaca3e9db176bb2f42664689bde85689caea0cf28c02d01bfaabd307632dc2032a424bc5524ce67c9341272e947c17bd773adf79aad4a47c29bf9f1e189ab8d0030de6aabf2168f98ce1722526eef937543b4c4eea0e15d8c4eaf9a41c186f2000cd9451644b49c6ca65f1a417a6b6724a3f66162f18b3f4721039cb84b3e3d9a23e21377762d80f1ed4073198bff165292aeb118ec77f46f913825350e33a08d7be9eb3b25e20d283ce3adec7444576d75acc54a0f47d0b0de91f7f289173ae177f543ad34127a72f31567d7eaafb00aa7db244ed9759d9066871a982f50e7183fa0fd38acd7788726b05b038368ca683ebf7efc5056b1efe2f2dc1071b0c7d728fb1e383d69ceeb5045f435792a5d523e2d9f2ea39408c55ae24193404701f13638e718db0e43e773ead55ad161a006a0866c46df28c3bb39f2d465df551008cd098587d704bcfe4a15c9004776f9da05757ba24c819918789ad60de7034d0004cd31660e4b073d4554c15f157672ef137518010d61b66edaca8ef466dab79eae755a07346400a5ebb1436a4b7a1990eda75bad99979b6ab48c62318f04caf5bf6920a522e0dbaab3c7c7a50c4a6d4241884ac665bfd655c0073ad4d96f015469b75f8badb7f3c9662b648e1c06ccd2053d91c4d4d67d9f3cad931f886682e7a0e40680e3de90daf19fcf5743123f9a6bda6a9f9a77bdd46816e0d4e084ab63b08a2e4b8b936aafb338efe96dea1ccd11f748b2d99750a9d3fe322ca5f0a179e33f24055856dca57d3eae3ca83c2e9d888c8e00bf1754aa56a3b18686da233f137968ba3d66b5cc628d544052022fb35dffefbc3f90bfe51676510d5e036731994bcef6ecc5bee7e94c56f3ec5d35ef2b7e963aeac6f2934460142b5fff2df72a4b623ccdcfecad0b711af8b373cdc3da63ab37bf1f894b851e4402b262a9428113c8d662718abd8d8db1317bfa6814603d48e7391c5104ca857899930ab1f8fdfea0b03c538885e33a445ecafccaf66c433f50ebea1dc25eb1d370c033d7820b2f3bf25e8416b4e4be05675fe5f95a966e32be10d6c4674d3b9620ca1c4bbc2dbe0adf508830ab239effa4417a71882950f2a247b62e35e6cad97238aa7f4baf7eb35faa29604d1b4c8447d8ebed8e470cbd43846475a3915d90c551a9493ea306b7c0e0edd3ae3a5e42efe90b4bc3de7925d2af9e49f4d68c3d81dbbb0f1efb3813db4c361b4d4a2fb9d0bebd1634a7a19d40142c5e99b9354029cfdf51f8f881b74d6fcafb8cb4f317246d69d243cccf0e52e8a631811aa069068be05c2213b02dc76a3da58a987df62b066f9747ffefe90fb75b66cbae5b15acee99d434f4047fefe9384ca5bbf5d0e7938b04e75a8c4196374a38bb781ede2b1309f3853d9e3db3b5d2488cda1cb78a3bf2aab09a50165325280b3b2409d0369fa1ae648effa1697c2a8ec82c15be1f1876766445409eb9564f4154f219fc0cc3792ec65671c3d3d00673b0cb56c9daab48e9287d33e20e7c09f5caee8b1a3acd0deb0b2f6d902b26616392e63a99457a51778a9da75773595d622fe31f11e828b38f4fe4fa6e756d19a3de22ef3868c9ad75974a4727579d9f00f7c818ca07c336b4795084a73f88e1bb01d2339497527bda9bcc94428865ec3b8f3ac2d691eb80ec2f581d3f60c52f4f2ebc8aadd7e944f9819fbfad757d6a5b9d2fc4be4973311daa0d3968fbba5b1ec90adb4ff4c1d2e0cd17e613faa30eeb7f7924414564c44e85b849445c718c0daf11aae7f16f80ebb6c4b6c30df2709f1ee0fdf518a5fad6ff7a6eacf5ea6190e7c7c39555d02552bf1418e0000000000000000de37d305000000006aa239e0665ac5419a5aec34cc1ac22ac4dfcb867d8f4a48839774a697da70519a03bbec9fe5048b45faf3fff9dd59b1ab435769026b66922f93660f8cc6ed301bdce13e39586a1f9761660ad097fd00e62ef7c06be7b350d1c0eafba59df17200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000780575b64b78df17e32a5757aa6f4cf2bf51cc7b9718a719c970f3840b8c80a30607ba2dcd91a0370e3b31fcbd596e68c82560507357a2571c62ac9201ed27026bd4edacd2b6f475845e838cf54de14edb1d942e72e6ef8e5e591440adccbf2755e50a3061476d1c1f8cd6ff5a5e9519d99ca1eaf8013f257ab1c3fdf1a17b6a03216134c85ab9f898ac32b1cb06d6c8bfd4c81ca21cc41c1757464fd29b84dc16030a50a9a1c6e841006d8ea900c6db038db7321af805758f08b76e894b610bc21d0a08ee62193c950d442d7cead361313ec1a6ce216d1dea1a7519ccb420e99f5185ba3d45bb739d632b9117e938d0828661b766eb51e87ae23251d00dd0462f7751031a4076a99b7cd4f185cfe21ff47ea125c6c98e763802910cd74d0200921e7acb020acc9c8bbe14f85639a5cdf18eaaa2f8f8f54e2e82a908af05e9a57a5a23ac9b020de531af4ea6678711739eab87d0b2a3088efe055b6fbffded631433d11163ba020f75feea5228bf2f897ada7288b5ea4723ce2ed6de9ad33d5b3baf0080835a100309f7154dfb9bba05f7d4ebeddc58e01f894393583d4b9d3ae57198c107baf7d68b0bc4dcc287c473c46311dbd28ea59481daba4e6e2e006d560324861b591b3f367bda23ba52f4d43c32c6c4ab0c704340317eddae0fc28205b721d4568b59e91e683fc8d2448613a1171b378cb32e39c5bb32f18f506668443aead75bd1c64326507122bfcaba5cb32e06ac3a04f0bdbd270e50b78bf71c252548aba07db949b1f220d3ea7b8f2d93817850233c4543a3a2eb2bf659cb37e552d7909ba222732458e260b64bde42f6a8573ff7fe53413fda7dc8754a2ed67608d8c8f6657a6bf9e953e7ab81c95b8d1d32ea960db075d65345af87f6dee243fcee082866b173a7e3d7c1deca57192bfe90fbcdd4543f06d3fe9584a4c8e91d347b6bfca0497e947a0608709530c516a535d174454ca1b93fdae1089de4f2aa8367f826f9f97e4b6285457f170e3cf9a22ff29e09ee14c81933321bdac7c52eb554c0c6a0c038be40ba6079346236f3035dffd4dce138e33d4065729ee37e6c81aff343ccb28f9fc7adeb5b1bb3e94754bcfc1db85241ebf093b4a3dc79c12eb358e24f37bac70d913d5ec2f349af21d4d313ba9d35f325a59f450074fdff792bd278eb359f9d2cb4f296f879b13ea26f3cd59971c7311d063e69137527e842d5de84643d7f475fe9a2929768dc516d1c4b037dd850432a4f9eab79d301dfde3388540ae08a9dd0736beec73949a8e431ee7a2f9017e6773a2f02779c158dd81bb1dcec10b72fed541eb3afa0abeaf19af13d75db408bd17c07af3c2815bfed986a5b2e474fb94be5d596d7fdbf7656159b2735127d1788b089bb8e25a14c34abaa86f668f0749b3af481354fb56f84d002fb81e182abbb7f62aa5f5ba9fd079250eabb7064a28594f61acae76a35b73eb66f09f69b1fb5505007ded4bf299569e260003f1ba655eafa013c19730e3c63fba3466ad0ade05e55c80b13070b1fc3d1135d8c6146bad2b35ee4dcfcf29cb8f75284cc89386ee652c5c16ac325a3ed35f0c65d0ebaa293e179006c9c0e20f06e408069add48f851f58cceb4853ce6ba56375269e2523afd95f6a489651a47a2294cd8e13fc57af30001b86427dd575d1c505f2f1c8e051a85f390fc58333bf70152d1f55f059627b2d0cf0569ed4030ecba4c3f0ab2186b38b2da5743bf7776905c24495fb40e2ca1d2bdb0bb09ed0c41d74ba499f0ac35fbd7b3a4f77be250baa0122f0c91315ac5470e1161a5eb3f91001e9902ebc44c9fe580cb06f6124cfe822a9943bd79fadff1ddcc4ac9b0d4e1fff6f2eb3302e366e9666b9f8ed4f6be7b8f334ad07beb48f81bf68f3b9f86ada2d6988c054ec0317ce1c9e5d9c916f5a992a6ef3af2584a0b6061812dc17eb0e64f8a0a90dec07a962b59066eca040d5de5d39a13b88e51d1e72b6ddcd86797ad37a1fb3f4bd2e4c999cdad0134d375b91da0911d9c6110fe458fa77cc07f0a5e63c6b8a3e120f861da83e780a0f2e2a00c83f9d9b75398bd8e79f0b468a82ea43e9cac10a193a92f4ab84142229cd6d79b853ee798a4d0d32227ab1676c548cf9dd68253ac8ab4f3c5e83b413e00bd9d1f34474175f171b001a620052d2dbb428dd73300355f90228036e491e4d121f4c79e2bd220cab399b0f6e5d9351fdf3ad9b78da4471d150fd30fa8b189f58e7ce142036c303b3ac5162fbd6c585de924b56e176da0887194b5c0beb3ec217e3484fefda755e3c1867340e61a3ff766291c975b139bb589570a77ae90e04d524314cbc7943e67ba8503d9980605fd9e4a321fcdca2a330cb107d770966093fc04f75da254518f4e92989fb335686230277888e7ec5cbd96317e2fcddaac3ae815ad630c2840e", "51536a636a63ac6aac", 2, 1135949468, 1537743641, "684af7a304f718b6a63f997bff8881a2792bab7e4f7aad7509785aa5c6247fd5"], + ["030000807082c40302456d52f99d38cd25e6192b02ba8043b5133aaeb4f799302afc3be41978e32e740100000004516a6353ffffffff07a63de5147c76561b77096ae81a82adf94970a5eebc59f4a89578444046cabb00000000070051515263656a5b0fb91f0427b7ee0100000000025252a1163203000000000700005163ac53538841af0300000000076a63006353005145aae7020000000001512fd31a7a0000000002e24e7701000000000000000000000000b465aabb42f3495cc3f6044cf327e44376c34114112bbf73e305188970687352a32f9fec1a4ce0ec1fb34a4676bfd692e677e39cf7e87b01338410e353a14c6dce2cd079e89c9c5f96120f96a773e61a4a55d953e9362b3fdfb13f8a9712a7fc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dd5f7ca444909c0b5831be1f7726f5368338c4db78b235e8224bbd38fc38eac962e3aeffd3d0cc926e8841f9dd34ca46280e3c48b79b82eff6b5fefb265201741bdfb1f9b98d45db7e9fcbdd072ccbd96ec6f0cc53b47fa921428900cb5fedfd418d9d71f66f2c06afbcbacffd9865e5703c9218d3a349adf132bca0e9d5c2ad021ece4485afebb1d0d59cdb38019b499e9b46383c93a2087c82d89798258730ee0223a73fc3f8b9c5f2c9e6dcd7b6f6016b61c487c5f24a880e27e42f70ceff7e2f0a00ef9c66139030f1ca4e750354136d569c84dbd5ac448e552c81092423e4f49168b0ff6ffccc6060ba8c6c4c54f558e44c064eb004c93788d4ff36d19008272a02006bf526e1cfbb6c2edf760ee4b9a99d5624161b9ccf41e2d28ed8a07764112702027ffaea0915d9214f9dcd56f75adf712fe2fcda8393ad1f948180c1e8b36af80302709d138e5ceb51e54ce3d9609a225eafe05db383fe70e617951a0fe9d4e3d00312ad8dbb738edcf08262f6f833a52ac2e346d348338e90f98c2d07dc478f85550316d1b4e09a47cbf56c973eb48993b049c3c6e7bd84f70adf235439dab0b1fbe68c11901d3b9af441d823bfadf410307c6f73a77186a308c2c641df1c7de84b28afe920d1a39f36ceed3830ab542def6a5415c40bfd6e05d014810f5cdeb912dfb21d5fbd2b39e5faf6c397b90c0c46ec427608e828a3825dbecbdd3969799b1d84b2490b144bf35cfad2de6ddcac64d0643acf602d026af43463df8844a4a5b1d05a0e658b72adb431e024a0788c189183048c320735b753294460b5090b7a979bd52128666b3b7a31c47388d7cbe80033c88ae4a5b2d626732de60dbe8101279487fa1e51b0098c0cbdbba31555f2743bd83806b463ecf095bf39afb4901dcc69386d0d1bfff997b40b9f4f0dc1fea512720376d3cbc02d9137ab6ad8ae9c146ed051d203a598adc17be89d33b0ee445d921adf3bf182d8ff8e3d2ddbcbe1d627578493bfeddc45bef4a7d6defd981894aebe3ee6d31d165481efa0819cdc7a61e97116e1e21d76e609adb712c46bf1e7bc53bab20d8c11774834e8f6b58e5b3bce7499394e34958b0465db7aa86a8d0cb1cd122ae418d5e884c537cb805b25b3b1ee8ae9f750f1d9ed2ae34f61368a2889ef4652363d2c29d847fd9e64dba054c58baff8de5cab1733ea7ae206937601a47441a71945df49cdab38f820bfc4a1c82998db053105603f9ebb26ac6baf6f05890481234a41009ed69de8165cbacdec5c0cf635ed250594716973efbe2b583dbbfee4654df0f391f41fc4b4e107f99357a7ed7e718451c329dd2da9a314167a07da995438bdcaf4e6b3e6b6ee31db7206593a5680d835a821a6916855649d4f60fba6300d7427efd826f5eb92f5f20eb9fd925e1672a5765aa85aabb34eb09369b035dcc92629da3e6c5cda2a8855fb28ca7bdc62aa7da09e6affb03a4c0c22ec74cb1f791d4f3ac8b0b063d0dedb7c0f0d07349c242953dd1b1cc14305a66e0934f98b163b7ed46a4cd9d74a56d9cb11c65c23e228020f77dbdb09f5acb42c6e4b8d4e3ff49c1fa563d06da52748ecc6702eeaa3b9c4065ffb47945ef9d8ef87e675496d0e340d0fa5fcf0e33ea34e82274447423abe45ceadddd459efe4e57d1ed180840792e5f942bdcaf9affb885400247427e977eb55337fb95abd3d388a78ec2bc64d6de2c1c755d15b969aa7ee31a595693431cb55a45998ee1859c9b562930a9e64e2f52124adb036067042a52345eb8de60730c77d6c89c57627beeecc1a4974bd1f81a55682f6038cbe18d6862f0caaeab0f5afc1b6516d327e91c80ac4c279b30f77d5808813adea2df0b34269eb9a3140e8585a884efc1a30e14d1a90936a264a423d4f6f5ab03e91d0300ce3f96292d23d5cce18c2d2b13a93a4fd402faa694ae4ad08c64de30e17ac194199f16daf9c89d9395be7614ee2cbdcafdc29c5651541e13b62d7e07880b3775d0fbefa789e02fad3e72ab3395f092c7b126ff499ce9b454ac79d252a7e982e5458a7fb271e7867efb40ddbf3f95c9b7927f7355f60105753676908bc50ca86259780f93f274bd99cae6ea198afe22e577c2b353d4d48ad66eddab318b670c6b28b1ab925da0b63635d6c0b845b08314289a2481f49dc76a9819b96e8e4519d68e3cdaf34a4c4f390c2dca8d9e9c8668d0966d83cf68190dad18b4b402ef634093cdf8870ef5cc0ab49fd246a2efc0d7a4b885767ab2c214c30c6f4a6df4b1c2c3eef3833a0461830109a2c371b46659bc1000000000000000000000000005b611d7ddb3ee28fe9a88bc139639b5b5a5285a58dd73537f8224c36040366d86cc735c2afc7300ac3bb60342ae470db2c6a38b98621b4682980d8bd4b88227fcb72252a0207565275a98d40ba013ae6df9bb9141ce092ba80228165eae1dad000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b38ec1970fe838f49d1f90e6a3f03ebc1b9039b21d085143fd4fd38815cd588867fea695ac0e01c42c077d7a1e6c644377f7f170d1a51e50dab1730f2ded29962e10bc2eb3cdaa7884d504f64ab39a15ef7869228f12e1580b3e8ef0ecae2dff0454e9850a47be03cbd9b201f3af9327ea9b5e96babb9632b52b3d3a6f4964560217ffb998cb61bdbd6e3eeef5c1970f981b3e8dccdbdcf32f28631d384a67c70f033045d6490022172794495228bd671e960683f989c441d7a91c48a4ca07c7dd030a08c38bcaa70765e22754fb35fdcda755dad637aad5543856429b225b0dcfb4297636de7607f9f8989000b99b11f207b238c44864e2e65c8e825fa3e89eb765120222f6b8572e112030e54972a97dd2b49fbc12caab33395d1cf72bf29a2b906a6a032a98d3b75a20f58686206b2a44b8ec4a543c747d8a273f67e1133eb58e52417502071244e47abb7e423f8eb469dad2b21978ed6d8a70203dc0e4fbf9011ec4d4b9030ced625af7639e419f35618fbe3f40ab8fc0fb67700e488cf2487aa9898e11d4020db1ad0dad1a136395206f9e48d479d1020047b4081683ad42d702790aa5d4f452a315774a093984aa99c8540b0965d9181de2f253fd0b1c99308c7a05800c02efaae3d64745517011fb98907157a097986aba96fb92374e159de072758f2d120c0b5c6cb30ea4005d80698e28fb255a611d03291b8c0513f12a9a3b8874cf0a5c89edcbe61fb6619822c622c8538a7e4680b45336cfc29fec6d5054755b8ed02272027b7e3a8347c130e30f8f8210929ad83ab3ef176d983698170a407971a44dc3430eb05278cec10be0fd00a816a445af2cb285e7669b4b800317ce8802e273850e8e6b6d6c23affa0712fd91e7c1225d677120c2868e9d59e214c123f04ecf90ef282a0141673245ee484113b509b3676142c41354d837a6fc4e6dff60f8b2b97422a5b789c8c783132832111fa4836b6cf9219f51a8e5fc2013c8cfdd92d19dd4b52bd23515b71b0d8d335a171e3cd4a54fb4b76825456fc166cad9e4a66da12f3ea92e99a2a997f2e0e3f4ffc5d323b33ed376c004997edb3bb9b1ae812da1238b12e273d2dec05601b306b899de337eb1092b2acdee8ac94fb4c93656328c9a818d9fde345f66721915b7064e48e7286535a23ce9aec8c7311b8a98eba060522745c2a2968597e2e8bd8ef61036a47b2accc975c3db4f6838e2164cb88dfdaff3e0e5dd0c4731ae602dd966cf31e3fd3cb47a9928edbf5dda3ca7c0417e3c73b51815d109eb36211b5f457562b58d634f477b9180c032caffa87b494a282ed0d5682708faea2c972d0f766ff08e6d026a99e29c1e36eee147a36f0727b8e756eb0ce26c37ce0dd170519271fae3b1c69cd67d0902ab0768dc578b9ab10f05a8953ee4723241b0ba605cb913eb7c08a82daca221b3124b4ddedcd1fa2e4335bf90f028b78ac28f2ab9f1084d08331f4aeed0f4fa6bf9a30b2d8b41599311605f66fb58875cf4f3b4fbfc8095786e985b5432988d3f2183fa1b8501e9c92e7b39fd6da3b0e2b0c8c6601740624ad7fbceb134c06207d96b095500b6133aaaf8ef1039794b31f15c3f1be5af05e8287e9692171cf6182ee65fbfc4e4eb4efd6dd00815e990b4e9d687eb5573618b7450a3c26fcc8383412b33b7618eeb9d576545ea4130039b2e0f4d623ecec4ecfd4a1b2fdb79f37f1e9a69ac2984cdfde0da2ef0fad91942f2d24daf6d4f83cfa4a9457953d81d149c9a0c90d93318a44dd9fd49bd0faf462dc83ca77debfe3292e652bde64411b1494d1e0169bd0fc581b106d907f8a9b32ff3db15079b2cf83e84836ff4acc0c64e86906f0fc95328ad6150198359195e10c0d034637df618b819dd3534bf37c1a73fbc31b773859a767f94279e3e46761344ef0f569d4b933e326ca353b39372ba381787b0d790ffb060ad7d92789467cf6121c4d8ab0154ec6a4a60224b82772b5d3191d7113a9fa20104f2c084465bd240a726ad481601f84bc2d3573b13a2f58692230a7d0f66e3b75d3bfe04d701959a0b385d525d582c7a504d5b4308d5bf5d45f9c64ef228665b6e3af3bf0d11b05d9cbc6f92ef0e6243dfbc27d5dc5d9db0f3d88e64dbc219526ec71bdb2244b826ec4865eb8d68b44c75f7cd478904adc7eae06767990f2e59b816a621575e9f71759bf77ddfdae6c554996b7a213e62472c994bfc239f2953640f1491d49309736223a41c4a7b66920ffd5f1cfa8d267272516a306fdbeadb09fd6ea19e398179007c88be9b6b88a3d28514c9a69e2a2b5fb9f9acd4f1003e8ca3f45e130bef86047c64404eb797c65b821254a23fb37e964d88940a70595f2d81c1ac8e49f0f58bac047db7d7b403e2ee27dd13fef9bd338831040473571aa704e85e3a5e960657fd36ebe2d8cc0e", "6553", 1, 678986230, 1537743641, "19a2f8c75cb9ce0dab2584888a740d5093b8d445bb80219be4d258047976e7d4"], + ["673b002104e831d5985699e604a7a0b804738dd54136209f121d7ec7367ae957480b66f78102000000045353635122bcbfd2aa15b019d16af381312f6390b8de804671063e234870a695b82879714e994d0800000000046a65acacffffffff89d8107e15ccf7e50ad917cad4fe2339258a94a254a8aa6550f40081e96828db0200000002655132f2e86ed82bd34394607c12f441598bbbf9fcd6b41ffac94fd34500d810f8082b8e1f19010000000463516a51ffffffff02c7c27c010000000004536a650083c01a01000000000652525363ac52cf3cbed80200000000000000009137f2050000000053c99401129e8002cf19bc27a5532cba339624ba446bee290b10349e5375a87e5bc8d7f0d11d032d5d9b015ee9741caed2608f5261a67d2ddc14314911d8f8ea2e3d13614dbcf550868743dfb24977f708ee1d62d55b01526264dc885ce3c3ee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b437ae3e20c10a7de1b54a6436f369bef33fdb762ca9e5ee91b6e48d3ea874857cfb11dba8e62d2c11365bfcfa1129858b1f281a1ec83bac2666fed22eb866110c23d13f7a25976cf1c0be8b984f6565991c5b8970640af59c15c37a41cd471775f75ab205d4bb1433034ecd0b9cee2710eb0daf55fce5d7692ff7cd2377a52030b8254fbb9e648f0a1809ac876850229cc69e837fe0a307252717a9c18156bc002123e7eb8a6decbd98e662c4e283c7cf1bfe2548e6d687b789b7c5756cd8799000a03eed1810454a784f54395f7cc24973b7d86e1fcfdb4ddb9daf7b11f62b1dbfda57ef37a56a41ac05e716a35bcb8aaef0df86d53468ea73b10b0d9e5775c1288022d4ced467ef52ff25e04df3721e524eb4665f2faaebf8267c9853cadf5c5340102272fdd40dbe9d879c0c057c40d5b611375a6667f8131037e5a35116e10b40b17020266e4ffef8cf6d5b47578f01e3d9ae8e11187becde97304121b785852785b25022be30c4f14de3e543abae9d2925cb1ca6761703a6c3641b1d3f64874c317e0a00315f8b36aaf2404a0a0ee427c5fa93ea596e1d19d39e8dce01bf4db13154b8fba03b2f8dc993644345900ab97c6845e03edfff27df962d12c9e954ea05e0ef963682e913bb066ae05db4abfa83769c5c1ee06296094943abfd71577d70b7474e5fe42ba0826f6733d6dbf5f0c9c6fd6dab880990077bb0b0ef6d0c085de02ea2d1ff8d76dcd2dfa62e466b074a53fa17da294bb398fc3564ead62714bba789c17c74d7cc21aa6528cd5ee01bd6fc0a0c2ffe555418597c6cae52eb571dcb2e069cddb7fc228e607b141888670e42263123762bc44da33ddb29a0a2fad2f2f2c9f812c0589148510660b3413df8644dc14565405e7cd2a846cbcccb1fd7778dd8032a237b2cc60840c9406a8956fa7317e7a777d6a70d3ed1ac7418029813754460ac703cd273609a70c75220a52992dbc30ebdb1a7e91a4117351f16ce9b0ad9a49597b9c3e981cf072f207c9ac8ec29976faaa5dc0736f4a2aa07408438a4a93094aa77960c859e3458dc4eaa8c7fff6c7e8719147e508b06c8611dbc701d369393afc873d2236e0395bb73f78235b7aa2d1bc99421f1ec755b91c34c666b161e58139610ec251da151ce1a7b8e348f23a3578262ad2c5f4f5899b229671a30ecb70d86a13b12a87d5b14e01c31410f0a32b0663c351aa85b568e100dab2b28e6ad3d37776a4d9d644e31b76dc881aa5371ab29e21d6d3e3f6bb02f6a58e5279de3b5c0824701505b6076455a58a49b7f4ee12c6e96ec780da120374fd505d61b9f44eb8675b55ad2677ef96a2bdf8d9543e7e0158748bd1e966bb7dc29fedfa24ccd253887d147e09c964279757b5110b3db29787aace03dbd26b4aa06eee3c903177c0245190e17fd0b7b89f3caef0fc1ae4f7001ea4ba5195f95d4848c5c7b4797aa41f38f55fca39a2f66e8e8557fb977302b7ed42d12e2fed3a7999b75b708f3397bb0d9147144612323efa0364fc86e295c7efd98665b54361f9fb8a5c76f1cfaafffef8f704696c662a590ae3d61e56ce6288f4198ab7941449239ed74751d953d49b54668953c9bcfcd33d98229d92f6f381ad51ae41d4396537a7a16e7c4bff608d67944814617a1cc7db0717b2bc9809478b7734a76bbda621e3ddaac5b9838143cc538aeeb359347f476da6c88aaf595122da5147bbf1454e7b37a60fd8b086af898a4538deb0e98578020e40b3afd6ad875c4400b4f10b57a8f25ce39923332bad20d2b0f54c6fdda13c250490298b11380bfe4ba0b21f290a07d88e375504f5a97a35072f3f84d41bb107c0a5ea80c77e7f2b94c26eaff55ecfb13e0c8935f789c621f3e93fbc4dc747aa8d500150bc7d033ab585a410f04deb330f8a9adc36bea427c112f547108c842474ecd12cbd6eaa934b19edba198e93cad68750a02040fc739450b8bf479e7832f58c9e387527723b6385d2b33e001251ea33274c077c3cff99844a388f05d41507a32ca877970e5a5a5a8d1ab3bb87d66fc36f718b9fc898453b4e62b907922b09d41ae1483c37554ebabb8cdb48d25b8974ca42e0dbc096c412947937035b4f3fa7a56746b4e4d5930567ca680dbfdda538ba5d199f64661522a523c14db36aaa63573d666f1b13ef3ac464128629b53fb2c46eb16bbe8dafe3b1b2bf018b9eef4a956370b42a471af6b6d5c3070dd13e65b11f4bcbe916f4fe3560666035fa596b1db65ca71265639251524181c09a569bac696c0582d5978bc792a3b32d256efddb33050000000000000000000000008aca9c8b1f615f17b158aec0aea4e69fa6aa8bf85109b5905f843fc989eef9602f6435ea8f3ab9524e8b29025f3d06162a5beea68bd5369c4b143c487418eb0eadc06f5d9748f47b7f56fa6c47b0f0bc39ef9972e70709dd26bbc4c6c27f2d7500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000291b5d369a28a12dea50e51c31ef82a931c67a8d9969616a82180997825bc5b14ca81d097c2997b968f178b8478a563368d15a7b199688ece7ac7cd2acf9634b870174ec7d5a80acf8eccacebd768a961fe61c71844678419c1a82d6e03723c6f9c41ba5756551945506d7a71f5ab1e90e0b19947c1fb2e7c356e2128c94a5920301399bf51d85a7c758350005adc83c3edecd37e2e2b8844b01b3d59c1789895e031ff7f5a39a03bc63b13a4d8e16dd82716d28cd1c1a445b02cb26f12f56cd0b3b0a07fa8850c9174a9e164e1e39ccfd8416ff3a1dcbae9797c4715affa9ade5c071debab6c47c39c4816e3fa9879bdef3a35441025c44fc71d6aefc7129d16a93a0020e3963e903ed6f84bb5f41ff4b45a0ce7e79489be6b521629813110f234c5dd00216656c8c15b9cb9f8bbf059196e64656d1451ceab12f14c9024bca21c43e45e7030463fb341fff836955720f4517823fbe350dd450190ea06bae2874e91112e28a021c65d8141e49a315c255deca4e276b349667eac42d6eef73104d403822c90024030dde7b1a3a7482a57a2e26cddba8bbd7edd6bac7ea7dc6098d853ad6b57322c405b3f73b791670f4f488e6314ee66900b05caf563df689df424512918691773b07723e1396fdacae87ea8189cca1d3a979e7452ae1a7768e90632723fa801ba9f53159c9f845f939deade463f1117e8a0f28c266cdf426e0e7ebc796251a9917ea87b0283b7abf0a69cde295cded0a2c92a9e8b974c6d082f5795c3bc10a9b89c97ce49136c8dc14f91ffd0d2d0dabc73a1c6a2a4f55e8b24a0374686ab580ca1413dabd204984e4e25cd7786592a08b65cc6e036642732103570eccb9cfbc2de4fdc550794eab6a63a5aefe596faf03e1fd153bf9bd7c9b8cd5bbd398b44806562a919ab5064eb2873ddf655358ecf0e27b5914370ca2665ab84bf687b304c0bd0e80451945afb4ff178e5815e7e3b052e388e6801eac054d62d40c925eacf6ed1023fa409a4aa85ca3247e999685c0ecee42aff6f97f652ecc5bb93adf5897704555f15e93dd5bf0c70415d79e9d861d4e752c6e27c95de820d5ee3ad5ac94f8ffa5533d6dd4df23e34d5bbcbf8d5853ac87956919925433fb8e247287fafa18c64102d9e5ee8d5e0928e34ac7a84001546492dc4617da2f6f58006d584dd9775e4c91de5f41dfb6bed0d6e805b6d163eaf74de371f14e7c1f2cf5af3cde58a6838a1928e0cd7c438370695816287c3f9e358b49336689778c7a0334e96bd55f29497ab91db5a734bec21d1f83a244869355d7ef89fe1354ece4a14022c2498f1bf0c13f62e2e21b4121a643851b589fb9242969af1a5a2d8aac018a93e26e995b8c97a38fa7ced2893adf057c557a5eefb2a338db13dbd723804f9fc8c71a95d462f37d1d93be5b4a44706abefe9c44d2aba1de4f854ee43489c53190ca18a040ec5678005c6cf0f4ca7b07ec5ee9f8b8ea08727db72c41dfc9c9683c5ef2eb786a0d5b69873c9ac77443c2dadab22840ad089da6090d427067b50c9e17a871ee36b980909c243ca86997f199815891ae0ed4a02e058c01ceb9a47dac564f262a45374201877297ba12f5695dea8ec6536b51af9f8d90731eb4a860b87149301971610e67ddd43e3c6907a4b4557d7bff9e9ecdf8c8a9378e07da3187eeb7342f4d2ede75e6d4c17e824151ba3c858de806c778f14f6348e95c802a9c5dc541ba68577d9c8b3facd5ed4183e2e380dfb1d99204bb3e94b989a091f470daec853a8123741ba5dff61a08f83a845425ae9d48c9e7c143476318a3ab84787bc8b0dc2acdb5d4cc08b3f6aa0fad88895de0dd43b767f4cc42d5ca1f13c999544182fd9861e58341f6828ab5d261dd628298d1eea8370d3943edfab416af6a44a44384aa13f250fbcc4d20168aec13c4c922d1fb02b7d0eb5d9ee27f71f2585727301990c0592a32388bb1e7eecab81eaf4d6343f13183e47e7eab0339350a7c83ce7fdce58645661083ea8b630c67403cb07e7a4852328b8d307ae90a5d7d5251721131bb4a0fed6ee08a24c95b7ff3f7f6c73b30c3a52c5e610eda8ad80b8198e71346129b7e7f31e1ba0d9bc22be28432a2ae29a4a519f0ea187b46a4560d8a858471700022e66c7855cfc63acefd521cc9c986d90aae813515117a1704c0758a0358a1aec6d99d56505d7cb5e55cacc43ade8b0de9ffd48374b13d484ea5ef6442fbd577a57266a3779cdedeb9a94f58e95ce557abd3929a6208d6a1bf1678e45edbd331664e4ce55c2f037d5fedccaacabc690a1cf8e8d92646931b18493bf902017d3799c6eb46a4a6e6c2f0e268cdb4639a37e973849089ed8280acd34bc3e8f5c579cc5bbd9ca6bf7399f03af05f519676317e61a198b9bee5bf549a43e69ce192bc102012d0bf5debf8c73cf99a06", "", 0, -485841379, 0, "4ac2fd91c5b58326c5bae82081c5f7b801bae5ddcdbfc47859f8f49af37d8b7d"], + ["030000807082c4030381544c5843bbd270f0a0fb21a4a05b5f1c23dde9bf669828d0b20f98e5850dcf0000000009516a6a536353ac6551ffffffff1a59bc99cd1fcd7f7e357b7942d27f277f100a173813f1d5139a8b76535e35090000000004516a526a0a6b83ea124fff31fcc6ce0cc3e99638e7c15f8fdb7e5c82f67cd74f4bba54b7a6d7bf620200000009526363ac6a630051523f7f3e4b040c78e504000000000100eece5c02000000000965006a525200acac63dda48405000000000951ac6365636563510018e19705000000000700536a005100000cb3ed5b19dd9043030000000000000000a5f81903000000003911e547abd948a41a6008a3e2efc02848fd8cfb4dada585a27844c306e2a2d013a8820566179b7b193dc4573b6fcc0b4a7baa02c96cfe574127858a337c8079e7605887ced7f8a3a2f479fe3b923a05fce5ab52904dc1a03c1ac21b608bb8480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070f7b21b235491b63203b4a27aa7786798e8be0d7d58043f74a59ddf02fc0b963b8b88e8153b2d488c9cb42e776ca2facd29d180069405ac6321ec3b0c48458426835be4e3abb1420a5feb86e28f2650a8805b2dfedfb5d845ae15b10b5fa9a512ff4289bf701dc55272c7ffbf4a8a94b1491017df23b6bd3be99349f5f6e29903063942e3837f9a26ab587215ed23a188be6d4c7e83b7e0b211d8ddb58ea2a0c1032503329bd251bd79c2d3464d87600e50a9d3b844a70a19182adeff83761a81be0a05fdca700d34505db6f9a62789d77613cf26bd1458bda81cc26138198aad809287ca1017bd93f6ae01c018c5f5124c2b7055415fcb93e4f8f87e1883c14a33c9032d12c49bba1bf7364939eebca3584850161954350b7fc9ff551223054173fa1803219461165f1e4410f68b68a5d83defb02143103c9f00ec01b0f3fcfa345193800309d3eb339b39317839333c49a356eb18232f0039d6b2ca27d224e37a58bfc07c0224d6176add88523d418b3431cd84529c4f12e51bfc7689cb89f7bb59d9b9cf2c0214a53de30dfb382e7e9e2989b9d2b464258e0a6f904a2477612d82f126090c30c7420f28175ff2c74a9bbec2ececc28def11d612aa185624da71d3e45864a55449b88295eead68ca1da8f236b3f7d3a3f9f0c97695bea787fb6c0e711396964696decf40620152a071e03f3bb1585fc5709c4c4953c2a8a0b2530bd0067ce658e12279c29e84ae9d71423b020b3098223c3d38e1a20fa3b8e2899bf166346d7fcdaaf2191018aa6117fe1faa6fcbbe3c3ed3cdf85818203565cf841684d469c0e3ba3e1a04a3af2d2fb52efb510f5463715f6bce459c48dd29624ae5c85a8f1037ac5a2886506e73f13896479476d04e47c196a08f1f9569bd33139c668d07a4ba3def12b2488c7cbd0e9676a74f262c4a5b582f8785ccfecb7a7797f5ae11d3dc3bd40c07982da8b1f98bf02b352448a0623bc41fd4740f1be9e7a5dca8c07a0470f61afa9e04d446bede28ba3c3d8b3386cf60f6ace672580338889695fc61944584a676bfa67676ed04e3dec1fdd19124971c5127bd74de853867a5c50d91584fe632efd0245e6fd02f3a1984c6c548196b1ada4c8fab465bbbc54f80f8afdc6c8ef4f04ef26d717ede1028d28f84650bee65b42b033fe40734e4833eb9466caad810319671e8d7fa4fb561ac33de8a4b089395307c969af15ec77b45af9afac3ef812671c675f5a1469211ce9f516273317289066df4c742eb3c5c21a0f3aa75a0bbb2213c7e622c7a3ad3cd7686ad384f5213498cfe9ebf8ec400daf0dbecce59b6911505abb7f7ddf43caffae3f9efce917cdaaffd5d2426bed723999ce9c2ba9137480dc3e5bfdeb4a772364d7321895070207725b3c0fb4e7d84008abe3bbbd703c2fe089ac667497d9f51721f1d86b29eeb066eb041e4bc3c5b87222bbb57076b84399d78fcf4d04af2779f37cc3cd5363ed5e76546a95a572110c0b4f87ba0508947cb6fe1f98722b58f847ea0db654d8e82cf0f5191dcddc3d222cc4bb357f8cf39e95dae0feee43095a183a012f1cf6ce50b4068c52dd148aef4d0323038b4f5566cc5c13e6d95415d8edc5e84ad81c0b4ceae9b67cf7d0498e547b7d4451c0eeb41637b1dd5c9fac8f0e51e215c41921c03cab624fdd304d886b062348cba6fa436c0e83286b97d6d336f264ae7c622d7eed0fc734714f6333e449e00f4f061dd7644dfb2a5085934cbdbae5fb481d3d6917700ab2b1e8f3dee0ab5b7a2f8a96efe5ba2dfb9a9c8b0b2dd90d78df584eb648dcdc7ca2adb0361b88f64f4516339ef563b897a10144a3579778543fb5abf14554f787209f3594d16d4e87d3a99a79c6d9da86c77ddf92473e88b7ecf49766cac115840472b588acb2809eb7a14def71ed5dece9e7ffe54a484cd6698ad4fe4cacad7743dbbb148a0707d73d8c0c709fd0d9522cf77ad35ccfc3dba4124304d82d0c8413f08e3d5f4e8b801dba5acbacae9390e869aed98e812d76788f425222ff4df37857802fddb1bd8f766ad266b4d03c66496d4c01594d4732ee873edb6fda848cee088c9d11dfb31bfe83e3db74f70c2e2401b7af949e0c1760d39714719d5d1be2c3e361b9783bcdd46b3eb72d9495834fd1995ab0c1e82d3ebdc49a90f0245045c9de818e57ad879e9f334061eacedb1cae9b198abb610680b937f809054e92895b3dc3db2de1940b27a2cc397419df92521a2f1f1e9a72eefdb21443ff52be73b18d571692b88e4de090a633fbb7f53b721129658ef0000000000000000def14a0200000000026f08a34133cb44d2ade05203819e6b1b1a368a181933ebe0c2aa2d90fb690fef6154f1e540043ae91928294f51c7db03e87f58e1a481306548a08a379dbee06ffa4ecade40de02309f5d6ee9eba18bb62b353c03c24c2f067d53566e60fd98000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001020734489734d139c6cb2333623f7b6df593e38784284fa70d0bcebd2e493345994c67341ba47e8ae12b993bf43209b0bca628f0e4bd5393411e7c11bd6531abc48b28b08d6c62019a747ce8b0bce77f4afbae854092dc2267859d641ae60e01d2d04b4e6d4d02064d169f2e75cc44aa100eed69bdb31b89ad788e8b102a6b3032267b73010e28a6ff25a8189e4f1c463a923d0d84d354612f168eb10c85a20fe0318ae54270196df3d74b4d293cfa05e4acc515f55c2017ca062d9b29f5aa540d20b0627528423e6e54771f60ecfd77c28d541c3ca590c79731fa05293fd63078e0aa55f984c1cc6b7012e78c92d67e55731689a3a29e79864b33b3971cfa6aedc09032d19a5472366ce7d0a24f8393a014f09537b2d5fe81b37d9b9301f2b6d56be220228477eb446c04fa3b83b2dcc451158de909f470b5c0b9f9bf66545913186b49a022081aaba7b4192addbfa9f0a939c501813e883a2ffb9ea65f7e1efb0139eb34c022b8c8a4a832fe3dbfc034fdf28b5929526aba2ec1081f0f0d9d01f67ecdf61af0222b93b8582b3d6dbc23967fff0e0046de033ffecef625891aa1e3a10651480e4ed50172b30231437cf6c32ab3228eaab933898699535050c59f9e5de1f43c81c63a678aa738ff203bd216b7da15a82beb636e57ca057ed88fd3d205da321d0ed165206e5a33211eeb20f0e554647a03c3fce5da12d1da0acc44b218f7f4ec45fd64c4b48cf66c9b64bfe6a3cbe507f484208f25cfa17a654170991612a4a1322ce3f72f12f3992c6c56054ee39e0f9cf9435ce633481332e58e6f7205b6dd31970b8ae61efd1e55e20180182b9651a053c835b90da2a4e4462ae614e9b901c6d64ff815c6d0103d933c29144f853fb0d942925798f60b9ba57a400da1d99bb52b9d2aa1650813ddd2dbf3ec8999202fa386f3b11cd6ba6590f50c081fa508f285b391515d31dff887391dac887d0457eee0f48ddd9374d426201172f23eda1ed0a2fc72a99f162e8aee719604eaff0ff00406baeec8cd4474a86d942f1393999f3ae8d53a5e21450e0f2ebc71f3d56930fc219e95960120a888af5134d9808221cc502bf0d05e957f3e03168de60876c9b0865797988fc48e74d03dfb1a3792ca8b70333e8dc58a9228efeacc300e8261e2ec74d25f6a6a644c63e4fb550071b04a3e378f394e17358eb46707d7d9d967e2c0e4ee3d48968cd17b00bbb889d660455b20845bdca408612fe52de50d0480e6eb0af86013b1d159c8d52320659ea43dfeab34bf959c7fb3ea7c7b9bf17f9ae95fe207a337ada0a10c36cce62c2f60930d8df766f9d7e736833e7b378b9aefca351a8051d55e4855cd1ed380c93167668c82b9405f7b70c7a2c8e2b30e6b9bb75d71cf9d2955d9adc08d056dc52afd8526e6b29700c5edcedb3fcdc2c6f6a881ecfd2ac098456a53991bbc5c84000c8669adbbd81e356be3804b5c4636269f5335bf71120293e499cdc2644a0326f25edb88ae20834c4233a2f871830e6a68e081fb227b5bc755929084c12468fe9c4258cd7e81a2641eaf1ab77fb2caa20097caef099078008bbb9fb1c439a32a023c612ddd892ea47f5a494d0161ec25430de7311eb4444d306b641acb0b158a662eefcd42658a8fb0c28467ff2cf66720d884a113b1398e2431c98c3646974d4d7c6f9b58e95cf17857d92f765454c63a97f750dea6c721fe308c94cf3b81d0feab8dd20eef9620430036d9aeeedb18e3681a2426e1514e260910c58f511247aef79679ef13b498338d4753c9482f08e847170a2a666887303711d07f8655883587ce80e4714a25544b2d3de6f80c20620490cc239b4ad1c83912a3591634a4c611653f50e400b4119e174087eab8e02e27bb4ebc183f9194495538648327ad34659b9fc8e2835c16964d610a77e7b08725aa37605c76f6e1ef2aeb30afd426d2d8f303caf4abcead5f33d7b9f848ac21a5af46691f60665e8dd7e8df00d0ab411bb993886d4f6a21aa3fe6caabe3b4a01674a7da8b8dba1a7d5c3d7a7a9a03162528a952c38f5fee33b3dc7244bc60a55cc81f1442981c40e326bdea5ea134d3acff506ff78bc834ff552c307224ea4219e222acc082ae5eb4442687f553b0b87676904ffd5350940fa7d0d9219257023fa540800f7da7f1a51ac5150de34a5bdb12eaf0a6b4bae4fd295310101596d473325f7d0a9f2e5a8520dad1b994bbeff408de8a5293501cc4c598c0e29b892babb20aa4b0bcb5757cf8fec19373e2a7193aaea1ab09c78234403daf47a699530c1000000000000000039b2b10000000000e94be1c0758b2a4df24fe6bb9be007f90f2b211aafce707aee1798c12d0670851f0bd0fa3fc1f5d28d325be5ddbb36d7e9ba73385aebfe13d8520a8d7955f28b1f30d214a7a989f6355ca2179a648325f011541dd81179db45392a339f2ed7a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c8edd4c4a4b775681d68d6959e7f269421a934653bd4c790b4b600329613809e6d04f9d944fd9a756995f174ff5b6f3615d4ff454164cc0f63520b9a8201f1903bd0464afb27074fd258714259baacce5f10119e3b1d215ea9aee83418b11b730c11ed6f555c84e64ee1e8984b20166e61a31116899147d38a4ec57fece5620e021ed43eb650d7359b92db89a05833e25dd32b40e37f7a30cdfedd0e75b92db1c40321ccfebecf04f4b2eab5700009290263eae86df7b30c1c6faf3c547f3611b3f90a01c8019b56ad03a292a9a87ef99cb35424f6a677192737cd085133d205312214100928bf6c0e0c8d9bf3b7f6c40a4c1d72221240eb24157d5fd371adf244f49b020b5cc09fd1aa6c4f8254d3777d79648049d35cafa7344731cee49d024d1ac9a4022244c4175ff85a578ef1fb9bc07c1b14f2faaca53bf98d1dccae4d19b1373593021a5c44b39b6c2d3c860110378451a3c22a5d427a84ca9f098788cbbbf0201c3802225861e0c7d2740b3e3047fc7dbefa5519a91e90d32448db146eec5530bb0725032225c89da753883ca104abea423b81022c24da35fb02f28d8d44751d3eebcce8c3d2b93cd06b983c7e82e7491721649ab7c7864885f1892c8e35ed376a46f2dcce8e0a09cdf2038d1006f49c8634b90d5df7e4e1363174f08b51e95cc479b0b1d6709676618ae2450c314523d342828f25da417b676b0584d582ba89b2257594290baa5bc75c9cc379c8527c96b98a0b45ecd7b7ba4f0338cf5732884f1275a3b2649f1d4f2a134529d40f7c6c7c13f4fd9db27d78dbbe40bc52ee53d2bf86bf4c8a5d0a6eef663e13192b64f191fa4de8b1d7e4b8e051d5a64c155ab8806b8be21d05eb3d0d25e9b52a6e34b836017de64ae8df0d27b3978e510d189f7a5b897a53c08b083e1c4bd13af31040f7f32a1db31ef66ca0ce3a2b0c0b94c82f7525128f48a0e76ff8477a65f3a81c21f59d386e7623b1f1af0d697296fb5d10f45021f425cb736572e29069eb154866d21a6a33eac97018be371222e6df955cce3592802ca1894cc2cc5c9990a85b0427f2f2deadce73adfb11be1a6d9892c2474c1d6e7e86d9d4e8733951aae4ec6f8903d523964d51d41a86a3f40d6cd1d3fdb08ccb5301285e3911d21b8ce19a5540930a7cb5daedcc4123fff144d96628b4831a95819af114c12f7f299f13165c2f47e528f67d3627c1ce4c97c1eea3292b25c07bfe459a8dfe191007ff8b912f3679d4e58b6169fdf3b5caf2bf67eb79e54b58898f8ef070ee7f5c62b1d30a6518763eade5b1322b7f6e7e4ced94678dcc28dda38a28e44904de763c1a1b68099cf82a46f1444c3c0f0f5008e0b42adb6eb84685425b27d678c1aeaf0ea1cd8630ced4f0e5238c12f8590f9065e68556a39667804fe1e1e06a2a6e9e2ac36a508c84feba3e47f39879fd0e252faa5683276ba6780ad3400fc87b02733333bfcf410ae8501ec309e8e04a63c17397761a73c79b38317ff692d5d4927aad42a3fd351df79152043e0a3fc9c9b8ae3cdc220592ac600a565e09eaeabd104fd223b7a1ae96d2ef8637d1e6885da76d7f2616524b1ecfd723633ebcbc0e6b779e52155a5ce55088d409a03c0cd7131deb724d1b1581c215b2d2d94f3c3ff8409437dc6ffb169fc23cdbf44666e731592dc382d576f1fed2d7e73614b059456e94e6ddf7027cbaa7e222d4239193fd3fd8596946fd379a89667d14fed45e74253b23bdf5aebf797e90dee84e80bcd3a7a38aaee7b2406dbe172e2c677e2737e7d3ab3924640f3f1daea4b4b73a0fb16c1bf71835d529e013377c042a9c58baab43d2c9f48bec570ee08fad108357afeb3c17fcca59e9064a0df37dee6c1f7c2b418be6c04842160f81ebc6b98db84e426608b138a3e7e330419ff680d14e49a1bfd5e0f61d2ca6c1b872c3394a8c97ebd3539363ee2684ed3cad350b3b9923b287aae38b32efc25347e932836bd4ab9eec4ff9bb18f6ea9790058f0c120337b00ab451c25516a46fb670046d368239efcfb7d17f98bb1faa9a14823b5add9764abbec4e5fab8bf9617675fadde32d2bb0083bdf12bcbbc5ac0ca98bb863ebbf51aff8648398711c2e4f79044fe56c9fc89c62f24ea26e0c18e15a17332f9510ace122d2dca79d9b58dc06f7282b322278f93671fbeef339c74113f68e0e24df08a5f04b16855ebaa37d37105031ec9a174182c04936f36b3cc763e3544b466f6e4ab57068d528352dd66c400e2b2191c339928dab6e63b1a13987815f487de0e1f82b299c82a3d4fe6a370fa577b6e68c57e9d650ca2ee3c0c5161ee2680d161028d37a75920e17e91d8f06d6ab47a9340d475009bb635584095932edd2d7edd424cfee7b33547f1a29eff508b4153b14c9e4bab9fe4a9454dc174dfc4d23e4c11c5d90b836f0c", "", 2, 117099813, 1537743641, "93e869fb49e3e77e2b6f2d6bd516632a4913a8d9d616b1aa74c71caf4c58bfce"], + ["0cea0a0c02c77c7cf36ea0eadc82c453a737f4f973ab9278c7929cd4654ca7af59c5969ab101000000095253655265536565acffffffffaa0147921dfd69f5afb709e4db2e5a5633a56c85bb67b873f234725d51b6b3c70000000003526a52ffffffff0467251c010000000006655200005263646a020400000000076a6a526351525331bbf4010000000004006a526a3c7c18010000000005636351536341b2e1440287c59202000000000000000000000000500ed313be9b8232f92a3cbb21accf42a595354237b778444e6b2da5d445511b752bea8ee6e7591da630a0be01c3ddf6ad071e643af8a0cb28a2aa576b48489e187cf970e71f3dda771ba76f427822485b73a2b2ce010967fd029968b39f694800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e13b9344eb8515cca05fa5f0d1eeb5935d7727cb6fcb3ccd2f2b3dee678e6ddf47473fecd03b39073557bf7fbf1c815443ab159eb4667ce4591b585881e1b16cc7176d2a290dbf9967bf877418d4b8b59c56e78e30948acea3ebe6829a0aebcc6db025596703cecb93657dccb2b9dfd2a464bd1f76f5b81b21905ae92a707480021d3133bd0731563c5556bc9738e555e8de3118980430846e2c8cabe33c2594ec03199a437cc7f3844ef13bcb5b75e49a88a7b49268bb4b23705761778c315c72b20b08bc03080b3b1d3a6b06bd01c427a8378627fe963d790bd2aa2bf18b2f87b3aa4f3245af25945a660d8194eb42f4529840dfb9d2dc31bdf191b48ad71ba3db45022275f052fa85b0762d2735c4aaaf090f6289510e3e93d8d94ae3d9be9a76a5de031883857d6565f053aad8c40a56b449f0a30cc6f4ad151193b993741fb7d68219021697272ab870010ac48b99dd1f99af05ba3e08e5de433ededfde0ac9703337b00328cd14863bd5864db1ea134c9ce3b618e5bb54ca23b63f5ad43ae4fcbd9d9bc40201015ed983b447c57a8d7856d0129613bb032ba4e9077dfb513868e4eb68b66998edf6ce9dfa3f2d250e5e0bad9cbd435beeb7e9318986c87bcdf98fc6b2454f9c26118fa741693d5a1cfd9a984993ded8a44daabb127333197eddd63afc79c327d569b0623394f9ab66f6f0e1e3d0718e43497a4b78c3031338b6c0a99caa9243fe7570e7c2032bea466f7c0c1a9f66c65f98756465f8f61afe8f29bb74285a6dbaf7ba5014f69cf3cb19510dc6a1670e49ab5f802bd1706926c4b8254e872ba5f1d01b97fc8c6d910d0cc210d52175d209581478ebe9608ecd67715339ebd06b79a0deb191dc433d9bc5b4a9c60fa980be3cb259498c59ac204c3fbacd59755598c4807aa0e8e724e7aadc06e10a0ab4cee7396987c6a59e69dac5c0c767a7d3c046c573fb3c07e77eb078e7a05b478224122fca772304595e83dec01902e059151709b31a96a81c0f86156ca4abf2468b9c74b1b93dde8c3bb4044e0559dc1c0cb9f7f0b3246bda661ba868b17701b62ce696e534c97b4435d0de41067dbe5e0e59a1e9f6dbe886edede2844520f4cf954e425d8d69debd79308d9dc2cf845eba58ae3e442ddca4c3b4ca729273455b1a6068edc122f91b2da86ea86934490afbdf07d2eeacfb9045d117cc9187be0556643c84c76d489d27f143e8ca517bbc13462bdbec8ceff70600f1c4172db9717c4b0178567d4772dbdae53650a358e5a5511a58584bf2612a5def01b5b93f622a4a6be07a0935dba66159cb64cf7bf6115a7c63c91da7009b9f65abb608794b13a2f1e57e2f0fea82a66b7f00fdf5077a47107dc792ec7522faf06f09fb71b9cbea660097c1c0bd675487822e064385d2d0671763a6218c89d698f45e6cc2ec19c60360641ff898ca0e2bd71a588a3d8c19b208a89c2714dc9b181b18d11ba3b586f0b082bb5669b29ea4d128e273fe25eb7f008f8ab0a2b72dc92276fef957956e240be53934bcd40f715e75bc6391a4ac61195f227a380be2cd070a5a13c2755acc5e720856e0f425aeabb39df418562498af6c04a41b92fa7c16a32163fe30ac9d91454e8deec91865eeb0ee16f40194db16aa6df99d1e4b30eb536b04b471631bdde2aa49e42cb2576c07adeee6abce9e286c7774cfc05fafd26fd0b2694162720eab59fca11b374fdab50c049ae608fa471aa788c956c3c73b3d4b24de48d5867b6c4c47499ec6cab93b3dc7c0b53d922556c5b57973fba3ca29910b8d0d066d9a6dadf9940a0d103a6e52ca85f500915a3f5d9e07489eefae16dd906f45058138a8a6dc1d2e5a6584fa40e57ed99189b89ad14e60747652f46917daf41fddd1c610a18f62df3fb2a469b37e657634f94c15113dd4ef2b3fabc7a9524d4d8bf1e597e4037a8ef5e4ba4938fb31c569c3b38beae750f8cd86f37525030054a17097890a0a640353429cd71ab2a273d02fa0b4240acd52af63baac0342c9ef76798bfe1cb009c6a50e2e1e7d34bf1d3b6658c5c85a00f08e3e35a039de6dac1d554da1d3ebe13069ff3788e3a5ce1e146270805e281d983facd3a8537b8a43745083f2ce078086110b30cbf9ce69b930a04d67647b8382ee18ad2d080b854fec1fce2176686a8691357b5c29b2d976c1939b3f71784802b692bc0d16f60257f11f77dd7d1f8d213af431a9761ee34a85b2a7e452c684add4888f02e5914f6a9524a9f26ded8d3527f668df37619a9edc8d01f2bf9bfb488b3439f210c28e36000000000000000095aab205000000002dbd50173091388c5b2fdc638303239b386f3332bd62f4613a43a40fbddf0d27be49ffcf0a69a0f91f81c4f6d21f48d6fc5d7736c4c467f182f416c232eb35035153ff274159b44b97f73e6a2be8e7f5ba4eeb4ce42c3d564e16922ceec4c03100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000772278d9a046dd7813a4ac1751b57ab1b51f46491505faf2ce997109c6d6e7ec3a6a843509cc4d561da10b87d559ceb6d8081c27e6a9f25f4b10583c8b0e94aaad1ec1299efd88d5b72e539bbfe607fd6a83f5503273584b2d38b2f06b38ce7b173c90d39551f1ae87d49e5dfba66f0f490da2a26f0be323d79b935e68685d1102036b04b5d1364c05787ce64279c3a6922b65ae58cc4f334b7901871d5f6dd857021a667880b90947669ac3da1b5bc3c688d783a7a4dfb7edb3f1c4d2d268f8380a0b010d5ac39de290e8c7c2b0cd168fde63b5575295c95d1b7e5866cddb9131daa244a1f85853b7424052a3f2ba4e699bfffc7330a2412074ed357409c9f68371c3032d52df22738435ab43fdbfdb505a18aec66149a46260bedd302a6b9a381512f302218b0647f58c296a21b7f5437b61cc964168eb3505f08269a8839c8e8e78f240022f5234cdc5dc955808e7838dc7d130c6111d3c01f2afd88e66860cfc9ab591f30308eb98399ba6489e2109e2930f2f2237aa162c91d1b29a16df87246e8052c56e030fd1a121bc0176bac93602f1e79c998aa0231e8e7a5343a1ad8a6b398d3c35927d891814e02abe37f25ff829f4f11b8870b92b12dfc1a65ee5a4a0b73fa740a15d95c33b44d6cbe4aef9341ee9a5e99c777244bdd41505b40057bd0553c4dbdea88ec36a14212222ee9e71ebcb546ce5182b3788e5de321ac736ed1c28e35509fc618e94d2a2cca94ca3f49e698876796eb4aa620393a2f782a54ac4798ca41693a60097d3c5753f65b18ee8a4abeec751887be2f5a37ea9aa0dffcda4a9d80464dbbfa7e14538e888f21217585e5e19a77c42c83c11ca86e98c00757b55d48e11d32709845f37ad66f8a6afa2913f26da517126fdc084653f5e443f189f58afab8c406c4719f989b3435de4b8f57ca6f0971f058ec5e2c58d9249716636d8041f32b28adc9a00e18628d9cd454695185fe5dcf0fd5d835599cae6c70d74fa424d817324721119293e1e4ecfdb87ccf01e5407cd4cb1065a82f8c22a164f04be623bb82ac45e5c645b9ba20173c0b398bcce7a209aeaef7ffa4f445f7ec25eb97e2dfd495aefa3440f3e6d9ac518bc8e416feabf896ee47a51469280a49dd2d60f1455559a8c693c6f17397e4ce2e0a3eba7ec0576c9ed4347854e0e21bfcbf5976edb2a199e22c184a6121de0b8193698b67af47e78ac3495110f310535270720a351658b45789c696ef8e0c790b59fb2b38277acdeb7d3b98e2e1562d66c897434e05e909dd682f79807915fa121896968d627a61248d6d14cb08eef63935327d0c568e4df98b45553d7f0d507c6364eadb6aeee1c6782bfde052ac5fa9530e9fad1fa18abfa7a49341eb6313efeec79eb2acc4a5501df925b66d9f70eec2db7df29e50ffbc7c20fbd0eb2086873f9fe8a7456445f04f54ba08e7e62f9ca5f0c50a8dfc3db9542d90961aa4964d0dabe45bfef08ee7260ff68b321fce228124587c7a7d76b979d9859ba232f1dfd752b2a47da6a7bab0d52949b7fc9e5dcdc12d11e2cd3811b1741b7ac7a487193e48915eb7f92b614bdc006c083528e4aeaecbe64311ea46286de09bea55fd47f7b2782155007e286de845b58431fda2bcfcb813e6f9c9c00b22edbacf6483607aa6a330db0335517394d9fafb9018ef60a738849b1225d59a7077a8c90389ee70eb7febe05361a042f489041c529824db7a8b65746b29e307f2b80f9500e06657f070c0e6b25f3e4552042cf510e87566b35e6cc256b400bdfd9d09256e99fb7b06fbc8a44c17586a22cb1a62a95e8e19f3b61faf791d71a5f413fa3fc11d63491389483c552ee6175c92fa24c5c9048cd18a15a67333cb00675436f724d053b0ff79b7c649d4e459769db46cf1c7a329e1dfecff53cef63a9a8a6141c9a6ff4a9140b5736388809ad3a6065226845ce78cde0c221145819970e645692e8d8e861f8bda33c431788d3ad4f9f713a85886b48246ce3351d67d2ae583da230f421c89f7fbea68ce765b8864a71560a956589107141b409dfcbe5e09febf70a226b54da45b22d2cc6ae9615bde14b26c3d85595d01a3852010f80d9fdf805d2ae4f070076bc49279eb3e9c5fed5f83f82db83b6c2cfacf779e538445dc72b37e33f573f9f632246560414db59d8b26beed3b3caf54943e22b5bf7ef21983cdb5fc36f2e9f1f10d834b703c2158cfffd535b11a4dde9d0f4ff63a4063f47186a1d8ecb0c1075551b91624f75e75de432ac5760c0c57cde4fb5f9435e1ad2798f51d0f235686a4475ec7c9fb0f5aa99cd2a0fb292ab015eeda4b4c87b258101d04c74ea8172283e468543f82268cf98cd7efef62ef1d3e23ae295c98af6b717086db68b4a842049d4b0d206d118103b904842f14de2e8dadb462484f463820d8d338ca9c304", "636352655363656351", 1, 193287115, 1537743641, "c0b708f3ef740dbad64e295354638fd61ed64b214262e8925aba822db2368c6e"], + ["030000807082c4030306f2a62686c3e0fe8e0b7a80658680853e750d5e903778a603e61ad5669f7a9d010000000065941aceef3a67cb4beaad3875eebc6ea32168ade3d9cbceb34ca858dedc387398578bf901000000036351ac2b71200d864d42b684c6f3c7554b94e0feae2a7faad75acd8861d0146dd635c00f6e99eb0100000007526a00ac6351657c79253a019b1f25000000000000000000000000000001000000000000000005c1ed0500000000df6cc230fb53cb76ece6c61fb6d2a48450d14ad737629c654f635ea4e596951f85e6f814bb82e04948368c0427ddf360f5c50f54c4f60d09f9897fc3fda470da29ae8d3e8c1c7d6daf783ba04379d61ae7f939b8248e0f4d6dc65c57c7a54e550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064394cdc2773f8b143140d2187ce76cd4fbab6a1f0c7b05e3b9847020be6775e9f89319a5436322347e3fb4e87c090a414e1999f0603774349726f50fbd10eca56ba2e9279958c76e9fb06bf239dfc6d855afc94e3fd9f91ac6b2e81b7622a2140747cd401d641a5648edac3a03497e01860a11e583b21f96e9f5889617e68d0030412c6916e5151355ebfd67fda3166cbbf8be7d7b9c220b11b370ec9e5e8066b02064005e6b71bf6cafa179802ba69d09a737c3e91e79750acb9b901e8f6fc8b7c0a007b849b79032032e8aa0d8f66f79d59df92cafd778907842371d0bb265d8b2d34818e9ae2f5d6ad353866bae20a961b03c668c9995be31391b8a170c52bc476022b4f0f3649a6d4b1ef6aba127f20d0cc59c2d2c535aedf72ab4930f0db1c77310220871c1ed569d0dbb7ff48b8c6838d415bedfa0e121f2a1af3a62a4161d4a7f60201e58b1ba7a23702ce0cb465cf40e01ba93936274c5e78380a0b7fd8f9e28b4002284af5ae0070ff43d67ac9403e384b94268baf4112258a7d108daaed1182d1540325357bf3f66c840552cc8f3a16073632faadd5d8735079bc4506caf9fef3550f08cd0d41185c229e5d734ac51c3559b0307515f703aac7ef18e235623bb606e9a722daf5281066701d14324f21f3cdcb71a5e020b144f5b493ba3387a40621ac5bc17343cabb953e248d561e1a34166e657a4eaa11803b63549b3c805f5ac3c1edf99a1abe4c9d7b8ea68333bb832687da28d69fea564ece1b09521f81a69d63ffe25e969f70920892d5f0654f36afd15c9696cf09873b5a17e490f3cd2cf6d8396d92baa3d9be479f486c8dce42d23f2abe8694ca3a392649cedbebab9aa7be3b20e136f67d96cd09ff4563e58937eaf5eab0a7296384bfd92704741d0ee001a64ebf3db059b36fbff7033fb34c1ef2eed5ec2c5477109b1056613ca6d8752cc3265f96343923bceb43ea21f6b6aae406b0148f966d11de35789bcd92d035bb7bd52bf6a7889527e4cfceff953c00322661857bba1d375aab29ae1dd1ccd75797c4d7e21c8c0695f1e2b04e43538b092489e6e2ae66ed37a2b2bbda9f34d2efc4460473d5cbf447729b72b2a743ed32ce5fa02b3db14262ea882df04d3ec49cf827a52d91f6fcc1fb622bfcb7b0cb2fcb2236fed8687264ec33c5910216874e34d768fb3c3db440f1f6e3e8e9fc2adcbc2e4dd358d585d18d2cce9875193c474e58de98ead8d50c16dfaac184282f8105f1c45609f6919a16e4fff1b08e79c540aea0f7ddf1e20539eee7e54959976b7d65427d0000afe07ef93886f78b255094f2bcfda3b0126c0844f3acdc31cef28ebe081104ea659eca2cf58b7aacebb03fae8e97e1faef9de224aa5829f8224e3ff0927a118a82389d26cae8cebbdb009977da94f845ea5016e1c43f3285343f0a724ecf26d50ca861a7bf9fd62afc6bbe36a2ef9fc1d9a7feeccf883eb5c069392f47379e01d9e493ae4849dee9cc7e7ad96786a8e670986da6a83f3037cea83f00905334d363bc2fc9ee29860e0e49a160d8c3cfac6a174249a69aefdf1f5c2ce976f6f561bb39b4c051d446e7a7a55f8ec43e20d2cd6ddfc3aeeeb025b142ecd54f783f8a191e307657ba245adcb541bb4356906bad09872e941977ff0c3a94ac90f87c7fd7144c768614063953533e27ea36276a80ffae20a470f9e8a0eed94f4a17557dee040b6390e285575dd15a1d3daadfd7645ee773e0614bb63596f906883c0f4046d988b7e933069333b16034fe9fb4b9b3afeca36ce181fda80062bc920a4935c65acdc6022f68764fef5b7416bbdfa786d7e692ac033ff7d56b8514df34a7dd53b02c3dfed7544850ed4d4cb20867df478466d0faa399f72e483ff1de9a527ffa4c08e39e1edb5a6ac0315d58a1d1246b96656c63dcb71d1276e1a015220a023aa35d16937cd6612a17f65c85a92a9cac107e4fc513223ae212ed142750e8472b5c28004ad6c9a7ee52e152f2383a38bbbbce3df8d28e1518a8aa30699ec80d9e07e84cf2fdb6ef6f1fe03c5b6c357a832ded59e7729f7f9170a6b104454bb2f8952a4c778ec9e035b72bc55361e688bdef94a5b4f6f484cdb9fbcbd69fb1a81b13239bf96f42231275ae4c87e41843918fd02f798db72b733b7e8eee61fa8e1254207acca854a089c674563f6789d1a7011c7832d001980b4fcb22f7d179fbadd9942d1934c2eb00a417479c3a2adc587eed8be835b314d4c0562ac1e905ffb67c53e4fd507aaecfa4aeda00a6d7150e9bf625f74e1ef6ad4cbcbf3d50d8666defec9599b4ce41fd8ac53e8862525b793745e0d8e462c33c04b2e5fb96c72e1f4c1612c77aaae53c7652c461c2df6602ab243cfc7f17bae36751661be1284e2d4223542668a9543ad55a2cebf6a48698108bef9cda351652630c0c", "6a6a63656a", 1, -672108803, 1537743641, "fc70ab8b1969953b72b9d525a5ee629591319f200b6a5fe7c1734d2a3348b882"], + ["c3721573021b751e78636fd3bd78047519c5cdd64723c2010b6f33dc629cb9c98edf7f739b01000000085163006500ac5365ffffffffaeb134cb86844823f06965d2e25db06c0d08a6f81201fc48dcf2b1f9ef73c37c0300000008635353ac6a51536a4c1f72fc023e5ae8040000000009005352006365635151547d4e020000000006ac515152ac630000000000", "6365536a65655200ac", 0, 149104131, 0, "3d6c9b12af2b8c009bbf0dc7d9dbf74431fa5a27470744f054d9941d7dd1c240"], + ["db663e0601a87e44865316074ee894c0bf29b20195ca4496953bda8fc593cd795144a10ed70200000007ac51526a516351ffffffff033370da0500000000076a535100535165cbc75402000000000463525152fc6be902000000000865006aac52ac52520000000002f9dc3a04000000000000000000000000c0dcf81461549dddac15493e23e4b4517a6b30e30a1e9e8648eb6ef2f8da6e6316bd1ed7b953eef9d29662dfb5e086888b146d050044ba61b5ff34741416f33b90fa795c247a452cfc12f83ba866b26079d36a0ec5214255d29f90ca8164718a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003a0f50e0e70bbe4d77304edac37e03a6d9fe8a98ca947e3421296f7c2ceb87784759a63f3e6c2a4f73a77e791d5213e17de908b51bc10c6c6e6b18db246aac6fb45b6127c8a4c19d0a395baa65d32e99e70485543f4803cc921be7b95068a30ba5adefa8714ff6876cafa52a3eb5ace6b882b23d41d08bb7d3d6efb0e9c845e1030c577d491e63495d3ab97ceb640f69b217cc02f760f33ae58ce6c7789b7d2aff031708c6734a89b9f8bbfddf7f00a29b20ba22508197f4debb54c34a9baddbfc340a077a1bb4422c2f72cfabece15601874ceb51042f78ef4ca16d8035623b65808364d754b9b0df81d711b5cc285f3ba93cbd4fa57618bf27ca6c09aef795c1af9a031eaf9cd61241f36b059829a124a38a0207eb315f17c8f88a56971974e1aa2751032f8fab69bc1713f6cc2776db1fcce88944803ff3815248e26d70533f130e26dc0223aeb967950a223cf3033693a070cde9106e706c4b62e7bae7774e35ad2bf2cb0323f4060e928876352365349fe9d988b5d00180e055cbc0c6706b74afd6a53b34020df35881f5871d39180d582b8a53b44f34264e0cdb83fe203632980e565b7db7082050f87da4dd0648b4ed161666bfb03146edfd53117c80e0d85047ee042160efec3eb5fffa7c0504f02d652f8cfa31fbdda0cd31f6deb3d6bb1feaf08d95781f4be9b7196644087be8b9d0a0ad86828b9e38938d6fd45dfdce078de4006ef8bc9358be3630010da1d6bf1a4363ff656a720eaa224d787a603308b0d8a25ea4d3f54be0a10469ef773efa3cbf1aadee9353e3d734cb53f77b55ec9e3e4b90091d82cfcba102b7de3087486fbd0359d3e51511b0075407dd5d86a56023e94b840dbc4faa52585ec10a1ee0ead5a02b6877d116c44211e12f0bb751e9d669dcdd2b1de9afb0364db05b02c5fe44f091d874be09e4698eb37967c42c3026ed44bbb1be3f10da73a8e51743961b25a88492498c261c75373486ca72b5c02393841de4c3c317e84437c10551d4ae127f89d074f9e518c282005c0dce6ce98e666b22c2fc01a54d23169ee4b83942ec50c5e714bb6591454218107229559abf48a43b0ea3b0ff328f763cb376fcf0b89a002bc5628dc6c89e247af93a66d1e5668abb893e794aa3a30c6dc7652ac150599fd6534b355c4b700dfd4b83502940a2575f3c9b6a480abcd7991e1ac528dd6c28099155cb7e27b03b97367d708162e2be13366ea521fcd19fdaa08c54cce62b887f1b261f8b5a2495626e9b583c59770945118af31fc36f03c9f422c07b9ec3eb783d932732f659577105ed559b93dd559c09768df3c45246b852c9c246aee5ea0be99616253d9cf1fcfbf145d1e5aeae0130f7dd9983c88c5d2080596cf8529218ab6b671c4f83c8ccf2a517f5007d0ec6c0c314f36933f1af7a2fe112bfc7c7f810a1e32dab86be1a423593d3eba1c1f1e694a5c2594b30630a3c633b7e1576232b160122a33bdec8b360053ddc73af3fb736566b9f4ad6f3a1c7336c6a469a50a2c73c096498e3e8914ec27d908575497eb827ba8e7b98af76b34e24e944116173af2ce152c53ff530c385bad51a456d15c976bb6a7fe94422d16f3b45e4232b98adcd2f19cbaed2384c90852549517a72f4391f4b9fc026949a883478020980e54f4359d43669f591fa161ba0f625a0074b6f673c6f5ce6df258bc2f1fa1ab2cc886da4c419714e16f7ff6ca4f48f8e001258b3612199a2d11c66659a3cab23fa398fce166acd16865264c3d3d7cf8381cc486cf45848d9df54e0ce4f90a710c9a94499a6031d5396fd6b5bde2f97478ed0743eb631f9941263dadbbe113da20077c31c40fac7cab44a2b94f450cf1ca0c34015fd02ef74567d588231c21ee3047722bf4fb97d17ba58e5da53233149655b98e1dc40be3a0f27c84e162bf70e3a4ff375850bd21ac89b8700dc14b1aa45d44e6661704d1cde21172fa90a7922ccefcf33d16c6021a134d644dc9a7c476b1494277b28a2778a6b52b91527ab948a8590b4248c66dea3a203cc230101e2351b1f38d47e84807c2369f96f3910afe9ef31e85a89382c981cc3cc3b549b62660e44dd16168955e4658b77e3be03a96c9f7ab13ec8f85b9224321b993ff77faaaeb7d1cf0f3cea436ee322149e5b0476f2642541a010fb8294ce5c9be291b69f1026672a5a3e030a3b767ff210d568743ac8fd9bac6bec43456d595af137b252cdce1b794337bc0f42a0dca00655ab7fa9f2aeb926e9d1418b5175ba4f86bb9ca54fdd84e299e6a47c6c689844f4d434ac07b8cc01000000000000000000000000056325c0fff8d21e1a96dff867ec6e7d1aacce3914e6e162c45c174dca4f868b39ef1ba341846579aa615e1f8433e968f6a98ef2ca1813c900c77e2354f8c73ec16dd7df73f11a5efcfb457d61752c7e9a4b9d9de4144ebfaf55b9bc53ad4c9500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c901a3cb406bdce7de4b887d29ebc03097c4d771cfe30d681e137296336ff7f4aeced60f75f225adf7050fdfa9ced89df117614a42f8980d6028af80de763b0e874a0c308e46b33364ba49bb93d104f6b7e1fe621ba767d5e8aa292efa0a5067de09e8cf388edb523dcd4afb58618b935021b45d5775381f80748b7ff49f7a30022a3214d947b473ca092730c48b1187a37dc7a7874dbf1db43bad423771108f590323b801fe6f29e69695a5c1dbd4a325c0115843fcc3011e7e06830e034be4fa5f0a0535a243d0cf24953198e0f4336ac0b777a92e5227bb92e8c626283e67e5b356aff9ce97f8212074e15a59dde224d726df2a2b2078ef5826c0c9735c62e61446022afebdb66bf3e4deef11b7c1455be3ae9d74ef02841fe297262f39fee8b736d50309ade68bbf32a58d076c5c1fd09e908df55b252920ac74e49b571c481246269e031ebb5f3ba0ab8fefbd3b5032e8d431f2c829951bc28a7f32b99c26fbeba4964703161b149b1544260d0da6670a7646be12899ae83aacfa1dfef4db2515fbaf9d7f0327ca39388860eb74b14e6cb0594f06a2cfa1276cc7c3e0f4d8a40986b3e5fb9e3435517630fed9b2b8cad0b9306cb18ba5237fa1e0c4cb10c27ecea5f85eb25f9a3f0e0ee65115a3949874a2389dbebdda0da419a43b44a7c03539ae9cc2b3f8867129ef2cb9f518ee92d9004574e1533e22b89513206e18d20423c5778b4b6d9e093cbfb1daee0f1cb28acb2c135ce4f1b2a9fff5454a69fde6dbddf9f2e21d9752b2fae753104c5c9bcc7376a0240f1f5d422f97c18d58c96ce60f40711ac438b2edaf00fce9de14084d27269a66ad84d07412e368562d83f7742942ad55e5f4fae34ab8a1e8864e256a3141e2eb2a1bf16acf0410c8a2d6d8dcf36d44b741edc92de46762d6c4655121f98dc831ea103ffb9e03c0f4914aa1ef2198e584a28863c9cfdadb6a22d7b09b1425e22aead7ee69c59ce02df014390fbf74397e45fe134b8566debe32c3dc911f4e2504b5c41d7ca3a2fd3dd3f25df1e499134744da478483135c0e71c0954910722d3e619eaeeda2d52b84fd18c8713824352184f120f408baff53b21982d090d9710ddcf873881606970d4953b3059dfd16e81b3000708d0ab14db2eed802130df95c1717db61af7916e608412cf647d3bbefc36759c4b7d9cee3fd2ca24a663d4a26e38679791bb0689be13525fa23a8c680aae8be456eaf8528bb91d2a261390d2477aea75768b4d2d9d675de515c48c841288404f1bad01fb0c7ad3f1c9e366b1e11a6537d9dc5f381bfd14d98d9048e9e44fa28b5c912f37b000991deb455cd756ddf8817f82bf4fce00b8a6efb52fe7b2ab068b12273069bbac1f29ff56597dd881b37d6cdac06d293a1b0a2b16a459aa7662746a992f813873dfeb21c46717437f1b2e8f4ea7fd7478a74644abc7b6a6e4138c7143515b140b5f9c13dfb9682155f249616ce8ffe8649930ba67630aeb363483539524f3a56dfa2242681e6be7c6c5382fc3900129e6c6b7a67bccf39f130d3220e9606cc53521c45d6740fbb1cbcc5b2a5df7b0b03a4a112856c5f2a6555da6acef9f874e509efb4a03a22205a8022396c13f6d0bf759a6f6b62e0d7337a206861ef89a9457c04fc825cc8669fe5e25deb1518261b1c9ad5795bdb554b28987bf46fcacf7179df323578debff9645dd7e038813b70144866aa782c24778e727210a6a8281df230304d5468255777f203c0f5181e1cb8b61a46095a785b131a89d0f79e79ac3f8faf4df8c87f1d105a5eebe17320d44b3ca5e5f1af0427f564c69fa091e986ffe022dbf211d8e6e789cf476aa3df1dbd9ae2512cac9eba03be337106bee1e414e300358c0a6c3de7c5edc4c4a780fa1a1085ac2fec070b600e2f69d4cbd925d6cbe45fb0cb942d7eed0ccad418b256f70772557e8e841157b59791bc643f4d0a13bfa72d3022d7cdf392636b955d18a1bd03bc7ead7c0d3ef5558640f2128ecfa24fd9f87742ec51e50716cfa61f6a42c113af2d1f21429c97126e2da38a65ba2b7f34b9bc88791d8e4818fd196878697084a59a060c13fa1390c6689b9ba203d7013e2027f6546167816151e0e0f7c23d54defef3f57de9f3651e7026285b79c93176e853e7df986b0e1a4c1d7aa916ae02968a842c8fb565c3740ae08616c9a1faddbeaa7d4880b454b0a0904ce3430d429e812466e70a33b37257b8b8b794b4eddc3c68885c7478848309f7f067b72b76a78db4d4aebb57f7e46228371e0584b1592a2bac725f3402ce460d735bc7b532f4f1c1ce179f3dd200316f9a9c4e3036831eac34bfc9d50b794974f9bcb918660353c5745f27b06d44f696ae7843c4a42c484b7df22a35323567920f06df6a2bfae1ca4b4d4fb07a8731de05f73ad1b60c0ad5995b0304", "63", 0, -1339577064, 0, "ecd2e15e51c16ff1f9a5bbeb571df65b09fd1b97f1ce49e9a57305114d7b47b8"], + ["030000807082c403028d874697330be69a16b912c21476d3af537e87fd04e9351698cd47bd898d7589010000000552636a6552ffffffff16dc376eaef33fb9e409b6abbc1db091efffda1335130edd1105c5dfc468e4e70000000000ffffffff03b14b370000000000056a6565535334219501000000000763636a51526365d5c0670500000000025152b7778b5937f91f1a02000000000000000087d661000000000013c8ad0a14374f9e1d05d1629db7ff20e808ee8edaee8c0fd4e74f6b7a4ab6f03b96862e26cd21fe6e08a6f693cda3960044d35a5e72df1e61a228920a0352a01be55de3cf7031834f3b8d3f9c6ddec405df9ffabf657c462dac37dbd97b3baf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1abb66c431c059220da5e3063e4949adc827f878769d57d45f4a1ad80430d1d40fd03eb5d560229a80c458190611d92ba7b4cb6d9bc9cb2ee1487a4e36c0f7efe57bf39762ee51b54ada31078610a0703fda458e899b6a2c4b2f2c15b09997a09148fe6d6dbc0d56afb6532762d85821c14a52063c0bdfa36ebbdf077da9f020326c9f419912999ab61783fab4dd6d29132b2359c4a4c4149e2b478802e506b480320f8e51a2bdacd955dc2672306edee251adc660c4ea8f921c10443b231e129870b03233a7bba1e35deeb3207b6879f65a8e146446d9d98c329039867254303dbf3e392f936655059ca116dfa40a524c57c86e7d935cd9884c4f957d87372da3815022871ff08e38ab0e25e45640b108faab53a33038f3d1195ccb5355d077175c7a2022225860e2f73e9e7013316af3729d08773d941d120bf03fd7979b9d2f848046602069f6fdf8a102cfa26232c5f039cfbbe0296b3ef85fa4c6d4fbad91efccea17c0214f4c6f84d3e2a8f99c5837345dcf486444266171a8d8feb614cfc5001229cc2020ef25900d726e484e4fcbe49fb08a3a6e2714e8d48add65c86e5616c4f72246b7c90be9e58fdbac1ae8300b0a761f15232dc9e6fb95a5cc426381fdbf3e57cc04652e96fec938f42f232f4e4d04ff0bcfe751d2045319e30f8f980369663628bdee2d83353bf053aca953e5c8755ddeca669fe9fd72104387feafad2da38a9bcf405bd0bb9b90b1e37daf45ffd7a417cbe9e5214dbca49b60dd0a77dbee3c7f319f5534c1bd1fec5b74bf5bb938342d90c5cc23f1f2c42db34a2fd7f5e5826a22e334fe5a445dba6b8477fd11acc91ce637d58acea222c3dc58326965a4e34d62cbf6f5844bd078d2b0b4ce480b622760f863873e69082da56209a509394b5bbfc6bf7f8fa52d1a922edb58e227d9e4236a39121eb0c277ef1f55d98b56e3ed24eb82fc85b6641c46cb55909285088cffdde830921ba34c270f15f6816daf421ef09f9a207ad6bc25dca0251d02d3abbae75b9ac2d9b3b1e9a670b09f1e925860798d3903824a604a9bc4c6dc2e64f602e8b0d4d496c42740eb563d048db478293afe808acdf3fddc09dfc96fbf0801c27d4a196b0e197f20edc3c9004fdd77179c8a25344a35a85072a9bbd5d4bec2e62389fb32b833af0cf47d6c4892e2c64caf5a6a32718d4b2d557cb9d54126243c7114425bafa4d196e9ad66849b3f9ac632a7d1b3f2b73afad4f83dabe59c482938c14de501bc78af4c0fbf0b0c7479c2642cc62fb625e46162527f8c9a1df8cd2729b307b197b747fd823751140fd9a11a5d11ba34dbb547e0c8d1670afe4adf5648034a2de9677b432ef9afac19b0ba8119b5d97a888276cc9eb1273828f2d21dfc79c2f0e020fe801177adc7daed033f11878836e62532aa5791cd1e412c9bd526151cf7e1f023b0f40d0efcf4c60458e72cc83003b2393886c3dee1081f29b0d285ba26e530a28a5c595f650e14f464a7baec871282bd0e6320e9778a7f5b0419df48d4977ddd6601421efb443670802b154fa0fcee7f65f3da457a19b4d7d0560828659c357e4d0b856ea711fb8e3565f08f6a15c95fac78094db4d00dd3715bda79bfbfe85fd13b9946e9407431433a3547202cfd21dd04cd48c353eff95852ac8b34c427024f9d5652f299ded2f7c28deeb9da172434ea513c33b6bbaecfd07e6d5f9d3b4fcf1e26e7196dd56d86dd95cda0602531eedb227701a21d566aea412e73668205a0c21560828e2b0a0188cbfa6c1b8234fc9599184c6a7f4b0d683e9d7b9bbec16536a773ac1fd00bc147d7b5584b76fcd64258bc43140fd4ba80bd3307c6635d7914f603e30280c805faf7a7ee273b3d63b8516612a6f43db3d0af38e7890bd11a454f0597db8bf1480ebaf84f24403cc9d3e5b52d79b3c4de071af56ef28062874adc18ca8ff083f8ea7875490c4dc6ec0b5b59cef78efcb4d74cb709abcd25d17b4770e502dd895b76d92547cf4e89dac66e10513ce8c806d31b59fda060f1b239bcbf6a6556c8ffca24e96c67ca2dafa0e0dd3dfb671245c48039c4b0b1d9cd12cdb296f63f8a286e4ca59aa2bfd8eb86ba00f610cc6825645fbfe3c0e2051bfe159db8c27c298ebf803f0fc9bfb3b67cbdcb3b159b34fb44da99b248eb52c4f2bb65fa4362bc3049f3eca0a33e05483573903bbf03a5b8ad8eead0252066294ef2fe73c599c5659263118fe7ccfb5c1225299332064dd92f10ea9bbb48e0d7778359089e14ce5cad64e651c4a77bc6078ec1e4b69af948102d4ba030000000000000000000000002cd2dd1d0953aa5d617eb24c4681b9cffc759f461c45fc72cfb2da79c224929b4aaed3eac2cccf182d7144704fcf2003d1c38083f56b38c83af70365881d1be2dbc2e8521d2beb1b6a257745a9a8344375273e94dff050600d65f5dc295781b800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f59a2c78fb4a2330739e312a268ed8968a2cc0f69802f5f677f065022a7f21a608ce4463ed251b6efcc2aaef8a7b363f5754827f4a7084e91e0e267e0a0fc690c96cfd6163ecb088e018a00d06435c7b304c7c61a9877a57a583fc7c654e7c93d38cc921ee05f7fe4234c08093a57c28524e58feb71c833fed262480329b13f5031ca330a15e30d71edfd71bda3f8e10239011aa6833bb956ab94c16b6bf82470f0313b7a2e4460299b78397c7d0e634fc169eb79cce464726f436269f72fcb220010a06b221d3c91bd3eb479fc3a9bb09dafdace438236b4b5a289a92f63114879dd661c928703817dcc7ed4dd025766bea5e9697e29ae4da5f170c3854c76ee8a6e6020ab5d6e213abc651c57927670c893a7a01d92f5866f21418af00fe4d4c432cef032d9bdf4c89e7f05c2363f2fa5cf44212ab75c409709603cd301c9957056315c30316d617da38fa78ae591b2feb82b56c0775b0dd0a74241a8ec4bc03b99060de0a0213aa87f2bdd357dd2da63440b30ad73c43da1a5e1944bba5b7405d518f5028c802209ed0eaebf29ea6fec031be452f7f88570775b38d3c57a65a19d33bee8e1bc1ecf955d5ec312ed4825a8cc39bdbabf6b0f0e44b05f2f53cfbc5c935f899329c9279bf9c9adf2e1cc8d61a9f6bbfbe2f4c0963a5d8d8d3f2ebe0a7ff07017083285e87a12a35b543c4e560b68bf3f8262426627cc79c276bd28c6e444be71afb4afdc2d0f63bfe68e3def3bfb48b2fef445cdbd934f811fbe619d48cfbe61c4ff9cc7ffb6d19ed3671b0e593cbff28b2b3b7d1cbf7b9bde3807f754130939589edb9b0664d6f5112b5cdf2871e6ea32b05cfaf88834bf08d697e7d1bb7996f1a3fef4fbb9468ccc581aac11abd7884daa7cca459ab3813c38791f5f61139dae4fbe920662e139d7c3876a9822379c1f3084c7d64efd73beca924c96c3b34c979e73be184975fc371cab7babd923f7d34dbae84d83fea4e4a6f00f92c2411bb4c81fe9397afb07aa1b190d7151a62468f0b0b44ed8006c5cb4413d91479a617591aa7e749b90a4fa04ea7d745b1a53767d0beb9fd0761d0446641ac1f5bc18f8e2757e29cf750082f33ffd8c11fbb6b7900c948f479df28fcc837bcd5514e379a85c414ff20c1904e72a122396eedc8de997433be66c406b8482e20971ab53bb7cfc4691ccce81dcec36ba1d9795c5b9cbf3bbeeb13c20e4f779378975a9d2eeca6a1731a7bcf0ca3ed7c6f660e32913ea52e7b19458cb8759e4470a20ede1bfc171e0b0ca0b07e4604ffa608fc3f05610cc848e64eccf774ae296511b3aadc3d966a9169f12ee050bdf2ac6889e463a1839a616b23e93c871f87dacdfdf727be74dbc8b1914d3a4c5f456b0326ab85560e3c3de82b1e66d8f9e072180b9caca2e92b87720ed8bdae107b840c9b9db39c802851136c241cf00bea65337dd9781a403cdfdbcb564c8d0a752f74b5d778b7971286983e8569a417864fbcfa3f0cfb96ce469c70023b2e8f1d2e67e7c8c0e2384f085f7e5f0b4ba453b65f7f24a1f25295557e6489a4738738c6255ba3f5cae0da66a111b9a548e260e64daece74bdab1fb8cfd436c8fb8966a22bd9ed687ba24e580918e886ea2c69923e5196e78413dccd35db96ef84bbc34f6172c37add2bbe96ff7a7fe1430ceca830ba4311dafbea555b24d34d88eb9123cd4a43c8bd6ee6f9fee387ef62f6c6c1eb93a6ec2f6fa53fc1600620d6539b048f943d620d6e62419657e4bd8cde62de88dcc521103670f48da3e21a7f89233449de24068e033e0f2a5c900a96f323fedc0941085bbf119b2189b66afa15e09ce317f42d6865b67aa25ce78101863df2739b1b4dffc98b73cfcf05d43fb2694cdb22534b03b7e498d98d0ce5737b563292d5425f5c17a22b511a3a01cd909f3198a082fc6310f67b1b0598e8a714f98415c73df5ef27db22646c943e149802ed5ed4265a523a6f61666ebb14c68216ba57c26ea5b8796ffb810ec8517e82882b945c0b1e16466edfa3c7e3ed6e2d8da8642c7c8c5057dc9d4d98a4b028610967c831fcd7d83199e3ba66ea2d016bfe856a39d2b5b5046959895930bbb9760bd40a14c51e0b2bf19c0c652e7f296506606646c61d2bbcc433558060c784cb9fc8c2ce2f477ca3f9d9d5da29128d89cb66368e064cd8a440edbc0c65b14ce3b62de27df40d3cc92765a8f035847a4c950917b26c193a30bef99197cee677768215a3c2cbd69d959f7dadecb4f81147730e9e66b418a51676cc711f01bfe844c3a3a561a69fbcf5e6c4469d1db1c1c8568066fe1e76313d97c8bda088a5b12686687976ebf7711b54ed00bd72672c51f23af9ddd5a31c65610b1b592d5682798002990dbce156bd6cb752745acc0f26ff1843e872aa652cfb94022a1f22aadf9658eac1628ffed40e", "00ac6a0063ac005365", 0, -1337571518, 0, "50fbf85e0ec9a3316b8b37ab5185c755fa0c0ec2c825f1f42e48fb06c7e39040"], + ["030000807082c40304528e428c7727d282d2d69bf39f7542248e7107178ea877255f4980635b2146fd0100000006656500526a65ffffffff3045dcfec2b56049139e3163e65e53168d4d15e979e150e560365212ab8613cc030000000863000052526365acffffffff9dedce7747f2048c8715a136161ab89dad362b28e1b2f376718601f57a0b79ba00000000026a65ffffffff4d48861959037c77060882d862ba079e5091c5a8f5385b815e7fa97720074ccb020000000351acac3326f42a04b88c6c000000000000184f0003000000000200655342010300000000055251655151091c90040000000002656300000000000000000200000000000000002f93c50300000000e2373442a2134a38aad4529097620c370419bf4b7a6ab1f39d2a6357bbf7f4d658ab689b6a630b68bf2242e3c63787fb6a36adcfb8c4e3ba5b0cab2bfb43b78cc3a1866dc5dc7dade2184d70ebf2a96a46941f6ee02f0e19f45cdb635d6693d400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4705eac076af7d947d31ddb1530159f92713f096af7f39190127fbd03ef65e530eae0db897dd03298170ebb7ac6302b90831f78b3cd2b452e028da23faefc4cb8f3e4f92b56056212e598e9f505086ee9ea95ba6be61416f58da9747e64d778078af95c86f5a56e05cfef5c9bac398663d5ea1471c640030f4c73643d7f37ae031a832caaf0bbdf3ead946ba69f39eb146fd93ecb56af21d49a239d5da7d87639021023ae8b245ccb04b61178bc267dc9407d127a29d4a40ef63528ded751fefb030a03f9cbad06260aa82fe3506a859868899acc62a01204b38f17952d09e9a70e144bf7422d491e8c2192713f5a0a3252dc8d1e04e74b4d1cb5d7d4338f8122aadd022f4374f402301a41f0eaba4ba359f1c772c9f19a033caf82657caf637e20478c0313d98c6a6c666bbb18531010bf558b50048e47360f15e69bd9cb77bbb9a101470201a563b9cd2a7239a084150a3161c312253281f67955d97e3b6b63274ac6bd08021761cbfe4eca1f42116584f32249397244e992c3c97a9a88d8b2055d8afae2f4022ceecfe80fc55a23e62ff238647ae82db7b3acfc9139676c36c3922865969e738bf64010ebef91a85ba17e57fdf696929b5fd00c32f8dd6503ae6c2e2f736f087df337b95edebbc87d34e370bee12ebc6e3ff3c813c0d65f79da7d91c1e24dcab0e9eddce2811ac6d8531b1f176694bae155655ff4fe1239e0ec6c7a8207f6bd95e990e685da75ca8b13951d766bce3be9bc57e8d4a2d94d12a12f5f1c70fcb8b2a8351fe68e610485a2e6f33ad2263987d9a13c00c33d01005d2b3b51f18b89d7120165441e6d1300677938ad32559da91dfad8dbd43734e91ea3d20450431998d3452c9db09c36bc2c678037b5bef8463e6cfca1625a87d18361d4622d5f79da2d3dbafda529bf112c1cbafb03d39bbb98396349e56c709e385960800ca4cd4f13142b62087d106aee28feb2844c77d8206eb05846147e917bae392c40cf240bc5fe8555c25d91a385bd04d9778f52f9a07ce38bc671d16946b16f4e583744d2df038ab9675695f1b8c0c9683d2d38c8340904a61c8a4ef9400cc749aab7078a6580a4244aa18b3b982d510920a5a2af3826163016f4c98ece0e6cc4f07025442b900e52640d76305fbc45b8844ce050c36f8703c2699c91b991645f816e01723393d8aa07b1f40c0ec7a15d226da17c45e528989fedd90649655979dc41a3bb7dcc83adc9959d914673cc5205bf7b6d232dfba446d09be25d34cb80d41a393cd9a7ad9e8478388eb48d39df535932b239e55ba7497c5ccc8ca3c9816c75843b2f2d2e185873216f303bbf6b2f334dd267accea671f2eeb03302d85a9a45624d37ee67f8f300811e58f27746ea859a5530992bcff843ab2018fc0cdb01c128f7201bbb75c82638fed62c5400d237e11265351bb966945a19029acd5669f54acb76c4bc70c5e5623bb4cf01f23357d5457ed64324b3874d9d552ddd36c274e4b94185c231c7645ae10671a23583f2d6d3c38b92408a63daeb7796476c7d68e109ecea5f79a9f9f6962d4825c5071e159ed67d6a6827131dbdd30075ce482ce38f0141169b7b995ec266a54023ec0acf98e7376d724641a3e36923e3719118ed0ee23a096daff50b1b646b52dfb9b04781843fb3005e538a3514c1f929972d235290600044fa8b8612aaaee40b6ab43a87b78ceca3fcf7350d3d44e6562d46ffacb6f843f68281f233af976137d5e88a577c055ec8ed6544cf59cadfe8497744402e3f8df14d60ee6df954bd498c0856c003717b56545ff2f13f884a4d7717557811c3155103778e4c70ed31cd3b2c0a418f58600e9a6a7b3f3ca262d0fa4c45542dbda29e8412d71af229545ebb1f4680ea49f06cc1e9bc108c7f0d0897f0617643a17a8c3151421d832c702df1bcc103e3147c1cc558c048af3c381ae63f28b9346287a232f2fcd199d6086a45ca8b174d5ed959bee1209e78d26e0d2d7ee9aa9e62f25b152287a3d3a8a97f2133acac5659673b2ff61a67d1354a7bc76e85a65a8bddfb0554575000ecff38a4e34a7249f3c6bb2add8439e2881c331301b3ba280e390ae577c073f9ad9d4a8dd3868e29fb3159d6e2dd39de33588e66de44e032c0f59da3e4181f43161b3afea0d3f0c07d2688366b094ae95f95349d05b2432d43026909b8198d269219ce6214bb8022e6da08a8fc4132bfd963edbe40ef334ef48f6ff7da5a2daca546831959fe6f1dbdcbd3095522ea99ada77090ccbbc15cf6fa116727d89f13a79a63c4385fae91c2322c0100000000000000000000000072eedebe90d4058b9592b624f766b924c98b0d891e322b83d5e7b836b59e12f071cba6cbd440b263e81e5e97345a1287a450a2efcc2d71d58d14d727cc5ab9de88f141d05be41b87e4ac22e76425a85fafefd805e333b50cc53240cdf2e200cd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000234d3a1b39b25e3da1ab1560cb9e6a1151ec98a683dd07a08487f5e9cab2193c8d08e90f611e3725ce4f62cfe9bef87c6e15b54157f86d521d3a48081b54b7c4992059b5d28e0cc59a55a56e6d3dbc36b7413a2aae2eb3df70710e8b75883355ef6216d3464a210d2352d1e943fe2a4123a573083899ecaca826af5ddc01d6d2032935167cebb9b0faf1ebd2692cacaa4dba42113d3463ee4a1c896483d23bf51b030a7fdae5b284f1ede817cda6a5c95d8cece8b92a588e1342d1719d74819f9aeb0b04511dfff0cddc05e53d4e8e0db8dd2a0476e2660531a51864563a8bbfe3b0350471d2659cb620fff4309822016c8bb518764103d4c073d714886a632538f16c032201159ce13b7eb218878cb20ddfec896b264ec13bbf12658e99fa8d8e023a180221e10968fa2d91df4fcb4004aee64910c0f784b51b5e1302aea3bb95e685b05d022affbfd30f34aaa1e716727cdd76dd2489e07546572008412b481eaea003b9c4030daa1e1c3722341533b8d2d6e974651e15b837f94b2c664e7f4c2c7d978c9c1f021e99b52816c02c80ca9123bc70458e90ec45bf96e36368f52a847cae4cadf4616dd102d5bd2e32ccc73425e1bc050a7cc4dae0f1af3a021a9a9813c25fb02271f434e34832f1bf3974282c9480129a31da5ffbd3912700a05e1315973ecd28f79acb5bd1bc310ac6ac53a8c698eed9546ab3ee12e3c7cec4c02b1b38eee35585a4fc98fec129ab4a6792700c7a3cf06b360d4f0e4b69229fdc8f0b3f1e3bf48d608338495a26219030ae439e70293e5f1ca3155f280f24204b52ee514f6028e0b237daef63294ade89cb3c850a8703be4be6128fbc628c074c81903af2b244f2680d05207520aed1f6c1c3894a6f1cfc4961015e25b34b29cf8ef3f5895cad01d27a39278835afa3abd86405980d1ee674562d58e7ce30b2df810ee013146c3cc12e11cb8059acb97f79aa9f8a35309ef66f253eeed2ff46a774b19de3dbb3a52fbe87ef4293d871086509ba4557948f967be70d6b61640ad76afb9ec0eee9d9725f5474ac34fcfc5f7b18c59993bba198c58a256d7ede2116e20edc7896173ac7fd70256d9405f7927148c8e38abe096a2831d3b2cecd934a286620a331f352a5a2ca36f88989679474ebfd9f7a1b2a71996338d044d43c189b5eb83ff88071df3713fb7401c98c68b9ef95e36c80d350a3d776edba69fe7220a1cf3890a1935f5fbf980acd5a03aadcb3737dddd5191b01b27f90598f26ecb9952fe7fc7a8a34a255fff70534a377fd85b6e939e50b9ff9dcce4bb8508de51f8c7ddf89dab62f61536f7bc533fbc919b6d591b7450f29f7854a3b7dc02d8021ef9664e007abbddb8eeb8573cad6bddfeaec9b5546ca969e5f766141dbbce94d2a96441016748e90b1a471b00ad3cdfa3adb6604a9cd3bd32e7d65fa95cc82f19bcc9961093b98bc7ec71d38d94a307dbc23c6f3097836b141b15b7ab21146490b377faf89d9052f9ec689a969ed72c5801778bfe357e9a4a6499715e1b8f85a7a39d253eb6916261eb2e88851cd075a4a1c219ff55e03b3f3421d490e2cdd09493444ce3690e7f5c0a55b7d45eb74fbc47fff559edad66fb08be109174b780f16724609e0cbc8979f790d18b143338188efe3cb19a48c68c24e75dd27250a7421a5465bca01d9e615c925b73aba21f2ec2f5dba938215ddd337f32b28e3fc705717c886fede7c637be0e65b6dd409623b534a7411cad44154b958344b76291024ddb94d3cf9786b5f14b80e9239241a7de9ebc5c02aaa115822ef12a951977fa7ea8074542110d5697922c0ca040877f02ee71e3cd455a5f0d409ae17b9e5f475d8dcebf61313965ee006950a6652535992ccbffcc78b3f2d683a85302e5ea235ea6460399cf3f89e05543e4eb9fece820af9482b72b2c5d72dd2c6182a69160cabf760a96ed34f40a3ac8e89a844e525124556a3d43e02452ed1f6df9816fc7c63929abefc2ad7efe4d2e3f3769e397f08483325febb0a73407da06de0a413cf63372b44625948094d7be3af96e2def88d33f5c3ca29484b33877349e2df4edcbb31ab5f31547f595b7dd90bc025a795aebb72d55039f402551433a28f4bfd7ae8d2faae7f2642c3a97fdd34e78fb5267839b1a2262c04aa316247a3bdc59acfa8b846859a36fb005f3b805437b3a173a4b40c8d82bd1897f8a9c80056004332dfc4067aa2789cf753aad5dde2e9a98e4d0a8aa4cdd4732b83c576d9c4c7fcf077274d1feb3a4cf3996098f365f51751097fd7bc665f83434fc1ad96b7282df24543dd08b35468b272bac070e7cf37bcc01ad1acb75919f024f5ec17fe1bacaee64199c6770be581f0ff2965f8e9109073a0fa563dbc51eab3c54197a59f7b7647abd873d41faae11647cda91a482dba1a3c2a445b3e0c", "6a515363", 3, 1681858874, 0, "2d288a91a636dbcf5d310eb3b02a068abe241d0d6646ef5d3c63777262e9b0d4"], + ["030000807082c40302aa4411d6cf0938e42df27eb75e9585849d049d823d706d7afa7fbe685283f5a10300000009ac6352006a51526352ffffffff5ece7901de3631cc03faf992b93cce7bdcc510e4fd83895642fe66cc7168045f010000000451005100473360330207c10a020000000006ac00ac65006a1e8626050000000001535be13f5a0000000003e964b1010000000000000000000000002d2303f24578e9d35cdf6fe284dda3121c7a581e140546f2ec4d77a49b2d4b2e1847820d026327e3fa80d59446b03345e7f0dec7087a4492511b86b768ee58a23197f8aa9898cf93ca8eebd62ddac8ffcd55c480f21a7620d386f8f023b00bb800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000212d136b53d8c5fc80f17b1aa5e9ac30e0c4cfecd90059b00030d7c70953332d6ec386355b44f3952f9d5c10aeca4b6fa59a1d85b916d7174aca4dc03de4f956cfc684cd4db8422877df80a4940f28fbb59e9c781318274a1612abcdca64746fed244d98cd2df71b643045422d450ea5f581d4dd6212ed384d78f20ec118b263032501deacf7c0de18e0ad997e46ef3ca09207757193cd7a9e0568a4d5df02470b0313b83f311ae69e276a955d813e9e3976f39904aead15d9358b6009526e22dbca0b0282bbe8889cc455bdeb59cd7752d95e7f335d34dfa92705595cb6f2a8f9df4e93089d514de4718e7bfbeec79cb98519eb35cbe662e61eea24f8e7fe0bd0dc580329b61879daa786b73a15f630b743cd3fc2ab0e8f7e20c409dcf3725ea9d55e52031ab5bb60d42b3ad7433d6fa85f2a261538aefb00b9280f4b2e8ddc6e3a08484d0208fb8447ae05fc14facadde88632de9a49b9b39111bc13c0a8b757c268015f08030baac5e94518a27c9797c2b6039d3123ea9cc3e896be93bf403f85be959081dc020ad819776e182d0cb954d5ec17a21428691d7645b876caa28ac83cd57c5959268f62d361a40e29cb6e8e2aee94ee16718e0693c65147d9c707410bd56c6acea055a940be0bd29a8aed306af2bceab50e55b7fff83762b0b05bc633a2ed7b44ad05f44c3d1cff3acf6826e858b3952f44f7773f3f9c4c0d97ab765ec25a07bc270bc43434b8d80c263e6d3531e961e23ac93a040a8b2bcc3a9a3b28a789696a7a01f18e9a628b9f8fd527a9599eeac22a136a622d43eb496a13f040eb93b5249cf9dca23384ef8d11d0297a73ba0e9e112c8cd632f74887162c32f02654a4ec0abf58338c679f36f5766649d4adc70bef46ecb0f7657e8470357201c7331b06ea5591da1e7627c613f9bfd5f15b8abccccecce831326510ee2b9fba51aa18d8340af604f956aef31cf68e0e533821f10d975d65045fc71e5bc456b9bcfbd1c9e0ab0e893ec7c2a0f1d7fd9117992efbe743d10253c37331d7637d2226a63354cdbd012cd38156ac281648f475518c1e960bcd19a6606a461b1ad319981eb16fc616e8b467cb7a60bf02a64189ce9fe09689511d618a90582c6d53764c07bf134647b7ef5329ed6447f597b8c557da9931a4e083fcc9ae418bd03e67d596042b7c3bf638c7eed152df72bc882725b7e73c32781248228d7e53af8311522a2bed69f71cce60bae5c0a978b6bb23dffb48c4c5faedf117f308c6e533856d3bcab69daf9281bdd02f9ce16aee7bf303455dae7fb87b14c04ed7878666e0f56ce2b2369a83c950763a1b73f05b10a173048d3b5e30298b9e198c34a569e97f2a35accb62f1c69a393832e528590de5bbf5670a8dcbdf950371988d8314f7777345fbc2ba36a139b859ac2986650930e30e7530c0af5f304e54df7e957978c685b6c8555ec2faf103cb026bea66875b62ad1b13f6d71f544edde9a24d6407a070f33f3637e31ff643f050e23fe6253e99506643a32a005d3550490792e45309bde7fb46d9d2ca508b2e2b1ec377a424e41708175a56afb7cae5a3677d14037d9497343b420a1fc004d30d64c752157f701774256bd2732e9a6df5eec311c01201b3d584a4439d4363cf102b8740412057abcc263efba78a987c7c9e9680351fc650310e39303be5081680df501a0654bad499c65ae22791081d06fa9b7d940654c8411ec0d52f85b72ad61928bef2d12b4c48aade53ea9daff60f47d98a91a12d4b1f1ba793fbbce26bd9c0f370d86fa77036db8797355edd505fdbf98fd730cc67834e65bff32d9a952739cae6265301681a66cfc28b80a57a1e512b8edbd6a391dd555b8c596d8022b844874d617a099c031132403a65f4f6c3329cad589d7c9d8c2cf99c3b9b5214bd3dce0962565f69ffe7a324b2e3c0594e74ec476d8df7a04c822ac88651c714881eeead8a421ff534aba59d9e4f4230cc93299cf9f4b314fbcb2ba7993a4432adcaa969a89e6ea45fc3b676ccf627c51a6809bd772728d3c85d07d6059887bbe1fa31009abf67ca66d2d43d945608dc84267d154a393c3b114d4594ee233c4af573e32471914f7396fe1e094a5ee105793dfc43c80e87076dbdf61e3c04da582a0ea45c431be59eeed6ae5bbf51a101428b24b97478e9d45d73cbbb3278f04faf5ba77284609f19436e6f7dcee0709767d803097dac8b1d23432366093c71769112e0b5300df9674fd3b96cadc6a7efee26f6fe455ebd9383e69a0dc01ae0b3876418e332479516b178234ad06c57010000000000000000000000003c40fb152454f9f8402f951b9a21a137ec629db6d79343e683f1a32d7188d356124c372306050bd913955b86c36311ee99eb6a08ffbafa57e77c3445b0f67afc88674fe5829c283e89a017b280876e1812533095b5954138675f47b75f64ec1100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000774996e6e2793b8dde1386f546a7334f58b42d6541079ea5d5d5bca16fe808c01c421ee0b588fd29a9aa0ad5699ab8c170d8f23bb3ee51c98ddaa9f86c74e9818734b920e3c5e7ec8bb327bc7fe090c06e816622316dd2ed682a86bd33a50a051e8cc569931b94e6021c4148bd0b9db4f531adb24629b439f36595c6d302e18c020ef4748c7ecddfb1d823649c6a89bfbf3e136ccef5991e4bb06f94da96cf1ad60228c7423cf87a4c8a4044fa528c388eca2d6889a006e90c1271a414dfe76cde0d0b06e1bcc35e0a46f68c3f5753891c3fb0490647138c18dd1553a13090ac6eea20645136967d2d8720ee3d2731389f1a85f8dcea1b56b3b0fab7e5a5e63a060fa302240901771c41af1099530a2171e3bfe6264c8a2a0a43e0487f8575799e7c8eb90203a117526852d10a2bfc0890704f61b8234e1c0cdb7b647dc210a7398a4a3187021c5c768077744ce2586d761184088bea0f0d231dce82fbc0faf796338a4fc002021f1b5c302eb242a983500314eab8c26f74d4c2d4c4c060bcf8754cf25b9820f20323a119dc52d8c35db9ca1a0250521cd2440930f4313cf1739f8b20ddf228e5a7d3f28167beab0a86413277e8512258fefb34b0a6e8e003147de98c3b0857b48f505f019cc709687d9529f4f18df88191f08e118aecb64bac7b1c4a4471db0868c62db17cce04d29115917ae5088e9f211894fab1cc33948f709ebf29252b5c6a6da90fa6c2a9d538081174c01703a535ed3b33a0c0a9bdcd5ff2df9f1a5879761c30f17ce747875e5da016fe1fef5b8939020f6c49365996b805491eabca3a59d0560895b5f90f078691fa0fe07b63c86fbe219e9b62edc24ebab6424d2551ce6563cdb572d419afaa51b9672ac88d1e050d470fd506eecd33216eadd68bd89113b6d4dd93388ad87b137057c0730897c5f9a1794a14b674fcbb1848c1b6550033b6be8c7bc6281a17bc008020f1618ce22aa469775fd1f11c057046b91da0ef9ba8ce86262a26076765bb3f3d1b55a4def882ded6b4d39664b181d828f72fe8962c4f2e28593fd9cb33112d91f63cf9b7a1886728f6d40f4de7952a8945df49f21be3d97590dac3d840b0a1a6cd5b88ef9169e9e920d7d8ca112a232e62ff3f1283593d01dfa6a1769641ccae677eb42f011dd2170188d5e112ae689b75dc5804f5028781b75baa0412316de1b41833f2fd6b530d0d6a588f7716b1ffecfe7c0794aab87a2bc8f482f1bc642b7ec4af90631d45ff2fcf68caa4b6c2bb63097293907ee8256d7dc9550e090f3ed78996637acb5617c83b1cd405c190c6e291080ed52513dc3edbd5e55cb1fe8805a10cc9e2a5fa2d00c758ed8e530d1aa868c48d7f09dcfa17de513870f82b0e9b60506eab7f4cfdf7caaef942dcf32b673c3167805a12af1c38ba41c0fe345df617c23852da132e9e838e51d8041bf0a54174f759d76992ed9a8b1b654fde8825279d49974e1f21c079539e6d087b309ead9551f99e2d2e396f46488c310e83ac7bad11c1d69699eead756ad7f1dd7110c6c76b7ae6d08852b220052ff88c29017ab5dae18b110ccfd12539ce0086b2816712f86f200f7b13132b6a38038702e2fe9a246d55db5555d85e5b9532d1cc2f6cb6c4345961f10d48ad14bf468db14ac07260aa8f289358b5fe54d881fdd9ba38f1ad8ede6765849bb99ce00a439a4e72640294099511ac6a29e728c6494fcc5dbf64b815bb0e6834e8e55e8ccc13f5623d8ec16d0156129b46ff7558e747d52164d00a3f34fc51b4e1e644efada590a53e789d084483c980d089acd628408ba7f47bf341cee7ad07d010f5d23836c8bffb61f5d1ea0879194e5a916dbd386c75cf10ed8b35cadc6227a72a6bb5ac525e3878e569cf39c4a427ddccb5c22cfa54117c536203e778ce6fc91fc5e5312b437626bdd1bb11a37be55b2ca458180f28e8bc6fc2fe04abf15421e8343dead5ed296bfd16a43c25be5c2124990c40eecf1b03287a149d0ffe59253bfae6e5af8c125df3cc62ac09d23fa08047fd305f9cd055dc5dfa1d00c5e8f996d6961927d9b6a1bea7aa81ec83655e88417247302a22e9e2a5f50c6886f1f74397004032542e6e926bd9c71991feb399cbf03ef2b4cb5dd40a1f2d84e5a8efdff3fbafa24a1b00e033b0a2bc33804f474cc95baa51ed1aae2b2e2eb9fda830a7ae55036ef2014985da7f3fa5283786756d697ccdc6863a3a0c25368974c06bf30a78ec1ed99ed6eebaea348a138e8758e31e070dda38d557b4d6b56ffef6f5c8ac864c000bf998460000000000000000371a2e05000000000fe9112403cbffdbfaed1e238789b373187003d0dd0d0c54b8c46966e650cb0060a94dfedf18eaaad867308bd5fdf51919957123087ef66ad38f96eefc6e5e2cdcad5266a00f81910f53f18c3da2977b683edfff65cf5738b4360e80a9880ed20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027d992c390191b3c3c1ac97978a6cf40eb553fe073779085285bbd0c3457a5921e4229b4228707b0a326e8c305b7760ec5c293b4c07c63e72f9aa2e5e85f185175987e26959e00c7f0f8c15baaef76fa56c666b43ec4b9e81698104f6cb753b68bee08351a1580dcb08e53b2a0c85b625e16dc7bc4de54cfd762c937fc178dc20208c4194da40c3f2b7a5ccd929ab86ef73ff1103adc955d87c9ab333877df5a4c020ccb248abc3b38c5c6489801811eb52c6d1e4a1cf4695435da908128faa3e81d0a0624c353f2b9b77d0cfef97ccb5f8c56ccdd59a4b604bb28bc0e7d707515410105752c8c47d4232e17e9c3f726be2f42a3b16a132d37288cc4a9780f9347eeb7022af13114d773b7375e05e939f9d2e4ae2a1e2e0f81ea17886a12bbfbf0ff9cb8032b0e225ef67c844828f802cb7a48470c52445db84e2663b48dcfa88fb7e5f9f90326fb27f0511e6ac2b98dea2b427aa05a1a6e2b93c7b44c13e60444d542864aee0229c791071c13fee22d696894608d7d902b31ff53f88405da71edd6f60d1dbcd00322c3b1cc5221964a56ab99e1f2b818ff11b672e06f85f69e022656aaff8680bb342ea551d71b34a71d429bc68c844d650dac4e1581eb17f6e45f6b1cdc2bafe344c0813b897b21450ca7d6c2f91cc543d04174dab670f6195aceb657d34c1e96f6981294f57ac060ef5760ddf1a3f636268cb1b295a97995df172e5617da6313ce264735c5c66b1c27d1ec7f6aad7d1c0f80bf873c0d08dffc44817dac19166d701e6d493b22660b7eb4e238416ab929470c994ff78ab8426a46b74fab52855e99d684e436c4923d3640e6662215d994ef525da493a7e554a7cc76592fee9a279cf89fdc7ccd9211c36ef82266034ff1184f9dcca69c41cc4e77d96f51ae74c9e2f112f714abe3cdde03b4e4dec88fb46c1a77ab5b15869c8b031482dc594b158652b6462fcdfe616013104d36677065b87fc4233df5d1c318a82b81ac226523972c7e195a37ed4baaf9093028cf023f9aed53f25041297f5192d2574f5b5cff19a929a3437676f940fbe630b78ae034f3fa2f885cf759b0b9ad027447a415c5e030dae95d51c5a7e9756c1d972ec9661941293cfe206ae1c4c983b68f4924f485d216cd8596213a321ca5b9b69f5e3f01d2ef2c859cf70124e8e6e72ec8bd636848251e83a15e8f2ca5b3303ddafa0dfed7251b461de2a2ba89b0b352377f0f133133c42f8fd74f22f932d925c08bc0d1ab87ae772f48cd91cb35e269ce53272107a0beaace49b4814286f57cdfbc363be58b2fad96a6a41bb7c1beaa2813dfe534a4bfb0138ef51fa3aec1225b0b69ef9609cc4c413dc555895c180c95b2b4454c95bef51427a7d9e70f1576628fbe7e11e320aa5d393d5460802cd9c6cdd1522051c7b3d36aee11512236e84ed232c5783eed456792fc25cf65aaba1579729347ba95d2f8fe5e8137440898703c9e923f64925fc308a367037306e17f06dd615e7c767d0f16e3c7b960b03b2dfdd0d748fee95ffb1bf6cbe90e4688bc88cb4ba7c16bab9146464c45df9e6cff1f1f6d999ce187bbdc93409440ce69b65fb02cc7bc9c048d94f86bd72e3f24c59de6395e925914581b71125e4f6952d644c53ec2f7c961f4eb4f878711c24740813711d66ec98ed1a22d277317c547ec149c1a2e04bb2fa52053443c94b07343bc3cf8dcc40bc26d4aac84903a9446256a66add8aa83b0f01a6cbfd2237a0d74d932f71f01159b6883e7005f5ded303f640d3f24573f7ec8244437f07ccfedf42f0e257465b759a2ab3f24927852d42ba561d36c12c81565f0d777be2833cc03eb180866925113296a56d9aaa70aeda3471c0133d8ddb598d4c1c022522e1d11bea0e9c91774241083a50058a97a7e94415e0d18a3cd07146b7bda092d0cb2659cac0de2f245b3e1e5bff72b22610a65bf09d715c32f147b96b1f5083c81641cc4a76f6208b2aecc778e51c59d98143d8cb78f9f3677d2da6255af3803028b4b9a74ed8661d0b3749c9ba1d3801c65ab7c1d791a9625e2477c5eabc591b729d54f8f08e0ce95eb8dd97f87316c289bc2ec7e873701357cf8730766c727163316ff45ee9ce91cf49ff8c78b021dd54292fbd59f55168a3f5d11543c2de031f28277d7722b734850f98ab64564d175d1f964a77d4d6a34ef26e5f4e70efc6da8bb335a7dae10d3d67cb785b50d3801509786148e5cb40bea33499f3f2dc98ae1ed5b29b2c97714f926543ff404fab2e7d19c7eb5478091101c5f56968672fa324c5b6081a162604b792a0942c0f158c971d8519583b3626be311b65d7b3ff930967b2c7e73df39cc6d4f7daab4ef7fd75e711767e17b47afea9244932338e42cffe38356bed2933b9d1445ff5049ff5c5684b4d888f80a29dbc4cc5130eb10e552149a5908", "005152535153", 0, -1661958772, 1537743641, "6a30bff940636f6886e640d67ae594b80fa8060fb536428abba9e53d353329db"], + ["0e5fc93b01add5bc8f153d80bc0d7bfe892b801af029fe44bccff76da2f086e56132171b2e0300000006526a51005300ffffffff01e2d5c20400000000016a3ad8124702a5f65f010000000000000000000000005b5236a0d5cc79b3d6c480876952e05de077887a1485bea6fdfcc3dbd5f517b0fb49e1eedd14fde9ac71219e213e5434ac513e97a0974d7f613c7f9c00970978e2fa20494e5fa0c72b469dac1e1004a1c1a30a73ab36997937b03d10fc47f4aa0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061ae976b6738f2e5d4872e00075f8df0179ec7b9ded8e3c88643e0fa321e730a56a88c37749face2088c3bd88619132918635206cd1cc849f35e4fbfd7b93da9388ee60d1069a85e93eaa5e39eeef1c7d2e3b770cbba69d113a63f5bcdf1fccaaf918b84745e02e111d554e1a0197fa5859eca1e2df9b8af5ec1c1c9602e5e82020504ee7b7c690fa688292a80570997b9090e4026eabd1c388075bef786907ffa03124618e4fd2e3cf3b64ee438a9165243ae66417e2ed8190b2da6d0484ca1112f0b089f26963baba7867cc239689a8514c213e081bbfdd92083da29005c69612e988c93040e4397796dbb1b96499fa27503c87948b6f55989bdea99618270d4fb750308d9057ad1af2942648a964236a48c6d5bf348b40044eb1a7fc3bc85c4200ccb020082f54b5d1b9c7d83222e2c6734aea5d1c5ea41875de0586f88aba4db3f688103026433a2019cf4715d6f621934bbf604a8dc1ace4457930ce7b0954356ecdd7203076965b5ecf6fd4154fe204d4192b3f797b989c45a10a75a5df945862813c06b020a1fd0873c67068809755b63d38457b985aca418be728997494eb5560b8e3cd5bdc07b55c94822fb079732fe98ddd4123b068bd77e390c6553a04902c5e1713dea20712feca260cc29756c6a63d04edcaf1d5ef14f7496739a81c90f11d0a7366fef53ab3f13fa4c5d8f75409b6ae8debcb7b554db43c765ee66ba51191c60eafd0516597bb3a99fe8e2e0e0c6037b9cc6fcb51b432180c7d05535bdc87ceff9341e581869053084160c92223fecf553562f29150113a175040bab1499374e083f86c2c7b4e518f39d363ea439d4f889250257bc8a1eaa3eb4c68c5f609c7eb986cdd41bf14bc16140ee09e0ca72b2b7fa65722ddeb755218f59bf5630abd27fbced63fd3d06c484c9a5eb102b85ef443496c19515b531caef74ac76c4306ff9652c9314b970522c020d703fe5444493ed95da46c7708d1418f5612d2724b9069ae6d45aec1ff38fc8eb7043f0fd00e20fee9e2fefb97134529285cac50fc3f559ee9349694b1d8dd6b63c9690680e3eb1bd99f388a06e5a3bddd9f1e6f275cbc2987e6088331ff3e426ac594056536f1c3e66065c01318b30e92224932bbb841b10c406c3460c0a06e74d346740a42744d1482410b0411153c6b3606792f79f66ae5fd165c01ef372992a27838666ce797e7432a2da03ca39f7f2c54800dfe62e9e5e3bda56bde36842e20f497efe81ef9aeda53bc1573638262ce59d5b9708b273f8880a3ce90a42eb42152fb72dd191f998110dc1a0421c9b58154136241de2a37524ea2987d35a8c67ea14dd8ab10c0aa69416b9401f10168a47d52782011fbf170521be0912cbdb83d4a0071f21556280fd6c2788a1bbc2260f5eeee74cd4fc69ec01915c0190bac489552ca935af17a00503c99926f3e061278a17125a45bfd3418672beb026bccc536bfa8c4778616799e4a656bc3ccae4255b3057ebb7546e0a96f3ef3aad0b3938fdd3123bf1bc1914728dbc9ccecd1910efed29b495b27502f315beaae869da00998b9d4f72f772c19184bdc71a10e775f940f138417d903b845738317b938986e09b2b965d6110ff44f37ba30436b9c345745c4f297f40e1909ec220616971bac71f4325867069a8eb0436d293b22202e04d96dd7ef89ffb15702d087153f06bf64bf7fae8cca7afa7ec5d52fde36005cc2c062dbc1afe03249dc1d71f4fcd8a4208b3ee89546cf5c8d09ce4b3de19fb554aa45e4eba08911e231032f8ae074b3dae334506b317d1e1b53818a855470fb21c9193a4708023e5177f6fe4ccb5040ed04fc9aa6fee8b86673268eb909c6f1c363e496408f823c95f8551b9500952407c854cb7f50c6b678d77906812ab361f7358c43c22dd90d7351441e9027eece66b835b781c93ff7e624f6e9609bd280270f801797f004c231acb9c6ef8008002a76dc0c9f73cd2c9b3af36e76ccf16ca592d22ab8fa734ed23e47a7bf1be630048c5cc0f2b0e55c24f5d967a72f59682efb9d7a926746404eb20033e0a3520f122f389697d4abd269ad85fdc0233286ba7c931ac86093d2efcbb4c952259654c3a2ac624a7b20d5d956e5f0d6fc72ae7f3afaec5ed40bd0a1a73cdd5a3f35c1e801ba98092f5e7aa8672bd590339cde7ba0aebcd02d11ba5179dc7ad60a397d162a0fa484caf6dc163fcd9b21dbf0d4a19847f14096a3405607b69757d41e5ffa827c8d9bf116861745d6536da6ab244a659131885359d21f39600a9790ad65fc37d6308a8a1570a030000000000000000000000003648a92ad1cd2130a039b7f53e99cb6d37867f27b1ada21bf6f498d55ec87f9d142193d1bc192bb866137ab8f4f35cad2ea3fc6b51f39764ca1677d887af3e63db00690a73982d5e1e3f8b302e10134bdfa9c72095d7fc6222fe7c0111cc910c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fdab2c4dd33fbc4a1cb4308eb75b99aae84b9deb4b7a4ec921982be1ae6410f935db8bb0f8713b13f44480e6a2592bd2a2a1f551becb267f0ee77164883357a1dd1721c67f2a3b3f29e13001ee1e473991b21e66f514d5e2481f6f1c0a380835ac4f0b5f8b8771586ab0614d329da2795bf94b29cf3de9c59426df472d101b76022c6869455d5681717b13afd39f9e9dc5bc6c4fe899da74b1ba69cdb24dbf1dc4031b4dd9ebaa8ac90e936e6b4901263531c7ef229db3b3b3c40b47298ab6a779e20b00bb1ca95c3409ba1853119b111b8231325c7c6c6fd9fcdce76ab610093bc68e93c663950aa05ebce167e423d32ed58871eddf3345c920f034e1f2a013990cf10209c24f38b730f0b0be06f6fb333d8bdfef221e180622795281ff950f92bb2c9602197c37c5f12a094343e07fd81e66195c9f1367999fc943ebd6631025a02c0783021fa3c04697e62d76315180e244cc9d6fa02f7ad8aaf9b4a4bafc00dd3c1727f30219c0079f4883d784d4b00db1f022423fa60bb18b5c9c900fb2bf2f5f4cab2bd00316077c388d4f362cf15b3532d73a8d807f8e625e9e6588beb6e372d7aea0ec45aed5af7f93a38f7e9c37f96d97a51a1dc9c44c6c7b289db47de65cca0c3488b4e4eea96ea247999345bbad1bc7add81a9ace04a711b4464565567ff496caff2d10b93222d3a76c4c48057bd9ede1b73d9426d7a8134bffab270b548486a84f48eb9838b802fb5f66f6e6a522dc9d9a22e0bcbf2eb78dccaeb4516cfcecaddc479361dbfceea8babc3c0c2dd6e9678b79127b4731ea50d133bdaab838254883e6a4bfb0c1126db18ad9e4b08e52e9fdf20f016344ed344944d56cb49da89536d75a42814f48633c9faaf02a9f90cd9b5532f35b9a8046cd554c4c84b8c6a0b473ca9a777a7d235e8db1cc791e5cc2cae93c23d431ce162072f343c6ffe4df36597ceca8449aa1f190a356c4034dd6423e171fa35d0562fbcb1ae44e588674ab99d9ed9bd060c77b954afb98d44186494998b9cdba40f3b14d6b2f030ede88170f79172756557cfcae2e6c27ec799d4a210700a78b69aa4efbc8847e0d8a98a12964e239d8d14e6f660e9bb73a5a20cf68dbf5aca418c4c246b194a0136e2f2e6f953b983ec8f91f8f84328bfb35a5597f0de0226c464f147f705c4d020e45f8b92c03ed40301bef9425d0c6549974dff77667e9b700bd9fa93b0105877c1a0c72ee82518938a48a47f803bdba47c8d9c700bf91f89f1f67134b8d37643ae4e66a6b3d593959b55364854b2cb2122936e751c8bee316ee54213b3b5afa1687a375fcad8c8cd74a4b92fe81033f3669048efc0a3ac1cc57d290a6dc3150884ba5cfeccd32e33dc6fa9dd5f2d02dbc33c229eb60c7c629232890c9369c815a918c2c72dbe4ae948310b66d08a56a0216e3e9067209051ab7f29bee524cc20da150a3619acbb4c2571c7f6fdf98d80ffe4c3254fbc4af4f4a88aaa5f68950a8a8880236ef5a7164d3e9e55efb00d3dc440032e7f336fd26853085dbb9309ca61ecfb01a7dce3d9019d1f51a855dcb268c839ea5b6a2227b3ef8d166aca650b7a53cb8d4e08f0c828a79383a24048aaf19bf51e266846908eb6111f0409cae578055512fe89edde9f7eae9fb70b2540bc0cb9e02a3299f45cdd1db91947abb3354fe397706eac4030b385294455e0b8be68d8cc4db811a7ce88f6aadc14f502fa5d1e692e2198802c535ddb080d75ce2c81325a0c705424f03bf431760a6dd778d16248ace45170219df3695645d6fef832427f0ada4d8c900c5d3d019d9806adfabab5a7311bbcec6ac0c632f6f01b3fb39f841e97d9debc9c456812e6b276f1825628efb31c7a599587b37fde9b89276952eeca6cc6688313386105d4b8530be7cb184f55eda285aa4a1a43b541cfc472198b3a9d11a1529808577ff19b7604b23105d73a86185133b6b5ac3b5d2201f5e49d8ae5db68e1cdad159e57f3e26a1fe652273062382449c45325f14dad4221f6adbceec6ea0c7e94079ba35ca695184d3f045d6b163e5a4ad2a7634680e02fbc1b85624dca022f835f62264aaddbedda2fdff05127098ccea806afc574cbbbfbd75d2f9528ae559e25226d21d52146aaf751b7aae46be2e5d3168d382bed6c0db285b61da69760dda1ac782f580743392825cf3ab1a6c5f506604ab46f475db1f69a79fc1abd36bb6f9722b8e5c95a77e1adc085ff327b71cfd34e776dc2f38eebb4818e8b57d111d5576bad77b109d8d6ebc10f641d134a8d7ed42caf158b7d105facd709791de5eab550416a47bf5382144e3fb0057da070f93f99e6a23aee3289911efee3c9db2b9ba96287cf19fb5ebcf88f1c18b71f2e55986773728d4cb736de4a945940430929733031a3def407037ad3585f0a12b0680190256b121c4c904", "51", 0, -140033843, 1537743641, "2b6b2e80472cb89cec2f1f949ae2756c45c783a54bc8e6958500e3dac5fc7ab9"], + ["efbfc64202aa58944187cc4e94d84aefa7f4643e794686f2ef16df86b28e579b573ec1e91f03000000025165ffffffffda021e401d7237d6802cacb3ee06c607780f684a7b8f634f8b0eb20cf5b54ece0100000000ffffffff04ff4b320300000000090063650000520000004332fb0300000000096553ac656500515251c6ba170000000000086a6a526a51006363f0c0bb01000000000851536a52ac53656a0000000000", "51635165000051", 0, -756377186, 1537743641, "b66dc27e9ebc7309a076265fb4be075e9bdabfba5effd202d0e9b2e72710cab7"], + ["d100bd210223baee1b2209245a92622cd9f6d8f5e630b03e8af90db80d4528bbdc56d98df002000000026a0038c09b8fe00bca9c04f06668341069e8eb01d3b0b1652bf40034b44eaab381cccf1ffd9902000000045251655241a644e8018e8f510400000000075265536551656ac7f238d8030000000000000000d3c58d0300000000093daef3bf36f95738238fadb4f83080d114079018cbaa0337b2d4183ee5521c3909e357ec4d0521627b5a0361aa7bad2239c8576a04a7b36f6526ac7441b52c4d1b2d54596d1d33f6d30d14be3409d2086cdc78b0dfe063b24e2a9aa989b7b600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000174e13707c704faeb481cad1bdd9709c1b462067963623f2e42a0a69d64497d7e6a7aff7b707db473ece86c2e294298072b9a9860bc5a2f56bd82ef2b6c3a948a0505162ad8661d448259a22421ba77b78ff35a2e92df814dbcb1cf67ab8ee1a40465eb5f0109a2f0bdace39a4d122a6369f2d9244d3dbc46d1cbb92bf2dbcaa031e1a37345af135630ba65a7e776f58c1abc6f6ec5ad76a820376bdd7663b757903008e9c4815212044b1469651322ee64dbbba1538c061ac64e635e892387818c50a0446cb4d82682e5a041fcb055420060697927f35d5fbe815b5ecb1f4a6767abfe55de4e65283866040c391c3e55a4af9b81648853e68d6e5e2ffacbfb7d0ddbc020f575d657a8b368e5b3b0969e0c990fdbfb5c1e1132be1757da134843cc20603031e78d42b44b7bc657c9b32c321b0fc86bd1474b323296952ba4cbec30f9d35e903263a96ea8a3e0d6ea4b2cf0da38f30a7e503c282a4285709c95a4427d7e4c350021b90a3d52ea73eb3d804ed4d4dac2380e40adbc822a1ee3fdeb77352e318299c022faa1f1ef86fcc4125cf61fdac1647c391193d94227e0d56a331c908c8e8eb66db47acde8e5a7653c007ffc91e84f3d1a756d31773699d824d84e0a44b942cc2ce3bc30b4da706d212684c15c30a01b42ecbcba4be9a0a3f1ff7af1b2384df4a5fa3083009a23436889cb6dea7793e34d15d7c235d6003b9e09b01788e7a791cf6ea9a892269d8f4635f2464a1b75e0f846ef879b997e62791200236e701b7829ded1528c5de077046e4b93b4b57096e4d992d411d76360e6f3a71946fa35595ef2b53b27ad40953da5979f3cd51f3ba1a7fa43dd97d2586b8fc76b9da843a22db8b26af0e513468a53e715ba8c34184820e2ad16abbb42d4d234eb07f131ec3aeb3deff115904f116ba3c789f23dcb3a70b62fd03c47f5d433a682b6bb0463a67ba842353b11e43269766053a269449c345dabde4389a3b2aea20de3b526a5fdae5bfa82911084771687e5744b68c7d1e7c4be3ab6b951fa0b309f98dfa4de4bb7af6f30593e4909b73ba01cd821f00b3fce9cb7bde2cc5f1597c6d33286ed6727bad2158306e16cd0658ae2e681a7e4904c14735f9e28dd80a2086d5083a295a6fe4dcb1c8bc77f5511adfb988502c7f4ccaf62e5b1a06e5c9862907f429a3bdca404a3c37959140adc496ccaf6a2dcad445fde823d2bc84ad50f67897ab869fd3fb5d0a11db04e81a7753e183f4dca7fd0e93662e68f8b19db1361ff0399befb4c21e4219fdab458c41e0138f6e6c1df15ec85929c3f9ade1c3f4a7ed1fcae6f02a7c4ade6e9872841b88e6c36f59ec976df8b52f3d68148a9e63d6b9e333585714d4aa6c948ac8f4fd39135a834fce268e45ccb995d879a7847553dda3685b799e29730676622e6fcae46e8fa4d34419498736441278a91954a8512e179b6d41e6f6e50689207e00bff01f84454e79fb6bd767021c31b2247a804c1c0f2a67c7722a0503d1acd21cf7c4ff5bb0126999151b5cb58bc7e345284d92cacdbbc3cd65c57e48727209c1dded2f693e93e836a0a190fa7eba8be19f3f8167ed350624f3406d9885c6015943de82c0fb208e4d92753bfcb609cfbd64103061b39d23bfdb025e0a3f5d92ac39f0f655b92232f484ed1dfcda3ed701cd9e065934cac165c98133fefbae89eccfa7a20d4ce9904609deffdc720df8db66a2c55eb492f9d010ce437d8c348343a6620081ba36edf641187483b6f06283d2a24ae2a56e7efade1e8a8ea1da1b8145731ff78c76c8e8431dfc79781349a7bb91703b3bd6a7a12b4aee2edbdca19a8dc1cc6d9a844e8ba5d6a1d3bb83e3dd2551241fab2e0c57d57c585c74a24bb1a2f18ce833fe802e626105556d4a01fae1df4f7f1c74dc43e91b1ee5800764a7def388e4bc9ea9cd04c48ec4f3a460fabc602b0acff9ee4ddbe8fcaf05aab42a2941ed077256325a25d6687849d53828df68350b498f2b32a5ada80529d1216c8db3efb2f8f884877695ba419ffa35ea4c43a04b35d0d68edb8ac03852a764bbcb76abadcac8258e71e33bcfe6a27a4d693b8981dbeec52ca27bc1236b4f9658b8a978c213879d23feffdef2b8adc8e0b36378fbcb822caff0b1c690499f38726d1c3a8682a858e3efa167aec37ab363ee48b6059f451942ec790f4c5784c7f87693af21dafb8e99da1c2c1bb95583a1da957e260f0b74ce5a04f099db6d15c8a7b9aec8cb0476c0cd4bcb21b73ee652ab619eed235986a9a594b1e711312a3b68f05fa3d47d67710000000000000000bf6e800400000000d55a7ba41c99ca12bedc327399158478ee9c4769289eaf3588381e12a242fbea2e2db9cb1963481f6c9cbc4d671fd5f1e9c7d6de1137292f9970b02447bcf9c5d21919c360454fe35677ccf6ae2599c38309c6ab39bdb57e9bfba28019d8f3e400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a72d3c4ea41cc3a8684788c3f3a70536617a38ae40b5cbba37c9cef4ce395bbe62dc28d43b170369ce4fb346663a22bd2ed1269ef1565a7510fc2239efeeee4778e497a3cf2025c9ba5308dd1244080fd27bf7653e37f2fc8a89bc4a3e5028b2f69b871333b6c1ef6e8986ed440737a7c21cda8502e07f3c4cbbcb545fec052303137b5691d834455184e9e2d3b7be947e7b4acb522f8c6ffdc7f85bd8996f25ef032bda0caf3bb4edbd82f4e63652a89ef2cc0c688e95edd1ebcd512c5262d7f01e0a006f517304cea40b42152ac50cac126a420cbc60353d4ec62b8f86da38821a31b5345e7b3d16860547000b5f89a94d1a373ddd72b2b15f5be336dffd716b17450220b9d40281885e50a068aa011b226ed2248fdb93a0b16134c6b0279dc78b200e03206775fbbf8cb67f70ceb3c19e8047a88d724b0ef5fb18f86f18d41cf091c2a9022c6da72ce66d68e0913629d5afabb7e7a23667bdfbc7de0e5f8996a8340d899502197c6d044bb52c5f4836088d5289cca835dc4336149b6db4f8f6cc52e2019475031092175e984530956cb92732de62daf31657abec66714a633cc09347d0b2d481732bd0e49f10f96bf28a4cead5f4ef6ad50b422b1431343b4cc74ca807112f1b04375632ffdacf62e465ee2a719f0d82b80007c84081e3e1603e13a4a6f81329c6193370a77e2d46131939c4065c11d391af1b1bb1a9611629db811cc70667579bfd796d405444595c9a3c337103d1866a4b70d5d2b6acf78b33dbe3ad4120a543dfc922139d0452414bd91ab5b1802bf14037faad54e74a52e8475f24795e6b526804e5129cb17f9803cd6bb79ed87d5bcab26377f83d66a33093e838b8cad1207c01ca4f8d311c6b5c7d82dc0864b03978614a35b8e778062ae791047ad1f37c5b88e4e0a49cb1625cc25bff599cfd92ba0d5bf66df0726632355ced6ae5d4739bdb1950146e96b67995352f4fee7d241d11578545d6edea1bd81fb8668dc97c09dffcdc445c005a30ab3eb769b4a92937c118197802bac3ff4e1989bc71e202b7c63c7020d2edbebc2929c22f4dc2ec43f4e3bdeec5a174c07862c3a2f0501aca12e9fab9b650ed35fd7c5a7bf0fca01bf4571eb6d2f6849f667d231cd4e23f8f1ec9954048c0b853aaf159366017f0abc12e87420e0eee7b5c05875b825851919006d05d01292865277aff220d5cd9548c135fd2609c798b9f863e71d518ab676717856a75f954c4ddf4e8edbf3c34023f950566702562ee09c270062328c5803fb8643de4c5d8e09e541a3c6370fb50e6b5e424bf0cf938b9120bef92c57a4efc5dc9423a9a329989c9ad018f4b52c5681526c2706843af26b1f9e8515e5052d96ea78de7930736b953e0974c6b1d959fb96ab4c7cce57470a84ca68198af56ac0e71b98bddf6acbce72787bcfd93e4180187fbde0832367f2a61086aa083b5efd999135b1ed6543e65e809fee917bd74ae3b8dbd699c4169f2aa2e28c213dac352296a8447fa7dadcdc3af197e32470f13fc19971b7d9e717ab61f79a9ee6c0bb8fb63b3b426cfa318091335e09e65a378282b4d5e14548f52caa74ad3975df2a21711d76d95140917f749f336c545fde08d1f445051466a6f47a39d42e8d2b742313a65e3754618f96b49f4503473ee698b8657e7883cd404362e6c1346f669b3366eb322aa51d9d8621c4a10a04466610d9b321f2571145bcf2747977b08c6c2d627d78a9bcb594575d0163d11aab6904ebe6c8bb96de727e5f3ad2552b1e4b9ee903671e4e7f4a2e1762195e80ed94dc0ebda18e8899cfb3598775752ea57c66af24f8802787e9ae709717edc9ee83d221db7a478ba536a6c91ce2539ab2e1b7f8bcf22895db6300c666c6f7b5b645e1bdcc6921c30c955ddfb7bc3e508aa428969100b047d33f0bd6490f32150f98b204ec91ebbedfbd2565c5fc1d6cc0ce56b386deb0a9a96340e0ae42e992d071cad49d2f8cefcbea21510b0c780ea87e6fb62b5f3001bed3a3c21a5a39e7c39ce3819ca1fb43320589b7de9d8556b0cd4472bdb2ef01c74ad7eef23df76cd821e42be02c273086f138ea8acec23864e66f107e44fb26a79a97c1969cc9cd7f67e45380ff125341b4bf30aa6632caae6d858dba0c68b055cea0368ee550e592b8fcec1d66e868d52c651e27bc2410aa02e4bc453d01e0ce25f5eb94b8fe08bcbaae3527160c292cab301738f28ea02ba4ef66dab8e42446b0b388aee2c836004d0a87599fecb08779db950d8bfb9d3d6dfa69d72cb668ba9f8111c4dea6323a53b0a04000000000000000000000000976758a2151504ba470ad2464573098ae8a7210ab6d89311f2b79bb1f9fb789edcc20e60a0990468f78f63ff7f2fb4968f3f357d32f1864df7e5cd8b12e422b53163ac14b5259a2ba1e59c506f45bab801cbf78a70d535a2e9922d7cea50b10900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fc9adbdab9d938bab0c2d05e54cab88fddc6d5af45f4e0548c05b7f4d3117687faf71d2d9fc9c4587d51e6e2562fe97f3fb24c8271d8ece405f6d3be60d1d13f620154d346e182496fc93d316c327b67e4f446ce5a85ce488df7187875a949d2d1dc8e45e9cfb1ec7ea6f3fcaf2427afb45d2344e872af0396a9a31bd4c2490c030d8c050493c070ca8faafb1c4320757729e6bc8e99b4b72850faf0216d7a718702301313ac3217d58027f5c0fe2df58b21608d269d78008bc0c1ebf976dfa9d94d0a00aac990c8571855013df3890674aef97efb6c6bd2c059363fec933727397188dbf39e721cf8a55d48b049c63319ae362e5edbbb511796b6d2f68e788cf7c05c021fc81a4c1b6fa388e1de0f2a22b689ee724c786d764c26e1a09dcda06f62d37203245d0f89a18d786d2b93a9aeb1a90ea85c288b3312fbc8e67c6b543b29052f44021480b6c88997b65906d94f7ce0abcdbef1ae7515a58d9b1b3ca348a86435367a03253b30481d69607e9854ac4fc2a33befc893af47633085c82c031b5f2bf95540032ffb453c635619b6a8083adfca0c69c52fda64087495e3252d8ae06aeb38dfc97846f769407bb18d6555da3017bcf6fdaa4b35440eaa3d941377336dbceb2fdc06569d9adf11af5aed109e4ed72165ba6df5cb22c5ccd763e2e63601493ba90d7bc8887232b1a473ba4ac92c2e8134b74d96b8eb99ea0b8b99041cd3914814f8141e2179df1bf3a8609d389072ca8bdbae34e9457d186e2b32cf6c3a1b56c34ece86ffae6dac48a96f939510b3089b13c90235dcb171197655dc6cb264f0774e0be94ce867f10f78e52a9a2314bccfcab5a7fcf3e6b09d5fc066141fe49a5e3f0cce7be265d377618383690a0c63baf4f1e3dd7d9d53c542a6a5a350c106a5a80b210ee450ec9428fe84b3bb192088fe2396b16b260580fb99866df56e323eb08761edbe964f105924d4e6736be91e1de1a8fceba7325f7238959d4f4f09221834c50940a4b5d8fd932973df6d96e930609e9dc79f7e57df9ebf8d16a2205757ffbb7dd8a432150c52613985ce5162f1f73541b4ac3152eb0d1914397dddc25ab6263479110bcd06a941aa58cc664546c785e1c9a80d6bc11f9b50792f6d2937178784afddffccc48e00ead19adf127df98aac9509212db650ca7d0eeca65402e22ffcfd13944b229790582586989d1d0f19a4989f2db5f46210747fa40da42fdff2e51c94121eff6eee3f4e0fd0cad6ed8ec9339b97d2261731c0ce2c0d3856d3f34111bdc3f909edf7fd866e52c1aa964c871106e357b78f1b1c58962354d40ff7aa1c15c911d0378794e0cfc92d07e6ffb1fb53b52ef498ff1cd7e2636e4f1c7a701aacf1b619e535c657c96428480cd1725953f679ac3d4f6786ae6bce08369b5a6aeb39dfdb40252db1aa216b41505c033fe0b3102fff8228d9ca0c0bc2832d7200932d8677fa8e018a4db61bf19b01e9c8caddae5d338963170e9cb45b304ea2b1941b83659044c982d5010221a7c22fd08b2c8aeb3389d84449c311a987261f07eee4f36401d7773f8714fcbfe2c00e263a75448922eeb37faf7262970c10b0ba951195a91349e1f4d94735d37d9fa395fc4897c16a9b3ae3f509595de7e3f4e644ed6e0dcac09ed97d6a4f247eb29d7034e4835cf05fc72885a25a1cdb28bc6eb201979e509a5df6d9bf37973addd1cddbf9817aef75a2c86c582931fea11033c8a4081ef9de3db324530523aa5c936e0d11ce38d2d6567c53cc2b2472569f0b44dc961bb91ef7ab4328d43be613d6fbc90ba0f8b9b9f1d51b8878a0d2f663d90c7f5731cb5ee00addb658614f0ce3562d9ac151ed8158bda30395d044b4b72d46e9fdeaaa9b286b971a27305f223b30489997439337165af3db1c7cc3a45e976319b2e2be2f9f9fd1b6c6f3cb3b156f70f0c6c025e1ee67b9aa986f63afb3ce14af2765680ad52c160939adee3eec21b2072592cf2cf16da2736a001fc60d164e8cbb9237b2847e6c01e0996cc045ee003384525bb1f138156351dba1928cd83ce05815e21c1c5dfcb4f2134714ff79fda20e04b6a82f15ad5625daa922f9028c46f352407d15e891084fb53c0cb792d7ea4bc88d7442e90bc60fad3765abd72e2dc1c5db2ff327c6c937922b57ae1a152562d225762a1ee06b555b2a90eccd46bef0e47e482fce3d03ff337bb6046c5f39b517ec5e0c6514005d0417d5d8fc73b52207a54f4d5b0f3b693bb7146dac46d21cd9e679fea1a8e25e90dbbfe3f7c9b3ff9de4a8a35d7c850f8b3f72eca61c5d06fd70a54b1cbd548604e4588fb835a178dea6efc551d6a077b6bc4ffafdffc7d96ca4979b5329e669d7b8fa6a14361afb49d556a381c862f56bb35f073a5db02a505646f8670bf0bb4e8214eaa638c78aab7074efe05933332a1e0c", "0065ac00", 0, -1958665865, 1537743641, "2a23e17a9fa81f06cd125a69c590c372baa107d00137bef5974f8be3224a2f77"], + ["71cd190902e47716b44962d2a4bc566cc7b34d5b87cefa4d7692864f351ace9b09ccf40fc0010000000963ac6a6aac63510063ffffffff13077bac7d0d5742a15219be3bc05897e9cec9a3ea06dc2952a9dd7f8940eac5000000000752535153656353ffffffff03c82fa4020000000005005153ac0055ff0e02000000000152877d63040000000001ace102b16b00", "6a6a63", 1, -1846771875, 1537743641, "69602ff006f460b46bcb500696f15904ca334633090c8804c12981dacac42d67"], + ["eb07f25b0134ddb5c861fd6c5b6f006b050b3d4ae7d4d517162f116a4ef1e8fc43f9cc1d5c010000000353ac6affffffff027c23c50300000000010064d84e050000000000a23bc8c50300000000000000002a60820400000000c54b084c425fa1925d0f851b5267f04140b9193c39dc82ff3a25eb50e49bd7caef8eefc6ad000de437fdb89fa6f4580bb9a9ad7db0aa7c7e38b6e46864a6bc6bb475229e9a3f8e7708a86a0ff2949e8e1bc23f5b37363f252b178e29b9e8da580000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080152303fa326fdccc7b40892c8ddaa70b18bc0fbddb4e4c1a896ae3f39178dc3139bc2ba8fe447bab052c3a4b064c09aaed379ac76ccdc898a02db41f2ec0885b49ee0b80b8137b6e99e5d8a2baec88c97589a2a92e464f959ebb3b45b49c5582f5ee6589bc7a0d55dfbd594316240d42b69856898565d650a08b7594e346ad021021abf4939fec59552ae250e3924e952a8e4bb4b79f9b307eb6eda2a8eef5d10218d0f6bcaf7e070b72a4e190fe3bd13ed3e126497b21ec4e0c872e0a998be5c70b000061161eafdb5116b178c68cdcfa35afcddd690368f474f5721cf55c30e0c6a7e0ba4c330050b1ba8c6e77b8c59ed82e224e212cc20f59be1c2172fe7a17af022475d65acf891b52d95fd744adaf41d475298a333a4f6845c6f9d77bf0a3079b02211b6c82d56932af50338886f4635d74200bb3868ea56a3785b94fb9781d89be0313ba44fa21b53bd545bdebdaeacc6490c1b95dd607fdee760ca6109da477cb3202287d3f761d228a9bf639a88fe9d61c1f83977b8b9a5bc26c1f055a356f72e83403267c2f5df2607f1d89a775a2ceef92a4feee893f9174f43750c8bc60ce76cc73ce96fa252ac11f883ff9272a7e916a15ef6d61a9b7a49b34ee31852875b08948dd50bf6d6154c2d006ee3f15ab90b8e3cc86bd3d01be19e9e8c94c11c7f281e2b15972a2c70b68b52ba7eca7402e386b1866ac673d33bbe6bab38e5e195e876c206288002f05622ff48cc18f560996d954471517ec5aa7bd8f2f4baddbed7f706a95d9e5871004af757db7ccc3f3c354a7c52e5b7494c0490e4d07475602802e8f3225ddccbe1f817beb457e2ba6395e769d837b338d524242ea44203eb3ea1892fccfaf81fc3eec46133a6753cc578c67563780a75bdc15c047dad879c498deb45ff2217a5c31737496309163ca790a941bc6f548613ba8152586db83ede59728e9eefad2838222a0d99b2eb240b2ea738b2bc8d7b9d425675d2aaf5e22b3a58e204cd714ac42a1d4a8097525d069818736226767666128717064f659da08a70245bd9ed27e415ab350050e9ad7d2df31a6c4e1e4a8ea5a6a24bfb531b2115a100e62c20027ed3611b47751fd5f119fbc7e68d46e1eab7fca4d1e67580e2a0c8afb50bec26da04378a1b32f9795f57efa78b256a1c4e5c7538faf7d6bfa137059932f23eb4afb0d5b4c5f53782223bb7cf1161127ec1cd6fabe8913c1f143f55d89647e557b6fe9393e0c3592fb51ac6a77185497b208482335b5e6f94e9079df4874c578de6bce3944b91e5e8b97ceb0e4f897e72897bd0f40b1b53c5e057076e4d81b5386b029001f09c1abee6282a4c74734fa08cd7489583e0088f6b01e92d74d00831cbe5f29c4de28d5a1c23eb12e8c70ef47a9db59095be504e0c6adf1426c6fd610c15227dc34ad383ef9f4e9af0d26aadda3011c007e7c109463bbbcc63d6dbe8865e928acf802f4006d17577ab0aad33fbed5b137215fbf5a976502da2d4deaa96042a29a513da6a679ce83ba81d00ae1a1cbb8aba91f659ae22e424791d37a7286166c1cfa7da1f354a611199acd3135855f1ee9f09ec6d3d335bdf6fd97d8633f1c07d833cb14df38540d96513a7c7efe07748e17fa2c00c9d0c5b560f43e7518b4aaa907be5d12a25af996724ae46d712361b9060dd59952ad3985cff3f5eea8cab2ef6d17c54c27077fd5b1419bfce73cb101f99628c7dbb249cc9634f98ab6d1122e09ead043074f178c8b35e4e61f584f8694a370fc23bd59fcebf27a077fe333b73988289a5ac41bba35774c78ec876f109732af31a1bde71ae4b95f5f73fcdc2c5100f6bd92f7842fd1b320b09059e95926624f3c18cfb9b882adf398e84b2476faae06a5aaa1a394ed9d53c09b87e09f7f671ab20455396be6ac0a981245c66024d33853df68caa011d6b76ac37f117ae187fea7340664062f95799c18a4f45727bd90c337dbe9ca39f213cdf56ff18d6c35921bbcdd0af0b3ecdc225502e0e9d19820c397a6972d38eff0b65da5858e7cd099f7f73b457173042c4ba072a5dbad8731a661e6c8e90803a987724f0349fc2a9903fd46a77a0e7d03b969e61526f19a0564fee944304ad9fe028c489258644c3e1f6f7500d22c9588af5b603a5058ce2ea9edfa45e421f1d4f85ff00beb130411d719fe0aaa927572812b19e064e8c3e456d6f0c19d697dc0984362d3e585b0f30008b84d341954867a190dc1c4f19182001df2226604e71f79401640d02c73509998d72cdfb7d3106a1badb55eb3840193657dca062300860500000000000000000000000013bf9ad529911fee442d9954596f1016fb1c1ee363f4d07dfc144e96c6638dfc28e974d15f0f3a1bbac176636d319318ff3c763548dfc40c736e1ed4e11396174071fe6d8ec53285f6314ff44a8e988bbc4039279b629b87f08fdd40a404b8ad00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ac63ad0187fdc04a8126d9d80987ce2f07beca083b12fbe11b3ce195482e7ae6f72d3e59c787ea2b80cae877c1d0294887cb666bdcaebd3d2511c3a09c582417e0723fc419338ad89fad8779b6922b4f825f3b6664fc1dd0f0f93aae4d70fa3e6ae79ce72abbfaacb154f7fe2629e84bf31238c8d196eda0245b9cc7bf19f3780319162c528fb1989d3ab27ffe713375a31f66efcd34f6f1561a896bb8c788bc7c030b6ad56e4ed304c0bd16e99af4a9c5125b857e129804b958d9e4e84624ec4d770b03bb181ae81e5a2ee5c7a8beaa79bf21960f1776c89c00fe1170329729c057aa2683e3146b22759657f3142e0f42ffa8a3f301731b631c481152888e5316c5580324320095247c11659773788bcb62d32021eb66fe88bcc86ebe6af158e9bc420a0301ef231947ec0fe46183bfc47726f559a7788f42c8cbad5beddb652b53238ff5020a464b2d43d2e20abfdbfe64a35403f957537f177c08e9caa0a040e6880a53f40223242136d4d4c6d89633962cb04477170ae01b5385f4a19fc83909b41857c7ab032985c97bd07ef4e9380e21945067026c28abd664c27149663109cfd5f18ce8826f516f7bcff94ce25303f5906313164c9cd6e90dd064ad6fbb0054c7c0d0ac1b916732e339e02e23a436436ee46673d1a1da364e70ac7c43694924e0e49a989b90dd9ef4561b10b85fa4578fa959d067366221f2b161438cfd532af75f871b84628d4aaa3b625800e6bf416c7db409eb86d4c521610865a2c2aff7168cd2b7e78a5c23edc31307ebea8693f23a44ef5ea61f076d0c49eaaa356fce9a4f4a2e27bc888fee8ea09b8d7700409ba865c6e8abd8bca60143d6c526fa16501420c2182875a685e403354de4222df6c7b0074bba9ea7b54aa55720ecf54ec867e84eaadc74d07856335f73a4f263868cba89cdfc926812f9352b43491f98f32e33fb6452bf07112fe17d267f54a9fde2212127f8f9c19de3f95541574803e5ed9615555e8129ab71c8eb77904b1b7e42a679788fb2fbcc0fb73674b2202ff5716c814259035d15457139ef4c3d1775bd97d4f62b7aed027612a95f41f4e03133de549dd84286b0c2974049e3c05138e4b2b21d4f282db265e2ef83ea7294d3fd5f48e74a1ba987e1dedb0973b3945d70238323988af1e91d40dd57f4e864950eafc9f08211a25c598ccb9e6b71c432ec3d9b54d152bbf2ec7e0ad27ab21d7ed4e5445c2c5ec62f138d4884f2c15af514e8cbaff57c95bc1dcf1064753cfa595d54d9f145d84245f2051b9e5a5c56d09f7b1daaed108b40dfe667c6527d6facc4b701b47443852e2532ee7ef3161bf6fb4a4f0112f84c44b6d44a01f520389bb037b52977d29f9729fc69c7af4826e939eba222f307043b701690dbb1c0f72d1c619d1db7c2c6cec0025f254552c688f59d1247f19236e644ed8c1933fb06b194340d336f4e5b71751b5dce382b734f84cb91d949b55826002c7c32fbd3dcdeee5771be3ebefaa4d54a9ee7498612dfc5ba7bb848a9940bff8ab60104a0ab591563a62918d37648dfc60e9df98432316a3fd12393230cca05bd24a549d60f3a8bfb15c772f3cac06e3f50dc184252ead1bc49797d338cab705841811e99066e1e5a6f3d8ac2ee91a618274c46bf7b0eec4f5a475c1f4f1a0720666b9c5bdfabebb2c516931ec3688fe4d71e44dc0bb9eb2e58faf47c36794cc5c7af57bef88f1189c6e304155f42e1f517312d03a8f8b9cfbb0ab26415072e6ab6d2d3ff0ff1bebd40b74547904683a6d4a823ca407470a5036612f6c3f8a3bb5101cc79eeeebc309c48fb05c3af8a392b0dc3490a23660d59f3a36afa3d5cb86662c15fd1f40a185bed33365f09ac075cdc5952d62fd519c93e703121b117b2551960befc2140c5bbc0843195d3ce54e311c3a752809119690d2b64aa7a535db3b6521e16124bea566e8d987cfc87a2486e97bcbab930f56ebe13dae7ac8e81a99a189aba3a3e2d2a21d82a8c7ed6f8d2b3888112a1b0df30a6c3d503a329652b9379ec3da01f8f98b02be6ff1b2dff515b8cfe27bbb9fa801de76fcd4ab20404ec5ec41e496b4f0d20c1a288c33a095339e4bd7b66f1b9560ee15ee96d2a538d10a6cbc5b333cba7d52ca5655c75f04417c5bdf9fc3af677e9f39279ee355ae63d6e918f6df84444d51444080cb8d38aa2d4dae81586d62d60b8c47756f216005b8866faad47d0c664b09ecd9b6526bdd4f10e0cf11ca3d1fecfe8c0a680353313a6980c1c0854b2176cd4f5d0789cc86362ba42571d31c598e7105714db02000000000000000000000000bbc84cfff6ed335c6cc714722543ec4e85f5e274b3b8abb07e44fe9f998c5e1de685cc32f646e0d5e760c4754f02eb9bfce07028b120b02e8c45fe58cefe3517e3452e17b7cfdc18f0f0997e1a53b87fe6c832b72520655ff04c9590bcefa44e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064c4293aa4305dec0cffed3deee8c34fa877dd969b8f030aedc68fd208d70d200fea10bcf2056e4880dc985ebce5cda46d7a84c60bcb00eccf25f160efc8230e0d2746def33066faedeec4857d9ade98fef83cf81b5c519e5089ab975579a3e4543dc7846328cdc64f96e2dd1e1e9ead2a8e63625bc3437d17a0dd80f226aad8031be8de3eea129316231a0495fb79534af359e3c6c998a9e35372351ecd638d320206453f820be80aa4139ef5b9581212ef519226ceb382a7a4f2e8e81950d174420a014bb0885d48928922f5e3f70cbf47ee38ad282d17e158ee062e72d30f1d35cc98a59500e5b94be51ee5085ed3c08945e92f275c11589c385d8f22ff6ba3238a0321944d886bd0e4f12e7e47fc885424961f71c3e5941b26bcf2b10fa86faf018c0203c54f8212391e13a518103f859f4b0a5ba8b2dded37f9d726e3e8288b32f9cd021b0593182cacc2e9790e02a4c02164d926eb0d72c46afcd36b8739af2c811dab022b804a87d06294e969a86d926f4d51f1628fdc5ca4fefa9a00c18ce4d8f500c30209d6d9a0e17948e2041a6b65829b246cbbb5607e886f4a3756def6921172a156b1da5d460cec002dff782522f32c2d944985cee4b5065ba0ebdcdfa1348d0c62a378177e61b94004e11616c157018d411771c679e13413c06a43e91c6b6917181d161d5e1ed044faf03319b038a28df3cdbd78c19c85ba237ebaa2c835efb9b03b869b6ba42f9d0b0b666f61f55ba5291a5e39848cf181ca9ff18ce4dc3cb434b284cb25cc959e65e7e02253299c0616b1d4952d018f0a46b5c6e49c51a295bec52771ad3ec38dd4ba033ddfaac1a71a420167381a294fc34bf51805cd27c70d28e8964ec61cf01f0344136ceeb7593cbc9bf63989a1f92048f78917ea5ccfafd23b7148b6892226b35f26a235d8002ae95e3461ee87697f7563063f8075c1f93d219eacd39daf9714d12e6683447b4d80b1f5c1cad3ae64d2ea65d7a047d552ef640aba4136ac9f68f20ce87b4b46119555f8b837979cd51a293c32002d671c845161cf2fd03f4e2278e0db2ff7fb2fe25310c68ca8667e532e0a293e4ee027336ae1b4b2ff45729c492f6385cfbcb0fa6c4d4d218ce02906f5a71ad7a679dddda7e40c47d248d840ffa76df09a34b4c06bacdd6b3d5832c31297a466dd43b9548279c70ded31c163aef74e9955508642937f033f50bedaec178cb17b21e446248ca819c4ea18367a73baaa9e6d41c6a30a6bbbe8e8c395d475ba130205ff8a2a9945576484571edabfd06619301e56c8de6460a5971bb6b1e90d63ebe6205b189674427719da626daea0f56451ae84837e65649e5e340cedda610037ceaffb10da2e65e42a9991b574f55abf605cbdcbe4325145f15cf68ef7d61a3c19456eee3bc326c7498c13fe0f7b80e83a96392f54255797fbad9d976317cd78dd04c7e16e83080f3e6f5590440362933e2e8aa5af703507d36ac3948c96732b31c34e46790907305eb9283299f65b776fd4dd1dc5c678eab98f7d3bfc7bafa22100c78e5e1d073712e59f1052f1cc871bcbbd1c210daed3c920456a6b5df8cddfb45634d4f94ba5cf7907f2482d680be6e379f00aecaf6b2585721985f2a9d29d552395db8f6ea971a220bdc1a307a55433fe5f18bb9635cf4e446776586356a8dfe7da298f0f4b3b9e1e7bc399f2a13652f63d3427fbe364306906ab912f778443d178f28cb444c049482a909a957c9233d4022e33c23e077d2d2169074cf34e22b2e81ba6f336b677a52eb35504a7a3812fe6b95af9644e13c1b029aa57bd3341dc8c8c430852c47f8ed78a510957b768d9ce6c417e4c4b146d5701276c403d545a400ab65c2b691100754693cc0df797ddb40999d861166415d3cf85526e2a95a954887b7930ff1b8c99d3f778e73268d7c596dc79c1992de10c1eff4cf3f991f55d792785f307cd0699df3123fedc6dd845de6b6f5e8ce5c4a9185838e7f61b4af495fad58e818b276e644bbf9f310231abbb2f006e84a2829d0adc74b6bb88eb8d911d74ce9e5768f2b061774804b2ee444b6bb809e9b8bb765e54e6ef0588cda86354ce1917687102473522baad4696f23e4664220bd64b3647c920e00733ae00178b27475da57515b35da036e1b15238e2eab7606daeca4dd929372d39d9c5fbfb06510c0f15a30cca4378651a85bf7716ca377248ca2555c0a233ed87b1189d53254a456d49303d6659d9df23e11180a808ffadeb524725ec0c8e7132800b563f23b03573a08be0fa111dd103f579cc7b23e6257ae58def34b5c7ad31fe56048f8dbd4ed2fb488970c7838f104f5bbe99197b83cfc2ac17040438f3c3871f6f69b3f3fd77c538cc87e3f4eca33c7ac8b8e350eec28f063a4015cf67e86c5cdbeb127b962e880e5642f96cf78ba958630e", "6a", 0, 324602984, 0, "165af8cb3caab25931ba0c3b832ed061e1ccc5253448d4989cf3ecf24d82a728"], + ["030000807082c40302317af3078a73abc89ca47b3ec1db29aa08d71bb7b1957a7e9583779c1051faab0100000006535265655351ffffffff0b05b84e88d1fcc9be364baf4422820d0ecd1dff27f77aa904606611ceb973040200000009655351ac6a6a536363dd3c0bda0130b03a030000000007526a6a5365ac53f9a720e74e7ca7d100", "526a000065ac5300", 1, -1245418366, 0, "0e50b750c73f5225cd7a841df6028c87c91e7fc2ba69fc4472bbe07d1a7efa97"], + ["be5a592b02beb2378abb2e63ea7103c81adf1a6403b3aa2b2c4c72e185075d22916ef6ffcf020000000553656a65acffffffffbb9732d93c974a724717315e2068753390562e3ebfa08eefc62b819169328b5f000000000963006a65535363ac53ffffffff04b299dc00000000000753635251ac65ac6263f701000000000253526aa08304000000000765ac6351ac0052f7d49405000000000763525152ac63ac000000000129449802000000000000000000000000873f5c59c5193560407a2bed64e99e583ee05fe755cdbe07f6afc1e1733f69e662e4a4e4b10ca094c22efd3fcc311ebde32f150d3529bc98e7c4dc4c61485fd20be79ad383e85f02aea21cf2e73860ae77d3d2bf55f362c58ef5e6e91f50996800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a64659dc7b8cd820f5bd19687502cc29221cf1f40ef039e2f0c6d9f3964a69dcd65520b866be781e978ccd1b45614b494bed279ecf52221234d1acd710d547d8c7568284ba78550637eb1cec92648d7ba431686950cda813957258081466d23e5bbcf05eedb7066c546fb6424e16cd63c8e9512fae1ca7f654b1aa6cbb4351c3031fac6422feecd58cd98b901fa163fe2e3a146017c43d88d4e6a64e91e6fe53770327b252f802a76db1e95b1a9396d4cc00e2c0bc80ff53893c0763d1067498a46b0b00e98ec3692f891ca0dcc2a7de2dcb6b883c9970fe355891722ef7450eb0c7b7ad330a6bc4b51d39990642f46e86254f407b840663f1f007aa7927a1945917ca030f10759211aec1d366ce1effd0ee27a27cf8010d3b0289018c804caf629a6cd20324687c9ac68e3b3fdd2478108cd33611bd575fcfa2d062169b177d525b2f2cce022fdd93b2cc34467968486f65454c30603eed8f4d224cf5bb9160445ddf264e15020710c7ff3f996e098aa1e79f423d2bcf19393d5624c265cb1431bccbaa879d960327ffc309114d4fb07c748f566a399848e8cfa87167296f9eea8799c4c2869eda3877b8b983ef7a3d07a6b47c62f555bce36cfbe8589ca33f81c6993c03d805a93e6da3707de1435cf4ef9e848b67be078b62de2dfaffc970687e4da2f06bd37dd0da9708ebcd46627641ed8999e88a1977a3964def71eb01d596433fe2de8f15713d1bd05eff984439da81681930ff412642da57e5d4055249fa479bdeb09f74332ac14d8fb868de405ba4252a0a4444d26c984bcbd7d422464c08eaa1869bad6e16e5ac136e7671c9da6c67419062cbb61b9b77d5a4ad812514c5d73bed029a54fb80f32f4d4199ec1e5804dbc156358dee2f02664f30a96c4ee44ed9968344e6d0184be38cde22824f345be4c7cb80600fc2900a02447f8d3cccad8b1e5830a88ceb4cd6ca31e12affc64cc1666ce7e5148010bcc8e9568b0ba8eba1c9917e5849caa51c762ae55be5a07404463f08636f14f735b6106d1cfffeda62ae6a547f4cef58e125d9d2b55938e1303b1d6e22a323e6bd73bd80a9386d096f6b3ad5943620d79b634793902bca70a01c3acbeabd6f0eedea75b93d38a54c9ce2be0e8cdb9ab3524462e444544c999c82791cec8dbf485ef85fbe02d61dc2ef63e67be427f01404c773dd41bbe44d44bd9bf7f28fefea5a8017848788699c1551a759b3fe2c2837d6ed05dc5f31dd00a7a9c67ae1b151f2ecdbbdce853062cc0941b7e2599e1ec3397c14f5e875660536a32d0335ba22436e5314cc53b70322b103f70a3cae7cc5cbe0be150bbe02a7655d919a7e99bfb0b381a4c023f509b67fb618e7a4c72f939cab416a04908d4e750b7288f735b753d8af9a250dd79a22b19d29cdaccf726f8e439fcc8070cfe75c7a0cee5292475a9ef744c5c686f366abbe5e1e111834dbf3ba7c30701fe8c5acf9f4f877cf6522a2a9985a065964099dd105f70624038c580d53a9e2c720e68bb005d35d6409ccaa795e736c191b65fe1bc4dfccb4af215b213f200d5e5376f4a7b6a2824d088c8d8b76670a8b634243a4626114fdc9056a85fce5b28da2b8bf45366ee6d6063408a7c8287167f5fd568286cd6b450d1f94ea926b8936a9f1deca466fb620e85c90dcde553ee6192d717bd990b90f4f44305c5e586a932f015e95620f37a40769a4389af735da2f8afdc74e6280cec6af3788cbd733d6b6b320d4ffce6431fb36c1f4f6f5364bdedfe4abcce8c1f678876f522dae5b799632fdf96a0ef44981513f4f7f3189ca69f828407b3aeff2fe6765faecf766f17c68128071f7ea7a62b68ab3b02870d9914d179e920f6bbc9e7e70ec6e49a9c2de740932e9a09a2860c53c67616f98534366cbd6cb6427a8e519a5ff05a7b93f9d1309324f8fdfc297b6066bd4cda0fdede5eeb83605658e330dde35cea117967462583b2a0544bc652e148fc5a3c2bade64781e0eec6e60bd7b6723c4f02578c118f13aeacd4f6113e6b6540029ad3d4c93f4c8d44b3949fdc46f32032b72d94fcca4deadf5bebc3d0d486efb57abc3dcefdc0e3fb4d1a0b1d152894064b45757c8150857f62e5a23e4511e8443519e68147f910050ba14c0752859b7e73f6f06ed1c895ed23a08285d3cf9f83e93db85c82f7242d64e07736e1dc3ef1af18346b56792a5c1be19f9359a11c7fe9af7f204429f2258b5066777d2e79a222b75801fff6b014ec1b580c727606683d4d85231c48a2c4026ebd0e655d3cb3fa087d18805f0b755a415e0208d74c0248d25f8a8ceb008a6a8ba2acdae7fe1f37a4f58abee05c6b3f7c4e54302d3838476c6b9027fc8056c425e808f5cc15c320c5d29a77c74a26cc492710b4011a038b3c4245761c7ca897489788d92d22da27ddda6b6068a92ac0f", "635252530051516553", 1, 590163298, 1537743641, "cda2cce2c124d1735e6b49038eb5a7d99bc24345ea0c38fd5f939ef4530a3e1e"], + ["030000807082c40304da731f0fb98fbb9dcf1ac69b2b93dfe6c14135253781fb89f24290d73815be550100000002516a9f5797c99dee4c26744071346973b470cfdc65e905a673369c4a7f986742cd33f2464958020000000752636a515265acffffffffac5a611d97e698c8d8bcd7a3d4e87ec289ccf6108a9fdaf4d5ba91f3f05597e600000000056a6a51526a7efedab6d4f12c0dcfbe4ff6ceaf0bf087a8fbbb9bd69309ce38e535297812ca6e30e85903000000026551ffffffff01954a8c030000000003ac5351db7c779acdaa4ea8020000000000000000c1a5fa0400000000f1fb8d8ae2f4fccf2eea90950f1c0b745092bfba1060316df13ddc41fbe248e32c31133edf3c999496b3bf2e84c4b732fd25236a4efd979cb7d19ef4313043ee5ecd68eea94dc43fad085500b38bb235851ad6ffff0af05e5bdda6a2abc9acc100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1b3fd015c229a5444d9fcb49d78010050945fd8b3636ec38cbe3d56cf7100926c32bf5e2ce7e1f2e799aa96a82fcb18950f040b3ebb958cdbc53b9b25908b8583041d301923179322168536facd5a50cefd6fae7d955a3ae65cc4ed0d46b5a81db7c320a6ce61ec0bc00c1c542b1a1e59fb07a5a86cb3ac087d6dfc244f43250205d5d1d8e991cc94a03b91b3bebb61b1622fa7cbbce80fbc7ca9f1234fd22267032e63348b5eb59ca104b0c5d612d4517ccc13f13ddda40df8e2798c9a54ca666f0a0370b554f0bdfb5716633c3d3826eaedfa931fabba31c322832c5974bb741c98fe7ea29191115311926de9e3c68c2c43d3431cc3c97cde4a34507769cc2303d102007f32f76b378188ff4f3f01fa92d2111299eb652359ce678406a9d7b01761f402306315cab21c0a09d5fa4b34bf5c141b82b06a9919c0a71f1495da1430245ff00330139dded91d860293f361579cda500bf5720602970994e60680826de9e8fa02031348c0e1cbcbce01278330009e41b5b134517d5a66d85411b4a345f9baa6f614022046c3c889488bc17aa5c1f6095796eaddfa202df10cf1a6a78a8941766ffe0f5b0b40d86c4a03e690e5e33d9d5af3ee4528962eb0cbfc38260a4f6dab651526c03e8e294bb0cfbf4600b65d41f277e727d690ef7c6d3c80f69c0fd9db7f8eaea72ad11cc93eb87ea3b209929ff557cd171828bddac56bfd63fadef19379fc63704e8050b5c8dab1283cb9da65d3d6af9650d6c374a7920881a371f591fca5a713d65fcbb1ae66034b97a5d6eb41a77b6a1c300c40e446e1019816705636b1a4f237720ac105330ca14a1a1981e5cc9c1a0b894169dca6a28780b0afb2a20e3d0a6ec419d89707eb481216df640a575a1e960c741e78bac917dac42c73ba4067ec41eff2b6cb03888d85a59e893d320bdfe7b73461f5deb53d40da804b2435e7156a4ab97f3ad96689e3e35aad02489158d4875cbd93897207516b5e38a469adfb314e977ed60f65dac1ee493f0529fca14f31a528a381bc505593c549f33835057f8ac11c431e8d053b7f9f86385c09af7f996cea20396f82b3195aba7f0c7fce68a1d52f671f582839da9b5bc15a3479bbac8a330fd6049adc9e29870f968d203908b0d394a61cab1a3e25a311d388a11b43e17573d490e8080e0dfb2157bcc5e3803d9703038948a1dfc309f744981a3248f67c15fcaa13364e1638f59e756b1bfc8c0696368231dbdcad820a3088fad5d654a457b4668223120940e806c6a7876839dcc6c6a1d4f836797af0224cbf54864f8c530f052f97ebe4963b1528edd3b600e2526b0e68d93c09ac710d4ea61c98da170826f29009a7005e2bf2a1e95648c00c9ddbbd2c7fdffe972f74abd721c252aee91169ba89f88b8bb22b9d807b5f3228d939fcd50ede7bac22f95dca014dae296d9555094c0a3ccbff6d847a2dd9c124bb461b26d0efb4f8d9e6ae586908787826bb40010f189c4793dd06cc25f03cd37ca87433ea025bb76a197230e9a46dbc10179fd43fe676e2c77a366fe0d97cf576f864f56cfccb819fa692826b1f44ea1f40fc3c9af368df924512698c7392ad59e026d99b7d9943a7e18a6be3146b6ea14c024973dcea19a03a0496eccf849abba417d5117b657a3bff770d8aa3cc8ba2beeb9b893568f0fbdcc7def99a4c6ff4badf08f1f2c66c8245fbfe12ff7b56ee8fa422123dd06b78681fe5a2ec414ca5e9ea6f1e41bdcf1c9aefcc6dfef1e0dc98b43b588979c00850e8074561f1455a073f103ec293e84e00b39afb4e97448dccc1baf23f9247f4d5f7a91df23f8f59d0a2a97f11ab7900be844d26f9d5ac5092cd0da5a4e756f300dd3948b7a7e2093d1e45b7f47878cc4d3f884123c1ce07cdc5341467ad34b2aa97b04e2cc8ec47d854c3c53f3e5cfe410ccdfd481f23574dd97ab2d5e19e32a990e927e1a6ab34a8a3529a86ec0f56e305f1f6edc46cab09053e1c74bb0cd08a35fc8007c0d9b2a1b63a04942bb35c82c63d7cdab0302f4976bb05791923b69e245d7c135b7438fd948283d4433947c65d800f3bef7c93ba6ab85bdf9612c8ed88db2ef49ddb8debb8e7968234d0993827e3e07c84a9327b1714bc5dd5759dc77be3c8c1e7c806f8d11e155d901cd3d9fb3e4439ad92082cf0a90c5803c0fce673eee48b5930743871b08d3357820b6b9b05d95b769ef1bb533b27ada3d41dc5cee51cbd7ba0f501bc2bd85e977c983dc4c28201e2661c422faea7deb1122c23ebe3a5b89de6324934c35808915231c47d2a6c0000000000000000636422050000000040991bcd7e560c67427cf67f2126a3ec29c50e6e8e2c8c55b2eda220f10fdbefd27be3e49177303901bfec7806367b90f2ac66e6b44ce35c4bc71bcffd53991be641fdf207e7fccf93f474ccf791bfbfd1db956bed0f892ae9f0900b1f031220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005958883d29d87a5c18b853a325d4ff06e16923149f22837803d8a5316895bf8b527982caed61e323bbc500dc687f7f4cb3d2bc3c328dde6eae241c4f94b5a6812f3bd6ee178b343dc2301c7342c69a70caf2d0419bc486c44f93b219bc9c7bd2f8cff64e08583c8c46dd19d842fc65904b8dde345284267ca419fdcd288296cb03091445481edf33d538f9045d32f7e787dff88eca3132decd14eb6b82d4856083022c2ce8098ac6ddf505536428bbc16c571c74307df01e82ede500adb74a0160300b044df381ed453b203c7713342c465a8d43b14a2e76cd71f650706822fb3d68038e6d6bbd38510ff4bc054f3a7726978583a574e60a12952d62163595b8700d63031164e3a1ac26f3eedf263156041423163ae37479d5b538496453fb8b7147e906020285c2a4df8b72e894c0eaa5db4322de5d59291d650546b399bebfc9cdd4f3970329243cc65f434fbdb9bf993ffe04b68e4669a78bdf1c3d20f67aa0eea41b45ab032fd4df1b98ed2a6e2176d5ce951124b8572c929c6350391d2849d60b371de283031740d9bcedbf1f094d21225e769716403371a28b902311115d588a0cd02bdde810bcc5594c063c96c89b565e2656df4c422f927678a53f591f3b214c9f8307898b4b7a946ba8f53e5ed1ff9664d6251954423cb06762f9858ef75a6347336b24c0c676780d4cba70dd563773c942c63bff09ecfb8fc7d39ed65b1edb6a4a85a08c3b9a4917378c6de42572e3acd50a4f94606e91f2c644b825b0cbe329c8de564c5798ea5eda6ac31bbef24f4d9cf2a28c8ca6bf242a4f01fb525ac166b45a8f3ba5157b777f244cb032796827013f5a5f59d4a56cfeada661b431f3cf4a5f355d11c217804e549e68da6d2e58428843381b8def23181536cf13b6654b481fe5dd95f9c6568d3b2fd9eff1ec897b72c20c6be573dcb51d426e81c6e4d2b2765c7c581042a0ce946069cdc36dd40543647d633a9421726a0a3a20f2871772cfb33da1fc4ffef56a6bcdf9de1770ad3645154ceb8666ea59428b8f49857e862fd4d9d6dab76c5eb76416c57af2984441236a2d33076f6cd3ff8790b04102097cae36561c811bcde208e42cef6d9f2e8860cd7a2f0192931eaaf121efa17d857a0dab8a6f8198c40e2f12b42a91cade4be1d0bf35de3295fa5b57723e21928c1b36282f54f5729c88a13ed81bfa8a03871e81e00323b3d90d3584d54ba2c63f3a915c8f99973f6b52ea6ad35ddec66676c09bb21004fe68cd4976993740145bbf472112c9112326c07539fe8de565b9e3cdea070e13148160189c646d5b620fc03236f4b4dc336fc877979e80ce4c097c361422132fcc7ae78f490b4fbe784119a4a466a675d1877fdcec9ff3d457e70c54afd0053fac6af5f0bc6ec4dc46c793666aa5488a8fa9b43314c014a9e6db206a002d328f8e46b7bd3ecd7eac21a0ebf3e903afb38ea0e0360e4a18c0b609e50eef7c44d62efc7f443e5ac46c32bf5d09baf7ed6922871a678d1407e2e85c72896ace7c0e8011189bfc39c630563b4614eb6a4eb096c0b0ecb3bfa7b2727fc8f077916ad728013246adcd470e4e15dcc31a94574965ee0c9ccd914109a5807c25a4e21503e3ff9fce76b40fd803afa74e598c62192bb0d33ac75ee0532b132213e4c38f6405a0cad348b3b43d6a3884756260cb47d92043416fb5a9bb18bd27c926b80c993a0f7184e1ab38936cdc1e613314a7f343897f6ad1dbbb1f58d3182ba433dcef0dd6ff7f8bfa2a4893b370de535f0379fb92d8ab6df8fc579b14924bdb1d7ee7ada2479ef6d541352b7e510f59b1f1be9a42379d690d73fb3a303b7c4bb12fb8cadc148515f73c4594585d64bc9617c49cfd3fac7d7d8b34cb94d813041542605930d38390fbfd16088d653b02a81d05cf050ccd0c02789e25cc642fd97b6d314359a37cc6af29f716f420c3e1ccb81c0e15b858b9fa3706f6a57cdc34b0be6dc7310ea818123dc868cd43d4574ee43586a1a52ce0ae3265da8fc404e24a0653dc17829463f7be71b2e672f25cc56baf1183de6e3fd9c4a30da0762812a1655733ccb22260f5ca135afe75554236ef1690b6a6eee2c2c7951b9db87f3a60e9887946841989c5cd638689045203ea2199fb0660c43c0af8f4c7aa1ccf9dff4ea9f5c1ae3d443a7a120ca67c5f79c4d2fb46e8e95eb61bcc03c789deba3e354aa4aa250d16532b37d6be174bb2d6dff78e00503c41724236beaccfcea01befdbf7b75dd0d10565990e0bc6eecccdc50a0896f53fcb7c97310de84a3614d490d378592abbcc4fe8e9da3f593b9d245ea4f39f744cd7b562e930f73557d5385d71e6dff6019940fa7581a0738e40b0cc8329741399e2986d6755a00eecc6ecf9ec33d2eb78a883dc99ff78d7e691618fc8c54899c61c39b7ecd4f78d0b38bb08", "ac526563", 2, 792629416, 0, "15ef78367492b537db356e451ff94416ac3956f2f84890dff5c799233daf3564"], + ["030000807082c40304e24cbb60ebed7a10e7bdbe9a9cba6af3e4c8d6b11bac2fc6aef7d00a47734c8502000000076a656a6a53006affffffff1d12782f4759a3e91aba47db5c1314835ac1e64fb116a8b3c1b1d3570a5edb1e020000000651516500ac63ffffffffdfb842b3acb5ac515666cb3065f1da55965c1120d7d7f464c2b1060d257818a801000000035263639f623dd008bc72bf8218e55f62d4e3acb210e81a394c23e60f7fcfef1b052d1021a7a4b4010000000963655252000051ac510e89275b040a6552020000000004acac00651a484a0300000000016a46ce61020000000008635100ac6a516300e376430100000000026a0000000000b505069c00", "6a6aac00536a006a63", 1, 2024892155, 1537743641, "2762fb36dedf33ea0baa88d842029dfadb5db325963bdc42974dfc3d197efbb1"], + ["030000807082c40301027ead8891caf8eeb89f3baca8bb3098798f4c6cc73f8fcd6d26e74764ce3c3f000000000365526ad3a757fb0491ab320500000000036a00520474e50000000000007bec950500000000056a63ac5263f5ef6e0100000000056565655253916c8f380000000002ae18e9040000000000000000000000007d51cfbd052fb98e003368cb20cff91a2620035778e72a4ecbd88304860348d1c2abca03b22443883b3e9f2ed13aacd8d78f47cca131923a9b0a45369a4138553d54df60c5bdb0a9c88e775360f11b50a8fee5152298cca650fce6e12a2d3e0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f9a95306483cf5a59b6df2ccd9988b71304c8e6e0c468326f02acee2710de68c3d14bf416ced70994dd6f987e9f4a349cf2a3c550bfe68b29540cd49f00663ddab192f10a4ff0e13713a03f924703fab7c83ebc215ae991befc12b60defd8072de8f76c73b6201c0f5f629dc3b6c835c2bf4e795c22781d08042c0f0c9e2ae390321a13aa2a7ecb9bcc8b9e598155aea0125ee837d813d9b9348b1c3e56e984991022bd80ab850bc99a28f8a30e50019b378f1e9eb892e02ba07256095a2ecf2bc740a05514e998cc8511fa817a38582206e72178f2c2630c9ed55fefce2634610c35ecbe1c2125508f82f26000f5e7e935ae07548908de614786528bc4f9502e8172603173a0b18211a8a0a6dd97ae30eca3ef6f042b5de60a5ebd04053458d55f85add022db6f717879ba70ba28e3268e09de370190065d20afc4a60c632cfbdfef653540306c686bd66ac694f5ff6b5addd4a530cdf5a4f3b12e86cd23f48c761ea06679802300d2a742508acd6435c366d51dc6abd605943d0d5c3494223ce60ae9492fab40216448b36be0d660a3d47d3110b7a756dd265c96131d8f399ca55004d9ed493773947c729a76189b638b8523c8c09ce8d6cce3c38ea0124a35fcf3deb92dce8654e96ccc6ea728f14fd40b36c59d24de712b70b3a1a4039214a94806016a71954ba815b6e3689e2ca54989424281be0f3ff9e8b5f5d86c87754debb75f9aef2383cc7491bc0eb800da0736fb057245874a7cdd1e7b6611eea9fe186d4bd6e30f802b80e8a56424c45c9564ebf6188ea491a1b8a0290ee301d374479c75688c986a38338111980d665fb36b46bf0686d80ded9e543841f2f5829824184a4b2a2ee2e7102890c6d1d8febee3d9f6599af530da2ee115fa01d75e643b66a8c5314ab3777e95ed97f47afb9252f5ef447e59d555abe443735c2dcfd1401d06b96cf34e9b47b0ddde7d1d794c78c9425627896986153c412e9da1317d66d8b7b1856624448d944758ba212fe7cc9bc7a9dc004a7ad8fc054d4d0af0b77b702aa43d6448c615ef002c3eb00e6d0dea9c1fdd7daf0b078207894f361f7ce27dee5bdc9d1dfff10ddbee306c5a5dbb32357d99aceb219240828b4ef026b6b538f3f102b9764541adad8d965edaef539f7a9cbb1cb6f1aa115021a61ef706778db86c1a1660217495e5b237d390d6df7428a3ad545fbe3781e93c5b8c85a0947a4ff1e663974276dc948031220a3399f9632ded7d0fd0d087f4f47e683b2dae1164efa9f6feaeaf2825584c251ef164041eddcdc5e2271971bea3069385606ac9535e1d3dbee0eda20aa8776088c3ef23aaa50a9ba6808146a1e5ab6165c8ce682d3026ccef499d2b2c3bc4bef2aba254c288df455d5ecd61787b5be6193b32c1867a7021cfe07af4e579ad0e5e32bac01b252c39b20630a85e5cf467a6521b469349dc6fa9c3432c12cd49b2f2c7e54f172b9e014fc2e29a32ce0998493aa4df9a9e2e1036ba4a25198de1f08e1992c001749930da75216cc2c1b189c8c495577682fa0bf956ef11c6942e157e7a1da4841501fbd817ef005bc239d5bb0289e6051eda714998b855f6d37b10031fef31a8ca84caa6d21779a9baa55d08b7e8e1e9c7cb3fb363da28e3ea168b71105ea3d10d08bd617e5c334334755db58c9c065922f9b67288842224001ef7f234e8742a912784fe7ab43bc69c18ae06094333e594bec1aa1a0bbe9790cb40eb34e9e34adff5c6bd4f4349516868fa6519fd9b7515be249289b07bd66d6680bf1ff3dbf7fb84d44b22e24beba69345ff297ef570ea019097bc7ba3f58b8e9b9c344a9ed660ca61883f77751675a38bb7e832fa8fc48691d53688d1c3cef11ffe95fc5892eebe6d2ce343d322eb0209d8d47d7984d7a1c02e77272ec2efc5d26809972282a7bec77d08d9a3bf7d0317402f9f569a1a02bb21ac2425394cff663a9764dee991dedeacd50e0c873cbd20971bbeaea63cddb13bec9dcfa991d6b149fa6e3b73ee74327c5fce8bbd413d6d19a07135fac69064782b93cab76a233af5f3cc0124776894f0fbb5dbee348b4536b1c3ec85cd2b4c8afa69245b4f65a9f36b714546fc7cd0a546c1a698b1384221dcaf5f035eb4707c2ac802f5d6b193e6cc2bcfa2cc657ad339ce3b2a3d28e8bae690d298a40e0149113e35cf1539c5488e61299f5c5667908e4d13202cbc1920d922c0569dd010bb4f0689a772df5861139c9c502bc52da2d3f32cb1507be2d4007d2ff6bcfd63f68a9b90cfaa63dfb02a9cfc96a85bab3480a0000000000000000d554dd03000000006eccce9b71e645e886351d15efbb5badad57e77d093abfb9fa34ff77aee44a495f4e9b53fe8f42734eadde461c7a0b0e6d75fe6b9fddbda7e74bc330a9dbec8bb0db4c1c6bf4299e05151d343ceaab54e468587dd21c16645e2cff6aa8e067c3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006d18c97b824bdd9e20d00545d20fbdc5d983a687f70ce106d2304c7e3f3134a2cdad77961317de22c79ffbfa1e233fb1c0eda9f1da71e812f83d650e6a1cc4331610d822057e035611e5e2133e40f805f3c18014de353eacba3ec6f2d61a517af6bc915697eb3e0cbeaec4fb5c43577b44f3d91e6b4d43263835f13755a8db7b0307cb885e037945c2dc10413a40a5b3c7acfc4a80a4ec4b8b59655e67e1eb9d5a032b106a66d84abb8e70d874df2c0b012e9a6834feebd26621842ed24760e7bc8b0a0004e8243c4296bf32c1f10376bcbe492938cefa0bc01478b6bf9017f4f8d4ad89332c8faf2ea699780e88fc39d8c1566605d5c9bf639a43f963558f1fd3e2e3030b4dddb3b3be7303f777af7144b0e857dd8ed354c5afc0d6d29f8ac02ac93fca021b839a76e13c7a51cad8fa28bc394857addab979bb75324f6a6cb8bfdf9127990226cccade7d56a1d178766647394540073f8f82463db27010834c6aefafbea0a802235ff55c4ab39871db5b66244fafb6d2d2ce91b6b1b5a48a956bf375925c75c0020064893aa8a615f052e9fbec7a52560693471e57d6bdeb3fa9109b45873121e28727d9861094ad4a70a94ba7fdda06a5815fdb127d02b16dc4a9c1bd029831fcc16d95ab349b32d108dd487ef195da6b96d07fa60e6a09dce5aebc4614777a69d37b6996e928f658354136335cc5fe564f9a7a2c30d848b8cfa7295b88a7996800c67f5e5d97ceffa6c5375f3bfef38a7fcb0f48910804b803cfc5e01bdc9b58ccc335f45bf809d224ffa71b21ce634a2c6b4c0a3822c796bf1b09b09868a8da968d6a0851f3fdd95a7dbf53e5614ba83cf2ceb895f08bad49d3d2f2adb912a918e8c736006da2e4a740e3b4e90477be06856ea1a5092023cf00138b4606759a6a817043430f6afe44525854696128cbf758f2a840ff7851187e968294db7e756233433f4ce7a16d4c91876824dbd408da978cf0ec57acab45dd14353a2d03b6e4eab9dbd08a177417d903b52a6a6ab49eb9ee6dba13ff4eda5f03e4c1522feb90ce4695cd81d3ef42b8bc6883a6309c8a46a4189f0b6f9f607c06de25a77c9a4031a66b8ece72fc6ca9fc56a22a8f9aa3a6cfef4073dc3c8f9ff62cb6420521260a5d0d285e3f0168354c206dfbf157dca542efb0f4f630b6f75e52518f5fd9b7f3642ca822c3a24f276a46e6bbe6de42dc8649eebba14f20ff02ec27220e07352671e79e3e1bb157a610d924952ae05bf9a5d9fcc23e483bfdc68dd29b8b35f2b370be06f77003b11f0119447964ad1d6ff6e02e922f57ab422cac35d92b9f6d933f8dc1e89afbb694e7e40d00dbd1128008a13bea8683e693c941041ba42eaecdfc07b96af4132c0ddd071286dadb6b9d55e7a1082eb5faa450de9b4b4c2b868c100b4a1c4291a933bbd84b520d565d5d77843900cd4911ab3c4fb11aea3c6516f74e73581b4a2b928932c36c361892a6c8d9d9c3a43d8f90e6af90c7a1be1bb81554717fe631f91029ce2990295e2e30b54942c729d63ff85d29147f0abd088ed799f25f31e485f0f0bf45b4906ded52da63fe96654e25392a3f534e17cd17139281125d7a1d00022b589a948e066a3aa7e9f499361b8c6397962ed21256937d5dbb6176b85c2e2ca53f2bfc0298131e402cd213e16abb3db3dcb0cbe40b9b928d2eb6609f9db843432e1104150c0d0930f6889ac48e1e22fb73cb17cfe9e37f764ed11dbb5aafe64550028a9ca6d177fd85c21dcc25df4967268004952ec61a91e8f943be823e172068efcdbfd827013bd1876c9232f2f32d352fab5885b7f43970a094f5c9fbdf0e0b6773968f9507b36b7ec8522fbfce1ba4451f9b5b48181a8be951d2203a5d3cfa842e2ac84489d4e5a58660980d745843377dc8db3633a5ba3234c6a620379613c095de9f594c17890db21c94b88be7b984888ad9cd8301ca2fee1cc933b30a17a6e9bd44904ac5d2f26e4e6384058946dd04816ba50dfe2d0d837d9b64d2f77dea3b7f556dddbb7d5f6e8aa284bcde788bc23261950d5991cf1910e13b043e8b2eadda5e5442fdd9f3b0656a433fd916ba4877195f6763b842cadc236483040892807bb6e55e49918e638411dfc59d15867b704b85cbe2dbec0eb044dd727ba02b04cc996d71684b74f91145780c99ade11b634a6ec6d231349bb4f26ad9f09ce36ae7e49f4eca3ece1fbd1d43d47654d23825489dacb926d934e7c388636b53ba95df126d9b449936a31e0f525040cdc51ea3bb0d08befb38dd9c6f7d859770e0e5ab6acfec8c3bb10207b586c308bbe98d93b8313afda4ca8617868588ce6cf2be01ca6ba0eeae15edd22b7d781a4392a95f86d870e5a45728b70e34ff95345e5eb2d0f41fb90098e870380a4863eb2878c86de61450ebe21d97b3e46e9a14d90630c61903", "5251535251", 0, 1600617601, 1537743641, "d87e739d6e79ca57778e3b6ea60c410b06ff5d9a9e9fe710b9a605dad2c99635"], + ["80d0fc1804bbff0f0b3ea36aa1b13674d12bd6527c181dc4b2e88ba3b00c24ae692a9cbe5f01000000036a5352ffffffff6c90598a4ac7239319c6bf09b0d45f9ee9cc175a0e7e0d1564bc3cd4be027dbf0100000006525265530052ffffffff480e46fea7bd17971583304a5f2789222e5cfc24e148f8418d86ee3c0c63b1d50100000004535163654b95705d8f4a44821d55020c2b28f40f1c6b74ef791315f3ea519ab3760e8fd7e9ae08120200000001532ab71dea02f017f0020000000002655337d59702000000000751516a6a5153658c9e2d0600", "6353ac6551", 3, -1671120871, 0, "adee02d873d52da2a694ca9b7ead9c729bfcde32774071712cb05f62793a869f"], + ["030000807082c40304e9703a1afd33a44337ba84a20619a52a14ea72f9d00565d30c409f89bc3321b60300000004ac65636371fd09e6446906db28027b58e3aaf8fdabc890294424b718c033c2bd0b644f9d4522a07f0200000003516a51ffffffff3c0973d46e294584654e342dc647e6673a2071f83cbf11d0d573231a90b1e1ac00000000066500006351acffffffff6c84297e96cb93341bdd2940d3eb53e539ccb50d064239f2a844a431842b6a2c0100000003526a5357ce00aa0488fd5003000000000752515253ac00529113960500000000086552535253530053f37fb4000000000007650051006563527c18000400000000065100ac63655100000000000000000200000000000000003522e00500000000425040f20b5f3b978d782d947bd1e5048abfa4d56a8e9854ce17ba58ca2e251f83dba129a6768ff3e161a7c66dd6d09f0baadfa37d90342af12b0a416abcdbb3ba13e39c3860cf1a84f963d76494b51e3cff56a81da9ac475d9d5e92a27bc9e400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f94d145ed7e1141f5b9a40964169315419821e323e702b875f5a733460b025d5a92551c8368ae2d429d39033d4ad22f9554cb690d1c3aeb1b4072663696d8f93e7f550f80cfdf22c503557c527e4df992289727ac97a02f8fca49bcefd424d495d93564ba55460cfa34839f1d6b2ef1892b5fb1eca3a688c417d10e01089b3fa0329a2b32d32198daac1394cfeb83f700d34550556d14e08da970fa248ba1349d3020c0756c164ac4c1f8ffead793b5f88ab2bb909b2444eee13479e08a981aee1190b0625b3698035df9c433a7803916401965c824b9f662f72f7b12e719f181b0cb3abfde308c050442d19ea178779d8b707a2898e5bbcb539e0b4948f148aa819f603189d14b74cb443ddaa58c64e6cfd774616a9021f30047fd9f11c929339a26c5c032ec2ff029310692b6537abbc52916d8f8366c1a60d379312e69408136113bf7b031b69a63999faab5b2947e72f46321e688ae1f195a87290d0ff20c0dcaca3a1f80222cec295bba75a15abc9a26b8205452dc07a146bc8124537d7680023effd1b7202071225c8a078ae05821b6bc68fe37b396591ed8241cebc0cc51cb4dbe11404e7aa09f97df1005dfbe6c6fc50e2c021b22a79e1cc1d531aa8a64f40802b5a7553afe0ec9504692215636acf1d167a997edc4df24357fddccd03c6bfab5a7c241bbb7e0404d96686e080125133e5faf2beda177a698eace1afea459f99a70c8c895280afc81ed5e6de44a26fa1aa2af85473d1d2a24e5dd019be1b4af11650a5b1af5b9592ac486a137e7ed1e1737310aceed05cf70852f58732f47f4385c48420e4abfcbc831020fb7b851afb31451f9a97249b7e86dd38b59c204b32af70d7088cd020cfeae6a2a69b7a93c4f505e3c8a0d41e3ffed01a51021bd1b5fb8912d4b7f1c000d1c4b6cca2a67dbd1702b830576cdccab8d373982f74f652f83d564842d33ec27bf1b76df6f27b139c2e6b0f5e48149cb6c894e9d8e00ff8459cd03c452356025640e4e108ca50ae6aa82f5bdefb422cdc311a7aa50739967201e1e4f1005a8a61cde4b3cbde1f06826111342061ecd5b0b1cf6241394dbce5ce49170562b43bb3e999e6a6debfbda9ab0eeda4847c7a8b4238ef3a78891dc885486168f7b8c481da1de6965729c36400e812c6847dd916a8752d5c95b2e527c0d6c591e8d3d002d3ab9c48329e4c1f0732e56acff2ef8041ce9c21c1bb65e045614885462ad0fb3a61cdbcd922aa845c0a83e16647be72f278597bf7f60b38f4543398689a5557721013992e9ea8eaeec3714ba48810138d4b7c33a825c083c1eb6695ddb957dbb23e70151239e1ee5c785fd96e8819ef96228741f45027a2f6f4e0fb5845962e11080b6be0c43eee2f0fafb08bf5d3370c8d05d819354f0ef475b7db00bbb36171e2fa6b2d3a14efce84c40d30217668d9eb16a303ad9a8bb5419ea08743286f09e76aa02dbe43701a49160d09ead8b0cdb9227c1b7e6a41f15e887679fc3f0c77c089760f312f582b3fd429be7be4aa58e239204840b56edfbe8a45fe34c55dc8b69c090e98d5b208fafb8390307eb66bc41b7b8d631621d0dd0e7983301e898ccf6efb8877eaacd14091818f93135fb0565770734ac431389c3b6a22e939bac52e073f458a7cced0c197fb7b33b8f890b0cb5f06fe1bea98f6f6c6b6db1baf90557e1228cd5225e425bd23da3a8474e37cf7150e74333b15518cf473966a3664d55e63875f9b126dbebc88014775efcaa94c7979edb91e9c89523c22f1f3f9c3025ce986ca0b7dff1acb41fc1dc4f8f46040fef0f342ec2b6ab8481585a15b96fb94f247dbda7a6db8606477b2d671db64efe5171dda4dfa873bdc52bbe69342f3cbe4857237b14dc89fecb084e13d43d7632130dca2b879ac65cecfab856b41206cd82aba5a46b050096c23154d581625ac649f537f0a30f1d5f826adc49f1cf70d852e7ce032dc3e6e7640d2fc79c019e507e6d6c8db60849cd2c3b5078a7b5558423c3c676e16d4d3ee83c065dae7f1907027a1a1d35e4439a5174e4f014fb24861ba6b1e36060c0fd810c244832c3abc9f5120fa22b755d167889366d2b9c4e85f1f8e4e5af7ce1128206f7e8cf8007bdc3a67755e193b3a2389179c71eb5aa1f311223e077e9ce7337f5b5b903380d610f3cd62f0efaa564ec872d30262fdd14179a4fd034f9f8eb9bd06219fd527a3dd8df688be865a6a952267543289ebcb10fa0ac80d9adf73266d30087cfdec9c43504b0d3433d624044cde35e6a9fa9ee68ab854241fe2768b7c4728a503000000000000000000000000308dc1276a7d0ca9898bf02380387fa412dae44591ac54330b7ec21a8ed26a38ccbed85c99b1934d80fdc1ecaf155058d774c77ca63e5fa64af387bb253e029d608ba19ecd8846ace583edb6502fa63e41c8d9bb0a2d252ab7ff6f60c3416d1400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a3e6f4f91a24bfe9e249c44ddcc2bfacf5e9a0d6584440e73ddb161fa712cd43494ebe90a39dfe70ae03e883bd28ad2ea88ac1e383b55a5246da59f19435284c7c40b24fd67467694929b335eb23049038ce678f07ebeb05e3548bf20d677597777a249b9af27a939b390427df871e583ba924de26d8cb4ba6061fece553c6150212d23741e1ce522246372c6995e0ffef774b80574666108037bd98b47c2f07fe0307ba7749e59dca23842baaf66b7c63299da7febc74e3581b370c1965e83f11f50a0428a1a7b0e19e9b99cd91811b0b2d55102292eff4eec613d2d7b492d0dc8f737e3e866355e3d862c126cc7ae9ab2ebdc68416aa7119cf8e56d5ef4e17a119610203294cc12a4b583556dde4ab5e6e91dee61e0d5aa3907656990ac75bb084b508020344f619bf142f4ea533a62a6505191ee79d4fcddb30c95a1ccb61af0ec10ee703023508e7718a2cbe154f331dda717348a23a132c22052d98bf07dcc0051e9d14022d174a1ac02d84dda45ab85eaf485a6b6ab69ca04fcc7c2b5cd4ba52591a35270200b5521c1224f29af60a94506d240741ab7f297ab84c6cf806f5c56c950e707a956f082260c92e2285ac16d419cd007555767916262500ecc7ce9f37124d20c8d2628de62db1cad713061a10fb06abbe654a20bb83653a0bec9fdbbcd6fbea898046fd3bbb86a18d79c9b1f1edc05092684d6e4437ad3c3eff02f1657c323d81e2b3f66b9a512c1daaadf8bad8521f0eed46cf439e51b145b3195c63730e6aa6604f8ed004577e91af7bec9203f1df58617330603107a5d799c2673333f88f62dba3fa0e6de8768a457230e92ba1408e3b7a10d21ab042e4359efbb9b6ebe3648df99b3d832d2c227929c08fdd12d8e27e86e80a61679c745ce16af8c5c9b336a2f49e34f9465640d81c68b0ba38419aaeeaf9cc651282b12d6b0bd3f2c11f3a5ce202e49ca6636190bfc96c62379e8cb1007112c530cf22f377ba0b9518d33ab4f9421c59c58b5e5f09e58a0cad7bcd3bfef3ebb202eb07b3ff8caa03ce37b6a93097e3d23fdd0f77d0ff1af2c724035c13def9c3a93def37de85be5dc50dd42b48fb21c9ab756f72245bbdbf4ea9e55c9ca4fc4ca2f0607b1d033501d14f811ef481563e18f32cbfcbfa30ffe2c42dc768826941e9eeb56e733e9cd05b32c361b61f448de853cfd7bb3a13e8c070b2b798a9692877fea82b67fedc889bdc09d24e5383dac3ac81b722521009d453279156ce3cbd58e184a44fb1cc2ca0b91285ff5f6ec5ca8475ee2d1e4b7d6f285c1f4c3e1d2e515206ab3caa06dd1f2b9814711569e68705ad33e65f277712298f01001c72676d4b25fb8f8c11ba9702a2bb517193c440eea2de18165b3f8d1d6eb96a32f03753630caf8c88f7f747a826a76fbfd2186fba05134822a81724e5d44458d3e9cbb20cb97c3844dfe27970e29a0d12f186a1d46dda2ae6bc6c157859550c76b706035d651a16400d159e2cf84dc1708391396bb0bc9ba20623cc8c7d87c43f31a086e65c4cad4df0bafeefe9854123a373b3a5321d8f6979f1bfab240158931ed3174c38bdb306e2df219f5f978860194d47472f81530bccbd4b64c4f2bfd0330da39e6382cfa40f9e3e657597106835cbc7afc247c2087e7aa7cfaac1175208149f8c7d074cee7493cd2af5c3d9558ba5a920c3d8baa8665ca770636596e9f18f4fc633ad5b5f6d831f7bcde1f887b5c58f465b42276fd0551d8b5c8c64ea88f60553ccb34d7f66ce61253ab9a93e6c7b02875a49fb94e44bb4e69050fc3af75e1cc70caeab3e83be31d1f775359a4611e24470a9dd15473258a8f0d193712834213af0fe06eab000766f70ce27b0a0649f9ce82bfda9f0a7aab3c522f5c786b28cf6f9e992e312ec8e57d9f265cea609900deca667363ec6152370d7b255939dfe224ba0a747c16e7d1299276aede9d8c47b3048cb34725630061c35eb15a97ed2236571db1639d0e73159d8e8b7660084848c7f4dde1d32da75f85abf5feb605d8e7736a1161b4204131b1ac9883bf08c24849a3905e23cc4fd77dbff457e1682d03ac42fe730ed6b00715e37b0e6a38aa9971bbd29796c55528f48bdfa8e5d33660d8e2ac4cffc55ba52bc9fbd9a44c680c2fedac0ded3c95773d8af55bdbf91e1888edf3f39254aadce23da373e6373047ffaf306229e95425a25a4308d7cca1920d41cfbd71640d189c597c5000d7b6af8fbee0c8e9f9db6972606cb9f5869894b32def22b8cc57c12f8a10f764f1da8ae474265c56f072451165245ec079d83b62b136d5309794b89503ef5ff24f8e2cd07293ea0be9963b1faa6dcc5153a531e231308863a6a68ac490918246eb9a0c1b732b4ec0c80e582e4b26ba212c3e292595b41e1a53e965e3bc2a5dee8e02f2fd94a622319ca7240000d", "6353535351ac", 1, -169274258, 0, "46e4b22703ac4fcd30f4c8b1ca9421abcf5e138d4e9c7821d2224bb87a7e401b"], + ["2e5dde7104c2637fb07aa70b5973d1900d999d824792e421216163c6a8fceb3189e0431e0b000000000951515300ac65526563a6a5086e32a588ba7c5ce4fe409d55b062d50fc31e1b427f49b05a41566e5767af9f4fdb03000000020063ffffffffeddf2c96669b24e0c129ef5858f71e9deea42794577affd1d8f8717fc08fff3b030000000851516a6352655363ffffffff312252aaa69a1543854d97e92fce7124f52d5ea59e8d7d0a9db211b9e5173398010000000452ac6563ffffffff0254f4d2040000000000199a620500000000025153abb3c9e4020000000000000000e0dd9d0400000000b734aad0b6571648fc3c8c26ea9cc52722561a1bf19b589c37befa5f249acdef192431f7865dd8d783564a05e733e7ce9377156e42d9488b0c3e7b32adaaf53334e1b15a25e1b98110e7d21f558d8048c5e224bfc698328e1dc8c3322f8a9ab9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002dc0fc1f574a9104434c40d0d823c072fd1fe942f7a6529bfc5f949464cb4e0ebd2956ab4e3e8e5447f93b9f5c3cee7c9b2155796447d9f89b15f2c2545f4facd6b45c6c9463fd240a00e0d85d2cc673b645dd8f41aba8a661f1b58381175bafa76d76ab55f3e5506c6189396d35007d723c4eb05e2f09ce2420cd60c49e2d940220d9da5fd96e84a6b188c0c0548be565debc5b88da2e0038f5d9d51db61ed9c40301c1b06a9fe0e77bb3a1509cf3a6c1d9aa54a0eb4c80908214fc5d7868f61e270b07792a834b6c7cb8ed87a7747f3562eac9060c82cd9fcb8c3cbb428d71b8f6cb6d0fd9144d1dee3255eca9111e93342d917b5b81d83b4f320c6c5f4df8fc6d600225555a3c53d02e8d4da03d1aecf7bc8275f6f5e5f013c5ebd3ee244ea4023d280315de399f916152724a4351b8a1695023a70f1d0c28afd6325eaa758a39edbee7022fb38f0b13da87537e21d54dc88f09464ed6d2fef56916b1fe9262e5e63713c8021cd4adc4dc198a6d1a7fc35e676222659d399c8d46b656dec90806dd834e54a303200751a0d6004708734ba086699d6d0e3cd3fd6b7555e8efb48a2fd17214ddb4eead36e09c0940db5a32cad3313dc0bb576a6d684276d5949bd475390ff4534dbb4e190b128a351bdc32f2387f165de2711ca8beceeaf8463647d1d05c43e2ccb072648c7c4dbb32b27b506b7fc8d916124208f685e91c992821b8b06528811a8ed8bf7911b34795e04e55bd3a036c6b54d8430888678692eac34252e37898f13fcc41765186126ef328516190dada7ff87d3f2b687202cdd2a5199360e820ab666cb99f132935548ff1aaf0430c9dbc46a688d1166e4f4601779d634d777dd746842540e26f4b839bff893f2e64abae11ab6318a42d00ac966e138190ce33a46e977d58834cc8e8436e1ebf847453b40c3fc98fa14f9f2121ac340803cfc78a11a27d31bbf631481f711d68f26de7bc1b36b53474f1fde39a670a04e005e87fad709b0119afd8a507371172794ed88184dae39239c83d267c7a3b17ccce15827edb5a4fa231c8802daefc233d47179203611b7f4daf8997d7fa4db2bc338675c52a6c1b706b99c7ac024bc7d78d89cf1eb2fd118f1879a925f20761e7037fcf5760aab84c9700bfa639a131702f027a33a8fcb5c6d91c5e4521a79c6d996c56a6af058ecb2f1ef31ac81c6e18e118073012d4aedc6a21ae31f48e3e938383e0e017f7a91bc08047a34125c00a62970aae595e57eb8cd83dfdd2ccb604ed7769347c12f3d15253817cff90949793cdb5e8dc733b7601f9b139a738bf4acfcaf84f096ad845826572e791b491c521244cdd2521553ffdc6da2517e1fb0d61738517c4cdb8326164ff758be7842eaebc9f652bc8b74bac171e0a0ca665af47a8caf4f9d3e6ec44747a4720cfe9ff2a5d39260c1d59f6eade5403efe6b24e7e2534ada77517cb63a46f903d8275c8a40d39b67dbdb5324e5bf6d6fd46e3619ad006744bcb24f86c01331118e836e19a849717b87932d2652802ed98a3b64d544dc78a8a9ef895332610e953e11af5949a96ba0b7e5af9912273eb36022839ec585128254212fa0efb7717f5eb1ba73c1dc61e5704bc463da36e2e129020abb1812d9f8b0345de6a145099ea80d29856ab08bc5325f85d302e9cd270a4112e4abaf303a12d415c4bed570e440ce13f7580ce8d54e326fbb3fe597ee5ea6771d10930b31762e5dde5458241bcc6a880c908e23b25462f00f7855a5d8439d861f3f3150140b2d56ee1ecb5c78943f3104021c37919e8795fa01092d8e89c144e02a9f0d6e4ec991ee237b840a82b91c92746152bcf59d1fdfc76a6484a89d71d40520abea5fcb42b6beec7e85a1c8f46686a5f44fc8d12b2e9a10386a54da113cfc0f6df2e4a0c8c1c29178c563e05620222c5fcd56d21ee98623ada6bd8b94b6bf8e4a898c10c56d06e6e0f611e6623deadae8d04c54d1bfb1db539f27c55d69aa8aaf4b760e3f29b89e97e27afc192bbced610e79be11f25165fcb3e52032595ee6f0706452e89136037f3bf9c3223a5cde72d7923aa620e68b94d65697b027ab8c2ac0448e0b8f6b0c740a691ecaa1d03f818f546f35d8b63ac9f12c7909257df110c67c37aee50ce5d3723e9470be62de1aedffaa4d3e3fdcfbbea44a24bd1dac848d20feba9b6938dac219e1c60b737358281df0976ca4a15f3e11eff4352e35e5168f0b88b52960aeee10a544daec4f5c8cc634b8df61bf5c5d3c919fea0dbd96cfb6f326b087a1d5354185ace86d691bd180000000000000000777209020000000081358d278130665dfd8d57e6cb383468448f3f00534a16c7cd71d4cc734b6c53d54f1839637957f9e658ae41c8e4b70c28198aaaa534e00b7676f06bf4548f79af35d49ac5a9308af395096be373460930777e4d9a1e9c6b4d0279c64d9b509500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e32997f1ae5d6fa902fe5a766add8d15d2a024b82f642c62d748af5322401ffe7f33bdef067e21375370416b8614776d5cd2c4d0754f8cd0522c870cae3229143a550c312b959dc9e472f5182bf44dd23be5ab957e413ebbfbc14eae87a12c0f968f6698f71f09524db6708bad95b74526d479abc9ec490aae0545f99dc5dcf203154f8b6a0b1c22e1026af0198bfd0c100cb90665fa0ab3a857cd7417ff11ae2c030007ce95960602684f5c615ac507ebc582fc94e7aaf73dc6528ff594f53122370a054bc8ad1db52b7dcc604bd7fc20168486d5e2d87551e0d4064c0032749e0ccc274f2c6e47af21153bd70c794495a0de1a91e60d6edfb778a0295d669860a268021ce13bc8915221d435afa8797fa686a5b254ce1bb88f4665697af6dab40cf465021d1cb4ef2bb6fe7c28516a388c83269254a3edc891e4a37713afdbab32bfb3920318f25fad81b8277a8a8949e61f483c1abf910f87a6c40a07b2468918e3348d510317e73a3cd1494d786a66bede6fe81160bb4ff177361a89dc1146436afc827b68022d5d5e1bf814e7f249504661cc12fbbe8e25257d86f8ddaedfc9ab5301304cef15e4220a73df610956efbd7db776a71d341e309db2b865a88faf0e1b50c530b35f0c7570a73db686a423c4ad148d91177745fd91f95257a149183a7c2345a334d01c43a529658859a3eb2f98f95336d095ba336d79c049186ba44c4584aee4604102ca0df4669e9ebd8cdebce96efa86fb348334aae85c69cb8c1a487e66205f03997397254b6f193e7b040f8be569898ae313e49441914edc9442f19db721d99c0f5eaaa84f9b54c7d52d9836e2baf886905a84a5963bcb7b7be014bc61906ca8827e7d85a01759088c557e2b05fc2bfc07dd677fbdd814c6ac458040dabfda5bb790df3e2352ad63a4e89a3a6defe75c6122c8c143c61fbca2bf2aecaea694363efbee79e1519b8080844958b7a01ca0cf202202def79ed5789d3dc5415e0139118acdb89f4a8d28c5f7be916450ba160f2b44ef92124b2b25e00e1feaf14b81a88cead3f7425a37582539bf9bbcfa4d2849d1a972ecab5daf71ff8ef08e8cde823fcac8ea8fd57dd12f8cb911b614c0b25b045b18352e8dfe9fcf6cc346f0f0ecdfe5658fa2f0cdd513e2f4f052a646f3407457996af081f3d10a6789726b65d6841c94d23933f778f61e274e164419d25e6e973a9eebb409b07373148c21f42c54286504791c2e96cccc11d2938498718d4ebf3a503b9211f3bf47bfb2cfa57ab85733fa44107dafb4fcaf6ed8881a2a8e377e1b090faed8b01f8e40265966c70c268da1578ed4bfe00a2e41648322ac19c56241bca746468e9e6351bf81d45e73482d7c8cc6a1a8a2d71987c330a02a46226a8c6ac5c029ccc75854a0b32b68ef643d492e3fdfd6bfeed1466968ec9bd0e2e070470d6927082284ee6eebd4fa6857a67fe59ae11660b472d4a09578c8890e3565614ee1d1f09cd7fe4dfcaa26831feb662c082fc330ab55a7d3bcd63b318a06f502b27ee21bca0af7a5be180a0ba2192bd1599274d1176bb5885e43b9ebd6bc3aff174ff74dbd3cbd4511de49aa46b895e8dfffbc7ea1c4e7d4028022c1e3ad7d4e7f3496067b8359435bc9182556bd3dfcb2490e46c57589a142cc97d8adbc6081343fca020ae7fd9cc26b02b275a38ce89eec31fd9c4ac9aa9ab09a74ae655df9eb4a75dde6d67f6a72d8a6e997db648991bd1fef61541ad3ee7576f6755d6b64af17d8dab5812a2dfd70401a08e0bb1c3df5292dfb773c88a673c53b8791ac7433483439cc466d5ee9410d4be89ab2e2630b0b1f405e554e46b1a00f9476e74eecb427c5ee9115ced16e42838b53e8b888136a8b3f30cbff64569181ac7b44922ef79b7821919c3db3959099098d91829a346055e7eb1a666755707ea70738fa49e6f98061685471215da805416a74b1625e39c6554d7982bb13cdc62985d091c58963b4944149043e9c92965d62abc5df3969e16a6ea140c10c7359e4c7b66a3a728e53bab7ebd7bca568f6d65649870a9cc3af09ac4829f0031ffbfddcf4f91f5b1bcd3f9882419ee6fdc33b4fe927397e63f21cdccf214e8731575607d3221f9c6a5b8706ecbceb66ac2868531de922d9d869f1ceaa9867fa53f38a1764a3d6ee1a1bffbb7be7d74913f3612ae7c065b5baa49310ca886aa4a2bb4dc10b680226c87c4f530fe1651fddc354658b6d13ed8e12194cdaf1bca27f98a8e7ff9885f4e0c911b1ac087065a62a95a2bcb9812b4db7cf303e76084fa4800d4574ef210d54ba1b7ce475c555fabc8d987c48c944f37e057e9dfa941ffed311db01d8015deba255fb046f763f38b51dde088368a3a99a903ebd98781e31359c4bd1fbd526d707d10927efb7f975fab191764ce0e39b596f5de6171ff00c", "ac6a5152ac5265", 1, -957946193, 0, "df24a7b8e1bca2e2998cf05e1ff4def677c38c16554789368e39748718528117"], + ["871fb87d0360b7e9bba3197747a1467399c5a3c648883d5b121bd021643ecaea9204d2908202000000095253535251006a63ac14a77d09c40efdebd886fed5837af869197e0a9d450d593c33c528b4ae29bcc9dd2eceff02000000070051636363535316260e337ebea1b6be07fe3c8bfdb7356c3f265fa466f3a8249ecb0797631ea4d2836a090200000006ac656a005100ffffffff044c9d40010000000000d0976a010000000007535252636353519ddc3003000000000551536365516c7d1602000000000400656a00be5ff62b02000000000000000091e8530000000000936ccfc954e223b956f630b273d2b70a96159ddb0db2acedcc34f0a689398e8036637dd063ba0ccadf50bf132447b4cb790711a54de826aaf0161c66fe077e4e354b397c5c141510f97df80c1383dcff05c4fd95c6accc5129a3cd7c4a59762e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000843284f372de7a744ba05a74397907c93d893529b1386ff07c3402676573660e8b685e1e4e32a0e0c927e1a60a323615a826b8738200afdb88942be86748e092b4c72ae283a149ef5c502f95c3ceefc2feaedfcf059b2c9127463a6118f2bec6e8a8c8ce1af7fc1ace7546c9eaebf52f0ac9619317a9d5079be4d918cd7ac76503051b7e240e26438ca055071fe6c4e59305bce5302b520d85e365700f80a1130203068de9591d3e15b1ae1ad567ad1cfed866d1a00e62b2dc39ef0556c8cb540cc90b08bc8838042dcdf5483e868bad5154b8e6564311c11075db20295f9a1d26de4ca803e743bc2a01fca12595d0922c790eccbdd60bad507b07a138236f7ae8d3e40223ac067ff082615c719dc1898d3ef289269daa19501bcdf1cb6a09546026d02b0230423354e7091042b093d81cf899052c8f8b1b567dfecf117a1114fbd1dd59d4020d72d0e0556b6c60a7dfd4f0d394e8a82f6104574c274596ea3dfbb064532b45031b6a770f76e17d01710e3fa10b380bfa133be273f87065a2a271eb2fd63c6316032459e2ba35e809bc1df9899e9e9329b74a4a26636763b9eb634383eca1e2a65b349c07c28bd8a25d7f85419f6149d76297e7b8a47fa5900cefcd31dc43957c99d324a426d9eb6696a46aabcf26b95d5fe204be95bdc06ebf295c2cddab70b76b5dd30d0553eea4b57b692e0ae49869d4903f6bf146c26fa25699ecfcd18334800e11e1b7ccd9bfe7605f04d1187d7b61b79df042a53025c20cd7e234dde9045e4deed6e101750e6448d539c9610f800bae5a10d1ea1c92203754991b65a4c85a40d225e612414440f9079f7074779550f66835613036b579c449790b8a0f0feff78063ab932cd3da7f8aa2ff0526938fa986691c47898a73094f1b4c8b15200fe493d70800bad94f91364be96572f9dceb199e2edf6554e9f7b2a51f820fb84d8ba34a572d67a76054316b2014492c632936ddbc8af6930a401c00db33b5fd24cd12699ca7824f17752eec8686fd0aa6a2263e4e7ec5dcf2d2f9518bd751c2b142a732f210561af23289e1a69fb907324abe9c5096d8fb0f44c0fb7301cf1913f270015955ae240439b34ede7cfb4007c5e762e9e03a322cd94cdc8663960e2e60f46789c50de2df3227714d75798187f098f32e08d9456f57752120868a5621b76c30c8c830853d01e0eef29bedad1fef4dc5bbe0889f1b6ddaae68cf0002bb3cb26eccbe817d219d9c748a425ef5bf883deea4dfeb6541f37318ef3125249aaa036816a9b7a84a848cbe1329298ac1cc338abefc294a9a27b2a7dc281497d7e66064e95c5b11e5191d13118c2b25dd5e0ad7c14d661763454e22fd38ba4079a1fcf1d96fddebd8cd7645991c03903a7bac477c5d35d4e3c3ec3e2154efb7a3ab1b89de90a4c8ff63ae0c7e90ea8ff8e48a9b07256b58d1a0b69ea701f1a1e483fd9360ef5b15b5d397323767948fc56bc2f62b90997e5e52fc86e4a2456cd48fd69cf7b090ff6a37b7ab374f727a992aee16184d440e145f3684dd491a0a3cdff9faef3d6722afa5b2531f5620db7b9563ecb79c89eb3b88b055f9820b1e7529b34e1437eb1cb52fa9f2905342ed5684b1b305140431d009d5c23145eaf048e616f65991f907934f2a19d65e4eaba0428f0a99945bc1eaedd4825e103810728f30da09db839b23b807911c6eee31f2a2efd66c97c4e5cb811e0c472524fe0093eaf45abd1928be3045d64dd7d70e1e345564d4361be50803da12b469d15ec2ac51b46140841711b20e326ea287a813b75c9d22fba692663da6851ec193c455c7aba9e0e43dcd348156f9a14bdeeb71a05a93c5e3871ac6e0710b0cb57d3c3b23501ef315bfc7d6aecce59921515658a35089dd0541d5fe0f48a1449b8f336089e039684a38184edcc731134584e84cddc012a981acdc5de74e16e912a1d2a11453551ca9bfde16389098a8e9f5b311ad417eb439034944293bf5cb315b3bebba3eaafa9870e444d4fe5c56d552180543c192453258ca6e27cdb59670f8d77c97f11a9824eb2337e8988c9abbe05bfeed8c02e2371b3da90b1a509fb9d9c951ee25293d64e25ecd4a3297743808f6b1c1a6914c60bac444eff23621c8197fa8787060e126b13547c916c990fe167b7cc93f64dcfb5a460e1eebb34469fef7160c7309300e261519f82f675222acd80654a8db85fc3e0f4143d35d248c42549279fce3a7eab372ce28df12091ad065ff49a3e6f7857382719a3096db529c7a9b25e2610d04013b57fd1c2f0b6a64b1824b445b01da05000000000000000000000000f49f9678d2945793a2351a336a1023423c966ed87cb2c7e2d5a991672e0766baca0e8f7efdcb3665372e244d29b160e37e66e08a5df6f925cff94cf6068c49a438c85e036c2aa35b91132e31b74fa009b6324628fc362d1f2e786350b14390780000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077bf0af3050e5cc14eed877f0293e71a7e21bca5e624483b18391402ea0ff3567e457930efff7af05763ed6ed6eb25e9850444b2ba3a65df902d823a3a6354e5b40a43c6ffa5d169a143c972aa16379129442bcf75da625365dee023b0b322f2f623b7cd153001c8e9a15c2b534dcb66f67489318a9999542b91d453e14a184d0225862cedc33f371ca751d1d43ecaff6be58a8ebcbf4770793861e81b0269cd9002104efdf8b5ef84c4c8a9c49b57ee4ad5f5ee2c1e34186f024f372c7a36ad28570b0189f2a874dc7d2aea0f445f7770f97cc92c078cab92762154e783bd380f3ad9fefdf1bdd12e76e5b237e9dc82f7a7919acb59e84c85595f67f7758dc98616a1021435792c8fc9eb2b9ca1df83b875ac0cbbfe29b4f52a766c05639c0f210b8ad1031d1d76b6fdc6b456d2f2371e728c8ed4fd08e058a7c9dad798281e751773ef6b022143c7023dd4e0f3298e5ad0933b9549069a547113f9ff7b77761ea22188eb5d0219762b39f95fd3b841c33163e29e6064b3d98f35f76dd33fc4f879d7d76d969b0308884cdaa18e8c0d9d6fc5e67739807faf6dc382c4ed6da20c952b15e35d215c0d7d8b8f99793a400ab3e3d2ddcf6e042c871f88e7fc59a31315ae836b6448ed421fae77a5431116e33a87195f66faa784ef75032783d34da8eb482278d74ddade7c458504255fbd76c4624b064f09b1815ba3e8de67be362bcb5a1383e70ff063623728b5a9d979f5b734ba453d56e26bc718848ba92fa481719c23c926085f247ea46df0f4a83a2592c77490f6b07b51e5a2abba236a0d205310e7b6cebf8c39d96997255f27154ae58b09413a2624c07780b2b1ebdfa34785828d06d95113b3c8b0fa6d5a64e4a89ffe35276f8511ae2d704da60f9e0a12cbde231f21ebf91a1fb837580a4dc2bb0946a86af6577d30e5f0960b18dbf18a8765ae0bd9b54a8d3a4615f24c379a1ca1e04e21a4707e51ed355eb386c72e4a113665c030aa5a5c6d2e69cc84b92eda62014adb793b61bd167f67bbb46b3ca5b71cda3dac10d75e1a92d0879b5e94aaf47a0369ae6d09cde23d08f8fdd8927e2f14f04e872c98a349a452d26860aa9d286913854c463d49f2ffe370a9ac87c49b34a4f11646f30dff82e95863077578d769f222c0879d7a5b4b44d9beb8442320a4a8d7f4c0cb1bec5a794d0e83ac4bf33870f015b1af9440c21ecadbdc8ec01b111d7f5fe2cc11cb08652d9deaf94cbdb05cdb10893d14416062d1a6e43ae7751e979983c7d898ce451678f485b1526e0ca2d7cd26047e0e8619e9a142625451e2eb10553959e891e307793c7196fab86eaaed91acd16a3de14296c3de0de0111ad6b46b683dbb735257c99d0558c16b706825628f8e4a015336141e55f3a0a3204e64c8caba4c3827267fdf52d667c0e5f4622ed5fb78a5c0b28775a91687da87ee816dcd6284b0c856ce155cf0db7c73812217cc160af47a0fd3bbf6d6717b3314f77b0472793abc2f0448a5e4fb9eb6847caa18bc777b731702303ddba2b42c6b090cdbbd9d6451c8763ff71bf9a56d8925425615e0c6c6bd613b066e8669f4342c8c6104bc5319c8b1078d15c498a83b0ba2afd67cac6d177acb5dc8a9a63b775c9e0ed794ce537d426981196b29d26781a90b6594c6c895f235e1c849f6ad690cfce8473bd3564f1a3df2750b01d8d63ea799abb47bd523b6bb02d93ef8f80c91d90d7f25866247765cda486b9bff3728652f6f7b4b11219bf12e6f9f1065547e7b8ba79e95c78ce183d5cf56241b5a11e3ba9e9d85f5b81be9dd8755b86f4932c72e6d49d32b49f39ed0cc9ccce1bd1d42e3dd1fb06332d5aa8508fcb60002db56545551dee1c0e5a6259ea57ca52d84af32b68841827a9294e709eee79051699de4c917acfde0cfab515d1d431b645bb7e9555c43da405ef53dd0782f1ee13954f69cd182599de3c355c3555c2d27cc0ead27f2f8e935b5753e68d2f44dbc5281c245727aa7a26cf2ec99981a3111dd7706fa1b2c571627d58ceb06d4f9a3459e8e803e02897db85efab3007ff19a9f6a3fd5359cf54d29f0bcfbe2b73d141277500a02d918c29f915ebb48df98c438ef107d5229e2f6c63ba196401faabe81204e16caf960663655bf1ce115de7ac7d994ff79ed1ccc68acad5a010fe5bdbc293ea7b6d4cb0223b99ddc29a6eda83cc2701e7c9faf131205456d319fac47d03325672e3e678a680fbe496120c34f9ab594ab373d37b07245c21ef37a07bf7b065cd2b27aa33fb72378a1dc760df92d787a30f543118738b449a73f5f1e47100f1ff0a1abf85f47fcfae08ef255f4879e09f52123fa8a453b7d6ecc459e41b1f30a794bf1f35f273bd0362bcb4002a7a778686bf96412ed2ad2b2581c1d9fe9350f729ea34bbbda361e9245bbbe5d6e9d2082580a", "", 2, 563851874, 1537743641, "95b9641dd2d93e6ce95e50191fccf29679fe82fdf85a99eb41354bf59f16182d"], + ["024bb929022e5a9660d7e70d1ee2057c8f606f0ea30d64ec3098764e94d4bbbcffa85303cf0300000008516a535253526552ffffffff23aee489848520ad742ef082c3b13ccef6fc0531017e1ae32111b73d45601d3a00000000086a52526553526552ffffffff011f9ea90100000000030053639d070dd10117bb48000000000000000000000000003f7c59f37b7b4672d52c2db341a5fa755bc896616c896016666335ed9c37fae152587b4bbc42a03329032c688dbe6178d5d03d4b59ad9b4e1279327ce33a7f6b408ce1e5bae1c9cbd334e076478a1885c7d51f05c121d1990344bf71dd6368d90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000078ff9a3db5c389ab62d188e50f6b769eaa90fd8f5a7385e0959fb4b05d92402f71bb3fcfb5f23fdfb23052b00f7d333f71b98bda951a0fef530190413566fdd3832795d604e7ae355b0284a31cbac2a0c1e7d91ba0085fc9ca12be29fe953f9483a497e2fd4ab1d100a1940c998b444fadcaa1ac3ee0eb2dd0b82c50a0abfa1b020e973cceb3952719885aab45080dadd389b3f4e38ec97e295c07b2da5d2dec78022be1fdf82c7f487cd0354dc04c7cb2da78ebcf55c6e4990f03a3d9f8fea028580a067b246aa7835c33ecdf199b2c2013befa03507665000fdb86f6c3444a70987ba60b481aa45b23696609ec920d0b9547bacf5e6540ac7b6d72907ab6a21168a6032dc1181736157eebbfb1cbb6f1649ab015b3df7e8fc696aa0f99a9b71ac206cc020be34c2fe734086dc87db8985a02882d8626e8210b609207b3fcd2c5a2fda2a003119832c172b6473dbe9eaf275275c4c7e1ddcd42b9ba7fb1834e67ad23ab14d803160cbd48cb5d5c025efb31f238cf675c8e0478c8eabb2601ef1b6ef28edfb29703127f209c97b9e40ca1029adf91975048fca138e803f9ba21a0bc8b281fe2cd8110cfa66576a92328e904cf1bfd9608dca43083f03b00a73158b1003dc0bf14909cef25fbde11a494c0a79019f6aea141ead7ce32f9bcce2cc38dddf118893651d7918f694084b1ca9c01b5d89679331435662b5f0bf365e9a63297c422b1be101bcbffebdb95ff12b9070d3b460e98f7b912f73797121f0daa327b7c71f2dcae5951707a3ddebaa7b6b7e70a7074d2c0b938ae4fcbba1c94f4b6a887b3bce920eeda49436b168219044c01f7cac3a3bffa642bcb1a989cad474a342e18795355889151ae42e4eef39e9c57ea7fca5568b5eedff965d99efb91c57b3dbc5e1ec02442b51992d130b0d4e51b227d5a420c288e27ca10396d55aa3a7adde9929904f618b5ad686264d042642e964b829e23006de6dd2af04c78907c278d98291b934f00c63e00b15c2b29a50e5d6490b3b345d1d3d835b33bad9f32fd9d86f4bf9e630bbfc470cb847a55bfccb2acfe81c45975b27e77c18392bcf5f098ae560ee0f4493bbcdb330d67382ec0ec6c02220100cdd2d6f05d6525e2ab7ab5351cd3640589defc685e730894712811e3b407afe981aff882ee61ea220c823a899196eae9f94d17f4d66c008a9ad502d6740eeee9c05040fd88d55a87d6ed072105068253ed475a05cf4a8efd7e0d1afc10d5b9253bac58112cba6524e892afb4b1d382b85fa62d06803c9c868d8e8cd78a9fabf8a22755fd0b6cc3832702cb1fdb687ed7b304277a9cd3abc156cf5c0e283c33c3042f8483da8a07f189a97fb3eecc45d4c529f7b9dd93d9798251983ea02f22450cc7e54e5fb533a269c7b034cfdd33b9d0dd304d617fe1943d0c06867422fee4a5404295701f5b133022a2a838b1b363102d91139563e42b5bddb43789a483aa64bbfaac7ba54464f99ba7c18bfad7c35b5bf9b310e548ba09074c2d60c608690fb946059298afa689dbd639e51075011bf70bc70b4b70564187b483c8bb7e06475d121dec8d66d4efd4f0973b6e767d87e9e6173f43650a62d8288846eb4616ea84d0b0f44023385276afcc9ecb3ad26107313796c5b5f6278bc5b9ac83d1dc59878e9086c7bac6231647de061b8e6679c7446490d7275ae282c9268d3e9c2df39048678631436afcc52c6a1195fb9991645db5fa65d8e4ada2b083835e5aa28567ca5fbe4a5f4968d106ea5b876e4295e73bc6bae62f681587bac97883ee01385637d9b21dbc1b5ae9d98535d5216b4b769e7f68cd630db018b23c63f6514cc8550782d51fdfd5c0cddd19f35758dc090590934b9d57596fd6995844974daa6616743f7d011f72c7133997a16c0bc052065b36e3d84b1ff473ed0488dccde4147e7b10aa6978d2af50d13c016fa660988ab36b8383ebfd5775b1a58156598c9c6d0a39f5513069c88540c21715c01ed057698200294b6eee0f1707c7462d6d8ae92e45de0b6fd0d47d0b1ca42df1182b42e043914ebbffd26b6200c691fea392ee38467fc4f11dd833f460829bceb5bc2e96c1ca49bbf4490e2f981f23e2ee05c5f9dd6b41c286de00a68359e88361b8c09cd4c4936f477b9f9561f56ea1652958f889dae2de73cbc5f2e2661b017495547c4c7b17566495f29582fec238056788d7bacb74b66fb32845c1b3df3ac2fb0ee3c0414485b648e95a6cf67c839d2fcfd1ab5a151e7657e88d4fdfe14c6bec736fa34d9acf200a2f71569112418c0a40ffa88e0fe88a992ca606eed4fe8cec94cccbca54703274f2753bee0944d875e604df3363cb40ebf7d741b6c201d3f0ca7d81afd3d9b205e1493989287e1bacc35aa18d2b5b12433eedc54faaf539cbc71bec6a6c260dad8a157d06f4a27f01", "ac656565", 1, 276226642, 0, "589e57bcb809d169d480aa2f8f42e62da549d80a983a4fb87a9a7edbe96c1910"], + ["030000807082c40304f7f87622fe5d199bbe989786e5cde59dac9a05dea9cd791ec98418f7890d4cd0000000000863ac535153ac5351ffffffff1354cd3784e22bacf1202627f765c54d7ed4e18f0d1b71c4388804c333a2421003000000095353006a6aac5163658a3f2edb1c1df6f660ba6406b2e99fff45a0d015e5189b67eee3fb96700d5da1b07d28d3010000000151dd405aa0e6623308691cb42536917da6f04cca9922d600cfd4a7471e81965830b94937680200000009516552516551655252ffffffff0158a0d20000000000000000000000000000020999620400000000000000000000000035194ccfe001261f3a122d231f87c7c4ca57edf89179a0e6972575441e95b41713f3aa8ec9044d708282ce98cac7b88b6e1dae81f343a6098f24eb215c96471320f189245bf45d6fd2913a48f351aa6a7d028ac358a8ec3636e2ec8b3dfd3a37000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003985814f4b1344aef0765f8fdd15acbb60632e16e1186d2fca558dd2c81b17b99913af75b7c814a147216284eb32d9388f2e0461a0d084bf7632fa0f44a6a73a876328510d6ed27e5ba0b0180f70b5fc6049a42dd1262c159d55e93343dff398e62f33d4ae4ea9b763022c993dfa8055cfdd253067201be95de6d8afe10946a002016f18e4b9e360c0b36836f8522c0b53bf029fd213360a1cfc3557e2dbd915d8031cfa87f8b726121ea057e14287f26c728124ebc72b00cbbe98fc1f1b4b0b7d130b01f2367a9bc3a6b7ed197ac36dab37a70ec18e240d63e65c62f47839f5139539bd05a016e0bffe7ae5c6b7915cd7bdd9ba31e1f034a6090dbbac5055b3faaa25031a0417d0a12ff4256a769d99abff27d63962e7294d78ceb00781c2898893e6a0022ba88fb60b4cfbf036ab006218d749f770c7872ef4efe5151aab71671bacfba9021b9d97907b99b28d477af088fb7569a42c2ef6926a18224bbfab39a6d54ea5b9030d5c53428e7ff2b3787cb9a0f4f389a1599e807b443f058de23195918aec2003030cd6930841424def6aa8feb967af717fcffa64c2bc675b2841c0cd73fbae8fec7d054834e60da64cb861165fbb395b53bdf5e9701d82b73231cb64eff1232b6125c5d7ba994ba8fd4318c0f1e8d53a5e54dbaebab221f6c70c4995a9fce419f540829c8e1bd1beaa7ef8d1b15e5fe0a11fb7fd1a98af74945d474728d6cb0a7bb2bfed79414c05c3b85985e6c3e1672fc0b685fd4ebcde642c376a72e31e333d5d554ff8bb6501a100a06c9dfc0111b0202fc9780d09c3cf49f242faefa9aa5bba962be317489f159c134fb1c1a44a8a0eced4f6d5ddd9ace78fe8c2e4424c54f4156e553224ffc0fa9b2f35ebc2154975df708f5867599cd4eae3a5fd20d83d5509d4ab2e9a3f70f782b139c3c52546bbe508da9c0e1299a3efcb763b75bb421b8c8ade4172aebcb96dc5573f754ad654cb85a65a502dd9b9adc96ca0968629a2e59dcb926dd58ba18f4f4e75c8cd73e891006ffb5fc82e5b484267171cb43886c4e3081b3d4a48e1c4784ca5cf0140a1f2f53ae95a08e04eaf9005edae9439fa88bc421600b84528db9cd764ba4ed48904d438ab409e0e1ee3b62c9378c2e8fbe8416760e8b5c3cdbdecef61c5e5e2e0a6efd6b232202751230057cbd1e22887a1f927de9472cf18f22b3469a14483321440099388d0b56b1ca1fdb21be5aa6d6e6e614fcd1122adea4e938fa22e6c3611a08fe7ef4cc8cdfc7cae68ee8aa2f07c58fa20962a2760fc7a22084af6852d099a11b4167adfc95d9104b179e8305d28d6da5b44041f4f53643787730ef2f9140e79a62c16c0ab570916c5a27d4402a36ece9eacf31885da6219a903e536590d3c8560628cbce0e4fd136744d04eb49be0478abbfa494802e9cfcf54d02edd2ec3552d332cebd14eb4dd7043bbc84a5a66cdd689550e736695a4dd2a718e937526759ad3a830c4b708d375ad241d72ca8ad2a8969d1980577287f22882faf7ffb7c27887513686be1f8c4acad3652570ee862b7a22d806f6e4380a26499ec9f9ab4039265687a455d5a55a41da8470433e6063505527c8dd2afbd0bdc23ae7d83f57aa91d872371b92f8afadf6637538ac352d0370de8dbe5c923587b9aaa25d8302c58f98b13247c66fd4cb5cac62a5256e613b3d4c79964cad5b26159e6e5c38fc7bee15ec5f117a69f4c900a055aef76794b692a0b27cc696a83ece7ec38ea2549a8c9c8c1d570d39a26f2f3aebee7c2149174049497a992807fdab3c36dc519322e2d25e3125f94f6b42d47eef8e018d4f642a0b3db8af8c0497a96c0895bbb37d2324c6a33d5cfa817d4a944a6a7050b75c88889c7c7b119ac33d2fc05aad6532880228a8d30ac2f289e170d24dcc6a0b5ef9bf0e42c1ffbae72aefbdfcd8c7b83129f32c23dcaf300f307f31b2f3a35d2684d06b6c54c7f7ef219c45a6550abfb78f09b50b8f1fd869e334ea4613e682de61ef4dca22843cdd20a8b618bcecbc322cece018dcd1ac31b04d93c0c35463eff526c7a5ee5dec56a439a4db2971f2a12d5393861f2123b883b8e57c59b11b194f4b3b2baa7ec2fd20b7b6553375770ca2a07ebbe27776530b5b56a1a3d7fec6140cc76fc22e9b318b73471119964575f0eb5cbc1b10271accefbed27e61a11c6556b1aa9400f50f4ba85e6dee479154b23a07aac80a436e1e4c96041299085882b62e4aded479895f1f29ace47b33a79fbbbcbd5debf7ebeb6e35e2936472f1e5afe59dbde4fad84f8d8d9da32e28040000000000000000000000009b547909fde07373f6ba763dbcbd94c84f1c0c30985d1924d109062bf5b90e966648dd42221ce112dd36191112f4bde153f09764b8129f75a893fedf55423cc97c1ad1ea9a9c56a7a29e12883f19f2a08277a7b135eb0acf4f35f1dd8a663ca9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008abda8bd150db0753698911b36e6f09bb54cf545f7bcce6b5f2102d081e0571e46f67e81abc45a04672c8f210aac6042e197ffa5f5258a48dc17ef393b207654f0e373f146bb83acadc640a4f7b4a1e242a5b31ef6c11c901e9ef41caaf320f43a5370f2e43a4e09ad5609339ccaf1aaa0ab832edea227d672c8824f2a33fd270311d0407aee1d26cb64f4290761ad4a1de8d69dbf48200d90d336aa22f4bdabba0326eb2703a61634a7aa6e8783ac17a12ba6b79d4971d81f3b6e797cc21f419c320a0460695c45d5d172883460c45ce1b8728a66e843b7712173a6aa795e02a5543e2c4067f3034418c4a806e0a91cfcec4923979a7e62463fec2059cc5705365c7102220f0d5e3130f671db702ae666c89c76111133700b61a758fbd229005cb8e483021a58502069d9d841288ae5353a7f72884f8297cdfc67438d1156c4efa0b5274703210421bb9a05e7d2678ddf5f8c1728ddcbd43cad23dcee0e4f5860f85d2a1f44022a1d3f0169b86fbc4febe37944501f2fff8d35abed59182713dd272b721ff042030fc937c1f2b86387543eafd47e927377f8c322dcc7cfec0f683e68f73ef2f5bfa54e80bca2d6928c71d1ce0370193f7e2f0b5ade24ad3c6f2bff2c73d2a832043ed8fd9154c0a95793781ad999413a58d0ad7b2d4aa7b699f7bde4a21e4f7c7ded24823515c2b63df7b7c93e5b72a1ce092a5d367f87222372e5117f26f94c01d2feeb395c3fb945d3fe9e3fa7cf5a712f7294a9af89a6ba9810bdaf6106515d0fe4bd3761d97bff83015ecbd8431064e572399d120a9f6d6f69d156b6b0be4c573ea6b18f096d85043b0b83f05722a934d13b6a7a59c151bad43166d388ebc347f3825c2757fac6513d781c22a773b63ff6cf1b94769f386cf45fcb359966c4721e1bad4daece1134331c8e90a86fdb7e523fd56da2de16b9b08757d2ec254508ae4b34f622d539ec0b802aa26e1cd1e4036ceeba522ad2262e08b5f997fab6e4d0d16cf505d18dad6d39a990f02d1df0f5525197658fda15052947ff4b1cff0eec94c531feb2b678d1ac01911cd1e402a6fa20781e1c640b54c04fc152df17d74d010571bed159ab78555225049bc9a326d6bd44d0e117df1cfec0fc6dd17cf96f220774e2dcaa395611cdc57d27b114515f15cb12809af6c82bc82083980cd0bfca6781ad15b6c618b61af5fe330c4d3529b999267ea328790f04cb35c90930ecb08026d8d68c4420d8138980f343af2858ba07fdb656bcdca94c4897e17eda3521f2475c09bf4aba13265f2e33ea54960ae343519799b48313655baf1b8bd1ca36a2ef5bd7e847b367328a8de6f0688af89f57ce96eaaee2ebeaaac37a3704da24353731a90c9dbd8e905605217edf47e0c624397b3d11c763d1ff06f86186c2828480358f23ac912d5620412896766b0bd99344afdc32d1f90c1fa1e910cd2c7aec03312b8223fc627a276e4ad18feaf21e78016223261e011a8228a6913fe45fc083b5ab5acc17015a20987ec500e597e206d1ce0dfb067025c1477b348c0db59128af4f7412efece6868dbab3fbe67178578da380c0fa1c3465f13fca956b39f15dd7c16faf18d61109e397925653d74c66840093c16ab497cfe4c5cbd2fa34f94d00371b7f85292eb061ff21a6a91c57a5bd9176d4a6db996eb77ab1371038734072a1dc68a2131bd2feee679de7c7720d2e3e68363b1200d6c69ce9103e770ee6735fbfe24c93ca3fdc10b825bec3b1bf955d0976aceabd334217d4ca8755c7b45b8a26af3e74ecd8fdf387fe6a745b499d07cc41af0bcb736f1eb1743a71b68b28b3b1ed37000b622b9b3dfbf32ccecbc703ce6d9ba8e43d1bf14a500e3a3395181d4e758b7a6e07aa52beb64a548669428be383540aa792fcf3bad56f5593aa480f95c1f0f1e3d00453b384b353789ff8768b86cf416ef86921f067d6d16cca2ad9d39c352520184aab11173e415374f54aee5adaee6a29998acac41a4c0b288b32dd93d3ba4e9923895131845417d8006e1526845a021854b4a325460b90c924169a052c676a0511ff6d1b9d0c8bd0271dce599d4a1d8c2566b45879d4145fce5f2f49858d19c86aaee93d3528a7b1efbe86656ca67a5374c56a0aae65ff4ec8b4708a565b8dca9e120d9c97d16434fd43ea46fd5b6177d0dbd10293d3e8ee5bce6228c3b15d2f0b7ee3aa417dd43d04efab30ac7da847721433172b84371acd8026e01c533e07da04c1f29d28dfbd31d4399b8cc4dde918977f310626562384dc02a018380bbb7eeac0d694e05d3ebeb1b449dee959a783f728c752a47ae2b83ff7b8edad2f684be8044d61e3f224b1ad196ec88882de377fb8bc95c644f61b6c29382062d5715ddf7a5d68527608e5c253e005f0e34afbb8519ddcaa47416e37e8459b2acf012061cfd000", "656a51", 2, -1281801593, 1537743641, "e5c7822abe17ee78435a86b7a64a0f5dc999dab4fc26271e5b5f3c0a0e2563a6"], + ["030000807082c40302e423b5ea8d73b9670312eb5d8b427718bfeea64aa22fbe5a41eddc6ae9f77dec0100000003526a63f5c0a5d6e4cb45e41d5dc88c63d145b846c7087cd17e0e7e1b861b03a93e16a4751d2d63030000000265512505aeed036b4f920500000000080052516363005353c680e701000000000265accf2fa0000000000005ac6aac63536be9b1519600a7ca00", "", 1, -1729389779, 1537743641, "d3d3a99133f131d490b21dc1083d5e7f8b176cc6fc14c2f9368bb38ffdc404d8"], + ["030000807082c4030371497f25d177bca86f47010dddf5cf7f02b2328f2d5d40a7a9c6ee7acfe529a203000000055365acac51ffffffff471c5a04e2a026bcae6b19d684686534832ed5d52efbb07128969318d688dabb00000000030052acffffffff6e5c9ac223bf23d8eeb51767c52332935c6d88f07e749f260d91aa42c7ecc9f5020000000553630053528aaa48f002dc33c801000000000651636353ac6332bf2701000000000253ac00000000f482201802000000000000000050a49603000000003a6bf1df3937afeb7e527ae7579effc202e0b96e781c4e4d3604f256903280f6b964a184cc7c44cab397fe0a80c1ae7d7068fe388523948ec1d6531ca400b453c03e91dca19fba5099190e5fd15a08b32f8cfe0939258840ea513a160516f3ac0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063934331d9e53e7b5672ee465855d9162b94baef8b9452e2713fc111519a2f742029d5cf8b58077a6fd831bba48f13a1bc047a9488804d4013bfd008f0438ea8762ebbe86b19c632dd03b7274105bb519ee405657751bd6976eb2aa1460f69f4258163f2e6779dab43aaf8fc3d60afb2114913b2524d89b522085fbc09340055022cf72d623b212215148f3b8d6c831b330f2b1eac914258ab2b6327b9870c5abd0207daed9156e63005d1ec025f36ea2d59175da6af09c8b32350b0e94627e52fc80b02468011995eae2a4b1c131c8e4b1a9b481208292da0326d31ba43a2e479db98dc273b0503f9a6c7e19e24be677f130858e2194ee764f879b467a49e9521ef2b03233682eaccaf3d75597bd87c6d880966af15fdcb9c20a3f0c23a1cb4f44299c7030319cd802a83f3bafa25e54eacf2abd8bcd3abc9f6ff7a172dc1fdaa137406480212c8f1a85f5b150889180b4ef3a981676e820e3fa44b4e9af880fc742faa69d2020c308799e5a7af88e01b00c0bc15901eccaed7d6be06afcf48545d0b117009290317b29d472f1d8eb16207cdd78e573cf5b3e779d99b45a70fe31012e2883122c86132e982877344e31d5480578366e3a28acf1622d7236eeac4f2fc8d02754a20cd12eebe2083b4e09044fd52fe522f6a6d057957da5ce480d5fb5d9f5ef593b8264eda303924c043ebb0f86bbb3d06e23069c9a23e8bf6fa786cabc2aebb2b284eb8f382bd5f8a24df0bc8e2fe06b9c9f514661d246f91b73370096688de0aa2b2c79a108894e3f24b704a4f154cbcd993ba87eb5cfcbca7fbf53f17d9333b8936235e875d33f1528e366470e3f02e99c7488876fd122356397a33f0a08f876f6a22a13a870f02b70c5e88d1476188654dbff3ba894767de858386bc701ecd7d3c3d7d12b8049a42252dabe80fcbc0de49257c528f6bf412bfee502e3574977be7a2ff3ad516a239937e93cdfa0816854024a4ddbc63779b47146854818096b4d4279ff831d0abe21faf87d0a87534317fffa95f351ffd6792b594cac36c980b88c01f7fedce1099865f4b1a7e20ebe0332cd63e3924d64b6210dee45d0630aab6a1ddf316007e2d83ef488ad62e413b78d277901a81e3b5f39518021913f6702de93c1fb5d26c332a46709f9020ea31a6aec207037e7db9323cc3b2e74606a562ff2525bb8344b6494feff6b572a7b85d895d1169a57f65ff066bcd23f47e8676aead9817277ad1745fc857a0863f0b603e5d329ab76b7bb92edf88288063f986c68684f6b2f3d391e7837d85639f7999cd66eeed7cb03d78f9169141b97a6582f6768630d56664e5c5ca48daa9d51c4e57359996c7745f265a8d325088318fd5ef70189f17d22c89c337250196bcd9372815b439375f005682c40bc462ff39dca4d572ec562336da9e7b422b691091a399d6acf0845d2fdddaf7d8c1991f60a498b01395110ba2472298f1c1df5c88b27150219225f5a4ef22e37a85af654ece7111c4906f485f86edb8d5d5cbbf794853a92be93cab4cbf465c1c454c18132b70ad0f910804c4af92ce284f31096f146451656c1530d5a1b38ec94b38a239d7c71e869589a48fbaed51f8dd724ecfeb85cf21d06a99cab6d5f6b24b3575cccb4ef7b231af09d0927f4e3ce56a7b74f2eccc95e0d674ef574ac1effb2687c8ee8bf87e498c8663dde892c366181193e8b6951c4ca182911753496b756104c90a01605cd238f703f63dc609d43f229b968587edbb2c9cb9f3363476968ef7d5a7af82cdda5c02f6432d2146b2cb4674c98abb3015caa16e6ee9f59899ac968088b0623bc9e58f9a3f7ef53c93335a618faa276fc34f7c633a8dc17b201530dc8e6213aa39b1d3a6bc077697b0301c4cf5100967ae2de0780d5e6d18ec701571faba9e6dc3f8b94841daa8adbb5802ac110a737631b25c305d1eab058faaff8aa8f548e6906c789a5f7946a4c3150fe2a84aa459e596eebaa899cb43eab7f4c9b065a4ce22209b09efc2b7805f82df02c593180e3439db8beb21273940a8c20d5defce077abe48cbdd27847ded30c7ef265c4002de0b22f59083ebd6f8b96a58c0aa26ae47fb6490d8cff9795346375a19ee736ed5ee94f10e559ae3dad8cfbfe68fe25d2c496b06a87e9d58e666a5e5727940954669f05ef2da0fe6af63dc5a5145da7e4bf85780f248557efa5f5e5356b1c40e59f4b996991780d6cb4a4519840de10c8e4f70379a6ecdb6f90262081ef577e48b973bb158b50b5b4ce0c48d3dcdcf52761773283c283ab565f23365d49a16fbef0500000000000000000000000081c0e0a685e9f52014e4416a11572e81d224a4740163acee3c4d6f94b12e6b45131b1e52def5fc5e0df5ff7da93a6840e21ba6db885d53b5c6226d2d46ffe8962f3e8d01863773d57eeacc34317b792587b9bb672fbdcf7a03e3b5478c22ccca0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038f400488e42ddb80a9c94f4010b20d6928faec6be15d08c64688521a5cb8b5b7969530f18ffb7f25f85c7ceb12caeda714d1027aab8d012a779f34ab13b88561943219c6d2c62002b3a0616e1458ed0978f0baad856c017a29e8a0e4b5149c229894c50e1e88bb5aec32555c72656789c682af835b13d63030f36f2c83fb4a50201a545c15fb0c6728dee4b8a38d697e8405c77cad64ce044ff2bb3c1c7b192c5032947451e411d7b22ef1795b47968888c3399b3120a8c214406b27eba85ee1c320b0011e1c3c07674035c073bf7bf463b5750fee0e258e59010fec9f82fc1fee2a3a99e3c5657b1fe7c8b7d38aa1a3e46af6498503a914905575a14db9d139ab0aa0212333193f218259b1f53dadd3b5df1eb5fb3446864d7738317b537f7d03e166b0201334f79cd7a7c8f32698f3af290cde7b2df6bea090758cd3238aad53ca6a895022495b29e3ab70e6dea82dd2bef943d0e5d0ba5c3eb4a52319a5a4e7cbbf57121020d669f668a15f8604dbfedee0993aa5caa05e27b8616c2f94b4a2276d66278880213ecdb76af6aeb279be3389aa77847f87108df5f084c50b1f631987fa80fe1845542824167536e2e04cc49ad08a07965340bc5c660fe95f3627696b0fa161b6ba1cfd4f3674d30b0a152a94a7d89a7db1c4e556b6f508642dab9a7dffe3cb226f4e1077b2c2459faf663df8a224ecbee7fbb04d3fdea0d3d7196b888496827fa03ea8decee52759b9a6ddb416c87d6e2a6c38ce6628384448ff98475392ad069d9c60477427556876abc361d9ccfd906f2ac385111f448162c62600b76c75e11c1278812e40635a2e259541293fa402c179628c125983807de25716806e1f3c564f7651c6c1dddd78cfdb7b0d2f61f29cc74bae51abdf0bb920c5e7814c2a5ca92c70c014020c0a8143817670955af3d41e880ed2fbf96e0f1586647d0556e63068a77bb55aab597481ddcc557b5b2b7bbcebd5eb103ab7a48dcd8c8cbd7658e93f069033f889c7ad63a7872eee07c7d7e20b97a9fef4d68c9eb1f6b0fb2cc03a60b655439d237d8b8e46d6b97b35dd6e206a14ac6ba3efd2906a1dd1e906b15cd93875e316ab4ec4f89e11901412220d7ebf0b77335e91864f2d468894aadb4066443ffa5e4eac75bc9425c601980962b9f7c15f76914a4a24f24295c0da7d68ee2fd57325db1ef3fdfaa5565f69410f55748c2e6c5ef85e241b84558c4b60ea9821daf00ee0bf4707ded0ef137de327e2f08665ac2f88b4cd743d8b1be859b8ef0f328bf9f3dc307d7feeceb57397799e50af6faa3cd9d331b8937998221ccb3584332a40c02cdc8b87902d5251b31149c01076276cd481daf13915d260c42acb713d3df768bf6728eaab98debb12adfa3f3b33b78b9ec0986d6ca6554ce7d3f4f2c681764144ecc5c5d6ff20413da29b49d59f27ace29092a0788661646e68d339a9a268242a35bd7d5afda1aa32e78198e708dcdd6db0d8dc3ee8676dd0fd452b55452a75309f4a47b8bf81331f4f6b52da95a0ba157ec87de29c0facee454de3af9dbe764d4b42dff12cd396c4018fd370a2ece2ca7709038f697b4cc581c03333dc207ff2939021bd33b2b11a0dd4f613fa3de1b69bc139fae77f96597659c0443f8544bc95a2ef4bf40782a63501df5a43458c4c6c5ebbab2cd9409873b31ec9cb17d29eeb0124595f7a45e82774b17a908be0cea0ba8c3007e043e5f132beffe9f007c0ad4feff9554e2ee9a6745c3e75ee8a18218b42590db6b69a5666bd55abe6bf2b1442f7f041a526c1e89f86dc3afe6d9a081550a4c51f9b98242ec08ccf94a2ade2d3832253f52d76021432ad893e1a17ffedcceb161fa23a0db1aa8c103b066578667ee852b511ce57371c76771f4f63f8f093b64b7e87d2dae49123adaba12ab0b31b924103c8aad32ca81507f5e18b24457482609b7c481941296838dafc8bf9a3369923eef3baecb891c5650f1ca25e970bf241894dc7929d6a024a820effd44e7684c7e6b87bee4f44e6ea06269b851d96683f80c238a31cda038dfa8ae7a3a7d880562b5c9814acae935d46c1fdaf34ab0f543b8c7f8162a9b5d54c2cd7de023722047312c85a8dcaf30c7bcd86c9dfcab6ecebb69a0aee2d1b6a8d2d93e80d631bf184abf14e23c9211473a9e43fc2ae369a72619781b023bb612904632c179a9f210827d2e670b1c1b53f4484a7b070ffdc6662a0046c8b35de0fa097bfcdffe7ee29eb0cbec3c24354a872442c535e2f83444a4826e8dc34b220427172cb976734c1872209c000fbdce342afb50f3779f3c263b8e6f562b15a79a7360b15718876336bfdd36764fddd632ab9dcf12a2f153058b2256d69fbf3e77b367cd07efb36b2164e730eb397fef742573c40fdd09fdb1b244e5a9aa5104d7672cc8ad5257ac52133d9f07", "00636a65526a5153", 2, 1136457586, 1537743641, "e851b8f83609b3efb8d39cfd8fdd8f66777e5616b4721a98a10008ae2f80291d"], + ["030000807082c403033645f031ae559612a384505b4e87a9503fa5d03693c4841ade8ad1772dc102900200000006ac6563526553699c046741d9c6de16a5f37918b4cf7c8085cc9ec18fd0466425311abec20a282e5c513402000000076551acac63ac65ffffffff5c533b793f80958fe00aaeefa29437bb9c0fac512e00db707f9fe3dd5c0163c00100000004ac005352ffffffff01a5dfc7050000000006ac51ac0065000000000000000000030000000000000000d4f1f5030000000010c5125f6d480bb307b0f4a68570684b69c3757fbf0e0d75ef2e62371bd08520778271672712ac9a0de653a6394186b8f8bdf39ebb1bba99aba71fc2bc8a1c354b3e38ce841686a9d55b8f7f05bb4a2a6445a68703c6bb49cea3f7d7461ae58e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8f008d395b6d383e4cbef63e2a6e63e6b9a5e62c9a14584c08839abb3eab79f5721a7b49ca9e1bc83814aedc1f1ad558f2e06bc6d439cf24d702383d12993315aee4b5172477a38a50db7523e7b2ccd39a88a069648f7208c4bea9bd838892147ea70dc8254b0fb8a2cdf22a4809182be8bae901518b9a539b6c9f74425cb61031b4f891f3dcc71b1eb7b6cd757660ed7df9d9c6a1751746b2f2dd3e3acd9393c03088d329479bd68ce5adc97f5a6b9b2d4d21af67b9c7bb78d2c611d82bd00f4da0a06ba805fcd1cd2f1fd01124db7156dd6d16ff8fb0ee8d61762ce82cfd2788335de3cba0949207da9e121726ceb22905f6615ed324f82d5098589df109ef2ceee03120e973fe85da709be04b4f7cff30b2e90ab860f40e9b1705abd721ab007df83021b8e261b0a203b2270054a449c31a58b291b9b8d2c4c9304bcf92d371e7de8530303e740414a80015cce00869ff849ed769fccc9a55e9cfe1f1d36bd42935683de0229809b43f3627d0900be86cd0e9b5913d4b657d93bf9f342ad14982a4bdc4f420330496eabd3d0932d3c133670dc821abf8cdac439a1f1777925e115239a34cd7b9f112ef2f3a4ce2021c6cc318a078b060fca2079bc90ce78180f846895d389dc9e155b92a1d2518c493f55865b3d2a45d0ebe233100f802fb87794d334550f70f9e6dcfafb1c4b7a2a6b674b2e88b298b69aa895d9f72877fd65a1e3cb96ee2fa119ed5b44b7a7863b85fbad5f7378beef635812b9a1748de3258f1086752efed94f021417c6936283efd69e77b50334d71aaab4d4a2b134440da7eeb799377bcd8fcd465afd3a7a0445156d8ae3c2e3ccd3ad56e32b80d60be5ec393097381eff27eac186736899571ce4fdd1136ef0e469d5bed13029052ef3f7882f9b66cb8da27d594ca81e6b050ac9558dceede8bcf133ac10f9cb50460d82053f647cc170083b9047993c6f8a8649983fd49272cc4cf8f12acbd5dc94e21d25bcb3e3a1f93a580860835abc16b6de3013aac1accf881862b9c331417646568a0677d74eec746fe5e6e04729f6f8ce83a126c3b4a12b261da1eab2cc7e04451cb3faf6d278e263f2b12e56f2cdc736d5f746754729e7c806160532477b70b845ab718aca8207f1e8fc67fcaafeb0314c51c4a8b7b4e0c50ec4db214ac85f3dc5313b66bff3707320d35d2fdb0abde9b0c8aa0e65902dec638a4f92c510a5b5d36a73a915ea128866e651f289badd525f6db1f671f1bbc0a58eb1423b456932893283aab265c4e8d45be4118ffd8a7263359de2fc3fba5ed47a49f39f1f50a14e039541f79dfd1f986cbeeea04ea5f6c99cc1de762d312fddabe16b1a52447bc3f0f795beb57661cece9f10dc08c403280720b32d5113f726c99e697da886410a92afd488b7d86c81b69413d0aa614637a2cad6633f2274f8422fe1d5fb6dfe72028efd5d22f1c704473b0d4a6afde47bf814d60e60a0353cec8ded6d60b21544ababd2b6533294f1553bf76b630274033d3ebbc474a0c3d0eef88b3a02be4edaa8b9b75d477fecee194be0dee018f948c55bc5674577c46609b24df09eb58595e9cd5ab23d7b7c0573b2a80f38559dee95f082da1790cf5470d357273631034bf8643b768c8f5076f391a286d9897a24d17024d6551d60ebd41ca5686b5d91e18812b62c0f56940b29936f092dffb209306b596479d447a773182d4b686777760d3a01108bea5357f66ed8e45a39ab7c931780177c8d53c55c9b75da86bbce6cd3af2e9c6af39751bf0834e48bab2da7a99869f6db663c318baecc2592e7e089f82de5a3417067b68bbcebcbe51394505800fa8b2a6efa4249ed4ca6d3067ea9e102ac365a37110dd76be45c7932ff3588bba67460f18050d10765e827ad9873002b0c09c00564db6bf91ebf445e6c513ccd2329f01693f6324a9a55a2af30fb5a9feec5a12bdc4267d9f5b0ce70eac94b8305fe2e3b70f49e5b349b391d20150f4eabc723da1099c5d72ef50a1c4ff4eb9909b27033a2a7f6c1ebd4093577c73e56abb1731c91af7f242e360b95b7c92a66ddefe9a23aa7d80453a6d51fa2fd55be5ea7810908b5c2ededb17de7b65da0cf9255cdb026cea4db908258238d52e7965409342e4c2c59a856af06c1dd070a52089b78abaf241c02c2c98056c09abaf1e8e7685ce30a08c4cffda88105bb4ab1857a3b99123a9afb66c41034116b8a1e49d078288e11a6ebb9a25728845992e0a4746c75c86a3964caceab68dd37a902455dc2b18d79eca1daf7a7b6a13b80bc74b4fd21000000000000000063c8050400000000b366fda1f2400e22f9f3a8fc403f22b0fb40b0dbd95b05a11808f40e645751a280a4df035a73706847b5bc917e1ef02463cf8209688620d71c807b40271d9fcc74bffdcbfa7d24bb10fefdebc4b8a3eded248f1d1a61ab17eb9f6e8cc67a06720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034c06db689bdcd92bd2ba5af82c9812b3f4d8313c1d1d10a39d4e1432b3c0233226e24a512764ce6d6ae4df76e8ef88812a747b5cb657975b7ba6e48ceb34ab8d80443c1e134e1612b252ac0a33f3341134859e8b61ef2457f479f9bc91117e3c56bb0bde459d875653ad44aec969c5e7c0e15cffa37f6da94f04efe20cb81cf031da7c3b5ef4d4c260d5213c8d9dc7668f0f51a06ad9ad1e88bcaa73574f5c686032280b414b8d2713569710e3d5b9a2ea10a65fced8ab9d428f01296870bbd57e40b04f5f0c33459c35890c6d13e45e2269c63505281d7cc22b57f699e1c149acd6b3715bb19d4ccb05962d1a48296ff94c8899e4ab92b37bd92f751c955cd26b5f20202e43f3659ac7649c7d2a1b99cc6498e80285dc748c57410525d1a13cb0ccfcf030e914d80063afd994b48e23a3b24f6d3e73e5b08440683ee50defbd25dde95f80321317f3ee0b52324f974db54ad3df1879d6ff3b8fc2b63794236854f26fba19b0206675dcefc66658239d73ba343e0445da11cbc42916e1f7b891f5039f1c8034c032ce4400f322dc176acb9709241dd918b789e812006a2195c76badbbbd3b3c7e8c0234006c5f073746ceb34398483b98c4d5d80269eabfda4dfecc3f652ad161f8968362dda08bb946ec4a843c25890a9f2f4e2ce8d0d4becaa73c397b69f033a2cf33b2271e8a517e20bbbefce51ae9eb31307a04f695856750d0a35721b0ab2e5f668087b9b51d9b9d899d4a903e33f47c04980eb27927032bdf5ea7a513a234140501352812ec6f135d7f05c83cc790126e4a4429bb78851dd7c9ffad811ef6ba803e20ae2e281261c7714fba18b35c491952833e90c9ea6c8fb9b04cf1c2041086b91d6c934f87910e7660e441051561e4a68d97bd269e042e59267990691175873f5b254ddf2e05a5d71ea9caf9e272d45e6ab6100937ea00777d5b1e436e8ee9df07d48e59790f88574cc934b93441a89bcfb45689389f0b7917403364fa76e7edad4d80e35fb09a816b121f70e4414c8c5df7185f23baa4b5e4031cec3571e09ca83df66f625a686f1d69205049dc39191352f6763ad38c17dc1a4f1b908523fcf1db91630d541270a7e03f8c0f89ada996cda59658f198b1ccd465b363acf2295c78d975390905ab75bfeb4f1b129f78b2771102bfc6e184eea37c5b96095cb09fbfca48e4680780be89b19209622c4454febc79699c04bdc52940cc56d957b178145f45a33bb5e878e090266abeebd1d1dcef968a042bf5dbae4a1ab7f4c5a41e0d00240f5ab98241db26bede1172ccfdecea2b05bc1d09496439a17061dd6dbaeea88f1e3e3dcb50062615e3554f58d821605da30190bfa22a59bf2563dde9d67994c6f5a9c1341885c509185b8fb45cd0ecd1840fd7e4c3b74735461ef7b6887379644a5adf99c1e76e2c0542d0445da80c067cd85bc5fd55c7762c3870a0d5ba9032ef07be0248a83a9a7d1446afc54eb2d547ea7e5145b13bfd4ee24ca7cec3ad75b67e7776ae400859fb08ddb9d88a40e1587de5bc82c7c2d4cdf84b23265bd8f5ee4450c22044b1d42139cc8b47efe4ca91769146621402a478e85e5cbf0de833fad9fa9cb47ad1baedc842ad5dc1d78d69ca9e9792b980c251e19536f264adbfb6abe8183aa0ffad82d8452b0cb5318239b241f48c948e46aa54368d67e4daa925c1ab7ae056659ec534e0ba7a3e5d97ac36213d6cde5183c1cffdffa11ba893986d5501c0fd23fa9a79e42ad9b4dbdcf40cebf3a0eb4f1a39a8011776b5c3a3af31235a3f98fbc85af0908dcf35fbd23e5283f9f95b3a4c9f1a695429906d5846a664ba25de890c30ce5f9cc3c2a66d3379bea324a3b9b1107062e98999863246b9f858f8016bf7de1578da1f4227c812fcbf644c84efc18d11940243c651b0d4b3bf42e3a67247e567ea175c6bb75d2d111192566da166befaf0f47c50010a67e70f63f17a1de02a7a696907db29f5d535124cd1787c688e590d04b053b4c259457a1aecfc42cc74cd7631eba98659666824ad503fc54f0a3419108b506616af64872a8cd5c19e5a0513da49b3a37156629f30a16bcc46e772a02214f80dc157e0101178d6d3aac0634d1a0ae0d943d7c5532104399c636048fb471ddfa63943628e79c447992d052dc1846cd8a3e760c7f111e06713f3b08750f037d7fc66f7290f3b6b20f7982dd3a056edb1c36b08ff3da18762f6cd8171ea67460ddb27dd237d5a3cd2a3f957f6045eb0c73705f0e9256213c7406a931704801dfabdf2de638f65c13eed9a355f6e0ec5102000000000000000000000000bb3cd12681c659a56ff494f05221e48f7211219fb989811f5d59cc7c90fe443652abdd4155331d4eb23b033e34958feb4824e554b5e2957d836368145bf3d565e0c00b701861ba4e2acbcf953bcb0753559e6445cd362840597f9b054c17ce13000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008fcac08a00cb0805daf960405ff92a66b6757f1f27ac42e28c77af486cb726487cebc0727f704cabec42318d0d018c1ac39dc66a5bfadfaea77f230bc7d7947d20dbc387a2fcf9aa33d83c074ed7c845c1593217684f23348b915349fbe1f91874bcbac727145744928dbaf975848f13ef4a6693df6a85ae4bcc86252d792f22031999e6f5b4f26161ecea0c710bba0d3f18146f0aaa7215bda5f78bddc9929d090223de48bde9598c0079bfd95c7c288614439b71dabbcd73b3197059cd7b2f39590b050a48899c1951bdf2b9b3b47518973cdb99964508c6520d1a2ebd8ff5d31ec956823afb3d9ac3f3e8218abcae1ff163682f7a068edc74093ffc7e92a97aaa540307ae0ad5d3d2b304cd1f1e9dfbc4e3114962612c8a442d7d7c999130444fd731032d4d2186fda9128525a74890669c676518fad4d966efd62194bf22e5117a332903205e576c865b9590a9e5fa392b6713c52081f81122283c9916fea3b1683248f10210bf2a7fb467c20e2e66762efd10e2e7dc99775c8f823463e6f8270404aa3ef302239c1789b0604492a731ee9b0a6ef86466ed8cec75ea66a0f7bdc50ca5a1c1d42acc3bb2cc90426e9460ecaa52d5c3ca86f2d7ba231145c27b50b9e2841932b5543d3ee5665e41a4c09e35eb36bb01505934c23efd11e18254e500fbfe474dae2ceeb7621a7fe5ecdfdea0575cd33fd0899c9e0ec86475b984a7134e371d6a9c1f025cff523ee9fedbc694d3942d7a6d8b5a9f267ff8016df7414af35944eda56e3a5d116bba6cad3597064dee421199bc2d709eb6c21eb0545ecd9a48ff6bc8744796a38b47416f0d70de2a8a19c43e5c948e37c176affb6aaf670cd929f0b6aa41524e980f7a9d78a44020aae3a5d0db3e6cf5ffa46c1cc12c359d5df926d72c1f749f46ee0bd336dbf42a09a128b5a2f585b6ca6400049cf8912880c59164eb6e62be96d67dece38df2e17e3f4a91a7f591cc5d3b48a8f98105fddb13704c9e0a88dc0642c707436871d2d59503e6faf342fbe07234df55c2700a0bb6c437857ec110c5d55470cde35b8cdce90b4a6313021f571affd5de1c1ebbc3a8ee138f0b4690e9e3ad5a0fe7472884924fab4525d573a40a4a0b9ec3d48cad089e118fc8e7689ab2096ef3f9315dde8e3c02c2af1d42990f9e8d23f96fae825922af474d05440f2344f3149ff156a7ac697237ac15d6c66f5a4fd22efceeb2e5546c99d554a07d006e438e3743c31488d73a8eda9a35c2ee3dfc20939f13f791b525906e5fc34f24dcaa80bccb776688149db828c4b1891d08b227c36a3c4eaee79042b3255e55fa7947beb32f247be2386714f009f1d33f31e707558c24553095644185c833813aa944b23a3a72be4da9ebb9fa9e7faefdb553061356e9f2071b90f292d3c559b0c759a2b128144650e2ad019bd27500e7c85f4d72adf4e3f2dce6d9684d3805b5f8da4e13a70f0fa641fbda6b2a0037d4c9209feea3a7fd905ed80f44c0944383441786c91b4232d10fc5b286b6a79153f8704d2e83e63d58998bd0624a287d8be319cb9677ffa8414fc23203deda2616f1b19216e11a4e273ac5d1457fdb19333e5f56028fb0afa1746bb2e3bc88df2f9782ec19a083e796feb9d742db3bddcd9ef71dbf4452de9ab681fe76b61fbcf7bfee8a2e50efb04820f6fa6ec58add61351e0f3cc994976f5e3bf153f95f0d41973f031523e60d0793a9ab7d7be4dcd64096ebaf978b4ea87e404f471d09cd629c6248427de4ac68f921234ad5269a265fa8440ebcd9497d9d40978f11ecb65537c3fe77a2448855cd94015722e6305779d33f079f1b07067b7c453d75d6a4daa68aad3407094b66e77420aaddb62ee512fb7e6fb8da6bc4c919b4f5645a9465e3f0a3c4066ab75013326a626e833842b15318328997da47d6b6c3b7e39b0eae4a6b66e9a959d5644277a65b6424482cba36381e22fdb3b4ccb6a8019ec648bd9ae5a6fb651b6abca48b9c838ca31d58a12b45b8e6eabd5cbb59011eaa418130092da63839c104fa97bbe23b159a8ec5defb1b3c608ef1b7279ba73c6eaa090a739edf9b6e2ab9f68a9eb3f2a8a22ec6239acbdfb8bac21b374112038fb7ee02e8315b19abb347e5abeae664ecaf549d80007ada037765f6ba69dbd6658e09a899e29b9e54e7d507bfc8432681c7e2281179690847f970d4d1cadfb707dfea3a6a6786d2b8be54a0cca036c1457dcd0a9718dd6f06a62713d61d33a517368d6fbc8768aa09743f00a75ef98fed49bce7fed8b8c7d972873c6cb78fe1ddec489a765e6ab916ac755040355c1b2b338715fe3c4e6dbe8f97ad3bddce47fef0a9195208a4b6f0646c848a0ba4b694044314285e5bb8f8515e716de0b3dd1b17fc75aa7b1f7a1a5c0931bd0e9ead68080212b1be0e6b7bdbb059946c4105", "5365ac6a51acac", 0, -1950207824, 1537743641, "efbc3bc790d67f8b4cec2608f2ca37f76ee54057a4ba47719f189db685ae75c0"], + ["030000807082c40301dcf962a71c7d88ad15ea808b2c4e9208578b6c4c2528a32694b8b8e27d491e3c0200000008656552ac0052530012fcb45d0212280a04000000000952530052ac636aac53e073ec04000000000153961c93b00000000002000000000000000003b5880500000000cba8ddcb763cac79936842a3c6ec8ddfad026722ee88b27426f56f7f9c3e0a6a8f454c1ab014d5df00d09accfdf32ccff11ea02148b5338d8a80490382af3afc957bd4653ae1e8f85b408de6f00188f41660407dea616460347c7416fa5f905100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d8774aa1c550c935a2967d175f973e0813eae5fddf838f48d7771763007d1cdd7aa5a68816b1fffbfe29bd4b9808b22702503932897b3985244cff209d1d98b26fa13df9942feadfcadfefd3702007c84c1def78318cf63c1a5ac0b4c82d995f651fc5c229d063199d0694032a78247d41464926e6d430359ecc9a6312382c3702191cc7afc810b74673064d79175fe2c36ab20432c33b324ed6a961332771b2fd030fde078426d40ae8dff163f5f3ed8f7d80c6a298b60bb99936f11f4f3872b97b0b03066075e53a1c7dc1af6585dbb571269e6490623fa46909e645165bb093f9485e54ca8ade1925dd9bc22ecff1ada187482ba6b5358692d9ea64769975318a03030d1ad49faa1a0ec11cd095621991e865b5ce97f3722cf0e6f9c810e936a4b18f0213645d4d44b0734487f3e728adbcb163a5bdb814d2e980378fb9082954042122032b344209bca42832f71ffc62d164788089f2803b37f38475e988a7ee725937da0323e083f370858d4d9f354409c9260e245c6da5584e3f439d3f90776a346451f502168fd306aafd31bf4cbd8db601462cd46147005f097b5e3789f08386fb8a082666b69252d2341dbcfe38eb22174f375a0f4d8704c660dbd1b969e9bf93122ac48244c3f6bd1db9fea7fdd19053605aa86e1dc5306056757fcdafd71c0686121518677985de7c94f2dfa8b6c78f5b46f65e3c3c5c5942c2c75aad40f2176090c9452cdaeb5d1b8dea2365aa606375baf1a4956320f72f3012e1f9670f0160478fccfb722224b0070882f80738f44d639eba8ad36c06f7eceae26ee1f53eceb50504767f5784b7b762bb96422e6ac6a3efeab1eb3bc32fba0d4720bad7c718c6cd17f8832bb57bb04bc5adf5a9076ca87a4db07d395fb22b9c748bbafa635adf31567648b86b533970a4af417d059c91dee91dc4a62ea73358af43e96980d6be4f8739d25bddeee6a9415ee15470546594b69483b1e070f1b63b4425799ac4293e3b72faac898b5ec9908ed22f2b60befbdd6ca5084cae23317f24a5ae68d5f5b73019085cd01d4ad0643b2187f3506532ea2f2771231fc930504d439cf304ade1bb2b95e56529f4161166a42f4c1fdac4b24e20d8283a1fbfdd48bb41f420aa64f5892e479faefec87e971b57b6e7e5f57d06d897fa14a82e58df141a4648e4bc08be0ed098ad682510642f98fd72137f69eed0808e4f7d4f1f2f53855fd6a83eac8c512036eb34c5953b002033116d1aadb20fd483f9cebd4df73b9f0c09def7ffe1c05adc81e1d6204b2413a1b9b66b68dd8cd23488494a3f8fbabcd3983bfa3e5d121221344ea21024b92d8f4700138ac0488f32fb5cce489459900d5cd9828a9e16993fc254d45c460c394cd34a888819c5f6564508da668b868e06b8b768d226344c6598d4b25831223a0a8b241bd6150ef9ea83212f404817a8b5beeade7c0cfceea84fc2a3bc999686f3880de42c3a22d82f52af110aa745808551e32c2dbd56bb2b1fc17513604903701a8dadbf1a0360a5b760f8bf9bf01752d35ce9f28dd4e84fbb8406d4da50aa2943b3ed6b1413f79688555ffe57328f60ce82cc4cab1043a2208e03d76b31d2ff3b11115c7cb97ac83d99634b2df00d4a704c016a87045b742a5343defa19cbb8044893a888f1eb98d5d7adc2f12f7d4056278372d2550a47ed3e5b95b7bab1e32fdd0d1fdad61a7fc7c4da4f49d344893d7ee3d6340881006ce7cdebe64c98dbad1d975c5b13300162c8dd9aad71e2aa8e5c6f954ab32409b3790b8c038b2d4982386999a2bbe3e64b4e7ebaafcb8c5b13779a372b25fe351a27e619570b9442fe7279876fb2fb51c3ecacf09397cc247f7923cd4a5efc17c48da30ce4e43e9d243ff8ad088cc6fafcc3b077cff7822d04d1efcdee49844bd3bf1ea82529e23a200355f36f77397f31d86c18d9678e114d32f35a4a6a0fb8285c758b6a4148f6c94066189917fc4c57ed901194baf9c9900e52e76a281fbfa7ed34e028933b0ae6e138c117c8a8bd863d82b57f77ebe6015dbc689556b05d2a9636136c3df3626d19791c0762bc701c7d4bb4c0edac3d8bb262aaa3912b60fcf6b539757ab16118cbcd75352ea3d2f0773ab3c8be820d9649b104ec3a56d0941c63e75affe81702252a3cb11280253a6147dd05f3c4ff0e35a72821cfad81f83459f9bae06f709fce878b4daf848d1a15dcf94ca2fd0c0f54bf5af711f2a47fee888e5fc4fc9549824fe3ecbeeb31f8a96dc09269629ef0e26e2e1d715ba66e5680f49b1735a70d200892494db65b050000000000000000000000007c86bed0ceac68974d6bf353fbcadf2b8489c1a38f627ef58369e1871a2605bf6e9ad69a9749381d590dd5b4a82ee543d09eeafb1952831b5ab0d59990832e74a8a0f1d9aa622461d2d847ec90f9f71499b10ecd7b566a537a29b1f12d27fff3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007947a8e167b9b55d3d3353705915ea7e325ac2a608cad1021223fddb2a73432f07f32a1bc520d31319dd084bfddb3eca92e1ecf2d1a031bfedd8aaf71ba3560c08fe79021bcdf8df469f7a611b1fcf0214091c699086976a7328e802502e2cef4120aa9b8cee2cb1f3e3589701859b894a359157a7e1d56e053d61941f93504a020b813a32049b9ae771baa6ed0027cf6d7bc9d8413d38d4ebce9f57b15a42fc18031387d0868e1ad1aaaf45ef372dee447a8073532ae9d3f9aad53be58f1f927a2f0b06a4ecd5bf34ad3e054d9879641d8532d4529f9dbc6627050825d9fe43785f7cad13c67477d9e7fa58cf4ccfd1539c05236db55fba5a11e64f6c7b280de70bfc0206d5f61ddf2c9d7c975b06e080f46f177fca019f803181f4a25b299cd0bf6e5e02008f605bdd1e72909f80675284ce249da8a5b951c5e394b4fe0e4bb5a34d21c3020d7d4f10c30fe6f79cb9785683840972a8f76640d90ee5ed9ce661e292f5642403248b52c2242773785083884c595b846a442e3cb651e423bf2df9db99247f038b032f3fb362331113df89f512f11aa38ee2c5a0b773bddb3f709d9447fbde18aeae9fbc369d0a39c22af6133aab6281f56159b03247d215b0e442e5afbcdd4451dbfe4fb0f6e9d7f77406e50c7880269f9ae01ec98791724b146727f950ff598bb96675977198a05a8a09d728de7e9eb917efac0c8a6f64abcb6e3e82f4bd6e8a4ea2c6f4dc33e8b8b3380b6adc0a4d35d0e0d5d801f530d297634e6731b3298be016d205ddec83430140c3001d705d01e8905002314006c5bd7bd12ef7f10c55b805190a874a1727b0e2356f0b3c9562f66e23d3fea77fc7d9776ee022c549998ce61bd49b43272e6a0fab15a1950254e0d79906d51b25b774d26aa04b2c694c0704ea1e7fe62bb34ac6c82126a4cbb5d576a97d003696fe9f35769623de410493c71a979335497dfd9f56f424ee1222c4e766fef871975cfbdff950692036a5d43aebe3728d3b19940ccc2d60b4407f0872a23e0c722cf30302318bb2e6acea161358000286f451a1b9eb4ed02c17da0d7d696fd62e2fb3015753866872f911ac30912d25c04bd59e63c4fae0707002e0d61a3fa7a96f9e0458ae1cb67e822cfc5ca35d93e951a48580085c6db075be32e01af4b559d5a7614fa80b2b9e07876c219ceaff4ff6435c1f7c2d3bcb5591da92df2273df1ce94f2892593a1b3016911b571750d443dd26054d881df04e4479152cc08278a86fea4cac7a0e35437e5dac4d6d1e3cf0c86d7e0b5a0a28620e3a184bc5c2239f466c72cdd55e7e17d091b2aee981e2b4712afd24b94d4fa8938852b411ab54f7c80badb0daa0fda00661841bc631c1b9bf8737fc564c2fb231dc785c6bc1c7d9002756302a460b152b0766bec8b52eaca7b425c984cf067dbd4b2d7a6a342d5c5c8e4f62c46d813b239c493d1cf0a6ea4560292460851edbb48abd7820bda29e187a01325fb3aedd13eedce9998e8226102e4c3d5e3886ffa008e97e11c5c37f62e2161f1badb88bc24b5d63927600c55e64fbc39dcd335f084b8d9699069574841b4db59b8e9d4c2a8ea61983d85084dcd582d2e65c6fe0d39ffb90baaa6ec5d60f2e8adf16cb32e520e3a44c17af30100c9e21aeb96f86423bb3e231f3389d8b80ca56c46f3bafdd6535c45895e52170a52c26ab295c369c1a674c4136531d64721e8d3ae4d16d45d5635e33bf6c07deb3b337142e9350a4bfd3eaee187521c068aac6e725813d015ef4fed16ccb2627e7774f1ec26451bcca34694f7709b946bc4dada8a9697c060f02ccf13731a8530488b581b605fa08c65c322f21e5b40fbd19fefe7d6fa92bf951c86953c663ad84a50d7b931c40160230cf3a4f242215fbe8e8404b68809c92b2e162454074ded18a30c906c77908f12de5f9b5a1c07e09eca73181419c7c44db199d09395f483cf90376a05c62208938bfe2808486364b547d63fe71414e41f08e0f88852a209b0787267eefab516bd9c68da12b0a2d2ff01a95a9c50bea04b7093fc57c43ea4e581de5760dee8ab1e721c3a5c4b01151fe78ed6ccb105bcf56dbc48f4724f2ae5f779c9d6cb47cbe9c79aacb8121322ede0e6c3f3a244942f22d20a754f478a3954854a8f3ed93f30547999bd1624597da112a74f851e15c17ca6492e2c1208914e0dc3f978a8da8803711993021b3452f883c3e769701f34882bd9772c335ebdd62852202871ea18a5c88ad68f59306a9e0bff7a659623f590134a564dd35efbbb60dae825c0c3b6b79e04f61ddb915e00af573d953ff90303616d70839a9cd9ec1bb733285462540feaf92ef61530125e5f85a796576344b7845d0db2379d3b32d45b9924cfb55e6c2e85b0f632a1e5ca0bfbab4ad9989263cda8c12b8be8667f0b6bc3d007c807b0f", "ac005353ac51", 0, 312025353, 1537743641, "03870cf2407e52a0485bff5fc0a87a7366f6e1ecc9341e582e83b39674f55db8"], + ["030000807082c40303df41495e39552d2aa2e2bdd046ecb9837f0a51e02daf46b074925e5fe2734b23010000000251ac94e80cb1d3bfe95476b4d3df7c9b49ce179e65f7aaa9ab3dda55bea6fc148a709f40fd63000000000165af5c224cd369a4d361cab989b28039294f12de2d7e40a93f48b0a675f749bdf9e81048bc0000000000ffffffff02749b790500000000066a5363ac6aac94c9d004000000000551636a6a530000000000000000030000000000000000000c2902000000005325d592bd9305ae9562c661dfa28c93dfacbefa56df925eed66cbf3260dc46c5949c90b20aa696dae88b31c22831013035dc0f258c9a1f0d54f40f28e6ea5dd5722e790ced62d1bcea865f5c75590074a629c124748464ac8093f32c534d19300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000883ed71aebcd37b0b78acf463244dd6b887366e197d739f8d3152cc719428c912c2b669afc4ac4f2a99f87d18382bdeb2ff9cea43cff4bd0c0ec05218c2545ea6af6293406393b903cac60aba91f5e28f1b4622d31950c9f0396623c044aa851793cca888a377fe59caa95d9e99f19e98ad608ce8814b2540c4f85c888e373e5030d8ca562afd32904cde983b837d5a04c6cba61429e7e4dbb8a98cf5ee295fb39022fe57922e4204938e162f751cacf7685fe275911b7ac995f319c90a5e7b9e1a20b047d020bf1599520a943ca6c9a7bcb8b56bf0da4c2b08a48c69476699476f47de42b548bd8697b462a067b9cf5392f23985ff64cf25c667301c0ebdf703b1d490203ac92de638c730cb860a69f0410de4a38e181045bc25ee21d9a51eb4353ff41032dd880f407dc747191356d7d6f84431207b8c4078f4216c5cc40639eb476212d02259dd65a64c7d190fd9cefe691fa5186ff0e0e8e3178986aa9515ce10d7e4f0f0217f97fa5a7543b22bfc1d75be80dcd8824efa4677973e9e9ab678605dd1f1ac2020f943bc88c43eed8bd3cf326c673521f171d2c4e5b57b9b5b000c88614ad49835052aba21fcd201677d9cf0770fb4ed1bf056ee14ef6af5d43bb2c8c13c65e463cc20e881326c3704323091506ff9abcd841c838fc2e6955c02032f8895ce65956670d2395cb1455e305c6067bb05a4f34d1f66f0a823a8c623f3f38b4c177e02c81afa0a22352843c0d402cf9df7e6c31a51d44b58bff705c6f7454bb539653e0915c54df0e028647cd325646220597bccdd94631ad6cb998201d888826531eda02b48c65c40adae830a7d47ae5bf242db10ef95ffd05b94347abd5fc79b865d6a3bba68d67929c85e3b9e1d433eff311f27d653ac66c704828cce95e57ad1d408c7f9c2c23143d617ef58e57f08e81d70dd51d2d9ed220415ab022489bbefed477c9ea9db241a19c7dd5c2efe948a46c9b44c59ef615101ce6c0598298968b65f8927cd1dcd143f3221b3cae2018f5f93368affd8f296dfa94b6d7d299c6a3b4ef35a3fc48572e9ee0e5ebfdebc78586094ab7492b09da4b5c73e24bd40afaccc14e2f195e7ad851f90c705339f79d8475d4799796bb3cb7a20d266c873752e3777d90a6e0b6e258c2c3a91c62c762191be8d88b247ffb33a4d2bdcbbe8fcdf2c38cb7ff33f59787408cf63902187169dc5a49629d5210384314dd568692360c231ec7b49a54c0319fca9a8a82a34853471c0610ea0ef9a8a51aa8225e05717298d6ac82cdf9584ef10622f6ff68ba4abb264853e9482f78a6dd9c3e6a3c4c8794d45d0e4d4fd76cc0490bab7a28a05cf48ab12a8e5da82f0e08a647b01438e40c70c5899977cce1c3b1fe94aceb41ece1ef0e6a33e373f90caea54c0e01ba2212849328443d8b4a4afa09f26e816fbda0fb6b89dfa9884baec93a0adc940195c79429b93e749d606fe3e2a7de6572d7bea9c930a96e41b7fe55bd52a342cf8da98423be92e18d71d9c4a85c4b6274bd563ca181de181bc2b39f39b6321a8490337ae7534f5f72865abbb5db72a4c13a038d747df4d0f99d3271269f499af016e8c9a698e90b560c8ea1a0d0b6872d7ac96113d4571d1797ac41ed598afef5b723f0b1949b72efba38942738518a64eeabbc75c78d8c2f0f2677889eb5a0acc5f43828abc3a3438e3067d3042056fba2ae45f7b6f66c2f4cc7d973c82889b1e01120d301bcecc6254fe99fb643d273d3fd0e0e0771947c10efe888da4dc968c67cf7f0be18833de636856d5691d0e32d7bc09ed1c5850381064f9143eaa9dfab835094f8673ead6cecf058856be46d275fa8ea32827e5e373cff58d29a080dabe3bb48d8e4bb7d4ba992278ab48b800f31a63a70434a447bef42f99c9997a01e9a547107dce20704351ba07738803ef55edd795316a1bb1965a1058046dca87b0b10bfd5485f412614f39f7a132dd397f581db486e69f9f2e81d52dba81016a988b4d9243ebfe1e17a44340f414c5d3d1c433b5c4af8629442841b283f5f7b21348808527d2ff67366ff6d31bb9dbb3c5f39478a0c4eb51d3bbdad309fbf79d231ea1564aa1388f017dec369ba95175def4c6493d24f5fa456b7d0d43dfd3ab7361c490122fa3f047fdeb1f4645cf200481923363aee19e9490bebbe8fddd80a4a228df9753e88e47857c6846ff0886588a8268c71509910db12e91c0a6ec4ab4fdb5936b45b05aa5004629931e67d5241d107280aed3d9d97f9ec66c5967d49001e766fe485f3abaf4e5419de7de427e300000000000000000d0ddd0500000000e286346dc71e82eb19c12ab8da1d90e189d77f97a085762a0e7d8f9768e0d0b02565e862677c3746cd40bedb21fc48ff43f2ee7f936964d71a4eae8f5ac0cd65fe1d03ce7762c4be008d02575db37d6f11cc6e910f78b88b92033e790679c6da00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa71e6dbf36bc121aed97fea1e06d0b24ee5e196a520e2d7d5478f7716ce1087cb5e11c452071a0da8b69e0348ad6fb30599dc93429dfbf0367d7b2f20f1412b6e757abfc15e474d6e92c665fc858d4ea2f96c655fb01a60301909f79d4df402f41edd29625524d1077dd6fe747245fb317334aa4a5dbcf7fd742b51e3ad1ba10305a0040c2b2b7f882c4fdd7a6837443dd393a7e3f917d52912b16fd7bb7b022e03133b6f9b3caff7801259b1e301142d66ead7ee76b51997f7c61a9ffa3c7d5f3c0b025d01d968326a4c372fe203ff49c6712df2699476907de64fd58818cd30a8552b2efaf9f87f6152cc1ed90eb45d7291a77c2ba7fc1794b1110684db7efc06e80325c46c9c14fb8a085d8459546a48153e77e526172e3bacde2108836fd6bd452f03070a2d2b715af4a2ac44d5884ea94b0700c281fcff7086e80ae53163d5a67f510301a80d97d01d48866021becd32a354c15c64102ee39a1a989e445583878ed1ac021808091ba0935feb426bc34a96edc5b2721204ece1cb3bc928da774a507aa8df021541408c01171505237d1629fbf3c62fde8651be2bdb0af127680aa4324a8e025114080a831b7c99720ca3b1de59e4f1a2275aa3d892a0698f616595a0619cb7df692cd097a16b3903799b082c9b24c242ae913707e5bbea7b5459cb77f7f0e807bde9898fabc7a84fdd4de6d08e1da86b579f28609314e52919a271950d59a61a72cd59ced404350f39dee3a9d0e7260013ca05f750a749056f711489b4588083b50a16da74fefd895ffd67cbd4db718b577c9441902f85507f4a3f41fc9c25e6d4a182391c63d676554fc7d5daa3bca2ce6ee8be9f647ebd02ee506958e59a4e3e65867080ae14099489bf5f56657087720f6920294767e1df51340c9b64a09a06f6bcce6f15e09ffae09a0476e5f633637ebe4550d46a6e26bb60549971026485d82a6d9b7d722f1d06d9e0761810100bcc3435418d733f0291895eb339457b3a1660b0471a9f73113dbb9c2e4b3acb2740cdd104ab00c481a1746adeb8007dde843f0a3bf668ce60dd5bb915767264e3e05e50df7f466212f5297ed25642bea55aad8521fb9e24018599794f58d9f91894240ad8b3a4320783a24ec38e9ecfc4b5c3585a68a219bdcc76b3a8da707ca6a646e3ea4bd6ec12dbff379db360719d7def305433adfd94126daa6dc4e2275477dd212e0e819a3719bbfa6426b8fcb635d103b3cc1d75d718dce16d62092b18d79e6275f9d3bd9c0950c9d81f618e47533bd4977a27d29182117be3f3e2d99cbe66177b456cef74ee305912004562a16b633b45d0a47f52a06791f0626c33115bdc6d504d13f26aa88901c050c646322b6e64732a9e60376ee687e1177ede9dc4994e5a12a688cfe98cca7d0abdd2dc55b0b40f5f0fc41b67f029597606330d183a378c936db4ac79b2f24363bf536939c40229e7bea308012862712e941246ddd0d1a3db786162fb5cace15903846dc852f13e188c468ae6527164ab2fe497753b433bc818f83899fada5cbcab7bb4d83bbe927e53444f0022cbbeb7186511b9a85cfb9be093b5a68e24dd69825c1f9f7a60c4c7b3496b328733c20165a431359b46a451f24dc352f4397c2ba2c72368ef5d656e5f2c3e06be9031ed1998837c680cd010b18227a57639e617f308750103ba91f1052c8fd0c9290163ff65d0a4a57def65d92f93eca686e4bb49a595b9d66239cfa17d96cbb2944adfdb7aa7e17c4495fa9deaacfa055c5883039e9a0efae4328330eeda75d5db63ef2abf6f86d7074d69a40c4592c8e87f887e9ed20acbbf7a5fbb50889dee431cabb85bef62c3b7a4a1385e1f23443d7331dbf5de1e27772f9efd64e80f5688ca36aefc3a6519410667dbb0a36c20e8777db06d362bfb8bd6e1efc7178139119e9d9a7491519ca3373780a73026a4723fa2f6485842258b99b72c5f1f1b11fde33ad23424c9d80960b713e3d1808c021f069f1bb5a13ba86b964ce674ef15741c8c4e05dfe37fb97645e1a71865d61b75b7df2a223f6eb7ee5eeed1961b9cb33f21ab08d6fe2064983667ca491100bf62834fa427f8dbaa2ebd42c669192d1b846517416c2b815d475b93e25febe02830bac4dd9daeb9ea9cd15b2b1290c1c11591b3f42c5466bd3e03265d3abc4460637a64f07cd9302c15ad5c84420cdb97758dd18dabd02aaaabe96db0b72a476cde9a1730db7256356ef75f3bbaf0b860104d3fa8cd99d3bddab54acac4587aa292687973d4e0aee897e16e2c0f2f320d6800550fee0000000000000000d9dc130000000000b4f8f36c3bcf2d9b28de7cecc2a932b032f400dcd795c99ef9b8e131fd381e91ab74858929812bcace65f41965b366452bba920e575b43a699791afbc7a11531ea5cbf2a069bdcfa73e6f2e608eda0229f649a24f3f167e8c018e987f0cb51f8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d33ef13679dfad84a0df8fdb000cc386d6c9ccb883053fadca921660319769d1ac71fb0c32d8effb2e21d365c43fc5a42d180a557d766aca61f8e8299d4bbb0ab186547a8b72e3b937bdab6cdcb49125458e6c619a962606d9353417b3385b1e060d1d8f00f813f0a1d6acd4f90b5999090b06a92994cb24e022f6fffb8d0d2032c40b59458b86725ce7cd93ea3bcb428d5103f0e7737646ef6141d37d7050e870322dd27691c8477a23ef8030788173ae3b3178e5361652bc17a925a71d6f282780a0437f19807d86119c04bee8786076a990f65eec7e4037588829a6334f8fe960869cb4f4841a74aa5a7c913204f25c2a15259ec41ff887ceba152cdccf6b7f3b903272e810f64e17f58b919e4fad78ae2763b3a7da55d94bcee0769638737ab7d4c0325c4b890ec97c803cdd54e13acbbf7c983f5e1633cc8d8b94dba1230b0deb144020c2e400967eaa18f9c344cb42b0609aa24a0b9b16f04f7c43a07b0d32a6478dd022fd2dbb33f0eca2772691d4bd72ab0160bbf70ecaa3b94c05485c10153e0f6cb032cc485184d95e331583c1208e4f4e25109d5c1f020c66e806026cf59e0a4272a16123974ce9e79bdbc57c51d41ee873921b578945da8c35cb99ae9835aa7258555d0450091d16105b00520056d3e7de27138da020b35677000c40053d4438fa3dcc820791535179dfd733242c82e0bd4b844f5cc5114ac732139df1346041b9463ef1e7ba2a57d8d700fcf97635326d9819518c4816dc675fd1533581eef1710e20c5971d06c3f33f3b8cc011638b5708f70c3db2a7f4a6ba20e2a62726ed4b98f3685fd02df18735c90a20163d2987212ec4316461552468039a81f9baaf66b64d0d5e5f5a3869a9036f2d9215c8617fb8907b09f61a46d5e89d9607e56304775b7c54b9b5b3baa124ad3ed43a9739b9425f588879eb6694f4108e414055fbf0c5548913d7e37387603ce9a158a57f2cddd0dad00b3d39b5b6fc9866fb214c3aa7dce167d61b1578e7a232a2de00deb3211ee9e2c7b442d49b4bf6ae1619c9db40e7c128461710f9afaadfae8b0285876156a32cc8b465385fc17973a0e83113b35637a0926db283de446bb3672016466d7f4ed9af667708c5bcc4756a05e145edba14176c431fabbacaa72d5cfac26f5f6bfe9f3ad840d79feea2053297dc0a471d239946d7ba7e9f1941837785c8c72d5a3ffb4e6285048ccdc0d3c6e6646284e35d8e4def584cc450d511b4bbe784b1df9e2f5f0f8dfaa01a4f14789236f4842fad5bd16ccf790186c6b1d1d694b65da93d12c9ab36a9b5ad808e8676a6f7731e92fc42b88074b1448fd654cbdabc5a3a5c4cc83ad0e623f640a9ac776d3b3151c9e589594d7ff9facca20f6eac3e8e9c5b39995f2b1f1ce25a97f7a2d45d95a67337f59d8b7e6f4a8d8388d6b001a94c382d67c2955eb84d79aa37e06aa8001c374dac1d565b8f3742bde817f48e978542b61698f8a42e7d0308c2942c094e5a16c48d0e363405ab2294f376f0ef456868650e30170897e271a49079530b9616afceae2d75bff96dd1ce0c78ef1b683bd1f9645c0f8c8e2150b7f15e0149a239290b0560b201c5e9d9ea4280d49ea6aa3d8c4489ec2f4a34628019b049ca4b0ff61217095fda068b9b762983ad81d085d54318edf06a94c266a0006fe84ef9f73de9289e709ba9c707ab2689a8aa6fd2954225254161d4e9d87b48e28b6d06dbf791714221c45adb764c12beccff4e65fb698a81cc7eca76a3094e255ca6a4f694d7ca829762481f4a2e0f32f0a7da9489509fe0ffa2f8d3c665f3d3c13ddfe916a0e771ff71508699a5a4c8a9a9b9cc062619f2e9a4fe72a7fd354da8b4e673bfe768358c49f00149376b7b99570955dd4f1c3c692dbd6875c5ace171ad90b40a96b4917164cfc36db7f172e44fea51f849becd5aca543dea71908030dbb13e218c2cb18e0ab6471ce99703c43ae1ba9535d899527acfdc3c578fbdf7fb0ca3b00ca6ee228dad09827d49f7ceaccca8155210d1af20de4895e91925b2e4d080c2ad603e8cfeabf4c7a1350a11bd00eed02ba252c8a78402a0fd4e391dd95c264c5785f4098ce5a16b20dd7f47b300413be509a5760d7e2bd533bd09b65bd577ab1496fd8b356f1bed8c40ca428fabd3140c840266f709007e3bfb3e081caa964476bbd07a2cb6a9240e7d1e0138b523ab0e3386478ea4ddff5fd15685d8349acc9f1710c521ea18950273896e64b66f613242f1006833db06098deca16b8790269e3a4a9c21ade5f2c893e1eab911467aefb634c398060d43f54447293b71dd5ca585be4e31b504cb15ce62b72a98e53174f9399929671947319ab6cd839dd9aeb4f5d59327f2d90b0767667002c605162ba1454573545c846972d9dbfd01b1001d9ba1c92358ce915ab2163d1a401", "6a006a", 2, 1648714773, 1537743641, "28d638e2dadff8ba76e695146cb193c60dc606e98bbc26ee25c4132bb05f7665"], + ["030000807082c403022b0f1c1ffd3ff2480603cb63740bf22ba2ece002e2c2c47ad74694d7b04dff9f0200000009655165ac526a0000acffffffff43830b264c82a1d9c555291ee8edb93c5e95c2db4817e915f81016a1b2f5a5da000000000152ffffffff03cd1ccb0200000000036a5251eb33050200000000016ac05d5a0200000000056300636a0048ff599d0000000002524e2700000000000000000000000000008cdad9f8ff621867cff84644d0b04d1fa69660c97a120c0e3075fc415229c400e5ed9f476534192a8c0294ef87058a21a9e2d4565bb9c1695cde590f1483717d279ca630d1632327275da20c2ac49cadf0fb6ab06ea0d15fe5dbe97dc9badc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e49b4f086af296808c233baa3a15b474ec6307db0103462941ed0e3f64a960b16672a11c4eac41c0d8fb3d04a15ae02f932e1101b4e146a1d0399b2fb7765544206cd4047e70f4d35d96e1ad26233293c73e0e7f2b3dfd22c1a9c466a798ad16f9173f4a5ea4f4276b8658882b0873253dcc4d1c266574c7e02a82d690165e8022800a3d28d114d7eb3dbc5fb38a742eb9e9b5d004c8fe7b8f6965c0dd9e2b25202174582af9b7be6d238a84170a24ad5dfd7ffd6124b43fdb21cd534aaa2fc78590a04d5c23feabeb7a62313b5a6fb11886d93397c5cd33d0560627c7db2bea2edfe682298bec63a1ea67798c464e57db9691aa3e84b327046339f16b5231561da6b021882d995d185b80d9373ffa90a6868a197a1185b1358c48e85944b40b09d06730205c0639aac81d7a9077df36375a7d7cbb6f92280b288960934cd141c16cec7a003228905fdc8c52b4459474e0def0cf5ae10484dd61d9e6b29ebfb6c46964e2b7c031948046d392577350c6e105d80842d91423dca738c4ba7ee8d97b7e5bdbf7196032b7a54a1e4830521d4f49ac590e05cb858125fda7dde22f58b5460122babcfd9160348e21edfaad829df9889986dd7d6a227054e2e9c9fbd182ee0aea4e3c7da750c09ba8de8b9c5a696e581b3a0f91b36dba6b6bd708446cdfb5ebda1ac9d99c5e251849ea0c55e1890e539bab0881ef2a1e82335bf8739d9f6538c6e98223fdc656807e4229a74aa3387676f3b76a97de09bd4dfbd9ad66283d5d6719ef72368eeaf2b6c7c79a38d2d23487855f90f8c92c0719453b0e289da93292eaf869cc70499710b1b3410d75b4e6624d1211a622d6e75215ee303b2607105e5e80f05898ab84614ce91b7b715c319c112d381a55b59696f308353c851540d6e43abe06f8257f23a2f3ea247a20df7c058f3a1f9863c2f38349f316de9e80e18db4781f944d22c3038135b420d956b290b19a601ca97f9a78f1bbd0b66d3e5df7fd502e2c0e510a8e9975727050b563ca807c013d2acb65c89e74a17220021dcad878c5382ed3b12329f72586edb770d0615a0e6438513e72bded9f01cbfc957216c20d7f3cf9ed21a80b1a1b858a71ec1604d791747da94cd539e4bc7d5894232bb81105795c534e1d0e46740c99685d511db3cfafde6333dea8d7b0eec2ac0448e9d73c92790dde6ddabfa5d87aef8a4d797cbf0f6ea61c99b617a6190887f6999ea4d93387d66b8f2558d73ecb463db33484b6771210af2b585fbb085f034b0cf29638c7e2078cedcdc8449fa4ea9ea7e04045044fd4b311a12a1fb49717df8f1f4f727f80bf55c3d3ce24e87345dbdaf6256363d47d117ab429653a277f619c897b843abdf382ba95ea0988c4a1c0269959e3443be8bd87f85b83e7c2d447d9bff2ae08ebebb1602a0f1c6157689f456741396dc3882d5fa24cea3379256c2d6bc6c65d82b0458352a51e4341424129545fe8cd649166ee505fc30f00726ed239b5529c916befe4dcfd4622bfa6d8d8f78b40e68ac146076b04f7dd9ba0f1c3a15b901c6e35621e1e2c95a86d6d96494ea4efc5717ce107d72c3cd7920ec6903f2d5b133b5f86a9d0a93949d697b146d666cf8670e689842d74a8aae5f8deb1a5fb8af7182f0e64085cb1bb2b2e0ca80a861a61c1b5896806f56d10fc2292d927a74feb5791ff3999ce80b90134046f50c16ef7620a41c5b4aa69c647422528459e3f0eb0d8d937c8553054d7a13f5911bc8da431e728d911f4c14410882310881901029a9ee76a79eafd4dd9baf9522d6399d94eaa7eb5edbfab4e02bbf2437db958f7a0c1255b50796ed295fc648a004ca513e26222929682a1949f876c1a2395745c0e89c86803531f2fbe7048d83a87548107573e5312495756eeeb878a7ad86844839b074fa57dfa1a8690600205a09fade82b328af38e10007858065c013d3b7b7a8ab0d6c5f1dbf2bb16ab843019b59100bd4668c2b490eafe04609bdee398872c9f175fb24eb6cf9471f816d730ef55befc40e80ca7ab759a46745046070894cd59df167d2d9a094f16338f95c9c8d13bbfa867bce672b0f8fe0e46b0c81011d694422254a666760a9449d74623d9bf95d011247d791daa58419e06595c71958b45c8a64dbcf7d625f2df11fff2f8b6ac5684b72dbca18b91dc513a5a3899039c570ea0d805063491794ec235358b3a58dff8570d457497be735cb2d1aa43679d86aa120fd7e3605a6b36275e2a8d3a6de3134feb674c274b81b68ba756376bb5c8eb0d339495328245038688e08ac6290b301000000000000000000000000862d84e74f8a4081601b0913075c6a255fd1d25b82574fbf21d1cccc54694486228a0149d28d0ac2b479fef2c75fd57c07bcd00c02dbb6698d40cdaa048c8b4b8bc5d2f42ba6f3e1d1313cd410367c80eb0003db0941cafe5dff4b867ec9f2b20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084a1c79420b8609fbe7e130c602829eaf05ef7a8892b73ccd687180ee85c0670b3c1489a0a14dfb7594583394befa075be86db1efd6832ebdf4b77f84513c1a34d12ae6529a5c1c1d88d7bf159c8c7095e30e3eddb67303e0033628bb023bca790144a9496a6332838ca376a8a96aa056248b3fe6501485f3419e1624e575213020611b31e42873cdb1ee6dd7892c655694830e8454dddfa9d657dae6cb28fe99603203436fa84226007fb599fb9ee7c2d0c879fbeb2a549832ed57509722023af370b012448b56125b18bf200c69c353d2327178f0a953afe776eb7a7a01d1b81e95ecb402232dff83839243c57f222f028fe54f87d68d79350230b92eab1fe804c2a0204a08155c81e81e1956f645faddf9350b2925b0e99ff7d335e56597f199b3b7e0207a33472ecb89042353a746122d628c0dab1159e320543836a044b8ec3867ae5022a8c37ad688d1285c8d549ad4bce2936f0977a2152a233daedd5c3ceae7ef9a30203f0dcbaeb5d4459816854b572b730163534c6604810ee193091740ac66f8d32030062e5bb22bd7008477459ec00622f3fe17ef98e3582b01fb61fc286617d8da4e60001acd44cf0189ec7011927c4f07e324e76dbfe87f8a78f7948b4b002ef530d1d96321434f275bdce16ebffed78fe4cacaa29bf6bb0f561eff05635aa355a1057f52e5786e62b902083b9839fb5107c62b12438260d29eec91dea90d18731f146ae1d21c74778ea472b2c821c1f1230132a880e141ab95ca33a340e6086b549c3a4730fbe820ab536a62b08526fd2e11b44581a37b55648719b444bace18fded89d9f1e97949a72abdb42ac60d58662237b2710ba197c42a567d5c657f21ca5eae9bbbf00688449c3fe81388236ca17a9c94a08a8d50e72c357d8f8cd7c551218e4972dad3bcea8bef7a09a98c6bbcbe7760e636f47f2a3f34553c1bf6d8bed053d0a2cd5a29a3c886f8cbde4d6c0b3d8ae026186e33f3f19a29be0432444ba4decf02c292b4055bae23306b5a6ff21e0e039b711125839f4b4c7045a998c04eca1ccafe6650d437f08196552bb830dba4bd0f337230aa08389fe26a993458baa1d90de80e044483b2dd4d4b2b75f078d85b3dc43e50b2cd06f8042a84d1215d1086c856a9a682139f4dc59426d0e4541c9bff3c90fdfabd711ca9604aa00e52b0487f4ac7760b8eb2cff0d11d242923c503eee3d55c74884ecb97c898491dd3e96a8c295a3840682d567d5669f1958c99eaf5afddc55028f254d461b08b22feecdf4b33660edff2ad2395e7f7c880384d8c01880a5ff5a744bf825f9ea8390fabe31aab6dc5ba11029e105221bf2640285007d4b3730d92550aaec74eee476a2cff91c8817bf2b03558bc29c510efebab83381dc6746c7c4f9c76941430e5c6dccc771620b96d20d7a451c0a775cf69f0a9a385fd9041b17df0813197c99a2f407bc0f5d9d1214d2806d1d478bce6f36ed2e47dc6eb18ae9ce7cb4bdc1342342d87d56c2ff4c80fffd7d37b51cfb72fe303ca1f9386a34d60e7645dc92830094e451c5998985c5f161836141367dffb2c35d4d0433266a7e46be64a79eb4ed311322658b8dac21098d5956f13dfea9eeef3951d594bee2c13aff85e8ef9785631cfbc09f02d506582c40d01aecae27d7509b4c72265407ab383b53f20ee96f54bb0ed98fe7053f07e613b4bd7743c30f49f5e27190858a339e3813bee6561d92fac3c483831d379d3051721eeb6f870c3a90bcc4a268910a3850988435ca5d84000006d87449623e17f229d02d46d759348f641da4b2e97e514a992c32028dfdd31e0d31307b90aa4c2668271dc3f23eaf1396bbe928c579c394c3533c9591db94c813985c9647a4f3193557df7a323b4289775316195915ef64a6f871aac705e23c5e428582321f8743008bf5c773bc1ff69a36c6eb0e01ed782badd036c15af1cf349cd4ff7a77a7cac1d155509b771e185676ac353406276930e5c6dd69f29b7224ddc866727c23b90f041bccf380f2122ef6b1f1bba74c7dd685cdf59636697a5d20d4dc7b08144ca9fc479d2d636280eb5bb765e1d71d10b58bdd6b16f84c90ad3932a48fe144c3694825cf78fcedbbe0501beb98fcb32859ba366f70fac8f39974534815dbf19d319c2375d44931414f0ab5a909789289fa2ec8feaef08ef4b0507a85a946c6c23f4d42ba895850f3dc3c5be179ac655a75350fe0f1cd0cff944f5490d65bb6bcd425633005f1c0601c7f966d738bf01b3cdb6ffec7bbb3f30b129643f12fde84169936870e50239342180d0a18a8d717472b57ae71b2a981139c0a97c74de97c08a0a2994c8ba9c5d8755eccf12404c1c973156b114d21097eac34e500c357d227886ccb984b7da76d9228a025d46a72c61a761dcf22d169a6e67a587d1a33971e2c455c4000", "", 1, 653125967, 0, "e78d98d242e84a7418120f000e7c3285b2ee7422a3b55023f653e94e4f58b765"], + ["030000807082c40303788c1860fa5f8f53b0036b9c4103772aee4be9512ef9091c6685b363f5caaeb2020000000753525252ac6a53ffffffff8830410b4001b5b62c96f7bb1f8c02301c2de9a93c90c1a185b89688b2ba89d501000000025253ffffffff9336aab55689bff61224db18a768dfa04a4899ec020f749987df81a047d6ae660100000005516a650052ffffffff0445a6ad000000000004ac5300517cfc660200000000085163516aac65ac00933b42000000000009656a00656a516a516332475502000000000853636a53ac516a53000000001d50bc51024bf34c05000000000000000000000000e134e252f6570669fc53fcf51d82d1ef95db146babed3fc71812c3133c1d003009f7e88af513cc4625923cb2bd4330549c69396270e31f0d34c447604a2ef29d727f5e1e451a923ee985ab4aa0817c98a177643aa13d78b91766846e397240b70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000053ae84f6c3bebc2758d36eba86e2841dfee9545d6a0b193d60ba5eef831d990d7841b34a89dad96805c4b74a495f168ccf25abd42282ba0b05a8f7e04b330fb87bd6faccadbdf257958b1cc4eec71403d18deb63cad3fcef36d98e4c3bda39249d49c5ea6a84ed25cc84df8953072d793aabe197a3b59b3040798033118e8bf6022a9c2e3c5664393e3c675fdb560893fc3e2db20808fb45f536f969a2b1f00cab021c4bbed4c44c0b598bf61b7db1324c8ae8448bc8d47129c6274ce6173f2847ad0b0060fed8198244e2663a18cf777d4d08d6aa1c1b118de85b21e03be66ae991277b489b1aca72b6e9db03e6c42ba47b2ecb34189c1e7c22789437527dce3523ff0208995e7b7cdae4fb8c1e1c24b843d83b662280a15460405c71399ec06e254a560324a311021c8b5c9b00cee0345659a0b889a49b4b52b6e82be533fbea55b1022c023028064a7e69a34a2dd8e7fefc30bdca7c3ec9284205a4ecf67939c6ed54d766030400ddd2140e3859fc08f635c89598241788ccb50f263350dd8010eeeb44f92002259689cb54eef4883d925e9e214d573f7e8472910ea95200cade8fc0b0e9d478720451efe162545ec9caa94dee1326864f5dd85da9202d63dd81eda18bcbf1b9c494033212c1d655fa8a4873b79793a2de3a979bf9a0819ca4ad1f61dfbb30b1aac2faf300f1d3a0cae44b89d3ddb9ff7998e6baee1052e96db6ec32c4b408d0150a2b835b6e919dff16084a249425d80088962e48f9065e42e82dca179cc06066f9f4673331b575127a214411fb234a451e9519db7c876410559e23d3ab76f9ffbc70daca062e4c222d655772e7438dbd95c979022e9d44c12db2ed4f68ca416d07218f0456aac78108edcd52c0a185e65a7f250eb81586449c68dea886bec586e444cd2467e1528f3c167897f9aec64537e204e02ff1a6fbf9792b3380e304c57c6c1754fefc1d1f69a0bf1d3d3760da31dc2a8e25684963770040d8561ddb4ae716fcc98dd4f02913275be8b162cb34be10bb6a5e9bedeec34ef3d753e90026ddb53a929392dbad4d72b81e73cb9b67412763a6e967c1bd49cc7a736bbd37ed73bd599c38f5954bacd2bc99ae8a0dc92b7b0eafbaf1edf1585bb57d544d8f1ebe1120f30b70f38808564082877904254589b7feb6ae2545d4afecb9de56b99c4367d99bdb0c96f49539df6c547a1085f9d3d0385eb9cd447f4359a7663512b9b65c4c77d0a8f84bf002fc3824ccb836a6fbb7a87b48e52dc2b14ff0000b8a59c7a5738247ab5ee4cdd8d41ca791da6f768e340e30f4bf09a03d1440cd27b3d03f01cf6accf05ef6cc254a1c47f1dce3ee7be3a531c0ff9b80044c7a7138f1629840e50724fb0e6ec01500dc24a070655fae52987298ddfb9c082372960bea6ef19c72a337443d6f12ddf16f724478e74d12519ad3b6153197327851ac6b962027beb8572b7689b5845795fc4666033d5003c08a31d8f494c49f034891e5f713e62d03ecaaf09983b874614ec422e226b743495cafcd189e22636393f103bec893e4fd575366e61abac625ce05bdb452509a071587aa2fd10c896726dc2eeedd0d2aebeb8bc9d6ea23313aefbe737a00a10c7a12cc3ef80bf7fdd44b3fb870d49ad3abe62090572936264ff4136432ee2b9ebdcd53b4c3356638e8237c546c88b0447b688b2b80bc425a319ae0e17e4cf1bea7896bc6cc8474ca2c6a36ad6559e09e0d01a9c00eabbb68e5088b57763d5b10df50b5b5687f723892213147e0d68a037c097ac953e1148f9ed88e6a82a22be3259ab535dbd823a9ed947e1d00582a433dddfa1eb351baf9e3a4fbccfb8b4efe5e77f693ac868be4827e7feef5f0c4b3350ea423806cf5e8e82f156a45e8d3def6ddfda24b6d80d11d8c0048e63146d37a94a6cff8dad0a9d58a8d56af93a4b4b2274983dedadcac62410620907db0a5b7301c8cf5e9333059ee34c51f34fea5c6c8ea8f102256e36347cdb5627cac10da7d9c199f01576162146ad34a4eb19f45e2d13e7a61c8a21434afedf1b1b1b288d6bc0cfd09b181c50459d3943ccf6f70f4ebac632934f8edb5d6d85f10904b4c9c39bc508d5a31a7139300c8671134dc544440a3ae5eabeac84589c61fdfa4da9f7fe3063d3a13809d9b20aa7eeae73f1b2372ced63a31cfdeeab1caf2cc3b1640017cec2333700368ed63eff5c20984075ea66864c8b9c8915c8e9b096cafe5c1d6c003d3ed3cefbbf081796a016c35be4c337f74bbd1a9b2357b73aa68912a2a11bc21f0126be8ff5d91a936b130d0c0040000000000000000000000007f6bf55852d01ef797fe76d3f7516f248806d424f7b01a088d9056880e8776ab72001b7016552e43bbbc78624b1630df530cc08103b88d94a80cc6f41a486a0727b03facc1896c41290b0896b56c8686878ce9c483b348876830dabe39346b2900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bd22f68cf226b3d53a0a376575965ab20d1a8dad94ffbefb58929bdab3d436610ec871e60479ae062896c5a608bca61d51dc507ceff527541e6b3be6171d8e1ff6ace4868f7aca1d3584e96789e3ef38a58c4a7508c65d3d60bdd50899d24eb8b333b5445a733fe360c3d2674ad6bc44e2766268dd7cc1262e7c3263146a5ff4031729f1508981a250eaee238bece18505c601634637d14f49f9a05e30d15021ca02055d0be07dea28f3591c6bacc2e3bb6692fcc0f4b69b3d6d40363547a319799d0a05ded9eabcb54cefa753f50c8f8b4d98563b994ff6661583979b818841dc73840ada82e600968dba1c1578784c4a5f063162033574891021b1ab6fed7ee2a90b022075fbac12aaa5d26d8eb7d5864794b69dde3293eff4edc52689e109cc3103a7020929eeb083273b1c0985bde70bd9bfba730a4c4b7b0415f7c7a37db5868e34900314bc92731c28e6d38931b3243b90d36c74a2d70a333e970a03639d56ad4797da0228141e1d7b6756e9c5a0b19d69811be4fdf9fe729925ca49a11fb03096ef0eca020e11bb498831a18f36cdae814f95f87ca6d0ba66fb85d540e83715e998572c0c29f1181d217e32f7ad4d74691d288cf3c0e18faf78cc9e203e01604cbe2d6873191cdb12b3fddfd0ca1f393a156d8a3193ea5ab92b0f9944334bb7ddf495fe1d2f26afe71886c1193b78b62aaa12623c1d598d98ecf0cf060a3744ce46db3f4215cd1572b2b3c22c61aaef169f7ea03f52b76a798c203bd587f237844fbbab07de4bb8da148d81f32d7bb504f8fe4ea66cfe2a4a384f64b4e338a0eca9fdab048278db6eb40b1908756c41ad70c1bb759afdeb51597805dc2709d6d2b95e66f4343ce17d2e638edf9577dabeb7f0295557e316e1e086af3de1531b072fab9e22b607f26b13d7c0d5031894823a7afabefd1ad0d65998341ef632847ab1fbb8ee0b1802d77e5ff4ece994c9bcabcc462efbe58c774910058e6ccbc2580de371676e3a8ebb128677cd437bdb95583c16deaec43b5198858340f29709b8a7aff337d93fb33965af1296c95c605f2166faf9776513c1a701fb12e405f793eacd53ad96d7e2cd9f4d6af11b11bff671e48919176bddf19ebaa7f21ba3688d646c41d05330ccd95fc433dfb9c66996d496050124515079ead308bccf16d761b489714eaa50b82e6e5ae9ccc11571e365fd01cb12251bbf7f8f73a9119228082c14fcc1fc05bb6c6f44a9d400fd2e266d59254e446b0343f934b4edef7821dfa527c6d6c7bd96249c77ebdffcd07ca01f179585346f2e13a063373f1a857615e31844bdc0ad60dd90f48a7dddf73bedab58fafe48b95e766e04c19bac3552378930c9bd86cee5df175980452f67b2daa471b8a97296063d0fed81da84c209c648ff123aee152a1eebcd5845553ebd99782ee1a6090abb50bccd337a9078c6f0c056b7776ed6603c494313b09f1bf7283e1b677a6d0061b7783e9a2a8520ec7cf850d9fb9f6a107f2bfa9e27852cb95e68a6158af22b0757eaa3a98627a6b999c841690e68f9e8bb7925da1aa13b1ec93fdd2f5130fd77cc40205606f788c4185035ef4246ce595070aa681b6a692488b42339ce49899da5c61bc81bb37c54e29c3ddde7f05032ec75d2bdbd3f9d7fe72bdfab9be53ab6582008668796941d1b6fb92eecbb6ce3623abc8cbf143ba5ffa025d5706664e044647e84db33c5fe86e9974a608a193bf546a38fca1de582aa5b04ca006e321404b31d04f23ea86f42c51976838663f3c9e998b0643106e236ddbe375fd5573f24ae984d0ee2be53a59737265b517d966f4463a2cfb29449268a5eed3abf8e70f9d4ed372e535abce072643d2c12b24fc5fdd2b82f79c17e943769ffa7a7afac5e26d8855d660630c5869a8ad4a910cb97940b514da7e651e9405ce4eb7818053b8ae5120649459f3979e2cf185d3e568cb391278b72ae3a5b12a4040078356873f3d5b900efda29cd788b834c749ae618fd92d41412903cfdd04b5959addd6982496f30cbb533dabf156a4370a7c95a64b3a6f95ed35e2afb3c777ad2b9ca28013587cb0d62316983dd7db9a5488b85f2da0de96b442a77c630335f776cf422c6432e3a9ec85d8ea73de420d7242e602e5bc7b4f9714b0214986bd903290eef81b1e56cf61b81c825f85f6761a7d8674cf37cec664305db534737d56af6ed4fb939bc63202a72158e7a89b378c8337b9fee7e153a0ce8012442f9376977e003e05bc73db24f063bdc23c332aed4214753fdc1f93ea2773ad471bfa7ce1c68b5c8aa722bf4eefe894cd7f64d8677211e9e14eb191eeb6e3664a5f07532ee999ad30177dc3920a6f083a07c6ae9e0c459a576cd291d1ea742264d62e4d8d70a61f97e565462c94f65a4fde57c829072a82903c3c518c6b156bdaf56d761d30c", "63526500ac6aac516a", 0, 1511899, 0, "a07a69f8edadcc661341f1ee75d3c83cf3d2bf30a98bb8c73cafe6b3d369f829"], + ["f170a07d0431d226b2440bba72fad8202c1b377526e1345ebac6b3001ffeb68673d1f515e5020000000853636352acac6a53ffffffff72f88fb45a7e4ab87210066bc1503920cfc1ef029e9730c97f2a905a8e1ebf140300000005acac53530036adb9973e0f2ea2f2ab4305ed556fbf913a15a6114ecbbe193f3b5e45992061d102a58a000000000553ac0065636d98c774d50e613b55333f1e00036cbc992ba6a5543dec54432ac74f8af70735938b644600000000026551ffffffff0100d4f40200000000046300536500000000030000000000000000c606cd00000000007803b8c5057302eefcf3b56f991118cecd01cad09634b5a362d986e877c8539ebd35d74acf407cede6377b373505bb823c4436d40f04e23c26f4d20259791b34b6d6612042448ba7bceb1bfce620358bd80296ba99bd3ffee6191937e493b51e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8d0265ea33cd25ec626c7e7f5a93bec77f5b9e97d88a886d440606606126ade51a5a1abcd5617aa3746236ac4bee48394fe848837bd1769f61cc2be1c08ab414ce538c34c718d51d632ff1ed04d90bb9d1c7ec84918e1c559b8f34aefa48749ff5c4d893b59ec16317d6eba04300f811bf52035b575f2eaca3c5459562015cc0203ebe4b6d8f121db9685986aa7dd7b0dbb99ae9a9f340d9a27d681be490fbb5c022fdfeae944e803bea31e1bf14ff18ef8ec151defbb47dbda12dcd273baf0b3fd0a087b675c4406dd5924aaf791d0a359f267f66f5a9756a280b7c2a271e5e2ad05b04ba596696401a82377f33e03b4e84c08676769be4b17e3a7c1c4b13345593503160f37f5ee5da861616c7ee82f79aa5d6de0f88662b7c6d2442bd51ea34f055b021c1cdf938b76f078c190a50b896f070b070372daf3ab93353d9484b84bfacc560204686778759403acf9e3f2d72395d9e37b78f3a6ac1b356ec3b45661b5eabed1030867bb523c167d2433b4508fb3ee27e1313978046a65b1535cc96aceac602afa0328daaa793e98cec9ffcb287eb3c711ac27bb3fd32271823c2f82079b4ff0748d87c6de6fd1b702084a62ba31800c8c4a3dd4d11125d408cca1da074f275807fa45170094083e750b5626e245fa61b6fde3c24e6c8e11dd4b53670f169a63cda1c452709a2b7edc5f5c33ce0f1ccd40af8e7dd8028f39ffb270f256ae4b93e6953c0aedce0002da341e97b31934c4c6af6692ca28c5d3ac6dc00bd2aa77d9d9e1945d40de13ea203cd399d8269b823b4f83b88e686dc6299d4d1d456a8b1de437351ae53c1ff093697151c4c09f20e2987c23cf2622c82ccc3699e66378037c08a6b5da2231f89fa649f7f57e4cc8e573214a0ebb409e79bc86a98a3f7d44699f9046e7222e75e2ff998ce2560cf3f8431f61b678c1e705048a6b0ecb0ff57676595b670d0a4a8471ccd892929d12d174825ae3efd88426534c2d189bdd960a986d98191df6c18ee80d09f9050dbc4edb1639e9f8f4509512c97747b5dfc74976b2480a605f2315c3b14d107604f6c412cf277286f54520208fc0471a1715e055c8f0b2d3b4dbb85823c81fbcc44cf278e5520002086ce3bc0862806668e6c7ab5d44343982eb4f0feafb0067cf4cd196d058bce4cbdaad0ba863cb3cdd44cd990ba732fbfc4c477f00f38a749bb783d024728ecda8c4de21ea7d1b5a902971f0d09275320ecc2fb19d6bd9b6139e6c3525ac87f55b53965147dc7a3ec678b8689d55b8dafddf75576580d90439a3ebd569af8c0d6ba5fec069906066fc8f538e19d0892d47b2fc2b126ab397958aca4ea1949b0bf06766344bf661ae96b5b5e676d076fba17444b4a192d08a2c01d2fea1e4fdb5e1dd6a7ec79d72d6540dae052315531ac87de8acf394dfc168152283ed9591807e63b1acd1f8554ce30a545e62d82102fa48bc636930d8d4d46db2af942bf48c7316d3ea0af4ba9cf369fabc8959c5f474c9d9c23a4adda2352071c45476f52b6cd90054e9f426a10c7a02c0f0c4ceb3eaa5664bd3cf0b28bb8530b14781dfa055ea81d8e6c0658fd386afb44b2191400f30322264cb999b08e5fb2cdabe2fc4c414f5e3a16729bf908ab28d353b5e070701d149b5785f5471083b733160279409ecdab3880fae86e92d95b674eb68044b3994cc2b2d116898bcb792b7c5737f3eabcb753046ab744ac25699d61045fec23be1fb097b85698b883781f6624ea63401aad0e56474b7e1c108c9cccc88a759979f6e1604450e73636334526bd7b2536684ed9e7048f5388358e535b7293dd5c3b56d2dd4f721eecbf5ae7c6854890e1f13d1bc8a9692478a1d88fb6ed7e723ed41a2a7fd7a7d76d1659a672922508e8272d6122e9f43e70a89917311cd8b6abf780ab9eb782eccfe16fc4cc62a4dd1e508c3e7f277decea6e92d2675fac76352007729fd37f1ff9061789cf8c2f3ec455054226a84d5185bca3ec968936a9a6e1619d211f913daf72c773106f5864c07bbb466cb5f0652cfe13836c48d8564dd7fa6b9f487bda6f1a89305ee413af7d80cd3564b013950fe09d1bdf401ce6b5f6589bee74fb1e5b35ccee91405eaa655ee21601e0836e8cd34e253773344bb86ed230d6b0df060eddc85431c439d7bcb435e1a51a0659281dbc56440a31c7ef33d4e37b30a1e0637a30935a1f94d182923ab9f1447f5b6fde40c5b0c9e40e2d593a82abbab90369118c3b2ee1177ec7ad15153eafeaa1208bbb0be085a52a9c995b002b32943bd5d929f19136fa71101000000000000000000000000ec19b939e58909b2dba5f5b2ccb386bf251e5096d0558c32388fb6707bf46dfe7885325717bfbdae08284b0d884eb97f6f6aade4566b0ce3947c1938004b00bbf81f6e397687b7c808595fb03ab41b734f0c4ee501961edb4af379a28b7009df00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb00a9627df576ed11e82d1d332d5118e28204511ea387217b9861c6612e124bc0179066c7099d7a7411a7782cc205c76e128a6b089ef6a1fdc9d352bfee950ebf898312fd1e027482aad68cf272f3db1db3f5bea3cd93c16f9958a9cf1d94ddaef0488f57b952108017ae2feaab8b45272f5df7c1f7fc916f35ae7ab663b6c20308d0efdb290d9394f6e7084de1604151f8f32a37f54a7a66ab9cfd99d46ef79703293ceb659c6d269a546b3fcb6012c37dbdb6e59055e2068780303992f8fab06d0a00041c88c23c94db3e31ca7b8c8ef614d909018b1e796ad11228a1e5e7fe696fc5ec33a2d1d6f61c91d3fe494fe5da2f0451ddb67d5f0713d61353efd6c49c9a021e551432b8c7f7f7fe6260a31bb8ff1afd9e6a3da6ccf9917257091e2a1003860221649dd84244822e1b3e865f4ac9d020c6c6d08e4ddc6414a2283c8afead0875021d0ecf79da7e0edd8bc668b4ad1bc7d20a1becbb87e3061c563026a0ce6744e403224f9a98cb8ea8aeadc723bc341ae910469dbe5cc2622864bfcbad3c16cf08190305a8697fd7d4272166aad7b20ce86fc1827423aa5efc9b51bb7e9e1f47666ddc90381dbd731017d86b4c804893ab8ab12f2d307089a903de773f660e3df8cf685eaaab1a4cfea314a3d992de1c0e0e33855bb1d9bbfa849665d03da965ef1c5d29e6940575e8eb5edfda6c3f25ff6912b38848d57cb3af758afaefbcbbd99508cba1c15bbb7827c8ab116e42f1b4205764021fd4d73b6a47cea2cd3daf369a6a6823e67a269541994ca16c385112fc28adf7cd2ec849eb1f526e0e48f69497f43a5da483d8a76c2d5b7c9cccef15d5af3cf62ac27baddb11e715d8c3c96d9c3b901225657d41dbce539db460535540f245904c7a23b5e89b92b8063d85de34f72bada49130e5079cace727bace4e8d0a3e4c5c4920d5dc14e399f85fefa600782b85c5f5a19fc116524f5310476497f59d495ed39bb0f4b3f95215df34abb9f2a29a8e674c2b27b5c57094e28dad40e17517820b766050307263aff5913cd1f4c910635ae287cbea5fe8dba08415622d84cdefabc1b8042381919b62a73920ef654237f2f5e4fa076cd80c92d72b1af4cc4224898aa84e43d30457f650e24153db1e30c728f30fda751d2935fdd20bed771020029efa84dd8bd980622fb12a8f509e1fa4f79119434162c17b94eb4c4ef6f4e74646cd9bee105b76ae8004133f03cc7e42428e4a92edfb3874d1980cb94dea6948f1523f31c5941cf5b7f2822277ec6100cd0707c0147341b8b29d4aba1e8f2eb0e101ce82a1974989451e29ee2202e3fe0758cb0e43a1eab1ca7329db98693006fcb4ff30a9fd35ea7577a530cf0821cd6ea5ad1d1cad350db4b5eafc59c57997c6dcbc47deb5c1efbad6a0505fa32dd20d8dabbf30a8f75d5402b5d3cab4495419c85cb0d30351ebcad690853e7af0ffa0c1a901b01b4f147b0f1d47527c0a7c70324776ca8aeef3a66977c9096c168a170bcbf7948e8cdad79b3a5026e81c1630a10511cc8c2c62cb0a67116d31932da82c16c34ea1982832dc6858f8534a6306bb79ff7007a628e2ecc25a9a79073f74b0c588c605fe15a8039fa6bcd01b185596ce3cc6641f603bb4b46ed18adf5060ec839086fc9dfb46ee669d422dbbacc38c03d72de5f2eb923364fc1eee584c845e2ddb62e8774f0bafeaf2ff1a096bd226ae6c38b3f822d40d2ab31663fc785f35e6e8f3d02dad97a3ac56f39b1231dc538b6103818d38bed19f7f7e69bdb22be6e5112354b9f82a99f76819a41d66ca8286152e881dc92669c5c011c9b03c09e0ce1a5d82c2990ca2e4def766db126c085f388a4fda45764de2a0e98047ad44581be4316d92dc9d978b222f40f298ad314b5183b8f1960d760d52bfb0255f621ab8dd7f762d473f4f9b7765e0bb1ae9ceffe0a8f0632e81bf7d08c513a4344b77a82876b0c9355e00f6ce0cec3c176f1f1f577a2c443e3105615bd853ba002f2460ece84ef65a66b38e4e49ac734be13db4098e8923e74cde0812272454c5e50424349fbc60676179bc0ec5c11279e802f398f07a742f9bff53832e97a77d097ed9da4d0a1b449a5e6d25d4e26af8845816cbc3786fab9298f6e05ff8727a08f0930437bfb0a08f4eb0294ca464cf64d64a3a968c5779d7e06ca497c0e2bbb5980108f3cecabe79c54d8b57d294eb6f90dbd5a10ece744bdf5cbc75db319ce2224e60d0a4997eb6c15de5b1cfbc7b8554b094b43b18a1e3a36502d2bcc1dd61aed8e29c287f7c693478f06d4e65d57d00000000000000000000000000d935ac0fdd552937c44e0b6d2856f52b7b5cdb785a766da775a42923839abc237c3a1efaa885da34a79e97f02985eb470e3f7d34273988d9f2a5c906c7c145b2f4d09676276f32651951ff32bb469ca5b7b613ed0a134125b6b3e8d05aeb43cc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d0ecd1dd3688eea3bc30c2ee90ea5b18cd401e289d7dae2e767d855b4f7bb5fe367d712ab721aa389375fdb73660e702740d8a75e68dde5153783c36055c9eaa1d8d0941eecef32192c6ce5fe580e43ef5239c0c17e606e6c2a824d527c429271e72ff4effaa7c8ab4511b6bee3e479f7f1fc76739737cff8c89901b4e32337030745a5700eb9d37a15ba38d1a89ddd46e2ed9a58a700cc10c765c9e9929db625020f9024310bba3de326fdd923e406d0f833d05eae1d932367db5409f0d04f21f30a07ab5c2b6293e2c8b07f222602d6b243be29be59aa0b9b28f7efcf962115c99b043c376ce580930d28033dd50058aed39dae2f347c19bc0a753b020ee4a7795c0203b40c0f27f9087ca3cac84623b66942c9e6aaa475b719aaf919a613372c221303212e65feb6987dbf252031060e158dc29a07c05dcff8296d3e9e39e0df7385bb0311bcb7731f79aead86b0d059e420028b3e589f4f043ac21c49503f6185f325c20303ebbc1c370c987e4dad16d4be919f1759c2fbd1e777c5b9747dd9ff423d8547021b5e33d42f99784046d9d52b0b7a90a9ec43bffbb36793f5892f2affe37a9c839e1d80c702538871aba0d680f7c2bf5fb858e7d4659dad7d998bd1d0548fd028324831b4545ba39513ca0bb0309dd1b3d3c242dd025e9c5a86fecd4e87749c4b6dd8f22ddc1ec9b09df4d8e9c305d7719848f0d590a7715353553b6710b24be7ce2477f5790d9f299d635821a776ba2f9d0e6744ee65279d6cb97cebcfd1cef1958ac88456d4b633a254d05117a4b594b28df1c154d3c99b62d069c4b98ee9c3df6346113a41f1c1590955189d1fc91480036a8e528ce637ff2fc7279eb7cec95dd6f2b8b6cb740e314eeb964f91413b095bc7284f54c973280037b3a7de812fec22b9c67b601cc673964bfc8df25c9d284d1253bd8e612876181bd92a60e4d35b33c8c3de214c86313fca96525e739aa8ed282bdf518048ff9ffb9702287f60c9d0974c5320f867b024f0825ae72f9391084b2f8d6b5922e9defc12a2802e8c2fcf18f666df16c28afbf061389087e8fe652c1054ac55acc296b0e1f0b6915af3553ef66fd46a6a6e93c815f89aaee6410ba82ab40262aa12e82cd8bb72094a84ed6f5c96b39f49b10a9ecd42f318b9c37253454ef3b3f72424348232d46e706c8dca462a9c3ed8476e2414f300fe64938ee3d91ce787031b897646abaca140d1f8be71c5bbf0717b92f5c909eb0cdb20295d9c795548f9d1ad0cb8ba7c16449ee18fbd6bc130b64d325502bfbf9930c00ae4f3492794fdf696c5c11cd152272c6f5ed2508dba165148b54245062ff3e3ac05656acefc14f2045456b63df5864433a99a01cd45725ed7df5f36b3fd7cf3bc850923c6ec24480227afdd0857f90baf78e72823000745b42c62a29b1881e62ddd4cc32f160b256696de7975197265eea49229b7befdf53afed12ebccb115459f437a79cf911a50e492a99d30e1b194bb7d8c5d749f36ead7b50cfd6cb4f5c73bb2ad3b57574e461e47bb742b9b0a84e19ea86f55170adf16bc866679502701a29983e449c8ea9f3c6b43d95a0b81e3a126616ef0e7547b2529aeae2e7eb8ac74391173f66dfc02abf0a591d3c459b849248fc20d774fceebe1badf58365931a8eb104f3b154392ef640ea4563136c432c0a7cf860a48d6a899b4f18106590738dd3a68b12c2b57a71f574d2ec49735778fdaadf43dc222a5d765728f3f0dd76be1e7a753794d050146784e1dd648c1941a67d7177eb7470b5664bf95b79a55df3fdc3731d248b2cffbf9b37f4e78ac5d60a348a9b124ef3df11d10609a30c0f763b34221dfb5866118a72e859e0ace49a32f66d10afba7cc20ce686a66bde3d68273f8ed38ce2895ae59a3f681adb015510a4616bd24cce3efe798b3a8a7f7ad29334658967292d13d8f5f1923da3d542ddb07ac104ba07fb87f7935740918db6410d8fbd725dd6623d670faba3e59f5e497fbd017689311ae127d91b0a244012bd06ce4f8678b6b4ad750fa6ca57946b1078e1b6f4f10f90d5e51bb6d560056dde3929598e7a98245525c0a9c71beaf3b9b03f32934aff3be15a48d1b67eb31d59b49c0f9be0c3ddf2e21bc15bd6392365ccdb8f81795b014f329cd8bca09226b6a2d9a9830f07adf3ad6981d59f6659db73e7acdbd578af157cc87fb8693666eb7321585a61e4d1706e7beef38800122995ca7ae42a13fe0eeb686a4a26789120626cd80d47701a9c00c80321e46ea2c055b62b82f75e5098c99db848d02466ce29b720c57c2e2fbf0f00f3d69a62af6aa13238731601193ed69ad9a485d18dfe8c821011e8e019d44d98a9a73a29f52ff94b9e83728205bbd8e8a96fba8897fbb14f270a6f10b191f37f96adfec74a7a9fdc98cb670d3029f97b0342460e", "0053ac65ac63656552", 0, -1773702360, 1537743641, "4e57f632f8103b20003a1d978ad94facb9b63838cf769d356fede42e1552dae8"], + ["030000807082c403011afc947aca17e7a64a88119e52b8d57baa96c62a37f1799054bed7c44c03d02503000000086a6a516565636aacffffffff01df46a2010000000007acac6500005253ad5ebb7d29bb70b100", "52", 0, 1970757565, 1537743641, "947c79058e8930799d6c8bda587175af7a7c71b8fa5331e6e85dbb47652398a2"], + ["ba1a4956049338ffd31825b75d96a98a9808feac81353128a76167786dae816065b773c4ed030000000763ac6365006a00fffffffff54fc30b27d19a6f155d15b37e8ad69532aa13804a5a4d8f7b4e86ce2e2d016502000000040053006ad5004eb694dfcad4cf61e04b05ed2e41ec7fed09220a4de09108f31cbfd05d20989fa696010000000752636353000065fffffffffadedab721ffd69e3d061141dc17550c6865cd38bdbbbfce12b4eb14b1b887a602000000010001095f63023ffeb80000000000056365515352f515ef0300000000036a6a526644524e00", "51526565ac6a52", 1, 2050582395, 0, "535b86d672bcb801a52e1ac11f9b95583ccbfd47eb2aaf1422380bd7875cb0e2"], + ["030000807082c40301b0257f6b93c5753b967864ba181423e30c538e7210cce9b54426f42c9c58e4e3030000000096e112ee0153e89e03000000000453655253ceac29ef57a47b3e010000000000000000049d4d0500000000f6cb8debf8ee63e7ad5720ea3d6c800d3cc88d86f64dea49b3c080c7d285344352107b9efed39b5664267a559b18c3026975e2b9a6e313b2abecfb22f3e219b9d5a0de910328e2b120de0c6e7b0ad20a05db5e0f0596099e3bb05efba061ba9900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a34baadd6aef0e2503c1f129d7f94aa1dae8cc22ef76031e1a162970ff199fc0171862f9ac0cdf77d31d79b242b0c5f71e77775436efaa8b46403785bc5cf8c2bdce74d20657b050cbb2708bc51edea7ec3042e0bfb5c56987cf3ac8541afb8b21614c3a3897f242f1cf446cbae4515f58088af64b223a723a8f5cf856b40c19030d05d03d75c0c5b99344b70290f262e32363f10cdcf9df3c2cb0227b94ef6b9a022a425b4181564c47b5789a4a93b55db3a1c40753d5f6c4d82966d2e2df627b5b0b08ff00aebe0b9397a05fab696b4be4649e269adb5e21f7e26968215a02be609aa3c6fcaba5aa109171560247de42e984d45a71deb4b97ca682f63a4fec166aa703080fa1a0488dce545fa66422249bbab6afd08a9a2ed593c56b709f8366e4c1640227521011fac67d27dd487547781ac1ea505e6b91f93a5261b65c33a33e8f705302253a864061715de158ca827c773c61ee626ea8563a5a8ecbf7e1696efa761ccf0215bccedaec348606a621995d4c79d974b6f26b88bcaea298137b6baf23ba040b03090977302f6ab706382a031120d953d24e9d8c023eabac1d39c819823c0177abd3bc928ddb750879c2c4dbdf795b81c9c87b448cf144c5dfdf0bde17178e239e21ddf01baef1fc15bed5b599ea9a0a55aa2b99dddfa1e908f89cee38f6eceaad94f2e6c8799b43c3addf70deec6117f625138706746e9dc84a7043820477402c6ed8cbdcaa8159a17f80cc258404759c5716977bc02baf42bf7c05d04065eea3fba519a39cf0419d7cf03408c1e900e2e2adb172a79bec0fee26988019aca22bab67a54e7452426459afb110f9d9842018d000f823b3b75cdff49299ae490ed9314ed6be28f172e106c96dfd9d3c973d7c8c29fae6c5e986beb14a26252c887effa71ddf0e933124f38b900e09ad0007eb8e8d4e4405e42a2127fd18d03ca5ca78a7abff40a367ba295dca840b277289ac6910712361663887d5654d405bd010695d55c86d33dacc186369cfc2a47ca9cf3cbcb1df7b47633ffe5c7b22e786ed98776797713ddab060d5cec992df8a1e39d9ceb4006a11c9a1560e7054f50ae20dd5361aca155bd9ca555f134285e35b48df492cb64c290c40e16123389352658caf4c4d8d3b6e1e62d5cf5ac1191f1e6bde400ea8bfe5369963e36aa140de162c3540b9eeca863eb43346d60f2d2b53b84f617abf1fcd160f0a46f318c34746a06077bc2f7884d5070b8e54816cd01b36697e36ceb7bae125f3bea63ee192ab0592de7122215eb7a802c8a470a1fc361b690dd4111ef9ef21bfcb257ce175c70315bc1b7deb474dc516a268da5977bc13acb4db478b240f913cd0e4445c715d13d772a3f0368058c302f331ad27d53c507e2a122f3f48b17b399585395fcd58804dbad447e39a71977df786dd6cb0e1e6949b19182f4a4cf1e9805ca07869730b6fc372e58bd3150aaae4a4ea344b36d714ae5da9a15e64b74c002dd1dac8899d3786d6004a5a22d953e715147318559b1f44574a706fb9e7c7f7bcec8065fe7f0e2d2d498f7a9ce445a9e5b5b8e863e9cd83caa42f4acc1c613abe4bf4806e8ca006a57cf8437551b47848ea1cb614d3accd8884d078e81bdf4f559f7efed468be8afd0a3d3f88c5ce8c70d9793b6ca0fae094819cfaccb783bea5cd41367db9ca11e1ebf8997ac8b8efda40388f0e01f5f37a253a600c178124cbffcb189c276947271bf9141204568acb52074d709eccbafaf73a87b1af585024ad7c39d1616a262cba440db78462959575255aeaad78785a1afa762c3c1982b7445c6dc1c1fd13765b1a3678149cd158fa312dac31317fe1414b845513dfb298fda4f9a8ce753e48e233aaa41c23d016a44cc2e1eccd03eb8b82afe7db3da0927bfa8b7552168a58145ccc393914c1309d6c72cd99ecb1000b9826548edee3d0870b265766672940f60490564feccada1163e9adc1c053843db6a95335cb766ce8b5ac98cc947804713b93cb96b5f29d7155c3ddebe1a22a5435e8e57c41149f37655b3ef431c70ce0ecc0a3fce97d937fb144afb7d1d91f26a777d190c5d1fd9454ca082f3d627559fc24aa1cea0ac623ce4327a6459705575fa572f00414fd957a77efe052153455db9503cad93ce9a000a9663962306379459beb5dceee77933469d39336d2fa426bf5a45b8cd92978bad3ff3d7b54d91fa2326225c9ca33079bb4d70759a7b12233ae2b6a0f12d78bf1acb7182969f17e4fc8414ebc178833861029da7d4b590c6659434acf11c8afd5e9e8f77ced5dbacc4eeba1e4b71cd56973113783062c9ebebf7d8adb793b3c1929b8c7b787ba1387f5bc76dace3e242e12e3859f4fd1caf0b5188184f4f5b7297bbe8b939091807513f35125c8d4774728807fe240952893e6fd35b4d673c42828c9950a", "635263", 0, 2032974094, 0, "d8718c40758a57467a991e906fc223addc97416d2b71b75f94479bc4708bae9d"], + ["56509d6b01deaf550f676ee8cc0a8a1d61bbc2b40331f0adde01f15661efb5f2fbb518e96903000000030000001b114c8a02e6303305000000000665656300636a8677010200000000046363515200000000010000000000000000d66318030000000096d02f32209d7c22d5a407754f070a0cdaa5c2067c3606837f058311cf32dce0f8636c2f5884ca44b26c8810eecf43527ac5c790338630fddd294d5562593e9683cb96865b2ea9b7fc04073eca4f6ff6d302386d1d2fa1a2501575d369d541d500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c815edcc82ab328d9664056776bb6756aaca4185007d4c7ad1bb0e49f0e2237fd4b36ca80484fb2fb28b244dccf1e15eb671ec0c5c560975d6e30dd05d1c40091dec344f647d791c162f42f99f97e10c62f2f3059f4f3db661b3ec824d03a71f4c02ee971a94304d1da25a6f37b8a466e599532329b44d7918dd404a726c7c57020e8fc2f65407f50dc883eaad0b9ab2bc014651b917dc36f98aa4834085aad96e032d7a28cc3f9b1f2c957f2d4bc7cb56e32e8fdcae43dc764e3148bb33769594b20b03ab407cdc87a25f1c8fb5dc8d7403d89375c48cc8ebb89abdbf174d3ba6c74aa30e6bc42c4546a870063af78d037a5a1cfb8db87f0872c8496c2ee007ab9b7e0222b2afca94df7292d13f92cbd2d7300ab8a5b37ea0f5bf1b03d38a0969615c7302156eef6f9353d510fb79e601ccc09c0ab280593b21641fc4a8200ce3211913bc02207464655bed3c103fb9cf52efa64081b5ccd225c7b229c17dd8af662fc08e9802100224b3da0a92b587a12639a910b4a7c2c550a8f63f9336bfae919a9e709c810226ae6789f826f2f6a7b37c018e9febe3e33c34cc2c1cad5cf5841bf2aae74a6aafd9b12614e4a593b741a1371dcc2f35549def4f126b969dfeced3199b9f870e8751f2980aec251e1a317572acaf6a5f194471f1db1564b236b3cfd6923b813b6e164ebcdaa1250368c42241083ec46c378e9b67b8b793395919f165037bd93623e2c6cbe69e4675ca84f82dc0724b24e6bdfcd0e20c73489cef71d851b5b9bc3d86a56ff01403f22fa1b1ab5e88364fd7bd613b4e83c9dab5a6b850613a6aa8f25142e6d0744efe036f53c2ab1cea9f06b6dba555ad7655441662f106af2e037e23210e09ecff44417ad0408e20a930a0bb732fd6c6d0fa9f192b8ec7ba7ac4cdf138b968b684300b1dfd501892341f6c5414b6725780b1355c3fb7ed19703bdf73d85685dd275996db1e6ed53c85a080f13333d07df7842223fe4fde511bcde05d976a584bf6edfd04af5831265f6e54a47b9df90b86c525fa3d6f725310a1be2682361415197a22d59011cd7c1d0a5337ee23a8fe4fa5fa3d404c7c0b4091a9f1db718d869291245c2bf340db846e09ae47f1c9466d1ee9031637afa4c3655d4ebb75308c0d5579c9dc0a8cc5fcf49ba78f9e1e4c5ffcdcc2d0299a4526086e7b7a6ce9cb8b1989e57de6a8ab9fffbb21ebc888118ae28bae471e176a75ab36a28348be932e33af55f439305d3224308e75be4d5dcbf26276b05c0718682bb6b531f75ce1895fd30725425155c476cff016997bd1f605257b243ff24ba1ea626bd7a8fc787502213abe7d3209cf8ea670a849db5db3aebb3e5dce9e8273e8b38bcae4e967ca2c1a408a8c7450eaf3c4b8a0485ff81cbd5bb301258f9f0ed46ef57e3f88b8e9534715ed022189488841556a9cf8700ef0a95de80ed34cf27bb81f5dd055bc2f11ba5cf43ab22dd807104b4d62371b0a82c1dd0f9120976b9c5c4f104ff739dc17b357c996d2134059fd885163d46c5e9bc9a38295d7e998d7aeb219f5dd991c56d787df9abc42ca25a7c33b87f0f0a7121598957aba0da5ed1ce69930c56f27ad5d4e0776269701f94f78ba2b9c7f2617aec5e434ec5aa6c1c1f3ec3c9e55e45d8c4d4a5fc3eec4f5df1c783db4f05ec8d681fc762596b98fa0d565a2304e5573bfc0e55df2c1129c41d7dc085c8004a478f1b4ab8da64a32f1e6f5a0453512abe859ab5b478dc272b0531364312ceb0bd92e9b378650f0bf48af0f8de425005912c3d78b4b2ee38dc6dc7da28b0748ccddf12003f63c9dc419d7832b264e2e0a4e6ed6339c7600051d5a4f96cbff68ad779b2cbeca47c41b90e884282aee3c57323d620bdc7767c69aae875b16cf2ef0119dfeada2fbe6b4eff0cd705c28a01c3ec6a846d66da534fa36376c357a1b5364617f3eaa71a92d33296221632ee3fca6b1720674e477726d7b6dfca2b0b59334a67bce9ee2d30b57ff311e4c414a19faf6536ffaa2d639bbe3deaf95ba206ff58fb1fb8fe66a11f877abd774efd2559cd18227145d2f50b0aa25d8820b6a9e9c84c5753bad0fee4f3a40220a461fdff929a329f726bcfab1738c8b594a392454c371a8f656ecc723d8ca24a2b50b08a4cd8b32c0cb26aed59ec3762589b4b9f38fc8bfbfbb7772fd942948e9ad2d47dbfc4857d1d7594a426acc9242f1643d04ed0a383a89d7e2fdf53f204f8c85c26863e8c1de7fc0c9568888ff58bade2016a93f2a94e3e062f713b2269325f7f683bd65db72c0e908e39435fb44fec138775e26baf37c2c5eb5770e5f7d1173805cf527f3067cf1e3c6cdac72cd58ed06aac34a33d422372a2cca76db069ce57fc514a54c2ffc6c6c9ce40f28995b57089225ec9de6b5cf091875fe0b664442b5df1feccc261fa3036b0b", "0052", 0, -1077671953, 1537743641, "87ba116e5c157e7f32f313468638217b41597858a23c331d8ea70f7d79a4f882"], + ["030000807082c40303b2e136b96629d029dafbddb8c733dd3853dd9f69b5c8cadf43a7b69e74b9a01400000000086363536a00536aac410ef2dac9ce468b56289055cca81430063a42e462c8e5486199c714903ad4c4a5aa4e9b02000000009f4679f2f80d6c3b9f034131f9d0fb31141ac45cd12386ed5cd5527b498137f9289a7a52000000000851ac65526a006352ee984a8604ac75f0030000000000be7ad8030000000000f4879f050000000000df9dd401000000000365636562af6e7d52a368dc0300000000000000002fbaa503000000009f80441612e9987c3de3b9fff312461ffc0e366952bd025f3210bbf3abf51dd154c0d0e763ec2facc92789f650cc6d2272d57afa46da47e056ab8f44b4df51e264bf3051cc9283f9724632f5f97da7b04de686ddd5fa2a266342653b7c60183700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e2e623fa56cfebc382bc02d19ec66b5ff657d4b06a34014c7ba0da9891b79d5fd1fcb50c3ebf5b65056a1ec04048e309b39694d3f22268b38edc694a6b9b3577e62148cff43f9fca29e3fe165d7c559ed5e863d33c930d5721af80216055e2546eced83b5d8d07563460114c6cf48108eca7cd49fcdf37c1c4110f9a6ec81ff103289430a503fa3165d0a9c21dbcf9217296958fe97d4a588e401d325e1e346694031c955783120e8c3e77a55c4f8b5d9de65f8bec521a23512281832aef8546d1990a00f6a4fe7b4e784cd59fc955dd68f2eb930d15dd738f358e55b7964f8690d231152ec6f82aca635b17621ec9717f9ed54110baac26feb1ca62a5e9c91df657b20203afa38c8e233535c105f9c973cb2294b3e25a3af38d5b384927f1a16bbbae340303179938f7016e0c642a7505774703bbef018fc1005284a24e10b73c0d6f3933021ce560553d228249af32c2619d86a583bd6fe90126d00d27907048d6175f5c450315dd48d7d1f3aaf1626fa7fa5976a193e88782d1ce34f4b28f45dd16a6533b560200989db90942d1413155a4a672bb44d0e62ae1ec958282392332ec8b128979ddd265a3d9dfc8f16b63dc3389bef39ff7be2ab10a241919773256f614195cddd937ef327b2bcac64e268a5cbd592ed28ef1fea08c8f4a249763cdb925a5d1e80d0a9dc44f5075012ba580056fb7fac7d118dc51e08e1bb188c3bd2030bfec631036f9b002c17d35d68fd526af28fb559ed722dffb6641b6ebb6a589aa8ccd7e2a7763e8057e304d6cede712f81104f1015dc3295fa489f4376b8f96b0308de683eff2c81b59fc837f2b0a0b97546f73afca8be85063bec90a5b212f060f8feb597447e0cc988d61d92aa555d048f4ad3b6ade5a5f557f76b98bead227f86b5450a9d6e9ddacde750d0cb21ba9b4224230a7e999c926356de433184db4b168e2aacf6097acd8e162d51952f8d618588b88f4040259ff953df55045af8150fbd2c202c54e1fbba2989dab9fc3b9ac438ebd1c19e7efe71a7ac0ebf803cc909cd91277c4dff3193bc3c28ffcfa24802de90f4072b1203ce8a3e4a277609bf27a34254b5691b9840f91660fc61b3973ae876bf6e4186b0a60eabf65418cad6047be5e64b8408aa0f18eb4ee2017afbe8cf028e141c74d84a4ba5e6c6745e912dc4c055ab4d0eca25a1745ea8e13fdd3039312c60c6338e65780a128559ffab3b3fe06798f15648b244ff3e7c35c148002415e684795bdb1680507ec6138f37e6a1f5919dff2a65cc27ce730f47478c776f4a8eb9e6ac3217a8eb88172edc055e15011bf867d789311217e45253bc3e9f2cbbf5a92990dd0351d6eac78a464a5a6497dda0337be71bc17c63c5f6daac2c79f0050bf0eb22ad2f1925651e8fc3e079236f7de0e7062a747c5823016cbace59f60d65a8399ff756a3712ce03114a7b65552e586d1db47c3ce107663e8971b5e199192573215bf8ca1abe224f72023dc0a0ee7c4857a7712f524fb9b49d7737c96749a4f5489432ec8c69622912e7d0150dbfef63df1aa2a7f38631d247a0afe6eebadb81b9ebb0834fed78d4cef8ac73f5339b2f3f17d4320ce5673015b87f9d3b65f549b653034a50ae3502d130f7bd4800d4ce6e105589fd96bc1d729453fdc544655574b453014d742d6e91a1d460267c3d50c853c1546ba38580e7a1c3ec1c47460ab8a028aba1f455b6e2e925df826adbc3b79558377d46f31eceb0da8bcaf44caf38cf2bd073c2a8bd9da84d373570721d930fec88c378e98825f3d77510a841011bfd17e2bf8bc76c9690dfc29c3d491ded54b564a237eed496e31cfcfec7aae14810817e7d465eedd51336b8c82066f4586a7dbc528986f155324e89b65c63ba96dc5cef79b7ca541d6e611a9536f8a6f980e9fc45ef54328a7c38b07302dc609418047963ed295e5c456769275d7934c9622955a4fdf291160846a1d81753a3ebaafffd4bcfdd42405db09762611649ca97e1299161bf972db847359e5cff25308a663403eb93a88786b5fcb6e1927b904341c169e885235eb5abb9576de1e60dfaf6d372b09cbfce1590a11f635143c9a23003843a264cb06525a216906815af37f17c69ed3b000861f9c47dd58e079938de6495bb05e83e4f58666b426e6ae60a20bae451a078574259ad7fd0afa394a74cb073b56df6d538d33f4dc7f9822eb83936459024b37afc2adfc08644f863b82247f4a4b21b2af56c8604ee33929166413585b9408069afb65af5dfa0a16e4fe05548efa5829052cd95d16f5c6c687705000000000000000000000000d0ff9e9223772080291e6975f5708f2c4d8144a07fe8beae01c6c7f665ae5441f179d74f38dd0bcc47676ce64608205eeaf333982f18887cab8997cb54fd593c3bcdf065306ed697cea2a0dd0269b7b1616836be2fddecb09bd0908f4cc7fce500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ec6d0529cd199f6f64693de6332bbb79a835b8488baa6deeb8f3071e2e7ad185364206cab3715435032e4acab6b023f26688b1c6fcbaed1ff100c651068c02c82fb2445ce461045e3021b5517e05fc980f0b3b355b37c7b23cdaa7df1f7a99f0ccddd5ffae551f6636692526c38702549c301e70c9bcb2c5348809e576d832df022c85056eb0edeea71befd31d3d40c727fdd4171ca5b2479eb0f6c375e6d1a620031967704bbc7f1b2e394c09146a092b9a373e58dbd62bbdb249f5a5ea11bc7b920b04435da22d8a60f8d12bf398c332054853cdcfe74fa03b7f93f3d8ae53c8339d53cee7f0ab149c35208ce7233dcf3c3dd12cd1fb306a87e4b827936bab131d920205021f978fdd827e8f02cc920ee599c32c3d53906a5d2eeae2486d959442ebac020d68cc33d33ee4ac6414024607f634946d0866cf6d88955d042cd61dbbefeb1f031c8100efd0800f88aba8f5e16f4b40e8ef41ed5c9991dca23fe4222f76751ae30329682f639e4abe008760f7c9c88e9e40224005f72ba80508115dc7de28f519e90216a211623b018cf3cb3d942b83ebcd0e3dd9aba57dd9ba9d2fb51c48c111b79527894f543cc901c401ed209bb7e9c13e887ee5b35b12c56ebfc934989b7e712328c5ce72942044bc23d7a924a121b12339c26d32b9ddec3c897bcaf25690e928204cb5b059bfc3afef1582e3a2bff79a2b10c7efd1d579779817d1d1ceba8c31ae38f742bdf0e1b06fc24038f20b0763c6bb982cb9314ceb74f3271d0a79c30dd0892ea9b1fac4aaa3a1782765527b3bb18554c856f462021821a81c2b49b48dd2ea398242d8711944a06c397c0a93038b1c8a7061fa04ad19bc5414d8ae7ad898106cc5f4679edfbbda7ab9e7305074637940b8baf2dcd9af886f710510f3ef845f3a2bef593b68755e046d8a5dc186e3536d8387a798d0f9ed2782f91e3edaf02c8f119c8705b769949a46d00bd88c594c033c991fed044d47d3a54df8a09b72fd3fe28ee081bd376846c23d9d028e41f40e1fdc10aab82228f7f1b806400270ab566b390fb15a3863537230956f432c8d3c096f6cc09f9ff37a215907ae03a5ea95d1e56c2a1116774598fbec073f9bdc2bab89f8770a85b4a96d280faff5e7c6a70e879ce3f9a1496f6ae848bfa0fd58edb12fee4f0a6a7b2dc99f8f8785e4d6a518fd1f900a9129dad3be05e188f7a36ba97718b493a8cdf1c14d6645a1ebf85313de5be62223cd067298e631adfbf0ce9bf218ebfb6a26001d8724e3e1480b7ece11d694a65e1a2a84c1bb0625c010e734e46e41aa2ab4ce8efd0ab52fdaeda2507f32d5750c3a8e4352bd28fd1642d10aa4b963ddfa61630cae1f3e9f8fd4adbdef7f9c752f7de5a93bb63fa0826aaef97673566fc20848353d3e822466f9e7b9cf6c85350ea38439ba4a0d9398efd4e7a1f94c22b58508e585bd5f0a54ab231e8d8f46a789b0e037a5e541fdc7dd53e90e3b63375c80dd23d2ffabd11122bfeea22a949962b576233a54497d21bfb2296cc9bbeef5a74d387b0a1c852f04019273ae0f5442ff9c818b3ea008f5a1feadeb0dcb6d2189f85da6ae2b6254666e7148d8fb9fa650a101ee222fb47b5948bffdc8e7be99e4d14507c988dcc31e58c259a541260f2f5d4a226a8e852f9a0a6581d74fcdfe5543feb48d2f785fd248b61019252a18176869009b404bfbd14bc5d0b204c801c827f69bea54e095b11580aac3ed23c3dab1d4d3720afea31bed8a0979a00868937c0cf368c4ba5d5fb4b911a1be382a62251e9e96373daf9b159bf323e5ccd01445ae08f1310fdb33b4e505ad813f5bb8f19f8212015dc7ff624e4edeae14032238fb7535bd976f2e92e6a526d60e484f484feeeb79e1b5e51d08d04957d7699ed64c8638686ad23af071d475b522028d4709d3ff7f65e4a73edf83b4eeb4bf980f1f0963048ba32acfc2db7984fb0b1b0ba378755cf00328567103760980ff884dde7ddcf10bef0730efc1b7f215de31f3fa8ff43d0dfa48671a2cf279f5e0d7f34d04cab36bfff3bb75f5e051cafe5981f9426b888be1bfd1b95be7766d4479d6a6238a7a24061688ad2e92b2a7ef9a8c439ec7d209dcb4e2cabc446d2a3971990ad72bd46ff8b7567c9a860ddb6ab629e24de64283737591826205eaaff995849c4b12606b798b1b3e13b9bbac771dfb9a2538a594cd332a27678a6a39390088e2129312d4010724c4923a413209a05e563701e321fa3479ec4472c006b2ad4feded6dea43594a8f28c45fb2ba4c605b196de28ee8291b57832202000000000000000000000000c28e42dee2e7bd78479f4b5653fb8634302d69d05ed528bf31f4650485e1a258e9820ed796fc39a3ccbbff333de84148a89c4e77f6ab94d10acd8296540315e30526aa2e19a327754df1fd4c42f12c7b827854febea9db2fae5180c742c1dd830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027ddbca2c8e420046dbc9d6a16d368fcbe1a39c9cef0d4d5651dc4878b7797723dfb19f2b78b2b3472346f1cab3106f96e5a0869058023b957e5f1ec8388c8cff67c340e5ae7a677296e200cb840ea300cbd1d1c7ebad650e0a8c29f3ee4e34d2dbaa618f099ffb28e1adcf9c5d4e2ea0691e5c0bbbeda6b20b388421f5c68c002033c0dc1feade4f23bf20e2d80155047d4f290dd9ed5d8e3ac651a2fefbb7df80204a0096dd36ec8ace7290f0354eea1b02b590572fb8e753b601de4bdb3af3e460b031d04ba8d40612ab181456bed7061ba768299f95c1985e8cb7a25eaab919eeec88a0288045241ce07122374e87ea8af6cf712e3456fc00b54451cb275a0ae7003250a3acf50b874e701a616a9d79ff04546319007ad476221193f77969ac8f593032f736159a1479152bf8cc3c3fe76f70409d4b4467d29bdd7a50744d17976f6fd0216c1e6a3c293a5e4dd97be70c18aa765de339505722d2c468a4d204e40ade85c021033ac1485ebfc1caefd89d22ad43cc3af9006a4ae83939972795ec21f1567f3021948858af3b7e6ff84d69e88c16e0d3930e49d67e2e3b72db0046466434b0bb411bfa766e640d308ad32ac230b8b0c645dc655666fd59957e68a6f0968e05707cd866e1939601ac96aecda3df6589e75aa2559a1921d492b683d595ced24e46020ddc5bfbb904e053ba3980bb391f5bcb0080df85390757bec16aa9dcd239df86f9259a003be7ee452078d4dc277da61c674192b0ff2d16cf325b4fa23391b7f61a3a180b9ee043cebb0d02e8ad0372dd17b5a027d6eb09a0cc240919ff59f8411e2e463c5a25c256ed8ef5c1344043883cc437369e05b4703efed7c8dd18b2b40dd177acb4c24b8c161264f77eb66b66195cd074efe344a788cbe4ed246b7f674c150bdaef204852e262ae53251331f888cb33f12160a101f9d5bcfe5f2d2b058475e61309c79d3d0d3d2509d2e80d86bc067ac24db69f70b923ecef91cad9d53a027e62b981f6c7f27fa80367ad73040acccce8932dcf9edd0e4c12c358bc5d4e9d075489a1f520e2340ceb71c7d7a5974d70df0193be3a025de8eb3b86f3c9f204f6aea0add8819a62b63648e3bd39aa0b36957277a936f2918588222d7520ba84b63db99c12ceb184a6848476b501031500b95abc96a28a65975a2f9da385e2eb08025a85363a339b1e620dabfb04c92810ebc4f14558d5fa7b8460f3fe3489ca17dcd120d52a0979f111ad242cc687358b7c768d23a4d0e8d7407d84809bd014bdf1608df02d5d628dae15641d930c106e0082fd5d096ea5806670e8123289cdd1e00e04505d566d7744b3c20743b41562ce004160b3f38811b361142dda88e54415037af21dbd600ce8daeb7c4de8e636a623b6b601bce0374a929f63cdc90ecc6c9bb9c36fb1bd267844bb02886bf74ce15e3146ce0076f40ea993ba41542b1f2bc3b1cb7da468c5ced3885a52876dc20e0ee697182ec33c4dec25ed53c61a37eca82549a7d475a0e17fe48c946b4011f2510b03b464ced54f190a59e27bd18688c7bde68effe72fff4b75523cf87b1c7435174be2318711cefe86febba193ad5144813512b7a81c767df0f163ba98b33a6dbe4f6f1465be932068f21756557a7e17036c6db26ebd3453cbf5ad328bf7660067943f7e4edc89f0e3903839ddadc577c5aefd43d29124d38cfb567301045decc140f60ef97c3569cfa7e9be87294d867ed5936d35f64631ee842c6ed6ac0e7b2ee4f1c4d607f0796f79709c3bebf38f80bdc94ab11de35c82e2ea0ff62e56226833377b51aac96b4c61c44b8033cbd707b8530b3710d7b6314dcca40e74ace05540d1339b25d7e7895995cc6ef11ed891ffa8bc783ca776799e3ca024038eff9893e66033eba23ad418026cd26f989d60e23e85d1c640c05b44e49058988868bda573996e56dfc069c37127733e723452426f778a0738f84b982ac154b12b2191809c8978814fffb50bd3fbf94d344a1a135fc8455eb5df737573c469861687f2245d962713258d01d9fbe6d47ae3bf26334821bf811f7ceb24f669d6f380437aa896af27cc4541bba577e53cfd943861808612f75e4ff0641229a3b7a1f91186d44d4ea766e6d84b1c508983d09f2e269dbd89fd241c08b48c70628bf5955815c773fe5c5a02edd8856f8993719aea2387245292d1ae8ff1ced5c22f14203f65d8b0d8caa84c13a90682daa6f02c5e9294cb56b7145ced6f605ac7791e84a18e26659b68c09d49e9fc3c8f460a390a57611abe45210ef8856ec810a9319d7dc731dac09c7f0775587facecd973f60a5f04d98db2296a75f53b6edbfa4e4f09215dd207b93c69e9b94fbb31de364b5ead5264dc1e3a292b62a95050f515726dcf3af271615fdd642f560d7fe2f5fb4e9b5d8dc613858a963c242200a", "ac5100", 0, -406933549, 1537743641, "8e9e1dbf0c4413ece4062b59a5b47450a54b81632b8df36c5de94000458bdfc8"], + ["df07b0410311d52943f0b8ceb9844c0b54c4d668ec8ff2bb0de47fd433f34557b67424126a0200000009535251acac65525263146b0c35f3d155d5dd5dfb0a23c53674fda46e1049c4f7214888dc9693213b8d445eee6801000000085163ac52526a5351ffffffffb421a19ca10d07be18de051e6985c27b59c5ddd0fbb918d54fedf2512c78bc040200000003000051ffffffff032b3bac0500000000076a6352516a53002da2f00300000000025353fc65030400000000035351520000000001000000000000000038d76d0200000000b4c803fb2dab90614220861c4f14d84139f18a57b20cf07c98e7e9404ddd633d2a82bce0efccc22d2a3e2c6d1329d181861c9367663a7a64d262795a0ab03338dda0a65444ef940ab542ddedce32df273346fcdc6b7008f098aaef7ea6375590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006bb95d8d55e68a92060b1d43beccb28bc0947562738a630692b181c4fb083810cbe1f2c000e80d078e42b6135bdf10080bd5e8e39d4ad8454fbba60842b59c18beac4d6c3964c32d45f8c08f15b77f582516763b5d7683c67c61f14efdeddc6695c13b666f133fe45487827401ea54820403c9bbea30ab8f8b28cc9967da921c021c6d3c847f75771e6a446908e2ea9992f8c1ecd2f576bb712108e07af887e1bb0308d58e533d8718866cb9135e741bd3bf76e79b0b88e10e51fe095c561f46da470b04c04c8c8594cc0fcb69bc7e1d7dae6559e79990c46abd03e37ac2075b20385df93f9a8393436c74959a92a1396d63fc812e8c046c17baf85c8bfed8a0ee4860032a411a4a11a087d0f318e08ddf59ba2fb4ded2422d305bbffc9684f8333f7a370327b2b256a0ac0c76e735a07596ba46e12ba299672b9366560095c15ea0dc0fe303061375556b83157947a56952aa2643dc35750b680cdc549c60e7d2424421a245030da63d291cf0bb5771007ce44bc589b0452bf9a460e5778fd4b7057296cc51a30317b2a97bab829bbac4d875989829594fce81b0bc8c991d072910dcc86657029b59256bc2958531df56b3b3e3ab6928482f2a1717c02b37842ff9a887020028ca257deadbda7450c994555ed880264dd4029cffde8daa1c38301de348595cc0422a0f32c4b1c363a514f5d0c750f7cb66e0d0115e9a99c12bfa5fa7c79a235bc8f08a796995e4e0945e7d39a2c8d90421e8c04b0f76d53f4f7c6635f8a57b49ef71ce89e14b69526f3241c723d60959fb264fc76ead67e57efe839c19e993f1c5b7dc537fe834fc87f68fc43ebd2ee0cffee92dca5ed634b19a2f2037a885d2c1fd2cc18485c494b7f4518a096a5760c01890f68abbfc90e121b0974c4b2ed45a1df53ff36fb2867b183485d3c0e22b4770944e9b8d0171925267180542c1d17890cd4f46f0819845ba6f6c7b7b1e2dc8b1186d044cad7a19ec016bc4080060975a2f11c6990e9dbdb49957ff88e9ae983314870ea9bc0c9961420b9fda66290d33b7d7d51011e94543a4e900f4d39e68db51d664b85ec6592d728d3eef7c5b6b727b9126d907c15645a150d19e0c8f9fb62af7b4d6a8905b084c9cd50023c04e55d53083f06911bcc4ed53fa77a4a7afa6f44a67d0e494dde04b3fec11a6edb0b247508aafbf9d54662ed911166c81bb92541611f602684c0387ade94984d90b08e89ba50f6ba71a2e8e6d9b31413e39f297c1b67c203e4c086e90be6deb52dd0223647e1bfd42fb9fb577c318f892c3f5426d2faac0e36a68d8b02359d737230451173f5eea70dc1e7a8646fb5701f834062040d7b72cdcbf2bbb961c2d768069212cd6c9620ac2947a858370b33870b6d8a2d8cc0dc4d1340af1ed30c4de7a0d19cc79945628650fd0ae7809433b85a96f0d67f55b49f2429d5e5ef343334d6210d8d21cbbbc4a5554f30f3696e085030ac9e32ff07e3b8e61f44f0c4740c0c2dd1661d590469ea703e647c232ff21c4acb3ed7646d21c9b9a2622361b6b11a9409a0d4f872f0c23f6d08a952c6eab3ff8b54002ed1575e48b62bf0522cad6c15c3b58cfea4dd808d16db58437eb9c9aece39d95023fc97e30afe4bc98c499ee66b6786e399bb504110c2423d60fadb59ae2c6a7fed113797f5ef4e9c98d83144748a2edb14d02f0d232c174174bd8cd84190ad81d131473353c1bc7d6b8ca1805b2ca66a5f7eaa456d87cdfea465c5c9905f0d5f703465361710f57124880638a0ab5c2fe541b84e480ab1921a9c5acd8ecbf655e80d409ca738acb9cdb0998710260cf0398442967b05319adf210b9c4f31f2ee622b69bacfe08f3eec95447de03c9906404a86615b05d9c237f9e9cb79ac2727bc3aa70e0a9e6f4ac6aa1228f7f8628bf3c2505cdcb6269f1fa16eb4c8108642fbd1683b009303ffd081c26479e9ad9d362320b34fecb4ce40c2174698ba7ee3379a10d75d7628a42ed2129b6e08c9a46618a9ba4d9c1f5eccbdda9616438ea5388560a49137e0920e020d4d8e10a36345cb7fefcb11de7da8635b1ee62d2c08520d571a91ddb389247441bc4809149dc18e3b0fab2fa4b1bc00e010837270dcb2fdaeabc16b3be122a894478be23113bc446a8ca441c1f4cdf2be6f86cc0588ceac9e946c85113e66e599c39a5d5154b0e7ccd1b749990c37ddd58f3eec69387908cd3c6c9325664756b6361dd6a79c4a5ad0c3946afb8898f5116e2e8595179ebbcd90c5058da6ecbe0e6049f9e41fa1fef93846d575ad84592c279938be4dae33361234c4adbcdabad1c926c0ccfe115f27838f95e50ac5d150ff5f2df474701169f882c8e91cea314ad036d411c776363c13c91eb65a70457f55488fb0f581ca2ef0bf3e76a1e5d281553a305bb58ef4919da45ac2d8677ef3e07", "5300635253ac", 0, 320836924, 0, "78b149252157a8b122cf37907be593df2e3515776e13f8897160b113ce2cc403"], + ["030000807082c40303e31f0ea80b8de0072e290ca9b6889c9a7f0107b73e7d2a908d2b483a210ebab40100000006635251520000ffffffffcad7fe937cbe54420489cfedd05db767be6a88c7c59c644995cc5dd9fc3d7c570000000008635152526a655251ffffffff017ab60568ba2195b125ce8196725f34f46f56a26ef8e8db60215819707ce28d0200000005635153655337980afe014a94830100000000096a0051536aac516a51000000000000000001000000000000000063633903000000007374bae68b63983acf129baad7e61d535ef2b3893952b298ad97aafe1704cbfb00a3867440d1c701607a3b29c0d09dc6ca885db751337da48718d4e4a37e306185246cc647509677dd37ec16c41060219247768ae8f26463002a7aa191ae1d530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083aa411a63ccd5188890747da11b9c1d57de857d325a907e44ffee797e9fc1de739003102e29b55d7481e0b172c372c717b13d01e196fecdd7e3cfdaf66d0e2da6e7febc8403a78f19659f54661bd2f2bef64a27aada27a8a7d10a276895a66067126c9e1d6cdf9b721d58ed0cf0243481272d03c812ca40855a7ce9abf205c6032898bddda63f47d832b846bf8ebe2292978d5cd63f247c1ab79e21c305b60c360214c78556fa35a299ccb7a74c1ecd0971cd84b48fc3ad5399b98410f5ec45b5fb0b0035892612608240054714ca008e14ce207c726724fed18e9c9be4849253316b13195c26983e648915339a02558d16869cea73c9c7119e5010fe7732edc56295030036b90a5130353cd1efb1682141e6eb7c0176d232d04f2477227dffb05197a702014398ec3a3c00c92aa0bcac82e4b0dcd84fb5fc62f6694b5bf6c6a3a7b0b40e022c136e6496133ba79e470ae90acae74b8942c14b2a1cbcd547f67529afee909e021d0f05a37abae3980f8335fe6332bcfab7d6184fefa05ce21a63aefde8fd6a4e03208f6a51b30bc9db7f305b0cbd8e97bfd3ca7df16c146f871f8cbea0a5be788050145637185c1ba099fdf59787e5d84331d7ec7e59422989ef9225a37d3a329dbc14f4c30e9166096c2fe973c87fa5167359cf918982f10072ed8df7070c9f0a2d49ac04a6a78e86f15da7c35760e568a43a5c7ef6dc5585d9751254a8ff6fcc31802a8bb4a9579c5b516cedde8f3984461514229e544429c6d105db575ff8c88f48278d2c2efa8514011e41030cd8fe6e789eaefe7a6812eb65a530ad3cc4f9e9a5b52135ef938cd22060e33e6175b3bf5d2e3b37bd4367f36d091269a84103c2e521890e1c1960f2f96132fbb44af2bba6fc7a4fad316d56993a97db8771989c56e09b9e392f3336761b43f950dc7651a19a83567ae7fc3a245159715dce8a2b814b7c5aeef349aa1344ac202472550bdcb6ff42a565a8ae996b2a5cacc75a5c4f1bb7419995d120da2a5019e8a6e3551c8de8331f3452318c2ab181d99a752314641afb59bdae5216989ef81a05fcdee17307a02290d4b58d65b89a299c466b03aa1c6024aa44a301784eedfd03d769762d8b88fff1d76073c754be8f7d22f8a055057d1ba4083f5b32d2d97f570878d37607d482fcee1cd857cfcd29a5a05876b53d259dcd000d9f46b83a19efcf2cf899bd3c1bf7ff1f95749d762b5a3dd95886c5b832a93a2121cbe2d46d23e337c8d5a0774eef85d18b66a9297d587efcd4e72d015cb9b40c5dcb388e7aa1dc76899304ee5cefb8c05f526dda42d32a8994fd640405cd4332cb87dc07ab682d13bcada9e851f5907592c916979469fca8eb02c26c91a99958d0f55126b083efbd2c91a36bb46584e4a0dd36e6d041e33968ae9fc5b08437668519f57bd7a1b28b407b99d6c70466d86c82f70c5f33917bc6223dd492ae4aca115be938a6c8bcc23f0e0e90aa47c6667e9173d3f9cc95733b3ebfa1170abd51f7749057b4ef26461a2fcd5996104bf03d9bd5f10ed8cded7ffc209a83ff76037db2594f9bca24a08d2fa3c999ad0abce449d8a65a4ff86b1a2a2f0da14ef531298ed1a23250c7e338f3d60c666f171fb5d5aa79adf6f38a945bb143e18737b35711edce24af9644eeb9622501f5187b31de4d3361c1bad241a686c408d96f41cfb7d78062330c70b3af2ce76b7c935c200fef57755edee475aace965a36a5a5c00fcfbe67f6666e031ce013ddb9a97d9ed4385f7c58b4b1069bd586ac5ee6812f3c7424b9f3850581e04bcb3a3b5277143db4650c06e85601baca88039e61a792e179f8536e1e7116a2cfcdffc1189815d2253f3d7717b6b9a54282a31bf4e2d937298643e93d44d389cfc15692e0414c0c7692c4a6542df5d602d302372ed40a88729a326838baf63d3e7637577920d82b5795a9972e96801cd07451f985cb2f3452271f95d23fe2f945d0be33855908b9fcc014ec7572f2bfe7399faf4702663005f9beebd0c7266fb36bc2df74f7268763c8d1be0f1b0e4f4652dda3c89ae1e5015a55d5d65f776ddca212fdba6ea9e007e01f9635779f013b9b175d3dccb5894d09e1483f2d242ac9d44545275531ab218a2bb1815c9487e6c7994348244fb284f28a4ffad602e44771fcad5c48d31ad8d5f09a9f0445649e7b39bb7478d1810cfbdf202819b60a1d3e9eae37a64a0629471e134eabd8e706da9173cdfeb88fd62d1be6effea29740fec4bf1434a48fb0da1d8f918dffa50ea89a4a993c67018ea9eda504d6175ee5dfa199e8bc2a086ecf691ad4fad493293c00aaaca7affd099d0cf33e358731b9cd06c529235784672f202e0e276337b6be4c146ca5006ea85b1907523cb1dd2661b60d9d4515e983f73ae2a262d57e427561261daa498df9c895928bd908", "51655363ac636a6a", 0, 99045297, 0, "8be2cbc69337727c6b4703655cbdb97e71d6bbecc6d901148cbb55abe0ebef25"], + ["913c9864029b62a45a31f7e36a5ea3f569fe66bca71385ae19234ddc5c9d8d5bb45a569b5b00000000036a52650ec7d40e5c1894ee50dcbe055829e8b13a9fb3a228014e28650b4a15ee283950d35571e500000000050000006aac2ec7552d0308cf6b020000000009ac5151ac63650052514296740500000000010090975400000000000553ac5265510000000000", "536a5100acac6563", 0, -845805069, 1537743641, "594392a8d51d78e0bf179534693c63b98958362a23ae100685bfb6ac6b4a9247"], + ["077e04680362161ae9d08680a6a4a8e8bcb935dd83f3e50f953bd2f107d66c83096dca06cd0300000006ac63515163acffffffffb2aa817b9d429663b2cd5a9ed72f83a3cfd30f826288ecdd29df4c015d077c2103000000055351515163fffffffffb823f09c575b71b34352f48b8b08f6ddfb4b2b1e9bfcd4936018bbe753559ee02000000025353ffffffff027c0c90010000000009526552ac536a006a528b5ab60100000000040051535300000000015b18d802000000000000000000000000a51e58b1971b77cf51b360b3513b3ee456897edc0e56b02468502715b9616532c6043692f4f716ac846b15c418c9faed676c3c8ba2e034b69f8e3b32607df78ad351f7548e673d0fe04dff087b2123f1375644cacdd4b67c609a832d080965cb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d72078b353e9cb777811340c5c26e483c745aa93078a2816a5f6b7d8cea12fd33bfa3cdc54ee3a3e1c6a84a124bb724963efc1d2f19911487612e5d93c1f5b5576c3c546193bac550691aed7ce250964e18f44720df02df0f4305998e93344cdc6ba4873684ec2beb61de72d1eb30583fef25e5ab2ccd2b1affd9ca73a4e120022684be553e11831a887d13677fe493a8cced1a65719d45c640290b4babea315a0208b5dd60c63fca527123a7603f6638efbed90d4a7bc5242fca6b30dab9085d9e0b00da11a7ce527979ed45c80f868f1f0a09f05ff6982600383d2c361d12ddcd1ed89d176744f538d636c4363f9ae37b33950d8e32678db03b1de4c891aaae2a8e020b7e6ecf60f20ecb90377bed3fce480a0381c2eb5a03df7195ca23816cfe39d0020d59a44c533b12cad7149a1119429b0bbcf2de0fb39a02f3c28ce3e9bac4d66f021763b1f65cae16198490ac322b6bc19f2adfbe14e851198887263d21eeda2f5d020f6e449367b6ee7bfbe6156ba135a197a910d07162a2145001facacb8f3ba2610310caa9e66ef3c08261348ec1b116741148de0975a48be8ced65f5d7c88283a8200bd45e017ba20897b25656390295df348d6e37e76136b71bc9461183c7b45a99df24d6f8d04d1b1fd688875c9459663ab9f9af8001e8bc3c49ed9406cf742d376cdf25a6dde038586a3ac92faae0f51addb3e85eb4d80e93d37187f53b9e017b366bafedcb6aacdb038a8fb86f83f8c26bf815a63cfe3c6c68c7fedb586ae5abea7e32045da2deb78951a021b2da15b371406640b5a5837239625e4dfdc4ab0c5661c8e575f8897bc7b7bcf9cc92ea057e12f119ec567fd84ab599190667d014c28fe39868f5c2213d4a22bf98494b1c0aaae49679fd290f031664181a0317498c6a13be69ea72220e9d170b712e9ee00db07656c181ebaef64d10d9b75a7d3ec48d5c8bc1fd1baf09cb4df558bdec94e0119495acc9c4397993c653f446a70f80220241fca712324f6d7f56e76640fd1c626bffecb7972b51be641d0f93e176a4ba904512c8334c8a0a444e81dbb66012b870fc1f3febdabdede4cbc1e9576fe00a89ad1e60bf228e05a4f9083241151750b7a9a9d80c227b70c5c1072f7903dd0da4fbb9318a713b58e617aa5f910f9c830003bd2a22be4cc17475307f973a4e2c04f8fbb8222c0f53a83516b4ab4d731d55acedfffc13ee233bef76927109cbca1f90b503a208a1a3771f3f687a73717890583e6129a19838a3b0d48d3ac468b5c3ee97cc1f740612d1239366ed82560b777fc26279fc91070e0990703ecd06cdad4fd0115947f95d0df9f16f8caaa1e022a42a46e8f9cc7a27f35e95878cb20f941c559afff480dcd44f32d674ac2226927a012d93f53d75f17b92a32a823c5af98b534d01ae1090453b882cc05f5455b301be27774de23fc2d5b06ac705a87ed2fae0d736e7ae3954b7e1cc5ae84ed65a9d332b6303c412c158883b119bb3318f5349f243610b717366d7ab66ca90f2b1f209f0af607a16cb4a871e05608353e7e4d4c8b415231b445635a3aaf2e96104095685efdbb55e6275b547be8778e490a97799400a9f7e3712e49fba88883d13e6072190a0a0921f7607d583ba87267efdb3718cd7738e76fa7787080512d0ae44632295179c04761180c3be6d61f30ee2d7755de035c91d797f012ff74f39373b7f2a7ba84244cc1ea6d3a9dc47d017bb38ec4165e09cc408575c674cf1aa16114e64a32bc1ea5049758c2f37b59299cb8ab77fd52e95b657f72d021637e8cf17e73c35e4ddef18977c0cf55543fff0db94d491f73e1c87845b955ad8d469e89129fcbed38ccec0ee282f8188b8cd54f81673ac585a47428cbc8bbee34e4b965580606833f61e5fa68fbf200480d427c93e1e8b633ae8bea5d3484234a3f4721218a7e8f9b8b9c919a36eca99fdfbcf21fc10c050f81ae956300c1f2189a8fe255cdd23779656fa39c640daefe5bef1a9d22a9137b1ed5b29ec36597018f54330f4ae57c67b0b8818c0a07a24ada4e9c6b121f8f76f9fba747287d25ce31b7974f1d618341617130762d77bf3ee077ac6eb733f561106a7afc9bb44508c2176bd6d67cbaa6a1d6900c42bd89b07beb78d57f12c3ea024c889a38fca3d88fb25acf610a5652754b687988f64672ff2a7ef6f1138961bfddf833162be57179dffd0d5a85e74f9f7ea125ce52216da4fbcf13371613ae9f27c1ad97542d69c20029b33b816d1aec5088f9a52ed52caa4bbffadada98eb9fdb9e83a60ddd8bb4da7bcbb823c077bab4b4d1b1533785aca3eb93965dd92b0528a90ecd90d6db54a32245d940eaa6f980480934f04c39848e39ce2f979568e27e6f07d09b35077d32a46b3f827c217e609050d4163c36472abfbbacb3e6d0b42117de749b9fff07", "516352ac5353", 1, 221181554, 0, "36860e724b655bc51d5cd77e6c5b224d778183c6cccfa13c0365837c8758ca22"], + ["030000807082c4030355c398d577e2dd9f50814f938536dc111caa2449c33de54ffc8ecf10533cb39e000000000853ac6300636aac52ffffffffa36562b2e6af5f78f40b355a54d33214481c2f24f44c48acb0e5f9370f9fe9ff010000000153ffffffff2f6b6788cc0d5ea71403f4c4fd036c47382fb957577d03b06e8c1f75a177ebe802000000025153581a446e044f4beb02000000000551ac005351d67f74020000000002ac52ebdc04040000000007520052636563ac87b80e0400000000096a656a00526a6500520000000000000000038cfc2d020000000000000000000000002d0dd31f373177b1188dae63e91b7867ac08791e602b5cf9d1f4d275df14b728c6280f97c80b2bb17e1e1d5b779efb4bd171111d02c26545ceb98d9f98ed9af5e6a2fe2a4604ab3bb73c9f5f570f52a04eab0d4918f842312dea741c220c2a7a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004f4791729b1aece06bc7947f5d7434b154581c2c3c44091ba68f4fbe99775636249148031469c90b9163cc7379efb722b454a1245f65e22f74d92903a0e418cefee5879601fa216cc2709d42c9503bbd65f517f79979ee73435a3857e22101747e698948085f7ad95e573705e924a60b4871dad415560696a9da7ba4a6a5721a0307d3f3b1486de85762e5587d396b9b25369210f33cf68b732010719cf2654ed602023a9fb4ea1a60ff890fb202330e76d23de239c53985d4e857d2c449b1aa51f80b08bbbbecbb81f5ba256f88c16ceb515a7da5849d0c9cdfe8d575753b3a1195e9c9fd93e59731f835b1b5e77a4dbdf9f42b1d7f235ee51684a108e23b6a07b84d021964766fd97e835db36c40f327f473bfaac8e138eb21634fc064748085a4b59302189c506b249df9c74bbc6190aaf620a6d38c74443edc7f563d37afae8807f53c02099c17947fa55518fd9f941186e45ff9a96d142a13e9a047557af64289094b27030968ea30ea0d6e5ac920a2a8c10d09fdaf5d5f94341fa6f593d91457392de0f10328ccbc84611d3f034bba108dbd5da757f5c9c4e922aced76d7cb0eb9f963ad8eb573de6f6de5289c19ca1587c348d4bac1db2a3bab17f91f1c9d2d33644440b328d8f9af2b6346fb8bb2285d6a75e6411a8bffbbb2c7488eea3b7dd33cf19c68cc5e37088a1a945bcf1dcb641119693d126cebbb178577b7950fe60a9c15469981303422def12736042dbf288f07ab69ff1ba5e3529186ab6eff28969e14bcdbbad1a412df4bce100e93241ef3a37c10285e23955a9b1dcb47f5da68f9b554f8b81512ce8a5653f80148af8fb56d63e54ecf0575e4a12ef343f6b42365801187cceff280327726a2b7942802a5f0d0a3bdf36880e44b42713505605d3942322777693df740fcbfb1b7d84e045f39f03ce6051e7aff6a239a9e8dfef23c2e8d4c64d8c80b15b537391210e5110a47e5150cb02652c77651d9d60e6039763fcb5a1e80a21162c3811ac945547a1f71551ac474a6986ff45d75c3202e468087f168a547fda0ac731edb1a820a8d0d018a6c104881af33e6d1fbf10f97cb6ef85dc9a7ca3d8a05bc63af27badb7e1d49b16e56dfcec600215a03741027ee7151ec178865242b35f3fbf27e24168f88bed4e8252ae660d85af9b8b494eb8d13fd58aed498bc429a9a1d0746d8f30774c3330f9b18e479ea3e26ecdd3852d893d7b5d8fc641e588fe9a75f2f8ad0a9308ac316975044f342946ac96af2e4efb68af8a7c819fd2ebc74c43624df5ef57285cadb242d592a65db43caded90cf8701b76cc48849e8a1dfe9d1b13a747afc4ec31132ab68508b7a6e8074f514abd665c6dcfc999d9e46281e19b86d55953820eeb3ca4641c21ac797bd70a5f033c5a1e13290de9c34ea5631a82bcf35336d7116ba81f86db584d289b3d7115918ffbcb88f1a32ac5ce5861420ebf0e51f9360a1853a5ba5aee2cb21376a26a4a447804623bee0c1bcb15b4a7f0404af90b7f121747492c6f124a1fd2b8a6b93012efaa09f3beb4bd627c694cc430ec273d51a012b88c750c96924f16a9c777d48c0744b6fc8ea81795e03aa89ed6f7dfef88dd8b0380c7d5d9339afcd2522a2ad7bac5c2ddbef22ab7f100ade889669c76696d5d1ade6ed4f20462349e54e86858b7e118d5a4bb998a39decd2f6d1f674c3216e95059d0e358a63a89ef292b5b93b174fe0173e6761dead6139a0b63046d6013e5f6e7ffc341f008770b97d6206b8ae82d98e814f33fcd68f20efb0647c685c03405f33c2906ef66dbf81073951c18163e2b391ca7a519ce6ecf08ccdbe6dc95b8037b26c65e5eceee48a8996cd22c331588f63de1fecd55f8cc6926ed68348893c756ebef3cb34be9e3fd45d8894d747270ec35347cc5f61c03a72449324da2589850f85686dbdcccb7baf90732a5388e06ef23b3425a337ff99ace4df883038f8de3e1313decf73b580c6fbdb7aa1e168a29d36ca6a368fbb8963d4affe088cef4ef526531af158ae9091bbdcce6bec2c41bc226fccf48437388097969dfc444cd9a71f96d0d76939bf76a235b341427896fe53ce3c0d52a341c1daa06a0010e3ea135796af76f1c19e418c9d919dbd4b85986e6ce2f6b655eabd029ddd05d9f381ef9efed931910e026f487a3269a68fe07e3009009f2f973a7ef7cc13187123d28184e70ecf6c703c9fa96ac5fcd35934d8e6e74178fb744957bb75d7ad9ed537b81173cbeb69e01c36d8d57ae4f243d3484a6973189dc7923412a78b5940f3a8999d5f33b03000000000000000000000000400b14cbf0d3c7c20221a3c6644d3d5cd735eb24b208baa2044f9a669d086da76c74dfcb31195679e2b86232ddf18459ce2a5673df0b32a22985685c0e8817ca2a12e1a1014e969ed99c05de0a06fc1ae1790add8b15af6388c9729251638cbe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013efb8d62bc10be436d80dedd1e1ed13ff42f48de157d3a32769d95f8bcbf32c79fc46ca85ea3bcc166a052c79adf306b5950b82ad58ba6ea522b9491db87c95123f946716ba12bb287244476db0b21c56310449bdf12d403b3b30b00c8a8192a6527b57de2123a5310c1fabcbbb2f1017be1f9d40718f9c039acc1b602cc04802098169f305d210eebd249a2b7048ebdb8f52b10a3b3fa0841d486789ce35b605022c0ddc4e7b95c9c9d9eae7c4dd6ba2ee7f7611ee5cb8ce8ada8dbd1fbb8797870b06b51564445b5669de107fa4e7cc91ad2fbf69949b92f79dcae00b93b457dafff0bff1560871fa2ce229df19718fd6769b5c44074d1736a83913ceed043559d0032a973b22a5d77cf24e00e2db3c46aea618b29090f0d9d8262c018e393460462a02186644a995232a993c5be69139efabcb3a357ffcbd2255f9e927db4a2dcb4e280209aa9995debcb05f062cfaf4eecf8ce2c0162056d28e1955d572c8c106956b180216e3676d8853087615cea08ce4ce4beb2038306ce320f229fb7e08ad38480178021d2c986b4f85da89bfa9ba241697b6e061afbcf5eee63991a0f42f70f99732dc848be82ba7959a0304673170a2690b3d584282eff0f24daac0e02ce0a0d3e7f7e3e7568eba1d3689f9ff93bb896a42cc366e7b3af37b33ca5c8ad08c7405e7d7a6338f258109464d96e07627e8045c967ba4e108b0e30f4fe813b6951fe9d1c512ebd50bcef87e7cce33c2f598d5a30967298ec6729e356f481af5b0a9278c3ae7f3fc7b8a767079e27b35de840b918c80829d395564c9ec5acfa618083eb23c1b7d0f8f3e9c48dda54c3505d97cc412cfbfbd8e34c1ab0e46347857a8ec272b2376f05873dffa9fd8cbcb3459d43f584be23ec2f526b738f4ac2a71a14aa1c3543c8ba38170b3cc244078cd72bd9a1c48b047cf55034d085eabc18ad5e991f77f52b328104856ba321b663bea0e323c1f225607f0c78c0efc7664098d300630c105082f50e35453121a8c1aebf4aebe60dfa00b5c23cf513eb9220398f567b44f691fa2b94dfe17668a14baafba1bbe21933c4e45c2fb2443a3ec02d49cca4c7069c6bd9b1db25980535834c9f0152ca910d04939e3c1091098e8172cd79fc6278b9958077f90c01c691d2eb6d67c5385d895006dde3e49eaca6c08a60892d7f3cb70068592cf03b11eb46c0697ed0f7344d2d76a7452879925520289ef318792dd5afd897c0ad6b2d16c5155b63b725b146c67f0904e29478c9ecbfd561cb00ac67636850aa68159c1b43c3e218e1d122d62c12d4e032c25104616fa3e9afd5a60b288b9a17794ddd769555b08590db2bc28f9aa118d4158bfec6a7353853b5e5fa93d685a573d3436aa3c1fe69605e23c9dd6f7b59e78b867679fdf9981af8264775a8f6c40c3420e647dc451247c0d51ceb2680fd0f8723096f54919c32b571c53b06c3e61c819b389bdf3abc1375b73cb57951b1958c5d4aff66099fac49db4950e004e14898474b138615e280ecb81da97b965705d0e24aabb57082700d9ede70d8b1f7ff71d5260caa80e4202a3d9234a211abceb195d7abf7d7d963d110ecb8738d077ae3a07739daa6b44d130ee332c601a3bb7ff87ee887d6d3349f47a8e7c3f956277c564fbdbbe4b42735d0be53ca19e08f28137b60503ef049ebe55945189908d383d9948fe589be188471b45e673edcd09ddc111ca63cccbd1a559a5e1264828691efd343c382678cfe00e1dff10f32acc26bbe3cffaa3871e4c987a5be1f579bd16a37f7b871735e16529c49ef489d82068c4a19034d49d080afe83cb17585a441449b505d67f215830ea8bae0bf1461d7a757afabced1c0378354c1e6d11771e486fb6addefc07c35beeb0badfd4ae53cd1994b011d672d145d334a91aef690b179fb6300638c346c2b2f0fc29ca0d6e6c37859e2dfdac472efa05aa6c5a47597036929bfa2d4a22fca03fa8f8851397c3a976bfb9b149b27ae29c7612eea9f5db3d99ae6c314814549df0b0f552e9c54036ebb064a15d2e6f46d8f58de49739e9507d3344fff73ca641f1d7d908d47e9752db6b33cc3659ef01af1b9b0b8705556700c6c0649d08f30394d1eadaa76f324250f36895cf4454d12396889dedb2cbba3afc60e1bd6e9a21a73f08ccc2f38f2d252688f12bd9809b136d9643d123677f4e868ea8c39c9514a708d49e6124c71e2afad1f435f5893026e79209b63cfa40d1f8c13fa682bd74ad313dc2a7dba639bc229410a5e8810566ea8a7cc46c31210f2a27c6a11b08ac5a1070050000000000000000000000009b0f6d8289f76f33ae3e998bc54147bdf916b44b05b5014fe1563745117be62fbad5bf7acc47f72f613c163b1e82267499e2b24cb053f33d79ea8daedd0b6a9703ef2bf8dae7fd73fee6cc353d432063e52f853e9f5ebf3b07462c8a510365a400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cbe0d0bcff0709cedb745d661e7d51e7e44e41ebf3bdeb7e9c5526c30631875ab5d4645bce3e8f92c4f2cfa199585b97e331f2a70c8f594a707a5f5d6f41675e5da2488e67f13d4fe92dae26ebdc8ae8edd62af73e715bfa9ac1f43fb8b3dfee4f51c77633f28363cae5b8059871a338428736a3464a1327071bba71a8b35003021a7bf08758aaa4ee562dd4d6d5d9a7677dde3e8920775187fa8a35f44a5aaeb103173edd7dea0bcf4a17b4c385d57e7d6dca126298b28f7fa4cd2158f5e843656f0a07d11b9d394b1acbe7cb9db19e5936acc1aca2661af2c288cbdbfb717a1bfbb9c6b490cebbefbd6030992daf67c7d12b54841e3b5d8dce6942fe668c206bb0ca031df4dc211f95c486b0937007b1e6db3df374071f8a44e939159b1010cd70a13703280212273b12a2f3f442586c30fa8254a451b5482ff0446ead30fe8c3e704e890323846e7b400c81b1648d3c800d25c3bf6f5db81d78fbd24ae5ad6f568252ddd402033d91251a02770e205c975c89bf1fc18ae9b1d1e1c1dccd2530abad7ed73fc7020adebc9cd5b345502443735f168dd3748e519f143617f17c39d3c4d36f00407fc7054a9f9f8cdbad27ec9598c3d34e4ec315feb57f39556fa84ef67ebe8b77eb15753c4d9f2c3005dfa6782cdf269996f31c2721c3c72c816010e02d152566d9ee5022ec8f99c504c769f7ecec801d104f461b965cb55a35e2fb9d9027e9f686351a9764c2ce6a93c480cd60bbae0f0bf96c916db274d842b5aa02c7e83cfe1eef32a3955700145db1e99940b33f20b45ba3f82830b1c14d8a3273a0492434acaad9ca42a21418f66f3ba227825c07c744b24d915c26f88de49c70375c33fa7f14e8a6d504f0d30cb599e7ddb88833d065270dec2f7effff7ee73fee142bbac99fe184a87cb6e4c3c99dcf4bed8f769cf2ab6f937577b545b04a185e32d66906322b12c25424e23c3c320ac4571ec2d57068d76ee85d7a8c74bc8c853554f9046a2514641567f702c2e93501e755b6c5c5c3585e442431f57dcf02ad8d2e1bc20c73b0ef34b767eec81e0c2751cad7e065994471fc88e43ebf480797e316576d30bde2f444ddb1634a6fad87725ce11331ffb3965d5a272ee62d828cb4e8f202da04f443ab7be9de4521b845136e249e25499764fac24e477a8e8411a6cb62ea7d863fa3eed013958bc60daaa1cc8e1d6939fba237c5663a0b1cb86b1bcfc2ae67a5fc9c7a20bc3d6a7639902b765f2d78330b9c716bad9a6a6bbe4700f2214547ac66cfc718e03f0dbc620f873c750353d50185a38537d4028f50603569594a485d587908a2d6eec6c06c614d8de9969db8ae4fe4bf17c35520408bc3e11b089a6cdcf020d290b238171d9d94f67e3e361fabe319a1c4de5fae469abd0c2903b16b118f7283cdb0d4120262e8c3e04832b9a9aa7c28ccd9e4807d049fa01f462291874ae21b30d64bdf2490ac387331e4f14202cb13f7216ddd9d8c0f1a31fe6f619e0f5b5c92c89e660c7ed67cc6c2551e8316bdd635100ff454192c9f19c93e6e0b8ecde9a42a2264de4c1057f422a1a775e0940cfccef71c00b5a897acf78689a85a043bb97034e791c47f1a5aea9a1cabcb00a0081a445f0b2f4842aec8fc9436e396731630b4ba5590935eb01c67a1ccba3af0bd9ddc41656416d4c4e960732ddf2377a36dc5e5165d5b2eed1314eaec7aa60c27997aeb804e01de63f6090e867e94a6d405fe979391c82e62b2b0c27ce79ff5486c36c4471e7b2d7e354c2a1f81282c1cacb0b43147c5b21e6cfda8599a85659fef99b61844d400318d8cf02e4eab7f2e7f0b5d9de110e9039ef9aeddd4b8de445e3b5d97065c8a7284e4eb6597d35af6b31cc6d21377717d3696bae06d36b7aa963b0093df8f692cd137bdba8761b7bcb350c02c536e84349148cc0dfae406f7b4c5d974bcec34fb03bc44110f53eba89033edb2c6b49daa1e3433e1eea5d71411dfd3c06cb5fb31009aeb53f8d6ef1eaec44d41f81c4fdc99730c5712cd0d5832211f23edb6c3fbc4c7dc76c684f520a106b0217cbdc18370b3c6830d9f9cef0df253ff4d1ad5027dee3540e88e465d6eefce363cf73b4a498cb438ed0f0098198a229ec25ff61243ff24a2c921a557c08b18b20b766a37346c269116e70c64030d668f7fc479ef3927b97ae9248e952bb699babe5b589c50374e89004ada0cf85f3533e8152619e673cf9c97049dfd177198ac646ee596f54d8211117c893107d5ed19e1b58c664e957d5fcf7284972bf07b6e9bd96a845455433ef7875313cf61aa586384c1a76647b067869db3d35d1ff23f3d30d54bc40834193fbc32a572ad0ba022567ebb722dadcfa9a667e4a586aad3f8064ee330e0fe6b7e1667bbb32535b58d07c65814d470870e05637ad8a0c04419ee8cf61e2d0c", "ac6a655251516a", 1, 2062899955, 0, "b2f26e48aa0f534eb6668c1f1479c166aa3abe1939da36d8810da4fd7a731d11"], + ["5c04054803b922b002457917d95ddf79741a2553d5a1610c67c22b9b6463734d56dc48ac5703000000045253526affffffff10b32d1644bd7599b830b15fce4b5b4c6c7ee8610ae3069551ffccc26a39c9d3030000000151ffffffffeff3ad84ca40efb96825b6c2b53e6c80823740c6071038fbee2c88653c7bcfc10100000000ffffffff0364cc7a04000000000853510000536a6500de562801000000000600635352006adca8700500000000026aac5cc9fdca00", "63526a655353", 1, -657018171, 1537743641, "e583f2f9a50ed8ea4d5d45f39f9fef9625245187efbcebe8092e27d03fce4ef1"], + ["fc4e895b049bf813e80cd09981c858b95456a1fe194ad33863ef46df849b2566e4a436f34902000000080063ac65515163515978ca10a2d5d7ea0276029b8755a3774094be3aa819a4be6eb1b35580b4b3a7e43ec2af0100000000c0f5b4451cfabdce2bce4054cd233807deb8d3d8d42c73b824c668f62679ba1223150d7000000000095165536a63636a656aa181e65e68851317a5fd2ddded0fab7fb13889fc37ab02a9998678e58f5722e4ca5f0bb30200000005ac6300516ad9bf8aac0320d7430400000000046a535353daee24020000000001654a428d0200000000036a6a51000000000180d214020000000000000000000000003c3bedc5a45609cddf3b0ba52988a3bdc538c3f6029f319cdb9b4bdec4f7965d25873016150d5d290a5ab62961436e23be4dfd796a28645c0ceb311ff54644f8a86fb9ca133aa9e48d516c3b841101204aa31084180a695f493f26c27b76edf8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001517c967b7c4062e173506591d95ec5a4980836884870d0a17b1031d7871a7457febae1735b3bf12960e25229804e3dcf2345562140cf3a3252d9041d0bd70a2a3b53cf6241a6ebaf5d32bbf7faf449efa0bda538a743fa65f51cccaff56822a56c4e0ad911d8f28dd32ad685c873944310f002cde32501af451fc822ca8a003031a77c99b721e15172ef66ed6a0748333656c838bc3d4e666d3e601f2ffb977cd021230c37548ee655368fe062c204a8422ed67f404a8f6dbefee28e70e087d90740a05392a3902962ae2210c5c3d94984777b34c48a089a86467c5635306cbd3ecdd284194dd632d90736fe19c29842894f7e7712c143fc78ec9a18a1f060abfddcd031ab924ba1433f7538bd43a92983f441cbf3bd9741229c712e6d1ab9b1b72111b021cd85ba5604adc6507eb1eae0d473e58dd6a6195c2657a9959a86a55f3914d340229470a70e2391b8a49a4646e5aacda74aaafb725adc0e44780fefd86c367b9a1030a2cb3d38300d0dc8fc469ace34300e855265843a8ed1ea0bfe0266d10672af2021c5d1f7c857f82b92ecdf3da0f012797b14658aa2cd14cf16125d74fc8843d69c18139a1c7f6fe7f6f47507a6b98af84770721ba4d7c1bfb8677b2473c36f11ff70af8da7baf3522e0c63aeee10a2b99dec372929e46a349800e7c71c6c75301bff9d0de2b9d8f2df175248b78857e65e52a16f88eeea5bcaaf2282fb7c78a7e776f346abbe2b0ec480f4f50e483fa42d23c0f6e9985a4d2b94863388a7b7badd1ac83da51cfb81283238d8a6d50093e41e1e7175f97b8c830ccea082319e43eccaba5bf315008a3c0d205640c8229cae486a3efbe2258b4992e95aa11619eb02adc4b72cd006d45ff2d137498caf17c0fe2fde6d6bc3f15b250fa9d9d9903b7d8a84e7f6cb96d3b232ce64366e6051a0cc640b2f7b017a86c8c2d1e5293ec4789d30ccae5fc081542f490fdf1096934f19315853e129feaad5f5abe204194f11133c53796dd371f06b7be8b4302b5d9b7485aeacfeb06a2b5779ae7f321d487b16931d9cf2573119ecdc9ce85c77af8e32704bca85e8f349e10b407da31c673d352143545831c7ee092ee9dcae0555956235638e0f186d03c9eed95067ae783c499f6c0b21fdf81dfaefea276ae56135ee6e388ff314ff6f9be6570f2af20c45f3bf71a40dd414e59219ca9b8f41ab6b64ba12efd82be03f9ead12ce81e442657849adc4e6258f0c7261db42c6f82c4563eb3cb108bce1edb0b1e562c700a0a2e558ce6af6fdabf5c3b70fbd24af9a2bf27004d196d5659fd8a16d8c2f82b2686f32d17bd00d024eec3b3c6e91681885271a34ff9948fe5287a0ac39e230df0f0cd77d21808814f97b171e0f9ef0d927881f8841d57877ad5278b3e1cda1a79616cab61b7373afd1dc15760280a25cda4605e2da8c5533d9b84e24a67f871687bc112f0dbfc8a31c6255733d8796cb1751e264f10525fc7a3f259a714ec0b2601478c7d94b5dfdf9d019771802ece69e0841fb24d3a8f5a341d801a13eaba31f2cea95216d8f16f178104e49181f842502ac9946692bbf6db8d508588035ad6afb908d27e4bd7d76d4bf95db7cb743f5ee6f92519dabf9cc78212aa421b959089226c08a41b6150e51c4be2c992c87d0339a5715803f011d4c1215a51968f7fd4df9e38b89ece8db702d4c1453d8d4e2761d74171eeb2f998f78a781835179cb40ca62be45b14c18349a3310dd5ec75c3c1c254cb68b029f6810402ef35494251b8916576137a674f38171a4ae8a3f610eaa5b22efb000ee0261ea7163d93f5ddc5758429840718d2cf943da9e6a026fc8051d78781bfb3ca0bf81986a9a6132cab9ef4cab442a97ef86bd7fefbc8c56e449e2d8ef53af7dde3d857e31836528b54b765940aa5ed36af6705950bf6ddefbf95ef05d32c36a09f5ebba749d2c94fbc5a566f12d38b05b7588eae538d0f2e69aea0e81f079a6787fc2db5e5f316a1fddddc12650c0558d02bafe80ac933add8b2d517ab35eed0e61c026354c1186dc53e5fea4e1f21b6205b352522a55f2944d823c95bbee8844c6f114f53e7f2b483b93683501172837025ea976ea5d3605d107e4ee0a5033a8c558927fe0d5ba5aa2e22ad095190f59478bc2f87c7b7d198c56a9caf2cfe00f6eaf3773d349974b36e67a8eb82f9812ecf5d9d6d71f854fff43458728d24ee41e2182a1e4aa65789e26e77cb95a4131b123e216d28cc2b46bd3ede0410378c0d4bf5197253e3a438f9455ffc9c282d5038ddf504b357efb06637c204a42770373399f503cccefc40d42b07115736a57cb22ecbc1bf1e65642ba31208a0cd3d5c583cebd4b7b43f0dd2f399890a9a4444f7d064ce61a8d659f08d985710111b5d34c332b5e607a067098818710a080337f0053f69fd660807", "6351515153", 1, -982982286, 1537743641, "2a6690cbf72f41975fcd8814a1dc496214cfe05b96263e40be6275d9dc377872"], + ["36d2426e045de22f7cb76d61b0ffc82e148c31f2804ed66868ad7f0d627a6e19ecfc8a63ac030000000665ac52006a6a8088326b8dae600d2886a5c50e0e84d0e9db69893cb39edaae7b25855a9dab7fe191746d00000000000ff0c83b91616eae5a9169a99031483880563f33d9c43b3ea0f8e264ad8728073c03405d00000000055251ac65ac0c9821172bd0ec60ed50a0cbbbe69bbd4985be6ddddd1241a2ca2b5d7688de71ad0e4b75020000000951656a52630063630048d577b1028e8093030000000004526aac65035fa202000000000163db70b45e0174ff2003000000000000000000000000ac29d630d8ce808d72b64b224b263ca42137df11c74e0ddadf8d58fadc3f92ddfae09a19143bbed9284825fd30a18128fa58ae4efbfccbdab1fab1940101bb51d8603bbae1a5763f83723a3904904f881d7a27b679139968b88e72b5a185b9cd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b9542471a66bb8b93ab8101f4f097f9a2321241fbdb5708e7f3ae8470a3a9bf0a80cc2d5d505672b7199ebf079edd7ebe07bb5f3138ea436002a8071757522f050f30371787734d860add4d61da8996b76e197f8fa7afc63e679fb29c3753d1a5183ef7f65595b2c515f5bc0e5599e0254121cbb1144682d74542a352bfae99022e915f1189aa4eac7f7884812101083362e43eea3b9b3fb79a2f867b22508e0f0201092ccddc217c864da65e52602cdff9bdf0a5f267f2fd01febaf628099e95f40b04aeca095b03300f217a47a06a4bb2aba235694ff07146aea165b02da9863c3738929915a8834a0c2e03a9d64d38b77043d655172303c787563033d2ea55892502123118a6efdc9d8cc4ebb67063128b982bd837e01e75c7986c2023eae20ce22f020e2644c0d1191127d3212f87d973c51183d9f9d989505975ca5c3d777cc05c3d0225548637dba33df60afa689ef868d4f44bade5feb0032a1befde2f90c6b9f3f7020a105905935aa067588009e7ac36478dd5c8b8956ea83ba88ce70c5213ca0617020fa72f2118fc7e4530d395d3fa822cd6a4f7a91df8af4e8f8ee99de463bb693d577da34bc82730aa7649678b20afeb7d918a86c0909e8a9d8af2e04c3eaf68ac9d0661c1f4314dedf534e132849cf78334e55d7b2df82f22a17711afe5fe5b0860d1a06e98ae003085ffa127a4d44041afb87323709a1e9ec8ad8db80037c5e7c3dba791f5bc4b7236790cd6f2ff3ad79a5bafcaad095fbce70dc90cf508c0e6932de0558670ee8331e68786a135d404b971045c324c13e995ea69b138b195fd9ed456ce556b6b544228930f8c6705e937038dd0f9224b8fde1c2fb01d14d7993ffdbbd9054c43456aa38ae8a6d76602dcc374e7981a736830f0d4eab0a33d7250b6ef9a32b54ba677e8e7266c077386c462934b0a33cbbd24d63288dbfabdc91042939b714e0da072fb05a598cdba9bd452fe9a9dcf8bffc5a4a5f95db16f18d5910188d5e3bbb0cd28a71223c08886f32bbbacd4c8f1bc608faac75e54930d5f7d062d4b7091fb3f34f8cc36f7856bf54c8142f5a972c4fe614588521a9764674e45f734c9e4cca58c4a9c87fd40ac191e217e90a731b3b9e43fdbac9f2f102dc2cce6c45249a109a1f1bdaf677e11470df7b7aa076158474e8e08466bbd59125bcbbc04c49542596e9fe75bc337f92c487cf415455fcb23b5cb03b5fb998510600df6d0e91ccdb332afdc98260e96f13329b75a8566952e87761d1f8336bf7a16d9e79ee14c6de5b88f5f35492cc61b8d09cc648da3f4858320fb3829d4a0760179be6b7537b1e56714e2d85bb0fd2b5c1766f09e0acd727940156ab74b667f65537123f7f20c2cd7d558cd7c7f9bcec4c90d435a3be23ff42d976960601f77115a42b226ece2c6e5e3be8d71173d3838e5c1ad825614d12392e809bdc24a323d1746f5b6fbe2f3f58820202db48e4cc20520e19c5fe2fa13fac33e883ca8a7c7d23736082faabe99e04a2dfdfd13120abac2b53d9f4548fe6da08954365943143850056ff9b0f0351622a83e6a75def375105d287f561806b98f9a5aab6c3a579ba7bbbb27f59390a8cc1b2da241c4c6a2fc85c30540b9bd8b23ec25eded5bcb65e277572180aac553f6b0bd1d17043846653e5a3ed32a58c0a3e54454a5c551ebeff5092108ab9245f3a09c0acf874e55b85be2c8b90290449bc6d110e91c905a22f379982f0db822e76da58dd741bd1343dadaeb6ac7738120b6e9e95219e71f2aa515d7521cbf7611ed403b17290d65d3572250257a94b21b267c5a99dc069227a2500b40b81e5ac868e6db3716ca0c7c4758cbd7a0ab5fa52ee1f5cbf1fd41feac1287229f436e7ba1cab4a14f82022bb34199565032feae05392221d1f78873aee8f4537c9227b1e47516a0f7b2556353542cfa40d5ac18049e99c33fc4552bce168cb2e2f864c73ae47dd8da219be01fbed02e3c2c465ec9e0f65c7f10f2b1569a843bbb84679b9b02e2d8dbd32d1df21caf33237e7b9440a45e08c23d76d3651bee1d8fc7760c0cbbf56b299eea23ab32ecdd92fca3f7a90890ca227de5ec1ce809da2662578bff9e5c679f6638e12bbeedb32346e5c99a2dc6b63fbed7577f168b86bbd2d2c086b095fb9efab0fad5be6da830fbcaac5e238394917e7d01a2b269b45829eb387f7f97a1919dda6b60330fc4dc4d7dac599008c834953b04ce1b1f8f0fd1d7284b7eba92b042f28c8364118aeada2c366e9251e826267ad1837a35f23c512c299645a4323760fc1820b2776176fc27fe283194f05862b20d7f48b7f235c7e59b86b75dccfeac16d1f6248ad1889ac6175107183952f03e5d684f588ad06dcd6c55f2b36e0edce1231ad435b9397cb32042f5fa05d2fff8620fe6491d1a916398dda24ca9df0b", "00ac5200", 0, 2092938953, 1537743641, "c0cd3b44d294d69c83bc9bc398cc5c381115ae85f89ad7aabe5e301c3c0c1bcd"], + ["030000807082c40303afc2ad6572f6124444934e5e0d2e0ac957994198b6b7408bb4a793514b1572ab0000000003525263f265b29ba10c5f78754df872244a26d542e0c337de8cd584fe201ffde288f2251746829b020000000452515352ffffffff68fe77a8bfd4dfd57f00994f0f7b553e2226bf48d5a2ab85f68fe8cac991823f03000000065252516a00acffffffff03873a5c000000000001518f24e4030000000001004f8fc50400000000050051655263000000000000000003b09b5404000000000000000000000000787a6320be9cd98586646a50caf36e83d27144f1a478682ebd52ec1bfe8eccff8c221c40f4b9e7d904aaad86bae12aead9c71c1ef13110052c1394985a18b1213c7113f6a0315e5e990b8ccbbdc0d4a3707d7f895d0c18dae2050efe78779fe200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eca0fd46619f9a64e0c2ef0f0a3b5cb4f248f3f2f453f8130ba865c0d069e497b756a18a15acb4189dfd93f1580756aa8941a6b01ea1020d7bce5e872327de7a5b7661f2f0d1e9e3910f64e5bdcef4ad306a20da6409e03e7fe5c39fba9cc8ef4e9543013cd42c5d131fe936e525a53fd71ace8cc00b03d043e750faa58ef0970216c633f7ac4f73699dfb2043bb9c8091c00fd086f8c8c4b64ad55fc10bd13cb0020885573acc3d5537d125aa72050dfdb3946c41c3c5ea899975c9bcabfb56f96d0a03339dd38803a4031be96da383422a64b95ad6175fc6080fbc08b95fb52f6daeb438489e27757de5c156fc6b0de1ce6131fabd97bf402ee13b70e1b813a14ff70303065a5da61a5a16fe7b3d2d06bb3d38e03407b1835ff01e51c7fc08b4344d4e020882973689b0a2294b7a927994e12ee27a68bc0d9b469a25cc716d00444c01a502154caa4fc7887700fe7f1e8167f26f0424e9a15b784f627df250d43ceef375a0022ec07f11b377ef777f6070730bb56e6dd6a1b1640d60b1e5f2b9d7a764bad5690229a57069dc07e91430ce7f1b24b20a34b21cf18540a64fc906565a52b6ddad16c9db8f2dbbfa355fb6c585fd55df7e31cf909a4ce548072bbba4c5d4131ec1dd9b2225c6cd65b6aaf7b2c05b49bf6bcbaad335f7e085707f85ef1f2425acb1300eb23c3cc0c7ae8571763f53322c704d6fc78c5d0ad0ac6c71041a1f080b575002d308581e9708fa41f5afaac568c91a76dc9c1bc04d133d2eff56cb6f91fabb89ee597952875cb7330117c1f3c5dd247b485f94a0eb9bd3763de58bc87477f6331402455e6c792e3e7c01392af8e82e701071989d4a837fdd770f1d534a171921a5aa83db68e9e315cef7284ac45ee91584462ea767d2dc86e12d9b95dd3c09275b528e99dfe4c2bc05147eca4bc0a9bd91495281a1121cd8aafd88ede2891b3d83d34ff048e932e731ce15dbef7abdd21022c0309e9eab2572a1c67fc714381b6e642070c07073159870598c4a18c57597977c65bddaf7a6b0178a391b6159185e1fe4411f61001f374dd50090251d3ea804b7ea69547ac3b04353c1d9069524e824919b0451d13161117707a2b2a037801dd4319179223aed2dcce99b1443014a90608787dad2c941bb005221282a7d2dc89fdca0c2e3c4ab022ae4eeefa106f94e0fe405792d31a290c9f1c316e62a9dc1886aa451054cdb239aaba60648949060cf10e7fb126a8968adec8fff71ccd76723aef0c1830e93daa259ef56b48d30354d9369f555947788ef4089475fb50e4b240f41b13e64925270ed523f66726786565da97b80d918d73d78c2785bd577f515d6ccb1e65f408d3d40cc56ff118688884a3f553b2c75d73db039040529b98b28cc4e0af44890a930ce9032e8b5e00fc07ab0eeb3ac9524f864fc2e43c3b00020321e8a38c7f381f5c30680740f1a0d756b68e280fcb5a2092404ed1b30fe0f0064abff4018efc058b07406e290c13ba4fea706be6751ff81953afed230e6bb624af3bac81e4196684987e2a009685619d458b0654631ec38ea37c312a62c0c39d8f99052132d13279bf6a02d798b6e653b59dc655056bad9e597cadfd9b74cbf04da57c7b3a910da22f5e4d6b8926bcaa6c021745ff73a044abcb3f0c21ddf24965db457facd3a2aed2385db1b088c763c0a9a138060fbf2ead80a0546b3b70a4960b7cf689bf7e11c4c6e1dbbbcff67dd16c9cf8c3c38d86f093be420dad898af446db2f6e047d00aca3b1efc2e581fbcd72d436531916968dc90e2a2fa981628ec275bf2e7cc2db9df6c70a4b59c1c2a9c312212dc8841de379794895862746e0d6b0e6abc513e1c98b8d62b5322b14ec3a6fd628e47e4f9b3818a56fc0189d843dc395a6ff63b0b6b633b7d87ce88b4c647d8a50f04fa7dd12cab06b22865b045969ee6117adf1f7057541b337b876034d9fc57a32878b62f9e24c9346f29ce41eebd87519c8a46e1c163b487f65b58261b81b37e235cb9d4f5e7a36451d45a440d95167db0788ae7080cabbd30c8f0e63c18a8e3df8b2681adf2e7aeb87120b504714139f9253e732c7b47e904ea0362b67df2eb5de56d276760211ef5ddbabedf522e5d62ee0f4a731b5c4fca06d29f3db6842d0b6d084ca905f239e45e9ad1336a27ced411c5b6bc469c6113e19c83d7300cb64d13e0c4f368e53395f21d6bbbb04b8619c2925c45bdbcb6dd5dfc0463444cadb6633784c6510616aadfcb7b47280c979c20490c1c6dd67accead28907d0177c232d162fc8dfe3a08d16e003000000000000000000000000983e6bd421f4b96f24472b865a28b6c2101362c81eb1f831f4e189cb352a38047abc8ee15328127860b64997e92a0649a3d870996de2b37002a3ad99209a989ebdbf91ebd1411969bea91bca992f408bb26de38d7fee59128e3bf35a01fcaa7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c6c0b8c4363aee5ff217d7817de3468c8dbba18eeef69399ddf2fe0734400019d0c3009a9fa65a2d7d9d6ec2a3326dcef2b13f0935ccf632e23f07a5d7cbd47facb0f0cebc9801b00822a9d2d2629f02161cd9c1edfa95a64ea6f53fc4bb3fbab166b0cc07f74fce809a6eba3cf8637e7578078611e9f0b9f2012db7be8f80770229293928fb11fba92b34d65b03777cd90eb96e82006e65fa78f2baaad075f3d302058a2009ab1a6e9db0889a26e0ffa8bf278fa393c37510d67fc5942e095a70260a0414b782f9f940be25426a299bab0e8cd6b7e15297df48a966bd90c2036c01d9625fcf8e997ed11f161766826d01ff052dc3ab57ff0bf66c55d2a33d9e2e49bb03289e6660d2c495fb66f0ddac95a17862ba63daffe8c0e04dd32a1dadf1063df6031ef97724c43d3256bfcf8e9c0f185357e074737fb6fe10f8f5dfd731bf482ee9021a967c1f1b68949f2ead754dbe7d11549204b89a2951bb65070e248ebae215ba032dbda18184592c43e0338f9a533ee5394e17a0042c0c7b0f167b58ef2cac38bb022dd46e4ccc4a75f7f5b914be0430cb949e3c71993c402bf767b4c439549427a5536776753b9adef8edadd073dffd4b1e201d9832310ce1d61d5366634800356a5f0a1a9b7623ce010bafa6a49c3ae981475b618bb050b2ed18857110c1c8ac9540f3e53b6ade82fa3174eed331ba09dbc6eef9d10bed006950b975777e1f937c926a56646f859b34a77e7cd8dbd921d14605454e24c01859a7d1af961ceb4da5b7d969f1ad33ee6d687209fc81140a7a3408529ab6d1a05897fde16f6f8044a2c528063d0a0f87daea013f2c00542725fa55c08609f27f87fc4be53c74cf8175c95d506b590dd8ef73c1e0c26f3bee52116626295d2ec6cb23b12d6ff004391f9cdf7a291ce6c09e3c731c07b17ef9a5d9f4deb9bd87b4291c34bcaebec56b75603ddfed4681c3eea43af9c0e13446d3dcadfa071c8880d4a90338e4480b8b7ae7f5209f0abf73cda482f7d8214fc66c777db8f29afce4b2a4c3589a2879f42296a4a406598a95103da9f0d44738663e0c64b05adb47f3f135e773309e7b753ec0c302e37335bc30f560b7157b88d8d0220c6f30948ce14331947d5766015e64aea130361df72510ffaa914440838ac4375ed0a884978e1c5b86de610025c56d02ae0d0bef64cbff69afcdb50908d303fdfcc2032f0366a1b66e9a899fe6c7a43f79bceeaf83fdfc91dc0edd271e24b8cac0597f2a03a446fbdf824f17dddd833041a299d8e704427c6a4b8fedd5c123c8ab98e09b84377ee1d668e1f7fcd2e0a5aa171534038740b320eda0d586d0f1479b908fdab8176f31857cdce3d63a75599b0bd08caff52476acb84cacd2c6bb9060a4ab5026c859afcf5b908fefe0ade11a822602ac9470a41ad8c4e597169dd0a391e09cf36bf5e9fdc95e6902125e37e12bf8f22f28f57f376213c890837eb8c786355d96883c16513c0d3f26b1530b99edfc5d0a20c917599126f3e4368d1088d2f41119d217702fcfceacdfd4151e71d3765f2abd0c58ef34909cf379036daec03fd566b8c7ea12e51694083edf541fc0535bff43cb3e59c2076b653eb110d3dbc2a2ccaa59b740d71f093946bd178c095332216a895d8b74fd9b5773ff85cfa287bc6147cf07ed261f888f3ce18447173d042625aef29491b45c69bd25eed81044aef59fb7de5fe48210a08bf89d28bfdf4eb45393a5df06f8e89bb616497ef6bdd886a586c19a84ffe55b8aeae859414248bb86542921057c7d3ee14d4b3dbfe01c3d20dd4df4a89ab36e4bbc6ef232ec71d089020fdf2d8548312d1f73b5e36b10cbac651aa3079bec76e87a675a3a2775af070f481436928d186676111bc516386be0a0e6c7758290b3779527bf098dd35b0f15b727132eee3781aa25e242110f481a09962c684da53ed3c9a87763daf93a0fc0ed25d60d2bf171cd80c3000f314b99cfdf5481ae6cfc7be09626ada3a427a4fb43741416f249bde59862caa1062418b92e639bbc801b2b4e6df17d5ecaac2f39669e09d7dd200b1f105cd8fcd4dd454b207158876e1a700ab7fbeb3eea2572f81da16da08950608261e4e17cfa4d049301dbe3286a5ca0d11600d5feddfaf4736c94b4ecd939ce6c66c297800bff66631048acbdcad7c853030b87af485d6a98412c680016bd2d245daf2334fe9fd524b7514111dc54b146e83640fc086d577d0b80bb9f126839453f9ad2e3324a35cf34565f4fbb8a52cd80866f804ff088d8db9e7a7dfbe9d405597906f28d0200000000000000000000000079bd529a23f25454060863c310e0a0946d81aac1a5313299dfa077663d5dfa67c406800cd8e424bc24c447f2f45fdf592cde7f665d840f1357f84ebdae942e4f9991735c19d09676f91dbefc3683ae954aac2df02669b1e5b119c6295bbcb7c20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d16568186302a633e18be1d42a6df22ece09fdda18b60c3fca95d2eb8bb0b0e472523b32ae0fbf7dc8273767475cb949ff18f6369732ece17ab6b3af7aa385c94fa272fd163d135f95cbc0afe23ed9ca97f6c75093f91b6d46084559a249649123aaa4d49eeb0b02a27052263de7b6212f3cceef28e98f4f5ee652cb81370102096bfe9338b7d1cfaa2282bea0629192f3c659233fdcd86064053255e7ede5df020e6c5bf78c3a8a66453896dc07ae8a1c4246a8e0ea1f7f9256221231e05f88ec0b08a16941b75e008e24943face34fba802d83d08cf6e079ca17fcb5a71924a6b92b189a0cc41a01a12db43a6497b258d3090223c81396f30d94c3345017e471280323e46fc8e8ee2dc3ebf0db74d62ecb243da8ae6c939a7e7c034e06874ed99619020a180c5dd91037beca7af30a175ed9e388f9370e4ac033d9da16edbb5f999710021fbcbb0dc2be709fc12442dd4d2fbe5e2b3236677bc175cdad68fd6947eb525a03000e640e0919e2edeab757459466932b0e00cc55b5803a76a4c08cbf8f082060031100deabde5f6c8e4d46abefcfe0a601a0be0ac3432ea8024dac646fc3b69dd9128b90d820297f82138b66a417d38c0ed09d9d5b615ea5f3296cb0f6793f8ae07432e98f6b5e89e24d51fab8abecda5e15ae1b8ff823eab07781a94c1c8bd065110cceb5fc1cfc25415e79424d7d6daa5e096c01fbc29b92b4fb137ac4daff8aa058dfb4dbcd68bba8d264527ed820f885b2a6f169547358b40e7bf39b2b5bbe248e83c89dd109e30e209ec9093b9c4ef21210c9908afd02f95203cbcf21e9335a9ad41632e6921d9c69e71059c16d228359b2346079e6c9fd3cf5f07d913f9c781805e59882e65604bb78349162724daf946a6c173952d021348702891c4fa77c7caabe9123768e8fe4f41b5dd04739e5811049074b9ebbb6fbedd340d39877b4cf6bfc9f86c012b85a24b86ebe31cc7ec15515041fc183f70f1785e1256e9596dd35ce075c3970d29e677127231c5f73d7adc74161f899f4c0046d6c90a6bdba276758394556f7084bec9afca4dc864e446b65b5cd5e49653d592ddee2ca6bcd1efd58b5dc04b44300aaf3f799d22e00db7c95e83dc58bb98ffd7984151966c88dd9096d50ae7905a360aada545f5ab6acfd034519f20b31f5925591dccec9d80bf82d69b05b34cfe07b0d6b421be92617601b81b686a11a310cb7bf4d066040f432f5b53afa002ae218a7f59f7ef837e2382e2a794a86dfd9d8b7b7c5dc356425985e374e3a35f009f826c6d0624269fe3fb536d6f9660bf79fed7c6d34dba8d41ac784746dcd4fe72fce03f4ff28f6fa46ee8ec239464df3dd40cd5d5411ed6c8551d495ed3a50e1941161cc01a67d4c7c00104122ba884d3e638fc2cd07c8e9583c2d8ca9841f84ed3be82d4ebe4db0a1a92c9689a1162cc24b887ac81dee28da7273cce32bb8e6d24489c678530f57be603e9290331809b59545076c4796d82c86c4b573b8fe5e55a1dfe8e63a99f8ba33e9c1443045e157b1bc965919e1be580b9d544f39e3c20f6d79fd06bbad2db550545235a8870e055bb69562442ececce852d339be1acdcccf4096f6261b98a3dcdb54ab72e0623a67c4da2b7aa1038a61f2736c1476b9cef2d4275f422a626750c6fef205431b34ed727f74b4fffde1118b71b66a7519c84c6e5e731502b36a3e343901891670bdf95c531fdc0ec71b30f4ae865c9f88367837a291934cde9038658571c07f5191f36bbf3640e187af4d117a9431d04734f627b433271ca0bb6f4872ffad18b6a7b57d7cbb5d2fd0fd95f39bc0ece534ad842013a0e52a212a9258de8b35004e28acd17778ff866eec01523a817f3c4d3590de6566a124ba9e999e9abe1abec331f1d0117612183fb8aea9332e7a5f237d9539b7fe25125d832863d69697c8cf85e2c95bf1fcde68ff55c6ee83c65d99cc75f8215e90f608e0882b309ffb01e75087912822c4b04f3d15f77968252177758379e0b1e2fce1435201f926eae23e51116ea9289c4f33e58cbfe795cd6e1e8553c6102023c99e295960907495912bb37ffe60aeb7df7142ea387139929a01d7c22097c11b5a49e5cfa8dde0f93451b035c6bc9988987a6b7c5886ba0a730d2ab0b8fafef0f5d909b771b69d9491b29077954a4a912f7c3de0edf7efc2e2e19610821bd6e1bb05365ca430c5bb75c7609309a9e467cd776475e6fe9b60be5c27b77be91a8d17ac882b7c1ffd3d224560a1a8bcd45decbca05f9a371ceb138009e244c41e4e74881be940384bffe59402bee1ea235261d5d857bbe4743ee61b6f14b8051c5ef0f22a3d22b34aca23ac82d4bb845bc7a12ccd49deb29e7ad879dd11a8d29f4f871430b338ad640a7690b6bd85840b52a3df2c724b048be78fd54f846fc1526cd20b", "00ac51526a", 2, -1717578426, 1537743641, "d348a8f06d4e0aa3337252959170642ee9fa67d515c9500a45dfa1e6acdf1559"], + ["030000807082c40304e9b69e59533e3d5029937b848f74146342d2cd79d012d7326daefd441ba2142400000000090000520063ac525265c519208600f27d5ab58abe8ff4fd3d8bdda50c9fd950559732baaf00d149117fd5ff4a860100000000ffffffff6484a7e82a5f50a08dc30880fd772056b2a3b9fa1f963c9f699a8fdeaf0c4f7a020000000452005163ffffffffbffcb13d56dc0dccc5a3449df9d584a3fd85fd0c0ffbc26f6983d7591d5afdd70000000000ffffffff0224fc5f050000000000e190900500000000046365ac6a0000000034ce4e78020000000000000000254eed020000000020b8f7894e1da20ee7011d3560ad8a29a8cc565aa6b2b8267ed86747ba7296387e026eddeba27f441430b7f848d3829c675582c82b9de9e34bcff2607e95561c450ced96c4b82835ad478a623605caa5296773d30c46ddb6ab197d77b35de5c200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000909171a6663039956730333552d981665df4dedf182f9dbdb2814629c6cf8946ff38e291e68f2c246655210dfd3f09c7b5c24d2eba9d90841ff0a0e7b102b6f7ffd1af4049b39a7158eace0a4f7f20ab53dbba179b4fe66b86ce13fdb39d03205cd3aa92be242c6ec2019b29f67ede96568e026cd39c6c3501f108ff358ec0cc022a9af4e15d03681441e1d821f83a3104160c72f1ecf0a94d0e7c368bfad7a07d0310952eee3e0d3246047a3f9b64f56d8c52a0ba2f328d859535a80a38568e44eb0a04d30332b7afcfee569fdad657fd6b4a966234b15981a2f5e2aba0290ed5f64fd2138d643041ac9ea93648367afb2e4a417a3bcf38945f1b2330b93975455b2202238368b4f8930bdc01446bc3552c56a0d53829f05b7a72ec84fc5c66719aec430319ae9d164dc86854e210ddd1d6bdb360128ce0f4e5e19b1c533c5b0afa1d9595020773fd773f279604f1cdc606566a65868ebe808d4f49cbeac7d42d952b167588022f8d3273e440c0d6fb76c0f744a59a5c747c8ae688699c6525bf40ccd7f4c43b03222689087e00b866273a5a973728a98f2676b2a8e8a153ef4ede11ae7198ed44ac35ee7a078b612475625d1b2af747788ef79a0ffe80cc87f9e05757f43039157c43c943b5743c925c414f83deefcff19e262e5a436b9e75e3e7347a4e2081edee3b3a22422066233ca0eed1a4e686df489048aacd3853a8839c3d5bcdd8f98e57f0da5f1feb4395aac4bf8ee9739f703c71e4902866ea20705337b871c9dbd691866aa7d370759e41c5a2ef169854ef62d42a5848350e1760ffee0f69b6e12d4878e4f310e8e017960ad1f6a8703198cce1143f5efd71512185ab255e5c1db474b01683df4207628c78f9ef2297c1cb871159d1d7de55c19e7b8f00ae109e1a505d49e92be4d28e15508a39de87c5eb6a01dddf1aa290e13faee9b37953b22ab3c1df881a90479bc75b662eb1037920fc9e5aca17451f2abd780a930b67e25129d1655f1149e6510d0df82f46f293791e085ec61d519756368adabca8686bea92a29018d724cdb4caee3c32cbdcbf00f587d4d0509d60cef6dc9dd73ab69ba366b1cc9a9ccda7429b041339087622cf1501c01b9bf8429f1b9807ea665cf2a811c68576dfc99f73e5382f75b6964d6fa90a8193bf883ba18bd53a774350ac2279ed449e3e9470e8c5c7354a04fe50e4d15fbf586f92cef823a91e7e4c2a9dafd97bc69deb0a6806adf1e71a4f433500b5156a371cd8623b9158063e7274f4b32acd4fd6d9ef0a786e7874c5ac25869cf407f4e1b7b7d57150af51eaebfd2bf1f9fcb8e31e9b6cc760a487b9b731708623b23a6a927d711b77b036fb3a603ce80d3bdc4eb58d62a8b8eb858727b15be5f9a1a164b5f52a301769a1d3512c82a11a9ce5c8d178516668200b7b39a6047f9ceadd91ae81b5e7928bc30dca14b45a74862669c05beb08ffc28a9915a7466c2ce54feae7eb065b8a75b12a0f4559c779c848f15d3d1fe0f6866f1cb8d7672e67f460662f8326ff73d7bf02b337589ffe198fe292481591c8748f35cd2bd34b39ad8ceff91e34a2cc639e4e476f867f7ff85af268755d1d8b28dadd4467fd430f67344240c40980311eadc5e7141da81644362f0f2ca48a5b96d0629f0f3c7fee6b5fbde9a06fba5b19f46effd2186355ff994c87354dc1899e3100c9d9d4c80ae38abaed5b366ecdfdc0ce9153c866b6ac8bb9ff6159a155a0afa53b65e92abc38584e2d1107b8dfb7606ffddfd2491bf265e69e776d12cc16c639cf4c474a084d4c295807758de833a23284d1ec61f1f0bfc02ecda36cfe711d09bcf3df793814193602ef7f4648951f16718b27c9501b8065701c1f7d775d5668df8a0f3dc9b023f19d4da35f2aad3955f20849574160c12f6c2e13f979412f01a174fde2240f0b7e3a774eb6e2c40cc2b64ad4048f5cd3dff7472fb70acf01ebe0629a340c672ecaba5f2212976c2a8a5c489e9f2d19b140b77742d2714e005f09d7a049af41fa421c926311d14d8134228a89792dc9ebd8e88b87b32c891709bee9c5d3f737a96a4f41e34579b1cd7fc12624a5410dbc68666c26ddfb9ad1b6ee030404e8598780352cfe42d0104eca47236ccb9c1bc2459d9530705ede7c63ac370ab0c59526900e453b73a6a3058974166b2125487335399662d0a16fb3017bce6df6f30b3110d7d697a5b7cfbeec51ebf0b6ef2a383af5933df7f042c1f6342c02ec85cc6be173bef810eb6630acf1f9ea62207f254f103b0f61f525205a52f26109144d0000000000000000fc1aaa03000000003f0054a232a11d741571157fd0bc74f43382d23bb5973818099f6ac633061c536e23a6bba86f85375296026f0c75d62f6d00110559122a9bbcbeb1596898f773d5729ff6bf27d9f102fdc0d13e140b2f3f6ab52d2277a8d052e3353d4426a153000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002360aa903bd5dcc9567ae54534834be2bff9a429f607f96fc83d0927a4610433b3f98e775dad391495f13b0606709d0dc33ee3757d64a32832a2b5e508c1daed7a131485e6f0729dc8c161b707c527bbaf059d1b18ca14ee25db78c207372b6778cafcea1212c467ed5c366284aa12deac84086acdbfa1007351ff730b144d4703131754430c1e6a12dc7210869cfb3d63009b4e270e96d4ea45a4e7049403f6760310a1753a5d4f7e942b2bad408fcba5b6b351588eff559e73f6512106da942f410a02035bf641505f2e5438f840aa57c300397e7fa85247bab13781f9b2f395cbe7c8992ceadc4611d7dcc6a586a900fdc434da909a66f4e3ab4ef8674aad9bae090200133dbd3e00dc3725a129615d8218366e44b667fc26be617c3aaeade16c30d30311dbd089fec11508631d9c0b4a6d0d2ad6a4d6fa0b3efb859f13105409c28c81020be8100ed2c1a3fcc23ad960b071a4ac4941e558303c4e117e5b68a07e5ae33e0316981f9720c94601ae54a4d3c0c98bb918c2028c5dcb42d90df6ff2bbc0574fb0221e815ffccb674d5f93b8474bc9a0b6c579db503a4122db4d651472aab7295e96be27756712f8b93d89b1659cd9b94147cd90cb53c7c1b0ddc7ae9a0cab805550d2ea6081e7eade259a1482918557c864ac4ea681344b1d5db17f792066ce2c303baf16eed4acb7ef2f136abec93baab18f347751ed3fd9a78485d422374cd9b305362ad38f693ea23cac37b8eae310ba7ad255fdf04cb25af9cace83e490faf6cb2f9d4c13326c18f3eda0df05111b1528243f3f6f8fd0653d5308e626281106ea61dfce04a2e9ebc8e8eeaa379fafd0d405939688aa7ae33751fc899b4c1b3698f161b7ccc933dd541acd7ab2f6425f3a01657ac94db882f592188450cea656f5651c3ccdfa757d2c6a6092d5522c536b05c7de668e29f50039c7fbbffdcb2a38fae585f095eac5e6c9eb9c5494041e6348a474fd11fd0063984199a9669b1c00c50a8eba18bc230855fad22c5cf54ef9632168c2f169f7edd23940f97d12a50121d177e52880285c588e12ae05042bf020b53ddebf0e7ed7b3126d332d37510a61440e831708ca31d89b51259124d53cb15044031b507155c8a67c12067183d7c39bfa0cb897bef082efb1111fc3a5ba634ea4425d409513061f9c36881ebd266e3decc8d391410b5d997813a5e00df0c196b6069672865b00fff6fd9da44194ad61f12730c52402450b2277386f4fc10f94dc630580c69e56848cdd4d1f84498d59a351ec4b04e731eccbbc88a3e3afdbdb09920a920449e8547bf8e92c223fd50b55b4c37a8589b3dc3b4f9ff181db5b99e412f30f79fc5bae9a2d9223088d39abb8129545c8f07b75ec5f25804402808799c0414aae686fd500133ca118c10fa976afc58ac5062ed95dfc8aab3840b2093e4d9c13a56b99f39467a2b4b87b52bfe0ccf5618440180cd96e25a6c65e6c74adf56f3ef5fe0b0bac1e1faf2786ea6fbd8b4a7f0f9fd4d1d020639ab7fdfc74065930a5861144f9507a77a0e8c51e9493a841e4bc353a9705b7cc5b015d05fdceb10a74d9aa62ef0c1aa216fa875219fcfc95a3842f69785e1931f32f7c9ff60cdebba1d47227626478f4c4080732ed5ab0e6f59d43a882543fb6eab28e0fd0be8ecde8edd67b5e6a9f4df96c88bf816a8e35d07d0fd64961533fc075902a68c4437eae6cf626460b21cacafdf242c0893b8e3e4c71b2ce0f303b569094d86b3b0c77a3ecfa931ad8aeefada615af5ed70147b80ec494256962864d196749746b5b1c530047d7287145f903080554b49a0f39a1c27888f97e66e64f5714d5f6a6d289670007bbcc2b8c78fe4549fad28261aa27d02666d0ad10f763f8e27eda5e20b58d3df39af8370115db0ee441111b0aabc364e24d8b1cb83f94891c45c7fb18fcd6f1c965ca09fab48a64f05a3efcbbace2a57d69741a74d182ab01a1be9d5c7b1d015d52da288f1697c28de212f14519fc4b21e790906eb1111f29f4538252869d986447bd91a91e24eb972a09f67a66d98ad056d4163e8a8d6f980318035482e8f748e22a9b2f8a0d787aea23c2820362821ff8f67b158200b0f184a584e319b3a3fe77186a1476ded65fa3e003c117dafb5532e5b6feafd31d03566e05e6ec016bc445d93b2dfd0e133f7163d14002fa647626f4c166eb706709baa5304498c607d5620c3e25548a79f7481ff599f87c50b7d2bc004ee5e3a6b79f14b84fd2fa4e22fd771b54e8c33c73c559699bac14f99e46590885940865accc7bc22cf9cb383666b83c11f300f334413765e2260f60e696480dc5c8c35eae4c77f30123dd88627ada2841c096d14d8511ef7f7db7c0806b03edd1db8b30a6c8410b093db43effc691f6bb07a906882dcdbb752467545f157e32e9b702f1608", "6500006551", 0, -132542783, 1537743641, "393e9d0fa5532b6268ce40a281fa5425f2b40f46dea575d7fa36ae95508951bc"], + ["030000807082c40302b695d293c94c40331b388281dbb974c03ffb4e5e717a43b64e899578dadd7ed600000000085200ac5153526a63ffffffff2e49ca1117682da2c762cb20b4422f913202d1f3c7b65a2acb700724a1d25d3b0300000000987d8c6d025a2375020000000001ac7e5625010000000003005151000000000000000000", "ac005251ac6a53", 0, 2120921453, 0, "13877f714889cba9e2aaa7f4c4c28ae095a96396d05a6c7234f4f0cef195d4b7"], + ["ede6c64f03775aa7859bcf4d2a34502bc6fbda14d2fd192b9d2ecb30f830ef50cb870c4d0102000000040065636affffffff90040cdb1e94472d2ccbec109bf45de77a4568e82676853af35897566f7d55740000000005516553ac52ffffffff915386ee987836dccfe7716ba88f3e552b4b05d9368a380edab5e1fa6f31431900000000026a52951ca5e2049191f900000000000300635264067c0400000000086500005100ac5300cb161103000000000965ac650063005352535a741e05000000000352515200000000030000000000000000a2beb3050000000033c552a4fb523cd43decd62674071b2e9447f0e8cf2ce731a8e6051c1002d43f19ff197d525b7e796e5e4c57d3260304b61a9f35fc96f0209517cace255744c821c0e95f41af06d787caebce32e36af926f682ee52397a7dd1468c1d10b3c65300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fadf5ae8b28ca304c9ece9d5083b7b022b7fd0e85e3011dab44f7d69e28f0985cf9584306f6f58e1abf36f37e6c49b33c4fd0f8d3992ba3d2acb991519927136291b3581c663b9e0a2dd16bcb7dc6bd2732cbed6d0276ade4689cb1429c1eafaf21ec9368ddfacb923c2669ae287bd01179cf036e59d0131be9bd09c435b4b7803236007ecd26120b9e7c8a20b0c12c63a5f5b1ba15137d69fbb06d6b843c5838103301a1be230a6439727506332a6c9655e684b93d3df91579af76fb390266f9e3b0b037a6fb6da9ebf31781338ccfb2b15893d55594f9dd3c29c55ecb6bb6da28ebf6504aa0374b416bdafe9ed47f6ac7433d030e3538e72838bb639982baf1c725303241791c70c2cf3902113571d1387661961bbac500cff2e83999a3e421c89a40002291386b6d3cd058b10a39bdd35b946039b74788389573c02d9a3368d5352f2020230589e1e397ce84ec402ff5b4976f55eae130bf8af04fe985b7aed000d3bfaff0314eabd745670f8b666a89f3f76a40982c27a62ec2b3c0a26b47b5ac669703060022f2df340059d6bec2923feeab03d901268ba5ffe0bd1f2f6324a943e043dae3a66116deca4e173ff702f4c17eebb5ed48b061a9909ab1d177f52d06745d25b9f3f307bacf596ad1343e2a4bab8307b28e4c7fd8e08846c54515dc2f4ffd7344ecf4108fa5c8e5774ec2fea955ebea4395489db5bc40a862dd5c29dbaf4c12e1e7d586dec9e264b8d1ec96c2cdea53b70936d5022b19c56e7840d10e35a9f9dde05e0767b2c1f6c4d921f312e641eb7332c6c7ae767dcbca2d995c5d361b0f528b8e1f62a642a819a48db66130edc90b16dc25c4894d9c1bd8f460fe3a071e006b5d4d1910b456ea6bf416ae3d415ec8c15feef978a05343339c8543b720c4d3b873de09f728fa1d79802e271389b92b4a413e8703ecaedf21b056eff2abfdc87d25b886eaf85acb30ea1f5e8ddf1b0781285da770b148e57166aaa0a20e079c4ec2aa61f10228061cb6aa587105d98debffa0e702fa3e96d2c4517ea1b2b092fc9331040cd444d59cf729936982357e3c3dff0703308a5d08dfa5cfa5c72f0bd385e3fe5c381fefcb3dfdab27b1e23a542a02583318393c4093a289507aae5c2003e9cbe76b19fcd28e1d41f1fd963c35a7b0aeff2378775846761ec66a7dc7ccd02b5b0fe1a5e9b44ccd5cd3c406044acdefd3f73199a8ff5fc0beb55620b702eb69cefe64673923c3900b7837e28a519e9e09c6e1b447f7a7f5909bc1b444797230c8e9f733758ca045dd832748024556ed9d532d9fb970a5ed982985fca743f836946f9cd0bb51bcf19be0a52a4534b1f4ba8c10432e67f06a3de74135486267f2d4524b344303c6cb712340853a6cf31a76bff08a89a95bf42acb6fc1902f2deb141c32284b6c40278396b426b63edf90f2d8b3f9a3c5fba7cd126406bdef77c8ad9088c42717f1de3daebb4b7918d0805d61122a2e45ac4675c282d25938ecb524ff2d5d390ec894776cd57d27a98afbdbb43f82d5feb9a9bc2a8a252cfa9b4c96b0b65da74ef38445b9076d84828d5d6a1ada783486f6a1cbc51ba1aae4bccae8ae27bf829742991d385c3fd25c874b89dbf0496c41466b2df5eb874b1a219c026cbe352e5a77e854dcbd76dd682656714234bd75c83b5fc9cf99647bfd3e12786d716dc389ffe192518950f1de1ef94dd2205c22108c08b0277dbe4389a5f73c02393dc8bfc6b1b74a5fe1c63d76ed2259e30519e1f33849e66bb0aa65fbb5ae463939ccf1b18e1e9fea82e7d5dccf9c434f9e02f3ab0cd9bc03b27d22b64c98f3436dfd01d39b11e8fd272f27bb33c3457c853d1ac4d2678074657ede5ff6bca21de4afe4819b55e3258b047f75a515ef750bcfc88f85da667f3574c4ff90dee5787f9a376f063011a2964bdb49d1886ecce6278281a93839db258996c115e6952a9cbe72999b062e12f4ff7c817f84364ae84637de2363f926b5b2bb1f5d93c9f55aaa0a56a19085ab0b7ac91067760418f73fa5dc655bc092dee64bad189f631c0361d302c61c08fc29ee20ac5c2b01404407c77138782f8a2f8707c6d57385764e0d5966c5d5804370dc2ad6a95a5159afc0e594f1bd9ef9231639b95f8c3c4acbdb883f923973ca6c67a184160405061412d2a2c344f5eecc51bedbcb0f860177a605384d89518a9be113f043568e693f11232b4ecbc3361c3370be8e5f38b0a5fb9dbfb28cd44d21a65ae719143d286da5472e33294208554bc808dded37ccf9a0742370f5ff4cb72fdcd43000000000000000021ce020500000000de1b53b94a00e79c50fa51f7c87fd6386846b4b768fac54c57f653e578d0db0324beedaa187493f2e471f8702a6c8b1c77593ee1cc12eb0e6fb9a5344881b667c9b56208d802268900066d1f89972a03c90a11ac4a5d00f9777c0af9ec1b3682000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006be8fc77a36f622dc69ea42cc5ea23320730cdd7a02dda2eac398c433a8f29a67a6d33c9605d89b780930a534a4849204a685fbc1f04bd8c3581019d62f5582217d0a4147a55ca71985af1f05aeaa45b371dfe7b78407a6075241901af07daa607c9f0a0d1d0932ea3bbb98fd3d106867db9e772cbe7cf2b8fa55ab6dc3f296503020c7d87d5cf7c070a53297e9824dd57e2f81fb35e7d7549862a1cf6fcf098d3020d623c1a22377a9d35783136ec5b311256e544ff307ed32ff46f8db2f0b365d50a00be4866669cce04d1dfcf2803a369f0826866b18a05a309554e3553bdac76dbf13e99028484f8a213f9fc3515bbd132260c80a1e8ef507b1e7105a5d66ebda10208b9e3c262107347d1a3a4849f19ade55be75a0bd4517cb9918e5a769380c9c50210a8e3d80b559d6c6b5682691bc84b7211f690bbdf33f3de07dca0c1e504084e0328b86115006d13546f1c7fe971312450d6f2df4167402b5ed913b45f2244fed7030c30442d5bba34f28ee745e1c701059ce6ea6cbcfb992ddbe34166a0ab51541d030cd8223d752bb8c7da35a742bc07c9e165e002fca81052a886f79cde93f673f9a81e3f9a311e232326f1231fb8c8e56306cbfad89bc2a1dc783a1f80767ca00774c455b3b88559dd955c42fe86f58a75404c5acc8690b3dd422dec8e737c3a18d8b9456e45cc7eca830640bbb29fb32b2f990b72e676274c5a11855c48f9be95b15be763a5125a5e79d309a8e360fe5756d168f1d19e797bdeaf8f93284376fbd6537225cac070d7c39cc4e90b43ba2615ca1dd090b6235d46e0171846fa02936eeef967adcb108fc003bcc917dd4ec19f03aeeb00142896288f6c43ce668a24b42d1bb52c12641467b1f9c3aa9047531d47e3fd45bd6a189bc7f019a004ba8465327653c9a25f4c026c0ca6974cc324fce5cdf82f446cf18137f7ff4d376929fb5eb66421211eb2f453037a93354c89f33b9502330c36f38d41f6d3cd77be8155014deebef807f716ebdb589b29f656252da7e203238cf4d08b699d9be91e0c4facad671242db562c3552a20469191207419b902914d03a5848fec92f945a491d6d9b60d53791f48864ea6f5c51867c4965b5da032dd3c3d105d40b4eccaf83a3ce6b314340ae955860401de56bb73aeec390a29032ac9fb298a8a2d3ce35b0cc0fa9acb1772fc41b0450000b2e08072da79f5cd1a3c67e2131322f53f0d2fef0beaacb725123e8f145acbbd96bfc32b6030111a0073946671979d84cfbdfdef650ff01ceb6abab91d8870a6d4d2a4f992951726d3085e31edbcf3c0a7ef2ff2633db5698810b44e4c2b6d1a0284d1377e579f0b2fd9192f85010582b60c67b35ec516bf78dafc215614a854c7fe138675eded5e902b7e94d86fa1f4ea28aa183834fba281a36fd23e2a4ca73658ffe58ebb0d2f5604ccc194cc7980dfcc5effa2f8263a8019a4b765560b8888754e21fb0798b604f7155d214a0fa03428fb4497664b60b4993c18728d791402b9d1df3050d840e5fec127c6d32ffd671b91efd771d53aacb37fbcbc32a7c7cd62fa364c10601bbe052b71e7bb77e2c6d39a9700470e7fa8e21482f25e4ad2d9624e7531ee198cd42dbafbf29b21e78b947ff3d08277bfca064a4a34ee7af24d9faa21e6d6733d0134d0790d33e9880d9fee022eb85d21255ea5e5b24f281e5d83453e98ef5f4966bebf2c7cf1890a3fbd1ef25402fb0b98928ffec4e7c72fe909cda9a87374da18a52b4d314718330552445c1741ae4b2f1e456455ef13cc2a6506370a77af766dc1917a9fb363ec328a5529c597e8fe183708e0e9fb109e2b822a92200a8953268ecfbb02ca57b6c71e112c39b21d3ea47ead7359c8fbf266e94b4c028d7e40cf67beac3e407b5294d5fcd07d5265407c04c924d2d21abad08ad91c9643425656706260a2025620c71760ee7b54374786e758accc1b645946716c3ed3c26473fb9c70ff5683967b9e4c68dbda8cc40c3ecc0c739b956c4a5dfa7590fa724cdedc3a603017a337266ca88ba93715e4579f454715ab54a7617c51bc8f7f9ca0206a45212afe49dbb531c5ed28d7171162ea54f0ea5aad937276c6d1005bf778cece7d646f0d9374eb71266ab062e20d49750b73ffb798f98700c25e0e3766ea444a71f1bcdbe30d531507c9d93bd606da506c84df1d2d25d356a7fade8cef6113bdad951dd358e422ae859d908edd935bf03ab4eab9db61caf3a12a6c9e14ea63ef8307f7c135a713cbeabf6fdafe76472a762a05c6c4c5206cb7b5c874900000000000000002b8ed504000000002e9dfdce804fc1e236e01717db9ee7d8bf7f0b0c01bc48bf24c5d6989fa42f2dd7e0f6b71d1835500a98f7e1a35e7cccf51be02f1563207e70d1f808a6103c536e24e82710680d1c6de960ddc1f72e8204e4f79631f1f3dd692d4dd08d78f38a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c214bc3df0f9cad1002b021e8fb96ba77f31f0aebfd1865ab8ff92a0f3dc6396d2a70e85d4649e568bb6604ebe52df227b41616d411d321fa681c9f1df9a99fd5b87acfdac79d53017beeddf4a268ab234ae1479fada15c0edd549cd8ca880338844552d806c3c42bdb36a7d23143d95294168a2a7d9656088300ac8b704a805021c9393dff440dcf92f6860806832a3d80c18cf1b450d4e61816409270e7ff4e9021e126a7cd541cbd759a721f5b585004fcc2a3e732717dd82c3cfa4ed795f701a0b016f32828e4452a8ebc39b10f5efac17c2c5232fdaa82cda251d1731c3f9f93634bc08b0cc2887dbbc39120be5b846f3eefaac9003c5daec4ec6fe2a5992d824031851c23e1868f1170734a0d3a3a8060c267b028f09d6e2e4fc752d0b3585ebbb0228f558103ee4becb92e9fe24d272e03dfc3e289de8c2dbffc3807182aff20e92020fe2344677a44cbe35100455369af585d6e93e39d5b366d5c975fbb6912319ab0206d45765609dd5e554cc2c7244e6cec6d6ade737253140f9bba5db6e75e9d8eb031e46a87667e4fe4580db8a71e84c0cb096d54beaaf70c1e1d7b66bc5b96c2ab0fd6f95f0633db4fef75fe9044cf959194a195431d6fa335b9e459a6ec3ef42299e7b3be6f71c069405203d18aefa6d08d35db0dbb0337071fcb769cb7b27d35f88534937f4de9d33b7b500e2dc972e51f22430894b09e86d4bf4dd28cf218f81c2ba5ed1df47f1418dd2f2699fc3b5e5dd22dd6fecf430509784116ce4e7c4fc8736f36a29f53f61bc48d41080ad42df2fbc2c3b5d057721962a944af5190e3c3606b1122e2607a4ffb8e3604cf3bdfbe2a129760ddb2639dce872b5163e72a3b5aa43b850a9fd07fb478c692882bbf7cfd96e89aac4d56c2d551fc8be2447b960f11c0f0040cdb3b0baf5c98d911743f28a43f6c92a0491e62f2e31f53f381f61e35698dadc700cddfdf73f3e72f64b84defbaadadc2b7f2001fd5bc0311da7227d0e93ef7e0bc4b723c297e87f39085aee94e7581aa101430baec29bafeeeeaeddfaede9a6f57812dc99ad6655bbbec002a77b64301aab98b294247a3aa4018674f7055e282ca0db50b92665aa0227c4bd472044990bde878b11a166107b3cb770baee93e84ca80b51d172cf2c1050e3f1042d768971ee3482d9d6da0a269165b802cb1bdc9b5d3917b1be3d5720302e0f8cd48ffe41c079b4f081cb775a2b14decd7c27da6f5b399231ed55e0eb404f128de12d4d5f7ab2870bb47c86956267305ea9cf2b6cd087c0dc726893f88be01b83fac5e74a8a1eedc083a4f5436fb93167a0afe494ea799c2a4129c626d099dcae6ac67fb2765fd1a995ec8d17b02590c58c1959836bceecbd2fd0b48ad6b0de273dda252a3bfbeb5fe0d5ad26973996ea6c2b5fa2d9336ead79c0575443caa0c380670d03b2e99c0dea915a4d0327e02d42b8bbaddb9ba18a090f75287ae71992bef18489b8a3dc05a8b15ad6697032785ddfbe171ea55e41a46104241bbcf0bd5cc4052af6add274229872e82decd7b11d7fc67f8af0c2ceaa4072a66ba7831da74c2d4b9a9bd842a152edc8f750dfd2933142446db2f886c9b1067d197af2c83b72119d7b1a2889a44b1e60acff4548bf7cab05d5d04866b030994eef53c054c31a82daf6baa84ec4f4cd23d0123b16da7a731fbb9623667c39b2e89d6947c5fa7f689a88e0441291ecd982df5d32b7b24c267ad2d07acf63a1d0e47cc7cc0d6742c2e47154258c4763f7fcb0dbe3b89a6dff8347e16c86c44406413be7e791dd7773d9646bbde2884fa4ea8d9cbf85f19b36be269615eb88de97be877143e643c34d8b68534a1428312b924e7581c259435382e92b10f3945c4551c5efb585400040d57144c578fde3934d863d1d1181e47f7e615be119bef5b4dd5e0663fa438c5ea84c479dc853b9c20abe02a0f5379000e13ee7f500335cdfac8fb17341487e8f94e803c1b05d6703d6af63367213f1331c0675f0bc0442c09c99a05b5d26588aa0794c3fd8adf56f759dcb6f07b6f4ab4ac781da409270824403c3d9ef2e2088918009e843808b16eb7c652e665977cd2423f2c3cda242d5a89fb3e2112d6c878b0c30bb03fb7953062b477e1dc2ac70ef979c2ee31845653b6692b764f402ad9979ea0aaa1fb6709b333798146a79ae912c3e5f48af3676b0b450d27db2a1fffc7aaa6b8bf5dd14f5431f99e4ab159294a0bc7755a71e57e265106889dd5af1ea15b67cbc68040afb71188e7d7511e3b196a4bd7d6db60343ec8fe39c709a6edb8f2f6b3b07f9d084e4e9b4c9d1de89d2bad3a0b480084a8816a380cdaa39ab89f947779ae30440ea21e50265be9939393eaab8e7d6a1aad4870dddefab8d726af45293614642ff9fe3b3f5eea3b94ccea6bc57bc5d26c205e0a204", "51536aacac5163", 2, -919615506, 1537743641, "2f4ce91d2fe32079e87e60d0773f77561de7424a8b90feca59aa5171fd69631e"], + ["d679536b04d0b84618f1c4b5bbc894a2c10a34a26eedaf9b79f325f29a716a37ddfb9327b901000000066a535151536afffffffff432cef418a83d2bce8a287dc37b2513eff2fb48d5578502609e8891ddce2453010000000452635152f99c115dcbe028069d188be66903d9f0bab518bedab2d9b2148a41032c490517271eee83030000000551ac656a53ffffffff3d46b6ff2b2ac64eeaf554dde0f4d851ff47379967defc60c0fec6d9fb3ab7f5010000000200000de5893e0195a3800100000000086365536a5351525185a2af2001de6ef104000000000000000000000000684d23de9d9b07ef71928e1b0bab79263d2211dc50ca0b615cd009dbf1d55a2c85e0cbcf05ec4d3112843f75b0980f7e4dbd01d9d45bab8bd60c112ced79901132486ebfb2083b53b1e3dd806b125bbc8bfc4a84604a346e3b864614cf266beb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d5feeba17c8156c84e58533710b996847fad4a784acba4b9f4106098992600e3d1f43112a0cb30aab18a45f5e15147f0c8dfe1a0ebbaf14d2173f367ff59693c66495e1c6e7d8825b92152b823f7b35978134371431ae969cfc4c9a5ecf3932351d66ab7a32b6346915e066dbe6536b919b233745bf187748b9c00a73beb8066030a5debc75f9e2f3f131d5d8653fa0268a55f29435c84dbd5c2c153be29581ecd022bf70d1e1bc8e8084c2a6a95d3ef5aaec1f2ab66be5f967125e405f2a28e04850b03a090a3878c93dafb4959b947a689ed07a713d863def65ee9c9bc9e398b2ae842bf2e844025b72a05ab5e165e309dc7556229079c0093ed95f9079cda22e7f9031a5571ebd932fb4640209cebcc042943803c4c53f695e231338ef0ea2412894d0225d6115ddbaf347c264ad968d75ebfeb419fc4cb265cccb9074f8c98206dd5240300187212451c7d8df51288b57254c0afb51d7735be3dab22494d76ffbeb4bbed020e7594ce528016d10d3f5822a95aec100265b02df0efde81c7767746932436da031e6977bab6f2c6120891704b242b79269db45861befece94f21213a86afc8279239ee5f5126d5d5f0c74a59699a6666f9efe9091c5d491accfec9d235f3d94ade725d5391884cd09f6549e64b20c975a1b1cacb23e01a60c020bd93168972cf1718a4d17feb0d3e75695e9690156a42e81a189df71b5380b7f2f68a8e27f026f28bb70356dac840ce3c8f86d3f384b607adbf4a1e3d7edfaf779f7ad7999559e734995e2439ac9ef75d2d0c412f12b584e2c6f3058c9eabcc019bfaa8565fbcbad8a633691f69e606fd7b2a6afeea8b31c620dcf97ff46a47ec79247beb72fccf16d3c4b89def6470245a41f9cadccc1b89b287e1222034938439027eaab4d1ff0351ff6e220caeaf4147b1509867b87c64e3079892bca74fa3bb0d58a1ec89892d73c76c8cb1bd85d9b8870760a4a3f2bbe561ce5c8c831118eadf909ca3d69a7ef1f37c865345efa0c26c1373916e988835d80373487ff15df79610211ea7272ab75d2cfe3d8a13908ecd7dac5525ab61e2bbb3d42725624c3439878180b8d5fa23cdf4b36ad05e46e60120e3f71db5e9560702c0dcf5cca191cd358fff8978b6d305eda0bc23665b7013874ce01280c339c2ba3e16ae54c95e61bf7cd8a395e5315b2d4c6d2c63ad27c0841a4b729686308f2667116ac12a6ef1d1b2f71536e8baca8c639ab93bd476698a75d6d750fe3e56724dfc96d97ab3bb38648ffd1e8536e4af009d27d1189293ee46c089cc1a05bb542159ad41bd497fd3115e05b57a85c9dbf044e927edae8823cac546152392b71902fdcc9c5d929890f9573b456a282686a29feb45f31ea8c81c1f0551a367b065152a3e862fd533c3a524fc6f94f2158c2f1c0c839f115ca8d6e32ee21fcd4ea9e53305c6dabd3dd1b9ce01334ac810cc538192b59fe8ea505629aa5c3e5aae578afa8db7dd95f3d587af89cc9204c405c5e12ae0e9520d281aa2a4e2d83acb73c9bf7391169af76f0c41f83f5c701045a5a1ba6a06e1f660f0195dd5bc248004894c5c7c1099eb078100375b5f54def09c2a91bec3e1426dbd2a1890d6e5d5755465077f310fc41acd6be8a4d4b885682281cf12d40d3c17a3215f70d592a12b37e7a5d4dfb129b27b93e0eb32629674f0172a9852738c519229c990d55e718b5542dbfd589e8aabd1739dd35de24b4dc2ff5c2359b4804545f8a7f2ae96b47539e22e8801f5f673ba7aaaa3a6d8cca5143ad4f22c62df368c04897351feb8584a7f927f851646cc0fbdfbf65ad59490ad68d93a0ac6d03bbf948272f0d4ba1a992838c057c819ec0341861978a7bd1fbb9cbf31fa4258e897a4bd12d0d3635a5bde5b57e414a24dcdabf9c01eecf229d0458eacd8ab74ffa8ed7472c8b264e8131fe1729eaf28dda037610e8a8b516672fa99b32caa8ec29e395fa261d6f873897213266f6deb81242f7a1ae78e19484eb9561ea78f63638bc6bf7442b68086ea9a4ec858d8d2a72366cadbc8239f19bcdf025f5ff4196487ad0c2b1b9c421fd703505334f71b065423a2494b78435e8bdc8c4dfc3659e9f4482a83d0f3d8ae07eb5ce96032b509ccec8a5f11e65a7839ccaafb77c0c0f36673ed73ef93d35aea9825cd94b0bb0ccf878e1306a2bd66212e1dc0ddd5e750100002d2418b9e5f9217e722ba63277475ef24d0864fb4bf5c5f450cdca3e64c5e6829a6d2f79e439fc8e48f0baa037cbb2abf368c220c9fbb94d816e05093e802d9c49bed996dbe4e6de0de1d6725efed5a9f97690dae4f357c437e7f7dde8dd12eed267159c2c8384ec18240e107b88e2658f60b4461b77cb854059e76ade8a377f939aca5fea714c585688ebb713a3f6a60fcbc2cf267d73ac2e756c65084b8dbe53640a", "536351ac6a0052", 2, -2032993264, 1537743641, "5a606cfe10795ba4f34a8c3d9263050b832b0ee7dc6881253ed8e3b7b0cf4e2c"], + ["030000807082c403044c87c09f3af9a50a4e67c6257b554acab8fa6a5572b72e753961ed4e8615d584010000000900526a0051516a6563ffffffff3d9e7566418340b9a2c88d7adf4ebb69de7ebd070e82a41b565590096467f38c01000000066a51ac53ac0009ccb2b556d5831713ef98d9a7f958461e0332173f9747581bc99e6c3c35903184025fbd0300000000ffffffffcffc144ce2ef101b10200cb7e63b610d39b51bc9b664c7c021daacad20e50c9e0300000003ac0063ffffffff013e0e0a000000000006ac526a65525342a6ec4938e55dff0200000000000000007ede9a040000000056a3c9eab354b23f5caeb6b3b04046619a2ddaa3033669f0ec89635a5c245c6721cd98a75f294009bedfd723e88d4e6f06ae50798e6fbb6fcf191d7ab2d005a6e465b458b6049c1a9aaf74d9256a62c3c94f76ae20d39405beb28b3625ee6e500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f785f57c7b35cece1b42cf38744086426eb73e9e64c56223724a467fe604743f28210b923f42c02d5fdcca2c19f6ce9e333f17400f4d971610b4a488b23e277fbf0201c52dbd4a713288322b8a06d9835fb254c8678891ef12f2563d22961df2e748a70ef5a51dd4dafdb8eb71eaf602a105d42842ff925182fe77fd72edeb032cdaac2198d506be8a6619d43ddbac14453982d9651eebb2ac2ada94084723d30204f74415c7f37a8dcc36b631c0c654e02427d2d08be93604da00b4c33412208c0a00d8951975aecf1fcbbfae01b551b976b16d62c9a9f2c59c737a1959eb8a29d13e66e51b01d59a771ef076450cc4490c913b2fd28d68017a098149639b6253d9020d128a184c95c32863d7d857963bb6e0282fa3239b2be3f41ba7d2468fb05abe020435bf5c573d70d3e39eec2238545e33c8dc562cc72be2adafb0859a9582d1c30227833e95859427bb18806aabff45255b695173a7e3f085cb2d284f01dcbb5c6d022f0a23c8c5d4d59bcfa42f47bcc45f2b1966a94918f6ac0d08c54f4622fa4fc8021e9063641cac06d75e2d5557542d77a6bd21102f6d1390753d34fde09ff6a711c9a67b43afe85a0f9f03c6e64ccc8c64dddef53b8f8697e020e7cece8091aa602626ef587ed6c55d8ea4a8b6f2811516cc16c519067cbc205a1f0814ee4fa38f804b86816ec53e2c84d96d2ca85a02e533939ce3b1bf0a54cf9ea125da0abadacab43171c45368e8e4fddf7053c182b3d4d976dda1baa52244832a18a2b3342e6a70230f895c24f1da9279d4dfcf3e1f1e14af36d2808e93f3d925fc6be856b5833b73505d1ad5747ee662cc03a53caaf5bde64ab4b2a08decc194b01c309f6728b99595223c4f76e1fb9648cde702c4ab6232681cd8268f1fed076a5160887d09e07641475609e606920ccd4b76ba641e227ee7e7f24b54cf892b9ead18adc5c2416225491fa4c4031129616b8a4f1b0b62038b9fb1ea9eb04df1fc583de5b4e1059fc9b3c99d23b43634a8be7bfb124b3dc31113876ed77ba42e5a4c4399fa5a8add88cd10d69c1f6c49a82350d2b143d8f6176dd3a463c58f09fc03e9995be68547c9ec31b1c4d8701b2305fd56ba9ab52b72de61b5e3c8ac62a2939136a06e70b371e63e35eef8342e431a6bd8642a8e699d65238c352a93697e479174639bb175a94db278aaec6bee7ac6d53520a80affb87f63edc4366ead98bae893091c9589ce4dfd7bb893829ba91a07265828381245f8cc1d96f63b8976ec6a16730f1d0543df8a3e2c51708fdf1d5c0e0a051f546507a3114931d6bec9374aa969e37cab95e21b7962e742cc5f98ba21577595a0de66a110a6d137074fef1fbf8cb4db7e5510b8799758713ee24256b92c4bc7130ce2ec6403596ff500d0f4d24b9adc254234cfc0c54d8b6d8b3d730a78b9d201acbc57f94069b5693cef06243d6ab9a96d60704f906b25f01157d6e7667d3232cd88b7875bb28476fb1c3483228a53bc2c38ab511186d74f214a3a58ace27ac204b606009de0a3850fb26cbcb41efc703a5262981d5c77d740d6c17f36545ab5150fc069d93e68a38248665da220754e71935ffab26464d5e30aa89db627c38fd6c490a504aea4758d08db3118126ea8120ee8f87c82f20070475c3cd80bf98b2724a97eb30b4ff62a23de44747837a32499a9a9d6c7f57d893e4a7245be5331dbe3727b5187e67d3afa76c40a774afdd4b2728655398bbf6f9d35d572a54d0eefe8307cc8bec4ff78312bc0cf02e2b525aec9b5210d3c67b8a6413a8b24ce5d8ab3cc6b52d65502949244e48006028fadda3829d1fde5f37ba0fc5e5d805244399f2c71d3df2a6385c3388fb1941620c56a150b8ab7a9b0bf13cda4e50f7f2b805fffe5a91ccfacf8822ff4621b94b82631a084a99930b2986ad9bd014199166046c2aaa339e6a750f42de3b3ec6ff8778be3629ae078c9d49e6edb10e781ee7fe605165163dd2396608bd7142ab066bb2faab07a2e338b4de6e77fe5fe2a0ad077b40a16f09f5cca80d2ebac267ca8bcb031b4f754ee5adf607b6e97ca570e5af69f18a680e3c9167066b33efb58cbf857d0b544944c7f5c2c95d7caf3a6e4f5df92aac394868fea6ebea99595d65a1762e303867f015f054c24c6cd692f8fbfe3d1ce242925827e3f930e271c1bc66a481f0015a916a36870ff437379a0c5b5281538f9561f38f6b84996e4f6e9e902a35f61ac0ca7f6c826f5cc7c51ee535c4db60cee87d76b1d49bd3d382f2e255a2a6e4847b7307e2c1facb73261860000000000000000f65f070000000000b323e576942f12347636ffdf0df339903298b39a7f64db836a8af6fe820819312f638319899201ad994e161527389a9829c7426bfefafa73afdb2b3e4304287cdf883830fd6c5809cae82e06151a375ae825c25df38a71bcae9421a673a9c743000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ad1aab21662a82b2f7b3150b6c0de88e9204c8b7f6920d2411dd3ad80371327589c726d766390dafaaf74c2a0008bd289dad6e71ba8ac671f71bbded9afaaf1ca2610c7571bfb251330c0dcdbdefbc68c6f0292809430e0451a6bbdc6e3bd82e54f475195b338a40ae2c531f04fe6a278d313dc9c77cf66a0fed2565b4485110201939a17a771b50ac1628ba07e9f63ffb6cf24fd5bdef64495a4548e1ac3e698030c29a6134a3e7c39772ab52148d5e72663b1659aac0e803a3b4d177647e46df70b005bc5301f7b390ee7b0eeae42760a0a3f2e435fc7242b8a77f59e3d8ee8115a2f31ea26106cedd0492189f7bead2403730ee5475ffc447001eede1b48242e420317346192062d3921fd8948007b1a00ad8fa41c927e5a8510f220bba5c70b5df5032e10a5415135634a44df0331202bc65520918a4e1d0153b1dd58a735dd80318003218882f59e8b191c0969d9694422eabdba1cf21e4fe605dea29eca1351e87caa0207da95b712e6c8e839f320bf38b00be9cd2103926a64d14e6fefcf22e3f1c63e022bdd227b4c86917d04cf8561e45c75292c12c187db0b87b0a75c81ed0ac07cd5d4f9dfa46d5a7a941a1279bf746e4f1b337500210291979e56552ff5b2cd71cbf591595e72bf922b57e7e88a00a62567004798e796cccdae2d53e4276dc851dabdaa5a0094ac5b63c8f91b0fd2408569bb5f5a3514eef52f52df2567225d2984ddfd7452e567a7f193b51cf45a55afc488cc9a66c5135bf215be4cffb19996fa9fbfac8f6448bdfa74718fee5cbc295f3f730f2dd2422852bb1b072194b933933d21df1a4556ab56e8b857d9177bc6cb1de20bc33ac05de099e526b047816226d0b24eefbb2deded95f85f4fc38c2b16690a091c0e959c8381d84badd9c90763851f7ba870e353233d332ec95db0a92807147709848986d9ecd4914ad2d6e3660dec794df51ce8c2f9e446225f33c21c3d2e0c3f4be9641a1a3f74ebe0d7a2372900674296d26a1f1a43f580df88f22cdb76df94c7fdcca7b2b014d590e7a9934375d6a0e8c0a5cd4099f2fe2311ad3bc37b11887c93e3d23245d40ec52114ac374696c8c61ec405b1f445e55869b26b0464954cf5195c9070f77054f299bf5b030e7368e9df8833222cb55772cfd41accc317b08e9084eaea815113d72e9f26619308828104eeda6094744dd9e88617638bc401b2efadf3200863a185881fb5ee747fd58cbfc4a0b5d90193f16e7a7c3a2a7da95b7aba2a6faa252701c36d39c539e76ffaf745e6d374468e3713634de34af2211dbc99aa2000b996a55d9fef299eee1a57e6651c910513887e168cbf7c597d17711b44cdbccd9c07a8534ecc3785c8802decac2a2a13b1854204a98e109eaef5ecd450ef639983589a91e954d803243a8047a72ccab38e0ad06588bab10e1154a185acb919ae5a5bba18543f91332e148a3c9298fb7a64f60175ad45b30314ec8b29008567174ed3080f5e8a3d096ea34a965f65135baf3d1c6622c4b45f54315b9fc0a2657c4ca91952fb93437164b60c86a2ae3eca749f7f975fbd9e9d13ed1914aff99c1ae9e6bd62039cffc258dbf2b95e7c9dd0d6638f4b1afbdbfc5ba1904dc44a118cba682022e89fbf45e2cb8298fa629b4c8d2058f6e0ed7691e859c5b2f0e10d886744ad4bb5c586202f3a120d102c4863b254a767055280ba78b9f2ec350032cad156c96a2a9adfc5c2d24f346a35063dcfcc0249db0bd4906544588e9a780864a5ef17517783aa024bbfd9a46cb1937b1c09124d3085719ea62c688463d56be140458d1df6f5b383a13d02b18f2a90dc85e5afc6ef6bedd06e241799b3659f96e533845c4eed24ab3d5f6967e64b9e29d6d4ad3ef606f00377d85253da5b6b564b1e148dd6c41574d35663d3b46dec98da69604db5c2f10a5359a312831b7b9fc8b14b3b714ca9c606cf36b044b5f51d1ee5b7adc68bbe5d6445b4ee9750f7491c316a709b058a44ced9f2b1b54095f8ccadc1abf898e3e3b426d7d46136f078268387bd29d673fcab6ee698f22de93243affcab76a1c01150ddaead8c09c6eca9f672465fe227fbcdee717b4ef31429ec76a033ab9ffff099818f14086eafb421050a35fab795de480ff5d3082e91a53b85da159ede6d90648c0ccd346400c98be656acc718f0ed3569d4f77ff2c1cf1a24bfd305939c04c3d6b6fb2ceca92632daf3b8906f28a95c4c8fd26b85ec91fcaa2b44323da1e7ca65bbb87851c243e4188dd2d6b819d22406389f9d8e937568656b258cef1af096a72e0adc68a7f357e147418406c491ce8b5f069184cee4c80fa5209c6ea857e7ab1280b5bea7c1a7399ccda2fe7eaa9f7812d3eb78cd26163398b146beef247a74cc543e7cbbc1271c5902f582947017d0546d9ed5143b59a6c8369fc94e0b", "536563", 1, -106775545, 1537743641, "14db19cf0420cda9c3d8e658f576e974cf8330f0e509c02257a443144a090b08"], + ["030000807082c40301cf1587643cac0c05acbefc1e4e0a7655c4f7c8c86c345e547e14dfdc96ebd8c80200000004515165658a711c6701cdf8e8050000000009ac6aac006a6a65ac65000000000000000003c599710500000000000000000000000092b23094a79ae403f33556a2f90d51eb7bbb429f057fda35a827bee2db7294c1b6dfd7ad7a4bca69cf80b4e4c957f2daefeb5db7f131a2551fa99787e50294f5fd4fd79461ee7eda46943cd76afa10dd56197e38562e37c4c9f550f848a1c8cc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7ecad0cb4322dbee73967ad21b42e8de711e5cf27f79ce7818fe36e6bcd487d80adba23b07e83bb02a54bb1e60e4191236db8b80a1caf8adc10618ab6d360952e667edd00160c5d8a31bbf8e9db74af8739432cc9caf7ac0690761ef54c2d7b2ba2ee9b7fff8d7aab4f079ec3f2df5d3d28377f5a24e4753dfa8e7c32eb7c3c030a04c7f5a95381fcdf567697759b0ed87e5faf3ec7e531bd5bdbc05b11d14e7c0212e50074b7dad69786576a8d5c66ff4dbe96150f7bd1ec9afae137c7195895480b02f260f3180bdf6a57a3c0183a18dce74dce89590309aa7946374e9ba6ab6d832d900c908e3e27be953bab729bf549d6a925a2d5467faba94472ead5e085d06f032d1f2615d7f828aaa992f75bfb140b9ca7a3d83f0c08ad78f5a78fdce9813bc00328ab5455c926114ccf4b5fc18a045580c1477aeda0fe2b47bf9446b8c90a3cb502213e23acf4056660f0d858979bc9abee684a04f7bbc02d12c601533628339dde020ad93d3391b77db99034bddd5bddc9903b1f0d8099893352ffa4b01bb927e220021e86b6741bc60f890c318b820ceb0a6d869e90529b0fd6ec6bb26ba68ef9cf6c98d420eabb06893cff2ea6558de15b0743dc9b10417795735d36fad33697bd5e778b57a4c54e7943b3b12c46dc03c2d39e0443815d6e4464913f87ab213ae9d84506a0aa3b47c7d451dbc91a60ef22143e88ad9a19a7366fff4e7a1644ab65885fefcf7709babf62740af725ad9ea962c6b5cef2e2eee50117338efd6d1abdcb98d5c1ffe5cab83db9e1889405d456b66a24734beff9cbbfbfd40e575a58c394262887fe511814c74b91f9b2af29fc207f12d2f949ddde346188c4041531e5cb8ec579da75a6a76c5e716005fb2a503a93e843227d886c6140fac770b6dfba1c6f1b015f1e3efc30f950997988f503ec139b9953559a6a38348b168341dead5bc5e1b4d053707894224ae8964d2c102b82718d749f32e41edd62ef243124ec8161887ec5a7eafc843de908e8555dca6fea9dbc0e3d80f2041d333b821c33017c2b9f918ec6dfce4b192e45dc5b5e330a459efdb9ce13e96725a7c09ca2b9a833636ead24f0161c7c91ffb3fe79bff16fe8ea874b36e7352d3cab60ebe8959aace1e366714bb4247539645b8f13c67a6769dab15c4029899313883c902a914f620d130874336f40bf56a29fc18fbdb6bb19f85f04127128a3862dd9c2b112279024f565292d8c072a3620751ed5089d1123d5548b5e530a60d4443040cdbe2be2ea944cfcc69a8b49f2352ff7b7e7f422fcd3a911677cf878a237a83aea08a7fa09d738f71012a736239e2b33126de5bb1d8084bd545b92c45b59baa794f4dd9ba1eeeb7ac65ab69c39f67b658083f220dfc016fb15136c264ff4bd0ac091d9cee673d4bf8adb1159c85828aadb6f203e3a14b113e3c0b6576a648a6c999838fc1da048b78457d2d9aaafc4a140aa8ca145e97482a99957d419c6e56ed74fb89118df78d03f9cb49a1705e13fa90881e6c5ab76c45829a948977ff6c317f6d95cb374200ad5517260d19353845f9d8aa87a10cd79dffe25d4e7841ced933d6154ee6c6301e2445537cc66ab0b812763c7d0516886beaf9a7888286f8f5cb79b0ade435c499d1132bcf9f2b607993cec30f28c5610fbc39d880bdfdb598cbc922a474ab6a7106e8ea9625089ef04188a3be7ebf5b0effb82359192783dfcc27e15bdeeaf98ded757808b153b8fa756af0c95de72f043554281dee9f86f651c0f8225c81e29bfb67e37379ffbb18d340aa75bce9e27d6de7115db2f7aea50b6fbca97919304e83aee9c55e3176c7eeba2e39c6f95eeaffa75a9d324c43b4b63a4f8b2a34e66fae2290186591eddcec174ef8ed38394ee6e407d6bc20e49d19ba0c3413f2af2845513db9b9df40bd914895245211e1f88643f3e0982612ba036d18865b6c810601cc21aee104d00637b51807b5183cdf19975010f37fd21aec9aab35a51bbc2e7acecf5595509517f21d9bec9a54dde85a474ada5cae932ee0089dae5b24205214bde3dc1e2cd12123747eecc521ff43924e22fa8ae67dc4d7201b28f0a58b024f9d08fd1b73c8ed7f604d23c6757abd6c132ac0a3e04cb2c00275d151b605551bc12756aa2f1857e949ea2545334a456ca30a3de3b3763531be22ed7fe2d48d3a51f29c973ebd06aec4761395f9bef0ae42cf731ead574f58b7a736aa6063962a286091be273ac03caa6c28d45763188946294d8fc3aba9879396117e0d66f28f198c077f5cee96fbb090c3ae175c03c010000000000000000000000004cad9fa1024416465edd2f61bda73b201adbe1300d84a8fcd63871853aceab2b0169bd06ccf16eaa8a219b82a62d3059a7239291242cc6226999996865eb8a67c330bb416fbe55eef80f6832c39d1e09155686b831fa7fee4862c8fd3ce9c57a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000be6bc9bb70c74d5b2331d98dc63e29fff30e2a6941e0a9cee1e41d15acc1f82547fcc8473e45f9c2e76975a3e3ac2eb5f39ad74713c13fd3898c44ea6a28322f57982760b230b80769cc5dba25574eeba90ab672bf62832798c3bf7dac849dd2df243554b01347fbea2ba0bd7369c62809dccea2f93725472d715b64fb7b828703121d8454afe77c9413100110d82ceb913854c58a2918b42ac68a79eb9737b52d022ecdb91d1a9b226b6c3a5843844aeeff753801b182d30e348168b285fd24e3eb0b0670cd770e35a4e828b9680063869982388ed7cde9fbf9d9490ddaa30244105b85badc73b7cc0b0267d1aec7800ff07c27c5b0c754aacdcb87182fa6b0c46ed002196b86229b667255f1c02656b0fe4d60a594bf37f784199d081ebf05bc65056e021fa07058a12dfab3f54d0049458abea7adf5ca098ce7382ddee8d4943e2af19b0308a6edf2f7783c68525aff6cb0c82641435c259c7064b9801cd6f84cee53b8cd022d2588dc5cb9f7bb466481fa7f3f0bfff7423b7dcb054a7dcb59017b33562a1b0329bc2a780c4b6370b8a1d033b454d2acb76e5e6ae311707ac2bd108a49a65f40b32135c096b30289529cab0e888c31c86006a56cd24cd164f95cb22f92c2a03c313692486aa0dae6b536d2f6800fffa189b17425bb761f3a8d851a440ced8da2ed674e90c4cad5344fb1459eefeccaa82cf0812958b1cca348fec31ad0069479ad11c4de165521ff09f1b5bba39cb135c5d9a7d3d2356fd425448235f9e3c0d6544f9508e7109e7d03e74ce10cdc4c03192b2ffac3bab707f4e44137d087cd0267afd4a653d25320628e7d8370255c81402702803e74f614bdfefe5b1ca34cd703abf9dca9548ebf9aeb7d82884bd093c733cdcd54332f979d0466ca8fcdbbb88f1ac5d464eb6f84cfc0875de30f4350350c292f811d047282d6b4b5d003221ed18bb3666ae08befa5f7d63ed05f2b751451bfbe5134f254d8a736554dae1ca222ca54cb86c8042570bbeeb058a0b7639fb442a2bd9a2b7dcb4e57dc0955dd8b0f86a1cace36ba81a4a3a9c001946ced140786331678a4625c212e7ca4206b21a8988f93d0688c9ce4e9a044bd36e25ae15b01be87466adfa580f1403e765e65a62cdfd0270f5391e0bf2844878eb56fa5d5f1ce3e14aebfcee062296d163e414de7ba35dea71da03e090bf2ea7b1cdc1ad2c40a06f377543b822bd58b310f5612edbab0d32de76edeb1e6486b918934f2f919ba21c0ac5d9b693ff0d9166064af0f41f0aeecd07c222f94a88746096aff8639054f66e76c73e5ff44f654e193aadd3c81658cc0b48fe129c6fde8c653450a69b95afc8a1e4dfba9b0c9e233ac262c00479c07c6c790212b597c59868d228a30f8b2ada184627f8ce73211a4ca79e755ff8fcb1d14f35b3adf6acc6c4096f7d196dc6bdb6a562ec330c6912fae8be15c33f2d707d2ea095553a00fb7fcb02d36e0c99fd51ef5a85b90e1dbfb82313a05eff9a9e97b0bd342e3787476e0c39b290c3b4bdef9b6d967b9105b025f9ffc5fe7e00f7cfbc5791d782cba3f97ddb98d7bd55d5ee6bb1d76bf421ee87b81787ec6cb626c0490c3c5ccb3a88df6bccd79f6e798ada35628891bef1f4abf8fd40bb1502b6bf7a59f7ed8e776938d147c15cf376aa92909244dcae00ddfb804672b60795b03928e985d9daa615d5232e49efc048f1ff887a99876cb49986ecd79231361007261b0bdc8c0ce6b9f4bed9f232bb2924f9e89aad3a476351913378933d12068fa44b9e544921e3e3de098a6a16b44e923b852aec81adbf7fc8f93787fe74e4c8ea937a311cadcb415fa6ef7c2f68a40aeb46b157daf45d46524c090d8d00639a8634329318866861765ba6f70efceaa882acf4a3e851be62dd5c9da630a8d1978a8f108d2ffb1810224845a7cde47feb503c2cafa2a494e54262b2c404d5a1b793a8c1c961b642fb27a014a45b6505ed74ae6c144e7038ef0be5ada19e6195b114761d037f5967386e943a53cd766bd5d4b529aa639998841a790fb075ddeb49ad88c95aaccb877760c40b40a57edc2451b4f68f60963ba3f71f71417f902ac4bbb21091a285919e37b6e99ba64940d0c4364a9e16095c44812c3e69755021579b6a2b29e04ca120f9043f396bb6e6ca8262bca40aafb13635a214ad87fbe6390014c7213884a3f426f4d38193cadcef541e603d709502f96664b296aaae9fc857c63cd7c547caacd403cbd51adbe73d81f84c0ca8bfe72710ad1198c793a198af95be8f8632ef559b244350000000000000000a163e405000000005f9247149bc449f78241fe7783c56dae5c22ca892cf929d9285e6e4291e0aab067a6a16d65357f6c17e18299bd5d76fcf1b4e6a3ffc440b30f8ff1b43159cc4a64cdd75057414eaddc13bc56dbea9cbf46bd7070f174e5a79b3d31b3aa2a9a060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012ead841631161b6c35de53d031981dcfa3baeb45d751bd34e192b0347d1f03f2f2d35646b561b3a8107a058a4a94b85b91ba314845af5988cb3421fca3417dde48b78afca26bb08a5706815f78ef10b00ae2263322da7234a7b271881a01e5f7f7490767e38880fc814d7db65efe824499c19eb0845a4672d14bfc0b46f636d0225cf6a2e661140e9acbc5b9420250c4a38e7f4d61b3fe315a4d1e87992407bee031255140720ef7886890cd8840b105d572b6135e25286fbe0c4664cad0bed453b0b0772117ae1ff18a36b7f2273209ba283f1a8ac6bcbb968ad5db0e94418e7cb36e48bc50c521c29dd4af80d45a45564243afd359dc29a47203cbc130026765e2c0227c3ba34eb0e4c7ee01a102b73023c44d6f1ccdad59edf47da7cfafb4cc8b93d020edf92789b719d08c95ac849bdadda71f0ed4d9f6b59464876e76ba0e42291dc021b42b06a48a6c77bf3e84b5c1948f7258582c9fdc7608c5af14a0ef055a78436030f3e55fd10539a76f6dd5a5437888342de4811777eb0d484213b592de1c3bcae032db1136808339fe69926df9147e08b082958937d612a94261b7ffb7f46736de6046dc17f422b0033742132f718b7df8f79183f0b366f7697fd0230dd18d5c4c352c2b6d203fbd17784e3bcc3e6c77ec0db317e51b6b8bac2cb48943e2d66736bf639be4202f4db59045a3cff3a6880553c4b63c8b208d15b89f939141accee597cb779f331ae2d2aaa90310acab870d39673667a6b30c4ce9e32be9aa69c878b33e444149b0a594b1a832aa5ad1aec3513414e7c71fde68b069f909e5d37b63206831afc70213a43bf8cab89a70d2ba0abe370a95ea5637a0d8ba0f507c16bca27772c3c39678fab6e32fefbdb179ff49873025a20dc2ffee73937dcd5b3eadef0416b61986a8be0e9788b714dca7a6c412eebae78c4c1c51f1d0b4e3c1af10cf7de8d0ceb27c1632acf7a3194b5da8f1c03fa17981d27b5ffad7554dab99af0f4c5992df097a337e3b4b6a4fb913a16a42a6e4024691d4d03c53ec7690d7b754793ecb8d8cfb69ca132733fdff252d59bc92db35ba34a0347bb7795c453ece0c2ad7a9f0dfa0740fec1c8281b4dba86ecf8e6c06c86299017c70cc7f09706fa745f89696664aa9a46175a1e4c08d4a33a4c3b8a300303989a7dd5a6b5862be7a27dbbf124d6684655a66b97ce42400be673dfb4ac336e4b5a458faf3320f52cef87ddcaac7ce7b55de34a3be4dff5ebc97f423d3ea530455c164cb50fcccf9c153d89d90faae6c2823d2e2f889ebc73fe90b48076518c2be1b4e9287af2e80b47da34ec3e7eb156a602a0dda31532f8ab1b9650b6effe7e59ee7a34056129e4fa6de1672e980746e4b0b75544ea67ab960fab74ffc524d60350777a8c0f2af3c79e85160adf7271b9a9f973ebee4c6fa87967f9f5da9edd7e9798ff725ddbc5c28335c53298508cdd6fecf199d51083c90716b9d1dea536c302d0dd89038239838f06f549d077b28fd5bf86d3770c01cb1988e5974a4136b624dee745d876b6b2249898c57a6459d153d89cb99186dc6dab636ad8d94351f8f4d67c2da94483e597dd4baa334eaccc6248f786afb18bed1f0dc3adf19fe4e4fdaee38569dd4740410a950de2486dedbb332a8c19243256c1fa7bdeae3a3efd3e4805468cef340f188ac004f5092c922666ad6405ee44d9aa79b36cfaf2ce3c1ff108c81ea71e6d3b144bc571a7ae519b9a6d2468c9aaed123c38a86b66fb2d3da16cc711c7279c98c537371e3895e482d31451b23680ab7aa75845b71cccf42ee0d556eb8452e1d0b41f49907fc8c12f8813f72ba0fb0fc5b3c337dfb2f2337cbcd7b41e0671cd11c6c12c16036348f710bdf672575ee4c6ced2bff9b7995b6fc07ca8be1220177898b4672cc352311dcbc50906542a74b1c2167544a44f0a677584f00add61d2f6df236a513c091a41d1a14048892c20949af8ad31bd89079e17fb5b826987c61e2a903213301631830b770732b6752329b785226ce9728989d5b78d91a1776ee9bfe102835851b7900882334db3c560097b950120ae66e46cbfb9fd27ce64c3a87f69f07e9eeef097f676ec34011c4db83103645905711d53eecfb32a42409181717a1b2436a084b3e30ef2a64cf53848335854e5f7b4203308faa3b4abc5621d8bd5a420b6e4931ed95078dab5d76d4b618eed249cbc420d23a01418f57c80f91d4b5f950de1c87b7e72be911db19e7adb82f5967ff3a9dd36ecffebbab57d9c45e7b72c71af02bc9da707b901e20f34b7018460f210381259258a1f0065482e3fe1406326ef3b99a1c31e5828a8375e71e8efa18dda06a529fecf1b042c62b800bb329a72395a313f066e12e08d0a53355bdcb6c51290993ed3d77076c07d9598c79903307d8e0921e5c7b0078ba90a", "52ac53ac", 0, -189656669, 1537743641, "19758dcec4e7d1dda723ad14d13a2870b88d7591dd99a46317729263a2566fe4"], + ["030000807082c4030191772efd0468c4a78172cae344662f3f5e0ebaea56562cf0726663c61f7d455900000000056a525163003a820f3a022ba8da010000000009636352ac6a520000515b35810500000000075165535363656500000000000000000100000000000000007d4c1d050000000030423e50d4ada090f7fb80936ecea65dc770e1ef93d5a5b8787b2dffd28dd0f51e52c9a049af2b57b90213734ebbbac8915c7430c3a2d69583434105e1052598cc26b7ce7a0f6f54dfd66026a6cb9ff2e191f1ce85b99027ac960433a78641cf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000812d4a6e55af2c26203fe4b33cd80b79b883c7d64c7ff0c5bad35cbcd9389b654792e38e76b59d8d7eae045137071b21564e73cdf9b5e678bdf7621d16667d148c3c843c32c900d198e9690037fc7b338b4a784e43e49c72b675c72d8498a7f5b462b304de3836bec636b9775bebe2efb077d894c2a06502caf831e7229b8a9f021f59bf2c27d4fc7e8c49d5f48d7e1f7710f568b4ddaf92a3bddf1cdceb7521f9031a5759e24e42a1d3feb55e328b341086ef804f578736ad3c5d304917414dd0130b0105fba8d381bb32fd979c16b2b99a2c5f64277a3f0ec96a66f9342dc69face5b97c2937f2c5e4c270363156244a724275a6dbd144cc216951ba34ed03e0d1920219eac95a6e8c9fa76fd55d889c2e3934e48992982ec9d91cb20abd0a0d92fd0a0204ee7ee2f61b3bb4f6209cedbdb1ac82b73adfbe6bb6cd352400348b6cd898af0203ecbbe2644055eb2dc117338181d6a73d0913536741aa6af33137bb49849dd20328202df1d507c41de83224dabe2919853c1510d183ebc2298fb6a9aa02050f360309f9b566c87010ef085da06fabf60dfa450dd4b99cd681f71cc9b090b2cf1e284185ba626371abda529eb7a68c525cd7b0c7f3b37d3455b9dfa309f0b30534f89952f7d892e490941e99409fe7de0fa5cea11a02c4ea659e14b0687dd733ae2a5e717e53af98f718c5565b556d62060b813baa61ba0c4d35cfbd840d489f73bab424c21e7192ed4256878a76708fe1d362d746610a8c4a9201309c1fdece33939c01fcdaea84c91cac47bc3da74876c5ff80b0d406b77bdbc56eb90da25af026d365b24f3637df0580313fe892fc9443157de4b86b18fb27fc366a57ffe6d7521e2bb0ad21f2cac4adb72c754641cab03d9146e13a3636f0b48585f6ad207732863463ef2c495529489c454b1ca7e8ea9298592c12e450ffe73b01ef90af121e10ec14c570c6d820c160c79146a00be7309b28c61ce7c2cec3d5a53826c571a928c096d5feb744d22e2f19c7ece0d13dbbe594e80f3d5f5cb6317e6ef1e3a38da00e926b542df6c31b93d22d28996e77615de3ed17795799c0b133773e7b60e45991d18ea7169459eadb866d3e5e199d4482597db4111cb09c58f37495b35c575b539420bdaa4c41431fae6211828e734a16b01ad0154ec1a793ff81179494188970e9e671eff66abfccd38f70576c63ed1796c8cb170a02716b72bcce26726f1164e7c8cd728cc84c7fd33937824a9170da43d71e0c79b0a250e21eb8a3d6d535a55c21ea3544ac76f3021573ca4602b8256c1d3fc7421f29c26f9d8c901bbba7fb606fecc0e4bb7f7a50cec0e494ac5637c31fa11aa37a5483aaf82583147ea21552adc4826aa82ff4f37b857d92c040a8bec5bd9056820a4badcc65935b9cb3dd29f588d3666513240a24a116038df9addde4482d4c9f72da28303f8cf0327eccbedf83e96f5caff20c5ca21f6b380541eb9860b7cc108da3b5c81ff377fc987d08978eb83c98576882acafdc2e75d50e498d7e6d27714c7bd4978cb427de84f772dc8098ac37085a245a1c868975d8969676c28f653eb59a5c48ef6e271e82a78a7557d543261d55843136d82cc7a4e599fdfe3776088754bfc2119a2a0da6af9970bd78e2863321492e5148b07db061e3953133c044f4ef122158bf38989d80df61cc8b9d651ad8d461e04c40a4e093a1a27376f7dd039f746e745b20802d24689826a06cf30fd01724039c7e6419def5bed7de251296963c7b82d0062b0ab18e7e94b59114503a4f812c27b04d19e6b42b608f6b7fca0482eee6e052b9b1719e57ac08e75fe6585fcd2b169b0eb90994cb74f850e905688f7548fd7297cea131d91fd0e77905d2a8d681f449953e7178a8f451220b9fc005b481bb51837495d80e924c3042eefae19313d64d9bb310a45818508e6f68981b6d2cc715dccc791ecfb0a39c3b7863d0dd4de9fde7d940eee556d6ee86af64200ab7d2a682d66178149167acfc4f54d1e230349834d01e7ebc599848f33f81348a3a52e939f768c53a29ec97647ce14aa01f1e6942a128df5959eda5935da4e78e76b27f29d9656538ee683ca88bde051defc1b6fc200648e74b27b141caf2f7dff61f7f5f1956a9a1b71df0b666f68950afdca9c2e8be749d29660abfe3c77533ae35e27387d15e079567798c3dc9f2977b9e1c46e8ea3091571fddac9bc7a86b45606fdd0a93e1c6a0c7b5125e71e63963c2e358e3bc0d16153df9c4988e2d5a1249032c42ea42e97213d37a1d5aab912aad9e3c23ed4f40b7ee720ec087a9bb12260c3a1483422f2e2ffd20d36f67602204efc0ded0d582994dea4ba7a2506892e10fe7d4ae78f9645ad916ced821a0417ae6218b614eb2a787d460147790ac0ad75e978a82c07cc6236ffa9992e21dae2fbb889407", "63", 0, -1629129596, 0, "fd90729f2e9eb6b4c764efa3a39227b881ba7340c967a081e85ed4370cfd2f78"], + ["030000807082c40303b50a27a9886e78cfbc2a65523e2869a3aeae8a656f4ae53749468f507c3ed012030000000100ffffffff5aad6a66bcff0f216b8380828ccb5cb6504c7e79250a00065e35a9d7abf5a8540300000003520063ffffffff718460a8dea5551d831772d315cdae4485bed069d30b332c7911740ec13335b60200000009516a6aac5351636553c249069201af68b1000000000004656a650000000000e9dd73a6034e8fc4020000000000000000000000006bd9e9ceb1f534bc4363cd9db2a435d09648884370ec2d803d9321bb141633347f6ad88fa8d6f079bf27456e114ffb11c45f1e1ae636c34d2afeeb802c01250dea35eeccfb97ada9acf032d31198d2830d2a7ae9841816d97bd909e60e5ccab2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008049651d6301df16248f3ad0d64f68466fd677bb3a26da94b37ed661ab1cf57221a77f4e81c548079aae2a987f138c5a7d43872dc9c9999099ef5a808a332ae2d58de177200078ae478c3c761cc4b873ad6b209870c1c355d04131a0e146acd72920b4493923f42d55f0eb00db4c4df0a563bbc60136f7d1be473ee39064bf9e02247171b157463bc8a87f1d02c81167c5829fd07f1c740c7065488213b0c85b8402278418d33d1f3a14e6892abd4a99e6a09e6e04432c063df0596bb5f46ec13c510b05162d87e5149a8cf315ac74f36ca7549d8f087682ff65974ec7e0efff06d51866676a85b9ccb492986b4543a41390fd04cdf14e438c51035401cd029b4ae7ea030c3cb4b98e56ebee1fc96e9ffb3d70b56bd1f5d4e3f0943eef6dc7424f92a52702254038bcb2561d7c379ecc6fa33e662a2266205fb084fbd8eb98486a536b6f8c020a2e230a7b03baf30c02d3802da56ae06623299643c0135a70972380a96ff79b02256e0d8cd4c5fdf50b5a388931cb08a8595c39410a66bbfc1ed6e0ee2d13cb7b030d4548cd87ef76a33ff06fe7bcf095cb8806f8b325f80bf918887ed473f366e3935d39ea905020b6d8edd43367681a545e745f82c7c51a56df0b4136b25649a39f8683204f0a7c0a33380e8dea4688f673a7909159dcc60ae082081d9cbd96fa651f6f9283c20c8817c59fa65604fba62e10768f96cfd23af614c54222786844192b40a315f9a4cd0896dedd51f79ecd7e0be79e9bda973b4d466dd3cb3f6bbc7f3b593677779ba83d69e9ae8f0d9e121fd44751506c29dcfaf0c443fa6808d43a59f9c55b577e8ec95f387668b4afc01564b27e622532894b67bcbb96ea689998410d73d6783c02d0e5b866cb1e5fe4ba3d639181fcb5a1be1bc95783275b8f78be46f93535b05ab3600e9b8190456f4ecebb99f12151fd2c3a7188a9106c790e1306325d5a11180c6a8869b87f1d670b12a8e72fa746776fbab7d4a8a2dd821340de84dc13dc1657bf732156db50df87ae0361dd6f8c322b85ccf4bd97745b8b3c0eb64bb434836fb239c41e71e2e657a40f56c31b6f7c1fb87ba02321b6174b1b5acdc7fa395713c864e8c30ba197e059e85e76623a485930d435d3881c1a0f401d9670a64f1e42c263137f73270cf4bd4e94f1c7433edd99c522020ebe09bd4eef03c14541e0471ddb558f32fe7bb89db7ca6703359cfc7d7058326cde5429a4e19bc8ab05873e46cc0bb5f3aa442bd1057f9a9eff741e0c8e3fed365991667b3aaa1f5b877926f36b3ae1e5196ff5aa0229409d7e375cfe890e762b52877d4782e367b14c156a15a609b9717818c7bebeb569d108999925d6c49d0c0a03131ca88acd0d48a970dc6dfef1f8c8882bfa5aac2f3d5d740b74328cf644587aec0ce271e7311e2d2b63459a28f6eaa4318dcf957281767b47c80eca60abfa9d873de26401d49dd3251fe802f6be6b685bd16d3099ee20fb595350ff4354cf800e34b1ffc0c857c42d8c3bfce4de7814d3922e74a193f6d4a26daf38894f82fabc081525ec116c41d633415c9fb4fd6be00a5e4bb615ab527e4c24386fd113d1ca214cfaae1b73c32d3cf65ab6a59e87e8282cb028a9b7d2832c983a877490902c6e8c525a7ba271be9f391ca4c7117a3374a33bd58193a767023fb294ae34adf498669b247e0b1c3ae8d9918288f64e5f4d2c92d781193dd790ae3ccce1712d5495029687ef447eea508d5d0920ecf9ff00d79d8f1e27d5ed7ae1c4707d17a975fee79a038b3742b9dca1720831897ba0d2a9b4e78f4587a08e90edd08eebbe4b3ac18a0597cd1110b06c5a06d6c144ad91f992e156de0b87826dbcbec0473323c6db051074f89315e86304517cfe82861edaeabcb68be9c09ae165df746cd9811f69c8fb142378465a55a424ccf8a0f9055090017209e3647bf6945eaffadde2510c2f1cd22f4be6447e0f6163ce1533ebb8ed3720d3138562e0e019a5a1c2131e65cd9b8f191ea36caf5d348f0aabca1ee278aa9b21723b631d1d4f9a0c093448ca338ae761636820f1ebb246c646be5e15fcce1dc81551d1ff7d558136d11f0c1c5c3beaac95288dbbd6ecfb34a4497a8655beaa835fdc734a932bbbc821f7f1433047a110f73a67faa136dc133555ba462f1524509dc2a3747f96368b861c0a85a05425de76b09ec99ee461de685fe63fb5f75a3733e8fa0ad5faf8a9cfc4b2c96f2f58f815e94e48e225ae342315de244c98896af04c142e0fe6acd5353c89d778c020edfa983b126d1b1a1aa97dd4109a270000000000000000000000000084e2700ec389e54f97f981abb81605b9efa8851c856846ad6f7b9ee1d842452e3486509435f88afcfe20dae2ca09976c0a1a33f41c9319736cbb8005f38d8157460db3f206e11a182509f2fb7602aa6fe2aeb40d179b3e3b2c67edd395342a3b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028ca5864fd6c406cfbd1eceb4d2887a1d3edf7b25c10e2ef05e070ba6a4b80294c8b60d3eb22bd540153187728684023eebb5e4b8332da4beadf123691605a17c68a60574feefcf9c4325f37bafda7f724e2150cf3fd39de59ff29c6ec0a0eefe87939aecd237fa1dddf9391cc0e7fcbf6842adc42f77f7dda47b3a0b0b4924102071257ee618064e0352413f4f6e3adaa726d5da72fc9f06720e1968413e2294b0218156821234e35a1f8caa56ce844d8e6646935b05a3bc6fb40a0be5ff4a3e3e60a037ec4d955659360b7aa99d73948d390525e231540809d91405f7689c60d8ebae0dfc25396f110b17a1dae198c08005a8a67744dd0cd11c11555f9e2dc06db28021b7681de92bff7bb8debd02c402269a9a8a221c67c7d934a46c9e5f5faf866a3021250d4d6b5e509aebe1ba4b7fb188b8798eeaf19283042ae42472939ee5c6669020ed64786afc1e8f1c65463d95ccfee7be355c1c7f8a1bdeb889d534067158ffa022376307b100c36402ae617e4a651a9ce939a09b224e13833103efd2554d5bc9b0313404fdf0581ed5140aae19d89880f98b966cecbd5bbe339d2f98b1faf78fcaeadf5655ed83bdf831cb25400d53f28c2fbb57f716ae90ec4a08509f11311d2948349b4e5a6a361430efcee8c92d831059119b9edb059045306931f4f438d5972379f152b6c3ce7e72cd3febc5399da9bcc30bad448cac61abb4a9c22239681ab60b7fb263e038eaeac704167087b82bff586756dabac7618482fccbe957888d5ac7c492aff1da171ca57c58af1251b0801960d9837d633eb7545ec8dc527fb1862b2c66dcb2a8f85373d3f9bb88fe0fb960a9ea30cafb704d3742830c0b640e0ac8567516a5437122560b44be771253de2565ccddecb4fd7e0648e7c094d38f7fb0452a14ae6dd9a5f37a178cdf74fe4eea339fef3e4c27f2bde267b54a4fbb61b3fa3b1c23dc0550b9aa057c18cc19256c8aed070d6911e6e4c2ca48a516443ceaa3cc4676a5865970463c502119b0a9b00b6615ec249da3a7b99e8c31a1491b34cf1f757408181b9ce5f911d507db756a0f609553bd003d0f467e567e09623e72a5cfc9d52ef581746ff15fc6728db3445292c3085d526b82a4836ddd689de7f86fd69f2bdaa0fde01ee35d0369357aeb9f759087604aa9e0d7e3c9d98c5995d56cdd1b9ab2882e4298c4bcf29686c74e0ec3b63a423e5c15f19025588c31c2c3f641e8374364a7f4bf23a02aadbe271bb00daec07079ba83b21d3da653f21bd0e26443acec2ddcadb519a9b7a50f21c951ab6206be8c9662feb350eaa67e6090d037803673374aac108190a6b82ac3c129400931188e934a7fd7c29391c367c81acfdff25295295e98742719a9cfc2d43aae80fe1d5a6e4cebe55a74e0f5b0fb31ac38272156603d3c989267012f58a066acd01e70c5481f2c3fa8149dd1def21121ae685ae64811551ffc44dd744185df5c356dd1ecfafdebd0367afd719c408e375d78b1c60d61ded50c9a0c547ae710632c25e58ae162c1c9f8b4f851b69977279f6be65e6a5ef5cc528c7a716204aa268957a556306bde9b28c82a6a472aa8a20ad91642e3ff29b6e61cb3e0c3aa18779226b43ed5b6a0e660d4678867e201b5ac0b16785459b3ace47e95ff6cd9c02739919f080295b764bc3abc6e38abf6e4491f2f1fa93404ff3692fccca698b3ae2a82a1c9f8fd2d9469e826db252dc1ceb51418bc8a8a866e0bb0111f773f640ad3661303039ca8318645bbe07aaf0bb9e520f7a3dc04fbfec2fe3f8add46b17621e388ae1f3e80a314c60128163ed48c19b8b2659063d951bd538de041b2c89861635ef94de0c578929ca437ca4175a1164eb3260d424532d1385a78828bbd16612ee5ae41c679fadc3f1934abee633335de3cbead263df2252ab118d704e069131bc2a07638a2da20f7a801c2c23dedf6ac2a08298f91bf678604e1e8c617d53403a13ad4488f9c73c6b359347ffd1519884651099506a89bb8467120c341bfd29e0216dd9d52b521cfab04301036cc7d77edbb8965068bda906cb5efe0efbed506c02d6498514a1d96e38d5b8eea75d263ceaec0c478f5ea1f53c00f684e543ea103d7d24842bfbdd8f1c1885a1775ac9846ee7f3085266105c2cba2368d2ef37916d9f364a0ff591781d8e23f844499a8016b2ec382c9168bff415cf67a0fe9c49e769fe3bd9a55b1cdeac8428c91379bd82ba9259926b97f39daa024a740506565e9b59f563cd69e7d735c74dfed14a2afaf63274972a558c4c9aa82b6c09c505000000000000000000000000ce2103fa047b5de8ba01a1336ce26141b723cd9081cbb4835c37ddf4c1d85c822dd2bd11c7caced8c4ea8f656075bddde6c531bfa29475d1747afcb8749a8343b422bd445dc4479931a922e7a40bf1de78ad9cde1a68b0133645a8ec630e7e4500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000da1fd9f415f8274a2234021e01ba22662fdbae91b7d84f4430640e170e6e2531918715c280828e1c96e5399b4f6d494d27e20bb815c6b008b88a03a123ecdac612368015a59679fca3a0dd09b1096f53da24d40ed210e63fc039496dbe14dda871641368b2f47034af82fc20cb6b83c04f7bb8c950dcffc921722791baad609a032cc20db3ffdbb1a3f795f4e4863036e99b1df18a471bb19f54b5d31cb4ba577e032e96bd957e7799d41c586fecff2edca8013730ad0bde1e157ef175c66ee5f19f0a03699f48f25b5b3a89b7200ce1646d210647230db65e612b07007660bb40fc654b026e8b784971c91335cbeb729f7c4e0f0b186026baef2605c446e3dc016b9d030e1670bccb31cc15817cd4f259e9f1f1792abafe1a3ffcc50506966b7a7d8ca8030cd13561cd034a1ca490a0a28b06504e73614cd4dd118a292ecc2f2598d08df0020476bb15881430b1343090ca76a0ea90dd02fce76c9b0b72129dfbdbd6265b8f0321b157a16e3024d9b8cfbbf76026a6c560b4631acc1e3972ece7e02b519a55c8020c21b7b92b1a89134598ee35d98bbd161e5addf52c3ed8bc691457fd3a8ed9e5208af950b8456108e8811b9b89eba314acd425ff4ea85cf0166a6cad5b7ef9a1f905ad8521020924108d03a75284f824973e6b279bc0e941f64165e20e80e271d5507a3cfd90d3623f46ac4fd5bea18b8b97965f99d5c394c1ea02258c73f3d2267e8d6d822e28366d2d6b203821751661c199d089d082138a66704bf70285cde9ebbaa5361f2b9fde5fe2a2ecb64c65410c4e111a7b91f9ab77c95e58825d4ab945b74cd04bcfb7e381e089c6ae1c26fa36b98f7b02dcd7a5aa06180e44ab726693d032996fbaa19d6bbd21c314edae256ac4043cc330097db1967d5e2a2852e503127fb69432f2262770a8ba537fc4d632a0f298be0a9debd2659eb7e5a23971d2342863af4dd38c4e25f3155e1c0d809798114f161fcd582727b0ee7b8b573775d191cd8ea66e9945821559102496c178a257f67dbddbbf6c9f7dd7e5fba83c79b74c72d406a84c031d425880d98b8212af528eb5476ff29546e080afa3c532281a97ed1c5fed397cdae7df3a04f06cb0cab8901a5bed5ce2cb0f21b64a7638ae1ad5019dc52aece48eaaae5de8cc87126208b2ccffb7dc53a33639a6336c2785adbe01ff656dc7f8e98b584cb40d0be7de1166c351ed7765a3c601c7051b7fb9a7c5892b4f66fdc36a759551294b628a6ac40402e7ebd8daf07170a81e5baa74aa9c986a157fe5bc00c3cd307069ec18b0831de8a98ad5af393043c8dc4da909080ee49f7325d104865bd295ee965ec04b5c7a2ac56308d11439e106f3821df36c5079e40ffac915793ca2fdc7e456f4dee1e10e35dc1c10406fa64c4a893da9438a62e012d1d10701cf6ab37eda37864808ea87510456efc031c4ac8d658a011b75b500955751aa8a29aac12bff211c154ed6a3e8596827aa8b59d5e63db995b04e23b1210b3878dfb920645747231334a04a018ad12e15b20e6ed330c4c6d3a5b86c2901bbb7fc43011b16dd7a6a7caa991e7b637bd400c4cdb722cf11cc73c02846c08ded81f76157b7c46b4dbd47f76cc8268a6f2ff905415e3a4b8ca9d354c8f48a53b9ccb8130b224e08991cfa383005bd343d8663642ad8bd76bd845c88143a9d5d504c179e9018376154c2e4be8a2abdb75a8954216a8de5fed9960b3775c8bdbded4abb084c5bafd90484c6a182cf44125d2536fa2248ab8e0478708970e7c4296105df22c1d96f478def279791d7cb90a6641e9fa44d8e1369964d899e5f9943beddbc122c7270fe85e019a4eb4cccccea711e8acab2b60ad7d9244aa61a7237e67fd601e508c5b221f0a9ff4dcfc00d45085a5131af7e58743d92a670f9ce2bc30d535a1e8b41eaa8ced8f5cc6a11a85c9daffd668794d294ea6ea54f9899bf4bdefd3ae0034cd59449b1de7c7f4e1f492a4aa11a01e1072608cc6108986f9b6e35b2cbbd3283cd98c5e334e868334ac8670443b960635902da41b7d58aec3c2e95a74a26afd40481c37019b54b8e382f14c1410591dc88935c81a8ff9480bdc566a017783fb49ef1dbb4683286a58bcd6050fe92e07fd32f79dca12e880c175813a98e0c141f7d0c7a6e06afd7850664f48bb91e829523baabfb0e6766f6013c7dadcb5d2c8d8a8face16524b4a8ce1c55858403856a1471f3b4f63b9e2f3845d975125b0308b8825df13086d11e4eff4c1f34621d04a17e107707bdc84aaab8319383cfe6195ba2c46bdd5eba40542e0ab91d2e7165a91f67dbcd792be636fd0df556befe187aa407ec2a7074c39ff861ad2f43f2dd11e1c8dc0fce63fb7678facb08acb1525261acaf76463d2092ef04c792025377669aa7f598ade3402c416545b930c913ea531501", "5253006500", 2, -743904984, 0, "7c0a79659f47ebc16e1eabbc7d709aff5309202aede3e744c8d9b00aa6230620"], + ["030000807082c4030469a5f9227d1ebe88a9cf5566ac6f59d6a4734069bbdcc55d58eda002f5d297e70000000002000078eb9e53436a6557f1f1a2dc20ccf87df407ed9f52b3b95d434c524d1a29cdf4e335d0370100000003ac5353ffffffff99080365df9882293b1d0961dbafb86b8330f933efd2999b8ed74e6209b6c0b500000000055165526a51d95fb2e0c3ca4ac733ce1cd73fffd08cd7ae041519cce28f1969defa6506e8fa963fa0cd0100000004006363523ca345d3046a391a030000000003acac52e49175010000000008ac63006a6300516aff8446050000000007515252006300ac54fea101000000000763ac6300ac00630000000025e92afe030000000000000000c82fd30200000000e519c1aa3bc39bfa2b88fe40b15db44b74afa3784922cf95725b8021d54e5ffb60732defa6b7a6121f3fc75e232acc5c2d3f60614e0bb5788acbc839adbf3a8f1505cbd0a1146c0446922718835ec2923a762bce3394490257f31a1f1ad7ee410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060d279bb9970b7c2987b27e068f721eacaa3de7a8ba1ac8cf9077d547cdf26e1bbfa713c0be35c1d5af3e9a369dc9123083340a11eb71543acf697eacce4df6cc4d5c8c859fc7d65c34644210c0ea3945deb0901014bad5127659462a41a7a0987e7703985d8f997431119e3c908eae6f0a87182f57c7d20101532ea7faa4f4f02147de1b4a05f7dd2665949fb6ae8e0a75ee28fc5d749ac1f7ec8727a90847a1f022ab0e3d73fe1f72dc95f79a0ce68484e5133d10ee51b84e0439dfc118fd367fb0a0582a75e46db220148f70a921be386a3ba48821434107f1f256fafc3b3ffd86b40b6ef69391ec02f2419d50d23c59813254813858eca0b7fd3c46e3108b8c7000312f3d10ed442c4883ceedebf941b2528e7d641e1400d3de080947eed782591b3021e04e6eed90dfa06087f11c1499cf0ab9627c880c7d1abc8dd41a44c45b7a8b403029adad29c4125dd6e2625204126b5b99b2073f9b421eac2ee5d3dfe7d9d84920224cadcd4ca53858a0681ad7f3f795de63ca04c817907104875776fa125ac0067020521100066407a656e5bbf940560ddda89d851aa5761922c7aa5d871ab8030e8166f23f1e306936f185f0c0cb6468a88f60e636790e779bd2f5774a9568dcbb7ac7c56264b115f4747787a54be7c71207913d772e9f25e462f089eab53c7205848d1fe439acec03bfb5ec40c749d258c865bf5ba33b608ff021df235fd2703f7cab094cbc9f59c9547483e018226f0c3b61712186d4eb272b175a6d5aebfcf0edb20ce9b82ca3e5699cf114406aabafc5978b209713416c277d7430a3f734b42683b8d03299cf265fcd786199753207ec8ec1daf13e2848e2973b6e984e674382952440d0cabd761c2a5b632b6b646f423744fe3914f16bd9d61068c50cbf5a3fbc6130c8ee9dca2bb2be4399c45f28f9ea82eaf90cb4f9aa81385f2f46fd2fb4c4c54cc3fb9155dd7fdfbf371bd836559eed5657535acaf79e24a72aeaabe75cca290a55b7c7d11a70b523682302bfd72794015702bceac55850eae82fca5ccaf2907dca9334a06c747fb9f07dafcc977d382e2f20d6d595d74c1e5481f97d49b6a423ee70ea2abd0729fd7c562eef6033ad6dc0a96b22ddb01ea61ccc86ede50f9be56ef0a33f3d6c75b582ecb213a9325ae60883598007c46cf5266b9afc0e74de69e9dcac81986d66f9bd1ae159d0ee8b582a934c2abb3c7b634f0a700bbe95a404cd26e7c0c510a494a091a7a79d547f5b2627231b871383e6d988ee2dff46e304e491b45c6cdb2cfd6cdb0ea24e4ef858f246ab15faec5c88a42dca8342ba2343e894bc38e43380a4d33f0b86996485cbab9fc0ea02268bad1ca6212f98fb583b6088ad1a4524d0092142cfe4156039c41e178c541c799a0ac04e2aca48bc3bd6684291a19fd3cb13ed6ce6248212183877b6d36208d4a939377434be66a212272caf0923bc09f312105900832aade0f2c99b1bb24ac834f913a50387c62977271b0ecdb6a312211bd378ee2d2d87bb163b4661eb46309c3b7337309ab0f0e92d1969cadb01fb06b898104cef64feb5e652bc961e81350b1f095432bb5c29750af1261e762171e657f41e25680243ccde717c682d5cdb9368211137f223a452f1cfd8f3e956665375d64e9a7ffd4b04489d585fb822646dd10b34003a60c7d1a7da3d04f2918433ecc6103d27b917bb8c7faf5c84354aacaf689af611b036162794cdc65837791825203b3f1c7cee423569725ee91c99005f0087a07539be149497afa21235cc9f927d0b1b1b43668ae643a58817b0e352de82baebb1b9fc2e042e70d41621b8c09bf1d3dc13a0fbcf4e10a602b64c9bd70418ae2c8a266e2ed433e9962ecff0a6aaeae55500a15bd361e39648bf0d107d8b8ecd696d034c0f92ae555f56feb209dd2ac292e3d9a536b21e348ce1487f7156c0057408ddeb532d2aec4c101610bcb6c8e66859d6667e222e62672b77b1af089c2f8c2d12754762318cf8d6268b4e63e4690e6dd7acae88f027afc919982f4de33044bd30ee4d4efb9c1e0fd583fcfbe00e8c8d8746a6ea06ddaed6733bf37d1820f64bf360e2e9bed9879d9f57d7c305a1079d7a2be86d9cbd15b91f89e2411cd68bbe84d2212feab3a903f5aca6ef790f882917d22eddacdc8a3a4f8eda1014226d37a9ba2a68623623cc9e99a4c4968fb4ba1987f0c041e24b52839d0f8afd8f012af2b47aeb32da6efddb797cb7a4212e8b223f02865d3cdadeaf53c9255d71b6636e1c48a2be7a3c4be564b42e1df1cf7d948230000000000000000fabca20400000000ec723c66ecd1ef4e568bf5381e66e93bc1ac0cf89ae255ff224f2b8233ab8087f1b9bd5bdc7695aab16e231dea9b1e98fdace8de4ad8f7a4b1b3885f12f0e628b0e4c2305a92daaf14d6909d58022c5109e31b5d02b3ca0224dd333a85c20c3200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000faaec8d050db73fc542ec526afe41468834108107a53c6c7354a507dde4c5c91be08f401e81f7d2e6a008c02dbe07fb2a83007e5d6e4483398d1091f09fc6ea038c08eaabca7d7111ac61eca6ebd893e198dde313e0094f89069195a54caf8b7862a56b537d84b2c18e2d5dfeb265cf0abc3eaa0d1994c8e4435a03f97fde41a0206895781669efbd445df437b48f692a03bc2a15305d4a89e4ea9b47ba6c797f2021941408b1de75dece9f20d74fade70f5558f45e9b093b815c230a76b78e8d7870b0904a0f2da20fcc49591e4b9543f6d5bf36d3672a4dc96ce0265bd3bb6571df89528d77bfe7ea4b783f291a39f5d1549b9b1f1a5142ee0b691d93ad001efcf860211da405e2b895c3648c01941c897d99ffd642f0663ac3d6233eb1a715a33f094032238a5add35393004374d75846094f3c670edf443ef842462c2da0f5f768247f03297d5c9171244e489e0379dcafe3f8528d998b0bafaf4f801d1dc949f9dfae1e0324a5d2f18838af1b9bd59f49856b5aa807724618de429c4cb3843923b366355c032facf868eef7962c8b6c3cba9aadea1caba136a85468b86b5bc224c17cfaf676cf8f1aa8ff86c00efd5a162d412f78c4abf4dceac02d90eb7a825f5d84d1fb475a1d009118ec5d63a6e00711bb17a658228546a6b5647981ac73632b496007107828cb4afbd8407b3a23e7818ce21362a1eaefb5128256013f79fc2a672c3bcf00976762a753399eb3dbe1f26e88ba561cce7d1089bf5ee8881f3127d562abd9ef5cf419beccc819d711bdcce9c5c05b12ddaa409df70da9dde0cd125e75f5d8f1c1d5cf468dbf5653dc09c33de2776d131fe811d023e655fada85cac5c5bf914be401fc69cd2919ee4e21e7749edc23679ce6e562c8a4ce1de55a7cd6d84d4e899b2d723ed0cb824a840cf456c773c0b7f193450b011186adb0df015d59a3534e985aad7c884140fa1759b23aa8293bafefced774be5112589c1e195e6f4e4a08066ad1999ddde913518c133d1b065eff19a128cf6303e64536585ccf7807695efd724f98769ecd639e818f4695bead664353ed81fd44636fb9cb545024fd87f478aba6fd9ce886d02eb6647a5accca4e9b92ec7d8641361204aae533eaa2c80edcc44738e9e51336812424537f569698d1776850e522cbf25169d798fcbe92cf72d30d0bde6aed397e82f1f0df37fe9602fd05c38366403b195ef4c86162e782897e39f98f65896fd33427098d9e5859471e699f37c874b591b792e8bf3b876527e09120c4fdfb7f809eb22af11b709fe1378ec3e5c97422e57533ae4578c4922b4629dd020632f43475200a74c4ca4b39165c42fff7887dd4d424277fa2a3fe6376400d21a73a81a63d2c59a83bf73c98b53e9ee6aed18e812c499bc098d8549635729e8649285bee75c5d1677dc1f921711b679bbd5ace63c51ac6901b52e062a6f61271284446f4e25d1088a563f4a02770ca95bbf2d6704b6c2b46509c5236e2f78a056f6358a872ebd5a1401a05eb874c646fbad7b5d5db17488ab8386f93559476f607eb1839ebe47e5aa8fac860f7173b3ccbf200ad27289be03fe55d18361522bcb0f1ac608b7284fea07d9b47691266e7ca63e33b8a1b5f80a298e4569a435340f70cb673e783ea888ef98f54e6c032917417df337429d575895c8e72b5a5d04828c1d07ee478a9e4287d2255fa18d3c6a287c9e96f50eb31d930d52f667654fc848fcd234a183892be6c32de5b3aeaa486f423581198d968b3d4f436b8c47b1e8cd398ea41cd8c6eb2a98891b965f2ad7c1e65ec4a149aedda35eed9f4355f91298423083f05ec572f4de0a67233b8fddffdeb94f1c8f542485955c3bb847aa8dfc66f243088dcc77497f2ce6d90261a9836fa1e830ec806b1b2f262ce2905cbf113c0325854634287dff01664308f03fa76c329e01074a4a5b4d860092dfeb1f449216d1840cdbbe7a9d1cc149bac52890a9bb9495c773213535dfa15aeae75027476691a00f24f956440b7605446cbf7c38dc35d5f755a60579f6153ef775aa48db5551179d714b0120b871bc6d0a4edc61fa3e94e7b251e62868a35e74b71573b4a6612a8270a5624f37817885d89c6ddcb1161513138c629cd440ba8257b315fcc59f15075f705bc70e41059064292ac359becd396f75947475c743eb978c2c4859fdfdc1a347d07268b9c94f1ab96348d356c7e3e34aca0a5cb2ffa40502ba326d895addc1d5d54d3311eed09249d75f7cd8b7f8b4b6f672130de3da44286b9f563f0ae79d5de77ba2b617df903000000000000000000000000d4d017ce19487122a512afacd8dc54c74785f6cd155b4b6287615e6c4a6e7483bbe5292d371e984998b03d6b722b55f51a703b90a30a779c224fa1eb60026cf3c7fa383d989a2a3ba3ad071e3654742e8666201cf73d22e5f19dcd5c1cd02be70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042f95f9bfe768530bae6f546ec14bd44842eab71c3eff0ec907aad4b02cc786a4af02f6b90d5c45c89641cb32720b0019dd9616feda57b4f20173553819faddca2f6c8ae855fea78726e02c744746087e1ef3983fd33aa37f7bb4678f3bd95cff5248315e196bdc4c95540fa11bd98d5f024895f171cf27b8cc3d589b1c55ecc021e4e026b9ce35ffa523f72d652ba98365f4cd3362f381f24663a762d0b52cec5032d6462df4a104d4f827657cecd3012270690003503d938a43086b7426cbab19a0a0554437d98ae0bb14e445c9832873c5838e36257ed287801920a960c096bb11a3e113d4842cbee42db2d832db6c312689ad9735cd441e72f45331b5b9187b375030bd2fcb5f74066110e9e145b67e23787731495161082973bb11b56e050bdd570020e42576828852e386487fa99320af9868c0848e6f5f399b7837cb33161a5749f0318a12f363ea901009d5d64d1b7898bcc52c1e7dbb4335c38782367045114d594031c3ed875a7b73a3f5beb03ab2e9e5546f570c7ae05a7755708ca313cf13361b00313d22ac49551cdf81d0fa8339dc73c729404dd48131a9b9957cedd9aee1644780a010268688c7a31f17ffeaf6bfeac37fe76848ea0bc9e59e10e833c604bb44d407821e873d9cfbe9d5db4d1db9899e8940608d23666febf257bf30dd79881688a714d4b6dfdcf474cfcf8c2f328826791889d3dcf9877821cdc06b0b177bd79b9cf992396c2e1beb5cb133a2f239c5fe01179ba247b6a68b25731926dd72e2b9fdf86eec74cca9d535fc1be7db78aa6b4451fb94c0a02985cc38cbb30f4141a4723e5ffd6df41f5cb027eb09229fe924584e324b8fab6de938f1d9fec7f636046d2cea2ef56f81a88e84855f08ff11a0effe56aa9771bba721a803a458e0537f87a6266c937994fa56e9927b1a82b493cfce925d92c7797ed384f88532ee5dab18a194987be6610cc93f9e02bcbd70db14a5e7b38236e635ca10300752cbc24056542f183f50c5a632207526a7eaaaff13381df55a2c2ab7303f076277f67f6ccaef5476f609853c1731110f8ea334426c752f206283a6aa13c91db8d0a48a414c16fbf576e49f8816cd185e69910c5f8c8a5ddddee492017c4122539728dedb24258866faaa982a669e18b2c6553c42836c0f1ba684626b3d7e4f6cb6fc879eab0f61c1b400c0ba8c4db870e2b9a08cb9035ad3c4cd07da4288c8e7889f6a120bb2577158372eab86e536a42c24dc6a95e58baa5129c904e2741bd00b3d5ae82476673d3e0b45f6f42c94678aa1774ddd998b5f85375ba1447b3eafad40106650cfb170b975ab2941f48c46cffa3362914ef0198d757c5325b4af83e0ee1f5cefaf559fd21e6786f2eb952d77b4d0306d0d024a57b4d5f7555af651c4ac9ed481f6f50de07b6c73430d42ebeb1e8c64ba13092073b5c0bba48b6866fefddff5d83b2832678572297c6a371e0094ee4b0cf6896625a9e6389467e2cff3af1ea8479a41cf7c337a6a09c0600d638687c96ee718ffba8c6b1b834046b503c966872c278f10f35c5ae0f1e2cd52cd97bf3a0289858dbd6918b5afc9abc7656c86ee7849035d8f4dda6a0e57b1ed5e74cadff1be30fe108753dcf4bac4a4db80b079cf1b2165f6ca91ec18a753cc04c378f6dd816392cd3a74b34ed07b6009390879192ae697ddb33f1bfa24306bfa3a1aa22766db7473b6eccfd468a9573d8060b4f62e844949b94aab6da2902f3a1ba8e8b119015d2c3c9d005cf7c092c85039c16852cf9788abda5c9717b74cef2bf653fcebdb96d4c12529651e390cc978dc3009c8f93392806bc93bbbe387554532a9094c6138e487fee6d011f317f8d76a1f340cbe4b239fec45a71b0e85f3dcd530e9504a995bdff4938356c9c3da93d3788238489e432d05b8c1ee12a025757cfeda6d4428ad75469714f338453c29b56f6e45891d8518f51bc05a326c167fe17e2115097e72d49815bfd5144a7594461c2c1521ed2220c1d73a131f758d4c54a415f89c36bbddc089a1fa7dfad879d7f5f6d7e5ea9c8e1c18917771ba785be379b3b0f859c6dac1cbd2dac373667db75b18222f0c8b453b0629d93b5ca0276c5abfaaf59605a674090ad8cecb0c41ccce1204f437bb9725d53e9f3ad1959f86b884fbc2373009fceff0c75a788531201c48610b83f1379f5b1f62753e06d9ccd63657dadce1669844aab345f86ec098e60d056d3038fb9316bca9e0fa9d975b71fe144ad2514c4646ca4955960230d5c96171552a27b00733ff1bf46c15abbeee4f4cbc170eb6aeef7386341e5b726c640d996c76a46e0853727ef1bfa9e8059c9cbacbc1fbdd2bd63ff68573056083310187571b3f4a87efbd1acfc771eaf3acdd0cc27bf2499c667346af302a35693c2cbd05c1b7e523e6f40e9e70d6d5bec4308", "6352526a", 3, 633892843, 0, "954f0efe2ee1c5c3c888fd01713032632af04a9505489fba2c3be22461387a79"], + ["030000807082c4030450506aa2e963d642319fbd8884625dd60e6791d8686f23e265725b447d3e595e0000000000ffffffff79b143586334edb7146c7b83fe07fdacb77d96cdc282a82c7eafa632286879a0010000000653ac656551acffffffff9206b14e252ecaee856f91d04a87615ccff8f3deaa0d0bc583af6ac9ae51220b010000000100c7fc510571350e2ca08799eb09bbf7f71ae7f64a2100d4c45c55bf6070c2e18f1779fec10300000006636a65ac5265de07c772010132a002000000000765ac516a65656500000000000000000396a506010000000000000000000000006bf0e217eaeb157436a882967d203e4e081632caefb8f3c03da55244152ad52c127869d0a3168f76c007b219c21003dcb7b3fbfcb47a392d44583ed1d6dfaae95a0e08d052ecfbae65c312fcc88ff8f333f922ff0d8d5e17027e73fe510f001500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b16471115ddfac1f19a2f443e6e9bc946d0a053ddb80d9305c73e8e66a731d7d83dbc1256c29de35375e1e23a0c2bb3fa4798167c86e58dca18e1ee2f62c3afde29d18cc86e52482c77d2f650e8beab8fb6fbe1cdf88495b7ff7195e6be4255d18361a71e5e80b79a7cd7cc7323a12156756cba6c1e9d7013a7d759a98f14e990324bf992075a54ce97b1bd310dd57abdce28bff498f982ed3c5ad9a2014edafc20206a5edc34a8675358159691e3e3bc487853674a550467b7be0bcefc0be8edbbf0a05630a11d5545038c76c0ad5ce8b8744f4efaf8d48ac6b328fc6347f337ae6ad8f9225003349fa5111e5fbee77a6f92eded24f9656d3e3b4bb8eee31dcf0b7150209436b6577e41b20323bf21a496d76f180943813dd5cd256410f768cfcad97ac020d5ec9cde5263bd9bd99e6dfce23c530cb9f29b283d2da51b76c2e7165e7ced3021848224470e216ecbbd390b5b036967c0171154f642aabd284648ceb63d4fd5e0219a61c80caed0ab8a7ff74318dec58b1cc9630a73f3e95f6e49be0ab3b1c4e84031c119fb0a2537c6ed570aa152d83c3c3e56c4c839062fccd23b958fd1a848d8c828241632231aabab257964852d854465cb8b5ad4e794744d95ae2ef433bfb840978cde9901f406d541a3987358d67f5b051de144906572940fdedc923b7b2ba6d3fbe26185c7cee6348406d4d3ca18fa42a21f8b91b34c549d1c8aaa8155360da5cd805fb28b52389865731e0aa9e8467118baefb52db0ef827917e2722a473729cacf08a11cd46b368ba6cc884735fb40cbe1a4afe59eae05a8d4378f392c52f45ededaa8b11905be0cdf37fa8e0f117e3068229d392c0afa6737eaca972957a87c450d2bfcfba571e05fee60f12b3ddfa6ce987f62d93cd1ca22dd620435672483440e7ec7df4840e819f8bafb90db90fd9e67154b9a84e63b798dfc2477c7d636956fa752df71f48f392b760dd6cd25063f722cb0ad3d58992e3069c617e7ef4025bcfb10a2751051a3c2eb0dfe6d4ae19f19ba2acbae3309c03c421793c4d42e8be4f89186a8ae58b022559c4a4c8587e203f72249ab5b7533fdd516f586c8398fcc7d1dead18bdb924bbb97bfa1573ef251b5ee4f4ab87710d1bbab90a85ce02904ad37768179c39aec83d4e8d21a1daf18282a5adcf20393e4f0ef0b60372bdb1b4b6183e6b133542cfad826ba5dd8d009af36bd6aa4d0e9f1a9335cdb8e0e4317a1838f4e28f8f21cc7b1b2f1ec0a45ca86327b1a84cb1512f3d0b59cb0ff810c6481662fad3b04a734e842834d8ebd1833af04c4e8e4baf66e791c7bb6c91fc6927faf3dd3002716b153eb2868f8e232d7cf7be62b7ab09dbe8f1760a0819b1e21e4706825b38e92f911821e0278d803dfbae630c4782de9c7d79e8660b840481feed93ce883cfaf9e5978230cdc25dca23d53f0d3410fc226bbfbf9e67f1dbd92379307e2ec79e14858f1b7367e885ef6da8fdf332ac6556847daccc406ca2f88b83d725d2fac46ca132d2081fa233528bc8150aa8e725288825d4a5349efa5cf5531c1603426ba9649de2b481544aea17a662000e54a31d055854479499419c1fb032103fa27ab35ce15434e504581a3e9de0c9c3b1777ba303ee29b5e4a14dea1c7c6fd663c317eceb959099631f66b6c093c0bb4209c9fce52c4c31fa8f6f955eb90a22e502a30caff859e6f463dbee3960dfad7a604cee90206ee340a0833a35c745c9c0e507c3bd76cd49500d3957f4aad5ec60e33e551ad13e40d24d75babe04d6debef38955a5da9c819c1d87db4d967249fa66d1cac8f49248ac3072c245a569850bfa6ba23ec5890f06e1701af589f8fde85b4357c19acb75b2bfce3c97df6cfd4d70079401ebe5664d63efa63a6a56660386c180812178d8dd7031ecbd6bca8d78e5e8b5ca3285fa1840b109c1d82c6aa82c7e7f7bf013e5c05107169e4d6af39e61135ceb808bb56fc0d98b9e3a72ae2cc1ff1758dc39de56e878bf87802bf4dcd211f1316060d9be4f2db646c02af3d17e763ef0645fbb9ebfe81d37a96daae0cde1575b5d190f3502690e672ca084c1e9e5ca98cebb9120a017d344c1e83278284cc53f03b52392603059046bcb2f97b8a0d6b4be90bddaab1108d2fc8e07e7c4a1f54c87a6e0a0c17c501967b2095c18e7eaf8bdb352983fed5e0ade85be160071964800c6a97efcb3b622c1024c858dfa8bb1fa13670098168e6046e5b37dba8d83a4f563eb17ed3de3d7c15bcd2bce13e9e969d43b1e48fa1f91a3712a336f16bf5898299eaefafe020000000000000000000000009c245c2209257a94981c3ec9dc13eb9f9a154434f501d48bbf9e25f1c895e133128b1383e104642a0ec2afb1abd6d2f782a317fd0cfd7091dd1e80191c485aa6c3267af5e6417d1842a23280111ea9d7ceb24d418da38c1a61cb900d022d5b0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a3ac1db941489cb0c3ef8b4ad978e2586c02b20bb3569fd97555673f9251cb330bfcb727d0c64db8e1bb35aa22e65fa965b9285bed3a6f406c84c9da347feb1bc31a25895c23b95a8a0731be7367edc891b3d0008e295bc07e4c20d2e29911c484b043a36456e72b9e0ee76691cab0958b7e57a084e189b6c7ce0e77436318a70310354cafd8c29caa3d313aa37b716dd59143d91f1898de049584847a3daea42302184f070b2cc151b63b3e18fca9a784b3288cd648fdf1cf72391160d868be677f0a07c28520e61e9fa0d987bcefd42a3d7addb0957f5bf55a4925d3aaf2d929ab97736f7777eaa9b4ef1abc1f0b342bc7a4c971da23e184729ff800fe370065bd3403096cb5f78883692eb09b7baf0b3fa5b9e743013b0ef43975dddea09cffcff6cf03054dceeb11e7bbb97d96b1b41dcf50b87dfa5d31c572af747915cbbd986ecdd002124d6bab4319ea30dc7ba4a26c708e643a372fe128df66337ff84d0473429ab40208720f769bfac54078b1f0b9f7f9de6aa943c1cf5738ef13baf5f0cbabb6b989032dd0f6ba6d0fa5082001b21973438f3348c752441b808664cc1b4d053b3b376a3f5ad69ed73a3cd606a1dac406b179847852e2eb3e0052f90af98cbcf4502f2cc53c6106690b975a067cfd7bfd4b6e00744481ea8fdf82f56098a4564d1a1b0899fd903c725276521dcea8d9c44a119579d1d98652f67e91d96d563555b7310a5c37e2611bd4856dc8c3d6291b6aa80848d9b57db5304bbd74a387e1d351e81b0c0a03cc2ddc55b2f563d04db6219d36c587f2bf9b1a47c7a5ab288e7b2c842b4f6b3eb7778918f5985a912c20e74c60f9f39ba07972689baf60a8a26f8d15f38af99e99ed5cdabb061e6911278e62aa101778b308806bf2a8b1f8eb1caaf68e05839a607859a16b3a6d459723e1d374b12a3f60d2c6ec5f67f164ce2ec0d45aa2265b33d01a21813ee464ce3e01785609a22e9cd7f2e79c4ddcb795a31a1defbe20a91b3b75cace322721e22f7b1a7c1f1093280421ea8eb847e462c6495cf823e319c1d82719d821aa653c87f6ab7aa97140b389a6f57ef95e4af3a030a7b42a26b9557faf6ca737e50f1929fda106bc319680182b2dd0b553c230f3eb9cd5a9013de74ba455ef53453dd65232dee9466bfa763cd4834a962249306a463e5af92aa2c393a2017b608fbdfa569fa5a829fcc66b83b7c12ebe5faa7e28deadff2c4b038698b3ccaf89fd9ba6cf0b136e849d744ff7816869a91ead7cbd8d61743919056cd5c44e397562c4cb3787812dcec349ea2e74c051ae52fb9817bb05c8492f70a1a26cc9aea2519872e4d05f559676a0ba11431c25534c2c98e7456406b2183b2fef7f4435440b4edee01c9b5b75d618851fb294dc12ad272cd472bce703542742f780515a157b6bb4cbdbf900cf82968b554c1d35aa39fbc7b6549dd6b47083996b2f0959a228da9c6019d24b0c89d5bee7ec808383e83f931046b625013d3b6eb488f0ca13cbcced1b3fc50d40d611dbc962caa548a11e7a3ab824de2201e9012f8c5caa58fa56887ec0a8dbbf77cee7de24541b7900c4b5bc824d3a7724b5794a9cfa48578357911d8e0fd2ac2354d4db7ca0450792bdb7ed590823156b198683c93ff13ff2aa3f20993198b3e41cfd86c1b1aaea9b36dd22d9c950d14671fdbe31708907a453969d44686f61558f5e28078c3cdef71d25165f7baa473d11c77033365095b3df0ef2cceb1332c98b7a559bee435994d75928fc4118b61441cc388331fb0882b18ea1bdb38e19b5af19a01f5e30e34c40ce238b2ca511d750a76262c78eec29b590e495689e16be721b2e1c48169233ae2eac3ba7aadf224539843b8e773fd0f1b5c479e351d4f38a9b7e1584859ef9a7fc41e596cfbe113a883d8bee1d0a713889518efdc27a60482be9a3b1a05396a80056ea79e0ce44d94064436e2d63428b91da5e43a92a2975c0604e7f86c8ca7d5bb8258528f251a73cf7ecdce53a90be9370b6ce14a7843804e386beff35976c0e98ff211a43b9f41419fff8785452e72c36de7a7c852e311504a4b532bb67964f704b9c5b9cec3bedb86a4d189f31f1faa0e113ad0f8a4168f757a7d5f9f812ff0533a083a44cbe20fc57793955a4761261dbefe5cf2fe40c0e9b02484f1057e6c1f029a0ce5ae521d1b42e6ef4a2834d39dc2e63a70d46b8c77f6e67a9d0054b64197c8a5f51e51e062e5e150573b7bd2437f7894d4e0bebc6563f0223ba219ba25be0156e9d6531aead8229f8cd8da1573f2472d8112234ff04000000000000000000000000edca4c6b5e5c11f5ab83279a96a58eda3a79cc396e216a2a848a94c9d5d8be34d9cc1c3b08bd6a9db7b5208a556eb464f98f4bdfc0690ecc8d24a3efbef417c12ecd3fbc2fc16f562625941a56785d08b5077d1e576e74c4e368fdea2230645c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f3a51e2c11f9e269a82accfede7387bafdb03c3b5f173f41ba81cb3dda4b8b2d4011d36d7905a098d06d7feb1b2b652931aef7b1e6bd4c1fb075cc4d4cc857f3a0737d29dc3f1632e9449bf1ed6f02bb4108ebdd41d32ba09c49b57f6c1ee124a46c746e42cb870e7d09dc87513883cf21caab47db621dba86b190756f3f19d020216e8d6695e8d689dcad69fa436896da0db891434717a3c03da4a65a43ea5c902303533a4694525ef470ad2d2bfcfba1d33f672b39cbb9d8137decb2febd042400b04bf42b0a15292caeb71dc7e709d39da838df7fd695e5f62b65230108aaebbd56b90b1a483e2613d040cd15afe598e888d8fcfeeef257879bc8b87be7434d7ae0328ec5b195f628270839134bc5f8af933faf11119001aa6ee4e8849439a197b650200ed00b46d49973a574b3652271935b1da2da8cf5855d61b3f4b7cd3664bcc410220ec531e70027d50fb764026007a1fea28d73fa660449e2585ea323920cf37d2030b4307e70b9389aa948d82767318f05d416cbf0741e59edeb2358bfebd9c3858032995d83c89fa7ee0ea1affb8d1909782a9b032e57f83551c20d80f390d98989c464e1cac97ffdded19fec37bb0486303739615eb5d20f55312ab2401c692d88a34af2436183cd4a919a7af311f81d88ea1b6cda99efb1a3727554f456cbcfecbec13b2271679fc0620c656eb04f6b170fa450baaee2799d020c9665afb6241e270621c141046874c41197ab847603f29cc86d418efd516ea257b924b3001ec3e23f10107b2c73a04669f7793cc54381cad4d0a6bae889057c7b4995aa78ced635ab6613b166a360adff94091fabf65236a4605d5fca14d49b964b08a7ce19c7b4a999a49a8ddd96d56720f01976947ec12b5f916f7b3fad5afcd0c26806c84f7721f8d07e219ddb7d9c12dc8701779cf88fddcbcb3be437813958cf27ad0ab4191d7ca95972bdc00f711819916b47e9fa2098aa5721261c44af6c0a4896312be93ddf159c3ef2b57fa3bc374df73710d9d5ef67fb1351ec456648d909ce81031e3728c0e4635bdcb425500962d43c7b01328c16d719973fee42fb3a7186b76cc088c11620407c3e1580f8711359ed6b7ac462a31121c64ce277239c117c0dc074cdb2f106decc23f543159da066b06cfc2230edc130ef7e73dd6720c6357c3ae59bd6ebd36da188e0addd18398029e5a5e748c7e0a861c19a1074c40862ad724a1da16e57381a45fa70a951b7def95e7983d9c52251f92bbc3ff60885d2fad4ba3662ab51118f28ccf6a30607d613a3027ba63b7fc8ee51c482f0a4a44f88cfb71c52dec1dd2ffbf4dd2422afa12a7c7a0f4a23dfc3e6cd48df08de25eed5746f18e350e55e0462f6e3125d755961af2722aefc353befcc88aaefc1410c84402e2495f91bc565af2737e405665b5be96d43813c62392b0f8ee48a5c7d781e02ee31252d462164eafe6ae1cc72cf1a479087afec084cea1d33692670815cce814a3fe64ee0905eb33b7ef922721cf3e5d4455c21e0db9e243197daa20ec93115ca97d06b43b8eca4d2d1d0c30dc39bf530a8d500157ee0aa3e54d0894a2b2dcd4f1350f26893aac58af5bb61af6fa777eb36c8c353d58ff55406b48c83961ad261fbb96c8d3aeea9d455768927a66cf00a7b6e14c368570edaca95e7d1e2ba46f697284009d077fcb53b5a34637aadf7b07428476e2f7b1fd1e475bcae1411d1c93129717e4fff66ca18d1c588ad1d7404241e963528b06adda5fb02a64ba22c977d7d92843f149d883bc9ae2a3c8c10103cbd8702c4af80d1c66c880789ed1d978d8ffffd2196ab3545ad78cfe4f04835ff9a8477de2388e3398d4549e15df3d20f6a0524b90360cc99e5ed38ff4ac830efb796e070a0d217b89d43f11876521b42f5aa3c8e21b833eeb0e021f9b4f0442a866c393ed2223e22578b6663bea0ccc9adea8ab0c68e6a9a2216de161380d7368286af44a6521a79e4a8ce94d7bdfb70d87c5d3535ce82170271939c077d7ffe5a86bd2f6754946b6e2089d54698dfefd6f8023426a69665f03151712b6c5e67b07446b26b90cd2f6480aefdb464d5eaa3349359a92a7c5aa63a4d2f1565ea3c8f1493d2e3bb50a3b91d023a2b675a6f7c7d12c44cbe05b047839004201c356e06ae43a7053b7c85cdf9e623b4f0671fad15c9cdc45a6403955935547d46d1b1ad1f36d9e0ba4e8010de4e3d4ecbe820d9fd27b8f36d51d052612eb20c136c95631d44ebaed3416f4de8bf9f6ce3f81ac0ea4ab16a724fb8941d92b2fd57b27fbcb50a53d56ffb172b2aef35da264c11d129c5f94a51580e2c7eed52b70b234d40ba37e10c419d02fb87e0105a3533d2391d150c20eed778af3cabdc8f9ed053bf6c31ee364046da0b352fc940ccff6f8779ab8569370b942e5d3cbd3251a5b08", "5163656aac6a53", 0, 1043270996, 1537743641, "dd1ef517cbd81cbc1a7ca17b46cdc3162a07b3ed03bbe1494f14a749b6031dd2"], + ["4075703d01febb934d9ccf4440451aee840bea194468dc8329aa3553108e5f265058eb7bf40100000000ffffffff047f110a010000000007526a53516a005261fbec040000000005530000636536611d000000000007635100ac526aac48419002000000000163d5ebcc3703ebdb5e04000000000000000000000000e26d326e9208badb0b8837d7777d1cb151c985c6a054b09baecfc51e27dc7fa8dcd4664676c54069c1147cc19be0caba30c25dde3f9c48ce3eb3d77034de57f2d47fdd3b73c8fe944de20e50429a183215369df87e6491fa453f010cee896ef7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d8a1477f26cf77284c7d5a14b0c1c17aa221c0efd7cbc922a49c0e030eaee202b0ccde1d5fe8169a79b9ebaea0d312a0e0625e9da32d087fdb4959a95f5eee81c0ba039abbbec6ed04d33e28935caff7e88b3de631a5cae7309d73f4f1dcf54c993bc57fd60da6242b11f57ebb33c86e6b7162caa7f0f839f4210aa83b24c1e030a1431be69d7182e88d6b4eda72dddf3ded4f8d4c44ba303232faaf503c871ac0207b321b9842537818888980d6c697c336285aac3daa6023901bc268d9f0f0b5c0b01fdd9650a191acb19a57a712066d4db9f59d1c7e30b9874bc536b44d66d19847e3eac6ef96e907024aea332992d26e0ad4a492581e9056d92c227cf0774509a03087c4d49b25b3564398fb9a5c93ea229c69d26c6a5e81334b62b576a4b5e96950206212f6e3ee82b62bcf83c22de6d1349f985f23d8722c7c8cbf26374186985d0031758f4963c658ad84e547faaeb4cca86c4acb02e65f4ba55caced7c6d74438ec031ef694de68a915526b1191d4e26d3bd5f4e2364c52f23e7faccbf46bda7e5c82031e5f0b8be057b6ee2a3145c7bd9caa06f66c83ed133f2bde4013b1a8c29ccafe08edae0cab2943bc773a1ea372b405562e1715cc678e6eececdad9bf4192b14443a6cacdb198171ab80e2fe05c21764e14be1284d40614e1bb266278ce66bd06a23643451301a6bc28ee6d0709ea8791239cde3f4a5ec36aa87ee55d2838144165f250b87d61dd379d61c81d33eebefa9b2c5ba619440c7dcc22f3282d8e3a00a425444499169e23d5c6165bf3233d81ad04ec7cee7eb0e3c0049865545ce0d4d5479d2e4e5fcb7dd3a020dc6ad517ab32a37a2216067e138adf11f129bf2101d0a835bc89cd084dcf9cbfd027ccd6d0f725ed503e50679c8f1003da4ffe8c07f78d7ed3ae6e882a343a1a068d2cd56ac64a93bb26b512d9ab0ce948dcf207368c44d9a90411b28343081ef94026b9c866fd1c96e77069d3fb30bcf15b20cc26ae449d1f630441f20ee80bb958491cf49ce9ec0ce3e1f7a9c2bc762bcfb0261dabda3144653d3981e7f379032d9f1f899faa7e4fd30a7d76e677c4591eda2d4f3fa47214d53ad45a738e941d813fa808932337f59af6a692401e54132297eb2dc61a7a3cdd93c1f4bee8ce95debcbff9d3c05c6bac6e8ead857c031dd17848a5bbfcf947deb10fb2eef27be20b80549a0407b033dc99cee3e59df24aabef75281fd396e8958f30f9eff1333eafaf5a9eec9fa7ee397b2d0d03231b9d312555dbe83090729b6e1fd7025842491c9a6de422b7912d10afcf971079880a08df6fa6da028952d214cd87d207ffd740d5ad6bff4de269d7bec94a30cdce04756a693ca1539c257f5fb9461976122af2cea7568f0c71911779449e5e760c783ddfbe1154771734fc6339528b964838cad65edf3e1935174badf3e16f9d3f78185a55441479aa67c8d4edb22885860d402f5cd21dbad8ea4f459589a150bfa08b25e13274f482469f367d26163c80fb15bd9a5b9b1cabc800c9e6206134f2dc87a81c83fc50cedeeb63a3e516b38a5cbea4362f10212d747808a31628d456a3801088ee0e2ee3691371432514a6a9ffc10c72ff03553bc3b799d971d1ff28af2652de4f1f7e5f7af0f9eb61e6dcca646b93dffa5436e040eafcd48885d036af44723fb7f0611cdd4902c737a3b88a3f09b4969e77582980361c87ea0fb3d83ac138129655f6e3b17cc56fe83582fa2fb616db52c0a97ff7e2313cb2e742160af1b8429aa3b2b69235f15860912c5525e10864ea0810b98905cd4af1691877e0d1ee8f926ccd486ae0f4a17988a6e8cd2409bbbc794aae0a988185d3d5327f89425e98b1719bbd67f5aab5de2e052f9e93486a8251d723c7662f2c092a289c2d6040e72f4c1c0669e4507d8205c210001859ef2b5d3eb919156135cd7d064863be301d6b67f96ecb4fe3b2cc30a1445c746476ca2d23b0c49d9fda027b0ceec8e01f190c1140089a863493cd2ea590ce1ef813611f96ae63a67ac1fd6186ff9cdca1ceb654321f3367cdcb477d1fe1b8e63e0f8c7ba8b2c117286c6f6298e43e6033485ea8e75f66065f5b55adb483bc66a01875f295a452d09bdc2d95e1cad40e2288833bdea2d9ad80f828c8cef14ef7b71d51295cead64da062a4aa6b61009143e3e1309a8a0319f15ea706d131681d3ddcd747cd73dac9f701765e473afb46163aa28f09111e654a2546e56d96a1246ac3ea41eea877d7b8344f8a630a2e501eb1dbc2f9bfb357202bfe0946aca6b1870e3820166045c500000000000000000000000000a9f6a2564f9b7a60987957da72c7dd3b02123afa75635c77172d9efd4b4d38d98841590dcbf85db67296002277e7f49e5cf01ad2b8e02bf66b5f8267c89b9aa7d69b7281272d4f5dcb450f2976763bd1e299db999c3d02246b2c0f55ac161e3500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c68035020ce99d11094bc3d17c4a2b00dba6e50524f186f9014b66851e33d31583d87b3d1a526f41a28457785616a2fe4844765b41610799ae926d4506519820258d9c209f4eb122d67c6c089a0cf6a84c42dbefd7c2f9d482b03cfda3f80279e4eefdb4f1f00f25f5ab5d28fe10b34569b20fbdf59b5b675e1d36d20ffafdfe0216aab52c38cdebac365816db6c5f376664dab58284208dd9c76c257b00c0a87d020f23e7fc23c57c17bf74f175039ea910b04457c50128d425b6b36ba4582b074d0a0770156a7e1bc9dc1bc7b58585053e3262c2263fd7e3709dee3fe3dca95a5545e2f7d1285b3440a66d582d3db749e9643ded8072897afbface392a1e009c12bd022881ea1dbd285927c92863f1dc9dcc19e25b6d6803ac51aad91864b935913353022177f0971195997b1b186eb1d193e2a3775c5df5f5df4c426a983034e87e3669020e3eb474fa7a91e3128b36544029976f4940e3a601dbc45c96a031b102ff1745032c3f31d12c00812365c8f75507903f245ad97685b26ec58c42068260e30343a003003f111956c3201b312023f07f19be57d10871327cd898515834083084e3548555afc0b0eaf243066c0c8eff821057e5d21a7f4f60d064dbbd71c450d8e11e9121de317f6141c1838fb812b4154dc7a7249b026cdb18d1090d015d7d7a0453f66d3cd353d8961eb28ec0c722259c9ab89fe28d17c4398a10e5b17b359989438348862c503578e282e62be1a77ff2d0e9dbc02053d0c958a6b6d2d9c3c1187ea3ec9f5ae500be15e63849d8f1f1e98ffedf550e5efc63b810860ace49b4cb25f1d5673612468de46891219cb88a91c3ffe495ef6b0f57edd72d4a262768ab6b28f4064a4cd1f679334e25dc5832a313973e7399212b9792a43316d80659cfdb8e57e7b449e6c7c5eb46df6a084470f1c13a1f93be968fa98e19e0ae371c4d98e10151e10190d63e494f56b99e3ca41d307baad947faa133ea310bce8c180079926377916a376cb46ccd412022901ac9f4f44cab74a4be33e4c07faa073fd2ae69fe3e7964574adf56973555d7ed3f770fb0d66ba1082a7bd720f9250bb064a7c39586c0e7d595b1d961aaadbbe8c346791fc695f6dae6358e340a6f18dd777fee7e50d3403a35fe0ab712e28205536100f6dbd2db846489d208cba30854792ea4ec48406ddbe07d83fd5bbe051e267ea27b1049468fa473ae1211f136242e2558c6bc707685fcb61a45e8b4abc62c05fb5fc5c740272ebe0fd4de4aa43a523dfa92376fc22b2091f137a4666b59b32122374b8e032bad008097755d837a60e61adaa95c7dbfda57648de07914dbcda12a0666c80756eee9c61512e2d4fd3e5b14da710569b72b136c49e34803726b988caa84ba631ae4b6979be91bcffc782d427dbf9e1f745a0fbfc4a26d2bc4c31944889aac2a6f80a12335180bf6bb64bc605ecd9253f0795e38ed8d548c8469faeebdf103bff186d9e3610bb535236068c8e24374a9e7f5a978340364793991eca1756d331fe2badfbca7f04558e0adfd4b4031b2060323389e457b082cd9d0177d6570935a5ff4d75aefe4fb3f10a7ee053b221f42bed1eda188d1dc0e86724751635a88f36dde4226a8c36118f03fbd0f8e1d6410a4a661a27dcdaff9f684c85e1e79da4f54b4dc46b100ddf987ba5dbb8c299f29fae39d4a717b6bad89f590ef56c5d6674dc5a63491750fff1436e11ec0cfdb9425b18e715d4b839998b3ec9be4dcab4737962e1c77f403132f6b139d4007ac6c1c94a41489f70ea71bfeb8efe5553398b92a734b2b75cc23aa3bb4a7eaea32d2c257f5f1f3fa38c924d5432b9df9ff2a1d1222ba03aaa8b12e742d4323cd9c9a3261511b176752a6eb546eb3f467084a2bb4a68576ffb0153e88bfecb9582cc49b176adde0c11b1c24d9c6d57585c7f66b3323f8ec04ea1f0d1868e2b550947cb8cf390fe4a06ec3ff95838cc52bfc8ea6a5ad2f437525b71a9804ab31c296f70dd14fcb3347062147f2dcbb178af87d9316a6b70b6c5e66b43f96b4b9632524930e4541f592d789014e9327aedf0fc031e44a3a3b7e97134a53daa3d81ff8100015ef0ff83656c982578fcd4e78f39f946697a793b0f66755b0098444f51f25663fe9e4384c761a532b87c249a16539647ff290528b008d3f8216040b61f5f4773f10d014c50fd24fdb8b20ec739e2b4ae97b19b0b5cac620688c926d4e248f9af8fdca0643f747e3f25717c934fa4c248baeedab88ab9527b5be1b85f9a6b77348fab1ea885551ea9e4bc0eff40000000000000000c25c4305000000009d97d7ed4b6dd327906139131b7ecd3e20722bf66712820da8275361aa653542766807023cfcacf572c261b426604e2e50e68f7220c931132f924d63fddc4a81ac6e7dec538ea78cdd758f303044a46423326c8f7041bc86323c25850b9fee9d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076d96fff5c5ae10996d286e6f63fbae61492329e3dabe22427a53b17b1e0f1a7851185c5209b3036b3523b711859722eab67e82c31ffe9dac09e0a73c3be05e534ab1328b3a762db82351b06ae4f0aa5fa6443986d83b7cad3fed69a074ed4abae9bc80b127fae732612c4ef6cc10e3bfb781e9ed034731a8a7316c058c426ba0319ef9bd215d61b556e63f2e662eb2e8579853e110dc13ddbc694f85503f0e8d10228449bbb51a01d78e06a4d1861f5404896ceccad8ce24c9eed18707d664f93880b00221ee39a500c7f65ba57032e4726118adf718f54c434f68339a3f7984e061e1b6d07769a8f4357b3685ff723e4ea8a0a3ef1389ae8d70441b1c9b9ed3d930d020e7a5ccafab2d816cafeef62c6841a1d29b7306ea88b7ff3bdd9fb4d0aff87a30217eaf93a8ab821d3a5cf73f11d8d3eb4599ad4721ad92dc83dce3ceecf9e3efc021e9507b4090bf99d79ea84573807cf70908c8dd26041a2829d6e2e7e118997eb030860348e882241a27078bf72e687a08a8c92cc8845aafdb8499ef947c514e2d103270a480a675cd13ce8ff12526159f1f4cb4e68365b950731cb158c519b5af23ac0e0558057c4ab3329bca96c12e4db74ce44ebf0b42350afa63f798569ce223d6fec31e7b6e01cfcecd5a8dc26f90ee9b1d9a2c16d899240b95947e881f2b5590dbd41c3ed5f2e3107f9b6ad0a39ac754b0ea50572f77ae2457634a541679c3c6dd3c1724e420aeacf806802b2df8b9006fb7fbf980fdbce5cca6dd8cace3bc8358a7caa7cc675e8155a9bf24d695565783ed2eff3b13075c256bf131708d59ab1fbab9925229b1749f502698d9ae02f1c80c13a1741a29bc35692cf194136d00b8083554d2c22844ca0916a824cdf23e5b71558a1faa53e6845bd3a2249b15e9bf46801efe689f84bdfd6784de09df61d5a09ff94e6b3d160badd5c68265bf9cefc333d73b293444f75959565de22ea9de2fe0d7dc0b39d038ec9da907be99fc62d8303a20a6134cf788d0622af5022ecb393f188f809814508881c7919688ff7bc10145f5c9ace1246380d6e5e0f0a43353af7cd855bc7591b33b0f9d94bc50ede27de259dd0a928da6c7ebd694c82d39252b30d49db101b0c5ec8e37505ea5dad090fbe5b5cec66a8b5cfd67af500c3ebfab19203a43a8ca7edc251809312a91e17fcefc4c278d1df282a3cffd1927faadbb79d122102e2e4f955baee6f31e2f533a1c61dff9ffcc33cb8076fba7703d6c62ba04c20242401fbcc56d3549476f111c9e228e4dc7cf9d025b6428746ccea9839e748ed206f86f71f11d1c99d864e1e06fceebfdbee490c07230ee3e743dae731175c89dc6b962f0f63e0b9155bb8851fdd96cd72797e352c151a7953bca1f1e32d07b1dd9ac61afdfecaa626d0fe89b22916baaa67c59dbda124234f8d6f2a7a44a08841da9aab574d473ec34524cd3cdb3fe61154681b072a798caf4dc57ab3d486e8b90a821117e8c5c7ca3300ba00935e617b6473f38987f0ccf689e81726f1fd4cc7ba3bb3b5d3468f4c398476e2843324876be83bdb548e2eda32f4cb0d955c6696dba2210e201c73a988e09da5cf05af5196414d67c113a7309d9805864724ded893d69d494764e0f2e5a7833dbe4da5495913d4ea052f737b6d826508ba5997ba3e877517e053141c6c4314505a8725f1004b9076061e6b29ce30aa2386d9c6c525501ea9b8107cf0f78389878ec3d340a7765037bfdc5906eb5be1eab2ca5cd03ab6c011c9f7fb009b959bf01a5183697bd547083abf6bdbd9d2060137b707ff9658e2dd75e103c167c34f9442ddafe4b7898b9b7132b865092a2fd42a9d8251ca99473f10b0dfd49a844b793c0715329baf87d80b0f1ea922567b619f19e512e2ce29d680593a1f3a17eaf7aeefa9a500c9a377ee9fba6004fefd632421d755cdba7befcf9b71ad4b89309efc92ac66d190cd50a5b1befe4a3d1bc1f6939b9fbae03265bf66e3da2de0d9c361e8c24d94b0ee24fd4fd69a385d2f040e784adecbcd6d66a03f41747473154b905efa4df8d0d33eb78babc1d43f8eca263fb8f3a7b61cf57e79c92ae3fa764a01fd598d53bfb354500e8e0b463430910560a9641c5d093badb4dd19b1e14fdda4dc5d5de7592257bef70a2cad58efcc55728ff318f7d6f92210c21615fb7c7b90ff5b0979b7e3ae1da1f8f8f2076d999c0882700cc23e7ec4a1aa0dea47e1e01372e9eb8e088ff505fa95913e2c2a9835897a092cc55c746dc23aa9b693236dc1f78a460b5b09396b15dec4903759d663b03bffa6e7c1d5420be2e59ac1de3c8fe9756e2362fddb6e78e4e9fa9e985566c591c465be2e353ed6cd9d0fe930c788205fff134ce0169d755d2d9b459cb33a68d644edcd5e8e322f929e4524869793ecaeb5dee4c2e1455245662b0a", "526551526a", 0, 1823463484, 1537743641, "a5e48034d08676c7e3056000426581fcd5529f00c98bd8120cfc51d0bec647e6"], + ["f4d3f46a01eef3b3549cd1fe7ce7497062b4dc5e9e33997e575d807bf40b0d6dd8e50f6b7303000000046353ac007bbd2215011ae2730400000000026551e56e367c03eeafc00100000000000000000000000048ac8fbc6d2bfdc2ad8e243aab289ef4f342bb69e8b449a966d62970e052a22020e05ae1f1c148a5742f838abb677e3fbc35fa25fe48fc46074fa0440e9db2495cb826658299d609388dd1d4cd6e64cf1ac3cf9d5945b278e2b2f94ccf1074b200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000973bb49cb557422cdbe281b07320d753a3dc1d6ca0968a0b9e09f77979a0fbdc8a5ac8ac906f374b707382577777c0a16e0fdb8b7c3fa9d38597fbd0441b76b657367acf544ca0096db9e72b6fc29a693ff073ecc6d3302c5e6373d2b7d22c7ebf60fa8a54640a019d4740cf617ff01c78f40e9d918f2e2a07821756e1fc5c7f02075d5c82abc219aa200d7fdf61bbf88bc4c258dab5ff610d3637a67eed22c6270228253813d42d743bb6374240592bb5e6f3d9af310b262cd31f86e5cc92c4d89b0b04f5bd3e54d2498bdabd3a0a9a23e529dec67b65e4bf7e237e9ebd3a463e547276f77192d5b234e62eb004c97604844b6296f38225c703a2c446859f318252a903080713ee2a8df320fbf26d42667081785d82f9c1cc7ed3b2681bbe880d45783e031ba44e0e75266a5ccb17c4cf298a2cce2d34be83fee66c72ddced96b1b10a0cf030c76d6551f2d75e334eb1295468323a0cddcb79f1d6f5298951c2a86aea08ea8031e33913d9e122e8eb5856fc9845a15bbfc1d81979ba37f394f5471f8b69eae8b030328f743931cb6e0f94f830910fdd598c6a279044171592fec6a38e20d8d7ec41ab03506116fdd5fcecebe6f1b4e1d4808046f44f2dcfe099f8aa5bcec292ed85be53d2e5e9747e0871b3a5c526e82d470d4e026198b4fa4b30773ee44bf834a664efba5fb241f4358c8a78903b1cb7f43e30d38dab47b146448151111b495db32befb9d708b08123bed1857619606e133a633370c39239a63530dfe2e47a74710869e28721efc4868b34eb6dc126d02e5a5aa990d46ecbd636d066dc56bcb2109b951e1d4e5fe95c3c391bd9dcc10a29ae9c366b90d5fc9e140498ebb4b40f9735eb6d8ae9d8956f5cc52b435ce7a6c9bae0c7cf0571ac903893db10e9109ddee5d55932b6d1e3a5d2b23eeb7328d264c7892549e7830994d3a8833d275852464ef96859f1771684ec73344dab8633d11c105130bcc2dc051aa13bad77cd1591b037d38c0f479a3a00f316d6c8ea139d0ffcfba203ba0849ac28941703836e2186817cb048e6d4eec7b6db2728393e18cfee02794563bec1c5273ccea2bb7a617db0cbf5dd949fba477c609ed79afb353dfd49483bcd0a8c4d6856098f8f44a1ae63c2260ad34a1153b817c42154dc41579ed7d6f4de823f416a1d36369eceaf682ad1cf376bb415ef9de1666263e829e5cb1f173e59581ba3f402ec45f6201f1fdd6c91f3d955c79bf2c03a9d2e188e0b4100ba5e1c679baff932c56220eafb99ecccdb5867d9e60c4f2437044b24b8c9ac8265d711381e8317112f51f62a5f4c2aac4729fb614133c1dfa84dde756a8897af631c6206ba9f77de6efb2dbebe49b0b8249c9a927266415aa061b7fe66c1defc9305d561b8766e0fd6f77fbfafc24e1a20989fb68e7bca58a8ef452b8d8543a34994e878563e047b79b6c953cedaa933528d5059f4852bd58270fc13a29ff137b8aa4a11bd7be168d6edc1a0fcca114e4e398700a17eac7f0dfc5cee373ce3677b25a5516a174d0b0e62f3d48b9c863081cae1df68efde63ea6ac9d734a456f70a7cd4f9b97a511ae2cb7fb48b5e91c6e2602811acd52ff2eaaab081d3c92dc525054f7f39f5cac9fae1f26c69bdbee250b9eb286dc828ffa845d9581a0e9dbe2ddf10bea9fe955672062215967048d1d489a8fbef9a62dcbfaf0b7137c4b8e6137fd40e8f37c0451c9a8680534e9cee37b06944096c8a2ff9ab083fc99fc72ae78d2435b2b2703a0266cb5d7dcbd4374d585f0758c633c00047fc35dd6b9144e0374bac123f1a9d12896deee4e9774b0ab5eedbe3c87b7e42d77e01e1f097f26ae517efe9dfc4520ee70c4a955fe1c2a9b5d5305886a86bf758458f0bc0aad4a1da175792ebcd8de5dbf2c1b70ce221b205f67cf5b833ea3b03ff8afdb1d8b4f11d97ca98e6d56e3327bf0d18c1014755a3d38f71c72f3f2ac9a9393cca2ddebe89c51dd96197e954dbb961e2f5f760a4686e1dfafbf0a81d5d9a35c19b6db6e1fb96a415f5f24eb3271d9696bc167ff4a282451ddba778865528833e8c793c25f42e3d2f16ec049ac98a7a9612a71f832f6903303d95122fcab8e7e2f31452d80244c58c0b38c06158d73f6a29ba145dc91e9a078c57d8695e0302bd5426d28a42fd19f15dfeaef956ac50188ed4e40a415c61226c2654bb876dc10056f79f6ddd5b6acadeb2dcdb7301f86f04072c429615092f6e4fe588454bc22ba4f7a78214c8da57a6c9a3bca56b9b2cd418d2d04d730b14926287133b92b5ffedf0000000000000000ecbea50000000000ec28bb563aa5d4c7a472f3e76cd0a5e855d0c1aad2bd6a4a2cdc1b77b240847b2716dfe5cafeea7c83bddf2635e7cba50e73e66bec00547841ce72e3b2719dfd321f7bb36a353989c9ab5dd387ec414e261854466511017c0883943b0562d4c2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008f766d302cc5b5b8ee5df248bc54a1617d1c93b141d5e76b65359f84ef1cdd36bef3fc911d467b9c2f853a1bbdf3e4a1554eefbda6a0430ee32f16dde3a69958f8e84db007cb6d19e2730cbab994424331b4f2f7cb1aa38d912aa43f0552039f67ba1e29c1c7e9275429f711b43084cd9f1f9b215d36e367b62cbc634e45736b031eaceadd145d2b7d404ce2c8de5ca6a8e705cca2a675ca1b60046adbfd3eec9f030b7a3c5187acbfc74c330826783fe5db8f75813254b304cd6f47113a9fde3ecd0a043193e8a10c21ec5025b864892f3855fbe813da65768ca4c342d1dd891d88640db59111286079e142959250f7bf9fac14e3dff8d0013f4b6b2fc2f12701d3070216c324741b0ecb95035f2a088dc76ec981b83288a26a022edda81360b98dba40032c4bf64889fe7c86d7de71e0698291a8e89dbc92c0a08270564012ed1188d5b40324b596406f178c5c6b6173a495cd55db9c2583120bf0060a72f625a69e5e15640316b5f6e7c007d30ea758fbbc9d48fa20a2d98b128c3c681f27f246e5a80f21220316993940b67088a0ffa28bd0cae767938fef23d93db55e2127c2093c88f160f31d95adb9a433ca80e3c04d6c41b1ebf34617e455ca9f11adb1c201e2c27304877396f64fd45398285de9f060d3ca06ffafdccebb63f274e3cdcd65c3049f7a96ba1b516196c5db3915de2022576bac56ea9e0f1ee175325f70bf119728a62733250a8bfeaabbe18c893889fbdf19682576e63f9b6594cd1935df16e70cf8a1e0c3192c4a73d682faaaf0a921bc922a1c624edd7a900e38111226e3261584cd84346632762e713d5fedd38d6b3bc10de41e8e46a5b0892d38eeb4f6e2da8cb80ec6c01d9ec30726c7ade78ea7c02ce116645c0cc64a191b9b19740260a491002f21a9ee2df855db0ad4ec99adf3ca8213bf1317711ffeca51ac394bd82185034de78b4ff8c1a1ecc6d0f5a7e767d47e603b8313fb6339eb98d9fae54c2fc05b11b0effbfc3773d3dcdb133b9b6e2706bcb7b74ca42ba18327dc5e01bc18f9636f6161686ab63ad12d25f33216482ea6000d12dff7e3f63937088e6e2cd5553d0796aa8ea512c99cc68feddf209459d3ff3bfbc1b77bf97074b9be195f8472d6f445310cf15ceb545f0b75df81d9ee794feb7373b72f68d87c7aeb480cd47d42972d85b9a98b7ab99f5c369204d01f5ba970cf9c20fe15a854e36e214c980a7fbcf8b153b9141811e59a0a2899ad75ca92d6b5dfb1ae5f7ab6baa40e0eaa23989bbc42526b4bbdfecba94224d408ac3cfef44023fcc10a588dfed0327a69a027c139c2a3e68502aed8d1a1996da90ffaaa3272c460b7725b0b3a66d992da19d60628e3d92c4370b7e7160be41492454d106b6963b983f38bfc742d651637bcdd5b64bd67fcf9a22645c0f568801309b31047e973a3cc6fe9c703a3710108ae86cea4cb9f6d81935d3be3a35060fe7bc447ced12c83b40a23a8faa7cf09ef35aeb5bcd91d844182a832667ca6b2bce7047881325a77a127282ed8c7e9ce71d436e30ec18ee0cb8f3b6035044246df3c5b9c1d2bb2f2fb0510e844cebe16c581f90fec0575ca878d2a44dd700e643942db3a0d6b960f2d26c59f0884e3af1f9f775d06d05d0a6782322dfe9561ba2c0d80eb5daa22b47e4909e250b5c24738e96ff7db28ee3e989c4c7d093c7c4147978560add094781359a18732ee219beba5ecb7ed6118dd62a473956663c3b96f1c1a84bf42f5fe7db18721e3e7a8148840599e7b65e8ac8426b85195161fc2a7afa4e6c0a37695832a17e7c21e7fd1c8ac2c21277d9a3f0ddc5081eb55cbc020f3aeeff53bb6d3d06c099cc3e2e665ac379c9256812ddeb3606b317ea9a4b47ec46c22b2c11b3b02b77dd518b03afd7c273062b8c12cc0a866f4470e83769b5815f356400a91544dcf56759f070b53e23f2e8d4850b18c1ff4226bb6836af9b57a88f3c03738f0ad2891f55d6173e5319c94868be14f330fb8424438f25d8a2e889615718f82d4290a99bdbf830c571104f125790ba0955352d150beebb6cf52e01d14b9700896d02ea24c3993bb58cf75950e92eb205cf0253457a685b4f5f1bf4c3f5b078561778913c94b38acd82fa1cd8efe529f3fd9a967893254667ce45d7d45cec5899704c47c29a95cc5c996f96d8877e1b968c4271c9c0d46f92c055a3aedf6bed4d37f79d46492ce5bde1cd5b3b9311d22c61428756c06d8634e35634aec82a307910328d6d4fbc5eda8512f12191bb2d3cafea71a1d1c610a7c0a2b8397799d9f7428000000000000000000000000000b7623521ea1aff167f0728cca7494733fb2c33a1a29b198b816aa670cf156004e8468039030f76677a07ca845b594b168ffd62e9a029ba985c2bb2f74c44b7bd412e064196aa3a0ae9d8af8e7f22435c333f8fb198102fd63fadaedacedf18f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000724a4c68a43b3f249825a526b71e36112fb31f67feaebd55a466e879314849c6085f50e5f5cf96185846b9b1d6d47e95fffc97adc38fc3da1528ee086d24715550e569fb153212bd30e4ec8a09b86b77f6d556cea4249eeb1cc7fcf53f56aa43618f384195638d5c06061a588d1c9d770efca873514356ad42fff695f355ddff021a251aaccbc051ed590efbb5566c393ce9a0f638b1d1898e70d3bc0cb1534b05032d7062e02930b19a94bf435c406d8f0f068fb52e938e25c9e67162cfc5819d6f0a01d952f05ebc39bcc195d2989ac9de44233026d79df658701087398d5d6148b9cf12dd1097b96efdd07748e43cb1685014d83137d989ca6cdb8b173cca097ac30217c4de9b6ba085f4f9be5fb86ab7de26a5ff24925a9def4ee9069486a201ea05020154b5fe53ebf40db5e944ca975a354f5aa24f2a0d241d42d120e4c9128b77540225922841fa99e647d821be9a9a20d4f09ef7206e1ddd50a272b2ae961f237bed03086e9b44dadcc9af9110361312844e024e91b5503ca1fd827756efff28072ebb020f74a092fb5cf0a89dae8caa16b64eb14260cf1bed5b82261c38f365553e1c495492ade43069d780c2eb982f4aaa1a2d4044ea546e6bc7e9a2c3473156820c212315ddaf69a6892ca958d8e366304e72e653b1ce307abc7bdb6810269d8fef436d5ef6d9a09032a8ec71f24e6c6ded364cf50d66f6194e747087aa48b63a8f4bbd15c30b348f47533ee1fc4527b1f83d500b7fe584bfac6f89a4a6d412daf656ec7a5490aa7bf2843a883d89ad37acc67a91d7b4cd839c50c56df9908d077e7d06d870cef258606ba59b85a5e0058cf154494cd1d940d4f299ddc1a36e21583a94c3866b129a3f72e7dfb961d04d1e624c47176af2def9e99bd3d1e0377bcc22043d86a99561a48c9fc0a44545218e9cc9fa8ea8e24ec641e26250b2f346e716830579102b1ff30946879c800077ef84e2162445cfd7eafd2565bb7d128e1715092a66a89f106335147664eccad3f1dac870da1544d9f0f69a797495e4cc62ae732eeaa298aa91615d980a5a06223604029655e06a9ac639f9e6d6fcb332a8dea48f69a8d8a449964083bb2a7d139c54f94639666ccf93756185107321361bee826c7de1fdb50c65107455f97330b1ad3001fa67ad21ade5ed2567e9a60f4b866856de33853052b6ac461ab065f6bef5d66d4fef9620ce065fa76923139ecd97b83ffb0a1645bb43eb772d65d9584fb82554002a1af864a5764323257c77938ccc892b3c8890497663bf61ba0acd329b78a0749f5ec75fcaf5a7c41464db287699af86d8af6617860f1a74ef60ce59579955c130e6ba6dcb2c0a3e99e934f2286e1821a90c3a2f55f325e42aa28be55ec864289adbb6de9c8712c2f9a82017db2af9d40555f0e8578662eff0f1ec07fc68b858b95dc980e5a2c2911edf395e817ce3e15baa20d717e8545fcee42e1802465dfee30c506030a06da22d6fbd8da02dcf503da199a6bdc01268a112fa2d05b830af1f6071643e4aee1e14baaf104777b1a8a3fbb2d9b09a96590fa1229e9580943e8dae853fd5452b4b994add268ae7aead91e913bc0db8077367a3daae78b3b52773c2fb889ad785f5a404afa57e9cb670ab6ecce2a8cba596f03343be81369e5072ca51821ba4c2c7ddbd3d37c62959de8ac01e97e658f127de513ecce4507dac25c2cf8d0c04e8adf9a41f52fe418b75b2100531c9fb1f96e9d0512fc54b28698b889c60960ccce23550adaa9746e92960bccca3b9ca66271779d095c326b1e8fb5f3117bbbfc9ea48ed1f979de4e92ec785350b41058028cd0abccb23bbd6764ecbf52099496b84d76846d56f865fc8879ed78d256a518f6020fa640c144b392644e108076215faff4974e5344c50d0f5a545eea5ee6c4ce59620ea0138eff7850add09eb736efdde51471da3936b429aa1807ef5da14fac460f6917ac7b74458b896aff1985c5bc165e24f2d3f013564ee7617c282d07b746c13fb6e2fb8d64f62b2bad6680997390a28dad5eebd516dec1deb06bc91b7bef3f562f3c4e81ac9b9caf2d71253ecc233a9f04ea597a1fb31036359c208854c366d65f7c3172909a81573c0f3500ffd8d368c3f03310b39f2ba35f0f6e967593b9a2f01fa8ad2868796633110f1358311e18bd2eccb13f593b9b56b09e8f72dc965d2ac3111cf08d08ed8898887c9d6601e2302d2da8bd43f746c6959d388c9e8e9d43b81b327fedb2231cebd16dfb57069f45e7d77b1c7953025d0249fd65be4ea31463ec08bad3bc69e7912fa392b03f0779160051d6461cdb72396c4f471a9cad43dcb7469b3319a069b1884ec8a11f481617b080a1be4373308747fdad074dad002b310ceedf93e2f1d8cc0f18dbb4173e1382688759316a7de50f8ae872c9e1ffe2901", "", 0, -1858388, 1537743641, "88e1c30b0e0f120ee6845a76c3a9947b9e3d6bccf844204590c77174187cbe13"], + ["030000807082c4030165f18e95c782335f5fb6df157e925014e02237474a40dcb8d187aa49bf772a1503000000046a515165ffffffff02f2365d04000000000040efdb000000000000000000000000000000", "ac6352636a53635263", 0, -193887426, 1537743641, "8ee428b89c178fe04c6317f63b630a511f3766bd17c6c2886e65bc9bc8efcb27"], + ["c87360460418588af2cdc2c3066a848bd896629f187341cc01685e555daf00061e6e8637220200000000d78b1e75b0f56cd67654d5d56b46cf02bf2702063cc78c38646ca7f9758d4d535ad86ff90300000003536553767ccaf006908c8bd2d50bc699937405ed1a730250e51657e40753e0a585352f6c5dfdc601000000086a005352ac005153ba0e01ce0f0e09a79dbd185027c103a370eb54b8dcfc91b7fc4f8e497b92e98c1b7f434901000000015249258d94036b59a2040000000001acbd3e9304000000000853525152ac6351530a5391020000000004536a6363190a94ec0300000000000000004b571d00000000007bc3b91fa25a39d565ca476b0dbdd50dc71ab1596f199ca7e5b52b0bb2dc9021b19cbaba73ff8622e6cb98bad5461c663a667de67eea424184c274293f06b25adef7bdd8a3a56f8693c949f74f93f0640c1cb5e67ffb893179f7cbbc5854c6ea00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000825499f7707a590ebca984e28fdaf4561acff705f92178eb04294e194cee0fc56765433f378adc8473287aaf468e5c9c00540de9faf4809e4dd479d76ce725be82e25b910f4a0c7c4fc7c573a9be1c1fc10446f78c06b13cdedc68c124f6be1dd3949287919d965bdb116f42d633a7b9cec7e6f3b68bf37b0baa41e2e4dc928c02031d83050434e71c933a9200fc7843f33cf57d1cbf775061f60db27e3d21ed5503111c61ecce2702b3959ca886be3e9d660fc80bdb223aa7dc99bc446fb160e1e60b0757de021b5dc60befdbb82140faef365c463984d91567f80a1c3ccef413b3e53f0585b350271a19122f2ebe19d8b031c5280988fc798e453207d671352a8ec00305f6061c7ebf69cd8ac4c0dab84f6972d0346f1fd378e589ba09a9f2f7b53d3e0306aee4cce142c78e0a70a1a2d61ad0082954ec5ab7caf4277914ad4831d94f9a0315d802977d5a6ee1237f6866e35f60c6a713fe379a1b65b67468c95fc28d0e330219ae5cb412fe6e36d44b9118e8fdc5a4e61840db1cb94c3dd6a8fb7b88bab76902089c04c22c2a51e94ee272ab1ac8fa961f975ee1a88f34516199637f7ddf76ff49926f7742489635d63cea2b2b19bf290a86f69c382373dcdbb55cf5c82a81d264e634e8279cbe3279467a561a675c45a7b691aff777a70e808a3d6f5c75c2bb2bcda5958a782eab77092cc0d7a6a60379571d9fea56d3ec5842cba1f730a12df910512f376975e27bbab128bd18e073dadcd200e078ed856edbe2f8772408ae31d561105a5c1e62be5b321fe4f6a3dd25840196f63f2cf670a38dad6bd78b935bc978aafe532e1da7cf0c2bc6285b8f81f2842fdc5400974fbb7dcb43feba6a625e42087261684ca101afc8ca5049b3af152139a2ce2cde4ab0032b19d0c1cfb90cede82ff2c9c4b8642d4b74ff08d4f290fb2af096a2e9a7cf17b4fb1b27f7e81abb78d8dfad15646153488ea0d4751d8827ea2a8918a56c3b632311c2e0b27911c5794240fe57a83b43199552782d53688d928d7d4c9129e77861ec614bbba0fb1426a75bd74e415c9fb97cce9fd196b9d282a6fccefd00331b18b8748852291dea047bf0163cfb6a8a0908e46cc1843d1d63870d17068c335b28244c340216a617574bfedb199ce83c8757fc9b2881b0d7f0d2c979e47096dd2ea8f91abde9b3fc5bb935cbd548e3a23f7f188b7460eb54181ef83fe3ae861041d61af4543fc13edd45c80ac344edb288b3ae8f1570f464f621e7f1d9d01bc16507248d95db1c2f92e762d037856517918f930dfa37248c6d3f8c0f9ca7203cce57fc0bcba6066ca36ece09dd4fc1759ea5ce7c84ea3c458c93f77ed6796067bb36e03cce1dfdf43edc3a1c7203998e31e6de844612980e85cca6dd712cded2a23d1e06289e3e7d8559fc1f0f220211d546a431d9796ace2b10d01f93fe3c04bfea5df0aa42beb08ebe8f7e778288631494a5bcda8cea447fd611d68702c542d5fd079296a1d62989b45d37e0b91f37361460e39d2aff2bc7e9bb2a5cffea39a025388149175410416d9891b99f4fa7df14bcdf6963dc604ff349e206340cf057d421cd4aae47a6e0b8bf9984b28d007c33af50499b6fbd1092cc40c6422d344b932c5d2409a1a5f5eeeceaf59b3d11c0b293edd01f3c10d5698d00b8492de8e7a81ab7ad5b8b14869478e21810e571faedc7e4d135024febb073843c711a5ce22e72d06b8ddea5632d3ee789619816f0ea18dd594fa6c627238681994cb0d170eeb9c249230073d7f06056426e3c7df72bbfbb5b123b3352a30bd65c8516687b14a0433deaad767efb365e844ef0d25d88568c15ad9b3cb73fb13899e0a792011141f320036f5709a626975d2d2e4d6b6bc7a8c4337cb18e7dda86ee2d2dbc87527d41d6b16466f73307d6be3f3eb588564f644ed4dfdce43a61af5c46ec08b2aa41e41bfa5e42e6b771c4c34579e2392b8e195868c2a806946d0a956f78c9d6a7a64298a5bb9807ff2ed5ee57cbbb59b2ef05ba6d1d87826e09d4fb47305a76db7998ea58d919c1ad986929cd1e98e8360841676f909e08e58555105e1395fdcdc10d58a306e0a5cc5245a900eb9caf25a6ff3090be234e57be8e2823a12c2b86d9cd9592405b53370f041c5e37d8a9727c3bd885b7370386a3b80eab99d1739d43a3774b2f0057c05aac770a68bdfdd7b3ed987e20790aa01392b030dee1d99781c211498cb13635d1be5749de7ff547784a1a631287d255571fc1d9b09946cd31392f7a66f66c4fd41e7ce1f088a41b4cbd6862618460ac02000000000000000000000000e6402053749bc2d757ea8a6536492f6ee38135e9045b6d4babd5a182d6bdfcb20275a36e85b1fd20c8f1c06e85aada519568165203599c587f546283285de8f49432eede4b5d94417fbddad2eb8842b01bb99389ccd1849e524f2090f5bdc0b1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004427944fd76e82655ee809aeca6c7b1a789f24cf86261eaf720db3f06cf8979ef529996ce5c8b4374108ed16486643afb37aafeb9174952904c864de35cb900561e2ba158a5d9bd9a5f608fe6369969c8acd76bb12a8b9284a744b735cb3f41dc0cc17d1c62db3ecb374af57497e77740e01619aaf302711c8dd8595254a2fa203108d4ec40169cb80d105bcff4127aa68827baedd52ab5ee67fd91a45dc05b72b0329b8ded9e100abc7c16550baac2111104cc44d28019f8fca921e5b37428deb020a07d588831aca71022186fa7d3a9b65c68c0daba5fac0347ce097b3d0b597c5e06a16fc21ace02639043e8c91dcab17a68cb2dd26d6dda8da0af696ec482a98bd032a7fe71b84eda154341b84d0d7bae2701c2697bdae3e286d8153dce657ddc765021d33de7c70d8816aab642decae6534a0dee88b0c5baab9a698a4b9bda95e70f2021bd7f28b1e7c243729409927bc551547b822b4798af79c8e17ef5a5a9ae608c5021fa4e8a179083f32e8acde5ffdf90493513f847b7a7b36cf928e4e364330e1c5020f03ce1d19807eebee3ab27accfdf4291a572ee41f7feb47487bb5a73d18f26c583127d1c7a42a6771e83bb4e58890d12b73e79ec86a102196ca0890a4829c5acca4b7829eb8c92e701662e025405edb4564803912e049a09309ffce29808be4f8193a341529f42b6a34578b8a8c5de16f99c2f75e15a251085a1b1f398ee74f880404cff0aaa1dd12bb11bf798f1300148917bf1e66a1f1c9df2cde126b1806f9a6d0675e14767c6b3e94cc9440056027c3316dd2c77285bc9cd9a2ca4e442717c4a9e86051bd4f30c204e0b7feed8c57544289ac693a807e346236faf99f77f21062ae699e579e7d08b31c04e21876139e7b0941f53e8b4a2706c91b7a30010d4f85eada934ea2a073667f0397094dc31a059041b2171652867db4d486893c107381f22ea08bc384700f633c22e95ee2ab5e9284a6babf31e15bf39979e8171e7dfc3c117d70af9a16b7b089ca6227d1fa948225fad256c9d1006f698d3534caf9a3dfcb2ee6f60247167a953c62c8ae8923487e6be70e41e84422f66a137ddb35b6a621c8524e7cec84f9a8d80f94610d87047db845da810935e54881f14290beaa5a16b6e54fc01940eb9ff281c047443ed076c1a0f6bb24baa5538eedc2bc0548df704babb8e08e6777ae5251a39191285155f034aa9e17873171e88df8f9c758f5a9d6cc46a057d035cd2886a1216384c017780d2b59c06766b8e1c78898c29dbf51c4b812b4ed87c2397fbe729c8934cb6ddbeef34678eff0a7faf57e1de6716ff95b7b95ade83941a2b837351411629090f7ffdb90007573a784c6041ed95b53feb906e0119f9c8ff41601a264bc7b2ef669d0868cb282d31e8c268f77a527a45f305ae2e5e953db676fcea5ec777fe1a5bacc89e45710265b57db19a8524e8af39e75eae0399be23a1d026e7d0b637fd51919db3d44f7b1de39d3fcae495a73b4f990d946267a7be7e3407606b07c7628c0982b508181caaa22e505b5556c220f7af6551b094ed3f9da04d986310b85e5622f87aaabdea7a74b7570b7b34ca9a68b1809a294e8f0a15a37f146fb23e8ecbc20c24aa00608f82da7e3286f167b7c0b154d8a5248764ba22b971c1eb31908bbe6e498614729ef7f9ad5f47ebc4f72486e2654485b00e3c260a9815c3c5ff6b3c69fb7e17553b0c94f631dd72858da031cf08ff038a9fae54b28cdf32423d5c3bad84d91b625a9a91590403c540a43457bba01431eda06f75b170c67909397a64254e6c4601055752f917d12e23be2cc12dd702b9834bc7e288a562ebfd6e56301d3d83eb32273b35b938e4ee1da39cf9e9ad023947fec42bb5aa685f193bb98a9db26e365537e3ad3000652200c51888e6dbba425fe776f76a42111e44fac0808c4aaacfb36427fedea5ca6d8123a4a213e5f17b7f9aaa1b5f330b39cfac92cf7a5dd8442d1aa758b69f64d177491c3403183383d0d89f80315f34652d40ed1ef19be47396f74de57e0fe9525636b2dc870bbc34944c6a481b122f066863b44c26ad60df2042292c7778f6226dbf68636448cd508e48d28df6f21799cc0c96cb0703d9e80ae9cb2f00c47960d98fb46b13d7771c91aa5db2402dd87e17e12a073e72df3af9a083c972c0a674617efe6eb300ca1eba751665a8b748608de26c656460edc51faa68699d31bb07aaa3e86d50698407e89cde4e670986b4b2f50759a3c9765fcff625dcda2e62e4c8efd73de88f64b40587b08520ea74d000000000000000090205502000000007ef9ce7a8b1346029ad21276b5cfe9b64c37d3b1d665a9f4902deef6b4c6d59ec62a8cfd50454459256ee3dde2a00a0421a2b06b4a60ae323875c7e3d46bb65e6075554fa64a23fdc13f35d7afa23f9e460498aa96f2bdcf5adc025a40c6e035000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f6e43d26d6a86af156432e30e00a96359a7e34baa06abf14d6c8c07b2224d9958f5b88a9d8ed78536e0113224ca2ba07a3be6c77b9d37d35e3052d2413d215980290dca6b69b9005881134926742eb9b29b04cddb1fca8408634584da0635e3c2172568d9d36e14674dd8d24a837bf591d89fdbff7aaf195db7161a2f8ae7e7021b475ed12955133b3163b01c2be5404e2767c6ae2407959953125c0f53d4d62402041265fd3ff285e76b99d128dc7a5e5609b48bcfab8350a0dc05dd32d59da80e0a032179c7ad6e4d8aabc27d503939ce7bd967e9bda4011546b181f3359b018848571ec6f84ce49fea2f0a8dd88260c965b148f2c3e5af467630f178cc3bd24d44021127fdf27d5f466f9d21a57e262103da1efca4a40c83cbf9d7cd51392447cb560227dea65695b11a825f8b2321c3843beb40c72d77df0493e387ba4e936bb354090306e432cb3140e0268be37318ca0240bedfb1369ef516ccd1f178c9e7093c6efb0318b6984bcce10a63d17688072f6174ee323b6f87af80169a41e456ddcb4ba85803156c76e80ce96c767078447d15492abacc828fc31f701d825de6e3143f0ef9f029ad9ee442cc4375352b8e4c1a1c4945cfe93b1ee85865ec7f5a4745136e71a914eef79574783de446950650b6d04c6915fd318296bbae6046d0ea9cb4a824b15d620c7e7dab9c6df345627a237252cbc924ad4c296563b2bbc3a0c31431d7a4601eb7fd34f14cbb3d6feaf159430fd8dee70f636e54183755dd87285bb0288fa13535eefa1c314fb603a09805e53059b97c531e4423921f7231a2c677f3303d19e49855464deae6bbe1aeaf27b35a26d3e367c43fbb0182aba94779b43b79fa53bbed9336bc3e21d7fb484b0df98dac156da86bad8a3b36a5af4cc41a07fe2cd238557b050f17a2324ea58826316cece6c08870a41c7692f8f435130de6e9b972828effd5ce2a42814b25ac8dec051e0230fd59303d44c8f38d43df88878b359165ebaa18e159c7a6fd9f753bb23a1513441636ea351700b20a1f6c46610d6fc44210f276277ae89cb30008c9ee66c15614c8b63bad3825f094e194f1a6788516848f7e29d6474888855676aa3e525317f49c6e35e6ec18ba1d2a932a2a3b4f2b7e8ed98e2e95b4f03168047b33705a4449a5205fe57ca9ccc7df7cfe3eb31eedcf48374546ccb7420e94dd6f8362d55a2df13a07d6604acfb176a5c525c627536a90424870a0e747ebea7d21ae5ad9f1c5fbf2601c0d2358c952c972fe950e2a02cb336e8e1cdfe9ddda06780c31f2ce40c862af1bd1a50c7f0767379d50ef5602c266e0abe6267ec15f8fd661284096ecb0f6cf2abea468092df79b7f40ef94fc14a474b2508e02425bdf3e4e331502bbe5469b04475c2a48a5c1c12dcea75ab93c807b9e4bc28352e477f67d79b5df72018e83cbfc31018b6656de84bb3d8184e70e05fb0db318bc5571346caaf667d477f6a09a15ef76e65a4d524360e9925ff631dcc6080ba34e2f606afd35c5deec96296a2c74cd3115d70aa5be1d8c4d17095edac5d67e9d128b03b8455dd287b1db66503c8d5f6448877f576525fb75d5a7b7453227587ebe8b62be234a3e37fcb77b1ecdb467b3b3b6bfca7e27c4ee9f87797cf008fd433a5bf374d6d0c4e39bac9ba5e9f7c893c25b23306ea89daf8b1e25148a3612431ac72d3dd932539836adb1deb25c7a1863a8c52d6ac673596c50e779cf4c6fa9c520cf01178f10c9a868bf1f5f3cdf49ae4004f61a41646d7cb5d29af74d6fe0b5815938fb0ebb6d9bdc9661320e3242bb353e09987bba95051a52def9cf01b021b4cb3d5f352fb89d7b526136f61f7244fb791f7c6bedde7ad27d4205a525b7aa84bc413196462189fdc227743878cc9c2aa1743a08c907f6fec3a8952998db33fa532fc563ee4d4fdadaa06258cd97e137f1965bee825ef0fbe53ee13a2ed05dc2a337a21ea26619b4155234dff7431b2541cee99b309799fda889fbe51b35c2b646e1d4ad3f9850d3eb8d76bc5e7e201bf03d76318f25fa1152112796545546698ba50106e0d4cf61273b4f3dab145be3b234c041bf53b5d444c0b13723d94eb9baf19c317cc0d69f2573f028ee3a2d5da784ae32011dbcff69982719607bff4b42c8dcee5e4e21251be244327281bad27f0a7d7f40f29e16e03e6a6d23cbcc29f5f6546f3a353f3c92f1ce5d2bbda51dc645ed54a4dcdcf2d15d7e6201984decaed038ca05eff42561d080d76a591fc5dc8ce3f710a518f8f5ae8e4459bc980cbd6f82ea0f78f47ab184386e6aad55e00bde56046859d6d5e86692ae65a8c0d976c9b07ac5fb71467eec1e15da6f6f1e3ecd72556beb664a894335f2585247eca4fe76447c42073f3ef2d99ff3c299d72a9d54fca538a048251d6e12c7a29d81bae6c976e0ce0a", "53536553", 2, 136953062, 1537743641, "46ebe00adf92ea7b7e863e46e92aab55e64f11f15b945887eeae91cc4b27df09"], + ["030000807082c4030122f9a656fb00cdc325abc2b0ee423eb4d2b4ae52ebe9ff5a6a6a22fd04a15fe5010000000253510e5a190304b467540000000000056a6a6a51ac49659a020000000008655100510065ac5105a0690500000000076a535251006300e4ea1705000000000453516a5163994c0292d9349403c9e365050000000000000000000000000c89451ff6758e93b719859ba47f7238454c094f37b91b4c8c7cbe1c401c507934665f66f773b9545ff35b88d63db13c0659bf6063da6f3bc79b65516ed565d6942c86a4fb62ba95654d14040be22ef57f46607da617a66999688a77ff99b2a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098f7fbcba4dc86d28b9155e0b3c293eedc8cd27c903ff097d3b97e1d61f9432001b5942cf3f1d3a1cacbc4294442efbe711733df5aff9eee6965ef792ef108d0faae19bc50129b3613965cd7e0064fb7777d83fc931050261868310d7e1bb1bffbd97c3b6021840bbca8c7329dcdda80e8aacc609320abeacb995b48da73f9ad02075276fdfa4a4b4413693ec77fc4fa88355c15a52d0da384c8efae839c018863032e9580651f513a472de9586e219a86807c67cdad4c783761ec2f49e68d9d54a80b06bb0b2bb5d944fc3dc2eaff0aa28ef66dbb15852e7feba0fd80ed417b3cbfe03a42740b6de805e7ee6bfd9ad9a417696c9c6ab3a685ba9f0a7d2b23e145c6be03032ad3e0bc3babed0234ca769daab2d0908905cf833ca81775100fdc97db81e1020211c61c8932cc1169f4e5aa02de1a32f8f7fa30a6754ef77f37aca866a62c38030f2e9d5bd35720d78028d83237c68cb4422189cb4524b45770eba80b920d5dc0020777a2bd4e3b1ec165e026ca2b4790ca74225151594631cfd0f08277250621380302cebeda62c90ff2073ad70d635da2d1cd7552d99cde33d53ae22eaecc966cf4e5c456cd3459b332ad90e1ee4b5cbfec151b9b7013d9fc9171e3c9bd74f3c6ebeeb59c5b560299113981b8cad03fb036e6d8a4d554e57669bf5477b016c250092b10136011f801e65c2fc6c8e036416d15f10f43453d3b281add105406049007dd142d059a207ee49d36b90cdac63d6307720baf5f43007e8936f82e7ced5e25187f1d36e243791d715f5d9f56f06d9fc31976f16bad7b1e81fab11030c020e80b36515c8f04f5f4b26b03f5eef117fc3fabd9666cf2663d1d91b75ac50de87f58b6eb054910606f927f3dfd36fb49afadc59aeff843e707ba805250215e07183f2f7bd102f021d4cf65ffc85e22998f94ee1e9a7450f0d841a801336176eca936ac81fdf73276d229980167498a4d2c24653dc919ed2ee9ea83ef3a66716ce28baedee9b8958541c39c4fbb5a9f7e3e17100a654e059b821bf4de56ecb2765c20e8063aae8fcf62868188bdf55c5949596925b5d6142b3428f78dd387ac665cb06949f22e8916fb283a3af7dc5b8ff466ed9a7d883175bf20c2de89c7260bf63b20de071589564e806e24b2fda1b2fc7c2f35c227b00ef2120fe0f3178a2bd623843f0cdc8d4332f2254678526326ffbf0cbcf859defa83a5c050df9bf1af1136c9674c43dedd64268cb59ce90b50d1f243f5c8319c40e0fab3476e826ed07a4cfad22cc41c261d6fe71358cf0b538000f3c791db4c394129cde91d2114a75ca4c1c6feee5a429afce4c802d0540b82ff9a33ccffa76317bf9669de2deddd1b2ec1890948627c07847f55bf6c4060c84cccaccf9479aae43a0f2f4f8fcb17ea7be8bd8ac1f0c46b9ce6037cea7ef3f0808a7676485b76f0facf7f8312fe30ac5a8fa0f3bf4758f1b4b16f8ae77ae6514310031d2513c62cd44a40641e3692e261871a863bd758f412a8ba1577b44e7ca560242772e41633cae5706f29c333cacfb6398a2ad8ecafea3e9b65ea688deb5fd2ff3f81221fd39ec1a23ea792b090a46c45e2ca1580a273874802058704f92f0313810c7e8ad9e39af79b785f338285be8510dd44c31702bb0df66b9d80ead671180abc0c12e9e97ddd4ecc7dcce66f90d97505aab5898cc5bdfe1246104a3dc0512c5c73b729fbde9b7c1e0b2a69cc3b32c7ea3d85f44681fa465d6ae852603a59a7117b661d0baaae052b61f50fc2efef9305f1762204ad504171be4d5f8c76b5e78ad9dfa005b6b0168b67f5ea3f2b28e3046a002df9c10cb4840c64a12f470451e9771729fc3da74613a82a9ad3bfd4952ecf1c4446d0045cb4763c5168571d0490c5f62a8f8386e74765511b47be4f024f7603151b4e1c0e2293e8f4298d42f0a8840b34624c153e3f947a97c273c48fcaea8194bd0a66a40d66e850a9fc311b58fa8fe8719bb071f94dd57b31128c88f6c03d73cf01de8b69c1c3799da200fef2fac691de5ca7874fbc7dd26783457d26298be93cfb75777735cbc40c01d10f0adc4f05e571312cad744b74f905e336a626355425329037dc1a8749b0144766cf080262085df85226d8225d7f7dcef6387addb0de2b66138e9c1a744de847fdcbd27ad0776abb8d38cbbcd7fed0e366d480adb688f4247280ce0c9fa2b93470676c405e22eddc457c9aac35e9d84806447c5189ecf770f6eca8dfc8f395ef98f8b3a45d8594ada39c3a1eac04cf73429bc656546cdf49e56e90b0d240ea00000000000000005f4d9d05000000006dab60279fa1dc7f0f03d573aa19e5799d1e2f41acaefe9e881d7afd89d0b685c73b6d66c060fff18de4d81767a0704e558da0b0c0a46d0d8c934df412bb3020a068d9be36905d278adae435713c60d4de0f915a5ac9739501fc9304b23696180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069b837c087efa9bed796649ca51a7425321de020b605594d9e7af6ff0f6cfc5560c23b6b1360bedc3e650c9d0485c4e5709217ccc0b012bc6df52ba2bde53a1601a0eeda250ed3d778b0faaab53d7791fb57fc69bca6951d66e71b60a99d660a155f1a5ab5f894f16f9df4ae9835f1499eefa43768f6d2b5860860d063c99651032439ecfaa911678dcd979071e415a94800a4f8fdb4e908255628ecebaf8d72620325f6c7f588e141b89b77fa08e44c5175b67802f6751d0fd31da41752a915a7d90a014748ea9be329395af01629c00728b3bf754c11dff1d088f199478b45f52816d6bb67e9af8bc00bbe536af9cc72f0b5ed90f6e28a3886383c83f1cc647a7e1f020f7bc46e26f42b72129fcb5e8e0bd30db43f7371f7305d260f20e21dc98ce8b3031a9c095fe5c99016b7d8b63e7a44a12599145cce08cd4f066f237143938faa4102102406545daf2edda15b67fa49a81741946102747423d99539090d77e5e962640205504780994689f8a8225fc6181ffd1f79682a4df4df4d5cbb75d428b37a8106020baf0eac296d57a756ba5521d620ae638042c44a69bcdd44978ad31ff68d13f49fb048087073eae48aaf5f1375912756bfe211eeed682bd3dae842c498116cd75a656ec280932e1ec064b5bc723f1f9c275669438a94c5cf900aca09a98f8c946a0447a9972c85d9f8c17eefbfc4f10046c6029f727e39386d1d698fd4095f8b4c6580f620841e314a42c96400a3ab4263cabaf6d4c742e40ae671422a8bd3b6d24703a4e523a98494811a98abe9b5601be7de8dd66bb43236528805a3db8a1a3974b418fd5028b6784819b97952c8cf8087e28e3c02d73f5110ed99b8fa5159bcab7e4d572a4333682235df4b111209febd87d0f3288cebf17705723f5b5d2ab7ffff078ef644133ae7f1b463f70adb0e7c0dd0a595b84aab7216e0e808f8221130bda561479dcaea336f77d92cf40b54f219cf7d5a6ea422a6acefc535cf27e1340b89caee11294a4d571b42be5320793ddc9a3b98ca80f1feb0d1aa7c024910fab0df1512d3026d25ec83cdcc132671279e19d508319e938dcae5a70b79b5af8e0a02383bdf26a9e6c886fa32d4f58850324d8ff303d2dbadbf2fd2fb2738718aeddd794081c5fbbe37889f23468b96d1c11b4dc43144e87e7e49c651c1bbe51e62310a33f77228b2e355c3b36b8f6a04a7aa3f95b7e5fd0aaf86bcff2fbe692183d70599ed24171627520f95de0824a69967c8458e310b13b78f2a89d6ca2fc2a043e50ec8386ae7be9f41371a43586d943fa3ee686143c671881c2258ef4779cc1cf8f55ebe0a5db2b1558eabf5336ac47d7592882efd5357c9175f693f9c8dd5287442edda451e66c8630cf31469853b4cb29013a76aca71a6593a08c607d1a1ab364e4a18fb53ba75b56f0f508128f768f2074f5918e97226fbe1b3871526d687381fe5ce5b91fe2a2e2b5c2c1ad4fb9f004df3c46a96c05dca12c280c7cccebcde91268a6e6903eea0ebc429c21d6f9aee2a309c5f4cdaff4a831b14531a297c9305530687b928e2b803815a7403f78669af3c6fb6dc2291c119091f90ca1dc650f794ec1ee74a084f22640e656f43f513a605a863c492f95baa8accb5ce9b547a1df72bb15567af848a916bc3674d97c47ef8696ee427553679b85f76654d6c1cc3c1d425bef84ca3976df69abe2c6eb9c1e0ff6d172bb46d85467745546d6caf4b1677f52801cf5fd2c2e2f290e111cfcb6ac213f5c116bdedfde5607b5805f04621eaf3a9ca45e36652ff150305e54fad5e68ce4cce790b6bc8991108970bbe2942eb59f3e942a02b2d8595a86c4b6ff4bc585344237c8219d39d8ee8979cc8a14371588137051832296d2bafc756a5c16063ae97143da6c228b007fa4519de4292a8137a17e2ab9bbdfc0fd7bc4a69654b276058bb84bd7a3f8114a8d1118edf15e2e8ca3a29749c989f86a4fee3dc17f3d59ebc1d0b164c873ec2649301a3bc7049c7ccd3891f0f1256bd2be1c2cf4c310f745a98a60d3c2fcfb135a7f43dadc52e874280ae574bf8e94b5b08a4ba4057a0232c6a0bb45c1b45c6eb6b2972c08d9f556b21f504f8544943e502c3414ffef68343133b8212c1aebb7700a5d21f0ef93cd4219c57904e2b4bab6bb86ac9c1c571bb36f607c01931c348e971fce74180d427e1be0adeeea8c9608e1ce72182272f8ac27ec1826a537c3d43b5f2a067938fd3e97158a71017f60b55f360bca2d30a70a5aaabac98c35423b15c3fa55fd37ba7ce9e4dfd600a34050400a10100000000000000000000000087b3f8be02f2d5663d379b5babaa2211b37606783a2fb22dfecc8e66d5dad7a91f24041fcb49ea0cb23e4a4bc792e62745eb41b669892d09a8245ec37bc95bbf7309f00c1efdad834e60fbc5cb020476e9cd2ce9752785e76bd524269588aef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000501b0eaddb7f639a3da1498df09a1c9958698e7d9b214cc92b1c8f93d2d71ec212ffa45e47141ec3f176e3ca314dc44dec593c5ba6126d09dd175434f49aa9a02583e60de35743348ea86692a1ceb930500b8f983073ec0014406faa713a37f1d229eb2819614c651f0a90abce0fe6d62b1b719f5d3e10be00e715bbc18cb82d0209bc95173af337f6db66d5963b82ac61ed8032ed67a4d8b20c6ef332c9db597602188408104e1fb94df3259b1d2d1b12b63917cec80251e61bb510cf4c5f6ae57c0b04c68de04ed9112d91cb4e0ba64256cc3cda680a6830b9de95fc9b2b5901031b044ab18aae5dcefbcf9bd014aba588552230d68710cba81851fba1752b2895ac0209f156e7cdf8536a5a7428089b89eb4ae8434f4997c415f08a3a89fcf17e7424030beaedda5c8e26085977d2e5564577d9a88dd1574aa3b65b7c7b2f50c402f34b021606c31041d422905b03badf6315989f8cf40e233b90315eb825018ab1223bb1022d569b3acab17dc15f53ed124bb1edff467aac72d55c67c3c23a50895df926990204ff156de742d4b793180f930d414e8a36a311d8b59ece9ceddd904b0113d5899d973c2364ec7510e8ac2f7d4f07a153e575ad05fae49afab3cfbcfb2359372c7cd26b073b8897c9b92043128c418188e456d230b06721c68fc76f4e9dd3ad2fda7bab1d4f8a9b6df312464690ef1d0f86a0baddb3c5ba63a36800c39cdacb5169df37b7a31cdb9d56d04b2c6c30078b8f449bf61bdfaa11b3e5e1d1465d7457c822ba18b16be251a60254744ebe21a59245f89f77fbaa79cc24f303844bb5ad0b6eb6ebcd14d7d4980b717dc5657490f36e424af64a3176b10f5768079112500f74c33fb294011516f15bed1ac5b6e9f738b13b0df6adafb152af52e0e5bf5eef584a1e90c60806746a46709179ea9723c670065a0fcf5877bd79f9d862eb317f9a4cc529f1e70faded30c6d016a3f03badf2296a4962e201eb850ed4339e0726d6114cfedf145bc575c4476ed0b7b24d69ecea07fc538d0dbd33952c89b9ca8eeae60ba3c801c284b43574037059910be97e4e15fc44ce8dd1244a60583061203fac429cd195d9c3a28aff36e43bab8cb52fbe336b93a271326daa814dc2b80488a325ccf01f50b1d618bfcfbd8511d603bfe5495270cf3137a7f253400d4bd2e1c8a47c21ee50d634629ed61626235c27ab3b1ed9de7c8380ff6e334bde0be9b3c109e911ea2832500a465605cc5eccc41dcb7f7169a02bc6a6502f5de285fd48b70990cc9af99cd1c74af2a809cb7680218cacaf35f6905d6414bf66226d656bef1f7afff89510fa5f72ff64dec234469da34816ff8b73b0f7c13eb633d412457700fb0abc641527e213aaace38e889f6af57bdb9e31efafdcc3574abbbed18a68291d0feaf9d54a71c4a3d7df8457344f25d158e9af72bc11d94a765b4f7c3a08f1dc37d8444155e83cb99138c04db815d950c667fcc521172f08aff889673765529ca08135ddb69f3cd111f4343040b6f2528a776d92d757d7beb03af26d106bdd3779392f7ff26450b063d79b65b314a6080d9921d75b6d2055fd7914e0f4bb269877c3f512d96f7684668f37bced4ad5f6b6dbba6e81b2d60d5723322190bef7e3f98412c8185c562f2325e49fb0a136e3dd7548117b5ddd1f23e79a3e494fff2820897310aba15f97537541af67d39b563305c8c5a100671d696094e8a2d251c0c88269f36f45505c1b4027e93181aec83b83bcfeade3ea90785ca329fc9026991d8ffebc6149d98a05804c8705096f242c84971f07659e4d87b5466330e51bf29c6daa532626f4a2d2cfe9ece85662f7d9b91ba0a5d642f69d86d388eea41365b1d8b362fbae5cec181ac086f2659805847c2b555b3b4090dd976377b1460c725427b085d5a0c9f6161b676c9899542ea780cdc92630dd1080f965ab0ef00f92b217b64a4ac3dd92fa812afef2f2beef1e23b88e14f38ba1a0d87ce6febece93458e01b6ff89af400e543cbf5ac90f91dd07d9a22c3eef77f90fcd8c6a73bd964f821c76b69dcd8e930e96fdc84a636975bb5b63821eac96bc845dced187e17412863df738e38093541073472588ec4612e369064d83d0cf15524a5048e16d2d73eccfa4ecbe9ef2bf9fa3b5b7afa1f27743d0feb3c2d4299c466466f36abb400af041ac6bc8c637c4ad62aadbde5f3c096b51c8d115cd3b3e6cd954565ce55f841aa19599ebed96174d7f75ba8b086fb9caec2a02aa7a7e9d9b732aac74378597869984fd91d7379cabefb4aa2c31bb520d4d1f9e1e6e7d00e5daf08f708c0a58d01f651b68ffded6c69307005e9e3fb98d3f8130024d5289678406c4a5e1d7c5401e61cb58dbce9c4bbca0a83574edd5e7a45683dfdeb381a3650a46dd644c2659308311881c4a1808103f01", "516aac", 0, -962025450, 1537743641, "744663c9f8a95087599d967f1f308fc2f0ef102eca496360291fc0e011eff770"], + ["030000807082c40304dc89f7f3d0ee918baf1983fa6c701d911078d644eb8cf48d465c3a81d1d59ce600000000036aac65d455f36a94aa9e6575dfa9d0b6ea565ad0426b42d3b7fff6729c7fc969d5bb1c3bc513f602000000045152536afffffffffd26a999745dc6f899690a12531b72c8d1fe582e7dcc5b20ada427323e34fd8f00000000026a6affffffff46f4f09251e2538af0e44446ce3cb6f6f25c27182dbbbc4687e061df83d662ec000000000453ac6a6a8f13474d04dfb1af0100000000016a34b6d00400000000003e05450100000000045151530058c0b10500000000026a5357eaf3850000000001000000000000000088fc0203000000005ea0eb38ca4cb80a7b59e88f9baca94a7aafc4624eaf3ff8edac00a1597d5961521035e36c9605a8f69a9371f2e589ec1a9517550b20b70041e047cd4389b4c7cb4750b080bbffe99e2d185f190637f93ee05e3c9f5a5ed8cbdcfdf31b55dab1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f9533e60fde524bf69b8e24dd1fe7d6225add0993f8da6df3bf021b4669d07b12c237c34b1ceb5a57fb52fea69b2cd98dcd97149fcff52e61a5edc9c874e8bff19244dafcdf294b578111054660179d2c66c9758afc4cf8ae00b81a44cda6ab7703df500a0478ae281aeded22d7cff10d88761fe2264501415c0f5e48982e900312f25d77cc48cf6e0fa8a5a371da0fa14d59ae35f60dbec6f93981a30dabd9720227ed171562d36014ed1c5d73836e114f7762f5b2fc39d6557e940d3cf9d8f6360b01f4b145cfda43efc1b417924bf08600918c15bed9b7ce3d1983ae0ece045603d1c6eb5a1680ec389330b7691c724219918bd2da91af1c3dc938a9992263156e02241d312776f481c91e7f62968f7bce9e197f92cd6a7f44cdcf7557904cde75ad022304a9fbffba6278b6680971da694a46e3b4482f2462d4b43df2084acfdda968032be1166181df65a438bfb7eb468240698509eca931a794397406b561bb2c4893020ea579f93f39c5c5bc04ed8e871e6bf303dca478eb2661cfb737726649db75950208a5966ad3db8e5411fc87be3811fb718f1be031c0e527c2fe9fddf7d101702314200090da1f84bc6a301ae0b4f7b4d37fd64ea1aab415e7901869461046a0d7c386d175d377cd1f97763e7ed85ce249a16c5cbab3c7be5d515bfdc9ec90decab1a9170160bfd5e7072f0ae8384b8821608de6f87a74f267fc639c66e1e3d0b06e96f58f7feace7f6ab4c87e07045757298e809485ea42e90b0b60e7d35f2b94c70959a827e99759f42aa058b7c5953586002f5a6e2b8c8b77073b664fd6621acca3fca0bb6d39dd08739e02de3687b06297c7ee4c7a6457719a5d6404c428ae953a21adc441f2f9a0ef5a746be295ced3571732c5b94beb921b91005e4d0424e92f76097671e73eeb2fc3e4701ac0e36556404a36baaa74d70f45a8a19f2132f643ee933bc2e5af9a66159443c9ce3e96a33f32ea4175de372df5589958348b0d9b32f0e7bbc0c8805935408ecf2cea01fafb59c2e44ea5d4b854a92a31960071e0ebf855b8cc433b3a8156a96f5ab73476b28731c7a5dd3e630aada9d720d98ace391aff790d0f2bd35812128b5f07aaccf01b0a5eac205cc0150938fe7ab1ea46a571fc16dbe9f21f6fb139fd51c9a9789c1baa791b087d30267ba0f9f2c84ad7e8ecda81461dba4ef7cba7edb755ac2f638916f0c60b63df9d9767df8362f272ca6dbe54e5d795a613cd42257d3e8572c328b7f9a9b7e655955edc798e6844a6426e7b6695115e7d8523b5a1ec02687ca7d5e6462e1efdcc42a43dc2e42371c8b4cd823284f3e857fe7986d8b8a312ff1f5206e17f38ed4dacbac897374c7fe7c692dde0ee5eae6ee4ae20c0e0c9ea13071f1b7aa9c6698d78298c84ab0bca43cf1f5dd1eb817663a89a16bac40d024d7fb7ff40a2e550d6fc431438ea4c95d0b30cf24aefd94276bba80231966fda1b7dd7879a19e6cb368af8391686b4c0e68badd260b4387bac139919e74659b0f9ae3f6f4f5a71267f2b540d7c1604c1ed719e38b3fe8ea9a7845a95f57ab8f57491ba567f529df8d12c7e2b30ebd018490aba6e2e2a5ceb372596d3d1e5adbf523a34385dd112dc4753d1a30b213f696eb851c7068b49293a3d952fda1f88bf4bdfe0c17843283f93638d277d6761bd3249aeaa2b2214bb3130b5295c2a66fbdaa1df95e4acf9540d5543e21fa48c627a1a7c6cc34a05d223480eeaa2d93b1cd3cd41cf0ccd16d9a8b51a3f71d1e1942d1d516a303381610fae15467197d1afc1da07d273a5f2ec0adf5a6b25f5d3745c424dfd48f2347733844fa9a8ac4870547adc22fb4d2df95a43d07ef9d4b9339e2475eea26611fe95f2b256d7e1910313c0a70bc6d4122e6febe4d5d3ee89a35fb027bd73ce25e445928d130c0d1d55f706afc60c743c9e681aac86b6ac4b45015e7a4eecaf626656cc4b4f4df29e315e6242963b8818533a7ac0a754dfc8e2b3cd0145bd4a3822c1b4c04663d65e9a76af540c30b6f1313b73823054dcfe2ae41f08cdc15a9fdc9318f7857c840adb0d614e151c875c59347967411034ef7d3038fc1db8df5b0017270b476cb11e30d6530cc7b19469c0e683bcf1d913c1ac5fec96edaa5a79e817f9cf40489f1117d2e66b9165873e501c32c5fa40de51d685a56557f090476963f044cc7cf94ff11098d318a705044a26e1061924cf7e25b6af094777c45b56d6b072e792b45d5592290b62c7f3d5e7b078e5b99031f6bba961c87e6475eefee432024a4d3828d4c107c51d6300360f458f8d6b4c5e796d6a1f99bc93667e2f7e6e9df19608e21a70fff1f470657ae1585657f50ae158b3087d2271ecc5df57d55a5a5c4b78e617f463847d41231cea6cc4dd1c53f6eb514b153455cd6d6a02b06316831ba4752f09", "00", 0, -846030359, 0, "a4d32c8781d531cfd5ec5178867f341965f25725e91288376688e6b04a03868d"], + ["1086832503cc484bbfad24b79df774fbe66b539d6e8f54ea6b4aae52657f54d3612d5732060100000007acac6a51656a5220f2acb80bf6827c798c812a10290eee7b8cc5a12ccda7b8b3bb73bd55aa70913e60ab5b010000000853ac525353515163ffffffff2e51cf5c429652d69af4042766b070c391e3fae48e50ec7a4ae84016ba8dd75302000000060051536a6a53b4c1a41104fba00c040000000003635163b9a885040000000002ac650e63f5030000000008635263516351536a940cb2020000000007526352536a655200000000029d504500000000000000000000000000588632072168bb6a67513ed4a9acb9157b36751b692c7f40dca64e1f7d2f47832b9d0898c940ae66044d73b6bb6742d1fdc082fcb68be8563043f7977ccb68dcead481c327fbaf4fdb862f5ec5cf30a870094383308c67e07935f9de4dd4bb90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b0150944e4d8286dcbbc86a4c1cf9af09e28b5a6b4e0c80f690ce0b419ebea0947c12d4591c47c1dce25dbb2994d3666b6b2cd4b3ca6880691df5799111f7f750e706dc3f89595fff7ee3cf6e1bde4f45b97486a333aadee7aa35eb55c6f8b9d1a4f40708fa802c93bd5eec3638b75dca23093810c63f56c0f81f71e0d90ad402026cceae18e00b6f8243f90b06faecfe52bd0005616f5628e8885ecc36ebc58a0228b9a986c204e0c53c33b995dc2517a6abe217d2b6d7ce47aedfc182d420926f0b082e16d21a12d0518c9ada0b993ed0b0506bf1e35a641cc3f821ccc041fe4d10033f15a151c7504af60df51ddd9436c79a3ed305cbf766023ca1b88a1ae84d56030cb4fc8243b79514a6544fd6bd64db0ef8018eaa1a5844c7f10749c6afd139de0321d72d4f6c32eff9bbf7d3e4f0623837982eccf16e54a539e21ef0a281d98928032ae5828ca53261e88eb3f6646051d1cc101b97fea2ce467cf1a9c2d59bdb9207032dae7b0ec0d79b8136814bccbd578331d8fed464d1de7b871547537e5120665d022947e36106dcdb9c1f9c1d99e70c64703b9357d545cb776b02b3933ad312bcba35b5ca3bd3c70284c42b5b53da563d7429cdfe84a6791b120ada86395ab571c2641fb9662a8f15817ff1c68ec0d74ba23278c5dc01c076a87f37c8aa2e163dae19b683c834a2a7ec697b4fcb24acdffdd762c22a0c51ccf7231e4675bd20ca856d6e18fb42141809e1752085faa1a804f1f8493990e80ede43a0df88ccf7371798d80920836bc0cbbdf7490143d002cb01a585009276478eb804b651f250a37fa5a62d41e086e18cf2b13726d6ac972451bc495a3ee5d7a6d9c96cbe792b2632f80a9aa8a2f4e195f953bc0c008bed4a68588f270bef20f67d44373b96187f01bad95761a71df611ffe0063241750e9e9ba42bce3783162f456cfcc075b785642058da2349189d4e249d2d43322eb15f6b6919dd78593a67b43793a4faae96160cfeea38a15222c7d65f6f02d043463e41e580f00ca9733244e076a984b10a74d759c806b91342d71183d10cb84723bc5a7a75a243863c44cac776464ee4edf39cee7e350093badbd8b047e6db8a83c51009c9919d258892954c82db26db828dc7ea6a1e88536b97f8fa28f4ec745f727cef85b5b7744a5807e4a58e1fa2cea86c110af59548e9b0fe231a6b3c8e5879f1eeddcab76790b7f983a101733d6c30f28969a7448ae1c2d3115f80fbf3cdc1ca677dbfa3c07bceda658a34a8ccc4d2ffc51535eb9f1598e70ece001b33de11f475f700ea9100c3e5589a35b42e5cbb8e03f9c9ac437fcc0c66d7d37336d7b40bdae8d5a18ebb205b5a71e3beb67da90d5ca16c2c021a31910c8efae62ece2abf1812dabc25f3354ec23c04fa8d4c34ca2825cef1fd9e025fbdddda3bb25aa828500fccfa8642f0adc596f8a340b734b412e51eff189d4c0965b1f2f57428ed8339be8d54593a12fb168a462070a251fd37edc20001fd6d4d5bfdf9a6994144e0e87d7afb35ec900a4e80767666ebdd19c4cc26b459a908923b3fcc4607d75e6c821e5d1498c9e8bac315cd72429e7c9a260efebc09496349bf9b0f25ea283a4f189df1c84e3251079e0a5527ebf228b34f14de6ee9f51e12888bacf23aa6c6905881a60162a2bd8f2e2b9347058c5d6425302ee8c7695115adc963a4ce8c14bab21be1124ffeaa71de1bfe3d046adcfb6a6eb0d51a15b1d878e92200b2c64440c8720f7f5eb932e9852511b567a8b75abd2ac9473e88b65e776330b74b84f39372e1aac4a9aa85e244b6edac7e33e67e2950930712892b1f5823516cef6e1ddb02d33f81b98149cb6a1ccf87b2ecdc4f1b0b4eb9871d8c0235fbb43a9fb1c050eddaee55731304fc3b2f66c33233e5edb1d0a5828384727fefe4d8a9e9db03e24ba0ebdc8721ab597d658254fa33ddba7ff513dc958acdf3344cc9f6a2d344ad4e5b6f1a6863a76443aa5bbc5846ab0d7d1906da1c1a4f2d5a51dc992123255fb6de3e1d947a6d2dc532eee75b56dc625133ba1ec9023169d5f23347913e98bc6d0f9d689e6302cb39f0a8b4f8c29aa9cf22894de07dda83e729cee3a9df991c24a2cb1b7ad800382586db99fc9557356fb87fcf5db65184c06f5e92139d1b722b30d1cd7ce4e57c5eaeb112beda3b92deded917a316b729abc8010940b84bf56517432657d95a719a1a43836adf47489722e91bd8709c0481f74e59a7d7b04d642e9f03e3e4a1a8625aef974d91f29213f7be486a8485f2055b79e696ba8632d100000000000000007c42a4000000000061f27e9c899910d6a74ce4295df0294592a88c972f607829200e0a3e8a972986a7fa1717a1401ed4dcfa625305f6290ddff58ae46c8d1d5e6a054e25614ef5cda63627d5cef00875b3b8ce2d6e4955380c5a61f9316284ac94c12bfc8f689c9500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ea3afef520ffcde0429b47a815e1ea4126df02e6c5efe24332edbf63ccb3da50e277dd8df5a3faa0b12574faa9113ca4210ce1e94603d0f2bb93ecf5326ac11ddc54862c39f9da1cf82a1685f66fef99721f2780657d30713f5a3de2886d84e4b031e806e67c56a509d5386b5d9d001ed1370d2f8bb63bb01fcc73c95f812bbb031aa0dac2b8d8ca6413f6b1f0a1c6e8acb01a99b2344ce93c204cb218eb27ef08032c3bc5e051b5c7d5573348fa7c6d7b6feffee7679cb44c62a8461c5a8282b1800a050ff231f1a2b16c134525d9d7b883a88c7064879208354aa8fbba3f5a8a46a380113e05e396b6b0a298a941306439fe49cb9ad956ccb48a969cdfdea0197a68021ddf4903c2722f8dddc28a6933875dcd7c3211f779308a1d85c20f6b9c093fd3021f4028f8182bc942c20b4757a676d421916fce1d27c35411c7727ccbb45eae7d03055fdad769383b38358e5982bdf5c200e9f54fe8bc97fa77a78653bedd043b1c02295f53e0846cfbf6e709d803cd67b64ad96a6f64b00f2011a677d5cb262d07100305734c62448e1493da24ddd14aadc2ff7f2960c4f65500c15d35f0db510449d6ddd757a9981eab903d0f1883d4ff79455f826a1da05e5f636eb0900a89eb37a94ffe718dfc6a281727489be759b776658a225c395ef4ec95b6ba1200487710350ff8a74ac583be2150a0e7c970f97c4a2e155e8372a6fab0cf9cf9bae234bbe82f36bd4b9743ec8e68d2acee370d71a83f7f1ac9832b0ef2944fce453d873417cf03a620a052c3d73cc41a155d69cd209b3b823e6026eb2739426d26612cf59682a762ef7ad97bff8d77c92ae5ac104070389afc67d82790326c61431e11d218e21d81f5cb9b62917389a72702436e14fe56e121f74cdeef0e74c71b5198f9adffb416259ab84705a768e0d5c86efb679c0f2a61c5907c09f8da1958f6208f6a8355d1be0f78b5f87dce4d91e15fdf44c6a02ad1d0a8479b8a7a5546ee24d4a026a210d436e932e95e19cc14ac7a04b95d32ab3b4efac007c3237005244d4b6f4ea041fcac67aa9258ecf91bf74931d23c497e634b2233198d5f4362a15b90365579a85505347953496eb6ec5860dc3afbf40a63477845430068c7482d462c05d041ea40b0f23b34f55a17a0d242a82211b3e523fe73be8f587f20f6ab5a82d48a420003284886a8fc2cde7aa0277737b9ee0446ac3c976e18f30d8df1ff7badf99091816c4b68f1c3f52285207eb34cdc5802eb81e2fa616125498cee5d799f13134fa465d1c508e03629f13956d377d31cb77bc9883b26320cf5c99a772d3483e852630895c8045c96f25ee73b910b81eceea712f5ace8dd7d135764ae499422bba9d10b70b5baca4ed6bc525324a9c3410d9d23405c4b4be7c79443d95e52f7ad4cb73f9a743f14772b06e5ac4ce383088f05da550858011306f5bbf711ed2e4be25f81fa602079c5184df79a6db748d7c1d302ace63ce11b11ba3f042467d988639b4f4cda3a1e20e62833790b88e4af1eedaafba3d40b0793c9c4ded0c2a92dff780eb63c4afcc98ef01637f326134694407a906a59ef882c5b197f1cc3e7a249c27965afcfe4f2a552c1a05227dde0c933e9e562a4df2145cac1ef93090a48eaa19a097fbe3020325505f2664af1290284e6a39d091ee2b1669c4d9693d49524fe5081e554b50c89642d44d81a22590e6eca870c5228d7e08973e422e9cd4f048229d0833b9409f463a7ca3b51d865f63f8642c323a888c3145282da5d4743f3e4efc74e565f920916b91e703466d1eab1e03a3c98cbd0c62f147201a7ac1ec9683cd8e30ca8307e357f6a9141ef564bc79fa7952cd05d1f316d41ca6f536e69e16a161a75f336fc9a69aacaff0fd4f817cea0af813a890144b8856c6c5579cbf2483d56b29bcf7d31c2a70db669534c02a9cc1b725bd375204908d552e90a777b5b1e92d1bc6a7d1c3cf219ed3a2692dd924692c48127fb2e32ae3a4ddc0680d0ada553acac409e40022b5b9e26865a62fb5b57d7de5f0655d55e9fba2a1bee5a842e3983eedf1b6bf5e3ead7387b05f98af59899f7722310f0eebfb67acade3bc99c6ce1ee4be4a27e76ad8abafebc130bbfc8a629e87a3eee9ae813bae61c69fd1f3ba90b4063ea2078779e9b3886d1693c07c84f5019eb731480eeca23cfc59e9bf1eab2876de66283dc8d4527f415bb44cd53b802710e25b042f0b538d8bf5943e19715bb174e3ed2dab79df4de2070d800a0febbb39785ecc7d925713e647856abab20154f46e06192031df07ea4b711bdc6c92431de6b7ce2c6028886722f4fadfd601c6e6be5d0faadae6480ef00a79452580f1b7d22ee68f820723f1a08e9a15e06f80fff0b01b69e6f4a652b2f94fb80c5d59937e4cabb191f815d07d1e974cfffff3fc15cb72392a905", "", 1, 328143003, 1537743641, "28067cad4f31b94926333d0a6b5e357f4a1254c23c5bc789eaa52bdb53f87cb3"], + ["3e1c4f270353d7f808348eb0826cf46d86572f12bdd00f691c9a0446e157abc9e213ef0de30300000000ffffffff2b399b7e8c4d20ea298a3e7830f8f539a81a52a5a9bb43f361054cb207a49fc80000000000a35ab7fe9f84685198dd2a214c597d1f7eb5c6ffc8ec822cfe13577005d74ef2b91b3545020000000353520054111c06031b76f702000000000100df8abf01000000000152f25ff50100000000035251516fd64cc70355999d0200000000000000000000000020a9d11b7c0876cd53fc603d8a12f3d8db3c852c51df74c3b985b4d13dbabc72a380a37b4b9a7222ef2ac574266c019a540469098ccbc4b94d864e906c838918cc1d4d2525db3f45c0bf62bea7482aa24b6ec3fea7d1aec956167b8fa62e07850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016ee424b14346ef4223b8b572fec91eb2de0b05615afea16da283261d768d0d135c49d1a7cdabaac241b1060bae2e66620422f00957f7a5ab5e4267dc361238fc0d917fea178ab95a5c19beaef6158fd0ef7bb57685c8fe6e1ad481ff45dbbbfedcf5b0eb843d3f84ce03c5b90823ba51b17aa9533bcd6859167e3a49c5cb3e4032744f688c843921bde0441cd7206dc2483f2a9b75aa48331e81bff5bcec27d60030a60a61b91a0000785afb626e02c9d409ed5d0d3102ad3458ebf7f9460b1c59f0b08a99e603ae6a739a4ab52705c5dc1a3c768f5f9c736485df6f6683a5a27c9bd71d237d92f87b4b732c74ce44e697c3a6279966a414212a33aab15a69a2de535022e277f44e0aa6eae5b26d3eeefd2e87f6a3596cc0fb2b4df7d8d60d216136140020e2f2e121495e01c6e4d2321ea407f4b29ec8afd86e3bc8099c874d02bae3fc00222141d0fca6716ae55ab0aebf4e57be7c2010c6cccda9e68c70ee7d2b25c90800202d264bf1d9bb07433c7ca2784bb43ddba17c24e3e6a966808fa1781ea6eb55b0228945d0a3d13b6a8e21b6dc59d4d930bcd2acf59c72140ab374dd5b5bc982a8acecbf02565069bef50e1a4a9f5c7267a50ce8d81faedc78eda1ade88487c91433314a1ff3a27b614c5294e16cc274ac0633e564e9d785d98c421b02fadf6f5c6c82e9fcdb5d8eb0587d5a9e8c5e673e4a8aa8c833fa6aeb24e175bf3c65daf4fa67644a10dbe375a457ae92a13ae13cf1b7a9670f495683829d7217a0547bf6606313b8011d08dc3775abcb6d71e874b8abc768d199b3fd26a4173206381712b28ad55c80d2cd0196a712aab9d8141bd4a998f2bd46370f4bc06bad45299f64488a4aef2a26b0d1039644110fb246a2d628bc920c517ecb37c46aea4d1213b166d06ac8dec8fbb71902bab779af9b78ba569091b8932139a239e67d10cfd93e457acb8b206092ff2739c111e639c531d818496ef75cd0ef0a7233a85724d426315f0bf5bcde91c2c1e30751cf03764c965355678a063de8efcd9e63dae0c464e615425a20dfb31b46ff9cb0dd30f87122b9ceed8547f6a15150056309bf1df8cb819c63754613a71d2347fbc2585dbe428bfdae441c98c5e17a594dae06a113c1b126721febc2179e7ebb2e1ea20e3a938f14c85f8544422d3a4e8d12816d6cc717646e65a2b2521411330af24e3e38fd6a26760244df1806fa06d9e594660a39e89f61d8296e204bec41f56c2683919fb77dcafa35b9bb036a1c3eb663b145758be101ca39f048b148fdbd406f3e0d4dd01b78ecc0a27baa9c6b0e760a32d512040e0ab3e56b6b1461a321fe0d26c3afca479e8023269723915778bf279e6f61a6e91fe377f37d4b41d6788972ba26c697da0a7a70a457f62c6b8eb74ce2443e373a09ddb7681cfc8bd9ba8b0d81b3382a63b0e26730b5424d754e3466be70cec082f383f1b51bc11ff5478ce9e39b12ee39eb38d6c115d8987ced46e4ba3c0ca29147c1e91ea32dab39c5e4923ff00b86dac173d15bad15bb5e5312cd1f75e84e6f1f1809bdad13e7dfb390cc311c57f1ca3b74f315b5ed8dab8caf773ef64d670a1a5fbda745416dbfa92b4c8865fd48b61d68e1d75249274fa28454a7da83dc8d42c1c9e802badcccbf5fe530dbe720296c718d07ae9b2cbf1d786c006814b8af39fb245e87fa1a6245e71c34b581daa6c87f981f21c7808b5b203615d525647bf01b87740343082ffad8346132e0e9368303dda78cc88ab9d8f743fe067aabf62340b22c2bff05725fd7263a4b8501e91bac73d4b2a49eda9c954f1d7edbedac6adcf6f2658f6ab76d828ea1185d00f063746a8c3f7521a7b639b4d12f9979a23e646f2f12294372a4fb3a7e653c9a9ac82ca85865a8dc5232341e72711a6dd330189ef687a3ef0005d9aae5ebf27e21eb978364642c2f37a964186dd40e8f19648ad4febba4b25cad38eb1ee3137ca601fdc8fd5f3a503ea210b17178654eea962b3be7f46a83dad2c84db01c7a214e043086b3e2ba7d625a8eb89d283f13bd536341b373e184eb2d292789b127678e0221de82226f0248edab1e7cc52bacda4bbdf07cfca55330f308c9af89c9afc29506837d9a58cad05301a0aa1bf75960a8308c67133782cfb61c8234a5d17d46493cb4f821102eea03130c116268044ea9b21939229cacbed221bd987e33c42e937787521bca5fdd3968b1eeaf4bf4446de84b4ebf2dcc2576e6ffd6c5a5e29268fd7c219daa4d4258f583056df1e97d6f308829fbe74808d08ec9d4f8cc62c000000000000000093c51d010000000000a986a67cbd9e8275469a059c3e6a7e205aad47ed5485d0f3c6ea923a65c2fc0a99cc8cdb2dfbeca06dbc148d8d26c7db5a555c1d8e5880058df8a9772ec5b583606e46dfb80efd134842a57d2212d95a1b88665c9290fa7664c6437aff8d0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e2abb1024fd696c05d70174d4eacdbc6a2a49f8c7e9d28d37838243693de94d007aab6383488a8bb2deb447f774bba6b8ccb758004268931a09c07c278e78f1a70c412a64a454a03e96858f25f8e9f02efc37c17aa7cdc059074926f7f3679f56342cd537f2aa05eaa86800be23847338318901f2e5b487c51192479a5e584f4030143ee5227e01b8fabd69b09d7916999d3fa4f602cbb3d5ff1f2301278944eab021e7b5ed38ae7767b49fe86151f806d6b4e03a4a31bd8845a9afa580acad7e8cf0a08aa440f21ed9ded99e41f2548491141e8670c5cf8206ded4f71a480c4e46c94baefea26c6799229617253febd6c1e5039da9ff102aca44c9982a1535534d6050306b6815b762d9a67a81abfd0c360407545383c922a8391782de9ea7c5fdd7a8902293259725ce1d76898e5b37e897a1193312f294c1891f610d3aa75c209151d38031af4f454c48aa9ad614d04d0ab2ebbbedbdfb85e8dc8fcc7a1ed6c3d10f4f37603014147dba63f636d6f304b79d058dbdd2e710eb2d37c5fa6132a4f86a408d750032594dd9c7b54c7699dfdc339d057fecd7ebafe9a5e01e82b52aa067f3e47b9271823365a4f20088a50c29dc8d247af55cb32da8311973032ad62b45b8a27e22eca0362e5b8cb4898808028754b53f2fdf498c91315c930ccf1fea3a8622d1643fa99bddc62126c3b9fd89e2b286e541d20fd926ae5e37104fd31d99f3d6f01e3b470466e32dd81c2d8f17ee5b3cc7d84f6bec473daf9a595b8c3f3fc0781efb3121b316a6cd1ed5e5bbddb062349336130daacd9b03530574d1b7eca5dee427dafd14f3e738351cee099adeae69e95f758608bde90441968ec36efd870d52e85c2e91b02793a12bbb10b422afa7d16ae290ad4257a63b7401ffee761d0b2807dd3941b03f14da1a6ce2d4a2f9c870e30458cdf9749b9fc113a032813f12f101a9ecf145d6d51d8a1bd1fcb58b52b4c2060fa425a6d26ac620882bdefcaa20eab89af6f03948dbe001441877d6ce8410c011a95f0de16fd631292d7025760d35cb911cc4cbe6a5598d21d1a2c5eebd364326d599cc4a0884b4fa6b46aabe83d08adf5d0e471a611b1d3ff031aeb3194183d648badb897dde9dc67740f878d21b1f0dab8b5ae18fb03e10893a73e709be5ba738b3bbc39daf83ee069493911345a8fc88585d8abfd769bc6536f276f59820fcb5735bb587e58fd8675850e2570857b2dce42b1191e7605689991ebb3cc505879ebedcab3631666b5422a1b454ba36e93bda6fe7f4b0265789c01e9182690b94fc8f54767d6689677f6b0051ba2af9dd72710b5418902e701d0d1bdd74bda9426b8fad43a349b6e72da87fa3340c71d8b7d3dbe76a9162976b77810552c36a38b6a4617787740305a3f0839be8e545e59ce392404d90cd03dd315aa2be9b21df8eafea368875b5472be0cbde326bcc2fccab96fff30a9b884d1690b86b7a6d57bd8451462b5ba6cef9128efc91ee2007af008c7a4889ad354c8667e5a62b783803dbea8beb903511b109256187654d5ff15bfc612b7d99d82f7f7563c7fb2731db845442932869aedd8f5ea60c2aed8b3bacdca4eb6d14876592acd0413f88e66c8724ef2636653c1431a501546dafc907fd6002cd8117c4b0a17264f7df3dcb21ca8a135f588f61c6ea9c10049fa6d1b5e1ef4e17d706fd1de52b8d417f986bfe8c7c6163052217191e872a28ee2b3248a235c98f56fa619c056c654a307c299c38a22ef7d8f74ee0993c2c855d048a57ce24d9ea35649d95bb000c3abc1b3af312fe195789988715a4f39f46a1a9368746d2dd85b5359a623d38d7c533bd48e56d70bf511f35826a9548e61aa76098b9f43ea731073177aa73b3849a300d456ffb9c147632b07db38fae46c8d905e5557f2b3d8c17b85d3998ac1564050d8f8dbdde2022baa95c4dea19c480290e179fe5611ec5373810fd78fc26417a2e55589015d38713092b69c77389a5f869d920aa4e039332955aa687367ac594a8195a3d77fdfde49c94ff052b03c25a9776215e7d0e302f9e5d9c0ea384754ed010334d86f8abe5c09e8b85a37d07a675bad2b9111f0434d6cbee8e66af4b35aa1eff1f567ad1d0263275fc48447cba8c6d108cc346b5a0d4dc78e485886917ce9a6c26a036a76a47063156313e0774638da17913a3570d5f95137cc01f0f15d3455ddedb3220ad05300bc2a2b4a2311c62d72dbeebc12209eca3d67b76ad0867b9a4a8048a36f2030ded8c9fcdbe4460819c4aa6e9f67f203b31b21c080e5cc34d8ddcfcf03000000000000000000000000c91384159c9fc2b09769610aea4da3ef85e0320fc580f618308f2be2c87ac6d92b379fb8687cfb326d13615bb92793e947cd8a1ec265c4d0fe8a549392aee0e29fc103267057faab408332ecd0ccf8868021feb5dd3e2c5206309846f0fa75ac0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007922c90e2f1150765e457435828fa03fcefc7b371075e57401a3f0440168692d8548b7c23988ba2b0626967af0b86694bea6e12ccc9e073bd0638672fb74c510cffc13f807d716fce2a408b27498f3c9121325a9bb492e2186c6abd9e36cd3d4215b6b66f20adb0981e4304e8175f1a73731b5e300ec2e0cf7441b426ac7747020f1c5180425eebf5bcacfc5c6619461b869a083f5059b285d7dfb144310bab7d0317b5ae249cd32c2c586e3d4beea82d681020be9bf6c8b67694e5cdebb5c0db930b0457e2966280b2bb3e959d2cd6c0ae1f1a05f7725a7130314de9ae241cd95c1c41cb15d9484bfdc59c5c93a36bceff5bdd16dcca8ab6d8ce9bb713822f4c65030215c53a90bee98d70ddca370432bfea9fdf898cc6a4f884f00580dcf44d553d27032788033afc6752290b6780a41b5828a4f63596bca1a3887856355a20d33f3345030ca588f2cc64f5c5723e45d3c0bd5fb4ff46f86efc805333b92bdfd929e321b702259f9c13da2fbec59cd55fe7f57532fd336b5bfccf0a4587c9f9d630de7ae0ce020a183ac5c66fcfb88c4bb646caf0ff645c624fdb33a78780bb206f20611de2bb0d791d3012b83973364bb4b22cbac8c9c33544cc27d0c0141e5f3a266dd6687aee0d77332dbe175b506950bf877976768ced2e0617e4e87b211be14ca5c13b12c47a8decb1d38f7408a00e81b051cbadde17c58041e0ae8f21df2c717c479a2c2fbdd1cf6a010f904a4a23080e562d2632a2b72e39435d0fd3fe426d16d2d0455c8b39e4e6efc38e53f61a9037d28b7bd53aa465a293e2136604d109970fa55de61d4942da43824664a9a09ee96b8ef48b7c5aa40ed0a8e607bd1cdcf226a0e24164884714f48307b42e2864ec257a65c87514985c359f7c26acda55f1d6cd2cc0aadb3de81746fcbd345a4c995d626488c71d0897eaec78b7729ceb51fa6f675baaeaae8d746cb86377e922c9342ec29319852447bf16fd61fc3ef7386da20e29d03d0ed21802d9a772f9debb666141839b4c80d0f99d9498747d781468d455887eff2bc8bb7f177da9c11446d5d26f67e2c405575a4dd456882c9f22c2af63c2522f9632ebbadbf08ce19a1b91d40f7a25668884f1ad7ad6b43ff91349e299b568fdf5d48b8ac14b6c61fddbc66b9bceff3ba6d228dff8fadb944ce0072e8c718b88363fadf537e8f0d7f4523ca336b78a1534fb851c8d05889aa6fd39933e673ae15fcd41d06fe24103ceecdf13c1a06617fa0aaf2bc1915e844a5eff5859e46aceec623047d1da2109ae47125eb68bb12cb678334ae85da6631fb1d2eb936121c750adaaeb6191c686c41c77c2ea4a1b2e93a91851067d75d211685a0b4afccff7b013c778cbee9af1a383ed576c9b0b04edfb1355d31a634b13ce52b0e695030b6c065f17eb3e6ed30c8b2efe8bdfdc0f833e1faaaed24cd103b399ba7fae7ac06e920d43e4fcef365ecb3bd441629cc11486a56d54a7700250dad9afc4f24200b0149ccc2f88a8d34ae3e9f94a1f9c326d9689f8341146337cfac49e4b5212b9d8ac51738bf6249ebee29ef977e7fded5eefc4cfa3546b8fbe75a1ffc36a5cdf99d8c5bb667a1281078692119f793c9487b83e6d95d86a67824419b658c2b2e23d6ea84b8648a103bc3d64378198198df7b2fb34be62967b41710c1be4f7b6c9631618de397f4dd00ff68ff336fbbd02a260c0e587aa45fec01a367160aaa98f40adc1d6d4995dc65ed2627350f7480fcc7dd509510b63b40fded83b0c80cafe33c37e2d72d61a0fa79b11142bb451a7ab0aac4bfb2786fbd571af51aad7ae296b0b83bb4f3b61b0b423ae199942630d6a373b12f4c35d63c22627e1db687130c797e2a7ac0b8396367e57dac92f194014fd9dfc861602953b1ac21029db74f6df7c8214df27d6d3ad548c6e3720a3fcad005157246afae7a3c8a84b2b452909a7af3084437bad968a5eb9bcee9a9e147345dcf3e9a9b78be663eacf05d28ef75f00a4d07fbfda483894efd9646b907fb48f57726358050556afecc7ffde6f9e6c9d81ca278b6d7fa174a4b5cb5d4f40ffbeccd93b9f4bc9d7f28d2c89625abedc8ea60c43a9df329b4d0005dc938ea3d06e20c04994375f68a018c00e5f80bc7b46223095c576341a7fbf4628b3e18f62fbc7184f1723a980a9ac6c46e5b6d6e4ab45d2833333226275cb0b036802daff08d81afe33ad33745acc7c435899d870f018750f3b524a073c760d3c97425e3a4c73301956914d11f38b9f12be49943f6efff41bb50116518a0e70ba89822d1baea6824fa2135e098265045055aba60bc8ba0e19ee617161227d885050b1234952cab0e0aa4e7c90377cb01b210e55acf54dbdf88e287c3a688e1b33a1492f65c94263b4a4715fb18266bec417bd330857af7d02553b25f50aaeadface0b", "ac51636a63ac6a536a", 0, 1454564863, 0, "65e5710dd5613601e4662aa1d7ba57831de397a8582067852ec9a863789ad783"], + ["030000807082c403036021d0741c4ceb4e0a2af4815d20c5f121ef7de992d7f58f94d4290a309def0a0200000008656a515251005153ffffffffd9608160ff33bb6aa34a25fa4a72ee4d0ba75293e09896d584c91dab86ac86fb0200000008530052656363516affffffffd9d070cc0174c3e6f14377b90cf38d3cf4bf99bad87e774b103277684577b36400000000020051ffffffff02cdb0690300000000096563536a5100535300337bdd0300000000046a63525263920784ce739cfe0300000000000000002b5c2f00000000004ece0d938657ae79729989ddc6129fc46c8f149a1b09e4b344d310b09b436478dc759fa1f85961fda7fa55b071465aba9d95c198eb132fc8a75e8cdacea58aa142ed1d3eda823d82438f0deebc18904c12447e1ebaf5583b239a7ad18f2de91300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000432148846547d5caaf2eb28131b8fbb69a980b42b167c2f1cfe3cd1c14710df5dd5c394af2630d725291c9d8080ffe066627c4c42b8a2919d462b807a0c4743e1524636371c3593fe53adf42717a1a675e36d45fe1e85facbbac40cae6bd96bebecc6f984811efba07548e226e727958407ffceb66327be0127f6611de76e0e10229a27431288168bd2cd87698dce93d6c07765319d83edeeaf25f2127a00cba5a0203c9d5182d66b4124708ade671149f614bbe62e08d7ca8b41bec9979a491c7c70a0178565ab77428eb73462ce0680eb988c01bd7d28b2f7c0c925cf31e23d64bc7c81c5dd3c5ccac3d0a013eee95e1506ac3f96e36c4f27b9c30b1347f28f15417021d217830a53a84bc425c6a9d5424e83fd7ce8ddfc07637e2aae67f542bedc87103057061f43cb1f124566417e179d15faf29291882e0ec7fbd3cbf27eebba43b0e0201cad47475aa3d0377d8cbae36d3a98726163bb35068394826c995e05dd4915702173aa3e5f43154186bf0b03f7094cd8f7aaa7758c168b18f23a5063a4db3fabf0314de9f3a6302c636b3d3591ef2ca02ecb0203e8c7448145252655a8b073f0bae03bcc76d01713054b2197c0eb7fa496541e7003242fdad85b3e0daa4a6fc96d3da0bba39f16a8b437c4ab50f9026acc0c793c8d67f88344cca8ef62a418a77098bb315a98ab1081caad0b94248dce96b4edd770e7a36f2327f489a0cc1375ef943a86da9a1c8db115bcffb027ebb66170bbafc0ff41ab718f584b231c9526dbfef83308d3e27ddd584a7b91e2972abdd2cdc0a4cd8505b160c86dc583e051bf67420441a75a73c3c1c130360e7ffefbd2f71e62f0c302aba87b79bfc3246a369b5313fb713433aaca7b308dd5f96eff0db393c0dbfab899e2fdb3c2bd9d77b9823bf4f66fd1bbdb5d59eb67e978d0ff9e5ab098427f46f36a98d3e34cdc930a5d1071b5c8681dcc83078b37f491edb4910b66e8ce26e8e9f51caef185c581408948a7a516ffaef3b4418cf4908ddbc7cfbedbbb3a90890179f0b6585e21a3358056bf714bde81b5e88022a4c876baa4a8d0cabe62ac7dc5704397654aea3dd10d18d37a03c2b9563d73d3a0e72c75884c246cca8e9f86944a93ede6ed24209b011feab0e643773fae834a7deaa015029c45f026f3a5fc4140e474da0523ab48e90a7b1d7fc78272e5c0220133ea6349731a73072bf2997cc433a82fb350812d22c7547c47037145e604f5c29d8b1ce91bd1d4394a2bcd44ac08ed44833f9ac28add24410b231d0a3f2f989cf88f75ecec716166ab0efe4fc45b2a16da2b74f626b687b44a4a1e6a38834ce96e4e3f432c30ad93624d6267708d54bcab9f80c4ef4c4b302c246b82a327977a94015f228fcc3eaeb7587322a354fed2e1104ac0737e508dc8831b506bb1b8328125c692f011438b4beca9ee29832cd789f3b8d9890f6d0621876a6af2da58b926fa78212da57e99571ae0dee57002ce8c3605cd595cc1c792ef556758fc2dcb20b981736d16889c2988de67518590ea4790e194f7b58b130ce96df795aac3ee00c5b75b6abbd69c1c77e2bf8bb79f1157f499726af0c70fb016d4ba1424ea41edd357e307c808f4024ed8abe51a58d8949d862d7fba53aaa7df58bbb1ef04e5a0d0675c7168b878d5f9f3eafd78e7042f009f4ea562f29c5bb8cb58ace2e70e2177f3b13ca3a67f9d90ef933f14b3fb6e967b3cbc7cc4905c3fc5afe7323e551665d6ca868a4961f0acc844a8dd0b257852466e2e0c086ab04de5546e52794112ef5b7049749a5067c4a7dfdc8676d65ac15d8fc8cc5a130f328dfc57d206e3320e4a9865656d5719b5cd029d01eaaaf5bb1cac47e52617a8661aee73cd3125ab343e2eadbd76ca27847561a394fb7106c8517456cd67384b6ab0d0402af3d24189a2867f398d927ee25ccb2565f455b5f5341f12e8c1f15dd251efca17477c057e2277d8a544429e3ec9215e83936a61d638a3fabb061879b7f18d3579c91fa217e303d1ed2a41c7a0faf3241156c2baef63b234caa8ed25158898fcab89ce956ff34819c7114b05c615a2987816498bbad34a0d513a0edee514f3837656dcbacf301044cfd97cfef3cd54e180605c28dc18b0c8772729ce0fc516f1110094c0387ee7607aa89d9a55c47f4d6bb51be39ce9395f69d0f16039bfe6963512d447793d2f3c33708bd65ef4fda33d15a1765e7b871d34f108eb4ae81cb47917a3f933348d2aa2928da3133c6d011ffc648d19dbc34ee9f262c87692fbd1356ba1d1f9af4229a0d000000000000000033418903000000005257327b664561e8facd0334129f501c167cd33544418d1b76ad75d61f6163a1a6abc008ae53643e0d5a0cb783234064dea3d803bd1b754d17017b63b444e6262f2a8a91cfc43c809e1d3d8989fd886f7d424a7b0b45615e2a15f6aca502dc0f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077f3126482733af081840447534124b62a8c897a717803a8aa99dcd9fa7d53f8b4a52d18e73154d0e35dc27b3acce9fbcff849807f7908eb5dacd01c7e22d736ee1cb1b32cf780c3715a3111b55c894967f37f28d02fb25089ed21bd636b8a65f524d14508a05c4cb6cdd8a93b503f366f529c1a5863bfc5d60627807b03be110212821d09e830d6c8196298c8021876ca7a49293b761e4bef56998b196b828756032320566979b7e180d903edb1a5278626438abdd9873b581265290689569c56e60b032d95056be54fae5557b961157432302033b193fd603eeb7400fcea10642f50c019fb39d70d8d3194dbe173176b72ed1374786428a9bd230696c2e3d0127c0d020415ecb2d7eaf1f4530b0d53c910e20190f8993509a0b51599eb8224ef7979c70329122e85cff18efbf112f5dc5efbf818c5f67524a9b6aece17dfe72d59c259dd0324989ffebacd2bc4c9d158a08868d41baba4cd87eecd6cd9c0c184f755ba24ae022fb5280a19f4acef04a7d7417001679803efcaeb4dfe448e86ecc9e1cb54c2de030b67765c197e908f73ce71266caebd8e447e288692475126707d10f02e55b32eb81ca1ee388450ee5e7ee05e632bc9a3585bc75fc61925f500e62d83e2f3c664d39fc4abad92878dd54299fc130eab21b9bcda4b5c52a71b64f46872cc01e09612793b3b9b0e79ed2429451d547c3cc11716a958cce5da22b7091d984f3096b11953f59008d7e03be8b3d76bbe3f1f83cae29b8aeb8ce18c186afbede5b1b39ad940a9f43c62fb7fb4726a51e8b2476f12f9ea08f1c829a47d7798ef9bc190fd099076c510d608e50230e7e59cf95220f4e63c001c88492f4fe687dc777df4de019537ceeba01748a580629507619f81f27b55a8d6daf99d7bf59db43a0c13300de3e2045280950f992e36f34e7ea538cd7816f54dfb0e1f8d24681906431c8a0adf9b5c90609cd104b97786ccf9e9903e6d01c97c806d077085e27d39bde277b0425ee568bd4d09af65f52d20e6a96435cf94f1b5f085d6b8c3d777e3e1999cc887875ad48f12adfa414a1bef49385505d13a77f5b9672d93ddc4a4f73073f38e519cd361b043ce20dee7344c95fbb662a6224dbbb3403383344042be5baa9510b23fb06d82694a937474620c7dc28d7517c1c50816ef56e87ee71c0f69f734f6f65aceb68d710af6258d1eb825c56fa772fe07f532c91d85a003acbcdedb07d6dce7cba6875d90a034bda1971d9c8354fea301f6ab5aef3958edebe32b54f70e650990fec27a3fde89b037615f9f0b89ec1f25556854b6e49100bb17c6c61bf201813c896de45b5ccfc50e8f44238e4f1c0df9afe34ec1da8d8439ae310f4ada6818c64e699e51fd16b1538466ed1dedd033a0c52751c664c940adea4eaf7a60a42fae9d0168ce0f3b6fdbff8d5b03682dcbabf3342dbef0bb5cc425277621b555ac9c64d74c1acb3c5b85beae4318372593ffd588734b1c43b21391e3f3cbed109d39d50b6371d9917fe89e212bf94e451122ca002a1b0d87c9a7d5d782f1e3ae9eeca194274dfbff7240b88709f9c5c87c5658254600920e1ca9bc6c38c11734083bb74c56b0b93f2675c5a5128d570bf944ccce29bde5fa5af3df97bdc81a91eeccacc6b8001463066408f0e6d86c0c7f09fa469549feb414fe8bc3f861a8738b18b1942e8a5be8bbece9eebfa640951aa639667c563abd80051c65ca7fd950b27979d175586ef9ba47cb836ee6d5f50ef09c152c36d1572efb46ee86721cb0af650ab406f5ab90c21567a750a7c81126e3faf0d64598a59d132c279ba72bf14397feb9295109fc0d5c358c41d8226f19c2c56203bafe456cf933b13cc2eb96ede9fd295b8df44e814991ca339b3ae328eafc46c08bc6bb871b8c0c8a65ea589425efa9e7b6fc55259c1d291d284c16a9cf762345060119eddd9922779fb7d470805333b3a2419f6cb2a046b03b511535d8fddc5fa2356c702b8313ad97886d1203bcbd5abd732f4d3fac0ff66d5ca03485094405a2fadfa89ffea3e2242398ad2c8ca41066f05f03605140a17cc2e189e881c6759b0c395930de81a6b09ac8513b6db0a7a0fe6a8e1b595c10a04f9adac1e20c3104a4522efe4df688a692c493f1c4cabdef2a211ed56a5b5e8ce33275100e750fa48d756d1b482aefa89fa01b6505c8b4abdb5dbbbd02d8eeda88eea6848f2a87b413d0951d740842af6a6ec1a58ae8e352cc5a577ccfbdc9a187cffbf83feb29f7d6fb7f4f37159d1326a5d97831bd5af813d7ff7db0074aa326e36c475e0100000000000000000000000092415ca124f4477adf0260d9790b45ca9bff4c1db273a1c138730ad0fc53793cdd160bbecc2fc73954f3467514bb6ff06e85f8e4ef41e5ada957a22ccb1e0cccb95b00c8dc004f98a5badbb0b2c18ea01390e0e3a80655b559583112e1897000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006d4a345c12892b575cd264a0788bd6857e7d0719f21a0b6077c0f8586cca55f6b573580a8d433fe085d7006e9237fc6a8515a1b6ea07ded90d7533a32baf0468df75361ab8e04b507d82db69f89b04300d2eefb44a3a7ec34ccb600ccfe318a65708b1da34674d366f8d5cbff535417bf71749ec27d914cd72de524935298f010222e73d1de618cd4b4177d95e63c6eba57127e33bb1691f1eb8bc20a93354acbd020912349e0442c6b4bdfaec8473bedc015a7f245e1e23e9e7626f4b67b3d6c77b0a05176aae295707fed9f85488c46faaf88932bb6d1cf16861331a3e147cf9c2151c18bc599e9f9af18db577e3ec40eb7f1210058d5aaae606b621e2d833ba40e1021351a69b066e02b7dd10668c3faa5938f723784a41edc4370e01a881c7bca42a030678c70ab6c4988763c603c020bca6b97cc2467cc3ba87aad8f579d675814d9102249995d6a4ac497919dd724e18a3fa8dabbc711972972f591f552a90d7092769032271731c8717225ba0ba125260ae41758c83769be0cd6911f45eb4bca31928dc022ef05815b8bf3e532d93434027ef69d4002df44ffb17b6f528687fc42c5ff9dfaa630222f003b7da75942b525db76b3976a2919ef0262c475420718721ed7e67e2026954578bf24b61b8e47b20e3014c10b6b73d69fda374e8839c6b3009fe1345890f8b4602ec663f7b1d8f22d6d744e377ed96892afb5543bcb15cdcdb21364d97fc0fc5760da4bb3f1a554123404cc7538f422dab5e39c24de90e73cb123821335c45059240ef86e8cc067917cc84db2a78023dc274ad360d1b88590f4ebaa911e65340ecd8de1120a878133bfd315035dff0f429bf2aad433b356692e8013963a5b5fc2d27d15f9e31af7985b838e782c068a1ca0266cd6ab2127d26f741728f240c61cdadc2d65f3fb0d5a1ec11a0956287059378157e1be7a5dbd7aa4493518d348bc621e84fdab508c637f819a3b98c3e84d98afcfd74885bc64a41bd7c75a048af89a469964af722f9a70472b514863ff6c913aaa4167d55ed5bd1f6097e52a68797eefa29d0e4e73daf0f7407af8a99ff5f2c39732db219e4b1af90409dd12aed153d66e17932ae92db4f3db2f7c29398addcfd3b8fe77a435ddfa0421023cae329d0fc9d016df508afdab25373c6e14626aa14e85fa82e9bdc8204375c2adc927173d2189d072cbe2be4613334334dbb9a8fd93d60df80b76db954fe6805359b736894fbbdb9c7e5a27b99cb3f872062f7eb1a369574563e6b325c81315427b4ca914431468bcdb36cf17901a6b413f0f434d3a650ad7c0908337d5f5a26e8ada13d937a73fce3b70af4117a64d891a036b587007044d13725ce6f5440ae29e8524c0717c1ec89eaf278ee300a8ae519c9b27e9e07e757975392d3017c4bf16cb79a7168fa7ec0326919fcfb0735c73e34a48e1b8a337662ea7a71ecc76ce54301e1545a09cd2b0a117e0075b2cffbcbf4712eeba3db4f87aacd57e6759a3c12c2b2da98c139aef636f7ea027f1f5aa5c47ee4078691b54ce8c904b9f147dd1928c00643bdc0e03dda83a90175c954153fa7f249808aa7a6cdb902bddec81b769a82fc003125bc2e481589cb53f6d05245b3d7749e9de087e2ba646f8753a1ace27c8bbf86af7c59d5c575b6f473fbe5c235d958348fc0520ead54ff8d207e08d79d005fc3f4c919b4f20e6adb934635256b2c688133566ca81cf10c1d92859d04feb2d9aba1ca961349ca21bd819a851e8d01900adfe6f26a17459c8f6211f9196a03d75312b16d252d8575c87754983be9edca5d15b884e065fe557587a51c6420f712debe0622bb477f139ee547134b01a6a3eeb453d64e700908a517a5c30c43bb019c68a91ead2eb5d30d1397ba876cdde2f8818a044cda8bb925efa5d39c5c2c5e9f580ed8f9b6b2cc7380e2f22ed78b92831e71e56bf2db01cf65354e81340867f5c50cc1229a7280dd3595eca9e6aa98eccdd939cf0f50e7250fbd41886c867d3cbd96d8c91b9ae07f5d745754a985056d78a7e670c1c3b2f1fc6a2ce3448eb90aaf5ca42367f0c8a78ee45a60079db4d96dc2272e507cc3e6ab7b3f1ad1551a280955420c57904efd08f4dc5351f617c5b9a7596748c0906d75baf0f5f5a3c4dba8420448a29eb4f4356e6a5303cb935d64046caaa173d8d7a205bb3d2bdb798189a7377ec9d5b40e6d8657310ec8ad0785e21e6f17c15b39b8e1130df0972c66b60b1aa8428b25d678b178d836d77fda37cad608e02ad2aaa26e7b32291552bbd218f7a8bd698aad745e850a1fb0ba17c5605b8eab22644f1a50b9a033f7684ccc081514d14c4aa793c2fe9386775498fe90d8154f961f1769f5a5e5cd4c056ae08d322d9a4ac46d48f337c76121c5fc559beb503818bce2741d4423187d295c8ca8f54aaef09209", "52526aac00", 1, -1288311379, 0, "e480f427c0ab4455e019d74663dcc79773164ea79f3dd8a1b3574e1543eea100"], + ["030000807082c40304f5f1c9c1d79b2363e24014c306ac03de9c9e4ceda2172cf9fdbaa2f8e2f1bf0f0000000008000053ac63525363c648375fe2309678b67e5162e88583c66857e9d6adba23950f2e3ea7576384f4f0c62a10010000000663ac65656565ffffffff4e17afdd65f8c28ab44169a94a68cd8d098ca00684441156470d047ba5ec8226010000000752006351656a632a8afd92641753633a34720b06546e258d364d50217f0343b048e8b6dea5052162dea2f50300000007656300636500634ae92616041250bb000000000009ac52006a00ac51525351cfd20300000000045353636ae3512401000000000952ac6a536a006a5265f31e3002000000000263acfd32394ea62d95cc030000000000000000b1e8350500000000da9c8b99b96f52e9c4d2d1c019e86faa0315a63108d88a8ad80a9c25c237c615d94d6a012dbab0513999003e7df6327e9c6bd2b83bdfd60dd6d0c0e67803b2e2ba2ac947168a683a6fa36fbac39108f869ec8c918ef966c7a00a5e5b39b52beb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cb012b5b9dcfac4a1f173400bbdfa491743e8681c4e46c443485c7a6abcd8a7dba9409643351a8b841585b0da0b9055fda29dbfeb11a783e06ebd2263beee28e967864a0427805ce05b614bd8ef8e4223eb544c49b8fcf5e036dd351e0f7b2266a10f5a42e57de3bf81d0b281e3ec1b7f01a42575b33992465791991709989ff0212e531220fe280c1ce3fd185382ea58fbc7e21756f06838bf82ade9770b03baa02230774982f9e20a265c9afd3ad632bdb7a49bac8bb2bbd07910ba35c7856754f0b03862f50df3c997820f7ef314d343994b592a285458a9c1398d02d288f965565e5d5d23007d3719f0c20ae3d5f7b34fb853e452afbcea79a81ab382297e22d86022b31cc9a2c7c76af350188595e357bbc0c7e99a1372e3b9478ce8d16227486150224d4f363f2d864aed99d5411aee9e77b71a603f7fe26d150dd003f2fc8ae98780228a90ab9b6dfdbfe90ccb2e43ac3e2a1dc29024e92341041b58e34cb45a8902d0214fd589c0c6d7fa6debc2d01b6373a303cc8247988baa70f98a51e65e3a4904d0201bb46d839562890a8033c0427e903d7934acf99b2c31cb8a966c68c515169b0787be96fa5caea1242d061661ab95bb0c8565b16f064bfbb6195191e8a1774f882ef366696a397763c684f672947d111c188f9845776a0a142181972986167b3013ade1f895d3e222aa110bdf472b181058b9eb3731ae55743c1809278580d67233b19a0b9356148c6f448b292b7e716fd65557af1d007b86b4c2f7383894b13ea8ea54582da623443ccd787876dd1b818ef7de21e2b558f388eb0653a1d65e6b054d02304924230e33b27f75f593253ef064c94a26021a18cef7a73d65b410a54ccfbbfa5646599bd35fafa1f4fbd9c43b3b40c8061284b6bf99cc6e36a33647814649519a1ed94538e0897f92606de145657a65f335dae11d24b5d107806fc43f0028375ebfd565ddabf3a7bd5ba7298613efb3b96e12492a7fb0d6ce12c46f53033136be6c53c9fd3e1e57d33b8c925d2b596f1ac663c3498ed46443bf21dd04f3044ec3b1292fc136672e02e3651edf27c9de9a4d63f9d7690948850adcbef7ba761963a3547d1bd27e97b2bf6f45f83076c8ebb6445935ae803610aa580080daac97fc1ac18545db26b6e171be5f4b5bc4cb64dcacfede0a2df5e126018b21f48dd2f7b6a4a16210fa787b84ac2ecf4940b463b6d704e6bae9c4ff2e13f7519e190224a09edcc09e26a8c4e753580077c7fc20cc1d841085879c4ff7205bd7b7d8aa49cf6d8928e3ef6f62b4fd5bb6d2b3e54ebdb58c0f90973db939851a0b56083b8d7f3d424771adb06dfa5449f30ff675432d767af559e1ea3a810b5dca55656a886e6573ce88154f62ffd6c5afca321bb8e58505741ac53114a997b6ef5b68a4b927da5773177e2c6b1d24306fe77ed9ba11590e0ac67b50a9c614cb9d310faf50726b0829bd35a16398629b9056d5f55609372c448a40049ccb68c9791121388f1f1acb18cfee02b8c6d4fb1b1253716820631b2246c5bfd375850021cf91a4967050b9fb8058a88651dbd0eeaa34b3a626c8351692ef2a6abcdf82a512470c4b8a810f2857129ec4d92feab618373042af31e1c514360f34b8486703b5cad39f9204772d300608ac5a74882e46f852d35b0bad71687631fd23767a4d3f417af7262160d30dd7f76191af3094c46196b2836a0386ad2dd2ed9003f1cf6e6d0d3f7793144a18de86685670d0611c3f25de5e4f2183d7665565131cd32307762aac3365165d48eac281c00d813286b65b28dfd884285c38cd9630d4f57f6f06eb4cf2a481cae40788dabc9e6c5a0406b589f1850b34e97d3629e226ded508a47bf2f0e7e9ee9616b7daf9e77800229b644e447706e83f2ef90b05c62a087eb014b3975e830b83aa4e99ffa40d9e066b4775f30aeb91aa1771fe04ccb1a5a0067ffe0834c5a695556b5c4ef830c97c03a1a470266e4126679a228f5ca40d42680fcc9a730d5bb50edbf2fd62e7951570ac2fea88ce23bebb21142adb4e856d8970503a1f95aa78192d36a5ee4ad6fc3301030d009b9c13f87b7b8012954e0d56d8eac353d2c42ad6a2d90245d7fd79e7107be13b10f1fe1ae3b10424dafa58dc1d6e18e87310628526d2eed116a139ac665fa1b424fff775688daa881e40451f3936cf5b6054d2a53b87e07030ee79c8f60e0d0c590dcf0a7892c00e7a4072295f361b552b14000ab050bd4ac2bd76f9fea130f9665ca0d27c9f628e0a5e1ea21ab23001d489673d5c129c4887ccc0000000000000000095a5600000000003a490c678648e55992984de153499842b4bde45d35db4558a410985f7d5cb4a26533d9ac8780df451beb06b667aea34e1ddddd88f01c2702e7ffafa05e0b46061c2e661cadb7cbbced2b0e4024974664f196dfc8d4bdf6543be01e817c216b0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab0e39ee1db930216fb7a62a72326e0dff2376ec2869958708c2f899bf16528244d6d0638b9316bd7a586510bc74712e299a82c64a5cfea58d457a43e37cdf4b981aae4833f12d50fcdd6d22febe066be8f2fd015a1eb8f85a5ea8460b76aa7ecc353a4a247511570e6d17c3ed7215eb902137e72c37f1639f1efe21f292b8da02021984a18481be5e86def1c576c41547da785b4e4fb4423be8be9bb103fc85b6031cb53633695cc2763b2efd2edb1508a33afc6693e896fd5268a117455e50f60a0a068f03c4350f74095673886f4d0a23c201309d1421c8c461f88eeddc1323081ed36b17b231c3272b87b60742409b650e4a8ec03965647acda70256db19af9352021a6db52b5e68b29e25a60df1d4f158739095d2856ff154a4456bc0077d80aa330201169a876c9889b24286a3e99494cfa7c22d84d8acd9c277d309cd1412949298032d79661a8496cea4b0cd11aa41654160db5c100313025ba7d5e3ffff010d15f20307577a2b1cb0d9a1b15f35b98fd4ba1ecd233dfd511c23cc581fb6876c8d7947020dc2c6a0dab29750d94b92929f5b76c6be6e938d7742d603566f6224cc24d02a84d6b667538a8a92395a300193b7acafcb77f3d2c25ba31694f72bddec3947f65a10b2b751e8af864e6cecbe1de68daa6ff62e9e3762faa71fa20ff4d7b2c5e3f3fb88724b622ca3b4b470fa2abd1a1baf47a0bdcb92c5fc4c9aaa4fea39aebe373de7b89ec2988968a10854c326f288d1e33633b3d90ea272b566479b2256f33220d856dbf0dc2e5ca1cb07d5a2f5503d91257ea4157c0786ba32848e4943f914e913512ae9421d7dcff3a8f8ecac25faf890cf46f0245a099cf9c38426cda2b2121015e289019f5218f3d66a8ec9ccf49318f6376151ea198d75baf8ab4bb4698e360758876084786b03ed7b1b4cd7dac01100244199d4d6847b1d5b092cb59e32cfa042fdadb202b82c7958f0573c471fdfb84a70ad95fc01a0b0b4dab88d27e5fb5c9f401e8d302d44ed41300f004ab3c99ac5863f0bf0867e7aa7e4d13b2b983f3dd3ce2f1536b8006a7d046fb09ee6fde424196c457643cae3a2c041481b2ef6b25e5e3943eee8e639c6089d6b0ebb2fb2be479dddc3a7e210b5c0c0a04fe092de524d231e0249760dff0b0fe6dfd49114767d7f9771a5318499beeba6a988a6a39e3012ad95e29d61ea6589815b500e1610ad808890a6866bb01d6d137ea8ed233d13ccbc80dad53ec03b15217d59c4554ce1244ad8d90731959fb065cd10a4987b6c818ba290c10b0f3b3afc49be7755430ddfd2878c4b2f353c207b5f70f38ce2ae7cb7c2358f7dcde9229b8ad24409a32f4c88aabcf8f4d70765c780c8ea9e766b49da3afeeae65e13738d371097670f64528e20c6aa90b85e18a5738245c6a2a52355d784d4390aa682d325176f4c2962ef86b3cf468229e8cc16cbc0530feac59bee8559ed1aa2763c788df9a0b52dcc8009d4f05e89f2e45f9ac8c2e60f698ef3264331f69b61fc975763b7470a474cbe2ddae8a1cff996658b04159eef06e4a8c7c73c24184b5e1e2cd538f7b19f6f69379551794f1e538c782528eafd0fee6bb69b28fe6da04711048c2b67a749f14568b9692863e403d7fc278c7296298217d28cdbdad799493767855aa35774735fe00403bd9b793d06d31f892cb324f4e0a54dd7e07ca4527d988738c684473774f1ccd8b61bfc6d2d74565b23ed7b49c892cb21ae3564bc0829fa58875eebefbcba8079bc388690a9d9f72623cc4b558ba18410fc92c7a7015b123a7a9adc7915859f83d05b81fcb7ec79d550e2e2e42199fd5209d371b23e6ef2efe3a527bfaaf20836604e696d36262caf010017dc90a3c6bce68d6972289590954d354eb8c37f2dcab222b5e5f357a1cda13fa7545593c087995d70f9e651d19ba267127cd0bd0de0c558565713ebdca46b2a52e3a9f754c23af9ecdee3077aedcc33e6a31233bef5cc04ac5a89142b6cba02723083e29738e98ff127fbd2122307f5e9552132c8d5cddd8a7185c92d921fc1efcde2be7d4382a2d12bf45a17a2320af9b1b232cff91858ece1ffbd6ba39b85e37fbb7eb0465064cfc30675c43d73c8d823939b7e527c94eb235a152e066b656e65c0e7a975ee0b61c0cad10e5003ddea1aa8fea1c620cc45ffad4cfee9e5897298e503eb60dbb7b6faef6fbfc6b05a47425f1dc4c6ca04015d2987467d21e359cba7519dca0ba0b81e787e0291c7766307185ade4356537ad61f8448c4eec2a984cdfd9d7f5ace713acdba223100000000000000000ab742040000000024702378c4736085c1ba8408f7ad9dcbb9a1f5229dfe4f414aad32f39350d8d1acf692b118291383a00e78c991934554e97a04d3323664f43ce7d911b0c4bef4c74c9f12025631b0758894766aa36a569a972b7c2a947cdeda5d96e29d20db9400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d75f21730dfd102298f88a52b1dc9213f5b1b95d0d34fcfce36e669ef880b9fa8d87485b3aa77c6e67013c4125752305829734e83a9f1d6cc1d2ecd899c41d27215dea8639fd237ed8fc4f0f02947d71960399f62b10db04471da5858c30daf6519706a83d7b5fd608c007b889420690ce5427aa7790061ce2a16c956cc9be4e0205f2121b74bdbba9432e100c25d2a631b5709a590f1062a94c8dacc872b0a001020e2378ff60ad55e52d7f52b64afae502f13032fa703ff5bac1fdc94f6af5be3c0b032d2e1b23f37f5e0114dfeada65319840dde8de13231020ea70dfeaaa294ddc90e7e7d19569b3df442fc6b2493c60f10682b286253cbe31cb31915bbcb0a13f031623a30370c01cce29db09024abe1160f407d68bd032c22cb557d379a674dcb5021d7fea961b218cc9a9d1a3eb2f55dd6f6487f6d278ea243760a02574c8fd6c3f03076961bc3d71d460e132e77c6e8fc86607c5ead080ec2db1e1d7e7eb7d6c6aa80213bcfe2debaa272380987ca9352dd0ea16f2d8c50ae10a0fbe7c52a9d06e4e3d030ab57c925eee97f1b342a3bbaaeec4580df9d746fc7007e07bd1ca916aceb775f7b1189cdd2046cd08d44c281f87b99b7e0b51fc1363e4ab5bffe3c937ec7b7ddcce519da1fc5da6986cb56d21251c5591c5a0b7137e165104b397ec3339e30f9f9cfe30be11914cbe47e18c82d3c318463403a102822591da97f86000d3b0a45b3282ea501f510e697394f9659746a8121b7ff9cdf2708dd05c182432d1ee03c45c68fb0bfd60e89b0a1531ed4ad1cf6c5f21d225626e9f7b27f778a0025168b74f0fbb2d4d6cc136132bf57c2d0de8c98966a9b62b5acb02dea300a1ac0529b03ba5b8beb376a48184ed40a2f709d680ad15c6d08a78ddd243a6d15c8cf8e7d5fd34eb12b2123e4721bfd1a42d19b0fbdd2ef210a98451d8b12387a25c32e7c2566f30c5ea3adb047144d798c372a3f66cd14fdf44988c04dff30fdc3662b3cfc8b176009bd5badb797949583ccde4aa173dfddb2395cf32136cbac58bcbf3d499b874a76329f0d21619e3cedb66b5164ec544fe61c18fe24ddbfff48ca5bd1745f95a13044c94d8781045f89ff7044ae04b8f3d896582f4240348a9f2517f86522ca4bc2f07a6b3b52a46a5a5685d4ee3d5e7b3dac494e987f2b1aeb1fab6957811a0d26af893e29b4a10658d568b5f2846d539233b12b97b3b44a1e4e2eac2f6ff11ac038d20bba96a83d15e4b5ce891a584667d3f2b97351fa38450426ffce20b1e43f1a09bae9c4755583f4f381cfe084ea1dce9637b471fd30f07ca49d72158bc50a2f4fd085f521ac9f916e86f5ff4b8a1a8adf893e8b9f196b7a95cd1643feb80032bbab225ff768a8a2fc590b906df7594e2283a6b1d6c9653388116d56592880c38c0743716da3e807d233f98af8c228a3037804b09ec59301a9ad10fcdd21ec23d2bd3107f07b896613794b50ddeaad9ef10dba7a34322f14b57344cf26a115b5c9b11d840c5c54163f6b370366b4e9998e212de15c5427f1fa53c3844f8b165530fe52a93d4088871a094d64df823c97d1e0db0840a94bf4303998da3200f4dba555ba436fa3bee5e9fae8f9b80018117c048b61a993ad0391bccff60a563e1aca01b4ded284b1306d1539af32bacc41a1264b21d40d3be819ae2bf690a878ce8ef7433c6c5f9df68dc3cf81df3b122aff17620159e3cb2a96f4e5c59adae2cbaf113dba301fb0a7fe091c905d11b6fbe0c2907033fde5a98ea9823a90e8ef9544b7181cf0e6ec5ef515340dd291598d7993546df9f97fa356bfd1f3823dffde5c8997d252641d7c781ddd7c99e65663c10a4711848bf4d28c8a4e0c3483d0ef294773d353b14dc809a84e49d44e078c741af342af2803e312fc660c52493e92a910c4e41a85b7300757e3e29db067bcc20144e8d3d0fa31de2c7916b74cb88353e89e7af7e5944cfc8004f33827efe96b0c77238a5b3246163a973a598b1e610e558c57b30757c07667d4595ab473432511b6552902dc95e28981b9a4bcbf290ed5f5bb9d97c4a78cb6181916c1942011b5b6d76b51dec8dcda937238dd06499436b22fcf90696602b82bccd04715672eda6f64cee1c6744cd5339ee2c9ac0aaed016a469546ee590d2c431ba73e3e5d045472e985a86dff72b7e3825be1e36e24d531da37f3cfa98b4f74227966d141e15442efd79e27cacf491f0b6490a1a1fe4bd03463e479b2e973a52414a7bced6405009268c8624e50c0c365685fea0f6d69642a0af0e20ef0d6f77c45c345552f7c1fe584ae349ba86da024d91a838a1da4042e72ce6273f279c84cb4739461f3df8f9b3d8c30ae7f6936b7ae8b4e3f3c2b95e0b4a319c72ac1457f017cc6d35ed38679121a8fd4aa2d2ce7d80fdbf9e8444e45939e5e748fbf02", "5351656a51", 2, -2112800587, 1537743641, "3efef57ef48e21f0239504d3dc9f408378624474402c1059ab4365f71271ea75"], + ["030000807082c40302f6ea144978f759a2ccc3eb5f174476d67249954bf16cfbb2ea4013f0d21d367f0300000009acac536a0065636a6a0362a50ad3a2ee18684603dee294b0549f60a627c654bfd582651d0499c7c55a7e7e50fd010000000165ffffffff02f0f25a00000000000700ac6a5252ac002605c8040000000000b49590b90000000000", "6365ac", 0, 718875641, 0, "65fb06127eaf2f8b02c24e83e86a53be1cdb5a6d60b5dfa009f5718bafaafdd1"], + ["f02c763d020863f6ab045b785edad13cb4eea7ff9e0b3c42035da0e2b31c8085375d53ee0f02000000080063006553635365de3a412815cfc91803dc40bbe9b220f4d42bd9e27dd40d05de2c04e53fcc8ea63092fa580200000005526a00636affffffff01fc37360000000000056a00510000000000000126033b000000000000000000000000005526e5982f0797961e5136546b28c489db6d242d1c9e3f03d8c0f1f7a58cfc46a25b39e3097c1b0e61afbf5e8bd924dbed6be389ed16e88a1cc94d6a33296f8f328847c3830177135fd1018f5bb2f0df4080484f106b6679cd10b381d274cca300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cbfdc60ccf51219ae8c3916ae9a4fce33da1e93f06d0a0f70ac8cd9d0e80d795887041b12d0b743d5c5e0bf562900a29541fcb90ce63c730941940dd334b6ea9ed95a2e107511c13d7fada96d3037d6dd3d07dd99a3947c5ccc22762b9421cd20bf5562c6761585e07e3ee55dc1b3cf38fbf0fd6ba91f6c28d504266401a93d5021e5b4445b4f1e891714a083aadd49d2416fddfe4f2a3b6e38993e3b6e17e018f02197edf3d0f314a41780f54986cc2a6e7c711f78c4b11a6d11906d7a9e008d5430a04f194ba303ae052229339ab8dd212e6cb8ef103cfccc7dc14ca6b443635f3fe92b81bbb1164de8441c1a6f28b0138eeb5292fcb76f31e1f975af64a412cc6e5021b26af02240cf1859bf60197d6d41952fd762121fc00ee8c7816631c542c094002183432288114d4d37c56683b54c4a02d5964a11707c69c96cb2f728b6682ea9c0309de07ab2506b149088f128f0255ca22f325898e88dcbd210b2421428263169c022b1003d80e13fc406430e95700707692b235edd65756e932965807793c8395a2030e27d0f074a772ca4a0e1ed423ceaf39ae5ab19a2a7226965fbb9340f04f56e14ba82f05390d8718cf54fa0acfa8aff6d2ff2e22a699fe115a10f4d700a540e2c660b51537d99da394899a8dd4ac6a22c7d3804f8dfec15561840ca123c7fb27e3d80e35ba27afe198bf4dfffb4aa35e5bb892bfc0ebd410477aabce26459f3760489aabe0b82e02aa4651b63690387dd6430461fb214ea5de49f0bb731dda617ab67d4806a115b89a11b7f76cd2bee577074d6dcca41ccee303a681d706fbf2107331f2d84c42c22740a78835aa3fa6cb1cd5466638604756259aacaa25b7e513328937c3985befd11448d29455231d84e423c314da86de10015b4fe499b40f3cd7356e2a7c4fc0f2552e95f8ca18122410d3b616e2d3b47f73d71b0af79b54b95a9d40c7679bda9eb9e16878485023985fad726eb58ab684bb9d670eb3aed3426058d5197e49cf8ab6bf4f1c1359e2c27bed36edfebc4caf268afbab68904f6b6fa4ee196dc45f4db6dfff9f103d26b885b474c0fe77e81c8463efa1dca6db4110224b10034d50b826be552a3202d2302057cd184140254ac77195acc02eef54ecbcae219c905e32a0fef4f7ec00736efb7ae298d7e56a0f9ecd4ab616a58de5f279b61b0c289631068286b2066109c5c6a23e3884265280611dd1f8eb3bb0a6cf78b0508b5f743ab91e0e3544aabed790d50fb775c56a10d9e6f6e9d040c5dbcbaadb4bd45ae313727b44b8fd0ecd1ddd0636aad0608750e12030df385b125f619f0b84cfe3117a3a192ad57b3a0cc1176f4baed096f41ea7dcbd7d0387604808e7444d333f90dbdfa1c531dafdad580fece9d0f94fa3007d8daeb64f016fa627e577eae4f75f42ea60b39b607d799de67980e0f74dbfe04e1bfc0ff7c3e481eaf161d742629fcc5473d60f572b7d612fdff62b366828e0ef45911d76736972e44537476d258ff26248ecffa5d449f0fe133ea14b0c3a3780dfebe457c3150a74d462499e4976eba352e87c773b8644ef73736e6f238e0ec1fde61e6376ef1e9f81388ef7e5401a2ef193d824db7c02437ee3f03ee3fd7a7c9a20b7c6366d61eb15b8a4418a9f0db60021a51bab4ebbded97b90785e8e9c83d86412999bf4de38cb2512cdce6c80b9e981d4b05e389f7e45a8bb914311aa0b36395e7b7671d94e636dec3361c7be5c621981e32ce0db4bd47a3178d7bf6cddcbff3b759b127ceb70d677b085d426e28690478f46e64b58a893fea20c5c689dc70d30e6f75aaabfd3bdb4bb2a11a0861e8c8123b72c5c829cbabe01b738d9dfb99773d91d4b0dc38010e08b68ee7155a832c169e325ffe436862007acf96ff501bb7860a505dc86fd011da13d9c065f024e4cce42cadf6fe624d3100c1abe151db37b05000d77c6b8108cf991847c84d8bbded4eb29507be910f7edeaa1b05dbeefad66fce82a53eeadce009d61e61ab291ca5d0a0454e0a30a74abccae25f85441eb4fe7efd3d78f0a9fd1bbfb3700cc0ee665e1e669e0a56797c9c9e1fa6bfcfb0c8b4f09024767d9b6ad457f5c5edb15ae1427e0603370ce7b1958d7e9ad992763d10aec3238533432c80b34e43ddf45c5615ab596f066e5256dc5c58468633fa94e9d66f08e6bdb82aa0f2fcd35e24dbb7d4788b6c5e00c4c44707e848663295ad43c815795e82afbf8c80f87939a13d4cf601ad78ac0d30e08a452861ebf7ca8e02ef71c7243eb71d3babb2ecb59d922a802137d59188b648a8d00aa945b000c592211a93b9cf370f5a46a83fbe3a0c00aaaedbc29edc5464c695480cac35097a3aa6660d07d4ad0931a1e73556a29d0544e9cd04c571ee0e526ac20ff8d0227d07cd5898506e559b43d7268e5c7ba96ece9a6c10e", "635353526565", 1, 85120961, 0, "e9b6936ba60cbc72b9605ae284861c9c883fbd069f2a03304e1c95f7636d4d51"], + ["c5b8780d01100b06eb59e62b8bcb8bec2b85b37ecc9881597b0a0a8f2ae6e37304ed9181bc0200000000ffffffff03fbbfa4000000000005526300ac00eb131a0300000000040052ac65d6089c04000000000900636a525200655100b58322cc0200000000000000003c869f01000000007b4ed7f2cd63cc0b608dae91c1ec74786fce7e0f0c810409cfc62ac93301325299fd2d1128f30ff31e498357bcc1f16b6e76453c403b852affaa65514df78fa62991e84956b05928a95600719abda5aaf31bd0ba777bb7f84ad4f833b0352f4a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e79f4cea3bc83e4e8f062fe93475517441d5b4efb2dcb7262fccf5e0d54d3c75f59bb2508feaa0faaffec10065a04d89bc37806a3ae2d7a3d68a5e55d9cd9d86699cfa35ca2545b9e8d0f70710599b774ad016739ab3797459e6a2828889eccce1f7566c02589fe599e858c5f799b47e02cadf92824e657a08783cf255ef36a10203f86d80ca2d20a113d4c3202efc5026d9a26436ea2a814a6a30b8710bc8c2c103303d85ad8044490b8c3e7e9eccce149d14ceb03119cbd1f465c8e5603615b1090b09205bbab8abe5a85a72b1481be709ca2a47f6d63b2b4d62330f14d699a2015d3c3e35ba2fb7629ae61c89c835a7bda5133602474cf2fd4a2325b0957903cd400316fc858b2f6e586351a2b8c5742b912d115b1e5af28cba7f66d2a023bc4f918d020a844d650258ffe606b285bc23e050d3ea020b078a059ab7816ca965c76b5db802204a451a755825cb342d3da85636d8f3f662a1e3983b6d7d2ad49319680aeb9f031046b301b8ef5982c2bbe8d0c6cec09f49eafc8bdd8ad00cec6727b3e90f29ed030ce65a4774297981b19eacbd2df1f04066949f042597730504e4179a272d5efe58468fb82c2fb8768145d9161ee46b183e9124d769daf17aef762f05c9586ec98f6cc0c0be1c2e51ee16032675847a10503eb8eb52bb165b05678e8e3026c1ef67618aa7eb62ce235d4423d1b8bb7c2e21b114c27eff5ff93826f032d21cd83536aa8ec3adb9cd74ca4799a7622f34167dc8b29449ac13fc863c8f6e650f08593afaea49a162c9babc660e586a6d32668804d9d45808cef033258b3c47f20207f4b36cdae0d5490c10e087f45585f4cd6981eae5f2fd10dd390b718390d8a39adeb5ef4928aabd5c41b639d58d55f6faabb734d774774763a6cc870fa102f0afdd4b1d9482d344c944c4c0d35c269a70c2b377d3acb24e1f6ee47802e66a936fa83432f54fc8bb0abe969ce0e828342fcdfcb2dae1ac2483efacba1ed40e4c2574f1758439b4e9b51ab00c642dc27ee277df58019666cfeac03939ca40d14c42d98bca286b1e5810225b6e351b0affa85a2a5bace11c7fc960aef70e4019ff60698f5608585a459c45b539c3bdaf90b27a7039758d9b639559dd08e8078f8d7e298709d2b3debdb878f75ab2dec17f33f59e239840c5de96636a2123d13188db2a49804bd1387e867ae74545c19231f988f2652a7a4441e89499ecc5085ba9657e518c56b8601d726a0b598cc7ed0ca9e297127c56b5f9565ad66525a7c5f9e9635abfa18f4b5105ce9dca2f93ff9f6840665c4b1def7242444ff31f6ffe2f3ae261c24d53d188788dcaaee89b9f6f9d71464e7d2394494e8316a7edf8c8a25097ad04186a012ab7d266f60047cd10a0c655642e0e4f9edbce9fd35cc2f85450487be97219c46787a039874e13f587753d2eb78ca81ed1c4061cdcbaae5709ae8605ac9641e3fab4352559e75ec104847f7e24a8ba3be6853b26c7b7f7955ff5475193b49671ea8a18cdd112bcf4cdb22cb96df577e6faa1eeb9d574daa345dd3e32a96b913cf34458ecaf3c14fb94ecb4a0457e6e581512f05683b1b8a70d0966a859343bccf3ea7551c26b72f5394ebc7aca8815f3fea96d86295d4fad6a46409aa4961edc74536f75d0e088028daaa3fb60ccf803197e7932eddd4f71e54d7bc3d03f6dbf4d7d9717dcca72e1ab7acc340823bde742dae5a1ff4fa47abd01a1ec389323ea0bbf3471c9819c1f06b8e188ee863b87923e0c9c7f8eb3e2f9bd5e8ebcebed49c991e09f849613c404e2b2930ae5bd384fdaba4bd57019a5d5051f9a2a9e31e353a12bb806e2872fb33aca81d91b08c8078c0967f36c5a729c697395559e021393677fdaa37a04c0d0b535da12b7ac4fb21c13cf76ec00f00c724f79ffc6f0011fd54846061fd27c64adf6b7e96e86c0566749a969d871e4597379858908b95977f4c07d7d113a9073203eb488a50d182957ddf6e2e13ae11c6f68427dcd499941aee3b8f258ef4bdc9c18ee897173e4dee46a855d1ccc1b0802cca4406df1696651a29268658065cf0af315823eab89010179e13415e57e26d1b244da7b684fd3fa4e9896698aeb77442e2eb2d8358fa7c300b3173bae52db674d6f84de72124b99d1dbf57bdae98a43283a4e6e9808d1064a21f690ae1fc670effde6551e35821e582e40ff67e697a67104ba23527771a9c3d3592a7f9ab2496d733596f9f865a47d7f12daa92a439965aab7299643b6c04534c6a86d87894864ef1be702e5e0186deb4522e99d7636d2303732f3030000000000000000000000005c2f5cd4f35631ad562b132f0aa2f5a32dd84b1c88bf8b10b74f4e682d04e54a35e78af8fda7fc662e8d5e447975ef02f4708d55baf3859ff134cf4025741df5a7bbe405b7b29bd8848e0c1df6eeccbddef2574d34fb189a0a0d10c59af0083600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ccaaf640e2a2cc796b376b484ddaba0511f75446e0b2fec46bb4d7cb6d63a519d3680564dd09209111991ec416119f89be3725841766d008ba70d23083b9494ba387023a8a768ca2d44cc19215f1c0c008b6d92d8b4d358c966a8fd58e5722bf189d0a23e6e24a53a2f5ecc9066884cc1ae3cc5ffaeb22987d276f50064d511a0324b77b0bc4d819add769a53eb2e2ac36c7077648c54bb413091c984313dbba2c032f17f434f1b5650459dc5bfff07d40463936a26380c0456f05ccf3175ef0e9d10a02c909e292d94e6bd5a830e49df55683d6649d385349c69c4333b6d45ebbeee308e266ff5d3c2c934ce2c24cb0ad29847e7bac401bce478bea2441a200972ba3030875a779db5aaa292d5e6b515e65b9958341d177f15158fde0fc290c7fff21b5022783b8e53d49275a4f5efcd3ccd210a709d2b10da554066e8f490ce9c55c81770221993c72230bc479ed74c2583b4b4c793b10379764543e509af29cf6d006eb1d0209be25172baab2aa11bb6d7892ac1e3de5fb34afb9a861bc0659e05846fd9ef902212921e5ae0599d574d9f17ad396f03c2985ccfed3006508a72c5774359a6c19d5f33a8ca496e22f5b6c55dbc46b45b5ab7bcb6db34d639f6cc729d8af398a73804781ba270689ab88275efafc0eb4cc1fd80f894e77cbbcf17ba37634e0e4a8982ebd868971bbaa40f454e24d9c282d060c46890dfe5e4f13ff3d475ff825bcb1cc2dbed29b56d5e74a80cc9843b632985dd34034f7c58b18995533bbc69c03e3b112bddd4fd330e9fef391c91cca6431628fb9c352f75f4dfb7ec08883840b8289127c0185025041d7374c84187ec60131b7d8c3fff5e71cd982834764f117c3dc9312aca67f369673169cae4370da01b24c3608c925bdbbae57f4e6995653f33995227f7ba4ba5cddcb0d7a36fd076284d8fad861915cfd183323c55cb7cd840904cb6cb8b80bb06ef6752ec5def16bdfef5b86b21b1f747f8d762b6f8212b0a24154111d848864be9b2f247ca3db894aeb467ed40219527aeb9c18310a3ebbf94fa342f1c2cbd6dc0cb3f1da6525f9222d340aad1cff2a01c7ada4d0362dd2bbef210a716813f082d105ef9192f9247a3705a2e3ecd5f0f86ea58a681c2310b38a9ba8aa2a9238f5f67ef02d9288facd00a87ae8f42ee456088d1af6c373c871461bcbcad6bd2ba9d733b5bc077e666cb85b900bd61548e33621b29b29611bcf080b78fd262af2802fa64c3af19b43c632489ee2e7658de6a8b69d7f9abb8d8770eb715774212daceb25492ca49c8f40e17d643312343e2586ca23d319bf6c9d45402ae0e70c93469b6dbbdbd53f0721d6cbd7851ead94fc30691d5be28f845eebf61b571b685e15b06bc41497bb964fa407b99bb5010d2ee1cfbd10fe64e131397da5151edf2ca737af701c6d8b3dd85968f97b12db6f5c02d1e862662293a650776cf430a5effe5aa2b4ad52925b6409b8b7f5ab544074fac8d4c74aadd2dc2bd5cc482573a4513b7dd2f494c4d647f802e41936a5753f2beb70520c89e9d275f50a577ea6dac2490c40d5d1f6bc0ad5975722949c3451d3b6e8fd10aad5479a8a9a1a9e26a9ddf90a342dd09614756638e07885b3032c68d4ee0a22eb4ec0718a3b9e068bd4bbe9a57103aefd77bd576c4b0b2792b93f38d3b9a6467c854c2bec52ada412a06d3fe9a141ff2ef9d7668e47a29ab17b6f434f4070c946a915bebd3d91454fc2b927d41bf255494cb97fad79a82f9e3a0afcf8f8307215ab9922855a81caff838d08498e0156036139fd0b60949c0847e308dec1182020f23b4999a137b17890e96da7031b8842d2ce49f00fed5759008aa479b854cb7508f7a9d593d876df3930d06d7f15fcfe7582b6b0f4711a98a3921262279e9a0d412fcaa6840915d3860ee08aaff69e40399b67281df192d1ac0383c99910a6f82f3ff563be943dfe8876935a59cef11a7917930a21334c1a2e870b3af7587cc40f7700946c0ac734859c4d7ba4780cff1dff34cd660cd31ecfbfdf09e2e4c33bdd6ea7d1b5617bd083073866339793e06a62bd628f7585ac0f37e5b6867b8676c90f6e9e2ef1cd23614b1e84fb7e1d6d2298a7774a2bce095c90a0e383a7f46ab4507b5a514401311addc74ce85a8cf44bf7c2240158d5864b8b52a5d8bfe3c6ddbd7bdbf04cf1b980d763adb715e934dc744750cedabe944d03a19a65c7ba8a4347b0cb48d2d89f1dbb6d3bb4d5fe6085318d808a017f93d731efffaf44ad36011d0e54290236541a08d926ee72a133619c3100d1f22109a345d34492a6f5f8625ae8cd8ab40b798ecbc543cd18e4d95663e7e6152404658271141e55fab829a782bb1409efd72edd849eab65b3128169e3c01dee1361ee1edb29218b9ac62321c808bbaa7febae21cd282c3904a563b202", "6a5152536a6352", 0, 913978334, 1537743641, "e200d69ecb15b8a382ae49cbc3980f3af60ee30539fc1602b472c52326a08ffa"], + ["030000807082c403036bfdca605f379c98b3b3d7868d09952e98600273e8719190dc1cf98e5878e02a030000000152ffffffff1d6cc945b9b005a2a1eaad5f9d2d3eb79671157418d313ce08e6dc9e9971d04f03000000090053536553535263631aa458ab042ddec367e3f465fe79f10b5565b456be50d6945eb547a0938102902c94cc6f0000000000ffffffff0348a0570500000000096351ac636353acac6574fad10200000000056351ac636a5d9d0f02000000000152e5c6593f000000000303f012010000000000000000000000008e6207d63856baaa5695dbae0f6c4361bda905e8c96211dd2baf8cab5b7d6b2aaec07f4c980f27c444c98c44964f0d5cc6591512dc0c356d9731ef116a39a36b975ef9684a471647182605b568d39482daf5729498c2eca79ac3a24f0ddd1789000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000db1c16e3a3fcddc9111dde5b78001a5689481a39d870ed44906c5a78da55b2161904e4c9b5e67bbc080221c06d4dfb639ba4c3b8d832d699061c268ed1563e146263fe2efe7fbfd45ccf78e3aa1b78185952330aa7478c8347dba80f54b46e1633b08748d6ef24574d1e50a7cfd1eb4448bae95e52c200c23419758c8b0c45f032bf620aeff23e1f1a21c8b2a7bc671b3672bdf7c7464ea6b0c9754d6489be59c020310c2d692f5d49348c3976b14ddac2f1c038bdb507e47d48a5889b2e89598a80b089909027aaa93c172e2766934a8796f97501a2e03ae1e6defc8b4e09b2138d4352503836d34cac374f0ef6361a04607a2f138198c5b856317c7926d026d8393021b05ce7cc77a8028c558c07c0fd2529f864578e595be294c9d9d6ae75d4176e50325af71f630ed02f6a21d3b092a172a156333ad5a38809df92e114f6da8575c7e03116e78629ca70e8b7a727c3d3e6c50cde9b14bd4ff3e2dbef8dfea05d00fc14d020d592c061b96fccf1ee4e04db03c1dd10dc6da539c9a7af3db08a36bab2297c802055ac62118e48218d2ee2283a056aee38c490080e14d65ab6837a21be9ab339d6a8588588c385c6afb939e0ff3c355f5ca55af6c774c88ccf6ddf8aefb33bd1392959559e677f1ccadcc1b1d704f7befb13ee59c9bf41ad7645dc22bcfb9f1aaf0085421312dfde8c1cf235895ad192100a40a470607860acaa9d11a43064c626af5ea2c9b77b81d9d7ae81545b62595c12fc1e561037defba00933c7310410476ba2bba9605c33b41b43a1718c7b779f2e48e6a44feb6bc41710cef70c1f518c77c3c9a46971059a559d6a67f4e43cc9181b8b4e1e03379198c96629574925bf741f335408b95b61a4b5a8424b6599dd64ef7a1d6323c77d85e2f4db4cf1af3960bf5284690aaccb0bdd0c004968376b267452e2644ac1209ade1254dc1a91525198498c5adf04d6c6ebca572eb397b5206f7a967bdf066a066cd8a413c788b07e5e106c8beee5c4f588e906ba3f0aa903ec1a3b2d4659ac262c19ea38b4b46d355965ed2038a18bd77d6475fbabf763e5d52c41077b3ecacda113735486d930c470130e7b0b643bf887eeca7b0ab575be410f1a625b86cc4b27867d2ada8491da82ebbef839ce54010d9939762f159d5de0c90d315faae5770ec328abaf175dbe25d5e21c5b87e5f5c1d905adef438ee42c0fa12a2118162107be71ce48e671bc215b9ec3eac0b031308c0eba6ffba8349161847ee47fb4f786e4a95721e77694406c8aaea8b025eb8c0e3f3754539358a085e0f4a803760a05a94f93e4c61e001fd1c060a332c3b1fe159691c6fdc4c34227fdd7ab10e23199e56d4c9431e945c397dda9d9bd2005ced04553035d0132dbae8eb8a5289bdae5ac2c0b337313e2a01af7d2c6df40a4ecad2ae670bf9cccce679b750b89f1958c9da3a581a98ca37eb315a5b386b3da0d4fc71a888c67e4497d454878f5015d17586959fb3fd516cafd0eb92f4dd9e2d456b42ae1a264b5c15c2722bfae9a8e3dfe4ac470db3fefabb1fb785dd99f44d63b03e4a6a2da85565926cedde091ecc232bb2dce2a3b1b58236655e4ec886c8310d656c237e6c9ffa9b030842dbbb8f0c2bdefcc8c7f957fcdad1d78bbc081662aca1124a5e3123ec096553744bab5912ef1b9db1f1e4f5dfcd8e70a339c878eb2ac4794042da5e34bb82ba2c8a09f3d2034ca9385cddfb1f99ff2d957d8f6c2be78ef0f7541579ef62ab7bd04dfaf0a5061bc01270a977bb0b8a068cfb4e825967248c007a217c2dd88067942c63bf46eb5e8755dd5600dc3e9c0b2c31e59c57a6c1c74ec60cc916a328444a8c37ea7b5c8015bbda675fa621f4992be173d05979919805a8b4d18866d19a5377fbcd68da2b4cfa6db033f9285636b990e379151457e77abb5342060088d0de5afdf3afb7c83cad4114de6c870e9954e7f011b59bc742b2d1392ab4027f005d424d21d67d8364054f2e920bf2d128aaae3c7c2809c2df1b3136c52fe737d63d89d773fcba24e5796c98d36bbdc9f1118f72488748ac70d4e5ac36b5a13cf97ccee49e67609275fe40aa14b8e02d9320d09bea24deec003ffaf08218f22ee78383c1776cf8c751bead0817aeda9de974f3fb88c5fa06b9202fb451de71a2d751a7482830b463e7a230c9567facb09cf1246bbb4c634691467ace089eca39bcde69951a90f355c359634f78cf2748c02758f08a3522a35897d6584050d96d8c618013b74ef954e3f1da542cc8d87e0523c98e3268b2e21a4200f06e00000000000000009e6ba9000000000003b7e3238a778d3d94b0ed9c72747752a5f38e9156d5c7774d72204a714028f6fa18ae1f1e39872d3fcf4b2b1c8d2110566dbc2d59ca144a07f743badfa6f4cb6096d4ec3c1bd5547f61105c77ce2812ec56cf8d111e973d4232e6647029d8d500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000adae829c0e19567b085a8e6ed35fbced5464a6ce0c70e25e7994bc9791d6ee5320b764ef6fba31feef928c88c0c945f87d0a0dff4bda8fc806d2ab48f4040ed2aacf1c4ad912601fe025b4f0760d04edb9459b6eaf7214fdff5288794996a6c3df5c9a6eae74c485d00cbf2635d435db435615d15499a76d10d3bec7a3c3cbce022971c9a26e2547f172373c86622b335448a67a028e5863ebee54533b01cf2c3b032c19070df6b278815132b5d6bd0ad676f62e9c442635beaf8b28b29de2d90e340b029f53d1fd8d2e7eacf20bcdf37229951b16fd5a283946493e8a49c33a8b877bc82f84e701d1d43108b4c8636afe00b0471516a1aaa493703464f1a2692aca93020e7284fda02399f52e8aadd6ec221fef8553a5346ff3311408183f3ded7ffac20214991fcd56d2896f48177e21b86b31d4ddeb800733d5ecf129fdf2fbd28a571b03205b3a6ebae180e1bd291a2ffd205c532faba67e1b498549f4b23c02b7dab11f021ccd008961a1456b58bc63eb4d40d4ab01912b44475557a70998213289b5c403032a0f2ed3c92f4948bfbdda804077f1c786ca0d6b756027a1b7143af5f0141d933dee89f819f50f77f33b4bbe74f5e8cd86f693f8b2f2f6facb6997b7c9365ce6bdabd3424d1995c66b65ee3bf05cc2c929b874b90d141197dff0d1afb76822cc9d574c2a9786b2f973e6a5552ff821e01606d367535f6f9213dde28014558de406f6f898b870ca7b6748be2ae2b26c7ac1c6d32b0b2726b43b2405cae9a636168dc79bd901aad927874fd870e461007697d1ca9c0187a04788f0695ae8029247934b2c8e67b67673930ec50d3ea1a2707bc41cf703ccfab5c18bfb8f9470c0329beb301fc0b78783d870a68fde6f452d165013a1c2d2c17dc96e59c6bb6d33fcc42a3f8f4eb3e7c1cb6d1e440623e52e6ebfef8b67e855d8cb8e5cb1ae7422300c027bc204426be7c19d2af477d7b29dc575ed98351077fc024f06b41d2d5af9afd10afe61ef42b2aae3ce9039de5cf000134f876aec261e3c85f4f71393a04b0645ed26b96c88b1d27f8d5a867c15a1e55826a249cd77702d2daac0315349ffed40021beceea3434c69b37c498ceed27e49af36c3c0a23b9c7870ca0e4dd30aaa4d91b63f788cac88e2b307b382e6c549a91f4ad9baeee2bebfb8e98f263b1cd42d1f0362a66126637f45ff0fff64e0dba7e4a0e007089a2d806637f266ca7d353a56e05c35cc0ab1ad8c371b506176e3d07718d685acc2058092996155774d81314d669b2e5028dbb3ccc0f062e106fdb5d7750931aac44bdb331a435f932dafd12fe6c956891f4df0c90cb630b8d1a9083c8784528a2ba64b9e4e37ef0973e38a2fd66c62a8216e4f2812971a06511653a055e7b9b5410596c8f1a79c84509bc9beda038d22f9c6739444a3256bb46e69553e43c4105f0bde64524e2bb4b625c106e33f4f4dfb2cbd25b7a7fe5406baf2b4742c3ed2f54a519c12799734f0051277a5ad0c553f78a325c6ebfef694f2e9ecb32e9acaf3c63a55857cde1f8e8f668408022b985b78bb72557012130b5cb1c756f9da9c3591c783fca21536b8546076b3685c5b81e27e318c75cf54e81826c613c6781a2294d8dd9695a1d290b87a4866be47b0d71180b834206fc92e1c1594201862b5d72318c2ec79ade4c934689c4bd6a7dda59e6bfe582f834706c447ec1612b8ed71202cfadced18a21c8db9a8e1830243848db2a9fe77ebe4b7e22e0327e73967c00debf085d4a245b120a774e8cd2c77e8924e7fd4870a0ef083de3d8a89bf69f0aaaae2c9d9fdb8f1290d43ac79aec63ee0622ccbd463f93f26f9faf55a12fe96c806243f66aa95c9e5ea418d1fa88ecde0f48a2c42bb2a19dacac0b6a588d0ef238c752f219c699b60d151b3344eed529495c0509b849e251194deaf052690a1229cb46f32ca4a4e868af257499ff891063182d6406e24660d654fe51bca33c4dbc57ee47776e8689b9733abdba0ba17123231bfba4432b7d809c93833e8c6ba689bfff85332645d8fec2fc044dd291c9ee3ec329f98c0aaae9e3ebd24407e248daf12bf02016d071de80ee8f20c533c08b6f65a8d855b570e47071077a074f02f4390270e688f061b0ac073721ffc45b45bee3832de7ca6818d87716c2f676761a7a10f4a442dc9db7b09f59555a8092e55454a84b3b2181a2fcb760496c9262824c0a8658f5034d188747c4ba2a10e2a80c95d01dcc63d318ad691234444e69b8be6a7c93cbaefa5e23bceefdc8c334b9af3147ed0705f882e0000000000000000056adc0100000000a4f94f262117c0a58b9e69e45c9c2fe89d1d8c9dbf616a288b3c4857edd2463929dd6039bfba6e3122e1cc3d09bfe0075fd8f3024554c0682a67bd4dbba6250972fa5e1c494d11772c73a4c8bbfe3ffb2c8c2627a9fb6c503b2847324e40a39c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e3501fc673d8164a62bd774e17375a37ba8189450df5074bb3a17329a73c030a5ae6316ba7b3dcd21a5dbc146f4b84a0cbc333e739620dd335dd805bd919bccf70ce0d0f79065f3f54c1140b2e4cd8cd845842b00553fd12c9bb5f2c78ce641671ad4e26eb54fb1a29fbd10976509d804d6b8a6d254bfd9b367964b62fe3071c031f575847452eaa2c2c6bcbf7d1c3678463bcc812ed07cbcbafc531a84c85094b031457e53439ce286c686082501d632f27e6d17fb1a5297a0b7ad41aa6760e108c0a04d7244872f8948e1e3545c2a343798eff601dce60d3e5b1da4419bed98d14998c9c0a1cb17d2d7767025d8b7e42c40e5ee1aafdf80029f78d96b2913ac0a7a8021e303a8798a89e6d81c21032b35a0285f6932225b07df45a6d933f99d45368e9031cb8850deeb7d79d6203a6f1f2fd4ccb865af56f02c623bfd6c93f14d5dde60a0320bac06eed25442a3215f701d9f61a84825e78584cf4b0939a770d8a2c44a8cc0218a24065ba177a706aefaa5cfe8a41144803fe00715688b822a5a8be1391d27e020f796b0274fd5709f2d1295f0ff3bc635545ae826c1da7d617a3cb48b0536c5fab614f04bd067bf83f3822ea3f828609bc5085c97fba23346664205844d1ea3e1c11c9341a41590f13be63e6912aa01c250e81aee868153e3da823017a7df1053d0f4a39c6509591ff41520a4d23e3180d1d719bf12feb82f7f0fc71a2d523b4fd4fd0bfb10d366bcaea1bf231b2615d373d45c2a1b4483701da5d8d808a43396e0e648fd0b7b555e1fb6de537c1ca1b3b422a03fc91a7bc951a5b81551a18a0c5cf6eac34ebf318ccfb0b6f95580b1d49b2cb52073ecaa69bf8274b2716fb06caaca8880783356c47d0705254540fe8c056509b3af8b1d0f38ec2246505d27b9452536fda3ececea3d39370527a82301ceba14f58aed1a2fc6723998c42cb15be78854902e1d66d055716239b6c4e3a195eaeb0e968446d1868db700b971d4227f5985a0fde00eda6f2ca07259e383c50b194193a3b25f41867208dc82fd3838b93a2816b77f5868212746323ce79e5f742a8aefac66528fda53c39ed723b393fc727a22fe3f14494c871a7587bda5a7419662316ebf2d8bd860fea27d6a08e676b75bcae043d2c724d338c3741a4563da6863e41a4cf7efd26c6e0558789da14bb630385c52ea24c51b0f324d6b00393e28d13446c0cae342ab4622a68ca78d116a442aa8ec19f7fdefb48e174b17709c16a1fa9e45992334caf41b32af446abb3c07338f729efa6da3887f1eae5ce96541a8368b60d3f8701b69a596f9f473eea86751c3dc9d680e7aaffa8d65f73abd086cb709ebc411cf9cff69e0127647812c4d2f8ea3d91d33af31e7074d3207803f7fd3323e9c2a9239e28b90171b868a67f5a9f5adcb9d698e813b0a3797f9153a66a8dcf58ff7690137d090f45a249d536839b83615f2971c3d96f9ced301e910bd36a361b25cde2cb41f72b29b9fa9f9a0b7f6e4901869d5368f91887703f2653c33ae4889988d6990fe1d26d89cbae061a6e6f7a401f920f12241138f9a1f68c22b9d56c84d0d80b603b458a777550ec909706c149c8aeecae37407d2d669056a7eb84698610bca99e2c7453dcfbcfc21b6b62a3d84c92abe6d925a38bf6a1672740d865fb61f12fa41971cb92edfb65b7be59c5a7fb0ced489d47de35a5f6e4222996e81f843b41088532a182c9da30521cc8e17a49c607cb247ed65f7bcde841e467a5ab23a4e4c3f2d88bfec7834ddfdfe9fe5378b2e92fff9f7d01db941388bc408d66de7653077c372777386b7f1c34248d85b2cef31f690ab20da2721edee79a6904fbcca3584c19a8ec220fffdbd727c69721cf060dcf3db15b7a6897f1de14f8ca4b587b12160485c12814b2ca5040000a0e443a1328b8d77e9a6538dc73f579894adf8cd68c0d2a1356072636543b7bd560a81d3853221aa266569df544c52f85fd220195c9e31012416d92b6c37db242275a0969929786a005c1ca408726fdc51d3bcbf77b7e8df25db287707d37ba642a03b873bc6b863c8cc62f1766e7ee3c8942a277d7179d2f34ee28ea3db18fd01039b8cbd2376a6f793a416b94d953fce269f3a7d1a9b776f2b6a6b30bf1f4f93cb71240d45193e2c102ee07e9e66992c5f5af655a640c66e6d5fc6ee155073d10df6e72bba0e750b6acba0299faf583d23d186f6a25738784a5b4900f45662d65835b27e43459c8047fabd0fa2df73f3f4a13d0718f863855b2d36197d6813553b19145ac08de3673171fbe20bb8bfac4eb67aaa973a69fb96f19638d69c02a36c52e75eee9263ce65c0ad187331ab5cbb99497ec1b50ba3ccf1fce26478718431650e2991798fdf2a52f4aac8a3091183b50ab93bf4a878338fc31cbe20a7973c05e3680e74fa3eb0b", "52ac63", 1, 222470011, 1537743641, "c44013de32b25538c5b13dcd9c709b2e94eed496eff316acb443e3cb2048d5dc"], + ["871bd52003475b2898b0e06e14e99413a524969f52e937576c21373a45f4ed48b6f4725a2f000000000151ffffffff03ce2495c55146d0498f47e78811e07bd0eabb596bb863fe2c42ae303d3d71d00200000009ac6a00636a656a6363ffffffff7f79ea8e241fc9b35c52d29ee3057f6c52b9759505cbc676938f8dc6518e249b0000000008526a525365ac53acffffffff03a5ca610100000000007ca5f90400000000046500656a0f1cc102000000000563ac6551630000000000", "006a", 2, -1509465465, 1537743641, "ffd27abf003397ad0fefe6b026674d7371e6515b3562042862013e96f457f6ff"], + ["3acf7e5702139b27627a81a4dd7af21097e37abd26b4034194832f4cddb236e4893bc8a80903000000056a51516351ffffffff885ad3a7b71d0e8479051bde6eaff1f11529b45311cfa68929e9d68d74384e2702000000070000ac655153acc80e2b4d018e74220000000000020053563b6a730100000000000000006c91eb00000000004240d56ee7f8ce8ae58038e14e61b2c038b78ce8c58ad965a5bde1b5fcab56b8ea7c835cbaa4d463e08ad2c6614c5f4e7eff3c5e41a5f04e02d7517e8b33588f3cffc2b85982eedd9fc5ac9e8dc3ef9f22ebbbac07106eaccd48d264e9317f7200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c5598cff8fe2fbea6cb5f7df2f11c331de3d1dbcdef9144b785b20f6e05d2c6ec7ab2ab7af31d674f7279908088ac3c6d3ad73cadc46ba7adc51f43ded507371b401204c89e9e7ed35911ed3e943db5893425b1c21f6ca8f7f8a4dd5eae7f00d19ebe1bdff37d779f2f5aac910eae627c4810e535191f0420ef93c5c6fd7d8b8032548d3738534ca1d5102d7eeb91e5739b4166e6cd57f2f444d42df14853322af0211173b7758f9af40c2f2a009ffcf40b44234afad8712a259c2f33303b809a6940a01ea9959f2ac54fe6170a441d2d119f6fda0089f591bc89bd144a894c22a34bf27a8121778b0273e0c9bbfcd32a140aed57ab0541cb07014cbb378ad47bba79e0206cd7a4b499d5c9564ec5ae04b16677dc2f2560f00bbdbad12f84ccde99bb12c020bba17f5f72432983b11b7581bc248da1b45ab96b4fa3d21cccbc9fa959785d60222408fe61f7cde68e3b59e47fa31f55fc4f5b55c8f6b7f02ac6fad1dd797b826022ca38ef7fd9ad8ef2221cd351034a266b0e68128911f9623638ee4911d6244d603135253899f40d8fa1cfbe6fd9b669c92a826e94f193acb47eed95d78d1773b0ed4ead19a96b45a97e2a7c78f7bdd64fb5457917fee2a92e48893e5fed6a45c285a306f858ea17cacd880ee0021400d4e4adc45f427b97da2f5e14da119758d2f6f020c03af229b574b2ec87825c3097b4d888ed8e78696c7bed206b4f49b16283cd00bb1ed4241a7dcb16e9c39380a192527218a57539b372b23b5fe0aa6cb2615c23f83d417c39b481e72e726f33c0c24617b3a71fa500d7c96fbc4e4ed10050628693ef23850cbf6d711df25585eaa5552b438085707e6d8f63f8441f3f8b2a16eb5aa08a7eff2bd479e8906156d88d7bbe1a0054c9b82c3e60cd9ca3dd5a74abca8f3f2cd84bd558c3dbc0910d9115d2a5920e4c7e2dd7eeffe9f52d01df161924e65909c0646d8079fa97f02cf7b334a07108b80cfd134ba901ec87fe8c6c1fa5946df8bf1d9f0338dba9e27b2d30f15a1234f0c7ea73c06e258dc2e65416897f2335e5f824eac115d1960c3f284675ca29b6bc961c26b8afabf27e08c97e65008480958da34614be0ace88a49eb0bafde9c33c1bcd88c09b59f344c1fb79967ccfcc8c7e931e87411a4557a352c8de314042827aa2d87aab57ca7b027fdffa491e1cc1a5b74ea137c476e120034ecd3f355d3d894e0c185c0462dfe7a7bbca781ae3cc463fb4a2dd69b7e108bca57ded975c3aadfa18931037485a4c6a45e051f8ee762baa1177c8313238a66faba76c4099a40054f79df70e708a6af7f53559569bdc11b504887e9c40fac32be8c8dd892a3106d3f584a44b753dcdb2763c7f7f9c2f94d398d3811218ff55ce2b57cd3bc4dcc8be6ba9bcf3931bc7f2f1c4451d1a44a8683add9076bff3229d1576ea33d85d5d73e5eca9fe9803e98644678a8448a6fda1369599a0c847d515fdce26ef4303804185c4792b6481cf8c9b4a653a4fd2d6a3b8a01d3887808cdf42324581a2385010585cbda3e16da6030ac026af34095c1861c4c214a00fa9c19275d6c227723cea5388317a156d477aab7a5b66de87da92acbe343655db9d1acde58490d394adcd687d69105419cce70ef8d65b0a39f9a01a1fdd6f1b948b29d6748d2f23c1ed57d3040dc69bf0d4c77273f8369652e0dd8e808748728f1aee0051d7f89162cc89af486e6ae14b707e74496a1ebdcbf71a7989d8ef79f89103ebc2b0e46bee2d99fa6c6aa8dddd27f1411c449289e6eedeaccd9a6caff376248ba7a405f03b4461d1aba12296c32cb978d54e78a152888d8d41204154072677cb879439a6cc3241811874cc1e6242db4f7b6600c2be63c6ac82088c8188469a24eed862830dc6008f6e690b88bb8a197e9d091e19d050db149ec68607f9836f6be904d22de9083399427fa15d00c3bc2a619bdcbffa8a2723afee9b1706a2453d986beab89b0f95cef2caf8018b3eb97a6782bf62564b13d94abce55dfbf515cce0b4078054bf2fce5d99009bb58361e89305d7e4870eebad04a6489b6e7bf4dcff74d73ff60f4835dc74357e1620ad5bcb0cdfca71211e4d4b3ebf47349362c337d0706b74934ca1c7050c0bde5e470508d45cd284d069c034fb8d38bc692176dbe82b9cd2f88a08529cbc803c5bcb75da9fe8eae9f97d4a570fe5200820cfbdf4e8d4e2a5e36440f43e04029ad25e95ab1a46dcf818667b4ce23a2a892a27ae37f418b16ffa88f2c1740f2a4343720e487c48ced7a0d912d32dfc90086ddec73ad371e0f14e895e721d3eb4ce2a7420ba536c83ae1d91daa8344bc2a89b89f96235a6564a6b7e5c337ee8bf30d289cffec1be4889d63d1c3d4490a1a1c513636eb1832a111969e789463b938c2eee7966bc927ca9f59199d6f852b7e47124bba09", "5153ac6a536363", 0, 2126830952, 0, "0551d80e9fa73be738e114d3cb30f1fe31bff90d1102f8f3b729e2b94f4a7153"], + ["030000807082c40304e6d8e76c0e2585e40a598f9414ac0abe59aaeae605ea3f16406cff38cbb3591e00000000025152d56066e03abcbacaf52d82a01ef923f6d14853518478b490c31b8c9cb6116bd7be4140020000000001658174979f54c6f5a2162781eb98a5383dd9af37537743723bb2544aeb426f811a7898996e02000000046a536363ffffffff5d15fb5d67788d65b77928a8daae3c88d0e099a12a138a840287109461b0933d01000000085200ac6a5251ac6a6b12b92d0191d34b0100000000080053ac51ac5152650000000000000000023d33ae04000000000000000000000000c2d29944242f723e014d8357871a520c751bcb04a9440ca79329331c5522d8fce2b0eb45c797db49d0a0d67181408605cc7faebbb073b37598a0dd8e8c72d867b66d4558298130290f45c7be512589c16fe2029ca0d946adad7393e0d94376f60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c9b545c39716362972ab73c3432ed0dceafd5de87af0793cb91397c13e60b26d02fe825427d184e55be7e426309d93a68ee412e4d95ed6cc59e418bd53db13c369815f6c1f4092f04f6338c0f7225fa7b581f2a64f609d97cec57353023571ea092b16ad8c7d224a9bf99b47ba0293b4a35a8f205bd44e8626e193b90962e00209acf2198b6211be7dd686b74e4346052bd80946bf75d5dd51c5a056cbc0b8c1031401f043f31dff40b16941f1438fca7bfba98bc2907b46344b708fe20b39ec6d0b06e842d5ea030bd06a99849c46623b25a3b76bacb92b636eea01ac76ea7fd5026ffa4608002bb6e267ddf239033902c947204ef030419039894984603eb3a913022988e67a64ca6e611e20a9c7fe30a4db4c735a094553fc980eddf9b60816e5bb0222193e496e4a22f0554b99b5f5d94638f9a70dbd5507e5cb6d2b262c29c3165a0305319a87cf71e88badee276889565d608ce9cf38b3e81d19dee6cf4fc1f18438020c0d60dbbec19ace63fa1d6a23d7af8d79c4bc66cd6a6a1506d65c59b54528f102212274fefe284e0e46551d6e345fcbfa2c74f8cdfbcd2134c8a49c0f3913cca4ee647521f272d119e9dbf0d267b0ab6dc5f15f25f6cb290923251bfb21f69c8e6113988d304a41e77dc9e0e7a8ef74f2a7cf758da065611409916a844c5bc4b9deeec0bbd6685cca599601bce8af2cbc95cd08a48a319719291afd4a18a7be4ad393e066ef234164c6fa53fa81f1d5011b585eeaa2a40605ee5a938d8d2bc465653beb6bb78be966b483058e0c1c44da58763ff3952e8537dac9e625257396e4578bed48913ed11178f638d8b27b42fe33fc5c47ab7326f82c6a12ad0d24c67bb999e3da17dc5d8bd65380c097d0784a1b855bbd9692f1b24ff0dafcda14cabfc8ecd6376d12b3e7a0f1a8972e5077c662c60ef1dc538a93073bef44f76f3614e801454e4483b880383b8542619049c63cd9e0e87f97cd3e556ca5f6c60da64e8fa8740b59cc5bd6e9570f157b8b7125121b0678685f1622b3b832e50e4729389a51e219bf36158ddd6eccb13860bb99277173efdd11298c92cb58771f5072f3d5e788f401fc4a789807402b132aca98bd1d2716d276c2d4cafb6c4c438075148e33b55f7d32fd79d4bf3d8db42790d1ccf602a08ed6e6eb79f54bdad8c1cf3eb3476cd9ee25ac626ab26f199e130285b3606e366b58be6069478acd99042f31c6da6e3501b21a4d5975107fa53cb6fa579437f81d3b619e1c51f5afe7444285629bc0bd3594c93be0fdd0780be58a366175e4838e02ccc9f1cd6c8ce5d75f929511ea0319cc3e4c14309c1ae054791b46bdb272f0fcefe74944a7127a9394e6104f275078d237f0815718d36ed1b77976659caa97168b29913057b76fdfa82478a08b6811a202ecce6c79c87478d918c85de535dd2519d1ce7102c159107f71fe0c9a4b97c70203e4d9779a45c84732ec5e5ebfdb01036cdcc4a1ab9648bee1b732e545352e7b877e93d206ec877ddd112ba38668574d5f81d89e672d0b5798be361d5d5cd614ea375c024f16b9f0befe4a3ef9b22357164f38ff5c9dc96abfe7cb0f87ddf6821735a123da744a989ec1b973c5cec03f3cf6fd9c32348671513540bfa1d82999b20ee6e642b7d22f93e5ac72bf7e6ebe5e982b5d3e79fd1049873f4fc6f4ad22950d3053afafa25119cdbba314d346e9f1024d54ff3ca53be102cbd5da89cf2ce31bbfc9c93aba76632c25aa9b9e91803723cca597a20622c40db6f59578284ed9754ee9d3ede644aa0b1a674820b1f5845a53c91c3de1f7b558f9cf8ae80d5e623556b5a87b5b5dd4d46035b575ac61ad6b0defd1c59cbb3c2725292b187447af70b668e2cfdde9f08d5259ffc739a5202400e0eb4389501ce84680b625170b1af8a209a3faaf6e5a66ef4fb8edefed137203d6ba8df4413c9817ef631768155811d3da84d71fd8be10496859fded200d4dfd16a8b1c25b4e6dc67a7b332461559cc7bd029f25e00f1b2fa0cb11d3251ba76efe547a5de317eaabb4747a9760f97ae4f2f2fe40f9bfcd4ba26349d5d1bcfb97e4fd46ae0a87c919c22bd0a0f0596527a17b228107f321b131c69022b6b0b5ca53b1e7b3c31e72907c1605400a79a6c956bf48a958344516c8f5dae4cfdddbd97d5d95cb3b08b3ca138cfca38b6ddf66a661bc739215494041f16e5a975efcd287e398766f3b5de8a3109f283ba9a45295ae777754f8ed9101ddc27d07cdcd6dfcd89539bd3397b868202b9b66f70b095251682b35a81b570000000000000000e8faa50200000000bd44e6229fe9084fc89e3ecd152fcaa9f503d912c9d5d528da354dcebf38f3a05ada924b778ffac5778d05e2378ca3bb923b831bc6fb5fc598f08d667e9cab23a47e11a64273a3cac6cf0f2a7b789a610fe9c0f9fb9dd1b10bd1142beddc9b08000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005a590577c822c8b09d001f7e5657cb21a538571abc99ce46d30eaf1bd8fbb3f7d4c7154b466241c3b9038ccb465f1dd15e77f59034dcd76a5dafdd0785a616dd235e1326869b72b57a836f4d33ed3b6e3918dc44e0b4fa759743ff81ca878fdd2c506e7ddf38c05c08537c0eed89625012359ae26ab89ce04b06022869c5c1b503294ed5a0592175ff055efe35402770125c65cef7c3d0f1370b70b39bf324acee032ecd35c66202bd264beb3d6f7ab023b042239ce2de14b88540f01ed40e51acda0a03fa6a0c373c53e25198e09bb91dee8e2c2654c34060014d77954f49495e290624b405e402e035f1fc71f6e501c93a2b174adb0b5eee61c7fc9d65549e9a4b32020ac9c9a84c3102738f3276812e1686f7feea4efa52182b877f9ea07f6f06c16b03084f77ae7a5a8d4aac7864bae163d13a6b660aa227111f870faab3c742cc986e031ba3414b736fa99b8989bdc14669e5b86a3042ee0268c836cf0da3812604adfe0316cd5d0a61186cd7bd4484fee6fc734d19ec9614aa3ece06ba448d13e5d3a016030e2da402f262d608ec2b75f70f549bd3b11e0613bd532106e7a491e94877292c5dcf00ef6b07ac3cdaf0820aa8541a968efcc8549bbdb2051916c05ffc68ab4291fb8ebd688d4d3fd14eea7ef894c2499ea5dbd844c048197c696996b0b387825816bda6542f9701a4c29ab43de2a9f19f1f068618686ca37f4fba9b160889750f1a861638c1e0c178b8f43129c6a1e18a15d06398c427abed838a9494af4547dbaeb0d81b9274e320dcd0a4373b8b29c0468eb34c24bb45ff85a3b41dbed51090f0aa75998ffb69ec9b7a1518b95b8d89264bb218375d621a182b5868c041fb1edc090c361a17c04e836b7314425fc6d2197fc0384cefe741a4875467eda1249be8f0cdb73671ac9f0a352d020c7eead1783bf8ffaaef20f970e99c50c0faa7d321ac9b82b0773cdd6d65d9d49bd4c4305061fcb1b5cfab822653d517cc6bb6957effa4c12e43dcd979fae34e568bbca4d852765aa7be7cd29ac516d14baf36a7579637f258a66c536e757d7cda64b27c7da752a4d69d6a4ab159480fd352e5a4d48495b7c46f211f7df3b9d196a325f6395ab73e35fd3786d2a32d9366fd4f55409f2c598e3998fb370cbc0f08f0594638130daeab26faa462b24e6509b60fe78b709d734fc1f71dfc55ad79d67e8d97e94b5a20bc28eb1f694dca0c2b1012c8438fd8dae5465cd7f4127f5c6fc8fe54a19144cbed0db2fb0b46739be9c92c0b6836bc5af32daf9b2c625a7ea8f71135341240768965e10a817dc5ce5297b4310b7479de5d592817ebd69f4472f80a49e9eee8562455a1dc74246d89fb1f44db29122386e850b2bc4285ca114e54a950d5be6d317d5fe743a48697946e707a66038ac4530b0e38a3312bcceb66571fc9c0895cf27414b234b8b26f5475ef9438ab8da915aa6271f593f9a093e48aea721ef1b42bb58d49f7a67ee1b57fc1f3311be2a5fa611e94e379dc4707ce4d8bd2e3685a2b149937c5ef665da8a5deff074e4aeb54e460d82eeae478f262392fb4e7a8f1851e18e7433c2df63bcf31341a6782c8a825cd0db6d376e8c92b5e634baa5dca893d174f2cba57df2ec30ed5c76c64a208fdc2d0cc7410fb9d3fadae8034757bfd132df136e2d62430be777f27ab1d092f6d7fb1c3f50ad7bec7889e81e7c2869a69a74f31e486de1e912712bb6ec3e3c8426bbe6c8bee69aabdb68021421ed7b4c56223aea098acb38154670954b31801c9a1d992a64176397d740c43b8defe6dec728b02583c80ecea42690a6a6932f1909bdd0a291a1e10190f1c0a9b7872ece51b8e94d1bde5313a06bfacd547fc0f1d288348bcab84f9f3b8fb4f7b9c8d14c7121ff6d6a6c8f22f821ef7e0e381d489c29406595b837655c5ac3ff5a5ba9d0a943fab300bd15968de6fed754f8062498a46e0fd7e986fe7ceccc7537608d5f26469e61d592e35a6ad4a9a89059a063cb42161d250c8d398708c41f44d17a5dd5aff43fcd081826d02bfb70257c0db18a6744fca97ac7c82ac495ccfaa84bafe9abde68787d01aadcbf410a00635012956677a00854a8112c6ea0d1a1545d1ca8d261d2492814d614970e8ad834266e8deac5a98c3f265a6fb975ea8b4f64211623e37c52520aa09ba7de295d4170f9b5eb46e40ffeb7cc2e9c202f74f05f8a86c4e9728c3eb402a638c1082d76c5731d3fa4a4983ac1cc86f8a55db78e2e493f82f29b19805a6f988b19dfcd45a6299a157aa707a4412b06fafb2e2472d2ea15b1a50ab373a97efb8b61180580151d5a478f01a2336a5bedc7140ae7925d8eb8e06c8b39d335166fb875c9e93ade90941c1bc2dca0b549204ed0725bb112447087cbd9a078035cbc2b3c0bbac8849a9d124e104cf4002da0f97750f", "53ac", 3, 1934892816, 0, "fcaff46315594d56e1f9e5318c13fa673fca840bfe90cffb6c46b349cb21ff8d"], + ["ce17102a02de29ddf0bc2410581e14af3acec7319b11174d0e23f70f945c9cb3446bbbf0a10300000000ffffffff424ab9038c53f9c72087db0c31b85b2d484129a1a5790ef1fc9c9f1f63677d24020000000100ffffffff01fad61003000000000653630063ac008e3d596000", "6a656a6563526a656a", 0, -1623204704, 1537743641, "ff97d1901baca975ae53353a8e88f1daea7b79d19e45ef65d66f0cb5d889b4b8"], + ["ce14b51601ad3c417456580064137e4f796fd8add0a1cc7c29afa8a7688a6b51dfbe59f65c03000000026563368b8c2a0141d14301000000000865525300536aac6300000000021b5882020000000000000000000000007a214634368b7b11e1655da6d86234ccf8f0177790ebe93b0a895008da5e6d49916fc9ed164b7de539831559b8bd794836a9774b10e397d6c6217a2b1a6cbf4e6d5c3db95c8cc230461d064523964c95876bb743be8c8a784320e8a847dcd86400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4f98db438004386452f236b8e1b908fd6389c47b441ed3095dff6d3ec61d8e57797e39a6b190bafb0cea1359deb47e39ed2dafb95451a798449b2ff4529a0d9ca0c7f4038e8218ab4bd035304000f0d8cca1176535de1da16d67c13c785182ff8d50915e389e546c4c9787f27b816855562ef39c503cc4c63a9c8181b54c5e8021d4b0873b0418da4d3e625c235ffa8a0bf2782dc287447d5c5b183e5911330f502207be6e9847b696b203788da5479a68719859849b562a57fdfd0d6a3db68008e0a00feefee14d44ef347ec78c97ba50be8a4593b63c6758aebbbe3af60b03f65c42570f80f1da88622b526cec03c910b734259f95fdef6a0d1046d88841fee390703088565ce869262507c9bba0b86dacac7b8fcbd2bdc99dc091cdd1b14e43e8edb020f8957ab76b7a7ed256f296486f65cff423d6f010eb15b9fe9bc697c68d11fe002006393c33d7f5441bec4b9be1ca677825bafb53020d804b199e8aac22b9dd5ed02238ac7d6b8d1e5a0df3c055e0f5727d56fd95e893873dc067731e7a8f3e989a80228bfabd1a2e02e5c4109f75049e830c88604cc6e32d03f91b1de72f125bb5ee976212c9997227d13dc164ce41e6d202d36f50a89c0ebb356df30b389c04ac8b7d496c6e3add01f00bb6cd72c353cbf2818bc3e2cedd9ca6741997c72a08c9393ff35379c21d738e2e8f38b7220b69ab5571e9c5134beb5bbf751ac36c6d1c9994ebca1aecb55c2a4e620e7c25400dd7ddd903f0816b61c46806b8878bb57fbec8e4fb25a0dd03f344c2803f3c8228b76f01a304961ecc05cc455821e53dedb9121b8ae784cc00f5a74986537356e23fe79419d09cdc98fe1ad6ba802a9989c937e61a20afba7e50eeb0cedad25fea3e81c420cf58cf613251698be75d76fabcf363533205bd031615bd8cca511dc89ec88345240cbbea9e6d890a0b1151c5d9132514801a70716be6dac840fb780d745abe087c579fd047d53137e330c357e3ff84025e7e766aab4383017631811e206fc051cf57b8185f05cd3b9f02f1d37e1010b9ac3865b8b887155c4934c19d825cd4a398286a8ba6b93725d5dbbaa941e88022477ae89c1aa78bcdea5b695376377bb8373945b4970efe07d6b2665a9216a5874f72c8f91d8ed8bf5bac0823a4b9af0b03ea0af8c0e2bb886910ed45f9a82ef16446915c25e7e96ca30bc2741333f580cf84d02c94031756375099862c4d39938f0a563a25c07d46b50656e82e5f98fc81fbcbfe77407b8c8bb17d060b3604a79a4abf0ff18633ec7caf2d7897421eb936826c061b1095291fd253cee2518c5def3575e00ccac0c372e65a95aa11c2374de9003ba8c52d13883bd9efb0aaa2e2cc0b220af6203d4bf212e40f7bf1f34d90e6b85c2ad445a5dbcc48a0714f693c4ce624d34363ce763198f376caf6bde31445c4ac5b4ee9774d5c527a96a5af72520813c38bcd945c37e3ce355091db333bb0d5a325fb34cf86a2512e12bbee8502f9070538fca520b1642c802a1f59e6e5c60a1537abb68b2adc2e81278a9b51714496befe828324a87fda3fdd1fdf52732c3057b9ab085ee9edffb05d53b6106f6a06336d6dffadcaf34248e83c063177163eb40f2dca3d74ae0fd3a9b0d49ead312628244d4e033d07fa2ecdab4f1fb3d7123305eaee8f38e36a93da8a3d4ac7b1f3d2579fd69e4e018d8337516078b16af4f26c8a474be1332cd52a8caaa61bd6e1dcc3ef201207936464547e92234b9e74a0d70380c8cd53e50490830f66a5b9054819fe78631936b5755015fadc6e82c66400aae23c9ce1bf34193f4f564c81ac6a67cf9b1d2e51595109b90ba04fc263b5eefe764032e995557f69b346d514bdef49743f6efada303613946b38120150d3baa394bdc8d7c26602b1652e3d6e7905327f06eb763cc65ffe16bc856e42e40f34dc48c45a3ccc49e3ba451d3909f5fa526b2860ee3b68ac576831fe765b7d076c5aa049545d10efb9a75f74feb04d4afeee457170e0bd5a821c48f5c5389f0d13d23b6282f70416afdfe4a1a87b642ff56b200ef915a75af32625c5be6ff35487d9452a5a8f06a8ba0888756562760ad7147de531cec52b7ec457f7a5eb337544030e1e983c34829d8fb1487d2cb08faf8f753326bf98da50881f4fd9cf551f9becf06e8f31699be2003fe81fda45be0ec223ffc8ff84a58183d961737ddd6ab01fdc286a5b02b4c75457385d31a9dccb4a98462ea42050634709bd03b189ce618b9f3e98cc41d458fd3c9eb7162e48242fecd56caceb5590384cbb66932050000000000000000000000002fa944fd7ee5356b96b42988f11991781f11f3902d4e427dc2679378ed88e2d3ab3fd98086306d3218a0c256013fd1a5e960a66d1425009f928ecd0a6ffad77e2241cd430a89fd26838dc7445032ade49c817dab9e639677a06b94950a5050980000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093240651fa0ad859ddf5630f85a11ca8ec2f087142810c8dc35e61496678fb3d343c7cd68409ab6662afe349c5c10520a74fc3ca8d4dcc17f1c71d7d61ebf1360212bb88a43678dfeb630ade409641428d6b23762d55dbd744a44b2d6403285af1536fe0a06af13bbcb9836bc2e2072cabd7fc2d2a2393a22f02bc5e772fb642020133df175e6e6aa53c91cd064ed3ac030586ab50757a3de35b0bfab3532c1181022b6509dc7fe45e8369f79a8fd499ffe393e5e2c8ea23249c2e8bc9c57314d02b0a045d6ee03892144af98afbb4d82f78b97ba9553c496dc90e0c95a47e77941a0c0df4c3fe858eb58da64c21791318773d252116ce13e72ed5db6a696dfb8b2cbf02048c6c8d86ae9f5b16b255a8d4e888bb982dfd58d4430809874937300de193d3022fbcd8885d9d7153a3e1f93fb33adc726140a8d01b4b432bfdc699d81074a114021cdf2c73368c531f7e56c048e500f5ffbd3c6f114b28b426568e56146c69e3a303202028a2399b43efc8674548bc9715d151d4e1787a236a13945e8a98ef57a3660206b200837f3afe927fa902ccadd62f7c900ac3d5a1752bf2989e143d7e56e4b67d23392f6736fbfb11d6535ca36348a9a76e173b5676603fca7dd3dea0dec4c1cd520fa5208f702ccd6d66e8570054b3b6c070f9272f4e879bb81c8b8252339843738cc9ca847ab8c1640aaf74707499a5154cfa718523de3cf364e64be16a342ba2945b5e385543bf8c6b78d9434d4c0b1354dfac43d899bc9041a89f78b011499f0cb7b0ab1ccb31333ff99c48cc9fdb6b692e58f1ce51cc6d903e5229daf2faaee49fbdeee17c0786a5693206921427569cb70cb892bae19b9f10aa89ccee9c21035fc07c503111a7b8bda52ceaf8ae05b38475f09246b00ab0ebb2abd791c2bb13d1858bd59648d6c43cff716f6fd758b51da41a11821b0b609f58bef2417c2c5cd834ade37003dfe6f32802206581392b6f20382a8a1f7b4c8d491c21ffcf53aa3c12e9031a3b792f8414b3f0149976b8075ee3da3168e1ee0d3f79ea94f602ae15854d5a6467c4570fad5da7c56b34c8f8c1b82f462b19bb26d9efddb5f0a0c8b749a263730eb0aff1519c499dc5edb6efea4e7371ac2ba893b994b159ce70d22fc101dd565224ab6cc4977a6e86ed8ade474b20311619e4ba199e808b469bbecc968286ba2c16583114d7edb43a94293cac86d530c10aa06234167371a9a45ebeffc69fe02c1f86299a0a2106f742ab2fe8a82f2015aeecbfad669b84a55432f3be944d90c492105dfe63291b4e0750692e745ba20d9c58838f45e3329d19d210b3bc16153287db8bf618c22385e4c9e9dcbd72b19f1a68f7283aeb7c10493020ddf246f00a16b5e4003e3e63669a8db991a515f385010295149f547b8c227910166c0693c67eed3b20500cc805ab557aefeeee6586726186ab97e03a69b79b2e3b0d45aa6da0f4f5ecf59d014a750a9b9a60f5280e998b91b196115b0c683bf3dfa31504c7c4332bb972b4d8b89eecce7cf45b2392bd6757d5f6d4db97f9ccb12e72299d86b5fff16cdfb3a87ffd560c35362cb02a3d24f24a7d057c7bf936c02c476c8f70f2b05793ef68792e4d00107543e9c9ad0e622dbe233c5dcf8101e9f25b6958f3ae467481e261b6f514851f14ce0169eea288378419aca9972e8e05bdb5d8c4166dd58de0b52ad1d6c9f6dab76d9109c7de0d5f9e5e16417d26e27dfd61de686c552e01d96d5baa19e38d09d901ff57427b92eaa9f7cd9ad6bedd9db478720cd5c1d61146a43668a1d61b0318c66dcc90440919e1a6e6785975be4f35a4ed314bf3fd41f893f64c3065fe292e7a6a776f22aa4320ae1f81d9edf0a099688d1e36837a521e10bb7ef2ff878e2cfd3bb1366e1f8ce5132adfa4728fa5259d02f63e59c43a5d2edccdc43e7f8e47d5ae0578161c1613945304cefcfd670b1cf1fad7092eb07df6532e3eb395ce5a754d32579b3eaf13af5d3799cc28e1e7adf358080b84e382f2701d11ba61c1b4870ef701588c8b83e10c125fe9d85e5be03b85657d3dffcceb8d0e2ab2d0cf9fc9a096b8cedc109eb32c6e1fbfb0c0534914e28b9f9a25bc24866168ada68d78ad0eabc99e64dff2a823321fd2c828a7ad5babe155e15e90974a81335ccd973166b9f5444f455354dea6b8a347d663fca79dc6f2c6d6b0d2922b0bea35ac79f7e0a876a0fbae01f50656e66dcaf1b2eef523792a83c810651b5eeb762f04fa7b9a8452fbc04f3369f60523e56267c4875f540ca31b54c4afbef4adcf2bf94e90a27921bc3e9903c5fd4267526721737671ea2ae01a1e2fc6af4a4a63a3ba6fdf986e065afe73205a9b8f7e6506ad895a96ee79b5395e8f3b5c6271c5cd5a20ce48f43d154951ac2b7e457608b547e353ae196e51e8f61a704a99914209", "6a6a", 0, -182655138, 0, "599768128714cec7a11499bd4ac1b7942be7793f6db6e1ad1b9f74037a176c40"], + ["030000807082c40304227db609616bf9b8850fc8cf70ac08ad2009bf283d1154636c054e95d58c61e50300000003656351288ad83e49b5aae83754a96810f2bf15940f487b3dc6cef5a0ac414c85b9462d525ae3610300000000ffffffffacbac0bcc5283269e083bca5deaf06c38ae03868c52daa21bec5b1d6f0d11a24010000000200511855ef1fdb3ee4487d9a56e6c857e31ad641f220f2fe163756f1ce1bf780c9d6b18f9b8801000000096353005351526a00acffffffff01333583030000000003655365f3944fbc193898da03b7fdba02000000000000000000000000c36db113d58a11440b3f8b159ab4b4a737dc59f49e744335ed06245115a5e5d60fc32cbe416fbd4d29643dec16a7f65e853872c8e0088a71223a7cc81a44dde955cded3a06d29015afd04138a7b9bb053569490a95975a64b36375fdbb968834000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000efacfb1869b3cb65e559a1f5210f1018dde6d19ceba5e34d7bcb27f56e890b668d878cb2f888b8ddf859833fdbc958f55e4c6501ad4ef22c56289d85b05911a4d9c4f8d30e8196a5057a73204089c5c864fb7d5cd168fe60adb1f42b0ac30d37ef81b3390d1f10043045e9cfe9256f4eb65283db616976a2ebb6a29e598a8040217c0bb59fadabbe3e529edf9302676c34978f45b642e0f32fe452e3a61f67a580207265eec1d7a20ad1e90bac3bfc9486d03107f24c7f9871b2491533c52ddc5be0b07473b0991548b2a215d64c80e2223336dae7b60f2b1e13e2165111857e4468f02e685a2aeffe153eff68a1439960dbbd7ca22a54cc5797483e4a486dc1ad78f031f7e5d52199a110770113d08f306f5e7ada068dc5f3f1ba8a95cfad4f4937a58021a78285cb9abf40e346a44bd754435891b6055b20f0b909f6d378bace85faa3702152a9ba4971e8c5bc55a1848d476ffeced3102a9d389709d320870cf9a349fcc032d3b269cf28bbb698f8b8b9b060d2739c48611e9f7aa1cfd84d122834bebe95f021dd142691ebc6c60365a0aebd8a73ac68bf48895bce42619a874c6bc52fa265e30339b9707222ab24509b20a04786e32f62a3634eb0807fa7ab748479d474077bbff85531221fd8352ab776d8541e580f2ff167a8120ba42151a31cda69760164af041f1159b020e4f718cccef89c8729295a642408ed236abbd55414243a5906f97a580b3edf2396d0c4d6952d4c7663672f7aaddfb9b10d5472aa84764b47bafe61924341e86369b36f5864bda7358ed0d5613c5aa7d87cd07c31db8bbd47c53f5f83d96b8a4ea1e80c56a9893149809cea7d5b2d0674b9c891f628491ad24fac84672f3739565555aa25475c1da23e6ec21ba46cebf56c57cfa56a78592cae7be858f59d313a033ef66bee64ebd8fbb6fd08476d4a98134913332c10df4b46da8ea3d73ad4c6643fdd061b8bcea05795bdfad541a5bfdd5741c7237488e03f810a3261a9b83a5b5efedb79b7855da1884f3c364dcfeadfc32b39bf89ead68267e18906e968f3f0b3a015e356659513e10c3659fefc20a79c18f074128c55886d85cdfb3a639a6d9f2f404b0a9e6f85703aafcb4d112fac78118b049561e60a233a937413b7e3250dca1c560280bb2b212ba63e9977769777f1d83fa38b942e7c8347b6df49691a8c248b0b4e40caa93367200ffa67afb109e511562390d71f0e3fb965fd8ba769bbaf3b359caf94607a2941aab0bf776e94924d9a351eb4e4e9b99004f25818f2d9224db8c173c8791057a783ac1d391e49140ba34141562358fb05251f2961eb0cb8f381656ccecca990042e7a218a1aedce8f9d637059fa2f2c44747769ebc6c3ccc4993af6384352f6429d86c93ed9b90dfabc27cb3cb210bb4bc2a219856aa775f62a83e4d239adb36f45a7aa5109588a4a71b85520ecfbc9921fe985b69f3fa25e7bfa12e048aae852f220cd2e41e41292a9523c5b300706212a0b8071ca778b3b37e73d02d3b05a80f22f7aa4f8ef3b3b50deb2f76dbc7998ad9252d702e0a9d65c77ff372eeba5fad90dcd9ef1ba09bc3832c33b186f6acc755bb98c27af372a02405156ae0333ee3cba315769e0fb3fb4c40d1ac410e335b0706dbfa40d2361f43209dc6c06f4b930e882df6303726e1e348ee13c52d4e07239c2e2dabb1b99ac895a2e95ec9b34e0f88e04f9dc1e2206a7ec4326582f81b1a9bd3e2c42af2fa3253ea73e46cc5cbb68e9baf76fd48f181ed3e5e5cda52aeaa8521a3691f60bc4f6e2bc91122345f77510788e0aff9b1a75b54979e0cb99603e1b26037eae41ab7cc69bfeba9ffa1c15b13865bc69fa9a4195ad3dd4f94534603fa6aa1c88f843a018d5272f2741b9800c00207b63ec2deff877ca88b8069437fb17d3979045b0c6a763ade604476a1c3eb3c27dcdf85af91431e97ba7e3359207b93d0f47dc4459639673945554834d5073fad02ac917481962a8ffa23eec86158608f9ab747618576d099aea368be6cddf5a59d7661d006908aae3885c848aad185ad777fde160804ac19a65e8ddcc1c22fb8fe2d1838c9197fd3e5dc1115f7b51db88c0205b958833e172d0f271d196a2179276e472afc9036d4c40151a8788f7ecab51ae1870e734b5ad8498a1dc55d954cd26e6204987d67baf852c2ae05437978bf2533fa00f009c60dc18bebac9e49ec41935a0a61821fbc0904996b0c03ed676b6226ceee9d07100e3da10be58c50820a2799461b64f2e1e67302dd4a66cde4c48a7ed10dcd07df200000000000000000e02463050000000027c67ecd32963928b73397e907207e141a967a9d04709819ac3a43eced97f06d23ae130dbd745aaf3037ef6ba76bea4f1546f0f99ce70d96e3210a49b8c2e52a06f93bee49815f1d8fc7faf4e95d6463c562a97499b4f05d7495b79f899f90ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dde6750f654f47098b18e0e01791a48edc111e40cc108327b96c3bff3f074abb8a028974284d6c712ced7dcdc62c26d58ddf69af406f762027eb3b6ca643a57c146e83a45d373fa6d2f15fae7f707c3dcf7d9e91f1891a9bd0c89af12a31c0fc6e07e1662aaef038a22538e87c57208393d64ccf3f6299546fbcdf5d13423d2802245ea48051d3f0a272ff2fb73fcd65e89e7ef1a0a08ac397442ef26ca74078d0022f85c0a39823c25084c14a22c75a4ee0af19cc935afc6b83b62b56b2994210030b06bba75367378e34edaabe09fe2bc85b504ed872b0e20fb92a87223615d3a60ef7da12a813c3349260b4dc5fc2ef9cbdf2d7bdc70c0d23f8c9a54a5b67f39c160302b48f9f9c8dd68129c67168092d3ef4f2673bc8cff95d29a9f082f3ccb18345021c44830451aa2d25d38c1569dd8731e1068b07593740ab3fcd14bfa44e09aada021c529d2a82307b32c702c885a2d1841decdcb886be6d56a9c8fd627b18abda270321ffc841af4f45f932adafaca55a6b146b2c5fa362436ad0ab23a940094d84260304d873da450261211bcce5446649afa7718c42a17a882cc78fc6b082b330973a4e1b6ced32a5aec5c5de48f12660e283d2a9b1bed2e443d05164f3f10c93f1111aa24fbd41b3739f027913d1584233e4abc1ed9aa9d777186bf51a65adad288d6dba44053a8a2dc6cc572aef2477629ff99e11d306ca79a9ec40982b340d07a298337146d7dcda4677f202ac7ca73c921555173774fce0f9c3596bf66fa6f659f1b8ae54019a4b817197e8e0267421ddf7ea0010509eba66992d1bb2b39b26554153f537f9cb562714dee81222e89e9f584a6e9fb551262f6332aa6450c09fe740474d30b06567eab1346eb6181492cbb4387c89e4482a4d42f5f85bcc151943e6e26d80e6affb65f754005192cdcd89f6ec2d1ac2b0e4e31b07bd4753d3f582803be71eb65ef1b48577f50a43ab92afc9b9259396abe21e06795949fe7cf8330010f3ace2d7b95e9c515c501196a9f202a3125ab0e8621fbd5a210666c5ed80479e9ab147799fb9696ed28959fbb318605880e37524cdd37a8a3ab39bd98ef28bfe395acc59b417f2afcb7f4d535e93d275431e17fb11ba4149359ff89947fe6b3c29814bc0a6587dcce10b064c0dd90b237efb7bab19a5abb98b23cf99ad1247246107cab3d4eb92f9d866612b1be198cc2328d4bcad77c19ca942c1d284ab8850fc5539ac78252ab4ead31a3342223f09f98f926fa6a5c57079366259364fef6a85476caa515be19829b8dfeac62acd9cd764a9ab5451c4490480d0407ca4ff9233a092956eb1f67b5cad497ecad0a83a5b69777481056d7db40cce5c89d08ea88970b7593fcee4a809beac4ec29a434e7bc60aa10cc0cf5749e62bf9cc40ff27de8f7f9b3740777de41cf2a7049177789afd1038792cc8c23469f6de848d945cbada1a8e78305a6ab84846f2a0ec66dbaca277fcff472fc4a58ae8b3a9ee6af94a62e73ce6f04ac3cf0633bf3d35bdd3c533059277023763b00225528ff200bce424227c225d623a3e15ec1bd08e64bf5440d6083bc4ab1f369c6ac0b7e0dd64ba29752ddfa755a9bad8bf132246a0ad4484801fc00009436c3372000525c5fb3a65c5c44c5b6a895b1a8830e4a832df7d7d99b2e3d1eeb7b14e433cfe2a176fa06e9d12e2207b235a2fe7fc31650974456cfe4eaa144749503375c67fbc94343d9f6fafc32b17272dbbfacf38a5e8e7483cc268569f602347e1742c66b12872b7e0d889c6ac08363351347c55ab0417d1957823b66adebbc7d3ec108eb4b40a22996e6aa107082f632b00b187f9a4390cbbf79565a93b132ce0246f8e1f87e11bdd51a4c0e1623f0f27557d8d0039e4b4704172633a4fae5303b25d51fd4bb8d48c6fce417c65f18581111ada1611c0b6529ee3cade794b09c35029c642b348b6d1d0e791ed52eeb1da1478b1e80ada036248ca854adf0d1c75829203d78d1e0612603f78b4b3d13d81b08409a098a475c4df62540d4eb793f8801733f8d3a0b859456bec57dd8bdd4f98020be57bdd54c7ff55daa786c01bbc6409ea045a942ea7caae9033325cfa8feade5acdcbea3d4444e78944793f2ea14dcfda44de1162e565564cd5fa4d328fee8fcb84a54183d20fbd6fb5c301b9646628dc06e2159adbd63fd51dbe7d2cb2ae8c44520be0bce1bbc566adf6003ef9b207246df03475f3a1fcafc7d531c16981a26ffc1f969d4b90775ffa03aa44403e79a4590bcdcd0f2692ae7f095c12acc4d3b3bc008d5ba4c8050000000000000000000000002db8e4c301f0a155d1cf9b4d9666f013347b95b75d0b9ce935f1f93300ea7e104e15e8d14bd1148ab36b7f813f1a1b5f14b2f447ec05b7bc11ffe763f4b2a4624cc78791a52b81bd6bb889700089bb217ce9d5d3d8a1eeec6c7155d702722f0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808ee535d72eef7dba9d8d7a583dcc3abd15bb7cb6bf237bf5fab74e1fc6889d0ec129227f4fd904e3dcdd4600e33ec9e1d4cf53392025a6db4154aec3968fa41cdb73fa35846989c94ad6c3c6636bdb85d4a48489ba3fefeda8622c5e23786b2f9f7e88ffca2ec31bb931b30849577916b8a5a72d54e6235921005ac7462020030a252c75dba242395caf72b95689297eda1ca87e39533fc35ee27d8a24ccf8c3021c08be7ed663ccc3f65a9549732a620ee658569424dd47d6fb15caa85badb82a0b08926ae220fd57157a85b17930f9781657cd019a230fc2ee52dc6e210a4a956e332972ffc8ea9c0c0937c6b55e4e9b60f92b1d2d70c74f18b493af62b61d7fe203108b306c8a4ddcd1050e5840e843cc52b5b0c731ea7073ad5a5b9faf26419d4e022bf049b500728e7cc5c667e365e401a81e87af9745af3aa2e1d50cb80e41fd5d02286b42656f09e5c82f1256aed21e80bb85f1eee09c521bde6df84f264efa15020226997c7c36c50c3742b2b003bbf3d95689165f7ee930ea9a66543a1cd454c566020888ec69364c7837ac4123cc8cf3c0b3c73271ff588d40446cb8ca9a9d94629a8d0f8caad0d46f2d765bd20a7528e51a2ef7b69316b5c49387d4df9eb9f0cf94abaecb45c63cc9766e24de28d89c5895fb4ca3efbc54ec725c029a51f62c0513db2fe013046d439c5c971e71d8b75f24e985c836a01264d31fb9eeafc2169ab5c5faf499d8fac30819642dcfc172b5ba2a9fd1bfedd1ebb3973e0515177b8f46bbfa7b063f0354c2812e6702b983b5eab2141bf908416eb14dac077d9cb2764624a6ad735fe108737074819dc1b86daaaa89c01c32fad27c0fa8619d1ecd6cc8b7ba046cd3d69f119c9afaa551e7a1ebef9f89cc49faa74966410224e478e78d3343c32821dfab6b7a502d2af86bf25b68d35e739f07357be57c24c42af898ffada08d37dc5877ff365060eb3e49504fa6e34405b948204a34db6d1169f7d586242fddf4469d8eeee2516c6dd91035eb54ce2442ca9e01f7a37fa862ee611ed9e79b28da38037d79016aa10ce0df959213fb758a93e62af6645f563e36a8a02c8f819d9e53bd84803ffd799145d6494887a673d4da1ae4020c04a2df7a1fca41046f9039c4d57f817f20cf42e016535761cfbf6ad03ee540f41fc83273c487476fc9bff0b06b901c086617756316f184bd0f2e481e80c40f33cfd2eb4357b2ee5399884342af3b2cef15a82584833a47758c577947c45d189cf2fa4b9966716bd385d50ff1d60d36cb1170f88e68d26fb9d324bdeac051d15033bf5c07fbae03b0d21ee04e0cbb2d66b966ce3e8a58986e783143ae76de9e4b13246ba7a9cc71136ebbe324dfac283461ffcf5c52fcc8a80be3c9be54a66097ae901ab256a6e10a36c1343cefba5780bdc2e986662211c1662f79fc9b3fb5a00f01cd32df27afd58e72ce8046dc24dde2a0581581ad61e91b5e1f6b596eccc100deeb33d1f99f2625d61b033824866051b533a3e1eabd8f32dd795c1249b0c58ec0f08e9a2c8e93b90420c19cc998ee5b83f2cb6c10f830c7fa2097904e8eea317e011e009359f605529780c654c669676871762f6b7d8db72f8f77b8fec3c25cf23b2ba05f0e42cc7e9d5e32c7678dad7f0a956ffc34ed161106eb50948b42a24649721eebc1c5b59cf79f64cc9c523ca03cc65c48fe8d925f20636aa393910c109b5e724b3d890d26d9e45ba5e534fa8c773815280554e2068ef9761d13b577c6d5924716e44239f33a2fdd97fd7a0483a62fa694d0cdad91218801070b341af65b9cca6e62d229675fe188fdcecd9a015e55fadd49b0a61eed0120a46bfeab132f2805e5d97eaa5c54d0615c6bea6817e8aea52a29138a1d1a386acb71853d7f79338aa30f1e30a5edda1be7313936eec7cd374a65d9f67fc10e5c0e78ad982d60991b0051f09403f2c248806745eccbca3539491bb079bcd0acdfe005db0e09d769da44c5d4510d25314873c3c4d6e36ea693d67c5601db6a0da636828cde1ff153c9e2f5637f32726883bc2df094d90ef6ab4098d0d70c8048424c502278dadd4ee06330ce5f800daeb78b74e2bb937ca0c1cf6e7a10cae53adf38abf72b661e2928622ff352e57cb7fd591d5661c3ff723161c9f06ef5bd7d33e71441b86ee296c122ae334c480a6ff7e2ba4c77467158bc6c9f7d493fc8bdc18126305bfa760a60efab21d76ab3b32255799954818edd58bf0fc30f7fb29218547e4c8f9a341007d41084756dedb6863d649e37f0707946312ac8828af7e64d70be16d0bec5b875113c72cd92d463422ae7930b0961e9b9b6ec04d68bc3a5af055e8d910b096eb8d13543eb6f4e7b71fb397d41bb7c36fbf1a7680d79bf56d5873c521af6b49b9cfe9761ceacce1bf27f6638ea724dd123e89f4109", "6352526500516a65", 2, 463709879, 1537743641, "ac81e4b5267457055c44cbe43142c86bf402036a307e838e14def7484fe61028"], + ["030000807082c4030182f994a9a2a1e15f2b24775144f3fbe519e4758df7fa8d670c6dd2042a436df20300000000c875050801dff0d90000000000016a5d0ec4bd0000000000", "5200636500ac00", 0, -344090194, 1537743641, "073d9ae130d457bee23db84c0152f5cc5b8a014f688efa9ccbe9a3ee3a1b0289"], + ["030000807082c403030636ebf41a3418111e0ee5d3c687b0286bef70e97a43710b4e3f3134627272c700000000026551ffffffffde12b1bcc05d09de08467dc2210b6b74f0da92d0ce2ebacfcfe3147de97753130300000009ac52656a5353006a53aefbaaadab1ae9ece7086256b3ee6004255688fdf1f110a9c0d5038a8d21070b84381f520200000005ac65ac5163ffffffff03ab686401000000000653530063ac65fe655b00000000000300636513843b0400000000025352fb0be4507d19937501abf1b4020000000000000000000000006b85cde49026f059fadf628f82a0d998da0800cf1eb2078071d26605e8bde5ce5acc80e460a125ba8beedf22957595b40dfe0b835cd4b10dd7a9ca94535176b80138127603465bf193ee987e558b8d8b54b5eec5b1d0abb6b09c363e28aab87100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000583f2ba8d32a84345018be6e8e8313ba1a5b202ceb6ac701fe62ce928a7563199664b0c01a858c7a3aaaca4972fbd86ab225d8df6d717aa8f9aec420030864324d19639307f4f43c4efaf9bf42e1190135007812ccdce23cece850f587a2c12fe8c2b804954f3c3a5a9993892f2db35a62955249ff82fe8d910cf0e4fbd0c11a030c946ffd05c6b79d0a9b6b6db9d4ebbe460709f0ffc6889bffc66f8526e6c2bc030f7aa36fb8187d5948a146f1bff5a44ff088e3ef4e4363d955d2aaeeaaada0300a060ea004ee04fd4ab953d5fea32f0a587dbc0c69968dc8aa89a3d10f18d6ea1abb08d349b8a9e729700f6e54e8137000fa8126f607bbc8239cae1e183c0fc061032cc3ba60b858911128271b81197e8a1b9bcd8277f6256f0b89ccfc643efd94830201488f2dffb390646f1086309811cd5d1848b1c4c8c342ef8b3bdf3f8c8d78ef020eca19e8c79b0cdcfa56c82fe9c1b206cb7db2d5ff2e8128f32a6edc39f5f8630218fa09dc34a817a9aa04a6e5894c5f5013278b8758327bb17ba40098ebe685380224a169e997f8e9295005a6496dc7f81adc89545665be0bf0e33fa371e19662a5f37e5ac4e684e5d96ce6c1f5f04af6217cb3cf1a7789bcd8634b18f25607ec48ff7f994ad7d9592663eca85a2110a3c43437fa019d3d5608579fc1e37b867390d641e05e34638b12c6dd65fd5dec37e954444501a250c5aadbb6c0036f978cea84d05c0cb78e92690bce0b168548fb15eee1d6b7bd80d0e44bfbf026bd3204d1d174cf61f190620edbf2d70e54673f02aaa31b194ba058f138a78137be9cc02f05f6f6acb61d771d8b2623e275986f45cabfe376c65f481f350852b0451a238cb7c32ed5ef60929922ebf479505f8ebad03fbedf52cdfe08c4d19f2386cf12f1149d652207956cf1d8b90955250d4c3f01795673dec979c2afa22bdf88382d3ba1881dd268ac0c21f3b0f1aa969f0c0bac5e317e7e225b7ae06750f54803a94173ed4fa0d344b82486fa7eeb40a330ce3169e8822f91a664923fc1f3c67829e5ff9c4650f44e49685e687429db8b79dcc5190068f6f5c53517d56dae23e98e52652175944f70c9f7f73594a7e5170904291b3aa9ed262742e569c93e5d0ec490ff2dc33fef45ba27bccb9caf6023efc74c72e879b7e70ae1a885e27248d9ff9c84e6e3561478e9993d931ab9dd0b8eab9367674f61b2c7f921cfc6273932813b83109f17eb990490efdbef0c88fd8c83cdf6068562e1ad7caefbdef46ac92561f9b4541686ce82d78cfdaac08d6e528b8e67cb701a59b790658c39bca92c75d13dcb80fb9d3a02546a00bba64c1d356945940c14037c351a08d136bb1363184e9eaeac3e2d241c5011fcebd2f01a172f3acaa218ac1b9e4cd00e959d78c5aeed60d95d5878eb35a0b355ae1c779c019e3993eb7618358c65cb8894cf850c75f7f4e9a44ae725dfba61c4fc2a27812dd04d021584e2014e0bfe1f56b14b2bd6416119e62723ae9e2ad0019588948fbe7d95f541c1df199f403cdde230ab26af4e3da4a0ec84e9540c9253d8aa4ab9d24e9db9f09b0b8708cbfd9d43847e455b8414005155f4fb853ef66bce36936d9417405d78e2d90c4f95c56652c325e7f574fbe7fd64ebabf9832c3cd2c5bf1f550a7a8c6648f0db1c390a020dcbcf684f8af0abd99e122a946a660848f0707e2483b8543252ea86d17e59c67c655b5f3ec01109531fb4912a2b04ba60919d05c43adb7a940e72fbfb14ee670012eb72b252cff415e765c401f53960d2b6a159644f7253bcbe7b3c68a4b5064a4e2f7896032610613dc37a14e6c0dd1fd3cc37bffb65dfbd1de840a04c66bce9a3ba9b6e0035d7adca360fb8c1444084d0d964fb180671dce19538404c503b0bc9deddd32a39ec7a1164e49b5f30e19fc378700970cbef47664e936ccb7f1718eb44365ef0cc110be329bc9120a3399eb80e300a7e2a2f995cad1b4e78d0289939afec7960b528a5ed0d2dbf625ca9052c6e86ed0c8367b45173578cb01e0e7a1cf2ecc8b6d70d39fbe74d1b92dad7ccb49cc412572fc9c04099eb0c41111076bba73cd2494adddc5bb522b7d32e21df6dc753a5fc99e28bbf8d41980f3c0fa9efa77778218ff2858a675d623d7c0ef958055001383d3f871fd2b59119dd6778d482cf5d6074b32a5899983f0983d245c102d46e410e2bb774abe3c0d51264d448063f535146078a58c68fdce498356be15aa8f60b40b8502404950a474adca673e45aef83ecfda054062c869c03a04939dabfb0b33ecb8fe13daf67d5dc27e639cee9a3504c328961bb5705b66c74ed5bfd2a29e90521fb70ff5adf8c4860ec8f626ae4b585d1d60dfa135d050db986c7516d620bd8cf8fe91d25a2cfab7c18685402ee563e505ed6359a71ba781317ba79d03c79d309", "52655353656aac", 2, -375801056, 1537743641, "0512ae2e7f8b0fc3fc9658830f1775bbb5e93fe7c03e09fabc1bf7e42e2151cd"], + ["8ff35c2503070be17f146839cb7c95f0f178efe27ad1637d4c8ba98ba4cf36ad1cf4130b0a020000000952ac655163525100523afafbadd7a0ea35bd66bc6d37afd7c96b9a473732ce965551ac700206398d9a77c18b980000000003656a53ffffffff984c121a4322fdf11ef51ab279045b100684bf78e40737f352ff818cc6da0dc50000000008ac6a6a5152ac6351ffffffff049e09c603000000000263005883b30400000000065265526552533d06b601000000000353510094b4c20200000000055165ac6365273850c000", "53526a5300ac655263", 0, 359216142, 0, "f72310c0c1695fd7617a0eaae2f825bebf8dc495db240cd8ee1ce2443602e616"], + ["030000807082c40302416fb6d7b259d792dd16141170319389abf5b437f9a42d8fa8beb2d1f11b09c10200000003ac65637f3df3222e2d02000cbdd912cd76b5d1eb73743d2b19707fe847811f4a951c53ba55814b000000000663ac53520000ffffffff010c558d000000000007006a536363656af766ed0a0000000000", "6563636a536a", 1, 2081769940, 1537743641, "c8706e2095df9c93145a3b564416c7017222d2f8d922b0b2d64f004311ee10f5"], + ["030000807082c40304d0df07e0f717f3fc2c26d27f8f0be34d925ebad85b118ebcb2f6ce05eb389429000000000653516363536affffffffaaef8827ec08a4cfac4dc01055e90ea125128ba4fd3b8a5b531dc788b4cebf77010000000900525152ac53515352ffffffff3d9f83e797bb925a5f98a2d2cc1c3f8fd5863d805144dc48b611969d6715bde1030000000865acac53636a5351ffffffff49e92b9385e0640090934d5335f9659ba0dfd5913e717a197139ee00cef6b9230200000009535352535363535151ffffffff033f2cf8030000000003ac65acb77b0b0100000000056552ac5263fa7287030000000006acac515263513fde92a4fe27fb2b020000000000000000d149ac0000000000df0fac512da80448b0ac9ed59cbf8a2326e0c5639edd8f76818737257e8f937606d8b1df968ffd4b5cd11414676f7dcdd169d96b23897e0aea66f69b94c6586f138b089960bafe42ad3746af73ce8d4c0c058c064b2bd9ef9bc5a7f6365bbdc500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eff2235ea1fb9dc7bc094489429e72131f4b1fa67670e0f7d9794a6a14e97e909dad5b0898d3469d4aca241f33054ac2856f481fba76ddb7f0a7e3272121cd8cc473999ce89717b1843608488add99ee93de255d6b7c6b7b9041de9a74d5cbfd3a7612c83559a2b5c11b0308b0d98f500a931a3ceea02ce96e7e234695480fcc02057e0e3e771e5a3f92ecfff84f52618d19f9c0f37f2f604b6646b8c6fc5514d4030290630eacce565e2c24927fc754772d68e0409abdc7e5264449f7579131aa0d0a02919a65de1978ead836c147c9a1962c45ff579f7e0ba6383e8cc0559126bc8352a38ab951e2e8e226ffff3c25743ccad7814570b043baf1f5d0581f57eb4e36022499be0f39aeae832f21f2136742b565c511bc85e831a0090d5873944ef633940216b744b1b040904d2a2fc8a78730f2797ce254a657f29ea89c3399b9217c40820305d504410de03e0dbcf9820c95903a171d6fecb138d85fc74ab5542dbf17172c0307afe0bb94f2c6aa762c78612711193c3f5e11f9640c32d76d890b26433cf973020d27453d7d5bb7a712e1f67017621dacd0222206e9938f7686a1df25ba4149cb7bdaf960af8c08fc368c86717298693329b0e4f7e7d03a2472c42be2aac2b58c535a1a10ead3a2159c5e10b890abfe5b8d247c419cffc6bff083ceec033b625dabf94a8de9580e5bd4cdb49fc199ff94d626c57e60b444704a1fbd4c00612360e403009b0255509f8e57cfac8e801b954cb4d0aac78a72e3428204cdee5cde7d6f8a6607b66ab7683689c99f7f14f80134eb80510325cc096a81ad6a7d94c676b2ff3e595a14ef91188a2ac0d510c4f377fd2309b9d15fdc72dde02007fb89b2aa51ebf57a5af8a06c2445ffd7ca5c414af632c6ea40e49ca51a578155968461e5335fb31ec8b8586d87a49aed8e9777fb845c21030483c7747ff2c715a6572b5660a11eb483e958daac59d10d711f5121cd06992debbcd36fa93d9129f02746e94b53d99defb5235fcd282c6cec1b32158ceae4fd1588868d59f34f9a5b2f0bfc026dc5d12a05dc0a762511bd31e9f1670e45d336d62ed9b7926006e7b251cd0bcc4c96a65ae56cdd6818f853c1a72ba41b53cb062603b1522d3d2073c1d19c5a402fed38abe248f9ef9495d9619454e4809526065ef7c6a0ed94e1999bcef52f8ef7bc59828fd9289c2cbf49a82e72024e8d85fefadf7277c4e20c5867dfe07c58d60b5e8c0b40cbe0e245158563b3af323cc93a033a60d432afa9c0d5b480d6ef5ecfb2cec33b4aed0ec64f5423badb8364b81f49d953594f89a303dd6ad88fd6c4628006d03e8180752622e2a2f0f4504ba4de9efb028dbfd977ba4429c701bb882558c2403bc2058b3c48eed1cb6f19927c5dd170c45cf95a31c04742afdccbc426506c079fa250717f38c1f62a2cc76b6acbc0f2c1bccd159fe9094814bc99baf2b571900167aedbb2c1e52a5888525927ef04145d757466a3a9eec500306c0ee1ad746f93bda3fb5d499758f1aaeb01155524e78913349f167e7658b144eb506146da209346e1252c659fafe897b7bedb808c17cf9a6faf5deadb852c1fe6205d08de49632d5e3823add4c32ff307588ac7d26a3cc0c4d601d7a4018d3029a2986e0672d31a5aa1e61603ae9ed2dc29ce4251faf16b641d1248d04db181733d8128d4866f9d437cded4a592779e9323dc31eda771be832b81a5da6f24917d1abdfdfdd6d070b40ee7ac11a9aa14f315ea270d1d8bd1d4e78773c67d23cd276bad5156b3c812804ddea1eb20a45c55a77ae0b863176a9713447a22f1b6ed5a691228e0c69dd0044d256c8177a777c3494d6bbfc26d506f38d1823779aea4380f6664a1b8eb765336923a35d14e2b4a3a71168a590253f8d37363287d18462628f856f106d29bb6d23ac3eb22eb311653351409c7a91ddadfdb7a97c37b0d9adf6df2845fb2a31869756dfb405495f2dee3abf1c287913d318ca62ceda0cb25a237e66f72339e8d4c7ee609a1fd58627cb8000551204b7c8d18fc07726ee32f010ebe80db9c750be2c03f6b0a45264dcd3e296da1da994f69c3f6b0cb82f34ff0c3ad4c6acbcf7641cc6b909f762b8a1867d2c8f3e5f3860caf4fb14d29359aa1285377453b68d553a19d79473c2b696157cb37416340913680ecc34f2aed0a7f6d4ecdc52e0c1d71883304d88226711b1a3d0f45be10db6b3fbd7f6fe476b52b06f7ab5751bf98b338046ad4feeb849167f3d39d0114bd7c412a9ec82583985d8465b3c0146a323d6aedb34fe7fd7b6f2fd503000000000000000000000000b2ea63de0ce0b535c26408a3550fa8c21e9196fc79aa61eadaae536b0eaf3b7e222335ad4d98c49a77537019774db59ada01692110b2aac4183ce78a330afaca4898aa946287b428a24c9da52ad65e06e42efa557efa7bd15f2769538cd4a7330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052f9673b0c9567e6cfa54eb5cec0d6c1c768fcfc66dcbde60bced6ce4757e74bd990928893997a28d38a9ce854a3fee2f32c692aea944da05b95b2ad4c60523ca81a36e58103eb0dc19f4117eceb7d35532d28dee2beda6287fb5996d713c62f7c1f4112a46ef60d0215aee5939c4ec6489f647ba351b25e185c20dbc2de5a440301c2ee894deda5ab8558a6275fd6f98906c42b5c29752aed55252dd9c10a7715032b96262edc79823a41b39265d03dcf103f1e679cef874fc30d9ec075dae67e400a020df61a4e082c7d23191bd32e35c20098690540d1fc875d3a111e25259e6a96b1fdad96421f8d83a1cd2e4a97ccc48c37679f7d43431c377cfa3319bfe1504c03222fd62124f52f2d7b06982a056368a5effe66f470bccdf0cb573ecdbd92146a0220c8854d42f9b235d2a339531cdbe34b99e60f9676629a17557503ea8d973623022f6647aefd42f6ec9c0f11bd02c4fcab70809120e57898363949602a23acde0c03223164636cd7cb05db05c521fc7dc33b36d82edc83add8f0177bbcc50b6e574b03154acd6468a3d1a9167e6f04bc00e186cd6ede827ac51f36c5a93fa2eab0b12efe5e279bc9d18c39dc1f35c96bd17b574f2c2a52d296667f4adf44116a0be142343cf2af160f81c34e5b4dbcd3b111c2a3e793bd0162c6011aaa17355ff506d5ec773f0b35c82aa91770f69911caa5ef5c185f580f3b0f4e3ee5d10553536fe4b7ee865218e1aa3a8909a430d1ea5dac2a8c56412d26760bf31776335a13e4e2439bf0b67e00873f70d2f5467c2854e196e3e9d7aefa8a278be366caab65691ca90916687adea4caa419a49941d508fa56bc3d0585a12ec9626b7725d3b869fcb5ed64116755a52a27a2ad47f11d36532fe4f6ff506547848d4eb4e9dd3d0064c360bce0a5301a7d7eabb98d5572c70a8576bc7a1f18d7f25a931f331a218df987f0febb5e340f112ee892d927c025d6dfc023cf85726be2c94b28fbb98f74d729a13b38f944039fc03f32333232cc5345512d6ad4002b90479f9d04d82ce91d29d1f8ba88be93c6c1ece61cc7beef204f7d71a7f15cc5ac4026ad62b2f69fa0a2f4a9ece663786e8b48701da69845f68bd8d6a142ed22fd3b716b96156f93fe5ca45a0ee80ebd5c354bd64172071ad031c5f2f4c97db91f34f78304ebfd7a69402d9ccedd7fd09987c706d6beba55d8786ad9c2f1bbeb1b4498fc525a21a7a799cbeeeae3500e1698071af3c986b0af60ad1124647cf0f09ee62568f444aa535610f684e5169c90566e987c0e5149aaa5d61b8e6a3f9526e37458b038719028918d27413c5fdc9a8e88d703350fdda9f78b4449499ca83ef736c344740c14c6522417a42b079b04cfd9c0d5d9e1b94d8cf8d98a0c9efccc2dee055f61caa1dc657bcf555fd3b250a092e78996c1477c6ad55680499bf90c5f4da7471fa902118f36aa238a281c678a8e47f805ff0f2cc91150f11dd22cf9d0d483fe5e3fe4d196715480b602d7c50427679ba12bfbc80c88603eaa7c9e65420003ac574ed0b2bfd31aa132a91dc629d8984b42a8e56d6ed64793e02eb4f6969fb6822bb16c4950bc819327e37c89374fa086410b71c939755b3ffa5deca3826a6f7fccab51d41e7ff7c7c79af2eae1ff7c15625546ed7b9ee08250edcfa838f7b1aae90b7e9a6c747200f60df4d191ea9d4da960ba8c73f890a836c1584f159b1106e34962e766c784162e89f76e2dd801304a0941e758d3c78adca0bb8ec58d02a0f8d912228d10f99ebd676ffd6f0bed35d04c34846c299c58899ab53c1328102d4f26b4698b5d247268076ad93f76aea5f9d8338e3a1d586aa517e872135d169e2826bbade01fb6cfe934fd4bffcb3302de0117734269fe66cfadbd6a015455f873463d95bfe13ce7b66115eb65c6e2a17b18583b2e7ed1330123c054690503ffda8a893afa024b613e3e6a4558ca03db1b9efeff0e6d3d40352dbc55000dd6de79d25086db675526c4ddae7e1aa34696f129e5aeee2b08f79398b4ee358f7e1d28d0f81c5afb59c7e2e6813fbf5d1722c4799cee8aa0fae8826e5279595fc6cac23198ff6d894b3edc41d6f5429ef5d8c5a968e7a32bd1280e749a18bdc4905cc30704846c54a368d9416e745d4977dc14748eaec074cb00ec3534061a4b73f4b7fdebc3c3d5a150715bd7411a0b512617ad6be2c8ecfc5aa7ae4e71bd75f295a50feae0af411b8ed1b44ac014f477bce2c9f12ede80ae1b3dbcb7328cbe7d8506327b124f8b93d580cb28b54522d79334e2c4bf3cdf1a3759cf15ac12c4d2f6e3c53bc64c36e7e795abd7436ad6ac380cd56bf1312102faa1c7e7b5a54ba6ab1019074c1a14f55ec92ddb79fcfb690a110769ffd7c19006b4080b02fdec10863afbab7bc4b218b35c68d9096c445deb7b6adf40f407", "65acac51", 1, 2041216296, 0, "a71c9ed9e3d3045534c4e1ef813f6ea72d2e95c0e457ffd2d5851057197e7936"], + ["26738e0403bf7881e0f9831cb9d5d3b6070349a04dd7ffbcbdb82d2abeebaaf657c92b1e4c000000000763ac6a65655152ffffffff1e3e53e6b232fb52942a3fac7d57945ccef6a104c4da81450af1afac810428500300000007530053ac005151ffffffff246e8cd460573577b9676d69293f97e0c7a0ec5e3b4bffd36299e019fdb3286d02000000085365000065ac536affffffff01e4064700000000000251630000000001f27abe00000000000000000000000000e013d4e3f98b54ee145f03018fbeeab7d4b2444aff794318871eddbac972f56222e587e7e0bb4ba4fcfc4aaf8a554fce69757cf4881be001dc61f46c0ed82a56dfa07625bd43c39b0819bc3c17f76f7772baf8ed7d721d9687bc816ef118f514000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001bac78e4e17a2d428ddb5fae61760e27948cd28916de52775808b1b9fdeef2a4eeb4bfcdb3472043b12235cca5038614377b6e51c7afc99ab3aa76183039a57069f44e3c7df2af4081602327c351402da67c3257f7c500b56a01c1be1e1126b9f5a9aff148763631d4b770fc62a2fffa29a462a0998e052488df590011701f3c02221ca7d8b704755c515757ca7dd8d71f2830ed0ea24d0fee99fea10856cf71dc031ed006405d37b7947f76d397abe815244a0e1f2867e6645f58f20e8399a40ea40b07510356c7f49f26742624252f3e39d69abb330531453cc5d9b68cc4af00d976174615199902921093bb0c15bf9ef65955855b19c9fce8e5b32df3c91065d7340328b1f746fa9ea4bdc5d1650c80d1c5b82db37d19633441bbd918669d138889ec030edba97f057f3e3666af5228b923d8e4e456b08b79aec40899956cfb56a36c5f03237152f0ff6ffa083f6417af4694641b78ddab9da7e928c88fba39606a404eaf0207265d86de27102c317813ea1bc6e1afda169113aa03828b719cd2d2dba6b9bd0322f518782047486ac6d118775cffa67a5af2cedeece4d35e3ee5ded3e4074003a7c071eb2d4e6c317c89c0797e0b2f4b49870e42aa3a665653f8007718bb7ba2db9b27bc3848fb87e0adf71af7852ef0b443694c19f3b0444a574630dc252e17ef597826707baad07c86a32f00732f4c0e8b89f9b07f39545a74c95dc8e5286900576980b101b44f9b065c780c7064d22ea3aedee8f20f66ff8bb3702458aca02b0e9d79ff3fd47cedbcdb7c0f23b56740a86b217b9302e44162db689bff8a41103c67aa2e868fec8085ccda8f58a7118628833d2d5ca0250220dbe5ed123ee871aca93aa241138a83b65ed3f0a11886d91a9f2efd148e05c1cf55564dfb7921b7ae3a18c36b31adc147c19921a7dd6683717f7374c4663d79de73e985fe958f031688da11089f9114c024ec135b557007cb2841f15c1ed8afbb8e6a240e9eae48e3ab4c4e921ddc245dfe5f162259d6aa5f2ec48f9fe4d3ef2fc2711520967870baf4ff835895b2f2bc03c6bcd2935b6fe40257af7ebfff0edf390f285b9d29941cd1fc3cd97d671a149bd64b2d0b4ca4e0a0a62f804135b2685a8c410312537c2703b656cd7d3ed4dddfd39c3e7dd9250d93d39618aaf5b7cca1bdcb5d197ea3d1b11a817f8193d6772818b1b4e352aa24c0c3183c3673df4e9ded8f7b6dba22e6fbf253fccd92d0692866ef9b231c22407a7cfd5f15f40325a1902b08aca14224e06d9e2f492993a7afdb38fde508f11ea1b8f6f5655fcdb88a4cb120d9775434f4646981a392f6c38c5b9b702c540c737941986c9ce8d148165f80a8d5c20d6d9e9b5859235c0aa3dc869ebfbb2f7302f9b25d6ba7da8728904471d82d2bc154651659059055974eb5e1e9dc0269260666f827cb2a0ab575427a75c68a862bd0e0be0e82eeed39957a6a68287fa9e22dd6ff0e6cbeedb2b2f9bc4b54819f260c9f35a61682f61c1e1b23168445707b41e406afbb7b5cf529a9a8f09b7d1296ea3e6d452284dd3694c160855f41156988f13a6b2839c6e3c7fc16cbce339292874ef2004189dd7cc60bb3e8cc6b365f8004df3936008f5b3da4c4cef01cec8e0af35edf00782699013d01ae2660e4ace7205eabb09306f3125d4793aa228acd7dcb12efd4c0b2aeed39edc20609ab61483a04ae76bd26b972df1a888b7f42ec111e58d486c7af08a6537bfc4f6266d66ef02ae090b79318eb2f7364b4342d9eb3d861625aa5e7268ceee75265ee434a34f438b2262ac69dd23381c08bf4f54896d1ba59ea405b65830906da74a20b9fc00507ef4a7995cd7ea3a2bf32e0ec1690ce7473ff6c5ab450499ec33d6591af043c98c4e50bb36ab0866b05167a0df6b9364e1f27b7ef2a432993a8985152f416095129e5a0eb8b9327c0587ccb3fb45284a0044b154b2647c6770dda0cc680b76f22b2ef8bbdefcb5862bd6acbc75efab74d1a002f4fc5daf77a2c631101cc97fff865cf74c7765af46d1e88fbf8c1eff7357c20e0ec409a9a1b70ac04915ffd28706df94c818ee7b9295d874493fb50b30530760a5c69e906100f9f88fc38f825b5435819448cadfaac86924e3c90cad0b66498cca7580ef4e8297bb2117517a355b37b00cc3aa499fd0e6c1a1c1557bdfa3d7f562867eecdead8bff55234a04080c00f2e7750e309cba2296bd8632d4e5b79121022157bd6796b1df348826875001bc762b1130acdcd27b8f4a9c6376c123400772db44d39e014d34871711e14452290108396430b18fbdba2c11ce8152d57ce87f75423a9b60daddf0c313d30451e9baf1d2f6042f13e26e7f8dcae464ec242ee6fe59e7526d9ec32144c031ba2c4e61005a7efef4d65cfdff7815f929d8957261eec00739a1456a900ff05", "52526a65", 1, -412446102, 0, "605bb425eea3312615c25051ca444ebdcba77d601b9cf03c59fe35a13bbddc4b"], + ["2ac0360b02e54617fb69d3b9a9136572ce4e2940ff8f33946ef5cb32dfbf37d9592ec111c701000000076a636a53656a00ffffffffdb8349c276641f319270eeafe1a5f8cc16213ff3cf77f884460493193cb2f0ea0100000008526a5252635252acffffffff04ae7a11040000000002516a7c2d3b05000000000351656502a13104000000000451ac53658a0e8305000000000163000000000204e8ab00000000000000000000000000e5938a9ef770fa4e115ad8ef563547100c7751ad26e09b7e4206772f86a65780de682ed99e571321f6125845e3201d29f3ca8e628559322fa478e1787bf30543d60858540aea74efeebd7bdf2747516ab30a6cb1adac85f1a58c27cfc5d312df00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000efe2e91a2771c03fb7cbe57012f0314088fff969c5c08d293a3ba901bd9d1c96b7de9d262c4d33be541d60a9ba6ea579aa2da67e4290a0f75e28c2908bc5d6ebc1b68ba51b5f5d67257fd02d60265d082124f72fdf6c1c564a79b49c42f4df42dd25ca8c141cbf97f396a02c86abe7004aab9b4a81cf01769699f83a625216d3022a133e4cba28f40e60bdfd5145b90242b5f14ef80791fd26ae2707afc2bc2f5e020b9f34e0e879d1abf339d5c8ae918e0fae0357e2aab25a4c6798c279135333640b0239debd4a2a3f8a986268e244c1f067600513f024eb2471661bc24c2a4ec3b7466f1a9951a0936990757b92495260bb809bd198e364c44251bdc0ebab74e43c0203a80be951ca0392891ee1ba4042056f72a99c920287da24df9c4a3dd4a60e3702259b8e115bffc2dcdd1f541d8c08581b057e912df9808fe3ddfd78619904bacd020bf808aa9ac5812cea3ca3d06acf7eec319d55de8af4194125f17ce0d3f8ca78030668bbc295e56f0bb5dc71bc10b7cfa69a40dad46ba440eb290c07cadd6d7f4b030a91066860c26c5365b605128d2ddafa09e32c0ca88aa3ec15db79a644bb92996c36569d09fbd6931386200be98c31bdc08a0e7622cd39239cbf211563226a13120c13e3ed3ec38bad778c55f20766dba7b3b97efe6c3c5e0a34e7ca00a2a22af44fdc3920c5ca0f5f4dff31e4fb4239d55cdfdd10c4e5655d5df8644296c76e4f8147300b06651ac855072453b82ad776592e3f8de1e2b378aadc97e6d70087a34e85c982b8585621e131c4442194e2bc45773963f2e93373b5ece9c7735d503efd8c23f0ebfc9ae50b3ed3a13d20d5da08c47894c3ce0a5de38bcbb554d64bd970a4578f07896164391b09064022e50e78c8a72bb10a71b911d2410c1d2faf6a0c92fcc147133802d6c92d5aee2484a66341358d3c5a65161f1473e86f633b696cffb83746a14e84236c47ea157ba3f8a5d115bbcbc70e7091b2aed95f81c1eff6cd7df538a4a37fe3db9c08f963709914f9fc1c9ee493d6376591461ca65d986225a5ef513bf0606a3a8c5b8c901b9c0d9cbd384beb7e0b34e2b67eed0a192f881522f526e907bc814156a6eb9a728de2f6421e4acdf448ebed31f2c803f92886c87fce7eee84fb7176de86508481e35bd3d3b5eb221da5f2e335ab18b2c86f98e5644e2e5ee224d2ff048958bde62e04026d5c5cec2fd34f6db2d587fb5ef104d302c4af72ebd268f4f2f01156457137eb91d0693ee64ab954590b218ef97ebf2b3b8f877a8d5f958323680d14a7cac6e7ec8f4c1234ca61e37eb78ec780d934e280ddbab30e3c08ad618ac3c735f4a8fa771f9b356d0f39cf908887ab2e5b0d70952c432800560ae62d63509bf760f9e82bbbfc4ee6a560ffb4076921f046cf94f19a0766a5b195b58d4a5717a997925d84c054428138fdf8e4d1e5964083281f0116a484151c94935341e17aba243b41d45a23f2117a350ecd74fd136d1c7dc5184bff11fda5ab87d7cfe4c54a2d5476282a255c19760b9fc284023d42421fbaf89a070b000bc18d649d55aca50032fa05117341bee25cf8e0620ab49d7010bfd0a2af16ce5016884e2fa5648f3a3ba4af22ec408d2bd7e382ca04db31b97de98197f328c07fba763c0a77df7affa08aee19c96d24f3cffbaee06757f71d34351966cf2ef82c14855e226baff7494fbabc140b83ba17f9e874e0b41ba07b0c77b52c73f71a2e7b2e1d5e223174175b3525a3e60569218b16feaac43a84df3dbd127ae555e3f24c62ddb2342973b5cb3e473fa07d14fbf4ff6fee0c67bc2dff0a955df10e52459e8d9e531a5a936141b9d880b025d322838e05c900e7fed39071741c108653a9240fdad63bd1b8e24ccfdde46d463f48ae834e62cc012ed5f79b160737df2f07f49ea59893ce55c18b9e3d8272735dc172246274c4f3d301c4c33e99fde62871d76fcb96da16f8af2699d34d468faf55e7fb9e82dc36ec82878681ce6c74cb94256a250abfc81063e377d7020206b46ae5ccea231041c4ae4a62a962178dd48659f4451911cc22c1ec4007797ccc52e0e48c5c8f82a7801eaa08a17c5e2c130ede682d4db23f0e0ca6705709770dea92dcd5eca9fa5c8542778f451a2f8853cb16a5df6248921b03d8b0ff68e4315e758f2096bf90c9d622310d90aef18170c9a06345c84e315a0081e2615d8d26e07a4677787c582b154382f419d555b6efded6acc939ea10f577a4d854bbfa59e0d9ba2fcaf6d5918aa97f9aa68adb094cb1370a8df5d77549d4140000000000000000aa6c6b0100000000ca2fcf448915f6bc2e1f731419dc3b61ada790ce47d194f55226468c6eae3b950970ffead7350be80e859307bf9551653bc8afc79162008e2c0dedf4fa928f22830dbd2f3084bb51baf5a404bfc6bb8018f6bb22a0fd502f3cdd25fde439d5be000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006bc743479687a93547f22234c45760b49a57cfdbafa99e92a3446b85e979f15d469741de625292855ac82139a172e17851fa8c2f25549424eb5629da82296d1912571e366b59b99f47cb5b3103851b18398037689297b48273085a5ee903cda15223d10043f0f055d72fba9edb4fa9d4260be7fcfc0903b1db89f5b27fe2c6cb032320957a599d952bcfccfc30a77f2a4997e17652e0c02a2cd1ab930c034e6b1a03103f1d97979092b3b574e7a86d6d3d1fbcc64d15ce28258137bd7aee01368a320a06f2904bd14dcbca1169a3746ddcfd22f61a108348bc501573d165a7e45b92299d7f83d5d21556ec5ae7c99c9165d1f605da4d1dc1252ca7e534d40ced43cfe50222738499d22fe7e83d5717a93a7d540a5034bc3ba34d384252aa3791b9cb15020213a4877acbd42fd1e846883098b5966cf24fcbea5a0059be7385cab484ad09db021361acb5be5f668fdd9bba9bf23832dd193b13679d7e082f0f15374424a32685020253d8bbbc6a9d0cc5617482e353002b8045b40de04f0b2aa774da98376d12b5030f4f37c74049c92e75edec9d8d91a482c59bf23435c39ca4d3c6b1cf50ffeb5e931f7ffe1cad1c9dce0154f92cdc4a9df5a054eb1903c9422ce5799e44ac44ed586b20c8019d6bf8e5be1ebe5fadd60b65ab18ec2cc0a5960025bb8a0b1cf5a8b3e182a578e7c8a031028ac7de77eec2ccb6e3c51783eea6e5144b8ac4f979c0ff3ec11527bd401318ef8b1f8f7f9e3d408f77215cdef17dd8124ab5d22ad6d7b26cfcc331bbd31fc646cda150444356630f99fadd3ab7e59e44464df6b77f29303e87c68238c7c6253f3832a5a5df013fce69c6908bce47d482912f6388630c3a64fda57bb4545879de3d0d8b846144c363f433837719121629ba050e8051c2119f2c83516ba55129bef6e1a681f6f0bd5882688f6c3777af5fbf756ebd389907b842f35d1b74c3996670228a7284196ca11ce460c79f605b72cca868608674ea54b05ab1448f8339cdfe1b33131f0af1168f9ac25d879f796bc891a30fac8f56f937257158050a271ede03d696eb7184b8829f775150e2ce2ca4171a2eaeddc95b9b3078d8a048466a96379f3970e26315aead60ecab2960dc7175ab049ac25a5942571001901f9c6db2841db632617d35fc1b793bcb0b95ea06d651fb7a716ae681e0fa10d441af25317830dd13d0fbb7a06b65ccc81b3c71dd487c860a7b60bfff7165ab04becb2f7d0c49a4212d04e402e187403a5224518a43dfbb10a2ffc16979a87daf0596afb38d595a5240e34c953611c2cd5c546bf7affcba02db11f3608a5c33fdbe02c8c1dc578a943ef5073a97ca7747e89519e9a206ac89954859a10522dcbf4a1b010931f73a4ddf867d5a8e16556e6f5ae7f73491644f94d5d097a4acb76de79fcd2895bf73b329b11167b856b4875e7a2d7553ed47cac9e1fb52d9b106a0282bc1413b4387db12d2472b64130c8b9e3e8399db483a91fba32d43d250ffb4440abea2c9cded08db8ec1087aeafceb3ddd0bf341a3d6c56827d5453f5506f50d178aff34987aea988ef805fb571a805fcb520df763b08ed01f1a60e258eb7c3cf3ba914158c8ad41ebb84570d28d451f2cb735a34785cd9ddb3bf422e17c3c133b32e0a5e6d4c0ee01229e17f8ee2913db7849a40b53c0af394bea533a4f55c597a0522a6dcfe338d78d989d4de7caaccd50656d11a5dec1bd77ac72127edd673ffb0233f45db0f0982cdac00564a7eb483925f2828b91f1f74c29ea7e6323510feb63ee8f6f1a080bdb227d3521c29d2962ffeb68f005e32ba29fbed53492aeba745add064178b81ae8a5bdfaba6fa2d4532ee18f760430d84742f2fd8861db49f72a3a5f6b9a379e4219f8373ed66821286da022f67219370626bf500ff3ae9e540a292c5bc0c8f22ce5a64e6ace5e1a5a6285ac3ef55d8378c6fbee819c3e7dc9e851a15690a4f6ef2f5051c549bfec428cc6cfd06f99775b2e8cc4879aab1776387cd628d34d6b20a8bedc11f3e3fe023c7fe1e567b182185ab34cbe8fc64df83fcc778514914190d5736cb8cec669592c0f4a1f726bf4703d1380df1d2738e7198cbbf9dcf3379c8a0a9fb85ba760448d6f3a5f99edc5924b156a417c6750244f2566411754ce5bd3312603cc97bbfb1ff9820e25ced8ea936a1d66dd8bc480ad82c7d3503944ebbbe4372e87afd8b3c5564d156bd7b72e1adb0128674e16b9beb080453df0bbc669c3a3ec87fb55242c4f01571969973f7228895311b98d3e247d90be5231b77d628f3f60ca6d0135984ecc49b1685c4dc6fa18014f23d9fb62dbf087a4258ec2ca7bb812cba7d44af75e2c753027fab478a05966169bb115fd305240bbf3d6a8fe4187e3c9b6f7758db3d6a556e02393d68aba764a5660e73eedeaf355cd5109", "", 1, 1524981417, 1537743641, "555df8006235bf3668031108acd74fac5ea82f3386bfa9856979a76f2da247f2"], + ["030000807082c40303c5bada8a93d850b38e2220b443fa2fda14f380c520aae6676f3f6e06563d701b0200000009ac0051655363ac6352ffffffff5031cc293b87539fcc1d97c4dd258725ee217789a90591285dba83244c243d78020000000151914df462dd2d9285a8ddef9d461eeb67d453c042b6ee4fa2300e4010e6188223c42182560300000000ffffffff02e00de4040000000008006a65ac63650051428e2c0000000000035200ac353c521500000000010000000000000000eb4c660500000000e20a35af1e07bddb4aef1b370f12773c660e92c755b151e2b0261ebc4ed3f760e5d98b93c06666bfc11d518b5056a2c760aef8ec96b4406df798303b73c2c864677164c19f25eaf35d7dbd738f9a3532ba4f8028e498d35f1098a9c9f92ecc8100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e3f7ebaabeb762451b8ee9b0f77b312bf4f2758557b567fb0532e83ec6d7df56d5cddfdc0365e26ee728e17bbbe7ea8b84fc471dcb8dfbc6f32ac7164b5c16f6e6c68992ee639caf4075a2eb2a5f8b40889563dedc8b4713f3ca249b1b63b5f44dd04fcd4824c9be1d086efa53c4027fb25fb8c4a07bcce72d7fda12eab15e87030557ace808a5657cc405917f0df21ce59e44539692684dbe0247d2bcd2ec918a032d72d78f01379ee66e479d8eb3cd62d52c40b7032ca5c6c1e25f86a62407b5f90a039db5a4de79612664c173d9bd91f2b2138ca2d8c7d7d7b954b7bc6c2fdc6d44eff2fa3de792003df0811bf4d90ef9f08ee595d495159712f931d704ecc2278f0327ce1bfe74c26f76433ff7a055e02d7fe56ac4d04b03f4f1ae318dc9966f90a003212e4e13003bfbdcd4baf410c4b87b855c5761363eabeafd8a21eef1af82eabc03141981ee20363e3bf017107f49ce0f7d18e78d6f606feda1fb7556c3ff005444032ed7af8aa5aff7ccbf3b76f5edcd0c045d14bc25519e69749a3108bd3ceaf55b020f8d1d587f49e32e6a122be4b41f0d0ffc0eadfe5ed75b8c12bb04c92aa95e42d7f65a573fe0c59169a9f1500bcf88ff9b1ea26b49aa8443ce4b836a3e53a230556a03d4f8649d9637f7eae364194b1df1b53d3cc0c08c8530d30e8f18537ebd8ff893c491218edee9c54d31254ad7bd3eddd8b433c55c755d513669521bfbe628075e80f3b64d9736bf7cc046b1130ed98e74f064ec9ca34b72c8d3a82da4c9dc574b4522031203f423cab18cc8ca63c6ae5810406583ca54b2b48e84e9f41ab7f362cf891aaa95827413029ebf752f22abdb0d935d77fc0b165d7dfb2ea1e6e8d8f9dbf929020c9dd29b5dd937b3a2d7d9d72474759306d76149793a24669d0f01d75669647cfe4d165c822aa9fdbc36eb13105a801258b8a745a4e01de8b16032af8e0131ec85b8bf0e52f52f79cd8fd104a23d73449517e638706258b09d8dd4f8fa866144e886eb8c417d66297b6206bd4700c842f2a6f7ccbf2f9aee405c5bf0900c638962bb6a75bd7a490d7130ec81830a243c2cac0344a720b6467be82da6c218c65f6fd109f2b715a127af0d030f4ad36c60c3f652a4caf71f19bd5aca81be92f200789bd3d0052cf34411c9f4a629ceca62063864dc2e41ea115aef1ec078872b226e329b248b985a56b39a072decda5e0b2a4d08280222b113ab890b4afa9c2caf7530e6083c46430a758433b15c98c07125d734b3cd967bb121b26e069ef57285acf11f64e17ab6d1d0769c7dd6506697f8a1175b08d9b50b28fb39970e4c45304d9cbe94077da1753f9ceb8aad50bba0021f932a43ae3e95158ba6879b15465aeb59b5d688411b4cf7887764de7f0c3df4f8b0824d58fb9dcc23d7c5280719371a782575ec5cb5fdad95ea61dba45d0c04688a71443ce246586c2d4003ad8eb82ce679eb8604204a63d42f74cb859852f28c64abfec8b27c698bf0578608f354e3c5ab5981a5f9809f5f096a9290d362f0f4c14981ec81c2af28ff3caf88610be3b463f4d2484525c8e430ffab72f79bcff86e90d25caa59f242ed6fc4e0ab0234ad555d637709cb3343f03190c4c8155ba331e39ccfae899d8769e930ed7ec23375b6ce69840b3d06b60d935826383bc057ea1682c2586e7ec82a8b5332012cb751b07b9ba10b68993e7b020adae6766c1c3fe87d845260e801e78733488cc6c80f093ff4d5e41c0eff73889f73c8b8ded957945ab1ac21714dd99c40c114c5f2bfa130b7d332dd29b4857ca75d8437db3d9b469bde3170c6e260bb8335415f383f438b1865a225b4de60f1de17bd5d7a286c2876811b6d3e8b40383ef12c5f8209f82d758ef7cb936e333590a8416dddb7f71a7fc6b5f1d4faf79869349a8698512dc60f9de2fce0389f6e2f4bc9595dbef05c585b37006cb1f23cd0863a3471668b547f41920a7dd28caa908a36c66a4d991bfd5a5e268d4266b9e7378d3e9f61d151cc97a3ea1dbb52352135e0e006968c9cde969281fb10410c12e4797dbacee7fe4eaa25305e951503aefac4d2fbc3e735ff01b8580724215ddcab42eb1b726f0352bd4657fa147b1d2ab3eb404bf3d338a58370a0d579f33e33f7fe78b7b1ea30b9dd4d4cbc4955b429f530ac1bbb00fbb094291c24e565ffac3edafc114231bb4c7656634ee994478fec727148599cc163ced348aa384dc3e60288c84c85f8d108f619edcfe037a5a0faf01de83b88b500302076afee73db02198ecf993dd87dfd29cfd752844ecd5b08d57c8d86253209961cd3bbd1b19150221d4856dac96e1d205d6ce1c2f0527d4574437e99bcae9772ba285e471b5923a47e0039c48ae2498d420b812026d1aabc9e05f9a5f589b17a232da91b55d2e4e4b9da118a3f1691c56193828506", "63536553ac636a00", 1, -1030011725, 0, "7038292fdcbf62396c34e9a489b6b77473c11f30e845186f1fad3b900e134c79"], + ["1ad8a95802de52aa8eeba4743508d9347342f465e59ca1af712d8600eb8dab95585d5092b9010000000565656a53514911dbab97a0124f4103791a975e844f186c4a375be4c430bec39dbba9aa4910d7298f7a0300000003ac5352409617cf03de048401000000000951535165ac63535100501e120400000000065251005352acb559d80200000000016a0000000000", "63516a51", 0, 457221608, 1537743641, "4d8db0317d81a697378747a2e6d7031b8527f789ee0199af5ddd198396708e4b"], + ["030000807082c403034403ad4f93082b098e90f8ea2282e057c8954b3240656c4f230bb946ea6f3e7800000000085352635351515165ffffffffa51f8b68d81e2dc4df924075a2fb30e7ec4a1df1dacf7a3f120b10095632357b0000000003635363ffffffff39dcb7e57f45f828f163ef7218df46770e2fc49b4fd0fb431b0b9c9b31bb876300000000096a51ac535100ac636affffffff027057b204000000000465510000284d41050000000008636551ac515265530000000000000000034aac0f000000000000000000000000006af63ef266c074890067783e415ad15d0a39c6b8e619f6fbbb5f4bdf7d0c56dd660923a54befd3e68995a1ab2bd0c9a83acacf092061a81128be173cfbae481724bed4e22ce6b29a7847f361b45eff432a42531f87b8f808f405e33d09c3f48200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000490b70d7fb065ec74671d709d851efeb4c374212c09a79325b4c09183c93df7f3340ffc7719cebf2aea512fce260fbdad522ee68230a4c8e98a23fab1d3b6aa438c447e60e4fb94792da4fa8f759de5d53d47133849444109d08272ddd769aefbba90b2edad123f9d32d28ffb581a30b0f668dc694c41367a9770cfec6d330c303098874212f8282d4ba3e79d29e13ee8748b707e0c455a9ca2f286e11dd19142e020f0c13b961bd56dda5a0073fc754ee2d2b4b41a4bcd55128a58c45611724f3fb0b00a3fbbce2fc73901db2349686e03f0601e7f2c54c15b45b3e22d5b1e03bf8c49cb1d6b4019ef8e0094ecef29309282dd6126a7eb9d7be0bcfe9aae3f8f1a78503030c22421515e9222edfa7751f91871ac8306eaf8e94458ff4b5eae997e2681102205d792ef6da18ee9de4468d4478776d9609cb956f8de81f7e7e6e91af1abaa8021baa199b0ad9b81f761694e54f8a419d398f6e5621c0ac7489dd3fc64b24969b0223c05da69c72a20ee587235060048876ed8bfa7b4881676d86c569c0f38ae45d02246e9ab07bd02f84956c2fcd25209ef88be9a5eb63e7bc4b36ab4d0da3901afdee14b842c261c86249a08ecbea9277b994f9f68be042a5b483b9cef549b6f21778f55f28e3d787067fffda3855680c4b635ba18efb7f68da0cf570d269c88bf75885c1c65f2e79a1fe4becbe2e83c5766519451157bf803dcd22260c8d5dc71ce9487aced814b85510f43230bb74dc6f8301385944c226c54e1c4b6c22739cd8d0bd3a4dc710c6712e50fb93caefd82cf0ca5b9491a055fd81f84ee70b59b29fe81da646425406845c2d080b4556ea76680e97e5990c71069cc7c32a8c45bd5b5424e324c95e47cabaaecadf145cb2c13e2ab87ae1b69eb179445aaa64eecc2b00ac0a8146ebdf27b96d55eb5b4c6b5a4ea1e9c0e0a936f2c85b6bb4155889caae1ce1fdeb5c05149065243e20b50874a7413d4edcb6cd6c7c50c2d4aa538ceb99ac7583ea917df3a4e2aef066bfb061a4aedc6b54bfa2509bf673d1b0b00fcca913238b13809d967a463b0961a24b9a81dd43c9fcce9977c8bc3c6326d248c59cbb4b68309276308111b8489b17b7852a249b332e11b3b96e1904b9bd1fae9f0841f4455b8e11054875f844178394c3cc7738c89de157a68839c260aa9b51b1fd3570553efcf6952aa103f1481cb8cea37afa70b0e8196cd56d53d4e6240008c5ed6f1a7bc6e2532b23bbf8756c436eec927587207e64e7dc576b4684ae9079f54b5811629863d20396367227402d38b1fb781d146a351b8d444963b9521b64523235568e00ad2e6cefb02fce60120fb5ac9d90cbcdc3da9441aef28a7b8d464f1242d43b02b69c6607276e675049efbea2c4b69a0478cd64b21233bc0d4c6b6f99a7d88f0cac397bb699d0f77322370a99f6d4e0267b16780b2b9997a571c1e953e35062b32c1abde4c6e383cb6edd56ca0e2ff09b514b3faf9fd415e60af3e032e53cdfb0e03133774e15e1c09cf610d97cad7f78f54f3f09c5bbdc71eb9120ebf5df8cfdc7d2ba9efb41d8ffa8799c757e099fce255271677b3c31f1040f72b3b1d4cd73b965169e4f09cf50dc37797066d41edcfcdd61cfbd176e7faab865ed9bed67167c51f67974f3738adfea6fb42eb5e048bc62fe7e4050c6f4fd105deff10aa4d6743b7b6b9ef0f6aea5f1014e5fc494ce4306ceb52233f327acf67729ffe9d3a70412e3575933ec0ff123ffd8a6465707ec455184cd9021e23752437a56daff680fda4f6d52b981fbb7caa843430e0abd46a5bb33345bddee3ae746cf78994110ce6a898fc3badd2c6327897d01e7d1963d541c18fcdcbdbc850c256961979cbf11cd6a615c47abd34b339970491006878fbf7b6a5ffa621c90656eac0f118af1f663ba401f80e5212f2aa1386001de5492cacaf768e0e24cca87fdf8f973f330c28efa16cf42fb91a684c47ff2c0577854ae86c62cc6236962e61164b5c1e523fb62cf7af1136abb9257177a366e840d8ca8e3812611fdf63707896ba327ca37810fe662ca02c9315f425ede60ddac8cca65d5e708e376125b68645311d87910458ef97c21ebe88a3acf04e13ac74c4fbd999eb1ace82f830a2854ca3597b53185b099a7c43747dc6431c677abf6855a30e5d5a9ce1734e11408fef2ae52428c6b0162bab09d8ca568d455a120ac9e815e45962231fde6b8aeb7a6bf6b3754fb19854b5386c7e0b58747c630fa6a639967daf3e35d58e1957eed0a79741ce3e560c1d61a3ba50b8e6dbe6024acf90604000000000000000000000000a64f2c21a52ea2f71a77f990f0eb8d40e0b54c1ae0eefe956df202a9aaae5b85433dbf8f23bba7be142cce9eda0329ede58e6974dfeddab48cc3c6bfc3462221c3d2232812174cca7dc34859276c1ef9c2921fafe3a7395ae9a1672bc08092d500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cad64cd48423ef3503f883f0da56dd7707d1100454fc4b9db40e9cbe162006b7a50d130a4e1f3c7b4f7a71709cb3e1fda04dd4a32942bc83f77ff921dd59e1e2fde1e79c3aa82506816150419f1773bc6677564593ead5cc743f4fda4dd43b2777f402c2c3cb8dc9eec281bd5c73a0405a03f1875f0c632a64f1391a8dbedcd20324a5ffe7c40c6eaf84a27dfed1633bfa69261c3fc9755be428644328814e810f032265d88d3d4b1ed5d0b02d6f6d217df4df957095eb3983c686c9c118a51a3d400b06f57fe08ebf489a7e089abd8f1d6c315d0b159b803775de5f437e5c427029373ec117ea1fd4a5216a99d4543f5466ea5a14aa4dca1a4149ccbd98e0b1c4b52e022400a470291c6166486736f79d9c07da375aded02115bfd60e7440218ed303420205f3f6b2d336e2df2cbe39eba68413d055e5fa6906c7c61b5a4b6206f65428db032929988531d049e6dacc12d4622801bb12a757b99bfdb93a31d5fd7fbbf56ba50202b30a2cfc11edebabc949dba6d5dd6fee27f14dab02d050bb696e38ee7d3e8603122a7de46a890343442f6de94c269de0ea1112ae310801571c1baf2fc4ef57f7a77090f36525f95f3bd3518e926163883de4afd2730e2f8267ca609ec713780219f1594f88c32d851115aecd212052a80fc6e4232ac0090bb1b09883f33794ffba4cceed8392cb5385e123390e8241c7dd4abd05678f9ce388c7612ca7fa617aa965773f7b938814332e22024801ea0e82c24b78d07a93449e1fbe00532420ce6490d3287ce9221a0044e6402f4d15a9f776789556e5938bc5643d30299e79b623ff063fbf55b96efa007890d67fa007e7cd8a0459b0e205b3abc9e417ce77b21c514eb652769960d7739af0be6e63d4d83f27d03a642ab656afbf27b1edffe6aaf04476f5857f05b901b979e7ebf3209aaa681765477ba5000e8056a2cabe3bc2064953bdf938b8fafc5c3fde114df5a5c7006e27babe54757df0bd692a60be71c6893afa31b8e9d8ce796c1b5bb8d85b4b3b6fc0cd064696af06797a07b8b1fe241e0ad160697051e63331fc558bc7b24302e484778e4ab47f8dc5d855c08f5a6153d18614a8db0c2963651958addfc226182b23da63f315ee6214c8b10beed748c9c66e208548d9d8a1872d5d0f4a6de624efbd54d43cd36f24eff751e4788df6f5922990d0146dd487521ccb089d3a19d5ffe83d3bc6f0403524d94696c13292a03ce754ac78424f98fe40a003ca7d48adbc8c1c1c95b181f47244700a655add385f5f6453d8f94ae418591a985d115cc821db8edb021b16f0ba892825532cdc8bb5ac883753a99e761c60eb4b817893e282403968b152c1944256af26a9a68cc004f4928a1c9363081a7daa906aaaf7846b9fe4e13731a6146e503acd9fea2b2df4984535891f85d3ad51093f163e6ac8caf4e2d29062c58e96cdc47251347c079a7eae2192ae8cb2f76e5c174ebc257d46cb9dc1ab942cd5b706426eef2a9c58cb63169f1a7932aa86890eada4a787f7da3eb36cb72bf7d40db6f9817b5af6874d2e6796b7ef50786a3ad9250a07df52d10d3ef19e2a5e32156e5aafcee1cab0707c3d4c67ce04fa196eae06a8a5218532360154598e40afeb5e038447e62ca468648d43230f55d6c4725069b68347c4956f947dccb387c615e9795804c03937dc20efeb6ae62ffb8fe04d591de12c55118987edf3e66b252462b4079d9f6484e21e04cde55e8352ea17a23817414d73be143163a1ede081870f45aefe57ef0f31991cbaa9001686dd78c99f293a7a8073f02e4a7a5459fe45280eff85130a43a748619f193f53587c772dec7adadcf1f9d7ecfdcb81ba643b9b5faebd4c10e22050050d01053585e1c1a404f96b3b8339101e7b9b03202b3ec567316e94f754cef07f2b52debea8d77a6c2d0a0c4cf31df44063bd74cfd4a7002a0fcfc45182bdd16070ad6d3c111fbb34bb4e12bd254578b0c14379f9c6279ccc5f2493ef69feec87f7baf9c7b99fca6185ae5b3f96056a13b418195306a36a5a14918f3d558eba7b38781817e3eb8926b4c082f67898c4da894d0b65a379dbd76e23c9acb2740727907787eb0825f92bb54efebb8b80f8a7e25a86fb11b04ffb7f4274875486b6beb007d15b1fa154ce74429e68fca44ef996a9f26d0c6a5bc8053345755f9a94cfc4a17710574a4a44b7e888f5ec487ed1b7d62724b6e55771d0645a8c0f00e4e608c08905554b87d6b356b125b188fad9a4eea1a61e7f7333876799df110da2b84caf4ac04ef781a9f0f5ba050fe83e04000000000000000000000000f848631eca8be6c6e4fdd4396e4bdb9009f5a8599a3a6cd4bc8c7a44ee92054ea09c670f0f79f4b750d6535d57c9ce21414622f97e3ebdadcc93883153aa25709605a2107df3620b8b6bed2cc61890b75ce0b328f4964b08acc7fb54e2f4a051000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f86e18e0eb6c1e29c9fa78ffd9f40b7e0838ff9047f20a11e257a375c528f9a55cd007969b4ae552c9387b18e60e7e25b00e689efb20b755a90c0531a45debaba0b023e1f947f055afc5044a5734c1ff601a836526a8a61cc388b9075f409956d88c3bfc944c5a98e6487cf70ca2b8aed730f22f44ac6aee2cf21657ea932af032d2ff376437d3fd543a2b73d1be759f9a00896786c6d0fd674deb5cf3dd1081003204da3fb56a77f464108af838f7ea7379b2498a6c26d2ea0f2141c2e5a7a11a10a08744a639512f3fa851f21322f125ac02287d95db79317df8c726635da402f9371acf90a44c3bf632f1c4780f454ea1ab0b885ad9ea0a468c1d090712e2fc223020fe88d06da06bd14b6f95b90e52744a719242475f2a400d34d9b4dabb5af4d05021f3b27ed6a0786d1de9ae8ca46c8e112ae690509a5c27aa91aad939fc57413bc0214dda7e4562a4a24bce3eccdffaaac241548a6d6a76a874bec021cebb8a145450208ad3059de07922746b592b01df48c7a5421bd9b3181b69affa6615bec018df20225267972657587c483dd7b2c7729528d9d468256923477a922890ceef8e096c5baa9d514a4bbd42e16194c7b64489d8d34e0df66ceeb0b948a69d5e7a289373f54a73973e43c75ec9433d1280acaf7e46cb85eb7ee99368ed7bb344f674a5e4ca936a7a3042f79164d6fc68b2bb6726bdf5e8b7c5bb3bde320423100e2111fb4fe2e5c6ffcc10c4a0ab6d8baa370a92b148bc15384ab833248180bd4ca3fa8a65b18fcc28be68c2447da5e54647db662d7c11ed6b0790d75a1c612b3fa523dae3b8cc716e75ecdbaa1db6c1841e4c595e01c3aa876e1e70d374169259aa7e0670b8912ac6e6db7d0b5cf390a678d7a908e57110196b0a2c21c6633203b71d1b86cc1cceec213282c02f8121056ace1e4a099627c8460cc7808f74e1eaa1c729a2d429dd216be255ada19d11b62adec4efbffce575d38c2edd33bf314280c6f7a7105da17d8d9f4964027252179331294ef2e7347969839e9d7c4f7bad12bb6650e99a73239f33837079b9a10e8b6d11ab38dd2f244c2e9338a1205758b2dca67b35aaaae385803ce99bc09349503c468e14ca1f57ac3c2efc38894bded5e50e33b71263a0e11dcf5e2ab131a4e84515cbc7f36196e64266f3724bc8df3e989bca216b6d368e958846dea275719872dec1a0477a33dc048eb050b7171da192bb8334c3555c85e050bf4e5e3317f4ff182a8d40b96fa837cbdba64d0548cf90d9d1cc24c1e2e423f8d71af35651ec186699d518a170922e31b9da778b5b63085a7529152f1e501f2f389af6a7daeb70de4bad4e6b78634afb49c5d543dbb189d05d8cc13a4abb4f75d029501517bba25d333fcf083d53928ff66ce5ab7eeb9577d5a77e76e4acf3b5a3eb5ceae129254844b7960723cf3beb0e6cd126d53c9565f51fbe209eeccc61186ef4a568db515b69755a66cec6e8db183802276f8716a4bf48a664d32ad35606b2c18fb8c54b4989ad1ac11351305f4ccaac5a01d0dd7d63bdd1096ed46a199bb01031080981c17f6f0a91ca5551d61acc5f3e4d253df42539d51012d58f8ca522164ceb0c84ed69c5e36c4b5aaf080f516c600d25d424cfe75cdf1bf196c0e1a312601a7e54db0a962817973163b15b6f698a70bc27ca24b95d0671db00590331f34598b02b4210ae70ab428c2ecd041a198e9b2f642621bff4d18512059f7a95fde0eed46b24e5e02412f09f751d3d4c9252a07a925616f5e5a889d745984b3d7ec2a775ed146b420f9ad50e943afbcb229c6ac8df441a661b03c0019811dd6679355cfb7f7691081832dc3233978b7cbf11deec99fb8e54ad766b91ff979d35d69f1b450013f4a3b48d7e7da078ef839cf6077bba0258b302a4c789ee828a280a8b11c9836f2d82b91c2b53a98c871755c3a8369743c7057a1b24d8c8f38c6b9b22059834e67bdcac0e7a3a6d8237a3e289d907e01bcd729000c5c3413f6e939628b728685c3cc37ece3f0775dde6801636abf6c603e08349067362e0e49f89c38664f3001591800f8c20d6b4c6b6339e86d106c69c6e58f5f20206b7463d051eed7dc7ab958a0ebb95cd9f07df28de209f43965ba30286f9db68c3822db44b7aa264518afabbc8a29dc376665a3e98442f5b1932c055cf1fbd44b0f7012069cf1b5ed94a6aa111cbeb8bb822fd933f3ec9a247a2f033b207d03977b8b5e2da9119b66f8f2f9d7a842d07e060376a9f3ded97015166e607e28da36c0e5cd663e43535743f9aac4c9024a8f192bdf82d265fcb26d915659283114deff755f80fe4b8bcbf3f43144a7274bd3b96a3fc1bfd428200320a79aaa1442285b25bf906b9953099bea718b0e7ac4f351e5554a751a5e90b0b9833b62f34ad4c68e9728221f8996499ae69d0a", "ac52636a53520063", 0, -324054398, 1537743641, "6e66e00bd58f9c66bb8b986104a3226813f56c59c58d5ebb019b41ba93f5616a"], + ["477b21260299c0366b478dcfdeb17296be4a16ca7ec2473c4353fd78e907e698690f95f1e20000000000b63b9ca404bf2dcb20b1baaeea2c9d9970b21d4571a303a5af0b2df68972e7f6c3cfd6b60100000007515152536a5265e82b039301862e1404000000000200510000000000", "", 1, -39292123, 1537743641, "b5ffdc290b3652333ee4a6d2b18847139345e47c0d4c7094f0498ce6142b5a79"], + ["030000807082c403040f8cafd12da57e7cc3b5527af8ef7cb4ce6277d35b6ae93b137ce29bf3f60f4502000000055351ac636affffffffc48f80342802d3f0d7ecbbc3c3e9ac31797961294f508d79593f0bdf9d0f5db501000000085363005265655200ffffffff9bdcdcac9b965a7b9b5a5c613b9fb3d45e2bec9528e46fdf44e83f42ab6fc4cb03000000045265acac6f091331793b84222169b8f5a08f45c896f49db53e8538c2e47f05b820b3c0aed953d1de0100000009ac536a636a63526aacffffffff015e28240000000000085100005153ac6a6a000000000000000000", "0052515251650052", 1, -124405475, 0, "8cab87470bb6a4f41c0d6206a3cb22e70ad3c42aca6646a7a7b632851315b669"], + ["7ef465080153ffc2094961217f840de8a96aece30e4cf74281e4d5c0364f22653903838114000000000751526aac6a5152ffffffff0168f0c20500000000010000000000028d537804000000000000000000000000ce9f870fc1993b607f962ae3bd42a364da86ef685edcff30e45078509f600d48d621d2becc96573a5e678d177466a07a0d91e9448b87714706b258fb54c3fcdd1626325730dc510fbd93240b255410d9174da1e187183bbdb1a24dacc91aa89e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c6d04a1325e9df11efa7e9a3faeaa25102d338f19e6d5d22a68c7d6d06ce86234b01774edd53c94cd5b233e38bd134143c774b0397c22f47f8389c0149259a55656a63cea8c988dd190a6498cb551e0e1f141c4fe85971ca1f489a8d5cb93b33043d8e9c08b8fd07b6b271e002f7b7b91cb6a9a49be3794b0e90c9832ddf1d9103042530e08e8250afb164f8dbfde3e877631a2688dbf7a0f84aea623e5c028331030c45015ad9f4f86849dd82c07abdb928bd519d64cc7204c49ebc1a3c83e9d1970a05890869fd8c94e5835f466ca45d238959902c84519bc0d2a55703c3c78ad331349d30f845c58e6e30f4844e41a4ad4a724695a91c5f8d892a34f016826bc7890214aba71072e8337e100ec4d5f8e3bb583d6b1e1be21302fca47bb31edcf6730f0206b3aa8188129a60ea9e15cb7778ce597958f6b7022ee14bc0f84afbc5c84b730227d5ad124652bbf85563bab9904736f1420a11c055939046e77055d007670f83020372cd1f325f8d344b6a22da9dfc6d5b76c753727e1028d19d5bb0551d8989a7020446c424376ea38c65fe8fcd19f5355bc5812aa76fecc994be72bde78bd2062b4526f66cb3c6eae1f604b95250c5afa7d8a8dae9c16804f1148e4807a2803eb9cb6bffec57beb2dd4d18d3db72aa5169aab7655c0dfbcff596f4611d3103300e265518518e0ea53b9c51387be8fef84a3e7b7d77b0b983d642819d353020ac13efd5deb97d109001ea8d77788986daf2212425e7e984fc742d64383c6503290a5e56a14c87fcd79081cd3b757cddbebe5781d4b1f07b991210c3a9167769f18e5e61e3340703e06f05fee70b97aabe65e2a9b1205db502ef036e7698a196ecedf8c929861a704866b51dfaeb210917c41803ac015e41a53438e13acac03a074a56d65e36d1b364f0a82b6bed44982139c61115ec2ca5fb529e5fd03990016cc00ad146021f2cf9492e3da2365b89896662800b4c87499576fe2570a389e2894d84830585b65754eaf7bbc8b5ccfed0413dc756ce5d3ddd0a3462b4ad376b1fa10e3655a99eac29cca125938a09dae1bc46175d9454e5c4b7d6959a229ee368da37f0fabf1997b7f2381d78ff6813788c21ea7dbe256480c55acfe78f307676dcaedf04930dc425ad8f703288839519cfcc764cf709df2191e1bf2c22d93ecf66716bc3b7f5ea29f0e30246345241ad721a8fc271e6bc6dfbb8234ac1a5b2a585df92cc9afcacfdb3bad3bce84ccf72f09d3f5301785bf58d7c6b170fa126e417fa7cb4dab0cf23f0dcf5fe66b5ffd61d560709fc95ef750ad17f6c28581136ecea07c87dee10123166bdfdfe0448f00ca3a88f07b871326efd45c53e147ca182305f8ea6b95b1e2a74e42d495222085715c8a2e8557b7d435ffa6042d74fc731854b2da4121f3b8653f116cb337cbf35329cf5cc0c727c6e7109f0f04a13609a3f190c3959c29073bc11b2314108cac3e8da73b80bd90f58278e4e0d310c66775f861beb078be87ffb71009927ca784e87a2e59c6bdc26098b3a8dc76edb9f6229852e960701f8f578578a8a0528d81a96bc448af34e02e327bd9bb5fa189c0cb0b52807e27573cd5b431231c3b2a9576d64aa7022790bccc90c32d120daba1acd713df852418024914243248b2acde92189dcee9feecb092b5b77173ffd889bbda85463cc8599540e527a8391db645d945f4d7de149e67a7f6382855dfae40c2f0243e7ce4f7c6dc6b0b37ce046b4928934c78588dbfe618a339c78ef5dda5ea8ceb928d82e580b993e531d5f7e30a7dc18821d1bea6f06e6687972ecd722c84087d18e75c612c0ee6bcef08c8ae2cc0dc0c797bf308aef2d442f25bede0a1864069531a1e330479849f5bfc9af6be8bae4c6ba8853fdfac38493d801b972843add7684018fa39e0a67a9f62b16d433a62318bd95f4693440ab34cafaafde53ff16137a73bfc3743762094d0785c9b4161a3cc78e35e94ffdeb025de29f91a43822a10ed1e8d6c8e3340d2f3e30b5eeb76638ae1e08b4d799495790cd2eb715a3e33e4e171e0c4a6af1895ef75e1daab1e074fe6f5352dc2f28a89e80f5a1f1e5e267232cd1aa828df571152f14c0ba15a604ae877af0735661329e5ef0aa8902108c1aa723c62997c83242c17e1bddd6f4ea88cd75ba8b0df1347b31f3597356cd01abf01f9e0805cdaf57c7bda62a06eb276c1980b27bc3142dc475f167f03294d756e737e6aeb539be1c7e12652360c9bbf0330853c240421110671762be0bf8214fbf18fc55f5a57ad8fe2865adb0e1cf187e01000000000000000000000000d8c8d76cbf04c886cf2bdfa0b05e3fd445e203b6687834b75b727115bd43ddb4f714f8075024aea1a3d4183bda168b85f856efe9c8b46550d0b7cf61a7b0405c0b6df964beacd4fdcf6e5af6fd970c3af9bba14dcc13d5cb25f91728c9fa1cde000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f6bdf9dc548857ea64b2456a0f522c33f204dfa7ec8a75950c02e1469c864db4a1ae4e838141587d36b1b5fdf66cc7fdf61be4c62dad568142470ef2745c8562454936fad4ca151612fdf1ef033d6f25926b0f029bd81e6fe374122125c06d0575bf6c7a38e5a850063d1f192ec12c6a28732b5ba35617cce4fe0c50f4edc37032ff9e8d1dd913b604ed2b62b0d328e360c88372e93ecdedea48b0fb6dbbcf09a0211eb874636e52a5ce048b37b342a7877cc317f61b6ab65ea4f3d6fd55585ffcf0b0076cae285abec0d145564745ea657c44a7e4eb8735f09bec3401117be36058a88a2b10b11d305f472712e839f5214adbabc61b3eeb97ebbfad9f3cdf28e7f5103178f91e5dc6cf46d82772369fedd4fb0bddbf83c6097cdc7851e23cf9b4f60d0020bf40566171e09a243f83a56c27ce34e4a2a7da9cc50dda145cef14c333673b4030dcbdd581bfa9ae72dc9faf72fd244b979d58142656644b2c7f39c9dcb9999ed031c83e375fed82a91bd71f314e08461aa7d9f7c3f9966294302b9a9d67a84db1902187bcc2579b158c7f834dc86635b249e110fad46c934096ddee595414b9041b158f0cc318fee77f3c21406012aac7d21dcbdceb12535ce71ba0c7bfd8d01c95cd74dbd69d5d69237e3bcd3b528a82eb811a0b548dbb76d1cf6ccfefa2cf01f69c0bc4316f9b714af381228fdc322c671071dc82909cf5bfb699e8de8054afd7fc8be25d7366e289195acfc5254b4279b87a1af8af9a6323cbff676d221b32e83c962787472033b6eea61835ecb1f08ca25df071a086dcd4bffaf0d25db2bdd272e09d577df94e36f4683a6aab939a51d53f28c9d4271157fa3521143abb513284aa34b85d533ccffd56ba5c9c1e69e5ffa34c3ac958f043753716d7511d9d878355bc7e3b08d8b1a04ca2ddd0e2a39e44b07655bd75ed030bbc5ac48f840fb241a6de72429a13d126b974e5e0f627bb3937be2d5b4ed5b4b68d42ae7ba2c43029c477c20f8e6568ee5698f1211b3d53efbc69d2a1d5a9fd20ae2c73172f7c31aea182f73733dcb742f543079d97fe2bad6862fd8ac97aed6bd066facec895637f016234e24972c6f2f2d7937e93dd70684cc32941edad2866ce068de203435c56f7e1b17792a02d1f48b7e2c419942490d14c036a6018319dfc1a93f59d23a45adca1c2da43acc42840971d27aa4ca32c2ccc3e0606a5e4771e480cd3756c823d204f04be5f0e0e243c2cf3e6ef66accfe208a7751b2029b1672bfec5ef7512a42213be059f4e30cfe8f10c036a00cce07288439544a31e92773c4df7173c790e08c34c86b8698e4b5c3272a9ba6e381db2f1832801cb6a2019c108e2abc6b02e9d3dcde07e77bf7027ba0b3b5bccb27c9b25904cdad5797c877da46679e7b8c3b986b0a242a8816e806ec188508d805491a702305a89d56e2b835aa82b3b072ab36c08b709c4ab3633b338a445e31a1007a25fb82660926194e1d74f9fde9bae12368cfd7eb50127235d8a327edff6515c27acf9f5a953008f93f3bf8cee2fd4e8e8a2bece3cb63e0df359ed5340dae398d6ea3dbea56b31a896390c3df56792b4074345b985bd52b686b13604b093fd7be315e411a042411fcd16aa1b2beb3b2bd88295ba377115b4f4ee635b393b7754b0957475b6b078d4d121554b98bdf985254bb3a779b5308fe33d2aaafbd04d8c97265f71009eef1b9fbd668989242bfb9d974a935d5526b641b551a25e5d0c39a1579e721e60d0bc205afcff2a01ad66398187bc7ac3d8b24cf832cdc938fd5252374f9d09684d1b6fdc33da0ab9068a9aa47c1cf02bed5c13e7d7487b2d43d13952c88ba354b235e5c6ec92c5336501261adf43c05f6dff0d19c4eac612e61ebfebf07a1ec96a7d4f73220eb4688588dcf0564f0b840cf5c473ee0960ce9cc9e80cf18e0660d76cc93dfd5c150db7365a5c62703b22380a7d1573769ccacb483ef52b1307dee8cc06101161b8cbe3d5087bfa976138873be0ae9932f9d74f1102f4451bd3f3c0d50cf12c3624c250e474c7cf9252f611c3858701a24af4cbd67f09a1524cfee01feeff2767a449b284d261e88ab9b7bd090c7c3f5b508123905d05a2aeef04e7e58a34d8197dfea74240c9597ec9faf1da3286f288fa9e90a56659592c97d81b975dd5138d85abc2ef66e4abbcbb42366ff3f7b5f0bb383d4fe7c70163322974df75f283e67db6dfe1587f2b16c2c5b36497ad42405e963b53c06c0ecfc0a76b7cfcf49a9905d196e442a227d5c88b543d2b973579aace8adc5bc2b3f90074480dd0cb145e59356067c630a58f2d256c783ad1b9ced0ff9c2ae558a350f1ae4b8d105b9ee8a0d9eeac715dbb89707876175807b4fc98e7385ba28eb2740d55c0fb8c4601d132ea48cf53cca8f39cd1df67429ded00c9ee02204", "6353630052", 0, 1730867992, 0, "7809c714ac307cd65e31cde3e9ebb783098eda61ee53ac80a0809a80664c913d"], + ["0e757873037cf9df35995501f5c833821e6f0d9c4a8f4b6d6be826561c431bc5942eefa7350000000000c98823d2d75c93a32f4e22ed305e0499f04865b8e22b70f67b91a02ee246d11da8c53bf60100000006655253000052ffffffffbe618640bdf32d76b3861f6b23efd95688fda158d019fab293737817b08e4e680000000005ac6552526affffffff023976070000000000076351006a525365c6c5bc030000000003006a65a4a47f010100000000000000001d6c480000000000e1cad304edeaaf6fc95091c1571c9ed307d261898d62bd9fdb13c525076988a5613edd66c1660320a2b25ec299e31c8cdae9b08c05f26e94b0dca805ec2ce7baf368938a2ded122527cd2f33e4a5aa4d1bf1cf6dce523c0d668fb768b4bcb3e9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002cddbf574b10e681e95dc0521dc5f82794c2e6031eb172ebf46bff589908798beaa90990c42b547f67894a2cf0a85c23a2e11f1be8a742e6d9cc0e7b6d6198850eea6638b615f4a2825c877db6f2a57f47e472556caba56b1a231ccbeec1755081831e13a8390aad56048afa17f221f0f7f4d4283cd5b75812aa0dc390dfa0e40207e932e4ebe53f08a20a14dae77d38c70abd3b78fbc3bc90a79688fafc84e07d02238214f7a1d7210c72d6781685ac9d64520e0e492bc5b6b634481650562417a10b08f86d705bf67314d3948b0f46cc2c9d821d22be081dfd68ae20720922c242e3c8af6d26b2317677d8f03436c11c783dca62de6bf8e4eb3353e91c55cb49f17c022c20390d5e1eced815947428a1c96f69c628efff69325c4961bd0336a891d5270226478cce3c2a5205f36f55eb1181582083ad42ad43b91e16a255d609af488de40301ce0aef46c69e83a6226fd30c5ffe7f8a702cc4c04b26aec0b4437ac0300cad02040f392218c437be59c03a36a7a4786a8be328748d25d2db215e116c8cf14f7002114fbd08138386661d012e5f4e053f5273c5d0298e48e09056b4626ecd317945b2d208710b7f7c6c8a7d6cb23d4137e305440261909f70b9e8cd1f2093b33ed4b6d11b0dc804bba7faad2287a1f3faabb861514345efd9fb6b9912b4261aad78e29e3e873e771f1f95d89617c2fc7c5267a7f7699c7e35a5b1214de958d1ba15e13943bad3e2af1cc6328c5fc8f918b8d2807a48dfeed2b4743d45e508d9174b869b0f6f8c4876ad48575d8777921b839b02c30c8710e91f51dd2d8c12e8a23b9d1fd92cb90f2ab867c284f8d54b19e25cf3717010f6bf8bf45f91537b42a7aa1afed21d66c5cdc8602da431343f5d1dc24f61785b4499939e7a12e96b4ca76bb68b23290b65e07e3f5fd3d7d385da6fe107b6a329dbf348c2ee6377893f46220e60ec51e63c3704f6706b6192c4dbc71ec6016d8b6896580f6d0edd69ae6bf114b4b8adfa1801c0647786f3481c4b662ab3ec720542ff326c85082514236e42f286d326a5d5a8e7d4fa85a7b70bd8fc19702292b61d80b15943c2feae47c4de86c3f6bdad54b927d80786385a53c5c1429864581c85f24579ed49a56ae22ca3ef6c559658b44b0f6edf762df56f09a284778106c369233a956808c7eb1e8eeca94d9a9a1b2459d1515748972bb943154399a5dad7fe9f5f6be9d054362084fef123c64e784f53c7fa93f31feeda7e010b815fa4302dcd9bddad4b7d36c3eeb9e3021dfedbcf2e79ca9c5ee3e8e07ccdbb5fa044e442bf12d7399bca5ed831a1f64d76d15c14dd45bc146e2bb41e7314500d64b4279b9724a7d72a280262ee93325505fce89576c2781e1e467510c12be40b73d8ae9322899fd7682e507a5c3abbe7531027201e10319cd75fcaf0d3303b900825d5be73600fa1679f4c054e36e2088f1852c950e57d713f65e69ace7d966ed728fe3abd19c6cd7107829a24c7f73a568e645c141eb8f4c1963f61d46385dad816c930ad8183244a28fb6cfb012fc0d078aa53fc44fb8b263c46acba124bc9d7a0a09b06280d1038ad31aa13766dc1d1e9f1bbc172fe61edbdc513851057d95ef6806f27a4c394aa58e15b2f23880eaf986d203b37f43ee729b52b8649644585a8d0d1bea4f1f7cea121d09820006138c6a7d9bc30b964988b075a285c0078ad78120826a216c36296cda890e1420c7d4d0c08d6398bf52f66e46774a7161cb859d937dffdc92faa4872acc129ede5bbb0d0c832f9e023515d5c573bb24f7e2a0d6a3ee4d7e93abc66fe23c24c0b6effea1db94e7a3e72af72ef898ac585326c108ca07df054440260487ac494b67d61b8f38f8af47f90f540b5394303bcb3c3786c768048714a3c108ed8e30a65c4c7b330da2b1410805a1687092df2e75828a7cf4193df84df169ee223e6cd4ec0d9356f1db32397066dfbf2a7d0d363c4a6b9e695bc8a7bbdfcd6bd828fe12e61a9a7a2a58aa9a7beaa8d265b769a62c7a0663f70bb0ea270560122dd6493a4b3d7065cc744113142c08422853b8d6b0c23904717cd1229ab3be74a5e42427b457ecad04556dd14ae13f096b1138af1434dfda8c92cf27e0716947dd3b9ae63d9aaa41f1d478225fbd7aff9589cc04c2c6ac564d62bca4f4d5f4084b46a31b19b9f71a47c78cce2faaad77ce3e50fa71e995d53e55d31eefdb340dcdd30c0d7071c796fcf70a732148a8c189217c50dda29e71577cb733a619e6c9a25986471afc04465c53b2cb35bd5e2f7356cd0515943bfb58951a8fa8dbae6da9c3221eddabb7d4761b2bd34cc1a896b461265c25b30bfc3cdfba966e9b4f4a5241034dc46c8880501cfc1085243a07d63cd28ed1d82be638256da511a3187c3a37fee6f9ca691661ff36c3dacf04145155b636c0e", "65525252", 1, -1509671904, 1537743641, "c9729f88b6fe33f7d69d95b15bf58e0b5832754986ef57ee1c5a5bfc81057f5a"], + ["030000807082c403032085ee02931f7c276809395d9622ac062fb9f38559ceef32438bf561aee91ef40200000000ced432d9f535ca5837416462c45abb41128f73373dc595733866941068932dd87a2cb294020000000363ac6ae32d9d42a59e38cc618ad671a10388f4d081443fc66b62e02b6f5e38a14f77f1ad62080f0300000003635100bac1ddfc01dd221c010000000009516a52ac526353656330c636ce0000000002d4528e03000000000000000000000000861f0c2b17729944610b48c908d25c4071b39260e12a3c3e8333b503278e36c21f95a9a286217abe03b4f4cf2ac73460d36a13213b4541c0b5e26a19db0eedc38e6009262d0c8fb469b6b87f51ec4e46ae30f77246ca4aecc598a8cf5b61115e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c38abfc1accafd818ff42fdf609f07ca067ba4706249324f9e3a6528e33c7e4a688a4de903c54b58bc3804346780701a038cf3039ef4fba459d04ba656e2de447702b404766fda3d0adb5601cd6a0ed8546821da4c425312564429f2c12fe27c7d530bb48478e5f982a935f1d4266633beadab6e706fa810896a82651dea2cc021abc86c813f834b1b5fbb57f535829704a7bdd15d9520cba2fe808c5a2afa0dc032c458fe7813a72234cb956439ee334da32ef1e28453f4168b662f168f69f6e7d0b014a2ab4546a43c2ed0b4b0aa86f91992022f64bd45f575eef766893451e4d24449b77f433e944f2c344b7cc6fedfe77e48ade0f93a88fa26086f41e6c7b5eff022859662758d8d1414c9d0b5d212149b0dd4ba0ff045db089fede1d2db6543e95020fd17a1c48a752be11522f975583e85f5a3a2b5d984de1048e89b9392634db23022f63c07e776b5f97a84a236fbbdbcbdc02cba82a1aff0b13a1f8cd65ece73935022389bb3056d48bdda6a5734b9db93a1cc53a14448dcc4133a95de925dbbb5d6c020b36046c5e293e519f0d4622c42a60ef7e96660567b69a03a84d492e5d4589e4a7a2a346100cbbe4cb2a67b22fdba87ed547338efbd4a6e1ee989bad006edebcc9c2954348a7607666b556c9173120e6e17f441ce2ba839325a2785e68209ae93affcefdcfbe2dd1214483f85844129261afcf37e5621b367638c8a69eb1e5e0c25fe8c6df5288c867d0b020bceb8d3a5a5f3790fdeba365f715fd174341602038278b809b7115b364e136c5ed1b5823b7d376ea7db0dea1464cbcd02b41bc719fa4c66db42a20c03c795530ac45fe408eca12dc0308759e7492ba4f786ac7630779f1dd8eb3d9b4cb9de10feb85d5da939baf5c69d1981cc2ebc31f4a3d3fb7b45407cf9ce630180032562ac2d3112f807b9a943cb1f3f1e5b1dad02f8f3f10f1afd01bbdc1c31c6afffccbf7a850da60a6320843fdb1cb177c4e56e1e7753998869d3f2441d0b38eff7ff286cc5a712d85d3943f7fa72cdda90a435401860cbb105776c3b920182426e68e0722ae5aef54e598d8211fe8c3ba34c3965ecc8e9cd8b483a6174c32af4a9a9b89537dcc9ced975232fccd3c1c820c0c4317a65944b5e7fb7082428d4fa5d1323b80c79297fa47b366ad3e2c2cf13ac102292ecc1a7b6df1877895b2d6c5fa52bfa7024a1f5b2e75dada3c3c09536608fa2a722e96219ac18c38501cc5de0ff924242f01b13f1cab0b006b1f7326823475a29dc695ace41047ed38d392f3aafe7f8bc102fc5bbaf6d9e4056a1c2950ecd8bea7888f2e9a340b07c3f8e8f6137d211a5b15c18e8937d73b6242931ff523552361b9e9d4c9ee79a6ba07e96b597fe284c01efb7c2e3a30233bf94ae4e2e6354907f11763cb211f838ce0298803c0d9bc2792b1e52e362ae637c10f3a740394bd419005a8ed7370666d9a89230c8b546a4a6a76b215f625628b0204ff368eb80db44c8347d026324d88602539085e9fa9b51452b069889e3af1b6540a46fcedf2b404c70b23addf6c1d4fd049232b5602c2b85c779f01fdaad07479cf17651539bbadc7c507f3b22e490c936c299134199b98884e6dae8b043c699fbc78134e6e9c2aa44f60cc00e0590dfc98bbdb7d8eef3151270aa3acc4c00c0ae07513a396151f1887244c6b514d027da0d39750d51baaa026cabc31ab5650c99a6adca99d6396f4376ce5a02f8a5820ed9f96a610b26a63fda66e269251e82bb84630026307c9a5e6ac4d3efe0884d7e9d9b2f4130fc2520bfc78c6c9e4ef165400fd62f6e44c0bdddb67bbe55522bd3a236c50dea6557e83a31db47cafa7fd4cd9e1dd7329ff9d05164cdc37f9b337d49c9047b97b97aeda6b880069e9c6733c7e47b46feae0594e0ed7227930be9218da12f5e2afc3a60cb6bc507e0fdd073f335b54a70c39c4178d6d6ca7f7d09404c4a731a104e6744c3fec9cec3d58d9e6f54eb24738b5006adc469e38911a751634f24f47b7599f851c22d331c15ea029f2556a697472a3e5650885a4d3652d63e43a10603227e0cd04dda17a2a473d3be9c9dcd2149fd97765ad6d9af214b0c5e9ea8d01eb11986bb7be5e3d0aba1333593b4bbcd37900b4e2d609d98a393eccd229d4ed181b38f9f14039b6422a89e4afd3e9f16e77b2ee3bd8190af54604b5c93b0c32d498bcb919ec4b2a73d40e964b35976631de6d4f8f8fccbf65c7b5971a2caf3b22e34f26b9fee76f25c5d469ae1e1cc37b1a90f76e8ea0070134175949598599bc7c96610000000000000000a08e210300000000ae4e1b1428783875941186a872456f221e8a06c859ddeb0a0abf5dd227484efd76a05d9b5911fe1da0fc1c04d289073482fc37f63390a18cc9611ca5d7e58176c7cce5617954428d3601af4f2360f8ad849b8e2f36ded3a0ddd6d842cf28b0dc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f15750589f2aebea71913494a2fe6cb4ec73114e7e8e7dca18fbe20329e2edf0e45fcad142191181157b16941f3a9383e88fbb2df94d945396333aecc659cd2d8ebfb058b1f50cc4cbba5a708480320c96ceb000f2967c0fbf27d79afa480c3865d939268886c75e1cc7dccba6971d30079aa55fbd8eff34947b316179e9c9870307328d6076be38d54cfbe1238a8a23ad500f4d07d7868bc898661955887cbbff02286e8767a1384127e6a81b8388dc78eda47d1fceead2d5f79a5831cc5bda79ba0a020e4e172778ef565d814cc51c14b3086163448dd3e7a9eb1aa619817f67c9fb02d16cdb666ca35be6ec23a64cd6760bbb9fcdc3c4714f770a6af0ff616170500225be9747546e4b99850304e8b792ca27397c19eba48d7381a2424560f7d70c53032ecc09e86a720544885419ced15e3641ade211ac1d6b5ab01aa0eb1a9cfa7865032ddc87a0d4b629f8c10f6cb9e5e692bb57a7b7eab7391a9d3cf135ecf3f365ae0200ccbec8300f247b91161ef85437880b0fc9dd4224b2852a45f882bc38437fae031a0bace4dfb990b3790ddf7691ec037dfbdf0aa13e32cad48eee93909af49bd9b0340d459c8fe73a203848803ea5fedf86bf32ffb87e05a078b3d10c5528f32f9666e981c59495f14df4f726ded776a06ec9f749a2f4ce0f56bae4d25841bbc35e79ffda753cc069c3903797bf14d35de624e949d9ec15d71aea4e2a7f3fe3a082e60331bb417661f87e6f76632bdd943b249abfc2528fe6033f42cff1b710cd88e42bcf3246701a895c737771b3929fe8d478595a880d36c982c2ccf900dffd16d07f4af1a9723c374f04d182f9e403d5d8f8f1f86dab9cde7dba52da22b7576ebb65e2ca78eb2a45bc6349097b16a3af8508c35e272b2fbc3f9f536b38ed458b4e336a4d468c60c0ece2046e828f56bdcf39613146f7a1b376e65bbd916bb33031ceb33238117e4d498e5b9e05cdb2d1f8b4067cbeeee5bc7d97e70802b8fbe495ad2914d9f5d932b3b8378ea03d823fe289525169e4492973a475b5ab16017b4fbd9f69b4412df96a41b82bb454733a6053c71e32cad16da9d76e16d4f57ce1e42e96b393f15e4d20354d5202ab1b902538b50d5b7676b681451c78b3cc528b3f3b6b993affe54bb22ac36d2ed0cf506ebf1647caa5b8071594cf0e7278b20f358bf137463219edbc656e7d3fdff8917dcce1639fa64dbdc5cab104ddf0add1a77f62077abbf41db86e9183eae272ed39f31edd78c3d9ebbfaa51fdd6f80f6e5f034df728d804ac1a8e074a16a7f768d144bbcbf8781cc4733b66c124b21c71b6ef4215dcef2db683f8ee0660ba7cda4195870c1ee8de4d01e5e6bf6416412f3c7c17b0fd49fb6055caa49cbf47628761c3f637fde342a3173b0a205169bb9e4f76f9d2c96ee0c2a591f3e89115b5fb48f94d9579075c5b70ed3bb02738b0787856cadf10300bc02ead3f8037777de07ee43799b8cd672ba4cb7388f9695975fb4a272bd53236fae75c3f1408c44a1dfb8772e53ac0351f04608f5891b25ad66af20c634985dd1dad979a06ae25287db8abc3aed1c5077ac2a493eee3b53522531b0fa0d6c6b7c448e0e86b95b50fca565d7242b1d1fbf5dc2621b0d858b06ebede81067e00d0f71827429a2111c54a2aaa131348aa6457cdfe10077cd0e022ea9a920ddcc131151b121e76db8d7929fae95f69893643ca4584116c932ce3301f466224f55ac207775550abda2c94cba06d82977ec9ef177c0c65becdc6b2bfc9841bbdf46ca84d970108f848841ff4ed51f9fb536f39f5046fdadc4374727845adc025d366d024a172134e99dffa68f7287f70a3b8b9c2b11335b29951fc8ea773d3499bba8f06d91109e114fa869789b9db6379f2915842d9a597b7fccfd938cc909f39a73ba2b345f8c449c5c18d07a5d84fdf925e9aae4fc04715eac2f4dc036f4482726cd2e98b95623ac4af967804b27d181c7b97f0ece74c5daed36904651bd2a7895a05ff1ea9c336bae6ac300be11abfd4c0562a4e84a7fdd89f7fb6d8d4a9fc147952dff1763167fb30c15f9738dcf5c2c44c074fa059851d248335a2da30c47aa833ec9b13aecdb4f822deeb9a2599fafb5130be3ebdeee138c46aa24c95eb99c944f943dfc3e72edea8669f83e873bed48016e3edecdc508bac81634fa4fb9fcd1018a5d1b1ad284a163901255dc8aaf77697108ca800072a34d1875c60b155f5bfb8f5f7558165de35c82dbe8a079068d689c7a8b10e32542c97851c746b8d7e78e963ed5f9cd7ed88fea5f1f3c87032289b3c6bc2fbb1bd333294885ec42fd42d41a6936ec78f5eccd378c50f6e01f1c7ee3ddf5e83e0631d00fc31ef4a746738a07e0bae01179df6a018dff6b9ff789d53ab1c237e034b9522865d57d93a16db846cdc8a4efa8ea905", "acac", 0, 908736260, 0, "99e65184803f7d322f1c76a99eb8d7f31c2c649eb1f3ebac7b59238b1e6e46ad"], + ["030000807082c4030315f6be35e6573d19e08fc87aa9953e8f17e7a077ec964b805c0baef23f21e9a103000000009dc1d8fd3aeec6efe5d1600db184584db052fd4aa3d40f3c97990186288162f363482ff000000000050065656a52ffffffffc200b82e975f6a49c21be7a37da28839ad006326177665b808ea822699e8e6fa0300000008535151ac52acacacffffffff021e65130500000000026565e510ae0100000000056551536300000000004823bcb1030000000000000000c4ce8f000000000022f1446abffcde5780d8b792cca88903c773f9b33de99d143434a48aa850a2854fb9ef0bc5742947af49615335a331b4ebc61a150b66fa4687ccc48f9f47514b4b5075458d7c825c02a6e8daed912312928b150d60124b1dd19f6b639bd4bde600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000edea8adcad6057057ae9cbc2e2ee93b9bc776466fdddfbf8ea002740bd36c284245ecae5013ba23971e74f9e2e5d09eb41d0f200debd3364ce0355b15eeecc1f655e8f8d55cfdbd3118ce750c53bb068ccca6803f3b250cde88973c72ec96148588edfe7fb7dbf00ef1fbbf7e945f64c24fc035bd43c7c9048a00ec22c9b291702047c5c7450493709606ca709c54292c1a6f8314dbfe35af7c8b42a8c8b97bb790204545c225ee70aa0c5274d369355b1429cf48f1b78d01cc67983072e4d3c65e50b08da65cfa3b822876e016ded7b3c1473d94765bc54ef89256b06b3eb1d4f9429e075589f119ca9575fe3724c07076c6a882786da1c84dac43dfca5b0ec0c8d9e022eae18643c5e41259ca7e34fd495b5dff0e3700ec2a7c77067106366b52947d1032e76592da4884571d76951a4242fee72b776040b0a40fe737fc8ee6e5e25fc890207d8767cdadbf6c409c9a21249600301cf0e36a51609883072fbdb31f9bf1e650203159731b80f0b872e729a17d07cf5eb324791bc7ab1f96dcd6d8a5dab67caec0320bff69e0db5b0d04947ae584524fbd895896374f20017ed56d093abc0ce00565eb122e995390239d1402258f7006e785df7b6311d4b31483df5a249b763d68810409d5353f7d71a6e749a0118191b5cd082d27e51139ad2766d9e5b587a8c55ebafb89474fac62fcff98282b878fe2956709bc40ef114a9f30219aae987e2117c9001fc6d1aab66c0e870bbe1ec74a80610006514f9a6d32234e47242819a2ed32b0dff47cce274d3f048ab17eb20d2f5ed27f79b6946d8d15695d6e8bc7f053bacaace7429abd58385bce1658f555699e7e857c61f633adabddcd00025d8c0052dcf5429993e384b78eaae2b58686683a582b60d52cb80f7578dc2757c299cea6481181c4a2b6c905d8ea9c0316fc41eb5e8497cdc43c692c515746c9c6ed0e21a138bae405bc82cf631160b7de9083a4102d8b5132e32d17cab07a05cd7dd1736a6a6c38ad8491243bb16ce7afabc84ea1015e4c788005ae84fe9367693f2cfa228c034416d824bba2b715796be5739f5f045032c52e1f50b5f8d653e6d89c0168f4085695f829269cbc7abbb55e43b535a4f3c1feeab763d2eaa3423b796283401c35deec9f310414f9a58d0bbe82e6b6474592e7182597cf6f8f13d11ff5ca4aa1af9a22e53450458d2659d05706f87ee96350b336c9be88f74bc9499428a03877a95ab0b00fc6c1ae01be17d3ac69f528c857b1f6c782c02acd4a3b6ddb93dac8c643b21c242e907ec7abdfa3d3de60d2bcd97e31b64c388a72a156d4a1223b099b3738a7186b880caa64605039b09b497c3229367290fec5ee439549d6e8376e29e9ce8e72f13bb5f5b86171e0372878adaedd703d3f1db6ebba06a38a1496ab496130f8a8812a60794a6e1bc1548bda51a5a2195fdd381cfc0d79e0c8f9434d45bb6de3fe3561839db59fc70f79884d5f35ffe2e8d3179eae6b4cec2d88f84d1a37bcdef6a6d4c55cc3d73df730e4b7fc6d02c9652be7bfa47f0b92a4d7b970649ee2330f64575878fc50267d979878739f86af44cb1739451efd4c8825db3aaf329146547b58efe496d373db147c623d67d931867f5de9f3937cb1660328368e4f9d0e31b923270fd2a3db28f8a10d7a13424a9d663c5a898af16c141682b20b44959a915a89b15c788722410b983dbe81136177c56c28eed4c7fed960cef4d0814c55b6cdc9bcf53777cf3788ad6ec9ed4bc0014de32862b0b0898f96985431007ff918f1adff71a19fb8a18bb7f40d4e8c42173038b841a83bbed4073f79af191eff9b044c1205920530d31bf89d60f33de1893733009eabfdc787780479c6527ae80295049632f16fc974aa30c963fa9e8f70716e0f1b2a01470164955edf8550e28a441e5aea1c044b2b6bfc9e8ff459b15a48af23652a936eb4857447f22b7fb77251b3f086f27de37f032c6f01be33b08c6859b66dead306e94658a40aa836653b134e1078bc528b370f0689e9d04fba725ad9b76185f38afd5682f7ee2399156c7d62c2282938c869146aa961241e2be6568d8e8fb6bb3f2ae6c43462b74373f72562a9a6a995a0fe6e8061d840b44018104aa944d64158e7e32b01ffdede3c3adf815f11bdcd444e81e265370b1cf4032aeddeeedeedad4570c2ad8600e01a270ce7871433c7a798bccb9299af6aec574bf13cf62950a9be90dd1a52305bd58b6136008c8791c3e53a4e23cb7c9e61774f895e83baa9543358b2dee42e2c7988056cd1d4efd235910a20000000000000000c1a7510400000000142900b9fd2d3fec5392d9aa322e840ac584a4ffbc6f32eef6cc7b9a3766276a3977fb4d852278c2c99139e5762d6161df51ab819a6cdcbcef3988f071827af72a238d3db87dd3e83d6f9b6805829f70e570cb60067237599cb37e944e99a71500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d650b7081a4353d0271b1571c987fc291fe46cb44af20fbd80e5266445c579c4bc5020c6c77a91faf6015e5e0115db45f76d8f4c3041cdaa4c276df589d4e406b8c82810109f236d1a7b1c7ec8a74225b75a578e83977bf13da6aae6f4c35dde1f1e87b33abc672cd48d1938ca40d24e820541b64e8f69985fd326f130cc3bd90323e7873c249b4aa3f2872590487a0d255da4d060895fbb37e2c91c8089a11798020b450a46d9b087280a31eb66fefb17b646085d651280836617ca11f96b4496b60b0579f67e029ceba6fd7e599bd300472b45fa44f4a0a93f13c83426f7d2280d5df7226779ce05f91953e6d014ede7f2a703b4610723a9c827e54c79bf888ab0dd0326640866ee0d25bffbf9fb01bacae9cc80c52e1460a728e669a3824683c38bc50210c1baf830c57956d60162fad9d2dacaa9d753d5c980876099554bd51d982af102161bdafdb40cba9970d719f8c1b4d115463c7b1d19eba082849f2e455af4119d022335ca392922d1289f97eb43b0824f5910896ff6e1925b539b9c54fddb35c6b50201b884a3ccbbc5744ef32719407ee5981f5fea2934c8ca4fc83abd5beef9641c3a5c2be7c1434cd056bd8663c5ae2df2f616cb79f590c20add43dea0de068a88632b4a2cc97bf05d3d3eb6b0f815d29c9f545c8adf25d44be1a76edeb554790f4fdf2b93f7526019860dbadc004abd0bf4abb3252e17229059924c3d3ea5426f97fa9cfd2f95ec3da6231572eabf7d47b425c410e957588ea5ca07b25a641dec18631b90980da505d1f6ddd20acb65d1463bb9664842b7eb1eb59cbac9365760d9a2f5363473de1c7d6dea8d3bdafb1120281e49956244d4af2014b71708b2dc03ec22d476e24a4fc6bfb77f2471da9fcf66cc88d9279700fb1d8fd9c5e816cfee8eb7c5868a5504ccd25597ff6f6c3282d5ce344f43f4baf8fcae292907d0c26a4099e66e81d0e24f1a2d5a114fd4edb62ec47efdedb412c70c2b7936c05aaa5ea075356ac5274488bc719c12b5ff3720fc1af92444d1d5ef8fbb4d9f477bb0d0b642344b2f1e074b52a67071931c285bc9e0fda7f8f8eef2591db5a76a01d5ee754b1b16af61803c78f8d67880a1d4cb4a21515a86071d4ba85ac1e8856a21c1860229207f98fde16de563932c7f77b529498f3dbd441f92b200141cf1b9e9ff42a4e4bfe17b9fd38896c27da4796646a2dd657971551716a52ff7c8f2ac342d056e08591b67997a20c4ca287ccc8bed09b0adff0df08735f185e97f3f89b101420ba0703a72d3ffa8334395a2ebf93890a9227d099ea19a5993b85633ee8905e223ee3d55239534bf8a4f7f18a752e7535cc5ea9998fbf09e826f129a36b5e9235abd4210fdfc32e82af8303d980392ad13875cdaa4fb0c03f5ee157c6ea12af430b706da03c7a3ecf72fed4918a3d492400600e8e3b3e481415d69f283b9d5e10e300ded0ba1cdb4d28ae3838c98f080e5d4860249d5de209c0622fe2452c63d39286ef4d46a102a48b9995bda2a851980a93716e79a5c4695f19a258036fc22b0c75738b891d053f535d4eff4dec9b392024e3abcf936e71683bb1b8a508d32fc6c4d7101e3e1284e7c7466de24aeda26febeaf069e12624137d253b53bf0064bf81d7902c59cc39828faed0264c0d66535710a99f2b2cdab69bc5f67aae62f49581442918feb19e9051100cba72ae6c4be11a617f4a434d837ba59d0ef94eda1cf3f9fa025026080d6cf25f16e6d3b6c889a317fc989ca71a5a03ff7e4d2d5f4688c29dd949ee28760ff47e09337d94a24a3e472c26d62d41af2c9118900b6d80d676d27f0fa2503367e90e195dc0e386e4cf9efda22f306e9e8814d99f303c5f599768270f962485494493ca9800316c31d30cec356010a30eef91e6691309c4b1c4188e61b45843ab8c9b9957d44fd4e8bb531629e835b0977ddeb9077c47eef62b4c6e76ec44345bba5023002b76b94d0323dd9eeb546f589685dd5e3d12d5b9c6e5aba551112a6d60d86496cc91dd609a654a963cd7ebaf4e6f092ad17bd405f720499b7da5fe6f7abbd77a73734315c5b22b50e0eb88395e6607b10847aaba538cfea1e08a6882b6643fe559f056f73754b4fdc76e51d896fd351e9b463f7673eb5c6097bf3ec1cec0dda4f4427a59aeb9baa41eddfce520fe53d0021c3cbf9364e35080d0d89a7d310d386da726908396fa87f1c74347a74890183749fc597b98a10746758b29ccfb23ee840fbc8e2f146bc1c45cf730aa4bb5556f146b6a19ce2188ebba36eb51925d5f8f2611bdb0100000000000000000000000039955d806fd0e55e04a0a1cf237f536ad412cc2580da335246ce1991b2b5d3a632f439a46d84894e57241c22695daf752fd7a06ecb023f6d2ab1dafc4020e7b641eb210ef381ce4b36402c6a353587213cd1b093c563600f8706c4e50d7900b1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006c6dbaaaf607051e7cab20e0ca2a98f0ff1e05a484fc5034ecd012f3c42410ca2ef5442883f7c65f7c800b616b44299aa0bceb879554bd8de001ab16a6d81b1d00b11dbc6db58673a9ba329ef9bd8a319b4036292c1917d710af5db4b7cd371f8a6706164cf3a6623abdca1f50f3564eaa31bb9785090b7924f0e53c56bbcfe102079a88800e852e4466f4d8589f5becd2e81a5eff079797c48f469d57d5f943e9022b3a70886cd2008f83d9e295ea7478923962cf93284c0bcf3bce50c6f5b4b9210a0699366c37da066a066c71bb577ab794b36c49fe966dbca902efd801c4760dc4794d6f25f45f7af15edfca10b354566c906edf3eac436944d2d92102c6541b230210b6a58c9ac8875dc9055a634cea490ef455c864a7029d6a71b2dadea1ae0644020f3e03e3de038d26d13fdd9c6e9b38579e3025b4ae9567ecfd8d76ff9a6e18dc032ff97807b42031b5ea2d051517adbd2282cb92f92852917aa448bcd1a33567cc032b8cba1dae6e77fe93aff4377dae1290e084aaef7fed1fa9fef0c7c951393488020f34b3e835b67fc7d09245fc046d221046ef7b9d28e0145b8f7ca1fd822b3465835809da0ca97cce1e7b9db3b5c23e198c90b8e7fab1e30059d6b15f6b04e4689eb5fbec81c88c93a4ac55b50a028325c7163c6bf2b12e2f851f34be5f4494e5b08c3bdfbddada1fe6c780c7a32630fac06d0e6489ef5512909792d9f3e91067cc33872d291424317647384b74aef34c063eada13e723752dbaade27b8a39c0e20ec02709bc235557f3c2e0ea6e66ccb786c2d62d48bc9d3aad3025bb5bb706098fc74ac9fcbac9858a91feef6a9a52fdd7ed260cd330c73fe3e2bfb8f0205f56d3ef6bc27625029687e9009b6e220c7aa1c00b61008afa0ad460ded3dc20236ce9bba98c6161249c6e32de1af5f17d275ae4fcaf170d04f79dbb40844a4fc97b211648d929d5f1b70828db66f3e79a3bd1eca2f00b0592e990be1d7c03906eeb8a9050884f695f71b68acb35c3a35a667278f68b1dca573dbdf2ef02fbc59e37b99aee887fddcbeef0b014b6db3345b55cb24dc9f4a8732fd131c6e925e27690637743a81d0973356a36544b022628e3d8e242a70285f4d39476b3dd626090ea71f8cd347399879aa968a5c6591320259216c6579462ea8b52ec690539fd4a731b95f73887008cc7a31142fe4c7cb47089c1b472cdbccfa97b2edfb21ae65b5b9a9149611352f0a6e4d7218b075e348fbdb6256b6f0063f553b4222c844d11464152374b679ee68e862ade0aeabeed4ed7e5220ea5570ce1c37f14f309328c8ad5b6eba8828df9dd330cb27141540417213e26a76b74d2741b4dbeae435c46d0f76565a4720589ec0302cb5d9f9090774500463e7dddddb3d8731a4852092fe9801732dc3536e7dacea88f9b1a3dc9ac7226451d3d7913ba9d8c764e7fd7afd3907f064cc70739dac2f444a5762bd941ad345d2bf9b8f4dd8f998e869523ee398eb84512dab8673649cf649af6b9301c862399edb72c07bc19d7dcb428a29af8aef8bc42bff0847a3a944c59c871a6e365f2d1f8ca1c745231201a1b8bc78dddc9883ba5359e62eb00c24761bdde6e6761696e04ca565de461704e67697d3aaac892021c6be37edacfc310ce880f6b1aed1293c20926d08fd04892c84963a8fe8f31f8ac60e6543e1c95439edb85121fd6db023cc37495ad359367f86e80ecd37b499ce79bf44af4165890990c88d1f751643ad8e81dceac137f447f1b99e6d4ac644f7c15126ad2d6ac22f52e1c9712fadbd9af06a243c9b8ad06ea17b32ffe9a0bb5882e05d3ee3a80d8d06de9f78450af2a32ed617bc365e2dbb8f5728a0651a10360d909ee3532a0a7ab575f7c3b2d18d8f74302e0a2d452e6ab9ec8da197c568d32f7d3d789d99e5814f38fbcf5d77abe1a0ae5821efcd9b71d3c699576954a76ea1daae5a348f64b69718fe1a91037ad67b0ffb095d0421609058c66f157976f6fb15caed8d1a0f5deb569140b797557aa5507f42bd8c2ad60e44186f277925c1ef8b3b23f1df1d62e0e0b0cbb9b489f8aa24128a6042b04b95f2b996b6afbf366eb1a01b1433df3162ac36b6ac968792f3293ab3877c9aee46046afbd495bbc167667e6285ab1ccb8919ab5d314e4a6f2e850b38061098c979d6a486bc1ecdbebe3d7498fe99cdca871aa04286f8f965035ef2114e5e45f8170d4d7d98320850eb2888293179b120eeb848e00b6884b10253daffb899f9710af060e498b33536be7ca604506c6063abc1505945512576e59f4aa116db9a2f2282f37bf48df413e7706124d59dd452efdc351f5ca7d69fb39d7f7e16adeb067730b25dca9535ed1c6de6546a89b80f8e37a7c0960ba6f879611f4e6775d167faaec3c3073c67d87da01756425f48663d45c0080c06", "acac516a520052", 2, 1491435231, 1537743641, "4f9aa955d30ad19e6e275e08a8f010544e7b4ac1b1678f5ea2f671c282e7e768"], + ["cc59220904ccd656f82d14707f92522d88c65aea5137f4260a28cb8d3d3d51e2afcb730fd50300000006525152000063ffffffff0a6d5009d576abfda1b32032503b7e31cd57c252b46542e33de6ebd53c60e38c030000000652ac6a63636a6b82dcb55025c0c7e8e8fc86cbda6e01c4a9cce2ba6c6bd6a45099c62197c38afa6fe251010000000752ac0053515353ffffffff62c0b3b0d20a8a48ce889b9956d8753985626390b32a7e364c63a79b9b290791020000000765516a0000516affffffff0479fbaa03000000000665ac516a6552f300740300000000040063525206322e0300000000036a6a6afef8ac0400000000066a65ac52510000000000022d03ac0100000000000000000000000005e1707c57dd9195b39bd517ae8e45d8aed88dbc75fc65155e1908310027a9022df0cccd0e247dd498470fcde884895b5c6729290b1d29ec387e211e6b28636bdf60052f87b2edee64cf51440ad0276f3a003b5af74b23897c5ad01c2fc6d6e600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f283db789cafede422b456a961a141c873e8fd495b976104a74773ba5f4bda15fefd1a9ca2abe212b6860fbdba83257885f4ec360d67135f0dfe6fea59197f64c186646b59662adb811fbfceacd1e92661312e051d3fafa60f3759a8f2ef7d6233061e6134cce3d8b23ec1fce50f687c114254f030fc6649463eec140bb2d225030a8bb5487cbefa323b6000bf80a3a44f32d80b446b48a4e6ea87d16ecfaa28b50322f79ae6a1bb503ec9d25f3bbc38e88dc0d4a723c7e3f78dc54ac5dc02acef130a00a2c105444709fb33c12b574d718adcdae9be5c86486970ddcbc6d8577e9a60be36b841875bd3381d4c09ca8f8f2af96089d22526c6af025431182e1244492803059299d7d624e931ffff19ecc409591809122a747ec96a19a51d289388bf76df031cc4ad1bbe78bc19d5321c6e57c04111c9402791a1e6a7ea870440a7fd263bb20322faf97c389c5ee5217e0c38d7c6f49b1dc24e6d13d5e45bb9d6c30b094ac4c1022116b9bf7cdc602d92ddba6c79776b440748be8192c61de9a770b186f37f787e0226a86ffaa606ed6d1be3d5b19ace53240f28db7aede8cc1fc79b766d28cffd43517c8f8e11c101fd70922cced439de41b594a50207f576f86b31bf441252123ddff92da811f45b80b67507dd9d3c570e27c3ce9c5cdd845f18566c181f59e756cba5f1343d5fbd1d38081937a86e7c2c857ebc075e6c37f93b87bee9d50a5ac326334146d5b6a888f7e48f289d3e03ef809449d911d8a6e220be4061073e7d0bf721729e7f64ac3ecf96f4919db9563930da1846e2aba731ee59d2e7aa68b5222ef6ef157ec3357063c7f3e6f18072b906a6cf19024835eb8d4cad0c85b35b8bd1362551145477a98d19fd990caa70861c09fcf1ab43e48d518a5d4b9b5cc847ea689ab6a68908cabdd4c3c53a0d38d5701188d9525df2fc79355a76160d74ea003435dc4fabddb76830698c2dcdf09be24dc223c99b3a819589f832b0192dc64f1839376143b583339e87bd363668e4d96c6fe04aca9406ac5e94e1a31398e6d780b63913629b5b4bbeb5c60e9074fa37737318a74f0c9c86b04e021a29f8142383fb5d84092a4c5284c69180bf53073af753ecbe9a73b889ef415309027597296378ecc5430e00952a7fec1c3d9edc636e578603f27cc76914698be3ee7d8c86f8466d90f17e52d10e58325806386d8b8b9eb85e964e50ca36009c01f25edd3d781576cf1b132dfa0d99ceba7ce1c9450ec80c48c3ec83564aa8ab0570e6c1a13f71d0c49afa95885c51596c9727f6b4dac5fe420e9a2be4dd160ec676106ba2978e8b35b6ab33464ce2c354cded276562e148cef51b4cc201b30510a6acf5ab6552a269b1c2481de7130f018ececcc9787f3db17f012c6e628f7d9e459621392e2861cd3e7ab29dfcdfcb0bec6a74ca2fe59aa83ec4ca6d11f44b1579d77dbf88aa1acde70d547865fd2dbd7620be44598027e9db984d12acd5540863758096c700a9061d1660d55241c8ef93521a32a2428698778cb3f7fa76f22c8ce673f4776bfda628d809597af6baa5450de435331bdd4bb43c4c15da08d88cdbd7582abd3d560c85f5602eacb99831225549e1de2148a5ccbb9734d318df133aa6ab526c2c5feb524899da0bebd53e929e05fa8ef018789761a7fa90c1521183e330feadb277b87c703b05c1cab434a4b3d2d934125a0ce8ca84d5c1ea4c32d3032e9606ab77ea67085a6d42933521119d10667aa07ce736a66efadf51ba7c5c9a46e3658e345591ab4e7c6e60237ff906a0036b953be344457b7f66802e7ed170b83ea0d5a8e76ebbf4ac18d596e031f218753f4c2ac94ace90ff30d8ddf3b5ee99270169ec1a21ce4fb3ac4c4826914d864bde5290dd7fd21512e7318bc4c5dd88fe8eecfe221c261a9ebc68c848407bcc7ef10931ece3c5b7bd1bf10e40a2b2c7e0e2d055c24c70f139521540c163db4256bbacc7288e76f7dc0b188cb51a95fa1ff8c857f98488e591a303d30023852b7893e97440853c739b3fd0275fbb2a9ed0de6c2122a39c4f3111a67e12c4ae2b836dedce120fc9e5f359a7649c5c7200887c02d2ae84186e3e7a4f4ad248bc549022662a0318f931b2b18ca800eefceaef4a62df33ad340f320012cf489f621057417e1a4111240fcfca25461b6e24b1f930eb06294f0737f43bc1177aeee43ab439c876252a155fa408cea4ae7872dfe6f41864ca650962c943940eec206aa4621c0858c443a9113bfec3c9cfb4f48908268e53a66107fc7bee1969b7f3984dc468e4550002000000000000000000000000929e78f0d7df61df1571f5a707d89c6be8ecb09d4fff9427ed89e212bceaf4522f784bdaf2ecf52ceee921962a61d342b2a3c0e53857018bb446f14223e883a02473779cabf0fb8cdd7b0ebcb51b7108021881ce300b023ec3a8322f7cdcd33100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c4acca77fb1d6c140800487aab98ba15f7c69219ccc8da01882966c8c54115bdf3718deffc90567f7e10cdcf6a244daf25d4de6b7b85ee3d820d3031a37e768358a54698df04b6cd0f710bc1f2b521dd9524cb0067bb6133771dcb7ee317410f76d839c5079054118a5df1fa2a7f02971d2c2e03876bfb1abde30022035c997703172dbfe0347757412eec17218c39119afa9d33d5cb3e18e7cb366f2c9dcb750003127792e41246ebf058df0e2f8658e812fd5be4265abe9e176fe67508b9782b460b086202941b47094a708c79d54175b0c3773f3353046a740e3bec759bfa03dc84ee681a7084cd4fcc3f7e9f8ca544ed2918b02c8b35a00941e3d344587369984b021468bb1e920b02c6434d992255b41da5f7ec232da80f3b5a8c54d5726d0e63ea031c341371e76301880225b82caaaa0df05350ea15932432ffcb6302e93da144fb03157da5ffe1d2a02daddca602c110706ac4005e8907d264ddcf57f5e08974c088022ee8749cc03ba6ef99135239836f1ccbd7226b9f9353d7e7f0e6f30dc3a2327d022e3a283ce60075df0530100103a28f8983b9c25b1cc9a278f81fd085eb2b38667c3fa4610076d9e1f575f9196a50fb9e8a3e36bbb86712e63e47da95905f19de6bbf1a15c038167fe84a8c73b50a6517e196a7d0b3f592f85746ffad736b5de1104d1bfe7f5ca666709f6e49e98835759a0fad7244459d0c27ae5aaa140f4e7ad54e277ba942368dacf40a5510f38200bf5963fcd6203306066d6f436e72dc8c1f677a4af01f294a32f099b7905ab408a9c2d42d60afd4a1f2aa4938ce8010f4e15425a4d2649132a34934be4ee93afb091461cef2851c57ba8a88e44b9e243d30992a084e8277f971a777cfeff8e040a8ba0a9e6578d7ea80e947716bc6afe9840035e9405de8ca4150952788d13bac14ab168cdf3e3a976486c2422694e2f9649dfcb2170afb66b0a54a1a98e68d07def9201cd114597507139e164ad26915bc74d2da392ac576b9830cf4d53b79e38e6f602ee2a6f96cae72783cf5ceaafeceef03937640f0e29404caead4becdda053951ada42d18bb3a2b2dd25efb7f640a5bf9a44c0690b6c28b936d1375c73f30af757e13984f41d03709838a433e547358bd2c78f4290b70abad1febb7b6a0c4ff72202ae841a78a5723e5fb48c9d93fa54064885a6ba296502efcc0e0051b781f767bcc9ce983d72aef1fe1cd2ed63c0d408be4b45734c8cc8ca27f96d43c60e63c67c517ed19398dd8402573285e93e7e282a180733e2c71440385c37a60e8212ff0469b69ad65f98e9b52a94437fb8bec958f05eff6320d6e0e1edbcec7193243f0f98f40d84b4488f95a73b1be1a75cf65f94741c397550bcc2171c2e06ca8e11512462673b659e1bb9cdbc4db5f173475338b8a9d7d66454daec3882697fe5496acef101cdcb36d5ff4a4d6e270710491c6f730fca8dce1815cfad9ceca5792bd8da88b62ef41c20811418bbd494895805cd4545ecf00101824ad2f2b1bab71d9a05a2c3a4c2221f724b30aaedb5892180bd8218260d610a88837c62bccab9a0e47c71d124bc3f8fa146043c394442cd49b74b6cb836684a80ec6d75a85fd219449289eac35f32227b24b3f4e83f81e7a2e3fe61ed5cc350c7109ccc3741f4d405424aa0b25471d1be507b82771106679f7dac3daa00592180f90c2ff0469293a45bbc2e08a506005d7d0be8f60aabf044e6a73f9ce9b862fc2bfb835f4912d1afd73b4457f7021f0c7cee531b601510b39b15101ce9246603c258df57ce10f56b71f75cef1c071154c72cb0edebc5bcec6967e79370107ff9146151f4bc3a3b5035a86c381b51aa868518445b7bf2556b7328bb7d3be8a1e82778d67f43c2670e9fe7736f9391b23533ce774d923058966d9922c3737caf41b607327f5cc6b401c41796c9fd96d5dc7178c15a0cf5a3d29929016c28e2291585535777f1763352344debc021c6f9147592e67fac4e29f0d1a5f394c8fac51346a3f9f83da9d04fa98463c6476fce250aedf7b1d1116dccd17f5eb66132d57931d2ae22963b225c8bcd0e63f8a0861db7b14f173927685f88d755c7c24327ed8b413e9bea9fb0e6deb18c6b3d03fe7b03ed24c71cdf4ddf4764c4c8c3c063ade6c0836fffbcd3d3e10dc06c8b480efa92afb6cc59c7285dbae191eb89ff694824adcccfac7eeb9e9592baa9988f6ead93ffe5cc55544cab21d84381c7549605931f6145ea284102f0ccf3cd5261a95984c7dbc746c340363a250ff053161a45c30c6c3dd28311122264a5aaff3cdc6eb63682af511ca3d51ddeb0e4ccd7cb193a8d6105d68cc3963b082014b10fa2ebff1de71723c3acb118757511a551d0a5f03a496a55498dd53e521665c65087ce308c3e9b625e6720b56595a0e8a3e92d5c551172b02", "635252516a", 1, 177775919, 1537743641, "1d36e841d2bf6d2a64bcc57eb93475550de48b0b64d56ad8c8c5e78e9be172a4"], + ["030000807082c40303af03c103b0e8eba9e94db6b4a2f44d686ff87d4b4a12b740ad24f38608f192df020000000465535252030cb204ac1c4c94fedbf0bf10d190af06d5ffa5d6b1f21e4bb8c04cce5acd0db838a336010000000463530052ffffffff56185a3592b1e0f6f105d3689992833a2741b7d794a1a6c6f80ba2a31a9e3ad803000000086352526a00ac5100ffffffff029a0f1101000000000753ac6a635100535581c8020000000009ac00636a6a00525265f1b9b065000000000172f24004000000000000000000000000e69841e8baad00fe363fb79aba11d6a37db99ffa8cb99ba4b0f38dd2f42b8dae641c134f75ba4ab5514fd2c3a55af89bd8b8c69ff5fc3398cc4e2d0dd80894ef2f00b4d90d7d8ff1e0c12ee910a08d165fcd315775be381489d4d586fee0dbb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8e324250a058a4d802a3b36a6fefa7796cf0d14fa6b85cb757347b661055740e0ab2120f5b0270c66eaf0a85d42440af001e9ef21b2bc34c47084851719cab44f390e62e93731c543712b3cdd68d95754dd3bafb7f11db4c7f7b4650322ae28af6de9aa8675b55c5dccf9205f59467c3c81a34fc039873cdf945f84f3bb1571031a65457ae4070aeb072ea2b90b35a89eba80a3410c641a0efb363701b7b31bad0321da1d1f372f47c78a728cc49f80d7a76d702a6cc12ba3cc63937e93a20eb6a40a029d9ae8a1cee8d55fd0a15551c80669ac1689d999e9d8e2b04930dc54c536c5e937d000cfc71b66916830beb30c5f949b0bc16b3ced58f3fdafe25f250f9cb103248eea974253de6155c5caff2aba6a7b1fa20f9c1136c46daeb40cb2570517ed0221ec9c159d038512f5745c7eb28ff2971867be63175742efec4e3bcfd9c5cabd031c5d26fb3d7c92e0e5cb09342bf02bc54c142b428b0179f2748a173dc970878f02177ee87d1bbcf6264d2f0de1a1628d5ec4b7b17b2745793658ad7e0379c8609b0224b26346389a9b5314ded8154ccb25d5c9b04edc3aa93576f74b2f534c7b09b0d7355751943ed45134d9b61b24eb0e5cdbaa3598f21b99f8e9103cbf8147460f44d263a1668b4948e99b979dfe4c916a3c9f4b18469037f2ef3de58cd3abab17cf69350281507668a87cfe971cfac38334f2de04d8a9fb4d9d2634283a3c101cb43f655925f9759b45771a177733a379e46aa88392233e580078a0b812ad0108f180a9eeed9836ea2bf12bd2fa5ccc6f2ed543dec6f9a54c85a98471cbf381079613b277b2cb3e893cf7ad5ef2a4ad375651b52f477f3ff524b05816b9fd970ee05bec083e0bb71eb4efb87efc13f5df3d603983497bb275e8753cf98cc7bb27c5729d7be8a491985f7b6c070f7e41b5bc916cba9134f418b8d94df68f149dbfb1fa3fe831dd044de6b063a5368580b4130d0b62a761f6fb873400926967ea3ec7d93d8cf7e9233a56bd08004edc41898c5a77f800d952c992e0f4a6da94066506c8fa0f9ca3ba27192ed4ca7eba7e9095780962a867129c5d1aae17fd78014502ee277e8b46f77f9db4a6d26b9ca8b23ffad5208406668ae5ee5dfe3beeac8c3562683b77b1acae776401b02bad1b5817e592587962807977ce527610108a6d6305407be8f2739b2b7f236c24fdde64431e1706fd950de9cfa372ffd77fef2daaea563f6deb21834418e1384cccee14d3b9f583826fefd37e97066f7833e89069be6037458fdfb2aed7838aced24ebf4373c8761d32220fb8255792bd8ecbb92066a29b17ef6a531da80ea58bafe4523fcc4b569aea867fca99a555593c293ed230b158bb8d220a5858b43d6b12fd9c76154c04d580d3ccb772db69b92ccdc4ab93b3ac5dbb70b7515892c099834fb76a567edffbe5dd714f3fadfb73aeb41041b963dcadd77e5e73f8d50f9b7e3e98aca16c695960b2ad1f9ae16ea565ef937da0fe95807dd5635483a4ec77e1793c4d23f9a817e3e23fa573d6ceb2b6ee5eea948e370b6659fa7e9d541718c727426a1ef34756747f1b8db6c7efb8a3a61c8b1c4e36ac96669a50deba8f46e8938762b2b42ee1af33ea72cf868e8ba6a2f9144969777a8b15ad6427b16015e648d7f09810c804461e4d761854223d13604337de4b2f79afbdee035f5c0519542451a6310687cf105d2f762b93259c6bb977a8688c8edb54f5c9db5cb5d55c22068698332062bf8a2ec7cbda58a591f7d7fa449e760227b6588e3014bfc3b208b08b7ecc29630d9ded6e463193242676d148a7cb1e805d438f91cdbb1c03ad16f48c781b973afef0762d81acd33c275c88e78ac1ab814d454430180de0e72d3656d9f0edab8dccfef398dd801a6db1eb467636f8978bdfcd911a877aa1383da2a200df9ee168bb616de26eda25b5e8c6d92d2e993905d4672f8a3c8ee37c8dccb0b137125cc275198f8ef6bf4e323f27bfac4e3b5fe3105589a93c999ee1f41e03351fba182960b6a0bbe91cef38801ffa52e833bcb3d93a6eadd0e4ff755b371216cfb370b1e2903c464601e30d1478649c38a2229c3978a41d740380b41e8109a8855ef4b1e7654fee9ba483fbf0a3030d6bd9b4aa4b6ff30f7b120eeb8b5aa7ecc9006f202c11f63b7f295b22e4b5dfba64eb220534197d70cd1cf9225e4f1ab0c0bc08245ba71d92e95993fae33082fc8ef6bfa66bb4cae306bcb397b9f6603cc902a46709ab9f4d9e3cad168693f44a75705f0a5a5fdb73852667d69459b9daf240ecd2f99c696466e7ede374705be16c7c87756b11896c2442e8d2128cfed0a235b9c15081e39dc8eeea71166cd8f463b728dbe912057214b245b61700813bed19031016285ee2e7a61c52c886c2ee127730157240dd4f07b7320b727def004c01", "526aac6565535251", 0, 229156274, 0, "979960a8f53899b5525f889eb23765d5824a5fca97cf093f7e3b209834c14e66"], + ["6d3dae7702f78a419690d733b5784cbac07847efadf8984e163417d6484c28aaafa54ebc9f010000000465510052dce4f3d7b99803ad030c778b941a0c0f82ac1aafef9dff75fe13d47afd0bbbe40925a0890300000004ac536a65ffffffff0108cc71020000000006ac656300536a00000000010000000000000000fe276201000000000da654580b3a07698f9d86338268330c12091d5dec4d0a0030b567f0f05d2ada3fd28be62cdf2e716e1df522a51b9de558df2c6d4b51b8cbe2e8f71b8fa7f1dbb892459839239da967b48750a8ae4c756ef7ca4ba60797c5e2278db418c1ac8d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f71d4f3ae1f5aa696a7b558638fbf24c7d67953b096fd0bb01becdb210a59cee9fed530e37073a64d422767a85b064bc1dcd763d7e786f69619e884d2a2c0ea0e5c112d8cb73fea79a00825061f92fcf1ec3cdd7085f532f4c714b52fa0e0282d1ab2fac2c73335b8a519190097d66125994185be0694781331e2ef401dded27032296ec75d82149d1045cee4f258c45e713f7898d82554d151b094a3781b96b87032805fba7e6e3e3492794c7210398756f4ccb7e60c10bed5d3d54c62d4bcbc35c0a06a08b3a2724b03ea7f46fac5321ea1f6959001c02d3932337583787e6b57ee71ac2ece5c32ac1b9f30217f99a8ca4708a8e3ce66e5ea2d460326220db7ac5d7020ac74bf38cd5f561756cc2d39dd0101b99ce10e08a36bf9d3b17071bfa5cf677031841233f3eafcdefad25d1a878c2df6cb2875ccde2e9fc09e5aa77451e5e4a34022df5504ae831427946d69d00e7762a88abfdc01225e8c56de4c381e2a79eda7d022e96b1991c08673573965532c4bbca668a11523de815dd72737b3c8d02b9c55602021a8d0de77e1900cc7f7e52c1d3d1d10320841a678cd38e21fdfa7a29397e4e2f4f34ae757a0308c30abe3084a353a4e8a9de1783922e541fecf326e9b853692d7ca99681aeee5c1b94317b1cd1034910db706501f9fb418321372c90baad4f3655c1272d2925ea00af9abadd7a64aa194f49070d484c67487314c333cbf829393f77fe856f8e60b3f685e82881c10ce57c8b1d6065acd87df27106d97e1c2c1c048c731b69056d467869bff46893b92e79cf845530e6d32cd064cde2f532d27aa091baa98fec74d172e487ffea58d66e38d3f3e713593f8fc299ed0ed92323a335492aedbefa08ebfefd884f68856259ecc5fc969c21c1b20764ba3cba7025a543fccd628104aa289c2bdd102936a643fff74342ad332f95e339fb1619969dd90c3317e8e8bb40955893db9773ecc69e7c27419896b18744167d93f0fb35f8d7a337b547781e57a97b28290c4dde17524e9dcd873f53b1e745bb99369744e8bdfee4ac0bb01f5c09747ad642a956adb88e385bbe6257bde2a8b4c1e91f31751fdcac059eda0ba093113cc3916a6da058e9fc733fb8b06f002a680dab200adb1ce88f6720669615c54995a1e2306a302a412a68809a9f0985ccd0a9f5348924750a7ecf24009c8509222c55e847b6ba1bd5388a8c0804eb459e224fd83bac56f27ce9d4e0dcffa8801a8dfb8cd58d3b14570c143e4affdf071013be8eb3edcaf5cc3de6509670998be82a98a0549a3f38bc32b9fa08a135087b62116ec93caa381d53355a2c750e8f3c087c4f49adae8739cbc04e20443df1f50e2a81657e93ac442e1714d6d6f8236561e8a3dbca8f3dc907ca11eb2ace4ede2dd59d8e06fbfc1ab5eed1167aaf926e1efb0db3ce7b5d358949e41b7f7f79b0196eca86d5aa7ea2a5f3f8c865ee221199250071ddb20e76f92f3ab0cdd0e71028a19041a1d762972b11ec7010da94cadb20a592b2ae24c4749adc7f44731af5860152399e2ac1b5f48880729d52a904c32592af0996cd5e730238202766f598aadf36eafe469d71d2910209c90cfc15c977af9bf43d575202960612193456e2fdc60de8b7059e699c04b18228998449bc61e71b9d2f9b6dfe2eda0ae86f7a15fa9adcf34a0cb85a283fcf9c30e882ae53bfde1fbb5d4e56649c6ec80f0ce66e01798fd1afc5eae78f485e637ccf977287347da1d43436a6ad3a021eb8877a070682abb63119a78fbd4209b81c064c13f4b5ef76d7d080a519afaff1a21977b209ff1710a1d87e5e6655d570e8a4307853928403f46ff3bd8e80216db5ff129b8f85c2ad992716bb2aa9757c515c332d5f3cacd3b73da7051f5d1776fc2a8d4afdb3045e83671cc1a2999d8015164ee710dad5639c53a12984f4819d6b4374128417e9b46095be1d24279561caa7b293e28b2d69e45ef0a1ae07fa3fac4191b13c77d04579a11b49e66249f9f7be7b29fd40da2b6382ee16298768ba56ae679a236873f91232539279112ead73b0d528bd1439ad187d4abc2e7c13b518c2d4e96a9a61dc53e31cf84b5c5019a2899d8809f04c361acc481e7224fc2e77c3a54967432995333c590899dcad31c09af37d37df5be7be256d5c9bd7c2c459c63312839a07c4cb18623d044010a3c7c53dced73b37ad844f990dabbc16ac3bd58677b581b857f762ae5f372e70523640ae32a3692cce32e91d23e2b4a125d2e6b612ed7824ba8de4e2f782ddc4b4d5d2e547cf86603493d31501791d37132316f28751c8cd40ce4d3a59ff6447284429db48a2bd6ab4f0879d53372e65af958914ab069a682f7b35cfa07060a9a3218169d96d19cf57bab882ce7aa0d15d9c6dfe3a1c259437a413a2cd3c8d1f33085cbd43f3fb70efe1452f0a", "6353", 0, -322603624, 1537743641, "1a4101685ad48516cb541039bebc6deb22dcea93bb2d8e9484b66904dacc147c"], + ["030000807082c4030460a462ccf8b39d7ada3b2f8489905d4d091d6acbe9ba444d747841a1c0112785020000000800ac65635153525151efdbdc93bb1109414a57f2565005f3d16e4a41d93e7dbaa888cd06c6ff72ffc937272a01000000005c4add8dcb5975ba1d32964ce5bceafb93ad913979541d572fccbe06c53447fb28a1a69c0000000008536a6a536a515152ffffffffc292b10d5c176f368475b0ead3eeda414b39f042c135747f96e46a7a293d2cde0300000001ac2f11054d02cc50ba0300000000090063515100ac6a51654b28010000000000075353520052005168b93ca90000000000", "5352526353526363", 2, -77478050, 1537743641, "ee742864298d1282dae5c9374dfada9e564a93e861f11be2b5a75c21b498cff3"], + ["d91ca15f047e83e67f0da1bb77fd46c5129419d3ac51868027a7b821002e2d9232dcd9081d0100000000e9faa1cb42048c97f8ee27e85965ffb7c7726da6d48fee65c22cb10e48d5be47011e112502000000026500ffffffff6abc757e34477ef080baf5cd9d83ba3a509e4c97f71e00af14bb4cec6cf1ca0803000000015231618d7bcdc4e8a8d448710a2fb143a9d21da9a815ca1d070e86453156a11b44fe170ae90000000007ac6352656352acffffffff042f5fe6040000000008ac650053ac00535207e6bc030000000003006a6361378c050000000005536a0053632aec4d050000000007636a5200ac51520000000000", "5365635100acac", 0, 321426547, 0, "5fad47e20f1e5e65c0252feea6a703a3f13dcbb8c15c90e09e4f4fe3c74417b3"], + ["030000807082c4030200a5c9c421733c25c6b20b27213cfdbf0f50b72c0d66ae75b4d57929f476b46e030000000951ac6a005353ac0000ffffffff3d1d5190089bfcc99ff7e55bba3e6b69d66aae3bb0d62a8b3b4cc5ecde718df803000000056a63516a65eba382360472bcb5010000000009005252ac51636a5152aab2e905000000000055bfff0000000000065100acac6565fae62b04000000000452ac63653e3aa985c20b300300", "5153005265005365", 0, -140897409, 1537743641, "c0e8a865716e1de8278b204d6ad1821ec0f7c88ac956f549f6637ece2b8de6ab"], + ["030000807082c4030434ab78c4152424bca806214374e329d04c78ef340bcc5c7c3648ca6fbe3eb9770000000000ffffffffd258f99af2352a4c3a2f799f0bdb8b64a6b91fc978e582b1a07daa8bf75cddb700000000016a2d012e91c2188267e92dc7a84a2689d0df18fe85d1e6b957f0b5cb53d6f134d40cfe8d10000000000200acffffffffc3c992fd5b328fe2895827f4f02ca08b0425c8148635890ed47af3864afe022600000000086a526363525300003ea17d2502c922ee01000000000800650000636351ac1edc2d0200000000086a00ac0051ac516500000000b50157b402000000000000000064c66b0400000000773ec5b71403aae6079778c24231c5c0cef133b15ba238ed77aaa8af55ce7653932e6cb5b981ffa73d56a9309e75dd73d1bf78de46e3d255436a53e65d39f9890064f26215e73028938f526ae16a7d4711e2412944c892934c1b5b976d9b738800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000da42af72cad88328b7cf4f89d61bb174f33ca5fe9783ee7c0c5915aa3aa7179bf48b9ed2688c4d4f08511b008167d85e0a011a8085248fdc57434882b1215c43f48eb128609941ebedf0afba87d3de22a941386269c6fd726035376e4d74484ea12c3b809b91cc842dfaf122452c95e77b836d61c697e5f9e34915b51ff4c9030318c07f81c203c73b11baa8fc15e4f8e60963d26c3f0ec8477925528009cf3faa03175b76b60b0b9d48e42ef29137ce0252ea9dd051da6addcd834d090eba66e7740b00cbab5bd0909ee2ecfd10f50b7305aa844f27650c4ddffdb43b2a968407b991b87cfbb79218fd7cf902e6c81863f9d01b53e96bc90a4a8601da880ee41cdda70309c7b69439b09f6fb1bad4e94c19db02202e5a5127e0d542e291f510140adb42030d70e3dea2d66787a2f8cd492dfcf3378f8bf88666206bb5cb8c180898020d06021f351ec24a84f53288e33cd9d5db8bd7fd32e74e1238a448886e15c7a207c1ea021e57d28bf31d684b41055ce8ea22204f289d3850ea512b5287b0a1560b42c967020496792473e1d38668f4cd8646c8b87f5a4d0a5c1ffeedf600cd00c1ee1b22b2fb4b28f804edd675819bc636541481c3b36ed471e665ffe021f4de2149d07d534110d5472dd97d61deadabef0260e0ff8a5d57bb1bfc1810c0a9814a0d3aa991c911e12a6b68f825e23d95a0a2178c0719f0899bfd856f43a27382e3e998d98896b7c095ea8b93efd4511ec50e6fcea62be0fd32b14c537e979d4cff14701a88b299b4485138354ef3833b7334fb61c2b2ac7188213723f25c51ec6e92c4011f66d36f1de30d24a0fb43d7afca1dc3139fac891662a716705303b3e49246a913a18bdb20e7137f7715fd8470e59f441d5021e8a7db900a17803c70a7fd77f1797e7085e4c074c9b67add55d5083a3dece71f8596fa2eb21627c49703abb95a644c13db2e7b3b0b88ce6f84b8913c2c77c5ddd629fe74d03a7fd1c20ece638c1439d54ee7e8e8ebd07b7982ae525c8217d8e041774150c9d97bb5162c341ef2b539d099a3963e12754a0fd4f50be10a4354b3bcea62e923736a98e61d18b0c6a4d8ef06aa0a7e320c2b827ff6273d749f5fa8d9834ab5c16262eb7b0575731494d54cfdddb2a75e373039ce3fb2d6b6e2241b9499654216e0c750d64e772b881bdd18f476fe951c53b69bc1c0243a181bdfa5defe1f5488d01c8e4040887480b1910ba4d4868a6774e475c5f703d5bccc9309d0e2ea5d2452ce47e79ab48a07702cc562efb9835ec4e3588242cde00c49d6e9b419b845053328cf0239c514b0b83fcd5d3cc21a23c29a3998781eb478cf812b7216aab7e438fa22ed350d1af200ca5b445c1ef344169153cb452664a1af708665f6fc1e98883e5e380b206c56db7d164790857f1c22d381210a5167570a358bef538217d4cedd6a63112d4c61fac1cf31e8783c8211cbbf611dc589f0f14a23b5c0fdbc4c0606ab4d0633e9117c6b86a6bc80d4fc384830887f2e3c4ab67385b079a46cf68276ec3da5ffd2ea8d6ec0e9cfe2626654c4d672c40fef443d75c741351aec9986be25c3877df6563cab93bd21501934410f73769aceaf819b652cc6f644371bf17ed305df63166d0c98c7d4b2715309a307285d22701075f768d06ae51bc32aa88311402ffac72e3f8be184c6f7b6d786fb28ff31e0b2168c286080334062d196a6eb6005bc406665a6add05e79eb20f508830519d8562967d9b0e9be5f1a51a480d3375056f845b760afd636b58dfb8004334c1b0b3ff1cb7679814c0a1ed9da732e530b6f9794939f03a6c93567cdb1f091ca75ee0038fe4d6f8a39ed57f5bdbc494629118f8bfa35806fe3ad3ea9179fc8ba4c4719d1909bcc09d6690a11dbb3d933b9f23c920b17f27fd24d8c173a9b1eede66abf3ea408797bef8e366e437f3407c7b388c4244c76160472fbb579ff0b4f552bad04dd243676362cafd2d4a4c36e7fd371f4f308daf5d072fd75cce1b9493af48ac206123a8a7112a4155409f201ab20379f6bde2156e082d44e089a568a4b82ccd8204981d8e76fed48791adceaad7c362c9af15e17a94faaa228687ab417315050cff29415d6d281c924150c2c36b2dc5679f16df5b731ab3b85e6d8885d019f81da1d16748ec6ab8a216acd7f92f360538975bb77f0245bfb3b3454a1192da966cb1a6f7bcd66666e8a8d43b36f38e7306cd7d317f5401e9c7de569de883e29cf58696be0a1e651a827036b317d80194a5cbff25c25ab3a7f8efaf06ee6769b3ad53e597513cf01000000000000000000000000526c2f805d6fe24abe3ccc5edf5ebeaeca704a99365291da2344c2b6a851822ad0025251c005130904f6aa445e199c62dfead19e6f9e015007aefce1f5298987de60a05b2531398463b74f20e3634e333071696e0d956d8fed2a34fa3c307afe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002fb1ff8f0759e2efc838215d2c374de8f9c0e0e9f79f6ecf5875b301d6b13dfb91ad50905f0a087775b134648e6f31a7d1e5ab66cdfd5e13463f616220dd1da84b1a38be8eb0232851085d0afc9d14e3ff450eabb25db00d68d3419bc0aa872d9a06b43140230ec8cee38b46bfb46fd9a978064d659fa16a63325bc826770f32021dd77b218ddacc7638e605f504967578540077e5d787636ccbef02234958af89030fb960a769b7c60a8d81a4ff13eecf64162414e0452ada330aeda79532fc9e9e0b0518a9e0350e4bb857e5c45832f50cfc6743ae875c170f2a19340be5ddf02ded0e54794d3c6fa3f839ee7764ea2d78702e8d6ab7b519a2319e836e78e280035d0315feb0876a3fba60c468a14f0e32b66d243d4d82de2df1326eb2e06a4fdf7dea03198aa4fe8bdca48d55a0e96711d4f9f8e0a7fe8aa71b74a5c2f9cdc925fb7593022bed03652ee86852e0b121a78fd6aba7d27e33dc66b613e9ec8fdfff65bce91b02160f90b4a02b3c3ce7b88b582c8d1e1e16d91ef90f4ee9380cee4baf68a156b90314cff8d13b2f1f34df272dcca84f7890bdf389eae3b6a9a65fdbd161de06d8d722690fb5107a9e6df5940b8cfdd2fc0ff10e3e22adab3100db659bed180a029d62e8ca0cb6f2bd7b3e2d0acbfabc3ccf597a543b3259fb2c3cd7193d7112cb9367f1dc0f7280da61d3abb4f8ba18e24fee21134aca7bc1b8f4045a72b7bcfecdb6e909098baec71ffea7d2768c21bddb23013e9ea12fb1a03eb43ce77ac6a91dbd1a94a4927c90063017b81ac94fcd36426d84f1626a7f84786b20517262b1442ef9faff7321262c684245d75f4c2ff4dadbb4e20e9c87c19980ccfb29139246030629f3e7755bd7f6085a4e739b7103476897ab66992cc4a7a0af1e3a29b4146bd707b5d270495f6985b405bf619c3b3488f2fa09994bebd599212962bd290455c9a73ee3aa886c89c19c3e8b33be9d85a5df75a236cbd30de090e7d1581ff11f0a078c6bfd1a9d4b864bac5790bb25d6286fda14288de55df99dff47584181182637b5cf611b1051bbe4273710fbdb5444e49f7c245a20ceb4ace3f7d2af819f9e8a6e90efa45d641e5248a9706c5f79c68a767120f85208023acffec3295e919119cec02be76a1d4f0d667e88f643fb7ecfa85835ecfcb2e89e64d91fc4dd4c100e5245b0a763b60f665865eeecf30fe5469698239de5fcee0462821c5e95a4416dcf935e6b99811b0382876256f4c13964382bff08bb16375c5a4aad34e563b86cb3803502c17c8e77ded59dce949484c6f66fd50420b4308f1b9b5e94453db0e15c236bfd9c799052ed4bc9e96cf524863ab67af56af90959cccbb8d7c9747bac261f264288705e4ceb06be906fb7d40521774413309ea28137513b54b5cd5180c6c2a86b4b53b7132a4f4fafbca1d8b50efa5e943864eb4d7a01dfbdd70c5486ae3a111154aee753632fdd4e163453cbc67ad95a0f5a2de4546543e80ad29f24a89ecc748f0995e46234df9f7bd8a6f5d111b8c3d05591dabac77a96557de75ff90941e0586507aa6c564b3a932d068ebe046ec3116b7198a3a9f22de674d25f0b61c36130d5e64eeb8cb6c4b6337909848d49e1f9cfd11eb2b8b297b1175f7dc4ada87251e72b414d0fc4f6ebca4f2d14d9b8c8f5ba51e9112c331f87ea47f8444cecd95343ac822068e27c1482ad1ac9f80a356c661b2d5712de799d17fac1a21702df4226b905c2377efa7eed8344a4c782c81fe6c1ba548bc7dda6ba79c9f82995cc7e2588560aabe5579f4ad3c36db9f40588c36fffb9703f54143c5500f0bd0a4585101c882ad73cbf6afef186e0da3292535b98cee22a28792b19ae89916a32af21a9918de8d5bd6a3c8410e99208d4a994a5b1f0060462a1773a5be738c8a692e9d6c252e26470c3f1a66aeaacaa100b4a596874ee60e3b7a7f6c066b6ec87426c82682a05c7537fa54e140226949a1fc2192c0d94755393eb51270174fdbbff5554d95f16a65bc551c10eb44723339f7231baa1b2f5295906b45384df2a5a3fd34ef9f0e71ce7aa01405828c9a6e8546989e81cf39a0f936228c0ae9918ce56863f6c9536017036198511e01593f887b42a0804a6387858019d32b8152ceaaa1858b4b2ad26db4652bf91fd54a79769a1073ee40474e40d0a905e94e6b7996187a3516c180c3ae69a8697b2ed1ed7738858bf1e0891d4caf831b291fe9f9fd147c37336d9b430946f48515eb7cf31b6aba0fdaa1daedb97a838a0b203447772e1d787464ea80284979d70c1bb7049dfaeaefe1db133c554755e736705a7c3c2544bb1300d8fd33a9af72f30e049fa324b78e38674612b6093ab8ed8d2398ff6e2c4735cf64c2f1a6c5e9715bd59c99ff69e4a039f0aca762286835451dcfa9fbadc2a078d6a7c7d089b0c", "ac6565515365", 2, 835608112, 1537743641, "77e43fc9c392c6acaf15ce65faf71236a3fe16d994ff225f7028660f2f7ff89f"], + ["ceb51b2103c8a4a81e49d2209f6942ff20558f9bffb91b07975eb712a3119212c1589f1a7600000000096363636a52636a5363ffffffff62dc2308ca03c9c61051df2d02317294027012332fffe1ccb8a8ac4cdbb9f5e103000000026a524f67ed33b9dc953a3b28c000429d6900826586e193f1a2923ab9354cdbef536883a19aa9010000000965ac51635100526a636f68e16702416aa00100000000065100005200ac6b22820000000000000000000000", "536a53", 2, 418603871, 1537743641, "c0173a69841f1738523c5617db30b7abf0517978ac9afcb531e97310816f7971"], + ["fd7e2b0201e5a6e7bbe384b8c0c901be8c33aba1f9e161f6a1fe0081ecfa5558ae471b90960000000002ac5397fe8f3c03650db40400000000086365635100525200d381c40000000000036a6363a7daf4030000000004000000520000000002f503740300000000000000000000000027b0f8d53520c68eda44ed8be6170ddabd53b00bc93e4f35f41d51165c3050367c02f1a73f392ad5b756efcff4a8f557677e4e58f318f58ecac10b4c9fab59466d4e574f39df51ca85edc3bcf25c215607473faf8b2bb90922838daffae96b17000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007976302d6fecdc102779da6b30481a46b2171cfcb7c76e1da8d8314445c3e589fe47427ab67c17df15bf353ab6f41db3c0c3c7bf78219bc0e6f0925b07979a18145663a0f9db83c051d7cd1fc92b384d7dd8314c54a1836cf2099b344b03f0640a9c7605f75a01dffe4776eec904603590ce50b72eb181722ab652530bc351e60313a4ab81e2a0fbc415b4a1395b2172582614adcaf5ecb781b8c141fe2df09d0d030c04a69275e9d9ed9a7563203ff5185ee8f356fedf2cce610f255f06ca06ab690b03ef810c238deeda65d9fb90f389376a78c5a4ad5b98f6ab630a1e79757a030ce5bbfe82828fa48086688911dad9a70fbd6da4346d873fe7ce8f0219734801b6021c9d31f77690ee1f2a9d55e2d4e52b9c9ccd51f1a30a5fd7356a5ade30c99bf8020b5598e3283b5bf93ad75770eb6d01305dee2b67da9f2af78f83b905624d351b020fa196921b57daaa556fa53f27f36e26d0751a699d044f8d1e11c39dd2941e7c022e7c3a9792022796ac6ffc3407924207988ef126121e44c9957398a5dfea318703294de60d1f282ba7eb4e1f011cfc58ec986d9a362b75997e5c9979e1100f89b1aafe585fa0fac5b0bb0af2f176495070228cb6483f98a45de2cc356e391829b223cd45cd4006230837fa0ea7cc31be9a3e605a3fcda0fd033f5a9f7b1c1820be684225624326f67409bef6b45e4fe7396c4f2149ec21d5a882c2a318d02df7d425cd046ec6eed45264b2e5c3c7eb4d535917d2988608451279872b014195a8f78cf3a586e65833b2def74a380c9b873ae86ed92283e26c23006364edd48b0e46d27e85bf2afecf0de9ba14061a9556dddb258444d555c3fb4e282e21383944a0885b97c4d26a9ffd7612b67f0393fb7c4d90676670c632b8e673c4c800189e11cde113655d3d0927c3fe74e976e48316c7e32c63faf4ac5fa84182bd9b53a7912c3812a33b32391dd6e0e2c4a25461e9d811312c09fee58cc53e797aa9b40c1f05465f5d667db9b0ff4387ba0071e31e499e13a462a4fdb238075490359fe2d4f2bc88193381821eadf2166ca99ad2215525a84a059a00bd72a85665b7c9dbc52fbc9442484a26de23d8d99d5ba3dc4e0a8d0aaf8ecc8d314733a3c59a850c3080c5d5917f60cc5b77a26e7ac88487ce5c611cfdd467646d0f9c31229f7d985cd976c54fa8847f717966b00e867e0c18ec1aafe0dffd50c770804a19ae544638f39245b058f6f10a2d06f034c116d4fb1421a2789eb475b12ea36b6bcd1e57dbcd553137558def590a9bc28ca7d02738ca8cbc874c6a981da04e8215e16871fbdc712b6e0bc6a963762e6453ad349a1bdd18bf47e718860be70a717172dbd365adb6ea57da6b9d586372bc4ba00e6188c559588e8d22cab6957bab8c1dd1330f19b09bc9e20b8dcc2553e1c95b089e6625ee36e7f28e717ecfbbcad9b181eb4d495187c28f52958217bf594373e9067a949f9f1a02f2fb3c45843b06b100ed07d392fdca0ebe8c404687c82c7537c023c77b899a1daef377823952763900c8219666d2e1fa524460b690eff0b0db02426b03c382273cc1e9d320e8afdd326a563e5705cb2762c7cb62cf17eed63903c3801fcb455c5a867c4ac0162500c57363b4cd5908ed636b36e2741d532eb20fd4cfca4decb9f274417635c162d376d92a582851ab26b40f76043239197584dfe7498f3753569a247383a41cbbba321fe3a254bb2e8260c2d149681b22fbac0869c8008e86536b554dccdfef707eb3f1b84d95e253a5d43fa0e187534be36e2605b93691bf1547d5f551984a7506a88e66260ed60344aea77cc05eee0e00d696b18332d2d9e48085e619a025276af90d483b1f1449d48ffd5a954573a3ca54dec5a610962213606a9bf5ddddb8bb3a7342e60bf25bea1c34724f47a6d46ddfed8ab2cbb346410312a8cc61b02c67236510e10af49d6777507c939eae448209bb5f993a7aa6c35e2bf3f1edf31451984e29f8a2b59b37e275381cb1cf742a9aa0ecc15ce01089b53f4665db82c05262008d5ba404883a9de4732e4106cb84e4a00e9d202a2f09eb58e42ec1b7c610daa55fd99aa3de4f1ba7c8ac87e850c89f65dc99542a6cdaa6c81d541605a634ccb47467761edd86982167b7ceac8d13d038d4bd21edc36ca45b6a392cbaf0c13f4ef2c02bfe461f56416de1fda9893d5869e05a2f9d7777f01d1f85a969d0f4353fdb4d3029676f281c3aee09cd20bf2d4031b13d8b69dd391883215a0dbc9913371fa6430eb2fb656856a189cbe6e85900c04d4364906204000000000000000000000000b5ed1b3c9652dbf17469d7aa28ea6f89ac623d5a90d154ed755e4334321c2a5fa8cfe85e02b5b6068702da1d0b68a3b9233a8bcb41996bca40c534039c04460a1a2ec6ceb1070f6b8c872fb1628a0664c8cf0561daeb868ec138b0ec19883b6c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007d92381b791551a1e1bd4293bbb5449b390c97641a2b05255c9c6bf5a1291c357f891b33d5934bf9c8e5b0ed129972f59f28c9a1ecd2bf18320690aff327d7fe404d6c92da12653ad43c14037c85c01cfc1e13fe3e8b3ed47c26813bb3e85b5eefa1c60f444422504dd520ea3192eecd75ad942d0438e53f940137f40d03a58d03071881823ca898a8fc2d808bbbe9cf01ed79131be62e34cba3cd9731be855f8803155e1b96b061eae728555fef74a9d4c641a6b8af65fc549e1bda22f3f80085920a033f5ba3ae6395379a1eff4d7df20615361ddec050b39fa4f43104a2e4d26dc03b77c747c83736f2e9379cb2e547a41a78e3b4bbf29c8f6a24a8bfead6fc44a8020f2eabb48579547817f5306bfe3919d6d14d85ccd74eda660b8240acb902bfea0230310c88ceff5538ea405823958c01d74094165d39975f7e8d7f467ee033fd2d020772eb4fe90cef5a5a8eb5e20e2e498c53369c49e2bbee04a5bcda96cd2a13430204990a1db1320fb4407d2dee97bc5450e79f3a3b818dd89cc369735f311b9958020d497a95594b96b5aceae04cd85a8466fa773bd7d6a74938390f709f657e6d4a16fa11b401827d30600a37f4a5ef83d13b6155aede150fd6b47e0a32a8aa67ea204485d33347795726c7b75f9bf064f9c0d76624c06f6bec4553651c8c894efd179ffbab4f27c42a5165671b499ed770b8742ec694b5d295ab21e1811ab3da6e3e923be7077c16e223b5e3771dc89c0b09d1f208efc5dd8487d2e7768297b472e525d56b0e015639c948dd91d1b0da4c86b3647c00b9c2cc636a8c9b7e6caf7d7df1d8620c8f7a8a193ca110f5f1f0f4c40def7e1a8bf5adfc352cea09e06fa9ff0e2ed0161ff815891b6c97efbe1fdc1de9f934a33a5bbdc39795d7ae2ffe72e130d43d6c9838da872c0299202e99f20508e76542386d193e10068262490467bbb43916b1db82c8a5a78e0fc35529f01d1c977f30384c732196750f8a3aaa94ae8a55714e0c03ae37356fc112b0d7c61ac109257386f581042bc797dcd74802d1ddfc5d93a852954c543f9306c3f1d3d0feffde271d457c233c3ba0afea15641fc216c68303dfb27459b65118ce49c3d60296db93670af1e152a0dd30192bb201409cdf44b28a530aef3043f9ec0e43f4443a0d5dfd1625371d7d7e4e7339522607de86441d8170ad5faa744f54ef3a785c8b6109569ae185285dc67f66016e92f7065bfec695db031937c90b87ad1c3d907002df6884d4ce2b099524d67676235f8ec05efa65ad769b4c5bad7e3ef3d3f14451badb49f9b747fbd094258c4224f53f0ff5aa7b50e4823ea2b358deb98557e9f7d1cfead8446f0b179eae6f42d41250fa8bbb0e9be6d6e81a82797ddfaef8d82eb4da95a7acc530824775303498df8a6c490271222aa910066a715006de1cf2438f2d6d492d7149b49a5794888c6c8dcccae77508519b463e027e59e3f1f7b26cc1945ad5a403f00bebde4115d7ff12de7478e77035c09393a0866dea0c6dc7055e083ca4150f9156d3ff683596684d4f49acf724d0d46040196df955d4ceeb1f5ea59201c299594907defa800c7f3364af828335cc16780a3d5b8adab4ad31b86b86552fbdeda5abd3c46ccf7a8a8be2ed0a0ceadafe178d28c3bd1948f1e90bc7762b71783c8bb29ed6fd98673297d514577895e492fbd922ae3eafaaa57efe2f6d1451c3a4108a3a7a9038a096c0663ba0a2b46281b431bd73a111c6548f3bd56d30ca6a7a32093408f0a0a56d5fe280fd135ab12a6e45cb4f99073ab96f030fd7b7939ca300f25c8127c5336e25fe57be1e640a61d5d0b749cd0396b2c3bff5157e8765488fe9b7003d077ffd42faf7ec8f4ac58d44ab596e4cf60be2b1434a7b66db031e358086103ddbf105fa225fa58a310953174cd775957587fb449b239bc9e37f0738db43407b821a15d6e09aa95a5375bd8242d7cab16d5ea6782d36986437319e756ec60492e70f81ab7f9dfa08405d24da40891d8f03d9ee60462817926a4af28f8f1922d85465efdd316aef53b1a7c448680330cdcbe63f2d6449c3ae2b3900293b9c82c01aae68fd83e2d07e72d79f518a5a1b764ae9626524d2968c5374dd404d8a0fbf121dfcc0cae27ad24d0e12ae6f96a52b9c4e56dc02e5e1779c0c1d329d23d006ee325d72c80b285f71c94c8087d5fb6912287c6bed9c932e0f258d7263b369104e279ebc1f512ff154e253e4f63d800b9e8039a6ddc3b3010e4fae8863a54619a2867ae3f583c62e8877bc13c54e5b6611b10cefaef8a844cf9a2468e08f812c943e7e40b42b9ac0967c0deaea17e6045c0bf0c910883b7e160154dbdb05c74246f950266724d7848404ca1375054be158b4edcf8a72da024ad261389a72b79d86edbd339053ec1a5d69f7eec80016abd7120f", "6a00ac526353", 0, -1180892345, 0, "662084d38d18af1ef6b8b9c64f45e9e9ef3f7e64b1a8a962181b08198f326eac"], + ["030000807082c4030340b5feaaaf008c5e0a1d3c62f6afbc57412c60933abb4595d0118191316573540300000002ac513a725b5b91d942ad857ae6c7db38cbcaa0d2fbb863429bb41ed928999e8ba536fd1e62aa03000000060063636aac6a9dfdb6eae5519085d00b18f8024cac0ed4ad883d51a44ea3d09dd1e54859ef922baac10b010000000153c08244d6025a9f7a03000000000163dd38fc0300000000006fc33853e1628c9a01d53222010000000000000000000000009af32c6713961574d010416d1e96f2717d1eae9ba3473399f1c5f453ced9c70ec145ab1dc692daa3df3dae178d37a38100cd4e28be3381e4985a22d2204e60ec30aeb2babf6a032f8e29609c42dbfaa9ad4783fd42438430ba9f319a2cc0188200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ea5bbad57235f58fc7e8ab4f9edcc14476e8463dbc0b3fb9598682b3b91ec87f47d5effddf116aad04fbefb3b8a89405a0990af1f35b23b2c07eb576a15419b4fa86e1182386f0eba293608059ab1d9d6ae596fa040ec193cbd08b75caf77a1cd4c83ef75f75c621611109d70d7a4180c4a648229af556676caf9c9674696a0a032583d09ca6fb06a11311371a9e82b9401c2beab1739ceed5be48e5700c1818a4030fdbf67ca863796d69624801b5b111ea283c681a6db3af920eb5b0869c6fc6f70a05ea6fa3851a156a65ae3afafccbe3c7c7c17338185fb1b681c9b8ddc74f25ca52a9f3c786b533ca02692c316cbfccbbab7d3edd5a6b59ba4806db5296b0427703143c090676d0e47b082a05304f12042492f4a30306fa860a11da9e8935b5147003240c70210c135d9d69b280164c8397e80890b0531bb6eaeb05191228d4b14251022ed329c523b9bc3f54fabfc90b833d17aa5c6d8794cc1d1b07806bd48ae78e13020584203ae5c839f34ac4ad59919b103be4e3076e696cb940d01d40e600f6335d0314e1ae51523ea963386e6aa94081d8b6f0ef4ed8163c8b1d88d5c42849daa61804177749989acb53eeb79cefa345da6473ef95fed6519e0ab50c3514c0f1313557ee62473a482be274a8a37b76b725528b3faef656e850abbba0372cc7eb4ba3530abcb2e3dcad779890c3a6b21de3a65e6ff0abdaec2cf6720e4aa26a796fddf5a4b0c459bf137134db42153ca4f2bd4537cf4170ea582283faac16eee5e39ca8f219d47dffa6c37d2483f23876b82ade3d1df49e0259610336984e99faedf1d12a540bee0069cfc3040231da151ad144d6e7c42866ecf96d69f7dba3e0aa19f02135e531157142035e550edb49fbe5fed2a3efbc2d5eeaf86e81d5b8749cf74687707e01b095958a5497383d39d57fe4455938db1d3fd93a8d6bca8822a0fb7162a1ce9a069760e6b5738ee127da12d06bfed62ff450e43a53f96eb3164281b65d425d6a32d16e16ede66f031eabbdf0f31cfc8c2ce05604feaa04945efb32d3215288f04f2c8ad78df8fa75680e7a62cc291e0ba04199f56f25c7cd74b6fddd7e2a84be28039fb1f064d1ff2b0cdcba6fc165c19adfb4f1f51dc8a578c30d374f9fb7242dce9d30a046adac0b4cea1681b0b580da1c6062bbaf325e9ed8268120971c3f54c1bb66b4437cd5f132dbd46e0979573b3fcf8d7f6e1ef7b066d60d860fac0471a3b982fac9ddd6519c65ce66c7e8714196b5023048355a3b0c13aec28613b03ddf601bd6d8be3db2b3acff5e1f56d7f308348c4b4dfe4a0a452f75d7e93bf897c053a266ebfc68d6e95da2c34d7fff41c6053e35ae57296ab3e4cb79efa25541498d1df688036d40a3543e2a1fc15fc884f199e3dc76096a6936b7e3232a28dd3c1f164bd622a426e1c87ad92c196bbb6168fcfffa7b0ba0a14a1e8617413b13c8d8171891a1a9b4cef2e76183bc8dd451a9e83dba04f4ba02e6ae1053eeba17a80756e14c2eae5f481dc327304b45d5766bca7df00510a5b27a0a8a513aee690984776c6c3cad48b953cde021695276416154a36e9e52a528465aecbe2bbe9804664975fda2ce064cde0d148d7b54ac5d1459abd52c70a688eb63bc83ab652a192b3144db3a876b95a12d79bd408bb0c735050c558ab60d6ca7c1724fe7bc447e107d5da215158e671710efa047121633c058f295f71960e549d5c6bc1965809f9ac598682e7aa9b6a28ce65b1790b61b0f7a47b3095cfea0e451304cec5df2c7f97776457d3bf06135de27769b630a5e45943d09f3c9667ffe57609e1be223097801e0e2086760285a0366de88be828bbe472320e3960c7dda08b29881dba89f74800ecc1ee5fd1f6cd31a38889d38eee25d44770b106eff245e87e52dd22d779a3a39ff5d8b982daa7d0ff7e938a66871a543398b66cf9a02ced8c7b23dc2738af8de2c80306115078eed92a781ed325a466da1bbcf7a7dae1334318769f6a81aa54b742d982250ed8fc2a6f46718c7547b166331ab1126be1aa6de74aa697bd70a7ade459f5c8bb86c1b53e7a0f43836a081c234c172941abd614589bd734ce6ab4d42ec0f6fc45b12135fc98225f4e4c8ace1accb2b3e04708a434b15a174a0ffc658ba196e13d42479b355bbed95cd76ede45b2b2e67183453660224d4a49968678ff7fb8306d188a06200009c8e0eda1caddf2de249c8f398eb60ce3e13eede7ed8c74a754ba57a4eb4102b9d766b7f0acedd8c5cdd714559ae02843a653a9b0ab4768a5d726a2f8d380f4c5ab165231192e498b65b22b2741177c0fad196d9ee620c5db51768a42b19717d399767be0288443d6431454d55b217a690b831a58a7e1805fdbd6f5e56b6f2b4f982fffe1dd42611d09b9839316a460b328e9ad4c8be76846678b7780d", "515100", 1, 1551623671, 1537743641, "6c4e10805bfe519561f65986850af838dc57b4ef2c43c0ff773df991daa55637"], + ["d37c242a04d2cb6be0cac9764f277c9f8007e3734f12b8b2316b77618162e91ee2dc9d900b000000000765006a6a6a6565ab28e4b3dc73d249455ac1cec38f2bb697ce0da8261b0ffbf5ccc8c9443ed906cb0bd90d03000000016affffffffecad5f7f42d25e934acf146a71ca19a5aa8e52760a03504a17df308184f10dc70300000007515352acac5353ffffffffac01361f537c7550dae52ca6c074954d9fbe369fb97539f268ee5f09143ca2bd010000000900ac520065656352ac60ed84780112e1aa040000000001510000000000", "52", 2, 645074038, 0, "bbf05a993516d45eca88d3307d37f279924c1ab5936b46654825b783bc4239cb"], + ["030000807082c4030265667cf22fb68a26b079a1e943775a8c54188fb138a065f757f38207735ba52e0100000002636a9370a71eb3499dcfcc12458bee007d56ab4b7c2000198531134539d580db87e5d151807f00000000095152536551ac5263518f4e21380455d314010000000007ac635252635265002780020000000007656a006353630035ec37010000000004ac656a65d4bdeb0400000000066a53650065538923890dce48b3c2016e2d8201000000000000000000000000fc2e61b3bf5b8cdcd114b403c5c75f117844556cddf1e8580dc7329e0fcc515e9b9cb75375691078948c8093b529698f19d641580daa444f9816f088326f4d5f8517619b2c092d5631fd1d001e0a689b0329c798680cc1f34b97303eb710c48300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e06c65089b5d238d01c99e740146356a5e769bcaa78ae23e76eb2761363f3cb203e7e600c0c732641224d4a02fca09a44bf9494b3013c9c4a27c756b468a0058feb8d0285d40fb7f24981fe9f5daf3627708abfa961ac53ea5dbe71cb8c5e1e295c1f1ff199e867aed24c563f95de288f1d7ffe7335e9beeba61b5f6abd783d80201eb6d791672360b21fef41b38fa6842e6296a438c2fad4329c9a0223b21b99303124d048c2477fab30deac2aa576f14555e45c121861913d39d7378aad623a3600a075d9fd479db357c8c9605fbe687504380edc611246516e40049ab4788851a37d711107a422496d9ddba16d8e8d7e0562951d35d97aff7c085836ce378221ad3031431d346acc6d6bdc75ad1fc87858613e83c2ccde939b3e374ed73fc9265fc57030a9a7fcad86ae13421a5c640a41dfb6cf4fa02378715af4ecf52b636ccedbc7d020afd3ee214a645e0fdbbf43070bb010e39d0a590da5bc2509fa7b3d2dc6cfb76022fc683c9cadefcc26e6dbb856ab8e0ad00c5531a25a1207170cc99aed1359dd4021687c239a86b7f66e39603615aae915c2ba16c6f49c29443e0c83852015435a968614ce3759823984022542f1ec237d0be265fe26c2cc60ac4afbeec12141b3d147a59f21bd3990260c2b175ea7f2b815e35596d165efbb24f52277051584d4d726582f0b78d0d01be8ef06a9ffa0a4c6dccab8c7c46cb4036b37255166fc72d8920834eee0c0c6f77c614a173e44f1dcf991bf68ae41429fe1cc09a9670b84a980c6fd35e7b316d189eeb2a9fa98ad17fda6905105369b138352d1f9fc1528ddce9bd5d97f5660f87c4985335a81bea1e1f20e02b043b693431fbdf9d150a1b1aa14462a56ee9b8f2add637e347f4754666e919afd9cc04247ffe0073d0211bd6a9bb79bccfcc57f68875c9fccdc908cd4b32b9aad095698686f6bc0ef6beff76a00ae4b875fa4caac683b72cdab69ecc157513757c308e551851a2c6d05286d799776959c1712d8440649ece059078b3a2632455f128edea1a5b954f53ce26c5eb1073b9dec73120e8662006d70c9665b9c872248e8b768f9d0cafcfde0e358fbd8058218188fb4124ce0aa2b21b83d37b392e7cab788a91f83428f3129f619976f3b50299d80ac2e6c1c4cca52c463bde03b611f038025f47941c942b6f1c77823b84b75105a627ec7aaee0891e1192cce3c4bbd712f47917cf12f920c27cab93192de7b698648c95f3d9d3d0bc30e50a201494c555adb3ebfa41f1bee883817734b163dfefa01822f651859835dc6acfdce8c55d25ea21bf5260a2e0ffd7a19ff115e9336c06e901f944870776b131d54a079f40898c46c1a6bb48909c981c3d6091b7945222770a4647feee6c0b5d7da6bb3d0b4e2ccd9a34ec666bd2a490c1b9118618db592b5554c47e0f5635ee9aab385b29e13bd0f3b3a0840b01bef2fee2a4b70d90c310cbfb0df216ff4a8414203c686f8f94e65ef6136c37082f6e72731bdf3f6fd1b80b9b72450b94a6d28d53288b382f1caca906d0671f2f0bd0e07e20b0525e1f957917dad692e67d7c7e25c7424a6a8b0fa83f963557d8cbf64534b3ab28d35684053f6d8a01b7bab5b4b073b656dc43d266cd81f6cbfa0c61a4e380e99fb56061b08bb33f0878f90d190e126558da27b99d1f72d652d2e09e0883a2637a1e33491365e2ff39d95b8e6918083cee55827138b85c160d81aeb894d6dfe67703ff359aa6349e7bcc41188cab7376c62d13f8d0feb68205d2e946d93a51d142f495e16f6330e9d44f69480cc35215ed3babc1bccdb9bf94f0a6fb52b6be7f04035adf7f253c60f8d550a863a00c9fb42e97efddb271a568e80caf7d382495322d89d82ae5483e312b74ae0cae710abc71c5d8bc4c7a862c769bb9053f1a4a3332a70cb0181d3d4e38566f026847c5fbfe1d91b8412ff3bd36a98f7722b07243f22c1298ed437e11b7e25db671f6211959fb79dc85d6a5a90bf0ae9739650995f87e4893d94c86c9e730791fc21357a6f2ddc2abd8f4f80cc5bb01b54abe8cd94c88d3f5cb4f4b4453b5d8e27b7559db718939fdf6b9f4586000fb92cc39630b31cb50113bfb503526fc23d8842391794426a2014eecad3e16a48fd105676bb2e9aba02e916fd28937d62ea05530f0b9b96a1a1e7a864457fad5483e0e1892d1371424cf3fd351a7158b498822ff42a87a3d08f856a32296e2d9885c6cd4269f53cb44f89dea0cc08af08aaa9f19e76ccc71b9b7f9ad8aa03eea028233b691640bd62c6f91ce78607299df96793cc5f1d90d4730001cc852f0a827f158dd88463db7245ffd17c7226200b433840c9058b5c69ef3d2f4efca2e8986e72d4111ebd98feb7c4a38d2c0e6f892a3283c7ec62b1dbbb85d0b28af089321e73087b2e2b63da030c036b1f4583f190b", "5352ac005365535263", 1, -1413553797, 1537743641, "bb1eba0077164236f94b19ada6c9afed2a170f9a598f3f5d33bc04fda4741f57"], + ["8d7fe542023e886169057e1ed21a6211a4cb4d895fac3cd6c2655cf672f8e5b530889a2caf02000000035165acffffffff756741a68cc14fc937963bc01f9e7b416cd7d5a21c63f093aef8a8aca658ba390000000000ffffffff0174f94f0100000000015300000000020000000000000000a4ae720400000000366950b671785951f5192ff936b3ddb2b14a808d15381525012be4c5b2825320e854eba3dbf7559f61b8820a1464dcac97040a6193da21a4d7c840daf545f5022a34060b6428be116690c25b36cc95678f0a09b057d812cb9a68571e6d7d84fa000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009eb49c914080186930a09596764ef9aa39d900ad5fbb7a79d2102e187ca9ab871b98c7200a68baff1f06248e4a11aee9c8706837eda6b523553e11dae79284e431c87af9e7be9dcea74332362a144d56771922d999dfc0f3b5cd73a1a9cecbf18679f1e564e88305f50cbf442e0482bef6af3b7a1e01d2dbfb1ce6a3454c0955030498a86cf3f4791ab97d366b97b48e9b61682fce2ad88abf71b25efdbfbe37f2030a40581c7ac5e5fe4704b8406600db923488b85e524bd3adc96e8e0f8f99da2f0b0108e5b09f4348809f752055c9e1e019558fe15994ca5d0bc30c9a63460d7ebc1267c7f01316eb0a7cc63586833dc55d5a5dbdb7d398a968ac51ddb47b40944f02264531516977cb0a6b533daa7befb0c6b8271f2120e42040947dcd56ed864abe03159cb560420dc9106bdacb180ba21b5c2a182842efc5f5b25bbc23768b58898f030710ad176ec39fe0fe5f8de84795ec74af81c9be8c8bbf52b11b4c4e91dcfbb70205aa3043b62ae90222b9bb0cfc1c9d6b2f9c6c03d9bd19e7fbe5d7f52876dce40214bfa747419752ab5db530cfdeef4e306d65ace43d6f3df12ce53677c6df5dd5f6ebc087ed6d3360e14f9cfe58f1a661ccb95f12a6dae4b5516aa2270c0ca55a274ccdaf1fe85a28b3b69864baee266ded1f37378a519884679263b475d7583f2f235de858451f4fd9b18f3053973dddc3ab7139d307df38f9bdd68030449ec92d8cd0be38a2f978efbc1a7d041bfd580aeb05f5acb6dfac5d240d24634e06cbfb1f37fe538cdb089c9cc773985d4e2ad76cf83975ec4bbafa79f9d70f726372c2e088e448f64a96123cdf4ed372d0cb8a4a2421e5d5240780eeed927a4b122fa9a7598dfb6b3e7aa55154217bf391fc036acefd198d2e948a527ef8e327f24ff9573046c12d533bf6a3fe18aa03d156beef682e95dd0ba570416d79b8189acb39a548093fb970dbb8e763378f8716acdab1c15233028643808a91223fe240e719c9c41fa7a535dbb780c0980d42b21de4826fabcfb9bcbaa2f8fba39e9322ef7da6e3ad0179d49a21810012c5fb1c489321ddbeeeefa58749d02aa15f0d3e235ad0255ab4ced567c8defa0c069b93f0658ac6e49766541796594058fb9af43f209979f3885161b9be67e2972afc01e6d52571892fc679a254f765861aad8566d6a98c065f3fed9d0abf2ecfb3091ec220453f87f7ba6603bc6aeb71843cbfec92c09642d96d44c7790692b9dcfb572b191ba3a57b84904dcd6cb563dab6c6c8a6f39d9a61e5a81c12336de0d9926ea1c5843b15de0e56bd9999403d55855482dfa571ae81fd3508b0137e2089abf770499df829ebf6b817fe3f05569bd70313ea377395234459ce9098d00225db6c1d1d4cd735a2fbec807daeb99215a838316880af9dbc323792d938629e97398c27be48fd98eaacee0ddb6309f5070c13fc9cda031afd845ae4dec9c1030d6dbce518b42d49e8bd7bcb712d8526d71067df9a84a0400deb44ca4c98812f4573eeafaf297a124e32620ebc75a6c8b661aeb496804922efc58ec55c64874b743bfd90db0ad6e4a18e5d4472f52150020807a7ccddf08edc901d765494ef453fd9eb3506b0604144653bfa2c82760827b65106b16d36af4ead4bfc59573885de44914f40bffdda0505fe5430bc2f724c74afd05d6eb169a10adc04ac73f9baf0fafa42b09ac3b1c826e0275f09a3c5b6657c6cf065175ce22a93c7075dd303711c7c95b384524ad87cbe9a173e139e4ade5cd16457a349af0a26e9bc07c506a99bad933fa616edc01394a305e81a2339b6d47116e409500378c1913894f1ba5c16f8bbef2f166de4c58a88838e45c48d8918b3523c5f5d86b56505650abb341d824c4e43359316769699ffa333b33d51d28071da80e9938cd4326dfd0cc62725c09c871ffbf73d71870b44b4f2a40bb06d3cef7f9919cb559c2f70ab47f4052fed4ce20b1f29b48f4fb192085382094a0a704adf94d8fe6db3c1293d1412c17eb0878e22d379b31ddc51db09cbc57db971b4be74def99f2272defc8e46d838010ac511c025ad248848ac42430f5d625a1af25f48e5ac745f86e3215344b1b0484fe9960388e2116dfb64b47fee0d8c4c7b95b5b2460349ab78c2743588d9629bcd7604d49720a540df62ac9afbebea1d56b07fd4c49ffefeb388140db7f7fccfdf9e09ded6dcd4433371c62d6482837c9161a41220855432685d56d9cdbc670b8c865606c03adb889fb8acaf05744a755589388d54dc2ad15cd483afb0a5873c5780ad44ec0000000000000000c1fcd7040000000008fe8b44a8c70b9fe88252dc9a2a73d1337155a28b802c1cdb1c7ab65fed710e6a2b58b057a24c5ecde78b7f7720fc3ca8b1725ed4ab7796909c46c14cff7c93275084b371a1ae48e586bbb9610c31680742dbe518a5cd26136f1aa09be6be100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040f3162348b9bbe3d5d4e2a55a9944e96dcf4dcf69539b0005621d9558de9a61a2ac84a62abdf4600068d12f4d1d6e40ac205aa969886c4d0b74caa470efec899686e1cecfceef5da8376842cfef4fc33257f888a17794b579c147c7977203504ff0213214dd397ac9496d1f9278880d001c44cab7e384a3622ff752bad352b10216b676b6028059fe97aa6cb084265220903d45bff14619479ee3405a9a570b39031605fcdc62dd031509adf98474d8f9416b2fd52899034bf148e69a1a84a80f4e0a04e183e3a8b07dde70dcc43449120506791e5305ae2d65dbe98aa45e9140b5ecca9fd73db565ccafa27968295fe8143fdcee2001b4360cc88b0cf8817832bb55021b423e5f84563c1e521dd75f718f4235ec05651759eb96938cf8a9ad0e16c6dd0311b34f7362116a24d3719da73c07cbf75ad027e96ef1fed0288fece746a1c53e022d878d7bf69088cca2b8a8f4e36a20fe73fc91346a70a37a2bd30fe1b84f37330307185a46a8af225317a4fd93eb65a80a503121eb26b46043da15f53de8f0f7dc02190147f98b283d45ded4388eec8581188462a0f0ab3193a345e115f3c44f05c87d26d50648816408e6c9ad30c9dfe7da9b1a2803938797c173b734a250623c5158caa23f9780f0f0e48b65d9ce8d63595c66e76c5765e646d651dd73bdddf8480f811f151de47494bdc46911d05b1df0fe838174e096670049f1468481ffe0968c257add684570e859fcdda133d0cba7a13c6fc6f9bf63691e4288fb74b841f3a2ff457d82d6084b668d31f7dc6b4fcf2ad5b102df2d1127231235b4f8d2f6108e7c0e0b82e974b0da8e125e1b4ef66f1e2294741d063bf7d3ca0d1cf0aaade067532b89cf5ae1e5cc8e89efaf03785939f17197b89833463a9600f3a6e8287818fbe334668bac9c59e661f4f08972c5fba4522813bb1affe632741e1aef35ac2223ee7eadd37a0291006aafccfdb566cecf96d6f9c9f94c238fbfbc7b3288f17feb7c08059c6e2125544b74af98d1c42e292cc65ea5d48c874c902302202821da55f23b5c5bfdf3e92a8989e0e96f2a1345b67676f4c94aaf87f87ac4e2f1f4fb2d2337ad0f6068ded703e4ffc9797ba0ae5dde046fa1268bf229c76cdd8d5a832715ce802c235a77b731372717ec88906c24a2a811c8c934ccba78310a8d095c7bcf1f85bf1c66e9ea210e2b2f1684ae28fedde28afc3befafbcf16a7fe8666cb0f8d39a3ff04aa8aefe639cf3521cfcc473c0a64ce497567e26d9a38805d1d262debf322df8d961f46b352edef82a7b5bbdb5192c195d8f861e6893c44ca945de00259417f6966c71054c0f33a8acdaa9f77481f17fa004df4f4dbad289515c344bbd6e89f9993df8c7833725eea324db36cb29c27121d2ecc991ea1ff541d6ad2c42231bc43aa540f6fdb205189e583e01d231de7ab9ea346be617f888bf2835bf5dc17c7d653dd80f7ea7dab28a3bd2a384fafd9799965578aa94667ddc33e4ca2bf61db53401f633b6da00e24bc6e661c6e6f904b755b73c2c90f9145a6a6eb7efe01aad729e89d5e92bd9c4845db27c487951ac491ff56bef51dfe730fc7d05c70b310f4d9c048ba9c59c961b7e7dc07045b4cd181887f20dfa3c01aba508aaa0fb9d154b8359bcbabca3075f469788c0d598857c2a953440b6b02d89c636ccf1397c85b7cf239ffc8ee3fc2677865f31eae18897d20a3ceb9977417af192c1e2df73e37ffb66ee794ba89cb3c70ee03015d7996c55dfc3b8966d3bb8a10fc17aed499a7021801c4de835ef91a00a082c28937e39d4284025bdb3394b5c620b719d7180aa9e8a56bd8d766c01c6a5e64a444093ec0aa834c38e3f715bf5e25390fdafef410bb1bf1b65ccd5bc9e29f66a652b15c80c5b754841b9ba2c7c479aa5c31a5b053ba876ca9dc1d7cb21f3c4785381c4a1ea787702b29f7288789011abc8acdc6a27a6b8cb81be145e34596b239b9d76cda28f0db8dd6329db8122ab0a8fef4a13a54e70c7278c9f2406bf75416ae2fd488b35fc966a5545278e3e6760e13c84a7e454fb7f8d395b8c21b34b390cfd9b70d9b2c1195a0e4b759b548f1a1d53b8f933bb5c39b9ab7b22e216b48c539308ce7c6bd8bd5ba63f9daa86ca56c44a132fb64b3366083af464cef95f42948c5f7ba2b2c7229ff7b84f1a0689b7acae7bbe4e4b399f25a49b2cb5a6c23424da757ef3d43b1a56acc73621a25cacc58c15d3342148fc6e8bdcc9f0f4664b88035a7caf560b638c66e3879ea1a28b76d2b0f9eefb9ea49b218a018b8e1f5998df6afb02fee12fec249765c5e4a9a9242073bac0bfd84147dc0ae70484e36fce32c2b166bb0d95c246155aa11c4c0a90268ad6f580641b47113ffe017d22d1c5842c713c9d72712ed3bda7260cb067609ebecc134310ca7fa395b41706", "6a6365", 0, 508465285, 1537743641, "043b3e7b74cb996c0ed5786975bdb74989cb561f096d959d2d5014e70cbfde35"], + ["030000807082c403036cedad0370568c053b97bf16421253f8c57474e90ef6aeb2bb173a1f0d00557a010000000100ffffffffebed4066661219cc2593cfbd116c68fb40de7db8396ec1bd3f5d655c883cab190300000003635152ffffffff303fe1347c524df45baace880f15293e65b72150b5154bd0cd14551476f4c74b0000000008535100515100ac0089be68f503a5beca0200000000026a52288b020400000000036565005800830300000000036a6a52a57d4db500000000030000000000000000e3d8cc000000000031dc34fa71b075644d5f4dbf26816553c416873ee09e80024e825ea927800459c2f9ca24a840d5f6d1f3b9cd4fd9cabf62a42fb1eeabb280b1f0ed876030f31b1b33c2d0d9824172d77f54b04be68f4b9a9260611bc86893d026ad0f7267d91900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000562c92ed9220f38c3f68513b7ce77c4bdafb67e8af952021886b95cfc957c9b496702d93d292e0d1efcdaf7a94937d0274e7a6b045a4d87f148be574c1afdde36a81c78061cfc725f3662cdb7c355e1a60f79f5cc82379191352a103a62d4b4f06b958a77872ce00c8461e18b742df930ce47dfbc123bbeb4dad2a3f5bad4396030276dfd491a74af58526392b5a1c28c98a14069898a9e1f036b40e5c1fe8e602022eb468f1eabafec018054ca3f856d659528c79f997e8a00889d7507d9c563a890a07983c7d573d9b30ec1afe1220c2c70287593b3d549521274c48195bcf53e7d1631cc162c614ca7a66bd753f321a23099c668fd65ebcf9e7bcdd03be671296230321863c6bdba242fa71cb61fe945d6b050becdddbed4ddb0f57f353c739d9c0680311084aca092f39fd1261605cd612cf4cae82be362df9c12a6f28b2703b52c9ce020bccd634c8253476455893df25839ccd58c079d3383d3d7fb6a694c361cad3d903188d8530e0c6de1dc7d0dc7d0940363b1f52106efed3c635e343e56c694ef4b803076c04d8ab1993fbc2a73723d6325d4bdb7884907bbed777df922d97efa7dfca207003731a6710e7bcc7c1138bea1a14a804a6cd411178258653704abd4ef90823d4955ddbbe6b1498a00dac469fdad38003b5359a072ca53234111d0d3b49325e0681bf230ef0d9a1d997de632a5fc7107943ac6548fb1b513610ca06d6fb81d7625f9490ccf1db51e410c3ae8d159703f2c66f21bb3bc771aee2fc00e1cfeb10e786031be2108836fbda6872f9db97c1f9f48ee0cd89dad968fd91432b4b9b223433a6d8b3c362d26fb5a266d1a2051e3f5fee01f8642d6cbbadfb22c8747d94d8cf78a534713079427b702a9f1c68e972edf1426e47c626d76b89b80b1ba60cea50cdc8cb6ee1154b68a4950afcc0fbb450cb4889d5a76c99d4805ad98a0235a1c3392ea8bc61383dc35215cdecb2bbb48346ef01b2c63603eef1cecc464e0b6fdcc11930ad8c7d116ec0cd16f8f10ba31d01e285f771634b78c549de29166f919ccf5b01534cd6a36ad43f9c7b2e62ab60353827a905ff7445ade916025acdf0e67ebde4e91ef864bc5ed75b8dacfbb009afe65a82335a162b063766799de3ac4a3315f5913a1ce1eb6c64607aa474ce79389e422ad97b146e0f2c2a30c3db4e70e25a1a6c5fd0c5a7c3bc4898192dbefc063a0e411e4462c3b363ba0f27d55742392d4e8e40d884738ad1f232fbe1bfc23db59107dbbc991db930371702a6795fbb7f61bca888619694ef8d632e6e90e9b047ef926864293146e4e1911d5d93b758d2ba8ce327cb194911a81dde8a16dad6d02b55e9333c425e323cabaac398ad7875ad17b0ffa773c25e8ff5f3c75dab50247f24e3e94d6aad0743b4dfe02366dbe878b43bb112ed59196a2be097e53c8dc10784427eaaa9b12d86073c5471e376361c27275258dbdc838c341e5d8b7287bd60fe4f4bfbd048b143661fe7d2965f81150c0b209b5659f0bdad7a4402974c32d9b3407bb77ca6ee329d257c6c4d78714b35e2312ed535353b14c5db1450655c3af245e2d36d933a0fe02d4d76c0b142f6cc885b2a369645aeef2939028a58b896579792e4e65d81643932730b08380dca3bab2c39493e3edaa50b5d5816e07db5cf3303480a165128487647a26a86694193d951c9f3980b68730f75c4c51ec548ed6f3aa65e317ed2773a3c4ddba70093c9c4e2856d98afda898226ac26ef79d4eef2e5f8b687bb4506e7d97d5d1a3f7e1dc08c894930a2954bc9899503025466b9d694d84e9eb21de62caa36a7a4f486c3982458b82fc299a11c37bce99d4f5bb88638fa9c64e47ebc2b993cf4cccb27197fbaf3d173ab0d19029d50ee72b0c6afb4fd1e72f447d1f5e8b0ca74cb2fe4f14b1ac0f4d2d6845bc3fc79aef0501d869441310ed0957ba4c23aae0ae08f3adea73109499d57debc78f8094321e31cbc48bca3d5025e81d3b632a7b89082e73c3f76fce7e9b11944237865609e71e73389c070b6892e4fbe1efe66f59390ab7812edf90929eb375924bb00d9d5ccc380924089f8ed1d380ad4d3d0afa386d90561c67b24afebe30d2e7f201f6dd9a0b09ee3d323c4d0fbc40c06d5799f08757f312ffe382631e9140d36e47b6a83fb068df6eb34144d50be8b8b6cac608862a0dde25728ff4ac5e36b86d79407f091ca08e13ac68741ba596dbfaf515ec0f7d5a7273eb8a7a39fcb6be986bb01f8e4e2a19c4ffc1aa19bc81b10a840e86d4810b98a6bb3b7b4a5a419b59c0c550d05000000000000000000000000e2b798ed677567181d73416b1a5887281cd903fbd156ab45b419049a09b2f7b78eb4c4d2a249451e80bff8be950c5739876f1a5a5a77bbcf2a5d970cb06af07c1660a5b6f2e4783b8b196f23a937712b084837d8145d15a4a4e31f772d7ba156000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002aebfd4a865b23b4273ced2515e0ae7612d52c6d947afcbf5b8d3a2e677d88754f3f52af637176b434575478bf585de06443a8979c9f0e5ae8057d863ff6fb01183c9051006081cddff3d4dd27a34030c37c39591077c5bd5875ec2518266fa98533c7ff41e9b16993e8787e195254bf8daafffda848bb91b8eb5633c3f704f40317a2e0efaf127d6e4eafba14cb4c87ca6aeb1f9efdb66b2a2bb7bff47ee3f823021efac2a65fcd3364171df84f5bd5a941794c3b6370d8549331ec27859bcff8e60b04dca69dbb90ae428766244adb04dd0e6107815658114b9b9393ba6ea83ad0fbc24365e570dab88724d245af82ce8de746df3c729f2d18417ddb705763febe02032c1a83ed252a64058ab8825df86ec4a7db7ec9087f5457d81030e06b0f6690f8022f08a7d079ae8ef81c85dfc0e230a915f7c5eba4fd0296b91e2b9cb4264e0f600228c8db8ee5ebbd148ab5012ca7777357e07d3e1aa74bf64766c9fe33e0b130210208061479c1cfa1e9026c2ce2e3f2d0fe34a8d8f7a4adf0535b7a75ebc83bc7dc0316463d5458d0de5f5983be3fd6eeb0626c283ebde6de0d881ff533415c4d01e938e2141a914087ee1e66378ff9b562ecf7c71a644b27bac3afb74093d4b09f83c0381eb03011af6d4cacbae4d2b94bec11000329b5aec128997893bf54f72cc877ccfdb3b0d5e00038d36d0d38b6212832631215371dbac406c6bc88a81718c18e30cb8541a2fe86af005ec05b0559b6d0aab9ff242c3b3fa4e7ab5971f2ebd09a83437af4f6a020054e930be2d37dc4d1cc5404a756e950278fefab9d1bc1cc00fa4858849a446f7e79fbf18b6873a9946484b567c20c1968748c60fc62562c08721f47df8820a94275ae54e75165a86a116df647c07ca5abf5fb0d9d1e2aa3a7643dc244a6a1f71ebb406f229ba90a8514bf3e180ddaf0d3a88e4808b7e0b188523bbf0f978cf90bb3f3e4bd957bac7832e730b3aa93b4af0860efc092e6bf8a14e86989c6378041a7663fa352b93ee9c16002917c5900406022c414250d4e9a8c37fcb0d40a5d884e526c59d45d10bbd42269e7b6efe896e89cc407df3e703de9db12cc4415029fe3957561be7dac0d1416040e36c2f63d184b9896a26ac9085abd59ab148901192ef854dc527ebcea90e791890cc597974e4ed62f154659636447ef3a8908e31fbe04467ff139cd4783a5cfbf541e577de75257929f9b6ef464c0bfb596554ad99bd861d7bc69e96bfdfc69dae394b488982de69cafa2b2410a131727051d445ba78ec296058bf2e780b2093e1452ddeaeb4f90c13bb75262f61984c6c88f3c048ff0476f6513e6609cff9c4bfbd48824fc2ecb564d5f0618f5f8036d68c73de13468031b9ea2ac19ccd903279e5041299c256f095b12c15c92ea3a4c8259a3131de43c63515ffed20ed73436d2b75dc23d83c0ca842c54fd59d6c50125c4e4bd15c6605385b55cb1e53b51a32a1c7ad4b3708ef5d9634938315cd7fef8ac5c564bf05623e48c664c8e9f11cd355fbe740c35cbee933ba46467ed9942c5a0f5613419b77f804195aae7ed33e59c60bb86ebed50059b0ffaea7ef3da9d40f1414933ce7d79e5fccfbfab094c9538fd878f6a42247ec9dd30d39cafa4d10d108ff92beb8209288084e4aae21d978bad3330a0a379a14bc8d52f9c7c886b5d257b3f1ff51f8853689490948d137713c6d43f6d0185959a47a80334f9540edce0b757dd559662369306b7e07599db806866048fbe2d4c2052bd5a307755a056f7e7d8be084a9af4760d9017b5611340d318a4b17c646c1c5e209d155965a85304624f17866f671f14f023be856cd31e2ae203b362663d3a95e66cf80fdc5a290c11eb94d554017f4bd89c59c871374476941ab3f4cca5ab583a3a3a6b2a1f616f566753e88cf3eb438216639c24dcaf64c0072e0a7ee1b825aff07b768120b24babc7afc1245e0104085b6919a8a08fdf13a67b4e06d925b06a513230b9a3ae8a2f6efcd51ef7e4c486a83bab4843bf1f73b4e9da2f60b1876376ee06e340e90923a2227448d7e40db0a1760929b6d9494adb12ec074ca49f283aa48828925421a014cfa553a7a6859e58367ca633883ef8bc3f48257a1ca1e62298f8a9c83cd6abe208178862f0c2246758ed268f7bcab6600f53eb97299d7cfaa71a2fd37cc2564d0a649bff44bfbe94904d43b9c8ba279dc015e47f6e9e6a241126ac84684040b3e6aa64cd67b23323a6526c4638c19b7677db33b6c56cbcaf85cf54dc8f615d8ee14b31e4adffc112620000000000000000df45d10500000000c522f2a553171a6a64e1af850067b5c845261ccdf690ff01bc01f8cf5a2c849a6bd7397d6116fa6f67239315df48ac49aab772860e33336c4bba00c12b83c05bb8921ccdad1d1bf73acf173b715f30000811cfd9a76a42488041c8ebd8662fd100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cdefcc15913920f208a2e7540a33ade79da2cc5af4ae3a1cb2cb59ab8905cf2dafa8b7831ceb24189eaa95590c9f52dd340037e5edbc62ec248c1bf5d35127d73391405cad1917dcd57c3eac5b69fdb67ffc408f702cc1047d889cd62efaa577904f7ed6ea1fa3058088c139562fd0d4535d041bbdfda55a787df56bafd904ce03095b8b2a11f758bbb0c7252870d5020ffcaa0e2a98dd57b99609ad1f24c90acf0322f72d3c3489bbb18de8f30a4e204d7434ec1ad4d761bba440a6ae9eb0468e0f0a0171493e3e8bdda3144a95b4589def1af76d0aedb8a00205f45dc795c63e974ff7a686b0b86604c7a3404f46f76889931517c9e2ad356717e5f4f320b096a24f03145b25750562c955fa1036037d03a8cafb06e05025556fe329bba267343edfb703108e613abc7e4a5dccf8f91a9a076681044e2bb69ba2342dda6c88ab166d1463030c85cd6888416c48fa526521c750c57e70012abab78e978b1646d8984a7568cc03160c588f4c9814ae000e7790a6715ef85b857efd5fbefbb93bcae8f5cd7afa7a0201563540c3da12212533d3c7ce4d276415c6b433dca12bc0ea221eda78479dd2bb659556c5db4ac02afe75900bbe52485d6c46c5e5e813cc92e4cf9b7378f322f4c42ee10277b452db10dcd75b59f9ee8df3a6a6665155436bb1853ad5ba442e467099cd7b463e082440340778ec00a329debc352058d9778a0e0de3691d231beb63793f6fd51fdc24f7e696f5ca3cc9a853e53c8042eef1b7c5474ab74ea3b98c0344597f2a4fae9e6761dbee5e4d80be8e940cff5174547b2c5a87ea85df432fbc25c5449041e4ac74aae7c345e26b706a6b680a0c917ee44107b0552a2743781062545ee5d8ba46b21ae1e249737393732b5e6fbedef034e33702c217e83e91a15313f4f82ffd7aae8ad27680d6e65cead3c65cfc269892d106977b8ad6f154fbe9267b963ebf7a6f6b73aece0703a2c7b1b90d2776b88bf330ad826b75413756ebf1050d97cf67cae1eef1d1c6988e74415343fb4d5dda7b0cd7d1db33fd78dd7be292c342673160fa9d04575c109a142625b38f1afcd3995f71867b3591244b72865aed00ccfccdfc805b587ce34332595b81ba6db8b028540b0eaf38cf68c09094fb9779dd008d329e0a92ebdd5efe1ef797b476774ba9b3788a4fed52c8af976737ea734526e6ef0b8d3add15f60f697647098a191350bf22aada36f178683d9e9920c3dd3e83f3e00f6ee2355a62c03ffe6b92145c5c98d59e0ce9bf81509f867a7875fe9daafa75ac9a02d7482035db72fe6e1cfb56dfef6cb25e46b8b20020e3c2ebeb48e520a9bf9ca8c6f0698255ce2724d8015c3fe53fa52dc42f8d41ab04486f865bd29011f5df5aa044ccfd6c7c90bf5e8e1a182ef49555d14f7622d78b60e7c62842cd835896a1d7c5e0547249ba2cda9d860280c12460d6073d93901b076696083b45fbb6fafafadf26c853ce0c9f06496ea47644bba8fd7b75f9c2e6dd831bab47df28e2e85c4efe3dde972b324eea279b2938fa2dad7d3976e49db679e9f36258c070a50e41eb721e50bdee6188c20b4cc1b32fa22af5d0aa590d989d6ba0709108ca4a661abda2ed9c4165eda3c7dd29ddefdc2c3cd2c317b519f029e7f47cf2ace5d7015fc5d45c988b2891845eca082225ffa072b7b27a2ea197d7d8af88c9aefd797e56c2459fca459f464486ff36d45b540f9adde87a3e203328ba6161eb9d37fd4dda3fa56fb6ce47acb45577dab5fb92901de5650472b7713253b0b07529fe8835005cd18777a8132ef643acbb9c6e28531853653b8fc9d589d2e244e23091f966b1ec181e7f42c546821b355b4a48b83598ca993eacddf354d74e0028afd55b81a2c42670e9160469af005e2beeddb1191ccb5851af95b89b944666a4d2115b5a78020698f41f33f95804da4b40f9c891df69049a0a43896f278075b022c5944828829f3cbeb39eea4dc64507c9467be348184320d62a5a443bdf844e5d5f035ae31c0b7fb912ca4185b2a45b4ae5d4837669ab541ffca7e043dc3a705bd29453504e9c457067cbfc8a86633b403403e9db240149ea6022ad624d72ee207517ba7c4b59133a785559db6502b8f48cc9638ea3160240586581586e82ab2e8fa8d6f69dae5f691381f842b61fb2b06ebc51dea365d3dbd83efb20745f63c4d7b4ea82ad5079205d9ae1f03ac91cb6be22c45cc4d19313967b154d8d6c84d3ea4c36b522f0ebd40e3f2fdf572e218706d7d31fc8f734eee3981106728d26426278257f2c443817eae4de2c7a5e29cd7d35e73c541212ec55e7148f7231be8a80d5ee7667189c20c6c759467c839ce3d68b83b9e9f4aa459d5f3fd71bf818d58e694762d5956fac3fafe766f6365a45f5733fa0f21aac0dc68fbe93131a3f887a5bb23a236b02", "530053", 1, -1640362803, 1537743641, "e783c18a652fc23485a3f9f86381ba63fd245450e84275541e349141977e848a"], + ["4548a81f02003b3d90bd5b896871ae500bf6d021b89bde6e244fbf622f1d820e33d6e5f7200300000008acac655365acac6affffffff06ee463ad5626783497f0772dc4e8c882e449901aaf71bbb5369312c1deda570000000000465656aacffffffff028ddd470000000000015118b6eb0500000000070051516a656551ff31d29c00", "53520000656365", 0, -2134783281, 0, "b2724cc1d8c96a7afff15cb95fdddae9bc819049e59a2fa84a5c321f3f4b2265"], + ["f07a302d0198b99d80920053cfac597be621a18273c9fec998abacb8cb493bd7e94661f9b7010000000865656a51ac5163acffffffff038278ec02000000000079e7530500000000035151511605ec010000000004520065520000000000", "ac6a525365", 0, -376100747, 1537743641, "6018a2b91294dbd18350cf9fc47634a2b596d4f40baaea8de9b9bb9dca4c9fd9"], + ["030000807082c40302e472b9f27ac0d55c129862ca471e238e0638e6f4e4918374419bb1aafd7a44b801000000065363515365000049901a8007d5cd63ee3c3a1aa5255351fc7dba4e55d9ed94326640ee22c2ca352adbb201000000096552ac6aac53635151b3ee9ef60279589801000000000951516a65ac52006a63abb61b040000000000000000000000000000", "006352516353ac5152", 1, -1569707576, 1537743641, "b3e883d238d948309dd0ac6bcec4615b815080b0d31b4c047333660311385dab"], + ["8ff5244f02a23441c464b4a871ef6ac081359f8bea6c586cbf9c96930ea0b567622a28695901000000056aac6a5165ffffffff47bf02251cbbe105993bdfca747f536ca183e33f8d2cfba321d195e25030730e00000000055153636500b3c8da850157cc9303000000000465636552baca507e00", "ac", 0, -1073574162, 1537743641, "726b251b5d4f426accab96fc8dff72ac1efdc64a6493cdcb3045dd49c3489a18"], + ["030000807082c40301ecf74b4cfb12a7793ad92f65bba9529684d4567b203f9d324bdc84678874feed0100000002525148a7d7a101ca6ac200000000000163277510030000000000", "6a656351", 0, -163837513, 1537743641, "b4d5fe8bb29a2ac5535df50bea0ecc730a0f5685807a91d9df035fdb017db7e4"], + ["030000807082c403031eb20b6ff1f7d25bef3d2c9f9313544094a01c3af8d116099d075d77732806c101000000075100ac006a51acffffffffadf0160dfbca7fd4c1d8ff934cd0848d3ff3c8b36a3642d08ab87333ac469eac0000000006536365515300e78284f6f7d55548f85cf3ee0186b61d7d887e99c59ebd56bc9afe0e0f215789dbe79f680100000000ffffffff04626ee00400000000056a5153656582fd5e050000000006656551536363934fbb0100000000036a650073ea57000000000009636365515352515151000000000000000000", "5165ac535163ac", 2, 1694039558, 1537743641, "bbce0043255e3425ff20ca9705823d64854a264cef468025143b63e5d8cd1507"], + ["030000807082c403049865c45b8c53b94f6487ab79bb3804ee85cf55045eaf76c720babaafc4f0e58700000000025152ffffffffc64c0b786eddf5abb61a4e2386eaa40c5ec162a128c653c99064e8f36c696d040300000006ac5153636552ffffffffdfb8aa980b9eb3ea62538457b74253f2817765f5cb168927fbca1a13c3c3582c0300000000a423715d016fb5b5d4d5bdd678dbe4453946560503ee8715dcc7dd9c66af47a8dfa9fa5b03000000046a525363ffffffff020c9f7e02000000000652656a6a6a6398007b0300000000076363ac006a63000000000000000000030000000000000000d17c020500000000847ca5bbe6e0f4affd3033b708033f960fe9817cd6533bf9cbd46e62eba158b6b7bde8b9de763953c5bc82242d9d3da9a2ddd1f59dd9658d2c78654a0c36a2201df706f2e2f0a56f0b5763d41b8f9e602be89ad507dfbe7354f072d4fc093723000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af1efd5c2a0926e6e94c958751385543477401fcb5a8f1641a2d0eaab2bdf5b9a319fc389723e749aa7febe71070a3bfeb815ca658a71e089d632e976e167cae414e297f4b9b5cc44a3e88c75ee06c84983776dda95994967567a8cf2552a9e7c80d7d2e396d26bbc18c12e2a3041046e712421454a703cb6f71be66598f6850208a59eb44638687bd797c56f852f91a5c5a8b90cfbd32bc63e43bf465013629d0202d6c9c5013ea55f8e650417d9322f10da55a12a4833d81b80849e22a713bb8d0a05d1caf828bd327ff721748f9c8844a005517fb1b896c79cb55fbb4cfe7ac119097d53cc9475b8cb2e45ced99d641afe7cfdd7edbfaf449ba375e2bd21becd4f031b782499e769b6c89ce63069647e845de17557fd68e205021fed106284efd49c0316e20e9efa06142c4e31561fa4fa36d68606a82a5d370de32bcd4dad790caab6031d11a38406229319d1dded4f9ac15a7ef32c43f23f08c14aba2357f474f15653031e8c2dcdccde5546ab697aa67981082cd2f106f22e9727bbeb54cdccfe5e050f03140e3e094198aab24e9624a1e442420712d91739548042991f5fde048c25c1ad9e9597363f910e76333c045355c7092fd28ed0d3890ae5994fe996ef975718731d1fef37ce4e3eef9dc32ee6203cb3eb562cf55eac031a03bc573e00a00eca2f953afa16d202c6ff1af5b513f74a58d710eda698ae98005348e2fa4085372733213e987b7c22d1184ef7f0b804c428439b8c2bb9ef451e5fe174664676c7086a7a039972eca29718ff592eb158f0b070c815c71ad174704b36cb85aeed010d9d490ec0e7747a3a18a7959333c2cadefde071c5b5843e93035666d97a0f77515a0c03fc4456a9abf1ef1fc18c0e20e7a92a943b2a4596c916830d381897789ae6c131ffa3d8566836de39fdec99644945c07c1f05fdf2a1ba014c34861d7288bcf8e7f55a385db0ed11d0ee3886702d70ad47669b8104967b0a95a20508b2e315f2e2eb64ec3ca43daee0ccc91312afd3bbb55b562a3a28e08a1f1c23f97f165d5bf0113bf87db694d439ab75bf076b07bb8967017fca1d0537cf48fe6c63e3060f427602409cf4d40b1d534585647650d39ad5cdb2b7e280521ac8e5d9349c514084f1316e59495c24f21e04cee193a230b3fd8ea3e02b6941cafcd1ee79e562c4a1c35af97f0d8050d232f17dec49886901b3ff2dcbf217e3f347acbc5d6554caa5f4d1bb30bbd248ea3faccb1bb150cbdd2a67b9368803f103cc23e3e563ee5692b5ea5ad5b797b06c38dd72818d69b7a546b56c452426acdcfa799f5cd90d0bb9c224bb8c27ae32fe362fc16ee441c5ed4c6beb81fddc671cfde0fc2aef16d2a38725e5b5b042e23febb254300aa28723640bb5f81d18c44aec6388b0b30ea9cfdc0fd537a6017aed5b12d0a189e5752d4ac0e79f679ff5475100ef7611dba6aa43781654c2fc591f9501cbc1e56e7a77f034b6d1e89ecf9eaa1d775309bbbf740325f6d23cbd5ec2a015483f06e7d39a2dd41276b9c4f33556208167a965417edc3d44ac452b6d6f6d47ce178c1a49aa3b810a6a36894ae13373f0ad6f50e3ed3963ceb1ee5e14e27195c5c7d0546f3b3f9dff46c9f18dfb98861ec433996ea995eb165408fc197214bd876a9b7bbc057f41560e7fe66aaa1da8506690a554371dbd09e5d7c3e960c5475c0a5e812dc91f28008b5d0b0319b03617cb3fab61487a60e46cf68d4032971885c8cfa6589d3572202f5ec5d0bf6f0806b4244f7a8049d23fc58788af0cdb9ead4c6b4e14200222f07e9e75846edb882c23e2aa84e2035cc52f116195e515b221824c660e1d015433c30fc183679b47f78f3dd9eaa011f8a596eb05dc2f640a8ac5ab532b5d758c82b121ed930bf4d7e673582f5eeaef778420b1d875d24393437f74c010d2af1becc31b1bddd7fbfca2c516517d6a3dfbef4be72b810ad09d5aca314a572bbb8a2c474fcac211ce363c3e0800e2949368b5c3984afb4804e4fde20fcc5c3aa0f51f6939c4febb8877d65c28130cd05cc6f5089a3d95c140cbf6b486a03fb913aa061e98d2aee4104ffd6c69b9d527c3cfa3d04baeff54767b39b1db61aabb224fd4bcb35097b28126c736e934d280a61cb675d9c74a45cb91c2cbf04a971d8b8702d61e901b715377e981cc5d59b71ed87b501ef9941fec7bde0226fe5d150bc74a6ba6968e588bb1e8b4349f3d3a532292558a0a0287de80db788941ac87e03fc999c9ef23687fafc3174023c85c345c885bef7b139cb492bbaedb1cea08787bd9040000000000000000000000003fd90ac30e6dcdc939a34636f08fef0c291cf646f52f13947355dda3a1adf3349db3ce0131d0cfdda4246e324881e71c4f38f27409619c6499eb159706e7172daac56d71206fe5780a2af0bd24bee3d2a4365acd4a22b9a51a7f97ded7d6ef9a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000089c626d317568ce598343de3557cac077ee8de8f29cddf5a0c79ca16d87fb78d5f0b84f5a0a17329fd06b3a0361e4c745181eefb8a51d8be9b707ca4970952a3593499a95d2d884dbb5e88d79f97928c8c474ab1cc16f336e70c4c42fc654d9c56e529deca9a207265b45a8d2bc379c864783195f4aaf20db4eecfa2e9d475a503256ae1051bc48b0552811da39af4f2822a78e998fb108c79bbe9d2582b7b66a70206e60bbe6c3d8c515b8d7350c84f10d15ef422d72828e264029dd1c7751a8bc30a0007bf02c1e0ec2e2c97ed40271a4ccd500c66fccb61909033dd4dbf5ae1db658b991aff288f82b4f46aae19697002087bf46e274a64ea4a3bcde8b9a8ed7657031903706466d7424ca9ccbe37f6229fe3c249b86dda77a16f652ac16750c37b780213e6ba456b12591e3f0f3e852ee46d2f0b7ace9b9faa815bf64e42fd831415e50323b3362ea5151b56444174d0c2115795289261c80c2faf180794755838e18ba402143418b16ec5c1d7627ef2099f2fb77ba23afda016a0f0c0a6546e17331ffeb0031d846d200145fce92eceb3a8fe8629b8788e3dd1a7d4e2e356bf876c8fa2c493efcdf7528f1d7cbcb4cdb632c2c4b5b715b0d6f9fd71feeffe836544f662a7c34b27a9f54328d5e96be7c2e2dc360ab1c098a58b4db7311a1adebc94afa9eab700a7129f101107fcd50b0941b8565e6aae0aaf8e39b6e4815b5b5e6b9e7e00beed1276db97c223b92568b4b94646aba7532aff457240cf1679ed3ebb308c7bca6f594b07e8091634ad969ff2c5fc63ec9f0f8d40f6b1103c1d7444e859dcc266f4081b35cb8bbf359038005b16ca969e07c681f7de7869f5a3950dcb2e56a46c931f278ac8c89e3a71136c63eda10e9257af5eee85a4cc4e4ae0fda9ecc13660dadff3b07dd8f59b25de1dd4ec5a79b160a21b62a4b64e3ad1487a63e849d30d88ec3802628fde99a3ea5560852157e31aa8810769e7d2857fcf3a2624f5c4c298c961dc6715b9f349a65a7ef56435a76202112cf8224f8c52c688b556a656029c6cf12485a942405250d3739d808bb9f0b4ab77599b36c192e26240c185e4e958e49f09d30aedea5412d820ed0099f946d148bc7ecdcac830e562455c1c3efb13f1257aacadb8fd52116450406b6cc950e652c0b9cf9be5270d3653ee6e888035b91b0dd2f135c5e759563f54ff3834936e4b1799f5dee6e7db75a8e129ed9dbde05e3d4777a89e9340eb3828a63d4025aeb4c8cda5ec12d66eddce3f38743d3c207b8180e0f2672f9b07fe1b072c8763ef792ed5492645b52628bed9920e4271fd15f8b96948e30d3240fbc31b41f08713ea3d2165c24c9195ed967977ff9754c3784f2f3b9d0d94606acf51269e3df00447da0cb4022703ec0a117fecf69d611f251793735f5a9d66d43c544762473db868f9ea7623c3150a29cb83a03aabbc17fba1a7b13f395c977545115398411eab875aa43c764d6336c8a93481eb099c542fab2afa47dea42d020b074ade2e3edc0224a3fd14b4f38da31525560481b29de8eb7bdf98f0ac5d0af1242299557f6ecd38f0b9d2e46ece19f33fb00af0015bac5a7fe8b3d48c0d419eddd81ee53f90b0a7669f66b3978c4b0985287d5ad80e13374c8b08b92fad3eaeb9a0660ca5c7d88f568cd2b43d96c99584eed09afcb6c3b7be644397feff2c5c2723747bd2b0cd1ca44c16fa9d71563de96798e20e062c84118b5ff103963d7aa79697a040acf12be3d85f7b3343efcde13eb73354863db0d66d8818832d5ca2319cc669756c19d7a9716dda16274f9169f13104257ff19bdb306e3b1893592adc96f111f21f6a695a462fd0d4b493672d7914eb966b2a5389cfa58cca6a740175750d07d73e378ece2cff9670bb51cdb903bc7c59a0a2d25840c06630a2f4aa4a2d3660e8c221eb7cc599d6b9f27af9ae3ffc7b5e79b9e127582e03615c7eddff87bc81142f2aa9da3b88afcff943081792fdd10ec78eb18f72076883169b91a5393446fa221a0f8a9223c133485c48abe57c2afe64b18312287f49f932062d449796760800e5001ef58fb7e3ae3414834c8cab71cc3070f0ac844ab27baaf794b0713857650c062384a9804c32f37b0c8daa2d493e231f3589b9fbe75923edccccfe7895f9ea2772ec70398d75804b25461c530a920ad81cc7bb34918fecd3709f820396c939b271fa083f97ce20b62e3726fe72bbcfba26d63978a8edd1e8efe02a67058a09e036254aa0d1af125343cc2f36f98aba4b4a4c628762454b293583726b25000000000000000000be3d1d0500000000d9cfc2d44a03be733923f2caf6af64e70a74987194af462a17bc1ad22e6af58011b51d41e21d3c84d15f8bd4b2682e5af89a3e23359f378c4450c99a2acbcb0f2e015cb182b6b581a64e7b0ef88847d9e555078ad3072406a77f4b99d4930c8600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2a102bf0afdc010a180c7889ec6ef303c7ab4de186e112490888484dc7e2f222c6f9d880e40c9b8124f0757bee60f571faec908c467b306a7cd4f56e78dde94c2d1f91966dcf53385939c1fff0b298a3f8b41a787b8ce85ec2c9ca1caedb57ab58c87538eabef3eaf3d305aaea6bf189ce876fc7abacf46494d7e24518738f022d403785e4e7eda67816e999fd3bb927905e711ddac5391ea790db6b72bdbc77020148cf8a319050f644c44ecc03a6e0b1a166e1a38c3412f1bba44929100b3e000b0903764df8a0db2311c2c9f25441728d3f6383bf46dd4c23ba78cd7f9d393d2c56cf2428c6cbbbc68f707d13dfbcc026427613978d66e93c69894673f5a399e50308a273adfb98540ef2ae6d31e1bda9912703346e7359b4c2b468b5c34e5629f702300787798d6b4089a61459188b2298106c0ec85518a5552fd34c8961ec279134021f1d05098ccbf5722bebb1bdb6457fb4d65e83efda09c87560f292809fd30ed403132dfbf01097d32aa6e8f577c09ac1c87bdd7cd8301072532d21502021f60ff1020934254c1becebc5a033d7844f597f4f394f42a9a909f0b78880d381f2d7758b94a5d6b144ec514791d0ab9ee56dc84c63ea09273524e9f9323385f35f4a4dddd8f2391200ea94a4c2acffc6795d7b51431f288724dd818707f2cc0faf47665d9c68110e9edb52ac4f9a50f4a20c71f1c9bbd5f3f434df0c1dbc3316c99501de418a9ea9e01bd5c1861e3f88ecb082e55f1e8ce5806dcda74a79c9ac20df1f02516a202168aca1d1ed45a93b762e3d406d25f7ea942a821b218f1d0186ff5d6b8d48600c67f52c4b259fc563d52e6181fa6efd54171241a9fa4e72df6a3695d0b84dc81f0814d0eef4ed2b88d3753691b35bbfcf258faec4117eb41ebd4dfa91329b0331f5b78e3eccc9f2010c8a63a62e1589af03872659c1810a30765f2683745cf4fcff1174d8ef46b70b8e0407d9b4a87890d5a1871b02f01b8cf88e3715b731edba3f03b64fc8736f6b99497bbce921fe32fc90885678e2d6bd2005f6796d5c90ca17e0069d3326233289de60877d74c69bee1a5f19999cf826e71c78e9942ba912f9b3e577a58f111c66fca3b47b93f864a1fc796c9f701d7b9c50e36db56486c2ab8845938302e95ed5b56acae2d1436d1e9549850c2895782327345e6c07b0ae823e06768dc9d968f8483e06706b0b2fdeda5321104c5df93490460062433c37c07640f2f8ebe6f3b12862057ea4c3e1e995f6788dc60d1e50ad0c60fb9fb636ac225859d8f73198c716758af74dc3d8225b53fd4006c69b7dc1e935c4c743ada51b2c5ba40b7ab594d3e9d55183f4a6419fad0c5d94a8b984459250a04e09f86c6c2e015eb43b9c9219db9a8d0dfd6d3ab88853cd5a52ac826f0e882006cae7c40fd4858fb83f55e73a88e2448af7c0e72a88f4179de2309fb0ea631666cb2231a8b4d647add4ffda8ded705cd2b42ffb5aad3b453b6d77ccbe2965cda84039b79d7d0a3c85213b0d06872439bac2a526721a4cbf752a003838cd329f811f2634efc33baf1aac768d9fcbde65fd1a2eacf787c2751f48d42d2283931f5d7fa12eca10bd2bedc9f761c754ff7948f08691fd3938c6fe8274ebcbac41b77bd05791a124c5189e913e5c8f6e748dadb41e0661a3c0388b85efabdaa257ba0a47bf32834ef6b1ac7dccd387886abb04849c680288b9f74ebf3b8d76000e361a21a7e32669096c535fc60e0d43a298da8163f35a7613a6860d788d499786e9472a81e4c7af1dbaf85350c85da7c69b5717846775050e84099749899beb54c163e97ab440386583821114d47441158ef9397c3ba38be9c7989e95d7ed18137bfe675f2f441035e219087f7b3deb33d92af4caf42062cf79acd48b1c89934c181f47208979d5d0948ac87cad7c3df6f4b8444e66cbfae5720509f6ad056f5a1abfe13599e4e8b62811a788bbaa3f39c273fa8553b9193c1d3b1626ccef5065f21b549e31225e2ad4b0b5a82a169f6054cab2b1c79421b5dcca119d872f97e4675087fb6d9aab08440a95a60a5f3336c20c0ac14df3a7de5c9ceb8777cb2179f12971c68bce042239dc6aa3b51d70ccf4eff7b4f7438419704fddb013c0bc9fda9323827f025375debe32c062cd93c2fed31da0f321fe6971853ee314a0a0e6b0a84dfc7469e1ba7d8dc598cebcdfeb767af563222381e94b6690646d856e3fa8591395b16d72976224b932639678bef64fa6781f132b7adca1f851f9e302d2a2409e780ef8700b1476e59845a1ba3692ebbd1c1d8b480485c89a6eb0fa964c344c24204a22bba985823745819e353c5b9de8d16f519fba12ff2dae296d2e8f675df4981b5bcdfa95d9ab319e706d82ab347fd8045be8631304eaec59ed835de4568ad98451810629020264d5ba5b51c105", "63635152", 2, 1679280457, 0, "f2fc1348e3a61860727e596a2cbad63c7ee292ee872d61478f4dda51bc5dee62"], + ["b6e44b4304bd50513fbf7399f2652f2517df477ba48775e9ba313eaead6fa85622d746f271020000000900006a516565000063ffffffff2a953167101f32ba8f69b71912fd960aacff80875350b780c5ce96d0ff5efb0a0000000005510063516affffffffd89e818a3eee72e62f5f840562a563b5924a0a9762bbbd1bd75441328fa272af000000000072021036e0b47cb167a75130ef6a5a8060a50325cfe91b2c64a7cffc09bfde8f0b5489ed00000000016a9863f4490386a20700000000000252ac88f1b0050000000006acac52516a52e5841f00000000000652535300535233b1aa43020000000000000000f22feb040000000021b2601f7a9b37a011b03b5f515ff8643a0055549919e4f7f53b2b8349bfcc478ce8e6d91fc16413458618fe34ee6987b6f5e2c542a9cc9e6d8c4982721c7d38af47ee256fc246ed12f14fdf195363c56731363436f6640dd38e6724560282c400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d11ed4f7e2e53a7a617437fb0bf6cd5097b0dfc4ef30db07f5381d5d166399c33b73c5b6a8a6d288b98d5f0e2ff7bc766971d38439604d42e08f6f9fafa4dc313ab62bdb0335672450af797607e01e80345f2e803a54ffa2979f5b576c8d20af91d7a52b36d3b3aa8f386e0f8ce3bb9dfdfd167096484d43f27380f2f8dbfb3e0224b6d1af804d94f5b516c24b0b4d0bbb922e7b044ac2307d96a85c6368068758021dc04affe882164b1b80501597e63475fe700c7546088448219d89375e32bb1e0a07284badb3e9c1a01fcb001372b45d698378cc2cb4803b3b047488083a9362d55d9279776e971d83727a387c8d4f659ca3a752f9bf87cb04588fe9e1ed9ec6ff020e3e08080c6cd184d8cea0c5b52630ee918c586cee7289670aa545a1191d6f4a0328facc3b00a26043caee5b99e0bd3e53de73dea45e31ffa96a133daeed61561b021ef414132a21b446843d4a80c819e568015a05aec273fcaa7253462b80c3d9ea031b55344c6b3070a1f9b540e0dfeb76f2e776e5be0ca44b599726d278e3d81d2402219bad0ac6383cfcaccaaad88a5dad5e0e775cea44448aadb246e53fb61de91ec3ac4defac03b1125f3e0d5ccb454a61b850ff82cc56cbb5d2a59d2d5641ae3162b189047e10b0b9b36be54d87d0b8329621e7df3dc0ed6b92d755db0a1e3bb2f782ef2b0d5ffc1369b8be81de228db481dfa2a5bd81eb1d8bc222e6f17224e19dbda337f246ed13063cd2f65ab872d9cbda17bea66b69c8715722bb9071bcd17c9fdc1ea250d7fa891520138fd9f90e5f683f7a33beb7a13d17961e20eb7ba4fa155c72849130140c97da07c6dff706290c439827e5c0474c5db1e7ad392b4f0ca41d021580f484109e43079b4bb9f4950920e0cb9321273b9b1b5d01d83cdf3c2ebfb0e58a05175658ef82634baaa9a4ccbdc693990edb2e48d057dfbd4f47539cfcfd2755fab9d707b3d0e2b345e473c8c956cdbbefcdf7ccf862a4fffb7629aa900878fe4d44d986d3c66c95294f5a50b7fb95c4b3d0155e692d6e8ae2ecfc89632f169389e6a896e795145b56127b96b85e5da33731c7af089f09e2e4c73e55d1752b4f0fcd78878207e3c003fc09aecf3fcba6cf75c45564791cf246581bc77532d2cf3e6f7d06a70b4732aa4b735e4a2685f97fb031b01cbb35aafe8fb62b5592d2f1c7f521f25e31387ca8bb97bc7e2e9efc31dc31223dee2b02b9dc189cb83c253d2a24c28d76b426bd25de877a2465428b396734bbe0422357611fd04613a8c7f8796dc4f5a1a871d7b459feebf14db5ac33ec799993273126dbfb1304bd94f56e1914a31b9fce456340c9364ba0ddc6ff5c9662381c97810bd42ed8f5938e8426b162f5ea6c379873fabd50f2a073e7480711559992db510b9171f089f9062ea797e24941271752f0fdd79a4c85beeed0f76c4403d23e7bc70e9ae2658c744c2d0afee2fa44a78c6d1d3656866b2ecb3869418edef9f427a639869530a0b60661e3bfee270da394419d5648ef47fec4354f216a50c2686653793b523b698399a5d9ada9d8cf23ba3015a8b9fefcf7161856da74f0d51763dfdd1910762e9aa279baa06486d48d4d4444e63b2bfc65c368d0c8d47c4901f48e3d7bcea3a07a772322c58c1811796be0fc4745fcc5c695e7a3e4799a2e334d1ad8b720bf7312a155bdd66f6a81efa5cd41f1bcfc5e29d8c8e6655f8ee794719c20b7f059b703639b7c378d469896ed5cfacd3d8ca464bbe73e367761c5399814dde0f3d589554e00af85ae9fecea43b315285ddca11fb775c394a6672c3e58d6a6963db185385284d227993f16dd9d7392669cd86e6c2687aaae56d593d252c654f942f0d0db04ce5347f79510fcd1c053bdf5022f69b9fb08be42e39a60dd34f535b41abed443468d3a4802c8e9b1afa828382a404411ffec025806b928928aa786057b71bdf1d6140a9e594a16757c805db2121205779453fe541db9e8156970ec08af9214eea01fde166fa132e93d5c5641d4b610c0c662c97cf7dc1694e49e045f10ed6569e85c878eeeac0ee821868bc5dd501bf12f07df9ea628c224f766a9256c3553d3d97a867e25c011addab771269eef76e04c11e7d8a1cd084f211c23438f182a55b8d32379d7e2ab4c3bceb240b0896b093e5e26a239470029b3ca6d9f741bc8d4da5bd25cff0ce6d5b2dc7a4d2c5a52561e8d45f26c356ea5de0016527cb55e4a2da58e6462e9093dce486fd3e3039750eaf7b29d71114d10facbfabb69c26ceba5ab9c9bab96a551b216c36c0c000000000000000037c2a20500000000b23b1d7eb2efd1b8cf8040e9421ca9855cd7cead41a862eed1af82820ea9812f64a84e30d91e30326dccb1e8b08fae5771caa26e3de7f1b541eba7ce49d4b4eb8b73469d358173caf95f895f109fafb9f8208c62ae5318d111949071e6c7ef820000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072e73db8819d83147403ede0577541ddcc5ac8901f0840c1e41b5abec405cb9235d5068fc74caf20e2037ec0e0f606e3e8c250d828d195efb4a8890dcd202f542e8b85e6ac8f4a4a041b3e7873f549697862f2ebab48cd206232d301afc67b896f1f4e0601b3e349cb0327421213bb6db31fe0283bb3744db80bf310c866817302057f78d1413a68ad44fd9b7636b24614b6926cae6058e7fcafdf14fb769f8d5f0223512836593affe6c6e56fbc0d129568201b948f6c8031007803fa7d757c1a740b058cf15f05252c91d45e3713fe0edcc9e6f40b7c29beef20a0b1bae86e8956a245e1c1aa3b062b23552ffcc6bfcdcc16edf0e41c6fcd459483a34e6ce9713f2e0312d4fd8774481d00a4fb3832dbd3cb9a01c499741b7daa8d8f43e35641ed2658022b5083b35a20128c30f7706be4b4b5e02fcbba3cc11604684af35fac0fe1642f031bf8775358e226a02c1f3082e0069dc1bb016cd311a69051b76997d9e9848ec803026b8312627683e4ffc44a710a31385f88e3c031d71d0784956d1a257c1ee6c90213fbc1e8eebbd07e2f6a50525b5e3a7e7ba7fcbeec461d2a3adbc8b72d168c0c732a59553337be3ca2da2eabf9c9cf21819bc0769bb9f13a4ca1caadb1a7f24c82aac3c965f8ea4ae3b332ab9cfd35cd71591d1472f3e063fc883b6040b48637ac398414db4ed6e10e89cd5a392c6d42ee399ec88cca28a2e68b9ea68d1d0f4337b2fae715fcbd5d0dac49f6a2f6025990d831ecc7aec69dbf000f77a84c329abb62bf47ba332a7be99ffbbd6b4a24958dea213aa83b9fe5f989005425e12ccd3b11c3fd6b80ec434c1df55bd3153e74dd647820be52424a3ea006a84915280d9e112732651912eddffd617e5457150201e6366dfda06d12e7b5897bfcb8c64d933b1b1fc5c7a89e7e466d5a2602a69c0d473ad5783073ef7c851e568c9d4e8c5c8d22f75ba37949057a40759b2bd76dbedfe18e364b376c99883168f181a3839c3e61cb1ba397de892ef703feafeb792e6f54bf1047e60975294c644858f20129a4133258953e32c61f0a59a9826edb41a57644938d23d6e195801d0091bf23c303a61ddb7b01c074ce0545a4c69044dd6a1082b7d359ea4065f76f8d840c337bb3a2aca89c846862ffd295a1c9930ed9f615ef767f784fefc24049acb967294b7e43f8154757ad2d577f540e1d54241aae73e40fda1084330e841d00a62d2707f2da13cda26dd55bf1f6ebb9ed498fbaa1d200730e2d589d25daf3dbc713d0110bb0095fb88dbc1f402a608d3271fc54725633809c94679a8b1c7be80f63402728cc7efc386ef65a3756c7a2d05026eee58a0496678cb807ed75427ce781ea1675f4b844de1eb56aa983ad781563b7d3c068459bfca69cbe26d2139abf557b626f6c712e3590cafe0507861c8796bdfcba851c934b81c11ee6a6ac8f6e6d06c225a63ce72963a33e154faa1ce314c63f48b1b10355fc9019169241ff8a465112f3e262d38fa905c054bd4cb543740a59832afe1874e2a0b399d236a9baef126b69bdb4a5e770813a076beceed29a49a3aa2c79cac702c7a4ae422a671f4c47ee8c16303face26fb74e9e38655fd6f2692604b884f85aeb0f85c9a791aaf57ce66fbdf9ae5fe55a2aa24cdf95e3168771268d593414c474fb94d66c8c65840178274113b1a3d50d5b024da21d1f60e98d4e458eb9160e50fdb12207afa5c8adf55dfc350668d6e611d571c78df824d56a6e5ca07367660bd99696e9a76142a783e6fbd3c4057ca3a43b22d611ea8788ac77c92500410c164303928ec3e82099bbf3fee99070868afd3632acf58d1df1a137f703d9ee1a4b2783a2350034065869ccfcdfa43bb0fbed4c3d2517812d16d8e177e4592ebbdff2a581ceb7924ad024af385e930cb7e38ce0ac67399c4d6c0d14f65c3d16cdf61697fa7d663c572ce362d7739ae1f645644e29ae311ac32b1871edc742e893106c8920e8d90f9feb618c6433f90584820c1057961a34a22d699450d6dc16f8bf5e6f718ad4c365b4d567d06d5f9f81f0da6b02dc1ae6aa09826a2e67ef059f9cd6886aa764fb5468b70fa878660a472d0d56885813b1f4b69e00619024f63d576810d013647db702b5837fe964a72278d0183ef68222049c65b1064bb54db671be8818c2ea07674f1ccb923d6d0972d2be09042ab35da9aec9a8d47eda274bae0a2672760dc84762356db4683ad0cee7efd39720bfbf49c8235d913573edc812da23dc2ab3cd2781bc4df0af4a6f09ef62dd37ab061ffd26f1389a29dce4eb25418c0fd13a16ec7080cea944cb5f3162551fc127fb95232e65f6369584649c732b702701ee5269779278e79e425197958f18dfc1bdd98fb61636c98ba2269f9303e64569316eeae24f8fbc744c7a644eb040b3a02fdffb31e301", "0000", 3, 1827469288, 1537743641, "f95228bbd89cf40749505e1df87b03207e43538bb012257dc8789a2752c55a7f"], + ["47d2477f0353ffc01452bbc2afec68f91205fc03f70f82cc1b19ec375d811082ae23c9ba8b0100000003acac51ffffffff4fc6dd8aa9f5029d4fdfd8833d38872138320b86d81def15811ae8dad80547b1010000000453635363ffffffffead42e1dd125effd0701ffd0182476aa2314ea7681dd26217117198ced6afdb700000000055152535200ffffffff01ff364203000000000763535163650052bbc2d92500", "525251", 0, 1551048623, 0, "e8d92b5e9faf919fbf42951829c424a4fc3c69a9fe749585d72910beeb9015c2"], + ["030000807082c403018ed7dbcf386cdf55f9b71535b5f928877e12d361f87de189da22398b07471e4d0200000008656a6a5200520051ffffffff0324ba2f0400000000000c08a30500000000000e84b80300000000086553630063636aac5e16750700000000010000000000000000a2e8e20200000000c8b0326471deaadc5e6389a7878d4e9305d9c3b57381e1d9f5f9708e3c1338c1fc3a0a1a0bd2438199bfe86ecfe791f837a157bfbc516d76d92ab868ab634b0f3034c1c394065a5b5e17927c728451e7e228bd7b8c0bc07a4c22a392de78a5be000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eb8ff92813676aec20c271b236151dfcc278c0a00a7be4c8c91a1885808032876dbf5a2b2fe4050709b34e7e5bcda6cff52da5a4cd013bd4673ab4789c88475773c84923b44f673342fbfaa1fd818310cc7a79358873e37b1a2c3c6cdbae493123caa817d84c3f54eea966370b9aeffde032f066c81f8998de10976b02d729102238d6ce1497c62ad87803521a1668597c68a9bc73078a80719f4db408f79aa7702143bb37c8e1cb62922c8f238a600f3b783add272498508feb32e3e30999ce58e0a019dd7f3793f1eae167d352482e019984d69a8ff059e5b89436238e7f56f35b73f1c9b050fb700487939b9267903a5cfe47df48abcfa3cc8e23754ccbb11202102094b1b8d76320947dad2e8a6a1919106de3dfafcdf64a716488787097b2d2768030bd534198b0acbde8e87e81bd3a8c88d7de5654bd142e3106928f8f2b60a2dcc0315fbab24734aaa74084945bca974691c2a7684f2933a5e39458ae1cb4bbdb528030076fb79a9936929d8af127ae4e0c6c43c373b2c93daa7a96b48f033991e75e70324a52c9e15bb3405a08ccfad9e5a185f2c6376a900c05a0fd9a6e47a3d8a815d92cd19999dca4e2a2eb2547ee79fb3b392aea70b11652f365f477faf36a3f17001323ae519751d9176391be9bcbc00f78226d97b5b098eb0ea445065cb8a3319cfe0071cb834208f597ddb5370f54e72f23a799180d21c9da6411a209976ed2115fed7be3fe214acf76c757a799996118a18088999b563f32e8a6dcf531a36f22f08f449eff53af97957f1638a4818aac2e4839fadad692c6e0983f747df7ca2eab05f318afb655757b3619f98c41c9ec3a3be6c79278342b849243981349b6ead7ed1e506a9fcfd98e254471e09d94ef3cd6f274d39f7153e8b5d6564e08fd8d5ebe344023665026a2499ee996a634ddc057bdee2fd254624343e8cc612b94bf692c0d6e37ac72ba7cccffab358e9a7ce604d28db24065fbd8b0623b0260c9307d9982951b0f3faadc7327c2f791fa7f3c27f6bd583bd6c9b02bb97d2ecdfbc5c2064671dbbe921d40b70ec4400a42ba4f535975549f62bc9ec1c47b416bc9974278721f4fbe5519533453466fc95e6140dc4036f265373a2f2f43de72f3700238b84a621d504fcdbafa44f461638b6b5d76b08c7f95d2743742eb0ad5161d6f476771e394d74b5cfef1c08510bfe6b4163c82d9eecc33c543f8606a809665ffedd962d93f8ed741775c8ef30921e59713f49a028c7293bc508e83f7eea04524fb599011de6b14fe587696409c24e6690b79de8f6f78f1ae3e497c4b7d93a215bab1cbc018cd031703b6d345e76d76e6a9588684b07e75c7d66defb218837b83e22901ffafeed02760149c561ad4b100d981e24b4954dad1857e0abb17e5d18de85f25fe678af7af0282e220be094f4c9b4eb058611459a0d3c7b5ae5097ce1bc78c82332bca48a22dbe6d0912223b2c822162f58cd0becc2a6d237245e2f1d1ac6407dd3dd3eb4833dc2a39ddfdf0fadc20bbf087e36314374a29a2ae936fb341f944bf20335928243b5141e06017b279d6f1d95f85c30dfee3cb15679d4e7284ebde8d4825d0287c00fc0d5e825d41fef98ed3f9180a61e019541eea310f25419e20cfc140ed0d17d6af1311e75a5168718fab682394baa1209b8d58e6267ee46ab5e1d5f3c820636a6fe50a738bf2e9b9d5e8156a061a9c0e782163ee06f358a3321912af9b7e759cc11ef6632e1adcdc791f13c1723d38a84d173b6ff2b5c0e186f39947ff8207a52c65f738066956a85ec912b2f2c0edd8cc45ce32dc3c83fb65e4adfa4587c6a55a479a49b593773673743f99a28a0614c3de61fa8b212ea10a6b2a68b1fdd359ba1c7e9988ee6ae94caf0a9e62117ec26254ef73b07d3186ae1e0090683292166bbb4f3b0b1c1669ad12efd109a2d33d863e286d9528641079b36a1a823509c7b6e2c9877809fda6675d5bedc188878507f05ff34a43b1008e95f3f07cb49a068f47706190815b392bcdd0fecb752edb98ab76587e61a1a0dfcaf1c1848f0640af55ac2fcc4f07d5ef573b963edd05d308372d96e1161a0abe17bcd62afed06af8366c0cafd244462298643b08d6d332a126e50aa47a39c2f2e071cf9288738c30fbefb904e51fb17be56bd9c5a5bcdbc909540aa292ac62b77c36deb6c651ef582dbbf55d5f62d4c36c4178c3306725a6d1cc2716f835cc8d3fee45fb95d71c3cce953d1df7eaa845442bd500d1540efe7a7de117d83a8bf54e7b9ce1fe603f385bccb29ae6acfdbbda71e6dbb36a0d5e46b0777f4c2863c32d724c7522df61638f68c59a56a189ffa3135500d1b744104b8861c32bea23e6be37d5bbbd30b703294c67749318a7fa27784295abb3be70930c02e7f16779678d8a785cc84ca5c059c0e7d82f705", "535151656a516551", 0, 116000438, 1537743641, "78b8f939b429415fb817beeac02561da851fd9a3cb63bfcc5483fc4849f2d466"], + ["030000807082c40301fa3a0189e9af6cb4e1fc86c0444c049a9e990cf59a8d0c752e5a0125a039803a010000000665636300ac65ffffffff034a74d0040000000008005265635163acace97a25020000000002636af27b8b000000000001527d15e36dd2f4c66302000000000000000054454e030000000084442a3831343fc8ddcf22b01820a71de4fd744d6e4600585f8abd0574c86925d5f13dacd14b94eafa15daf0ac6b76d9b4f75c1d425d960fd21d7799466c732a2f7f4ed4e065c006c6eac99daabcb01a5be701c0fd20576e8013a8ded3c5945c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a88f2a16a21fd699ca98491d13fcc484d6534e761b1936828ce85d4ad924aba812b74d8daeafa85e61c38e386ff88bac8ce7bb4495b7c3af136ab1b85025b0afa9c1f113011ca73c939e3f9b7c893f68ec0ce43c685aca5df3bd058fa6242c6d4ad015a4ba4e7c536b30256ac677d04739859ddabb4c544943c86e476fa680e022360e358c0af4c71806df629716cb975519fab15053ab88bac3f714b9d7a5fc4021f526c6ba2a9c6da01a46d46e0cb640611e099df9cef32492e3c4f042fbca45c0b031b9c6b141ec1e90f4efca16a9124888208235f287dae77ca2e0842d48a8ae442550f70ca70f4356e4c42f7ece907e3f761a156a62f6d9f66fbca431cafe1e5022b9d5c18e4ad6bb97c5a14a7061977b72ca7d01a68e2a873e41da05f73608930031cb702ebcf30a6f100b11123d8d51c414903080c76bce652cd8fd9aab0452ee1032a3fc99387903449c37c9f995c13232caf9161a9f9216f1a74d11c82831bb68f0200efb994b0f0eba4f1ace813d4448ae603c03e4882333925eb485b81ed8244a90322c03fff4f93a8658d601629e508fdd013a79e7f5cac1b20050dd7d25abc604a3b2b3dd4d0dd49e67b4859e957fc40506e603323a7e6221e45a3be6886f21cf8a7f37cd17bfda13700264d06b66d189e1a7ecc1eae690e6936803e63dbd6cecb1985819915ae56df53d5ffe88505dd74639d338bd0e3faf22e5bed9b7d1ce02c03dc013ad668e2eddd95f2ae892e45e83a30f977d1d5c30bc8a7f58db9c89caa951af9ae6693d6f548a46316768a2208fb963499729bc46eca999dbb1d2a0e9b5eb3076199c62e4173f06609746b4d014747df4efcf2b406e8287769de82f43b8fcafff3b05f4841ca6ef69bbcf7889de61c1a23deedb86bbf04e6f927fc5b4b1f31426a0e9f17e28abf850bb6f70e4c07bf3a62001d62f1d83f80f5187e7aedc89d3029c1208bb15b8e3e6beb06833d10ebdf6caffe452ef59646b07b82f3d00b3750adc848e294c61968920e35bac42555b5957fd1f8fd61cfe0bc0bb9c4905025b59744594870ac6735cd7817ff1684fe384bfc7e96106935075f25b057d08a2f10db729d6d0cb12bf3e4e641ca5e91cb395b009a9ddf42d92a140806fdf2c833f094a53868dd6e869f3b2cc6a5a551596b335a68fb170240717c1339692258f3c7e75b2a0c7804720a09f95b3b63fc336c0eab533e05a7e6c9bbb853ab575e019c7acbae5c6c8fb02da77a92db608230c3f996303c205b50beb89dc182d7cd55c79143f0d2356f24327f9dd0fa9bb1e409a775e15b6113fa5242da161cb477b1c88d50d42b140d43ee56b025e3f6291402b17a6cd5536f8a4ec5cc0a22ff04dbbb8987a822ed41e52fd91436a984c3cc2dc7d094d4f3ee43dae246e5c5408f8e107594fc312257033c0214980481c60122d9e42bcfd581262ff38a9199ed75f40472281a7b8986726118f4af27623d4cd1cd9289f084bc8e20f5188ea3678e72a9c7e3cae35b765880d09d5f7cc81dcfcfcf095795369eba78a501cb42972d7f5abd04fb7d65322d3283df8eeb045e01b2216966a28d199629ecd95c6adc92a31cb59fcd460f50cb07e662efd3ad598d963f318d7fd7c6b892de1b4355f34823bee07d6febecff9dea26929d035b9abae4f90dabfbb242e3aacac350c3a70a2d4c442b0e270669945bdc17aa45fb2b3a9513056771cfdfeedd3efd3d48262add55d8a27b8ab98711b7aa3c2864140acb4c0e7a26ece7ef603a77c9fb931de7553f399b6472d095c87d1e7ae580db8a575a0266ccc29386176c761d5fd614d758ebb9741ee475130db596ee2390c1efd9b9277d122dbff5fdd2d8a068955b57a72af78835a3323f633e0c2ee72d5db8f63422c539ad15f59ac9c6e9a5494ddcdde35b7052fba1ffa38dfc5f55e868f57a4e8aa6d5c0f3946cb35f80be27394e7605df548951584257150ba9df968e2f868a24a998f0ef636de07087f00ac6f3f94143fc7b77375dbe72f3e72c96051a63424335e4715325befa6d44e955491d571e3f1393d2ec78eee875697c8a0af52256ab5f0c4a737988ed290ae1c4ca7b558ceb38ca441379b95f9a5915a8cc9840abb99d739c7a3bcd895c374e9b66b878ce5b13a050070401c90e914ef57a73acd5d6eaef0bab5a441aa03f71b39e7cfe747c384b378d9b38504d0edd05cb6c2b5f65b9b1f1c488a4cfdfb3415a48ffd7c26d531bd88ed431d1979b4e76f07814dd218afca4cd0a9e4b27a260342f083ea292fea2d19886baf455c6c26b709f3e00000000000000009db7520100000000be4f9d39c546fd19289c319c8018d34c448e6ca84aa1a56e05fb6a927c33c873bd5141d346fa2984f0ab8633a6bf55204804e7f5bd84d88aad05571c39d148984fc824560aa9051c7d2a2bef6d3398c3dbc5c81465806365147a6fc0511af6cd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e793a4003efed091fca2856649c7e8326a58480953914ca8698ec0ad54e2691603aacc53d9b9c322966c7df8c41497345fab6fe763dfab73b014a5beede12e1f0935c0b18fc5d5c2b5d4199d53f60375205ef72f99d29519b48815dc63041b4db9f93931c2e637d0c15f7c6041919ad2537b7c7f08746d634375c7cbf92bdb590207fb289dcb3cb2a0e7e6c5d378d6146900eeeeb77c942c8cf6063afcd161a669022f7e2c01a21129b9153aac8aa3321776d370407a1cae2f0f98fcd0c903fa2c680a03cba96f29d4a89e4262749cf618af2bc3043cab227be6e47b6dd5a142acb67cf51bf5a3bf46d92c4f1ec89b489c92e16846dd6ab9b2e44262c04d5119a0040e020de025133b9c86c072f45281616d49f4f4eef21a50be851b025d70fa33895936031dbf5c91a9ed62831a04a44bcb5bc5c8c4eccc37a476c0949b6feb8f1d3f555a0302bc2be6fba94ffa0feba6a28140b4d7d175f38ba3146c09e4375c547c723e940200adddd35c4d8222e36419374ea14523a79d2754de4ffc3b69242de07b93a271020e94de213e3317b98c58a5130ff224502d2273af10822dac31dc30088edfe466f60db12bd6afcbe040f1d5fd30a0226d146b4197ae2c90a20967d66670f84b5b510941a1eb29f4641b009e4c33666a63b3a8c2d1a3647d6a09451ad6500aa03398dad39aae75a0aaa8994891edee2537d7900208c59b6fd4138c1e69752f2f4a7aca8b56b545410e7fb586c050852ff7f63df34a5ba3402b74f4004420a415bbb4cb8b4b12d89239f5626dc18e01354437f4dd786a372ccbe0b7ffc3b0617e005477567dc525ec0d42167fb148e51d06563d73d90bea0aa9a6b909c776b81f517df44bbeff8254bad864b4f67c55842f02038c9f9932c35d039e60d8fa7882b12ef7d2352d473adee871e15ab9c09d6354036cca4e87751a45a33cb7eb1d8b531ef7f0170bbb3cb8158b969c82733efaac82a806321fa81cb9a50daeb2133dceaa518ff113ad127c8cf86042c4bbfa721fe370aa6fc7231e6f2de151c72489cb61c37260c1534a40bf706be07dcb5b06e917b15817a510564a6b84ee3e7466deaa6d2ecb1f62d14b416fe469709871db793a2628fff63b9c8f6992d0ab5298d15f77c5f10bce79bfb773d9e4c7e069ad93233ea84ce4c6302a82c85a230af2e02a2aa92f91aeda1b762aba45f9a77c5c849bf6dfdb853870e03ae0b879bdb15d335b1a25e5d454ace3042c0e4657eb49e029b934aa49f15b8dbf2a57e88f4eecb729dac6c27adcf0530cc2b364a51a5ebbbc2afce323f1a4087116e44dc8878fb3cb56ba59928b661ae7ec1d5a7fe151e375eb2314f875bd199fb58c1ddf8ca015107b46b186e47b8b99286ac3f97ba1e357892616e38123d25ea2e313797eba74556797feebfd881d21e0cc88539c63476f71d522c33fa7df99967074b1d4b7ff03c1da573bf9e4027539cb0901c6ad3f9d53ea74e9efc2b2efd4fba04da1c54e61ca0dc188443b3d856f7b429969f6e52c540af5eff53353905b6811401b1d20621d982c2f72cc8f9bb202d8ca0e0fd4164246ee9c8a2fa4d7ba9a93f064b143dea405f217e4ab49361d35e46c4d1b43f810a282d9e783a23b34d3d8ce567a8acd87dce22d3e1a571bd07cc39773019d1f2fc744261b70c2ab1f5530f8338bf2f81aba6fcad4567cb1825f0a7c27e42d86eac001d49815074018fbadaaabb29aed0f00b5a81e7c7f8995f956bc4cd3ee189570daaf6ed987075f15e2c44f9ba61e05b148c607ad178086ea820298f44abd2c6f4aac8664a13dfbd3fd9ffadb6fe066b7263ab4bfa679309c589ed54cca3801b72be1bea5edae9846716b7a6ea3cfa31ca78c5fa71d59d239b641d11cece543a32e87aeb9a1d2b994aba39054aa4068a61c220d681416a8dc419621c01c6bf71863e8b7fed91c86c07893312f11268d64531fee44666e62cf2d75ec23af8bde93d5540b2c4566a4f486a46a381bf3a4fe70a8aa85f144fb6cfac5c17d1c1cc3cf15a6ad7535892d435c81735b9a4fe416f6cfb6bc58340db96949264853ecfa52b93b0c5b1a1dc3c0344125e2fd4b8feeeb7ee757290a0a9890f353a1aec267a81d0c79b99cd4fa78d02087921e52d2d0619331437d8cf13ed2ccace1b5529f22a93dec94a9a76a103883142245f806270d53ad66c09b9775c1b424a41c3b65f49246588682b2fe8136d2a57094599c72f4a9fd5fc1f5e048318a3316381bc94d70a99148a278608275fbb6407da46dea83896972dfc837b7a674fe51b46d9a096dc72f20c1311d3bf77cb2ef938749efa626e5c298f5e251614bac90e6fc345d107e486f06d9d44d60d2794ed0afe337976d2f7f95cc370f729ff3a0c61f9d0fe6694bef61ac079a2946e9a2fbdfd765e00035f5b55ea70e9622d9f6490f", "ac525100000053", 0, 1672451232, 1537743641, "16c0e40ea9356acb2cb53d12274006019e048c8820efb334b2937b1701a3b1cf"], + ["3abae27601e2bd2003b6befc1d861bfe8e29921db52d5e24a4066a738685d48d94bc9fe349000000000951516a00516a635151ffffffff0214152d000000000009ac5153536a656a636a8585bd04000000000863516a52acacac511a6f588801d4c57001000000000000000000000000244198dcd3ce53b4852f678af6524e027949cf531c4c2ec7bbba7e5d0118669bc461adbcc13c7934937a9ec820100edeafaebea6881a40d17cc6fdfc910c8736089098fd7223ad6b137c46f697ec63e336736544c41a4093ab5ffa3ba0f2b635000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003dc1560912762b71b39b341dd7cba718562ea021b94082b16052b6ff9595724ae2fce476a65118b366e7c03facc4019c79c52995fdc710677211c226f8367411740c298a728588ef6d7d2dc33a3bfb98bb0078b2f68f783584ae38a8778b31301d7328f04c25d4ef9f590804ae9dabcf695c4afa67ec40b978b076d43ecc92e5032651a5d22015594b0a80b8004c9aefd72c1e2ba14bc07678b14dc9ada551405002196bfac25cfc49c0b30b449b3af419dc5158eef3cb4221259f2a58e9f51288d40a08e85f8c1cc4d9a75e4cc628e7a91885561c361ec8bc057e6d4fe1c3f0a23307041e47eaa330fa239494921882a9f0a47af97058e34ec2e0b865493a342b187d032f7a908f8d4f2ea1e956ef7827b24e2a5e4830bea1d626e247b9d647b66addf403204ed951626412958f3315460d7eaf1390870ff1bb274d6a423418f07dcda41e020957ac0e9c870e1719085298efba233458dbdf68c7d907007fc1c8e28faf56b70202abc250d79f338f825adceb0e92937d697ccf6b324dd3c6c7401d6192f7a5930227926613b38cf7c51fcb25546082cc59d8cb0aaa7bb3481a908a78bc7fc3240fe62dcf0248a3be3575865f728ba3ead3976be3e1bac5ee0914ee0f810606e95d0672604ed1f11f7029fed6a756cfb8675449e5e62e59a4a4317b8cdaee1ff94fc72c60467b2c768156d120c761a1b254ad0a3c9e9cdfde98f09b244ec404a92488976ce385d6e1ac2e7c8f3155e61057b820473454eba2888e0efa588989ef39081f31eca7c76e5a1a77c8d4d0c41dc1219ef90ed8299bc31ff354cbcc096b9a0edb0751819075e0ff33615579fe2a04413a874a2fdde1ef85355de7fb2bc0c6a87d4c92f03b3e767ff1fd686bad083d6bec24c60d82250e66e42947d868e38a4935d46963bbe7f992eb2b999ee5503e8d4907b2a0ec3934e5dd06ecbf79afab0ea3e256e884eac3aa55e125f386606bded0e5281df34b34a11a3b6d395ccbc201c782c04c622b2c3da2e1a7828f3988d9dea20a356b7007be280e0749c4e7ed64914e9d50acccea807052fb333806100bfd6a9d4aa0ed3493cb93963aa79b9710b01a3df00ea3067f310ca7693ddd63fd1ee847b4972260898295ce1edeac2e26eed28a7d95bcc8fae96f9ebf65f5e0e1dec125000f2f4f6fc8b077b200d375f9336142559f9ee1aca5fc011fafa20ac3f69ba397e94d2151af0f7ecdb1fff1b644570ebcd2e7bbac9bc4cd8c2f37651f3508a748296dbba2d0c79188fa3e753adf87310b104bd10c57cc6c7fdcb9e6b35c5137017bfb433b1cf0aec0dd8e6cdefcf03e2111d4c394398b835704b211507336fb27b41e0e4916b8a9714215bed9c53cb9cc203fd30bb9293dd4ab173dff273b8bd14dc0105ee4ea12f49950124e4085840bf8f511cb65c39aac8106e1f55f6611946e33a9c592035a268d489b5e3cc55834d5de0cbdeb34b3f27dfdc0e7d50cd3bfe744e7f660489ab7cac34fe87ab762576b53da439996418f918e899111c5e3fe55e0490011ff2e4a8f398cf01e7f055466b67e975a74b1fb3b19c082281c67e8bfdc1de29f72de6382160b66ce75a05da2d759953a3e0f145e3de799aede3ef9b09e8ea31f24eb87ee830a9a3ada7c20aaf53deac6f2e2aedd4f55a6142b6308ab409a21a41bb39562a0caabf1a71d56eb8373d7adebfb2222f8b95ec72dc96a4a77224bad5077ce1dfb55c39cf120b78e56d464014519474e0c88e87591d0f8c0a099983dd2dca85f00f790d09a560e7685657f8e7e62dd0ae5fd73426cc2d304cac237e4fb01b681310286f99498a31d089ddeb5810174f8bc80fa3fcfb22c87c3afc5693fe57c61869dc1e03000e53b5cdcdc49b29e3ceab3246531f38a999cf61992be424213174afc5ee563f9464bd33fc70cda09561d76f3e75507a00f17197b22a66dd90b4c0d7b87a0cf619b3bbe8790fef36bd1ea8fdaf54db357886e25a390341c2cf530319167118187d3f1794f528f33c5aff4c22744c6e0d3d1a34cb54c7a16f7916dd293c3c192604778986e08e83d06097b8a0a7a60a8c6465301835615641543af9427bc2c1c86b9514fd58242c561e02d38a990c12ad5833a35baf646e958683799c9f815033bccd7a7e8547adcbf0d86e0a6dacdf0d68ac266eab9c497df506f62e5fb111cae308e24172b798b37654e45a9a1df519dc03ce3f7da5436c65f15c536e73c34de1884ee6c397949639612a7de6d68c619a33732cd211cfd25ba925d8607913a37bbc7f2eed0f2d29867667802284441054151a0a80d46e25e4f876f18228cf37fa2533bf08609937b3349a552fcc4826db58589a3f2c3ae8413ef73d3c7040d59df693dd7bf6ae7cae1686b92b9e9fae07bf83bfffda1ad8dbd3e93fc9be5b95912e1b00e705f86185ac462655b06", "6a", 0, 2038609101, 0, "a24fdc37aba1c5c556fee6768217f78f2c827cedc5de1f90eea54fddbed2a4e1"], + ["19a7650b03b2c1963e58214b519a1a07f4403a68d53379063797d94d5c2d11e1f245d9aabe000000000152ffffffff8522242fcc546d9931121eed3f3185b7fbe387f35bacced85fdf8baed5d7590202000000045363005193fb75d47af62d630ccc25f5811d6ed0b72a702639fa30e2a2e861adcf4d54e3e4920d130100000000dd6d5a17037b81d404000000000063733e02000000000151ff5d2e0300000000086aac000000526a6a00000000030000000000000000e15ff10000000000f60b431c521194419956aa704e72e43264124857aa214d0a8640687f3e7eae729c9d22caac173e1ad8e4075a75a484062c5bb2c3e852d9b4d2183017e2f94bd7806856f8e9fc34d0426da1c5a9bb833a6921d55e3e6973bd5b528fd7ead1574900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b02504ecc54ff1f4323c6a09207b86ca85aaad9b01def67b62ba2abb1471a5a2ca5e5a8aadd79475eca2bf33cea3c0690e0b049bbfd765028f56b3b11c49863427a3003e37a2a24d3244a56f24378090d5604e7cb496c3e3f3f1e3f4f4026d52185ee0e93209d7dd6a98fe2ff82f2875861c688fa93243d78f300622ab6b863a022146142ea3d9c9aeebf82466844bf7fa984b4652a21df36c62a575c11191afdd021e2abed3d79c3f049fd2a51a288230ef9537eebeead9169cc7479a126ec754390a067fc3b96765b9ca59b0c3fc20dc006b2b062ed3a76f44de81f144082cddfb62a586429e06f6850659914bef19d6d4d99a202d01e54734587ec372d0cdd9c4040313b4672b35c8d3f358e5a6d99cbef9044a928c4bba05d520fcbf8dc048d164c6031e7825b57be948d17c6dde597b8d3f463e7e70e95cbba312a5a2ed69039d81b7021823e7cf3ca456e5e1d27e13663f237ef61fa7e29ffc87afd83d405294e182c10201d5625fec64a839f241485c59d6ad9a71db5e7470a54151f735c135cd17c95903301b80a11a5da48059bd45f3a4a3baf0d752d101e964a751c01a5c416f2895315631f4e8be626504148567b3f133a9913a8009495951ac3e32d327b2f9b0d2cdf2b4e5895160e71645041730221eda73a593a450074c798efed5500d88a0ae4a5ebd7c11af50ee83b68c94242993913884400d22805b117a291b71e141a98f4fcc3e6a06788e836b835fdee4dfc0cf18d9ed08ee948ef199c7076f9320193d4afc3f932f0e93d42e22bb58499943fad6302b7f7de17ee7751888b28c0e3113cc39e639854ee621c1fab48ac79d86c29a77639426546aa5e4d49541beb19272ad6b75e357c1b4b699bd9b3789eb8904812a15c732c59743a2e8d33a5f26a59767b850f15130f2e04501e12cb7f35577ba9228b1f4f987bcfc0df1fbe444bfbeb10bdcc3e43aa329bbf3a810ee2e5ee4fb91283516331c066a26860e173ba2a352f54492d6688f31bf8bdd026e5a4a5b7acb237e485c7fe78536227abe7b834ef021f91b56066afd9fc2d7e5a994d5b454ef3e7a4efa5e981ae0df0ddfdde4033a68799ed0e61bcb7607f24ce2f8c89f5c3cc2ee5b8ca0761ba1afb103416826da30da4dfee723e89ade802fa89a8ed95fd53134fd1b470cfa70a727979ba1f27546762e092609e99ddf95cb5f60aa8539abdb2c57c7958ff15c2512f1f02ec1f19bce378b0e86be9e7c5d8b0468a34afd0c4f681ec87a6f12902d81ef1fae9e5eca727cb8c915f4d6370c8302019d1d25040873e6d2593c6bd115bb394db759e9168cbb2b96a96de1ded204c2eeddc4fef69ce0dbc50fca5d75c73b6d3b62a999df48fa2cb9d6eead1d0dbed16b5dfb5e97834dfb18503b4cfe77bac15a07dc36095c1cbc731447ceb4b11407375b77662dc39ad88cd96aea3d051e41f44cafc3d033cee5d921ff68d191861a3f22441992b2c2b112a24c9a54f74f5a894985991da7a0150ff18171b9cdb1e45d929695cb877a0070c84e352c8f64cef827e987cc3afac47b6ea74dc93e4b3a0fa26bc628131ea89a322a0a032438f4c08a98643a038e04a9e1e3064f51c6f06c021b1002600beafe0a4106ebd068be6f323899209f9c8acd2312a1fa4873746391410d25deb103d910ce4850cdb51168c71b2835e8f904afdbf3c64e7191c6cff27ecf55da88232401100d8c3f0a7cff92f29a6f00b0f8f70bcb8a154b4b57779abbccf124b35f4f4f6a46f8bb50c6675e0fbda16fe26bc7861af469f3aaa7579727736a98475f3b3d795b70fe7f00c3f0a6f9de3447686165359b7b4f8cab80dad9536d7f9e0f7be1031523f0f49535ed1c822065df73534752bbd0cb56ba9aa3c797f3a7615f4731c98fe6691be5ba22473d32073329a48072985f37538e4e9ef4a1b01eab535a36d6c16abe47742e48a756df2d1f0b572b1f42d9c5fc6348a80f01e0f3c8e673b6a0ccadb33a83667df9fdab3fb4c3c3643608b5a16bcb9bbab18db09adeaaaf42fa813d39b05aaab79a56477814e5e681bd8610c7c64054eeae7c2e1ff4545df30f9d7ae4bfb66c0f545ae717d3a12b70f98f089a9e2258b5fc868e273eec674e43621a46f84643da371ce1dc1d12989b5dcf535bea474d75e303c79d17f7b6f065001005991bb4285290fac191f8d59fffb9f224aa9beb76ab5e56c63acb0d7fab679153df1e518bb4c4cc93c630b9222419360fe9f29535c9ea5446f8350df4edc37b51bd0eb699f12e0f29c12159b96da042127c11e5b3cc08c38b0000000000000000ca24140100000000de4e9130853cfe1acef64f680420952df46585ac52c67e2bc5be44ea6172273f471fc805e613c37d60c96e3edecf40d783ce343bc2d0c342f8eab9cec0d717956eba6a60b1e293973597ff0438b63bcd53210346bd09fd489a28a70d20be3b77000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003bfafc0d0702afee5793bf591f81c4840075f1717ac8042bcd75296b0bc9fc95933c9c1b8fe558c8d797b77b03b4aeefc3e11ced80a6ea5aaa3d8b1aa9ce195c2d2a3e6ab6896d26d116f874f6684c4399ecda98f44c63e968aabd1c35aa5d909782f0d5b38dde4634e24d79a9fb6d3c68f5f870210864d23e352b48b2942cbc03263090902b2964f13e0f2ab3f8e11fbaec2f0d9646fbbc1025ac14dbeffbf255021c359b92756a5b48d98b67ebf7e7fd3f985695a7722a192b3246688cf1326bfd0b03fe66841db7c12259dcafc0c4123dd89b6ddf8e3910ba4f62499d1f451386508dba6a6ccc2ed8e90cc5f4c9e0ac495a115f781dbab89e6c488eb170bd33ca3903279e7501fbae661950de0e7f75669a9343ba909ae7f42e7be76c7eea377d9150022163614c9c1a1008a1ffba31c8fb66b885a2eb081b58aa4e9aa115f1dfaf1143020d644cbd330758a25b119e34ae902dbd909d5df36fb81bf57a9be9d0676cf467021aedb93552358ef3926f539f4fd66f296a0af18f1d638fa9e12d40affbfc0c18020a0452d49189ca5450e38f9ad8a857f5519f2ce24a05d0aed4e3905179a2c590b9a9e95b6c7b86128b388375fbceb854cc38a3eb616238e65093c3128ce0c1ec0359ce4d3c7ceda709598f2e1eaebd9408083f369ea59bce59b615b7f1b3f2160675927cc71504dfcb4bec59fca4cd3c06e00d833f5cbc6086f0a2340080161da22980734a45acd92fb435e92ba47052b47119bf8bd46c474d4fc7ea0c97d80ccee0f337cf08e3b6ab40b3fcd4ddeadbef3c32cf69bfc301a7f83ee280e237e63e5a639c62b194d6963dc610f229a80bcb84791b5bb8646cd9bcd2dbf054e1f3fcad5289a0f826dc7c11eda24948b7414a26edee4ba8f5a0019208f4d393c235a5af03522cb85ee3d732db3327521fcdb55e3aef6cb8bd0d61ff4c591874e7463aeb36d7e07a71204d835baf615aeef931641dca12bed048697374872f41ee13472b2b9662c3e46b9915bd509b987837fe48aad2c6b09f5610aeb84b0b18f79577c2f109135fbf9e08e050abda54e216b0951f20c02a62d6e03b5cc0f75e211475033cfc5712a354c3f13915e509ee13dbe74abb756ff90ad61d451cbc09808be4eef93308a094afc68b514c71ca24c2b4788ebd59d0ae7afd322c43166fa98525cacce5bd13569742e074a07da9c43dad6d3bb68f7d6065704f9bfbc9b9504c9c80e462d4cc7c0dca8cb1c172c5a891c96fe89b85dd3b415fc44d5e2fa524bb5f21bb5a0f7d600b35935f713c715c68635ab418f61537bd3cbf3fc05ebf3faf1f9d74931dff26e813905e59c72c4af20d17e5078b9146032f135e85895542c2067289049a24fadaa2d4ce1faecb4ca8780c596e448ec777bd18a14e8a0245770aa813628d8e5cda24fb0e66e7f62312fd559edd49b6cb87585f7e6d615e4651d9fbc4aee0945a87f9a6665b880a2d1fcd8ebbce81ea4f3559473c51e11d362cc5145dbe6a12946033ca171d33c56b3dd16c37f8c9585684d8154696caf7ebe875420a95f6e0cbbbbd76d9c119f37c0275db03f67a0b92b124574d1d685dc949d89f0e7a8d83a732f47bcca22a3343ecb5fb57856dcbd33186d1da3fd299dbda3818ef091b7f707919a7a04ee36eef4fa0cf8c1d4a4bf85c44507d493bf6a19223385052ce93693efc785e5b0823076946dcd1f73bc11ac6165662eb2312392bc9f1ea233506797e67cfd2c489a935aa06ef4d197aa8a251ebce3a10af2417b5917bd4694bbdf13f5fb83643397e522ffe46b9af9b24d0b490c1f2aa6bc01eea46be63470900929a2ed5269d5a6ed35ab822c520c6c2a85c6fea7b9d61b609b8dcf1ecdf6ccda32973e782653d089c04fae717354909220dfe221ea9d5234c5e5de8e8bf45d978fd0aa2ed1e41a474d1cb4810d164ab0f126129ea3d511070ea6d404a73416a5174a9fc8de0194b116817043913610d3c1351721523f95e0cccfbcfa2571d555636cd6a6e7a7a92594d42fa817e2a9d17860e301c0e0750017b850f85deaeb8a01cd91f6e20348a3b8e68757d6774f44178fc5dfad0f66d9611889142ef3de420dc5476eff10a82cf8e147c0ffc3bd1259b51bb9a0f7353dfbd7f75d4d75612ae873030d6e2dfb7a4da78be72e61723030c046791ab8357c1a78254e2291d4a94fc2d6cf1a30f1570d9d113c32e410b70b3db78f3845720cd83b6157492b10861d2b53cc74b60fe41919b6bef55104ea387f8bec5f0635c900660c862f77184eeafc5d1dddf554d115cec540000000000000000858f8d00000000001d219876c7de122ca45da6b790ea9a653c907c89eb8df3b1e6aa8a917278d6017d97a8a75070a1870a3b151833de79689f1c2763c9d759ce77f3d03375e1a78245f2922ff38fc84fefca45c984f784ee9900acb63a770c50e04ac3e37fccc9ae0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041f87ef4b9c9272fea4aa9116a5bc3e93756910009fcdca6749cfa481ec00254e2f22b9ea0eaf68229a667774c04c2487349ff1c5fb3cd4fb1c419a832f40534356228a8220f5474ab7c8f83020bdadc967d059058107aa4a34e93c0a203837c6beff8462cec0407fdd7bd2b1b8ea0d0cbb200a16f5d2785e5461cdedfb9d6da03231754261918a72d015c500bb351bff65d8ae56cb392cc4b34e43d9767b1d97a0209ea1dcf37d2d456ea671601bbf1ce714a2533683587e442ee220b7f3504ea680a0549e7f612b91a1f485b1a795cc8279827950eb46faf52d4a90a700ebe2f4b8b3db8f40673634078b992fa5b25e2a09c7a6daa6b60281699f16028cb24eb87b7022186406e643bd75c59c8de42e9cc4f4d71d53b6899cce3882b03906a26d425e00311dfc33871d96537fbef8a68924d15940776fc1ba369e6d67ebdc96b5c9fbff502301a0bcf542555c6c2b4e3e153f5c646737279264fe23143039f365bd66512ad03158faac56e88ba0b7106f9e2b16c77115b20688c2125a5edacb8eea91c7c163c022d0893140e1adeb638e9e5600a25bd8325657c749bad40cf196d2d19e8195e86d5e56849ad7760894c1050989079feeffd050c9ec36cccfd92ed32abf12de1a3931621e9627cf99b3d81e2e75670b5f508f82cf44d10677b2d0f9b3023934a570a4e8921fb5c03fd85f4cbbf79562d298a9f196ed3e28f313707f0fe3549fb208fe7bc0acd7002a376a36252c950633ca98e36f3cd9f7ec14efa719d90f460683dbfa8fda3c6fe738a3ddc195340291f04e9b1d8042ca4b1e6013ddd75023bf6d4d2ce5a0a01ccecefe416206e4ac95b2bd3ec025a9165096bdb9763a706211c83e9602d7524911268a4ea59ac32e8772d32e60b1de905abdcf6c30cee4a59fb48afd9414b424e650a0a1fe3094cb32a25a452d05c4eb3ebb0866b535045a9f2a8ade0d71b660bb8bf3bcaee64d0778adcdaca7dee60c5efd6a7b3313841a3e8e09860f5d5f3a70094fc5545a63068e16d82bba04b33ff2a1e7eba87646159ea99e894b742d3dd8f9a64c161472d8cd2bd495ac4deb2bf3bb0e89f16a14ed387e3ad22cdd36bc7bbc4c993f3bb93e3b139ad969c1e4dfcf8a7ba0477727776009c29ccfdd37d9c95167e198d6faba554eb6dff555bb6add33ceaea8de827740a0b680ffbeff4aac6797c6f458aa09b8817fe2a3194e2fa52cd6d967ac8d3dfe681bc940a1e7f18791836a34015e5ae04b038cdbdbc9a9956e54fc2eea4b938e3d5b28791d7d29b85560ba20253907d7a0b7ea1c07fca0562058db1def9b04e9e96c618e14fd2e0b01f54a1c1aec96314eeb89b10080b2e04674dec05d7cf7079a8780556c7698aaa25642b1f07574680c980f0a9605f507d51af10f68d153e701c406d8ee87b80e9af586e869d4577810f73d9666457ad5730ee53cd00812e269c761865ecdd00e16627cc04ff26ef6350c0d0329cb3b24b7cd094794e0038811daae93febda683036d8177e4784fd67842f1ba73b582d7567322ae4f8053bd95b6708a6e9bf2b57ade33af1283a88ce22d78f28bf58567926bb93158c92b8c092608f06fa3133bffb6c36d461d08acac8adfa9f1fd891d37b6dc551749ad5b939c99aeed22baccc40fd524d5749b1d7ed305e429615fbbfcb1bd1f296cb188417c1ad9c6a755d82f349a945124d3e4d1a0f94ec15ed6804257da54832ab089a210f4b9f938d6d574d6a613fdfd003e28cbf91afa60af6f3c21c9e525083aa9a2c34f1fd7291951f027d9f94810c589933d3e15dd788361cc83fed91e7a480299b6956c3ce9e0ca6c1b72fb36cd1b83b5a66a64fa0069d2b83d6f5fa2f3c6a1b7dbd60b779dd670afa4f7f8a4ff09fac57d6aae18334c8d67ee2ce85196eb357b15672d3a5281baf651f3e44ba07942087b54f09ea5aa443c864288eb104bf3d141c950c549b7e775f0c9065be1ef03032d034993478c2ef7b42718eabaefd55e5db5dd43102e339e901eebd3681e747fe4fd07fd218bbb31d5fa4dc3307c53b14953cfeff356c36cbff0279d30156dd23b0e62eed8c438f4560442fe5f7665bd73180efc809bf977ca4812a343cb251ee79c86cf696668bfa92f307399857847a65354e474512e7b2a881938d15765af8430cdca3efa64a37d470d679e807586e7bf4cd0a143b06f0320b246467bac37097fcf9bea96da0d9bd2791b173a11a5bd909aa19f051725bc31ed5e240262bedf76a5149c1608f175f5104908e08991feab81103b1e268fe190b768c92ac1109285d2d08656c77acf6dd6fe9e309077de3abb88cd5cfb031027de5e559f48b918fe41119a90f3c986c114f0fe63b792026b734bd40becb1832f299986074b4707596137962850bb76813f14e06037b1297992948103b84fc8ebe16763fd1d47104", "", 1, -388023850, 1537743641, "92d1bac5bdf6e6bcef6a0b144d03a685fb803ed879c60439033f26921f8b4ac9"], + ["8ea0a1030206d4f5c770e1e1fed0fcf495ba0d0755bb00849fb4796877593b4d17c6a6e1bf03000000096363005251656500acffffffffcb7c64f230c6d171da4ea73428640f989b662a61859bb4e72ac6710489b67c020300000005ac51005152ffffffff03d2362a030000000001659fe4a8040000000003ac636ac3fa43000000000002ac52000000000200000000000000001c5b6005000000005f481b381b7bb1c0415bdcd5f5b73413117b3ba4402358ef7ae4fdd56f6c1e51f006a5205f7052079207637285fdeeb396b60aab048eedefb881dc13ed9991305dac08678a014c41701cb4d972f8cf1a80ba7eac8da5d60a775f00065eca5bf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eb0fded5b203828ff88f49a28546b0db4930d21de0ce988222ffb83151540ea8060f9f4711da996244773e2422f2297f8d4f1ff74bfcebba88fa1fa2b236d344e7d1e2716be17775e3bcada6d49f19ebd7dd94822af67d1b39248357863eff7d08d4e89adb4d2855e4905891b88816576f01ed8c7daf50cf2eb88c447daa3d7a030820565fbd0aa43cc80c1653efb710686ab29080a61c98b49b4050da882471c5021d5dfdbd437b0ebfd39b1e4b4fd84bad67077b6cb016fe42e275f2eabe3633e50b0564555b767f555e7ba4c0c62454a23570cb69f3812bfd9e623ad4222fb96831bef2c76bdb7c4e0ad5e8526ad0dcb92602a625dfbb7790457888002dfdfcf2dd030798858df24f4bed77a8e0b6ee33d37680d6547da63ed50141b78eb5063938a50317be21304c28f65eef02c3e88f7d4640a88663a9fc335f78e6030711e3518fe6030c3cf17ec1d64d22f8a31ebea1d3aa08b69a40e350dd74baf1b3e50c8267968f02228e9d3b49c8f7f6cf427529a699a3ef83e48b805be25f5a66854141acc75ab70215cf631e8f97e4ab05b877292fbb6cd1ddeef1da8ddfc29475c9f1f6884f775f13bc9f2515d547fd949ce7c5d712ccb1d00f399afd7a58e2324e8736cb5482dbffd68aff9181f802a09575db37b91cf6e18027142f750bf3297938b3d853c73ae8a48c58254ba679a68adbfec786d25a9a8fbb66307fce24edfe8dfcc20be547096af8525ab8709e61e56781898479bf2b29e95808c2b809d97d9833fd94e671aa2239db6dd50068f6c660b3bf5c6230adf0c0704e9ae70d3ba016d26207133d025d915917914ec1983098ad930263c1842b47d812f9cd570a7651f82b74dcfc888b95026a7bd43cf7943686c86aeb961741d6fc4c7fd8035bc4878781241359c6b7fc8c5ee6940ae7b6b47b5ff5c449a2e7036e8c2950008e0a23188ec8b7cb8f0d8479191c7072def8533bbb3ac7c031f6efa6ddfb37e57d87e0a2aca16b4e7ab5192dd05e7e8af861b6f65ab0fa0e0267355adcac88a71e98027cd04494be189d26f11f1268a9f5864c86c25bd8ed3080fa8a6ac93a48c75a696f412dc518736f24ba370d1754d4e31faad2984f1521ed807461a0f2c1dc8d14910b0945880f324be40eedf25692e7575a8d8bfd8e746956a610d5cee7f42574f911b1382a892c8530c3cb306069002240f1b1fa25ec369174adebbd1e2adb1a4d3daaec997f397bc237626097c5e03618e3ca1fe5ef863e4d9a11b17ba33ae0c4b15a23b28cd2c363303248525a53ec79ce4ed72324555cf9cdad8c389258ac3ec46f4a1a5c4eaaed589ce03c01efd505772e289ec70351c37bff8ed26af7df7fc271c35414a23f7ab6cd3bca320659fde07c98a9d52f8b141b9031b1c80827576b6b847e64c668fcb6297e1dc1b69157b621fb1b5d3661140b8873f3b53fe3f9fb8219c5757557ed0700517e6a0420691787b2cceb3293866bfac6fee5fa657e02853abab52d7f90e9c0462123786c6e6978cfa7e316de7ecddfb31fab6efc10892c6a2ff05182e161e5022637768b7ddda49112c2a3e73888671e660c992357127ac5ed92e17f04a03d32979ecb35cc2512c7365ee8b48aad2a9ba6c7cff6c0e0a7724e85907dce6fc790624989e2d3d6e0bd58e1f4a4fb57f176aca887f2c01fd1845882c2c8be6322ebbb17bedd2372f51f23aec23fe1944b213b16328da17022560e97f3c672f2cb352c3b332f82798fca282dce7519fd4dc80a23868d5ded76ac5605da8f0f2c6c5e48c5d461d5372612f088c04f74967309becc1cf27ed7bb109bda1c2e4615b18a43eaaba5d85e306ea73f8ca84eab15e545fdf85ec2157314d8a495c6dab050701651689a543b2b6030ec19a3b7d9459b54430bff372db5d028c659cd1261f1005fb3473ea736d618c70e2cca732a9dcd02faf2dfac7f440e4c6de9f153ab93350990f3cc2c89adf7a6517dd6911fd3ef9b83ce2e7e3c90fd0f81c190da77acf100300e2e2e37a785cd1a7f19c6916acf5ae08d20cfb77b302d27faad79c61f29446c2bf9fb710525113c50944968ea4325809e3444ef72c55e3cceb95d294359943122a6ab62e23813f15d319d5aa227919d6c013f9ced5c0df5df6893d77959ce3e4fea46ac7c2f602dda8fb1e479b1d39e1c528249a62ceebd9d76b52fadf09114501ec6763554dda9dde4e29e51a75b38563ac67a80b166c13fdb36137d9678ab402bd8ad89861e0388e73b50fc506bad794c473372830025bdc374d7313c962d7587d33ac065bdc77c0000000000000000b5b33b0300000000f333e51c3ae266837a80d5a31a1ed665acd07fbe16502242cbd9cf58509af94a12a84c8ff3d15274bcc1254697821cf4b1ca94d84012d69c2fc1d8cf2e2645d4c86420f6f1bef5d6595896666e2eda9b45686cd631bd8ae6e9ac71a69b17f86700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d63157ebc1833abf1c5deb8ece1febd90e3f701f102b53342be30f9758a14e74bd106bfea7966f8645919e66458f828f89fabf44efa57b9afaf0c9c177e2336e5013bf4e9a89d82296dcc5eb91f28e57c12a6e3dc533351e4d7178a60e2a4c8530288c4d22bf5d45215e8fe891a01db2e72db31c161cd39ec9c35a49fecf6bc2031f83f0a0942ddc9f63268c58c999ba2c7fe8ec85634f902604b3443298b4bf7b030ea2d7ff830003e56515df516ae30e8df11d7c5e3892a9c3052f311717088cc40b007510cd506b0555d50153075d3843e97d90f54aa7c38de5f6f94782990a4a5500f9812cba8c1929e1dd47556a0190c7b17bc207efd47bfd78fd4600f5db9f4a030b9ce0ddc634abc509da12ea1890a78bec22c5c764f004148f192378fc77829c0314f635c6f143ad5470759e72cfeeb3ae24b866d5ba81f62ec80e2e140a594dae03029fa46e99377da8c972b3d79974e3b41340faef7a531e4a2becb31e374d5b8b0316c5d5451102be36d461f5b75b2ddc75389458b8555e9d4892394bc551bccb7002069ec1ce5633ae82b56d448a24d43e6ff27820f9890999dddbbb4af36acd34cde09cdce4f3073d12f7c922cf4a6a8a781d3e45ad96dbe6e8cb2594c2bf6503700f17a4caef24028400b79adb1265276de8ce5963c64e0bd78bb325e59cf81bd1e745cd1f79d903105a1c6622ad1b94362caa620a027deba597903b9ddde0e23bbfcd96236928f2a3a7a442daf7165fb5f661b75e11f0b4cedb17ee22a7420f1fc1943bc2bfe7cbd4980a2fe91c83f05c169258e67a4bebb90f8ce62a00cccce468092c6a392c7fecdf53eeee6611f91631c24e6d95cb315b28e3be118f4ea1a897aec6c2782c455c6093f44c359177840f7a8dbec35de93de9ff0fdced17120c2613f456fd648d908e2def832bf3eed0319b8253e0463aa14538a4ea6d4b5c5fe975072f815538d0c8583e3da9bc6cbab5f5ea8a4f1508cc3988ce8e725e63bb80cec3190d4cc0ca9a485f63357ae7f403391807a05edf8721a9bd723ab8a5faabd7bbba92766e4bbd2c1e3126effb197fbeb7654306b46decb4df408ecde11d50b5106101deb75f5e3555eb4b1105801ca7447e2c5c579b318c868e3a1b1c44704d95e031c1606ae9d279ed28747ede1afe5c69c77acede01bbace8e51ff34212bb0da259d815243d4be3ea6de5aece433feeea0553e260a58a579c40d077ea88c918e4cee21347d83b9a02f7217f79ab76dc3c04213b1c1c4f03e1a758cbf3a55b6df4eb32c2ed9e8cad8c2a63c61e991f8095df4d2ac465c97950c92c9b49beedbcfce411fd52c977eed064433adf9b8229390a9f40ae08e6369e8653ecddb0bf2739028db6624c68da3bb5b6743697151b8363517602add5e36aa6dd89892c17ffc32fcb3bfce3ad3b3b99a75c5df46c1015f819d46d13ec861e6d5a5cc345c82d82d2a3697a622a2b8d50715af4384a0b66f5f3d96fd7b34438d4e3945f16201bbf23f26a882237fe2a21aa4b0f508e5acbf4a2b07fd7c4cc26fee9d681ca217eccad729bc3afa9388410966747e4fc099fe7079bb7f3a723b2884f15ec3080b43c76f2463f3a67caa7c93b008186e8cd027a61c86b87fd81852bb2e87aa480f30815f6efd643b7d63563f6b828fcb319b0b77fbf0e914b453d485a219c8f89e98628bb47c9a20b83e27182fa88df80caf141bfd3167110010edd8e7b0daffc2b46f1c1a0cf6862d9bfdf0f7f2633c6d2257d45f65a5ae324aa928d19990f589fe12277a15db6e9f87e2db432f58ff760f7279d801265a4a671985dc2de65293bead0a584f9e109eed98214f47bceb0068fdfc86c074d48cbb4cd98f1e1b1cbc17ff3810b398c09c9a79f3b915fa5a09639232d60c2835bfe9d41000b1aadc742aa294b44566cf6ef3f3c7d06b68081f7f226c24ef071bf6927df518068142945fd80e404c500f248bd23c87eb3f601fdfced9d4b5ca33518d781ac32cc687ae202ea598a85679507b6f71640288c380deb10b9209ce741b17e72a18b15e832b94b0d923756e9ac26405a1869c88f3bf5be55bbfc828ce2b4d9b0c1fe0d9c2e4308eca2f499cb27954bafa76c20ca48f6b2e739f1c9fb189f7c03ab183dd7ad66d228cfde2f8d816ba3ce4ecc27b5f7c75490e3702b18c526c5d4f1246adf2248178d789e099ba8c1f0036752dc863fd54bc699c2ca9b8d93d698464d6d7b9222a253f8ffebb6c2baf0a4310b0e7ea4585be5945e4e366addf132cc25d3db2f78fdc548892f9f4fe8b6c7c9bd763c25d9824b8ac873be42bc0aed644dab46daebdad3c394d320806cbcbfabf899dbaf15314d285aff7c1b1d46ff73bfe7a9e25e83efcfd0ce6d20cbd376b8649a0c6943fadc82e8ab57a685ef7891211680132215741b2b1c59b75286e0b1beb79d07", "63ac00", 1, -1766247337, 1537743641, "acc221afa5087e279ceca83f7dd992cb249983ef596d4c52678e4ebd201ca46e"], + ["9071f42c0340115cbd50a452a351fc163c5a1fe6f04237cff24c38bc3c538518e7e0ee05b50000000006005151655253f564603de47e37ae8db2ddd6d1663c6692b9ae106b36b602d5caca9c3c7a44b3ad50d66b03000000085252006300635263ffffffff84f85e81a9cfc2dd1802b2e0ab01facc450169ca8000f2d77775436b8785f8d80200000000ffffffff020b7f2002000000000963636565ac00ac636a14eb09010000000008ac000051006352530e0519bb02000000000000000040ec400100000000b65c32f61abe7307644e681d5edceda2e8336bd1052906884b8ae611725a3d700d4c7361140010795f6a4284eb2134562efe619c654180edeb80310ea22c9795d5d6ba6ce4c71a427ce6865c1227a2c148e471e071f1969704044fb064d7fd8d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008426d383fda3275c399947de87719dbea9f57acfc8a69e9a4134e5c80c41ca994407cb63b4ef9e96bc308f02b8d9da15f49f56baf00a82efdfa4deb0d441145e83604e226b869d0dd0382d4a70cb969123ccf6d1fa1c010f174a3cfb11c70f08287a0f4ecf076a38aa0bd13bb016c06fc6390efeee5dbd240d8807bc673bde2e0300778d7475391efe32938c0ac782718d24831dc538cf66002762a3d865724378031d60a74c838874cf3efe50ff33efad1605de500430406eb89176619d5268507e0a067ae45236eca132437b6a1d6a674a2a69ee6aaa82424a9fd2f4108bf0878f13c4ace777f42f53c9fd291c231fe2879a3d89a4f6c9223286a7c6927c6b6b60170223d34dd7bcd24d170e23a04bb721a29ba9d7a5367cc11c650fc3aaeae21666c50304967bf40faa40579055898143c0000f09aaeee1f14094f75b283ec4a3bbc284031443c036cc9377735e917f26791fda65fec0cb40a6a1a6608675814541a39cf5020305d6eaff02dd317e0ce94535ca05a08f712764386c05e5824dcb36151fa7ad0218116d189519c351150dca53d63386c4c23055c33c3c279232a4ab72e3a364d36282925a9a42d0dc620e7383a7ad85398c2229ce623df3fe1a4b6885365c4bcca52665d63ff5e2bc957c4eb9ee4211eebc585bd48e62b64f1251b155e2f268975f95bae502ecdd5dd0e5c8dd33c8ff1e9b4caaabe57f5b469970c30ec601f665066dd727e35cb745dc541682c60cc4c3c15862e26f86ac3f2f5cb2e51e74e45f7c9a0624c968dff3d695119b213957d79761d9251aa1afaf99813bd45a04f482b0697aec144a2c6353085dbc3328f3c90e12acc94f1b11fe045c2f29492beceb363de403a61882209b816fe0f9be34cbd1a1891a31c97ae9b995638d35e76c0436c6f42dd8bd6c1540fa06d31dc8d615254f32bb72fad23a13c2b6203fadcf5ab384b2ac65f414f38ed38de706daa7a769e7c62363deeea0265d68ec087c1305f0d8f5e1ead01682bf6d701b487fbb9d8f5e03fc5a2a1be7159439a21b982aef4f3c1f3f86a055e85b067562baa70028edcfd8e85f58076f8347c03773de0071121c66be7242c7b7fba696ec67d4bee717b04e02ed2d23884525ce307468acf9849cd537a4e0a157274e052ec7656e285db058040d7ef6bc003066567f2fcbf94c936682fe6102cda30a24a6da341ef059a15fae42c54cc180b4ea0a3aceccd8199ededc37c9e9cb5aaaf43d2c668ffb394c2163fd62ae6d6b99960f3d845fe93f5ed7fcd9ec18a0716bdd131818fb92fc799d5f7119ba7a1c8bd1d6e70a01a0d25ff8b2ec22a14231d01e1724511ff9dfce437b23c9ba3d64aec98c1a191c62f4edc771a9baf2c2960a1dd92b93643e256bb944197194ed50379acfb96de0053ae3895b420682c1345c5434413e2e35fb3795573e3bf77a0f443e81969f024f91d49ead5f08818491b489f9852735f774bcd436d22a521475c7c4afb7e429853390ac5f8ba6a191d7cfe6726f1a9050c0eb4fcc9e353df572987884610a97b64ad648b8345e607b9e5c4b49f0541890136fae3d6713e56bf7d7522d4a5fa12cc6606495c137450bc95da317c4ce62dd5207f71cbd2efbce39c191977741bcb208b5ce07ff88ed359c63a03d9b3936f000ffa7cac0a6ebfb42327c18a012d5a15d02ce75ab2b434eea6e08b5bfb045820bbdda53cdfd8a01cb760ab73211098253edde2d5c85aa3d53d861bf9fa2fd6e41fa729231ab84415a4eaaee597857c93e6d6bb03ef2d236cad9c03560bb02d95a36f41fa1dc7eef68fb7905f80685b4d3ff07940f0937e6ed6a9721fb465947f3ce533fdbdf5ca3cce6220f6b309f55a1cb06ae17dc5c541993ed136b6f1954ad4d45b3358cf4f476f0a633abefa2c369f8534ab6bced17f23a31215d39c14e055dcceb51900f50f574ab8c8ce8a9554c725699f2bda1acec7988ec147595e5d97d8c88b4496d07b8ec1110d40da5d28fb92d0dde2e96f31342abbfa7e83afdd0b962239903f90d50bbfd6a44bad4d821ed043f9e2f002eec3311bb87edd54f2b0511c8327417ebabddf1eb7aabef28551c8e5e13bd46307752ad6e22ad4e51d9bed8289ef31852a52fcb20c5467e91b67cf1a87fac89e22e435d0773cd2cd1b5a048f6fac378251f35e48b6ee03758a621a922adb4833661d9ef354130a1deb30660c2c0b4b6ab8363a37a1df422ebcfe540c9ca056edb5bd72ba605dce538d4223c0d86d4639cdb83e1e38a4da6613323feb17152e27edb39ec52a5aafbb214b8becabe030000000000000000000000003331006f1327eb3659943cc8039b195c326e0640ed769d799f7963bf522a3c8a6767e0fbe6765e7bb71d4c3cf318ae05654cfa539212f50bf387084a9e2e1e6710bd073abb5f4eec6485fd212d1822526ba0369d5ef9764c4c0d8de9e2d220950000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096803f40bc12460f50ce5466e4c95f228eeab41b2adab716f9ee4b2e8fd5fe6d35ecffff05cc203cd782c3585ba14ced8cb07f4b5101fcc0fd21c1b0ffbd9c9c5664558d7e732530c5c86aba2ee28fe07ec01b89bde48b6e0b98ae0dfafc740ae9b6429e9544bc387f23263c904a15871977007a291f68206b8168941e2b5e2903099347da6f0922a74de581950eb704758d478e145137c8ae54905a3607e3e6c403142bb0fb53f4165415694c7924abecc4933bfcc4bfa0aceab783bb14a57826720a0096c26ea4791e9676f44753cc65956e93736ca58e7c7541a151df73ac616f0ba4fe115c30427fe1031a1b8580a89ac3c369eeaf95559c56d7c4a745ffe38113032c600d009d247de2906c12c41e129b2ccbff831e086831a7f14bedec96cdb9d90208630c075053d390ca5c7c34b944f3c7c6db37808cdbd755a3521d1f71cdcab30323ef2b855c31c3e27993515d53f5ae88a0a020dfbacec615736351c8c7198f4202229fa12d1027014912e4f00c7393cdfb0e68040cd276322057c01131113001b9020656fec6a87e10718bc8590398a0b24f4c27bc785cfff17c675cf013e506d05f2433e3d6f6de517e8a0442cebb4543e3d92a96c00aa61ee0350caff94bf0a02b0b45ca487dd7e9b9124652a5817b5ee3aa72dc58cdd6f96f1e5851422e067f99a16f08df42b5610738afb631b371833ecb7c99840b5d2e8af51f57971ace9ab4574493e0ab32b8dd864dd907747f02685b6424058116628ec4cea1be4fea1a1d93e9c236f6827a01471ff0b33c8715dce2ad18b7b1a5d4b41d55080c8ec721e481f2511ecaff1feea67b4629845682260cc3b2e00a866fbc482f498f5540cfb102676be9898fa321bf50f60504a9f9909379c53cab99692dde3c9576d7efdfab7259eacb0249667f1c2c98667b30bd935b2e0e1d8d48fb32ccc2c4d603e5d9350da071c881c3e7ae176f0e8fc08c184cb199ebe965fd299750612f61441bc685a31c315ee54959b9b54a2b72efb7b7936bb49746b6eb8e1baa01a474779abfd6bdefab2a34e4e0d636e4f24b8e8b3610ec672317d6beb76ebad7dfb7601fd237abdf8d6ae2f45cf3f3e4ee1e8fa39f041250e0856525bd4ec6a9556d44c5a31613027b3dfa8175ed85d51715a81befa66ac770b3c5637aee2f20376b60457d239293131ec72f635b1b2681537c83b72f7396f39ebde62a0ddceffac0781ec267552cdf0ffa88f570e87c3aac1447b3c73de73a03be60f2f9b433b137e261a19fc28658fdd8fd8b56816de5e0531e96c4220f406ae45969043d20bfd195f754476197085a34c7f5725068d5e75476a1624b51fd0bf0c8073f4c587e3efc02a87aca0deb48d68ff06104ab8abf522915510e348fdc9179498c234c12f72914da10004d9150f2aec63db7f30061acfaa13f1a1c8ca4584b409a6db3f34b50f81cb752488db0c5ce8908d0982ea4a0fc42c1a5e7287a505d28b16438f99edb4f8ce8c8aecc5ef2f77baea7ed8345ed897988a02402f7c2d841172b5be9e665485188d90a534da1bf10b28e1ddbf61a95dc1df3af961e83cdc4d40d75a00e8548f88993b5fabf9f48bfb1387057aa3c5576e9e94e9ade100c53e1c8317cf66be86bcc7c30aa849ed30afb48857f3b3b7ec3525650d03e1a4acda1c228afb303dcf28b353d3824cf4439088da9a77a5fc8a209d8372f46264a31144e695426d7ca41739715f97869eafca7905beec27ee9475de08e6fde8b513cdc532b02654e4f5194e9ab8b5b777aef7898fcc1956d65d1aa62e880c0ff8326b406a46c592621d5e78532ede7f6b0f90c0999c7c9c4b6836ae3851bae5f082561ff50dd9e0881808ae45ce473044e06014be38abf80fddfd16c27bd26c0842626f4cf133583b38b636c696bcf987c15ed1376ed3b1144d24a9d053225f7601a561f1ffc6ed5fc891031193cbc4eb89f2c9a9b5f11f49ad65ad192c3d604a7a805cd653600dabbc0498a62baff22564d53b260d191f30d9a808c228957c478319ac0496ff35425d7d2f430367634484f11a364016e95c0292121343ba434422114c04ecf08bca06e8346d55602faf4d1e154d06e367cb52351f848cae70da3866136d556468fcb7c3778c917f9547d2fb4abef9b7a70f6576bcd609e95f05b84b813367dce521da351af0b3042ff08a16e879c230f737b398b9e80aa11949f04e9f9b2ab4c34db504d63ba8e7a26c933848436feb638a4103ad097bed521ca09744f3968d4f718255b0713d103841dfe106f5c0c41a9af1e28b59d97fc7f0b7235afbdcb4b70ccd52eb947392bc65aa100c67fe2a0ce7756fba7965ac953a4101ed41d4d27b40ee29031657cac8a3670280f423470b102587dc267a43a1d1e0e867c93e1d3a1b721f13adbf650ffc241ebfa7c263f816791448f06", "ac00", 0, 327909026, 0, "6aaf9171f7a2a49ca239a08c5228013555c1ab92b05497ce127b9e1ca9922ad6"], + ["030000807082c403027a09928454fb8fc3852192bfadbaa282df223eea325a1a9dbf506056a6496eef02000000085351005200525152fffffffff06991efdf89c780658a662cb909f32df4d63816b031b95a1a99fc52e5a92c0d03000000070000526a6a51acffffffff015aa473000000000007ac65ac52515265722a6729b4f7b4d0038aad5e02000000000000000000000000de0cb9c6df89028dece41daf7dba6c77859411b510ef88d793d680fa692a096fc8c22ae4a13429c82f67a752a459f218e5ffec7fd01f8ac60f120e96940d3045e6af6b2bd1cb9d6b9fd2250002fdd053f0973fd4b11061a571c889c595f4850300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b3d6eed48d131fa82581e3ba200904f9a033289cd4728ad622a9262ba136b8680f859e8bec47403617d86647934a99c6b9cabc11e5d2a725aa2ac18cc885aa0143eb21c2ff570c348dc0fa41c7703f11c24199f53c02b314f8c4d75c83a0eb479f7837a0d986c993ea16d188d52c55888a86912b2b5a51772e6eaf1282eae190030cc57888b57576d1fd961e571b7250f40c8417c5cbed6d33014ce4d3e3eabd700316072c6b6273f9df5597829da7115a6195bb2754503af019badda2c58eedc1150b00ece647e836228fc9238600c728c9ce472aacca9205db17c573c30098061818b5c33454fa9f8f3ddc22563d6d933df2ba17ddfc62d753f31321028ee2f3e0b20225cc65590eaeb86b876d4640bb81325b8dc347a036517a5fb56de7590f3aee7f0207ab6b1d86c7b321df917cd342274663f7202a33fcde68df520c1f3b73e58c5a02163d16dac95da7e8b58c42feb57d01a63a180c75de77f1bb4ce7a8e58eed09b2022e3aba9b1b8f3238e45859c3a6c42ca0c1efcef18a387824fa9ffe8fc18cbeae022ca290b652d64f7b01bf7e6b1ee09990aa7f695d81ffbd80b3599d8af36ed18bf1573bdf134a732fc887abc7326988a3336eb9925d9a195f51872ea85423984bc0f8ca1c6742943f205e003fd99c7dd853d89227218899a7925557c1f45012e048d76f94b497445ac6db7fcfe4f9a743041057277a410aa9c7e61dadc51cba890c17aacd4d906727117997ccadef153d444f7678667e9f115004c1b4d07107dfbb45add77c8944b2426cf5a6e09f1e7c6aeac37228bc8e3a072868b86f96dbee47eba37d57e7a943a7589dbe1156e889db754f6f3ca1dd6e93562b1ecf639259df630293d7db56dbbd50eb0ce0b3efd8f13ba3cbd34bbaab1594029e954efcfa25a0203ac96df1bca9897853caad90750dc7f317da3dffa74ca6fd7b89afa1e4028ce9e0da6da78a167a050fdf5756fbcb24137276a09c2ebefb61489227c87cb78e43b2652f8d88b004397e417b4a357fc728c0e0c651b1174ec8fb7cd6966b43f093054fe9bd13749f36417601115d13005ecaa86e0ea8ff288b5351b381ccf7eb9e2180deee478b6178849cfe6014aeada8ddba325a19b7a11b8600c06bbc561753f1dabcf75e8560a6658d61b4ed43cb494e54d7081822d96568a4b851acdbf1827daab0c48d7a2979920e49c6e6a1c990c818c2ef335edd333cced7113ff5abd671dae00413c6c7657e93f7a91b1bb044f2d279084875b347182b4cec20d52b33fa19d013de7f24ec9b7555eb86b8485d009235cfd429417dfe10bbc2fd8a3c50bf70740489d7d1bcdc7e86a65ac020c5d722b91a48b32ccdb894809cde34ab6b853bad130606760162066eeb2736f70e0af75b0f31853e7d024464ce06c052d8b9a11110ec86444c2ff2f42d45abc1620ed48c0d6d745f7949b3d404c62e106e6984e7a65890b157d06b41d7f7c3d2ce8bf6ce5f6480da1222d68c50f8c481b025ce2caef56ef16d4d23bd8955856ec7f72e85bc16c507fa9ac6b94b448b7c6935d55adc39dcbdc97592bcfe6d54bc44a41e76d1910ad2b741c529f026faf3e98a13fb99f2d5dceefa55f876cc0f34207b712bf3d0ac3b465916a06753675407efdd8bfee93671a00a1ab57f2dea58e730b23905417c6886f71d15b9ea754cc41c7642e25e4b2b0c7050a679db4b14764fd9fbe409329339cd44b16cd42bc0324e38b022a8eb66665b557049c990951eb3aea59670ad79c83680a42e8646f9e5a73faaa29f69b6e633ac3629f617f8edd701b5703421cc410da271832acbc3f10faf87015b6c63eaee37f07ba834510bd7c4595356b1582ab49c137ce7f10f43cbd5bc3f2ad521006c4d55f14e99d0da3862c74c360237829f1a7eec7abad77cde0d29d9ad21189d32c97bbb9fd6dde29a390bd9e8f5a21a8c29c190e80adc97608e1235de01552762fd847727b138a0ee8f5016caf32d7c13759e00cf79b02b8f88df959213ef9a8a55b65b7e0df5c4e4c51142612f71e1d095ce2655f29d67f21db7a8643d27f97274197ed802a99afeab437402025675c1251d4d09a6b5e63112be2097c7247a656cb42549a9ef6f53ee8683d7b52108a14cc07817022ae60ae5c4ccb9a0d885c50cc560db794c459df60a07a3c5d121b72c3c4efb866ef62742fd4edd7b258f26e55582fbea43924e1b435600f1095d4250916a040034e3a8312288e1720408218556731002d0ee093ea196165010d8203e69b997b26c1848d966558a9bd1120124c6c91da11600000000000000004645220000000000f0838a2cc159c9b52bb7505ec16f53c46a062cfb081a4065f6c1be9d8b2913ba6bfc2a517cd0bf1108c52b3052f25c6b7593eab1291aee7ff48907b88b58de54926f1fd7f29aa5695c3f774e9fe09c8999d2b55e0fd0dc7a6042bead78118f860000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000031c9b70aaea84ee53387c9b239bb4dc368a606987f8f8569f771cefbededbda7174165edafe2e5d7ae9170329a211be3f488552d859ab0dc2c21b128176454dee5063dc7854b856f7d5cf25160a6c9a570af120dbe2e0ca697d3c53f222c938c32a2f546feb8226def0fc4fa895de10c930d1511f08c79a4955cd30bf0122005020172f22be683010571e67dbd6a2b6e8f607c4988a2f2c990eac2452644b9876e031279505f788a9a879d1c1d21b6355aaa38ca8e41cf5d7600afe7638af30130810a065877873c90dceff2e78c0d4d6a314b71d0ef46f7e5d97f617928e46d4a19839926039d5782b83b33cae78d741197619fb9657b52a4651cfb164daa06aa2d3a021581b8e598e415cec73fb246bcde2fd53577bf8aab087463cae5378eda70c4950301cfda3bd48eba051453d4a74581224143f339129762ad44cc3b52045f08bbde03278ddb721f79090abd6d299835e4403f3fa2846c4394b9fc1ed96a81c2ee8558030167e742593beaef94f196594026f0de004bddecf55e4aab3efb4b377e8744c2020341f03801a6d468d0f16abe23b346b2749acf9708ed0d333ce5577b95e50720a2ecf90c9b95ac0754b1c37e3b321448cfd12dd20f97141b8c059361fc11f374b33197495bd15ae56b9323436cb4ab3f4d5dd59f5787cf2e3ed16f459584445857f47d9496f033eb251934182fdb0c251fdbf892af2b6e3c55e6f0cf41e683a76dd46bacd911a77d484b8495f670f964223ce441f4c80700cfbc6325b0d8b6a96c061595b3d44cfb390c9de3614d66f53d1c51e31325596ea88764a37066c4165a3bcf10d607fd0c395afcd8c908c53c9484b5b3191bb4caee087bf9f54817d3703cd8336c8f0861f88bd7b7e63fb89a45174895f0a1b94d9cf71493b783be389d318316abdd0b5b1f9c378f84e84f479c3c94c8124d944e8e4ec41d3625eb379fe316cdfbf2bb74fb05f35ce7df12b87cf8b0f88e34eb971219e4cb882fbb86bc6ea6c7f3ad1f522be42425da92d21feb9494ae4d5ff8aca653af8e48718a3e5ed5c83225d5aa6eb69efea32b5e4fd1aa5137c8e5bdb8a647acea2d4142ae9822b79bdacf571b0c6e467a22ed1ebf4470b5a0dcb56cec0ec835a1a4bc5bc197b058397096ff2a0f3571e664ca7882f8b05757f76341cb9fadcc7166a5bf9537359262ac9d0b1913a977a1af63df0a0fa7ace72c4c12bd6d511d0173bee4ec75efc6223ee2eaf654268a01f3e05a9d96a559d0d61fe38d506fdf17e11f7887b37dec0b74df62fc87a7dd158485b169bf167199ef08ea2215ec261c55e79ff5f0f55a3abdbdbf5fd88185478c552534edda29baffc9f2a13d32f81e5edd0ca35cef6ec1b73e9ad87c6f68253d81f23b77d32182b7dab3989b03799451e820014c0bff3c1d5870eea129793db8c152b1a60568f7d953118b2ff288a2076b7bd19ed90b141dd01ce2b2b16d013d304a9145bd01a3f689a5b6140efde0b9fe64687db61e1a7fb10cfa656004e2834cb271ccab755f5a9533dabe2439e45ab1818e7283888849e5355b30bf70163cf88128075b0211610da3c510fbef4687776dd01647a499a3490fd4f2eee728ddf628596554c4d86fb5e75ed5b31f183e12b6ca5df26355bf733fa8218451425df49a6bd2b9d2f76438eceb55c76045f6f5460124fac4099fe4692c810f7a1f9ac61d02072961e601a012fb17af1b3173cd982a5c8567672340144dae98dd49ca7dcc1f5790e7c3ce0e1f2cd720773bc56ef3cc777c63e8b659c98fab112b05ce3ee4bf66e7e4d28c4b9b8963a7e911749d95eaf0d0e8c8a0555463d4b5afb9c9fc0d4d485f63ac6f520baa33cd28f64bdbcc9e64d093ca0630ce64a31a7be2fd8c8016eafb6800a551689cfef4cb9c5ed26edd83b7d6bba2a8664cfc4146862710da1ee04f9746ca91b59f22c9cef22afacd4b420b6a25014acdffb50f3a32e3c0538a7ac645af9176d3785bfdbaa066bdaa02c40003db820cccc758f969e69fe756fdad207d4a601146f9a4e1b0e7d085478946a5b98e4a8565f012621c3e494f2a8ff8767e7639922738cf1a5759a30110d0569688837ffc2ad7b2c36d5ed40ed59905ffabf685dd175141623aedf7bb7e8119f4f39bd6d259fd17db56e507e5292f2af351dcbca6f64230faf119576060243bca088f692bdda4cd99806c9f3e282de2c659bfe25d39ac1f808e0f32e148cfb784f8257b4a17239358be0e2619bd24ed4c368b66fa5cd135a2d0cde43abcc6ca2eeb84633dfa827ab827b6f813f47619500800000000000000005950230100000000712b31cc020e1d4de832caed0d968468cf73e0cea9c8f8fcec3c4524be757f782e19e02533a13f5481698a266b7cf28091d61c96ec3c14b1d6e6315daa1c8f29ef1d7c8091c281b1dbbee53fd7b9faf1e88d92c5b8a34085afbb17cd8fc778560000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007d8aa83f784972a6a21dd5a2a184f9d81a741698ceb22d0230f6f2dcd3c84c673ff2c514ac0b28ac85b8849ca87121284d59abbd6107d76f49950334e0fd1914864f7a81471a326f3305c2bcf8e1f648a98c84cd8a21f822288e9ddf1b012a012fc2fe070cbc866c2550b273fe8761e66d741d065ce5cd522b1a9d59e1abe6f023005cc30d30da0c1f6786140563446c8707a68f4e2db6362654c431a8fef399c0201eb6780aec2c05621ee60baee08d2e786194afaf7b5fd3b46bae0d3a0cb65220b047693dfcd4820a3ca922677a7b240dc8522109d5753fd863ad454fecf2d80bc4ddb8f17e26715f70d576c2cc0db5c9f403f8b70b49f781aa65484a66ddc441202021dc6875126803c300f76df8173136249162ade5977b0841e78346c7c92016402270222b410a8c3837b8d23804de7cca58fc8e1b102ec71fa115c78715d8129c6020d3d536d220529e3484b4b2ab602827334d41d8c2dffa6cf7acd137e7a2328a2020b3204c7155abf982cad76ca25c0423b46c5036c9768c257675927ca16abd554022a955016fa8c884555878afe961ad08865d4850823ba6d3f0ff1b92fdaf0ac6cbc1d973f3bfa79914ce9e03697ce163008adaa1981063a4fc53df71aa3c23885f67e4cace84574a63fe5fe278be85952b6c5fde6a3fdb16975d280fc9b99507a32f576330ae390a69752444f1b1ed9a8e3b18c5411ca39921f6c2b8d732730ff1cbdc6f3b4126435dbbd9f0b9e0929295f1e316176be43ba829adb477499acbca2de32eebec3250b452bc3c06746f5cb709a7c2be4ea48c10b61a948dc3dc5c9c8c6664eff8697bd4fe9f241907596e85342678af9af76a84bfffb4af3e2ed03a7d064a22345e3144de7b29b6122ba49365b0aab61d3aae3a672b8302aee25ecf6c35b029f3a0150b36ad3f4f21f445fad90448f33b65287b26364350ec6e0d813ed720e880e457c82477852855cc85ca2a1108b0caed4154776af38316f11a759ea118c78a4335d47b495b5dbc68bad0dfcee2317316772258ccc724d2f09a60a64c997d644a54ddc23638dfc04c359c11051d3b7e0a66e275c38dc40b5bc5437f78700f977d5bcf64bf021a889e998d60cdecb29e2b6e02f483a4c0bb05268488d818ba1fcbf9270ba2e17b64d7aceb222e9b2b40babbef4bf7cf6d8601ea8d96c6a076359fc5ac51221e32249b9223c12325e3d48ae6b9ba0343deb11a1baaf0807f5d41d21c0b61b3e6afb1af22997d00e44b4f4e590c22f77f530486769f5dce2f2201272f53cf618511e70b14de9ca96c08e8e2041c744f31a6e6e99005f5fb5a2c80c1297bb286b55c294a1d92c125c22e1628861bd5d7f8ef194e6c67709c24e4f422983cb31aaf46de23bf811e71593ea6432796c3535003dc22075a1534da77e04e5b3b08559132232c7b421bd7053205b3a3c6d0484637f2ce62d999d9e652a7c15da1590fbab5fc055d8b6b1fb146b76f81b2322dc3aaf8eab11145d380a2bf672b7ecc963bfa3b498a19dbf6f8263021aba33dcccd49d429b56af054a5d6d781da0a65fd1b1dc76cdfb460a0620b0aeca0a1112b3c7e5833b8a4e37daaf821c47ecdf23e47077678b97114fe03ab5c7f6aafc0b4471ee708c25cf17bac1964f5e68caabb21d5412af840d86fda08bf267286c8f947c0ef7aa05a9e2f856ed4aee085070386b6744f0aae76d4b3ee6a7ae4f11e090d9cdf7f784d97e6f7b929477dd88e546057e59027f6443b898dcd6bafef49fafb7c1c06df1dcc1e12e2e9d2651c2370aafba49f28babad20e1d4963ddf03f82ffa7979afa9f944b4550035e7c3e3f070772ffc4b901804779ca45da6cb8d82adb25a01e220880e68d5df035b4dcdb304df07ae8048ef0574b507593a0d7ecd6344a88f0934267a60414f662c105c35edc85da1ecaa208ead0479910a922ae4fd6eb4a824b06540bb1e76f638717e673c0351f4157c6534831a7a2fffef3cae87a81c093fd9f3045cece34aadb630f16a5dea380447e6f5507ab27f4d5685ac13102bc7849f25e0b151f6d2a6bb74cb07bc372a321516fde2047179e4f191ee9ae029a029d86064b5fd60da33ce9679147bafa54727bfd0f982f05a9c6a044adb332e4a391d040eb9c8118c3b2dcb196d8080c10ad7cc0a5f34f783945431661357e6f24b1167b7929042380c1778e1d250505730a457e745ac59e2391ac5be20374de8bdeda003c2b4491049898fc1e8c7459fd5014e68f307a2538a12b0cc7b03be8d3a1b39c19cbf27436297ce9638cc234acee97cf302b8d3892e8cffdb46a66b4ad0ef4447357c7937b0a413f3b57164659ceef90adb04d4aeb462baefea355ef03043582f4a037696cd773743590621ba56df38c3968de2234af53d6510f983c6c5c9d7ca8f79d6a67785dbcea053017469330201", "00525351ac5300", 1, 82678955, 1537743641, "7cae3e3b3b26b3868b01447b130e46582d8d8a2526bac8fd862da57d028f364b"], + ["030000807082c403047bb9e34105780db8fd991a313a321d2a6090a05671e2133d05253324c18907f302000000056a5253ac51a08342d8131314b094fd8995794bc0ac981aff6fdd06fbb6c6905aeaaa3e336905454ba103000000055151530052ffffffffac83962584268d86f3670fb00de490aedc19c8781112e65b670f31a24e551a6000000000036a6a65fffffffff57abc6bec0c2542dd501e556035757adc1c46af08a51856720645e43fbaedc503000000009b96773b02cb5c23050000000002636a4f0dd002000000000965510053ac51acac53000000000b5862cd00", "526a51", 2, -1247463449, 1537743641, "8fe3fe0fd2126c2dd9909411633a6627649d405ef5c3d6778d02a5e927c33aca"], + ["030000807082c40302396660344b8a53a24e66ae2ff00298e764966d400a53804297d6e0ace894e16402000000006807f011990be69e80ad259788b4e72da96f86ac592f77535d12c2ab7c7e8ace024c55ab0200000003acac53cb8d8b230496047e01000000000253009c724a030000000005516500ac00d825310500000000035152536e4e25040000000001ac0000000001f903b702bdbfe4030000000000000000000000008627585892ef8964fccf008156472162eb1b35b8c1d971cb6a2b2f1cae2caca1d3398018f2bc7969b33adf9788f36edd8b8eba5e3b98476aab1560c5b4e86e1793e1bfd69c025687142fdb502a1946afe9282b8f327320a0e2f68267e3f08cb900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e310c88783ef6a6b7bcce470937e297ccf0f56ca1cb1bc8f5d2863aca7e162a450167fe4b42856e4a49727dbea5d2183509563d0d4152f9bb368ff3c878af55cd143b00059179024b9b4ab6d254884cb9f7b29e3bf12143f154f5c5add79ff5f8c9a4d29ed50dec9d3ea54c56a6cdfa5a0af20fb1369b806a9e01b45dc14cdec031583889ca1c4cfd21fadba9b13a18ad071bfd9a334979a55af0b991b9090a34c0219bf70798a0ad03941ce76d46090bbb098cde19caa6751ff05dc9e210c08bae10b057e01b63fd29f017a1da220553bd6cb822e85da53b90b96ed5e810e7a630ec8a311c80317d2343ebe65bc48f578e57194e2338d5852a15fa91bd275ca37d4700304e455c26ac3d7b58fe5a1db510c0f4a58fcc8744b3a119597accc2c350bd73103052a52eb78ca10bf46e9c9178cf5209288ba5fe29838ed21c6be023615fe1e1e02203f4fc38c7a6df02ae24564cf94432b651323a95c35585533b7df3f100b34af0216637ae01695f1e5e661cd31b77e3cd1603ad8d8d9c7672ef4bf9e3592344e76032313d87011453b712b8530b562753c7d1c1fb8388ff76668fd5235c8a09cdd2d7691d528f61062095e64ab2c48527e98cb85e280fbac593bb39e206f2e381b72f86e84ac05d6b208b656e94b0d2d2acb545acfb286c3c300b81814ee6869e41ea4d8e9605f6efc9323bc41c4c574a4ecdcb7b2819f6cf1f57d0c761686cf0eeccfdabaa439ea002c27bd7cd94cb49032a4bfc7608d14a3e8c45c46165203b29474caf5908ef0d6b0ac86c31385ee49ed580dc39bb4cfd591a316a3eb30a9069cfb111ba01e5303b575bf02be2d51b838818b67877ce113e2b364287156f2e2d8bb7a75b1270301cfba83010baf3c7ae46af3d4dc7d559240e8edca35c1e9d0a0d174c660ec369a296c7fc03c8f41c3a1e953301965b47e28d3a4445fc5d084fa9c7e1ec3077af2524dbf536dba45d8d296b7baa4cb9e01a31d0849c831747d8bbc40a565ad55b084a1ccd1578fe659ba9acca2e33cf521be4249a1b8231cc5888f7110dc201195f1d2d423afddf16f8ae00953e2b98198ce0005a5b050ec3b3b73c83178e855845694efb1fe86cdc0d73cbcdd614ac0e49e4b3a97d20b643b997a86efc80016c8ca3e10a9e18dd4849da83d86da6f464297f8d5a19de33ea5c7afe793493a9033736bff20b96e0a92b66646878b4edc43302218fcac08db1632fbb4e073f9e5fceabb9f7defce10956c3ef62d648a149ed8a301a88af9bd37f873965e5406271911cfcbda83c668d687fc3b5fa1a15b553346319a5aa89d732e88ee26dda407d5c0101620cdf9ee338b02cbb58a462dc0f9ceffc46724236b96f2085250be003dc69b96aee5b70cd8c17536f62fbe35f0007ad676bb08b2956748f9aebca1e5d375654e206192cadea6bb1e4351595851b78f13efc0af82c0cf8439720e102913b5ee3f733dbee53786747771134499aa3aa57379ef0fee4cb9a045ed9b27e798b79f4b519ac65fb52a90d094d1eafdf28d500425f9b3dd4bd759109db39b6621d611fcf1cbd70eacfa9d36b32cd151bf00497feaf13b2b896a87f7ffd0d22feeb00d3e57eed2468fcb7ef7df5b0ff42be196e0e99e0ea8e6514abcfbeedce3dbb44e338f2565a7c8b17ea1faa31c7d892ffca3ad227a8640d2807fe949550ba48433ba053ed3d17fdf511088bbb842e658baf0be7f255bf10baae544eb461aa76326bbf2b6e13a5e7180a7f07bd106f1def3732a877064af32998d12c5fc0ce6163b6cfd17a75ee680430db3242652fbb78ee10189dedd1a8ccbf9a0fb0fcf320b5793131744252ec0305aeae78f947178e0938cdf250eb7ec26c0492df8b591c160c42edff54e88f35776f71c2dd862241fabda4fe179adfc7d2b666b8aa52fa390060270cbe6651c1cdb7c0bc3c0f91610d9ae780f90ebaf55f993ad35f6a61a59094425bc22469edc6023938915b0b6d435e43c77f22a1d72f3f9126bad487781acd7817b9b067afe6c4f0a2f8a9c838e8e15f7ec386a298e2aaf276931538c4ac1cb8759b5ab6322e4378b729ece1313a2940d45b7b38721edc335b7cd356627121699984bb5d797550b1adf4fad06c8f5e312ee05ca2f1f503f01322c9296a54a2f4d2d01cfadaa31212dc7e4f224e9ab3617c18785ebb9eb1cf8e2263dff92d37e64b5b6f5100c969d334b04db554bd84c152e8bc8bba2a3ff5c97b24e0385cd0408d55f9680d7c75e4459d65c2b5323efcc7121ea8d1a057abe8f30a2302ebe9c81133bc91815a8000000000000000010342a0100000000b0809c5a09f7b4dc0150b1f0dd5958950929808463b2bf912afa887ec50609b17d076b5c64ad51632e109aa66392e8c2576db29bd95a24bd7efda10ec7d55c89c79e9f87e86244b1050676e884f8e5233f4ae67725e607e7a3cd8a9bd55f9fd500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bfe72bfcd4f2ba3cf4302ea5ec821c7cc2dc55a430c351579f41358383599651479718e6795eed9277f234fcfc9492ffe96cc9ad3ce2a50d1f28d3af3dde72c7422795dbbf5b3cf05acc15a2e9115e332b10eb7eec587327b62d0d6384b65760a27a2c7d885b5713d2ac75080a1645ac3b3ee928e68e8f2da994b5d00254590e020a9e586241c68397268e1cf9166290e5afcd5fa8342265e213aa040f07a1a654032d3b6b57950f94660d6f1cafa19076728eb847bd12726c8758ca82ce6eb9ddd10a06dd267060fa1c020c1430221d5caedcb6de24488f7faeccf89f1e06a3818b3648bd1a443cbe0411b98fc5f7d9ad1fbd99caab8e97e6338e8cb6f8d0582066f1031725e6b63aa60886c436d6c3466f1bdb97b434b5158bcc414875539dbc865806032e51db60b1da6fde98869bf5a1d39418ba86a9b4c90e28966a715de435a2216a031fd33a1a055eb618c6860ee5989e53e7367f9382ca66f59acf682964be9e50bd022e377ee0d3fe090526fa9ef9f4930aa6d65a7eb1dda3a8921b18f0f6853aba790215a81c62745e4b3dcf7ac5fd6e65f64247bd058914780207d81df5a3215dc9df18202bf7cf58692a61795eddee45d20c49991b49dc7d71fae67b1f21e8782595b2f783befe28eae8b98dbe5a0aefe0ad5e15e6aa1504b8eeb645ab7764cc38309f29909eaaacc7cdea1b72fb1c16de9cc293c82c222e03ddcd32bdfa10f81b5eef95a1160c4775f4c64c001a6d712a5ef46b20fd27e9f980f199d0e392673b879ee68fc741e035699dca69c8e0b00809d7c20d9b25243367456bbf79ee1d03975c8bfb5c2c9d5ca711b953cb89760cc65aeae01bf7a03f09fd285936ad145cf00b22ad151ef7c803d2a6414601fd1e45e68b50256be716f3a49f3eb4bfb57afda087794951993ed46dcb631006c3cb53bfd68f36a58ae6ed33bf25211a32cfdbc829520956003b695327d2866f30966dc2a5252658fa36b0984a60d3f9e050f0e698ea4415e0c0fbe6114ef18b97522d0dc9c64a585244ebc08a6c7b4a3ade5ac19abdde2d740b96c18ceb685f0c733f4dad56880dea8002b84207bfcff25f185f5371ffca3bd3f6d148613e15636cfe0d5d9db7a856e77ecd15823b07891f5d2d60809b83c549f29769977dd469553032212213a9a9e4160d61280ca466fbcf81bd73c42a5e0f2c7925ff731fa52775df51ca176f880f6b081e93854f0e1f86d8bdd012a9bb56408b2b4cd1c15a93a063bb7379a860d0297a1b4ec180157ac617aa3b8fd4a6d9bf10cfd9e9c0ddb6b7dcdbc561ad1d4f0e3b502976d5c4b0c1d15bcd3158fbf6f938b32a7873eccc5c2d1252f504c76963052073ef31f8b35e5f563751ccadc19140ca766adfd63f76ba16a08d6d31cb70d8787071ac61e4e4c525594f096443d3fe6736537e6ad980709c2f44b3f588a86572903097455a2a4f6c6f69e4e25d2df391535281ad2d13e8e2a602f48324a764e86fa3d856bad8a8dfa9bc105c0319f804dd400582179f3f92f007864c8ae8b51faae130b64f18276857429214c3c93553b9e1200cae153625fa41a9cb3c2f3b896a2b69f25b15dd67b5c4a129e483c0d2c1b37d462be7d15d1d3e6c5632ba1975feec48544b67bf96f6cc947da6db9a6373fa6e5807a23b2c93c6750b4a39ec3d449788c954a6905ad9f460676dee00f23845bc2d2f46376556a351d3418708255aa34f99d1a9ace43afae18cb2d55a66251cf8b5cc5dcaabe6f1e473eb7141068bc9b3c72d829b915b939335eb705f4819da973b7679237016e09a0ab819f535dd9e419e5b9cdc45b36eb29ed50efd46b4fd5b9e19b42d2f7854a6abc0efd1443cbfe8039ac9673689b9093ce97e7654cb2b56baa6d0622e67287ca8908c75c88aff8ddc13730fad236b23781d44f9458162c9747e4b921675073dceec6bad4b53c219dd07044c323d3bcaea49b5280daa5664a4851516a2345d10b9fa8e5f75aff5a03cdc2b83f2510c234daae0f387f39f6946db4a678fab24b86d69425185a7f0114c7501e73c1682082bb3eb5f547fadfc4a42c15f03617ba68dd50ae9701ec3e6d9c55fd16a2a832ef8bc5c9afb51e433ab58d71ff9e9ef14c86329d7dce8795e7168d06be8f6f98b2cf13e23b51d23717f1e261567afa1655e1bdf6f67e1bf2fa8a21ef87b993be075fd32a822d416bb809e9c1c8a67258313f2039ee4b66607bfdd72b5dfa6a463406d10321023727e643dd7062e3957899f6a86ee405e04cddf7db2ea26c5705fdca9b0faf820b107a2c5bd97475393bcb65c4dd20bd4fb41a6b72d307611ff33ef3585799c3f31c6ef635416cedff6d4b9efe0d6cb647164090129ec01a8cdc93d58434416b6d8f8dcc62017a75d5bccae846fd5889b053f04d5f9dcbcdc7ab531b7c85d4c046ebec239645701", "0052636a63655200ac", 0, 98649446, 0, "93a106a10cf71eaf27110e7a1ac5f4c2c0460aaee4dda26565744d35eaaaf490"], + ["cb8bd00a035a1c87e5b9db2e0bf1c7537e8dd1f702bf9cc56bf7fb4e8f6ad20fe12f6c3d5101000000076300ac52005251e6c878957aba03123807659e3bf6c0c13626be207b47556ed7cc4212d2743616c052f71e000000000452636aacffffffff167b067d58888c8bd1f74f9bbbd117672acffccaf4bacb7b6955870ac9c249c200000000085152515151006563ffffffff02ad090b0300000000002f244f01000000000000000000010000000000000000af867d000000000047aa9283820f74204bfc7cfb0a8c099d26b27e546f377c07f324c56a7bacdb1f58c8536678a70b43366ede7eddbf6847501a4f6aac8ab7b2c14aa93c4bdada94c08db45adf8163b14017fb830adca5ceeb3518979f86eb042f42114d16d2a79b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a201d73d4daa01441e531f7c140bdcc6877de4ab6d6206124bb53eea43af6ad64cc195e2997d138304e871b22c67812fd3100849c476ec51886962d068d7a50a3791e87991c138a88cc248b75a336c894711b842557f963394a5c449869ffeeb833021e661a57106441f18da06d4f512721a330395cc0905922802f9275ee139022e641aa60994dbaebd22ed683f5c77cad563459f71ac2befce5398a6864b49650220bbb466f6019f2a54d522af01f2a6c9dd342d4f400fa144a08bf44d39bfcabf0b001cc6f592a5a0edf0c21e804064e32b60fad84f5883a7b49b5134ac4c4cd86f44db44b49874616c9fa1d64482d8920a66e8f4ba921505256811befdace621310220a57d9fce8c748e9d35c2cdd5d1aea3c73afe8ece7595f0db64ecb63ebece8202049d4690ca83ee2038dd7b58e187c27a4e6856eb854cf841fe3c22cdc6a2c3750219ee640382f518c4bdf0ac5c500e8a4af1cecda167d2e3cfae127023772ac357030c33187f1c938010110ea5e0d303a74c9f2cd6834429b0703a463420e4b7ef33021c6c8c1e5c93e6f2271b49f2f56cb01bd49fdcd72765529228ea27249a70963e90b17ea4cd4e79e17bf85724a2890aaf87889246e7350a8393b202514a98014dbfb02546800c17b819b256ea88cb97b2ba707289b96c2dbf3870dc2df71b67fd627b4880d6356dcbb1c8efcb8030d2434fe3805d06cc88f4b0d6e4eb496f2b503625dea38860f8fdb216347c24f9ece57656812ee7c6fc2a3e4418e84e3fd2a7bd5cb307d69da54c8bd26340ca7ae4f7c2fadcad53707814e6c0d30128d31c7337361901477e888873270fde98174f339d0ceafc3a31d0b6d4d98321b6f3cb17c9bc7a12228f80cf5af3b0a185efdf5d5751a00ff03c816c033a6a87e597e8645cb2a91438e0ba1ba6221c3f2829149a422f6e7caa636d939f0854442c7b5a66325580df30906a330ecab7fe41d2fb7839931556fccbd1b431331228e6386ec86d7c5b6fe6d42e0d0985b840b453ace1be9f0fb2744752a03275dee580f9c11fb1bba6afc5ad3cf5c8328c8caf5a48db8180bc2100c6440d1b431863eaa525791675dc8dfe74d3cf522503c6f05765c6175323a11b94dd526b4958881bd3ddf612b07c92846a5159e79d81874de5ef7b29e6a2d64b54a6d2775b857b27b0fb90103af88e569dec9948808bd61fd97ca00e840b9a8f7dea467faf6c1a5c1810524f4975ebca58a568ee360deabf60375b1682475a8c5d61719357eb0d88d36e4a81e81031493684f33b0df7246be0011be2620e973450a11bed1ef4da2da44e75ae1079b1852008741f5f211ea954de20512561d2d917d1e84d5d194528dd3c0f4da8536b68b1a2d94a6abd01d4609be450fcb24572359c68c1189f939e7a6ecec0fcdcc716b624a6b02d89352487f3de750d159666d785905529c896a5b24daba1942467f45a3c1664d2217bcf2b9c7620aa3f1168c8c26a1c266e8e217ecd353c8dcbcd7d290f57c977e1a2c92ba5d69762730b60ca194ae052599646aec0fb2e9b81d456829820e96688f4e621d4972309a1fa9c476bd4fd22d4b14c7606caafa5aabefaad37a3168d1f1ffee719a158726aa9e09f5204b637150a47001e6594980d1dc05074e09aa0e3758119d4aa0588ae3b7cd2e297a45e523b8a9212c5576a6512237f3b7b8dcce20ce99ca0d8fbb5f2fafbab93247b83e9cc4a400769cfa36edc41fc5300117791eb560867c0b1383988f1d7f3a17b7d1c0a178e6222476b3be14bb242777d2b49d6a77b44ad53ecc6d66b7df2c48baa99a3a2671b9fd7180491122e1cdc3d90c25c89ebe9d6aeb96bc7cf122c8e715892592a229a26c20fb9c90bff0641a88893d082a0eadf0f459e6bc21d046c7e713f1bd930c750b7820a21af645d3869b9d49c6b63df53a0b49845d08aaa72535cb46e234dca0d6333d18fc655a85c33c42ac5a782ac652273a9f77c6e2df15d97b109d5400a7d67e89586658727e2d8bb6438255de02a5265e53ea5aa1cd0636de9c3b490b6d5f8977cbd6bb5e6ff01d1386b7f2f571ac22508d92478b0508f9e93938641e070ffa7c936f3e2dfcc085d5328312df88da2afe730e74f4d1049dbfde9cc5184b331ed587b9c8e32380aca42c039ee89bd01d6fb7bf12b3f6fd8d5634ac29239cfb2404bf70726010ab987007208e6fac480bb74b07fa8857574d21685c6c39bf6fbe48281704fab64b61929c98ea15a113ccf17398100795ab153a5862b2fbc245c5c82a277397a400bf296c1d56b76787507c83db2f0285248fe805f656415ddb2954c945017a1667fe77c4a12b081c168603dcc861e950ee9e90fd52749fde0ba413088cd362fbdc72867b2f56a2b0d5bd6ab9ef5d2b278eefb6c1129760f6e11d8b92cd2ab49daad63d1592a3631162901", "6a5153635165", 0, 1135424134, 1537743641, "d8a7177300d392909f51107b41f0a8eeb7bfdaa430c09e44dde8ab510d795776"], + ["030000807082c40302b077b6e2bd75aca3742e692be99cb58cb91f57c33e8c4e34c5aeabe9ff06e895010000000007342c4cf0666b92a952566f92729ce93075f7395d1dcf1d2984ccb41b7d4efc1c3544580000000003ac00acffffffff04935df50300000000026a65f23b8701000000000500ac635152f155ee05000000000253aca03eb90200000000016a7ca8a4850000000000", "63526a5263", 0, 1120705812, 0, "b2968f3a49fa805bf4d173b3da94827e65f9d17c51210b3e74db63c0bdae501c"], + ["9076695b01e2ed855a2030fa6d3aa1bde809835b34768842fa51d8366c7005ade788f08f4202000000075163526aacac52ffffffff027b355b030000000003516a6323c4f4000000000004ac52656a1ada72ec00", "6a51", 0, -1641546786, 1537743641, "0da184c88dbb1433cef4d3ec015a1f68f8681e53a513a5f06f85fdcb9f35a22f"], + ["030000807082c403033a59028d14289539e92b711a439eb4ee467ed8f386714f9dbff210d2debcdfd9020000000553516a51534e82c3365086df311738e0c5d12b3b3d0ba2d55b97924fc31540693a17b17947fec5297d0100000006ac63ac65535219d8e2434c5a1165dce204c5bebcebc344e521e0b9f439462aa4afa745dfec716f1b5d880300000003005200ffffffff02cf23200200000000036a5353249c2200000000000100d9e0b6c58dc3c03400", "65535252", 0, 916473882, 0, "aba65e7fae48f7e994f221e06e21d6a202b6148895e8a1839986508e078339df"], + ["030000807082c4030398dc90607afd9590aa8dfb9f6298aae03d457a4176efccf9973ca870600efb09030000000700525263526351d0f4b098ae6bf549edf0ac9164251f00909eb7b33a6a1422aa248f091f5f22507e2289ec0300000000bbafc886fbf5522ce0d206f98a147c11774b4e76cfc84fc5086df0c8b31f70944da8f33e020000000765acac51526a51ffffffff02ba9f880500000000046a51516ac8d9bf0500000000016300000000379ddb5c02ef999402000000000000000000000000582eb954719374b81e9f0481e84dfd50166d2788bcd877589264bc2678c44e306e2876dca0158305d1886b2338eda0bbb6a1d312a1863866d72cfacd606014a9382e0866eb0aa07c40f34a385c32322616299c04022828981668551c2ab43a7700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a70bcf775967fd35226fe9891862cf1f3ddda5aec043f886d680ac92818c4b1e5c3ce6e2df8b5737980e61b878ea5cc20a1fe72a36e8b34ed831e9fbeaffc9c97f03a8a00bc74d0aca576b3a1ec85568cab9ce40452c050675c9acfcf5683dee42c635c507e085cae2737e7735c637d105a83ca6be19e004b1499f32dcc15f100227c91880aed0c6ae6b82f6f04fbf66a760642d0f6ee7570a53e006647d7bcda40208559bbaae1d38d05976deb8242d41ba820549256057689287c96a5c39a79aa40a09163cdfda6cc5707813b3e055710c01911dc0387943b6b17e4fd070ed254fa52c0b1af3eb50ee4676f0637d65451b4524e0c60b9e1eea382f37cea026a7ad8c0208ad5dbaf1e93727ad13b2f90b1200b42dea6c6daa1c59c3d4d0b611752296fb020d1706d31f168cd7a0a0acd3a0ddc5b14bd81141a606a670e7fb948e1d233d980220f32bef0f1c40784a820898bf23f3f56fcdfdf5f22828da36e65f3a9047c12402212c46e907a98f9b0c9b2b319d24749cab2b3079b497052bc136a70bee832834022297b99f069e0113407cfa79ff4eb0f74dad4c9f3e6038c9101548a7c2e1b000cf0b3469eb6d3ebe6258641d7777cce9326ce44f13ee57c63dd689fe491153c23d00b7f4dc1f5d461878918e8c0413f20e987e6e296376f93401c8321875444372fde1694ab9c2f04f7e6f1b3920e2297647cb9ee36ec1429237ac0de031de47579aaea7f6afc7c4cc272f142f452673a91526aa734ba6f07c15d41ee210d2b1b7d93ecb07f358d5cba9f906dcb312ef25667efdf5280bc599b08f9c070c2fcc0ae93df57165ebfbc30969db165f009fc211ccb0b0076d3cceb77d53613209fc91388f017c74f727bf01fcd147a89f1e8621e5a8e72060df2669b0c90bacf43c4320f8f8c1abf50b7fbf48df8fcffc3e130ab24b7d25c8a70b74327c1414ab3fef4ba3258e2e093caac5bbd187e0273f293408ab863a1a2cd2f9a7338953d368cdaa7cf60edea60c69cfb203d5b80444cb3d8ed835d2888901fde77a03a9632c6494cf67781602788c269e7c2cfd304499e93f72899d281275e5e5432988b6c4edbc76918e59bf0afc902b95704c71330146a5ff0bb3c4a8ef9b45042d35f64b1a10e279946f2a0a86d21da7788ab5b7ee26f9eb02891f6cc137ef1387a5bc869dbffe7fab1b76636f9d5579cc7c56d8608fee4340d1db3a837692ed403fe4e6202aac1d015b1569dd0f0eab1393d589d677948c9c33e19a8c91c774475c90abc21d7b1bba5d9d18a946b6c25fb4f31af0fbe9fca50d1c9f63e8053347414290e8284a25ab355331a0530bf4444650f70c17f5948219d3bb193524963ecc0d37969e8e173c9b6cc1b65d6734146f28f950ce93d18eda5e75bf1336ebca569293f44787716d0bafe3975928656d300811e2a4f39b2b65899e62d510c6943b4b385c48ce4713624c7d6102b14192ac03307567d92b1aa3fb768abd2d5a47f5cfe2da51fffed73aff60f58f1f1271e7b95fa185c2ead4dcda3bebfa3c4791e569a2e968b8804e1ddb5d238f334a09125b345211aad9e8c7d9edbdee983c72275586368674cf3be7246584a3746c290eee66750e2a497518ff4ead070a54cf06008f1d336ea1db1fe37acfdb638dabf6e33cb26fc721712ef2489bea99108b842f1f22b33175b24bdf104b6bdc7d03c5475831f6c7f91d44c34d2c9a897647b42bed3582665276c746e1ae7821da188d5c3125049b6c487ee47ee3dc34ffea3c9729d672c99a99074e2204d1fe3ca0adbe79be285a7d71693e01df6752aa69fe635b4eaf3cd1cefa0504e4e669ec4a8ba522690eb300a250203c89c0ed375853d65ec15e5202728daa4eb861d57845a7a68564065bb8e067b4081565d604b5f00018b1ddd16cacbeea930795a2bf3a7b1de98a0643255c58122aca5100a5bef768d9b7122380210795324efe2d3faee9cc55d8ef08953bfd140ee0a51de7ff61eca97713024bca9782a6f95fe71c790dd4ddbaff3dbca79b014867a2a7c68c28749fe6dae64a2d0501f2b17019f6dfcd8c5b831475a6bb9422ef92ec29189c4c6f1c91a4d1bd11bbedf339c4253edbf379d9345c470ed1e005519286e7d6232ce8bfe1383263d52be62b0a8f4609f3d9925a48663ae0ab0e72a4978eaa881f48a990f5b9209953868e83565a5721800c041378b48fee58efccd5b7179dbeafa0625caca56dfeac6ddff011c2b18b3e72b33b98539d8f2c8ac7aa19d92c3209a794446ac0289b8c72d13047580a4613566a192b190000000000000000dfb3c20100000000065216406bf37537632af809b7301b875904e0c030a2a1e299773b20eba6cf4cadea936b6e225f4250d8e068dfb78cd1bf41072a6dd0b4d95b178b754db1ae77c1554c734066ce1757c6f3c1aa7570584655d15d0fccc4980825157add3993cb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082b8632874349101908edc228850bf0ee687cb1f8e75862613c891275e901f8417047cbbea4241a3550558f658e7b4f21b2eb6f148a782e484c7656111626e188ea17f68881a8d4e663bfa7f56a2f7e6ae84eb5d2272da56e264cf22b66ed8decc08bf7bdf02237ee2d7d70cb2c81dce309d33edf66340bdc8afaf5366e63904032c9807cda4f61e681b79afbc23d2f0c235c412c2c8c33d7abd24a599efd2c603020625a4c9b4707b3cec94599a1b2bf11cce9ad34396782659b341ddedf0e99eab0a09252851871dc03fa8fe1fca59b11a8fc463a9a9ce5b23687e0ac976fbda601843eaba901942c04160934d2db74d06af703a731cb2235a32068e49d5827434a302074918cb171d6355cf10625aa0c761c575e153799973f073a0f39cbda200cdb4031aae50f5542287dbdf17dd3c2825d054bed85be43c2e22a8ea035711d7347c3f02151af6c8cb1e8d1f1edee4f8a466b015852b2f2b0e97a95b9e609ad58ec9fe00022cc7c9083d802726408052629fd52124229ef09d243db4dd3ec8ed2bb4499955022a1f7fa16b9fb3081519bb665a64bfacbae81b110b4cccf0ee8c4f9ffc1d4f8b2e046afb30bc0c10abbf6fb7ea75a2ede663cf927d920d7cf1039504136d555662bfa6c2126f4ffdabda385eef96a4a29a7112fbc52ffdc3406412180f442cb6e77b2afe552e92581d21ecc9ba06c19458cea02e72f080706faa95a2c05c881ffcfc5ab57f06ea73e59dbff811a846d800c6f75fa6c72702473b47b73f03dcb9d8ab9486df6b15b35001d32345bc0e61d37a0499b02b62bfe395211a679e640eb8423e641e1f7487d691144c2359c94e58b9f152879aaf24ddb579a4e89dd8bd539f450232eed7fb2f3f6d6dbf1304b8a4683e5b54150d34726126de9958d1e20c5e0d231b34fff99ff3b3cdc204750201c7dda00e987469835e48bd05de2aa340600f1af24252799e7344eeb710482a6e3aeff452b8ec8df06cd9cdc05d11cdde89c49577deab3cd4b8fc3ff8a3faf97ba767d0a59ab683f182e260b7336dbcb166b6953f8f1ea60c797ab0b5d30616bed30e83f348c7bfacae8ef54f47f76b31f8714d983a3f25f60c653a5e6bfbd619729bb285870049c2d8153f1690e98323f009b880eb8808a2afe6ee9c2635995fd9928dfa12f8d2cb1e99bfa846b5afea7dcd5af8fc0cbd1956afe3217198ff14af2667ea82db7a184d0ec477c8c792d710796d8ed58028ad537c7d661c6e57d48dff8154200a52873c16ade8d72127e0122ea72ccb6fec5307e9328dc416c235c82d54fc7034aec745f34690564cf39058b3a94cdf7775cde683a0d8952e48335ffd49bd00317c77746fe7597689a5de838546239253b96b9a977655c843090e89b862c8b2392f6a47da114e59da2cdbbf3ed066e9adeb88e2c2225632096e8121d0f00dd7a64c5641e3fca477ef3984c77b9ac4722b052747024acd816de27de344d37358c1993177e37bd88d6055a7278598ca799ecde94c06886880989063ffe2d27e9ae0e00a79b9a4d7ab5f42c25914e41af5d79067cfef65fa70857f53182d868b59f8907cfa8ecb64e9bac5aa8f36e17134dd87ff554c79573b0e60a5eb85802b2629f8a57589c8383d75227c690668b0c1ab2113870cc63d14f2a612547100d1b986b2feddd7ecdbdf19a7f66a22d537a79b97ab0284f73a07b23a88abbcb071b8a9055aab794eec11f618b4ab66d43ebaac5a57b63650c6375a19a649900803c2f0a69861812118f226647c690e8e1db2a9535b2a44f25574aa406361113df157b7cae2a7ec07fca48bd203a224be9e87aabddc3916fabe7d1e4a522911bd7ee18f4cd1d7bb901abf83dbd05bd37ab075baf652bce8febd53d5c0a66a2335e2dafeb0ca54c9c7bb35dd0c6d682d050ed792670bf3eb9e7f92b6007cbf55ccc8f56a3101b37a191e4bf59a7dcc95a44b2159ac66b85dbb665af72eb158a613dd825e32c11405d25fcefc7592fff3e8d265883b5565d7a37daaa31bac4010b3282e432f0801d0957a23a4adfe37adfdd3b7bd2421ff3eec31996082b27c5083717391da12ffb449d034544d49eddd108bf3abd697fc96ee231e5ada7a209a635bc7c1f894d63ff398b7f053b73b7e138b8866a8a5c8945ea5a8dc5f18297f0641f321644a1410da85392dfe595695b09f7ecd7e1b71fd2681c346d9b27a098b77389fe8b25224a4670918e48aea5fb046bd4fe26ca6050d7b1c71cbe01a275af7a142a495a72eea6fd2bc6a51d7ddc9e0b276126454409ece8286781d002208ef9d4cfbeb01b21cec793719ad8f6817b4688c55e75b98158dd909e57366741f82b0090bafc9528b5f2072e1763b82a74b42bbc343237dc9a90c52f8a6da3ee952c47c012f563884ad9dc1eb2325b147c9d5aae104104a2addd02ad7d707", "52ac656a63635253", 0, -1151236311, 0, "4df0c07dea78b180bba7e230eccb5b3bd2e54d3c9bb3c4da4b5fa5d75948600e"], + ["19d5a43604c3356094d7d2c508f87bf547c1c6df1b0bd2abb1097295d10c97ce4cb7f6982200000000050052656553ffffffffa200b76901f31a3baa3b4f382a2b9b7fff5ccc3a26f305f86b6c217f3a2d8ec9030000000652ac0052ac63ffffffff3837220008176b28258e8273ca4d85eb03b5b91f8698a179541e1ad0a9ff712d00000000045152536388f603d93bd16af6ca9ec9a76951bb0a8a28f2841b3b3155558e4eff003b63479e54ebc10100000006ac516563526325aa830b019a6c260500000000040052536a50b331a10100000000000000003b7af002000000005d4684c34085ae8cd919cbd28384c849fdf2508533ea41f407603b8a28fbed674286fc624cb4012520912e0979fdffc040186ac350b41107c2153df60a6d921793ba73b1ba688be1e3b447cf03b7458a40b2ca6b5a8cd9ec31197bc78b903840000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001687e6805c2e57766f48682298ae62c0f01af86679ecfb5c84597212afa8050c5cff40a7a30a18c2c726241021708aa845ea1fe8935a3f092d558eaf62229120e7cca7e4e90f072d2383e776711093ad5dc8661f7bf7a22e0e98da37d5c3595e14ed3daab414c785b6e4d50484ea2005665fde17acaa49b0b6505f3a9e58bb3b0311a6745afbfe3aa8cb21381bae24d185e01097a7a9f8dbaec442ec26871f505a03048b81a2d8cf6d85c5523cb999ee397535816efef15fd7b124a70d37661ca9890b065f649ab61ea1510c01e5fd65a56fbb92a7a1412d53def2f089fb74eeeb3309c67caa106763a58835be62bdf1a49f851def442358a031d37972e755b3d07ab30215ef99f17331505370b61ec85ccc54b2733758d7ff03e2faf5bcf49a56115456022e02cfc2d22e9a0e76151c9e51a2f96e016dafd4420b3439a620d0ecb121023703304043ca049f0ad84d060ca1f5f555a230a19233f281089cc2550bef89d4fe860307155a7bee71467d8aac30860d0a0e0780d0c6f1c2ca7be7b6418bf0560da85c021c62277329bc30fee252a1a155a58d635d48c596a25efbcf39557c7ee102d19bd487ea349a141cffb12ebcb39817af70e6ddd19e593f36b41521f266b669ef5e5ae93798632ac9812b13b84607f3e90e15168b51005b2d1bad3abd88a2737caeccbb92da2beb51b34531249e37156008ccb258a7bdc9ef0515fe4635ad390020d37803827c130300a05fc7fb9e895f1d7c65fcfd4921a44478421b1930698aec517b729afdfa42540cbb1408767261d33391cec65cc7ac26afdcc7a5c130a72a4be5fb6e9061d3688f1084d1c8803e1e52918d14450f486b69ff4c56649fd3962b713792f4b492f371fc9cd21c52ec11c540f78fb883db09297ea1755727899e21d2d424710e50b419ae864625379de72adec437d420726abd4c92efb14fea3ec629bbcf2c30ecb4df42e26968f479176960951bb2cf0cc0325935dbc7c41ad5b827d4bb8cee5739aee347a0e53010c80a3e5312a0c6fb3a6940fbf93fc1aaf52526aeb533d25d6c04e3581ab99b0350efd3409a390e3ef1b5d278d325d1c14a33557b2da71b34fa57f78ddecc2790f43bc1104cc7e7b0c61e4d06e31f7395c2ab4365b79b07c30c8de0f29a3c71e2ede754c80e8c3dfeb7d3951b62ea8cb3f3ed0dfc145bcaaf69255676b3f9dac8937a3f3fe4aae273609895755866849315472ee79923916982f146e4d03e7fe54f8772757d9182827c0f03cb06356815f510f8fd27ef22d346145097ba29f9051ac987eea8eccb2991182e256fdc4fcbbf94a1d19e17f5740df98f5a628fbd1b1e2313b693017565fcf4942aaa143b9419ebb05171876060fa45105088fc9f0cce760e25f4d2adf90c19f09e7a546eeb1b399b85c2cbdf644ddc5e44035e7427dd57327cff6808354d4c647aa4c8ebedf3444508ee6bd9dc7ab51fba9da6739d2e9d462a933508d078054fb52f125acf172a6e0dde24bff927ae257afdf1c6153b2d38ccdaf97bb15850b611960730d8f0b00ced3251732947e140fbf941b2a69b2a9f82cd55730dfe1801a8076c4de88d03ce7087b46cfbbc2820ab2eecc99baa7d63a82007af8ebda3a47a7c69f373e2c823646a6a0d4fb2852f0f269cab939dcead6e676284a0fa99077b09ec624e09b9d464a407f5c0d1f92276c339ed64183b7ea052a7fc84cbefcd3b6f55aef85092a98998ef2c8486e1e6ea5d1642f0c1ff8948378394c3676ace4b4259c32b321ecef4c0ea4be8d6e38b1cd07c00f16ca81055b216803330d0fa6f26d5c774b91e55a9a59bc3f5f0252375e886bfb322c43ee7fd910b82f3862f774e78821c81461e261f51cbd7e2b10d5b0b3de3990c70aa92b602cd376623ffd2d5c29290ceec743c1c301eca16c59f1d259d734d879a32b1210a142acd5d88b38eacf1912d928ea3874fdfdb7d866445ce41686a2fbf139a425e14a5b603f2722d19a4d9d072ebe4bf2e97e7d573bae491f799d296811e9ece9278362f79cd61d53a5b8cd6ea6b88d108057d1f542d8124b6c9dec7343c9b6dfcf0efef18ffde17c06615f5e0487c68f5b0b09f2626e37b79e235e29de93c08102221d8e0327c8038692814b2e6d6202dbc51f5cfa17e9f30e68574f8f5d9960cb396eeafe3796d2c4172c7de90688453fd3ccf580c136c6f5d9939b1069449694d5c0f842cd23235bd653e4916947e55a0cfe610f802ce287e8bd9ad40235ebc13af21fccfa4d79adef642bef9993d095bebe100b565b1abf23d04b24a8164ebd2554504a0ebeda86baa1b675af3a85d83db119bd0db3a635bb5cffe28e13404749871e520427ec009c5d626baf6cd3317f2baf7ac4176372669d8dbe07ddf20ebb1522e220ea49fa5808b58ce2ac2d1e86af0e62959e0c5d1dd247e01", "51650051005200", 1, -2026969542, 0, "a08fae7788583c206450a4f8191c2cfef23e82fad2447d23ec93dddd071d9e32"], + ["21efbf4c04b805f163553173661d6ae43f52c29d023986df930c7acef81fbb9f5e110f51b1030000000151ffffffff33aff821cbf6bd797d8617653a69057318b13039ff9c816908544accf05008080000000005ac6a636a63ffffffffce78088a24cbc19c608b98f79e4dbbca76831613a7b6d9eea83b55efab29d6900100000005ac5363acac639814126322830bf677181a70c206631dab7e35eed9cda97088f35c9c70c1c81758c53701000000030063acba76f97e0364c301000000000005ac6363515316a0d301000000000953acac6a636aac53ac2541ca01000000000265650000000000", "006a5200655265", 0, 165614049, 1537743641, "5c558b391fc1e485cc09ec3aeb505f6a4fc6a0e3d245eedf3c913d4dd68a6eac"], + ["f4cf0c1c03a69a54aed47cde3b4181862f940e504db208c54977dbd941ec6976d1a83cc51f020000000165ffffffff35dcefd3e70566137e6ea9dcaf1487ed107f4eaa6b939a612b2b966568456dc8020000000251acdebca51e1de507c0dafca960a171f9371728e77e0a88553de83b9dbf8f922037adc9c84601000000055252006352ffffffff016af4bb0400000000066a6300ac52652721db7600", "6aac", 0, 714966917, 1537743641, "5d98c2fb7fdcca166536a424e25f734bd8d6280b090c9bfbd3aed96fe02c843b"], + ["030000807082c403031c39a065f82d9f79d252460f22b7d76873ce944a494ef306b52e28fc1a92b63d0300000005525363536a2ee42b59de0ada6d221216da70d30d41cdd4c44dd626531afa3dc7af3a7ad6bd921f5c090100000008526352526aac6a6affffffffae254e5bcecbda707899f9445140d8441397cd91d488efa04e298ea4fd901ae90300000003525352a069354e03376a0a010000000000a88c91010000000001000bc02402000000000500ac526353000000000000000003000000000000000040482b0000000000745415b8176f0ea4de3eac22318b314bb4c8ba7a974e29eb2539c0316897417f283e4629af2b489bfaa8fe10b28cab4a0f475c914d19044c156909ff0430b924430f9d1d0a2133b1dee9c0ee62ef03ff81f7b22d0dabd889c27130f0888e4670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c45868c228daf3c59e56630008477fb58f5414d2d4a250880f438e404e00011eaa08ea426e1e21648858c4236fd7219cb02f600da88c71e313cda65ad70a666e3d2abc45ab99d046422f290b6f85352cb0abae1b946b5bc0a7493f31f62f31730349c4d8aca52329af353d40e1087bcdf17fea610c2ac3f9379785ca71c150b0328c255cfd9cf88c64f3586424f43d935c023fc5d70bf12311562ba54781eedcf0204697da82e53dc55a94ef7b6178d0fd474eda2e70792c8f49e501db969693e020b0797c799a3a512e6e3148fa01d1b06e95abf30a1a7f3a2f10b54cd6b2d66cb2baa9df544088ea0f6d2fe43bc91eb9ec6762259ea6a02a86420afcbc48ce65a1b02041ed6ed248d011b58a0aa168145df8e1f64a9c662394773e25eb1482a1f3209032cb6fcc80631a4ae1125b003861e20a7e8994dc9bd4a54ace7cf6a35c656bfdc021036b14baa44be22572248fb9c6210d2d6d4af061992b9eff5aef98f07d2fa030315d8f9728d0e8889da66bde78bc695d9faa659d122d4e17990cd2ec2410c56ce020ff392985f0c0b24851d371274d3e1c78b10953aaef24eea80a83f07ec98f07c07aa424581986d5fb050f879693ea5bbaf4c11f064eac105a3c94d1a55561f95f2c8045309a5b8a9653de8037b5f9dbf3eafa68020d7aca22fb3f318fac86d831ec96baf840e1364665042454c72e310b683f26596965af7cfe74d01356d725b9be1d80f02f5e00afde31a3e91e60c30ef7a46024bc17564b0c974141e7e78bae6587a95c859120f6f0eb4e1ac55fb86852b17881c3298821c43dce998ea37da70dd0bfae4771fdbc3726279931b1a2c891871f9e5119fd3899d23a0969fc2373efbc2059f40c0108c8c98558a90e6b31bc7b9b79b357d10d591b3f58e1e9366f3c2cd84d3d80dece7764368fba4306addd3db794c3e7135fbf40e8345c61631ffb1b9d010b89d92404c1df03ca4c542e3d213cec487bada8c08df507880895e63bbbec76ea01295bc37302427af20951c623623fa375b3ceca0fe0570bc2fb4bd9c9469d8d6a1781c52a41f3b2a9d4321ba494b38b6fd5db93bd2916972e55e944874a646099b85277a38818582777b03caa3eca0b23deadc68c5ce0f1050b0e8d4bbfc84b78744f60d8d9d9719a28a7c768847434bf9adf606b0c3e12e3625b3c275c2996769b1a93d45fa3c13f014a662f17fb7b5ce42f5e5f5ec94a3c6a894184fce9bec229f43b4fb9951ecb76c0cfa5061ace9789056bd8dd5220ba03686e516b635aac1f168f382d2ceffa6e4ff3ee90a32053a0d40e2424c9b2b6cf2dfa5482ff86495bacbaf3257f0ed3469ac51245318547cf647d4bf2fbed6074e4db02e5422d51f4442a73e55d8eebbd148aa6a7afed18184180db9489d8cc4fbe90bd22feb6bad66ae925a08eacc4842c2c92a84af7cd798eabe9b14b6b9458d37062ec853192277846761cd9316812f53059157295be0db32eef414b2ff7e056630ad8c0f006cb962a4f9164aaf7f3daa6b61f20f3c6e4427cd248953dbd2affe502594eb7f50f63a944a0e39bce3c30c77806925fcec1e97343ab17a0024eedd9fbc60b80229dfefc748f47adc131807ea40a9249adbadb280fed5a6b1531dfb4a9ee067c6f22886e8c95af1ded2c89604b5bfcbf54e36560a37356e1dfbe403b2c7b05fe833542f9ec72f5f67b6d94e9965e359bc425ccc6d7c982ea922263085f9e3aa4b756912105b356fabc56a47bf2e5b7b94d31f183d4e62880753aa4ed75b9b076257b38e4e26d1cbaedb2619fd56d023707f01f78b543059e1b111d5b9f7a39440c30790036fe1d84abb5bb46230538d255fce291627615f630484312721641e395efa07f28bef254a64390029d07332d50ffcc1bc5f715f50cb6bcc36fc4f10e992fb851d3f3bbe6c8a5d9f14d7e07adad453553b2d2203e741a31f0ba3bbbd2e962b297031021c41e2bc2d8975dfdc3754e870d89dea2b695cb85201ca62ea160385bdfbf1f136589d746b55dd9a3d81d4c1e312abc5f4dfdc61b7f62f1432ed07de4a71f84f96d275e1466f84b569e2b6f839b33a2e15de20aa216a3b6d4e38d0aae8550f0157e32930ead68c12b7148a59f089ecb8cf55edaa81a7a42db9c8113a40386b1a678365e34446f4576b68cda7f13606343bc952c306b85dfcfbecaad3f405831415b924232c1b75214540e266414d361731bb54fa72e9e0d93c184180f99a91f58e7ddfa7aea6bce981658edf6d836a627d4da18f261918c67bb1db4823e53d792448b71055cd00000000000000005861cf0400000000120e4bb378a7484f028878cb236bfee1cf5b1b04e9385ace79dbc1918de31071609600adcef68830af123c058d2ae959aba7909a34a6c150967e6b3d495d5e2a6be0fd55cab5b604b11e77ce9790eb5f17ab8375902534a55818396ec37e7d1f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e97a1e9371f549e36743af9691dac42958c80c7a147a3e565bc5cdaf9e3265e540c7d9211cb9a99330603d93659d697ba58ee7ebe7a8dfefa666dac2094f1b699e094752e0440541ae7cd0ab9461b33620a3c3f80aa29a89bdbf2dec950d9806916a1088098ce998113d9e4dd21a0d1cc46f80633857c71b98c7d27556defa4030810bb4f6b2e5c20f7aafef980a669a7f990a695216558ce275ab3eda72f0649022f64cca7d373c3dae02ec0c1299252c101d004471ba32d200cce8c9292d1a9c40a07457d6204385e95468e6df133afe4d02605ba5d01e1f0f81e7768bc660382897f848e0eedb3e846ee29dea2e3d4e33724e2db14d92a35ce8d7093a9fd754464032759041d2d88dc3b882661d154e93ad9f0f1f469987ede6dd0dd8bef4a21a81e032c6d4af31c421f0d569fa2d8768eb33b9400f1c0b32d43df96c92f9a00913293020c651f91fcbbd698510a7655e0c98b11ac530cd422368c9151e285183c5499d4031f6e52f9d305db47917753ae849ea823db3edb09cae09d53d5849a65410b7445022447aebca2fea56c9bfc258abaca650085d339bdbad5327be75c9f15cf298fea587951c837c772d1bf9b2c6f2e6e23e90aec9a5b2d741895cc92e8371ef03ecb2706d50d376b077d17ce34b731ffd0ec1283b50544157c1fd671135d0122aa6806a4bb3daf7401305aa2aae6368734589f5f2b92d21a5ed610726c177b108a424aa6984f68c4edd222808cc0af4da7033323f49d444fa02eb231456bbb5dea1080e560d060286cbd8e47522347f31b42739cbd376e760d235bc708e9fbb83b8d424ea6b4596970241c18a7ea9498c7bff9c6749d5106ce70798f3931c7f5f1a923a3480341bd70f6759857f63fbc68c544a69cc512b5bbbefbaf63bc92d932a731c924d1c1d7eddc98c05fb88bb62ef1b86f962fce0c07329486338e99d671d55e1794b2cc782c5e9ebf5b624a183cf9b97df373cfc851ac778c1c50b35517364599183e37efb61814837ba4dcb48315513682b45f5a58325ce2f944b13ce4f8de5a892b9dd02c54dc55ebc0460ecea499364219b0ae2181906137168e6c56879c1768570964010c5702427026dda1eff90196926cef703b9a2753f54220f6e8284db8ac1d2e6f913b05cea50abb78ac8803044c55c897242811aebd6b4f921992ad58a5f1a0a7caebd1b6559aae5e2c48c8370d06d92754cc519b1ff9896ed5a51d67a98cb69f8943dd38c76b64b3ba64a26b98d1486f2164cb25d22eecbdc34829edaf49a860eb716a23c79b98525381af3c278d7aa46d0974bcba2fff5ce9c1fab0a637100750656f95f49d9f46effa478ef9a9bc3d44e0d90ba800e1f8085bf617a4225816cc309221cba6b0eef76c037348ba19c78c54c8c368e07520e34a4d41288029e7e346e625c5e0a23409671fc9afc5a93b92fc784541a681131f729ea5d17559a98090aa19106147fe78febe8c5a337bb718785e3c4a299b0ebc8a72fba068ed8cd7d9f3605600ef493efec78df22b9bbc4fa8c23b9089c33868e5edd500c9b24096cff08a2a2c838d338653ff431955b505c87cb642bc1dbd2fc73b44d923132a3d35f5761864e10a42cd9529d8250bfe2a0f095ab30341ae9db849cc12047a757e7826a00b2d91663b42aece52a3afe4b0924d5f46d5e54953d28578c4fc2fd35b9d89b79a912142f09a79e1eb499f9d6d09bb040e7a0e4f59f3c8cd7e211f485dbb99a23956fd56fccb88f55b29de4946f775dcdaa244f09d37a15199cad2ae5318dfd1a0d75671ff75ed31aac4ada717be9a2eea3b3d30a79ccfe3fd8c41a3a9623aa998dbb87f002c566db61d582ff3acc0c8311cbcc5660db6f47d7c5ee0b3516d5bab483c2386172a34bff83903699d495c543bc1d72bb03f4368696f3f10c8c0fcb6d54372936167c85c9509b4a9e94d7a6f2201f318694e0841c5ee4219d95b6423bd2093af09d104a097b82c0f758c3c8481561a7d9999ce6292042910f7a881da5b5240ac2d715b3c1a6caaf605342d08a739b9faed45b7328fefa231f515e57c114d5d352bdf7b365f9196460d7878741539c7813c08399f1eb014c392566f87314cb321d6992ef5e0b88fa4aae6c6a09dd43053ec78dd83eeb006402ecf8196303fc78a761b866868d7fa0f36930bb22f49616c6e1952c2ab603e41e2081f61f01b8ceede36439a55e57f2d121841826f1dcfdbe862d8caf8e75bd0d86397f7e971dbcc3f6d887e28b54329d0652c166a4b708af79f2bf94d1c3f711078d786bd573b43c8190000000000000000469b050300000000c9c0af7db7568f2f22e9e3cb877b31c82e4b6a4b143dd7241018a425a0b7ae9420a444fa0d8c33216be70c49cad85b624bc18e4d7babd8fee686335a3dea52e4c8b6dc992e7a367f856343e1065f944128ab3dce322f0aee5abddf1e7f655bef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000528cdcb71df7a9499a611318865306e7f5c0f2c456bc261b33bb94b5e5f01dabd5ed98e6abf20eb6114ef42244d546d048bca1dbbb24984c645920dcc44690d78fe4d778d2db826580d6ca2ff808e5bb7aadeb2299b172993e6f6091cf16a34c65e188b40f8adad133517b092534c7c547660880fcc1fe91c69fff2a9f8e46150311cda32dfcc7f023d68d0ce84806f9b858e3c174f224bb20d86d6156188ee5f9031abf90591c5bceef21e0a08b4c35ef06d11fd9c7d69fd921fd856d65b1a5a0290b051fe83a3527d53bd5b8fd5232d10d7161e530b9970bc8d0063f6708bd678c57cc22a4d11cdc99a3ddf70307d824032a65234ae5dc7323064df89b4927cdc50b022b4f5d4ed1cf3ff29b887a121f57867dd0dbcecc801ac678d2d26eca6d530c7e021c32ba966788bd7e638fc7c877edef8458815b4548083e08a2fd0cb81382ba08022ac241887bdf976899e6bb1c13376255bad4123bd64b2461fb7a835f1745a451031bb5ea1bc295d16d518f7d73fb60661f0945b681257885808b3d07ee00eff5020311b294e3613ce5a3a1adb0664f1afa5d71a919d0937862d15fe4625c9ea5c91364c68738b860d8632ba707ce9e49a6d0ada3c13df91a86d10809b037268fa0852d87adfaac04de71a5822d2f8550074e2d0e740e88213b0e2cd5478280a22a696123aefa8f6faffb228a47907c8f4a6b5c94e936e31793046d66b2599426d2d3a80d6b423d6ac184368e04e7e67de92dd0b37938aed620cf06d710a55246240b5bd2ef81120253fc63bfa253df4d1a5e7ef8f956114b0db92e789d68e65bd8cfddb99d3604e2622fd5d858faa77929638cf0aa66df039db3f5b573f2c9a73ba90f5325ae5d0a81ff0a29a1f850e2e2e9c1b2fdfc21e5f9e926c7705f474a7dbfe14f75a88203cfdcd307bcecb3d5bd112cb4a699844255daf15c5838895c8314da9ab2a1ee6a6f09b532d269c0cc5ef63c4a64d7d0ad3594ddb8b4969bd599bb69e44b20c092a2de51a14b1c69ba431d632045b533fea2a0611decee3d200b807340ef737b6bc98c19dca4f16214f231319abe39fca62d77f85448f3e1bc505915bdb882d06b2ef0448d3a4273e04935581dbf8f81736e3a0acc75da718284b21d96d32eb13403f5cf91298dcb1c9e54f4e87d8d1227d1b1cd4f08dfc92a99dc27ee0aa56e52740600293ff2e959e231c54fac6e92b2f8f93a467d16e6a652c27651bdda38a8af318551069087c3f4ffefd8a9dfd20f704c91943fb2c0b02d2d265a677b93d1618828bc83984f1bc2d73a58a767d3806a0944f579c3c1f027f99e386968d51e5a915ab277004c2f9a193d58a28c4f5c24728270a71340626eb4b27b85342b8c10eca0612c419f338b2273081a2f0b233f32cec415561cfb38bd86d8ffaf1b49ce27d3af0260d8aa4d465820677d06dc2fe52321fb3bd1f4cba31f9e00139e1c50d04c70d27cfff1d48e30f7a55d6aa919415de2b5a3a4be19db9b4dfafaa4b6e53a513fc57f6dafb87eba8dbae2a6fae970466a9b014dde555fc94b754dcf5b3b3c09ae877bd798731dbc848a53c350aae1e06583876bfdcdb2d6d10681c8fc07ee7ae1b04895ee180d870d39ff8c2b402da1bc81f59cd13472b4cc8c8965d10c50aa44c8b47c6da34a46f99042589d50fc1364908eb751ef56cad3d9b3d6e66c14c04ff9be767f65e3b4c7ed57c47fc156f0a19d00dda585e046b89fe8ce3638d28aaf7579282232f9d87320dabc635bb46df2744e1f5660e17b5759a56547d99931034761a9c2a0e33f3abe3d9ac5105a7f4ea2adbade7342dcad068cbe34e10e750ddaab6767d2767220b3b8a0115cfb3e5eeedf8ed00e73425f7bde059a3f6e4be6133ab9aac447a64920e6aa33daa660e86532aba480ad3e141a57d8bc7d912acd5125843373d76fbe3b3a2b4493a9a438451bb10c403e0a41d8c5e178653f602a4160dcdc7296fc6fe7a8c170474c3534ee836ae2eec978e6d883e8ce2b381aefeaa0385dbb1578caa70b2d05e62fda18596c5f26fff576025ba9c7c81e1977804e623daeb386a9f8df236b428e0a7c1f0b9225b5c20815aaa5594d93170390f2b3dfc6d33713dfcd1a58d5235202aa36754036163e440fb48b9e133572c9aa516253cbd2de8e41396abf712f00ec7f34bdc00a97aa266a26bd5a0fff35bf698eebf6013c337737ea346879a9d37edfb78d09d55f6ad78c31746f69445810a541494482d301b012ec2aa805b03313c123bad3b518508d8a028bb5c2078fc6608259bb3a7c69a85e3dd2bde48b3589520f97878a26a88bf0b64c510360e55b120934a8629cfeb76d2992d837841cf179099081ed62039f2c0b84ee73a66cee62eb075897995eea8aef0c58d68b7cc1408876497819d5e27bd3e049ce5bb35ce8abadc2d1f25f4ffe0b", "6a", 2, -1360698652, 1537743641, "718fcc233915e24ee46611b34d2e3f29cc38f22e00d514cd7eee42936290d944"], + ["db58f459026aacb8917bb887c68217d4ff6ee5b86656778be2c8b83da2a2210ecfacec8f730200000009acac00656365536a6affffffffbcdac9da76358369f4be8e64ed0cab5063146afcc06aac25517c8a35cb289e750200000000ffffffff039d5dd002000000000363ac535d7ca50000000000025163eae561050000000002ac510000000001af623b020000000000000000000000006069a138d01a9456099d13af8be102fc049370da949aaf8920986142e064b9a3fa66d8615c53804eb3ea0b79028830137f1b109ae3b8118b781410b4eeaee54bb3b2c4e819c09335c7f2b499434f92872552b113a9fef4f4b1af4697b50f0ab0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fef11192651bfb40d25ded007e7268840e5b813bb9c20546df49b7202a995bd4c9aeb554c6fa27acc4e98ddd9a8c2c51f4995369a32761b2ddfdda6aec44061a5275473bf573c0936aed712ec7ff0c78c95af7cfc15aaeacb0058656cc6da3cbe088464d4f6253741a9591960db9effcace101f5279872abd4182667a2bfa5d032ec00e5327498557d34e3875461aba2a3f7c4fa8d693d3774d74ecdfebad3c600314d618176a7ce5a7fb5c7f62c958d56adba393f01ddeafca84144add5076a7380b075f8d925fe47c006be6441eb07401ec69af072d2b18c884776bdfdaa873e99c184513396e88160e28e40402c4ea048272c2706409fd7d0bee8272091d76652403108a241a568796f767fb65d798d4429f079d5b116943b25b827f5f980b8b2c5c03058512a85f413274ccd66b3471d169a356d94651a7ee29e120eb45441e19a045032780d986ba6d63aaf1d3829f79f11135cee59d6984e9b26940dd44826cafc597032ae5729730a2280c6280b37f914fe8454d09952f74bf3673682717f19a98bbb703155b6482ce05a285c0d30e370cf720b4b7cc4c3f04990a6c23022827d30ed088a96fd7a5a32e3ae9a7b466b6ebd4a3d09e08d300d7aaa4ece4ca16bbc10d24a404ca5c2a8a80acdfb2a21f16d1c68cc2cc29a2ecb1744f9f6faf19976d9d9117aef8253e8d3776d9af5c07cab5308ea4093b45b2c6cbf1ab26b3a39124eb0651fa84e83104cf55015e6458e634fd1fa670c71e85958d978be62926cbbcfa4d4dc3fa65164db25ab565e13353f4a0dbe79a8b34a5c4f30d0c5b4ecbccec389081ee1dce2a1d3789f95a199303e45dbf0669a1cc94f896b2fded6de1af2709afcef622bb3f5c5710d0dfdacfb7508ba9fc5dba530bbcb2add4c1fe1ec0ccd0f01a6a53a21edde55fe20f67693197d43928038f7232eb43be3a8d294089d0ad56e38a3034c90e764ad9c029050f136e19831ef9f69ece19b114f41e1b0d8f97dc8c7d2ee7db130c717fd7f68dc5bafa9e1e42fb90b0b84a356fe4013e0d2a77e0b309424f1a4f64f41e7c16008031b70fd6594d9bee527222c4ea15058e0e126910d42739aadfa8bd526e62c52634e6be787e324dc7e9b0c7775f675bcf4a49f42be4bec8e76b5f5cf57e0fbe9cde19bae3442871217032efaa91b0bcc99eb4a813dd8af5109468b1003530b74bc6de9033f1cd0e792492a263ccca901196a6b1164f0124c75cdc2e3b65cf5ca20ed8442a7c642d94d279ff61814c1d8a4f5348b68f3ed112d75a442cbb14d9969a7d8e29d0dd9c2365229f0cc6366b84f0cd44818ef431686dd58bb8ed04e06284c4c195781790d2adf3e6173dad311d96549e57517e97b7b51f7954b0bb2715b1ae2214adfc7ae13a8a8ae05794ab59969d2ae325b21a3d49b86d454e6bd6609efb23d0b9185fdf31e7d13ed517c28dc0e7ac970fd25af7bef4b0705505981e451aa05b1aeaa81989e5058e19a6d72cc80534a754edc649daa4209b9551acbad3b4674a159babe45e41e3a5fdb10b4be9f83591fda3f4f4854b4b791675feb65ae272949d4c2cc8b379f605dbd9a1f1773d8788898e0f08d8e89ad70e7e300315ca82991ae378c51292a9758b388a78a42f85f88b3ff1a2323bbd80eeac634ac71ca21e990e7202c8e3f40261bfbe9da5627dae3fa45fd90521578858685b4368523389d7a95ebb4a6a8bafc206ab400afd88b8fb6c84b384f7f6670317a56c3532ceb684c3c5dba06d86c21bceb1644dabb5d35dd0b7f0674b43ace9fbac06b8c83c62c6c9b52d851e9c0e51221285cef2190c777b5c7be0d6cffe1d4ecbf84e748da24754c57b663b86375899d33a8cf57bb43b2b384997201d80c26fe9d582c7bc53459edaafa792fa2d5a6fba4505f6c7bdd807146127bc47f618498abd6dbea1d10439e384c8547dbd7fed1f8ba6bc4f6c79597a6103bc46a605c19b0dd9b69d1caef45408bd9225a8e5580fcc2cfb2bea58f5ee55c0b94ac6a90fe3dbed329930f0e93737855fe21796b0e4903b09e5b6a38df97ff28a259c9ef90f96408eda0bb41558a33e7d18d2a5f6d02a519880e623b70ddd05d87c6a289319990b703157c05cc7c6d60f094f8a8fc8da61a96353b4a84241e5c786ff22e9bf86ab735dd39810330b101500ba460c74ac70feb00657a2a10981a033e4da37dcde7f67cd47f7d8fa22b9cb2e220a1f31ead4cd3ee785db4b2a55da5080e3970589a7eec5c7f6caabcbc51b51ff1317fc2d2df605df418ee61db404cfdf55eb5b82a9e39fc5065695c796bb1f27aacf810f1aff71bc3624117b75234c8c5ae53b74c56cdf4005fde253ac667e92bf327b4a7a063b50e4e5aa172dad92efa706aad28aab9aa96d7ca73acd933f73ebc248fa8f49ade018bf76f916343c8c71276fee8a7b518ee205", "00535353", 1, 1180462196, 1537743641, "4ce258e1f86cfd8d5d24ef5d2ecd6ad27a08ce23544d3b0693682cc0e979f2ea"], + ["030000807082c403014a341b6cbc743add97c2dc52c12548522c611477fd8c91e91bc6ed156e968228000000000151f10a7df701b315de00000000000151000000000000000000", "65006353ac6aac", 0, 1871640883, 0, "f9615541a1f37aeb854f5b2236644f120ca662482d8809a7f28ded368da5e720"], + ["8dbc7f69043e42c6b700e0f893d13d44bd81067cd61d94f32330a9b4ac0bcbed057b1fb1bc0200000006006352526a52ffffffffb1fca26b26e8c56b984eb45d68538603fcd93e260731ba2b0065e8944d3f652d000000000952ac656352ac6565ac6fabb6a609aff31ddd0d0bab9e9eabd3f5a835112092ef6aca41e6e96a97fe607123095b010000000152ffffffff39507feaf49bc7a715e8cbf9875a81c5f937f5f0fbc0e53f301137d6bd59eaea000000000851006552520052005f229cb103203738000000000003635251d652810000000000016569ba81020000000005000065ac630000000001a771c2050000000000000000000000003bdf24b986b74ef36e3d2b5e2689a4f2d39d542a8cc742160f4ac72cc3d4f81cabbd601f2ca82fe1cf47d8a035636a3c760039254ebd8d9b7ba606dbe3bcce48ed609332fbccdeb03a7dee38e7cc0799645268b097883346d464288a9289e54c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b8b30aee844125b1b44ee4c70e78dfaab25026cd37dfdee51c8a424fce6179914d6e2dec352b8c09d70723fdc1c6099b73d83cec38210e5b1e473bb2a1091bbd088f9f5863827e41ec846fac2afb5a0647e19e3999c176c9011d2ce6cfec0ffdf046fae25236eaa3dc56c172bfb2d71e71e45801e45d30d5a9cc9dcf03015fd0318da575d18be12b7087a89bb53c8ae95ce1d7cac9e91c9ddb4eba3a3ae88db29023027daf0c3600e55f65440658afa9c77e3fbd90bc2f9dc2a654ecb2d9b507e010a05fdc003610fa3ec03e8d51977f3dec561236e3166c7704f37b96541011fa704c6f6076a7186152b740f0eb9138f9a7851a045ee5d1d2f0acd0e892bdba6e5cc021c025f3226d9a2bcc8cb6102dc90601daf37db8787d7df9ec2766a599c367cb8030c85b3f73f17ae313fcbdf68865c18cb4f65c160b0c0c352ec11035d7a7437e70215cfaf700fa1f6182c10953716a9660e67068e1548a0297b2104bd09a54245d5021939a3b5f9b810192ac721096c2d7bf38071e69fb178bab33814d6a62fec43dc0307d8d048a01b77834e39c1f0f521306cc71b8657f0138c450d7dd9cb8bd7b7e6d88f07449564fa5f8caaa1e279872156d25fbc66024dc1db63b2577dd295c437f261246dd4694b1e2e523df8ed16dc5bcc824ec1841a816ca4293f640e57450672ba4c480eb35234eb5fb1148b6333b7c6117f0eb4c45ff355a1045013f0c91afac69d51e524de29951d79734e9040b08d69e63733c0126be692fc10b403bcc2a4804dc9062e982ada5a98bd6b4e5322dbe498d92ef1e8a55ef8baf43ddb392aae90e860bd6b6030baff9f070715ef58bc5ba0df1686c9eb1efee517c34dc0e7dc8b375405e4486899efd9319615b427b564de7d3556f3c58b9519371e0c53d15de233cf5b5e0b5341c6f4415ef883d16972e742ed8a3d1670317a77cbcbc2fcec73ba8db62682acd85d5c4a689caa1cb0925448973b8c88163b70bb0eeb292e60a4edc94b572a3df933412701981082d8cccd011e3b05feaa8a37e06c75e19c4f73a77363e7f712d5c28539a9d0c689d5ff01f2b2922989161d68981dc33aefff4085c9d680c116eb1208f1ee75bd6227daaa15233e79355e04f4da3fca843b0a2e8592b8aef56ac8e54df6b1c3a473a743424c0ac2db9cb62860db6f014d4aa7e3c7000fda07a6a1395636a42d770f2124d39bb86b151400182994e0dbf240bf7c50b66e4853797e2c90362d5950c13ff159d3181f24a61b1df991dfb90272203a78d5722a8536bb6f04567277c94c0f187c084702b8ed71e89c959f1a7753ecbf8000fe3a8a3c24524193f804030024400ca052760de968d6d549a2686286134a871ccce182d90158c7d7d357234468698e45d4be63f50cc7497f194c134540c545067037a34689aa8d95d6b9464801f37b239335b5a68b723aee05988c1c1775c1fc04c3a63ed79d07824b8772683f80fc479c56216f1220366a7fad7a4105c539b231923ee113dac5f2c52a0a5028fbbfefe655098f54799745432ace114a298607529efb68552009acea1cee235b5770b20487c62a07f9d5376e08d1dad8303d33cc83480784ba8aa343ca743d1acb9438f8a4b17008610dc328778d64eade15f73cad233e369b141d0b57bee5d35afeb0917fd3286271db31c120e1da42ca36ea895256d7c838246c4c9f6e4088a0cb63293870545a8109348d366cead2a9bbd6438e75eb9051c7e11fdac741aaccb0ad7d35eec7178a5a6f4b6ce963ac2d48b7582f4790340453fa4db68255ef22dff1a5159c80622ee71277be5a13e7c288b8b91c289f21863d5cb1ad0cee9fa209fdc22dc3b33c53decce50f46098c6e51d14ff623fca63d221ca2ee65f26a463c794c763d3f4eb6286415d6a034d5e754da25c1ab63cfbb67c346661d562b14fd0c28aec3fe76362d9ca9dab738b4cc679f1cb36fdc4fcd4f84cc4652160ef4bf7b371b4e35e1829bdddd12335fd459371018a6c3debf5b28ac95624734943a5593f40df5e9fdac140eeedeb4940b0607df694e9d85495c7ab993ec64cfbb74bb46424de1ee4d6d181c51212ed6128230620b3cf8612279294a4b18f14b2b629842b24739b1ff7bb87da35f7b90b6a9ff428599e4f9454794ab40f076505f0a57e91ab5cd82c1919400fd06b2812df6d5e1201f6af188917d84a82f13ed7de000df8617ca7591960f2daa19370dfeaadd5ef32ebfaeb87e43e5261f822bf07f899d5366f690d5ee4a9f9746ddd0bc470f0c50f2a3b20374e19b7e9077d69fcd31366c50b2b427e27bf022090d5c160db6ced4aefa928b85c079326d10a89112f29f2414e4946a5d12306863990dc50fefc59f25a32153bc29b765cdffbb7abcdc8308dc6149cfc61ec5ed74fb99c6b8aa5e894c8ce343ec176739b23d82d80a", "ac535165", 1, 14531930, 1537743641, "44b5787c78085ac8d6bf24fc1bc3b041dc89af0e280313602b702a67e73b2796"], + ["86e73f6b0156e549c6241f86a62e6e467954277f1d3c14c7330cb1781687d39bf5c38f6869000000000165a0a36e5104d67c85050000000003526a520e9c3d0000000000016504e493020000000004ac6a6a526d224b020000000001009bd8278a030000000000000000c4673e0000000000255a56901b34d9b706d187e169608b190218b82435b9b5d80b050e00f7836b738ef291af1efaa23cdf92914f701e07e13e39d4d823cbce9f9f57b4c23529bc1ac40fcc9a4e11a89e750ba1751889ad6e129b79236e3a47f6aa60d96c6290cc0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000445e6ba015eb5038f6220d0a5e525f55f8a2e6ef6f830a405b6066fc1ec662d092b655f9d05f165a251043347577b6bab5ffa87d8cd36ae2b93e5abf7dd008c02f88d0e6e259d0d8afde17ae3c382ca577bee89a34fd4beebc860e25996fe7de4225b12d5a77e6d3b0532da93db754ea4bc26686e3e25ebce6c43e6da32ee22b0327c6f9d90ea22ed944642186ff57e3dd50b922906e99068a1a8834754529f9550306f1801abf3177d6e6175752e054f302bde0cfe59967f53524fdb6ca444533060b04bc117bb040af16c63b959fc294c26acafb14e11454191b115f6d6a40487a0a234fd0f3e4c6050fd621d30f9124d0226340817a766b4812dbf290b361f368600325311296162d3f797539ce796d1014eda71272140b65f256066e43b08755c86902086d489634e59b9ad830d569b74a1d071fbc0aa227884e5d5e043491e210a76c031054300e29d0ea436a53fba5c22eafc5d4305cb38b193c46edd5c4c94d2a9a06031d0b8930049017ff40c378155dc526e7953d18c4ce7b56894b68f292017c4158031e1205113668d41570dbed24bcdeef60acfda59e5cc6a2762401d01860ed928dd5a281d87916d78eb046878eb2837f85182a8716320781ebfffe487e3ad2a01c3ea72ec8d82c30030dded9a143cc34845c47a79cf24cfff17f7996f9e50171dac28bda4e714da92168782d138215806b098fa237e15d748d80b3ae73f3bd3711753eecc13417192131254b7bcbb1507f7e792987e9335d36ff65714c403cd37edd259787fb69cd4e8d7b9fe960e1b748abe1d01680baae38e9664f83ad891bb39c14745744d3ad2f50e7deb9afccc0a8a9442d2af5788571f5ea7114b88a3855f5b8ca6fcb04e09c1018ded6c01b7afd5710f6c847bd9fd5700c5de5009d1da4eeb5e693d88038599268e5e4976b6041d6806abb414a47886b90d76d756219c74795963ed6baa9cc57126f93ea928b9d4bbf210b946b9260d73a059828e7e8b3fbcabeaf515749d702049176bbba95f0f7f120888243243f183d210ad79b6cdaa92a5c17e38186c21495842f766d39a2089ddc40d221beddb82e7e07df419c746602893e27d340d17e2c602f6bdca71b53cc955b6a32345b60597de0a39c95623fffa0e06d534cf81d4d91e3f61bd7804ed85dfc930e6603e1456363969809bb0110b1a77b03e5fb0a6b5d2512abb760f66571c5f5e0fb8b7f1475dda23d7741fc385a5797a5016331b8eddea002deffa89644e762f8185873769911e4e5a145884d21bffd953d5015e716a53a59b928412047b21b609dc7a9eb68c6d586ac1f3ec97063d951b47a87bfd4e030338f8e996ba4c87836ee9e8871297d8939cc3e41281107715b6a4e0931ba9a66be9dd542e7fe0201b14cb2f3c05e2ba36e31fc464a75cebb4b4152e08658c2330687bd0e17e6ad45a312d4dfee0f4d87c7d1cdd57fe415c935b939af2f6f4e6e4d3d287bca8f1e1fa56a858155583b1d4d167ec28490bab0e6abc764c76e5b11f9a59f94b68f5dae9e8180b172e20ab1017c93979dbe7cce7fc32b16911a30ac5a99334aada29074cd00fb524d85616d374eb1a458b56e07eb1b6909cd863f890b17c92b930534348a94c7959cf434c4d3d83c26ca42c1d44e275fcaca420af7714b016721134d10bc5905115e2a61363fab95db2d7fd394f000ac95168db0fd6e07a9f429e25b100e5e0c0a16ced35b35ca9e20834b6b3da9f53c7c185b95e7b4bf813458f62be461b9124b67e172e45378b8d2d882e75b66c94bfe4ae383ab571ecfdb9bbdd41c13f1fbc5a5137cba2cfedd86289295f7afd7948b4ce616a80ea4c4c6c2e305237475c1e52a1d0f9fdac11d056078646c732d20ea2a02575e50133fd6e74f90bd2dde543321c6c9196959e4014515f1d7347e546dc2d56d82040c3accc67b512d18e55b54a1fadfb612947a886bd6ab68ada895b5f5c42e35459c2348143bde8f752fdf320f5f5bc701988d8e77b766eb647552af5a6e73dbda03d03fbb8c0622624df0bb568746e1d3ddaa7b58733faf5ddbd02d3ce5d9ec3f2d9120ee06500fd3d6de176bc47607a8d5a556a12bb6a8b1e77f6361f7ed7da1a88945d29b96789b331a5cfcb1f4840b20983d9cfa3c8219bfc909a86c3d1e38d38221421b7ab92e2d8207bca853872cdd4f9d6dc632c7879ab15d7cedbcfd995d6a65bdbc38594fe6ebe27160626689ca2ac7887a299a1c8fbdc8dc317415d3ad25c9288042daaac16e2d415750b1e89d3afec47192800717d22ce68a4fdf709e47ee80000000000000000048f258010000000091c6d48b3e6facae67836fb3f8eb9dd8561bf8705e51c6a51d3839ed75d56e4b6ded42557d1737bf5d40683978baccb406e5b550fa4cd1aa7657bfa6c74a34f3ddb4156f822f63f8b942bd8e4392c78d9497612ee426924ce991831789cd6acd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f655d7cd0ff000252c3ebbd4810377e2f68d8c17b399ccda3f5d4082c318b2f4471b73b5e01f565eef2976f38e28e08d132fe1fae0fe9982ac1aa168d13ec301071a86cdc1879a8ad9012f889edd5426eaf953e9f4ca7240ee07c27ab5975566151276675c578a8441656e29cde2001889d36b12b58fa93a46fcee78cf01d7c50220a0a73c4fdfa5c9c4183876691fdc04d7227eb3d1e85ac88b474a5763ddabad02048e604a0aafa0a757675e908216feb040bd2f92cd15a43c93289b089658137d0a080c606959dfdbf7639b0f1cee43e7eda68f0bdc70c2e9dc4d187204b7673e320d5a680d4da2c8690ded637e810358da6779dc57ad76f31ae4384345ba5dd911021689a2ea980e482f6005aefa8aed5c05a262a9e210e558bed6b12738633e0c3a031821aeb683233d5741a311282c4f8218dec539e3d97e1edd003941cbd5277c64020a42653ed695b9030c2a8132e01d6bc5eddc2ce40d305939797fdb4664f38d26021da31e0e77d9eccbcc34ba6abc808808ce3a850cdc3537207b70a5b42c4752050315bc83a68bf5694ac30c4af8bddbe962052c549447d048497e57085b362a25b7e24f69945ae0b36c750d497432bddbe66722c07b3dd633832f4da3ce066f05ec71bd36df48b440c1b78e47d5047c39a844626f7c15faf483164658ac177401ba36661f2e519f4c65f0a773061489df665d9c2fe7ebcabe343ee046dab3340a50521ffa9137773295db4faab0de40aa2e1f2b5b5476a528fcd227232a950c56813ec05d1144190678597c91ebbd8b00900605d99b83472717e523ae4a2385175e67e561e0b41ee70949b255172c255ee13769c3c840cd85229410b6f8af111a8a6fabeb308d3a2c1e82ad65835938b6a1da32a6d0c3cdbb5aae4721780edbd844191a98411f0a907fcb3cf850b171cb4dfd78c9bd75caa44ea7d442b66319347e3603e58081158d500f8e12794a644acdfa035e85fc8607de5440c3d8154202dcbf9718ecec169c322970eb89b98ce5d480761cf50f713d1d5b0e32d2eaacc2f0355deaa94b955b4db01265f5897e8326d6449e591d9dc01b7316cf88a44d09d9b2ca945b4d0da3844e67f27287f77a01fc64013552b05ba357d6c12bd317ecee478beed7c14d6dd6a94f93b66d9fe1d846e9bfb7a7137cdd30f06a86e7b57c45ce873e2e97a3da3c4f95dda48290bfff0c1ed1eefb88d36c42c96b2e49b3a3595fb48e96810e8f18ed20ce5cec636177c34b85a097d6e6ea2f2786a095d82d2b430eb7ded292537d4df9232657ee5942bf819e00f23f1a50c6e8f16a9f15b3daafae1a06be92b6d8b7b87ab3416aff15bece20e1712318eadcd741bf94989b4efceb2e38093dd7fff4ab89e127e811b30ffe6fd3fbf0f91fe695fd35198bf49ae66fc386cfa38eea5761d6fa87dd2d19089a6b2124ef80e46ff659f784add94e333bef91881d5d548510b27fff5b3a5000302a53f98f4c5da49e3288c8e9c8221914ddf0a976a93ac5e0854876854802dbdde3b0801223077cbe1c6942036b05bdc7f38f7ee7a5eb3a5b4cdd5521dad2fea2f8547839b31d43a7947fae27146422d8adaad87c81f8031ff8465ec070c472864adccc443bd30f55ab88ef65101267c8e187c8ead408663172a37dfd06378b8a44370c3fba9ed572aeb799687c4b200bc23289f2b2634b2a27a8c1342ff793e8cb262448f7a130a7d41512d05eaaf7eb0312722fe6061e80f89d3b81bd58fce6dc6439c110b4c900a8596033cdf8cb844bee349fd308c566d6a0ce382a4d06ef93c9ee7d641e696070cdc433a2bc5b8c008da13a70f67c684dc96cdb23646ac8c02709b2465924956c29a7ea80ea5f21af992866bc003d33562d428e5cf7dfc1607732bb0ba18710d2ebab0693b85d8d3fdaefc1927e3a8cbb886dbbef2ae3eae4552d820eb6e1725571ddc76adc93a2c4385239d4d8ddd2e416330762417b8f62f6550d93b0a4a905d55db83968057aacd555469a5249368d858b2b475da98206862061c4df5a1b47951e23a9930aa75769fe7de2047c817a9eaa7962d6e809f5b21ddebb347c07f8143542a9c9b8b71b7cd0a99a0db48f5906bc2bc6e0bad63785b107e9685e366c11f0ba66100293ce22197c8078ad2322a8a1df0d5408dba41713f4b2a6fc59db12bd73dcc0f0528ef3aa56738e3714dab221d8c4a1adf98cdc4c447989ae5f96fa96e02b2d6a74cffa838787eaf38b6a80b89f6194cde7a6926acab00e6efacb0635a0946012eaf8df63b4f62e8b98f5841c0e46fcd59c452cec020000000000000000000000009c291dd814c9bafd47e0f5d0a1721a075f4d65f068e9bcba794a5d33d8ca3a8a959e56b573dc80f81398c26b61c821c26f6ee14cf6bc292a136b690f08eab7c6072e9e2f3e2318f465a99d2f19894ef6c98ed9f71b4953064dc0ae303d5646f2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b9d0a111855a8fc0ab64e087c0ac8addeae48553263adf6741072d092b034c50e652f68a58fa8c354b9e953af69025e78301eadcccc5677e60c126331674fdd855224e98db0fcba95f4823cd9ab74b706f8619ec29021c1fc2a653840b0ae3c1ec80315f9dff5dd23e1748669c81abb007cb0931d2ac0edd0d4e4609850b65e022783dba0658c3e9459a10539ec9a6143efa9773992d7c883847182476ccc8d73031a0fc04c593524565df66c1a9fe17d925ff05244954405681bfdba2008cf83ee0b04eb70b808249459c67946c582056c487b16ac97a81a9148a24371e1880b1414b1e472ec4424bf4d6f2476864fdc64705c6237384a5e1b712b3527303a6628fd022475205f5940f94a1fe3149c156f8b1e618b4408fa803fe6a63a0302ac8f3277031307800255769e83f57a30669c38eccff33a64ef1d505ea93134a748a0d9881d03065d08f45a378cf2a0cf6adcdd6c0f5839e416dc4f1cbda62aca1c48677a89490322f7680b919fa71a82b9d9fdca5ea37d94be0c4484c8c34860d0a7c9cac41e8902140bd180c230908d0c3152acdf3c4273ed1f0fd7be7137064883cdf5a1ebe1f18542417ef36794c271a36fbdd59a4c983d21007cf72839dc7c5754c2a1ad350646004000d312e37f831c3d9971562e3391d65d02be9501f5ac44da037f360eb04c0f6c9c00077760a99694baedc9cdfb2a2704bffe5db6f268f4d480238bd492c687e2e38ef98e07b3708fbbc10d104d64cd30aa13a1327779e23626afeba2bdaa34a1b344bd7d407b324b20bf2a2fc46b61c83e5fffef9532bac6686c1a6a9d8e4c9f936560769cecf5d0e181078b4c9aac044514c9089bf72ba8222ee44fc5373f210078f0da589eb255cd27d70c83f7fe30eecdd46d74d7bc9c4639dfc71fa277ea566939999edb7fc176db211fb1bb0607ae209dcc53607e9e644016d733a04c8ba87ebe41dad435d56feecaab298d189616ca7d1731c200715965b3f3a0f902d852c749e9a7e18f904ef98308e87b27691d7702386a95959e20da82299d5bdb24f718d1f8854f04878f631558e9041aba1575f8f638d1707b548385132c359fd3413d4a31ba5347a19e589e52d642b8b46f50ec9e5781bc43fd3b34cb0589ec2ca8fa355d740f592c378ec5f074efd8ad8cf5243bde8a6257dd690a3ec89a82ae97cfdb90966c36dc7098778718fac765283619ea7b7bad636b3a5507a3c78a745d598b89b89339273bfd29f7cadaedf4eeb6ad87909fb95d73154eb8892a8ea6528906931a5a6a785b92f6f27126396f065e287233950d1b689bc30c3ccb57c09556f8ba6882a7ff9b88d6a3ccf8494eecf18350afb915a61e0192338b6ec0576ab152d502e2ad76cbc2315bfb0c19adbd7266c12fd8e0aee74689a74c7eabfbf0893d18e891732a1cd1eeff5caf139283c54c5bff4e4f5eb3e3757f29095468cdb557d29951b5d78238a82651c061bcd1f8b6fb140bc5644e3dd412de6c9b2395ac21a906c4072f7aa86b590a2df43609cc77fd43a503b98d3d15082fcf05cfede762a8bc0e937de5670febe72939187659c0e96a4754947be84a024b755b1b88fb872d9c52eaed94454b465363dc6d26dd8c0f759cd1014b5d08bee8473bc122e8d7f6b45d038cb8655b0ff856843311fc021e19fcc143c806013b2d021c31608fa9909f6621fa7af4972d86e4d158d8776ddd14f3c8e1c5255cbaf6753b8331bbc9dafe51c9dd2083f665b71dfbee635714e6fc077451f9726fc792bfd71b715bf99b8a2bb8a9a36721dcf90aaf6206cfa68de6d6f7423a9a0c07e0bcbfd332640d3a5e6458afecc453df1378bfbb4b3ac63d04f2e9359a54a0329115a9431db65c4bf42d878770869265d3178e7a3326e91390f3c45830abb6f3925d6815f81573a54bb6d668f892589a2f1d25e540196214c5eca21198c6d6148720f1daeed265d16fe7908d079c55aa586d32685d2fae795e8b1a79e5dce982289430b55636de26d568ca1abcb2ca4bf535a2d9d60695a03204ebebbd8ba07577f223636b42d667fad35ae481f04b55c33117912d0f09b76284c2e3faecd07dab739674300bb0a0e3ed2b4c0216f45c8afd0b4e0d8ec164e0ad62dc02bba0cceede46303065fd687d1005f105ead4d6a09e2a6655f83e413ff63a950f403adb479d330b81916e8b21ecfdbe578ce8ea6b944de51137e7eaac8020120ad10f4c6e46ed2f005b533ea51a82ea23d6e84d56cb779c495c3e86964bd290ee497c0f4c9cc0134fe67e1eb4d80c4e91638add0de82aef3413d154c9c2f010c4896d899917d824f968b0a12c017e54b8bc91a6c35cf3cf4335c6b1c53bdcfde0a9ce36b3f172c82112b157e5623935fefe87e4c663b315144ecf295cad7d811aab71828a3d961827df07b1d9ad0803c83ec701d25e07", "63", 0, -395268715, 0, "9451e0d9cf52b2b7f6a4af4f6ae4f53aad33e1d80cbdf78ed443dbfcab7d1848"], + ["4c92130803ef596011a24e2668153c103269fb82c7e358e0aa0bb69411f1dd7ba06c47affa000000000351636a5de3dd12e347e802e99fb0ae96a46efb09c32f26fe516445170c43342b59e63f43e90d2203000000056aac516aacffffffffd112ac6ff9cc0164a8e3139c4154561a2a5c3bf27a60874e04edb9602efaef4a0300000008005151ac51516563ffffffff03566f6601000000000963ac6551006a6a6a5243ab22030000000001ac558f2200000000000600635152536300000000018a8064040000000000000000000000006ff52023457ded66dc9e3e3ced202c2879dac1325dad00ecdee91654d7a0ab6bb2ec0fe5dbe8dc9805d9b3b8b5bb2bcb3d1246491d78c25a03cd6ef763f5175b7a698956b4a8e447fa97c1c21f5d873ec22ff9110d3864ce0fd2464836552b30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f014d0f7e8d7302902f108e1591c3d3857bb97d1ee2bb1b8274e10b5a52017f8f02fc3c9c14d03e399d021067758ef12a7e96fd4420e2880bfaf13dd3d8827a736d983f4143eb72c5fd0bb9d5e8deb4ff5242d7922e763514eebc23d01f2ec0736a0c1d74c04d92b7a95adf8b514df3a4ae7376c49e0214a9fe8da7aac2a82d03047e2acadce766421601791613547d437de659873ec59137b7459325e81b7c44031248d6ec7c4650c913db15025d0d1d5e82041410d0b75c3f110e560de30f699f0b0419d1a23f7915c2cf46acf4d06daf69a7ca6528fced114a41e8024462584a7f793bdde3890993efe3b7cbcf24e38e104c6a1fc88a632c9784e4546d80f372ed02218fdd3f9433c71689b9dd36736e2c0fe8c776089594c6af6f4f7267fccc82fb031fb9a7aa3d0b3050ccb57eeb50a56c046d9e83a2136dd6fb821b9301473787a00314eef406e0a5c01d93e1afccabd33aa7edaece929d300ac9c7e3f9b6efe535ff030a079b26b90d7f6e58e570b9e97805b1c1d3560bc4078f41343d5381808bb4f9021a2b608bab563026b588aa021a0157888137edc1b84a497e4b620c6b118ec176b96ed6b7325220736d5f5f2b22fa8a12903f4b21e5437e92686ee08dc7e7b0fcff7db81720f6afa40889e796a67fb99759ea8ead6aa3feaf3fde2a578381cba0518442bcb9832ff3ace9c1b03f188b4443101f8b93d3ce395aab502848afe4d84a9d286b2a6f0d5c5140d697b55c5de9622323aadd517212de07fdbf6e3f0654f0367cea07e6d3826f52ea8e2c5a54fcee92dbdca83510f109e6e5246b42e87353dc991e978cddeb733b64430d387397c251d81f88760803c0012043cff9fa3f6ad1c512c382cfc79b3394dad3436d55b8efa3bddfc25d2ff6593946ac4a2c00b2feafd5a0576f90c1b2b3d2628808b53018e6e6206431f73e9416d895a0ab58d39cfe8943421334c5843bd36dfcfd73dad30c11eeb739c664a998b4b48e9e8d4bcbc0e5eb0ed8be9517f4ab0510cd6ff254ecb4bdf7d34b36aec83d7a115d51413c428bf35c3a7af20673df48243b80b265c7f041ab41b565ef203cfb060ba310a5d0f378f7f4f37a132c91a51f6ef3fc0e0f6a75d2fc78f4882cd744c2a3c3e5fdcf82a2cf113d29941ca3cda3502c9d55064f4e6840d9490b6223b2e3197bd9f4bf8bd826b66439cd8d664923caf284b65e6602cda9ab5dd13113647b5d2d85b699104bf14b8d0d2408c485cd0e9fe5fe613a14fb3351e1d865a78f919e5ad9b1fc52c88b0826330e085cf0dc2a1e497da2ea4207a5eef79f5da9910d2390ce95243f074fdd71179f99ebef2706caf38ac6a5135f6431aa670485d629e86ba4308b0ba9f7a2e6325ad37d890a0fbe67e6940189ae874460b8dd9a192617f90bdddaee2ba414492c466d7500f142e567a2f00af75118eac7e96610db7a2cab2e8f307f470c8259dceee77c0004a25861acb3c78b9b934c32a1b55a48128bde9d06d04c149de11b6ff7cf84535962872ad16f670517888a52ad8a9f8dbcede70e955119945b0f3df79c4e46437bd410dc3016a705e6a12f0dcdd3d01cd9d12a80d57d76da3906c3f7616b76fe0f51638814e5aac16bfeb5a996c7e8dc65a370b28d203131623811ea3c67858532dabf33ce01fedc3ca13279588b35ca9753317cdb7c0dd688b6e17d938f0a522f9a3a913972d30b54bdbfeda7dc0bbdde7b68c88830bfad9832631b1a242cb49ddaabd0fbedf5e25aa78e5979df252361b4eaa8f52b5e65a78753d115aff95b3948ea43fb0b7712b5835ae4d50bb014fe7a13a15d6e88ef1c7688bd84c8d398df221c3e95e9225131c14769e181be2df6ff1ca5b3dd998a1364b320e42dcc8fa146d4ee27a54b6083c8709bcb7d25bf3916d0cc8da65ee7936276386bb9e8c5f269162f803f6f04c3f7e5bbee031ed1a4a2318db404bc813f561fa77c4468281428a2c5cd67c989dd939baf888bd8759f7770da9c1aeafe6a7e3ecf33e7b53f42e59a4f69a12827774297547352880383024bd848a135364f3638fce26404a1073137266394bc96bd27fd4247cc212a63c747cbf46946ed3cb95cc4915fb30d5ed2d6de478beabb2dfbefbbc55a35ce74414470e0bc2caf9ec93c90a31a48b4e7ea4a25686c323ee68d7b9285b6af873212024e8811f65757c9ae28070aa5f49e1415a0c4cfff37810d0dd13839f8514c7d86f3653d3089b058e2c9eaf433c8330495962f3ef3bebd8decdcafa93bf5af242cd724125717d0f74c8fdbbed3d10c84be46e1ed0ec05865bc006571a9f385bbd3ca0bf4c92f4ff221b296674889bb30d4fa5533d37e4cf5de165a26035c9668d2f22ca2c43253193afe7dc4a70ad21f5c6a966fe2066593083db7fba34eda2926831405f6b4d3baf86964ed2a79d72f457509", "526aac51005353", 0, -2008643485, 0, "037f25ceb354c113abba9e264ce86848c17ad279e7cc47e73059462ce919a44c"], + ["fd24272403760ca96a1b16b6c50414529ee34447b58476d32dd41088237034c3906197d854010000000565ac5163accca548f27b4db853e5a803920a0e39e567c1901c7f93ddc36a9087e898c84b27e777db2e000000000651655152526affffffff86ab5a51edde162ec935745689ef4bb65fa6e99163bf56142ab7d617fab0526403000000046365006adaf37003010159ef040000000006ac636a536a6500000000010000000000000000c4c9e4010000000050e156cbf87a9c3f6491c5c7f327c7ff2c9749f0c6f1e0db5eb81ed22273c96aa3ce384a00f6a11ecb27f9299a0497461c944cef6abf20036474e3ab10d723ca15081974c99c8394d484439672aab68826870955cd1aca4a8ca6af3c7e04671d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027f777751a98018acccc61a0b852082a319db5e15dec74129c8166ef3afa0e503991f67872349f61842673f78a13ae591b203ee48c3dbe2f81efa808fd4fa9cee53d0934a750c0e494b5266dd91e814e4a4e087d40748b4401b59189b03bf6688fdcbf72c97fcdb0c158a1a4d6c071be4c7bfdf1fc510946a0b60af63f58afe5020c1a08e6de51a28f2b7284788437591c57c0bfe1ad4652e229f5509c85d03b5903301cbc7509a731ff9d0b7f91f6ab6cc206e10494614b8ff648225a8e86ed9e7e0b01952d0d4a9cf8bcc3102006808454ce6472b9671d386e6a3e67c5e88dd8f386a9f2c31bd96fb3c027e2c4d4d09052c1b375989d9cee1846eb4abb7025141d8202266e8b4bbf71ba51be3c3096a3e0e9f87765750b951b4c0a4703a85a70df6f0e03109447669bfd9e38263a87ef7a8135f6a90a9bb5d51439e8000376530826d995031e9b94548204252258352f04e622f660a737d492ec771e603210bb2c5667c3c4021562c6c2972356a9fdd738bdc1806eae34b7e0805b7b3d6c5d7fab0b4bcc221a02279ec36d95c681e5f758b5b0c2ace9441f93c6192168843b5f205c49ea462b09c09b2ecf9fd8f49789c38345f7725ca955bf4890572dd7f4ba5d4f368b861c752d25640682aa86ac149cbf00ba7a75cb5bb35f9d2224fe07868d1af8488e6d4ed6fb29f2ec638b16f02f8ba2fc137a882cb18e0dce1273862b4269af53707a979048d42c316fb85e740d3d1d1fae24a9ad798c049d4ed1bd4412c7d3f5a212896a60d9bd8c6dea9e5b6ac358438a7fd2c207d865e67c62d198b09f13dfc6ceb31e3902c719943174f160505f67c59451ae921e5a4aa7824a6e0174465dbb8c931f3b38401cfc7644a9f1d3592687b370f6dee2c06d512ef18bfdc00244cfa10f05cbe15787bb6e9f2349188da904c6092e44af1bec6d5bea7002d3f8b95937c5418aac76a3c1f3b60947e987f1a91f372a62fb7bf806b676a897b290bb84a1d3a893f6841d30f3360f92b82f07de265c7059c9d3354c3d29f8f9af8492e5410f972c3631d3d2b25d56a3e325d003afb1f5cb32594cdd7a0955ebc368670140d58509bec1231093b628bd851c9cabe5765fb9b7dcd45d8c7dcb6516c4ad676523a37a2608b5a9670bbfc4c0c341076c92f4d72f3671de694e534553b03c22ad1820124078a5e9e395e99c766d7113b9ca74fb268b2276c4d54bc4e3e151770a672c1212ef6dbcb597cd480017cf3692df6f44fb2a6cb830a8d07aa798d618c31c3b7d91c7fbd2594ad6673f3a13e625751b2c964f2986676a228d40158b5a2b1f3c071d197a8146790373577c47e8716e37b5da500d2cfe48c90e42efdb2924a150d01248739218f8737ad3e56a45ba0b73588353fc0eac156f64f7034aa47e32fbdafd7973174e8a3263b28ea69b7412da7da77bba2b590b85f8230604108ed631925f61935caa565fd31cb5aeb8839639b053e2af4b2b994dd7d29a1b6a6bcfd04b6a22ccebd20e9e5d96d5c956dcb093165c04819c496078831f1dfbcf54f3f2e07aaac403477b0035b80b1b95559f570ead7fe6801611df4a900a18c6cf0932d33db2520ad4c8dfced7beab88e9a858e8e96139fd76d8f54f20e6e1b21ad86b58d1d305f7b03a5e058e7db33879599024ae198c8d603c30d50ff691ea465f82c2df7851babce661efce137c94b4020bc22e5b357b8bbd536ca2305cf05017206075ad76c8d0420bacd9e076c2102a4334d423a5605237c9ce603d696b553ee33e4566e00c5e0737075246d20bd76ee60fda068a621181fe10c29e363906b2fba4bbf94c2df9da703f7da53214d1f955e6680129f51e71ac53189efdf71a729db77c5ffa76d3cb3eeea3ecd5ac67a55879c092cace28a4fc3f7eb988515a0110a8618990c37db909435851efa3f5c8eb356e3b8cfab7573ef37ea72aa100dc13a8f023ce78a03b03f8d646e3f4479a6438f280237850a5f2aec8060852617b80d640e55e31b9d35106f01bbf1647c09f3e42e37fad8c2afd7c673c1ddb01642ff672fe5d84f43c58436684d01077f162d2a25a1d2148a623f5a2f2dece2384addf891d4824e9611f25ab76bc0331e433e05c04ac37b7bb01a5e3c7e67a5a04bfaa53c7535fdf8da2a35435a72c8365e88e0f1661b4c8148713cc2ad3bb24f52a096875006dd3ff30bfd91fdd789137548c094da0103732221bf3c240785de27973c9ae42050a0f4e822c5fb895bb813c7e28f6745da4e58d9e69f2ef70b061c9f0998f8fb9da42379a1f013cfa3aeabe04f73fbabcbe306ccdd53e226c5196e4aef7201dc79dd79ad94e4411c143ec97e932a8ed5d1470d950d22ff87b629ecf159b3166775f8a19456394ab9bf90d66b05ec0ef4098182c06a26be43cea2b44ea4f865436ff51a338e1e5b2f56c193b0c", "52ac51", 1, -811905829, 1537743641, "c26df0be7833332e40a9cf68f98c8ce35a6118b87d20d5253eaed07bf85ced7d"], + ["26a78e7201dcdca9dfb6a224707bd543b288e32fd46f0b1c4ae227e0e48fcf7ef1025d58f2020000000900535265005263536affffffff04da9b3d010000000001ac591412030000000001514b8259050000000005526a65636a9dab92020000000000a9470ce6027379d102000000000000000000000000cfb5bf345086fbd8e6c10d2d5232c9e4ba71461e37449148f7d800a14d5f61a1548d77337a7cfd997d7e1147a8c27203ab39002f821b7f85c593f097cdfc2cf375f813589caee760bc5efa7e92cbf4c01b216d2ff9ca24c8e9f6ccb91d547c26000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f4ed01008b697fe8346deab6910e3d3407e73723d8fe9bfd322e5993eb8c6422da3ccf29512a1c08707889bcf35feacd6be32a751dccf587b37f6edf851982fc857f73f4045b1725e596780bf800d7103826ec6ab07dd9f62033e91265bfa9d8911c23dbc2506525b2da7a9f38540f53af4f99e638c14381b4477b8267c2d86020ff955d51e992200fd5951c4521304fbac2584841047bc231dc5f5dfbf67039a0324804a87ddb180cad96a3b8e517d9d1e121948c64f884458c7842d0f8d74674f0b0696965167f718326ab28ca8cac8be21aa7059a0162cbe322cbb50fb5ea1504ee17aa91471553b441fa79a416d1cdbb9dc1035971cf76891206bdb2f88c7073b030bc473f6949182ac22821103ec1dd7fa286e516c08cb3bdef612f22dfa88c8de021ecf194acce8b7fadbb621bc0ef71061ac8b4c2bab4ce2e418705f1422acc9d6030239660524668a642aa903c52c142968e54c8aa065016db4a5ac7fcdcb469ed602196792985d526cc99c108a7d300a3e55935ab1daca69a8774cc979ad2f2f34740329bde355c3ddec18ff2e1559ae7273055da045b1f71141e5198037e6031363764e953f9af5c6a19631495e0bef1448f3c0458bf772cef163ca3acfcbda66095a0f30f1d4e1775f665d11dec17a5cdf5f183d0480501c7ac61b8d06804e2976a0e3fea9b885c99199f9a31c53912146f2feda8810b01b90c086eb8f1b7b71bc080cdf337af648d866b7d2dbc973837079e8413c24219c62ccbb8df088f3c12abea8b8fe217c60426961ca95d1b2c94788231785b1d56c6d6c39069da998bce4b7ae0bffe87ba54d221dc3fef6123bf1001a7bfd55f5bb7c237c10ae3e34fccff1ba538bfdf488ca3151be886a126eacd452e36b1ef3f3101051ffc4c9ddd6a03ff250368c66d1fc9d95a91b6e902a8fa8c982779a6531072129ce9f6189485b72f2843790cb9c8ddbb00be86f87ec90a8302eb68e4f0ed1c7e7bbc92201c60e7ef8eae6c9a4fb4dc449d120f1599d58aeca833028d137bf9c97155955210e17439a4e64f21f2329564ff55ac5697f56e11f30731a62fd4a4beed569b2893c301be187153aa8aadae5c4d23dd20ce019f9fe80b112d5afde03655ad6fa8c740cc1ae75fd8c90e8b53b34bccaff8b17ca6ecb10517234f2644fa2abebc53bf85afdf59153a6b7311874d82f33a0d68f9eedb389d3881bbc106445ed08f82269b222ae7f7d82ada81b442b4925030a46c3a202a8bc65f88e083fd8787255953a24f35e565638170c0705984ce883db06787133b3a9fc0ea86505be6948efc915988adf5df2f14b89492fad7e5e7705924f352dba8b4a8e5cc847be4324a3007f8347d51a5e6acf4dd4c49b5c3ba82f685a7449ca4663819791f48a6421117c5d1675a3681ee0399cb6105c2c8b4aaecc7d302ea499cd2cb36b06cd2611ce9814475c1a3a92932d215292600565db7c543ac885f8c13e860d778066fc0dafad6ffedd3581422bb28f2b8a059ba991df4749648df03ba5a863e3d485aa1d2b205225b95f7eedbf722dd24737be668e5a74f4014527ab6459e887cfea5a7cd21cb0f4e4b40d07339fdf38be6c855846eabd5beb477adb7846e0ae0e308a9383aef6efd943be3dad64852eac33598f2dd56dac7cc5f8d513f2e942458f46bae9b365eb78c9d109826bf83ff86b05db4561e53b222369bc012f94bc189a3e568a72dfb91388d35d438f59bdbb7b905856e8c418e93b6183d506ff59541b28a3f6174a9d41664503732bbd1f4f31447965889a48bda7121f8091dca04cea8acba2af3a555c99040f4bccbacd165702c78f64d083ab04b21ec8ceba1225e056d339ad9156ec5c795936e175c1b940c6d77dcd309e2c3287cc9d84e7eb1afb161c74f037a055876f3c3e14740517a7a91938b9a93204011288c94c035ae995eb2532d45ed6570615ed3fc6da7b3fc6478fbd0f6cbecf8c3a4aa9eb7c8d60f56b225b3bd7250c7d038cb9b99090728686f78be49f82d7d29bfb508816c1e60d95944d6cfe07b162cd1f725b24ca69311cef22d57a44d733073dbf3954dfd800f0525c7a45d041f2a58eef75f6eb1b95e18a99f39ffb4e5df33873f2c059233e812857df4afe0ba4cbd8b49b95e16441aac5998146982f5deec4ba8639c73162d78c05f202f0ad00d522df12ff158cb22f718de8ed7c347398b7a159c79c8a5e8af7cf5da40780ed91d9c2d5355a93c62ce5daa6ed6bb9cc1c289e8e7a1a466b3d0f6ab9a479809f20099881f47942f93d98f58b9bc36d2338000000000000000058197d030000000033cad6ed7e53c2a28e556862e180b262b5ef1347521407396b58d305ba37364a7f8c66b1f15032244234e0fc639beec33dfd659151dc483ec23b9124878c82c33a175b9d52a2832d3cb93fbc709f271b6abc96babf6fe8f4c89e2d7e814e815400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fd1b0a005d293c3ce1777a73ac026a82cc7713e2c7f7d16d685831c11fe3d763c3aa17a947f13502747447e39137a24ff6fb7ec146881ff49d940ac937ef18bbf3a5e073c3fce85d4dd830f596dfa6661df299e3e2aa9f3b14b80b621b56c3251bfae62cdab800aae9f5d0e535ab51a39691af0685d85e620c7e806c75c9c588032f0bab5dbc4469077f2979ac628997952e8ef6087dfc327e966dac282e7d93d003005d124d081d8f13d6d42153402288df5d73cb88cd244b9f06e1499b6cab39d80a08f62b7fbdbc81c4cc2a9ce677d8bebd55e15f91666518b508b686b64a4961e3162f2c695ff089b13f085045343d36dcf115f6a4178df8e5bc23d814518e06ff030c89efb1385df0521cd013f50986300b8d62145028013b44f39ed65d0db78a15021fbb3c70b0ed56d705c8016a25450b25e8461ecc4ba89bc73064f62db5e512f20309cb116899af5ee1ce0aeee7c954ae8d43aca75f7467a95c502297f1e1a43f9402084db3cdd65fe3072f15c263d08345e463ae4edf662ab56619e95adc3e6ebd4903258dae0a293248823260f0c44341d9258fa2a617de36c1bc8f57fa76f0d0267c2721f4021daff9aef2d48e0ba3e755f4d1662ba09aa04d78968f4f0634cd7938a7a457abe22f9bcd75da3ddf869c285401634135f4bfeee882951f6170536f354640c642c1e581deb310861e672c32b7eecaa159465d6ff264318f1658c010ee5cb5757deac68f7db565a1e476503a197faccd8ebb05f591adb81eec95acc56c4e0af8fb06b9ccd2a4bb359b29a128ac605e73933e8c5e9068e129a52321592b21200d0218ec0c8073cc5f35609ebcc04a454cf436b5da77a17e2c616a0d27a68939e721a5d18cc4c83fbd94c92128e9af72f4a45120c169e9d89373610fff1bf2cf1b2cee8516144a6b9013843ed3b082dd2e328eae46a522a02a00a67c372d79a78370e97b7de0b4c8bf37897c1f9c905de160ee02dedcf36c6a4e76819bd047764498600201fcb015caccb50a4f4baa62d0e6128ccaf3f481c8f19b5a50f4b3b1c67e10dbef570d4100d82ae60cea4944355d599492c01db7c0e8f36bf05afa092e2d09e26e1f39d9091b50cf6ad4faf62656bfedd52a1cca83db5611f774bb1795494ec4439c81b318855c2f6ab449c9be4b25bbc7ab6289cf1906dee90b1ce9033807796b1a38310ede38a7cddbad9d082c70d78736c610c90f5dae415d03efb8921af775368d10c57260ce4e92c64f6c8e755b2aa0bddd05df637f317afd551545f133aca77b53582290c06b60a69f192bfbe22e867b2aea04f7c03f086ec5181fe19d743225bc868180ca5712a48beb072ad19157f2157c59f04a226dacf85100f662986421a4466ef5e63a2efac086059ed82e6f4e3b2db5099d4a9359c207cfb9456a6c4a934190e365ed55df7a1522aa700a77ebf51c885c28c5748d6a226b3af939c41d444ef14c7b4f8d259df669fb9e642203a36b7b98478e2ea70a1353f83c73e07ee8257fcd63f2b88a4b18f8986477621617d6c313613b62b52d4761545de3fa5425de02b96e441e6a6a067552b115a5fc494b317d65f36e7dc8bac29e76286b1b633771a10d4c1d863a8ed4f21e77aab403dc0d087e1622a73b92c0f318f8f4892132d120e566584344f5be703c129f1452ccf004a91d213be29791be0bac8a8660048ffabdc33ef24c57ff59a585a79b31ee865f473f5e36c03b93986bd2ac462c946d8490e32f14ffdc190efc74ba69eae498ca84b3a9331316d5fb9f5b95a3893790c9a6648bbfe385ce90ab696e82f6db4c3be8890133d5c4a393dfe0900d00af7385b5129d5e0af385562e7f99c361b8f0203475b659d538fb9476e319756993f97fef9deb387ffcfd57336d303ed7d07bd8a25e8a37bf01c47efbf158505f9f0bba6c70f527497a49875f1f1260882038754e6c8f95e4e1b894171127a2070ebdf92cd3a5551bddbb3a1b1cefca28ec34205f4e861627cd0e6f5544a5fece33dbda3215b385c0087ed9c527494c39f5b2e84dfe491ecb4bdd12411243628695daf0602860d7c8bc559cb9c3311d87b83840daf9d32364be67592680b97da44fd42b5b46fb889f4c6466dda808c886ea3f54cd1b0bff7a20353d41b99fdebd30f183a4d9785f0096bacb85b39f086773335ac7ba1203b44140498167d9a25d90a11e0bb726b307a0ec0dd926096573827490e9816a44d3181c72b78d9fc10b46f0c3246cd60bb064135367d9f7eaedd1388996d23fa17f98e27f1af3a69af16a7d199078611e851abf003b95c0ccfc6ec1ab24cb972e5c64aa1b8d2a39e7811623d0b20a5a402f2a1dcb8f7aaadade3aa6303c5191f1b0a7fe9c160d89546c3843e01c804cbfda4167d086ee980714b0041d137f4d4ccfdacfa2d4115e634a30f3808d5fcddb0b", "65ac5251005300", 0, 581013106, 1537743641, "4776a0f8a5f89f8593d037301b0b7490c3240a64ec3fd852c6450788511e4a09"], + ["dedb2f2e0287b0eb0a4eee8efa45f5a0e46156986ffc015db4c781fc93c048ffe852a4be2c0000000002536355e02a5155ea291e95fe590452a7cf08464c787979663d8f9113009a2da1cac696c435e8000000000952655263516a6aac51ffffffff01a9ceee03000000000165deaf341101e14d830500000000000000000000000056e6e8eb91d41de39694a8ac18440cf6c2490e96ff1a295ad5049759652d815aec1d2b2d8a811d569217646d4f1aabfae5da71cf79b42c57bc781f569d2b06f1a637c2a5789a510d18afae9a83bd5b484527c92129e9c699c401b8388c1b24ac00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffa4e81181e89bc09a57458cda7e87f8d095d56ef7868acd6533a4e37a662c85778d96bd0429df4614baf943849b16a3a83c206b35e03a07b1051c0fdb3721fb80d078b93521d044e54d04819cb59caebb6d55a080fb9a7c5ef412d83ea1d1e1c6c80d85442c47c5d4d38b5fc715b7910ce06bf737a1673d4d71d6bb49142cb9031c99a81cdf2be179365c94b9256a45ac78a8d2cb9e6bb1a3c0acce37dc77c0da0219eec297bd07f6ee7528455e89a6be7281acff4bbca703946665d02edc84444e0b013aab5c43912babfb79fe631af3b19be4254449a618b7cb2c28cfaf477325448d2875fb1bbd88569090c84687c68f95919ec5714112ca39a80be65ab937c25d0303a6123f8ccae38b226f4862ed2bd913378d2f6bbcdf0d6a2794ecefe3debad2031a0ff7637fdf594758d959d9a162280fdb9d9e3b2686335072e72dbf5644e4dc032bf409e361171e8b0999aebd440d254d130db92cf73a96f86e604c202a3f74be02149a66be3e3f3fc80ae8760c7d82d92209276c10108cb84c4022535057ddcc600313aba39fc30f5019aca2f12123a676697d74bba81f69dd2734cb21854bd13a82935c02d967087c2aabdeac0392f7809e1c2a5b71fa2bfe9b6b5c66ee23fa484b2aa890fc46ee81a6c4e0932882c3fcdf8b1f03a3f5744cfe95a1f30cb40823778b9bc90adff4b58c288cc2a0391a5c9070da7a4163962ee78d1a7da174edf38d4dff25252b13eab461fd0fe7068ce16782d3fb36e379559d1bbb859315ce47d32dc93c3dfb2d66a08321646509f47d153f9fb69f99d8b4d8328d0b4f4b4c11ae7995fc169ef7f48c47dce3691d353951ab775f8a1871d75f006b05f4b339c7c966f4a942ac086b87639efa47dda3fde56e149f85699793a9fc3cb9d4a352c03e795d361e705c96bdea706c1587d65dbc64a46c20ccc7778fb87c86d49845816df43d87c456fa246e92dd56076db5156fe92a35de05d766306d7befbec0051dc8077b583e6ae8724f76370c6deb7eefbee5f61153cef95a2f68cb1c08fe2f934da24a89a2b24ba373df44299d8f84aa24fe05397e8f62d5e47ecf081cbf8320181f7faf39628dbb9880b4a733404b72566df29bf05e5dda05b3e6deb8243b7a21ed8fa56c213ea087ea5f7d7eefb19a48121732c6679d4a93b2011ee552984b1bbecd7950038b4de9abfa727b2afc460cdffdd7001e9db7d9fbdeea820734a520fc006dd4ea2237681fa48e8684f2992f882975c99e0fddd765758a4b9033b606c3434f25229d3665f4f2783838b87f8ad386639212776877f1f4eb2bb2ac5c7750ec566c8df1270594392513a7d541dd2d3a1bee009746b9b8e9bd1456785327b54eeb524adc91a82e7ab08559c6f330faa514b4ef59a32a56b95313b8bae0efc1ab665194339573bc92fea3f4588d3c86285b87b035b2e4561d80d10cebeb55ee1148117bc59d2737fe0e6965b4367d60a9b37657a384edaff4d4c21e7ed5b1f4873e1f337e6f9aec1ca7a106169259920ba2241f80a0da72626169b5eba1ae5acee9ec3fa94a5b29a20910dc167d863c42fa99062cc91e6ffba2d403795e3f32a1a986dbeefb15f4a62e8abcf3980daf9a233f83e48f908ca07331a642a885750968bfcac163f563f7bfde7d8da191d2e415eb8cadc5f9bce37cf74a03d8e4539bb261b425c046fb380ed9193382feec13994f139a1712b1873a9283f96156019f7a429ac2d3faf287a4984adae3de7b16c5aac20a4a502dc1b78d498a7516c16fc121de592b7aad4e727bbb90382bb040d1cfbd9b87847e95fab4330f5ce5c5a8433d3b3e8d96d422dfead7eaf888d1d63c031cf0d01a426190d93338dfcc2a12ac3f84abde3cd4c282465db81893f7630996675391e49a0dd7ee84bdb1e6e8e7a4a499431eb8112439ec0ad27a4c9dff7d1f282d28ba504d0f3c2a50d68bdeec4009782aea76b7d202f5f707f2dc440b83e110aa52efc8103ecd8623bab209c0e351ea479e142a0fa433b195c3d3c09993238489aceb49c666e5a2bb5185245d1d07928dbf50c5966f36e40ba993c58ac78056788bc177fa252d73bdebdb470bb863099ee483e1ad4db116f1c247bb6d299c9beaaf01995cf046a0b90a7975497c06aa6329e85bcc6f92d7f8e52e2d1f346dba91f8c473d8dc13dcb8b613616ef83cb53823a2646d03f66217a0e316f29bea27e1cd75f6cf36cd152a6a70b11f9fc889a1819e83281952041668bc567237461fdd6888951b05c9b710f5c064b904cf9762c8e4697c1a285534f180a7a9733dffe6bdd5cc9696f5946d40f1d70b19b711a96775539349ba8ef87fe68e65dba7e77615232d744b8e5eac1df688129e88a616a142e194b50b881a1f926fe02b55e4d120d1b435a8c6cda8b986e06f614184a6914e6786ab158c9d7c65e10d", "656a5363656a", 0, -1752231560, 0, "2e5699af54d1b26f65097db842813688746b5d03d505e6a3dd07941b2e049c49"], + ["07f1ae01032c0c3f6de6ab455a1aea24f5423601d12b1f9094de826d1901d53eb9374aa834010000000153ffffffff4e72885e886806494bf3bbb95f298c6c99e769eeee0ca0a705b426b56c71887702000000066aac6aac53acffffffff092fa073c6a58e0d074fc6b2bf102bdd449f5ecc86e31a39cd86cd1e38af5c12020000000353ac63ffffffff04ad22a003000000000600ac65ac00527e332000000000000363acac82264c02000000000029fa6c000000000001630000000000", "53ac006363630063", 0, -1378141161, 0, "0327ac78fb98f99d7e139ea96ed62421e90c313704c341464699b6d058d1a3f8"], + ["030000807082c4030477356b53e0eeb0b9301e6df55ff3c649e912ad23627590978e184876ff48fab802000000056352630063fffffffff5ae1461857d4634b798da3f6249e83f7d5fb880eed06837ec451b50df067d130200000007656a00ac525365ffffffffef22b70e919eccfd70843ae9f6dcb4873f9379e964141a7ad85c7b746a5d45eb0100000006525152530000fffffffff5a39a2b1a11be9fc5080dfcf47f5f7ecfa6bd3ce8d86eec16c85e21f75ba4fc03000000010055b372e50237b3530400000000066a516563ac63ae735f000000000001630000000000000000010000000000000000dd52920300000000f1a045897219ac6e0dcd9c2db310ba6c438a67e708b45f5fcf8b5dadca4310eedac9a323388ca84bcdb7834c31381cab57dae63a7d9f3ade5f2191a93607f1b4607b73da8283aa1c74aa9677a2de19f96eb0849d799256ba2f7350a79e159a3b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016738b5500814c1e7cb4d6b95d51004ce8afa732579db4f2eaa0444477a89ca219c49b51ff748b6ee727996d67963d6b0cbd66bc67e260e27abce0cc10cd35b1471f75f19052b143b9bc1a26c39f5be3f38171e81dfaba5a17cf7dfad3365bfefffe0aaaa33e9cf5724c60734794aa1219c1ea81cdf3e4a43fbd8be7c9fc91f020cf4b9783f1dd09b951190bab3cbd3eb7e03ef1ecfae2f7e80c005c54586439e022fb1971f86d9b362daa4735dd9ae6dd63a364ddadd6e691e241233d9424a5b930b001396e5abb9ed81ee6818e3a34af371eacd82c28711d4ca0a88cf61749941bd7cea69c07059be4c1adfd7f03b549d00a7634578f695544ce962a6577b8a2ffd03278a892caafdeb59e62009a3807378b2517d00a0b52c320c32aa3d590762aac4021664692b3b4c825a40a2166ba3aed0f3cc64830dd14b87d8e6497a107859de6e0304fbe1810d4f7dd89b9fef87506c4ea13202041edb6e967635254ead9e24e1e903125bcc46346210ec93d25fae86c4f3f0a4bb45dd5594a3c7da675e2d6ab18ea80308f7acbdf3b96628409c4c3dc13d2eebc8cd35373e8fe5efc2e4f8c630a1990540d86f2f65b7c44f043c3f73c5978cd23f133124847fae62af7b174f9d31ce55b9e27d696757174a951ecba8b5585fa3327d1b09f906c807b0637f4286a22d0fdb80a23d8a99067411a1a0e686834dbbd95479f0aa2b62d011d7821c2ecfd121d8864e554da462715604ea94d02116ad279e381b0817b18e628d7fefbdb6f3ecfdf9d36e578ecaf8082f86ca971b5e5109ed067b2a24121e9f76a2da50735cc7a544521490a9fe994e71d3d257e78efe0eb170880d36ddd59c93309a5a973aee1835dea0238a7aa6e3819c0153e5333a4283a5b290a634074b19c5f05b112e5d9ccfa4e3c09d1fe2cbcb908c242b99f885c97369337182cc6c4fed71b8376ef740e82b9406111dc2f576de5832f16794a3a8cf27c41df33cddd1b8871e8e69c2909f330b33045b04803d7ecad3c579db46532604a5ac288a2f22f68372d59d5c9d556428a8ec0f2c0fda26e9059e9307b26f9e66cfc9958dca94374a411f46a03614d6aee0c1c746b649e141c3ba0334eb313ced580da85bdbf629555823482ad23a5f702e2ab46aae1951c500d83335081c720a42eb6e38f6b9934c37b9059ead6a266b4ffa7599c1052f915e541c54f33be938f53621585dc7b0b991bc5babfaae70c39fe9617300403918ab99bccb358cb8e6fda482429cf3cc0324a616460f60e3b693346d9290cf710d7fa773fa93b6d4018ff14689c6ae6f45806d2878d9b1bd028d957764fb3c91d7c3d68b8ded40aa2ff6d3a46c2603e6a7346c93b366f3ddbbf36b0d79a7975de20269d9f083f3d7901b20ee8344075770b501e415bc509fd4b5a2dc217e5ec5c09bca2f17c5735305873930505aed3de77d1ff8a9ddaa5e8b44351b592e5c8838fea5f236c53a26c1a8db0fe2e5ccc552fc0246ec89e83ec943c3ce27445cc786158fa9751b9c1e2a2de8ef9c35e0f29706428022c3165a6a65e5b258e8a2b67937adec7f041c3aaf1eab52d5796cdaaf08808e466591cadda862de7c7991ce6c343c25208157eab5937517fe565648feef446b946805a75d0006bfadf05ca9327138d9d433207e9870887b39238b0118f7b4da626e2a059d1d741cf61d7f78eec5896bee2d822b00a0422099af8cd1560075d48448290fd1a7fe90e805dbcde4500df7cdf78b7eddf72b0b99de1807b546cabd9e9ea618c66cc8dbe263f3eeabfdf06c31d94aabf402dfb4d20087d7eb8e3a35a201159be074a4f14c090b412afa76b4840e14a8435b37d233bc436682175d744128f57a24f1e0c48218e4f198af216499f0cbd5a4a0489b42c04980811b509788edb4f0458fb6ff9acabb49139cf1c85350902f1b1ebf4709654eb3e10b4ca42b3474695a7075ecc3a8aed6264fd821e3027b5c8e5e34cef38da05e745c011cbfde4bd28ecf8f73d4a9873e85c75919925ef483812d0d990c402bb7682e74d8f4c212a6930c9592d167b30835915205c2d632c99b1cf41383aa1fbce29e313eb0f7c1abb892555a8cf4c2943aa38f9d75c7f86c79728249ed6cf639949251421718584a2d9b02331a7931e3aa9b48e7b8b914a33a545b045973ff0396ba87558d71b1ee9c7408b9973c3061b16d454703a40143a4644e9cd8f2f0486a340b168ae8e6cca6229740e5783774d2b1a66ce4203f542ec5503446695324731bdcc1f6fdcd83e0fd4be3ed7bb42cd29164d94476af58c20ab54ee299ceb0690063f528866f765ecd6fa7fb0cd6c1c42cf29cd0884f229b0d9f624a1fb37b14b702f511c188ba8712fdad807985e7bd9446bbf7e4ab137a54de93e7ca798917dda16a22ade8815f572c14b6b97b672a3139157dab04", "acacacac63005165", 0, 2136313647, 1537743641, "bc6f9c9ba1eed3b141737e381b0c5baa4c77851e2ef355f8516d4453a7e7d153"], + ["c51b356604d74dee547a06bb9beb762e86b8ffc8da3252eeea8e8a8d390a40f3ef4febf1f70300000003536552ffffffff9995a4e35879677aff93afcea51e2eee1bb87f9c2c519b21bca33e01c55dac0f000000000463516353fffffffffa4e19d1ee03ac09d89aee110a10e2cea9de91e2dd99d82f85c301cd74090d9f010000000852ac656a51516a52c624f1ff8e3a766b9e2797007f56cd4137c8d9c469c1abbee23009c813605aadc64a0072020000000165ffffffff03da29e3050000000002656a10a1ad02000000000851655163520000acbdae1d010000000002ac5100000000010000000000000000fb71230200000000fd48cfc26d38e6162e4be816b449c2c37883bc928f6fa72cf7a6ca4bf36d2e3759d55a02079aaef8e22475fe7c97857f7dd134460fd2c6a9279bc5eb1e1e5c3313cebac0b80c9982ba15733a8e5a34f5bbe4738335eb6ec9d87b271d4d64e8d6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001303274fb29e3db23db2dcacab85761ae37f41b2c4dc3d39827f9eb5e15105c12cbce287fcb73030db807edd298c53ca1b95aa738286c394c10553e524becfe10a842c62477b0203e26e6ca7aa37b689e09995bc577f00507fd9a466651191e949ff4e3a0e44c94c95a22e9e55614d79e728886738f08a654fdd82f9f6c171a6032de51cb86e465f8b5d8f0bec4d11fcbd9d5f0159957d26a37242d1a39cacb7070318c01fa84cc5b3a4d448b845b05603972dc4eed1e0e8f352a299b21cf9ae21630b01c6f9267b6676b8e11d8aa915a9bf857b93f5bd2100260aa229931c9aa8743198b68aa2960c4e76492c4b243c8479f76dbe3aef8c9d869675da28ac6a4132e4031c1db16aa15447fe848b61c11b99e70dd3966d5ef6e82f80e7b16695caee4d4d0215584d2db149f27a27d425285add89214f2e510363423ca01f62565cab0aacf6021315bb0d680aa8781b245bac90cd0c41870058fed6d366f2d6eba65ce4e44a5b0214955c6d17a5d93bee6d2ea0b11b918401fc111389adad5ee645374d69fd596403054747598913f364a332c70a29c45ceb00823e8234d0134e87e45a99ed5b997081a849d2487d3a2b33a2db10ab18a67f731db53ab23e57784c691598a117eabb1b629aa71a0dfe9704be8ff8dfb5b58227559cd017f32bea61d23f6a30c6cf73b3f8528173355d78a2e64f0596475fa39c80a09e666569d97559912c5217dcb45e7f27c86b79672344e21712bc9fc29ab8fbb53d065cf6c8514101bf737e526e072d25a0ae8eb29d328ca1cbfbebc174a6dbbb446936817806f35fb471aec986b52b0bbbafc685ab97493e3fcf27bd218a44fdb9556ab5cd3c20cdbe54f0b17c6c1fd88d8c605cf4b81a6285e805f6ac9023d6d49e6c3ffb237961c7dbc6ca223c86c13fcbab15122bc17cd4b908f4a435e9aec5e2f75efd54ed0353fb809cbe7c2880158f71f64fb3a613e35f7d3ecb9f4c691d5e5acdff43b4cfe090996d717a9c35a07d7c487bc2c6baa54f144c30892f18f1dc59a19d646ba78d32b3331757f179f67610a7baf0a8f54aaf85525f30ade4e288d01a01a5f90b326baa36d2e0ee11d81749f313bdaac899730826424804f0b4a2c49d4144db5c8a2e69837dfe4151185ee6931c04d4e23b3b9841cda9180faf168e5feca0b3a12f1009fb77fd8b26f338cd3103156bc97b537e0c81db11f58d47b152a644d3889cf0e85f8dacb2ab3db0e5e39dc76f739610e57c1e932b4c269a75757144aca4aebd8a14b97b1b145486235e94c342ef1a851f307ec7ff82603f4f969cfb8f6882f366f00b84127db509ad3e759bbf301944be3d11e7b0d07aceacbef35f33cd1ec85bcbd4c153b18f42b1eaadd89b6e4792ebb6fc580c2a4297153d10e6edb62b803a4e21a40be570f247eb59da7a682738ea421f2f7ea3d86ef591de55c278797520fed67b7a3871e08f2328d974328fa2100766a8618048a9469d1df9df7ba5aaca4e198861e510a75b9f5147fbca76e45a738814a4070343606a47aedefd2a084177a7e41a4b9b8271e46a03ed5a99a8888b836c7e0bb7f1df64b77f834487aaf7560b64882e34b0cbc08a7eb526d8fe44d7e73bb528c81f86bdd2497e052a64f354539a5ef5063bd1d1372336adbfb73b36d749fc4e4bbc43c91ab6168fafd4090b04372501d58bc44020dcd2305dbb1326790913e6d9e0f777c87d54abbbead43204a13e727e4c8860c068ead1b4f9ca3ddc755136247377be70f750d3b796bf018b6334d430629c7b7964a47d5d4ebc14f34032cd7c034859f342d2d7258208f53bcd3eca3b040769afc22890e44a99571b61267ceef6739410404b5a1db0e5468418021c9bfa403abfdb788fc8cf4b6117f0fc48d30bfd2c45249e851f2b805da6c9c341ca9840d97d99b74afb8b26cd64faa72e4ca7ea6c785a5d15ec7d61a65b0e534ee3192e61d066ec79d07298eb581556fd5c48afa914f1576b6ff71a6ea5fc731734f8e4211140f25c4224ab33e5a9c675ededfe2ac7bc0a28d714bb0c2699e82c1ca641230200cf468f6ce10f7197a3f769f7a09c603e663bea5a122b2f719b0e3c12e7a074d54b1fc5a2e2147e8c33232070b2a981156021d71505e97ff8f81d17ad2198d60b4f6a2c675c6efcb2cd7919c53784de726ee9a9dd634d4cca6875434be945261f25c570f9f099480c66e11f7853c47d361c1e119d032a1b48c3a6283b7944f07620187cc73143cdd9c3eb19b230ef3027aba44de63fb296e947de78c6da41e83582e50ffa30413ec40506762db8b8af5ae5e22accae9fe25316d277a0024fe5cd9668219bd540fe4bcd50a9fef80146985f055dcfd386f18760f997b051089385316b9fd0393cefb3c48e6c4b05a3bbd75adca7e96798b5e59cda92c0c6c4a85017a235c2373329850a", "6a5253526a", 1, 1406760434, 1537743641, "08b7482328d19e8b3b611acc93a65c3b7efc44d567716fde62a3d4ef28df2a23"], + ["030000807082c403036d72cd419dcc33849bd33c687028ae902e5eed30d2efd2359be43524f25ad7880300000002536aa5fe2ad59f0d79c11b99563df666b0a515413a0c815b83cdce8a888a3c3b6f7b5e2a30d3010000000852526500655163acb993de579657ccd6dcaac5d02c6c34a3fcba1ac2802430b734a5cac8e61ffbaca616ea1e0100000009ac6553656a006a5200ffffffff016b1c6f0100000000056351006a520000000000000000030000000000000000e7011302000000007026ded4566d759b139ae5155753da12228f9de915aed625ea5b4f3d1e77f0d472a12028ee24bed8a9da9b191f784183f8b6310703d4dcf50da0c5e38e24efa161431dbaeaea8bf43ebf948949092edbe48a2d74ab280f1edda6a13fb89bd48d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006d66299de4e392c2398daaa7bfb24fb236b910c241f9cf9e0de0fdd8b3daac14ca151ab5cc86e2ba632b4e4361e9b2fc87df0ed106155c5aebc49adf7138aad4ee222826a7133129a0765e520c110528617710dbc466e64fe8426fc87649adc24cab9ea4fa093d580403f46ae8ff505cb0271fdc2e31ffa70826b9aaeefbc9bc020783c38b1761d03737cbef5f7c11f17a04bb997f5f8920f223aea696e6dd810c020a5da73533c955e5a0f1fb9e481af04647f82c58794f17a127ffd4e0167c73ac0b08d512b2d2e6300924e93ae589507ba826a1e7cd6549fd339834a5e9b4c31536e8bb428d74d81f66a1358a15a89984efe0371b60428cdbe5ade00eac94f3fbde03119c94fb9ec78393153200e446db83fb7ab7851a978fb77b9e2a19decf67d6b6032b0a7b5691ded208bf1533ab34edffd6b05269ea645a95bbd2766964d35e69350222c3216f4c43816368c008bdcca5b1a1704e09656c753c89375c9beb81931d170204dfe7424e21747a352c389a1787108fa5445b6f83939616586d7ddaed643ce00327317b79c57b25e19ca0e8ee2325b2c83ec7b33d3caef185f829138c85ce5222b4dfeeb793d3784a7a4d80ec2544cbd07248d28b341a86d73a83d01160efd7f3922703305870ff657bed9993a096feb61c93bf41b81f2820a936d0ef1fd578c54f12a6de5ddbae89fc1d4037da43469eb805719605e390f53c8b129555863bdeb7b0f28119a187a59b33d09779de3137249bacf83852ab47e47c4474c730062d68536f0f75810e854530a5f0efc4ae0ecaf4013b3972ef8f1441e63c3ad38671435690481000e70cf548491b26db62b94cfca070327b444dfa30672eafecad1e8341a211b4848718afa5f38705c8f48adcc744bca81c7c77b767b98ad9c4d09142cd06e28b582e96b651b281565d29f869cf6126403d8ccd599cd88b3d22eb2cfbee19e1b5e7dceb8524458c28794d0128cec1029477b89d28c40d02cf3e3d27dadbfc19043c49af17635bbd1a969006db9ccd43b7d23bbf53085c1a3cb725bf2b91b7f666c69b52e4903899b313ea0c5ff7b5ecb518fc66a1e3845b5122206135b08462cf83fcc5a3db516cb63934d012c18005b26eec04a9abbf5d5c2f2796ea444b797b9d651166968a67b39fe5bf7bea315e08a188bd3d14605d4de1d91f76f8b1144cd955afc2ba3bd0206aa88a56ed407cfb51ef758ac09702e580588abbe3c27e2484de690802d6579ccefde7ee480557f299721f68d4dcff0e4dc9741e8a589f80cc94a445fda86c0e1c4dfb1006fe869f7cbb1eefcd9d9bbbd9d49835a9b209373eedf285f79e9af8c2d2eae7f3fab85097f1e39bf316f3efdd64e14b69a43e0378e2c8cc862c223ecb71557c3931efc2f99ec9db9e2dabaacd176d1c670ab406dff4ae26351449efad3bdffec5ef998205deca4366efc684d806eef9a8bb95e9bd412ac562ada510cdbccb68f6ea8c1a0ea92c07bc98c1e46aec25a0289fcf02039f214406760ad67b35efb3549eef81cc1e87b1aa7586c84e67674bec6e39b3bc0e13fd78c1f94d359d896412996b6de6cdcf2c6414093a994b2a74cb15e0b572dd7a987d80473590ad4ff64e0b04b115ac19f57677a7aa266bf50a33144efab0bf902da2c990a5dc6c4dd9fee26cf85095ea1ab32b7a7064bf34ca4f4c8e0bc363674375504b169e32c996b18937a7825b488301a8398d532d28856755792ceeb87a27ea681433e18fa488d0e33da4e3e57aa67457172a75b71fb6955469c293c47ae9569d262324688b83c64272296c0fcc6481f333f8cf1a3ed646334f4efd9953dd60ba0ac91481fbffc8422d3fd871ed0d5cc15ace416d972a88f6681a950b8b9d14ca86d1373b34d015cedfbc160bf3b873a7185de7e91ac8020e354192def0c2cf42573a96e793e73a008b52172cee70da939d770c91e08430848e862e5910630d79504c87696ca3c3383a641acca935b2fbceb34646e45f515a0faa5a6296b51ef306254b66f5ef5c0edfa3cf6d8b599a9cdb02e1ec5882fba9ed06856e6ae66a446d12eea53795411068c990e3824234540582277c71b6b272bd4bfb332c792a31fd7944b5e942794f2a013141e27ac50652e635afdfe1e5ab189c8de227502dd7ce17ec72d0cb3918129609fad0a493c9c717d4e877fcd476a26f36b06b67c0015cf2da17afe128fb1e7700ed4cd1280f06b600b312f011821b68f0e78d9f94dda27ec7999a8cd2b0e07d5aac7c3a27bf0e37ae4f70f121a17664505412494bf9ef31759eb079b073f63d010000000000000000000000009b5c2347c0ec7ccd220e1ed4e54cc39f60e1afa792128050f8f2e568c04a19ba3466bb040939d4256309af215f24c920349e11218a351a73a923ffea4c51dab912d8c1a55b99f17fcea9ddd03bf731209a61642b0e581ffa244257543f69037c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009edc9dbe7fc1a79f1bce912c409e1e8be58106853661640e35d57814fcbfe2823a53d9edb45846347132d112295cf28a72c69847600532e951030b530cc022989212a067b5ea6e65527f24a53ee68bd22978d7159767dcff8d168bfa28aa917df3513d0219be6bd39111f6115ab384130f5089afd1e1a878011ca62950e7cb73031570ed90e46c136e32118e641738904fb21568ec723fd46ef7419cd84fbd13900221b3c563ee79f8aafe24ae106d799146348e952dabaec001feb057ad4bf5a07e0a090c46eea0d2048e0ea8234fb8321514129251d013a6627ea5185483352d69b6d4c663e3e8b687238e2b6cfe531cdb367059a17c1b99860c43d9a9381fbce4fa0300a87245fa7bb8b54250af86cdddb1ba5f568e1bd1131a9d23050936ab86fac9021c5abb45f1261fb15063195323aeb4392afe89e9dd5815440c37b8aef84f4af80215a24aeba388ccbc639d7eeebc32c20234740b864e56103408f99fe4be1a90940316d76ca566f7997481ae9b35ea61701f993d430c154e22207541773b99e02cdc03255bc488d99a2aec5252608b82458463d99d251238dead00d9e17f6e289b859e0540181f381be6c5883ec599fb94e7c9984a5ea9736ff2d333a8f3a809e957d645ce49e3b434954f940d6be390dbd81859576ac442740259d6a041f9d0b73981da5d2a6f42bcb6471f8ab32aa517680284c0bf78f908b5e99fa819a2398b336f9271d4cc3d894fdae2201e39df7c4c29d1e059f8f0b5f87fdfa82dcdf6eb2280d2c05762b2618b53973351ca7392171fd72226c02727d8ec917f4ea8dd3e9876fc031c17cee43956c8187adea293e38d3d6d6ce68fc7e9a681637bcab98f3b67729fb916b51d2aa0a6a6eb75e636dc1fef16c991398040bca2e57400cfb342f84242854a6a8d83d6eea0120384017363166be1e1a6133d413a4f3d94897a62b4b5685ba1bb740f274a67fe105f305e590bbc00ea1b4d129a4bf2a30a046eeab2091d173d06c7e3a0cc1540258076303281a84e07273473d57d4ec34a4173dd0f2b77accf5bd1d6c5655671f92110019a5e7e7c8ae8094d9199a330428ef51b38a4e0f0d027f2743278b981c0fc8f0b715c430e18f4a2946cf5bad24d0b1f88e1ca6fd1632bf0129fdca068da3943e4c62a4ee8853bf5ce78ba9a8b41dd2d93eca2982ab0620ffe81cd14ed7edd9ca3ef3054fd9f66517810941797ad01a7f7f7426f906367192e50deaecf7a23f45cf0e4d0b761b6bcf5eacac5363107acf21098de6a408c78a6843fb9df40a1b2c07f34e3d50c6e1f21c69a1639e9dd01de8e66414ecb325d5a9697c4b804bccac57005119af56d9194bfcc3f2509782f2e28ae600995c5c5778ea546dde354128942a2bbbb2bcf61f6eed54dcc497bac0bf20536a197b7aa85dde16c01e3d06f985e5e38e83d6df7f4207627b9923ca56920ca2a0d5bc2cf73a5b3bfd153e768ad7832d16599f223aa41f9ce4964819ec440db354ead2fb56b3a348bd8018104e9307bd1f918ba49fa174607890b77e73f1fa40d7c5d554b7dce2f33fa475f9afdd3a089030ef300b23f497ae3c14a8b57395e6701d175a9c9a5706042d2238a7b339ae872c36f05e366353870ca3fd6be8d8bd323fff022e5733a9ac31e68ea566e8cc538e970cb35f9267516dd33378bce225961b7c246bdc9cebe9d6448d0b07703a49736758c4f23e51ff2803be121e725e78e2f2a697e28c51d342f2478c07d9f202f038b44dae7d7ad4101de3abbaa043d76ff7d80be9a0cecaf32d159af6b4a502b726cb8d1e8e4e8fa1cb6fec04469b43571976c1576219965c73318d8701b0ee34b676e4781f519f95e7e6f74c99cb275bf71e117a480558e1292d2fabb61bc319d21f48b567c4ad459ada2fcf873330bbf676dc20fa867de351665a142c96e3764a53370f52c90b72dbac6608700fa6de7f2ba7588f9e0d440dcc0a554fd5111304d83206c6e34bd8a82d6a05a9e9f5d377726e4b27e5c188aa3083a15d232dfd8dd91f2fcf781b266fb49a19ccc159dc11e8f82255db05bedb61b49d2e1d9ba28e8eac098ebcac5d06fc736874fa12b8c2fffc97130007008990bc2ed375fcb324a6edb185d2c451111683cdccee05359f8c5301b5a7d799d6544fcb6d7c56800efa2dc265e2f3e613f751e3160d3e95460f25009a5f4cf922da577321fec28c82ead85b3a5a513701755afe09cf13bab69e62344192957b3e37a9627dcd392db2f239583d2628cf5d9ed8e528f9a565c7ef014aa66694c46e1b10856fb4399c541020000000000000000000000006cd87e21cccc806c9fa381f91c670b6908f8c2aa7305cede60b1e67e259cfa0a454c0e718a6df7947e04db92f4d03516c046995e0bff77e62a1afda312babdc5adfa5ea45ee100822493469eedf304d741901024859bdc9dd8c200a248ca811d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8ae013a5d9f82ed1712c01758081a0dd45d96facea69f3383df6d8c52052c60af6b0075618fb4a1545259a22f8cc14f6254ea93b4eeb3c0875c436028f77660fe68387f69ea784b385479e5130bdd3ecb2523689fa932ad0979c6b88b5107122f6be3d247b78daa207130f886a508ef4d6892ce33449195bc2420a56d8dbb7603271fe658d240ec866b577b999c2dedfaf0b8b8e44c319dcb41c80ea7f7767f58030814f00b88d849636f2471de94cc1653482ace1c954a3ff901f3e45a3614f6820a0316d9c86a0041ebffe74537b98147fe8838c26c1a81cfdb28067c4a88aec9b765acb18358a7e42d9ef553a4ba7570837d796401340551e673fd6e78c42c714f020dc36a8897cd3bb079cba73ef051e84e8c4ce77d304fb9ec230ed75c63a8530f03147dbd6e98f8466c0bc002cc16e76cd9fd250dfe0289d2d7cf4e4e599aea24a80317f926061a28f8869ba297af82413041d14c4abc09d0d3e0536d49a77ea2a8560229b642c73671e13ad964a5e76e6bab2c5f6d6e6ddc7c5b0b1c6c18180d766d8f0320a108ffc1f9a5cd5e54d9ccd2dacb6236e061e17efb7b92e0ece7a07e4166a579becdeb441dcd963c1f6b7ff7f0f28433f1bf41dd14b49d0f9fc79574cfbcddc4de2643003d5ae78d539181e7aa26ded699feae6427065ded0b522b3ecd2d4e5bc39118b4f98c6084d24c428024ea1355e9fd46df959ec654047fc59b01f2aa5161d88db07a0e17921b6227595a6636e797ed64b5052760365ae8453a03e24eec3aad38df548a3e3febd8118bbe7069ad60cac023cb46d174cdbaf91b527778c2633507b1bbf871cadf8e2403151c29562e7f1a51e9f11e62467e75259450accdb4bc2166e1916c48f115fe46485b56fafe93a8c80b8e80b4c376c604ef30ae4d1ce46f065d84de40b7087140d3604dfea7913ef8b5b49dc9ab276c2449d9323ce7a3dd2fd3cebb90eb76661b02bd0f2b44ba1a918325c0cef8f57166b0a18216da85bba0913bf85f754f3f8cf61229f257a2720ccc7ce89328202f36ef744683748e10001c949d4cc9164a65d5b6bcc727edf1ce96ccbbf390503a529d65b92cd463a7f50c85e652822af18ef7b6b107c12d08485e2dc1eca62b71a5c4d71e1a2f5c64ea0bd91161fa262d50d7327c6a88e7947c906b87833c67e77e8bd170469695ad5b74e977f9378423ac9b5a9507a8dd135de12b4568055dd829780f5caaab4dac6a8b2689e54d93f15097ea91dd631437d419ce9a77cf5a401877992dc06917550c30997640ea68577ec22dd74fa48685faf1002085ac21291064559427d20a650d0e45acfef3d59b68f2d80fc1ac6c082464422c780f586159104d5a6784a0356734629b61b8448d742b915952a694ea6c5cef1be05c73036a250a42967c9b8cb007e375df06e85022046c09eed28d3e8633f34dd3a402deaec9993bbe6556ebbf45bf1a30a2b1f61da6a4d2f6b823757c5c19d8b1d82dbcdff04e3203ed644f0eab6b604e87719394cbecaa8682d1e44eaee634f2f891fe6783044fa8d76132a624130ff076366bb7e7c956c2e43493a5d4db1730d736a1ce85b4e6cfea75844f3d6e759f492446a2315a3eeca2324cd97315ee3f60e33f1c35e9ad6e9a998602076b9dfef9ee996e43be8b71b10a004dc932e1543f1ce9e2c17141bf1f2d5dfcf845c0e62873691cd79be16cf29ac85b394595eb10a93f0bdeb6c7e88780e87037b2360f08c5f4ab1fc6764a545d9fd8f2ee0c2848e005f80664e61d9224828b131811557db7527eba0a59455e3281af5c299dbd758ae4b78c1fd0d766fb1ba595f775f700c3389cb40cf142c3ccf500362caf5251e4342b9641429312e3b687532e77911ffeb185a12caa76c94a73c8fac4421ccee71820f61e99ff3ddb1028f05a99310417eb8d88be2d642da7deac5f9b1384eae2117b5a5cfe4722bdb7b5eee30cd5a18c1344665889df56e583d141b064d577cee88dba617fc05ea96f56abf9ec5c53d1c215235440a9aba664d07dba298e948c2c5f21f0a597bcdc76bf8cd2c2568995f787d87551055bd6fc9c82aa364159276196b5bd9673ebbbcdf64daabff0aa19dd7f5f8873f5c51aa9b5b5293c72d0be8dd84b0cad3277e0546f4695cd6991652fbf8030d1eb31b5df79ac9004cc89f42b837977bca2220f0b7666b28a881db90ae33738b04e6480968968852c40688bdca4f1f4be98aaa2b89d6cad9476ef01402614560d8234ca3edef0663b0583e76bfdde7e31ed75391390fa4389c2e202639db17a46df94a4369ee3a76209c1075a865422fc88a8eeb4a5dec5ae7319ed2eb6b581f5fb0a951148ac165d400c0affd29692cee1c6cd8a1d456a5a901841da0bbda070ef25e799d7448790f2fcf45e995c95896089173d1bc94d675871152bae027d7c1907", "536a52520065ac6351", 2, 334827800, 0, "958a6d651c87c224e86b0778ae29e80c4a65d161d17af38bd9f1ecd8a7ce9c2c"], + ["030000807082c40302292d18a5256ec9feada5b9da8e4606b2b995546c4cc7b80bb39dff2c249373d1000000000465006a51ffffffff84aaa061e777a5da56ec39e7dca6716b4b48ad1a703f5c21f83ec7cb857ea0e60000000009006a6a5153ac5363537c768db8041d59fe010000000001513c83ee03000000000077681405000000000763ac6a5152656384155704000000000163dea2f722d0ed924402e3faf40100000000000000000000000022c38dd18d435b20c4a0da89f913519e19b3a3de1712244a46a8da94b7d6488e9d25fd2d1476fd8bd1eba6da1915a8e66080e0338d330a6d6043adc94f63b05138ec6cf00b71b70aff240116aebba48ed590676207757de852081a14311ca06d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019f47c0eff313285b96921805654d8c02a77ce3855198f343cc6e4e86b4132fb567553379af554c59b7bce9f8375802f2cdccd7dcc23419ffc9b2317fd246d503987b612cdddccb87246f377525cb5434be147ca45da816dba1936232adc78c136f8f235413c570df10aed8873ea5955e166d381d91aea35324ff5ccfa265f9e0305fdf22a5e18d71151207a1978c991337d024ee0adde25a88013aa747f6fc6ec0321895b5ea10873ae8476c28ffecf98f4f1d07438638828eb84cf2ea91cb0d31e0b0296bc3d4b6c42046675ca8e730ddc0df061267e05c8502342e4eacb4be1399c9a50b0e739980676657bc6326a5e9124fe191ee31d0643a7f9b131c8e8a303e602001eb49cd50d0f35059016610e3cd57e5df83e694a6e21eed8ba9c2cd8c543b10323426e52955aa0b5bab361b1f6381f9d03c725e743f2e8fdca1b4e5101d82307032117c41451069aca31b4a3ec0cc09cfc5110247ebd87ee078b87b38f0602a70c0216f9ad4c9b6879cb5621ebb63ededf26c6e5e1c178c97eed82271f40ecfc6f52030fa135338a13a693483117fd25ad0dc44e973a9bd03841de474426d3e60d7d73492b74db48c69d73172d9f7a7f5efdfa96bbdafa9f32ca0fad20f254a0def141222722eec132abe504dfbc7eefbf8036fa9238d22acb8aeed3127518ca469c9807d9c211b29420f8f262d0542bdb5e5fd2f7cde94e42c7eb5841d66020305dc3668f81e75ce6b3cd4728f5742f2bb85e3ec45cc162e748faeafedd778af0fe086b936548b5811aade2f030ce733d0067d41a1831712532e72b294c8dd04e44082cd34d474e4e6c79886d161e138ee4d5d18d37eac95e81b01456ca94e622a2b3deafabd4167d8d6dd7b99f7dc3988b550a8e676f5dda3a73dea95f2c484f10221daabb2e9488919cd862d6caa33efeac792470241e81c8287a8c285ea53848abd54cc4bc940d71a4cba70f369a525ce776c9e88af8011519ab64341d7e621bd2bcfc9a9fdad8e6f1a3859c47adcfd0ef96937ce81bce78a1bfa3c2df11f4583ed7b1b13308266c288afa66f64bf9539f96d06aedb5445da55cd9e4db48baad278a04e0a95327f7f6243454c23f3b9b1029bd792a384a3552edcb5a54f76b7f4578070bfb4b68b8b907a4c36d0a218ee4d84809314415162488aed623039d83f0537abfb63fa9dfec075fe5db1e37c8814fbe65fd9030b11c18bcf04462c079dd57be5f358444a1d71162f6b1bca495ff5b97a60f9fc723d6db633e4bce2bafdad9b9e14e3c9314a312fb646d34e90081b549002bcdde8602469c7bcabf01e226f5e9b159630bbd939d9f957c355216d39e0d8b736da275293a0a5ee7522446a54855f8810842d173c6033d47db5951122bdea18dfcb6f51008e97b5e965f14fa3db317addd5b020f116ff8ecf72c5fc2880ead9e9288334eaf2aaa6992654e010fd45020d621b260e00d8623a29e82afca0d0d176723479c7697160843e5da3bbe754453d5dc7b7b24e43ae0a5c967bfe7c648a0b245ba86b0f38f742a8c562f9f69438fdc9a57e94a12e4dad969c2553d54ad37e5c2e491614652c692bf778f869ad553a8483bbc5b12904d6206018e9637b88298889f272f9428e2b539550606569b7b61abd3d7dc495f27f68af88a8d013fd262253c50b89ceadd8f36bb539e6f101f763cdbb3df4f571657404da9959bc49817189ffdcfeac3379024c0e703e6fdaa7643431eebe187041216008fec4ebfa2e9715a8de68088553b8cc8ad6c63f13817f9119ea55bff0248721e757d5b807b883ec33a75c460d90634c4bea97d62410237545522b322770f77388db66f9e83c109ce582467aa7d2d04bf892e8163e4a383345ff929239fdd2d6d9625ac6fda9c33eca6d5ca9b0744565a1947f460098757679fa14279834720f6b2b3eb81531d1d4c9469072f956af83f59ec091b3bbf10aba62f0acb20c50b9c7dd34843c2697024113a7a6f815510ef6ec5ff7ae65d94f957b1006679c31d9fad64ba58ac2e589689f6cd9a9da462b2e2313e643f688f8feedff5df86d3fcaeb8046b82fad4541e08d0b6eea550a12301ef7d27ef53cc2d0cf237856679908787bc6bc47eff13f57fb75afe5d7164397a01d94135f7c4f458519f80914aaa577fd663b06011dbd5ca984573831b94966971b1efda69d6f50c4171e8b2d8803ef4f7f9a488b90cc764d6b4e394904fba9d79f0d91d6de941c5482471ed834d65731550f337229e2370926112a30323772ba5c3ad5684427a86950542a5ecf0887e0eb6daf16b00000000000000000000000000481ae0db7492c5c42ecdcfeda9118f240d14e8f369252889ac6309e88c21b66c9368cd8941105378c34d4e111dcbf9af792702f1168bf265120eab43ae9418ef7523b257d94a10b2f54e4897a2d0793a5711eece3e49aa3c3d7e410065bcbd7300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f751d9663ff246d10ab7c21d7fb746a12938521af76a5b809c2b0f942e62aa173497f8a8e5b07494fc8b5d12da3397030774d0990e0eb1c239efe782dfdf5c127dfc5510a1dcdcf476b1a1152794abfc0b7ec93803133d50e7b53621c3656d6afea54937ea35add341a96b30a86e82ecfcd0db833b22364c38b10cd8cddc8c2b0207862db43282b3cd82e575e59f70295d59037d6be2c019302a078f0b7de4bf1e0320c18275e206859c2c62322546d62000d6106b0eccf27982455a0a25ac7589240b02f23f136dcceffa400aa5d234555c64b927a1750e1aa7591128376bbab0d0020ec427928a9133b17dc16f12c5ddbb02a69397a80fa3687f9c6ed6523f6bcbb502037fca9a330ad41e13400738e046f5d75a4315266cdc574714489734c52c82050219bc4eb516fad79ddea45fe4e06911687882b2dd557ab8d794f204660d59fc15020e45b6c5638eee9673bb17b5acd9388264e2f3c7b68603eb88054197e8cfa357032c61bb5521bd961af02b0809019b5120f21169dab152958367429b283a198920030b12d0d81004f29a2eb5ee12f7dbd44c7e7c16545c50c495bfaa4cc852fdc2c64bbbc366b6f8b6c2adf54a380ad80e700907a6af7600d837cf13a3507367bdbb893d6633fd971ac5ccb2f917619c6aee7011c6df0fffb814b80cdb3ea883a3d5f0bedfe7d90514fe81c14d97f361734f5e3727c277914b4fed5f85e5cd5f998e535517fa577e203322d490c3ea0da05be84953c315042232619c7b56961dea51bd7933792989ae4ad04ed9b6a6f4307fbc5f3bba78e0d668b3036224774860d32032ef23dba36ca91ac48106aee8c5069c5e12611b1376e9539d2077340be1cc9a01f22c896e623410135125cb28db0590b99fe0530b54b9d0440da1d035687cded65bc35b7e7e2e60cfda16f278a5b265937521fb8766d38f2b037aa154e67fbd3cd178a83a4874333bd597293c639b4a3fa6262d7588ec02ea49e9b7b7a979bff7d291f4d6e013adbd160d8896e741c4b25d5e6b1987c5fa264788d5f3355673dd8e0642e181f781660bdb7ed31d726242f3f2b220c85cfbaff1d52b5ac8781fec3d4d8bd277c0d85219c0e64925efc4901575eb8ab6757395355aa5e3b160d61e6911448938a13baa6821b9946bbfbab98228f0d2f5e4e8404267b11dc7b7bc1359e8174f8f7191eb40d7b42824136b1166c6e5ebe9e3f581557c98bd79793dd7edaf13d24dfe96a49423186f5de24aa1a5a9a30af4360ba835480649db6c1540fbf33a30407f019fa16fc3e94d4c479c65e03f658c68d0fc0d0ef02452ed6d701f7913129b73052dd8185044cc6d535fe68d9f7cf30a3683eca6b87cd9fdaa0502f94994bff830bdf0bba2c8ec4c80f0a0ff9b8cf4b928a53f3e199010d0859b35967ab35cec22cee737a6e72669615a30a10cabf6093f4d775e968737851a3944fd9ea4899e293827dcfe46fb4cab3639bb4b9f463d5fddf514c1e55affd0a1ab9b973b3eb6f80bc6ad7c3b4e7b235dd90ea1eec7f9cddd554991c47aedd1ef03a7508100457c1fd9c128c0cb3fc48028451576f3f68d5d948d495433adecd3f40535171e31048e1c4258ddca5de24a6438e75e5fadb647eca82c3a7e21e9172b6ff4e2cb61065dadeded63e52474cc7a5b09e2edc125d3ed6addbe88ef867b30a96b829a16fe3ba4a2549b021a72b6cd3e2602268452a512ffe33f3e1fd2fd06b96f8ae7493ad8e5642c82e6c15a3f88bcb1975decb4802b0eae51dd721fb6b100f745530c59f76824c9c934a89c467febd5288d9b10791e6605d26aea7ad75611481b7a85d6204a59661ac595a55554ec81896a14c5c85ddc70664dad4c90f2c84a561998ff705c7112c09d947311671d8bee53ad2b739fb922beec6a462f35537602cc0cd629f929bb72492bfba8c5a8cc4fd2bfff2203a28e0e26a353821007ab4e11750a313cb6cdcfc2a9684f2971293596eedb3a95796d84f24027c574cda0f24baff36efa4d660367e6b73884a4fe096475a58e3e395a216866fc1de78c1471bc8396cd6cdd28185027257e5667dc6ba548fb5929234e15483b2a5879e9b0f1b096c7df6cc52528e48a21e56ff95d2b92f064f99e3fb84746c8be946179fc2c3f69d1009583a034dc5fa00927e2399f8a5f1ddb1ae5625955f6c301a65fd96421b9a22b15239b88aaa042cd429d59d0dd9ae303b37905fe289aafb594d82e280dc75a0a1fae87b4f0b72bea886abd731beb8c8471e5ee0b724007e47a791acfb52fde68fdbbfeefddd92dd1a2f83fc1282cb37e7b99a16edbf0150ed4f2eb11b9e09ee726b63727122e249ba9603968ac75c033be47e0701429fa50608bf64048a91b6ac51784f9f7b97d4d00923f8ac615f289045e3e1a306cb334ca0a4b13a393b442158475936411b902", "6365", 1, -1149566874, 1537743641, "94924909196c859dae46880f3bef7018eb0e5fbc0cca77480c59b5f2117c175d"], + ["030000807082c403031b2d327258f6da4150af7f1baefd885fb00af3617c571cf26488ef8e6b6561770200000004536a6353d3c40f5f420e3934eb5a1b075192d46872af1aeab9ba0ef807f9b0df92aea4275d92dcf80100000004006500634c24fcec55ffe9e39567107370e4c4a59f054008d7f60579ee0c85144fadcb67ab3e888e000000000151ffffffff026da7c300000000000600655100ac527d32a605000000000000000000a4397a2102c01d7802000000000000000000000000d24b083077ba82f28e5cadbd61ca482dce65453e491710cde655fd28ef6bcb44ecdceb409b4d0f068a4cf1f79351b2a5be31264678445467090338ff86f2e8072095eb6c6354f1196f8b2c296c2f45a5f8de9194989cbb09827d16098a9c269500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000957a82320353feca0b41c003d1b7319e586552f69c19323734387ff9c4ae02098e86e86773f6063062f7c12bea170d6ac761cebc4964a1e76abecf62ac266c3fc55485468e9e5c965652a95f895e19c289ea02055184d2bb3e18fbacd51e1be2c89a0d43efd788c1923272a24ed226e8fd26c58f42df734b62eca8f936a501c803135d26386cd12f5f1447f8addb7759b4dde3fb8dd0a2280845818bc96b2f25a1020aea8d0c29bc6196b26ace8288ad222e7d1df9e948072ef3c191394b6629538c0a0431a08d555e5ed3f8b7ff0613d4ad5f90d1794e8d39e50548357f47d2e0e38420552e25d5a1a570ef86737194690feaa56dfd1824013badba9d382f19f44544022aa522b022d9c5534f9e8e72241c6b2911de39389c9b90656ffb2ad8137c916d0313ecc7bad606cde83e7b3f26275b4a2a8dd5159cf5b9325eeaaba0d9d3e7108d021a82a0ee063ca1a85e10d929f537c539c4d4c45a6457510f214ea96676f925010218c3f94a61875441211aaa171c0564fa4e03f8444d1b4b106ff9c0d2350ba660032951970775be34e40025ec78bc4c08319f600ad33e1806fa1a14d3b8c1fbd8a15d3fdfadd3e04f640d7fe2333e62032c46b4d51244ae3b1abb8a10a52cf6a028cca30b2f6ad9670910e424556396e319ecb7714b09b8e073b37df5df3d399fd74d81a20f19923d9b9b597bd232cd8ef81f048558ef59774ceddf6c4f8ea051a9eb27507909a1e094f217072ea72cac4cc7bcdf1b3951e6acbadbf7031aa7aee7109064a6dd70221c9392e2c1f6b611357dda51a263329fc697e098cac238533495d36716aa3f29a50fd6e33ea973c48867740fcda5fceb2ebd770470cf248215736f60f56b7d04160660e8dadb3e4eb067602f23a816c6bac1da9ac814a4215e4c94b31556c568149c464d9ccd1510305fd83eee040890afbdc93b41c0a6a1a3c5c531ad3656f98ab4350d8192a4e31dcf9a5466a7357c6bd19f54276f9447c10664bcfa9620d32ec609adf34214b677ef5d43b426271308b82aa2a056a7eda47d0c9289f857da267059a87942045330e3bf5ee7416e2a813d3e7b09d6bc80ec113a1f899ecede36c515d623590d4d4728115523749ca645228f857c54a0bff030dbb45c367c7a95a439d76800bb2ac1558aee33fc5839af0c7203df7a0bee2cadd272aecad1cd1f14105c40ea85ccddf8ce29b6967e28ab8d5fc94cea464096d5de4936f79b737a43a08d2bced0df4885c7bb83dfb7dce21482eb78d57216e1dedbbffadad2ee24892c10a49627ecbd30426feee2cebbdd558fe92bf911908dab2d21aa610d80dfd978c35b17b4145d69e61a4ca5652c3b22a032b511df3de0fbb6031257f13165a566ba1340bc6787846e3db6f1399ac953305a052a7029e881f27c36045930ea0aca40335f4ee26884d83ba438858507ff492e346b30794f997cfc07aacc56eca6d7a29c8dead2bd47bc372575ef2d566416dca8a93e7ef9ff46d4d34ab232a0979c9b4a811e131bb59674f56362b70b88c50823ea795172f8c8733b99e50824b058025b52b449bfcf46c2230077bb1de16e7ae43f6d06374489d085b3d66aebf2c4733ca66736c6265d05213b52894e2b632dca1b36c2d38ef3c28a6ca22bfdabc37cfe872f70719042d407ef7a813fccdf5b03d84704ae629eea4e2912916cd33ec773c35e6822494ff96daa0e5a8ebaf605adc3b8d2228b94764b387d2e1ce62cdebcb9580b56ff1284c9d0adac7c1ab40f2394ab68e62a3e409575d0dbe0cfe937031ebb5671cc3ee6a1c29e3d12830364b0c1a72c6dffe1c3beda736b6c7d019febd46a305825af876e931fc080b4f9086b361d2a04d8db75d2c5cceff150c4d7679a5c2063590124412a57fcd7d9d90fc51824bc3f1c19e24854cceb9f060b464400bc6b4d34f792ba22cbbc3a8ec8de3c82d4034bafa56093275df986964a2265df77b8f6fecf70728ee43921cb4d24fed6e9efe0bc693340df6fd42aafd35118d87d34c04a3ae8dc39015e538d109ac141a4957e631ea189e3c216e47e07df1a489fda647b1395625a2801414a6a91764857ee9fcd00d6ae0ce0f1419e5d81e0bbc3650c9617acef603737cbc83f80fa3fe1425ef84384ef211f4f2e60f77dcba08d80da30b5c0e995343901359448bb52c78e22a82729b0e96044f20642fbabcaa4f9b7ca11f84e397174801089fc9ea4182361faef141dc52fa9cb869fc48d4dca937ef00ff7463a3a85c20701d4d00084590d8e788f5f5b7997153b658e6c28f08529043d197f6404000000000000000000000000e2c0357475ab912e419f10bf8aaf778d9b28deb2f01254a50dca111b60a8da7b50be672124cad0a4692696f941485923167ca3a1842919f602319bedab0b43e7b036f93c3135d554561e88b137d7925675b513bd523ff8027cb1ca56a28bac4c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083a5a3d36bc68c260a82b05aa68f67b483d06ca1fc973a80ccc5eb82f98fb3617d781b796736d1840c22d8ecf7bb6864cb374e4e815215ac33793653cd0ffb809c80648ec5becfabe2442f47b7cd6b9444f19e4f2f67e8019c06b2b873ac9357f1d4f1bc012657f6f9db505551c332f6f6f65d2726c080eb0f6859810fa5a52203177feadd4d84fcfce75062b6f470c362027323acf427eaeed52706c71e2541b3022209f05b0c81e5ab3aa4dfa748175092fff8726378829b03c1e66518c29e9c060b05f282f29f666918856f760edd5ca2e58460f1037cb5a6c05c94eca899f3de96f4ab99feae684ee01285933173cf0abf314cd8a8431bfae8dff9ee492b6011940203dc0a3a1c82dc8a2b6d6b3d39263e19bca3291086daddf41a0057a32bb451400208265b0d36a559ac9597e5cb2d9ef04f01677271916dc7c06944fb28bbae1ed4032db4c225ae360517e630ae7e2949d7e7bfa3776fd4740d0f18bbebed6ef7084b0303e655e15ffb457fc85239df78dcaff785116b96df7c3febd66edd7eee25a5100307cf485927351f883e8db0bc01f8ef06b78191b25bcf189d3cd97ef5b1615ece1db10d247f94d9e81e39ec2930c96ace0c3797a42655c3cc3105477103ad3e899533a51eb3a39c2533532a05149eda5831b41df901d12a9c897c643295cf5725bd21557bb5924fcf4b6c2b9e75be520a45abe0d799525bc292bf851c52442e24220ccaf79d537a02fc24c9037021c49fd4d755b78130160568ebdbd39e7a4bf76266ccf672eb66944046faae28f0ec38563adbb051c1da31c5b767fd929e6cb14c79b9f1f95120b305c174b65004e31efcaef8ea77bf732fe4b55b842cd757def10332c070a7b04e450318daf0e4cffab404108b491a0439f0faf57cbb96d533922318af32937c7963b4b76205de73b0587c3aadf5738af3b805ee028be9fce13640399a4654863d4b2860ed72cd65807d16cf54761406fe90d83e4556e69cf269b2b537703b7e859c811fd8e4f5d04dcf49762abe4fa03d57ed32ded02f31b2f6eeb0657c6496bc7666a106259046e9ecf5b84773875c546d67289e38b4d22ce51b6249c9c4406d33d99a802bbfd046c0dde50f8cb8e9e75de8e1da2327100dfaffb8337a34361470d822743aa669475aa4ed239b668e492aad3c81df3061287ab411f17e681cbc7935441615cc519576bafc663e1dc35812de1e706c0ad1dc508c3968fd1881e455cd5c16a04cb6dd9ec287087d2bd6a3a8457a7df6b2624a083d731f6e6a7def809aac9a2d5b46f959891a4216544ef9d83e161a2f19dd88f1c02346d15d02b880bc22bb9ab33ef2d1d2e9528831c9804ac21b0942f26331449f90f5f5f1f18ab52494f4d702d02452e1e2ca36b235cf76f7211a7de9112a830f3ca4853385271ec1d9da86f2faa4094f090ee5e413c0ba5742226563410c3b92b5d50e4d9686b853d55f527cacfe00dfa4ea0d0a49f05408a25f3f75cabe0fc4d14074d070735d4a38196f176e36d7e2d46dcbe608a73df7778140b3ca11f55a059b59b4e3cab7fb1dc252852f6862323184bca819da7a0ed1e8748e04585a2841dfa6f7ff23a0bc39e3177e4ff5fa13438b1b03b31543272255c7ed3575c9d30025e4a4ce2c18c1409cbb4731e413a780e077ca7f048ea614c0521803e8547b7f1c65b406f6e5ca8c950a22a0a2dde5b90f0203fe1c2ec6837362808fdd7a846e068a88af4db255132e8c6f78e695c9ed21a6d47f70b7af9590b78264eb27b78aab5b49f3d71a5ab8a23889bcc9cecf0db9f1a3319f5ace55c6965d7c787642c11b71ae7cb7f05a6c5f5aef5d85800fabc68ecb4ae70d3f5546c29d52e0c7ed11eb308032ccf79577e9430574021521502bc52ea05df2f81eeaf761af7a53486f4225eb2fb58b576a4633845c9f9982615b005ab7686c1ff4f37d8e025277cfdc4887675d67a9fd408b2144ea1cc1c79c5c79e10ef559410b8c5ccaa74f4d269c393ca594333b23e901fbcf0d413e61edaece7188eadc0a8aaee20ad2eeceb270a484f760ec7956f1ce683d606bf85d8c15541c13c9545613f61c2f3c31df87d8200847163bbbaccc9cf23cb08bf459f48b2c3c282561b97f951fe315618f921022687ae181d38b044cd15999956bfa7b6f67732e9440cbf801e429a164f59d7be3ad882ce796ecd9bfda5707ec0b7223e74bfe9d0ecf534367e4ecdb9aa395fca1456b36bfdb861e689f474ad977b677fb56cdbd61c04eb84bc2c4513d07383ce178c7e70999c797d26f0780cb88add7e37cd0aaa453ca2464cbad62f13e11545e3c1c0b44d8fd495238b5ec0760f8f7e5f50dfdb01c3661743603ff712507668f57561cf45ea2a9d9128f2720f95c946f3fe8391926fe567a02a61128d825bdfb58536fce6904ef1d1cac3a3a710a", "51636a", 2, -208292302, 0, "ad6c2d33fb201b23ec2cee4ea7907f26b8ed816355be13d63a82f32ad224f519"], + ["78bbde1e01e0602cbbcd346b1fa4144e1f09e4e766041bd4d8ad47ee2c65f8aec54f608a5901000000096aac65005352655363c879593101ec224f04000000000653ac0052535200000000023308e10300000000000000000000000000a19a0eefd6a273bc14f87d1ff6bf94909253001d0476108bb8b1b6c09003d2c8a607f7f688898e15e47630a597d2a8cb492eb6d73e924a65aeb215a926761cfb72b72fc61ca2d0cf97b6efda33e51281f4950fffe26a4a4c8ddcfa87471472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f83bc9e9c220a5f04880292534bdf748b3468dcfd3263b9d3cecb79838682fe736daedfb76c5ecc4c31c816562c70d4ab4ad0d1ea8f8d0bf838dcdbd11b6efbba93e105adb1ccf42004e659fdfa88fb4951b6439e6fbaec3c70f2339b2881f2ab971b681bb21b750faead63e5651d701bd7848ed34015f3ce379c9b0b156184031b76b931879fccc3ab1bc905c856f84a06495e07aff5c70b962d74365983caf4021a3b624543bc802c0e61f98c9573654ab9e2be05bc661797e76d283723870c3c0b02eb399ac958190b82889e40a6663becabe8086a59c1b7826c13f47b9df0fb276669a18479fbb610966e49a731bcebd7fe9cefcf98dd180ae794cad7a1e4cf3403234bb2879d1df3f28ac1663a654ac4699347a423626c52a10edd319c164effe20209ea7869307fca39358500bc86af66ee175d9ca805ef794ca28565be445fd8da022892b2bc16fab9b67b48acf76bf80c6a23b1c4c62e67b7f12c7e42c8700b110c020bf6ed3812ce9cdf3fcc5e1700c1880aacce0bc79cb879cb50b4d347d41091d8022630c8d3dbce9f5e9fc9bae1c3126d13876580f86a52a414858b30a564d63872faf49e19815306d7e6f56bb2eb5805ef8fd445320a95ec04664cc635a11099d3206c3c53bc321ae4a5ddfd0270d10036257fac1fcaa694542bc427d5291c10b99d21f0b74749e1ea381eac75f3629bee23724d81fb119727ae693964645a0b96856f45f3db9111095157d2abedf3276f251604c0a55a638479177f1f9d765ed6e86e35d9bc30f27ebdafe79bc43d579f01fd5b97ecfb1aea77b5563afe669011762bacc30a4189d68ef7af062b217c23e29c0a8c435b82e46c0f7d40ebcb469028999473ff6550cd66611cb088f1ba50bbdafd358a6315ca2047908802e754aeb95040b8ac5d0ca0bc5528e9d7e676ed543277d0905568ae2698ec52218581e0c968e76c55ff79ee08e808384c3087488848637ad7ba6790d60682c9e9ca23938e02b0d5fa5105ed6bb5df771ad3986e59630118bd2e39c83ff25151559e92ba6e806662123660590b7ebcc15ab835d19317a941ad346658e5f267f95a34e6c80eb4253b5de559b19fe02d8da79d62d01f02e17dc24e1bc119dedffb6c05bec3e1bda638ff9ebb2049a0a481fbfdda16b9ba9db35fb95fdfe58fd2154f69dd32b8684badc9fda47e8621d27cf6a1bbc27f5c8482175704ceda917a231955b9391a21b27f598f6929bcb6d9d3c622b62d8b34e9b0a52274aabb661b5fcc1b38047d2d95ad3d9651bd1e13866b8ee454fc28ce77991411937e6e6f08c7cefdd289850e0a2a8966a031ba87ea856740583f3a3816632a35488565ddc1038dbe4067ea8ca1ba1c707c71535fb22e03d58f94d26e9cdae31d3697b49c9e58e1f96912bf800ffe4f1e66fc3f7b4cfba504a11f842719c67e69160f60cd9558dd2abc8c2f9901b77397c54792cfccc0b6e3a59cfd0b4f7af045179651683231b3b6f162f2d16ff09ffcf2f8df195f16db4d3f85ee2c19b906e799dcab8a1bb7692cc50c9102bbaf3bae8ea26c90031c6c0a4f1e33618783043d5990be7de012db02a635dee33e6680decb5d96b46576e58d96a5d7a60e09e3cf819004074d252f298be8c0a0791b9a3d87878eaa7db5fa8407b1b4d6b97d229fd0ab9b3366425d8b918259cbba49d61ebabd439066998a7bb1513b75d090cde0d6a308fc824f4b0a92281022cdc426dbf6081c5828f7bf7ced6c70162589bac4f7a22d7c8a48ae67a81a8efa9e79fc156c15bab6cf5dff2194eef693cfda2a6dd8fe5ea3cab588d2e6be83bfda28403189a9ff3e01b2083ce5bec2fa2c451cfaf9580dd963c40307ce96ad1c0551d5aada1637cc11f30ead5dd8ffd4606ad209ce8479520d18d2327f932f400b9b441fa34c1efe13be0dc60914a9c090144752f3e9b7b04aeca6db1fdbe16f06791097c46c4601995c417be2f74b4cf830684ed59ba76f0d3dcfc86ad15778fa1a40c4c4a259ea2d9832b9d254aec07422fd302b9e17443a90d58312d2683d96f8d9c529b8f814e17e7ac9bf7322667c86bc06fc678dc316c91978bc1e5c12512655e00f585e1d33984290bc88f8fc92ed6a3a83455f160755a9a2b61f0a62830f72f4803c95a6794157370b46e429665505b6b1e5a3e60d8e55e59f113f07dad5d379f72445dfc0dde7084a9f293549b2a2035fdbb7b83c585bcff58803a0a09b248941c12e451cd18171221024fc092e240beaf9327fad5a17a2f1bc180979e036a360b016117114265aecc67c40000000000000000034a8b805000000002df3c151085d72f1d0f3334b72a205c537e9de15272ed078d0e8f44f5db0b3f95adbe83c5942dae74fd3c053bc450ba4e661a606d73a1160a3ca9fba748f97eaec1407eda65eb447cfabae530b4402171bf373b9eccec7f6f1f85f5f4856278900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000856318d5394f74f01a994b423719203d7fe7c2f7752e5f8f1170475313719acd4492d4ac3529995e03ab8a2cfe84edbff841fdd63d205002204c31d1a6bb971c33f374b57ad28a768f061d9b7573b51cf9700315a17dce06a0ef034903d8d9a5003362858e15060d3aa25fc289d0ea1090df3dd18f7ee008653d944aa6b8eccb021e9dc7b8ce81d167b993fe43a39528634126fd6fc6dfb22d44f5ef1a3ead908d0322c0457d4602965899e2e9c05d6c6b172b8c91aecacfe30a43a26c330b28f3c90a02b34b87473d86f3494a25d906a3df4131eca67d4de72bd381c5387045988c3d951d4262e2b99485e4a41ef3c629e6a8de65961ce93fd693ba292220e2bd79cc0203763df0571925e51da7827ef4ef2d8fae8712f7499c8fd2540cda55f42ab7c0021c43a3dcc62d2c3e0f63031e5d7f4c218d6d4e1f5df7b13c53fde26f49e9ddb8030aded2d3b0ae076b74f271ac18d43d2dbe857c19e35e0224595dbf7b0afd1aca021fbaecbb79fdf9da847aab80817222782b8f3933e2d72655013d7fae12cf9c9402008cb50ae8eb10a78e976873fe804c08be4f8e6a90b074bce6c762e84e31ccd31af2dc6710072596eaffc8eede0a3825abd0184c1b836404e0adaeeb3c04a5931940e727699b36913df5c072d23d68aefa3485b21a33b7d6cd28cdc55da0a77c361ce6c46f7977041194b3e936afcbe21a4ee96b8fc39d396cccf247b85c40a5e3b71919f3aee568c6a21089a6b8e568e93b041041cbcf33ee29578c7c7f71dd69be7691ad6a418a1e11c398d4263b857519dea6745e7467a6c637202050d37e8105e184e21eef2c3d2eed525d962da930c6432fe2d148c35b09561cf419ca4d123ae959f56527677644310ea1de65d2a44a92422b70438fce2d06cb8fc2a641e10e404e0bd75b951d30c6910f164de5df782e267ba845edab503d398ea1418e1c3ff7356ba1f135a315c8413ec054331a8dbc54d4fbe97b0965b4346c3fab05716a3a55ee5f6508586b53f33ac48ecd45619fd2404da8996c405aefaaf32ec66d73df07d909698056a39469879afa04fb65d522530df886da71cf6b22bb81e0229b8af9ce4d99721547b10b398ebed1a4611c8338a76049ea0c6dd3cce8c82ac111fb15d9e23e28047c78414c44adf41d5dfab2c376e68d96474d3b325daae6f0b709f4eaf57403ba551d2cb551ccfac5a3822bed1214868356bf28b228a29d069c214bff5e73486c4f0ce5a08653998fe1e043ee34849f3c89e971b5b89ffe74c3d08e21f359406099b67dc184debdbf444e36d40a732290840763e3385262ec333811352c6da17ce1e4298f9ac8b4ae5dafbd3dd49a4164c6e427ce2e32db7ef54c117fd7f5010371e5b405675a16f180573deef4de486e9eb7462ff42c561fb51c7b961cbf7c29597ee92d9edf38750c5935ca9e62d2ce429ed8d106e635386560ad2c78cb47085c4b3d3076d3f058d911287a1c0baff92d60654f5e1116a2cda5da90a92d9e164939942ba1c1ea3fb3d65a4a18c63b1b7fce88adf89bc7e7878608c79a702218b828bc062e43fbec37fd4acebd83b0a7d2c97bfbf9ff3446aa5f46bdf20bf96a9525974fcb803ff7befd71931f84f4298c7b53f3dcd16553a3e11cb7b85ae57f51227209aee308d59efb66c3a41595dc9935c4561495583f0c3ba6765c753f444e3004265e9fd2f5a72795ae9386cf9bfd99fd5b689408f2e8df9649237f15d17a495daf08ab1033a0234870d09829ef1d3db6923385a80268efafc3f57bc3131b3a68e6cd1394b1f6456732cfcf4fc2f330ebac770943e808e11efc57e5eaf663ca42ebcbc725b6b41d7901121790ca031b750513b2dcdb50eb4f92fbc98d91b5a6d02db99810d17adca52ac4965fd10360a16de73e00aea621d466f631819cef210cf5ec9e393c6b5dc8690424dc4de54fee42c75c725414c139209ee390e409f82cbe4a1610f3c966d48b61586c5c1f6886641603ecf0b8361b223bb75a8d92ffb63b27ee5563eb39eef7e1b54804d9f3a90e74e1173a4b4e59577f94bcfe2572a11bf8993c17e4d74c4ed29a8997a78ac9b4b19f60bb827ce70d86830a83e3f1247c8b63bdc9dce4c78eb66d7b5f0a974b5261a1db348066943367b900c620bb7fc2e8b70bcb28f631a71c374fdb6baae2961dae8ce5e8c123e5a78956e976d5df11ae7963459b83bb924fae4e26f8326bc00cbc3ee05b224494dd2f9731ed96f130fba4c1cd4f7e102acddfce399504c8aafd7bad2019ca113c0a3cc7332689eba97ea792a195842505281dbedf62f16cb69bfc76717a6f546c4effd72a8d27e89a23de1c229ef864eb33a6ea2b341f4f1cd167da50cc5dac41c82bf8a88c751201224a957883fac0c6b29651953a13fe3c9aba754214fe79ea0d3c31bdff5e14e3d9fba11800", "5253005251526a00", 0, 708642561, 0, "39f8dff35ce9865092c41692a2f281e1f4cad05631b081ed3e75a49d9355bdad"], + ["030000807082c40304508bfe836af574906f03324e4d1a779eca1ac6706b280cc054aa79ec0cf7c40d0000000002ac65ffffffff6472a50deb9b33a197cef791e4217f7a002e5239ffe8ab4ce3ab1977bf9e0f040300000003530052ffffffffda92e98ed1c63825b4fc01ef5fb86e5943fb84ef9d79d609cd5023851b774b0500000000006112242d457fcd2c7bcfad23bfeaeeb93cbba220be418a79b8c270c8f9a91ca820946874030000000153ffffffff043b8065050000000003650065652a7f0000000000096a5351520065535351fd71e4050000000000efcd490100000000090051005263655100006e85e5d20000000003614cb102000000000000000000000000119de3ba84294dc843657df61f016a23cfc4e9845701994f238ee4c88966ef96f6d7c52e7eccc5bd9ecfa1b4119c9afb1233e1ed94c239458130a469a2a9e60b14c7f7b40c9507e475d153b2a368c3c49a21a2849117ea5b52a67a097965dcb5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e56ca13941ca22df2055df334c9363da2409dd8f204d72497c99ce2a054505e9940d8a84d14697f53ae006050cba59437790477932b618091d1447c16093c6d78fc4fd27b0615055522e4de4aca63fd8a2a272f79132129b611610431c59c1bf7c3aac8eaf855406dbd91c8dcb7f98934271b491589c5ab346e118fecff8b600308a3e25ecc6013519e58a1c43c12b466767ce60ad1516ab28f3b3b9b85095363021a002400d89e39fb019e64d715f7bce5072e96f800795b32e9b203e2791c336c0a07ee4a608c6012d29937a1d1b7458c2ef8391be6476afb56b6148698889585ece0b5cfd6c17238c4b71b5cbb07eabe4b2b892d8a9b023ef18ceaabe74b490e09021a479269f74431780ed8e69c7cf5c4e1faad47c658f259f376389f240d7a87fa030106727ce26e486b0b6cead26c91a3b69aeb1fae44b988b2adf7160bd2ab4f2e0209ee24791837d64b2af0aec86e8b66345ad4c6802887a1518f130b08f0c5c7f60325fe47152fdac15c32e51569e404f69435e93e2a1d3afd7e03c7a7f4c97fb7ea021f9f9c648953eec1d0132201ed41ac1034552d3db52109f9f167d06b656d93f9aa801d4a4e9f2b8fb1012a132811eec04fc68100bc043b346d801343ae94ea29402e0f1843a8a0ed6b22ffeb58b237e398908da742cf89e31e7fdf2e40b02ee9c803ab6ba1bafa08295760cb2f414290ba611fb10c7d6149d2cf7b40955f18e9f5be51cae734298f3241a20d8aaf4be7aaa67cf61e3e04ddb4bb2745a2370a8ce7e33f754e08eb3d1398aedd83931e2da6122050943c23ade64b5607a8fbbafd86037a423b446eb8daf1c6dcfdd609508bd718ccd35ce3594339a1b9dfe634abbb82744b04a740559ae86d9e2678c3c1123ed36c3dae81ab7fa7aadff933e6acb685832b5916d0df673dae6d2c3c1e08a8b3803f8a359ece81a06ea4ee96a0d86af9f8c3494d56bd62cdd6626f8ef5c2c1619a6d6546ff684c89ea8aee8bcfd057254320894dcc995093e05db093d938c2f16c6216d5eae4c7b44b95f560b03e5c34c05bb605e85265c0b227313d0f91467641bd095e3217d3d47f632a1eb3620b1012ebc428ebf4e8b4b645820c23241362668ade4bbe95f6c63b7932be7d7193217f7de34c9c561bd71f3621387d688310052bfe9d86ee0b0b0680babe95249d992631b45423aae91551f8c958b3d1e1f24b1f85ff754588995a10448ef9e7be5a74473ce61d71d13c8d4a1e0d3abdd15a9b3f75eef6247f64774f186520e2a7289fc36a07283391bbc39733c615a28526146e4c0f94f713933c4b00d39e89452cd7075c0b9d9e19c45821f34cb4f7e4a1d9e4b17719d9baf7d851ed959451773530792bd857ec44d2256ba8c47071805f8b1e26029fad20f976d2951e149d6824657e7ca933cccc20395bd06c84c6ca8049e21d1b8cda85425703929fff8795324b28685ac3b5805378a40873d22ff68e9508a89fa9b268c4e99accfb55a4058e87f3a0cde29399899a910e37fb509fed79d67cf5839094fdbbba4dc7ba784f91fb35f794b9190642318572317a962e45eb64e25897cd50915f1ef5a3c550f526ee7f0ea58a6f1b30435625d79e101eea21289e030e275d93e0baf57d3f7191f7f6b8b9e49a7da65caf4f027421344cc385deff17cffededc56fb485852a6b6cfc1b0f31adf8a88deb5060c3ac3b8cafcdb4e962cfa6ed95e9436c7a4e556e2a8fc0b9867a9696df36eb28a76e7778b9ef1fe3a74006088fc17a60e0a4452903ff8d05ec75f6232a118c65943b4d74559d3a520a844a0f4635cb01983b484faa14a1dbcd31f5ee221368a849f0c18156bb69255add33bf08750f98dd8c0ffdd4f25e4e4e5e6a0631bee348edf29d90124576c86e11311593316d22a5eab3e626482c86e6e1b0cb20bf307e4b4cedfb182beb1674725ed20757ad4322951aad2c76c4898509d9f13fc276b1779210431176f80505c55cafff1aef424f600d1a077b1e298158288d3e172e3b46115549ad38198cbba88307cd5c6b2ed7a6d1664b897fda9020f9b3c52dd567405a096b9f1ec3d5b29dd629221459420f87cbfbc04d6f018ef3ea292ce743db84a2c381a35a8346de0639292dec699f998cec8d7daed3c2b01233b71a3322d6442ebfddb56c8179eea83f3ae1d0b8bf8b65d8c55e9b8d7a48d607484b7d11585a83509c508480b5c6b339cbdc40c99a5c7a2193a276ab64c0a5579cbd08057ebde91afa1d915bcb2e36e2c4d8364d467e168fc3f9129542c428017af470e077205d5631582b2a37e010000000000000000000000003aee5f74e603809a7164d1125f7b7dea33cc99b940ef0e05b5951f3302e4983ca29c5d568de93ce143d73666c6ba06b2cb67d18e1131fba306fef0b3b8075329fe349cd308b72acfbafacf5ec9655e077e3943a93bd5aee721727a3e4f64ea8500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000563b0dd95674a26754bb395e95bc13db4cccca76a86147e9c830a846b899105e618f5d82156551fc60b4842abbee7338ee5b5fbfb0f379552e7162a727ee58c21118cb165be98d708fc62adc84dd3bb12cce8144974e062b43017f03e4b77d7b3b683134f8c305207d2b7d1e5a8cb73fa57d8906d6852f7cca9f4712a5a9ede6022bd76b90d0080d748c44025ac0c092bf7b5e4183dab0f2d954a7e440238a3c19032ffa99acf302b4b0419ecdf97db6231636b6da58bae9ff7fe57c7d25f018df410b0305b1a59b0b8a7dac6d51b62c72fffc0676d6aadb5bc0fcadb54be9d5297839d599b700917298b7d22f58d950f3eeaa73786fc0a4ac88101e6954ae3e8b7291021a699fcdfac227a219e64b9f256693d848dde3a9d270f2ac9413e81e098d3b6e031f03179506437862f185c2d82ac3d89fcd5011c1a2ddf3a50790491508243c6f030d2200db53c1f572f481bbb455c1e29fe345bcfcd22614a5b39a6db45c820d4b021f085a37b0e28da243acf9bc3583a83f5c57706373dd89bdd681aeabf60cf2e2032a776c1f08b9d84f79917cc88892ed4deaf577aa4f062db39a9c5370795742092dc6528b12fdb021c6ac4a353fbd8afa422403a754414214a11d576c24aae9337fd3883142f635b92c2f6e70d7f8035767ca5a1930014f3b776226b214581cc6e44964385cfc8699941bbf976898216593a41d586f4395cc74f7e0a3f98676b8ea7d85cb16e605ebc13196858ff187200446487ee8f336ef96307d97a708792235fbe173f8fd1ffbdc78aaac170481bf3934ec562e9411000c72eb21474d54c447e5a04ba58d22af8e8a6a5aeffe83c8f0e89888a3406effac293d1dca0fef51c355c61a8a0b8c2981de3723088f8de9da0b0cc9e9191dba698982c58578bbdb21ca19a41bd6458b36f52c268414c461fd296a04c61e45acb927f90c0cffdfd2ca346416140c79032b2eb0196795dd43ede7aa3585a8ae2294a85e50eca582a696d868eebcba520e3911d10305377c95700b2cf12dbe4567b7d8df3bbc56be4893ff5009d5c41f911520b95c88e74f23fd051644df1e7b74bf2c47ae3831864d5a2cec2d1c419e9cc03b510ebb6ea897efdefd3dfe02fe8b6164a2aad6ab64f762aa4c7b0132e4b38d1b34ab33a0059faeb97ac7a140906efe4edda179e7570e7c5fe88306129280e5b7b687b0f389f10320cb03dc08f00f800bc6258ab21368196a67941dec0dcd20d48515204bd79ab6c2754dfb54bddae69cb3c67b60d97af6a54c028f8356fb72a7fb4b7dfb7f9fad1787ef461123a5f1aab7c0600320b4a3ff8dbe13478d3a75cb757ad16257d1970712ff09c145dc10da8b4a065494ba06fccaf40d3fc22c85b43f2fe027c93add377fc5bb87c823cac8624214588a15679b37f2fc1e216671b54c8c939d9e6015790a1573990325e065247618351815ea5db4f2c8008329f7b02fb3571c156652e747dbe36816535c47209602a71b45e4cd630cb2f195ab7ea524fec11968938503282c3b29b3e8c76c6685b59f2b4a12dbb2cedb80772ec5c819c551813b6d58591785f31dd4cedafe8ea2acb55b68d313dce752cdcec1debf0c50f77b32b8c625cf7cf60c6ed73dd6cfd2d4bcf20c3d681f61e5bd7234d97a13167c7e56e0740b06b0d6e7c33dd42540a8c1d0812828a27b3acd62574ac4475c6c56cf3a8c24352e8110bf6ad5de0c6d29caaddf52941eec41d5f5ed39906b160b6263b20c2afd5cbfd252e797cde0393e21b5e2757b17df4938600b8173e0efda737e8c58045a7451f26e6e55e2da60953d7a661b83d901db0ac57e1ab37e8bff431d09df82d6424aeb8fd91fe56618d28fb0dc63eb8d3a5cd46df16a74802757aa11a5c2d58054e2bd9364195644de1ad19fbfe94e46a990f6d394f78c3a625adab358d6905a62b8b76e4e0abc0c52d99cee2c620d0acb7e707fdf1bb7ee02b9e2b5f0f2e0a740922e02ecca5ead2e7a8f0f459d6921b0afc604c0bfe530851d704721ef89fbcc1c48256084e96e96b3bee4aac3fd0ab7eeadf785436c51d531acaafccac8676318ad709fc248b1803498befd54a318067bce675c3c1392a3050e733a06a03de936ea76486f152bacc5c2c3398108aa56cddbdc701847e99d8745a6017e2751d8e820c2a8ad02ee4c9f4a7c6de96ab4e15c87e4b401c56ff05b4d97ca0b7c3fb609e47b1811be31899decabeda4c97ef0a32abe0b8ee642b8d48e7727c7fefcbc61ca08c6c9d477b243f363ca3c43969e383330ed6d97bf0d8499d92d19814e0000000000000000d8598404000000003e43c3cdd89b9ca9e2c889d0cea291ef9fba7e4c68e11f9ca171e9ad37bcd80d04b808e51e3558798ebfd5fe75b2fc4a8a15b78fe3d27d426f6a34afb4821a42fd275210fac7f7597725db99b0bdfa97c0e63fcf55bf72cd41588cc3af030418000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fc0162b5c5cc1b30561a1558672b91fed7545815a0625782bfcd95b5cde2c5cc9d26fb5572672b561f991ce18187e00564521928703ad0166133893426fcf570b0584ec10620c7fe69d684c140fee58b589ce749278c0a2bfe6fee257f4945158f33343788ffab62377a19176eb957e90b8e2f318180f324ad707cc69e644a2021cb894da546de738601df9940dc7339bc15c52131666dc6690e57450e1c9c9920328fdc87c8cbcd9a4b8a19f7ee2a497e5864cb78c40ca1eecdb954e740ebd7b990a08f153be8079e878a496fe329c714dcaea072ea37985797d82f8b666a7fc557f336061e8cbb6d0394a1f5aba4f2def86219efd22abfa603ece75da9a65805fd30221af2ebf9d48e35fcac503e285d8710dc6fc4da1a7f957ba9d666fab23dcbf7f0221acd0487d4b19c34d33aad9ea3b4d806e094a7396a35c2689530156f30c027402088bb0ba99416253eac0d941f124d8b8a60dcbf55d33e1176023e6716122cf3f0214a6ae0192862b45030327f1161066cd9a4fc735dff49da9c83b83566428e01c030a4b045645946e1430671000cda869d72bb32d9b85f646ba5dec0a945986ee164216f2d146aa35292809edb0abd1cb8bf9144987c92859a86c7931b250b20ad83c2ac2f2fd345ba9e981fe3bdaf57edd93bb41fbe0b1fcbc62a9d8299395b9e57a01098af36c4ff5aae9236b424a980f5e63f2097335f1bd5d7a3552cee11f5aa0e26e645632f2f1dd22b0ac08cd852b88a71a3063adeb1d4fd811f218d384ca5ead896801cacfc354c9596068346a09cbd3428774cc5225b13f74a2068787110d3bac39c888ca0d2af9d1e15194f58793f177af59ca0312b321eb8a64dffe19b039d5fef837533181cd97e89d57ba51136d16d40469f2590940fcb14c4b46bb3f5273a296e7c273fa3ecab1908c51a15c0aac4b6d24287290fd494e0f3dceed8d8af7da5dbe32c1f6a387ebee3aba322c3838143971e0b5021a6891f6b90437284490f759b4615f28ce1bc3e322f57c654c6a9de5116d05f9a4f24d49cdb79cd838467973402fb5374a192a5be5ed7fb5d75fff98268146f1da5a29062e0ba09b566d3fbceadee3f0dbbab92c8dbc1c2d894c375d399488bb18435d8618b41ab2cebed0ef395ff78e4c79c419298823636651201b5b411e890377b73ec440b652ee62fc6368cf2b5af9dabe3789ba57ac00306c070f4acbb0f750076c2a8213ba6ac957067998716159d695de4eb09750e7962d359f04ea6154348df794b231df8dbe15cc1953268e2da10041952a5e6ca006f1cfbadbd117d0c60fd6981c3920a77b7839ffd5c21ef277c05242dfe58a3962ae0adbeacf51bb0da6bb630351ef519918d47ba25959060d9f65d83300b729f068580f6be7e9abb51338db80e44160947f413bdaf4a2cecbb16bc8129faed12a3386c9af7af43795ebb9b89670aefcf29be7f7b40af6d6690a52c78afc49ba9b1f7cfb8d11a6a4e0315b0548b357c37b0077155af12fdd8b406d8134da0d06eac73795af7b019dea6b65878137e324529f4b00fb97ac9e89ba50c51d062052c92058e24fec60d1d252eb3f8d946317acd65629b2bac588b62e2a17dc625900d2ee211cde5b84e22e596b4918fbc49b4a734599f6c35786ff7894b8588165268989a68690f935a5e8b6074beb6f0bece861668376101c2ebe1983a3de082e0e820c2f6a1fe0b9e750f3d02b11afd3484cb6fee9db98cc1a00534fde1173df5b3afa200ef0a929720da76c0092473b19fe9d68aeaa4ea8392b8cbc5fac38a77518dbff0cc554ea0f043d55cac8f2f4cc70c22e5ee12407de0432ed6f9c59c3def4893b07a5fbffbef335de5607ae752b7c1b2dc834883d2a1d4fc898576ab66c7bd8cce54cf5f6ea47133b609f55d2a2476e44c17a1bd4ff9f3b3166195f4573caab7ee8373499d257bb6feaf3e04248e66d07d723bfb5699b5a25e0e4e7d78fd52603c806bbeac35883fb4e8b8d86a1b8235221e2e8ec8d051f89be4febb8c6441c4949aceaf07beb6a09f7483545efc912cc1ed3088c0c08381847dc285077c9b753d33ae08298ab2cd797fe164823b50baa4a2d593a032481a638e613a51f3f9533a3bf6f0641bf341e924b28eab3c34ac7e7489835ef97e543e217779f213a0eecffc32cb747f3875a4d939b86d3e90edf98a245b224db6431c95fafe008ff668a1473cbbe8efed1db6d89dd7a535a3560d06e18718a085014eab3e0de0dea0e52e41d9b9218a3029354a29d0d42a561e010ff6bab01ab2884cdd49fbaaf0a835dc28d856373f8dd71e4d32d49c054a54f34718cbbeb4d8d93b2303a88b75120c75b9953d886448e5613bbe024116f3218740794d843fa50605afb8e6980282bb6675bc45c6f74bb099e64c702a9fec7a9ff6eb3a9b4bb0c791234a4a604", "ac6a635363ac", 3, 1897918542, 0, "b55acdf25b3a5f792912856cd7f3e92e63a3c24520cc3ee128fc9402042341cf"], + ["030000807082c40302c62866102174fe6f9f7ab8597d8af9d8c3dc51211d9d8476105963dd8add26f20000000006656363526365ffffffffd03c4f72aa3d9689b7303327ff353de47c42c3f17956a1077fef0d2fc0d5fbc3030000000463535351ffffffff0363995e030000000003636565da4b7d030000000002005332ef8b0300000000036a655368453e890000000000", "6553", 1, 198442838, 1537743641, "2810460a276086474851fd1ff1be7f57b2d5862cdb113ee04fb8c34bbae5bbc9"], + ["030000807082c40302acf7a8bff6d08179b09ae21cfb3f9126363ca916bebd5293ab00e412ea045548000000000900656a650052636a52ffffffffa59d3e563ee94aed77d5300b82a4d6865e4ee7a0dfb3254bf34b36aba63785cc010000000800535165526aac51a700532f01d171900500000000016a0b78e8ca7eaf11c70205b646040000000000000000000000006e29a2752499f587e3e0c8a33c3027038b15f16a9a374192e560124d8f76be8f269b6bb515a720c2873fd8457ff08b6d6aabb291d6a9541254f39aa55351ef31b4d6cdf43b23c2de99464eea1f52554c0f4864d477cefa1077039ada12607797000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009fc888bf4e9e140af0fb6904fea6e8a01364ba71ef4db758361e22d14fcb440d03fb58e862784b4e8aeda11c9e83ad27e5d74f36eac5a8be7dbcb0f755af17e96cf01cd26d2640984c6255abedab58db9db6ad170a427c8380ad89c3fa4813d51d13b2f7de835cdcb5108d9d61c79fd1ccd3f0fe8c9f8aedadcb166e00e278ec03252f08a633b9924695a590fad2fb9148e19f1439d776cd42500f4ddaa489713a0225c0bd71f4b7ab24972cdceb8ebbcbcae5bd5acc876f4d6629557d9c9d5f78a90a04221c24f3c5e96606a996189e330c4c64c1ee432231b42ebdc981a488a6358315ef30362275cc6d81445f229d8142086b661ca1222621cb1339ab283ba3f0cf021868dec778ba61b46b349501c8c5af860c56549b7a7700f76f0d49263c0050c20318101b19ef051395489e1b735b04258c3b89ef25cc7ea5a52f28b470e31b8b2003295ddd93210a8189aa1c3a1b6fc32aea314dc5f951cf6ee9235b065c1641a1080208bd74418794e0174b3a2c8b28cb1e763a58cd516dc6dd6d626fc629e8b712dc021f72aefd31cc86abec9b1c8ed95869c2d0144e2b6504f33a626679fe983b2c213b8dd717375e7bceece43454f3e71dc2a1f3e8b11e838d15439d5a858670dd9be3f06681693ed8379e0fbebfec3bc2af143a409a50e4cfbb39867548ab35524a5406c02bbfce16d7145ad9b0927dc73c56a68fe2838c15e277fd865cabb1243f5ba1120b6ea3d170ab0dbbeef4b0e05a7eb020870f949c0481a47e1449579aa4d2d6f37a23060eb10b49f618ede5a6bdf877e63eec177ad129a731a146b63320f383a2650d25525d8166ddcb8b8c622ef40998a76aaa76968d1003db2593d9f1edccd5e70d20c0e2c2f7fc6de32f532e81e5fb6e466131e6de991c80937fc66daa9e20a4caa7a7f837bc5fbc7beac6b8e2d6e46573b75cef01bf3455cd9f0f296f08632595cf7868d567dace5aca8a4581c3a0e510119e29a0940d616b35c6a47cfec33da3d96b0b9f790793b4c62ab9f92af255dee91d996cbcefd2a319b70e9a0c0b2ec186e2deece4ea76653e514670344a8e3cade758d22227ab35f594a00fefc8126ba60363b9e5bf549b29364960a4d3461f843977ea08966aeec3bb7fcb310d42fe32ae913a7510a002b1e5cee0a36dd311c6ed457abe8bd30a742036bc05925a14ab7fe6027c5ede73f5a7dedd5e39f9e83a8b11df3d6900d5b4712c08e5d87a15c25667cc88d49724f112df962a6a80cd6cdd6afa0fbd70cc94f22b49057ade1294c2a96f01bcd040a34cdc8a420e9061e14bd5ac9980b303050ece922ebeb98b9c336f4b225f7b9df18f0f7d28eae658185d494904bb93ee056691fa19a3ee0f128b0c2165accb5fad27ba94eaac05929593100e938851cf7c7b791d9dc32216d9f4dca43e67c8decd73ed912eee0049f683efeef764af966ba34fa8bbe016f4d46a008a331eace8ed779fda031385a7bbf85d9902afadcb1261b2f548e505c40f01f6788f01c5b19591a248491bfec5faab9c4e8a0297dc11f164bfb9698a4acf3e28754e90780546054a183c5d5d5a4b18f6945a78e1195e36a43f899d67efb678e74c767834c5521eab2283d3199bc2e760bf3de088750b9bffb1d25d90c3e8e8a676f671bab7773e48c275000825b0f4378a102ef8e7616c66eb757a9aa65526fadd3ccba2d6a839f4f20312ece1a2260c24b6929531765bd7fc441b7e0ffe3f23e21f7ba78d5e8f047f2ab381baa84c71a8e6cc1c06fae07a7e3a072b46258eb0092e6b762da5a84d304074acd334d73ead55c8defdf9b4d0f9a4312ab2d8ee7fdcb9e714f65cc30ca9f0b01fe6b4c27c40d0a4dfe0a7ab8e7d9a50e8012a024e6030c4070a08f662d99e14e08a50741d0c55090e2806b16c757bc935bfd6c80104075fd532157f1e54e2c6a2a666eccaa077b3f0729a545bfe17b010107f2a2c6a5a8714915c7328b9a72384b16fbffcf2a2ea93e87e2c7141b6b75ba586887e4494b3a72fd144ec4dbdf89faeb275d38ac9ade4e8bb5652b4459ca2b4291353b75a5b0ea1bf749683d58bc24e9f6403d5d95b281e567c257406f4b3b76bcff8f589870fc985c2db5a4bb6004e7b40b468e12fdec4ed83c7d3cfa3bd71255f3bc0911525942b210e8c4776e8697742c4a300e9c41ffbac669c4bcdefeae0bfdb6c0e6bc79be987f8aa900c1896d35386e885f148dda9eb29423b7356fe742ed3b8be688cffd239d95bfa46c1f0a5482c2a7f244be626b86909c4f6fcab6c64b2d487fc2a3f80db9cffd300000000000000007942c20500000000da0619bbb88a4a7b5cc3875f27a75526584027eef8730a269240c1fee6bb57fa7c3c16928bb782a3ef849f0c55972c3c0ada8479abb6d461acfdec06399b90ed471f9c19634ef4f3db966dca83b3e6d643e98ca928a6f0fe92efc0d8fcc55c640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063012c79dd7e2b578d3dfec960f2420ece6aeb21baf3ef4b20a77768786cd847f3fcacba620b61837e617d3e022a41ba3849197e99210cea32941a2b68bd4cef37de31dfee0566fecb357a14ef58d1cacf1146fd7b01d0b1210208f7d0ff9569ad318de632a289876dc7045d76f94f0940f6048e403e6d8b76caea38601c4b6903295dae053618919060659fe946a00e348fec8f122dba0edf90502c410d3bf51902094e24091f38547c933b9b5631784afb959846e0b589e3260b123dde602562ed0a04936f0c8512d8a2eb048777e7bd4a5e5a3e0d006411ba5fa8c1e92a6ac38ce60863f79ade44deab9b8ae963978c69f04eb9aea52862a51da7869353ee035c25031a644101e921de4af1998d2f8906b603f8ac7a9390980b822a508b62f799253f030bb35b934204b1c27d08cf35fcfa3aef153ac515890664203f7471e36e47e587021fab69cda5ceb6dbbfb56ff3040682a93f9ec7920fd3791292b780efa3835ecc030f005d9b0fe434b3887caf1d7c486225cf5eee16fca9a119f5420e252b43c89603207a7f9c2a2b9c9af43695893a8e14b6799875173c10ef33ea04b3eb27d4974d2796b96d9c484d8a612833fd607d3e033751ed13b57ce960540871081c45d9cdb03b84b84590426dc30872897be072a9684f6d546086f3c3d3096dc7731417f6bfb6dccab5836650319fb1fe9cc17c619c61cd02aedceb665e75b332319406b5e5088e7cafd229993ce3dc8226c5cd16a40cc5dbdefac577a2fe89ee6420aecdf11ea3f2f02b7e062d35a063e0ac94aa4c65c66fce0f053467e3e082f2d3dba185b2675318c85fb7136fea280337d2505973fcd1c1656675aa89c2805564a508ab0eb0a464af2e607703fa57d7de7c78db1fd3d0e0e13090385a52d34a11dd0bb5b4dca8060f75d220177f0f12835314ca45ff87d08ab417f2ff250b88b5e5523344cb80c90d93b7fe313e1129259cd5bb9ba9882bfee5ded5cc7f5479c46faa7b6506691fd2a6cce9be1453c29a1df42c058d59a8aa18a2b3c4dbe28c6b316f11d0fc401ca0575d2b48e2c984c8031f13f4694e6e7acb72f01e56b2c3a1c5042a3e3fbef406dc601eb511bf8478239f5f217789c89228e1d852d8d702038039d7cc09084cb4497a67443cf701d4b526adf8fcf2d1294f68e9b4e0923019dd45200c48ed1617c69efdb54cd74e70b2a712fc08c97866eb0e2fbbcf1e53dbf35b9079c7198717b4bc1a4d753f5df009d3a2b20b5c45c3211679e7236009f01e024825c59d5e08607f256d2a861b6383d7a9ba173a5417bf009c9017119f51f0e9d9ce516bebb9c7f928f77cfb2a34d8e4c96fa12a6e8f252e669ce236e0e58b0f62df679c59e61e1be4e46d338686e8168e1e88cc809049d37e8f95066e75aefb45d8f5a6d9da537dea5e8ab2175934700931753e846224601579cc4c542e70fee473d6d3a9fc54da7558576a17e9d0a53efac24391a10c2397f88d3d8dc2182f5dec176d243bc0264bdb794fc7d5f590ba663210925cc7d58c675120872725dcae9ed16f283116473194c394bcf2bbe400c9b2692b0005b8eaa4adb195777753843a9e63d161a16977040a7f53a9dc3d1d09ea954f0989a1134e78c735845b41c4df6ba4a092a6499dbea985aac49d7d4ee8bcb33734d1a55a0cbcf9bc853f47613e94bae8777fef77654f9f23e1966239e9c3da27a3d0fc26d64daabec59ce784feaad2e1b9414f003109e4a38a3ff190995bf1db32e232834fea3e14fb1ad208bb73e845d5fd80d30c5ae775e39871f40a3729c5e650cc15c3b12be5a3f3704ecfe9d52dd62f0b647113a4c06619c07a3ea4c25c8516299e011f1361d6c50532f7476956b33253ddb40165fa70c9d272890d1afd92d364f7b7d613c6bdd3f640c7eb962708bff48a2e113e4f24650c466aa12d62d70cb36c64db2f028edd5335294737de3f649625d583932ba8da2f2b98b95a3065cdfdabe51ba0cf80353cf47dc62346d67636363f162414053e3ec737660e79b3958a7470c56d9d86817f6d0d7b2cef53d49f42ade7a286c5782f259d68248e436016d4442e157d9a6dc84e443584353012e69400f017a62e8eba7f5ef4a055d78db671695101001346b220b1416e99a93b4b2d032171b05a37620f17e91148436b1a0ed6369d00899a394d5e9e75fa612356fb7402de991d0a864e4f731d9e53446889b46f1df40588725633985b504d79884b52de98fb0e47d89306e9d5927eeaf104cd7f14adf1d5828d5e0ce9a759134401c50cc1e0f3594b980df3591b91cab3cb04aedcc5ed3ef24c81961a81858cb35be0d160dbbabee16b3e2648eeeb26ef81de33f445aa62da2fcd19633e65a3541e2f7917714318de9f3d515cc8ab85847ca91d7e8b0cf3ff541fa6b148b616d357cd97f2e10e81133209", "00636a6300ac525152", 0, 1891978756, 0, "a6bc05833acb55c44ccb1ed973882ba137f92b3bf27667aaf8d7834e578e0b20"], + ["030000807082c40301838c1be276efeeb2dfcab5a11e2931aa8f178ef14854f9d1c0978dc9d16469e8030000000765005252515351ffffffff04d52706000000000006516a51525300bd965b0200000000056a53530000abf80c02000000000452535253fc94f20500000000065353630000530000000000000000010000000000000000874773050000000098da6a97064f754654f01aea19e215f4aa51dd7b7b7557745d06eba7163090622fe43b42973df6edb939d7edc8da9710ac573ac3930e8d1076e345ac2cfe4631f00cdb2900acb47675a76cccb4cd16af4b335090d0b40571774936b362d10d0900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ed942796047b9adb342e8b17fd98d7a92a675d8a74e671663f666dde7f2b8be8a9c74af9068e2c76b57dcf7e61cd7b99688306eca86200585c7b3d0c2a506493632e9a0da91872bc84f04e9beb4eb7edbda76b2c4c6235cc84089093da59f29c0f094f8912e8bcb0ff7345b70444b7b8d698c50584e98227f5cd9316078a94c3022ca08fc8adb835cca3688935eb4f0ee8b3053afd4d6e1fc89391f403ade50b1c031695e441665fec2dc0c0b0bf85bda74104fd51ab413e31da8f14beec820857750b03eb30cd94a391639dbe7425716f856de186fa7b80709aed87d8ed592af7babfee0900e889eaa993a7d0c6b86b0d8f7ce9f825690e8b84b931ebdf25cc5a9cf40204bdd323527f0f515b43f9f3e64447cd046b785fff0374f6a7f1d7d1e2f7f0dd021efa6c64c1c002fe061b2fb53047a7a9e67b03096d3d5c25c1e2635dbabce9b103133185129a5a30e5986aada1971806af975cb4f265e11bea6965fe19394eeeea032ec14094714113753ad2c0584d518d3f47eb442b0775bf4d2f9c06e6af0a64aa03013c9830847fe0fb67afe6493645da4ae06e304fd3f3f6b9173197353a76faff4974ee1727069cc93aa1dd63493be9dc3e41cc8688d3dc7ab0aab494ba27c89ed7ab6b668982db39fc62d92785508f02463b90716a89e94eb958320d33f973496aeaee94eff78980d5e26bb06850fbda2ab213f6adc8928a8b6a2598590effbb4b31de0ebd16a3827a6c976fb286447d38f7e91064b012df14d2a87ba8039c1666063c66107b77e58c298123529a57b98de4526120961c01666fd09296f427fb05e757e640dea154fdd66a0369d9083ecba0334d10757aa7ced4ff1a21440cd96bcbb88a05243b0d978f648e22b99a2d3c6642c9d8320b8ef5c0130f450e05b20777380741bd3474570e145abb133fa447b573e13cb0dabbf8d7b62df301174b9e25ffb6f4acd9654acbd2270f7e6cff173391cbe218070aa8eb5a8d9d56d7576ebff28a1fc81a05b283d49d6fdd90cd10816e20bdea4dab9459f3a298d8e1c21f99f20f88b1938387f7ca7d565dc04da1afa874e6514c13c8f128128247d07d707db497f7a41d42dedf2cc47723e2fd1b8eab6e5f8a6f88fd371ed323917b8b89effb546c8e31c3ef300914209b4bf7ea040d13e6c89173d08e199b6f94a412d0c56c66cff70204e70251c012438965e1afb2dcf82f4c2dc2e321afaf3a078ed48eaa35a4ace8cd581aba3802896fc5d4a782f5842c49d53f42bdba4df178ace156eb11d24ebcee846a5a18f0352db798d2d3749b4cb9b506c55e45f10fc2c8fc30b6e78df314d3acb50a83418c7314bffee86c0295b9c903ae462b769a1f9629c098e6a1454998a244c5d388e71215f69d2e6fdca02e9a6838afabb536b3bc21d1d54997d888e042438f967ec480ac787cc42cf8cb80359f9493c6a7bd62d3451fa7a678327fdb63e9d2147a3f08bfc16c0293509f17ddd455cf0a9ad3e918221cc08be1d3431cafdc8fc721cb53f8df221f308edd624a9bb174bd4b9f068d436a897df491a855c76a46da8bb71c3f7dea0bd4e1eb9b0632084003b9e6715b4278a3ca9b783260c0f51733e524230b177916efffe3b9cd19e962f00c04cb73f1eecd3f46132925c2ca2682b0639ae354c40c5ee0f6ea398a1e6324e7e7176307b34bf0b40ac3758a5e82da14572672bf07611158dacb284d566ef2fae59bc701b101eade304e2ff08e2ff298cd89853cd7c4794af5cc0594150ea4aeccca0103d441f823cf3d27e9dd296550398c4468a61d09d8e012c71cf60a12e405118211b3862082b7f7bdc3d1ae47a133ae847803a858814f0b1fb493713505b8fb1112ab30ba680febdd68bc47e240e85244a98ce24d7636de71ab077bba48aa471bb67d2e14e24f9afde4a6c3000c1d7f52e31977239abfea733b3a02cffa744495fbda5cf644d655f05f290c9c9b48635a9330fcac1e960fbe652db96b38087b9785b6804fbb07458ffee557b04f55306718e88fb869a8dd65928aaaa02c35eea35c11cdc52e246ab5dcb0df8c0f1f12938f2a1ccc40bacc6b9012727ca4c12559860243167e9e30578e7f84cb54d3d40b0e3c066b08af794b963cdee5fb03393da94cfc002a57ed0c8731f69ac57371473368809187f29c2a768dc60203298e3b8e1eeff89a20b56cdb4d50816472313b9f94e3e8adad85d814e053a0c4866b5f65041d743c26a89c759d4acf5c8d250bec67b35826d48806f380851d082ed184d855de4ebd2baa7b271b2ac46754ab26115dc5dbb6c48746030ffc0c6e9c2caa5fbf6a83abebadc0d53eba3fb791f35b455a2798cd7dd43d188c31d545bcc2e78d97d5b388ad8ce2ecc67fb1c4eefe66dd3f0d67f5a456dbe75d9908f8291bbe0b95774a3444f0d0d79d2604eef60a62bd0f", "0051ac53ac5265", 0, -551379631, 0, "6e688e201a879768b0a5f6793595a248e6d6deedff5f4ffdff84841efb05280b"], + ["030000807082c4030133969e20689205af58f060bfa8813c5c89e048d7aa5478bd12eb21849d5182c803000000050065005151cb4fe1a204e0177d030000000009535265ac5363acac5377c68d01000000000765ac5351006aacf5d938000000000000cb0f5a0300000000065265ac6a530000000000000000000377b94d0200000000000000000000000080ac19c5fd3ee2b041df67b451dec4b32b735ce97f9bdfda43ccd5635ce73426d6c86abf98e2ae8ff306bda7409180ca88d72ce2d7dc59a9d6a490abf75c32a313a46b5e8e2ce95811086fee47d29efdb105e80a5ef6973cb2f0702cd224961f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000957f5e6df4e50b5b19260847e0049511a5fc3f731f5c7f1cb1d29691332164f84948ea808b6714231cb1efa354068fffec200412a53669bd22128a96d797539a7844a3a03b5635c0f0abe9c27f62399cbabc321ca8fd078c9719d54423600c67890a304915867238ff104177b1decaffb77d5da88c24eab7cc07914cc074ba15032dc58100a1f0cacef25d6a6759269a74f353994cddca0259dddea3887d6a22c00325d7c9ef3e0421e657490106d3480aaa891f6d54eb4cf4a1b1181d954dc4dc3a0b0891cf418663a8704142c099a03aad63e7cab926ce2f5003a024274cc9064c66f917a614caad8b7a8fc3dc2b397d41b085b869da0e2bf2685c58f6619f1c4612032f8729912378692b4c58f7b30d72a96bc4bae2846311310e841875c7736e73fb02181034628f7ae24f50fc211dc1d5104c364ef3aad84aeaea99968cc77ee1dade0207f6367f2331c897853d9fbfe4211bbc098d2c1eee9cd6ada340425ed4f2719c03287cfe56e9ea0753376040a978ec1e338588a533729a6266be8c8a38d3d465b30219b1b408afdf29e6fb2b90f1ad7f464886a7a0c150b7b9dd61a2c7deda9ef67c9edf6dc12991ffe28fe42fc0f0f8cbb4698b84f583174af96126afe03d894de10513730f3ca5dcd2d01f7c8b9a9f78d7f3d700e3a1d9bbbb790a6b7f57085388300df1c3584e8c701f44a1a4a39dbc73f013de3c0d7b27ed24cb369fc6f7b6974ed67b7b1ed41b4c6fe834f09dbf0a6dd10ad05d3fda4d8c9dccc2a8e6649781b2385bc2b81bc857e2b03ba1db18b82ff183fa4e29e39f18c47ac61b68cbf5098ba66b43deefdecfc8efcc25e8da1028649b0ae98c034dc1d1ab1c8095d92b8ffce57e21043e2e5a4ad514f53effc659bdb8ec30df8eb8d2285f0f645ade6197d6149f755797c1e5a1d91100a960d1a8089fb03e79135fb1240572d1aaf72c6ed934f0b7e90779d9a9a378985330bfe857ff5da74417bb20174fb6f40ff10e71b0a26b5e3e318b6e6cc20148143274b2f0d5dd3f56096a440698e1307efc5e52a745500de5e8bc354dd78e41318b8ddd74c2f34f8b26ef16cf36f28f28dcc6a8411babfe43084959028c0d18ef4d627462f34ac43003b65e0b5c3a0b36a00fdf26302638c5c73934df8f7faf94308c3a02cae31d66f8ecbeb82943c00cca884369b43f4181bce326dd2084fec6a0d3bd8e7f936159002e67c9dceb47217302f0c538896e53e70c60e71be03299b59bd6dbc59a67cf95adb67feedbdce1e0118893be8e666e3fa5465123a719cde671f0e1fb3e7cfe797ff960e591cc44e3ed7df1ee16aaf1210fe5af4b28950a8965a924707cb5620040dd38f166b798e079fa5d015af0027618906ba04df6962b783e70a3ea6b63e0bd1e4890a4a8e76c37572f6758a3531d0e0fcaeb1870d58bd19fb7bef5e44ade72a31a98c43c269bf5a8c9bfc0b9cd97b77cd381cd2c0bae7c45a3868c7977584f9bb2daaa891b2cb57c1e919d053acd8d8994e491a4608ce5e8326c15704bb3a50753fedde144be1e063addebbdf69d958e71ed77197e1294c67f74f831b84df343868ae00bcbee8f9d0093ec77ed683f49de267e149006ad8f94e2f58b220a983c0a02245a610007c686b5171958f3b58925470c471e48c62131e4c28536462922efe3be98cdca02a879fd321aae0d43946ed59b6f0c10cfdeb02eb8149fd19c74a59469499cdb69231a9347de8b62d3149963a2c7f59bacbd48a084230a437dfc8767d563c6ba24ba3dc20245906b8c59447acf0dd853eb44f0bd43fe69800b3d631ad12fe5ea6fe0c86c2be3db9e8f7092e89040fb0a9990a7049aec33e9d641588c063077c30347270a1a3c9fa98a7ac2c9301efed972415164258b3a8b90910fb45f55e30cf03b75272ff30a9eea7f39cf8a9964240cc10215da12a3b4a977c0202f647f38c6b504081fe3cdc3576657924e3e1dc908c6b63a136c43138253b69ca2bb9c61b5438acb5b775b752a22da91a6f658367de01cc22c6066b2de188e63df6cc864cb0a069dd25b45a0615083e209d025b4178f5c69843981ad379beba276f375a5d1053b362ea22d7443d8d5a7f75c44cf1fd76befe7c095de3cb79c5312f69991f796847b0eabc37fbe431491aefd3052fbf47669b1bd6dc928a5bf70168f4fa7b1b6b245a01a7177552d7f8421597f676a6dc722fbb6bb3fc5ccbb1c96f668467cf66840856c8d87b091463a18affe8dd81460cdb14dde2d644154adef0a2865377f43d97b9ef4e86555002779dc9e57b49d7b0376847c010000000000000000000000001be7e7bbbe09c2cf9e4417a1952695b7afc8cf2fb856729d593776417adca1b3814775ec7d7194b67c7470e20354bc95b176846b72ea82836d64d2dfeceb57d894cf7d3fb264a5ddc2786ee0ef541a924dd24664656758fdeff595aef2aaafbc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046fafa0c51ec9fb7a7b7aae359db36e41f1d22d644609af5f4ef16308433ca4a70ed97401ddaf442c73722240d34ee17889dfedc25e11367cb039958c4aa3fdaa8d430f6031f8ecdccaede0f70aaee33393131df8dce202310a10eaf8154d8624080749e1052190809e4201c8eb6b244a92b8c87f33d3dff0bea69cd741d72be0208b8c5126e90efbbb4e4f3483e6b66dc1f3bfa5ee5a6e392b2b76d7c6cb864d80227b6f36eeff9d4842514056357872f46fadf6add96c2c28d33d703182642b5790b090b7a7c26c2ff56697b9da5bc4b35267ec18f1edd6dfeae38d4a38c50b9950439fd6c34e32da6d87d74486aaf051f1c778e4322bff8742948c1090677e81fa8032aabf362dc688fa5e018e52b83ed103ad0669e746d20efdaedf1688383d8990a02089112f35c9d50d031c74fa41b1cdffd0d5f851a449b646b6f600b4a613f75c6030d459d9e7313a4c0acc35a34ce2e14bd5266702bcc9784cd31fd22762f7568bb03299993278901786f3ca91663277724605b13531f24af1c9038f440e4c2b52662022970c3477fa1a9e19f51b6d02a3472de47d9edafa5847187e40a3ca4ca40055ff7cfc3554e48b8fc4fd7b01f31f641c9ed06cdaf42f6b68caf9eb50c618aae8ac5f9537f397b7bbdfb999ba603273e21f4ec892fb3e18cc0477869cb32955c5f9312f04d79cb5205d1cdcabded59def23acc5983994a165927bd5273ee8c8adaa8619e0729b2922cd812e27dc6d2731ab3561300ea2cfa6bc24a232d3865eeaa0d46ea85be52f1a2ac4532e36c7fea24b47c390631912c434509ae378eb6fe1242b983d202df3a1e416cd38aa9ffc9298e84d0080f8a92068e345b31f688084baf8ecf852dd996e983e4ca10e36f7c49b2c162cf6b809eda3aaefbcd31f74ade9aeb86438c51ef14a36e2fb3dbaaf01157c43f083fe6a7ff9404574462701be2d955bf5e5d03089240c8f6788c555cf5370426983eb8b8140b48424f6b9fb5ccb66caec4dfd8dcde391e126484344a99154130587381d815f735e5e98aca65a694b61bec14ff5f53c1b73a98c04398cf8fef0e9bc760613afa33000ede2a77ca4f1e2a051bdd718fda8eb3107aecb3437b39f7f9f7f9a06a34234c9fe6cbcb6746a6a4c246bc932ed67b4d272e5ddbf533af55d6b715202d43fc649f2533fd3e081605e06048a0aaaa2f2a7943509400aaa80615b08d3c14836e61533225f3cca198fdb2dd443e28ecb53697517b0c4a263da2d5901e32916a67d57c2897473cd9d449f4220ab4a2f34b7fc3a5cd9eeaf477ceb3283d8ff8caa755bf1da5be2b785e02a2d197c9b3a95839a070725c5e5104d7dcfb9a436c87bb98da31d6e02547980ba21aea4e4cf14e74caaeecca8ef995253ea0136e6b5b5271d60db29e2df0a157d352a0881ddb6bb51eeaeb4b07589c72880fc0e637897ab9dbe0f23ef2d5b40a09a28c0065e569f7e758879b58a57b1e24c958f1c01716e3fe850de476fab62d641147dfa1dd9763e618bc417f8bd8289daa2388a25ef9f7f8e94bc319278a5822085bd4b1aaf8e3a48dbbf144556b622a7bfba3c46621f43735a9c964d5b6f793b60de9462980380865c9c3bc9f8af55c36d1a16ddd5e7952c8919d95a6d677a2f89beff1288e0c50fb68fa194d3c35b4aad5729473f0de9864f4f590233e45455a80e6b12d712bfdcd951d1791575d08385903c745a23f45e2ea0f72626751645fc4ed6d0cf40dfb79628c4bc9e55990eb63c3d213c7f3c213e6f0e08df2e0d028dd05260476cf3fbaab5637034c8f60c660015e3e071b7075abe8bb99b85f1b7ed91c20a7925ccc3a43ca84c016b917f1bce05eecad8f3644d773d503338a42ad7caf1bfdda7a5e9748cda14098a8bd3d791894db6c5520a8ac56b52854728e4ee1ec49665bfec3192ef3868d5b6b9e06fea9af08b07d40610b13952dac05e29f00fd9810b87c85c5b80915c1600e5d1c4965bc67b5d47c5e2ba39748fa31906af1de5f6e51d2f24bb2e60f38dc5f07d5d1ed1457813f0a70a124a4747875a35034d7565af74462c106094e2bf12e5bc8a077484af373f0cd5db755f8cc87c99f061303f5ae69110bc587f4362dd12590618c6631d59290fd373e74eeb6f016de6310149786e378b837f1d25514f8c2e7659417dbe6e668441624018dc19b4acd59fc8a6ddf9c7d3f2c20616d8039471fd9aea93307ffc57b14b4670490f69c79f886b7ca4c5207d90d1e8f792d049364deefa5f666402b1c7ca111a28aef8f8d5fbf306c1b45343175ca4aecb6239dab050000000000000000000000005b3a4473c278edabea1c124f764c5a4204d9ea4c3779b9f2f59efc3fe69ac9f0162de0a4548037b3e41161b6ef925e4ebe0d4918df02e339ff8cbf6a21b9c96c00de6838494d9c55ba19a40c2c6624991f090fb0c26755250ab30eba041f5d8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023964dcc5415f07b4ab741c73392f3bee43b5ef1117f331abc550e52f473f8a4dbcff9afd454c2e8ee9e66e4665e605b0828c5ebb7fffe6126cbe27c48a978b1713fb8301c9c0ea6dfaabefcfd95b7135567f5f03982e44febe1b64cf7017e58c437c70cfa0d27dd6d0c86f9aac71dee217069039bc841a487368f8539ff1ed0317b67b67f876eedeadbf1b6751bf2389092f0294cedb10a2be70181843ef5eb402285918b08a825915e8f215bd448279fc4d52cad5c3db350b631d53b43b2afdf80b0728eedeae958d1a6ea075ff537a8c3d9adfcd05907fe2483db296e66d9e2b93f613c585f90f4abfdb349d2c7bae3b331978efa5856a4d2f56fd5525dddd04d4032b23bc2c3a8a8beceb6399ffc582a446cdab6e0505f42b2d78676548e7ac386a020f1a94a5b80cb52bf64d2017dbcab52dac9f1aa47257432546f32c9f6c5670a50325a04441679ba256165d079efbcc97cd8d7ee17ba14f34c7eb6ec350d391a049021bccc50e2419178a8d75c60abac9bc04b1a4fa28f60cceb9852090b18e164c4c0223d6b43bbcc03d39376634cc9ae89913d04c80392dbd467f5310ac01714f3cf23d0395b446d5f5d6290d9d5368387b197ea95a16f964d90c8798a237a4940122d842b621c4c302c8e4fe5da12cd3553f4448f8f47357b708de0fd0ff6d1f043a30f2a071600932abf5bf0921f5be32cf8ba804096a4d054fc419048af75240eb9a571ca189a677f7e6759f57f4cd30e92a2064dac109f55965f86c723d63b9980f7bbd816d6eacb09d174a9a791679fd063882fc5bc2f2accff85c9e626e4bae51e6a250ec26b76b6532341f7d8bf28e4d3d1c75e7ad17fd492a6886d26de2e1aec67563658d1b6cc9de28b29a7f97a18678a07616189ffd219283fa41b416365ec927a5650126fb665612ca99888b826c819e202ec82f5676bb9e9d11c4dc66d40e1a7b520e5aa83a0639b7d65b0eb805b824cf2560e936b2f2194d13d340326c0bd37bd498836e49058d327f40e2bf5448764d0c53758f7839b7c4854685f87e929e2d337a8e544ea095a3675fbc1c69d10c64e9531b212fdb8b9b6932a0f9be1a9c3969208c03938855ef1d32e93ece1a88de4474dd3558b9e3b27b4b8eeb874617ded867cdb966957092b3f6ce5ea2b557a94bad846f466a8cc5149cbd7b422584cfdd211638cf359bfb53b8aa59d5e6cc8ea59aa07a4b6782bfda481e59db26a0e3c23333c9dcc89ff7bb687f92d87932ef69fbd05a370819d742e8e619543639bb1818caa4e7aba8a8c0591e41ef958b35be8900291e1556e43b634ae99cbfbf0e434f3f1e3b99dcbff8f2bdf4050308d897b227627d6fb845625210e5266c45cbf663f8e0bced56d8c2dacb6a16819b0be65c954d7937ebba61a9e544a4114cb96ff857a9315f850830cbbefc0277f66e9b2e522cd99cc5678611c88812a9ed907079ec6ab64d183a5fe19a979a43c851748c02f2b1e1e08f1338c907c14576497c6796a442a4aec4733713f43992682c8b52ee1150e8148c48155e04c11151366db6da52fe1eba08341a1d4dc03279986906f46a5b20eda43c6dfa01974c730a6fd9430beacf519f842ee1ecb13411c61979b6f390bba0331429b10191caa1c3d2403d47abe31637adba7c0ba2bcf8dc452d6616a19dc521ad8bf658145aa73ceece71757adb45e84753eab61a4e170da57f8f7c69042be4bdc4db300737e4a2f03f31d65284a1b83e5a61316cb13d2978d0fcd8ffa1588812c887c772ba80202f2b453eeff15c0aff7a854ccebd684065f6001b16eaade44168a61538f01bb8872c45ecbb5990558ec2486e824a816587d6daa46d1675f7057bad14eb5c11e87858787db556ab54c790e4a56a0d42b83f4558fd4d229d874ffd9b86ef643878a16249c5cb90ecf0154c05aa14a73b6ec41b8646c4df44274aa8ede72a5920a37811c34dde307289a353bb9820372b26ba36d30e9e566b495ccb1604da1c73fc32627d483213eabecf2f8b87ea5c5258b23735c2ead451ba6f478e0c2b6fa1255b9b02aab4da601788144c564a9f930093c102c4cd3aab8f40feac08443b168d2d96cf257ba4b90d034072380ce22454043d1c4a7f8c7914ae6d6c1482fcb0871aba12366cc1ad3662fd81a28218bfd5992a4615b124e50cf7664b983609d7af7d4ee9b1e152f9a70a3c668ea47c5f56204df25f498394a818bf3c02a3308cb43b520a14be639e6ba6f09490b57104c95aad2cddab5863af4c8911d253c95c4aacc5fccc76453680a5e2569ecc056c5420ce7fe17d9f5dfaf04ddcf3600a81ce03d12ee0ab3513a163439adfa1a968b634e8bf788db77334cb6b2b62a43e3cf9b18f0d7f4c07b8c6ff6d79c8c3c42bbf8c3d0dbfe04f5f64e168aaca626b1f4382ef6673bf8866a7bae0e6a48204", "63", 0, -1984510721, 0, "8b7fc29afd5292cca96162eaede359f2744b522c262e87eeb7a84e9854dd0771"], + ["f2f8700702f7b658c598ed06a6a763747a0ae89c54602d3f672c9a3ec2e3ce73a3e6f82bc30300000001acffffffffbb11045c21add22c2700a8ffdf02caa27ad25d0d177b21b19cd0aa27776f645500000000006ac8ef82025dbfa402000000000200536c09a4050000000000000000000200000000000000007d02e00400000000bfc0fb93d0d6dbf13f1486aa9573331decaaec0bdf1c627797e9f1457428ac5eb0bad3690d6c548dbcea267d71deb4e13dda7dea3e4e0585108d55b9c5b4081b4c8029f9bbde7387f680badf93516a0e00ef90b481f521fdcc7b319073185b8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a622b1ed8c46df1d68686e93711763b0051cd68a2434bd73ea53692f1f430f8ae090272247875adda04a1b55090953adce310683d996c6e9af8e56ca43378ed50b432a5720a1ea2c72b892a534842a002d77b4cadcdcbc7f537d2ce6dbc57865f912b8ad5829eefa0e3ecb2b81ff7f6c2c44f2e97ccf49ab68c4f0e2102ee359021d7bdfa0e83f687c0ecfa6fccbb226894ac04570ff3b625854fef85fc1d0bcd7030c0d301e90ae0d3c4f2949700b571a57ca1b8c4d61ce5c26a5291c4fd507ca140a05197710d04aa00893d910d312d195b218362261ad21261beaad44557f7f8efb53718f2506846087395399b46738ed8629b7078e9ec053fede3674da0073dc4f032ae959ac25ddffe61f95987882f9f820fdaeed19a9bdd5ffc19e1503f42d8097032e666ec17a5f8112a68516e184fee9756e6805f60e9d94914e8fe913eb891e3f0323436d9fc72fbf256770269d4b4bc6dae7c886c1a157322d8abc8e84adc8e81d022647b9560c48328fa0fd6a65c79f7701f0b3b4971e3e8459e259f7f8aa2a73bc0300c9ac6d3c6df709e14f0d8d1cc86a94ac62fec75a4114f8d94952bd6c61200ec3a57dc0e6f3130cf5d1be33d44c9651c5fae4a811d00d95ee446747c3c361ce2473286f094e76bf8c1a57daeda1b0eb8c990be4c4f7b34d07492de890bc1154943fa9bf566f4f12e02df971e9b76a6fef436ee09c2a0867b22bd797eabdb58c043a52190f036147192377f3cd71c91a032fd3e609b63082d944813385ebf919c80cf1ebdf064566a0695336380b958670bc87c35dccd9e83e71b064116650c9694b36acb234f73f508738c6e1cad0e8ce97a12e20c5c35dadad094cc656f845c7ebfd6b4ce48ab1bfdbe13ceb859ab5f5eb79d8fe5afaf7637751d63f89e676e003a4874eb051eedbef544fe45f6c25e3e5a71245e77408e2d2c2b8a8b2a3f5c451655a62c6aaefd18de248017529be615225acace714bb61e25d5648e1b06d3a731b38b67301df1eb018d072c64f1b28f5ddf5f667622c31c667337dfc6b930564b03e49f3cae25aa15e2bacd7bb17b4e1e73da328cf18b3ded633a088ce41a5b8f129bf21d414283d05c7b99b328f3b8f13e5b415000ee5442c045c04e657def39525dde8483bdd80dd38f04fcc29cf0636366ee42ace6f4904fee3e2cf43e4011d1bb48e9e9dd6b71cb81e284e5bc7aa21b4cade8558cacf05add380d03ed18c5fee1aa7edb82e395467bb111dca0fd3fc8b4f97f4753392e36613b39d3c8d6bdae68c9d4f568486bf8efa9fe43aa21a5028eaa233d46254f7330b7dd4a2c04488a7773c2714444c2a5f7b4fdd04d6f757837b26a3682a5e8cb4f9c0a5811311dea9f3b944bee264ce45b87593663cffcc69dca1c2ff2a5738393ba2fa4002c7334a20329f2e633d4b913cdd5e7b6a8d34d50172d331d0db159a92b32fa147649206a85bc63aa384c7a61a1007c8fc3fca735ea7a576325d33b92162ca0d28065a3edb153952828abefb241534c5877b256320a5228fa0c2268f36f29dac181a7b5e84a67a8e5cd475e5aecd5bbea54c10669d19ed49344d9eee2b58f39bf23724727bbfb38f311700e7d601f97660478ea6f50e88ed7f2aa76943348a2d38d2601a8a9351edd0aa8c30815777f0d84d51c452cb14f6a5fb8a9f8d05ea5e25ce649b8ad2b329165b7631d404af636cd3317369945fa5feddd844fad4d3c704349be57a93c1986bb2021c86f26b798b1c102fcb65b66b6ec913fde90f12ca4c459d85022f7f230a465f4ae9551b45afab0ef4bd0980857daadb700968c5a3a04142129a1b7664919832689b5459d86fc3b3bc14283ec175ccf68fea5c32d528334b43237d1054b113a422fcf9f2e4623973b07b517acf6b2dca1d57ad92f07cae17377dfc76096377f04a16a9bf60272094dcd20f2ee9e2e84946ae1addb55f5b1b75eaf538d35ad041d73a96152769ad5cc647f605b8f2a2420ac76b2a37b6147e869b24025251ab2062ec5739314bed6889eb22d8cc537ea9b39267c2ab5e931bbf4c0f3612bdd3ec6886ca8e958dfc0060b7cd0f5a0ec11b9b52316f1c7c8027b23f5ebc4704cf0daf53b25c2eef42de0d1f6e2b4890530d228a9f288b9727cf5d9cafbf79bf4ea055118cddf33179a18d675c903bfbc41189f0b1b6d18c0468b4a929bf642782daa69f196c99aedc30228c1af864674cdcafa2e4935f2fe17a90dae2b1695aebaf70094e71bbd13509e0247080e9c8f821ffd7d7c210461bf5f1d6454fb14888c123ba5a8861b6a70000000000000000155aea0500000000ea15d4265aab4b88b4d9371b050668a6813275b9c05b608bb643a28dbfa556987ec4bbb9b7f0a5c9da30b214ba41efaecb5b8981bea113a6419ffd2fcd9a0d1c7dffc1073ee63501cf45a0be4c97f4746cfeed2200ea1e8f4de407dcb5701ebc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009ea79739052fb1eb180485c0ffc86b10c02ba31336b531882021304ca7558e77684079baad516229ac09fb3be17f1db168468f5c492a0da384b127c4a71375765492fdccca24df3e4f79f12da9df4aee7d98e6de94a82f64efb1abdcb868a0bb6af7c70beb948d2d91603618e6396523c110390d2600cb117f95a48d8468bb4d021ebeef4034d1a3ad9e5b31970473b7a5fd7bd86ea0bfabf795194d67068cf22a03060a9be7ebf6e9182e85e9d5c64c5135b17d3bf1c3138d584edaadf91da9ffff0b04fe3a4605221381bd378384227f6794997fb118fb4e139660516100e59bd6cb12d021cb6333716c658e9b3f7795956657862ee39e12b408966e59ed2423dd70030cf285f348a77a8e7323645ea262231d65bbfe6ca997dd1de36f5968ef7c0efc032fb952e4aaaf85560dd144b901fa8b2a39d10f6c0f3e9a4e717f5dc2a0cc3715020abf92ab19a558af548c3f267158e15d05294cdf3d18497e4e71a40c08cd4cbb032798580d7773b5b4a6cbbe431cd02a4256835764b3ebbba9c6daaf4141dd4b87031afe0ac3b6a11e6b3a281e4daf7eb85d55a5928334897397706a128c1d263fb68432422c6534f718297f2d96b3197859c141481f00344554e9e20b007a02e3d5e89d414f49ea73807fa8765d9f36c2a376028184be8c8784907140e5c5323c9e02325fbcd9bf22bbe584eb5b95241a089651515c3361cab5be710910ff825a48a9612ce2335d2dc0dbb5107936c70c4670def58af3c7e74d018be54b1803604e5d630b8cd2da0e32d3dcd121f6f1ffeaf01fc0af6e3b75a46159c02e6fd5538f92426989297a7f839f3333c315498526c2235d7afcc29e9c9f782e87d106f148cf87636b4a2985f3fdbd67dcf1a0b6d0c1ea0cd34ee89be050542906acbf116c5dddd793eab677e3373928ceac5f872f46a01280e3fe9776293cc6738f7ad6c6e11c9c6f6b291a2a3f61816eb10f7e9a9b406234f6167715a18396d36379babdeda056856b349792aca2d108e6c39e9b0dbef6299fcc2690b7d766cdf3032f080f8ef5d647bb1cf2114210b2ab28aafdb5737f2b60551dea6b737f41a1b6e0508f8600babe2b21e895dad66a54ee2352fd1f965279d5bfa0874cf66845b9a05a4b56b7e70c21cedce9136513cefdd0bbec4454676a5f0b1214d3db9da533b4f1cf59704f4e29590e4a47312cab3c91dc0b1ebc93ed4cfbb00e38462c815c777902a4db5baa55b4a0b731bdf6d4cfc2878e1a63f47ca9aad242636d4ca6a444710f6a6f198908daf1d3519a285ce6a223569875a73e9253a91aef7aaf06a89b9dca34f424eb9ea2f035ebd6a8f0c18493f3fce210b79724bbe619a84cf13a6b7b4f5ad23f8d00d510a1f42e0a61d15dfa43a0b644f6a0d79e8f6655ae1ae58d238b892a1bfbce023dc0855828f8861a12c8b7ed747d72ed791feaf8cbd41b657a2a958461f10109e26cf377fd662f509a9b5296f763fa785f2b53088f0bb0fde1c4527511907d61ccbcc5962a27c1492fd38a88fd2cc2a88d2d97f1ae320ab802ff91e230cd86b1588149f29529884ef425b188ed02d5fc1bf13a96484c00ba087212722e92fd7dfa912b10e36bf12a7a62d277e8ec53e5fc8b36775c487f7854f6b77f0b6a2704b62327ddd48699064338f4ff8e181a93e11649f5aa6c5a3819e34d775806c87bc097e2bd318e4ef08cfd11f8904f5b31c17dfc6128d8fa404d49f8e64d388ea9caf148888d1c292398eb44a6c498622c761ff43731c38d4507d4cad18fec099736877800819d4d678484cd1689a91431ed7aae02c9da7753fb1815f40db3dc78a71bf0c18ac0a4903aa88ded803be3891a35b178850904c7c75253caecb8ea7693d99ef8cd2875a379c66c48efba76838bf29c99ff4b77a668f3c5a2f9c20de0409573cc9b5eb8ee3522ebba821fb766c88648534c7ddc8c10e21caf092c997444a90b0d2add18a6915a4575a6a62d9aae85bb48f4c7864708fa34f4e1257170db8766349d82ba6e451e41c141526f86bcfc1e0012e966b606147f5f1609712add826e2b3f9eacd87883ce5bf78f945bb89e6fe09724d562fe95cad44fb385c161d94ef1407d1bfccc2d429c5717e41353828a8ff3c4d0c995f1fdab3c03acf3053b1bb0068def9b088660f643c558c269af4875f5555c342d7957abfa178cfe6d97eae03085781733219efd399c6dc6e270ae3300a2ae4afddd527001236d7c365ab493e2c8760de4aa09eda3e3608e6e34fc20cbca9ac5982f79252dd0c019ecba1cd84cc1ae13a678205ff2704ff62279796505be815d916fa0ebf5101de3665ee48e3306f26904ed2d99f7aa623b815659eba25c6937d5b74cf9366927a0cd0a04ee8c59a87e7f923189eb0bf8256d6b3b955fe24dcb89af5053e0db92a15723023e5edf2c9fcb690d", "63635252ac53656a", 1, 447930529, 1537743641, "207f002ca5cbe11b3c432e791b0c3b1fd3f201879ff107d0af4a079a92f6596f"], + ["6cc3d11604361561d224564e3df01544647f52d0b4b8fea6741a7d8954e70b769073a48d9401000000015169e5700fbb42c355535f72bb5fb0537623a41348e249f1233ce41c1c473b8901bad63256030000000265513e09cbadf592b39d9adca6ed88b17c58c9e805e8a2f1e808e6e360b7a470d48f83818ba60100000006005200516a65ffffffff0efe76c1780f2fbc469e83f3325b8582955d9e5d4a54532190e6cbc597ef83980300000009ac52526300635351657cafc21d0225fb9800000000000100cd60fd000000000002ac630000000000", "6363", 1, -1090397391, 0, "c3a890eb79b2cd04828852cf5354817791575342567b2abd9eaeb0f7178eb87c"], + ["030000807082c40301154d450c73e4943c4f60aecdfee42d47dbe9abbd00846d7752d7ef2ee75276640200000006526aac000000ffffffff032984b204000000000263ac0769b40400000000056a6a52005252fe63030000000002655300000000377efc60030000000000000000f3ea9c03000000000afe272120a2f92d4e900d24219a738bf5bb46f8fdf2b635180df6124e3f36728f9158409aa953bf0ea5e7a06911856a540001abdc23ca66f8e8af3e98423a634719e9c9d3d611daaaaf5906f382682d044eb53c46d72dbae7e7809fe1e1256a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1b115fc13fc774b5ffdea12fcc9d9b1451a765c31ebbb01839b43b960663ba70274ef68b1af70c659ac5505d4f797871665d57395692b67fb68ca2a6f99708bc62b3a01a46e267ec4a45416dde75a66c6b86bd52de0eb5ea2b287c7dfdae09c8de87bdbb31c9fd4c17f2fd06a4c6d3b8de2f4edd90934fc0f40d7443d5f85b603014be1b2317231576c1c679692bcca2b92ab1b66b705296e243c65b89ccbcbfd031a567e378c407d98f463b823743e7f21d4b814be10cad4a2801c2be15e99cb410b044dd63b32e860c93b5c0f07d3ac88e469df9d7b4b17c7009349255717d0be92957722df46d2aee65d21bf798100e2584e675d47ed459b7bdd4edde398c47e56022647f5d81bd2e41fa753d703fc467c8b6db3f88a8870a55812ca63ca3bdaa6320229fd9e8b76fe11dd289296ee05dec0a721151dc7b1368bbc4b3b4f6446348891020106ffe6ae48bd8c6a113c6180805dc9bfdea684e08c6949793bdbee499e5c9a032b5c2c439944df81bd3060cb4e236cf04218be6aa548168896c43b96ea4e71cb0320d1c33d917cf2aa34715714a396eea29978be0c8ff4406cc87af999647de54702c951ca1c95b771a9aa343dda505d398433c0dc028afc1177b29899abfd977507243719644a14b605bc0ffe20cbe17fa191b3bd5eeec2439f18ba70b2fccf65ede913b9068ad4720df041dc56c2d9bef8c7b3091f2be647634b13f7dc9dde912555c4bf1f6f90ba7ea6dce63c8fb11d3ed6c5c1aee069ac66c534b94fae7135ec7465d9112fac838620c2f0b40f03d80f91a41497a83ad7ad4e446b5e9229ef80d187d8c9f37c8bdebd6c33fbc9c598734f031dc5205f03a71b8d3ddeef17d0fd7a2c803615fbb0ebc3fd0d3aac3e234fa99f8d20e2227932feea92e62d4b1ed568eaf65e2a6053fd80335abb09aa59082f3b085cc0ebc15ee6db34d96ce04f8c551951cad9c29a690aea4cf325a1ac91b4827945b1587ed4e75be47a0797fef9066771b9fe6f24387f5e2e582be5d8edaea55a41f8f301cbf90771fffe1a53771df92efa8514f2f4e16cc3101a1c7ee41f7b777b18ad927dc3d82e4afb715c3b73ce81e312cd5f1d19bcfad6afe5e79d167a7c0f6b74ecf3410b0b719922fb849cd5b90d94b1fb8df38dfae965fd2525f44d83cd1f23e80efcbfd022e9f31e9a1b6a4d0bea8b31160552a63ecabac2da035da734803954d689ba4623e171ce66bb878e12fb8948d5698f3632e86c9ff6c67da435df72f68a2d98fb568134b82a4b49581d3f256b1ed654acb383c5bd94b20f31c54d5b3d3950b96b2d253af7fff1348884a9c7ef5006c99d70464eaf6b23084aee7ad989f918650cead4254652efa6d08e1d119516b3303a773da8b680d079e25525d926e2f6e8034e16487f7ae717b8cc3e3d8426ad6f1cf208333badf9fa873bf8341c6dd4faabb011a9bb4223b4f6255d7edfe6c2dda134d47613788a7b538d28c18c4c0b6d00e3ae739d00e79ebf6a3c03850d088a0c56189751277f288b98325ecc908d9607611ff536e24c8a7b27a4dd266c47544c80b6a3c9f18f6dd4094cbb0c8767fd8cf0ecbd09e84bdbba664dca8c18023ceee23ff57a50888df93fe58e7ff54996d73fd6015b5ea151c754ca2cd5227463fcedd26629d86e4373efdf8219134ebae47336dc38b0010fb8622c839b32b5ab24ad065de9b255d1ad07253acbde03a3f9dacaeb5991cd1f809795cf5f036ecf09301fef0c889f91a94c053011994c1ad3cb7e75d7fcd6db96ab3705f678df54f0597c329803a714b2c32e04153681a06ce962b4b0ea3c7b3a577ddb5da6b21c0b2e7c7e42434835d6f1bb81ce5de932bee378d6ddac31c4d2de7777d1a3fc4416525e1a95c958bbd7bc15f8c48131e4e4b42d5cd374120c190a3273367d64b6e02ecb96e69ccd8aced302c0d4ecf08f55fac8e26feff663a977a074ccaf852a701ccf3009ed073dfd42a240146294dddadd5b31ee2978e64c27c2f3375d29931dcfd8867170324383f53e749592bbe55f0076a327cac5fb73e811422ba802de08699a93e63a4d26e5d7f0d8a4b5142df39aed7663e57e7bd510798d9b40a623be81c157ca973338c785d3056b00f250b819b24be9aabef4299456768d029f4f53ca89190658d320d75bc80b96364349d3643e2c70bc80c5469633bea82458b4c373a0f38491eab5fda6ccef14df046b40a01c220bd47a75a8e990ce0daddb65594a2ed5f904ec96042dd056567df7ec5c63328929db1e9162edcc699db75d6a97143895c24389000000000000000099a08e030000000081df9351d5567a88d2f5be84ea0adf0568c01ba7da536d67e1b6e057785e4325d4bd52de849ac64c5e727aaa394edfbbdc2167f5a2e4c8cf4e0d6726daf2ce542b4323c40344f96a1661dc77c117f914eef22c938830ea87c37bc91c831ef0c600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eceed5157f5123460a03e92273d839eaeca982b159677c5fb879f5a1403dc954b3e023a88aae19de4ce2dc88730bd9baaba88e50891d29fdf16f3be4e6e7a8d337425a76898fb50d103ae82fd9fec70df2ea79052221d37fcf741f9770e2c0765344d81a9977a0f3caf48da72ab3d01b046c4a1c68b92a3ad0b82ee3ca2932df020e3509bed2905a2a786654cba1d17cafb5a4760507131c8bb0e375059b0306f002279fb7c35c5929a48f192b131552be1382f812e2e880215f3fd746cdb110d5ab0b05f73bfb8e9d89792006da4e4b173cfc586cbca0c9b360cb21ff20a6740161c1a16ba900dec0e3f12db795854d16db5bdf50e1ccd7e6c92c2134235d76ea830d03062036b6982557fad064c951bae7706ccd9726f876bac4d5a809bb26e9aa93af021befe42a40ab56ed9eedb51424c955e2b898369d0bf97b7ae8c48afd8c37dd920202f18f9682c066f5d24ad6513a814984ed796b1df74ea8819e47dcd6f9f374a2022448cf478a519bfff0a785e72e8ccce2cac85f1826a0897131298b344987b1da0224dc999fefd46989ddb632c6cf1bfd2a8ea80c596921738f05caa5b0c5f30ec5ad1fef4f0a4dd6a89b42533960773b868cf1108cf4c4156cfc2f9cfa688a5ed8528db0edad1f45d483730682838ba71a56e70d941413581a126fc1ab1a6ba486ecaaae977b45c3b452cf1cfe8d319dc06344ac969c6e6ce93d46f500a3900f9199f9c6843989427aee8e31c2af3f010243a49762df5a206adb0f2bec55a8f53fd0cb85967a96090994564a6d2a87269116aca2a1847def602475be909c2151442367a051311fb95e22d9ead7e8e4836e9e4c23536482ee0136121a56fa943b2795f97cba60712e9bb1083fa78016cc696a91af32d8d766d75743043e4bdbbf3d797b160b405c4223b19d012028b93335f30938c3f6397f730f21c605c88a3e33fc2c515486757f86fbdff5d6916553ec606d1db007de01e2f7b692a056c84df8d1d411e93a2bf3ef4f4953c61c0bd9653cfd660b77ddecf23463a4bb5c5224d7e89478fdc2a94a198ebf5a17a87adafc88bc605e5b22dc5845702523d4e4125f29eb9e0eab2a5230ee783901aae233ed9c01ce0c88e389476b11df3b40da0f7f39d08d9960fa27ea162287c01e6de68bb0717982ba1119c81366dc4ee4dd8228c61c51d23a989ff7c59c9716737bdad9c4b125f80e84ca86b3d53c9351403ead29d1c311b418a9fe519baa3ceb7e1b94f8f3985f5311b24204cfc88dc3091c6b57c96f2ace5b39ebc404b564c5ac139fadb68d0e69ffbe2f827ba8d5b796a207c7a836559be6b615ee6178aee52e6625414eae5855d7ed1586ef60a77584b3e3a019b9d924bf8bc1656dbafeb10d94ef34929087e4edfc4e2469ed2951995cda733b938a0afff1a56d261716a6cbc5408ca8f37dd7005f97b8f48e3666ae0fe817160ac3caf2a394ce5cb8e9d598a765fe888cf61b78f2c4572d511ba1869849cfd02f97994e22888ccf5d062eb4b5a06238774f370042d70293033f8ecb039b07b45437ecac14a9d2cd42fd8f2077364a664c83fe7485507a894a92315ec6a1b60a6d2fef2ccfa43ce79964147acf958d5b9b7f83d0fafc68fded016d153f1da02c63bc190d31dbf20f4a11c696bb4aa1cce5a5274c8e588562cd160089646b397a9ad455146b4776714cfc728c178c434cb0478ec7e82420e8cea671bc36cee1abe4b1b79276227eec313a945e6a4833e93e4bcf346cb7fa4feae38fb4218f309c07c7a8a222b0e9a097bcf04e3dd7a831c65010c0470ddae77295aa96a12c4a81c69c298232296bf53aa269c24cd947e75e88693b81d9de6bde56a31fe4029f66c0c2c7a4a7eb384217f5335cc09b618be1f10a6d5020c1103f64c3713abb19f40dd92ccd56aba98f9fef5739ed97ee7ab884547762731dd413da6cdff0840d3808c694729ecba000274d8a0f0871d1629688c58908bd99f2742f4a26f6054ac5867a3b1980fb52200fe87d2af1eefb72526b5a3f543cfd3c8336036ac62e1e3709a0709f7e46db56ae8dc6980acac8a3fe126fe858b03ff3606ab9abd437652dc5173c6afed91bf47fc51be8ac9e9b4d718c27934ee3065215ca7be4df59ee1d7f730fd354b627523e6bbcef404b60510eca26be3dbe5d9a8924624dd3bbe2aa938a293940b728146e5e09a9ed3353850110a99f31f873330be312579fe3aa4d9fd4414a33f6cc4b45d62353497df385b53e5b21f214b702e70b55c4fda459ae33add800d602a8b32f11778d961ccc8500000000000000007b7f0500000000005b0af7208cb08815a426af0dad642a5c8456f90703c3ce8e083c0172107ebca35d7f8c4fe62f4732dc7afa241d4b36d640bd00a8fa7836c28fe69e2ff59a3dbcd1c7c156b04bd05bbf3bd1cf4451ad304be1163dbd2defe508a2c4274ce262ae00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000563f01b1fe6da502aa0b498fde7e3dfac56196b50ac6dad01d95939bcfcf6ff4c003ac3cf6be044f56d9d4a1f14c116ffb36ac61bf5b4116f23b540856f17b714e700f788884a6491d52efcb6c4f7cdb947e1bd4e92ae6fea20087b7613fa1fb31718045d338a46ea3292031c0a98c2bfc473aaec0edeba74eec270c1a3c1745030e99f413252fe095350f37938daa84527068d98f2d224ace2fd36d515086125f020325d37ab0849481d82d8d3732e73da58cd583974c086a682cb9ea45e26b6fe30b02def20c966cf15671634aad7100210a55ac0ef7da2cb78709a48ad5502f7c08937e10acfeb7a58c3371321585ed4ee1337b397c06d21d7675743d9d97d8761f031c1f81d108282904effafe1970570b8202e0ecb07d1d0391367848e7e3bafeea021481f1f3c33fd47975b38d418229d98911ffc8fa6611febde5039dc2cc27c64f0309098cc0e7b315e78fb28d8c8bad37e3762e06b523bcabddba40d7ee10692314030c3c802bce7c06df3ebd825f95c6c88558a496863d4069f5fe6238b8f9a09fd1020df19eb60336b80c4171e17de64bce429f52a13b9b07084de1d37ed3cb0c79095544de2c19ba7b9cdf2c52a5efc40a04d7a9f08f9a1f00ab01d2affc908600c1170b82543c2ab6ef62b04e5f3fb57989f650b1900c928c5cc5b25b4714e1925b44199981acc38fade344f297a103e6a2725852aadcd8aaaee0322017641f891f343f79a8ea9584e34e3e4e8583a4b9c16658804221c9833584a2e8a864690ab77a4fb22d2b915687e4e19d7d9f4190cae39aa07098139789a9c966a6d98cfa88f5447d835c82a715dfd9fa204a0dfce80124371a2650344de820f94b87ba3dfa04387f24cdbc0c5aa1e1cc457db3d3770d6f902eb72b77ca2a95906825255029cf81406b01001d68c399ad5afcb69de4ae4e5d9ecd540aaa81710c3d8d4bacd1ef11db6178b48013e9361a75f89b2d9e7ae8f4b61095eb890187abfe3b9084d56b130b56983a71aeab015a0c2df862c9f2b24f5382c6f4551574c9a42d659c6b24ade57e114453e3b1b57e793696c707a2464b5ccdbd97663d36f6e8500e18ee1a4755c70b617f006d4c01a76921959221d83a5187bc06eb35f8f34f3a8dcfb91e1670c72b5d7fbfd20d57c64e81cf0a4e023e7e2ae54e02ed82d090c0aa7bd34742f6025e3007498b8e7fdf5259de42a4e4bd95e3b69eed93aa88b5eab2668b68cbb9de92894c073e70a3f7db215dffb3664ea4cf0c590aaa709a8af123466e44f7a248d698ebe9168b465d9f39866b732048edb49a6f4e79a24aa62985965718f5b6121f50462b4c5c916a6dc46ff91351ccf6461611e0df16d8458e78e11f5dce97740f558a4d6febfbc6ba106ee520d70c53f84415c56a97d2067056b6faa0163baac77b5ed7f0c4d1dea5937e4326ad9d4b6c7be8bfe836aca97cddf4264c4692bb744cccdf6b297b137532eafd0736488c19c09c868b5d19e89bcc10de1a49d17630d1185064d3c3d58938fb99421bab60371222eeb2dae4f6be91e917d858bc00b11827cf86919fee5c9e3745f23810efa840bd088f81e13116826674db7f1a89832d6492ec9aeb4da3be88f27e8e2f68e7c89bffda489ea05f7a7aa0cffafe48755bc91718d274d5badfd21f67a12c63082ad1114a7f2f1444d4678d0ef74d3efba5959a0973e6550e23748c7d1953ac0b0828243b069dfd5a8857878a80127561e49c692c73605a939739170e568e1f86dcd622fb527b8a9287493b437244afb2a8f76a4ae95be28dab9194f51240ff58c00f3d1c295f4df9c9dbbc911a506e1ce63f7c389e1b3b7b97cf8b8ae25813e567a4d10d59643e2afe94fb82052765050ff77dba21a63a730758009d453d0b96540c10386b86bd91a202995ebd16dc39ed68042db0433c85c36ea4f9423745d8674dec09d566f54e9abb40e1adef8a00c690b153f2e22ae6ef89322e34a1f07f8e4df2400060145b43a0cbe83102ce955748ff550f5eb557cb945d321d19a6e961fbb557da2085e3db89869019b1b8b78fd9922d34ad8c38a90ea571cab46ecf5612ce9df94d12ccff0ae7e301f0c33a406652f834a53631fe16d7627ed0209197120e3c654e840f43cae4614fff5d768721fbcd3149f685ba8337a0532317fd693683cfd2358e1933b1853a6987e91f772d9dfc5d33eb11d790d6320a060da088481ca6230a73574637052f5e49e24e63128dfe514f81b5e7f777c7cc568b5a947bd99572804df00fb6f78a36f4e663bda8b199933e2e7280cccf822fcde493e4e8286d8ce8ccebaa5caaff1e5746e46a0cdb8c75bc5d551bc7569f45727ea53487716365429bad01d24ca0456b5daa638e322803ba7917a0fc57d34f31008284ac3e9eb5474f9f241c57313276cf6ec3ecde64e9bf1f78595e1b460f", "525151", 0, -1620502750, 1537743641, "8bc5e1ce6c555d760daeca464f201ca380d6e6082b562003b04562ca6a69b4c8"], + ["030000807082c4030206fa7824ac7a40c84f3fdd5563b657e91367c311c4b8749b3e3c4ff549b06a030200000000ffffffff6edc7b27dd4042a75b61aacef738965bb06bba010ec2566515d4cdd3aad14f1b0300000005535163ac0075280d990456c6f6020000000006636a515165ac1297d101000000000863ac5363525351513185c700000000000952ac6a6a53ac5263651487bb040000000002ac0000000000a0fc1b7e00", "6a5165530065655263", 0, 1296871893, 0, "6095a197ba2cb07a369d7d91db414a90f5f5f3ea996ab9f3ec49c5961f3f2d28"], + ["030000807082c40302dd522358edd038efeac90f54bc0890296392c7169118e049c0768814bce81b1903000000086a525363ac5351acffffffffabb0d599b4c9c696c412c4de3de54bbe4e49e6ba7222ba346be1a07d90485d7c00000000003a33bbf70278b0f3010000000009ac51525353006a636a8f8696000000000007535251ac6352534b49c8b8e1cfb6ba0196e97c050000000000000000000000003e5b1d967288d813484c02bfbb098c2dda0b3dd693ed047a18ba343a12c9b20eee169f520f711329ce9bb7ead695fdc94f450ecf38d4e4be18d8a20fafe89598fad751972e2a88462715c999d91abeaae8a918dba1d10f6afd934b57012e9b9c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000048d9ea7c741ccc5fef1f82ef9da1ceed3bf55004480b5a455c1a5eeb5a3851049da7bd6d396384d030e05007d4b6e5c992c7e7f4696f50906f176682c5ff6236615d4f244788e44f8ed4395ec8f737f8977e0260527f001091a113ff9bcae7d8f6919eb5e805db6a1c5eb0bbd9ec2dd70119e715be55af3c5d4d2c81c42e4c77031851047d41be62db79efd9e68671c17801c0ab47053fbb221900f4fafa3f64f8032dfc6fc468feeba25a193b1b7b19ddd3c27664838aead6b77d9841fe51ba9ddf0a027b2423caea93a73a6e7f978490027946a6d75409486eb61d8e2473c179d81e318a109fb558ca1e48859b222239ef3b2d247e35ca2313a165b767ec255d734d0317f75f6b92f9dd11eed14587d8091006d004a8e037b2ffc685015afd26194f9e0317d9239cd9de242b78c115bf87c67200e7e879a7c8909de81fe63a3d80beefe5031e4dca222f6eec3c09ec742bfec288951c01c52750006845fc24bd840a34439e02251f5bcb71be08c95df5bfdb54b40cb2517733d037c6d77537b2e2d834a77a58030d40ca29f431c806da21b8314c8b95c42b1f33d95b199dcc4951687c38c5d408c59ba0f4f4fd33382c7327c9a3d3f47cfbd9e0a2b84cb4fd8d6a53c4655a58b5c62975d1d97f85756470b836f2c68ed0145622709b38be2d16653fed02414434ccfeb3e7dff8f2e58ad19f7d42c659fd09beb70e0b4833c8567daeac96dd9c79de6887d2ada49a46dc262fa2e0baa54533d063afc10f698691c0398e1546c663936b39dd302bfc83abb6daa64c415420adc1c2716713a89e5e70066207571daa4e52e887d660291d5f62282d41a4749a35147531bfaa1d00c9ea8499bee0e13df86fd64e276ba440575070151dd9d59e5178a11ee6b1eb110eae6bde35a41e227c2eec5a95c91a931667d03a1b2ea437ef539cde0b90e2b57f341b4904ff101aa5a5768bdcb59a2740ec8b73e5f8bc5006bfb23c54f898e5b6d807f0988064ba58b8c74c5b779db261c45b59b650196eaae01a2974c29cfa09cdfe685c5917901c07a70794c62ba9c5be45903dc2f3b1401f2e5966b28f6e9d188dd53b1c96bad551418877d20648ffad2fa144c1fe6c548d5f894489e29a309d9d909c2098d8f4e7d16e63b6e6799a479b62101396957fc00ce273ae53116e24d602f6d36a13779d1ceffaf1a039b97dc8ded63934a82e30ba8ce86481ddb785e00a3d4e7030f1e957410148aaf8ecd17f8e5651ba4dbb272d0fa5437f61e117d5b4d7f6fa4522e4ba686a6815e2040e3889d8bd0b8279c6e7e0b5a3985d377d028652d2dbac885f2f83496efa1c822726b3f7b07422ed2a47f654523d18bc2c00eeb7cb2d2d505077842929005f010124689df94a10baea8b68547ee43afe35fffd43f0a634c2e8b41d22b29addd649bd08d5e64f7035872b056316e1c6921dbfead370e311077e8ccda19212817e7cca7cda6d54eff55db02760f3e79993fc773d3c401e89547de98082e2d015913a6e9fb0036234fe7296bf20a5a1684d371af5c76f057690cc03b84d99d4cd3095efbcb4dcc3c45016ac9df7fb53888adc62db301fd79f9cbec26079bcc1e84ef2f28b5772f89ad9840e16090c514f4c4a4b981bcee22725e632dd328a9b8a04a52cd1b1ae63ff66a0aea17bf340b524163fbb9fa02cfea0535c62703e8cfb74931a2b23080069e0f9d9b520e25cbd5e1443ea706d9ee8617ab568646eda7dffb92480e602dfb80718154831b46fa1e206503fba7ab2144e88957653a06edd264259c0bc611053fc43de00f5501069dc5c50c32dae450734f7db8da7fdf0f0aa6d300bf8a0ef5cd920d5d2123858d1a10debbdee69d177c99e43c6f9f5cfdb786f577386c531aea86c9c35776194732607e9a1912238a75f22e25c0f77cd953a05726bd5826274ace09a12d91ec32e5eb0d8fb09b30a9aabaedd4e0435e03be31cd52b9a1cebea7aad845edc7348aec10472aff059d2806a0eadc6ccc2167bd08aaa3bd9949889a137da9206d0c5e9689ec9e5e4e5dd8a808a1d7778351b08832b103755e864ce38ad01769b7c9c6434eeef3c49134345488a135432720381ae3f4debda284a3bf62278158114029cafa59af5f6e04ea8a9d119a6aa4c464918f23af441a0dd848a36099ea3b0ff2480cd411e7f173ef9a798bf258785872b296998ccacc229d6d590ef2989d8679414aaf4f7fb7f9d737ce57858001a2d973c2a0a97b337a47cbaece51e10b003b30a039fef1c1459388bf25655f17fd4d2dbe38d1ad4cf637a38bc753d8274e53ec0d6eca2d84112ec3bd79a54e5f9e378f47fd23c94a0e8d69f8e75191d9baaf9732cc44ca87519c4b17172c135427e2a5e5b0ee17bcd9ab420e4bbafca7cf34ef001816087b5341258a75b769e951848ba8903777b7820131e09", "", 0, -164932095, 0, "816d649e75206caf84fc3f87fb0742669759c4bac7d89594dffe9ef971d5d3cd"], + ["fa2fcf330496fe29f2384224a55d489c062aec450f84a453ac7d6817a831a9f0b294c7f8c00000000003ac6a5141ec288fc7c7f10c51a066612108b978a8fe6d156ef1fd8a8547cb14bb08f88c94cc943b02000000020052fffffffff0322fe781331d8615214f696f882ad44a06e62b053ba545aa7e3d7f7e904965000000000351acaca19b6b0a149d2c71b84aca012d6f7de456db7f2f52d0dd64e6dd57d7f244b0d038a7f3f501000000076a6aac53006553ffffffff0421461f0000000000075363515353ac53f53b450500000000015136356a00000000000265631812f80000000000036a655300000000020000000000000000c924eb0100000000e38a59c9e097e4374850d2a7088c08b19719b159955fad0880a8c2a48ce84ce5b897d6636ca8f170e4856c700b5cbfd487bf8d932ae87ec58231504cf892b6624d313865b23ea7694b66441dd49f0637f8cc0cc41dd1dc4a9439d4111bb630d3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c5aa21f707f65aa3268d4d44a52850b1d07b272b6199e24e9d52ac5049dad14fdb698698e93cf11257d7c0de5c545ce7280d571d0b5c3f5f34f95032ef8850bbe0d491624c2f58b94a8d1c7d788055821f53300a89dfdb64257c4c47195612c72b1f175764663ae9929502ac5c9c6e0bc3ab3b069ed6223318d26c46dc849290217f8c4f9040625651d740f2bd4fe05fce00f38a0f5d8244608c4a60905ed9283032a27dfe8ec48b9fee85364b7ddcef397b7ce8a8a681a9a6a109d73621e9647d80b06fa27e871b376ff9fa656960d6d16620fba5118eae8f26057ca2079d0258425f86007be778aa6c2c72889b6f83d46ebc5e7e30b7aa1f4a603afc20e161100270203f0ee6c08716ccce0d87c3c2eb92a44ac1610e3727dc30a02013aa4098890cc021d1468faf8791f2b9f8419023ca0571fa5708f89d831aeb8f0943d5d0cd8225302024369b2b812dd511407289dbae1a187eba889d6f9fabe90a06d1638f902bb810319afd7f1d314300c82d799c4183a288a4c084381f583c35eff60265f2ff987ff022b6ec40d9c729814733736e976498434352ed71966c39fb595c7627755b24954e7fd3a8c4a6da13839b76b597291db8f454079fff8655dcb7dc5901c70f461aaaee256b5a949ef6c5cc6d394a9fb1a3c1caed3e773d9d9331a9fdff1b47162b406704a3f6a5a818c65116756b138b3ca46433d009d2b7ff15734ba78c5024ee2c0015e830cda6871749983861c9866c6ee888be22f80bf61d3c47c341143cf347cac260481ca75132be856b99319a13f705e009de2f96f7a0900cc87c40abd728e41fa911789768d928ff6083e8bd124be93e6884e1f4b5d6264a785849493efaa495370335cdcc1d4f1cec4addb973f9e45c79b6483336ffe3ca123b943e4224683c8927bda657096c93cab3183fe66224bd2a56dd72f0001930509b94fb656685bf50255b4b7d8fe95df30c7e725ebc8a788913df2bb54fdf4e7e257875bacb2a67533302549c1a2aacd2faa220c3ed63377d6760180848b2f9ab3cfd899b41af995bbe2a6d7a6eebb7ce9d5ef0acf7f5915a259003d318099e6bd29fc038f894d82b5233cf4fa8175bebedeb0b6fffca5ac2dea977fd5534bca8411a7cca7ab5879bf1c54960beca9e9ba85b518ffa19008c986fd0c04f85c92007452a2b41df1b82edb3973c283a0cfbdc48a04092721bb2a462f0c59295b712f3d7aea1f7e74e0ab5ac0bd61f1dfb60e8d263c5db3cb86dd53b014028c96511e7318044501f24b7cd6370f6858c7e673d64ba49119e8e3d9555bdead02d133fa88c74b18eebd9898c3a8c0d0d51723fb5ecdbc92cfec3023df6848d8f9086b89ed4d7d9165ed3cd0ae0242f4a1ffc888fd99c5c675ff8787323d5ec180f856f3736656b2841961ee5b8e24eab973cf0748f62eab26a447c8ed2ce8f23b18e745a053bfb8856b5aaf920b7a9079b825d1b282d1f0cff0aa2842f10b3e25c4cdc78069430c6d301aa5bb585fae4545d49783a33e390e922c4c816905a4df0f0483dd4e456be16350ded4b23769bf701e0ab49257b8c45e723f5e7ee38050aae22d4a4f6d8f6666f0444a583071e575869bc2a0834b1f261703eed8a53d6f4991403d1af85029bbc8794d794dd32e9cc7ddec5a81aa53cfe148e6bce1f3c386a70f16babc22dc922a28916b20979df505ea6cfe102dd6b6924761f15795a610a95ed00053da9557f2eacea50add3dea3f73e724e8e745901fbe9e6eb7a5809785c7713c8a5a9b3dc120992f81bfd49795532011a69088137c9dec09549ef81b27cccfdd10e9a8249a40315aa3235bc86210207ede9297f30649f8c54b394ed4615740b8cfce809ec7de93fc882f84bbc03fa30c68bec777594b7bb117f5c81a0a6ae4d26f22c726025bc0818638715d862e70fb1c20d3b7623b0b266987d9020cf33d66de7d457fafc6b4bfa139efa13386e415bf07961a19f5064dd3ac980fbe607cb20935fb7c2042c81f39bb36fdaccc6ac92fec19a42dfcb5cd56119281307f586a90df61cd284e958ef74416feece3321dbb2bd867563d83dca2f335fee3e4f5449e5ff12446ae24dd1cdb035c6a1236b651361257646420eb1f21c8e4e0310b6b260c7fb8d6ac5617f560fa318109fdf0b4905b733670da17d760ee563c8cc37d216405e368a1876aec827f25a72058130770c81c57f90841b578fed45c86082b2e144fc8233f8faaa32ceead66f92aab00eea8bc0548895f4431eb991bafa8de480165228b7e4519639d8abce6a21f542a1eae4097254d010000000000000000000000005a22b5142a86159aa141ca1754f45cc960e993cf53f025d9ddf97fc414ced551bc58a62689399932cd85f2400cf3af2381df380a2d7a00703d151eeb5f74890115130430a4eb33fa9d33e2f555ff012169cf2807628087e48f65239e463543d300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000517d1012596f7b7454dc7e4dc419f058ad9aeed1a465da3ddaf144d958fbe523349b17afaf79d9bd512491626961dfe18e6f53cfa6fdf5494e874baba7891e10287adfbdf05d1922aa1466cdc68c95ef0f25dda99a65eb6b960a18808837f38be36e1a782a2f6aa9f2a799209ce81b70be740e5ea8944c0ad3ac8736354960dd020e855e6f892b7204c7c786726f36f729431a64c4ae9dcb48d2421d48bb21296a020150cc3792143d62420b456d900fce98fe3177e710b488e71d5de814a65e6ee10a0551ce9cdebd7b63fd7350e3b12e88f2a8ba7e6e747a9eb31f3ac20c464887c44f36db31e065d9571a8ee7936e07b903dad9f6baae0e81743e00e93ab6fe3346032aca2c886eb6f50f80b7c856e731aefffc400abdef707cc9eb6f6f024eb4bc310212a4a9783f439a02d7f7ae584725a5ccb56930cd26d23be1b3b34e734bd4a7fb0214a3edd60ad74166daa77cae27715e03e17a691a44cb2649c42ff69d5fa4615e02044ccbd45c728b21153c686aad86ed3084d2b58d67b880bd07310f24e0391203030af4bf6d11b485815e51a290a53bc8d7fa910915dc6b8d2180c19f48d1b92f8608e2177d66f0940211f5dc4d3ff727407a9ccf8ac87476a2d511562bdf16081887b09e83f5ee88ffcfc5c95a15ac585d400107237f08babbb539cd216b323c201617ea0b4edb65279a8c2bfe4b3dd1b7036dfbfceaf1d179253509886a47204e2a6885cbe31d2eba8a3eae302e06526528e32bb1e61f78af66d345846649241031409b42a381d585c8cc10638ec029ab22caaf701ff4e2a28744b83122dbdba9e92061afb302c34f4f39a31ef772b536d5a9321f2fe2e574a0e6f284faa6d3ad4b36f37c9f1f51bb5a4e06a9a9e4199f408c646fc890fc3a055ff01a3eb053d3d19c21d271cb1915bc208fcecbcb52d2e2d785b33bec9dda4af4ec23c60917be76b634e85fad9d4ae201c455b666eec533b48954fde9ffde44cb0a28eca15b2101f4f91caeb22e8c1968307f9d75f9f895453eca1b74c50cd1a969f5328a60364dfd95bc12ef954a948fd60ed8ee71ed518e9b4e4bce4bdfb8e41c1d4087828f5e3ab23a4cf34235ae7749b4aa1a517dced5be144eb5e85e12c2bc4fadaa00e2a1e3ed3e4629459308166e1b067f3d8b0bbd558e8c799f8caf3d93c5a6e982e66e37c19ed03fb3f73ebdc6d1f9ba3c8305d5ddc8ee14a8ceefb6948e5f6e4d8bbcac9e8ef66e9d028a0b0a3dbfc16a88f4fb7af72527513226c03848cbba5c265653b2543b9f391d12e1d049009c2adb2b718a156bf86bd26027e714fe22c808d75c9e6da8c0a1527b72b96d8ecab8d672c2accc91654a7a46d1f88143ddf2d20cba4c7a278e31dbc5be7d7b1424ea8dfa865ac65cc8b24e4ebf4bc0a9b908d4db6fa51b33a49458a465638a9b0db216f7dac3d3f0f08a38fe327faa18a770ca7fc425531e7f0d2337c6be76aec17207d81fb8c31167712bdd9a485acff9bc2c5f63f08eba2e9f4ee3ca73874dba3ffd6bdc2042278ba72efc4b118ab03aae2297040f26f7487eeace8a27307f13ad6f2b43ad018f353192995954aff50ce429430e56307063bfd534f51c7c2a245803b9578c9834937403594aac7bd6eb937d1ad4214f598463b482c112498551c9cfedeebd3c3a5aa3349b35d4598934ab945c2acf599928b17fccefc1c2fff40aae30bb24739336158a90117075ac12d44576590147267d98047d134dea808b777d6549c3528f31302dd2c3175edfe41acea7e690a00a97c95b9cafa1ba5a0c898e9c58f2dffc1b0e8a0c7219552edafae2d744e9a9ffe6b29e420a4804a521d353f7b42b7fb593af2c6bd520193c72c185e5cb25cac1182ae418347956425560c191de6b6c4550970269a19c8d8374123db57feafc5f0289217a8709b839aff535d730ebf499cec1291a639a02d861a9f7dce1bfb84dd782815aff2b3fb8f2c9ebda5b95a1bf2bc94b6f19004380a48b750459c50ac1fa9e678ca625bdde018c2c8be325757a096d340b2fe2cafd8c376677968d047d068b9cb967eff25f720f4d675675f8858e7334d2d8ba435f8ce3da9faae1d45520cfa60e99d6976525379236fe98cf30a0c833fe14fc11f4c472e9d4d4719988b11993daad1e925b59f724440cfabe4b9474493f0944e417e97b7af2f667a897331f121a5493fc032737a3b0f7951a7ac6b6fb14685dec897b52cde4afac75f8fc8d950ddb2490b9c2c81640c6e6a0735a8d49cc42b19fba5a0be7b849fbf3a0137b2030ac8cf2251143005f9cfbac2c3f2d9073bfaf8da5b6fa6855c510776ef984d8730e088f819d8be333b73607df68ba0b8e05a935cf5c19d4d87ea9066b49ab7e63b31d92937d664abe67bc4701c70fa4521c02957f7948e17b994cb54b67b1c7f969f204996701225609", "526500ac6363", 1, 1165745086, 0, "bf0a3e38f2b054d017ae6ace00745f6035b5159d052737e0c36e3b8e1a2a5e1b"], + ["e3ece552038d6efd5132f9a734aca10520d5f75582ccae5d1e402d30ec3eff10d52ff7bd2b0000000004ac00525357e9fb20019488fe4118bea9339f25be322d024e4ad008e87dc8bea73629698a7e13a9ab010000000153ffffffff7665fcf4d0ac9c966c3067b42205a5115adf51f6415e571904df6104969ef5b203000000056aac526a633781499e027d6ea6020000000005536a0052526773a3050000000008655165526a5365520000000000", "6a", 0, 1261280621, 1537743641, "c81a6b578f2f3f180b22dc2090e1a19f460046f74b9d064520aa64ba91f713aa"], + ["c886707b0352d41452f182b1a38f777c773244cb195c8ccaaf4c7fde8505d4016f03d99e6e02000000086a6a526a51655351ffffffff5a0c649ec6f1f78e66850a1c00ba4323b9347ef9d3927273924c5809467c67b302000000096363536a655265ac52ffffffff13fa150c5e55339db8dec4b8f76f6caf1a1539f3e4179e2f1362ccd0a67705420000000000ffffffff04ece40e02000000000452526351c987cb050000000006ac526a65516a4c0b3e050000000000978db60400000000025153000000000300000000000000007ac7480300000000b997edbc5bf880b9a6b6acec75d32f50b871f1938ab586becdbe220ab2cbf578d035e09c6376022c6befb39dd8b4fb6a671307eb769391638335a236deed2d7da282c5aa270893480226e663da56ef97fccd716814f5492331fa7fb44285ec8c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d55be1d043e7d0be2609bef332834b368308df25c30145fadc4accd728fd3cca595de97b73adcbe86abeca5e4fe71480db11c43aa92d46a0edb96f63e35c6a51c40d50c56c298c24fc1082446e551fbca82f9e5262c6e4b93690be6b264bc2401d4cec9ab8821cf013d7a3f2fca7ebfd3660c2b17ff88e51802723e865532afc031839f60019264de009cc7280dc7e872239a70a93ba27f0adf4f0bbda66d4e367021a594ec2572651d92deb80d4d5301b02cb5db5b9ea39c1920a329f97a6ca831e0a059f878ca1517f4a08d0e936cf788e6f81575c04e65073692c27ea179a49bed2c721e069ac27d7350f9dcadd308e323da544abdfb833f60b2bfd9afcf2b58e050220d092928532422dadab5e5846363d0916a5cd697313ffaa78594c182384791c030ad7b017cf5825509e10c718be62234fe0374255cd9e64dfcf93639ed3ba99470211bb735c76a653adce02b0b68d0a7c2eb1543981c58476fcbfa27f19c6028bf20210d7202f886a9b3a679deca7b69ee9ae2aae74f55f0b049a0d0b19905a230f600310bf722464f353d89bacc0bd9c2a0a86e245a3e14578355ddd686a1d0b77b7a5964d083a4907192546b4702e3ccde72a3d7d4e9019f46f860f926d768c6bf98bd0325297ac780f57963b6a4c81f50b5dbefe9bc26cd18c923425094fea6b332fc22994fd8892a7f5b12747e62263e23864f3fb51af00a3c54718886fc9a4fe61f35891ede0ddf825599d6b1b731e4aa4aa71513157e78531dee23d36bc84edbfc51a7f8fd62697173a4ebf28914b5d2a9d3650e590524f014597ef9a067aa9bfed5864e236156da72e092ce516657c4b73d986095e3176d4c06f6192fe092669e6801b2f927a5a884f70ee1f68d7fd69a7c9de827fb83e88c99ae9a935eda72fd6a187bb320e43630048814a023cbd1fa77d5989a3f03655aae8795773ee83d90af4b11985d90f6f2dd31b8d7f5b3ba6cb083a6d16982dd3d6c877a76dbdf6197b9168fe6deebd1093287e2d6a76a1747331e7962cbf561dc60728c0db94ad4cf69c1bea7a8ff6a5a5a5056e46149acc1e6500cc0b9b177183509044df36fc166553d4f0d4b4d124c43050a24404c9e119a163b8b42f25092bf3a2c82364040eead7e4db2cb3150ac9830c210e678b21052685abb1872b1bad6f5efc3abbc4ef7f042803e5490c045a8e1e6556114a2e06e65ebd617d220ba7e563b0e2708457f4a1acf0564088f4d7940f6c9f64e1804fded504b47abf04130367eae2d189befc62b394d941a2b5bd8d0efe53c61e9bd65e4e0ce2884b5dd5afeef8478570499eb5b98361033b665ef628c42ec6f9d577f21683ad6642634462026b748380fc5a9763d99543f784afe7aac5999060a9a8c31e1d59884f46b8dcefb7121eefe49d7641edbf2c84de025378e8b2c4b8a84a6542097e6893056e742e61a422d64e80ca75c351558a29831d7fc4eb28b43e01f70ed51d94201d36241cb3d6ba2e03e1bda35c34ffade9891260bbdc1888aafcaebe036048be38c54fc0556664efa83ec91e1a6e5aa4eb7902c465dde0e177bb931b09fcff27489697ac71fae578e13e7108115713068bccc6d7facc9ec995de59e52ba7b715282945a60640a93775d1905f9ea624edaf88acf5d02cb14bd87db706a494de0e2b01357fb8c4267e6a38bedf961c6496b87f85b4dac3e69cf3a549fa5cff7fe4bf6081da14cdd7ee97ed8c25cc105c87720a986df41c32902c1604dfaf12e1c2aa5330b4244f26e29cdeb1324b2257677bc4b50e186f9eb6ec5eb4a5fa8c96f703dbe814d19669c8d0900d4aeefb53ce3b45f65219d37e7cc8943cf4fb32609964454c0e7d44939c90e569902cfb54990b8c296ab0fe2f2c227199cc8f65b1d93cd942bd4579b8e1df7a12ddd37087dc2f4ab54bd9d69b06e8c8c657a538424a49b4d238c48764594496bf30f07bb8976c1178e6fa91066993a63c4240b443d7c46577d4d955b06b5feb5bc88731f91a66204a9d0d088fd5f00a65ac78504a5a5dfb11512f485e58f7e3765ca8ff4c88bde9ad7f52f5b15d91274d18060b685918fddbf356cb6a2b83f1bd54867338ae56f2f88bb3000469508be1d92ef6bb272ebe578629d6b53a2c1bc3808ae3be8da90f350505a49c72a22f65e74426e2cf87a605d77ae5bdc1fc19857fee3c45351f14ff4f1380f4408690a51ac3a22d4218e4b161bdcd54b2f27d0c19bdfe18be06df877dc57cda66206fc2649ea40c9c4f022b902c5010c755401cb03c208fea7b27d1a5a16bdd0691fc0a0000000000000000b2e37a040000000028b21d47de8cec84a1336c352491c170499926f666e5fd8a439994fe85cdfc365f62ecdb29b81aa8746b8ea60ce902dcbd4d9dfe73707d3b6224e05184880015a0361f9dc1552b8c5a4a0611b436251cada44921e699cb4142d21c15b6f011cb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a6d9e18c4f14db5e64390327628b7ced8dbcac363881359c590b763e667d8228e916865fea47725eae794cd2e74b8c5721c3f9964eb7c112ba226700d4c8d69ffcea656d9222b019825c67395863bcc31f0ff42fee53ddb85f8d52069bde4cc58d7cc6178acfb35374e562da9398c77ae475ef057d63f3afdbd0d49957971b50326f4b3b2c8fba1bab68bde8452e66f665ed987f208da15ebd4fe50e75ac15190022a4f1d6b5b3a270d44ed5070f984fe6215718f6b878f61c35e4e01a03646f9ae0b07a5a3510af726e9174b2342f32ae796247693e583dbf03dbc645bb22f9de7b716f2fde1d98c8fd5318ea6f2a6498d4d8d5516e40686b3efad308ffa7f9dffc5031f49072f51b97b29e2d544b02f4d27be616705ad9d13535a8b0d443e41703bf70210d3ec0717ab8cf0b866efe052589abf9d00416e8f33c60ba9c50ab45bf35581020d4292bb340d033be7ac6d0a221838c7e283bed1374bee1be2d6d99376bb9d2602224ffd83b155eb8cc0305c539e5686d525aba48fae103d0c59225c18750a81690223dd1a74494fc8b750140929daf9cd672a4bae27d0be83ddc5c84b24555928864b4058e1054127606217a3154e9d1b36c05be152331728645e955623224b5bc136b1d9dcc1918835b14d7025d28eaf970f56aa3f38a32a00d7aa26595dd1a909044c9f67fcbae8d77806704f945fe0497975a8bee41c6b30ba55b3e019e98ca3c83f3e0611e411fd7b3a116114b4690a8f57eece045070ac89dfa4185d73291f83787bbae2eae47d13c64733420231a778ffd93f563829a2da661bc41a4a5f676e0f4c654b7011c4a57b71eef9c997374d75a26b74e68766bc1b8090748231341ec0be90c56a4b8483a5701a71875fd03c6f612da102e685ab3bd46504696b3934e60bcf202cb8f7c6915d934e4183f10556563cdb3b457a60877049724864ac3edc94abeb4dca65e617438ce2b5d51bb6808dd02d026610f426d869baf4d3c81c55468871162b30bc9fdd1982a2772c5e374c8a2aef6504ebd155289463e0de3dbe7fed0403adad6691d20d40024bd80ae6bb6136c242df1725ae1a0a0349e689b5316a978fdbff2ee389bc5bc202667a331c0edaf0b74bea38f6ba90ea0dbd5529d4257cc93e2c3d42a62aafa7bf3c708bcca601114d8f58e06389d15e11d581a4c8c50617605332791f714f7b2651dfeb4e3e10b0de13367288a74085a1c9b5a100a5d6dfeca2dc426e8c0340436b43051cb8ecdf2f712e63aa255b2f4dbb8068cd273eb0c5e78e32fb8836d0047fe322f90facc7684d06ec87460ec03d18c8d0642ffc3a9b38dbe26577aaff4392c54780a98167e6b4d4adeae58cccd86ef38dc3020214569a0624316dd588c37d0c38e895ac68b1251968c107ab07230c100fb25e9258630c91dc1ef29018d8328253b449da6ba930aeac0ddb2514162e4bde6e61195ce59cead7b606ea654e26a40a8f1c5c601ddd819fa0fa2ac2ad0232c184df326f23a9cac5f26e669dacda451cf56299822933af2e924f1ae2a7f2ca503e9b97c634664821fe6eb26ac891612019d5845243935a566dd0987ac2e6f6b3a47c4af44e6e3c14a6c925036ba71a76ae71790a5aeb9ef7fff76f1ef7206203c9c8706bdc8229b51cd5396a4c69c7d907ffe7ab84d83d06e700f9d3b96760a5cba7ba911358eb11459c10a5f824b182172ced501f8201947613cbea2a552ca30dd8f8aee7b6caf49163a8e17f3a911e7f436d2688a6904cc2595fce5407853607cb0f4ba6bedce3f6b7aacfca1bfe9c11b0416d511bd4ac02c168fe558971d7af540ee6bda3e82ce65b634bb88124a29fefd953f1254f19587a2f0f951cdf120dcd672f3707a54ef0939cc1f0d225e3b116b39cf6426f771e4cccc0c3c6db7132e0a4cdf37f8ef82bd3d14e88a1fa6df6e677ea04249bc3d302f74ccd82228a57852ac06c4e65e41abd6c4de71562a399e9c482f55e5bcecdc9bfa6e0012bb0df1e0d3c5c5efbaee40dec267b21ec05ad8bffb22470062ab30467a5f7986fbc5d6e888923602bfcab00087aded0458d23fb0f9f16cccde224ee8b5b0c1859a791dd8ffb369e561f52bafa57027840fce9428e9741d4e7017a22fa5ea9950c97d19e46dbc911a17b40d45f77f3c567383e69b3c50e9833cf5e2177109581872e8e1b71c16805f07b16ad883c35024b04c9db2c8d633572b83a65bd13004f4d847e0f22e5f8ac3aa2fc33203f29d4736888204c83a59b45a5366ce8bafea234aba9ae3844390c07155e29a2a792d0b9e300000000000000005786050300000000872d05acb19844b868cd2e9abad2befff0bf063bb68b5ccba9d8d3ac1d5cc03937fbda273dec9c6b87abc83628e3a5cbaea749e5d5392a05d5e1477342c54af1d95145921c3101d01e42edef10eb91d70667b5331babb6242efb9aaa45fbfcd600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e9436926e6fe2add97646f4c37a27cc82afd69d61ef8be19bba4a721d1270cd23045c8c9716fd683cd5558730555004675a280918cf7b81193882a6cd084f5461dc4aa4d52b3080fbcbbdac308dcaf598c401fcda82e1aca16f33e290c1b2f93cb272b650ac2872841aff5293271e8a64cb20da0a582cb5d6a088111d78ee76603279384ef247bfee6ee1c29b86e2f17123ce3f683bb0c048a8ffadec808a4ea980304a6a21b15eb3e8e3cd7e80ee1bde00247d0a15e4e2c9cd04211668191f558540a086498580ab9778053c2bc6c9df8ac3c8fa2aa402b30d2ad743c2b9d450a2ebf8024e6f65c4cdf8f405b09c9fa57b7650cb045066568486f23ba40950330ddf10211f0e5e23b5873a6507f19a0cae51783c81396556cc973edda9cf72d822f70eb030597c22f1499acbddaea07707eb7ce0dbb55cf286007cb88a92816a3d644c5d9031ed2ba73b3dfbee0158f6c3041e159b204d2a71e1c98454b60bd1827fbe07bb3032ced7d23be1b69a537519ec5b0c43b80e3c699b8a298590c6175d54df0494dd70321e582395589900382d9c35eb23ed2366c7cd136e7b1bd6152d10d4322918644c409397629a8db9e52c2c55fa16eee513b39fc478581a39838260f6cbcd8a509b20c13e08bc64a02703add48951237a7d75379c5c1f4658a41f9e11d11db67977d6a69a8b3a2ec31b4efb5cccbaff90d98bcb15494203e9c685d24f74fd610672c21d9fa0fc6030d595ab69dd29b7813019d05a6b07671e5ad751e4cf24cd737ce5bf72d185bd1b7e991fcaf5f22146d9da5d266186d862639b4be13d952af9dd100d33f3ef0729f5b69ca2e42aa5f3c6066addeafed4716fb9ac1ea1179149f55963cb7bc69b85822bf9669e1753adb2c2894f9c4399bb8d471a2fa7aca0a18e712419a00b44da7b6a6ff733ec217feaae6097c0d1a425ae30d8b0f6e8517c19a0755c606f262a2d98e5714a225202f69d1fde03c17eb7d2c88cbf32df54e6aa8789704f75446b5ece221234a09b96db2563d3825c196e6a7a21cd359a8b9724d8cf07acb90a9f93e2d241963a52189ba95df525c865517f4fdc96fdf968c934b77338431f7cdcb5e706dc8d60a4e9c0417461c323d59c96abda42eeb4b180733d7d662c477e9fd75f08be0600a66478586a33e00e162a26ff5d89e57554595ce087a1207ac2469e9c19e18cdfb9994eb8201993c446fd1c12e4bdbd9e11fdafd7fbb4b9847d1759cfb226ac26e577cc35419a443d1a305489214ab8b504e9461a3a620844254adc1f0edfe4dd946747f662ffd5980fb704561e4bb14495a7246ba808825a1530d8a38556811ec99fc1d6c05fbdb7c09b6083c8f54ce9290b51366b0294f99d3764fd97afffb828482a5a4b961bf4d5f4329a16f5e140fd9a2fae7315bb1a419f443e79e3cea93e579a1222eec8576b448ef8a62b45c705debb4a9cc431dfa4879e585b5dede4ccc1ba29d7ba59e0f78910e61221237cee6df834493460cbc210340a0da2ee0ff5742ec9b44b86133c82db2af09d07181a007e52def410e9d470125dcc772c49fb043560d79331e0965609b048432467d68463bfb564695458e2d5bbc1a6f8a74b973dc31ddc36229945ab2e7a1b8f1dd8b555fe5710beb2876f68440b7d9c3fcedf59dffba462934fc0f12ccc1ff320a6d63dde52a38416c2da42c1e125fcc217040f1d53ac1b97ee3955c9df4a2d764ce6a914bc0d059b55f77a51f1a2680e9f816767d02e3be1c6f24bce2fe84136dcd118aa804cb7531b4d749f6dcfd82f66a1bbc95c3ac45368f63bffa52f5b37c5b2396c1afde78212d784794b91d3308e43216f3ea39123b9b926cca30a27c937e50bbfe524db701a8a0dfb4b41192dda2c4b62899ea41c3297efbebf24b8797896ad2e4a45d4cbe3b6a349dff701d270000d3657c9ebb94fe619708a4f1aa3a986050f49d4dedb96ab3d47435e6112b289cd7ddd636c24db9b63cff2e9de1b1dd25ba936ec4f96554b30542579a289621b4a0a9afbfc4b8f6b6a584613fd79b846c204d691f838a3529a54d0b3b1c49141bc39de39b3ae71079aa7133eb2f4fa3ce1c62a5076517040d4b2cb6f3f8069f67818a2d0df08a1fe87367b02a0467c67c2f073c24d137fe376e65e6b03ad92a6b5ae9f6eb55546cf180d84a3a972dcf905cfff31b9a7099a86d43a8ee62ede0db73aaa0c8f4f27ba1f25e7a75a59cca592b9245bcc692a54b7ec9cff8bf05dd09443408e63b0891d87e9315fc9c14f44a83b69622b9fe1f88453608e4ced026afafff53109f63f2b5dde88a99bd5a4937e5645ab70e52669d5b29d4517eab16f0ead1ba7801e4fdfc31f23bc5efdc1aeae74f786453f2b68230f595ab92868fe69e8505b2e1a3edfbda66574d267384c58ec0ab2f350c25d9dd4216839c0d6e357404", "63", 2, 541018740, 1537743641, "684bbcf0985e03ebd6182b51685842434565e8c827d8782a88c792a0f4f1e871"], + ["2de62542042470a12d111a087e2bfa99be5485a41fa66821b00aebc9355b06a3c771b064120000000006535300ac5200231a6a2c9cd9ae7d963fb5bf96961f41b71569da1380bc55d9287399df60689d7e3d155503000000096a005100ac51635265f198caeb9784bae92ef492fbb320d7589c15e5c8bd24d621a23ca5e8c115ba1ee0699ee50100000005ac53535253ffffffff366fbaf2ed8c24264b02388a50c5f2f0a60d3611ed953c8ca4cef272d6ef63530100000009ac656a6a6552656aacbe657d1d037d5b40020000000007536aac6353636513e1e505000000000151130f910200000000000000000002000000000000000056f1bf0400000000bc28ca829a8697f953cd2c0e91a31dd3ecf02a33da58043ae6e20dd8ec19902ed4ca84d20323b7624bc6e49efbda76fadd967467c4c9c381e4aa4c676137a7a54bc767a8f1c405b3e3859ed87469f0b3432afdbe11ab010e544445136761540a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c278c790e097db1f4b2c5c34a4fdb2f99887ded5bfffec0de646f16a250d0752a8270d4a0707b059024fb873788061cfb96197a6728f47fb41b9e4e84039563f29a144f14f3d128659e5bc7a857aaefad5e1d1780801a9dbfcbb78253e3a3659c1a64414d50eb7930fac1a31f8435633d233a016938647607e7fcac19d4e36903077026ec74e76fc08cde4b773078a22e67c977a49cb283ea278ecf448dedabe7030c728c46ff7e4e761dfd0588d4873deb4f534a1e2ab15995c23f143caa911bbc0b013732ae0b4974ce5dca03d2d31a5899727904766f69808c533d1c764b8b9a1a8085d752e92f5471353102cc31c370174da2d713bca6dcd726e9a77343fb7fe20228b4c674977b589149ee76d2f62146aea119104e88c606aa321be634760f6159030a4d1bc0e624ea50b4a139796afa6e8c9642f7b091054bc0c6b107a5389752f30203d97390cf2a73aed7b18c3099299f11077aada4543aaa25a87f60d6121ad1630309d81ed306d180baecebef40200e187fcc46092afe8cd621d99268b02454d3fa020043cd684ff1a636ffbc48cfed8a9bac73b8ac0bd49c9a2ed246a66f8d44a7af92379356ce9cd465a8da7805d6e87f2dbc2e40a7c81b9212e7b555327b0a2cee3622f97f0d0d9abebb3b1a73dae94daaff7ff057f9791923198b2b91fcdbd72dbff7975be1a251632418bf24e99e6fc9ec25ab4dec40b852f6d4ad7d5dc3b444021e2f8131e7440ae3ebaf98debc4b4e28607110122ad9bb6e0d065ba28fdf30148c4b7cf3935571a15b047d6292abd64e691063a2120c220fd00729290d7ecf4c4b6d1b0ca8df5eb5f0d27a73600451869d2c4b0cc451d2e96f272057dd1c77b19873027fb6bc91f5b7c4eca929730d19546248014cbc18c11b940a7ae2f846985daeb6bc0f9f3bcfdd1db5660986ccd8734644f5dc946104fce4508508c319c75b576fa1c21cc8eb44d7901ad8e08d2226a390f84f784b1815f9c71e885a9ae154cfc3c7fdd5ec8968a76bba3ba7cb7e13a9870fbb80a1c2168c38c371699d0c7f8f4fa8d11c16ec75c35fc1de5daa33c253c2ee28c5a2a46849e30a6b9e4dfe9f5d2cedad1a77a5435b224b3c81ff33ac2fb66e17981ef8a570f7f4f3d0c7e0aa530438fa9d1326c7687157b7f30e90a4c8f53d897947adcc3104ad99f03528e503758bc17fc5c412357e22886e1eb9b56aadd51446145046d0cdf161c43fa98351919124aa759bf8ef8956639a7b6fa4d794085b125573095b76c210dfd8c8fbd6821b330662a7c09c0131e67a3d5c323cda305eb3527937f9f44d93526bb0e8591b7040f69f357e586a30132f7cc6238cc9ab47ca8773f2cc865d10c77e824f6ee52082c90af3b37693e41418d4b4367256a1a070a99e01d72d9b982d0b9055fc9e26c8ff3b796f5ce63b4466623003711a550412d6691b340a7dfdba314a6bd622c05d4ac9c3e568c85aa07936c49c23e75b1e78d9dbb120d87cdababec1a34f9b34f3fae763f63d76a3ce086f32ceabdb1130db6842d72fe50fe619980c258b7b6861eb293272333368b5c477b42239112cad52795d6a25d61dfc7d00078859a07d4737ec0147114712ad24dc74aa4a0e836805938467c7067da819655ed8760dcb57e93c0ac3c955f2b1f491a57216afde18da6a600ae26e25b58c8efb0d0b077200c6439df2f07309ff29b05aa9f595e3897a9b82f0672381cab3b3ee3a5e268f1ac5eb0ecd630d09477c113aaa901844d95a36e96b9bb5143dce226071795363c40558ce38e7c8b747914a6e3c8adc21cbbb4841820d788cfea36bb4c1418ea22bec343a045d1e969ae19c0db4f5458018bbe78f84bde0d2f4f2377ee98f7c1497333869a34eb04838406f75b0af485a01fbc952806d4e9e9101580df4d2fb1cf8c10778b9f52a627b0b7173da1694e7fba49729de7708a4b37008232fd68ef4683c648d7991ae06caff263b8d333653832fe8cbc9c2079b1aa8eb8f97cd74ef5d3be16af39046dda9147ac418855f32b33ed5a50058d4a0a03b7764691807a03e6470f1520472d22f3076959dbfe518b0e380f44c2595771d53c25a22dd33665ff210e58189005e7583ab8d9cb097b76731def7cf11847d7e0d3afe925fd9f129c25a3ae042c5cbb7b2607f3f0ae47cc5b2e41dd18f3ce9ebc418b166c5d277e581e8da6d5298f182d429dd1b97ab408ca5d9265af373f13de8a6c13d565c40604d2390ccbbb02b6fad2ee94694dcbe0a50a3b2e430cf8d63df76cb2615646ce25f6fa852496dfe2cfc2b4cad00000000000000007e17400500000000805222bc610f25e77c0f281994b2afdc1078daf141d596e2b9569d6bc29a26893f6a8b2a85edc5c9f65f1a9104a47cc764ef6963c6e6f207d5d5161cc8191ade0fe07a859490177216a6c9673b39e45830809688bb9b4b1f2417384f8cca2eb90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000092dd658059daa0df0e99ce7a4bbec9a6824998227ce1c71687f17d0598dee2387dc9c7fcae9edddf5000f2785e88df8c7fd64dac750c8fc6052405626c727ceca4b0026363bc9d50eac1d07e41b366ce3e49db0e5cd509598bc9184796911beeb01a5fa538419cb801453330aba8db398589812810d02c3a5abfb068335a0cd4030fb6e562731d3e2495846a7cae5a4b3ab6ff151077beafaf53bed5b6cb0fea660310290df7a81837e609d93ff62ae461f628cda210708d64debf5ab8080e828be10a08823dcdd0fc94a0f555bfdcfca3d6c227f324e134a8735c4d1552974d6dfc53f9020f0731a52f2b36cfdd83d962e37e5b31f6721cf1d04215cf19fdf95cfa9a02274a66509a9a7485670843a0928352fdcfaa5d1b31e0a65311d202d9339f53b9022dcd76507496ac1fa3549924f2addd07b6febddc2ccee14207eca5f7381f5619030a7fa854042250e7d7464d4ff8bfe56fba473e9e186020c2b4506399932961d80218efdecc36410bbfb1ce536891f924c3d46ca75b0c7f46fe5e93c7972118f1ea021c6af99752bc593358cc543a0d144fe234ff89d67e939100f365e0d110cbe85e67d20904bca456bda8194f3cb309cf2777ec482ce50cf627bdd1b63937e4f9d33ab3a00f478988317d3e835255a21f64e33db9eb92a869edc6dc024c8efbfc6c921259457819b3a02f2f2b4f9676a18a29fdbb6522ee7115eafe55b7c99f546f89248a5b864496a47904f5eb8511c6662010248da9fa4111e7e2e25da028d1a882bfc18a145b81900914f52123a789ba0404e1c3811eda8274eee5eb4e636f5df6cfb5f88ce231daadac6aa3c1e9a7f2818ff5033489061f18952626c4747d80e70e3af1d78398c3c420dbb5617247a13f9f8db001043015e8f565abd3e3550df9ae7f26ea4160c94d102955eeec87cb74438320cb59ad8e1d994ec9d5596b457c46eb9cd75a7932ff7d16a1133acabeb0e539b6c665b8e52610a0b9236f6a545fe44af6dffa1a45aefe57e206d574259bb5e2dfc5cf0469081650d6f8d7b366b29d033e3b14a7280e0f2e77f77849c7cf34de59235f70448a5e61d61516ff83fc734aa4da6c4696bd5a30d8e18ca04e7da3cfcea78c7c8b8bef53c3217ea528470013394498fe797ea8f465e9d7df59f744514d136d5c078200cbc849c353ad7f5bdfa98bb1ebf7e0dda4e0cb3c707a500aabdc770a5b4e81dca56c08929ea8eb618c6f99dca0cc20ac16c66499a8ac80cc95a8b71c7e5d7d8053fbff4d164bd0a05b5aae8772c3af0c54ee635908ad8d1d33d74a6eaf4ff39f1d33e754a15a3d8c104385981f051c1b7f2a8aa9c1c53e3a58dedfdec307ff7516beba9b3006b73932c4d9bf2e4e11e2bf62010c5371e6fb4bb8c761ed35a21090eaf34941aac3d45369b9c679fe828acafdf2bd12fc558222c2f23dda82a6da7cf6df8a594bd9a88b61f0b69daee6aa2923fef9f660d2f503934673d055550809039026e9c9a9ce739bf656b3efe4221395aef4843331da2c50ae2ffe263df2f6e7a2fd4d00e00b8e0163f4c4aeee12113a5145c53f502328702d86820c0ccbea589cf54cf5ebf3ac49ef3f5be733061495261577c68f560d115a1e6de5152e6a49575b88c7813b8f7b1bd59ac41984ed720fd5c035064fee9dad5e27f0afaeb2cf589ebae7085639a24431083aff6d40d307cd26b87b1d912f8481961dfb5576504019b99045d18adf0c6b61edc6404d0f3bd89a2962a39e009158f7e2e62996ae7ae2b6a985a787a13153fa3c01f652b5e29ba890e0e7b40cb547ecd9d8438e12436fe67816f7e64432fa55889cf481073fd2ab3c45140cb65bb1880c587f154026e2d0959c187959550879e0a9012db9e46d9c7685921d5afc56b2e89270f816d520adca2ae8a94d0cf1ef33cb95ac0dc30a46ec7064869b359ccadc4694aa1a691aa9d3a9489f360d9c41ef3f003f588faf18480eaa532def35cc3904fd2d74fac0da8fd8e91c7463216f5d7d0fbcc87a16dc80cc2e12b002c3bfdc9f0b5a9fc82b6a1e095f8af7a88c1bffa1de9b4b1948e857b9cf5a25ba38cb884a6a0ccc95befbdbdfcf4eb7213fb57b4742aab66deff6c9b26d9d3e16e084059fc29ef04b6132975ecee849675f8072e3916167f5d23745f98f43137d9b1adcd9becb55657d3744eed8c0dcefcc18e8e6329d54565550adfbf7b4a7994ba799ed56e05e7d45bf4a9816dc4859799352938190299869fc51a0b4d2da93c5eeae5eb723f4033347248d2f045bb00587bb02be4d6d2bfc18a5f927a67fd68f9f0e2e3ca61d2862610af7851788d3fefe0f89ca197b570dabd4bb291161e3ef628b6f3942b6d9c0ba8d4e53c299f2c5bfa802da3b1798ccc0e49d0c39580999cda5c203326a04552a9cacb07cad5850179e71bd35868803c4983201", "006551006353516352", 1, 2060797066, 1537743641, "e0fef2d9efbcc5acde65653290b292ac6feaf852a2ec657b5cca17447ebf3fca"], + ["030000807082c40301899680fbbfc04a4495a718f263174e6cbac9a7660e83b70779cb108e9c31fbcb0200000002635109cedd66047df93d020000000002ac6a7a47170200000000076a5365ac52536a41f698020000000002636573611f000000000004516a526584b500170000000001b18b4200000000000000000000000000038d3dc515e3dd5aef0651824bffb2791a5984242d5afae43fef1a3e3a90c74d68a220ea19ec5a24f20f6fabd30a9ae562607d4d79da58b020d26de0931ea1a7ac78101cac4c7e204e0f7b29c2c8b1c68e9c681707efc898b03095a9453b40d900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d610d959d446fd5233bdd87d6323cf86917919bf27177c80187548d27aaec2831b2b5b4a18fd24bb42c156a78d3c44fbdd5382e146b95738e1c35b7fb7edba218cc8e8b661ef41389fe61bea3574b2a1cab256169ed63b289d8d931510b634659f3bbf6773cdd41fcef6f3e4a8c5572d7876f415e731a03d85ccd017bcd893110202c6cdd919cd6fcccf6c772e220ce697977d6b382be0c8b01c2ec48070c3ffbc0302269cfd58fcbf68f9cd12e2a22f77d4a1f6925c0ccf7baf337ad7927bc336ed0a02328e2abab354ac168006bd246e43da09b01db38ae8d9a6f803b7d528c1018a3cb8f47f1f64e59735063b8aa819d178460e489d3b35bb8d2ed19e33991f15b1022370373befe7104e029c7e1856804643cee9347850df6fddff0a1f60c3c9637c0213f117deef099f083d51e2741c1cbefe3a476e6d90a6729d36eeafb7a958b3c10213c9a960901c9bbd7c30728261f7b4c6f4d8c2fed50ded8be4afeb3e2e6f01410212cb1c0db2f4103276be5c048ead41103d8f18f5b4cb1fbd41057c911c3bd7c603061a2450ab3d49ee721d1afb89c1b56a0098dd42b6de176c70ee69abe69804765d3363e43e96b1b5a0ccf688f75a474f0a9aadbb520d95313c49e1da141c1e993a89008357db75ff7d6ba70da1fa54ee5629b21761e46c682659af4c40d18b1c5fd493107bc864fef27eda9a38ab561724531dbdd2ab37410d7eb018f51fdabcb5408de629b0988ebf27a64f820b904421ca77862ab177c651e84ad221dec499ca0082fc7e5f9e120965ba66d49780e470d309f5c64a56e0173aa659ef8e5941b1829020f6750c81cc071829745533a3e742cd9940aa62b8e321bfc8edc018d1d9b3004dfda08b221257b321eaa0ef31b8f915fcac4a29de92fe3a5ce904cf5f60d0661debcde45e25d12810b5dc7ad6e310c12ec86059b1ef174731f767ff2eccf217d7ef65f68da11aecdf52f67189c2e0439c8d64564cfe8430edf310d2f54675fa5e179e81900f58ef09de847bb06423a38b6081bd02fa29e4067ffc7a4e42e07582471bab626737c37af63db8895d68b655ad9ad7f17edc48052662d9a302bdca686e4e5b5f6edf9a215b8ae968035b5dcaad8b018f6db8f013afb585a11666b8e79ea19f7a7bfa39fe3e0d0e4ae8f8f44756f44542d31f44abde2ee8bfbbe2693d032554e2167dc353f68464f27e62ac3a13660734696fcb40efe676e90989ea6621eee5778e90e7dd4f0322e0b11483beb53bb7dd658130fb8e53277ffc5d38565124060a036c852110b05dd5aab2158538dc6bacaa4649bc6f5d754c4575c8b33a24cdf90d01cea907efa10b2c8c3b60ceb50461f1d76f59530136d3ca79712e9f4520a74365937b63336c46d4ed116ef799954049a79a6ae8364b685387a1241ff3a5b2b4f30c8abf52172f8dd04180b36c97e0553d4d7ae01d255cabe9c3d5f60c1027a6fe525f69c70f9b463a0f27936c2b0a6574d60f0900b29c2c2bf7c16df745c5a549751396bc0bce75d0fce558fd1a399d841b338d099c51e483c905e955ca131743940535e668991fe31cf4b38afceea0849db60295ba30f7f07c12e73d854379d4bbc7dcf041e997cabbdc5850e447c6abc54411f4a4c175065af856014fe3b28e276ff652e6bf6ba354d780813d19edeb9cfb718b35f0ba48fe59cefe6baad6a3e075d19316a13ce077960b409441a172dc0454c63de96a8937069a1a6128007c5fe2b207cfa5829ee2a9643b7b3514771095bd2096ce676f2c324fe127354ea5902646fc39ac96591d46afae759af9e2a2cdf79431bb5dd5aedde4c29d8fa12f9a0b3939c5529fe2b001afb982f6a9317f8a08f39d367883046837c8d1c2e37b486c611a246d6f0ea4f592f6c8ad8061988f196068c2fa31889c7b34ca23121bc238a88ae447b4f7be65349308d2836ea441e7ff84e3074220b4d2c811022a1dd03552359970613caeb4a7b65a89ba828cfc2f899cc030502b51eea4251cd3f7eacb61f94333848a306c3c8f9e875021ad8756e798b31ff960ff74b12d9c1bd5e244de5a74a7d1764d4fba6cd3c7f2c7f3416b1d8020ada59f639974f7aad7b5df155db85b621d14c458a0c591d60ccc23e2bd2a6b7a894b1b5cc9ab6ed211599c2ee435e64d1c6783155566349e4ffdf30927755cfb322e42545578b921d2d62c1fc55d63cc169b76256eb7db22fa99b722a7f7b292cc9d67976e5212aae2db77a0e4e047147947774a960047a8d611cee5cdf2ddb87517e309d3a52a6f8c9f23b69ca645eff3c536e9211fb9aa9b791ee1ea97b146676ada27ab69adbe94bc97685cb8363f49672db4314ae42f20ca26cd9b3861aff8aaf8994931196331f992e0019beff64249dc790753b888f808dfec4825b1e77bdd19d70d1227f6fc5b8b1856a30ddea905", "53", 0, -1440455819, 1537743641, "61c9e302f70df84ce12494965f85c7fcd58b39aedff54e69ce047de1e07af7a2"], + ["40ceb50d044cc0c4409ee80b06e741794039b226cafc575d18daa8cfaed17cf0f6cc399ea2000000000152ffffffff29941e17780f6997a4ebba09cb9b185f87aa14442258761d31c0f423e3abcad00100000008ac52516a65ac6563ffffffff27938d172b4235d3437e4d38bed7189da85b5cefa3e8f7196d951554ef90f08702000000095252005351005151acfe70da0aa0bbde6b879022bc169b1a8a0da054f5dc67fbde9d225e7b3027d1b1a0de05fc030000000263ac421db66702a474fd01000000000300ac52ccb2de0300000000035263630000000001000000000000000000539703000000008e5864c01234a8e6181a5314072ee7ca587a980991ae565ed4f497418e915b71bcab5947b33b8c7204f304edfc55038bbe40dfb9e3cc1867e88124a0ee3f09c2eeb45b4f0a7b522f14affe97c39133624f032da1b6718c52f12464826e9c908a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f98a972a5eff7f4e143e7eb636741249db6e5f399f3f7e3346cae626c8047357d668d7dd51a3ec468f17c7e38c4648bf53c4b54bc90ec120ca17f17258f7d94f49a7ac1feab4beedf971bc31871e4aca3f951196aa04dc634aca130291aa38986deef4565f6850a4e7dd613708c846ef3322a92ecd7653eeaa14b71f4c6fcbb0032becc16d18053e4833b91f8c7a9a9d00b486cf62898ac98d7234b14d4ab0d70402043019f93a72ae975d3edc4d9fac5c5055cb6b2943bbdced01657ccc1833680d0b06fd71a6b38bb663354aa980c651c26b53d454d91c4f1a90ef9b56d830b21bfee7022b34c4ac9161f383c548b1a7bbb394b43774d4a4762c320be9e9ccd5642f023018a6743db460caa5eb14e9ff063420e412dd1fea178e929e4e51a886b2261d03234ae248618a82c092b96b0272c0eabc13159dd392933cdb115491b395321a730202dde851f5c7b5f95d7b6103921a8ff9836f9030f4e1e7efee86d1725bf7c92b020a83da494060fe5cb8c52d982669b940c51d2fe1f268605f5c5d237c42c1a52f030da175c8eaa68341d0eae5cbc8b6bd8730c7d77eb775200ece966c29d72c1770fd2ff608ba054bdb1ddf6c2c1ccf8e5e4aaa01e71b2d73a37a8524f21a47ab6ad9118dec3f55ce5898f1c233495de3b8a5184ed4ba4f729b52885e43ee4dbfa75f7e7f082046e1c572d6acad1ed529f5c39442f5a3a1aa2d6a42bde2b1fdc96d2de462e19e6ba519a719908b88b50c34a0f86027532a95311d25d2e7e76b37a52cfc6440eb38545ea74e3551f17e7fb396f2a43a1bf0709d9073670d70a91aec1e1d133e0f2537382a6044f4914be58f017b3cc76e1a870e6760ba1cb5a3afd72a7706ff69f5df18c427becf07ec5b65a47324c63da7366d42ea62d00e6cb8d46509d905efafb9a5da7d31f98a2a90424137c73452fe68c19bb645a43cc26565f62f1f44069bd40d772baab63ad9cb9cd5d4632bda19ad0771ef7cd849513437d17b26686e17504dc9c9ddfd97b0d1649527104a889f905a388fbc570fce83d538b1cc9286120757aec24efd5b312663deb0fa4e4e0d927fd4292167c7885914d69bd768d8184a9a2b631d9327098f338fab39adaa0abc0d2a6405a250995705b02476d239c3de94ced281f7962a15fc3f6446a90c3a4e19e424b38bfbc9f5bba6b145f3ee4e89af1d00f75d9854af86fc8c884e5a20d913ad0f3875ceba85eedd97ac23157b6290fe1c3ef6a7b4dbfe411bf9f657054a81beb4f8d1f9a17bd80b1109f43ccb5995eabb06fa44d87d155aff2978560428d4af77e5d23ee45c2b92faa029d284f354de1c8afcff39b130440e15063b7641c681b8f4fb685e09a68273d9f66833d4fa00d71565fd6e747538a1d1f29c7b33426e3d157d2f19e59db91ac4595155c7870fbd7d517c69c36dd718e422e9893ad3682546153caf4c8eb81d15a660ffae53ae82b1bfe42d37d63f085a8176625be42d5169f7d9d66a910fd3530d7c0420e567772f021ae177938382a8a48260366a0a1b72f1f863e20a6e763c11a24313241dcbe27e15010bb35f31372ee66d2a86bb5fb1b2bedd54fc79a34ffae3b32e6abf942dd88a1e83d77189c68039612fdfbd92f7da7b2fad0d54619ec3b25d61d69ec88d3fa6b870d13a8e090bd3f81efe766b6c213bfe58616682bf9f8d384f09f56bab390fcfbbf1d486c1507b0b1435198c3c708caf406f326bed4f737601541316efe47e0afb547b8059ad9f50a81cf738426bf72e504ca19d36d1d1603131c30989f3a1d55c7a34c723bfe21a9f337ee2047c2af74b8daeffccd92bbe00d95ce4d5e0dd8c58f9ac12d79a71ae4009f80aa3aa34e31a968792b5ea401c065ee8a1b3605996799a29fae20bde06fd40b0a418d2b6deb0344d2747ddc2921b90197de14f2094d4dc66a36a3a11f87daca2b617366df6c53230180bd416fe73611f87102df07802e40ac0971d9949f9aadc8293683250d6b1b6d80207f2aa16832d4cb5a39800dd61a56c509414a266a89bce694ede0827bee421d489b000cf205622e8524430facfb4efa09ef14088ca5828d0dea945494d611b9d84668ec5d50d63861b8523b14f9b8a82e8c2cff5a74af61d06cf80cc6d5397de1e4b29f86bfe0487efc27eac65d228aee4f5158b66c6e5f76f1d0efb69c2d7d7fd225b2d5bdc21ccd10aee6afd6dcaed419ba267806deab6c7085bb88fcd89faaffa13de327979d4feb577ec796e61b98fbc2a793a2b22e9f659beec4879c6733982e84fc758af63052910315027fd206284a8dfa89711e36bfa3bdb4317b251dc7071d75d0b093298128da91d407b6f37e824a108e1c3e013638a7958393eaef10ef6198e9cef44af31c0a3cd01f12ce5c8c99875c173fe791bdb82c4d7a47569b2c9df44d68a286d5aa24f10430d", "", 3, -1677601200, 0, "49fe41faea03f5ab114598eeb3a8cd81d7c62f1f7cc3484026e07c16aa3d3a6e"], + ["311ba75704b6e2a73728acacf68cff8c9e6d9dff2187c218bfe068df146008915477aa264f03000000025351ffffffff218f5aba35310bf97ad8150d1a565f794983836e407b2af5d48b2d7273a6b90c010000000565510052533eae4f578bccc96a5ec604d55227d375cbba712bddef7690a0b4e0efa0f7fc2f7897f7a803000000075200636a000065bcca9c31ec1965c5f16e3205ed5bcc3ea134718512fdd0d4c1955cbf879e3b0c9991ca8602000000090053635163526363acffffffff04834ac1010000000002526301e4140000000000001c8a060200000000066353526500526704f0050000000009526a51535153ac525206841d2303781bb101000000000000000000000000bde32db07c4f3f221abd76850969d1f94870eb6bd6d19bff733b0bb4d37a0139becd3dd533f0c61dda1dee166dca881513b55682056d2ab9546f844ec6e2a5a271626f9d5e3da7646e4a8df64da7314bef4b123629042ad96af1458436f047f300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a9cabb9a9fd89f734432132aa974f47426c8fce192d497c5d4d85c9b7df2caa75d89d60021f7106f9ca17cff370bf3e9c96c624bc48d4d076c65208a366e7f5b187ed0ec970abcae484880d5d80cb637a42873d46532b68a3e470445fd256736fa83738d9967a6d4802ba8d3c290e5940c755be867a142ad788bf4759a19c1a303004d4ecdb38dd1a1b8a66a9711c6d03d14afb8382e562fba628866868f222fbb031b33e8c039b002adc92f0222b55d11e6fc2b6c60d10c12dc28b5b7841d1547db0b08476ee62e9695a1567b3f56869ea9a3445739585d527ca54c6000ff34c8c4c51424f2a77bfbfede5be89164d6fe8d91399510859e26fe5e603ce1ff52eed1ea031c789e39ffcf455f8ec4f7d8222b06d7355524168ea67d7825565fae0da7d4ee02245b3771ee352611ae6c345f7d176ff771d76ceaf1938c282e3c563c69fd587e02029910cc6b06becf0ec87823bd83df673f02f3c1cdfa119a74c71c065071288502297cdd934fad1a9a5ce699937e47dda3e15dd223b2a57f691c5349bb585472f2021e399ff4d2b59c40a2e760cd12125d93c86bab9b975aaf674f8b10663ca26b363fe81b20c595e2250bf56f66d4752c2925c1ffd5be8e1d56eebf33d70c7784a745ece2941f8a9dd1145621ba3385e8e8ce9ee5866fcd2d0b82e586722a957a07d5e11255db73f26502dce5d18073855133c71834c98942dae295d8f2caae57d7fdee8b736cfce45a1422eb91a3d8f1a37d293345d45c5e3e2c471d5be0003c07775890da0f89d79deadf1e3928945aa62b3546ceff5fad5c2fb6506777e09173332d007bffc6684906457365a4fa6832eac6c4c22c3974e0f2167a960d9539f283ebbdf55599532c228d037a53b863d88f3e6c1c4656fcc964d7c8d536fb98cec9a97914005050dc71eb83049689a6edcfc6d6dff2ae6ecca1eeff29b1a9588525b8d90def6a402feafa1d2d947cf29d691cbf57a546fa1cc2c0c358762a24117c4c1653040b172ed9fd2486c799ce87a25dffd76625616406b7c85dda0a9224469ab862e5101cd50508f1f3e50c92933827a00e9fccee0f75d32441fa88f1299e67a1f95d4a46e51de7d6e25720d784c454a1dd5c8aad4b1ef47f01fd6ab1a84027aed8f73c05bc9171afbdac801bcedd90363520c13a1b87f7b34854c44389e6cb3186438076e4c4ecabec561df7f83d58efe1f56004bd3763560a905c5256405b21ce01141690343948b696eb464ab831d88f389a8d4d359833a655f7986fce5225651c552e60771ae11214baaacf8b8b93288e94bd1a60023c735ec74f5d020e7b440cb7b2cbc6f1c1ad12ca111258c2c097f9c9f2c29b8305e8577775e8e6376d982610d6482fa7452f766d0887fa699ea3bf1be4aa90e1785f4bb4da34f448da5eaa1fcd483cb58828885e89640c63338cd8b5fce649c6aaf1e16e3ad41db90a679e293114e6be5565b2c793693f31e29a6efb8e8a73859d5bd6acb4e813d968ace2f805cc098554e12204384f1d07c693216f125113a801df02d50d5a8839132d2cb77808b69bf20433eedb35f26cc121bb1b20287da827b872991f16a8571aa74235cc6b03790b52f48e7f4ba331d9b3f84d9c8f951abe7fbe6d775279c35f904e25b0d2d2e56f3a3a5c9da03f8decdd45cf4c3be2c7bfed7c6759fd925cc0c1f4bc6107a3751acacc06b834da4c163d525b9916d9943de8960168fcd5f3a5f78705e05fccd8695769c80478d63d5f5e6042092637969231d7688ee617166552d81f8ced2600e52fc917297f0798c275780f528441769380321bec8edcc7d45ba90e408d22dd8691c4a78c4aa783354230d7f2a2ac1dc0a25ee62ede7978127ddd15c2e07f4d6ae18e66bbec49c1978aa27e65dace8d70fef14d9028dba0281ec666a0aeb34a8c6395eb31ed245e6ab0d18be85ba12ac94e4f289d8452b034a5018b5d9883f2145af92af79d5980a9dd05fc19324a52bffdef0a4c5a90942ce953b387b4f6b4a7b3cfcf85cd23475158dcabbaac9072a760f096f6aff03f147bc00847b06465d12f0f81c9658ba962c132b008a82c52f2a28982ce44d5486a39f9554e49b0b9ed527ec70095a269565a7408d653540f0051c916a81a9824be272895a991a4b4fa0583c8095b01e578b47f8532d0907185db81e42bdd3323f225f527b3e9ba5799f954a718e83b52c83e46ff6bbda16e1b95e92b57e556634f1b28723afa1f7838f5ef9174de926938890289167547d5834661a0f2a71388417259640a1d4400002f0091aec65b51e2310800000000000000000000000000e099a98390c3a5dab62ede479139c5a84392fbda2e48e4ec4a5c20f8e997cea8ae14d51062564808c8cf2e4b2fb81bfe936f51c5c265f9bf4b6068319361e5f42c61b4b627178e16f14772f7e2a5f030504a59d67f695750f70760de5474232400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f37fe34e6b6cb17b1690b8dcda49b7c3c78aaf3b8f103e08973e066472bfd7db12d1db8d718432535aace7980896adecf280b0cf4026d0fc6024f8a040062248f14640f01e16737e5f83b428c21574b54b921fb9ade8e4f11cdec5a39108044115ab1da12c4b47a3678357d48c7b012eef518bad4bc46abb6edc716a99e42f46032e368aa922a012b92843a1f09e2f87940930fe9a1a3ee34f877a6c6e665fc8e7021c9934603e10bfb55e133a014f7b197785ec4672becdc2ee10259f7ca6c570160a057f3dc8c37351d08535775b1a9f5985a50842a80d001a7e8f4ca6cb1bf7c8d17a1a7332246798736e948bc1207329ed9b235e7acf0c0508d3a4f3b33f1a0f7f022fe7050e9d8e47def0fd11a2c63fef9973b46cac038033adbb728b86ee76973f0211cdc26130f94f18be0dcbe49968fe73c853596260710248b62c790c92ab007e0229baa333bd25bbe2cd36ed889d004a424ce94d1864587465a2ba6dab54a1471e03034b5c056017453f7d81d093ba2712eb41e60b0269f98f149f683a55d7a0163c032cb45893a583ac070451533612d6a9e97b6c663d393163046a52ebe98c670528ac537401aec3a929fceacf513351d944c4fc4ae5321c30b8dd4c8d9089bf23dec268aa13717b2da4c4d7c2beae3682d481f9f89dcc7d822583bbe9b2ddfe84d8581ae15f9b6c31746f5b4f41cc1da87ab168df67980f72a9e67870777fd4f6db0d01c535eb7d495455303c9b0df9a6c7158590eb37dd0fa5a51dff359a5c64c939d44ccada60ffab14ec7d6c8c8fd34c9a17e932374fe65d08ed7bb5f5659fc101567b8e116453afd2c7bfe4a6fdcad9754f3515252dde061c0551cdba12255223038fb1eefa17e51dbac746a0fe4ffc8118850c661769e6adaa8f23d6416ec64c4ae10abbf0a90900db349e3c3a635ac4bdd959e861353da3ef82c7da9be37b55309587daccd77d9539eeebc526ce6dffdb30449b88d26cb1281c69354ee39ddbff03ef47a7aca745ecd6fd8365650f8fcf4c82159280a946b0fd825ded060810d19849bde55a36d1e27ad33e067803d88bcc4cf3ed5ad5047a2cac976b51aec2e42afbe9041067d50d9d34533f0f51c4fc6ef104a919ad808ec2c36449fe959e8d9f4cc3bd5bdefe7ad6a695a5553d24738540d9dbcc391b090d374e0923c043a3c81b21ffcd785b0dd87dab581fce61cce3da7184b2accfc05133651be8585220f9fca5ba7725f0c14150dcedcf5ee6400f54ccd0a6fff2c91f5209cbe59d0e201430fda56cb1a8ce579009c8e8c63cd7912b4bda282653b8e60c34292a3a72226d1bc96eae12cf234a45256e0e94d42ef0bf2a467776e47b0091ddad1fef83973192671bbfe8732e011837ff14a69388c650be9cf4ed1e280385432a5edc3684b831130e40dda7eb48516228c301994064a4e9b0b93a589bf9cdcc5a2c9d1b718a78d20a3b4c4ed734aafca5614232da8c156ef065caf752ee1c6e337df64f29d7a41d269fb56059fd909eabdc18d0fd3d9f1a9c29d3de2b20e31ae7756178a3641c546b6d8efca48ab72739617f22d499cfb8af5ccae668e2a275490ea8c570b7c0bf1030cebb2d735ee1067af967472ae876f2333351fd23d357cdc80b489fbf3c25f08f34aa5ec08f059a3ec79816444908ee8d1cd3f7f05fddedf0deef66e4eaa8dd171ebe92be49b161f09071529679e869f4b1429ad5174e4720ce8245a61c90aa5de54021ab57cdd99d051ab6036edc8fb249bee71ab16f95bf1c265475ee2937ab760a63cd31f446a6d667f4bd3bef171a8ee7cfe09418eb9be0e982f256a2f2ef45845ac0b1c74f72d433447b7446f1a9a518ccdd73756491ecfd7d3349b1e764ce51924c757cc782e2e7152db89a35551dea0f38683bf3d1224f50b2ec61800a23fb3e262c11feedaf3639576b08052efece948c716763e1477ab347e2522f7c071f5a61049ece4a380947c12acb1ed5ee10b5d49dc70ed18b52df7220c5143f727e0b16299b5fdd3808fe29af84599643fbc08a25115a53a703bdc97688650dda15ef4b357f81bf872d91dde8069037c6fe162cb9b3b14d928450881238529b5058f3f717af30196368b0216df37649e64381322967fa44ca676e6da44632010d2e7edc4692606f096ee6567f2b957d703cb4ddb618eeb700915c21aff10b453f6a52d59807c9546b2c6df5c752222f00d95ff48560ee05cef1023e4063be7fc95ce4fc44c3bc95bc21c75255ee1ca77a40fa1eb066418027b4899f6a3a5d06a169df73706b0b1bb23bf74e8a800300000000000000000000000027baa784dfa4d7ba7c644c0c915b21bf08f3e6422595c08d2b6f1c410439562ec1624c16709277a6f59b7767aad11ef5efb415a959de81390761eb10356d0584df3e7237d71d072e5164507517495fdeed6196690f6e621d8f330fb72f8bbb6e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082efc9873dd9e9b582f49a58d3b1a87571aeb97a7f2dc6023227a80dc8e61a88b661ff2503a9303630b7a4fdf0e1dfa2754a9b20239f7d5dfe1ae16dc561ea07c12c1e1c4f57aedcb18f329c6adcc4579c4b16bad4e62731af5775a4a13b87d0dd1f1da56940923e7a25840db37c86bec84ae4af0363123bbd2bd0634e43c9b0212bdfe1d3cee759cdf82b2310a539541982d12a85faaad7f5eba107382319f9f030423f742d2a37fd264ee908f8b21c4ef1478ed047b5b875a91b9908bce7691110a017e3312e72aee759defcad4e9f05187a939b2d3b087984c86f09b387ee3064d50e644bdb2e498e73da09cef5fe2e523b86248ebccfdb43e38f6c512625e54c9032f4ba30a163e35ae77955cf62780962d3833ce3542163193c9978146012e09f6021c7ea9bd4938f7fd9ca7caae19dcae4b24206d38e4401dbf82c298e585d08a7302036313dc839c4575824bda27dae899ab12fd4a069c81a97d1197e0a7a385884c03262014f2b344a746d0c74dab1fa8835d85b062dac298b68bcdf58662b746ab4803198de4f794a4dfa3360a596ca252c45e00cdaed128866323cdf38e1ca196118aaa070b5be9850c7f3ac7f8127bd6f2a4103470c1bdf283c5810e8a5bbffdf7039fae1268e9ac4780747f0fcdcbaec8871ad567b3f0beafa6020868652ddf7b4467089d57b40cb34ce099cd3124982dfb60135ba940d8910bdecce575a21a20b4960559fe5af649dc46dd6c4018a107cc9f718449ba9d9b3d7b5bd7513a030241056827bd19f72a4e8cd3ce1030efc1f12ef4ae36fecd203339a570c7b67e5e78d97923608f540c550bf02ebcb5a04791b725f4a52089c0e55f21e829ef9a9902e4043530e9ed7d8e9608f23f3a5a412e58e308644a903ba19df1c7338ee6b4ea9df25bc772d05f100eb35a27f6386b4f7343c04148d5c41764f9fc0aac6e7c70fb3d24b4a75fcdf830e6209431d6ca88bd0a4b29dbef1780200bcd63dba81823b2fcfbd974a72deba7e702cfb7a98251d3ffabb8aeb77355f982a4f8a7b172404c851280dba2815e3b7a1b5789f679011a681bfaa8ba0684e4b0619c36b4235ecb47c34807fe6d0b998209f53ffed72c66498864590ff757c27c1391eb1e97acee86dad45268b72e331cf6aa299f61028d4a9f8d34a8f8f084f70dbb10ee83f1804ae1f84aba33ac71bf679085f01091c955ab8f76edddde16c86d8efb2de4b59d27abb72a2db707df3208c11aa02cb579319a030525c1e97ac6396c6ee9d6ed2ab4960046c64c8e85529d79805b8156ed2ef25acbac44dbcdf9587261cd8ddd6c16232be92dc8a7bbcad8bbe1c17a0b6b57ec92ad488cbd364e2d636ec1f1e77838eefc90ef192253b9a1d984e06d7e3a0299856031ecf62c006a009469cefc6d1793bb4ec0f21988f5be82f2680fae4b22b1097b3f0ac5da321b2da7e9e252a1bd96803bc9686e89b4e961960b5d3056c8d9ee86b77a70c0db2bdb37038df33a87d4919f8a3167ffff3c66f1d0f892cc56752ea9515b5d94cc9292be65372b48ea77ff4038a117a00ef67483c923a7c4ef2d9bc541044e75a287223c233b4f617323011e1e27f62f01918c5da0634c75e5858b5d28f2bb3626ebcbbc78bc390bf9843d7402f5fc637f03ead0568039f8ec08890b63aef772182c2589437f54b7de55b9f24ba3165bc4b13e349c44f652cb27bcb3b7b73a5dfb2da0983cfc1e4cb26d3cb87b0a2fd63562e97e473285bcf7d905b34a3e78f353f4b2477c004157c4a9c2c8feae02a1ddbb0195c5d39060b5a2d58a83de3707e15298c481b7a17079196a03b392ea02ba498d3a157d20b49d7ab1c938421c72909698325573db34e2e63a8b6a4b9062f216c47ce5a484d10db34ec81e167eb078f86c659f04abf1643c92697ac86a2f61ab860ec9b5d69ae9e050b2b2ccd72fbca72aca11ff3178a166b2845dd43a83e6b31dea2b53c732184783551bb465af7421bae8d8be6617ece722add5c0975176ecf24ec303585741341393fa3373ff28109a8dbbaa3cb594357a67152bbc4d03257c69c5946b44e494b4ec208222efe2e1414d9c20dc163d614c3811327882635b2dd1cca614b4ebd5668dbbe03e4ee64e6a7644c0ca1f68a3db000bbe76f8ac4ae336e2911b9723d03ca479323fb8469277f39e4ace53077277a8af1ba2d86a68565642baae259cfb19e73b2bf7d7479a699e56ec9e67bc6b72d54289ae7eae1343c936c55ddfd1cfc6bcb4613693c3404132d5f9ac3911f4617fd1c19c2cc0e9f00ca6ed7c2194c92562dc5ba438a007959f65ca60dd8a86124f50fa844c5d81014e3de943aec7d9528150f11bb7912758fe7b906d0a861e60ab28d67ae3c7bb79e70977064d6b7e849a28efc350d1bd42b940bfe036d340d0fd71de91e5597e8db93c9f5c3f0f", "", 1, -45765946, 0, "66fad3918b8179beff60deb2f735003eb4c14738105023f5d1e10e9482f00263"], + ["030000807082c40301d89c16a0a4c65b41f2409a20bedf3ccfb5aadcbf0567bb1e5794add0741f191b010000000151dbf57197038ffdc803000000000753ac6a0000655377f4d4040000000008656a52ac53535252217e71000000000009535351ac63ac636aac00000000e08911d50300000000000000002249e4030000000018262d44c064b4b127782c09c3d737b9aa5a9553c611db30e4b9e14fea7a7882d40fcd9a49699b554e8e45a56b9c3baa3144b8d0c400648204833d2cf6d05ed0d416b3dac08140cc5d423ecd5ffbf4b72bd1c79e669b8377de179ea27c98b1d1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002421030a765bb9626d888bb125c24d52305acab1c6ace5973b836c8bf7cc9684d8e8536f2f21a2fc22bf9e7809b9f29092d5dfa8e7a9db4f49d59352d8a6a034161e485fa1c7783e3960b1d2b37021ab39845541985f2aee7edd37b431c6245270b956766ffbb3a56a01621d0d3203febfa0eb16a9f5f5fe74c77b644e2ee6a602116b18b714127ccc301bcd431bb98b7c785a8364de39feb58411e18144c53f180326110ad41a1fc59d79f88ebd7f2b511bcc29d64c61531c17ea4161efa774a71f0b07f210e684abd4d36caa252d232a7e223c9ff68bbf22c3956c58d43c14ce2508b445e17a077d02018224b2cc49ab00801bebccbc67696458411f5997df09c584030f43f479714b6c9fc609f3496aec403ca2d61f3c1f8a89c5f24698d8eeb89fbe021090ac0a65cf686b7f6b01339ead59244ef08375a46e0dad338b6ba238ea25d002076f2d8798782c31b915694d7e991b451b2ff6370b78d00c76c41356a6bf96680221d09a03361e5a29cc8fb05306123c39f7a9249ee80ac2d95032aa39fa9f7dae0309697669dda3acb893eb9e8d4f83bf917436fff0ed55b29178d01c0d4bd3d95ce861e4f533de852c8327d1d5a459795aeea0aaefbb5a894cc6f30f5c602e226bef1449e04f0fd169e223f6a49c39bee2ca3d83315812d760d85c55838bf39aedfe7b9f312bdae81133cfc6c5aa445d77b71de8ac6965c877241465e47bc591d3ee7456bad006c054e93263b5cc57db31cc82326a971f8946ab246a6848e2c1fb854f637fcab3329662104462c607b1611436ef4c9d92e5ed9937a6f8f529e32e1760af4bf08730819570686dca5ce8b91d75f2cabde30b9d0f8a0b213f0e12a3fc4ebb4723bbab39a97dda582e8538529acb5c8a70cc7365c9ddd177a486158c4b07ca8b4fdbc742c2d906afe7d90548bb125a8b3130b6abbfdcb09d85a2938fefbd4976750b48bf837e9b00f7d1204a1bb2e954645ef67a1a2ad271a5ac0863934b77d971524d11b4400d783a66b3f2a3f156a714244c7efb30975be2fd7098f73494ea43774fba7bc1e2ccb265c3b764a84f3a78c0f878bff72e082fabd9dd909d7c870381cc35e01f930abf771cf4a52c6d0b557a161142215add34d67bc676dadaa9120b3195a29ee087f50e1db5d019530ecc7d265f5dc790dae6f056b63fb32c895c5494ce4c5784f589dabb247b9680592162dd809d7152d04609aaaddb2b3fefa56691f256878c50a4a3b5cb27c30a59137f72907eb1dc3ed7381324d7241d792f9dfb75fa731da451f9a6f226d78794b5eddeb67667a9423de64e3b7738b2be63b5adacf3ace36976d5bec8833c90bf18ad17f93274b965252b23fbc9ac2a2cade1b2847584d6283fd5a08b073561ddb8ac525a294d83298c5b9641f44641422db498cfcd7a0aca9b0f0653255948a045fc1bcbf88583776d0f22579af7fb262fdb0a8951d21bd38fda6b5bf3e7d761c118552118badbc04a252bc21ab6d83e7e86096070b0ba006a2bd05338a25be09bafd0052fa2ec88e555dc527c87dd8c8f7182d4c3ae6761845ef65d4d6a03ae24c84518d42721ae09cac0280319db9acee3feb3d2104388244c4de29dfcf78b8f24497f6198e806cf2c3a001aeab7a2f5bd49a666c99ee53f6a57b8088294f2d28195a893e5975c08b976ee9ba2db92ba3804f3c061dd67be9c016fd988cd45226fe1263e6a1d88948046787003d58a50f77f489ada211ea178594940897f5f944102c296c90ccd0babd5ae2f0bd935dc167ce013320ca905654329e0b7afb36fbc4651c23817246ce5ec687547be38f597fb76a2c743b7db2c4cb361465244eb432223981bc100a392a1b8aac91e1d7aa105fde160529008e320b1231e82c8ffbd413fee9fd39dbde7c7b2eaa58607d5fde999c56fb91eb95b62940940508aaf03e01c37f41ea7be307f67a60b582355d3bc4bac5bcd2265a96cb021e52ead09f5f58221c3a5cec7c50d70e7179ea27fbfcf48352343e3277efa090d3cbb80b0cc98bf3ef237826b7a882364618f63b3a71412fab69b51eecf1e2353bde38f7ef974802c05d5567bd10c4a19aa98c56e9ac84321a406901297239f5a87d3172d6b5f9f3ee26bbd8e8456f73ee88a5971eaecda003140cdae02457a720ee387d9a7e4cde1a2cdfa1fe0b8cd7a215aef484f1a1ba7c0f765a4cb533c829a14e12775d8e9a951666aee2fc2e4fa9cc6e764ddf492a01a88546b8bf1eb9817b3d30f931a2a2d724501d419d2740aa444a26b2df01645b8169f146d79444a520000000000000000c2084a020000000011b08a215a30b579d4782aa361d1092c43e84faa8fa3eb3794002d54cb57997e9a2a03260eb4a7c9a3e2b5811f156a810e04bac96831f4b6c04c3d5531ced5a3a870c3af5fe94323d0c3c456f3f09f646ed768bf6cbd564dc68d34b4803a702a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e2a143ef8bac448562a4214176543754250fc19a10cff80ed9b923859aea2dbbba57261e628808913972d84ef93528d7ff0300ff5b35150dddb57e7ef792502a19c5f17763865ea1eadfc2298869c9edf234d84da242f4184c60dd87293f95eae1f4c3f5124f98649d9dc6447fa1466b66c21a119acd1331b52ba40e489e1154021efeecdf08efe108ac0eddc88c7d7f990ccde5ec906cee559c681685511725fe03014feb7b1a232eba277edb4d8c85c4fe28fbe01b06bdbfa8f6d9b9abe5f7edc50b015871c3dccfc8806a199bcc19276224f2274bd45b8583d49ba896823f43acab2fb2e70235c6304f14cd3a7abb235c00543fbad90e53b8326ee204b52ded8011020661e2d53427f70a15bc45bd4bfe3bfc90bce89b1309fd61802857d89b1e34ad022dbe15a4e9ac22ef0bd05d7033e02e8ef327a5d385e51d2244853ad323611ad103172a4555b6d6106b7c3af51ace9449289db9fa905908d548a5bd061758d7aec3031ae33715d17b6fe3882cc13e80fca69b41b2d9c323a4ca9faddbcefbd35c396b03113df52710264bd3e8d089bcff2e0803df08f9251e35512b0119cf03099f88951cbba23ccd9ca10bfa9942d0ba5eaf0bff6fdbfb1994eb0403c93395528f01b96f300c118fc37edd2098b047e07a0108e22d155a76d3627b565398f34a18ca0e61317c7c8281c591012792e30bfd420ad6aaa87816de4b229910c2818eb896f2c2fdf5ad5ebfd8b8be926fac2a1243b8a054186ee9b48fd8d068dc278604170fed1f335f1de1c1a964eab8d846065a304cf0e43fdbd052935bef87ab389a50157a444bc76d54ad53fff0c5d1ed1dfd4628205f444921e189eab498b036acccfbe1cdc6483aa054484f247175a99234e2fd5d0330e34717406bc75d0170eb4d2549164baf91f9e1da5931c536cc17a073b8c975a00c8f90114d54f9a6a9b0dfdc763bd2f952b6844a518a812e80228a00049c96cef16a93ed661bdf17311971ce640302a3c2b850d901d3e8002015eb4fff4ed990d75a7717f8cfe66d0de1d03944ce2171204b861c44d3bd091ba22132b0c795235b7e126ffb35d899d1f4977126988cd14bd014a00e4e4c088400a50f5fee25499db2b9c5b701cf44aa816c3a8413615553b1f5811e7116a578c057cb677269b5d0f60b2320b92309f8799da64f00bfac75bf91eff640a4369c0a43c6f648bc4c19711c1f28f0755d7ee187a58f24203d0bd07541f2cab819ada47cdd331a285473f758a3831b21e863a0f994cb890b80200363a6007583bc703fc1607c1ac49f3b2d18515991339da89233ee1bdf84c48021668171dd8a576f2db74ef1ac50d3ec2f1c0d6d1eb844b647aea5efc0801722a0021ba1c4f1975c88ec4ce0e3f05fabb91e454c52a3afc581b5b9cbe4945eec77196293c2fdf239706e818fc9750fe53ec6e8b29280c6f602462de4dd741913beeabe548abba7440d21225ae96e648a7654f907308d514c4aa9a06487f3dbb41d9e20e36861a85cc19a3d2c0cb8c1017248c465d7dd7f7bac840b59dfcb45054776504cc3c64fbd8ef6de12514b0c83610f64bec5ad61620203db89b5f0bab317b837caf85c7d5ad88a9c77395e318d9d966cdcbcba3c9217e177b9e6ffa194783932ead2db262ecb4b6005934de7e5984be140365503e904f8599e29df4c1876000b9d1627d342fc6479bc5597f9a094eb6e1ade1bb46220a30dec83f0bab1a824c1260147330cbb60f6dfacaa8be10e81c3f35696a3c33827f70050a3569702fd8cc237c124a881e0ca8f235125d2dceeeb06bf33700e1bd90883849cd1a6bd0b2fe294a192d97fb93c65b06c9647d4e3426c56a8b2caeacc7820c880da9ab7716a8be24d7a743a944f5334ba10f930e7341abfe5887502465de39dd02f1f0c061e77765c8db8176d6cca482be85e1f81a6b41598c13609f573cb54c59d2e54ed406f5459ff774419ad0c7c773a409a2b133bb6d085091a56259b769a3c4c3e18bf25c909b63af58290d16a29bca79900eee87957673c1b963ee6efb3552e3649e63ff7a882691d2c15119d96205e6fb7028e615d3388ef5d1aa828a5260ea1bb1d7cf913ab3fe33823311c37511fac95356a097b7ce7b5664ccf90292738175ec2c7db4141ec3c5c25f1096187452152e18abd6899f591c2aad05dce2266839b282491bf8d902ab056d3505388c8ebb017589f02c35d53982f0aa5161cc50b06dbee65803b7d1fc21a8c9f0705835a9135fe7430fb747ac2b3f5f9cc6a210eeaa4a4b93e5ba86387a009c184aa0c05000000000000000000000000cf21bac2c6471af3a3cab7bb90fe6576b07e2fd317cd6306cbf4c86c6947a8698c9b06b8d0ef244346de852484bac0e6ba7cb68159674ab5b1b425e7e47cbf4217e6f7117032ec9c4ebed587cb9497d446e09d4f01b470463940ee1c7937498500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab5368e37ae807ef873711d4be854f589b2722c66118b90645a97d7977cb7e09ede6ba658a6a0d41c00105386e4bf264b74f06b09acb270220eceb183e910bf40788c9707ced0359c23c68d7b8211bd0e29449a5e266000f77cba8db9333940fdfccd673c8d9058ed33f4198ca76f90401b80a299b3cd1735cdb8c2d0996fac002165a9fc6aafd40ccc974e343dd4fb4d6422f8773c9aba03a206a495ebe57324f030faf36765deedd47a9d998d19a4ab524baec92f889d40d1b2e710c9ac62487a90a08b34bda6b94e2d5f20ec0968a9b7831f867a1d11a7e1fd3e2b3aa78efad6570ee0808688206f54305eddb3144bd01c5574f4d270821e0a75c3b5362c2dc1fb70212828aefa3480fa3048649174ed2a27e5664dec62e6b7fadd256bdc928e0d98a021129c820dde1407c3884c18d7d3b21a20e43e426c2429338ed8c6d3e6927623e02210b9ba12e9be712fb0197228752c0b02d31e692dd40237e9c70d4cd59021432021ac55322ae2a8f2533a02210550eebd1579f6ae4c816736be8ec0e4e7230081a031cc6cac2d73b898c70878714901a5a675865926bbb0545f2d29cc9b595632c60fe25c617ade74f810c8184d3471dff70421b65b7d0f644a5907c1c41c7e12885acafd0895eefab6762143a5dc02a15cfdd3fa7dd04f8ed58bfc07ed8b5219ab2c5fd4cee74abaabefa1275a770d19b4f5967c1f625707d8e09063961eb42becf01d6e997b5188bb678da3078706c76cfe4e04d971626f0e5b54899b0fe25f86d78bc77ed37193ff263e3409ddf5ab1e7cfb8e223def17e74f48ed62301152ddbd77fef0b6bb0658d165bd4040f2ddb37f6454d1429cc587c039bb7a79a742003d496fa9bd769ea38518196ec3e844d4e699b19007e7e9cdb781bd33c1b25af0477878157e977dc0daf69b7feeb603aaa2e428aa57b63ae843afe3677ff328c2b1d806743e53a1e244d6b361ee033fddc41d25cfcee3ff9499c6da38a42503416e2a91c89752c1259c439f0ab56ef5b015b1627d7cf86076ae25f6764a920ea14587b835b3518a45e15b3b665da2b1b48baac95ed20ed7abddec0908d141c813604f4b8d28e7dd8f78156be1698d5bf9e537f7bf01fee719307bcaed94c606fd6b128a82f5d7d5dd5871cb94f6a03b44aa1a3d0714fbc48e29ee95e54e4cbbfe9de66f4bcf793b1c83f1c36f49fefd1453a23bc663f46d8d1443d1122e8ccd295a68a0e28e3d269a22970ccd0b1abb2de34a659dc665fe3fd2ae50ef8485ea448b01cdf8c9b529272d56ed0b7b2c45488b6384179a099d2ad72d6c0fb28c8ebd40cc112ba0c31f55aa653be195bbd6e4bca5d4bb949263573d6a2b01f004c79dd5eb6e781d2146b4a42933b0df54641e7b5244fa19aedb683bd027be76b7c515a60f44de22911cb6504c51991a04308bc525071784a9ec2e9e0aafc1b1e97f9457935c9c47ed6763b7c5cc7400cf012c7f34f571f0bbe96cab5a0b23d9d04b9424357f766c8fdd2c1e03effc02e969750d12a41a55c0869ed56b2be0db8bc3eb09d6cdb2ff1a74ac052698994beaa1c5c083c0a7a0dc21fd51938dc3f8e9ce68c3cffa2ce48bd283c2ab11e2b85a0ade4bf0630bab5a8a4e4c4401099710255464e3eae33fe68df32a11fcfb08ab08b29ee606e6ab47a6dc9d5f328ecfb662cea75a576f1d5a862d9d9f3a0c07fc80fa2d711b45ae6c676168f83fce1c61608b4b2aa5b2e8bf7e5c15683f06732abb00f41f8067c087351953c780d4da3c61d472f54fcd4f11e055080963e8d9e615754421406dee9f1f3bacb40f2082f1fef723e12bf129a791eeb2043fd5b621eef3b368d557f3d79da678439cfb7fd566f6a8cb7bf51086f7391ea0533f8756da3970c48562007cf23181af6b06e99de8f23fb411ffaa4c3c5ff10f5e70b8b60db55364bbef95ffe5af25959744d961b6c769b5d2d3f04898956074da2f868198f02329ae6bf77cfd82a977fb6260bbabf9c5fe44e46330831316363aeb8b5b7c172ca43cad20354e6c90763e45ef15bdbb1b2bc28d259a3e9d902689d2a260b13fdd16e0bf9dea74a9352670970fef8af59164aa4ccd2037dc0053709724d28f09bc187061b360b377ce110aed1598f24dfff37d94729e74817e609341d410ffe417cbaf6771b94af0ea823b2ba3be3d762f808f9f0dcc8203803573d95a82316c057074719821481b82750035e4b8655986e6f80185520e50d6e2b47be4f7deda14dce75ce72ae624c0c5087b1c6d0ab66b0965ba43b05fd863e1a5b81c1939a4999e67718cd76cf9428de54ffd268b9d8794d9706bcc965768cc891df8ea9d357485a8cdfce541e897235ab9e938bb9b5e922bff8ef2a693d2ebbeaece3a2dc78c50b9564ad023d22fbe8bb820f4246b713234660561785438632532788704747f406", "5265", 0, 826410859, 1537743641, "f19cccf4c0f7e292bbe36f224dc03544e02d10019d637a994f857ad869ad1a64"], + ["12238b0d029acd37a248faaaf2650ac8976a1fc7754bd706f1b078e8c9fef4e0db016545ad030000000551636351ac3cc1b33532377f05b8301bdc2b109f0d9f6b9b079221b4ec8e21a9cd66cfe533ee7208d603000000066a51526aac653190a8c8044171df0500000000056a65655153d64b34030000000007525163ac516a532bdad902000000000765ac5300ac0051bd904a0100000000025263035da56d02fe509604000000000000000000000000a3fcdef2cc8be1658ca3f137f5def26ab4e2a17b412ccd84eb8b1e119157e2c5d4d9c2762bbfe205deed827121e6ec843d8cbb2a10d23f526edff496b45ad4fabc026da5368972051d1f3ac2ee796b21445ab13d717b87eceb724279a65e698300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fb62f10b7b6a0f69ab43b0001cd67467aab5d1ec783e34fdf2cd7686a56a2b9fa2b66f0133ab822c3dc9a13518d00fa794b5cbfadb569c794127f44b7330104a56f59e33757792f344979f0053b89bc337fcd2f2ea4d23d2ddc1868a075dc07a087d2f9949a8b261e0c8122f6f1870f3403035ebdf89feac4f0815e941e1a2110307162b3f8c3df3856e41932e93c5d42df43e96d5fbc8927953d03b85b0250716031bc3bccdc7651d9ef451161483b4272a77bf7830d9920bd958e87cb88d5a9ecb0a0343710e11545cc1858d793cdd8213998d6c65a7539802c95bfa6e3d11f44c89839fa28c608afe97fa4fd2cc6efd98917e8f958a8aecb96a6ca387f182e82ad3030f3943477ca004224409fa267d1d92e005e78fc1d1fb8b92c68b178a48b43f0d02171a32becc2b36779470a3600b739024af1c7260b2a372cd1c88d9154adc587e032a840ffd38df38d54599277f5c6ed33da2849101d5b21bd69fbf4e683e3f9a78031127b1acf03e0b1325c2b14d6aff4fb10ac808a9695c982707575d37d0654813021d4784979a5360c18fa041ba254add83a109dec0a080bef2962a4f6281ca38e2fb8146fa653543540b4fb38253d7de86212627a7191c92c949911cb5e875be470999e5885a9b8de3afa9a2cb7c947eb10715864a36e9ce0484f19e3d55f58c9a49c16c1ed0184f730cffc3bd3cead8d9572f4de7caa918510569ddc98c3c5edc3cfdb5e0f9c63ff81d5e7ad994371c62e8918cf85936c47ee192b484edea4911ad7088bce9a69b8701dc6a3261790badcc3a1374004c5ba629dde823807ef51fad1a87bb2599ced8c608e490da32bab752791b30bbfaba5c8518ee028ebaa2c55b491def0293d41f5dfd518e3274e211cf08e0ea92d8626e7bdff898eb809d90a9e5bf36d3f836ec19dceae70282e9f3bc1838324ddf368fb18747a8ba57ea4300946ecedbe1bbdaf152398f9b0f029a212aad13a893413bde74ca475cec9afc346c62977da661e8146681c6b0c484c237acfaeedd63725cf790d31695ab0a95877abbfdcb893b7a34906e93510363a1c4667850a279cef45a20aedff535927236feae6913b7f94831de24b48c3f9fc8b67a530abf74f9201eef103e9d10f93963b8c6143b586698c1146141d664bf60c9b91942bd9c869eda1e5454d7983a842274dad6717bae82bbeffee8700542964dae486a2a843cc25467d3d72cd8669ef18f761cb0f78c67162e3761fbc584e172ad00032ad60db320b581a17ba31578c3a948cf5e2316b36b4ae8987a3a9d5c1dc7eec4cb60b12384d7844a2bc91f748d132a1792f59251defc817cb8a65e6e28ba5f11f4b672bfd54d107b62881203a00b96e9143657c7c912a45932c31733d090f024053497ff4702da59eedcb4f2ebf7305cc90b29296d20797c5d7fa5b57155c5c1fe7ba94b7af4082b12b59432de87d752b5cfd1f4df1693872386b6e698d0ef579627271598c38b02a859b4371d84b3fe8f6aa47854fc08335e2749df79f49dc5ed619301961e564d62aea9462ee105906203e2a9dc4fd94e999a803892f48d6cb62e1a4906504f0ea7c7e43f4a2c4197f017d8b19fd1b462a69daf764b1af713f43589a3bc256e61e1f86dc76a32d040dfbe74f0eae962f17ccdd954427b8dcc87b0d27fd26b23db54f19aa4a252b2e3a4d8e57d6de2bfda06bd0f5d11c4239b4eeda4a55dc9662e0d2152ff322c24530f3849465ea7e7f9cbfb5fb2d3a1337000e3da8495a77ea6f6dd1e78a53f3ba8ed7f4a09ba296093403aec10b95e227e6e5e319ead188ed8bf258acc61b05b55a27d6db9216eef0846553876cb0f0f04e4e2981c308ab989975f9f9b8345a17d0ddc676263eba02db5f1be65e26d3dbfdab63c61a424373b3eedbde461b80d33943f6befe53e7a7960efc10d8a7d5f81c81bb1fa8db8fa791334c6df6024aaba5b6c0857c25bf848f37f05a228e8da13ec04590b8e6cd3fe4f9c819315b29e7c65834d58a6d941ae6db4a92b51ca1a491d9e248e6b44e134e5a5021b1e2968683a716c88faf0a66b07f45d6283badfa218cc44356db003a74e71b5944eeb4e4483a75e93d7fffb95ae6b59b7f043fcc0aad8251ba79aee7fc3cd03af7bf301228b102f19860910f2f30fcc7ee2c3408882fbefdd6b3d6bcb4718e5111345a748a29bb5b0706dee717e4983bc626dcde2d7f11ead9fb75e2342792362927c7d584a6ce2837d085fd6dd9011b1b087bcaa3985575a7d8bb9d26a670679a870bb799a1e93bd70a5e91785176643539c0000000000000000fb357d0200000000156ca185135192c21a790adf96e91100a1b99cc7c74cc6d6e0e592df727c70b5d529c3b5af7a41ef01aff0cc7a1ecee3639506d6c0240b958033fc28569685a774f5322c9cd7786916653801ec24fabfa34a55281f97bd903010624d61367a750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063c17810618dfe86824be635b3b5625d9edf547d1137cf19c25267a748407681120fdf6b926a7d09d067bdd37192d0848e7f0e700714fe71081ec3d4c09275f23ef59187647f11caf141a358f693d94109ce6c74ccae202640d8f7089ddd811ca4954cdb3386d9a54cc12b29f3894a724918acfc9254f133297fd1d3c0e6008c03255121d9ed6fbe106179725b143b419d0dfb0f4bd56ebf30b426046e07e59fb3032f3cb1265ef0711667bcbd37661acbba7275c8957c6a0fd57a3fd5dc409e8d400a04cf7baaed00912c828ea5f4f66db6824f5b47f65061f2423045f395ce0da40884f902b1e8ec5d3ed09ba1e363a99f9875e4b7c728b3892a711bb007f2aae45503001795a72d9e4b16eec96464daa511bb220d04107e2aa23a6e45fe5725492d22020d488c5a4055c8fcb1c13ef3e571db57a5eb80bbd2579902ba0a5a6287f046900221650cc6f2148a970fe8fa27432f6053fa1ddf00c167f21c394c9c85e8f2f34f022bc26b419012542e7c493503ee205009e4804756710c96c40b7b9366070fc24a031604b431bd3742b93597aacb14403bca73e74445ac1534d4cd2c1fd9d605308b42c9b322f2f9d2df810fe292e87a9454dfcd92ec04c12d45aa60edb594dc444e7da4fe8d3829836809a5db466bcce7b1d17e68ab62193ce2d3d9bdc48533a135ff2eb1321e12dcc5feb75b4ec2bc469f096fa4c35d890b98d6444e5daa07524df91b0f29ff7c4f2ef7204dada41e77ce2b5ba6d15a52d873c48c155baa787909505efb539bfc9dd3dbc4ab452dd58fdd021ad7c67736ce0489a0faa022ef96212355ecb3946045b4af469d4af3686e3b2a4ae813d0b6f0e0ecd865bcf9db1a426be7c8232015638029c9037f4ec3fbcc6fd940134a2a85d203ac1e8942546119219684ba85cdfea4be025b848bda4a7050deff48e47d827529cc78ec24bfc49aa1327cf46a7c39eec8500cbfa8f528f7f01a8aa58380d5302e59e86c439b30ea4bb5fdc526852b639bc9f7caf02a9c384ce66aa31fe2b33803f8937e61dd3a15e02f3eab808820ddbbbf77030062738fa6fc18d7be53de0d06ee84ac32bbdee7cb46859c9e0f1d67604540e33e37ae2a074a9f97aa1f50a6a15d2f09a6dcc79b6fe241eb9bc94ac4e3c3e0c26e6ee70c49263a0947da1481cd184200416a1d827ff6ca580b345768f6d1082e12b20dbc53d12a729c8791d0c74ad194ce754dadaff084a513d7838c6b49489aad160a4f62713f5b3d8d16b8c1198458ada5ed46b2fdfddf8e2c65ffe2e7d924a42f2731d73aec5cd599ec0d996a599183d5fc6d90179fd2f2ac0f6213e6f5058772e2f23d7609af5cc4a3c66dceba412975c19b3ca91e8053234f1c1f4847cdcd070ecbbae4df192c6d64e5d1de29d1ebce0f399ee4b713151a2f362b6d4f2804b05683859e284c6766f7f69c31136115543512c5a025783d69bf09a75893bce461a98ddd460c396fa478d32d68dfe98e6c554195457dff262c38f2158544d68f4132dce0a1b7f8633bcba5243d572a5633d2767fe90586f583ef64662f6061a7f328a7928b9dcd7531805f9935f064cf5941415e3640f4c6d3e91c1f6634c36c47b1d25f7aca7186ea289b756ce6d90ba75019b80632f4af1c0b75ba78f0833e5cf24a8685621dc5143fe2a20202ef57c49209c8d0e83cce91a652a9f30fff1da5912433edd5539b844a359f2f5a464c972ca4b01bbc11060eaa434399e2eb84af9b91292c07e1d2850ae5872d3498d553c46f7a74fa7510d7a50605183d80d942cce5199a5ff3ee81912f0bfe97ea463fde45603aedca27b8065249f0568f332b365be10499766a144dbdbd720d126cf6f3d422de4361169b440d7fe720c9ff34082aa75be34c6654ed54d6681a9ec35b4c3e7759890fc685ee55d7275c929a573437e70e7d2c4101b10ef6be9131deb0496ec347962b96e16a7eaffe5a69ac6e41c312a2ee6c2f7e09a567e965740a42410af370e991e7d7447c9154639a44b65eae94b76eb9b875ca6a311d00b82b4563aa1d135a59658f86c412590a68311d2760025abce1e9e8c842a886e1b89718c739450b89c801329d8bded5aeaa22b4eb27a2e914dd58f8be73a570fa92cc9c9d7f032fcdbd397d86dcd5c40741991ff030a134d1d12c5525cd2a5b7ebc81ecd66e1df43fee8cfea4b974ae1021f15133eac00a25145f49d4c9fe46f3b2d33c01255361be0e3717c5acd218b8cb49f0e130111ed8d17d428d1742d47cbef4b0b9c86f162af9523c22ea00ba434110d23320f8df5154f75c5b702ede32d4ca310e5827d7772bd93e2706ee6b00ea17ef3df0ea27095f60bcca63834cdfc6a48b658c60210c2cb49622e829f147dc947f78d0d96b7d942ec65fdd375301068c3ba24cd8d72812e9b0feb9bff5a3a747b15015d500", "636a", 1, -778039372, 1537743641, "dd5e907246f9f7872cdb02c47d52a4052dadbfb01435ffd86d367469eb475943"], + ["69ac215703e9bc2ed6c81bb27b5ee31f773c09a0ce89c1766348344ee06247b7de420e20bb02000000026352d2f13f6c90abdcc48fb232e76ec7f8c206d273f593f61a991d119171e469554501d7bac00300000008636500acac6351acffffffffb2e89b1181811c421464e2ed70922757072d890ca36515702beda40bf322341e0000000000ffffffff0134ab1301000000000000000000020000000000000000115f0b0200000000c63e606cc937b8f26fc95c8a807eb5e5d141ae21951548e82569d6691c74996ab46cd2813fe724d813683d159b1318291c06b70822aa2d722cd0db0f6d1dbeaa274fe665cea7dfab60b2f056d2c8224573a039752247173d5d183c0547820cd800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7f1f05dade01cfd757375462840ae27fbaa860ba28a249336adeff0cc1f2d56ba718419726bf8c0079872d1757873727ff763bf99375349985b7e29cf1fd8ab32746df89d14dbb483c06a48017618ac871c1744c9831350d9ed17c1edb4b509faf6e27cd3c4a8be0a4260c2797377911aab96ed01a84f4e1b4e48d3c00449400304d87910df0ea4a653a753fd4c1c096651feaac08d1b4f10ed8d0a84ed5c2cba030e5fe10042b0860c3857766edc97e81bcfe9df87c96da8644029cc61557111c40b021152970af5717bc2c3c37e52f21fad36c69f2832003628a2437c40a71e9d3a10d11bbfd72e4f77cbd15e23bbb3f2a19c98da3358966ab7ea046db68df71f88031b94c475fab91ae3a04709805b1c84cc124d29dc191ebbd5d14d7429a1291b8d031dd121143cde1ebaa5a91cc9dd74db946f8466f8dfc2daaeb64152930cacdf370304633c8ffa8e8ea7f310217d62b470a4534c6aecf56e10f40136eef5a36248de020125187d91b6ed1359a34d45e57e30b275922406c401c5e29e2e3cb4461217aa0212e9f618fdf32e570efd2f31979c482dfa3b50f7c45990e027af1c47d3a4d113efd80f736035a2f551386f081cdc469c7ba547b315c3067d0f5b548fde92cc9fca05de849fa92f14273f221e66bca5dc2358f55d9eae14794da22260a03713eb76363c4175529814afbd23572aec9826ed17ee5edcfb3b291cc1d5b61c5b0cfe51aad33546ad90a6c79c882d229cbaa648337c54f6277300cc9e7a5166462802d772107949df083376dd8a0ae255b7a530c1bb2b4bc4d362befcdda6da66106d768936f8ed2f5ad09a4210fe4efbb60aeba41cd4946fbf855194a2db75208282700f0f0d8dbf60781c39d351376260813e8634e6775e128a279514c9d6fdb2107aecadf7c38eac9b8ba3adbb1b7e7e6e4e03d4a5fc1cc8399d9eb78280ae0b2955b4b38efb6dc69e0a121acfb97a23f0f7344984492d0f6900e4dc181c685e9874eea9d644bc4179d986c790a06283efcd3a785135c3640bc5dd101761702dcf6dd2d1292307017c57c37fed3856b46763488a2c38a54e4c9029dfad758590550d9b6e4524d0925f836b79c148a3a8226a7a825614922ec9193a25b8cf16ded5f7eec11567f24e373bafc7de54a18991b71c7be1c9335faf5e77002b283074b9ffbb3d3da8ab22e288ef2d9d00f3e72e3a9f91658a69fff6abc288bafd1091bc05498967d88e609dd8d6c94ef7a2489c6e5a83b388a684fc71ccda731000b714ef131d95f5cdfad0c1610eab05e9fc7c3409401a97db66ff05429316c09970f24049d4210265c139b20dab3e69ebaaa2e8975618a330a7d1c65c254e6aff1f521c4f81122575b0518c6a90090adba1d07d2e807d0a000de155ab52906e52a211d1e34fdec84525bcfed5dd6af83dea85761f41a7f07eaf53d44339666a625af041fed53df4cbce8712c8fc2f6a51acfa05fef52f592f34ac6b37eaebdffa729e99c5ec969fd31d29001e657783d22d169b4512322e66a78c1d2c6eddd4963e41fc7217bf28afedd818451f9d0581cfdc1a0fbbff7539f0f80efa9e9e161d3725e1f3b15dcfdfa073a8233d0be49f5acd34266cf7ff30f717cadb9a6ace740b422b4332eadeac676f5da67406c59cf85ab4ed1966ee012fac585550855a158f4e27fb0de3dc0c44d7b516e414547e06af55865bb38588fd8caa929adb61c1024dae27da5bee1539501db24b46f78ae43210494fe31b52e64a520cbfdc132317525c8c6a281eb534a5cf617218ef5d34b32e9d7ba6866c927384362f12afa455be95deb64a3075056f36fbf80eca7cccbd5e81afeb1304e5d81449522a7e350646fd38a132dcce90550540947cc3126f07b0ecd506f2488a788258b4170af4549a5f116d3d829905bb7427a7ad94087d9190a699b3b60e1fa1737671d913560dcf01b02f4a17dddfa00c13fe7c414c936325e6c5399ca64f5b22bc64808ae77bc660e0bed26164c2f96359eb6e651a9bd8e4ad3d469d1cd24366ad4b68de03589d4e8f8ff854e3d413e0b58c8c9d704d8b421501f4f5a52a67357b0aae04d402c9a77c9c33866c6edb1eab0d10cf01e4616ce959ad4645a04d045aa7e255b4732a6caa5cc23a69bb6796d95d6afc916d57c61af0fddf26bb876fd3a688647457c087ff3ef46a15fd17f4edf157fe52aedcaeefe78b638b555c3f7eccc4863ead78004cbb712b85d5346446ed6aa4c61cc618ec2a5d304a6bb09451bf332ff43550a898ef7987d3e0bedda3a8c6355cd558a17e0000000000000000e604cf040000000042405bdd13336f7d92235dc0a092fb5d7c694f892f28ee5192be8d54e1e859a838e2ac1fce61125880ab75941b53c423653b5ccfe9f9c02f5260ac14f028bbae880df6c2100e1be140ba54e1f627f4b3a1a4eb608acbabfb0f334cfe00e1582900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000291a794acf9a9cfbcb37026379ab36abbde700fcd0d5f6b103a73fc61715864ea06b66b3e6dd9d5b8ce98b6677acf65fd897f320697180d33e9cce53616611c359d18701952bfe7f06a12c59096506c979919610e0fb2e3a6d091938ef896ae927b4817cb78f4514bdfcb5ccf97cbfc53cfdbee920e2d2e0b747b70b5e9e6bc6030329b3929c8bd663611f51b2c4799e9d48d4e51a79aaa41c119399ffdfddb60f0308657f4af8e48d67d6fb335f4337d50d3888ec39c5bb44361eee86d976d01a620a0718b593ca3ccac8e88506ecbd8b5c1898e8741b272bf04f79c2f2ecacc7c515c061fa42abea833bc92940762fcf2cf88167f942071cc8b31b4f2c017214f3c403270c5f0dc4acf190a3a8ce561405d81882a502c7ce0822ff322a9bff7ec931f10312b6e87ce908e0135b4888fc3c42bb7e56300d9f877360cbdd6b1e204b5fdbb102123f6722b28621528537363df32d32f56650f20ae7fcbf40e2d566a737c1c9a80328974b05cb78d3b3348f58d6f512475f8580340a783f9dcb411f8d7bc4bf4841032dd9275ea2c770ebace5dbb7d1f92b8957e0e24bf2d4cf4779bec9cce94809f940cc23c080d08405375736ed199d2d3b797d751b9318d62f6553a8aa7284ef9a9b70177c87244e52ba41713f2f00e11adf11133a7613618509a35e0c886699187aa63ccf78243994b48f479675016041bead6691f0a38ff3379fe7e27151ee3ece576132aed21509de8e11bc0c7ddd2e424ead38344bb31439f17f23315c98de8bafbbe8057eebceef80fb3d491a8dc3c30cc3ed89db01b5b89a7ef0f6ae3b6856851abe8b843ae39a4948db2b31be9f3d273e0c9bbdb8b3028342bceb532d17482f6aa12e73f7779f3fe504e4c4f5633382eaaa065ccbea44407493fae569ef11a1023b51c70e63cd5d1db277a885dc0cdd602c40e796d1728da1c2af1fcb9678a04a2715d839e602f86f251e929b1068dd275added8bf52612987bf3433ccfaaf83394584058adcaf6508547fda94bcf7e47e0ea9a020b4ecead2fb5ebaa8830baf119aaa12a1a8be2a1d87ce4901c061e7ecd57d673a59cadbae51a79929c2f753c2164da4c83ce279914de7742f0e6684f4baf88205831eeb82c275cb8d97fcef30e1ae8f53109801b0445392698c16bf318df5063c6b01f1de16b8f3a410c57018ca65dacb6ac9a30cdf4e46eee2f01a7b11e27f94547a468893bb3c9a849795a9a25a6fa3102c23d6baf50e83a9832f39fb1a4583db0e18273e44f8a61877ff50bf7afff8dcdaff691978c38998b40306c8bfbe084100cebc6feb5902b7cf8f1c2252cc2d4f13f4fa4f65970e57885a16dc4f3a309e4c325ee4e64c1ead96a6fd4e3dc3b46221390c713fdf7ccebaf4412fbace70aef6d936b0558011c63e22ec901b7480977f87c0109b32d0bd22a95e52cc0f98796974c684d978398cfef32c89b2a30968fb6e85496b63fc1d42bacc6ee2ccd348d304789fa45d31a84171bd09fee6eec32ae026e05637de07ba29a30371a02754d1e3ae5a1ad3c919a39de682a8a68bc8e4beff17e139da45c3015812152ea1a275f8c66807bb84b1d4399d74992f97c3d19fcbdc7a681016fbf1046ab74402585fa8f002611160e47e06512ec5b4f2f89d05b3dc99f610064b58ed1361ef75c60547a989b187c2ecd7c8145530ba906a018aaea979b86d8cd282cb70fb8a8481de140ecba362644eb168e430b68cf6f1ff88b5324fcf64c90bb69ca2430a463a002db7858ca001978fd3ec993ba1743a64bbbbcad896834e8d7b0cbef4e17e7c93ae41d880938bd990a0daaefe83b5d1ca801f2780a7ce8af0e8280d82feef7ef743663df762a2c29f73e294ce486784fb5db701f149b661f8552bbceca0aaab1833ddc72055e334828ba3437a35c519b8c91bffbe2cbb8e1fcc9310cc344a8dc35a9ca211b2457b019d8a616f11ca3992af9e84dfd6f678c5582d9b8c7f6cb423ed433f3a5d77f70b89e4552e0e043ab49a651c96972360d8bf534f51ce6f58a0a4eb76e5f6f885420a2607a83a2f556fa2f02ee43c4b7ecef216833652f978fa422e1a18ae996353c930c9536d073f66aefe6e95c41335e91e7f50b8ef23ac0d03288bada7e67f5165fee43b55ea16ec9b6785674c46667394d484b6d9d70975c5d82654983a334c002a57747bf5fe37741e24cf21d428c9ea13af989ed5c7e391e1003b5885dc01a796ff4b3bb7b26dd1a0558458f1747818dd56dd4c3930fb0e36f3cffd1b6cf8f83db080a7d280c70a63adf9ee94f2906a543b3f75fa21db7825d6ce28d59af16b7c0d68739f3e80f9db729b2e25d7433ddbb28daf5025a8119bff1b2c553771d0a3af93981ef2ae6a43f1514015d27be3e6f00ac153afbee743ea2186462147feb337fe34321d4b0639c3ddedb510e0e", "6a6a6a5263", 1, -1931484003, 1537743641, "c598e648878acdb7d637c3a33aac02bad0c216b3f738ff2c7552b6336fb60c6a"], + ["030000807082c40302bcecaf7d3a399dac43bbe86a57fb4f60427084fb594eb24e771d6086a84f67ec0200000006526a53ac0052ffffffff361d16a1f6b56b531d2f4ba875e18ed1433a8fd4e1955ed3c1060b0c0b60ea6503000000035163acffffffff012c57490400000000076351ac52ac005393f83419724362c1020000000000000000aaefeb0100000000d7358cc60f0af79c282579891d00e89cdb88bbc44160319b5afd8fd5338377984f3d141fb6633875d0eb6491dc87c3662ebc68da5883e925a597b24c091cd687ea6f6970c32ed4b612b22797cf0417d577468b5273d209686bdf9b01c0d6e91d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001300947fce9c8b6926e32035c2d9b8e2410b5eb1a942a4a26fd33553b2c7e1222fa00803f6a302b3e1b442a9676299afe20d427375c0b7390da695e8a07a7e829fc3051794e5dfddd79a17de3edd9149c6f1d3175f8f129b7672db0bc8dbbda01598abb1db33ad0886a15eb489778582fade82aaa61bfc514d84d5b7141c028f0319cdd136fb99847aea87c0c6c1efd61124ceb0b5a8ad96d98086c379c2e22cbc030493c09315f36851f493de25949f970178e6af0807111accdee8f37a3ceb1a2c0a06bc1a61f1707a8d0b654aeb1fed3ddf2e3ac33913b0247421cf3bddee8f647c61d0074d1f6d2b2525d79054935a0a9bef307997f3f3124fa2ae9304a739f6aa0218641c46785b80d0c16353de7a5c5c5fc44d9605f3eb660cf16f2f2f6ae374ea020b286c36a2ee2b708617b9c0ede3d317cd94b6c7a8a065788510cd3b2a492e20022a271aac7c7ea819573a47691697390e2993272756ad9324e183b319890554dc020427ccbef723caff297f849b3868bee0824ad5be56388f3ca90f5faaee319eb2030859c4e55d50445d61f40ef727b8719778eddad5fa956a1c92d964cbb6d712e547fc9b405e8088cecfc5fb2829fac6598a5963e7836625d0d8b817312417ec8dd5930fc68eb972ccb86c99aad3c745e3b4bf44af73f09e4b2308c63a8d0fb597e2b8ff62c2f1b1e2c6d092f74a722834df887c346a8b2a1fbeb537ba1b115da8fd3809de4f9b8d15c6c614540b946843075ab3ff1e8a539f84b9a9abf345b0fbe85009c37a8abdbcbcd4678553e8333e0958f415e1f9985a43ba503b7dd010a05aaf7dba92adfc53b0cb8297ab1725834a08912bcb45a1cfb1c97d6749a57d6042f5dd16026865a6b4eff8910810b7fddadae54aa4804dab4407f843ed07103cf2484092becadac41caf2bd3256d31567f28b5f7bed22667439ce000727128b80f188211b75b7844fcdbcea256dc2a79b67054c21c5d96992ffb384f05308ac63250a79c205feadff2636b59b90f7123f7bac17aa62ceb909372e3da040beb0c5e2b0c9d80de8a2720edb9d4a8ea3bcb3023967919f1beaea6bff6b6519b3ff7e392364b2627aa29fe40015c0308e5181438dc87e0bbcf0bdf1afbc6f5a55efd8a6eaaf983790e13cb8a3da88dc303b6ef72de7a0a1adac781175f011e3432a5c0c076e492e24c1d856f91eaa4eae02970e74704e5603b0d7f449f90c8eaf1da516a7043874872ebe9f1525f293b2eaf172c2012be5946c8defc35e745a1176ffe87e730383f863357c4efcc91f417df9ba079d7b7675b884b7b62bff7a53ec882381554c5bcc5a62292c9dfa70b38beb5024d2eccfa0c154d3b733bd329f5988c8f1b1ae350f2805ea468fc3cfd391a60f8832c5dcba831b497e7f8d2a8a335778b41ede4e09afc59dee54b2bdd3c0d1101baa405480ddbd2ba7437eabd803b0d0a09343a48b10ac9399daac84d0cc4258e0c7b840604776f0696d504e5175a0da523ca9e7a8b1c3ad482546970e1b529cbefcfabf9df55e752686a0fd8e6686f832c479f881f3826bf4acf27ce1eb40794042cdc05c2572fe460691eb7c1ee1a6f6905587da59c12d8330d6d17296dd2b6c749fe602c51862cb094769b73df9bf42c4d948c8c8eafbb28ab66308d4a24f55c574c40976362bb38bf45dd075651f73e414e2c05a00adb8730e2305d86506125e506960136db09a938514c353634c3050b51f366ec4552dff5c001895ca210507471e8b849f6112fc573f3d982233885d940d3d16bcdbdfe423e7e6af0bdafc83ba820ff7cec8467a8b7c115925ab9601030afc39be733a56daae88cddce8ff99e20be77a8ef99799e5204ff2d356381073442ab23cecde0387e3aa098fadc0c729b60f5d749a9ee479a346e95780a615a4842f0c388497c039aec61f80cb28948d596de9666401806df760df925a982a94bbdb0d052d3df2d6ab9452d2c73766cc2de6edd0e4588be82a13bea0b667522f01fd8ad6883594ed8f8b1fdc9b30fe87f1e493f1097ed1e290b42fa6f7135bb5a6d7173a445531fabe202078482f62f201c9abbf15614dea18d1b556cc02e43c29a37eed5210dff707dbd0e7370f4266834f99a7be48bd77adb1ccb0d5fe5f5b23fb22edf323c329fa9542cec5489ebacb73746ab32ee4101674f09525b9432113abe5c6029a4b708bb0abc8d7797ed0ab5e73e7e621340b1b02c9e761292c546ce89887a35f9be1c9e706d1f6c350444b2ab21cbd51292a4ad77fad16e79d3e89cee622cb84caf5d74301b43f10000000000000000bbfa5a0100000000686c4e99e108a5380187bae5b28d0d4be4458ea661b95723b0c26d40347c04477b82348ca5d876e8bf8c14eb8cb71f8e6bc1c0e80af2b437c52ba7f34193a1fcaf64addb0aa141f71a9b9d332e448e5875bab43f3bade123856b7400d2b31f01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003284c46517b03f6870cda3c6b5a4a03d9cb2d9698085dd5e5da0422ccb53022086c4a64896bee95774b77752127f1ffc2263e751ffa26d36f99f107d70748812596795c5fe8f1317f554e16826c910e1d7125422c061072032afd4d2f5eb7600087b2c87decd4ad1a21e59a93bbb06eb87fb592e45677c00c18320fd95f54cb8021b82093279f6210e51435d4b25864a336452c4d4b6cb7d7e2d6bc8795e1ba41603283a15c7a545e1f78a941ce98a9cfc6a0694d65300efc822c2d383e750077e080b0441f9cd900b613099c7ac3ddb20acd06d66b275c10bf67adb9bebde1125a2336353e45ab598226ff489aadb4223b36eb1ed364d5d22f0d71c5da4f7d3aee4950221ce73a528d39b9adc72f165c694d3ef7f2bd00e14a72f0f27605d11f3cdb9f7031f8931c202965a67df2412173e0792a76471de8475240f5e5425ce319e5ab97403090e9c339a77cb2c8cc16da80ecd4b588a85728413dc93c6564950b6d96a02380329593ab3a3a30fb38568c1cd36b238a9c9d089fa55d5289c0d17c9eb5e3e5e900221e58e36534fa4d0f7a213cdb2e8f86f9922ae55d0cd73242fa0c28a9817227a45b158b4d144863755bce9a1784153a3ed30a8679754693d88c80ab159cfc1e57b6b17c133a40779c0a90621b1b1b791284db6dfbf088cfb5d0320a72a893728ad3ada1ac260d1bbd66b3c2b634a0bd55dff51c062dd48ddab16430bb40d085a583062d44e3d664564d5a7f8fa0f4661deb331bb0321c7c15419736a47c61755e203fab60f40ceed96ba261e8ad03cc843817be85a20432d7d627bb7edae3ccf9a15e475ea98b0ad2d7d55c6647f59615a10847b277afae54f3f0ee88ae891659a5efa6bb7811f92f621a9c9855c53b1df3c87327605d577bd67d40998ece3a81267605d2b80693932ae5da7a0a861d94ffc6d588a2c90b75c1e4cea2e607495f569077637e79664d96109b4d0fc7e5649648762a900d042314b3895c0bf0818c4ca139a9e0578f9f678fcbdec4f38a2e4354c983521d5c2697f64c7823df8cf68124a988478315a18d9b591ad40329105f874e584fee28db0178477c9395a3b84487bbf6711c3274d41b6d120911f0040bb3d0bf443a4ab4504f4ec52261b8d43b8e27a8262b6f43d0fe1a73b58a86850138d7a54abaedf0971da3ca3ce44aae2fbabc20a0380b822e90a34ebdb979f60607d93a3eaab0ff76fc17a4eedd9bf456c22a399fa9f2893fb5dc319c2d630f6acadc42aa5192caaf45e019fb6175fe9914ed9b7b77f6dfe11c46f9340989135ec7da5494d40abbe44d8ec7472c9b30564edf3b967bf48f5f375937d909ed64928b2a404ec2ef7a0022b762d56caaaded80869273bbf9d21e0e7b6c27fad02ac7eb4e4ff66db8814feaf8758a4d6f98fde6cd3db2aa84c9225237cc201e7ef3051d7b350a8a0f8a6174cf9d2e641f90babbee2b794cc9243621d6ee14a1bdfd9f9a26e2fbf1dd1f3466a067a736f1beeb1bb08a88ce3a1fdbb2e22819308be420fae78ba1f0251cf1cce6fd3037a207e61d397c53796e05af7e37291c7fae8eee5982bdf3da061314e77851ca5f280221889ab0fc9e3fcced255b8425364f77e5efccc610602038fb2e1d554c0e7c5523c8bfb42ae32637f62b46548693f6ffdf0b42f36eaf5aea2fa727f3871538b75946335733710091935c1276cd38a3208cb7e5d09f25e90708add9a6be2314912f7774dae55b5a1f89c0ac5b0ef45ef18daa0512dff9f75e32c7d905fa626b3d358f3b32f0064411eda7d5872f4f1c6119819dd14f42d8cd9f95f1353810e11c8b1e602d267acc0f8551619ed4cba4b7bee10d10fa728ad0080ef875b1314914c80e6ddb6c3d813273ee094bdf039cf8bf87d29569150e4b516c489afd80531298bcd73f67e7185f85f41678c290e0a15b35dd2a37269ff9199abe86a0b26fda79849a5308aafb6d91443d31f018cf3a25aef5b0f992901331cb7311e890ad7fca3e234703495b2422d604d6780e340d43752c53109d41902bdbe54225523205c53965d3c94aacc18e5c3ea906b708fc02ef60e5d939fa56f38137cc038d62338a6b1b1890571817138c8956c6def55e01581f482d805a550832ac79d0e4732c23c8b5e6924da5def160f9b7a0b96035f6de3b9815a31c2bf71f908131d62cdeae321a6f48cc39d8709ffd3dc0c0e91881f329782446680bc1f88d402262f024dc1ecd709dfca7ab0fc3dc84b308d9e1c42735d7be50ed0b2dc8a85548b589ed91347d09de880903c32bcb5343d9c688d691ce7acdd4ceef1ab72105dd5f584c399c2db30d6952b1422f7db85a92d7c00d9b6298e015df626f3213fd170314bb0e1d30eee8a8ace1a00b733d2cf4f135b243a8593dbeaf4a20547cafc1342837e225663fbd25970e288042c055e4c60ed05", "5363ac00636a6352", 1, -1136804632, 0, "db219502bf5cac41e9995c49f6ef4e1ce414b84c79d048133e5eeb89c5f576aa"], + ["42c60e7404121f888c8f21f525f4e67a8aff41cb251dbd3aff90045357bb57398d36690e4403000000045253656affffffff7194874818ded3a2db007b935a40d1e2ba36a1bc7e62f9d31ca2f822dab470ba03000000086a005353536a0063ab1454f7598499eff63efa361f92d87a9005258acbefbf3dcae25330d33eedd08d858f290100000006526a00ac6551ffffffff580fa2138a5e842ee48c6706df9ede26dc411bb4ad19097bc5f2ce2c3193ad2a0300000009520053515351655253ffffffff03b17ce3030000000009ac6a52526a6363ac6aa97e800500000000055153516365e9b8570500000000026a0000000000022d1b6705000000000000000000000000f34002af631e80226f9e7f60f0f476ea02d208711196d6a223a33563ebd94fe5a53329335cb03e56e42d82c3bac16dafec5ddfb002b98f19ecb4d6b1f9e38f437d88bffeed9d0eb2e03fe74a11068092d6d4750dd61f214573a69dc7afaddd62000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007c4c14e0bacd2ea8c49cfcf75717ee7ba016720a4762193ebebbac195cae2dfa2dceb992fd38000f320fad047e3a60981f34c6dd353caabcbd6278c012952cf97286e4931635fcafc8268f73b74338897bd4db42e0a3bebd176bb47d331e1eb89464b78d1b524b24c05e3ca4f81a605a59573c600e7c714d242a09c6f7583ef402049ebbb1bc24d27933d519ba90dd75010208afa2b54553709c4930967cb7198f021659774deaf6418e3f411d6eb04bd9730f78d250e45acadb2887868cc5af23cc0b048467712cd70136822597574c77ac2154a4bb45d51c1e8bcf82d37881f4a8645071a04ac46b97a1811953f152119a7edfb892ae453e91d1d33d92e1c392228e031b46045f360277a288e267e9b3cfe9d26cfde6eb74141b5551911520afc026c303043944218b1272730191291e2fcc27a1bec6b74c9ca9718c2ee8310b2492b249032d1b5a178d60d4c7897a5d2f5fa0539d8a896acc1875695eae4b118b37a6a6f8021f1a6eddbabb2b78159a924168a45694d4ae49597c12a4a24e2d5656c4af8e3a022b5189b85ca3923543ab5c077320f69d469c6c41d98ee6a0145bea4f0db93b1c9556dc8ac21dc7b0bab886b81011b112f6a9c6cd7dff144d0609c0538cda4a6ccccb8e212ef407ae6ba1cb785e83137dccd30115d1be0c72b7139e10415a300ec231a361492b4a543db9eb72f7adfd46e5292a267b6ee6ad34c99cb98460f145306c800e364b374ea636da2e01b8268cb357f2ebdb3cef7420c1c1096029c7347cde314cdc6e5cf048512e00885ce2c4b76b5e3b84b1b13b4c937f4dc80bfa3ff7446f609f66c30571090f736b4433a49d8ab2da6986a38ebf9e7bb7d2eab407890512ac1fa0acbc252157cc52b9ebba5f75c4ec76d6c53f1b3dab00c4f39a6d7d0a3bd5cd8f21196ed3cc6b0a2af7d23bdf7727d538adf33336073d5b36958a2eff8b27091405ff449ec2dc1f24bff12de51574aa91f349ae6185754a824ff9079ea2eb7204badc22a3b09eb3fac4da43271eafe1ca451d0c4e5051ca6b5e7cf9cdba238dd498b251ee8d695b0b3e206c510f487ec2b836eb3b8d088830ba3705313d145f90cb0340879020e07d58dc88ab7aa562852ddd49acb081f42a6cfdfc33f37627db7684f676990811bb6ec63fd42f7c67c0451f40b70f633bd2613c1e5e3a71a0dfa12e11b0de50698b2256758c703fa3655fbb840ddc1cd48ca9bdbc5098d955540220d957ea945f570705eb5a8121411edd094b516d2946604f1e9927088fee9a424fd9aa0e415e7e9dfb743a18f5092ce3f26af8cea85a060299fa99dc1756b90baaa68c5ad512006d65aa23f16e5d6886929bcb777b3aa85bb4402a8181467bff8cab30efd46b88ec58ab4132c5182165aaceba47924c67e2790a2f10ab3e1ce2db2fbb9c3ffe6e50cc2b68dd682f039004226458ad0a3dcda05b69e4d98713fa21890108437b1472ed676d679c0a58e138eae03c075cc70b536d4f1cdd7fd755dbed8daa7c6d7b5ffd8dbad549701fa1598c400b778696cb0d0e4f9e2aa7fff9bc47cf666e6f76981826266a4f69560b35d951608f7bdb8df575d1ec1f559e46284cf1e3e70e938f57174c0eac1b033950ea8736bd14ea10382f89119da2680625f1cf260293fd654fd1287f29533e5e16a77d4f898bf87822dbf908a660329bc0dd3c09a8fe8bed3dc03d4e026117bdd1378ca299f0dd06d63be210d89b2ddb6495e20c0538f035749393310ee87bf93776d4d93a61e03935551cebf9f50014de621bcd45c1aae72e7917c005c6a6c224a7a214bb2e1d234964d48dfdd47a97c44ea0b070f4067cfc50ce1813608b46f9bafb7dd084e9d95361cd30c001d8858532edb00914cc00144698b92a8e65169f46d1447c4efb939f39dc51230ad576cbbc25b05c8e2187b811e1248cc392fee1bc4d6b2ea6d3db61eaabefa384937b99fed0cdc9cffcf85961197c2953256bff4a3f3d808e67f23676109db8815eba8b307632ced9f0fa13c1fff17bde99e6648bd7f7ffe91ceffd6a5a400e1375848969640ef14ae5197f3d01c88756ab6be50f9e35a3aaff12b8375bab7db49c8cb0bd1e9fa39916bdf54e23d08d976b9e6053bb8ca8b60111e998735ad0620f23ebd10af1295da5d7ea47ac3bba810bd4f329f4d855f804dd988593d90f983a3d59332abbe7d8fc9c6511f84442b4ce6ecd60c226050dbb18cdc558363db0a3276a8f5f4af5fc1f5ccd49de11e8854b7961c33759247ab05f50e617932a05b618ecb01ffb0b4059d113e63b37b30104000000000000000000000000bd7a19a78e4d2bfb5b99c6bed1f8108e08eb1286ca08884bc26e54679b93f7763640f462aa49bca92cda3ce40c0670ebee3859576e66e910a8d2fedffd65ea9562ee032cd5e00af7e17ec489e02b3950dff68cb3c6fb64631975da061fe59d7800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d6ceca385d04b7ad7b020ddeae339f1d143209bdff97a3ea1df31ec8e67faf8d36b73649b836b6fdc49a999a85dc087eae4a198f0fec506ba93667ac3b342b25af6d422734db4f42a6c1e6d982465d165547ed62ec753b19ba0791073e16ad00936afd4f3c770bc065d51445ea00f62cc6c33655fb783d102e42720d9bd57900021afcdb3ffdf0758431a263a43da5cefce35a611275bc17ea32f48754771ce2a4022e4e06fc2ae0b061f189fc53db9b3b8f6b6686c7d84045f74aca66eb5b8176030b072f04ed3e5e8b9a171bc3511a9d830c01053758e634ac0b9a29a62366671d2934ce2a88e4c4e9b26b3b95b5691f5c7e444873cac074cd6f42008f1e95a186ad020ed9b5f79d5653fe75c9d39470a0671babef050f30c1a36bb360bd4f0973f706032b588dab0ee07e1e68ca53e8aa81d9b493646fb13ca33e58a1df8a919b2211e3021439eda39c17210ad4e15b943b81dbc6e6871358987bec55dc592308e322799003246b8b16437818aeb73ca650b21f8b92c03ff28ce95ff0f338a47bcc2be7829e021d075d28e23ba0aedc816967f6e1b6864845cf61efc7a7569fd2f208703915b3304fc9310b2dacac5bbbc5e4a6d42d2a7b99679dfbe669f426ff341b9ea740b20b36ef49b3d8fb792e978bb7d3439af2f3ae6204c44305e528e794f52f071406566e1109dad9bf2fc85e48f70bd8935b9db17ed25a6ec571379602f3da3ef28516d99b605d0833f902246a5632c4dbf57139f7107a67432c82f5ee4535c1d0e00430648634de4f2973096bff8cbf49cf9716bfeb905b09f197d916f342e4e70d115c162e7ef5d4faac19ce20ba778838d03992a9674cacf1fb2ae5d0b5363446b2f93b78f96f1a30670e87c5c1ec6993262229de6a265497d0c3655307c50bf001507ebad7404bb8156b6310d656cdc4dfc9ee28016f670b973a7fcaadc70aef8fd45a7c1021cfd7c88fabe52855ef8feb04d0c568821488fdb9bee69acaa3adb308927ae42ad44c4e1c7576d2f8ef614e955053c90a25db0bc96656d9f4b5dfd5ea4b263c6f931c5950eeed20be916c5bfdff41b247653254affd1b0580a2225814950b53c7ce909e4ceb0760984aed3cf5fd0370dfacbdac6bc552bdc9de2be49463c06b82875e8ffe9b54bc55a69a79f910c34fef5c2252874c90dab2409073dec4a24bcf9b39441f69a28b50b3d618d4cb26280527173b1869b5d767d7fbcc5fd566f72a88a1c915c5c9bebe908bd5e876efc7141a67f77f1773c34247c3233cdcbd161106a2f2b2d73c4634e63883eae5676fe3de82b33ae07f99198c52cacf65eea3576868b75afa5ca562bc31566075eedd9aabb069a2ef296926ecd61c4d0f6d7151d8f1e7f026c763725441202c98cee52e7870d65369883bbe90a94c8a9e5719b8010a3466163f9742250cf8f781fcf06e422d78ead53b238e73f4c8e9afdff6049cc426938ab52378e83ea957a3267a83b8de954206906771e166547f156ce2d5e895a3498b6e923c2c2156a3afd7def3db419837d17e0a7c416fbf6ee1607920423bac780c90926340ef83e10ce1d7b3141c69e54b796f9de0c1bf2b8c030da974d8403c00e32e398a374b2a4f804df8bf115156c1d01fabbd43b9036ec798d09cb677fa6d1dea47ae997e2bedd85350a3a49b621acba2fc2803945c3188a8cca53436a317c9e066112e20cd1378978472071fc1b5b41f6378376e2e90452aaad0663e02848e36a2d6e94a52877c3bc360b5909db1e8444c55dc2c4f22f891cedcbb18402fc41c06ee3db754ed54059e9ce40a68c165def3ca164e91318f359d69e25761d5c74d40313bfec41a2c8d979dca7bfa9245d7882188cd3038260a77e70cb9036b9d8a06e13849178404205fec3d9e6340ae08261a184c177e902b4a68dc4347fe8824778f9c288addfa72ced76dfe3a646d6001cb4c10c0ba284e8edc3d0fabd36903877ed0f9f49d638a06000c36be1d2685a8460474a96ca65285e9280bb181ed7a9d1f78286f78f5fd11aadd8d0487d016659d472e2ee33decd05938a2484b2aa8a2d7820d325d04643b43b4ce38e406dad653a06885be773cda9bca2cb387eac2db2f0be65758f552aa973801f1f7e676c8afc6e334cd30470419acfaa12658b50914d548c0fc22c16c2e6d853cef1939ba85d559aab8c8579e2e4755a0817dd0462c72fc96975a38fa4f72e4c0079a576899f9d804a1226870cbe3fcc7e125621bd067cec2f9666414218ff953039d3665701edcef834130e2e184bdc83d8a8af119cde677acc5ae3161dfdcf56ac936c9bc6f94dd8788c274eeb8e0ba1b4baf6640bf16da85035152a8256222ecd7dda2e258a2d1d0cc37021f43cf497f0d19990785277ef563fd24ac13096ff90e4d243a3ab95cb5a057610f4348f7db0bf5bb731a9a09", "5153", 0, 213544156, 1537743641, "f4c54d80c0db16842eadc7163640600e5ab39874333d0432ac0cccffd70e0e59"], + ["030000807082c40301a6eba9d56febe71c4d835259e454041c6f87f854eb5d285fb708793601e7a7aa020000000463520000bd42513604421da3030000000005ac51526a522095de020000000002656ae374ea030000000008ac006300535351632e1d670000000000015300000000c297f0cd00", "", 0, -1895044105, 1537743641, "23b3aa0356c86fc92fd86a84707d626f04c4cd2f65e53daad1f13fc83fe4a3cb"], + ["030000807082c4030374ae073ab97075bef1716f96417b57d7327afe266d3f3de8644cc619a2bc44ed0200000003526a00ffffffff8e4831527c0142710e663250ee8c533e62d4e937e0f41de4b38e6e66bcf64a10020000000563535352631aacc71aeb44cfb72e9fd8cbe983cf221edf270ad7cefc233e0d35960c3ca62a7d1c735702000000096365515263ac516a53050cd98c03013b420100000000055253ac52536a18c102000000000252516a84550400000000046a656a516a42677b0000000002afa5f8000000000000000000000000001534bc7d6ec6811989cb607eb0b30a1632f9232fb84e8fddaee4f4591063d4a5d8fc7986617a3a426218b28ecbc1fc7580b92fd09fe5e68ac224bbc4df7ee11d2f9700b5d9a1fa14fcd4d6bb76d8fb34ed173f58ce7231dae9b37c22178df8830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021989c9580e39f2e7167ef7c6c1d20728a97bd0e1594b054b5465f7f38e22047c85b4bcec5fb598b9f3fc1d90fa674f168f970dbd15fe5c5cc4582ff7f7b492ffa2675c58b5035e3d03d0d8b07ebb63a06d10ac073db6711680360a04fca3b69897d138b22e214138e502e26271fa07db14256d3353de302656ddd1ee88c462f03143cbaf2857269602c21059109c7d7588545550c05b4cc278a90409c0fe218c60328fb31130374c8f3cbbb0441ae2b7758606d7e5bfb6e8d23afb3935238a250430b0253a75b097b274edc70ef8edb6cdb9afb13f01ab6928a5042f39ee5fbcf048d00fea8a653e0362bb38eacec7ed33d1b6a5b1424823563f179b42b45fe9cc058030b6bc01f4195a429f769c1ae3e699ab4882013485c9deeaf753dc31d1e7653f4030f4de2d1f0522c39770dd87fc04eb822c459387cedb2be0bfd45cf4a762dfc5d032a4c8c3d31ad81e3686de5f2e4ebad9f78273af284db571609a261648a2323500226d9027f2d4ec025d4ce1bf25fee9b906ce6fcbcf2f12f64bf462a400052f03d0204e80c5f78e715c8df35b3050e2682329d2875aa984ab76edf69a44abb3d64e2d3c7cab5d209fd6519c80625f60934f4e0a0dcd63d8a3b2ccc3d861b1748f7924f8be88d0ca217f16c24b660c79dba94e48fb649aeb3eb3a4049d5c329d9a4b7e3c4ad08f5db1daa1904eb13cf1feff4c4be365ed94c041d5b93790be46724f317b6f8fb638fad17ce3838ffb517c1cee12bcb6c78b07a459eb576ee3360b74a7f2ab6547f6971c36525b6d563e534f272ba013bb95c8ec618d95c3f516a12396d3c4807ff1e150efab9ba90d0ca25d79c82174c72bfffd47c3714fdea6387e366fbb2cabd8eb3280413f629c2f5b11ed97718d439f09d107c3546b91b8c9d7f543442792b276af900a678f5f2e04f6f1df4ee0d127afa7f769dd983acda930844e7e1f30c8676053f0cd0092e122f27ef88fae980ff2c9a7691122c5f98838688dae9f7d4a6ae46d9186239d350aca19db714ef5ca9b6096733ef498de6ff01eac44fd8a069adcfd2912ed5f452a6e9edf5da9b3497c09d67cad1ef510e5a8101e4585abdb3427c1d6697ebf6d0c8a533ae52518fdc81a3164dab397de064e46d307da147004454450ca0a1a8da9134bd7c0a69151d382923d83dd88816660ca242ed00a8cb7687dfec5896e8ce71521b2eb499737c98926077984451ee18d61a886b976ad43ae959f5b604294fc83ac9fc2a546b9b57351cc4ae0ec757a09e4e6ffc2ef12246a5172b699ff082f45678db8681fe451fd41250b6ac59ec5703b2753a53765ba52ecb987598e7da67047bce4c8484029db91f06c91985e977fdcb6d38c1fa3b7fd7d0abecd3e0d602f7ea37b8dbbda4ec81ea5c18bc4b1382cde161ee09e4bdb6c49dd81f974616f862bcd0656078ca43a976eeb8e44b2945966ed5aa8f9d7fe6a01accf63ecf46b0ee9f854269967e18d3c3f42424990c6badb52ea9ce90007da42c12ea33535b89faadef7fb966ba19ab1dfa2cef523401eda0d346bb70845c5000012c0dfc4c249f5f59b96b767ecfe53650e70f77c5b54f6ea8d3fa8843b461e39facf084bcf7a9fb215462ac9a1c832ec490749cdc71e5930f06ad5db2c38019260670a74a4220563a69b2d10952c520079350716a4c5f7e73b7b379490e1b109e9c6da338a897b2f54854f2e5c6d83da1df13304e35832e92fc6257ff95ebbea4cb7a7c0873b08af4833b3d97abb1d871c538198034de4d0ba4b80e777055c0f7487ed1f05186e90dc68769744bdd00e9ba3425058c108aba3d23c74f3d7c8e23ea356e54ffb5d6d9e360e94e117db4123810e6b54b4ca8cc4a05a072fa654396826a3fefd7911d9eb3ab35334bdcddc0bc97e195a5a43335b16dc61f55113f258ef6c15581300de608a8859fc928502faba891d74c10d2a2d15ed352d152fd48fc5320e87d345f4d5588039bea0c8df33bfb2ce454c5c3e9b6e2ac720e101015119648bf08abf1233f313521cc3f98b7117437d1bfb3dfadc8a06398e9c633873987e2ec961bddfaed6cecd5c9c5ba0230ecf41c80987fc6bd502fa888de1c1c9392759d8dc74e60502dbef4a17ab1e8091853dce9603e1bde06241b384cc588604964eb6b5b1e106fbeaafaa3d079b7637acf35b0f66e688df451308a6cf940ac0e648d397824f23881ad5c57fef5d0c22c4c36cd316829ee7c1e469e48dc0d0bb358fd92d81f0d8f33eccff59ab2f58c5265ee1440e6e46195ac51467a98f030ba3199ea49ed890000000000000000ac42220500000000669c6cbb17eb16f20612e10963dbd2dfc3a5bbca873988bca767530d19deb8cb95bcf67220388fb47fc505e7e41df71e045425506e91ac06e65ff727cae3947afa0c4bc499e46ad532b5fd65592f9772247a1efeb868f2963e24663dca6c9078000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007821adcebaac1d93a4c4066c0397242e9abfec85ca5719ee8af32a295589a3abac4b8d483ba25f3d4662257d0192ceab10c29ad098c62a98df779632ef8c75d1185f75312afd9266782b858738287288903f9d6240885f1e2732aedfaacaf202cc63860e2e68edbb1537fa907bff0feda8b9337c9a0047562ef7cc1b8e64d3de0309d52d74e2b246d20b36253beae80122215137b400559990e26dbf44a48dd878022f0eebd3b937f7a420b8ad1991d0c4c5198f5561fac355e523244cb177f2ea400b0865b23495806e9bde3b4fe21deacfc844890763045d8edf9318a6223eaee02d967e0e8bb03037d8836398f5dd6570b30a2c262293b18cd4ba77c45c38936f420229d0f3edb9a2a3048f8d9b732978dc1f2016d3c31f0a13c33b9b231dffc0c367031d62332ca97e9abd026d183b874a7293d18679916736b9c6e2028adb019a6399021de7792c31c320d88bb7865619b6ac4a8822b2338a39ed60cb5e8c95ad8e6cc4030e3245abfa073ab7c310a58b2d38c8f4f90b344451323332fd98496b3819399d020e9d356582eb5fcef1bf8aefcb6411b13ff89719e9fdaf7add6f195088ec516e86cec215d6cc80ea270cf9c9a45de2b0c6be925e683887ebed770e2b7a850d4cae47796aebd1f5e70f235d9b71f2add13cb9b80142076493c7cb566bcf8c37f30473edf1a3c2d873995ba86ef9b088acd09347115b032ada1116e7580014e79f5f7d32ee9aba706a1a592c7211b1320f034791d9ddc32f00df1ca36ad83b82c5dfcd5fbefa494bd063ac1c890ba894a82a0366ed308507a5dd249c1466bb00824ae34629b49c4394e46f87e474df27d5a0994d3fd736941ac9b424f95bf5a39649ca4a8471ee6b66bb77a9903e868bacf9704f37b8ef81f950f0bbcfb125e292529ff0df79127f9bbdfb03449322b48a626cd370abb98e51ac239a974455037effa83172fc795625988044f76e884500b654e4bb7e0c09ff2e96eb7d9cc3693a67077b15b259f30380db3e4c977437712efcadb6f7d55cbacd89a2e004b17acdbb1c139281b047b7f268c00adc75325981e66c82d39c3d6d2d26efc870e9eb3e86fc89a61cf604e415ddc365ec6030742744396230fbd35eddc922660d646efba8acceb265a9e314ef0f81850fc0d9d7a32579b0af68d3d057125fd190808b73d3f8345799edb1ad12a9fc5e992d0beab665a1a4724c706ca3da61e7871ebcb1450b069ada27cfb0344c6cf16a7d99a9694d92d85902e8612943350c377158f0d50aac00a0655507aa5f21c531045a275e1c6b1feba37e1b644ced202813cdb88c86fef363c434e14f5da91b6433f362e4d7a255aa589bb7b37b67e2f687564c6acfd9628a667a4f2970560d6f2ffdf166a65650d6f6502ac1dc3ec06a3d6734e25b35184785629b2eb1386d91a4af25e9e93b353ceb25ff087c1801ba5de3dc7bfed8b9877c4719d2e104da843f46c36373ccb846e509dc82b7400aae684ec9ed1ff1c87e8e05ceca52f489239eb1ad702b9ca25a6b7d382ca9b1826d6aaa64cd8152c6e288e87f70a0201955430c465b681f1ffb7831eaec24da11351fefdc8f4d0db52aeb63416121369ab98e56bf642ec2cc7d09c1a842f59af9560d4577f02a00f7074d43767a03384a4384b797269bea5bdf29babcc41263887fd7c5d0546c8ab7f2a909c14b40f6acf7e5c361ca77210c838ca74175945182a82035612fe1b641a1602e2e923a4d7fba1c68a2ee402677eba999f3905dc3b94e5825cb7c09325a0ccc5d6486dc8a950a6851ae80c37fd4f16a219d17d8ca2a813a22bd8c064dfd23f8675a36aca1c8ffb0bc49094f63018a1e442d7c0d46bafbf004a78ab4074b408553763b61449c6d05d4ca7fbf08e63adfff2600ba22c5f0394deff28a84d0444115c7cf918acad5e5c65fa756f1079cd2cd7879a2d4c8df76a3a66cc4fe405c3080958477fca20b787585cd97e53f65a401ce13e219c82e3eea79a13436f74947128353ebfc300bcc04a17f05805bd0f3251d41bd28955f5204987df042bff1c89f1978e37d51b0ce85b8dffd8f998ede320e4696c0b48c82d181257784cd73efe26029b898829019c8bd6087e9feb50eb0333577302b24a4ae21a8913fbe1f8044a89a3b5bc4365702445219595907924f7a500ed708a9b0e0380e2224365b0cd9bcb5fa749a80dc5a55689abc14df0db37724e0279f77de8b0e6b433dc6cf3baaefe454f384db578f4a4be3fd08d574b51899df3f71e0fecfa13c205d45feb00184deafe218bbcd61c0222eabbed8b96d0912e24037e3deb2ffb3102d6009aeeccfe7e21237b2cfe076b34a0465290820b523b6e25dbffab89b8daf29b14e83edf70e2b40c7dbbb2d518a74535043f36c7c79af5f54e3d692bf7411cb170d93f684557c91abdc9f423cc60c", "", 2, 1007345841, 0, "3f60c106cdff4b07d977486448ffafeadc839a664abb0543ec22fdaf994f9753"], + ["5f81fb2b01954b6744856416c3aa50fbc650bd7c61d2ae6bfb3c13e13f728bf7f8a5b69d1c020000000663ac6a635251280414f804bf3a960400000000095200516a6551656a53c1ae260500000000095253526a5163ac6a5343bf610500000000075351536a636363c075440300000000036aac630000000001000000000000000097e5360400000000f5502a5aabaa845cf3975ba0b6862e4f884996f3295597b6231eac84727182b70e7280cff27d8cd9f88eb1673edb3754f2bebaf59118550d14a4b9d77002ca9cb6118158b4c6e2c10147326e33409466a137e3d98774c5395edbc85e247a450700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d08cef375741dd90caa64ec9736c249ed5cb6edc7d7e6b2f6b94dbdcf2dfb762a90ef7b6ed3356db323f62965f312b6a53d1ebe0eb54efebd689eb472ff68983e1da1bf21b348cda00225b6435c30fb3c7d2e07af94f471b7c6e31d4098901284deaceab8fd44416eeeb05be03c627d87ef25c495ff0d5de1de4cf4245cb98f8022553db35d641ba6964eec411b044f9b4359170b56f8baf40c7bcf6fb6dfb25790300369c39df0d95ce9ad9ebb7ef5ff545b12bd9838ee0d544454d86ffc76d6a820a07c20eabfdc7e1f87ec625acd9b3ff267fdedca04039ce2ae92e01fe76e346fc92a3dececa53249b869e463f3721052cab2b1abce0e3f259b728369479043b7002272678591cb6c25ce93f136ed986e4ec1ff2527275a5c861f2e082170c251c870312d18e5501c5078cc402c035d45508b86f31a1ca69bf6669eaf814a80567a5a903021a217ae203c5f22fd908fd03fabb504cf33c98965f9fafdc536f759b70eedd030145ca4ec22f4de6e9e54ed575f319882fa7a7712ae38f39ca17e1fb66df3a49021fffc1e0d9cd7ba02e704850376e673869c031e7fbd4b38440bdef1faa399a1c3fdebf698c2d71a1302cac89735363c3b7da82c364216c5097c7545a7e329412145470d07aa46ed93e4da377c9f263f573b016fa59ddd769d78b29a0bc25d7455d524dd1c6839fbeb1be2c7df6fe365ba147c581302c81d107939f578bcf7bd2d145c7d58760c8a68d37c1d630180e16857a8541201baeb53d08706de0bf4eeab1c68978ea3861949b2aae9481e36d409d3a0114626268f23d75515472077cc94d65e6dc934a17982a401bbca73df4413d6af07b2f98e65610b0037d4328d67f61ac4ad3cc5425f2b55fc947117b8209a43f6250b49f01e9e9d15f4d41d0f7951968c77b177bd0dc2bfc3ed5882f3da854ad64432764c0ddee432cac1ee883779b6bb3dd6eac344278f12959c29de076f7acefdfe0d42ed4052c12ff36cf10004bce5eed8891f094d6d1efd227142b1eb0a57aad58b4c76c0b11eb458b19072cf7a2a4d13d61d2e363edd0441221f51f2890419567d4e9bfc3a26d22df46796b46c5ff57c22c70b6c2328083cdb28acbace8c2e8606ba3075a070a52b80e23726f47477ba7d7d0033c09e6acd4e44eda66f47d39cb97f0d45285b8671f20ddb6633ef841369115bd7818fd15fe9c0271bdf77cc6dfce88a564204ad112bac9d30da12efa90ac0a0faea9df540b2644a630a4c265b15dab0ea6bd93a98aa6ed2aeeaa446896fc70d0f1efd643a9a5cc8764cf42b97d6163b9b4ca146a09361713b8d93a319569c9ca2ef21907d51dc5e6a1ff6e084f1c0d32a4eda9662c400ac19ed146636c6052a8cfd169513e8908810de5bbb67e87c0744a6048cf5324a0845c6438bd2c5ba3b9b55527918a1ab85385a672a76e501538bd5dba663b4c008d1b560d1668e70cd82d7ffcd7f707e323b6b2f268d3a668446d3396454c0b5aa2b8380efcbaa44e0e774c3ddfa97e52784f8152ac4dc7491350e69841a78bcab794422b7b6cd018e4ba577008330057354f2e33ae73d7a71f2e62ba4bdaee30b6d78426181fbabae2690a3722370adbc2c4ac13282a404a9c71953acf1c64d432049b0ac528cabde1e7cce0895a87372854dbc93230cb80647ec0854022d3b46966852d35b7311ff793440cbdbbb24f1ab3b1b6d32004e5fcfa3de0a35fc1d955c8019f4660658ae33e1ab4116c858958d70f97b3b4be6770a1da872e29d13c3d298b984ee36918bbc58921b6a8ba606998a26ec005d166ce94fae8f03d4c4a9ea420f64640773b145c4243c6f4001356f51e92b28aeea8298b0489a5c7e2be2e4365ce39759dbb864bcdc8fb5c94ace01324e79a5d871aba0f2b97e3ea6d86e656a6a77816d47abdb64756ff1ae682968f516a9d0b51212cc81055ae7189911a7b564755ff1eea545498b82a4731bf963e4970bbcae668cfda42efeb0372f9842179a264c8c5ae22f9364fed077abd3d961a5df6dda9645eaa934a7b3dd1819cfb8a76b37c21269759b92b3cf78733dc5f6268e3e985e8c2569a426f252d3d3e89166cc75120432235238ce95c6ad07660d292dc3f11b4009aa6eb745fbdedf999fd92797522df627d6fc9e53e019255197072b50b614e17201cd39175147242cc83c344de5301a95b127b833da3953d8ed100b6538151ef4b028db2ac79137664b9f8f927764ecbcf3048f2aa373af0e5cc50211b554facc139a7c2969d154ab12581a955d9579e51f44037f0a047f2b8bd58c56b624c59e57330132ce667366623a5a3afc78ba4a19f48b6ed9d5f87e300484c8f0295f23836c5913d3c5754b0191a0e1223575b152541eb342cdae9cb37232ccbf96acdc9225973e58a2b4975fae4228c79d392d36b76079172e35a6b02", "63ac", 0, -2109924774, 0, "6e5880f7412602698e3cdf0bf1c668dd251602ba537afc73a700ea13b5996e4b"], + ["f9229f25023770c6c79a7e653c90ff06fdd85e78a1ba23e20904f53d485805b115ca4bcc960000000007655200636553ac7382f4b3296bd5ad607a6945b052d4acca4bd77eeaa37d5bd4b8b78019c08e3e8557c61502000000060063acac6a51ffffffff02c84dcf050000000004ac6551acf274180500000000036a6a52db2f745702dc11a80100000000000000000000000002bc0730a69e541c6871951cd14d390e6fa04442dc41e4b1dd670223735a312f725c39018d4d452add56def5fe3218903f4ee26f89af3ab2dd0053bd33037227a27f25680f2e96ead2c6ad122949cc7e232562ef69e22a6d4e40e6ccb2842c7900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f088b90a4b133f409b215735bf880617d7bce5f5a1e3574b0daf8cc9cd9fe5cd4796ff77124c17eb1f0b7731797b90b74503fd3123fe64ed56860a43f5ee3812bebbf8b45f8f10bb30522231f7619d5161213aeb6e437f05860acac8e8f6e1c33eb639872ab6fd973479b1430a3d5a00f3e3fd9603f8147241e37afa76333a0c020ff8380ec5dcc34ad136c5d60f9c27cfd5f34e3cd32ac0f3e5fdbdd19b37e5bc032198ac1912620834dcc08f24283a80c98642c76d8f0200c9001288fffddeb43d0a055720d089948230b2af4ecd340776cb8be9712d57eb7407b05118fa2118515fd8a44cd554d99f4880c07edc0458f24126c6e46a0278040ebf6598a51441e8ed022ea00f0a12bba87573067241d4ffa0daac43010daf8e726da7560fd26867dcdf02099ad804a0d509f263adb652cff5479b331bcb48e198e6a50f49764277c923e4031c9d2a5461ef1d866336b99342f5229c3dd590f20565f0dc954a0f1b20736ff80220b0a11e9b6857c30c7932999bda28abf7c059a5e96689c9c98affed753987200311d0a7dc963c0c055efae69cc679d319946f8c5443cf4aded9bad323e79831a4b040a071db8f0ac93b1a182e2ecf0fe61ef1c0e6b98814c53ceba836c0bf3eb20b1e834ea20584c753bfec3e22afb78d232bcfd4e4abcee200db25ce6b65de7fc6419370c989395c97946fb9408b4f0dcda2082682a9e9ff8f7b3f58dad8e97f32c02252d0f59c1d58442542063b2adfcaf3723f187027555991324b055b10143969f5c262abe404760bb8db919f5355e428b5ceacdaa6532ac9fcff08843c29564e0a6c39b4abe2f660412e23d22c749d94b4b319e5937131979add7c41aa00d207cfe45fe69f77500ed6d51715ec880cd49e6864f7a1d54bc1d7380e78bd1f661ac1826a580f2542a0a00b290c340fa60fa157ac28ecbff1056dc3854d4da88f30fcfb287f5010385830ee2121160fe6ec1164e3684acbe1607a5b73b931f8b9eae9880a082ea8c3609d8743c2e880bc110ce2872132fa410cd20e1d07d53c119849f142dd684d2172eafceab6cf60f2a349b5162c3f17c23f19cd299082807f553299cb8c3c9f6e89a10df13cb7b5dfa767d4c7d19167832c1cbf57a209df4e401eb57f4b6206de0a5da260b5f1f3624229c08d8031f1883941ac6807d9dd7eaa2c44e875de0b9506d38af6ef1b5eefbbc97386f6bf3e51f6c6ac1c5dd0445f35fe135c80002034ee15d8437bc5a6c5faaa8878196060acdf1cf01a09a7363813e068498ade61f5ecb2e5a0a1dd4c9e7849b886383737d569a3fa61edafc30befeb3b21a9893615020d6c95cbbc708c552b2b11ce8bae1323afdac768819c11ac7eeb8586408dc4ff1132ebda7fee12bb05e401245699622ff5c5b28bfc619ce93fda423ec2c215e745111bede68bbaabf79b5e568f1aad2c4838d208dc08ecb0f3aa6e69e1679e920adf4636afe40f47648dfae81b05f9220213dff9984df0a12de21aae6bb82aea5044dc6a7174b716515671fab11204a1f0983dca9cda79437f57752fae21641d29b9c346a51678d372a1153198cf669e42a260be9a0c592a9237a85ffdf597bb00caa8003be993b095431eddfb78680bd7ed237c1e2b2bdddad62481e1b27e6ac6c2adb76999d1ca08a4e61ff6d8412d835e5bbb5087cb22a6b921e99c0a876df42e363142aa96b0cf8476d3a02a73bf252a49ff5204044168bbffa14f11c533718aa270216e7eca6d6f18c335ce7a22123cd1042ae94e045b918f6a9bbb3f380e48b29d8184344f774faf2fc69db5966b23425738ac3a1a667f45bf94052778d27ffbe208936993ff09af305e9190da05f395aa65b2fbd6df23a98b9846851c0eb96e259a6b349a48b901770fbb9ec14438e198c05d161d2673898879ef273057243a9ea320c37ca8c74e735e7fcab27ba2809dc6c767ac6febf363762a5223d7b3c32853a513da348945c3618d1bbffd3b28e8d87843015ed4ad8b456b5664b060078ec295d45555fec3cd799ffbe8fa9d8f5ab7b56d38e9056dbe113a3e2ea84ebbbb16d5ac21654aa36daf8696806d14b4b998e2ec2eb944274d83b645a3fe386c4ca307c3a00a1f8d6cfd6c33377ea0e02be9db7b11482a3090ccd491e33ac4293ec86b3302ecc0d6e9fe8a3b7513cc0e86d98712c3403d1a1514b89ac5c40e5a60131fd6dc6ae12ba0be6a5268051d117abcf1565c6996ca9d8cd1627e99f606a1435290b89356e884a3c62d4fff6f921aa904fe9f29bddfc51bcca1309758ca35177a534c0000000000000000dea8860500000000f858096e76a611797dfcad77d730ab1fd869a97a59c79ab4dead58574b75260d0580aaed8430fa1c960a0004cca1fd88ffb02e82f3d3c1afbae25c0ebcf77bb5832765096b7e4804769550df325059ff1e1b442488e79d37cb949585c4dc797f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c317ae26211915f253a55e80ab47ccf8163027775e6fb90eb38bdf7831bf02a59f41a909f96e08db4965631641cf90db8c255d779c53b00f19cad282f68bf363dd98da158c0d6e85de98f7aa285a2f78b5e423240515fca8ef383857005a040e46764999474df5e29cf6aba46fd61b7499123a5c47c0e66d6542c368a4ea28e703052d4191e5d3cfe84f17ac11b5ec9a4863b18c92eb65199265354bbd49b7bdb7032415723d5259f8f30fb1dc803d7c8afd5a9ce508dca1838e153f5611b8530a370b06ff2bb43c69094ce75782d400d29261f7e17b6c0377a459a3a523e886009c5f996d8f675514e74c34e9a46a3f4821a54bfba58df382ff2692e364d4d2f8d7860308501b8e8ab37a6f7393543e0da138d3a86bab09692ab295fe217f1a9731f316030257d341f79d4254e2e29fcaa703e6f1ddaaa969affb17048260f6d470b93c9f020de8ae068d5cc3c5ac203f8abaa8a6c95294c56c47c8dec5982381e6ffaa243d030cda823db1eaed9ab4be0ac5047a62c76b093dc0de6c0ba4f761f48955f76a6d02032e3f503030d3edc992afe758ae7d9d3979fcd8bdb9087c6e099992ea8fcb125854aa3dee29b5229c84833d50c851bf0001988d98f57e24f68902ea1dd283c4967c58ca7c7ab73dca2119904d7f830a60fa5ecce64bfe646e6d3d03c3ce403c4ae017e2bd4a875e6b71eb2039b2868157fc322b6f1d35646d18784097d50ccaa7396c25aaad6e35c187ba8263f241ee9a4e73e2c81f924713bbd53d3559f8ac61d59c64d3d0aca2790c2bb6cefe10d7d973c32d146a75335422cd960bb5f0b389e001611951c46742ad82025b7eade52d210a69283588d017198a552db711bbfbc3db91d3e9b584437bdfa35e9e916858bfb6b827669534d54a17b1ee0b0e56d3be09b8f9161fd9eb2f52e87155bf0a872d53f5316de6ace1a9e233839915a0f9a565e268123e5bad082278bc11dfd3e8cf028728f6ae2687b923f85ff5a4efdd507a6c712e4274d499455abc38b0a4864a64895deda556f7c04cd1e6315789f9cf057a64963b7981a3b2bc246e0a03a6f1a778204079eccdd3992bfca8249f2f346d02b0c65e00853db6656d1dc0fccdf229735416dde6a867b15191ebb04448db08bb7941b11093935ac9d00beb80123d176d7246fa1531f3121e6b3b0d241aa9246b6870f0f0f2b30466721a5682c4bab4ffeeff62320e8049a5a96ba454fe39adafa43f94fc5eefd4c1dba48228291ab0ef308d18b5ca1f063920d320b85e88a5e2e5dad661a641407a1032e8f473718966dafb139cc80a3007529d3e963b6de870f2bb73ed148b0203f5a978db6250817b42958452f2475520c892fe78ef3d526b0d9add112e9ee2cf07cd6bf381f6508b23c617fddf07b4b22c1e0c54b608a8d727c883137904cc3082385d5cfec9143a811b92f6af45ec072d41b7949b2aa6d8ea23f55c9f1d7999a895fd57e52a70c6e0a34827caed55b35d02fde04e208c5d069cfb77c0ab7db1811839b8a92d80b5647c9cf33c0cd544c4d6fa137f678e8ab811866442103d3fe5ee69fe79772ba7ab8a54f5010f9aa1e87202902dbc0e5ba8cb346e3796c7c7b4626775d48fb5859e799bb2c089ade9d3a1111836870aa93434f50f92553f3e4a958339b3ed1817274c2f628120ae69a1de814ccf16ba9ee5e8ac5921f13dd9e169ec6ddc9b913719219a2b6eb27b5c1345b9a9c5aa5a1c9c2bdedb4c38aa8159342f851a4935ecb1a80d3219f95ac7e7266ac1bc369bb1158f3f93eeb3f68f32a5d8c18ed4dfd13a6be65c2ec7d6ee2cf755b50fa27f492be680c7bcb68a4562ceb1b058b1cb4a725a88f69694891b5b3350576cf5b64ad12b31fece54a6ab861e4d67749aa0ad6b9b1b05f5318a65c3601f4cda1112af56a28c54376a065a3c6b2b7414dcf09a2ff7c633924e00db13a39aafc7d6b3a9d879ade03858c6937dc4ad1be73abc84f4183112596f75cd49eb0d9877508b29cd8dbbec0b6117c58b8ec25cec1f626ef1cba19e16437616cd49cf52cbf3e19f6ece19cdb32a79df062b30cf63176ec20f59f9a492cec79ac9ea7ef1083ff894bed336cafb37b9907559b30a015aa7c491c148c400f56e3971bb60c5302d3ee9694d60d886c2217f917ec11f95366df847135e62bae9f6466f2f500aa2824f3651acc0c6f68d2165f8becb0caba24dd0ba9e74bb47bb27e4e28689b407abd70bd49007b1c1914323258e710fde65f74a81ed7abbd3623d5268be2297cded78cf8dbb2a93d63697a69297a1c2c774e25465dc217917c61f18d401cc882a54fba7a11a1a0c376516c2f6ea447bf0c2d8006b1ca99dd28c4b0bdfbf8e943e70400620bba791f9c677d4d84447c54b0265a07a26523963ae03f1d9fc02ddb993264ef531b718eaefbc5ee99c9e579b02", "63656a53ac006a00", 1, 234825280, 0, "e764a010decb49cc8400e8616b23f253d556493d34d777f434e0ffc12daa4a47"], + ["c1ae255901701b6eac5525d4f4ed1acb6f56f2507f95b92fbe9209f777c9c05d12be11c03c0300000004ac655363dcb9d7fb039c8a8a04000000000025be78040000000007ac636a00525263e8b77a0500000000046500516579d42cca03000000000000000074428c0000000000ae1875e6d429506292e2899ac9d6213c943a6ec52db95966f20e3c07ca20b79d34fd6bc8cc1ae6d67a7af285a8fa7e6e1118c50dc68f52dd237c87f25659447a7b848560718ea59091fca7ad243dfa70a0846b16b9c07c2767ebdef4ee2a6fcc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000252051a01a336b980e5592be7d52064a74ac5e1e0a59e9b988379fd08748c9a9bd1fefc136f9a017a866c5db25d27ed29933b44c4a0e28d8bf05fc1ea87747e9a64b9c1b1d2626601f8cdf5c3ebb32053183a1e6bc24e4f28d8da91df06fa4bc728c23cdfd7b161396fb3edacb8aed42cd3e754d441a1459e3353af65a7395bf021c54e28351a6115d1d96fc7cc347edc469262a809600e00d0d319e4e702f11d4020a582b2d14248b362de6070a6bbd46334e7df78b601536749cf078750a00082c0a019ebcaed9ef813623d44bdabbd608dfd939dad3c3dcad0202033821a70fc085ddc3d9d26d56430b96d32d3bf1035821346d6998885aefff438ff881984621af0321bf08e12b5a32bf315739a31437cc81c9da305b869eeeb57bac1bd8ad90e576021440534c26c2047111baf93e4f45a3acbb45115828341f0416777d473c4c71b2030bd79a2dc0006872d5beae49ba3a6284d3f7da3522a3f34f305280bdc11d4761020efa1be22f4fbebd2f0ea9711fdcab8a7754ee261f501f748b3570785f5ea5380329d21c570c5c579b35c7a00b8a3ca10235b0a0f2a421ca3aa69b7f4837bdc6c89d7e77c1b8a029aa501cbaaf6fa6a65a55bea12adb43a8e2bf372848a910a2f57709a04c15d121cc1c0f20dd13fa34f8036968b17b70f3c532f19d7d5be0e6d7c88bb15e348d2fdd3a93254c52c3943db387f97cd1f97b92cc3aeb29cd925a4a8f240d3a2282bfaf1f43cd105092e44e1cdb626ac244bcc625c0bf72576f9bc007e62c69295b25684f3dfa17a23746c8f6cfcb4df467069793ca8e5a9d24cb5aa9df8466da9219de38a1a3a566c27047e9b8301c99bc36095c16bb2e3b78c38ad1e181583c8104d64cd5ab22858cb136fab5fea20d085668aeb3818980bd38546346aef3e830b7ed69deb71a26cdb77c5299c0f41e09bf1ccede62d197d60ffcd0c87fdae2661bc9f0b9e47e78ec8fdafa0e2b298c09d7cca526b977cca0fa316283926677df66590e59889776ae4008785afbac074167acf475b26aae89105d2b58bc72bd1c6744aa0a6218dfbd804d0f2ca42efdb16e01ad2137267d7254654c1381a23c7512cbd59b7346a0e361e232a9a4f864c3613e84dc15336f0159cfdcfba69cd010aa65598e7f32cb7a2a6470b3bad299f2f4cc71e7ab5b62cf463fdf5be35ce74a1292b7cd604636709803870fa7b8040a78213c4f94376a3e37b836a4c77fdae8e2e731aada7b9d93eebd35948b79f89671bdbf783670559dd4e0c716d12d498c0333ace81bee2fbe50578f67156701582a146fbe282843ad40f05ca53b0e3fa8c1bbbbfdb41fbaf2f8ae62d3b47fb57fabf82157527590a282c4be6d977e644533158c64ee915088a30a995ee3f53211f690f601fbc713e6f980b19fcc1bc743746d56b4a8d50318c197a479a11c9880ff8b28342f3e8af53e1b93818aebb012eb3cebeea25cd8b2054757b83dea08cf9deda46a10e070b15d31d97ee6c4b8af0388fb3cf879769b0f381e6668a1dcc838ef260f0d762d6387907d072e75dc029aa2942932f28676e0456a2760203968cd423240dababe138746f7fc88ea78850608cf63c0615f560c705537704df3fcdbfc781a252929cf394b30a3fecf5a956dd9c41dd3ec2e8e1df601c3c05fc107278ab5f6517e96fb6e570581738ea50767833e0cc3c474c6909821fcd9752458dea2d0f7ce22b3d1dc600179829a7b07d77fbee3923acfe14c837060e729defb016ffac5f8194c24852574c4e38688e065b2f153f482500658210b7a99dbd1fd8769ee3c6b7203f86b5fb8f999de41f4c89f09943e6b0843f73b6e5c140132c7c034fd6f5fc6b2eb19cf6c175734772caca96b8e59a058874177de904b0bc86aa60da4bd7b0fb1b8ec8762ba0ddd7459b1729c363dc033b0ad38a32e9e1b2bb17230b52c9987a5b0a61bf2c5fa93446a71e750297daaca0e1cf925fc37ab77b244552b6cebb8c4bf6e1eae2aeb0f41ee1ba4e24507b2aa78aa3f933d1f5a65a896be4f4a31122265784799962df07ad1f463c1426efcdd53074dcedb7eeb93b67dff2c76b38d69b502e465e9e4a6776ba1697ca06f6d4323606a41f3ff4342b49821b35ac3281f2c0a27858bab62a0276f732b09b2bffebbbe51791d6e124e95d9a430974f191a1a478b6af3089ec0b360e0e0aeba8d03f2c76531aa1eaf22060ee89091029da4eb2962f0155464afd07d406ab7cc5b7c3fa12c0254314f7155e626cd58d55534e8970f08920621d283fa2e49738ccc1710b793a7ba8940bf03000000000000000000000000e5fda64984e4f44fb63a2325e2918309a96d16b4c314a04665750b46efee61135cc885d317ce5d21e2886372599eb86adb93d6d17a31f5a2581d99ad85595ebdce34281a1a8e761ed84cdf44ce166cf16779d73524c5132a615597df16b024eb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008bd0461405dd11d4780505148ed640e0cf5d1c282e48eb16573c435e3563e978e1c0377c20b39d31993c49f25c240ce9f46573ed88c670010578e8042b5e5824dc0ca98c18e97c7983f11d351f2f868329603e3ddbb4acb90ef573e2677495028cb78ee877cbdba8e9d395550877a2c8efd5e2958028a6868c16fca2a7fd912a031d0a5ee0e2542774c93c37df2858bcae6eb8d5f289ce11052211076976d236d80219d03d06410a80ab70f22f4b7b143cc9d6c02a00addef16f2bf64b081336eae60b00675535f6fff41f3bf8ba7fb474c729e654419ca36137dede2d959a52fb9bc3bf3a1803d242c430813da4471531e99c5f618553ec30f815ff5cbedff9a1f9ad03138c8d19cea4e48effb4d15c25d180e5546e0953ddb95ed0fe297ce86c4b9755031707d24b09f5886117a341a738d1c933119d3d9d7458fd92d84bd889ee5b2d06021330e3411f5eb5c29f6277cc96de0b8adb734486484ea92be517e733d3be9ac002080d2d68d5f8ae7e1c98826f93d0fbe5d57b7340488d8e727485499bfda1ff1d020bf5969a94d7119f488651a895d6f437fc7a64dd42cd4619123651b884aca6f67aa14325b05f6d285c70bb9fd439c06301b938b0a0ef9531fb66cb194ad8ce182d3fd73e2e3896f0bc1ea266c0fc6154bd9ac0954c14036f955ddaf1470ee52cb773152638ef8ab1c622dbeda7e6134f4433763dcf80981c6bfa2cbb753cd1315f5bb5193acc5712456048943166e9786be9a677f550e010bb0a00417e4dcc666b53af4ca29aeb78803e3eba49c1afcb78dcd05c1aedb078c5b701866e954fd26987ed8cf5d5733b668de6e34841f519eb78224030755212e958d272e2ca22e454d4b23975ccf78b7a4b30253a306fc9ce935c849a96bb6366848c64cd3e1d4a136eda598b2391fb98ff5757c70b95a745dd425a0ad9037c373e95ecbd18af834946a487f57ec6900ea3aa333f47c2dc5215b9cae74fda97296f7520b3fd236c795c7e471fefac50d679c39cf03901b6c31b860eece427b3aaa79751646d905553ba876936c9068018598eea9b24c37e8e62d940aba01ca9166bd83f49969ac6458ea405728bd360a740c9f2f6d61de6d6006aef46ce0e9fba30e16de42c59339ccaeed2f67a3cb11d86ccb73f1c15e628666915ed7bb356ccd11886f061c207e87198065d46db46b3b70fcb03ec40aea84e403b352a8fcba1007e417d8881dfda1ba9f7e476d70997b813620ed8350cee9cb537c4cc8beaf38cd34e483cc7ddc2650f2fb40462ffbf7919f5fb679108f2408903f5b1cb996f03b4471e29b4b8dfc9232737bda791ddcaec57340732405c591627a89f559866c17ee85f050418b8b0d0cae8ae4f2f95902909f4a67382d7c06aa82c359043b108700c4462efdd13f56b89200cd34d20838984f4b08de0187ca2fead889d6a65986b47883548096ecdecb0b272ff5c6dbc05c402f996f4d5fe1e32fe2cfb4a6c63a6f324d96a855b7a53320773af22a6f3217d26daad66809746f7242b2944413107ae41045f925123b01febdadeb9f845a25ec1e5a1724b157e49b64b57cf01f96fb3a2d505b6a025357c082b333a9b7d88431331b1dffb41fc2be0c8413d94964ae4f9c58a8289020b4e2db6af8d2d8e9f1c571a931680b77e23eace02ca69594e014b3499fe14bd1b49792e64b31f088b2d9866d13d50c5e8238ec0e2b145772f5aeade7155020faf1394b80a6c73222a5f63c7b1f1d0a3e3f43684e2e4292aa5a26a6355bdac90ab5a1ae1b73e068885a0ec5563585dce5d7167ca057f4d561f67ba7073278e273fe883d34548f0517a5f6d63a0c730b1d1b9e708959fac6f1702a7589cc33c3c950191e1720f64c2bb47cf37f74eec4d6a3c6784eadef017fbbe00ac4120bbc5a8973578befa8137ba8ab3778a3ac04e678bf227100103d2d0f2f2150338ad602da1d5719f8de4142e1a3549dfde8c76cf0c44830a15efb7b07969209260c9852e8a1ea223f84d30c8a369bafa03ff814936b04247aaa7e07e397d44ae14eb2c376666240a14ffcdbd57d4902d49e906a6e806b9833cc855256c1fa2a7ab2e9e0204267102bfcd0cd963870cb2083eb47d1269c050eeb31563d13696374cde5a7be961ae8e98b4d37274be0c84e9ff0819866b687f6be9b0e56a423a5fc61460bb7fa21b025cf1ad10370c00a9688367dac01750ef9b5c70a15d858b7318796e92c10c3e1b5e19f68b1d89bd85f6f35a9514f934206532f04dd607909f75471d1ce8d60ef58ef3ab6eb935f7e96aff28000000000000000076ac270100000000270a621a71b12ce8a9a91ee6b1015c0edbc09a7315819ae9649882ef6dfb3fffcaaf2028f72d667c8187617f6b0105da16fda134caec9353e03a5be3d45cd0ea9cb681db9431c905e8534b1d5b0f8e6237afe3116f2ba266ff2b2f15344c5fc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000902d9061d7ba77e924eacbe451aabbd44e00e72911129bc7a25abcd627fd7a5509d2e43e5138a933ca370f8e486e1eefa572db08f078e43d7bcbc1ed7d738c857b5cb30d8b0bb74147e14721f47e0697102f36e073bf67fca4e28bf4ac21df959bf8f39218186eab122e7d31e0fa2db37676b6716e1ce442b74eca7ec94be0a803099502bc36d34fdbb89473bb9a8f44c374311cc110e89f3c57b86e361f5d7432020d25cc94a06fd1e86bf23d832c301c54168ce990f1a09ce2f8ea275d151550b50b02e10ae51f26af3a72d818a2dcc9877a14ed60b91a6d4945e0506e07d24cdf29d2db463eea7ea95089ec23e551141d909a00dd792b86bd26bdc170a5cc5698c3030241ae3cfcd5b82098919c0362cf5030b4979dcdc6366205e0e4cd583ef3ed8103151f194d84f8ee6385b9c340e35331267c6cab5bfefd736d28d1d3b755acc01d03070503bca918e7df4a00b5ec0519676260e1c469c9319cfd623aa19117a0b0a802287ae69c9e56914f0f1a9382170e7d7adf34f10e26b3cd1f166b4f3fef0793740212be3cbedae08df5a7160b6d703e3069b91af64de5dbd7dad00fa1610b44b6ff95fff756d68d842ffe723b5dc822547f9c7c8aa66e97879eaf8b226c20dec347a3c82f27b7b66b3d348814ab1cf9c09c23ec287ffa7fc2b671dbd1a0a08b27f6980ad3202b107f6073938d7bf980bbcea3207e2d6dbc3e5a76c8d60fe468831dae11093ec8a002895dda8ef4b8537d0cea868a0844dbc921ee4b025094ecc2cb1dd16c337fa51cbf510460b0daebba6e3b91b35ce4cabdbf69a6c13df6552a12fc0c115ce6f88f2285f1afe84912749a164926bef5c500b5cdd9167649fed13d107784a1fa34fc812b66d50c03d2b303d165e3ac9a2f5e4cabe5c496e8846f0b944a0d2309d121619dfd2f78b410cf49814693bdc2dabdd97ef1c746aa6401c3ca37ead3ee68568d1856977e4c63406636737f21d3bac675955652ee49091193e7d64b50b26177599a03c8e94aa6cc74c234bb19508a2be08194352ddf0b34195d0dcc3469ddfa1baa39d4275415cb6fd539225f35eb49e08e247f1e1ffc480411673d97f9cebdecf095ebb7066293f7ba6fc03a64daa4527463d0ccaaf32d2d7677a6ee6868f63a8365d5516537d5261ebd899ab43c89f5ae4ec1ae10bcaf0c3dc30807d6ff6723c81bd05a1fd3b0d355ff3f8d49b4ac562a93ab51114bf95714cb9134f7de752cc04827756536aca7d353f571cea7c158923f057d14471cc53ea5a53586d1c3fa39f307fb65098737f1e06c027af8a57b5ef1a8802400519fb91231c8466d46f05f6b39da5ca1c2c3d14dce42db231f9546560099f5338c50d5895449d737669e4613c3ec00eac8f2abd03571da97ba29fe32c6f6e0413ce645bccb9538901d42e32a8635239e943b0d6742900b5b03cf0cee28e59a035a60eb21a8e624eaf21bf259d7795bafece81c4a6abf6a617b9f721d2966875a45ac2cebee5fda6cb3d6196ee86c690cad3570cadc4a3b591dde4d79088f05fe20ff8b47f7d2c11bd0d7f02f0900b8834d68edd68d84936b9ddbbf8842b0fc8613abe18eda6002202397d0f00cfb621ac61d6b69f9f9a035aad2b9de41846d8a368a2790a994f416607e38f193b4028168bb8978cfebadd113e81f889b5a766d8c6d4ba9a3a11c8d2d0fdd8b27d8eb90996dcc11a7df97fd78dd2cc49d30f0d2806e6233179e5712d7435d0bb4cd087adad856545a78ff54a0ab81343437198f146ea10e8cb109f3106bb1801f60454510a01c3565b826df882e7edd683f9bae040c324e4514274591ec8ef03d244dafd12faeb9cbf214af516b2d9b8946df6253fed66945b8d9e187af8e78a1b2949bb00170dffd905268cbcbef522f655e6f97226815274ce507883907962a9af6382736610c41fd33ec13519dcee4110224c203492225a414e82f4957ef3d4e2b2bb0996e9a9a860fba93c5e9c43360446de99ecc8fb5b608b5007e70ee97525aa7073ea135041e293a1d194a7f987731f14f30cfde0f34a5d846be56da0ab47363180b0d5cca094280117c733c20608631023d55758e3acb2bdae9853fc3f69cb5e5bc7c927380e35ef89b1587d9dc4791fb0a8dd553e1803524f7a8c689529c0baefc9644dea2945c7f1c3ab069cb1e5a588d4b006795dfb9651f04fa75fc753be94de0c44b9fb44cd6769a934d79d6e223e3c07844beb7ab06403704836cb50f5101fbfc170f8b83611e6b9cf098395cbb5bd93ae89fbdd8e2ab99e02d48513b9edbe3aafc2d16e98a5f5b867d60dd04a9601c0c0a5808714b219d837cb57742b9b0718575ac1c13d719473ec88584b64a4029c2c2348b8a31558b2a4ed685fe72dabe7526220baf1b2ce05e255ffb74b9c3e6aa4ea3d116eb0da34d7c177ba13ecd0908", "635151515365ac51", 0, -1632530881, 0, "60c48790914c28fe6eac6e13113fb9556b50949945d234ae1b7f2f16170fd082"], + ["030000807082c403025ff87eaf69f6bee2b93a75bf3da106e6f96d7f845da210a5aa8c4e4c5c5fafe102000000035100510e2bc1b8227c95f961948fbd1f47e98933ceae4a10778e65120d6f1b9a3492857b77537c02000000016affffffff0237e183040000000003636a52065d64040000000008650053006300636a0000000000000000035f05ca010000000000000000000000003ed58891df503adaef2c1916b3b8404b35bbec32d92560468dec672cef26b9f9aee207ddac5f7a124dc58b8758e517e7cda820ffc249eca7a6f10394fd5def003e7321fd495521202bb843e85c73206a4da4288f2ab49b70d8d5bcada4ad210f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000958ffecc8621e793ee860ac023248d87653cb54712d0413c70b3f896778259b5f5f23d19c4b020fde8c94022cd455573c764bdc65448e8d28e9b545573291a385254521c5970d1f614c04c3804b301612899bdabfc66b96cec19e19f34d59a71431716bbe2825a49ede8350f83a252b6b926a9e58d28be62e92cbc204f4791ae031aaa820252352b4bf672e306ef53c283f1f6d32cc8f75b8763713ba5cd8e5b840310e1422a4b4cb28ddbfffdc010f16a750fc48ab6a17df124262e7839e2487ca50a02166b2b1e078b7478bed1997bae50483a7fd6f4cdcaa375d507faa79e92b235f65f91ee3a41c5fb2cd280468922997cbc62bce4c3668e425a4bb0e394a4d307032cb6833ca5a90e41dfdd4cc22c28fe6d77e850634ba80176d4659ef6464ef9f50316b2bfd977ee22a06fbdc7afec29d0b11892ddc6c72b0d59f158da497e4795a2030c98904850e29b7886952106453bd32a5209e659a1e4dedd5dfebc522c39877c020699f22610d16ef2aab795de588b716cf6ac30122338fac9749fd059fc8fde000300aa266a7e5fc9604276be903db94d4ec91e51b612d18b949eed898ae154abfb010b2c60361d916df243720fb0a779f6a61438cdcf33bd6a45df73668212e363394a498f5b23d101666d1c08643e20833688d2bfba1acb8410433d5df6acfc4a7dccd75e5325846f6bc0d03dcf8328901c0d3c231fb43d0b7efd7298b10e783baf00a67e8398c6915e5c44781eb450724c18a6346edc18702a7333b9db46835bf9c06f6e8edf4085bf70ca5d95bdf58784a2adf9a72d8cd619b2061759cbfaf63b67f15004c0d9072437177b47d60657bb4a86c7468a3fe1e57ab4f356bf2991eda200881735cfed57f95ba710909c09a962ebea8f2fbb3f1dc588a7b9742f0f82bb1aa0543bd1e796890635bcf7cc474063ab5b72c54a76d2e1616988ad4e2e66b6501b1b60266db245e0c7bd32f386e51cea962ca2f23b3188c358edef17af1702dc18a802ede81ac9db0c62b3fe6d64d8dcc8d0979ca2a081908679d241fbc5504fa3928a6e5f4cff9978e53cca76f11bfdb86b01816926e8f30b64f0a4599c70f661609162fb8573efcae238b373ad26fbd2a18e903a55eb595ea8e757e705c22f65990e38cb8608c36a583e31102ed5fea483719dc1e92137ec8f1927cf35ad210c063babc95c307a66fe6023133b88ccd533dd28a870b6c3a2660d16f6018c83fb1542fe652e8ab83ec88f4cafa6c66b0611de75b3be1bc4aeff0019e422c7140c708b9fbb7a92329c8eb48ea86abb8f682651758291d49c207222608780bf4544496cce884a31c3c26aed9bf551eca84486537969b2890ea5dc7b6655a18f55ba8c1e8be8d0263772485cae976040148cd3f1a89c14e0d3c8a2b703fbd17be173a46ff62d6d62f1f87a9d2748517b8d381fba94745380f12885883e9dddcbba343e55cf1535aa4051db37c9dfee2589799c15ea88704e48f5e5d0d57035d63fe7d8548eeaece9f059449a4979e41da9480e1e155ac833127900cbe47d1a861c478e99a1c932578d55fd439de774998e1450ee84c103c1f75681994e7951deb5776bbe4548e1aef8ab1079fdfbba7b2df1f2fd7e9cd64f33c59c873323dd701dd223fd2c68862b48899213b88b976af8a8c6385d4a00bd1b92f4fbb933b94559485b00e2d4145cc0c57c8e296220d33fed771ade3e217c4e1761ff954559d041829b37e9145a8793474cc4638e990fad396caaf10e00f8f0908d5c143eac61caa88e073f749c4742b68c4315f14e589e62aeea3ead3f2fc7a55e70c57871d9449d6f1175f134fa31b754d43aa439e27372f8301724833cf222551b9d9d13ae6355feb983f206ab7905ad60e950ba5131fbf77a8ae511471be13d67abc3f64fd37af5b895755149bbe8ba690b8ea58a9772f93f2fcbcc4f93d432010a90a0153c203e646de016de3003954df6ed10bc7630bc07235d1a3e7155d5bd5f5a1e1efe62619461a85b6b834dcae0d3451b7785a6851b357011323706140d5c49d9371447de8d92e29112aed909d01c94714294cff279a304adb1326a8cf9ddf5afb93b24244460bd0c57b79fb30582d5403761c2beacf4ac337b9cb0af88b110fe2949f55885c2f966eb8de1bc9919fe8d2676988d800e6946b3b37adfb31b0bb71f38c17b6c9271e156b50088d07403f75106900191d7487cc98a940d8339e027b7cd03b903757a494424d6b9cb0c6c0fbc4c39f18d4acedb2f176fe68c696bd6a7c8d3a0e4ed067fc6c86836088872182942bae903000000000000000000000000a8351b2d91fb64fd6314b165612d063a2e059e50847e0bb8415d8175478fec9d7d167a298d2d2a986467bbc9cf205826c77f5c4e6ae7ce94516a19833f9a7801c388966b6191d0c62a566b18bfe8be82de84f90fd92f8d106856c7a4a80cba8500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c8810be2f9a0ece76e4168d09238d6b56289c28e793ffc236b5ce0eea88f120f3cd2f5dd7cd47903b59aacd74dd4076a8a220acd829675e3d4d8e818d2e1609dfbf034e66eaef541c93bd1202b2c488a9b9e3b845bd8996c006e7034aa4c3c62e68720521de72e5ef49c4d38f61407d218adaa25d78f7cdad97498f6d0936f7b03038ba6efe4bd7ed3dbb9bbcbbcac6c4afefdf6da791b329512dce0a1350b5e0902090aa106033c1927a340a09d4f66ba86097d095e9d591d87e5d98ad4b9a768e80b0678745134293df1860acf6019b7c2e3d9944638d7f7fcbf036dfe84f55fa1d6f54a159e3eaef7c1ffdc0e0104de150d3c83002f065bb8c60eafacac202eda0b031b491041ec23f82a7e0f3e1d7c868912399bb368e3591e959ce5453fffabe6ba03133dbfd7abdbc03d8d056b07cb5b459c37f40346593c9ba9caec8a58c72c7eaa02052b4680cb3c2d6e59e5e7702eb32a69345de65d359698996936f2231380bbdd0317ef48d9c5eb778bf8cfcfaee48a8cb1c852d32a8ed9b875c04eb3b54a4b1670032aabe190d8678018652564dd7bef46f91973075180014867d993a0d635f8fe7b65a96c858cfc501940cb2d64d204af4f36e1fdb8a54f53c91afa524cb481a42068f27b7bc84e0320e655bd7dc9b9f18941d9148f1e22d01b05870bafb9eff3bea4576be20c3fd138217e42a894a11ece9c57c92bf2b355f18006cb082eb683ee6469921499897de1edcc09cda096a58a9edd3cb9292498044bdd33edf7aaf04d66ba63012af07beb20a4979c6263246bac2739be0c82c3152152df702d8238b3ead2b421d694b3b967ace45e8768959a49e591987ca6cda80df39f7f1f816a913623a0ef5d5363034474debaca6155f8ffab22c3c0f39debc4cb6367a427c22718859b2b89f5b31ad1040bdb4cf4d7cd59c6b2c12ad57e8ca8e111ba2e941b065efb72dbedd99a56e613e48f649e1443f76f78ba28125b58aca2ab4316dc503aaf52b2b5b5b362ecf8a990ca28090d76ff7c3085bb9b865f02a0874966f96acc2655800b016151b38987eece04d0613b7727bec0f500dd95f2c4e57dfc1b6ce98f9684b51476580541b82487151302cbdd92e95deb7fd6c608a7c942c3b1fc5e348f12f54eb0ac2cb2570e4dc9989d50ed9876b0eee195f82840a822b72b24d8cd94ec27aff10fde15dea7dc37a99e0c18726a37e277e28568ba0869fd43b846d99dd4926afc7630f8fcbb4be760ee6c67e6357839a616ee98f6c64878a28e5b27d893a936006cbe8e9faad3ed48b57c9c9b2a288a2f2a528d32fd20c978523ad2ffcf2d675795dd3a598314fa545f8526623af43a29f01d5ff876f87b86e6c0c059fbfc90924d0c94e68920e02d5ed0f3a8afa51946c61776a2304ad30d93f25968020d8270479e6e0e0c5ed66fb7d6b515ae5450a354ca1ef88ed4884ee74712163e84e8b85ecdd2f4e5cade2d0787b3876f00456d875a5c1d654a2c8e7cbdad20aab9ee5a219e33a22379a0cebb060c6f3ff338922e439238b460732e7d950b8ab196af8b00a2fc9ed3ce75b23437a3b7ff2af39b7b130f1a361d08045bf267927de5e454bca03235e464112d2bb86c2d60ebffb97549233b688093c203374124436b026bd069b5b3e912cd6c1b1436c02f100bb21d81df53c78dec42aaea7efab59ff4f627bad46a9b5ae1a72a816170d665704b18f8381d0528c54c4495cfede9d25bf80a817bb708db5ef3d4efc13930b2a1abc29af38dc8a3a4ac5cefd79919b536050a8724b1442e383c193a1fc0ddad48cd8c13c57d7f58168167fea551c9e35e2e4560328a4fdf226d48ad84ee5e7cc898e11e671fd8d1b17c408b342e92202778474bfb6697815d0faecea538744132db16c4d2ed17b448ebf1a58ea37095e06e9aae404fe1b9176e0861081c3d608bb6abc08146112e27aeaaccc73e6e297af71d9c25a39b8f9a27c24c6f82af27b84814caf363f8d7d910faf4fa096c7761156baed0c6720252524f499cb7b2cca8cacb7412a5ddfd3cb63f6e38640ef1bef7c636c8854bdf6e65efe7e63ee245bc0427df7521cca94069e1bdb949faf3260e455ac35bbe64439fd651a684947e7cbdb728f5c9ea9c0562eef29da82c6382663259695517f9cbbda19fedbdac73b661452bd951d22d8c20c31936c86d54d3ce673b3b750fa67e6e7835ecf6abc0b661191ce11e35ec021a6f7c747be5adb32257a30a8b5a3f007e6772bf47df5a06a880b8e83261c0177b9fd1819f5ce1f8b0ad5d1d8e7a455e95dccd6e52a90ad305000000000000000000000000cdd0cad4e458c66b561ce4bb428ee4991f00a3979f12660468fd96479f1d2aced348f777b62730eb15a6f0d83111adbff2984f855a83ce969a08a6cf51821d1400df91ad01c673d76ca2c3f87105d8f74cd935ee0097828743b32831f4cafa820000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050876fae12ff692c48033a6ea6c245840b7dabd90104d1aef27cc313528466e78fa46e6b175534b7bca68b98f29542eafbdbb7a4157c4c076cb75356b21211efd5f265848fa97cc6a9bd3a99bbc32accda4979cbd16c770ceaf6aa22a4cceadde9ac495fb55847009ea0e18517c0958214bfe3e6f6a97d8f29ca693bd1c687c302153b2fee75c7342bb170517fde4997d8dc0cb4bed36864996b26dbf67d62bff80209180e2b6abf32aa4109cd630e632dc3e0997c5c35932334d066e1a9cc6753e10b08b0e8355ca9c18a0fc7e3827407c95ef5b6753fe59cb3e6c0271271bfd5a62b4ccc0a5a608fac87f5d03d36ab62b9b57e17542bec7c3cd0531d36c94a7e41240214d8c93b1a12b7af8cd29465b4fdac13de4ea3bd47c022cc731650f2c4cb0110030fc1214cf1bccc952f81ba83c83236ea811e7f43e58847815124ed957aaf26b5030b1bad83df10ef987485f8906f3477d50e1e633b8a1fdb89d4aa5ec37f154fe20225be004e93ce35cfd399738535313178b654135e6b795db31484f0ba1bd9da1b02235eb6f5b8d6fb17ada2977155aea0c4d7a413442aac28ed93cb2e4705d12105014b95e41ecfefd1104796b59a4783d1ca842151c694665132ba48daef5679951edeb9f99a59ace77c017e685c4020188a1740a148e4cd03e453d842ec72d06ecf5828bfca91b47a05674c4a4704a144fb35dc3545e29073d5ecf3985467449c2b731e150072a8311c8b923ae8ae7a764e0b066137ee4bd7aa348de8b2765ee9a79c1e7c1975d930118c42318b43b3b36d39691a2592f4bb323c23c58b9baf118629bb84de517ca671a2a7aeb5b6b95d3c464eb454fe4a6a720b07f61d931d515e4baef67189eb7d7154aeb690cdedb85cc754b6d04adb7a62c1f637e23fdad77baaf680f8ddf3fe2c6a2dbefe14cb5183c0ca45d7603df745c3968e9635786ec2982631127823e7036f96e490b8a31847f33c3067899f0523436c65f8d5504a3c40913b04ed4800508a839fd6caa06f619d5f42932981468d684b88b91b003b09cac4d9e5db4c59c4c4c8492eb49f7073181ebd560e51e31b88d4d113a75b1a5c652e95ddfa4a6088bef9beb055cd8033e2729aac17f328f6602911d3f9358f305514fa8bbc9ebbd81fa3a6b073983efd4e74ac34050dddca5919cec055e9b8c2ac7d3a4f9865b2eb17f829defc5ed3cc65fb5d86afdc3a1b8ff25492f34783784752c815fbc4c0033f834118e5bf8785eaa8720250f95ae8c2930fc4e3a46a588484bc4d015e720b17e4dd397382e0e563cdf56c3b37e418ff17a289158551b3e5d20730f7d07588a231b80954f36a146c52bb16390b93ee55af62eae5316f680319874b44c36d3d700660763e0095a51592a1c1f9361a71f50da64d05fda9a4a5dc103bfe2bb044b7a9e0c63350531d62a8f46fea0a07b0026b07a77a35575b8fca383022ffaf8c77225cc579e374eddb3434ad88bff936a8f5f8df6c3ed6d478b08317b90a51cc44e81bc9a74cf441e3578ba6c1a81a0740ac7eff253782d25bccbf5fd3a1f18c1a8a98993d94eaa735ecacb3f48391853f2e003d72175b4c594671e52365eb88a52e7c283fd33675939875ca970d9df4620401a30694d923ae34c9af047e7c1e609a3934b1dd48984b1fefd138e6cbd8de125f02a87249c06bb2ec9d55b69c695543f405740488a03fbe4d5fce2266dcac8cba879d608a6910d23caafc0c82fc0c3c296c90149e5d2d82b1ee431c5ef070ac9201e92458b844a432d2d7f03353352bfd82f8e23809478bc03d7e0b4edc10115ee90064091501603620bd6cce25305db94bea5c869da2a0303040830ef8a64ac3430a928e06f062f6a8ee928837349cd4c40e049f146f75c314a5095485c21fcbce78bea5bdb21623dc7fa48bade511a1a9a1f102eeb1cedc2c8e589a2a5d9ae56194362ae9b53a30366c5a0b6af99a5bb81a0c988da66cef7a09da08047073a0661c2da4007919e0cc484cd333d0ac2cdbef70cfde10ec6c791342cdb50fc7021c906d358a6358e530995b7fc262a18637f9a8d2b40ae86aa745aee045f9e184d8e7e7d2e1ebe08c4db13a033451bb28027e59a0fae8d5ed66b92eb69ce8e48ecb15af261388d9566e7747357c866a46b92c752e234a9525251e11b945a8e2daca4642515812582fe57ab1167a68ae26c28650638ba420f69ebacd443b605bd2eeb804c5d9cf86b2d0c022879536f9d2b7246ca43b2b1e740bc63de66e00a8795d2cc85e12afa7129a3fe36544894fd42b326d93bc96300a2a4c175e48a1baf5fa97a7ae50939a4ea74aff1b4cfece126fc9a14d4f5dfed3f72de35d26ff03fd33f450695b998da66dee95d615b45d00939444b7e043a336c22e39ea2e5ab4f1c410421820ed3c07da547d38d6f142b3867725b7670d", "655252ac6352", 1, -1454997918, 1537743641, "3c64dd3c0242d63569ae869a64643419230e819e47a09e7788735988f8bb6491"], + ["030000807082c40304346d8f3b49ac630b1655ad3f1f974da1318baca5d7e24b1f041f2affb74f66cd020000000365515174562dfe0d1ac8cc8b4d3c4a0cb6147b5672f57381160d51512c8ce2b676247b2fd3694a0200000001acffffffff84e2243afdcf93771d7eb98acad917a66c204bbab9bc303a874423f4255db89d01000000096a6500516565535251ffffffffedbd40fe1ecb42d13ae9d2830605b523cfcf0ae7b9efa2e57e2804f1a2291e370000000006ac51ac63535338e7e0020213baef0000000000056a53655365effefd020000000000ed76e806c15aed77010000000000000000bc91d305000000000a0a01286f14dffe54c1710793b2811e8efe40d6e85e1f832b413d5619effc14ae90ab8a2e76cb5d41597259888af2a223ffb16ad9b9f2413162a04b6674045319bda121b7165e466475a3d373ff4247a4a7f25363f7705a81846299511d56190000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000037d36dfbd0a8f1dce68251b2510b74700b3c4f74f29bd465dc3707b8be6cfcc0e270ac4e355a65ecdf6e3b772c9610b49902330f54f20d739145c730e2ea5f679e191be46a6c3ad7a2b175ae1c88ea0e77d2f385780282360f12a5efc005beddcb3164ec6210655404e5207710f7a10b717dfab910bfdb5e8c00bd0d80bcb7710328238fc4b7c1ba9e5a79e562857de5cd43e42965a89237b0e4dabb3f2b1a4bde02151ea69d55845c58c9f4624604c98ed65abd73b415cb74026f915bf17abe02690b06e69e16aeded0754d790f65957fed321b106df4dab3cc7f947fb6c7e11e6ae77062c853eb2cce28cfac3240032eb27bcf0d0536951c3c18c1b50e5d93b07fab0227985dac9eec718ba87823072e3027f74d059fea66d2b98823a08adab1ea5cdc0222675a1bc62572539322de9f97a58b2a816a920b13a903dab24e28429077b5710218d4e3b10ed07e0df089911488ddfa4f412527f856bdfd6d7ae69d1500b15f81032310d1f9e7fabee524c63a872c47a83260a397efe43b52bc6639936628f3c1c0022bb9b456ba114753b6d098ed6bac67c6db5b5c4847a5f9e8fc56316bda5f912e3a87168a89060dec891ffc198797e7daadc81737b5c2df2e24dfd869b5fc3c1500347cc9c0b0f42e84119271bdf704be9fd5deaa02f68378fc45ba05d326000ad44374f895358c1490680051be88c23cee6007b99bc7203a6baa0c19bc3adc859b0cfcccaa54fb1349c5e20bd99695661c11536703dde011e2964b467accee956889e5248303aa1354d103a9fad05dbbddadb19445a7be7fd6487da119d3e854dc5a32822b6120b39b846b381dcbe9fa83d508b01696da9ce1746f318ab5dbf3e6db563369ae0e750b90b65ca27c503bd250274483d289a5aef1caffea97961119a91e9cc7b1b59e264f9f68b7e6bc11514bee15df72de5aea532f301411151a298e76f39246aa88c7a17ed412ee0739c5fdd04b5c360cf96bfe1b5b3ef6804301e15d636cfa2376f4bd4af27d5b90bdddd3a33e34b605b754e9e2ff6f5a07f9736b2d78d5a3e5995b608a64fd59d19a6221f878216b679a247a38f88c9ada81203447db0a243f8b7dc89f8b0743087fefe5daf870d81c72bd92b942469ad3dcdf7efd0ed3c90875e83cb7fc3742b110d310e0badfe2b40dded9d2829bcb7ac2e8f5c33e876ab529cce9bd5c84077aa67841d5c3d3621a27c93cdbc2b9636cb2e52f68424f47d66c61cc6b6dd5ef9bd380cfde0db7c9d890fac4d2fbb12eb11b5452c98757605216c330293bcd1106d905f99d5d5afc9cbed0dbb67fcec37162fbc82441ba3f0f53ab6f886eeb63bf6e681235ae542f1bd4148ac599012fc1adc47888e5ca33f197fb2b30b83d2aca6b139691ae9f52285c19924c8938cceaf78a72aec8d83b3c2408e59e782f7e8b2d732ba04e8434ef203b66fb877b9aca7909355d9202e3fa054a173a0be7927d93ffd2c99d6c551b01d0fae56ec9990352d3c211f5188fe8480784cb8822329690f419d94b59d672a358bd9888069060ff2dcc4c0ffe9d8dd6690e944a857395c866cb2592054bb025fc3f0b248ced3bf3d0ce1d292e7b944a157f32bc591301c7e990d3769d6379f938427e3200a39fc14e9e150acfb3d20e2c971b37e4e3f7192a6586aa841615600771c5bd01d389b23c1d7cbc4991818aa0c21e393318636188a2bede26a2f897656c5041a4e0bc9e46897ec7d62e7a9e6c754f4c39bcffd34600bc8d9942e79bece8eb2aeb0b4a5e98ca4a2a16f6b290a52a50af3c4442a80b44bc3d0135bae035c9f1b16977fedc1cf318672c5cbac2e1fa914a8bce26faf264ba6acff5de0ea8242ac260fdee8b603839e1ff79418ae92c5495abcd95312105b1ac614eaae00a3ffc99d2281453ffece2be97421124e7b3602eb1b92a0752823dd2eb2556f1b865d9a643296d8214a2bc4216275a7edda63a8858d19b1f6b1386f133411ff72f050d91cb810aa386fe8d2991596d6f97323c5d364de57b9629dee04df32bb55d2ceba1b0e54ed5340a69497487b484a04490b9264702a9d6d5add459e9f8879dc124616ab886378a51149275d23e5692e20f945fbea0862c558973dab75a7a192313de1d5fe91249216e915831778cbcb5282a29440f88a58737d5813736ef47bf4aa183a676ce95efd0646175f3a1a095b6a84ffcdc73e7e10724c46fc577da3677bdd9d78e07ba6d0e7ce09d3547ba32f54fe72cb3a25bdb6c5e56c601a08f1f7a5360a787c6acaaab620bc9e94cc789470f6a79dca05279147cc8dcb1466e4f57b5363bf1cb0e34d1f621157df97dbdb603ccc2abcf72a85c85adfb5e01b69b2f4e6ae5d6969c4ed049436852c6d5713e2de5b0dcd1fedb02e53ee1ec515e4917137b1f6dabe481fa13837f6f4d317c10d3633de2d2650f", "6aac6565", 1, 742316422, 0, "2e9824721e3efae939ebdb3b063ff2f23159465afd74315122dac4f9acb7830a"], + ["030000807082c40303e2ebe32d4c515e5bd1a1210c685f0bbb82b7b3b8137a6ae26db50b3fc7fd5cc3030000000165ffffffff879299f9684e11546b13542eee6ca1e181e4d3178097fc7dcd89a91f5160d70b0100000003526353183ab2cae4fbae5fef724b9afe07535fcf94faadc097c45dc87fc682bf18903e3ce70dc101000000086a00ac636a6a516a3b9c2f1d0389f07c000000000000dbc09e04000000000152224a530400000000046553656aad4ffbcb8108a6f2020000000000000000ddedcc0500000000cec60b822e21e7b18864f44e9a56a2b4207b41104f79e804fa63849e7f4f109667cba618715c8a3a5a156880605c5fb1fc49019de82a5152a22920755ba23920e4ee4a91d2a65da5e756de686b984023e977d16674c420bf3955fe1bc4bfc2860000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042ccd56cad48cc1840185b7bf8a435ff849192fb23756b2bab8a5358e75506f28dc501ccdbb89ba178b2b3132c187638ccc50d465746483932c74170fdaa6ba300ff264bb90f33df368269302044a1d7f730f04870556622a431714bb83d06ad4cbdad0f9150bfd3d9a674c67f0abd73b64054abb231f23d4491ea196c28e75f020a422dc273fd0732f760dda66b64f4808021ea3921d016734eeb183baa1c903f031a275f059424df1bbf1155b6ea72fa6802af005d29ee57f637c3cdba11fccade0b07e5038eea81ce5ad901f5b740ba173d8822dc9bd8209d9a7b2eb9b2dd6d1c61bcb7c45dd1f273735ac32e5f5f0bd7902aef8a466762f7a8979f5a99f4e6ce12032cb0d72563724bbab271076c56a782915671410139feebe70592645d8614e6b80324964d82414dda3eed00a9e795bb620c081996f59c53aac3ae41ea65bbc7c91b0208b12cae47f50a33d9921156668dc28bc401e8dd180f4d742aaa0bd3419daabe0314f9ccacb65415411b81f4d8d7ecca8ad4100d97df54f95f198a1e2e91e83cc7020783d0572b6ad3d6b652e76761e056f65fbca23c5800ccc5f44ab286e6e40a5f419b73ce527940207f833b39dca58ee9401f4bd8cfb8ddc6be482f3cf24ae4db71d7e354c6dbee23e45e86318d549a41944847226ebf9b177a9863164b655a807704cc89ea2c3549365994f9225514bbc363328e0cd9af3ed54dbb5e5cb22fd93c14e681e0a3b593a315fb30f09050c7b0b4414f67514e8d2367f4b32f326dcaf58602e61ee6884f1b84678977d0b8147a8eca5efacac51617a0123c5e43257396d8b63932db740fb2b3933ee630b580aa9437f44b9a0c436c25fa607a1c050cd8dec239ebec0e42551bc08468fb7f2ecfd80eea3eadc4fc942ca8ed2ef1f1728526fbdf7867af88088929f4027d1f305923143a14f57eda1fd7f25d991662a76abbc98ab70f1c0d80c4f49572270630108c91bcdbb4ce2a6e18bb82ab99e95da08e37c9572bce640c6ad294bdc16ab179862929f63450dbffc629181651dcfd6f895dfbb43a00f8160a93c7f80e0d648d5ad4dc217f8622c5aec66aa2876a274be4e59595e3e80a5993e15b24065aa6b163b0b3b69bb26bb09fba50731b59f6fdb120c2a7a8fcade14ae8e055bdb980f40f503821f841ecdccde543edaea8c5004d2fe3b1b5a7d847d8b0e0804a1c7edf38e1a504c69333f71d12391bc68c793fba3bb7414df5f9e878dcde6f5b647a2cd5706957448d4c4f640c51462fd927b075cbad0e46d8288d6b16d945b604784c1c50603c078494753067ca7b587a330fbe81ebcc07bfbfa4c7b62737f7ea2dbf0de06f4c133f21de705ea45d1d2d2c95b213a709e2a92eb5447424c4cd252b1e75e6a7e1b599b1b72924ad3609f0cf6fd5bf309461174bbac71cd09fe31a25a19f1c8d3660d709165a934cb5113f0af7e6b953c06c14217c395079e59f2bab2f34576abdae731900903a26217422d5d6d2988afbf97c0eab1fc621eeb6b3e010704661efc3a02e4084cfe54db1181147509f000e7d2dce084fd098fb73dc8534f27b277471ec468a4112ba8a44b617a4e755e60cc0836391af8c211efbbfb00ea7f6d9232627ef8e3fbc3e376bbcf980816e73c03c600824ab8fa8e7e6f726d870f20b781a17cd9135e270c1f515674e97b2583ffaec18f6a4a65a9b51364344843b94a8f62a6825dcf8f1636a6b71f6d07363f837f5d23caa327f92c0e8ac0094b90ae9c7fa2b30953ac1fb3dc095feb03fa58594e330a37d8a4f144953fea281e1c623e5df5f9aba0a6ddbcadfa6a813da8771fdf1869da856f7adfbfb40bbdfbd06e9a6dad84965864eaf5f0507626a02e96c368623dc9c05ce0ac22cebad6c7b1152bc7e2aff2376b9993a79a602c6e1f772d2a76bc709d99e56800a7d3b60a8f3139b0358476ab9a30adf27488e9d1ac927018932b7c8afdad9f95704b6a1a7cbe11b1e16b4e4b46ba161c923b173fea8c2b53d24ebaba921f904f08b75a3ccd3e44af661aaa34c42bbe0deb9bc0d929280c36f8910c2953aa404890e39b5f3a59ab55fe5e9eeaf15f55234761f7d66d63a88baea57bf49a128c09c6e72663acafdfb57b20b04618890f147899c610b113ff052433f7eda06afce64e21a59bbf2439e67105cd5d98a0bb38b6d7f3ea7acecab26c72c8f17c87d8c6dccfa399eb633f4f7df2696b5b144d8bf92b116af79c14c20e580304a276afedbcbf425d877302b78e49cbe2b3a6594439067df4f1fd5139cfb5926b43169a79cd5ff021300e300000000000000000000000000b98b618e7c676dbed0781bd2de6456f579b25e136f17d31dd752949ecd1f15f75213f8f5d81eeae344c61530341fa95ce563881da669abe10fa14c9ddd5351ae7cdf6f76eb99b802c46ea99051ee21fb7a59b0dc844be60162a60b9595545e530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050c0515a7eb2dc972eb5bd6b1151336117a81122e1baae8e9a6a292c22b7883bbb497168eea7a6439cca078cad92b5eb968e7f9f356c6293660c666c45c2a099b5dea5617f2e119e423a926d0fc7e86073d1251927426b4f0a6656adcbb20d83a77f82d32cf41c33d385097274b335f46a4b961a2f06edf0f4fc150d9980ae24031abb9c70f3acdf23d93f81460712dcdc25ed33d36210bb83ed4092a609184e3e03197c41a477db29a5d18e16a3abc205b325e2090b81b3dc50909da4d7f9f3b3cc0a053c10ed523c402d8d0d3705608d1a8bf91a14aa9302178a32b65d38ad87fcf0e30df0f8215904d93dc481db6120a2a2b65f02e6916e8953ce4fc333cf9fd6f2030f764887f0cb64266b232d9c3314f5dd358a24ad59dd35568021f3f9d668a67e0318107992bc577023db794bb65f04cdeb67b07a6a53e4c7a0bd58cd525b668832032877d7765ec35e5d595a8d6c259de76f37545a4c4af8aec8fc03889bad71fc7102146fe6aac595f4e7d249d61fb10473105db029cc75c7fce9c8efc9e4518bde9c0218d2866f6166c883cdfc9eaefa1738e1579f536793f74b68762121abc5c20e2e73a4b5fa5239e9729fabfd806c10b755a049017517bf9abf210b6c27980a7bdb146be32d7b50704108b9c01ee1df0400ae2812bd5894c360850b1d9efe24e10fd35b16d83373b7a6c281c5f03c163301a60186cda2fe4316dfad782cb9e45ac30ad1fbffe7a2a960d13abf84804756f29906b41d9bb4f6aee555f27a9e7d966b132393ae7b7ab4bcb335c1ef353f3e772c6998811e0bb6dd82951a075fa92b1bf4aadd10070adb6eb3114ffbf3c2afe9b8dc2175a98e464ea47ef1e2723c0fd7526a1abf9f8a3c39a3b70dd76076d97b681e972f8c209c12ee49b3c0b128516ecc327a5650925a31351fdf4ac22c52d524a3a7f23ce5df02cc6d74f1f2105510c5ecd76f7ad4be0d1244092943a487e66dba89df6ef8a4a2ba065db75def2b52adb919c4eac1679d8451977fc1336eabd3cdc18497101fce6b9258dbfe673d48ebde051217a9d94f10e7e6bd6ea4ff38560ca0a8e8b884e9925bbcacc45ac8d73b38b1c83595eebeb0c5a20298ac7e31f8ad0746fa05f71168ef07e16252b2930ae0d05ff069af4ce9679bf0c28846c17832378a8a959f0d07ce802c7ddee18b799638769c2ce5f59baa385d1f2d11afbdf7cf12878b1a84a2485a4374a36b7ae71ece8d6ba635371d40e946d2aa356b8a08d82186b11a64a2ad4d34689d27f745fbcf8824c1482fd77712240b9ab544f4100df496315db0618f869efcc68a35627f538bdb3159183b2a4c11e8bcdd6fdaba18e9edcaf307a90dcbe577b708e2553d3e40ea2f27a2544ee5eebb7c65a3d30f27e7c578db24effbba1964d86f7628542087eeae42be7bfb29fbd9710046fe7135f53971613d481e81e7eec694cbdc464d0b0bcaa31253d0d986eaf2015b4b65180ee2f71ce9deebc67ac903f9955eb0d30f75ca94203082eec579d4b4a022e37e1a61f175d19f76a5a0b966d91b48e2c2e63e397e161cc3ddb72101ef4eea0d7f20cc2e2199478a4af84d8b97f54b943a0930a69ee91286738901851ccddc64e372357196d0e96f41d5320234fb9bca8c9a6070cee63032381cbc11ab1374dc7174f28f1de88fe473a9b5f8a9de8ef4cfed340a2353f4bac96d591ba29f1516ba26b3a59e1b09a9434e0ca4ca0e3260baddb29db4f22e15bf6a5ba6f3d2085cc3281de9199dfbdfc2eac17680c4ff313bf6cb3dc9b765c5aae754351032f59887422bab82424579e0b7595d7f41b34e855fa1e95af2b3929d3cce3fae7e4dd46e816d327a00277b5497126ba60db38ea2657c067bf166c7f4bc5b2a920d1917f5b6fb3f2b89fa2ce69ce579f47b082783b62e3c9b136391d1c3e93e73b466e6581dca90dec3f3ec60d12752727b2c09a9277ca0f2c58326c504500b206d8c3227750388f3991b79550141a2e7aa156b12a25d49aeeec14219ed5f2b4a56e12b73b694fb992afa84f38c11d05214e4338fd1c690f2e10efc2bfd69216210fa3d0effe623a953ac9fcff9c38ae31015826c4cec3126282a76e2d89c65762888950c85dd8325a04db53eec5e8ea11dcde0415afa562a7cc8344ad8540af0e29f64289722fe49da1c00a6b05dc3263c4649807352ce2e8f9d9e4a4e022740a9a5086f7b0691e7438542047eb732ab18f6144d0204d30519c36c2a63fc27225ef019664df34090e761880ffab2e386950b04fc8ce67ebfd15a5d64dcff91abd231034a2e471ef9c98790e6d58d900d8e060622af34229ec95da73352dd341f56e9ffc99cec837b96f24850e241cd97167c3e2a5871a6d1663f3bec08a651b35e52f07f4942e4e0dc47a74fc21f6b95e8f1e6028682c46aa72ac117947bfbaa3adf02", "636363515251", 1, 1648455359, 1537743641, "cd0d2d8a63290b5e52ce5f069005e534e89f982cb515a1cf7dfdc57165e5d0da"], + ["2997702401770ad17f2a1a672f61c94b2a156b733f3e006c38aef6ae854f0d78e299aef475030000000152ffffffff02dc90d40200000000045251ac65d7ec73040000000006636552636565548736a103a7f51c000000000000000000000000003cda3116fdbfab2292cb8bc3bbdc27cdb5b362ca857deff4df83c496c75d3df4b1dd9de8019b2c7ff855c666b197ce73b4ea9e4bf40a5410b37809550d63659b44359a7943584a01b5786faeab67bc09f5afbb96edd05cecb8ecb22a02c40bfe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0bf722875a9c59be676598ed05df10aaee42a71dc777b8423935baab51db0f03410ead9248bb98627d12955ce890a1cb24fee9bcff0a167cd27eec534ef197abbc107a54cfb16a7ce90fac84eecea67737b4efde191e11b6647544154c64f1c0b6789c08258f83f139e4b5019232ed4b945251c696d3734f6ad20212e243d4f0200fbe809117991f379f6f350567ed608e4e887d5bbe090d605aa16f8c2669f3e022d3affa8e6c556f63d70576207b7a56792f6b8c84beccae14876da30a8a0ce2d0a029658e8bf779e681e91f763a4fcfc9b1f63ab368b580d03508eb17694f63f17e5968f85e351ef0951aa0759f6b5d56798cc9b0142f6bbc7806ad3fe2dcddd0a02177c7ab2cb02b3a57d3a8ab4dfa36041ca9e4b7d0bddd19cfc604f94a63a5953020543fcee59edc3443d8ab8c95df9275f364d33ef8718108b86eee40dd28d8a83031e241cb3cbd3d01b43655e2ad54cc6a52fff98808a9140d62dbe60a04b45737b022381fc041574ae3c69859929b78d2852a73a151691354c3e4077d17f1384643e03227d3a9d96b51918bfca6154e3fa48aefb5cf0f868c7152e8d2da8059ed92e7d3be11eaad7b34bed199e2500d16009ef3e6865bc558aaf67aa35eabd13770ace849d393df8461ddaa3be3885009a51168d02f00f36d784777631a843a8ba6bd928c877985703d0a1f7e0953a6fb312fdb3015bfd5f2c0bfcf009ef31674c23e58922c084d09dad2e843482a4fbcb20395718a5a276d33f26f59566cc0d9fe1e572fc03a17acc5a42a6cdc95c7f1bb324ba45bbba8e21a719bc350a0a1caa2821271d4cfb8b56c918da56dd873e54af5673004412ce8e09e835c203fe9d056e745ea3a8d793f883b0ec7cdeea0a771c9e92e8c1b04d80fa20133095469118275b7a4872d3b765ae59f1b566161312a27bdadd1deb8baa66610cf85f6e7d14349e3b55c63a6824977f4910477c23dcbf6f89a96cb6472fab89485f69e8017245a85ecea3ad1073adbcba0e616f5ffcbde2652736519b248cc9fdb5ed2aec3663fd860e040a30eae0f6afaa5a43db8a45b4d9fd4e70fc1bb1735fb0b8ce3df569645e0156c86559d27f6225f0059facd9349915f1d4352c1437245c8aa76170245668cb59e8cef76a85f87eff81c19a7cb2c004d9546204e007f0de7fefdd2af698e2aec2d0d9e5ac8e026c119b44c2c250493d77ec930b1b5e2422ecd71e98002574c0cd7e7a000ce239888aefca33cf74134e8f9f822c28b1cfbf4fe2db6b1b95d8c9b6cc0bc1ba066c8748f08cf972e6bc44e6906d335c29b1eb81daf35710334a3c5fd08465dedf326e8d368ea83edbe70178cec7b46f645c679a24334bd388770282fb14d7eb4a38a70bd4ed1b238401ce8a4034567489441f860508cb6855ade649a63bfe4eb4fa3568f2fb5a7d2e5e0e53dc46c901cd5708e4e975a860fa04e95c4c3bab2c973fc0cd340ba2382e0f81e0d2b9643d836f3dc30504acb04296d5277da0adb27f8e0c22534b3ed409e4a7afe13a21ae2ea558de96cde89b0242b9c7b05815d4ea556fd6495155f4c05d18c9b0d7da7074ca7464f0d9c35e9b1bf90009f4210501c4c21a28a16a04d619248fe7d8ce905e65520e08035f24e44b66d0b2792af239416e3b0ee0e2ecad0ec4d8cf3473ddeb9975a861260ba92312bb9590ef767f7f7b260dddf2be4ec8a1737def21994d348adb039822dd2fe47e081722d4dc4e19118c9a91bc16e2996c67e94bf44265f2175e40dc614c8440390daabe0af622dd0927f9d4a55a6c668b4ec3adfe3de34f69d9a05a65315b6ca2a789bdfab28caa4f2d44ca2450c25d57fc4623cda6500adcfe52d4ba9cd9d96ed0633c85b5b0afa84a00bd75fde0874a80b6f4271481fb26a78f0b642328dca3c5f6ca612c89a8e82ac2796047777e1fcc02a2a2997bf430dfdba94603cc33b3772132ceb26cc4290a156257883488cd230de902610f79c7aad8ec6a7a60bee0f92c8c13437e216efc8136c0124d91a4d55db1eb995796ee3f2ca884aa287871ce350b3a22d6cf29b2e9c3c4b824615e7c20767845c1b1b85f617001e2635f438e95dcf6b6376c06d59db3ef03494935df411a3519b7977c608a48f52720878dda2df58156653ae0d61fc1ac154b8602213efcc21d5bbb6af5b28487537e662da754fed1b56032011431e4e9a477c500cb8a4253339d5c06b56c368d52c90961870edf368488f1b4da4b28512f528f38ddfaf36823e7ec4f6ea2640f773c32e612ebcf84479b1ce458c5603a57d380a2748dcc6201000000000000000000000000c49984e5c2b7b39fe65acddc9375eb2f4ee37e46f768974420270c2d4b85d1f7344d53f9e5b1213ece4663073048bfe05570d0edb54623dc7f6aa2cc1e101e60ed22b6ee863bfc4bc6693f23c778632269eadb2e1eac09f8b777390067b1676b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000418e1eff9c5e0a4d48439b4da9c165a1d90d915cc2bece5e31021ac261ef8d4e15763846be1236a0b4b0e2671684d2c33fa476d26252da87ffe2fc9f316933cf8a699e00670c11160868543ad8a5a3b6add1321c4ad83004c4ddd0b15f43370ffe1248df7d5b7bed154a7ef6f619bd55ad9ac0643453b023254f6d1a3f0423ab021a5ca51218ca9cb5958a781701be85c70a150cb78fba7657de3e41106e01952402182bee3ec695c0fb5d63e7f7f8c1dbd6126607722948717642f620f4b3fbbbd30b05ac9409eb3d0e3867998a774fd2dfd5f0943b18a6691611452e711d2b4774c3419d025061c0d8784445a3af4c275640b253b0d3591d5598c5d27580eaa5cf9b0327b7cf69665bdb2abbf1048251cafe47a5dd8a79b870dd0dfa437ea7a44304ca022432e9c13f29b28b88a6c312402ea18ac7fff820d6302e1cd771757a84ceeda1022517e5b2f711aef2bf626ef36f24a7fd0539ea6adf616286b1d7f6dd48830360022724252dc4f1530bfc45ef3d5e51ba32dc9e50ff6164d2c99fdfe55d86b1dffb02227f13911cc52428bb2290516645c0eb828b94998b0986d8140c32bb45e35359e07241f890b387db4f5974d6ca14abd9101ea80401b762a0f8e3351403354e5087f58b23a500b7e1636a6b58a239bc92f74c28a2d9190f6a3153c90b3c0d181818d818e0a207d5c21977750733629b34d295fa09dc2274db8042ccd52c773cac1558fa1b792ada5e2204753b5628fca58353c432265af2bff36e6f0e9bf005a1f9298c549537c3f0985a16e5758e407e42ea212f736f35eba558b06b613355d60199726c09d018eb3964646c9ee13258fd9e28017d738a53de6356ac9a0ed3a25e4939c4033bc55be77081168783f214259d0fc07ea480aa33256722b434a1af7c90692474a1318e2c2839695b6c964c89cf5785d71271929180ba67776bdb262eb296afa1b5481ad7d607916390de18479f8cd20f11db22cb1b4259c5d05a4d3307c24003bea1153e68407bc5d686c5a9750d58435d353e21da6d953016e87eccdf636cbb361f734045ad2218cbe9bcbef82b83cb4907525c700dd2ba0cc596a45dce67765802eb3cbe38bff7120890dea80be5f027cee99c5cb08e60f24b9b82ad517bef17c2ead9c5442ce9a422294e08a1859e9112aa7aaee52f84817fc9dddab85e15807b2fe4f5e549d183c1578c414d9439ae8fe1bc07bf27743a2d14c8a061be6a11c1497319959ab76da0fd3472fc139cd087ebe6754eacb62740801b6f2d2db812aba92be9f5940b4a140dfcf66d76b2360badf8ddf36b6a2228ba8e7143b37b7d3eb7608fc4a72be7fb3df65f740ecf9a70b04090d69d76f45b2a3d5ea622e1c9b3efd632bb6421eabdf68f9ac171a391c519ff176932ea39640a79a3dcce1f13fc4501270b231a67e007778a03aa30aa2c109c35ecfd9b775e721e9e3bb1f13e58f69cc76051b7a83ab3ca5a51ef44ccd5220b195ac0cfae82121f39742d7e83c26ff8e25cd8b6a072366fc654c96e778dc774575ad1786806dbca3abda8b9b1b580f1554552dc9517d77fe28957162b4f752a52b1fe3e56477ae6b4001c8cdbe12a30a4c2fb5be05c63eebec36411a9d2626f2b0bceb8a0defc9d687da0966170f8ece34c657b5a43042a6c3165c1e52c0f20dac13822e0e06a5457e0a83c5e1bd34e8d4f9b9109a5c992e4ec83d40a04d63c301e26fe8321a20bc5a94398cd6ddb3e807a20a5c27d1fbff91809ed3a5d3b1e75854bc9c866df566c41f9589249c66be22b5150c41b642bb209d338ac72c6a4ca4e4f8d1a545aa0020259a7c89e8bbea5888f398beb892ff138f0e89a2ee6b2670536fac66c873d8f8f03df17bce23e666c5a72c7c539d43d70126e1b6d6c08298be3db01f2f8852098f58985a6f26f11e6b4554061da8eab4ae309b51a7ea570366ce049f20e10f549f51f560ad71cac238014f9225ba61ae891b8c31d50b5467695da3ff99935c6efc5295040d675f9bead0356f70c99a1878bfc5379d47d1483d543dd93fb8f68bdf12e37ce140e6a629856d316988081f78584629dbe2ede4bcf2193156b25485e03c80a0c7002b81f13f485e0ef19455bcd172c7730c32c19a4da8d776ed3859332e57362882ce47dcebe5c4358c0f22b681359eeacf6a1a31ef1e451ae8a9ebab6d0d68efb6bcd0c8e050960cb8d1b8f757d276214aa7f8f1143b9b1f47b25b63e7b3629118bc44a9e648b6deb02e6e34c4157266b0420ca0f4fb1474d8ce4d6eaefb6ee41c55cf824740f1f6511f5844b8201000000000000000000000000b6c44b6a3a92b61f6c4f82e224957e0af5979a45bff55920ad0dc86afaba94bcd48536a89275c4b3dc02f2549a2a2d144ac509be3d0fa8bdf46897f8d50e2bd88a699d8f6f9a3758187206ca6d63f14fa9fe7a59c6dba1d66c570687575cb619000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003563bcdd19aea64bab8d9e1bd52097b6845a2aa54a26af1a092c239e8aaf9c0ebd11259f617e2ef85c018496eee8675b76e9cdc20b7d89a86c2583344848148345f19ceb2fac5251150cba38cdfe121d5aefb7a21b633bf475663cfb2acae0154d6b4c9cbfc2f47c4f0629c37d3acce53f681f059f2d93cd4d4483df2507a8a202171266077b1d9bf288d0e69e0e15a356faf0e5b4a285d479efdd9ee13eae43af0325bb0f93623198c8a8596fa01af8f2c17ad0ac7ab0aff969c7f33d72e73cb6090b08d4630b76e7ab0c4b43c7d418e09cf1a9dec54f3196492684d35ab278b6b652feb60bab5484df6fb1f6723d1630a1fd3ced656b4acd720c766f7a519a85f9da02047d089b01b9823c62d7867ef073671b0d82bc44946b2986e7b5bdb856ae524f022a70faaca34c6fba54bd67ec640424f67107103b10512f287be067af5bf37888032204c2667f09f37386ddafb0d5e3825cec4c90833670f94c8957435a59deb565032dfb847942f275281064648245dfe255880f16aaac25bda6c6e35af3793f9694030a6f0d0f13177df0d49dc5608446d7a708137ed10da47b3e6092f686de864ecdc17a5fa7a0128f21479023bbf6fe6b0e12eeeacb741e3f07e39985b29f4806f01df3e7fa0cbb8063654e4711728dbea43ae17d803a0d6236b81b7cba1fb663998cbc677969650fad0a36e4992446e4579c4ad965f79c4cce5e38c1ce2c691f81682339e8a831435b6b8aab5ae43bc34ac28adc44b2dd76140a6a58fe991e3a6e819e3b172ef44002dba49d1bdf582f17017490be88d3fb4ba7524e432fa3d837b7c57f8260236c1daa781f3884a192679b985ccc973a92199178e38ff763925fd1614d172b7d88926d6b322f25426ad5748a47cf378145e824657025d950d2e4be06356f239e3133b5629888f27d64cf2dec627fbb71940757403898db756bbfe2f8f108333387ad92405e9b232bf2c731f1cae8d8333c9a9bffe17732a5e94c1a6c664d92ec373783ef2272333b64c99501837d075f0480d6bc5ba439143a25ec8e2a6ada32be4cac520a804d2541267d1d1b2823eee4aa9c03de816dd6de88495cebf0393dab2ca6f1d447c1dbb06525d3728abb22c8217043f44d7a75523b874b99c4ef957d50eb289fec387eee5e0b90e6f843798e99ca4665428dd986dc3f61ee0b84d17898effecc1bf45c51d379df2d814c550bb05eb37f44a5a7f63d9d91b4ff071e03652f324769122554b1c52ce832573c1cf278b70a2f793e2e4db68a6710b8004a8cfcd9dac1af6e24a6426fafe1d9747fe40bcdab6c955dad23577294e9c142a40baf3fe22d14478eccee9b16e1873ea0f17b1120df8ef67804a4574fa5c3ddadfef93e8e7264753afac13585fa26ef966e716886eaa48c16ff13687de030a71c5f6aed6a5e56cfd4819998c9877edd2c0fff1a1ed5ccc19eac94634096368165b0463063a34d7f22c3669230f37feb17d8cd34a475fb51b1104499ad61256482a63e378e6104af7194d2874b66518ef2e32b8c043f8822955d574c541f7fb294b49551b64f0d95cc63766b663e80e1a6e13b3bca0aaa63c20ca722a96c5db66c584d37a5f18a5bc59fff52bb7ca2746211d8b47a244dfca7ce4dd8dffda8aef6d6071870153e419cc71c272095a641e7efa05ece38e69fd662bea3e5d5112a62256c27f32c25883d61b7a1dceab7f7e85da4249800c8bddae2545eaf1c48f00d74470199c44b2ef285f9a044c3fac9315904cd445e3eb2ca04515dc1eba98a9fe5776412915bc0ec3e5e4e8cf1ab3813122ed71be90cebba61597676e7245a99eca347836767a3b02d29a959e4c10b546a4e2e0def2ba1cdaac15e5b09ba32ff0a133025066343676a6c9f608c23d7636b5fc74a9325b2b79fc2f067cddeaa4fc3631a82c4d128eb6a48cdb7d026e1276d3acc4c80501259a925203acb025e400da49bd59fd2e8c2bda0a54adcaaf64a3ea1e51e9751c59b322782168c7db353c0f8f5c87f8bc34c32e2e1ee0cc46dee82717ec5139506b6511b7ce05136fc79c660ac0dec9f75c27a7d338d5bd8f6cf4c18475f4c4098994d410be09d9c90499e25fe4470a35c64a8c3838799297529a646fe4a4eb98e6f83bb72a445c10079ae966cacadc5c538293c96835ecd3b492d6008c523fd4e116dda8de863875b0d6672679c56cf7bccc26d2c1c22afef77f6164713fd03ba32d9365a59117aaafd758efc7c0d8715ae2a8940b21a85ac5ab88b41f27aa11d84e4846ffc7535d7be8fcb5f4d127e1fd5427416f077110fdd1aeb50759f1870743ec732e747eafd2df4cdc8f3b992acef3923d472a282eee1f25fc75957b9882441dbb96096e38309c78f4d8b66ad0a0325c7a6264784cf219e3a6b060ddcafec7e08e0e7e37bec887056c6a4b90b25ceb5fc09", "6363", 0, -290804044, 0, "2de52fecbff312962562c68a4afd2f1cd88be2026e912f8d6594c8456b26fac6"], + ["030000807082c4030399bfdd841b280f85582632edfda5874c6ebd958d9f0e89e312fbe787482674c603000000004230192aade35ef7b4634db1cbdac5f5ba468c14b8ede3a44b0b61dc2f45a27e634cf2d60200000009636a000051636aac65ffffffff5a605cf167fe40fd4e90e9288ebe6d794bec6b45346142bf45fd500b7786529c020000000453656a65ffffffff02ff6d8403000000000800acac00005265659b378f000000000009526a6aac525200516a6452895300000000034380b3040000000000000000000000001ae58d681e7daeaa1fe94902c6dbf749cd87b4fe5856a4951aee76655f0e326f33d954cf36469a191e11a7016ad9f450377e04ba00c83ace3da67df6599770964128f60b6aabe032f0b34dd15bcd48e3a72a2130c9d180080d4726fe0055790d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038cad54fa2b88972312c31d9744ee41b5bb95db30ef1c59dbb9a5d510659123fa2f00c62b7dc0517802241997b6c1fe597c7fe8d71ed2c81f6f84ba1f7b7a16888b00529516b8ce5c9a64f9f0ddd3182a27dde2a70a84735163582fc546bf170f3168f2627e25b3f6d09f0d821e1a0e5d37a5a5a1708a4c12e2da43d6cda48230311556a1f8ca2ca8017acd045ad3d75b52e6287878203964f592016ddaee3fc1f021bce882970664cf32fe9959e9482164e193c2ee89c47ff56ba937e8065e1ffb20b03542f8f903f1f55d99803e3e14b6715d85912cd2a3e192c8cb15443b3010ff445db4a4881518ec1631155c336a4f79b18cd49bbe6bd5c3148bc01d47d7cb3be033009c459fa9780059722cac7d093b03f4749be69af931214887c0ce182371c140309fbca4ecbce46c32cc711699394b6cef26affcae514bf44abb813e51599f1190326d1afdb439cb24f6d621d96686e6879b7ac4777a02a2748bd1dc028ff1faff5020cf0eb1892e88cc8f7950b08cb7a8586a41ea07a8c79c09328467f0519500ba30208bd1dd0f4915d316e731d217528571395c3e0e418013df60bda25467feb83a2ba887164d7c1accbaeece979eaff841a8f54a9fbc5c851e23234b421405f77959c410c27e2a699ed3d92bbb3c6c075df0c98ab4874697ab881c16e0369cacf59dd012b6374c207737918f33d7813b7fa7d382854ecfbdd8760091f8d66b44e7ef749f12ceb421e6feaad681a427b50acf5c62a611d842202b9792838aafa2b8f08864a4675207aad878c85cc0d22fb7182e69e3ad6dbdd651f646e63d956dfac0b2355d512a9965020b414f1d1d1d7817016339d3d150f0f9e5062019e2d13c61e44834c2959ae860fb9a3d9c3a3e6fe4bc0ba7f21ff932ec99c7f161c99ad0a73e7cc6bd6a7472750b0280b121794c4d4f725930cc3d4138ebbb0004472c531e7897f71ce07e42a2e62e60b4f083dd82befed3139f3a13d810d04cf06580f1509133d934cc792c537f26bd26f1e0af4f48d9ca85b596ac2b175110cf40baf0e15f6d3880a112183545b01f9afdf4d22092e3af9564bf1b6c44010fdbc26daf8d2864e8d16cc5c81dde2d6278c1a475b0929e42d720c78be0ed56015473c9b137b18e9e01500bd5a0e75cf803f17b1b1d74f1587035c4063cc807495a99a46f66762591fd023988afd7f4ccc893c94ebae133a46f6d10e5bc6bdfb2e136cea29621536af61bdc5b64e104d3f35220119f10bc5aec8155db8c03ba34c921e0ae396493f66102dbf8cc2eed7d2c89e3f31ab2b3087c9393f736258aba9be194cc71486ba9f917dfb370cdce3cc2649e96bee34252e486139db7b095c282ef6df3a564d4d46a48faaac89ad425e47e9b67eee4cdd12d67a88a3f84d870335fe4bf6943bc1c2b06000824522f88f7a719bb2e33fd10a27508bbc0dfca081e5807a5db125ac96d23235beffffd3449a3ef98cad4f90b598bf50085cd8467bdd5900f5c1ad5fbeca889359915549d78eba41c95fd3249c97c8648e0f40f3b0589b8e19a3b248fccd2e7534e23610265cdb89fa525a2174e8a698e7d9d8cd24970d4386bc9b3a2fc9ce5afd69bdc6c8df08fcd6ab1ca986c2e90cb99bfcb1baa0cc7548b2445e1645a127da1bbdb06c841e42cd136c8f3a6b8463a0bf9b2bd5e8415a77ad9db69d917ca535ee44d4c0a85b90825d45cdad460cf6b7b608c6c93f3af8525e09bd05c7aeee0d0d7cd0d0696fa52421470e5e8c35433416132009f6f9f9222288caa9cb70158779da2fd7a0b7c3a8d45d323e8baa8e397361b7bb7c36b925c9654f571da067637584d107fcb605c917cb73891a4006016da377f0af0c37de8785f4e4dc9e3aa53078a7cbe863c3e2cdb5ff423d875fddf0e07d0e2005170f52a446ff94b2bf64c155090e3401e58ff0321f0219dc70b2cadae74e4aaa9d37daf90eeeab4cf32c3094ae336fe4b1b5e67ab2623162d872622a34ce9e9bc75d2facc146e35ad7dc4a85890d9b2ebb2e5324a31a04564fd5afab4c38eca42caced4f6b0d5b4e9c846366f8e1c9ec0028a5051b772b3d7563d63cb32b7325025eb99b46a31140f1c8fb5c7c61409f87340622522501b91984d553baa4160be9281a8cf073ca77b7139b0a193688dd638220bfbcd7124a9bd2f77fd1da8d34ad61fa94dd925b3ae7b0e70af18937904158a896eedf92d5886b0ae6be441f5972ea2c3622112c1c1f2dfb54d4a4bde7a1c15ea8a15aedc2c79314c9a259492ae7a68a89faed1f91fd460b121d05e69f68775f89a1bf3d05000000000000000000000000525e3926d9b13d363611520f9e73684f726230245848b85cb9f3e5136b7140d5305969befe321d95cb8d7f899169092cf179ba2e5623edb422ce63f6a6fdd2ec190d2877c685e8f8644a4c4706d373cda4587a96f4104e8dec5f29919c805a21000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f71120f532a57871f30a2d96dfc87811def36ca5d2edc899cfa709e19bc16058f36c60e3ca1d4c27a1bd3136a0526fb7bbf5380f67ad58dcffb9b35c07e97b625235872f94b3eff8f31f6f84fba75b45c29c1ae0371ae2c18fc7ba125797b3e564a8afd7efd7117b2ee5492209a93ba8870dc0259746a876a6f6f46dbb4f554021f042b111a84bd163baf1a06aa2159b50aa6426e91527fbe15ba2b76250fb4d80202daa9a80f37738a82a898a29a2324cf50db3d18cc3f70cded2e18bf8d8fa0e80b0907b39cc7b6faf61dc627c6b0d4bddd41a46e4ec8501b8edbd869a58927df2940367c19097da25c527302ce34c219e67772368336b3fc3922ab60525d8ed303020681bc7bcf5def7f109e3b034627577b9daf09b6b42f7d3c4e1674fe872d49a9020d70e53f5a56c17d933385ff0f655ea41768852964046ea64c91622f7fca9cc9032353df45749fcf9966c32e34d5db583bc1e7729b8b21fb2f4f5aac364637513c032da7a1ebe47e8e6ce4fdd6453e58b4e496691d74b4568146ce29f83dd67c8b97020bc472c8cf799f561bb3871d4b8945fac811875d4696b5863fbc29b6e668d58ea58e123ed914f37dbac7eaa06dae083c3e7238b674d535a239ec4834405125cd0dabf3b4b6e18023f1d3b937ba41fa61c729aa85b1578651c71d32f469e7c085210826575c406ddc9ed8d08a9ff1ac845674d23467d0b538d79b7ed35b34055cd4dcb68dd2978bc237f405d3c4061a632045a2ad952b6ad6f7480f95d868d7fe3cbaffd121d2c9d20a4ebef5468d7d6e28d5f56b16f4255df6b8a8ad1b6bb04588d8f65e62b7df5de5b24b878013605579507cbffb43361624487183369016f542eb62e83603ceff60146651b8aa7a4bc90b8de1f3bbd9ba5270218a501c09d0c436f6d71701be445221301d0ccb8a5419f2cb291e4e093eb24fdde9b3b383c12eecaeb8f328d19104d89926cae4f86ec96a4efa6e9c4855bb3c2fa4a4876139f95c5db846c231bd07c02dea39ec4bd8cb4f585c754c771498135d83d5c94831b389989b3670dd0980a5e853cce017fb3451f8076a862950eacdef0f590eec8d77d8ca8ee05b22f3461321dba27d773576909031d36d8b2ea416af8b7b4c29cf121ab77f5a6c4f2b8d57144abdbb9aaa899e2a636aa84e23dbb49267340b30ec140662ac4c36098ed6d6aa723bdc3cccf10c0f8ce8d9667f5a66a6350262d6b9dd36720aee7119cc9604307c71de478d428537cae44c95a05511c29ea48fdc7c2cf76e13abba755e3ced6bca76c0618d80d8ecac6d56871c2f6ee389bfa93da0fd077a3aaddf96a9a0cd8349abeb43883b052b8c0d06e0dd1734e0cab2944144b813bd3d0ac4bb0d61dc58882e003f0326a9c834814c1cf9b9765d5e0b5a8344d32d172ebb36e7f1f0f7fa1eeb72e0db42e9ddf7fcf8c6049700e2b514095c787a4495c4839874d5839894775800b014a7a7deedb7244cf7fb73e6cd00912fc0ee7db20f0d2a280b1bf9571186dd6eac0a4d154c777079791275d65a28fda0a236c8c3aef9b51f8fd49886efd8fb57752badbbbfe381d5bdd928511dc249e6eb924b32b50811f4c7509f47541139ed0032e04ceec378d78f3aa3869167bc714b755a4fa31eaa86e186a013657a3302c4d1449e1d12e0643f04f335a30399a2de7c2b71671cf08f88514fcd51792f2bec88c94466f9de7330d1940282745b83853489778f015cdb6bc9a0a85584f9f039e4db9f8727d0066573db095f60e8a15816d63375553f56c34512e4b59bd7df359961827f4841648b1b93a9c594f203079c8918745e042228d0bce0e1b00e69a068363f36b5ad5bf07f595ed1f4c7bcabf5e4fdde561ef5c6e7c0472d8708c2f0b9820d2d009f946ed1f1a19e213e75a8b8ce1b734d74a3e76f24819df3d1023ed144f8a790e519e6848f72de60eb3bc3f02afe0f4b73f4707665b43124986610fbefce45a567897c945e3d05cf47710160cf58f4e5cc3c20d39abe25da605784c59925f115899256ebe0ff55866735c20dea3a00698313e8ea2aa31ebef27bf0e67c67c8cffc2cad6647ef7c15475da4df2321e298162a927dcde29c9a2a03b4d96edb81e9406ce762bc9054af7368ea1e77f379f7e663606177c8dd517b4922453ba8471568dbfa4e42363a78ae40a76a7cba32ae3e6525a67162deb7384d8ecbd61140c4acf43c707ab6571c5d56ac15895f4cad2928e5ccbc2d5e3fd84f77a318f0f39054ddee704d548812ab93b8ad822c0fa405327b3e69df560e6bc4330b54bd1cf8020000000000000000000000000224bd7bc9723d83656ad1a0f6cc9e84d221f86a62fa3e7429cbfdc02d834c8764cb00e604601c440184bd7f81959fc9ade6ef6247a88a3fe81b0b9edf82d1f0784298671f047a0d79bd245e2348e526e96b0de33af2cc9e8876eb9dbccfc397000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000accdc8b4cef7a319ad13a61d9769629dfbfc01f9f8fd57d13e86c6e42db57ce55b1ded40673997c7308953d7830fee7d267a7b9f875fc175f3b35bcadb1195bebccc1d291c483e8cd687c99911bd5fd2dff1889fd46510940a8e09293a61952441fa6ce9afe253510b2f1b83b13a198c45baca2f31aac9508eb7058a0bfeaec020f51b48ff929174d00daa0438a4e5ee543e78b33dce6aba25e0721708bfc293a0202ba5a853887432817573884f1c491d9fcad281087175ddba7dc64131991c1610a02f77cd09ad1d6566e6c15057c38ac6d1cfd2a8121d3814e8144dc2c59eef4efc484ae9bc37d378f0b89d35a7eb8963a7e0a57f96b5197943b4cd72083b8099203190cd660e5e0b17ede5d935bc3ac4e1463f4e1121e74903dad53ef316a485b3b031b0250cf4b6c7a9b9d268f4e802abfb3050a2600fed34cdf8e9ab3a693676ebb031339bb6d41202a2394d534c0e53334debabb454b2cf878677e79a0123df3e3e302259a4f2e866e1beb72047a46dbe10c5eb7345d7ff5b96136f14ec4c418397b610326ae02719b5e50e3fbe586940cf5bbea640e174faaa8d7934bc26110b96cf8277aead9b80edcf4ba91885f4221371bb954584ecae70904fb3809fc745ed8bf102614d95d3815e72c558cb49dd71a980d163bb0011ed63709cd1fc7dcde971cf1a0e709ff008fcb2728afdf2c391e77f1dbfea1fee340e6f080ec9892436a3d55e236501f2f621405bded18c9c987f1ada216a9678157e2c06c1ed142019c3de2995c6cd2ff546a6b64463de3948905236d55ea0862437772646d2e7501c037f3df50ee198c537b7eefbe44dda6f21c90b46e080d843e609448984af1ee85c4ff943a3c1d2944ab45e2cd547c1e7f71cd01fa9ba8ce7825468c87380904a808a40384b988cfc68d502547d527822f4b8185d8e8c4b5807d7c49c2d19a6b378331da25794d3fb5c918ef87c938a542cf023f7ba8dc755e73b721fee126d91827afa36365ee4e7aa64e49f2822103498243bd0c5d74745b0ac0187e7825332ac6e6d125743cc6bf8a1fd54ce0fd358265b40f03219c898fc578f43207e5a96dcd7a280d2b63c7da5f22230199f73d0b92f51153bceb2c4f22e888926b5c955b424380adef1067ab23e4d506c0df03b6816a76f9a29eddf8d4beb8e41d72b0bd32d4490939591b08ff79065d83d29783cc58665f4f371120748f6cc6393b40dff69ecc683d36d3ca9456ef1d7e47974a79ae4b6a63d850478cd8e19f895f4c1a818eb5e1d2e80bd2e1b4718621ff297fda9ffbde3e3b322d6e5c67d72c3cb0c18ccfb682a157ce25a987c91696b1d0e7b12ed73620272a79431c7f7ae54dbcaa4d737e9e8dc34daa65dc22f61967bde1de4264100125b8b6f2547505ca9e46d78e6a14c079191a27807b5f3636f51c2e49dc0430057cf153be4b5971392eb8c1c5badb8204ad74722b8a6fb2811d8f089f662bbf09f80934056c5b932873a04c0b73f9f10b47674c14334ff5f48d2c8d80da93f20f5232f5d77102cb1090d6c6e9a838bfd266f2cc2272310adeea169d1203178c502144424a7298d6235820ff7dc0a0691475fb0cc928d0160b0b2d34973cbc1669bade55d3c40894713b59d7fc8b5c9af64d855bd863d4420c45cd27d05996726f3d88972bd858411907accd5e4dceaf52ac01ecc41d5a92c26bab17c1277a5cec1b5f3c286f24ef028839464e81b94909d7b612a0b1e858eed6e3f8c3ab7783636bfcc4619d99a7010bc925aa6b5aae5d3f99deea31803a0aeac8a281227ee4f67bf0d617adac5acc3a9616d5b0abaf37c097f565e33d6202ee2db7173807a757383f741fe239889cb2ceb2e525be426b69c6e639c47b139f80b27d004752c1759b65554cf2a5855dd523dbfb0648851ee5dd2f45df42fccf54607e238f7b95d8e83f88adbbf6b810ed22aa3b356a7a768234e73a53be508fb018ae5d763ae7cf6e692a90168baf4466330d733403ceea148c1ebee67f82ecf36aafa75f52c8e8e0eb1d8789a11a628c1ffc287457934c4280eb775e15c7b34c40b31dada12d4405d6fa8f9b3ce9c96c100b59f2246f0178c7a76a84c3c084c2f0c84d0ad0ac11f17bcbb16d53825a0321546602974ba1f1506d9dd5f80fbfcdfe512a46a8534fe24298c59c048c24aba316104b63368ecc30be2a0462c93d8a3f7928bab728f5b51e773f90e81159346542a00969b994f34320bf414b2fc3d29d84c2e39a8c6cb95f19d9aa6124f6f9bc167f83e1cbd4b23fafe19724fefcbf4d7a211d976a20e715b4e4e9fd6f1810f4e456d0c4612eb090dd0497f81006c1278ee4663d3f592d11d63dee11179b0fb90084690827c6c77bba41154bfd45772d5fcdb510a64f572321705610efaeaa07eeb6069897194aac96c743534acf0e67fe0f069a0c", "ac52635351", 1, 2105529909, 1537743641, "18232ac05c9e741656d77aa659dd5a22df0cfd5dfc4085f2ae52d0c5bf7de462"], + ["ae634e0c01ef9c5ef35feae51020e2ee697fe382f8df524aa8ce790c536bed68a2880567630200000001ac96940cb402c02e6b010000000009630063006a00516a006d38200300000000080000acac0000ac650000000002000000000000000036193600000000006ca0a51896e271aed96ec4f35b24056f9a63a79608136f3f0f87990fff44f1f503dac0071ab2ce625b38e94b7196badc846f36db2e18690b2033b62ea3858d8cc92cbe2def5249ce4471190ef1060907ffb49c9b1b79d8fa6ccc702cd96c9eaf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000771b87cd42e7a47e4bea968d56241fe1eeb158cdfccb62cc937e238eea58fda0b0cbbe632bb0a183d3df2ef942d0f0bcf6df9211183e6e3273cf7ecacfe34fba5c257192831d81b9b283d6b0bd656caf1ec94a9c1d02e5d14d6e53aa532b7f3497dc39f4316efd7de9ee231c492401336d9b806d8265a9c81987d9642259a00c032e2481246d35948ee1e3663171435afea5bba03cf40fcaac965cb0f96adac58a021e4f5e23a57e84e17c78c581763c9cda59dfe583453a3912ec0898007faad5ed0b08603e0f3afdb8e42b7626924a46da0f9a26630845a4d478e20e0f5b360edcaa934c4e510749866814dd71aa87c01f4bcd53c15c420a905fb9d071c48121e9930319b4b4243f846dbe5093287b08ec2b65be9604eaa6845aefd396d29fbc06fa3d031e042209523d2dc8a17e64397f9f61438605f7ba5c3fab2fade7fa5a64f4fddd0301de970c9861ff68d06393768ccba0c94b2d3ce474cb5343e9d31f0ae73b5f47020e29ad473c36c7ad20d461641c213df56ebf557171eef07d7377bb29f83b059303229a0bfd0bdcb1c4965fea1261dde55072d4a18994334d99e61156dc9fce9beb9ee1e97139e1417c3cdde8e8a1de44af7bb98227ed690899b05cea274016ed3b2120c36d919161b6bf4dfa654635bfaa01376de052d0938a70f490a4897af6e91ef0bd0794951109bb9a497a3c7b876045c6ebdc1f89d2f3e138b67a2b3a85831ee9c04a097852cb28c0e10ba87a8a5ba2d5a799c4acd23b1c6a837a0eac569ec72bc837335b88ba0d9e26776b5820d7120c052fd85a2a5e2ad3355fc09fc73dcaca67c8fde346c5443f270ed8b12c0eb37d36115d6de86594bb4279b19479576fe607a5a9821eab4d5f558d11cef54423526cd3951e557e0b6a6403c17186eded6c2ab90b37ccd8374d54d54cb8d24067779a3bab7885c8f6b80e2362bb785c694e33537f9bcdb555dea225251a17fce2b722832196a97b34339e24ec97b99327506a929d2de43126ababf6d50eeb78c81d440e36b2ad296201506b7c86c56bd8fbd991694b6a2754084f884c3b8ee397b509a1ed45eb744e4af3b23614ff333a1242c6ea678a5474a196c9830078c388418d4ef69d71217265341f533ad4cdb6476998c376bb072085a2f31a871682136882be37d0e8933108d7756c41b0cc8aed38663a9837eb6d372b754c667b65df57ad28cad8e222f5b3dc7fea3d26d3a41d77c983645d23bc04a1038d96c0425381ca1c7a51869a4dd83cc3127c6fac234532ba2a6672e2d9e5c5c99634ed7a87aa9448dbe5ed6e213e298ae475a8054dddbd322f6fcc8867b74e8d2a9ad87377e1a8795b0e2005b42148dbbd684cce2d654688eb3c5f408813502595af6c79ad4eaae8fecb3bac5b741e44eb905008971a71d2cf9ea0f9a096ce2cd9ae5ebfe3e5d1be9ff829112d0215d3adeddcd88d6c6f9bdc3b1a04ecd81263f6268b562e043217239c4a916b462511f5618868ec4f508e7bffb039b0d174e14e82e35f1db76bf431877c8aa57423af1af6f8f7efe1a94db6b0888ffac9d9ff26565f368c4f484ea2c7b1fff170ce86b287f8f0acbc55c7f6593025afa05ba8c2bc59eaf57fd6c05cd461e0e97372db51c04758c1ea4a1d95d9861f4aa009bd94db3b31fe396215c0ef674112980c115605b7135f99bcc87e386b086ccd816c7f1027cec7fe996befbdb9e4987d8f25a7d442f694cdf64977676cbf030230d841c0684702c9ffb826696fcf45db305fe354d26fb297a42a9449be67530a084c9cfae7b98ee6ce2e78c9eb3963e6daf797ed955d45d4987d4356882e84b09b8c7e8cf23828d29d943c9ab4776e4377d51079188d8085084eb1d86767a92dd6b5b58b9fe382d86e815f6a61cb02fbd6c13b1be28d9ed1aa6850e17ce43eb01fccb50011a395d2e16214fac40c3463bf45f762d7b5f3c64805c0f8bdbae0e418ddb0fb6e74c029824f28b0b9ede7b48026fa82823373c50b9bfade4ba3ca18e5db0e5eb3927cdec77d44a9e0cc25ede6b3bb1bfd043e9b9be9918bafe3b55b6e6a88d6249fb02b912e44ce349e025a20c5939822edde44cff31c39d1f63dd28e5478bcd766a53e9aa15e7de384c9863915a1ddbce7020345dd4b9f8a1d484168a1b123c9624ec4f2ba61bea3c3d4072fc897f974352e7b067d1578b77d1e42968c8cfb4925a45d30a2b53849cb9091ac11cab4cde5b6885b1d92250d6f9deac81702aca720d26e207039b8967003c9b2a1c75a0d7707334e91a9e3aa5b25a939669acf6409291700000000000000008f57920300000000eebfeaad645e734aceb25c38d974dbdadf742e92fae63bd16733e7f27f9d8309ee37a94cd27eef8d95a51dc2e4cdc0cf97bc4e019ad86e700ef3b02aefa3f8feccf41d8f48d3aad1e8ce59d58ffd8706387a4db1d2dae816d729772ea29fca1c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d8975a87d8a8fb4d22f12f5ff6eb01fca2790c565c8886f35478ef9b5c5a9d90dc31433f182d19fb302be08e086eda2a88559430621ab35e92b2ff11d43ad6f0bc20548dfb7a39a9b141688da56bcb598415ca41311d17750b075b1ee646bae659c6b5125bfa621eaa5591d917e4a9d4654df0e7546e7e94bc7e9889c0e61f8022824d1af5ddfcb5866be30a5b4c6d0ff1f746ea29e6c0ef9b5de093367f735b40219a36fed09ae43b81c5917a553cc4102cb18a5f603c321bb40b1498e4dc244c20b05b83cf3af1ed4d40f21f4f213ef4df19304ce4352f155c384441cceea81ca0b4edfdd920de1d2fbd06ac7fe7b027d93d926acc2f634b806cf647aeb144615b4021bf9bf20d41eadfb8d38c5bb5ff706d5da80846b2339ff4910406918d69c90cd031572588e2ca65c80cda15b4b6b669a4dc9f3082ddf219fe5bafd8a27ae37178c030316aa544a7061c4ba1a272e45339dde82afa27de1d0b18562918452253a736d0301201238ff95c55b04b5eb1613bd1232446768600f49553b7b7ee188f9cc251f0215e7ef4d966eccaa976682cb81520814df5793bec2caf65b47a9bf213aadecd9b807e1670d4aa8ac610e9a029ffe5bbfb7253f2eccaeb7781e41513134b0afa646e91761d75e9ebfd2adb58b242752a8688ec59031f5a1fc19904dc715fdc627f78d1e0841b7f7a61c7b074c30d27fb7ee206c7889099f64060eed7adae23ac3956af71ffa92f091deba5903db0db27c2f9c3ccd9ca18af089020a6002aca8efdb15e400b3ad339874c3791813158fd487c9049d35cee3803887a8bc4826d33e63ff644bcd431e605e504126469ab579e63a52e347c17d427459ac5badedae1396753f4bb28a6d4cd2bd47111be1a154286484a6b31116c7a6877c9736af19e1bb33e4791a901870bf94e75b6daa3573e79a3ee5963a79e3f6026b7297ac382355d19f0c1f705807e6607ea2e98a4d12918c78bb99c35916fdf5bca1a8ecf367ba6bece2cca75fee8e09b32e0698091737f47036c6c7b4ec99884baa3057f88e71fde58fdbbd521610d58b6f5312f785fb74414b5d515bfbe7dff8d63598af88bcf8758651d91cded9036560c93d551b070aa9cf8630bccb3d9ef88eb7c9c55ee56ea816ad75d5a4709d01d396e4d7e0ec8d9175b04938072364480e06ad583fc6db5f62b70d3814f349b574f050b227be9d13797e1f0f4f3d3efa3c0c93f865e60be2731f0043097c28abdd22830bfb58c6d62be4544fee3a0b8befe3811ab80b3ca27eabb2fead8fc39707f0f540d65b5734d1daed035e77249a9f2af179fb329741618c9c6f07bbc394ed75d3141573d52e6a81742584ccf79049d901d00385f4be129524657498f162da1215f9d2953550608555cd4bbdd7c0eef1803c625d84442576859fa0d356f27cb7fabc006ebeafd44e0cfb79fb041ed6aff00e109376bd7be92a847b5b9680b17b6c7fd54a9007ff726dc997479b02eba18187701df310bcf06c8b5f4303bdaddb88239c46509c66a7596f6611003b8b9e95116f4338cc0a6d48e1a4f0edd95d20372400bb51cea13ebf362804fe655546620dd8efddc23c603f0144cedf86b3dc2f97b2c13ea0c7a5e260fbb0d526c25d27c872ae7367ea7ddafe8f5c6d98e9120fcd46409eef7b185669f792697442589db8cee0edd0793ab822af2f900f9831033ca7ac582aa6d16a00a83bcbffcb5bcf35e7855cb141cdf0105b48a7d723c00f6de4246dabfbc752f439c43c366523e658aba0c288e71f92215e7c113469a15a5ebe948735e7856fe06b4edbd07a90cb20bdce18a8be6b7a0ce9a96fa52688ed57a5e77205479527c495c9631bebf573d6c7f4e4a44567c2489c9c7712ac1447aa8beb29c92ede111360ac6816b03f3cd159639d8183f94326431e86abf044a119a88930032f70c93528622118777d7c5a68d35bfa7c63cbc89970491a1f7fd15fb6be22eb6fb30fffa60397e233eee63845eee26dedfcd4e76544d1d5eeec2cd461def9903a5182a44b5ad006f9a4cbc9a3e2ea16687b34cf81abf4bfa87f33db416ef1c37f2359ba7afccc5afd6cd190fa12ffc0cfa174ab337c88b4c6ad0127f30d189d9af8e369b7bddcff037811f24d671d7c807865cbd7d07bdf29efaff348e695cdd93e87a71fe89b7ae81a916bbfc767410e3a003f98b70d311784dd112edc3ef1619424eda4fc07e94ebed76f09e611d0d523771c0a6a79bd5823a92b97416f5e5338f2d0f5e8fdac8bb92afe2f7c9f3547da00b4c2997eb41c12cbe88ac86d99419bc60083b1c24620aa8f0ef08b06c6e532d3ebe584eac3b933ca60df9aabad2586294d703aaeb8f3b4bdeaa65007db5e0ecee885870cdf483dc30b63b91f4b6a6d4a2ebafc5a599f24323547088a948362423f11f76fcf0e81e13c1ad908", "63", 0, 342522518, 1537743641, "5f92527829eded83043b5feae27e24f28638b1361a149726c64ecaa72aeb34bb"], + ["030000807082c40303992cca22132ae4a7341c4d153065f8e9cc660447782c1afafcaa8efcd5387ed10100000000f01397046793f47a5a2bfd83a864d1c452d7226b775abe7a118208588f15de4ace69cc8b0300000000a5c525b09cec47c10dac4339d0c614b4487b0d2d22ea84610b2c001c0d6a404d06cb6007020000000016833f7503fc175002000000000863acac006500515334aa6600000000000551000053008230ee030000000009525200536551535363000000000000000000", "526aac", 2, -1664400184, 1537743641, "9e66b81820c4b2f910a834430ea23d5ca1f8a11ab761855348a779922d0817bf"], + ["26b9851d014468158d86e5b69db7038591eec40e040c3b655b0e89d72f5786814dc504dba103000000010035a39ce70356dc20000000000000919dcf010000000007656a6a536a006ace16860100000000000000000000", "51ac006a5263", 0, 1240732957, 0, "f518a028ef5b42b79d89855335952f448a822d684934af91b04a4ba9e35ad2a2"], + ["030000807082c403040c39f1af36d76acacfeac6985dcd4864bbd337b602cb6ff589e0b452b796a8490200000005526351ac6a5d5da2997bf203413f1fcd235bef5f5176d3306e737cf4c06ff9d69a927950a07b46d8a0010000000100ffffffff7822904ee87e998ececa3ff74f2feb1eb4a876e2ee1d42b7d6b036de0f91821300000000016affffffff9f68b93c372a5c8d50dd0bbf2ebe4535bc931a2344b5dc1de7fd58bfd8eca683000000000963acacac6300ac5163ffffffff03c6409c0000000000066353acac6a65c47def000000000007006353636a6a52d0c6f90400000000016a00000000000000000348fe0305000000000000000000000000049ba80f774f67c4099b87775060b1d656a0971160340b8729ecab5053deab3dd674cda11c487ca4bf4fc7e0326d4c026c4e8791dbca20e31625da60643e81e96c19cd5e953172dbfafccb6b24dd828e0668e58bb12efb2b0e2e81432dc240c5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c8bb8800736afa34f9382b83290719889803d5b6f7435071586e07b48300dc938bdef6456679a6832d35e780649f5a07d741e81d445c907416c9d60ba6c3cc5444806d68f0dfd454041ca2eae931a70ecb75689d27296959867bef08028f31fb874819adae66e134fdc7187ac085b972968fac3fc759b227da30a3fa480161403169b3223727cce19148a94af981d5ecae4e97478e5a7d46f241a7d20e8f12cb20228e956335ee37d50639bbecdd78c28740f33bc136c189a0a499df328f295a1690a04057c3cecd32c05cd8d868ac2ab666aab96e5130d16e5ecb475c7085a652614cf5168364710b03f867445ae12968ad9e961fbb065b5bbfa8819186057516f5c022ba56f767b552135590061360472ac04ded6f6ef1810d7057b780234a36c9d0f031ece9ad84f2487531ad2034c6ac5c9190c526b22904f0032ce3ba93e1469b095022bf00c9bd4d05bfc3c6bc804717279406f996ec235a121367d424fcb923504500224547486248ec1e221a24fb8085c76189e11d5d88ebf66120fb974fc9760f874032013895cde4e7cfc5f95647d521beb9bcc53962a0f93715330550411867eec35e28d1685b073fc65cff1ffda8a9a49f4573d1a863942fcfbbe25178749b6838cf093a4588bc8bb2b08d39f26824779fe28df40a33bf92046262f05ae10201ba998dbd8d57395dec45d366ea638f09faf4f0b5909c3959d60b94c53e2a0ce2624bcf750c5c3ca0a85152da333e40342b8f907cc3881f364cab4d9289b481c946220b304b963641136cc10b12b286c9dd4c934328abe657cf356dfa93182485400d21d73db07af3aada1d6c78ee2237727e34590edce5c7d2a286216fc45ce46389e40c420a006926014419fee335f131b2fdf4420b9e2c576f15a2c1452bc78154ba2035d3c16ce7f21e71e267d38cc5e521a268c2c9f845b60787d98fcd15f83278e572c2f503baf8854df35c50ef0e1c1b255a1faabb63f571cb786c3bb158fe487c703ddd32dfb3fa3ee508afdf08571714c38b9ccf893dc093c2a51fe1b2e3e26a8ac201030008bc4c7ab1f806a0801478637cecc5e5cc192d020e1e50f8922c9d72f29e3f55ae601737f6dff490cd3a3c96dab183a6cfff2d579c8929394cd6cb0fd2cabedea316b7801b6ae74cb087554eb449e4ff55729bc9eb63e3931bcb672e1c5fb79f276d8880d3081e4edfbcf47ac3374ada2a49bc9690afc3fbd0d8a6f8a652ba52fed8600f58f0546a3cbb6553cbd9f12f578f533933ad787e8163512b80e890fd74279faf211a1f288123b0d1a05c6ea5fab93dab3da749ba51496717a971eec7b01a86a5879bf145890d19116e2abc8110ae9c4e618df55e03901275a24300319567bf87d02450692d14786c55828ec76b12de7502581180802996379b227d1b037dfc5d58b417bb40e4ff21df958a335ba1fff7cecad00500e928cfc06cef786dd56f487f973443e8e0f17df9de38412f1d1a771dd87ced087186fff1401ac6b068ce74f0813d5732bdab3a2f5537cd6dbeda453cb2f444cffcea18f1d337bdcbc2cd5179d064c172cdfd95b51494043498d94abef43131de3a47cec0cca20440e3a728dbf542b61bd90327fbb0376e1e6043ffa9a8827621793f50c653d3d58e28fd489068bac1be434746f76d478d32ae35042e301f8bf1632fae75456a41eec2d104e83a63bbf22f6589048ff886ebc64c6d305f996cc567d2e8aa038de655d54aef6151a1eb60f0baa15b407b7d4e4f5a04f42e9ecd29f7f5111aa33c430514e06a32b7da5af8bb8f98298358a507cd86d258051319bffd99f4e1db5c943981d47bc9247ae6334ab5a601ee36c0d5cb743a9ee0caca7037c74c73e113fac8c7f1acd23f217cd8136953f65c565f514428c85a337af344d9bb2cce056ab9e2ff27a363dc83bdb772399578e9ee1b94420c03645ec970ceb618faa5511695e0a287814b72e103a36159ede3886640e45dd3152d1f2f66c12d4e5540acdd91eea664527c75af4ef7c8a83710da8f650b42d6229821251b6893bcc299040626573ec425a90b80f8a5ac18f6be54982d10b87bd067629717ed5042d4f72a660cc07a3bfd2c67bb933f6d70e25b3e48ce0b0de639718ec196db164b01c0d823f0364eb32452e9751394122e1b36091f80206f5eb06d9fd9f50dd2900c41be6d485fff29b494206b2e73ee885f0b85a3b3f34cf27ab3a58823587259f84279f42e2bef4a3f1bcd5eee1d5b740808cbbb5d0218214c0ebebd2e24215e413c7b564e1436bc7e03173b4845a38000000000000000013c2600300000000c03a4720a41876028e890681e84c63d4ecaa7822160fe6b8afb15f59334e3f84d1d0443c2d0af1b83a1b31bb098f3d295235c519a3319a8a95c3e8adc0ef1561fab63536938f0b999e5d8e0f3181a1a8026da0e30400018dfb7323527f52348000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000effc9af94c9bd6c14c4d8b8e2040b2e84fe32403c7f05d6e91c59a16496c88645d9145efd811ef44afbef135cf0d118b1cd42cc77ee48b9f4e0ff8081ddca652367e3463d89b4ce6fa46c1b6ded116f7ea020724a238c7e06ad572e6af1118d3ada7bf978581ee1c9105efa0275feea0e7594b82e92a905cd4816782cf4248a80316be32ee157eee044a7fad465352a5d1da5e337191bd7596090b944f6cf6270d02124794f60319a9d594e4b05816ec85765be83bc4b0b470f0d80cc906581200740b03cef393045f95b31dc98f69138aec28a17ebdbe12c8dc951c1290a1ba0d567128b8b3b61f7bc5841f119c48a9cae5e01691aff6bf6ced229bcd8deb3b49c5850300f2da4994aabc841d2b5abdaaac07f536bb1bcc69cd011f736c9f1f267e08f003003b1cac9d8b8db3e070c09d7d7631f37570b983ea02dc79ae6363214aa1420703092be68554f2d3acd9e47fab9fa896491f4b9a6ecaaa13c49016da58382a6718022e744073fb750c5a1a1cc627644fad66215498d3371cd567a4fdcc1de7a04bb0022983c387158a629acc447ca55b42515d0eb7d0e036a5944c7dcab2045d787cba3c217e644fb46fbe97b5d3e244982ffb9921bfdd293bf6c25d4fb8abcc2cc6784b2de029fce7938170795e68aa6d9c3bbf6a0452a2cb9a701801c97b5e60b008112be5240ba213d4d90472efd68c34631ebcabd5f05773e3bc9ccf69614fe750c4a5ddd8771629723518869b85f2c3112d4f3ca2114ed52786981e271c8af2c496c5a41352ee0996df022777f1fe7d3f73122f9e2738ee62269b331cf94344cb22270eb2fbe286b85a34b61e052c6ff956b7e2ebbb67e4db7620e8d9a2ac8319b8efc14149d77af5cf5dec71b7116801cca28675372946490cccbb85f0126b627005aa63591940f06009c00820dfc908ff3f7ee7986fd0e737d2c7ca890c22f58332df956d83a144ad41dfdd6db3bc47428f0ba5661ec5060e52bc20e68991fc9319cc62fb121d7b46c34e94379c961ea7ea194827096676faf330d63700e027bf9eb15443830cc94dcb59340a2ec605773c2b57e1667e4f0bc67db4f1fc1fb2e0a623364b6b8b12f218ef3c7e50d77f01794d8718c01fbd22c776302353deb02299ab698425a438e7de390bdbf9e825a7d5fe085d98dfce5ce0a836b3c8c2313e9368b3947d1958273469e921ed56025f9b3c23df40e211fde744f5a936dcfa320edff923f15e976c0e7eea160f3417c094e97c65874ede063927c0e01b52905163a20a8a5c6873fd175418ff748606b3b486ead55402fa7499c2b7b25198a841d194deef2fa4e35078b4d904a2873a0de4af0f18bfc2734305883e918a5460c2ffb6204d674ce3f0eabfa2b0e2ed413330446105bed0ecf18e12ef214f94825de4846d54586ef7f8e5ca06d275f48d873919e01112b1d987e0ce2dafb59b10b8f7bde31573fc802dd11819f31047fa45a49a919feeeeb1f02bbaee581cfb99561e68686edb37b9adfe51ae0abe1d8395cd8390c6ffe2942ad359fcb14b8c7e16a3d29e15b8080b6d5bb951682bd90140ba4ca6eb1d297ab8baa9c8b565a56289f9d6eff4a109ac8dc4a38272ae50202488885a7c6288fa06c5dee926436eff428f9398396099be01c6cc6f096644b329915441fac83415241bdd6beda0018ae1969aeb76bd24b0166cc64bb832fdfa4f7015a0d7b69b82462f765ae4ce39023cb41ae1f63e4efddfe346caa98642958cc41bdad2c65b366ee67ff33de4b4f7e2498919e1d5b30903c6ff5852258166a2e3ae2e6db343e29d7d713b6cd19d98087c3ea6d3be01472bee2dcf60a2b1733a816ebb4717298813863a084c92540940dc902f0afea994a58c91906c355da30b49cd583ca31fb6d97ecf6a6990f5d0f21412cae42920d828430107031b5ac90541ef4f9717b2de6134139f07d8a33fc82ea4f6f39bfdd306aa39b8b7a679bfb831af1083de35b8e7c864abf8e821f62a0b769f7dd07f0b0821bd84faec5fd728974391194b82489f4a530e68c745847c45f79d7e7b8e26714958aeeb3d4ecd6cea8bfeecc21feef10a724dca38f34db631c934785c1059e4ed1e2c4c79f1dc7e2eac651b8db2b31b94e2ce41d0512114c5a35407731925b3d64d8d57c15d8739241cf1b6d4d9cb9fc1d8fd6231c39242a038f84027df2835cf463369ca5fafadee37718488b75f1b7d44df952469db4a067ac4936f3d5033c8398370a6ce9b8cd20da1bbdebe79ae211ddc9111c20253fa2d8dc7e55474f795d7409b20fc33034600000000000000002bc62004000000009a64996513137e67f257c0e9e86a521499fb98614095a60b35eaa09c2be12f894e22e8a559833c4f4b23fb355e09dd188b81cdc4bfa5178c2341cd494632a581f7ae8ce491da6c2e54c5b2c2802764b8cf468a50b604022ac4a3bd2054082ee5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c21c6156a5d1575d159df05fdedeca58b661fed0111e79484342944c82a00603cc6badf981ec75eb2f1a293bed1e6019e37a8325edc90ce7284bc01a4708b7dbe771eb60dbfa99037605434b4ea64812de75507d01ceda42cdedb46b1149416fe961dc25ef1f3d86f7336db2aa42457cff93c8df671ebc7e279ecb014012f5003083eddce59d62feb2c515ba303e279141ce8e951afa0567ca662a9be04857041030c0b5735654b2b1d84a2fef0fda2eb11aac37ca3cc5670d66e3cbe1c50a687d90a04e1ab3443a53cf486995256f65b5f4cc32fc296ff0de6878258e8fdc16d1eabb9e232f3a0eef5f9811707ede2070a641b87a22f73b7e619bc3f3ca19f0356470205533e46052507214b52e3f4a78cea119b695fd1a8e839f3a5a567e1e6d05e59021f1bbe56d369ff2d957c75b5fbb9e0f25dca49ecffe930c530619e090998512f031ac433bbe51f0751419d3e1f06f5735db2e335ad05ff12f4716741d1ea1461080218f13d63e190f1870335b042298a280845a3d6c91601252cb8952487d5cf59110218deec8ddc5d28b0df980d5e45b3529577cbbda36828c8442bde41f81c7bad43df0bea3632b32aeba908a79d1bfad601be13734c610cb77fbe7c497a2a7ef5b9ceb12aa0c18fa61acb153f7724ca61d10430ae221d20347721f09d9b670011c8706d2c25e70f921782e0c7924b6e19a4560199af999533be1fa882861c29b1f5210d08b3f0d0c5d6a6eb23ae34e568dc6228cbc7d88dd86aafae168db457b091d5afc4dc9aa7a93169a8ea1a12e40f46bb44a98500675d7f6006a055b331e893240d92914e270d9055d24a3222ad24ac06dd451625923e72bc0b87c850d1aa440226e03e325c4ded80d882c29af24dc1d67d0e54ed08e19bd6ba9fa5c770e47c8e23c587b5f340f2e348f4f07f5372fb76df34ee0512e2cc93812e3a90d78030fd92acca317dc17a9efd835f25708f50e5d06ad4d0eaa886b18ff1b6ef1de35319b5f80a5013f7acd37729cd49babf67e157c0880616495679bf7be5dae75f02e15d3a0e80b5bf0bb8c725f9202f83301a3912b8f1860ac9ca242da28dfd161d2b90125ba2ff9fa2a2c1790de5f1e7d8ac16ad7f0bb45e4fe01a12364344e866dc516b02821e051e23e2bf9ef1732add1d9563a0ada1fa2c033d7713538d5708a08e62c36b2f27a98098845557392797ca5bf4f2c5f688797d28a5906983bd056e760638fbfd0b67f59ce9ab4f9c9a5986e9d5aa18c5fd51d9a1bfb95c175b1a50502054ad28ad557bf30a11b2ae662c22c7fafe24e883b2c644d3fbff422dba6996d04640ca021b150b6388d962283f333713a2b6a0219eb83f6bc06fe83bf8882c4676b35982e81133bf0d1fdccdaa93f8bb182f88a2171a8b5f79b8e7d042544b619708eb99881c75d60d1e2aefe8d3ce2c4662a8ad18cf54c3c45b9ac125c940af28ce276fa115aabfcfae8ce0700834146a54107e2115623ccaf39302823d2df64c90366912099af7745eee57db1c708566234534c70ff89f595ec0c171def839a2dd74cc568b26d69beb051d84c38d537c2a27da2ebfe756f068069863e2dc3681db1264dc07b3bc3c33e8f8fc804b7197af76bb1adf3cfcc4c370280e5ae89e8de1f6afc4df3fffa7a43f1138b5efac4617b65e0ac887c759d055bd03a18214d7c51107c39ec38a9df86d6792a4c2cc8a9da975eb1ed8b69c7ea8ffefc71d3000a165adf72480cf4dbb7a99db792d2b4a10eca0374f464c117aab040fe4074d9e73dbb77069c1887b8b06dc7e5b8ff26c62a454f7af40c249d57498cf8a59a395ce3e91a868f67912aeebb722f85d9d942a84b1193dd8cd10274759078cf5526d8406e51a1084b1f401e7e33f10ab9cd24fc367c7056c763fa2c4b76432c3afd6e196b3617ebbfdc7da06070b1d5939101c8db04c4b9c1be354c51c45c112ac2c7ff173b8366b35ebf6178597f2aa1c3692426c61a1b7a46213010a86597ed71eccc33dfd2181daa3e04f19b3b8e46b07dea4fd27815f4ff255a0984d53f2a5d372fcb9d3a4b8ff85e7c2eebb6015a8c0f6fbd4177b32ea275f1cd85201f6a111234f0f2972826bc92ad555e5e2770fc4e1da6d625f818ce73273e7b2ad228925ca44199453471bd573b43cf4c1da96fbc5f90c5d3a7bb35b291d6659076ee3231af7e0f7c1902d5db39dd4af9e17fb1bc49a78a4d13eb868874ecc990385b049e84031d490b5734a9f0c10f8894f37b5174653ed86bcd3d4ad4f1cddce011344a01cbc2ffaa74a4ee7b415e6484c5ecc84dd3d0bc8a8a07c4e23b07e818a4d15f691e3064efe62aafe1548e53220542e109c0aa608e008a5aa0fb2614b4ec748132d42708a7419ad7c7647f6e8a2b738ca70d79ae8aaf386503710822d3fd0bf7fe2d49b3ea4db587483cc63990d", "0053006a", 0, -816215913, 1537743641, "09611c6cfb1a4be0795d450c342f856f0c0d2ac38dca3fc42c3fb18a7a089eb2"], + ["030000807082c403039b8e302a1ec41524a9bff5bbce1808fd8af45a30df5a360b0c1cdb38c8ec83af00000000085353656a006aacacadd5b4548395b7c639bf2121d5e620b76c06d689321e026633d23005ef947aa1fffab3f500000000075165526a5165ac3e863511f64f07bb70cd112b5fabe62fd4b21585ffed27564bda2b031a8681e7e05ff494020000000852ac536a636565654256943503073cca0500000000085152510065635153f81d9b0500000000036a0063c53e57000000000006515163ac5265000000000000000000", "", 2, -814157394, 1537743641, "26316b3be59f0021c89880644344f7ddf420121df315330c30d216193e8d6c18"], + ["d2694c6503004cf3b80ed2576e6c8669cc9cdcd44e5543a836302d48635f73664b498862a003000000035163ac0d3edf99866c45ab4f79066056437c220d83eb3ee74efddf69d0e2328298dc35b3c452fa0100000008ac006551536aac65ffffffff4d4f7e28c71b41bc51c320972179d3cbe4e1553b2e8ee2120e03e0199b484bda02000000025251670701370265e9da0000000000025353a6cd1103000000000165000000000200000000000000002d09fe010000000074702fee8342b32726223790bc06f7e84d871e6c07effc247a2439087a87e41e06411dfc2e7b8bea8096c4a4e8855d478dd78e0004f42864c2be0e3175aa426aa6fe9f56384ba7044254fb9ed24afcd39d77d92b44a70a9a199a9966d3f64ade0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057ae4fe36c7f837b03b5cbd4b313eb119bd91336b74f5d82a100b9f263a5302b98ae875fc17036366e39e64d82af5e82df0859a194a36cb574977fb607d928d901f35e3234f1b52e9d2a1ec31587dcf3a0014bb1e0ce8e580e26f62f69aaac9dfc9e720559e79590c9fadbca66041cfb817544a1189ea27edc4af084123d568b0312c0736a81de3bc6c0dca98004f2b0817186a1340d8058e94af11d96a364c95f0204f4fce2ad94969e9dde4b53157d0fe322c48d0a34bdf65da503bbea0b5d14b20b02d1f1038403d49b67046ea3362490254101627d946a2b2122578c333d5ae487269a3f02a93d63ffc626b80f31fd3cb24a3ee37e0d9ef3ec5622be1ea42b9913021df14314054feecdfe3c60a079c798f6ea9ee755a92c47ac8e49e1fb8acb2314021165f3113cc463fd64f72865ad8eb54501ef05f3c8fe71e7fdabc70f982f4fb70203abe3f79207c3360fed8a4a0c0c04f8658cc7afed35191fa850e7f6ff4438b3031dd1a4125d2f15151bc0fd0897d64e94db568549e1cc95e27fca75393d62dee103203d6459cda561ac2c390829622abf7af38604ac1fc449ac2193d9fc423d6639f2d21b69e1272e2fdf250a7e2e02047049a738bc9087df52c9aef6ff976e4f92fc62c916e437db0bdcabc26538ec0ece05fba3a7ec048a51a0fd5e77077bd722558eb76e83c8df52b25cdf544b27b25a4d8bdba981c1a5bafd116b169d0944c8b8981a33119e6321204405af7096dff2ed10fac694c4dfc37b97410032686815903a02e1b34ba9fd6893b5ce8f56af6d952160dc20874e4b922f9299f107d6e68c88cf73d58b4accadbdd6785f1ea850a348279cc999829f811539e1c77060deee68b5e4ef3f6f9a077f595057f017530e9d649436456aca7f47d8406c96960e5919433b7f0899d0218a1b9d71a2c903ed2aed857b0ec4bd4ea18d9a830304bc0260b258dfcbf58904a30639c4bac1dba34b72424ff401ec3675058881f7afb94d8d4abe0c3670ad11c4e0aaf4f072fa568f82df3a5eaa0bf7aa407675f5920dc80bc43cd5656af7b5ff4007f4f38ea7ff22fccc670740d1e6c16647620c344ce97938f58c127625e201e99ada6a6b16af7f8535e53db1c7704b9046e3b9a3d8600cc21a68e0ff8c7f19ff1f58dc3a77932c3f3cfd62aa7cb1c283bfd1e5916e6941bd955b9ddefd17343b0c89841e173ea333e7eb39a78f22234fb5a0d4804d03a1a0450874affbb2abc0c341d729103e752a775e7ae3b1934caffb45625cf4712ba563a54a6cef0a530fad9491dcce6bfe51267d53ee6e3be54646c156f6d60958d9fc4407cf53a5535e32a3af42d0402338bb470d7dc3d4c58197e912b268f0bee8514fff2d4b146f23696fbe767eea131b7d76e0fb17f90734d5326edd616789a2e7b1d5d724141b9eaea61dff0b36486dfd01e8b0fbe9a61ee85d40fa9211bf5f1b966e61a545f261ea0e25f6b39075760bad83b1cf8abc698ba43d7baf1cde1a6282520993c883341d66a4c9cb7e0f4fd8e3cb460c7cd4e9ee3b1d136a843718bcfb16325443f385255d0d541bbd5db1de299c6a828f4dd5018269f393e1b93c66cd46918b1610710fa917d27b39ba8428e966d8dd5c7c6c9882aad9ce34e6302ee0980ebf88b9f71685318d2225238eaeea1e3b2a66275dfa5183adc8c6a421ad024a8ed77617e01be7881a9d1860456e5cd42c29a71e4b4d1bf9e2dce5077545a93dabd743a3db048c2f572b81a492ab877047dbb56d1348054675ef8c51862173c5be920d57aa2e148d999688c59c0749296e2dad23b41c5622f5568de962e5d0b2b19bb7fccc0e10a6773c30e7b9634996bbbd7665c03488101ba576dec9f2ddf0a63307cc0c35d9108310d59784424befe1a6d84c9a38a093f932c49ccc725307ff30a2fd18f88b86c7e181d264ffb30abace461d9c14a38b61b181d865dfa440f78a6d11c9485070b52fa8867cc3ef3646110c58a69c9cf41cb48f9ec812f84b3eecad354ab3cfbead220bf03d830d7ff91897ba069860ef5a96005e6140e67f31c189f7c46129919d8f0f091e41761148c66fb7bd5c04d335e85355b8ac8eba989f664c588296893ab137a8cb7c1c9a204f0996cdfdd5faffbc3fc2b8589f166961e5ddeae3e978bf3b3f4b7d6d2c58a8a41b0580584b681c11e2d1cc8d06afca79d3a9cc59be49815b65d2b915d7568610b5bc3e5859aeacaa074e48f4a8fb3718b36807032107b250b327c570f9372e09d2eb2906a401d1ef266de032fa9594ed4c31c60955cdb5bcb90900000000000000006778c3030000000044700eb82ebb3f035ca63b34f6e77600ac6518c5e9c459c5f1f013bae934db8b3d59d0dbce7730363dd4c47c53015489c1471964889756d775c0b72d820a2d8ba193171b10cc42e5949d67b410be6b5b101ca62a6c8140496a91321e72206cf3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001959ac259be0a419c7800c35dc4f337628015ff0318849c446ef094bf6dee0b8964fd4f3c9451b2b550da6f5d1007c4388d8181b5e5cab9f22597f9d4459f1066f2531daea4670b3a72847b274761001bd64b32200b6c3452745623a67867b9b1d8a70513a75353db574980b343096d0c2f3d27d087f3f210ba70c41b9106fc30306f6b8d0dc2ac0ad12572384c965269d4d0373939e2b514f53976290d5baaeed030f9e7c58b75668b0b3c5eee4f135b03df0671927e726c41115e57c9d19a27f7e0b03075bb05fca6849bf42a251331c9dbdaa5911fb2723adeb7bd731208473d863530b8853f6b30dc5f081b48bb29fbef643180a317a8a8a1734172e50c39d8df602217b72096d176895183d4d64b86b5163636dff883a70745b0a8b454cb8f5613f020dab939408abbcd25f9385b2516336133bc20d00ad5aea3f819dc638830241330304924fb01af4ea72e54dd9a0315f9e2833e998fd505155a6c1c38266187e993a03025c311555a12e7a39cc1180eae9ff1442ba14431990314d1df01b63c29706f80313ddd64129ba3ba101c07462987f7334cfe7de230ea08e7d2f4cf21c3c025beabfe5f6f49427358e0a9fbfb2db1af9cc4cb0d0cb4379941d5594f28224e2dca40648251a30ab67d3ac62c66c6cba015249cbc82cad246a74dad6e4271344f077c1ed39cba200c516333410798507988b753392309cce02685a28da7cabb95534465dd14be4d60f3b39a04c4903f0929734994b585b93fd092b4c4c20cd7175f536ba3a72f75e5aabb634729ba617ce438c949c13b48099a8ea50fc5c73343c27a4b4e435ea8621bcdf1505ee4d77442ed6628e8a11870141b11b521fbf2f2aa514257246dbdb66a543fe786a45e5dddcde047ce4952237e8678a6e0bab5414df0e2080b9e3d4653c2fd21a9091a7efcff8114252b90a18561137af151b48ed808f46d7bdad2ff4b020a83a53b91203aa7ac1f189a2392a60c083bd1f16d2a22a3925a0a7dede1c33ff7eea7f4b4f56b316d8799458fcd6950c9235301a5a4b5dfbb34b4cd3867f2d96b3b1c30227d31b779cc051e0d9de65f1095c714527f9efb39f96103259be42ca00a4c910d80068a6e77073a4c944eb8f807810cee5acf94938c88f3963b70cd80a017ea8e8c63eec99db2c199a511112bfde09dc93659dbcb57f42c27f97e79dc7f7d78031e66b671541954e0e1a2fba17119a0d17aa7459c64564a7a7c1e375f3fb36b2f12639fa5d340a04ef95f4a60fe91b87a25d8e4f3c0724effac39a683e201ff0fd0b9d3552c7a5e2304624699217203d61d24d2b9e53c0d644a1d3e64e86f2c6816ad8b4a0465d03747ae76f827304d14ecb95c6aae65a8a5fdc5d0133fe4f8eca3a29230f78fdc960308c36d163219fc079d2b13b94981d2a78a5ad6337922c00906746031d479442944ef8548ecedff624da4c5dfc744df49e5c84db43503575a9e092e3c6fe568957ee71e7ef7ca92e1f69cb815ebab4035f73943a1cbf5f8ff231953f362659d17d977b7898656605c71eee56faa960c25babf57bf78e208683169e87d4f3df72d032ac377dfc1720cecf89fc40bcfa4250593fcb6a0408021b88f152b7d1328c5988a6f467a0f59da7580a7df9a571b7233533e746c4c220be73c127f798f6130f58710b93c5527b8e03bdb5bbb6c65088cb087cf386c5d9185ce7bc67985609da564d8e02a114ad58efe0c27e882f57bbaf5488d7e843160101109c0750e9a8c74fcd86566f5e3e34d30d2ff2e266838cfc655dec0775c766e7f6532c6631c2bee7703c2707a3a140a28e41a441512e7d2a4baed1fc37dac2ab687264b94c0b84ccc957fc5fcbd5f7adb89e65dec6f8c8071500fbc96bb05a392f6d780994daf9f52fcc18d93458eb63ca097b393f9d8318496bbde14512d2d30e8345a0ca173322e51e0cc80587e038d1c6018a7a23d3c7b1a1f8da9662caf68f4ce779e2fdce44e2a5d84a4777616e06bae14bd11031ee1f0533b6a4a72312f8143900300070296fd2e1404f76840f2025fa707a3efa556d0a40e54fc1a475dd0b317515019cdbf4c67083606ffced7f71fe48639221c32d1e65bdcacd3075082fabf654e0ae8f3563e7c5dcc010428bfecfe6ce0aea75c7c6a477e8250005ae5ead4cc96dde6aa642e9461e673c08aaa936b90d93098e45fc9b95d0f44d25edef29f1ba15abdf7b605aaf87544b98704ea08fb10f2d6bcc8f443910c09f4a297f3e3e60aae647871bff4e19da501c108b982534ee80149b6dd67c16314fc619a25bf17df8f21f4f887790a09df5c878c78b90c071255ef55ff643a505c496da572e61f6fb38390e3fb4b9a56de78c17ce8e388fcca54afb800f410823132d441795312b8147c258b88102824369392a8b1535bab6e3ef731c29c945c9b3aed103", "53", 0, -924172292, 1537743641, "755f72541f5674ff90c51fbfacea695c683244b84f2587bee4317365c9e3fbe1"], + ["a3c3903e03d35a2a29377152ef993d16daf9fb89bb1e229b8f2b68673986efc9106d71b5970200000005516a535200ffffffff59c6a4c75a6b50a7359114c5b2d6dd6be2409efe3e5c11b861970f89d6aed6950000000009ac5353535165656352ffffffffd4f108ea85cad09fafa2a6fcf817bc51164dbab89366c91f9a3b1e8448ef47f90000000000ffffffff04b47bec020000000006636a526a6500bc79e6000000000005510051516a4ca1cc01000000000653006a6551ac48a0dc020000000003ac52ac9a618aba0200000000000000004d67bd0000000000e3e814829487debd1e3c935133ee6c5592a4efd0a59d0da853d808f00cf9d561b9fdce3438713468213774f4944ed4a931320d5d3437de0c20c41d79392e93ebb6f3b61bed6d23699ea08d2c56ce42ca06c247da55c575083090134d2e413b270000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000068da7cf775886601d73b7268449bac300d125b0fb947dcc06336ca36e738de5cb99e849bcbb50ec035fd83a65d8dfcfbdc62a505a8dba0ffb5151c8c4cfdd30fda6db0836fd90b960909ae5ddd3021d49168735a904dddee61bbe43d290c9ddf3121b380ec16b347f269122f1916fc8e785f7cebdf521b52b41b96eff1e65017032ccd1675d9437006bc510fb45a934fb29e6d66ddf60071b99b64c315c397d07e0218eb4499729ea82e4cab79df771e137566f43bbcde940866a3b859532e5e3ff40a017b6911541d0907aaabeef3db2c18f489e97eba28cdedf392dcb33d103ae283bf6182f6004d975f7beebe45c0e8134a5dc4e6635094618bf6f55568372a5c15022d766046d347caaf3a24466c400e95607353972ee2d5806dcf080aa4038e93c6032947fda677fb6d28d04647aa9dbc0095f9427739f956f0ddb940115801c1db1f0305ec565fa55858ed8d7cb274ba6a958e3662adc552765a38f002077b7cb942990320b36628c5eff2ba499deda0e6c1ca6d853c96939321acf9838789110831c7030204eee7c55b543e98e33afdc4b2434d0b000e379ee5ecb79ffb52cbf840b7485f96cb171a3a43bff7f2de6a69381df2ffb7a801488a8b9bf302c8f086e02b830aba50780e62f41f7d0f2c3ef5b3d99ca1e24a2dbd1967ebfa4f2909fe2232df8ac726e299e1c60da646059f1dd11e321c412a5a97223b2075eca18618e29a1cbb56495ebd1f980ad60cfbaad36c72f0ef77cb6353af9294c53bb17465682129ba35a90c01428e088ddb4baa112e384c281b43a52de4a4ec9681b33cb325e6d299eb29f4150311a5fa9a4242501083883b2df2adbf1a4a076e81a58f6375f96c0009a1c862c41df4ccae922af849993a54b1067da42e970e245f2397b1910235b327ec729f98155d2a2ffca320fe14a54b66a104a3c95939b53e4199a121da7befb1d6497498e825ea2223bf86bb0d36a8b821edb17ee71afe7fbf8c9b67417f5f5012926bf32443939a05231e0a66b61fe62cbebf013b1099258740202781d82366d6f1bab4caefa45103e4109bd94048d1d580c64cea644ae226132a5d25695fb9b33b56cafad1d888b603896731c0c0177b6d09d2de7d963b86beec9d8bcddd4a8e21d553634fac67a12a2a013996f3020c5a82500bf49313fad0e4e5791a047495f7216ebdba88487d9638e7dbadc1ff825f0874610cedc6c9a83983724c08cf59ddc7732960017767f177d115a57c54a4321eadf4ae23b34b65ab46b9d6802a26c0d2fcc64921afe32dfa5ba11a78469a8973b7fe40e04b286ad4e1bb47d48c0ba91117212b72a372d185fc20988d01b839688bf7248bfcaa3fd88edf07e7ef5ba4343775308f22835c77d9c1f8d519940508a9dc1e343ed54036cba6ce92978175d2699a295f1444a746b9df84a8f4707dbd96d9add44b9122d70f3824736e72f1d219febbd49dd32266465541e8073f042d7d39928a9d5061e41d58c4cea2081d24ceb895bd40f9070454fc40f784c12b294d5f479edca85d908e875a0af1e25d4595b95aabfad53ac8ca8e543f8d9ead6e560fb296ae74f892b25eb86dbde86704209f0f274c824a3fd6eefe21397b700b3974e8ecf4f2a56e7c9c347cb92c6522b8e763417a9cff647b2b28794e2f6951fc6812c1b737f5f101474cad0b37e1e809761818dc116f25602b3c759b90a0f880d6073624a19e552af7e069fba4eb1772ccadcc65f1c57645aec9df8eebb5cc5391fd5f8f5346365266f45160d74396b6a116c06f5054af09c241f73d05deda0174d5389ddcd5621e617fdf9890c1e2b11d84e98241e060f957fa0c69f21eea16cd06d7433d8aab8e2ce67fb480860d883be158e590636815f0197bd44a4c679ee555f1aaf9018c8d889c4f9a8e4c5d11a7a62e46482e8becde936fea3a87c5169401e45949602d533f7056b904a557018337701d222648dc52e77eea19b9a2ac20ec1e5f57c12249e7a6737b511f0743dadf55955100eb7f1b2547ad4e5fd778d05efe17c488df7551571d0e9e31025b64cdcf3a8fe8669323c3a4bf6737e8109ae591fd08185b4c7191da39712a3a09764fe0232e5430b99330d8ee6213c60fb9f232d62c4768a290f143e91d7b8d0ffd6d98f7003b3b3a48bcfc28d967fba213f26e91f51147d6ef8c3821c5bb69e3490ed4ad2b5df8c4936036f7b30542f455dd4f1d0ba049bab39d5cd3165391b464901c453022747736079f92f49e2953efe17f756b86287f078e197f643ebbdf30525a5f75fe784840465b1978000000000000000056e1560400000000808dc5426b2c5b0b09028e384ea7837d1fc0219bf6ff88e189e3c861be6e4773da640f20cf5ba5dc82ad6d9ff68f0c50d6f26e0fc09d08c99ae9ca4db2ee485d5985e31d0d894f294be71f51dee120b12895df1b52adf30cdb8e2a7e57dabc5700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e4e069db8c06cc4357e568abbbc3eeb33d40e3d712cd75847352d1e5b72a0557f659b28b0e92329d106066f00dcefda0f74badccf9c97184283d138367de0ca730825aa81ea25a490ed115773ade1e0a884e10b603f33ecd5ba6dede4e2c8ed42a7ba83db1df38d7189717a2770b5b1abb8a5659b1bb79ff845c65290921d236020a5c306a136571f9321a2e47d8910e7f38a3b3db145a1deb4022a58460a505f9032f0576eedc29b6e12c019a2e36a52abade66ba0d1616af19cf5ce77d3479f64e0b01438cb4a8736fa6cb379ba4a6f6f7e6780e41f5d415666fd2be287b1b2e7c723cc59dba503f75f8a74db44f2d6fbfe1d01c68982b5d7fd7dfd7ce9c71dab2e10310efb2ef39330b556547f7a343577f62503c6fb8005e90b5bb9eb797f1b9c5f50210b86460d1a75df17f9440426e4248c616b8e421c4abb8782d36fbe1159670a603145726280d53169da1e1f3b8ab4f0051a158e8ac96659bef06ee5dc9cfea1e48020269af1c82af7101ede363a006ac6ba79399acb53de2e0b23292b4459cf87758021baa24b854349d28bfad6236b1c0fe95858d9b959a5d4f5e60941320bbb90f8d1cbdc1266d3e6a559ebfd53eaa83f458dbf65501720b967f8feae8ed37c2f93ffc537ae73cea9364d69c0dc242677587b780943814093408ea1c4c16cb62da301e5ee2003f7a6da90fc4931548b13cb8aa6e5b9ce8e80c083ef222621a3072c510ef9dc654ed5edcf9ea749ea49de4afed78e0f8e38ee66108d4a07f7a179eefd46ba6cb29f9880176bdeb61a9b1de018591083a7df588c9526d1f293a8d84ac49f21b14247d896593f22f26cc54cc179be22ebd9c7a97e6cb9f597495e4b1d1b884938bc88b7f42c20497c1ca4d5d874fc892526cb3d80562c21f64cc98ca708a3d3f0bc0b8b87aafef5e63c864c9dd57a281ec72495231894f58f2cfe072adb96b9ba62b74ac8ef171b4d0902eae72f3263cdd87cb46455f7e5ff36aea68ec7a7e7aa3347e3eedee1623c5e844e09ccd24ba13249f368ad03dcb428e7764b307f7872dcb0413c22773c89854bd9d4b7f6c8abd3eba2ff589fa6abfc332028399363eca271145389b24511de6f0c6d19483d895ba0563e1aa82fc5559245ef5382269798d075e4fccd1ed74f833446ea68436ef7f661ccf7f2e9ec703e747d88ba27d5065b8f121e7acfc13610a85d8aa8d8b4a512315faf4aceff6d6e9203c0a04006065aa02dcf4fe65cba71966357c324fe34bdd7ccc610b7c01f0b7b7ef5e9288eb9b3ece7890360d414c5b8c7487ef88cdc15f9cc5aa849ff5ed77100a532e589739462a1ed7f664849ab37b7511cae02ab8358178fd1909f3d0356e71a44f5bab6496bb4114592981e6af8b1db0a7b5acef82d1e3c9860e5a59d3088d04c114eadabdc24dd6725655f4e238608918b1c8c80c1c1f7a43244f422e182b082fce65e16490f193a2d0e7de948549a0624ec6b53134af310306f6c8b527c4ac00709d193cf2db25cfcf8e2f1ef3db0ee0168ab0d0eb36744ce4ce983d786558a851af1df1b097c222926ff44bad7863f66d27ff256f4ed83ac4fa8e35c75e4bb5c11e3b4fd226c12f13d4cfbd75e2bf93bfaaa7613987f413a4bf57d75f6a9a4f86b31d47727c923e666ecbc54b8280772b7e3574e68720bb448b3e2e4cfa1efe13c7bd1dc70fe50b61d766f248e8372b2e71ebdc9f2d40d7ba7638de6ad21eaa65738786df9ad9594a164555211e855deaab32c46bf410666a5b428c961f20795a2bf1f4c54003087e00b160c829225e77b86220aec181ff473ddccb7ec27bf9c7f23ac4067c0989d60839530ecf98d1b537c0905f3d59937b1769d0704edd95cd6730e4bf493b5f8ba2991a9ff8741f35c12180f29b154ccb0d33dd179b983b1dd5b62160cc20612c4fb44efb28670f38a9bed575ef1de345fd0aa44bc06e0e27b3f031b81109cf10914a3c82858d25423b64e0c1b747930739710eed585eab82895bb3e03bc594213eb93564d7aa9588459feae2814982f164f831bc90a2ee841517e35a29d4afdac3cf1501bd71935d8568f73b03e8d3bb087cf062979ef5fc617af127a1861f43c34a807b9f205ebbb195b025de45b6a52442463a335ac390890322ca404a0b206c409f971415848a17339f9256b6b0c427824f5454c035f7b6215d7056e49d981685dfa90c56f06b16be60f5f2e047f16eb59035c377d38a0e2e94f6adc4f81703b80f6c48fc27bda8f2e1de4a14d1d7ea5e96a170f679594af6b091380db9b9f91ae83abb8fcf42d299d67ad2902bed85605bc709e2afc1db148448e408b7d2c57a0d099374c96f46687dd0d7d0fd327905d6998821cd211d343d3abc552368b131273aa518f07c6710e5fe24439984ef83bdb68300a986f67c38fec0788a6791dc99245e0d0e", "5363536551", 2, -1065451667, 0, "2357f4dac781b0bae377fec55c0da6006408b2c01729379a78a99a897b3ffe1f"], + ["030000807082c40304a654d0adb99c89d6c1e5fd32fa537b90197da5fc1a63087d14f3377e86957c1b01000000085253515252636a6affffffffd8e7999563e52edc03b7e94ad70eff8b0e0b7f7b92a5c064f8826bf4f33ebb0302000000016340877710c8924915f8406af50ccfff1b04803604a911139f227a2d7fec2dbe0fed4ec9280000000003515153ffffffffc2457875a58e152ba6a88af4bcb8f0a32d3acba846996f9d26507bc2192fd3560300000000383a72f004f5ebf00300000000066aac53ac00008b1be3030000000009ac525353ac536aac53932fdd040000000008ac000065635200658c8dc300000000000800516a52005363654cb2a5ad000000000308aac700000000000000000000000000eeea17b04039300a6f64da4c64576097e579cb81f8f702ac6a23b18b07ab986f73770c0d98d49e57321076d0e91e51153430567a334bc4adbf61cc131a6082b0a8bf0f8c0fbd5b3cb25e994addf52208611b73e4201dd2621b182f5726d0614a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bcb4c214d9789a3afb38c2d4223f0f8cab48226de5c3664c0941e98468ff090a220148c7b6b0ecca8a7d8c49055f9dbf9b4def46f280e4292b54bac98fd0d98a773b7c575e212fccaa59717538a900b7132ac7a3d5e0b110445330cb911beec4f59ab68948ffe9633d3d9d780d8143145b055245d029b739afd63b92f1419e37031ed113788e56f7fd65020ef5cd7931fb6a049b57bb6ff9525f8b3352ded22cea0317eb5af1402b9a378f32bda18c3cfc8b26970ec8c7147c75f8970cf3cb0086370b04e9938725233f96eb13b451310855b23a35226e5756f350136f52b6d072b206601f4a0592496b2cbe0df28f64c2701024140751061a6be0d8df0acfc5d7f903032bea8b9a969cb81d1fba7dbf7d364aa3c45f9b0161a02698c551c075dbd634a2030d7304945dcbb8e2b8dd3224a5b194a3fddf64f49fa755e996536ef03eab1f81032a706cb955616e3769efda4d7e8f2eb2b99de2a35f2dc0f459974a01df75b93002113549785d5cb967f5d7429b026e1e5a1939a9bea304b59b2b04d55d16c2472d0318aee5ca9d0dfe2498623e7a123247cb55ae8ffcd154cbde5cd232f793c51d79214f9e61dd12fd9cec9bf0c9336ec7ee1a7708cb6f0115a6a1e99fadd471d5aaa9f12de37f183483b6ea2527a440e8665d2587a33b2058f500baf503ecd30fac3f6e72ed3dd79e46a7965158f7ad7b6932564c4ab5258b5e15958791f977cd1ae17e2799a2bd3015b69ed726eb41d0986dfd314c6cdf4a1ea13a0ffc0b615bd444ced947337a23a2e6bc922fdcacb6f4ea1b77bac10863ef22654aec52bac4ce7d95b7ca7d438f4b8b0164bbdb558a148df2045d72c7eb39e4cf43ef63a3d68cce9a403ce608559145d0cb1c958f0b94193d22573fb8d78ce5b7b347ba0ac3bf0c5d1de872952ba7fc71284b5b5204c6e2627390040a8693212acce6734ec19dbb7e10ad1e7598bfaf6c6b100324808d766f029123595aa39c440483b475755127244ef26a406ff1abcdbcb44de6e70a918c4f6b3f282772f9c9465cb6fcedae348efd5d5eb9962f7b2c70b1ce805a2539c8121a96afd27fc7b42f352bba899ac0520c37ef83bb05c679b94209d1ae6f059df6c2197d6e23e3d29d5f0e1e70126d71c4b108a75a8d21551c5ef9e8d1982bcfab04e69c849c11ffbf4453ce37476a35cc505d3c8dc668d43fbce894320e37ac344b9d9acc8feed48edc68d35b3cc080d7d4b26b083cbdff8adde8518b2073e37f86f49f9c2a39e3ee28e85cf2444a329d786328e1b06f14c2c8505734fd289b9063f8562633538a2f17c2a394566a62a9ec63fb762a60725398929d6b43bb71421357c7703653b04613dbfd6d28c9312bfae08dbe770b9cfb710452f2a89f4d91cfc44453dfcd13829cced57bc675918d262a8594a9493b9d6fed2011b27aa1bd8d5e3727c65675c2a22f03da935041884afbd44133f97b6eb62c5644c0be0b783d6a388e620ed4b1472e7dd23282e952688c7f1b1ba6d51786fa8bd64fdcea9860594b12af980bf45d2a2a07fde61c4b2261bd01ea37583309d391abea258130bd921b26af8002947434bc80d5b6e7f3d287eafc81794a29eb7678e79134b2f70fc4bcff5370d8197ac03f05dec11f00908691cf0e8ca4d08f5a269c82190c3d30ac1c663c3c68fd813458f72aebd2ec9d94ffb33834f8321e0602e0b74496cd5d0da878493b1c46a9eac0f9ed01315f7c0cafb84367e91c5582fffc587cf53b2e12445e96c2d130175c94bf498ecb332f2275575a59ace6e38663570f651b2e05c495e33e73a1a19cbc473bd7a77487a02d293c7c06fb0fbaf1c616a494d6663fd6b21055a1811bc8a9b15957aec06ec71ed22b928b702bc443a6109cc1179a7b2cd4a001e2dad9ffdf8bbb86db02c02cc90bd047aeea86b07ad13154d67e2da329385491c8f8ebac17fcd31409bbc5607a2bc6689d78c4c2fbf91ddeb78b610daeda275be8ba0509b712a0fa67d8f033b4a1257046891aa00aca510c4ae7a7a0629f945af6e09c171f1066a6a92da9ac885176a67be31254402694485afa5c1646ae0e2f4a69fd8c724a7b0182e26a68cbcb7a87320e5b05624dca2318143f7147b77cde708a03b0aaafd1eba2e42f871d001d9bef7f84c6ed993086779eb1908f55d7db0421e3dbd7f5fcb4bc12e418edb3c06d611fd9bc689c4d1cb4684924e5448fe6e0fd0d8d329abffa8794e1a0a18a1455e88e71b3e6a51c8c59a1d9ce2142d6086d8851068a4731ed051347601c813b267bf918d77273cfb75e7500000000000000009ca04b00000000008c82c46c8f2e598fd0b9f77fcc768cfaf4b38de5166a15523780d77836efd8da3cbb1f27e963b34bd9cfb591234365ab2f71219cafbd834954f76948263664e1fade6cb4a9d85d7e6cf51241a7ba2e186d12e818daaa074e3c048b1dc8a0ca3f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046d7ad9bd70a6d80af9e18136c26f654c16ee5c4b394515ee8e135e31c069990b5a8fbef2d4f39559d2e0954e136a8d12cc41aa1a8ba1f650524e55c4ad3431d1133ae86ab7f189a6330398b3c6217bd29900708620d21d9942f10992572264737e6e0f655c69805d11a3cafd20c62c8cf02e78f43e45cedf9c2bcae3698a2920312ef1244e88f383776831b04d261ccc6aaef92a36d98e54a4541bf653b47eab60216d7e99c9beeb1cd97322bc491fc7d070acde0970558360100a0adce8d75c3b80b00f6355639dffafdc4b45b82143b909d2a4393e0bd5704b9f6bdcf7581a691441cba54a1135965c65e5b90572e39093acdc2967a4527dbbb6d44c136745b4be103036acb29eda6dba25b67a782538bfc9f1b4a47dcc839e93339d5aa70a7b9917a032403c0cb97cb9bcc9d112e7e6c2fc63c23045eb5b950b051520f65c0e3cbf8a50305268cca886fb8fd46b6347df9e00c686efc7a6a3dcbe3adc7b7748e61f32f6e0213df7f071a22083c080356b7d060c666d1633d065129646a7e05c5038e992dde021d58baa447833a5a8247d7bff3d6e9666c87fcff38cf5528c9e60f1704fdfb670f1b5dcb7fc6399bb71892b697a21f3bc5d5f43e57f220ef5c88b1f3a4a6b04288affd4c5bb838f51611e1b4921c75368529b6e259d29e20b25fbbd3502ed9af1a05b48da9ec55a6fbcc8b06f143d1fa720c9f7f5fb91b30a2224911c1b4c1b3dc5ee436671fc1fa6966eeede5d4bb10d5003e890d23cbe3fea8c2694daa82859e9dc8a8fb313ecf225944f8815fa746c632ae3c09e015fa45197e1caf016cde2514699093d34c4799221ba2dd2107cdb987761a9b482ef947384cca0e4afcc0fb78d4133b25db6c1110fe99b897ac2493aa60fe3afcee3229ed95b98a11244d292124f098540a55423f08b18a746afcfd1a2cbfa6221b8a632eafb5c11a808138947839ffb706e51385ad9e0b331fe072c14b65c838a0768c28176528ddee808da273c73b7e23caaaef27200c79a89253ae67837fda943c26e908695c87d51d648ab8702174789da7888991ee4048c168eb65516c5c2f2dfc6820f8c2801dc719755f171b9e9c85f933f4e3a0ddaa9d365871e883eb6e04a1f1f5a96ce902a3b00df671dbe6e6eb909549a71111dce16b07504653940bcf654557e5c8ddf84a28edba724def22044e24967dc4e380902d244cf59f774756754af072818b4299fc376259e0cff5caabde86b40660ed83540088d06357251c82a29fa9db7d2569159ed3805bf7e1755a8743bf0c2c5f93c519d6d88c854937cceb6abee57ce421adddac7ad88e253dc144425df709d5a551d88d8907edd406642ff1ddbb76d4086f0d3f2fbf696b52fdc087f6d8f6f3df971eece88fc0f5edbce5fef6c11545d42c148e7f7e1b685471df473fc2e10f0f943eb5927d52401a085ac264d5420b6c7130c81d98cd66fcbf02a0a526e29c2e98033044371ab8ad95919d43db18b37f0a9ed9b1a9ff7568630e4870f9007335cfc4d2b2c2222c7bffcf330c25b2c1633dc15a7acda507b3138e736ec601bf2fdf5d21eb5c19a069dda2b8269917b3ceb9db608b13577e3de887fd6e3d532e954f8132e2ba9a8041b47dfa2920f2ee2c7f26c487bde2439b6a95e75b717dc16e765c2c83137fc116f9418b67fb73c6c93d5a1b14501f0716aa09652f6b4552a7abd9dce05cb4793faaed5b458f3a2efbc586c149a04727ba09ba89538aa96f844e97f10393734a90063820c8fe10cd418f636958ddceaa0d81ff20c653bb99afd3ff195dae42923a437fde03c8b07297c58b1224df9e3f8c9b3a14ff7edaa729c30506bd878a6f8717690e9cdec85531735940555227a581e96b943a47ece80bd95010cd060877a2826cce33427eeea5665f6fb864e235a2eb6480f96da7989b3aff3ae085a4ce00892461d1d87fd2cf372f44bf7d98d2774d955a1c232fcc759da642325c77070736b52fcae21e890fd7f873384fe7c124a11621e37021511a9d38a75f497480f43f60ce0c4fd913715ebf48cb45a7d7836b02dde6598783d849a509a2b4fca4efd74b623c7c4307b72d2c1d0b95cd0b4b87e7b37c39a732fcefd17ab55f403924b999139d50867f688f60f44740e816a3d3e589ee9dbe8b68259915bf3eb3425b4ae515cdcf2246f4842d71c6c1da72b16daeaeeda55a1408ef1eedbea01d273ea443978819548ed603dc0a873e2b3f70d55ce93224856adf808a57ba616b70a13ee2a40327b7a9e0282e2d08a5ec9ca16b52136a64d1897509802b8585010000000000000000000000008a175c37c94f29a2beb6d0b4a04662479d9addc46376a706442d23eb664eefbce516b827d049c8b98be520ad2d299ee2196e90cc1af43c68ee0be115ce93eed55b7bbb6f25358bfae6fb326c66c3bb1d1cabde3a4f8d98e0ca5f90f4e5c941a4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c7099d607fbf03ff1f89df4601075261cff7ba44a5f67ad8fa7247a4d060347dd7e50593990602446a9df2e2ff1d938347921d21bb22c0d3ceb8fe734921ef1a647d4e095724e3898dd46e64ff1a225756eeff0108a81b0cd5d56bcc260f9df352c74422ef505987d126c9b11bb2a9119a1bc3a2ed8f91298d4f64265bcb4ee03225c3115b9b00f743a4d1d535ffaf710b356a49adf1dd9044ecacbb24e5f02ca031ecd34be3bf52f772df4097c66e29c0413a08bd3e1a128343c7bb77c7335ca9a0a026413c8630428b1a9a1f7cd29d9a1c41754d8685aa779982423b858d87bb038315cfedbd1868ed9b50e4f32a2db497867cac9347711fe23ecd52c317ba11b70032117cde3ba7beebec198a4fb08767e544a11f82c1c551a4978e85989e0e1b64303291a505a83f6ab5200f6d905ca1fca84d2ce3965e9e6a536e83dcabf66a0cfd002030e8dbf9a31ac0e4cd07adfb61340b3427671024af485d7611253f8acfc6ea2020c1c669b088e69cc60ac160c993c4d67e2f43a28a2a0cdb6b220f59070f2397e031dc1dab28a7cef373b89583af8592503200194328f0fa1e95ae40a5ec9575599ccf8ef457b99deede97af06a4200280304e10fc166af707f3761509f4f768008073a5eaddd65cf4980c278f2702aae71a016f62f1af7b16a207af731e3aa596e8cce4d79ec3aa430c8d1d03cd81e846225fb9013f52d92d91b3d8cdc6f43e063421756081b5b9136deb7061f1ea3ad021606ab8b07aac36ee9eb7f3e9388ce2464accd281e341dc30d6cab229c1dceb580a8b8075cb29c70dde73b28d59259f919160abf8f7c2d0fe01352c1addda3ce8c5e99959ab9186cca178c7b861f36174d09f70362282000c42d21e6842af58211511a21d88404044d66659534f638b9f34e00ddbc978c543bb08ef5e614654e259983f527c3a66d0972a70d5e2ba5665d93aff3e50e0d401f8b5bfbbcfe174136a6ab7659e528703c2ce0cd0ac0ba5be23e566afce3a82306a66ae222d63131e4da1d25ee60cc736af05cdd13ee65de3f70f8b6be0cce9865903474e3b04c554d1e743852662024b884b1833b04e7b2ec3ed00aa0207f7cd1cb0bdb43cf48d9ada0f4946c06b26b022227254ee71d78d975926353cc5412af6323b6734ce467d478dccd0bf66e2a6846c000b4456a6c5c8a0987b8d3b6c5cc45bf94690d7f9cc7fae971cef13c658a037a3c1b3b3911677dfe0f75e7acf51879e19a128a0418b66e9a25aafb0f86ca53af26416b689ee3b327c70d75270ee73bb9f916c200d75b4bcedb4240828bd2c54d179b47c618a1ac2e68bf20204de98c7dacb7f46521a9ffec8271519732c9a971ab7e3a340ec7351bcb9a1992235149da5a3bdcc3cbcd1228b758fc9cb5e8d07aec6aff2c70a80069ae8d1c72dbcea7830ddcaf2c9acae62884dc0e5b15e86a5cd61f7f6da93541f02ad291916759312f08e5621c50c9a6c8a6b2b4a7e558649cdbc5fd55df30a8e01065e3a898bff273a35b5cadd7e7093b68708c9aadec5f3a00405487f2012fc18b5f43206209ae73b3e8a3e5dcba44a66aedb5d59f8a3a33f3fca3dbc2d9a52b3476cb08a57939dc90d42447207f4b24cfb10f38053d6efbc7d79553d969439086de5a92ec25a77b1b9577a00c3595493b66cb41a13b736e326e9878a35ab43536ea5ea0ef7b10558d8a8adac05349cc80d8f3aabdf6a24a22e36a85add9f9cc9a061e811e4fc36a86660c26489b02f493519f3e5eecfe2a14af61e5dd32bc8e11996146dd0f1f16c736f858dc9be3d370563ee9fb410b1a316a668fa90ae8ccd81e714ac51ec24bcbfefc5668848417b4068d5440954e9db4e9b669ff8177c55cd3a852a38783a26d3a32d6c73d463a90dafdf76883228cacc8d607cc9c0f6d76d5a503102d8cc0e9f18e7b739b29f69546e3026c189903f29c422d088b4b2ff67d1cf7e26d5d1404c9edca5fe873b47cbd4003427d4c9b1a48f237eaea05045a6e2ae07e8923188778eaf9c433581a6f54b6ddf17b571897104015e4d6a57a8c426f967f8e6b660b78b5918a32cca87afdc1540c02a0586585c999c156015652f9988820fab7ddc991fafa1ddd5168c2924679ca14d2e1c6228eaa2a1a4237861bfba48f7a1dca8263a8d8be99b6e461feae99645c35c764edb50bae6cab3b0e8e3ebc5463019cc5a38dbefa77980ac9b4c85befeadf873a1affde09e4925f9b2b733812965eb0fa67371f4b004f81054cdaef34c0c1d87593060eacf6740576c567bc8fb8e1e73f74df1c53435a0dc9ca7dd2801b75173b00291bb09843c01662fc74bf072acb9130d8c1d09e2c2a6825ab986054b33033d916e07e9285f6791d4fa29fdc32d09fbe8ec289e6b50e0575e77d004b369b72ca7af413a758dca00000bb2996046c105ec835618a01", "65acac6a", 0, 1669342720, 1537743641, "b4168a83146369bef756477c2eae0b92439d6c806d42a22ddd5cf3662fa45c66"], + ["030000807082c40302eb25372156379e371be77226273db64a4190b938576851043c19a57565ccf87503000000095100ac63525353005238ea76429537bf8f57624c6d617f4722f50f8b6fea165c5b5da6c2a9b262fb2495a73013020000000451516565ffffffff04131d5605000000000700516500005300e70f4e030000000004ac52ac521815120000000000025251c1e300020000000005525253005200000000000000000197c5dd0100000000000000000000000086633216a9f50789e820f3dc28a1e0c7a4e3bc61adb066e377637d6b200aa9c308c7b3c253c53a0fbfc5748bb23888344851afc1fa6f16836d5b250f4a171f6b6cf817f2c98aa9cee084e5a243d78a43ff2d607b1d51ee9fe20bf20550b5587a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000caec02e6f72434a0143d864a32321081e89b04e9b20222f939f1e6f9af6c66d73eb692a8d57273df5667ffab8760c2fa63c06b51421696755294eb37171500755e7976eaeeed77b63d4ecaee3808b6060b7a88e121eb53e963004de6bd657e9b7eec9854ebe59f7cc0657d66aa37de89f77d5e0ce10c527b12556e145281fecf031175bce46c0cd4dfcb608e5b42a0d4f15bcd1fe72b6ea81d66059f7573020f93032cee46c874a2145f1caec943ef2547937e91b5054fec240eadb8683384421e970a027f08293a41f51dafcb63d5476014230fce1b262920a7971d0c245b95f84a2ba788d233bf39e1e3771892357c99ccc46339b5119679618ec75746b1f4b28036030daf707fb213d7c1b7731ee0b9debf85d1593ce8ddf397af32a2473e30aa23be0329183b7625faf64b248894926957ceca557d9a4c043c8ef6c3f38d74d30863fb020de94c140788be7dee28621b840a5fc0c1c381113a26054bd9f6a31651e37a6402234a8ead250a98afd6c9a4616b6f11b0eb4710b82e2bda84829601c59915a2180213978cb14a2261388c821dbc7161bfdadfe23a1cb4908addd6e499c67b28934385281edae0797fcc239fce1c65190851a14dc449c1e77321192a02065616bb842e75dc37ec52caa135e2ff7d9682dacbb31171cd574f9d4d4c08f346bdc90d0a01399b1be90584f112d045e1c02e16ee7a2f215911d258bafb0bf7a56e3b82872e1b88022008276ca1d889fe212c6888260ed79254807335b0a00215318f9cc3e92efc94e4d2a135e00a30ed2708a3ed396e29bc2ab7019b46e07587264955194f1ae122888d72d4a662c9e26fe0cdea950b67ad8eb2b7617bd59f782c8be257bd7c307b13d7865a3cf389fccfca0c89a882b08a41b9235d17e78b88a7d34c90046f6e632e478801b53dbcc7338488519c585f390346abf70f3dbaa7e2dabae78765dd2082876140ee8aaacab6aa9e7a2d5a819d5c9b8b38de8abef759f7a0ba2e474c66a6f88c88fe4297c4a86199c006c03ce54b48c502418d923775b513c76ff623d620f8c6092ff6c4faa58421ecb4e138a170d1479933447a2ef0de68f6a39c092c0d7cee1297c16c40f0a4203a54bba947ae03a07921bf046d28ac6737587c9587c85c2696fbbaf55dbe10a6cc8c810b0fcaf823f09ed7ac2e56a73f146cb142b4e63ef631bff9511236391cdda86d319d40648b8fb3fefb47d8162ab3d43409b0e6aeb410f0440c55796bac22c718a13654ec96d108068c57c90a6b0afc8652fa92ebd033be8659466f438cce6230de276f712d8db8897f442de7078e473691b6e13fdc03a1717734306dbd7e99eff895b4eeda35cb4fbdb12feee0837414b269de632dfe5cea5480cfd0da3200f1b168923d9b4eafd9e72aba7695393a90d8f866d47d54d06f1bf19f2be563b9a51a400bfd9d3eebf637d199b8b178460512b759262c68c6a3da51bba1b3626758755fb2242b9d46a1640e2d4fe46466abbb55e828cd7a048531470d1c34fd896211a5b25248d19e1afe4f4b16209e1670003fd90084a6dcb0d5bb77e9f4df12b3f2cb0e7c4f1ebe1e3b685bd7a499941ae7f9e043a804c00d60ec7e50997ae6af455ffdbab88392edc6942d17869db2ddcd11caab485e7eb222d3b380146c5c9d5ac7ae2aa868b80b5294e0c11c7bd71f9b55afc6f8f407944070382ec443755e03e30cec609aadac3eb8188155b1688449c8f914351c93485ac01ae701e43074d079c85734e8b7baa373a294f15ffed3e2570dbca4520140f4082a9a70f8a59885ecd2a26fa4fa3b653e7f4b68b426522d7bdc6ef997e2a5d949a6e93800f6c0c2dff6a30cd8a3629fe29cae21fb1ea1ae8d861edf2965790b885789edb436d9bde71b4fc7b31c92af0e7c2ace798a7654dd9cdb65dc9e975981f3851fed963c5841c000d0d696f264816a42931db7636b2efa04dc7185a36f2266da1c034864e33956f4b6a4c01f000e9edf0c43779cf59ff49b1acd80d3cdd6420219f0550717e414dbee7f15bd872fd44355289d4ed02787aae41637a75f7ef1b251873897fed896d8c2237214ef6f100cfbf310f282e40c88fdc923c6f5c7dfa7a8c2d53ee4f2247e6efc04af7dc5e3ba9347f711435981cb751a51e078e4e44af2034ab238bb78a78fc6825625db7e5e5f34051b30c4b746ea2ba785bca88bb5ee4d73f340d5727c7a7622b8ccb6c3bac35561ff0fc4df0aecbf4f1440cf6f69d44f79942e4013cf88f4d10a9f582dc63877e26fb51886e064e1b17ac59c4b2db03725cd2986d1371fb3436651e1236389055f0c945c1921ea6d97e0f80426beb6387a335a04bc06c717a9b7783097a73a81fdc1c41379ac58e16709b181837be489fdd51bff805f563b061113b536c915da6e43adf2c38c4a7f9b143b7d1808abc77f0f", "", 0, 1941882496, 1537743641, "32b852ec003b13114fd8d887d99acf4bd19026d4b40a271dea954868a7dd9603"], + ["ae1afa1e031c551124baad9b3aca6006b012bee832a5a9ae31a69216a50923892c493b2fcd0200000004516a6353b5617648bf07b030ebc12469941a295c30ace440c009de64b3af215b8247b6230c60b021020000000952535200acacac65654847a8e34c784e9cacf78e9a06a1a05e644fa8050840c64c3805acb9eb7a5175561bb361010000000453656363ffffffff03c1104a020000000001526823d60100000000035353525cd70e05000000000552635152510000000000", "53ac5365636a6351", 2, -960467024, 0, "4d223970fce91663cb4ae2623fcf124a8baf7801650b064d5f950cb52d73ab0a"], + ["030000807082c4030100e8f01e71f907d724563e0327cbdda35d2b579951479935dd0198d91808b9df030000000600536a516a6affffffff04d39782030000000005516aac6aac51c68305000000000153fa1408010000000009510051005251ac005379172b0400000000055265acac53ee0664c6090400560186ad4a00000000000000000000000000ec59f0da4d27a2488b65eb279f7524c63bbac10b38bc898b41f0c1354f88c47020d9b42581782ffa600f6b62b53dbe9cf3fcf6f484b3a02cf571e29edaad93a9b965c04c3fe1d88823db0f4b59fe0791777108faa0db1574ee1e870d6692e7550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000071da5b145f247700567a39dc7a1ece1ec03cbceca5c5369af8e04aa9431e83d7a825412b201f199398155f0c5ca3be275f85a9754be6d524ba2b06eca70137713cdad26b50660453c06ec3742067e6549f885e6524a888c4cc11fb5f75bb1faccc14b4e7e8efc02e07b8625fef06ff71abd32d191b46e9ba78c49f4ceea47e4003072fa8fa47695f819cb2b9991e5c726c187e9bfffcea49515096687f4015e77602064523e9b8c626680edcf1caa3947eebe819c813c37a98aacd18f091c201db7b0a05b581f7b6a600e4b17db083625b4193ad53d2a28f103e87d4bbe48133b13055e2e8dd77f50a867dd0ed5376875be19abee322122e23b8ebacefdd9b9da6f24603048f723727786f2b7c74961734226039594e1c06d9797c65fcceceb2634f1e5002224488fca9b5b84356ea813393f807bacf8f31f96cef8cd304dac25640cd973b021c580b5c0f8c3248fcf25adfce0aeb458e87888d368a6bfe2c76d63dd03ffa4503047bab0d5ac502afde8304429117feb734a1ff4132dfef6e740a99d2655cdebd030c12aa88e91b004521412c0ab1299e19ae887f076404283446e151300d9250b3350d9f90dfe7bfdc53cb3e2351109a81f8e5a819399ff5cf6a96c662c9ad0a72acf8b2451b604fd6b4d69e80853465f2c4f5f19742f389de3fe0201aa6ed2615d92e523e620363a8b27c8f183f4ad7d37d690b9995f25dcb644ab4c86f44eed760067631e3182f0c53af4669b9e21966222ea61fe831602dc756952a2fbd0eaa6ecdecbd5c56855192dc94e30543bd29bbeb4d71e6b3b7d9d980840c4d1b0f1eea8d48507083cf1721aba0f018f4f272713f184d99c784ab7f3bc4a28f211d6e4499a15c026bf85e1ead40773690d82c64825e55955155b66330b128dd50fc55cddc167c034467d3f9bced9839947a0acc21f842460e679692f1cd1cfe8e01dc54a8afb42398a6d1aac5f0a4159adc1bf62210b3269e016996d9c69263e8e42f7f02868fd35c0065fda9d9460579444f82ec4e80c2caba97d89bef833731df5d8548e1550e3d7d46b9eb536d0d3dc5bf6b92c4dc9fe6249145cf2d24d33e03b19044fa8e36b1e7d069b2d070d75e0499a1b2c4871a3faf6573c164f65b1b330791ee85caca6811cc72e76c8535f9bc1c1f875d0976c336a6edab29357b518bfab9795bbc08e9085d0fc449784478b1a6580d9e90136cccf2ef9fb4441d21d3fa153b5cd5840537be1885a89da70e0184e5502e260746b18eec18bf6a7eda127ec6574235d2cdee4417348d6d1491c74c6f3ea12fc1b67f94669c13c6675977d605ba517e2e06dd35d98855b6e5de69bd739f976e89a623cedafd907b74ab7e2e703e55420e9877d3baa4f3659bce8be5722f87bcd739742d0648f93cf33668aeb904bca9666a8557a82e9f52b41e9e8e30f50f78f6c83e805f57cf608ba8df15407274e2a86690f94fdbde8b77c1ec3c355ce8301cd6de01603d63f97faaf08dcf5fe96256a151dde7388b98c0fae7b1aa95603ebe99642e342f0bf46b790c72b55104050b28942d5e7c7325b8d7d8bd8d7e6a02f54693a1403190b7fe32d45c4dd581906a2b079028ee5816b085795d7b025afb01fb7fe5d7bdc1730ed2dfc50c2450168c5d64c9b736e1b528a70de5b61e36c64b70e58fb9cbd492e8ea9971383cbbd802533652c3580b30426be48ab48d5c3af2ca26d99e41fd7c35a157e0a0c362ea3878e0b8135dbcb25d700b3e565c7874f468480820ee76bf462034603a328f235a6754476d91b111c10fc86134900c004ef39f98564c78da95c7c0e29886270b47157b54cc50c7252f8494a053f34856ebb36f7c4ab08d9c776479018af7f80402f6cf46601378f78a3890697e0ca483666b946e77027589c26dab8615094032cacb81af37d18dffa80583f9e086f6418f8611fb015ec1a258634cb18b61e2433d34372ac544ff4f94166d11c74cb63bb8a7cbc705dc84384f3d4601046b2615b9d7ea2a9bf677b19e1c29714da43ca2a346e4a540d5a6baa346331827023c271a361f32d16fd33ba3d939ca0b1f094f29a8ff9f964a783609c4a3a896f468056301d59bb96f2ccf5c85ece583325b0b0f4c61199f17035cd9d49cfbc7de6d0f99f7ca2a6042273f6efe4598ac02c54dbcff2774a28bc667dd8fe2c99a4b4f89c82f75c5b4d57fa57fbcfbb9527815c9ae6edc4d6012c18e3d7588154cef07b360bbb580bf5f0079b26751f8193c337371fda1f72dd5237cce26ce7e304d0e3d2b069087ea249cdfdf6d7be37d4713d949ce34ea5c2b3c58bc5b8d94f10b59f6f9cd4dfb90698f69f6357d255d32f5b9f6ceb0bc5c7d197d142b4bd791a995a5476c95010765cc568f2f76f5d1faebbed505806feedac5287fe1a15ede6fb3fa0994bc51fe861a37e7c30f1dce0d", "6a52ac005251ac6a", 0, -1414741100, 1537743641, "401d7b4510dee881cf64e30ad1b3b97596219a47fcb8d5661640b48ac9085cb3"], + ["030000807082c403048fb0a0d50fe743c6b0c86440b46e800a78f0239d8aa994ce81f56362f0b9c7870200000005ac635200001038bcb950c59af8c4eddf65d759cb51a5162f5f1cd87086bfdbe1f92ba43e6f16a272d40000000006515151525163f2918acf9ff12f1343eda9e400cb497744b798e880224aea9ee35ee56228cbaab651add90300000003535251ffffffff9408ab791c595c71e59b92d101212c6feece7994994c52385dfecadb193e23da0000000008006a515251ac65ac36bf745c04aa6dc200000000000963655265535353656afa5ee20500000000045352acaca770c304000000000463000065ba96550500000000000ccd69440000000000", "52516565", 2, 788718622, 0, "2d264618a19322b4cd3d63ba87e167bcbd9946bc9b65a89310feb28ed2a6068f"], + ["4486ae0202c2aa9bb718ee7e6012e8011d302ddf11614ce4199713af11571baa79073f1189000000000163ffffffffcfe41ffe7e200395490686744be1796e0091049b70506c11bc64bf6756cd5c3d0100000003535152336622f604fa07d20400000000085253ac006a51006a78280702000000000452005300ee622d0400000000030052516cee9a0000000000066a53535251acf2070ddd027de13d00000000000000000000000000cd4408e0650d71f126adc564c0dc9e4458bd8292d5cbd329850e242cf0aae89e704919eae5ace0c66643902004268d7e63c45074d6b78062073a094fcbead90996ed5ad2a120404dc5233dd667706112d46a40184130043d276a607c492f92910000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096d0a170a43d58146f400da3beae66f36d8306907fdd4a1872b33282bc46703cfb578e2a9718d108d89e3f17ffc7143a4a3f182568bccc78e1303d39f3194e0d6988f4b9a4978067a38ecc27d8bbe4536a29e6acadbdc5c87fcb28675b94bbf771fea6104b2598db449e7201d967da46956cd70d2cc99cae342a451cf249c2c702139649c1513bf98e61ce8f5295051f2acd9325f295bcdfcda7b39802ca6d5d74030460f202030dc1e36eaf5ac8530a1942bd0255ff4352ceac9d739e79d8b3766b0b06c63a010f6c25a693d64db7012db501923161d299e0661bc660adcd0d3ee6bb38c23a388d27043bcd71dd000a9afa35bce94b0c04cb373dce27ff91dde511c603096a2465ab88dccabf658872ea5845324b521af414ab6dc23d3f17b73ddc3c60030a6499f316fd3f6c7efec848a040ff4457acdcb4cd5ffdec5bea025972c6697d021a916f4db63c9e74e77540bddf7e2ccf674e8b9f93ea02e18ea334b6752fb1b0030634f38bf9ea1270265c0a84d6e7f4972aa291758f5fbda7af9c0b1a5a769d91020a51ad63c5975aa6df3fc81e7b416d7a32800c6e90ba84b50737110e1e24601dbe90f970592ab04dc45a54cee163e43baa8762b55f1b582f69b83099df7235d4ec72cc03302922e3f1dee72b48ca90bd4b0957eb66b3823cdb6d0c2ce5b9b968bd4059af5ce996f9926bf5023726fed1df69771606387ed709b121826892bce6dc9452a3abce03a750b9ed82af9b4976d404674bc6c07f3efb76e45f4249274cb7347fb54598f2b2ee7273d44d83563cb793423e7efeead66346d7fa707d14967f7b17402e9f724cb971fc245ea693cf6f734ff54b2089e862056dcf604faedef3365ed80a6c2fe25fe7167207769a196fc257f164924de248f102e8d4cdf736c852ce3c36a2b5a893e2d5fc767937a7bc042251f7747bacd7f858b59eb40078da171030a7a5f530e51b62e523bd2b5cb400aec852fc6bab682b3c3868d280c896ea3cca41a385fb780f4d2183bfc0bf71211684f7257870593bdd41c74962e0c27bde2e32c4ef31ec7b21fe412e95783a6edd821bc98671cd291ca422374de2115c667847d73635a8fa81bca006583eb6099aca0e15d8c07e36cdd417ef61ddfda40ef603375698d68a7a357bd7d598ce01b935b921221a70b6f9a04dd2f4205eae8ad3d007727734cdb5a3ee13a34bc65a817a5a30b8f4f3c56dc4fd13ee9c2b11ea427d073d61212932af4fc835b1c7921d818b9db81817c48887469c1967f67f4e00b6b18e5b2a7e930ba267ae581c1e9279116d57e1e5dff70bdcadc866c02884bb2d20913c712e5a9f7bdc4c6c6bbda0e42b405bac3a0907b2fe0e20fc838f909e4b455bda94c7b3914e5c385571877a6b763904d9acd21a9f6252756880ef935c621a0e82b2511a100ffca0a81353afb2fb3fef1222e0acd2ca39c2538081bd8cdeef3fc33a4fc0f6191a36338e3b59f6aee68cf807e85a9e2518166585dff16a139b8c2ae802ae5d23ef9cdaa043dded1e21d71be8924ae2bf7d23b79d08ee173d8622d763e91ec8fe87b4072e967cf109d8874f18965d1d4ba95e61717be08584184c930533bd51ca330c7cd75f8cffa533282ad1476bb0b309a92c073141cc07e3017919a628f3d14e6b2bbc1904b3119bd34e1d4cd792c64a03454ac8aa70927ad50d365c5c8c07c04072c22d851de2920b899acc79151d2a7fef596e67e40c2158bf1ce8d07e396dd035016403b4e67d66fe8f3ba09f017013ea87982fd1d8740489a170067fda3bf3c440adca8dfdc3dc9d8e4f8c2f2f728d28a822048f5bbee9b57a796ccba08c2cee6822e3c81987c22d244f7c3a203c27aace35c4f03ca360f846098ad3cf6789086c756386b01d538380623589338e1abeff65a2fbe28b40a38852a9733a324418da0ffa187ab29543510f3ccfc61c38d3adbbdc8fd7f54cf34bfb68ddaf7ab33e9a0e607893cc91bd3fd2918d813d109964ffbeac431948a01e01c4d95e428d31ad743b1ce5b4015a463531d48d07ff27e1c53d66a2b5faafeb76d6016a428323445f3a38ea8a982767cdddfa0ce10e78e2dbe7285f7aa68b987df6af5bec715d7aee09a3e40f69c1af6975d0f56cdf54e6aea4eecffa81303edf2dc647a0e151c1ea6389500a226de939cf2423231fe5b3d9c7cb7a2560a914ecbf59141cd27607d386e1511eea18d961b8aeed2bc0a26420a4195717fe08992d4088909ad4fd61c2a144eed135619bb0b72eb9f961b25a5813683eb5cc9f623f8fa56af93586b465b089b903000000000000000000000000d0a96c83bd314b054ecaf3a736c9ce90ba020d56a8e40d5a379df4b5e83e55c78f66d7b1b111bc5d3aaaa0c7d5bf606111f4fb4b5166e8ced6bfb76b3017484d2d43f475b78118bce9ddbf9d6badddbea784582bc97669a1657b17ff7d46173900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000384e1ced3ff7e0bb6999e7fdb13b87a10566c64529adc544527897ec7f1bb9ea547ac711a3f5aa88f36f6157c7522d5fe87dfd5ce8b37528968df5555defdeab7907d6f2e777b4ddff338e1318ed2f8dfad6cc226c9b0bd30125679acee4fe220f9d76b1fabe41b5127b7ccc7e8e27ba31bb1f86c712cdbddffa96d5b1cd886b020b3b3a6ba328cbedce2c410f4dc098761b94be778dca1b199a31bd9a0b082c55022fb185bb40af607987c549c55e2451a5d84961623bd75a9172bcffb1838eb6e90a04db9be35d394c57b47bb9346ea505fe47c91bb88618b08b382001eb6c9a7078198408f605287cfcdf5ac44e6b59bcf8fd4a2dcb3829d6a41d44a52b93e844e30309adf7927b792bfc57954bfb2aac5dd10d1f480906e3ef8b4478ef183722e53402274ddb3ee05247041ff575ecd504da0d92fe78befbd1f2fcdcf0a6b5bf5643ba0209735e33557b6bbfa56b6cc817e1bd2be95a9d9167c8081fbbbedfe2140a4745030de8383804df7839de9d684ed826f4748944c83d036cd251f3ebec9475d3a796022ecb9abeb00107bfd9cd29014481ba46c92aa6da9c965d498c6e66044f92f0e782f40ceb01d792979fd613b021b20128db91861ef70479f1cfcbd931db8b64027830f80d91331e8ba626673245da2d9e0edcf881d6363dd301a5873a2fe8a0d089d3693b9d6b4727bda994740e4886a1968911f836bbd70b1fd35f0b021cf93a70ef5d0799f6bbc81dd727342d5663400b4f46c8449ee219782cd188e3654c40e6d48477c04acd103ae44c9a4c3cbba9f74f0aac3caf6b43df31d375272f5a491a0fd7cbe285be79f4fb5395ff48fa34823fba5a94ef91b9bff0e82b6e7a8b8a660a66efb3abe31ba1f3b6d17118dffb7875b5fbb8eeeb1d8b05e16403a926228e5f58f4eb9af0b0cee8fb0896379c9f33886fae1bc7307bceaf2a455d8996d362b79847bcdf8c1ee69c13d950af4800c308dd94a6043dfbc8f3abddb2a8bf098a9c95ba1e911974a92b2fe3378fa61dfa372f79e766f5cfb702d533e30e0b934cf56919bda8a2811423aa92b521faa461e5f79ce1b14c0939be4bee00ccba9541635e7f3a76c781f8398ceb1787683cb7f8ecc568741551088bf387c24bf85c334733e7e13f270413bd31b6c0549a28c68524ff95ed0266c5141dee4e84c68a6913e0e8e3cb5fb0d82e52c8663d8ac48f2271ff7479609c37909b4619bbad92c5cddc8154120a4cb06d20a1f7bc0a6c37487daeb2b7ef611731e624fbdc21d3a51e72d77704ff33e34f6a62662765e2a64818d22583f03c28d71766c67f86592a66f0483841a12a599283f03b9f61eca93dc2e5cd00fcf5f542a7a8f4175dfdea59302bdb5c932bab2a37f58ba83fdc1ae5bbb7f169b601266d9ae1b28b7386a1bcf20f66fe1005077e7c4d24223d58f96f815445ead71ca060385640477a308a82a4b10473e45dcdcd32a9136a89b30d7c2b68f6e3d96e3de89845f83751a86a1bf656ccd6423a32e9e7a4e7efa0415f53bb27e20773c73862ad7dd85465ad5d316ab31e4f4c8c8b8721b49a0d453fa4ddda052bb890e19595f5d90e4e03257dfefae6a58b82da6260e04557ee43afa33f1c61e3e8a321f89a18f6283545febb97045d0cb458ae53de3284c62176dde98ca70da2675e5356548f9b5056f85941d2b84669b6c1daf9a70368c3ec489cf508b73f4ac9e4f4b18c20971c457a3ef29acba497fe9dcb6e0821cfe97ee5e0366c8ca5f35658f63f64dddcf2fddcd87d6e937bb8ccbb86eb5da1fe008f1da833a44e351fa738eee98f5651df91c6e380a69a594a562e311df08f1205746a211613401761d4f7f7589c4011470eb375d627478e6f6155596312bc7732bec39ed0a4c2ae14986c5132d03fad72d10d82ab8cc4fe2cbd05515ba022dcbfa3aaafdd4cc3cabd8b4143cdadfd17bde5cd9b1dee4cf4b5463e4515bf3ad381d79957aa33fea676d81c95610bc7b7c00bf8583134abd7b2a7cf9a7f7c7b8bd67d03a044748660ea5a311179e312caad16e9b9d728230264104c746b1c678f7462805d05b822dcb5d4c570ad40780f5ef881193e1dec35b317b024fdea63f5138d0cd23199c3e55b34766b93e88efe74c863b71b9e99c08791004c11b7b4663c83a9e68bac30193cd8ca5b9811f352a5adf90c7e0ca0abc6c2ef0b7bc1b3c72c91511f96f4de6bf88ea8554b0fe9a3f5d391082f2f03a255b8fe5b09ab65e1ab5dfee5aa4cdd2b589ddfe78602d29ac0003cc89c783e7973809b45b62fbc944d4cea6f497cb6a6610873d1ab6d04f2c57e5809048c2306e9fd50476d3e8cdccc9caf241f31322095fe5a6ec9fe8f82166a6fc16a247ff2268a46edfa645dfe8a8a56884f51e543154140b97c001f71eb535eb26664b299034fed674e5b43855e12ab183c0c", "00", 0, -1030878089, 1537743641, "d92b577d4892998278f6238074d1d5b7c3035d57a807989030a58177e5cdd5b2"], + ["030000807082c40304ab0e946c16e60d9d1606baface304a0e2acbccbd4f2317b44a5c69f36fd3663c02000000086a006a656a6a0065ffffffffe8e9af6d15f55b139c7555d73e825265a8dc6927ca8b8be860932a9a78a86be20100000003535363ffffffff680c193a21222d311b7a53062fc4bbf68ba0e4eaaa4ef6ec657f00a57b0aa4c801000000055153ac006a168ad28dbad9eda80af3d10f413b38b0c31224d91984d27224cf8667f51dc3bc46232ade0300000008526363536a656552763e95260399203e0400000000016a7332e4020000000009636a5300536a6a53ac548d760300000000035365acdc5fa1150000000000", "006a53ac5153", 3, -1298507762, 0, "c850a3ee052bf581d1538b0c2c06fb2c9b8131898ea39ab414e3fda6d0bfbf83"], + ["030000807082c4030251062b5596c1b0e335db0943ad134ae0cbc453090a97fb1dbb69d5e9bf91528d0200000001521abb996674f4b7c8ff11acd1c299a0664c517452f16fe330d911bc4af7cc7cd4d5150f2903000000026565ffffffff03aa7e98020000000000d9bca5020000000001519ae0a0000000000001ac1c81f1a4820028280105eafe02000000000000000000000000a6e357d25555b71305581da40cfcb8030c1ceb2bf34162fe3fe9cd2764af76697cfbdc45093ddd5d1a404e5ea07d6987d5ebe6a33ff385bec3b92d900eb3fe12858f8c6d40a4c2375d3b40f414b1927dd3dbff6360b3c55ddfcd1c02f84736b20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072568f3261ee5f61365bd5e213b3ce08016d257439f4e5ed7176f7fad9e87afeae25048cf37a8585ba23051ea6c5d804d606a4666f8bbf819208bc92287d23ea3316b70fb48cd33401e4644730f11f7eb2e185e4485f68ad88d06f4cc549724533f9d673f1cece75435c0d37c6c8e665931044fe1b75b7aa87b9e0d3bf9375af022374b691fe9e0ecb9abb72e6a4cf181663eed73a121094c0402835a8ba4472f7032f11403cb3f389f3bc07229d3e7ac8848c0521b5785e723abbf8a0904f04cd3b0a035300ba2b11ad686b7ded3bbc6d5344610a5351836e392561b7b57dc9c6bfbb75d06fcd9fadbc4685ad16530a7f81be1ca2435bd5dfd22102ce5760c3b14d56022bab6538af3fc1d3652658969f6d2c8040f4823fa0c348b1c4c388dbf5ac64d30227ea2ec0202462359a8a6ea7d295cb6723ca31bb1c8423a67bd816e79673801803086c43458a146dd1c10c8a1c891f7f079a1a29238776f7fbd76c8cdcc0ef4fff0324d5dc77691569043c97f8e90766c75234107f8eb804103a56f5d06e007a0248022e26bd8ffc79fd7303450d4fabf6cb94020e8bcf19a28fcccf143c716a2dc07d3042a778c16b1ab65b6b6ef85c9962afe780e34160ac0b04ab75d589b85796608817924b773e7d5599a492d3009f455d227fb1a45466333cafec65844122484dbf076efed55251a6530c8730214c6ea8901915beeeaa6b0b0d3d8438061f83ae75938911b376ebbffd64b5d9bff8eca41155e06d1c760d11244b90124007036249d1671d173077d6122282243800120b35e44c8f5b3928784d1d5791db522eda1303f6af557f7cc67dc3a6b66e11b8cde567aa003e68824ae931e8a2152969190b8f5e0f1ea22c05592f01bde0b85081c6c6058528787ab4b2547b5762ee5ade098b621e8aaa2ef93a964db0a4b9b7a1697dbcc16d862ccc677ecd32ffe0a4928afcd28933f8ee05792807464360f8a598f74de9a10a5304e66ada161d84dc40ddce6b64a9fb0abf99803ae81ef921c959cf6c6772b7df43f70461866e319ac0e1984b6b63e870f6abcbf06283db8e8bc336333da0238f46a6e88c6171d4a1831cae3eb7165f2173b3efab9abb433c462fdd00d7b8123e59a3f2ce146302f70e831ed2cad8e7a3e1088f7bc9044c100cc7355b50de8ed864929d006a1d3f93adb1c864df2a64037b7a008cf699df58cce9f1b02e1c7af81a131ac06f8ef6a34dea1fbea195de866c9595d1a836cafbeeb3ea7d972885413a7a574be1d4d8d963f9e2dbd6602057d2006336f06e9b1938dd9d14613e4d7924b25042edebfd10fcf80e69f17775efe493f0c521b37e892056331720b68c8456b3408ec88d87dccceac36dd4ce587f8f8c3c53f9d08fa53d8d282fa3df8b9e34ff1530cc9388dad388266398ddc7182a89d4c9b32ab60656327cc858d77ba3638bdd3daa8ee45da1dbcd49d7a310ac0b5864078e55be6bdfaa2f97741943fa6e498c97b76ede26f44250b140d42be84141408e8d5216573e94845d8e392dd74e3334bcdbad37b382fe9d226059bb92e9b9e07bee63e12edfb98df5f4635c5bfd555ba8aec0ebc206a630132dccd4d4423fedecff5822a4325b0618715e64dbdf52debf8db16799f619c0e642c4e48342a8cc69c04e1b7fcf1e2885924565e3295d05ff960fc87a9441e9d4da798c033ef8d8c45990dbd02d3381888469854a92c6d5c0a65b42fd87f5dd73701747c69cbee0995d06b658de8d24e82d89e167b659bb02086aeab2f958578e6543f3dfe5e17cadf790197b107212c8211b1df50983690320f26df7abc9f3775fd219dedfa6158920b2449c105735d464e927b567204768ed425a343a056f5ea9ba0102f6b1be87e9fb70d048b615e0b9c95bf33d368f23827c745da1496975c0b10fb3751292190be26937ddf69c20244630ebf0f6bb8c69640e3c1c7510dfe2aa96412b088f4e27fe50a45a25a4981cd5823ad91c48d7dcec101a0c015cb418e71713fd56b71de2943e2a4f6adf1e3928c706a375f4d280260b7e9adeb33ef3bc42dd612e4270f6d60f39dabc9aa5a5c18fa9645d36a4cee38461500cec2429cc49541f693a08a02acd8f884150bf8b16866a4d778c0c718a9c17a46f737219bb5be9e701cfa0632a6b736137fa94c477e4e1d54978e0aab9eb297b7a00acb49b2d9e0d6de2106f586375a92036c34220afca73262a828832a36c0941aad61fc19419f74b35fc1c4dffc72f7e67e09bd814e181783964d6de7518e9306f85f8c02020f2057a99e2b90ac63637e0f9346c1a8857699a13b06114d5b71a237b1a318af9a2c86dbc5bfcde31d4dfcbcd047a1975f44e69bf8d3a24707a9fe6b97b6440cb028b736512d54d321cfa41c97228819cfa331b47c55fe3581d5aa5f0e1756ec132cbb7c46c90d3da717e00", "ac535363", 1, 565047391, 0, "67e38ebcfbaa1b7ba4556e70d34487a447509684d0b006c48840e8fb6d821694"], + ["7e0f85120256c03171a958d26fd10c1ef6eba00f8405ad021d3301a9c5f80d7ada67e5b4f3020000000663ac520065ac7bd70cc98f3f5c6c3271518f55f58801a07ec47e07f4658555f60118032efaa4f0965b9b0200000009635365515265ac0052ffffffff049404e20200000000086aac52516563ac533be374030000000008516353ac516352acd29543000000000001514618720100000000036565000000000001f63f780200000000000000000000000031c554268f9b901d4bd3ba0d87f71140c6f1cc7747e2132ddc2003f2fc9c21749a44706c4fff01b3cd2e19b34329a75fb2e534e1633b2f046779222b82865d62cc590e256e1140756a40ddca9dbf59893c0aadd06d2140002c1d0eb9c9b2287c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000344b13378ec19c3a117c62957a4e081893f46174021d47b9b43f1e6cae8fd166c7b2dd0b5a07feb45a50e15a9ec53ecc41e15377e2d2b26a8e194d75a64283e950d6cc1aadd1ad309347de43d779bdb3e5ab661949a62d85563da02d29c1650e64910bfc78eca186026013494c2387dee3e8e927fd6d2ba9cb28c0f7f7824bd6030b9100f3cbc314597f704e89dd41eb8e8be3c24e29c360bc528ac88cd33b49780314d98fdd3e11cc4bce2fb820193ce135420995dac0dbc73f7863b477b75737290a002c0b3a32cc75e5cc9a9ba729fb04038eddd6231733d019687d9966432d8010cc76fbe9ed76d759a3a7d1f428c5d4f8808840dc66173178a0a88f582e14e176030c60a7e3cbce315dbaf149cb0cc9af9105ab37463c9bb47732779bf84a19e598021ba4347ee48d5bdead9c13c7efbc7bbe26872177e06a663860008150a1711dec03285f81b6dceed77cde85964c50d0ea6ade25d45cadcdf798804653f3cb8e855e032f18dff51827e031a3383999f4fbbf3915bab14c54feea1c5b41b8bcd7075dac0212017c8a414a27e186bd278480a39de5a444698b820e65a3fe091acf2cefc10661f5b8c7a2712fba2c4a6ead395fe5df6d7121615ec29a4b4ff2b5f7a0e7476083efbcbc708a30fc556c6581646840aa43c88bffacf6f88fce5df4faa0f078c4f220da1ea224a62ddb12fc6924428e9d6bd9368697f773c1b7d8462ea2a93f542759c35840a68f32eae8d40fd8f3eee6413701fc98a37454d04e4aec2498aeaee92b83b7f52462303b598d2378de46e5a0988e90f0f8c57891d22fdaccbbcda7a8fdf8af03c9f5236c23824ff3d526ae288bfe26ff87a48f855f4b10e3dc0c4729996e5dab181df40bd92d3ced3d4f8f1db6eb6f36f0a1b8e3b526bb9b3b70140190a996e13cf5fa33d05cb62e4de623317c046678668ffdb44b089e694dc621f151ede1c1ce5af999d3409be5eb842d677df7402acb61144ea525e39674405a64a1c6374723bb98c799f3b02f599bbf491574d56781f253396f7a9f0ac71f6ec6f8c29d7b86e14b5f2c144c6a7f6a7284454c77a3db4a4fd509bd056878f77cc85b6f3f587ee66dc70b7d4934dbc052e31968125719293ebeac527a8185a3782f7568c7209a8df2a86ebc17125f5ead4b3fb5d5ec5020edbf306a715c10d3f4ec9473f427d9663ee06752b22f3627b8ed37e37396e050033a6fb38275ed3c2d145eca826c85f32a13c8a42caaffc75d4936a89694408ab689e00eb62aade46ebff144f0764ed48fe245acd5800448fb8e4dadae79fe5cd57d40e49d3d94aafd807de7dfd5b34edbaf6e2ea90dd345f3b715948f3f5567ff9e817f2bb755261ff77ae17103cd877122c13530555d805c138fd83d5b8e7825b22ba32c1868f4565e7ac365ea601b8fcdee5a26ee13cf1d2368b236c5745fe902d9a690970d1b3e206d050cfa36a48bdb35e64b1840a0ceec773e1ff17cdd6ecbad7063ed521a64f06a9d31d37e402d7ca5698cab8e29c921fe19928600aceaafd952230abc50a4f8aee449feeb049e4df33d9e4af48bee075dad742919f58f1c2eaa915afaedb3cd08873b3e1cb2ff7dad188ce0310e05d6bbf62f3201bf09f3779fb2a6bf0592e8ee522ac1e63f4bd4f3d85937093c2b1acdeabcae072c9caf05952efc8f5475d6e710af8d2a34a1048a134bbefefe8570646899038ff367882e1b0b20e2923d96edb4609ca668aef4fdf340ea36a271ccefc3587f73d1c446bd0d845f2887c3b955815f44e75fff4c42ab6b806a6e06eba97bdff20a03cfa3f13c5a884f229cb0ce25635c49e50570acecfb799152b4c64a6300616ed60dfffc2426d447856b32c9831aac4de4008b8972791d965056f2fb630700a609337d8c836c8e5a78b7dca5f4eb6cd2a876ca05bd9273210d686fac951af2be3008246d0a256ebca16724eb1084e39564b9dcdffed09bf68a656d4044df2d8ba33a20206a3b982ad9d2eaeb7bd9e9909c0c2dc14536713459d39375230e4059bc05c622d8ae7375d191e45c880e5ad718c3fd6f0aeee01ab85055441838220b5625e05d486d743a0cf74f308bd8ccf18481d337890af6450ea8034964a262874da53b700d803fca77d55b5ee6e18948d177bd287a14ff50c2fb7b18c74bda42e8c35e303a57c8d48cf2de1e0d89abdbd1178fd8ab3482adecf8dcdc21b1b9cd9bf399ed188496c93191549058b9559aaa4b246cef1708940cfc1a74a16eddb201a32f40a06df9aca96c6cc341ad37c0679abfdab80e174ad2a8bcafa9c190db83749e2249f45749acaa33fb761f854367a083c81b2976b8286a85c1ab20037e8cd8522189943081ceca969ba4527661182ec6ef99970cf66d9eaed9795df8eb9f31a96788a935135f90535e1911b05588b6f365546863d52b984b02", "656aac00", 1, -1989271607, 1537743641, "349793a10e9dffe9e1990afd58cb46597ad7a4439ad15aad6567079ced7dae1e"], + ["d8941c710291b221b15db4680c765c85d736659095e7c57fc510f947a54c0cf4a1af660f900300000003510053ef10a8d782f829f6d41f3ed331497414a27004011a10d4d7c1094f9d8df3bccb1e948659000000000100ffffffff01370b7a0300000000026a6a000000000100000000000000006b960f00000000008b5215337d05034f0df07cafa723bb1b299afafb0e1301f06888ba7fe3960b5bdcf7c01d0ee2299dffe8e8b541f572dc736dd04ccb2e68d559ea0933f0a05aa2330a1d43ef1721afaba1e02ee20e48c93bd63f0ca860db9c88c618b8a927acea00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0f7bba3257c4dd784ecc6900b15c5d520dea301bf0d25b96b463635c62cf3d1e9d9fc60ca583a86146699797250e0e317e79e8a27d2e8520ae678a658e5985d7d571c16d3634d96c72e1e0473e8810029bff06cca88fd3cf2aa8b13373da02a292c1f253f858f0ad9a2d14bdad5ed6f816a201a0420f64a6e0d12aba73c0d830203d5ba6b950774dbfbc8534d03d45c938b680ae72f7912e392b8d0c712c2a65a021d846f56ee52fb8952582b61db52396beb12dc43c0c482b30ebeb74ff3c5854b0b084d685d6a3b38774c29c485eeedcbd90141ed1cbb0545ed4847b5666e2e22848cd4de0955559eca8b55a37a9b8d4f21c85bad6eb5e4bbe7151a37d6840ee680021d2c56d1418f8f64cee0650748312a1b3a13c002bf4cda007d23491da06c393d021235d110d714ad77e1e366e05b384dfe7b2a6df40be15c506b42e961aa92416d0328ed78791699c038c85ba34ff8d9f7425840b17d2d93bc808989c0621294b6d5022525676cca2aca06b16046d5e4af924ced37acfcc939d2f215f1ba27897a4b470323046c65124e42e9af269cd01095428dc51fea992ae3aefb17d6653f7cfb1a401ab64db05bae6fd5fa6d1089aa42278d421b991ab694fae2ed6dc4e744e10208e32dcd6a97631c2e450a932954055cac593f6c3feeef9c024bd806c209afa1513e45411de796e9b074621c077749fc9b992f88b4169b7c397ea213b5acea8c108b410c133e23890e06182dd3c843953ae583b86fd2600622dccf362fbbfc475d213bb45a7400d0a0ecd8360a78a5d555886432d3ae2c5d0a56e118865bbc651fa53e356f1460737fef0381ec487e6c40da1c88e62cae96fd15efabba14c9f40eafc96f47247474c8bf32313c3b2148ef06d8ebaf812bcc99380028297cc03469e68f51adf76c8321cd1dca4637e194acf60484b99a14781065e4702adb2e30f1f9fdeb69b8677455340c5d6f9b72f7fac24ead16a40918bf86eee425cec59b2eb62101ce713e23a725a40c54d36e72de5f1bc9603fde1f220d79ac304e2dca5fbacca0e798d8c889678c0eba0b1cf63344bd4a714eb3436b5656bd277e024b10288aecedcab50c697789ff16d5d80cc0284ce0b58e88570fed7352c8ef320c5d0a92de3f596d349ce3850ab154ac1a76b7fd68bde76af6a551ed6002c54209d3e298edb4230531327aad79b836f617e44a6afbccfefde982159d761c2767eb695c0d0a759adafcc49f8c9e157543fe62949e1cfe34305e365e26d4757c2cb2de40896b9b296c9cc2480bd39df2ee5fc25fe0e314fb9733661ecbbbaea5b6a060c64d5897428f24e0dd3f1348bfb8138029099dd69ae1a8f9e469ce052c2dd8ac5402cc1be7c9843a03de69446690c13c676f0bbe6bfb9511627d5f3067700e7b5ad4ca4001f5db6810a0d3afe2070bb23909e80c6f85b3442eb7cfbe9c527529ae40338d2b35afd60be09979baf3c65d2eedccdf2f57fda93e719f336d081d1b2b1f73f0e9140f54eba06f1f9006889d0f3a200e632c57103f0b9265e0b879c2f453db52541b11cb275d6413a40b6d484a58e376c91742b564bae29914d023dc5aa103b5907b3d5c233c52867970c235357e4f36a7f58f87fd6848776d858a86641f37f9ecc7c517a00d461877a2b340bc193ee21deba0a197cdf8cd2ec2fd82d9a5d6a1077cbfe8970eb1cc7a4758e99795780de263f628c548e6f1cccff4dea8437f496f7a96397453d1ab827f546212598c185a95c94a535ef005b5066c77eaabb00ab18bd15c4d4e6ca1e4020ac48c8d7325672cef3b8cc2fb41855ea0a113acc13b7f76f51d1685dd0d1a40e6182c7a0232059fc948df935576e8b1088e7fac495b9bd0509c5f932aa19ee789b709f091699da889664642f3c9ab037e318ea4ee9fa2c68a9943be5f71788dfb0217ce2e91caefe1035267a25eec5adf7c42da3dc2f57918de0b9e5d29d583f353a8bc5a98533fb150131d52b1be1df1d619d0eda2479494da0ce94002fb0a3b449e66de301fa79897af21acb25a74b48f0d8c00f1ac8db065ac94601f8700bee609feb83226b925315f23e88f2050f59dbef9284294963d960c71f47ba2a954dfb3e58b857b0973e001bde59dbea25f213d07613f4dd1118ef49c90d5f9118b8df19af22e972a8fec3b8a66d04cca85b45a7f0dc79ae86e6ba0e8d0ae57fe47cd34a2826d5e9a76003defd8c9b1413ab04712cc13a5eca896091114432191a03c0d75a01ab7725d147ecd5959b2b3b493d83f36c290e7cea1a3de5842efebe7d6e57cdd45a49355274c61adad3ec8bed5c5e2d9d51147d6f0e6689ef5688bf211a151cf665bb0c000c6f74c20e46c9a2f18ed6d4161a767c3bbc4414cc08049c10a1696aac60f4101210ac759044cdb591b4db86cc6c2dc1bcb4a687768bf9030f70b", "53", 0, -1258541668, 1537743641, "702dba54e0da781d52e643083584632e67c35d7f46fcc94928394bb51803357b"], + ["030000807082c403033eebf6e47a88e208b2a881293be05aff06dfdb3455e36db3bf37964c0220159e0000000009ac0065ac53536a6a537ba1554984fac5c1bf1909f8adbb6f5a078974bb515b6482698dfc9fbaf506dbcda044ee01000000080051516a65006353a0906aa45056ebb5391d867a474c8941499164af873792053da862ba1eb4cd785b915a39030000000453516a51b3feb1f403d7002600000000000251517609da010000000003516a5202f8f4040000000007655263635353630dad9ce2e714406500", "6365006a65535153", 2, 646854819, 0, "dc8962f29d91d37c4c24eb4e06a7cbdc2ca98ba3f52c7b81ae6eed9efa351f7a"], + ["b7c71605030eb64740c86557d4924ecab1c2439a285aa95e83382014b26fed78cf2a8010cd0300000004656a53acffffffff858e059fb3780d43232112a970b364e4f8c1f35ab651edda6e77c9d99c1bdccb0300000009536a6551ac6552526affffffff6dbe679d363e275e1e8401857c658bc4a452c9cdc17b77a1319dc8abd588d7c101000000046a53526a5b95431901879dbf020000000005635263acac1c27bbbf026a9efe020000000000000000000000008110e62b7364424d2d93f36354c2d7aa533d3db7d225c95a90a65d5e9b0be056294ba840ad6b6b008e5653d9140f1715645da234713bdec1d8012bd718beaefb1433c0080af4904f70ffadd39d6d5fd514fbffd84f8fe00a5bed37d380d4429d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2170d9c9fb6f4e895ca5c596877b9115c761d61a2aa2d46481da9c7c3d01fafc925df3c038dd865fa588da5e62809932a41742f27efb0a7c365495f4ca0dc21b43796fdb87e0a7d08aef38ee6a1ebb50b277d53b810d09d2468b71fd5234f021c71f74c44f604050609caceb2dcd6b67daa902b13fdf006f53b4a778e8b4e7022ff2070631559cf79131789cceb7225b74a44fa711e43d6bf827d93fb359ce7802214f72b54bca203c56e8fc259cf2d844efa2041494a7d6cf0cae5266ff17c1400b08a32b4bd0e89b7be0f1f07b7b5c62acb9c0ac9414877a5062cf663601963d7733c33e3d11ce71f7a125bc630a5cf1db0874c2316b18919a856a672c0d43632c0322167855eee142d29b1f138af242e88cb5a905c377e644990f292452a1634eb80308d6454941aa261d1e0784844e56c29103bb12a5b865043ddf580b96a91a479c030d2b9453bf13740d7782d1e82847fc27a5fc155af46541af4d5e400458d48b10022ccbff77a7ae0505cc69d323d345caf4cac6079a6d824c7b29b8cb08c0b4234f022ed7fd95db37e7b38d7d9eb5415c486d2028fc5f3413333a2695d1590c17f407e1c3afdf21642c14accc20e3af5c50114fc188d9fd165d96957974fd327f8bc7145473c04cadad4e4c914f6f3ee811378c9ec2dd4a12f079be3710c7063a1cfce01ae1ae9f6436e35d0cc694433eeb3da9c70a6586df99d2044eaf0d049edf1d9a1adb65e33d2ed405199e23579b2806c1694c340cd0d0dbcc95590b0b2135cd7b1e7c27f36241a84109d044d6bb25ffdb32eee33e18f25ec87afd821ee5c89e903145f226fd06b58662ceb067e3b839527c22f7d1aa130dea602c99a2661bce7d32de0a19dee5442a7865002fda5956d415542b311ada54d83e11ccec933e8b201482fa1540335639efaf055f9a474cca7388a187ceb88590f2ea9966a05b0ed89985422ff2a5dc13c16a79847a05225351be80b58080eb8a9213a9a1486e8ff41a1d0d8de32f8b57203666cb1885b9ee1563a014ce3ed19c81a1783786e3084a2392d01dea4a3776e6e62d8e188b7ba656790c3bbead34628df866bf3a20b93bbabd44e84662479746c576519ee3c454188de942ecafd29bec40579dc04a54adc9cdaff47d019129e7142b43febab98947b56d2b70e2195de0f1a31bbe469a977a04a878132ab888ba8df4224d67784cfffe166ed0633789848ce24349cb097b1a2cc4f8ea184856a0c108797ae2075641ea123cb438a55e1f951f0a563be09e9d52994ab9fb8d4519b969833294de326e71e211ec68c0f54a0a78e747e05c0019c68983fc9461bd405ec57ecf019f3e3ada1ba9a11a7ee4776c43cb5234c7409f82916c654605e61789727d3000271852cd651e9dbec5dcd940a9a005b7e29d1680025e801eee22cf445fbabf9e460ddbf1574fea2f4d0fa58013e58d79b86ec0bd46acac69a019d2c83d517512f8aff784de857154781d77fba4284682b2e989202f8ee04c11e960254bb9ed8d8ed8fa0d842c5a71902b1a5269fe993ea0d080ab06fb6252995dc4306534d21845dc5eec68afef1c76bf71a5f02f55d197b77ca4f3f90339da24a1d7b0449220c258947cd83e775e1ef226bfcef7cb1e6c9b0b9dd011f051e24bfebc9d7dcd0024279fb06133ff4c6443474a1a3ef38b58cd1695cc27b9774575bd966b1d0131a9b161891ef26b1daacc711e4e9da64e6ff816df23a31ceaf6ba72bc47c6e594e18f026cc467253db366a59dcdfdac369481cc1ddfd48161bfacd6e692a67fdab3d1fabadcdb59aaabf6a601e45ccecaa9f1dbaf43a7a8820236e2521191aea89425a62a87851503a95ddc2416cbaf6e74bc029e0e9ce42cb0fda2e2b6f2590220d53a5cb5dcb2fba0515cea7068f74c4c3a2fe83070413c2a6d9e9dd57ef1b7f8d1bed54fd7e6f54bc8df0cfd67c6ad89c82f08f077564adb112e57ae338d180342faaad768ef68fb24810df1c4ac62ed9eb5b89e31d02de2d9efcec799d19f4be9b043350825feb54fdf6aebb2c6cc0d716455812b1af073e5a82a12509dbe73f83c7ba51beea6c52f2912c96789128fb2a10e26c8ab372725b20ddc37b97e41094a12f26773d93f43a6ca8c6f3b7b758cbd647566827dc269ed9ef7d182416f891ef690e7e11929b4265ca89f699aa445e9f1ec01cad4391c69678de299aa64b23957b7e0f3d9afd4f8996ac43ae92eab243503ec67a10fb23d7d6fa79ce893d0ceed223276277c815bea03c903fb2d1e728298e96654bec55c16e20791b0989f5d0b11fb010000000000000000000000006579a81b836bfde08f98fc5b372904c8acb83a1518b13cdf104f12e3bb64e293a00d65ee7ca267a24e5f57432bef46c4e97015f34c358c2557d66a1d215cbc0a96ff6eaf035a29166aaba399fca554e20f8e60fa760f5ee5cd69526135a3e09c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e828388829bc94e298b2ba17eff55ad4637f98feb721f82dfc270d989eea234cddd965a09422555d06db57c4b611ca641893ae1e3c972b34604c38e937b1abc5d24c914e999efa547764e40963822643674a1a4dbeb739228e1e322364a812a7990027b658bf8bfaa8f4a6d00be7d5157d7e2d8792c4d3be0535c8ad0e9129a10225fc53965d3ce8aa96b9dd6fe3e8207385784808a735da3aa2afb713dcf7ddea032e5926be0298ff6d9caa9217e83bb9a479998954b502dff2399b7e4430f146170a0216b163b05b3dbb01a2573da6cdbfa8adb708d3858ef54fc08cab43c197bb3f7bfd726a3b079c44325b2c17e0fe39aba0711d37fe8b2798026654497e65f19d0203c460e81fdacb31048097e5f2f6cea42d6c01573153c160d88dcdebc42121b2022333fa71ccce0bce6ed64a43b062b066527c84306a2b8ac5743492d666b4175503122af3fa461b05c60e9ee5f2c61aa10e41728e5356527823f7eedd6c81b1b6130315f3663535077ef2640b09f121ba1b15654e3ea25095af97e2773b3d75233545032827cf2a1b4265d80123e06af7a11d6d5c8b86960e5eefcd0e93cfa4ecc053e0dce6f5ada7b1010905ad4af4e633bbc8cc63e8688f73648cd5f4a5d78e1d8865b6fb96ebb13fa55d86dc7a67e9ede4c57a5c1c08c216b8dc3c607725bb70ec6e6e8e9a18eee82df6751d7261ac06957c768978bace10107bc62291a06f172a08f0f26190665e07f10a85c619dfcb532cbd16a2684d003cbfcf38a47b644931e81c64d43e588385d9b6122c8d5890503fd89737ae2ba9a825d72f979f291459ee70332b77b915cf9e54aa34982720b77ecc18f1f55229776bb22a29bddacf87a68420bdfd4fbb392f5e655880d343a5d7f01ef97538b90dd55d81b21d03754522d391f164b70961a138cb6af151e51e9d983946451e49057e40011d3f46178c8e39fe1b3b6d7e9b6302efbf9bf5bd8f3fa5b8903f1b0931f01866d5ca09203094d535ce0868abead7a8349940a3c39c595e45aeb74b3de642e3896669acfdba0516300c7a73ab34ff9e8c1f515c37f2bd6abf5c7db326500bcbecd33a7bde0dc5c0b621b887c8711c2ad2aa5603bd3084e050e00fd0e0c7c2737b20bf0dff8f8e56873f240afe7dea2d58f730322e977bae8861fe45c1f35090d672fe54f40fd07dab7a1cfcef098e30301a36d48221471c39b59777838fc19f787dbe3ed5bf36f90614f8410a67c912159366dc764a0e437fd0725c2f51d2883f1b5c44ca37388d6a536d6fd214850eddd1281370f2c0e74fe7d175cbb2be81dc561f56a1871947f9592c65306568135af4a8462ad97d8450edfa77cb26dae695ac48c92ff9129f35770f59cefade284e9ed5592e6c7a63a99f78ea21d5b31431cceba9f5d9a146bbeb7209a285e885312fbed38aacdf021e6628a60729383bf98881c2289b16db29f6bcee6395401752f0d3c3ab67cdeeb6f6605a0d65bc0816b59e88e055c07f4ed0db79624cf098d059f8e323e6bda8cea66a957b91fe1ab2b05e42648274f12d029a0f9a194efaccefa7cf773ae2929d438273ff974b1cc1268b8149be3d2857feced0054717c093b00f9dbfffbd1082df52ad5f714986842485c22bc296b5b95c9b3d2da0abc11d4ce1e0a8b0da9776939f106f5962a639de41251f295fc64611206be59024a86f30451eb6ff8750ccbd89a50b0bcd68b598399d776d486765f26c2ea29028aa8fad015ea82d76c948f5e6f2d2ff14fce38872be9f5afd3ae979b6bc80e623b1c98e490ed4c7f7cad9190bc1066294f7813afbac607599db9b84e327501903f5f343d56d7d87221d236d29f3e69c59c6dc30af3ab07be294bcc39f4f52d76f7881594e1528f257566816ebbea818edef186c04741c8960c6b8ef80b2932e61597124e9fc7ebb2f87ff44d4d16efa7e0472f445d21bb313d3ef5092f001a3b3bec1b71474486392b13cdd4d3acb366d878ff98e29ccf14b78edd6c149e37b09b8d6ac99a6b71aa8e3416a05997163d3ff9b8c82d75d01ea91844ce0133d6de7cabe09dbdb603e45c08e2fde812ed596c8e0c1a31aa1d2b0c05bae931abbc1b85a992b4651ba96c3cee1ca76d617af9145a6464e73b61e0d54058b177caa06182a38f820bf499f7bf0236c0e599511d2f1e0bd766b8cdc4d9c3573e100b4ee6fce3c930310d5d32f5087367f9e932f33b3a46e5b8d27ab1ae65be7474aeefb10833e0f6b43397c0654af8ad8a00448bb8d7961c13e183b777edf096657beaa104c9d452a83253991d112f6b00a214dbb494ca61b1c558f466fc871b1bd48023acd99a08b9ecfda9ad0321610460b5d19a650ea4810a5a24a7a57f28d1af543ea613bb885c279e71896198235be93fb4b8dd841b9db4aeb1b203691d7b433b3c2b4982cfbb64aab8a120f", "516aac00", 0, 692351863, 1537743641, "2981018e10b6f6daa91215b62436cec1a1929e7b76e0678f14030a76b176f50e"], + ["b3f677080149d4137722672f5efc833991935364c86eebfaa3840c13dceda8840342fdfabb0100000007acacac52526aac3719555503ff9a89030000000006526a00005152315e83040000000007ac636a6500635231464f040000000009ac6a516353516a6552206b2c3102182a1001000000000000000000000000e27820d3c05136c47474b3cf0bd8ca7a48158de0342475204e57f18721271d3ccdccbbfa602eabe125dc4f743a93fe45e964eff8ea3290d0a6dec5cee2589b8f3b2cb0ae355cf84efeeb2905b22ffb17a5a141fb4ad8a8064317f1575c78fc8d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000067b722ad081cbcf1db5e94f364f12be9d2e07f8d7dd880a30132b8bd7d2e249b4b0a9caa8fc764ff0e25603215f6549ade577d71c1d4044b006f1697749c7b80a3d6677b3b1d4de3a7e1412350f84ffcf9b417f9a00520a5d8c8bd3d9a92df55009762ab9145c48c2af7c4b000224d8bee85c8a3c533fc987ebba0840f6da731030f441191556fa0cc61334640e98217a344c0e2841f4f74e921ce083565320157021b9ec2112708cb8c60d6ad78d534459d207e45360f694e7a94fba77ff7f38b900b053e0ebaf8536051716778a69680ed4a44c29c70b983a089ec9789882235964a9c4f53fae3e8214c30e216d41c61ba632f098a3879d32c926b998c0b39ff06d80309c32a76e894e58d8abe410b8a2e0ea599e1c84b9bc300b31e50dcf16665f150021866042c840c8b9739520c880a0d17ba3db3065a475a290b557ce45283f240bb0207c9d383dbb26cdd9bdb0edfbedcaa7a1a4eca2024947f96b9cdb79db45de77e0229468a9370bcfe034b29d1280d8b887e0332d04de8b4653bfb7b9e739fdb100b020141f2dc70f54cb58e037acd19430360b290c298a6d7a10465285f566b80334e1cacda512d673010f5ac843d0b4e5629b6e2d4fa63fe1f2ae78e45fcac2c88372ecdc8b5ee65b8e4886cb88ee4a3994e71dd6ee68bd9aca5bbd3fe32002bb2367ecd3215c4bdd195a0f0c1a14237b7837432898db27705b4dbabca79015731085129d3ca9ae9c2859e12e7c417b8e8c28fe2f4c66f4b20fd58bd6512f096e6869e61943c7c413616dfb3e71f1e12f11849bfc4a6e9dd723740de5383747b2e5708de55c31c75681c092faa2430ba9a9649877ed99bb409de0265f65721a73fc385c9d3274aec66fb4782586f6e5d4f7fc218fd2465cb1626fd49cdeb2cc7ba43a2ed3d4f33b4374103f8d1cdec7d98fe62fd3053c8c10b475b3dfbcc69a880249b0bede853994ee360986f33f1922d5c28df378109e4e0c9d99346429067b13925512991a6902f124c897d77b5dfbc0f22d93376698cc65ba4330a6b1116b695b5ff676c8e26632d60ebe54ed6fab7c743519265bc7961850bb3204e35d6f05524783b9ef545b70d00bd2dd9540bfc69dcfce8e183ab4bab9ce89e36dadd104a08360328b1ccaa91ba65fa8e6bef8e7229510663f556e7f0b7d4e2afdf0b13ccbd19632ee81275fa0a780750bf40f8d41e91788dc3d043bb89af0fa8809b63d8838342e58b4ed9391f2a4356a156207f8151cb017e622b86d955a6e0aa9009c07f4040af3555c34d5d16a73f88c3e18d01564936e95ae924b48fe76b8a592b38ea732b333844ee3a1d13ea4fcb6f4c08ef35e21b339032d9982dac1d3ddc38d4b9357c518a010eecc747dd5a9fa7c16d4fe148fd4a5a9b97c20026ecf9aef42d834879ad6843486b496f2fe743524ed8079aa0327fb480d07524ab249e9fbabb5721920d492632ca7e593bbafc977d710e5f655c76395ade01d675e6c76092341360c617e8ebf8797112c97b0b9b28d1c7b8002073bcdb543319b136f44a59582c9732484327db14a98d42e873e21859c4b712e366250f517a7839cb5048075085fa46b659322a3275c2735b1de78f014da1a4b4fcee150c4a3ea31fa72a2acfb6aaa0c88ec7b7d5a46fde680aa0edd05d9d740f151476a801ab69bbf3f6585268a17317193f71891ac8c92d2fe6db999a0a9855629ebf6d595a0823ae03786d0d1afdf4ceaea8f4005557d0ef499ac448c0298e7f78a62861181257c3d91213871d973bb17a7df08ed00a9d424404d21996ab5d59bbb9eef6324cda9a57c08a490730e77d7a27175abd7a17edde853fded0b4c55b41ba07fb6acd9d19575c45ae9762035511fb259072c28f67e11c38ab2bdf287b344fd3a25c3d84b0a675e2d0247286f7a9b86078ed3df6fbbcc1ad45655dacd61b396e76e2ff6ab5c9872249e5e18ebe83a692978fda9ab6fcf581a8d8f3816ec2ccce061c6419e6bff92439b2e2be0dd020fa1ab1d424d0bd7f60c37b33c82812b0b5c52bfe5a7d3279c6256d9c32d58951c1e0761d0ae579afb721bcb83e53eab750bb2fcf65e0b101d3e6cf8b30672a8bcbfa6b52b0d79dac5376390ac2b238c34091a8637d8da5ef567de26c82a92b0be9efa4b56e326cf3793df6b959cc21831acaa5db629874825c799bc8ca0e09fdef4516fda1f1097c857a8d48bf48852ce1d8c607318e1a2118c17d4b4ee89150a8793a004e67aeef1301d80a6f8b8166dc99a3b85a7e8352d81adbd02a394e1ddeda50d93082785285176d0000000000000000044f7e02000000008aecf55dbada948e3420a24aa018b2353becfba72bdc61fc4feab22a4f3a85c9e28b993311be420f1486f27c36ed71aba19db357c91638529f9a50c94cb09d6944399bbad74c4b083087ee747ba18815efed5a501168470fcd4c65c59a13f55200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f49dfebd14ed1c80e041443b0e8fbe32bb71a5d28b322cac1eec14bff1500a72feae2c5d221aa3a247ae9121ce8565cad81158a4cabcd50ccd91af3f9ac05728af5103a9c34d4192fc2cdf42c8d37e9fc076bc4b52a40aad5460063e970eb41b25d0927e824f410c9193fc544338cf8758ce10a88c7ff9aa09bc10a3f7c04da6021574e8ee9deb24d6c70ef13e2d94ca0e72bf1232a33b9e871b016fedb2b92d7c022063ab094a20e8aa4c37e481c8a5593a6cf909ca9191f42d00f1c69f4c19008e0a0650de2d17feb9e943de7a62e4aab1cfa04edd375e63298b8cef98c2bbee6c7fc3d700e709aad441e28f976bd102088327971eef8b9473daf261ba2a55058444022d4a2ebaf046995512404d9817933ba5191e475f0a5738650f2bdff353175a610312ae64c71675db91ba65d302a288aaf0d54941c449b3f489d882bab8555becb402245fabd468d86dd730ed7de0881277b91d2b90e1751915312f103c7a9fb71d8a0201b720bb4fac5416a83868332b2987f7b9884db411572f0604052f7bfa8f7c05021aff106e35d3d06eee4bee238c8f264261b972550b29f65349a62886a74bbb95959aef3434268f2595045f87dc6fa87aaa09508bfd406058b85bc53809542146d41905b0caa549ec60fe03174323d8dcd3fe89626c1d7c9cbb71d4931a8b2afdd8ed4ffab498bfc1be24e737061be182392f72e28190b2c68086bf815aba48cdf8762fefe8911f695691bc25867068511842cdec70458c8428c0105c30380299c82101d49613d1d257be1e889fb246056f3126536cae031d3c21bd7893a7d9a139d13cb54af7ad8338e316f0aa22de6a1090a02ccb8dccca5d72f813aa04c0a17b386bfa872ea5ab79b32f7ac8b0f6c29172ac6f635a69cede97a599de41d2a1c551c779e89b4c7be044361ff567ac2b23a8ca101bab022c8b0662f588f20c0fe87669e568e83653844a3ea0031d63eded3cc2369a15246ee1f8a41843f57df44aeb350287614cb7f20996c364f61bb19815b5e208314d3bc5a9cf4be345985c68b6a8fe0da931fcb273053b7135d67c6af316f65c59b20ae1ef1e25fc9976f190e455149d09901a28bf9c296753a21232bd7068471e00bd316eff3f0ebcded2d457329a08a1e9f5c3952ecef210c71597ac376da563159d8f94f24ecbf6e943446145d0c01286dc43562f1f11fb61e1f9408f0a7bfd44025561b491aa3216d3436ec7dd08a67dfa2f1dea8226a8385b75254929e615b7758e6d4aface68e4923ad69c0ec65abc1f9ae15d6b6004997eaece2544a33f1e94d475f3156e066ec60ba17a432dcd91c9c4b973c7f69a6b1a16575a876ad1b7cf72f62571a07bfe59d2c86ff8cfe90ee29d964a5dc06ebdc96e4f24e8eed25d93782874ed034e0cf60d74cf729c62a7d2a4d675cac405c040851bc7b09bf1ac2fe457c1bd143e3ed4f66418f6d7f3991a9ed87f5fa82322f8d598441df363d3773cc6bdc1fada98f1032c8f78d16b0774c592dfba42383399bcbfc6c9dffbf88d0db77de28a12aefd04539f54324abbc7e4369390135e74e7bcb789e469c88716118799503f5ed05a141b6278d9f96ec7e1a8b945e1fafb82f2941addca87af738d0c7631b4b85ee8a60ce7c2ee41ec585baaa4c5dfb011a5bbe2cca3af58ee8435348d7bb411352097ba6d81bc3708e98486a68e679a996ae88d98e8872526a8f7720f79acb24e2dde946ebc60d5ddf408c6f6bf7de689d44f20757bb65f5c1d134e29fd20bf621ee7f2ca2de18f69ce59dbaab54a5b1ffd04a74d5c0a11bbe9fc70ae7dc5c4f76e15ec7f6eaa90a31184afab6e9f128c8e6c79c845bec38d489ef70c7398f6b81cdaa07041af2a30fb6a91386ae864381418e0edd9c8911d6b50fc61537bc46e8e9d390fbc7a2a4457aecb295c4874621c2cac7b5d30b97faf559934b73b1ff67e42d892fbe8131cea22e3ea109802003c5f960a0dbdb99e3a9047fb1b33c34f7739702a6decd17bba76d121d30d161d16c597e4024754a7c81fabc94517ab97380773f391df41bc36153d73dbdb0fce46cc73a4ee043400b3113d1236171a3d5a3bf906ea151fa4e6dfbc80b7c37df133ecf935bc567007f3a63210d154af9aad7933902694fd8a0e4ca03bba772e531508dc558841c2aa6a746e032e31120af08fba06c29b40f00bd15df728e93f3685c003aa07815a7fd206df54002e75b7d7396cba30c9bffdc2bc37acaae8a38c4a58d38a1f57bcb0639bb8c329d83dff383e25f255307a3258ff584377c73aecf42f202a995788e875a890ec0f12552bf1e018557c6e1811f191892be3ffb9cb6768b4f6813f15378d0afb43a515a47e282cf5269d5deea9e375fb841502ad9fce78caf3ee216d1cd41888a1232d139483f88cedf67ecbcf7392ce9fb525f219234d0e", "ac0063636a", 0, 1456029997, 1537743641, "e7241475cf238186931b9c801709c79a973d9c0c097b4c5a986399ddf9d60f60"], + ["28a8ca2e040b5db05f0fd9e302a21d2de3420b7fd6fe6637da3997ba597ea6fb7a8b259366030000000765630053535365ffffffff9f805fc942205ad30e578cea21fce527c9230fd40c8aba8f18f9e32d1581c79103000000076a6a635353acac4a5d35d0651e97aa286e64a335c11015fda9f28990c279dc1cb2ca382465ccbc060a8bf00300000001acffffffff5ef4cc2e9fb7ffcfd6e49e1993bae9711841010769f79204ea10dc3b333290930000000004530000acffffffff01096887020000000006ac0053006563a86e01f6023853ed03000000000000000000000000e79a6b167a5e4ad619294fd637669865ca1b83a3f6748a03d42b779a0f667c0e4dae0cbce1124a83a71a0be7e3de84c4f67e9d1616bc8300ec69f0af741b1787b579a2e7af1d8707c0614bdb1bc777d36f24697b2cae45f37837683e497362e70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000048e37c9d2c0fde9bea2a08431557ff80f2fa402f9634bc5301f454e9b692270a6e3ccefc5c1008af6624510caaf89ee7726a2a738af77753615a74679bd0997d74b8ef49cb9dab8c8d42659755f046b80d346007b8ad108b852a61ba178619988ee518a9f504feec0b34ecfc21244baf54d18acd60d01dc109cfd806ca1801dc0213aca75c41a51ec70cd222eb921908337e1c7a12d2eb018c4f97e9ef8cbf3a8b0323b35e74c4ef3dbd949a2ede07a50049c7c1870be2aa93d7e451585fe474ed6f0a006f9d7358c7125afb3310956383a9d0ae81fd459ed2b6bc148b2f34a8ce91008a02d36193682c2a72673ce4694e402666d62f4222ddb50fef3e87380b80e20902109634eba0b1f37cb53537801a9fd1b0bff6ad346d99b277d71ffd5ba78383d202003557bb64d6779b7563ba9a20b97dc1c586a83caca4bfd540d723c92135d8fb032f72a8f96d84b279355ab16149783512289805d6d0a908ce7d74bdb59552c12702097b5e7c4e3cf7bef77a41f43d116d0bd4ba5a6d5436b13ef3b96aeba8faf728020dd924d2c6e102e9d6075d3670b115c3ca6d07f7485cb4b6fec43518751325f03eced6783b99323f5f51b3bd6073eee6a0612b6bf8cbf4aa51704571bc42167d7a00f3c0c3b092c46d4ff256b8079c050a9bf2db1386ec597787eb12199a1264c3f15ce6b41513627cd2895502941bb1b49dbc53af4a86b975fd6c68e726d4cfb8f227b41842ec8c1f3a683229f012171ca65bebf584cf2b8f3b2868391a39467d7ff1d8584e1f86387ac139280db7009e00ada9cc52723c612645dca8def416304d2c34f5231159dd1bc70b3f8ff925ed5e4bb20d38193dcc27a6aaa254c2f525dd4befeeed2d8bf808bce330f98c9ad707b2458e415ebe44b1eef25596683320cfa925c92d3c36b94e55e58868bb46f571f7e9b8a22311b6d2b49d95a64192fe50152739a813717646f45aaa4b0de64cf259e5b2ca699a77f5f8711113e9c2370b6e73d6cf4a245cbd0632ef1d568127e21c5f26dbac24bd842922080ce4e0a277106d0d3ffc6897784df2502cc14a431e6a5390195e0636a7593e26ed676ca4760e1c77c78da401ddaf96b8b06a0f1cac64e813042a2da2480b487e9b620c663e9705743eaac21fb11e616291c7cc3eaedad87dcd5f6dae34bac5aadda87a64e2df5c9c7435b9c3a86f5d32a5d11763460e82dccf5a175ff1dc149f01fc23c6f818c1a6ea902926519ccea43092ed25cd2a972890f6a61547838395677cc92fc5943c3a0a64c2cb4b702791e703ae196dd3f69b6f5acfb5cf162f3827762ce94efd4d495d824e061dc2e9a53cb29076651981b955257a0ae9facad8b34c73847c2f01ec71d1dd3905f36b3d18e3faf6175cc3414c7deb944b1625e42a81f5a9b2b25b9f3a32b6c994932c2f7efc39a8a9c73e61cd9415b13cc32a59192d1c8308f227c3b1809b4ffaaef0675be30d19bd12c101bbc6ab04cb4ad366d20aa8723d0102661628c334203e2dea16830d56f75ed612ef13c24386faceee9b017bf0c22291986aaf80a167dfe6dd602ab9dd7d27a0b48ded34d0c4f287fcb6313ad6fa3bb18cdbc59840960710a102bdfe6e7ab7d454c1d309b7d4bad11733baafdf856bd3c9dd5a41655cfc340576903069feea155d469be41121fca1a5dd084ae6ac07231a157af404d2f01dd8ed52ac086f20bc3fd25d31b6b594461b8e34cc125808b49d760c5be09df18518c100e47591b58072fe8a77c6d97102abd25236948ec051d97363e3c23e6e881cd53feaa5cb6d9cfdf1dea246cc01146555f8ec9a01972ac75d2099511ef97206b900b129b43aed585088ce63d7d2d6c075491b951c3d277432281c53f748e6c25aeea9787fcda69c84ebef7e31efe375962c69ba234ca0bfd5bc6868834555079ae20e97984faf30ce85a5d1381b98bfc40b21366ca1c30434e47b24d5a9c3d832d67c5f9dfe9da4ec5d753ae0dcc38d9645d8d91268a3f07311d12190622a8af9c333781ad6d9e6dc8cb0ea572d6a1ca66216e1d95717cc75a7aaf3e9fd14c3f6fa9282d9f136fa55b2f2bd032e0434497298dc09ba597e6de058cf7db6e80fcbb9f3fafc8543aede73bba9bb48015e30e08093d5570ced182f5fc1c28f64538bdb8298e09f26058a26fac4b62b76979eaaf2cd04e571ac29ba839579ddef0b5baf670c2727092856f45528289d067281cbc4f31b3c578b1bfccc76ebeefcb9f5c0b73b94b78d4b28eb2d58282b5218fcaf75cd5a60c200a722b0cf2fb4c10015d775db06000000000000000074776b030000000092023cb70f6d612c108408a252db34e27b85d77639b31f6da922fcf6b6255fe007b172cf1c5d846d405f47caca385d7070b46c5eb57d629036ac86dff04f69a8b1babf5246640332d3c5bce27331117eb960c62b66911e3d6b435df4578d2bed000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001648292f5bead32838396af1a22d4a20cede2d0fc552c0aa8993f5b60d699ec8b240ee2407d45f056a823bf54551e987f79013c91b8f1133ed4a555066edcde1176f3de0724cb9603822dbdbac20de808a17fd2629a7a98b97599a74b51e12252dd7e9514cae6cade243e2a5c837803a23c05e24f2e12740d5e187931df24def020214f6d99a778bf02ad4d9c03066435c73904450844c0d569a1b642285a04b950208ad14847e9061ac415a8f5ea2aae8edd5238f3205a6037fc70d078ce625423e0a0057c6203905b69662795453ebbb639662d19846a30a4cdda798201eba5afe1f2b07e7195ef53f28dc97124700eb8908a4a70b058620bd3d37538887ae24efda0217f1ee06295fe7768e38528c97b1e392d7f44e07389c701fa162128d3fc01f5e021eb317538b80e1761c70541ced325edbbc59a21d59ddd2600eede60a7027534a02283f4fe6b17126749cfb11a71ca9df94459a296316a8fc1894d9bc9ef28f47e603193c429bee2e16286abb3d5665b932841c92bb15f6ea4b629834d28f4bcbff81021c8c2e74028a4f8fb8b35d7f8aed8b7ee7494fa1ebd8c34c50341efeb8b1ce3956731e163ffea346752633d8bbbb13de6088724fb620f309523e37c4c5eb28b11c1980e5f05c42a243e944e9eaf2a959c6f5c009ce2dc4ea972f47414e4ee9fd873df23918dfbe69e6166112b7b6f71d1a23c08c015440f70c50f8b840d59cb1dee8892c6bb157fcf2c0a7a9fa61c694a00d260a4c4fb041006875a0ecff84792b17de9373e531b6b1b4cf73830cb9ab7dafdfdd7fae00a5115b18b60a8d2af692c99d38e9e8052efab278d6a3be77241edb5b863aa1b73749c68b9a6c931338b602f1ddd8de794f30e04116e127e6dd29fb5e9a4ca3a7c15dcac2c102f0946640ec5e4b8b4d6ef37bab16ca10d29d196d182aaf13e9a0344c06d76e1866575067d8b16f21e4af49ee878ba2acfa3c147d1f8ba72e8b1e5162eb9c4259a1ad9da3eb7e1ac7fc53891df73043795729109d9384cfa8b5191ae77157f62dc9fa7bb4029bf679f3251e0e32eb31b1cb1ed5b3bd8eb190e3753b29e0fe30beb102c9cf445275af0e110a2694fd6eb03666495b15dcb75fe9701bd79c26c24acb792534452124f26aae83d740ac688346407a6e2ad961e0204daa4bd2b730bb3008a44cc4aa33538c800db0f9fbb0f3917b5ede5db41f8769bdd33737f82177cad9c0bdb6d9b2180aee2f610a874178b85acd52bb5cedb00b07dc2a7440ce255215119ddd005bb0716ab92aed314c4f83d109fef9a639374f12cb0e9c12cbb151c64617219e5582bab61813779acebb33f5705f7e00cebf3a2ce60f83152fcdbfa2b299e1d8e615ce5d8b476037a1b1d4eb331aeb5a4f1e091299a0cf90a4f1835dae4290a902a393073eaeb9248397a0e68f1798d303b537cec329249c0f60b554c22691cc7f0bcf8b78794044b5c695737a9137d5e0645564ddd94d501824002442094bcb2315730276291bb66e8c3e5f3e3c09d087d05bd7cb260bd876ef1c0a3d1386112c7f307d94c4ccdeae253e9417a2c18715da7ccd0d735ef8eaf8cf30ef1b990d80a469bc8a4e294f4b7b0d0a399da93dbfad83388b65cc5cd222edefcf2212b7516e77a5caec326b2db7da4ffc280359f3dcf849e8b3d9aaa1b9e6d68e5889f73dc8553f2e4128d59acc84347f967e1b34f2cbfc536051666325eb2d3b8e83c35a721a9da897114a59b9a1a6c5d16432cfb83c575fd93935372ab000939a574278c69b05b7d121bf9304b2fde4b944d428f174a468ea048f40494aa7f7e667addabc6c456a0965ce437db21cd0c53dc53280facfb024aa2e661715f0e7f7c14799543c9332aaa3747307d6ebe610e5aec36579ac683a52e26950c9081d562ea822b98e612789d7183b814c87ef3e716bc8a5b8e0a0571d8a2a167a6f0790075f4f1d8653a749dc36282c76cd26baf899671c71109abfe916eb5d79a1888eb699a9941b3e437a2e667c1228dad6f7f4b68903232c9d17062475fe8ac40020ff3b2c65af68ab2fe8e239c30cd6ef7b8ab8e4a3ac24f96c557676a4e75319e0668252890febf76535c4cc50750fcf184e53daee985a30fd715d4931e8c28e3004a1fe804fa56f4fb37173ceb2bdc3cb10997f4b147a5f06dae10d86392d0ceb6025a77e6afc5996b3590a1e4babf4789379ff0b2beabf999b5a091cb4f734f26ba965fef84137809c3e5f712a42ca7ebaf8b8d83a14ab24f8f5a5f55be8608017884b0a9ab6d8e01a20bc64290f0442489560c0e22a039e076b05c5482b97d2f4786d98675d35e49ab143de0448d94e1717fcd58188c607e179365e4d698bd67b0b50e79fb70838b853cbcef7eb7538424fb4a7b70781da964a6061f716ce132dfe59695247b8e1888ea8cae101431807", "", 1, 1906397176, 1537743641, "5cebd57cb41d77cfd39f5f6f82309c9e07c2783c564940dda32e884e7fa1f055"], + ["6c9ea14402351c2e92f6202fa99d1c7c8b4f9c2e0ad42abbcfebffd23eedc5287acd6bd00b01000000020063ffffffff9cd6faeaec6f04aa0746aabba7b785b217fd2bd27289e0465b9a6b595ba9c2470200000008ac5365516a006500b6cece040185e6e503000000000852515253ac516552000000000206c9ad0200000000000000000000000034700266ea268fadabe4e0c2cf0e1f574e633935de71ba4af1dd4576f87336120d0bd30cf9693a6ba56ac54a6e4508b6918d4a2daaa6036809a34d16f0c28fa2148c413600ecdfc034f748ea2dbb10263159db883a300004386f38298b459018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008925b5822c335a9ebfe689ba6d1e2a7ba50732c0016542a4a6232d7d18f61a697ad2ba2798d34baea34a767716842e7ef518c1ed3864fc892a495afcebee88d860e85da15051a541ad8da22fe5bab89a768dae861da70ad466e6ddcae3b40f4a642b5d082e657e3a9bf40834e2aa7c881a65243783ae03f85217964e65eb525902226ea9a580b7d7512a8e553b2bee2bedc504cefc3524b1c009e951f3e1c2ccee030fe590b693bbb65c65d83be23dc2a60261fd3576b0c7f35a47f0e1ce45c190ac0a054a68f3885238c4d92231a95d0ce4269a359fccce9abc6ad5ec3c9bee651b7c5d2abb7dfe87a9d3ca1a20a6ec99f614a5566768c9aa3d743a8ded5158078caa022683a89ba4c63c9a42ce706a3cd772d0aae23220d5b082e58941f03739e5df87021f2d2fed5dc87fabb0427a460696e29c3f418fce796270113f8d039e9dcac21c022b6f1a545f1b18aa3dd90319eb7e1b6502a74218f51eeb54ec85ecf21bcbdeab02178ea12583460a042f8fb3d7aa4dde8944022feeae90309836e0b4129aadc8d70307809c821c72254be8d2db8f3887080b1fff220c30db30dc72c58148ba0ccdbb80f3244f93a8c6f063866a0508c6cc25be610ee4372ba5585c7eb39fbeade08f29e79290697d05305175b80906c9aaf9e0e0bacc513a9b8be12adeaf002be1047152c9f9e3521af726411d7e539bfa3add69682ffe5c9c28fb16bc9d714d35f8d38d2d914d20fa5c8029327476b94b9f9d2731c7730ffc185b80c189e3a698dc4d2fa30ba3aeaa3dd48cc2b96966fa84bfb8926919d408c6c443c4ceb8ca87de4a464eaf8f64f77b2fe1ee10f357c968861a8051840e8f2eb1719715bff2199ed1fe1228e2b5810e6efae60465062f61441ae0ed2187eadd72ff20b98e48803c755a33ca930e4099dbfc6f8c48d139f8522de6015a26d4b4fb027f108f2e5393a65afdd80ce0feecdc32a41e27c583ac9d2cba9f1bfeeab6d5d7e15bd9b171d140e803c5174a61a68289f3f5dd1be71ff1eb3fd0111e902c9e16c93d886451fbcb5aeae2c67555e0aa850c99c6dbcfc69bdbd14ed1426d8c78765ace06df551ce2a5eff49c19cc29ade67a94bdd9dfd77c27b1cdd51a780bb5929da9e91eae31a9885962f5420f6d6ec95043a5fac2ef57e362ba8ba6ede9cc17b423e5b6c1d7b879decebfdb2434c9e12e872b4828d2b7712b19e642305d647df00540d5ae19cb93f1bab6b3c6756b900657e3fb2c17ce7f2a67298a459fef1f80a204655c04128bcae05d2ca3597585dee0edaca1555c4315a447c43eabc5db9f85d7a74e293865444eb5b31f54a077c1cc2a8cf575cf928f05a47fd80b4b9ec4f36cb092b85116928a6a76fe9d2532cba3fb55d436705901e57fa2f82cdf08e063d2b0260348a570e7ee27469fa3b2609d1b3685aefcad73a0afe1d145f03bb39d654faf7e51f0fb353d0e29f0ea115696f1bb83e75f071b6ed9f8e80a73c4d8279d0363b90f36eb31df47eea3e41ae4d36ab85cd43437996adf8d2e4fa1c259579212410d3362c6e3ae262a2948ced0b3d7c19581132177c2a2e06a80ac81b88461fab71bfd771011c34372c97a9eb07ee15fdc4253055e08cf6050b09c443641d6a00637f01f19efab65ab0e10370e38a75d2b9aa2cf4d7f8f8f10ed8151d51ffc6fa5f59612ae1a9b569fe2e5a68e5e6cbc4990eb8dbad83df31c9afc54a555325d9dfa5f116f042a7dd7d65b14413c404328b8bceb3b4f9b30a8f7018fe9af471a003bd46d2a767d3a8eacc6425e343941fbfaf292b198b549bcc201abc5a719f5e521293d275ee1da8c4b282e445d6b223312f34b9bae661a0b3c537c4f3767aa77f48b99fda0c9ef6707e5dbc52bc1377ded2d8b62943447bb1dc56a095e31a743b82afdda67219e56ed4bb5f717f674c48125f53efa14b24849c52e04ce59d9a2370f93fd9eb9c70cee5071e9549569b700a278d876445f7e3d7a32bf31035751de876362f1d270e7a0443c69ce33772be2f2425015856d9f1a37bb05bc7b68d2b7568fd3b112fc484ee7a70b49c9e6442bf75cb22a8586118f56154d5711edd60532951bcf3c75aba1ca9b926e7f1358892aabb8ea88d071e89bfb7338c000c975dd85d0a4d123868711a38738db8d5ad74bc3e5c545dc5a1ead7bb4e03eb19887d8f7c1c1b7b75285cd8fe0d06693626b8d34703e156b9f9bfddf91739bbd179590ab924c2aafa6f8178f4803b8504cdc452fd042ac4fbfb685a2a79f7a10db6afeea967a54405506bf610ab53a3cb11c58968d318400000000000000000000000000be6449f3e5a6ac838fce0e2abf36b64698e58a3e48132d3c0d02a3ec4bf0648c343e247418c026cbc596dce0a8dd7bb24ce6ebede0744eed463a540deb180d996a6d01319a10cb7948aa41c4b303a207935087a08e4530f1989f89dc15a8dee7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f0d5eea65cb060b3e90c580abd929c3b3cae73a9afff6024555f79077f203ab2d15a8aed2b5cd49d69b5f7ecd4e0d030c7da63affae68d42bf163a4e6a84402fac53b75a44d873e1b14f913038064d439562b310bdf013e9fa4213a6305e6fef812b383079d2ba81ac03b80dd9a1ab9d1e6144d5d25d02af5b736f54f2f60db0304a58f4d9371398606fa0843bf605735361c34ba46967d6cd5c76c957f90f8500306be8a693869f967f1de5fc8f296e6fb63a1fa9b261c9c1d18323da0c62065900b055d77f4512bd7d746ed63f3c26ea6e59c8a4868661634792f69755bc1c39f4aeb0a17cd8f1e73c5655bbd551e8e5b73bc2d7fd3be5ad489db7377c580adf89203237e1542aa0e54ad0d908b8ee61845f6d85faedbb3008b758b9cf344fe1bdd19030d060c08d71a96c0445c361b739f3ca5533e9508ce65febc65896feb3bcee2db0204f9996a247456008824df5b3ea5a70495a99348dd13eb519a139922d9aa6d09032e9b3294bd2313af9bf449caa52e6637eb7e8b195c801781972b9b3bfa2f5d8e02118242fbf3632dfee3cf9057f2945d4f5f0cce2f6ebb0ba78fc64fabb1bd8fe47463c0bc6f8c82b899020e25d2ef320cc1293c266ec214efdcaf717ac9fae2b6762220404224a7556afdfc91a055113a40067b9bac963bc2b40924a24b6836c87c03ab907cc669440c3a6a6ebcab7e78bbfee1b56aeb66c3177e7cd0c79a9491abeea99a90240352c7affe0fa18d2a2e4752357ebed055947845680a1ee5286788fb1bc05f154d62d55e60ae17097d39304f928d01348cf472ea728095679cf84413c3653ac388c725a0768a6ce420fe2658e444877a88b5658e4e442ae540ad71aa127afd35c8ae14689587862e84ad7647a6ed11f4f4ed82d3eac692defefd862270b85316bac98c204bae0b9046e68913ca90df0ce04ae4e9355663f6404455eb64a801d079ce013393a399b02a99f7c98692b5883232193fbf80021e382dab2831eba5ca8a1135da04e3bb54e02e90f4352c327a29b5add781a904aa4fc3e0abc5ca60a097f8f2c4a9030c6748d729a59406febbd3557775ab71e40de4d7fd381b64a4ae21b57be624432ba8d0ef458641e612cdc6a63b32512e449c3b8b41edba27a8fa7ec80b38d9af5067a1cadb2c83e9bab0b2737fa4444a62de67df5fd0e91440e607ad65c4d5a82e2aea39a7433f6954817a57bb73092dc50b35698110192cfbc63eba2032c39c9ee3487848fef609d78e420b084be2c930dda962a5c067cad9c1577e7fac88d5bfe115ac6a2d3c55a36298f10b849cc7658889e581ac9c284496344f78ddc2c5173710c501f885575bdc7d23f53e46258f2cf70701c36e50230b5a56f077350f87ce1a5a1e2be062f30aa11b766aa124f1f46b2ead4385368aef85aef7b4707aac0fc8d8531684763baa055b46bf99807bf58a8d4c7bc3d296e3db03caced9419cbda9fdffe2a974bccd474066ff6708db29167210c5583487f6197ff82a6da4ad353ee2fd3b17e31cc4639b564efb17c524aa0e0dc3a810b54b6e5940ab1a263df6fdfbe6da9b684d2aebe4bcf274c48cbcb9f8d59c43aa846bbefd27f709f810668856de9d6ba075f998fe20e1d949417551964553f1cbafde35d6a8457df6c49029ddf0eb3376c7a906875d606ee4b7a98e58076e027c359d3fafb33ffbdd752e3edb08fea10765d4727016f3c92ff4cdb28e47d47803817c1f39b624486f854e8d087834e65777a08001253fe38009fa0a99ffa965029df2cc5198c28a11e3fd8dd832ba234e6ec958f2df91fec842fad8d789d1936f817e3876a6a9ca7998d7f778812fd303e4606197ef4853a59138b0ba91442fc89c9008e4d046427d5532eeb299d20a1e2d2cec1d3fb63d070188169d6d8c972c0305a30fa294f80e080d99c3864203b06771311c6a184fbeb7d4791c36fbcbaf4c52aa5f891e40dcc30ac0550266d59cd5decd92db0ac839ef8bef5196724408cb34baa06e487c349c31c92f1146e3070706cf3cdbecbf10880442f34c9e4e12c1418a141312a70ad93a2580ffba2b3bfd86e15b1fb34e82a3022b6a633722791244ae749d21faf592f7cc4b9b3556c30def099d561c60352a3740ad2eb2a601d09ec0640febd19783f1878723d6e8b8bf97f19439610b284b43544008914150d35ad11cb03402dae8bba10add9f8aa011c941f1c09b12840771cc590f3a47b47768bbd12cfb5220c6c3e525e321a02739b813810b02d6255e03ccc0080b82205a19f3b36eb94c9b3e0771b0e8eae5de4d4059a0cfa0d2696731b8fcc43218cc39a78ac437a774fb641da51e4227c4f094657d9fcda4dc98a1fdca7aba9ac2acbef6335a059e60936e309a42b52fe14a7b0da165dd46d9d19ea953dda85cedfeb28966275b9132bb7df31806cf08", "6a65", 0, -1804480395, 0, "86854b29035d29386e767d18e9308789fd9eab6a1450115d198f46e4cf828fb8"], + ["030000807082c40303d531c38a838ac9ee50606e9b1449664a3bebc8e9d8dbbd954991e34ca9e2274a03000000016ac2c6b815eac07b3dccbae2876c7eb6dc60e438651feb7cc6e6292e6bc4399b5b8418689603000000045163536a5beddd8c1659c1243d50c8171ac9daa74d7e2b12f79aefd210888cca69970fd327c0f90d00000000026500d36a2e4a02ed0a2705000000000100aa08fe0200000000095353535252516a0063cad7ab870000000000", "6500ac6353525153", 0, 57086117, 0, "603afd008a1ef05616c83457b3a6a6b9c8818ccb4a9f38f1e320dad739cba9cf"], + ["030000807082c403037c38c215ebe9262d44b24c60b5eabe72617561471b32f88ed3690aa995ec74c3000000000965535353ac52526363005f6384ecb7cb313ab81eeb28ca02d78b408eea162a0706909cd198ac11503017f7ce9c030000000151504d49c2efdc9353b0b0d96ac5ed48a5cc2c823c3abbdd5a1dee3a4a7383c11d9d815a760000000009ac5152635165635165ffffffff023c6455000000000000dc40c0040000000000f671a5159698319f020000000000000000f2abb4030000000012d9cff824122bff43921197decf914facb51a3359613aa71f79229c9933377bf9dde3483b01a724e56b4eb029d14626262a838080f8e49fa89c9a7c2469edd666ff4f4a3ce0b9ee6eca7d7a0be4f025099da475fdddd0b104995ac5ed74a06800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f065c740a7e04fefa91f23345d02c97db3b160fb7d2094cd01de69ce4473f35a5213ce8f92fe305de1b9b260a2c42a499dcd3ea59c7f44ff5b72a062d9014c2a67d4209021c06319b1954af8d1e8ae82f5fcce5b436f88505e0ab00e413f81e5076445a256877035ce12e5b5fbadda16bb0d0ddf3fa275a5dfb83dfcc0c05592021cd3c6e4a123462aabb49676fde27db5760f4624c35d1e329327da4296b740ef020418dabc3b2b50a3b2aeab68721a55a789ae25a99cec5753b53ed74abc7421180a00ea25473477d6678f98a64b1f18a4a63bf455ab4dcdcf047102981b91cc069e65824b6b0a4ff31bad4769976e146572344228bf695b46b7f686c8f0fa66a8250320718258585c59d23efba7de65234a15ccbb91dede71f313da5d1d4e5b361206020f34ca0e633cabd20fe89ed8a48825592fe69848e88def971a737362e3ed18ca03156ba123c6a55042256b4a9f18ee885dfb69bd61f14d6918f2a90cdfe954bdf30218ea06f68d0b751954c49234696891c3e10cde3ff391f2e53acbf9abe9197cf8022375678476dfb73e26753015d9e45fccdf01704795e142d0fe3dc2cc887ebbfaa9702730bc9917a7697a03a74d3afc5db493b34f80922cf55d986d0713abff2e72be180df59790f36c5751cf9fb70e90bbb94e416df32107140267f8cbcf3fdd4fcc003cde7e7d8f1ea26f82dbff4a9b7bf28a2f0f0d86d6b5054da06b54505154401674d046663d13562dc8d8e5502942bf4d323b64332104eea7e95dd073f3c2bce3747bc9795004be4d5181bbbe86e9a37cade3b236c2d05e7eb061b0dbca1f3febf8207f56d77eafea889a17b217e4a57a1d010a1c6b9eeea070bf5e3d4f7a1d4791321e7a5896b17ce117b30e1cc87eeedb5eb20bff2571d4cf7bb1046dc7f298ebbfdabc481676669139f8e0d0acdf78bd3044bde2290d30322c76762fb7546bcc638911fb0d05d608978d418add71ba9cb13dd400f513e9337f5d035fe6f1b98df2d9a610b3b1739a814d45c1a886f1c2baeacf927c3c90859b91787c4650819f6ac1ee93e4c90147be0b30ac006bafeeefb88acf76c2867685f787700abf3355d0099b253792c5bb596136121880c368ea3a38882b9e8fc61b7c629075d3d7f92c8257af80c896f02c4bf938ebf666863120d9679fa42bf1f6054cedca6d1eab890e5cabdc044b8b81b9d9069049945f394dcbf38e3eb5671bcae6557f6577d70e787c1ae4df62c69345b741d7921d63d133b6e66bee1b2e2eaee6b641b4cda4e3633195134d0ae0d3bedb0bae0fe974bfe7d2fdda84b062a7ae83f80d1bfa2737ec3751899884cefa1a4366306353e05d0b99ad677d5b3c2b63fe65734e854191d55cbdb5ac365eba4af62da6cbcdb01fdd4d3be0d3d2076c4ab66082bb517116f0a1a6b16015a339da720a19781e26b98e64cd8b94925c87d8be61120d6cd2545cb8b145301122dd80765f43e14c411338fcdd323111f030d1178907828bb97cd3e2356229f5104d02dc0c83bfb5c96e9135e922cc1af8294e48052338015174def527f18eec0fbf54c91cf9efa9aee4a40794636c7385f917acf18e6b8fbffebd92cfdcc1d3da4b3eae624f28d849ae148ae0e0e0838a263918919583e94dde3a4d281576fc51fb5dec94efffd95be3dca7c678e887e1c78cfaa5293b45a688ee48e5ff3d4430ab91651498dc6be389cb2f46fda1e79ba13b493113253d9674e9f414f88c5f09935b860b35adb666c2aebb1455de801adf1072d8ff6d8fead84ca1c80fd8ad4baf3a2555f1d55afe6aa291b782e7b5eaae9e2a330f13b3fa1a7f165010a18dc352898a1bdc6375a41f19dfe6a5ffb059a85b200d08a8de363bade37577cd199bc5c7f467c1aaa6f0f851f980726e4a7164cab89b04cac64ae1cca79aca794688fd8df922a89fd2effab51596c5962c081d86eca1397f3c6c1989012c42c7c62fcb2ba02c61eb557f30d49ab526841b0995cb8f5a7a76899bb09f2c57e449c75efba0781de393186c08add2a99432e910db25d1e656059afe459560cf28a4230bb3b3e4172e51dd23ef7b23a4413a1f5ca3aa99a088840e430c886a39941d6d9718212b0bacb78c55cc5e8503e06d330a607eeef3874bc564102825d2d07a59350c88732ff5b05fc03c110986fbbc85405ec94edd7a766b780712db7e46161f25f9cd4941475690f9f83a644e7d1f5ceabd14df1ec1492df1110dd5aa39d49826f034f0854398aa3fc1b072b2667e07c7475f2c5895f16303362a7ff6500437cd8d44533146bc0000000000000000296ae1020000000012592b7180c02b21e622c39cf92e33416af4ab0d49f7ccffe9e1ac9689805266861033e2c880ac8787bae9100a71fafcd16f571812be32c6c87973a4d490574aa647a0e38f8bfc6a33d16af91ea0a6980c871d7b5279a7657db292823fe298a200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c09d1d2afceebe4382b607ba2bfce63f856f58b55637a820bb0410567c0f5e708eb1ad1d0ee5b5d3651e37946e36a8fd92fe9e04f11c83f492ca6b0753f85ac454ea08df42646159f907dcb8bcb3f72b2023934786e2ab9b2e7c032e702be00ecc032bfd7365a45446cdd477fe08c45d6ac6e8bc79b11b9425a55387d549d177031f0b72d79e4742f783776b303bf519b62d3847b080852db4a1b3f94a6e3218c5020e41d112dfe4b7cb9f346aac01861b3e7ba19b508991b2dbdfce07f1d5830add0b002286a0ae6c8a67481ef5b2da2204dc4c2dd8fc9eb2679c895c123d5a7525da0d6fbfcb14b15645e391ebdca46fd8a5b39105b627b4f77775d187fd9555b02b030cbb19482f53f23d902e82978314901809439bac07e9441f8a765d076fea56f70330169931b357ad15f9d786d54b6874ba756c6995d281d02f37a2663d2d6a1ebd022a2bd365be81183c15199bae531a9fdb8cd661eb9dab488259c541ab4410c3bd0223ab35f9a382563e4c4eb5c1f56687973fc388a7685d3035d82a655fa6a762450207eb603772d6896a8dba3925bd9c1965a1635ca165683957a43012257a9d963e0d0699d03d8595ddd515187b2e304d2c6aff770b2ea7f56bb5dbca6c0fe30988131fd9a55e3a7cb6f32a23988510cb5972ed2552e4e8c707a6332c9b0c0869fe13598a97507de3eeeb2d6875c19cc32f0e5137bc886c32fc6fd4e3f861d1592205d00e5c13c974c1d49612e3e738c5ff0688aa24e682ccefeec195d77abb673aa76dd31b8a1b8f96764b3ef0fbfd1c001f47bf1814247ba7326d3c54e51b20db90261e4b8d051ac92e9cda1be30e5e116ebf7f2a14e5db2ca85b5ed78a9dfb40eebfe39ce720909d5c2adfe7aa04c261f72f12c113801c3a4fb54c849d276971b89b764af30a7adeea014ad60941ef8b7b4a252a5c5209fa10262457cf6c959088bedba40bea34efccf895dc2f8a0ca808323b77e62f42d05b39fca91bb79a5adf5357c827902cd188b06c4c996f5280aa46d3f2bf5948205ed477613e98c58a5e79834bfb1025e62cd6a6a6367de6ae25d67988e86e96eab680c35767d64c1e52c3626a1f21fc20a0944417999a27340b80d65a3b13f6ade78d51ab0a4d6b6e842d74c44892df5febbc5d826f9b236b01fd0a6d6ba112fb2b6d95941f0aa2fee6c9a5536d3561ce9421de8def963afc01708ee2daf37f6e9c55a17e24cdabf6ddbd0ada5a2b5ea0c668f65d238f07461bb270cd4b3284a0dfca913923061a6a1f3403721c73ecc07e7c888b60fbb6ecacd38bb5391cb468d91587f1b21a400e815b65291520c5fef66a20987a8698d22bd51ad202c4a7711d8637ba5621b10f0ce221688b8763da14c8bc2a89982e637a0536753a89d1058102854d4130fc92e51db64716487734d6a7bbf5aba140ee49025561b12b5205a4928df95168e541058dabf5b68ea62152f467e610c74700744897c1f6bd99ea30ddc9a1adfcf881565ef5650beb51348117dcca7d08ffffdb911c3cd2c619c4f43df49ebf1522932f83e393cc2e3443682c43d95efa1696e1d168cda4a229b1dd7867e9dd8445e74b52f102e28159426b6a4dfbe27d2da0cfe05ecee5e6a5014e193bbd8e8f6a14cc408aa5c4695460b98fc3eb692bd39fb179a3ad81e98080f1491e6cdb2628853156aab552e230cad9e3b5c5e99a98f1ea5845a5b6f55d4fa0d831cfba2e48157e663c35ca7a3615c4a7eebccc61adb2945a949adb3d62a18467cafb696cd248cb28756081914b45c74cfa16d6ab3ce31c05e4618a6b44848cb8b0127765a58866e1ea44fdb5a09d88f32904a664f856aa1c741019dc3545f03ee5a09ed3008ea6d9b9cc48dbda16899d84165d7ce263bb242215e53cf334783021778d04d70569dc5a193ab0817f3e5a10955bcd8565c8ce8e7712493f5bd3529b27af176e0fa9f83bd5810395d107a36a740491f892cf9a71524fcf2732de95b43cff41590b6dbad304d8d943d63de6e8e22905750623ab1bc86dda4c66bf97d0f6c021b3eea1bd10fc86e277ec284f2c262418faceb65c15a629452d8d648bc67a1d027cc3b0493457cbd471d1a606b52c49208e7b53d6214d6f040e7a2328cd988ffa9886a7c2b78e1a8f3c4b9b50e782c3a9ef9cc36c42c7ca793a769ca08c5be9343028448c811852e8730da0c8dfb72a7cb734664c5adfa21161202e3777c40a43051370f3b010f0c2a9d78c841e65424a9155c5e5bdf063e101c40734031bdbda03a7174919d11e87e5bb3907bd1a693e3e73f8e0931f45c35136f42fc5cc15ad6b21e4d3adff08b8c0fd9533dc64320ba078dbd5865c5151ace67869ed254d9d5b29e85821602d0e5daa1bc4daa51adf3e1a1dc8d40e37e5d65963d160e7a1a3edaa535b3bbf2f2140d2056384ff0acbbe6ed208", "0053", 1, 2124128859, 1537743641, "e3bfa3580432d48886f2f55e5bf054cb3e0da928ecbf5c72047574d1d3523528"], + ["d91e9f6704f20bcdcbd9d2c055de2b82ac69b0aef79836f5afa7145c987dd007eb3fe0c4ee0200000009636a00acac6a005265ffffffffc075aff239197d29c44f6f85d5e5f6b304c9c637c9a544751bdc4f293b6d0d4303000000076aac6500536a6351226d14fb8b56a55cf6831e1a9646d83f35f633020d4b419249373bd700e7bad355680c00000000075265ac526565637f11dd7610086778c796a7c208707357d5282bf6b990bcce0ab159ee580eb6112e5e860e0100000003515165ffffffff02dc26050200000000086aac5363ac530065cebc0900000000000351520000000000030000000000000000dce49e0300000000c2c863feea81698d573a67aa2fedd250136db837d49afe1493cc06fd852260de8b39f996b186b372cfe2bb7fa743cb019ece4813f628640082c425be03faa4493dd12cb4243b659b8472e8d7933172169572f466e0e3969035d81bc5360564ae000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a7234fd1d3b629292399b82f97e1e846d15bac9b4e16ba92e43546759c007df5d7ceedf146e4a10f7abfeba38fe58e6005d2b97c9b6f6d67ec079b621d9c5076a021b4f6daedbe8db782c870b2279fa13038398ca163ad49975a569866c613deac15985251c6d1929709eb42b6bb2406857bf3d4b7ea4af6af9c703073a1665021318ddb2040a9b136a68758d15d6b7566d7c3575e1ac13387731267fcb07d2e102081cd9a52b0f6dc8e9dbb5c41be5a4f22e6a9d6c72beb2eb56e0b6ba71a9b8540b06a9a0e5a8f77ddd48d55d6988a3fb6e6a7843aaffda8f195fe81e6cee7c84660bf0c6c1a140a1124651f61b82adc04ad790bdeea64509cdbaaa24117208e78f0203cce9204d3c27bbde72012324f954e3c13935242f488bf25500443f0198042b0229ae48f5d3e574d63ff102f7644f32e19a0f809eec3c5f43557cc59591c85d4202182016741031c42dd995c48fb585bb3e1940d69a30c171494759223cef3eb0d70303984035c19a2dd74d784c66e4f73643d4e9f1225b69d01315a6310426792e6a03149c5af18e7764eeefb84fa455faa087cc4644bf5aef8c7e0fcfbf9a91a0f0858b497ff71b4b87892075ba7ff0ba53b788d9bbe45b406a7aa85cf70572a2055e860f8019b2cf2a127830028aa213164bc8d153a6b57924202247c43dba14d6dc63d6dee3060c8b44dabbb81c24c93769a0cc6e55598a7c15259187c4a7c8063dacc966667a5f43a3282929d510f29d61350beda9ec99bf3c56299fb4e59845096ad8aa3be1537c8438f6361c70692fd9cae0dbb6990a3ed2e012d587c3bdd3d35c4f98086cdeb4082d13c7321916f9d16e750794b85a98178da7469b0a3cdef5eac87166046fec56236dac122f6761afea34a7ba676970ec09fa684e3d766eeeee0915460932a7c3404df895cde25d3f9bee1d198544e4a53d4ddd6a7ce629ba015ddbd31029d0f593ac4076930c9647b4e4bad3d3946af59bb67470b42c498d044cc7c815f8746ce563bfcf1bcc112ba8303e069e53a742b37b3bccacab0a984e4f3c6bbf1ded4ce1cddaa419d58b2fd109d6b57205187ab87c21b003ac91e1436c3c3aaa27314b543b3d6205cae7db8d9809d625924ed7979d991eb3859ec2c11fa47f1141305b0ddbbf5b20c3becc7d3c98a2f84de326aedd225fc48c7de13d29348bdf3b5c6977ccca7b32e88d220ae29ecc0fe3608a5c29aca9f65e9e56de7d5738f9f5a9d3a39d0209a87d31c81e99b6516d18e2dc102f77cee032388c216de6c623d39685520eb9ee0621bc49be8d3917d15dbfe9095f13875a392be1672ca9fd490b0150e352be0d911f110f0100c0c38c96bf35b2a22fa700f0e6e2702c8b168dabb2a30cd0a2fd142dc0d95baa5765000500e8ba5a14ff672436dd6cf6d34fa6dde7b6fa515c4b8a27c100b24aae3dc8def73ca71f1d17f3ef97c17104642db04d5ec3e2e91d85507793aa54e0d9425ee4d94a5e502dfdcbf5b72e3a7114f4f30f597f74396a50d3158e5bad8108c614d8a2246c05f6e73285007f44bf6310bc8aee592360c17670df24e5d7b93935952a7611ffa5e4edbc277567a9710f12e96ac00f94fa0d34f0f6e7982d38e97662b3272e9cc8c0f1c5483733a6dfb21c6b6e6d4ca1612fd163f8dca85a8b801989844f890ef05d330238a4aceb0d2ae225aca85eeddd26853ea455d4179dd9cc6b290f719a57ef0e5a1110f1773bfce8e2c0c823a898af9521af90f4a6238016f6457aed50d3d9f3250e9ca309dbbdde65a4b239125ffcec318c920fca27ce1c83aae03dd688c638c7ba1e17dfe1ac175575653df9c8ed146d8e46a2fd99940e6f5b1ef84a9ebec860579496ae381c982cb9189b6cf8ae21182c9f97d5c3487e4dbea0d0fb18aa8c36f96238f62438af581dac480dfa409f22dc539b1a8c9d59bca905c0366d8c0e128327237485a246727c606403a23a61ea559ffaccd1a34a166285e450b0bf8b4097e041abe42a08a58d446ecd11f0307cb530e80570743b262202ef223bb80efff89a988d5e5d09d88f824d94165e31595d45bda736e07cf635b1fe4df333479feb5d1c5c86f836afaf8fac64ca8ced6e9361ba02bdbf62cbe3c3bfe6c2a43fb8f7cd0e66f0694fde58b4e17b78870f6d5f3866f68153911c0916fcb68cd6890747bd86c0e1d798b5161b7e280e790952c54f801fa4b9ee3ef0c7cd627ff26b4c6fd165d156de4eb2cd79f4867bf1ed0d2a450947fe9f35c695f408556c1b44789ccfdd648cc13dadce7e9ccbf6e1e4401787378baa0000000000000000ba84b00100000000cb0a8f40fdad1b15574b48e0340ebd61d268d954e9e9a98a63639addcb6832e37c16b3b38b7dc394965863adb8e54116b2919e0d428dee9e3596c172b91d1ce3c6c0312361e4f4f6a0f3fa1dd2245d4c524566e209092ff9b609c645be1596a400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000746b83866b59a92a0b6b3d38b2574e6e4e4b255be80762b52d308033aca5a4816a8a763f99ea2a623970c4eb20236d8fec3c0980611afe8468cdde4b4ec25193defecbd4fd7bb108626506a7cf7c43af80a0955536886225eefb8cebb494704e847b3b9572754c78825ca9140e7f197393e43cff9b099fb2414722b523ec43e1032389ced6298fdc3d8e3f60fcebec6ff6b153b61ae5763832a5537c0ba21058f7020ecf96ff4f7663ccb4e66a35b2cfd6ec92b7a0eee3a79464dced43e9690d963b0b02a90d41bf8cb39f6d4a23945058ac5ef8f7f0ef6de0c09e6aa19b86a8d66a9be275a6f8a7015e014cc56a2653dc50f22b1d732d41ca0851abfa333ce443f0b9021c732910164cd4214b97bc1c8187489dbf8ca46825f728d76232cd372c833f8f020d66ef125bbcbcf8e89394490db3d5338c6f7962a96a6cea5da8f37782ae4a7b02288172b6e68e6fcdeff02075085d343594d0a47d25f8c034b686249dad4a627102273bb7d39fd74a14200eb6de96f28dc25bfa1d1ade95b076101eedb020e14aca0306a2864f84f674cce8b6c1668a9edba28028197b663ddc9f63ad6d09f88db377ad850881088c0a47018b2a5c82f527b6307929ba1dd9e3de8b560d037738a76e8d96c79a08ab56210cef3c3c2528121962eabe3b985cda8cc22928fc4fe69c09c72e788fa01dc798b1c7ffdd640e79b13ac5e687aab090c60cb5deaeeead445f37e7941c6612b90ae2c7f9c6205ec34008c09c6a28311b3b0259048e3406e819a1d92a890b326324c55c9ef662c274aa14596fbacfde444df896950c9ecc19e566ad854d12a5ad9d3abd50f3c74e7c161b0bcbfd2057dc74296897304bcc856e8d2a4d16711114fecebecadd33b21bca568aff87d66fdfbc039be350aab2694d886227be1ee9f3309c12fece9037aab13da107d094b31a31b4d3aa5ec25f10f18a86bc163f12f4783866ba4f3d748a8c7a17c10ab8b240244fa1eefd2480fc9197ce45f23676a0d556afb729088503bc018a193998ca0fe7de2529f864dde4c2098a7ea330a1bb61deb1664ac20139200d0db72e54ac2ce3eb41c09feaf0b0bb6d7cc2f902858ffbc6ea80d3cdf77fa95677c083fb25b52dd5f164457da3c3428efbef99200d56bf5336dc3e0150331c3a27976681be0d3e101e4f14b9afc783efd254f8f6111bbe572f13e2a60c09aecea633f658bf7cd196cd8803ec867620f397babde7146b315feb46e9d7e508a0f26bf6348c78e164e4dc751521890226bb3b2471c55cc3110515fe4a1c43a93379cad5d90ebe6ba918ddcbae11f30444adc3ea08f3c5e2dc9d68dc6a6546159e6fa6e844a73799f0404024f0220e904ab3df9c144e951c1000963ec5a9fd6c59957c6e335485aa88bdb9918ef4a2ecd406fcca0b30d9f1d27455f97dd8992e14b629b6c332a4dded7ef4d9b49c1f1d9941acc36578a49cc4c14eacd6729383cd976b98370da8e7a966b8212075b7340a02fff9b81a836b1bcba25fd737e2fdbe5d1e8413dd89a62d743b8f366dd49e6943fbed666831363c72bdc777d5defcb2bdd5ec7744fae39f4f446dfd33264eb328d00e47e6f43649bb2c0b34285acd3b1dcee04f25e83eef792531bf8495f0bea102ad5459a664ad3dd59abcb1ac8d529fdb3d23dff80b22a6bd3208103d864daf9c4e987f2c9ef171f1a98fa9906abadd55b369f15c57fc73639ee66dda9a91a38c2922133f79ef35f86b3798742928308e19eee55df28a5f7a7c760595554c2e4f000e7d0a9a62ec9a65356326e144f7e920f6ee8f53c790da797ea9ff1a5d4cbb6ce9c5155c3d3a57767ae6532b0055dc2ad310d0e42f3528274db00d89516ee3aae73076d05f1ebee48ff9638d61c3d4e6411e2e7c5de99b0d7505fdbb43b6ae9b852a6da24bda8c56aab6897032c6c3221110e0fb3ac11adf43b391979173fc821bcfc7d75b542e589a2fceb4861ab81cb13a0b78c95803b80a464c09fce1d0fd5e14cb3be71da9a7767f6b3e5c7fc155b0c965bcbc3c713a7bea9140c5e7409c7e0da564641a90f8f359493a66a55c66ce31e15cdd83c514ae30e8b169d61900ef8602b12c8cb046c6db439ef0920c26761f4f094cc61effa5d8a308221bf0eb9ace6b9b3322bff4ea655b4bb2596ddd80caf2aa34d3de18af6cdb197e912bd4ff53d8b4f0e4cad2a7e9b056763c0253925ddb75b93187de77ec7adfc84b8836b04710e0993f27594d6f4cb75f5cfbbf76ea15a4a7e1e32aa82fabadc556a65c40c0a3f1dbdde57b46102cdd6d90bf0000000000000000114d9801000000003abb67b68ead3135c5417b02b18968b0d429c27e939d77a020288ae5faab963dd5df3a7592c22312702b3e6ae51371cbaaf887f0ba21e8cb93a5d2fe9e920263060f2fd0b99db9e1e0e5c09253517463db1efae85f17dd4f028d2db7b7adbbd500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d9038f23a80d444a13b677aa55cd2b751a14727bf64bcf45e7799b5cb7f92f40a7e0f06e932b8d8ef52ad3dd92518fb23e32ba366143d559eeab6a329943ea30d29278ae213ec100016aa67b3052294c8213e4457647144d3f9ab435fcf150a28574ab20afc21bbfa4c90a15bbee7cec900d971e9d5c6cfc78b70e52bff01d0a030c6304381dcf0c6c671590044ecbf2322070f8e5a9da02e6bab0ef7efa56ac1a03137bf1f9fcf73074b8dee4513a6e019d3d1baf9c576e74f1952fb141ab4e0f640b02d19b6cba8b1af1ea84082e00f597d321d3ca78c7019310475222e91a9dd9c3f2bfcbbab7ba5ce94583b6fa60eef29e5c400943bd65c01340fb446f10db785b0229804d764034a2b3b245801c746efed9beb3d2ed13d7a88fc469d8460f6ebfdb021819e1fcbdd69e7f15742cd6e6df16f6ca7ac814f8ba50048ca0b339ce00e2f60202bcb3e45d919c79b72c79fff7477d2afd1e248568e08abf75f57bcfd6a624860222f21a7bef328d76026e6427e6b4b9174abea8d8a7be2b5c114525b099226e210309b2c7f50c678dab5b8e78853574620e226ecb52d04301d8090524d850a6f6d071c5d55228cc60c77aff780be96bc81949c5c071a84c393e187aa455a65ad1556b4116d0c506950bdf455e39b77ddfa242265bb2f395cc1b206a17a98db71192c6d99c182a1a73a33ed3692a63918b2083d36c34c28d9d5d1982e2f447e7a3933ea35f05c9ef24efc702361026bc70d9c9c0b34fb674283bca1d9cc407833de2d3e243e34c4f0dd6640a3bf909f166266ce87d1dee8c74a737cf9a5f7f0a5044004a2ba9360c2c07711eadede607325557c46800ba5bfac78d914532d7824c77828dc3e06e756503a4faf2484cf6e2585a24840ab458b5b323ef56da67c8c113afdd65796bd59a7523edc510e81d0ab8ed24c675924dbf470236b419ad609db342db06b23eaa6fab7e127790bc96baa22afcbc0e3ce2793e1bfbc012b1568feab440543dd8e205d5b144284bdfe2d3070934b252ae4d50c5d35ae5af3b6e6acabfcfae4297ff9c4d5ef0e03194a2538cb612f3ee461089dc010edb7707e377ac8354e01f6ecae01454b170b587468bf357c276509551986048c85008399b4b0c2eda6bc74fbbd98e17a52a1ef9712e2e00885789486f7d9e233a65891ee1ccedcf9268cb5d9b055a831368743821b7f807bd933cab98c02b404b97fd7e196d5d1009c6c7d08ff31c3ba6ec5a0152a2dfdc58aa0932eb4f1ba5614e693e70d5677bb11db66a393bd6746403d98c8401d1960f9141fb1cc7f136c43df0a82ee53d6ab503c8ebb6f5da70d05b5118afbfbaf80a0052a17b769823df1f4c439e702193a2457926967d6932d7e48ae2a97d37523e1c9193fa47ad19e6d206c99cd276ec21e613c9b7be4465c4d585d90ab75277293e820eb02b5680af253277986f49c1a03c2493a0d93a03d21124b27854e601849097d988f285eb658b98d080f52a9102ed5cdc5262999c0ceedbf65bcc2ffbf02069fd85ad66991c542a4e43925c99dbefed313eed7338e4694fb957bfc915099660d4066db307513f6dab623f784a7ce98a4de0012bf8de2104c48ed634ed97ff8cdbe76c78c72c57da88548d0ed945c2459fa4c5170eef8593a417fec626353647ee179ff1849c3a46b88da46e6dd8b9a840817a88f5b4ba9d61fd4a0b3836cb90a72e5e49646db9e1355b4003f85a5ea888f5c2c9ef9126c425a837b25b09e38b01d2edb955e92ea73decb25632281a256c6d33de3cacf247e061ee686088700ab0765ccc5354d1c7c79166906f4253839e0a77e8be833d71b3b737dcd6528e41de31762963079a372b46c83ff12d35f90ccb659b2ee5b5e0fc7e8354df8ecd10413d2e364113715bfbade54089c2def1be77b944469ac3630bc40571f1821af3baeb4104dd7d5792f77f4290a46afc33560d3c824fab56ed63475a38973e9ce4546f79a8e3d5632a0be1cfa6e1e43c858f8bd64e009059ee5d148447b3cc2ecd8bc07a0d286fbcf815f71e4420b1a7fdc37157ca7df4ce8e99b6fef40cb55550362757215e748560bca5d55e5eae293551b27c68ec07ca703dc06c1d4747ce248710b68ea124205365e87719ebafa4832641ef175ff7648b9475633fb72f191b9814fb3f4827382e36cf98706b2d02810083c026c0e749470faff416c488b56ebf7d00133778b7bc09782b8ad8a118ee04e35e348e76b7c1a574d1cef9f792e7fcd0d2adec25f95f26693fdbb53458c475b640b58213e4402224c611f69c2758b4c10cfe74661cd2ced21986d19034e37e02af527d2724293aa29651692a11029cc203748d7169823fe2e97daf71117505b06854a4ca19755b43b571de6ec01202518eefba146fcce0d494609887b41172c854fd0b432cdb7bfdde34610f", "63", 2, -827983237, 1537743641, "63d28fc19eca3942c36766fc85ddc94674168d8cfeae13ec327ef95249adaee4"], + ["d4f2b85f01fef93260abcbb1b2d94951161b2337b0585ef8a2dcbc35cf671394a73be61a9e0200000000c05d0c8302066ff40500000000025200618d80050000000007acacac535263ac0000000000", "006a53", 0, -834760043, 1537743641, "8e16d4f1f3c8b8c5c94d72a9e727bef8214ca225328aa293bea9e69ee488ea9a"], + ["030000807082c4030243b156825e3410a871d4be6e84d1acd2f9b5c7bc172ca3cf15eecaf46964473e02000000050051ac5365ffffffff7e0e16d55b4927e8da4f7d2b0e6c7cbdb27cb12bbe3852fed4cd32337b4a1f36020000000751ac6a00ac6a6aef3fc420010b88e10100000000046a650053fb74fda40000000001a2f7d601000000000000000000000000a4a9d84a22e139b061e4f93786a56177d885b963fa90f671950b16e356bc89ea88d1621f4fc93a895ae7efecc303c6bff6c7a3fb36d1a233a79c07bb20c428fb443923aecfcbde1c36498424fa03433963198933f01eb9ad26519924b567b24f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c84c6525a8d44ac5106f004425c1870527275e038c4474928dd0790d98257d18049b79e2ef35748361370fb75a39c4383c7dc7754c26facb2d3d058688eb7b2dcaf48cb7a48a875f0ff48b0110a59d7e0e96ca1a5373bac53535d816c176c931014819258c28d33b85bb4a99328a0349ad4a46aaa58e357094f4e08fda88726022d2767bc5b7f0e0421d99d9ce39b69a4a4ec8e242e309a2ad77d3d12875a1ee9020ac5ecbef02d62f8b413d154d9d0e2f4559c277c710c10addfd155396a8274910b0912b85e89418bc7a2ed8c9deaf10ecb0d74b601c58e7c9313fc3ac8eb10e9c4ae79696e98e9ee445d5cba2668f21c70f93a4243c7b36bf000501b634a2874cd033061f09f46c1fb2e96e4aacdb905cc172a83738fcda74df73ef88d50eda86af8020c8b3b365eb1fc3134eb589b0fd60f803a594a2c7fee286eddcd4b5d426a58f50305f421ce84dbf48a86c036bbccdd1e86eb45055218c07750cddd8b2ccec5235a022a9912e23251150551e3ecafa50a75fa82de332a7585a8e2c1b4b8cb14b437bc0214bf54ed34ad158888620f7b6de726155c2f7d869db6739e029004880a510143fa209a56fc347f3596243d79bbd0b2f1081fa35ad5ec99c33ccab7546b0304550c287df63840cb5438217d194da846bbe5f7e7dc4091c663f4da5fabbc1ae23139a15c687d6ccb0198acb7dbb31ebbaa0ebb52b675ed5e7201a916f3de79514679b81c990b2c95356ee5c76a6ab003f931b28fa3f9e11e15a1ef31e9e45388e489fe17e1605122a4d67c522a31dd1641fa26c01410a4f9602a94a9b3696838d4baca922cd40a9257760fa78ae2fb25610ac615b487ad2877b25c6d79163f64187ad3e423ec73818d5008fb20922841f4efd10fc6474afa6b6805586a18f95a689c3547d208a52d79ef4662b35b33db65be531020b5fc63da54ca1a696b484f10dd8a2d6808395859133ec9b994e23a00ee85a426f80f33425b6083c79c8d6578494808ef036a31dae263f925115f9b57dafa6e7751d2264fb5c48c0246609da4b97bbd87e0c085e0eb2cee1153e349faeea5480d3af2a3363e7ff631a6ba90d6bc08b87e7893a04d28fbabd845ca8dc89452f446e409af63044ec629bd2292ae2c67fd2cd2621d5498fc03c850418a0b810d3d0e978142f2ec9187306f82817534de435dc650a3d301d7bdd67bceba950c72935a2df2c02f0d099f2b3f15f07c80d1897fed305364767c49cf5dd0b3d739517018411a648374217419ebb1c6ae92f3ea0418e7cd061a7c8a014bf9fa9152d0ef52b6c90b48227c3ab98f27c33af7169178449e733afbff55b5fa07f9e221ed8e3627927de58638438ef04bce1b0d113f108e061d6f19735d857465d4dee0bf0cd7e68c4eebcb43c81efde9ce93a7e0fc37abd7c22e0eaa5bbd465d82153092b08b9ada89c35eb3cece5494bb18ce38b3eed3690ccb50bfc139a1f882a39f2a71f3212790a5a80825935c67693eb47fd53038aaf881d9d27217ff1818b01996a1680e23dd9fcd1bea2896ebbaf0e07668d54d7a0361373e1546a2d79508808771359400d3f61537d5fe7ba82d251a8bef4bd3e0362c70b03ed2c04e6a67daadda191d1d6a5038bf1cf60a337af8308c20c8a1cfd4f91b9ef6ca9cd986f3d70eeca16d99366de779d81c970348980be68698b0b9f5fbb564b87f782c38e87281ed78bcd5ce51253ce0e9b05943b76223d3eda66fad9e4d803206dfc5d2a63c8a8e673fec293a336ddaad8d0427ba2feb36c0f7947b0ae91b41f3f6e8ed877bfc9a6bab208a17ca34846929d3bd01a1cda2650f76fccf75192bd665ca94a4a4f717c0f88f14035b6af86d1535ce0dd18553a27112e6b5a5b713835f6b0b3820335126ed1c7858e9064738beb91d16a58a19eae9c632224ddaf42fe4496a060e94b5710511a2b431d3da3c9a1d3662601ea611c365a62ac69a3311add7a5837d9fcc8a06ef85157ce7794ac958921508625985ef1ec318cb9c29e7a79840d5348499db622aa17a1f58c886f51c3795a9ba5772f547efe6d45f15e2c7fbf70d59841e3fce6c91903f6c118e39990776eacf2d27caeeffd025eed65c1a84da9cb9ede82ebe0fd2a46fa265097be12f477c45cd1f16b439acc30d6c1b3b15959cb647b0bc1c712d5f3607a2b7ff6edabfb58c2134211f5d2dd5c582c2e15dfe5a4cf30042f79766e6e2bc00910dc47d133736cd539f8346553f4b380d659a73271e4b73b8e61e61cefb1b52b7282b384e937c0de764d421800d18e0766df177cb44579f8a15247efc5d6cbf042894f98ccc801da69eec0cf39ac137f18427f1ecb68fdd5d92f2a1689ab89f3613b0fff4a7faea65fd46aaa13a96facb986d0c7fdded631490f853e0c185e9970f2d70a585641b4062aa9d8764f868e2dea4c0a04808", "5100", 0, -1617542046, 1537743641, "ec71d1f54dbd68151335ff7309bbd8d7abfafd08c13e56c7b3d543c7befec757"], + ["030000807082c403030a0055c97ab8ea3578bc72d638ace8f6dc6f69e4a1bb808971117e7de74d6b120200000000ffffffffaeb63f1352645317dfc741d97b521f94c8e3b3d7f6d204984fdb09a074ae72b103000000096365656a6551656a53601518759741f1ff51a8bac8d5071e8618bf8efc77680f8a128210a4f8d520035eab3ae90100000003005353f3521d4203e0bacf010000000008006552510051ac51564eb5020000000001aca362760200000000046563656a0000000058de8c8300", "", 0, 38400951, 1537743641, "3e5f15409c7a6d800de9a356fa065f4471d66cbfea128752838c161702e8de5e"], + ["030000807082c403045acfc727ef2daa6e308e8b813375545db66db0c6d522f762476f5c519438bc3e0200000008ac00650052acac53ffffffffc4bf09a380d7c402c90542ef37d7b9ba71bc8b538cfede224a0ce5769e8f4f2b0100000006525153000052b210a2f70bbf5f7fe59ee75fda2f7fa627e6724142bf3255a4673ace283b4f24cdb5e43a030000000453516365ffffffff7503b0232a968b0e7841c51c0f49c37f9bd6af3241348716a54bf165475e0b180200000002536affffffff02259e170400000000086353ac00526a00652eda3a030000000001520000000039aa643c010000000000000000958d8702000000001b0736b2c28421d77362c56c3bda370e69437636dd1364d25fc45c402323d6213a96424279d596276284da69ceea23408dcfae76c12926d851d58365f4bfb95deeda3dfa04d8d46355f7cbd7edb4a69332faceb6f887d9e8f18a3ae6cd94feaf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005dc1b4ec3cfbf1026884a287f3ddb1066febabaa4c3cff1a108e39f8fe09a60065a0cb3c0d723c818a9fe642f98d3d7bdbfda06d5527c4e0bcd87b3e2518ef793230b1504d0bdba87a3313d590d42871b384e6185888640a277f34ed7248b84fd3b44ce29b416684dabfea9a03b81d8d535265dfac782010bd9d410c1bcbc4e802253a9b78b299311dcffaeb2208ee95125e04a4ed8e57a3ca1ec4138cf8984906022755529d6136d3c3eb7469d5ee14929e5236fd4acdc6b0cb742855bb1b54d3b50a045becea961dd2281095313f01bd681d2e4d89cceb9008e5227123e9fb715aaf206cb7aa12f75df08d9f343e54a0101ae44c9bfdad348c60dcb6f819e5f5c3fa031187a5bbc549a31a9d298331e743bf06ca8e1971b0ee0de9cf6676da8ef08070021dcef807420655798b922529faa28c2ff81e43ab5b725a55e0a2f1f0418b035303156c39e8f1ffb19c86c15aa6d6b2f9fc3efe8b030787eca8a9e74fe16783e5e603070282b9ab2699135b34c2f59aa0eed12d313ade5e30b7d0e8ef7c835df51829031ba6b84ef1dd925ea99b173c768492f14eb5956e6fe3d7c4dc0479891a7f9efefbd6d6fbdf9d2e84f961153fd13f1457079afe88c77fe5cc3ab550c1b0c52ed3eeab42590cff2f27955f045384b6830284a1fd011a263108d422fd80fa3b4fb3b13b02a4f483db866f2493468f553c058d192e5984aa4173836b02b5431d6e286e2a1682922745ad38875d31f235273036d9d3e2f615f373c7905f7b9471ffda9fbf4d39084273221e638758eb010d87a0cea1afb1a35d9c2c8b41759076a3aac1caffe8bdf426283dd701ac8ec0375ae24bd290b023be4a391a7ab48eaf9dc12fe6f40eca529e8ebb7c1164570f01a9ed98c46ccccbd9c3fd19962ec791556915424eff12c752979d6399a8cb934d967079f37cc409affe1689340747468652ebc99f950f9aeb81b4e6a25fe96a380990d5869994b8360468c177682cb8782077681c27d5c7e652e94005643d704a3d000d8558e0647d558aaee21bc70099a7e561b368d7564a8412af29ecac95bedc02adb9d4a401be8a4005020cac3cebce5db70651928c171e4e8c82a88082537a42f564abaf5275daafd7773b5933e52c957fdbc35f568c46fbb6a705d6cca8e129679e24163ee78a144cc18f90ebf28b49e845bbfc288dad431e2712d8caf43f47c05cf141fffa10d9862272e1ed7cec26887b15070e7a1c84bdd51f18cd6094a8284e6798532cbfb1f5854747acfd388bf7eb7295734c71b56b2b10ef1dfbd9a0017ea673f98fec875fee93331ab189aedf1425ec237ce2fa1a47f10acdf4faf921689526c3ed5bdf69cbf0043aa3b38eedf7cc061e56fad635e40728a12244403876d2af292e9903d82937feb67ec8a3abd4a498be4f2072bfdfc3b6a5d80c1df6877feaefb76db1678f92c8e4a0469f82144cf441b7704f2ec2e5a7bb582566051a955daeec09cb888d6998188b61969617fe9236c86e5f3a02cd8e02f607c683ca846a50bd73cf8f1154be89b565c1f11583bc7246a370981c05288d1a0e124791e4c891b47cfbf8fb10c6f5d868a5edd2399ecd41d666ad5b382da8ea2e7944c6f0971e53e7ce08fb1ff935d715454e5b1932f2c66f02e5404e353e8bf15d073f68332d9134486690dde3964541f976e021d68c7e6dc6d8f4ed644bbf7017aee53c4ad33ae64a57e8dcb0ed8d0aae600087315606973094f0fa06b9de055b4d317049a9baa6a40770843d05c6d39b783836f45cf903e1d363d332c14340c1be10c989d1fd82e022072a8ddc706a34eef6e808eb2dc499d1ec613dca9ea9a6a024f52306e0b01a6c3f4adf08760c158bb7f5338a379c3680f6e7bc81a02771face43f4d881e1955d265d0b74e5e921eac817f1c02fc5ab8bfe96bf2493f865839b55cb1f22a92554290b94d043f3606e4f4ad4f9021e6b177ffefca5abcd7dda18d3dd709c1a389a472be42071a11f16d6fe9b114b5e427f3ff23fa2aaec3833b2e50b0023031f314711156cba5e321baf8a376d6b784d8c2a28c5c752030d548cdd46992665e9192585ddb67255da8173bd0c509ec6802464dc08cb061a3b62c56036ae80b136b02f53d48b6217cf04f1e4740ee7fac52fa4e2c0bd3f953286d0c1f0340a85712b1aa26f360f4cce16db3536a9e482d12af7bc754b9e150e3222ba9209b3c8b292a04b7fb4c15ca79b5677c209b6df0c7b4d677f08ed5280b16e76119c08674e13bf0f04be0c9116d5118c67987d16704ca821780f8800ad700cf50b15c0892190fde15f58d50db978f14cae4d72ebb2c3b5c72d39d9c8c9e2e33e6103622d6020b693e74dab0205e17a6332b5097b332b9a575c1c3c0dc6fa131d1c8e541dbfa97d56c3f4c0280e94cccc138742d31e0e9c53cc632c3ce508", "0000", 1, 6228573, 0, "94fb9f085cac47142ed2c660d716f82d24ea4865b3a6609861c767dd7d454058"], + ["030000807082c403025a98e692390c9e4a7d6ab592eb57aa87fef077edb07c3f781f94d21f79661d490000000007535100acac6a53ffffffffc0cef569939f19de49e33a8214d9cf59ffb78355762fab9e69b9a6beec47c21d0200000003acac53ffffffff04d7875805000000000600526553535144ca3402000000000853636352526a5252e64b9a0000000000046a52005222ceae030000000002530050db5c2d18a7ceee00", "52", 0, 1579952190, 1537743641, "605ee1915d0ab50351cc959185510d445bcc93547d5f04a2a471491478e3a3f9"], + ["8e99f22c047df43925b375531ae3b10183c2640fad8df7fafc4733957a5050c1e786cbaa8b010000000363000082da05d21525de372e20825f253ec5c2240b06cdc106603609778ace6382479396ff62c00200000000ffffffff42f73d0c90928e383a26882dfe5e8e49455f8d7d3b1a330a4af3a63ffd6e33ba010000000765ac65ac635165ffffffffbf44ce2c20c54dd8d1386ec5d6fe7d1a8c55156bc841d29deaa10f26c2f42e9b000000000963ac635165ac00ac6affffffff0218469601000000000038275a02000000000000000000010000000000000000773f61040000000001c6081b50186abd649b9b2028a459f9efaccec0a9966e4564a0e31613816528d5e17e3bb4d79c1c5a5f8655d87192796370342754db12a369799d137a4267aa330d136b9a9ac427b6cd600f4e1af9be20b8001e638de199fafd14568405f38d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d952cce4d2da07de2aa2937521175ca9f893faf09d2059658302a4157f946dd63d847c2e5f0dbda49fdca6d10d5e287a2bd60ccbb9c2cf66251d8a85c7ce7f23ac0592499a3ff1dc2890d7a014988651af6e618c6b736f500b72ff458dbfbbc5af14990abeab53a12bba8594e97befa1103bec262049046f0c6f3df0a031f39031ca7873c056b421651107b8bbf9dcfc5d8a0e0c5e6bc3fa817284839a8ca47a40206c62b4c7a57f0cab0c3a1a786d84e5a172d3b7f002db4570bf286ac085b72ba0b0389731ac164febdf890b4a56eb87345d0c5f8521327772c480b75e9d1444c4bffdff4d26ea4fd6a5cbfd0f81163fbdf0ebda8507747cff115be1cc4f696e56f021ed3b85c3d01b9659617becc81202bee7f873e511950bc1d1dced06fc30eef20031b35c26c330a0d2090807ba621d2643ff7ecae4ba8087446fbf98ee693c375a3021cc83cec3157eaaf402c91dc37aa64bd5c173937551b2ce547b972e69cb3878a032f49b4c36c66b924a030965a51447c3d27b68ba638acf803e2cb52804f60f3ec02161df1a256c232c4b6f3941d427594bbb08a5fa7b043d093dd8d9af3b2c24f5dda9a69a501b354deb861382356c317c1379e7b3bd12eac158f4c397097a1ac72df6f645104be97d8cac21e66b139cb2b69fe6c20ddb6e1bcce0d31bd5c499b3f970b7b91ad3ab6f803cacce4bfc474e39b337e5a52d4c5d4641c6dd7664348c4bf4f19b01c17d862aaffe0119ec50b413d2c6f477f10d8bb59136bd7f54c1cf1ce9fe744c27f10757bc17087dfeb5cdf241acdb8069551ce9f8f4d9a3d8ea38337e381a2a8d807a6f3ebdf7230f095c2a0b02ba7194d383237c5dfb1fa91497d2d35431a59ccb18d5bac20b4328e10c2ebd12fb435ab13e9b4b4a46d222b0938aacc0a5bb76d2e26a0a3a0937b0dc4bf390f85893cdc8795fb51b8b6d926bdd3be20ead02cfe68a715c5f969dc078033fba244d8e098f83f7bca7de621ca43a8226ac48fd00515727940942ba723514c9463d189a42c5bd290ec828398b78f9666f8c6445b922f78cb5e9a82f12157f083d6e231321f6a1faf83721ce02577d4019b2da13e9734e1b51fcc33cfcad7cf27e162de6ff4f2e23cd595eca8206e9f5aeab4b9c80ce2461dbe611643a049ce1809866c84b6afd96ae5f5796b34f62fb2755e9b7353b50bb05b938247515c671f579a0cfd5491d377c720f880bcb39c6f7b96a16f1340e8e906b87463c992d52dcac14c84a66e385b6f55ddd10f6016f0c7b28293c0efd391ad9a36cbbc0bc903086919d38753abee2e79e99c04e4c54e70e96bda782fe2eebad55e4d6dbe53d44439866f988816736599570e526afd4d8105e429e866047d9f6d2baebe23c9622ea383423575346bad57ede134caf23cbfec8cee1118e9ad50b1dbf10a293310b27c8aeeaf6fc1b5b22a4645660c2741960a3e423417788979d53e0599027dbd12a1bd07e98e9f1457e944eda99b46a7d0b2bea78e7e423e87e51670ca9ec6cd5dd68eb21cd228ebc1ebf9585e1f33b71be5ce171347147d73b77522e251bdbbc8bb9b51b0095e452d479c1cad8a2b3e028a77e076b776a6a07a4d016572728fbd398b4dd0eaf5ef4b54ca774a5a495b5313c974d5a793b45459cd0040ecd26aee7ae7e99f84a273dd8119eda2c39ac6b826676218aa249fa682a2c99377fe29ec7f76e3253411cee96819109728f756644e9f4913174a140ea67bafab332ed9bb32c554a5eab2970afab1909901cdfa288f8edf0d1fe1e63922fa7dd3ca08a62f350f83ec1bc6797bac04a4e52c9fe6189533cff1fc05f1ef046aa9d23cb9867805d61b9460a23f82c058809c303d612f1099a804cb943cc6911c55103a05406bb7a29e5036df2559cbef5859394199d661f16e4d146c3c5984efe9657b64eba485566be70bb7b6bd2c3385ce68ae21d5b66542fbee75ce8208e41742520837da0819ca1d49814fe169040f3f310aa27bd9e13cc0333367d7930150e7beae8320ebc01548606206a75012fd44c2360ea8fea73ea4295ab95580195526668df2afbf777bcce71cb49cb517e77cbed60d6eb707a87cf548044b241acc6bd7eed80e2e28f16faf0b1fb49c6c8d67eb25cfabb34b5545c044fb0fcb562e8bb0d26c86d4b569a1359972f3987a1687b6aa58866371e269aeed3a380bbc527147132be113c167f74e5e8c00318a9fd791b69d4b382a598ffa8148ede7c5f15da353f0a630e95c370ab6a4134d328f014951b3f2b4c732336e1588545d62c62c9d4aa0f2f36aa07ed65780f131b66f207845af9eba195510e2b01f111218fd9fdf9d0b973d5328d9e5285d2078c5c8f18de7e3cea46b4a437725c7cf5aff7e57ee7e6bac37f4ad874ae0c105a4ff4a35de8d2a4fb8c13dfe7b0ecf3b4c838cb357838a00", "53", 0, 1790690590, 0, "e1525e95e0f6b16982a62094d96b579e65f5677e46adae7f99ea2e3b5e18010b"], + ["46540b0c01c7d760238e1c42669d2bc0d6b458cc32d45cb378421f3416e6c00863f9d13e7a020000000451510065740b4a790433749901000000000252654209cd010000000004000051acad36d104000000000265ac667cbb05000000000663525300630000000000010000000000000000534af50300000000198c1fd025bbe70ef10a869ec44262288839a1d0608a14a8564e06d20638fd51130e87f54175c91b32048f5f6d7bb549a738e2f50322b0f98df8f59cd2958768e7130030ee92fc0372f2137062289e0b774b3dcf502740db8b3b125b186e8577000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000df6489378058ed1150ff4e84663e56f32a3c3b6a51352ff9d82195e14131c467eac150644436bd9373ab4c7b102cd8baa57d5f50e3cbf08574851ffe8222d2905871ffaa8cffc8c28d7f3687c6f98bcedf983f4be6124c610fbe98ff62840dc2318f925d655f37537a5081c63c981ec59ebed67776379871f244a7966b6e5230325a346de03d511cd34f945d7f75aa8887fecc1e7fc10a59ea3c0dc7161c3c255021b9a7119ca24e445b743d34a1e27c5ad2db2e988e56899bb0f59c4988e93b91e0a02b7a07b0fd788475b410045e6111d629ffad46e05d67c2101819ac7cb8483d082db9e3cb4a098ad0e2b2e9b9b3c8d93d2ae393a456ead353fb31ff0e3b4dcbf030d7050fc88f5d7a84c5a5c839e3543f699e7c74f71981d368189258a3ddcd5310204ffd852588ca862670ce9cae71565eba36621af78d77c73339d7b3e29de8f8e032ed6608bd8e46605e1881551749c5e7390259a74dee9bfb643f0a8d5003c959f021b67a5561ca7f174aede1f6352512fbb9efdef4e23c956efcc13685a9163a3b50229b2965f44609d544e07897c74173416883b11643f912e69f0890c8597b9f3bd4ae36b8452e67278082fc0f9779cbde7ce59f579d82f19cdceb04ac1d100d7107bc8664dd29a50bcd2b43a6bc9ca1deb15148f91bc1bbd00fb43d06ea176cfc8db0109da3b265da60fd5424cf1bdf6776eac2b4273b70e7c48661012a32d200963a2f5487d330f8002b0aa60dfdacde5e26fcfb1395119fb7dd589d366ba8fc82f46cc57da43a9fb3500afe95958c8e7f7c8a55dbdd0b7e86d5a6d20e578d5d77720e5ae8138e1d15c841c3f5d0007961b1273774ff7c3aa14640a5c4e8c4c61d5782b8925dd90758e461ef375f779cc3156a9faee1d64a7b319e7e02984de7e80114cf2c9c74ed139c816a5c2ec8ec1e5636abc53013e70a7d76ac7c8b75d37a7dab6c1829d99a7c29d813b7d949da02843a7a666f295699612b61229b91899cbb8d551721fd5a80537c79238c62594812f6e100fe78fce561dc7964023023b86ad75141f0a9c6af5245801c61c26f32849789f0c72f7c7427724cc77ec927f316773c9ec2e61cc1875b7378c38cfa5faa459b0beec888b0c35b022520edbf464f8cccf0a8658c013b1f16214a33abb2460993709dcb9630477e4d667fe53e5400e136ca75ca29319231eb8dbacc1a044a5b30ff01965d844838a4aa0b53cdc24556f7c210eb71c7b8f0f7e83c354fec83da45240164e982f46f4b112778ea47bf22a8fd84ffda7b447203b965458479242bf883ab97a3e06d748d257c6d8cef7e207707055d84c67fe743a03b0a6b3cf78949274863f09f3c7338622aa32411064bc4a1baafe2bd291f5880ed10396315e0ff5b36ab5200cfa074a5b278237d1cfbbb91af4d5f8c8c7bae851b47a04a9f9791d7983d668b81a8761f96f0a50c6a6f786531e3423fcc18b448ba3832ce7df45ecb8b21a33c4fee8372fc96587ff3950460d3d885c893d363de29c2acf104b96b0186233c4b931ed0b6be527477948543a46556dcb28da9d67ae66a285d57ab526c50256d53f4b483a60df670b206ff89fce276aa4b3f24b1ea568d8ea9d2d74a065da7a4894ecde97b6ba2d0f1650ab844e65b2352edfa08849f90a439b85bd1df8af96c4290ae7d1f4d04b2ffefe5c55ab30b29605fdf4f8e073978c1f2d11b6331efc70f5fa03ea94c8f5e82b73042277c1eaa8f7a82f7179d4df20278b502e19882b20e652992b640d10142c81587b6a645945d95deb91ec3edfe86146c8d8d676ed3cca92f0e1de75e3f680a9d5234e8afa5322c0ae662f315bacf57e28f792abcbb37b688f421b148eebf0264cb94da270871c360f5cb933680edb62f74e0ba33b4bb7f22fca8d65d9c4751d67bca683b3f96fdf0bd12e1903bf0dfc8519b78b61eb5ae858b43c6766214ca5d775bdfb2d93c7ef4f3c89d5868e51ff20ec3ecb0c3ad2eae9d1f5527e26de56c693d4bf850711c6390ff4dce3ceb2fff8d545b79097b80e3ab0d14f9304cfb37ac03fc659c3a3e03b8cfb11bd53a9b12c5904c4ebf4bc063d321afbb4c93375507d70c2a141e0f78ea75d216d090fc49d7119e9bf7189dc759510df3c4977d6b458d5ad4b604d94b3afd41c22d518b222678711d8b5df5fd0f1b7bfa1633b8141b81f85fdd91b89ddaee9fba8d48ae02fd8346bb0b6449ca72ffbcdfa87549a20414089318abbd8f1ca3db3133e1ef0826e4b934b79757486c1246b74b5a8d37ed858ea9b4dfa896999e5a79ffd321206c1ad4d4cbd6170671120004b6157a2e242371b9fec2d5242886dbb6376d181f2883a93b2298505e4927e9d2afc655c81b10430cdd71e843f5b78cb4c8c36d8089d3c6d40f69b279164a02a5db2a0638e9c05279d79a6b2542ca421b76e880f", "52", 0, 1507425002, 1537743641, "a028c9509ba7bfb92f434fe4b7e9edb3b61608635bb0c0b48b8ee0e114ab480c"], + ["030000807082c40302792f960ce50577b2b4880a83e364a352629993da8fb5aedf5090478e0abb50b3020000000353ac52ffffffff84e2a2b1e90b33dbfc4b31259b7439691c1d787865df405d979a903835f0c9280200000000ff63c587032f66e70400000000015381884d0400000000015354cc3d000000000005ac51516351609a125d0ac2851d0100000000000000000c2bdf0200000000f6a6a60fd2ccff7447e4e4cb6aa096c856470442645e9f84f13a7d5696af9920e986e3ecae8d875dcaba21c1627d9894faf6f51a5bcecd2ca695a12c72d80a817e847e8d26343d99e6518cef68e65ee9505b335b7a15a3a155b2b21355893db300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8d5d4eaee7e41efed97df1df99b16e12fb10b25d65de85842e13aebc212a454c31541da3506eef433b19384560e7c59a97a6c1d0ff92d1c6543a4d86f9c988277919936ebb94212ab08cb58a9a1e22f23e5817c21e8811bf567f9e0d54ce51b80a53a14fbd6d2b65c15294e9b3d6fd2e4272b9b887bbcb71852bb4efb95fe40023053bb41532de5e0ea540d99a15ae4d1d16658d3ba57b53f5f36b11d3132fa47021600333a6bb6336943621dedaae74f7450e168a417b1466beb3a6bcdb27932ff0b0891cf31c8d3dadae4f76e9721282c3bb40e2e8d65c29bc8572b3bce588131736ab40083154313b5aa8ced5d1ff5d0a44e7416fb7c4a14a90b30d8dd5fcee13503157568cce2c950f7a30ef3bd193a77f8d701c9f00d14060b174f006500d2cb05030aa5b114771de0b514c97e9f94a65f0a69c13f9bfde508de98be98240f2c4466030e64b0983bf0e1fea9d86206dd3244a5ab0a7fd590c5d4561dad19baa671f0f20229b2966f42f9b0d4b3dc8fd10257c72120bbf82cea429d6b753c7bee58019e7d021049f0ac3a96c367643ca737d2de06bfb25c0db77a7803364bf35e9299967bf886cf40d832e0011127cd838498c35d58f051fb5e1cf80269475e2c5e3d5a61df9d19628891a7f89161053f7333fa3b0363f19769d1c29cf823987b0d8198f6cfe36290a0e86dcd598a511e6fe4e75ee7e5952d09ad85bfd5d4a295d3e937658c0a74149449f49c33500195a6a31bb5d2a99af0ca027a826a39112d9163bb3fe658a08e2dcfd72ce0a50fa73bb08ec794c754b9dd9a9e391166a94c75d3336087e97a5a88f401928ce63bf3ed94a65c38310b4ac8568906cad23c3e66c590dc742f26af33c74aaaedf89d1d8d68380d70296b61b2b060b30db8f166925ea8954cfc8c1b07d39ea6a9196b916153e31333d9b15489f777b807247e0b448f562ca0cf3e8a4fab116a940635b091709bf4763728765f338fca4e156fc09bb8504243daab3f5cf345a0d4dd410a3db021adf0393403cebaa3443d85d0eb48fadd42aa513fdb18076911a4877f0655c57c464d5c3497b86478f5c44b4b146d34733260a66b7efdc9a2f2751e8ecb2cc92dab1e03d6cef148b44970b92527b664ec3db560cfca7d70578939f0c2cf96f1620296c073d5826bfab7a66d9026b9b460673d2de5bfa5646d3eaed8743bcb37775a0fe2517aac0adb89eab0dee54d4d017bb8ebd01f311904225213c4734d18f0e73589ab386ee05c127ea7c098dd57166873ba0df55866e0fe86ada2f407bb9ea4a6d55dceeae503f36a7c885d20cfcfc6253c612d448f881873bd76fd46c87fb7a38b05d1ceef79c781944b0c4d3ff5323301f790f724e49cc5576df4129581a0c6a4a5d36bed869a1e614474c42b369adc4997817cb47c276475d44399e884b0a7d2a2293a0a574d247f6d99115b6fa0ca14dd3502125baa2c38462b1f9eb05a7bc6b8193dbeea3d0e40ce4ae7ff670182970123b38d919213fbf9fd9fc3bdd15884c1c267989d7e5819c415fc879b852366a38030ca5cd2994a24814f7b04e2fef2741b117d5ef36972a372787c7b84851ad60874c66c44ae4dc9c54c41878cbe3a9eece595fee7ffedc852a14f989567c3525f94354024765ba5cba98e30f84ac5d70a8371c22a1034df23ab7116a3759c1146c488a7e00ec1ea74b258b1a28f40ba435c20167fb59cc92e584534fdc5d71df0ba490fa64c76e53495fea5fa9f4564d928699d90c2920231fdce92877ab8585154af720b4cdeb72b5dbcdb5c4fb31d6a20dd0fda8b58b1c3a9ba83407d5513762eb85d297733ae7b314c0879bad5a071e8bbcc6a88c4e0eeb49b2ff924ffdb56bf6ecd1090b106f0c843a4e5dff4119bb7695de2c2ab66b71ff3e0bc9fd6abfd6cab40d06d456fe27a39902e91517940e52ac23d515e2f72a1a447d69172357cf2bb89a210e7f084f336a6548166a5761d09f4cbfa73475b04ba10f4bea4c0bce315a5f88c582c843a6416c6642c05805855ef47f8e247cc8969a8d0695366aae6d24fa71afe5255af5bf6f9581593dec0ecaf0af7f781469ef51deaf6990519e622b48f62ff5865dcb95fbbef129884ac2bf3c36caf93dc68fa2e72d1d8f255758e9917ad89e003e10efa4584f3b6d7638efa7cf38cbc4ea480fe7ea01439bd652118370097241c0d946ebc73b31343a62041264c8c5eaa26b57f1bce34bfbb0963e87c94d6ca92845c6668c6ce0fcb484e5c6adc6762d8b34c729eca7c9008aeeb914c0f28a124704e23c7c961956c0213a2b3e13d45a238d8909191b6389c9a7b7f7ac1b6177c83f51643b6bc0b5a85dfadcbc55815eb049b8ab75de21f51064d9b0d825150bff71f77549fc7192cb0923e7c6c8eda3d3b5953a3334533e1f8d891c896c33a49e8cec2bc63450a", "636553535165656553", 1, -1042677022, 0, "20776aba67c9ad68c014dcd473cf5d9782df23f938c2e19d063f63dfa85be0a6"], + ["030000807082c40301189e52b6e22bcf4384a23cbf46892abecd00d647d40de9aa1e880caa8e01477d020000000452656551ffffffff016bb810000000000005516500655200000000dd38a99500", "536a6552", 0, -1766489779, 0, "a5d6ef14881db0af538eb9c501fd610a7bc05eb732065fea2ba6930eb73dec24"], + ["030000807082c40303a0bf4bf0772494b6019c78f9850eba4842686cbd8804c96d60c3cadca9f5cfd30200000006ac5253635200bb661d621e0bdb140be68e661ee2f7fd85fbe35db18151b2bee1dd768d8de5324c49b9350300000008630065ac65516a522bfabedc457bc34c14a2f1a3dceb51be6a32391199b98cde5054ff5e835a3a6e2afd0c870300000000367e5de204f6a3c901000000000253acb9413a00000000000153d014a20100000000095351ac656a6a5351513b6746040000000009655152630052516a0000000000a9404e3e01e8f622030000000000000000000000006175de479a637dfddd29f3f4bb595776fd40b5491a27b9ab030bb8caee75793168100698304f20959f7fccb4b331c035e4f372d90518c02375ade8509ddac1d67eb4e40868ca4a57c6ca89b1a64b339e9d72ae94e32d2f3c82bde45336f600cb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f086d5926ea4b0f4ae0ffb657a5c1c816233ee6caf3db67237c1327d9268976fd06bc0ad6c65c8f0225c73e874230ae0bc015d2effc77639f538e1ddd238b5a4fac16c61be7d74d3756d3eac5830be2d887de767d4222c28dffd5979467525f4217ac436045a1fb7fdac66532d27ce78c5836e0605511a26ef2e29b42be1b46a020dfc1637336d97ad1946bc4d2cedcb5fc9f9b31df048f4b6367d02790147034b021841d536e564e5787a039c93bc2ec9bfb4e3f81d6a375d6cc41eb8f14857be110b069aab280b5ddfe7549c53279468595bd555dcebcb5af2dc1ba6a8c34e816d0ace8f8811859373e916997249e0eec7d2de2ee0daee1f60aac045a651ee330f9b0222ac536eb1466d5ad6a7bf2c89a1d4b0fd9f4096fe6343b5efc6ebaaa73722fb02212589910e227814083e66fea3b4f86b919809054981ea50b47a208085430eb9022e2b5af5f9bb646e70e9e9b98650edb8e5c748ba5d556325e23f544706636631021277d730619f7234b7631cc4def431da6ac8428aa3a86a3e57b62be721442fe30312189debb3a207539b57c2bbf6231cc834ee8c002198424c05f256c1eb18dcf952dda191c541cdb0316ea20970f81f2bf4c9905c0a417b7b8c632dc38de91fb979fb23be39e5444862e281a7d60a3cda7ec6a2a284070f945284a35f5b901e02c736cfa840e2c36325e215b443a0d9664378b878c00740962e2dccc29dc8a48945ff355814d2b5c87ff7a2b5a99d8872f5ad0a4d1373a537a180f953c7d5916a7f5f5f5ab1846eb6487fb2a7d95e40d37c727761c73c375bc60a10805926fa50e2dd4d6670a627e27100a4911fd6ac0ebd6612300b97b50c100f451a60f4b67086f93e853c823c976e8f998cb02bbf7c9aaf338b15c61931e3f5a845725689f9d435cc71d123e2ce4d3f18da9238bc675b2a0612136a7b1e0fbebaf48a2d11bd80c7d21d3b587263253a0a832dbffcb8eadc277232ea4cf658fe1e5dc6313e827d24bdd637b95e432a9c13e2221b34640c2aa5c67873d927c5d6ef4e1be320e619a9e51599c36ce11de25df2def5a8555fc4fea58e419f7cf26f405897c8685a7e74c94d2135789075e4efaf1da4203f0d7b89df69713399bab0dbc26918f3f7ac981fbe7f3231d37d7cb31808a04bc7c589b0694977e1f274b73282cd2024141622f7e9ff4757e031b90773b4947d9f1132433d643d890ea39afd1c99e537dcc3ea2634e584a7a2ebf58a79296696c3d6de8b5841005420ee5c54c09f260b2234693028943a099bbec174edcbe45ec12075b74e2b6d60e97e01fd60f5e9da7d94e575aeb3520e0424a0ede374468ade36358587be30f73f8524aa9a69cce8ecc6b8168a0d46fb25c502d0e73262becfcb0c7f66509cb48307643d604f84e4c2b25e429498d0f8473c0be28ccfe3d9c2e106d04661e6bf75dbc0b0569f8341086255d7a54ea30c96ff516a247bd1a280d32e58684ccbfbce7ca59854046249bd8c599e23b077b7678e7d7ec1f889d6104bb50d41fed447498953ebfb8b36df106d4010d64ca0ae4e3819ec46976528e85d86733ef240050a5103f307b763ab6eb0374193596b0deac5abfb3727f7991a8ab13659f13645770ccfae6b4ccf6ea8bf61b607459b9248422141792c23ad42095b40b05387b9d27415d281ba5c87c124bc1e579f583daab947ac842adef0eebe951cabb1981993c59b0b57b3ab48074729bc7712176aa1c9db539c16f77dd480d8de1ee6ef62c2d261c89930ffb091b5f2cf38cbecca68bed0ebf2bc7558c037a45dcd2078f71585bac2ead125249e3083599b8a28758b8277dd7786c8748ad6b4defd9049ba3cbbde82da3065f478d9c96b2bf8ef452858c13b300979395d8da98b2f7d4a55ce1e33bd658354ed197269035a81d6e9c6c2afff50ee0b0e2d4b89c2bff247c33101d5f6f9dee68073478a72a880b4b047d5e72b065a9f0d95334e8fdd46467ee94e6836a8d7e39bdd0ff71357005a7dc327710bdf9661f6405323c7a79ea3ab753b7f6f1fb62f0d17c0d71cfdeb6a79c01d32931fecb361c0d53f553a96734e85f5ae28105cb0d5c781bd501573c6a4c56a03e6f09afb1f9bbfc3a06d09da0b316f0a89ab304d427bbb6b7dfa162cc6fa0a65e59d8bd11b28b46c7e97607319c0af1e77ed88a127e8d22076aa52d2f508d206847e0bde7c4528387d8c1170a26dd0a51c54b07e087b6478e97dace6c4b430a80fe2cfa8a6fb93a1c2a19515f4f8b2638ebe8d1570bdba3ff0b54980cf235e4b990830262d1d9db22595f0d6047347403b5a34a6a1fafee87bb58aabbc84c8b1dca428dc7a8d270e9bcfa34e601caa43c4b794613ae70fd9d64f0c271b005962f68272350d60ac61d533a926847ede855b861dec315c2aa5abd2d88d9ed7be430ccf76bc3232df09", "635200", 2, 1557548552, 0, "4e75ab0de6931824722a9d03c56648aa2c2b5b0d1be95eac9416eefdb1fffdda"], + ["030000807082c4030154085a808030f541d346e44af478fae6b293b3a691a7dfc9de3375f486903dd4020000000965536553536565536affffffff0288f5e500000000000005c2dc0500000000055165ac5265000000000000000001e59ecf0200000000000000000000000081e650435a33ec0f7fbf34a7e9aad36c1c547f9750c7a1a14629737a8970b230cc619238027a399ac8dfab71b21b6a0a8d62dfafa1e6fbf600636dbce0217fd3ba7a7036186a0a5155da5efa7f96b9707552be88335dcd544f6ce1572074523d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a04ac6ce19d576cc51a7069057876843ab4a8aaa11d9342c5a17618f841f9725b63b4f04f87daae25ba9883e186bea59d1e3a9ef304217296a0320caa67d4a84e229bef689963a9cf3a0d888a59d8e8af260505397b2ff68ed971d28ac9996c56d4ecdf42d2dea125caedcaf4790ec3570363923847bb5167460bdbbfec199e020f10d21c1d1352937e9b63a0f764671761d6bc3b4cff05a8949af90128183f940302b9194093c515cff586532e11577991d8d0aa788376de08c7b7648e9db99fe60a03fbb90ac7cb6b676823eab6e58499442bdddfc6f880f05335e99c57c63f43165af9896cac259da15565fbd888718115786a395369aaac82de6463e16814fa38022a1927d9954a153e15746e962341fc984fcfb5d478d97ba0ad7bde74b5c84f470326ff094c504cb4480751d337925b177de1032ee3b10249949abf969e65a2897403234fd3d7d8b7b2765149365101fc3bd38d3b01bc17c8784335575e33a749e96f03264b3e92bdf8542b1e968d14f0b31cdab30b89040f87972ff36f0a7a8b12e175032c33964628fef191357d0bafbf969ba3e5abfe8c7c820f38bea8a318f740cff376195d9eb0c01ed81559c7ca07b43546c95f07a40db9f06484978cb4c1366cda0841a033ebf9c6d4ecf7245aae2a6c76dc51767db05503ad2bbdd4147458a3ea1406a33a2dd68b5bd42024d9214b759a6ae48dcaa459e7a24496b8ac059e7c8fbbe0740d96f2c79826d16f32eebe789eea7e62535bd3fcef11ba78f9655dd82601194469e1c8ba869e075401b9f547134984ebcaa7ca68d296452c5e0c6ec1a3bf2ee0da0989b8923e19026ec6eda82070bf3b76d99ca125ff97ae8b1f7f16524d7d39a3a0f4dac2a6b42700fa6680a0ceaa0b8d47ac60c3a58faa705b888ece84fc72e7e71558e9a4f79edde2406aad08dde4064cca504547d058abf57081b7baa5ac2ae52d4f8bea7cdc72b2fe99edf131248d22c396c7d53c6580722516295e117705aa15a1bf81fe0b2b9841af31304e77f73bba0b23752e34e333c66a579f43ce409ac2bece4fa4eb5743e7b0baacff99ee8d42dfcc487eb500cbc053fa89726e0ae6957e1a516358671e948334ad94ab0ffdf82729760145b4de0ecfdac64149ffa363987e263eb741ae408762581fa530ed1010a809f971ad254445ec21ed3bb882b778a379d7173fc50f5872e48a8445df3b4293ad2f8a45dd3f5a6865aec02f5096e178c71f85b49e1cd89a89c32ac8e7a7c31a37f8a1efc09030b4b81a858ca762b8fe747b495c46dce77d8b775ceca0e9438ef09e1ba4dbf4d68a7a12bcb3d3fa2cc46cd166aec1a9c7e22f96afae0b15194a8b65ca5a0237292986656f3d44127dabb2b95291b29f6436898b721cedd08bf2252726d36705f6fa14d10c2483637dc574f9c96226745a0f6ae71b63a8fb36f9bce8ae7e83ef80f22f6458d7f88a38e6a76c3be66589c2ec3ff27a32f23837e2a8724bf8f97e9ebd5e923f35a55ea42dd96007a1308a3921d28ba0150d538c5e6e59f329a93f4a5bde9786bfaf79e6ee7378fac3979bc283d7fbc0e7da72eaec94d3f4e8742583ae605b18ee1e1f5203438e96628b9ce48d0dca502f0df8fbffa616c9a0ef87e3ae68e68a4dc602aa590413cd6129201f0a9b3b6df946655427c091df521158bb6879a8119e7866453a3e524caaad5118e0c2c0390f9d5a95f589af03d8cda490c07185053ce513a7b1804030c049d0b9f32217456467a94d5d78bf37fe96bc2b8bb4cdcaa16cc8ee30edd205da07cfcbd42a6552bd5b61349e8fe7270ac97dec1d2c58cfc84e6ae140083b6555b5e6541dc326ab982b130bcae8dcd3127452ff72429f368e1acdf13df1c2f019f263bc1416be551235a21a3b2071435102dc35e8455575f040e12c776b644ae16541eeb5bc8c149e7db721e9c2f7051b9de3ef897899d28fc858809b8ff408c8c86dcd6fce2650c59f4af27cebb211041c1b0a0b144435fc858ab83b6634c4058cba4ebd0e0024ef0f2e22f85d73ecf88e1545181462ba52b5c6d6d64251c603433ecd28e0f7f655d661176c0dfe136a4c6828af8a80db811d6f06f19a0109059fdf13e995d5b618e031ae5138522f3305a673cd55a56cf21d12ec2cb3ba945eef2f4636d51447a8c8a415ffb4aaafbfc5b873af2e0c515656e43a69737a77566fac923a836e2ed2ae4b6f6121131c9f2b6120d8b314fed707302b5c040b4e0991b61f4fe4ac1af8041eb76009dd3e2a91cadf2d18ed6458f052fa9a953c3c0f5172fe2ea64bef02668f727f9bed42cb01a965b4e88fc744004bbb5f900bde2cdd511548c3d16d0f4aa2f1600cc08252ea6a92280ceea91968cf1db4a7e456aa0b668960b8bd7c1b1923767cd5183bd44a8f36e8c89a9af49afa0895cc0bc1d8cc09e7690300", "636553535151ac6300", 0, 1325790144, 0, "95e415634db50c3896db3382ced1040db0e053f6408caf4789f6547896e834bc"], + ["030000807082c403024f785a7d2f0337e0574a13b88062d26f5226b8fa25aa4cd5e760de522c47ae940200000000d674ccbdb92699089041f5d100731dd54c2bd8b9c42df18e1d07f3884d89fec047d4c356010000000352ac00e1bff32501bb277f020000000004516565531d9a613800000000020000000000000000c11c3400000000005cf146733ac689d4cbf17abeb1757e25745a6088c4388b94828c17cd61568d60556a4a9dbb6703a2a6d2314abe7c2e8539cdc66ef6bb9a4b0c883dbde94becaac1d5feb7b2778f9ad3f0126158049c74bc347d20fa95e9567a85ef67662bb63a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076fb660f8fb2ff0625aeae0b72c3c54cf5a6311450346615d4054cc6d837254aa1e0b0e51573f05384ba64279e05493c9163c38010296f78e9c617a72c0316cf3dbbda7bf86d620147feb9b58904480e83602e15a04ca5b7bba55a26ebd0f2bbdd3f3940d46b1d47164dcb31bbedc00a6f2da4266f2f577e6debac6700c5f898030474fe36d02bd811d66835c56ff7c41046f5c0629c654cd14d87302f38dd174b022ee95f64df66e9e725d651dab613a24b4d8d9c626de56c266de3b3c02c523a7f0b061a1453b3563cd7ed0c4b37d1e066e7535b6174855d577f6d4f52df948dc5fa0f1ecfa0958bfaf640074df22688ff8547a8c43c9b85fa240cecef59c46c618a0313c2c19b718391af298a181e1ccb16dc8e748dbc2a267e29f41c5524c1752082022165b5834dd923584117ac8441f58519b129ff4666520ee60da33057e59b3d8c031d4e9a9c209b4fbc1a4641b447fee829e93eb532b6302dde6febe70f949f1fa60213d19135ff3b8d4475ce9e83f6aa3fe285c3483c986b2a35ba721e2d7c5cb91102219844778e658794dc774c1ccb8b208b582beb3f016a898a7ee2d8da6bcd000f0dffbdf8bec6061864ad9fd26e29bf9acd17df29dc6d1c05893323aaea3612754ebccca5c9f413b5f4d87ca41552d147b6d99ea2ebba36d3f5e0bbaaf1e73ce6b58084087710b9f938fd1b74849ada3b41a2c0f1410cf5398ff1182d618440c0a643121b5d9babefc489c8396ce66cf9db5c357f21a33611e5b0af24f4e3f3ec9eab0939e82e21b7d1601bfd9ab924d3d023cd83ce4a13c0711001ff94e4d5fb578115682d3353a7e3bab6538340d683ec5bd1533418e6b6dc11a3eca840d90f1bc57a5574aec53bba8e5f63945662d8a8562d727cb604c9b51b59104c92629aec5b177d53b8023dbea2ac88fb13350275e3572dec0a14dca46c7e4f142406e0a3bcb8dfcce31cf59f999dd9068093293333cad732f9cca57120571a8bc983dd8bcaca1fc7eb381b3b138375babd511272b82372da18a3fe265bdea1f4fb160027b272407079d89d0a20d31b6a698b69c208e64d971943461e4a665b5e41782f9b75d93fc191b152ec71ab774c4ae71acd9a81e5f61e38457c931816a895bf18ccd7bf099ac8d1e1daca7ed7726d25fca1701b03273db803c2fb79883f2879a2f6f6440ef0bab29d440d8e34aeee0605fe0ef15b74bcbb75a9a572f3ad7e8de4edb371ef4cec3cde8ddba54b53124f0d695eeb6f35e6bc0436b9301b76ac4d484e965b00942621f9217afceb1f80872bfb9c6f3cb04e5459ab6c1c9b3c84d27e2e02b284516f71ef9c86be8ddb2659fdaf64584126120398ae21e5b5a82b97a6daf6cee620e69a09bb372aec2bcf677e6e447f2b41ad204264e3afc0cab7b1cdab712f1bf8c6a30327047f290a48f28be15c8c1d4e996148628b08f1c962cb9c59426119a728b94153fd55a9cf8e2f5adf2cf04476d001cbb31b8b57c6514294647c084738cee0f8126f123952d380065481af39b31c9b25bbc57ff8861bee2e73d0bf98956a95a92b5c08432c658610861af67584740c0b5e6a81d220604d485c895fe19694b45879c8f0e4c9a51c1d602c5cd73b06387539ca539770d371b09bbc3503a8eb835a461d1f5d4b2f1d791359f815132fd94c3cc4a7e2005be0e2e991afd81b2754c91fd6eeeaf76fa015342f53cc711ade5abe33557ecf9871713651b24ea7753e3a7c44dd023443354581c14e6e6b5c4f09d095f9249b4c85596f4ecc3d9ebdeec538a52c7354281782bb1d07ec52291564b816cd1443291e5da1405f6572a50a594b4ee36217cde798b81b93a8bd2903177b2b36d466d82e42213160fb6c035f57dd7717e6dde05ae9e66b0266f5a5ff2360dc4453f9dc66e9e97433ea955822b04fd6dcec84a17aeb07406b5e20ead8e72254f589ec15eab50cba73d04f5e668c9666fc24b7bcd96dad3966e64e7804bf54499dd5e6430ebb813d6acf41df664afc39d687c4ec63f7712081c02074a5becf6a1dc1e7ca93ff5ab3d98cfb626876bbfe5c9c628656cd430082f85bbd0e00a83f34d2f9bc9a3f17700ca3118db9a4d5040a3c2cb4d3ac0cca5c8c8966846352294e4adabe1c1d7dd64aa624207bd0a87a0a2fbbc2422cd90825f389a15eaf04be3a3a67e91926951728c32588986a865a633c04b03926074223cb2e790bce2c225fde8a933bc25bf5dd1457e3f16dd8f7b6b1bca4cf522f793dfffc99c4b44c8d9d4647b7f0e27d5c2e1eb3229edcf78714adda0ff4c62bda160028000000000000000000000000008c7b3018077a926e494745ddb927e8648a55c00cc939bfc52eec9bf20935c6020465c2bec1f7e89ce3f02f00fc9301c3522b5285010d8df34958c950f928774303f39b93ee170ea129d333806b6bf57864446855e5c672534e993d2fdbc23b27000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006543ba4972fc8e3cbf8869444c778b8e0896c5598add7691ae658f8b5bf0d471aa789747e36570ee5f8d213ea2b943e88330963a7e7483eb3389dd9323e3944864fe4d7318118a93a1d65910c950d948def213709b9b75d0af7823c52926f838dd9c1a0c9fab4d41e183ed98024f8d5edfb93b426c44ff0f869f461a78ab7e9f022948a54e1f3d325cb2d0b631492caa864c8333db8eb1b5ac4e0c0bae17fb8b02020f9244919d44958a48b30f0b5ce9abef1f72fbd52f684aee143634817e610fea0a0521107f0485016ea27dbf25e90edc7ceb2d26249f576ca805905c17017cd293dbfa32618879a70c9b2b748e4832842dfee85261886e75c0a11b761949afc8960207702048f83e40de5e79a58d8e7ec99db4643f5ced914d6d7f5a23b6ab79d79703076cbd51804047744ada7edebc876dbaabc561528655c5e22d630dcdd6a40d78022103c2680eafd1d56c2c19d5f5950a00bd06fc38665853d16ca02f1253ba86b5030149d235d82c265c23f16188ab7e6152d78286d454d62f945dbc2bee64f020700217ec469a5285ef6779c14aac295ac0cd78f7050ee0e756adcc185eb0bbc7bdc91a9e7f473fb1ddfb942b814a937884127e97c3246a85ecdf3d446bf480dcebeb396f742f682be7dfda67da1da023f8c3178e726cc1f90eb0cf81702d0c0f64e80bbb3590441e7603792983f7a48311d18b3643d934e6d78e0ae514eebe8be054af4e4a57e8db4e85771c29a65a03c47280e8c6ec22cba834516aec0015927cc2e9fcd8255de0bd61df87a91ba1ff7f7446e9c1c47580e7cdda29c3880e0dfbbb6005dfa847a0dcf1bf9a409074be098ba57a87bc5610ef03a7a6034797a2aecf738bbf463258eb0f30277b497bdc053720548f7345db1b4d4f24ba8955adbd020af4660cc0af71c658bc0a3f2684ed2ee306b61530b0a8d22d44e3ccc1297ff8d46f2f56ee3fe1d4d77e01ee6c110ffcee9292783a4cc9ec5057de567f7b65c217e2c0152f04ef7786169d4bc1b84d94e3de3fe7eb574348605febf8766fcf3675b8238db8ef8f5bb4d1b51775c707e73eb0bc1d14be52fc036b65d0cf64c4cce8888e757b40342d1957974a414b77fa4768531f5eed5d768205f94e10a120f733605f314ffde7b577394d1412d955eeb79effd79cb50fcd9dcc55a6cb412f76e62095b688cb4716f5428355ad115deb245423e944f3474705a15e6afd0c0f0d56e092b0aa99f15358fff75040de54d2e2e362d0e6a609d5f804dfa1062d873568c45f1c023a5a240d734a717ab94887f9cf21212fdcef82d0ca4c64014fe6f5de0d2dc84a93982b3f9fc34a11db258892c5c3a17d783038150408b4851613c20bca675b32e9b66946558a56b0477866b7175eef49c4e87da42e1d861cf5cefc4ad00b2cd55eed7a38637bb0ab441dab5c939ee1fec08dd3f4b359a17ff6e5051ac4bb0b2b6a355966462dbb0aef7fc208823ce4b2597095c6fda6eef3429f5c94ad3e46cb1dbe8640ec0c0c93d0feb8032f0393b53d3d570dfa547a2cecf84611c9440d2628fdc6f67761fdc0840d66792e5b9613801e601292d86c7851d8cc12d32d8b1004b799c0308ab5cab1628fd251ac83ac26f830a82d8e1b1e3fad707af6b1a5a96b071d291c04f18489f6c65388cc8dc02e76394256cdf5dc6566d8002cabe0017f7416df64be9f1ba9710e7136b495009bf9e3f3b97f73bebaa766c99738439770c5e9a902af9dfe54ac5e8bd17635632afd386ed3d6e5169d0e3b22811eea56575444f6b7bc878e409d648b89dda793344826396a9fbac9660e5942c7b7c1e59d98ff5e748a96eb1ebbb562c0e5b4490532736edb40a8f7225cf4dc73616772607cd03f74413e076d7c0d0ba4a46bcb6b014a970ae2b96d7935f5c3c01181891658b9e85acdf23986d15061394e68cb13cec16a3cc8ba9b69d3056364854d8c1ab0d43d70beb979edbf0d41c11994ee9e3a6de3ead0876ab0333d2cf7975a95ab933870669fa8585470a94f6303bd29a9706a378d110c166e85b7befc77e78437b0d3b107c53e1c98c2aa0c9e89d5e98023a33a40dd52ca810dbce648779ce405a27d998613459e1822449b8094a81548727ce87d540f1559e7ef601f75e05acf7013f53845f9e9c45f71c1aea51ffeddb8fc3a3c5da367ac04d702e34fc2d79cb339b4920dffb9baae9e0a69ede939d5c0d4477c9d31c5a7eac4eaa2499c1c81f85787349afe7d42eb9a12b08b75fd9c8bdcbd3db627c995d36bb6a2484971634674ff023cfa82488621c75813820a4312d98f251362b356ce8ef24faf29265644d9ddb11490f0e4ef0cc3f4947c6dbb451a6ebe5c99d4b7dbe27d793ad005c880d985e43623229ad488f6894d16a99e90aca0b642e6f4db5bcb5f06a7f44c85d42e1865ee1d5d2f6e24b70d", "52", 0, -1688408134, 0, "534b1681ce20cf207eac2b8dc945e014cb1cc850ce262dec250a7d9e0def9874"], + ["030000807082c4030139b57efc1eba8f9d5aafab8383d6ec589eb266b7bb33b718c70ab2837f3aedd90000000006ac51ac515163b8f7bdde04c7c1fc0100000000025263a386be050000000003516a63b786b4040000000001529e09e50100000000035152ac1e6523c529f478fc0100000000000000009aa8a504000000006cf9e2039b240760b486ffbf238e18a7aa22eef3054302285a0245db620ebebfc0842c1accd7f9c147fd2efd61876a679c82e26cfe10f4c6f3973058b7ec353b6f0432c8e702ef554875e99ff575d3e242abe294fb0f47246f99eb40cd511f3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000178bbbbd513a0ef52dc7d7f1818a3743e0bf3e56ea8745f5a57d4c066bdb24aed8e67f900d0bf2865875e3d6e885fcc5b0cca57f6ba4fde22e8cae2a98eaae80536936dd1117c5b0ed2cea53cd5af2fc2f6cc92d7ee0751010715e8f10897928778c4b652fb871b0690f133f32378d24c92c58bda4383dee716d5cf6639d6a4d031da25c8aff660e52aa3e10571869e7fc77cbc670d0005d1a5fb35676551870ca02031d5f9881ae28ccbed8f8418fff5e31e8e5d821a6ebee1d077ba018d69940f70b06195d81015d1441ce12f16a2d81502feebc031aead0d482dde1138a40ee6b0068ac2546e9457111e2b7e460ff3ffd57e802ef0f57c842343130ebb0ca062b2403206f2372e2bb10478364eda452973dc508e7e3025fb0d3cf265182daf142b3460208b01528f36eecfd21a7a855d9c6e93e78df942718c13c26353ae6393db24380031fb3b50e33dfda07ffe5ec3c11311c592f3c78768fa92586f745ea90b365261903191006b5b23e93b32bea68901ca4088dacc3bacef3da22bffcb2951c416bc1f9032f682636b7cbf619e39d69846637d71fe9d4ec9a0e5a82524b25f65e0cad0223b7b21eddf01dee70bf66db5da7a28c189f102ba9307d2985179798167bdab7529314bdf0bbcedf01f21f8d630aec8a3c74f3f7808255c130b3e8c7b79c73d6906c415958d5f9adb4106f7086a9a715da6a878870ca703d6d0e2170a7c3f9b86bd82cf1d2bcd5f879e85d973e0efdf98ed939c19f7b02c6d116e5b0f6cbfe6a0266512bd668961ba7007d952d5777121e644b6cc1cbb01fe0e8570061fd0bdfff4af126e18e779cbc49e8937524a32929f20949ff971c7daaf63e6441c3ed682043c6799897aee8beccadc8bf7cb92a68c66571965a27b4e46f20d34726e2e61626342123d56bbcf2eb93b5be63b87c5a7eba283d569baa930edad2f77033a512ab2f47e7b8de446604c5c3fb66daaed6bbb0d3e05432811b1c8c6646ba5f25f4987beba31a3490f0f77dd4fb64410c36d647868bc0239beb5670c1f5c6c3fef70d28dbc8acb147672e1d72df8cd9233274800135e1e76100e53d25f26ab04ae4d41d90fd3a6c00b4372b0211a0604cdabd4dba3e444f3208faef89d24cd6f66c4c5e81132bd07bd6c2c3a983f36af9670d24be93bbbe4f0f3fe1f4e091add655026db6ee8ffdbc038e0a8a5cdacad7fd9963c75019f05f36de00c510adaf0a951139324a7505ba93bc898c77eb0d318255fdd09420d5fa1c029f538bd63109334d7d4bed60b36ccb1af22ef13c2dc42385039a56086ecdc1e5db44f5a0e04dd273fe350e56319c0490fab1d5140294187b93b0b744a2bd8dc89233055db120cabfeaf0d98d2e803e544f393642a395b2fe398397e302379c17c9e1b798790e41bbf3eea0749a228ff4fb5faf18c8a341bc5ec169d36c8ada2a2276a2196408bfae3a8991e617c3ec1d9615fedc01455afdefd4f0acfd8b7a41b1c334274eef36f4890f84f65c3a6f057b89ad46e519c54a4b40cd1c49275b97444f59565ac103dad07970cf17db3e4f56c4807b2bde2da46dc70af13649891fe0964abc1b9bf31a6a860c917ba2037b045de52d0aefab54748bf350312eb75fec071dc5e13bcd871b4a8f23378b0c8bebe91c7a4c84c7a261df794654647aa3bff86153ba5b05a364175fddee686a1d70fb54b51f995a19fee1121acd5667583d6820123ce9d0ce4a1d05faeee92a1bd2f1a04cda541b69cf9c460316c18df2358add6b5415d813c3c9525654f528d73253da517a3cd2a1259558f50dae0fee2b7424feb55b945d02d3f04ea47c96c1f3ca995631012a9d45277ab8967c7e16a8ef9137a6e256cb704f38510f0f6807398c3a72e9688e2259e8f15fb70f77c51c8222376801f4ffce01fff187634ab6da90b3ebd72e857081d99bf34d38a5e8734b400d164cd685efa9516a0b7528576f78b5a673d9e706d0f8f1d1437789987dba8cbcb9fc656254bf6d4e8872777a1e4e27568b2ea88f9c512026fa060a65461e170843bafa6199712e59781c43a7ce2c0ffff131bd3ba402cd016de1d64eb14784b2123781f912a65f6b9035ea9303a581ad21ec33b1155ac95084edf44edcacd12985100534bd9fd8c0b3a400aec026a14d5522a0c949a02cd657f51018d7f870b85b82e332aaad78bbcd2a9c0c29c272c1ca75cecec0092c1bf73aa20e22bd2662a6f61cb49a399db726dbb74768e6a91c56f4b7e392933c911759c74e3789c4f81f42a7d5a6cb85efc68daad1d1c53c39c37bd82479a8f97fc14a62fdeb9d153fdaf5bf2d93a380773cb22d75fa8c465810cf8c32c7479e432d5583fde5358ab3b9d42bee62b1afc1ed7d9c1eb7dcea59134fb32c86405ed7fa2e1be5a84e30a216c12a3be352829c5a68b8c37830bd7977dacc6d0f", "51535163", 0, -1440258765, 0, "6eea2d333b0572d7e00e55f5a050cc2f8e9141b96ac228874c6b3b88cd9b1126"], + ["6179b65403cd9c683a3978abe35f1c970c48d737791aaa8b8ab30cde9a728a3318f5ccb25400000000016affffffff8274d6b51c2fb66ccb1019e2133b78dd3a2dd3bd5653f7ed035d407de27e4caa0200000000ffffffff4bef94c6af020f258672dae79ca7991e5621be6b08fda0ae1b42ec70d632c1ee010000000765656a52520052ffffffff02693ea7010000000006ac656351000051ade10200000000056a006a63536912dce5030000000000000000366d7202000000009ddea092d8676b888970b9bc22abac8387f2308176d753801a94df2ffbb7e4253030e85c7d04f85e8f93342d34e8785081616f0af69bd64d7d514fa34d95b577b2c039505e88bd98149f69475abb01c4a032076adff645f2fba032147a0d9b0c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd792e0a7c8843ce6fdba703b21f24ba7382539756f5022da27d6a4a224d54c9213316da406cdfa5850c617d8f6fa6e46bca59d60fb7245109968b11efbc1c4966e6cb7464ff8a8b4fbc493f53e871f99fa074680fcdd41407d866c7cac2da2a1c912afde91885fdc86930a6f35dd68f3cc21869e0bf587a46be995030f06ae50221f66d3adaf101c111157eb83bf83fb279172689e16c8ede2c42172ee543ce9f031969ebf69cd27780125f969ca7501d2236a93ad9711147ad8fc83114749022910b0839597261c7d5f6af7e5cf41196ae9b6e153cff369249d4296fd5a3173a1a7f5b92e31c657f9f7562caf22694dbc78c8dfeb5cfc0416c751590ef0f1e724d440318e08c06c93f28f334704f2396afbfd1bf1bf966fffde05ad6c695c23dc405560210ffe9641c495e9ea6b4de0dea0fda6cb15409a97df0c54f7e66018e237a2aaf020c7fa90382e62d2812fb184e32a208633a006afb507e7663b1ffbfd9fcdf8578021b99d298ffa3a5ca27883b3c06d98953fc609a730833c00f213bc7c9b629faf403237b2302aba895b949773db34c50e920ac68c7dd869d0540aa8668774822932a011d1d6638b4ed953d2297e9b7a09149d5d46dc2c1a2f83629bd5161ec5d6fe0ef1621f7ed8919a03b649f545d996992e956a7034108c48d3fc13058a188758f2a805b7da2d49988616e3808c3d55d20a6be2036e94f08a3520e27a707a34688abf095cc743ba216f08035b0eb6c714193b550a713fb302c0d1009d054b71d676f5148f904689ab98b4c2399b8f73316d4392b5af5cd15c99050e431c022cb6088825a6c473b99839742e9e6bf46c577eec81c1f99970840b26b25e9c762ae67758b17ecd8a24f00b3f069c45fa527271be29e8ae07fc5f53ff49f9e343edc83412937c833bb7c33a94b088bc0109c9770daa7e63861fee83a432a104b9def8176a4c492a7c09e0d979ac4ee538ba2630cdd95abd529e664800bfdbde04d184139e9dca420c482b2193da2c48922ca69f0b739f003fca28d2f15ba03de602926e0eacdd31d55cebd7a50ff6a023b7df0c699659623f2fb5365b7c75ed7d50833fa6d60bf494492b41845e98d9be823af7736a35ceea447aa093ca483bbebe0b7e2dfca2ce2a677033ccda421772c00c82c6310cc12781c6434d2cbc810cba240536a8a150568d6a13ab9d38cb498619756982276932c2f11ae21369ccdde278ca9287e8d760e5402d1cc27ffc6e325d6a7cd8979e70def59abc9ec91794c362b72fa00f40cacca73042d77310b800f38d5407826e88387697375d9b5edf9817773242ee510d42ec7bfb91a463cf31c9ecab8052c4166cee733c5dc64310ce065452ef2a498d6cb957f96f0b910fff0ee58939b9bb56eee23cc1b32efd0c946b455c02cbaf004711e502733ba39b3fa2b1c8c64ac61ccdf7e61bdbbbb875a2baffc56c7fdf54eb2c3e339654abf13bfb54532f92694913a98eac1193dc8edbd9935dead0f63332e15ac557f85211f760690861ab36a62227a53dec0ef90924860568d9f219ef1f739745558d430dfc6adda2262f4916e3ea36ad481a33296995776a7c77342b8109917998b1771eabb7dfff6ef01b457516270635a9d15bf9747246dd786d9208a18e28a3bdcf498302e33dcfb1f811cb5d68d7aaf2c91e2727ef896349a80192d5fb47305ff8bf74cb95e29efb19002d9b9bc11d1c2cea8fc84d59c18f369ce5a300af06a227a68780af1fa9e6f5ac88751526cd756fdb0a4ffe67e60458a3f208c7f451d92d01a059e5ff7d81f77b097b32694be7b3a337413d33797b7f0d5306f702eb096dc00bf66b9117d323cad11d211bb8700bfa567ec2994e6ff5df7045b147a5650bd51bb1f845431c1ce9f2732af29fa3381876bc62d616efb28aa75f5117732b2823340514316ef429dde865d78aecf9f2f3a2734ff2acbe759ed69fe5284786bf39105ac365d9e1465e979841e6a6f75b0cc3d7018e1949b8db73ea21d7d46eed9ac7cd07e0bdd2b1bdcb463481ad64c2fc8ed4b45f27c2dff2c01da192d6bd10509aba96fc11be0d7daedbc897ce87f41d59c9aebfea29a7005308baeec141e077198f3be5e2adf1c74722f70d5ae7b89d90a91a16fd11dc17f47f600f97496a57756eb38729bbccb4a3efd495bbde17ee8c16abf968bfe4c20a9ffa9aeab8e4116f4b01d118faf6413fb2c86172c223bb3f78df96377fb11edb585364fd69e8b6b95064a35e74168d3492341c00b62732ee7c8b68e67ae184a9d0a9305ed59591b53b038ab0000000000000000a4706f0200000000537f8bb18206d1b6060303bfca3160e3554160bdbb4d87fddbbf242bc440717befafc0c5b3f482712bca9fe86c252673d889a2c88d82c85f85a9b12b557ca37721f5b77f1f4cc28da3e1723b2b8fb2da78d821959dfa278798ad7bfb80f2b9d90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b44f6afd6532c953379554a817bf05dbae346e0f22ffba8a75255b8480b12157767472accd45d8d94ed34a09973c120de9e842a18f56537c8ea3b15455089feba4b922c13b713dbb948390b015504849773b6ff15b1b52fbd156a075367ab299b55a725a7188b025ceaee7472a2502ca307a9e3cf9dab839930e96c7e2222d020ab6ef15780cd673373787cf70cbe220e8eba871c746a7e6bfeef8fc97778eaf022d51926762f02fee944a2b1310beed65ac26586e475910b5f38c625fc33139420b02bfcf68752308e13c8ac1334f9925bab69007e4b39968967760ec286c7c79f8e724e4a5a2aabb7d72938cd36da661190b5b184c3a175991890a2a78d09bc800021da6fc664e4cf5b32cfef47da8264e03ac3d7c797b63873fec897d8af4312a8202124d754e27ec83b7920bdc77ebea2f3f9072e79cfe2cc175e98de6e0c4d41dc7031f8ef85580964951a53a228558801e2739ae0902934a65406e9bfddfe9975b4d0204f93a7c2a09a00566c96d3332ba5a3584ec09fbf387e238eee042ebc79619990212e8fc8d79c76f9c183f3f4851a80dd3c94f34038fc4e74e5e2e2e8d9ae183cc9a3c60753c7f2c6328ed4819b3d67e23814698239b486fa57c6c3e362e2a8ab2666815883d6758d66d1df4f989279b04e29be5ffc5cffdee5effbf13a2f6c52f36b26858dd022d60b15d7aa22b72a59dcbc65ba13b1ae8423c460617e0850469344e0e720caf9239e8eaa3d0132f885511415f22a18de97547d8e90005815d21f6631a8749d51f8159c07534d413e5b43b811c05081a38b947b09358cfae3e50866782b0e330c3a4dcb30fac1fc24161d302abba45819ec85c829544af450cbdbea614abc38d6d7cc8c27763728dae303826ef05378f4267d10c6ebc4a2aad64f6d8b13ec0a32c01179f37f0e500dd69a4fb5e86ea8155aeaadbf87fd2c764b3824029a8487f4fa60da9d872c47404bf661432f4de73bcbaeff708dceed55c22000ffb5ecb9e9d6783544f30fefd42b67262885fc047318a1f40187e150c817dca0a06f230f0913fd58574afd50036a7fa8209e974d65e9c138cbf44afb69cd21c54fe694bcf5170abcebc4ca2f6873832d13897d9858c49fdf97b0f49375b59395cb335f02ad6dc05ef695fc205ed546536be038abbeb3c1e3e6d1f1ab5f568d21b89a303a8671c80cc75b80dfa0c08ed4dec9294450a51760c3f2ef71ecfb4eb8cd49217867b57b81fa7f5604aae50204c43f54ad69660bd39f226f964f9ce99d7605d62e38e0979f91fdcab3dfe9bda23e3536919b56d601759a844036a0ab1d8da582effc9f620cec799f2a999e91faa1e9efb03a1e59bdfc4929148d837deef653fe7fcfea9f58a54a1ff5b39862eefee28141a3d318ac1548e1c894a01daf66c33493512ee0d27dbd55d16a980bcc4962a135777bea138241357d82a58ca27ea8ca638a87c30f9ecb387c0c7bb3d108cc78311d3b1f2bf01c86f47a479688c20929434d6d15f84ccee32fdfd5965f639c8e337c1db69ed5134e0b0773e586ee1984332f542447caac00b909291012c121982ce2126b4a6e0ab429b0e2929fde59a1769948ce9c59ee8e64a4c9bdbce0222b7b1bc989ad13ddc3d7c53338534b67493ecd29f6aefb3fe33d014406b30f0a8cef2d971bea21e9540b1e1e80ebb7c06332e8925ffad9ea4b8e43564c63ba55bfe51035c22eb0dc8fc8ec459f74c4f6eef5b879b52ee554a8040f458a7acf723747fd76a32b3faa53527668631e04784830cff2134f25834adb4c02b2105404b14fe29466501895b97444b017649f8731e818d369d55912554b03d1b7b9b42fab9478a21056d47c146358b38565085337af81340670f231fb9a2f261d7425a3a6e9958563be2a1c656f2b74bdfe172a528d37248ae522a0bf6829d6ab6996b53064865c85f5cf3bc40af08a3c40cdf048513deba2a8329a5fcb5be82c9a64e1972351a911c3e7e1812a7c39ea8b732e1c01fa578b7184944c07dce89b6cd3419700c60a12e07b8461c81967a1e8c3a388c6c3c4b3566e1596509affe82ebc446cbe4998b5b1794b6db550a085eeaf5002a2afb67d8aee27150a62d8fc042daa27158d7b190c4be343af58b7d87ee8a85818c05e7572dbf13721fe4f68195df3091d6cd976cece932520d654c6f74fb5808c7a376267e9470839daf48f9040a52582d2035f9b573fcd487604d9f4fc580de682b5e158a513f105145fe76669bb8ddf2b5e9fd2464139d40b45aee0ba4219f6c8a4071af96ae9330831856ae8bc0820500000000000000000000000042df05abdd05891f7b69126c8b4525863ad90c3537442c7927a88081ca84cb84ac3c4609516b21cc9ffdf78290c60a25bfed5d5b9834ba19c30479bf767f3ba63c1c3dde85f3a53b8bd2490e3ade871ca65bc093404b05f49d341ef120bfd01300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1d93e7300ae759378485da3c535eb975e238ac415a14d8512481f8fe7b1b4bb7e6a53a9cc7e7655d25f10b28173bbb44b49f84634d8196c8b8981ac35d56f32ccda9aa0c83a38453830bf3504182e22321324160cd33612ac81011f86dfb4b24af1df82782a5e24f9127c6e507900f98dc807f2f7a4d4e0dc4d574bcc5c6ae50322a5818463a5e3e6a63f2189276b7a280ec56a1ecfd0fb0179a8cb4d8e010d300302d7166fb01bbf00c82b51354ca8b6f8775d5a5213cbdd2379d8e8177e1439a10b04a69d7c0cc56206149820be295ae71f968622584f87e836c0e4990526c7dfee9b9ad86755f27691bbf5bd0b15b602d065cf1de02df0f2ce273bb990e593e9650215de82ad63354d72aad22b2e63419e23227efe9a4ac576595255297edf4659be0222e761d7b63631c5e0e3694b33ce93161495d4d58fa4099694409fe436e9e222031a113c8d4ed66d6ff034a7a414ab72c40ee88fb2cf992a627ee1949e7fbd36c0020d64d4521e072ef2cd199b2b6fac313bb9e1648464c382eeebb1d83650ec3342021cc4bd1cafc2766a35cd097d4152bcc99cbde034b83e0555376b3c48c93f818ecdd84b853ff119ff02c88d8d2834d5d89a7c8724ccca2492f181bb8738610572abfd8c492c14a89df8eeb8821841a81489d85bf3dc30fffef8232debff885278926726c70638362effee772c7542e0b51ed712538c038d4ebfbd8c0b411d4a005c5970c1ecc25b6244dc0916d80afdaadad4f9c6d60d0523b7b52334ae4dbf7feb46905ee006f7aa62f7e10e23e4855632def9bccbbc0f42388243c60e4ffa63aaa442d7dd2d9e95c94d727bb3fd3aafa3a4fa29b27006fc9edf71f9c0ac5eb22fd67c1b1c8862f49ed520405ac36d4c3863607c211d3b62bbc6b3546674e0f375b5ff571c31293e949a4df8588b17bf2b1227952b2269fcd92e547a2e6fe772b1bcda11fd48b9f555802c2ba835b8cdd543c300924412dcc11e126dd9bf5ef59c5aa6a86a4ad0098a1ebf05ed4e1d2fb60642560e2771047985802f99e96af338932e89b91c7fa437af130cd34d0e462d3410440d86627a6aaf2b2fc02e72e9118538809e551d378f7951b5b8cd981f2aee31ef31f98714d1f2d9c5878889cf7af62563aae81d0dbedc6f832aa8ce87bcd10f49cd41766a5ab10b5c969b2f7a200a7fb405858a2e74e2afc307766e2628f2964e9f8b17a9861f48316a05ba8c7483315affdfca36757aea0ce1cef90bb466247e0ec594a1e18d1c145c9de154e7e92b11fd2458eb349485fdba0a6b81b7cdba15434c748e015f213ac7950a09479ba832b28c58c48e3de7b42ec3063032aded8d720d52ceb0f8237707a82e811c1c9a10b48a688a8a31601cf216505f94b08954390d0e4effa0db1874b84693910e5b629bc750fef6191765e5a9be04bda304e9cf8f0bd954a892624d7241f19b5060950994d028045d2bf9d67273164e53db91164f7e86079a707d649ab2b76cf88d11da7503b2a6b3ec038fc328d0103350d539aa814bb4821c2f7144dd3a37cd8378edc8cf8f08691ff30f4cd323ef9acfa7a7ab600ecfdf911b3e14f7ae85a7b3ac4e83769f5d4719dc0da4cb3a6c1d00cf063f41c0cae75bf14cc30a9872b7687b23e28128b2e1adb8c67dafea74c0782a79fb331899ff1700c01f89f26a4c0e0cb4942d4c81114d38daf85d7c87eead9297caf4536dd06ed8df3eaa1f49ad5fda0bd0b3e94872e559f0f16b83854c2222d16f1757b911d21c1eeed3dfa43881acc5541f0d64fe0ecc9f40bcaf479ddad22500f9a1d05c1f21971c5bc5fc20cf16cc85862cd362bb91960a83b935dde527f8dedb90dc68a5c330d610231c37403f48d9dfc24a507d1f8925d8befdc2e970aff370fb3bda3e2a4d3d69d117a98ebd0b38cd670c8779ba500bd0b1f6633969a8c50c481e8c5def7c26a693e1594e06bf2ba02fe7428c827ab4ef6635125bc254e1238f49123d3664c8992bd47bdadc05a88d308063ac425d307e3d498e275cea3e9f052069266088a6810b7b0855ede9f8cc473f1664fab7090c8074a28a56fbe94022db9e57352b551566b9316f8473f02c29ac3f4029db1765752407213bcfbf42eeecdff00276187abfcd1c64eadc4a31599f4501e4e11cd0b9fd2a0056fb92d89ff99666bad6195b42ce0de9cfcc74adbf3b96e4b106562c365a7f285acbeff4961a457eda76d0a8387907311c79d2692121a92716c1f73d4a475978809710582fa48b57faff29a87736d28a12f8291f73161017af0b44b0f0ae690e5097b6b9e8764b14ece3fca336c867ac792ad0627147d9ba41d6d81c6f89c2e38ce031f37a6de4854a97f3abc6bc9ce23d4c87ed6fb91d2010cbbc482889eee921b5866353bc8dffc3530292d92e69914d9c5fd758d20db71d8ba4dfbd6a0b", "656a53", 2, 7587797, 0, "2818737b78709dc6dd4b85c7daf66fa24420fd5e0be2bd14c430641aa6222200"], + ["e869152003e8fbe483581c929613113019cfa11dfb4138b6eb47bfe10c0fdcf63ea14484da000000000953655165ac6aacac510453dfc61513e1c01cebf6084fda1e74a51a5796869d0818b8329ea2faea5285defac9430000000004ac6a0053ffffffff51ce7f930308a4dee0de6944100d037ef50d21277fbae2db133aae45dfa251b10000000006630051ac6a52ada4e8a1037f619d0100000000076a0000526a655305cf0d0300000000066a536a536a00e431c1030000000001519ee680d0021e1b080400000000000000000000000082fba21da46cc77ba598793c5c85abea7c8ec75021d8ef66cc1dffd7fccd4e2e6277a58478a509327e78a964ae14843a9595badc2a290f0c585b6e94adc67866cffb9c11f16cbb2396d7448d55455724eaa8273a565f6c73d9e00e47a4f2f4bf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b3c350d1d58dc5f5572141436f2e59eed6138d8843e8a00bc9457a66b31a6d572c2cdd02717bf3143b3c62abf32218e6a33191dfbc99706ce5ebb936bbb1cf4f4331297c60de8079e750c753a637bd6ded4ad79cf9b28c3c4b836117604ce916078f2c27f5e2bfbd5feefc7f2c6ab74c87c69bcb0748d67da88bbcb87ef1696a031813425b06f6f94177305d5d8b121bf30580ebe37c1a7aa5324b5f9ae148b47303150ddc21490051d9a2cfc6d421153cd7778989a5ec366d53db9b08f8334872000a08c74981bcfcedb65512deaf428c317fb4d4491ef5e3969e888c6e77b76711bebef270b7637230df561e72c4aa91833d4154e2f3e151514f568e476ba5989570022c12d7fee901e54284cd2917792d239fdb2fdbaeb1e76fc1957dc10747d27eb2020ce697094a7210f4a3dd047a5d4ad46cee0c9a683cdd1e3b762aaaea90fb5e8d031458bb0e84d3cd984882f43fe7b9e68521c52a962db620936b85b8aa98bfcaa6021c3f209d2ce24d90ad6978662189b3e626a537d4be6fc0d3e54c8c07be55177c020fcc33ac1e5514649bafcef26b0f8837733f1f6eac6c7aa9d49ad5573ddf7d91587b4bc574138a4663685289928f7f242b56595925c33937ba5ccf1dca37ad999ee797e5cd6c1cce7adac899a302340461182d9a950d6281a2795a324a428e87846f1e8742fbbc051d8f558ee65feb6e10f860d926483a077facd02c682d0b0991f5bcdf50dade9ae83415eee5a88f7a9da37b2242105ed76a39256003954ecba39f0998352a172806fb4728f2743868fe109b0ff1d2068d6e0c083c21dc225b6ab6e37e5ef726ada2ac26a05125158a37023fad62eabf0c330d6e130dadeb002a5980d9aa3428bebe7d97a6c55999661de39ff2156e3f12ec8aa40a3f792e22ef119a0e450edf5070b8364097f950b8f168ae7ae3d80a1b3c757557fb6d8ec8c9edd5d622819bdd78450eaf32a22c15e04c43b383c8f4b099814b823dae86ebfc5d9d06d82defd459f2752bf8e3b696c33429efd6f16c96b2b46ba61e665ce49ea36246e1e1ad76344c9b7bc522ebf390db3794ed5101120c5e30b623b7e40473ba009145076caad9c5c529a96c40e76f71dd03907453fdde27865fe7594e76f8cd9cb7b049d893d5b489e95f9e4448b95d2305da3b16c1f9980dba2462484a15f0c710844916686e30dea5d7ae820e3518dd5dbbe7a4f70fc5be1f4f2a4bc07e1218b5723ed7d94d10494c49d1da4fe33d99e9dd47922dc80fc128cea39432a3f43216262d0b3e411c82bb3da30ab07dfd5870dad95edff1940161cddc3e924737797efc8919db941fd9f3174b88d5edc25a9f731dad3551e020a89224ddc75f226d6518894ee5090bd36f861d83281b43996c4f72e7e3958ec4fee918656698ac48b54063df7886fe7aeb27202cebb95319ae64fb78d7afcb93214fa36547273957831bb6e5bbda76a9f9963c4cf79105630ae3b2f5102acea1b2fca5f4bc204be2f2f2bb69ebf8f8460bbfc2be928c2d8710508ea60af049ea799d9ad707c8385bfbd6febf2f01beac3541057281e1b93a7d9f9815f8ef9d69cdfabfb1d98e25647b96285224c7f87f4bec3d9cfe0bf9df4a1f5cb68eee025a33c9aa47122c13feddd64878594714c90dcd31681d3708490a972aa76301a7a70ac3b3a574a1f0e10fc21c84136ad20829d4aeec6c18df2b1cc4c43a6af9b47e75f83b3dfe52e4a00dabbe7fb19b3a3d1413d0ede35e7c28e742b3a6d15fb8caa1f1dc9e55ed77112cde42be0a06d69656e9c8c809984363c9591dd1ab17df36839ff4f2eeb1d9eb71fda5d37b26172235bf6da999c679f5b9c767ea9f44feb5e8beec31f0418d558a2ed4cda101b1a8f5a0fb8c921a884d39fefe9d4023d53493a65fdee5eee1a510473799d77be69ee93b88dff86fcf60a00c9c0d302d27165c7f9df0893f7f8979c7ffc8896bda8b4b0155d779b644effda17e97f04bc0c06e9d338e7b323770d65a43cb0dfb2b886620bdbff626864bdfdf17d42f27ed00a961de6991a905553772807c0075548cc6f18b6a50fb18109cdac9cb2c423e67beaed9c9f758f4a0c913303f8e6c7f017960e9a63953fe24a0e2c0b82b42dcce8fa363abf83cd9acda35fc29059b30dfe8cfb1a48cb5d5dc49800820b34a72ccf98755425e96817202c1e1905b51ec46b2d8681c4a9dfb1040bdefc494072496cc4fef44a19cc473cf1a28f5323f384268ce0b26c64012fc23652c9d5e93118e78468d0d856339eb5fc5aed9e1272c19371153fef00403eeb15201000000000000000000000000994e414cd5eee1f6bd512267fd5e8cb8109aadb8c95df7265753335636b6d01f9f936752e8931acd245859744229a4330a15d3dcebd5b26fab062d34a218b3b2c3e942d2cd02f31525bd9e899abc3c217a2c363bf4f97b597bc5a3927089b1760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074d0199da5147f8d11e9b81c9fb08fb39a68b8ca1d8a9853bb36cc55e737478a0eb289116ca99b51564adc73d0bf565c7922961cfea3bd269ee27f7ff8869e154b62a8bb1764d297c38ac5ee2178fcdce6dd3f7005311d934d072398f673da09a555b02f216a9f9c493e2c38bfc93e90ddc908014df394e6e8275f4b2ac1b9db022663edcd9372805922b925d926d877d9fd04c3889a059a79461b9fd642e0a82f0320263d7ecf645b05a93b23936adad4ae4aa11aa83a26e1c5de79f0d776d2779c0a06741ab5e8814d0b31ed5e5e1891d6fe89de0bb6c8ec3f95491db097f2990aee633ca8a1f1ed5a81b615c343039f40afdd9f3530c3fd2c1d5772884e9a68260f021013e00d05f2b792d4e913a3b48524379de461e9ff999c104665d0a0a5ecc5c40206aa04213c93d0107231724e062994f9be360f7f5ea7e0adcf2985d2baf9cb960311b04491cfe13211894fe3473b690b6e6dc84bd31eaf5e8c328c779b1d241c81031168402cd8c046d05eefd2e6f094e54ae67fe7338b416222f3b54c74df196c3e031a4ce02e97e89ad3d24f32f4517ed2595993b1fa11083ffbd3650f7e26ddbb0e03b4a012523ce673fdee550eb85975f999a07e33ca232fc9aabd2e323120d6c213f3d0a07368ee715efb5968f7df62653c7d41bb2bf11dbe5080ff55ed2f981cc85d812be0bc1c0e1aa3510547402a5bdf4a40bad8cf14269d6f1f3b8386e6365dd2d36d74d08349f93d082a433ac50d3711a8ac9cc168604f16bd1c12830c3b4b240cee5ec1ac65b4420850feb6279ebee8fd080d955cc2143fece1c9229ad4edb9cac82fab651347cf76c6887a0fee04fe1b06a62131ce3c594c08ee1946ff508d10c5a653b0e944dd4f56b0e523260132a6399ed03ba9573f8ece6ae2efdb82646f8ec30f25be3ecd995316c287a7cb98473a4e38d722c421c5d3d7b412cd3e90b601a046fe10cb9c850f4c1c6773d6d3fc4517fde5ec8b0ed4c563ad559ccd3c28b01e243285eff83a48d8af9cef55271545f23361caee437914b8eb4b4103d08c30fa20f6ef88b9b77f85b8ed62947609d804bec1ee20ed384e6124023ae378e222d6a1e1897b6541bf22e523f4ef502999de9c4e734b540ccebe577b59a046c8d2b8e733b0294814938dd1bf51a5882f7cd46c910365c152a74ef71f82041dade035d3f9e0d609d1c234ea95ecf1334a370ea344bf4f2cb9c718da84b6fb21cb35eefd5cd39c948d9f18ba4589b26d5d3b8169fbf58443a2d3f8d421d9f33877c0260204c186bbf416022e04dd1f9c0caa69995c405122fdc5ec8d4a4745379fc2112a3fa8311d1245bc294d7d4aa6bf0db7f421497efbaa1bef5895e3f32db71bd976114d44b1cc733e6d59ae67975380fc2c0bf990999bc41d255ff9f18724107fac3138470c79f42197abfe124d3ec9e77429e63850e82fa135ad3c2cdf1328aa8d230086fbbbfa38694343ea034db19600bf6a359c26d673f5248a5246b28247be2809ff93b70266d1b67f5d1d760401b4995a83524acc81099961d3195633a0e1be0783595af401670ad2210628a614e685f72456bfaf22dda268e63fba4dd7406e2cfdec09cb5220448141e7e60c722e54d8db21251b93cdb9d7b9d3db328fe71f56108f2bc7089101762e501b39fa50ab4319b51bb9205ede580355dbe68185fbd02c4ec34f61f6b56af911434a5a11fc8dce1daf2e55629aefe154aca079d1bc0d8ba0b06d43482bd448e38b6edea9ceae081f8b22592fed81a2d0a6dbceab42dcfda08db42acb8e60d127d569441a25604ec50a9d90dece4c0bc702ea72ce4d644a5d4dfbecf24bc2f19110b9093fd66461ef7c5a4f864f5ef8236f5b07b00a32ed0330419043536a755aefa9b0881af12aab87005dfb9624f69b8a2ae92df9bf65f956f71edc636ab831d1f5e9a3b131c3809e06c7b1cfb4ccae1a03210d912e9dba6f97b448b474e59e245891b66b51de8ab2a260858bc94f0e9ed40edc586307e12de553dfb80fb92e9c70cd1e277323c11485e457afe52fcb668d5f9b5b6355369bafd729336d5ce882701d24abe5f87e4af8e886f98428d604468118f02269ef5354794b1898a9b4347e3c7f7c4e920c32b7b05bdb6bafa56e06152f0054df5ad8a281100c9c93e26cde1d25d6ebe40474e138c794621b994276ffe7c8d6fac95ad10773cbb38a93ea17b1c7a01966d19982323c1aa888fe61074d84481b19f5ebc030d39b8fa8db77ac13f02071c29d8aeea035766fdff95d62b0b1e9cf81983224682da9e22c61d3f4e183e5a29fe1abc4213549a22aa47ff2dcbe7ed271fbc0b0f6a9fc810e838537de3e8c04b9b66756686f7809326999de5d9488355ee06e962b6840fff34478924ecd8461cec9e9624929b1d467f0e23ccdcf9808099282f855f197b3c70e", "63005153", 0, 1606342625, 0, "65baefac9efefa0a97ddd6d64d12aac1aef4ee47128aab60c0699e60dc07a051"], + ["821f9c720348655a28d74ee16727a0aa72cbb1cce46a08dfd6681f929073814b7fd9fae9bd0000000000d03a2983714241b757882dd7193100cf05cac79e32cfd81e58ef2eb72ae6df79bd2d31ae000000000763000000536a51ffffffff904f38ac97fe0e7796db6f33d42fae1da1ab2db16d7af671d0e77315dd925e760000000006ac006a516aac9c349b2c01067060000000000007526500516aac536d03c0300200000000000000000bf91e0200000000a2b5e5ee342d4d96e56cc779e90e21ecb0b330115d25febc2da9524760692cf3acf919d65a3fa0f42ca39f6f9861896cfb689483910881d3e6f6df458efc663deb2ac6c0331a5964372c456083907c67fe027dcc15a53c56df17359e28f7bc6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000969e7e218f46a18e33ef54362bd2354b51edf6c6a2976d92121efce3dd0b868f1a7eae8d2739f5bf4225f75d828597aa2f80105b13ad538120af24355b44fad8341c1d1a3eb7b3f2f49f71e5e35993f4686c5f5d20091c622bfb1433c482bbeed3a721ebe4b85752dba379b0efe16686d65e70cc018eb6d0f627ed2d0807d14a032b636de8063b083244d07094dd53f90f2457efa49e40c22d631ba06dff56a3b60210f44dcd43bbab61848e63ade2d2fc54a9146d5fc19c09097a342e1fafe63d8f0a0790442a954a4bce7e7ae2cd977796048c21f66e9c846e18633a416b2b2a280c4ca793f472944b164447da6deb80aba0c1bb34e74b40a60b371da7241bc6c532031f3d9a3aa9a575227acbcf27bf821e61a87bd976ef29786fe517db0a6a1847890203c84cb6b92fe60e29ba196f6014aaa605d486b5690a4e5abb4ac0f2e73c24200318cc609ec8f4b628f310fbf89f5632c33fe419d4c775330ef12435c2a4a27ace03003bb49081cae83f90f4f6ff67d2175a5b2c9e856e3de7a47279e40ebe89ae830218b6e9a156187a2d3807750df397e24397008aa66fd7dee68316101c03d9b5be2dbdd178b4bfd8f79a14863ccc43bf109ef4bf22dfe790c60ae837fb22cca9d118a59989515cd094683b54ef70db091d6d6edf7fe5c5d2c616fddceb91c8f641ee22cb9aa7e238e0870322fcacfbc2cddb4deabd8d02d51a70122cd4f0510c58d37a692670839a41c0eb78af79424d47e57b1dc8630eb50e1dbcc50014de355085c184d01ef40c3b02bcf68b2d307b80e61ea27baa6a068c8db9492a4883a592b44105529848a80b48119b994c339974308bb990440bbc44d51135ba3334123559a3b17f2685fe76e0fcff7b045eafaeedc9e48b945378f917d6b9e3b9ae2f46d122b8db21cf554a7a7fcdf5292d31b212116719e0705ab70ddd1b6a400e4298c9e759671b825fa89204a8628af35d2037c96ffd004ed2a33dfe69aef10d25c3053e699ede1b368186a1b7943c3198a061e548b098c1308fe19fd375a94e77f69d668c17b53ba885db5b8d218ae8ca3fc08fc147fd68e2a9286af0fe8c731e02558a5924003cfd6c76ba0d9451f57c350061044d748e21111ad6c20ee7dc1ad4a10f6e78f33bccfa0a33c5a58a74c66f0f504cb3352f80c694693942b9e2f03cbc3cd21138db215e242780996ed7c56bb1d41eb7a95a1cacdd8e2c93fdecd969dbc085aca9167df9d044496b915660c07482182b185769da2b6e81d0516819a4bbe9d263f071235be7601472dd36809d4bde20e81c93694fdf4f3f0688587dc7cc70a8a1c2e13b1110cff2db1a385ca8c87d6b18523256f88ab446cd082004f8780aa9fe57d187ccf5402db024ae92d6cae2d6308d3a9c4ed6f387089f0e817b8f97c1ea31912e6c3f2776ec4575dceb85105776d8038494ccb00c9de7d0b4669eaeab8cd5f1e5d9db75c8be0cb8a2fe9583ed759259914366781d280149cd08df856e0c7aecb3877d079467525aaae1af73ccd4e978b191569b1e61cd68656082370a42cb319433f4cb245d508cef6f05fc24fc4b3d81b9d8ca09e7c4bb11e8dce00d43730f4ee4f5ea1183144ecf069b5a807b4c500406b690f86b27a65ff9b12f6c9e232ea2ddd34e9db0afa389ff577bef5c7b24d894a07030b9a828f2cfb02f6de67e6d83b729343e5c46c2a9abbe427c206f3509ca29317a3b3acf85883b233f6244364ed474d0b503ea08bee4b548102f9ba9845da843a3d53f59d8d55788cb836e4cca23c0ca5c22e6d58917b747e8fae8e28217cf4ac6ce9ea7ebbb7a1b206837b81a28ae5358f67ff34ab129929dccbc92668beaef2ccf7e3d5702fc2ad9e0959ac117b7ba602131a7ea027fdfebc4dbe76238f85dc97042b93c7fe75db701661308a332d267e247eaab3f6129be94f71988c705d1b0109db27bd0f1e08689da82573aaf55472aba22e8b1eb6f7bc605c0a21a860ac20d814bd04fb8d93d5c6b499e8d558d1c933dc3094d5f891b63f2c47e6d50bd0c9fe650aeb691cf0cf34c18f7b5374f8aa9a3d80cc0e1615eb30aba200b4555b0eb957e6ededfac24920a2b19dfddca0016ab34c3fea985e81dd35a0ee6f226f0d648a23727d0bb5a071369c5b27dee1901f21c5467b87669ea263874ddc4f6b73b3cb20d9e6654aad1134173b360678342d6020724414295557ed4db21c28e819aa6b0046d05b72f417680fa3fb451dc59f3084a69bb7e872cb15f00c43b7cc4587c822e73acc1c89a5a1e3ed6b7b1d5805a9f53653b2d0000000000000000926cf305000000009b370df6736b664f59d7af3ec39829d0c65d7ff96ba1b19cbb6ddd965d859e4186ef667dbd7c92be74064db3f859e8bf68bde94cb3b390786d5fbe0ecfdbe2ae23097b944906b16ccd74f5035c69cb0a60b7ecab0889db3318e21239acb96c8c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d37cbee396f9d2db9d0728b60dd5d59bd0c8d8de76f7ba40c7a78405f852bf4d5ba5b9715e1106949891e90a0d206fc8a14b99cba1d6356343118ae2ccb9a8ca725c51dcd994e14cee75f951f93d0d75f70ebf6c8f2074cbd67ea20a29126687174042415024e6b28c33c786ccc98bec3411fe7021e9e0f59f6de11be503c61022057f903da3ec1e8021efcf3e27cf14d2f56fb0338f21a0379b6fb62e554cc4a021f38c501e85db5a244eb6793f5796836222f808b6e427638db434b8931d6d7be0a034f4846911d4a92e21af5829b88bb00fc2be6e404390579e27624dc5fdce052d54157a5e1253035532d74eb246c612c52954686f239c798d8de76baf248b6e3022c8b4a0023fdfb80d71fccc039b16e57c910623dfa21913258badcd8ad12d9860325804166df34d1d16468b2a59343420ee1158d823eff18743de287af00551d78031f64baf679235d7b50cfd8c5026b483f4015b0f7436c57d33ee4c509b1cccbe902079c001cd73a3b8c26fd838379e72545c16f7042cafb509a8f70bc1dea90dfe0020fdc8338146a6e63a2ce53b2493de8ae94bff1845db8c4e16e1fe5b5621958db8186405442cc166279670caefbd10219f5e5e26e2da1421b1f92b212ef975dbdcd4b9b7277b283c4ecada11a42f2d272e63785d4c3e87449c5dc506016648b0ad45db3748dc4a2b4fad9fe91e1ac2af7eb45bdabdec897231ffa70e40c21ed6529c5e152b08db2c64a258e7d4c1755af828aae079eb45c937eedabc1c395ff5b1fb0cdcd70a7350c4be555f22914b85934c8f5469dba124ef95afc54a00c5b5d336c48625f903166bfaf2808dfc6593dd13805a6106e750264c20fabededed0158a2e199c6196bb349fa0e410fc13abcce78b2ce805d94634b595bd1d768c96eff25de38fec5f6029d7463dc3d10e8973fe25b0a5a5c66c444ec77ced0139a17739dbfdbbae8eaefa9d18ae25acc981d18047193c57d1c7be472080a4984677ac7d315ef01a6e6fa978f51e96bb6a8fe88721dfad15e3e06e853e66e2367fb4f9da182ab01219cdbf304e8a68eb22030c0dece684b64e177224ea2d7364a4f9abe022308d2d199b8a23c1631abc3c1c584afc7fea09feb533669dd883f9d382d5a6132745b16de40cfde49cd7ee75df790e4f958232f4b0f972bee4cf9b563ee03c8342e6422b2b454cd4d81b4ecc12601143dcfe6f4b047a84bcd9422d42e4cd1f0f0e1541d19e200aecb62df514a41bae9fb09bfddecfc971d1dfd582ce7f93084734bf90209e7ae4fdd40280a98187534775dc3192ce331270cdc515883ac77c91564fd41b0c37d7012267b5828602c908e2686096b68af742bc38783c4e58df9074ce26a5f0b605c9a277048f57cc4caf893904f18bb8785085c4869028354e4652ccead15d07f20d8514fbffdd0cf45a5f0caaf03c2fd67ba4a65cebb7869e190a487653b79f13816386e6d018966ee3c101b39bf4b61ee1ee4bf3579a8faf5fe3abc7390473097d7c3588f353d1ae129ca2731b9bf7e45656734d9efd1f52b4aac8268e6d9019ef5d015057c259260b868a9d15caab788da2e18e520e11f58276d94a91358a61b1ca17b26872b007a0d8ab573a548c2dfeb5ede6dd99240ee0bf1fc3e0a8bb10b6c45f85c0c6ee300b3e2392e777c3a24100a905a67ddc73ab8d0b26bbfd9546de762af3108fc570731b1b30c1311aba9e034cca23355e9a7a979391893dd449acfde4621f28ce5ac2e2fa13571811555ab8199526151030a110376f85aed40bdbe6e2f6bed264eb310599adba09c31fe1f0c1ab1cf885e02c20be665ef0e7debbf4b9ce797a654cef8bf663c0ecbed5e6e0300ceaa6da1afdfe916794d0e676b3baf289e5d8e549ff988454f5be6b715b245ee47629270f14750daa3add434d5c92f20004cab4925075c221961070a62cf7c174ceddb381904216c9ec66551652ff5e872d043eca3be70e9d1a3d2b76c86661e3b73884dd9d8c2cee94b88781a7b49fc3845a8d6981009321444c437dff6cadfc70cb398d625ac1dd40e8a1ab1841c3ec1a85e5f7c19036a23533f0d411b40fafbb6bb9e2d45d0e2d933b5f98cdf55507c596dfb0fe93341bf345f238aba50692804a205b65d190b7c720ac1879162a8926555675327cd461ab8e486981f8139c6b2545538dd2e2fa8af31c5ba0de61f31240fcfdd3dcdc6ab352f1c1d752fb453cc3a61434a6b90d1e8de11b0373f6c07421a1ae949108f80063450b011b26f6becc13f00c45939c0a2047c40245245c21c1281a93ea4a3ff226ef6eaa4eab0b5da33c5b98787fadaf24f736c794b42e7f307f35ebbc8630ac11a04b2e557bfe59492484084bb32caea1b5be69cf79c539151805c95c69e722a3d39f0196b2457e1ceffe9d38647e79984b49b76c589e8e6c59b0d", "5300515100ac536aac", 1, -1559847601, 0, "9aca5e4a5ecdcbe64f97b8415e53c7dfe9fbb12ddb65dcb675a94752eb6ea012"], + ["030000807082c403041d7d510c65b35d1cbf0c8dab0814372eb910e69e85fa1e2c85d88809ca4c05ba0000000005006a52526369c213369e9193fef2af93b93127760f1d921c34354d583c29b0c50f1fc61ca292f877e4020000000151ffffffffcd54818b6df13a95b091b204e5b1e137b6f0144bfc89a0452e58eb29d430d8a70300000003ac51ac93b1175e2b89eca6c78b9a86213d08003820f17d0137247f6a84e04b912646bdaae955fc01000000046aac5352ffffffff016d77c80100000000000b8749d0a4cf91e2030800e9000000000000000000000000009dbde7a78b802793562d409de6743ea7851a0262bae6ea134906d510081bc5307ddac288c666e3b093385b7c2b5e09ad3ac912445e0ad5d6eeaad373c0e9438644f0d9eaa498bed2ed1cd7cd43267feeb5c5017cfd6094d984a39012ce353235000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006fac58268b4fd53ffd01a2166844a176da4c0d8f7aa8729de16777020d1cb277f586ddaf7eff58a8d236fe047c9832f1782c51d035cc42be3b4b5e6fad4f982577e1ce7457ed8ea3804022dcf0b863cb734ca5e37490ac5b50b3e9211a4b137765d164a82d7719884a2ba5330ad08ebbff81fa70d5cf3b67db81eb3a06530d810324a8acfd2ad65236e548b19e1ac92ec4ae125d460b11fdc3e1b382a3edfd91f502139b01cc3e94bd95279f2be8d6a901de8bc57925255d6f23cd3f5ed40d55f4fe0b0778bf2410d62a940601f2c08e6b327ad86bb0d5cd66d497db3fb2689de1e5956b651898213400f8115302f479bd28e9f10565f4dd177e3eb61d4fccc3caa154031cc1bfe611763abb170244dc0ab664022e187ffdbda95183196fb86110dc5a2f0210b4b20d43bcbd0a6fea71dc9d03355c55cb822220ceacedca5e8bc28f44bd3d03032d07da8ba6724507fb64338d054844fc8ded9d3040bd791a2281dae99076a1020a9d38b2fc9d862caf41649dff3158b5c51f014d11eb1c99e3e575e9ca4660af0320775f890c967e6cb6d20ab2ea6eee0e453dcb8d3b0f780d7c70d6cc766a07d565b63433e6d59a89bfe39ff4665c059cab1660d7bde077b96bc0851d291c16eb45d17e4b0da2476f4016174290674b50d082acadbc0760f2c06241cc1841b987987ac2bbb913655e556b06bc31f82bd35fe320cbed8bcf2f0dfbafde788a308710bef9482174b84e2b219b5f168bd173b2c62f440a8c06dae484c3a3e6d8391b1bcce6f4cc41d26d221ad31d26902ac6533ad653d0e701624c5eeaa7b48ea7f0e2f1639a1eb127dd477d46cef8274e7d6d7326285f7ddd755eddb1ec83a9a7aa37145ad92b95ca5aa8492a3848230348f5e19ad6e1ec5420b4d02437a068e6d6a90a6ba2e8b238faca7fda989b8ce2621d8e3e4082130fe6be49e7614d0da9b63b297d4288fc70be37b0d2183d0da7a49f8df21a0500becdc063a54bbc971dbd75801590d7085beb6f98d51a5670571542667d89e53354d7eb8f73e03d018263a58ffa082100a87739e2b4c87a564dbcee48f9f8fd6afbb54e9ca3bc2235c6102fa98e84c7a53f7c7b42416265d3e962d455fd75a5fe9525d9853cdc0125c007b66e8f00514f00b6183747c2a92bddf27a34ebd114c28b8ebf2bc3f2c93411e8b702e6e183fec4d1b145fbcba66dc1f9723c3e9f5f04efa2063fc77f4cd0e590830865e9a456c5ceb2a1659cc816340525c8306a35b099287bd5ef9ce3bb19ce913c19f9dda58ebc345e8ceacfdd80ef173dd88c7817321f879ad076fce824ce37038027e692909dcd9447c2d71972c4b92e4fec662b451dc84d48643f22ca6247a630e1b145ada22c9eb4fb626f8a0d5176da8b036a94ef090299c7cef332acb14630b981852f1eb063b2a7981502d41445a38b57b211760ad901c7070c029d4084ed226ccccb22c072df21980810d5f528c82961beb83c714b38f2cd2d7301e543b190db93756764fd0492a815e52441ce5610aeac6716f224d518ec9910fff843b1ecacfd10f5930b0d2d537c0d3f8c15b17991ec5c44df08dc6ce12131c33a62ba201cd9df1a5241521605895f162622675b6ba7dd564f131cfc414f60d3e719e4ef7e6bf593d0c7057d05966b84269777399a07ca91a23af142015d8809082cf80cbafaf6f906e30f9c3fb97ba9021b500d00e8b45caeadbd5814566292133b2c3a79f57bad17ac642a225f35416eab2f350cfcddbb3a92b70a8b32af1f8f57122b9dd2da9fee503560ba2a71a8ef73ce943a96e94da1aa700c067fd8e702b2508c0f23aa548459e55ea571eae671d0afd6c3251a54322613c88ddba9218245cfd6dc08da6f2885e1ed0fe3bb58ac147e29ca714e9edddfc5d25fb53860b47465a5583a0638fd13cd26d4e17d5d385a6e480ae4cc474703e73f4c9ce70ffdfc3b78cda74fa40042cfd84cd232209236569f37b65f838f3638810bd2a63f60eb7bf4457d3a5c83dc0e5fdfb7d142de3c7dfd1f114ecd3d4583db2cd38ad833e22abbbeb1e3c68aa95e2dbbb944105fd69265e46f75164d11b9563fff0ca0031ceab0cede2a107ee4f4112e36ba6e09dda7e708a9c943eed146ede391e521ae5f5f2ed4791b4ca9f94a1869a20f89b6fc26c0ea79ebe9d585c3285a6ff09e0a1ae3630a0bb555295b43f8d0da6e64bca25771341d313b9ecaf72702663ee6a41280b442fa67d427d5894bb96e276029548ee2cb73524cf8a564132fe14606e1a0f62c941a18e49d3f6add5068e3ab4c4f0000000000000000d0b42004000000001560effed12d079b8602bbefe452df493f793de7b6d941e5ba02e8db8e4e54217eac398339f601e53cf5a8b435fe913bb3828d8b96195cebaeaeaa047941432db22a837f0a0c144f8bc1b3b2044a6560e84d7d941d3a6c19643caf66d622f2e200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000624b2b1f94a4c030751f922c4ff8cd7571dabb79f1be2378f878c0a4b7c0557db4ad5393f9a424642611a55e8fb3cdd785071a2f86dd2b04e0d74cb2aba8fa8c203657cc75e59bc96d6b8889323dcf6ade1e85bca4bb28a60f0a50cc35e0098152dc27f2a19ba1f49b70ba0a8029dcaf01b55aa7bf3cbf988b3fd09f48829ac9022615fbdb8bd01be631835df9c9499ac4c67b01d686bf7ea10466effd81285ba9022d262a48facb3f7845338062dfd85e064abee4fa41d2f481658a8735d28dd5cf0a002d14e2b5373b4b8174590fdbb0390dabf857ead60acecc3cdc426bebe4749b9794c56e53693ea9c7df82b0cecc418b59223ab6509379cf1a09b512889dc85102190d32c8e480380dbd8dd5680d745c546b2d9c6b964ab7efe78db25a08396c3a020e0988f71dc1fe477aba18f04be8da0733fe944c17f57776ae320efc36b2b3d803248f8c6885122d71b29a726d471fe81cf73f826006d9a392aced198d153f4e2a02081c473987ee851e9badea91a0e73b82ad3f4d7f82b503526c5d72f2e24b5822030dd3f126e8678b4497224f2c8a23ec36a78665a4141acae167e1e78a37bdaa8b65aa4f2dfbfb8d1d8dabc68ce0fff265f3e83844422c07d3cc904e4057ac5efd3d108af5cf5736f5c553e8bc6dd40c2890237abcdf02063746d9f957dc465cb980e36341f0ba1e91fde7a6ccf2d1855723fe76494504ab016c98b8012d0ad54e5e5546bdcbb111ba7a8dd9c70b3b028068847a10a2e90aedcff309dc872e14448ddba2f5e3453bd231d966068a6c11e32c2a313354b7f9e957ac704c957529112dca418051be44f8158624e5aff9cb2ff88f0bf4e474445adb48054bc3477554aa17904c285a2acc486d7746d6b6c211c7592434c41b84cfcea8dbf1aa814b8fb37dcdf6012319826daf09f66735b5834f5ae898d92c6f866fc734ccb01983e86932d619234ce1b7071f7441d541d30997997dc96121c6aa31a5d437e0bb2ca8ddb6c00c155401b075a26f556cc5d9d30fdc7faef12ee5171c15402b3f9d1f6a8e4176bdada0488570a525931301cd197b7cc77ac2678871f78e4e8e07b11eacddc8804fd1f482d3c331624e6493b133ff292920fdd389d60a36f35ac065d6a29d95d859e94529a706cb65123b154e5520d22852dc10e1c7d7edfa7e8c44a24fbe73020b8e8cd4c18f8f338a62d28a7064fbc7fc4ecbacf8a6409d97e551dbc2c012a387e53fad7808f2324fda19dbfe67bf28af805667f632622c9995e6a879f79434cf7d08fbd1b26e52b1acfa8978e39f1dca3b8906a76f172746613fccf6019ff12e27a27a344ba4623e236e4394c26b3f7a25799278210950fae38758e7e575e88fd2df247d3d8846594aea08427c9caec44e5cd4bf1ecdc8d90ce0baca5e2a5cf9c5e9b45512b09ae9fea4255232143ac4e035cf2b48b8e52d305b8add60c18cf8718c34de7310967e7c0c1d9c9cdf13ccd084c4bc0a8b3ce755130781488e2285e321fee18c57beb180824b1c8eddbc277d2bbeafa9a221c9b4015af1a1d668f93db5fb4a9bdcc5cd9412c2957864f65a50716de1db92d5dc7914a3d11082e76a723c6e38b134e2722c2e26620b52ff9b05d1f310ea7aa06c40bd2112136c2ae9cb80dd102c466b33c73fc7d658b636dea7bd81e0fa6dbfb1185e4268686297971ebe8ebc1df6b2c16c4a5e36cfdfdcce857cec5760fe1f2fe004934b82d7e1d69a6cb1f5e311345e231b7c182e3bc1311e3e378546c822a36e5d8724044404420c607a3dca972ce830ddfd07fe70e046f5e8c6908b8a07a7cba4fc87e7a01679d890605c2b3f6a6f86b16b756088bbb9e6fcf942fdf5f5782257025588383e92d7d305c616a3af9fb257342c0c44eb238abbcd7aa9c55e6c2bb4d97524041a1c2d094801b24a44851d34ec0f1b136726d2106c8247d5759b33eb3773a0b7db0f6de878ff8b5876dccdc640fe500496e4032084556f324ea59d5afc97ec857d31d4a47a702f508628f974951824d6fa35a388d544f6df2c660cb46a487e616af13395b2ea3a7c5ce646a5586d2a4825c524742b1d9bbfc93fdaf48db0badcc909a770da086cc2e321eb2dd0c9dd4b7a15d9cfe7e46eb967b8050441f1803a8be73ef92992f8f01d6b5d9d5ab8d714b375d56116061c79a4df09064c5c697962f097448ef494935bc4cdf52011202fb72a9ab2838240c0080ad4a9f4ad76b40e387b40ca8c38c3b3b373d6c59c66e0bb17ea2ec6f5df6d09e692bd36fb0a62e4fb909a9ac05d9d3199f4141b529b6b94d43203000000000000000000000000c0838a623a013949692e2b690cb11c0d76a3a905a9d146869a839c030cb59e75e48cebed7638386c3b9bc09bb701d4c8cfcbf6fa0cd6395c4ecca6b4c2684a456ecaac5e82f32f68866c0063216d3dc42071ca76c47d863b0ea7438b464bbe0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003460dcb91988041a824fca59d5eec5f727564560d8dedfb2d02a2b7240c95cdb487d9fc301fa38dacb2a4f0e5791c2dbba0c87df6fadf88b3e5b4d4e3b7f821c6ae577d941b35bf905c7c6f78661119da5cb11c681bc3e76190890b0d7f65005f72cefaf9b6a82e922bbd2a10361fbbc41e090113642c2437b68a8774f037bd90300b3891dd9412ec9ca4ef0c3b21b5442925d8a6b964e115e78ae3af3f23ae274030ff1738eda6da08b6f953b027b2548fbc98d81bdc3af3a5611c8ee930da915670b05af0cb408b251f2ef21e0f9778760376624b9d4cd90a32c712a9c1484c3524fd96354f554b95bdf2e08b670785ae4e2a95db1b80ade010667f03d6234606c4f022d108a82132d28445e44e9363d6202118fd32cd038cf2cf4c487518ea4d1a37b03247ed48978d99134fbded47139c5e2de00d70e2e6933f0100e19a341588de5320203e59d609984f4ee618b2248889199bfe8fac3445e46ebc074367b4a36de618b0322d99b16e99a4900dc6f6119a8df95e3b9df01836ab65339f202d9ef1a1bc8f0030d0a2f05cd9894a0fe6405ad613586a90ab38e753c0d5c1956862930c3b2b4ae58ece64163c1420c39b8d815b4282603c35fe93b7060e3efdc9d189a0398f49be6f23a890603fddd9652245f5e7715a39e54909dbe61f0b8b7c21cc5bd293bafbb9e4e41410435c5966440d88b404dd80f3e115b7dfd4a22fcf26c26a8bad73b3c78c7bbf4a27b17fec291ddb3b83ace00fab54af3652471a2fc1357d6a0c698ee17e7201e13340384f84b74c493d099eabf25c65041fe57fa93000d9069432864d278f6c9d88060326790f5aaeb4ec5eac2442ead1810068f70ce5a1c1419fbea75c65466297ed12b45c838a184abcb4fc4a5371856552b6cd0a513659ed489dbadf14cd85d7818413d52b517c3615f581faa763dadb1745fd1b64d8cf628099315edb7543088126d7a3a4eea6f2880d56cb613be4362ca03d09e64fe5e378e41fb2e8ef86a594550c48ed94a28082e2522730718c8596bd22ea30fca5a0e9bb1d4634536f479a339608c9f307cfa62df64728ac931b3f0d208f543fc62edd6fc12eca151b2be6e1f9c2e188cad6579d386ffd38cf857369da7a5e58f01147cc6edd7954e641e8a9501116da246bdf8e624725e8b85f9e27b08f0b52712b5535ba898ecdfb35b7bd79068fd810c8b9a86611fd63f659e99f3463ec63abcef74fe069b37e3e0968d2f94098e63be231ada51e9c66430071cddc911dd21db2aa14b81d347034c9c59257d138fc3b1ce0c5056a852ccef64d77cdf9a82d4a46dada0761d41a1b9669baec4766f64b72656cac4443851aa8823b56179e61afaeb06887ff94da8eee8b40fec1bc86b6e2ae526e263d215309cc97f72934fbf48b91025a82bb63c97b83d886199884a0a68fb62923acb2d54eb0c78fd9880cd40614c086d4ace795878b787dd6325cee1a82a3dc3bce843b1f5b05d293889f1387e75b3e2e5ffe6bb34872fa80ded59e1c5e55104d18aacf212daee95fb9a254939fb53970ae82c9da5e7943b47c0aed9308e173e0caa194f0811ebb6b0f46c614b52fe86c542018518970478e97296d37e68769beff3a23b583fd54ec57ef04afcff4e6221effa86c993f7924224038a00610dcc2cb387053e3426e5285979929d968328effba6c3446986fcc0d114754ec8fb098bde8c63e3fd51b1078256be16d364dff34a449e8c9e850b8090f7c6f3e02a554236451b08f81128cdbc65cf3cce3161cba72ad859adc64ec94913b8071db44466183b889cc7b7b19390c3198dca1b585ec91fe3f9bdbab0814035ec8ec79b016344465d717c4f5136f52136ab1bcda426731c086a712af9b3b67252f9a1be4761177e4daa06170e2b310af6cd59c49e4ebd652b9d6857e34cb8e979699f99820097180e59ba24c8f0ac476b720784f7107271c86bccc65f58adc1c0c4ca3cde15e10275c9a23e280d4eac915cdb171fdcc8e0feb771096256456381c9688a7840810bac6d0fda2c4acab50c8df2bd9d320059f30b9c7ea1715de8fe269a5ff9d112b66b5bf85eb69c285a3b81556ef89ac36501c6aa66b93a64c4f6abc6273e59365327f22c835ff50133b8045d5c66e1a5bcb5d357d6648dccf78e9968958a364b2e3c7507744f5a1f649c9c3ad1b1c470a8692f89f7cbfc1f33f6d466098639b307964ad68ae50d69c5fbaec63c036e76662d0e4abcbe048f07e2f2d86c4d81e58ff78d40e65d96cc1e2662cbd23fc0a51c5c292bec3a357331eeec7250d542500b66d36e4e9001b0c3248eb14c1f97cfa3178b89fc4cf21aab8aeb7cf4069d17e1b30fe48e8941ce7a7d8c3c992c710a5b0099314f6688e259a9989f9702a03d76de22b83e79a7b2a67c46bb339e7316d3d8619243d615b38e1492302c03", "51", 3, 1270122587, 1537743641, "3b9fb1c119fddc641607dda436438674d9d6ed54524578af3c4ddd27ba1eb751"], + ["030000807082c40303b82475e953e966a940447dc7725c78953ebbf0d7e7003839fde3cb64ee5c857c0300000008515353515263526aba28634291543f9856d8f46cde99c9eb5ef9c8b247df64d78149eb4ac29ae13d2a438f730000000007ac006a53535151ffffffffb0402ff681c59c085ce7ef5de0fdfdc2019bfefbe1896b1252bdca2d00aab98402000000050065ac655148b3b4ea02a89d300400000000025163dfa1d00400000000076565516a656aac000000000000000001000000000000000014a0ea010000000063a3887299b7b52309569fb6b019752509d5d594fa00c5f5010acfa92bf447877b8a0ad2fac00239df45d0e991a73e62e0e074d50e37e0e1e33112ff7266a36fff6f5f4df8789a3750a2cc991ecace7c8b22f1c29ea8ee033e278d2fe8bd6af70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086913bb7b43cf695439a5619d1d5d7fc37f4f33a24a094da866d617b5fafcbdc2ae7fba677f98472239a53e59a19b9c224af2f4c2cb07863ed15722b72d94e07e40fa86f3a4e8fac655821e5fc60dec787cf89703c3be845d132cec2e776cf183d04bf27be3ac491da2e520fdb993498bc832b3e3528828111719e9870d61d69022e88e126031fb72e9342e689ed931ab721e28835b9943e8e53e23294a6535ce6030b1858636d280f650bfb1b94fe31a6e0a449c6bd1ab1b92257b2023336c8d95d0a053b8f5115c74c124b0b0368729ccdae77ab78de458a935d2b2b44f717685e108e48817d0f839657c9e8adab4f3e03541d13c2d9451acf16e4cb1c9ee2f01d31033020198991d5bdb64621e7e67f7cb57d5c4ee162501d98b29455600d002834d5030bbeea668c87d177cb11462890143eefc3745dbeabf1880b15f1495b9867239f022efd380136fd81c433ad3a2b78b9e683771a509730e5e668e3c8391da52d776002124d4dece4cfa3b829c9d33cb6877ec5ee8ca7c47ffd8503fb175e82ee73bee5020d189315b9f510ce7ff05a16f10aed5070a97993495569aa8fc4f4b74bdd9ba43e8b646809b6bd004d2ae1b9afd63248f4ca316c2df6776d6b0e2b0bad075e1ad288ff118ab211280fddd667ffa7ff5da9f2e1e3ca7d32aad519a9c519802f1c74986d6d49f9b12326b426b0fc847ac5f794b2c08cf4cafff211d5f5f2bfb9338feac78a40f21d07b513e093602f536ae67a0eda856bb215e7217aaa06d6bb8858d93bb37b376b24699e5fe24da669fd709ccb9b3eeb376b14f948964b523f9772b0970edb9eb8c46f1246fa9f9b88709a914ca5ae268a12dc8cbb9e20cdc3715e0a0acf594597cf4f0d702ccf286f5fe9d32626646e996cfbf7f1576d62fb38423fdb00a029bd06fd38523801b01e00fea1d51b45914256b0bf47aab6561111a610656cbb7275e4495eff56eae6ec192d9ed029f9ac8b8ada6709353ee3ab6cc5c03d88bad8bf15c08715df0a614fd5a2bfe27a9392f2816ce977951dedf8897f59a1ad1a26831d627619aa033169129bbeac4e57d63ef9aca6ac9423f295ee48dd6471bdedc2f2eb56d56e9053186e33c5485b63ae01850bfcf4007a66dfaceb18d814902e815c5e0ac6d37fd68cc37386cf57bdc2da9bb37b731f08459be2db355c690a7f08828fcb0e7f9f18e6b2998001baf2ee91d625e2ff6856e7d2cfbdd431b14f2527e80a326befae1536cb9740db47501e1243a0d48bc44c4c1eda0918b90b4c6afbaababb8860a14fad383d5d8d49fd46f632fb5e320ec846b9fa514d416bf959577c6641e4f480f0b00a87e6bc89543941f30dea272b4e43b67ae9157d7eb7fe576830f7ec0f0e8402ae5b0a9ff7b23c36832bdbfdf8f42b62963efb8356846a65feb532c10e70d155903be27fa01f5180beb8fa9266afd612920b8c6ef99dba4df79a374c8bec0c7ec253d635d5a1f79b7eba1f494e644c2bdadd12df17de3360899dbe38ad0d951a310cf46be360551f461b2bf7b4b817b12ba556a6ed5ed7c9177bfd7061ecfdda599b9ab570cc7bb79224e7cb61bb193366fe61470e2df4642d55cc3468305d1ebe0687ac6313037619322330e4d82214f7f693bc8a3abd9149cb61e72fd6bb3342ba2ba2fdca047597b56cb91daa9d713da5ecb915bf38d195421805549d10c2ba026d0f79d31e73082720a5c9006ac47aea8a58856405ee9873fb7048e92712f7603150330ef3cd080ee4e771beacefe9c8e8ff189fc4787e8c46c73e745b4278b6cba6b6ef41c15be0c9850994dd5b692250ae70432085563e23d58e4b848e3ff191687d1d433e38b6cefd737fe05c94c03220467a59d5a41bd0df94837b8c7ded724e79d2fdc40808b1b7b894b82bc29b29f51607234edcda50c1b3d1fde3e2a808373941e808f88e2b2feab2584f90ec34e17089f9562ced23c66ca1cadaffcf35b8969e04e46496b3da5317a4644d59db1d5b09380ed4a5a2fe6d06930027b37080d1597c0fb1010f83345f5de990ec2a4d81f2197ed994d874277d31c07f5ebf99abd47f11021812204953bc7271d5e1267d6781d4c32df9c18392c6b939bfc51688517a13b29e816ab6f7f800122f1f0f9a469f967d4a8c39a3d369c4ae69b73a1506db2db1e37eaedd75b63cb3c96c18907af44829f813ea2daa44f844a31a1850e7138b6417b01b667b010500120cd24b0b0c9c2555f67a20ec0f39fd0e18f42a113ba38f1fc1e03931c9f93ef5a0ac9616f3bce1b2f0c73d8d33e2a81a470bcd8ed82f2978769996e38576d98e3fa65a6cfee78a5658142bb66891570c4ecc6e37407caa928a9432ec8568140f6fcc859645b0a22d803f946af26d406dcd2f07418bc45dc7c1c2a37c60fb884b5b4973ef10a8c7e9648725341c982fce0c", "ac", 0, -1832328715, 0, "0972f3ef27d2faef2e7d445927840cfbb89375c605b767d4608b8d10fac9802c"], + ["030000807082c4030154a806449b43990e2fac3409995ae8770cce951ed863b1d6b103cf282ec50c1e03000000066a006365000059f07d9f01bea64e010000000006636300536365fb7641b30000000000", "ac516353", 0, -1549071453, 0, "33a3704273d5c0b77c25f749a21b1db2b7f1d9b2224fb2fe245f93016f298d0c"], + ["030000807082c40303271455267033e27f6532fa22ea25b0ee93d1dcc9f304141fa690e0c7cc8fa82b0200000008ac516a51ac65536544828eb70f81eeb1e03509893ac190c918ae59c5e7f801f2fd9209707debae23f974986803000000046a6351ac258324e782a5c1ddbf9824970cf605f99c6635084be1af85b43a2dd7ae24c53bef81eec2030000000951530051656553005227922239023d8a5c000000000000612ef403000000000153307cb7b200000000038ae23c0400000000000000000000000069eefe043792ce526e59f2d42330dd91815c49d21f5d9cf07bda51d5f31e8bcea3a9f6c6c1a3cc725cde4d0030f4715ab46ef107bb49b69e48431546e7b3cb65be613c90d3ed4ef59c32cd5c339ccc9f808a39371cf37fe9c8cd81486fe2a67f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b54fd84ce45acd5d8926233356bf4a40f3eb4a2e8c121ef232ab45e41e533a78d8de6c1cd2edf583a883217a722794f4383be41253b2e8766119268c09a63ff39fae3ffb710bac5b7f3b21668a88f203fd9fe1706ab0308322c8f42df16da49b1165c107e22adbd615268c1980c6e28df07dd4ec192fcdc7c28ab1542af6431002302309408616534aab797fdbc87ddedc3152760c8dd6f69218f7ad831e5b47550326ad5011179ba0d9efd35c7d8eec4eb661c359694956c75eddf634337603d4820b02bfe0590ced4b7acf61fc20c84e9ce59c645ec0a8ebad0be3592b0997326c30a855073fd34a5ddbca87fb80074274b0493c67f3783eb61add1de905f4ab6e070315a2c52c1bc0fca51a3f8c30e24a845c545e967cc193e0fce1fadb392bc099390325354832d028aa48f9b3e496ce1b4e353eabb1f50cd79a15b659afbc76812c6f021d61ddcb7f89b10d728fefb15d74746f40c2406ec851d713851f49f0e4534b9b0224710a29e902b2fc833cb5ced399c5d0e9afbb8bd9f19f9961f481364f1b144503255d16a5b52b16cb8b03d1457f35ed1b8624c564f7d6369145e02df219ded556b143dd02d14f1a72333f6cbe16c348276795eb094f1898818caba7bc7d2407131c197d9baf1986b921193cc8d823408cbe1b1be584e53ddaed04d37ddeedc893f07d73fab15eff1d1bb469840524100131584c1107281aa791da4759e0041e88d77488dab5a8a85d96ecce0efe632cb4868cd286ce12309a5077deac83ff397c3376b3d67d662b57fa1d47671a01a6b13dbd07f2a275c0fe01b528a61b0ccf9a3399eb2dbbcc5b27bbf20e071026d8f1305f47753357cf62a5d676a986fafd8f8d8e3fbfa102eb25a06d10156b3a4a75d9409a4e7cbf8a00501f622412fce8912b6da17ddf7ae4563dc6b08cb84bf988bc973f534eea6de4da6bb0bcd22b115406aa139fcc8396cc82141f7b8a8ad4f8689e8fbae75be9d010eb976d998536fab6898d5aabd52c6e5d620bafed6c43ac302c2269b1115305a87bdd4dfd10457f5aefefe120c0aa35cac2efd9f25fc7418c6e7032d492ac6584c5c8a61048197845c10ad6249f3b2ed73fb1ef7132a7c359e008a8d8f7034a5bd10d73468c4ff187acf1569acb3a5f97209eeccfa236cdaffa462b61b928a61e7e8275f26b255b7f7c6764b8693a911743ae390d0201fa4be4c5033a71a2882d50a318b35204d6a25d3b3e59f9cdc601a2a48369fd68a35a8677aec7028ebde9d4fab3e3154e1c678a78c87a5c9c0f6d03284f7f03d92c16219769b70c02deae4d3fddc46eddc94631f550b775f904949344a70bbec294feb424db15860a68423b8e3e2af7fd38d3cb3d3e36658157cdfd2ce5f1eafb0b20a9f502dd16566c26940d8588343a1a9517fae83b4a25bb9ab8b5787b17a878f2e2014b5698271e102588880e753b02011ca745ec992cb4ccae19295afd3358f83d910651af8946f16e5d0b45557db0a0ac5e714e72b77708fc3988a674b971eb69d4c0178c30c28118a98615fcb6d9b2671eaf3bb78436b358cf78d169f56e99df3ad6100576511146b4123a271bf04b112d101ab7991690f98059e6a20b61ed802d7f188cdc2180f55fdb4ae734764fb03466cccaf1067d9ed966581d5608baa6dfdeebc9316cd144a45d5454808e20e077c17f92069b5f11c86517a13beac688ee6858cb9114024a5826b0371a11f17eb6d3f9e8956e8361af3ddc935fdbc26f571bc6f3f2502c40f94ccf97f3b5dccd3ee0395a23c58ed45c3c88c0e693b00ef13f37b49b7f209e1a537137c3d87e79599a23d999665aa86be7cda4ef7ea9de6c4cf491f25cd95fcac50c5982402c92ae99933d3bb2ef3b23a8371013bd4e300694515fc4ab5ddb59e0048bed4a790dbac3b5a01e9d271a345546e7db46173248deac72aa27cc93e20ff04642ad00205168ec390443398a351f8ffb521392d4f0e3725623d42a157c4f323f4d3ff3c841fe0d6acbdf4c56aacd9774a21c42a535f391256646875bea67f8fb2202a79df72a33391b5e1b87e3fcf20eac718a24af7af4df16be94959fd27d0a7e19de82995acd1e367d72d9152bdeaacf5e9ecc94cffd171ca2bf79c57124b5ee75e3a130a4e9747d04ae8b46767937a45f1d17299d02e1d08107aedb04d14a93b6faa816e6a66fc7f77572b975f966a4c9d8424288933e9f33b45deb406e1569d6cb0046de59b52178334b82ff37ba9286472b842152246ad2bdba247a3728c44c767fe140ad2dd3b2f36d342aa907761f41a70000000000000000560eff0300000000bc9e1fb830c286485e6f0da37cd9a879453d507712d969da0cd9f58a3205d05378a0c049a201cbe44cc51a793fba900709aa8912d1e70fe31d1b0508051e962b50a103507b353a2857f74ce6f250925e2c7f121b64896d31986939bd09364ce8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b835a3d8aabb8dba4b69377229a48eff17632b625a953da032b11f3c14acdfef3991d9c95ff20cfdd122aeecbe3fc77ca5a24bfa6397212ebf96099f9cd48dc44b88a6d443ecf5d103cd937ff02e5d3d0d7f0ed222dc6cc5244599c1bb1c3d77a5843fc78d56d1c2ea09731715eaf9833b5ffdacb6ef88892c9574fb79624870313a17d608ff0279dc2a58b926b715d97c7f50f07443cca17ae32f95c609b52a603093e1e8c401573733110faae0eeece7e5c0f30c9db03555176397a5cd82164db0b068258a1f3b582b2332b560247e29368167aab42f2f6e31ac5e7997f9130b56d4aeb9157e0bdec1a251028878a575324d7dc0abbf2156ec2f9b5578756a5642a032c57f59c9fb012314b6cd8fb09b987bb01c494c1f6852df0b48e0b1278ca4f870317c5a5482c4aebcf58eff19184b13c610fab0adfbf13c73e7a7efc090be5530a0319023cbe1b35f51ac983775e41f5e5c2ccb50873e74f3e67e2c21e8624140b860207148da985d9ebf96858452bbdca77257f6491806014e188a601137fa51637a00200c6fff18dcb7a55efe9ed93bf7ffc820f1dc2834b15f345d5fab51c38c2540f1a9ec760d29a80e593ab8016181c90e157e765613dc6632ca5f0d15cb23631be38606d696683261cb991cf23f343556e31c3f007984935de6230d7abb014a27ceedc13542e0219fafb8c82566d73d30764b880986242d945bf47dfd2e4dbfbd203729ce0cfd48c50383f2e8402cba2ca4d05912330d882172d1ad95c61358f251176783572cc9c04251de43351827e51aeb4156ae4e655889313bf0c06434142834728e6097e3918158154c42194158c0ee9e2b7a5f7d5ccf6bdf6054439dafe7a02a41f407eb18f9e3daa811772a76a6dfbf5c81325fac617334f27df7db017c84c7f534c185d70e0f1ad50ed431f3ab01bdc537cf9b19c09f427365130245347bc6c87f492dd2bd088970f68c85f20a17800afd160bf13e5af4a9070d93574eb80ec104abd5c5879a1a7753fe0c74054641ae2227ce58ef34d40cc3415340bb72fcfec6d4a9dfbee5971845235774265c7166659ac18f90e99430ad60d94131ec43b4789949a434ee92207edbf2c9265dc1435cd312900f7327876dc90f42577e7e6198da19cd88bc4478155fc53968beb773b1702e28e338fa7273748416ef8d34873d9a6d7a0ec03236f1063717306807cad25bfdc0060c31e389f977bd8fac91826f27af94205a9de221270f5651a2eb1ecef5f3c6941865ddae0d81dcd003b0d3830166b438671b96f4bdb88510e9c3ca456ff80e50cae98e25fbe3c05d2f3799a9b5928da4d03b1e63e594f3e20612592d07c727b8de831622e8e5432bef8e9e3068bda2cd1d71f893cdf7002ff7320b25fbcd43bfe68361e86255d045ea556dc6c644ff3fe0ba9e6aed0f722417d5480c93502ed974940c7f0fe9e926b1ca7e58283beb83da24798c94ed83f072b362b89d3c4a284bed5140bfba57cb86fd93e29608832386e4b69f9d628d16abb887bd2dd55d5fa880a9a522d535e5a30ea5fce4c7d9007e04cde037e43074138cbd4ae0b2ff5f3a2363e6c4f9c090ac3dfd38da0f3c49f0c070bcbf63d5fa3de750240271fc6897fc36c10600af45a9ad5a2f8951902c92bb59fc63d79a76ed92ce24dd2bc8f52a8abbdaa9b1d9e0d772b9b8f39857692d9ecbe739ce583491ead7e1b5daf99b30ece0fbdd92f3cf06d028b128bb3fd701ce2e93ace74daba659dc2df497516006ac2a75cc657b4e1f1c7a4ed546f6cebdde96e3e0617435f8ecabfa7db0271e82dba08cb45cc54f959bfac648d10706d1cf65877160b70ba117d44ba8ae0e6ffadd4c07378152abd7bed29817c6eb040f4819cc96e8a515cabb61e34379edc88d8546676d99ef458988f53be5af2f4ba2ee02b19adc9765cd9ea25f5be5da2b1854d2725b3817627e513218a78860573f25b1297e9f3c4e2dad0cfc52cd2bfbfddcd2b088f4dc2655cba9d84e59be82e7c75f27f806e5e79298cbc7bb24b80b7527e50fc4630abc5eb1c617435311a300f6db541cddce53f7b46cf8a6db80b11594a7452ac0ca0d9658b726a39d42858170f60bbf54d27bb7b6944dafe67f2bc2162a7ad8d50a3a4b8644873ad8c9c913ca45458b376dbb02351434ff0cdb5626e78935d5569dae15ede52685a750559753796b3c7d6baa22e613f1ed796e941a61e10acb86db1c2049f12449a2b48ab331dccaf994937cb21dd419b00b171e73d10c1950978d68f2bd6ff6d5b429262be335b63226e5518e4278568050000000000000000000000009ec564065f4970e9f9ed6726a9048e02589fcffaffb68e95570c3cbab4419a2accb197a3762ca41074cb8286d78d9ea3a546a591477ae5ba9b0f8eed8a22368cb6a15141c0a769b841deeb081ebbfaebc5b62b5ee05b096c80201371037c1e9100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f0437bc470e7cb22151ca641fbcf01507a60cec3dace3c40340e5eab698530f6c5b3812e184ca6397973e05c2b2289f7b6caeb9f34cb3d626b8402036c81761938929b98da22b4d0c6a4a1591b630b3c54d6061355b14d40d70d811bd0844b35a586f0f58bdac72cc531e3a037afdbdee6054ae2c9a21c39cdc6460ec9f7d07b031e3cfc17a4405af6d64a0e8295279912d07733bb28d260bdff303fe4cac51d44021b2567e539dd5deec980f9ac0253a4d84f2ce1b646578068dd1289494957570b0a0644dda0c3debebd31ca83cc5bf43cfd25a59b266e0f9ccd68882c1608d4a8851f05c5a43bf56dc3464dc177abe2ba2dae0fea7e40ca9cefbfa19f513b5bbd290214e85da05cd509307375428aa9a30b087ac4bc25e1039cfdbb33f109cc58fb700214190fb20fa59feeafb1ec01f56c4c73c10f3a90e1321aa6bac82d1e8962e5ef032d674566d30f9c34d23df6b18f858f5b9e12c8553c01021c2daa4cf2b0c40b47030ca9db33437c8ec6c4a8198fd55c93fd98ba4f13333cdb9852d64648eacc0a4d03168b29fb77339148508e0af9a4afcb21b632e5255e5c4ef14a89c42739fa64d9c0f92604bc3a7f74da119d1c64c29ea72771151373f6403c6530c62740bd9cf38430ffb9c58088e0582fb77dee3145a0035a72e8d03ea790e78ee82281edd4b86a12eeb137e9e78f178de1103676f57b428c0e64d8a8f05d6600c4551ae5e3809c12f0ba6c4fd7662cb95f957c5ba20cd324c0af0d86d68a10e2638cb49a285feb3a41ecc003067cd58f1d8b2395ebf2af80ed08db52c5e565c7d9f5cef858183c358f425c41177939ad13a3b4df3d9a5a55293afab240340f614d941b4f84bb4cb8df697400061b1a87aef6fa84773c627e03bc52e090006ac89f7a6e9f9effb55be15d8f3d781ebc43d2052cb698beeeae9d45a4d5e867922350f5e06b3b071dff7f536952ae1ef0d8118d1e9c3609f2069999eee878bd862547e35e678251df1618559456a0e15ac6a290062ccf0b7c1c0069b2cc4b60e56388fb4f55afc0ef2046ca9b55da2efe33706ae75a9655d4bcd88e25dc5dea3696498e1650bc326945dccd5fbadd4b3288515603417d9707e8cb7d3b8bb739bfac6499c859204d6504e8ac915a070a75dd312d8c14ebc73a6b23f1a47e94439e2582df71740ae5e460bcd5d8c0fe8c7e89710e596947e18f98935a1b2458d322f14ca9cb7faa68622bb3a9cca5cbdf74fcabcfdb7fb8833208d6cd774a8f139f8f56e2aa87a07429f525fb90c361be12c2b5fc1d578b430ed1c6ac5e3a051be48b3adbbfd1b08d5a33105844d9c7d50f430b4d2be108f24fdd235315d20a7de79ec07b739fb3a8fedc06f24d186c45fd1d18323e21ce6415d3b5c47ea316bd0b74b93d20ddc1ee4e712b0b29f5ee1271fb2f0259f929a6e0cf48e0c3142368f05701f877ba8282776a9a3d9b7b6df7fc8a263f4c13290c092d8bd1ccb7e869a88441e351d30b139ed39951ca424818502c96a863cd06cec93a473bdd73d95daf86ec5f8e5ec72708b391768c6ddc63a6094a2d3b3ac93222713cb7f2fe9d12c2c3b0f80033b672d7a9615db4f9dffa04cab8c67b77a2fcaa39facfa1c8b809b947720e964d7553fca1cb4f70aba97d32f87e6cec28aac86d7cb0951f8702e269b9cd80d1502e9b41e0d7157689b53a29255344946371d279fd6cecc588e7d165f8a98602b1043d64e6ae41f176c36f67522e54340a84c5415662093ed1c7aa378a20870f355d2283e9f74f00a5c46b2588b8701194c7d9214f8d6fda0ed4a2b7954f42035e1ca62af82b9ba0397804e481b560ac6bf4339cb0124d7b89d7f6d29ff8d556177038950a7a813d0651cd383619ced7115954d441e622039cfcaaad13b795e94fcb396c492be1754366652418137bcaa08bb1b0c6945fe2014fe4e91b195eb327542e4eab81efec3b2ccdf6b51c9483be7efa215517834b69cc184b7fa62f9b6eab3923a3dee315af0b19077f5d8637bbdb8fb4c769adecd52f51c2c741ac9ff7bf4fd10cfef6acd1f73234b88492fe21d0f806db2b99f33ccdf39300da84f63466e933f2e890fd24ff23d5680137a14cfe2a3369f86ce4c5ab0d0f8656838bb01f520b51047ae0e04e60594279eb06c5a7d9841f0a09632f555f0775ac8e76b491e7b99ebfed0b1d5e14454595297cee0ce7add2c2d967e2efcfcfa97c1d9d25c13a4cc4e98a15e714ec19027309c669004920892c396a61bf87a9b5b61d2006c93f6da3c3a9a0cc5c56c9a0624d03e8ae6fc82640bdd1b8ae623baeede7231f1c3f7635bba9fabe085c1366d28d320c8a013d040f057b15724cabdecd58a57bb6368a599dfc4c9dabb6eab1ead33ed2b0e8dea42dfbf3e52dcb123b4ae14584fbe159762d262e96ba44831da15eb54e0b73e209", "525200526352ac52", 2, 1059728917, 1537743641, "f9a2c0e72d662caad34d81768ad44efb451a3df4bb49008bff61c63a4bc7f14f"], + ["030000807082c403033632b16f4918e0a6aa194c8c02722de6d278a9f325bce099e23487b620feb4290100000008006a635352530052ffffffffe6e97631d70ec07e528bc77aed72e32d054fbf402076f7b52c497094d20fc9a102000000030000000b1ece23cab3bddafb2d5cc15844b7bae0bcc6a75731f593782dac790e3eabab84268c0d0000000000ffffffff011f3a1d0500000000046a53006aa01e8b91a1a3df94010000000000000000efa6db000000000022e3a0bb74829f6c815e828163a48033f65224a42f569a48efc3a3f2cd947b1e13089410825669d7a86f96056d3090220f748bbc0044d44023822e2b8f01ffdbf91929d0ce14950cc816829b595837f7eed4401bbf7ca5caf43f34af2099c48e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010033f324587397797be506e885651efe6076c9b72e0f179aa69900a16f4e8c257f09647c50a3c1509c44292e8af0cdc477b763771138359b02c5e086f5b8ad2de163a9f2f551bbedc55dbc85b40d75726697804d82831ff83ec88c66b741b7c60efd750c2a4d845322d6224d359c4a25f7b72046cca2df2286ae785f7eb29c90228b640913c42a41fbb33d14248a1a5fb2d88d8044585e7b4e1f52f08dfc7c82c0310595cf6786f1f42f44f10bf2d5557aa7d467a6afba92c526af2ee4d290e6ec70a076309c7b587efc5dc6edca5862cb5c5e6dbf32c39b6d6644d574142f601062215cdd08a0153c3081811f100b36a6c902a5e35318f1506ff72fcdcac8fa240aa021b783ca690a81507d1d3136cd02bf85d0b395d01598f47cecae53b2990f52b60020b5bf425c55d21543047c08803c8d0d83f13b9d97c3786f3c3f35b219ae40054022d9528ab9571f9cb13e9ceff41fc9fcad9bc880c1debf7a48f47319989fbe9d103262012207b2041384261050fe59fe7d7aa527a5e2bd9d26133fc86d354f848270312f1e3643d8d80867522e759f07a9910fa3d4e13a7ff74e01abe9f01876095e0656075e3f40d25fcb2d8893bf640e85dc0a54ab7ba7b37cbce42a6b0e1c955def60f15589a55876d503c24dffafef54c50f629ed491afbbfde1dc39584b09016d670d4c800fd57109f68dcb3b996dc13467ea272cf767afb99a115ee8dad4d43990c556eb7295cf0a585d905978e7d0cf07282ce32221f1663751d08b396f72ba4bd2d5cb6776940cc9a254764b728bf46dcb2c36800aaa3cb3040bc098f9f728dfc607d139f4ee3bd56277aed97bbe8bf393d49ebf8b606cbace81cf002f799a848549aaeba99c0bd8273cb43cff80ee3af9aed9fb76e775f18e6f1beeccf2a10e65325c65e031dabefbff82dd06b9142f3cd8215787f12dd303901ec87ec7adf235316fe98aabc4c4d04b32267e42d596caa03a7aaeae9f26e0822fd125b478af1b190177b6d7222fbf85a8dca4c3532fc4588fe979dcbd77c204200f119d6ad2348bd94f898d72f8fd0ef5b611b71e7a7b9c3ea755611ba2b3d00cae8a6cb7541333d95a21cae8b343c9f01423fb3bf5f6f44c899225e5d19f9501802cdcd3a7b99907b93e88fa6f17872097f1758e5da39124a94dd17810176d373523c90462d738a26f6bfb71fbb6ff8d8d2803ff460e6960008fdb627f36434d698b06d90e98e12ff50b39f6804a4b92cd4e9d61f4a50f2bb8665dcb7ac2bb3762e3438581bb667d9e3eda90e2ac6e1c57e747edb3e054b9551cd24f6a73d3621af0d3b3eac898b16a7a38c7da07b7506a889e0aa977f96cf1d4658d39917e50d65a27b0fe38feb9770e192367f311af210257b090e04c83009dfb0ba8444edfe521e7e0de5eba530b111c434c4e6f9fbc2cfd82c9f624ab0cd6a3e2128444fd56d4aa6f9bf7dd305b3add8773841ba1d1c58c6790e6c56e268a9b15b1bfc52a23cf9d02c16a53e316741ee22bb9bac604922ba44a19a79b8f583fbb1969d78187d5ac3bb3ed62f755018f9058bd04f4b9ea6975cde7ccbd432aa11e44d103047705be5ae9af297b4551a4ac30e35e910b6873bb34668501257e6d5b8ce9351756c7e295735c6296d4c92d8fc660fb48861dbc670e8d8a3e0cc7bb52d7c543b90841dcc91e56a9e21b242531768b2ac6385f5827e3858fc5980c48adbc93bd9ae31391487810198ca96c74f7fc3edf32acbfa86ba5b4ec2790a5eafe25bbdc5fa53fc0d83c689c71648c74e8d7b3f5349da8c8eddfe7332d3e4bd0b30b39e054d57b0b29ccb75499e51bb371e33a50be6241d80ff6fb81ed2d605a9c4e571da265273efb1795e6d439b0c289c4ef37ce54d4a990cced767c1254e2cdda503751e4c157eeaa588aa61c7ec9bc916dfb086908cce5b90887bf9c356bd1946e66c25d925bd1eacc73691c51982d63f8b97016b67285ba1a946b6fb4a21a515f6471d8244bb1a51c89b49ded8937839e1c4260ef60a6b1b0096f847f1b635f6e30b447851346629e7926f7835742ca380ed73fbf9a8c41ff56be560c6da25d77278df99bffc84247cda03c8dc2c78ff0ce306fc0b9d2f27b24b6b2538b0683a416b3e19b9fa99f74700c7c61195a65016c20ca9eb430c302632a35bd9ac57a16d04902a74ceeb34d56838978cf143666018c5e589da4fe2857211c9462112bc30e5d38dfce755eeb9063f03f139acb3acbfa8a1cda967506849eb764d3ec6bdb18221344b0dcb5294a1e644e364ad8f9dcbf64bade0c20226ee01cea85e37059bf7534c1f9bb0ed63210487b32998f8b0a3e2799789abb73b663f4d89170d55659019eea803d0fe0f3bb3ea78801efd423e843f5a5ae65cdfd3b456c1ed628e9665396cdc4ec9a89251eb1983accd8f24aa619f07621e06", "53515353536a6352", 2, -382462871, 1537743641, "32b9c7bad907898bab60541b0f495eec1521219d8c4f9f94e68b5162a5c73369"], + ["030000807082c40301a553979bec0041932a37cee4688e9cd5c81a9ac1b1859a47bc6a0b8b06c9ee80030000000853ac530065000063ffffffff02984613010000000002ac53264a8a000000000003636353b43aaabbd42b1fc30173cd12020000000000000000000000004a9f23c95adf1b275b81beea616110f2da4ffe219a3261d0979ddeaf64eda2ce59b0d4cc233410b45a29881e0010d9d216fb5d3a6afe4f21d3578a83465b95473a09bb291318552c6f6d9f139791353cb640de3785fa7e5988934ce350de7b4900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f6ad0a7219c1ac21fda18630aca8fdcf10b5b16dd6b99112cdb287e5058d7ce113a5b847645f99f193027228a3771aaca6ea306fa1d7f65bddf434205e11a9279849e120cbf80ff4eae19d978da968436269a1ad4312d3c535c77b45aff8b79d346c01448d445fff7f35871fe2ed55ec44795ab379bb57cbeb62bec4abdd0333021810f3b9a0ed7e18d2dd9e6a5c7709904c49fef83d9619e673e5efa453a646b2022ec20653005e59feb0352244ec16e707e9749fc8e45c47522ee85e1996a5ecb30b039478b089fce95e2dc634069d7019e6472875670c0626eb6ce76bbca9c19da5a978043de3d2949833fb0d94ca3855b598ca49dff649d9bd84b3dad368d450b3030a43d9894bc2233e357e5ab288fd67402617ac94e481e50e6a44505eca1582290212b317028fb6b51be3df26aa3fc50a3f9a9cebdf3982d47efa43173693b08fe4032344a916ced76ddd662d4c799e7c4f8af957eae13a60d58b55e71a7d3387ac0e02030b60a07a0778cfba568357ec135939d3d4bb23d68f63432e904491b68db0e4020641924509d9de30369fbfba5a62d1dd3f98c1cb326cb890b264879b233cccdad995fb934dd58af65f1d0f82d9027fada39a7362c35307f671ba4f5b2bd79afed0b1dd53303444998240035e6aef1726f156f43cd0d124f9106cfa2c119e6045e00e46a00e58b724789e8c63bb8ff0c9dba021f5f483343d98d431640cd79109262134ccd80dd82361e46274836192768cedb9c1df80a047739827b6c7c2f79365b4c118d1d851fcab2512545b6a25a3d20da06f11eeffe0a6dfa0fa193993cac7b84f273344380246500641ed785693077d7ee622a9e7a6c9bfea124e8af1fe068ac51ba6830b2c1dd5c222a0fe7178ba074f1267f17eb054d5c18e72911dfc900e4d7a3aec42659934d14463f7310c02ac1c5786a8463f144e90ddc7bca0ee5ef88aa56df9ae1e27d992b9c5d7468a4263e57a521b1b9b693968bbb679f9e521812ccca3897baa7194109f66bae59122758518f2e43cb9ae5fce5d2dd4b320c419d6b02b4cd123d1d0c245def009badaee00cd2812903400ec6c098135053d4631152ba888c5e08ec7d9fabf9db7f72191f207e0e716c1ed72be6eeb3c451937f29b2c6b25cac9712db85fc79f7fefd04443a0189c58fc87e2bee6c63b9a4de5e993b65e85ea9492429cb4fde9644a7efc1a35dda5b0b8749d50b8b030cbf3d7378eae1e7e791fb857a8dfed7957c44b57407a70644ae506ace85fb46fac092b8b608cb33c455095404ad7abbd51c878edac97ae7d6a5c4820547081ba6fdc28b688d9977e2182ffa533ca0ea00c3bee662412daf4b2430f1ec7a44d3fdd1b51c3be935dc6ac78c6eab8c0383661e21cb7cab7bcd5196b6ddf032e11866a9d0238f4d4b76e7ce1ce6be02a0d5177f80098b90f3bae638a39e852de28eeefe814d7c8ce714abbb7244bbffd9eac006c64cf3899973c33a288650346cd12082f205cdbbe822f886a3b36d886112fc0ad8d88f9ea273548e28663d09552f71fefc880c2cbac0c2e0a297d267a30590a70deba6a075c08fce5028ed6592646a684dfd20c1473b739cff1670fee1fd0f665118b2626a8bd5b35a1496451f422b1cc83530d7cdd575e61231ed4e0d088cf707ca853e7799106fdc5c35d9bd2ef533fe5de22d6d827732033da110b69b6fcdf659eafa671dcb9194b0b1a3be336fd6ff8db85d522fc2b8aba2ba05a555b50079aa71e1de2a2e02552cd5ddef1e2a010594d14165d31db3fd3ede6f7b75b0c8d1555e42d7d743b9d0e447774762571a2b05c244a4a3d578df0dcf233822def7d19829db7d20b8de997196e7c1fc7e195c7c7f3baf12b0751443b4ec4a09338730706e7c2267336d8f39c9be3487c2658dfb4e9d43e2d8afe49637835b625a03a4e7824cf5cff4a55a137442558c1ad38efda1c5961f5fa2736824592e7a40ddf10afc29245fa8672eb49dd3cc47f687f0f78f508271efc383ca93251fcc451d34aefc4e0042f30d1d4be9f555d8d3b86dbb92c9c53b12420826fb2304450fa798e3dcfc75c0b5498b5ad73de9221f30b5eb99d8467492a2fca88d6b000b7a11a0e7d210d9eb0a0a781cdfa9cf6e120217b865cb7e9af01b3dbe01e52aa196106ea277a6d11c5b3d1c63631b29a60a47ca34a00105204a5cfdd4757496765d0bc7ee5bf8983d41c24993ab0627afc128ff529a3aea31fcce6f94102f5512cd09347e659117c8524c708444c99d34425c29938fc8e7907eaec8b1ce3e3c68c34d8fcb05f5b02f2d21fc53023503acd7170f21e591f8af3a3624705b2ac49cddd683426963f714064ba28aec134d2d61199f32f40bdf31f6b8ce1c045cd7cf7a07d8d4b4654b1bd3a41a47dcacb8ec80ca14bcb0fa5e71929cbab388a29ffd06c98be00", "6a5200006a51ac52ac", 0, 266469496, 1537743641, "4a22034ea2a90bd699356e990bab25e9a0d1394886bef649d32ca3dc48aa81e2"], + ["030000807082c40304275bd5d56998d35f38f2898fecc2ca6fb1215e6764a403a7afb63ae1b1e2b187030000000865656a636a006a52ad5db9208d18656992756d8b63bcf6501daab72662016037257a59177a665b66017388fa030000000451ac6300ffffffff64c4be9efc88c7e772112070f1e7b65db9c081eda2f6fba25eb46211d77d03ab0000000006525365006a53ffffffff19269e81d670fdb1ff404533a2499dd85b11cb40dc1cd15ebe44ba29d92a5c2a03000000046a63526affffffff0483a47203000000000163b0977e000000000007656a00ac52516390b36b0500000000036a53ac0362b403000000000353ac52b65e8edb00000000038e19b1030000000000000000000000002be8052b622ff38c8ce6af0dbe76a0c36524ae5fbdf3aaad37ba1fa7eacfb54a7ff995af16fe1e218b762a54f7c52e6ff0ce6cfe82acdf74b2eba4da04d308ffd62cc3554408090af1df7927ab3e26de76b5e7e95dab6b2e1d0f4315d0b87efb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006abcabedfa7a48c2ce77bf514c5903efe510d46f5ee80863ac1d9b17d24859a83de2e73ab0f486c40a6c12069df9c65ba190d6950af27bb2cf395de1d584a2d35e2b2dde0d98e55b2da7fd4ad079c361b222116842af81f2b9921de79f418008adb9433886cd197bfc201dddc7bbfe1f79467284cbb80e0a03c7ae68b4b9aeda0202c635097daab038b9fca63b412ede19ab2ae09e59ace64dfb1b75866cc0ac9f031f6da61e1c4ebf902b8d115a0ab676d180fb8f47351c8191aea5354e4dda23500a07b878c94cb2b7a30f6e741b119e56d2ce85b42c7d5414679607a0850b48ae67903b56b2e7b67aa256d22d8fcd463538c61694d2b0884ab57d3d271c78378da7021f62f3b041befc1e49814faf927d54d7ceed9be5abb86ddf5b56ba5da562850d02156ba7308fc2c5cd484cae03e1a608febf38ae024a9790c4a0bff2aa52d507e10317cf3bb3a04c19c8561699aa482097f84f035df3ad4453b3229eeae09b1de142021d21444c950f0acbe864bc1d6567c9612ce8a215d6bd732da5eeb62ddeaa61d5032c9ca0a6613ce143adc5120c2611163f2a11ec7a037b703130f8a8cc0100b14b9a0cfd2c7999f39e9021b055ea10f6f51cbad631203eaf925c7bcb6fa7c87ece2f3776a9ec96461cb9658ba2acb65ee0f5de6ca90de4389701f8052a0c9b4925a50e219dc6b65adedca5cfc45883b605788cc239799acc2ad026e781e9b09a0a34606c0a694daace20749e2cc410978503decbf3f8828e5b42dbbc991c95de8eb2b2b890ede5440a15486af34accdee007b02bb699097eeaae82f25696c1645fde0ecbf5a44e3c01846fe3d0d2b5d0d8fd0766c47f7bca3753e376960a9844822ec99ae9d9c751f1d5c7fdf7b8fbe9b73bc433145a00d032e767cb947e744afdca77fa31a9dfb951dc13123028cfcab7bff64b1cac2ef1b00ba6e2b6bb9df4e499db1bad7cd229ce28cb38e2dd386170d58da698ddfed618ddac11242cf9a99153a522a7b61bf70f96e04eb216ac5f684241477d9bd3673b5018f5783e40e675816989ff8255a52384c5749a7a5e38413485c526807f0d88fb92a08a4676d0c23bebb47a5492dc94a43344a6836faf732133eb6a51b88df58ac14df50c9cdf8eed65a0ffe456191ed8e7d6a944ec7c28ae5fe8e83ce8dbfc115ac6e1dea21455d6129fc13bcbbe69a2e20b6968ce66353db5de796a27d58cc439183a74d9284c3b14bf41f733309ea1b1c5fb8e29ed980b4716121e5e08a8a6d60cdc5c2b4043c56669788be936f8638c842eac8e1c27e7de3fef25c8048f5130f9188894246d6b2ba31a16ae85f590e056bbc4125e7f59f4021021913791d786206235d2be590cd910ede60bd994afb8f236b6ec1aa9a12461397e930fbdd7e640556c049fa82f4bf5062b08966dbfed51b678860463d53ea800019403793048289f957f378d38780afdceeb2588586b0b77a117b08864ecea3938b528ebad69d80a8a0348289bdb9ca74aee4abef4768dbb5cb5a5908f75a03254163618c948ff51670ae87886228ace55899f45e35782682f5aa2ba32af8dc27fa2a011cc6411f25210f5fbe5d3d49c932a8d78c3bff49f09fbee2d38b5aace3698cdc0ebaca99b21dfc15472121d65a480fa5cb6faf2d84a0180c829e7b4a665289e02e0c570c9c1e7c3d0bd63aac297c7d3576d1500063f690d910bbb8ac2ef819e85488bdda0729c01fced335a1ae1777387326bfddf7e6866805ed3042a2d685f5ec456fd26d2b5dbdbb45f498cf0f20be882606dd0add8788388c75ca33d604b5b5a6873a6eae51cddec73556bc3a34609ad12bca9c14f0bea54a52c026c5f69ac58c0468528e2771710376a79773b69917700ac005226f4fe2b8f3ed7fb4e35488c166ccde0c53c8cfd863962b352b5cf8f63f4b13cfd739a9578dc06f7991a830114019bd788cca1ea211c2ff32d91e75a8fbb4d32766057131e5ee44b05ca054aace018a1f1767dc244a0c8c164ea4572cb9d049e9b39e934010dee6c66ce4dca0711db593256c0faca200420aafb4269dd5c19a3ab2ba8d0f7843499d708308ac5addd21bc3253890ee1ea058b4f218cffa31714812012c87240b300be68953b3e56f75051b6848a55df723c652ae6805d240bfcf62d7199872722e1daada6c76efab262e1cf7131b5d858c55f1f66463aaf2f9e61a940573eda683124b34946e9aacd69db912d6622f794467450a8f9a769057d8423c1c5dccb984fe4a34d8c52c8fd20cbbeeab386ca710911521ba88880e2b9b6693f27c2d8ceea030000000000000000000000002f2a76da968cf4e92a84cb3e3758b56a2581e885cc73eeabb8f69ec7cacc3631d142a607bcfda94b80f465e365dd61b5c39be6e379c6e3d5fa5c0d23e8c3bd751a0481b6abb3e85aaf9a5786eae2c62c593cadbb861869b8431a871ab3be7a4100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000113069a338589d55e9e5895a366175de744d9a51926eb8288705cd2c90a9277971632d362767ebac70efa88400e72e1119c56044543d9d72b1d6af742eceea210a31231d021878b7fc7520d15631c4fccc3db889ed3159b36241ebd10d3baadfb4916f1635c605441b88bb9d1754c01c6a1908e093557784f7a868086c30cb47032ec3cc81e32a6a1afde909f101f0b66bc2cb286a38ada2e6ba1aadce2b87dc2f032dbd89b608c2f8186d6f694e4376e9011554e26c1b2420fe9f1ee0afa05d648a0b02af462f0544215a91f535074c153293bfe8b5a0be148bee96d211c4bd03bc04572ccfc67b26162cf2865d9da464704ef7cb59b661aea4280412aba6571c42fd0214ea5c8ba4ce89cc75dfe518ce44e6a1d6fad49400c4f36c5fcce10c18f80ee802146e44c2f9b548656329a36e6fbe12e7ff3ee770560ed55e27fa166bd92e6af903262a6bcbfcccb8b4e25b4dc5eacab4bcfa708194543624dac58fa0e7b10f11db021c72eee68f07ea5f8d11b78cdc191f4fdf042879943eaa87e35175ae3f88bf32030aa3b821057d13dabbe38f1e27542d5f22989240398c460ff5d46185f067eae0ba9320e557c74b41411fde54282f2a4f254a5a75935850d669cb59a5202a0f2fa0a50190f452f9ec85a901c829d352b7b36afe348b101835488c4111ad965d71d821abce2f133efd337c83c466b950aa5efd34530dc75aafa98c363f457d7b10c305f2dc1b847edf666b92161f681bb0e9e3d337b91dbe62965927c861618eb8b992bb8fa8aabd5cc6e439e684d80f61b9602d9dd968f41f66339a9aea22b3eea4fc62c6a884ce82c3084004c0d7cd834d2539e9c74d641ea54291e1e58d1d8d3abcde6b1da77b7146734fdde0c872a1520b0e213c43838afb892fb5ac7bf5c30dd3e079e7ebbd15f28b8487d1e3bf6c53deb056bec54c9a0d8e339f7e8354aed7ddee21726456420e9dd8bd5f2af2935a3c38525d9374764b139832d41d93262d71e10ec0aad5a54314bb931b79b09d3b0ab7a4041370effead1fde21924ac9e7505d330eb9d0ff1d4b2152e5c11f94bb14558aca659424154825cf4490b08feec4646aa821a9f3c9d17e3d282d13b69f7bfdad6106d4a851cfe2051771924391a21d4bdc36616ece9aa1adac9235c5b59ce99489277c44c2065289a043b5b9e02c932b1b29031f17b48befa10ee0a8e47c773de06dc3d5214a7bedd7d5f7b7ce48857ad249755d45947c76b30ce68dda0bd1c5bdaf2f71adb1f7aa5c8725ffa58882cd9c862a471068e7babb8d959e975a8fff170312f495b0e7744f3f9f104837a4a8cc8f33cef3d4467d66ac680ecdfc9306a027ca41ea34c79b06e88cb6d611718dacd0f1ceafc47c6bdec9ea233ab3edf3874cd89d8ef3405a194ea00ac8c6f4fe41dd255d3703ec36ab238f9cc8fdec5088bf5e5fd1f13c6efc492ab1f401bf1f3e74d01c5c2237411c2dba1dfd0d78826987e83e65af7f26a695e48dedbb44bb01d1c27b3deef07f2661028df301f005240f9a83f9bae6ec6bed67674c09ebafc07a3be62e0157e2bc8f95d53df42bdc1d93796941f14400b7e59c7324e9fbc190ffd18a0e0ff325cecfd137847002c727d808553f8a17a7e331dc3fafc215854b8ca58d326eaf8f9799b24e495221b60da708813df328c84e3bd88a53ba9074359d84c10210814e66096bd9459c27f6ab277be39d8442e2cff5fa077d40f211fad7ba1031440384b5c2dfb118f574af4621db570e102145f2e28219ea74aa1a21d18168c20f365c6f5cae0f030b737c86dd0f7df3dbeb33e5ed179c21b2982e0843e362959508778d97d4f8ba63d0e49a8b9a5f51c7cfdf2db2bd1e08e1e12594da961d1667c0de0ebebff36cb6cdc43e3f7fa04307cd1d00a50967d1464e4ecc997b24a5594a7ec01f21bf2cccd8ff64adf8a3eec1edcdbf313b2e1fa8496f51eae436724c983341573e16fa825fedf650ed4bc8d5147ca13a6bd36258872bda2dbf0eab42e44b1aa6a2661f9328426aba6ef1308f58289190648c0b80fd1995ab33bf135d860a25234059323430de734287060b9552bd992ffea87e40d3c1bdf7b034ac49575e5c1e4b37241e41dc84d3fe8e78d0b4565da6235da0d2d47d2c68946161d328ba6ae1c565c2107f83d8bdaac2a0e0d57c29a232cde23a15257600811694f920bc3a6f98f8c6c0a4d651e80c434b14cad04861514076093e6f30be1d0d281b9579c4a228736cd691e46dd013b4984c4342729d091bb48a42fe0e1730be23c85a6aac4d8bea811a0000000000000000547fcd04000000003afce7e4f1c4f65c5ca56080cc817ebf890b890e52039a5518b124a61f38ce4f6125698bc0f0ccb3f8083a2552a381db05b235467cca0080fce16547e5e591e66591aa7d24779a856d8a18be14ba054838ae737d7bd7a620f846bcc723ad517b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e5378d629e9cc63d75378fc9d9fce13f10deef5bcf11c06a25b56b366a2b593711e7efd1506d87fc6143900ea9a400f38719ab51eb7cb9e5371e991863fc2460c34714d2ce6cf45b92654c54b426745298ce0a0a6d423b7ec52e89aead6f56f64e67fa3c36735014a38f3aeca80ffd117b2e94e0d4909f69e98a11ec40268ad021f990a1befc2f4b8fc9dc6ce779a11383a4338351be764f143d40a56b2b05ab60228417d6380e9c3f17fcba54c3502c036aceb3a866fa8bd80fb1d461cb470695b0a062b0151f0797859b44a16adc8fcdd205bbab2626b14e387b1a2bb0032d471a8c45b29c23df84e7b29c779ae4b9cff00d40d7837e8c71f9e8da595f22e0af6340219c78732efab8a3742465ef1d36043a5aeeaed2cdda2d760dd46edc8dae6a2f80221a5f2bd36f7ea051d2d7df31d52ee83bb656caeec9e9c5858754df50c43b3b202174b6e5812fa6602793ef0f7e9c766c71c882f8d42c340e2c65e1c73618eb7a80320a9c0b18c842713c13f0d5124f8b7ec3d0aa5fe8b722e18c5cd60ba6a6edfb5021432efe32eb9e020dff99882b316356bac060ce87c37ed5ec9a67057af64ed6a75cb32aed7afafda4c3bf4d05f87b13c4cad5ed2e54e87949e6950f154cad1f949869dc793325e3f962ed0c0a68cff0e727ceed51309faec772ab5e28286edd8f268b05a66cb23ea8067840105d0ad5c32a0cddb7bbad26cc1ebe95a7c6b3f388b5c677325b75e6455faa7571186ad02240fc7f1fc0852f81054cbb75d00b0a2ff7b21b81e92569aca769bb217e484915af4743fb479ba52a23854d6e5bc6fbfbd603abcbcdd7b730501ed1ff11b0ab8990c108fcb1785c0b247282bdd5c7110684d0d90fb97dfdab9ffb5e9099d1be78b428be37c6688733e95e4200dc2b7daf37b3d0fc79694ae26513bdba2713bd33f5e8d427fb774357ac410300ed586365e31e82c199fec1ec9098fbe5ea248532e64b90bf2652d8e57b7abae8df2d9d48997f5edda179d5956c5f088c80068b4a6cec8d31902dec7e0fa188961ef8f402fdcf74705d42106d845267299fda1384bc6570352730d5762fc517d310498b9f338547360fcf19704d5a38731f050d58882f0e47e7e99912e22be7b121aba9258fc8833d6c3d7999e48c1c4c484da9914c44f5884f0ac8299282069c5d88684952a279d5fa8f81a0b75f32920a89a4dc6e9a081e0673cd782a4f27de12174a92cde131f5ae67b881e6fa15e373085bb7fcc3433454b464d62e96f53edfe7d2ec0f2e7bab022d48e7f0bfa11278c0e21c00c88564b98a3e8d9b840d3f2b6a43132d96f3c5ef6837c19405d9d049cb9b3969b8af8db7880ab6fda53c65e0b5796d156b59943a68287d8d3a65e2374c0d0e053134b0b19fe184d81037c72a0ae4206112c0c142443eaeacd8f5eadfffd287fb05705dcabde9a734ce26058edbf34bb4c9e28725d556c3703d3608c225b1ccff34911773f78c9f6696b51b80999543d21b8459efa4ca4191cf9894c3309c5b60695e322c9f04899daac8d24279a9d67153b784a43e0f11920170c1668570122d1850bf74a5095c8e369d7c1f40cc13560c810809954ca0930e10bd3c54a8ab66161f278aa698ca951304c0de447a144dc4d67407b5bb3e78eebf8ad1b6f0c22220de27a06f1feeb9ed8f14fbc24cdf9f21339fc5f710cadc1ae194a9758da47ab39aacc7118e263557f3cc953972feb5acc7dc9c47a0a68d3352c4f01753b5c8a579eb2aa058eda04f0a7aa8dcfa37d2029fd18449b3562be92072b95e58d51dd5170fe69431fa78c12f86f10e29821d91c4f38c033db3801593da4105d06d6bf586ec1d793aafb293a646e06ec4a41e66422c966d92cd1432ddd80eff04189d7c706a95c8edc6c1ea1541acb036b32f1be7e4dfb225bad2116a94f7995aa7c1cad977b4fb41687ed01be487374b068fdb438006848a7cf5a1b338eb00865a0f43130015076df8b7dd829119392f5e3197fd0a3f569529c3d443787cbd080df3c845742f3e17ae34fa29e986e1af1dcde76739e48818324b472265fc931d59ebf9fa9c40f4b2f046677d392877516cef1f2c347cdfcafad17ed6f52fb05f70f0d1ac894b702c5ed47958c507e0cb8cf8d583f5b01f0fedb3283aa70dc341c364d67a0ffd7aa034ddaa0c884bec0a57c12e329351d6d2fe32a980dba0c984d5fe77ecc9dde95bfccf794d1a9364d1acdfcfd0400d4b470ffd0ab75c5b7ad186442e6af22521a7410cd1a13c18fb45f6fb2295f06a0f10079bad1a7b02d9b1f2fd5ba79690834ef19d26f3affc28abb213363530f7468a6f6c63bbd0b7ec44c716cb2972f6653a4e28211986f5019903d169494b46e3ebbfec89299ba04fbf4f8e5733e8a624a8753a54acd330905d86a91110000e7de6aa3674b5b7be971ee9502", "52", 1, -1158903084, 0, "304ffa96fa7f6161a064bf521b4e7078cf6791c6dc4d3ab2cd1b8edeb1eb003f"], + ["030000807082c40304a346d5f0d2ef05c0a2c13685d807e110bb91493f7e7069841c6e4d735248aa9a03000000086a6aac0063526553ffffffffcba320d8913ebb9db65a5d39d7afa0e92ea7dc140c0208752b74de2fab255a9d01000000096351516565ac526a63eb84522304adf93b0b5d1ca9d3d2adcd41f97de4543e0612abe7fdd6cf1967463d7b86e4030000000565536a52521167da1466c3bb2d3258c87f81271b80deee03e5b896017974f5c2e61c5ddaaaf844e1b50300000005ac65655252e1082fe60207933701000000000151871b8a030000000002636500000000af755227030000000000000000e86ea70000000000b19dab7cd30a1d810767448c1a0cfdd5dd027b85dda77fecd6ed9c7b4654eabcee57deddcaaae43989577713cbd3eb196d17fce57a54da1fa582469b3efc77e30ce2b97732177ed6ba9866739ddcb7b3727817a9d663989f9c86e00a45ad6dc2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c81b91de9be03b6c49971293769956f27a475fcff2fe7941e882da43776837d98f10c06397320437df2ba3c72b58291136d75604d794764e104788757f1451efe6d0f48fe5880b926e1c16ffb9942de3b3b53d799b8ead1ec2e9d9c0b8edbe6f61045d16b6cf1cc3eb1d2a86525902499f98bb9d89c88f100fa7dcca2ff9f83031fe670de514692045c23fd9d58f19a1e479867fefd43b5be47c4a079b64d139f0223c0b6b1aec13d61e7b76fb3ef1ca9886d695176524d7e241fd95a23c2ffd70f0b08b2ffed754530c484466824d398c14e957a84842689bcce7cfae2380a1b051871202ab541229495e0c56c1a9ce12e7c823901ef6aa9e01d87f772487834c421031d3d0483ac17880e468bea3f15afdcdf1b7135c8a92d31c1af8b8ad25d8daf640216ccd37fcc82b542cca73f784b1eb661cb1992fe90f2be1e9ad98bfab5e29bc40203d88c68099183e2bfb34a1abba6e1e07a9f7a0a5326d65f6d63d1382b943e17032b4cecbee54438539459d651ac4aa74a116f60804bad8e4307ce133f19dd1fd803056ca5152c13f8e7d7e5b4aae0a5ef80dc214f177839520136f34923daec08af5f14ee4ba157bf295ef6c44a8c6897d36a92fc4b7bfb4b009e9535208e1e500b96ba984ee8cf59c032c0f113f89a67265e831bb5c5d02ae81ef3b2ab73f9fc23e6a35aa97602884c86c807620a3974775fa3e1d544ddd171c0bd5cdc4cb2c6edb5d25415a48949743a695e8b400f02e2d1f90152bebc30237460dd4a3b02d65a39e243f7e4752f0b97788b0c512cc8493e9418ce1cf950ae5a80444e1255a942d1f59eac422c6c5f083fe7c235e50faf87210375e9fd1a025c5c8e6b26d6d8ef2720b57e2349a6883cd7d887420713e0785906349328108e0fb110850dfe3f56bed9fea09796e2e1e3cc6061feeb2aafcba2cdd7c529f7782ae9e88ac205c1c27714fafb9ca424c21e17436633c67ac86541b4592cb5ff4b772ef061f6dcf73946bc74f189b260bb7d02d79a79df5d41e45e3056bb0347b5e82e7ec92d3022b6fb1ac43ec57eed113b3fd528db276015a2b9530b44a355a4b533950bc430306015da76163a010846dc8aa9b32d1d03698e99a144a2a6f78ba664581ec97775f3d1af45388ed1b0ccc8863f1afb79f3939c553e9bed6bb14e860f09c81fc2ac8d9f1ef8d1f2eef0dbaa54c619cc212cae154841d86a1931ae94f996202d84757fd6794ee0639ab8149384938db729612f6c23076e7fd99e26cfc9b4c36e0a5660015849afd9a5ca256145eb4e5cae71c6a6e6a4e871004d26d51191d236314f3181513aee760f26e1572d0b38eabf6f5391c2b8e5409364e047b91cd55391dfebfe3b38af45ec513b2c419fd96a3d33f45ffe1bdd243d4b00523890d0dfa2529b4abc3523e730daeaf67e59877704e0c181fbfb9bc909b9afcfb73b0a8f3c17199ecd80452e0850c528aa57d096475ed808b1431e706c44cfa6a1ccaad7ac5fd3ce43a60d7d771b0b9e4d556eae05eb81cc5e5a0419e18a5c7709c2ba792dddf47936ea88d118ec1e471f29bc7c4a7e4214b38599a75696dfe463b03df4a731b39f11d7ae0a8c2deed4cda76724847151be09325f6c92f6656fcffd9081e2295ab3fc6a5b7ec32fbebd7d6bf4bf076e22567d588c45877e05f59c8ef20e32dbc775ff2f5f9850566b0aad139dbc09938342668716ce4c77a311318816d499e6c448aac4c0b23465575098396becbf97932fd24fe73d21b4b54602e3023e914bdcdaefff5a8785ad5f4e808043e34d129cfa1e5fbe0b45f2c02ee850a0465fe9103474a67585c3598e317d647b83781d6439c4d2d4856207eb5cd9284406ef27c22801014a7dc6c76a3b63dfc0ba5c58caed27dd6e91275a3e8e26bffd37e14498ced51fa9aed10819f4e52acd46eefb1cf0126bf50a6c2981bc9b855f9398578cad5474d93fb2a3cf282876a918e3f272dca38e11b4f1f734b8f3129cb6cbf42cf2d51be6cc24792b3ffe5f173a4102c36a0fc792f3c6c4ec022cd5e0dffa813829a979dd211e95de5537f04d41b0a53d0139236828b6a906e69715ff434c7c15426124828eaec00fb9435a57a3efcc54ddec3bd9395078fa324dc046c47472a0a6bf4303731bf891402c013d06e305cf6505c889f22bb69e272fb23674c1a5bebf21a05999ec2a7da5cac32110f6eb6df821da28e647f377f9f0aa442929447f77eb3c64386672b3c8a6c31d7953b2fd5ff274a1736fca9f424daffba2ee0e3a8578786680281bcd0f2ad10dc4b7d44868d6cb4fec02000000000000000000000000ef7d4c662f9d0d25c32e4d207abe65973c93b29a3a4be63318aa18d1c292a23ff569c9e503e220b040b5a9495c40a2a3b1830b9402b22f17ec0774c3e2e64833c3a299a97204f0f7ed9310aa41dd2db7989f75789a2ee6d75a393d2cdb7df96f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b4aeafb0cdf35c3dc5ab2a094e958e3b7d73d09dc887b3a815ca008d66165744a29ff7515a431e5fb69e4f221ef88f17ee8f8b2f7a2b338aee20f64f74493ad4b6b70ddc56cab503accb6253f45ee0170ed1f27eed77c5fe08e9a1911f20f2d8201bb35e3880c62275023f2eae7b05d3384ca940e2f5197230bb54860ad24241032bae6252f01e5f3671c9211a259f6c1d1d3b690fb417b8bc4dd86daff65d8de30305265037ca0d3999ec222e2fc3a592d93c62ea8b50318fe5d8b134dfc96c23fa0a030793046a82d02e11a6dcfd0bc8419590a711ec8462e0f959dd989d7f5fa6c372c42e2fd06d0ab74d3571161615762d48519f83d27365632d8222d5623bdbe0030f4aead159cc930b13f40376c3e0bfa1dd126187f04bb50bdd9df709a3a92bc2031e6528922793ec64bbc52ea2d12d006dfb59a8cec8e9e8624c90b8280b7c54af031014bae2d6cb94b37400259d1b9b7ac20be3f73f921ff4f3765bcacd39cbf195020dad4cefbefb919c0d86769b2bb143945d9d701c1870b4646030a3f004e0ad0d0203711262201aaf369043b156560b0ea10307f85dceb40c792d75b9cee6f5e0392a6a5d77fb7226683a4fc3a71238759a1d3081151582d43f661b4d023549bf255cfa92950ece3ad00274622b7c7957d3e9664489ed72bea9a56bfebe667308980f740b6cf5e923519abdded64f0d93a88aaa6ec6d7204e27ab1c46323d72c493a27900acf0d1a73043898ac0d02f0f7f9a02da2439f99722fc3d0a71260b9ff4022d01fa737e8419865442c01c4af0a13ae63785504f642690b0de578500f1b621e7aa60e54b7c8ddb8c502f8ef768012d76bdd61922e841f3e3798518309c2d809ccaf9dad553af81cf80bbd88627f9cc12ffa2d340e55dafaaac70374ebf2d0b39b557b52bee897d13e89b5fc3c8d944e18cd37460f6308498a56383caf5cfd76dc016255f6b29384c4a316e51be0a03ba83724a7c362222c4a34ee1a012df6d734071c7ef3c5529f49d23c6db8eb1b9dfed492e9b9063ab98c32c37fc1061d8d2f48060a56411459a2894ddfccb71be794a907ca74946781aef58c27958b781a6b4c06ce5f7f0c364c126a8075fda9e363891e4ff4802d09fbb2bd9d21b701c12a36a17c74d4537bdacbe5c1d0d1e830ae20842a2ebd72a9248dbc5887c032997352e3eff08aa594bd6065756c30e41c9a643733030fcc1458838795570aa79fa7f241720b17223992dbb38fc7076a461b8cb2dc9c5d4aa485a9324808c56f3ae7025f6fa1e9d209e13c4c78efc936e72c552b321ad03508a57224a9e117d3e40f9a3d226ad08d3f83e77cdf478f0a7195ce3a4a2f2d3d2c64de77d613b32ea5813dc53dd044619ef718bee1f51a5bb0a3541e18e670fa258671a023b08a954401f3898100156a60b4ce996950bf1c1f8052d35e45d2b30bc8d157fc6dd6294edde227182429679819ca88e08a48a1e56d434d6f2acb4ad6c1fbf299f3c145f4d60928941f1bf590d3d5c5576c97ace63f9d52e29b00b06fd596e01a23a8aaac436a048df7973d03a818e4209ea46f9fb99fede537f83101976e2c2c4c987c7571e675395fa88c7114aa97f78b00067efc168d4af2717d9c4f4f4c4b38f719436beedce91e605768e657163a316b7faa389cd91face1d808b58f9c5043d97bf83922dd5e1a157f64b0218ab21782776702b9ee4d57a292dd7d549dd72239431f8c041b17d717f39bfc1521609e13944df4484c15be906da54addba51c7fe288dbeda4f1cfbedf36b69a459eda01e896aa7f8f16037f7d37230129120f0457ec762e580ada36ee710100213c9dc4f6921049582f84736ced351c0c14f2f417c828c4ed55d72f26ac8f6a3aa779d8f6a404114bd030fa8eeee9a690af4b9f22a095a2f50b4b3e16153de783c07ba8116cb4d152d657f87330e5a59fbdd431f6f2dc0d4be25410e84af7c2ba67c8780f6e1c33872b275a6f6031e7883f2b38b59d89cd22c656e046461facc34377cc077b2a8d689fcf55354a54ba3cfc76c4df2756aa9abc10cd1e11b60dfe54f0633d459925e55190d25b315c50f5393f629e4353c2f69f90bbe60b130fb281908baceedfcec0c82e630d87d811fd202bb9b7c0e6bef60b2bbaf91eaa36ae9d10972136380f0d59e053e88bcd0542b2182b8afb239595c2f987adc73b4e73e7fce05bcd93558c12ac047f3bdd16e4c55aac23198c86a571eefb3977f41e68fe5e7b6e65c87d48894c7230980c7cc3b07ea2cfe2e89969752bf469d0a0ccbeb19841362e984e20d804000000000000000000000000f516e4f63fd4ad93f0b75b18b555825726a6b251644d342e21dd73c09c051e500825185f007adf73b4f0fbf5f595d3da2e23033f2d5e6fac9b9a2e59988abcf28a987dde512e8ceb5b1a56261996a775e75d1cfea8a8a6d59683948f658dd55400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f37a3ea1df0c2cf81ec4c7659a290aa3ff6eb44ead8bdb739208010702333e191980df3db0051c13bc041c9a0322b22d4af59ae7e0085924807572a8d9fd1dac8f42835bccfc389ef794e3c322aa39bca30123fcd66fae368acd10e9ae15f5a8bcd975faa02c7588b084ea80e4ffb33840853d58597802e1d0a62f335c9d27580209a7a3ba9c165bbbd2d75616db4c71539c562462dbb48a18a00f0d805dfaad43021fec42ee2ebd948b1d59a05aed6c50b74a0bf75f3d413d012b5ab1707a5a93950a0494991999d22d1029d0f41d8913582e7daa66de801b771e518735264cd935efbece7c2803f70796efec4efa8d11a29a61c48f472e6c56eaa1de7de01f4b5a0f021180da0b76b5c47aa89f389a5c06b9f96ff355639c7aa9ea16c50bd18cb1e4ce03219a57cf43b280192e2eb972d6bb41f750a96bfaa4f940f2158f69ef7f257cb602067cc8ca9aefcb44af3447a980fec820719b01b63af1ec2f43335ba05e3d23870326019b959fc77f36fcf22b038a709ed0e17ae2ef0592cdd06e2d7bc67bfd734c022a28a6a42a9c961362b2863fdf03b734a0f2978f5e86338139d6331ebb473d346f87a48a3b6459fb8cc9ec1790893971aeebe70fb14dfad6cbe820c3f96b5e296052aa5a346ccec90fa91135877da37dd892ae28c077ddc154ee5e50cd337da3cdb94f61069d97a6613d3b9f07629443f8bf448a6274d81516df982e73b53eb645afacb736a7ad5d38f31a66bcf92cc9710b66268b9c75280a6f0289360f501490d19699ef1bb4e519afcc0b84c9d3cc4fbac3f812af319d8992b0bef16922a7a5a88ed106a820643c041cf51b5f21d4c90d7f8f636db5de0e253a4e30fd88aee88d1f94e95515f83ecac61ea03b9e516031ad725a301b433f30603b5c049cc0f22b23a05583dd13879d21ba636a242bed8cc78ecb8212ec8be0071476976829e3ddef6a44ff3e76195763ccddcdd8300305ed92fc663110742b3faa571e7429fa4aae317af0727329c4d29f8dec6fa0123fcc58530ee8d3ef5f94057f4906bda6793b00f07fb2d9c68ed504b8a2d623b3aa9aa2527a56906e486c40dc47f0a502a6b578b406c5accbe1373cc2baa3f49a2e1488de32882035df75af57dc4f6fa153620784885dab17e02f39ee2b7048f77a6cd2a3bb7b7a42af43440a7123c83fc4cf9c3836487acd9f1d8d13262523a4bb60b24206c4a7dda48050444c3450d7c607e3b60a296daa79195ace92eaea46ddce8ae6a48b3078298e88a2b6a2f21cd19bc13865e33cb3bd4a6c10466f83bf6f87bcf5751770a742e72d52a5bad522c9a06026cc30eafbf87f5798c71420fcf6746bc4836c35dfb67b0035c7f3d4a6269f93b8598a4475c13a42de93a2116dafc88963bd824d1dd197e70cefd6ce8e1d7bc78c8da65e700e8d657029a346fab9d13661110c79740baddf0a6a616ae7f64843287fe5f42cb5af3fe2fab7992164433d87fd8ea3554b9daf2f8558e13a7b6a8db4eb075b720d9299d688a7fa650799a409dbebc59da2ee74fda2efd2232f77b2c682c54a619181e27ba54796df2905e410e3d65c91fc0e5a777c913adedd4cd7c8a33adf155924abc7bec73bf41d2cddf894de89ca93d3bdb6a3194313b715ef4dd0b62eac71f70b84271b60f4632c4b117c49435469688366d8808cacfdea69e73ea476f6378958278fdc0e5643138e7d4663c7962e738164cb56a169361543906711e462aa54c8c402fe269f463bfd0c204a17efb8a8c3857dbb942237467e33a921ea390f82826f7354a9a51590b000f12bd1293a450b299f149057bfb05bd3f16d4dd2ddf3ce216ccccc023272ed759dbe30fb94a97f32ceaecf74418bf7a487610e05487e2ea276c0e3d27450a20a456a7f68508dcce9fe55b03a3a105994cc2d2bb9a6d82e86a857681049887fe77fe7d81f0a827846e6109101e34ef16042337fc6707be0b7d42d8dcd8b7c35dc8df59c6d04c4aad8bb1b8e2ad7c6899c21113d2006579307a9240b04d6b5f6df9245814bb175c320e0b7a0243f2e0ac78ecfeb2462d4d6e86c900f9f6140122d6c8f72c48e05b0e965b07be7246b3f343774a2b227ef2698c281b3abc09ae1a1cedcc5a8095975a6aaf1cf9ea41f582b6d7947822f4692772c197654a9992b361becf2fe47b3b8f2e8535e369c542367f46b18b755b60bf592f3a0fa9ecda5bc087a345841904a2a52ffc2e27769dacd437a460a110057d43f276f47325143d143c5b2a7d5f80cf08da54a7472934cada35b6a440a6cb82f84c9dfcbf8feabaf152a215b1458cb0e9bb9c3c576241f3dbe9a4645758a044bc171ad958d6905f3603cf1c52a04fafc3073861717ec2e8381147594b76bfd528536e0391ebc1dbdaaab129f6ec1110cd91f821a3e4f44fb0f6ce846ea98c69acaedcb400c", "6553006553", 0, -1056121628, 1537743641, "e8a1896e76a3f0ec21a38b38d09471b307d3399f5a54734bc8b400d396b5c49b"], + ["fd682d4b0329ed0227ca0020eef8c8f2679f6a7f36d50c8a1eaa5d092f6ee042929f66799f010000000663636aac6a53ffffffff4931399567bc887becf50c7e72a6492fc9e8586221f031ce2f4495cdbfdb101903000000035200acffffffff1ffb48a8896e0fc83361af52883d48a0314f9b77543fba7adfca35617381d9320000000004ac65635381a494f30462066e050000000006516a51acac51ca15ce02000000000652ac6a52536386740e010000000003ac5153671a550300000000036a65000000000000", "006300", 1, 244863857, 1537743641, "851ae83c0ab21df5bc01444b4c0ab3cba6d657311df6e9fd6749e090e1338c11"], + ["030000807082c40301158191ee260839eda74534667125e0e563bf3cc6ec0bc6c030ad4536981e52c700000000016affffffff0360f9dc0200000000076352526563526596e0b000000000000252654c55e50000000000046352ac657c1914480000000002000000000000000048038304000000007b45a6a967192aad11228093e00e7bc88bef6bd42b4bbb5ef12e1c047d9f31883a906f3e40c6d4eef197f741465263910de06f3435f2d8c01b5707b46e4050a343d90e880f55eaa836dfbbd1b842a23e051cd392c9cdd98e2061d66cfc76e46000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b473332a598d42929d1b7e279c67b782fe0c9e22905d158ce2e71df6cc16589267bda89b558d2d1fcd769272c7508f8828a7b9e2e2da1ae19e265e0d2802345da2ec37fca941fd102cf5eed07112c1c82e0e7c33a41c5c45b983f84336bdec95998ee70d75b5f89757b1f37a28c11244d0df0bbbc3d5473f74d17457e6b5bd790319ec8347034889f4fb2670c4cb5a5432909ca2f328ed911da2226c0d1bd31d2c0214cd5309416acfa2886e557147f0f56e56f7e2637be55f651891441870da2c3a0a08b8f4803eb29a2083574084231b0805c0e38fc326f8980fc392231ca46ba9d1a6d0841d164e7268aaa7ecc444cd6f8a13523c962629a92f5c784bb726e9054d03249bc7fdb5e89dca592972ac75c1b0fadc511c033728104edf2fde3a201197810309b882ae2a117f3d12389ae089393fb50d5364fe161fc40d0a695d76aa56b44f03108dcd361f8820b6ee767b461219a65893734ffa837a9933a72fb2a7485081e003149933dfbb092565971488e9a5bd5a823ec75a8e92f7b37b686c47be7eae2faf0306b3be29b87ecd3f8ba5bde438bd0cb2c150bc1dd58d151339d73450d5fc5c749d35368ea0883d3b8fc7bea2f3c77f0e0d0d2a6712b4aaf296dc1b989d6401567d3b83857eac4377aee732d0ebd7f95f38ab1eb59a45375e4b9a14e528b12c1776c8634bd201b5543644d268c230b696051a700ae36dab7500c2c600d7cc2c9865a13481946c0d77890aece0ec1e95bb2240b15b3c136dcbccee787632b82e0cc5a324d4d7606f992f9f800f7bbcb1764f0ccab3b9202845b377a5aec0656c648d8f56ecb0cad12472acb46dde7f932c93ce8392077480003fae79dbfab21d61543b6ed17b53ae736c89ff056e2129fc64e94cb73a7b15d31ae5c440b7a7d6ea7c8f00e1ff4d4f42c36a786d7c4eaa11c57fabe725df00203373be4b61fbef45fdd5f13368349dab5ecebb997d0716d322a13ff1b7ee95916c791f71b73b8b229d1dc2f97efb7ef88664dcc880457921757643e2bfd1a9acc2276a5ac9e5e274cb50ccdde7bff16812ce92624feb38795bbc4d480a69318b9be7f3a545a643ca7043c0efe9ce73c1750210e2e3ecddeb6028551e6b0f8eb676674dcc9874cd09df52dd17935dd4b36d7a125364dd04ee3d5d2fe5f8b8cd2d65bdfeff437e8c9617b04ff1159d2cdf0860ccd93781843b7504d065ec689a0557b69892a17518f1fc889536bec4097062beaa94a60cfea8a623030bbbc665f122da2e6c13f355816fea416ef609e5260d8909d8f1634f4bf928a414123fa8a4fdad5d94e73adcf6587b27c86322af2fc50f37482f8b513dd8cd97d3efed1c15db4aedb79f979a05c8af1cef46f615563752897a15a0c322cd8791e4581ed86fb98a4ad4ee48360737efe46f282c4e5555d6a76d53a736f35be585c3c522eae06cc64ac0f907855807e1ef9481da0dcb76a2b3c69c31616ce2a6a4fc3f640aa7c79ef2e08cd182fd58f54c09f5f0b0fcf0b74838813be59818b55c31f875f34a257c8b6af18abefbb2ab13812a71048ad590c7cf24df1c379ce143efb7f033c6c9d0e2302182fc6a62ca8bf6c0ce0c3898dee6a9de4da49752a3a28ef6ad1e2e81099f22a43a2a55eb0b0c208487cece493928bfaec7af5f887d0851367137e8c03682b6fb3128be3fa9f20da137528d6c033fbbd4f8361b50f6762b22d3ce43f0cdcae009855628d8e5de2178438d6a8b9fe3afacd2c941094b360e66f5fb4d9902e70d471debed1165fa566b12100b4bc32ac51066813f7a9add0178432e31de383d4725e69c0118179ace765e2f061529914fc541bc7930e6f1c594270963e934c1f504b674ec2bfabb1800beeb0cfff5d7632b4dcee7a3ca62652dca633889c8b1c1f363109533db2b3acd03c69b9ffb8578b0688fdcef860cdc5ecbd32633f548f15aa4e1d52feb3f81eb3b582cba3868cf56a812c03e68222e66e98b17ed545dbe1d974a02576269f9e0b09156774333bd77e8afd82f22da86ee620bb17db827a948791d85b01aa45cab5ebd9e259bcd5084b697f055eea318066137354e8c00338960f15bf37408aed273391b64a7a3c97e108da15f281cc92a2bfe909150f514f790a734109b31413053c4895ae1e1830b59d8e3d1d7172dd46d82de9c7a345972d05176aad720e7cf3f11cd5e60b7c3f5834d9e696c174a713c1bf7c8c32637f7b6ddf9927a468675b4fe1b00628973d0db5ca537b9cbf242a316a62917acefd37573dacd6f8b143b56d359709cefc556b0e3dee5ff34689101000000000000000000000000db571e9e9270c95cba50ca8a34f00158ff82d0a01669a3d19185610ec2bf233bbf63e3c13b04b4d83974f160a3d6a8d99250bb45a3b81e235411f996f88251dcd0a28fddff9af2268410862d81f2f48685f5951c60b970b271f58a48f1ac20a1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b615ca2d375374f1db74950856e19e074d8b310864fa0a196b89d7b233d0aa8b3aa1b6b3ab86883e28e9ab28d490ceb22cd40a32a698e75f37ef86663e92ca48117a9604cdc84c2736a9a0c4834e1371a596611ad241819bbcd0eab4ebc07c77332c9bda82f844c59b441592809849d8634c8dfc806fa30c08b39bc2feb51810303ee170077427baf7cd1fdfec9cc7e317bd354490e005a119fae56b0eb9bde280327751f8fc403914c7ab23441ee7b5878ddb2546a2b70b58c46c77507a4e814170b04e5bd9901bd7be6e0a5b78a92fd0ba7255a9ee08bc4b8db6b25590c1b982bf3a94915cd4b0b080b51bf12082fed38684b9781326db6f23aa1049a613e4483f1022973c645a5b4f192f745e6ff1a1db31d33336f0b558364dbc4566f492cea033c02208adfb17585af3e81417ad8c2d47aad06b22a66add0a973b988ef8b472e0e48032f101f1b700de41da87b07b0b1f6889a24b04006d1c6a30f965d6b0338b12499020667be3ecb8b482bab8944c9dce4a85f0d348219f5d7f60de8fb1beac51f74bb0322824a20a2adefe7eb0be8694652928863c8774a0c6861f01253b0af8e58057dbde7ea6003b0eb14785e72a06a041b004fbb98d85ee2e5eff82f3f6734d4e156527dc1fae8e7606fc7a5740b702d55c871088c214eec0898038afe4afd9d6687617f4846862a7f3590431d154434de8035cea23c102e114d44044e233dddb286fb620f37139d34f8a4437f7998b5cf134edd8edc5c8ddefaf3369e0e56d5154465d9d69bb3e4ff6faa0e0a158f4bac3ec99812c61d0479e40c1b10ab69a4bb8b41a0306897c70e6876c0a0195ce5517223bc88e95cc6e356b1380fb648140d14df2b375548e00d6ac6316629b92c7a6386425c58ce308f4c9445e6a38deb354ae70318c0adb1ca69160ac6a420199731c50d36053d6ed1413fc47477563a4ff53a18cf2996cb794b7d79c5c05052ac799ca93714bddcc3c4dd103e931572530b48471ecee3add4631c3331e0fcfd2b0920545b023895a8edc09d815bb62cb2fab41c0a5559a5e0d27df64bb03a36407988479071855004b79af95e560799e963dc1b173a3de51c0416cc71cc4a80a7788817418082acba224bbe68155eb5094ded288f36fad4d63a0556ed1005a7d2e9a9af9f1fee37afc561daf685af1c9f013640edb05e2f0b1a63358bd519824994455b67c23750e5f5eeb1f3f16fe0b08154255bcdc460e4d7ad9f8c115cb1a0a097d037420ca5bd2eb20af35a02170fe64f2e0f053594d78cfda58614404054b2d453914bc127794c59a13fa293850d423646577b008619dd87fa7bc430380926639772f958f4a5f28e92c9023d7163d5efae5322013b88c83c992449ba3779e983ae5ceb6694d280a6db6511702b9950e586ba6f3b43d021928b325c917978a736ba6e3b6095b64a47f730ac5197838dc887afdbe8cb78ea430cb4bf89dfd39dce8e3e6b886838c9273ede620b0974d87f6321e1ad508dcaa810a1afa2b624b60c67b0c6f9066d551dccbe352c1e05731c4c6a10b6384b5a45476747c57defa4982f14344267058b46d4e2ea657a941147c6ae70ee6390bdc910daf00441cf1621c45979cadb055d970c4b8e2659253ad1b606373d9a8bc99e4331cfde05a9b490c448edf063bfe5851fe6f8696cf6268e5b6136b8076ea2d312553cc9c72462a523f41c2645c36d336bfc701a31bbc45173bc2bac657781e8835e4822768e3cddba36da42f81faf336a2cd64abb0a98bb63f6bc770155cef1e852f11207d475ed1d540ece104d124766de6ee671958310a891b4b3124858c150b79d24eacdfc33f14ed07049e293110901ff86365f53f96b7b6786164cb9d8fb85b1036b7a518295ec310df8a45224c777becffd7d5e551d4c333a3279cca368ac9e8d71e9e911aa0a05c575c19edead2745e0b3b81b55fedde40baab2aa9b19a9ff07b421ccafa79a523e4228bc80b260fe346309a8f3c158b07663197984cc278e69e28a285be4a2940505a9ea55b8a47f970ea2cde1aa688a443a3b9b9e84f5440dd48acd1f1ca61d4ce2edf0904cbadbde4915cecb977498e2924d598061f51ad14787d841a170980c9e711dd4afc46e41d37656e15bb61cdff1dcca55fd5ba3debe80a581e9c8ba76df23c7ee48ac11e3fcc07846a14fc097542fba20b99f1bea7e6adabdcced2e10c558b077bcca717774e6db6098e0e6b3bb119b0c3f0b3918b078d8b5455dc3d3f08143bfbb1e5ec2942e95b74ef4dd66b95391259a4fdb65a30f5ed9eac170c0dc1ed55402b0619b0839ef54ca78f838ab35c0b59d40b5245759f7226a2ec5970056a81d042b9f43f837182fab0fe6a5949e842b1ce0faab72514234a02368e419ffaaf9ae6e1d87d6ccc38e857aaac1603e24c5d813afa66115846d08", "6552006a6aac6a00", 0, 1007148517, 0, "0997ff16c4af280f0f892c47be0ca038dbc9ab85824d6ad5e1d467ed787c7ae5"], + ["b05f5c210125235b860741305c50c26065fc736d29b34334f77d1dfe77cf6c04da620650b901000000065151acac5365ffffffff03d7486c04000000000097ded004000000000551636a6352880ad10400000000096363ac6a52525163ac000000000200000000000000002ef1f90400000000d31c6f9eb4b2c90c33dc611e91761f6e5468817311072d9b5ab190a79b82d4e9a231f5e6b34752e8d14951881f39d48469e5d9bd66221c78203756d8196d9d9e2b8c425ed054ec5b53eb1c11dde4edf13e34a19ce07cd1a52b4af1bd4ec9fdf20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041e92bfc1edadbc90384d90f1cee60a77680c126162e614018e7f0cd0dd64284faab2eb78186431ac78843ec13703ba9db9cdf31d5cd99b578da20eecd2eafa16a7f5a38b5cfbd17e94da24cbab7da127a7873607764b20e9d4e06e86cb8d343fff54192c9b1c12961e068f76f62a91369653cba779078662f2cc98f46475a400221486f7dc5267e9449ad91f6930a70ef2a0ca1e2ddd5f3b6e54710ba87e48f970208ac419622406adcb6db56ee01514e6805e4f4a578d6db20e9645bb23bd62a250b01f0c10fb7bd131c076aba64f4e391fa4455b38ffdc353cb227bc5a5453af535a5ca26f996c004bd0ea6a676b4d68fd65aa50bef2d60f54ffeeea8129c3d08c0020b64e63cfb0c213ea75f2b426db8a65bdb73ac0d0b7a4a1a046f3c7c2942c673032dc5ec23b1fa6bb6a883a44f823124e44d024036621bce9d721ace53ceee0c2503029bab8172b0d1ac1c000460896df31b5a69ad68651075eb864ba70acff5fc86022909754e7af18687c6bda6100d6955764ada498a351131a120b1d8a19b89c8ac02086d9e88d00392d1704578c7f2c7f269cbeb1cf2d35cfa0444e3dc67e343ead01752dbfdb1d35a79ae7929c67afd209e8b089b8427b7b9fe9dfb21855f28535751793becd9c6da4a1cc773ecdf93c20329118648933581b2862e814035c7f1f97b75519210da204416daeb1fdafe2c0da1f7630f3e3c24d2d946a117d2123ff6ecea3f5a0c6b41bc1030926d251b45a738f996058c188fb3a047b71e1c70a4f67478486a9bfbffc50663d14130f639db7c3bc18e20e79559d12117122f4433e07197f9449b8ab0a25a7f95119c26e719b2fce5f2373b684b680fe25ee0b70d3d77705f23567335523d6996df12440c64012bd6c84ca1d153818de94519ad5f923cbe5874d4a595f46a07520f726308c13b6f1ce162853a239b9610322e1f1f3d80f04ae80e8b8dd5cfbcbe21f81398d596580fa03e38f77f5e0118d965e6367b823085a618dc7a9ec3f1cb9ad5be902e8196b8f83f69222879661f3f15bdc19befa8d728534532831455ac8347dc2e706f071ea66db6cdad47c42c625de4a157a07eadb351da9a5b6b2c9a7ca007f87d040bf223d0a9d41baa80c55d61d2127fcab7a6aa5c3fa1ed38dd0cf1281679aaa51fc38303f9649a9bea512f42428ba2e13f28d4b7c9102505f9cc63ea01dcad9a6901f07bb8991e1d989a3a542227e83ab57dbe2a942049abc30a191fedb24493df3876abc62e0059f078e0f5d6b41019b00b848145032e3ac0bbd2688b8e5370719b08fe60eed72435f191cbcc4c3ee128ddaf850bbe5d07a380538a9785ebbd044b523de64a9121d927bca70290b455e110aa47eaf9066b51b005682235a177c3aef2a3a8b74cfb64d987159b0a203005b34720cc91db671fc218c0341bb69cf9a377fbc33fa6777b8a8560163eedaef7d4c1199bbc1cfa359edf0e7cf3098f4632358c378d6ee4441cb957d75f8dd50c7408753f632385193357e2b27ba77e0fbec55ada3e650fd7019f83c484a9fe0bb983e78aa75c7d2934b7d9a0f8e9fe138a698e2246a7432fb2b5a8a92ecce270b6013d9eeaa739947b81925ada80c1055dfea627725e73c150737bc9ad835e3d8ee1047791201e413f4b4f18cd3e9b98cda11cc529d7d11b639165c71019354ea19c959aeed890bc2bb2f3614488e0e71185bcaca5f3ed84b2020806a3383ffe690ec2d8b9d1827af192a6d2d5c6ef1cd4c3199f963696dc81f2b0c50bf39e320a3a5dcde53c4e512e1e5cf8c938ff66f429b8640f7b8e6b5a5fda0bf1d662b5d6eac4b30e038786872a62889d312e2411193c50454bb3e2cad86bdfbcc22dcfb7f9e08748b817cfc974d1a39e9d828d5d45aae0326d26cff6972c65f0d5d8f254ff5f493032eebe1f80da0994b2ed6ed8bf49d2cfebd84cb2734405025138d06e76093b9052c5a5b98aafb9bb43e6534d06b94d83bed5a2d22124e2b16f6679ac0a1487a7685fcb208ebc3b317f5931fd7a156ef00f4c23101c65ee348312f591fe86c8e4d4b56f62ca4f0da7347e1d1b935cf5dc2991a95fe207fbf600a3fdaa6c0719ccab00eb60019fb1bd0ca48e936352583c6bd26425da506705478eb1e67f7b96a4aeebb2f5f4eacc72a545714f6054628dd68dae14cb4daa7db4bca8728f4c94518a9895365d80bc2ad791a277e2b4218eb63661949b174e3ab42b0e752f6060e35daea86a45ac2a8355de12c4db5259de652797df992ec62819bcd3ede08802e7d01dd65881e11ad434fabd0000000000000000c8570405000000005b1f166474fcecb8cc03ba88d95f4ff0bbe5922cb458d7525c44f19afa82dac74b9add21cd1dacbabd98cc6fe895471e5d4d20bc423174332066cb8f7e2f4c669dcc5e325b2f063b0fa200cd7f2e95d5d4877c8ca7f44e22dd5ed0a92bf6108e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000adefae93d926962c28304cda16efc1adca179a3b4759f03d5be2017018982a916073f0e5d55e9b0a7b064059f4f8869fe7d52053eb814c6dd9ff88c7b488e144cb1f5e6f649e0fdb8462fb65e8389af9a3920a6f79d94c19e620ea4bf2378cc03ed42ada89657725d857e2c87ea43c406f803baf3b36b187d5c54684ff974e520324f3b2982c96244115679a9b446f516b3b817f4c744a1f1d08afd4fbdc0f1b7e031bb0fabda1a09a01fa790316ddbf60ae230e6cbc9bc922791036a5cc85b875300a012dc9d1f3fc890869ef01695855f735ee31f9c34a675109c6a11bd6140060fedc8f05dc819603a125dce0a30ad0007d7068b60c6badbfabceb028b73af0e0b70218c8e6a89abe5ffd0f29c69c179b64ca8b487111ed7f895d8136170481de80c4032487c1135ffa9d54e72b33a5b739c713cae401c6d74124fc2cb08cf408637ac8031e9f6676d2ce33c95b4f6447df227c05c36f585ca2bb3607e7b30d6e73d641c5022fe019979da658e4bf70a0da91c2878b7a7f718a9f2cce42b51c463c7c2b3470030988b3a09ec9cdd3244c6d38e75982f42f581da5681d200b18b9bacb32642d3c518f90a6ec319f00907d670c2f96d3045848ae67ef72aec19cc9f27eff718238efec7d6e64df0d4893dbe9088e7827d5777866edd66422361c436bce67a3e8e0ac3ff1bf1f4b1b2b04cd0f13db07ee3ec98aa988e99f385301e8aeb0b6049e0009f9f69f1457f42473e61f4c019798a3d9afc6b8eefbd8ff01b9799e71d526e790ecedae6503111077842ed185f8da233f19f1e7bc877d7fcf3dd72b657f5828b87da4deabfae80d65144691c42c30cfcafe962c2bbe7f42d346fe114a9ff6767f1f16c4a4259ab4198ebc789be28720441e70b9e6b9cccf5a0ba395949a18e384bcc1fe012a4d9b6bfff3af6f1d99513128dc7781948dcda656f4dcc32c05c188d6327e9ee955f7c59fde209304151ce3423082cdd536bb548eed954cf07e41caaacc70edadae34145ac624eaf155eb2de49895a4851bf011de49cadd7cf0d12820206db6569f1f8e86016008f0620014b80bb0980bce77baf07759b882298844041cb6ac64474f267304b0137839651fc53a74a3240a941c49eedbb8a8c1a9992c331c509f8d2d94c0413106ffcbc60d656980877818ddef44f18a6d5e4ba27435be1f0792c1e75092e179d7692199f8b75bbf0c68f5f4793d91b852d96fc1af4223bf267aa3832018aead15a1ccda1bff4575e992bcb0b8e7393f1bb6bcd69fe347973d36f074e155e4de871f03e7629149b1c43a55bf4ab6e9cb2d7409af0e7e5d7cfbc3279f9c644c2f40e75388088927b1b4d9ffa1ab49f4b167e4e8dca71edce9ea1038bfca03a2c01d722fa3709ed2b90c20772e61879a6f5624c8569fcbbd3d9fe308c8d449ba3b16c8574cd2048c416bf0387254744d2f0652b2bc38f21e16a045222f78d39cc3f02df4b39abde40e7011a6318f06f28dbd8b2eaa3daf80a52c8473c1fc948f348c803555e520146750b145205d38755a64076ceebb50fa8c6194a6ecd9f58669cf80d442382104b54b788253b57b204e7b214e54ed42c4d9bef02b46948ccc218821474034e6a9b7df96dec0cd0d59ea60908fb0a04b881b211eedc7d5623987c8c3eaa87efe0aa1515234307279b96e9010e431bde192746030ffdcc6dac997a2c3e4fd756f2f74d4b1e52e826d258923d217f5b09bd9276b78c2b153009f46bea00a9bb857c787972fa9d9e0a758f9adb8acfed3096208a5b211a2bae26032e6c613f4b9782d5021ba7649340c8f07585ea79dd5ed5874c0c6e5dc9a7b6585ad8dba5d2356793f5f5d994d89df07bfd5a4cf54f62cb7d488d92a5f2fbf46521a8b34ffb2f78322ca00ebb0001af43a4a5644845a88242c85ac2d4fce33119753fc7e3bc60fe5de1c1f7ae67744295487f994d7c932733ced01e01886422ab616bf4f1862b4a50d81542cc3c57f1f019907b05b1ae6968dddc423f8d5f4fc76fb02ecb2b2bfc0651499f20f12c3b442d4db460c83b119141648b01c734fe7f869d5043969286333e999e97923aa8c1d8b812b559813d2c9d95af6c73318443c0b70853d0b0ccea27a818679af99f4a8f8acb44541962aec1acdf3c51e8efb7a51635fd4ce48790612d8e4f31a852f9ce8e723867936ae05724670be1e5703c98c015559518426271cfcb627c0e49d7f630289c72785224650200840a44b5ca8efd45cf11a449a5fddcfcd81ae17e7a161710f910b9df62032cfc3d9a716c278a1c99877807ccabffa162b5ba39e911738338cdb9f5848fd33702914c304b1e78616c398f81f40a3450211b47406df0e4d43de0075b5a4d140b412b1ec77b13e038ad51a6fc1a4830741ab798962a16599bedb8673f3d4e1a314236f0403da413598717dd007", "63536aac63ac6a65ac", 0, 1177520479, 1537743641, "f89ca5756a0cf30f41238bbb561f03a459390c6cb9c8aaae08a40c8bb50d4348"], + ["030000807082c403043658c3f11f5690f43c9ea5be81ae600bb5a94dc5495e2f7e13cf610d4e04add703000000056363636a53ffffffffd1a5b78b20c24299a2a1204c1338123ca3f6bef7c068393a34e1c72e5f8c717400000000055251526363fffffffffca2306e889bd77f32696c465845d432c542cf1ea4eff879d6f0841b8201afcd000000000152ffffffffd0a5a2ceeccf12640610f219cac289fc9fc7bb5a5e549b36ca0fed79151e74190100000004536a6a63ffffffff029789f4010000000002526a527fef0200000000010064062179000000000290f3a405000000000000000000000000414a4ea9a43007e13f38970fa2a3643170949e0e63f146480d32dee216d1b8d9bcc4752568cfa4930fb972cf9d98feca4ffcc61d8d145ba56c0b82739bfd8808b730abf060e6eb0220532ade451108dbca8c94413ba574a73ab34f048d09098b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002eb4f737147403a571b9125d41f90afe04b7a1026c7b9630a9ce95051b9b5e8356d4c83779c63e5db451facb47375dc45b543000b2d9df5d7b119d611d6a40a6db9eb19a1ce570ba59204caf78eb4e9bef2778682cd0a31545ec3b3b818481dd2de0680cec6ce19dcc350cd3cb02a236954c2f0ed8b44938ce81cde350d111021a6b44c7afc8cbffe48148ad798109900f28f0ce473bb0345e27eb6444882645020fa3e9a479670619550cf38e95578f770a31dfc3d61430c198e904a7ffdfb66a0a04f829de4c72c7b47c8c5f3613107691234d4a7943a7672e235bda02f9ebe7fac190af2cc8b18dd87dcfa6ae888065665f357fb053d121ec656ce0c163c26bc20320e1948727ad8d55faa0aed33ff278319d8cf5adc4aae343108ba748a9997e5c031e31f330b21e7b57378f881f392bac3025cef8c9a7f0afc557b3ecb4ecefd78f03166d40ec46584b883ae0b2405211eff44afcc2c1ab3a4a2fdcdbdc3eac9127ee022d89b71a7d3c8c8ce22c4c287aa75c36c3782f7ecf05596f47676351a636eb3f0203e539500f0d3755424da8c2ff10fa6dba8588b954b32d1d15d8dc148533b4e86d58dae5d5fc52008266f2011cca069a4095917d9bb65d54a84406d4a0196c1eed1f0f6b8c82e10347be3427c4467f40e30b09587a054310e35a87d831ff83e7deff27439ff56e7d756b8151d18a22697bd0edf6d282f3ec61d6aa0f7f12ab8482fa4f2aed8e5e1881a5b181105b2d37fd3689a40f1a1ffa4a0634ef1504d9e9f37b1c39e61661b2d3ea9295c5c1ff0e3999918e007c0a2bb6ee498e58f97275fe598b6ff2db4cdcfa9a89719364a4c88b77f491da1f55751fe1f54fe447e1821263341c8a8fc6916398738b93207bed1c1b02b7245a90745dc2c7e8408793c1e69a386e40499709038b516361ccd62c80871238063ec9322f7f19a2530d49fafef0f96c838a2741d65a8af60f8cd9541c967d042f7803bc7879de8a7716aed59bddd78c2fb9887bba41104da2a8e576158b7c6f62da42376f3f94101e7298689ac7e80fb683a851d7a866be5a7376dccb0303daf9ad8e8c926a7e2ebc69afa808a7fc73e208d037d863ff9ffbb54ddb8bfa4d6093c168fb036ce7edd18be9602a6068d8642992ac53e4f48330e1ad2c6a96d550098e8674b07d612c306ba00b815d81be4d602dcd47bf06be62513336e93dc7a89dcfbaafd5fa3f681e59890cf627978ee2f7c8e135ffa27af77b0685bbc3b72c1288208b4b81ecc6d12e6323427ca1cf79304ec16d9526f252429fee1fb18818e5a4687d77e21d4b3e7027ce93b4171d2101ee4d41615d7e5fa6d41770d7b0f3e5a036e5499763d026f3769073c4d4e98f4af0648c4f2b91d41440d4841f5bd758c86945150e5412e181b5d99acdeddfd3065a090e0b12c93491b4e99fca4c43ac4b6b79b0cf80f409a8bfe12de40e5658a51ef1f9d6f645fd55088d254e8b99799d88fd3c791b52197d2c2b143e29691625170c9f1c3dae6c87b70e7121040727c28f8e72d3868964e91cb1594dcd7ea280a97b13775fbcca85ff807535f984cabf262c77c66d5f8c1d83c196922b0a4c1fbd96d359c446a147421a777529c459393edf399fe2bbcf444ece912d7c9723de81322caff2575887bdbe4051b65815e58222964ba8909f8edeb8ba73e8f85117ce6a6fd470322677a75a68e6c37e95ad4f372b1cf9d457f06f4fa5d1b81b539b44b1b49e524e657dfb1c24c1434321cfb9e63405ca6bf0686e5d58515da753bf109271704b9600d1c352ee569023f27d074962f60afa598a59c0b5a2facf6dcf201cec9e0a7e5bdd701d3bdc9538ffabf9d636183870e3bf84a3423a829de75b5de28421d3a3354942e2d2242abd699285213f6c7ed5fe66cd70bc8ecfed9e547dfdb43fc083715e17dd518d1b8b8456476b2576acf1b4c3aa65ffe3bb99e169e9762c52b547c60d01660de26a2653937136df80ada733542b3ab0784b8762c5ca00d9777e1ee36d54582fdca1a05df818c68f5c171844098ce66e2e1cc322b863daed442acfe39c8f1689dc40a1ae8b320c5be9c7f36a710a51129675bfacf174ad3e11f7d7144c8ba4e24e080b9ca85c9db1893768bda4fd8793b0d092d4201e6f35b51f24e2a9016eeddec491c3145f55cf52f56e21b834cb3945d05cea59599dda500a70e7980114483874f54e524c3e06b086ff0da0cfc9b4655a8bd27894274d18c0b7a74970454b301b82b93c333cf2059ea4699703659cfea13509c9084011eab01a8268d593597530c1ed040000000000000000000000006511ff705a07ff31a721647a3d444e47e7ee22e800ddd0e21963839f77b9ae6c522cb001b2f2c6c51ce1abf800577cbc3df2e30510026dd056c8bc45c18bed7b947d561b0a4daed70da0794bd262cdcfc84939cc64eb3791d12a207219fd545d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a3ac10668b5b8a95016496c46d97d56f7e9142bf34a44581b8a08dd4ab0178c853c6f1e607ae284a942a7d59c38e9d76e07557fd75f778bd0ff634be41f4282f52b75de4c84b7c588bf215184ed4a36a11c9a3e943a3089222f1910dd65a6bfc36edae82d2cd17628d49ae0dcb52994d7d8037e137e8b607136bdf5709d19f9503213bc0bea5cc41ec1bb676f8cc87f3ce9a720811000bfc3d4f4aaed41ffa9b7b023031e79d17423a4d93241d1161d5259f68f4b9af4ea4aee5246ad9c07d85f7ea0a026dc7437e0057e62af06d9c9bb6a79c1f0e887c3bc0c88d090d1e1a8d1511a84f17e74fcefc9df3e4ae9e26831803e1217b37ee76be8b257f687734ee9893cf0311875b11247c8d7f30fe1c18d8278186c768c72f8395c0a8d855bf2003785c1b0211bc0cfd24d5d04d4c8ffeb5288d0b1a8c725044329315a68866de2ba3dc56c40219982bda8cdc28faeacee97444c1bc8b3ba4baa8870952d78981397ec9c9d152020cfa7746c924204d83fd5082ca2f53c3ebb970b7b210c8daaeea043322da26d10317b041b1911c5de8fd93f5d6eca89b2b797acb592a4f2920444e425c68c89c22949034611a33173537cbb7318634749fa54b3be9f47a7081dd24abeca5ec92ad7cc553f5358c0da8a721a815811afb0e71273f3a7a2a501ae42aaaf62a8191d0a22b68fc4e585811516f30b5f66f3f0cf588c0c1b19ba348052b9b8e1ad44deb18781ffb7e6343349ebfcf8a5495928e7d125378a37ab26451198d75594a8cb42f6d93a6edbbfb99ddd6dfa5b367d433b15a97b5c78833f558fd345eb8ab3af5b0d4555bdc150103bdf4498e8baf6824e3184d9807b53d17c4594aaeb5af810592177f9452692d1a409cd610cb424933a743d65ae0535db955761b2bbfeb7ce790eec8d662c72fa2c7f73fa290c1dce47d14f9f63bf6d2aacf933ad4dce5f6e724310bffb93f3dc34d5a451578967a8c206e72cddda792dfe6fa9cb1a81575e2325df8d2348a9b20b7a70b7b67f138f07a34adf16e85042f7f83121d1d8603f05f82533b4bafdab30aa94020ca9fcee55e16f3e6c77c935b3bee3990579234850cb28c50223458dfbb60f530cf0208aa1f440d0ffa17994f7c42d6d66e9387e217123c53f7b187d2735ec7f63521b22226c3f2030c73d8052e6f0ef10ea3e6228a517ee115578906d6a7c76228912a0a6702037f81ec3da5a1959f149e9128fa2dd73350e9167164eaf03a40f940126bd5994f0fca6bd85716a2cefc26c70f1564f7fc0bb63d3fa44698b78015b1f82169632c1a60e9f3db63c08a0365d4d30e68f6a28a86c06fa4e8365d07c7cd6daeb8bea3db208229234b575fc3dbafd1991efd74f0418038d4f8356e10f1dd8c55ba3a87cf8f6f6f173d1118c6ec8c93593ecc72903b87cf3c47178d843d09e00104922ef0ffc877572ff883bb4aa2670669a22418606480ec6b558608613310c39979b2b968975ee6c2085ea1a852fc7246e43119d535268c9852d02be87ca9fef5da4d756c6c2c66cede2d80e4c83efa6bc379d41e922b0dea85390838e376465d428a4f33772342539632d747eb9ff79e08ce2be85ddd230793b9c43e5997e785690b3dc4f173131b35d69fd8686286415741ad90816d35bc5166c9c7a487c253c0659ee52119b23c9f764ea5edd4e069af6be1cad2dd22505035154f2564c033aab114545d6fe86093d30832bc40744e11088db51417b50ff0890800285d230ad68daf378778347eeabaf06e4c0ef661edce1ce84af68adfbd9070cfa013fe4a12748ce9ff85c59c45872c60726cbbc17089ae17bddd777d543a3f69bb4a54a4b763ff9e0947bf5616f9dfd4012630c3ba037c2543ad83e98b3a2a8c63d510f08c52ffc7803cb24d30fed32e22f12b9953e056eeebc8aef0058f5fd6553c5c1af6f8e67aeb8e443cc2cd614b601dd75755d4633554620c174f1cadfd5193e3ac273e612da2e88d85348a3b7c889a68f1f061be3f448793e7f4eb5b4b262456090f02105ed9a4010b3c3b3bf004742afa7bf041ee06e5d6bce93c0a345fedee17fce29fda1cceb4a40835046c01f03885d18a6ee00030c6a46f56457b2b571fdc8ecb403150c577b9c12d07cd07185d0d42814e286e0fec630baa1bc046d232869ca4d8de97102df547c42e4bb07a525b4ffd602cef73df3c382dd41a18eb3534ab56daa87db2917d22d9e84e0b47383cc0c4a18eae42e5d2a718afe8b23fdd733f225aad76fe46dabc69ca37c29727fb80ad295ff50ac5f178e68d0f0b7b35652b77a1e1d39b734069c64d1798e5f5496ccee409dc8f562e6b51a1a8b6928914e19908f465e725ac38b155daf5722c3e67c2a5871a6b5a6b815ab59c3038bab7b257ec60eb634f1dac80227fe8fe37a9e4ec3ac3dc28eec26298a07fdc52b95709", "5353", 1, -1192125732, 1537743641, "4a6ae0e2d3c081c85f222465d24a0420280e2d10a49c23dcbe3a800e303f32b8"] ] From 818b94f94f3bb934f4423822b9c2219c05c37759 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 7 Feb 2018 22:56:22 +0000 Subject: [PATCH 0500/1062] Make number of inputs configurable in validatelargetx test --- qa/zcash/performance-measurements.sh | 2 +- src/wallet/rpcwallet.cpp | 7 ++++++- src/zcbenchmarks.cpp | 24 +++++------------------- src/zcbenchmarks.h | 2 +- 4 files changed, 13 insertions(+), 22 deletions(-) diff --git a/qa/zcash/performance-measurements.sh b/qa/zcash/performance-measurements.sh index 76f41c0ab..15f3077b5 100755 --- a/qa/zcash/performance-measurements.sh +++ b/qa/zcash/performance-measurements.sh @@ -195,7 +195,7 @@ case "$1" in zcash_rpc zcbenchmark verifyequihash 1000 ;; validatelargetx) - zcash_rpc zcbenchmark validatelargetx 5 + zcash_rpc zcbenchmark validatelargetx 10 "${@:3}" ;; trydecryptnotes) zcash_rpc zcbenchmark trydecryptnotes 1000 "${@:3}" diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 90651ea74..3e63c3689 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -2581,7 +2581,12 @@ UniValue zc_benchmark(const UniValue& params, bool fHelp) } else if (benchmarktype == "verifyequihash") { sample_times.push_back(benchmark_verify_equihash()); } else if (benchmarktype == "validatelargetx") { - sample_times.push_back(benchmark_large_tx()); + // Number of inputs in the spending transaction that we will simulate + int nInputs = 555; + if (params.size() >= 3) { + nInputs = params[2].get_int(); + } + sample_times.push_back(benchmark_large_tx(nInputs)); } else if (benchmarktype == "trydecryptnotes") { int nAddrs = params[2].get_int(); sample_times.push_back(benchmark_try_decrypt_notes(nAddrs)); diff --git a/src/zcbenchmarks.cpp b/src/zcbenchmarks.cpp index 4b17e57bf..9f9c1120d 100644 --- a/src/zcbenchmarks.cpp +++ b/src/zcbenchmarks.cpp @@ -222,11 +222,8 @@ double benchmark_verify_equihash() return timer_stop(tv_start); } -double benchmark_large_tx() +double benchmark_large_tx(size_t nInputs) { - // Number of inputs in the spending transaction that we will simulate - const size_t NUM_INPUTS = 555; - // Create priv/pub key CKey priv; priv.MakeNewKey(false); @@ -246,35 +243,24 @@ double benchmark_large_tx() CMutableTransaction spending_tx; auto input_hash = orig_tx.GetHash(); - // Add NUM_INPUTS inputs - for (size_t i = 0; i < NUM_INPUTS; i++) { + // Add nInputs inputs + for (size_t i = 0; i < nInputs; i++) { spending_tx.vin.emplace_back(input_hash, 0); } // Sign for all the inputs auto consensusBranchId = NetworkUpgradeInfo[Consensus::UPGRADE_OVERWINTER].nBranchId; - for (size_t i = 0; i < NUM_INPUTS; i++) { + for (size_t i = 0; i < nInputs; i++) { SignSignature(tempKeystore, prevPubKey, spending_tx, i, 1000000, SIGHASH_ALL, consensusBranchId); } - // Serialize: - { - CDataStream ss(SER_NETWORK, PROTOCOL_VERSION); - ss << spending_tx; - //std::cout << "SIZE OF SPENDING TX: " << ss.size() << std::endl; - - auto error = MAX_TX_SIZE / 20; // 5% error - assert(ss.size() < MAX_TX_SIZE + error); - assert(ss.size() > MAX_TX_SIZE - error); - } - // Spending tx has all its inputs signed and does not need to be mutated anymore CTransaction final_spending_tx(spending_tx); // Benchmark signature verification costs: struct timeval tv_start; timer_start(tv_start); - for (size_t i = 0; i < NUM_INPUTS; i++) { + for (size_t i = 0; i < nInputs; i++) { ScriptError serror = SCRIPT_ERR_OK; assert(VerifyScript(final_spending_tx.vin[i].scriptSig, prevPubKey, diff --git a/src/zcbenchmarks.h b/src/zcbenchmarks.h index ac87d0326..60a0be848 100644 --- a/src/zcbenchmarks.h +++ b/src/zcbenchmarks.h @@ -12,7 +12,7 @@ extern double benchmark_solve_equihash(); extern std::vector benchmark_solve_equihash_threaded(int nThreads); extern double benchmark_verify_joinsplit(const JSDescription &joinsplit); extern double benchmark_verify_equihash(); -extern double benchmark_large_tx(); +extern double benchmark_large_tx(size_t nInputs); extern double benchmark_try_decrypt_notes(size_t nAddrs); extern double benchmark_increment_note_witnesses(size_t nTxs); extern double benchmark_connectblock_slow(); From 455390185004878c6ffe8c4e6fda29543fb91b6f Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Sat, 3 Feb 2018 21:02:25 +0000 Subject: [PATCH 0501/1062] Use v3 transactions with caching for validatelargetx benchmark --- src/zcbenchmarks.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/zcbenchmarks.cpp b/src/zcbenchmarks.cpp index 9f9c1120d..2c7e99a67 100644 --- a/src/zcbenchmarks.cpp +++ b/src/zcbenchmarks.cpp @@ -242,6 +242,10 @@ double benchmark_large_tx(size_t nInputs) auto orig_tx = CTransaction(m_orig_tx); CMutableTransaction spending_tx; + spending_tx.fOverwintered = true; + spending_tx.nVersion = 3; + spending_tx.nVersionGroupId = OVERWINTER_VERSION_GROUP_ID; + auto input_hash = orig_tx.GetHash(); // Add nInputs inputs for (size_t i = 0; i < nInputs; i++) { @@ -260,12 +264,13 @@ double benchmark_large_tx(size_t nInputs) // Benchmark signature verification costs: struct timeval tv_start; timer_start(tv_start); + PrecomputedTransactionData txdata(final_spending_tx); for (size_t i = 0; i < nInputs; i++) { ScriptError serror = SCRIPT_ERR_OK; assert(VerifyScript(final_spending_tx.vin[i].scriptSig, prevPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, - TransactionSignatureChecker(&final_spending_tx, i, 1000000), + TransactionSignatureChecker(&final_spending_tx, i, 1000000, txdata), consensusBranchId, &serror)); } From bdbe8e8591810ac84c266c0103a6302264d4cd32 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Mon, 11 Dec 2017 16:31:12 +0000 Subject: [PATCH 0502/1062] Extend CWallet::GetFilteredNotes to enable filtering on a set of addresses --- src/wallet/wallet.cpp | 25 +++++++++++++++++++------ src/wallet/wallet.h | 8 ++++++++ 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 8dd52a0b0..ce86cbad0 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -3658,13 +3658,26 @@ bool CMerkleTx::AcceptToMemoryPool(bool fLimitFree, bool fRejectAbsurdFee) */ void CWallet::GetFilteredNotes(std::vector & outEntries, std::string address, int minDepth, bool ignoreSpent, bool ignoreUnspendable) { - bool fFilterAddress = false; - libzcash::PaymentAddress filterPaymentAddress; + std::set filterAddresses; + if (address.length() > 0) { - filterPaymentAddress = CZCPaymentAddress(address).Get(); - fFilterAddress = true; + filterAddresses.insert(CZCPaymentAddress(address).Get()); } + GetFilteredNotes(outEntries, filterAddresses, minDepth, ignoreSpent, ignoreUnspendable); +} + +/** + * Find notes in the wallet filtered by payment addresses, min depth and ability to spend. + * These notes are decrypted and added to the output parameter vector, outEntries. + */ +void CWallet::GetFilteredNotes( + std::vector& outEntries, + std::set& filterAddresses, + int minDepth, + bool ignoreSpent, + bool ignoreUnspendable) +{ LOCK2(cs_main, cs_wallet); for (auto & p : mapWallet) { @@ -3685,7 +3698,7 @@ void CWallet::GetFilteredNotes(std::vector & outEntries, st PaymentAddress pa = nd.address; // skip notes which belong to a different payment address in the wallet - if (fFilterAddress && !(pa == filterPaymentAddress)) { + if (!(filterAddresses.empty() || filterAddresses.count(pa))) { continue; } @@ -3719,7 +3732,7 @@ void CWallet::GetFilteredNotes(std::vector & outEntries, st hSig, (unsigned char) j); - outEntries.push_back(CNotePlaintextEntry{jsop, plaintext}); + outEntries.push_back(CNotePlaintextEntry{jsop, pa, plaintext}); } catch (const note_decryption_failed &err) { // Couldn't decrypt with this spending key diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index eaaf6bbdf..e663cf075 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -267,6 +267,7 @@ typedef std::map mapNoteData_t; struct CNotePlaintextEntry { JSOutPoint jsop; + libzcash::PaymentAddress address; libzcash::NotePlaintext plaintext; }; @@ -1126,6 +1127,13 @@ public: int minDepth=1, bool ignoreSpent=true, bool ignoreUnspendable=true); + + /* Find notes filtered by payment addresses, min depth, ability to spend */ + void GetFilteredNotes(std::vector& outEntries, + std::set& filterAddresses, + int minDepth=1, + bool ignoreSpent=true, + bool ignoreUnspendable=true); }; From f70cd24521f5fb3b5ce75df6bb41e28cdd629750 Mon Sep 17 00:00:00 2001 From: Maxwell Gubler Date: Tue, 20 Feb 2018 16:46:12 -0500 Subject: [PATCH 0503/1062] Fix syntax examples for z_importwallet and export --- doc/wallet-backup.md | 4 ++-- src/wallet/rpcdump.cpp | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/doc/wallet-backup.md b/doc/wallet-backup.md index 9f7bc0f40..02454db72 100644 --- a/doc/wallet-backup.md +++ b/doc/wallet-backup.md @@ -18,7 +18,7 @@ There are multiple ways to make sure you have at least one other copy of the pri For all methods, you will need to include an export directory setting in your config file (`zcash.conf` located in the data directory which is `~/.zcash/` unless it's been overridden with `datadir=` setting): -`exportdir=/path/to/chosen/export/directory` +`exportdir=path/to/chosen/export/directory` You may chose any directory within the home directory as the location for export & backup files. If the directory doesn't exist, it will be created. @@ -46,7 +46,7 @@ This will generate a file in the export directory listing all transparent and sh To import keys into a wallet which were previously exported to a file, use: -`zcash-cli z_importwallet ` +`zcash-cli z_importwallet ` ### Using `z_exportkey`, `z_importkey`, `dumpprivkey` & `importprivkey` diff --git a/src/wallet/rpcdump.cpp b/src/wallet/rpcdump.cpp index 1177cfc4e..890a91e8d 100644 --- a/src/wallet/rpcdump.cpp +++ b/src/wallet/rpcdump.cpp @@ -234,11 +234,11 @@ UniValue z_importwallet(const UniValue& params, bool fHelp) "1. \"filename\" (string, required) The wallet file\n" "\nExamples:\n" "\nDump the wallet\n" - + HelpExampleCli("z_exportwallet", "\"test\"") + + + HelpExampleCli("z_exportwallet", "\"nameofbackup\"") + "\nImport the wallet\n" - + HelpExampleCli("z_importwallet", "\"test\"") + + + HelpExampleCli("z_importwallet", "\"path/to/exportdir/nameofbackup\"") + "\nImport using the json rpc call\n" - + HelpExampleRpc("z_importwallet", "\"test\"") + + HelpExampleRpc("z_importwallet", "\"path/to/exportdir/nameofbackup\"") ); return importwallet_impl(params, fHelp, true); @@ -257,11 +257,11 @@ UniValue importwallet(const UniValue& params, bool fHelp) "1. \"filename\" (string, required) The wallet file\n" "\nExamples:\n" "\nDump the wallet\n" - + HelpExampleCli("dumpwallet", "\"test\"") + + + HelpExampleCli("dumpwallet", "\"nameofbackup\"") + "\nImport the wallet\n" - + HelpExampleCli("importwallet", "\"test\"") + + + HelpExampleCli("importwallet", "\"path/to/exportdir/nameofbackup\"") + "\nImport using the json rpc call\n" - + HelpExampleRpc("importwallet", "\"test\"") + + HelpExampleRpc("importwallet", "\"path/to/exportdir/nameofbackup\"") ); return importwallet_impl(params, fHelp, false); From 6ec3d43c5c199f700980260b239d43668587da59 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Feb 2018 16:15:42 +0200 Subject: [PATCH 0504/1062] -print --- src/komodo_utils.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo_utils.h b/src/komodo_utils.h index b4b5297e2..8db610e5d 100644 --- a/src/komodo_utils.h +++ b/src/komodo_utils.h @@ -1399,7 +1399,7 @@ void komodo_configfile(char *symbol,uint16_t port) sprintf(KMDUSERPASS,"%s:%s",username,password); fclose(fp); //printf("KOMODO.(%s) -> userpass.(%s)\n",fname,KMDUSERPASS); - } else printf("couldnt open.(%s)\n",fname); + } //else printf("couldnt open.(%s)\n",fname); } uint16_t komodo_userpass(char *userpass,char *symbol) @@ -1657,7 +1657,7 @@ void komodo_args(char *argv0) sprintf(iter == 0 ? KMDUSERPASS : BTCUSERPASS,"%s:%s",username,password); fclose(fp); //printf("KOMODO.(%s) -> userpass.(%s)\n",fname,KMDUSERPASS); - } else printf("couldnt open.(%s)\n",fname); + } //else printf("couldnt open.(%s)\n",fname); if ( IS_KOMODO_NOTARY == 0 ) break; } From 73b9e32b9d7ede630af0df9bae8853cd9fa1b88a Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Wed, 21 Feb 2018 14:10:42 -0300 Subject: [PATCH 0505/1062] update to latest libcryptoconditions --- src/cryptoconditions | 2 +- src/script/interpreter.cpp | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/cryptoconditions b/src/cryptoconditions index e48284938..6b859e63a 160000 --- a/src/cryptoconditions +++ b/src/cryptoconditions @@ -1 +1 @@ -Subproject commit e482849382f36702fe083c5604dd160f4ebaedd1 +Subproject commit 6b859e63a2bce5107f9b888823f2709a13dd3c26 diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index e0c2c1d01..1e5c7ec79 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -949,10 +949,9 @@ bool EvalScript(vector >& stack, const CScript& script, un valtype& vchFulfillment = stacktop(-2); valtype& vchCondition = stacktop(-1); - CC *cond = (CC*) calloc(1, sizeof(CC)); char *fulfillmentBin = (char*) vchFulfillment.data(); - int rc = cc_readFulfillmentBinary(cond, fulfillmentBin, vchFulfillment.size()); - if (rc != 0) { + CC *cond = cc_readFulfillmentBinary(fulfillmentBin, vchFulfillment.size()); + if (!cond) { return set_error(serror, SCRIPT_ERR_CRYPTOCONDITION_INVALID_FULFILLMENT); } From 71768555dd7307824c94f2aa2384d2a50ee23454 Mon Sep 17 00:00:00 2001 From: Jay Graber Date: Thu, 14 Dec 2017 18:02:35 -0800 Subject: [PATCH 0506/1062] Add upgrades field to RPC call getblockchaininfo Closes #2785. Co-authored-by: Jack Grigg --- src/rpcblockchain.cpp | 47 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index bbed8cba1..ebd4a733a 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -659,6 +659,37 @@ static UniValue SoftForkDesc(const std::string &name, int version, CBlockIndex* return rv; } +static UniValue NetworkUpgradeDesc(const Consensus::Params& consensusParams, Consensus::UpgradeIndex idx, int height) +{ + UniValue rv(UniValue::VOBJ); + auto upgrade = NetworkUpgradeInfo[idx]; + rv.push_back(Pair("name", upgrade.strName)); + rv.push_back(Pair("activationheight", consensusParams.vUpgrades[idx].nActivationHeight)); + switch (NetworkUpgradeState(height, consensusParams, idx)) { + case UPGRADE_DISABLED: rv.push_back(Pair("status", "disabled")); break; + case UPGRADE_PENDING: rv.push_back(Pair("status", "pending")); break; + case UPGRADE_ACTIVE: rv.push_back(Pair("status", "active")); break; + } + rv.push_back(Pair("info", upgrade.strInfo)); + return rv; +} + +void NetworkUpgradeDescPushBack( + UniValue& networkUpgrades, + const Consensus::Params& consensusParams, + Consensus::UpgradeIndex idx, + int height) +{ + // Network upgrades with an activation height of NO_ACTIVATION_HEIGHT are + // hidden. This is used when network upgrade implementations are merged + // without specifying the activation height. + if (consensusParams.vUpgrades[idx].nActivationHeight != Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT) { + networkUpgrades.push_back(Pair( + HexInt(NetworkUpgradeInfo[idx].nBranchId), + NetworkUpgradeDesc(consensusParams, idx, height))); + } +} + UniValue getblockchaininfo(const UniValue& params, bool fHelp) { if (fHelp || params.size() != 0) @@ -687,7 +718,15 @@ UniValue getblockchaininfo(const UniValue& params, bool fHelp) " },\n" " \"reject\": { ... } (object) progress toward rejecting pre-softfork blocks (same fields as \"enforce\")\n" " }, ...\n" - " ]\n" + " ],\n" + " \"upgrades\": { (object) status of network upgrades\n" + " \"xxxx\" : { (string) branch ID of the upgrade\n" + " \"name\": \"xxxx\", (string) name of upgrade\n" + " \"activationheight\": xxxxxx, (numeric) block height of activation\n" + " \"status\": \"xxxx\", (string) status of upgrade\n" + " \"info\": \"xxxx\", (string) additional information about upgrade\n" + " }, ...\n" + " }\n" "}\n" "\nExamples:\n" + HelpExampleCli("getblockchaininfo", "") @@ -722,6 +761,12 @@ UniValue getblockchaininfo(const UniValue& params, bool fHelp) softforks.push_back(SoftForkDesc("bip65", 4, tip, consensusParams)); obj.push_back(Pair("softforks", softforks)); + UniValue upgrades(UniValue::VOBJ); + for (int i = Consensus::UPGRADE_OVERWINTER; i < Consensus::MAX_NETWORK_UPGRADES; i++) { + NetworkUpgradeDescPushBack(upgrades, consensusParams, Consensus::UpgradeIndex(i), tip->nHeight); + } + obj.push_back(Pair("upgrades", upgrades)); + if (fPruneMode) { CBlockIndex *block = chainActive.Tip(); From ed9aa2b62a9c65d152f7560368d407794caa6d72 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 21 Feb 2018 21:02:09 +0000 Subject: [PATCH 0507/1062] Add branch IDs for current and next block to getblockchaininfo Closes #2974. --- qa/rpc-tests/wallet_overwintertx.py | 8 ++++++++ src/rpcblockchain.cpp | 9 +++++++++ 2 files changed, 17 insertions(+) diff --git a/qa/rpc-tests/wallet_overwintertx.py b/qa/rpc-tests/wallet_overwintertx.py index 84215eb6b..91bdb7764 100755 --- a/qa/rpc-tests/wallet_overwintertx.py +++ b/qa/rpc-tests/wallet_overwintertx.py @@ -38,6 +38,9 @@ class WalletOverwinterTxTest (BitcoinTestFramework): # # Currently at block 198. The next block to be mined 199 is a Sprout block # + assert_equal(self.nodes[0].getblockchaininfo()['consensus']['chaintip'], '00000000') + assert_equal(self.nodes[0].getblockchaininfo()['consensus']['nextblock'], '00000000') + taddr0 = self.nodes[0].getnewaddress() taddr2 = self.nodes[2].getnewaddress() zaddr2 = self.nodes[2].z_getnewaddress() @@ -76,6 +79,8 @@ class WalletOverwinterTxTest (BitcoinTestFramework): # # Currently at block 199. The next block to be mined 200 is an Overwinter block # + assert_equal(self.nodes[0].getblockchaininfo()['consensus']['chaintip'], '00000000') + assert_equal(self.nodes[0].getblockchaininfo()['consensus']['nextblock'], '5ba81b19') # Send taddr to taddr tsendamount = Decimal('4.56') @@ -88,9 +93,12 @@ class WalletOverwinterTxTest (BitcoinTestFramework): myopid = self.nodes[0].z_sendmany(taddr0, recipients) txid_shielded = wait_and_assert_operationid_status(self.nodes[0], myopid) + # Mine the first Overwinter block self.sync_all() self.nodes[0].generate(1) self.sync_all() + assert_equal(self.nodes[0].getblockchaininfo()['consensus']['chaintip'], '5ba81b19') + assert_equal(self.nodes[0].getblockchaininfo()['consensus']['nextblock'], '5ba81b19') # Verify balance assert_equal(self.nodes[3].getbalance(), tsendamount) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index ebd4a733a..32f3f0fee 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -726,6 +726,10 @@ UniValue getblockchaininfo(const UniValue& params, bool fHelp) " \"status\": \"xxxx\", (string) status of upgrade\n" " \"info\": \"xxxx\", (string) additional information about upgrade\n" " }, ...\n" + " },\n" + " \"consensus\": { (object) branch IDs of the current and upcoming consensus rules\n" + " \"chaintip\": \"xxxxxxxx\", (string) branch ID used to validate the current chain tip\n" + " \"nextblock\": \"xxxxxxxx\" (string) branch ID that the next block will be validated under\n" " }\n" "}\n" "\nExamples:\n" @@ -767,6 +771,11 @@ UniValue getblockchaininfo(const UniValue& params, bool fHelp) } obj.push_back(Pair("upgrades", upgrades)); + UniValue consensus(UniValue::VOBJ); + consensus.push_back(Pair("chaintip", HexInt(CurrentEpochBranchId(tip->nHeight, consensusParams)))); + consensus.push_back(Pair("nextblock", HexInt(CurrentEpochBranchId(tip->nHeight + 1, consensusParams)))); + obj.push_back(Pair("consensus", consensus)); + if (fPruneMode) { CBlockIndex *block = chainActive.Tip(); From 691b8708f1bbbab2df2163ad17d9d0b6a2abb67f Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Wed, 21 Feb 2018 19:28:52 -0300 Subject: [PATCH 0508/1062] Komodo CC aux callback has access to transaction via checker --- src/Makefile.am | 2 ++ src/cryptoconditions | 2 +- src/komodo_cryptoconditions.cpp | 8 ++++++++ src/komodo_cryptoconditions.h | 7 ------- src/script/interpreter.cpp | 32 ++++++++++++++++++++------------ src/script/interpreter.h | 14 ++++++++++---- 6 files changed, 41 insertions(+), 24 deletions(-) create mode 100644 src/komodo_cryptoconditions.cpp diff --git a/src/Makefile.am b/src/Makefile.am index 815d75d4c..4ec21614d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -336,6 +336,7 @@ libbitcoin_common_a_SOURCES = \ script/script_error.cpp \ script/sign.cpp \ script/standard.cpp \ + komodo_cryptoconditions.cpp \ $(BITCOIN_CORE_H) \ $(LIBZCASH_H) @@ -505,6 +506,7 @@ libzcashconsensus_la_SOURCES = \ script/zcashconsensus.cpp \ script/interpreter.cpp \ script/script.cpp \ + komodo_cryptoconditions.cpp \ uint256.cpp \ utilstrencodings.cpp diff --git a/src/cryptoconditions b/src/cryptoconditions index 6b859e63a..e33203ae3 160000 --- a/src/cryptoconditions +++ b/src/cryptoconditions @@ -1 +1 @@ -Subproject commit 6b859e63a2bce5107f9b888823f2709a13dd3c26 +Subproject commit e33203ae3430d2682a4eb734ceaf63791eb0eb6d diff --git a/src/komodo_cryptoconditions.cpp b/src/komodo_cryptoconditions.cpp new file mode 100644 index 000000000..a7fcf9f99 --- /dev/null +++ b/src/komodo_cryptoconditions.cpp @@ -0,0 +1,8 @@ + +#include "cryptoconditions/include/cryptoconditions.h" +#include "script/interpreter.h" + + +int CryptoConditionChecker::CheckAuxCondition(const CC *cond) const { + return true; +} diff --git a/src/komodo_cryptoconditions.h b/src/komodo_cryptoconditions.h index 3cfc15e12..42cf3b077 100644 --- a/src/komodo_cryptoconditions.h +++ b/src/komodo_cryptoconditions.h @@ -9,11 +9,4 @@ static bool IsCryptoConditionsEnabled() { return 0 != ASSETCHAINS_CC; } -/* - * Method stub for aux conditions. Unimplemented, thus fails if an aux condition is encountered. - */ -static int komodoCCAux(CC *cond, void *context) { - return 0; -} - #endif /* KOMODO_CRYPTOCONDITIONS_H */ diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 1e5c7ec79..689dcf204 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -949,18 +949,15 @@ bool EvalScript(vector >& stack, const CScript& script, un valtype& vchFulfillment = stacktop(-2); valtype& vchCondition = stacktop(-1); - char *fulfillmentBin = (char*) vchFulfillment.data(); - CC *cond = cc_readFulfillmentBinary(fulfillmentBin, vchFulfillment.size()); + CC *cond = cc_readFulfillmentBinary((unsigned char*)vchFulfillment.data(), + vchFulfillment.size()); if (!cond) { return set_error(serror, SCRIPT_ERR_CRYPTOCONDITION_INVALID_FULFILLMENT); } - char *condBin = (char*) &vchCondition[0]; - // TODO: Should nHashType be hardcoded? - // Other types use the last byte of the signature - char *msg = (char*) checker.GetMessage(script, SIGHASH_ALL).begin(); + bool fSuccess = checker.CheckCryptoCondition(cond, vchCondition, script); - bool fSuccess = cc_verify(cond, msg, 32, condBin, vchCondition.size(), komodoCCAux, NULL); + cc_free(cond); popstack(stack); popstack(stack); @@ -1155,6 +1152,22 @@ bool TransactionSignatureChecker::CheckSig(const vector& vchSigIn return true; } +extern "C" +{ + static int komodoCCAux(CC *cond, void *transactionSignatureChecker); +} + +static int komodoCCAux(CC *cond, void *checker) { + return ((CryptoConditionChecker*)checker)->CheckAuxCondition(cond); +} + +bool TransactionSignatureChecker::CheckCryptoCondition(const CC *cond, const std::vector& condBin, const CScript& scriptCode) const +{ + uint256 message = SignatureHash(scriptCode, *txTo, nIn, SIGHASH_ALL); + return cc_verify(cond, (const unsigned char*)&message, 32, + condBin.data(), condBin.size(), komodoCCAux, (void*)this); +} + bool TransactionSignatureChecker::CheckLockTime(const CScriptNum& nLockTime) const { // There are two times of nLockTime: lock-by-blockheight @@ -1191,11 +1204,6 @@ bool TransactionSignatureChecker::CheckLockTime(const CScriptNum& nLockTime) con return true; } -uint256 TransactionSignatureChecker::GetMessage(const CScript& scriptCode, int nHashType) const -{ - return SignatureHash(scriptCode, *txTo, nIn, nHashType); -} - bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* serror) { diff --git a/src/script/interpreter.h b/src/script/interpreter.h index fad2d9a91..90c50eff6 100644 --- a/src/script/interpreter.h +++ b/src/script/interpreter.h @@ -8,6 +8,7 @@ #include "script_error.h" #include "primitives/transaction.h" +#include "komodo_cryptoconditions.h" #include #include @@ -102,10 +103,9 @@ public: return false; } - virtual uint256 GetMessage(const CScript& scriptCode, int nHashType) const + virtual bool CheckCryptoCondition(const CC *cond, const std::vector& condBin, const CScript& scriptCode) const { - uint256 blob; - return blob; + return false; } virtual ~BaseSignatureChecker() {} @@ -124,7 +124,7 @@ public: TransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn) : txTo(txToIn), nIn(nInIn) {} bool CheckSig(const std::vector& scriptSig, const std::vector& vchPubKey, const CScript& scriptCode) const; bool CheckLockTime(const CScriptNum& nLockTime) const; - uint256 GetMessage(const CScript& scriptCode, int nHashType) const; + bool CheckCryptoCondition(const CC *cond, const std::vector& condBin, const CScript& scriptCode) const; }; class MutableTransactionSignatureChecker : public TransactionSignatureChecker @@ -139,4 +139,10 @@ public: bool EvalScript(std::vector >& stack, const CScript& script, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* error = NULL); bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* error = NULL); +class CryptoConditionChecker : public TransactionSignatureChecker +{ +public: + int CheckAuxCondition(const CC *cond) const; +}; + #endif // BITCOIN_SCRIPT_INTERPRETER_H From 44488400c1f815620d7f53d250605979cd146052 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 21 Feb 2018 22:37:19 +0000 Subject: [PATCH 0509/1062] Check Equihash solution when loading block index --- src/txdb.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/txdb.cpp b/src/txdb.cpp index 1b66d70b4..2cd512ed4 100644 --- a/src/txdb.cpp +++ b/src/txdb.cpp @@ -313,6 +313,9 @@ bool CBlockTreeDB::LoadBlockIndexGuts() pindexNew->nTx = diskindex.nTx; pindexNew->nSproutValue = diskindex.nSproutValue; + auto header = pindexNew->GetBlockHeader(); + if (!CheckEquihashSolution(&header, Params())) + return error("LoadBlockIndex(): CheckEquihashSolution failed: %s", pindexNew->ToString()); if (!CheckProofOfWork(pindexNew->GetBlockHash(), pindexNew->nBits, Params().GetConsensus())) return error("LoadBlockIndex(): CheckProofOfWork failed: %s", pindexNew->ToString()); From db2df2c37ba98cf7490122a9176f0cad17d94f85 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Thu, 22 Feb 2018 00:59:15 -0300 Subject: [PATCH 0510/1062] integration test for basic aux condition --- qa/cryptoconditions/test_integration.py | 42 ++++++++++++++++++++++++- src/cryptoconditions | 2 +- src/komodo_cryptoconditions.cpp | 7 ++++- 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/qa/cryptoconditions/test_integration.py b/qa/cryptoconditions/test_integration.py index 24792cc60..d5b456953 100644 --- a/qa/cryptoconditions/test_integration.py +++ b/qa/cryptoconditions/test_integration.py @@ -74,7 +74,7 @@ def test_invalid_condition(inp): assert 'Script evaluated without error but finished with a false/empty top stack element' in str(e), str(e) -@fanout_input(19) +@fanout_input(5) def test_oversize_fulfillment(inp): # Create oversize fulfillment script where the total length is <2000 binscript = b'\x4d%s%s' % (struct.pack('h', 2000), b'a' * 2000) @@ -87,6 +87,46 @@ def test_oversize_fulfillment(inp): assert 'scriptsig-size' in str(e), str(e) +@fanout_input(6) +def test_aux_basic(inp): + aux_cond = { + 'type': 'aux-sha-256', + 'method': 'equals', + 'conditionAux': 'LTE', + 'fulfillmentAux': 'LTE' + } + + # Setup some aux outputs + spend0 = { + 'inputs': [inp], + 'outputs': [ + {'amount': 500, 'script': {'condition': aux_cond}}, + {'amount': 500, 'script': {'condition': aux_cond}} + ] + } + spend0_txid = submit(sign(spend0)) + assert rpc.getrawtransaction(spend0_txid) + + # Test a good fulfillment + spend1 = { + 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {'fulfillment': aux_cond}}], + 'outputs': [{'amount': 500, 'script': {'condition': aux_cond}}] + } + spend1_txid = submit(sign(spend1)) + assert rpc.getrawtransaction(spend1_txid) + + # Test a bad fulfillment + aux_cond['fulfillmentAux'] = 'WYW' + spend2 = { + 'inputs': [{'txid': spend0_txid, 'idx': 1, 'script': {'fulfillment': aux_cond}}], + 'outputs': [{'amount': 500, 'script': {'condition': aux_cond}}] + } + try: + assert not submit(sign(spend2)), 'should raise an error' + except RPCError as e: + assert 'Script evaluated without error but finished with a false/empty top stack element' in str(e), str(e) + + if __name__ == '__main__': logging.basicConfig(level=logging.INFO) for name, f in globals().items(): diff --git a/src/cryptoconditions b/src/cryptoconditions index e33203ae3..0dcac79cf 160000 --- a/src/cryptoconditions +++ b/src/cryptoconditions @@ -1 +1 @@ -Subproject commit e33203ae3430d2682a4eb734ceaf63791eb0eb6d +Subproject commit 0dcac79cf9ffeda8aff9d3e9e41fa23ac8208486 diff --git a/src/komodo_cryptoconditions.cpp b/src/komodo_cryptoconditions.cpp index a7fcf9f99..9617add50 100644 --- a/src/komodo_cryptoconditions.cpp +++ b/src/komodo_cryptoconditions.cpp @@ -4,5 +4,10 @@ int CryptoConditionChecker::CheckAuxCondition(const CC *cond) const { - return true; + if (0 == strcmp((const char*)cond->method, "equals")) { + return (cond->conditionAuxLength == cond->fulfillmentAuxLength) && + (0 == memcmp(cond->conditionAux, cond->fulfillmentAux, cond->conditionAuxLength)); + } + printf("no defined behaviour for method:%s\n", cond->method); + return 0; } From 46d1bcc607ee5b795ed72351b24f978ab6952633 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Thu, 22 Feb 2018 01:43:43 -0300 Subject: [PATCH 0511/1062] integration test for complex aux condition --- qa/cryptoconditions/test_integration.py | 44 +++++++++++++++++++++++++ src/komodo_cryptoconditions.cpp | 13 +++++++- src/script/interpreter.cpp | 2 +- src/script/interpreter.h | 7 +--- 4 files changed, 58 insertions(+), 8 deletions(-) diff --git a/qa/cryptoconditions/test_integration.py b/qa/cryptoconditions/test_integration.py index d5b456953..6d60ee921 100644 --- a/qa/cryptoconditions/test_integration.py +++ b/qa/cryptoconditions/test_integration.py @@ -127,6 +127,50 @@ def test_aux_basic(inp): assert 'Script evaluated without error but finished with a false/empty top stack element' in str(e), str(e) +@fanout_input(7) +def test_aux_complex(inp): + aux_cond = { + 'type': 'aux-sha-256', + 'method': 'inputIsReturn', + 'conditionAux': '', + 'fulfillmentAux': 'AQ' # \1 (tx.vout[1]) + } + + # Setup some aux outputs + spend0 = { + 'inputs': [inp], + 'outputs': [ + {'amount': 500, 'script': {'condition': aux_cond}}, + {'amount': 500, 'script': {'condition': aux_cond}} + ] + } + spend0_txid = submit(sign(spend0)) + assert rpc.getrawtransaction(spend0_txid) + + # Test a good fulfillment + spend1 = { + 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {'fulfillment': aux_cond}}], + 'outputs': [ + {'amount': 250, 'script': {'condition': aux_cond}}, + {'amount': 250, 'script': "6A0B68656C6C6F207468657265"} # OP_RETURN somedata + ] + } + spend1_txid = submit(sign(spend1)) + assert rpc.getrawtransaction(spend1_txid) + + # Test a bad fulfillment + spend2 = { + 'inputs': [{'txid': spend0_txid, 'idx': 1, 'script': {'fulfillment': aux_cond}}], + 'outputs': [ + {'amount': 500, 'script': "6A0B68656C6C6F207468657265"} # OP_RETURN somedata + ] + } + try: + assert not submit(sign(spend2)), 'should raise an error' + except RPCError as e: + assert 'Script evaluated without error but finished with a false/empty top stack element' in str(e), str(e) + + if __name__ == '__main__': logging.basicConfig(level=logging.INFO) for name, f in globals().items(): diff --git a/src/komodo_cryptoconditions.cpp b/src/komodo_cryptoconditions.cpp index 9617add50..c807df7c9 100644 --- a/src/komodo_cryptoconditions.cpp +++ b/src/komodo_cryptoconditions.cpp @@ -3,11 +3,22 @@ #include "script/interpreter.h" -int CryptoConditionChecker::CheckAuxCondition(const CC *cond) const { +int TransactionSignatureChecker::CheckAuxCondition(const CC *cond) const { + + // Check that condition is equal to fulfillment if (0 == strcmp((const char*)cond->method, "equals")) { return (cond->conditionAuxLength == cond->fulfillmentAuxLength) && (0 == memcmp(cond->conditionAux, cond->fulfillmentAux, cond->conditionAuxLength)); } + + // Check that pubKeyScript specified in fulfillment is OP_RETURN + if (0 == strcmp((const char*)cond->method, "inputIsReturn")) { + if (cond->fulfillmentAuxLength != 1) return 0; + int n = (int) cond->fulfillmentAux[0]; + if (n >= txTo->vout.size()) return 0; + uint8_t *ptr = (uint8_t *)txTo->vout[n].scriptPubKey.data(); + return ptr[0] == OP_RETURN; + } printf("no defined behaviour for method:%s\n", cond->method); return 0; } diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 689dcf204..709b566f6 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -1158,7 +1158,7 @@ extern "C" } static int komodoCCAux(CC *cond, void *checker) { - return ((CryptoConditionChecker*)checker)->CheckAuxCondition(cond); + return ((TransactionSignatureChecker*)checker)->CheckAuxCondition(cond); } bool TransactionSignatureChecker::CheckCryptoCondition(const CC *cond, const std::vector& condBin, const CScript& scriptCode) const diff --git a/src/script/interpreter.h b/src/script/interpreter.h index 90c50eff6..8936fde7a 100644 --- a/src/script/interpreter.h +++ b/src/script/interpreter.h @@ -125,6 +125,7 @@ public: bool CheckSig(const std::vector& scriptSig, const std::vector& vchPubKey, const CScript& scriptCode) const; bool CheckLockTime(const CScriptNum& nLockTime) const; bool CheckCryptoCondition(const CC *cond, const std::vector& condBin, const CScript& scriptCode) const; + int CheckAuxCondition(const CC *cond) const; }; class MutableTransactionSignatureChecker : public TransactionSignatureChecker @@ -139,10 +140,4 @@ public: bool EvalScript(std::vector >& stack, const CScript& script, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* error = NULL); bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* error = NULL); -class CryptoConditionChecker : public TransactionSignatureChecker -{ -public: - int CheckAuxCondition(const CC *cond) const; -}; - #endif // BITCOIN_SCRIPT_INTERPRETER_H From 71b9e59c5af147120ae379df771ee1fb9490f9af Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Feb 2018 12:00:08 +0200 Subject: [PATCH 0512/1062] Guard against set generate crash in regtest --- src/main.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 72f25f1fc..99d66f4a2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4216,7 +4216,9 @@ void static CheckBlockIndex() // Build forward-pointing map of the entire block tree. std::multimap forward; for (BlockMap::iterator it = mapBlockIndex.begin(); it != mapBlockIndex.end(); it++) { - forward.insert(std::make_pair(it->second->pprev, it->second)); + if ( it != 0 && it->second != 0 ) + forward.insert(std::make_pair(it->second->pprev, it->second)); + else break; } assert(forward.size() == mapBlockIndex.size()); From 58434c5c3431d6a5820d53901c6cca1687a2ef65 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Feb 2018 12:15:36 +0200 Subject: [PATCH 0513/1062] Revert if --- src/main.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 99d66f4a2..0d9dd52b7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4216,7 +4216,6 @@ void static CheckBlockIndex() // Build forward-pointing map of the entire block tree. std::multimap forward; for (BlockMap::iterator it = mapBlockIndex.begin(); it != mapBlockIndex.end(); it++) { - if ( it != 0 && it->second != 0 ) forward.insert(std::make_pair(it->second->pprev, it->second)); else break; } From bbb8ae00adf30726bcc623612ba886b9277dcde4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Feb 2018 12:17:39 +0200 Subject: [PATCH 0514/1062] Fix --- src/main.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 0d9dd52b7..a52fd3f02 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4217,7 +4217,6 @@ void static CheckBlockIndex() std::multimap forward; for (BlockMap::iterator it = mapBlockIndex.begin(); it != mapBlockIndex.end(); it++) { forward.insert(std::make_pair(it->second->pprev, it->second)); - else break; } assert(forward.size() == mapBlockIndex.size()); From 6e9c7629af1153d436bc7fabf145e2b669419833 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Mon, 11 Dec 2017 16:43:09 +0000 Subject: [PATCH 0515/1062] Implement z_mergetoaddress for combining UTXOs and notes Closes #2493. --- qa/pull-tester/rpc-tests.sh | 1 + qa/rpc-tests/wallet_mergetoaddress.py | 348 +++++++ src/Makefile.am | 2 + src/rpcclient.cpp | 4 + src/rpcserver.cpp | 1 + src/rpcserver.h | 1 + src/test/rpc_wallet_tests.cpp | 309 ++++++ .../asyncrpcoperation_mergetoaddress.cpp | 923 ++++++++++++++++++ src/wallet/asyncrpcoperation_mergetoaddress.h | 189 ++++ src/wallet/rpcwallet.cpp | 328 +++++++ 10 files changed, 2106 insertions(+) create mode 100755 qa/rpc-tests/wallet_mergetoaddress.py create mode 100644 src/wallet/asyncrpcoperation_mergetoaddress.cpp create mode 100644 src/wallet/asyncrpcoperation_mergetoaddress.h diff --git a/qa/pull-tester/rpc-tests.sh b/qa/pull-tester/rpc-tests.sh index 270c77de7..603185c90 100755 --- a/qa/pull-tester/rpc-tests.sh +++ b/qa/pull-tester/rpc-tests.sh @@ -16,6 +16,7 @@ testScripts=( 'wallet_treestate.py' 'wallet_protectcoinbase.py' 'wallet_shieldcoinbase.py' + 'wallet_mergetoaddress.py' 'wallet.py' 'wallet_overwintertx.py' 'wallet_nullifiers.py' diff --git a/qa/rpc-tests/wallet_mergetoaddress.py b/qa/rpc-tests/wallet_mergetoaddress.py new file mode 100755 index 000000000..e573d78bd --- /dev/null +++ b/qa/rpc-tests/wallet_mergetoaddress.py @@ -0,0 +1,348 @@ +#!/usr/bin/env python2 +# Copyright (c) 2017 The Zcash developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +from test_framework.test_framework import BitcoinTestFramework +from test_framework.authproxy import JSONRPCException +from test_framework.util import assert_equal, initialize_chain_clean, \ + start_node, connect_nodes_bi, sync_blocks, sync_mempools, \ + wait_and_assert_operationid_status + +import time +from decimal import Decimal + +class WalletMergeToAddressTest (BitcoinTestFramework): + + def setup_chain(self): + print("Initializing test directory "+self.options.tmpdir) + initialize_chain_clean(self.options.tmpdir, 4) + + def setup_network(self, split=False): + args = ['-debug=zrpcunsafe'] + self.nodes = [] + self.nodes.append(start_node(0, self.options.tmpdir, args)) + self.nodes.append(start_node(1, self.options.tmpdir, args)) + args2 = ['-debug=zrpcunsafe', '-mempooltxinputlimit=7'] + self.nodes.append(start_node(2, self.options.tmpdir, args2)) + connect_nodes_bi(self.nodes,0,1) + connect_nodes_bi(self.nodes,1,2) + connect_nodes_bi(self.nodes,0,2) + self.is_network_split=False + self.sync_all() + + def run_test (self): + print "Mining blocks..." + + self.nodes[0].generate(1) + do_not_shield_taddr = self.nodes[0].getnewaddress() + + self.nodes[0].generate(4) + walletinfo = self.nodes[0].getwalletinfo() + assert_equal(walletinfo['immature_balance'], 50) + assert_equal(walletinfo['balance'], 0) + self.sync_all() + self.nodes[2].generate(1) + self.nodes[2].getnewaddress() + self.nodes[2].generate(1) + self.nodes[2].getnewaddress() + self.nodes[2].generate(1) + self.sync_all() + self.nodes[1].generate(101) + self.sync_all() + assert_equal(self.nodes[0].getbalance(), 50) + assert_equal(self.nodes[1].getbalance(), 10) + assert_equal(self.nodes[2].getbalance(), 30) + + # Shield the coinbase + myzaddr = self.nodes[0].z_getnewaddress() + result = self.nodes[0].z_shieldcoinbase("*", myzaddr, 0) + wait_and_assert_operationid_status(self.nodes[0], result['opid']) + self.sync_all() + self.nodes[1].generate(1) + self.sync_all() + + # Prepare some UTXOs and notes for merging + mytaddr = self.nodes[0].getnewaddress() + mytaddr2 = self.nodes[0].getnewaddress() + mytaddr3 = self.nodes[0].getnewaddress() + result = self.nodes[0].z_sendmany(myzaddr, [ + {'address': do_not_shield_taddr, 'amount': 10}, + {'address': mytaddr, 'amount': 10}, + {'address': mytaddr2, 'amount': 10}, + {'address': mytaddr3, 'amount': 10}, + ], 1, 0) + wait_and_assert_operationid_status(self.nodes[0], result) + self.sync_all() + self.nodes[1].generate(1) + self.sync_all() + + # Merging will fail because from arguments need to be in an array + try: + self.nodes[0].z_mergetoaddress("*", myzaddr) + assert(False) + except JSONRPCException,e: + errorString = e.error['message'] + assert_equal("JSON value is not an array as expected" in errorString, True) + + # Merging will fail when trying to spend from watch-only address + self.nodes[2].importaddress(mytaddr) + try: + self.nodes[2].z_mergetoaddress([mytaddr], myzaddr) + assert(False) + except JSONRPCException,e: + errorString = e.error['message'] + assert_equal("Could not find any funds to merge" in errorString, True) + + # Merging will fail because fee is negative + try: + self.nodes[0].z_mergetoaddress(["*"], myzaddr, -1) + assert(False) + except JSONRPCException,e: + errorString = e.error['message'] + assert_equal("Amount out of range" in errorString, True) + + # Merging will fail because fee is larger than MAX_MONEY + try: + self.nodes[0].z_mergetoaddress(["*"], myzaddr, Decimal('21000000.00000001')) + assert(False) + except JSONRPCException,e: + errorString = e.error['message'] + assert_equal("Amount out of range" in errorString, True) + + # Merging will fail because fee is larger than sum of UTXOs + try: + self.nodes[0].z_mergetoaddress(["*"], myzaddr, 999) + assert(False) + except JSONRPCException,e: + errorString = e.error['message'] + assert_equal("Insufficient funds" in errorString, True) + + # Merging will fail because transparent limit parameter must be at least 0 + try: + self.nodes[0].z_mergetoaddress(["*"], myzaddr, Decimal('0.001'), -1) + assert(False) + except JSONRPCException,e: + errorString = e.error['message'] + assert_equal("Limit on maximum number of UTXOs cannot be negative" in errorString, True) + + # Merging will fail because transparent limit parameter is absurdly large + try: + self.nodes[0].z_mergetoaddress(["*"], myzaddr, Decimal('0.001'), 99999999999999) + assert(False) + except JSONRPCException,e: + errorString = e.error['message'] + assert_equal("JSON integer out of range" in errorString, True) + + # Merging will fail because shielded limit parameter must be at least 0 + try: + self.nodes[0].z_mergetoaddress(["*"], myzaddr, Decimal('0.001'), 50, -1) + assert(False) + except JSONRPCException,e: + errorString = e.error['message'] + assert_equal("Limit on maximum number of notes cannot be negative" in errorString, True) + + # Merging will fail because shielded limit parameter is absurdly large + try: + self.nodes[0].z_mergetoaddress(["*"], myzaddr, Decimal('0.001'), 50, 99999999999999) + assert(False) + except JSONRPCException,e: + errorString = e.error['message'] + assert_equal("JSON integer out of range" in errorString, True) + + # Merging will fail for this specific case where it would spend a fee and do nothing + try: + self.nodes[0].z_mergetoaddress([mytaddr], mytaddr) + assert(False) + except JSONRPCException,e: + errorString = e.error['message'] + assert_equal("Destination address is also the only source address, and all its funds are already merged" in errorString, True) + + # Merge UTXOs from node 0 of value 30, standard fee of 0.00010000 + result = self.nodes[0].z_mergetoaddress([mytaddr, mytaddr2, mytaddr3], myzaddr) + wait_and_assert_operationid_status(self.nodes[0], result['opid']) + self.sync_all() + self.nodes[1].generate(1) + self.sync_all() + + # Confirm balances and that do_not_shield_taddr containing funds of 10 was left alone + assert_equal(self.nodes[0].getbalance(), 10) + assert_equal(self.nodes[0].z_getbalance(do_not_shield_taddr), Decimal('10.0')) + assert_equal(self.nodes[0].z_getbalance(myzaddr), Decimal('39.99990000')) + assert_equal(self.nodes[1].getbalance(), 40) + assert_equal(self.nodes[2].getbalance(), 30) + + # Shield all notes to another z-addr + myzaddr2 = self.nodes[0].z_getnewaddress() + result = self.nodes[0].z_mergetoaddress(["ANY_ZADDR"], myzaddr2, 0) + assert_equal(result["mergingUTXOs"], Decimal('0')) + assert_equal(result["remainingUTXOs"], Decimal('0')) + assert_equal(result["mergingNotes"], Decimal('2')) + assert_equal(result["remainingNotes"], Decimal('0')) + wait_and_assert_operationid_status(self.nodes[0], result['opid']) + blockhash = self.nodes[1].generate(1) + self.sync_all() + + assert_equal(len(self.nodes[0].getblock(blockhash[0])['tx']), 2) + assert_equal(self.nodes[0].z_getbalance(myzaddr), 0) + assert_equal(self.nodes[0].z_getbalance(myzaddr2), Decimal('39.99990000')) + + # Shield coinbase UTXOs from any node 2 taddr, and set fee to 0 + result = self.nodes[2].z_shieldcoinbase("*", myzaddr, 0) + wait_and_assert_operationid_status(self.nodes[2], result['opid']) + self.sync_all() + self.nodes[1].generate(1) + self.sync_all() + + assert_equal(self.nodes[0].getbalance(), 10) + assert_equal(self.nodes[0].z_getbalance(myzaddr), Decimal('30')) + assert_equal(self.nodes[0].z_getbalance(myzaddr2), Decimal('39.99990000')) + assert_equal(self.nodes[1].getbalance(), 60) + assert_equal(self.nodes[2].getbalance(), 0) + + # Merge all notes from node 0 into a node 0 taddr, and set fee to 0 + result = self.nodes[0].z_mergetoaddress(["ANY_ZADDR"], mytaddr, 0) + wait_and_assert_operationid_status(self.nodes[0], result['opid']) + self.sync_all() + self.nodes[1].generate(1) + self.sync_all() + + assert_equal(self.nodes[0].getbalance(), Decimal('79.99990000')) + assert_equal(self.nodes[0].z_getbalance(do_not_shield_taddr), Decimal('10.0')) + assert_equal(self.nodes[0].z_getbalance(mytaddr), Decimal('69.99990000')) + assert_equal(self.nodes[0].z_getbalance(myzaddr), 0) + assert_equal(self.nodes[0].z_getbalance(myzaddr2), 0) + assert_equal(self.nodes[1].getbalance(), 70) + assert_equal(self.nodes[2].getbalance(), 0) + + # Merge all node 0 UTXOs together into a node 1 taddr, and set fee to 0 + self.nodes[1].getnewaddress() # Ensure we have an empty address + n1taddr = self.nodes[1].getnewaddress() + result = self.nodes[0].z_mergetoaddress(["ANY_TADDR"], n1taddr, 0) + wait_and_assert_operationid_status(self.nodes[0], result['opid']) + self.sync_all() + self.nodes[1].generate(1) + self.sync_all() + + assert_equal(self.nodes[0].getbalance(), 0) + assert_equal(self.nodes[0].z_getbalance(do_not_shield_taddr), 0) + assert_equal(self.nodes[0].z_getbalance(mytaddr), 0) + assert_equal(self.nodes[0].z_getbalance(myzaddr), 0) + assert_equal(self.nodes[1].getbalance(), Decimal('159.99990000')) + assert_equal(self.nodes[1].z_getbalance(n1taddr), Decimal('79.99990000')) + assert_equal(self.nodes[2].getbalance(), 0) + + # Generate 800 regular UTXOs on node 0, and 20 regular UTXOs on node 2 + mytaddr = self.nodes[0].getnewaddress() + n2taddr = self.nodes[2].getnewaddress() + self.nodes[1].generate(1000) + self.sync_all() + for i in range(800): + self.nodes[1].sendtoaddress(mytaddr, 1) + for i in range(20): + self.nodes[1].sendtoaddress(n2taddr, 1) + self.nodes[1].generate(1) + self.sync_all() + + # Merging the 800 UTXOs will occur over two transactions, since max tx size is 100,000 bytes. + # We don't verify mergingTransparentValue as UTXOs are not selected in any specific order, so value can change on each test run. + # We set an unrealistically high limit parameter of 99999, to verify that max tx size will constrain the number of UTXOs. + result = self.nodes[0].z_mergetoaddress([mytaddr], myzaddr, 0, 99999) + assert_equal(result["mergingUTXOs"], Decimal('662')) + assert_equal(result["remainingUTXOs"], Decimal('138')) + assert_equal(result["mergingNotes"], Decimal('0')) + assert_equal(result["mergingShieldedValue"], Decimal('0')) + assert_equal(result["remainingNotes"], Decimal('0')) + assert_equal(result["remainingShieldedValue"], Decimal('0')) + remainingTransparentValue = result["remainingTransparentValue"] + opid1 = result['opid'] + + # Verify that UTXOs are locked (not available for selection) by queuing up another merging operation + result = self.nodes[0].z_mergetoaddress([mytaddr], myzaddr, 0, 0) + assert_equal(result["mergingUTXOs"], Decimal('138')) + assert_equal(result["mergingTransparentValue"], Decimal(remainingTransparentValue)) + assert_equal(result["remainingUTXOs"], Decimal('0')) + assert_equal(result["remainingTransparentValue"], Decimal('0')) + assert_equal(result["mergingNotes"], Decimal('0')) + assert_equal(result["mergingShieldedValue"], Decimal('0')) + assert_equal(result["remainingNotes"], Decimal('0')) + assert_equal(result["remainingShieldedValue"], Decimal('0')) + opid2 = result['opid'] + + # wait for both aysnc operations to complete + wait_and_assert_operationid_status(self.nodes[0], opid1) + wait_and_assert_operationid_status(self.nodes[0], opid2) + + # sync_all() invokes sync_mempool() but node 2's mempool limit will cause tx1 and tx2 to be rejected. + # So instead, we sync on blocks and mempool for node 0 and node 1, and after a new block is generated + # which mines tx1 and tx2, all nodes will have an empty mempool which can then be synced. + sync_blocks(self.nodes[:2]) + sync_mempools(self.nodes[:2]) + # Generate enough blocks to ensure all transactions are mined + while self.nodes[1].getmempoolinfo()['size'] > 0: + self.nodes[1].generate(1) + self.sync_all() + + # Verify maximum number of UTXOs which node 2 can shield is limited by option -mempooltxinputlimit + # This option is used when the limit parameter is set to 0. + result = self.nodes[2].z_mergetoaddress([n2taddr], myzaddr, Decimal('0.0001'), 0) + assert_equal(result["mergingUTXOs"], Decimal('7')) + assert_equal(result["remainingUTXOs"], Decimal('13')) + assert_equal(result["mergingNotes"], Decimal('0')) + assert_equal(result["remainingNotes"], Decimal('0')) + wait_and_assert_operationid_status(self.nodes[2], result['opid']) + self.sync_all() + self.nodes[1].generate(1) + self.sync_all() + + # Verify maximum number of UTXOs which node 0 can shield is set by default limit parameter of 50 + mytaddr = self.nodes[0].getnewaddress() + for i in range(100): + self.nodes[1].sendtoaddress(mytaddr, 1) + self.nodes[1].generate(1) + self.sync_all() + result = self.nodes[0].z_mergetoaddress([mytaddr], myzaddr, Decimal('0.0001')) + assert_equal(result["mergingUTXOs"], Decimal('50')) + assert_equal(result["remainingUTXOs"], Decimal('50')) + assert_equal(result["mergingNotes"], Decimal('0')) + # Remaining notes are only counted if we are trying to merge any notes + assert_equal(result["remainingNotes"], Decimal('0')) + wait_and_assert_operationid_status(self.nodes[0], result['opid']) + + # Verify maximum number of UTXOs which node 0 can shield can be set by the limit parameter + result = self.nodes[0].z_mergetoaddress([mytaddr], myzaddr, Decimal('0.0001'), 33) + assert_equal(result["mergingUTXOs"], Decimal('33')) + assert_equal(result["remainingUTXOs"], Decimal('17')) + assert_equal(result["mergingNotes"], Decimal('0')) + # Remaining notes are only counted if we are trying to merge any notes + assert_equal(result["remainingNotes"], Decimal('0')) + wait_and_assert_operationid_status(self.nodes[0], result['opid']) + # Don't sync node 2 which rejects the tx due to its mempooltxinputlimit + sync_blocks(self.nodes[:2]) + sync_mempools(self.nodes[:2]) + self.nodes[1].generate(1) + self.sync_all() + + # Verify maximum number of notes which node 0 can shield can be set by the limit parameter + result = self.nodes[0].z_mergetoaddress([myzaddr], myzaddr, 0, 50, 2) + assert_equal(result["mergingUTXOs"], Decimal('0')) + # Remaining UTXOs are only counted if we are trying to merge any UTXOs + assert_equal(result["remainingUTXOs"], Decimal('0')) + assert_equal(result["mergingNotes"], Decimal('2')) + assert_equal(result["remainingNotes"], Decimal('3')) + wait_and_assert_operationid_status(self.nodes[0], result['opid']) + self.nodes[1].generate(1) + self.sync_all() + + # Shield both UTXOs and notes to a z-addr + result = self.nodes[0].z_mergetoaddress(["*"], myzaddr, 0, 10, 2) + assert_equal(result["mergingUTXOs"], Decimal('10')) + assert_equal(result["remainingUTXOs"], Decimal('7')) + assert_equal(result["mergingNotes"], Decimal('2')) + assert_equal(result["remainingNotes"], Decimal('2')) + wait_and_assert_operationid_status(self.nodes[0], result['opid']) + self.nodes[1].generate(1) + self.sync_all() + +if __name__ == '__main__': + WalletMergeToAddressTest().main() diff --git a/src/Makefile.am b/src/Makefile.am index d8ab34ea0..2db4e362a 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -204,6 +204,7 @@ BITCOIN_CORE_H = \ utiltime.h \ validationinterface.h \ version.h \ + wallet/asyncrpcoperation_mergetoaddress.h \ wallet/asyncrpcoperation_sendmany.h \ wallet/asyncrpcoperation_shieldcoinbase.h \ wallet/crypter.h \ @@ -297,6 +298,7 @@ libbitcoin_wallet_a_SOURCES = \ utiltest.h \ zcbenchmarks.cpp \ zcbenchmarks.h \ + wallet/asyncrpcoperation_mergetoaddress.cpp \ wallet/asyncrpcoperation_sendmany.cpp \ wallet/asyncrpcoperation_shieldcoinbase.cpp \ wallet/crypter.cpp \ diff --git a/src/rpcclient.cpp b/src/rpcclient.cpp index def32500d..45809cdb0 100644 --- a/src/rpcclient.cpp +++ b/src/rpcclient.cpp @@ -109,6 +109,10 @@ static const CRPCConvertParam vRPCConvertParams[] = { "z_gettotalbalance", 0}, { "z_gettotalbalance", 1}, { "z_gettotalbalance", 2}, + { "z_mergetoaddress", 0}, + { "z_mergetoaddress", 2}, + { "z_mergetoaddress", 3}, + { "z_mergetoaddress", 4}, { "z_sendmany", 1}, { "z_sendmany", 2}, { "z_sendmany", 3}, diff --git a/src/rpcserver.cpp b/src/rpcserver.cpp index f241bea86..568ba7926 100644 --- a/src/rpcserver.cpp +++ b/src/rpcserver.cpp @@ -387,6 +387,7 @@ static const CRPCCommand vRPCCommands[] = { "wallet", "z_listreceivedbyaddress",&z_listreceivedbyaddress,false }, { "wallet", "z_getbalance", &z_getbalance, false }, { "wallet", "z_gettotalbalance", &z_gettotalbalance, false }, + { "wallet", "z_mergetoaddress", &z_mergetoaddress, false }, { "wallet", "z_sendmany", &z_sendmany, false }, { "wallet", "z_shieldcoinbase", &z_shieldcoinbase, false }, { "wallet", "z_getoperationstatus", &z_getoperationstatus, true }, diff --git a/src/rpcserver.h b/src/rpcserver.h index d93efb4fc..8ce108cb4 100644 --- a/src/rpcserver.h +++ b/src/rpcserver.h @@ -289,6 +289,7 @@ extern UniValue z_importwallet(const UniValue& params, bool fHelp); // in rpcdum extern UniValue z_listreceivedbyaddress(const UniValue& params, bool fHelp); // in rpcwallet.cpp extern UniValue z_getbalance(const UniValue& params, bool fHelp); // in rpcwallet.cpp extern UniValue z_gettotalbalance(const UniValue& params, bool fHelp); // in rpcwallet.cpp +extern UniValue z_mergetoaddress(const UniValue& params, bool fHelp); // in rpcwallet.cpp extern UniValue z_sendmany(const UniValue& params, bool fHelp); // in rpcwallet.cpp extern UniValue z_shieldcoinbase(const UniValue& params, bool fHelp); // in rpcwallet.cpp extern UniValue z_getoperationstatus(const UniValue& params, bool fHelp); // in rpcwallet.cpp diff --git a/src/test/rpc_wallet_tests.cpp b/src/test/rpc_wallet_tests.cpp index 3b563de54..18b687dbf 100644 --- a/src/test/rpc_wallet_tests.cpp +++ b/src/test/rpc_wallet_tests.cpp @@ -16,6 +16,7 @@ #include "rpcserver.h" #include "asyncrpcqueue.h" #include "asyncrpcoperation.h" +#include "wallet/asyncrpcoperation_mergetoaddress.h" #include "wallet/asyncrpcoperation_sendmany.h" #include "wallet/asyncrpcoperation_shieldcoinbase.h" @@ -1409,4 +1410,312 @@ BOOST_AUTO_TEST_CASE(rpc_z_shieldcoinbase_internals) } +BOOST_AUTO_TEST_CASE(rpc_z_mergetoaddress_parameters) +{ + SelectParams(CBaseChainParams::TESTNET); + + LOCK(pwalletMain->cs_wallet); + + BOOST_CHECK_THROW(CallRPC("z_mergetoaddress"), runtime_error); + BOOST_CHECK_THROW(CallRPC("z_mergetoaddress toofewargs"), runtime_error); + BOOST_CHECK_THROW(CallRPC("z_mergetoaddress just too many args present for this method"), runtime_error); + + // bad from address + BOOST_CHECK_THROW(CallRPC("z_mergetoaddress " + "[\"INVALIDtmRr6yJonqGK23UVhrKuyvTpF8qxQQjKigJ\"] tnpoQJVnYBZZqkFadj2bJJLThNCxbADGB5gSGeYTAGGrT5tejsxY9Zc1BtY8nnHmZkB"), runtime_error); + + // bad from address + BOOST_CHECK_THROW(CallRPC("z_mergetoaddress " + "** tnpoQJVnYBZZqkFadj2bJJLThNCxbADGB5gSGeYTAGGrT5tejsxY9Zc1BtY8nnHmZkB"), runtime_error); + + // bad from address + BOOST_CHECK_THROW(CallRPC("z_mergetoaddress " + "[\"**\"] tnpoQJVnYBZZqkFadj2bJJLThNCxbADGB5gSGeYTAGGrT5tejsxY9Zc1BtY8nnHmZkB"), runtime_error); + + // bad from address + BOOST_CHECK_THROW(CallRPC("z_mergetoaddress " + "tmRr6yJonqGK23UVhrKuyvTpF8qxQQjKigJ tnpoQJVnYBZZqkFadj2bJJLThNCxbADGB5gSGeYTAGGrT5tejsxY9Zc1BtY8nnHmZkB"), runtime_error); + + // bad from address + BOOST_CHECK_THROW(CallRPC("z_mergetoaddress " + "[tmRr6yJonqGK23UVhrKuyvTpF8qxQQjKigJ] tnpoQJVnYBZZqkFadj2bJJLThNCxbADGB5gSGeYTAGGrT5tejsxY9Zc1BtY8nnHmZkB"), runtime_error); + + // bad to address + BOOST_CHECK_THROW(CallRPC("z_mergetoaddress " + "[\"tmRr6yJonqGK23UVhrKuyvTpF8qxQQjKigJ\"] INVALIDtnpoQJVnYBZZqkFadj2bJJLThNCxbADGB5gSGeYTAGGrT5tejsxY9Zc1BtY8nnHmZkB"), runtime_error); + + // duplicate address + BOOST_CHECK_THROW(CallRPC("z_mergetoaddress " + "[\"tmRr6yJonqGK23UVhrKuyvTpF8qxQQjKigJ\", \"tmRr6yJonqGK23UVhrKuyvTpF8qxQQjKigJ\"] " + "tmQP9L3s31cLsghVYf2Jb5MhKj1jRBPoeQn" + ), runtime_error); + + // invalid fee amount, cannot be negative + BOOST_CHECK_THROW(CallRPC("z_mergetoaddress " + "[\"tmRr6yJonqGK23UVhrKuyvTpF8qxQQjKigJ\"] " + "tnpoQJVnYBZZqkFadj2bJJLThNCxbADGB5gSGeYTAGGrT5tejsxY9Zc1BtY8nnHmZkB " + "-0.0001" + ), runtime_error); + + // invalid fee amount, bigger than MAX_MONEY + BOOST_CHECK_THROW(CallRPC("z_mergetoaddress " + "[\"tmRr6yJonqGK23UVhrKuyvTpF8qxQQjKigJ\"] " + "tnpoQJVnYBZZqkFadj2bJJLThNCxbADGB5gSGeYTAGGrT5tejsxY9Zc1BtY8nnHmZkB " + "21000001" + ), runtime_error); + + // invalid transparent limit, must be at least 0 + BOOST_CHECK_THROW(CallRPC("z_mergetoaddress " + "[\"tmRr6yJonqGK23UVhrKuyvTpF8qxQQjKigJ\"] " + "tnpoQJVnYBZZqkFadj2bJJLThNCxbADGB5gSGeYTAGGrT5tejsxY9Zc1BtY8nnHmZkB " + "0.0001 -1" + ), runtime_error); + + // invalid shielded limit, must be at least 0 + BOOST_CHECK_THROW(CallRPC("z_mergetoaddress " + "[\"tmRr6yJonqGK23UVhrKuyvTpF8qxQQjKigJ\"] " + "tnpoQJVnYBZZqkFadj2bJJLThNCxbADGB5gSGeYTAGGrT5tejsxY9Zc1BtY8nnHmZkB " + "0.0001 100 -1" + ), runtime_error); + + // memo bigger than allowed length of ZC_MEMO_SIZE + std::vector v (2 * (ZC_MEMO_SIZE+1)); // x2 for hexadecimal string format + std::fill(v.begin(),v.end(), 'A'); + std::string badmemo(v.begin(), v.end()); + CZCPaymentAddress pa = pwalletMain->GenerateNewZKey(); + std::string zaddr1 = pa.ToString(); + BOOST_CHECK_THROW(CallRPC(string("z_mergetoaddress [\"tmRr6yJonqGK23UVhrKuyvTpF8qxQQjKigJ\"] ") + + zaddr1 + " 0.0001 100 100 " + badmemo), runtime_error); + + // Mutable tx containing contextual information we need to build tx + UniValue retValue = CallRPC("getblockcount"); + int nHeight = retValue.get_int(); + CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), nHeight + 1); + + // Test constructor of AsyncRPCOperation_mergetoaddress + MergeToAddressRecipient testnetzaddr( + "ztjiDe569DPNbyTE6TSdJTaSDhoXEHLGvYoUnBU1wfVNU52TEyT6berYtySkd21njAeEoh8fFJUT42kua9r8EnhBaEKqCpP", + "testnet memo"); + MergeToAddressRecipient mainnetzaddr( + "zcMuhvq8sEkHALuSU2i4NbNQxshSAYrpCExec45ZjtivYPbuiFPwk6WHy4SvsbeZ4siy1WheuRGjtaJmoD1J8bFqNXhsG6U", + "mainnet memo"); + + try { + std::shared_ptr operation(new AsyncRPCOperation_mergetoaddress(mtx, {}, {}, testnetzaddr, -1 )); + BOOST_FAIL("Should have caused an error"); + } catch (const UniValue& objError) { + BOOST_CHECK( find_error(objError, "Fee is out of range")); + } + + try { + std::shared_ptr operation(new AsyncRPCOperation_mergetoaddress(mtx, {}, {}, testnetzaddr, 1)); + BOOST_FAIL("Should have caused an error"); + } catch (const UniValue& objError) { + BOOST_CHECK( find_error(objError, "No inputs")); + } + + std::vector inputs = { MergeToAddressInputUTXO{ COutPoint{uint256(), 0}, 0} }; + + try { + MergeToAddressRecipient badaddr("", "memo"); + std::shared_ptr operation(new AsyncRPCOperation_mergetoaddress(mtx, inputs, {}, badaddr, 1)); + BOOST_FAIL("Should have caused an error"); + } catch (const UniValue& objError) { + BOOST_CHECK( find_error(objError, "Recipient parameter missing")); + } + + // Testnet payment addresses begin with 'zt'. This test detects an incorrect prefix. + try { + std::vector inputs = { MergeToAddressInputUTXO{ COutPoint{uint256(), 0}, 0} }; + std::shared_ptr operation( new AsyncRPCOperation_mergetoaddress(mtx, inputs, {}, mainnetzaddr, 1) ); + BOOST_FAIL("Should have caused an error"); + } catch (const UniValue& objError) { + BOOST_CHECK( find_error(objError, "payment address is for wrong network type")); + } +} + + +// TODO: test private methods +BOOST_AUTO_TEST_CASE(rpc_z_mergetoaddress_internals) +{ + SelectParams(CBaseChainParams::TESTNET); + + LOCK(pwalletMain->cs_wallet); + + // Mutable tx containing contextual information we need to build tx + UniValue retValue = CallRPC("getblockcount"); + int nHeight = retValue.get_int(); + CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), nHeight + 1); + + // Test that option -mempooltxinputlimit is respected. + mapArgs["-mempooltxinputlimit"] = "1"; + + // Add keys manually + BOOST_CHECK_NO_THROW(retValue = CallRPC("getnewaddress")); + MergeToAddressRecipient taddr1(retValue.get_str(), ""); + CZCPaymentAddress pa = pwalletMain->GenerateNewZKey(); + MergeToAddressRecipient zaddr1(pa.ToString(), "DEADBEEF"); + + // Supply 2 inputs when mempool limit is 1 + { + std::vector inputs = { + MergeToAddressInputUTXO{COutPoint{uint256(),0},0}, + MergeToAddressInputUTXO{COutPoint{uint256(),0},0} + }; + std::shared_ptr operation( new AsyncRPCOperation_mergetoaddress(mtx, inputs, {}, zaddr1) ); + operation->main(); + BOOST_CHECK(operation->isFailed()); + std::string msg = operation->getErrorMessage(); + BOOST_CHECK( msg.find("Number of transparent inputs 2 is greater than mempooltxinputlimit of 1") != string::npos); + } + + // Insufficient funds + { + std::vector inputs = { MergeToAddressInputUTXO{COutPoint{uint256(),0},0} }; + std::shared_ptr operation( new AsyncRPCOperation_mergetoaddress(mtx, inputs, {}, zaddr1) ); + operation->main(); + BOOST_CHECK(operation->isFailed()); + std::string msg = operation->getErrorMessage(); + BOOST_CHECK( msg.find("Insufficient funds, have 0.00 and miners fee is 0.0001") != string::npos); + } + + // get_memo_from_hex_string()) + { + std::vector inputs = { MergeToAddressInputUTXO{COutPoint{uint256(),0},100000} }; + std::shared_ptr operation( new AsyncRPCOperation_mergetoaddress(mtx, inputs, {}, zaddr1) ); + std::shared_ptr ptr = std::dynamic_pointer_cast (operation); + TEST_FRIEND_AsyncRPCOperation_mergetoaddress proxy(ptr); + + std::string memo = "DEADBEEF"; + boost::array array = proxy.get_memo_from_hex_string(memo); + BOOST_CHECK_EQUAL(array[0], 0xDE); + BOOST_CHECK_EQUAL(array[1], 0xAD); + BOOST_CHECK_EQUAL(array[2], 0xBE); + BOOST_CHECK_EQUAL(array[3], 0xEF); + for (int i=4; i v (2 * (ZC_MEMO_SIZE+1)); + std::fill(v.begin(),v.end(), 'A'); + std::string bigmemo(v.begin(), v.end()); + + try { + proxy.get_memo_from_hex_string(bigmemo); + BOOST_FAIL("Should have caused an error"); + } catch (const UniValue& objError) { + BOOST_CHECK( find_error(objError, "too big")); + } + + // invalid hexadecimal string + std::fill(v.begin(),v.end(), '@'); // not a hex character + std::string badmemo(v.begin(), v.end()); + + try { + proxy.get_memo_from_hex_string(badmemo); + BOOST_FAIL("Should have caused an error"); + } catch (const UniValue& objError) { + BOOST_CHECK( find_error(objError, "hexadecimal format")); + } + + // odd length hexadecimal string + std::fill(v.begin(),v.end(), 'A'); + v.resize(v.size() - 1); + assert(v.size() %2 == 1); // odd length + std::string oddmemo(v.begin(), v.end()); + try { + proxy.get_memo_from_hex_string(oddmemo); + BOOST_FAIL("Should have caused an error"); + } catch (const UniValue& objError) { + BOOST_CHECK( find_error(objError, "hexadecimal format")); + } + } + + // Test the perform_joinsplit methods. + { + // Dummy input so the operation object can be instantiated. + std::vector inputs = { MergeToAddressInputUTXO{COutPoint{uint256(),0},100000} }; + std::shared_ptr operation( new AsyncRPCOperation_mergetoaddress(mtx, inputs, {}, zaddr1) ); + std::shared_ptr ptr = std::dynamic_pointer_cast (operation); + TEST_FRIEND_AsyncRPCOperation_mergetoaddress proxy(ptr); + + // Enable test mode so tx is not sent and proofs are not generated + static_cast(operation.get())->testmode = true; + + MergeToAddressJSInfo info; + std::vector> witnesses; + uint256 anchor; + try { + proxy.perform_joinsplit(info, witnesses, anchor); + BOOST_FAIL("Should have caused an error"); + } catch (const std::runtime_error & e) { + BOOST_CHECK( string(e.what()).find("anchor is null")!= string::npos); + } + + try { + std::vector v; + proxy.perform_joinsplit(info, v); + BOOST_FAIL("Should have caused an error"); + } catch (const std::runtime_error & e) { + BOOST_CHECK( string(e.what()).find("anchor is null")!= string::npos); + } + + info.notes.push_back(Note()); + try { + proxy.perform_joinsplit(info); + BOOST_FAIL("Should have caused an error"); + } catch (const std::runtime_error & e) { + BOOST_CHECK( string(e.what()).find("number of notes")!= string::npos); + } + + info.notes.clear(); + info.vjsin.push_back(JSInput()); + info.vjsin.push_back(JSInput()); + info.vjsin.push_back(JSInput()); + try { + proxy.perform_joinsplit(info); + BOOST_FAIL("Should have caused an error"); + } catch (const std::runtime_error & e) { + BOOST_CHECK( string(e.what()).find("unsupported joinsplit input")!= string::npos); + } + + info.vjsin.clear(); + try { + proxy.perform_joinsplit(info); + BOOST_FAIL("Should have caused an error"); + } catch (const std::runtime_error & e) { + BOOST_CHECK( string(e.what()).find("error verifying joinsplit")!= string::npos); + } + } + + // Raw joinsplit is a zaddr->zaddr + { + std::string raw = "020000000000000000000100000000000000001027000000000000183a0d4c46c369078705e39bcfebee59a978dbd210ce8de3efc9555a03fbabfd3cea16693d730c63850d7e48ccde79854c19adcb7e9dcd7b7d18805ee09083f6b16e1860729d2d4a90e2f2acd009cf78b5eb0f4a6ee4bdb64b1262d7ce9eb910c460b02022991e968d0c50ee44908e4ccccbc591d0053bcca154dd6d6fc400a29fa686af4682339832ccea362a62aeb9df0d5aa74f86a1e75ac0f48a8ccc41e0a940643c6c33e1d09223b0a46eaf47a1bb4407cfc12b1dcf83a29c0cef51e45c7876ca5b9e5bae86d92976eb3ef68f29cd29386a8be8451b50f82bf9da10c04651868655194da8f6ed3d241bb5b5ff93a3e2bbe44644544d88bcde5cc35978032ee92699c7a61fcbb395e7583f47e698c4d53ede54f956629400bf510fb5e22d03158cc10bdcaaf29e418ef18eb6480dd9c8b9e2a377809f9f32a556ef872febd0021d4ad013aa9f0b7255e98e408d302abefd33a71180b720271835b487ab309e160b06dfe51932120fb84a7ede16b20c53599a11071592109e10260f265ee60d48c62bfe24074020e9b586ce9e9356e68f2ad1a9538258234afe4b83a209f178f45202270eaeaeecaf2ce3100b2c5a714f75f35777a9ebff5ebf47059d2bbf6f3726190216468f2b152673b766225b093f3a2f827c86d6b48b42117fec1d0ac38dd7af700308dcfb02eba821612b16a2c164c47715b9b0c93900893b1aba2ea03765c94d87022db5be06ab338d1912e0936dfe87586d0a8ee49144a6cd2e306abdcb652faa3e0222739deb23154d778b50de75069a4a2cce1208cd1ced3cb4744c9888ce1c2fcd2e66dc31e62d3aa9e423d7275882525e9981f92e84ac85975b8660739407efbe1e34c2249420fde7e17db3096d5b22e83d051d01f0e6e7690dca7d168db338aadf0897fedac10de310db2b1bff762d322935dddbb60c2efb8b15d231fa17b84630371cb275c209f0c4c7d0c68b150ea5cd514122215e3f7fcfb351d69514788d67c2f3c8922581946e3a04bdf1f07f15696ca76eb95b10698bf1188fd882945c57657515889d042a6fc45d38cbc943540c4f0f6d1c45a1574c81f3e42d1eb8702328b729909adee8a5cfed7c79d54627d1fd389af941d878376f7927b9830ca659bf9ab18c5ca5192d52d02723008728d03701b8ab3e1c4a3109409ec0b13df334c7deec3523eeef4c97b5603e643de3a647b873f4c1b47fbfc6586ba66724f112e51fc93839648005043620aa3ce458e246d77977b19c53d98e3e812de006afc1a79744df236582943631d04cc02941ac4be500e4ed9fb9e3e7cc187b1c4050fad1d9d09d5fd70d5d01d615b439d8c0015d2eb10398bcdbf8c4b2bd559dbe4c288a186aed3f86f608da4d582e120c4a896e015e2241900d1daeccd05db968852677c71d752bec46de9962174b46f980e8cc603654daf8b98a3ee92dac066033954164a89568b70b1780c2ce2410b2f816dbeddb2cd463e0c8f21a52cf6427d9647a6fd4bafa8fb4cd4d47ac057b0160bee86c6b2fb8adce214c2bcdda277512200adf0eaa5d2114a2c077b009836a68ec254bfe56f51d147b9afe2ddd9cb917c0c2de19d81b7b8fd9f4574f51fa1207630dc13976f4d7587c962f761af267de71f3909a576e6bedaf6311633910d291ac292c467cc8331ef577aef7646a5d949322fa0367a49f20597a13def53136ee31610395e3e48d291fd8f58504374031fe9dcfba5e06086ebcf01a9106f6a4d6e16e19e4c5bb893f7da79419c94eca31a384be6fa1747284dee0fc3bbc8b1b860172c10b29c1594bb8c747d7fe05827358ff2160f49050001625ffe2e880bd7fc26cd0ffd89750745379a8e862816e08a5a2008043921ab6a4976064ac18f7ee37b6628bc0127d8d5ebd3548e41d8881a082d86f20b32e33094f15a0e6ea6074b08c6cd28142de94713451640a55985051f5577eb54572699d838cb34a79c8939e981c0c277d06a6e2ce69ccb74f8a691ff08f81d8b99e6a86223d29a2b7c8e7b041aba44ea678ae654277f7e91cbfa79158b989164a3d549d9f4feb0cc43169699c13e321fe3f4b94258c75d198ff9184269cd6986c55409e07528c93f64942c6c283ce3917b4bf4c3be2fe3173c8c38cccb35f1fbda0ca88b35a599c0678cb22aa8eabea8249dbd2e4f849fffe69803d299e435ebcd7df95854003d8eda17a74d98b4be0e62d45d7fe48c06a6f464a14f8e0570077cc631279092802a89823f031eef5e1028a6d6fdbd502869a731ee7d28b4d6c71b419462a30d31442d3ee444ffbcbd16d558c9000c97e949c2b1f9d6f6d8db7b9131ebd963620d3fc8595278d6f8fdf49084325373196d53e64142fa5a23eccd6ef908c4d80b8b3e6cc334b7f7012103a3682e4678e9b518163d262a39a2c1a69bf88514c52b7ccd7cc8dc80e71f7c2ec0701cff982573eb0c2c4daeb47fa0b586f4451c10d1da2e5d182b03dd067a5e971b3a6138ca6667aaf853d2ac03b80a1d5870905f2cfb6c78ec3c3719c02f973d638a0f973424a2b0f2b0023f136d60092fe15fba4bc180b9176bd0ff576e053f1af6939fe9ca256203ffaeb3e569f09774d2a6cbf91873e56651f4d6ff77e0b5374b0a1a201d7e523604e0247644544cc571d48c458a4f96f45580b"; + UniValue obj(UniValue::VOBJ); + obj.push_back(Pair("rawtxn", raw)); + + // we have the spending key for the dummy recipient zaddr1 + std::vector inputs = { MergeToAddressInputUTXO{COutPoint{uint256(),0},100000} }; + std::shared_ptr operation( new AsyncRPCOperation_mergetoaddress(mtx, inputs, {}, zaddr1) ); + std::shared_ptr ptr = std::dynamic_pointer_cast (operation); + TEST_FRIEND_AsyncRPCOperation_mergetoaddress proxy(ptr); + + // Enable test mode so tx is not sent + static_cast(operation.get())->testmode = true; + + // Pretend that the operation completed successfully + proxy.set_state(OperationStatus::SUCCESS); + + // Verify test mode is returning output (since no input taddrs, signed and unsigned are the same). + BOOST_CHECK_NO_THROW( proxy.sign_send_raw_transaction(obj) ); + UniValue result = operation->getResult(); + BOOST_CHECK(!result.isNull()); + UniValue resultObj = result.get_obj(); + std::string hex = find_value(resultObj, "hex").get_str(); + BOOST_CHECK_EQUAL(hex, raw); + } +} + + BOOST_AUTO_TEST_SUITE_END() diff --git a/src/wallet/asyncrpcoperation_mergetoaddress.cpp b/src/wallet/asyncrpcoperation_mergetoaddress.cpp new file mode 100644 index 000000000..5257cbc88 --- /dev/null +++ b/src/wallet/asyncrpcoperation_mergetoaddress.cpp @@ -0,0 +1,923 @@ +// Copyright (c) 2017 The Zcash developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "asyncrpcoperation_mergetoaddress.h" + +#include "amount.h" +#include "asyncrpcqueue.h" +#include "core_io.h" +#include "init.h" +#include "main.h" +#include "miner.h" +#include "net.h" +#include "netbase.h" +#include "rpcprotocol.h" +#include "rpcserver.h" +#include "script/interpreter.h" +#include "sodium.h" +#include "timedata.h" +#include "util.h" +#include "utilmoneystr.h" +#include "utiltime.h" +#include "wallet.h" +#include "walletdb.h" +#include "zcash/IncrementalMerkleTree.hpp" + +#include +#include +#include +#include + +#include "paymentdisclosuredb.h" + +using namespace libzcash; + +int mta_find_output(UniValue obj, int n) +{ + UniValue outputMapValue = find_value(obj, "outputmap"); + if (!outputMapValue.isArray()) { + throw JSONRPCError(RPC_WALLET_ERROR, "Missing outputmap for JoinSplit operation"); + } + + UniValue outputMap = outputMapValue.get_array(); + assert(outputMap.size() == ZC_NUM_JS_OUTPUTS); + for (size_t i = 0; i < outputMap.size(); i++) { + if (outputMap[i].get_int() == n) { + return i; + } + } + + throw std::logic_error("n is not present in outputmap"); +} + +AsyncRPCOperation_mergetoaddress::AsyncRPCOperation_mergetoaddress( + CMutableTransaction contextualTx, + std::vector utxoInputs, + std::vector noteInputs, + MergeToAddressRecipient recipient, + CAmount fee, + UniValue contextInfo) : + tx_(contextualTx), utxoInputs_(utxoInputs), noteInputs_(noteInputs), + recipient_(recipient), fee_(fee), contextinfo_(contextInfo) +{ + if (fee < 0 || fee > MAX_MONEY) { + throw JSONRPCError(RPC_INVALID_PARAMETER, "Fee is out of range"); + } + + if (utxoInputs.empty() && noteInputs.empty()) { + throw JSONRPCError(RPC_INVALID_PARAMETER, "No inputs"); + } + + if (std::get<0>(recipient).size() == 0) { + throw JSONRPCError(RPC_INVALID_PARAMETER, "Recipient parameter missing"); + } + + toTaddr_ = CBitcoinAddress(std::get<0>(recipient)); + isToTaddr_ = toTaddr_.IsValid(); + isToZaddr_ = false; + + if (!isToTaddr_) { + CZCPaymentAddress address(std::get<0>(recipient)); + try { + PaymentAddress addr = address.Get(); + + isToZaddr_ = true; + toPaymentAddress_ = addr; + } catch (const std::runtime_error& e) { + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, string("runtime error: ") + e.what()); + } + } + + // Log the context info i.e. the call parameters to z_mergetoaddress + if (LogAcceptCategory("zrpcunsafe")) { + LogPrint("zrpcunsafe", "%s: z_mergetoaddress initialized (params=%s)\n", getId(), contextInfo.write()); + } else { + LogPrint("zrpc", "%s: z_mergetoaddress initialized\n", getId()); + } + + // Lock UTXOs + lock_utxos(); + + // Enable payment disclosure if requested + paymentDisclosureMode = fExperimentalMode && GetBoolArg("-paymentdisclosure", false); +} + +AsyncRPCOperation_mergetoaddress::~AsyncRPCOperation_mergetoaddress() +{ +} + +void AsyncRPCOperation_mergetoaddress::main() +{ + if (isCancelled()) { + unlock_utxos(); // clean up + return; + } + + set_state(OperationStatus::EXECUTING); + start_execution_clock(); + + bool success = false; + +#ifdef ENABLE_MINING +#ifdef ENABLE_WALLET + GenerateBitcoins(false, NULL, 0); +#else + GenerateBitcoins(false, 0); +#endif +#endif + + try { + success = main_impl(); + } catch (const UniValue& objError) { + int code = find_value(objError, "code").get_int(); + std::string message = find_value(objError, "message").get_str(); + set_error_code(code); + set_error_message(message); + } catch (const runtime_error& e) { + set_error_code(-1); + set_error_message("runtime error: " + string(e.what())); + } catch (const logic_error& e) { + set_error_code(-1); + set_error_message("logic error: " + string(e.what())); + } catch (const exception& e) { + set_error_code(-1); + set_error_message("general exception: " + string(e.what())); + } catch (...) { + set_error_code(-2); + set_error_message("unknown error"); + } + +#ifdef ENABLE_MINING +#ifdef ENABLE_WALLET + GenerateBitcoins(GetBoolArg("-gen", false), pwalletMain, GetArg("-genproclimit", 1)); +#else + GenerateBitcoins(GetBoolArg("-gen", false), GetArg("-genproclimit", 1)); +#endif +#endif + + stop_execution_clock(); + + if (success) { + set_state(OperationStatus::SUCCESS); + } else { + set_state(OperationStatus::FAILED); + } + + std::string s = strprintf("%s: z_mergetoaddress finished (status=%s", getId(), getStateAsString()); + if (success) { + s += strprintf(", txid=%s)\n", tx_.GetHash().ToString()); + } else { + s += strprintf(", error=%s)\n", getErrorMessage()); + } + LogPrintf("%s", s); + + unlock_utxos(); // clean up + + // !!! Payment disclosure START + if (success && paymentDisclosureMode && paymentDisclosureData_.size() > 0) { + uint256 txidhash = tx_.GetHash(); + std::shared_ptr db = PaymentDisclosureDB::sharedInstance(); + for (PaymentDisclosureKeyInfo p : paymentDisclosureData_) { + p.first.hash = txidhash; + if (!db->Put(p.first, p.second)) { + LogPrint("paymentdisclosure", "%s: Payment Disclosure: Error writing entry to database for key %s\n", getId(), p.first.ToString()); + } else { + LogPrint("paymentdisclosure", "%s: Payment Disclosure: Successfully added entry to database for key %s\n", getId(), p.first.ToString()); + } + } + } + // !!! Payment disclosure END +} + +// Notes: +// 1. #1159 Currently there is no limit set on the number of joinsplits, so size of tx could be invalid. +// 2. #1277 Spendable notes are not locked, so an operation running in parallel could also try to use them +bool AsyncRPCOperation_mergetoaddress::main_impl() +{ + assert(isToTaddr_ != isToZaddr_); + + bool isPureTaddrOnlyTx = (noteInputs_.empty() && isToTaddr_); + CAmount minersFee = fee_; + + size_t numInputs = utxoInputs_.size(); + + // Check mempooltxinputlimit to avoid creating a transaction which the local mempool rejects + size_t limit = (size_t)GetArg("-mempooltxinputlimit", 0); + if (limit > 0 && numInputs > limit) { + throw JSONRPCError(RPC_WALLET_ERROR, + strprintf("Number of transparent inputs %d is greater than mempooltxinputlimit of %d", + numInputs, limit)); + } + + CAmount t_inputs_total = 0; + for (MergeToAddressInputUTXO& t : utxoInputs_) { + t_inputs_total += std::get<1>(t); + } + + CAmount z_inputs_total = 0; + for (MergeToAddressInputNote& t : noteInputs_) { + z_inputs_total += std::get<2>(t); + } + + CAmount targetAmount = z_inputs_total + t_inputs_total; + + if (targetAmount <= minersFee) { + throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, + strprintf("Insufficient funds, have %s and miners fee is %s", + FormatMoney(targetAmount), FormatMoney(minersFee))); + } + + CAmount sendAmount = targetAmount - minersFee; + + // update the transaction with the UTXO inputs and output (if any) + CMutableTransaction rawTx(tx_); + for (MergeToAddressInputUTXO& t : utxoInputs_) { + CTxIn in(std::get<0>(t)); + rawTx.vin.push_back(in); + } + if (isToTaddr_) { + CScript scriptPubKey = GetScriptForDestination(toTaddr_.Get()); + CTxOut out(sendAmount, scriptPubKey); + rawTx.vout.push_back(out); + } + tx_ = CTransaction(rawTx); + + LogPrint(isPureTaddrOnlyTx ? "zrpc" : "zrpcunsafe", "%s: spending %s to send %s with fee %s\n", + getId(), FormatMoney(targetAmount), FormatMoney(sendAmount), FormatMoney(minersFee)); + LogPrint("zrpc", "%s: transparent input: %s\n", getId(), FormatMoney(t_inputs_total)); + LogPrint("zrpcunsafe", "%s: private input: %s\n", getId(), FormatMoney(z_inputs_total)); + if (isToTaddr_) { + LogPrint("zrpc", "%s: transparent output: %s\n", getId(), FormatMoney(sendAmount)); + } else { + LogPrint("zrpcunsafe", "%s: private output: %s\n", getId(), FormatMoney(sendAmount)); + } + LogPrint("zrpc", "%s: fee: %s\n", getId(), FormatMoney(minersFee)); + + // Grab the current consensus branch ID + { + LOCK(cs_main); + consensusBranchId_ = CurrentEpochBranchId(chainActive.Height() + 1, Params().GetConsensus()); + } + + /** + * SCENARIO #1 + * + * taddrs -> taddr + * + * There are no zaddrs or joinsplits involved. + */ + if (isPureTaddrOnlyTx) { + UniValue obj(UniValue::VOBJ); + obj.push_back(Pair("rawtxn", EncodeHexTx(tx_))); + sign_send_raw_transaction(obj); + return true; + } + /** + * END SCENARIO #1 + */ + + + // Prepare raw transaction to handle JoinSplits + CMutableTransaction mtx(tx_); + crypto_sign_keypair(joinSplitPubKey_.begin(), joinSplitPrivKey_); + mtx.joinSplitPubKey = joinSplitPubKey_; + tx_ = CTransaction(mtx); + std::string hexMemo = std::get<1>(recipient_); + + + /** + * SCENARIO #2 + * + * taddrs -> zaddr + * + * We only need a single JoinSplit. + */ + if (noteInputs_.empty() && isToZaddr_) { + // Create JoinSplit to target z-addr. + MergeToAddressJSInfo info; + info.vpub_old = sendAmount; + info.vpub_new = 0; + + JSOutput jso = JSOutput(toPaymentAddress_, sendAmount); + if (hexMemo.size() > 0) { + jso.memo = get_memo_from_hex_string(hexMemo); + } + info.vjsout.push_back(jso); + + UniValue obj(UniValue::VOBJ); + obj = perform_joinsplit(info); + sign_send_raw_transaction(obj); + return true; + } + /** + * END SCENARIO #2 + */ + + + // Copy zinputs to more flexible containers + std::deque zInputsDeque; + for (auto o : noteInputs_) { + zInputsDeque.push_back(o); + } + + // When spending notes, take a snapshot of note witnesses and anchors as the treestate will + // change upon arrival of new blocks which contain joinsplit transactions. This is likely + // to happen as creating a chained joinsplit transaction can take longer than the block interval. + { + LOCK2(cs_main, pwalletMain->cs_wallet); + for (auto t : noteInputs_) { + JSOutPoint jso = std::get<0>(t); + std::vector vOutPoints = {jso}; + uint256 inputAnchor; + std::vector> vInputWitnesses; + pwalletMain->GetNoteWitnesses(vOutPoints, vInputWitnesses, inputAnchor); + jsopWitnessAnchorMap[jso.ToString()] = MergeToAddressWitnessAnchorData{vInputWitnesses[0], inputAnchor}; + } + } + + /** + * SCENARIO #3 + * + * zaddrs -> zaddr + * taddrs -> + * + * zaddrs -> + * taddrs -> taddr + * + * Send to zaddr by chaining JoinSplits together and immediately consuming any change + * Send to taddr by creating dummy z outputs and accumulating value in a change note + * which is used to set vpub_new in the last chained joinsplit. + */ + UniValue obj(UniValue::VOBJ); + CAmount jsChange = 0; // this is updated after each joinsplit + int changeOutputIndex = -1; // this is updated after each joinsplit if jsChange > 0 + bool vpubOldProcessed = false; // updated when vpub_old for taddr inputs is set in first joinsplit + bool vpubNewProcessed = false; // updated when vpub_new for miner fee and taddr outputs is set in last joinsplit + + // At this point, we are guaranteed to have at least one input note. + // Use address of first input note as the temporary change address. + SpendingKey changeKey = std::get<3>(zInputsDeque.front()); + PaymentAddress changeAddress = changeKey.address(); + + CAmount vpubOldTarget = 0; + CAmount vpubNewTarget = 0; + if (isToTaddr_) { + vpubNewTarget = z_inputs_total; + } else { + if (utxoInputs_.empty()) { + vpubNewTarget = minersFee; + } else { + vpubOldTarget = t_inputs_total - minersFee; + } + } + + // Keep track of treestate within this transaction + boost::unordered_map intermediates; + std::vector previousCommitments; + + while (!vpubNewProcessed) { + MergeToAddressJSInfo info; + info.vpub_old = 0; + info.vpub_new = 0; + + // Set vpub_old in the first joinsplit + if (!vpubOldProcessed) { + if (t_inputs_total < vpubOldTarget) { + throw JSONRPCError(RPC_WALLET_ERROR, + strprintf("Insufficient transparent funds for vpub_old %s (miners fee %s, taddr inputs %s)", + FormatMoney(vpubOldTarget), FormatMoney(minersFee), FormatMoney(t_inputs_total))); + } + info.vpub_old += vpubOldTarget; // funds flowing from public pool + vpubOldProcessed = true; + } + + CAmount jsInputValue = 0; + uint256 jsAnchor; + std::vector> witnesses; + + JSDescription prevJoinSplit; + + // Keep track of previous JoinSplit and its commitments + if (tx_.vjoinsplit.size() > 0) { + prevJoinSplit = tx_.vjoinsplit.back(); + } + + // If there is no change, the chain has terminated so we can reset the tracked treestate. + if (jsChange == 0 && tx_.vjoinsplit.size() > 0) { + intermediates.clear(); + previousCommitments.clear(); + } + + // + // Consume change as the first input of the JoinSplit. + // + if (jsChange > 0) { + LOCK2(cs_main, pwalletMain->cs_wallet); + + // Update tree state with previous joinsplit + ZCIncrementalMerkleTree tree; + auto it = intermediates.find(prevJoinSplit.anchor); + if (it != intermediates.end()) { + tree = it->second; + } else if (!pcoinsTip->GetAnchorAt(prevJoinSplit.anchor, tree)) { + throw JSONRPCError(RPC_WALLET_ERROR, "Could not find previous JoinSplit anchor"); + } + + assert(changeOutputIndex != -1); + boost::optional changeWitness; + int n = 0; + for (const uint256& commitment : prevJoinSplit.commitments) { + tree.append(commitment); + previousCommitments.push_back(commitment); + if (!changeWitness && changeOutputIndex == n++) { + changeWitness = tree.witness(); + } else if (changeWitness) { + changeWitness.get().append(commitment); + } + } + if (changeWitness) { + witnesses.push_back(changeWitness); + } + jsAnchor = tree.root(); + intermediates.insert(std::make_pair(tree.root(), tree)); // chained js are interstitial (found in between block boundaries) + + // Decrypt the change note's ciphertext to retrieve some data we need + ZCNoteDecryption decryptor(changeKey.receiving_key()); + auto hSig = prevJoinSplit.h_sig(*pzcashParams, tx_.joinSplitPubKey); + try { + NotePlaintext plaintext = NotePlaintext::decrypt( + decryptor, + prevJoinSplit.ciphertexts[changeOutputIndex], + prevJoinSplit.ephemeralKey, + hSig, + (unsigned char)changeOutputIndex); + + Note note = plaintext.note(changeAddress); + info.notes.push_back(note); + info.zkeys.push_back(changeKey); + + jsInputValue += plaintext.value; + + LogPrint("zrpcunsafe", "%s: spending change (amount=%s)\n", + getId(), + FormatMoney(plaintext.value)); + + } catch (const std::exception& e) { + throw JSONRPCError(RPC_WALLET_ERROR, strprintf("Error decrypting output note of previous JoinSplit: %s", e.what())); + } + } + + + // + // Consume spendable non-change notes + // + std::vector vInputNotes; + std::vector vInputZKeys; + std::vector vOutPoints; + std::vector> vInputWitnesses; + uint256 inputAnchor; + int numInputsNeeded = (jsChange > 0) ? 1 : 0; + while (numInputsNeeded++ < ZC_NUM_JS_INPUTS && zInputsDeque.size() > 0) { + MergeToAddressInputNote t = zInputsDeque.front(); + JSOutPoint jso = std::get<0>(t); + Note note = std::get<1>(t); + CAmount noteFunds = std::get<2>(t); + SpendingKey zkey = std::get<3>(t); + zInputsDeque.pop_front(); + + MergeToAddressWitnessAnchorData wad = jsopWitnessAnchorMap[jso.ToString()]; + vInputWitnesses.push_back(wad.witness); + if (inputAnchor.IsNull()) { + inputAnchor = wad.anchor; + } else if (inputAnchor != wad.anchor) { + throw JSONRPCError(RPC_WALLET_ERROR, "Selected input notes do not share the same anchor"); + } + + vOutPoints.push_back(jso); + vInputNotes.push_back(note); + vInputZKeys.push_back(zkey); + + jsInputValue += noteFunds; + + int wtxHeight = -1; + int wtxDepth = -1; + { + LOCK2(cs_main, pwalletMain->cs_wallet); + const CWalletTx& wtx = pwalletMain->mapWallet[jso.hash]; + // Zero confirmation notes belong to transactions which have not yet been mined + if (mapBlockIndex.find(wtx.hashBlock) == mapBlockIndex.end()) { + throw JSONRPCError(RPC_WALLET_ERROR, strprintf("mapBlockIndex does not contain block hash %s", wtx.hashBlock.ToString())); + } + wtxHeight = mapBlockIndex[wtx.hashBlock]->nHeight; + wtxDepth = wtx.GetDepthInMainChain(); + } + LogPrint("zrpcunsafe", "%s: spending note (txid=%s, vjoinsplit=%d, ciphertext=%d, amount=%s, height=%d, confirmations=%d)\n", + getId(), + jso.hash.ToString().substr(0, 10), + jso.js, + int(jso.n), // uint8_t + FormatMoney(noteFunds), + wtxHeight, + wtxDepth); + } + + // Add history of previous commitments to witness + if (vInputNotes.size() > 0) { + if (vInputWitnesses.size() == 0) { + throw JSONRPCError(RPC_WALLET_ERROR, "Could not find witness for note commitment"); + } + + for (auto& optionalWitness : vInputWitnesses) { + if (!optionalWitness) { + throw JSONRPCError(RPC_WALLET_ERROR, "Witness for note commitment is null"); + } + ZCIncrementalWitness w = *optionalWitness; // could use .get(); + if (jsChange > 0) { + for (const uint256& commitment : previousCommitments) { + w.append(commitment); + } + if (jsAnchor != w.root()) { + throw JSONRPCError(RPC_WALLET_ERROR, "Witness for spendable note does not have same anchor as change input"); + } + } + witnesses.push_back(w); + } + + // The jsAnchor is null if this JoinSplit is at the start of a new chain + if (jsAnchor.IsNull()) { + jsAnchor = inputAnchor; + } + + // Add spendable notes as inputs + std::copy(vInputNotes.begin(), vInputNotes.end(), std::back_inserter(info.notes)); + std::copy(vInputZKeys.begin(), vInputZKeys.end(), std::back_inserter(info.zkeys)); + } + + // Accumulate change + jsChange = jsInputValue + info.vpub_old; + + // Set vpub_new in the last joinsplit (when there are no more notes to spend) + if (zInputsDeque.empty()) { + assert(!vpubNewProcessed); + if (jsInputValue < vpubNewTarget) { + throw JSONRPCError(RPC_WALLET_ERROR, + strprintf("Insufficient funds for vpub_new %s (miners fee %s, taddr inputs %s)", + FormatMoney(vpubNewTarget), FormatMoney(minersFee), FormatMoney(t_inputs_total))); + } + info.vpub_new += vpubNewTarget; // funds flowing back to public pool + vpubNewProcessed = true; + jsChange -= vpubNewTarget; + // If we are merging to a t-addr, there should be no change + if (isToTaddr_) assert(jsChange == 0); + } + + // create dummy output + info.vjsout.push_back(JSOutput()); // dummy output while we accumulate funds into a change note for vpub_new + + // create output for any change + if (jsChange > 0) { + std::string outputType = "change"; + auto jso = JSOutput(changeAddress, jsChange); + // If this is the final output, set the target and memo + if (isToZaddr_ && vpubNewProcessed) { + outputType = "target"; + jso.addr = toPaymentAddress_; + if (!hexMemo.empty()) { + jso.memo = get_memo_from_hex_string(hexMemo); + } + } + info.vjsout.push_back(jso); + + LogPrint("zrpcunsafe", "%s: generating note for %s (amount=%s)\n", + getId(), + outputType, + FormatMoney(jsChange)); + } + + obj = perform_joinsplit(info, witnesses, jsAnchor); + + if (jsChange > 0) { + changeOutputIndex = mta_find_output(obj, 1); + } + } + + // Sanity check in case changes to code block above exits loop by invoking 'break' + assert(zInputsDeque.size() == 0); + assert(vpubNewProcessed); + + sign_send_raw_transaction(obj); + return true; +} + + +/** + * Sign and send a raw transaction. + * Raw transaction as hex string should be in object field "rawtxn" + */ +void AsyncRPCOperation_mergetoaddress::sign_send_raw_transaction(UniValue obj) +{ + // Sign the raw transaction + UniValue rawtxnValue = find_value(obj, "rawtxn"); + if (rawtxnValue.isNull()) { + throw JSONRPCError(RPC_WALLET_ERROR, "Missing hex data for raw transaction"); + } + std::string rawtxn = rawtxnValue.get_str(); + + UniValue params = UniValue(UniValue::VARR); + params.push_back(rawtxn); + UniValue signResultValue = signrawtransaction(params, false); + UniValue signResultObject = signResultValue.get_obj(); + UniValue completeValue = find_value(signResultObject, "complete"); + bool complete = completeValue.get_bool(); + if (!complete) { + // TODO: #1366 Maybe get "errors" and print array vErrors into a string + throw JSONRPCError(RPC_WALLET_ENCRYPTION_FAILED, "Failed to sign transaction"); + } + + UniValue hexValue = find_value(signResultObject, "hex"); + if (hexValue.isNull()) { + throw JSONRPCError(RPC_WALLET_ERROR, "Missing hex data for signed transaction"); + } + std::string signedtxn = hexValue.get_str(); + + // Send the signed transaction + if (!testmode) { + params.clear(); + params.setArray(); + params.push_back(signedtxn); + UniValue sendResultValue = sendrawtransaction(params, false); + if (sendResultValue.isNull()) { + throw JSONRPCError(RPC_WALLET_ERROR, "Send raw transaction did not return an error or a txid."); + } + + std::string txid = sendResultValue.get_str(); + + UniValue o(UniValue::VOBJ); + o.push_back(Pair("txid", txid)); + set_result(o); + } else { + // Test mode does not send the transaction to the network. + + CDataStream stream(ParseHex(signedtxn), SER_NETWORK, PROTOCOL_VERSION); + CTransaction tx; + stream >> tx; + + UniValue o(UniValue::VOBJ); + o.push_back(Pair("test", 1)); + o.push_back(Pair("txid", tx.GetHash().ToString())); + o.push_back(Pair("hex", signedtxn)); + set_result(o); + } + + // Keep the signed transaction so we can hash to the same txid + CDataStream stream(ParseHex(signedtxn), SER_NETWORK, PROTOCOL_VERSION); + CTransaction tx; + stream >> tx; + tx_ = tx; +} + + +UniValue AsyncRPCOperation_mergetoaddress::perform_joinsplit(MergeToAddressJSInfo& info) +{ + std::vector> witnesses; + uint256 anchor; + { + LOCK(cs_main); + anchor = pcoinsTip->GetBestAnchor(); // As there are no inputs, ask the wallet for the best anchor + } + return perform_joinsplit(info, witnesses, anchor); +} + + +UniValue AsyncRPCOperation_mergetoaddress::perform_joinsplit(MergeToAddressJSInfo& info, std::vector& outPoints) +{ + std::vector> witnesses; + uint256 anchor; + { + LOCK(cs_main); + pwalletMain->GetNoteWitnesses(outPoints, witnesses, anchor); + } + return perform_joinsplit(info, witnesses, anchor); +} + +UniValue AsyncRPCOperation_mergetoaddress::perform_joinsplit( + MergeToAddressJSInfo& info, + std::vector> witnesses, + uint256 anchor) +{ + if (anchor.IsNull()) { + throw std::runtime_error("anchor is null"); + } + + if (witnesses.size() != info.notes.size()) { + throw runtime_error("number of notes and witnesses do not match"); + } + + if (info.notes.size() != info.zkeys.size()) { + throw runtime_error("number of notes and spending keys do not match"); + } + + for (size_t i = 0; i < witnesses.size(); i++) { + if (!witnesses[i]) { + throw runtime_error("joinsplit input could not be found in tree"); + } + info.vjsin.push_back(JSInput(*witnesses[i], info.notes[i], info.zkeys[i])); + } + + // Make sure there are two inputs and two outputs + while (info.vjsin.size() < ZC_NUM_JS_INPUTS) { + info.vjsin.push_back(JSInput()); + } + + while (info.vjsout.size() < ZC_NUM_JS_OUTPUTS) { + info.vjsout.push_back(JSOutput()); + } + + if (info.vjsout.size() != ZC_NUM_JS_INPUTS || info.vjsin.size() != ZC_NUM_JS_OUTPUTS) { + throw runtime_error("unsupported joinsplit input/output counts"); + } + + CMutableTransaction mtx(tx_); + + LogPrint("zrpcunsafe", "%s: creating joinsplit at index %d (vpub_old=%s, vpub_new=%s, in[0]=%s, in[1]=%s, out[0]=%s, out[1]=%s)\n", + getId(), + tx_.vjoinsplit.size(), + FormatMoney(info.vpub_old), FormatMoney(info.vpub_new), + FormatMoney(info.vjsin[0].note.value), FormatMoney(info.vjsin[1].note.value), + FormatMoney(info.vjsout[0].value), FormatMoney(info.vjsout[1].value)); + + // Generate the proof, this can take over a minute. + boost::array inputs{info.vjsin[0], info.vjsin[1]}; + boost::array outputs{info.vjsout[0], info.vjsout[1]}; + boost::array inputMap; + boost::array outputMap; + + uint256 esk; // payment disclosure - secret + + JSDescription jsdesc = JSDescription::Randomized( + *pzcashParams, + joinSplitPubKey_, + anchor, + inputs, + outputs, + inputMap, + outputMap, + info.vpub_old, + info.vpub_new, + !this->testmode, + &esk); // parameter expects pointer to esk, so pass in address + { + auto verifier = libzcash::ProofVerifier::Strict(); + if (!(jsdesc.Verify(*pzcashParams, verifier, joinSplitPubKey_))) { + throw std::runtime_error("error verifying joinsplit"); + } + } + + mtx.vjoinsplit.push_back(jsdesc); + + // Empty output script. + CScript scriptCode; + CTransaction signTx(mtx); + uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL, 0, consensusBranchId_); + + // Add the signature + if (!(crypto_sign_detached(&mtx.joinSplitSig[0], NULL, + dataToBeSigned.begin(), 32, + joinSplitPrivKey_) == 0)) { + throw std::runtime_error("crypto_sign_detached failed"); + } + + // Sanity check + if (!(crypto_sign_verify_detached(&mtx.joinSplitSig[0], + dataToBeSigned.begin(), 32, + mtx.joinSplitPubKey.begin()) == 0)) { + throw std::runtime_error("crypto_sign_verify_detached failed"); + } + + CTransaction rawTx(mtx); + tx_ = rawTx; + + CDataStream ss(SER_NETWORK, PROTOCOL_VERSION); + ss << rawTx; + + std::string encryptedNote1; + std::string encryptedNote2; + { + CDataStream ss2(SER_NETWORK, PROTOCOL_VERSION); + ss2 << ((unsigned char)0x00); + ss2 << jsdesc.ephemeralKey; + ss2 << jsdesc.ciphertexts[0]; + ss2 << jsdesc.h_sig(*pzcashParams, joinSplitPubKey_); + + encryptedNote1 = HexStr(ss2.begin(), ss2.end()); + } + { + CDataStream ss2(SER_NETWORK, PROTOCOL_VERSION); + ss2 << ((unsigned char)0x01); + ss2 << jsdesc.ephemeralKey; + ss2 << jsdesc.ciphertexts[1]; + ss2 << jsdesc.h_sig(*pzcashParams, joinSplitPubKey_); + + encryptedNote2 = HexStr(ss2.begin(), ss2.end()); + } + + UniValue arrInputMap(UniValue::VARR); + UniValue arrOutputMap(UniValue::VARR); + for (size_t i = 0; i < ZC_NUM_JS_INPUTS; i++) { + arrInputMap.push_back(inputMap[i]); + } + for (size_t i = 0; i < ZC_NUM_JS_OUTPUTS; i++) { + arrOutputMap.push_back(outputMap[i]); + } + + + // !!! Payment disclosure START + unsigned char buffer[32] = {0}; + memcpy(&buffer[0], &joinSplitPrivKey_[0], 32); // private key in first half of 64 byte buffer + std::vector vch(&buffer[0], &buffer[0] + 32); + uint256 joinSplitPrivKey = uint256(vch); + size_t js_index = tx_.vjoinsplit.size() - 1; + uint256 placeholder; + for (int i = 0; i < ZC_NUM_JS_OUTPUTS; i++) { + uint8_t mapped_index = outputMap[i]; + // placeholder for txid will be filled in later when tx has been finalized and signed. + PaymentDisclosureKey pdKey = {placeholder, js_index, mapped_index}; + JSOutput output = outputs[mapped_index]; + libzcash::PaymentAddress zaddr = output.addr; // randomized output + PaymentDisclosureInfo pdInfo = {PAYMENT_DISCLOSURE_VERSION_EXPERIMENTAL, esk, joinSplitPrivKey, zaddr}; + paymentDisclosureData_.push_back(PaymentDisclosureKeyInfo(pdKey, pdInfo)); + + CZCPaymentAddress address(zaddr); + LogPrint("paymentdisclosure", "%s: Payment Disclosure: js=%d, n=%d, zaddr=%s\n", getId(), js_index, int(mapped_index), address.ToString()); + } + // !!! Payment disclosure END + + UniValue obj(UniValue::VOBJ); + obj.push_back(Pair("encryptednote1", encryptedNote1)); + obj.push_back(Pair("encryptednote2", encryptedNote2)); + obj.push_back(Pair("rawtxn", HexStr(ss.begin(), ss.end()))); + obj.push_back(Pair("inputmap", arrInputMap)); + obj.push_back(Pair("outputmap", arrOutputMap)); + return obj; +} + +boost::array AsyncRPCOperation_mergetoaddress::get_memo_from_hex_string(std::string s) +{ + boost::array memo = {{0x00}}; + + std::vector rawMemo = ParseHex(s.c_str()); + + // If ParseHex comes across a non-hex char, it will stop but still return results so far. + size_t slen = s.length(); + if (slen % 2 != 0 || (slen > 0 && rawMemo.size() != slen / 2)) { + throw JSONRPCError(RPC_INVALID_PARAMETER, "Memo must be in hexadecimal format"); + } + + if (rawMemo.size() > ZC_MEMO_SIZE) { + throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Memo size of %d is too big, maximum allowed is %d", rawMemo.size(), ZC_MEMO_SIZE)); + } + + // copy vector into boost array + int lenMemo = rawMemo.size(); + for (int i = 0; i < ZC_MEMO_SIZE && i < lenMemo; i++) { + memo[i] = rawMemo[i]; + } + return memo; +} + +/** + * Override getStatus() to append the operation's input parameters to the default status object. + */ +UniValue AsyncRPCOperation_mergetoaddress::getStatus() const +{ + UniValue v = AsyncRPCOperation::getStatus(); + if (contextinfo_.isNull()) { + return v; + } + + UniValue obj = v.get_obj(); + obj.push_back(Pair("method", "z_mergetoaddress")); + obj.push_back(Pair("params", contextinfo_)); + return obj; +} + +/** + * Lock input utxos + */ + void AsyncRPCOperation_mergetoaddress::lock_utxos() { + LOCK2(cs_main, pwalletMain->cs_wallet); + for (auto utxo : utxoInputs_) { + pwalletMain->LockCoin(std::get<0>(utxo)); + } +} + +/** + * Unlock input utxos + */ +void AsyncRPCOperation_mergetoaddress::unlock_utxos() { + LOCK2(cs_main, pwalletMain->cs_wallet); + for (auto utxo : utxoInputs_) { + pwalletMain->UnlockCoin(std::get<0>(utxo)); + } +} diff --git a/src/wallet/asyncrpcoperation_mergetoaddress.h b/src/wallet/asyncrpcoperation_mergetoaddress.h new file mode 100644 index 000000000..1619b5c97 --- /dev/null +++ b/src/wallet/asyncrpcoperation_mergetoaddress.h @@ -0,0 +1,189 @@ +// Copyright (c) 2017 The Zcash developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef ASYNCRPCOPERATION_MERGETOADDRESS_H +#define ASYNCRPCOPERATION_MERGETOADDRESS_H + +#include "amount.h" +#include "asyncrpcoperation.h" +#include "base58.h" +#include "paymentdisclosure.h" +#include "primitives/transaction.h" +#include "wallet.h" +#include "zcash/Address.hpp" +#include "zcash/JoinSplit.hpp" + +#include +#include + +#include + +// Default transaction fee if caller does not specify one. +#define MERGE_TO_ADDRESS_OPERATION_DEFAULT_MINERS_FEE 10000 + +using namespace libzcash; + +// Input UTXO is a tuple of txid, vout, amount +typedef std::tuple MergeToAddressInputUTXO; + +// Input JSOP is a tuple of JSOutpoint, note, amount, spending key +typedef std::tuple MergeToAddressInputNote; + +// A recipient is a tuple of address, memo (optional if zaddr) +typedef std::tuple MergeToAddressRecipient; + +// Package of info which is passed to perform_joinsplit methods. +struct MergeToAddressJSInfo { + std::vector vjsin; + std::vector vjsout; + std::vector notes; + std::vector zkeys; + CAmount vpub_old = 0; + CAmount vpub_new = 0; +}; + +// A struct to help us track the witness and anchor for a given JSOutPoint +struct MergeToAddressWitnessAnchorData { + boost::optional witness; + uint256 anchor; +}; + +class AsyncRPCOperation_mergetoaddress : public AsyncRPCOperation +{ +public: + AsyncRPCOperation_mergetoaddress( + CMutableTransaction contextualTx, + std::vector utxoInputs, + std::vector noteInputs, + MergeToAddressRecipient recipient, + CAmount fee = MERGE_TO_ADDRESS_OPERATION_DEFAULT_MINERS_FEE, + UniValue contextInfo = NullUniValue); + virtual ~AsyncRPCOperation_mergetoaddress(); + + // We don't want to be copied or moved around + AsyncRPCOperation_mergetoaddress(AsyncRPCOperation_mergetoaddress const&) = delete; // Copy construct + AsyncRPCOperation_mergetoaddress(AsyncRPCOperation_mergetoaddress&&) = delete; // Move construct + AsyncRPCOperation_mergetoaddress& operator=(AsyncRPCOperation_mergetoaddress const&) = delete; // Copy assign + AsyncRPCOperation_mergetoaddress& operator=(AsyncRPCOperation_mergetoaddress&&) = delete; // Move assign + + virtual void main(); + + virtual UniValue getStatus() const; + + bool testmode = false; // Set to true to disable sending txs and generating proofs + + bool paymentDisclosureMode = false; // Set to true to save esk for encrypted notes in payment disclosure database. + +private: + friend class TEST_FRIEND_AsyncRPCOperation_mergetoaddress; // class for unit testing + + UniValue contextinfo_; // optional data to include in return value from getStatus() + + uint32_t consensusBranchId_; + CAmount fee_; + int mindepth_; + MergeToAddressRecipient recipient_; + bool isToTaddr_; + bool isToZaddr_; + CBitcoinAddress toTaddr_; + PaymentAddress toPaymentAddress_; + + uint256 joinSplitPubKey_; + unsigned char joinSplitPrivKey_[crypto_sign_SECRETKEYBYTES]; + + // The key is the result string from calling JSOutPoint::ToString() + std::unordered_map jsopWitnessAnchorMap; + + std::vector utxoInputs_; + std::vector noteInputs_; + + CTransaction tx_; + + boost::array get_memo_from_hex_string(std::string s); + bool main_impl(); + + // JoinSplit without any input notes to spend + UniValue perform_joinsplit(MergeToAddressJSInfo&); + + // JoinSplit with input notes to spend (JSOutPoints)) + UniValue perform_joinsplit(MergeToAddressJSInfo&, std::vector&); + + // JoinSplit where you have the witnesses and anchor + UniValue perform_joinsplit( + MergeToAddressJSInfo& info, + std::vector> witnesses, + uint256 anchor); + + void sign_send_raw_transaction(UniValue obj); // throws exception if there was an error + + void lock_utxos(); + + void unlock_utxos(); + + // payment disclosure! + std::vector paymentDisclosureData_; +}; + + +// To test private methods, a friend class can act as a proxy +class TEST_FRIEND_AsyncRPCOperation_mergetoaddress +{ +public: + std::shared_ptr delegate; + + TEST_FRIEND_AsyncRPCOperation_mergetoaddress(std::shared_ptr ptr) : delegate(ptr) {} + + CTransaction getTx() + { + return delegate->tx_; + } + + void setTx(CTransaction tx) + { + delegate->tx_ = tx; + } + + // Delegated methods + + boost::array get_memo_from_hex_string(std::string s) + { + return delegate->get_memo_from_hex_string(s); + } + + bool main_impl() + { + return delegate->main_impl(); + } + + UniValue perform_joinsplit(MergeToAddressJSInfo& info) + { + return delegate->perform_joinsplit(info); + } + + UniValue perform_joinsplit(MergeToAddressJSInfo& info, std::vector& v) + { + return delegate->perform_joinsplit(info, v); + } + + UniValue perform_joinsplit( + MergeToAddressJSInfo& info, + std::vector> witnesses, + uint256 anchor) + { + return delegate->perform_joinsplit(info, witnesses, anchor); + } + + void sign_send_raw_transaction(UniValue obj) + { + delegate->sign_send_raw_transaction(obj); + } + + void set_state(OperationStatus state) + { + delegate->state_.store(state); + } +}; + + +#endif /* ASYNCRPCOPERATION_MERGETOADDRESS_H */ diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 3e63c3689..4478d5307 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -24,6 +24,7 @@ #include "utiltime.h" #include "asyncrpcoperation.h" #include "asyncrpcqueue.h" +#include "wallet/asyncrpcoperation_mergetoaddress.h" #include "wallet/asyncrpcoperation_sendmany.h" #include "wallet/asyncrpcoperation_shieldcoinbase.h" @@ -3748,6 +3749,333 @@ UniValue z_shieldcoinbase(const UniValue& params, bool fHelp) } +#define MERGE_TO_ADDRESS_DEFAULT_TRANSPARENT_LIMIT 50 +#define MERGE_TO_ADDRESS_DEFAULT_SHIELDED_LIMIT 10 + +#define JOINSPLIT_SIZE JSDescription().GetSerializeSize(SER_NETWORK, PROTOCOL_VERSION) + +UniValue z_mergetoaddress(const UniValue& params, bool fHelp) +{ + if (!EnsureWalletIsAvailable(fHelp)) + return NullUniValue; + + if (fHelp || params.size() < 2 || params.size() > 6) + throw runtime_error( + "z_mergetoaddress [\"fromaddress\", ... ] \"toaddress\" ( fee ) ( transparent_limit ) ( shielded_limit ) ( memo )\n" + "\nMerge multiple UTXOs and notes into a single UTXO or note. Coinbase UTXOs are ignored; use `z_shieldcoinbase`" + "\nto combine those into a single note." + "\n\nThis is an asynchronous operation, and UTXOs selected for merging will be locked. If there is an error, they" + "\nare unlocked. The RPC call `listlockunspent` can be used to return a list of locked UTXOs." + "\n\nThe number of UTXOs and notes selected for merging can be limited by the caller. If the transparent limit" + "\nparameter is set to zero, the -mempooltxinputlimit option will determine the number of UTXOs. Any limit is" + "\nconstrained by the consensus rule defining a maximum transaction size of " + + strprintf("%d bytes.", MAX_TX_SIZE) + + HelpRequiringPassphrase() + "\n" + "\nArguments:\n" + "1. fromaddresses (string, required) A JSON array with addresses.\n" + " The following special strings are accepted inside the array:\n" + " - \"*\": Merge both UTXOs and notes from all addresses belonging to the wallet.\n" + " - \"ANY_TADDR\": Merge UTXOs from all t-addrs belonging to the wallet.\n" + " - \"ANY_ZADDR\": Merge notes from all z-addrs belonging to the wallet.\n" + " If a special string is given, any given addresses of that type will be ignored.\n" + " [\n" + " \"address\" (string) Can be a t-addr or a z-addr\n" + " ,...\n" + " ]\n" + "2. \"toaddress\" (string, required) The t-addr or z-addr to send the funds to.\n" + "3. fee (numeric, optional, default=" + + strprintf("%s", FormatMoney(MERGE_TO_ADDRESS_OPERATION_DEFAULT_MINERS_FEE)) + ") The fee amount to attach to this transaction.\n" + "4. transparent_limit (numeric, optional, default=" + + strprintf("%d", MERGE_TO_ADDRESS_DEFAULT_TRANSPARENT_LIMIT) + ") Limit on the maximum number of UTXOs to merge. Set to 0 to use node option -mempooltxinputlimit.\n" + "4. shielded_limit (numeric, optional, default=" + + strprintf("%d", MERGE_TO_ADDRESS_DEFAULT_SHIELDED_LIMIT) + ") Limit on the maximum number of notes to merge. Set to 0 to merge as many as will fit in the transaction.\n" + "5. \"memo\" (string, optional) Encoded as hex. When toaddress is a z-addr, this will be stored in the memo field of the new note.\n" + "\nResult:\n" + "{\n" + " \"remainingUTXOs\": xxx (numeric) Number of UTXOs still available for merging.\n" + " \"remainingTransparentValue\": xxx (numeric) Value of UTXOs still available for merging.\n" + " \"remainingNotes\": xxx (numeric) Number of notes still available for merging.\n" + " \"remainingShieldedValue\": xxx (numeric) Value of notes still available for merging.\n" + " \"mergingUTXOs\": xxx (numeric) Number of UTXOs being merged.\n" + " \"mergingTransparentValue\": xxx (numeric) Value of UTXOs being merged.\n" + " \"mergingNotes\": xxx (numeric) Number of notes being merged.\n" + " \"mergingShieldedValue\": xxx (numeric) Value of notes being merged.\n" + " \"opid\": xxx (string) An operationid to pass to z_getoperationstatus to get the result of the operation.\n" + "}\n" + "\nExamples:\n" + + HelpExampleCli("z_mergetoaddress", "'[\"t1M72Sfpbz1BPpXFHz9m3CdqATR44Jvaydd\"]' ztfaW34Gj9FrnGUEf833ywDVL62NWXBM81u6EQnM6VR45eYnXhwztecW1SjxA7JrmAXKJhxhj3vDNEpVCQoSvVoSpmbhtjf") + + HelpExampleRpc("z_mergetoaddress", "[\"t1M72Sfpbz1BPpXFHz9m3CdqATR44Jvaydd\"], \"ztfaW34Gj9FrnGUEf833ywDVL62NWXBM81u6EQnM6VR45eYnXhwztecW1SjxA7JrmAXKJhxhj3vDNEpVCQoSvVoSpmbhtjf\"") + ); + + LOCK2(cs_main, pwalletMain->cs_wallet); + + bool useAny = false; + bool useAnyUTXO = false; + bool useAnyNote = false; + std::set taddrs = {}; + std::set zaddrs = {}; + + UniValue addresses = params[0].get_array(); + if (addresses.size()==0) + throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, fromaddresses array is empty."); + + // Keep track of addresses to spot duplicates + std::set setAddress; + + // Sources + for (const UniValue& o : addresses.getValues()) { + if (!o.isStr()) + throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, expected string"); + + std::string address = o.get_str(); + if (address == "*") { + useAny = true; + } else if (address == "ANY_TADDR") { + useAnyUTXO = true; + } else if (address == "ANY_ZADDR") { + useAnyNote = true; + } else { + CBitcoinAddress taddr(address); + if (taddr.IsValid()) { + // Ignore any listed t-addrs if we are using all of them + if (!(useAny || useAnyUTXO)) { + taddrs.insert(taddr); + } + } else { + try { + CZCPaymentAddress zaddr(address); + // Ignore listed z-addrs if we are using all of them + if (!(useAny || useAnyNote)) { + zaddrs.insert(zaddr.Get()); + } + } catch (const std::runtime_error&) { + throw JSONRPCError( + RPC_INVALID_PARAMETER, + string("Invalid parameter, unknown address format: ") + address); + } + } + } + + if (setAddress.count(address)) + throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid parameter, duplicated address: ") + address); + setAddress.insert(address); + } + + // Validate the destination address + auto destaddress = params[1].get_str(); + bool isToZaddr = false; + CBitcoinAddress taddr(destaddress); + if (!taddr.IsValid()) { + try { + CZCPaymentAddress zaddr(destaddress); + zaddr.Get(); + isToZaddr = true; + } catch (const std::runtime_error&) { + throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid parameter, unknown address format: ") + destaddress ); + } + } + + // Convert fee from currency format to zatoshis + CAmount nFee = SHIELD_COINBASE_DEFAULT_MINERS_FEE; + if (params.size() > 2) { + if (params[2].get_real() == 0.0) { + nFee = 0; + } else { + nFee = AmountFromValue( params[2] ); + } + } + + int nUTXOLimit = MERGE_TO_ADDRESS_DEFAULT_TRANSPARENT_LIMIT; + if (params.size() > 3) { + nUTXOLimit = params[3].get_int(); + if (nUTXOLimit < 0) { + throw JSONRPCError(RPC_INVALID_PARAMETER, "Limit on maximum number of UTXOs cannot be negative"); + } + } + + int nNoteLimit = MERGE_TO_ADDRESS_DEFAULT_SHIELDED_LIMIT; + if (params.size() > 4) { + nNoteLimit = params[4].get_int(); + if (nNoteLimit < 0) { + throw JSONRPCError(RPC_INVALID_PARAMETER, "Limit on maximum number of notes cannot be negative"); + } + } + + std::string memo; + if (params.size() > 5) { + memo = params[5].get_str(); + if (!isToZaddr) { + throw JSONRPCError(RPC_INVALID_PARAMETER, "Memo can not be used with a taddr. It can only be used with a zaddr."); + } else if (!IsHex(memo)) { + throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, expected memo data in hexadecimal format."); + } + if (memo.length() > ZC_MEMO_SIZE*2) { + throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Invalid parameter, size of memo is larger than maximum allowed %d", ZC_MEMO_SIZE )); + } + } + + MergeToAddressRecipient recipient(destaddress, memo); + + // Prepare to get UTXOs and notes + std::vector utxoInputs; + std::vector noteInputs; + CAmount mergedUTXOValue = 0; + CAmount mergedNoteValue = 0; + CAmount remainingUTXOValue = 0; + CAmount remainingNoteValue = 0; + size_t utxoCounter = 0; + size_t noteCounter = 0; + bool maxedOutUTXOsFlag = false; + bool maxedOutNotesFlag = false; + size_t mempoolLimit = (nUTXOLimit != 0) ? nUTXOLimit : (size_t)GetArg("-mempooltxinputlimit", 0); + + size_t estimatedTxSize = 200; // tx overhead + wiggle room + if (isToZaddr) { + estimatedTxSize += JOINSPLIT_SIZE; + } + + if (useAny || useAnyUTXO || taddrs.size() > 0) { + // Get available utxos + vector vecOutputs; + pwalletMain->AvailableCoins(vecOutputs, true, NULL, false, false); + + // Find unspent utxos and update estimated size + for (const COutput& out : vecOutputs) { + if (!out.fSpendable) { + continue; + } + + CTxDestination address; + if (!ExtractDestination(out.tx->vout[out.i].scriptPubKey, address)) { + continue; + } + // If taddr is not wildcard "*", filter utxos + if (taddrs.size() > 0 && !taddrs.count(address)) { + continue; + } + + utxoCounter++; + CAmount nValue = out.tx->vout[out.i].nValue; + + if (!maxedOutUTXOsFlag) { + CBitcoinAddress ba(address); + size_t increase = (ba.IsScript()) ? CTXIN_SPEND_P2SH_SIZE : CTXIN_SPEND_DUST_SIZE; + if (estimatedTxSize + increase >= MAX_TX_SIZE || + (mempoolLimit > 0 && utxoCounter > mempoolLimit)) + { + maxedOutUTXOsFlag = true; + } else { + estimatedTxSize += increase; + COutPoint utxo(out.tx->GetHash(), out.i); + utxoInputs.emplace_back(utxo, nValue); + mergedUTXOValue += nValue; + } + } + + if (maxedOutUTXOsFlag) { + remainingUTXOValue += nValue; + } + } + } + + if (useAny || useAnyNote || zaddrs.size() > 0) { + // Get available notes + std::vector entries; + pwalletMain->GetFilteredNotes(entries, zaddrs); + + // Find unspent notes and update estimated size + for (CNotePlaintextEntry& entry : entries) { + noteCounter++; + CAmount nValue = entry.plaintext.value; + + if (!maxedOutNotesFlag) { + // If we haven't added any notes yet and the merge is to a + // z-address, we have already accounted for the first JoinSplit. + size_t increase = (noteInputs.empty() && !isToZaddr) || (noteInputs.size() % 2 == 0) ? JOINSPLIT_SIZE : 0; + if (estimatedTxSize + increase >= MAX_TX_SIZE || + (nNoteLimit > 0 && noteCounter > nNoteLimit)) + { + maxedOutNotesFlag = true; + } else { + estimatedTxSize += increase; + SpendingKey zkey; + pwalletMain->GetSpendingKey(entry.address, zkey); + noteInputs.emplace_back(entry.jsop, entry.plaintext.note(entry.address), nValue, zkey); + mergedNoteValue += nValue; + } + } + + if (maxedOutNotesFlag) { + remainingNoteValue += nValue; + } + } + } + + size_t numUtxos = utxoInputs.size(); + size_t numNotes = noteInputs.size(); + + if (numUtxos == 0 && numNotes == 0) { + throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, "Could not find any funds to merge."); + } + + // Sanity check: Don't do anything if: + // - We only have one from address + // - It's equal to toaddress + // - The address only contains a single UTXO or note + if (setAddress.size() == 1 && setAddress.count(destaddress) && (numUtxos + numNotes) == 1) { + throw JSONRPCError(RPC_INVALID_PARAMETER, "Destination address is also the only source address, and all its funds are already merged."); + } + + CAmount mergedValue = mergedUTXOValue + mergedNoteValue; + if (mergedValue < nFee) { + throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, + strprintf("Insufficient funds, have %s, which is less than miners fee %s", + FormatMoney(mergedValue), FormatMoney(nFee))); + } + + // Check that the user specified fee is sane (if too high, it can result in error -25 absurd fee) + CAmount netAmount = mergedValue - nFee; + if (nFee > netAmount) { + throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Fee %s is greater than the net amount to be shielded %s", FormatMoney(nFee), FormatMoney(netAmount))); + } + + // Keep record of parameters in context object + UniValue contextInfo(UniValue::VOBJ); + contextInfo.push_back(Pair("fromaddresses", params[0])); + contextInfo.push_back(Pair("toaddress", params[1])); + contextInfo.push_back(Pair("fee", ValueFromAmount(nFee))); + + // Contextual transaction we will build on + CMutableTransaction contextualTx = CreateNewContextualCMutableTransaction( + Params().GetConsensus(), + chainActive.Height() + 1); + bool isShielded = numNotes > 0 || isToZaddr; + if (contextualTx.nVersion == 1 && isShielded) { + contextualTx.nVersion = 2; // Tx format should support vjoinsplit + } + + // Create operation and add to global queue + std::shared_ptr q = getAsyncRPCQueue(); + std::shared_ptr operation( + new AsyncRPCOperation_mergetoaddress(contextualTx, utxoInputs, noteInputs, recipient, nFee, contextInfo) ); + q->addOperation(operation); + AsyncRPCOperationId operationId = operation->getId(); + + // Return continuation information + UniValue o(UniValue::VOBJ); + o.push_back(Pair("remainingUTXOs", utxoCounter - numUtxos)); + o.push_back(Pair("remainingTransparentValue", ValueFromAmount(remainingUTXOValue))); + o.push_back(Pair("remainingNotes", noteCounter - numNotes)); + o.push_back(Pair("remainingShieldedValue", ValueFromAmount(remainingNoteValue))); + o.push_back(Pair("mergingUTXOs", numUtxos)); + o.push_back(Pair("mergingTransparentValue", ValueFromAmount(mergedUTXOValue))); + o.push_back(Pair("mergingNotes", numNotes)); + o.push_back(Pair("mergingShieldedValue", ValueFromAmount(mergedNoteValue))); + o.push_back(Pair("opid", operationId)); + return o; +} + + UniValue z_listoperationids(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) From 553a5c1ab2e766feabaa6c8f5b8adb8ab1277de1 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 18 Jan 2018 22:01:13 +0000 Subject: [PATCH 0516/1062] Gate z_mergetoaddress as an experimental feature --- qa/rpc-tests/wallet_mergetoaddress.py | 4 ++-- src/init.cpp | 2 ++ src/wallet/rpcwallet.cpp | 11 +++++++++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/qa/rpc-tests/wallet_mergetoaddress.py b/qa/rpc-tests/wallet_mergetoaddress.py index e573d78bd..fe7d5893e 100755 --- a/qa/rpc-tests/wallet_mergetoaddress.py +++ b/qa/rpc-tests/wallet_mergetoaddress.py @@ -19,11 +19,11 @@ class WalletMergeToAddressTest (BitcoinTestFramework): initialize_chain_clean(self.options.tmpdir, 4) def setup_network(self, split=False): - args = ['-debug=zrpcunsafe'] + args = ['-debug=zrpcunsafe', '-experimentalfeatures', '-zmergetoaddress'] self.nodes = [] self.nodes.append(start_node(0, self.options.tmpdir, args)) self.nodes.append(start_node(1, self.options.tmpdir, args)) - args2 = ['-debug=zrpcunsafe', '-mempooltxinputlimit=7'] + args2 = ['-debug=zrpcunsafe', '-experimentalfeatures', '-zmergetoaddress', '-mempooltxinputlimit=7'] self.nodes.append(start_node(2, self.options.tmpdir, args2)) connect_nodes_bi(self.nodes,0,1) connect_nodes_bi(self.nodes,1,2) diff --git a/src/init.cpp b/src/init.cpp index 16306c011..dd10025dc 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -793,6 +793,8 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) } else if (mapArgs.count("-paymentdisclosure")) { return InitError(_("Payment disclosure requires -experimentalfeatures.")); + } else if (mapArgs.count("-zmergetoaddress")) { + return InitError(_("RPC method z_mergetoaddress requires -experimentalfeatures.")); } } diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 4478d5307..d5769aad3 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -3759,9 +3759,16 @@ UniValue z_mergetoaddress(const UniValue& params, bool fHelp) if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; + auto fEnableMergeToAddress = fExperimentalMode && GetBoolArg("-zmergetoaddress", false); + std::string strDisabledMsg = ""; + if (!fEnableMergeToAddress) { + strDisabledMsg = "\nWARNING: z_mergetoaddress is DISABLED but can be enabled as an experimental feature.\n"; + } + if (fHelp || params.size() < 2 || params.size() > 6) throw runtime_error( "z_mergetoaddress [\"fromaddress\", ... ] \"toaddress\" ( fee ) ( transparent_limit ) ( shielded_limit ) ( memo )\n" + + strDisabledMsg + "\nMerge multiple UTXOs and notes into a single UTXO or note. Coinbase UTXOs are ignored; use `z_shieldcoinbase`" "\nto combine those into a single note." "\n\nThis is an asynchronous operation, and UTXOs selected for merging will be locked. If there is an error, they" @@ -3807,6 +3814,10 @@ UniValue z_mergetoaddress(const UniValue& params, bool fHelp) + HelpExampleRpc("z_mergetoaddress", "[\"t1M72Sfpbz1BPpXFHz9m3CdqATR44Jvaydd\"], \"ztfaW34Gj9FrnGUEf833ywDVL62NWXBM81u6EQnM6VR45eYnXhwztecW1SjxA7JrmAXKJhxhj3vDNEpVCQoSvVoSpmbhtjf\"") ); + if (!fEnableMergeToAddress) { + throw JSONRPCError(RPC_WALLET_ERROR, "Error: z_mergetoaddress is disabled."); + } + LOCK2(cs_main, pwalletMain->cs_wallet); bool useAny = false; From 2bda6a9b22a58a232f6bb2ddd2cb45c08c4ebbb6 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 20 Feb 2018 15:46:49 +0000 Subject: [PATCH 0517/1062] Add z_mergetoaddress to release notes --- doc/release-notes.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/doc/release-notes.md b/doc/release-notes.md index 7355bcfc6..451a6f96d 100644 --- a/doc/release-notes.md +++ b/doc/release-notes.md @@ -4,6 +4,23 @@ release-notes at release time) Notable changes =============== +UTXO and note merging +--------------------- + +In order to simplify the process of combining many small UTXOs and notes into a +few larger ones, a new RPC method `z_mergetoaddress` has been added. It merges +funds from t-addresses, z-addresses, or both, and sends them to a single +t-address or z-address. + +Unlike most other RPC methods, `z_mergetoaddress` operates over a particular +quantity of UTXOs and notes, instead of a particular amount of ZEC. By default, +it will merge 50 UTXOs and 10 notes at a time; these limits can be adjusted with +the parameters `transparent_limit` and `shielded_limit`. + +`z_mergetoaddress` also returns the number of UTXOs and notes remaining in the +given addresses, which can be used to automate the merging process (for example, +merging until the number of UTXOs falls below some value). + UTXO memory accounting ---------------------- From 4c3d2b3bbe05941e27ad1bc3bb8a29d8d7283a65 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 22 Feb 2018 13:44:40 +0000 Subject: [PATCH 0518/1062] Check upgrade status in wallet_overwintertx RPC test --- qa/rpc-tests/wallet_overwintertx.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/qa/rpc-tests/wallet_overwintertx.py b/qa/rpc-tests/wallet_overwintertx.py index 91bdb7764..bad99a528 100755 --- a/qa/rpc-tests/wallet_overwintertx.py +++ b/qa/rpc-tests/wallet_overwintertx.py @@ -38,8 +38,10 @@ class WalletOverwinterTxTest (BitcoinTestFramework): # # Currently at block 198. The next block to be mined 199 is a Sprout block # - assert_equal(self.nodes[0].getblockchaininfo()['consensus']['chaintip'], '00000000') - assert_equal(self.nodes[0].getblockchaininfo()['consensus']['nextblock'], '00000000') + bci = self.nodes[0].getblockchaininfo() + assert_equal(bci['consensus']['chaintip'], '00000000') + assert_equal(bci['consensus']['nextblock'], '00000000') + assert_equal(bci['upgrades']['5ba81b19']['status'], 'pending') taddr0 = self.nodes[0].getnewaddress() taddr2 = self.nodes[2].getnewaddress() @@ -79,8 +81,10 @@ class WalletOverwinterTxTest (BitcoinTestFramework): # # Currently at block 199. The next block to be mined 200 is an Overwinter block # - assert_equal(self.nodes[0].getblockchaininfo()['consensus']['chaintip'], '00000000') - assert_equal(self.nodes[0].getblockchaininfo()['consensus']['nextblock'], '5ba81b19') + bci = self.nodes[0].getblockchaininfo() + assert_equal(bci['consensus']['chaintip'], '00000000') + assert_equal(bci['consensus']['nextblock'], '5ba81b19') + assert_equal(bci['upgrades']['5ba81b19']['status'], 'pending') # Send taddr to taddr tsendamount = Decimal('4.56') @@ -97,8 +101,10 @@ class WalletOverwinterTxTest (BitcoinTestFramework): self.sync_all() self.nodes[0].generate(1) self.sync_all() - assert_equal(self.nodes[0].getblockchaininfo()['consensus']['chaintip'], '5ba81b19') - assert_equal(self.nodes[0].getblockchaininfo()['consensus']['nextblock'], '5ba81b19') + bci = self.nodes[0].getblockchaininfo() + assert_equal(bci['consensus']['chaintip'], '5ba81b19') + assert_equal(bci['consensus']['nextblock'], '5ba81b19') + assert_equal(bci['upgrades']['5ba81b19']['status'], 'active') # Verify balance assert_equal(self.nodes[3].getbalance(), tsendamount) From 50a90615af196d89f11da6e13527d323e1c03fe1 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 22 Feb 2018 14:01:43 +0000 Subject: [PATCH 0519/1062] Document that consensus.chaintip != consensus.nextblock just before an upgrade --- src/rpcblockchain.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 32f3f0fee..626c4724f 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -696,6 +696,8 @@ UniValue getblockchaininfo(const UniValue& params, bool fHelp) throw runtime_error( "getblockchaininfo\n" "Returns an object containing various state info regarding block chain processing.\n" + "\nNote that when the chain tip is at the last block before a network upgrade activation,\n" + "consensus.chaintip != consensus.nextblock.\n" "\nResult:\n" "{\n" " \"chain\": \"xxxx\", (string) current network name as defined in BIP70 (main, test, regtest)\n" @@ -721,10 +723,10 @@ UniValue getblockchaininfo(const UniValue& params, bool fHelp) " ],\n" " \"upgrades\": { (object) status of network upgrades\n" " \"xxxx\" : { (string) branch ID of the upgrade\n" - " \"name\": \"xxxx\", (string) name of upgrade\n" + " \"name\": \"xxxx\", (string) name of upgrade\n" " \"activationheight\": xxxxxx, (numeric) block height of activation\n" - " \"status\": \"xxxx\", (string) status of upgrade\n" - " \"info\": \"xxxx\", (string) additional information about upgrade\n" + " \"status\": \"xxxx\", (string) status of upgrade\n" + " \"info\": \"xxxx\", (string) additional information about upgrade\n" " }, ...\n" " },\n" " \"consensus\": { (object) branch IDs of the current and upcoming consensus rules\n" From e6cd2a835646663b8d36d8f492d4076604bedc17 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 21 Feb 2018 19:59:10 -0800 Subject: [PATCH 0520/1062] Closes #2964. z_sendmany once again makes v1 tx for taddr to taddr. In accordance with the Zcash protocol spec. --- qa/rpc-tests/wallet_overwintertx.py | 60 +++++++++++++++-------- src/wallet/asyncrpcoperation_sendmany.cpp | 1 - src/wallet/rpcwallet.cpp | 6 +-- 3 files changed, 43 insertions(+), 24 deletions(-) diff --git a/qa/rpc-tests/wallet_overwintertx.py b/qa/rpc-tests/wallet_overwintertx.py index bad99a528..176e8693e 100755 --- a/qa/rpc-tests/wallet_overwintertx.py +++ b/qa/rpc-tests/wallet_overwintertx.py @@ -33,8 +33,13 @@ class WalletOverwinterTxTest (BitcoinTestFramework): self.sync_all() # Node 0 has reward from blocks 1 to 98 which are spendable. - # - # Sprout + taddr0 = self.nodes[0].getnewaddress() + taddr1 = self.nodes[1].getnewaddress() + taddr2 = self.nodes[2].getnewaddress() + zaddr2 = self.nodes[2].z_getnewaddress() + taddr3 = self.nodes[3].getnewaddress() + zaddr3 = self.nodes[3].z_getnewaddress() + # # Currently at block 198. The next block to be mined 199 is a Sprout block # @@ -43,17 +48,18 @@ class WalletOverwinterTxTest (BitcoinTestFramework): assert_equal(bci['consensus']['nextblock'], '00000000') assert_equal(bci['upgrades']['5ba81b19']['status'], 'pending') - taddr0 = self.nodes[0].getnewaddress() - taddr2 = self.nodes[2].getnewaddress() - zaddr2 = self.nodes[2].z_getnewaddress() - taddr3 = self.nodes[3].getnewaddress() - zaddr3 = self.nodes[3].z_getnewaddress() - - # Send taddr to taddr - tsendamount = Decimal('1.23') + # Node 0 sends transparent funds to Node 2 + tsendamount = Decimal('1.0') txid_transparent = self.nodes[0].sendtoaddress(taddr2, tsendamount) + self.sync_all() - # Send one coinbase utxo of value 10.0 less a fee of 0.00010000, with no change. + # Node 2 sends the zero-confirmation transparent funds to Node 1 using z_sendmany + recipients = [] + recipients.append({"address":taddr1, "amount": Decimal('0.5')}) + myopid = self.nodes[2].z_sendmany(taddr2, recipients, 0) + txid_zsendmany = wait_and_assert_operationid_status(self.nodes[2], myopid) + + # Node 0 shields to Node 2, a coinbase utxo of value 10.0 less fee 0.00010000 zsendamount = Decimal('10.0') - Decimal('0.0001') recipients = [] recipients.append({"address":zaddr2, "amount": zsendamount}) @@ -65,19 +71,21 @@ class WalletOverwinterTxTest (BitcoinTestFramework): self.sync_all() # Verify balance - assert_equal(self.nodes[2].getbalance(), tsendamount) + assert_equal(self.nodes[1].z_getbalance(taddr1), Decimal('0.5')) + assert_equal(self.nodes[2].getbalance(), Decimal('0.4999')) assert_equal(self.nodes[2].z_getbalance(zaddr2), zsendamount) - # Verify transaction version is 1 or 2 (intended for Sprout) + # Verify transaction versions are 1 or 2 (intended for Sprout) result = self.nodes[0].getrawtransaction(txid_transparent, 1) assert_equal(result["version"], 1) assert_equal(result["overwintered"], False) + result = self.nodes[0].getrawtransaction(txid_zsendmany, 1) + assert_equal(result["version"], 1) + assert_equal(result["overwintered"], False) result = self.nodes[0].getrawtransaction(txid_shielded, 1) assert_equal(result["version"], 2) assert_equal(result["overwintered"], False) - # - # Overwinter # # Currently at block 199. The next block to be mined 200 is an Overwinter block # @@ -86,12 +94,19 @@ class WalletOverwinterTxTest (BitcoinTestFramework): assert_equal(bci['consensus']['nextblock'], '5ba81b19') assert_equal(bci['upgrades']['5ba81b19']['status'], 'pending') - # Send taddr to taddr - tsendamount = Decimal('4.56') + # Node 0 sends transparent funds to Node 3 + tsendamount = Decimal('1.0') txid_transparent = self.nodes[0].sendtoaddress(taddr3, tsendamount) + self.sync_all() - # Send one coinbase utxo of value 20.0 less a fee of 0.00010000, with no change. - zsendamount = Decimal('20.0') - Decimal('0.0001') + # Node 3 sends the zero-confirmation transparent funds to Node 1 using z_sendmany + recipients = [] + recipients.append({"address":taddr1, "amount": Decimal('0.5')}) + myopid = self.nodes[3].z_sendmany(taddr3, recipients, 0) + txid_zsendmany = wait_and_assert_operationid_status(self.nodes[3], myopid) + + # Node 0 shields to Node 3, a coinbase utxo of value 10.0 less fee 0.00010000 + zsendamount = Decimal('10.0') - Decimal('0.0001') recipients = [] recipients.append({"address":zaddr3, "amount": zsendamount}) myopid = self.nodes[0].z_sendmany(taddr0, recipients) @@ -107,7 +122,8 @@ class WalletOverwinterTxTest (BitcoinTestFramework): assert_equal(bci['upgrades']['5ba81b19']['status'], 'active') # Verify balance - assert_equal(self.nodes[3].getbalance(), tsendamount) + assert_equal(self.nodes[1].z_getbalance(taddr1), Decimal('1.0')) + assert_equal(self.nodes[3].getbalance(), Decimal('0.4999')) assert_equal(self.nodes[3].z_getbalance(zaddr3), zsendamount) # Verify transaction version is 3 (intended for Overwinter) @@ -115,6 +131,10 @@ class WalletOverwinterTxTest (BitcoinTestFramework): assert_equal(result["version"], 3) assert_equal(result["overwintered"], True) assert_equal(result["versiongroupid"], "03c48270") + result = self.nodes[0].getrawtransaction(txid_zsendmany, 1) + assert_equal(result["version"], 3) + assert_equal(result["overwintered"], True) + assert_equal(result["versiongroupid"], "03c48270") result = self.nodes[0].getrawtransaction(txid_shielded, 1) assert_equal(result["version"], 3) assert_equal(result["overwintered"], True) diff --git a/src/wallet/asyncrpcoperation_sendmany.cpp b/src/wallet/asyncrpcoperation_sendmany.cpp index b69bef0de..d4d76b5b0 100644 --- a/src/wallet/asyncrpcoperation_sendmany.cpp +++ b/src/wallet/asyncrpcoperation_sendmany.cpp @@ -60,7 +60,6 @@ AsyncRPCOperation_sendmany::AsyncRPCOperation_sendmany( UniValue contextInfo) : tx_(contextualTx), fromaddress_(fromAddress), t_outputs_(tOutputs), z_outputs_(zOutputs), mindepth_(minDepth), fee_(fee), contextinfo_(contextInfo) { - assert(contextualTx.nVersion >= 2); // transaction format version must support vjoinsplit assert(fee_ >= 0); if (minDepth < 0) { diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 3e63c3689..b7a30e626 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -3533,9 +3533,9 @@ UniValue z_sendmany(const UniValue& params, bool fHelp) UniValue contextInfo = o; // Contextual transaction we will build on - CMutableTransaction contextualTx = CreateNewContextualCMutableTransaction( - Params().GetConsensus(), chainActive.Height() + 1); - if (contextualTx.nVersion == 1) { + CMutableTransaction contextualTx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), chainActive.Height() + 1); + bool isShielded = !fromTaddr || zaddrRecipients.size() > 0; + if (contextualTx.nVersion == 1 && isShielded) { contextualTx.nVersion = 2; // Tx format should support vjoinsplits } From 07f94352ad5990eba243eac8c4351b5b31458423 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 20 Feb 2018 22:36:39 -0800 Subject: [PATCH 0521/1062] Closes #2954 and #2959. Fixes Overwinter issues in sighash_tests. --- src/test/sighash_tests.cpp | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/test/sighash_tests.cpp b/src/test/sighash_tests.cpp index f591b80c7..c5a6ba1d4 100644 --- a/src/test/sighash_tests.cpp +++ b/src/test/sighash_tests.cpp @@ -16,6 +16,7 @@ #include "sodium.h" #include +#include #include @@ -93,27 +94,26 @@ void static RandomScript(CScript &script) { script << oplist[insecure_rand() % (sizeof(oplist)/sizeof(oplist[0]))]; } +// Overwinter tx version numbers are selected randomly from current version range. +// http://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution +// https://stackoverflow.com/a/19728404 +std::random_device rd; +std::mt19937 rng(rd()); +std::uniform_int_distribution version_dist(CTransaction::OVERWINTER_MIN_CURRENT_VERSION, + CTransaction::OVERWINTER_MAX_CURRENT_VERSION); + void static RandomTransaction(CMutableTransaction &tx, bool fSingle, uint32_t consensusBranchId) { tx.fOverwintered = insecure_rand() % 2; if (tx.fOverwintered) { - // Versions outside known ranges throw an exception during parsing - auto range = - CTransaction::OVERWINTER_MAX_CURRENT_VERSION - CTransaction::OVERWINTER_MIN_CURRENT_VERSION; - if (range > 0) { - tx.nVersion = - (insecure_rand() % range) + - CTransaction::OVERWINTER_MIN_CURRENT_VERSION; - } else { - tx.nVersion = CTransaction::OVERWINTER_MIN_CURRENT_VERSION; - } + tx.nVersion = version_dist(rng); tx.nVersionGroupId = OVERWINTER_VERSION_GROUP_ID; + tx.nExpiryHeight = (insecure_rand() % 2) ? insecure_rand() : 0; } else { tx.nVersion = insecure_rand() & 0x7FFFFFFF; } tx.vin.clear(); tx.vout.clear(); tx.nLockTime = (insecure_rand() % 2) ? insecure_rand() : 0; - tx.nExpiryHeight = (insecure_rand() % 2) ? insecure_rand() : 0; int ins = (insecure_rand() % 4) + 1; int outs = fSingle ? ins : (insecure_rand() % 4) + 1; int joinsplits = (insecure_rand() % 4); @@ -259,7 +259,11 @@ BOOST_AUTO_TEST_CASE(sighash_from_data) CValidationState state; if (tx.fOverwintered) { - if (tx.nVersion == 3 && tx.nExpiryHeight > TX_EXPIRY_HEIGHT_THRESHOLD) { + // Note that OVERWINTER_MIN_CURRENT_VERSION and OVERWINTER_MAX_CURRENT_VERSION + // are checked in IsStandardTx(), not in CheckTransactionWithoutProofVerification() + if (tx.nVersion < OVERWINTER_MIN_TX_VERSION || + tx.nExpiryHeight >= TX_EXPIRY_HEIGHT_THRESHOLD) + { // Transaction must be invalid BOOST_CHECK_MESSAGE(!CheckTransactionWithoutProofVerification(tx, state), strTest); BOOST_CHECK(!state.IsValid()); @@ -267,7 +271,7 @@ BOOST_AUTO_TEST_CASE(sighash_from_data) BOOST_CHECK_MESSAGE(CheckTransactionWithoutProofVerification(tx, state), strTest); BOOST_CHECK(state.IsValid()); } - } else if (tx.nVersion < OVERWINTER_MIN_TX_VERSION) { + } else if (tx.nVersion < SPROUT_MIN_TX_VERSION) { // Transaction must be invalid BOOST_CHECK_MESSAGE(!CheckTransactionWithoutProofVerification(tx, state), strTest); BOOST_CHECK(!state.IsValid()); From 713b366231b519285267786aa74357c17fb2048d Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Thu, 22 Feb 2018 12:32:00 +0000 Subject: [PATCH 0522/1062] Regenerate sighash tests --- src/test/data/sighash.json | 1000 ++++++++++++++++++------------------ 1 file changed, 500 insertions(+), 500 deletions(-) diff --git a/src/test/data/sighash.json b/src/test/data/sighash.json index acd465363..72d59a870 100644 --- a/src/test/data/sighash.json +++ b/src/test/data/sighash.json @@ -1,503 +1,503 @@ [ ["raw_transaction, script, input_index, hashType, branchId, signature_hash (result)"], - ["5e02545602a42e82af3fd8936275b73a1b2e95b16efcb885f5b23e70dcd6ae44f5f564d8e6010000000151ffffffff05686834c6d7110c545e68226396524c4c8dfad397ed0f67e42eb2b1bbf24c8000000000050063655200ffffffff0294362d02000000000763655363635165275ee7040000000006636a516a536300000000030000000000000000fb03fb0100000000d3b160aaef2635faa7b3122e98e83903491b33132ea78b17e9757eb729a38565f5c6048f3fca2da6cc07e8b32f5465eb8997b56bffe8175093b6178cd863c2752cb863cb796c49b31a09be62f4210047fdfff15d3766cc68f9ebc950e09b67d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b28ed6bb34bf780cb3b811d182a5bd0c75e6678164ce7449eae980663567f0689be4ba11fa60f11dc139aabc314fa8de020614b413841cae936c18fbcc3616c9199b6c6074a84b7033556ad9c5f801efd7db1197e56226f7259106f6d6731b7b05d1bc112b28d810767346370413f61d79f2f1dc53b3c6ee2275aed7a7f3c6f0300a76add3e9b3a684e73982e9d5230f2fff8ff17bbe49030d18393e21f40ce3002224ddac9caf554d35c425499dc5e23255a7b9e0b4fc2bb044038f0518ab34e670b00a1901a5039ab77320daae1699be7ef86c4c8d66c0e207e4887002c2192da5fa2972556b99721923ef1e1f5a2a2a85da869a646757cf6ab5d3ca855853315690301a1eeec8dc008229563e0e47d369702171063b2381a8db3e4370aec393ac51703090a0f9d36ee799553de8ea8b1094306c7a283fe0af5dbc3cf006421ccc7d6a4031ad4e2e1823aea86ef158466dd96623834fad58a14da1eee0700876fdc1a10c202215205453c17e709eac475dca2402d938257bb04deb5bb5603526b2586beb3d3032c49e1878ef86d85e8c105643b00ec62f8485af91401043ef23ce98fd30cb3eba35446f2ed41b5e0d78ef956d6846054df74d2093fb45458fc992a5745a6d875c72effbbefc2598e9677ad5b1ebac30c0085f1a0134e3a8ab7d56031239319a712c2814bae373e1b3eb2efbdd7607291b03de6069603cc6b394eeb4d8b86a170b6fd2b988df634a6fae0baf87cdaca2fae899f698df301cc05e262df4e83771eb03949137ce255642ef450e113398d3a5e467396de418bc3403c853e22131ba475d9a61afe21c0dad09268ccd1cc07e0c0a57b6a2fd86fd8b4aa2ec875bfbf9a5fbd1e5f4fa39312b78f303bafe070df2b0a7edcd4bef2ab9bf168e635d03ee81d8bfae91d5c283c78aafb32362f1437deadaf56aef9ec2e98ed3a86affc19b787e70eb5a7524e6379b511e04d16ecd037131de224a9a60c976eddce024094204a4d19a10c56fdb227f944b905a3a6d03faecf73d04e37e7817fc4391ce635935cdd168d204e4d8e72af0ef5a3fcf27461c6c8331d8352ad29e0355078bbf6cc51588fa2d2b4d637a4cd1d92de2465beb6c1f60135f46de6777a6c190ae304fe7b2560c73350d0120f65c473920938e6a00514307e543fcc3c2905ab566a795a53035953ef914bacd850cd6200b447545685db289fe4f5536f0b0da00d1120b0acae4ad611a4074dc48c77d24106b6dbcb0bce96bf4e17455367d07a219c8b4c607cfe9c3ef0e9f14cce217f15d7f8a7dd256848dbeebc2028bc79a917cb64c1abfa8c576ff8c4036faa280f5c82c4d91c8b40129f52e8f7597e47827947a29ffb83d1740be4700d5c2aa1fe69ffb6681800e87b30e7b51b638e77a10ea70f5711037c2449245790142cc0cc59e1bb61f33ce1a818305851e878da7a953ae0c4cfc58635a00e8e6b0b049b10be7a38a23d396c2a0a68bf3671fb8bce8ba1a91306edc83addda1ea8fcffea92264900a3d11c0579160012373c274f43c4d5796b53fac8eea2d75f68bdbc673217ad643cb717e016204deb946bf9e9cdf4c5c88b6f88fc546eda8a8d5e1cebbb5cc0bdd2928254d2af481be9421f85b51a31b42d63a286c5e15a7b67a6541078baca5f30106352134eaeab8f79b8f9d7fbba7da5776ba0b124bab500c06f21507bbb71ffd435e50ddc2a6f79bfb49ab95ae06231ea9029354b628a4e7b0629053a84827de842a98b4eba9ea71b07839da5eb3a376307dcff613047837d79d175e5f90179329a7e3459213e211e341b20fea7289ac8cf37ac58fe6285df5cf44c1ffb2fcc67dbf04ea32cddee1daeeec57a624b92aab6177896fdfc3bfa6b1605bcfd0da63a1797619e55a7322ebd9613e0d2a86c5efbdf31b645b96e568e3dcc6df1ff6393843ac713e974278eb196adebc2b743bcb931273ebd5c8fce626deffb2eaccda7ad47d8db91ce3efbd88baf738616286c24bf85d641120f93c8851fa67ee1238db7b9819851f66258bb416453fd62a936314766e1193b28b34010df3725d7fda1d8203cfc6f86f9692e5f8fd3ec94d1cea15f6a583ad83b4c1fb4634015fa1df412e381543d257dbd63ba201f18a7cb1a96121778d0dcf7c4209c48cefd3b26e564db4dfa2c5cc2fa9092cfb8e1189bab2f11fff63a438ac4da0a8f6e4065a9d03178c923fec76ee46696d03329c6ee80a2d97b5e1901cd0d82f0fc447978fb0f1ced8cd9e4c3fe415339939ff340de71aa9aade485085720703014dccd00b3174fdab7fa010000000000000000000000007ce00bbb07e5b60d2ee577ec384b4254cef5d425884b81635df16280d2f9b6aaa6d73c505dbcb08ef2127523ecbc480316a0f802349d1d3be330673f4f5accb5b7998c809fc85a90b76b418920e01b80020d79c78c6d5187a1559c60eae1958a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a921807fe33586fb63c519c2688e90da7f1b7f6a8596afdcf969b0d8e63317e82611b5aa25d6481531831c95107c4c3c05b27c0714ea26465811529f420ab024e601c54355b743395e43bdf04e84d86b1f6b6471969a0d44aebdf096c2d03d53a062feafcfab469d5b0c00fa517643268443add1abfc11e9796219de30f3d9b7031b6d8b5296f09c5299a2c69233f5de31879b944a6197d9b333650b65abe881e103226be708b7b2515804f43d43cc4c45afffe84b9b6d55bda0022769f63f4dd5110a03e9332dd41941b23f81fcb65ba0d5ff783b0a76c2d8fc4645f37126ae6092aa47bebdbcd27142558da38a3bd2ce67f2e417e3e46b484197ade40b5cdabf278d0303eca8be15879936c43709534c6f2aa253d7b455865764c95fa94e903db23f9a0302a2fe2029523efdd366834231bf54ed6ed9ef12341ab9244383d898e52d9f66032bb09927ec9b6006a13230cab1eb258bdaa7cecdfe06730e808c6f482ea9e0b7022605f3255c79b05e2c15e05b0651637533c01b7e6e83a55a0b4453ea0547677b0217dd34c4f0d6af990e6b274a1736d02d18908a747e531f86b393bdbfc620c1a23065608ffd29ad1287429ddb43f7a07f10f83ab9111f34ca2e9b963d6283b7e6b58dd072d35b83d982fdb5edf40a348f721d1c6fa12fd8a15bd031b67772c59c3a2de9ad6a453aeecbacff13380fda027d76a47e668db158a3310261d101cfac7ab678fe064004c8ec8796443c69f5fab401c281529e5a9fa36d130352f27cc3c75323202e47158f81867e54a573d0d9e8a88eab0f07302ff80dfd7b22af273e15b4845dd77261ac19b755f7cc3453a3957ccbe70e794ad30f638a8fc72015d39db50362132933d409ae1241350a875bdb48e8f474a34321c63fde94477f4055288f69228b2c2fadb91b4aaa3cdd28b134877487ee086f285b5b55c6a950567d4402fd2650ec0a92dcca505aef33216f03bee0cdcded10b0e68f299cdfdbda997a6fb279bdf271260b9c3bb74c288814ad2fa4add4e97980f7d81d59f66baa47ba78334ba96f001998a23301308602286c45f0605b34da60585823738e485da9cd7c513b23680438207bee824ffd8b67874a8caf8952f9491193ac0e879139b84c4f927d2d193a7d97efea788bbcd10a8f9e6919ad0009aebfb025ea8d2d5195f8d17cc4e6f7efa2f03be692a2142fe8094aa5bbc48e21130fa1da243025c14806d87f65e1f1d5ada0d563a818747669ad75f9f94b83205a9c8b3f1889997dab69ebd7e872658d9d76156db1888e14d7526620a93fdb5134ac764ed74cc2a27103589c153203016c30eb7402b43ae139df5fdb63d8ee1b29e774f81be2828a46c07e0d4443966802959ee66c0c2e21983047c8f919ad1d359856f93d25a1734ed89e92b58dff8c064ece4261e25558f63972bbc5c15efd9d558a6ea8b4eaeae37e9e5ef6686a058fc0020100f040f0be9450b1b4a9a250c954a854e49fb424f2596256507cddcb8579371b06a0c893e70a663e22c3afe65d185cf503e899f7d85259bc4a14f44964e00392f929034db8a5fb4385784217730c60edb7588f9054454c9c158f6de3d7bc12ec45ffd101285835f0a07f15782e95ac8357ba3258c0e04d1a5560e8571e293dba40b55438d11395303e64c0b160a36a62458db598e6ead56d7743785790b25e8c8c55a2cb911e7727a5d506abbf7a8fe8fb66d59e169d95f32bfe5d6be558a6111e349ad4eda17d35e71bfac80b663e30ae5d1c7f6ef87496c70e16ebcc64272ffe26ed04ab97b3c4d338fb1b7d69b33a835af54fab029b77c383f4a0aa530d397e5d5b856d7b7d6da12eddb6887d48bef4f9d4134b692d0b861f12f579f91ff508a4d010fc012a7f926a345831278ea185f2fe8897f2a592102018ab61aca9c0bc8b90c350e8d2ec91c072774e97a3adf45f84bd207d49a55f5e1cab64e6cdf9bbddb762f2e5cc2155d5fc59e61ebeacb1911ba2fa238e4fba6c90c78738d42518b03cb064de43cb88cc14b845b4613a72ccc0417a9aa1f2968dca04d966b07e8b04d62e9e7d5b7d4bc72beca54d29e98d06004a5333f29c42c3e775ddf551267003617117ff60bbd190252e6c597217d44ff7304c88f76e6840ab9eb744c56214b8865af80547a7c0654c1a4eb3ce9dc1338d2f6a54a4bb4e451a62e6ca39c85aa8a1f0edc1257495bd01c63a467de93b218f0aa9079a38e1c9b8c7e480ff79fc1f8cafc7dd120b12258c2379708d1a24e0f902e366b3b2e1298a3a2d4ab0b4f291432466aeba000000000000000070e86204000000009c3cfaf1a3e3b46eb277891852e89f29d05193958131e648dff7798a59a72666a567b5b02bef7ed7f05b726f7c053f4168ce4cf89fe7d4d8b8fcd3e14ffe8da5fb03c281823de6190451902fec685b1469ddc4dcaaf1de4978bcac78ebfa492f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004fcf01b894237e0d38fe8d1c3cc9eae05f1675288a49078fa103ce191b442829a169a303da551e70d3b545dbdf12dbf30f3804108690a346628d48c571f3328f815b5948361b21218a4d5e91277d421d7e182fe6bd21c1e6a253d36f8ca25452e8da6ad405a6afb5c2b5e0bc8f36cc71dddf3572c47330a9ad3be3c36983509e0325ec7c0697356382ebd46b43606c961d97e3140ea32e08f44e98169a56e09acd022fec03ba9a310a5088f235458942261b38fa0e53ff65c8754f11796042e4b3ff0b0141eeb3e2e9b6a24cfbbf720faa7f36f5eb80f0deb2a4180c6f6ae9175134e32aa02ccfd79a632312ebadd799144f7835d15123ecbab5e2b37d842ececcdfe80308b5e853cd10f5a97edaed9cdaff245d756eb183e38a4f1e318b194d452dd3e503067307e9a97ef8be76baafcd2f3716b3f89b9d92ce6f125dc949b40a5628cf1e0322a81be11c681ce9b8ea0aa2ce247a0289193774259666c461991ea7ff7aed6402285a0772321937f77c1d33da5dd106472dff9d3b0feb8f03f48534f2b4b01b530214207b750eb01caed15c500735ce6e74661b80acbc60706965a8904a924233d2a33129f019f713ac86f2d983a26c9e6d0e8ec1015b007751b68779d54f09a1dc59f7b7bf98d7a47be8362596ccdc58fc24e1e5822e3dfc59f23ff22279d63b147aae0ad982a68a29f2727352f77c6018371b99d30c7f8f3836aadd490e7aad7e72d3c88e652a9c3520cbdd034f4bac2be4d161104ba9cc162debe31e78e80d6170f33383b484f5aa353c1a3661590ce2147dacda7cdb0920952e108848949f15f516c7c4fd5a29c75ac566efc0661402a7d81b531f5f5f84ff5d07e683ae71d4d9057ec2a80d75c8bf0ccfa1ce2fbc9816fbfb579415653a8a431a25c43715e64c8140e4a6e5804363e33c9bbbf6a7abcd9cfd4f3f08bbc0b3cdf7f851282139ca5bfc4a0c0c49a194e6b4240dc775f276dd84de5269edfdfe542d90dab73df88fa6bbcde1dac6e5aa686def12c3a2e0121df9c2a952003d094e2a75e0344a0f573f31867596043a98bf9e2b5498960f5fb6155f581c8481247922dc8877983a19db13cbb9170887948cc568bf7e6de4043a14710093a7f63481c1a4ebe5647d482762945b140e88d61cc0dba67f65c1b545690fee1c4cc88d3b9d782d0abe6283cc087e76361e235687a964f796bff1db9645309ba86a67cee09be34385c16294061f529db5f811567e2f7cb12d6020e8858499ad26f128336dee84704bf2e475bec2303ec2c794289142c35aae2b64f9e966790be70b0070fa69bcdab086a2cf89147710da80196e88fc13a9ac597151038479d7ea11c43cdc6da8417bfa23db4e6ac18bc64014e8e534d2470aacdbde2d74402a2ed4f4aa0bf640ef19a0558afad11cb928c7df60b4ed1e92af1d493dfc18d9f7d00e6cf15bddace4474094108d412ca87feba748b5a513fb10bc5a9bc2138863ec1d74f7924491e8fbae12a604989841590542c11304770f1ecd074df657327c351ef43202ad6a4180bb6f666ffb38ac81cb371108bf28adb6c52ba850d1913ba0cb2e534659ee6a21e24e542866ec08b966510020dbd9ac42d6a28bfe6cb745d391df59f07f72653a087a56612de5aa5896d1429fc3d939d52a40c601985ff4dfbd9112ac6f07d4f6fd201e6c1b85f87c630b8faafde884deabc5aac3661498fda080d219ca9b90e4c2c3692eae13552988a00122316782d2b22866f6213484ce46bc4327a02371d8b7b14b7cb2015ac0e21d3bafd60015a70444a6c167aaa735d0e2c51f84eabc1ee150d8dd17730a530325e65fc6563cfa6f9150098365ce7df399a8192bfa24cb98932f1531f8e27406a7132f6fadd4e121b70376d71b35701738ea2825e681b688528dd28ed888174320016dde9527ccf11d2656407fe6a0126651bcd93991f5857c7d4e7841825aaea7b3384586af5ac08f7f65e628a9a6c6d69695d2021e510ac16816a6ef03d0bb26fba75175554b9162f921b57d4b947efddf85d44863ebe0b665ae25b5a10f5eb00c9ce60da99b3b7c1b96bfbbfda3c906bdf80ca641413b4c6d2279161ec043e6cc4252d46b35c71880ea89935b76121f5b1b86f1c0c14b1bd9544ef96a245c13a3c35eeb48c0d9f4a41b9a8ac8c2862176bad611c15684b36cc195e19e44d7f11e8ef87ce6ed28036add3f1ff0ee2c8a216af64c67205c9a47939e134650d5aaeff067d0b4882492ad582410b3686925623ce11db4ea980f3b42fc71f70d82d367927a8c9d8b8b96fdeab1e892041df82f408220f4497eb1269d36221a28bb90af5fb2648d521cecdf9da5e3550801cfc9f2e00c3d6cb29547f155b7a4402fc6608f7f49a72f26f69e79b54f54585510583217287d6f93876690261be557e24c25f3ceaeb6adcab6970c", "5351ac006a", 1, -247645006, 0, "8794648044a3bac0a71b8737bed22f19e699568139dd27314054c260a3dcfa66"], - ["879d372d036967a0ffd4918ff17aa3bb42e4714b29b995f946c13fd1c37b735abb7fe87b080000000006006a5300525263cbcc6b89e85625570526100c5fa8923fc33c8d8c9d00faa17a7c475ccee261f220382c010000000852526a6563655353ffffffff1970b089387d0d032d939401b8b99f4261072ec65c124f5ef3a923b9130c532f0100000009516a6300656353526affffffff017f9e0d00000000000753ac0000635100f46b9ee4020000000000000000b7231c03000000001e820b299eaaa5a849806fa8cd61a3fbf1f26a3f74d55adb4db131671da6bbfa511b024f38f783419d63bdac7b2211a4063127965ca76a8d2892e89ddf744b19e263a39c8a6b7eae84edece224b0347a8be75c284e909748c60a06b25467552e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000059a6fbc4a10352a91184c1ecfe2e274a64de5f0bacc21756ad863962b8509297df16ad82cbb737cd80cfcf993727b91539f27a205c1ac859e27c0668ca2b42bd4a37f00b35853e84cad3433d9df0bf61a51f0e48588dffcbc01b91690494ed342ae21d1e0141eebd06fac4e875ecc5c9bd4a65f5f5df80e28d0ee6e649bc5bfe022c995ce0e929f99ae7e13551a75e79899f6576c2fae1383e1c60abbcbd0d33b10318d44aed6a0e707f0591ec24d660bc060d95b29e16d59190bc51e0f136dae5230a06581c365d77e084c03fb0114e72c7edded26fbfe1dbd38f03f7a170fa91f07698491efadc886f0c59d0c76faf74b89a0277f3df18ec83b33a5cd975c162db8f0315d0d0b934485fbba614f46bcc77335bcd69a43b678f8fb7b9679f677794a358030b8dc6fdfd174d991d8e6edc02423847006106f9694dbca8c7e1ac30dde89c890305b7e0adade0e530dae3c91c15936947732c5a6a79914f7405156e31f5ef735e030b44f5d4fa009fcced4cce5163ceb74145298d42326f670f287708ab9b797fa10230525eef2590e3fe28ad0182b3ea0d19334388e3bcd41f372c654ac52fe9c3a89dbd9ad688f41c0fe1cdca5cc9dc391415de804651ff50cfafbe8b8383e6d006a90eabc7c893a242177a27f4d365305ed64c8f8a0a5145b866713ceb91acb1b05551d7179c036d0b96084610dbc292a0f5ab55174fade5ef51d87e32daaaddbd8d335ab5400b69da78869d05a6bd490b9d5cea0b216937bd768db024d8fce52bc34faba9890b489836021596c7a8211fdf8609e5d19cc0a08420821f7c449f4c9fa85ab0dc7655aa396d5f0b20d62479c5177013beb56393a86e0e9df02959091f3ad7dd48c6345c7a5cdf1e404d9f6664d70988f292335fca0daced24f78c815860d065e9cf3a79989cbd80355ab8687a950ee2008eb7c94669ac98c53d88637a1c6f6b67e6dd6606eca487b79f562f66111a0d7f5eb953f727b9a85c8bff63a2f5ede403763fcd72e0a2aa6cb0ef56e8ae7d3f61df683e38b76956a75998aab82f908c2a25a438aa703e6b4756cfa94cad34de03ef6c7fa87e16425d53f350f87764f861212e549e0b5e3b3d4a66d17069410d3f44bf222a6fa475b35f4c55cf0389fd9e5d60904715c889514fca82d75cf2eaef1980c12c84f431cd2fa28be53c10b9db59fe821fa970ace9b9f737b8567d2fc603adb671c9004ada53de23c7de612ad4ea789041f53f890e421026333e830c4893ef91e9e855e28ca8c5e4b288e051405c86c79f860a06bec8dd8d57c997b96322fe0ecefa5c499e6bd61554466bd998e6d64e54d5ec9c9816be71952bfb09b9d2bbac61a0687d242e7570e816061529d07dc1c320fb534ff4cdbbec858f5520701b101429cabb8105e33eec79bcc82a8c5cb077adf11e19fae736341fe3dd0c771e88939da0b6ced5316ee8ecf9ea509b81ba325f3458d9391fdd048d34cb8446f15082f45cb0e0004da002b73fb16eef70981efc36706e09c5446794ac6e7cde22fabc7a72b6f00231778f905bc3dbbe700914d073116807b09dfc87b2cd3e5fd4b200249fad95db90c548cf97d2613f0d6940e9fdf11f37c3cffdd319f168f4c26b9d13fc45930fbee831a86d68cf2a4be8c2fcd13783d23d3a79d9b1486b33262b544dfbddee41a0bc734ed0b70f7a5240f4b536619d5ff87afb8cff22d09051b9e43eba16b35657ac0fe345a87d31b0330851fc0d29055cb0177e6ad4ff409078bf1d54978e884bab3de195ab9e0a36ea58bad2b355b16978f2b3747ee52c827b4933cc8d6a38e748c4e6814edbc06660fd9544fae70e1ab731a7b014197f281838fbd84ec441251b9bb8bb4623e7f8f273708c2442fd6d2e88d3c1d919f5e4f19f02e24288ede5125ae968591239585ee7e9b2f39198f62b953f8596b4d312145f543ccb5d4fa1fa945e51c7e59a4daf9dc7e5ad8b37936ef5cb0abce4f367db60fd774e658f5176daa24931f4c40f63e0e3d7945bd316ca4d1e6c789ba2de66ec29272479c2e4e0201dbe37278e4caf187ebb2019601f2026104ebf1c68ee400be9195b2576d66fd57573aee0485ee5a73cdc3d0e617a77677d2a497a7ab96ce158dbcf93c183b8dc356ffe3681c4508379279e4f9e20d1847a7db5da5b250d1aa437a1c40ffdf24a5fbc23e549ce582fe75f8bff187ae2faf55e916285c1249a137decea2830057477686fbc22c107ca9235fa4d2202fbef34cc8066fedaff17b9b7b84312df35ca71603eac5231fccebbf83e7f7407c76ef2416c4c010000000000000000000000002df80b4375f5ad04e55fef9009bfe9438dcf9c810c0a9758a633d8c9c63fb4d5fd1c49e795317128142b39168e5a1d4fe350e1f4c300eff44b610f8a521ad8a639df8f3c52e04dd54409ad04b6a3b03b54968847192f0e8d1ec30ad18fe7d66f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a646caa8594b36f166516ff6d9e9edcb7ecb89a8aa972069c395509ab09c29b817b9e25451fb22a8079367cb9cc12d270786260119a41adc30085bfe08018b3e324d2d1ff9e9064abdbb13721948f2e570ba9f7e2d168e8b67801819a0f0cad44851db6d49075866f7585d85add1b2e2aaf968016f0384a14eacf3d82503faa20327ce89f2f8ab7da4c0ec2863ebf159c01f0fcf833fa1d7fd60ecbf7019f056730216a1cca98e769bd3f929e5d9a425700c9eb86dd4afef2f80a2c328e41e406d490a08d26f5fa5f27521ff0bc50b1245273f43b929ec0e93e694403e9f89ada51975b1d5d940227b534f52d5cbc1b9bada1b8fd38ae7e3251855c83a85ce5abbb58b0217ef6a9120aa9e4881e8e58985039890caa414fe2bd5f82ae89e71d0032656470316c5fcf17cefc284a2258cc13c1be7379562e9836760a5f491a86ac6f69d9d19032107b8b9560d961cc2950de24dd9cf82d44157c1731595f33091fb1e860cd6770210282c512c1a1c98f4cacb842e6300c872ab00fad4b3b8bab260d81e9bcb35b5022e3548e46cbd0c5fbb90082ee2153982cdc5d9be6463dec0e60d4fe4541c864f72c1df53050051026495750beafcf926d9f9ed13ab76dfc6c90f6716ce17dedd8898a987915c9dfe6443ec462c43a2a459db376bd67b2a40e133248775f58f9abd7ed1bf183da2a5ccda903d941870816ee5aeb762e0ab8f3e9ad771dab9f87571e666cb36d903a8ee922b73d4670f58807104ffaa668b3b6f374ff2eab24facdffb2233891bff18292803c10c244294e50b0e66a871d2e434efd5d24b2be7bf725a6013d78876b4a6d59465c77b9f58a94987ba05583bef26a8e984588fa6f9fca73be391010ee254b90524c83e0ff013dcec6a0d7dd96cc5be5cc718f2f4fb4cc60aeb8edd9dbf3e22bb622bfc0bcc8264c5879959be6348a57e1e76cfaf2239627f428d19ef9bd8f165d7a4bbe0c7eef1aacc43ebf543a90dcc60737c42f4bf98832b1695efcf717a3017edd05a678ebecbe5f146487a785b053c8f2ad3c3871365ce3fc23b360e2112bbf7172a055bce852d63b6622439d1092b6e280a7b8c1fc746492a11565a9cd9219e5a8dd3232ea49eb1b215ce0a962db418bc748c1d745bcbedd6ebbb7ffd5140d02bdbed28a788f1086a3e518131fca4d5a942a9fb37ea7af0c4e5b0f501e4d60b0ba8bbcca7cc9ff066763f9c005fb2fca40d9af3a99c99039988d597e3e22b5862964713413383ae5272ea6816c77784b146e4dafd8189fb11c6cc68aa17146c54736f7734808f2421522d162802f90d50829becf84d78fdea582efdfcd6540ffccbc4f413ea2e30f31d90cc195740df0649d42204f722cbac9b320b648ae7777a75e9e3f54f43288b32c7b6b62d846a7dde323997965feedd8f57ecbf545ce8ceeeba702d3b658475dbd029381a9ccf3d8b2dd4c5e1b374523ee1f83424095de396f369c20a0d8aa9cd1613de585fc3cc652150b351f618de28ee3b15574c741239fd1bf9ee80b5ed1d62565dfc65955e0209d9553f89e98f4cc09cb4baacbde92428c848cc7f315fcc205576695001a58cb3412c97171d2e9961ec5f41aedeb712c595f4b2875da538e433fc04dd88f96ac5c6ea63a8549bb81833b643e2579b0aaa5365e31cc94d48385a0a87ed65dcfa2dc3482d81a2c62f55f8422f54b4ee14132946758168c62513cf554fc3816dac0ac4d874accdba84e52c2acb3e2377713b228a731013dc7dbd8ef1abbedf25db915d65534ad544275525b15c16b675dd9229c4e4e5aa7d644eff369673be50e6592fa53b06c1a5fd94c85729539f15f3d68174394d20720bb5a47c847e7a51faeb5f7bb345f297174b15ccd0bd66b708a38811e9f8cb1d74f2ee19bcb13c81ad782738a424dd8d5b1231fa2f5b511fd4a812f3b1c8ff726d91b874c2caff3f2ac7081eb27dc367644904efc5b41376659dfb85b60283e2ab484ee17ed2d1b70852a42bd5623a8fd899503cf12aea4e019798c13c1ffcee49abf8800b4bdb6273880ed19806751cf25aeb29499fb1f517aca3bcfbf8bd812c0d3c193da19c9b0ca7e8305ea7fec23e8502409b20dfefbfe91ed5745029d3e8dc026dbcd41e77f275c167e3a0caf3f5832e66ef4519a4b93d161a7520b70e431a1da02d158d8d9a7af823a9ad609f1da413c79f72cd3ac5a175c27014c385168f6615bc882119311517e866f9f8928d75113dbe59ab3385c44f6b7fbf02de68bded2052bc62dec0b54f88a28a12aae61df08f1cae664488c51670c8bff0acd6e0bc1318361f83bec59ddc7303706181272123511e74b4b2ea00e8458043f353c062562e9f6dc12e2288c1323794bedc4b4814da161f6aa160c9548683a0aba591f0f2c6c032ed87c21dcfc01ec74cd8c5f94272a09202825c1b0f", "", 1, -651329052, 0, "7fbafa5c295fa6c2973b68404e79745dc676b25a57f840b08d0597efacefed02"], - ["5c8a4a4703afd155ebf7d993eddaa9cb3be7b717e5745c309bf833a45bb719243a8cc9dd55030000000035bb644afd5a012540ea4a6cffe39a7114f8351dd333b823bf10fb3932ac40222688cfb201000000015129f3b5ad2f4ef96e012120188e3bc347046be91b9e8f1903ba950336fb79e2e1fcd441f70300000004636a53653309b4d7021a78cd04000000000665516a516353edff990100000000095200ac65656563515357890a3c00", "5153ac53", 2, 370578855, 0, "8546e9ba4f9b02b6f56bee694139ed6b0f356b4b35f4729b34ed255965f97f4a"], - ["30394b4b014f930132b407d2487af11070d1ec8b5c162d6610e045364fd4ee312cbdad628c0000000007636365ac516300ffffffff010e032100000000000500acac6a510ffad1dc0200000000000000009db2c30300000000c0329e9bb9fd76ab1e21beb3049c87b0e2af93964daad013a227699d84301872467f037bad776be5b4b5a42fe1b7b9b224e14653fcc151e07170d4e2e3da00350594ffa6f4049bcf71d36a8a77cdb08905520f71090cd061702246c7fd403bbe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018957946bb936b410dd6d27c6da516d01a164deaefa6c86a6b5ee670f8445c84c14fa3a2f001480657b70ccdd0ed3e782bad6704b53c8b4694d7a65190b2e753cfaf59d7ffaee01c03e0c03cd597508a1986bf5416c38fbe0876ffbd64fd0c44e8a7c68215d232dad44ad351e00390f8484b2041ee077d5da540840724c50bbb022ac57fce7ac068b78570912668a44fe3129e965e5a41b754ac38ee6b547a44040217b5c22b15f76f1e6b0c63f72248c8b972d69d2d5bfd1c565ac65a44687b44b30a04d416adaca8a2a182f4dc038f5d6c29b46ef894f422e2d8585503005cfe283e8c6600a27d824ebae2701a9245719921d04fb591d2b34256fcd9244c2508f8cb03169f6557a2722dc0228588b39b5d0d484b63e1daf37c9931e734375fc1a07160032cf7e2cc9f8dcebf4e908323796d7444a77488bb27a45d7d58383ec7ab4f68150205926c1b50e8184fa2ee9b255cfc6f19ec662a542fdc43e9c42c59b8d1806ed402036514cc980c2dfd351c36ba9a58eb17520f7903e91a47fc40d8d9ddb2420f6503238d5608f9d75483a82da8e10653bcb7a747e3a5b81669eb39fae08592f9a82c27b75852c130068c057cd1526b68b0098ab22629afc049761d7078541cfb897470a9904673109b2856bb09a05c9c224c02784ccd66b79a6d62f53450d714295a2f38cb6885e5f73c6c5dcbb8a4f6727d7b86cf8caea047be90143502d6313db995b32af802e7481e5b5f7dcd0e6e4a5406df58c9450cf852f5999e04d63311f736d0e13feaf495e52ad16007686e93f7d1bb0298c4c4f2eba6a4a039ba905128c2d566406d9390c8aed5ceaf174df85bc6290e67e88c055267091a4eb1c2e74e5734685e62d1c70e9ce1c6a6943cd07e9a2daee41348698f72bf38a26ae9e5063325ca0b6b1655846850fb925c3505a3dd1f68e873cb85254b7acd18fa8b95b3e173b604eb0cb807d19680ce521534ca1340d1b576a6dcf444a7cb090b6104de11905c29442675ffb7aed35f7a1513d9948502968de19e22b749ea933b4dd4ef70d1d3cd13e77466fd659452dd2931f92e8d2665363576eae45509c4a60e52b5a1dbb99a87ef99eb1884de6a6c6751a199e05c001b512f356317b4c8f31af2a24511242f01ebadb40a60a21bdc63e565305206e4c7bbec733e65e7d913dd440c9a9017f02f704cea9512a26bbb32068ebd1ad5bbf78fac6fb76b05da6cd952425759df8dde335e977cc3fab143eaf91900ba007510a796d28cf8a4f378a25277de99113b8a40e75b524e1a1a28cdf8550a034c2c4b005371367d2df6b309036f9b26207e0a2aa5311340f51f556d1198f921e2e70d71ba37ecd09e180232599202731ef4f6e9d9ee2b27d510e828e131b4e61af20f97386e6e3a98d32274f2506843c3fd09db397ac204e5c280a21ee8959743b4b9779b21f3b797d68d2ffe80f5c46f9a8eebcb5f4abbf29a5596448a73f6fc6fdc6b7c76a0b76f110517883bc1b2ebdbc0e034b21e078c321c583d79c2da30c711744a6fd576a126053140288ebe6f50b024d72e2564e5d93b1f3a867d91cef8706dab43e4af9990ce4a91b60987e9f9785e4f1be21627ae4ea1fa605a90dec4d434b4b6332c87071243be60505f9d5ab1ae03d5a04979674b6cff6c5ecba086c5f5345442d4e9dc3abccd5809ff39ca1c3ce11997492e0a3f55318a2b2245d76cd956795d9fa51f34669c23a477032673517342e711c5f53138dd1a979b8503a90d659314caa4890e9747a77614ad5b9c2e805155a6da6b105dc741cba8e3e6d1c61f3e2115a45f709f1d5461402ced771a03485c32daac172c764225a025ec301d1613902b8d817fd6a5fa84ebad48f46bd915dd08a779a11a8e37656bdc26d0d0351d9d329df7d5b3afb5ae3c0a5e891a473d6caf1da1b612256e88fb9424e099944fadcc9bc601803cf49e2e2866afa854d26fdd90c54767e210c91a26aae930f62944db3d7e0f41f3544f30c4928c49adbbd7eb8cf17b4afff74bf077351fd83692931bda373ece3aaa051ddf1337e91c4b5cb91c99f8db99fca72cbcc3691560aa4851c6db43cdc583dd940f6046989ebbb1ce8078461dd033acdfa920babe848984f8405d8eaf6a35425c3afea2fd8004690bdc10c23bd3b3431d6e3dd828f4dca05cc1ed0194715674d9749395249acf2389ac8f4c8c8ada5bfea4d531faf03c37780271a4e1feaf3db24863b1d45437f43267ce3abac84479047be6b598a805a13f46fb50a362d2009ef8d86c3dc442350d0c47bc11ab35e44300000000000000002c2eaf0500000000d069e46241458632889419066001a1b5c3a6896f262ba0c376153ec8398628759bc2d9048ce0de8cf8ce39ae03fbe3f29a0a527e4b0e7c178203f024d0b496ebd0888961ff757dc435e4eadb187e48962641d32365986ebc5eacbf90a27ca32e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005bac891e19f05c6454ac75eb4928a6c78a82f54762e3e7f0ef1c402fcf5a0bec3dd59282caaecbffdd521396acc7f96feacbdcdb455d244829efd696c7a3b758823e97276b21f102f0507a42aaa0635c03a3713211c2377f412ee697919fa27d111c17d0f84c449042c048ef8b32e0835b263e77bed90ca012ae39d6c7147ff80327b4ca4efb2da9a3b73e6843236673b5d74fc94567104ae36516475da98e8b3e0327f533a04798d6bf5a01f2b51010b01b3faceb1ba2816dc03ec7bbe9fb42dbb70a055ba4b276a699d7f5b6656d5b2c34f99c202e8f8f878010902af43704083c983f4239f40a2c8a70ca5893c00d5ec1de4c278f417f5aa5872a6b2a8fb4c6b96d0212cbd6e2a1469b7339110544c03bcf1b6b0303ec0152e1c141ee3997d08dc164022e4aecde5caa9f0e281855eeb03f872a33bf2baddd36390eed6e1997054cb1a5030b3b1f8c2f6b938cd16e988e0daaa9b494caf9de1c40cdaf562f287b92a4d74302092078193ec7c633373d4ab524d08c48f12fc902f133217c6e1def7ee080dc460215251e130f43fc45b1c35e6d97f4edc44ac9103761da21f2773e467af2a166fdcabdd6e2804f992ff05ea8549358c4b19f24bfa7988957903b7d42eed50d9fac149248f19303afa85de9936127b91c04290ab2a7eca90d86d83f1bc1c1ac3fb8f34cb48cbe986b93185940b249846ab91b1dfbe2c453c1579aa02b4c08ba99e6d48de8e42399756531ea040d85531678600b775b4fe3d6d86c91abbba76f816ea80a21ba402fff0c8feacdd2812ac1e364fd6d9636836d073e9e8a04336c49b41349a2324efae2a54547f93e06736ffe7ddd90512575bf3352e9915ab6e679cf63665342905ab6b9cd255b55570ad3c0867d58a10338a0ca85b4ee7036326b5c472e842394612547847fce895269218a7cad734ba2cd5294ace4b36865d5d89caf6053fc23812413acd11cf367504e6ea7bad94d8b481b5ba7b78ab0757114b230516e11c16d452f12d0696c5a3e2047d6c04c445517151609d7ee47d8a9d53572c590802b43223658deb9b51bc118b1a52647e94b88120f4f5b275d94c1e8811872a74f7b423863e540d387255042d2afb265bd78a1d7bdf79525e8275fd916cb74b3aa65a0ea2c79ba3ea7278a6a61671bb8ae73fcd044cf47e3ba8e27b368dea5abe8bae460d1baacad0592777aa0e7c160665bbd2a6dd8c57c651336e5a5baa685ed6f91ee11617be29906e7247c94e74f6877d4bc66886ebf6fc23d41c336c1c95e1e4b16c6c9bfd65883562d382f2169be273c6b7e204b2afe98cc008159029e7b181d818ed360b8d0c2925b54406e09a0a8c8d26871d2eea1a7d7cc697b0f56310871a1952b8fd97670dfa415b9992aae3001cb234604453cd3f8a5d97f98aed4033bedb64ef99f70f5bb86eeb72e941e49a24183c19507b17455bc63b5de3b7f06f36c3829744f2a55efd475916a8670c969abd040f0093bd7a4adc5311bd310bb959156ddc205731a214a6e536ddf52eb29753d84f1834080b2a4ca326d8902c95f5f77c80a124efa77177ab01d2baed457a8d9352a4979ac4dec6eba0a70cc4e8d19d25bdc4370dc4355845da278a1af6ba3ce6cc2a9fbff490d1c938a8f76908929f0fe2dbe30b30c7db586d653f042eac4bce40c362cdaaf791622163d23a0cf0da0a0478f8216d15fd2745fb002e9c8ce8b0360fba8f6ee340c93515f64f64cc9724247cea1f03fb9324065a1d61905fb6ff4c447ecc2edebd98398bfad84a23af97eec475d583a0bb9f05fade952c238d88195e495c71e991246fa9d082d46788b706ef4e537700b86e24e711e04d72e1293746d986eb5c9a14938b82364087a37d51827100e3cee59fd20efbaf6fced296b9713ae7824e5ff3b65f937ed4c6ca7c669400fda4eaefb2c1f08e263e1cb4b76842ee56773b47f5c80e2b408099caaa6fc32e2895422b9ea5f45abace0f805e320309139f2f9632258188fea8a2fa5b02923644e1361660f0eb8a0f608eab629c6a3d9691232a67349660733181ee2979204b410c42b910278610bca8c6d00b98eb537dc8be401244cc6a9c6b565e00d18e46882b168fa86170479a2ae0e194124b3422cff3b2c914dc3ffe611fe0315a69c6f6bacca081bab89156f6f849e9e4df7e87a5180dc0d48a58c7fc3c23ea732699934270b27c7df9a5e74cc4083e1e69e3dd38e9d61e81aba63498811065ceb322713bfca810facbaf54ccac30b6d79cb98daf6c0d61a6fd662c725737ca8d678eac2b8f19712397f177aca139b9b10288b6100ed51a3879a19441806ea24d818e9189023e14fa95b8917b49171230ab6eb34ee7f5a93488c523ea2b2c4a45ea508b663969762f9642f6ae44c8e48d30c06c20fbb96afefb32ce7bde6faaa158a6ad8b44b212006", "5252acacac51515251", 0, 1895062455, 1537743641, "78ff9b55dd6ee54e3228547d0ca3af8c723076a2c4e660fe2f3f2d5c62a2dcd7"], - ["242f575a033c3419ccac6c2d98880cac588703f6e8e61e26f7699b39c598b25a342faf490101000000056a0051516528dc363754289bb8c7b5f0878eae3d86feadd06109def53af4447a2afa12533188dc290302000000036aac00ffffffff07a28aad858147f1e7a7421899cd8a861a9e004f289511140a3c8135d3c392a7020000000953ac6563535153ac65ffffffff021c01da040000000002ac526c2da2050000000006ac006a6563510000000002e5f9b7040000000000000000000000006014172ae6d0a8e994e6911682c3e3af5aad74805f0f5fb854f6effa30d9b4a22a71bf93148cefc484956ad8f092a167bcf67eabdfc2d3db741cebd4c3c157db3798bdf692b759d6e3cce2f34203f1f5d83bcf15d52742286aec1aefef539cbb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026e989aaf43d46dd519a8c27053812b663bb412d53ee1ad35e1485248af03487802227b9e4745d3b0d49fde640228be5fb8b285d8a95211b1a46522e40f3ff3644bbdc3697e10e0bbb1997915dd2483697ac903d2a07674d3485fc365ed63e747c71cb8266f9e4704abeeeccf9c8e066b5938bc069c9ff68eb95510256d0a8ec022a13278105b979c4dc15377d024f1d64a2f4829bb2ec88d08b1512d4a10864ff0320c96feac16327a5ac0e1402c2da8f1a6448cb7ddf2c01b2d41a33f1b705554b0b00681305d7abc6063286a6e1bee9432104884ca8ed6fdb87eb884ac1aad396aafdf2a33b0970eca3fb20050bb82b7100ae378d33858153593b2dd040b7ae4dd00307d15b21e7189aa0590763a5168aedcf245c01496dceb446544f7fef27acb06d02000baa869fd63eadcc0498e6c9818bfdc9af777b3f9ee272b2526e5ebdd2d4ba022069ede1d79c50c18090379ca105d0a78f41063a95121d9d0c0879583c4799210305657e90aefe39975716a4e7007915ea9e27f69e985eeeb8eab2206fa5fe9be9020b6c4458b012c3410c9e0c88565b5181a1476205e0982d9ab668c648d71f4601d9cd05692ea781a919c2a9e22bb1dca02f01fb0e49775b63e9af644a3ef73c2da0a1158672669ab80aef5e80af6e13eeda45ced6e2f7e7a37c63ddc21ee58f7c2e64752ea11b1f5669121fe21bb51c1e4cb5c7f64fddef96275f8f9cec1f4e0dc40e4ebcd864edf6273cf5433e1c5a573824a7835e47100a4e128c7c5dc16e711d31a90acb05f160b55ab927898288eba8500e758078b8f062139c3b8009cdb83d70ca2a5df348e6fa7dbe07e8d1aee11c929e090bc4a0170c7a5bf3b661eb947873db5cecf3c6361ef93f46a0de23c6fd6d6c1dc69da544d7183aac4d1d7f844f778b5ebc198a1eca7fe82b4fc46fcae20cf64db7463d70a31d52a0317b56f8a9cbfd88b628b3f4e85d311cc1013c3d9c909d0db3742d5cc7339eec76d24b6b780396f1edd9ae6b72dd1102b1c9ca221360ecc6fe9ce54e355ce271e183585efb6f3de15554d3e512dd6e07675b2d2ee5dabbfccb91680d8f103a8dd601cd2e5f33cd666dc54a4cfc8acaf18ed9b56b7321f723fe8fa720c70ced6358f2623dca38cd7c6db9f5f20aadc4ffa65db39bfc3cf9acb647d3c01b4d6eb148fb51de65e1c493bf164689ccb192c5a241b05c9cbb384614d12d47d6f198b4e3385f5c2043eaa5c4893b988ebd41b3ff03ae9b5afb475274eb92af415c6f3c3f091c933d821f16a319ffb64316e0bffe065e7a5593b33ed224daa71d27369041fd29bfe5706c9a5920163eae225afed544e4923810a330a6fe88a31b33f4f41a5a78ca94f28297d22cd0b2a74d79eb6797e377c94852225c0a9e205a930f86a87e2e8be1faa1b2bfc9efda4123513242cc2450c67699ae545a50120c70edbf001bf638d35e92157a1165e30a14ef0a57882c1fdea507fe4b13788208b95f421917942af9d5894dcec21e268c814a5f689b277618013a1721a652bdf77c7b333a4e1a63112a0e65119227e9c70d7974ac6c07627630cf92f50b6c2107c76226439c693aa8e858a9a59aeb840c4980f5ef95fbdd8d3ff9d0ad4b74cf3f2b379081ac1f649577942fcff82fbd58c3b0a92b9186f5752cde9d93b856b43c633cd18237bfc1dc7eb783907b9458739239a9fff91838125d9aac73dffb45c8ccff6d6bea40ea0c5ee0f5450be892e37b8d1baa7cca9f4789e0a3525c5453c0850abab24dd532777f8d4dcb60b7fbc26e1401ae8e2be49b7b0c43ff29dd27fa8cca73b4de0e5df4bc2a026ed7d9d07c1281e53e9ab2304ce63bf2b41ee37a4d7e720a34c86043ac800c8235b0ef51ac83e8ce1ea792ea1151e3f226e47b91e1ed4230e3eb69c1cac7cf54af5a25b70f0d0220154b6bd832cdb43582a5169e6629215b593803e736d6d0c9c0ed20349de76bad902cffd0761449f1495c6f02f2ced56a68bd6c3143d38c229d570eaa7c16f3ea277edd0265ed34d7efa1f8470eb5a693ce41887fb6f394164cdf0c69e9d038db0c3ee025cc21cdebd15689df337660be10118b5518bf214c1342db98a352b75674375f4e21f085850a0e33dc53f7af4e123b0f01b93c23291232f9c762ff28e2c6d6b021b39aad42e76b02d491810287c291d25cfcdd828fa6b12d93995321cf5f4f6d5caac616c9b92bbbb01970ca2d19cc7398d46eaa145c080bdc7e1df2279baae326d68b2557f0072a97716de12c1062c4ad2d799811ec375bca41592db03fa115b5de535dcc4d0500000000000000000000000000738e58091021bef3bafc27095765270477a41b653f72cc84d02cbf0a0dc89a51cb9be6efbb93c9732a6b3e146e2e2cd34eb3df028afd987861547346fdcda8afa220926e366afc98bede5cb03788516c865bc08dcd315e583a226e3e67526300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000353b68b41a8b708371f9ffc0a2c00677d004280da9632d99f02d4945e0a2c348b24036755479ece477147e2465a93f06a1ac767dd8b285da2e3f7e2c97ef4fccb64dac7b4e6862ca36b94e3ca6a922edb8079d6279fd860c3685fa56f0289afa39d937105bec8788f5f0e968f1f36670ce88ebf983f95cbfdcfee11d9c9d1a96030005f511ceaebc4acacab6ed1443078ccfd3d3183f83eb1ffdb50a0af98b57e40223d6aa9f038593b7c6bba70254e746613063859fcb085edf457e9e80c9f8f6e00b08241f3d48ca370524001014e6788f22cdc7aa084be08d0a3372fb3654e025d423a7392c925fc16b0bf69f0ae09f9f6917f79e838fdbc60953f39211bff319fb0310c877319e852586d24b31b2cb75f8be7512f0d2dba7cb47114005d139b8503a0215d6862e44349c255f096259966499a66528b8164b1972cdc006ee74b6205f53031dc1f4903ed296ff4a8bf8c7f57bd13a63f51d127fed3b1e077cb78ba05a903b022fa6c8abf1fc0f665607a2a231cd01d1c5e62e4349b4173c92ea12a2aea17df30330101b0740649f7e217c315d09d791af9475f0499ab121de3e4f1283c5afe07a0a131f62588a2e80c455a66c5f0ca5b79026e43d0f30e816d9e95278d0855bbc2538634d5fdd5264893cf08fce942bcfbf4a628d299c80283c430b0f81b7dd45f4d2fb826036005885c9894b79d90a8e63678157c064f19d140959442278b79ce163216c6eae279dfe1c31653114f4d0a06f95c40744da85e16a419875d9a642384ceea98a72f6b68dd94b6ec00de2b06ee2cde650abbcacac0fdde4955126df72c7859befbd2c5996c7ab2976918b1bdfa10690957d1dc09f77107cdd6d314d9a9daa8ec09929f188085791425dc2252eb89bd9505ea53f904054bd34a3533605b8b359e4cd222aa6f55ca7bf1e9b958d3d600440b1bf6c7d02b999b7d248a2ce77759dc46091d0b8bb8bfc9d4dda87b458fb4970c0f2d921827a3f17341d0ddc7e7bf4351c01e767808851db08201885fac98facc1946cfe729db89c5d4ce177c6e90f9cf837e490641c7df9470a0fa9c1e87b1c45035eb257360bcf7582f4f5d890911e440f4017a8c67be7e8f0979195adda057cda6d051bce712b2c2f6f775351b21e69cf25f2b31b69ba480be0fc05b9ccb23bbe8cbb9bba89390946b520a0f0b94d548b567547d9d75c283f6d97fd35f1177d8bc30395546b065c5137e2a6c14feba0669c04ebd384ebf17b1e2a8e2f48ae03feb2594a658d98ee4d41e4e6d46a183371d9f2a2239a0d18cc390cdc3c2ff902cace03437c201d967fe66417b6cec7cd6a0b832a2337cb5c4d242e49865538b913eb8f1c3d86ab039f4f4dbe59e87e3a24164eae05134f90b94adb91b53f94a5dc73ef35dad13aa886413a55dd993bddc60eb8b1cf89f4990025fd5b5bc1b7ba61408a12ae1ba1d38d1adaa678eaf9dccf3332f737da31c342ba1c77012ff6346d9733f7b215451c53af076c0656caa360f64a38d91d93cdc7405313067317213e51e80c3f4c3097177db087aa62a6a5a0ce662f46da0b87d1f9b705d29a98eb2ff0ff85d2e82b97ec718eca486691c35008573772a14296386cf01a813f6189504d17304bf5b785d36bfa35c952b3d31d7afdabf30bed3bbf9997b6e4e727c145bfb16c2ad9f1baafdd446b57d6257525d226dbf3c313b097f6f9bb9752700ee782b07198e0ad32d513352b4603d15ce1114f9a6aed176629db3b4eca0774fa7e76206290bfa0a520209910ac9be9988d28c61433f9559dfff9b2c196daa01f9ce089c66e2063f72c079e0c90f1a2b4edaad3e788c5be2b8a57ca63c72c7ef6ca7b9e0e3e1fbfa621a23be10f115911d821caf5eab615977eb7e7763ac6b64f968fc7d22c8cdaa9ac8d3be3eb3cfe270c7e16c527162c284706273787b75889f42041a48a7e8de9e4323a751f0f286ca3baa06442010dbdc85f3e9a16bfdc20843c2289f2b1543f0d4f961ac99ab6a923ee815139fea569a421d414a2c1e8da9643c5e75b8ec5d1f6a76a2148d82db962e35173e8e864f5f5a0d3a486e965dd6c353fc5444a1937be37b2bbf4eaa65af787fa784973e44cfb5ec2eb83d584155a0e3ff13debcafd39a1131ad5405ac3a3197e3c34f051fbe94b0b2c64814b64c958b2ed918d3e4590d7caa4895744e584e0f978e57a74c7f84e4a2c0fbaed7ff57ed0c66da071a98e639918d84d9905bc6ada978e87c5342ec25a6f4668ae0bb9d6053ba3d0dd2ff9d3b327a5c0dde8ead6a4057be9f62b1c3aab3790b806f54aeab3668d3a0c9a46e465b6159b630ba98972a98f84c7c64f348ab9cc7fad3aad79c66aa1bed9d916ed9d3dc11f18c773f1117ea293c7fc3b17439b0abb512073df251dab2a64dc5de865cfd826b8cf1da205c33eca845a43069c07", "63636a51515252516a", 2, 206921066, 0, "c550f83643cde16d51608d325f74311b458120033d397db306a920271f1757e9"], - ["030000807082c4030432aadf477338db4bcffdb45770b98236882969f5025d90ff545b3d232c7201350200000009515165535365526351ffffffff635eb812b65b6aabe1541cb20037eefffc73eb9b09e9b432e0b4f7eeffbb40b2000000000400526a63ffffffff7cd02fbe31d5ccfe991502f39289e74770aaf4baacf149c32c7fbdf5f0a1137302000000045352516324cc4c4c8a6e7b45fda65f2073c87bf5ff231c13ce70d848f2e99791dc4194d6414a69010100000001ac0785c78b01958ddd00000000000351ac0000000000c30789c00318f57204000000000000000000000000e2b13939166d366529042fcfbb842b46300f56d83591f635e2cfde788483c52c4f8670157344af616e1cb0fc40608f52e06b1d0c2d515985f99f0c6888d0017c2e57af09c09667d476c6dcf7473a37e76989f7de77634e25e1483c77f187c6940000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014a4831fb5a346427756f77c51adde6e745cf06bce0a14697db7827cba51108ec96f81f3b43b3cde4467683202b0fcf1140c34c4be6671eb581ff6efa440d4b5512e4e41f070493e6883a0754afa0731bbf0c2adbe0e025b8d62ee0700d34d25809e74664b92bdb7d8ba812bdb290546312f11b16b859f6891fd6494279f1b900308fde5b28d4ae649dc1cb32db27ea1bd1c85139c9bbe319ab17a1aad1b5d4295020837592715c1101e9fab30a273c862cd03f7f2f39fcbd2d1a9a7c835d05e01280a07e4cc85313a4c058bfee0e37b2e6d615bc90bb1805eed1ba2cbd43d04b87fa68cbc2bb7de1bccf15bc67be7b0e902e60613ff7a9251206196236eab019908710306a1beaef827741d0bb330a2bd416d40104a2f1eb753e852f995e35aef1d410e0200cecc1cf9b889aa985f0c9434683227a086d147fea223230de643b315ef28060313430cc3a5dfc4c939be99393a31fa3ef275cd378c14b4ebd0e7afb3e8e5dac8031e73ea38a3addf79ddee8dff0a52e5a30edcaba4e92d3b348a00504138b5a777021bb02b6878b40e6d5e779c02efed16dbd0f17149520979eac17d68077ee0b8ed20b906a6aac3b6d109522ca2070fae5d906232394a26365e8e12e095341efa9642bb7378894b4a7504b4d78d450b58a593970c0422a70833ccd5cfaa6ee3f6caf41ab43d37f8c2b6679089cdad16c669916d178caaaa97e77764c56350c8458f063c7b3973484ce25310ab92ab592585e9cc3baee9bca29895601e3f8f526b4a30167554cbb059209e0ed9a511858efdd57aea0f8031d5756a77cde9574eda9d39da16b25f423e046864f876897c0bf44006d85633d0b2f9c7d240c1013f89ea34de26cc77a630811272a7e7e1a795500838703869f8e00a8a36ab524c179684db7d93224029a65aaee7c591bb76523e4a5de8a77add09b1d9697ce92915ef1f378d699eb690ed3a034811f0762dd203005e5f8d6b77d5cd24c5758757cf693474b23ce9dd283aeef3e4c9b6caeb7821d73e3d50b2f5defce65698bcdd79962fd930d782971028f3efcacc999aa5e6cc58b923edf220c958a01c7d580bea5db36857accf7c4f3d46e4ca656c425e5006c886d475671f2cf879816cda64e9d1a35028824d3a35aa6df8a891057e686af2feb3907ad5f4ba704164aa98df9761e01daa5639e008fb0362313aafe00191babbfcd0be3b7e32a64456423469686e72a565445212080d21c3a01e2f30276b63d2daccb83f37512ec3394a37ccf290f2287e020583549d57d7210045650a1e123e6ed829031d6fbaa90b2a097760fa64cb1a8e514606a8da66f604386090de9646414d82d45e661363850529b23481722fe70cbbe250cc047f093619182a3cf745a84e1fdcb9c975f7f12390930f3a865963f33febecf18776ab2422f9f549742a1cdb02948202aaad6183a9cc0b86d24b967a6611444d583c439bea5852036759d290b7a8233361dfc816927a853bc0088fe005d1ac8a1ed3a3c5674fed8f6a2c79b9031d2366691bf5a86307c9547105cf69e2713566092f99462e8e3f14c495ebb4e6939f1a5f4d81107ecaaf9f4b3539492e2d7c9571095270313ab74755f78c6713b62cb11f671f1e33eacd6b696a58632610ac3d44022a7c07895e311eaf3a75fc44e14d7cf165901bfa534371779ee234c8a43083c6d25b78555c9513c54c4707a9129c11fdb8eea3f03394b73adfebe594093c930ed1557a191963787070d686a2aeac6565da14682be69f4b416eef863302e1129d0970cdb31f1178d43bb9af7665f724adf8738cac9be7af41334e8b5ba20d89cd481055dc891f3f947bcf311df6dff1a3fcf1b3de424f3bf71b2d39c7934930c1f158cf3a19add5501ce82512148dfece6a037762d7a7840ed550b292c8ed1f0bbdc046198cfb5099786c1950e98ce8ad750b0e75491b4c309a589ad5337b7e26da3f928e9cc931139bb45d742194bff65c23d30a2307a2042be90bd8b5e0cd9f89ee86ae433550f5f808647b4f61ed798d6e1f145fe19f7f67c2ac04945236cfecf58375dd0ff9d01cf6c2383f407ab2f1b7dafe3ae77e35b56a4c49187b796463034a7c90be054a12b22a18c475c0c88d3eb68cf609a7b58073430ff9a94aa78d736d2e7bd41c258506ee9aa12dc55db6a05b3afd015d3084ba88aaf70a7a7e73fd8d93675b1c387d5b29537db3968ee7298476334b9c8cf8e4064f62464b981f3458853994783fb78d79e38b51989431ffb41e3e2c67d36d996e6e61e0762e3e1ca38284b9087d9d0000000000000000a702e10200000000b6ad60b7be679de8809fad4eae96cffb469b23bd3ecf00deefe67ea4338ab351edfa7db101132609e5baec23ca64492936588f5077d1472edf6d4f01a8d84ff708beb00ebaf8352492568b795fb0f497ba4bab5ce47e67ccb85aa1ea7f79109d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000224caac3adc15990045397e239ca653b8cd0ed11a1ce0c4a0ac51a1f5ac58655bd8143400f462ce55d084a2014be627d534262e9b0fa2ba79606f015d5dea12aa786e1d6a9f2f67cab445a67c9802623b6c802872aedee10790e0c69d095cba370ca8989ea9cebb7f0716ab119ff2ef4e324c39ff3303c593a8b8392666ed06e0222cf7c7f75a75032d63bb3cc286c7a66df9422d8e68d0fb66b4f611b2f92a08b0305f7f01110a7520368ef7180bb6f61da03397b436ea44c319aa54749f61950df0a029a7646a5d54b4bce0f53ea2fe34da0aa0daba9e129da7d6859bf4a1509e1ec3f16a35d40499089d87522a5da733c61e451062874b8ad65f94fd23c4d104cb90206acc484c84ec8c11ac9bbdd6a409d4f7621ec694224e3eee583b6983e23b4a103139bd5f634036f59e1def6f859beea01021693a86afe68740cd00cd8c5e1c3090312364c5a11470d70a44b823b0adcef1557b449cc3ca29fd60a07f3c14e2bdce20328024c8fc8f1b29425b7e08c8949df66f4717fe44c27a29b9101d7b20278589702228f7b1220d5ba572f983605c03881d7bb562bba5145745fcea115088f6e0198b7629bd98f072cee908ab63ac10820213ed42b4b3540e911966814b6e77cac067076ce4fb1e7447a1806fd300909ccc8b630512af7978a30190d8f97ddd161cc7f63b776f17a52fcd242ffefc92087091fb9096b3f4fd71f226ac3ba91134c610d2ad7cf9dc8d28062a75944d29dc73d31043fd2c21d73dc2e36ae528d2ba7ebc510eb07930ef35aae73a85f17f73cc7798d99459609f749de1f4c8a661e3109ff7440ccac1dab355237997b26e590285927df5f60ac87ce4c08b227caa5bda32fe9c513d20c3cbd8fc73a23e4db5d79d88775d44562707268682bd051da212239095a8b4ec13cd95bd2dc39479f10da391f34dcae49b21a3a52bd24c5bedc000e871301d507c7fdf5ce9d5700a436df345c873cbf328c412bbca65c93596bcb6c6e5533670e194642ac0e9b14b9140f207b38503ca517653e08913379620e3711610e7657966a58a902a0274e9413989859823d45c763e1c7dedd3e4b7ca94011da204456773b516bcc4555ae996a6efd5d2102ecfdc4695747f3934622711eb404e24adb131cc2ebb62f0f56b046192f30aea64812da3008dda8bb4dab61260c351347aa88a9c5a4e7afe96a0d8dbb6cc8bd659ae0bf310aef4d6de11c9436001badfd8bda4fc803a4c7f85af51849fc1771c415f56cb54cf84b90d0e610d4cf8d2a986d949fdb30b59a57313f0c7e8eb61dbd4ec3329f30fa29a0cb8af5ccb94914911c1d5b8de53c8a87c0a5c0a5340768dab1315047614f0dd867c11bf27a9003f2b146bb0ae5c1e1b0fd6dd0b8e89137a3d91256dd47c0a5dc2fd78bdbadef4397249bc1b3ab3ca2dee045f97639fb3ca3a3df11cdb169688eae7d6b48880b6a8d2bd105e13a861a1af8aded41e07c9eefde63877f50deb77a4b6709b26a473225492d5b426f58c13cf7e8612c134abd2897966fc4494494e359f30a01d090cc85fd6660fa791b9cbc23d3bc78769c6fd7564fe9bc6c6d18e477b3f42bd65439002b5e2e25e9695d2b6b3f54505e42504260a74b99b15183c8225e0b081df12513669349e199acd526fd90566446dfa4065b15a1b7c38788cc2441ab0ddf033570d6194125b57d391ac97f605b3a346b35c9121fb447468bb744dc1693db84f44b08693e0b158d713f9182175666a174f78f3ade2a54b314b3c35fc61bc9372a7ff26472c78991e53bc480c1e2e21ef187ccdefdcd3f24333446edffe180f17c77c43d6b1a52fc21b69abfbb4d3cd2f09fb20228a5954724c97b34df51a5a78401c1c043477730e1c6153511c8a1aceb7f111afcf4c719c6ba90b1fed105ead24dfe4753ff134b570d5cecf1655bce87477ad82d24d6bfb32beee8a0865613ea9b326bac7a2ab9cdf11c0441d399e20df55173dcc6ec039229f88ed04eabb62a96ee8953e560d44b6ca94f11ec4d7d26406956ceae165532645e1a37fd519eb45abf60757718e69533abbc4f2fb43029d1162ad17ed1fda1aff7b8053296e47b3180e8205db3fda54f8a91cb3fc8f3754e3389fc7dacf3b34d7ccc2d5fdf04f24f901a1c6507e981fb236da72cf00e2ff07c8b27d47f6c7deea280f8c2130c3c395ff7c8a07d5b526e10821d9662c93fce91c20b55cd06e26e9bbef82cfaaf7954931b807b249bd8c53a154e034404bf61ccbe1beec9580dfd6ae29f4278e61fc2b34692321f02ae5210cfbac910cb0000000000000000f19f8405000000001bc530585553de42dda46762ca173a2bd3966f03b409940a3cdc108926dfc604daaee2a0e119ddcf6512f6ac8c95e44d33b799f36f092210385cd6f16ef309eb52218e64dff27c60ba8309222f8716471b0d94d0cfaf35d3d470174f26db7e9100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c36fe0ae9af8ff84c4a33b103bde2358b4d97e75bbbf63d59fcd694867d4d52280bcd46177d1e89c2a799c88ea0f048074804f6d4330c5789b759480179a5144296e44732a2a587f58048f9c504087baa241c725cc6546aa030495dbd8cad8f580cee57a90e64ba79bb48d252e38622a4f646c99f5426c68b97e48c2602875b70327ed10c8856ac75581612bc8c421fe51503f14dd205f1d769f07bab5d0bfb4f6020d925e0f592e041987f892e3c2e5b015d566e0c2dadc5a87b2addebd6a9313520a065ad8659c10f4e37478bdc72405729a393c032f99ac793e8d815122b1e5a660a43aa3dc47280abb4164ebf4786bccbb22dc2f41515d348884f44332808e6509020bbb05210c5d2bf7440ffbf37617feb6edfb38ddb404044755643422f5870f12032e6b5c6ca0bb9b2d046d2964789965bb5ffba84e1273b8454aaa251b43ec91cf0317f3326b736288a475ac03df591af85b9dbc66ed56f6fbcc7823ccfe66afb9a90212a160e78ea8bba0b92d48dccfda691e43cb9b47b75f04e0505a63ef33f4aeee0226b5886ebf643620693da80ecb62c0f66ef3ba4ac95d73058867498a7530e0e9eb0f6eb5ded659c9e66c1b5e0a48441d292a9be508f057979b59b5d2ce7c5e24b27388033e2677258b8468c23fbf4923f410d5deb85114985dfe7db3c35a892fae9542a58b187b9e8692281df79c3a15fd008a033b847c6948235027a4b8b23e99b3896d438f218912f2d6d3e4b081d87dd11db47d25839cd4025370075e1c4066d46c1b1c9a6fec2ddb0d280450effecf77c702ad6059b242c4e1f7c5ffbbbdf0ea0db2da579bb087e64d20ecacd602c9b93df0ba5fdb888d28e762e3c0e22dd1a4fc4bd1c1c9ec5df76a665cb416a29380e8808c3a7d2e470c0dc2ad343b9f85288777d009859bd945e139ec1494d0ef0a405206ede3344a6a99729ae7bb32781b83c8215534e9c8e06fce47c03d838ec0ce55a3ae1ab15205c1ce00b528b09398a34018ada80ed6c3ee5f31689f48eda03719cdd267edb915cd8b06a01dde859002dfed41988331ad9dc9007294b5a93540cf988a7843fd263254013000d5971a3e338d8fda5c118d01b53dc30db9ad0891fc16e93af418b71ab2f9b88990f1849e9b923418ed3c119a042b2fa5ffdfc34e25673210c70aad6c542bc4f4cd9bf0c547abf33f4f74b46bb12d9903a79286eb86f9ae62d583a984b28a529d80331a0cef388ba9ab6a535b29665c24753e3250a5754fc05a775600dc35c952d1de69ae3c51be5458a068849926d9594287844c5fca6857964cfb08cb65f72709a5d768d0d36c4e946d7cb22d3da83fa408a17dd8217c8c4dfd45bf0fb5950dbcf72fd0ed761e84d2e5d88d8bdadd2bc2a500460b985512358ab7d49f2f3e31e924d7193beefbc9a4a7f529214de9933039b12e7dcb8dddbe0285dddf893222be1fe922fbbd05e36326b3e00a613001721866f9d12d9f02644391a4147e46198c97b51aba97db165a1e2c30ac3769c3e4b00eb92cc6b420a62ca5b774b5823799547ae47337e6f57eaab22d194f55e6042a6f01fd314ac06b15422a79ec4d2b4fb43bab586728d45ef196dccd879c15589d5ae54658bf9a48da70d8d4da7d48d62b3d442fd5f953968333effab9eba84c67d6160ad63eeede04140f8364c5f38be23e206aa68746cbb0c9f9cababe0670fa6cd61acae0cf300e9cbd00848d62d4a11a88283e72ea4776c4391616e5022dae7a7df89e8c0381795ebc45964461b1fcb1f900d4113f605f838b057402aaec9c87b67827a5e54d0e39ee5ed28de34254b9d09474aa1aea38dacdcc23647651ea1c7d9d0636d8ddf75ebd4642dc6356a61c9e1e34e8aa823c9432058a1f080a6b89aa19a982ed7a58cc232f5b819800e402002f9a7fd4f33b2448a858f640ece7db0986d8b1ade41b795578a7edfb137c2b37be129c86570ed63d8e7bb2bb493d74e4417c646a3a4c9a2a519a908114b1c6ad97242c68b1c018afacbe212b6f3e828f7d75ccf4ea1e7eb6dc87cf8d1904bef3a3bd0334488c69707147cae68c8e7b1e3f6a47b6335aeb4bb2047c2f9c5f43713309ae60a404838c1ae3eca9e8dd7a5113f49a8dd10aebc0a1b2bebb3d58d562bd7b9a2e33a74b8d42fe449fce2a34f535271a0707cc047dba0d3803c441e6a656b57c151fd643c4afb3fd4af582cc4fdcff4345e5be5711017d87e465b98069192a9097c678854e619e8f24c8b5f10fe2ed4b92ba1e1387c09cb4b2b3d1443a446241622e5f8aadd1e95bdae9694e92aa0667a78a9723a81cfe2dbade36fd6aa19c7fd3d3f7ed7ea1d1ad6bfa3194c691a3777d6a38c76377f5d7c9aeafbf9138c11ad12fadc8622429e5598226fa770dd3bd068ad62eaf926dc0051e180f2c9b9ca70280d0e2e1da6dc3e8ca7c0a", "5100536365", 0, -853380959, 1537743641, "61f8b1bb21302047fb9a3007285ed06924bbcbdb463e77d27a812ee1316e5b77"], - ["2ccb603701d608463799dd5c8c69f5b750e0c5b7eaa72338c4002ebf399fd0c993e25865770300000000ffffffff04f2612a0500000000080065526563636a6a935eec0500000000046353635190d63f020000000001acba6be9040000000009ac6a63ac526aac6a6a0000000000", "00536aac0065", 0, -795874100, 0, "bae219bbf0ce1ac5d70eef26737dfce50d840df23b5b8c0de652d5c3463d28aa"], - ["9548b24201a770b4b7430a5ac82facce9a693dc72a2b01e2e02b1778599d7d756dbda1569400000000065365ac515200ffffffff0361b7ec020000000002516a4354490300000000076300635153ac53e151080300000000035263ac0000000001000000000000000067e9400300000000e2f2a3818cb3aae1cd68bb6e46c7eea13d0288830a19972d4e0e009bf38db489b22b10cf897e267f15e0523bfbce59a3215f6147f8f297a17ed2b5f08f88402a3569eac0970e2f0e4628e9051a90a7052be6df84e8931c3c792dad7cdf97eddf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090b269e672daffcc333c85b0d1b12488947c36b8df0e27eb5a9bb848a2868418816e43f4be28d5195cda0abead87fba34f89ba053f4aaffbec82f9d1277c21388890b2619bfa4c9b4ffa6956c4cd1213b2bded009007d940df27fac5e4f395f73750473386be40f54cb41499a8c3598c58b45fb75cd1a101442a4076f168e957021d5151a0305d1fb6302da0297fafb73f1cae9f3ab33ad1471ed24ef903f436d3021b0fb3bc19c87158fd59fec73db4cb1c2889082c2ee913627e7d1a10d94b58ce0a09158c0d53971ad428c81afe93472939db4a520a87ce1474778ac903ca4dab011b55ed5491c00ed675260cd620c47ae19c254e6e552583ff9977c6b6c0461d930320a74ae0c793ce393ec7fdc0cb444fa1a2756cd621a53f29e7b0e8f8aadd35ac02175af09289e2927eb0e284bb21a6790d6b0972affdbe778dcacbb711868c443f022c135575b5e67152247a9b4e463ce37457eb52994b5cb0d59326f9e83251bef50208ab2a5dd5ad97b221d25c787938299215ba802874dd57e98384a0f61bff7ea5030729b037e1fc714744ea5f6370240e36153841c5f5db3e420373371ba66c7e7b244b8f23689ab6f7509c2d6bad3299ff526e05a13fd45a8ff5848ee0c8b5b660a8ce2d75c6d73e224f54ada4727796302e7583b7b6cd1225e7611a6d8b72af7db457d2182da0e501cb8b5904949c763a22844f7240f3432eeef3f8599a07df601a9fe9385317afdcd7d89d348b0095d9cca7a2f7ce18bf6152ce6aa5c61167370bcf5cfb4a4b18f8bcc11dd3d8e43fa76572cca98047b67769b510b7d2024ceda66ecb53434fad187c7d078a871363291e453947d7577b484dc367f743a9bca0ad1bb630b7f02bddc4f025fc68eecaff43d7db539556cfaf8de54d29a3fe64447714e71e7302bd0333b954498aacdd9e5eee8c58c4f043963d8f48eca6116334a0f6120de63288af5eb43cfc3c9115bb5d2e108baebb882db0faec7880044fce6f03adce416f51085ec087290813457526ff66456e89f8768ca7e1d6f66bc9d93199433a5970e5ebc8f08a51a64fe2f6c592f12f124fcfc910c39afb7afca5b4e230ee3bb276bc138ea63fee3ce473618d127b7d08d20e3d855408dd33d0ffc00fdac08b11800dcc8fd707b2e3ebae088acf37e85b8608df2d6f0674ff397dd92f29b79066ecf8b37f0dfe03bdd7b26414170177f49d1da472bed0ecb50ae9c556d5ced97c17acc8b25c9553e20efc77af1a7d93d21ac1f2b5216e84773221b9c906f53e144c12574bb010c5659aaa206066d47c5681742ad1bd6c3bdb91b43abcdcfe90e933edb11c075b5a38d9332436fd90571e0205e68650ea6be2aa266ee2c9781f067382ae41a4b155bc5a8360fb9faa6134185e6788a0aab5d791e33eada26e4813ad455c7bbc916eb78b2c04641d118ef009d495cbea55b29dda50a4b91b8e65eb174dc71cc9f10029f00b357712ec3e4e3c121b950ec3348db719654fde2661db82796f02ebc0958854fb17f4bc7b6fde94f363aea1d0669e9efd82f6d66a830e071f0c5ec8d32827d1e8c7b4ad4feb90e9a76856b5890ddf48312ca9a6c1d8186e816e2f565afe46c9c36df96915f288dd3344dfb34e95850ed027f1b60957c5e230db9c8356b9fffec9b0cfd0ab9272e0d4258a6b474952f46dc4358238ac25d559abfc47f76a8cdec5d2bc458c548cb947032ce102c6e8e7412ef553f59a5552e7d987ea70627c8aa8ea8319477fcf54959506302095c313fc9d16b409e9a39b788e91c7f39fc953bd7692a3f3b8b814a5ea074a9037227d8d5b8468ea823e0a9dadc8bf7a6ef3e50ba48f97de5b832b3bc3e7c7f107fbafc8c71e1ea09ba669c65e9726068d9723ce972a5f3457fc2e9a3ae26b2d89456143c6c38a62dc048df7b0ea24c844a68668a4e615138fb8449c78a8dd5e7b4bfec45d2d1ee4de684058ed8c55c32b7fc031b22b9e5a09544bfc2cea4d149559a3f46b6982f443ccd2552edf5178d960643b054b4c12d9bcf275f1c5dc6193bcdb646e4aebeada92363e601d2ba92ccef68718c875374965b067b63d0e6303ed6f06bc18c84c2a67b4b311afae74dc6cad24fc3f4e060ef9d822a3ce21efb40f8787beb86368691763324261046bf4c0b235ba68f8e21dd45fcd8a18aa261043728d8173b04ffe3ec2005448e74b7425b4be05426b4d433cff70fc8f83fe0b63ab5d8dc2bba33845eba9281ce8e59facf57a218e6f8b3708e5522b0bf1b073bfb2f08d3843555a80a1e217df88558e8fa388678cd89f83b675756b807660135cdc357f1bbed47d3814802f57659f52ffb6f1b3ac1a9113400d3714c5d076daee4ab27a969cd771169648a5170cf997e53c05a9a12cc4f9d82531550dd1a20c78d53f3a5f3b975d1dfb8f8e02e6249e7f7a17952e01", "6552ac515152", 0, 2062535538, 1537743641, "cf3f0cd8e44e2b64df4d0cc6354c0bb2a602bca73702bf3f2fab49c8f524287a"], - ["950b5d39023629a61313ec4fae9dfdcb1f1ad3f2d9e2cd593c5bad0d5515e6b758e19c122e0300000001acffffffffa02d2305647985a502b22b5f2d1e62eeceeb784e3b3aef7ba1e392c26f40d6f7030000000031ad6b660249a89b0500000000075165ac5300ac655228ed0300000000095365516a6552ac636523573ccf00", "00656a53ac526a", 1, -24853672, 0, "9ecefe6fdd4fc25a52b51bfaa808aafe1f9d8e56c1cd3bf818f8db5e3702b31b"], - ["030000807082c40301f8b86e17a2ea0bab7aed4253a76aa8bdf0cd23db22a2f696f027967e503a3c900300000000fc78a108028ae6d80200000000055251ac5251e8134004000000000600516aacacac7871382b0000000001f5857202000000000000000000000000cfd2c862a19409efcae4731fd6a95f24851ee415b88fe82b1f3836747f836a3485fef9f19bc7ea9f1a4926a3dacbed2428c8efc42691a30cfb88b812a58de6335bf9c020205a6100f5dc25fa7de401da9e6885e465ae2f6323c449c52ac6da4e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000068aabdaccdaf7bbb09a6261caf7689e0cf218c96dff9ce9a93cbaebad794ea7444f10d132d8d18aafe2bdb82838d69836aa5b297907337ec5cc9cf01cf2df85ec32ac7085f3ed4270c7970bb8831762da12588b1085889366d47d418a4dd4ab45e98b1f1a51f41432eec344d965ae1e518ea78c4b71350efc81029ae552e8aa0030f4954f53ed7ee13b22d523bbf7964f9159af59b2a02fa411fde93bdf89b21b5021e70dd6f20a92411ae24ff5081b1e27b961fa143d3030329500f671cdc6b46db0a08cfbeef680a035c52701235b842ae78d3d501b1ff95f8747d89ac6886fc9851d5eb8382a2a8b7b46637d497926e04182d712a8c630a7cb47dfe347b287d103b0313523bc47e5139a50df7f6f9995714827c94bde7b913f0ce9c06c8e80662a2840329a847958bf0cc5d723847935296de1e2fc72b6fb09057db06daa37b0a26a782030b18663fd9241fdfab4affacab8e808108d521d11394b22bb4846f2420227ebd030e12a41eaba87bfa5e262f7785da47731f799679b0a9d1aa7a6bbb8a88bc9d7c032d51f415754c5efb63085b50596f3c8fcc6e3ca949a61367b7296babdf0e06a3182a36789909afb45b8c7a463a594d2cd00ba49a22b8563fd5f24aed3d7aad7886aabcb174b45791937d7bbd6d5b3913a6d1108c0ab2fd4ad9acd67434065e2636cef83b779110286b84556ca5a28627e39f3b6ae881e45fe194782abfbf90c905d28e84cfd65d91d954e4b9ebc9275848c7eec311ff28a9aed86f9745d9a8ac2532c3f678312cf5ae2588cee87651d9e92990530ae2a783052e6801e263dd033ac231b380c5f3b05186036019430efca03c9cd327d44f6bdfb8800c9fb0fc9c74d8a9b98b58967ea4d159fceccfad232e39484212c6deb18a888691ba332335e839aa00fc6e9864470762149afca4dab892ce763757f8d8df064449752d628d5146a8dcb0635c8fc81f524207fd31c4660eb059611c76df2892c130bcc63a43e0b67288e00ca6f1dfc5251aff06c3a0ee991d754608e8ffbaf86ac20bb83d1e0ab02ff949468613f8600bf79f44a3ad25035bcd65559e75083dc18789b041533aa741dadc39d197dab56a93af28f6bf24612adc682bea54dd057f62cdae4757680eb8f846454dd97c0567556e9e858b84efb1b0839cb6009a196e1c35f93ea99586373983a67de3f1b919d36fe52a77c4193682b343c8ba7b1255d665d195145d8f53a988a8d284d32dadbdffe554a8c872621cf3212d872cc4ec62ada9d540816a0971a299adf7e1e6a235d968446812f4422bf08742598f8d22b09c28a96b5b0fd875184408f6f86a45140855399c076b64eff21a30fb6f1c6fc230aa2ebfc0e18bca56720f93f18b74f65c3315666c3f317796497f40ea369dcb369706cd569005a6eb6976b0cd839ce1af949305078ac60b96e49835ad2eeda7fe469b78df83315aa011401dcab14ebb3c36d4b5953cc4962710b27f564b53e8b0ab8156eaa4c4825ab9fa85ddda318758793e408b4d84ac4464a1043c8ad2d8f29970309eef9c36ae8093ba111257e149ce0a2b3730fa3f8926ee2723db7334b0769c83f6900f13f6e828f057937bf8ec3b83a0a6318f4dab59f322bb7e144ee9423dea25a576076985671d44c285ddc63110e94aa3138df38e3a61e0d069afbcd508b5448b7e2d35ac1c7e7560912a0adb1eb868b68a2809a12f1b9f8f06a9bc4ec62c88601e0aaab6e0f462e6d7c805e421ac7757933859b5e7511983c558b99bb4db725dd4ffad3275806a7501722cbf251eaba61071ae4541cb420b9ece17edad3ae65b668dee111ccf8173df217643682c0b1d52c92d0dc9e2ad78e24f929a942616345b171e690438a4d9dcae8db362fbdc2415f272cd3c73dec447701c8fff388feb1b39d882cefaf28322e15f454b550cb4dfb25b2cc1712ff71aaf1a3354070d06119a7715ba3539b837c06c42c820e3fa4bc5806f5b8737f3719142e6155d6f3d197d42a4a65ffd7c8cb2fc9980b431fb7927d1ab139a8366293770bff87d9d8eea976553ba98d6fd9809c9c2643b1b7ad69a1d48a2ef13da479d6fdc7132de60f832ebf91c748d74a85a3aa83df99b76f2e75e3f7249921f84addd6597501aa3fc3a68f1a2907d994c6c550221e223e08fb9deef3215673be38ed002583d4459af4ff3a8c2fd755e9163843258b889978b76c532224e27ebfd833d6a20129bd8b154e83eb114fca364151be3075633ca90bd3864c2d7523a15414618b688f4491329af386def519efd925abfdd4e146ded5e1e12b7cd82462b22a4068eee51e63b3395f03d95f35f3083df7c71bfeb7e4b48432df00b8e5aa4c2090eabb88acb0bc9a14998f2cd0998ad208129b0b3d021117745c631f18e691953c9e6f11080a731971e0e9511435ea68658157f5809", "63ac6363006a52", 0, -11369027, 1537743641, "47443f3b578ad952ae9e4c269e18a49bea27cc9c37d609af435627d3e748a2ce"], - ["a0e6d13404ec93144690808f75ec6522f2f3affacb9c00f03c4675e8f163af18e8f126c7fe0100000000ffffffff652ab77e3eb29efebcb00b19aab7a37b1ea3cfbb4e9595792ea2f44ce7b4ba6e01000000075200636aac6aac449be548fb11cd0c5caaba5b2e7c4ebab20f8d829574355ebaeb336370a195f3fc7f46770200000003535100ffffffffada58c0977a9bdb325a83a00b47ea4cba1fb77fb4532312edb5b48d0e4a574b701000000036a5165967347f703a4472d000000000000af4fc6010000000004520063536e76ee040000000007636a525365656500000000020000000000000000911f2f0300000000bcbe948e2011255f5839062eb885d0e200ce385f865ce4e2c0e694e8bf93c3bb8f4a8fe03b9b1dbb9abf60d3db5c652c6f4e3ec941db5b1ebd344e09fc9e56b07ea1d4fa1177d7e11af27ab5a4872e79c89238865693c2b68b4a43019b6c20260000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000092ad22e5475ac720324d84338f97a81c1cd2a1a9f9cd55cfd6681e3ec1aae35700528ff334cf9e141d9f5cb40c48a66bf93e400b8abdb760cc5e064b9b432876cf45ad6c924653eb39f65473acf54528d4112c9d31bfe93414c36d3fa4e420ae272eedd429c03cabe4679fcb761ce31081ec5fa4cbed88d7bf96bb8363329e66032cc015b0395f5c12b63d3783ffc1ee2f89e1ec9d00eb6287af8668716687f9b9021882f7e65e70547d83c0b54e18bc7a5ebae8497f28ecd98ce2132e99442581730a06fa1ffdc567c1cda4895c023d8ff61a7b7fea89619fd4df28a93a98971738e40be43dfa8718cc60d1309f1d263fda74ab812b07f87daa2b3fdaba7ffbaf1445030cdd8deb2e67711993f03fe59061e46a45847c2f1f33dc1bedaf677be4a7c485032ec9a8b0466903d10cf30dfc0e446685201edba2ac47a8b53cb44c59b62f0ebf0324cb7c537e8c68128c009c1ae612f887488b60678dfa70aeb9ebe96af83a653803274da2a8bc3a98e9c151d16e3bbb1fa1b6e0c6bb2366c42a86dda9949ed87b3b0328aa7d9ba21ab86af623f7dc2e9c81711bc93433894e311f68bfe24b15d5119ad572ed597ee46fb0ae44ede56af2a3f33e8f71a6ca88b3318313a7c9e1f3ccd8f774815e7291690d35c1c2f04be001a539b67bb130937d74fe5228868bdb73a17de211467d21fd1639e4b7c81dd90ed3ba3a332bedf05c50f8c195964f85191ba47f752ac7d434fbdff2fdaa099ff39527e930c784dfd574e12dcf6218953e8b8f959214587426de8ed03f638d059e7d7fb8f6d6c2bec81ebf29bcd52632891ecd6fce58059b7debbe302703ff372ea0f698151e84afec782db2fc8c4ddf5f5b87e23f2dce38753084701aad5704beda5a56eb43b633351ab872e312609a96c7fa9977af97484560ec4354404a8a7897224fc93719c9cd535a58051b34547d371e3a104e705c716791433ecd587c864490f52b02883e3819bacdd3bd714fbd7f7368a83b71583537c852cc746b93716b4061b8fd52c16d6ddcf764da9ef3044c3c69ec3f4134491decaafdad5bb8cef9755e4b94557e40ac631ba9bb3ad592ab0589ab0af927d3d329373c4b5d299d2a778eba9c1852001cd8df33f9cbc253b2a29421d0341453c6fbbaa4116fccc0898cf89c21d11fb080b31c01bb362ed3fa29130f72c1592a671f05a97564226bf95b277ea45d0783c0ac512a433d94e5bad05e7d51854ffed34a07b7d37c30f0182978282b515a113b4c5a805bb84a751abf1f4e163435e69368a33c4fdea29734758786a9216048bcebd4514b57a4ba02e2e5a1656b7f2697e868caa8de6a9442f2b25d609a95cc99c98de2b33d9a5459988d3203172bbe09a3bf971659e9368fefb1db32947ae4253b661a3d98f995f24f03b14758f1c46a77ec8f22a65bddc932e5a4c488b2a4faca8aaa3cbdfb1c1e4f3c71834027f1bb20802144c9c5c5ed6e124c72d3d2929eccd6e69973c2ae12cb9ae26a5d91c9f4003f14d9cc7e276439787de687b8f86bd016bc5a0868fbfd8076499cefcf4c15ea12143c08dfdda0fe5defcf76bddf223f27973f4183db66e72442bcfcd4581a186717319f7f508e69304795655336babc1cb5795f11dbd5f4d4adfdd25d340d30805efbd3d39db835404e9c60a4b91842002bf170f6c88a701eef4c2514a2267bd3ecc221a1bea30dfe74d160b6485e5ca9755debda788b31092197257043a475c161e2fd97fa14270a34e39f55aeccf4ebd72d16c84221821b5465c3f91d0bb15b77ac87039305c64744d86c868891a857b186f4befce3e65587136bfa8c18428a8c5a022619cc223ce4d1c9238f1c6c5b9a9acacd6bcf7214571ed681c833bd254aeb773d66228e9a56c3830f72a1ec21c9c50483043d25b3c5ece981d4a1cc69ce9e10e693954d3b49b4744fdff1fab751b9b363b3ae324209b73d4c4d09386553566040744b1127afb9b56a108aa1b921a0d13f9fc766b8ddc8c2ec3492fe5d4dc0a4c53cc983c481fc76f77ea5c761a221c611ad304769e27d1a798f26cf8aa15fc5aab93d55fe3c501a3ccf2821636986ecac354d105e0137aaadc894cf4b23bbe7f5ff589ba7497d21a229ae4315809f09fde49293ce9abf8e3efda38e0b90af1e4b97d3e1e23b087babf24cfb68f3f73266dbd2b42a580ff2a40b335449e41cc054d01fcfa7ab491a2a59a1436eb746021db34d73d963990f5ca6e84532c1ce996a1226041abbc62e6e9fe1c1b0181584caaa8bdc5c7f91474ceac42e51b4715781346ad3590000000000000000f6d3ab010000000084211def079100a7b36011a9a5a887619ae3d111b72a1e8fc864b1830c2bea935ef070d0447bb205d515d00003e9a402dd3c1c551195107879e507af5e1ac5699ae97bd753eddabbda37a64a2bf0d4bbd3932e59568c77ae62600eb1917d24e7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bd4943fc42831d007b6f0316e07794d163e10123ae0528b4e0e43a8c832beac1a4481824184724314747e0b97b6cc92162eb26296f60ed04ae22b28d53e07da9a28b2c6a940d682a75613062df0586083ab02d1b5bda267741757da22859be56e47df9fb9a603c5e351f8ad80afe6131166205144cac9c8e02ea2ea483b4a22032eb42d16db055b1962ae71af76939d5f3ecd7aaa79b43bd90b1b2c1816333c88021b8d3740185197e0643da783ce6bf74c94c16eba81073b4afcf887c8237240210a04025e6b611ef1106511366f973d5b0944c97468da1c543cc401659f4e90fdb26250872c394b99d49d4a98c37a4325c5c0b06f14d33589cb18889b7f578fb00b021ca68433eecfe3c9990edede251b73466f85d462c8354e0b887ea0dd2e6eff7e032472074dd9255d663a51add800c37cc71f2486b5b91f8ebfbc5f3848149eef0a02157fd9fd5d373221cdd9a8b78e7fef0d3620a801ef3e77d5ca4b030c4801e10f03186350a10dea8bb3d51ebe7793ba9108c63597f19a651497ea7f0f686233a2ae020659ca50e1d82adedc641a0b24aefffb7ec4a907dcdd10f73541af3f1a537e813b3d2f011a74f5ac927fba3cb6ede9368e28071b2953c0313849b2c44a5699d65f197ab572243242e3bf468e5b20e6ca809f35b987bc000cb6e666a41cff53204e9be2b877960870cbec8dfc41e8d2b9504e07670414b9914125f7e8e89b31f2c418229af258dcda9580a21c8b00a8801f766176d5cdeac2e68ce9ab05f1a828ec1aaee30af3e5a1e67980271816fddacc5383fcdba290f859bd062d13a5e8feaf5e942abdeb0213d9458b26ddb19eac8ea73e7a775e8b76ca7d92334ad3adcb7365d199e53eb799286c90de246e0fdf30907a70abd62d935353ff1709ef35ffbc8c75a2ab85082e8460ab48e876eeca13287d5b97fcf5f266aa65425daf2331771f65eaf8487d1a09475e8d97288168625640fb4e7ca44e90776de4b0ea95b067611f18d31ba3a18308e1cbd96f0b2d55e395f6d3fefded73d8c2e9a9b11b05e3a66f65a05d707d7ec6243eb979ef50e046d4909330e8d9af204f3a84815a01883925d4eb128b3b7d18e3f5318aef75d13e20f1d645c9df58f778d2cd577d761abe10dcf4eb61c973da026c12a5109e50f98e4ebdbeed99f18aa74206585289ac420c13968c2c79c89a8aab59978fa5889b3d3f7bea9bd5b875e238044096dbb81067aab17f6ae451d18c7de325fbdc5e698bf407286db8e0e38719ef69114ef6f2e6e1e17fe34b442ae571cd9b4a9fd23f742c6f907396b0cbba062260f081fbd2141c8a39dae39705ce29e55758937d6d2288b13f7d4f353b9e2b442f8dc0f82ed08d50683fe7f55659d1e45263a526cde6b2e7d03889c0cc0f32fba09f0257025ac1b8f5a898c7ba9643bb9f449fc948f65f52506b572a86ddd818518981d2f40bfa53b8d9da99649b77f86455a6addc89c5dc9616f853ec5ec7b7cb08375b1436ed2e58314aba0ece7a78c9d4fb1c907c59d811ce772050ed932898a9e693a7a43511a54bb96e23dd342f449706d6bda7c9477343c2d6b7125a16e0f2cac0f5a93b3e5b0c19fe7c016eca158cacd95ef09117e7c4838eed65521976a141b9b0a834eadadab4d1ed75b9799194e11b8f9bc506238205366d8b9b3344021c178326029a47df307470f89b64b7a9a5a4142cb6ff219aae055ebc1a0ea7353fe4077b6e1592b27307e91a2e50b70a8828ac81655bd5d8620901286d411da090bb017e084300b634ecfba2cdb1cbc448f237755f2b2412268056577b418d13896e7db6646b08b4716c404d24edba62975ea20fbb070cc7912d9ede3172428e62c4fe2814cbb1ca1a95b3a6ed4a6abebd6c6d9132c081ddc403c0322475967aa5d547d6c458d7f9431e2cdf6942e7146ff4fb37ceae0b6b54e4ed34412d0b3cda8fc0a89d61eab833d4e25ad2ea426f11025ffa2756e3b4b1fc27260a99f4b82f15b77dcc67eb7ff7d48ec84714e5fba9f737aff3b0b34f1e09f7a4e1d1fcff277553fb525b079c0335870802fb4624d4d84a1c8ddd21174e8256fbaafd11800926a634149b9ff18e1cd67713c8ae2183c396e843610e8c46053a6477d95f315add0dbc5be9ce619a025271148f1f8bb5d5264fa0b944ae80c7276154921d89665b48a0a751f8400edf81fe1b267804a4b11a5138a0a090d9f8c69592b6602af57d08570bbb590ac5f2faac32cf38c3679df4f59ad8efe9bfc75bedc15bbefb6ba8c0fa743f90000b0253ac6c8e5066a44a7e9718a00bfc7578c409d72a09098bcf0411255983f7f0970ffa4b272548deb3d69cc48f7882041e73fa7edc24b7b5f45b46836d9589cb33a20cc911bdfc030bf5a27534f9a48d361ec882e2bedc55114a64884b72fe7c5f49f46551d366238e0d", "0051656300516a", 1, -55310729, 0, "d4c8d09e3627d479a196a7b4a8d44561e97b0ce4dbe9cb96ee78bc7089bbfd2a"], - ["030000807082c40302054c2a8476a3682d0a30f4a0ef0d54f84e9409bb952568d9bae308ef27cad73300000000046a52635171dca7459d3bf071121da104f39783323ed59e79ef4957a1298843122f68d05754202e4703000000060053636553acffffffff013cf1c40500000000030051522c0a4e0100000000010000000000000000e2f4310500000000fd451d31bf4db28401423d5a81b294461a1a4ccae523b5b9892cbdc0dc4a3a7a261c0ecbd0514825ecfc6cba66bacf472d6ff926f98395d9acd15239d9e833b69158503087e519f40557fab572003605a3bcc28e598dcdeca428baf8f2dbfce100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f58af3623514aa73eaf5c55a844c1a7aca5d7f9c34ffd50bb11fed0e7c4d46b8da715a493804128f9291ce49e006ff2b65596f59ace9cc0d6e42164e85868ee45d6114e6c71d87691b402c9a63f3dbc620bd07f154a442587dab78b4583fe8b9339bfbcddf98943c9f37e99f9ea80795995b711b3720483bf3fc88217c521fb70229c71893b2cfa5129f8732f1d9ba3f60bc10849dd6a9319acb9db457b088da870217f98946a7d2467a637c50f5597fe18e3dffe892ac5ce9f578562d1a38d8f6d00b080c64ff4c06aae3406dc4ed266481c5e4e8ff344cfeb810315a9d748365b8e14895a2911b103d1ee0c5be556ed4b767e517600103b0cf05d072814b38a08d9f022ce3c02c14a9bf1da90bdf09365dc4e5cdd012dbdac12a3d6212a2ac4130c60c0325eb3ce6c122eed6782ec931beb57f53680759afd2306cf47e9bf37df72f4c2703018442a8e8d839ff098a061e9b20ce5495c75de8757916cd84f32dcbf07013d203037dd472012efd5cb1b2da083603aa997869e90cf4e77220ea14ec673f3fb01602148f46fe04b4515e25dad0ab2ac284173fed87c4d1e615db945bec67141e8e4c8b41d088c96a8ce72eb7f506ba237028d7ad10f0ba73a4da2b5470001b0ec0db31e706a4c70c30cf2614d1cbdf27fc192e7ef3b06d99df6828086226ac2fcb7e937ec84569e7c7a2b15a97272f68ee48f03b65730c63882df5791549578f56147e1e291b0522ec2690c6d331f8ab7f145969952451e1f9d05a1d4f0be1ac854004ec2f0a682a9b085a1e13b43842ea723ac4e00e5c6b2a3b4548d1ef79bf7e0099b481fca5f691482702f32415d61ff571bd26e20d0774d79e20c21f31d47a3946f014376a2ceb1802368864ea19ebaddb2968f6f75f17362ee19f0acd09d6a429c362eed411a2d0ae2c11965e8852aa83e74981a9632a990fcd7cac2ed3657642391c3e68de48c9fc6997361d6d87e170e7531561a9ec40b098589aec10d9bef74cb605f999136220f69b098a92a7e8aa271d9f6b8e671a0a65704710a6ede9da939b8186b79afda8e9a90e9354a0794294a1c8e14d6f1dd1d83a05acf5de140da8597a0894271989463ebcd01c5746861c5599bf8057f8e9de6a2d313b51461883860869bde0f0d5f6b23bc1d2837e8e84bab125930eff6f27bca926f3c18e88fb2b26cc02289179c4fc039331001be4a4c45580afb169452f84f469cb6671c6ff012a1fa3434ec33ab30f3bfd4a69256fc8eac3c91227dc3e6f9216bcb9e7c2cf31ff36b329c2eebea9af4f1adcbebba993e1946e67317b47cefe2dd0b41e5b708140889650d7f9f397210226b027831867225675d08c1c172cc8e6432895e3c296d84e616de52284e4040e81f2efa9240eb84b814fe1ba968e9b618d997811d8bdee12f587a0622e7dcba4475fbecc2f1c2ce44c1a58edbb9bbc93aa3392e1ae0026ece50fa67caf5cb3a198eaede8c9fca1c8a5d5eda09bb0f9716c3e9fad91273e853ad5b17bacc2ba1b93f1bbbba6788e45d195e2072dc050768d69bd23a5048eca55044e87073de1770a0d86434ca2f23f5310477376b4f3092fa2fd29dcc2e95262c53896eb471cf9f38e7b4067b106953d3123820dc319f6dbce742b4fa444184a13c2a1b81242b381a2adb16c06ba915b62c2842d5f7ceb3b8b9e6d265e8dc10332b3dc05c9573e65da5ddf719d8822b79be793a1eae3fa3ce4fd1b1759fc8adc9fcf4f4ad34509bf2160242193e4a8d62c34ec3f812195074959e022f0e8a6391a520417c9df9b56435180e931b2466bec99330bbd3dbf95654aff9a57cbe8672cef408146b16f6a554fb925e0c3afa1e118c402ea5138923bdbab22d91442290e9866b69eb3ea72ae98b37738c28a23b5662d1f08339728bbc61a7e4118db7dace74a36b159562a2d86b926201e3cb57bf28d3ca26cd03a524976cc096b2dfbd2f0207908e574df6a9a0a4a8fc337a17b072398ca8c2b9b52a79be0f5646560c7f47ee9b6723815e8dd12bb9247a1965021ac869c8d7d560313f8d512a874a0774b2c6f1ec559f963707362de87cfa28432939a37c2ce9cf31d088a434605b188b1fc6745af46f2283634d84847b3d9fde19838a8a7898d3a9c4ba25b9cb70b94c329ecad40d987a48a26c52802120af073273f6a81beb1b10075377d14e396569a390d4e8464047ac99d4d94a7810dda8e6f2cf98a4106299f1ba78f640def243ec388e193a4b3cca0aa5255b68fa2b1eab6d64e915dc95870dc8cee11dbc96d00ca2a2104e027a817e4d8e82e507fabdbe4bedead2e99f3b14f81b0f8f55e20e5628824583d037f131fdf3037c24d1630dd5b7436fbcc25e9b1b2585e7e583f042b178deb489062dbce0f277c2f4802b2acb28c2ba1b5bd90f792b16e454268acfdb18198b0d1bbc13201", "6565656a", 0, 553886861, 1537743641, "663cf6498c2e88b0ed10b731d4e185e04d9bb60155645b5cfda5f56313f1de59"], - ["d97a820f018d74a9850f384996ca3c69ef625ae8afe2ea2ae84fdaf109ff502beced54f8c10300000001acffffffff03849c4a0500000000016a87619f020000000008ac5152656352636a74931a0500000000025365a53f86920369292804000000000000000000000000b3eb3ee060a8bfa32043be6c6cc8ae2dff13558ebfa3284895be4170caeccc0f4f0a160200c533d00630356c1ee0ed4cc7382ab39348d23960b5957cc9e3b728f1140bf7509384dee00b79da948ef8a5ccaf7d7d3ea60ec7f6ca1fef1412d3df00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c2c24b3b726d1a4bc144fecdbed3d8fb72025210e6f6c0fa857ac3fd5591f5ade4130291d870d9adb554634c746bc8e6d9849df0fb02ba1e3cadbfaa22137b6d6b4874dc25bf932c89f18a5a742d3f887980093bf193d598b2d2f908ce3762b31d847a72933ae1e74e83bd48f4f75f76ea71dec244ee619ee883e2df1d2b8103032e8e5fc2d93161966178d2c43169032317e19c5ce3fa5f0e6697dd0105baacb80204158b9b667c2383a916675204ff6c5f7da498bfa1b756846e5b853bf1c58d760a012f4250efd963928eac9980d8fb1a0319616b97b38a5c9db889f12b450dded2df38e6c9da1e29a84d679730537db5d0c1ee6c912cd0b3023afa0a4783018dab0225a3c9abd5f56a0456b7f76b0368802f38ede96328f9caaf03450c2ad436613803214082aab924a875a3e60a666cf85ba68c73a2f1a6844b413c7ccce0beb3e28f032141d987fa591e19487b6c38d50e4854610d3d61a27013cedbfefbf9a97b02ed021a8cedc00b8b5a4e30d6f928fa9c34cb0947b821b7243b5266fa6b64b5cd37cc031e366d90141dfe44a3686a83d1588db4ea0243dcfe5062981fa5755ed278e205820fe1c51571ca51ddca9402d1fdb021cdb3459993c6b0fbd73fd5cb10d86bad333d0738c312ab22d7c603916abd84469b2822e3d47127018fb1187f43790526936ee102737b832344428591f762708f31dc0ef57da493ed5057aef4cae4df02472858088cc99172b865cac0898931264d7d9f68884bcb88011dd29c2c7d3cb07277151902a4521a9b2e050a1024ab6a99b28c6256bc4fb0ca91d50dd9b401eabf35edbd725d4026e2739f96a57f2c36b62aafed031c04b28aac3e40ebdaab00b3d4b23213fe42ce23073de2d3d4cf5a30f8f51cd9ad2204d689193f5d83f67a8a0ced59b61e52c432b0555a0f7ead437070ebe6d1d65d0434f232193a5182cf66ce36e07852ea58170b44c9729cdcba72f18e0eff09ad66b097508141077b0368656cf800d43d94331293c11602e77731da75632d17c62669613441d14647f293714d88c86b901b3accc557c28c421983a0a204ada59c01096045763aade80654d226ea140a51ebc6ce471a5446873f134cf46ec979921370db8696320912717e5152df6dd6962203950b039e39054735b225ef20b3bf232cfafa99f51c86d94201d03418aa9f9bcb3d3d90fab3d1ef24a7b2a5340f2890c162297e80d4deb0bcb88316a438746a44a9ce77178019dad06b4a4135fbbcaadf1bada76f941414496e83cbd33d9cffbf7e4c2048e0b9db2502ad4f9c3fc187277e54479253a4d061215f1fdd330f11c6d9960b4abea0b0c4a174a5a722915f301155f328fe656457d6835ef025495bb59e7ee7db2d4277b52b17506fd70a424c30475f9a467658a5a0a2d23f9092b91df5ad1c5d68a0e042f0c8b8630aa67651a85fb40ef0b55efa513f018ed936d7c7a858520eb28b5188e979fe1154f94b55aad1d04ad53400e9a59f8238009e096c7516473733ef4616f4afcc190f2d9b81ec87f7fd6bd2e4aadaac70dd267cad08db0897c8812aa2cc55a0235d66f74dc32fe7414b99d0d57c09430af187e715c087913a5c87583cb7ab22a1b48eca9d250ebcf8cec3557630bad6270599d7b791082d9d55a2c37a0bea5cd5fd7ed3fb0c4831ae3ab709c81f805d31938b34221d1b317c332d1db3128ec15e3ee4dc58c28662fa64cc55005fe4e3b3ef381216b2dc51302622f91494411ce6264453d513273ccc8edee1b0bb6cedca413850ec0f9dc57a46b7d5f6b399132d09ff85486fba4c71c53bd595da1e287f6316c17e5190fc9240e5d7fceedc37d176804a4061f1e66c489c04dac50112d1ae9f00522a5edd0ca22a60a0aba8d754c182bcb002ae039e53cf2a3ae7febcb05988f3ae8b529f42a8f24418d777de9daf6d8a8536f1bc778bd252f5ccf603698cc5abb205584870b3a8b9fe330c5b767f7458100aeb02aaf7522cbc9ae06a4e4f53e74c8430e858200fb06c512b6e9202749c8b2157f79ae8f29a8f716ff5f6329991f3b7908dcc45c89bc25e98daf86ee2ec66e8ef84e9ee00431ff907c2976093ca3bc588a082c8710ba3b2173d87f869ef2b25883385664bc26ce319e814db35dcef49d4ba7a678bcd2df7a0b28dc7a139776601b4770d48eed199849385acc7e68ecda027c5268bc123c52cda4f9a31903bfbcff34c84ca69f5f383a68bccb5a39616eb9ee47333762861f4ba4acaa2e69db6ce16de47341ff14b9de5b82c0023ced92f38ac734bb231caf451af9005000000000000000000000000f43acbd63a16dd7a99d847e634369d884e754c6fe5337c4f19f5ccf63d3f3a9fe6793f4ed3a6c63c64c4fb971febf6fd49abfc14758589fc64f0d0fe4c2a6050161da445161838a581666d8017dc223b3de7068010d5008eb5822529bb5b031e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040b769715e2e331e750b42256706b356d59cc45c408388eb726bb9dcb6aeb26c58ae87c1f426d15fb15e5f99058bf08dcd65bf2fd8c7c63a4fa905a1c95b175825370c172f4fe903f3e7fff5e0f8099ad195277bf819d4d6b10d3479b6a4449722d1593774211aa0ca0a2dc178917ad4394b5509f6410fa002d852df62042524030f0e92665d75ef11bbc89c6b620a1933bb8e7b0b335bf731d20f1e9bb2cace35022b5d3b09e6c828851ab0392634a10fa441fedff0c5a36150468f43ca0d3476940b00d8c7d93cc373fef27816c0c62f02c94123fd96f93c498eb9e28726271581db83ffcb5bf28743c06ac14fc848fbc8e71a4f2d4a27f82406003cf078671ba7b3022f7f095ce45f83c823f0471e3a8f752cdb045a04d8fb90fc1ebffe134ba396c403010665497bc32ff7a1589ea4d6ed2fb59131365b9d96aa6b79effc5191b3051c0201c15c2ca4774aaca62eb527e9aeb01678d6522ecbe60079d7861442e7ed9e9e020c03b7030dbc76448a94ca86b34ac74886ba836d47eec499eef526482d7d30a0021e1f96d478379b98df8682c45bbc73bdcf9f27c8fc5b68a5915d9bb1d95068a4e822b72b543a5bc1d8f04506302b0509ef8c8cdf687c34cd36ac7b975725c464f31277e43c8b3fd0efb1b8a5c688111e1090f88762c782ffafbb89ee82a86eb635a6cab99d66228ddbe26c5cff15559c875353e8d76c9775911554acd0bd03823bcbde98d716d15cddf7d2e73029c76aa348116bd8e6a4c4655fce8e3c6c18e99eb5fd6511a4b798cda6e9a7f9bed90f849332d8d58125d00daff4d5276ef855dbb56f72dffd12e5bfb023f7b71817f51c847aad80787e15ff0e2b78c06929fab3ef2dd8f8c3c7707d9d6e215a0a28bd3774045109af871c1392abff37d10646bb95fc8faf06f619dbea447e23577e7fb597a8370c6f50addc57e1e6c6c4574511d14740b6be0c485ab3ee4d7ed0042d5d244001248486540dc6cb0f677a76fdf9428007190206971690f0e15027c9ff626c0bba862a67e2b15530161f3a93f3996ff74879b8dab5c94083ac9ed690d8689d38e35363d13bddadbfdc3f0759a6a34ce127380347a43e3e2ec21e575505fd7370c6f1ac9eef2dc4f1ef11b960beaa65812ceb9dcf822ed336a45bf8e5b543ba0b63eada0a68c120baceec0ee1fd2426409eadd4e8489ad7233f1d393ff6ec864347fd8fdbcf0305996d8aa37e42d0298672c6692fe36f4def83892a7cd168ce9f5ccdb243d4919080faac2045d12b14a56defab8da9b4a0e5c6c36ea04ad585c37f0c76c29816f43834ae3cba389dd594887754ee31a10413d39978b9a5eed75007db70a28b4b66f723cb94acd6906bc94c6c3d14ca30e02d3538076d856ca809498f8778925b6a8916ef1b720d71d63553194ea47fad39dba29901c334810c9540ade8f3403225a8101531a272afce58cc8e456500db00868d44a8702ecaf15c05b6e67c9bd406aee319dc7f143380799156725863b7aca2a402e5a0bfc88099c713d3cee3378b18bc3ea4a4cb601e6384fbc2fd774f792de2f240c05f66430c0c8f0115940035ccdf0aeccdb7c73a3c1798003a3a8a2131409aeb3d6b937104537bc18a26edd7089aba641d849c2a121b85b235c6575bcaeb104e901965d7c6d036fb67a5e5536342fa651224420828d0133f6e224ed0cd572d7ae1ed0753212db226d1861e50faba69f08794071459adbdf65f4320e7a9a2f8782c9a9254b39e97906b165afca6ddb7ec4e8c47fbf0572db047193843673df4affaf3e82f45805c8c3c1e8dc0bb5b56f621d83f899c19bb015b5f0752834822b09a08f545e39ce4930bb8e998c492a9286328a447f9175ff056777ce60a43f6edf3fe9cf00f55506332926216cb4a95186a457816948fe77b3511b07e66f0d40565598728879079d1ebfed31300822eed42ef2f674bf5fcbc5c0589d65d17d53a0973f850bd6024b8693b3de0d45c4fb9cc72aebd83bdd77fe45d66f059fe57c7ead592d36b2b1ce689585b084df5b5411feca017111f87067278f2b6f2c6b96cd1033ce731983433f9d2a3195577949dff3e7beaba95eaa0589505aff17032b7bc1bca55974bac6bf3257918079298f53836e96cd215521277ee241d644b6bdba20b076417446c1770f04bb75f0ec2edb418851320d2a3e077ef71fc28138403f3d12291609fa907530b8711c6bcdac7cc9f54d8169929e569c6ac5275f176d181de07affce274da207d23ded67f0ad09b95d3d9df45ed67297e98936e90bcd6e8690ffc8725140100000000000000000000000007c8ac4bb8fcd15da1d105fd11be2c8824104fcd4e0c31722c3663b2f2e5ef4874149c8dce5a48b2456e8806d8df7562c783e2570966880beb94752111cf0d2d9d408efd078ae0f2d83675ab27b191360562c6adcd6fc054d9a7a9688fa8140a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003669899177a6e6400805da4eddb1c8a120886ce308dbc4b03ce1a09904c91dda47875602ebca496dc2afd22ae12a9b32c1c4f6a620b56e7197c34524a378e76e60cb3ec605d84a7b60dfddbaa0aa2208798822167fdd3910da58659dc4ad67eb6b9f512ff1634c4506cc1c65a2c081d87233644f6ae237f165e114ccb298eb25020dbffda8a5d54e9bd6a7e40f66c291f58b5ea7f50aae8708673eabe45aa71be80310a1590420c0e43eee7be087c908103be692a992592ff1f2deadd207d8c2738a0a03980b8944dc049cf3fef12770f084647337cfb4bd0ba4a24b6f42e9e171808880ad1f776d335c370225afcf24b443b3469371b72e21a61646ead832aac9b1e9020d01e927c147c28c9934461d25a4996dadf42cb4629af40c4bf315e2b9eb3800031667d13693043c0b158565cb55904b8c2a3f677c274c1d46989228026488f3c103158f47ed59d280e4e714065d6219b73842c43dfd0a13020c35cc773f4c17062b032ccea187d940e946254f743ff71c1e9c4b552eab1dca0f7b3e38c5c546d562a0030922f814e98988166ddd05ab15961cd495ff477738f72e7b4a73b77d244ded334d7df99383b3787a6c1e4aa452d743865c1373c2b96e14ec3f32604c5f909e357966ce769a79f4dba702fea48c99736872e570241edd83a7029058ac83eb5f985d59f693451e840e22266b90961529d9bae045bb7c6cd73677ecc432c3a997c12f32aba159f60ead7e064d12597b1569eef3cecf4a6ead75f8df4088691eec4e3596b780eef01e662269c7bf9b845cb5692bf0da2b4a48bee3c06ff73db41d64e332188a5f31417b713fcaa775d63a9f0b92298db24eea066e000384e2c41429e058b444c6bcaf896e039db29b5130af526e498eba7af8fdb47fd03e6668fafb88708e593fd13a76d38dc4443914b0c1f902a2fddcc0e41468b1fc36013cfc9bf6a49fd0a0fe209b78722c5322b62de22fd20f1a2bb07881ae960b4859e58008bc6ee976ddad08d0e5d2a6352abb8f0b08f0ceeb8d0d2353c20ab982d4e63621707aea6104b6fb4e1def1c1bff6642070dce52063a36b44ce9d71daa56ac9437adcd849d1302d3e93833fff7739c7d392ad253eeeabf86aab12db31a03a2a6e0f91803f81222e38cabc170cb5baaf05756af639ff4be7916664d53d285d4a141cf880571d2aaee38598bbaab0db86893aced09626a66d71d0908303ee8f8a1d929610ca92901f92240cc3066e5fe779e608d46047900f78df3f42cd923553010a539853e104a2a5e14d5fcc519f222bcac65b89c01c369cbb5184babe4383520a4229051d8bc9e6fcd9296943d762860ebeae58ef49418245dea1024dac0508bcef96ea4e9a8501b0033931af00caa29673663ccefc9586cf64480373affa67fcea0a96ce92b58e97c7bf93f5c8a100812eaa611aed2503bd7c929de8b3029ef7efa01b99bccb6bdb96436139448e84a744f79e34cd3a808c68fd03f22e447dbcc710e643fea5ebabcafec9938f0f589e87ffc0d263eeced5622ae7d432d8a3d6c9632e12eb12243b70b48575851d3b99249a088231faf76dfaca4407525408168905d896261a5256fe3edbbf13faafaa07c69de48fafc0be48204047067fd1a48b7a7875329ddff785bdb9cb1f532125e3d1cefbac44b4a6046d1b05e22cd14311dcc0d2009f335edf3e510cd5c1f466ffba19ae2ee099ab08e36155cbff36a57207f0ce9c92fed5d637e93ecd646c8b29634a281e78b0c616c71819d0b16cbf41592be2d7434e57d9e40819e6e20f408aee7bc7208d48ab8d41001a0c8242c648524c1b1255c147bba1a3f11cc3e328ce127ff17203590f3347f0429ea49c7fce25e0bf70818632faf3e440dd445cb5a1e7abdcc7d3544074c9631b32e29ba28067758564058d67cde66727926a82e99c5bf7938696471d862a0b80cb3efb9d8fa299de66b1a1bc39a6f2dc3ffac427e81ee151d21cf174adcf9f069fd56947e6197ef37a0dab2722b80614c05dce09071771181108bbb17063248f7fb6ce6d631da05fce05c6d01a5f6bb2c06dc8918711f3a4ab058e18bb286870ba3e0e99f038aaaaed98513b8065c6fc97a2fbe70bbc7b75f3acaa2196f6b7704178cc8a6cfe85b9cfedf9259605f555d35172d063cb3609d2c58f1a42d14672c1c093a9c80773b31c7825070666e92e74973ee5af2035353872c97ca4196a3d09a0adc73cd7387d7e67989fe1bf6a9762c1b41900002519bf5097c8b601b48737c0bd7f74211045e5987be1a8dda9192ca797c973cac4e4a28aa01dd5e2933d1c8e68e4594f570c0accdce755802e1fd9c2f723eb53870a701b485c33955c0cc3680101fd80bf3f0fc78ec2a465f767bfa2f25c32b72b3965716d8f0c50d7e3203fa3585fe35d0feaf08f51512399bf61882b72f05", "5251", 0, 1966270095, 0, "96bdba34234c94e0a9952cc891c39b4e8a0351d3e2d481ea6acab717644401f1"], - ["030000807082c4030348c67832cc08c2e4122c23ebbf923675cd539c61826abd2d9f8e2283ab55cd3300000000056a00526551ffffffff3bead223d7840d1fdf2ca3b7ea09b7ed3087ec19f84b97cc97b1bf7b279a765d000000000100fffffffffba232be58749be9423cc38345ca7a4077731bcc2dc611b27bc6500e26209a730000000000b8498862045a939400000000000751636a5152ac5300980c03000000000153ce16350300000000046aacac65e81cb10400000000000000000097920eba00", "6a630051ac", 0, -699615125, 0, "24a62de30e9718a4b82f32592c245e57c5110af864ca7ebbd2709d6cc2b5d004"], - ["306bae660449d8d302515c84d71a542795aa65e5a4c2efb96531f985658b9f00e86ab0516f000000000952656352000065ac52ffffffff919dd6c25d2146cf6d84e7dc4c261f07f7790a1949d95dfba45b14f383a23612000000000865526a516a656a51cf4f2101d335ad47cd1709ad72fdb4aa6b0c0ab04c9a20972971b3995fe2f9c08cd869c703000000025152ffffffff0b8dcabc9fad02fbbb0d1e5d15b18071418848898f77af41b414131b234fc6a20200000002516a48e0503302e8a46200000000000151a55cc20100000000066a52656a6aac0000000003316f62000000000000000000000000006eed2b24cbe2deefddbc99e2be7ba953f4fc24ad6e01d1946885fdaa50c0b994ed89dade8eec460b9994a0399ba216b4fa19d60e581efbbd0c472d384037d69eb85415cd2362330c3e96404d76c208b4ef45c5bde3ca1e984f4797095a55196f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008dd6b20d254b68abca797d19e464514f107d1c8d9559fb99f2c3cab0f3ae21d0787683f90c2dea3c0b82704df436b523fb591a7807be05f2a2e9eb39d231f27f26028db9f3c18dd2c11a8e15e744d82b55e0c15f26237c22ae9e8feffe588d484990a6110bc101bb4c8da5c14d5727378850159394507522aee81865403142e022d47e9595aa0d5775b51d7e1c7a758505147d29af420b1e5cf76088effe98ed6020ef26ded77c6282b721aeac4748a6c39fad9685ffef7822cc9f3eb0512e017a20b02f09377d7c394e214c27fc949a2ecc3ffcb6cc872093c6b8457ecd85f2e001766b860886f851083291c61b60b38790a75fa28d2e225c5b13ea308de42348678021b37e05297fafba334d5d6a81ecf6b0c9d6dd0ea50c387e06b10b50927777339022d9295c391568974e08eb4b407085aeed49d2e5feabc29e4ac8351f00e743722031930527a8e3ec8d05725202813747aa8655ca4fde9b563c3a13ba3f226a1e8e1020c7ebd33dc9e06d42862004f3a3ee65d70190349bcdc74d385c443cc81a553dc022ed8a6e096fac116eab95473350858579a363ff3b29fc528e76436253ef8acd86be686ce2f890c04a0373faaefd514f4104b80ed27e444599e1ebff986b89e751e3eef38ebfd0ebd4c553d7f52db0654088c699d439f59f20a16363bafe95e3b7088aabe85ce63fe654163bfb48ef2acd1a432ed1fcd179efa0888d24d4c5d9be5089aec40dfb39ec6d30ecc21d2da996f3a45934bf80b0bda6e204250b90f450ac0e311e8098da73e3e64239fb112a3d2805c8ff58e4959b1f8bebb5489ae544219facf8f3dd1f6e7089adce716c0327fbce503974f8c66c6faf276c01c9d909c75043630a8753b5c01299c85cc38726e4e13eff264890f6b9d8451023fb77ba0434a086f975dc30dab5ddcfe9784a378268c5bd23328c1b0d919462676c50808e933ed43220021ecd558a318d2b703ae40e82d518260ea9dcd1550ec68fc57525e7b86e951c570df230b8aa62f987ef1f7ad98292860afe744163c21c3ed85888cd2b0593249af458182c3eb53f0237f7bfd5e61e1cd0b1de5b62878efc47d78666ec869cd61bfbcf44ce4ef2b36e7a33cc990b2093b41831caa219be2ba2d02153287d39fe68b9d4a68e51de8951b31d01c2943cff4d3848048970fddb485a768ab039f6cb9e34b0f718a2d3bfebd185b5829c83bb500e778b33c60e189cefd82f42246ab2bc1a274ff9d522d3bbadf977adc06139ed348cb7ce6b36dca456d6dee40574b64e8d5faf17ee44bf469fc51c5920286677893464cc1dfd555b123483a7aa506442e97af3d66ac0a19b365f96ecb192095dda6a83a25b956f4648a4034f827ffbfbe71b0085fb2d7702e9a240363ae405ce19911780a8f29897420fa7f7df1521c6cee38de06a41008fc4e894681128bd9f8de314b86ce0e41b93af2610ca1dc59a500bff238b71fe5de8032d30ff243312e9eab0550f178b02b5377f2be6c069515426ba443c388dc87715db6e8b80dc012bc1be007ca71dd8b93b6d4bd417406bafe65b4a005fc47dff8089b7282abff1138ab461ccc3754bcb4e84f449a0e65b902e0099d4411653230e4f466b62f0e934c211b9f7118477c7e3ffeb9d907eaa04226782fd6a5d9f44c19b688ae64f62a8e3893c4a772c4b220b4c52b7fb43b6a4c210c3cdf316a51e32dfd13f1dc76d04fc80e447d2752d20f01ae8163389429d144a465d0c3b1c91ce78a4394aaf29e3fb486e4578401e4bf378ce3d54a134826d549deb91f62bcbdcc70c91cac36aaffb48bcff5e6c8f33374bce96714b182835bb82e5dbd88154df89355541c4a4210abf31b9ef7b94bf7b5d08cd83fd50b471fe5e17492f3e81a38e303e2c05df13b9b8d277679ef854c2910a6ce63d8fd9e788d811203432a751c639a9953695864e8024571b7f2af3de7ef24852ffdc91c1f73c7dbed2d2cbc8e9ca739be6cebd4bbc21fc7bc82a9af3d04e6701a4205115d3de79422a38cc085369e82e01e0e613a0ca600d429cad723418f3b9896d2d0e20ae6b75bdfa25c534e12075052778fbf3aa987a2babea4e242470e95182be242ec106d86d2974e3b6a6c41549fa3f730497a45fe851ba823097c9d5be7eaa9cbc568fff7e2fc8ce051b273ca2e9e87d47df6b10a35b4c297434e1ae4d44cf5b3d6fcad9f7a035f1887aaaa2346ceb08b50307faf3525edb5c77a6842243bcb5f0cd0027b4d892c6e1e791cefdd286305536a3da20e3493c2dcd2fe32ccbd5377ff71aa013a8d307a0000000000000000466557040000000053eba9ab69b8156f85fe0f3c2bf63bef03476d739002e3004d1ffbae53e4cc33375570388e8d153e1d3dc64d16198e8077083b2831cfec9e8955956aad0fa36915e0c9f6e7fa40eb13d6f122c43684a397521bd57b38d410d26416606febbfc8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d8cec8d09b60305aff2ff5f0f02edf0787e545b4d5997b391e7e67effd1b3f965708a685027daa6220671c5e74a0ed9ca26b3b7da48476e289bc998e563ca6265c764380202c9b1943960f41ca13a452c96b48c3a4147c9313301c6fde3d83a62feb875ffbd3855ff0d5fe334855666e19344458ca3ac224b9ead786749fe8c0316209ef600ca9fe5bd8500f8f981908468b8d09df761ff877ecf9a111e2b1e2f032d2a298b7a68a78f6f62cd076723468776b858b7f049fcd3eae69d74787d15bb0a07fe033e5bfec65aa3add026140e2c8c2460c74536dcc008f90ec6323f5d3f8827093ff32ced9b4b95ac9cfc7b6d128817ee6c0f197e4064fa81edcb37906bd3030aaa8a321e36e75cdd491bcfb212080efe177630719c339d8e89a627606083320312b36725597f4ed288aff53eb74bcfefaa782ae0b7e8375034ec71e0cdadd6a60302abce383aa256816fc68be27e804dbcbca27f0947d3182a7e7c97988847cf94020101a362182aa0b1a06924a87f187e6fcf7e6116ec35e86a610f744491a3e4eb032bd0e16893d48f20858e3b15775babbc67957e1b955b03d25fffe9f2c29df092d817421229b1a365c44481a0aa73383317e6efba3567a290b85b39c6f316090700049b0806268b25a47d1166968c87dbf6d906219727a9dbd8afd446bc5f7352ee1a5948ce85f63eca445d2f6b831cc3883373d0e7903fd290b31c3074b6c031155342b47ebc4e2f6b9bd8707b4811dd9d671cf0d5a3d8dccf310413eddbfd77dfe8c15449ffb0d5e973d6479eac1c65d98eba5a178e7c141f5f544b5d8926cde4fa3e46bbca1e1f73ddbbcb0bc2f33a505655fdc1536d96c13a20710c294dcbd92da37d476971ad1d30a916367c6333556d682aae62fd1908069dfb453bb1944d78aafe0aba4429955a4242f0f9952c9a44a6c1a0efe3f2c4c449d61828c399543e016619796210d92a3860f741ff7eaa2099683f1286641ac9336834e8eac642716fec75f1438f73c0ca19ff5af8e021b12ce13f3341b1557960d5dda8c46aeaa3e88b3a5265272501a76da0d2e3972b11ccff8d3519f13e85984037af5f5241cfd1b8af41ec494a127c893b062ccae99a9142b7c53cc911b7260aa341cccd126d8e423ed9b9844890357e039675816e33e0485162551ffdeeac8ee6a94a65d398db76d14a1f39e24c9f5cbc42cb0eb778fcd345e4abc6d1997f6800dbe60a107d7ce4552a5c3a76474d77fc16e4aba16410fa0fb00056a129a3ef867e5f16a88e3a9ec0c2e9b2df1d515fc22e8391af102c90ee11f61fc35da7c4fa8dff9fa6a1659ff907b828aa6ac607ffb574cabd2ba90ea825cfeecab6d4d265b4560310d3efcf89e74aaa3f78fb92bba13a0f90dc902fe603985a044943e4af548ee35db893c3f2d460f7d03d84d14b8cf0b3c572f021118bf82302d3c06907f1c1f05f4a5d55265c40ab7455c01b75012b691ab8b53c0e2ea52c7290aac8da45f9dde176ed3e4b12d4d77b13800a2a16b3ea3bd21c21e20bf33df2a272432f243dafefb46b16065a10a94abad7a6db7845f2b59b1d781b74327802b54ad1e15f52612903d784b1d832bda7e9809088d68330c7792bc22f4c04cf0ae9762fda74ab6a6bb0e4f6048db4fa997e8f11def7d077ff94eac6e0fa7449a0d275d94dc07a11b2cc0552aed0582a793e43146e21c22d1608f7c82edaa6f1365675074ddb6015572dd7b7f4e94680d7389989a4bd94ac6fbf3c3dffd7a45b06f62d4385ee03d6062ef0aee44fd076ffeecf1e87130ff9f4bc8e98e166a253025d4e1a572bf908fe0525f7905321ef1f7eca15a62e45766a5e94405fadd66667e15576dfab88410ebe35a5d249e6f401fa2173164557ce88804d3404112e7e7d7827f65e36201a080595daafe2ea5abb5eb67efe42df1b2bfadea0b84dfbba92a565bb1287731eba1d1d65c76cba326be984f2cbbfad2fceadf0a65fa61e900bb2bad729191d4b62cb42a2a63d98eda3ccff1a02842b537b3b51d23d7e99d62415ca896aca272b11ef9768387c27eea532ada6925e97a6122019a94e4ecba2ca64e08b20dcf95945f695cb21eb525c4276bba5207f814b70a83a59382032d87704cc6722b087eefa1e12460a3c7203194376c7ea98a8e15401bbdbdc6eb0f837946b36e667be6683d6acb2a05d967819daf16439559fcb35ba86e9b98b60138f8266b3c24bb680d5d6f10485e272c57abd64a84c721d045f781f1ec6e0b9882f0db48883dc18a0a9a1a8ece3907edd489e5dab552bfb0f733684f24d00000000000000000000000000c4e0b1ea13982b3586d70e3375e185c919f05987945670282707261b0c61e6a897be23ee753154c00559b9d7014b99fc313350b7ad71cfd8b380dcb3c665815329fe8a48c091969a8f9f7ca9afa8c742ffd675fc155a9009bd1fe6de54d7abdf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004f708474a0c88c5d7b53e3aa56465a6036b65f5b99312f43579eea2de9782ba5103dd1eedfeba4facb55560f98c37ecd3a047d650bbe97ba83d31b8a3fdfe1a596671fe7bdcd5f026c277a37d2ec23657ffcc21a5920aedc9894d54266acf64de61df4e36204bc0c3e632c7af973f791a2cb06ffb9a44040641e7446e673e4740326e53497cd909bdf21b4ea3964f287bb991f946ce6a6d005deb23a1ab295379603155445d34a65b1029fecde633d114899df0717a65d779c6f89bf6b55e3e3dc030a03848ec6fb9c63e98d2562ce33f49bc3f67bc760ba22c726682d2ecdf9b48f69c902af60c2179a81b0b3015db57e28eb4e19bea7d5ead42ebffaad0d461ee5400205c34d3248153cb207d03f41d9f3f1cf0985ccced823d9a1ffd960f234a21caf0302b2bd51c3a06338b5846af9260ba6d0da3b98a2c10d3e4ed1c2404f85cc710d031058fb99cb9c8620b4167d063e1999e4ce4a27bd3ee41efd167b9d77e0e4cdf6031b831f4489f2cedce35deb5425f0ebe63e03b8154eeaa05d8a9f4b13de3b527f02203b4423631729ce52ea510356b3c253ed7f9f216e3ce4aebad33082ddbee754e161d0164947256cf3f8067d91c2b0a002644beabcb49ee75bf095f654b0705a1f6964587e6a74ca5ffbfa32014d5b91b560cb46ba2eedcf0d0de281ba8ec2eb3d760e826e6e732fa5bcb1c548106717099029785508a3eac09a9cc2652f244c5e6695807a406b952235461cdd107f8f130edbc3c072d57dc193a8a3adb87696de55a6daa259fafbec689647b9ec295de6523b5e910c6242482c4ebedb5695ff5570e14e829df9b45224d612324de3dca8e52583a19fe87d0b8c2daee9b2a5eeefe98547adf882fd011b174c90ad8fde9b558977f89a42baa6aa0afa5d2c5431d2d283dc7fb86516ef11a4cbb855431720661016dd782f32e91a5a8d667cf8845599a216a88a0113aa99626619ad879eac71fad47ac677428d806ed61b70e7fabc5fa56944d3b5ed4b9b93594cb47a183ceebacf62a3ac198f85fa84fc35adba19284bfc408eeee582dccccc65ccc28d4929f347c848b1a3963e9f1edccbb931fae079c6044050e5bd09fddce56ba9ff06d4baef69a08527814a80f7afb2287ecf5599c2923a57be4aca1a7d14747876de43545e013621c4e48be93e20eedb801d3746c3474d6a8290835a8be16c5631f800504336e28ae65042b35c66a351719cbb8a4c5ca93065b1c89d323269c6beac51ec2c61e09d1537d05754bd7777f9365e6108cd177c06dafb80a13ce6ddeaa1e31034e5c825fd456fa70c12a67d9173701b0f6c5f60988d2566620f7be1aa4f14e46e9e0948e3d7bd8fe9174782c22f9deabbec632798d2e9d1b5afce025318692848074ceaa18025853875202b0f829b5826b6018d2bc6871362785e37f1bc802b93eb3dfe96f8e469cc2ab7a2bf00e98aaf406a84176a3026cb82c80f5c8e3662eee9bc480d1fe22d348c76ecc324f7e475ff7f5c932c73d09f84045fd44b1758a8b9417085c82c561f52f92102d01e42815802aa7473b15771545034bace0a7933c11275c22974f24eb78020d8158c935477893b5a2a1f19e1fbf63a7773fdbe71b90f7ec080edaa881c0fc023bb17c30d6b64d2a09568ed6b073b4f645e6a23e0a463c998f6889aedeb4bdbd547987ccbb7e3a1f2434081ed38fb9c93ee418b394883ca01398ba9aa30677090c6990421cc728c06589fe5d71b5ddc94a214bd26991b736069e3dfc804cd4c3fa964ab97b2159d349be200ee9ca417a6840cfc7040feceef72f4939bc87c57662a5960d71d20332b1f940c221566e5ab6a6cda78a7946ef99d1f09cb37e9c19935001eb2ce769cd0685451ac9befd0e91e9d699b66ee7d49c27fbbd2713ec43640d78ac9fbdf38a43d28242f7896723d7d624ed33708add9ed45e6c9be9284e541997ccb586faf0a3eac613cd455da1005249e954024dcbd6835bdf9083f86656e8494b08ed2262ac9fe0c2b2a116bfecb344905ea4cc571bb4bf06b0ba308764d90cc1f4a14d63c93db2e5b6197636ce9a161d4dc0685d4fa982c34878b5e548798d704f564d0e462c4dad2d4532b8170425d79b2ca2e33b25e5d73cfa21a6ba80630804c21926a0ca189bf958385619d5d659d5a8f6d2d6bff7fce5f06223b29c5f63c95d78a515c1e4e928cd195b2b608fea2b11c1808f8679d61288e0a854d30a98cf40b73134f2d1fbbc213397e584bcfb183914f9656c2920d395a6c059e7a4da686ae26f69ba03552a6f202487bdbd84be0a5f0ad4f47c76f80e93a8f19fb1cfd3ac568b33abbd4b55e4bebe975ec21e3a91aff3b3f9890c191c57ae7a7a8c654670dccba399d29dff9793d27da6fb046880e3e6ab7667fc0b767e578fcdb6b93789ba0b01315c96f25d254c89501", "53656a", 0, 825354917, 0, "71c7a4b3568315027864bd6499eff9d8e3a5ffedef6ba31efdd4151948f7219a"], - ["030000807082c403047ab51170ed033da904467bceec22058943741311fa38f003a7af81552ccf3f7d0100000003635300ffffffffca8cbfd6b6643f1bdcdb209a1f299a9c4f50b8f7a9f5e0435ed3f9cea4944866030000000463acac5199a86942ec6164d2be94012261dfbb234175bc1465fe78e50ed36072d84008046a1e072e00000000095265006363acac5152ffffffff4768f45acb65d522ebf9dc1dbc2e57ad86855db41d61d0d55ca1e1b0fafff6540100000000cd4a6989030d0bdc00000000000100d11b9904000000000046f040020000000009006aac5152650053533c745016000000000100000000000000005094e20500000000e2d43626eebb6688f5f42c98de09b33117aed5a9546cda333cf928c164b6e5113bb98c19308ddbb462fa91e53d5a7546f9211c5d7796a5009bd562cbc77dc0b5bd06b2c1590dd3f775f8b3a15542de2e9f1659b5c6fa9e27fa9227df9dd2417d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a977a9dba4b43bfc148ea39e061095ec37fd3e195a9b390c0c75aebbe711b59519ebaa2bdbbffc0fdb979c1360dfda4305044f345f86894f6031e779b5d9c5be5ed0d7355c5e130c874d1247770d08770789e422900e6926067d1fb0235b354926b5eaa69179bad80132aa10416c177550a5939a891c147521fab4393b21ba100306a6aa26a20fa0b36ad8685c185dded9ebf0d66e3fab7d31efc5b5b5354fb1f80316d6e5eb644cc567c9e5de568dd5c6574933d08c399af18d5c9a676e4317dcfe0a042860af127b67435004a5e44e2735523ede0c02257f768fe9ab44f27dfeb826353f18359afe69721e1237004529eb4e8d239ae83f161d8917b18157c59dbeeb022277eb96b58be229b15ea7d545e4273a83c4be0601ea85fcc7710cbeda09d76902185e5c6b5c7bdd2918845b0cbe284a5f36877cbd54b2c926a5b60c99e0c9ec8b021aa5c8ff3f40271816fa033933a83d7a75b7325d9061e535d47c98b0a0bad956032f771b585b20d5004e98c82d1d33b55e0ec46a62744bc7772bd8fce20b18d7b903152b36e68ec859f15e1e95e853c16fa2abe25e30fdeb65cf21aa2113a21cc1a472d048bbbc24063b0200f1fb44995c6441c50aa70ae345fd0877aeb1c1a386a654edf5926fa8515dd694acd589e517f8535df65f1056fce315a01636cd1dfe9973dfd19ea61569b24793093c2eeeaffa0662e969f92b9af1f0b4e7ade8baf7a97d5c6dbab67bd6fc758d519d913c72741bceb0caba914b60a6f3f5d40145b9ed4f02c14bb016134c5da970923d44062ee3eedb375ffd8a019cbd2c5ecd5d0e62e647f3b9a72b1000b8417b14d1f29bd02386632942725d9ffa3ae8671738bc1b1022ad102596461668f10164dd28dc1654adeceed0ee90141ff9157f6d5a862eeb62b394ae965e3bffcbbfeab0dce5067cc206d47ad2b0f926cb69d4133fd970bf4a2ddfd7a21fcd72d6dc29f63217c87d07947a79fef4669775ea7605dd5c284b8c1d6464ee5966d94f2d928a08e7850955706ca6182538edf8ff177ab5ffa013570fcdddb1f79ca646bd326387d8849cbe22527683c8d1566f797fe581b2d1388e087f3e3bf0699705b579cfdf4f4f7ee3076e3a41eeed1ae4cf9eeb706c5afd1811d79962faac47200c479a87ed8501097c407be963374a162e5d73ce4c1c4db9067600ea97ae441513ebe0c08caf63b7301b323ce835d102fdb4337c3898f381143771bd316cc957b077d30957425ab99c35c19a88568e1e0465ffe17a0fe09eac3e54c077276091c45a13494946593c1c034bdc6697f2c44174fbb6248998b572a3e35443f9dce65e47585df05b217bb69953c4d6c8bde359aa20d4b2683c2641c7632a53ae1d2e96e6e7a8e53e1c281e1f980f068eccaba78b25520ae6e0c34ba2708a4fb960168ec3cc13af8cd7b82ce1376b557f09cec36297764c033e675920202a505ab1d6d127e89962fc0d5f8546c9c38c8090cd12b2871a300ae1ac34955e7eea4b649d4bbbb6959a15de02997db49d0141db8d4dcd70972d5dff79e21840224968828b0d0275b7a05fa17358350f5be89c41409870e1c50b81d0d9912118b7af9839d44a4a85410c9bd0d1a2b7018d21f86c74ae1c6f15d37c6e710ecd0d7126cc23a6abde468f7e40151facfa013e3f4668fb7fd76ab4a7467f48f544ad7ca4e5d835057fab8a4609b8c6de7f8a2fb440e6686e0381284068e27e085b9d77ba22166e3e20c2e1894eeda6d4627017c271166d8322eb43833ba50c07e69d7a30b75d6228021344b7969ba10bc99e4e5059c1a74a65cab25102d602ab0ed2b50da47bee9095d97fd4cd1af464c6e4a0c71d05af7ce9d079c536003fd205138f11e834344d537c228adf97fefd4911dd56c446070fcc37833e3b97f8f7ef5044b55da4aa1d1d1eb0d18d63ad51434599cdf24d4c0c4fbaf6c4720154671c9262256d863da0f1a4f95a5b63243976723d5b463171c979adebbd6d70c026f51e9fa249b0a0b76f11441a27986685e75b015db8bf6bf2f0197ef7f14e30aa86de86dc1cdd0d35ded82e36e3c102227cf2a89c7f4d5c067353190d6812e71f87c9b4643efaca0441c27aabe4bd28afed863162c05ba08ac34954fd082e1fe6bba56397ce78913867fe0b0f53ee60d835af2650c5de62028c76e0c4ac8d991dfed26939423b433b53a8ae38fed02b57ff0eef706fb490342218f072e2f1c97f03dc2729129365c3aa7807b04b2ddbf5b532de22f4a2cc508c1bc5899f6e606056953db91c46f034e4985354971c045ede89b602de3c4c0dba9c607e36088ebd55e54a834e3f9bc4f0feaf59ff660085d18598cc38e0b87d8ae363f462bba66d7fde84a9c74e040749ac38ffe3a394330efd25a117ed7e0529d216801e11ecf84970c63525deb4d6dfdbc8f912d008", "52ac5363ac516a", 2, -182386374, 1537743641, "6e15b0cac3d212c9a6392d2067038c9efc8c4f4faf6c700fad6f0c8e81f1f016"], - ["eeb6c62f0169fccbd8751512c7b8d5d378cafa606563738a410a7c73f54b7d5b54e77911ac000000000752536300acac52b8aa1ef903466af6010000000007acac5251530053e49cf8020000000009526565636a6a6500520b4198020000000009ac52000052525152650000000002259ee401000000000000000000000000ddcc8805a9cd6de6f19ce68bfadf137d74d4feb5c318d4de9dd0347ee40a2aa4883dc60b4376b157ac1eff900e2836d10bc60002062d1cd5673ff3f42ca8f2fce3bf610af122c533c9bcf03a8bf6f38e57ed29146598b022fdaee3135f9a05b200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000776bf6744ae79c996d693d7323f17713f35a37d0c56bd9e1492ab0e0dd2a8405bef6a4b47aaa7cc0c7a38606c14319ff8289b1dd0bd2f052a5e5e02e1f5d13be6c361fa38091055b77301573250fd0732aa33ac9b3668efabe907c905a00573200ff1bc16b772e384062ededd67f1a12de9ce9e851f7c5b180fdffd92d1e1ee70329a159d7371508c7b07365b73788cfea4c6d9b986ec2758583e2c1d660e5ec070206330a51ef00b67c18289936f798838c6395ead4c9285294985295f12ac073c70b05680cda46975e6d69607ca0d14c94151e8edce9adcd229d88ce7bd110495c76f464fccc44b2384ad4cc90bb932df9414949ac617d4b5ba48b41c85bab6031b002228a903d4eece8d9041a539cd56c2f0f3d472a8cc16bd0c9a895a2abd9f90f64021b79a063be58403e36b28c179589a47145ee5c83e1233e37e266e803074f065102054e5d0083c800b62d84ee1708efe87adaea0d67e7386ebc5541982bf3f6913302055b8941a2d994d6789c550ade1702813dc8dd3333a5ec1e6baebb572ff699000313831b7f4b1d590b87aa807d098355904048e9d2a13fa75439ea55cb49dca20cfbef67cc8055ade7bd4255f0a3f7302c021cbeffa46bd39daff6d966bd6be0e4bdb8ac3245394ecee34b6bd17c42efe8b499e54c686b2546b628992bb23592d6e3c01181bc95b320a627fc46c63f90872cda81de66470ed0a9b514c255e31adba69b03f84d5a0c60f138dd1c6969754ddfec5e59dd0e73a4f38d9d7c1762b77d9862216df4bbb9cf72738643d58f4f2db3298679ea45d56b640a88a5a9bbd63043bd56203a6958c10f34119954d6138a173794b8cff529690653cb73140e009ad3752309e32ab4e3984da8aebd4306d355010e9cd4f033a213e072a2924d3179f96865938d5467a61f7fe613044cde4337fc8a61a8e799be6fceac8f2411a0578bf96859a28e852b7e2aad5b81c56545b8f60d8b1de49dfa9502d9cff31196b8422695061eb1d693116030fd244d3f62c06b15ff81f16a8bb52d8f5ed242b91351b92df7c9741cb793e3c726df6395d2f1fe85e681a03f5558f73e2cd4a9559adaea52587059ced25a21a46c1154244df51fc6a66aaf15d12c539ab2c6f4894682c1b7a7d1a4683f53a6024ee1a1a4f9021cde4a7d99cf78d5c9c89483f25cefd2322bef3fea383b793331bb8779df53118e26b3663504544b16e448395df7ecedf694f501ebd09bb0244872b98cc7e4996af9acfe3c7cda4df889be3835f82b6df726e1c35dd31807faee06366fb4f33cf72ea9d8b5e1df6b901618a7b895bab3dce8da2d2c7f0cde8b21b0fa001a1b5f2212b00d90242814ae6e8ad4276e6ba73745384d30d3b2d0b17c1dfbd9c285eb8f30311a9f0c798ae41e9dd59b4b923c66b0b1a8f3e0112c7585a06210e969490bb08234391cf443335ff71d893a89455f5eb217a42ddb8f8410e1730969f664d801517e1ffab4e383229314cd3b8a3253d12ec21c29c9e2a10bf67a2338c2b3b46eba8624e58c43e18e1f42364b1a5aed3b004419ce359f6adc7bd5301b6f4890b183c69f4febb6d4292788482d9cbda1c4837201d6f97e00dc937f25b9f7b068400a503c19f7f83456b590a2aa86096fef3cba802d9c6cd49abf43117effde5e8fcf3039af7777425ed75c63f1712c959373f8b79dd4a9e052dd78d90a50fe7df2222ca8c6608e6e5f2c3137c5bc85ad69723aa23aa323218d87ff33b5cd875f047cacaa3cba3ade0cf6ccaad569f73d772b54576c086ea85ba4b4ad126b56c56fcee9064ed4d099ae918f0060999c93d835d97d41a23da523a25f1c23995c60b46ead9c799106c9f46cd60f75b3fa845dc110255c1250b38af7073b1d85b60b28dc9ed1eea005bbc5fa1134c1374c785e2462cfdcbaa6f56d2a120a3f18e3718bdae6a6e357aa8d347d39c69e9cf74bc88fd70c44be7cf5193e573925005cda6d7c6b6b5ffa37fdedcfbeb4c701bb48e56615fd202f0b22602b7cd985d5cdd54c247fa7f56d1b281f668e151026d1ac6dbffe1b5e80a23aaff5e6c37848ad94cf773daca43462446efdc7c3898be372af302296950229aaf4a34b0965d01677f362a783fe0610351eeaaa0c824e58b7e507c3eef497f638fc09ddc48694887675f5d4744320e90ce49159b93a73bac045548dc81e4d3fd5f10cbeaffcbc2cff43f0f931b50cbef6a659cc161d3a0b316ad8e5edf0664e174e39d443fe6dae98bd4e8d06c186cc796ed6ff9b5c7aecec2a234342bf453dceab933c5c64eef0aa00000000000000002edc8c0500000000739ca3b3c8c527c080e170ddcac8b1b0e2797d546920d3bbdde92c207b82228f72521ca5d626bb858e4e6480bc05222496b539ae4565a092dbdfc466b59eefc1425d24f9a199b33141157cc8f781f11272f0af9dde05752aea753fae485c1234000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a716c3c8bf2b41237863519a56478f5e04398e7438056b5541f9f50791fa1a30cabf9d1ecaa57657a68e151a0b20c01b61610e0c4d924b476826517ccc2790fe3f5a6c4f86ccc763786575f1113adc3390018f0aa328ac3fbec6b1afd7c49012c20e2b5f6e7c1b8d371f761f4d6eeb23ae71a5a5871323b69f374da33ebac7b032ae232f13f15ae7251e7a009e6cb02e0e87400866a33502200053ebdd16b0cf6030afe9ada383223e1c891d421957a9c7da2b31304d4962070ec228076c8df59cf0a0877efa5a69d01c77de1a0efa4b1a7df0fdd2f323a456139e6214b153ff9c25261463437865327e344c264aebfec7d1bfd43a31a170aaad9218986fde5ea51b203253fb99d141f3ca328e52e88daf7678508be576fd1cf1aea888a0150fc4ee1360213e3291a1bc7749da8f384d7d5a75dcebc77f585cbadc04d38e249f12c67271202214e738103ce624e6a9479ba0ccdf59674d060390fb17d5e8fba94e579d81039031eb4f388f947f5251d83e244151fcdd648dc16391007c0ea8106f81363074a100318982486fc4950f6a60e879ecf89ccbbd34fff10e7ac097297d88bf14871c69499e68807cecb3fed3099bc05c5877d022b4afba8070df8b28eec17f72f1b8e199b012155626d954b98c0e6f1fb7231018ec1b4dc94a960aeddfe7727ba54b24da7379b2cfd805cb82c218e2645bf821e47655e546065a9fa9ecf572e31fe646169227885d54fea90e791dbd7fce5b14adb89295dea5dcc827da61562b521e49b055fcd614b4e2dc6686efa7afa9bc085583d1ca69fad11d6ccddddaacd420ff35252c9992d76d8d76b6af0bb5cda4ca05ce4efdf27f36323183e51421819d0ee33f823251cac312d6123cee26caa1e2782e53b5096fde1b6bcbddc9294159affd0231864e4493b7df3d3c82b87f48ac5253ab28fee02ddec08c00b4f7b8336d43878cfeeb86dbb4ad38ddda4a29253a19b97439041d6c04c96c1b9bd33ada887587b253d70344ac20d3f3e326a883947c4ee77e5a9b1674018250b9c53e7fa2edc57c1a8ef4c4c1497a56a8c3492e18c2b4691c6521427916307f0136b31774521966c884c3880b864982ecfc638599ed2aab142a07688820d8719b1f9c742d8d4b6ca17630f3835da73b76f2cedd5e378bd09b8f737ab52572c60e025d76a8039116c685928046f5c9ec473449a1c8b95c8f279ba3df2bbc493885c10e2664063ca81bdc0f4c0a121a4163ab504baae3b86ec51da31421e61ae8b9043450c80c0b49b655625fc6dda7192d4c0e062c1b4774cf283c0ccb30b0aa048cb0f53290a5298a3e49b2338642034a5d77917ec71d48e37944681b60c85bdf724844aae816b1dee4f6036e6a3c0f32ed49f4fd84cc7e8853d44d80bd0922d01e1dd5341aedb5dbd222151c2479cebeaff99fce9071fac1653367e16d8afb408fdb66b88d34c5a1bd786f503024d6ef1e60175f789a636dd1002259c1a025608b0abbad418569fa7837f2ac3632874113727a6a1ec7b547deffc1054f4529cbf0cf1e66d4686dc799e98cfa965a84e032394d1ee792f4c07845c08f24679ac58f613f93a1b3256e71703fb314b7cb6f4c0438822d6ef8583af5c6695c331fee23bbb057963567091c9d26a8f733b247d7d38772a79fd7b27e12626a07658da6743af952751d862eee0f9618f1da54d7387a2701be8a895d84d36926a74689a74c53f769e32183e0f91b4157117dd681d06a538caef8148cb46cbd81bbfcabdb622a677e55428838d94c0622d75018f9e040925d8351dba130b95a0828376409d58e7b5cfc52d39928f546253f8e7ff939b9d74ad767e9f9c7ed9ab83f8eb3fbc129b60250e666fd2d115513b92b8fad46f89d1895f0d339f6636d123a8c9b0aa1de479a0601b98ccca1cfd3a82025534b1ffb814da338a859da2b6d2af83040b5756e7d96b5250536157017e3446ef64159fe5ba4d6e5ede2cfabac8e57bc1d62298391acf8f29e5c7011a9e1b13eb7ca822c611269432b771af0133dc93e8b11079e0128715a0831d75972dd2d2d8699a3813aea2e224b9c98a5f8212ff3e4b381857af4300dbbe8d88eaf1d704d8acc121ed266dacaf523700de6ebde1aab69e4570a21d1d996e9b72a0bc33d696adbae52f96eecf44b0c58e33daa31062a74c1864810d2743b730b9011bdde2cba92fdb7d7d40bd5b15cdb399bbd62878c65762951c3096fcd4377d0f821b2c189557971ec4b679e8edf71d7fd9ab30400ac5c39ca16556c893289652e8a7185a2c785c38c56da5e51948031beeb1393419f89e5882ea5306b9308ba4eb872febb95e8f81bbc3ddbbc807b9407e906df946d77702dbb5636931d090774cad77f63ba68a05b6f4a17d86caff88153ec91fce14d26c50eecfd0f5489ff0a4f63baee9f57dc5dcdf00", "53", 0, -1842595369, 1537743641, "c4e055134970052ea5732d6327715c9e43bbf3cc55cdfb59d6510faa69c25f3a"], - ["030000807082c4030105e85e6907ee18edb528b0737fde7caf636b26fe0bbc1e55b8802c91f0d5f5a7000000000452525251afb8ee2103117adc04000000000765005251535252f48ab10000000000065263630000632b066204000000000400526363ea1ea22c0000000000", "00", 0, -1625358732, 1537743641, "7cac171110f7c559bc16c9f03bdd13235489e741f1e087e75482c0ddf82565b8"], - ["030000807082c40302fd0e627a5b828d9f7295d9401aa50f75f73cabf6cd5ffec89dcb4e80c03050f70300000004655353003f7b6c5b858c6294e49097bdd1801647b77b70aa202f14002087fc226ed9487180afb28a0000000000ffffffff04f5ede202000000000263ac0ebefa0000000000001f66aa0200000000050065655365607a9c03000000000865ac65536a526353688f03220000000003000000000000000040bc30000000000009c167667ea9a8a73d881ede73db192e287bc0a03b5f1223ecdbfb64bd4f1bed546bdc0f795c8efd0422ff6eb379115b8ebedbb9ed95b2b431fd0940168c468d57908c138969d37df4da25b20bc058143908d53d1f6bddd82105b0017cfef82b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085dc602b9963cf319cd5d6011be3a1459bad0580c983d5a84effba5395044dab471fb51d056c934a1b1e734d697a8f0f9bd5d3f38bb81c0300c87ace27210e6888f1d604ac79b86c8392cc7a552cca213e8851051ce4637d3d1729343e02ac0cf457e088a6a16394a6779fd0b07396abd2ac2e299c6e845aed555e3a4ee5e593032a4a884de1a7aae18648cf67ef631ef428faeddd561f445fc468d629ada82b9a021ef602754425191eff60b034d0b2d0229c097f42a02d4aaa19c13e8c34ad9a2e0a08797221b82e75182f5e9f218ff03aec044a68f54d17709d5f1f1585dd0759a82e014cf41dc16346149a7603efb9f18bc35619481c2d333bebed13d7e689f794030a528c33870bca97caf72d11ad4c83d49ba7f48d0910a9f6e7ea585b66662b66030238e41ee51af17e7824f4ea044615941b9be5d1e8de543ad3c7097a24b7d47a0328f966bfb3755f290b8ffaefbdab298298b2c41b51ac40a9123a8470a4ee91da031188c9d6218cff5275cafdcb6c0333fb1661b1e73873e76194c6e3672cc180bd0225794867f5e9f27c00fa941664f388fc8bb56f9053ab7a5416476c24b5029bcea2fb7cf2abb88264557a7a3478e7f5c63fd7744cc1799b0966e49200cd462d51cc290ec0b500073b7a5de97982816c7f41de6ce05fb8cb4f13e41f59d801583dd7200822896f6935db1275bbaf011d3ed6cd090c2f4df80260000fd46caa974cdc10b50178e3304206100833871896705a43a16e5b7a89e33ecb552966f021f99cc809001e540c59ec53d8280e726fc5083991eaba4ad633f41c6458e272121d79b93b4f52ba535ea16bded405f21aeb3993ab55752a796113fb783bf9e715d6bdd9b749b1ce9de4a9a5e89d3a1b0329766ef686aaea156cd47897594e805dbe3169b02a3dd62e47b225ef720b777d135f5b21dd7100b77627722702a78345f981106c87d056f19674a439f6e44b34d4ef2e53cd12c63d535e94e34dec32961a307ceecec2f70cc5d47b7c88fe69a22d00da0503de7ff16cc4096cfb35d268bdade8bf84f408eae1a6d8d1f546279c5635d2ae42a770290011e4a30991b1e835e716056a123de58676b9df2fa8d05b089c63ca01549affd141d974f03ac5688c3fe26c27660e6bac1fc4984d3e545f7b9ca88e9072f15e587ed0312344ec20505e2622219b4c5889feb08ce150dc8109a10b0b89f87cb08068e582b5f67090e63f97108b95d308466a5da8fe329e39f11a3b70ab2fd263ae0133c495a03c4dbc52f8df9c920a36d92a0e423ba644e80fd63143686cc9fb4002b8ff040126fa895ea8b6a97fc94ffa2a7fb5716b5a1219dde098162bf195757fc0dc247795a7fc2ccd56bb9ef53d5e5a0a97094bcc0817337ce3b4a4c1900a37a7962c502774b5040ec198f081a0f401397c872fe7026a63f88ffa3899b84d90bced1badc5b1c70834dddd7d96d9ec8e66a49de317b94bbe3b2f40111451da5faf1cc1639ff804edf4c5e95d3e8a97c485bd1a0a41f1264068b103cb256c3cedea31a788730f3ab1dd0b84513033a89057a288f5fab8268ad3395f982a25ffeab393ef56423478c131847d4c216783c220e9158d455b77fff7a3014236b2d2d73b698d6b6a52e6ae5a5b9e09ea49084bc558bd48c9fd86073ca556da5ccf98b915a49b22a6e7d2d6d5b2b7fe524bdb44545d34ab471144a374a91442fbbe3dc5fedf048c39540604723cf27f3bcf51bb900497ff80f07edd80b62d3805948fd89eb777604400100fbd7a7544414ca891be7f8f7e8e5d2761bb6cf47df5671a98712c5f200e1e86059077d6e5e813ae587005c208d3da1fb27879fecf573fbb53a22edc90425b291d81119f8cabfb7a48ddab2d1272e60c7d294e828e2a417cdeb75bfd078bcdffd66af276f88988f797abfb8168b6fb1206ea49fbeea462dada8face3ebb3d147c2ed6143bbd20ca59e855d25c04f978f50050bf91198628b3a40fc7ec6aa7c46813a1a71982558c4475e85e34028134ee4ee28b23495f4abd2ae33f9da7a78306133b7d01c42407b18f4140b773b3634d4e2f2cc6ec45b53d3567ff3a51ab35a8bffccebff7c675f3afa4a592af79c3608bbf0d797677f25d7918c8f6f2bccf80d4607e31b1d91e740ba42882cf3d87f68cdea804f8891731120e05b59b17c43f74e4a7cc1caf53cfed99fbdd8bd68fd66583d68bc46c2529abb01b921836c063e8c255365c8feee96d6379af6230bf8a4efeaf721718636551a554034fbc5bdcd5a212bd92d8ee2ceb168e6b6640364783abc562f02000000000000000000000000d542e2c69e390457644fc88d44c1029f24361008487eb3a0dad38cf788a564cb64741969b88f747ad0914f042570441cc49538b9f9379c847f226062963112044b56ccfd0a650b8ed64f1d29272cbb6ee0ceb514f151dbfa41c60c0e0978b2c9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f6b3e66507b919e731d19824083bda13113898c6c77ddf808684bebcc502e6e3afa41c40846b4a24ba6044a9bed158056c0b1ced07a184e1f6f06473ce3f75121af59b0e8ce0ffbcbd96b498067c83f7b1c258c91723c69bec90c5b07ff6918038f3e15d7a4cdd38981363d1e2d1aeae625086ee4bc4f09e3c0315e12117693021010e745469c9090ae38cd1adbe9390c501f1f5fc7ef4addd98370e850f8782203014083382458c804ff1b855c0dc93891f21d4a6e30447f09edd37d9fa144fb7b0a079a7e2440522ccbb652422d39143b4d582b0505dc19abc58778f1914a795c340e58a8dd32afbcc0a5c2fbd383b470c9fa598443d84138ffecfadbe553bf4d3c031fdcec8e457a58be2451846d8ca19178e223cbc9615ae2e9a6d6d1b924942f87031ba180e58c611a021e3852a650e04acf269a16a013960213b5e11d0f323347ae030bdd0dcb73d0e3319d63739ef81f3977d1b902e5590805abf8343aeb118dfafd032db24955b3699756a531a8752ccf4092317b22b2544ef56ffa64db21a35ab281031c11a2259bda4f2d281bcea0512041d8bb98d14b25aa59740035e39211b7bf534aa454367f2e58f494ae1eb17934ae54f2d2ef8ae4582ab6b17ff980cc9fbb7d77e5a78f7287c4a82dbec872e781780fe2f301c944c9171752f0f76046160d4ea77768c86f368f95b44c82e1a9c5572458bf17d3b052e102c5a16094f8d3a2c7a0b9bcdd6646654c7e925724aca65b120656fa8c7281c41a026e613956528794fbb789d9afeef3c7846bc08444b6722b756be75eddc883eba235768ed1e423b9e6ec2860baa44b6b075fa4e8b5477c58abd4232c1c624793b4315ecb902f278c6a129960e2971eacd72b51d56f334a801cc603bb57c392dbfe3a1b696d9de62193664a350ba3272b6632964e0f09e949ea6d3c7b89f30e7e35ba1e28eca50847d8f884ba71e52e7306cd9a45e7262eb33fbfc53719e622dad6be196f312efa75fb6ae853281bbb90903bd7858499af0c56125130c80758ea96b1862504a1f64389245fa50ab85850bb56303da9e4d1e0563f548e52472dd95892a41e2ede6b65b84db6a7ca059c227bdc0e2c602beff14ec3c8a538e359eb0f0f13711a66e92afb9f3ad18f519304274dea256c4ed95745e3f6862c498d4357655a53ffd2346c7d6ffabb1134f3706ad01b805c79fd419404926a8f1912fbcb3a55e8d435956c28416e1ba10de11118a7b8ee902ba6f81d840402ee11a2bf02f295fd82cf2d9c51d62e88b62660b51920ddf5769b77632dea96a005f96c1b6330322ce26612fafd8a9c87271110856bc939fa5c58aba4419865a46e8f888b46bb0cf04760d6ffaee78a7b090cb96c72dc440d757f915c5897e802f499bfe8d5d710e0a24b1669e57a2b88b8f2ddde568bf41f365c79861eff76183d65d2a5b5c592449be95b574b091316b2e3f12e301713db6672676d4fa266556a4a17949bbb543dc76fed001ef866e44e3f224a4cabc754fc55b1ffd7a669e29fb8d886b1e3f81662e70a7846c8e9d324151431c77ee4dd40847361dbbce9f265132f530fe2ee5a41509946af9ab925e5abbe83b8354e6bf0acfb82763bdd48808857ac0ffd692ce5dc928bd48a53961e898815a7599dfc67e241d93a1f845edb08137f6b53259557533c401b6b64601b854c2791f26fb6bcc851e421252d0bf81de12db8bcfe52bf74260cb241beb35838aa3f02e2baa8098512ef58929be518730088d45e8b1fab4c8cbe000483012bcd3a73d75d9fe7d04e41615f0f31a258450b415ac2a8d13c50c4de4b4f5f8da639eb9793e3e7438d3d41fd3622cacedbd2c337d48be703c16dac1feedcd9411b1fb429e297e92492975e688e433a4a7bb4747d7e73f88e9b6c76bfd2c6fde84428b2d616a71148a2ef10d062bb68d7e0d44d322d76385948b489bd92e03e511e6f340dceaf5d5826c2942b991592a991fa64421d1388ab61ea32f2e13dc903ef9ce36df919ae802258cb7565ea46b69f9e59d0a61a1c5563085549f344830af5ef7116ccc7f727b2ed39be4aa8a1f5fef6f9d76ee80bf0778bd705b7c50cb4a7782d43a52f227eba21ff00df1901d1eb0da1614907e389ec2366cc72e82515de46d7583c1decd84cd4c8d71157b9344e485da97e6adc15378e03853700ce144e4b1c381dc32223dd8f29de8bc2ba4780dce90e5a3541a3f3dceb0e12562f4e1ff105771070b328272d9e506c08eb8bf4ea1216da8e112b1665cafe6ce00fc8cecb310ae84e21fac28613f8df2b8a400f0500000000000000000000000097a4076529ed86d70f88f85b15b5a8370d193a108db8c633254df810ea600ce746994e37e63397f973c460fb5c32400a79f9e0877b84c0dda49444f925dc0159fde9b17eb28e6f3d1c3f00aa69c28ab9483596242361b1dbb11e53dc42a273000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000094d086d25b89b7430f97170fa1fd41e2ef478eca11dea784440407d4dcc12f21884c74154160e41f3b978003fe93e425ac3c40e3bfb6b5788b071400f266829b1931eaabb482af602fa6b6ac731f6e7dc04d1554e4e8900b16712dfe007e92883dcf5370a3b3141158700ced97d7e5160a542042da7431e750f1f55df3ca66f403038e10d842f5f213b6db48ab05d815c7b5075c4a4bd666f86edda3def8897440020a7c9572aabe2ed90b23af2508182f263fb6cdc34a0998450def6be625460fde0a0281608b49b12234e91e9a41ea9e2935db711d2183c5aa911b5e490860e858491188f7d606bfa180531ba6f7b1edb2ab832dc83db2b6417211b1b04cda89195a0320a66af9846e403fb21a15ece4f1af3689a8a40032fd0003516c760995dde22f0329a3a9b4cbcac8d1ce5a5ece4d6f68f3b345d179909518132e513e3245de6ef8022edffff0c97c4de243b7c92b131511935599db4740736a6683a8f59d666bf3660209d5b072d569bc79366edb37ce1bf5cdfc7f691581a6afe7fec94af4913d5ea8032c9afc612bf9bcdf6948b3a0923bf47a74cb6f1dd7b7b2f3abe07f6bb2d70eadb3fed17f058fef8951c9edc040c7e491c59122a57ccb544348c390c5864fde088d7783475563c52484ae1c82d5436d95921ef4d5bcae1f54f1fed2813c1f68c4f84a7b91bcb1ff12687f432a718c9fc49ea788e3c805abc9f8d105f588c4d1e21c2eac65ab277e1bc7d0f47e0765d30dc89e2022077a3e98280c6d061979211acc6d1ff4fbe0489e0b607eb97b30fa06444c0abdd61217e9646f11819e834f59612e42a320d6a7b066c8fd50dc7ec598250a41c9cde9ea06e52bd63b9436b867ac1bd0a9cbce8a9b075559c44d3208a4c8aae456267d6545b2c387379ac042a70929fee82fae0236d34f476ce53bc35d59d207ec23857e62454958cf8689ca58b230b365ddc57c171fd41ffd3e61f7110964f52e0eb06422d20e589da21c8fa0a5b82ae2091f627ffb38f80721a46cafeeed436870eaefd518b37c8621eaacf834756ffdbd731860652a45ec035205739690b3aa25b2a67c853ef594a43387c6d59ed7af53cedd92c09150c661bda9a5cefb165a062ea38d72e14dc7bff647a4292a38758492e7476dd8674c8d09e42fba6899884b974a100c5050ec1f202d4ad650124dd8ab7f27a348bc573221a51f2b7e5f3651630c4d639af68fa114126f60df06a513794d41c4f5a5c70f9908e2aca6be3d86ea5d208c957f51a9b21fc4d6bac08aef4534a8e3af6414abef892e62c6448d2732b5ac26aeb37cf468aa93611c5b2f77c1cddb80b064ef3641e8dc0082d2a724465056d4c6b19e2824720679ef4270d1e4ee0a7c6595c28df420b128ea3a5a08f5bef6cfa4839287e0f620384376a7c09147b8041c3c0d0867a01b6ebb52c53fe19a110aaf289b894edd2a02841464c624e51049ad35dc890b55df5a175a31a21720b7d755819b8436a8be90ae59c69a94096fd65ab50488f72f7d0c1888ce716dbc3b37c994f513bc0ec39c3a972a3108bbb47f72c3bec7dd8f48f931cc0570d4b1a97a4bb1251b583c49ccd415d5410602932701e01e2ca8fa41abf9a31fae36abce0edc4762d93fc4608c8c63ecd5414e0a8c474be15e2f0690b0ce91590b22b74e3529175b31e61616318a8e349618275f8dd664fe9c5126bc61aa9af4b7d6aaec48d955276aad61dc7a77ca8d32d1f56228402a7582ad4978cd7a9968f4c669c2a93e2cf5c7448cad12b99107f75a500dad3422dbdd119a2cbfbbd89645fe1efc5505264694fea3f6b4b12c98856996f19928da046b59d913a1053a75bea3a95f06b231b59c75ab68480d579fe2643bcc470ef793ce4056cbf50a4d3cbc0b39259da986962b43dc561ba9fe950f36545e814037c9447e6d654c547b21bb6c9eb11839114ee69e7a664847670a3486a8f3863c3079f43d9a79fd46c31a87d4c843ccc8870b15ef0c326609e5c8a69695dd460498e9b4c2e9a46f31dcdf4e2d61bccb54fd4041f239688e5b92dd4f2b9802cab042db020c897e495adf8944011eefa30da8c310907ab641ea020c7787f94355ff787d7c862b04d98a66e9cf1ca3eaaf71b0de7abfc44ac8d5de41d0b9cab8235292257a51e8fc6430ece125f62d62adb99958dd7ca0e5708953548abbf9431e40b812eb74c7c5a0913a27e7208229a444daa11c9ad8a468a7d4b0feec8392badf4f3639d6e23ff01338da677306caa94b17f0b410e73a1677724de657eb9ded824eb1b2e800af7fb25db22e7e8c2c34bee433c1b0020ecd5cd5f28dd0bd4a5cf358d790cb9505611fa43e8c5f6c95c4b9a3056fe13001ec214864988ac3965a9c2a95bbe06df6c07e6bdb0d1482c13d9727660b5e126164246f48e13f559dc2c3e5109bc115421b04", "0063ac0063526500", 1, 854163597, 0, "c492c260a1986187b20d471e2a3d9d397ab7d562ce96b5e1ca1560d1b6613875"], - ["2bbd2e6304cbb4ba4cdfb757f9f9b8c45b688b32c007879943db4ccb6c188a7072c61c58970200000000f75d7939dadb5e95810f3f33f66ee9211e7a1ac24bf8907fa0a3dc2bf589bcd077a59a55030000000651516553acacffffffffaacae6b461a9cb0438ca010d4fd80495f318170158f33bbaeb02706d0b74931601000000005021a0ef0aa11e2494227629f74f5eced6536075fdcf9b414d5ea7589f5c4c176360106e0200000008515153536a536565ffffffff03b27627030000000000923306030000000008536aac0063005165b8f059000000000007656a52ac5265ac0000000003000000000000000058b387010000000038938434761ae27c273f7e78e4a99697943d5531281e19e4e7e30306400fc4c90f282095b9e4bfa108acd771f169babdc00c99d0ad31b19cabb19c496adbf1ac5928e17699e12fc382cec5bf0d5684697fb23e4981a3fceb1dcedec25a362d9f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bbe6b9b36e9ff1047bcaabe5caf104f8328453fe61c5ea924f615ebd8c4d5a5f31ae25f4890fcba5a1a6704fe65018ba7458a9411ed5175e49ac900b5751b176b99715b188f4ba6a38ee3b7014c890fa3d9c0b64159e2e168b39a09be840157be6b6b2ca4ded6f4c010cce1b6d5430aa5405d37fc064e0b73d486b54db482a530211bea960d96d045b8ac35e520c47820703cd22155afedd39a09ea9a72f0ec5eb0200482918cf5c214db1760a9ffae380393c55c8d320580a44eb29454583ce2f0c0a0574b739022038be7e55324e4f4abf9ebbb2f3ee651593886265e37086a38afd673e28694be6cc61d3a1a13550666054fd5b4f4a75af50df60bfc5c6dc7629bc030e0067b1c5b2ef064c3e061e3263a0d1ac55e52a85b81ebfa7dda2542dd33daa021c4dff006cb756336b9db0967ac45397fb7adb65ffd62f3af5cc2b034a90bd6b031cd7ca9c8e35e6b8e33996a83ee314772d5492d51f78b4eefbaf8fa5b1d38d64031ecb26316f3f4aaf59f24855be8a04d9fa6d4a72cfb56195fde5fa05406652ca0329bac065666dcc1e235d1c3a1f09d1cd15ea1441ba55525519b207ca4a5bca49bd9f34e5d643d5e729c7164b44519618205e4e38f5d929c0e084ab3cca0da0279ce2bce6d6ed2e50b9ea281e2fd6417d5fcda9937d1ac60068469a01ade75d978699368f02f7298bd0212b22302c66743a31ea90e6556db821be57006605a60b10b26261daaaaf6631cac0825d9c1248ea03b4e9c882af7779e7afae5d4b31b2bc45ee3206d74fd03dc6ba06b96205a5667f47638007c56863767ffdceb5a5268f252c4f93bed4b1220cd6cabafbee1281b44753c53dfdca3e286b1efdeca222c4f21ed5561db876928a4e2d812fdada578e3da77ff1b297f14405487c0070a0e0ae4dc435755d01569b5570dd98ad03c0c196caf14e770c76f85f6c6497b1c026825d8855afff332715cb0541f8c242785309b9696627a3eba88023a5d2b3478dc2dbf6ef0f43f5f261975559fac9ea6c05f84aca4c1d005a1de7977f094e3db07fed19c0c1c10f9f62676b582122d94ec085c812a26c7e62e9dec0525901b8d3bf268ffa4e944c8ec5322db75f2ec2720c825dc39ff5a5115a7dee5b351ad09c2fcd6d7713022dcf6e1360b5e126f86c5e047624b414b87f859322472a0be5308f9783c9d69420a5b212a40e5cabf27cac782b6d01cad41c0c6d5b4c6770855386425d1e0daeaa53103ba0b035999658541c94ca5c647889fbfbc157874831d2a40116bd228ddd7525cb335d3178b4f5cdb32a590c1aff9c8d1d12e30b08693e9972b7a08e1adc61cd7618410fc420efeec4ba471f5dda414d0e66100a2610aef7583b75d557ed3bc5efbd4365ef0fd99a7a6a0a4055167c0da9e1368d65ab573976a6d12ae1f1f9ab3e28ab5228be0e82d39a9ce27098140a4dad8d11ad3637a0362cd1b40f93e7174540cf6525beee092fec3bced61ece26dc504088b3086de9da2d77a727cd087869af20327fbc5dacbfe27143a3d1628f54d76eb43402e68593103e45f33befb496b0a97ca6bdbfb93ebe8c10c9e2a54934be25e165434d8f9fced46acdeffcfd12caf788a3d8a1b5bcf87687263df08eed0e5cc2588c8f27aa6ed067f1322b6599527d40bfab09926f94b790b178abe320b2957c1e4df40e40198c15d8880986143e66183983f2868e68c935ea5b66143364c5699ad83d2040775d83c5ec74c9b3656e2af9aeb663afbf275ce6c3ed39a83dd28707b249f08c7b29de22f756e385ae58b63895fff04bacc1f039fe40cad800c8d43c9e0118505d1d9a95bb2c3cca6b45edbfa11353042d7a4d828d326b68e509d164943917d04954f5044cd705a07853bf155751d215cccf3c45fcb8582106b0af4583d0e7375fccd0dbfe02654903d8ebdefa7540c75d4424ea25f1d04360e7d80d80cc38b3675accafe46efe2a06bdfe41845c4012bc3a6b959ac26829c54207f7094d2f82fa24c90ee7d17f19c767c6daa4a88a72c28c8c813c2cce96efa9a1f91f7e3299a83127e3f4c80b2719aa1b6dcb1dfe6aeeed5888fd2e75e1fcbbb36ba68aa07eea36d04af28093f1d9e43a99b8469eaaa139b73ff6bc06dce45d0e903ef81c6ab8d98359e814ad46d50256937eb119beaaf1c81abd122c83438ffb62ac38c41a5a7f87328b6aa67b4957bbe0fe57787b5c7856d120e1cb00fb4e2d53c72b959cfa32eeff9bd3a18073838d0a88b585c9ccc3f558dfaded7f3912bd4fb5348b72590cd4b404184d25d3ea09c05092e9bb0f6b050000000000000000000000007815d1cb04d5dab1d03665f33f5cf6e667888b31a2cb61d40fab710a205e1e8dea3d98733a9285dd0c8df2f56fb3c72372fbb7e8890468b6e373195a0e885e12076f5017691432d516aa033004b0a7051bc1e2547f716ca0fa54ea85110f56eb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d757e316b9fb5e37a063d9238d8ba33664878393ff60e7960fb1bd298f1be6a9d2709c5d307048bc1f01fd8eb402617b849265912ef9cc1dfb5657ec481cf4f77b2b83c9eb59c6cf7c2d5459000f5179123e8ada736ca800821f27a346ad0730e6779058da9e87ee725bcff8c5829df2129c825329c8e4d4f24f9e4352e441730229ab013d47947804782f6b543c5d3e769a6935489951a3b7885782a0f80f83ca020f2288e1e9df31efdf4433cc2b696e4d263c1300e8b0c930038d9076a1b4a9c40b02202380358719c7918589ecfb9f89f89f414a65de306752917614e7d53ecec751955d9f4532079ec2e16a57e7d5e8448331fa491db69ca8edec778e46f12add021b649099f2c059b8e8195c9057aa0a623c084ec99ed848b58f191b33a5af2830030c767657fbd7d682e2b131c6aefb210cb5eedd2f3f58ba533de06b34f28943d1031f8b3d03a10b3fa5a36bf55d687696718f1951f693810b31e77c9d38c585f2f0021818524bc72f4c42c66b6a517bbb20306abb4a9075b14d27a3b5c21fdeccf0c5030487b7161dd120df6f985ad7fda7784be4478d11a9247ccee1efb558cbae98eec3fdbf2a17f907030bee586b16bd01e153130758742476dda6bd349c4cf6f4b1519271c80934873d38cd64a022092e0c9a23450726933477f37a489854b28834ec4703c437dddfe39f7557edb5b959f361c4374b004e719122352925eb18030d0292742019b7db5b711804cc64dcbf135281a106a8b83038119971edcb32e1423ad9310a7aab795300dd423df848181c2e9159ef4f7cc92c36d625d6bba9a015f67e11e6e120d812b561c52c83a8b586a512c00a1c3e2bc23b22bf0e39669be2f551e81b1f50a63d17affc2ea6f52e283f9f1a818faff1ea8c69ca4369b1b4fe90796dca9669c36c5119c3365f93a7acf3dbefe37329e47138dad9d381097a0ecdfbdf250247b00d8d82ab0b601f70ed9b8f4d89dc1570c89a17d8f20e657e07f39755f4d7e662f147a4a7e9e9121048c833719c3a3751ad16202f51bd0885e18b569ff254f60fd2bbdfd84c890c82136d292c8bb6e29909d5254d1bc8d1ed37cad691a6378bdc2738c3a6ea47d307754a70440b53887d92b27d0712599addc89c37c4d093ef1e856e876c2c40bda1193f0b423657717b59c7b15dddd4ffb14914f462070ec6e3ee221d8aa43c5eb83031552a4cb0686b86840d1130713a0c85544e916bac54c605fbf3243a78af0502fcdc82aec39614acd9fd5e29e00462a25dfdfd5d57361f34c87ca28c757f08e4b329d9a8f73ef1ea85b5b71ccc344a7d7113927d29f9b753929438a6f8738b424bb307c7ace4555f034269d07cf6c6c2a7a3d736bee410efacee8e1417a0bb106ca8e03bd95350ed10338ea92ed81893a01dba9ad451e8bfb016f0694594677ce995050b990e1e3030d35c99aee1fb2a3951e60a9a4fcd7692a2433952e0082bf68e2329763b51e134866457cf72d9a730f4af83ba46d67b59f51d2597f93cd708369d2cd51ac0ee332f4185adf6808fb69f5db20f0f6fdb9cedc5484353582f6be75a3fc1f840869f808d34a0073621ed681f14b60a082e276a2d002f5fa8e9aa289709e71ff367d1a2fc636f1c595d38a9ca125b09b556f1a3820f62ea36c953bcb1418a3f16f393cced8e8ce6f5e6a7f0542ace9e7d00ea5c2446c38c9dda8de44448772537d6b9d23a619cce6d209bafd25e616387024b8e8d9bdf68e223eaafa87394d4d8d6e045d3d958f2b0529664e6c4ca805f977cd316e2ae6aa81373f951b4a69caf5d2ac72e2a0dd5deb1e72641af2e9e5890e26166951868de0c271a127f8d74c8610ed3ddf186140dc7638fe62f8f21f4537b4d5b76411ade5952e4f94ae7f71ab5d7c9471db9cd4c40475980fb0c93758894640cd5c5cd7b1e1996bcd5fb14e513f74e38ef4b572546ebeaed1128e0fbc814b7ea99e9c8db8080319871fc93e8788b23855b1fb096b4740117d8fa1e584da9e943d0854f1febd3202624f6e2591837091f4164217ef0b8dc51fef32c542763a2d8a2d1e2ae4794cae4cc7a510861daedcbef4b027d54bfc3203ef415512406cd4d5ae2c561eaaa09f3f65f19233160eba17485ff6d89ec4c3c98064a112dd2e7b132d3e5f03240bf68a05e054aa0c6ed5165dacc318ff7786f834fdf440a3b087e177764173f13b5a4f64f2bf4fd18fd70b7da143253381182126f4f63a87e69befc2c092806ca24010a40c84e8b950aa1dd9de5a117888d33e1a8a6bbc3a17e3c5b7635e3e8509c48be050200000000000000000000000004615575b24614211197623abf9ae62952f31234d7bcc5f263ca33777207e5e8f182b92f9f78edad0a21b38475e0ef711b2354f7e2df68740b02ff0443eaf87f9fb5a01f93ec1fd97b3707332ade7238cd31c80cef0b01dcea0ad2aade80a28a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005260ad37389f400d68ac1a448d86edc5126574ba32d12c1c73eed35970f0ed2a40dd9ece677e7640989fe061947e7ab59dcdc6cb256d36217aaafb8943658b8363456b2f06d52a46e53586ab67e18f93cee250bbd087bf012ac23be9dcb8970eb8550531e299e16856eda91c339f12915c38cb2d5b57433ff611734cd4f05acf030349f828166ef8b8a3abd90a183fd84ce947f221f80467bcfd3dea20fe0a306f0317c4be24638527a1e3deecc5806c6cfaceb1f39066d56ba1f7602bddac8290970a0249c4a3610ef35aab5ab9032c0d5c4d9d61995b476904273bf670a36efe23ba49180948f871b720082f66b8075c92d042a51586628b5baf48d6a878de9ef4e2030bd772da001458d6f839d441b79f1c7187511a82efed40a64898286fe7b78ef403211fa939e546de0d93c8073dc10dd62d41d97654d0a0b05126cc43a9589448b6022aa7302ac4cc643d58b24e494d32f8c09d91d43e570c603dc8934281b7df8764021ca7a307688e1af70238850378c27e24ae928a37870aeebac16f10aca66ca8f603171450e3f0272fea5b655c5b6985281297d61fa6b016375d26796fea6c0f2b0bd4cc5ab85c067d642e3e6ae83aa5f725d8bcdbbbd2393d2d1366a4cffe285b8e34c2e437d36a92ece69c602c0736533a06d67b854cc9f89702c30ebc092428164d02d9a026224cceda907ea3bc7b043bfe7b47e15380d133f086063d0b8bdb5d6a7807e7c47f62c29245e0201dbd62d3d644eaf84cee27f8ab4acd10b5544e8a22bccc2e68d3a780c653bb0a3b8eeda5f37d3dbf2a3d886c9de56f8dfaab0e10eba177f23f08161c09d1fdb38fc5bb44accab74ff466c5d7d9dddde4bb1fdac173f669f15a7e1d3156a856302d870c4b1837c3fac94e7e10030e3bbedf60525c94cb674338ab62f688028b5a8cc9afa8bce9ed48c38bed49df92d5c6666d6a165f8c8a3cf3ec092549c4cd55e08f9cccf5bc049ec8561cbccba2c2f7502530ebb008e6ccd96bc47f84b05c5c77d08e6ee26b8981edb2a1826dfe4aa86f9565dc7e33dd04b226600fc0e92fe5e37e1bc248db92a1681092ba6e807630e0fddf2ee21d173677bd4ee54ba4f9a3789494b6c3139f5b5dbca1f137308111084b8170caa1402735c33624f5e30db650667824e4ffcece3b436e8f8f00a162d4fdc7cf22e3bb62d1e2d8c4f693c3b1bc6f18ecedeedd08e6d3ab97011c9bb6edfae6853f3a19fef74283275da23bfcd83add36d089e62d5fc87f45771b8cba490faafbd35b3d7d56ed10b291f712d0efa4a1ec3645dc3360cacc3776fb440af96f1a2b24b1cc955c11826500d72b7f9f9e6a9c529ebe4e9950016164bf88213532bdd6ac936df2c00df68f31904b29f4ab42255032b2f8ab1663636408d9495ec37c6a3c07d0a279a2a9534faeb79a1893a220c624153c94bb860e0095562579daf65270445a162df8730fca83b39d63c429ee331c4bb32161056bc46623a6bd70b0a5ceebd48f29900cedc0c1936996067f6157194579c47f40881ec3c22927c689c6f174da67c7a51085acdf8cf4794446395e6717da0db44e942e491e93cb31a5674b880009b6f36ea60b7a552224d7c242835f2464a4afefe835cde62ae821fd84937e77ea08e4e7c069f1714d57661d45ccd5cb72f85b9fc3c21874ee6adcc156859bd65a658512c9a27a6987c085c306e044dad5e11960c0838c0f44a954b5942247cfd80486d4633efd218c916cc3423a3e261b9d44675963f8128f23fe934258f814358c7d0c7ea2fcaaabdb61392fa050d00e73774738bcb1af995755decb226ba8572e6f0a9b7243bb4fc6ac1fbafdd18d588241020b816b59f52cccec9d5077441e706e0effc3f04f5c8e4e31ec621881587c4791ddfec9627970e8cae78b354080a88baf31160aebd0dbbe406c79ac87342aa2d50a73116b8dfe2c4299de7e983c3c48a1fadf83c730f432dd7c3a5087198f9403b5869c118fc70fc3aa20ea25625929825daa6096a099384e49dee30ae9742267008f8745d0ec4fe4fa533321f6f2491ae5c560a8570613ea8391803797212b5b52e1d8c0b0af9ccaa46494c3e391d3b5f0beb595c9b594e30d390876a662425d5e331aacd6001e3fd8225be7f98c38a5727c3058ecd7378779c0b24cca759a8de4e3b1628c429b833f5dbafd10c5055a37787375ae255efb5dc8d47d206633d6565d1e83b388913ad0bfca329ef9d4b8760e84d8f1ebc05b5e49bd1e3224ef004f35a2b2436f2a9e343d390a43271a6e30597cb7a50f83117137370f10e250b85cfb647704ac961d2ad88829a2909cf06da7b95efe48e9bc1702b30560df69780578d511add4a809bbe60c464783f9e664f277f22e1ceb98a00853e83737c1f3c5a0ad66d7d7565d83e594fab97fbc447be5cc9a687ba83e69c600", "6aac6a6a", 3, -1078259374, 0, "1a88f85d26177eaa53fc444a5bca981601781d2d57b59a7c02e259ccbe51508a"], - ["9d107b71037f83c9e09d645ce74c7a6ef0c597b4029e118c95a39792b1da16bbbefb95e520010000000951516a006300526a001b4bf7ff4c13eb36787fc9ca9e12a9f77ee682940d5c28542ce1fb4263a5d6c17f72a0df0300000005006a63ac65ffffffffbc7745283893cef4f62967fcabb7ce19158600038691148492eed12d85b919da01000000016342c47fdd0120426204000000000652526a510000000000000202f027030000000000000000000000006334218e6d0b47947c1294a1f659a5e6a87a76441377b043ae939f1bb8f432605410b5d58221fab6c9b6ca27f1b390c3e2a487d295485c238d74fcb3c287234897b6d37e9781592739eb8cff69724c82919bdc4f52f99a268523b25d3d286ae800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000145eabce5c1e26c92d42fa449e5bb90a840eb096cff08d104aa593628459f67895efc4a272ff2e13e119b03fb0f08dc3627cec41a956bd55544582b8c744282e45692c0f0575f4abc7596ae61bd9ad016004e87721ab93d65e019293328845d79722871c025aff1032b1aa74ef1612e7bf1b6224327a4a172123a1542ac4ec66021f1a4304cd375f83d7a9d03e010a1369b005cb91ee51c8abf7c7f93d6bb1d5170222f4af3f334cde2aa48c00b7d39a9b49ef47f5215174d6859bc326cc582ef5200b00d3cdf6e7a285833f65725e0adb90fd6eb80818415cacb9d1b8308070e46b1147b0afd8758a6ac30c8a2c6ac7eb9cba5eb5d754a31f2f53042883f04ca6fa990308dc4bf586845f4dc6802964e79284b0ff6d7a2f388f8d205154efd8c84630f1021fc161067725051f09ece05ce0d52da7d5a10f3b923d4b9133206a6e1cb55d58022e84b14b965d1227a3ea5d5d8b0d40a120af958296cda95fd3ebf41c8d858656020606ba4bb2540011520338c0c9258dc2398aa33dd1d655461c3b3a00b1294438020a8e8d5ce47cbaf8b45bebaba6cd0c106c9f2fb425269bfd9394060a08b298abb4ccb51323b026c579484650e946ad530c5e2d35ca14548df75daa8ee17e630a645fae026221182ad7f3bc8dbd3d3e5e2c1fa8cced0bf1e123f6e822ba9414421aea9f2aa7029e68803d18b56aae19c4ff8db6fbf7fa6dd853cb702a027d634c732205f59573d1c6d627b96d0fcf274638f1fd930dacfebe78dd71f38332750b47c6f2ac55ff62563a302369826cf2604f38e041c0a54ab4aafe5c35f03104d51ac05a133e8dad350d41f81889722fc224b44261c74ca073a452d8bc3643f0efaa989894bc3b90bc751be009e23a34bd0b9e79a8a6a9eb22e1e05a42228436ddbe6ed998f23106db9d981b9b337fde4e74b86b1f86124add6f5f9b1f1a382ac47de60fa83eba1ccb30400550a0ae7515fb8c3764e0fdab6af1fadfff035497e3b321af2bc91cd8b02da1c9b92591fb73b027b3a39df039625b4e8683fba89194312d4927ad9b5c9f4d964ac2bec106bffaa9a7cea9f5a5180ba92737f26cff9012da301914727385455ec12e52b325b34d45159d2c42d3bda39d06ddebbcf20a639b97688fb95dff74822963459ee1cf7b696eb4bff784aef284f502092fe3588b94714ae004fbd06f2360b847da967b756e0ad4f69bb20a0b9d8ffb04421fc3578d9f93ec7fe63bff93e20507a9ba1b6ee939455dea530500e7924a65353cd5748d92ac578d99b88e3033693828f32588b52fabcf1018e362b47becd14d9c9b591be72dc235bf64246107d987a39a540bb3e2c91cbed379557fce6acfe578fdeec2dc0b0f4c941b96d580a720e7ab7e4c5fe8936f8929ba10eaa10cc85d505bf1fe40bb29a70b3ebf8fc9ae00e3218f06d4fc8e7417e0af74fbebfb775de1fbb2585b6f5ed25291713f18fa94c4c7e4932dbaf70c32fcf879b27ba4864615f6f0301029fd460c2d409faf41121459e2e6b08d41e2e640f72bf622cde375c6446128a748b66fbe76c7fd83849e7737e419994be1d35389431d44ec0b591440b3d5ca2b72dd67642f271f9db9458f51c0ce3fc3c362ccbf9c149c17909b9ee8a6d0a8902a6b60777648acf0e1b9fc65976ba2523a84b89d67ecb74aab7667943f7cd1a35831904e3c43811cff517ca813ef6e6b2b42b581790342239bbe0e6ccb2c7b3a8e08a5553fb62fa0942d72d61c407d5f7ce241c36245ae52d3c983745467a9648f0064d609be4a214ffed443f1803b6a711445f09cec016b95450aa04edfb0151e2ff29a6db36bc661ee8e4896cdae18a681176d2b5da00983688eb7ecf6d67b4bc7f55ecf4e3fa7539cbdae21c47d7c770c3cc535f8e5030134bf27ff8bab9907874de0bc4629913faf639d198bc747d2794d59f5208bb21a92bc44729e29094aa4a5500ee031e322e37a856b1740b1043fe12ffae8ada0352a164ebb8f999b575f213825f6a588ff6e4d924cb6934f7682856069a6eb729e045b0f900252d4167ce8b0be98b92a445671f8a89a54c976ee109ad9432588a5b027f19fefe189fc612f103ee54d149e56602949e613b83a0aa3dbdf0dd7d17afc0b436419b5c718ce692c7304c0c14afa3bb8816278536c2ee1155c6bcf6f64672303d8f37fe50babb8a24216067dd8340fd1396426d3997bf198fa2d588e8579a3789fb60dac34f495d7cb163dbaa348f6145241a397116f13bc30c484e75502ea9eb1f83e7296d9fb41d4560e6800b5e5a1c17885000000000000000080de1803000000004ac7070a7c07db85796c540125a821481752663f3fb8286c4e9bb647cc811d9c5440851966fae07b207895f8dfd6be4eb4d5d5f4f339672243dd184bcd48e8a6e5bfa444bf4034537870d150f50d8a604035ee7b0e5d9f2547c94a1452ddb3260000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000039af3e10c5326f33d75adb8311b1268d0c2e714761953651740bc6b71eba79370b23c16f70e147bac0d6c2a8a9a7f480c524180d0384c3eed47283fd69bba73f26b90a5234f897e62b39f1fd6ca99de920915e2bcd88f0cada627c45901e270a110a3cb163757fdc7a031be80bca24a9b76928ec2092c25473e28d963e2c927702031fd8efab399d63ff44526cf4de1686714d01bfd5954d6b2126a825a75474ba021bb14d2f0f7be5e96514083f4733635c219c000b9b2fbf57ad6d59aa271a84000a0056b3c841fcace92073df6a755b0975d4269d28072a924ace24b080699de04384128137d2b2d6b125c8c4ce9a85cb76bbe0446712b992f13951ed15b39ee036031e847010bd37a32fe9958f40f4239f4d8522444e97509c1bc257de97b48936ab0207663fcdb851293592fb80c44b69b417e2e0ec5e752f458eabb53fda4108407803215c13fd1aa77c165e73555177762450f0fc30ecfcf4cf5a5c2c49d17256840c021a3edfa39568a2434fd606a32ca02cde9253d87a9e83203d852268c3008fd768032e8ca2edf3ede00ba528a44f70f70f104fbd19fbd4352457b469886931a9feebfc5a420bee003dacea5a136cbb23043534387c013c8c3ad0fa210164a04b5c83f4e67f8f5b9b1c1056ed39fd4e881feed09b614b7aa1e0bd3c3cdaa224cb3696772dbff4c08db5efc5ce9e56489355d718084f0bc00f01ae174c133d9ed348e6203ffca6e3d2f0bdbebbc7e2eea7a62537eb5b3e9be3b08a61ef7875d94ee96a8073e9ca7023ffcdcedf4e832edc5cbb6b3443d3cb90e9eb12788a436fe4ca81ff462793d7c04778d81baf1fd11dfd3c7266c26f75da01e681a56647626aff4a237b45caf865c20f29b68d37b6beb99aad7afad6e2e6dd1d7e3badc7d1f21d7f412fff0cac5fb2bf7334d538291db90d7b72eb6cc7fac6615ff6562b93be606b239b0081158813c11167248bcb1a70ff084ffd4a00b2b7b06a79dec001ab0bccb66b75b77dd41c18935d6f034b236cfc8459e7dbc49e34b8def20a9ef4faea61320792493992b021b633fb6f8428e8d638703b838fdebe70b806e93f1c3d1fdcaeed0b65095c079a78f0a7fe51b98551faedc4ccd6e1d49885d201c18ad1361f279c4f08979707871f60464eb753a0f184ea4888befe04bd2df7f3d1804e812a3cde367ea3af54dc7444a01fd0641c33a3eed75e880ff70942d3c4b81eb5d3bbfbc1a5db8f9ad8dae62ccc7de138067919f17deae0fa4a3ab0f90a78fef811168a1ebd62fab131f6f04abfc2d5ffd7693e8d0e1b1fab4b209586a240db47b00e01828de1af5559e0b3899352274c38ece95e4f8eff8ded281cd220d7c1199ada74d72eff26747951d3dec3f5b5a348e18dfced9850fea994e6a50bad7a87468805ee4b6965d470e530ecda6b2f729e212cefa618842e21b0455482fe28597391f84266cd591b105e367a4431987838c69815eb268ebba8af750bed559a5dce692e9f5fb99f9f40037e1c086029b1fc46c33c28b1c7f31bf8f171bf4e3b8f5dbca59417d6edd300f7bc5290c94c38ce56b8ef95a3c1c647c672c2ef132ea4edd64fbf7c600e700a39a74a837aab99ac4182e6f935959cd18dae04fb2b909aa4eb1fd5443411b99e14194224fb952cf34ee6095f00ff44c631b0fe82a9da1e08b674f24b86df9e1b4e538480461f7d67fa3e975850bc7ef769044204f37184a31ae953aaa964932c53f25d65185126047753eef357b48287c22e0eb9c0d601a8ea02da64ecac07419ffb365a607662c834e8f39a8969dc422fedf93c1773a434e735b9b03874251c76705f9a3c2057aec890ea9e25385486776c8e5c5a3f923fbc38f1ffd1bdb7f2f711295b1ec789113e6594e5c66451c392b820cefb1cc7f0725833fcd35a2b2443dce55e3cfe1da2def5f19c891d465385df039f837330d0d392d0eb5a674f0e289c985aa61ec5df9a04355a21ef3f6a3f6643ff5433636e05a03cb8b316b02d42ad9834e93fc7a79fa2e608a486c8d2aaa5c1bf22b8e6c6fcb98af101497662bc53675552dacffbcd794d433f9cb62768e88974180b040bf61e9ad64f66d07239799283452811103f200239e8a11a25475fbf860ebbaabb139f950166e2c8de8c40fce376f6183a217a3f524bd2e062e47ca9ded5ec7e3e2f1db675e2225b3a0fc974f81eac87eeb3a3768da08e2d0534be46b081aec3a2bd86d3663a4b272bdad68e986fe795e9b97aa2377bf8d57f066a9768e6a1e785b553d14bc1d7262e2a0b9b7e3c9ef6d6a464de5643b5d446ef983eb0ea79b9b4f57b2d4a37dbed5b3058bb67f95856fd0e794e01d00cdff395d6083f3d46c4f77666404e5061422e5b8f759a61f464d5c4e458d53872432ab32bce4ce0ba216b26cc4a5312280161e3f2a25814532cc1ef8f0d", "6300006a65ac636a", 1, -730667078, 1537743641, "a73549d59da17c1e94ddace5e94a981113dfff6fb68e4fc70864f096e2c73e31"], - ["030000807082c40304a83a759a16f29041edc46310ee35215b8d667edce0c6f22231079640c8ee7dd90100000001532958a3f2a37f354e11028df179cde4d122b5dce0b90ab5caead5556bf83c467860af8c4500000000016a33f10fb7a9333afe7fa7371b97e1866f5eb42c7d8bc6ffe1396f7ddf2657333018adbb4d010000000365515274c32d87ad81204980a6560d7abb3ee51fb5ed4332de27f2e3d1e9f303c26a92090f2b120100000006635353630051ffffffff03c1c5d40200000000025200b358d403000000000163032a7f040000000001650e3a0e660000000000", "0063ac00535253", 2, 2038971227, 1537743641, "58e5f7a8c8b29c6ec9a62cde8c20cfd837658f41e3359c8e04c8e2077ff0638b"], - ["030000807082c40302044a86453085003b250b0d4bfa3a6733923cb14153c8d8f9ba2cfeb55577be3a02000000096563536353530053539a1cdbd1413482c1685a16a2ab040dcc8ac5bb25fe56921bd1194439eb047a6ebadbdf0f010000000100a96b694d03cdc64c050000000004636a636a886c4605000000000665ac526a516a5e666503000000000352ac5211e333e1532c276a0300000000000000001838c6040000000034953e38492156f4d40c9a67d952ea45c83fb97da9bc5cb86c50c96c66fe20171996c06462e72e9b5a1f3c4dd765bf8f7ff8a4ecdfb277c0c203ac3b75cc696e326f89d50d42bcedf7b139fa8db474e5c0f2f93f4a5bfe1abc11e834f1d3c90600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c7eeae68aafb5376bcf765e31428a4200a605f2fe3efd6b7db92340365bf18c8d82dc06da834aa6088f6ff64f4548f370f7aa7902d8e7a3d2ce3e0326f5dfdbee0cb401fd92fe8ddb9c804fa07a88dca423e4d60452b51ebdc7d31cf882dcdf31e3a1d8b29d822e6548244d6e6a104d42c6ffebd2092e71192a9359fb3d67c290325c6dd6de423c3e80543fd3152e8760f6de463c338e1e37d7498016d39c13dbc0200519bcba1b7f346966d4a678ed99a67c5df54ca464484f685f1841605ac82340a022e67fc681692331c80e0576784198ac463eb34690472ba08d3e36e5981f749bfded90c3c175972a15e193380f00c4a2962ccf4efbd5e04c8b808da4812fab2031b8a7295b66f8bdd9d946fe9e91ac54c2dac1e0352274a799f60e5ba5832caf7031bff273d5873e881ae948e628781f202eb4241baa458405ce3e629717344b3a3031665f75d4df15e85df8e16ad0146ae931a38c471a5b01822e956f6b31e09ff270318dc2f21f299803141c107d045f9580e557ec3f0bbfab08f598a8b1739acdf8803283a6a67c673d05e689c381b7f5212317f3740f6c49927259834bc7223e3b60954d66df90474222e8e67d9207d67c00482a468146b6c84058a3eb88b4d25be155e15ae8224b2a03295838ce02d045b99028a3e033a27e668417b8478416e992916ed2a9b8f4c010f90983ecb91ffde4beed5093f6d0112c47b660f4df2aa5af6366ba821990be1faf3ee7859431f5dc791e6496014f772a2b90cbc2d0aa16c3d469ad663251665dee75065e28b95f709ebc35ee5c6f1b71188c6e1c27bf50cedb927483b352c4d878510b52b0d6ae8d6d418a12af629fd54a05b5d63ed25ea0df024574b3e16fadee84fea054d06b8d0fdf2ca9782e798c9a324b5eec89e76010c9869d6e6b2b9bfbd81cc3aeb6bd4572d36cf8a9802d5a81dbc80425762a000b36a2d4dbf5a0dab4d7428fba7698138b16d62d40ee40d2d86165f03dae09f5c5b9e0bf987f589617c96b1d9b0fee4fa27adfe8389adbf8fa00f7f823cc91bd4df787bc5556e61e01381d05e6c63a58bcb31256ad3182188ead177b614e2dd8f219070b1cd100a28bfbc388158d0fe4166dae44d55502381a25ad38ce3b4d35f7bb2af66e9ab2390f29b7fce12130a5095ab504e65962939734f3569c4801a9c9bb5ce51cc1975069a68e5c02b942756c818318d89f99f68c38282b268a6f51e149946834c12aa1e6b49fc48c09e307f1f80e7fa95a35a30851cf746db8357a67e9fcbecee19b8586d2d30a75ad5f15e08018f2bfbb10b1781942dee7e7b915802a78f35ea54a5de938cb0afc32cd47b07e5a9e71e5edb5a35d6eca4c505b70178fd0783fb34fadc8a09b147fc495a7f2b54383347f087a0912080bfa8c25b3631f6b815bb622c1dff1e27424b8f74f1141262ebe7c91a40d900aa8d643be53af8a2cbeee63a9d2876514c60964db452d7d728d31dc3a3dad9a72d8b9380b4db82f3fb8251b918c368d57af2e539190ef5b35ea73977f0be32dcf42e09a4f1b216472dd0dc099528c8a2737481917a44f0166a97004b6015577b9a8d217c1e7a111f64e08931909e1cf2c81b47f0f2b37e8394e774d8206d1a248a571ea22aa572343fa34ec5e209dc68906aa57af3ba3ab531e6f36c3b6505c2a012cc8ddbde58e52332272eb162f38716c3ce5496ff16126d823e959f954505eb7414fb559a714f435f0d8ee410031e6c46b5431e7ac4abc59334fadaeda23a4fb960c88cee2d370d40cf670cd25530872c42ace1a159dc1e5538bbf19d05e81cd687990d63ea45c8e1898a905a8b2cf77ffacfbaf5c878470a9036c10786af21d54bd223825bad11cc3f8b94c2266001bc2ea19bad97323f68b4b385272fb406414b52eba7263eb362259b04b9536cd09c72e3d19c35480f737e36e0f2621e1f6edcd22df4ddc6af9a9a78e12cb806778211b6beb62955c399785be100dad4751af3dc94dff9c5bb65a8767073bdb2309322d41123b9d9e5b4e9a487c6ad6d7fcda42ec04cee6803a922483bca54b45cac82782fb085030d86f015501ae22166d6489dd68bc5feb3b1079b312a0241bb426e1d72ef42db0eecf1d208a0bfa46dd26dd4ce5b8d39da0e968f72dff7c3c8ac98b67a14b485b685a755ee6b77648d12dfa10ca9658905676930cb13b310edbc50aca2b55b055302bb4704f3e4ba13cbce91fdafe81c557cbf3b4cadca0bc731a2d3a1c8be41b53e91327f0a66457ca31c6b34090d2f9fc1fd250a2ee793181260bf9e6286560000000000000000cf80860000000000e18eba85c810ac6f12324ec0142a161e82e14f2ae40b962851b7303a1ad895eed6a57ca869e604b2794a80bfce1397dfd50362b3280bf7cc28c5a7c6f6c2a26f07598131f48e68ddff6d93a4be6e061e22b56ed5fff4b7d367bbc23d64d73c2800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a6a5dd158934545668df5398d3ba647c306295a7c695657026ff5f1313734262013313713f120dac4fc6310a34ca4184f2aacf718c9b92d16e933a228d519b156daf17772bd90753e6f602a27de73a9e3ca79baf9dbf4e06f8b46872a8bdfc24dad2224c51f0d1ba816f1e5fa62d785e132dbf59eaf69cc01f84e525d1f13d17020c0144ccb70afae2c4531acb923cd92db8c814316ae03fcbf7a4d033967c64140307fc3c9cc948244cb9c710b84defd221890ed5a0e4c1871d70c0da9d2cf681180a015e6d2a45f4e40bd2fbd5ef982fdff5310821e83945b4adc4467c9d0df8710c0bfcf70b72e4de321210b1b9d80cc87daf18a2615c98ca43ffa6d6043f0c534f0312b4374a78db91685c929ff9c15d0f8ccd68923581560e2956c8b304605cca05030c6c354f6da28d5bea8353f61049c8d1abc93f97aa72cca66959734c04267d98020f08bdaa2504be076a2ec7f2f3341102dc9e99afbe7bcd8393c97cb9304357af0303821d9e7861d1996b530517743e40cc3c7c1bd1625c223baa24af9f0fd77cb202051cb2e66da85ef6250b5be531be577dc631a0404306a9e63bac90fc8394168e7d447b8442195c2acb492096f21cb66725f73f6968e3393f1066d04507b178c060ef7ee866b2c0f1096ea566254bf2fc3e42a44df3b3459df88c35d7a1e9d35f340bd605a682c3f491710152abe899eaeba623213918dd2245c01297eed2563a47726573368ba529b0144ef9ebf9dad02d86f15e2c3b161a2f2219797e3c826b723809f180b8ad93a94569de0c59be14fdd4bc5946fb0141e316ecc33975503668d4d5deb36a181c0baa823f0d4a6ae1f8ce495749a040d08df0397f2857b13949fecc8dbb7213c7c1b6e3b4abb8ae60a2322ad350576e6b2a936314ab56f9467ac01b7303310a4cae8d84251ec8bbd0759e9b5445c8da5feb56345a5de80d8294532795efb35010a247d2a6111e74c2dc06e2cb33200e0ecbf9d89ca5f8bf516b442c77864b3a565fac622a6db7bd025da2b89139051a81d617fb6ca3fa19c6f795e1f1b18f372ed834b59d0679c77019c931d36beff294b17cfa2bc52e670412de2de555cb0d0d76bbb57d9387132e62e318f9dfcec0bf92ff3cb64c9e438dc64c181a1ade8a17745afa14839701ba968957f196342c7ad5230c518dc3e8188d551971c1f45cf4502088d1f7e6d1cf6edab7768c79db2715aedf8efa104a33f5b3d5708681765fe244c9431349884b11f0c813925cb899cb927250c1a31350775d951dd03a12ab68b747e52f5ee64f33fc1b00568ac891f485a9745ab637e75db499335a989501ae49d898781afc2ec65d05e518d0aa89f93a1e3e4a736ec987004b126fb1c610ec5af7fd03ac369aca6abe24c483f4922430340e17ca1d735841cc9e910edce0205204b6de6dd7ece1ed7f805ee072d61775922d28ca8d88a092d9bd5fe42153cc575aa13e01286117c3b144b87b20b01a52978bf507248f041bfc158e64cb245aeac6ac5f6ca9709e484196d94fc322b0cd249a5ece024e2195c18bb0be7b2620cd31a5b1e6dc5302b5cdff649a0f8553a8441051db00e296c9e3cdb0343ea68647db7e25d7713796acca87963fdfdb4fde47c9585d76ec252a40c9f51343541106494066d5b06520e9a6079b8398e784adfe2ff4ab8c4093651d6f46b91f3d3b8ff6db06347d58f8800d6c7c5c27a13f574fdb96a3c506c1c462ca477a59fe4abe9e933080eb49c82a6f1f887b49209c6b1f53ecb1062631038cc7eeb04fc391ca7eba1eff99833edc1988a294b1a4951f4f90bf63e64b04abaab7ce1caf96b858da93a925acf31662523c4f6b9ed5f7871530d5ea41511d74bbf0c80dcb9ea5405318129a57a55d1df89b83b1678f442e75e4bc89f51b42b5152842acf4065fc532c01db4c8a4bcc41688b84d333c77f7bf42d3334885849f1fde3dd3276d27412d9a62a594db9053938354721ebf70fed08303bc756dbeced6c0c2192c5e5bc9c99b1f1e83e1418681052d5441e39f9f99682f7a0a9e24e3127cf4a610bdba9aa2510f3418e7ea062a9166f817ff74c40be8b12f3b6a9abccb9bc849d305d6047005e82abbb43bef635fb2c5b96e39f7a863d00ec8a14a5db8f4a2ae3758527f60974ec4e874b810cab4174714ed1628c307db2af92020d0e7e20c1c31779019ab6b873df969fac017b21ffff8b290cfba4fbd30dcc99a53af9cd803622ced8f6b94f6be2ed50befb6646fc7b6a142a7801862d90fa54340ab81a27aa97e0b7d5be842170ac99176018ff904000000000000000000000000c9a5d11d55f079675679aa313bd5f888ff6a4281777e631fb3a4cccf6adeb54dc9cfbb3cf78a1b6d186b21bc0eae6024aa224958f228feafffdc262fd8bb4d029ab5d505d39bd5344ff4e68c5a017b72477d0efbd885043e51c29337a87f21ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e377e83385f312b96c9a8576ad9ec3ef2b934536d1b5a3016d15fbedd06f912df09f3d1ca3f2ceca9dcc32134cb49d2f420f3c71bf4de1acae7f130aba224c0b40993404ce1ac5384b9bf04a20b0390bb86877c298e82a50c3582e5a0a9f99d55a531b869320ffaf95dc995d1a2af11000d170e9e1713b2ede7d7c1595ed88a40303cd2df7f0c93130f570b4574bb0f09f0302edfd490b9267eb2da9242ddd2dcd0214f221a3ecc375507df0e7351f972db85c06bcc7975541379bbfaaf35e6a75b00a07721323c6d14a287cb9234a5be0b4a6e30a4156678c7e4addc95b242ad03a127a3fbcac8b92a98e2bab428ff20e775800fbbf167c92a7d64aaedffe5ea945ab020fe030a8f910f0f2cf471b6d9137782ab12d54e0d6fd6a4af9160f24a68c819703027576f6da6906561fa99a945ff0e4367430b370aa671ed492e323694587d06003104e5a80089fc5e291f245201597e72314f5084b48f497327f010687b615ca6f032a743fef5802e78edd5910b385fff518717d8d77ed656b9160607d267b26cbb50204371062cacb0675b04e2efdd80ed9ea5c6f3ca55e91d72caeee825c6fabac05472d782ebd3ae32d6b0948a081c32e09b053129929278a0f083ea950a1ffdb8545a7eaf3ca9a634986c34d663ac37497ab906edcbc4925b097adc27d80bb1201d1ca0154f9e37dc05951eb825d1cb9642f455f98e2cc975eb467350cc5a8f588cc61ff9a746b505b4880d67b3f96e3f8dc361de21f744dcf47e6e66076d0ab3103f5a95448308b32f1bb39c3573750bf4d1e9b5168e4d5e2de5c9e1d6a9a36bf8515d7f875d799389d691befe77ddc7de0874d5f67e3597a0e1b4df917e2be31a850525682f6f592755983e1e2aa1adfafdc5a1339c87a0c991113a3d7eb1f42a001ebf248447e5b3ca7ebc09c26761058e40bf61fd9d69ad189596f73338f71f6af80ab70c2c9b8dc58e4e98cd61faf4f568beec2f919ccb75e09d604d9eae4f9687386b34b60eaf1858219e32a4be00fd05e792d41a05899c62525b63f7ca4b9c2e3fde79c00589f0a03782f257b28245a85170318c3910429c1a5ba1314750314914d51b58a33329b2d59773e196eb7c127ae82eb5a62b6c1af06ee8ab95dedcd38781ba404ca42bad8999b18a3e222f7bef99a2eb31ffdf3d9f0cddd91f39e0da8108c08eb97f516fcdef99671285d4615d680872ca9fc0d99acb7562be5e5bba293208008ea3a8c4e37745b6d5a0894866bc858d1d0542ea2ceebb81aa7f29669a673a9c7f0fa68ec48a5e84bbf3e90fa0bb411a3e94ce8709fde35d37ad012edb365d6a92e8a584c5e39dd763f0ac9327201e8cf285b053ee095eca99a64b390f364c2c7b2eedc85f5bb84a24e461d9528026e3a468a0825cc74193b4c364d677d45e02acfa35f3d2d857333b814e1c52f9f77814265e629e57ed507dab22205bad168e54f3d5cc173ca5b51147553526fe13f2bfdd1d9170d8a276eae76bcfc929a8a20979ae4ffc7619db76d47bef0b3a86502e2aa935095298a72192377ffc420a29a96b05cbc3a5403cb7832464fee5d60e23b01c62a2b226bb2277a1de1e42e49009c859178b3643900ad99823bca1cb4d1aac23a7891dd8d39d673172fe553a9da0c63da36805ffbf9de30996950955baf018139f38f9608e529826d74222f43fc0b318392510151f2ee9473fbee9dfdbb9c4523fd87442c80bd6d0de8770a16f99fd48b578836ae96a4997fd5e07ba342f6943cfa3af37ad6b262d1286a7c32a9feeb323590d9d05ec01ef633e43e72729fa788b1b4b4378560efe8d7f7ef171da957fde6a1b003bbd8f6eae580885b34652592be0d503aa7fb79e638d5fadb0fc97c368d1bbf955b736225bd874a3cad968e0cb290c79ca624d2faa03af96ec50c4e7dea53c9f968b2867a4bed942daa725dbf4969cd532a8708b3391e1e0daa78f491b6c6864ca02fe9837b421aa498a05cb782daaa7e368a569e001584a529c8602939f296e55c1d8dba1ddf1ac758acd2e96c47da13b6e5953fe76ea42d4aa0830f9e0834c8f5f99ec5a0527721df7aa39b0220f780cae0a67d00df8c03cf3f2353d2908ecbb8a725c4e3c0df206c04bde91eeab671f4ab2e8e5af03af047504ffe4f3397778ac9bfb4d4331706b38a642907190a5899b99b0b558461e7bc9acf49d92564c48c09bedd378ec0bfd5aa6f1005eec3a759d0a1337da51e6b77041248b11be749564cc079e12edd52d6ee54d13d14142e9f0cf3a187a53164081c637930703943457051d2fa342f3528ad556e86aedd214be2c32405db35e5e5126ffc009ed802160ab623ead4975abfbe03d7238c007745df2d216f1bfb8eee1f7f66a7b97cd674df9a89abd62a2196c783add9e1e518a5ca2830e65da002f852b54ac46c3119be4db00c", "6a65530063ac6a63", 1, -1106654833, 1537743641, "54fe67a19eb4759b75e209afd83e9d9c2f78b184990c39b4c04f8587260af1d9"], - ["030000807082c40303ee2a735a34e2b02a835529eb2c7ed8eff478dea6f5e678e71f47d13771f037340100000005005351656affffffff84cbdd8357674aa6236eb7cd83d0fb62b41df430463c68e3014efb5b5320829a02000000025200fa7a2e352fbefd8222b50777a9210cccc5431799ff735405bdf3e2d3207d078a95b1c60f020000000765ac5253005163274d125d01962b110200000000096a00515252525152534d6578169d955b3d0123e83e01000000000000000000000000e4195217920b292138d7413540457fe4a35b59d674f543e8de74300a4b82de98709c5d452aea0b0d097ef6d763ebe93d6ce9b84d4ad3c89d8e8226aa680028322d1df03b1294f1b994c36a71ecc4448409369bcc1e7c86585beeadecf00c271b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a1f385c0ab33aba7810f97bd6c56260a486e96a464ab40cd236e69e149a0bb509dd87a564c49e33dc7bd75be1c653fbbfe3ea7c6681721f7a96ec88f0a926bb191c5b0ffece92a7f0ff4bde1dd1cb4ea81607a46565eef68ef623fd855ad550ae228c1cdf7609dcdb4b2fb61dedc83a83779af7bfb9d00bc7654ed9f814fa84030f15c14a42cc1c15d8ef7ca7d9ec064b5d47fa89fe09788cd879e878adf609d003188125b50b39e5201f523c5c79bb769d349e11c11cbfbd8606d1620ae378dc580a08622ee1a5c4ee2eb07230dab46dd1b23eed97dcf3d95b983956517defff3a556dea9245bc4656a0a5c274d56306967f514a2ac8d025bada689b006138f85952032b911330a14369f6c4a3500e16800d67d1ee8c8f16d5dd8ea0ff349f4c44dde50223fd87cae0d0e08e67d51e79550ce3fc07630d417b1ce774f70c35e67d7f9454020bee3bf11a94f323ab7873985806411834d5d114f8d8f4a471b912e0fc591887032a83a1dc8a1aa05ce18107fefc3685ca6755653a4278bacf3f24a3aa8d97eb8c0205185b3eaa7f1379d3c14633465f31bc65f9695851c6d3f9f9743677fd37667ae6a5aa00dda923ec30538120e17ed86b0dbf4e6f8e19e722b3447647ec5a8d62119bdeacc5aed81aea10a0fc63260772a94ff00ff8fc87ca3817ddb0573f196c7bf98566d6cf6083e11a6c892841187d8503e8144d3c13c20b204a19ec2738ac663444390528b98015bffd374144216c15b6bf13fb1d71156bf9ebf4c0a3f6d6790c0882db1e86277a991305b0ae42e9bdaf2a41ac29897a34cf1dd963b5b93d35401910788b9cb6b79fb77b2a9df8f391420dd28c0eecf8bb70e6b2913ecbeb62c04c8ceb0990e271e1813a6931380751f6ea6cca09aa03f02e93665708295a5c63678c0b851b700264f065a458477c7a6cc90d853e68beba9997e8a5350b38da776d5373ff061b755fca984866cd990bd71eea9bab4928b641000f2489e2a9bea1813d8114dfa3dc624b789d6aa1ef972b10adbb1aa16260c7fb0c0039e99037723574ecf377c7c35da770fb34862acee3c19f63c75a56a02eba62639ffd5528af25299e542786eb245eeafda0694f2d24f47c637b6039763d27cd8835daa6bdc577e72835427ef0f93d546ac7a7cc729888c2f69be3d18e201ba5e73fb9ecda40be927cb53ed2fe8db41c5a11e14f79aee699402fee1e90d14823aab5fecef9963de45554764a03b174721ea064fabd6c009e16b1e9887976dcacf466134530185153194f6025f263912fa01f4347655170f894cb5044ceefb7068e9cc7cdd62d2c9a2a03255fd8431f89791404489588c1caeea9a37a02617fa808ae20868bfea1625e3b33a8003c3221e2ccdea1a4da8ec87a9b966cc746721a2281b17ae1a80e4f303d0ea348a3563f4afdeda0ba6f531ccd9aabbd33a729dfa810a382055632a953b4478d7d81335fb22ad51302b18a07b23447f5b460c3c73faaeaf8015d7c83ce76351426fc542fe4fa7068e668f138d4fcc60930df444ad22faa5808127cbd4e680d25ece5721133e2a4d53c3083030985a32a9192f2565bd0ab12aa303a9c7e331676c194e1ec33b811b4c01d98cb8e1b9042aabf68437fa5bd744281f3548b87d708eb0af67fc158e7a453c61bf6c41d6cd843ba21f35d828474423872677dd0753e8aae9de9ba4521242da7f520cd77581a40c6e2b2341a364a491ba12995a2480fbe59b7ba62210539e7b15bfbf76aac8d4e6e33f7d2959d0d9b27a18221fadb50161dbdcf929c774544ce8fd5d0545f81ffdaed76c7d5b5b0be267d5a399c5810306d5916201de150889ac113c8693e9e94e7e6b3d1f02cc1851aa35e764cc2766bc7d0c893c95f9f83aca7875ef7ba8d7b76ea70d51b1a8f80280cd052c4d4a7902b08c207b2a0631cb4c2c9e9790873028af2d98da5e37522f3770c456d3990512b0ea1c478f532b89cc92f5e702df7b633439d99b03f712bbd54e8088eb51c792128b9db121f3e3aa92532636989a71128d8d13c17862c61965a66186e706dc4a9870a2ec4bd9c8d183038cc2c4cd60bfabd69ea1a857fce405c2b985bf5dbe7adb3e004459d2da5272f3365093479da953348c86f078bd22f57ed32f8403089e1ce0a45ead205731bf3b5571c575b6ec0e8f9a9ebdc1a8efe97ad4a48dc97b27be74c27db6d64625cfa140f88f93802453e96372ed46dd5870e8c293eeaffe996a1a140578b29d356000355cbc001ef953ffc232acd300ca45277a75e2e4baf04bf8dd529f0021b7a27efa066f611a466224006db3619d38bc82801eb265c9a27d0dfde85e1f37d899b620058e876bcd580e2f11849a04d40d63b65eeba862452f3b2b95ae939bc7fa81446f65be5cb1f90b89b88a105e13da846eb5414e033af5b151e8355d29e08", "", 0, -1316219454, 0, "8ae835a94c8679bdb359fd695056d828ca3c31f1f5212cfad93c3a12480aa337"], - ["030000807082c40303ac0da6f3e48c8e38029d7317f3890bd483bf7b8f85a2a170d95aa87352c91a020000000000390f776cf880e514257b89812f0975d0ebf7d7d74f69dff39f7c7c1b85dfb7d7e62687590000000008656a6a6353535265ffffffff5ddc397cbf65c508b07cd92fca4128782444f7b6ca036e707c5771242e048dd40100000006ac65516a5152ffffffff03e3833c020000000000e5d40f020000000006525253ac6a6a19fb4e0000000000085300ac5300006a53e0b9eee43b6cbd0e03000000000000000067d2620100000000752133a620f3c564c34d020d9dd456835c213717e827d79b29cbe7b4da2fcd08727cb7a377a603c4c888fdecc4eca9c8d88f3c69152f5509f95dbca1378cfdf43d58e1e616f1a18670834765b231fb10386c8aa9905e5f0f8d0c31458c9e14a500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c33d0c654edd8fe95766e3e67623271459567211d81b6a217c38a8e04dc87690dd86191c263c5eea866ec291283098ddb70381eaac692bc8f3ad71cefcf580c52893d8e1649180bcd0aa39276d08c2c653b7ae70a4695d45a664b0f1a28c0f24c7576effe001e1632030af5eb36b2fde0e60f6540c7f5e8ccfc1be39ff968f78030a89d54c77e414559c010711095205b1844b17301e8ceb7ec28b0dc8c9127913022086adcca74eebce911f32d06fe937894c447449f4e2e16fa22ff1ff3f96c1ca0b02e66ecda083e0c768dc415e0fcae06cdfdb7d4be4e168f5cc2096e32e01ce59c9751abcfa5e80e0ebe82b7ab4972ddefc5b90766084ef00e592ed0ea89a178e021d4f5c529aefb20e3626076339eab0485128123c36d84e75506b0f0919b71745021e1f8fdb204aceeff849ef4118b55115e4ef98490cade4a9a701f02cff84f291022bdf07fdf5dd1249569aa9246698292cfc7903ff3db0dd0d164105c1312506290206f06067e04d510c8b5f7c46b3e14bb7e651bad0980b11247264f0af12e38f090209180371cd1b57dc3baacd272e379798a37b0de277fc63c77280055fabfc489f9a5f23ad7eeadbc10f246006be10b1c83fe40e49e26566590b1b561887a9f6f2b4d8913f9cd565efea103e588c00221eb7d64d56888dca85542ab7fbd665d8ad9bb7f481f3ffed5a929a54c6a557ae70a0b6394f71ffa598a7a5c86e7f6c2b736d91d89925b07eb3a6d34c6d729f0ceac52fe4616b72941879cee923f09dc7fa43cd46feab4d5cbe5013530719e06b65eb3207154b6d9991bd25f22d1e5070c4078658803a44bee5d492da425a055ce36fea545fec76ab56f7a7c210aca79f56af39a512b8ab4101131146e5bc4054ddd1940f10d3df10dde37970d1ef67337beebc39a66a89b092451e95a73c0b46cc7486c397b38037862448c052bb65298b75958a67609a1d10ffbf09648dfca0cff6f85e2d470dbe66cc1860c3c6154dd5d12f4de0e9fd694832587d4ba821ba77b6ece3dc2627bc04714e73cb81e56181e61de79ebb2ec459fbc39b3d3635effc6febf3359a7d2d39da1e6841a53692d91cb0485d490ff943b60a8c2448cea2e8ebb90fcc5fdfd9c85fc3155ab1799860b0d01166ae056331f66bea95bbe9741bb44476a582140681962cbb56c232aac15d06a6b102a836cf06c6cbc1ff5df741daa8fac429742c607e1ffaf861dd66a359e6bf3c05f36af65c39a8fce697512c3518a2b77034d0b168146bd00bdc89288452d1050b88f4f11255733b04191906faebb671ce871bd16cd64a9194d572386a89866eace82dc7c365c8600331a0ac95d5b060762dd16ed20a8ae42fd3371f6051f53cd4edaede17e92943cd19644176ea2669928fa65d6e0c2ee614e824e89267b60a0f8ab5741038c9ac65a990a3f6fd103223d62c9fa9e699f8f7d508c90fdb341034414f8f10eec10b07ae5461e982bbc0579c048713e27aad4c07ca42c15bc2beea19198d68ec150273e51b3542c4b93679dd2c572d8ebef7446afc6fb108cadd598e55858c70ea2b18e55416119797240ecbb574de03d1efc13ff363b99e21a0c5b9caac26d7cd5254defb42ea82d84c3d54a4ef0d59b5646352a06248ef9dc82224db0a1e7460a0ee02c50def280aaabb6d4c6e006f444e1e89da07d6e483d0aca25c509ebea8e70e90934de9281b79557906b7f556e81e72ec4d06f395254e7410f8336c4a490546a45b316ad83116981b07b168e86d464c9ec0bbfd24ab8312547ea3b094016796e048588eeab01a403a61b38f32d7f97a0d04d0136125e32423c875168eaba1f0b0d5eaf3beecb174d2f78f12d96c9ad439d00f8a43074cff00239d4884e35ed0cd57dee08a3f82148dd0d4b0b7cf9070f280f247654b4a5aa3782373d5ba1bf7b38ba57713781bfed12c1d03861618c1bd4e8086d1236e7e87eb8240e4d457c2bf264f56bbd7f40f72040113741713a20a00f8777bbbcb44a27bc0e0008066730ce12c3eeb84ed013468854041bf4d7883a75cd7d82b1200d67efedb431ef03a6f98bf9c7aed3864fda493f1f6ce0d58554fa0c0968ba81cab62fcd4470028be5036459930051844e162eeab87030ac1272476617a0f7948b4a7f5a2f0715973569f9fd697b3f22b3cad651c6a15be8819fee6270b9464171e38f4572b43f0a02f47e8177d9bad129309255aeedd70f96586993cb365ae420b68c5585fbc1956c81bac7ff6135db053e7b5359e0883e19b6feabfe597147a167a13f5ed55eddb6dd42d63900000000000000000beeaa3030000000094ba1255cec246a2cb254ee5594f897ade62ab2ab2676cd80e3340dc75dc666cefae3369705c0d1621b0ab374b8216c772c5864da06c27a2fb9e2c6970a451e8e82d0e4d4e170849c9fa49bb18828f25c7bc2bc59cb8a823ccfc33c320bbca0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c4954ac97a38acbe6a12c00c40501099a86a9dced7ba71c12b70b36e5a795dbc35b1be9d5d5fc4838a594dcf0e25c0122ba9e5acb47566bd6a880a6395b24b9cbdbf888a9ba919a07b7126ceb3c6214abcb4866474178a50ee5ee6c705cebf1063d3b2cdd214dbf99040f5b256bc96bf0e8f8693eab0f4b0ea051fb01b0fac0a030ae01696e742952a79740d95e588b8270956b0e58efff65822d59c706cde9c260206567887e62e011bfda4e8399c222aa4625c45383bff7ec8bc0be50bdbd6965c0b049f40bd0ede4e043e21ae66e8dff63ce788961f2413372a7cc7f50fb77d2175fde048dfbd963e334fdcc20141ccc340dfe64c3a985afa2bf6797c2fb487c93403252e93cb081c812b8885677963e490d1760b89382d5981aa69f2018074a38faa020cb80ce46056f7d56a6f3d403c8338949bdcf828adb478c421576e3802c7bd61020f7e13e1682da4121b90d21bd1259dd1cddad5ea9c4e9598afed81b44a270f06030280b1383774928019d9edc1d6439bd680fd527fa6c7f344760db74d5fd1ccb60217c5ee94f5b611e2b8f604b37a98adfd1d3498c1a1848ec87227d83ef77f3409ef2d695ff81655e346b513aad0c18b9005700282bc1e0ffba5709e455edd5c8e88e172d769e9c0450c57a167733ec6c7833b3de91aee40d17ed66955f9bf6a91f71b8e035a811f23aa7e88e3c99f024906b3af690584b560f44c1889eb8cca11dcedb25fa224dbab99b8c8b0f201c0764d94ced44c518f56c45efc5cd13324314d4669acab9516d21d12e9066e0ef32d5511e437786c3edb580640f58091399d9497059fb608438da5d82fefa6e8140726018074b0244d8683622e9f43aad37789de12504ecdd5b9a842f0fb6e6bf29b0c530612f71d3950e36f8153ceac2abaf96004f3d635d9dd1d38f0d1741b982559fab6f7b42631e494838b08e7924c29173a5061dc62d9af395651a36e807f40a09dfdbadbf129555a955dc8178a3e69ecfd1511a65389f9cc7702e46d081a952c3aa95eeccfc8202f26af514eed8b4d5a7d7c53f4cf31461431bb59af12e754e25130e57fbde357da94edb5bd799a661df4fa2c51437e25f0b0d374cebd0378ca1c53f330e90e13ee572e1e9a40187e553001ac202996364a2f3add3a5982399545b0184afdb8ffc18e9f7c4c4a3256fb820fae00767b849c229047354840ac3faf46b74e546cc73f113be9d9d97b15099ec5519d08a431146e8776a8d6b45289d2143f3d36e5d506908963b86f52d35a40212bbcf0215428bbf7f06ef843d402367812adbb7395d3f1e23a77ee2f42b9e0dd3f479bfab4097b7e9bdec0e4557c7149f5cc8cf1b006e3c1b62199e243e12736b6ad84aa4c3db185f6d4a55a1cbc514476148a032922cce68fb74d3b01acad5d101e65a5f2d3f0eae44ef888ee7514a39cc8374a532a0b6c40c06e6bb06c7c1d875c793d5e0f502cb5274e4592cf1b910f3032f2aa613025fe5bc55a2e9bb243962f8e972ec8feaa7f9325043596c271a33dc799c9f9f54d493a59276060eb1236dfed7fff65e989313eb270c21f467f5d767c64db96f478aaf04689539d02690e31cc957ed7b600ff84b4532000fe2c219779a28367ebea730043baad82a0529750bc369ebfe02970fffdae4d15e0f9c8c5f8030687595e4408eca2f2bc32bc6d5bd205cf8b71634177857fd1120a91212c7df67d5f511339a68b4c7b542e8b2248494505dd9fcce12f64fdb0806b80c3215614836b5179a5fb1d08213861d1205e00f55a68dbb15f3ba27d0856c4af4e2d41c4ec781bd4c5268fad7072f56bb6c4ff746d8eb646646203fa19fab8b2777454b931703c2e78d2600ad65309046d2572c74518f98294779fa66142b86ac768f8910163c44f0ec597448756e12bcd28df4c9dbe42c6788715a04ebf8474186f98e360d4b36fdd92473c62b55c18d21bbbebe4c0269f369382f8247ed080aedc506cd120ef6a4afc3635d0d8e094ea73020e6744290f535867a930cee44215240572064dbd54ad257642b175e55dffd5fd9b5d0785f5c9610fdd1be0a79f1d741a101752d58359123d4bcd15a0efa7e3bc52ca6a4897cfb12498e541e8c96c588a86826ef3a6e0ece53ac211b2e7065d4f1244ca253ace2d6db41aa166cf7281f81072a6835608db033b676740ee23509e46fe95ad1f64913f22770b5aa76283cbc1409e4e9ab124a90f14db6088b464863bc5cecbf704f01181574c5b8d8c19d522a325116d16127c58b77f2bf757981fbab04209fb4ea4aeeb5dc01e22f8ca0400000000000000000000000088d9010767115979746834093fcd30ff80663d9a4a84f8fb10608825f69095e5e9cc2b933462efde59f0c57cc7dc7bb5a3ca15a20377eb7bd42eabbc0cd46b67a5160ed58ae9659e7f14b8ff40344f312c65b554c6b53a6004bb4d45977159c70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000059ff2db0686f71307cae5d6289d9450c64ef3e264fc302418c26775615777ecbe31a9ad3cfa76872e9f19d0abec466fb8946b3b73af05db892c2810cb4eea7eb440ac327c9be3d7faa15f19e234cc804e17a171ca46eed8143e65db3f594ae16aedf8e027978c18f3958ccfc022580d4132732edf4d2705a5ad99e9164b0da280304061bec875e07e7202a6308411d36bd3ef898cb31027920f6137de2737b7550032d40f639fe17b743c4c2488012c58514aca3bfb9d1969d55dc87312f9e293ffa0b069aef3483d0ea18e1bde81ed0a9e3d2407f17b2c2be0b35dde360418dc5ed30d4a158fbb9bc2683294e702b2ce7280649d062e13c9dfb8654119b1a6134c00f031fcf064ed358d45f481615df10f7faf27f4eb0f9b093ef848905be609d805ea1031cf0b7578dc91113978144aa9294f3f92fd55351fb860617d80463d0524559ab022f9dd6b7a58a44fe42a8242ba0f5097367c242346f4abbbe932e03da7eb4b357031f2800c192bad38f5d96d75d0fa298d53b10b1f376242b5c8582bbecc191d21e0305ea5ce4949e62780365a17048b788d977d61a0a504ee5255f8a6b4feaf0082fd7417729c5bf3bae5801860e88417f897c81f109380404d2800c1eda85105f6e94a65fe2c795d49b56012990c162fe9580e7898c3b86f0adbd6764fa7a3e136fb89503f06458b0ff449e6884f4a571473f68277536a3376532ec5ba5d0d031c00099bfcbc3b29cc1fbe63fc0a830f8107abea55c0ed087c47994eb21ac9173935bee4aa555dfbb804e8055f86e8f0faab40fe3b51061216c14601f12cc0fcec7f2a1fc61fb6b9c4f917fe44d9b08181a2a584e7389506e4988132bf5b25115e26775f0929a0935ba0877498f0380003c765ccbd2eca53efe8b08d2a1ecddbcdaf2c039d2e49944c57a329e7338bb04badef59800dad5067557a0395d0a23b1fdf9b43cd3e6d372070f84a6205e808baaf8a97b2fe20b190b351585b48f866ca65613926bbbcc36e68cef97bb3a7394d9ca401efa9295a4aa97b325bfdccbd3ca39084f1fe2c96e49724bcb764cabdb1ba1ab3bfe93032d998ecac572c24cba74ec0e83fba7537bea3ba1b6f88138a3756acbef44570eb5ebc055be28e48082ab79663b6487a33dbb05fa7023339f9335cea2a35c8fe6b0b263a971dc68f354a1ce84da3a49567cf8118dc9d3f54e3e2cd0f27d5529cabdc16f6224d35822d17f104c8c8a1588b102622b56fdb9ff1be1dd25a5e7ce2a1c3a8e437097ea8aa6c907ccafc2e3a04f9c5741ace199ff88199820f67a5e8256f4bf98e1ce79abbb17f4a0c60fad1017f4a0c0a5a85b8e9ef231cf588d2e684b261e1ec67f3cee1ac7a176ce6d785d3886dcddacdbe7367638d8dd8bd022640cd398d3b5ee7e568e362351281a1aa4311b1a890a90f2b84959563e05fbf507c561a6e369e9cf1ee4f9c87c0c0cf003bea810768b0ce470a384e1a34be1f4d1fdd4e793228c37d8c974820a23fa2595b484deb26dbe87ca793122e01b964d8a11d4e386ee3d92ac183e440b5a24a7a3bed9d720018052175c7e367ecd15b057a4cf33fc2138b564b1cc8d1584442b36802f486ecd855ba4fa1c1ac071db2c19fde570f198cb9d6b9d3e99fa045b6e975eb4d6c18cf82916ec7493c2c65136aef00751fffb622cc237b980ca9f5e2c488f816b8cee50bf1397a55423523a04ffc73fe0ce21877446c0a8a80075bf3b0ba060e00f355f39e6cb5929c19da273faf438f384d752d418f012443be1e7d14145bae5fbd0254e2905cc2a4bb72fecad954f8f659fcedda9bf74f478a344e8d303b535203587f3275b9b4f3449cefbfaf517442a587d95c43dbba57a0582f2fd16399eaf21fb9ee4077747b8586c500712a310ff770387d439b6feef3d014ff370fa3de8b65a6045a1fd8aa363ddf064abf978faa8fa15a62427120ac11e8719dfa984a76618c2471fff1ab1b59183c108d99b7028d9e4fd1a825b671e70d475b34ac3e09b1902734e717910cf75630da50d990e9d7e0eebf62db7c9d29f201591d8bc22ed9b17f24a1e26073200200c17006e2a6a2a16b51cf329e8672c5cc2ad5ba65d9bbfdc93f96e8508d0daaa505568251373048a087fb56f977bf65b21af037f1d5405bb1ccb5a7d860ffb6e5d84915c0b500bdfd807a070cd0ff4ec2c7aa2280ec60d8472212c841c64bb4f7517523b51caeeb58dc3018512fae22d2f7e0e0a6dda33c82aba8617d663d718e26a717038c518c23e3f168191185c3d462ae1f8e57f743601a8c932c8be0008195db7e1c5693c9de706c43d42b2ab9c544dcc6ff2e0c7c75e56c8d27be84c48af5036d92f7a4033ee5b1dbf09b0acecb8103d62b2f82a3cdf50f74523e212eba61129220d7a3331729f5e3858318d7df78b9c48e45a6295d460ec0004", "00526a0053", 0, 234662915, 0, "1f28015cebb58fd9848a36f8d0ad86fa16a41a4a31c5f094f7ca67550572f50e"], - ["2b51c47403ecbf87da7066d60d9c3e1f03627ace780c096bf0106db830641ae288fe03c644000000000153848cd73ad0314cd23aa50f9b120932e592a19a2ac820aa9618c9f430e0f74096ac24907102000000066365526a6a00e0bd823380143ab1f7012fbb434262f4a5c1b3c99ee7784e67600b428e3cc22a77672b9f02000000086353ac6353630065e9fe44860476f0a902000000000765006552ac656a4ce18b04000000000763536a63ac5253488a1b000000000006ac655253525159fd92020000000000000000000300000000000000009a73af010000000034fc516e0dcdedf7682ced2b56ab1aad34aa703a47ad15d14e579612446577072e3081ca3197e0d0fdf963972870b647600bae3469d605c543e7618fd92eaf788821ba81184dd8a4f42f417560803b9c1814ebbff81606d9ee07d1f819a59ff4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006abdf27b174d05d413490e366ff9960dc34a93d93366109b8e84ba0b7de9883311b545766f27dfe868dd11c79242e41f035855c29d0835ce349040c01126794512d016a4699f550ae8818923fc32d673703ae246699139fb14c4d18fb9587863fb47b31bbdd8ac5662c52f2692bda72e8c9cd81686824a67a55a66e37261e604020d6cea0743a6595eccee26ce8694642e15f8c3208e9510cdf5882a2a5146b8f2031d9069b6fbc87378c17a1b596248f29247c0337f606dbae863299c389d830af70a050c341380f8ec20630a8e7807a10648ef1e40bdbb1caf5a9aaf8bf17508a736f5919430b00947733760061ac541843e87f155b937e1279eace5a510cdcaea47030db954e4c85fca7e5df2aa40f3f9961a90e78dc6b0c5f7031c599e125cc93c67030daf0116d9b94d73f49a772dc3fd40b4485e215f5470d2c461a2aad90bfd42c7020ca2eb3b2ce1d301c7f40c4507cf3373c05a674cf14ed63f48cdb7af02c1528a032e3c94fe640aad91b03dad08b5b86fc352397dc77a06604484b3125784f7c673020f201288411375ccb69459edc1ea1f0802e25afafc5e50d60849483f5053e5051a277287417995aa9cdafd54545f05a6f9ad2737cba0c77605b75526f789a1158269e454b681f31ed139c014cc292a837177a6437cf64315e64bfc6de519e30580e3f982fd76b4eed2388edf452d0bcfb3711fb4e44cb20f1228ea1a1865792d0bdeaf99a2b5edc046dc5586e3b1ec3d38fc6d6e60bc0612a4f0f765fedea8b4d0ee9cb3d8561bbb3be12676232a75f430939b03d3f20fa8d85eb2f68e6c79d5e47594f4588870736d2bb38178fcb819e6321ed80b5064c2163a2429e904affa86bffd32fab04fc0b0123155c81e31f9859c0c79ce46564b74f3bacace602fd63ac32b740d0bca60c0e499ac7ee857560b0a612131249eb342d3862949ed70ee85dfe781792de900e2784f1afea1d678d9f8843c34f03a1450aec2314fe6abdaa28b0185dc3a1c7efb00c0476907cb9fd9d363961fa4e0fb136d0ea564681b61b737dadae2052dd2bd1951d4bc7b4dc30e7bb8d8fd64dd7d04612fced00c262be6cc0b284713de58f4bb5a3ffffa16139c49018621ba85b7449b3a5fcb9fe2cc3d0c4dc0454e1769345e226fe9922e7cf122159a84fe5e02e8e8d21237ff56cd30bf81fcd3ef42c743db854c7f0af959d17a25acd28117720e75c29b073a364da4c6a4210b15ca1a4fc7ab4fbca506530a066055632bfecc800f773c93db04ddaef1ddf7fd176142adbcddc9454f74931f735d44e1a463d80cd5ae7026273d963584dd98bcdf888894e8cfe45538824bb276311dcd34260dcd188f9f888aed81df0b38e34389c4d92971496722db930f480c9d45aa3ee48fe576fcebec658de19744b6d4aebd2d0f2146c87b2933b05873499fee309d90124cb02754a832ced74d6c13fd4f835562015d1b56be06d19b207a864f903fdcab01ba6ba0ccd916f8cd6863d4073275441abf528b25cd512b72134d70d17ca22dd07669b86714af854e08bdacd6cf82039c9c68d63fd72ef2aac631bf3aef617d95d6e00d251c2dd526a0fe15bcd24bb03bf32f4f3f03cfdacf1691daac4fee0b242d43c48541dd23da3901a9e4fa9fc116741c9821c0051e100abd8b154b78365edd8e6ac102bfc16343234f57102036ccffa123fb8be34e207c04d549adf6595f4de6b9946f53bfa329e77701f6d2f9f7ed105f2548afd0c37b91f2d4845795f6964be923ddc122040f1783eac1f80612a782a6e48aa92a54e8769d5288d3201950ab9046893acade91aca9033f2528ee4bcf45ef79c1c0d5480af171c48ee8447936327a40cc22ef0051dd443f9922ca51e878b018b0dffcb5c458361a95351b2485eb17d18c055647fe495a31edb731817d3fe9ecc7e8b2e716e851b39cb6261da691e872231bbd1ddc0e9950521268b5db5399d8f42ca2cde557bc965e9eb2b591bda5b8c574ea39afebc70cf7d68631cc8236e656c4af98d994f5bf50dfe2a45c298ad95f6b204f1c15cdece8a505792f37197e2a5ce4c45706d3c1a655c235f433f2d3938af5e9edb589ce5f25245c4e16292ebf7b90cdbb2ba38205933313c43dba24c3d55197bb75741ccffb1fc372537c2038471fbd8c8480757af6a2829ff331856c6052d79ae60b3e80262a87b737c1408dd03971c4e77341caea06abb451c8ce21eabef650d4eff44743a3df924993272335369d894dcc6886194b44c6db582436d05352b4e46e8d9c76c9bb9ad88b6f8033c4c200000000000000002651c8010000000008592678351085b80f673e01c025ed58684d5588a25cbc10b34bfdb57bc127954ffdd78acc20448a4f4af4a1f9e3ac6191bb3f74bcf301989554475659a0774dbafd2ad09d5700f36b9601b16b95cdc2a43f10315ca57676633c5f74fa32bea20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091023f9ff951429fce5dea6600b33a5ad3cb19f96684039026f8831a5d2f04f878fed2be224d78094f774cae8685675ca87ef3626c5de0cdb85dd432d23c2fc1eaaf4656f017402dd49347e43f12ea2f4e558bec2fa0ece00758bb6ce9ebaa3e40e0f7380ac55ddef67688eb58e62516b995d8102a8e07b66e938137394302fe03206b664b9245461a5c86a31633cffc8788b43df86b5bb4de6823d6ac6b721d30032d358fbbe96762145de5a5f08187d367697403ccd29285350940263f0e71de580b0146262a5d087bfb4f1f3a8a495436903a3619aecae661ef2eb6445a3d952412623afb4312ab90d41ed58c264f8d583e5c6361342249f719a02f860dd34bfbf3032c31d8d79125541965f19ef2d94249e0b37f40a1d4d898dc3a43785ebe3344fd020eba1606c58699cff434580324950069f6c7e33e35ff864c71b3274edb4e788f03035ac9555ccaa25dc0aae0e8393bd91d38bc640fcf390e65d3be31da3f15b91002097ec4fddca9c615e738fe088f668afe3df3027af61ab9bfff31dbba456b620202229a7f46e77d343de98fa11c1f7738c17e6ab65197fbd142b6711fd523da2a5690e646eaebd589dbc1e8a5e56db08c8990d52ae8deb036300838eee0e734bcf65b7d256f4e86fe9a15a82ff821b09004dece4f00a6427c5a969236917949e9ff71421dd0f80b27cbab012237be17b38db2c4728020697c3fb1bfd7db27b72e5588c7b91c3a2b61b3b83e7d470ec7d1486859b08cc244070ae1b356f4f497bc3d0262d95f36693a358160743c3ec8eccc922ef5b705bf20d1ed722a15002e45ed375570d5280ec8fa6761c8932a2be091d0e3fa6caeb56c27e5ad1ed0701a0ef6904cf4b44687851356661a5b80f11759490f302b6c2b9d4658f2b974a72463934435277dd31839cbef109bd408481c414e9fd074d551c6c2e1e77249fe358185f467326338790b2afb2c6254ea2302df0e562c99faa168ec2c392132537c8da5af7ca712a81a95561c0cfc25f0e570bf5245c9c837d823a9bdd5410e35d52832721e0e94b66b3891f498cce9c11387e3ce1c4c451a82c5e4eedbed224ebd1562853bff5203b48125d3cf620b95a6a82c431de1be547a79efe6f080efbb4d6b1cb9545f8ef27c9144d1efd8d6f10219711f83923fded66ad3b5f004cb3e880cceec1f475bb1b6d3bc3e939ab98feb0a67a278c85e1d8b00bff91f3019732314d9c3480641fffa676a53f4ab01ae498e8cf456a0092372f0daab4d4531c6c4486771798205da24c484ae4c35f933130a89778bf712079aff39d19c5ad5cba7f7f879f7de020a8880f6d20b07518361c4604eedcf706b7530aa79fcf5ed42909be3f1a17208146614251336d2bd5f701be2543bbb34586623128a6d1cadea2a0ba8cc8152534bcd6b214026f5fa7ac1a9acd4e7a45aac70c63d84c7cacc085864ac32b74370a8f819bc8fa9ecda24ed555a941403ba2c5cee1c8d52d40fe49306910025500f59a0cf2010b028a2bce8bad94537cca98601a7853a1a7ac015cb83ff54a356836a867f211eb1558223554810d7878097f315e66834fe0b6412133287ea8d39e39082e349f004335a9b78691c61c0172d39b7f0c2a26db5a12455216fdb00563593153516bc6c45d0c601a034a2256246d4a104f412cb6f96c4587cfaf320f325475229d55ee15908e6f5852e960fe683dd7f37edf0b7f197d8f5caa68fdb076ebf889192a1f5d2fd46232b4242f897501770152738af9612f53b1f52c5f9c7d2680fbd8f12d1eb6a5ebb84de38e2230168dd072ee8fe0d98aafebeaf029357c5ba704845afd635ccc8574634d156709f579224d62e3c4f99a4aaf9d39bcd8cab87180c43bb750f950a0b1b7875967882a76a81620ee83e480b5da881abf976f4931206e3612d75ab45cbc5b94ea54efda5ed5845ca84dee9e8f23f5dfef4ed3917a3577352128a1956b6fafb12cd02c74cc1bbf5ae0685f392e56c9f9ffc9eb48d729f84fbfe9e3f5de3f4c1923d74e4c2fac07ff0d8f1354d495d7ab21d5e9160477b7681d9872a0f00ad7da493730ce9e626af90c6f20b95941b3fe52f6cab6cce8bc4857d45b38c912c722de8b2468b93cd1b138f6e61772a31a0e05df20ff2fe7a84b4774e1c164375d40c24bc7970b9863b3d38423695de4108af905fff5afac52075eae5f34eac09d03d39368611d7da3b01a49265741130bb1f84a9ef65226af429daccaefc2bf1750c62b6ddf156d23d8b14ada27f0f43b9ce69bf0408d47332db97a9ac60f272fd78b6c61305010000000000000000000000001cc9cd456154846c546101a8952b572040100b2dcf9a0acd145d53b45ea55c5359a75f8248b4f176e192833d8d27680e9c8227398da2ca1f0c7162fb918185ef8778bfda2179bec268dcd225f00db7dfaca40b14a37b717abe3fa1506d6c1d6a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000373be4076c36d25f87c2ec782559981da8d30f3303f4083d781eb7494656fbc2851f50526a89467b48d85d23aee992b828962ffc586d4bb01ef09baaabf225f7011d77ca3c67ecc59e589aaef72634aef1a320778a1c0e08d3b7089541ce94b34763ada865ab03d5991c87bd789bfe46119e417bc8d6257cf8f2325e72b41de602229a55e030c01b3f8c39d2b53d70b499de92d76ba28d1c008023154382343d5403090b2bbc0774675aa5e618d325f6cc12c7ae2073a9b9d3395e035485737683bb0b00362e7fadfa0c6f98fced8e5e167b108a01f360654fa2d6a713ba0aaf183face464728bbf046fac6e984966b6b3578821aa9a21603443547cebce5bf4f24ade022a09e8d3581ea3de283cf4b2fdc03f7ad161df4a9d3801f9e3c7c52ffcd186fd0307b6dbf7916b26ed6d10a285ec162effddb72e07dc7999714b87e04774f5c172030f7e0c822667d69e34f59f1b2ef17e7919a8910041c32e7c232d0eb9142cf6e302054e68edb56bc56a02611438e7aeb9801d1292b30a74c5d335337409511d72c5031b184f045aba9951f57eab6a2065e134d50df5dbc17a8c59674e7645ff0d82240bb08c6f572931a73d79da56fabd726d031a9ca273ec837f3e42ec1098dd6c10664cab87d20b13a1e3b071ddaa04dd839c75c56b43e52efa0aeef0e312888e2ecbe8639c97df3219d3c360e90880cdb9fe855090f7ea60d867b8e71c17e2f48803a5dec76921de3e764a96ad37d565882fff0fc040ed309c0948f76daa6831ab7eb4d6cb2c534c986b703aaf29f4da899b10ec99e1f65ef9aec7526e29cca4884f9e566e1274c8a9b27e6a31177c951cc69ceb908f466248f624cd0f616ee253951731c40ba9cc75aa9c4da505980ecee6cf6c68ba3b8c35b34f82bf3a43f14a152608bbf123a9358fd7683d5bcd55ce668e97643e5005e9b6280c8f5e14092ed0117591ab44ab39adf4f223bd75e6fd2af96b178b1b0ddf60aa95183555c42f64a40b9f011982d723007eefdfb3c32f287f4d187cbbb3cf455674a3ae35831d09db221fc3ad882337b456d1dd1e14ff6cf33218568660accf688f6e55c90287f37c190b7c429a3c6fdf33ac385b9707112f69ed28b38209231a649aa48bf97e44845d48a2fc3bc65498e265e5ec7b7f468939c5d0a8fb92ae28071262fbb310dce10b44f78b998932e7edd663846e88fd52168d0e0e4e25bb49730c45f8aa77c58b7ec64dc85f34edc42f81eef35f15b1ed804aacd352e282227f32d51b907f0faae50d1431cbf08e542a376dff99ba26a0bfc4a53c2f8025a155b9cd2d250ab19c1cd22cd1a6aa4ce4123c24ca0c38e6e33ec40c29a0dcb388874e839cd73337e2fc48215921899f4ab7d2f598cee3ad2a0db7909b33248174860b8ce5355c35895f135b3e9012c66fe3b62a9244d7c87d4390513c89b18f967c3323fdfe8b092c4dd742e07b4fdf0d08d75e47b4d80e0f59057d61bf52d816d47649bc68a59ba64dd66ae2f16ac4ada17ec7eab51fb64b6970759d0470955062bc80dd91020b44982f6be1f59c44f09b58648fb7f6f9d69468c43c85767880cce0e915853f56e1c72fc59ff28ca031b4812e6b29f24036e464ab798b4ff99c5ed7f194e3446af98f72704f09ed6508b7e4103002f77aaedb9cea838118c3558765f2b109bec18202727b786b2cd68bbcb5c7d8368050a33f609c228bed34604af700b7b2c714139986993e8864ff47431fef8647749c5476924ad2a45beef3c30cf0c6bfe9752bdac833321a054c59279d1c048cbed3e58bcaf082fdacfa4e90d12b922bb190e4538f97f99c2813b42788a4b21f26409fb43357b9f88de2d770fd75eb05d9c1504d812e82d16088886764779b9e007d79ba3a7269953b19fe5ee2675cd1726d7f5eef92118d65f54c0cdbc19da42551d1701b5e6c059ca5b1eb836ea23c53ecd436726653d84c86a7676f01b42b80f54154ec643d23ff1b1fd789f5f05869b199656d127edba43275c341f8c65e3f685ede44639ec6e51f6d10b2cbf71820e7a318150e0db865ca5bdcc7ab2e77214db97d2e4968caf14c223b7eee507f87911b85a233dbc2b8cc095e9f45c749d4f35e898880f0d5f6e4b37b7f264682362f7fee47a518ffd3b6286dc7a3541c362df888fdd79b7221baf6bf6d1c7f96c988ba70658e019b0b9f440586305b1ae3c9b36ee83e89fa5bb2db7714b982f341af318ab91ca71855ad0dd489337875533baf9cbaed43d1c4d63d5215786c8f4b609124dd3d32542f2b1ce111d61e56494629d458386362f30eb6bf13e4d3d7dfc26389a636fde35e2608d9083d90d159f9d0a32d1e0a1ca978e18307ae9570b7a5fbb8f0767d917b94698a57bf31d6d14e3a18714a3570be1d569ab6905abab7e723f179b9eba72d8022213245ddeaf0f906", "51ac6a536a656a65", 0, -822971662, 0, "a3f3884a2ea87831bed0b0d2c3b80c5b64edd75b0335b1fcbcd049fb0f707162"], - ["030000807082c40303b4f7df86993859e1c8640aa43f9295cc17466cc0e4008c0afad2dd40dd4f37a802000000046aac6553ffffffff663276dc2944dc70a7a9cd809fd4c2e5f18fc2de96033416939039ac01ea54000200000004005100acffffffff9c8a5a582d11d30ced781bd0f049f481245c2620cdedee781e102c2768bfaba002000000085165ac63656a53005ce26ea704d93a630500000000045365ac5359e7220200000000065252ac51ac6a08fac50400000000005ecea40100000000036500656dcf2f12630d0fb6010000000000000000fad5f10400000000995e5e9ac47c226750535ab5b556aa8e29d21af83302dd3abac3dc6b50401ee11b5d8874b8ea06650ff28f37ddbb5646117e14a934c4194d31e3c4fa56894973b456709ff09323da00969c96d2d8b0b750546455103a581c9ff34a064497a64500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0600297c2292e677f3920031248279e6c96beafb507eda886fb0176eafc423d499dfea832fb89a28f652459d114ecb27ccd7585386e4ce7d6c31e9ad39c74afe60550217b8356378ec8f4535b2b25d93668bb37a47c508aabebb3e108366bcbd0bca6b6d8171936cf11f5eac5749aaec1923c82d79b5e60864104c11828f496022484413574080b26d679479fe3ba257e1ce4f782a8853709f8f1888df679d7ea021dfe99eb62515123c5ae34813153c94e23c4c9a814b529ddbebb2a778d2b786b0b08d63c0ea8881cb45283eee4a5fd1cde344b499b32f5cc974988f03d0b2b239c98854cfb72318fca247238f4c93016da5f9562f2e0ba6e15635b86bce4eb5fec020f0c30e99429655ad4317f17543422af1bb74fc3373f6d3e3ba6b3d71eb28682020ec92f2582df7aac866407dfe9edab19c62f38866aaa0d6b7638d662c5a38e540217f33bdd453db924c18f9c68aee8bd2ed2943d3e009589209855d685e17bf31f031ef3cf12463f20e3b29399407bfcd0f3d1663165deb5f135a351c85c1b728b54031d47b7c4146553f142dc2517d9094941fdb2c2546cefe8de11f3cca304ff0dd56b20891449f2390f57cc07857a3b536fcf6a178cea5ededbd7e30c28ee2f66f29481819b738367f28670922c8a24fa3dba51488545b91e129442d5f407678a352903afa1852363ee440ee72eadc4d49082feecf61b13942a1717f521db4e844a2da60fe6dd6ad6fd7a5e4762b1ac87ba42101af48d0e3e9a7244dff37f2aad38676a8ceef64b6b3bf2ff6f977ec72ee6ed8fdb3f423b4244f5832dce5c41cf0d4c9788216e5b0c0cb88ea67c93c41bca4a6d66086e006de7b294c25797c5dc5cc1a2dc74f57239dc974a0a558925f8f9b25e0837b470a11acb3a2da0af87a93cfc6faa78da6b520073498290b495bd827fe46ea15d99e97a26a4c77292ab284cd916ffe96c2ac796e8e0473db6aa16992d434792d56285de517b87c591545d803dd87e395cc17dfe0c53daed082167ab60e7c6bbc3e3ee4eb1280e721e3b56ef5cd20952c8a1ed54c28ba42c50b289e2c4b933b9029185fae79bc7b4d0a4eb31e8c8dfac7cb853a714f0ad99a0543cc87d37c63e00ebbac58a2896e92f582f321f1eceb02eb8b793208227e4c9ae525268ab2057a171f1b115c91cd7c0706749b75f2e45a18a43b72e3705c0a7e26d03c820283b0540e2b04c14cb1e527d25bfff75d93e7e2382c69c84bae0df846235d93b2fb4a626bc2c3e6cb878fcc5a128fb1b49ec1d27e4405f5f03498b2a760706a59340c24d9e2867c611d5360056c31ad342b9fd6e5d3c75f0d00c43e36239fa1d2b1af5a33f8c7cfb1686f05f1ef7b2a048fdd8b2cb19684da3ba3af997338b6cbd99e481d1285c61aa8888565bb8b4212b2ec423dc8f1d1f93678ef6a8ef5d5e0fed96c425f5aacf38411bf324a27195e731dc103bf54ecb24c999f64033d64fcae7558b4d92b1fb6aaeae1a0e3970857f055f88eef9355f84e1e9c9c10a6909e91edf293c4e83d7528e147c1d194b5bfaaf190215ab8b2797af1695b426991b9fe162cf7133824605a17229ebf4a093d01338549bd5c60ad31c2fe07dff6f5ad1259d17015b4200c8312872c18a3dcd4ff5e87a301ef6dc3157c5b33462366aec85aea666e7d0305d806a68360318a202eaf53af4303f12ca4c7b0871387a2e484294319a9580defa57e7b9f94f939c7a7337684295c218e74a5022e42c3a0044814f5fed55e12c95cba0b7807c0b7c114bc1047f7dc5b197a9e3b0acfb01fadbf26b11338d59ca94086d0a78acff095d058b290fd00ad5dd6d07d0203e82f035839e82f8033c59ec0f8676bff506cddbde050fb830ae569450de307d0e5a1d2f27c88b439d2a5a2b844c84863e7962def74bb61ca6ee732e5f17ffdd4903155def87c035ce78e3615e4480eb4b08ccae982e32085127046934c2aa57a91b854b04720d12f35728c5e16be8449baded04fb28decfe01f82f2ab2774c22e4a8ff3861efce89ee2b9ab78a34418d176be33c691f19638070ac171c56e49d3d7a029ca4928793ae7db0405ed99621fab7d1c035fd72110c12b43506ff0bdd4c50df7da8278d409d5d5ee3aef4c36715d82240997571df7fa107f422c4acc5b48f599250763cc128d5bb8401978517a2ab593a7f16d96f26684e738c2f8ce5b5f0f26f1724d05ea8f25b8a3a0f574eaa12827d52077672fc6cc012da1922762d53beb3358ce7e933270197960884bbb144118305e38cbe8f3e43bc7d6d86342b03a6abf9dd043d0635551edaff25b2f404b43f007d6e0ac087e9e54023b2a037a45bd7fae67af8b92599f022cfd3f2b365ec9517df479f9289b87c3727b29fe06570ce0e5dffa3d19ce0e16e3fa765dd80871c41570aca9c9c2e82e050e276de203", "00656a53ac00", 0, 626294155, 1537743641, "51e764cd3d76e6cefeaccce9871996c41f5d0061472a1e73e75fd769556b6a3b"], - ["030000807082c40304a6abb074f77bb15fee9bd215e446061255cf4465d46cd6f92a829c2385ff87a6010000000951516a53636a515100ffffffffdb8a44658b73c34d4ece15c4ddfe067bd7e90123e82d6c3e9f3291788a87510e0000000001acffffffff502213ee0846d7011e79788df13ad72a6660fcc57abb01dbd04e2ecd36642854020000000078684523ad205466a76e5789ce675846284d4b514d45b21b3b74cebaeace6585386416c002000000046552ac63ffffffff01eb8ee9040000000009ac6553515365635265dec441bc00000000029ee1b90300000000000000000000000083096a304c52ca63ecd18eeaea97c98e60d0565b34c5c37a8856aea388abfe06605f99316cdf87c29326b271e6b260190a4b99e08bb8a3f46094be8cdead39a1c1d8f8c131a5e47c52d1a4f369b4feb9325027fbf266cd59bdfc7fc959d91de800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e105648dd85f21c6a76dc78897129a739b03ec08c10378493aab1a50a92f3d97e686ddb48525d3494abf866d7356b7e4e5057f48865b91b128c724b181d91843dc7a4f7b4e63b24e6894d34046c8d24f8088a7b40022f31e90ec7470b1f444b4ac2fea7a5c930fceb8c97d3bc5c2b2d11a624b7a6c95eb968289d746a800fd430213576799171aadcf780140923d765336f2eb74839d6d09145ab3005bf18072c60317ac301552a88e9fe6c70c00fd7b5d40f7ec64742e7814fdd8aa1ceb2f35f5600b07a199bbe57a002ced968be9dc95e4d224f74292071970ce9975ec9ef5c6a29f5f1af336751145647f4d641442035447c99681d8cd75edc38401e7c6f9995646021021ced06e2b54c73ac83da1beae39b39c4a82459fbc472c60c98653f54e6358021cf805f024dbe69ddc9829b29865d1bfaf3b5877f48509bd03f5f021be05e7fc022f1ce47aa6d904b6c713874e2ff49dfdab15831dead7e525bd540644f47b852f0328d6d437d9b532a23f7dd019c33d071ca063c8f53788b18a7bf48d3052665cd5032439597b7a42cf81e1fa83a7d692d1300539d394663e93125423058a8a691689101a6f1d0bde88bb00c8c91790fef239afce27f957412a99f9a9d84add1503eeb360e768421314a377827b7d4907114533da0f90aaa3e676e6ae03f89bf11a85e8e71f3f9276d8aff410460c6045ff906e14bef3b20a2dce20bd4dc23a7c62507aa829d0715c516232a56e4bf7353d92dc6b46ac02eb3c2f8f6a743da798904c277ae6cb660979cca240e14069e613697a6fe537e498c91f78fc2b68ac94eb1d5b56ad1180cdcb5b9f808863ec16eb2bc45fbecb5ebb78cbe11b570558e30eeb6148724d20d13cb36b960ba72dbe8d30cef93ae575982df95584168358ccf620577e9aca5ab661b8501ad239dddfe265bc8ef595dedd05b75fe52ad3f1cd54680ef6b67210a7488a30cacf895697287a5cd27eb84cb60ab3253c7c1b4c8c47f814872bd85d8781c39c1fc562f517d4795b3877b0fb8d1d894ab2b82f64454775e0718794ef085b80881b15f5fa30387e90fa46c73939d1301cb725a19b65ebc709e7527de111712945596f981f6f81ec2a256d590808fdcea754de2510c8f95acaa2b9a8ef7c84e333a76d68937205afca8786c33c0bb4ce4af4cfd6e9aec5862f13eb85734642c566af16fabef01a9d67322ef3757b1146fbf89b85f1add41e9d67a1c346f7d6a2dd11389edc8a91a76d43bbe2a147c9c5d1bed0e564fcbe0fb2c4f2713aba109fb21749e167f361b78a28f056e57159911446913ef68a58edeb65ec9ee9050aa4fec9176f531579e889ae4dd9b97fd378bf5dae0a48e81a6dadbafeeefaa7b89fa92ee27c71bd3e7af8f2913e80bef36cfc0109f7d0c43425f5cebb7b61f3a68757749078dc18e9a838a7ffd644cce4f55e72f47c5d7054f660fb5c1feca753a5b88edd7bd4f514f25ee79cfd0d1ecf0d1f69b0aadb622edc9678ecdf59d60405a42215b0193a012c651e91e38f7f3109d9dd501d883376dbc61619e71f5d995179c8404b556adc5be857cfd65f62fd8aaa2648ed0e482d26f8eac64e23ab2463ca2f685bd3137cd5e772db7d2bb4fa85cbce215e670cd2c18dc61b12f67927ee85f65ad5d59a3c44d87c71a71cde29d874385cdb513c6206cb1b5ed7365c4e3a3a9ef8b7c5b92c1daf884e23619a05291cd009aa9e55bdae136b1c96268131fa6640bc1bde24a6dcd7dc880288f7a224f381d53d532073c40c7ac8a9ba24ffe829375876a268ad54a47339fc5d6dcaa4905b68d94e9dba55b2bb613da5ebfac7f9ee651d44a3530ec6f0d28d577abde202cee11a840a6e0f8373d8f12c1086a368bcaa20b2d382056932adc402841da3923e8fc7f68b8490e271faddb33ba9d2446c880a1878547bf8ca76f7facfb5be4da80a7e59c9dd1e59259a679980d97e132ac0a97c7ad335e4c4283d5b8020b76f33c60700e3f9a8497a2305a4fc1b3ef4ba8e91bff9fdafd0311b0ff64d99dc690261e9c30451f42d8676022beb75c38112243131c41257675cdd5d0969f9465d17d147da563a530e43c3a4975e3024a99b6cf6c9990097d8027c896a7c3fcd64b1623160c37892070893271d9a58346562077cbdbf455888963f4e0482614a4607eb42b7daf46b788c9619643c8c79981e18d7b90b73159850517caacc7beceb8e3e21be8247cc332a900bfaf39bf360f22e097a0cf0ccfdf63b65be34f7b64f79c5086b429548e25826fa0998ac418d920228f0738253b70500000000000000005095880300000000a14bdf182a136357ec5f1ebdc55d554d6d98905fd46fb84471847c4aa41eef5bf5c76ee12b1d55e69533c69afe7b052634dd3c2186bcad20296ba74afe603ef554617eb4113d93bc016d1e486c7bdc8190870c99f7368decad4de7bea33409b4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002fd2092cfa343408fa7c0e05a1165a1e361da0f26ec2b62c93d246574786534af70dce4d74c21ed2b5fa6be30b3743f65660e6c33b93a4086f96627f9d8b6387cc79bd1c4f79b2a9feafc6ca2fbf123a1dc5ab60c1d801e456f968ece94e91c873c060b76252dfc51d1aa7a8a538bd221236171eebb3785717e92cb0b535005f0213034b01e7ed5b5fe81b9c28f3e4ee5fb200520eb9512eed71376faaa28b5358032375555133299505bf6d990660b45ce703a85d7419eb0fac768b7dada86675dc0a065bd5841e8c5c78d069abfddf3e6910b517f0248f1846e46927883e0b07a8fbfe1b4f6f099acb9b86d34f8d861f733836a89f1ad0b98f840ddd98ea1082d90703127c097006872f07f4091dbdbc4877a4b29074afb2dc92707dee457f56e68fb90312b399ce95a99a4c7acae45280b7f3cc8ffa634139becea60a8f8f81449ff227020d6c11b947d206735d231e22c061040d42f5476063b7b0b8c2c7dd0f291093a70311570e1934e6186af7664ad4155eb7b0bbe26e78a4003b2ac54a12a7fe1350f0030b0e663ada5a1ab85fca70d377bee61ef94945bc93443700e9b12f9662c061bb8b7b83eb7a0940f4978610ef553aba111be640f0dd5844d110cc5024f0aa2f9f59a3cbeb56598694a417565210cea25036f246c5dcb1695a9e90f8e9e84ed0c15131adabb144a050f76b411dac35465dcedd14d595aa690a13b783242af0291ae727b3d8ab0442f4e9f8520660155c12d2daa6ba1a1b6ebb804b1e0c6ff3c5dd8b3f9d9efd52629ad1809ac2dd00f8350ca068483399317b4319cbb81f0559d01ef56c55eafef851ef9fb3bde713234ae542138470ace80e58b3c38f3a6fb7e97dc5427e86274da5ee07c09e314f4e5e56121325cfb47b88d4989a4b40456b1fb8ed583960bb7c3dccc87f338ec04777f2d6d75408ad8de64977697bea3035b1fd236eaf1ee1467f409f095ccc0fa117b02d475af23ccc276c642999cce2dfcaf8dd983540208652e0cbdabe894428aa795310110dc42a9cc37dd77c6ce4daf1b08bd9517702eaab3f3a034b9560c8b2c989d7fd64f962841de15db9106632d323578478bf62e819d744216f4d2acc034b2382317d13743397f496c1ea7101923a1cfaef7c6fc368aa3be1484182c2564dddcd5d271e025fc69df97c7bd0bea8ed6c162caae3c1ac8af5e9b17ffa302fe810e213f57ba9e4aa6bc0675f543fb3eb021d7efbb42151980cbf996ca46119da8ffcfe7a59632366a8e5a0a2d4239ef842b9c159eac1c724c1c1e0dccfbc3c210ddfc23bce001d3aa0966c710312332fc06186328a4ff3f9f28d1714b3df30f4b95924b008a5f52c6642ade8cd3a3c66e4e008d85c1491b0dc2ab5c8ab80ca6172bdf0e21a88a62b3c4f660bbb1ab1792f85d6e05228dbb9ff0ed657ac083baa1d531e3c7ee974de95b2353d01a5936f17ecf228cde13b331208f637be72c44bf88f6dee423d4ee4648da525dc475421f3f3280b425d95f21eb380f87a3df483e165e0f8d800d63ad0f7c91c727b026bac39479018a3564165793e4053b84aa32855ead3b530bb69d5f746f33de025f0016a592674c79756063618f8fe79c138a84804f9f5bcc3460322d94c2e7342d221b12706c4bf15aecebf64a536fee6c7acdf7b56df799f4b9aab8ed35cfacea335f207e9d14a834b3f7109e9601a16d0d2dbffe01389d810302a12cc3b1c4e49f7b1c13c396e6b22c4e8603cb664209efd679a1a3d9616e63b1bb4b0b897cd438c2f5bb02ab2047e6e5b52181bc9ffd8072e3512e55f4c36e8fa97954223fb6f0d4319701970fb953d72e7e23deed4b31bf679c5294e644e1f8e68d6e56ee7525d67b57cbfba5b4c47e024ed09929f7be44c4fa14f0d683a2933fd300f6c0efef1c1ff2a6436192ea47aed425a15fe715d51011a292b67b979f0a4f69b79ffce3bd0af14b6122413aa39e6bd1f546756a18e6b73459d2b4ee623d1ba72f5d4032d76f981a1b182a5a36d7c35245bb08f45ea654a436cfdc95f326c2e8b897db2d752531d487c4013b86f3db31164c2bb1f1d28fa9ed5e415acfc1569d3c5481f821d3e3cc4809c0a3d149a3423337fbc963141ad5a2c164d9b5bebe0291cc84580d8a397ee664b304313355d5ec49006145604fa05c6bfbe45837f966a8c5324d3ef892fa50729d451d4242d3c0897b1f019eeb80f2d3924fec7a1c8bc514674c1e06a6abdd434bcea6ecca5a6d1be87a99e7b625f74b57b85d892c18c4261525864e8ddcf2dec757518e176157c676df7bb823959c9d208a70171c79cf1718dc36330abe9fa6c37f04acefe19b38b22101527a0c04aa542bb579de363a51b642c540a7b0418237617c0c5d927bcc30be1decb70fd406cdf88b8d391495564c1cf5dcb793acf68c1afe39c87d3e7c9e20a", "52ac52", 1, -1081881692, 0, "3cfafcd61cafaa6c97b75d4cd73a853ee52c4a5e1526dcd263e45b7a07379e6a"], - ["e472a211013762dfa79bfcd0722e35b03d77d199d62eed45bed34421052f02441064ee133003000000086a53005351ac656affffffff044e0e100400000000036a5200ee273c050000000007ac635363510052887461000000000004ac53535106cdbe0400000000066563656565ac0000000002c29d5602000000000000000000000000af24d0490e3fb5d84c8b005d5a2e7f17c3379b6668273523e9111b00f47dddc2c147a6f22e0a52c065740493c5ad74f2a610b3670d6b206549007f600b4eb7ad673e6d4c3bd3a7d60ac0e2026dc304d74cc56f6fd91e622a49a6cd41630d74770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019d04e91e8079dd3767e671b3e661b3c3a7f6aa05a260dba2ad73949dd9f12eba2ddddc00122cdf32298f7ffc3470df01a9da2a61523b42fd3ded341598832d465dc445ec5d8608d15cb61b865a548da25127dd320f4263406de2b2ef77441f4bc950bf0b1bbf182dd579ab8dc8716f712ea7fff52c870e40793a2c1833f7623032cc911e534d990e0a5577f4671023ee32103a8250d700767e88ec28493ebe92c020edff6558de0bcd089a0a2a8423a41fea6ba520eb75a31cce5697a66324295c30b0411643a0e9942d493bf4ce4fc460d6d35c3a5f5f226ce2504b304b0da8cbdbeb63d87cd6f1eb6d87f79a887a36bcd9a4c51c8487d932f421b390c8a3cd7bbff0301964868a440451006bbdeb40473795642615873977682bb275fe98fc37901210301ffad3b0c6fa297491b67c51d0e7ce14ed1ae297163a058fb25719b0c3af25c0207734e9da77e4228dbbfe8568d910a91b25b233c1101c9b4b20d800a264afb28021aa2442d7afbe3a40870a886294e558123f26f6947f58b22751666dd9dfcdfc2020c78b1976aa74db674c3c287d9b5a9ce9ed2a21941d8f2bffb1e1fbbe2d90a8407627d6f4f56ecc35f0fb088e2ac1d59ee578066c1e6dda90ab12f4257fb79a9414b3e85d7954c137d0337eeacce24e2ba42260e07d74e4e2602720b65d5bae866c823e27e8c6ddb2863cfcc743199c4af9861b772f627fc409e6b491f6e71427683c406ec2c68f8be426d9a1e10a5fd68e402ac0bc995ab071fdef9c46f2beec22491f013c78204390e9981e394409fd8830c870bb66a4774562b356a95b9edf423c274d0316ab22cbfd9d353e1b2c0fa53052d22749091a6f7dedef1372bb14319cfb860aa2e677ce05c0652b2f25484994b083dfa33ae34c7b12d7b9af70bb9a32cb4746c8756f72b279602a03446c929c5616a0f1fe582e619a4258ecdf7c628028ecdc367554ab495440aad658a753737d53e9039e13dd1b9c9080d4d4a12b5d04bde2aef02a230cf3756050da89791e36b0f8bd9254a5e466c3e15ab0c103d09f2ff69b53a2c5b9d258de1cb0d4234472f54846fe6b54d7d852c1ba447738c021c7a7406aa2d9bc3715ed55e11b20e0c3ad250ad9f1678be88dbb4565df42805871f1e3aa2bec6e7255acee23a793480dff14df408ce40ff98bee22e0a84ff63b12e5abb9b651f511a823de0df26acde8d497f3c937cac0ac6540776033669ee977de8e4241c878dee41a5c43963f2356fb33e13338ff4f8518d8a297da05be107da1863cdd84e8e3f885d62a6ca5f4cedb796c833be578facb14a332f46c49598a38e7b1c3c189b119742b2cf385ae0b16db474e5c6955f298c34176e6eb07c0dcd4cabbe6ff53708a5ac49f1efe27896b6dfe7ec949b106a9bebf1446c0ba36ed4ec8f62e65296b2faf38b428abf5c8a87bc4b9214f47d5c3de117f6a6fffbf08bfd3d87e11191fea7f2352bbb98e4bc1911db914e30686ea2258ecbf893703d802aef69af40335f49a10529ce500ecc4c6a25995f233b07c3657b2104ddf738aaeeca5b14530aaf941a89feac618a1b4722de01d2c04adfe460b6a97264af1d95cb46253797db1caca491e423aaecfba6509a31c2185467b28a61d8591486d0346031bb1431856aada86852b0a93544ed78e6f79c555f3f5f32362c541b28d0c51c983bb14bdd9cfe50537bf1d424eb10107a7a217287f72ecc573333248599d56fdd970b5ea34665c9022a94a223cf410b06a7746f8b144939894c1e9078a43787e9e0edb15fec6ab2344b6f9c695244623d85f1717e7474bccf4af8dc6cea77fac7010b1a96fbde909317a7af1b4428c1c86711410bc5b99c06544838fc21003c9abf116c99ba297f133c546f28258b46cbf158d6635114f3755d7e7c08f42a1749559d21f35745f86d3fc885025f462068756d7f705705234cc6ee5030d38f819ad8135cf40ebf58501e611fe296914ce3d26f8f53cb946a6b1e872e4e909d6f6ef92951d0fb6166adbde42935e20d5acc64569f3a1a2114e36bd9a1582b406f3622ae89117db3540bed9c55b44e07ea05f5db3cfe94330762b0c8d60277595f5c8381d793b6a16838d45627117124e7ffc11b66aacc28b98af9148bae6c6bf8ca5221a1b84d131f8c25e980c2b7872750ff7044a324b1533fdf11a6d526b39346ce4b90e9d387395315ae2b02d6f5781c3137938a4a82860459b5268ff729f10ee355b93506fad00273630a602d2b707e2f57269361d962b42c53a8ddead4d04a942a1a43f28d9b91c9e958d16c4a040000000000000000000000008fa4af71f0b9e94953a6a77114a1efb220bca8bd9930c3172c184d5dbb235f1ac89983e035728989b7caecebcea087e98103a1acf94e25f94ad888d97df8bced5af694c131f386ececffb2e821d08d71677ae8d60bf63c1670a2a0ff3b0c7b1f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f99aa883f17f3132f8361916bc6bd64e2ebb471adfb2b969e44b6cbb755511c01d62284090f4de502ccfd7a4c74a8405c182b72afa2ffe09e11bcbcb71946b899d5b0f662c98df1a74c5f1d489b3dc3d9735415c76a08027ed0911691b10aed151e8ca076be6c0f2e6eda663e2b4ac91ae215557959f03ecbb073a9f04b24a64032966cb4b782f3d630ea94e3bf420893e4641ac3a52b465ce0db96bdafb009eea031184759496f408dcb6e0591357a0c062b1ccb668078d51104f681454c0f1266f0a0124321fd295a99aef1efd3fe485842f854cd99621e4240ec47004c0988303ac6dc4a770f9866904259f1b0baa5a023e0de7c561ec0d9c9b4eea3febbec70f6f02116172c909a38fd56f8e6f8aa698fa89d207b29393f3e7b6a7e0ccf7896997460321534d416f1bbd7c05bbbcdd83192f7a38e9da527be3f35dccf2e31d7a0e3b5e03279ec3f071a5c2c180b169d1efe7a8e98d7a0bcdb48492fd6d5c02cecfc323c3020c18a4ae5dbc64a6d4308268bb7f674ff27bff7ed86813275bbf72ef1b40fe5f0218181bff39b8e9e9522d0ec3c3770dbb36659909e966521668eb3c463c9604b8e3cf9c741737d7952d95ffb3960ccfd9b9a993e6ffb985d8c71b19a13b9dd22a97ef9267b2aa54b89f1866a5857d668c68dc8456d81d98a154699c4efdbd015a05c83e1d7039e0b5fbf8efb95658f6c17431a5bcba34e95247d98bcbe4c00f9e5edf7ed94980dd12f3f9b5ec1d2784c15314fbe39902f2e733c17f22d64cdf6f3c0b390880a6d481a779a5eb1134fd2efe6a244ac9eecb42cc862fb285ae786f9bbfa427a0ec99d468829a51667d47b2afc7dfbdfa05d6a67444f9e7635314c1979df5cfa020abe5f7521fe4494f92638f9c129083c6f0f478541581e43b1120c183194262b1b50a1292c79c1ea67f810bb726af40ef5dd1fbf21e69b6ca5086f64d583c20baf21b6a5b6eac1eca8ec7f656a6403b5aab25f5e3caf2140c4a0fde6ccd07132f56c67f866f7da90eecdbb14f412381c7ed7caf6d5160f0d897541e18e73893d94430717ed47d6f8df437c1381f822e1331c74d66e59f92d67d7ee11433bc2dfb5f78a2c689f01f43a8fec99bdc0b9d50011c73da2663a052581913ba54216a3e4b3ee32e8becc478c7580541c793133e608b0af9ff10ec0f6f2b46a6c50e4e0fd93095725aba51401439fdcc5f91b5972f00dea71c4630f073189ec553488792521e3330fa1c0eba97f2b16353a3101d2fb2b29011d3e29fc10593b35aa7696f79e59cf52915f320d1dec8a52d72c6177a708054899e827a10f167d6ce5fac45902e837687ff8e56afa4492542f71cdeb899819bcd353f5010558029cc1589068dfc1414b12e58c74fa44125e85da1b0bd2905b78e8a96e28032035127caf47b4340064d6c436885b208f1c56faa4d40866babd479b1a6496af08bf9a9870b4646090c9a5ba0b4e670f8e1a2cfd9fadd58e5e85fb234f6bc88d4240a90c985be5adae8e939f5df517ead449b2e0687530b957f7c991d6e52a25f3ddbcc4cee010142c675c7a0817552165454b82b62c399fc84385b9ef55aea2af4865cc5bcaee274a5fe3b1469b236f7c351a5238f07808b68ee4dcac25b220a6edf3f5cebf8438d9d43b9de78041864bbedafb3cebec1bab5f4b5b514fc28abe05da31381e02dd11eb774668782bbf125883f6ee881f209982577385cf041df8cfb9bc0b33f4fdc907de63ad2c9578b5426c26223439fef8d1351f8d7a6ff4a5217545639155bf3e103ad07b084d1799e0493acc2e22c8bc1fbf043495a8620cbc597e7f470fcfa76f414b6fa08edac437b36dffb64215b611b2b6caec748dd49425c7c6bb8de421dcfa17ad1646bd42fe06bf7dc74eea509b0446f61d3bd8c17172c7e7e9e356c3d1c8027e8f88890a5af182392cf61f3b9623d92f6ee254a35b569155f13f9f7a5d7e0e3ceda6c001ab7361538b24e4ec0840fe36b10308051d19238cac7eb31670b80d6bfc9175857215f3f384fb8b1d9c6660c9bc65dd830a07ec1d6a48328ca5f5863d95b949e845112c7ef8e9689cc46caf8349149d8cd45f7f083c9b4882233520a368098eb05b9d605c42cc1605c9471ec1a6928b159ba0aff28b3410c48fc21d1c04e86a685e9471f6e46bfe228a59f6a93e5a3b3cb82e8431b7106da24e734c7f57477a12f9cee49a441a17be04dbfab6c18e617fb64a594ceee3ee144897ae43c484c0dccbbcd35759e3c13c97de11aec33fcfa2b2f99b569aa35dae7b960540861952bb5723febd9c58e4d6451ca727ef98033ea93c84e20f0a096c48f2ebea37af5ea13b98d36db5bb902d80b8947836b5459a2a18689ac7895fcaa78e7da55d3c3638f01135ac651a5ca904920f53de700da4de056e373d1d2e74d237bba1f3cb739c40f", "5352ac6552516553", 0, 1089870312, 0, "04ee7b5ba3479de8b1dc70bf572ba4e4c620784c848057a0bc13cf9134f33b47"], - ["90e2995d0471be5307523b15ae6a70d53b2a1c44b0ae5f70534bdb2e18bacd5bf9de7fd7d40000000003ac5252aef7ca4eb0020b91356277fbe44d87be05ad3692e3d8092d958442f0be1269615ea7d0320200000003636552ffffffff6f7535c022826d170b9b4cc1d9e6700e2cc89dd2eb792120a1745b49f2fa05890000000001001ad209af919c17fb2c0b623a73edc0ab38bcb2851876335c14351b8ed0b67e9fc9f8c5b603000000025152ffffffff01aafb43050000000002516319fba7d0020000000000000000da23c805000000009804255411b230e254de5225f2e4c757225fd131df8cd1f9a874b319039f2abe8675b21920886b7e7f462aa30bc161ff779006157969e4e5543f9821fdf0e7000a61e4f05b67b6a1e449da243276550f62ef0e3ba547b89b0c8e3e75fdf3a2cf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058ecb2d039e7667f7e1415d04b6800c7b9d8d1b90d8bba7924021945d65ff6b9cffb8a4507f2a1ae6f30d9caf1c38d9dc0776e82ccc740ddb6e8e9813ecb135a1c514b65cc25ee794a1f75396c055d9f56ddf6f80a50f1a9f9b7b859834a0751cac8d55dbf63ce89ebe9979099b12f35c063da2c1f755daa8aae99bf0fce12f2031201c496ed19360e62238c8ed6e5a186069c17e2bcfd539cc347603931d337400310068d84a7e477c148a7738a72f8ecf07f78732a2d2fdd20b9a94a1335fe11830a005111b69a06489cb23b861b217f7697c471c0e45138f0bec60de51367ae8eab50d6a30bd80ad2683f4fa30ab06f75c760397c6d92a2711f8a961b6dd7d49f78021a4690e5b1d23f99dadc4b18a15009c4b733919a5a184b0572c574f405154443030d6aa2e1c31df527c6b97adaab6c61bf48cbc09ce724bb456cbeaa50919ac1ce020c062e50d148ea2e2264d7a3f626401d09a78ffef6e3ed6601e645289e6d5e030203364836325bfad3bd72340bf35734d9ddeb6daad36fd69b2c7cd9f4affa79fb0221f9101c81c18d9eadf01776856055930638b6498e1693b26019033bb48538e015c7cd8aba6918e40d7167e2234140422dd02ffe0f04a0ad336e41900d6126a3851444883a646a56b8ae037b6e70eb6bb1e505091fcf02393cb7abeab8c57f3e9ad61dd6aa98e7f10d6de0eeb2afd4895aa6b0ef6c034fa2f726cfaa20dcabc0824a29d271fe6197b0ca2827123d1c289f02092d55ccfffc251e0684e04d0a0cda84ca3aec6b6d2dbff09e139b8812aa0a18127a78a24d46d9d88d0b2d66171afe729a54f194c2e7494fd3983d4e9d260a54b60043fd34c1a0781fb5654dfaf7aec72b81d8dff6dc7b6e7962e5d63be7a672869868dd110cba87d76e8fc3390897c50d879d2fb590fa02f84465127d5543251ad33e1d94d711cad192c036e9431056e86f2a5857e91d1fe3e95908e71e2ec7e0f656d7a1d7aee0cee395cbb2a57cb782537a4161a97b45b622c2277943fc72bc66678f73cffb0bc8d5458481f0c90423d7d73c48045e8f527a509b74da0718d6e105b7cf28311a4c69eff3bc9088aba4278222d280f086a0e5d049fd4c0be0e75c95cd566835d5674aad82d2bb6167054863f7b1470434ced60b7b7876f16cd0cbae80532322a6cb233b7881522360bc85e0a7ca48bf7ada77112de9a176f722e1246f4b36c73afc3a7680a92352717a4a625f5210ec585ca55bbce0bef36057ab1d3d9fa8f17fdceb645dd85954901e30f5ad242ecbda02676ca5aca50f34515c65df73ff836714f81c0fd5d81eb500ea677e6c5b0ed0c5ceff380486a9751c015af5385787afd19651f54713615645c7b650cda759c895386e658a4a28c2574d83e1749fd1159f9efe35ddd7f2286198855b0b36c7d463f7e47fd88abbc3796df12c9e63266e89254ddef2176ed7e99f02e628d2e5cc4f94aec9aa3aeb0a6736c7aa60b9b5e67523ce48402c624f7bb8d5d96b018fbe97e6db9ec8e1ccbbb6e1439b84471dd9a3707e4391d26611655b331deb2283cb9049951e8f19735e70c406f9e888e53e760bc8a2332d29ecf76bac9b2157e1cb7d7a48915a886c4b46a944f83a884e44fff9687d4abf349c7a6375b2d3895397bd82471b8047aa6cb2e280c83d9c061d838c354c565cf6cc2e5413b32f4ddb10423d52b2e824555a0bf0cc8cf73bf50695277fbffa7c1f040ec590503d7dce93dc34ce08d2384994be4df7a2f2935f9632cb9cb5a9631183bb386ee5981492d7ebaee60104d629a58cde532c69dc281c93a0b710b47c51322166e1154937d6751b23c618daeac310e08d26dbfe4915544acf7029af60f2c95598acb1bb6bc95c8418218f4bab5cc38fa3fc477cf5e67ca32a8e74c5d81ee9c8707cbe086f6b8ee52e4d567b7cdaf622ea30d060453c8c5181f5fa9af3358e817de999e3f77451b934db3289b5908013d6cd321393f82de1686ca769af19d9e43b3f0c05a44e23eacba3a490f24b4e07bccf442a7244220230d6f9093fb3b9b2ea4f50d32bb57fcbdf3a369bc609fc324c11485a1c856fb79848d08860389e6c21d1c83854dc8500c43ce81fe2bb36ca71956e9259a9370ab2c7f1b1e4af57215af2eec90a2798f470ff85ca012d7c8a5c0fe8937b92ae3bf289a8c7c936498886e5234db60f4c1aa8aaf7d509190f63e0d762e653fcf9916b3cc6d53e3f4eb0e5bd0be4186bebfff0db977b6921f68e616d8cf070f03d557a280297b209a88bc576656947b1495de9422ae7140bca00000000000000000baf8f0400000000037892c05ea0cca1f0c33c7978c2ea95db04515c2784875d6cda6e170d939bf35d9488250ed5c8412e874883b81c3b53dd12b4062822ad8b87af6d7899ab4e14f9c722b51e2f86ca3dde9640ae356c091f90166411bd16c75fa4a82a663f63a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061127aa79f4319efb1465518fb285795e9f68148568f75338b20a3354f441a03f8bfe643cd562f563a4c3ba57cc3411f10ea7acb9ff9ae9112675faf77937c9d06c34c834fabbe465c2959730578e09fe716faa335cdf1a0fdb991480f27f08bc86239842c2586eb83bd2bb563a2c1ab97c8421a31dee7b69caeb8706538271a030bf78fc81e9d8055ae72e032e767dfee803ec3d66abe3a0656d1522919d38c57030436f859bd8ae4957337a64a6490ed03f1133d84f2725e26b7ff93fa7358c00a0b07ab30b5cd36fe2de74112bc7daccdb6b6affabf7f5ff72d429a8bd01c7bf957f6b6f547b352fb7dc796d489c9aa2b17035180a090eb9cd368e269f14c42ed56031c4089f4eea5e8423147dbbf15aa91b4712b9a36081f87593522fe3bdfbee76c031950b691c7db1e87c1c3465bb2e3465e6d2a6993ef47b357d723bf52ad695555021b2ffb8bcbf70a05814108d918ddc6a451f4c33af14c598cd6f01b084bc4e44f03081316749964cdc8aa537969b59533cb8f1b669fd06ca613ba5b84b6acf9f06703206b524774c0b1e0e6fed2a4612fcbecb0ecd94279551a102253a6fff3c9df7c6ccaae0be08fa3e8c8d556535f0f288cd80d21d8032bfa11ad240fa6285b5fefda6cbb80adeafdc3401db4283075e606cba416e041e5e5844c77da9fb2ae00cd78d6ae89de0ddd1f80a8056a45d6e1805177114666ef0ee201d490b4133af9fc17724f526bc1f8bb6fc7ee2547588cef8b0fec29d897a8bdae6d3a7eb29584cbd4640e74f7c0db20a830ba2d54d94036de1e9bb18328bfb2957f7dd9ae9789b6a33d8cf2fd1d8c2ad37f4b54728706649605326e83bad15f5b78986753a476edb0105479130aaefb5d1ea3ce23f588aa20462c985a8e861c7cd325be57afcf42406f8721f342637ec851a998e508436048a09efad8c734c6979a29a60964809575c5fa47c0bc7573258e1e99e8fb01789f4ac0d23836272635127b4ebcc4d393e3e50cb14a31436623e049e82fe0c24fecb8b4ef7fe5b0dac357f6c4fa8b4db29bba2349a566bb4ccccebb8c60030fc1bdf3b57f11dc81e05096ed94b42c3040f3163ba7d4e225af53ec7b839a398c8d9bbc889d27cd6f78cccce9d051195445e9660cc67057e215ff987d2f54f3c445e7e5bc81468f191a0dd611e44c9051652b1d79b3c7eb4853707a76ce5ae6a1daa03ae15f7cff41688c340ab0392ab4b32ea6972d8f80488f56f461b7d97a42e22219fffdc9f0e09e2f84ce8dc6032b43da5de904ca6441effaea4c5a5bf8251d47c8482e251577e00433b0b9c9851784a75c651abd4157a14da435eea537e439daacfe470a52074b447405d4f5c7f85344af4cfc36de0eebf32f60388fd30e820e84ba042aaa5ff1b6fdeee98e36a191fe3a30b61f76fbeffa15cae16c546e204bc5e3969e15084cc4d79a83102eb6cc63f21e57a3a44457ca9cb90c31880d76a7ffaccfd17a1084a353f336fab228bc9670f3fd0bd692a6cd497f7832188e705a2c76dc622f69c1ac05f5311a16a8ed24993bd21ed1d32b04739f97635990dc84556b8314e8918da7491847d2c3ea711d266a9e44b7449702f4671e5be5368a70239deca4b152f594f44b56f34ba16a022d63edce0ad71fe10ad914826c253f28444410c9ded00956eeddfd71f52ef2f59b11f434d94343bcaeaa9a0c4449139eaf76ebb71761c158280b40130a12da360d43a95148631667cb3d7272034c8b103a0778c96cd883b4d6a2ecd673a04716cdd3f440bcff9847d797c8178d2dca96551ecc2b764af808e8a9d60839ff60218051928b931b469b35c19ce165d759063729096b56d9c5cdad95a68191105a9e35e472574892aec50a2fb43ea22c3f5cc8cb8904c3e26efcb31980cc32fef355323e8326712398f1bc425b1442fbbfd5907f6da979af8551eb307901278dc69256452af533f80953a8cfd6ef313d5427e6d65b56071f3a4d82f531a664ff7f3fdd1f0e40098a99c896910c05868afde6f15515fb0a55b089ed9ec4dab0ec95d3ec6f0f3fcc19e1acc036e4c86b958eb7e9a5d0484308025251c30d349537592cbebfd8d33553c675e4c12931072709c7250e745da62e797d03a6d3e9ce2c87a1419fbad2587a940752455c27a34060299598f4c6ae13e1963b1b7872c4d02c0e43cde4f745cffde4118c517cf27d29deaceebc190c391689c532e56e34b44a0653dad073e687f0346b806393ebd5e7668b692bf61f45f09ef4d96cc30991587620a2703828eeaf73cedcbb40f80f916c199a465b4ec87dcdbda8246fa5b3c7b3dbcd13e1a47b83296a355fd2f2fa6b6806f6e3e89f8ac0569ed91ec0cba92aa9554ede776f390ed946d176367495a6b70a6e22838544c35ec17cbc17ef95b3f7310ec9dd671af855c980cd80af7f28c70f", "63ac", 3, 1413916825, 0, "3dadc90b8a0f60777ae89e75d7b552cc7b9256a3d99741baa3868a59ebd72a36"], - ["4884234604e6b930f63d9aaad9e9538aa98b899c9912ed0ad98c6bd1bae7c83dbed8dbd35603000000066a536300536aa31aff46e33a3829a3b9894e39acc4162d98d00f9a5430047aab328061118896b64e56db0000000007005163525353acffffffff9f143d84b7e4a43ea8f4f24ae0cbc7e6676f5d303b3d6479053f851632a53f2e000000000800ac6365526a5263a36a513f1c5026b33222611d73da280aac4b734b54e09fc24a8537a3225ff61f804f333b020000000151ffffffff03610285020000000000e461e2050000000000347676010000000006ac656aac53ac82f4f82003bc4b30010000000000000000000000002502a1a558ade269df12eb6a49aa78f156d0c1eb32436f1d1cc47657afe412bf7f2e0ca0be0a184fecbb45539cfd5b287d3a0ac151868612204a7530306d1d114d8ac7c86de5b208cb62644bc99c9552a8174008b76df9a47cce44b4abb7f04b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dfda9594161ad14a4ae9f24d076e344217dffa91b967a4a74829bc83b19d68aff085fe045db6ab63638d2c938ba1c4387d6a7d1719929df2ce3d962f15552e4c9c05ddae4019dbe6d745f4dd3e84462f97f27ee203b2a7e7893f594f67389ab2c4bf87bf842e16ac0659cb4f8ef23bee54e4e88e03f51c162aeb198df184d2e6020ed1f1f6613d48856794aa18ab04917e54dd21efaa7e64d5fcb1a079df05531d021da0789fe2bb84dbd97f59d610aa68893d5508d7c9fc124ec33a2904338259350a017bcd566d0510671e234541b25c17e6db4a43d6ba1e76a46acb181af008abcb65f6e325077dca352c3e3c6e4fa48fec16215a6db162dfa43d8a1edc4299bdb703270e42d4ea6d0b8e381a40d14df70fdc4d4f25dfc0275707e8fcbad5a2f351070327df3abe14a6247f2932e5231824470e7c2e1447be1ed594b940fdc4e128a377031fc9b03a7ee2e3d00c42d6e758d9e1b62283bdbbdc3213b6d02d8386d4ef88540223bdf3f1b531d9b27e8c159d739b77de82ed07af8432d6f1d98d06e67de459c60324a596e90a166ee4b906720535e07650c985f6f52fe120aab759f831915bfca712fb4ac915509f75c60e5aeb3afa86e90849a3c408a6c793b66dd2b26d1f13006f4f6434fa816c516584449a7a4a3329968897d26e54a5de840283686f717f4d1275c17157354866f29a02c1ad75f0eaf1212d450a2e5fa5b5d2482e7be56d2a9ca2f3c777ca7f0b465d9f57ae1192c9297d02caabaf20498586b1875d75ae957452251bbb6e2027a06f90a938ebb1f04a06ae0efa4ad4c982cc7babcb8d13b6ff18925b0c22f665b2cee65b29ea55ec8a06209cb10530ca2269425d22576b841bdef8e971f556ee2174fe3e700a690f06c7e096966af4f035d49c7f0c4ba1885ac8c9bdc843fa598b62d39f3ef148d8679caf9de6b5defd1a5d95ea6a280e326b6d1955076d200ae770fb0e2788e399da2492a0b43aa5fb189bf57dd4798d886bffd68a533f86b865089a7899af55b30e40a6b777f8ff79398ddb4a2a875124deb5791e3b12bea2fa7fd3f4079bd52fe3d245ee8411ff1d406959f688998a08d96a978fb7981296ae2ece45c98232b2f7d2b1ca6d5a3b743539f7ecedcc9a3b862505b4c1bb50d0928f7ee5c0a05fb401c548975a86b10f52c0ed14144d30e0aaf058b273e9e7ddcf8e7926d0410ad4c1b4b01f1da4f71f3e18d1e6975436ec3eb35aeac6ba8d726ebd93d6ce2e80487ff5dfaee5a0588e222c85942112307e3f3d17f9cc90e02f968b93c73ca5c87103e9e0cb117c4c109d4dbbd8756f48a2f1d37d2fe57dac2c3f132a96cf2189f282033e67787bde22e233136f7550cdaf547017e3b22dcf26fd478ada0b5e5761cbd2c12cacbaae7d7cfbf1a9ebc1fe777a7c36029f41666aa15b852add6c64cda7cd5b56a27335cb48fcd9ee6f94d25acaec375e03fd294e6ac1b1d75ecddd55e85cf1f4a9d9472c276a8d8408f71a31f78df082e23ef34cd9714e69e26c2dd82252eeecfec582d4fdef698aa393fd18d8122dde01e3d789ecdac80f1c73219feba8449d7c9cad66824f62ea4294459f244e651c5033d7e226cc7fdeabe94fc61c365a1fcf7fb637a53adecc0aa7daafcacd96ceb9215439c8343b8b030f5d0d952b05598610c12bb23c87ddc6ca1defa5810bafedc6727a58ec00987ad0115aae383feb47696f29364ac33af80ddb2bdbb71548975bad1edf89e264b0d66f940f775adb71c0c64cf706a7c85c72441454f8d425a4fc188e298fe1f2daa0d0e4583f0d4c04c64db43cfd30b7e35c62fbf2fd96135a3134ca14822ded90abbfd1d7f06fb9bf5f4ac8b63afce6b147cd7ff046e3097462064567159dcbb2e0f065adb0b55f127ce9b26e8e3f70ca93c3a372ca0f7638b1c680ba84eff6fcf5ce3b3eb067d68bea314c63187f9f06907be0b136deca460c031ab914051d12b74e9a90106c167b0112e04b9beb8eb40975fd3f2528b3dfd550d6e067227ef55526333c55c9d403ff82d6096c4a4e70348238712fe2641275f0faaa5e45f19e04522809db4d2ca59def841cc1a6e7f928f06398beeda7ca29ba3f13da703f5e94fb8e07d0299c96a606ec74f96c4e2f41e00d33b6336f9f01a6e7799d023d71ca1e80fbfcc4ae8fc865ee891fc7700d7d437b6b381fce762227096adcece07f0e96c87e01769ad75a8921e8baae7029cf5fd8de3784b584487db4d518dc67fbc1c4b141a3d75597098e79f5b244c6792d77b7a42f23ec31718b05f224e8b6a0703e38bc9900000000000000007faf0a0500000000937789be1bf03596982497d6ac520ac5968283c5a527777b299563bfd2813f9382a6e4c5dabf0cf3f298e0aa1c20af71633a94bb6c0a9c987c58dd9e7e535b514cec28cfc0374ddfc61ed85c4847fac7e9d96ad5c465a5fdf09fc15b139fb60200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000afc4596432cdff9bd3d041cef3f2cda6afa33379c8b6be4c856d76f5d4964538e63515ac56dbc60863740025510c3a85a1697bc31c9e699fe1afdb52785db08eaf49399ab1ec04ec749b041d50ae1cf4679062eff4a21db48025c1d31412bcbded13d93d6ada65d140a1f83d98f53f458227f607e41a41b281d4832df69cafef031db6d1afa3b60dbe2c6d67769a91ad8bb6ca57e929b3b3602185d4b3ea881f6b0321feb9206f2914a3de1004c8708a9b1d1f24cc7c1aa765b15dde2ef34fd96f900b009fbcbd28739fc183a90f36affbd48ca46300eaa0e10dbb400f683b738666ea6c758c55a16da70c8f6f326fc89840250bc43e7b224b9ad3a8fc7ab2e7a5547802025ffe77184caba8a13e73a23a131670b31ee092116ebfa5d16d6e9af80e6e7d02247eac6c3c25a3db2d89ad4616729708cbfb4621858a3d63668bcc1af0a9014f03060b68f60f9258c0015c844135f92319f52f04ae03dd4cc596608b47bd35707402235325f7685383a7551ce5e54f8d8e456a467b9da1762d64916faf0b4d5c8a81032d3dee86188fc94956d3e0fbfdbe7cdafcf8fcc99b45cdd073ed5f01dfd417a9376fb5c36044869d7c5394a2c0a9a6b7715a6a1114562961e07e35e34227f796e3e4f0e94acaf11ad461dbed58d683c119bff7a2a73c04705ff458a0703f61a37258c40c1d42bdbc2096dc21bd28474d02ff041d0ebf5afab0229caf8b7e334f882bb19cfaea790b8198fc7a3cbcecf3b1f54acffe3052bb335af323d9702d7f6c34db37d71cf2b9aa83eab22d57c33b8ea9995ef7c876b29eb4343ac63fb7a39641fd81d70ddf4e6241173b3c570e19ad80fda1ed7689d076b459e4532f2a4e40962272bd915060d5db97b018f7afd92060386844381bad363978d27cdb0b6a8003ca5701e9de4e2744f254e9cb63cee95c0f34669fb80d74cad83e97ce864d1a1ac47f66d5d4a056ad39207d28425c7b83b2c41c31f7a60a2d684e42fd09fc1d753f1f74bf8db2c7dfa4ff6bf0c352dc9fd038e18d6310b053a6a4bbd3d9fdee31bfc40461631fd349b043b1d89637307fd87daff4df9f6d0fcb5618d2e2151fa94c17665db7bd79028b66f265e1c4c937fc1ab68647065f8ae7dabb23e06d6fac6b296b7bd541794146130abe53314bd6da284e1c186ff96bed6a010a18d8b0f9aba3f660b1aa0ce90d2bdd99900d638f3a4d791cb669326887a98e549de7a0ac682f2606700ac5f35d5c55bf72a1b3c13d5e9e1f6eaa06eb8d86d213e02bfa391443d24a30c2fb0b747fd896f8b31a17ebf9e4f848188bec103cee539b5e8f6e376eab7c9a571b3d79b7097ecc0da2f9986233c1bacac27ec3f97be77921468937cc59b78764d663c94dbcc964f175ee3959eeefed22a192e4bcda915b9e1ed3ab9ab7182aba45133bcbeb86e4db1323b4771cb503e8a61410e69fd7bcb2dfe47403336013f771a32055ae4685c4aa7d9c013ec301bde4002d9c929dd5d4a7aa8450efe9589e8b1b6226981ad5a642c487bb601ba061cab47809a935097fa5576b17ded236146757b3e64fce56f044fa056dceeb34d4a0bfba6c2d8e8d73dd974d4c43e747b614df07f8593a75a5acf927a9880162761c11fc5076ec8d4838a5e144f7e0baf3f09f81fbe2d188e7e7af81bbea61cd3b836c136825bee8b9b0510194c63ac72662377974c4b65b16bb38b4528949f22862cf5b3c0639a9233150bc90c1d403353745ad814e629c2a4678b0fc9c80f9d6b2f98fa119b9c63a935c064308d9b57fb5d6ca6d1a7ad60c145233a95178b57eb5caa9f8ae29d8789141e68014fb4ecc2226e936324e8292fb048e0158d947f6b8814264b81d20cabd960829a5865cf7ed8ca84f6dd746dbf59fa8d79276e4e1e26870a290bb58f7af667366e47048a192058ce1a9beee8f09da59afa39acebd05a08dcead55efcd8d9f070183f8b584fa4cf7b519b84f2b506929c816ab93ca742a7d307ba8ba9016e575cfcc5bdd9e7dda2bb0d6a2bdab387f3ba970325dc208bba9e08f2e55b41f7d1c567e940fd9b12804b35c302bd9cfd86dd47a24f044dc7a01e1de94041e1aab37e69490c9ea547c9eed44bbfb3032222de15d3e1d65fc0c5ab45861316b633920b35bc1cb975f7de9e70feb61a65009c0da0a2be9173d70ab61c22a593d31864d8e8c846c2b693737811bc40dcf565ffa0c132906f09e3d292c8e5af220a686c3050171ac3461cfec43a72abd0f535471b53a1ea90ee9349d393443fbcf17c6bbff9ec4f674d29486c90ffffb95562c0000000000000000f4232f0400000000182965a8054a9429ae2efd535b1032958a4203fe277cdd08578bd600c077221d40b32677f9e4a94a233e8e9c56acf74ac5899b5bba0940d97073a9a3a0ef9cb85bf7a69a3d38138a4d14c79837d9df7fa62360b201627ab7937c41dfdaa706190000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000097e3b57b019f05bd132d3f2339c9f1dff1c077c17ce5616cde0f90be71d58d7ce781865ed3676e344286a43646b9fc4db8599f6b281a232ffcd7b7d9befb2c1686af8e38941bd0f8f5b2d46e8ee902ecafcea808889479c792a284cf2a2de02c939fb58ea2fa985181842a5db159d5d0f9f43e3960b73ead974e0fe40140a0900223482be04bdba521a2d4aa5647e58fd89ed4ce048aef6be4264a84e9ae2bfbda023014a6606f57781c17b16a03590fe69dbdfb38e777355a99bd4f7c208b7a61330a004888c720b2c24fca45477efe324b7fd2eaece0642633a8d8c28656a7ddbc5917786de02433dc9938f24e676c1eedb84ba138c281b671e8a0f9291f9e6860860221e686d9adca60bf165ed51b4cdf33105389cda0da00a9cf4fe2e24805ffa895021f30abab10e88d080ed43c042d876c95971b424f980ee2e71eb015129ecdcc4e0207457d327b9beacf70eff18077358a5f9f1b949d989dd757744b2ac09b516f1c0217b52c1751ef2370aa572cc5cd274ab5b9266dabf4de3e62347a42fc515dcb97030a444b6c6d4b52a25c995df952161c4942ea026004df4f43296acfc47ebabd760489b3e0a1f3bcd543cc4a3bc92159dc50d052ca2add048c6f7ac691ade373143ff98cec098afff337c612bcb78cc5451e73a8c5ef31cafe8a226c97941af59c274584af6802ae7e4542b09648329b57a05b50b6682db3a2466a250164a4da96275b15844081481c302fb6308eda14e99cbcdde773041f7e7bc2f7cf21a85c71dd922e3c69594a5e72ffd7eed520572b775b406c45517797894677d56d13ae2aecd1d300034b58f9dec623cd7d88fd55177b1c8d7324d485e44f0a8be7cbabef6bcd65e8b0d3b7d806d74e5e0c613efda8b4604966a826c8a6e4bb71cb3c98f2e99c67b9d4bfa85841826c9a1401b6eeb61ae14de0467e4fffd15959c53e4b90e666a9d542b9615d2ad2b87c1d8e21b2ac201e012dd0718fc9de15600ba0de5e62e664d2beed22462065ee6a462f9d7f82fe546da40c95c2fe59f1dd5fe41bda58194d34174e7f08ce40e5b8d4d3ef600a9fdb467c2517f082b3a486e126c3fc6296f75b9a761aceb2322866001ccb1e0fc38964cac734faaea5201a04f7d1c7324828d1d2d2fdb150a3c599166761b3edbf8117434ba6abfc7f3c4ad7c8cce0788915128ac80cb625f9b47c8136a78167df5c2b0e0ee9bc16d922d6bfec0f60e8aa699ee7fe29af932dbfafb3cf4eeb6402a16d7f50dbadc2219a358c51def8c15b9246f68fce5dafe9dbfdd66b2e6acb3912829b993dd1448efb5d03f4ab0fb769944e49860280dc4767d78916bddcb419e0ebc547e73c349d05344e46979369455f46271b2af889beca1a8594dd3043e67170b913aa87bdb3dfa0afc9105a2551dc4625c0745db1d4f5c16e47405dfaff212b31fd69e96f467814f3885427f290e0446b8524422de261c9893db73a928c27566ee8a970882342e7df1c3b72bab1f1f235f46ed152e0a2b03541247db0751b5b4d568553cc96224197b0b406590abedeee8d410788da6cb71465a04be9a71bc3bcd1e5354edc848bb7b6f6462594caf2a62f28f4170c7686bbf4d23a34d1af1d36f49c343b7aaf50a3cb5c6b3743ad9eddae7d3a08252f856705362a93a7f80237e1429ca3f3168dfe7ad8434459f153fd050bdc1ff4f79cef2f34b2426f57737306b789ab2314c52181d6cadb1284b47770ee5354273ea3002180a8b0aebf752ffd2656425983af78e5ea9c3e7cd2051717aea635201f07622cd62e303d7014a925f29b57e5980cc213458c998ca9d8b113b6ea423d217d6284c813d1465934b512b42ce5e7cb1f4569a96b0c35eaa2d22be5cc007e3fe0c18e13b925196b5fee34ac568f348f72256985cb63c40f983133eccf745f960d05e81c29d041c2c376beadd4ff0a608e2ce35c426adf143e63b4a03d7f92647bc1590b0e14ae738125985ed690246f3bd45e52623670522da818cdb626469d96c05287460d1d49c9d633227f90ad87c41342037a640c499101ea7642140918664a0019151498c47b19a530fc5fd7dc5dde865313a6d49d5f2ee614dd98529da7f6354d0f82779091ae442b1924f89d012533c284afeb76447af5c3869b0b5455db0f1e4d524d44582792b7972fb474ea18aa2799b490da635ee31061e34453c6caf28b2eb1acdd5c57d6af66a1419682cc640fa2b70c2c31978bf0609b995f34e54f1409c0aaae0b11c7101d71e4971a658cfce937863e2eeaeac2c4bea7453829070323712806e37683380256cb01dddb158e01bcf2f0a7a142f168e917b3119998a0a2bc61888b9ca19db9cff6b62bab3d70b2296dd384cab919aa6f746590f511c4b301c9ef3c1811a6aae3be79c73b4efcba6de6b2a120d05f3e4ae4ba03ee543eafc108", "525351520065005151", 0, 645040203, 1537743641, "bd31f7f0208ff42c1c6e7cdb2b959b3deaaa34e4d9121c419cb2d9006579d681"], - ["a217ed68030eddffe292d8e9c0d46086df84d58587d244c03acd44178ad117bbdcd29b7f7101000000076a526aac65656af07e8d97caf3c582932056a8f3edf65e77470b6f2eb2db8f4ee53e0328b029eb1ab297440200000007516a515351ac51ffffffff9f61e9091b8d1ef3f97d0ae8add39aa2f1d67d72301967fd647cd779760287fb00000000066aac53656a53823fd2ea021c93190400000000035151009403e10200000000096a00ac53ac656a6553000000000100000000000000004f5fe002000000007dc87505f2b143773e258fd68db6c995f33535bf47dc7f136dbdd3d685cb0d0904024975e753b3d290eb37f986ae75374dda792f5c6647b0e000e2b15417760a43f864b1685c3c79baeab53bd8caec046a081cd666c7b90074cfcfece35e839200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d558f8d8a9cad5df51fab5483fdd1e235f1233fa0d427c8b9f6054d1cc759bc1b5e27ae0b14ac7eec1e98784c00b27b57286b963dd07139e1603078136016bef8db7a9ca92eb3e21b9a54402a41086cf8162d205a3077bd1014395d87b92a2bd54d5fee70c980ff0c5410e6503394cbc2c671cd34a20dddd42efc806883bc3760203d6afe46cf1fe5c0136bdd5c4d3f7ea7ca378f4c2a3b616a7687042cc11f8840321db83dcf6f100c4ecf1bc530d4b14ba6dc6e6c66242c76ec50ef259dec0595f0a06aa11077dad62d7df8e64caea7d75fd6ad74fea4bce444fa5b41060f593654c847706e23209f7d46ada0711a8daf9d758433ce40bcf6b820ee7ce4e658f818f03115800e41c468387e691d746c8d093eee58c7e94c1fa3988087ba3a5e7f149b1032dcc49b8acf90fa3aa493fecb6982e0663d1507000f31235a8b5a064a81090440203c2a280592a34139392f445d6b167b62b58829aa86d8fbe05f05406aa28b805031d475885aff1a54f0de7964267753e11f02cc3a36126f56967d5de772a0411ac030a72017c97304f86cb877df1b18af075e1de14ee91dbfe970c3ba5b486bf7548d9923eb0a559cb529fdd4023d2804c84bca4b876b9cdfe47439c9fc267bba527f6679d882eac288fdc3b98baaad7f5106c0948ae0bb0d078be42cf045efdf9db057d35d0c840b214d96fbdcae6f5c44a8131ac0cf538047f7024b0090e8f2f9560de777a5ded3afc4bc8b4bf4b9e033fcbd14c7c492739004772c176c9704dc16b406c7bcc5ce670bf7a00a885adb661c50d40168a59c3363f9d6193f1b7cb62db0dbcf6ef8c022213553475bba7f18d0eb48ac51518d58b6453f2d1d35957b1e98cdcd3b17966efdfff8fdb843bcbb547dcaf914af6cbad7adc9117155e236477a36edcc5737dbe18b7306093a9bdb5601d558419d78bed2c851d1f0d15477a984dc54a0bde0c954addc4d52b34b65d8e34e1cf3c74fd1aa7fb68e9e4e7b045dba565c126166bb2768760b79a42401ddd4d9834e039b812d77be73cae478090bf9dec8e5eacc42c6f14898493bbdeb7e6e1cb4295fa520bfce3db8987157aead398ea96357da9be25ae560d5c3556dd5f8d748131749cac423931c0a56f442a8eb5ab8ba3ee40611a7689785c1d92288e5b133f256de492ffa3b2b9880b7e963ff358b4af26f0704d42f987a8eb823f5f22daa4c7ce5a79c7db21af70a13e5b879f648fb8e5d0a04c85def30fc2ae8ba2ab503513f2967f4191e809b53ce9da75dbbf4811a8ce3ba0f0ec19e3fe19da25fe3616f72fff9f8ca91a7b2ac8a16c9d37663135e906b74b83ad335f9082fb8ca44f5cc0bf66d52488e4e563637311c6690f3c4f6e1d6d9d2e3b8d667b23d351eb7777511b99bb1d62d6719b2704c691adc4e98ef5d05acffe0a262cf5f1f13ebc7b783a4e37864ee8c46cccc3e720dc2cea043b1fc1293dab4c512a8deba8c57cff5a65c54b3dcfcdcf8f99f78bdada35a8065d7f305ba9bbe186daab61258717965ed2546d526ea32242b236bed05e5079f1b591dd22dcc4b6f914ffcf81a172baa6ba59c37815b301d07af8c356c6c81d4130aa17e544066aabdcf83ad462166c939185d772342987b6f0c08684f4f3eb542c263394ef3a1cb6107c718c8ac4b6e7750c3be0ab3e719835645832b4d430d603557213d6d1bc47be5e9be69e1f76d9860acc8caa737e9387a03d5b1ad8e7496561d664634868d1c6e18eb53238dcfceb41a0d6ba8cb6bed1967b271c120d41ddbb5a7d658a7924d375f9a19d4f0eeb14f17c800c4729512fdb4fd964b1f4ec9e63becee1a443423a4b765c3ad83acc9022dcb34cb071d531d48519cf3a84b85f5961fbad78488fecb47ee445eec4a7b3a95f2c68790a0b49c19e6c09f2377964497c5124a185f9d7317708742cc888f6764546148fb7b3ff54d67ba256107724a738737a88b72cf79431c569049ba8eed825dce4e138c18180fdd76889c9ed22d57bee76cc4032b35be562f013645f4762cc32300c0d91205b2af67e9ff198f8a0fbe344ee31b63e21a7218ad83e556624df5de85260ed6e0d669afd68407e1ec767045a470af2ad56ef0310f8b3948abe46c3e632cabfb3f09b5c250432f58bbcc2a63b7753b0f39761b118de18d6cdc1663bd6c5018e364079a3b0d2fba1f1033dac2839d0f7d3b5edca6b57ab55f7ab9c070489484cb23f40fb138f1dffc7d3d5d36de4be0a78d68e014aa5b3e5d3473263230be82d34997f92dc137e765682d32a947312c51d29360a2aaa1b72fa1f21ccbd837d549304bdd5b9680ec7b9633688a594fda42bda73f4fdfbf73ada128742a3c91a2770bfd0117f5e73e3db254532534ead56d89235c047855c30609611e6c0b5f7f0c124f1de155bdfc0f46060e5f74efdae0f809c592101", "", 0, 1643380282, 0, "0a14cea7698e0dcf507c6294dd160b103f810320b5738e0849e56f76562d6839"], - ["030000807082c40303e2d2ef84e2bdb11dbae633935547cb5533edea1594a1165d2a6a3621ae86a58d0200000008ac5300635200515150b52e6939d99ab54ebbceafb937fdb4366f2ff760dcdf2dddb2a60e0d88700bf26da3510000000007515300536aac520b99df5f6246338413b13507a304cccd167eb6f9d31327779051d3daf7259a88b73222d90100000000ffffffff039cf89603000000000200657668c601000000000752636552636352a0aa48040000000009acac6a51656352ac00000000008af0e79802233a56050000000000000000000000000349672c3d0444da0277e8982f065cb67a37455eef72c34d60e46df09876e0bdc76d7dd824eaecbfb30d58134391a1b0ed2d55b04377cf4b11f03c5e3078755fe2e428a2e5617b5d530a53a420724d6d07a25c7f561bf39f6452cbc97f8f72ae00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bacb7eb4ce1fa66d1af5a0d6c0aafaa400ba68cbd989207b5ddbea0daefda9db4af93fa3e77b65531830b1ff1d960ad8b9bfe2dc09a08703152857a41e4645d88722775f69e6fdd3741f1bcb3bbccbfc51e01027cb96398f0845335755bd26ac39ce7d168e0796870a81c2b2191ed1d3ddf57c0aaec0ee7137149a48dfc42361031aecdc7618628a6aa2a21b11c3c40147f438239f30a64ddf7aaf3f2cf4b4c13b03063d5367feb372d6ce69e41d28d89a7a8c0468f76fcaa691c83997756043a4e20a00321298fe071a62b09bad9e94c7da9e84cc6a48111e513b4e095b92f62f86136013b0635bc57d90717a0891882fdc65a7360a9c99e1f922cede68b913fba86a031d548786fef74888e52b8eba36bacaa17e28f48a0f0b0b46af406114466309db030c75dfcbfd77107cc8bb229b98088c3fa4dc2a8875cd921e4487a01a87fb9a1703053692a504813cc81e2a99b68f1360243cd4ac120285445bd869640324263f97021e93e578bec5a4ed0ea64a12a6da11d8658785c8c8367bb173cebe82e8a12dd7021fa37fd2f94bffd2a1df469a3b0e3a551641de86ebf21d0791b25bada95540e21ce9cc8d44d42d6a051d4929a0da48e2fb4a7b813fc4cf1d62b45e250b9f066df35689681468d769d9ee6af67d7936b9754bf759d457eeb8887dda11b487e1a5b5f7cf359019bcc630a5e56c9f211bc95b1ed393e1cc982ced4012a0c9717d24aec054e7f823d0165f6e3686ce08574debcf8885a9d1f1f04cd025684849988cb610f6388e6cc34bbc33dec5dcef64b9b179c64f9d8d1fc8ae8c0a2b4e87ce2a24124d3d8dde8945c8cadb5297a6d7d62121609c19e676ff5a72ac66b79c3e82ecc330e67f323950bda9cd8f4207afc3d59f6e95f8847110bd3ade8f4dc4bb8bc68c09feed1291ce3612fca4ffd9a599ad2f2fdec0ac48070453b4320f56fb463cc262ac34ab3b90725c3b4dc1746dfb656e49e674bf6db4583c7467bcb92376c58343dcdfefded154c2846df419a85f0876dbce8e4ad5f20dc942d9e8613bf0e4f1143a8fe6bfe53d19bfe32c76ce3dd421e09f614319182b401afc3ccb5541cc8d268e48c1f5de8284710f37ca9bc9a47a69f3931d0e353d11daedffa7c78a284ac3a31049ee557551c86fb1c5c87c5f8b64443dc789a686e0544d9243812b321702c2dd646ffe9f65cd7056eb921d6d75d384417b68cd9fc3b031c19ceb63158d89263edb586cda74e6a43167e34dba8ebee236bad7e58decb877a6c044477075d86e7a69eeba44d6f6fa4f8d76e2910f769c3e1ba9ec8a6f069b22a2c9072528ed4d1fe367af56c886afec5e090cc4c4f1701f492583459b12e327044918c71f66e46ad50aef0bed21d781a7062cbc061f19200ad21612378bb61412b0a68a5317b19391d5f26bfc8b5440c0a60c96ae08ac25616a9d6c9cd6aa2a631e8e95a66d19fbd2be5f5327d153f9d0233615f09a49e1ae37660fb36afd5433f84ef24ae11fdc802cc2aa6280e282fe45b81f80d00374803fe3335fc74fee35b2d099ef27a2b0a819d5944920ddacfdfd832bf9b8bb8147132a5a1493c5805e6a2ddba21844145d36f58cdf3083631c4517c1c741890df80cb85bc011d334dac043492fd14cc3c1cf19010fc52878659a06329a5b66293ff5cef580988d8c4afdf5040866ca10705306809147dace83fd51d5079d6f182e496cb973cd64a8b9685a2b123cf6638059fb1cce871f525a727803821aa489f647a77369e83ba48ae914767382758f2209e4cd2ca606117eee568f7aa71b589ea2bad25f23a4f64e9186654a98778ac4c986bb9af614fe4d494863181bda87085b072f337ebb1163c6907ead987e13ed02c11aabdec4bb8a5e32eeb4a48f703e5d38ae9d7733a00a614d336429ef1ee149ee99a70487cbe79500333822e1ebe96fbc5921e0f77a97f74607d6a7b9123e2d4947f396e01e1f01761e4e685c3d3943cc28da5211605c04b89c6e153f4f6616759f962f21e1e85b4e36b33141d4839ef51b24b0a16dd283ce0a59290cccb5f20b9503ca49761bb832c3d5ee64864c95c03ffacb8c22785cd42e6e064abe2812381af98ff8617dc120ee628868e267ac94f0b6eaf30103c0118c28ea45151f286d26a0495b5043fd6326f8b2870c28828a7e19311bb837ba74c9789969b9f4629a19bea2bc0ee5add40b07c918667581c37611bd0b9f5efe432b1bb743849677854fecb3c1255c6c37ad860894d5ce9d9220130815cb24491a8fb8fb2ecc4a9293638e63462b090ed6b71b8318db00000000000000000000000000740c048a7469992b1b08adc74aa29f310b3fd708dda210a215919523fe064bf370a423bb86685f96b8f7597a437671d48606cb930f6b61b767fd6f15b26b13300863335b10137299dfb94ab4fc966c73f78f1943ff3c59dfc4e3fa801f65ff2600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000501f615edc9256f745704d2a5efa0aa4a266772111a0f5cdc901d6fdfb9fdfb519b9b05453e28eb6725c0335fbac709d105656f6176ecf6d6e839b7e87510a30f6ead7cd19e7e2cbe90041699e1599fcb0434ca4bdc8393c42498d7c1dd6443be2e0a21c85cf64e3bccd4b5c1ef85e5f3352507e389bf7a5f0e40a7f5e7e20e5022699193caa71c9b9db4c0e3fe555f21828d69cdb5b4f3a56ee6ba33f764b8fad021d30dd3700bcc0cc707a43dd8b4285e0bd8442371a76873513571d341dfaf43c0a040a18b3dd29d2d0c40e10094c7ce39d2e8b79f86a915705d7d562674bc6642e2b5602e43e38101073712d0051ad36996e76dbc0b2ad25f74b7045477216cc67020de9aba4bfa46b5b659c3bfedd4913199e81489c01602304b14cfa81f7c5eed0030d1254e1df0f81e6ffb9f5b0df54cd90f30ebb6aa5e59beeaacca8a8635bc164030483ddaba6fd431ed2022c96f7c01a75d85b42c9ec2c6e23223de7037bff11cf031752770b96e85908d521597e75cec2bf892f1ada284d14b00550106e6443de710228466c10ac0bb15c9ff909d32b964aa2ea85058a2f050b4c530e543611efe12eface277f945afa53ee205cd5f58beb5b2145d51e47c4f84c4632b2859c278fc497e3d6e83c2d719ea9c448cb2a9a6d6260bcbfece4ac2fd9e3965075c35ded80ca13f96626f40545fe0e5138e69d8afb1776448c86e72e9264cf547fcd15991af75e2a0fdee56ddcc7a1b30fda5bc2e90baeadb1797d2db200168251d4da86c7254f7d550fb2afaaad8726160ee5c3e80c1e8558de0331c2df58c7e12c5d67941ad060e96e19612687f618ad63bccf97fcc756cfc7b6dc0de7857cbbefa97ba8fe6c207c535c663f311c1612ba0c17e93642001cf58be4d04d265a48c1217ffa683110c4dd258b8f23dc67df3af5b7f45004790e8c7ee8e84508445c4645c0dc8250e3e5db09f140ddfd60ff0c59a2b1836f52397a4b7246d6cf5aaa65147c8ac804612d10f33d708d54c0bb703a84307e5396cc95e02af75a3585ad43ea6c79c1c95636eb542a809d6d5b9fd805c18ad7217183151649d8eaf33453f2ff1d5c84243bc16326a5ba90a83426910ddd270935560b0dac3f1fe4826010a92329d379d6c421bbf830955683d4aadfbc149e3437c7f797fda2c4c201b02ac037b8b7f20718bdf6c7a77e5d1ef1b2fc73f66763e4469b97423c8f84dd5466fb18a2b57a57dff07e7cdf8d36d00f7969b64aa59f6e59253e5eadbf7a310697d3b1f7dc776d32c268d48a426b53732ab5b51eff799106626dce3f62a36ef54d9df6e8d443a70443ebc1f3efc14d03f3bd9ca1298e60c62e9ef79f396f807a257875b00db9aac30538949fdbe61494df023a8472506c6daa55a988ab95d4b9d08e02d061bf32abab3eff9933a979ab6bb7261e79ec435bb6391694c8cff8bb1624be52233ce8439baf946744c62f69da5ef35f88dedd9f48b1ba5b04dcdd29e88fbe2dac269778c5b3da900cc8b52c692a7f73d4b93511dfcef895ab5372197e04c7364f65390320136ab73509727aaea702b262deb6836b30d354b4132e07147c025e2d0452acc5cae042570cdb8124fa1930a2f5e687fe3091afc3b5989bd3d14c2fe53861f53a7e2330b8d8119a9d25643853300bd786e0bf1a9e2bf1a979d2ff86e860674814651e553d175aa814bbf13886836ac38dad1d56cbe3997c142c95c2018898e03ff207ace4a2201b02c4ebabb4b00eb42f458057cb2ce5376814e0896d1450c6c35ed184819bf1b77324d3ef49c428dec58d3ac40663d279b48e955b34bd30cff647a0b9152d8b9ad2920e29fd5dec48c385cfc49f6c5c38ba3844f000e036c302fac8ba1b9875cc0ce9b8cc3464cbbacdb61a1ba00987c53bccc4a5fad1971a34376ec282a6177596ebd842ab64efbd0a876acc9f0f2c017086b29dc31ab8b45cd35074f641b11c9111d65d3fa37a3d0c5087569591f85bd361b744a8d4a43b538883ca7826dddd70718a36c5a5fe7a2796307f38887bd7fdbb755badf27623b9e92c6119dfdfb3cadd01738a9364f11e19cbb14f79b7648dd3f25d806b922e6978978a63cefe4253d9530c277eb890fd7008bd74fd62a91ef8bba7fcf8a4f8de12cfc13f506469babe6bf5d1530ad22ac4bb7886ecca5b6a6f3ca4f8b009be05311cfa1cd30b2abd5e279441953bf728e7fb7000db60119cd30fb5b71230f0707997efd47bf920f7c7d58ceda70daa61f5dcc081200dab56e147fef44975a9b9fedd1e578e59f51b0028efe12fb09a9e8043373a301911a2add9aef7d6693109eac1a253b798be0b1b01b926825e2d23acde99a7fae4084e5bd0f89c7fbe551687c2bd840ee448ce15fe7ccd50f5f900e01142fc740c802900a5bd3c21f5e78a3663a0bc459de9be933345052003", "636a6a6a63ac", 2, -919341628, 1537743641, "6f43c986b2f34898ae5ad54da2c66b5e25ab2e0c3b2d7a6e81d9fe65cd060e95"], - ["030000807082c40302de67cf6306cd00e655a30114bfa011fff294f5264937cb05ee1203b92be51e850000000008656565525300ac51ffffffffee867dc9d016b8882ee44b9e9035e2ea727de1bec6b2b207d025c414bafdead90300000007636351525251636c9dda6303f90f5b0500000000046a526a5337e4b902000000000863536aac52536a6a6ae8b70500000000075151516563ac53247874b4000000000200000000000000006e86740300000000e9705d924cf1204fac5e69d5b9163774cf0b3c69ad5ea7a7ad2d6aff3709a92acbd76f1ef5d9c4387f5dc5d8b6ea82982de31691d67ff5dfc0b4d9c849e4977437565b3511e5ba4dfe1e89328b2bf3afaa374903584fdac1d78d3d444745e732000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007831db88308f28691e35443bf623a7ea01981cc0e460e248394bf2cf484c2a7202817110f3b6daf06adab0e9874bb89a5e7f55a8553b565de4e3bc922afb27b30abc78f0e98c63291ae507d9dc7267755d7373460b660652b43987d86d1b3fddb8777c4c906597cbaccfa69a851e3cd9c1f33b3a3567462526fa32f5913722da021156d9c1c6d5ab5a6132016a8fcd606ed9cf26b7d9b102000697a0d5d07dedbc0214e34d95183360634b3556b48f21d6f861ddf94d9405645188dc70f1e8b374fd0a036b7fc88168f108b41f9c59b0516356521b58a277ed339778b8f37481e4dfbee9b21203e96f2575fc949a424a7f6a5701418cdef920b32a5cc5e5c599529967030ed2e4a888aafde85b45c008bf0b873654264c449b2d5c52bbab6d2508f02003021a8b266220b585f81a0ca2f62f0aab79eafd1f645615233f364976543cdc964c032f515788317bdbf67f97902de90a7a25a289cea950210685e1c7523f125a416c031f7c5deaa22d23078ed72af821e09784c762abd35bc6ed8d6c579a76d392414903039cf470e6dec7e006cb231534d140656cc770d7896299d6ba2582d0a017d24707efc0ab81492e84d42a328e154a8b0d38b351f6b65d70fb1add0cb5311114ce8401100b6ed53848f14883d56190a7a55ee287f7040438b26150824a9dbf54d4204235d3348b1f4c5972a55f6a70ecc1200c53207bbf87b349ef5d076f54b566a41788e42f79a12300ce82c6c688c0f605041a25b2cc42ef694fe725ad203b5723d2f723aecaa3a41d381d3992b073799022db70af2ea198211111dccc3c2f6c7eaf4dda7aa43d3f16f074c81a5c7c5624a2feb20e9b3ae7bc25cf30b621d555b3f636e4323008c350ecff5b1f49a761c9909354f5a447d3f89e200dfe08777dd1f595254590b4554bb632a149463a2f63a843e6486b5c8c33e90c540eb67f3c0691b1fd64350520a3c38645d747a0640e2932b96a172242d621bbdcbc646075a0b116c52420788c266065287255611519a450a5bbf6111418f729f6724e3eb1d4db3d8ac783ca286d57393e27cdfd8b89644439a1c55a346ce88317bb69641aab94c50593fc6a31c6827293eb08663edb0143ed684a3462673dd4dfcd087feada0c027d78e98ae68f0f4eeeb15259fa445bc29028fa5997c2de639d4fd6189f9badc7a792f262c1acf6deb0a3350a27c99ce6898ae2ef493f5f70ce4ac7a5c1302dbe3d27dad43109a087eba71b58ad51cee47ba6734008aaba937ba2879ea524452a23be715616fb34695c64cbf9a119764b5ba4baf65af77fb1602f6db9ff7833f658159d0ea045f9beafc94192bd5b7ce63f941de913199130eff166b0567dae9b0a2f8c72ab613fda18b37dc959ff2e48bd66f5dfa7d8769d786779e1e1b8fe6cce9b20f364111a03146d24740d42e9baa3462feef680d6b7561062d940d986042b75d18582e2315dafc7121773d252a79ea4936264950c2858d4c58e4010a54b27ac0c6f70088a451a7e8ec074ec4ea6fb6bfc08f1f7e16223561d94170c4fdcd329bfaa552772c8f2c1e8ad90030e9dba9377e64f4ff06886e4b46b5651c377661892f0e52ac49fc84cca65be3cc093c64fdd32c9f9120bd36ce2f244231f0722eedc1a3c95a65a9cd53fb6d26efa4d271b9e9452de2f598df063822f0ae238984736e971bd5d992ca812e5be5aa2d4852a84d92ff08d6f739b32cd33fc5c9bed9151259cc978dd7d1cda075eb36c3e564d7a15b96f72050eb88cfd7f277d466225fd694629c222d58bfca2070f2d7a975f196dd08ca75ead50f8c98a181c07d357779defc1230be3a3cdd64cf5c3eacbb1d01f1736d4896efe24babfa04d95d3cf5deca3a606b4848288007e396b0a95e068c5770b85f68ca1bdb5a1c6e934db483b4691411bdffb8bb312146b6072745ede4af2777ac074843ee0a1a11e3f7adb4e8a76f933eccac8b6905399d4d4cdea898796a9af15626e490ce963f5576aa81ee995b2d56ed6133e1cb7411de2f296efca017bcc4ded1469a42a57d991cc272e545d1f905590362e76d6daf2e678e5ba121bacd4dd734899ae0e415185fa709337283883281c581174408c8817dc7d6df6e667960d0e5375a0cb84c1619a0471463bdc20712b05275b395cd9e82d309aebb9a0670e5610d63a673f0053c3ecf08becec04ef3796ffc30871bcdea1b0db450acfb2179bd3910cac8bb15a9857490078050ae8f21726cda21db7d1ae0b0961886d96c8c12707a3fd76d2c13e9bb4a001ef8451b68429b2fe0c69659ece0000000000000000000000000098deadb3876d0b4300e5c13269dec8ec1d06fa3ff008d549734308ecdcdade21c429cef0ae8a6611ba0bdae231d58c55e46a78efe3d9f02de489db9144be2e0be9feff7e372b3e525afcf0b82faff2d5200adb40ac1e972cb225fd162b431c1300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000afe725a4e1c35a19080ecc537e36e35056faffc15383a9a09b70584bf3a6cdcc7be71f0535e63058877fea457492f74e2d4101fdcd9aeccb53353e3c9891711d17c6ac552e617e65ebae0df80e4acda0139174bd745fde9cac6b7796c692a7552f03bf45fcf103077d7471284926c910ba12f7bab5c07aad5bb89a2f47cb3b8b020ecc6a81b43338ea7768e08e5a833ed8c4a78282814e4692c6626e8223caf5b90221bd830a2b52deadf1ae3a99864b33d8766cb27bf9eb9cca9475609629d1fab00b08f2dd2265528e583b99ebee3546105dc4024c5e9c56c95866d5a12ab819ace62e30fe02c4b2146f42feca4efad8973694adaf4ba410a65171bc1edbb81b09e602236d5fcbaccb4ba4003265f7f63a81ffd43efc217c2294ec06062ecc85761977021ba79e330733b28b0f0d3a4cac89959fe96ea52f6ec18983ec9d9962b9fca52b0310795f9cbb3ce8a278984bb3359f1af044588a8a5aa0bd43a732aa865f0fa91f02089f3ae83ce35a9c06e050df3d2ad768a3639463b4a75cb11b4619a4606c8d79020288dd64afaacb97376a2a931f7a287694e56a194e386383f49a33260347a3e12ccfbd2432b3d8d2f61bd6e3469683e57e191849466f3aa66989c6e33f6e96d7756aeb7e183c6e718b969f635ea99b0d30cdfc43558f67c3a8207c92aadb7ca55269786e91f9fb63b03236ba706e30bc7923b0f4689af45f6cf54722061bfe3e9351523ae585ccb7bfc319fe86842328043353443e64b579a25602ba4be944335d9fe9e963ce6d6f5564471eeabfd3dda84cf4fdc537be494ac399c6742b90e3ae6e2938db68662fc0399a6adfa5186f9167e2253c7001b170f8aa0fb29d2fc6deb2871db81db2c60a50df6d801cabd0fb66f73ff19099fb10424e3552cb1b6528d003a781c2f79e909f39613d0ace738367059ebb5474bdb1728e47dac8ccd1006f02e3ecf35fee129253f497a7281b333f22d1e39b937573973e88a5dd723814c2d30657008de61caa0f7ed2d1876afe92e89bf65fee4d09e56186a2680e4809781758b3b68a5155429cb5478b419726d344caf88c5d0cb8c508a4729bd947cccf866b152db57e7fad0931cb8f2405786ff6762845e25d6ed2ae313c3aaa66ca9d1eca926331d2cf4867e27c6455fdb3387d8efb66556b2cdf5e09e0d69cdaa90999f1fd1206b1ce5bbaebedcd5306837e77fe3fad7cf61aaa7dc43afe22828aded9ec33067129b65f3474a8992a37b610dd37cba95a389ad22279eea1e5d28728f2ed6c1916252f1ecbe34813db53d3c60b55e8924407ea22da9a8a3b5f4129adf4b74baa7c22782dff28f4bc44a3a4d2b6d19238864dd0662a58761d7f9b8104cd82eb581794db20182baaac4e54f5d9342bbf75d6daa275831ddf4e9ffcebd68828d5c5800b4df067795d92ad4cb4e0b227b3ca706c1a421a990dd1a4ee7a8d0897d359f99a530886562287b7f7126266764b10c46440f0f7349a44c3d37abe2b31fdf9e026447ae8bf498e6969ce4bdd9f9d2a4f9acf2a4d954a3d99d62ea62946acca89bf170c5327828c33f607a6621d45de7ad1b3150f04ed9fcbde2181c8be55a19ab5ed9dd15b4b4f40cb395dc6fd4c72c5e4d4dc310838e522d5854c1944bbadc46c7ebda2cb8d486a756de15b5e156cff22d65615aa9cb5161a80324441d962af295862976ac451fe41a133dcab6d5fc3bd8a99fbf647baff55a015a12d3df5540cb3cd9a2f4b8e2fa7a16bf5982d5590a3ef431312b8f5b0214ebf4d7ea9a0eab1983ffd2be280543c952904af25b14d9fabd4d641081bb5a08585af806707fc39a4b6d1143efad245d6a4e756de08c738360ec17526f645c7696fc16a6979d2f9e80291b64c16296506ca03003dfcb4412a2f06540e0bb31de5e93dde084c9f9947236590e62cfb1b3b34e5ce1e7e7e9fb1431e0180e2a53f442b477b1fa6c59446fcf7eed04ad7d343bd5b302d0fa27b1918a96f4b07eb80938a9b83272ddb6981d2fae4e535396adecf36989108703b1179b9b55fa75d8fa71b602cf4dee9ea91858536b5bc6987b76d44aea58f174c558ef37dcfa4cc72c56ccc25ba81c562c5399f567aea6445361059411516b306c89919b127bf5d872b42932da5721eac09c9ee018f337acd18d146fc39eeb04f801027f9814b41fbfb7d4be1856d6a5cff312e0a6b0662122a27fa394c39b6c8fc92f217eb9cd3a2ace335a9afd73b6fdcdcc334d27a595aadd72dbb2e96522a46e2e4cae652f1c5daf9fc8e6da779a284d55d16ee6781ce8071f28c84641bbc9bbcfa936f64e4d1a260da40ae86411c6c4509e897d8bda9c30ccbecbf55e86c74c7466ffef36540851f60ff0d8ce696abd212e35f7ae5fda06d94be54239b0c376dfbfd9b22972f38a82cb4fe59d69cbd64d51840ef1fb38d0a", "52005253655363", 1, -1955598853, 1537743641, "2eda37e7a9a9c4b85ebb7abf68b0f15dddd0af09c7e2bf35b9149d5b7bdaf206"], - ["45f0172d03489ac24ba1ae92403424d882d3f5933be3dede59b29a024d77850fc3a1d7b36101000000025253ffffffffb64381a25d74b49295cd685eb8e347054b234d33c9d3cf1146ee2c9fc794d3be0200000000ffffffff4f25e4588c4dc678f5875e70c935312a1bc4b2bee71a523820545eeb3b3a8bfd0300000004636365acffffffff01c877270200000000036a650000000000011150ea040000000000000000000000005f76b6955f2106ad6449d5fc519debc24d4bd9255e1c7096fcf57f37ca5e8de61a547f9db058adc44c83c380b867aa0a83593f845aa9de1cb1356f3f728e66066bb4f70a6edde5e93f6e833ef00dbd61137cded56a4867e654153f2c5c31e159000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b61b29a3508102f29235821d9a5f686fcd0a2bee7e778248150b844113210c3af4692c8f20fb8b78d092eb3e296cec477adcc97a33e886125aab2fee07c1bd004551f99d53d0eb7a7b027f0006029d64b96d68b2af285a7ffa604466b8ed42dff840bcd81c8d25120048e53e0282e58bb2ca0c64f8fcfb27b501463e02a3a840324260fa0d18c271b6ebfddc4895d3ca8959a57bba6d0d829a6d8d7cb8e975a11031dd4864528232214ee7275351f16d8eeb86951663923685830334daaafca4d150b075ed17b4edbf578d21f58c3b68190d0971fa38adddaf4b3eff7936252616a88ab4690d4619cbe5267373ec1de35449b1c5a078a479f6fdd7b0485bcfc598313032cda5a0a7a59de825820c70a385cb612e1f0ca78843e0c05ce9d697b83568abb021c51c83159222345561729d28ea1a834956ac0191fa83624576eea24a9f3878703114a83d8bd04f89dc98508ac182c22af590fe29ece4d6f4c6a147646e068c3bc02233ffa02efe2a1b5b49980c34bc38f8db505e9304d43a52973ccc72fde1c07df030417ab257451f1a5db5bb81825672fec673a8a3e23136567445080395c3059c754d7e614dcc46aebefe821213da662591a12545d618984db22a977b7195fbfbed07f60f1d93d6adb8e63136fb9c387d694e0ab3a37e482fab8bcdb7c14a0eff3e4e06f02af625ba4eef718095ddf55f0b3218153f274fab40fd3f0368c1d48ccfd951f74b27524e7fb73de7c3e1e76d4b7fecf1ab7ac00c44e9688799e9a40f40ad6058ebe94e4a8c840adab4ca6bdf0e9bea0e6ffb88d4e58363da52cccfc01e5daf21f9c91e45a2c1980ace2e4587330f113fb236bf7cae49f1314e99e7a5a535e586156e5e58e8bd8122544c39474043d45d6979ba9b4900b881acfbe151a00d05898a072a34079378743ab0deb718bff45bb53379c484c3d8d8e738c0e0d86040001192e13c2afcc81c49828dc6bad68d4ac31a8d73ee572eab4c2cee7e2ee5e9c299ccdc2b711057e7e154ce2bb4e495a61248828806e2043d97e251406512116b17410e309ea47a16ac557d01bacdaecf1820f65224a6edcd667838a6f7b47bf49e3b6d0584204d16e72423537cb1b7a540cfee043161a3eeb85e44b60494c9b686de75e922c53cede06b8e26e4a90f76b74b0f63a28fbd295f2caf898630e58d9eb339c25106b45463fa15dfde240522edb7d3f3f246bec6cc63950fb93e49679090089194e8bcdd9982136013307d2d7d700edc8679345e4fdf3143784944b4d195c96d5f10959cc1d64611a77d108d27b2dd44c064148eff23d709473575bc0ee530da3fa951b99552d20c6eb65e86629009335f8a73b3772d94199282443fe475dfaea2baa4c424505ddcee7def5be65c52dc618f4e8ed41777b1c653af8c6f048fe0ffb4fd2bd4f73523379f2c5520120f64c7672e3a5ad2305bcc6ac1296cd8afd53273e7a60b50eb35e75b9ff3fbb747bf5dba6cfa968a2fdee88f29bb94eab635c4c69b8be77f724acdd621d8cd5c9f4fb1c4ad6bb4dc0378defbcaceb4138ee9af5931a0d2a995aaea6cadca048cd43aa4330a9b643d5cc123d129d60d5831bb33d45cd80c38295a3c94567365833ba2da8fa2a8d6f43069d33d0cd826dfa7567bf6f19d2d3b36a9acde823f5632aea0650a651eb53eb3494f6a23d05938f0246286cfc6f7c9fc03b02be2dd3880860e487b2b7833593fb8aa8f7f44b187d0ccfb4c4822a74df010b850a8d970e950ebee0a57999ecb737c7e45f83f9da5a297013899282d503d7fefce10264ce5f71edb58ad0b89c718943fdef9a67b8c541314fbdd822c00ff02294adc8fb849aa64c3dfb0c00d70a8b2ff4a2ed01dc4f45fcaabdcc4927a338cd20b537df5fef8921653d655a04171e17fb97fd1b7b0a4047a1f583be0e33e56dc725dc4f79b9df730ea84710561495910c17840de2486ce18b5632883c4ef983a1ad999f5f043f6e58e180b82495ef0825936fafdc1da2c957cef776200a1a550138617984704eed588f80d0377658c6937d93d2d249bc21211e5738262ec9fe3f9ac0b1a15ef8694b0e097f64f97619bd11be0879d305243235d50fd2b0f505f99864c863810edbecad038fcce30bb64917af62e5bba9c9cc33111a333be9974cccf78c935843dcda9e0d48a62c65fbebc5e2952a93fd7619713f81296b936eb299de852862105a51ad119d2cef095cae3dba7697b328a1fe1a2aa0ef77624b73f6e0fb7ba546390307d8ba78d63e3c30a2d610609689386f464ee2acee22dd18ff9da349700c3572ea5526b5e039220874a044cea6107f1e15bc29c0f7612bf6e5a45b730d728ba5f5d89372796ef93ecc7a45d5ae3f8ce00bae09cfc16f1846b437c398aaedaa9c98912fc8b1e29240f0c79e70b43895c2e07e84bb4a992c9208", "51005363", 2, -1783944428, 0, "d66b329d5e1fe4a8a536d3673fcd68a7d1824b0f130979033d46ebe2e893baaa"], - ["03f5d36501296434a2b8158d36520013b9ebf923e4a31df04583835915196af34661c16052030000000265001bb802e4028aa256050000000001659c73a603000000000352ac0000000000031fbcff04000000000000000000000000dab6b572147abdf362690e569b040cc0e63d0f240d825bbb37c88d95423edd368301ce931926b76fd4b66172f413c70da8e9a42e99fab6101392eb47894e11cf4b61dca6b3d4331f597f945e4c60f00e2d85ec695f08fe47977793d1878cfe5d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009bc653ecb22d0eb221f7e1ce53c75bab042e2d260abe57cad415edcb2a7ef1f7f57e0f753f4b19daa8379416c48ce2f296d3997e8dcb054a1ebdbfe17aa543e0e90a6bac80df4bba9eee8de0bcd4e0838e855e484ab16eb09c87de510b724e0b4831940e4403f12540bba2ac562e72bc5236e99561a1a9abf20cf9432668def30212fb214020561d2e0041a6b4d862eb798a9917e89a60d869243ded059811ed8802129377fcfb83a91012bf1294b6e40d914753fb5f077ab3455855f6269c22691b0a0473e73d2521f0b61a87dabd42acbc30f49140f34f16462e0a560290189c47633724e26c528e61ce8df0ce61841566718575a19d0e918a1bd480395a4c4a41f9032dacd3423123dbc5083554fd464bfcb94e908a60fe44d9ad3add799725aecd91021f47af3b2fff4b0cff3c2ad3a6fadb86eb3366c19fb978a1924863916b7231140310940344b5f5bae14d2f0c9dd43385a99a45305887368345da028a62470e6980022b04027c166db68cc372aed49de7bb63681ba0d814a34e78a8e3e3812978af6f021b2267d92a345fe5310a8421f6b06f231706dc8cc60e769cceaef6da3693217c9a86e40191ea8a1597663ee79b23f5046aa68d2c5b59920e82463e8bb8b1976c68a80cb1dcb4d50a10d777b634ef5fa9150e0cf70ce6cbaa509179fdd612f1382d93809ced2058838c02aa03d8442a26a1ef21c42604bb090736dafbeaa08df725a29e6a5f1ea609e86baed8c8787d51232dc1540ca3f640043735e44c524ebd0d716afbe03a2a76f7b95b113076c9503a0916221f46156bfdac8fdb1a8d5dbd4432624bbad79d95ac59aff27eb0202d0fc09288d95e58f10c6a667a8842be829a20f8292ea3e38e95b8dd1b432d190483a6534fff47ae87d625f3069b6b396f8803eac03f159dc0be8ed3a710214fe9c4149afd812dd90c927b437b5d760c5e81795c40f6bd16f589fb1a02c6db832ff09a95e30180b6285d4d9998511a8989b34207b92c5602c50c80d9a15b0399d80f671a6d48ca96aeeafbc4106ffe2b3ea3a0814622ea6b16b5031cc05bc1bff587373d66d870c7b8f52122c081bd13b0b1652ddfc0d430ba85d60bfacb0790ded7d30548ba0dcf47b9be5a2616af5fdf4072c12627c3c909e11533e2fee54437bfc7ac19d845a0f581ee0ac45d4c44ab30f4e51a6b95773425da2695992814bc6f10bda0c36366cbf91b2f8f4a3ebee78296b2fa7161a8096e818aff42deba87378973c61e8b1a5d6c57d212736842107951168b9b2f8df133d9c125d0028004f748fb36dc2572fd5203bc119b2e6cf5a5862a60e2e972ed8621253a46b1c68b9212777c54eb5c9c3a4ed389f95a9afafb473e771b14fe9741d6a22fd2fab40109b7666878b61aae88af2d0867f406740573471041873235d46e740672898fe05044817aba87dab5d092488fcb140b03ed9c419457ab59949096831e8988e0fdbecab745c66fd7b22f8bbab6fbd7e892e596aa04ec91ed1b3b2a5dba10a013baa3cd0853001f23d0be413e38dd1a89e5038633d3fc49c92d4811fde2c0b2fd0dc6b6b29f3c52c5f29403662deb96dbbf9314d861d740d081377ab41f735de9efdb45d7f94ed1ae90d9c8bc95017333b6fe0197c6d0e55428d7e6a0531e7a75616c6d9d1f3434e106c2ede717a4ce08e50af044221feb90d058e50f730161e36fbb4594a3a93df7b40ea5752e7a8ef1d869552a49221bd83c37caba24e5bc88b114896b30f9a03ee32dd821fa39a72e61840b8a3a3834091f50fa9ac0ce1fa3722034c4697ba21867d506a8de0e62dbbe16961762a1d8ac79f647096e9f1e63f8db71a66208c0b841588a3755ccd1fc33751d6e08fdfd853a419252fcc59b7c323e653d0e2ef34a96cd5e710025a153d0abb9f1211f8217ac70c0b027edb92fd09c0cc4ddc6b0f900e5dbbcafa1800b1d9a663145e5069c762a483e8aedfead96216fe1219239ff382a9add16564a38644f07ddd341d7d3b2a090cdf4b816b612814540c25bb795c32dc81fe7d445580ec2a8dd4a6ea0dee3e8e4d89cfddd729e3d28e741fcd383b6872edbb0cae0b14692ee1b80de6c69dddbf17460745dc617460b3b7ac804c77104d9c5ea5c31691002865c4eea4612ee803e0f97204862a4b3634f729400ea676eafe5dbc62d492fe594e6099c1b4c7faa3b31e7dc59580e74f0849bc2086fd802794d12b9bf3653f4c3b09dcf54101b8e27653e42c2d5d9ea67fb07c2ddb1757a1a5ded8666c34f0308702104e419b77f080b07f78ef0d6ebb9200b95020000000000000000000000006b7cf34403e5cda0a32b344fc9fde92845acc8cfffdde62c0d3157f28bd6070ef1b9ee5304ae1ab45ee6a83ac39f62c033d3120a912100d8ce2e1126ccc9dd1b79ed71a187f25a452226efbe662244ccadffa06b8d2abf6d04dfd7ce471fc0bb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1b08fdf8c988d6b1c36a0d9dc5a329cd47f7d4c9326061aae8417afd84618ee8437740ea7f9b65eb613b224e8b423f66440a39be096b030b8cc7e0164f6e0122786380b53dbc75aa829933d38c49ac5ecdbdebfd1d09cc350c257ba16cd5df38fb8ba0f6a6aabed7ed4c4ae3abc18d3d44a7680169ca5ffe124cea2317b052f030fa5adbc8606c5175aaf5769bcbf6658785ba0b5966653ed41fc59e04efd5236030570c7d4ac91f18c84af40433bc352d791c2a0f00179fc6f2ec2dbc309f23a6f0a010318e35866caf0e257b8d1933cef7464459477b61539fa52f86f88fec0b988a1ad4e56af092799c0a8c97bda30c46da9f7d756fc28fab16ff1186e177b5a87020c0f59252cb70e6484a890744805d5780c8c43e3d6a09fbfc532ae76201039b8022698caae83aecc76fb21680cb0ab16c08a3fb909cad9dba923b81a3ada71a176021f45b53429a2ce8f518e8d8d2fa663db963f65f2ddbed8f72f7ac00bc691e33f0213d6c7a17fb6a6340ca3ba3d57177b74043deec50aa8e6ee00a688cbbf45a46e02072ff0b650170dda61d226f0ce57811b18e906009d2048a0cd5fc736435b88d7f10d6b9e400f53de07f693ef4366aacbe5eeb50be3bc55834e9b27812f46283a9069a2a9ede5a2c25cb6d118ed1ab96479a98173d576e1414e6eafbb5a776c550141ee631bf3ce9ca393e77e8957689c8a5fd6e1b9658df4d2da3ac1c49efb359b9e30ffffc3eb1b78fd8d71553cbc38082da9af30b3abbf53190fb6ebb5b7dd24cae816bff71732cfa2b1a6440a6bfe0d32e7ef008a56e8360a5b3ef720e452010b0800b096ee303bcdb788cf26473d582bd75fea260972978cd012183d32d24d5642d2b5af6a9e7ba6948b8358a2f66f20077f6d5e9d95564855404230d0ab48f6ebedbec25e7f190cd32485d077b5af271b1c828dff9ad211c71a457f297b126ee9bceb43f49e584b493bda464866cf6673a85add7920d781eaa6044670e5ce8821990e16b731d22a636ddd84c905b896c6fce06c4998865928297e9809e91a0ecc70fb62ebf4ef8c31cf0f5b333e6742a239ec9a23b05ec3e490531ac0b2b1323007991610e5220e24d91b06d4f6fefb514b705a8b87448fdb95d6aa0c1f5c30a3621fabe2ebf4aad21544cc83981ebec0c07588b1eadac2b709c5c5129cfd217316f811b859b76665cc3e396fe108828e13de468ceffbe7574f6a69c9e478730e5eaf3b9ea614e57455486070f35127cf1d982c46f3fd7aa27876588be9d46e8222d95a0ba3912369ff42c50d112d9ed731c99026c464e4eec37a37e6f1f50a47401a3c9fb2c01bed4868823d4653bc67eae1326221a0ce00f90780eda137a2ed0f9b1797ac3aa721690c24fe893cf3e0419d0e69c059fc70b2fb53bae581d540a6c12a19319ef8bf9af8f4931186b45cd50be95d38e8e8acb44103ce8153bb6bb372c69524f23ea624e6dfe5b7e4c1cf5883b7479840d979c92fc561a787ac45150cfe67834c97edb466ca5a93570729365835cbcd8dd0511bab20c8b0f78c7ca0afa4425355fd87bc4c023100f8ea9035206744f68d6f038645b4bfa744f3ccb309f2a94e24e44868da7811041b93cfbf92cc0ec399558e5978be3333ea5bea9a9fd67e0accaf9327ec95c4e2d8faab7d5f41691aaee21e98e78e542b06fa128e01dfe9f67d3b41fa63ea0bb539ceb0be9552a70195a680969657adfa3bc370433fb8144196ba7b6c8d7fcb71f15ed0e641fd51b011078fa09e79825b3fbdd1ac9e72f551d044bbf2e09adb8da48ebaf649cc2083b8b5a01f31cef45fd9f83635023b79ab9f88ffa727a64f3c2dd1b3d1aaed9375e621c976743d41c1de0e77c958d1c9fd285ff6ad7a08602f573275c8a587f305a9de49bdc059e233da6859a8b854f1d31af041156473dda050272c8630c41a4e0f0c74ac02eda6e66b492f6feb2afe472666a7b9797167681624e2b0fb68c70766b227c629e974544da4c10f2aa11913554a502b7b52bc68a7bd0d4653c577095314c75ea1f487bcf1fb8d4f65f43cd1f93363a0f6ee18830bc6c8429103d19edfd1943e0731d526e65f5b4fce01905a56c73bf299e9948eccdd4be0b71bf14229c31d924851e3f3e0f946bdeca3fb586f9aca9d656c1266aef16f3fc333de24593602665703f9ba930251b09b5dc3b81289a6d4bab71fd3c51cc14eb937551c8d19e73fdf13cfca387830651c364d1190c0b082dec48bdc9482960ab7c98c5a2d64c783a0c3a0577aaeb51148ac56f291a3d4a45b0894ca23e500000000000000005ce63f0500000000c2f27f7072bde747b5f07b8c7d677afad128f0b9d694595379d7a5e548acaa532b4539faa36463b010af1e61257a0bb73646c8bb4efbd8443dc77833d210aac847e91d3489bbae95c049e75496baa88ed7bd15d3a549d74a3591df87ada3647d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e9647073e0c732e0c83a126f75229119c8b72a3290bd0dfd40eb09d9a1f12bbd5172309bed2e2611896a95b1e5c013b3459b4b70b8ee13bf15fbfdfca061c922669163f3fcbb64d674eb5089febc6520d0ca8768b94b80e0971a6efba4024ab30328b590f9fa18824f57c01d94edf142cd07c5b15c78e414ced2bda1a336d99b03272bfe5711c826e82c5d9d76cfd36f697a5a52c9af042a9517ac788c99b6955d030649d73d342b3d21ef22f1c2c34235edbdf1ef8b8fd1a984c3c759463559bd8f0a024eb92185aaa996bca98778dc73d9225146a62881455f42d9e9d9ba031dc03b97ff2566ee33ca6158f565756f5e9aced4d1c8563647bc55c46d79e14ebc9ead021a33f51b6f40f046e20388cb5462b9d1f8855029d05dfb882e98fe5392c013bc030cbb3fcb8c7b1502f85c59d5cdb57cdc7000348182b4f785d0cf6ba78b40de7c02183de0988a4c75f644244bb0a0a12a7bf8e8f4776bc7502df40156f55921936d0216adadda201de5f0a3f5ccb2216a3b64c83aceb522286af2d144a0ff87225577022faa1d4de122f85a50ec597742fa58f912c7dcc81a8a3d6be84e52c9b698aea60d38aea42678d3f07a774b05a14e72fe557e67a293b58125de91a96b9c770278e1b7e7acba355c3c1941765ba06b875caba271807c4685737ec4208834d38f1079f2753ad60f821655f0dc7c3e1085af2dac376ad3de4637d4622d95ece2517f55b640b9c7d284ead1de7ae09407b349ce3346da3141f8ce3fb03567dc24e376523073afdd3df81915ff5a4a6fa9b9ee2fd409870f3343a1c526b9adf43a3867a60996b8beaf8e26bada2465a43dfdeab138739c5ab1fe67cb7f87b221fd9a35583b0a7a17aaaebaaa6e85c86ff13c53238d49aac36db2f8ebb0d5ba16044aea14db376a40d1a231d0999271293a70378ba62eb4851613d584e8d13fc548d49619bb0aaf677b5afb071fc75289134d5a55a5a416e7e20848af058e0213e21e15bf98977c65b876bf1aa09981888e14c9272b442f44f749430c09d2333da82c47ae8185252d2e46c27c8960253edd37277856b1aff72d2a06aec4b1a1dc9caa38cc33a4d19e929224e9bebf2447d6f04b697af368ac62f7678b5befbd7dbb56e1bf5a92a0b1ddebf2091443a2e92710605ea92d1b280d1fa8e8db0f4dd5a97b8a02847e2844de4cc9750688c4db2b464d946ae8c038e3fb700172631d0d8223425498b39bda4a74d57c366fb0605c0f6fdf992031dcd3ea4663457e08ceeea282189eac8830dfe38a60a1213b7c91bc81f802998808db94df8b5f2af93303fad43eaebbdd3bd2d2aba60578398f22f05786cc4e4bad7a4d7c61d531030e995c9062df8d1926468222d861d068e9b22e2b600a06fb00fa06b48dda5fa82734cf95a46d2045c954d8c840b79d3ffdb6d5372b25414d882d3eec79574e4088df56d9989a787cb758feb5a8b2a772d6cfa4611133d545a2590f4fd556e95eb9626ca1dac9e236f79e83f1f253879129bc95f28f04220dc69a964662465cf5cd318a569b0e1a3bc9c565504e17ce3d5800b678e7a0e2893e17803722e9fd4bf5406769697d14a0793bd8aa80503960bcc398471c3a5355089fd201a84886127574b256cf72d8d7362a6762ebe0264f2f070badaee3cd8c36d5c5e57d8e37b370086ad2f0c39aad06d98c86159f22136c89f92071b2808ed90885af28746d9b32396b7f470e211fd873100cdabf7f6e0c55dfd3d7ed31fb1477985f06a6e8a430c95cff682fc3543ad829065da892648f4fae5b4ac7f4e62ca1de0259804fcf9085a38945a3c29fc3a2fbc8b2b1bd67d6e7eeb4080c736cfdfcad32d885ba28452258b7b24e5af3c65aec1eaf6192f8ac80420ade83d18ea24b6e80f071aeae177d8b76068458228e71ea695a2c8ba3cee86eaf6e97b14fe3d005da8584d1c65593c05ef382b66b70d7056b38ee770e2e3bc40f30545f174139c968e7de1c195b23ac18839d7d54a7db4d45ce75ffdc4e02098cbf0d9f6dcbfbbc10cd15d5a02b219f4264d64872a5514181f5b92b0587423fb4faa3a8b2f48180b4545230dd4d5857344cde3726b9634f59c6f8db24a8cd856657a37ced48cbca920c2dea887fe2235dc4ceff418cf93a45579cd406505d955c13b125e983f6be87b636aaef3576804ba6d04bd0a323aa3d8d280a872319534d545c1fb799300989ccacc5122704e25ab275c661c81e639f64be08eb3867a734be29a087bdf3186871fb03f982734f1bd3ed09c9bf5d36f2eb0cd3de2e6eabd2e03479c051d313ed286ecd3dbcfad84da69aae0dad1aab57b6fba9b0f6d7b2cd8ad0cb81d79b16f3db8a72bf5c5bd85444378458ee4a88c4f963ec1be704accf0c41851d3b6019720b3c7d677da9215eb675a805738303657b4bca5221eceb28cb0f", "", 0, 2004741781, 1537743641, "7cbd2b3caf5523c4a782dd1131da39874ccefeb6ea7f7eac07e7aabaeab0d6b5"], - ["e5fc7e1d03b687fd905009fd84ac7bc2f0ef0ecba48c9ec4cc4d7609246edc179f705d566c03000000046a53536affffffffbbed1aa3516f63ed4a6e483d45ae3e227d8efa9f2fc2c8119771e4d8107e988e0100000007ac6a516a630063d71d85fafede4da4fe8d1dcece5aba99e3df61043cb228b081b4fe0f356044e32df11f19020000000351acacffffffff0399dd9f04000000000365ac6a9445a60200000000016afdb7e40200000000065165536365650000000002000000000000000098c6fb04000000001302c399146c7ca246f52d4464c973db4c24e5e5887c35f316ab91103522959b98ff8073be70f4ba653b94a69525fb88e464bb55f2bc21d73a46031cdd97606812fb84555049959f4a12388165e49434ef00323cb473f0547ee3b34d88dbf1a300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000654c1ce90477d2dbb5d797e43dc793fb36d877eae41451d000e492d5b55ee329ec988d35cf0566827242bcab8405ac540e4415635438137cefe317e891f05695938d57aa32bda8f759ce9e25435d2f7252d7dfc5a427610d715ae8a1f166ebb4e7ce304e0153f2d8392f315109526b274f4f7dab5bcdcc77bfd725e9f273cfb20213e5e3428f58f92dd69878c5311f306a425e285b3234fcd507b4e56090e6a0d1021d02fba802c8e83ea81336adecb9b1a439e0b3ed8caf7e306b51c5ffe4c4e5f70b08a1b1e1394aa68fb8ebc7a2b245ea9387c0549ab00101b0ea32a3b4c90ebda5bacad9456376f73e8aa9dfadc75adfe9ee9424e2a18f7ad0bae6eb435b90f6c2032bdc3ddd05c89e798c9c628bfa21346e8c40fbe3cb3151370627e1ff3d86b0fc032c6ff5c1fa5d91cf50b74fa1bf0e75a4185de1b81cbc3844f932d63294e63d4d03233dda8627789a137151cdc8200c87c317e56f515f80dbd31ca49a62c61fbdcc020c83b1ef32fe209acfac10e693bfc5a829be6a014e0d92f50936b7c1c95043eb032091a6c8864838d7ec155cbfd5e9bff7f1f869503fc19d73b7498fb98036aeb4644ab54ea7958d89be597e76909f5d0cd0f0d1f9ad682955181e68b85a5b5c8657ed1b79d54008bcf355b5842d9a8ec1a38ffc2baa542df67730ad86b3049ca268997a9d2e77212e43f4d7aec429a915dd8c306ced82bca1ba58981db10ac85b4c74157622c799b34d8e0988a384415d022feae707267876aca2384307f3495d387346c0343e83c9be31478082a129a2dcefe5a1afa3f4c3cf54c5bdad8e577c1a182116e56bab03e7e34365f4002fb54598f31ee3a41b018515dde015b24ca35da32438d1fdd76d245c3bf06c9bf92ece6130d9bd80ffef88ea08e2ad8134618e5ae72aae42908bc6fd23e4a3f70be492df6a5119b13a9d492425a9d80ed07bbeed79bd2b0756d1e0d9554dd76473fbdd69f1e3d555dcb4cd0ca5a6b832ad8c729278ca90227a04fbbc17d744645ff446805df5adc9e7cd887dd4f6a1e2641c64000ebfab01db6474ff69a64458f5b52b35ced6765057b003b520b1cebf62d1e3fe178ed947d1f02ed973be4991f71e71e9d179c62b849491916591c0907f9255bc9da78bfe39e2de526a9429bacaca73a3018cf8b42996268b3171502b3748cecf215f93a57879718d8a708c9248fc11e9d9020762784b2d0f3f78acab8800a5f16314f5bd6164fca5c3c0f8693394da653cfa66b546749e60f512c0e045491aee15447967ba1d4abd9f075cacdf3aac9b2bfd7c1787433fccf7e1abd93887697379982ee221f0911bc4b99f23f908a95bee7f6a20698079e2534ad4205ffde8daaea00eda576e4f2fac6779502a29e2bef552bd7b2823295156a63ba4bed6b2281ca6083d81641914b0fab5fed700b25ea7a67c33b3e24e17ae7ec8ca46f7c40c662c8a70df9e8a378918aba3c18f628b11b94cd9fd77a46fab042b743abab2ef2352799812001b619ec4dc2db9321dd7862d4bf70851c25cc3dde6567b99c3aa0d790e7edf61cd0e4f749dd6532d97ccc153ebe5ad49dff1cadfee608d552e22888a3a7c53b4aed5b0279957fd574800c5fdd9b4f83f71bb389bab889321c073e6e423b30310ed0a96ed3c2a438612af883be6ab02bf3be72264a616c74e8322882773bd61194bf636bf5058984f7fc74a8035c82530225e4691f212048fc7362f2933b8ccf54421a5a97158b7f2f42dd335c24048d3d413d2a1a3438b235fc379bfa8cdff4a438a8ff179de5a2b5183cc8f8ccccbdce786e7981475070999134e023bdb1f1ab1519a3a4b3353cb10d8b806a6e71b26d0d6071eb3c1bed4966ba51fcb7091663f7b13be02b3cf29da8c4222f4cf83787c6f7b16d01362bcab04ae70ea28d89ea36b2727b49a979e00581d4fc929022b00baa870b38168703c910fad97365cd78cf857feeed1e59348c0e266257cab21dcd91de4c992f6b66e9f6ff9140b4420e6c14070ec7300855f0f9d0d0886d77004585b37943c578490241b9e5fdba87f7899ddecc03288ca699245954c4e107c6e0ad21e8164022b1d86dcbfb9cee08ee8529368073d69efa02959a688b79552ba5d8664a5a5207b36acf61908e73d052d3c813fec9f4e31098268b50ae944f50f54e23ead623d4aebffde00385203850fbd29daefc1d1577ce5da54a982275657914ce2d7a72bc58991e5a54f5c8f7aeebb282b05743f2a499840980905991b9a8fd046bd65f615696b1f574fedad378a07f1bdd74d00d6b17dbcccf803000000000000000000000000e56406aeed913ede2214c41bba34cd1dee2f8f75501d18534ab2f18bcb11649308bf3dffa840d4af0004f3cf47f9d459568d91ed314ca25c156afb9f05733e54d13aad4aa2756e2e562b784791e2d9ebafeaee33979306a7fe60b95f6e51720e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050b08e178e5feb736b01545e3157f92d4f022c0f27d32815a21ef140ccca5317ca048773988ebede557e53e0843774dfde37c3e4b75c62ca0619b188a81e6ea3c9fde900d82fd6bf582ea32ead5f8d14254ae9bf483153b188d9d9ddc34f58f6370d4b2e02ca221c9fe8ff1428ae1838fa34e1189cd49f4a65ec35f68cd9cb3b0319e20ea161213b4aef0c47798103310e5c6a1d6859428355309542f445a0f64e021e8db81272eaa5e5a69e0f51c310205c674b1a7c3012e17c48cee7a18afa29b60b004d22ba58bd6918d626ef61b757118e39df294a8072102d005020105863597045b9c187ba479406b054546be1da8495b4260c1ee7563edab6124b86588ee187021a7e29faf36569e80df4683caaf4c103ce270d5709b9e1e8d14f1fdd378ca69402273764645f458c45c9e7589a1b9ab8c273df3cbc909505ae0fb505dfbb08a0ed032ea3a35050c794932d5670188ce318c6a18235d1f6d646f526a405abf60773ed0226699dea0a9c764a2b0b9973d5fcf9eeb73ee6b7387982c7f9a4b02029028ca30206307a54be7f9876f2d85c086c7c96f7e1541e68484f16e58ee545dab8d7bdd41c29ac96f4605790c365a3fa88ec797fc88a27ec9cc652b3cb60cfd498bdc15452baf306c8e636683c87a8af56bf5cf94c14ac76dcefc30b052f79fc0b1f5885a14c26f82ac7cfca501d14bc113200d81bc28f32906fe206493f98bdb04723ebca9c58155b0c92450167ea1806fbace514862645e4c326d1186c3945d41e3a72cf294c5b50867a71eaa918398eafd0a8ee2760d11919c3ddc9aec7a9d716bb0eec48642e2f7a1e9d359dcb2b58828ae44d893346b6a59ffbc4852fd754f2b15ad9e84a372c46f24eb7bf60450916242788ee7ce898f616ecd36689311aad47a73bb4a8c5579f6925fe1f1ad519d3550e65d1b420c3d14959dc209b10a4c6af71ddb8ceb16342ec5df54b8de0609b15f3135c6b287f64f9df42fa078b86208b63653b841cbd1362ecd486e29b87553e1c73f197252726f1d70ee473ad5aa5398aa8103b4456312f85c4f196093e30b5ed678baedc44da6c0a764fbf009c4c2a8431c9b331e185649208c79583f4e3ff915f1a986f033722d923954bfc35f70b97fc4e05a4010758ee5dc195552ab6b34cb50c29c47641ad1665af473dd581c2067821de4dbb8f84ad8d9b041cf51ec235e3d1fa44ab33a52fefc49651fb5358381b6afe1c6ecdf311b52256bd207f72fa6d6cc736ffd6f535d537ec985b5d9db836f1bcd0dcb0abb70243ac2205ad043f3fc474f42beabffdc3b82aef40cf6811a61e3a53c21fc0a13a0dd7061865abc21701d541f0f153d2c2a2968aa9b639f1e21ecab283419d32094c69065983ac490c0bc480b8a29d0ef71caf03e0ce1bfe811dd74250e889f74bcb1b7f3dfa3443a77ec32f652c31cf6a6288b0f5145dfc27e2fb8729d91656e72fa7c21f6adef5e32cedaf8fc19a4beaab1f50925366a01f4d5364c6cfff518341ed13fb00051cacacfa6ee159230c29f0493e9d512104e0d05fbc2bf6cad561aa68e0f8f7822ffd7c2ba2cbaa1d59a12f95e99112552d64af57da628c7c58feede4c5c7d733aecc785168982ef9a1e4562ee8e6dc27925b2b8ef16e2974c3491af9b9bc932769d5c05534f33334a54135bcff1caf33fb929a1b33379a59036271c94ee95ce2f5c9c2be216bd95cddca321df3287a2372bd38f1f6a8939c0f1c890e38edbb795e257dc48c0cc216b0a1a9765809d6bda7590dba4da85636f2ae77afad346fd898e8a22ad481bf3c81b2113a15810fa0f301c00fc3bf916f4b47212bcf4e5ac081fe8f2180f6fff1bb34625c9b86eb084214c256ed942fc691fe8f844745895fd0be154a3af580d44e95b7c7f7cf954ba43f2fcfd697195f4963e34ff389d6de31b9189e77b205fc539a5a9e3d8a0d5b4ffb57dbcd059eb96959e84556809bd33aff869d096702521f7a670780fc71e2cf2b28401e2b89a825d71bb177c056982b99dce0b1352a594ce47a0c466b3973244448a014a966f151cf30bc881091ef065089622449dbd0145ae576cd39256f7061635b0fa407413206371d312dc90f71d1140157fb101c49e0ebdc1425a39d73b4515fe570197f2ecb1ec88b75118669692dd165fe4fec07587d41dc05464cd21101a0970231b2777663691f7cb96c96a2cf6de66585d57fd03e2215daae79c675e8f9c53340e895e3405b5f48c3180eae1ebc8011e1ff777aed74ed1a7d7f74607582e4aed2bb8ad966b9d3bc1213421db318220c2773c947650542c153de679fc1b7f3150f5ab2a0956c71a56294093c7a5e69967d03d05660df48bf556dedbdf6ee57a9674831717aba072ec44fe6abf2d46205a7a75f648f77a5bb533342d6a32a3f93b64112c49ca0a6a221626e8f0b", "", 1, 2062189804, 0, "79fc29cba33881dfe11876e406a4d8970d2df4897e18b7c08312e8e469dc5fd0"], - ["030000807082c40302f7acfde57eab7eab7cf733add463896a94e79c9c621f370b398b80a577693410030000000653006a0051007d55059fc23912335f0885f06a0cad840d161db1aa2452f34c675242da526cc6d99e930e01000000066552515263651ced8fc5022d1d4b05000000000600acac630000575f390200000000056aac5153ac000000000000000000", "52ac510051536a", 0, -1762206058, 0, "7a6a02d6b6114678bdd5ecff94b8b048bd77f6080ce828dcd99162636bdd154d"], - ["030000807082c40302e29f9889d4d847e47f9506ba18778725fecb333040f3ea8a8683fafc99d1b2190200000001acdcb4ae75e6967f3c24adf360401e77a9fb5b4384afcc95b9c6b34e6f516ce72db8f0cafe0200000008006363ac526a6352ffffffff03ee8791000000000004ac6a6353ca63c60200000000056a006a5363a1e8af050000000003516a5200000000ac616170033526c003000000000000000000000000fa1f909f0244b075dc68801a361e7dd783e4b52bf5b80157391595645faac2dcfdeccf6d29e5556bcfa29a9e8d8dd482eab5b06c15a5c6ba313395f01c46091a25d2aba07f9365730132ab00144295fdb0bc4a1f52bf5b87481f611bfb7e4578000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004de428b06480ba2eece8c02229bde255df2aeb849480c84136299d274b61b9602f5de9f6b1dc0be0f8b28a0bcdeb869b247c1b9a44dd9af1cbb4ed959ece32f47493874d82e7d8ea3c487d0660e7cb1096c3772d25aba37bcdaab9f3b2240a29a244635abeba3f0f5bfd7c8e873b30fc98a0aeeee2d0aebe3fd5165296f4bc950303d72f6a522a678ff7b54beb72b0f97cb76aae6ce09a63f89f4c8a3d565d02a6022bc57825f810e9b98eb9915ee6a362a0c96e2807f914b06059b1c44cfde803550b04a77f18ef9930b2219d1afac9883a50b3bcf8ee6ba8d7f8334cef1be786aec8a57a031c983bc2f2f1cba1d2885c232e10302f939948c559266ec27e3f26e3330311e1e0e3097835798e039cf98038b4d443e137e7594e8a9991cab3a053f1008b0327f65c8140888a478773e2d3931099602be4b211fd8203b58b00311e9aa2fae9020d8d2b0165966223a939b35c3085f5f7dbbb672cbbe5b523c8d77ae3ae114f200216cde38e30210928d78835cad536473b3fa8855019d62aae13ae43b4f81656bc02149b9189f9ddd346859831d5d91ea56febce9680c24bc152da487e0f221abeef24953f1fd3a9afd0dad579ded4ac75172848214d1752dee8f8f123bf0c5d218c657fdbe3ceb5905876605cbe42e90350d47d14c4c46affb27a6c886a56f48da6f050f8605fb0f28678e023c1d5d3406f2bea0c5235c426c40eb27d83b202db16e92386b4e7dd46c33a7285af759ca36eed3cda784092efffdfe8b0bb926378a9ae38b2fbccd3d7e6c193bcd9ad3fd44abd05b9c5f7751a085412169ca55281b0ca7c203b8b361f4294af9c9473f3ec5f6a53a70872afd4d60a9f3ded4e430cae35069291f761a0f0e5431c6dfa59d79ea43ec0a0f0a7754d5c737433a12395b13967bef7fe04cd32bd2bfdcd651cb5cab94d10d34b85bb018bf8776d2ec19d780bae4c8d7199d7aab65ea5d4e714737cbbe5ee0093176c6806df76de159f9b603e3b84e57c373c01384b0959090263afdbddaf544d996f6b68d894fd177aa380daf4eed13d3fac77b42ba1c8ef787e87ce9de5d6c98880f2c9cf89004879dd6886215be855a33ea980e42513608d0b6fa096812899c4e8640f570b82a30dac6b7a520a8b5915831e38d99f702756b87af82213079318efb595ae5323ffb5a6f40765dd1681cc4382b3587b3f852bfaea046c0a80e26fb18e17dba26435b97837144853cce0ec75f3ea9791ef097581d6ec7aef1e469640e4219c6891260441479c51d152bd74187adf79338c7cf7b8343714f0a5b63f9769029f4be16bf5c0507b82e31a53efc38639e2f42d0c56b911958e5d0a9c6b94736fa343102b1c226e09a87de8fc25cc6665b17707434c37adcc9d98de2bb41608cf7a7b5d0d9988f672bfc67e7fee8ffe040af3a7cce58a53b17085b6ad5bbc7ed46550171ab4d25e9c5662c8026611bd3570f905562bdbd75ddd90feabfe64b0e2bd7b99954279c3dfc8c0915364dd68f36367bfad9626640b95974b6efc48a7b09a2c8ef7b0f64235dac6f307a63685781cb1fcf0bdf9c06b364235284d6aca5b0c21942f3a40b6de6c13302439ea6833e9c344c628d8793d885c9bf98d760c049058be10a7af4252d3d39a0da855c027c6f2743f28990ab7e5276beb8f92fe5e6270ca1c75a69a4b0555ee2c19c23c60fc58adaf20ecbd413f5166f93b0877ca04154ebaa269c33c1323cc6e372372bc694d799387aa907018ce0ffa13759535dde8d396f1ad8216e9a0323849e09988fa9c6fb5b6f63230ac4a771f4f39ea6a9db74ef9d790439572fce3dced528a9d1378ae277cfcaf15d86a0660bf7de310ad8e21327d8889ca3ff7a1d007a8968a9f069bb629d40a5c0dce994f3d2f30f178370f861076081ac48a61094a9988167a9d29d48d267e3f8298fe23b07e716659e3864efb2c8438ec5421025f5ddefa6fb3e5fee6d7969531ec77206a04224e630b292b3532103527a0b099bdb22a7a42aed536bac1a202345a8839f4fe80ab3c8e79fa7f2663ec684a69c6d2a119cadc26eed8f2feebf4225ee6ab6ca399e1dfb8ab550f0ba79ef9de97075de676848a5159a85da153c818ac368def8a92bb650e7f688d1f1590c91d795b9b6b8f56743f6ff13b2c156bb0e0f4f9f0e8a9c3788d10a55a4c8dfac66c6ab25f02bb5866464c8749628255a75fde919e217b4ef337986a94ca09ee1cb8949c41a05ad479a7185a266ff6648edd31d3c91521018c888a420f1f01db1cca9ba08f30467a3ca5a7a24642c1f7a28f89110500000000000000000000000069fcacf17f3423697ffec8f15e13758a34e70b1ab1ab3246b70788b4d8788560fd867b5d885994932163f0330f93241dccad1e42308cb3e0011a099f20320b1088711a4e65315528b554667f4c0c4b56df75586ba9e3ef9a5fb705a269ab04dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f0ae649ec6e3a3534eb6f6da906946278605554c7544e976e0593dda4ac885cc848d9178387ee568665b45abd6a4a1f5f59d59593c68f3b3d2ede83def9bacb0c3d82bd049cc916e896041f0f19577ec8a81acd0b568906dd82cf704b568abfac11d26607a7d9da18cd874e4c965dac635ae1f51d5e371cc3502553a08e2147e0207106104dfa817fb697653d52e852d3567eba2e836f766d19747842286d4255402033b248bc6ce35d2464d1f391eaeb82a87a21801fd0f8e9521d6b6a0ac96d4790a019b6fb238cfdfa0234eb32122f8ff43ae2e08e58939ec26a5c9644a36fe36ead32606cf44427cbf6e3a564b849e2bd67d00cce2b56355b6b05282bb27ac4d3c02173e92a74b394f1d242007b92bc9e1fc10b2157d6b97612481e223393285ddee0317897f078b26daaf51fa406454f1daaf6676d39937ac6edb1f28be203fc2e71d0328eb897b24b167e9ebd0d15cd48676b676b2d1e5e36e8dd6591a06d57336261d0306545729acb4fbd03e0a1d4393791a6652ff9b0640656602cc422ca13eb4eda503098cf19f3280bbe169165e65cdf4b54f0233885125fe8442528306b6da1d2eb3d0889d5d4d9821f2ce52fe8cd01ec5e833310b5ef78c4455209a3f630322416315c45d7001c560c594cb7625dca3fffa1b2272980461ebdb61aad66f9a4bb25a82962ef23f0affb88492f7f1642e21cd41e661d927933bdd146b99f5cf2e48f864f42e45182a564427598299b9161ec8448210d0292d13ea22cfa815073702dbf8a2c0dd98f75dca34a36eec56f5692aa3356225b65cf5e64c9fd74fa8e7af5a295cdc775cd95a75e2d5ae245b08a2f23c2666c80ac1d2278d2c8b23fcdbf548627a76680188ea9001dcc6b045cd9bc24268543bade1da0250fa272953fd8027371180d77fe08952fbebf23fe26861e998e9097f1cd60bd6d86df60fe91532c672b3dd2e52fe18a2602431bbf69079298f5f1af59e48da430a12ee03b8e8299f42112880fd06002eee05a68594850f5eefd7151db531a1da089882063dc8ad15b087bbbe65c9518cbfd903025e205a03c70ae831d250b37e48089e2b39107c8954d76dcb7154ea1cedafe99bca9a797853a097e0b204340158aece3bf437f0d07e8a4bda31a5ba07e01a974042b74ea474b4045741c35a30cbb263e8d0cfc15a23d0a726844f35ab0b63786058f3c26b44f6cdbfce0987e3681b9cc5043eaf68a70301c5bd29cfe73b0ccf160d3525b47bc1a8e3f7e998e22e35976e0832f1e1ade991ab8dfba5b08de617dc5a78cd29298bf5a02207173ef3e12f3f1259c895088aac6e8e0efc9fda11de50205a34d427e33c880ef8bb6c29b3c09b66ea364a13c5b876e90588fdbbf95f81fbcec32fba50241034088bf2f1f2a8005a25617c56e6b7b9362aa7f8d27702cd85939c43b0fd7d4b5c475fbeaa24234509abf8111620cc7de8ee5d40033681cfa94c8dad2018f21e8940f59872d542630668eebdadf04f700f58d13e4269894ac8d339d972c00f8d49dfa9bb915ff9b490bc23bb1cf70fc50467a78ad0a274d455c1463db277b4b65acb13ea822b4f741b3010fba5952c292b57ea91c10664cb5045b807100bd8c65f0cb91be9a63b85593235a814cdb4082bd8adbfae0c588d266f42b5ad6f90faf7bd75926f48fa9067f119ad410934215737aec8e18afb41683ec986376588c98edb19a69627a779ab44255c8969c05a2ba0d47f3965ab42dd1d15a4d67da8bd14be257394da13048db47840dba2303801af3feb93fd643708742af5c0b99f86818476328e6d46f0775ca08f2384c43578b484019ac6d0c26b6361c180af30a01290c13ae52051a87cbbdd03a3860d01a51e9b48643bd684088e28b6d0cf5c1e48b6176ec944c27b487554e67506bf0fce088f8b88d8e6339cb16c1578c32de13bde55060536186a8f7c41a0e846a6f08f6c7b616acdb4eb5a3c644290bef65e85606da6a65c04b58656b34dc24a6ba3a733f282bafd55dc6762959e93d5462400c3dc5717386a5e4b1e1781f88bfa3f396fb14bcf20ab8c828fd4ed14334f62321bf0b857cd06caa5b5e92e35f008fff70c1d85386b154a308b613fae6ecc7d3ae967c9628f88d1ed8069f639241578b00df47d4e374720dad452cfd18225fc0a42830239573739f12ea834637e47db736f60f8c8ab1864697bdf2268a1a60998b32bda195af5e03160c1c670135cfeb5e5a72d684d5225db1c9973fb711d985f2dd393dc53057f82450362a0f5f133444dd7a42af3abdc5af396b268f4a802f604000000000000000000000000c49d712845920538d0b8586a41040838cdf937989e5a6c4c5d71d02ee1f37fb5ce2f8f35431f021d095fc5f99164d26a822ca04fab14197f1764c235fafd671584ae15d7068e7c943b4dfdf399097f4853bd252b6abf42995ffe2d04bb22fd5d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096165d5283f09a1bddd13d31b1d01d1eadf306bc83bb17c2c3783f442233295c38c83a762bd29d9a210044a8847ef5f0ee754c5a234324b90f7d08fc2850e23a1c9367096f5ac4f2bc9c365019a731aedb0cb0d8bd5e5648589c9574801abecc0287b618abac56499f88b6168bc201c7fdf465b34f172d8d23e6216b2c0f7e9003127f4bd451f3cd002ac0f8e0ec361e4d89967023db024382b62d2754c5234923031ee5227c74c07fb81b6dd0e1f52bb9b22953bd1e4dad8301b1ef2a6b79378d170b02767b91f7db62a64b43ec8722793c45d2199131caf142fc17d3553411127f1a3b0d54c367cc7fa543f0bed8aacecc8cf45400415084d877f47bc21369f04d0a02088465df9737dca4841aee1cf2d05d460964d3c6eb0ae0e3517f83af74128bfb0310facfc2ba4616500084f59af8bd7541fd05a76579a7b34654e43604535dd877032be3d8e43276d96ec06f6c47c28f612d70b50795bbea6c75769f1b2157f31d970211168498eef812f35641682781fd4779473c0bfd70e340a082df0a4580f8644e030a26ffcd932025438ef4585c7a1027861b6b5728a849032457517cbe2dff1621ca06f02a336f92a61a9bad2a5eddaf7af89fcb32f9e92040fc87605da84f45b2a0ebea0ca192c7cf9c52318cd367b9b6ccca5e7231b2662ab347b1d985cfca851d109d1604bd94568975f2f46aaaa1839705e61a092cda6bffc935ff6819ee45480c273a54fc2bf923b68535bd38dce96fd575ebe6c00c228842c31eee409770dc6ec10d4cac8f4551c361e500614b07426a08df3a400203c9f449f54d16e580f695f14e7e774fa830b941c693de54bc9760ddcc0eede1f8d73bd88f5b9365559db4833cd8f16522bc66b9d0abe88fb56e809633a76ed5a1ad195fe7011b552f445c69f05a73c20f2b649f584a9f1facf25909b44d2a0814e8b98dc98d07e30021755254e1b2772649517a1ca34ad494f0cf458e25d6568b087f23302e10d8fa9cbbe6b79d15ab8841d633eeda74b57396c1e311b0551354e983c841a52d7169bb0e2fbabeb16074b66897148645c6d5a5ca86f427860b69c64bfa93197bd6065d0ec8bddc68038e9f7663bcc1289e0f01152a65f0c53a74960a25e09a12a729d8cf22eaf13914cda5dffed4cd3edccbe073de3e6a6de75171b15bf993033c38769411a9a2c1c814c60f0ccba9842d5c435ad4bfb91780ddd6ef335b3856ca2759dd797acef57db805abd7295e5e8070e6088fab2fac64252f8dac2d644c94475106b56ecf7363223f9a7425d99100b9119e0b59dab34cac07656ef16b3d43fdbc89d1b973a3aada8da69d2964983dd125463009d0b0b7ae1190346febe9787a4f2d0fb80c105d0bf23be2d1de8c7d4500c25eac2e06f9322c2c52116d63af521ee9ef612612202a7a3a5e939b9d3d197167334ce8c839b305df533336d209f83ae618f70a07eac683ddfc156f46df1a42a882dd07d48bbb7d936d2f17dd96201e5c2e9167eb1ff22b70aed53bfe8ccf2d01b1ba8a5cb3cddd4be5859c7247bb2010f8083180dc422525fc62a7c3f6b0e27d3200a4159066978bcfb712d56cc3e247312c590839464d99fb6ebe4be3c4be9a4a1c536e595c9f82dab28dbb1812d10acf73289c0e953d5a0a98e5760121c0b507c8b5bc2d9e436fa62b373f36ef7763133f69c86d79490316c51e594673dcabc08b65c6f4c2fc4cb11aead1a279767f1759a3c9af1e945a2abf832a5c6f27ce712ef16442efd4be4a8a439a9e999fe86c48b7465a4d678d1ea54b65dcacea5533004286f65a24f8ad171b88f292a86a0dbb028610cd7c20d3a639498f19f3b7b116cd5b45627ff4c50cdf7462676eea90eecae244e47a43ea0175408c5b8f76d7cc90c92c766394ac3c4aca2640a8c59589e5263ded07898e30c96ff2f53fee1eb731504640afd968c440aa5fc5f810762bd65ba800ac52a3d7c5ca475bb20bd6a67620b1e6e89d8e4bba9048a6e8babaa9d7ce3fbebe00654e51403ae095fd4f749e1570605c37b88a650a30d650dde959e20d47b1fe36ba7ad64c35e0134e27c8a0f600c54c4fb7000ceff7dbb15d18a88767c3dd0d6bb70d61bbedc22443bda78b371050c5d1c17bc099ef0b5768410b3ca10d62673fb21622b21c0ffa8b1cf1639652d103b59bfdf464cf8e61186fb1a353796772bc1bf73b7e970d2499fcfdb28fd353eccd18dbbf2d2842bc4aa35b36aa6b4e961a86d9fa6b4275b91f5a43ff4c07e9a49f6deb3e4e788993d90b098099e106f70e0b3c9c9bb7252d234d089f240c13a016041c3b7462edddb9a054c7b7767d347a1b75667de99227c4813313c6a672e61c1f0952af3ef6f52a4c1bbfebae89d51de4d2b5a08226e21cbdd9256670a0ad76523d8e0d120be82b5e4a1266b7a35aa772223ac81b53460f", "51515253635352", 0, 824019233, 1537743641, "96f6fb15862801db592136871a24643f10f97e376128d3961dce19b32e9f0132"], - ["4e75ac2d01c06199d2460df6e8f02cf734120ad58072e80d538854ea38f438c36b3765d34d0200000009656a510065ac650000cbe7726a04e063e90400000000055263656353e6d3970300000000015136e510000000000003636aac8df85001000000000900536a00516363ac510000000000", "00525251", 0, -506308425, 0, "49be2f6906ad27b10df401845ce5d91da4e019890aecf41d9ba09132881af0e1"], - ["030000807082c403014df762648c614e91ecc2d4cc4e8323c3f2150860aae4196e8c65f286da010a410200000009ac6a51006563515252ffffffff03816bf30000000000056a65ac5252efa72202000000000452ac53532cecf00300000000009ade370ffbc4fa3d02000000000000000025e06f02000000004b1aa1a09295f7332f74e865997733b8eaa3334024fa4dffb00af629237287d8dc9fb40192566b90cee144438f39eef0df4e1a04e0637d86ba7c59d53a5a23c77ce8e1cfb53270e160215a8caa2494b672e3a3e7ed4814648edb2a939d4fe146000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a116711cde87bd72a1ecb37cfbd369081ec131621599217acfcd128e9efbc8fb080f7717ebe34445c299c926570fc71dbc652b5ca18758e153e064226b254b646b03e8bc0fbf0b1ea0fef29812b278a61254ed51b66cead0a5a95b84aeee10d5aef77d7631c120ce5da9132a632ea99265ea24d1661db7242d01477c90af8ce0320b303f94393329885f0097551b2ae3841551b957a02cc0e9062e9adcd2e66f6032869d676b52384ca5b091994db1e082a07671607548e45c320dd822872bd2bde0a02c4b249c861f21df169a8c4405dfeebd93f6ec88da469c58277d1d61feff00b86471379efabe5f1f96af818361acf53eb9dd723a4c59ab70b9160f6def86d93022365e979e5984e831e2640f6d703c2bcaa6f289169a6362191789bc853b2c6040319847f168f5678e8349147cde1c93b2f42dbfa865b24d6a128e6627e122195a0031c683c92a5056f9ac1f53f1bb5847a603d026cf72710da14c8748170594272df021e3c92b1faaac1d7c8c2b1727d08112923bba02704cde7ae049c5df8e273973302162c1e810e3612e8caa43a2ff34deade0de3b04d97933e687b9a6c00e95426857ad32dc376be5ebf5b3bcd3787db479111c49bc797620c92b20858eff9f75a955caee0c9ffa8ffb298d2a2781cbe343704f851c6c4a45374771e8e3a664ac93a681610be7b675cbaae67c32c2f652118b26a18e8479ab0ebc66bbddd583a86ea42bdcb55142ec33afe0b185ab66c6dd5f788be00bc3dcd92bff296d6328db77087ddbf9716a3405e60e6a7061de31c8782b15473b0da11aec5a89588d49f26aecbeda6fc10a44b0bf49bedfe8c52c99c0ad826b336354a585a6b3f5da1ac92ed0a5669cf922e19cd6719d7c874160d757857127a796f4165cb16ba1c48cc765b8f8cb4f1ac7653f6f4667ccc3126e75e595a63aa2f9e9b03e7d599e4b142e122e2fd05fa2524a828ada172f9f31d6236713ee1cab64e385da2fe2b0822d2f27c0bbdaa9174ccaa99fcc7c77a3b0a18d005999b2f947b3bde1a93c4491b790c3708e04e10419f1f2c5d8bff8e467510a987d9e5eeafc5525bdff4e1bf5fbc5dd0a3d2567edd2d0c8ecf004016279449e1a77db117445313574a81ea4ad1e0a2483ead8455043bc815e2d5a1fcbd56192c6761e3b15719abe1b4e55617603da5b7d05e50e181cebafb0492d9f562cddbfc77cc15441b94975b27f3a5bd9be4c9bba7629e189ba94cd8cdaafa0e34d6cd7a71715f78b2b64e6a95a5fcaa0b3d7b2c7d0d29d6d6d031c0a7766b19aea3f7f82b1a168a77ff153d4669a9021180853ebdaad2f2632d636a75a336c1ddebb2292584cdcad4c212fbfa6b86c7a6baad055f9bd234f18e81566bd7ae521bf9a321ffcb43a703009f1833ce37b7048caa8c9daea2b54ac31a979a2287954ed104b6e3fc0b5c633653efe6d40ddcd0010819a20907a427a686a038237da3bd83c7df2e8d9a10e6dec8e16a11d836a4839b7d649625eb5e3cf992e1592091a0db9f1d478fc4d153ac1e667c04b3108a4b824c973940ff97e4d7cd31d5097db2958f931bcfbc70b9072563ecd254887e695eb969622411a0fbe07cb50d95865cfbd33d9adbb4efa28dbdb256f743547f93e2e85ff6c6ca39c9328fbe5acdb3b00fd8339ca934fa3f927eb1f77dad9fcf89be5370d1a4f83732b05303cd8e4dd130d5c4f355dcf6a2ee099cd588d0649399725f03cd6f8688a97f90d3fcb7473f0a5b68fd8ce4d5d93cec64dfd2d9c39b47ba1a4b1a3bdd788b00ae20a331b8d48328adfa1a398b673721355553032bede2f64fe24bba4974eb2cf768370e8f7c5edbd1097f235ade9f64a0dcee2405bcaf2fcd1df8fc49a3dfd55bde39dfd5436e19355174765d53658e0f2842d574799404a3bbe6ad4adbad467b3caba091706832136e38810efa628b65f44b8fa653aefa93647fca9b1e47f33fd47a4236d2a511f7c9650bf398538ccd7892bb52257eaf2866c6d7c34ca105eedb414fb71435cccc3fec6afe4a119d670e31d258002e9f363a47291664d262f31d74b3234b41549f9b7eb3f4f5d862282d563f5c2319c21e36bf0cc0a2b90d9295c5d8df03267024ca82042b1a9f7ec83d9dfc74e127e13aff102d53bf2b5ffeb6a16ee433c49558438ca548234623f7d1177e1dc6862352cce1f17ea4c1154673c61668b3513ed4e2a397f3230bc8da4eb35784a5be808f2f1dae700c496a0065c3eb18bc88d011537bd5907359f68a1594773868ddbd716469dc8f523415d7be47513c2cf2dca185efac66da010000000000000000000000003743596167172f09972960b957992ed657f991d00a9bfa9afcbaa1ad881a638fd5764268f03a3dc10c4b11013d666f1e9d9e2905e49e50d1c80831b0cbc4f30dd7efac87b7321c7bfafa24194e4b507a7a98b1152ed4fa86cecf1fbee8bd169e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a44329852dea6edb5c583a0d24e33c479333570ff0c2d2ae95def6d531d73c891779b209b0fee3f629aebc329112b68ecbbcb639d5d68f7f9c3bbe0a608ac34671fecdc73820aa32a60f35d808f86445e84c31cc2177442f8944fe5b7498e3076e325d8155699ddabc25c2591b897ff6f824ec7f58ed8db6ef0aa4971098de70322c56b0cdd5a1c38b1fd17afa6e1e7febff1edf6288819d4461a64cc5adde2de02252c8cb7be44933c242f8e74557b0deaef131cfbc03566d14cbef90597ba0c3f0a06b864c3de0cd6d617222f605df5ee0667f53b8d3be6d3f00e1b2c12a71c65c40c94f52c44473fcb3168a0eb25ebb1558533a6481051889ea21d0609a139d579030c92fe868452329c4857080eac9c14eaf936532e676d9b4ec45b7fe903a19498031cdb9d999ff92a8a52d5da8b5dfde4ef6887adcc39eeb6bd7862639eca0f2d93022bac4c695ff3c7d1a10233c8a77d52d9a5fc63d2a066b560065a03753e6296f90203578971dcef32c1b1c26be9b03b9c799fb7f7c66ab3c2d18689416f8e169abb022c75b748a789368d0d5297478753fae3bea1412bd6112a8bab98b707c9211cf1d060349391957cc726a2465f4a93cbefa70bdf92acd38a2f46d92e00acedbfde5634052ab309339edf2d22f9653f2b8b2f258edcc1e7c1e94702547be9df64dad8b1f383072cd9b4cddfe154159cdc6ea9210fc0844bdc67caf7e972fa2e6b73a0110dedd3adce95579d573f789c5adfec1684fdda856abf39d6686f9693682aaa9e2798b4ab3dfa81ff5b2acd1cb2c63f16d0ca9347763f42c8183e1de29574ddf22b066c3694f1a3f17271a7f78e717a9239ddda1ec07b3d1ffd2aa365abc261805f9df706b5e4ae8189a53867f89d441e12c00afaf8f60c1342a25d7943068419bd0fea03d3dc70fefea218bb966812ca7b801f2d3e952011827041757052c1ec048d05bc6fb2c8f56f849ba80f06f54e8ea1933f5b05356add231cfeb2f9180bcdfb502bd015f5baa9309ccd42524002162f1cbbec8b31f01afd9e5d1d5499afff5d5eaf6afc6e2ab828eac7d340fb6622d9b73acb7b0488bed7759b002e14a9e5af74dd555163e135b43285559a8050827a741e6f897829d7edf92b3df4539ee36fe65bf399c44a9231483c79e9b50f130319382910a37f752000b4ad6b17eeb31fb8ca21b07cda64a786afaa94bf38017720bc1341ff2e9ab15de8df1b051c4ecdc14c38f6895c9927a139c4c24b04ac4667cfb1c7449d1518e6d9f09c628117843057ed79996e81b9ffc0c85def16ab7f12d30426dfc42cfc936f134a344390f0138c1062f8784ff2f3f39d1d91ce4a083d648c7da2e90fd66bd534651d2d2134da1cf2cc7875326318f887dcd8d37808da80ad6bc7f0e976ea9fbbe2e7855b8e9a7d7413f02918029c19cf15389aa8491e51931b36251c2fb74187b5f141e07fa66c6f11c6b7411768a9fec752c53f9d18447c16a6ed0487411e4051cfb75c1640415d9dcc00ed3b000db18d4915cb208bd75ba57c8c16a436118be28cd096a2c258ac7c82b098c99f25c02051ac653afa7390e49df0c7b0672fffd484388a5824e4721a7363b2af06b7f99a421e2886751659166513f890044521d5c91cae7b64b0fded1d8ff352896f6bee79125d2ba3c45cb50f1dafde2b6e5348720cde6a8bf8d53fc625c265a7776198ce1521a4c0861c493a1df08c1903952f7e2482dd6bc16dc62fd53bde2c99a742d23dd7b97e2a0c9b29126a47f94a2be75992cb13445be8ed159b18425979c52ab8de3267b44c0ffb5e7a8ff624e1158ed45c966bc1dbb549b605630ba4db0b56f35819159879e4e162b66be17259b52896c773aabd8f4acd4d512b74861b9d993cb662fa2e161ff155678cccdd7c08b10d9118034d2338117b929943e064b2d7fec2f18397ec6022efdf1a29924497f9fa4f61ad393da09066e1c08ba93c73da664b9413f43b6e612424ffbe06db15800154a7767f1917a56c14963a6ddd68ae087ec0218490d95a086418f44f1de693a00ebcb83116242809b8eaa7c163e51579cb46d7feeabe7b59bcdf23e2905b9f307f5d2c379470d3d3463f6a02707a2f90a6ead9f800852532d794b1aba12dc3f860d74233292d75deef0658598df5b37778af7670b8b92ac85e670fcd735c060d269f139ed798fc4865ce53ba4488d8723cddbfc06db11c7ca4ba2f61a2af2e92f53dc9b25e0aa27277227174a0631aaedf30005c52ce23be37c013b7bab4c35eb4ca92c663961a32303b335a5a056d98817c79a277959d5525c6e67ca27e899871b8adcf843a57c094b3afd71b902eecb35ceba8de46fd24b29d32bfd7708e9e4e9c8f04b8c1a90b09829b4d51f16f08ffb04cd9d2e84fd8af52e6e0803ccc30893967980b8e6c138aa6974fa271a5300a", "6563", 0, 1658768464, 0, "6a1d07e886868f8fc2d19e38b85fea4160440068055c9ad7488401aabc8a1e44"], - ["030000807082c40304f518e7c31878f7a5b53f6794b4dbea6f87c86e07d5c8f4378276f894cea623b00300000009ac0053655365656aacffffffff398f5bb76d3ead7489f9915d63d703fc2ffed0f1b039aa91627e06eff50bc007010000000165ffffffffd33601b71b1b1b939518ff95127a6a02ad3e05a0fa802713e022189f5f23740b020000000452ac6563ffffffffcd2eccacc4c9d22020c974e3bc4bca467af7d4e01d656703b562b086c4e91a4d000000000753635263650051f894fe4f034bc7e304000000000252ac7ec79802000000000663656a6500ac3b648b040000000000f777c8c14fb50fca020000000000000000e3379b0100000000f007daef034cf007dd8f7ad47813018447559a3c89d936014776645b078fb023dcd7815eaeb11096d30c2d9080e46284f8c0e715a0d17849c7e9c64c87d2790845b32f7b6726aa159c4e1901c1e9a6e910e0d39c55ffc08a7ed7415abdea76870000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d80db5c298db86381df76d8cdfe2431b282adc698800c7a5454b17f1a0b919a32a673a0c89526ac77865b932398d7f7b035d9e6a43dee5c98d95d9bda5c7fc9514f6d1b98cf19723049cb80dbeb742a7aa675117cd68422ed3cca95df86d4047d7d100e5bd6f2749b583fd0896422a5ed372df33c03a8c56aee8f675a512a3022e0701db8edd74711edd59d249917afc29f7db6df33616897fb16ea5d4604608031b6b28e7b3ed67be18366a32565c96fe9b2c389f4000bf80317bc670b1756cb50b03339960d21843fc2fa3c0d0de76e18effe98d380bcd2cbbf53f1d63d13f08652984351abccc47d7c4e08f7f2b7a0285df8ff0158c4b02fc26f8f5ceed38ecd0031efeac909b2ea9746cc1e4fa9a5413f16d6645d69eec2bf0f3e8406d1ddefdb0020430703102ff6ba0a1e7be5bcc6561c0e57d9388631250fc101b052365d71eb602168e8d1a2784b93a25f8d8cadcf3e3e0bf965308eeb02d5f4f894bab1b69dda5032b011876b9cd843acdf85f13f95d64a3eeb379a6947a5bf5ae37e4bf5f677c240208dd5a9b7c96a718e78f3de7b7a5f3c01c4f44de8290c5bd6db8add90b14b7c16d91b4521e29bd2f142fda816e1356b3b431f96293f7848954cb515af15fdf6b0572d8a80f94a4e674aa347abd005f11c66bcbb1fdaeeb70cb2d256f0f857e6809dc79d0e199523ff414b50ea4d85442c2dfd67d62933fe5d860b03e00d9223507b0546e3670aa5935095d156760414707e7f1d36b9dd77888f20d8a13870d87f2bb462791b51dada1b2c555a225e21d0c36750999b23d68a98105566e0b658d4ffb106043fe69ba0ca83f63cfe6d814b366cf16b5d22fee30f02308f848869fce0ab0689dd1e1ae28773abcc019b5e65a7e84be0a213c795bbe0266b2c5a4ee71c0a0cee087f53153deea1b0bc51a88648f55cb87741ada0827f1084e62eb311df432d361309a851626eb2137853d3545d951a97f4b143cfd9963eac2bf5e105c8806599dd7e6f933853dafbc8f63df454228403239e6ef60d495f3d157bf0ffaa1708bcaa284c30cfbcc9d7591b780d60eb6714c8254be34d0565b3becf75ff473444fe7566fe571d4ca2c4222db8083a989b49ee06e0df5d94c5bccec159e4b359f4ddd33ce1284089e205ff4e66776cf6363032aada62dee91dd1391626f026bf415c51a8d4592ef1b7aebb415acc214dc3ab6e3719cf7fd534c90725d866df04f7056467789ad5d850e2ca78ca58aba263c8e08258adf93bcf61b988cbe680364d0a966b01a8fe4fc292b7f45a5b932c432a36bb696106c2789a9048bbe765c9d9c37f416ccfcd5dc8b52b3c2a4f15ae72766d4bf1d6dfb5d7dea69d5bee081fb45b94d4003e4173cc0391a7dad7c6a527de1fb8ca74bf872708f0e05444f9ca8919799d42f7ad0d9d6566726b945ac73d3af91f3e3f820830c871ed3a5d7567e20e1252c227d848d0eb2807919a04c73f6dff09dcf2db8c162e0f030466469f7de9854850ffc153c998c69e0d74583b64c8512e4688a3c80b78faab173b71ce3a0fdb0fc82b20944a63bc53ed92fb680e52a80f11d50743c70b84f336f78335721a34c749de850c9acc5d53ee4f04706ad1bf68bee70287d49abba224c51fc796ff966e709f2256cc9a763bae6acdb19347845b8d3b928aeca44b670a065c92588f832d4c3951b7884f1fc7d06e2325ebaf87423b7e23502d8057574cb55867f034c538a294c41a93f109ea30e145aeb4b7550192b7f28149117288381030dfb31b7c239bae505273e421d13cb8f9e161ffa43b38bc7ad34f47a62c8ef1af64bc54d56445d7d7a32bdf4be3c139c7363e8eff850da39cbca43752385b0601034d93146345d0fc601266fb8a6f2f4213605282576ae80da2d7d60a0a876ffd4faa553388e2d118eaf6ae8830a84cec4fb3e3c3d053bd92a035fa41e53f0b9ad0abdc659fcea0d16889e41cc48d18d9dbe5f3ffadd57d7501c3c164539d47e72995f24a9500e272ce3c8163da1f89fbac231599727b500bf1a225f0b5de53c9a5b2a14ebc38ad3948dbdb5f231193abf3321ad9877b34e241b4d649e97100de3e3befd81a0ffb4ab1dbdee65cd417a6e9d31b47a0ee11f9e2bf45477be20ac50d850e93343272324503a2a24582d2a6daa1aba40e43719d888314c6803365f465791e98774001b49acae16f5fe850b7b5f4285ce8ac2a5c7cfcd0087c0c9d97a3f0b1cb5ba3f64f40ed9af35c97a65935f285d8de062b8c58afbbc3d17bbadb1ab7f5b3343d046e2a5e0ee0dc5e05c56ce7ec200000000000000000000000000ce23af4e031e06bc5f2dc6e14ceae27eae8ad06fad83d00d445a573a1d6e68ff377a06e336a28484422758427b1cc6d02a3c0ac75bd0d5ea8356905f101afdc7a9e86b0b69159ee77f714915ee2b7c33c2c9320efedc9263f34bb7ca81fb1be900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f33398b7cbae0c6453e6c00643e6a3df17faad366c9906a7f1b8a87591dca32c42638ca920892c6776ee84c92562814ef97f704366639d4d205cc431e146d7dfe06a1dfc0e91e1729dac56835afedf01efd57f49ea9be26abd1f8864699e6b61e08e7bd970cae67321bc5cfafde283dff21034323f7154a95e27c76b1b9cc7c30202227384576658fbe6db0af0b0ac374ed6d1aae87c2ac7a9a467da2b55089ef9030fc0836bec4098edb864ac665082dc6eefd386a9893491785191cf060ba127490b07f17c597d850ddcdeb829d57c49c76b97627248f9a9825831aaef51fd1ae9fcbb71c58812c03104b1ca6e2f11ee4e8e8735d785a5e916c49992657f980adb54020fce8412577f70496c673dc3dba0fc5232bf4a31cfd4c86910f8a52b5c86dc04032310da90c11e5db53c96f911adeb59f0234b3ed163467c570e1c916bd7e075d20227f676093b95e608ddb2960656c97565730ed512effac197d3a1232ab3895b90030e8beccaf7bab50cb56c50bd22b75c096f4129f6b8f1f51579ebc7160d90c1de03150c90396a85eefd178ebdefb2a9e4b5c6a734860988c8ea4c212a833f8e656af4ea5d8adfadec68243a3d21f34f8271ee839562781e2b734b509ac3c300da59c3e06e2701406e64dc826c2f2310fe48e4d3687acd278b1746d13a9db19ca37cd783a45a24ee061b3399197747238dcf4067e5386af2f1ebde825034805154c5c6098189365d83c327a0e62865fd99b38ed53f0c083d7d7e8a488d30bc811dab1712fa476bd3de4e205fa599edff7a24de6cf5e2101e8532312f4cf0ae3a30608c33770793031ba8c5d8f9adfbac0ba26729187e11294605b5abd7776c79ecaef9fcc9b4ad5af17991c1a27b541f5c3f5b274dbc0b728b1e161ff199f9ad3feb1ebd8f78cf2f7e3069a20a7a4d646d174d4cd1c624928af639d43d278e4c7f9929a574d13540113bef4667a23ebd785373e7592b4320cd2aec84818334583f7cac062b5c895209a93bdc691a3baf306f919d37c70ebd0c82e06f794bd5331b33b539e0fe79c8c7a2c1fcf639f458751f14bdd09c0772eb949d756a1900bdc9ff22c9c1bf89e12e5207a3b3f50285653ae8ebe8c585d01ad254217f10adff5c8f8c8fe20e8d9c6efb3dc651ae999aa0efeb45d2bc503fdb679c304422a5ceb080555344e8dff71c450eaceb630705b205bfac98b5fb99aae1251f7fb10b8d455d16c2bb59faa7352f5aa881cea425c37088ef69113a378532dc1e7d73aa828c84688cafc10f2b59c3ceff527887be5c2b81add41834abe9e7ce0db873ba45b2787e3b534287370b31878ba35f26b0b2e6a0727f7141f4ccbdf20dd4a2e5544c309fec6a10f025e7c05ee04a7bce0e8ce478690597b973487a6951c26e332daa364e4d4b38333db3925bc575cdf2a4246de8e43e6f17685c9fd01354816eb20c9bba6868d46b9053d83b5dbf08d11d6434a6a6cef6ee1c73f7ce05e212b894a7f65a20762f72ed106a354875ad71ed54523e1311c94b172c703a8c060a1aeef8ca0b27f98c9bd72ebc77faca90a24ae731722225308d292d418ab7fcff4af9f3e08a9ad5e302e8f77436810c0743a9349594846c6495d1430f13a262d79ab574f97895801012160fe99e56e9f1b1ff067422ce994d2b4ad3a253922758356b8c27b605a63c763941de0cdae5d4ca06a27d7f3bcadf9e9987c33fb4785b185bb6213de7fd4fa2582eff4baf9296f184bbb72b88cb7e0e2dd24a5de17fc73ada4bc6e13fe329e7fdd70c13dbf820c632c1024af0b3d94003145afb4b786a330661a7c55d699eef7c949ec7c4d8d9fcba4efe0c0688c24c1ed8687a794d7d0aced71748154477d5ca884a8ce2cedacf3abac6a3a69c0f0639fccf9f42b02b5e352484c6d82c4829fc603e749cf6126d33c2e114518d0facfc1c2b5fdaeef59b59f5945420658bc3f478bef275ce52c25e06b7fe544cb346efc692e35647bab0f4bcd13e56d854ec6281cabbc2dd685316d19522d123e4e9648477ee0013e8544b181985628a5adc32e895e6460ab6f030219c440693add4f587ec74bcfff3fa91eaa7125eaad6e5bdeea88f9abe90f41f581b7ae315c6171441df61e79568598648b8fb45fe5ba28d7f94ea2eefeb6af9b12a9ebce854881f014809ecb4b43e156bb61a3f596daf29e31d49e211a01f4f04f416e2cd1ae97af9d65d64fe6f0f37a2243344333f17b43c5c0f7736ebe6c99c17a4885e496f99f9e92067650ba3b819900c6061a78fd9112a023a71c5ff43d8c355713ed5c412663c75022c2c936f542a24f6f255ab96efc996a099f78f475634763dd79ff3b26ca612d1fd0ce62cf1a650e852fcfe9e13eb37150d60e0f248227c2e41252d36aa9af3b476d2ce159d80b2325f458367e548a08de8c72a93b371280d", "65655151526a6a", 1, -932011162, 0, "93ea30ac925ec9cca5f7195d176ae545fbd35283332ba542d8db57559b035a3c"], - ["9e70f12d03fdc1665240e550bde12afb242b329e8d48f93f6cf8a9c9704f9eb223361903b903000000095100535151656a6a00d4652782bda1b8d80a30255816f290a1d11132c6dd7ac782fd015ec49cebdde143e94d730100000004636a5300ffffffff8cdf9c63bfa36ab9b5689441bb2b773ae4f2c789d9341e3f064f93d61b025e17010000000100ffffffff0214e15800000000000852536353ac53006a060dbe01000000000765656a6565656a0000000003512cb8000000000000000000000000001f84cd34471f1b3acab926c826113b91038c444c8c5e50c5857bd4310af7baa474b84dd869341338489ebab9791fb84bc186343c918a58601f09cb6d2bbf57ee4fb3ab5318dbb2153a9cfd39078a57922262f257791ea24c78246a2114f6c7ae000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d2f9da8b12b5a432514de992452b757db8d9f31359ae8d09003e3f8a4e5e376315faecbff82446aaec7d793dc07e022acd9bd0f0701bc598950a9ef1b7c1b6c3b393222a83af300fd24fc826fcecae8e7180ebb9fa52e521bf0bf167dbdd98af91c10e4c1f2557c7163d4b1941a6e9e915d2dac52be532d8449709dcc6910500217dbd602b703f32cc801695114312ff26423479490c35891b15af13357887cc7020459410165e8b1eaef5446d1d6be9457a01a7242f5a04efbf3d71f295c0544450b063d0f06146058d8b43f7a81ee52a84dd77151570fccaa7d5e6f44613770c66847532106a90d1067995fa3d861d865a8804312a0ec44b47e1450e7c91d4731dc032a9ed1b7bf81b9cf7f472655c372f2d159e6ac718dd7b2ce158a2c8e53c5562b0320a8c23ef0a4a4009286077f5b5ce6a02d71144818b3bbe2d6f8cacb01991aa302058dcdf471bcac7f87ae711765aa5467be98342730705955d977679468d701570310a78b190342c79e7aeda25e0ea58ada678313a7b18583cdcc69cf5e2f0266010230082d306487b0afc9ac811b6610a9549dc3933ff0436f7e5b9e4917ca467504888fce5b2625f6c2d7c2ce15979bff7774541323c4dc8147b85cba7ea5a0e1869ef62b0d5d9993cf0aec76fe285cf7e30659d6a7671fdc27f50bc83f2d7534298c1647e8ccf2117cf638ed683548179d202515a3a9eddc821b121506196c6db3f5fe8ab96de33a70d61c5ff0be62177c4245ebdef847a8082cb768bb76de0b9eff81002ee937b87d95bc92443c4bc284db630864cd16d2364c4f0fbe3d483ba78cbe22a7ae20084686775e2c376b9291ed89f33f5b6f4b41af0f44f7241c1bc250424b0efe7d340f59e5024d9278851bfaf79a8a239725d6af8ba6efacaf534427704ad786f44a43ce140e8b1f050d718f2b1dbcb7035c1eaa67a96d92f69b431b819541c7e6ad5878ebc2c99a88f7520bd8b77d2f6949f1b9f717c369e8894a8fab792aa3b93bbd1b5e03bb74ccbad1a29b8f67650d7fe3e692d8b56cd3db59c232806cf67dd941db906afd53d34b26a18bffd8a08e216bf8f9461bb6eb062c42a9eb5fd07ec7581d07b0105d18c46f261fe42e438800c8b37595c04cc14eedbfff94ee13cdee364e955a9837d7108b3fc6f19e8f26b699d83297ebc67ebcdcb0e69d3cb56ffa370b8963b356b2aeb34e36b9a4cf7dc815cb44457c685b111006748f2802b56cff3b860cfad6bafa591b315d3b2ed2e2c798c84902c58889634a6ce40cc2e0f251744d6f7bd111f34a4a486d7607557794475e392d2d83bb6d9229db1b1003d598609594a409df14713b2afdbc5adbc7c1aabea66a3cbb74c31751adee260517d1ca035043effd5cd8e5e8f58605ca8eb9fdd8a988dc98eb834a7a1006e25242e6b755de3a401634f1403b694ee3692307baaeea71928fbe2afd4881419f7f1eef3a07ffd3ff7cebcb11b5ba70de68d225d05574ad78a91a2f1059213a75eeddf6f90c15a514de89ccd92e006b8707bd6011342716556150f91fe5b775bc852d68fdfeb00ccb306becf844b5c60981523eef61c8158b0c37c51f7d89f83df95fb693bcc0966dad4b579f6829aac686a5bde740a5903040582a4d356700e426694e8ed67bba8b1b28726bb22d72288922d46b64b7b90021bf66b91a65e7675ed8e913a706c8a24ff8a6db96d17a005512da9ebba0da1e7254c8acf50ea0840977a31b452b0e04fd86b13b8b299780893c9353973def67a135abe2d15ef43f303743bd077d9a5c10e00627ea5807e0687c6751f0d95c812b93f2a2f04cd93e201025b36f501d28438065634afeaf222895e822e688adbf4fca6c032a58d1c9a4c4e96e3ace98edbdb38671af1753e550ecdc49ae5b3f1e4cf466251836bc5377d15be78251f7b3381c10b1bcad7367077e6424191ce5a7738ab9d5464104d4239b37ae01b0d257683b3a062a06eb656c594401c41a3ed07aa3407247fcf2ba0bc800e608f5eb2784b33f0087c43e8d0161878089e466f4b87c9221a0dc7b6aad314e9d001ef31d16ac341d09ca7d01f65904672f5c3e29644a280683db79fc59eca3d5ff94dbe096e15348ae1bb626be141168a15732880c59f0ce7d501797183f8cd9f5ad8f59b0288fd39a3ceb97b50d8713e8221db23e6e0b6ebe5876421e94283ca308f13988d9e6bf10439f699bdc85d962709630786375d41d8a6463f653c1b66f3d2a654e478a24b6b16ef170df33a854dee5865b6d1bff2fa962fdaf01fd416f05e09793399d972d00000000000000001d94610500000000d79fc92b92489db5d0948fe7c0626d686c43b4de297dbbc933042b8900ab522e12a4e67801db9f51eac247509623fa6d478c84fb2c84853714a148f5839e8e5431e80509caaa2d4d3484dfff54b4f0f3bba5ecb6fc46e6e9861f331eda603d500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060edce68dec0f4f4d52eb8140522a0e6f47b401ff0637a4828a7b6ba86bc71129c99945e4e6322cc3cbc18af75e2a41ca2d8b1b5f24468f25724d26341bb028750e5ac63c64504524c5c1017560a848b0ec2e911d2d8d993005eed57c05a29476687515ab44df2ba45bd7fc55f57432e341b2530873ddf5836889ecb1ce137d5032021dd5c3708fa210889f312d5da05651b5f9175ceea584844b15d718e09fc7002186845be8a42540677d4bf7a54156876f6aef4ef2fe8e154bb5116948e4fb5780a037cfd316c0b2483745d9dfbe73eca6544f289e2f674648f422de7d922f7f30dc5ca528e73e29771d0f2e6df5f018e08c79985f7ca8079c34d0ba1fd21e7299403186ea57c89d778154641343f121f4a9d88057c84b18b91ab351c0f1d93ce7e6c0303e45f3c584d8fa70efe624cc4e188400fa8c65006f49ca2afddb77cee926fad0200864a63342efc9701aac335aca604a188c08d6e0bbde8f1b118e5714d431edc020c5b0cff7d07ddf658b7f17776a1e40c78c171ef3416d866447c6a1f1d61b700021c7f6cd3f4f19ff4773c1f681a0d47982c94a14ed4f9f025488922b04437b479d76043d9bd4f3ca42713cf4ac3c1d0f052763d942079d60f3e7756e14e629a23f45a76aabf7511cdc57e7e91f20f5d9aa5e6f48b74b6274332799a328fe5043696dba6724d8c11e6107a99def7a2f34a5311436ce8b2faeec35a2c93427493c85f85e1c83d2c7f5eb05eb59d8815af0cc80942951d040b01a457fb247318bd1e2c443135457ced3118a5aae81edc3ec822648bc52be4e1eae41ba5a1e66973a93b970bbaa954cf9bd0f3eb5b3d7a1e6ea8fae0f7e57bde8777f2bd6aba91b92d9be7a3efbe0a3f5eb486b7f6b3bcc5e8d8a7ce81a96d33232155ad7f408ad5ddc0fd4a575e4b7ce67b92a486668ce803637739a2f2a947bc2dc4832ced3df35f3b5a7d5da2f7c421adc0a7635012066bebfa8e62407e719bd6ab7b5e09b7fd34074c63b6ca962658acc60e35b3d9fc61434d09178406cb996043179003dc7a362bba1d056994ad09f0b9b6d50945ff7cf996031b5f0ef9bce82ed83315f3ed511c73df095bf88a06efaaf49740b9dc3bd819fa8ab68806d437c45ff2bed981cadac3424e2ae6030d4af9d9a852dab1a3c9b0cd270e6d576442ac2db407c7e4c8298bee91ee23610dc477a5a04cd0a5afbd25d5de8f1ac91d25926c14e3b15cdcc01bcc5ca059213e9b19e3df95372ad31340093e7ee0047db36221a9d88eba4cd8b660fbefd861031d6e660f77559d45df90fd040d13f98d839d0fb90639d3b0a87634a45d308127443c38964530e916cd1f67adfb8d83326cbf3f7243c8d87eb6b956172eca789245f555bb08c8974ef855432f8be998023c452671ddb7d65d26e85702f25fb8cfe1713503d099c64af1ccd2aba83c0bbe32849178caa41c7ae4234a9721bb1a0cda949927e2562e370d96e2dbf04633481e2739bae045132e16f8c1477dfe7659ce88b228d416fdfd41e834be3a5056992e6175780e98ac489decc31eaabb0bd8524a59266e33e6ad1d25a37992222182fbc02421b14a62ae1dd346bd61ac0bec6f0db8f98bf8ca1430e093eeaea7f182d68078bb925cf61800cf48c0bcc2a0a9c9458f8e36614df1ccb4e44c1c6101edf5d8e679ae72e73b8ee01e4ac5a7696d6a43a8f5f2967533c350a6455c9e9ed2c336db9e0ae0d18568608add7c3046dd055eeb8a02e80789cd2991020cd30e74c0f7a17029d9c05658b1e960758c69fee659ae7c34c37e7f10e37f9c8dc080a373a7bc7cccf34b36106a810a242e079da3dbd80a72812c39179023c368d54f9aa4fe085c787883fecd2b7ad70dbac2af0c4b46122409b902fcf0da62cd3c2d6e6e5c9bee37ef70bb6312ade8abeb8c92fc7f2ef289be5ec2c4652d87e7c1198d59e49b17451c5fe647204c0fbf8fd40833c2d1c48a776c5f394c99d1d73f589545ad88564f6d634c61ba5b6f2fb6772833a009ed8c1d5507c72d21baf6ef23db86a9109a1e83295aea561b77e97efcf14e03480fea05f0c731e6ca611b7fc846960f6204ccede05f86c66339b6ab59cbd6791151b61c20a4c9be72cfde2bfe7497465019b3082dd9406dca8b4869c339c057602ea6713aa2fc52258e191990cebef5704b220e96f743f60e4e78daba8d6060127b5f5e08e2f5de11c5ca5195648ef9c7dd15dcdfd5e957aabb8a0076eb95ac3f5f6aebf4fae7b7190a44ba2d1fd6955afdbc51191c276415380a23480dc4957682707d8255e5b900000000000000003fcb1a0200000000c12ebb8630a8eb4368555e6e08fae2780deddd96e3ac5bb5c19826676ce57c2fcbdd001c24e619282fe64ed3644730d161ad95d2e2dd81f3d69f50778ca79a3f2608e25f61f71ea393d754e6d18e52e09c97eb49d0e62380cd969d935992b6ae000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006768624e7b8bc69fc552ac71715c30b3afc2487397c3d01aa679d4f51c0707d4dc36365b59c72dbf07084fcb1a7c4d634b1d383bbc43e44f380ccaf2fc4d1823dab01f2c99b46524d1bf1bff3ff1e79bb64fe0789a4957dbf29705e23ff78dcb5e5e3a6d255ad7fa38688bd59634cf1c456003f6250c0a41ae4baccff49be15f03243e9c3cb0e21315fccbb053c5e544cedef0174176547e087fe531a120fcecdc020838d7f2241ae6182e1be99eeae42972b12b50e85b25e1431ce05f6d62d802df0a01caa3addcbf7f99531075b4182e0b7b7488e0b5b2b6fb288c5585dcc2a9313ab3a8e4fbfce8428b69b78622ec2002a779a98268fa3a2cdd26665c1d1b20260803081fa75a963723a69896b9af32372b67bf7a78a0e7bbc13222a33e6049e4896203060691335d4f1756c5634c506c534a94b160bd5daaaad21a2076c611bfbc138e0312ae50d420557f76c1b6f8d70369f5bd3609c3fbfd6cc254bdef524394362bf6022f82fc2c730f8f2dfca23d5667d2f9063b550197c8a0a74a5eef5c6efb359c2802305b668c57c8c94bf04ad4385da083eb3fa4b55db8c4a64a1cdffe878ae2e8e6106c164add702397169dcd13eafecd612c371aacf328a5808a904ec8d3d851f1e9121a3a482da0304808b81ba46e3e4711b1e11984df8fd84aaeb4335955d710d7c21b4c95a903529b1c883206f9e46df6e57287b1441af9be2e2d990b904e3572722321b2d75a53bb55ad58f374848a3e684a0159494b673927f8dff0725880f783f55738bb68f48df2a4986037c00894a948abb288c6eeb548aca8b5589272e92cde8195e7dce2117d12f367380a9a5ba8a74d7cb4d8ff16367e5e773fd16da08c2e917bfee30c26024a22552e9a147e97a95af3f9179d85ef76e6614a625427812be9c630466814a91e2971a290d15ea7f4458c133ebe7cb6342e929acbe34176e278325f1cd33cf66d76491dc2c69815cee24ae81d183a156a1119cdd253799b60d5ccdca9e1c9558466307a7a32eabfe7f758a2e6fe240483af5d537317dcd22c9822b8ae2a968ce7e519e8b0b2875461d304a72c39652df4805b16b9e4f1523d91ba97489bf30fbad5ce5112ae09c1744559ed348b641d84ec8749548614de94b655053bf6794437b4aad47f7b2c9e7e970e5c20a6148c9045619e8dbc5bfafd72e5e0de9f00c51319056661713632a0721826f105aa86cfadbf3370f636ee02d5b9028081d97c31e839f8518f708c943caf18b64193bfecc543fd9ba569d243575ddb5900f8a029dc671f2aa13a071347bcffd16687254d4c2bc084e88140c5bbf45467c7f0e2cff1785d7e9a34a5d025360e2ddd4f7de215abfbe36c1b599b53e011bbb46f4682397637553a6e98814f31d06e57c5b7d53cad6d9774396bd042c56b3b5b727aaf560252a78c25d530d6adeb6f788f56b5caccfcdfc07d5485028f9f2e49b0287607889b441dd7230ffe2f81019c813f49f70afa9517a0dcace6b61bd41fc7b7583112fca822b160f75bbf107112364820973f4508900bb844b99fac477804c138a72294f81f4709f8c1b6bf862045ee7c926c375117d98c21f2552df031d143b5def145294e8f4a00ec19d5443556c9ad15368fd5f9603c099999fb6f3cc16de216b855f1d7ee7a1df24688ff9094836d62ace281c0cb606fb2b038e16a18e033b755ee4a95e35970402f1f272bf82531e689aa61c54957af2dcf69c0a477d56b217251ac004a371a604901d4f69cd6ca82bbdc5b5200de46d55bad8adcd31bb0758f9b6cc90a622f9af110086d376504e00deaa0ec5a66aa4d2daf9f20dd26261d695e30de80945f3ae28fd36e332294a84f438613433b8251056112a00e10c4025f43edf060048eab9133934009b7c437fb676c017215899e2e0623e2bb97d6e06d53b28980c5f2a2ca2f4dca27053c02fe636e3b0336b29d4dbb19c95afc0526093363f39d8a536d2f29ef4e2cee662d2358ce87f95420d7a15ac9282155e5a80ada04a51d3bf36a3ea3d00b0ecfc848b051104c1aa2ba1308ab2a2eeee7e6cb140ea9d43e6552b28be070d82aa4b53cc2a4489bd25f0f566a2b874ad8d3266590b7b694f9a911bab905cb0128c63b32549538d11bdd550e7187992a6f4b05130c3e57f787625b18deaca05031c6b261301e511eb2c3b3944cdd9be17bef6d71cf8609b44eac82846f68b6107a6102414c65cebeeabb1556807208c7afa374e2ba3be78a94cf9ba4e5eb886cf146faf2da8b5b6692cdbbb7d51096e4e499457b54d09e96679b2bcd2c63ae7acbe25d51982082a35633bfdb011e82fa86d9fd73e471255e0f1152b75b662f68a6896ca69e781ee9ce5eaf131b1bcef4dc6b5de910b80238b2f8fe2806485f25218428f4b2f00d84cb0c40428c5f70eae4049a54698f1cf16102", "ac", 2, -1620832175, 1537743641, "7ed8b974d506132abfaf276f32a5b957291857bd743ae39d0e63dc402e18c26c"], - ["fde3ee140402730f84162e5fddba3659e356cb47c63187e12cf7f1d12d9f1e23904256ce6b03000000085263525351000052549585ce8aab061224891cdd20951e108dd09e5129dff32dc7a709be30fc3415ade472c7000000000663655165ac5285f2888418a459030b153b689466b3e1ec2f94cf264763fc2bb54d6ea57d37c28e66b67f0300000005ac526a6565ffffffff0b14cb4dc7915830a58036454b3881bf2ea06148ef937d2156d4c3579c05ac320200000004536a63005765732902f293d0010000000004655352acb69e0a000000000005acac51006a0000000001609b2b010000000000000000000000001e3d6614181be67004594b0922b114b2ec0a8d6bd1a14d51540a5522b6c09bf119a895b33169c8b84551a639481a36f6e269b74e1bfdff36ad50ee43815be373a681c5f120b30157a01f6aa1efd05aa00d356171c87b3a9c4de56d8bc65c8dd7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006437824a6e9085af027dab8ee0567f04e77c6cdc30889967837be0523230b26ba171fe7ecd40334b272b3d186c1f00f4f71029b4b812f7992b2c914178885b4690d5c7b16f5db634045b11ab547c221733d66eceeebc13e171fc01d626b285d0844a30dec75215b23f792682dbe450845c52dadf0897a98cae8cb1f72cda1c27022f12c806dfcdb1639973b2e759ffabfac88f663d60f86b724f10ce73dd76d6f40325157e7a3040dd817f100a2e2e9db3ed5aa654526e71156019fb0c22d43a6ab00b00badbdaa55713e9f2d14c10ad32796a16bf3097faade305a60a7613426335765209fa3012ac0b9cbe60a3945e5b297d05c22071f86ff727d2decdb6e47e7cc70204d4983dcab54ceb42343887b618cdec407c14ed74685bb3282230aff6cb9c0f022fbe53db78fa1543fad3ba20424e8fb3360519f23851bd3652f9a2e13e99377702042eb1cdb26c9dcb56b67390d0eca8b40b86446ecc20372651060a525a74ecd6020b8604de3635588926ef73cdced33a3bb133bafb0de514ab9e4dd15a8432bce802026755663905455ffa1688367b5c71805e3a8fef87431bee0cc445cc678d4260a3519ece27a6b2a4d3b223e2d0705c8f49dfc0fd141f430fe7946b5c131f0d2d83dc09ff8c81c27072996d795def73b7a9a5485da352780f7cb5a2bbfa20352e2e7c196b1a21148fa4ded7ab4e638b462ae874bb232632c4f2ed8e296140d74a9e1293df95842a674e1597463c3b47b9e0984b7eb28205758f553abcb1e8381ab1a249f7067618c7827cd720652a96f113ffd2f9dadf880f7c014725740dd31dfa2a8f66612841d596e6a0c4755c5c7f9162f1cf5c3ae759e4efe1f21f7515a1297c0604a45eb65ca1196b5a49626933926509363202e04649a3ad3138a267ea498fef1c1a7d501a9226a9366a66fcf9245d3fbff25c8f7d6e94b3e19df11365b1350d70a87b242e13de8083e7f894aca5ef25992c9723ecc42fbf6426e3984d1cab16d56d2c0e32f572b5af12887666143780f4f328eefab35bb8df4567a5019816129125d7ee1b2eb5bcd676f7234937d024bb9e389b2c07b9aad2e2e4349be2ae96ab994f89b071ea765bb3a2ac45ccf0b06a86205cc45e923f4fd5e40a04c177f4219d843293417a5bde85e3f260f2f8c6a48930a2bb8c587a52abd823f02626ce4151e0e3a0d462caddefc1888c5388af2da2bc3a0168438224d13c87d1cb098656b158794bdc88373f91beed5bcd973dff9346b453c0b8be24ed3ff1c3239f2b37d32bf0c2fd910ed6e21db5538c99ccd43bff9347bc111ea0c854e1041c95b40db2e3200dc2e8b7e02d88ebd04846dbefce45f1e26ef5e8b5f2ffbeb49df7391deb88a3ec5d78b463321ea23a38ec16d204dc5da00bd9659addb36a708f1ae7334ef43a4e5fdf753d4b77bdb4edde19b516bf1284a7aabb191a36af50a53e35063b24fec031253527f86110d56404460bf6f5ed86f785e7f11345c026f694f227259eef9059f87fac5fe9e240411a1d6772d93dd2843a7d0e612f4516e1cfcf6abc71c5758bb04ba9eeb9c196f02f040adae3196f5877da9848ef80ac9dd3d922befc29d8d4ab32e322f4b74f3d9a29d1c1115e8ef3e31798cadebdac323307a639ff20f961e14276aecbcd76733721e36336e386997227a9d28b8a88263bc2990374df1ce25851f37a42e6e6e949c58c43e53a54489f3a3f4a0544bc287350da9390fec2464f66f8812fbce2857c3b71fcde16e4ac93c333c7652d24da3f50f9e6219930047f26be764750ca6d04f467a9964f5e4cb440532b9336693b7a102381fd7a544a77681f599b841d1d6f141b5eb5b73638dee3b4299f1d62968aa512bb039277c53f8df3cbc7444af2930f5ff47d7b926ecef7c31675119b98ad1efcb7c26e4116a6ae0e520726832e3f3253ed7f04d9d08d30eae37abfca46cc3cf9b039762d835c6682507587a3047c3c4c1f66d2f899fb0a8daac16be0cd372e806dfe6dd7b691f162699aa7228879999ffe681ea07db9cbb55c20f5dc0e67a066500abf6f3b264cbc6bc57f571ad6a78a8bea826b8383847cf24dbab241e985f9497ba8037f2061e139279b434bc2ca800dbd724403113ef6c6f9d490b2ea36eb1b139c526624b7878bb2034d634be0f6b5bba7c4ee7189b1caca8b81aa0a469b84160d1a74b8e187c28a532c0dc190c2a1ec2f7712d8d3398dc03a9309ebdb2df16c8d252ad1d7d894b674125fb459bb2bd21e7acdcefb28d23bfdd107bec4bf80399cb8acb148d7c451d9644a351b4795ac21a3e85431c9ee8d006f255c6b3fad59342fcddfc6e194721f865521b97eac2fa27d37eccd12d78c5f8ead1c94efc313e502931263bd32dd1c74b03bf6cb2e37e93c675eda333a6f9b504a56bf7853bb41a684beb7142ed08f7ff202", "6a006a53510051", 2, -483959987, 1537743641, "a9b2a0dedb0b1d4ff7ae9491fce26ef30307bb3f246b5ea79e1ef62d4b9e399d"], - ["4872f0350292399d042bc32193787c6e2a2a11c2e7e2113fa7c6c98362ca450408884863f70100000005526a656aac3807a21e01c4245edf5245acb9c3c3b48c1f8efe63a7a05a811311c471810b7c8983557602000000026365ffffffff028aed760300000000076553005200530054d4d80000000000096500655363536565006835a9aa02da10e102000000000000000000000000a133e45bcb1781bca4355726551e01236372bae534bda9c44c6677e47a1d67bcaacbebbb53a7e1f0518d857211cae16e15288c7ce036cf84c23a4521ce90adde1b4c66244408816ba142b5f15e07ac66b861de702fd501d168dfe1af0e498e38000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004efbb8e9794110d5865bdd92a89181be37327f56b7e7d88a8fdf6cb64bdec3c4d09787f39e6345015b1d90f797ac1e32d723ecc48ceb2366ea0885936bc0e5b470b166fd8e06ffa5e001af039e23eb37bfcf95b08348c34bc645f39609cd7899e34ecf36c0efb8b1112d8d2d0ed7f3f558aad3dd353e2b461452f8bda064fff70200504b32e01b2413f6ad84f49abdaa6cfad8be4279822877e99afd26a144153e0311e49772f6dc579acab730306641060ea00666345059bd2b823d46c7336467ab0b0351618ce1b4b9494328b9ccd3e847363f4d7fc1d83abee7d4bd3d4af0033c0cf6a79772f16daec270b9eead3172383b1eb95c437ed19b9480ceca5d7a88f77c02184b2a201f706f1405dfeb9710158e1cd975847148fb52e9125e1decf2699250021516b3d39437af9e424a06d157913be6270bf993dd199ff2f0426c393853d76d031bf333c0218d4956aaa4de4a0f3dc9e62082d215c7657c8ff29d2b797dc9aeff032b028ee7be73d1df59782ef7ed13d8b0f792fc12ff2f8379c6db5cecfed2e91303025c10608a373ee98decc8346c4f3ed1e80617f46ca6e47a2b2615449917bb9f11e43909235f6ee913bbf50737a32c7fa11828c4a8819a8fb4c5baf1297221e2b32f72cb9c2adb76385f53c327e96bbec7fe5cc1daf41d9d3cbcea1d5e118b45b2444a326e14f6cc251869f4f37911df55de4c4e6ee5506b24c5c9788c047042c323da6f58c7b38ed3183c66a2f22b8bbdb9e494571ee05ce93b6305bdfa248e1dd0ba5c278768dd15f136c7e1e30ab464833d8370f8f74aad42228c2b0d1a3aa2d3981fb154c8e56f31a9ec5cdd9de577054a6de2d8eace70d41fcecfe399655c30ad7f3d9398e580938639119ebd0fb8232c76d83bbd758967a6890da79878ba1d64d445f0920b4adc68265dad5942a184039a755af6d7fcb8c59a840f6f25fc36af383a1411564360d214331d4cfdeea9de9f1295a0bc77cce14cabb686647b912d44339e322de7a28efe399e4dc0bcc2de733e3db6dc757e8d5eb38c36fb0abfc2a9e42c8ef1ea2e2383f2ca3a80555dba312ddc1d2c848acd3fd66ed3c0be0afdf83f22324ac950ab0af1df290d215145e86a53d6f690b8853363c342f6b34ec0bc054dc949a2999d59e310977e386d08d215df4e48d0f716dde1acaf988b1e318f18686304d42d0f62c54fc69f8ff248e321b525bca709651545d7cc07f37a7a2fb0abed4296d045e82d3b14734cbb0625c340e76635630d206aa6d9ae944f163231754cbf08edce4a06db93d52bbbb74ea2b97d91f873af03af6f25204fe515dba93064bd54719f46f43b17d508fddb674593baa03b51fa66aba1cd169ec9f97f6c1f999e247d5095db41e9f61b91e640cb33d60de0cebc93542ddf0b0de1bd487878339b62a6e51e7fa4c79a08f400b6e2fbb9ec6737d903848156dce4e5decdd0f15c00de12c33f5ab78b18223a3818463ae013d0a61c878d9a86bc1031971998fcdc5bdce89cfe6ebb17583e2408d121a945bcb0a15d8ab2d3b9f464ce35504bde8937ed47efdf410d65c097e66b7d5c3b98397587369a119a7b424b9f56c12dd79bfef8d87a18559935c9b5981bd52c340b5fcd80b2939decab4b468ccb192d044a9c33a631896b8a52c4014676d99032bffa8dce97d3dbc899b7c472b173ad8f3d57d8cb4e672705b30b50a0f1bde00493862d84855b2c43bad4cb82308c5b6c0d6aa65b1550b54423e0f252c605b8770684df0644ad4fc78ffed9a45085c75ad3803ef68bb720a2bafcf628b93dd69d57b4cbcd7df7ca3e601053e29e8be180aed7409a4cd19ca40c915b55986ec0c47ab9698a27842be339474fb4ee1b945859492eff907019e43a27aae8118159c220a12ce72d2204e6489eb03639f56c5a6c3e9f8f3faed1c969015d000da5a3be4fd339066717b7ee8cc827242dcdb9e49c7223036f285ec0d1b86e5d579868606a5aae5fcd63d7cfdc5680d0a0a2ccae916832cb565abd29703452693cabc1f6be85957cb4351574330d1306f9c7f2806eef39454db347cd3a4764f91dca2b2d8833d808c8a24ca11c4fc0f1004d9d536ce5d94cab72f1eb7d28ceadb7d5862691e2a29c791ee25d75519e49ec7975862b1fe42a418df7f7e5db44cb4e1d32c1ace6544ff2471a02245d7e7d1f377099b443c56d8a142a50c88adaffcffff6ecfe42340c07297a963f2663edc023492d886f7caffeafdb0963489ab17c6bfc3bee05832f40e92bbcb826e08d5de5736670ac3efc1c3bf828386915c9a853560100000000000000000000000058a4f59859672531e690cd171100fb72aab561b07ba168f7b0f1c30b8d101cd2e744ea3dac5218278371e085060f299b9ee20a982f592e157bee3494a8014ba32a49b3176bc411a04555ca084e54654479a0ce53df78eb1e41c7735a0e46b4a200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000521bccd3fdf1928d0c2b3680619f17e2210bc549e9dfbe5c8e60f664d285b17495c9780509d7ba5bc28b53d0f81a051542b70f3359cdbb2201468dd945acd251bb4a5e0bf72f7685e8d63dc6c361e9b709ce8ffa6b265290c104cfb13fc5433e6d9f1644707ab461a570e4ab658ce399124ebd850a409bcd2415904e5ec90f3e0322eaf2e5c8dcc8833cfc9e81f77b5aa1a48724cabbfcf424845d036561991e84031c74b5917e70130e844ffdf32715f5eedc982c02e65fa486dd91bd5da3ab789a0b065dca42c26c55610713cc4ff859b2aff39852464e8084250a9e1f4feccdc38ea4965a005a1d0f2978a3ee213049a4a10fc792cdd4aef29a9dd12ee36a0fddbc030a801d6c66433358722889684361882caafaa9bcb168df03be3ed350b4f270f3031eda5d237247528ba965854294c0499360656e2467db10740d22a9aa03b8ccb9030fd03fdca76082b314905dd2264f2f99f2b3e212c764a51436e6fd5f72040edc0327fcd08017937f5684d1be7ae336aacbedceac7eb731d3f361073281648df1ec030430b3080f0add10666057d176a4cfb835cdad9bf8088d9177f789af19b2a63ecf53e1068e00da25485443bc3a120ac9f02067e995bdb2920ee165a1c611263d3602a5329e86af65ed8d62bab67684b570b1b57f0bbabeac4201b86a9a32fe1b69efc8629c15d4fcc710783c9185fe310686c74b605b15c1f86237389b6e53c6bb6463c729de6f6a6e30315c828b7839e2f9d1a5ed4ecc9e167b7e653216c7789106db351ca2b67bc680e9a876ae2f9242b6172d1a76b7342e7a5749901f95096616f071241b784249dc9c85fe0b070db01da07d2259d3b237b5b5a7c60099fa6c66311516aeb255e8b16ea9c3ce21b94fe6b23e93cca8f7164c77153170f482844ce443396d8684c1f745a727a986a6d3311bc3efc6410c33726771fe78c39861f2e96305ec256161d1740a45a17d3e3491cbfb99fa09f2a2b70447653df62ec7922d74ef8e345c82f242ed62971a5f44e7e7d61faab0c8f5804f0afacf67102837b0950c7e504e461628934a8ca0310178269a277f3ff89e059f7fa83f124365250d58fbdf3f7a1256676215267e70217335586b77e0a5d8d5952ebb2359af895f1dd7c7725d0b8fe2c83c4af2958314ca1207f659b86d3fe96ebb5790f028ccd02661f65eb382fb7043f28322da3cbbde337d7c17011e2f8d5c6816daec016ffa6db7ea3b56ee47879bf001f0caad9357c4402512ac9460395c6a7516dd1337b4472bbe38738266979904bf3cbf2bd5372e3f96300788b123d163938e6215fb7448937251ff7205bf335f875c99a318cd3872ff1aae594da6a7720015219c849305f673f52e0ac779be7a811884985879af13c8bbfa75a3e44b218c7b832507a3963d1013e069e45f6287722bbce70025f74cc45a67969d0afcb5feaa714019208622759dfb574fd266fc3ed2046b78eb9ad7fb9072ecd69f4eb4a8ec5ddfcc0cd1d94ef9e6b66cc4034a0de3e672cc4ce006d92a621d9d4d8700662ac6263fc8a9b4b1e87b3eeea73b2bac8d57375e69769dc34f9240204933f0ffcd5189151c8941f76f5fb63dd141f962c803cd5c863ed73002dd6d53544e9ae16336fe994822d6346b630190173ce1069472e4b2f086325b438d4cd46318cf218ab6d31ebc136f44b7177b489e1a357b20ca2c0bb3ac3900167dc8675b09a2d80e1b77f875d23c95793eeb0f18cd5ca753cc4f09d6048989c08b82389cb38701537fcdf8075e198dbf2f0ba47b86e459e353c8d540eb6211a48c47d8668f7bb4a59c88fd7e51e6f235897153a84d0cc84352ce39b85e7b66e956c8a34d46d201cf11499263526b814768adc7debeec1237610cae19d1d7c8c9768b95f36d36c4313fa984d3480e23d82863e6ec43d9b23b41a60c05d4dbf427ff8f8dc10c695c8053c61eb2a40a7ff08ca91085ad0a50e6a43d1eff06ec45d5249f6f04a592ceb54e1ec6eda19eda4ac8c4965b488574acdb4b91a2ec4aa2a3c5f856726a4679f07bbfc8ccc71d5f4216b1429bc7eb96819a7cb3a6ced0772723f42b4090adab6f142e0ea8d096c3a60f63b2f7a69ecfe44ab13ca6da1100cbbd2fcbe5fe10a50eee7050de02d00e9c6fe0489a88311c0a9533cee8a67e14d655e1ddabcffd87c15ee4f6551f0e4edf548bc6d4e6cd2d7cb367969c15770b78f5d39173ae31f0cb863d4a8f932025c90d023164a48602f5b92443fe97465e201aaf26565c4d752e077ae5c3debb2e6d105c3446278dae7a2766288d23305586de3f88439dd308d6b0e2fd9a9df74051efddec231f57679e1d9f0b424bb22f77e6eb2a1fd2ee977087c3b5252c614157b16ec1cc1d7314057172f6c7bacc99fa14ab2a6b2175da47408ca661ff917ad55a39aede0ecb41eaf151130a", "006a65acac65", 0, -2122674911, 1537743641, "31026fee894184a8d6e7d2ed23c230a353077ddf507b110c8e07632caa4e59cc"], - ["f0990f1c03782e30e8f8f3cc4d6e09a46554340263de2b11b9fb0f2833a592baa0f10fb0fc02000000080051ac5300acac51b805085b0eb392130a272713a3cb4f3fb1d9e247e0708e652c2dfe00f08ecfed35d99906000000000453ac6aacffffffffc14c20b19a4e1f526931984198490b66d081efb6a97f8e22bb3f5c0d3d9786950100000009006aac6553acac536affffffff029739d0010000000005536300655209eda903000000000000000000020000000000000000c3976d030000000005561c7a8ac64b029002d7ca8d788a8df0d600ee6d2c58782a34c1dc3b662034499c72adb4151b1fc27e02006354f17b295e37c723a5dbf04425fcf5f626fefd82c4482478d4b8436d220cd18cc89e7b09ab5049c504f936457ad30233f5a28a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028022f3329f562e5f52b6bdb0987076eb085a0d8319df0b42a57fc77693e5e48287c8721798295516afed8aea707a101be8790453212078e0f092632176f899dfc2f739e25abe3a46a0d514441208df99e62058af9cb3c38dc8cb1a12cf57c3561d44c9e27110529655b6c58624a84925385f7e146e80b87a4f519a75bc85a1b020bf00506e3e6eb6dd5cca33bd58f8b0d9b6d316550daef8a150e73c56a3f944002217fa4fdf4a75d2da0be42f6fab2a5b3ac3a97e593ae9505c14d705f46859b900b07a506d0e77c68c74f166c43f0053acfbc5f86ccca5b1c50e012d3f3415512322e7c5feda675bfae68cdac7ed4c5a22cf159c6f28722ad62859f5459c6093360021804d0502fd60609fd39d8812345c1a6663a6b637754e9970dea1feac91db9ef031f58b94805e45ddb88f8a9a6aa56e71bb0c5cf6b91499008c558e48a1190733f021d8171ee83ce1e416339f77ae723bf4c98241123a969e131d380348d1d47f63102304066fe798ddd1b5b1d36b3e2798c121e979e3392bc011de20d6337e2c8918b022d7f2d24419007ff2ad5e5678c0f839351d304043317c3aafe1937694559e79ed7e8c7f0629693ca744dc1a1f528dac1137c34c37b87d2a797f30e34d41b391379a5cb87cc47a95dae3c4cae701208c460b7a71fc4d2868ba81dc0c4f09b7ad6eddb4838961dfe5781f71e7b44b82c227907b32d0180e9c140bf733c96c6cbc7446b37be1c886cf405f0c890db8379ce8091190ae9cd7fd3d972462896261fa1067ad85666939a876b5ece69204c19e6839c3ac7e54a5ffb9853bf5dc59179ec7135f718f599a8d70fdcf5cfa4e9213aed3d932e2e75a319458e246b2996062d73592eb8a777283e570ef1b84e4bec39417f24de0f21ed97fbb9f7502bbc8e01d5180b7e26ab7d41fdfe60675adec476b9a114a36dda5d6d311bf35f9bff530881d6feb096ed80a19ddd698daa30540892bbbeb874e79a1993e5b52e502645f28dfe7dfd5698e5f8b11a23b11fcf084655e4026eecdc3f40222030003cbb82759d97d3cad8a387646b8e993ce5da03215fafc869a1c903bb36aeb50475a3b43b12ccb24ceb92e1b26086d965eeb3f5b4ba906a25b6cc4f18fe64179982926d9f02aad8b3fce301a442513317107394f4025a46e14e774412fede14bd7749e964e1c1938a92ad1b2e7f04b8de177a41ec179da85f64675636e6bbe2d768e636f1d338327c90dae7c80bcbdcdba996811e9ba2ed1d2891d7cfe0c8a6cf6c72e27d9476b6e84febe40b8a1d297eee034d2ab8e21a737864ebfe3b7338eae576ad384cfca1515734cc43c452ed06806af5db531ba3d24bce6a90879b6f68d636e68b140f29b9cd81734baedfce8b209047d8f04e63ba7a4705b5d9c1c42a82b6763d5072a97115f05e12ecf21625c9a4cfd66e3972f987c2b069f9188cf6482b2dca242d42e5377cc8006631bef95b3b5e5f44eb3bc2d2c83a86b3830eaca65d18f4467ce607cda286a7d16477eeb8071f2aa329ebd8218cb6a007826d68b1cb28d6e1e0c4ee760b8ae000b0f97bd820dbd93d5056352c18f3c368f0d39fccb8945820fffbbc53f5a39b9959545c0179653f41f644fbab7e4fa60f059043321adab105dbeb4219d4218d247a54a678152d637acb7c8e367dfde56da3038956d9a0d3b1ac9bc5317f2c09b5555163efe7af98b054c2a71a368f3f2e30613e10719f981458edbd1920c17f92e979b287a672e57e2e9f640efd847c22c695cd0e242fa5448af8224e743b6406ff97aaf1442df4784ee2459beea1a1591600f518f823e9890b347a9bef12eb7badea8cbab56d8cab264a2e2c69fe31a13f4b567c6edb3c84627d2e0a99ea3065910d0f2fee77c21b58d4047fd4c2279fd99be5b8a47ae180df3f6633006b6e5296202297da673c1028b19466b7e30cabdde635a90889bdce479043b51e7d35b3fe93f0dfdf39005e8f3ac3fa53073af36a3b9e58ec63be31006ac52fe5773bac3659adc013797fde322d8612e8116af2073d64b74d38b601a7c23027f6315d5438772b04e93ef476a7aa19813fb5cd094a9d37dc9e1acec12f533ddef230f6e48f1a3ef83038f4630c60c4bc5cc844ca902e95d86e71c9ff559b33c06ec80b4269f57c2965786b946f0269498bba770d96d4a8941decac73d11c2154acf15a1d76e9c7bf3146307951fb5a37400577e92d7af85b92abe22428ac47a5c75e00f957736b5bb5b0c81a2a6ad38c86b6093e542f3af1659d7cd1a27eda50d7dc6174c8d3d8e0dd558c7620b6a27a05000000000000000000000000e515cafcdfe74679b718cae4224da101b1024006d6ca724b114a759ba27d35185702656149687dd38bd13cb9558a242b7720ea97d46c64004121183b191cc5c6c2a1f8f0a01efa806e1913bcf1b3df912ffa0493db4a4dc839002473fe7b987800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cc3d347cafb9846bf90a935988d763cb1617f3e115714190ceb5840cc3d28971cca826a4d934817fae5ad5d89e79e523050c6a03daa1ed441cd854620d4ddeef6a93e2acca50d16819fa6a912342301a81b0318072a879a43ff3af7cfda7a783699f2844423dc303118623f0a8dcb28600e296e00185367344974c16e3da0d55021ce8e11ed3f40e19d8a6981162cfc666db8c0c9b0c870e4cb6072159ef9394030215e8687917d87053ba1acdf1905b055e77cba38f5a0ca488f18238c041599b540b01e6c6e034ad630d6d8270a7196090fd9c45855c88b3970e142cf104e03314ab455fa377fb9d2e113b738c99fac38e7fd034aacec4552fca19a112fcc9795954030522099337726ee24ad4ccf101c671110ba4c349ede83c5478da74576a2c4e4f020dcd41004548a53e753186f77de1564c3d7715be71b2ef18b099d7963f49301d030e7e10ba4d99efbf206b865ec90742f4ee07ed26a77fab5718c09b63a37c8e9a02011048d00a6f1161b20e643d81b419942e182feee07dfae1868c07c4b266fc76031822b67a042afeff22dbb66753e07c925c2bb07d8ee7471eb6476657753c4be53acc16413f86c513b6906bc8e5fef6086ba3a6b8aa7c71383f6f255b96c5ad0ded892e6eac8af1ff16c104934e1ca25bad9ab6befa9fbd85bfd8551bf5d0afacd2715b9d1bc3db4bb34ddce5de79ee1eefba07a7f1695e16516aa982df830e5b74d0ea573ffbcca32c61d8dfd65c50f09b66419ab0380477b09cebac9b1dd99025a9ba33c4b6f5bbb637cee7340b2c1dc6530052db80a5c807bdded3d1831813d7c2562e9e284ca3c1ecd64075c34d3dd1b4662e5b2d4d0dfad51aa435b88b9aafa8feed5a62905549e0f41edb7ea716abf09b42a809a6ea10e8fab4edb47042b3c03793fb9903778451a145d07b4a07ce1051a09d374f6d99e5666c4db9338618b67e68eec1de3cd13dc6e95e23a680f743fd731251bbae33cc4dff83525a00bff3fc22c467edfa98728c7e30e199dc2a75f51d943c3345de7cefa120224183361c46d3d8e1e9175558775c1e29f2144f1a7e981d43a1686c9f9ab12b9ac636a605e91ea2dbaaca8f6d210ad8326749bbf1a3cb48a9b9d52ce01e8b63dd7b523df49a0c9e83f0e663cf3f4093117668ea204deb8026292459825000a228a5b05d9b2e66fdccd49795c4915fa4a513a91700797ea899d01ea479925abce7f9db6fdf5d5b28c6613a11c986ac94f4f22e64ab325d367b8f6e9141d6b2f95644b0834ad5a1028dcdcf02e32cf495ae8eceee455439935a8ca0d157787653e7e17aaa8236785996cccd2c9daf24a0da1cc54fbee06591339d921932b1bc01eb31c2cf1a9d7db835539cde1e3567974add69ca274a62adb1b21cd7269e67256c01ea32d70fc1823b4dbc65c7323b327c640b57c455e6b1b68963a46994d2fb54143993647b4fed5d24513de5be9500d0777e008884512cca922a692a56a406166c0e9b6891e630c7ca9f99437dde56cb1d0f06b6447d1bdd780a6e1c5a72bb3d896be73cdad932d25dc438292c935f8874a7d3b9f04ff1299c1991004d98c2f1338cbc502579120a92f141df29341939d5662cc994b3486c951cb9abf28ddb9b88b4850a19f460136311eaf96fb56f08a46998889e08a07909583230adf24c007206a48a5af8d25ef8e6262a75bb30e3220e0f20b42b75cc3990751a4fa52c4efce18154f90abaaa8a31192a760b44571f6f0268db459e927f392a8f6265fd0b2b85eae84e273ae7c466716b5752e6999a3b153651e88b2e799f269937d23a2c624b44531d17a9d7d16a686758cd094ff8f7cf20842bb0bcbee26f3461e1a2cd92972cb0b523eff3a455397ad4ffc1bd97610470051165194444397abb81a126942a1546b87a051d78268debc35e642497a849bcb581cb2944d2e9210c0a29ded86390c98fd08887fa013586ff9f321a82ec19e3c332eb3cf2d7b67efc86ac6db1e4e884b809ebccffed5938390d2b4b057c79105bdd107f2c7ad95b6ebaeba5f4479bf49dd6eaed325d80e80e1719ddc6f7ca221e17ab763349bd3507e67f835ec682e25e16550c3edfa27a92e55fd1e46e93b150bcf6b7d36bc01f8cc60927fa3b6c27d50a5a606391f8ccc87a169b7194a3f4160f4e574157817cc5a36849f9eaf04b349df7402255f185f9d73c82c0e35471852532da5e93db69224e630826b4bacb3f2365b619a84be0e8a2f95cafa203d0293fca081584db63929abfefa57c212d82f91a2a13f5a8fc56638a976187fb765b04ea0665deeae0464f0d1b2216abe66ad46e10639f861fadccc138b50beacd3851692e665129810317c1491ea288cf06c8461f2eacb7c995692450d1f7f9ef091e34626537708d684f28ff9d429f1fbfaf6ebab6f44fbaf1e97cc4a2eadf06", "6565515351ac5165", 0, -1205068358, 0, "bc2bac6591de289c59b6000db54cd45427fd87a20855fa9acdc1f536d3f3af26"], - ["8de6983302ea090b2e59d092c3e451816601845b9e12615f7d97d34fd12d8e2b845b55161f02000000095353656a52536365ac8fbd957781cd98959cfdfbb672d73a766a83ea2b84731d81e19e25fffb85f3e3caae279401000000076a656aac000063ffffffff01374800010000000008ac516551530065650000000000", "52515263", 0, -148245260, 1537743641, "99d4346d2f35912adb3247035176c907862587930b656c051058381b15112c8f"], - ["030000807082c40304406a02b28bf928d8baed23b44bf472741f892f39946e4ce03f2202ed4c742caf010000000463656a6af5895be723bef557582b6256d05cd55b1aef62bd11617b3198b9a674182826e80166c4a8000000000651ac63535253bfd863e550fdd7b90712211e02752ccb0fd3bfb706a61134dfd0ad62d0fd46d6ff5479cb03000000055152516a6affffffffca0781f0d1eadc990afae038303f5e87ffb67141e8e976fb6af38f7e1df57922030000000165ffffffff0444a76700000000000452ac6a528be21404000000000151516f7f0500000000096553acac51ac00525374b4cd010000000004526aac52c5bfde81000000000200000000000000007e2dac0400000000193480a420fe022387e83783ddbe04fea82046495d4560946d5a1ad8c07edc9f3d2a42a549724e26059508a956d08dd38640254b4adfac68b0e87025c653d27070aca492b5d2e7d79598a75f4260e435eecd67f3821be44f9684c08a512d8f9b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009742df9d0f5e2d9005119ba4c3f61f507d6b243ff6fe1ddbccaa1ddf118314635f7a4b9d5a0a975fddac0497c41ec3032fa51bb4de6da0980ebec791cea9983020df597b1c7cadac541518707cbcbc31ebc840936cb9b8bb883c7b8546e5dcaaf45c70cf50291512ea2d97e1d040e28ee5467a632764ab5288fa804c31e5dfb1030051357e23f60ccc5b793a665671a6c5c76041c82406574b51dfd0bb8b488e2b030e3db0dcab1c2c7aef5b4f29525f7a62a3703992e4fecd5dc43b4029051b953e0a0455171a0b7a77db41c177ae316c2e2b4118a05f02aa672d69ec14086af8ea8a418a671f1f9df769a2e666b6573fa31d06a9fed32c0a30c0cf2e2d34ece5b2730311b739b88629e3012a07ad7f59678f3288e1a4dc58dd836f159d8568c76d96f302230a71a533ba1e786838d6fe01ceec897ef429c4763b44acb2a7983c7fcb42780215a2dce5f52fb9108aed3ec04aab3248516491fb68ddd6c825ac38983c99032f022e65198db3c5be31df8566e6cf4d719a9e81a361b25fe090ec272b7c27c56ded031d87bd32a3dd53cf494731b00a46c03c7f7e0c4f3bf7022e3b556d3946736609e7c876dbcd6ea717de902b97b3bba9586c7b3c799355ea0bb0846f25ead7de0718803f7bfe23a1fa9c55db5daf6dfa9b292e781f554d59e8215fe7c13bb717f2ff37056c051e1b764c348d601c0721a1eea1e44b5f6c0b292e6fe94f6a2654c6087690b3ded4cc1a0e50b05e7115073cbefd873cfabc82e12ea3e66a36a93402317974e825d25f3372c4600bfe0348ebdd36be980ec04f79aceec1277801a81bab3dc7569e55e2e255204c8ce6fa42d5ab5bacecb00145d1bcaea1a886c57287358de06be830736acf7557b72083cb443b31799ab53ff92013b54c60b69fe0f94395dcd7fd2fdb52cb7460076c14fcaca08a3fab77ad95bef0961c364aa0e0b693aa7010235c7894408b3e44908b1fda882531ba94bcfd11debb740ae0f99e146af059d280e964baebdaa26081d99d1c1095e09414d27619df2e7627f92b6ecc94358609c94bcdbec989b110bc67f3094137faf0c568b6b2f8038aecdc5b28c90f4a938b77f3bfc2c529fa61312c1bc5da983ae7db8ee8bcfe16de89a983ec33b851caca9dc3ff6919d2291d12b1dfb99cee1b172bf34eb6a3ba6d7d7899d22e1d68fa1a4dc6468d1597b95c3539b4d9498efdf8c19f95dcd68c5b305b7c03b8406d1c63dbb01f44fccb6b05cd2fc01dbd4d43d6501cc1635e039b992dc3a3df290ba099a1e45a5871fc68659957b6876f126ccbfd9aaff7153655d18f140335ea8de2cdec708a2cffcd774c93eb18c9153ceed76ba3b0ac5bacc289de186dd3de741d6d09318d8931d1186d55a8816ec1b1371053792d0b22907147750f39f16c326ef575f7554d79022d92075e302148a52e9219d9907c102333ecc2d864017e7ccc4b6d4b851c9a9ab09c559147aded904817076d0153b286839eaecc1baaea5e22b39670f8e575e8fafa35e5bbd22af7b3e98daa6c907bec49b88468a675c1e8b2f71133f961f50b72e613634de78838e0da8ed73ecc7120a033c25ca0615bc0a6a5664fb4301ec30b53eb5b239db7dcb49ad9d4ceaf409282704595b2fbe72aef37909c67fc465c7ff9b57bf59a11e8496a6139315bb85004481c1a068ceed39bf665ee105489eacdfe2498b88b83a3eb96bdd1ef033ec78b7c380adaa3cc68e85326a7a6b78c484a9a146e4221d4723610db67965965fc963a3c604a5b378cf8977bc8f592f14052638742b111963387d1dbece348cfd7cf1f6b60bf227048848040b6ddcd34289d72328393b7f3c9609e23ad726550097ddbe5045193a6885fec676d40002b1ffe3a6f9c1eb4e8a4e14bc48adb431e0a7866b46795bfa8f5777a11f4059da112945a24673e38aa79a026f5fe97ae343f274ba791c101836928fb7047252b0d3ab529e346d2f9ed508204bf8718ea141042d12633b5a402fd4df3aa6c2e24e05b5dda2724c7eb7fb16d7a278c209af3fed789f1f91b718f2ab60f25465f7fe0533b3a4e42a77fb76e91751de9e78ea08ada20831a79e5cb4b5b0a34e45af05dd15f043cfce607679ac98e159a7d52b9e75d61b9e34ff926c40b3d2d9ad37219e1c101a5e77bbcf258612e8a546cc053a81f7a9171aca64fab1c3613dda44b50aa8d34bc67556e182490f5ef93bb3523f74acbd8a21b253297935079198e9879fb56b15bcb6a1ec2ea27ba21da67ab51fee84007d3c09669627a5b7c3b899f99094317ac4b1b333c5a00000000000000007514cd000000000036e5ac16219452ce30b6c93329c20446d71ce1ca77c9df1446b8369cd156da52152dac6f5c63f170b02f38c3efa592664c54809e4e03f632f6cd920d8a9142f330ce61966c70442ed4508c05e7402a7d04567f4eca8741a05f9ced06a8a6f6270000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070ae4ecb527516ec30886f85eb531a79fd0cfe9bea09feb12009fc45b2732dd1f733eff93b682c5ac61ee94367f81a049b2f74ed416bad32d60eb59f2d961763dc25104f271b9eb9e1f052b95761daab58de008c786b1d29c841144a2614a13f899166a7bee56caa92927778b4023d80c6b3aed95dd34a6053a53e47799e048a021697c7bdc30264d3f501f1cab47900bc76a98258048b5f66b61bc897a8597eec0316945045bd017788d9f3bcbbd392b95942b6890c53d2d9d7a89640049aaa4f180b0512cdd0251ba263adbb57f077b93beaf39e5280f3022d59f4d5dea8973198e75dba4ddc7d8f5d74462b09aeb17519753dbf09f8fa81d8629608f96fcd2f12e4020d65dd8bb539d1d4c105b75f376bba0a61406576ad8350f1fde00e2a3f10aa2f022249a33f9de28a427c8de5461e9d40ae95d3de927404b64938b61c99533ad9770228debbecb970c7e027c2bbe79588c1e03f763883b0f70c51de276b61a1fcd9c80302ba6489b150621ec9ad4e3dc9cbe2126ce368e737b8c3a3bea5a0a7c57f773d022664c1d02dcb594bcc280a37b9134b6626e955dd85febd0f4cb0cd449dc50d800c9d09e3f2ec252b586602a1f2884d16a1b11bd980e62efcd3afe9577e9c830e3d718c00d2e455398b310e226de52922bdb006f1a217aa6e133a45d32eac35eced8e61b7255171e3bd450167108e083a0979cf64fa5485e98c539281b6333ecebef751e1848483ea281086473b38075401bbadcbe1858b40919586b75b050ce69be222241fd0d9254f3a841c55fd5aa7a706a99c515c910b1de4e728a852ab4d9d3e8253e1bde070736043c72218cacf254cf797dac051082df6fc26149fb8cb58e31352a835c2f78017fc53e1849257bdb814740aa5c723fb8c1b6037936cd48ecd748d72ea6683409b862ae49cc2f4ad937b8ce4ceac72bc96686bbc9e58c28cef45f821d33a610e629cffbcbe7acd2873d8892f54725e5e74d03816692f67ca3ac75755f024db990b44fead0a31d0dbf60bf6ff13c276040a09589aab1fb944c29f348f3551f2532fd35b6889c75d30976ed9b03a9ef855350b8ca4e7778994a090894e8a175867f49f6afe2c9f76769321f2689eb6f94b0a76f402e33e3df76dd696662ffe2c3e8cd4c98a29ca73239bc24fefb47080d2fa3fbdc6d6262dfa79a15ce641869be688b28ed9342d4369a98cfa9d1c5fbb9de0fe80808335ea414bb6c3ae0e7cb204ad3cb4789fe0b6730331ffbdc44227fe4984102b81819a436ea2e5505dbb5079d57a2b4a0cbfc77582075d8ffcbabf091d8fb85af6dbc9e6c1d4b4c2b51675e8d4db590286965d4b700ae7610349a800b57ae040e8d7a9e6e83bcebbb55ae2eb14b77574f1e975ccf56be816606a94d3dc7b415a42108f8c674c0d961cb96c45d5a2d77da50e97ee851ef6ad156ee20202890968be461587802055ea308e2de192a17fe481794de41f279d9a0e65101b11fa49b09bd5ef6a4fdea876f49a86c1cd43396945ab42e9f7a9526a24d9d1b6882b9a7b9e76a2e970f316569990c295c1b1dd4a4373426358d64c742281359154ef0e1b5c6bff50d219c22d564f1b354674126443f3014cf0d7f976ca8b97809033de7c7cad96621b3ac69f802e752de74cfe564d65e84d28e64de53558645012a506a4a9f8b78c4ced4fcb1f76350e62b8b616f472cd131f59babf699cef5b0c7e53ebf925feded84711778484d70620c501cc78588fca12e66505f67c988eb1f68bea6a1b68fa366a8974444fc344cf59bf8e26c6ae98a8d6f1f082d18cf9f6a7d89954d0498cf4fbffc1311dd961a11ade6b31ea3ff55711316122c739fb316c3176e59ae5d683daff3bac396630ecf8889f3d66099a6b0dc7301856d42db8d14bc8975e72267f04bf8b00e27fae24fab1f3cdab30627e2a6463e2513cd455037a619e71aa56adc6073c88bba79b48f18c85102c671bf7605242281ba36f4389166d63a3a758644cda74fce7df1f280a20cccdc9fd4eefd4542e83a49205553fae4540ea3ffdabd32c881dd173837a3093453a162ce07dcabbfe9fe6bf7d4ae2ee87d17784252cc36ca30f7c5407f276d2135bf8b6443b68ba8678d590539088267ec83126a4f3f25ee7dba6056ed7b686176ce317be7fea17742c0d81e942438e6d379720559cb2b695dbbf8cc91c14434ab06ee035eea42851385cc3bfe6bed092fffb213a6d181f6c9bdbde029a21be235f4684fbaf5c730674da998c1cc1431ccfaba39d7acbe4a5c360fe6e769b9f6c459590f1df593223744b34d1a21079ab6b713af8cf806f6d5bef6756e7bd51d87dd21a35f8acb23c9230d4453c84e9cd66c5b57cdedbc7680e1ff31cb6221cd4c32b87e6137727ee8b5062c375eae84f03cdccda9c66f88272e7c0ac114f5bbdb695ea6b04", "5153536553", 1, 543070536, 1537743641, "8e13c3e9a0ddb0b40a9b15b428fcda6758ad9ac8d7611b741ccd020f245894e9"], - ["030000807082c403010f9002a6a05a191f58221ead28fbe403ef009641e12ab4fdfb52c46ee7f9185d01000000035363630146a78b04b3b8e205000000000453526a5108f9db0000000000020063a98c08040000000005635200ac52c2809202000000000200000000000000000000030000000000000000d64c62010000000066c31c4b5d019d68387fe10238133e9504f8266ac2de3ba887510a46176743f0fbd28800ffe9a11cfc7da5c648258b05ae27654fbd797a201e6826e859204617b10e528bd95ac1eb2b7fe3bb84c7856af6293ed554f50c3b7dbfd705c80dcec500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f0c23634c4b8647ef29bbad00a389d3338682202c15a00f2c2793f7b0bfd96e226ffc9b07273484ecf2f36ae75a7bc2ff08283cb6e700b43971494ace63b72ee4b8299a613ebbd9180ff6534dbb1df2cf35efa800bbaa93aede41d5407da12568d1102217c7e655ffa4acf5b117e2c3f07c360ee6fb798f0bb32d801d37237470304829455d83ac19f128af9985dd4bc385a54dee9d335ee89bf9dc229955eb3780319f6357a05b21fb799756b22ad58ce6da206ccb055fa8c38b12cce1a0243c34f0a074af783317b6cc6e5bd1658422f6c5ba46c5ff9f7aeb74c30ac85f54f38d6ac3abc6a5bb0c874c3f9bd3217adf39ed718576488175d80a8fbe01d6d9413bb87032f6ac370cbdc4a4b0583560eafb54fc37a59231c2b02643651c863b1408462180226a0cf4105fc1526aabcf7f49e3f053e573738e29efbe2f0f8ce5a3496155f94020de6c1f3ad8eceac3bd1348b295e202fbf90abf0dee79657fb558ef96c720431022eadf7a1bacfac364ee7112203fb0964c6b775da1220880fc1309a132c9de3d3030fb774e42d94b11b886a83cf4f5bfcb58b7012d121a6ae31b20f01efa0056a695a73e7e541e0a2e82acb69e12c92e52bba30b8b928eeb15038b590b488037b04823e78c2c38ccbcad6d4a89083ebaa95098f8bf9f8f15f3d51977eb666ca8ec238ed7745e37a82ce20cfd6f9d88600fed057cfbbeb8573ec5f5896ff57124469dfba706d45024656fe644b1c391a386d45a3b861dd46eedec048712da787dfa5ad01d12dfe9ebd099314c40037faa9baa8e024bacf2b5b2cd0ebf287bbc2373e27c7ad9dc01177aa97bb3a6b81528b62c74fd77152e69b5e379e65607a50aea0518696644848fac74131baa7c1a17cd384e7fefd29a0eebdf0865db0663a72e66e36addfe22f048bf2964d1bd21ace8f409dafab1922fbbcdc5dd765d02e14434a75c696f6108e910224d98f03f207c09a42a1d7f7fd09620963e5e877e0c16c4fde03150e89f952f362c697130c82fe0f22cff8278cfcbddcbe6fb1ec66ed7232c9914fbd18c16ae8fb9c8f39da9ca6a7431fc508693ce8a81aa22b676d80db5ea44d4bb2ca7d78d1c85545ea13b22b0f073eef27466dbc4682cc3bec183b80efcde1b0cf858e7f6673ecb1421e3a22fe429e4f2cf37fa038d32c07b2e55ebabcc6a7733a3ef93c33f4bec3cee44332ecff836c2c0661c4205a9ae1b4aaf4537da0ecb64089c74e01d2349cc0809192c3d2276858f530c8f22c70ac35e33c097411e87c60c3fac8a3fa360ca196a4dd9ba1546e5464336173873241cf34a2f24dfda5797b1639f91c245cc4d91ba87c5fe1948df784d6e8122d5a989751fa7b6375a040ce9da386dbf47baa79bdf339da8cd565549dc1c973194706107de1a27ec46e197616623e5e28eb45bb3708469ab48c501d077d355afc8783b6439e150105350aa188bf5eff1a5f99a820ac3e4335f8e9cd2d40bfe6f947c06a7db1b69f76eb8f466c8dbe822f8d79813e91e4f785a5bf340f8cb7838276f3a32027ed63f06783d3b75f05868c84fd1a6a3e0eb9447a7c0032a61dbd666a0f441b289c0af2b2eb761c2ae4d2f4971bab11ba9bd98731d41bdbfb1ce6a3b93134d01ede1a6916b1851ecd1388a570e10366cb6e0870ffcc8cdacc21ada9ef0b291fc4e4e9d0b0c616e051b75a31a5862f03700ce833e36937631f1e964ee38d47c78183d382dd9fec5a8cb74d723192c501ccb39ceacf42c52d3b28db61f14afa3f7bc3fe1479434dc304ccea4cb527e8822dd1819852dca48d997efe19ca03223b754752818aadb8b59b5b6c2d86353830db769c5d9e18283bf359f1f5bf786ec6e320eb6e63ed5e2185c8cc9987ddd53773a2ebfbfb66832adb33e727e88a3bd79cd61c2bbf715bf03b880a2be9aa2d2aa50396929bd83f03b5050977afa77ee300a977d6b54a090249602dd5a74f9f1ecace80675ba18002ec1d3039f777d3ed429191eaa3725dac9c6331342fbb211ecd2e92268a51348e3c7d05fb5b4a0c8a35c18361603550a2a652bfe1880d886735a1ef1863ee67eb919c8a62cf849b523e54b2c4772b856fba643e0e647e7b1e1c7f53627002d3fb16e4142e431d46b6b69c8e8bbcbb1111078ac986d0ca834c31b520b4f71f511efa42eb2ca95604eb153e7fab5d12b2ce38e9e9511b4827e2bbba6b1ec442b68d230681f3ecda28396d451d6182c233c9617fe98f19afbccd53d2e13b7410e4181fafaf740c2a98966c383fc0399b72fef5e03594b1dd343f29ea546ed3c0af0200000000000000000000000063148878c0b3e87143fbcade61c4f8bd0c4b0a320b2533808e585b70268dcdd8776d66cd1c825fcaea5f4be21e4bda2bd387312ccb82e9cc2a34342c971aff87c20be00cbdc15fb00b2ad13f1bc65ba95d95fdd57d8d9706474546a39dff92c5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e764c4a7c72a4470d63943859a521c56ac68d53bc6ffecfeb800f148a85c19bca0bee5037fe0107340fd115d0901d0627150c62e501718ebb095d26e6b0fd50582460af5a7a0a7e6335c14183e53ba4a60fbb107b14678a8e9b897270a8c26b135265b7a12c091d3daccaa8283bbcfb647daf5d04b0e3bfb7e8a853f63b9aad031045b8643d4207e4d08b87757340c49149b86995c8eb7aed9cfff02c4d4d95fb0323ae624739d7eac157a9b7105481b6fd5f0ff1a3b5ec2195f1dd66d73e53faa10b023e8bd0d67db8e83cba903ef0dc0db1d38c4578cc33e49d22fb59e4c792fc7b4c612ae49576055dd267074d79db1ce9db5369198401671c2c5309bb659329c1031c76cdd2cc9bfc2cb95b5630e6e14dd784ea367372c300545e8df5892453b34f02129d52942fe6ccfeb0208051a988dbfdfed1593b6270760771235b39e0a398b1021297b9f62f35e61f6c5d0df082879abe8807aa86e8f39f55f6d2653d42d06850022874e1e3c46d9df39833b4f82e58ac4afa03f201c74c9135f41a376d0b9d09d5022ad0155a8f139d14244005ef6ea5bf1f8f33ca4d774a4b0635dcf9f77903db44437c8ae0de2131f61a6a06b79d68d64a4480ddb6bf26b532740a8f4390af8f0d48c70601dc1e90e168378197cd6f9987b0be2d4fe52e80178d180675ad17414c2876c61805e85b4bf54ffe8c4d961cbe7a81c87dca37994e068894f2f7e44b08febb06edcd9bc16afbced3aa0ff11b797ea4fa1bd84bf3ffae46393fbcd9f1207fbbd747b5c27ad8f673f9e916e2f6947471fa1393114ef3e8d87c6455a9007d1174919b66ab29d3a715a1f20861657930cde63677b1b878e056eb8339ee6e6874cdc6f1df8acb83dda5f93858983b2806ad34b63897ebe57f7a9bc1aedb7ee9f4623e1b3f4f4aec368f3a2898f343036107c4a9d7351587abc98770aad0c04e52c6c1469f721565962d814bd7b54aaeb4f92ebc663f013d342e25cb2251cea14ff1a94e792bdc59b4ed913113c6cf39e183773fbcf02780528cc7d29436921cb4ae0420b92176b237b31fe9fb04b8f5ccf5dc73c48379e576150d4b387277dab87ccfa88ec2a65bf0f8634920161942fc48d260dc5d7149845f326afec1d084f7aea6abc375c2e3d617eaa5fa840bd41a3cbd4172d52e9921c7daef9cbb1da96c10238b39e156f980fac4c3bcdaea58d11b861982d9f42a379a9397a51d951944be2a8528ce8e05f26081ae9caa6bca34e8783aca28624887d508a861ef83626a0a10158a7af41e02a068d92e603b6d5105428ff9903118d733be5540f95306b9af72c925743423f27cecae64c170725cb99f7081fa6fae0bcf355ad8edf7bc151db66e49402b668b3e791051a99430d34df98e935a81000f3d41705ca35d1f9c3b8612521822a81e51be8cba589e067c0f23a7275fe4ff87c0f67429c5b0195521336beaad35686f4caceffa77ecfb5b9605d9f251e2a8a5c18e4e27551b2548fe8954b9e2f2ef1c0828e0bcc2267ead11c0eba80d9800d4eb089bba226398789caafe5efd893a5d560fbb44dfaa7818a118f0d6f04203d0db98fe4974d5a6205c39c117a2f4f1ffd5011c6b57828ce0c504ece67f02313d23125ab821cf3c0552b6acf81f56ccfe8bf4697a0fdf2317a54681c55eb3ed1bfbb2d053289248ad79dbf2bdc30f565035d10dbe9dd6359a5b76f3eb2cf0895d07e7ab7e631010babd398bee91c9df473ed13f3a3ced27cdaf16ff4259e4c044a751952e57fae2734dfabbc19031011e67e8319acca1fc87da84431b1efb2de1b8bad6adc5035c9226cbac0de621f8d195d3a0c0df3c520821c3c01abe4c128471c6cb2961b759d35be84227d0315253010faae9e89b7674d9475d20be899c0b6d3fc8a7e2409dd56db83f0e03d2e3e9173b52ec74dfc8955c29210acbace3d74db642ff46923ad4cc50cb0aac737523506d9fa2ab01494dc33959487c098ac8cf270a526fcda8c78d0410b5a24b776299c7dc3cb4d51a612ffa84a7c2ccbb5f6dc92e95714ba04d2ff585c51719de1389933497834c7ad8a331a3d7c45514fbd7d67232f9010fc47848aa6647ade0b4b259bf060ae6ef6ca68892fe35da3b598afc876df72c64de42ff457a816217813dea9682c6215593f7d248fc980557bc989cd14ba45b556ab36a713f05379142eb1e964c14a238b08ce29f53e4082424019b06742406f38b6289b7d00bac7f53500448f3551791d4eaa6b174b2ff642af9cda58b8e63d01d2d8c7c03d2341fbe39f6402c54d3436f520000000000000000cb412b04000000002226705b0e632c4c5f1824e081de4cc5fd104c4178e89fd690d060ebc80b289affcb3144c12b78353f02979b5a8c5376b2f9b649195a52311354f00102082252e9f08f2c2152b79fabffa992055de9c221fc7fc4c2f5275fe1c0a53ef899660700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fed3a225530a79ef7105c98a74ac8d6a5dcf9a31152c648326714984e91fac4a39a7d116400aaeb077bf84f2c0af0b245c79f469199968a52c107262dcb02aa47945bb7accd969279d0dd0ed8e791302f68702a22e4473dcd7d6e881082584621d9ee01ccae6f9fd67d6ee315209db1a09f311c715d2d822e513aa23b03dfded02292c2e4f5c7cfa721eec53788ca6714c7300d45211f3b189e0f415d6ff094739021771c68eda55cdfbcf53857ed19e53be6cbe7346a0d97d68bdc7b45d5d6f7df30b0731c39cb9a0c22c1a5ec6f8ae0167565b9be7a2c8424bc5e727f88fb7699ce3ba698fc146e9874536db4ac658a86ea446154112de5533a67d2372d6f76cb697022f610ca2df065460381b944bf751f4598da93835055211c85a8845e8e7b7a3940305338bf2f2a2a7ab609dae87e9b42db9ff46e727d3edbaa09fd8c004964c6d73032cd0a6ba07d867f77cf08a55a34e7bf343b541365683536fe44a86e3961d1230020bf7957ab2dadd6c43307a610905ea669b9c4ea5bf88ed515de6f28ff514e80b030fa7f50501611c19dbe2cc7403a7d3b67285a1ee7f8f659eb0340ae0d227e48d52148680ca9fe4f60ef92b29fb9c74b140e677659db1f8e3fd03b35a33c77de58b6221f414bac6918264bac60a64c1ccb6c018beedaf7ddba0ac465302b2417909154c80094ab1c09ca26eb364fcf6e9af4559f9490f8658318be3a025560d2d959c1c87d59c4e9b05560df56e655c58001b6b7d4a6ab98dee9101a94c1e8de386022fc340129a7df79263755562e7701bc9a8dde2f3e8fe74041f38e88aea1f15827fe3b90b79c889f5ccd2f7a322fef6fe3f4ba6ab13d9644897c78069d938f440310f98429454593a2e34adcb76221f6c6a17204d93412fea2d9680d60272cfb1b886752f44776386bf1958dace356ee6e311da3459f68ac96b6ea0e19795bcf252ea4e3bd4e83203b136b38adbee9a0192b4b819ca85a6a3bd22a676d26bded6775c828b0a4f9b50de0c9a3f1938cba98f8ecc4831f764389588663c8228a0ee1eb5a130d5a95d29aab5e6cf1a86bc39e0d412c777855bc4eb7f2d932defd4d2692317e963ab3f5888370ac2a996bf2fef04cc6367974a9be11288c7516c5d8df8ef1d8242b4735c38c624ce2ccc7dcd51d14a4bf4684e37f17908a7980300b67619184bceae653e0cc7851e769be9f4cde8b468418c30504ab14058a94cf1f9354d4bd2b1680f6ae35fc65df7aed2e97a1a339000d2a47213ab6c1b8c178eca47073ea8ead66cf3b1a322739ca70e1a6c08b4b58e0a18614c3eb18e073808c6cc1de0b6502343a2da0c2f9bfa182850c617b0540b0460a83aae533883530917f9e77f024c815fd6604cde5c5218d09f8697121165097212ccd2da1d4dfdcd4a579b940f264c5c8ceec16d85c02fe0a6d668588bcddf325f1974d3bca89879a8344aca11829742dab922f5a43cc97f68baef6fe96bf576b62a4c23c5ace04b05579dee93f3562806dff79c6f98a61cf7ce762b0f405975321c57af87db510b09ab1dbe9d4fae552e05d84d9a733f55bd3ba0a789ebce22445c4c85f8b18cd9c6f8b7db7a424eb06e628a9277a4318b98ccc9540b3c138383d75e8e8095adb6ac2f7cea005b69758fafed34e6f679a8ba86e4967b1e12ce7dc50473a0f30d4d5d6cae43467c82d1c47ab51dc05f23c2fe26292b2d1b6e11368fbeb76eb7fc20b3b503886bcc71f1c63155ed3b3f8b737a33520b77a82bdfa24400339afd13884cb6e77f8400ae3edec50f9376d3da8a1fa12ce42de6db7b09dbf59217661dd9eb04fe30148e409125ee9378479ce852273a10bc3235ba9bd3029d725c1d79ed547f27dbb28ac572763a9b069fe4553359071112e22b61789226cae29a1fa12df8cb149901a51e4abe0792873c8365f98ff22f225f521660158a1163cff8a8525fbaecbe609f26599dd1910f7452b5be40c9c60022a17d0ce854c7100396c1c5b3aeb3ef48442e774979a2931542e291c833f4bd7b2778df409561496e8e71ebd3d4ff6d8c0c06d373ccc383f0a9d42906b5d4897d4c532301172dab6bcb76b8a973b263f5cdd3fcbe40166e928f798e266ab2b90b7e2ad69f714447c19137b2c6b97ef190d8ff9627a085c8a4bf0681e592893ce4b23725e8a08233a65503da8a3f6a2311fa8efc44e05dd0eafe63bb39fa2f44e64ae32ff5a96a202bd232bac29b72aedc4d640aa106b500b0288db01d9dbb7e372c1b033adba8b96cc68787a7879656d4dc995b7e9b9dc9f9b8d7365031df6d8d87ca5154afa76d38e9dcc60fe60422606f9f6b7c596b092567f6ca1a5350cd2f9a91775a4fbc09a631a40aefb54123cd996b6be934d596020951625d0e444852bb63e5f59b813720b82ae6cb04a2feb95d89cc6476902fcf3cb3e704", "53ac65536a", 0, 2101429094, 1537743641, "cf08a55548ed9cb60fce44f279a9fbe5d5296c18dc142e005cbface218578adb"], - ["030000807082c4030394b977a07f9a5be8a3f72274a56f402beaca1b165c13dec67dee9eab08477c9601000000036a6552ffffffff985fd20d53fcd1c616bea226c03328fa06da36df51465127bc6a7f83a0d48875010000000251530a43af641ac16be6c9c8c6e30f0be6a299746a413a366afa88224fc07a2b0215bcc5dae100000000090051ac530052005353ffffffff02ce37e70400000000016a6834e8040000000003526a6571d2b7de000000000100000000000000007ea4410000000000ad6fec04ba45bb2b1401eb933d9e98a24e33e2d7dabf12b5c8ab973ead214e86eb8604a352c72dda7d9a46c8cfa44ef827bd2732c32d7e35d546da639609c88fb94a1e707b6d7f6627abf65a2979b3e634ec35452d68eb6e7949547d83ddde6e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a1bf5458fc7b2c9a6af1bb05a5e21e4a5c78e8611667eb0dc81e94e801203b10daba153424e31203b194fecb2f4cb87600ac2a5a9f414276b536b31b69af1e419a55d2f226797efeb62742756fe93381fc1a15d42ba4bac8efa49f64122723aaad9f6b7f4404122bca2e3dd979dce0f0356f6178c275dc3df9e5b2d2890495a030ea1fe6f12d2fea586e17a9dc6b81c6718e8d770c999f8943cf5ad25b471428202032cc35bc47d802761e4bf18a8922a301f830c161bf275c2dca3f09832042d7b0b0517f58e75558639873391b1129d09754fef5353263de47629ce6b05a8e015e75ddf6cc032b66b3bd5455520306201e31e47e3224b9d78a3c98ed1bcf75d99170201647a3cd865d46cf437b180811789d3cbf4af31b1cd69bf1a1ef18e7ecdbe0e02172f58ce5af84797080476139b2dbf78e9ca1403ae6daf5438dec11f9b3c3f2f0218e1c5c486f9950db744092c0e1ff104287f630b30f2ff3dec709326c96402e80321858b22fb4fec2b187727ea66979417455e88d5343f06602fd92b263b0eb874020ec71d35c5c109bc969250b1fc1fa7cd972b15a686bbebacb31e7e6c9455c946aec1205c1ce10b50fea6c2b29a183c88daec99fd09d11305733e513bbb88bea974d94059eee9297d7ec01f34817ce38bcb721b276afba04a003bb24ff23a7a2090933901c5914d17c8e6116c3a3463f06c69d6a64ada8b710ea73fb4fa68ebd82ecae22a7fdcdc2dbe03bf4c8d8961b3bccac8d9b20114e79c966d78d4d45cdcd0a2b123cdad210148dd4d8c1408f37d883a3ea11e295ad63269cb6db96e4d83649c30875684b72efd47773f022e2a2b724d62c416961927d58ce6dbf6ab4d679f32248004da039d6a3487bb1847816e7c51281e6262d1443192cba8d48e4170781fecc7221fef39d610af24133e5fd79d7cc657aeb036c0356dcd481757dc60fff75b40a231da92e3f979b9a8d553f1652fd72f1341f2e4b289511b8edd38d5380751e1aa0835691e094fca087480a9f17c77bf080c23760cb44f7d656c854959d8c5e9593929dfd2f82005420f511a84f65b61d69b2a258060d39fa94370a63ffe490f72a778d3fb0a8d4846c718c9f97afaa7a6410cb5f364f300a383922da92539eb9ad7951b07312db417403435afef2e4899c4c0ed87073ddf3588ca518e5a310af05778b80470aa756cd6808aeda59402f730cedee48349087384dd31220b351c6266aa23b3241a5bfc2c088c50d17d3efed515221d1cca424d8a9849fd4d10caa16b12764d04c5de940a1e2b8e6069e01cc63a959c4feaafe31414779c0f8182357c495450abcc71377c130c00b221fe9e3bbca5bce5dd1d5cd25666dfe014174fab8c24b52875ddcd55d81aaf09242cf52daa0bc513fb49ef7e4c23536ad820a48cf054a37c6c1a50f8a733f94536c92955a18543fb4b77968eb7ca81eb1d85c6d586cddbb69bc82f3b6dc5a8971795a7b466d65a4780b95eea4941d89e70df46c270c36422ffa880d0006907ebf203cf2bc23482756c785ae227397a2abb1089b6c35064857ed256976a0203c58e92bffa999bccea5fa30ffa8292565343dbab1e381946a9a6bee3e082ceb0e11e81a8231acd3fc1e4858d1f161ae797c97549fbf4e3b6cd23e23728e5fc9a4b4726be4a5f12c1fc7a99af93a00e183f2bd407955a81c87c753aec5d085c92bf3bde83dd37ddfc99290c4dbc404ac105b84a21884caf2242989bec0a7892887ca8cb79e26ded4eccc9f1df4c8e56e0a2edffd1fd86d50730a0f7e1e22e0fef479b9b924f698b3dfe0abb86e503264bbc1b269596fb18b5531d0d2fc0b074ce7a26c36e56a6c4badb88f824a63fce68e0b26274650ebaf8d5553e09491ff30ea43eda3fd207270308a1a0e35636d9b938fbc706ab08bcf9b3c23e435173984200c6e45c6489d57096adf155bccc85f6f4c5941c6aa72fbe96cec8539e872dbc2dd5181538666b9692df6c53ac7ff5a24fc19b80fe0f67badaea9d72f5d554fb4ee805c85ce860569ede608aadfc6c826c4ed1f57ecb98db1029f70b09fdc27667479b05486097ffa0d34743cd42305f5a8d161ae5db13af2efbbffd53ee89060e9d2831d817c4b6e128efdf14d8167a2f958b3fa12c170df046c6c4a02aefa6e330a4b1cc43e4e6e1d857d1a9dc959fc17b899d32d4472f37b8bf7978a6be212b53beb4b3d05d78db0342385b12571223867667830cdec8a419f619e1c662f2e30d16ffeadf68ce59703655d3125aea246b22afd15e3a14b57ff5a60df3f4086dc339b034b18fbba0a44d164ac8db31c980bfcc1b21c9449d4582a1728c691606cd0a896ddf123d4d55cd25af5455822bee3b81ab06837ababbae8ab9db9649c7c29f4ebeef7be3f542cdce3c06116255a46eb170d5a15edc1998982b4d63e20e", "005200636300536563", 0, 1833328831, 1537743641, "6d35f82e20d616804636a8342ad5a7bb5403a7fee3974dd25e3de9571739046e"], - ["030000807082c40302fa11524d732c7ca6d2f232dbf813a8c2a35955a4e70ef62296866d553f19fd090300000000ffffffff3fa309d0355f72d439b10d1566316c55fdffc4d399ade32caaa9a5a5ff460a680000000004006a5351ffffffff019077de00000000000765ac5265006352000000008db90a4e038168d500000000000000000000000000b2ba6f83a7732dc947d1089bae69ef064a6ee6b0b1b188cd4f36abc57ccae37507735196ce2da562b206f84dc30caa539594347679a6a53a181646424e108cd7d77d14a3a614cbac77619fdd818df7f8e873895d91fb75a1987348b9b8d8ac8f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000acdbb28c2527ca96ec0c099e8fe5c016419590f08152d297208d6bbd395ccbb97846694c62f155cbcb1c56cad8a29b4860edf901998986f2301fb585c9f8370946e1e5757534cac24bc98fc54544c1920bcb9381993591ce945806ad7dcdeb88ac6e96979feec1879f422351b010b8728066d6ffc622736e6116a3d11f2ebd130222c2df815c746f9bdcba0f3b2d3191bd2e7253cc5e30de9352f4587d0398be2a03228ab1197679e12e69876567fa959743c859da65f810d1816e7329dedd3932210a02f46974b3df2e669608a5ac717e1765a9b03de132a4ec0b35dc9565c8ca6f4d1df4482382cbc69dec206843836b39ae1206077741891e1718f640dea49da830020bd5520bf0a28babf1f9793f2c39062f92cc6394d0d29dcb03d871ebe9e087ca02033116b7bb02a823e7e999f48d1dbb8774cab6120ac4bdae86f7e24e9e7cbfff022e714d4d511d1498a07fb75846e249b91203c8ed43e516601374b4c5e3e524730201a351f705246b40a9f35bf9b61297d75f459137f5713db056c2f77cbe4b026f0326225bd45e126133ee7f9ef8e97b5b8e3f8e913a5047a6769b3a096c5830dba92a1dfb29cf3779c4056914d7b536d5ec99d452dcd7d024bc315d16175a20dde409f6d4f73cf3bcdd5b0f9850018e11a547719f1ec4b5e52618d0268853950a41540a79a9194c185b2dfed21193937d013233e2792d6495e378e241e97c2726666b1bd04e9d5205b3717dfa1fbc83f718ca77e3ef3a8c1b3688f18ff17a8c8f69a76675e8a43dd21ff0d9cdd84eb28c32c7dfe422decd140b2cb3ff299c9bae6c0897a389457cc476f3584177a4508d3b869fb02882beb43e56a8d128496605a30cd7255a0c9733b3fc2d8119aac2919af1181f383b5b63d859e17bf66cac579c72bce4f61d18a2334040259441b1b14aabaabaa7f902146baaf9089fcf1e4d742ca3ab178189f28cda86ebb65aa23430ec5b3d412e552fad7e8e3dd56b90873ff7da73e3e8f403d2848988e4583309f7ba0318b51eb63f289e242d4d447f0be6a39436f76886d58ce13a833a54789f076158787e967a8f003924e3bbad6aba5306f6524a212cb5c64ebab0581e9404314deb52fc86165ec100f7ae65899568572cac60989d0b31f4d40208f4cf60cb61817b5e33314ab7c7d9c6bd2647bbfe0036e69a9203185b823076d8f5a03b3bfc75efd486792f4167a3c27bf7afac8ee2d1f674d63247a24ae8d12776e0cf01531a6011d93a877651b81e97ca25bbcac0ef18f0c6a2fd32a43c4eda7f41696cb2b1f895a248d1be306c651532576a834716edcf1b8642a3eb00da40104cf822341a05e5d26cdad3beefa3cc3260990ff8212b82de0d917a2665738b973810eff45cff7da0a0d69e46fc51dd083f928f3c3c96d54b6605e6fe3718f590cb2eb3085bb90c046ddb270810e2dc4a4ba4fbb3ec41f740a3f6055a0a741681b1e044160a6d0fae2d42d96c1dd7fc0a6d9b3cf5023f3707c97bbf1eb5b6966d63485bd2140767c120daa11286b29f8a297d44e16a8a75b5271d5f969ce799f91a4af884a7009a9090d5fa8019e9ea4495a61c05c74c88b9771a3ad100c3a4f31eab1f776194a43d5f1d143e4f4d0eefe79a2fa2cece3c165e10d17a654422c1c66dab701fd60ce2ae39c7fb3a0820be1e5127708281c72c139df555845142cef3962b4e658b4b2e492d2bbfcd0b8a9006c5a389aecc092278b217ab924f98e51e6c9a65028547bbbfcb5570ac2a3705b4e133979d010a4248aafa2003dbcab420bf2b721a53e46229c86e2d7e6404d71518aec01c8638d0e72dd45957e39f006f4103cd4d3007b35bcdd73d6b9f77ff4f046d4897b17337bc31c960e9cbb50125431cb01ca01d1826075e18b131c83f0941837beecbfd72aa87b81af737ead74cd29b583fcd8110520c2c8360ef29ce0718ebfe865ae2ba5871cf68ce5955a2b980c14bb907d728cdc3eb9cda9fe7f274a12077275e4c6c842c6de6422366d5a0a69313c07d61fbda2f81d5e7d2827db503f711ba8f6bdffa095971ce7c4455e1267e919daaf26bd767c5b25a3b2f7c7b6e449f343edfdb91e8e3ecfe9493ec215bf311f38a6f865c87f783f68255b98c09af1815037735118784d8ea29da83ac51dc712ed1fee78e46fe6bf65024ea3a37b6e9473f69238be6bc5cb963a29a731fd3f5501db43b7c7a62f5dfe3f6f806b69a7187d77fc8982d92fb2cd92fecd3d0ae05469b77a19224ca0bc5402eb104333228ef4bdd8eb017894e4f8d714d9e91458687cf0000000000000000c49e8f0200000000cdf42c02c809db67d2b3b3b66467cb6b6fab21c9b3a58e4285025f2fd44b7068a225a8f52bf22302e564ef308980791c078647867800fff9ffe4e613fc194ab5a780f982a03f1711d6fb1445958c11bfafd2349d418acdc4aa92ca2fdd3438350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000092b99af1561dfa145a240280eeacb1bb18e1736f9889c622bd0e949fc6fddd42d3d54504bae0085d1efda910ce1c6fa40242b97ea21c9a21cd156d384d8c18f813b2b1c70849d400a5484bcf164de554d9fee480fe2706f9498755ebac8cc4b82c76949159fabfcdecc5c1e9bbdb16e55269cbbbb5233547fc78d07ca3ae89c103231eb7f0ea452615faf02f7a19fd337ff851a77b1060561058cea83f6175100c032f998d734666fd2b5335bace06e544fd60d2e50063c430651760ff761abb445b0b021c921fb5da1356a6416089a82d5a33a864cf58dbe5885e4d0a29efb3b43a10031e53916f91355455ccd7a340ace90ed749f663933cbc4f84bbe8837ad66233022a1d63a274e41ad3f8fb57ee0430b7a0cacb3af51c2575eff68c5528e7c91cc1032b7befab6129c936e1b67b4e5ffb1776c90a59f0f4af69ddd4447c3885c79e88020359cebdc949d2e20103dbff461e968db7980207e87c9664ddea07a5efe8a744020f4b778b2e75c6bdf5713e8d919088f90f74fc657831a71faa8b147c4020a6bb03152a9daea29c7bdc793215cfb4116f4fa61506be3b3e3a470b47fbbb4bf0c831d769037543a2ecd45fce1cb9f143f0f8b4ac064035e955b2559b04152186ac396de8fc3090cbdec34822566e5eecbf4749c5463234e4d0db822c598e0d6857d697fb26ec6a3b61fcba8db089e97a7ee421f1fc1c233cc840d56d950a81e9edb732eea1bece114133ae754e7f4e7fa36d724f5ebbc76ad3e730f159cdabd4b2b0e2ca236b357fd6a367b2eb66d5e9eb010f890ed130f9acde40569dca933d0870f9718a40312e88fcbd532f3f53df0a27f7c82e743f6548146a53db52ba8593d8614864fe27ca3d50fd23c78fa8309497be76f031cab2b8a8d093011e0c7718a5c7d3100d8207d6f73fac918b6be21750457e65ead5eb82dbd6790cb4ef155c6d47b4e675c617b8fbb27bff4aab67c1bb1c5309d50573799d825551ce509816c121be83c6d756da2155ee08cd83c6f3036ec3b35848d08ec8c70bdc9b938309e98a6ea07883346198030a64de8699162ef614a55fbfc0fdbef934e59f36586b5c9bcf03c73f6b554899738c722bf9dc6a5e898499c7e5a5ad2bc5d3d15a1d545076053248f220fe33beac2b6e0d7a6371d45854e4572caf7a77bccf66b6469d07df5ebe28088ba95c564dc40f3bb814713113690e842400eca129a4638eb6108920dd6de31b264491f1add87ad6abfcb83e51d562481730d2e4a86e7f5b6d19e22a36acd4642ea46196ffee8f05b6e4d1377dfe7df6ee6352521f0a778c64a32876d32e7e43cd0ccce9183727e44367a148dbedda94fca3e0a192e98e45a13df73297c17606067eb23fa04a7c6a17a9ba689bb7a3def8f9428dd58f1b8adf35620772887b47d70301dd02643b350820fa2ba3771639e9c126b351d6e1d68d3d76154b37f889bf3ed9ff2082842cd7ae90465d4d1ab48d9bae2339a756154c48aae8703a3df28893f1982003c04807cc9c20b90d50b0d39cb9b957f2faa9d407dabe3b436b0394f8801d5f81948cbef6646cd5cbe1dd8442ce8f4e8246a5b9dcd0a60ebb8a4b8256a846fa6689c64d5f0a7a689ee3695582e729da684649adb0c21766b6929b9db3ffe5bb29014c3df0e2d2968ab0de7dea24330ef3da2b8c1b90d75367ce8219c3a59f2b8f6ebd0341cf5dfe0960512bbfcf069b8b875646b63e5914134e5628e07cfe162e7c9ae10602559a10f09afd2749f56914281a4ccc6988743254960eaa446cccd4dfad6da35b24a03659220c39fa9ffc3d91d779077119dfadbbfd03bcd20ad51f9effd187f2d009024baa354b79b36231efe118310a20bf6b545baccac1d010e3dcdfe17c41a847885771edd1fb79214b5c74fe37b1d8dfca46dbb05284422bdc5fcfc0537e816bed308b44cc21529d655331bc3795c4dbb333ac86bb67b2d571589a6139003614078a0b869077c323be9869685b06be296dc0bd5ae2caa8e6a457fb996e48728322eef159a5d10c6451e14ccaea574502860209d1adef0ad35a2943382f31cb3d9b9d9b74877494c915f0605d8298541727e8dd49c651dc4cb3336ea931545c06f88ec9c2204b93e76b8e55da846fae3333aff2b19e40ab7e664781f2d32b8761de1def918aa6e9cfb1ee728102a00fc7b0a724996f017ae589c01f99c1929d1711c6933ba4d1538562b15164b6a732e54bc3e7b79be249dd6a92d99148915d2863af2f86b9012dda39424a849940cb6b6faa6784d66675a13c99448acc17c4b200000000000000000b7f250000000000f16a0500c6f01110b52181ddaefae9108ee700d38f73e3bb6295d279837b4bfce75c7bc6a6dd1fc64552eb2e2a2a2be04984b94847515b6ba4a34b4f8cebea3145e63d8ba8f373d3ed8fdf456728f517ec2bb4ba151c3337915c24b364dec5bc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e717c6abced26d18bdc22910568ddb2b8c08e6cf552a5bd90e2a8f3f6d7e78cf4ba369190a17345cbffae43f9ca61974679dd665219da8e120efffe687fbcb1df5fd39ddbf5709eaf2d96d322afc2e58300c6ef7055d6eee8db6f5428245e17d9934eb7db212968f6732053108b12180b6ea7200052b2f2078448c04eafec895032fa9b95557345015ffdacfffa4811d4e355680ff7cdd0abe7d6b46f648f86a720316a65a48b5254e06d8b383065648ecea9d16a88d5335f5b186d02ec636f8b3f30b00304f8a5c8f55e31a5b25a02749b512cbe68e50c06a164530a7cea78eeb996e349528f04dc800021f9c26ed6d4fb669c21349c4ab57acb703ec734a96fb9f8602010f02f7a343367c3c691b5c89d2bd417394b11a99ca9a713c2380374e8310400304ecc91e0552f25cd30f3a3bfb032fcd8a0228975f862956267ce83547110da60213f9fab25f64388bae0af4627ff79a7c58c1e30497d405602e30d71e0f64327a031df971ce255bcacf2d3401a4bbc628bff2e02f37d571530fc5590d5f5ad0811e022551f348ff7217431f76aaab768a8f3721371aec003a12087d26f05b56af891f9dc0ec6ea5ce8c17d6a75587dbee816e066936eefbea1d7a0a48c3b71180bacd03deed4209c7fe28a56497c82072f3a9f17b9d2c64fa472d9da39b2872a33b3ab8b4e353408a94aaa2003bc81e791d11fb9f676576781f9f3fb5f902d38723f4f4cc77e48658ef6fb02fe5f8ea1a42c68cd9d430d7a4f489f2047375eb0a6a3ac2e4e812f8345959d09b91c16738edc96552755462d26df9f8ef51b16c116fa2e6ec5d32e80a936cf25652200eba7d92d8defb573bb5f1209464eebd2305759a5623de1e3a1a692b1b7a6fcdf070e10cf546bcffb726523eff043d8eb667389a0257b8288a233a62e757e32672c925f47ce72b7b0706537f522823be97762ed70f055545a93944b17c27c73ae339dca5ef6d2a2d9f9205ebd9577165a7f52827a8777e425e2f844f7f0a06187be448b89f95149a2221b1a3aeca378150881a9cce74d59667488aeba2259d56e750c451601d1677a8964046906ef169cd5b61622b4a4ce779ad27604f6461a7bbf9cbc2259ae5a96be39653449460e0d130fe2dbfc3a5d449423563ea68915e2d6436e8c510481c3ae5c2498460fb44be7e0dcbb64f64e27ad0b5f0e0f48270fe7d1d91bb0e9042e8a3949acd7fe5157451efa8d8ead3e0fe11e18bb3801def17063f57975fc352cd347c6b88036deee046fa9e76f796e43dd11a213e18bb35ce8707c34de14fff38e38d5353eeb70b9af0d8a971a14f5920e0ecf0095dede7036ee6576e12e6baa20351c196d9b96e456d289e187224ebcc633d767e899981e6bdf98d01075085397d5d11095eedf55fcd8bd3e42e86b5836acf5709b04bd9b9cbb5b6508a8a7f1e92b38437f0136e97110aa9ae79a706af224e8d7b9817ccf1037c7e9ec05789300a813daa3b1f5de53631c88d08cf126eed92958a8b4ed75de718df6bc07ef78fdb6e5f3a953a3e2c8f5d6f3df24aaa6a32c253cf4666abf56ae73a549f6934c4b56a7f6e2b7a485d29673f0435eee1588abca986255f613c754d645d79b25533c8226c0290ab8038916e53803f0956d7a352ab3f6f2c61f1ca859795cc492213a1b9f67a0b939edf8803515e8c60fcb60674135db99f2adb4df08c5246c0fa021fb3392a568ad98909e9493a4229895b16818c655f4b8ee54cd83accdb9ea3c10f15b79e316a14129f949dcf7d02179f9a83aaa749deae9d632f932a3d0cd74afe2b8a7b76f3018418c993dc265adcf5eb5ca457fb841f741c204a31cb0fffc71f0cbc2c83bebf24d15ea21be293c93fdf57be4372d91cea092564fba3ff8fd1370e6b5c458c4535b325e566f3cc2d72058b9bd33d3309ea337c05b3d4c0ce1744c20739a1102f830e45a566dc9c67ecf9d766b2dad77f64aa3024066c5730f56bf848102c137247d8b69e887e00f7bf2bdff6e480e85c3867b1e5d0b55a08c1b4f0da5ceb75e1c2b680b4c2c2f23a4670ed463169d4377472a72e5c7e4804096ddc95b88cd66547e5a1b62422dc1c5bd178c59404141c6e1d6642ee05be560460fd944c36d8d5b7486cceadc3f0b786f4d7ce47724ae61c0e7bf65bd859c10313ee19cdc63cd0d46421f37c148564ed873b94a961941719865fff7e495f015343567e23cf9436aea7b8e4243717403b01897534ac31ccd75c678d50426d48991bcb27f90163a66541230a291264da362a0987be9af5e9ebafa3b4a223a03ce4cfb24016439e26b5ab386822541294aca213db7c9f17b63ce12813e278e53f8e49317967020e34bd8aa74a1498cc35f7075c405bbd7ae13010057435f938563d7a4b0e35985311aa7590362894e4a667e09cb2f385a9d8fb74e0494504", "", 1, 1886359030, 1537743641, "2d20c38a2552e35d12eeb298fda3bdba89b1e793c99215c30a6dd303ec3261b5"], - ["f566496402fe251b9775f857d2040f4c57f294cf40bac7b49ddcf7f5618b9c6af9d975b38c0000000002656aa521991825ec32efb2f330dd48f04ce82962cc707bfa6cb38aeeec36449d66fb4bc09b180000000000ffffffff018870c8030000000003656a003d72c17e0100000000000000006a12a101000000007de230da59b0ffd931db5de30dd5b6054d0ece4794d00753c58598be37451400e5b25e6a84ae72fe92c207f006bfcd23a0350e0625240673514409f82b5e17bcd526f032d299ef7f87c468de8db54a4f937c266fd5f83cabad9a6acd0b27617b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000208acb1c91d5b8cbf6e10292efa0437e8ee4b7f6a6f2272ab86858ef2fe54a253436e9fd650130fee0e5f3e40d77d3d6ae1861a46499fcf4b35e3e1b89459c8d2f828eec5e2258f43d0644ab1e973ea6a8aff25d4ffe2d89f0b90fa6a90d099f594216d53cf814c60ef0173b55efbc2f2c12fcd6d28bbbae7ec886f8139b5a210213734f57dbc180bd073482eeaf68ca0d41c8f243ad7b100f25b12ffb1afbeeab030b744e46cb1546f2d30993ae6d441ef7397a15a460b5dbcecba13b2c3ef3cecc0b037ede8d18c2cd16816559a9b9c75e80289baa7256927d90e708f72db79caa939f4feec3c07ae58ff910d9baaf2edee564e674cf4fa49d6eb174aca63e394e510304ffed07fbc422c9200a86461f89950d9d8e20d508a8d49b52d0bd04e983e25a032dcfd56241a3fbb7698e22776eda0515c60febce53e3546e81f76d2f23ad2e36031910dad0c4a041d7aed4c10df364dc85b40b0877ed1cc98c4b82c97163be3e54032bb9e5d94f3e262d743060d33c9fdb08dde35da22313c7973207df5dc4e9ee37031da0f75460d8d9a1e3412ee72b8558057f3ad4d512052948cbd5434d31b0dacd2adbe2114a96e397e633a39393f248f0fc22682cd089bbd40a71900763432238f98043af936ecc92afaa7cb282e2be67319e6193b432df011a698b697331b50a5dc0d9622a2288ee1218c45c9ce80d3e909b137af9da73b34fab0a612e8703e9dd8be7f0f83768f14bacb3e64a284be94615efa29ddf09ff33f8e953363d8ed9e8d2e4aff2fe2ce5a4290fa8342e9137698bd830a4f435604bb8e2e46800b2697786d9a6a46db60716dd8a7ec2c43ec9f5a79b815a0ba7b4a12eeb78dfac962b2be6505534579d882435e7c8eb4d63e29f57b969a16c2d654e1f3eef6c487d30e6fc1c846657fd8979d596e40dfe993a2aa6877983140060e3a3828c0a9ef8c84ad7b0c0db8bbdfbca8fed0bea90c0b549b24ee9400becb6dc0dc00e4ed9d047e5eaaf99f6cab6921ae8f6bcbf7b227e235419b25fc72e139e3a6f6517c86fac35db1b0400a4819f77ee22422a1f1f0e7bc74daa7866daf55bf7fc829456dfb24f5ce571e840ea18f083808b6c6bd286277f0425f03e1e7eaed657606182108e8ccc71932db74806c2414ddd76f9920c3775d7e4a5daad59bb7b2dc0fca227f0564b694c9339c27df309e62446ec62c10dcc74c1d0b7212c1387054b9250dc889bcb358edf015d93ffb821895ebee86ff15f5cb5ff87c9fcfb2280585fd5e39a4554ec1dfe8946a1fa5cb4518adfb079dc032653f7c7660929c9c5cd03ce1b723139e5fb54f3610f048a7556830838db2b45bf46e3d00ca566326b5062b81f81cb0316241430672cdca11870967213e3ca69db14842c79758973fbcd9e30e894c980214c27645b060a6b89d441c08b680c36fbea083b51a4d24a23b90cba03575db180c070f1f95ba7992ce83d665fbf59fd04772ec87b02010dc619d00aad903043abdc2750b01ffcfcf22b384c99fa678c7680b2c41929df93ac5c2a960504f1c029245ad63efa8fae999a2ae30bc412e653dd2c3f1bff8b631f443dabac929e820521cc571a01518db186c5bf7f0caf8f2be454f068c733d511fd592a1b6237243477ed68a8e1dbf52b49d5d5a90dc466e2ea8f3e5bc82d867948b24c46ddec98e34d9682c1b37be5c75b512d928c2849e64d618d43bb70777d7511269a4e5361eb12dd3ffe2f7626240af925c6cc6af4926d0349ad9b46cd03f3632c0006c7afd79e0cdbd4edcde1dcc75e0d6af6555ab94eaf95a3cd277d2313cb574aebbb5b594e43545d50db4de643b40047bc6aabb51218a9a84a5185b7e5047749ec100fd24613b0e6778702e3ab21439cfb41dbbfd448aa9dde881c8b0d05f796471d02be16111f33bca4b0ef516025f34e11ad00ba331b7fb6e120eb9016e799b09acdb19e21180b3bf46c6b22c185c917b3e10e22cd3ef5eeb42aa5d58bb52322d63d71d10b82246ce74cf5a8f4415ef69a0790b11255893ed862b2d85e2ae593d0066cbd91366d1810dd9a375c4265a7adee7bb5efa636e3eb561c32d171d8c1d139260a300b89e5c0594e5979238ca558cfe2ce7d17c7a1c5230352500d8bafdd354f62b58b9a2c574ba9d568311855f8c4b12a245266653a6e189a8683f1e45298e6bc3949b705dd28f13427127a62d50dab2a75f18105c5a5a3ed501ac50a61add467bcf33185975db725c4836f5db72ee53562790f0369facd043c8b5b07433fa12b7d18aa44e9a32c65c06f5960580b35c7810c2cb2791faac59eb0d5cce31a9cdbc1844d9ae0e163f9ce20ef839c6f3f99692e51d1ccbfcc2664274bb09beac18896b19f48fe9cd8c517b5f1eedfb9af490f2570eb6c5f015308a61e451ecbabc54f03d1b94d4abac0fe9dffbdab0b", "5153635163516a6500", 0, -1865180023, 0, "79aa494b3ed345a3a3f229d19722a98b17f0076ab81defd95ab15933122f4438"], - ["030000807082c40302c0b94b1f39fb256985a3943ed5a29d1154227f06962b55020006247b210e5ddd020000000951ac65006300ac53538db7bd87c0c049082eb28e0a1ce97d779cec1ae6b486b54be5c4bfe3524053eb2df8ad09010000000100ffffffff03a847d8010000000002ac516d91d20100000000050051516a000d8ee90100000000076a006365656a52000000000000000003000000000000000025f2f503000000008e982e50a060a3577d26dce6c3a2bc9bc2944ad18e71c3b2d9bc7fa620597ccab50b4fe9584daf38dfff66d02ac03dc5c99ab8a31a80c503ce01c67725ab913786a8815a85a99be577736194904e58f109055b6890d277c8124dd7a8038d37ef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f9c1685e1713eaef34ec23d258bb529eb8b9b53edb7c14436130d5c809b7c69e452a166d10921098a1adf269a2927e01ece07144268a9879a8673e4f1b6722b50a11e0ba753912a0c07ff2420171e6842525ebb2e475910bdc4ccda8e4cd441056661a1d2c31ab0c690074fcb2ee47864989aee4973ba7a762c3dbb0cacd0510322df49db87a1a59c49c6d686a1274f30432d00179d970822d5508fee50ace18d020b34038c280cf6f801d243fd6b1e8a1f9eabd64dfea60f428b828760c14d90920b0626d2924b8ee33a975f876cd80ba48f21d15e6bb0f46ed338284b7ec6e707c52e92abaa0792f43d42c8f8ef04ec1e8af2da6478008edbbe62c19b7d1b0c92cf033026fef2d82eea5597e186800aa2c3b936eb007d91d45031c775c7a6b3d61b2e031ffc76f05277a790b8d0506f845e1b4fd1b0a20bc4b56066cb6e3dfefa9ce62a021ffccf5edb3350c750af28feb8147610b39ea78d0df5e88ef41999b35322559b03210546ea14e85435329944232f8825ae7bbcb5ffb6c7d89e33e510153a01f1ea021f3a8cda2eabe9a596225c428b408bcee2853fff8b8fbe624ea2145a47703eee23a00dc8434cfa918e8fbb9372b9c144be8975ed2232fc6e7ba34ca9bc0b6bafcf46100df0df2d15cedaf6c2893f476cbd92fb8dfd51ddceab36c75d29cf86d8f00c3ef6b2204be2a5a998fafc974c68191ee0d98fe4681403b26bf480e8066fc530646e549c55b849dd934c79f4842dd698d4fc3d577c0106544bd4af30af6389d5ec0cc7bf60f8171652a97a9526481a6df10fd07478a8ab069ea89cc07788eec4de3b4bafcdfba2309fedc110f2bcd5272d87e1b9364b8813ac0055a3a638fb67cd1ee4e554aedb7d9ca517dd001320fe0a04668cc977081eae108a5d2253a3fdc0bd22327d06a038ec71e725ce79f52126cf3cdd6f1bfc1ab5861fa36ab6b1441a35eebb687870dbd276fb74dd1410e71505b6ccd8e1caacdc747fdf8bd5fe17dbac2085272066de0d3dce95fe26c99c7906ec3c386d8a9dda053c5d56a682998f5deb2432c3682eb2fffbcac16b014e00cbb6110bf6c9f4e5dcad5684e224a6faf99a7d32167afb8b3ac183027b1073aab8becfea4df6750052de5dad66102d4c609fc617d3e7a15b34b2ea0ed0c933cf4c651a107d3972c6fc51e691a897eb08c978ff4ac5186bc8df6b82f1af3dd8892e9f901e1db095d7b7bf3c085acb1875cf1bd3a557276a8d4493fe3e496668aeb6ff0c557f2b6020abc79ac0836ee6bbbeaa4695dcff6cc74bf705c6029f16ff9cf3812b0dda31fc4472f6763175185c3b930442468f7ed87881ad3867bbe53aace2b7f6c29acd905ba7fa44ad705118af373ffd9bfc79eb2a17ef9c7bc96d0d2c462cb33fa9b2394e58b7a205952dfae49d47a351fa00248c4d311e162b117a722d3cc229af7bcb5df4f0c1588a165b089b08f8d4dcbc968869c6d6e09ef30634b7dadefb155d02c2c4e736d150c4c629b09f50ad19026f9db7e2d5fbcc118d80d5e796b100735bfb250f9ee5b0c402b82d2ea81cbc55096bff674c2d8b0dd0a89cd913e549835092b3ccd7a07b1ebb7f8d43e4aa1342ec1cebc1b811da410ae25f2023a404c299e71fdc3563144cd437000e56c4dfaff08f1689a0ff22ae5f96df346d84d70762dfecda9e4344a10b2a4e0606626ac4e413937bc05d58e8c55c69efd3eafd6257170cbc226daf1389ab2820cb10decc615f07a420eaca2c76d1dc2aaaae04ada015e4dab8934fa9b8708c2c3979813599762229f19fd295826fa883a307ef747be787e7d4d658d9bfd55bba5505f90e05fed226d5b1f53c9f4a9a3fea3ecd35adf369563b1bef52a0ec29af48bf91ce4237085ec11cf38325e676c0ffa64d47c21b5bdea6e1c86bb6d11e5ee6ed6a3f553ca372ac489cf1f76e58dbaecbc5616b4b810615ed43e5340d1ecc917d44399146331ca54029b90931a0cfc1905501882288da73b86ebc511bbe61f13e039a3eb7852c20f156a6a07314dd402426ae68e88c3da0dd68f2f84c1b1dc8b04f806bf35cdfbcbdd4a5381d9e18e550a71887976733c37f51021796fcef4439b9f01dc052985d704f6fab58310c5583eaf1398071c31ba42827fd20e0a8912689cba0175c91fc242b3f2320cb1430286a4923e06563c9f1300cc6746672b47c3aa16ba6c12ecdd092fcbf81fa6f3287c6938e6a6731f1359732d37f79c2186d3a40e47d4646a2dddda4f687b2d768d47a4945d2753725109aa0ffb11eff159821fb0c92998426fd49a30000000000000000b66d5a04000000007b37046ba037d919a8e8721e17c9ad4a3cdfbbc74ea760cc66e983464443f2c0e29b096b3322abd3336ea83ae0e6e233b82c8b8ba823e47606806972a142848c7ff5c3463504f3b02a0b27f6edb5a7a637807e24990f0c9f1a377dcfc8959eb50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b32af32518379c41aa8d54fbd63a9bc0981266dd05b679d001f8537e371d33cc0f205b3652959d8014fe5f56d7098e861f933d86988b39df4a744297de4cf0ed9e404c56cb3431a0dab9d551414e3179c406d6aada829160514b7db0b063f26790e2e98e4b4713454fd2c75e27a5677163ffdaa42bc8367e26e992de4be1b10224dc8e3fd9c2748fbab8a4f97122cf79d823c03257f665da6776597a2f8326910302d7165b7bd010ed13e5b0a7e7bfcd44035a55893452d93063b1b6cf9b01df780a00507b0249465b077b293226407598e59ec29e70ce0ea6c172efc03bd3bb06761a95a7021c0753449cffa0292a0ed9e998625b889d5b4d268582933746f62492032a641fae4c230244ec435c73f0ff51b04c0d5c7ed7ea1809bdb5ba0dad35e6320305221e90b819c5aeb91610f175e9e81b87b39bf975e10bebe0b4083678322219022ffeed1ca188d3a4bdbb82cd47019192cbfe5a675a4e51105c323b5deb046000030dd0931baf71fdaad1a36ed69d17cc60a0a42fb733ee76b9176a9d24fcb5869d030d6ba37e80e7bb821f30fa7c369a5c9913481c2efa3f465e950f5c6e2b2dfcc066ed9b19e16bce33d07b22fad0aa12b77fd6fc516e26f201fdfd560918c95495d712a76e4b27b7610910b2e8511d57e99b292f1c7e8e1e2e87d0e4ef7f0c31e24c3912286febc589d93f5d45cab2410df1bae52330a06c618c4758df17a0654df42e52fac58548fdfef712525b2f935fa07d8a7689f04a1fdcc8c495c6415b042020b78200ccf1efd6540082ffb50f7ee6fd3abc67f12442f1a00b8ad94ef9311c4494c219083ea75bef7c093ad7597b73d49518960a9d572fc247673857bfc7517767889dad1cc4b5abfec881e5c024182634753705a19b6d7b6dd5c0daa71bbc805a856ed9348eeb8d0fe95b7a2d22307f298a0422ebd47e944d94c0ba2e714f4520abf320abc274c62100449e155897cace61d270c6aae4b9dd8fc77386d824cbcd6c7145c72b684fd2653e807d5acf4a37b2a3f6126a824ebf4497b2d097046f389cb28a57253a4fe07f43292436fe22be7d75812efa099759b725c268b64331887fdb3390288ef555c0444d6ca6bd65c691679aed8a488370bbdf3c0646177a82a30a1aa63ab77f90ca3e9f02a50db392f338af3ea6d07f3a254b48ef1d5217151f2b6f2e041faa45413b4021687bd3454b5210c3ca4919f304af3e821598d3be8961b0c7e8532fb0c389ea985b691eba1b27c104148b6673803572a44501247f587283023f6ebe602c04118f4707524dec45173caf15a3620b42e66c1c5465e95edb9b9bde55d762dd07d5160e24ebe5c080d72917ee90daf8b2b4de50eb5edefbf0e3cc28dcd4cd3ce2a89ddaf8aafcbb11cfb853a55d3e5b8e73a09c61351a0f4151e9596174252cb6959c39934c4e57b1c6816c8f0c098aba6d06e2e59fe91a02f05a6433e6ad1ef8d0dd0f1b42fdabedfe47a03eec2aef03243665ca43ce533518ec6ba99b7f4533cd30f3b7b995a98fd9bca415a7287c5dbc61e19f36af53968ab4cd52009fcd6d312c3fea662ce8fc4d9daa6d087696ad5020852ed32dcdeafca32cc2e468d0ccc9a429733a79f0cddac299f9950b949620ced65ef91a89e12d7054f2fd5e885693173d72ae030e2e9087dafb5572414685b6323a30f52280777abd3538ee728c022efc78b4c85a9a9b03965c7e802fb7427d2c49971b8635783496d2f355a7f5c6555513714c582fe1743398ab42e6cca3d3c21d1e63120cdae36c9b099f38ee6809700046b1626ccf8a84323a3ab617e40afc118d7486f761c755b0f27c5f6cf58a981d29f36506d4338d8203a2a998cd8d773d58ededa6981268faade1a4f8924b6518a797482d65b611f43c47022ccba025ead3310ce4bb30ba9545badf3b132f6acc69b624f0ccce1fe9eed4469ff7eac6b4ae98ebd659eb901a16541d34d8bb642b1ea9d490430010e86b877d8d528209d22917c16495100b8bc6a651d1c289720b131ec213703378ca2d8ae0e2dc2abbb494603d119f2821c62b3ebbd9f5e065be0f2f81469652315c5451cd2f8138db5bcecb469e2b7762667ff8bf90bd52e8f8f8daa91f624e33725b66fe3bfa032e4336df97caf9580803857242ce44eab5a3c58cbc7ae337be190b074fcc06366f1d3ead7cf391d6173b530242c3e19d52be85ab7c8e5e9e260b11e19808385b283182cb520de89ed2bfe787e582acbb0c81823d8ca827f5ecf4b94721ab398648d3dd17b05f22726f3e6d678a70f916c5b49f0000000000000000acf85500000000006839e28b4b4d9caeefa63bdbe3504a1a077c30d8081dd9e45ab3b10b3aff9a4767ce8597cf681d1f733f3da619d11958a551eccfc4061cbde06fe4a5e943ee83adbfbccd9ae6331f25f93577d90ab63afc8b6a85559ce67e5a9ed8ad6185a99000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c112a672f0f61d1113411c63d3591b6e7b3edc1ce26c7fbe2d6103b10279e7fce3522386973d24ad18944c320abee70cb5fdb5e44d6aa831eee0774da7d803e8a763de0c5a92e123d44a9930063063b68785a455b68dac0bcbb2c00ad075a12e21384253ff5805647b1d9e9587a2a9212195b3c6c1f5fb17e8816b81329797c60211f18da3ef20c94bd60880262235725dbab33bd03bc8f5fd2d03d7f3897e786c032ea5eaab7df33e86052eb210380fceba4436c7146213095dca758190ccfb87980b0136c9aa91852cfee3b8250d6f41091bf402c0417bcdbe0e301d61ef738de7768ce876cc9209bec54547ba9a7229f4dc19bc580d819cf63352e4a22be2df98ec0305369ed2a73038fb0477d38317939a8bb7b7c3c9806bfa7699c856dc577d1c090300d6413baa4f0cecb91d61238791ca29f5793b5adaaa5f6905ffa86edf8458ad031324e054ab8f987be6be671d18d17e4bbde33a4c2d4d84c332554b6d2cb0dba802129029a1b7ddb1f6b06fda9f3a86a8bc710def7b19ce57b70cacb22250a09357032363ca37621fae3a62f7e2cb269525b3ca99a55b2a87d279edbc7f8672911021a29f1a1779e55bb06d3dafabc924cf02cb20133295a89a2b97ff00a1d789a37c0ce27957b538e55e4bc14385e1c4d7cdfb656417e9fe3780b8532916705c12928c6f57d48a86b7ec02847006db65afc15d66f0ababdb308d97e54e84ccc9870d23456377708b4da62e4ebcb79e7b184cf6339143d02b6e5d0d1f532892a608d8c71220bc7901cb25f5154323ffec2daac1122c0ccbaf537860c9a96b528b490b1e870be275ce3d8941a23dcfc7741e06fd2c6bf684f2437fd400c066a9f7cb637fa6b425e22979b0d52d91da9a145b9da3a5657d08bfc7bbf5125a6d9cd5359c8e40f6db5882d23b59c1dbd13933cd652efd4ade47eac8231087bfc8725613321ecc82742e0647948b35a7591f85671bd068779feb42515bab135ed92b7ad98d544b2bafcd91aeab7d6e765c825c3daa353bd6f9354ce791dc013f600abb8b32938db55c24b307ebb34a5d69a14ebddb78c707081797397b7f8d7c77d9a787c7718949aba0df52980b5b2ab18d5a4c80b88bd60e9cc2a888cec83a08ce1f886ee6dd8695abdf8dc06b2ca4cefbddd023ed70c4c7a1a54d0c107c6c2cf6edb73035bd32215f35846ef0c57a5d74efa28afa826ea9b2f968dc1ac7bda3db3092bec00df2b708d300325a75b37de5beadeeaef90c2f16a2cf70db78f9a0c71867bb8edcb26baf8e1cb982b97b266dd4408501f31e910c563a64a94758854c396c870efa11f28d6906eda36e4a21ac16de0862443a2b18ae1c5ad8556f1decc105b8e5d9673b869603b8b96e516cc9ccf305f6dfe5a6470eb3d2b2808ae5e682fd2a884fc94fb87d78e04d4a44b7332862b718588d90c947750808f3b081c7364248478c7f8a737cfd86cca96062127a2851d9a7e8c5f5fa5ecbfdfeb1db16cb0de32c55144e033fdb72fa640e8ae6740a82e01b1fb97ab59f91fdc2504c9d648472df0181688b6dee8bbd717b869818f40c579fabf3e5e242632a86c73b086e309d0eca10d93dc227b388e15bc8b49c9a4a52e015a881f42a74add02cf737b0fad9fb5a290f254ad97bbf7e32fe1e46e1c00aeb810e54ed9cabfa8925cdc1d09d07f947cdb9860234a31eb97e332bc0fd0cc311d63a994527c5bebfdc84b2be5dbfad7413316d679bd0e2d524a62a45a5463ba3f8cd30f7cd792b4bef1a1118d312b1caaa33a106c7cfac6584a87744d5cd7b90cab0d568a0a21ec6fd435ab6f03196745dc1ac3c9d6dbb0dd564d3714dee8609d0068ba35b5d5c016ec9ca429db1be8ff34029d733c0dd260d7b3ba785c35a84b7ec743d044fd31da0d1ca78e183d0f2412605519c611c8384f1154fbe69f18133359a7c9b81bbdc1822e60bba1421b9ccb122a09547643f11d3e2fef81aa03843b986fc45dda209458e76a889e5e989ffb27c89829370b38dd60097d9d3eabbe10e3309054f1d4b07ce1f35f6020a9215fe86388fe2adac1fb8794d1617d3a4b00d691735adb9999ee71b390d622e16d1e39b29323d8f08fc797e410c2f681c913f124a830e0e3a75b11a752f5fac93563f3eabab5eb06543ab7d57351da0ccfdae8d673daef1bcda8dd8d7f69e817cb281c44f8249c5d6b107d3243e8e9ed4a56b4e9f8d19353bed5b8ef42467cdc3c7e0c674c9c14474609d24447e913b5228a1dd660f332d804ff93c11fc48e03eb9a995b9b9324af2c9188931ec1387dd899c3050eafbc7a1f57c6486b03cdecfddc6cda16ca602b8fb4830b68c0c376bc80a5f699314e430373ff6f44f19920a41939da2b7bf2dbbe5eea6aae27fb24fdce5151cc9e314a1f33ade3a7111230e1f529d83c7d7922f31d5b68e6fd88d05", "51516551", 0, -1984649089, 1537743641, "2792dd2156c393e85afbec19c0763f87c1bd57de411e47d598f053061b58492f"], - ["030000807082c40302aed691691ffa1c0e38ffa17c946b60951afa6b2207a3e6d097a576da4bba603b02000000075100526a536565d038cf00532197ac6722aaa5085d33a0344dcb3a4511a4c8e90f97d58b21b6303939df6d0300000007ac00ac53acac6a903934b3045e9a90000000000000905ab2050000000007ac6a6a655352ac565f07040000000003530000ddbbad0300000000066351516a6351765bd63c5fce6579020000000000000000f507f70200000000bd5bde63a025297c55a2d01d656f58a068db3468aba297fe96801d7f369fd67cd8a848f64d00078c578733939aedd77123f0e0399db0bf15d4d5b68b01372dd70719a017258bf5c6bc727235a538c9d0426e2a6d5c69a3cdb6913701c6758e16000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d92a2df2ca2e13c9fb210d09a4eb690900787ef58e642be002627fd783b98a291b918959208f4fe7b8e4023a1a5e46394b8ba09944148e0086f40f34a6854773f581e9fbf0da86ec86eab96480ff28063b422ecbcadadd83256fd1e0e7281c559e5b097060583f05756cf0eaf61e02bbdf374b3a66e0e242b39c83812802df4022ea9b8a572b7cb9f99c8a357d2628615518f7fb268d8d5e91d78953d90d36e82032d2488a5dd4e410d097a64dfef756075910fff49d68b7e7307e78682375e8ddc0a08dfb8314bb793c59ca17f046845967ac5d8ed115c06184a7a035a9d79c4672679391ff89bacdd67b5df54807de0e8ff0762d922328dbfd292fb053411aa3d14031fc5a6060d097101846cf84de6e47f2a980404e977073138f7aa0be5c753063c021bb5ac07ec55d1cc4c36175853962bfd8d8afee97830c0d50445d0aff3e35bd6031a475304eaaab12e8a771bc46311302fed18f2077127a2f2b1cc961fc187895b02210070e63eebc833ae9cb1b1a15630acdcea543613457ef919f8a4931ce99baa031de09f39c58ae6af088165bf9ce4271c7edb18ea0e23b8b87fab70d37c27b9136b129d05f81e8a37ba3734294201c654048c1e72a2cc27ee2ac94c595b1da6d92b8dd001464627f9830f5de71c0ce8c3c0195c2a4008eb7378819b7897c5c09200599882af2ebeaf195b14aae7443a4e5a994acce8662f691f9f97e6ba724da1628f1564f4bf1559733e60011c15e44b6a1a36193c5d3ba0eb90648bedfdc5eeb2818948f8786c21db20635f8ad0615188573e8e26387b7fc74d7f4d53ed1da40846080f78a7a5609158a7e06efc09decf724ecd046c2ce0c5a68feb35882b32ffb6907f5718d299cc1b7fff29542053d6670d5b003191cd4d9397514f94f6eec6fb14c244edf37c10912e7f90671a4b01c06fcca0433facfa21444aa8829f466d7fa7f8af32b70170e71c4c9fd686678706dbc426a101a5fdda90d506edc58a5540d70faadca5b78e37d56856e1de4f73383002a2ea0efc02fd659834fda18eebab1edcaa74a66be3848c6184f12deefa002413bcc0d4f974307ce5ec3b81afb28a142d6fd3c8cb21facb652a16f995c474ee8ee55c0d0917429cbf676805bfd4926dfd4551d27256b695b3016ad7bb03d7f4b4e95dedc3c652fa51fd39f73cab66efe122175a9481eae8a9ee495854651f8ff90ef65dd6083d78b3a186fd0ba383a130a9d9b137200a7825fad25e88af18e0c663aadc1ea24aa07bef4b9b39d7bb913f5aea06c79834ec2ccfc807e4e1b2365ff55fccc9d561f7e9f0e2e0f74f503a31bfc18f9d9b88faffa41d40efccc704620913da601ba34658dcf7916cd6742ac5192f8afcd6db5e017886817f87b80ad8ab8e9d29a390d65cb39126f69e449cbbd46218d04b2c2c14f77910fe5da447c1416aceb1f6f8a95710d20477ea73c9bed173cd331dafe5a694aba6deb67898a114365376c6f848d6d8d203ac5503793557e68dcb50c97d590dd3e0c35145011c3ceb5432b1ce3bfc7218249352790d98f9a6bd366933a91783c1a587b4c66cd2d67250292a00eab9b79420050ecdcbb9744dccc02844001de676af98cefa1b622419263f56e14462e7568d48ea6333b2d891e65f0772bc2f6729683f6dc047b8bd7520f4b5a214cc3744838b35e912b9a296dbe6cc0cc055a9f3993dfb7b6581f9892c26e44d91a009825d6ab44cee4385950da84169c4ebfd8a6048023d440041d94ac9bb168390b34e4a2d81fe80ee726bf46336ee781e9b04986f56ced2d52cccb3c2af1d117aea6bc678882ff3f7168e77af0db1bfa022319daf92362cf39c9656db719fc852b5dbad82d57af59c6423536883b2458e00bfbcfd0422f4ed320b0be8e792889bded6abfa23728b29c995732b9d0473e0756271779dec4f82f0e869601dbb79600254ef9dc0a0464179302690a6ce4efba75c7f5c4d022d13e636d16c5e9ced07195f5842153e8ea855b08c8a696d1de92c41b0911aceb5aab9d23c3d417c50352d8ecfdd15ca0a1f4c8f3f72cc25f4898fe4433cc54767e9b9ba33d7927c3996ad806832835bf995ad895d858fe39f0c3999b67340e22443c2477c4d5f60806fcc4282a9783131cb2043682ca9842c44cfd4a0d59a204f063fc8871a2be2f139f3cf9e49bd41689a6b005b9c600111ea92dacd984d9ef29e134c75f41a51c55a0c32878b977cb648306d1c93a06981e72cdd34db06520548703284c51bf51b0802096a5bb12ed590f4ac505875c7ec088d10f1aa2493fd73aa02000000000000000000000000f30f68abc1c23386671a7ea2bd9f6501ba53e3c5076cd1545f2e09eba525cf00048a75035e3c1bdab8ee99addbf580776afb836406cfb7c8f22d6bcfea6b4b5f92283f97c40e525115b37ec08a0db0f4882e321e694057483cec0293bb86780d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c64a284a6f929d04d025ac679fb6976ed32f4e5c1e7809de33387e4aa2ca0926db4bd6d29b4a87bf54b7cba418b0c54d6f907f899ed8895cb909e7965af098287c8ddc65e17662cdd280f5538787b6c0027b07d932f633e96bdb7912d2b0f246a6fe6d40befa4239c6723bfd16d2ea734d67f7eb8b8188b96800fe7b65ffb23302154c61f45a6cc2e39fd8fba464c9dea80db2b37800cdbaa4abe9a840784702e2021543e1dff28e915df4285722d229ea1d56fbe7b654828a71aa316daa1e93531f0b00142d6b4c3612407d1710e0f8f3906524d48eb4a8666807bfd11fc1a7b4c6824daf6beba3552a5d8c91c7d4688be9e9a5de4643110b242632e0fed94a4acf9003167a261c85d67e859d42bf6dd08f96304d37947af497df403e345fa24bffe94f030f3b67d9959a2ce714193e9832434f2f5aa6b1b2a868da859a5e055f111ec5230205f1ace308c40023868b4295fcb55ff79c96b923edda1b7ff3f2bf3976ce5cc90320a5b49e5874438e0c1a53ee94be4372e76c2c93d2d827cf36e3e6e7e375b4aa02204986842650e88648c8ca05e9ea165a6e8c0eef184db2acb2acab5c7b6f8b10e93b7fed459e914aa4409f447ebdd2d0472d19f28bf773569b6186f59661c4e4b773509e04645003130d99e96ea269812a3c43ccfb6325c46439b9aeca89c52c6d09ea2285e687ac34b14fbea28a0d9c63fe3af36131db5fc721c0a40533dd4d1b29d6a0bc34a9105c255579cda70f7428757fb38c6ace97a3bd30539e2ac7a5831b123de26cc9ce7f044ca3574b44659788c968f682b3c1918ee8c599ba08bdb72a7b990cdc93a8710a10ba526b46e68cf364936107ae038459a7aacade032bfd8100eb09a59517f32541333e7b1573d38cd65143af3f713ae9415c5440164858dbbd637e141120d500e3741c8dd35f46c2479bea9843a61995d64580389c809f4537a75f60dee61d36a53a093f6d3d89972ba1f435e5ac79c2e5da5ed3456683e26710958aa4b538db3f25afb7489fd75fc26c7098321f83c77e6e2a008fabad74f1fad118284310a641b7c064cce3b8e1aa6e0ffb88bfa3111cde4946c87d88942871b57dcce75a996f700b053da606fdd7e62cbe9432537021f310e6b5a7cc0a16b0fb1a89cbef6eb7e68fbac50ef6f6429a6e63ce206b32aad95b0525d631034eb41c15b1026f8b6a89ed20c1b44827c4ff38ac49d2fdad39c8dcc2af2b849313346d801fa5ffacd312f67bc8b765da09d26245b8a8163db7f75e0ea5ad11f12e548b61cfe05336570ad07101ca6bdfa8da1dde870e812b2a77f6050e0082d020868c3fae3a49d7bcc0af64fdad0ebcf3281f7c3b477d951d9b6a4b1febeddefc371a354d6c9cf982ba13d52dbae9c6de22f3de9539e53b218d281d2632de7a151f89b31b73f7ab36cdff650f10dc42a3bc773f207e52e7110924b1096c57ea80428edf4efc03a2dea07aef7b2602cac94525064ce122ab2b8f577bd1387e4841b2be9395a0e5b93b640cc29b7d43a1b2aa7e603abbcd19939807208441dbba78b21ccf5a4b650adf98386bd02a85aca904ed576bc128dfa8caea7e8347e44a228890dd415e6040e6de06b7b8fd5e52cd5346ffb3f3d475032d0372efa2c748d0a662e82d99b8ccc753408ea092bcf5df965a5423338f2c4ce879449c23d1847e04805cff49fb6d8d83d4a667560e2a4b014ad0c17a2191e82c254fd0257c13a3f18f8265819392a59ea6263651a960bfed5880a41754c7ed302d662d041b60d7f07aaf4c47b4f883a1104e569c1acdb195eb5abe2bf8352f4667d6e681cde18366ce70c9dc4c25e4b17c4d96c7b25146bb7414f5c5ce628dd37e0609b58c6047ead40450cf3c2c84fc379894c4058ca1eb1d3fb3d6526a2cdad8cf194229c2e59595bbf44decb896e80fb633b41dd53bc3c64d231ca75adc5893d37b7719681d75461043604029f7039e6a92176ea87deded94f7b8e689c9a7e777f72b7628e4b999998ed68ef1fbc3dc07c5ec9f4d22b1dda1d1c1a7506c35ee7731302e91dbc58b2f5a0fd91fae5bafd80382e6f70336fd248b3bea8b5c1dca066622c0ef0fcd46438728701335645dd9250d08049443a93e0e8b108606b8a5f3702ad213d3a19408815e91a7a67284c17a99e7853b828132b8ee4da389d10a1ed83b0c1dd906838e1ab1df761aaa7f646e58fd5100abf28a662135b2a0a09cc0b1886c7cf5d744cc0fd67d15a1ad7d6ce1fd181263b0b217ac088695c75707d2bb7626f6866d6c5e709b1e447ac3341b3f7c3dc3fe85ec033f17d6e1e817cfe41bdb63dec0fd13e2fc373b376bac3ff057e989a18009103b341a2b69a535624979e11ffc482ad5e5a3004547c8afce48c74cdcbca4c978ec2c0c39dc3d7d9af7d191fdaf92c8b028c4410a8b6a44c3dbd5fc0c01", "52515163ac", 1, 249204349, 1537743641, "2bfccd8ca43decf9c59f3f97127455f72de4dcea37f978a8814aaf7425fa6218"], - ["030000807082c40302fe3b03fbf55871a78f7f72fd81dd900e7a1b550e5c11a61bdf6c803df76b65480300000001acffffffff384f31fdb71660135d02b99d30466d941f62074d6d9321abbe1c33e192ca0f0d03000000056551ac5252ffffffff0320afac050000000002650091330d0200000000086552530051006365c01711030000000002ac5100000000c2fc7f5f010000000000000000d88203010000000040df162bf0237c868f0fadc4f9060a3ecbe5bc4eb05362d018f163af1d4e3ca75d0cc109df742e926862c2955f4f908c06cfeefc13bb39482277f8691a6b0a0275fe27250d66166bc89e4785b20b79c06dfa7e4828fd3e9cb30285b29a3a8b8f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f0f005645b7951b6231dc2dceafe43e3aa77e31f900541b9364e9593dd00f3071263dae30a2d789fc27d76091635481b6b9df48f6789f3b70af89daa4f2f4b5af520ee9d8f36a882cf77e577847e65c80e7561bda2f6309e4652a4b3347e1e5276f5d1cc097424019ff397d9d995f9f575772a41be6be991be8f7fa986f3ee91022e94658d0875481bec9c2e762d3d6993d7501ef337c8d928083e9ed95e30e07d020bd2f75d5b1b8b0c7f5fa40c281b50cf5b4509233011ac61cb2115ed1c748dd60a00e2aaa068b5c223b70c3081c6b5b4bdef41a6594c7dae39c5e0d7175e6fbd6496b078164af429a0706dc8299ddab7e7f150933de7b2632a79973a245b21d7e2021793c61c4ce80d6eeee51639443746657cee9897fb3062a236ed38d5e7e9b6ce020947183ca49502a2fcda97febdc405282aa282f1d57a0cd2ee93b6f6a8267473032d5783ef11607f8555e4d7973053e23e80d15dafe56b6a3d3f9e34268f9b1d8f032bd8a4955ba1a47baeb880d0bf551edf1d3ccac31b1d0b3e6076280a0c4bbdf10319e637344da112e1c36306f5325ee2a78dd18f8ed72ee41f1150170c50e351833617a0c55ee196beb32af8e93ca88d85a8c920697d08f0deaf0c0f03b5c45610844f5e6c116cdf2b8358e1f67d0377b6f5c1029227d102e86c951833da1461a6396efbffc4da4e78440b710deac7afbdd27524d7b3d53d3135d2634e1ae270366890b504bf72d6922f49e9df1015a1f04a5e0aac143c3c4542374aaff924f463c08879c32ce4dc31bc0a905f1dff7c5596e8384511af9891ef8e8c0d0b8b450aab68464f9de4fa2d652091ce9442b55923d611da418bce29a50ec5a845623a7fc796ac4fac7c4e0f135cdde1aa14841d2ebf01cfec51df89e2bd86665bf89aa65c26b727b4ddc6a1f0455db5e152d47f768e053284ae81c5ad35028d1f01492595a26fcd8df8546fb0e8289ca34d714a25caf37028ac76bcc788274f7665098c72ffc0d4b774188e89f79899304f02fbc17f3b08c19cd00d4fb1e071ad462559f1ac8dee56124151e95e318ba4a54efbd1408ee9d3bde4cdb47d32332a9fb0804e969db8a1993a71aec683b1f247c5b3009f97266f7a22933ba14cd71593681a6428fcefc621ade6d02ffe3d3d295d6272264560aa7cb9ce23f897574c3a12f216870500c55d256be20eb804e0fc9b88eb13dc30cab213c8337490c2987463f3ec496ed553526206ea31bd0d2da6bcea233e999abfad255a305cd85641e9f169ec440f49c6edfcc829cfa870718f92f3ed6ebef8c6499de81d35633b2f37b4be3494ae6e79efe88a974b210e200940f2674c232c2f65f524149b30fe9b481cc45280d92c6188a8126b0fba491f56a43e1c9e64cb6a3baa6277003db0103f58652a9b19c39f12343767f784476c295a0b3e495e759d0e9d55afab17c2090371b32cfba60aa74fb4e9c5700560f8f8a95d0133c2ec2874db7a4200ef0fdf702f62fcbb9f86c3058505b25f2eab828c1790f9bfce6fdbae13030332c5eacf7fc2785cefe2d927572ddacc7d696313b42d5152d81fe5ee15193341a46664c68f9ea89adc279b07e766ab688118f3afda76e52b4dfde2060d28297e6844d196d1aadda52115f44455436d710bdb75d9cb52e47bc68f1446fc9f45f604f743931a200cf8f716ea5ac6d1271295f5a582c8a417a10876870598afe10ff18f8d2af7be9fa81b86b8d9e71ef8fb012663b74878db333b47e84ccbe8ed98a4328b332f7ee52d1b365f70d801c6f7771738a83ba64409369da9f8adb559fcd379e17ba4085db36fe57aba8420feaff585774e89a42d79fa4e701540ae142633bd1ca9074f0d10b230d757609c69d4ec43610ad9fb766de88d6baa1600e0e0dd7edb353b05bb72fbeb86297dd17694f0d069a6cebc7e71b0b31152212a7a2ee8498e70f5d4064c5e9d2e25956b1a455f67427b8cb6a0ec65945efd9fd6d105a3bf5236e99f8363591e3ff3b6ad743c745562fe66215eb94f29a2c128f3920034052a929163711b331f39c8445dbbca5bd7b79e3339ac6233325f1dd6ae0b1244d38c7c1cbeec6e1c41af29facc5bad54396bb8b7ca8608f9f52fa1569003a3d0802a43ba6c7e6c829e44716e6a335a4ef5ce2ca390c6738e029f43d96217d12fcd7613034008841c26b1723a54649da712da33332967505821ec970ed573add982568d67027643d92eec353d484135d00161a0d950b92d2e5fdd7e51806fe49bc82e219bc3a34f39f93d29f5efb81afba92e9e4cee52e9ead29edec50754b05826281c4a27e3376c67259a2f9cb8a71e376dc75c3a34eb66ebebe76ad3499f06fbc42d01dc5ae660591527861ead3806b75d191890b4f63de6beda1532742c0153a4ed7c8e9ada5af100b3efd5efb5812dc30a3c29e9be08", "ac52526351", 1, -1396718227, 0, "f7d8d66b18f0c902a1432a3a4fad9ad0fe9763839e0774c7dec3df2d8235d334"], - ["c1f6fc22030268d29309ffe458cd44a6d03792f4391304a777e70d425df4887ec4c23f28d00300000007acac6363656a65ffffffff9884aa97561e2c39725e60aa09e5a153b78d2576f678a8c5918da9925a6834bd02000000026565ffffffffa3d95e050e8cdf4ded056d3d124d4f84ade11720aa08a1045c1b7b31b74f7d8f020000000200acffffffff02c811ca01000000000752ac5252536a51f46f90000000000003536351000000000300000000000000003f25fe02000000006e693e99b9399c2d5e16d1e6974e8e63dcaa5b1469f97e8fca7c4240f5836973ea383fd0c101ea2c280f30407f663a43f2f2c0fa3331ed799ff9045eee45cc48013849637ce7bb6d94dc863b8d00c78a44af891fa043a40726c580080697df7c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ac029ac7807013df151dfc1068b629a94db5f4dc105f865b02a9665685e620eb9b57c10638a357e631587c4c28ec99a7ba8cd200988cd025c0ec8868c4922bba12dbbef2879f2a69ea01487e2b87113d73dfd0c25d75347da2c3d0fbbdb3d7554f8e9da8cd428378d10707a964dd0019147870499f7af3f50dfe6625d089cb20303440d622b2747193b838e69c97b0e6bc39e5c37131a85620880d887928ddfad021e3b4ffcf6a5928bf9d51cb28fd03d024c22e21b414b724bef9bb601860e43f10b0710530f8bbabcc46639c25a4957d98572083ee8ec5b6bc61e976249963c7695264aed82c26a9c247909b8c7660dd8d6f095ed216458f6755cda63e9d7bcbafa02276058486a4c643541af2f18feb6cc6084d7b5776760e1a605a3bebdf525664c0202df0a027fea55bf4b6fbb9a41226730ba1e90f4718443be70e0acf1f04221e9032e7a16628fd9a69b45f804946093be1bccf9e9a92483c13f921ce8c312462e060203926f7b1458bb734e3ba2acd3c2209833013611dc6a01be8e10d6ee3886bba6021235e25d35251580ee183174165d53466f1d07bbab3ac6eeec269c4db9f8a4d2764f37deb33e8260ff77dc3830faa957241357ac7855cd393d6039112780f9875e01f1d72b8f4aae76c23f20b3900c12a786401c92162004d3995cbcdfdfe4fc334266b1cb5cba19e4d915a03a4accfc319fbde8c04a3e202565389d2674dbd32dec1132c676b170715283c3d5441ed14818ffd083823b6b93850b5e6683bb278e756a25eb3630bae7b601f241597ddafa3760d65d8556694eb49e467a3f58d172b49e5f27321e62ceb74102e0b3b4b70765c4940180954cc223a33a6ab8b7d0e977ac00df8c7f61e132d1863b6ee981f655694680ec00fc4aecde6353a843232ea5d4b6c9c185b95393a2e6c95c48226bd9a14b4f329c560870320f3ddc4e7105eaf3de8faf42bc3f5a925e9ec955c2a8da81e9f6d80a2c6c8aa71ef35eec1f3e82f9e8e26e11098f0bc6815f9d015660fadacfb2a734364ee94bf1d27602a5d9ffd1f2623009b3db236c997180a6f25067e3017196941314a5c81a8eb2900970ae8d3155bccd05869fbb27e5e947e679f2946dcfe0fe3351ff0b06468be4e6b5726f93bcd6bb7bdf58148cb4c46f918556393b7f8f38fd3a6bcf3cc025cef05bae926a616a8f044080e691106dd5782c0b5a52c8dca07130b3fd03f8fd70bc4348a3fe9daa89140eb19f7c15c253106cd3734e0871a86b47ca3c1c10e810300bfa4475ef3f89f956ca74f5b738d528972a20d46e2f92e3630c38e4f9dc550473184ef5bf359922a5e4f64cd175c515bcadc06c634244cb639c9a5c32b9fc5e779e338854a6f8d9089cab6ace276146362c381225a57a501f9e93bf531940bc6ed15a088b2e52e5ca566722375d5bb6236e22287a66a1048fc22c0a6212276f98d053fabf9a51c835940baf53602432b68c0b560926d0c585b3f04d8378793f63e460f6a8ac05df592edde0d40cf7445193d94eb9595a0e1feece958d005cb846e59dd165accb25fc5b28169d0ccc36e66c91054527453e1a83ee6c6869893be83525618ee8fdf24e58acc48816939eebe9d5db2a03c963a6a4281c221866db590bf66cf9082d8f884442125e13769a82565a4dc8ff0affdd94303983cb05cfc7639aa0865540fb50766cce96fde33fda7ddb6c0b13542a467fba65d69a8940d5c0918ff6b41c2aff440b585ae75f563d249e0687fd3e223452fa32fff7551fb864999a5c1327218eb4a1d18da391070ab388a6391f0317b9a035775ccf3709c16ca9658025fd157b65e0cc3d3da5bedeebb4d5ef04ad1263e30dee866590665c75d2543ce0ed4d633bbf6fe657a367ea846cd26c719008702a6bc9337ba688c56dd11968849dad7d7208362f83d200a7e8695653fcc4ca00458352a0768c7c82e90c2e650d94ad85b1a5ace802dbe3a767d48b7523e044f17c8eee5f3b70e96cce3d1a1b67f1227946e0cb06f48e2bea21078e4ce3ae51c9f919a39970e79feaa21abcb86ff7f8686d1815b7e5311a52d3878b7ae1c26f9e01a229b53ebf5f6537d39f7222cfa4cba1fe71c113a452bd3960b35ed24f36d86ba745a99de0ca185e8e15a6e64fb6a1382af5b361584293fadca87b807b47e71210b21c8a8833d3f200cd97d59069ef4f0bd4a23ab26eb235d6b79ccfde899a8eb3c90f1b7faf0ed93cc0956d1c2d98b3b0ede6e0d2074321165c17f501dabf9be8e3aca010e5e83aba5afba0c84b90de64df4355d6680552f55ff502000000000000000000000000b8d1cf98ab2fe0b028ac5ef5e74f27c110002983ed06e37cc70e63b484f875034a5245c51c3b509dd711475af593d984ae1137f0efb5d55ba8dda1d1bfcf7c007fc766ad7e359ae5199397758aece04ad66a2521ff92df756fc1a9edeb3def9500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd23b7d520da71174672bb6d70c8ef49831bea25bdfa95e635f107a64544cf57113d0abb6da68e0f6b1ffdf10da931b26180ba4784fb25e7d14532237e04175678b2a51e93b3ecc6e5f5161ce838c6bf213b370a4df302c8d1c3da6243d81b81d9809c68b04a78f53d6e198217ff9300431204f088dc055dd5d899e9ab7588b20313b4438c062f9bf05b001371d47d1d1e28952fc46a9b9ed125c6ba3aee5137ae03167cd4556c36baf82b5e0e678cede7796011c26c211578fcce54568697d4103f0b0420a72bbbd7ce4c65286f4819cea793747da9e08dd3515d3e7f94b8f11e6627d0985f09cf747c321088ff4366ca6a186adde53f8eae506e407c24efb76f8f97022008b575936ce3f412d4c62c32f992a9253b60d8ea2b9cf1d4599ad437f6d6eb032a376a7bb71dde9e24c486fe1e3b8f6fc6d363a36e62441e8010bae105684d30021f23e0c5814731dfa06493a7290ba8d1c5b90f1d62de25c7c8ac50bd970cf85d0218623cc3ca6b38504dd4108f52ccd30a8a96bb964baedb8af934b3ffb5408f180328699fb02b7afce84c4d8fca034c635d75ed89dee5522270d013be56fd8a08bbd67a590dfd60f69b96f82ec482273cc69a76d6f0573fbd7889831eb0467dfa5f818c585de872651af7374567afb8dd881a7e2024bb08322ec6d5cc5bf5eb6815a501312dc8de60ecc43212bd6866ad1e1eb1f900a9a725c3920cdc615d8308a8eaa08411d67aab998b1412571d4d2710acf104bb3cdf8df7cde0eb82dfa43ebac2f9c6e407d6b4cf503a259e5a30c314a78cb1c537d08862dcc2fcf46d021d6ceb00485bdcafb657748086995343046b766d17b633f26ba70dca4ef9509680669ffd9c0cdecc9fa1bad382e2077b2e662975dc318c4d8c256a4d686f2bff0ad89afdb85aa7ebd1666f67a4a45451c534cbeab5edbe9aeb7f48a8d58c960d68b821880e022d12173d0055668c59d79b2047e143f882fd0f6e773b6fdfddd3f4961078433b4b768225916a973f196bb0f3256d0f85f50d79956ca5a556177b6afb065d67a047b473f81e3ec276fee950f4ab73d4f9ea926ac8ed1197fb0605218ec8c697dd945cc87e4e2f6146cb71cecfb1c5026d6e05d1eb7bd691601eab6c4bf6aaa0e3a4604169e579f21dfe07ca72d591633d37b56e31c55b6e2d729fc64bcbd35b1be4f027f5e620bc0448ceb645093bad1ef75eec65ef66a13acb3e1b6d1610921b30b87a8588d00f8e886849c7a7f68ec477bf8c8ef4d73d627368f8176568c45d497c1017550b9015473a7456e96bb6d48ccd454821b4b8d42336419c81f117ade08265093a489f05e5e1d51a5df42930017cedaaabd1cd4b6311943ecd8f394700c8ed97f5df3be7baf3affbee0282e3afa36cc3fee60433b02618c11b341b52be79ebd6336c8f92300ee754f61f760051f98875d87284fe24550a2c00e0bd7d29a9512b10be7fdf62039638e48f2b4aa2195783bf7fa691444622bfd95fe1780236e7ca94038cb700376e5ec8f8218a7207225d28d9ba9e3b3b8022b892eedd5f65504a946c29a8bf7d17be264fbdedfc6c362b529d4c39f0721430e91984910d7bde4b9fe2d384c7a8686edaf717865d48a0225d293fef9b090463b92a4ec7850391ceb383ad2f93fe3228d98b1fc2eed21ccd062960a0b935758e2819d2d52a89ebe752f269a85362dd0230ce161dad2505109e92de333d6e3f174b30b30462e2629cfa7afa7c1ad9b956bb2e9af6642e187525a8f688846ee8696938d56ad7e9ea81f99688233b7f11ac47026480877842f8377d76ad727e50d5132ab89b34b667af1c0e5c2c72be29eb4bced98c60859dd61347165d36985203dcd3d14d3a2ba6be4c967e94d15a2005a8904c8b742ddbead74737655fd18acfda7a2f31aad816304aa0d53313baddaa075a745fd34a1dfa7af2574990df461c2eb6eb5fd84c94f6d67e81614cbba80cbe18aa42e43152a6bcfcd6f774fbef32278a9a34ad92afc1ed3988e4d6a78ceb1385bb5fb244f15452e6ab60bbd9326a081755f6c60624f69ae680e2c2902a08b24158758c8aa1a2ad268e0fdaf5bade7f65c91dcd2653255b792c1101aedb7634da12130c60df65bfb38d0332ccbba7cefe166655748d12f6134a085c09ea3686849acd53dbda26dda0a4bc18d5f5fa51bbdcf95fd5a64d879ac84fabda208ed62a1f8b1ef069d07de1ce4d49e15f2c915ec2c15519b06731627ed22118a5bd85682a94b480f139605f7ca8f77c5c97a809ffe17c2601540c28b444429f4ef4cd9c000000000000000022ac500100000000aa40b6c76e89bd766146eadf163c44a8f1b6341ed6bff5a6a46247d26e64dc9c88af7e1ab1b8abf189d18485669ac7ccc54389a8358b5927fdbe56b428a5f43b57e73c5ccdb4964442f98d044c17f8bf013c543921ff6bb5af670bbbf70d5bef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dfd489362e3899b25b78f16d2d1b4b04dd80e7f6ff0ac3bb799370aca02181fefd13684462c0c5ffda285c0d247d29d054690fab0f70df8163cf4af001cdcf0cdc38c64c86e86852e9c993475e670f7f39e1952249ddd392a8ef7997d45f3c13995fc1c4b3ec9d54eba6a3e8b14b47c5174cec4fc172f72c1f23e80ee40b84d4032111e81840f83c4acd603ab1a5f54c18d67fd0deeade793e9ddcb5142dee9c6c02260296237cf1007ed861aea85cf3027afd8a69fa30e299ba9eb29557ffd5c9500a074d097b4282ece94ad574d73b14564d8b3bc1f7db63619c7e9d9e92966646f685f46d8532432c986839bed3f9e793050ed0d01e4bd52e157f2109c67e61444402053829002964b905a55f4d31c5985559f954e0615024dcd3abde3a4a0a77443b032f86502a4cd640035affbc7f2336e5b47cf133942fab1b7f00f5f8c04584021a0213e9ea2636f98215ff45791075c033a8ce706aff084ef0732bce763b4513a3bc02066d1bed9a3914caa05dee704a2c1ad2dec604853826e863ed8466edc685d791022862314ce13fc680b75aa415a06bad52952b6c333a6d09d7621a120e050c7baaf4c28f77d57972fa637e41fd61f3bb3e5cca1351afe694ea632ff7302055d2bcb525146eec15c344635f008e0e9f632bc8aa6a3657b0fedb3810d4857e8ba239f54a155dffb9fccf76147ded525f231245e85dcc3fc73ebbb75269376f761213126008cc9dc904dfc585b60a274df1e8b0547edf1f6178d25d5895c51a84594b7aa883503c39a89d9d48a4f1741e29616a59520fdb951417d7a6d5448ce71be6cdd764eb2d698a0615e24e927232c57c8baaafc3e2bf290a1d64ed0ec9f76bba8dd8697c2f2856114d233f25ce5be417209e3d001d4d37233716ceb30b424176766bd97d7eb7c460472c0c01d5e146c52d0b4e354ce98644b9c655e7d9fe043d58bd7cfdad13ede8adde26945874a4466f3fccfd7cfe4194777aa2f547f35f4e923d9e9a01a973cc5d59f08be6eb6bf39fe76478f4e0781e526cf44d38d7b1faa918ed649a16a9eed8b490777ebe22c1ff4c4aa463e14df799786a1410c2258532b8e72728d9a1200feda67ba7195b041967e8c20f829b3ecce0474edda193dd6d23406394dc1ca6569951045acb51ac5851933bc0b4a9e24ff80c21e91520326957cedb48e972056f3c7de842d3d15c93e33ab2875725df9132c6ba45537306b96abbaac01efb283933de7ec29cb6f049ecd7656c9404ab0a0ae24be1593d1dedae3af41e725126cbfcf5438d56a5b3ddc2acd753380d39ba736069d9ac5f0e3b66dc2cb867f2b780359933500d2569cad8c9c2c9494d40b5547ad88d51870f44a9c8f9e4d42e9973bd0dcaa2336f6a6dde9dcc545a7fb491d51f714d8cb87620fc6915b79dcaec3471840dab68d21a4f232c50ad3b2c364a0623e11ab438519b7ff5802835602702b5dbff58fe4d33c90cda7f1b9c061fdf280ffe3f46f2b9687117aa4d3386629689602ae2210c4591a6b4bfba2e023cc94078cabdd6737f6b753d4ca0f758e1846cb3661736a801b4a86f068a47a08c5f7ee2915b24c6cb8c67d9d124b2b2604abd825d81252c164a1eb59702425585c5509afa82cb8394475b4bc1314b6bf09fc83c503d10558c2bcfced42e3ad00e6c71c374b6d15197f886e8273706831080b1bb0332bff33bc9b72a2d2ff51e52115b824ab35381971163cee2926cb416d175ed42a7a3c1bf9c9c50765cd0d940d77ced534cfc392a71973fe06fc482e1127b8ea5011c25915b036d09279f0f9630310bb876862fa5fb44e0609829d9a5b25c7fe7ccc438ba7a2ce7313164ce5fd9b204c5483dbb5f79638382727d521e947fc5ad11210216b71d52fc5306e4e2f8b2cbcbf31617e0caff69abc545bdb170196153a59b71dfd6f0babbd90f8bd96e2af06a8849b28b4886554c95790195a4bb8034566da70f265c90a12a79b7855b2bf6c568cbf1823ff29242b23c391a28617e1949e0bf44420fd3ab708b974485a4013993dd9c1bfe9d29cf0c822ef8810e7e97aae00c7be937d3089ba51283c4dab48babc2a5ecf32edb7d62e2f18fb4e54a09ba7638260d92119251fcdb8237d1efe512beff839a03cf1c7748aa418b7f17238f4e8555b7a7e0dc1a662ada675eda65b95743c31784e1f9280e55661155152a4a6acba5fa88c4d5e338df0ef5d651653f00822bc45df8aa20497e14efcd68db5b5696646b6156e3f1c74e6a393acd62e3de53a8d4a349844964cf6ddd3e71b37c72e7961a6c1d7b7f95d8f8c8b490e89817957fc336cfbb4f9de64316292832ceeb873b8cf98361c60380b6199d68a6268e524a0fcd6cdf4526a0db7dd4738c1589da98465526b0f67bc3302e72d437a2295563554d11bb0ea4d4ce9cd2eb842615b065d400", "65536363ac", 1, -1438639344, 1537743641, "5045d8458c88323b644c50cd8b0aeeb9657708eb9c39b2fac3f496f3a10d91bf"], - ["27290e0c01d1dd51217a12ae4bbb661fdfe4bdbe8eb96e88e00d877cd0dfe56d8cad20fdc2010000000100ffffffff04958894010000000005ac006a53534653bf0500000000003e2bdd0500000000045200516a9b1dee00000000000851635251ac65ac5328fb8da90100000000000000000c6bdf0300000000bcd0d8cbcf2b1207af8a08d35bc47eeb05d7ed80ebeef0c58ba7db9410bfc0e901eab49b20ab897a66d88c7ab56429bb7e702bde6732dc32bf18c1176d302c90635cda522504f20bc664b0e85b07219ebb704a4a8f960410e61420577f33c8eb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cbf09c984e5086811b5f712f0a6cd2318e60bb07803045c2d95bc5f9a31343f775141e1beb3e52d04916047f9c274aba294cc6b960d4d4b721a888e4fe61cac2d92680ad20343fe56125453a794bdbe78fa1543d4c120a5205d204762d23060b85503adf51b201673c497cdc9d62d753acff65c7e0855ef7d5eaf5974023a6980209ab5f214603ffd61df3666a7518d1a26da685db629deddcfcf68e271a5f75b703060b4ff91d9ff90e78c44a1634041f0042477850008fc599445442e3e77e57920a01056b1c4e1dc5e902e315fed7c0c60872046057ea9c170fd9f9a6d80248f1731466c44b48e8a8bcc14fa154cd99eaabd58ac7b00050634978dae687739d9b69022da9ae6455a4af931fe142e72eec114871086a8078a13b7b940d78c21d9d6d6402121e6f9587074f9d7f49014120360a07f5abc51c0ca0fe6bd05ced74378d4d990223c0815604f62fc9c8c151180df7b6fada93598a6aec6c7f136f03ddb1ece25303072a2c806a9047d99b33463a79d539fee26e9b4becfa112aa3ee2d56f5e17d8b0225a7a49104beb0c4e0938e373718a7422f3324beb30df486718d03ecbcef54c3e2e016415344cdb9312cf022d92d4ee95bee1d02eca7585168a41c58b63410cb1bac07ae432a4fd298cfdf99c8d638ccea1696e40e40a0f0f3ec37d437a65bb93a7adb39a4ee8194c2cc3e93b474284ad721980c45609ae449dbeb080f5d02a3f0e10e9e91d7e06fc0aa2a85e1df1d7ca8671bff7fdb56d2682bad410f6e03ab4e8df6c5440a406da4873975162fca82cec5b759675e6176e8481d733e83f720eee2bfe7008cd9f624344e1f727a796e386fb97aaa9bd006c992d32c7e00f3a7de51b57571eb0801f5f65c57f4e511bbcbefe4540ca636dfd1e18d50f5928bce62e5a4d3b8349e92b775d77b49bad985ea104a2570a30a56df794e5534d98150186b4fde294901221c25aba1d60124de301504b5053a5dfd9fbe2fad35def338668a63636318e012d3302313642d3b928f7fcc13e3349129259dd428410af1d48cd1f569b134a28ac8c0ee60b111f7041861699a81708170cde862cdeae0335a9d27e8a55536289b09f019aea4f349251793300a86d2289b97b7bb9763d49229ef8e635622bee0e195f940391a005ada4eea194b0b8f4f04f73aebb40739a79947e8e7bfbbcd35fff71fc8acb5043aae108741fecb4cbaa6907b293f46b9b5c7c689b885cca4a3ec9f1b0f788cba4a336d4e10fd2f6d71d72dd7937f4d5345b0de2ee5f3fae6ed419aeb548bf6ae60c09ee4540e34351d1f192ee5cdd6f25033b213afba2eb7d3f7a54314ab092c472d2a61b395748f4f08c6ee48f6efad599f341bc0fcc8775d07f9e6ff5bb2e95822d59aa556550a154a8bcdd52f66530c67ad1ac6f711ed23d03520bec72ac54f76dd897447977b6659ddec4f3af4209da726b0106ab4bb11ff06511cc7d4920d27a5177cff2f81bf721c58afb334824016f9d37024d8ee07ac1e690b00c913352e7f51f1c86d05219e7857bac10b71ecf3b026b713d2379ae977df265b1353b6800e79eee9fe9e305c3c9ab6c4affbadf28cd8b71f4804dc9df661243bbf5b97abc08dd9d7bf377e3842aacc286a8bb8f1a06f6a4dcf73807410f5ce412943d6c20cc768083fc3897c9b73411ba0201bf472818091302190e58305703034f511fe6a7974469a76a0302018ace5dc1ed7f3c6d371cdd4f6f433c23a57b035ab05b926a69351c43b63f5bc111570c731cec196c8f85ce049fe778fdd55b94fbe24d7cb0dac2323ec09f1a4e0ecbfc9809e88375710ced3bf9e9365a9fdf250f1ff018f9c35c439598c1f986c6d16ab6ba024da227b144fa678e960781438b023ed80cde98bfb2b6e5b8242aa6dbafa9cde7dc0b118a5f9f81d6fb1957850364e8def76508e216fa0c321ee335276427070d11e799b2590498e35788b930df623c59ee4db56bf0b884f1b73a53d45791183b8049479301908c29b1d7eeaaf07333b8d7643714f066e18d25f6d45d409bd2ae96423a7f45524b24e26cd02c2e565657a51b5fee9853e3d07cf0e584f4ac1ff397cd1808dd99b3c16c0c910a8088876d97ea4719807fdba7d7eb37334cf10825243ef6ffd11257b413802a7f7c3ddb428981ba467704a6ddaeaea6a5811d0aeb4620273641063b02c99f2f4bcbef9621cc451444cfb6b1d43664a36f1677e9a6bb7660dbd1d46096d13394c778098bdebcc81f97d325e2d1d7380717c98b7fc0806c3a4d3465ddbb2e31afc8c76607934238fdfabc782a813ac6271062349b65a78d1674a383d70a00f4cddf52b4e852aef7c950a52420890c0241aae785899c16ce7df037d004989a12d3d58e547a9744f4c291a2fa47c706b59aeca625a1c6837743a6bfa3b020dff724cb978bf0656cc0d", "53516363ac65ac51", 0, 1436337339, 1537743641, "f5fb244080ec7c9b82b85b42446d4b4bef708c07943a3f8506e9eebb0f7b8e0d"], - ["030000807082c4030489ecb60d1a8ccf9e5eb4b906b85c6fb7633339ac7526ac246b6461acdef479ed02000000008a9520dd610d60f92528f5760bae1bdc0041bd856f5a23bdda8e8080c9158df16153aa1a000000000900006500ac530052531b84f67016fdf7b91ac7d35ce12e696cbff6d4618abb80cbbe127026bb2e3c2456ae26c3010000000253ac1e8439eb92105c3faa5b6c4a7ef90d92f9f7e06803090416a3f9ddcb609ae85560bce2d101000000066500006552acffffffff041698090100000000007650e6050000000003655351143df40200000000036565523ce7140000000000009b6547a6000000000300000000000000007114420100000000920f379adc5168d46faad2a89c6a7f9e48fc493bcf8223a67062254dbfdff66acd41f82ccd666975e08ee8b75ec46862c77c822b9b22bc2a9c76bae5bad31b95db932de0dc6cb151552b0733b4b20c0daa9aeb7a60632c673dc401e91cc979cb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003587675e37745eed3c53b84580e1392ab36547cad46c80b71c5fe294817b0bb62f14a693974494a69ed9eceb722aa79b23207e2a219c5f9ef3813868be342e1b015cf3b073ef60fea801cf4ff385181dae1f4f7c6cb69ecb5637ad773d9e8212b79d7e32232b24dfdf2f321f4b310b2e100e65e37ca1b12ce81674bdbce8b285022fe59df6cd92ff1bdfb19e24a6a63d5e45570bf7e8ed54fb8119f5d7362fe5c20313b34ecaeb8b6164203adaf37214ecdd87787239c980c5a1724941dfc83eb28d0b0336265b110e4a83fc3e28b7e28f4ab476f9654ef445cb60ce1e6e4ba0ad9fc4df12bd9225a8c144ea97c533abeeeeaa0abca73efa6aa206da09ac15ea81ee2e03299de26f6947f58537b4f918e7e9c318195e6897a3fa0949fa9e71230f3b829f032f5d9a2fec49f4cd775d74b88c3aedbff75c7d45d38f4ea24861de2390091518031db087b12836aeb38e6cf1a24b08b2e401f61032f1890e2bd6096ea2a19a7af6032d695a73b42db544de74d259b45ce8b68b083b5315f2777ef8ece6d58ded9ad7031bcb665603501424e25949f18128093efc36c3de737f62e8a700913656b01191a269f9f2562eae421b45bd8c828f1f1cab46b1783ea77dc313699dd7e6a0944fd7fe65d989b44aa6551ba60354819a5a929de69ce7a4a3c826aefec8b73a027fdbd5045078c837ae1822ff3a926a9ba2260bf52f42b41b77d8113ff99f11f11e4edc97c2207841bfda5a9e433346de8f3a01a982f6bcf36aa22f1f5676f46493ac1b6edceb460bf8ed0f68d763fea978625bdab928314e6bc8f9b0c18443502172fe7498d30dd33521ab059e5e9b959848019e226c31cd4fdc93ff8003bce46925a050e5948cd3e14fb06ab7ea2ef22da88cb240f6c382f764f40a369c12812acef2b739467a388e5c56e7c193de77f3aab11e822a9aa498182cf8c23e6dfb039b5d60029dbf55b075fe934f54a99e625d41eb51a2dca8b8f8dbd29984e74cbb1eb8a37a1981b77f847f62e01abb135da23bc843aee5d782691f5137e858d3d04b41a0f068f7249423d033bcfdc97322df7484d5cb661a53ef77e704df84916378b21c324664a9c72ff8866174389f74fff9b3476d8be1be1d4fdb7a38f7a1a1437bcde6e202c28f2e76cae5bb12281f3918adc60ba4679c9e8a93e0c17eaaf78a1db797589028d330578e9900981149215a4f4a047158efcc1beea4473b8de9dc07b80b71551a6f8b60b50df8822fc093b875507b65f191bdff35aff9cd122c21da9aacd81710f2a028a402954b090e580b7f2693f85a15e78a22f06028feac141aaebeef31b9139e3d46172add2a533efddff863e8bc17f81293e5a71f5256298365037f250b306829adf8798335e6d0105ef0aa1768551b3bd967b74cc88e6f1fd86c1ca2ab6b70fd9e45a12eab98e495579da914dcf2ee4939dbd03f57f5e716cce8bd278d1436d2187e9f958d73b58e811b24315171e418cf4de649eb1e84cb28b0f9d9c112b1d69b91877cf8af53619820746c7e31563b9a2c94bce7f30d656f37113767eab22151570fcb4d2fd1633b85c1b45bda5ba65841821e29ce6481af4ade4cf1976584d26d16706d0067ed182f3cc1df6919df0f5c2a9ccedc83dc61f5792ca7fb684ab854d75bc0877c657c6a0e67141907b821f02923f8abaa6c82aade2b1f6ee4024d6ed4da6a2d86f89c168583c9b418b72fcc5ae4d94b585837bfec5775b37119dd62984c3ce430aafff443a2525a6e6cc7a9570ac8fe911c7e1652ea620c4b2145f969869ffbf3cad0fd9ff35f3d2aaf4b16d4e372623c73abd8bfcd447641418a9e0becec06901bf495f3cf117f660f2bfa381d8f7236cc733364eb39c1a41814f7aeaaa657ae1398974c773a28e85720405a9b88f031c8e668234c2c2f9346a99a32d7672efd1d8f3775c70c199767e3690063993d7816866d34ca85ac3765e5b2305c5c7da38295df24047fc4cd68a3b30fa230cd4aa9907d746ed8cac67f296633083feedfd1e8d90976334a66ab79a56fac7fab6e1dc19df86e4a539206317d71fc2c8ad9f221c5131951e85c7e3bb71c2586bec8c2cd4d8330b5ff3cb63f33fe0cab274f6364b2fd9c6a02b2df562f67c2c92169a62b711c4d6a72a5ea12095cecce07d7801806ae2ec4d7f82fee2d9b3a4e87d3cc7fe0a9467031f97523ceb0c157c0e7f5e87e2b3b2c6bf8ea67faafb7488b5a835d81402bdadcde1cdcf15c6193544ed07af1cf7c867a6b2fa3bada6edeae65d3cc8cba9c5a8e371fc4a5944aa8fc0202c6564b000000000000000000000000002bed1a21e69725c8d65b0be2cebb3d96b1b9c4bfb72cb60085fa02d9e2d0cc84a9681d179d4e6479e05053883431871c8f7feb8236e2b98420305b195fbc8e3b81140c16ab14fb049bd796855703e3b587a3ec50d07a1ec22231ec2e2172e9f400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d9f7ccf84a57b94a5bf82c8c9684ed6c17ed43bdfd6533e706f5f7237ab878df5b3f75fa2ddcc6a70e23f8a2271bd8a64cba6567abcea63ee8b7acaca71d84781e6d53201ab2f7aaca1d7a9f477f041271f2a96b53d69ba12087fc6d02ca2e7b92664444ead0c8dd519ea333083f73c0f17b47299e1688ae94d01bbb65494a0702007cb5ccaa47a87519579d9df8bb9c7a38379af728c6b5415d098f2ff07b9b3b03075a32ea73153a6c329378026e6674112ecf83717491d15c03b399b90177c6320b00a309039763a8b8f6a008c583ae45f723adddba627cae73e4a64f3ff16b9d3f6d34493209450ff3307e133f7a28545bc8614f202f058a1ac37b7cc76722b02c031921c108159a7df246f33cf0c2e53518aeda3ccb890aecff9fe9ffc07896466f030569030d190cabadac0f1596c550b00a0cb3df1a77753839660cab4468bd996b032be581cf01b7ac06811fd5f5d873085d20c01dfd96947cad915314cd7c4b1b8c030fa6cc18093f06155533bc046716e08693db285ffbf1113b80d85f312a82ba01032d82e157015522e8d55c5fb2b8a521472b70d0450d47bfe153d24d7cc9f83152a3de24240ae390c9b896f64101a9e4ed8e3a8093569d9d8a8ba78e3b827b051f4766b4dc5bb0106ab2e05d3c57779ccb44a1bad9a41136cc4f4c3eeaa843fe855dd9986b6e102446cf73c5b87e483c425fe30fcfc52245f51cb54a062fbccd119e63d619109231bb8fea1af760560d162933dd8360be092f89ca74baeb4293ab9be41f809c9900c926428536659bffad882ee2323cbcfed2de1262fe3a7b27a5251aecd8d02590e8ddab7af5038929bc79ee3bd23fea85336fc802b454ae7ec935ce122a30fa95ca030c3ef11a2a066a7c38565c886ce5771d24a4d8543b020505b234b902d29cea4f0df305a501b9ac9dcd54b4de0cacaf6a3af245fde62379fd50e3ffa0f6d42f48aac5cdd596218708d8c39cb9b3e410e3ff30ed458e8bfc8bc9037225e4fc728563e91a3cbf1db7ec79a3fb2e048f309976d2335faed305646c6ff225a2b1d592bbcf5f31dda249ba2f9f68f745974ac4afac6fb3ca1ceb3a686461cf210b34a3a5ae1d541b5733d4b5aea1bd2c5298899f99312d3839f591ea00739d78787e14ddee77cfd4b5d1e4568d15de9971afc862ee412ed01dd304a7f12790cddd5de8dd271dd763955a4fe8593c32793f97690919dfff985ff4e662f77da91d049e8dba0fa37955359144fbf1e15c803f0d5057a90492cf7b120e13f3279d954aef3f3ab85d2d9c0b21d75e4953d9b540cef72a2bf70d2d1df8c67e2d638ebfecb190974bce23101599a3d2c6ee68b98da12e270e12ae28bc5dd5fa9a48c43e32fafc4391b35caf0d0e928fa6a3fffd98cde0ec0924362df7ba21fa72aefef75e74fdeded5489c2c67be3f31b912d1a38457ef09761756c56de6f1bd58e0e31cf8e84ed4370288e6591ffd27f4759bd1cba99b63d4b635711386e37e837526d92d2172ab6d3e99c90487e98f68f033374771290a2d87ab2f2ea9b203e73d175a8d407ca79ba7c262aa54f4e9537a71f864b44a46f2e0dc9713e67d8c29154e63bf56017d83c3a9f87cf39225e9ede1cfa972d80123af629ec8dcff38f19aa2cf6581854a9c4b7bea3049372c9e1e58bc387787424fc13e2f9a0e8f7464fd9042b8c581bdc0e8872fa6564b39e33ed9c3097f1f189a83baad3fa15c5cc45e441a5dfd8f8bb4f83271b6a6225e3472009edaf185eaeee868f13ce7c1fc99d14995180ff815f1d4c84ecdc474bed8909f1392dfc526b8aeb0aea16ce66040f702a692653a60f0bf3e563d724f10d60821611ef37970f42a6fa463d38b096d616f45cd1c2db03c0972b58b9568cfe3e6b6d70e9664be1f4f476b791a9e96a415e85a8f4557a4efb18d26447e19ee9c8294c1220ad0e56c70e73f6fd93c629f1cf09b7516819fd958f463cfd1a0765c4081dcfeffb33d79d4aacf31125c2621c9d136d58ee0705fea4d526e67e21da8160a0f62d891f550986e69d9beab7946b10a3500825001cfba6e575098379d66eb7e354762ecc5059b11c1e461c7fc810078e31c524b76f0225df99a2b09cf2e4a94afdc6264780a0e5867c312746c01da52ff7f75b67f3fbdde4211249e1de571bc839242b91a90c30b63ba7e53f219f8e8d6b0eeb4fab6bc5d63fa4780a72e95be70ce118eced9c3da6d4f237ad90b1e54849b35d8abee878b75e6f5a8bc9084b6074ae6530d26e4178f2e36092c523350906daeeb836e1da7094f5155c00000000000000004995270000000000aaffc28b890b97907c3ef247b8ec6bfd494e6559f9a286e292dd4f7362d869718c2262f0960a797d50ff954d270907f9b0707ebc21ad780dcb10b88fcc4bce22fdff4c72d3383a76a0a3d3d25c87384d34d482780c343bca22d306b63cb0d4eb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007100db64b8289217c3f463896b26cdee0668f2b441f1f7e8781c84cf438ef3f4209538e1670462f6eb6ef942923b1479668bb24d02ca902d29fc8f0e3431a155a008dd5e3ff8c73c96d7e79576cea10f4446806fc7a67ded086dbb68f2c08bd07f045ded1910afe1c62af3fd21db457b68e4370644339e5daf9066120fe99803030c15900cc94d8451c3865d0a759b3977788d8798564f623934a0ff149bf713ae02085e7038c6ee9a09eaad86185074e412eb564cb210397733d81cf18e9247b4a50b044b96a363a4c8768a32b156379d3be3a07211fa1815c6f7c13dd43194125956de0877276715844430db91a3178735f7b9a9e9cb9918bde45b893c584c0d8f0d0311ae7281c86e276e26c969325cf13cd223bada5cdcd615b04fedf0dbbc3bfe730306bec11af2e0759e4f0221ec011de179039d31f04d653b898ff374211c8b9c7f030e63566e45d79c56d05aec578a14464ce6415a770ef1fe466c0c5598ae952d9f0229922de3685d18a55df964327a3f53e4a86ebde8d77e5ea692c6c5b3e29a64b70314494bb916c3eb6c338a3a73b12310fc36058c76caba0a8fe36b904f36ff394301e7baec08a5ae81e264f8589f1eb55de6dbb20463bc3c338116542ec59c179f27147ec036467027e5e062959e6107f64b90210dab7a294bfba7907eeced338eac37f9f2550b2f090c98d3a1efdf4800dcf69ec662875c0715bc6b1634ef6b1954f3f2bf84398f69df9cc0a3d67cb0bbd11b51e42b75033c7fca640b403304874c839c9b723673d8d45ecb62b4bb717bfaa900fed3f0b7803fa00d61e559d82408b5144c96b8dfeb7fbd42f88ee0890575985f5569686a3387324f108dcb31709a2b7761c10af460245fbc546fc50463bbfa9758eb1eac134cc0ae57fd5cdade62a56683645d1d529552bba60e2a0623085544f1fe6b32d22f5be0dfcd167749283345b131c88426c1f6ec8be0f708345364c3fc9b53f6fdb712edea993ac5f8d8f0fd13fb051907f3cb4aab3f840ff9a1ed502b2585580dc5b7251dfa601a2761f0574cf891d6f86dbb0c72a02ddad5468dfddf52e8a5d8734bbeb18ff17b08b9f9f4dd9ac29d695b9cb21fe571c42739070037bbf12e1ee929d1dfada79ea7462fd1764b7c89ec396b8a2ff55a3884f2c8ed7b683770808ff8f1679fbe27a9bf8145d66b0bdb1961219b057f6d0449c093bbb6213ad495d9a0a5bbfadf4aa768111b99014891f2f23ae6052b0e0fb335249abc5469ea83c5d705969d613d623e16fbcf4f5d868d784051334f753972ba9475f3677e3bca80750dd7591db310b2966550fb29548fc692abe26e01a78636339e47fe89b71ba0a9402877536e4b6c996f493bbae59b569b39ac509dbda508268d738de11e3aa3f7f88d48a17bf71930286ab135d136ae38b43ccba0e5b8062d9d618707fdd234b0c95c4cd5ea7686a958e75aecd71d5f896b5d666f56174331ee5f0a0467bb7ba826dddc3b4b0f6da5125b1e8ee7b572e175864c133d8028e44ce8b4c0906615697c71c8302940580fcd32551a13052361b66e3767d683f1cbd70695f15ae445dbe501cb26b175c34116e291fd1b657ab81a7f41b7f68e022090b79fdbe7ab468006bb07948c90b0b392d756fcc1242fe394166100c57c8cb20bf0627b32fec0c9f4a2e3f9953bafae9b77e0c2138e5ce0feea277060b04a9cbda8fa2afb91a3f56d9bc6fd4530ee9a3dfcfef5ee3692a3e9227c9e474379e7d3625a9c07b5bc6d298342b215e0fa29181670b43a364aa708cb634989aac1a8ffa8beb20fdda99d5e789ece2c11120f49768c7bddfcd8c9ccbd1844c0d7f98a054d637fe46415294cedd2782c3e7e64d1527a7a2ca5da1f30b84316e03e8651165a7c0ee99e1dd86d530051e911829c86f2e59e38b18e317339f21553df41620fa6d3ead7ce275538fe746d3717555f79afba8f37df803a810bd5ae2495efe0094b3fe86f6acab6b81077b761cec7792cacdcd1f619bb3f6699199697c513106905e330b15b9aa1c12207cb76f0b6bddddc2fc7791d7f0fecc2cec130d3657e8fc809145c4516846fcc5aa728a1ee1d528546f7d4c6450f28fa5bb5eb5cd807ed5fffeae683bf2fa2041d2ea5746775031ce61481ef0735768c541d8e538151347d02841de9a9b066543229a992953e62db2c5a23b4a36e0cad12b1dfa7101710f363d8f46851f81eb6ad52f48424b2fb34d70e7f3c13bd901fc6baf165dc6b3d9c2b3eedbcaf99313b40947a261296293e70781cc08184e52fb17ca9d44935e29b77d488307218dcb9a1e7dded5b7c6783a8b3840218ca859a7e17efa203d06445aaf3bbac2f9006a9a93c8cc0078bf7811d587ced53465089a9060d98e0ed363ea595b218bc134ff3343348a0989bc51968bd9edb3363a3d224f3bbcf7e02", "6a5151536353", 2, 838720890, 1537743641, "88a4b95e973374210233c4171855bf1759cee49fe8bafec2f7c6c0b3e4e4b4e4"], - ["5e71e66504777507c290df7f70f98601230a9ac40ac608eb41e6cb99749acb3b318333400d0300000007ac535200656a0012e033a6730e3001e7cb47ae4b8b6a6020986b185afdeaba2ceaf870cde98e544c8e4b3c0300000009ac5163ac53536563ac1e274a399d5992059f9dd295a9771f17a59c3d97567de9eeb3efba7215c55dcbac1996810300000000ffffffff2f8ad0820e4f4e97aa24606819f9887855274a05ffd23811d719ef579b70c43f02000000045351536affffffff01585a1a0100000000096a656a526a536563639663faa900", "63ac52655351", 3, 1045453202, 0, "0142fb7f8ad73460646c616a53a13821c9fa4810ae82744b77eca2a81c318708"], - ["030000807082c403039f20ead4a79aee4265eb922eb980e58f3fe6619b45deaebcf4554c9fcae338160000000006656553655351a4d8c2ec47dc57d7b6a1626e9e754c424d8190b3d191fd32e00563e0b824dd544a3881b101000000026a51ffffffff1ac751ae49169f100a061a1b8df5c20fbf0fb113ef38eb990eb27a54bf6ffa2803000000036a5352ffffffff021784ab0500000000035251ac8cd16d0400000000036a005315466ce800000000020000000000000000ac9748040000000049461b2c5a86957967f13b96dd6a650bda22ba62f228f6b701907a3c1af763b9df00f9b79308f58630369e488e65a66bab57fd8ee82df9dc76eba7f58ca34d8ced2d71dce7738d4012498424e1d2b4328790a9c58a4ad9596cd890ca8f3e8f1a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff71a3a3981ade570acd7898324eca1ecdb0d685224b421d865e57fc9e3c968a35eb7662b031e3ad3e0bb8b57f3d4297320be4c2cac45a53451f4a91441b9792c3c77441d459eb28ff48bedc17ee65acee543f21fe14d0d8623a1641fdcef02c9fe0807a12891c54550930708323f16f8472be205725f7b89541a50844664b92021349aa99a2e785a0908d0d4949cada6eeee761c959fb46c432e5f946a8c433b203024070b90226585876e68e7a4c7cdf884988854452079ffffb61739ab4a924060a08f08b53f64da80e633a2333cbe33fe4e565ba0645872ccc975d65c3f0f380cfafe682932ddd1297d47b5007bd1f742aea48a9f72e30a090cf5d0a2824fa7290020ac44126bb0cb96d5e48b12c1021a9ddb440d92496b46f0020ee9a3c995176690219bbfcb14f24574f1831cb5621e539b9813ec2df755bfecd438cf043f615b1340307f3b39b332e1cfbe0ee2e79169fd41c676972fbd659219eaffff70bb448b898031d06678719c71dd2942a38d7e8ef76579f84c9414b8be63cf98e6fafccf97ee503242dadba0544cf6823f8b7bd8be6b0d988c3f3b18932e19ef0f7f21546a5eba47c6511ece4475c096025cd5d2a0e1ac01cfe021bcf0d97e8ec8c32dd5b1e86a2f637339024049e39d93570525bbc4ef0f1e5843af78b23b71e1e21fd282ff63e3e173bdf64a79c7e09dcf5186b5ceb4be39554cfb0c090b2782c306fd200c9bf0cd3b74b6263775443c0d9037c66f63d757cacc338611ba5ead4151058d62ffef26a8a74d3e3d37adef2627f9c45de178c4a5e3edf69fb7a3eebe5b1db903fcffbf34e2732d58cd838b617b5e3c23dea8e0503befb86e74c03bfee0906f467c9751c6392c152d4914bfebc013d75c077786e12d5554b40a2b660dcd42ea07520309bd245b7a6800d9c0a0414e33b8e1d4d408137696dfa84f6e3613716f6aba78e189de9fe06ac399672b443f1de1bee4eab3417043cea6568d24befd7044a402945d59a9d0461260089b9f82fba799d09bec27464cfc0331f9dd2818bc6d4b5202e8cea17dea750d50d7ea013a0a4ebb074b2731b9f9923a261942a747ae670acfb70552b24c12fa3afe9e5160c438322276708f625d49d42e359e20ef6ba9730e6ddae9f00d9157c3d2fdd78c72777ea388748686f0a0d66727d8a5f08aa833df91a4d3203e12174b5eccf4d39c98bacde79e836641b04d427644ff1c3a2f150ca0c2b1874b62062161e8964f59c2d2a7ce18d7347cb464e635ef1554fedfc5bd8e2642b8e035fbcbd3f6b2055e486ff228af4b9fa1e5106db143176811de380ea0a03789963f18c02960f7ca4a8239d57ad86260b1cd0e1db7fefa3f238b9c2ada5d78d9f84916d7a3cf9f603c8dd3beb610b9ce851fa4ad8c2b26ae5fece0e9bd961fb1d550c95ed49c0fc081e7f677f81c31741220bff6c901e884346d1ce324ff78b326bbda0c7d9ed459f5ea34f90283cd81b8bd4a24e3e88c78667089d3f1562a3b9b170f433fe3d5a8fd21788fdf3c02d57708660d87fba55555ed8a8296f914b1461b25822f49fdebb00b50e559b4fec37567a3b16b0e9fd4d864999a1a2305f1458a7e78dc80e7d21110e1eb17ae0785ff00bb3a821b0e1105271dac2f3003646afe040f5528cee0a2d0639341746ec41936b8609d1979c0c782a11b354ce140d29799efba918916b2e0104be9227815170e20d81cde0decc2a27816a41109e7e7a99ddcd3d7d45244527edb8467b0fc84c18a6819d6b50550654c694faa9be410dfbef28ca176020ffce98f50f0c5be6ed52a6c04f9d92d75b5e0bf920c4a7a6dd8489548cdb7b9d1e6de711e515174a78525237d97414520785161f7f1bbb12cfba45529024e7d43685bfcc30a21f2767a081d50455d5cbf55ea16129f6e9d54a8975b03e94bbf566e0f71472dc61e59487dec7d5d495293d6a508e98a217f362057e238ae07dcb4636f0d943208879cd7de58696939016510cfa4a2a8cb4d4122d8791c814ed0be137c7668d8bca53aa36b7025a35978874710ec80198054d4dc2e45093238450c7532b801803b18679cb9d4e552911f4e6ffddc5038a27f68e555f8161b79ff86ee1c76d52858d2f1e7ec93cfe331a94a780df1cb062f869b7b8d98934a46e4eb9673bf70c94e56fba016391be2a0ebb80e6c5dbe512013d4a3bb084e99a0bd8e7091d246564c1312bf0d8ef7ab89f76cbe556f9a82e2de6edb29ce48abc15875f4f4123ac67c7f43efe4bc9e20545e7681d538752bf3aecb1d3e475707f44c91fff95148ea04b050000000000000000000000008b37b75dcfa818fada38e27cb438507f09f99d9818d93f3463c89e662595564578f83abd87bd9a9fa1e8813fecc59869fcd3a4b733eef6f6e270223f60c2b316b352badb2fd5d503be9a0e3b3f5d70fd5a31930a870e29b6947bb59214e86e1b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000246af2c0caaa9e0c0b979632df995fcd6c739a499691696cc77f394471f92393bda26a5ba53f8d42ffbcc12ef515374f029e7ef9b06b151fb61143bceac022a13e44de3a1b250da160fe450114c3ccdb6eaa4117ffb23da21984391e8e8412e54805c85824720c60095b31ca6f4d00301cd4b566a76a60ebf6da4bd8f1a619f502201e870095bc35ab5cc621e45c7bbb79d509d416f8177bcacf6af79b3c568ece021453f5fe03cc73f4ad5d52a0d74ee6eded3588ad143b19d24576d13b494b4dcb0a0182af3da2b41d5a17075aa1a5660735646bf1e69b022f0eedc6c59cae179da435ef13221c77e9d4e3c29ab4bffc7c30821b2abd7670f5ec4c62166b28aaee7d022ac5ce37fe9be20052a2ba119fcfaf813d22eeadc566cacd377ebcf76c1c829b0301fe9c7e1d22ed1544ba0e42c63887cd3074982933aa05ec22534912b0ba12a3022b6630a3e5486c9735b36587e31547c6980738679c027afa4ad4a964eaab174402135928ea4340e2c02f6e2088b79512a3413f6ce2bb9fa9835635a1261b2d237c0304d6414bc70d2e3876577b25f2835d702f4d817b7d90b89ccb5a6397008a567bd73541e1672a91a72dfede70544cb03c43536b60331a84c5df860b67007bfc15a07a6a0702981f55b9c4d04986e042199b17f721ab4ea25fd97527b569d54a24bab578dcb2a5a507243c12712bdf760b26178a665479af9f90a32b2c6f1c96cae467720e4b3186c9f505b0d5b0aa83ba6eff46c06f506c0a513e83967a4d26797fe0b5fda0582502a13c6e7c6ef4d3a076483683c39a4c6ac91df9d88025735afc63ada9cf0d79801a7c29bc413c154759061d6fa0c3d3bd54affa457176fe079c52cddd909c3d7736d44d2640cd3534df718fcf965d6278de61481d0bdaebdd578639436ae2a2e1ccab5ae941e64455706abd82de646154baa95acd9e750bca5856a4ac4a2e6106523db7e77ebc3e77ae3b8846661d55017c89f9501396cc3b4921329b2d5679e50d97d52f8c0f898196ac0f7f81b370abfdd1f4dcb435c8dd598092fab6a07ee6d62c8ff44f84169cb0ac82fd959b0db62efd5fa3582c7c550e5893df6e9cd549927bc9e2d385ac661dce6fecb70b5f3793302462fdaf189c00d03fb23a1d0d224b38840fd0d171f41fb93382c0d922c11c4028e5d3fe674f20ce53e190b051fe713374570aeb09c506bb3aadde5d6b0e638a3b96a6404208df9f80cec076f4c39b5334ea7e8edc8c50b674b964357f5570b4e2e9995caac38e237707233ef13481c06b94608d9fb235f5d502720c842a4d37c5ee526c94688ffa47dfc18ec95e2e764356189097256c7c319caa6f6f2191ab1b8e6fa7e4f5a9b707709f1b6cc33fb726be3df3ce0259add97d1a7646d1f199a345c1176624d482d027812ff013ab0a72e6749bc201344752e70021b2e4b04f1e2b9f0b54cd12ed28c27084fdf29d7b02a8952eaab5f496c4a6f10e3774043066d5ab46a5c6a66b4755ce4e325017f36fbd73c00ef318aafc508ba9edd41cb1a41a819470416b218eb3355f9e70156f9d4b686a20395ef490336afdd988b7527b0960f7be22f3f8f9d61fc4d84b3560b56592b61a73bc4fda075f8a971fa5505972a1aee90be20e97985cf5285adee69fd30b53e3eb54563a9c53971452b978f96b4ef0f0954c985948fd871bf5828a842fe1fca01263433f088b14fc8e139542785b28e907f0cd5e6dff0830b4cd05d8b417d6db33c0202f765e643efb84c6a4caca94155c804ccbfe6759ed238d518f4460762b27d9b38baaeab62d09e32a883cbee95a11649aa2a58d7abd2c5c3f521e31fabf562a5e77c23b0eb4a5aff1f187e86149320658f9807a997fc1b40f54803a58f291319ed49e7b215abe9632cd6468ab3a925aa30585223d09da5412d0586f345594f40857ae565768eb1612aea89d4267d12e4c246d62e719ff83f77105ab9ddb3c4ed3fb00b372fcc36576dca9afe058209dfd9ebbc0e86e4c0368d3f30ad64331a08a6040c012efa305ba477f37a805ba7212a0661b1f1174e76afff006a52adca3637c6875cd6d3c378c5386ac19b355434e24e7a8690f83fba423e1f1d0cdd644ae4f45d9563cbc1782834d9a175e81aca903260d44aebcebccf80c6713284d95e197fa2b749c42a6d03114cdaf9308f9ebea0b193f6cc2e72c7dff9583d788713b9cc640b3af6976607adb10c07a00d2ee98ba3800c9c0c1d7c3794856c2aadbf568499c518e470637a869cbe48fd750fd2280454739b2791ce9ca2b20434764791e2a80e247591df6b1c40b635e61b724768b60028bcd71ccd23ebfb9bd5cf2ec219422f79a95d1d784458e7da0099c0d4ce57e105b1aabfbda121a04ca060c0cae9aed2b9914d6c3331304f779b7c8e24a8e8b8d0c076af6b84f52878ec4c401", "53", 2, 134194196, 0, "d646e5eb600c48560e31e02da319c01725d08e6a10e7221b5bdf12aadee691f3"], - ["2010406d0478d9769f380ed8f0464aa75e0b60f58fa8bcaae06b2bd678229509d1c01f443c0200000003005300ffffffff4b8ee7ad5c43d7521560ab6e68f03f8b2899d456f9422926830aed753608b5ed000000000765536a006a6300c7f6bffd3ce7b86a579b768b6ce8a1068942fa96c5e08f382a3f9b2a8c920dfa271ab102020000000351ac518ba4370fd2cf0ff232ea59202874fbf1d89cb87ca37ad13ce39d08ae929d97e927016a2c030000000563516551acffffffff01e0302a0400000000066a52516a5263f9fc3b940195c8c2030000000000000000000000009c566411feb500fd75d098e854a5202f96ecb40326f57fc53d6532c25a93772a3a65f6b9fac97efd15f6b4b7561acd0ff728525bcea62533c9613ba17fdbc424905ac5a04a04bab3cd405ce0033dbfa3409f0d09be50937574a5080382090d90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006af7e9ab5050d0026846fa47a7700f7ecbaec1c336a718251448df128a7cd52977b2d4ac0bd4c3133b85e708422866c732c4245f9bb58cd7764abe7bcbcf2d3f3be762cfc58beba6b043f6e06564f9c932de2402fb60fb9d9e4136da130948a9984c906a491b799210da42ebbe3a04b5cdbe311867a2e311bf73eb5fd801207003052a276bce613130e8abcfe8b9f3517fdf9fbb18f150ebe496912e714851090d030e3ea58f2bce1befc450711f6a3af9a610960212771448d7713361f1ff277d720a018ac68a6844a964aac0b85f487fe4e6f9a5eea07e6fcc14707262112d6e69c9f4e7639c17b9a9eea165b83399206f534646a55ee2d848edce5efdaed869556602257509a07ab0becb59f000f83e5aa8dd98b08e5fb7e98c0da977834ec30efdba032e66cd22429b5728f037e8e6e79d37041cc0e1a6aad2ff677162bde8a0b1266a03020aad0da1ffcc552c2ef593b8ae0ac51978dfadb3ccf7e2452f2483b18fa056020297615dbdf96db6ae8682804cb64335608a1fc087a3403d1986af8923463a3003216988a0206ce504f90c07420d8c0cc1edf3e1b136c138298cf3e8aa77df4c452b746a3484990fada316d1ba40dd76939d15ec8cde59454b17caf36802b519656c0ebbd875ee6a25106501ba9a24df6e5f30fd7b599d04617e7da0d4254fec956d078ef5f3cd69f901bf6791747c78beacfaefb9d1ed708ef433fe0bfd3fbd8c8dbc61b2036f8444112c9470e5d046a02e1086dcd1dad5f33a8587e0bbe165ab3c59d6fcc49ea17eaaabfe444a27d0cef69b69aa9dd6f1f2fb491d8352602b5147bece27ae1091a2bbbe670e1ca39014b66a3615a181f3922aa7f82491df5032c4b32bbc0aed127f4d17ce18771b976d99db6b83314ed9954de69188870653634e589111faa334c45b40f0a32310dfd4c8742cfeb10b67a6823541a509a4a4a56f7358770187cad32708d17f0d73efcfff9af37ee9f61be49d8b4e177f8acb41b32dea20a9fa42eedead4ca0c7b938b5deff4a1ca0066692401ec79fe692e26ee1906be76d4c179cf782270d8d98c20f03d7d9b0bd93e059872e171f7c2afb3185f7a1dc4a95a2a0656b9d56fa90570f2a598e4a17a96ce1ad732e0f0d1bbdfac497244720ac133c12fb1466e72f7f3c12ef01cadde8df7c0d4ff3128a691876fe1391cc375c5626cdf6d922ca2448ea1df51a9b6f63eaa8714355f43830e7f20587adab52556133b07a16caee8d4a7204530d9cb2a8c69623ca4efc80e129c15b69bb861dacba1f234431efb36e205fdee6905939b57f779f2c9814d96d28e3624b1128af031028b2ab8dad24654064a2040518ccb86c202ca6890b43c9e2da210df1e3f974e40a3789a1c14855d66cb717bdbd9e7f6b78b3055f0e64a03975c4dcc18de5818de7266eb198e79d6ccae062711566701af429b6ef28014e74f6d84ae362595992fa6db0fca16a582cb33f62313eece77e912bb254858216ccd6c861b205138a678d04b30c44ce4212dbb29ada68c453904e2b2ee9cf3d3aa8c342ff7ee3a30bf2a230d2e4d4dcf683c8d627bedcdb6f41fdee51dec492a4e2948272ccc6e6de6a5f54c8f16c22b0b36971d3922cc78e21f214a8953f1fd34745e3e8ea6b0b124f967254d557aeadce977c26b1236f005812dd950473c12aacc4f8689e68b1ffca0715204e93f6a43759fc43814dee891c49d1210fb882ed2842308f7d661907c6134b7d3f36771635cc8bb476674cd7d4101215fa72dc385c9c2e6af98b63998f917ef5ee2f94125c4be2928075fa83d4e32300981f730fbfccd28977c1fcdf6859d85efa32aa79f9352790b050031ef6aef9aaad9461ea9d1d62a71d9ba97c1f54bea020db4b83ecf7f717204b1f256dbadd8d8a4d692ea4b564a761e05c215be2e429af38c418dbb54bb191b18a35977e2fabfa1a9e9a8b7fb40e4ae61560c63f0ca161d47e62873fb517cd97ce3e2bad0c1358c67afd6fc37641ec33e0d7b72b57a86fdd0c1224fc9554bc5adc5ebf81cf32fc22edaa1b1b1deebfdb6538af34c30f21f09d1bde1094b77d0b75aeb3b40c4aa80025408ef1143d1a77281b973c825c077c4644276b30782413a182ab549b7496518e847f45c52520725e8c19f32d294df591267865a264b55a33fff764c56db8c850e4f33cebd22238133c7427fd204c9784421a50518b77816c713303454a1b535979774501444557c6154c32166d9e7e1d5d3e390aaf71bdf7e91237191a643f667ba4f93c8c31fa14c07007338c55a396913618c40c2accb48f97c2ccc2cb60c24168e767434e8faa0d6bcfaf3813ab481c202238e0973ad1ab60cd397314e8284aef9d95d463f0844d8c1acda99c0e48a95aeaf14ddf1f725990254a7c0a545822925d1c3a0a61fed6882d1cf03d9f998b9c4dcb07", "52006a0053ac656a", 1, -1362693845, 0, "7e782113b4e8fa2518f8137499af6e834f6c09ee11d248afcaf50f398516dd10"], - ["d2f36e15045238ff8541efdaf3892faf60913e84e73d81e95a77d63963520b847ba0713af60000000001acffffffff6250e30a8bc0d0d1195ddede2f86265514f77bb9ae893746113d82e8cfaff45301000000070052656500635208577a4038cd2f4b5841d4f50c45590b479a33698c48234a929137aea6bd1438d1ff34070200000006ac5252006551ffffffffc105aa603ad21e7d33beb3e2d379cf22850363fe378c981b64142ed3a686f7510300000003006351ffffffff032785d20100000000008c8f0301000000000563536500510984950300000000045165536373a6e89e034e7d8900000000000000000000000000dba6267ea3c6e51e0072f63557b65de056ec2eec84b174fcbf611d24b51f7ee635bea853a7c2e10efca0047e1bfae373c060b7b940dea28efb38050c8bc567b618656c2148d7badd78f223eb4593532aa215975e2a2afcd5c0ead0f217e98d5d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000df6e0e447f7ff18f5f9cb772a118d9d21a6e440bf78a2d26d09087cef75c76cc385246cd3b38611ccdbb6a18c454377136d31879aba58e3f5764e4f875d17704b617c718b875daeb1b7d75aa9226cecf8a6b03bc5988074ff313251c2a5171a5ace9c3988a623e6e7181324c91516fa8343fdc2ac11e0cc701a1faa5fb95256602253739ae2b7f253302943c89b0ec43ca987de76575de974ed73a9ad9a863a7ec0222f32345345bbf238d62da3fe25dd10ef4bb67c728acf5bfc13d303d49e7d8a80b05ea31d79cd2727f5d6cbfdd77202e344e7aff2f1ec0915d592ce2eac918b0c4595c12d71f70651b2c63621936e4e0929b359aba756de0eef9b3c31595e018fe022253acfbbadffe6a0c6aa8c0eadb1c568f81d2c6d42d54cca2ee7b107040248c0214a6b715316c474bc5144a4e53bd8a225adcb5c9a636a86154ad3a29f92a3c4c020e559e4c2cb79f720a85d113177ba47390283e15ddca42e089be4529b98185f10300ddd6d9c6c70698b5c22fb83dc827c24f5b49bc3c22c7494ea65abc694fe597022d348fec5917aaf537fd35399b4fdf1984d9fc0bbc9b3c12d33e8f17354613a13484d1e8d84f10a026baf72cf00dab21491f43ba9f5d5fbf9d53e64d05951a86e262c05aff3af5d048d08fd9bdf54cac19c95fcf2c0900c0ee5042af75cb8c3fe9824e3c8f23f78df9532a11c21ade19a89147521c95eb4918ac13d12f2ecb11bb473b24c2121ecbf888d7d1408aef7ad19559b6ba6fd754181de57cca8f984ad2c0d5d50c54e70f212a4b3f3b7ce9f051388d5af6bcfdc71e0fd979ed2748096f5301bd99ec03421fb15a75bd5cb70ad08375b56b0d984a48647167b1c73bcc7440255be3f6894186f6a7a3d5beb4b902abbe384a00eda5b0742595bad7fe5bd7df8751f94e3a5bea4c5007b162ec339c924497253b476f5d6742b0b20d3120a43eb1aa2107ff6f95f2e01c2b0f9174959099cc56758a511e727e0eaa79f72a55d1c83a285bcd5f01070109f496a355913647305b7cb3f1c7875420b8da8e7b6d109e04a38320e09fbad540740005aa825d77d76a821bd34b23d13db4d27c1c265c1766bbfe611bd0feaa2fd0565d6566cb1cae9834fac601b477e80e06f82491cc0e1bf8e5a43f4d686e71646592badb3b9ad8793a1c95848b7421ad2e52e7592e3b33126e41de69e6f5feea9be8893a6ad01f3f66f32c95770dd945cbbddc49edf7721835267cc97c706f9b1644485a4858a9a352103343cde55bacfcd0a00bd9d9d9161644cb357e4df86264c9df148f3d2a7b73e4f0cd31e402970e5ebc9d654994c4fe9b6b8df5c34d9f2e5dfb9903f61bc3fdeed4b6ae7b292c42ecaebf221bb32600092b507543884ca3e9df1f26b41e22e189452dc170808280280d202d27b95410ac789d5afb27d24368a86843d32ca04ba0aef2b9cdd9ecfceae22f3819b2f2f51f932bec022308b507c4484ff909b7f5aaf86bb4941a2f334654e31646311b4a38c7a6bbe3184d095bde2cc60bb4debe743b69c484569870b8a09e9afae78bfee183fb7a7c604a3e3de235783844f08ff666594b0f481190937e7562cf14a10f908ee7fc9f76c102d985a82c96d732865a76928b1d4ffc744459c4913f6acfe9185aae8d04437cb6a49d8804e52316edf2fea24af1b0778d148b6b1952a8adcd5b494266001713ba355e133f5443b21892666e45135beda511271fdefa4fc9e03e6893779428ccbeb27f170c639221f30f7cef60827525deb98968a4f89d49cabcf9dfd8d4c7b24ac25d147f0abab24064723245686b62a672602f8e1801af8682497dc13ded9efe4587b8429ecd8e38575a471b9036c55d7985a068c8597e39b4ff2643e8cd2e2e47308bfa3a5b630a08d5c2f421978f1cb6e04c3ac2e9d0f75add950916e1007f376135143cd3fdc7b9b85acac47339572b35072360ff505b37731fa8e2e2e1dc7bcd312a2c201a04ec6c28c4905d0d086183c46dc764f11880d95e2a9c25fe3a511f5afd8cb4c4d866476eee12906baa670dccf3d42b5a21581fe9e3bec7ff7536ddebf079a5de1cc2a328d9924f86f5591ce212efd941ab4d402a2922c53ae0efa67fe6467dc971ea76921801992862c0774f65dab2f4ff4557c504789aac59178b2fa11395d88787c813eb760a46bf6e22043b72650426da18bd88b8ab52270b5118e216aef51e0a76c22a3f9843ea94a0c420d9e2e56e7942455f6164032fa125a5342ebcd90b122ac8bbd183ad48bd82abb58733c1128db6a4bec8f3b6d4dcc8f25f000000000000000029f06e040000000013260bd3733fc8f8923f10a7dd1bcd34abe1548a2775c4d9b1ef0af35aa2fdf683941d40314098209dcae307b282b4c3fd21a30d1ef3ccecb5ba9bd6ad6569630b041d0d27563896b4b1403bd90fd2a9ce0cf04b4ff3619f236b52958eb047040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085c700cd7a905cde9e952754db1c3c6ec3f704a90f844b72bc4b1a83a75ecb8d02d1bd0036c65be41dc0d1a73e31a19b5a7bad1275ff9719bb8541922306e1c7c5a973cbc308b26b57e29d4fcd36347b8e828bbb4876d11db0c05293f520bd311ea9ed38844960d17c2fc5d83d13ab9b861c59939757f1463496c98753cf3a4b020b2339730d97bc57be41c0a4e5479c9c8294c0316b97ca193e3e51c36c3f622d03040c6ff9787bc624d92e951eca69e7ce60d80ff327dbbc7c7ff28818425a35c80b06e1e4c8703746cb34344d8d197120bcb497ceb6a3a9cc2cb67d77c0354c6ea6c934a5b5942843982618b62b6e9ae38cada808ab3cd0aad31064b136a7b06731030fd5341697e31239a461851de526d976f2e7be09fa9605fa9185ed291160f742020838ca33d8385a4deb1ecb3a57a1608d8bb395240e5c89d3a99d60a1d366f778021053f774cd3d2795ed215da9d26cf8e699425e49dc492035e48dd751aa160a9f031a429ba07c4816dd03ed37f17d03ce1fbd1899df5d1430b65ee22359b8e8ac890327eeaa0b6574141b464549bd45d4d35284e46e260e1ceac1c6f8eee4ad17fc2eacc0ae2770f98fb950d8e4c48689a55ad6dcd01a7873626c14829f11595aa67597d2f42b93905d0dd7ce19442c5bfa29c907b40dac2b8a3e42ff888c4672b09c88ee3937c39b7b7ccd6488e0edb60fac1175e26aa9ec3e373ce9e5bdff6b0f9f67d4b5a8d22294f29934cb08bfe90b9406142243185cdcf1e832e3e589a4fc1198e1e82e68cb7f5aee35a67fd62ee08ac7c6207fa4bb27a852b634e067dfe4f9126e4abfdf4a94749c98d06d11b049f582a53e786b771cbb56de15848d6aa1edbdd6e1011fb6a982097d323214c879503bb4b872fc1674279c07a1ec5694333b47b8a50f06e10302e3b5700b1def094ad59a26ebb5fbb268df4eb718528c3dca86ffa32d72b6d1f2ee47bc212a931c3cd96eee559ab3ce84a715a583d610510570a4c533f6439299eb69533d3790164ed72276ae4a678c9a43ca5e4bc692723e08b65b4c21c3ee00311d0ad5c5c801778ce2e7f68549a04a6d9e84a26e84d9f82ae2706756b775c3396e99eb21f551057a6eaac05ae4aa47e12cf9ae673c37fe6a0918a565670601b31a2c0e2747baea0e6a2e118007ab149363b5ac4457bcac806ba91f63c04ede4f66266dc3ea1f799c9d09868f8502cffe450af0421148444ce4fdc0eac3a4ccd1a3cc4822d6bfbe0fe77c09e08b22f35db2bf1cff57c60e630f8dc65d06fba907305edd7e17812df45abbb4ffcf03240959338aaad1d849240bffe5fc37c16869c4bdbb2ccfdefb6707dbbbe5de060e6239e2c6109bbfdf37319b2a45dbb6b6a638f91a9acb34a9003cb0fe1e5400e3b6e5aa8d8b591345976579773cfa4ecf8949410490dc342e2c9f02850f3c1c236000ec720f293655cb4a585463d4b61f953f192f9b5e99aba634a6659569825c3b5777ee1998eae70d2d954a1eee80312ef3f8e6645eaf661f10fde64314e3657fec7e3311a4fbdb04614510912e6e78df3d9567e77e0d51546c31d0995dd38062d244b95d50218f184606f49d76f41f03e133f6528217ea3200438753b74d5ec0dd35df942219a51251b6c3ad7afc6d0fa4822dce7f9ff2d9e5c47ad7ed7687de423bd229b1effc080662f5ee74de28640eaed32f6e00f875b9f65ba7d865ef0f79d61c22cd26af55c4ce47ceca5024014700d9e2f374c74f33a088004cf921d0f1a95d82cfd707d0b47971f7722b062e6978fca563cb3e209aab11925be96deae960caebf4f87381a4b78af29b56387a153f7944a17f0703de3ff074d02bba8e084ae8f94305ccb4492b62fa55c55f717893032f9f886f94857db6a4eb43ba1f70c2fb5feb070a77ee4f7d301729adac325370c05513bcb646a9bd910ecba41e4afb0848c4c1ba409df06e8c86afc18bf8f4d49a3da223980a4e868e33338a3b272d735227adf84e61ff0304a2c1970d95b7a3391d73bf8bbc22da49ff697badbb745c4105377cd11f169bde35c57c67c5d4aee77ebfd06d25a185c229d5721096ba04d6aa4ecb17f8d74bc626ab1344bf77715f46d16116af55bb307f13423cbbe6007854bdc21bb4d451408ad312322156715f78a271dc6297232564987919080ce24cfbd333b829d0ada69b400aab383d1fa165631300bebd49fdaf2280e1972271b7a9639d62c321cb7343d28bd61e88bdd3e3d3ff6f74a21e494e703a05888994af9a5150d87c9cff2f3fda7182ef8e238eb22a48cd060000000000000000139b3a0000000000a127bfd457bd685bdf4f1baaef1fb2e2b144d6a59011e92254bce53da3794d384a1d7389efa0158a09284184451c8992812f788b13e297c49b840f1b5f521be2f01b5732a9ccd74cabbf32d162a9b7a0678dc2a06b790cb2b5670ef2c7cc2d38000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007d7274d2f48dec83b89a3e95d1e774b72f2ab496568c6fd91cec3de4aaaf8b7547625de2d24a6a08fb6391ebba0aa86f70f8bf135a1632f839a62ddc1070982161b8cf93ec838cc14873307bd1d83a1526e7847edb416bc4c79fd3b4756e2c813c38ac29a2816fbdb6dec1f1f0407a92aa00b41fd0baf30131135d453e4404a50327f0a25b7da4789e509f1ed221c728e8f3ad7c1c6fe2abd1bb15ce6e94f6c748022d5776502474d3d656b9dddf6f341e35909f76f1ea83dd17bb0b4c4aa3506e3f0b00309f6564e9d0be0db2792ee4c7ab514a675fb2d7b113dda3c66ee9cd3d5952d82a1102d5e53c0a63ac056c59023a36312aa5db6ac0886b905cc3d7966153800320d1d60299c6378e7f2d0c2dfdda3b9ebd419bef1c456b9d5265c779583f32f9021a202f640904f7168e0a70d60311591f9bad2591cbac35ee9c00212b97af6f92031325343769ef5dd03023e709ceb0b2945eb09ea35df5bb9ba7db677009611189031958081f65a448f6e5f3b138e4d99414c6362e4373bee6c2ce75d21fd025d3fe02094382becd9229ff54f1eb6168b725edfc53c9d255ecfeabbe6a49d52f743b13b85b58bda66f5e74b543062cf9e4bb1e4188a21070f5f9bc002e75567a1c0b1245e4213e815749b72e2133abb3d7b704747065acb30ef08a01b57947d40812a0ade37ac411c8c6719b168780fa03d05892c47fc9f4508cbd379a41b807e4efe7cc22727e4ef211468bdd56b908abc4dd0fb895d23b228a521365ba06723155d4c5b661eb266156b0455a05c5bac3c66602b140679316915d2ca30644bc03cc8dee472134848f21e358651bd04744797987a1870d428bf3d71a065b95cb4656113930d7c0be14d8c82470b9fb402206de8fc5e95dba47c5914db6390045d9df8d24e3a389b8131b3a63ae26ae4b4e850ebc277fdf0c1d3cdf0f7a158176419065e8033e57a64fba4f335f8925fbebbb22327480c0bfef0e185abd2af7a1fe0305fe1b8e5a0d6f72e2edc9f69c2f5ee87cc2683c1f34b7251bb572f06602afdb19b729f22dd52abeeb412b8bfcbcee4b186efd907c449396cef966d9bd2aec0c849801f8fed4e9e33c4fcd2a3bb3e5ecdf076e5deb33d43371a2a927ef34a869b4df3fa1fa6a7d7f23ddebb51a40edd24f06f5efd8719e79d8394c5ebb42077c615dc839b93e5a3ef5720d1c9925b92260fba9dda215fff82a3bb68d4922a7e00fb0609e29b410aef2d3fbdca8ecee4a88d524f75a1ac3b9c7cf1cc9227e5b55d458ff99e6518b3d03fd4b5090f875c7bfca50fd32618304a7bd1bf6bae5d24edfb70470bc12f53ed04f21f4b617fba86ce567d8a2dc080e4535d7c666bd83fc8de280b21d224ea7f51aa52ba1daae915d4cf0665b481d8787f546f8d88862ccf7a1b658a0516b6b27a26fb41fb38eb26b89c86d592f840b359e0886e3c2d3eddc7be4ae877e5c2c0ccaf33a438c826e330100b1ad8224ec04ed32225851ffb09b41f090de102624b6870baf94df181a359a36abd1caeed4da31e2fcb040badb1bb254dbee27d863ad52f404bea6b363666af08e340f956e5836c5f5fa838840fe767b271b0782b7d5e2822bf49a94911fe92440e6a9324549318de818a4ac805754743cb38a6eeaae71fe08c8018f318bc8c60b25d21b5210432e678d562d6d8c6ca02b8becf937ba9db13269e751ba4e7e7e59257aaa5c9d0dd68af164226992190581c7db2691e75b71e5623ad7bb6c0cd3ce0fdb1c111912ae3f91e5346b836da1790677ffebfff05509252e828a7e1fc035df69d05c2ec52b809b0f563a8c25e64bd3f2757b23a73a3346ee8ef0388b5c946e28730db2b6497df8c2828cc2fe94b58b1d7fe1f7672fb4c9ade382bbf38393397f252d4df3c9643298850995670505b0a29a37d1be2ea427348f2ceab8fb830cb6f3c1cecef32f581cdc79bb975eb5b8632fc82d5a5c75598ccc013cf6c41c08b0a113f423c59b9e856567a5dc223783c2d42296906f57f259aa3850941d125f1f5b180e42a598bae62520f991924380682b6707a494dbac663f8df86585fe673c2880fb51de012308b1d8eadc1341d9d29910fa35b21ca0f6e6e63bf45f689b47c9e695247c64494763549576cea0a03007e5fb5edec9fd89644bc58f465cddd9628c19545df99a4bff9ead2366246b8588ec340717705112f5bf3df38c6765cf9aae4a166061ac2f2d237ea7407d7720d6bad7475b9593de840fdad10fe1ebbd0b3df42aaf126dc8d2b9dd6aee8cebc9033997e142a387bf2372ad267b4cde4125ff5e5d9aef2b6eeaf3a929c4c66ee38eff7f801dd3484c68a8d416b4b6a590bc40e5bb706a345ce044e897112e4f1b92b76c854f81200b1d82e0d6a2c9725fec242e93dceac6c473ecde01f0a05ab0f6d4a0942fcff01848a359b001", "00526565ac00", 1, -795837198, 0, "4592745ddf1b1869e8f2539966fa68a7a88185222173bb3683a5e3293bc0e82d"], - ["ad375e2201f14022618707dddeb154fde6a484a0dcbac9a024342ccddb76d0e49c2bb8820c030000000265517857ee1202fc85db00000000000965536a52526a536353461d900500000000046a5163ac0000000000", "516a", 0, -1205880303, 1537743641, "6036b54735822133782ad21ae14c9b8a64d94b6923ae37ba0aba6dba3df97648"], - ["43ee3354047cf9aa33096acd502ee5a1d5d6626f567c9a96dfd1dd60d878adc02dddf42ec8000000000563526353ac9f0076b25c0b3de81bec71c81664697cabecf567e6d95e2f2c391a86f85436a6eefe4e730000000000235b9abbb81b7149de27f6cf74a9a08e9067f9a73878ab19d6dbc2306924e7a55e1a4f0a01000000066a6365526365ffffffff97df6dfe72484b202708190a11b35aedd9b8a628fd0b57b181e4542428febc460200000000a68dae8d046e1b95000000000001536c2c6c04000000000551535352000082a5020000000000586d6d050000000009ac6a65526a536a52ac0000000001eadb2a02000000000000000000000000b4d6c69be270c98a4833c30cd48e8df56168c12c2091295d796d68686eae89a630e2e31809ee78604aaaab086ae70e217daeae1fc1c122a2829d823832e4d2b09ea45e9c32e15b083b245b13a108e04df0ffd48e3116a597afb2d71cee6cb12f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c4e3bea54008a348b71f4ac48e4ea160e99aefce4fcb1b9b5e52e71e6ca5fe71c0e838f3f95d584f377b7677f826b86b200178c5e2dd8e67dcb311bb1848d0d5b2ca303e4fd55dee23146867889133e63050adac5562ee4788fbdfa4ea148e757614eaa8f247698e35a5b018be511ca92b23471522efb13e73d3732398c39ae022e36a8fbec697632ddf51ddd048a25bd0348cbc613d1a64a1ad675f4d4e6f91d0210db3ea1402869c5c5d9bfcb1fa32638059165b9f76328d59f07ab9d53970ae00a04e5a9002e95e874dc3ec74020d16c48fe4ec7471438091759dac7db4273393e8303ca1785205a3df8715c5aedb9c2b1a3ab4dd0a15d865ea20e32bdd254546b0213e98a9833df6ec590561c6129cb4ba0fa1909ddf9cb77f31b8570b60922d062020d13f5adc277bd753dbd2aa944786306cc8318ffb4d445add332177a85e9c48802304b4ee7750ce166c26ee6e69c6d6afe85d5ebb8b34e5c1e81458b29b354b59a0300e3c3242899b03ca02a2b62481cc6ca1b8ed9ff79fdd317c6a48eac4a107bce0329b309f1ca4b2d33e0bdb781d9e199f25e3343ae8ac4d412b4626707fd6a6e6ba57f6948bda1cc399e6b19abe1b9a782a18c3e70ada26bbdeddac23d48407c855df0c9b7d8a0e02f1035c1c8dfb6f498a89fb5349d9b960607d4d9372953a8545733f8028eac5fc3d3ffad9d93415b8c28d3db9d10864ceb9c4299162f1ccf226a1ad66d56d46074eec78a226f2c668ad2c57335b1338bfc0c3b480ef7a7042a2722f480011384df4f8beb871216d8dce68e88a40d2e7388128a43e16b363ad2a1c625cd7e9891f0072b8d7bb2f5fa48edf8e6acfaa5649b137c136a7e8c2a4da89639c59d819f69d18ea7d4720ba6f43773477122985cc73a843b4258453e2a53948063e4271e1d676adf8f804311ebd16044c092051296914670d5abc1ec815bd5066b2e1b6433c26056a3983da77f0511180df89325ba958f751d5fb9e47c1750526312e649537c546e5c00cb9420ceb47d4e6cb3afa00dd12a530c4637c86e81f42fcb99fd3e7b655f68d4d182498b432e631f91f4b2b57bf8a02c6c27dd21fd8d43412f19ab6178ab8ead32a0cc524960356e68c5a8494e63c26533edc99b9ea31573198fd7698009d11c73a0a019179d97547aad2e12f526ede82281f8ed9d2c063ddfa272a3ff7821f3e01886a8461e1133b41cd3d61d1b74bb49e60011a10d32cfdcdbd89e614e7858a8fd2766fca75bbc8a9b968e687bfabd2794081e1ba10bae807b00363ff7da31ce36f555ca2753f51fee2fd803b477526179db7eba50b6bbc6b2e60b1e390e75de8510ccee5e2426fb2b8914166b822f0a1c69a3b27660bd2e8fb6ceb901b5bba018a29bfff4869ebb511280e9b364f0e2f77ac7ee9c3b027783836dc7b7c6f35f02b7965c884efc6412a0d3fa33202fa5a1c429e8859fdfb696fe06f395801dd9a097fb29e1a026f45902c3a1e5a37df6498059e4b13d6328efd406759c552e1a706d02d4230773ee812e511d799d7c3e112f7fb4edf75d5a3b5cd830c245b00455c4a8ae3411e75d5167288cddc660508437df09790a466c5f124b083eb994b9d5926849a55e0456ee637c6bfa15af42381c470e09a87fffbeafcd8f9259ea0768b520330a622297d2629907425ed6c3a962145d96c817ab4ec57506f6c5efd769261f3c02a9108003de4223236a7115cdd259e8c3e7838fd4f57b7fdfa6e9103559da8e980c7f61ac227ef532e710cf546c09b737c216cf0e82ed7d3ce559ae11cf38ed15f6eef5708012d6b5779dbebee45764583197574a041d8e41364aa6813fff181bc4e40645aed9b70bc42bf34a9c6f5df244b21550e327d5d7a271b9ff71702848e97735800c55ca5b02330fcd552e9b0d9334896dc7fd661e0e0ac0f84cd60d7197bff126b4d2386f2b80f7c7a222fcd882cf61f281d4bf286d84ff81f998e3f2d6c9f67c151b9b2bdfc13669707d706ba2fc5e070109528e503dbf646c6fcdc116e8104c57ac6b07ecd6aff8e6765f0d4a25bfc857fa46f1436f1a2dd15ae1728e04212983ff985df39eae6c7c46972e420c7ae1011b5de720aacb3f0e04d21dd80974013060946ab348ef411093d9bc902fc635eaa0b6e5aa8c8041f44652b518dd2f0f0dbfa470d074325d5ffd8a1652ac336c0f917be29b5d64dec8f4d000a4ac505cb3e5d66b46a3ddecc81f003d3f07e9f436a925db6c4713eb8c1d12915f7ead65adbb7846f9cee31493536157e8ead2ae96bb5d5bceffec9d4fce06e67bd62f1975d728c01b10038f9acf661f01c54cbcfcf2b866ebe2ac4a22cf369f3462d4b57328ef15ebe75b4aa9b36cf66c86e199533cdaa1bbc1e59f074a4be67e0bc1ff9f955bf5ecb537086a65e58413a6096d7cda1abcd1aed0c6bde80f", "516a005152536351", 2, -1430504603, 0, "341787bc3c3e39be7c96860a2f3d61f68ff9c9032cacc529390de35c80e57918"], - ["61f62673026afb951acebd43042ae46fe7e8f5bda4a002ce5b84117e3d4e58b188f35d55e30200000008535353535165656a60de422b46609c9ee6ae8e12a3ecc6815b0234a3d491d11eb9fac5ab00a8f4f9a2771da00100000000ffffffff01cbdca701000000000363ac5200000000020000000000000000d4238d030000000095451e2cadbf715cf12ae5990b9d2b530050542f1cd9f84b5dae4c624d8ef79d7131f73b5a8b05b2a6decb3fa9f62dded0dd3ef24d70dd1b5d96651c0e7b13739f156df0fec97f75c91ede1d46b8b20c8beee4b586986943e29d8747528409ae00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f86765626d3524fb90283b1e92cd8f1447df0de688355e21f72f3f1529d7810078763f62ced4c4889c695cbeba3656a1df5c1b68e741e9bbf18b0a4e1db287ef534e5cdf85965a2656874aa749d64bdfc1694aa55e95e34c13deaf60984bc3125be1ab8d5c6424c207961df5d58d6880c74cff8bf4fb880187af826f0df8bc32031eff80400305d233fbc2f36605f03cc7783362be7f448105bb362805db4899be031caeb9bf023fa7ef3d23d948b88fa90db253e8720d872f258aea922bb8f7877f0b0820ebf863c2d112f0fdcc565945cc6dacb4fe78ac0fd7291ec34cadf8213b3b5b11bf6322f7be340526acba6588a81379ec8218f4406f06dced52993a5c79bd03278c0845c456cef3e9dbcbcd1e7ae055a7c89e194d267647b86e1c70370bdf60021ac9fb7d9a4f8a25e1ff6f50ada31d2aec4a379d672124410e44525b18228b800311676b903231d7879b7278b1c30eba3873576730ebc0e2000bace0c226babc5803285ae28af9f6e00c3ab0be4c386dc0178ae42f2defe5101801373be2b7139b170307f3805b507df0500ca060e9e433913d9df6fc2f3acc40cf7b4809ca02605d5fc2c50ac100a5a08bc16b95e662693073beda5a4758f449030723d0320818a019fc72882e992bccf8e831af36528b52d2da64286b36788f0a161bce784beaf1338a2a66455e8dcf9b9ab7a93286bc7f9b81e297010e2dec17977875cefed325c9e889690e66d31f0545311f615f7e87a1a80cbe2e28eb2a61c598fec4f683618b7e3beecaf18b69e6f512b17119f860ff84f9f60687b8f1fd860bcc75098df9656c80196164229f857368ee7f4b4384973d84ec0e02cc2105fbb0194ca7040d9acd0f39dd067b6cbc567d034d2836052ba4b8fcd9e9edc810db138481ae4360564bf294b245f7363b98208432dad68cf34c929aaa5b8a630ef3fea970850c7765826ef0b00eed7c413285efb43baa5387cdb7dff7678210781737e622d9c2e12abb878f298857680f47ab1a29263683ee400ca77024380ba0149fb711757c66e424e9299eb987be42f6b02bb2fe6e57441df23f661db9f3ef4beeb0b3bae528fea3c50ea1d6c3d04e2f1dbc7354d6ad40f294a308e97f66a761685ac2d502e966251dc3db50ff129abee51ddac243f46afa97a3783bc34d3d9728a6177bb7df3f85423d7724b26a290d919119c53faa0ba586ccbfcaf34d7b8a90347222745bccedc54ed8964a00ac3bca4d3e137c4b003e49f1b9233e767e4e96260f1bcd278d2c4ce56afd5f1b2eb59b74918b1d469cc8f309e66af873194c14e51df36e81692f010a1cf6ebf8941a2499b523a11f20fa6ff67c86fb474b28a97289207eb2c3503b8a66798102ff51bfc6f91837b99910660e21034c7c6afbb8ff7f706cce24188fe0da2c6e4dabdc37621c0fc0beefdac9b80fdd2c9d346afb3a98de3040ba50b43f154bd1bf92889f3c247f6b090f05e5c7d6e9f017db9095ab21c96ed66699488b8b8a48ac573ce6a146324e8da96a7dc1610514bf8bbbbb8c84aba32ffe0c4b4587411434a9ded5fbf2445faaa83dff6e3123dab784cd21f5d9ea7861d5c8d5742eec8469c9ec29acb167206183b7da18ffa7a5e46451910dcfd1f2534fbe6bf969825cf4621547a6a25cbf3fea816670aedecd8cf9006e6f69c8c5e8b47aaf5d0e968ccd7b7f71fd217c88576227fd512a16bdc35baa40a177fd178f03352460d568c1521472ab0567ae406fcd15edf642b2a2eace23df003dc9c6ae3ea9229bfae94e26e45552d5bad2391ec3dce8b767e701233573b77461b34e2bcb60ec828bc95094721448126e9f957e7720290de570525482504de2511edb2beaff872c382db5a379f887dc58e3b874ad8259f699d97a5df115177485fce72b9a47bb650ae26b6747c1ae8d4f3abffc632d3b1b73c8d6049dbbc87df8d89635b828e2661ab5c0dc1289ce72359246ecd640d5b090e1907f9d1d6fae279ff015df88f875cae8cdf92bb3c328f485a1016f6457f562d8a933caa1c47e9cdf55b2a1220aaf8e7ecd35fdab9ede47c4dff57e5aa5f0880edb697765e5d5c5c98117e12c1e0f86c6155ce6ee72c85eddb90f10d2b435e42537aa877c0be08a7ae8d3d84b8d3e5bff8e6320b53095e198cb3af67044800d3646a6768d6c271f6bf897fff28208e20486d1410df44c8565c8b924d5f238eb6faffeffde8930fc44057bab69fc579a70ad57fef6b46b61bc49e3245857e78cdb82abe2970780330160b573f854afa84dc1ff26b182f8ce4c8b3063349d33d57b0300000000000000000000000012132a12e56c51365b69f5ea56abaff61d337e70846c431384fa6f6464d8ddab8483c91d66a4b27471be286f643a9dfe376ddcb7f2c44cda43d6bbb5c7557ecfe5083489b182946405210209805e9001597419b8aa4cef32289adb79520d30b50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086caecf0eb889b5a1896493f591ae0b7e1bc87b5e76f2c606cd5107b1bdb49d4de5f5e58ed53b851e7a129e4022301c0e41a3c81c9b9b1c78694d8148a2c8de59ad23726a472ad2ae3c559c900a32326a08304996ce75bb25a75ed887952d0cae49e42ecb8750ed597401f1f3cd720d63b1c9c0480b025967f643bc121f8ad0f030ad2163461cc7ce54e4a7bcfec6033875d48ece9b63c50754f5c1f4427e5ef9a021758faa8f3a9e0162fe640ee0d8af29db3d48108f30dd645472f4abc1058b7690b00679a0bd7c2cf93351e4261b78eb7b45b81c76655f714096c69c8f4fa6b7e63c62ee2d98d1b073f60766f4054cbd90cf5b9b872fd6819fce0823056b3f8b67a0212ab32d174c0ee64928d7f48696649a798418f0cd4a67728ad066e2dfd364312031a8acd6fd074470a6661b4c3421378976143cae6d18808fed406e7c1577001b20207f1c4bce07acb441870f9110de3cfad62c52ce4eef1d4be81abf77290fe37e10226b0a817c20210759351ae397db456575678ac64349994ae7312213914efa5d60317e6d3359497f01d0c8b2911f6d3662937a38f83aa55805a968e99aa043130c4616ff73bf025f0d81f411efc58a744b9c93ddd5ecead0840ee77c32fc5811d141f7a1e1dd7d3641300d5d1fef3df700c638a0e538dc40fed2e5f282466909766807ae399e7a7ed08f49e09554581637fd3bf001cdf24aa300f89a2ddfc4e4fc52263274658a79157271fa316a0b5811d77ac91d31a27375158219dc626ab947414f8769c5457951506868d76ed19d673a533b2869382a6756193aca70a1edd8619bec2bafee55dfb5e85f0af4ff75247aa7311461f7749c97eb76675653afdab8a8f840bb9544b938a88d315aeb01d8493762e85ee9cbbf6e0b6b7eeb132f18b5944cc46be85e2b9da5ed5ab7585fb1d986d09c8182d7bdca66c2fe68a56e3068f37f782b171df4cb55006ff142f7a5204907a7fadec344a2267cf76a73e481945680414c61bf6361f4fabe467df30bfa36ea42d1bbb6d95f1f87dd59af93d366fc935744db7aa1b1ce6ada6513bec21d6b7aebe30eb5cefc3f8393dbf6fcc50bd60e82e456cffce2fdb8253923cb7c94f36b6ea31cb65cb7a37d5390ca92fb3a1d8e349a205d69556dd6ae313fb28fe771c29843896abcf636d26da3ebf239468a1102c5e515112392f894f0b038f018589a331c69f98273d378369a54c04dafe3d992194152f3cb54de0b545ef1e9d4829f9f17d41267bf790450bc2861ae8606958eea7d9006e339115cd61eca07739d8d3affd41f6d6f4ed207b77fe7129d8612a1a9571ac22531347e12bf9e786c622491fbafc42ec5b9834f9921f59685f7a5158705a2a0d4e70bbfc4699ad06dd8cacccd4ce85c09332135faec59841170582015af60f22dcbfc754bcc11c41dc548c2fff4bd931ce285c95c8c6d71eab8c7486edcd58d988409441cc7e0c4577904a6289f7c74821cdf6d2584103ab0424007b59efc603240aa2196b2f15025a9c8e7ae6ccdb4d97ed243d62eb23f7b9528191cfe2e4f3d74dcb16f5724e6f59a16c970d7f8fd4a02808d2c345c91adc294cd998d07f0c5ef781af5c60900f883474d218f73d12c1fdb96fe1b126b228722d545a4e2cb89004802376b4e0813b7aa84694b6c6fb1788dc21aa4326d44727525ae7b92b262f0eec96e2672a5346c92a39ad1d799100c4721b8debbdb5366cb1ac68dff53d2924480b5558c37b3303f4023ec9a71703f2ebe2032cba3681352922b813e26d1d8733ad25812df4bf4bb734bf641bc32dd5d31695855dd938c88180772abc87dc5032fa01dc5d25a75f03e89fb8559534ae4a378405cb032df5ffb104612518dab0936e31cea909d87129d7bf02baaeb38c142c82a69f5038b83c5b142847482f0aa1eb77416b1051f6e97f7a84828a787ac680e5f59c235b685fe998028feaa22cb50c387575e2c0e0779e2cbe8316b46e2ba625bcdfe247d9b001e110de751f35a5817461bec1bfeaf0b08583628be2e156ccf074799cadbc58c02b3a194d26a2d8127d8550fec0c7298eaf456559f07297d6a3e9a2b2cb48dccb47e734b08798e40200a7633159764f7618eb34e41356f78009dac7a39cb687105b762508a354f092bccbb1bae093863096e42b564a8c4cc12a44dd002566169095b0d4f382a91f9a3eb79465fc5c0a222a2b24ef79ea6382ed70079cf00d49791a8919965846e194470509fdad71b22b66e0540ad214217a6df97f9bb1a3e32dfa570343ee8352e557708f8c2a4688e6a23c84cc14ea0190e26c6bb3a42a81d22013e41a89dc17be36f1afbff92d01fcef1bf945e0e8b387b8218cf04f4317afb40cba6afd2e36f32205cca5e8c66ce6fc013cf218d6aea832f3a7aa762e3b808ffc20bdae97dc4f6dda3a567102", "535152", 1, -193940387, 1537743641, "c61856b00d438e7d57c2b19d133288df26d73ad6401d44a0521a115c6baf81c9"], - ["d1b3bf3a01efd93afb57a34ab795e4a1c37e1bee439bd37ee6043ea620d58601cdea010f3f01000000066a516a6a6a00ffffffff043ce29300000000000863635100acac6353e333350200000000085351ac636a53005181225a000000000005656352ac5369273c0400000000065251535152ac0000000003000000000000000035d92f0400000000e9da29f909f7baa3f160a24f118aed4104e87d0bb4a24e158234cb5b7393fbc824dc185b4174261b7a8b07769ce6a204178ad18218ac2fee5b182c8bd9e18f86a4badc6e6cc442821d9891097d07ea7a91865f37b0c5910f6a41b24b86b5351a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f9ab44e6a2b64806a12910dde9ee7e955358075b0a0d89df6fa99b4b835869e729e70b652395d8b63731112bc9060ef30759c7dff2b7b8180307da7a3c11637175603d376be5a3b437594461dd2898fc22e084d3453dbeb7faeeebb7b6a4cb30ed21945a3c7a4bbda002f56565967bc13b0f51126cf0e7297eae750d7a1dec7703092f6704f98f4f572c1d9eed2bd30e4b56a7a1af039af32dfbbdaf052596b5f102002a3a791eb1e2a34790a9942f57906c6f13cc829c11e4b31a3d53bcc335a13c0a06435b5ba9d895c6cafbec55299579844d184553155fce3ed2b4b7cd36eeb32d08550756fbadcdd3c010271fa74f078358577f4e67741433bf66da125a8da37f0216cac402f3aec6fa307c1b8b188704a047809e0925be8465f8b74a3b3d5dcf4d020f7c806e7c58a82ea743ddfc319f70022cf6278a277be732495caaf89fb32bf902189aeda0368b662305ede2227e409abf25daaaae983263dd766af3fb94252f50022fa55b686f53fa5c52a582e08d3af339d8b2215859003f878e9a272b50828999022292182cd8dd8714f6cf1abf7f9ebc0b9f3302f825cbf6f942da365ca0e21a3b6e11c21d1b435a486931f0e77c7ec08b79062a1e9c0d17593d4b6409525721e0ee06dd7060861c98d612ef6e8ac3c4ceb658f728575d2a1bddae81581087ef2a9a369c658b823e01c2d30d9bb68cf1196fe8581803b580e367f7c5e8ab767007a0ed5bd0a88142ffa1a9fe35742e2f04c7dd08b38a11502b18dd9e04a9bb0c77204c5768a642e53869b8a492331b2587b3200805ff2a11036b7e1e10db42a77582bb533c483128b1c1de47e30143800746e34ff31cdfca5d3eb7000bde8321938f0e88a9373578562aea2de5613088d2c77a457f0f783a7be86d46c1afe450d139967af24d5730458753c5e503d489b96e1b6c53722f2dc3077e5b2931e8048bbb0fe1f424d15605ef16e0d3544863b832ed9ed67d761b8c762d9149f03e7605ed183f9cbcad95356e9c50688474b25f8e51a136c2ea706934d580d45e4ced07c45740eb4bec22709c1793023b1ffbff0fc3a8fd4460eb8e97d0492d22677194efc2c86756d8e48bd3d7d1d201ac675c95af70a9680c0c021e38c8a3233cc6c25eba1856566552fb59e2a655989383d074db68c27d050cc30190e963cd28561e6b06cb259476632e12fce4e7b7368ff255c63e87a44eac10e68caf129e3275e24a9509976dc80f85fcc5669dddfb873a19683dbcc5c7df5d1d6c943ed8841079c7887dae802c56e1614564993c5506998e492e94cf6d92a877db39957387d74f7375e25427038f491fe891f8e25bb38fc92a6f00e33e5aa7b428fece64e4089447325c7e2a77e2244c4d7933c7db47842acf363724884560a677afd420b5bb15e77b96b001e7a0c10f7d3d2094affc089209c01840bdd8ea159c9fd96b13361e0e9ae46143e4d2ad1217b8133f3757c15dd209190443a9e87b9a281a86b09db679e097bca432583ddd1f4c8addfe512274313683452b90c93c8c607b9902c9fed0dc91f64126d0a5fb764d305453cb91cb18d7638b985b68353dd9b4ea2ce68ea2deb1d48a2ad1af82e38b7d8ed80523c241a881c62340fce96f2c4a2044c45720a607f410d4a1a3408423f9418366c11020663c756e168b814782be20d8fd984330d598c83444f37a98eaa1a45c331f3d2b4a2e3a69c298d27d56b1ca629577d4bb8403f4f8b105ccb3b17c925feac46434011c13e6eccc22b0f3a145f7af5f199a006623a0d59f38c1a379ac7022746029adc57714f5b4c9e1c639639e043fdf9ae048a408b1b1b29e8fdc83d044abedc8104e7111421e4e547e7c2ba648cf4a82dbfa177ea9c9159735e28a68879ce56a9615174221639a2eb89903456a22feebd2e4103da61b9c8ec99fb8abe85426792fc1242bcffe1f3c456861a2fd8cc77c45c8d31a3cc8fa7bc281fb326f8344527270c5eb1deea84b3760945e220fa82b122a97dbbf4750c61df898206b288377a438c46249f3080f98e6ba5e2b9642f4c55fab95f25684697e269f4fad4ee3a4f31ea1f9e0c33c32aa333b6058b7fa26efb0df7711d23c60f7c89f1642680d50adde7e96bab118f2f7f726b6de2147abf94ff3c8e0d56bb73d48ce777839ceff30d1ea1d3dc1d0f7336f1fa3ee0fc458a118727af8c53a8f45e9f4fa4e61652ba62eae16755e2206f5e4257d8da9e8a0c48e25d3894d94169fcd586e9b421baa68629803e3aa0400ed483ba2ac66930f3ab3cf776a272a75aff1db32cabd3edd22779f040000000000000000000000001201113a4f772afea84e5088dc98d802fa78e230d79290cafcbb200f5456480713960ab0b74d800fd1c854da639efbb2f0880daf7736e5730c70b69eaffd5f1bb306e49c41127231239ae51328cb0c1fac535c3ad44d51bde08192983cb3a53500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d053a7c29e2fbca55a36934e729a69d73ffd4bacc3e38497f621f8f70734e10529d4577a96f36d002f7b289447aa676c12dffbfb3617b22b9dc9b887640d9fd1190259a0c543faf4afb3a25870b15d93359f9a8907e176dd04bbf779c7a523093954742b43f55c2da857c7253c21071767f1789688b07faf000ef97572eecfff032754639d3f280671ad4114137d125fdab16b9a3f12d5ebf879db4ece57d45f60021eb9a264028a8aaaa68dbeb9c8d4bab14f62e279a6116d7a42b3cc382ed917f20a05465c7da7122eb540bd317d56a572c3254899abaa14d7db422b78e097cae215c2031051c360ad84ee7090607b1805a9bd8aaf37fd1ed2f125476a0775305a2f0210d00f952b56acd8b99df99211a516c748478cf4b07a9d8cf0ca16e6834472510215fe5f07dfbc8e0e2987a1dabc33886db60d563cc4e2ac8a3a0a6cb472085e910319a25cdcf1a6af9156c9550ac5c83a445f9d6892469bf84c64cf9d41ec0ed7e7032d008c7188908c9eab10d654f23100bc30be5619487eae4cb4919751a1163d12030651892741604210c1f658e2b2df3983f8ab7be029614fe24df1e9c3bbcde72a8d15c1835cf596d55331fc21c9a8175675bb6fc2ccac8a6f8fdfec94b894cf5964d3f763f823f9070647740c294482ba3a22faa670215c79390bbf11b2a14cbef70b01a41d7cea2a5d6b82689a2a773a03f95637f84b287a5ac1b539c2fd526631b87b62a2c2cc09924c84ad17edc8e93da6fc4aa4b882d784fb278d44a9460b3bf0714ede0be8158ecc3155b091de9dbbfa6005841619fcab4509993a9d4514cf99cb9ac9f5dbe3c78ad46ee59881ba7c35ac37f8073f92234485085dff8f28eb990979506dfa9d37af15a16d6900d8d68d2cce2e24e75057f1ee11b56a58e25680a2235d399645783414753a2e3050b34bdc405b829629993b36dfac11173c7d522828d65b0fe187c595bfa8765034c3231bf5a2c04ffe4f10195bd6282068bbff5086af7a36a877c2c6276455dddd21133c1d38056e6a7b124c51b77643de35f9627729577a27246d144979ae2bf9d1c49fe3078b27b458350ce2ac82dc94c790784a2ab0bc7e639b75ff9206c25fc268d68fbc4cc72456ec542717b4adecfaf1fa23e3de17a33544697685d51851a9a7ac7c5170e6fb5e7435e9dcd2f9ccf1c1485f04f91531c21faa4bcd3f86b107a27644f87a64c48c9816490a8730f18a181d76e5bbf73e5afb938e421dc2f642f155cad7f84cc620ca0c7d4d7bc6632b81d366df1db54e41d0de42601bb3e6e21d113e65c3bdb5319e50bd6bf6bff1e9efb9dcd3f593af4a931e385f4eb01673a5069e991ce6805c6b5fc9eed965c6eed2cda964ef0f086663d4cf6acfdb64924c77f2f4b4cb96aeab4114ac14f71704f3c786c7c2a6906f3ca860dcbf73269a0d2cfde09694934b0cb47a9a88e4e1fee020ea54067f478758d836dead19f7312ad9cf0f9de06938ad5661c855bce356fcbbc4bb1054076c55bc0acadf9f45469aff842bf710e7ebe8119a6a16a31555567ce43fbecdf032b76f27b1f4c31ab013b74aa1097a8acf25f1f247c30063e02a09604f1d97ade82b1b7bd90a73c2758fe10a731e7c8d1c4e5e13d6ae206d91f5047fb04283fc5ee1742664faafa45bbb796b068bd3374b199bad5e159c1a1d312df37200cabc9182c11b1b266cd84afc9a9bf4fd3c204fcd07254cc708e363087aec23353330fd93a7392504e440e1da645429af2853253b12efc89185cb03de7c112f287ebf93e8997d2973c7fc2624a05f6434b06d3c044a4c94ebe48a46fbd44e03949471719132d5f2451bba52b2ffe40f9554ed1ee78e934a42a2a76904e37c3c51dbc56a05bfb8097dae069ba5e226ea1feaa39025aed330d32a04ed4db5c7d59cdfa47bf61dcefc5c1a48d818d058d0b4691ac3e16f567d81a0da27cca6afc1f2c0030130aab8a27c05c6e2a0c5a2f62a073097330bc0dd4520b85eabd527e346c5b2402b85f8757e91fecc9b499aed73ce10247510253abd20eed6f84c1f680bacb49ca8372c03ccba1e8cbf829d99c3900feea350d35a1371a01d5e8c646fd2ac51129653e31f5db909540507e291837282cf5d5def99ad0bc8528688ea9cc30bd8b7121e6df3996d24cae6f76d77869ccc4a46c849cf37f12d9497971d0650f2a3b7500070d6017a5dd306287d535831dc2710b0bcf9b35dd8c080a59ffbbee18a7688bdc587b831168116ea22d030fd53b9d526113bb506084126764c42ca56d974e8a7fa8284635fffb700000000000000007f2efd0000000000be749c098eb4fcae34dd694010fb1c846ce059e974e3e8bef2e72403a15504c1e96fa93b25ba7319b2b70dc75ae741690280eacbe0e8264ef2f4e9a7e9a0fd7e1c4bab21a5b7631d1d646e9cdace93832aef767df4cefb3f297ee6a7ae16c06200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cf7435cdaf33c6c5874171bf399094ddbf317327938cc9471ca48aef7adcc6afa81a0791b7a6e1ec2f46e88292a4ae3244ce42a563a70909f6d43e00552d145c697e12e4b915a894cec71b99b78eae331a9e3aabef2c6624354dee0ec2875a3cf16b7981c1431402b32dbf5beaf518ac6491e8546e91142e8f86f9f3345c640e021b1db43e8df2dc3d34eb0e982576052dc8e533e791e9cf413e021c62880134af03005b015a65424a94baaf9a5d12b341c461e8eb06c797213473b4193507fd2dd50a063053f30cf79cb9dd70c414f7a6297123afab15e859dee7b036649f4a08cc4dbc9a4a621114fbcd8473034b1d1247fea6ae5e2ab22e422708cceca26041b36c0329a24ad50c52f1b9f47681ae9bdb9a84df19f9504413dbe50ced00950b0f2a67030afb7e9186835e5df4f2f9844f9d13c35dcc120acde62401eaac31d3d59c90d503013f3ad75d213d1edd57f24b227444d770876b4021e2977cd829d876c90a35ea02006f2b682c8c7d3e537f5878ec05a2371580ecbd6e6641934d19ffbc20474c14030ab99ad422606bf0a71e7e0d7c56dcde1bf90399dddd8223d5eb82a73e4d91091456c753ec3cca20f93e25f7c3e630f82174984ec58fd0d397ff5b4eb52e2bc7a8a71bc33380cccf0562415e7adfd46f6c1fb093358eb1a606949215502cf48987f44c0931818b094e9907af55cd9704997bfbe03a46069d55996a023268a23e963f5331a79f97533aaf4615900fd3347c07c96f40f4dcfb60732f4d3ae51165040f1b2d19c8eee962074ec4c74b3ce375156ba419632ac4d878274b6c1630ad9e960b1619bca6aff37f54e42128046ce2a9fff223c0ebe11b143a8f571fc971bb377992e6287a2d81c238cce3e5713bb9ac4518447f10ff2056c4fe061b9bcdf28a4e905cdec6dc7c1dc854c38ce13dce62c4e5b5813669dd77fe092a5da03c73d54bbb98c28cad5c38a7312eda9688ade0afcabb3cb58f6ccc7eb36f2d5af816fe359eeee834f598746f19912b82c153064fd80dc27b640d99de4df6bff039837df1ab2c7802e4b5c1299ae08eeea7bf0476c9ea1cb101b695b14848a69fef829cceb878b694f773f9dd4fe2b73d3ea8697df14e5ea620371065371b21ebe07113fd8924e8009d96fcc5565f6021a33b6a03adb172b534b31ad818fb8191021a4bc50b154669d08693d07d5479a7c32cbc62e0c9c2127e2bfdddc6d8c2bb45f21bad9c937589c2a33ec868558fb5b0947adf95e1f3925bd624163b3154443f80f0b937b1ee2e846f5d7dbc7f5422ab0627f1c3a80864a18e31e736b6f4189a0a719d7dc045427fbe6323c724333c88a62858953c30284a80d2df6831f38741baafc764755f5461440d3181ba48c8ba1c457a7f6fb5f5a1922fef96846d853b16e7e8c9304db064ef90d6f266d15db7f56b0fab09bac699ece2238499e4ca6bee8cc0a222145f02233ac6433467a9fbf5138b17a4d3d8e43d5bfc830fc5c6543079b06bbde8c88275c609f9ab9883e449c9a8540178b7a0779705c054fdc6c8c6ee63b850f08529281049bb7400cc399a427f5795108fcab617323664b94d84c1c65acf7828e709481f1480008aeb0e8c0f049131571c4f328280471690f41f14568f6fae8acfdf93cfcd96dc6ae7fc10c361e148a1c68d3d4e4f83df55224414b1645807001fc9e4178bd469439616f5181bfe7ab93a519becec742985fd5769977b13f0147e61c35c8fd618de1bd77729d4ad40e24ca49791f0425327b9aa2419f4e8b99c9e13d2cc25aa6e86666111c7da2728b14b6d768d0b336e32c36f5e5f61703beeca3ca65030ba7a8766dd1d5a2e4a799c05decd3c44d7d4b6c0955779c7094ffa343ae958260e4ab2817f40b8846c952fc7ed666df25b6ebb27e8ba079d88ff6617ab11f1bc08c38602e4bddb1f09b462387aacade1529d60544b01a921f9e041554cfb6d0d54e6d3ddc18ba14c3d2d54038274e18c704343a59149a1fb4fda70dc2d98a8482ae58e25e95615e56915191011e4491bf39a337e7242d06a53a82772ccc554eed3a4ec7522fa4acaa0b2c8280db912a64bdf7f899d4c70a15ae5b89a3b70bbd37bc721f79272596ea3360b400900c0aa5124b107e5cedc0b00cfe0b398c81c2d6955cb85b8a9e04ef39a0e315908930d84a15153c85a1def6cb5b7f5ba2bf456a4ebaf00201243385ddb494de4a4bed7caf448bb6ddf91d9ec10e5644510042e949fc12351517fee02af0a549d290a0192e1f446cd922a47868acafe484b6c355e43054d862700476dbcedd163871db2da3fe4badf431aaa781acb650c4eaf1e43474e2e20eca657a5b7e798c810bd72e881dfdee54c8d9d09381e89ee15718633c08b1d3fe9c2945f3a1a18e7c3dc56a06533b97aeeff563db76322ce4478e09c36cce87bec0b", "536565", 0, 129817968, 1537743641, "681263f1f51891990ac96559e14d451ad6db5f508f31e6c6d4f4015620816cb9"], - ["030000807082c40303e0132de2ad505e52641c90d1f6275d6ca5ad6db97b367d52d66b1c8e8cc78dcb010000000152ef412ea4f330e45eea5872845926fde7e66caf398a477b0f74d29ed65971d7cda139b013000000000700526563535351ffffffffbfea86b2beff293b2cc795ca99d3073aa53066b7c18baa1c03be5c9e86e30175010000000951635265ac51636a6affffffff02d99571040000000009526a52656a52510053eee83801000000000600536a6a656a000000000000000000", "65636aac00ac", 1, -1049865573, 1537743641, "19b66deca7baefd5ba4d85cf48a13026eb30b29140864e1f20142dd2e949a3d7"], - ["81c9762304ee9e9f4f1d4e763fcbfad682c30446943dcb4df77c97c72cd964d6a9a1e57d7302000000096a00516aacac656a5204eeb2d31814f6f19492e3b703ec08afa590b92085e2e4a1aaad81e86fb297207058fbba0300000000a45bdeafcc25d2beb8adaee312af960ccbd3e745327b3e304a14c787940276cd011b7644010000000152435362f79c981b6ad1099da982eb80f5855b645bae70aff442054f43b0736292e148b1dc0000000004516a5300ffffffff04c8525805000000000863ac6553005352524bb01e0400000000016adcaabf050000000004536351658ed2e5020000000002ac5334e43cbd020000000000000000a507d1000000000001b583f374191163ff7c1876f455da0c5065684f4f838818e435d6320953581bb4d5b8cc094c726e33be79f5877d06604b29d58f8934e501b8b6f5e831063e61850c3348bd7cd4dbd9325b58637eefd6577f41cf108be04301337009bf5c947800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fc9d42cc6be739465e2f8f28be019d3b8fd6de11c96669930fb38d4a2d32cb88edec98db0bdba92ff95cb1f9587fd96b2c784df68bc19c38604631111449aef1d54601fe8f97d6c4f6325bf9181ec1d0d335ee3cea302cdfc7ca512d1428cdc55dabf1272de7033ff2d5f5f63858c41b6da94a0275816634058171bf48fb61b90224fcd6eac3d84ee422cd357406f759bf630c0185026341a99e5484b0f99041470315eb14fe4efff5df9d8cd01bbf37cdaed8590fe839bb508e1343104df606e0420a086573f91eff4b84f1fc94680ab4f8b55e9d5be95652d3b213085709778e332e4f8f9901ff8a306fccc5c9a7c704e79c86ecafe09b6395cbdc4a51f0be48d46f020a08dfe0905e5ed6f5a7fb949485b35e2aeef70233b2a3d845e0125d19f9ea39020aa6a483432ce92465b0f61b8d8dde9346a0b0e2ea6f05da00e382901b612d0e02190ea3a25cde5e083fda319797931a8b9a3482e3fa6a8aae7b2e0864382d2e5c020a4cbb634b463775731f22763a73fefc0c359ff71a6ee6c26aa5f7e47c9d78610328e3f5b403f0b3537086e9fb5d4ed0b7690b3634e521b06e75b6626faaf0575bc699b832ecff35376cdc1590d56f510dff7aace088ae0a01046bc502d77e708751db8e0fc33a16b27417956a02ca32f3dfce31305babc1c268ce719dd33eaf21b1c3c2162a8784d2b3b205c542bf678ca6a36dae606982a6af112ce2012057708f04f4fac0197664a78c4c95c6e5afad3ba325633d22a3235a29d51a2634b022a489ef2ff624b9efaeb5347ece66a9f29c45c4fbb412668de97435c57a22bf3326173416d68d2fc7de7f2e4c6b9fe14cd0c0f5ccbb98ae807106be0088197da1530d44a3caf3a50f1bdb35eb2b50fea243a94e53caa7a2f3820b1bcba40c2960771aeef8f1069d4b7d49b2b41f4a36fddef2de98bed1059a2a85b406c51a8bb88541939650875e4456527e5ef9da301ee81e02d7fa4fdcd59d9577a1dd66d2c5fa7264d167ba0a46635400c32564c666e8f436a77779c1e938621195467b551ba2459cc85e1ee75042c2b6b2f9c14c254fab680e362aa5542769666f8848fb4b4b2b3e7a9949af9ec0d7cad1cc8168c22fd5a6be22e23d155ed7b11955fd03fa2908b77f7e553542125ce12564d6c86a37a32fb1731c709f36b2b0d178ad6aca33cfd6914128d6ce3c1c5396fa51c6f2216733ece205c9ed6edbb814874284aec7f4e5abb3578fa269fbf27d03c6c557d02347dd06c538a1307a99da55dd312ea7470ca418da74d90c09208ebd7876107cb1d5635bdef70bc2f0c8ea73fc2f990f708a6755fea173197253c771c8d41341ecd3632ac7d9937325e8a8b47eb047db8dc804c200e91dda589dc4f641022d663412afe525113f66a56a87f8734c94a3f605aa104b261a75cc8e68d596dc8ba8fd97f5aa1f25b8e99b92bd6c6a098d952a327998e4cba53f2545f0d1cf51a3aa7981b863b39848e09091e74c0da93438907d36d86edcb659d7e691a38e16fcbf0bc71fd52d47a7ffab6dec2fd8afc0fbe2089d88cda58bd6830c70a90aaa77edd699d77e549b3056ca7bf471250f4316a99593a04b44413bb371f6fca4fcf5504d5899bbf0869b5be34662a817702e8c69b2ba5284005e20ae71df1418d42330cce40458ce726e35f43c990647a05f19e10651dccb39c971ea0252b388a365046507c4d9225f3a7450493801f72929e4a02ef3d9cc7c185e364cf9b17ae4d4ad137c6bc69ef270c96b00453815924bb0f698ad699389af80c94d5951f65fa4dc0209cfce9e1a14aa1fd08d87fc2592313e23ab6b6f3b4bfeb1cea470ce7bb890fef3fbe4c24bab508a128c908e53db143ad1cbcce354729568e6bd39a8d8f0aa957afc79e65c93980f618e7a265c66bbe691caced7f26338a91081627efc6803269dc3c946195de5f53a227274c920e31aa4ad40f689c53763d586a3f681518f5d6126e7f1500f497427c05c3b0f65a9963cb971fed5c44a774a9e72338577c7287a25384cb266f467ccdb6837aba28ef42e5a9e89fa76ec28bbb058236975eccdb8c7f4ba1038785a96a5dcd0ce588919740da7a788a05de386d379c1b3f529d8b1d6438ba0791dead4ad139fb269bd9bc0ab96f26f81c6fa5cd996ce545f870c3a73a4a0bf8f3c0584a08044f4a449f2ad2083a09bcea5892f343bbb8af4e93efa841d0124a2b2c94c89a18d3da3df1197db43140805ef51fcd6aa6e006729a358016c5575d12188ee9e79bf384b252fdb62d1755c97b4fc0d0cd39b0f8328e700000000000000001f5ccd000000000073d750163ae23e690224dfd39422f558a85fca6bc7d49f718710b38289dae07efb22f769e795928b7327992fbc86d51fade7e3c0a1c3e0399df121d3c7bc81ef021ef05033712c3972823e24ce9031f5f58965dd17e94185eb2e1a30fff1f63d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e42185788e62e489df340375d3c063019e716c6874df3bcfd8101f986c2604dcaba822fb0899b1b4e402e3e5d53c3bbe8f8ffa1181c0e7432c20840810c5b6bd384b051e7442e3e4e86a987b5663a0eef166872f35dcfc63f3695a8af9324caaab35beddfdafba090c955ddbcc05b12f0abc212f375c72768e8ccbb528bb1bd3031cd3198bf1c096d12bb441987d07a1966e6b2abf288a479d33a1b8ef125d0d6b0209165dcaee9b54a3c79e1a427d06a9be271f72dda60193603b38768d88e8561d0a030a34e789492a593d0926e5405e7e94caa064e2dcf96897acfca41f568445a9e04914cc152c6be4beac0bc862e0c37684e79d2af69376650abd76101ead89190304d347692c4b8b8524e99bb3464ca5638cf67f531d1e238ece585f01a05eaf490316d2de2ddb5c1a9c092eeecc34d33a63540a63fc61b443206d35ce243cc6873d0311897d5198c673629b24d09d584977841220ed1757959fc0568006229d1194d702123299de7e9fcdb879be2dc04b6f258686568bb6faed92b0fa35a04a0c2ea6d2032359ac50b449e3c415539e9d45c258fb3e9b68bad7c848eba6c58b18f74f6fc98da9073eb4c3f1d66da6b7e47587ececb4b66f47a333ed96f93b70d2ec6dec04a41305c2e4300092102400f3e43757df75cb1779f6593eef0fe6244a52b16bf9743437922b2f67bf95b0d1ea36e60f600baaac143df67d1308445f4a3da95f4f5cd8374147dfe8f9b072a1fab16720b937e5a7355bf1ee7c12e1374bb6dcf9a5e1bd7a6939ebde73391d2d955790eec19d8acf7ecedbfc98bde3d2660d44f161603cb5be94436d354ab8923926dd942bf385b374adbca8bdbff2aea815dca1749a5faf01072a605b1cdfcdf367010f17f2180c56f10f9e20a0153d57574adf2437620a2b15c6b6c1c5fcc34f318dda1f1b30d4b7c594469a17a602de58d1039c4dd91341cda9eeed806ff44628a8ffcc9cae019564381bf97f728d30a4389ca7a39b35ae9b3ffaaba7bea344be520d66a45e279881eada60aa5040e64e756aea115dde6a03189596ae4fb49616b861d456c78bd208eb6fbcf62d6ab5921ff718959754ada845b1f000c538aef4809bf2310d253fd65b2359a99a05e98e67c6a1140d6bd38ea120eb27277b1a16e0fbc6f9a45b49036a638748bbbc6634939dfee78d9f203a272f974579f7ef3cdcd75e32c0f32e5c0c5ce003317ef9d893e652a6aa4adf31757e9f7562b9fa6c5d34567d1e39000f1156a84e52a830554be2ab78903cda13b233e234f4b9ca495a87a4074185123c7e7e3fb0b047131bb02b654ea203f8b20db2776056bbbe86e39a611c305fb9109fcd047478ea36da2b8505999c3b17e62aa942249faabc1007a04cde1f530789427362b9f62e03dab34961007cc386afd6a93d0d23a9c0a9e8e828538b761ed5f98056c5de43e5a7b433d0d8b920cf90897213aeed44b579fa4fa1f29e872e294db930db1cf338dd68b26371e7aeae155e8a069b0e5ed7da21fb3c995dc54a009e85284d7fe15c6ec7a73eb808b5021b5567915ecc1895753382e8f726f0373e3b265e13f799e5c1244d3e1395ef9e2cf6aabb63b91863ed045e54ca9304cc9c18a2ece3845c9b4b8829387d42ee9a7cde6e54869d2225c0735ae75f6f72a56c384a18621d1c4054b227b0f4355ee52ce10e4f5cda8a0c42619fdf321e9f2df87f2dfb994f9c60266299f624fd03ac8b9dae90eac79d3d84bca502ce976e966e69e1ab906f98aeb09a123d2a5953c238cd85fd0eb6f8996c499d6dae69af5f3327fd0e7e4f1e95b967412d8093aeeb4534e414bddb1c1076d726b064c14228f5ee5517373ad3acbcd33643c08f44dd8766d307bcf80e6e20fb3587a2a6441394ea70b85ff5c3d9fd4c3abfb5bcf211345088b29844b639c0a381d98d0751a8b8de2451933d66a3182610d482643e96b4f77a0b426a02bcdcaf7c4df67f404d8d2224b45ea1c81ed90191f4ba2a9eb0081f2ce523e992b9ea5f5bb9fa952a752eb7178f4d09b72d2ad6ee47614f0d3c0a6da9d4923625c973e317516cf63d276b1d2e9aca99ebad18b1538eef52dbf6ba41daec7f6e3120e8ec8bfa34450dbcf7683449c80a519076dced4ebbf280e5d7c3965358970d1ecaa1b3a3f16a4774a62d292776ca483c7fa46af835d62fec74ca12faa1e08aa2543a6be59917d7182d9dccdc399a7c09bc5823364ed6bff720904e618797f4d83948d5d6c49a3e45160d7958da50b65ac2946c18db231fdfebeb192e7c4defa81f8b85e225ed86cd9b4d2bf20f7c5ea463ce7e5e7301b2c04f1ad065483eb5e0d6225e667fd09cb1c1823b70995972098c76febbc44d6e898b99f78ba6ece28c3ef4cdbdf53d4c3d479bb918a729d7a602e94cb967f54445bd7f7e03e7f6d9bed67bfda9ba08", "00636563516563", 3, 785745161, 0, "baa8c3313b9b53752c3beb100bfa81ba3939a257c369ca2c7e2d3b24af553412"], - ["030000807082c40303c24b8139e91f4415914a5e39c347aad1b313811de4d323dbd5986254c963046201000000086a525252ac535100fffffffffdd32dd880296a9af5bb2825c743a7d3e206db33d06e7c45061c53b26e9e37060200000000ffffffffbb69a7cb8c89c5d8d5782e6881ec6fd538a4024afd5fd9e8fac76d18840bcda30200000007516a5365536a53ffffffff01c94da901000000000653535200536ae248de274c9068d4022ce7e901000000000000000000000000d1e7599498646d37b063e3ea601891ac74206358de96b9d031f47a4a8644f00a408fe9f61c232afcdaffc43ea17277df8229017242132ccf2831d25af1509b5753da77200ac47b0b501c8519e7fa2bb0a6b32a8c95038b8f0f160466b184d18700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8b14266d98d5996ce8f4511070ea587f16faec3d6fe7819a4f8977a7ac0cb650a10ca3dee98f86c387793201590f759242c8c65fc8d456a7fad0dc8590e9c564b575434e276ff890332297561a8a20930acfbfc33a8ff6153d4773748deb2e64059ce475495fbdba4e84198d271a4f7e9a9fdf1206e5a83f5b448807662509602220973dbfde5d8f8076a2b4a3bda6cbc191bd3b23860b311b15a8a3c0c21d931022351386c25323df3229c7780ae5bf02432a6941e6c1c316e2e2de984d3c9f1890b063b0e527b0be9dfbcaf2aca4f1fd9998486a6d08d1d21640afad44933672718ae6d431225fea7e7f759abf8dd2e752dbeb41420ed03471358c8b4d33d9647b6032cfeb2bf896883f046d29fd86d10f90b55e6f11e7d6ec4066cb038542d13d57f02283db90c69ee60e3a43635339015cc19e00567a3ff62be28eb67da93a1db1cb303292cebfa0614328eb6289c67eb23f8f4753ad7f56aa56f6e3db07efbacd5be0a03147cb5c4d946307f3d81d1839bc8223343035643ad504dc73e7c187314b8d7db022e51dd07fc4de5bfee9daceaf392974e9c4caebd4cfc0f08037205de5ae9a130780c77c55bfe95ad409b281bb5c99e4ab74423219dcf6845d80b95c1e4c37badf9154a373edc6f6438c2ace3784f21e9f9185ab47f240eee5677e2cd0af802e39eb2dcacaf4a481f3b2feb6647df3ae432254c2a19e26ac2ca15401212826eface2b822112205117ff2cc8fc7f993ecd6ce0967a7fd5fa8d3c4cb63611fdc6a34a8ca368a0e5e6c55ce579aa5d62ec5c59c6b8a297f4844d32e5532ddf305bd6ac87ac56373c07d927b4058a7b8a20506aaa15396cacd1655a4d60f3e78726abb826f82ebf4b9b54d0a87d7e8de9b76dd556f15cb9d998ab08a5e9e07e5b4dedd5d2bb4374990faa42e2b7a29d8f2f9ce2ad7b0c39853a970b9952cdc447e01f986ac1f1fb84dc40cd711a51ba499076c2814897d1dd072cf13185097c36162ce94c211ce76570fb04892d23106b5ca0c8934f1f9861952623dd087f47340c5f6a2b2df80acc36706a11bc0a78eb36c0a9b03318c45dc349e3f3645d852f29e0a6bcd06a0090f7267f15c02a9d97b7f9dd5c6343257297ab9eb6a090671fece723f3df3593ed97f2c31b8dce2442eefd57ef89106bba026405c8141c996603c574b07f0403f55e125dc4910481797a5cf10aa4a50c60a6b586eaf01e1d1c9cefef548d586b7cc3f68f6247f9fd7fc4fd8451555e78a79b9364efb95c1f3e010bb13b74226017852ae2b86018711decc0f1c25cc1d26a8d3f1a620d9a00296046bed29bf719a965a3898e131017c61f6e6287442e2fcae86d301509fe432526e935db8f1085e2d428d0016aa1ad4e328fd3cd2983197503a8fa553325c60be26d04759803578d0748d6603cdb681c43ba5178ce9a937ce14dcb6d035291c9afa4734dbd53dc1a42a7265ca2d4ab4e88a5d92421f1102da241bf4cfdc52a007dfde7c0e5d534f39920669df432bdcadaae46c1c790dff027a75138824ab5492c579821c5568eb0a7a8ba150e0cbc5b42b6e481e528ad4b9ae0811f2b0c23b90032c0915ad1c9e0843f612964fa6167b43ee8d859305fae505028b5a689da591433804f4f43adc72bce7eabe9a9d1aa6f2177d4c67e1eff85f73ce96c48afcd7f158dae939944c861deb71be173775e8817da912e1cb76b052c68e6471e047d3e33a1f64c291fbe9a0a699383bd9068573b65c878a29e8d11c3671d9c989a0aedc00dac6f57bf2c7ec5b89a255a9762fbc744f2559261d67d2e6020a3487589088f51b9034ea277767ed57e0607c6528cdf016d828c050ff1f72e898942fda8899c6484193e7586629fd0591a74e527f0ffea01faa424e2f9979f0bd3ce58ec26ef7fab276bcd44656acac6431fcad02f7874182bfaf31eb8343bf83895dacc084e9e67aa17a6cb9bebd88b12087eb37afb4bfa1ab6051470178d88dd5a3bf210cc2d8cabf554cfe8fec5a8b8ea4251d07afb2f416601d63777a974f8964ecb92fbfcaf807f450b09b4e0bc4063c78e9ccf9d3a671004ab1d0170797e3bcd14e64521666b3ccbe0ff4a7587fa90f65a5539f06e2dc77c235ba6ff4c7f4de8e17736463a6382d0683ab3ad228a405ff70b5673b22c0f09867f6491770d3f8c6f1f9c06d547d7bae6e20fa86911b7e01d989e2892d211feb38d667b7685c5cc23f2750b6713451aa99d8d61817129f47e626efa406ab116af3a044bb919088d5b1470e9620a25a9ee2bc926441e67c3dec0b5560456427f010000000000000000000000002ef1c848ae929c1939655423ccceafe3ebd79c7f18fd131ba135c14675bea30c7084a719a02cb498a5c40abeeb624359f27cb8596f3422fe0b3ac8c9ae07ba13f1b7a10ea5fdc9b8391172426732bbe58b35bee9ace3c0ce48f393dfd0a0528700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aa0637925da04113a5ef8289ba9e76c138a33ee5e51642b2484d8701b627f4378f61d531f43530ca2e242f092e9fb5d0fdf315b96974c5c7d7bdb4b7e6fc193e14bce118fc5e7e57b3d9b213e30b4af95f9676cc6756a1de9605f1d23ef2a1be411f20222baf70c333cc8864d185c4d928f56319dd6ea488f334575440b220c1030ac962f4444d33e8fe9219d740754df071bb73792eb6a1c45747409a31179e330305bafab0a9497e1305bfa3777a7cb5363c2393e241f70ec5e2c12fb785999f990a04437669b054fd35720aa56d80fe2ac147c2faa75e596d2af816667562d797170471114e20fe655d055123e4c2223d9970a0f0841906ec2832723d6f01ba5dc303008dcb19696111f10ab0765e65348f25a58e12ecadd8356e452941ca2c1f7892021a0fdc5f609d98dc0c38260e4291af69dbfdfc5f1a78d91e736de71821539d7a0204dc903939e09efed26239f9fca47af97c68927ef99c645040668f9844ec0ffe03197395daf57044a7138ce630a4aa7737654c0c0e1783941ee82ffbcb3190576902126d3208792fb4814e8656e842b5558156c9a59f706f6ce4b6ae9cee4a3da92ad9bc772c2b99e4c4e877284038beade89f1b399a650eb7aceef61e683c344669430719979a45968b7773d326b3da481ff53734be86298204aa5cfdf7966fbfa4732cdd65849305abe31aaea24e26afd810d4efefcf9ca54ef5c6e8e3bd5100e0839613b771cc527d6aab4701fd623a01346c3be5b921b266d37f04135e4932f2a7941c020413d40e84c7b9b8fa58ec2e1500cbacd87757a1f9bdda43ed8f45941dbefe8986c2343960406bdfb5fd1f8807a7e9430f267db739d0518cfdc299f261499abe7632e650ea6265432e89a47371d379aec133dc5071756fd1878cb3e523d91c06d253fd3cdb726dce237a91d56b95acc5d09cba1b655290cfc80e23d2d72d8d76e6a38b89fac50972a168af2af9a2576336c8bba86ce71c374a52a91b2bdbfb382825aa7592339d50a0116cdb99790422eadf6dc7bff2ff5c9bf72a8c8ae2fe49806fd7b152420fd795f63a969a618be355ff39a755063794f5ad22a4a104725419b048a15215559f5d53deb51c7943315ae4244f001d6b0f2fb2949f068c82faf9b2ff8218b78fc5b31f83a6231ccd8bee97a74b379251fa83bcb892ffc6ea70cf0592b0452e963431950bd38a16e2c921dcf9428e2088902cfc6f896e360314d919474f07eddebf0dc90f8eb6e8a6cffdc22246725d8f5365694e1bf22528adf70d508949e3c61f6f3aa8461337f3861a2aab24a46dbcfc389477400396493476880179d9527172cc5ee19acf02ac3264d9b2be965862a9149636dce5d65d1056f7c6e6d926cd480060f206be08a4a8b14d843d92d75d39927a85d1095193e6f58fd4d8f220854028fbbdc63b570239f4909eae623c4bef519ed2c8c5c0b2d9e337afde3b6de67bf9d1283ea3dbf7cf865b9123fa8eb6a5d0645ffc6e0759a558bb53bd62af3aac385e5b7cd2f0bd22ae7053024d880e88e1341b1cc0a23a2a4ae3cb30c1fd05ff561a3ef798fa71c09f5e3dea307155d5d181208739410909502cdc6d17f6e90d846f302cec21258abb039c32fef675eaa8c151738d68b2d4dec1facb0c1908cca9d4d2c71ac2b77bb540acacb701029cd1d2903db7447191c2ccfbd8e94400743d2885f488405ac64b710618bf21ffb162def562923abca3e971b1281f37a6dc2ec7026c1e180b5a52665b9a47782182ba3d280895ef7d8bee4a3a18ee887db6f36f2abaf8bb3e63688dd90ef4d013ad4623cddb5fd82fea2d58081d7361ae97536ef5106802ca5cabe10d34c439124fcff94f6b862e77a899679f44e6647b4829f62e216d1331071ff55dc99dd2dd6bfea48f0599ece1c165c8b9b6718ccd1ac57d2e7977ab2d8f1f2824bfbc214b8fc362c1f658380b0b4aa3fbd40d7e1e9ae60e17f385d70f78da9f1fdc8ae8e250e09b9c530acf330e6930dd395fef5d2e99248a706bb9e242163e6aafac394a22c40654953720f6b29b8e6591543a27923300d8e139ccf362f071a9a6da6e02e734c4c020942ba3c2cb5e827a7b9acc8bb666ccaef9b9dfd250e4429bfd5614a4d566562577b3d50e1c6becba5b09f79064626856fdaf01947ce106b253a3261463783301918545cf7b143352e79042e6244dadade6ec69933235d99190112e9812a788b9fcb65ab69bc09faf87eb83a029728367659f201b34a6edb10ac2e1fd6ddf3d306b4b0a944fa07277678a78f3ac0c7989fa18e3316993129b4460efa363f5655022382e5f5316b66574cb8babab098bfe9ebcd4185a3fd772823f89f05f4238f8ae5338b274696c90ac76b35722a2cf789ce8e3b3e6a5ca145820035c2a150ed0e1c5facc58300a30298b3271057f703eca0c", "6352526aac", 0, 534640012, 1537743641, "a6ce707837a3d714aa533a503a1d634dae0e64c45cdc4bff8eec593e48a6c366"], - ["d2ac99550459cf898ad093e519c130ecc31ad76c4d22a9f77356c17af2465b0bf472d7802a02000000026300ffffffff13267169eb7cbcfeb47d76b5fa542a963eccf5a90225b5d0cff9450c71f1f9120300000006525200636551ffffffff8b2a6e80c9d9d4e5fba57be8f210d79b403e6d8e953f078c978ceaa38fdc8912010000000069645dc7543cdafa2b7ccff57f2398a6f717c4a011a9b3e739e00e4ca34e677c2dcb4ce80000000002515365252ed5025f0f910100000000076a6a5200ac65530e0ae000000000000965536352ac6300005200000000020000000000000000d232cb0400000000486e6305557501a434a1157edc7abbe30a63f158cbc0b0a87c55157220d05a4edbb4c942556cd684d1f5ef96e43ed3f01ac74eee5b437411c0d7e441d3b874b71021093d7bdb66a651302d2c5210a3a0d7450ee25fd904386e1fbade8d29504700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb9bbf81c48e2cf078f0f628e8c484888bb23845551eab6e73a42ce8fcec7abff2c68bdbc8e8188bd09ad0d0e482e3c894d64e6e67dc09314f75a93a84017134962dc809bfa66a113e47cd3ac55a83f3f39aacecb17a632736a90f0a33b3fce5ee8fe57022df02e1fde1e476b79df710a0943b9c85504d2c2aa089718d1fcff103206c002b07a06b5fec0e5e473e411eb5657567db2aae1bc53b3e12c77c6998e4020032f401253b61fd5696f535200eb2b38e03f2d4af008549947ab76ff88979c40b05550e558fbabcb183d0abab5b6a0f7deaa0c1d7687f5e3c8b80a169e73a7d8603c8624d742a691177dbd65247a1d34ef85f2b02e92e7ede2f0e8d53ff7fb9290217191a2523f4d472405adc58fa1048b9cb2707f9ead7fb5c8d1822f82e78b4e4020c0a1a3945eed648ff93c730d90b4a070940bba6361d4006f403d399e25f67bd0322a0017442ae2f015ca0d1dad85de34a67fd222e29bbaec2dcdcbb4471062de6031e950eec1b997e76eac09c8bdde2af6f2f29b93eb18ba0ef17a55ffd57f89c8d0226c2ed344ff029e65a16d7a24fea8f6cef058b74611cb8d18ff786d95f5a61d318b55867df5f11beaef666360911d1aa05d7aba1943f2b138de06655279a780039c95c78b382980a3a2e0a6e89176ac2f5b67787dd4aabd6d812e3755081296ea445086f9edfb7e967778f5d73d08f87d833e47ce0eb1811b784871f511b29108c54828cf81baf92438e7a3bfdd3800196537c90a21cb13ba1347873a7e60361974725f435d46d0cb43e31c1b7e03768a98466f3bc600f2bc558fadd314b0e37f9976365fa7866a78d946d128eb33682be097e082850debcafbc35998f6dca118b68fd5e1f959887c3da7d70398b68eb5252b81d7bab3ce04a9b620e4ed69ed07d2d94a71152f7fc257011bde62bc37726b16dce6fceacedae2ca4c58a52a604c13072d010ca3a8e4d941aa47bd3a326c9e3f886712a24544fcf6ca99d60fd69558d3adaff7265b731a267000634f3be7a9bd0c340e41c20ea37410073e8c7cc7de4b344a224cc0c7a28756aad455e52c5761db4f8f4b0e64f058ab21377df3868e3846a300209f98b1b16e3406a7bf685c5c941d03a978b936cbfd94db0194cdd5bd938baf83cc357b6b978d02c4b0a2489b0d76a12c0825c169a0226ef057eda9ef55ae7140ed04b3f17765a91594009ff35d6d1f88bd89440987fa60c3fe6c9215731bb3505cc1e8753d052f417e0f0ceb69649bc5ba763202cb92a31121f2c51051f4bf8d8cfe1c4f1e434795eb23539583d8b20a219ccc30850c1a11a01f768a60946aea0e03afc90037ece7230bafd36816b8298cfb9668e2306af0568cd81b0317dcdb4f02f471ec15f549b3ee4ff055bc05b38bfc29e84785b07c5f137a840b778b5b18b721d4648c57cb33f36b867908374f7a3c5c51eeb4b1026dda93f3be6b2e6649166f157c5cbabe7c396b050acea4ccc463fb9239fa519f4decd582cd69ac6efad7ba2a19948b1a7a31dd539a4a5706448bdd36dbd5b0318c0f801847c8e33a5cdda250862ce4d8ce814ea834593c9233fddb731ab7c41a1e044d616b41bd12c5e1fc695e7806eabe22dd938f65620d34d667bb58daaa41bdd8becba8e0c1421af50bfa6b16441333f85cb3f46e894a9e1aeafe8f66f7ed41065f8fa1686cdd392741e72d1e68a5c150823e30c7b9f0ba81cba6f677345bddfe927312a14c4191f8aefcaf8ed804a623f8cf77cb4dc52320b3a490d74146e8f024c91b8cd6ee493307fc1d81416063f9fbe083f16d7833e76de77e5912c371cf235ed3c6329a0bbf840e64405fff256c457567db9eddaa71475712bed4f10384eea3239d0a7d77b5f8d7637c794ed1d4c584d991dece608f55fde4fe1033856a374142a7c8e06dc77d1fbd2cebff9297c82a35b8360c97e3bfd1f3adc17537c7f30d821aed4b0bd6c684e4849435cd256f3d719581d702f15eb8fae9c7fd6c310ff8fc87c1b95da2954285ac96612003fbffc233b0a4b0843e764123845907eba8e346d30863145c0767a5bdc9364002efd50a6a73c5f5ae85d0bdcc44f95f1170a798d1646f50570126b4edd39d272987bcf0b7017a52b8adffa844f25299d3062b77d1f15479917872d44bb6a7796c7a197e6861b593a6f1c38ea9be592b908c14949f266f975a7d9d788650b3054751719da22833ac3869c5afeee06b06d4cfa1f89fe204ceae69b2d182bd7104e4d0916c3ad83c5833ba4b8346cba7040c915a0af0912599b65667b636094b61b1750dcb96801000000000000000000000000dabc4120637139f4f6cdad3540da194572d8d711ff49221f162087edfa5f65488d9ed4fc5503f2967054315044f20997b146ec3e90dcb9611d48e7e471c944181f9762f5bc55d0652268ebf7bb23870c2f19e285b8c5f51441ffad4c046c3ccb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b71eaf75c4d88ded2d42197134aae1967cd92d3814daa316fb0dd4d5a5c858706262d0dcea379002070fc900014cef4a427b32d5cc2d5d4ac09d25b2cccb18e6a03ecdd70d7623b449e679caafd10ef1b89ca80ed8efbb47d898285efce6bc51865d4f8525a6c43b1d20071d824f3a6ae493a05ff269c1f380b09aece0ee8e2c030eec84b156d876e8afb173cdcf324a907ae5320eef3feeda78606a63511d400a03255dfc19c84924fe74368c1f4d20abbf1508c2fef60355065d3c03a046c162d40b0583ea4d65197cf8af5d06c115dfae66b7fbe71b8b42c64fdde1ebe3674db05bfa576669a05d78850d31ec852b51eb8e0279e848ea74763a6865a0a3c8dcc67f0203a9634c7990370fb8604b0d43630a34c03e35a3e2e2bef979cf7ac84c21d0850317b89d3ad0bac1dc93fe04c0b6aa2dd22bb30414cc5892d42e545989f1920532022f08515d6156f44e86f1ad2fcf92682e16033d96c6bbd09d86549334ab86f49e030b23bb0a96956f7ba7059d4e1b2d9d41f8bbc933b67eec21ca37bddbbd09b144032703f7488e4cbf0c689579eb7caf84df3460f11496656002892fd5e92fb6ce151d96484cda16bcd74905b4039fad13bfad057ab2c324306ee9711664a366761a485fae046008404a5406b085a9d5a366a14579a6b984644bcd04da47cba054b737a02ee96a5a9f5a918167a061596a3fbf3735e17367a6fb408617d027b3d4426606bd38d2386f63f02d3cec3287ebdf853958f3eb8fd28d365b5ba69fc6f3c5dee60ee7cc31a5208befedbcaa692650838469c38f0d19faedf19818141a1aea19d333c4ce8ba4b0961388e3dbe4c9faaf103d0d77e89e34d2d00441843692a91a96e5970b57c72f782b188c30c7ce6563af6302ae1235a26975bc97ee0b62f7e835db553bde2364603f4b21f9340c945e3583e66c940202e2e22eb3ede1c1dc2ad601fa37456c2eb8f60c0e765c5d86a219622232a2ed8c47e9af8a7004e53e5628f1a19f2af17ff1c12289c6e83beefb0539105e32f726b596c3459fb3b7ab32321a725c0cf8ecb179e72ff92ffb127b823361d7fbb2f6567a9b64a8ea568541fd75141a0d355f1cbe7eed83a9472ef682f0d0142e879bb9bbac6381f8d2f3f5a8986e8b4869079d4b3e4484ca4305705b5d2f39c5d4afb53ae0a84ef7d15bf624aa58db79aecbba3aa55e3f7b4fb177e451859bb9d07b046b9057da0e1801a0e378c6d0f6163312ef79a816c4981b0b8f3b4c87ec16a1e4a5d2e2ee6d11ad24f2aec528b65169fed3fe607dac58cda151ac403ca378472024165dff18c1133f5c3ff0e102ee9331f07b104375c7188eda23507b4a5d058ead21a887207f8ad9e92b76ded58e821eef0e805e8e4222d0e8038a1c4845fb8f71b32211041d5cecf56848df90577edcb29e3b7536a81402751a8cff9cd86e849c8d71017c30ab4bc2f2df05cc50b801cafada47c2feac9bb7ef1fa1692e41238598f22d0360d3a1ca536580313209f86d8e041c9d6079ca2d36cd0046102b7fa311445d2abe23b3704fdd177a8688a34a3c216678dab40808bf6a7d352b2f31d9b11a7f3b1f73e966d7ed1f27de4dc4e06cd7c7d160b65246e3431546d65a02c1bf4e8d877e6b0f96c59a5853527da45900c831bc5f95192b62f791c3ebe0073cdbaf933d4f312bb47ed3d54671d20457c072c0e0578e7a84e03a56946b4e9287dc27190fe6002e9e4b60d102c94a9caae6e7b7db174661591abf95088ebb36ee780855db81aa2cfbda5c90f528e5f2d873a82836125da9dfc455fae392f5651ca372773874e30f8a9d0e7c18e85955b1bddb78dd6ca51cf5871348b2a6ee6a9bcd139272ccc8653733fbf501830fdc2bae68c0634a6993ef8ea99e34b4ee9aefdcbe2f0bd28d8fcd4456f7dd8ee90b7f5a3a8c2f21f99709f24e9f0b5da854f2ed543bc9772a2887e2658feedd24e4e06e311dca4f81ebe9aac4234b7cba05d7363f11b93b8e3d8c6c80fb0c7471e7af14a8f234736713f4543c39ba08c6ae570729fb91aa53b0f8bdcd60815fe0ad880af1faafef44fbcbd72f70335b56a6f58f2a470e5f4fe9e9cca68e6985bcbad8eec8d35278aa9da516edcdd330926134ea28c262d2eac67b02a3099a9b4055fa63b9035f46ede471626f5b04eeb9e60b6c75a2ff1a59f59621bf8420065713686af7d0009520a7135755f5e93cdbd79d1b95507a3ba7cffac8fe45d5817f9b64f5c0ee81f5eb8ca849016f184b04efaea0854ab65ab23f2910806c5c3b433fc4a3762769f7b242c5b13ef3a87ece113861a62d1b604b3201d710d0ece72f938fe48062b876f181c234810180061017788958d12198f9ccffaa3f66710847ff3c03fc82a6ffd0413d014be1ab0e8bd3e021ea280dfe2f07ce960ae41682fe897aaa45c1a8eda08a0e", "65ac526a6a52", 0, -1737176849, 0, "14fc5790139d60cf1c25f8f75179a9e6c2613a5d2743a57013a000e938e2ffcb"], - ["587493250482835ef092e8260f790989a204d584d83e747a1115a0d07913df1c8f2e1658070100000006ac53ac536552608eea0893e4b897adcba20ae49af7655cf39ba1499d44dc6f8c5c86d0ecdc4d32be60320200000004636a6aacffffffffe07c8db500d04bd8a1703925eae7ec48b42ada5b34a971a2cceacd2c0d812cd7010000000851ac6a5263526a53ffffffffbf337f38b8df4cd8e369a1873141710f614ac24201c4ee14bad79809446d9fc4030000000653515253636a6f56e3f702f30a93010000000000e8a2cc0300000000016300000000030000000000000000d82bee0400000000247a539367d29c3aef66c4f253925e7066bf5de8bb33d54c42be1116a5008ed3f54b5abaa079e3e7977677bb80be7107a9df7797f1ad4a18452b3ee2c0cb0a3b1c790b8f114c464397c3127fbd18c7f9d996b8a26a33519311d8f1761ba3b23000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff036c78fe5b88f9d569636a6d51bbf05eb153198486c47143ff7b2755e306188a52d123e04da7590a58639c21f08426d70d04d5c8463ad60796e29366c0b055281c5a6f5e38bfbf4f7f4661a5692dd7112c2d35c1e48abcc3f80e266e7dfcb93d28a704a0f7b29e8331a171bb8cd40658dcaec922846c1459d9cf0b371a7d370219d6f8e9551563d3a0af9ada128864f8f78b3e1a8785e4e746aa36fc4fb6bad40223e68b41827dd38323d12eb59f76abcf24c2b0353432ddba107f31e2a1d1826a0a081a5a150f87af9a861e3faae88c820689dbf6b3b893b654751f3fb1607132cfe8ca2c2c47f10ff5c034d20d8863940b93fe3ddc515934531ae6e787b4b88cd9022a2dbea028bd8b24ff824934e23ba039788e27c74140e3c907b30251e1ebb84203016081350dae18486d3e4b2537e088d62e837e8719ea129f33f6decb88da2f41020a2d83e6198ccaedf6c0bba5435ed2285c8b2d3c5df57af36114f1c84357d5ec0323d67595267bb1a80b30ef122e00af1b6e44f2ead04d7662a50af865dd11c8b703263ad5c503abb0adaeb58f6c796bb0a676f97bf2e85d92f911b20148af1fbb31d83b68ed9d6c724940e803cc0d98ca2865ac5e468818ea04ca1e4e9a19924ee4bf49001c307b52cea67314ccde046e6053e59eff8685f862b668390886bd53d1aeb93ab0ba048fe74851d1ffc5c6b1713080d3601df0c8b26776e7ed406700440d92505faf504cee5295014c9b09893da2ab2f9cbb0f5a8b28322e66ee859916186286463411bb594612b22aa1da48827650f2de9a2d8f120a450f3b067d096961c5f69df4bbf45efc72e712401d028da365419730135717eccffe23c9ba2cedce794598437be24b59eff900cccaf76f67f9d749d27f9a605b3df8ba2d1cfb20b1eabfb27d15afd7508c9dd20fe7063b4d948b6b0718f84e263f9d3376eae922cca721b5bc057dc21c66cac5307a0aa69e95a1226adaed81d86d71e2e49f328e98ab7388155fca12b7978b6add1f1abf99842a351036ae2c7ef545d27d53c8ec8920dae740afeceebeb858bd6f2a477a14411630578caee762bc0696f37e55ef221c26b9304f6e0f368d4a1ca4f109b5dd45b9b4083654b4e14d42d80c9fae6ab4adf4590cc6de326efb660dbcc8e4863724d3edef93a0204bd8b86a129026d4d1a4b4e00dceb2ae5ee6514fe81ad78db35c4517d978a599ac8ab390510a67b5b4c9b19f8e440629cb9665be377ed393ff7dbaa02f3b0ab9709f9a424821b694e912ee6ef911cd62a24f8f8669207f971f4e949b1d087d199162a7afece5f0ddcc8508a6f73f039756746641376fa05710e5798df014fbbef554dd843f9f8ceb17a5ae4f7f3a4203ac6e33d00ebfac1102961bab650cec58e55d4b05e41e7eb027a3fb3df89d2ca4fe7f5800bc8c6553f29ffc2d90255c7b2807c4e3f5555186274adb132e6431273ea42f06cc35839bb57a28a0d8f2187d7b7cc10985258a9ac9101c07dc6e5070e26642177d3c586df79194c80dd55774c0c6744d133c7e649a1e7ab66c2439204c0ad903222ef3cf3b232e544d029bb81e66922208a6c9465eef86aee19a52b816fd9649c44cd5caa67c545efd4e04c43fe2f12e0cdf0ebe231748cc81d4f72639131eb832a33d3de7d33ad60e0d96bb65deb326dcf1cbacbc18ed2096db970473f3317dfede30a6540849ec810d5b35223b151cab099c3afc89a9903e107e7525a329f24ef3381b292ac25d0c0a5a61bd65fc075f1d1f10145df368b5969740e1db85eefc53bd8b39ff848f7188340a189c2c3fd77cf76cbdc32dd2f905bd700b6c40c8f23839f5e367aab28a51423ce08b28c6478efed67c5a4a4c3eaed945a50a528f55f59b4f929859a600ecf333b7a4f40229cb20ad8b937ff863ad1a86ecbf9c3e23b909b55c4ce81fef6eba4a3dbc9d574a870ac7c69de8be8310ae6f30ce22363af1418cef3ee243bfbb8aef0dd8148bb8004e35c67b6413e16270a5ca68cc4b0496512aa565cc5d796dade76bd718562d171b06aca60bda5f03a07829018188b49bfc94261719419bda6e22606d2173dcf03db9fba6a264e3ed31c2409e17aad543b4e9ce42f32258f8153bce61c018ac6288622e7a7fb682f37bb0f4b903910f2d4d660d0c6bddcdf451e6d7bb3b9ca5f31e677de42fad4635cea5f2b8576dc09bc410fc10c235762cc73b04bd2162e73f5e679469bb236a241461e8b928d90e7b3793c3df9839984cb1bcf0b7a7f1e411f1a7595329be4d46a92669b5d9d4078ccfee65cd0000000000000000f6ab350200000000b5f886b34b2450671d0ca619714a65524373753df09b598b9692f7a2ddc41ff444218e374a4618d9047b53e453dd3c1aa81023303dd81bd2011ef021584212c54fcf27c9d451cbd9245975fd0291cbfb7486b98377a9808d0e6c5fff9f4d74a700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000882ab925adf75f72cbf2df6c4442a16fd340917a60b3870b037af271d4b4e0b89242a5a063e54f999911f0e31025d457b656fc635c137a6785e585b20d06a8b8fc7ebc8834ec8f0c752f70cfcbc41d3aca7173369d0e748b2dd7c06e70e264f7115e7b366ff834f9e753867fc5ac44b3a1619a85c106092c598c77630b3fa5c502038ccfd13c0323d090ddec0bf65facd7b03ed782a7a3076c0f841261b03cf82603205512ec6c93a158e62cdc7e0d9261588bb39ac3b01b5443a4d246f695bb45430a083480ad660ec83c6045f565db7ca9ed88818af8097f835a02445b550e6d44259868f820b24203c418edbbf27053b51928fea6a1a2637647f7c588d9c6dfbc8f031cb561bbdafea4cb4451ecf246576a6b2b7ccbc2165529d28d63ee71f5e4e89f030ea7d7583f5a51b387268cc348d88536752622e92d05573b6792502359fb574e0308705484b17815578f21edacef84bba8f5173135492a254f5958b7e611d4b4780212e8d3977caee40c6a91ab97174fc76b3c34857c9f3ceb2b77732cfc913aab70020ce5cc034374e14f2f5ea606fd6c9cfc6d3ed82c02160d8e65004a8f8e2031424d2089cb4cd0906657a6828fd5b8a7822f5b4253b210563be6697a29adc4dfad2f1b838329bb5925c8b7adbe75ae4c64386466b842c80f2399dde002e9cb1945607099d48348f6eb067c80f63844f9db0c3ff772d72ff1b2c1e571131c2c370f489ff4123edc0f220027407306a6ecb186990682df1691da2cd5e66a2832a06eab479eee976b20bc0960e058c147df82b0e299295d8135a51a3cf4495054b5f152a66163c453a84a97017a20cff0fe2caa9aa82419863db61180a1771202e69f2be6cf53d767cafdf83e4fd297ccc88f7e7985d82a1f6276c5a2441e654a0d6e3793c4e41f5752eb3a4261ef7e0b29136894029d534805437c547fcebb100584c2f7c1998ca470990befe7eb2d233626922f6a65e28c6b1c2338cac6562b82613220212658fe37fa3dec294f43ee38ae3e1be65dcdb358c561b0004459ff6226dd27288acb3a402768e57c816369ae4c393940a0ecf32e495fe67169f4fee3abad9c740bdf658f12ca1b3023d8794a7dac844238aabc080aea913e7cc67b1692b720da8edaa3a3722f35c4e6b36846c1939dc147b39bff478e84c1e6ab078b3cb4e41a8215619d6aac43e25405f204b42d1d618cd2f351da4954dbad85803b387218b9d0e8d23e79cf48ef86871eee9eca2b903fa0e8d426682cd8c918e688261de21a4691d13fd04f7ba149c6a8850991d2c2f85aeee3aed799cd26ebbf810dbf5458c834cb91d93395287f6e87c13b11d7595bb76bc1b08176d69de0ef6f361bf89a4ff5f76abdd0badaa5120ce2ea686f13f68fe9ebdd0530799e1065c6f77d8f2d27eb4304e81574ed10e278baceff5002cb51e7a1ae27e21003f94f1eb835e20d1dc7d6f16ee26f10a992a110d5ac1ad0432fe8013f15061645242588a89cce318b0da31cc6717911beaf4ce9d67edf5408181920d4a6e96b421bbc95b4d3d0a43179219fdb0cfee72dc5d088e71e95aba897f4b259d539303977bdbf390a851485965e4db44868c015dd08d4ad1ff5a3215ecb0bd7975a73e36fe1b112406b9be53eddbe975f7baa537e025eeb7ac975682f49611fc8582b4e82263e06b2952d1ca6fa208b29aea780e0ef250e4d77360875b0f145a0f6270ffbbbc8a92ac19b1db53635ae5b0057e2d12d30e155baf0846247383a53393675de3bf82432a06cd41b4cc95332eaaa33d21022ffe3805a8cb282b223fa036c94be99d4e225971872123941e5c1724c0f729e63e5e7a4f3be1e23caca90713546f22eb5e00e49600ee41287e568608d5cff4f5e6aadd5eb0784e36f4a2a77346e705d8c7e0744459194b18b17d8dd435d5c70275d3311869e0a9dc55802c9093d55066e542d36ed1051556d70218ba3e985af854f493a0e7e161e66267e1f3ef7bb1f15787cd0fcca54154de005e9b86b125ca9f26d7b7a070473698b0ffe96ab104483872983aaa74327a582de56b6bbc0c351b800f952a1e67b4ad2ed820aeafbed2f3f0dfddc747f1e01554dfcac3857ecf6e8f5a04206107a1e2ce170761e90c60dd4211a0e8e4eb7030dfb57f52caf4c0cb324b92c63195e52883014855e7f297b072f8fe9acdb05f25184218bf8f92e6b6f490b1d9d7806a3428f33df666d482d3e29bcd69bcd74c045a09be1f1deb83f9e6755faf083500d9091e0caafbcf5397e39f58583c171cc64e305901337266f91e64b000000000000000032dd1a0200000000b801714af87f8e87f5152c19139e50d01cae36bd7f39b5444a01b024127484f149d3dd1b7082c72a01e4e0bebddc8a24c61906b7edf82f5eec5bda1bcfb4e52d199999502b0d2d224d52f495e6d0d89d0f0c57e2da1f49c5b52f01805b0e0e4e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000864f02b74b375f6a51db2f28475d0e4e9f0e78e0a12256d0c280bb9c00c572c3a8013f2142e699f6c8151542e655d6d1aba0e41970f611a4cb0d1654ac498e53cf38529f3f6d3ce1c2952d67072e11c6eaa454345219e8c1b71459036a650dba03df5a4452441ab24879c388fc809e45a0318cbc6b5e3bd99872f22246f9162f0307dc15e49bae450c86e76b30e61f45bac9ee33c26d71d44351e076d0a1e506d3031377f65d3497243d3294a63a2ddb9bb9759a3389e4d4f848e3602cdb39cb014a0b08eb2527fcd85585a0aade1bef67f0622470a51677c0a61e67a9194d94cf0807800194034a2abdbf4283749ca85bfb5455ba391d54bf7ab45fd2ab3396bf841f031028be3b4d91109a6214fe443822d97689fd6145f8b4770d2a4bc6586a937acc030b8bb431f04a9145f1c766e550f10c4de23a043155b937ed90a5c217ab89ab19030a4c89f8c5feabeeaf7f098d0594c4eee27d1951ed35d2b85756d6b704a2b29b0219f9b2c1d77489742e544ad236ed26d810a4a647f606cd7434d453a6e8efadaf02081169521d023086b6f9c222c9f96d1fae2baff6fdfa7042bddb10a322e5655ed3486a81fb06e056ba50ca58f46f7f5cde7d7816d6ab2df7f8a0df8205645e1b9bcbeb6393bbdaffa6765da69227188ce1be389382038122262cbe7482c63df9fd6d00685e2a94c3cd93139db61116f7aaf9a2b529131d639bab6bd7c74435aaedbdcd2b965669d8759725fad4da497766000a41398aecaf0083d40fd93f590a5e3f7c70771907d3128acc83e5be33080f3f423fe76506e080725e679fb048b73776f0282947b64f0b2e8c7ea2230ec532e090e47cff799188bff2351f572e4577afcf6f9c5ba5c0229e2c7a7237e245f9afdbdcfce05bcc49e3b39e30b16c7b9e9ec427d93fe8c66acdf33202bf236832f41846847dc4961a354d10e248ea120ad74925571a8ee4079ca5f8a125fae66b520c71ae2d7054eeacc0850a66f3c921039ce69d21c10593dd20ff3f846e4b85c2b0d944e0de10c876bbdc32d08a88e17b82755e57628a78546a06cf2cd589083cc5d316b1ab982d88037f1a32612a891bd592e77dd755455c0732460279db504273af1534fc55b90ffba341024458900771410e985aa6c6e80aceea343345d028a55f8390837ed5527fa6b29f0ef8594f4b65f8767d99731dbecfcddc0aa2498625435cc87ea4d5ebb2fd916e0cf9267e4bb7abfc48c41a7993c8532b80b8bb03397ad97a5038320c86367ccdc3642575ff6e89554521f53db39174db0f263f8a74a4614be53313ed2c9d1ebac5788c7893b7a8114704764ade7d4e1cf18bdc0b0a3c7730ceed5bcf2d434a55e0263f07a5894ca1290f9ed5388290a8a72cff284efd1c753d61979f3e5bf113f57a060b77ae25c5283c012d250c0a2dae8365e39342569fde68ebe0b95d15cebf83c2f8b8fb40134e8971dd2f0bc916a2e4f5fd33d1daa01d031e0e7aaddd31bc83c9b172759d93d76c40b2f00bd2ec370de99dc1401ab7660c5931a95d74b3b91b24686a6973f1b86435f4b239efa9828a705c9c55970bcf5021a390f19bf63daa7984998efcf5f6d2ec1c9eabc5367b25a5fc6e482656488b4e3758d5b9d4fb8f18c4f8a32e34dead65c1440e5df33606c4bde3f0d2a532df3078b33bc7c9326259786f03219e97b3ebe504cfc5ce09c9de6dc420daa99da4c9fdb29e3c118c86e6376a42c3bd3a727bf508d2b871894800a1af05e92008ec5337a33f212c3ee007a3619968472d1a100ac6bacb908dd9aa91af6a4eb5dfe7b8279981c248f7a4cad27a91ed5d5b5c86224df7fee323da4faba5cad3dd228e6f10bc74883ea3b79a67528af9ab42269976bec6a7b501bfaba696a4738ecbd9bea4ee3f5ac12afaa4e3d7772cee69fbfc0d5a882268627b93f7eeeaf2e049af5c0f64ec32221ba4163ed94df4ecd99bd5fcfd5af9af51572ced8d00ce4a3a42cbc1ee97df4bddd62974c543840486dc6da5c0215c8eb9ac204e921c69f6724453eb46c5cf322f9288a6b99aad480c8b473b51a7c8b86d52407ae113c4bd6bf55460eff898d0d16da4edc1021ae4fd0ebcf2144a0504f7c58a27553e80d254413b6de07a6b088f81446baf4c3b782295accb9abc1c2f8f595b98daf02ad57ec631d4e71d2807df07cbaa74692d0660a5a22b846e9e3783dbaa6de278742ab62438718e796d461f8f99a4dee39d09557a27b0822172782171e358e3ba1600bfa7b92455f74821d19ed0be44cd35c3023ac1d1886071e0930bc3bde5af4dc254d4107c18231f1f47179ec9549184e66c39002bf2c6b9edbdf9a2cf0941075f76b73209f5bb54866175c2961af3150eb040549cd831fa1c8914d08ba3a6e0c22c4980e753dc69cfeafb00665928001a6a699c9007f08d46f7e9fb05", "51005163656a5363", 1, -1151607228, 0, "b65584b39e4859714ddcf9bdff6fab7529ed67e78f6a896753d7b954dde1d734"], - ["e8d84f1b04dd34388d11680a31ee0927b70398cb4c068f2a1fac80bccd1a4fc01c8d890e1f03000000080052536a5353656affffffff4022a966ef142edd30be11c4660bf0cd787df38f051241ebd92cd62bed6974060200000003005263f14cb34693544c1782f8daa1e78bca7515e616294e437ae7cfcbdf0228b0ea78d22bb4be020000000700536a65516a00ffffffffdcdd2b33ce50cca350a1189f904f86ebc1e8fae972811274074df52e0e28135d000000000153a6f5b42803c7017e03000000000753005252530052727e9f030000000009516500ac51636a536515e0900300000000076300536a005353ea7368290123bc27010000000000000000000000000b5b6423833539f086721bd0e83253aa090fca0ed9677aeaae7b5d0cee1a11cfa1482b8daf926bbb2b86f392def19b429ee1c69976c8b9675d1cdd81efeded34ad5c997d0e1c1f9d882acb681e3ea987d263bb4d1783c177d934c40a3c7e5ba400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e6c614fc667fb709f25fbe6564f0d358fc9e3a6c938c9c315c0b5707954e6ff5154918b93646bef1a0ae468640e81ff8cee07c683cf0398c911c05e814baf0d016a8ee4c6cbe976a66b11907207b022e0b1647544e16b56e081cc3bbc5614120c1eaba0ffb5fc42cb09b4c79754b42e0bca0cf2a9b40dd6bc90da06f85e5d2250211788209954aff85f1ea0f822d86e40d63995667c66f41613f0f44449ebf342202080bccf3000b9fd998c682add4c95d60287b26f8346b455ef95395dc1fc663520b057f1d04da7a1c95c0e91b52f134092416ade70a50175605a3887b4a16427d58374f6f5be71e29a079e94f290a1db94f7e530381ed34b68e1d99a8c4700a495203024e6ad44e38e06bcacedc24c6c9eadf0398758c6eacec4677dd3c7ed9f1b22102165c495d72de02b37247303cd62c43c2aabce8bcab20ac26d730e1a4546e94850213c945f6f7bf6381868412dcbabfa6e9c90f2f845c5c7648abb971d2397103a30325c07db02b3a1f963ec2dd55e6027e70aa3c205732382adf068328d3b32b7dd70227bb91884657678e06e49bef83628231b40c7b87093d392b63bf43303df7953ec9f7177aba41195f56f253c9106bffa8702fb6c46a835171f93f83fe134b45dfc3521d1bc610e2b8ab8e3e102d024f8c6b6f418884a56a7e6bd42c09a7704e811c1ffc0794315860a1b3c2246c30a837e21300a0ce559acb7eee05291f6c55a0adc4b1c2201c398e50f931b44e21acd2e99907598da4fcc59084b2bb5c1a32b8705d46563628408ce0e01d94a0eb25ed26b93f523bcceac4e7668282afb2d04ecffb8757911cf9a55bec1ad83cb60502e3e91c18e2195ab0f02de7124c0d89479c4d43d3ae3fecf4ffcd18fa744db8326d463a4a7f62a4aa1a874c3ffbb00edc1809a08eb998d9b391195274e51e016e433ca643f2ae15c9cb1c440b42df85b4481acfed5fc7460816243f18a05746aa43cf3ce1c375a1445dc919823511a201dda1a882af387669e837e2894da8f6077a42cba755e0df2bd8c3ea4448e1c2885d43ecbc91fb1a0011b816f983840a5974bd1edc2b818c9a405312494f4d9f5df39a2284b11292bf95571ad1e657e46c652813c299dc9f72e74c4e4a769bf7403a7c2016c7a1daa49b63359aa3b47c563865d6d94265e3e8f50e509b146ff80bd1827b95168ca19ecad593b722dd0b03ff1e8f50b046215498a9c197594bbb5b59ed09e2eada7e6450895d836844724c5ad063c9d5ef5ce6bc7fe9f52ba404b4133601d7021f717fa4de6758d70b892f38c5e37d7b58a0eb20f2a113b13224ca725d821ed5b9e742429a5c894aebf975bc65ecbd66c1712f91e0ebdf685dfe3f1f246e71186edf8e18ee1c0cff6b7feb4ac298ed7f4a2f7066218a3ba34f7c355ffa421c3f949a5505403bc2aaed4b4b6f95f8317efed02869e7d77891d033379bf6d008b2bd0bb7e009e31b9da2b73d4082be2a26d9980eb85345485ec0c0e77cfaf3deade27a4fcbcb95e81214d360aae2e90c9f38917a30ea637377e83758468713b9f08320ba108cac340b454fd041886d152f805b1836e97797cf5b9cdd223f5900fd7cb616fe9646a8c881ce3c2571214855f30c6a54dc69971cdb532ace21e0ec5dd38a6e6bb424b50906110a229c37cda74d1979a2462784022762a55effdff9bd6771f569c24d71bdc024b9e942dea3b215cb481a499f102654a12eaee50ba8ccb9fcd32a1878f0d46d676a95ea8641a8f0afe12e0f6a3089e1d47d4ba9ed0482b842ca22d67a930e63823ac183d4fda1cb3978e63e9c6e0b564fbfeab0d559d2d89484a535b73792628405fdec4d3b5f586491fa7af9af340f1255ecaa315bf3271b425fa9c7ef91640d8a1a00ef1c70df21e26db63bdefca9bfc91e6ca32f46b604ba2b42014c74b5453b00937f380b36727eed550f915c03afed54f643a3ad89daec8380e76994cdc2d268e0a8a25baa4f7e8a0140e006622dcd942fd58ba06857b151bd1d843554fad3162c07aef50ca0247d340112794ee2f1efbab6f7cc0fec0433aaa711b65be42506a5269c90b76d331945e3c70091b6d3839b5d339956f4cd378500e904f30198924e5e46ac29cbf4eacbe9013f2d17f529e782c385f1b64dee0a8df6cd81373e91502fa7d374032124297c7905bed95c4bb3d4b59853c767b4552776327ecb6e99a3aa91f4021156e32c376c2fba4cab3765fa1a993fd17771bd2963d20c91e3693909d49e6e823f9f68d6310203830c33184f1765e300aea7d302fe56aac81c6c71e4206986ee25e844e1d20e553a260d0a748929646cfda701d2b80d1682e5442d8dcea4e91124f7bc4480d883a0a3c2e4b20a4ecb4a17d2e638daa308184cd60d3afab5f93b11036244f654b6579e3090bbd4fd7515fb5c7b5d7f60693eb7340e", "52", 0, 618766484, 0, "08f31088458dd9baa56a5e17c0068ecbfc3292160363eab56942075adade0e0c"], - ["a2baf116025fc2ea2a3557adaf5993f5144320a8873ed149d7e181ad2ae227d7d22c26b3ad020000000600530065656a5f015d68675d0f6b89fc678b947c10d95c3b57638062a634ca1016ee126e0b17127e366b010000000363ac53a138b9c5047c38e2030000000008ac636a65006aac6317abc60100000000065363005265656c8e3402000000000952535352526a63526aada9dc01000000000652ac526a655173c435d000", "5363650000ac6300", 1, -193632113, 0, "85a268635642386f3b26fdcd2329eb4da26d261a9614b2a5548970456c95c649"], - ["030000807082c40301c6de028ac738b73785e6b8daee36b2d81196f9cf8d107052c40a9efde60c58a700000000056553635253ffffffff0162710d05000000000851ac656a6552526a0000000000000000030000000000000000d185480200000000ced3df4cd767b47aeac6af04a96dddfd8c88d3520e8a2e0d3fe35506f0f6488ecbd85b0feb8eb010b97fb6468e3f2c0f641b6130cd7871da014a55533eb7638e64a787238112060b80418e804b67ae32fe8a32a95e3778ff40a4477f5970388300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000681000e27f3de08d35bea8667cab34d0750699df4e3d0d2dc147fe71250c4ec9de2ee40ede9d7183a4df487dce8fa51ac1a0893a7a958240c4ddb4879cceb6b3f24ac18480c3c6ef3fa0c32e385c4a9193fd6fa74f8ba9c1e68272f5ae92fbf1558ae5fdc41e5655f43250bd37faca0e3f82ee6f31ec8aaec30899caa0a4a95e030cad5c9896d7f53c355e602c1139d2a0951928513dbcc71509caa76dc6889d830321a272ddce184d974d2c0ddbcb369137c0dd9ee6cadd465bbf9cee219db755aa0b078a27d2f07e6b69e2d076a0fd84f287cfa43f4527894362c642c3b0d66ab1a82787074672d8afa576868ea614164192014554c758d2d4b414922751cc311e590216382a206abf1590f7a512f2ecb52ce806ec11b4d1f8f16687567342e18ab79e021ce3a165bb8c6a8b0277e2c3ffc86cc53e2f24883b2f6cc57e30083b62772cca03279a239d7c619568e4e3172c8e3fc5fda6e55c0e43c7099abe31bf2ef9b3fdef0325e0f92cb5de7be8abad4408b5965d96b9f990a7a620a198dce846d4b3addee203123b5900e21d4280c2463fefc7f818251f2d65d102f49b6ef9c0678f7dd121ec264f18505494ba3f1f2d176f932682985776f20edd504e27902d156a43aab96e4f0f80a5c56e8f10949640d5d9ce56b50728efa1dae9dc2d3bb09fa7a92f8bbc468092d80b5ab6b35633b5ef2dee002a5bbb47796c909d5d53309140126a88fb1cc6d6e76c7b5c88d3e262cf97613a871e864a7581ad0bcf832c5bb85e50abc637d1532af0188ec7124b55a67ccfd96583e7a9157e89fd5ade8af252631a0338928455ccfc740d526412b7e35e8c6e77d9db77109de0fcdaef0c22dca1c95c06e22f8b8e7cc2049f83f89bb7f6b9cd534a4f3b41a52e27fac1bf4196ac12bbdab620f2577f2751f2319fbe56c3840b48261eb200f465f0a28b83fc191736c7cf9b8b7cad389cb6792c5682be1ff61ff2673527a641188d43fd73c93d39036e80f4b29cfd46a2e201cb68f35d13807f56e17e2c2f255abc6bc2e7fc0137ce9bca14c66987beb9f94f93d2d4cc44001dfecdaa67cec0d9daaede2e43e43e4c2b9a1195b51e5602251ac8884323158b7124d613c2d67a72637d3e7cbb697922b4c04a9a164c783b496aba7e1817d9d2ea19833e698bf936865922b352dfccc780d954b3d0e1275bef31116c84f8fe520bf106f064c9139c90a4681ccd55911b9c88e36181407a0f68188d45e1e107ffb559b190d8db755c19ed717b286c56a00381d62f4858f23584f5e012cd378f335183235e03ec5df0e1ed443023ab4392d545b2eeac6fb3826c87c832be519c343493f1309abad3104890e3b86eb32732870e0069b03629c490f0915a98d266d86a1bcae94cfdd8b132988bbec2abf92564e683ec7f7f69c1a67bf6119e078c33a966bbabeed3339a6b48f22974d4a6e13b23b852183a6463af127e92b0a8bf0fc24947075553004ea8e0b67dfb1c4f02b562f4c68eee95cdfeb33704f8d4ab5399014c984b72fdd1d3d4b3bdabfe14dc32263b9e4cb60ca73058067af2845ecfd0998258444e561c19e9725e7a6693eebac2fdc663704967c3aa47fffef045b79ae35387ff9c6b1ebf87c823d0d21eb7702f16c8918727bd35f881f1f7ab907b79d7c6f51b520a56bd9a8bba2dd5750c8360f359aee7a9114f9e5510067ba0a731bb9a6b1a6267a862d8f98b4cb63b62d14010020837b19f9b1ba5f3b1413485150172bb2a0d1b2a0561141c06cde890610f9258c01a05b71ee8f75b1e30ed9ac23e9483297a79dba8035388c23d2dda6d546e057477d11d8b4905fe31132467d2fa2b691d92cdd04510700ee50d66423fd05bc61685262a9d2944d20a7db262ee5cd0ddeed59d29127e3ad2d9b73528afdf5a2117c4938113256c43ab1b49330d8a3774d7499662bd050aee21db09a3b296ef7d73dd2aa37e2e6fea517585aa19956ee9fd1cb84a1f23b33f8fbd15db1e59894ddd32447027db736595150b4cce51dcd689c22f65347c0bfd99e3df7a6cc16efcd91a0daa19a82e456e9e18eed8b76ee4f61378eb634ec05165bcd1f2b025a90253b7a63c9cd773fc522c64b7eaff92575f0146f2571cd745bd276f4b237872401e978ab387976b2be1f1380232983afc613fe8a159870039e70b10b025ce47b6e832195f5b289ccf2df6573db206d0308ed314a8da285d549e18907412454804f518abc322d7df011c4c0cec4aa0cfd9a2ad91760ae327eb78bdcc7345930b0d4c0fe6796fbff5ae809ad8ba0fddb498d2f25f01000000000000000000000000302ae4c416e9c8d0f8a64563ca6959542845d8660baa5f77a3903bde7f6f864b69dc8a464688ebb7480fee31266b291af2db2da21c434a25854ebecc9360bab74a0693a018fb8d2aa3a5b7cba396794f70ea8725b8fdd3aa8d16fee9b93ad74a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b187da1b6f1692fb287aa2686c31bd176d3a6e8af4930b20a28b313705a5f642e4c6c0704d789faf4cdd40bb2d7563b9b20e1f57c0d36861e317bf5fd3d8781440931721f8575d450ee06583ed97a7da90e911e41c6c1c649a731eb813813c6aa0d93b1897ee84f2717b7792672b857f75a675a4e445423a5a02a0345e3e06702248149e1a27b22766c58641b2880a626ee3cb05ebcf926f1967539afd76d91aa032b66be43dca73c3bd2919356f1d86442d215a912d0d2c9dadbcc1cfb603364990b05c8c48f71217ec8aa0186f5e8f69707453e9a17f9455ef9a2104472eb39bbb632c1948340d04dfd63147f7f40908e112f9ed452edbec6e16fdf3fa1720f6eb203231b55db8ad41a9de1302f68c80326d3aed6a7bdd6a83033e3ba76dd7f2cefd70228cc5f59f26dce29c05b5c95c9a33ee10ded6f064c110ddbd592235571b9608b031a8f761cc70d417e399586035530eaa6883577562c6ef6719f06491528d561760218c289f3d91ef338cc2e6bd266581202324de16d750b2422d54e9fa6963ec9df032b65a9e490ff5c8503b299abc0a92674eecb55bca1e53cb35dae9bdc3ad37ed10c75c97f554e89ff674a5dc96385f46fa4681cc7e1c93ecf02fb6452cb2370efe925586b7e09e82d38d656c616fe598241d31704b3224cf4ac1910d3ad575e27d6f6f789583bc548af01e014e3f19ad32cbb419c18c54f779f3dc844f736cb4b6e066eb7acf010ba2ea3e1d96c404174704049b08a67bcdfb3805f7b6d8083992dccb28eb1781d9e07284c160f7dd917a0fd136ec80c642b4cba77469888a595786d536dc38beb6c0443e05b0dcee26918b50d4a0b81ed9bb0d3d3e2e73d2a95b17e632958e811ef34e9b733089e67d330dfd24899595a523bfc18d1083431d643ff6207f7c44c432522eb963f2b36ad50f95c398c6bd5b220e31900176656d05d7e047636f7a619d7ded42770a341d18a49e8d05c1edb083b00ff023316237d19ca7268e1ecf828cd3575578bbef7618fd28e79de243b1962fd02fc0cebcf7a7a82c0444c912d01f3327bfb3e19ba3d30417b9bba78ef8a780b9e52f0af963eee532b61ac03e0349f2d78e76ac13597cdd60838c198fcb01c4cf6865c75104399ea8c4d41a9c1be001e9e6079b4acd12379e7efc25eb8688369a514eb11926d25c4e02c8ec5f2137af03299b4836891cc031c9138e1375d5b27d53cb785b2ab7567d6f3de941c2dcf89addec6c7ccf1e723ab81f52a98a2534c65f7b027e9a9a14f28fb5702772f01a93e665a5eb0202fd83dc502b5082ed87ecf97f288c73b608136767def2a2846a24b6188e5c78784ee28eedbd3280b67dd84099ffd5b7d940b29f4f5068085e8604e851df293def9c8f9065ef406a291ea7acf673cbfea0bd37ba4e415fad202199858f1d5944511553cf9eb19a3c8e07a50ae905547994ed2cd9816a7d065a4c2b962ff6db7b21ef84805c1a1ee9c08ea80c2528ce3a57121fc908aa92db1910b723be39280715f473c7e9f99097fde862528d8db904154900d7dbc8e4cb9fc1358148b52b9434c1efe645ec889c8a84adf9bd910d67b741cf4840c367a012161edc20010be66675cfb1ec52b9c1500559244105840e2be8e62742108b0f1d6acb759c151a46c017614080be5d65dd5fb28096ab141e771d38d01c4fb35b3323ebd18381910ce77edf48f4e3c9db01b3c4a198efeb6e41e0f03aa80953abcdecabdd9ad9fb2bdf87607afdc3ff6e243b3ab1c0ed101b8f5e2da799522dbf5446016708a045982dabd9252afe774fccc66d85586a7862f7e43c52d65337a544cea97d6f03630a624cc854b6d189d593b0b11930efe88f93d4f8c59970a94268051af9e3a95f4d10a36b8c2bae59088b6d57d80ded0e6d50a8b04e8c8bf2925524131858b7d801f969d5469c1e3ca5c3cec415c78590665aac2131d67fc3236d225bc51ab88124d8b1e275fd5af7c56f1069017b83039c85b13b7352c110a2c880998be236033848f98c719eb8beaa8dd488b5221fb4e931a14aa7224d17a062b81d613e801ad86e56686af7dd3c2ed1c70ce13a02a07cf0c914b0d4523a1f89417cfd536aad5e780e74ee06535aba51794534db21aa945d343325d4ed0a4aa9df958fcc413c7d81fd46f1622b154a8e9f139da5793d6b963d35be0280e8854b65acb69618463b71fd84a7d532061cf3ea73c736cbc1ccd7331c0d4f90719574a5632674af9c2adde7a4f757c32f92d23ae9600755a5c1c5004fa653f7fa00cc4f1dc6e9d006d682e62000000000000000039e1540400000000ea5fc8ad952ae88e6371e78d40278418b1164cfdd8c5af5840b12c504ea09656bae4731fec58dd989793d6ffd8e9cf58ead55bf0d02221a66a3cbdd7151b7df1969fc9463263f2a16009660a3a85e960725cb4ff91b2affa3767f9afcd1eda24000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000520b1be7d06d223eb8b03569ec2fd67437100ae70d741133e8eb581b023a0b6d05b1318f61d68b8631dae79ea9f0c150c9c97826691368d6a09e36f88158a53e3172b893126473e20b21997fc8150df44d01e84c22460fd104bfe047f2fbe86bab9c8809519615dd95c3068fdf923e709f970744509447a9b4957ac492fd6fb0216b0dc262c38f817ad021c06ec1a13753b03f983ac01cdf1887fd8eb726c9b5a03294208974e3a718ee6d8b82920f032d150423e42b159e75ba627f6f3af14f5e60a0813158e8ba5f8c7f1f5f999c17e24343f49446e333bc128f0e3d4d57884c6fcd3707d66eab7b61074cb4abb15e95a76707fead7cd8e6cb0c2d6fb59c3eb2f320318fc3796a1a9535af34d58690d09d5b9cb91589d105deb8d2914a4be02763845030eb3195be47b4a3d93f3d4ca3c49fe82cc6c328530e3e384ec9e9a5686fd246f030989bc316f3526bd8591a7b3667e2b6bc138ef091a1f456e0fe59fdf3fcbc06902057e8dd7f92adab90af9686eeecfa90841274c0f7e55df78039eae4845f296f403000c43dc6294275b0094fbe7395440fac7a7bc06d80a17455aa3947234cbd73fe57252e8f9cf6a9a73c372d6151fa4edf5922336d3c07ad60b34eea92be7f8ed71c85942b6a4d780729cf43187e56e2afcec805fb68b3b70f19e44bcdddabd4fdf300f6ebb9b1f29ba544c7d39c938690a1ae9d36e80025ba9c5b2b82c262bb5f71378c9919996673cccde415a2084ece829e650c7223f746a45c3cde6cd0a156a9e283b1782afc1cd7711f02ceebd2c011432db6b8a48216e4f9ae6ccb3bdea0e3f28b40b0bc7d2615c28411d9672a0229aa781e4b97bd967bc5def381a996d8823efe06a16b3453ff53897673de0aebb94e0d0d8baf0c46a10aec5ea4a6a8b93f1e415ec6a0df4820e4de4445498015235445e3409e8ed945f3d747ea669d3ecc4fa59238499591480903ad17ee35d8219676b98e09c0df4f0c2ffaa88ff64f83913555a5ebd5a547c7ca894461cfd63eb241ff3fc92405dae3665a445a203a52710d7f9ee3e48251f0d4676d73d107a58b4be3c752b3a4687eb8e918cbef6bbca2557cf986bb9bc5d2694318e0b05e52f2969a6449e0283e6723cd1436c6521237bc7b2550cf53d92dd7200cc8395c4b83d48d1f333ca80d3e0bd27d725a9fb2e3ba9629bfa947074ce990bbce6fd419c109a6935b0302f38035ebcee5475a86a136c4148163806b306724f170d8b1a2f8d33a39a5154e2174b760ebabe9c0f057754d0a7259555399176381ce91468aa1e4505b5b89c07dd8fc5b84038af4397e15184ed261e5616f36236aaf0a7d404f39674998e4e641a12708e27df9a9644bccd2db14c1dc59054aa8a20481b68e7ad6250a13784fa7d306a2109b09386d5660f1147981ca7bb9e1804b2c58a6613473874fd91144c1a4f8c571764ab8f3d09f76550840add916fe9ad83bdf4b803135553a1f9ca10aecfd75897aa0d87609f36058ad964fc89900a26708c868f15d8ffa82e5b7356a3c3202cd5ca6c21bfb61e8615a38fc680902b451f9bbb50be895d863fb0edd2156e9f65ffb16a11d7539663d06ee0efc4ee6fbe8e55e0c9db2bd7588e8b8129b194f2d2984363336be696fd034332283887562023595948fb7f26264ac8f5c0b1d444e4db7b64c700caa79460f1624f35a9fe24f4ea3c60198e4e9675ccac2cf80ceaba4fa7680b870295c0b6cc88e6ca68739195698637be39500898f2c5a64a3eb6b2ce70ee540213ef0a4e37c6ccf50660cd57d1a169e30c859632e9935782a09ffcce4e4e63f6af6f133e067bdc24e33ff4b66afba47546107a9b55adefa2f35b2d448b77364219950dd6e153cf949d0f515d518b790b16a75439f3176e697a032da5880d4f2f509e6e5b7348d87a5723766dde6aac7530237ff9980e53494e0d84c64f9bea822b4f7ee31e95ba79fb12976e2b1046bc1c93989323e68de5d2cb59c2deba47669ab2a3fa95f57ca88f62438405490001dfeabdc3e2fd0e9bd18ba9480bbd38e7c5ca0e2dc3e9c4612f7df526e7591b01228068ea9c9761a22b39023f25f79a90430c786f8aabb8f6c7ade2ab45c70aad33ac8410b6c5a9578867a999a6edd6d2098ea97380800512fd46e2d2b2dd33de97fc615a283d5c63bedf50f23b48986b388ae7461254e9642ece836b5bc7c08a62d972f26f1e6f18c88895faa2b43103de3e170535474b2ffac94cc20148194985d9657b7f48540c1eb6d75a7dfea5ef35a25b466c8db285e94c47ce2447c780d133f41c8d65a94d3585baf44a74997d996e56f0c1d2b4753ed95b24e2203e74c4d9f4ffcc297d725205ec6bc1b71f82ad0f62064a559a7cc70ea8287d652046c290e12f8598cbbe211dd0e0ea7b0f6d340339a4ff7b52a75b5d02f77ac28e0b", "52ac", 0, 660027597, 0, "b4fd3662d31105044e1da56f5592bd5d26289b7422c121499fe56a144ef727dd"], - ["030000807082c40301ad05ae8a83ed97bedb76991bc8a817c9ea0c1068e4799f30374c17fa84dfaeb200000000005e7bf00a0242fe1c030000000005636a65635269eeab05000000000352ac654357af05aa96b96601a1691201000000000000000000000000cc78b554b828854114289ec6e05f69ac9449ffaccc8a7fb7993f3e035d0cd81f096bde543e718e743432606e25b14eb11cc4f4ad54d46158f22ab3fd18deef829e538696ea1a3a5049fd69a814baf213cd955b3be10e85600798896088838d180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013af7cfd482de04aeec6ccaf563aa5672c6a9146b70dc2e89ab8db3a574b2ce9f43b7b4066c03caf8ea58696ad758e0e8a950e74688dca7e3b57b8cb0a2c6fce3418f87a605e6297a769030c241b0c5f51dc99a98a80dbca55cdccea618e3c440d4ed881f702a6134f74e35d962b03efe4ffe301dacf657cf615ac3561d56309032d325fab191ff03293a8acd1be38cec58d72d44d4aa4cd79a8d653818c2dbcf002200b2bc6c8c8d6607063989b8103167406c9db956c0deb0b9650e9067c9385630b061b2c07594534332faaef41cfc8f1fbe6ed2df5e7c5a8f2b6206b74c528f5d3aa31afa7383368598fafdced31d48560ed313e7ac80c720fe6cf3d13b2b4a91c020f23bfadf98b0db97df4e7a682c0a706572d4b2baca92ed23e136e6dabee79e303151f660a6066fa69f94d1c968af53b7faed5e16b8e7bb1301284dbb86aa9b244022e2d057090973b64e32d56cbdb578dfefb32031f117018aa5038b972d808ce19020f7f3da0f59273ac247193ed276a89c78b10a0cac364352437b9ca04ca8dfdfc020b6def9f508de7185e983072684433407e27ef3ce6a7594c0177daeca81304c84d4aa979a07046dc9302c25d262bd63a1ab34f8e5f9c0b2eb54e7cc6325b843ed738d70ea2ac1d783c597bc7a7d01cb6b60e1d5507dc47a9ae3c5817c452fb1710b933a1141c5c674e52cdbf965cc4b28a0eebad8d7d8711a02d98735508cb0cf9b5cd4cb09f9bcd021b9089f0699fc96757c1f5bbe2a59d623a1d54b44ec25b7ad3baf2dd0f4d90aa3de8a2fd72e18c3e08226e0addd3fc569f649e54ed84c9a7cc31b40537012bad08d8c0f364e7b59b06295661aa3861380c647c3ebeed7068f08da237a92d0929375412a0375ddb80c9a10276ae483efb496f5a73b2d674ae9dc5ee1649bf46f20125c9b0810c9c7a2effe48e2b048c6a679c195f93ecfc1ac6930d735bbb8f97c71c00bfe306ffa22bd59ba5071f03d75dc45755b285333f51eda6c5d1e0048aa06b1bb4577843c455bb8e9f51c8a1c5318b7e2e868c66695e5bc6a920a332598beaa365f42a37585012783f6e50e166410cd5cc491117813ec59359e8875273d95f76e5bc004b30ca192a292c55b368a9b6fa0de7c15915efa4fb856ec0697bfa96e6e3eaa475c79ea37679cbd24a484b8f0908fa6fa1c164be55c985aca6ebeb3e0876faddefb0b56aacec6e85800783753e7380817dfc066f397bb7962e71ff46cac9ea1ac6d2c5d7337011082850dc72d8497a1a16daacdeffadec37467970749e562f23d939bc6486431dab6f88ad1fa9affb1176ae5dd5e860762f4fc1ef27e2cb28b3b99e08baf2684dd11473ea4db6bad908cf5402f2ac20d5d424a675796220cb25abe8320a42a572924655377f880ae712df257e7db4a7ee511c3dd81612b74733ceaba881c56c6a1159b0bb1c72a7472e949c44d9eea093e1c34193535ef6170986a039de22af0ef9de9dc48e332da69e8bb6c5f71c4025264810f8cb564f320c820296b7e5c9e856a8117a82645246dcec6a4f5a7690ac5d6d64feeb1c1fa4fd50307379d06187c98762891dba160e61b9d7e206be583aae65b46487bffb68c5104de435273d7e759aecf7fa030d924b3d5f92c36478caff0c98410f275001886d33f0de2c788074c7e6d31082870ff7bc54029092159731221e981b62421232afc8fed419d41e63ed6df054c0a4e35ed5286207dd66206ca167aef801634ccc1ccf9eca6bb2acc56d71e10c17bcde82ae3520e587d059cabfa248200d80c5efd255fefebfab2c03111dd3a9ff516981f3b2ca5819eb084c8798154a1f8faca5bd9c60b771887dcf3ab740f60eb48be310a2f43564e131a9cd600eee97dd7be7fda947acd47225241c458e6779197b5e2af5dabcb81b72c1b55413c38201f600a3695bcc440c06e1cb0b3d4a1bc037ba99e7e4401d442e221aa4f260be72f307c3ece4f12675a814648d794d4dbefdf0ff17e566ab735cab64c0dc4383147ff4f9f13a3869bddf2f0cb7ffaa6e21df7a41563be3eef7e2d6f7ba821a4134bb44d0f0a4436b986f8f17b36803641be86844782d56023ee6a7bc8f2125ae9797d31dce1be6e1b9a0e189bb9c8ed0a074d2331db7074a90caf0f404a7e9c134e3115f69640809c153c83fb7936e69a8bb2f156548d240a7a81f3570df90bff04b98f868ea53d963a2939c18e96ebc56aa00218e0f274af30d877dd8bf11bd40ff87f265b0aa874416153a0ccb64d192381ea87fd333e628cbd45d38b2ccf97568bbfdc20a48229895310d13005cbad4708b385dc33c0ea0b3eabe78bb8278e0b489007872da5fdb29e17eb3c87fde3761d59d073a9e4f0dcc2c74e3c9c6d152e273647efdefaf22b5c0e295617ef3dac0903c1627bb9fff0010a3368a772962254c1a5d01", "636a52ac53ac", 0, -1168871310, 0, "c4c4236d56d315bd9c81cdfe98eb2aa8c11582c2800f171abf8902b639249cea"], - ["030000807082c4030124b1b40859541b3f0959556d64616c1c63ca8d0cce960e0c979b1a70d228bc430100000009516a5100005363516a5c6b9bce022a8a0d0100000000065100ac00ac65606ce1050000000001650000000000000000020000000000000000f7406d02000000008cb8bebc383b828907310a2db83e3e7c76c409d5d17321a81537024a9aa5cc1a35e7897b151d6c610991678bc8a86e7067fb0b7b2f3019c0db0951a5eda6b3eaf26f4acd182c2ae2e7e80fd01eff81b9135be99a6a9b4944816a3eadd0103ce6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c178b5d95de55d53727b902187ec45461a3c583cd143081d3348f10e75afbc49ce479762277f75fa8ad7d1d84ba4448180643108f68c11ba5e7a062338618437e7701622a758ed6dffee33721b3dc83aa3922ff27fba606587ba8941530cdd093d10eb5cef779fb7f6826f4da351105e22cdc763fce587ab37588940d8d8a36030523758b916b25e14dacf4dc4a33e42c2790653c0a140672e22e76e7a1bb789e021ad201a3762b00c0bcc55309809098a8adee7ef0b29e15d2561d6042c98757ad0b011c46f2b7521d380ba2c9d0cf6d77046dcd62c3086483ecd40e4780b4c50d4b1522e1bf128cfc175653d332f3990b217a60afa4f2ed17ea9d07052f440b9c54021ba8d841855775d42e5785878a3c963c5e370fe4a886bd662a1976fd293898e302204ec37d0a3f81c9cf3058dc5ba1d689f3845ddae7371ef6a721d6bd8c05281b0319d984a35db2325e400160481df37afb23be8512684347684807d7790b61599703200cf805d3280f9a32b1f985ec7eccc71ef1dfd3a39a8f93240fea20e20fa4150219a3f47bdf41df1be9650dd1b6de0a604a04a1b4c85d1d3925582418176174260c4da24a5cff21a4884db2d16e3e70c563667c9512af2e2d24cf980b73335c53d768ed26b8f1a42a392b471856f4dfc5c6daca5ddf7442e5fdaff6c7d09d96fd0680fa5ee72bac5544a097c11575aa33c698bb126b5adfeba9f3beb541a7604e609b86a8835ab8edd9e21171345f8095b0ba80b0b06a0550b5eb1965cffc9eeeaa0bdd981949dca3edd7afe65b8ff0c01f482be0261ff64650fff41266783869ab39f106f6cf1099f50a0d0695a68c6a15019e0942e7ab1b09c92adf8c83c37c1b378158f41fc2642e9b77c554bb0a20d67bde7912ac324cfdff511a5ae6452bfd3e625c3b68f9fc87c20410628ad2744a635563ad530014d47d1e5ee31c77c88af2e7dc8b3696c9acc936ab3f74f5c762a80508f29cef7fe89bad71a6f23844e5b2739dd59de688dced410a98fa781ab64c504df428826d77116e7cb39b9ac45ded14d09beccc20cc22c10d544a8c6f6c7d2c2b4b45e925222c0b7953f77a6a641eba0984aaede66695457fb8221aefe8ee3b70895dec7a2470bbe91886d743849dc5aa9eb8f2e4b7644ce95148974018b8d5740443977ce28160c4db9d2559ca44eab6b64998c090fd69580b6eb1a2151baaf9739d8021fc531a92f43e107095bcaa903b18428934ba71b58bc207ef026332ef280823863cb8123a2561d60273be8b26a04ce92144f18407c492e36eac7b22a34b2bb7d9cc0518f4f99dff4011fbe621ae1cea3c276d0c654d22e8033f4e0d755bc5f570fb39324ff5a4e5c1dd3468b28ef44e99cfd4eef2b89b9943a1d0be085f172715ed3216c1872b1b2f74c6e42309d97f25f44f845c1021463771b4f0c740dcd65efe0cff3670d13085f36991247bea0d111b4443ee1db6f72229989bf45123a9d47272b726295d7d688cc17b3170b579a99bc54c9bd201df2c80fcb7f78f5814a800c417b63d011027e809178533ccd885bbe3eec8f2fd2e6cb8cbb9023d54fc86e353c5155468cae1eba22efaeb7023be147655c0596c99c437e2eeb4e223f1492718e65a836fb9cb7ee9974af12eef776b831b12f271186a00e3a94b71daab195a29a58f31d01855a4e7c16b34d764fbeb64dffec5cfba7f0ea173f31f919058ef8392c0f5eff3d25bfdc093f36d389b893a81b0e5d277fe1f89431a75c97feaa6e4c6bb4d2525aa24614a07511c3f9478f17b5ea9b43b43ec1ae4841949335e25a51dfcb78f01b151c2a19ce5166668daf229afdcf46971b6285dd032d9a5d667504d60c318abc91ba3f30fb04bdf0859183323ca9a72d73371f9a3c04002eae6ec41e1365bc4cf4459e7f8b1199215019cf9c4ad6e57ba87044f6b6e970c1ff09b5c3dd022c9d597b40b73f3d1776ee8c2063ba7811b7f6cb057996ad5f3266be6e1b20665151ca096a7824b99508c11e1370e7decf19e66d39961e983188cb811d09386b88dd7c7c90c60e2f1666098d978d1ca5fb990baf369ff6be7d3b2ddb03f75c4784dfda417996cef47afe5ecd72587439a6c74f6c65a25cde1b265ae3e6017a1ef367a30eff45de3efc47a0f22429c4485ae7aec818a972e2bde3082821e22621cbfa76b97f63a11bd11a0a35ab85cb80774be705031e6fedd73fec271a34ccd156817d447acb2e6dd4ea5611236d60603fe516e51c096544a805584e1f847eaba4e48c9b337f7db27229e930f46979ba39811d29f000000000000000029ae5a050000000077f4ebcefe90266235d23cc53599b0ad86413c00d1244b34614066197282178aa50d17748c37bbef93f8c3b0234016121d1843a5bdae1c6d7cc8218c384d953b3366b79c437d952ba5d1c309e33e823ac5e904bc19816be7f2846ed56343b0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000067453fb995090db8811419a4eded99809c05717dbd7d276d655eaa96ee761a72508a75a9bc4b42b86c3aade58534e5db89444a663f4c1c27f28bf3c173d65e39d3c5bef0a06f0330e1d628d437e4cdfba0612c05980fcc0df35bb6f164335b7041dfd686f1822631d6638627b7ddb91dcb764849f14c71866f61a3c50e5a13ff0304f559bbf70bf0b1fac67e4dcccb98ae90f46023618db01382f169a3c98540b1031dfd1ff592ce49655adb4d14a3f0bec1ec20a329746d46c4578bd72d8c12800e0b062666bb45ca1ce3976eeef313fe2a130ccb26f0281d19272b7df65ecf4e2bf73d82564cda12c4ced0992f49dccd5c2ba88d30c4e3cd87667bf0bdbf75647b9402293ddca9fd642c7a93b8ab6a950df601a0f37e0c77db753813c682237c89ccb0021822a286afb7ebb8e1dac424b1f80872b9916e3c6b7122fc49ce49bf5f09d800030f99cde13c210adfa31247f72d3c43e45a07adc956019ad8bfc9e842b40dcf30030ff0d6b0a6998942bba995a9e58e9bb1d216053e47d3a763de1a20d6ef1c3d9f0224142c42cbbdc567d555343db116fe58b58bdd64a522cb55be8079939567bb6f87be7f1b37789688bd46a1a8fbdab32f19a057960c9840660f7dcf4ebfa57d11d8afef477bf69da791a38773159549576feddb9845c213a4aa5294b6d754fb6e6c4d4cdf3c0dfb6f02b8927bc3d0bcb065ca33521c7293275bff68b0f02c514d33d84a62fc095090cdb8b25c2242f0dfea4d2f1443cc7cb39df8398e45156708c8b3f5b9a2a44b65af7c6c8dce151df7a57e9680f7afe24fd95fd53502d315cea0135661937e843d8607d6dd9989bd9a5e34cef436c824216971ee3c7d59123b76465164e0e5534c34938507bb52988cf9c6723a0a3f9f713d18db77ccc55d6bdb69006c6a7e90315de964292361fb543a954cf4ac86de54c056a790d65dd2c38f3d4117904968eaa5bc4e8e05364c095af4aa50c173137aa7feaf95cb8a79db902d80067d67b80d3a1612de0bad43cfa36ced013a114c78968c086bb1b08674f34957ea8f1930072acdb3580b4e64bcf0e03486daf5215d112c60fae7b74f95c821ea693c9d35d3c2daf489abda8ae8237c6c92afd06334d86f9a58cbd5924ec52eec6e4826de67abd3d433e93b687552d361d8ac420e15ddf320c5de829170629bad92607721abb51b1c8f6bda96b9f46f491321aa5aaa6dad553c570b46ae429d0d5c8a416f5fd24aee545c0c44b3dbb49916faa8cbe4f4b2bf01184c3b2296604ee13e7fed35eee71be6c50f678a41e96e1aeccce47fcdca21121a363e85bb954a478a036546be8d7e48585b5b7a835a6f61ac5221ce2823ce1cc0e6bf78e1594bd3f6f4b371de0575187add513526badeb8edd511ea96c106aee0974dafc4644fdc4b965733ac6e38f4ed1a0023f0d2aea020c5ecc575dca53cfa127717e94cac980addb7f55831cc8478803dc4eade1231ed03bc14749dfb3c999d5e33626b3ef41752479e7f54f4ccdc79b9c615d8a0f59ad2fb4a1585ac6d6fd4c0a687d7cd2fb7f7652b904c80a2ed301f1925a9a13196d2d923ed3f74ade67b0c4d731dc5374d5207694e7c338b46c4f9cbb38705fe6be49b54e5deae5fca64b07a4fae299261b46fda4f4d5fbbedc3be6324fa828d13b43425f5e0ef3d9db227dd1d417d1ff93d16445b49f376a5223afb45d7b10490d46e4763c94c29af9bd1e8f71197c98edd90e38bf78ab37581fce17667bb90aa8fd709019e764087c9f6304085bcfffedac0efe0ebea9e2b5dc422044e7567d3dbc66d1bc9712474a33803db5dd5a6997a947525684b88f4bf19d031bd296d8a6816193c170e1af8ae4530a5a01aef35fd341bf59a60071f570d85cc26a11ce7240229cb3624f2d5ba144627ecc56fb84cba35f95ad273c740426681b8b8e068b663b011b74426a6daafb7f9552cea9b4413283d593b989b635fe862ddf40657a9597765d8d8177d9b5d5443d7edb0147ef5ca18756206d3bd71455e49292aa42ce58a4d2e0c0714712abe567e14608296400630348dd758a64db9d946ded7e0f00a7bcf7290d799e3a883797296c7d3aeaa9ccd326155d4557ac2df67b7af9d805a131304912f81fec17e18285de929ebd87748cb40d4d3ef4ae4b69363ee42385cc2868de014010ab1ba63c51a9d7bd0c274ebf6029a334054a537dbbb490107a2d1764c90ad2c535b46f7e2efd38f6c0b64e8ed9d7b1c25c57b8be2a347f7baf6629a6715612c3b39a1b6ebfb0f4627b111081312df5aaabac6f7b290205c7653707cff2685757b3438c26f77a015d65e49653dd3d39473c1a59baeb10b8838fe7f0fb4557eca55f0abb5c998a947dacd7349c9b75bf9b65edd43c1c9d792fd950c2a5a341fc3a76a07b4e7db784edbf6538135b0100dbb8e250b06", "63525263", 0, 1492178970, 1537743641, "d8e10abc1c9659c9e9b3270274c44be5e6e381a46017765d5663e89633534dee"], - ["270aab150419dbebdc861769f76afe43a8abf6c32bc736d90a2bb550e322255e6748a1c62c0300000004006a006a0b52f10e2e44bfe3337fc4c96e4a3e9df9070adb071f87e49a37b25a9bd926d450937f2e02000000026a00ffffffffaa004ff4f3069cb844f6544c6e52a36b366d6f092c0f15035b08a3e958fbdaef020000000565ac5263ac7f3ec8ea76986b3c0ad17b167ed9865a6f8bc3856c5bb9a05193b107bbf50f9dc82f43fb0100000002005290ee363b041ac6f304000000000752006551ac53ac5441f00100000000086a53ac00ac52636501ebac0500000000065165ac5100518529c204000000000000000000010000000000000000319d73000000000031d6519c7b95574ec9fa93f583be90ba405f0ba66160fd34aef7f67069dff9c2eeeff1b04e2035d298a95adba2654e4e550fe68be52a1d0e0553a1dd73632663636b3e433476d913d7c2568b5e04a9d59775cfb2427e1edc8ce008668909a02d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000944225726d8b0d54f8dcca95fe7eb865dd1fc8e52f5835a2e16294a4373a2a7e4434c0edd946eefad11491bceb57faee38de5f99009ba42d6a8b415e8a2c841abeb07d21d5866543161984ea43f02d6e77dae311588bfe7f8d6d24445fbcc7c40a8eac5c8712de2d41a315690c891058e7f769931c0372ae8fe5884c4ae631050227bbf920a67b5933ee8935e04a5614e4546f95f5bc352802988d14f19977bbfc0229b494540761ce658c4dfa6217f4ad89038a76a367a68e92fd3abdf3e08354320b01c81863a2bb789210934bad1db902cbac45ab44c1fb7153aead52b7050dd133f37e02ecc3ccdb6fcca8826444d494739479cfaaa498a80785e294f2ecab3b5102196992d9c649a323da6a14ff72171dbb0cb15a5f4fbd665de5e9ba0f6d58075f0302ad44970d6f83334542ec554fa9a7ea9766811313e554e5143c6450671219ed0303a78fc06254377730c9531026f7e228e5382de76cfd8a7077439abc42d0ca5b0221412506103edc31bf7a2c38aaab5d61a8d73e2c99fd9f622ea569e0c241e9e9022dd039c767569e4f8e21dc31928d6adca2cbec8aa4677d2a3cf75578ec145f4d717ba9891235a75cbe9c78bfe146976d9e2dfdb7249814e82debe88bf403d5dc066361ab8344a3c8b612ca7982ce2233cfa5be6e7005c5bbb50bbf8cef0ddf2b675a140d0f494b6607617f493bf5fa4a38e1c731f4cc99082855baf37064cf09d586b93048186042dffb9a3fda34a330684e2912901ed45733d8786f771fdb8fc1e2b28d388d0043957c2a78f2f4d1c762dfa1d6bf39d561a4a05aaf165d57d7a426cf90bca38c0d360c9cf2ebc3ae0838cf90ed1f9f88ead5ec88417fa416262822eebd2e3eace4fe3b7c64cb388ba9cc94b6082ec716821060ed0c8aed3bfa26d35028fe350bd42fbca1c409afcffd17ed699abfad3d32718a587810aa6d9f66c9c12ad3ea486ee7eb129ce31b7ad59c56c2b5e987febb0e33bd0ebbad62d1052446d565f775c9643a7b41feb976cbf27a16f21c4ec726a35e98dc6772ce05763e2ca5fe62a42d743cb179df4be330827059242bfb59e27c7743f507dc7b30ff168f9235d461041cb59a19d61ca930af161f3d5759a4ab07e4f824daa810b570f6333b05c40bb221de80e4798695bca8a4fca2dc69ac73a6cf2dc851cc1ffb081c1e75915d791158a79181811e4935a99ae6185802ae6f65b528250c53b80f15f29ba155fb249caeb39ff3c3583cf046c67d533515730fb276798527a02c8c6370e4aaac1b1e894423b95fdfedb11b938c8d5c689ffd0a92c18b22a10f65a4c00e7e2e0de62329ac997023f21a18e49a667b3c11f10b49300930644d96304419cb174cdde3f3e86bc76d843871ccda72d8164c00d489489d5b87118e01751a9d81dbaacc65b7b5166de48ed541e283a7beec1c5bfe70628ad15689f40c686e4da04a6dece9802afe2f8006a5f8369eaf41ae75a4fb806e46c683e1c77902aaa1ee9f943ea434732dc989d176e8c6c444d765ea2f27deb5a86df6c3ec29e6bab02c4bd86e56ef879702f9c0eca28ed89cd85f1c5444003e29413df948d87da81ef97db86d03780d29e5a4c7158d369c6f2979071101e0d555ba233ac2a9517857c0303cd5669ea9105c11359aa05e9d67deaea4bd1c840353b14e5cb5ac3240866bf047ca7441d4522ebcafed6e3c88e5192237fb5325358162f9669446ad43676cf96495d18f938ee38ad039a00d100482765a112d08824968d506b2f2e9ce4f2bd8d84c8222b3861130904e2c9cbd3bd4f8b64f64800524114276d45b966e811414209bc1a1a41a723bd1e3fb51c1e975480a3c5277fd37793c2f6258bae666a1f18753e666d62f331b30df0b911405a4a4621bc8709c6928d23c7354791e1c632df38d47cdced6ef7d13eac6677094cac9c4290bccda0796ca34de3035244d4af163b90c025d731849c9af9afaacfe8cf6646ee06269c40d83901cf7f55ce394b25e13d5b768f09db40d702836cde7a339aa2939bbef6c04287e3ce464882d1883d74b9f9ff5f223af655b771dc739546aebb476d83087dcae00ab2c9d02a346ce6116efaae2fb17f684063740fd65c93e883918437662c24a26a2a1260170424828d5eb85e33f8aec583a438a9e969bcad600e6da27cd35315a20c72fb7d379aa0b67317a3b8dd33631e237935619844273949c3713fd36d6f724a939f849eb9f73084772b83f3750f79a411a7cf48d409f1e78b3b5b0a1d0be7d5b8f564106582dc1b68d9a86cf490f1fccaf14c28a75d5b78e4dc25b178e5f1d11f8ef4241b8385bf02912b2333044f3b65666817cc18e36508cf8db950b641b32e69320c1171c347bd3474ba18c956312893fa8f48b3f549cb82d823080941e51e2e7c9e949f8e7f6083e71d8eea5c16b8f4d8707", "516a00", 3, 1427058608, 1537743641, "47ab0be6c1c5d99ce621eda4dcda8c67660d502392e79ead703bb9999aaa93a2"], - ["9f8848280352e280cea58c7b36398d9175868db306b7d73f346978355bad60e7afe37dcda2010000000951530065656565acacffffffff2b1475e4b3f28479f58bad82e868471de19f99c11c4dbd7aaf66d00588511dab02000000055252006a528239b9475a2a74bf7f101954cd181bd58dd9108a559a694093b5efe797609214df61c2800000000009ac5165516a006a53ac325f18780164ed22030000000005ac65630051309d210902000000000000000015abbb040000000065d4982c408cd383e966653765b17d3af23699f73cd2c048f6a2652a76e91aece6b761b4bd036b19c8f6e1c009e1288413ec322306a355fc450f9bd0ec6c79ea6e88332ecfadd083496ead5e26eea9f6b9e21c4bb41903f658e0192a9375898700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab03d61c3edc3a19c7cf0a879171639766b4fd05a42456dce80b7bec20faf69ceb01951b89b7c597f286a0a59a2a1beb2a6d6817411d5b37911f3cd34e20f33bd19d392c6bd96b11df051c7d9a901c81bfd910268b21bea3b2293e2594c0d06c7a88a6eb8f6502e18487a971ed54944af66d4a9819233a46457982d5b9a2e4c6030e66e72ee69bee10dc901158e6fb2f82f1e5b1899f30daddd48f386ab744195b031b9d505eb78e82668c5191447dd323b21bb98ec8e4814cf0579eac4abb6a39460b07a47fb3281e0c8c419fde701e49b445e43762c9da67bdc43f3739bd5eff8cb724863b95447e93efe072fadba001e4a268a1b11f0b0461fc75aaee3df2bc6fd3032a224b7a86463bb8cfde1166b349e8d52c19e2f2159a066818b8f6a24bbf3cdf022abddf2c0d0611c04a9b0be931d76457a4b3354b9ed778ad91ac897bd304f560020b3c95695419fc2dd86d14934a4df87468c784c672939d927bf1666c9f7cf22b020aa3060232099077ba96f686e2430c6aa2295ca0c42728cb941a08a6abfb3a170200e10bf0b7ec695be60f88b165287196d517cb7d9a22255c8ddbaad21b329a171e30f11bb1b82fcf9f63a6f3f0a0e734fe4d3e85baef577eabdfa96b1c2f13213dbd5149a63e4d014f130f3414c8cf1525157d6a93ceed5ddfda46908da937231b4e2a0df36d9b75034fec30ab3fb9b9f861c578c3dabd668d6bfb9ba39c954ed7e18a2e0f1b186e79810f156022e8e0d00138035b4466c29f1b013dd1e66c804c8f7b44ef0abf4dc16410a8f2871efbad3a780245452114d86f00ac92e703c67f649eb8c45d851a5f1e18cf01638dc79c78c91fbf6067693078567ace230198e6cded74807705ae2921e0d2a10f1023543d1e4cd2885514987b30bfc44ad611c6c08e25448dc1ee297876161713309356b89e6c241c8bc0bc432141f92315550f4bc0f26be21078e5b6ca27167613ebde5ba191d16c4df0bac60ba6823e11fbe6b4860d4e23d8c0714217eb42892fee9506608af0761a19364fe4ed7b191fbf4d06517e1a58de2e40b560660ae91b413a3c1176451a6e9bbe9aa3d0acb64383e4c3ec243dbb62712b078cbe271037f0306a45e5e1df3a2fe49c5ab445f3c9135b4be4072871be5fb82bd0045df7b64c25a9660343155e151da7fb43261dad3a3b48d050037828923b93293ca6fd5bc79966547cc7953661b93e12ec1272bdd9a4c5ff8fc4e9f3cd6eb08b00f10ba422922bcf5697f7f5341a078360e332c54a627b184c7e5721fba39d7b9d4ea8eb2888a60570e0609f54c8e136e2054e1938ffaa725db98be0de9ddee9d2bbdcbf4fd63506b5c603e7871e497a73b4a008359ab474deeb015701019673fd34ec6e72d1d069738063faefd66fa08979739d8b49620868c989106e78a1e7a30654be9071b830fb89b7317f9fb8f57a5df385b29a52cdb742ca69c373f8a20f2baccefc759a6b135ad77cab8c182f6d7d9cd08a225a94a820bc0185467c61e39ab8b00ab72c456d24ff230c1034564a4ae7a8e15a308403ccd946a112403b6bb7d152a33882a36cb66d3c075625862e273c2bb4ce03744a44e6fdae2e30e15e39231f08c66d512ed026a2463bb5bb4d1ec37a1a122860613a9e6b42c6e9a7089c6ee722977bb0d0ec9b330fe3394c1ea1020ac85a31e838dd93894acbcf8ea23b80d8259d022efc9a7ffdb0fce9b0a503f40bd635377de750e3de01d1b7b3ba7a6941cea985aab06bb2b87f40ecc005e0f57317fd8615b694d4d6604dde5fe3b25128c77a56ea61055099e885262c364e40648ecdb77db40bc450a006fc86982b60bf66e468ae1049365f8c54e78158d474c77453819425f1b5fdb4a14e7991b78dfdc9b0548f2c13be648b068bb4b88ffacc6af88292059b57188021443e676831f560d1950f96578518cc3c9650c54bd6820b846df4e3a6ec482a8efac9feba6cd44038338b4f745797d5b0c71dbde2831a596907bd3bd5908df20fb4f43219f9d5450507dff2aef10186bfe993759407879b0f71a82789026ccfb1c6cf4c1c5e89f22255d7c534eedc2ef14ba4fa8877760ebdd1302414fcca4374493500eaafd97e8e77eb5ecd48de309dc7ea129356c6e8833a7a31fefc26a25eb424b468cec037abfe22f92e12a7432aa8cab6ae1737580803656680e53f6f23b1ea8002e8646f6a091297804843b2cb9ea96b9c6a3cafa2ffef70edc85bc6ccb420c193cedc8604bb0bc5b325e4d035c4b9b540578ec5f0fddb22b2a4bf818e73f415dea4ba402821bfe96b00000000000000000000000000ae90e72fcb2730ed5995640886c00aab6d9312a848c110d28096c30988c9985562930f2b594ff6b0bf43e023c4da315593c962a7db950e713c930d7d167bfcfdf464023f2dcc2e82ba5b5e7bc913d2f11b80567993229265eec48008cf5829d4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004f880cdf9869b7620802392ed1a0049cd0eedd74192aae755e4c903ba1de36ab0a9f68ba128e3d49e44a8483bd1d489158d99cc0c056cf4db89e9f9898dc65dde2e8f4915ef6f0d936a7bc5b084683a80075224a7eca3de4bb2af1f36ec0cecf2daeb31d38ca22d9c1574376bf3de23a34d47a4e79f06011c1e325a0034b42f60318f534a7144634f08c0773008b0dc1fbc1257cfafeebbf0089a3562682e481f403204978941e54a920e44d110025acddb2c5661a5a310e060151e64b7bcfb5f5e80b0391cd39934e8175376c382b597cb7f3bd1c9cea5eb3bd4185e409487b4238b4a1e9a5b17f0d8f98883ea0d81944771a9d669b410af2d562a165174a75cd50110214895762605281d2394291183bc644f71a5b08fbdd3341b01ce92d05b1b7ff1f020dfbae9f3087006eeaf1b1fc566660988561db083b8510779da729f8d37c9a8a03283293c1d39cee776176b84e54a9e7eb3e09cd3bb3c2ab2fdd965aa8251211e8020ba95e1d7bc67a24e7a11ed5c270f21ba4e3356607ca4fc8123d97a98e79bcc6031a040a40de4d7eb2960ed436938464d7ed642274922bc7c4c8f0cd865c7f2734ef3a296da18c818267752c6f6ec393ec40c8b6856ec017a8950d81341de0564b9e67de9eb65578aba0f08337f7e498a5046b38e33361a5e55ebf55b290828095b970442f262d57dfc4941f9331112fa36a1fbf34d086b806505db50cc112d0bbae4a4d20be55791cf6a2c72286e9add4464dfa5222201719ed4bb152adfc144c8dd08fbf4e3cb23af2d79e42d2f4432216dc99482529bc5f76d7adba8d358175cc2c50535d7fe3fd324fd221b7972d5f8bcfef26b63397921b74acc8aec33f24c39847b44589d3e7b69988fc087fdb41cddc56f60549dfa56eceba49b2843ed2a1b74bc54cf20a5a9ca9e780ceb9e2b09a19bd45ee0ac4a8500d963bf412bfc3997f2abcd2954c1463e303e17123546988ebc7f8109495e036427b549656fcfaae5cc96c8d7ab70880d20114630dd517f709f5029c1b19adc7d50216391944061c1cebb54995cc4a54e1af64d34b4b5b4276cdf0694204676d6b1a486cfe920f05d4dfa8b1b6dbd29a7cfd9f01776a59eb3d8cec1bfc82e813b651c4e3fcc777aed92a2457f924ca4f4f2dc8843e045a2b09dc89633e9b1ffbe808bc0caacfe1b1ff1e03c3942a08fdad7f43438be941760868404df5b61c387b8c7f52d127455a3ef8926a1dad1af3134b030f668d09be1c59ed6bf69ae78db556f54bb745adb0d00fbd27d416044acc8051acedcac3ffac1be1dea68540b50285d3f1317b93a66fc2f4abd3cf85780c3510a4d20d3233a11d5745f2d1d64c600159849c3cf00f91ca29862cf061f2a66474b3bb4bc37480de9611dcef400f6ec10ae5bfa52c5f580dbee62997e77370749fce4b64550e842679d029c70f4bb3b3f8460bf970aeca337772bc3e0e482c7ae451ca87da1cebd07af4bfab13e3505a1993f520ae9b0eba1241efb42b1fe3a025e50d97a0b2df9aeaa7327897ccc48116e161df45fcfabd088f851d8417419bd4fbc8b27429c3db65d1f030661403197f82db8bc7b6980a53da88bf3a5d6ba28f1d9b8217749ef76f271a1993c81630d6189a092669c22ee7ad2c041ff40e5c8ace8a4dcba5419c6a1833c2067957e0f6ffde46e2dc0a14535452aca4a5ea023036162d925b7c37645f298c6810c990fd157bf784743f0ae51f1a421a343ade76349572ebb66d46810daed8138cf0d66c99334e0be3f9acf4b8091dd111aa8e06f2a359de1780376b1bd86809bd2e392db2d500a37b1f258568ff64f5874b8b7073499dc0078b32eeb754d9b7e6aac03981abb5507ca91cdffed363b16c6ae07ca5b088712b8c8a7a8b2aa4c467c29b8396a721b0dc098703a52c2401473e42ad0650bfcdd424bcfa1ae2e60aa60e39a79c0dffe7be70dfb236324a4da3f5d94415db7585d146dde6acc91d2fef32d94c48027841f4d8909031bb0a76b9e08c3429f93b16c67de5b1603ed37904021f5b8fcb8417d776f9bf244ce0d9167abe1de628f7596e7a6f96cf608ae4eddce02a7db0995e21460aea4ea9ab96b1ed499bef398b6f9a5f60c885fdc35ede0733ea3ac4f65b0156f722d1a085f65764f57d5e74d81b8243eff2cf1fcc886d6f47e88f84427e2293e47841530196758f2995db09f0da51bbe8cfee66871f66baba0f9491c2898f4e7294c7e07fc127bf354efd97eb7d4f41e8dd6cb5b0ec04eeb22ca4596078bdb68c62829d047c1c04433f00d24476819cd867c60892c6f8a3ebf8164d9e9a1b4ceecbca95d9a80f45ed44ea3c3d8c5c9df45703cb949f635c58a956111b1825f5fb4c2831b258e3691d1a2737f22d256307a6718c061eeee881e8dc48cbddd3f966b7e7b0482e80a4979e591104f44702", "51636551ac6aac6aac", 1, 584847997, 1537743641, "7c8738515605ccda50248690af512f118438f1a110644f8c5a4e39c36ac403ff"], - ["030000807082c403023f2fc2f487205c0c2ae0ba6fe8a10442941d0caccf7ca6e96fccd85a69627a1400000000095252636351006353acfffffffffffe265605edfb27cdd904d4f3bcd0fcd25d7177f3c4d53d7a160e92d54fab4b010000000852536a0063636551ffffffff01420cf603000000000200ac00000000dc5f43c2022a86c804000000000000000000000000aeb330493150edc5ff540c094e7efa80d00ef4a2bd986db334613c8e9d5ac0fb6b6ef826afa070a8c99e05463a440b38ef88723fdf014b9afc645bf7519ba7f5cf39f22b101737a2466f57f9fe1f67586181bd4fcfeb2d3f0e21aeb197ba8af4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005edb3cd71579325be76d01e1e548dbfab80af4bffd7c15198a89af4a8d441853e52e1c10f7a10c3f55ff6bbb3b04b23efee208af29aae0d7823241cd2a7f8a21f1391025e6b3293e49ebc02c51efc8af75c4dd26d0a3702d998c07aa166c065d3aefe694731e6de1b72b5a1c585db94b08693817b2e79966401ac946a07d2f57030b11bc372e02dab0f9932b298a716b39d30154ba8630bff2d650afb37100d8e5031dbdad171d1998cd40e41f42f86bc0e8ab9b18d014cf3c25fac10486848453750b0091f9d7b0df3fbbd56781eb5952c7bfa6a870788fef01cab90167f0ecf1ffc1da94ce8754a12fedaa8aa99f29b095edfa23535a800dfc9c6e8fd6dd3290c255020f1b7d6d47a65077194285b96a4ada7d8b98fc3b74f44657ff0858adbbb828110308a6426c89be1ff38036d4dba8a11be5a0ceba27cdaaf9e728e712b4e3150c5f0209cf2ae2f2c76c84b18f48d6769009583b09094dd14dc2f308ceebe45fd35528022968eaa695cc5537b2c21246da4cebce4aa3cfd21ab581835b4f502014fc77960230114b239a87b82b1df3c5ba0a7a7e6c9e02cf231bbdccadd940fd99a44bb3165934018437412bbe4cd8b9d7d3a37aab6dafd39ae80299265a7f498a73a26b4bae6d9a41328eaaf935b603736a6e56919cb5a63e8d520f9a76f9397a8b9e35f348250aab967a85733ae8f6526a217ef12142854931200bfce18d542c27c7091e9d52d164a0ea922776b9f8404f30f913ce908e5eb91005307974f9932f195005c3403901a3a5cf8ba4c875fba6184dd0bd94a868980674b3eb93d596e9f84d686b4f0e2fdbe6527c4add9780bd002a60e2f1915f385a3f40ce58755a5df73e1b1eefa6493bae2395e1df8deb82a2ac7839d782fa25dabb489ed9177b4366b9932da474e18b915dab7d57887ab674460ad623c8871d5653bfc82e3541ae7ef789c8411d69b483464cfedf2a11fedfad755af8c14b63e3a931678550b6713659c2f89ff7de373716c54c5d828cb5a0b9c8fdede0ae8e3b7e40be9c1a4210716122e310c52fd5eb3f30ac335f79f70a88b148461f93b53d87c97384f13d0fe39cbd845b586580130efd77c7db21a36f747866ad04d4f5aca78544ece1a0e96d4725c9d9035bc65454867e7386baa0fbfac4580f147eda4f7f3b399de478a0dc773b989961ecff8b7a2dfd032611f4cd680190be6197f256f3138456346ec5071a11f51abfa4e83f57041cfc716c1ab31538baa19604b52ee85922fa61e9ab5c58d95fb5db1d47cda1192b48503980e76a80fd1b29ac6a7ddfa737de4175842131e7987e638721623e7657df57f4b36839a534792aacc8406b16aafa6bcbf2647300e8df77984eeb6fbcf56da92476a3ef7bc2235b58c701b5f8ee9417f80128537121ed9fc654dd41dcf65366588d3126cb19aefd3efb5918e0bfed31d59721a5e653c4ee90abf8f3bfa818b2207f06135b6c4417644ec5ba1e1a7b23f1946b9f0c8c7e27a13d7a8c7566c4c5e42e002a14f86ffc51966358c729957bcc6a31b72368bddfc177206c70efb225aac6303a6e59b310a59a16eafe4eb3b3793d76f2bccfc000b23c09f3d87a1d26e81ddee361b6bff0f5c71c2ecbc3eee13fa09020c66421e7d042aa35a0ad26b54b4fd51bc573d46807fcdad76f8b79022282a9a5b81d1f38170fb2815eb0e7cc10207335ca3712df9c0ae07698c881b41505aefab261d0bf8b2629319c1b3320f1adc94e8ff274fd87d6e080d3df3a2a233492c63d260e98f4dca6971c278123b2ad41f15b1fa38a3560428d87fb2242eecaa91baeb7d2d0d28f8651c559860c02c4b30bb9d6d67e30cd7467811e3a6ea33b7073048933f5c53d75ad7bf3ae739ccd117c50338eaaae64bc3a37167e10bef1644da364348f8b6901ef36309580f001f1c8dbca929361e24bf2aabba69c3767dfbdd89f63fe21d1f0a283b25f22fba68301df5b8292f825453b991450c7d4d79f9e20069bae0483c94d0c314c8d7b3c704683bb94e93152bffa3474d790bda63c8fc256c78a800d275a2cf4e6def0e9f73b879da290c1cdd55afca86a5fc77facefa8d30f2523cdca0a5046bc0305eb7d9fa7dc01cff6845dbf634b13c2a4d3db00b4be9d164364a4a1f663b65635e12cbcd0776cbe06fd79add901b030ca06edc0755f598e32e536cb0397a70fb34f6d41b09e5a0a3f740f9939a95e32c1a6725ec0ed4e229c6c6cb6895384e9e3c80a43f41fdd9673272082b1bc3c7276b3e1bb3d3eb8efcd8528da8b61d1a3b21d096158cf250000000000000000bb99680500000000970d004a6cc497e36f84ac64ea15e4ed840b82df79a33a715ca1fc991d06be7350611c638d578a4580a37d3bcb8b44512149abf137f7f089f5ae2a45e76b598215dc46b1f0be0922043111f982a7fa1978fb7a8cc553c624b8d7ed93706584a50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033d692bd644f4c4fc03f663c4de53123f7a714f06ba85ff61ae2f0b107a01d2a3f6bb6a87e82d5509e033fee62dfefe4d6f58fede7af1369234cf2135c7104b670e6c136e4c0eff6597c10fd7bef8a6beaf1666aadc6fce90eb721a10a7bb9c6f4accf32ea79b29d3dd2c5926d499239723ef12bd352145a803b92ef4bed7d9c030d995ebe3ae15e10154b60486005257449872fbcff5cc776351dc4f19414430603112a641706900ecdd9eb64444ca26a3e3969f3e3f18b1ce145430e9398fc9b5e0b050690aab0130cc8b0c213db4e16f390d202d7770a18a9ddb2113c58e682b7d31a9175c95268111c66a37b6dbb98b7457ced819c21868e2bced4ed3b82a98c99020dd42a2029be05e81e8ee4b0bfa7983aa9703ab88dc252f7a03f131e19bb0eb7032a5f196c3eaf037007937a2041bc6c3f97e5f11ac23a2d9340976cc1e68bde7c0309e9c85f0030c04244deb82e54aae2dbcfab471ba4a89bf50027b6538127adae032221b42ab81143a94c707bb5ae065b74aa8693a62de4ab31e051fc9c6ed54ad9030a1a5b4fc4b121a11182a31447aa5b0e233db91c423f8a61741d5b853567f606030bfbaecf23c3cd6f1e5a1aad349c4c94bbb81a9afd56c2eed900c544118d1fdde9dd0317c9435ea4b843fdbe6022ab228c6d25c9c778670795700a4fd394306ed2678f03d459610c0cab9fa02929a317cb27c22b383c6664f89af7efd022a66fc32a7f50b1d2f2e702b455d4cf6207e1beb3d3f96e052f8cd4d7da354c5a7067d68fb177442cfa613a1dbf963de2b5bb03d84845443bfaf60ba121f3240fd5ecbd658902f0d2c7dd6f99c2969cb38755a5cb3089f133f9c5c33b3d73cd73ca9e3dc753453334eeb3712e888ff5c72931f469f3105024587752750257964925c8a270c21d29ddd01db6c3645b70889b8337d45978be9fe3bdb88a1ccbff0c7a08fcb94813787c537bbf3df64c21d58d6a826b9ca439dfecdcaa4fa20fb1adf69311f7eb49bf92b936e168429ccd3e1052bc5a2782b8e87d092c229185139c3dbb4d29dc48057b9203b74b78f6645e3ef00ca06f56b7347f264a1b506a157a07de78d2231efac41cc1bd709c0bb412940272bdce2ea767ff3c40127dea2628a8858848d2a64a60fb73a91032db98ce878209555cadc2f076fcce23f194b84f24dc9c40faf8015908939cc39467d85a438992df528f47e86ba37244ad60c642a745531bae2ea3867a96389ccd2c39b1b17fbd22c5b9d4135bae3394f4824659153e3c8c71ceeaf01a4e21a710158d57a184827d33bd53934e022825cb27ae621c9b1ed6644bf9ac3e7f454e3b2af69f1bfd24a14360fe3e253f450fdab2177da6bc977a367d0cbb7c951e90f1d80c362af4d5ae863c599a08d75a3543dd7232e44f38f3d284cf905f7f47a019b4782958687e7cb1965a1bf7606a09a9085a6b4646993edb0f7159ea3679258296c516d9f6e3f8e5d4cac6c97656740a3b28f2cc21aa78da2b94328569b383f6518f5fd387cfdcb18f53bc6e65b272a8a291a4c143474955dd8d5c98b3a0aac9c51ac3b7dad471ba67429f699ff368e10d09035361e71f97396f4919b02e6eb33649db3d38c69d534a9f62b17acb6bb4cbc530c64c3e0874c3e481f635a2beff6dc9f09ad467e7c1f590f8583977805e714d193e5e45b2e7f24960229a48d372379fcad78c81d200a18d732694a32392e62f77183b6d88f7e326684ba4032620e64f3cb193995a2daf2b19be28848dc5fac1f4fb23eded7e8368fe642b123cb3ece1118f6a906d63455dc25e5ee2c8f8f420d6ab580978da473cb653c1fde96ef195c991cb75b82189997d88568e22ca70ebafd620f5753273cfeeb1b492b626c329240fdaa0c9bced4d3ed8d9ae4df2e9906a23ac07905a6d45d476002f3a3da2021e4fb66c0c1af5e2fa9745ceb19d71f9574b30d64f9ca7d444d2cc017117bc30ae579f98f6a83c04f6687cfc9de2ba75d14b09071e8d337b1d04b256ac618924ce2148a29e9084b80111482a23e4ed490bca71eb55288461665f6127d6bbf08a4f045820d61b128f56b82eb160168851caf2ad9fe300816da6a7a114c0820bfa999674a1ff72622907f629e6ed9c49d0d38724f8483afc1ad7e5bea8046bcf4ae4503f176ef8e7bfb6c0ef75ef8cf3afd7ccac370d7376295c7e8696930545ec0caeaf4b6056ce663f2df918a2d2bbf50fecb0bb131a5e11dad980f052bc980cb020f6cb4598874891b101aa71865770e6176f648c4d24872302d4122d1b23aa772ffcb1f0d263a6985ee78e517b0b573b9ea4e0b59943faa643d716f56bc782cfd430519c8b4f4da4b6c38b2b89e87be1d9bf103718bb27533f238275c71305d170fadea7edaebbe95645311d0775b8fda3c07c3239f66a4cc6ebc296b796d0142c8a02", "536a635151ac00", 0, 1706305336, 0, "d1a62890a3e895d4011398a9453916774ddcc502e82bf6b5cc71e00dbf701246"], - ["494c875d01dd01fc64f2b6a34779b247a07368411fa4bcdc1124422d87b35b5b0b93bb6b62020000000951516a0063536552acffffffff04a053e60100000000046aacac6a5aee0d0500000000085352516a53ac6551130a7000000000000153cc33ec020000000008525252006351acac0000000002ab227c00000000000000000000000000d9694e36e3a42aaf1779f0ec735d87d8bdfaeeb2ae605d63457342e31b8af4b99ca111d79b8c9f30bb6bc91f1061ed6be6a7fa3c9f38e3a2807917c67778f56d972b237a67e2dde32c885107498c598796fae52d7744cd6845ecba6b4b863979000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005046daa51cad5193081e9bb93aaa422304b48428e1b18076445bb42bcc5928eefe8d51f6d0003dd2984f456c25546af1de82e9cc0c5770ff23a725485cc8ac96acbe987d7a313dde83610b13534b9d5ae98370ef79eb59f6121625e7ccb179a321692c90b4956611406321e62fc35ba52b86a6ec821ddb433f02f619bb28f4ce021f2d58682bde5dac63107f16c3e71710f58fd3965ff06a28cac98a3f1cf70ac0030d8e880f1e6a8c5baa9f54a0d339a81a083eb4aad8a59f75bb8d73972708f9700a0924e48d15d83aadf1859b6c4b743218c57cda386c83c3111d72eaa75825438594c8a5e49e3b5606d9c8ff7b2e3757529ac66d4f5f0adcbda25f82c0b04acf03022ff1627ad036da9344d82d517aa10cd18f6606d7a6be3fcab7f5cdbb11a361f5030e65f82a40b79cc988b93ae0620ebcdab1a89de9f67fa30ddfc220348e3b0dd5031f7accd6f34e2b95e85cf641307bab01114030b077c5d20c792772e1ee2670fd03304e274044ea930776f43c837b6ea89a8c79336775f93759a5e91722e80ae11b02206a8375ea57a47a6fbdc9d274c1f67fc45acf558f0d735d6b67bea0bef42f4a4bb233b7822c10548f35d20ca64da177699a71c80f51d72a44d21973549a775f4d167d68b00525ee9316c3ce932d44e289fc1f7b424cfb51bd1fa6bb7b55b4e23e5e4e689bd922afc7cd6a057cbd389494fca0d2416d5b2a274b753dce886ca66b3f761fb5a60d5d3cba0e1f6fd664bdc1b6fc4285e1267a2ca7b8e5bd7c74a13cb3f5fd76cf7f7522611ebb20fe1b5073c616a1ac7dc7aa07a1df8a31726f110e31db1e352c5b55c26eaeb1a94af1e5b6bf6221d1f85f6570ee1817abc4f722d201b8154fdec5fdd632ecc1a00c162ee3bb9265f5e29dfc9b5e6bef4ebf73c1616967271a95479df61e1ecbe4d8e8b886e36eaa71c5f2ea6f9922b695dd2d1c6fed1246cfeeb36806e2fda6b67966351bc9a7ad4134325d2e3b412b0f85fc3e7dfb68dc4e557bac3a8acf782ffd5b3ccdc78e8f08c3a752058b20a77e27ca10e58ed988a4fcdc601b0d965a39a3ae870b7c4315041bfdab5d918be95b65813eb3103d72fb631491adf5fbccba5d8fe1d12f7bc6771d681dff006f562579573196cffcc7578fc4bd0f3766855bbd67e037c4ac6bb812cb6cea4f7fbf246d7c1349b3206be03fdc0cb8bda7482b518ed7e70840c0a0e28015c1b1f64dd7617db0a72a6c380f0baa7cc6fd6632021b75dadd27015332e72ba59479dc894f9f1409c285cc515de9385ad8f3c06dd9ee529cb26966f65a947a231b091a1a1c847c81d6076c00db0f302422844c86e2ae95c080ce90d5f567c8f1238d54674d09d6ddd2f9ad2938e786ddecc674bd5927d341d713bc37d13bc19747f2bf87d4634f7d2222d59857e35a52293da6b38b9e6af68ab52140f3078bf42051e611b068460697cad7442233f7e81f6c5d07ead06f1d3db6617cbd1fcafc1843e1a1b063ce40428331f1c17ef54d5b180349d4aabb3de72c2fb6420ae7819a0af65db6c27c55c9de2fbec397d341811a6426e4540246291908535e97937c78e5db67930c363879ddf4fc7711366d224ad49cc1eae26a04377719b8a28fa670c366f0207a3a22558f171b5e2f7f058b77873417f44489530366ef08fdf01fefe629cae196623bc4ca92737c0b432f5daf564d2e50bbb9043df460ecccab0b1091175ceb25360f92c9084eb48ddf91d34e64c206213ed87856f116e1f60e95b24c86fff7f1c5450bcfe7f57bb65377688733e49e4e0309b491683a73129aea180def174b91698623e8e992a0faebd4e95742b2d4a0b5d4827ba55a255de130ac14175a06e33de44990e7a276feecf3dd7ef03d80c343e3cf314f8b4c215e56800ee23af7f2eb6fe23da984eced0068b7bd5105dd6470bc2f9864a19d3c9c91007994ac022d09ad1bc88c478763d6a01a0b3a43cf176ed66c02bdddc8b3b63a8c1e46a86259de9915e3f5ba8f5784740960078c866eee58d67987f1eb036632c6cc10b5b858d1b688c3aec06c0f6e278d5d83bd6879f277ea69b71ab5677722e3d6fa3cb29c01ead68c265bc9b014233fd8c5b652298e62f5e3e4d65ac5b24cd2dbba0a36f4cd6e8aceea40dad6064659455c48cb6e34f0c8e59a46d0c7dac0bcd9c58160127be27b337f3d478d1d870e40ce467acbfee6a9c97630403a91ac45d30186f3199a2f20befb5e43b9c60c0b20fb8cab56d1d8ca51e1c43b8325661f480f60355a834585dd83db216e7c40da42385e27b0bc55c39b0000000000000000f6da98000000000052b156c60195fe475ea8de16c4c54999ffc35fcede0d94a16c050aedc7c86354da8f6443df45319f674c334cd73b033fa4dc91b0a77ecd24b41711f49b6b8ad171d5e982080dd240ae1ee99431944ea634ff7d5f85a85ee3362443c98c334bde0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036ed404dfbda3735378958a18f20903e9cbe70fcf6c735112adb9ee94ab125f6de9d125abf3ea673296eff0e402d30bf6da2d427ff9a72682bafd11d3c3132669db3cfb1eb7651015ac199c4967650c6fd440353903afc55aee30f1f5160ecd25f45e8c53a99105c92d6288dc66bc97679582241ddf503743d27404da0c3dfd6020b905d6115876cfb9e460d372e19d5485a7b1eca76d9bb5d0f34e8268bd0de900301e44632d4810bc468aa03753de8ec74a4fa92c351daa667147f51c5141d2ff70b07ab8d5e9270e124d08dbaaf256b5e8fd3003b65142661c9ea137753ff6e0fd1191dab23f5a931bab6458267f62a1b49e6254e8fcc641ef4c41130cec1a8115a031dea634dc8078a776614cdc69e819e33b1e6ed12d6dc4733707f9ad2dfe27d190306902ff251214fed8143f2a4d8092a49fafc4c1b0a042a114889267f8c6bbd15020cc88945498c60db68da1efe1811d6375aacd63fbaf8abdf4076e63b6febe6b70315eb5c367dbc4e9b955a3e8c9103f1347c93be9de5d28c243c8ee169415a209c0209a7a086e355220b967cb8a0c824b9924282eba1bc2b27ac640c483eca16f9375cc5f9a2503c719e3eb209bc334647b2f866141037f8769fe45b8a9de51131af131df82810a1568aec47f59bb1d5601b33c18cc8bdd0e6f2945ed4d7a02c3058564f80e4379c45fa84a0514eb46eeae0975166364ccf7dbb27ba8efa1d34abfe8260317da3b4583bcc7e7df7072834e29ee3e91dcb1dc0ce616fba19f0b5a1ad960c1c25a8286ea1309a711f6e399fd07501b739badca9938b1f21c8124cebbaa933ad084f3301520e1d9dbe48c8910799381a38c1da3428f807ed504e8e828694b5120ba4edcb3777839a2c59807970dcc4ea3204c0492fa670420304e8fdb38943de3bb7039f826d0f9fcdec652dbfc4426b64209300e64d7c0995da8697d295ba862ed142b0929692ba36737c6606e2dd3792d88d6b166d494bf9c62e5515d9367bbb679c937fed330aa028f219a39a62e2dc65a220cd90cd1255e72a96fa6f670de05ef951deb900f688d6f9f023662398f82a3a74066307bcd27590371c6aacb0dad966f5108b138ec7ccc4e039e813841c9e0667f0d0976a4d1e074101e122e1c659f5a2faaefadad07642251a099555dc8cc68f23490ed5a5ea196967dae6b4813941effb1fb778507e69333d2280deb157ded560b6be72ef157795081503645d539bfcadfbf493591291bdb85fac6e02f7f99174bcb670720686fc350afc5c4ff868e8cbe2a42bafb73c70edc40681bd71b73c3715c19201a15f9af641373679c118055a6980652c34a147d32d2cac6818799fea11ffcf924dfe4e370c325706ccf9d4fc428d73afe16630941a14d7d7c8ca763c72f1f336e30adf67cb3b9b42649877bfddcc131156f6a488668d625894d03e2fe7ce539086a4b4e44cca7f40830c8c939289853119eb5a64b3a70b213d62fc7b1b174f7045e55671bc04aa7a871ba60524ce6499e1e619799313ab9d3b8aaa43fa184ccee9da3680c80469b46e26ccf91fa8ec28cc3669daad9f301608f23e3f82bfe261949c383a00132181d71ed7f3e84ebac6bd0e1ad358973e8893f0b88474168e0e8a2d9aa42019ee11ab56292e1ea3161d5d02bc18a3a8544712d426f88f17a0b8533ea4d322a14cd0660f44a663e66d8fedbfd92ff6562f5b5908ab7f9373914d56357b41ff7870ccc7492f8a7a05d5fdf25a8233cd7d3a3363b4d5c21da9e1b26d473552e2adbddc8b5d1110c05004c0572d2b86fd0445d6649ec00e3a265a48202208ff0e068d2b037d03093b1982a95a1b76ddd68b4fc58ef75aee27d56a9ef9e43aa7433a11270005b09f4c2edd8bdb1252cf13ff2510003dbf5f85171cf2a0c8f1ce11ec8a7c3ea02d636a8d52df0243d7e4d74b82f6f3611bb803f76ebe0c463ae944f7d950cf6e7cbb5c9a047d86231754004b94454e1cf630d46ff728a9d877c69470181c542659a750716343ffdcdf7e0555990ebce658e9e4fe72947a1837bc8eb5a732f05dbf0d39780e88b68b2ab3cc53c235983a99b15c8e6ff0e2ce1467a7ce5bc36ed657bd6f74d826655e427123afe876c6b0956b9fa4ab187a0f1a1cf667ed7cb926e855c9980d123376c39d9c43fcd884d797fe6189a4adcff3a275beaf32e47958cf36a459df0ff8fbaf1aa11ea07e9c15d593afacc851575b92b9450d3da40fa66786703d4fa3d8cc11192bc5ce8b20a25dcefa230aa158dccc2029ad474a194bfdc9243c9df36fc133776906e950ff5ce59533e177a4ccf9323f6a0d89c9211ef59b9e481507c8cc28fe773a5baced7eab9c7a955946dc1e8a3b6601786177103908de416bab7f9cc12c199fef27326994a7ed8aa3ffed20e62cc964b16500f3fc96741ce5c4c51102975e03", "51530053636551", 0, 359786775, 1537743641, "1e6edfb1cf3941e4ba5fc3e92a2da133eab9bb3800e433a7b91c1fef1f48fbd3"], - ["427ae41c01e8b1c54fc4b2bd85f90e938f343bfdd01b101be440c6daac2e63cde67990bfe40000000007ac6a52535163acffffffff03efb621030000000003635353ac495300000000000863ac6a0053656351bf0bbb040000000008516aac51005300000000000003000000000000000002712e0200000000e7ffe9abe83a8455bfe255165163ddcd0c2222078d29140e6efc1409175e29af6667b59383b934b59684e7da81857441514efcf4385db0cf548c50ee395d59ddf9f483562d74c906d0f538f8a25f3f495eb60a3cbf4c47b0eca752d4da3c6d6a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004f4e5093d672266eb1ca66bdfb475cb49e8eb5189f543fe67d9a47075dea873938fdc5722792b7ae2b7e68a76114b54f262aae420825101d5910461bbe68f8cbc967a0c5fa31a588553794a059c05fd3c6edbb6653e2bfe20f5c43f1b8e27f9cf73f0e417aad36d1e6ee3dc8376f23236ad19f8d25339439aaa6dec54c4be9f103225e4fa56f9fff36ad134bdf2e8dbce4e8428fd878ba5ff0edea1a1b4e55d375020774638ba25e5ad944aea24e03eb44e378010bb33a0c801d0259016d14aee7a80b041eb9609ffbdf83e20d0f59bce1fb704e01733d349d5b8a4274254f5f34d043337eca8b6550cf8e3f4876f4febd1e0550ae41c60f4341275f5a70f45fe999430310d13337c848359025d521db2e1741b07ec0c2c5eb21bd68d23aa12e12da97020304aa2e9f3228599820f8c5a32312c50bd37d2399fef54b33c82706ecc73bf1bf032b917360c89c4f1483d44326f0c2298cc04075982f88e3bd96d5b15e45337a89020b3ee1250926060b464716c2b56b936fd2ef569e5e262663aefd6f750407330e031d7073ddd7a2c445df9e05447efcfd3741a05bf5239098c0a7b398230c074c4812ddda7e36f4e955e9fa55635cb452e687b6d3aad76deac3d864dd69dd43bc1219a9ecba21fc3cb9a3d06eeeae8f94b51f4083e6488b8d315fa99fa4919489eb4e9c5a382cbc0579b6f3bd919ab59c908b2a7ea8f83138c6bbb0561e052595fbdb6d6fdb72dd5c1ecbe1d70b897c96b3ca2528057c2208901c94b3444e75206620bc1035c2a9e2423171d9d68c8db00dd86e103ed3b00c93a4849cce25e7395c016ba94889d0af7b8baaddc895f22487b7c4f09bcf5e2503036b0fff84781a4421a1164a2180b3352e986e3b336033efb0e97b975be8a6402a192ba732c9a0c1d6cb9fcab2342d3039588211cd9a75423e4bee13872c4b9ddbdb0103d0da98c9929252d6cc017603a7811b53d45c1777c8bda867f7745e852aee122eca88b85e17b2e9ebfe81477b8f1c1dc1b3dd1af4cf35182f43c1ed2091161c1cdf5b17838957c07f39d4c09cf35da31248cefa0f09eb8779ef97122bdf4fd88c94e36ac7a5cdb9acdcbafa64c75906d388bdcd16f77de147cf2eea0ec236c0c3806361dc43b41d2026b25ac464c99980a5f31dbc7e9a4612e126218773de688d2c8f1fda16165d9ab93511cb3d6a9d0eab691ee8fba5832e2551c5fcc608acadeff4bf536dbbe08fc582c3d8b2e61d1379fd728db92b850a671c676fa5f73a37a5117ac699e3582c13cdc1251ce21f7cdc13e494ec932e58958ee51120f150d409516d366e52a1d3bbf4ea7e0141e5b42c4a30cf105d07825fbaaabcfd0772b35db8415e9a71dd8cd9ba78ea82ab0d05dea912859417dfb6f933b49a64baed7e4cd7c485d8fcce57a54d16c3b91efa00f226e2bcfad1687a462593f974b69ae08d8653fb981f739b8b0538ab85bf5563a0fd17d9c917f536a04d534530601a5f7f382af7c16af5efc6fa90456622bf7bac76ea1ba50ac70539bb819e64b05d91ae42dc1d08532e85f09d073e06a0060dbe069786671b76c0abd7d04b7217cc61391e213f78a1cd38e478e844cd436c1278a7c1dffdaca869e0128bf4a6a6dad43ba513547066329f97a847062758dcbe8afcb53cb233b9069749dd8a6e464add4fd261845624ba193982e89ee0304d5ecf497bda430f192fa394761a8a9fb3e2b0fc4a2bb6bba15b86ac4b42aa6d6e2f4cd93a43ea2e91be3475420360312f2b862d6156388a5f923688111b4d617e118232acc7ab17161c8bdc58cffb1b03b48e0c443468d207211bdcb2449595c594060290a9ea244e878a21777879f0658f0dd6098d16a646f8d4761ab2a436e5baebcc29f5b176c32aac1ead3e8a83705e318d689439ac4145d850d43f23f549e1c3f19967441ff7b66e8b4b6aebd4beeba33c5cefb9820088bcb773a0cd51216f2020fcb7b289278ebfbdd5c4ca8f19e5528926ce10a3b98e370a5a1f15b14abd39e3d56c9b22ac90bb234b0fd49ec2c4ae2409ba25cc94e3ef685aa7f0d60c1ecf187da83f4282f14189f5c23828d53a1596bac695aa8856e808e81bfab8e54f6df553393ba4129df6965970eeb0b14086dac941f1b6e4ef5cf5f64d7753ec2bf56435b4f45c09cdf38d79daf568b0e3ff873532bbdaa853919beeab0fe260f05ac550fcc161b8f68b1d73452728b21b6a8648f5b2c8f3a78d6d85f5b1c5e60a90d1b32f6bb14fde2d049c572c9b1eae033dcee72bb0534a30ededb28cc653849d70599602a7d8e56c010000000000000000000000000d5a48425fd3efb7cf48368765ed655130650368f4fc4266f8468c47e81db4959a0e450a1c1eecce4131c639c0632646cec1629cf0dae49c004095463ba2609adb3d4f365a51c2739ba10c3502a3c22efa97d6dc0de7cd4b221fe9b39dbb1b050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023059ed8068c7a1829ac22536c81510e9863b94a21a931a50af8f32c7aab6667fd9b77bd2e95cc836a381d1bd8d39f00240e40b928ab3fc118f9927d15af212adad28d904af0f4feffb5b93d2021825964cbd70f59326a7c81c76df194abdb357ea30fea03ad64263a9c5622819b4976cfa4eaa0ed7ae4031384e5bcda2757fe03072e0a2921a3552cc27c49220d41232ccf1bc726f6f8ec48097de106edcdbd0f020cd4ea1dfef2bb1124a0a5e4990b295bb4d261a942725cca72e9e213b3feae730a06ae648cf684247dc901009751dbb58e81ad4e0cbbd83f3b52c272f9b68d202d9b47e6d5898c4c41b5ea6bf2afe2606b592b6efa33726464d7532acaa8f440860208b32cae4b13d81e9deded61a68e91b782bff8e24d84a797ab350b6172a38d2d030f5c504499ab92687d77a26c165fbec90ef00b23152e5acc9dafb8bbfc29754b022c21578bbb253c5f36a6c8815b490243e5bec3629ff38716ffb8c2dac8c0d643030e7c3bd96b982a811c4b09a017963e57e3c3e9ec04151d502f938e07ecb3de8703269f5061920d795b3e187daa57278ab1dc2d1d22ab018e2fb30d2bf767ea005bcceba67e9ab0f77beba70f106f16117b32f066ccdcb9e0fc9bdbb4f233f7c77662d5340b3ed38db77d1011e426e7b3cc587b643a2848fbb276a3cf481af18a9f3e4bc971b2a3c0e0d3d5de508cee906eef452e17f584d9d4f0983f3abf85a5ec3dfb4d122348222bf2ffdc953fd8da0137a5fb9fef55687177ac1d8be0de7439868bb9e0282630870fff96fe30330ebe4f718afd7ba85e9da3fcdc951bb8acb515c715b2451c5b7989abca68507845063888c50d2e9b90231973b9113beb38c78d79b897b7c409501f18b8ebc65ecb5148c9aae436ea5eb88ca490fb3123409ad54dde28bb8773434bd73dc7c58227b093fd9c6f259cd1bdc75e724feeac85f21de2461c479bb21478811550b9d8f7a29d6fdc1989e86d7f8b7c61c306b1a2d9b2c6841b75a3f6224ffeaed67e18eed99c4018d02d449d18e62976054fa8c9a0a541f63110da4f2bce2807bffa08f34303001fd63d50153bad302e4e8fa289e0db3d2c31d360d158b3069ca97c958d4f70c350de5870846292be33b78b64aafca87587daff0659e602d11aad4c9d709ae504142544a9e0f0aa707ad5b6bde85158f6ce254e1239b6e492bdf20300c6337bfc9c6ea3e2dcfebbdd944a47438366147d07ec52acd6ccfc9ea12e340e4f1d3034852720bd321e689263265295d90009920ba81ac589b72dae4997164c787314caaf0a5e0413091237ed60396b3ff913bd6b8816370a8bdeca5ea730b5cab271065b24e8ee1338c1e233d74a4e31a306814076250fc6fc71f28e181bfe9fe674c87b10bd0a8702d64108d217d39ca2412de25307ddf54fd6b433cc4e679c9fc7398d475b0d592ee04256f2043ec373578b4370feb6086b6046c7664b64149ff052b750c708e216b49213ed2c0f9c29acdc26a2b02f81b37e13e723c4522bf70fa7fa31407f1aa14ce9e806c99e17e198129d15292ec0bb5961d52f395c73cf022f528c216ada29e548bab44fa409e92e7a635c837e203e438b1816e5479819d4a1a3cbb47011501c214eb3b5a365d38d8e801eb91004202dcb066fef2d28eff51125c7d21b0e7ca3e0bf53e57ff0ffa0392baf1b5167d85c542f8348d8cd28ae1baeb3f4643afaba4138766b77e81e2512b05c37cfec84c597f0f2b1aa508bdd5a2c4de341e3ef540005506804d92bc6cf95558a60220162ee3dea1c91acd10d33bff7fbfce3b0b822a9b5c783fade194e947795f5e9935f4a8e344d17cfff4314e5d4929af483fdc3e386e3e324488029ed245ad6a4307d07fbec658dcbbb977ddfd830d57453c9e67cfa706bf161ae81b69849c01b5c7762e9cdcacaf5c02cabb867506e85029ce5d6c53df25ad6b9cdd7db811cd122d93fb6502db086b01503f036dc2d5b21c4305aeaa6f15d13f8d7e667f11948ccdaa60dd8ae8f2b38dade3bfe4d8eb4a63c09958689d905705bb5f652a2383ae2f214f8124f1f8c223e099887019b7935485e5c5e1f97fda0333027f8ac0fcfe36ecea9c5b93b09c699cc70f3bdc0e1249cb25080bf0a2bcad2c49b6222f07b58f8b1a0fd3b52df0dd5190914fc3a608ed394b75b379240951f6c994327010fa8734114df335633fec4edab6384d028758ba34cb540f2fa975afcec4ff630a202b1926be53ad57266984aec95ebd9b04778e721c1a09cb4458a424d805a3ee5a80910639d2cab5837b9424f708b05000000000000000000000000ccf0ceffdec9e4bc48758099a9b640d6d3d709fa29f1a600b89df5897e98ab70f467b8e224b772f3195ec008fe3b8e27660439224c50556a71ca8268bdd895be4db9340baf298889dda65a412d16b8bc00adb0b73f6ad8db8c5ebde1fa04918200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b43f945eeb2a466cb107755cee17bcbd9663718b5259e7a047b3193edc24c0ee02ae484093ac6063474f0384d2c30a5c5fd5ca6afdae69939e2421f1d41663fff98435f5b81728368df074ea528f2f39fcf102d4383c37c2b22988321a96f0ac8eb2da332ee4436573789d9d787c9982b5028f7cd38c92c277c80be8582934b50223fdd020ecba3c5125d2442f397c414a22097b5905fc2aa42711afcf7f8267d4021faa23636bdc8c31818e72c37235159e25b066fcbf1a24161842fa35f24e0c800a015ec384b12cf219e58e9fe2a5b3fb9b1df587805d004a466f6bade6459200a0f6a7d175c20de246a37c0ee0c0ccd52369528ea1d271b7a5af668cce10f598320317bc539c1805d9639fd96b692314235bee4ab2e6e9ea23fb9ebf92b2da9cad270209e94a37031bc2d8e78fb243e1f2eaa2692f442cafa28883c39a88ab563e6ced030e437dbf6beeb8e49b95e2a47c02ed4c2c5774224bf32f4846185f8ddc8f9c370200e8c9f5fd6c26463a5115adf59f09410bda7eda82a4cf36546075ca48f47221020fe9ce0e1e2ba8e080306031dfeffbf61edc85622bd1ea7c7a2488f8e9044f22e9fe73fe1f19c37cb424f4c2a4e4122ae03edd06a374c5c52da26d57c597781fb873de93bbfaf055717845c19bc4894bed0a431e96957b0e819a79c817e6e8253872aa19de397904a190eb587a79b179b0397cf32ccc45590602aa323d24d0af8a009f30e02cb4acb84e99667871a3376bf7bfd5d678f70598ebc8631f942e99cb15304a74c30a4ded8f31e24e57786391926b9d5869d48352a92102c58b4b7cf4ea34e6e02257108afc8494170e303c65435df6021ff78a2705668f988a91968ca7f07935681decf6e75aace42b44991893b6cdee349cabb15f96291f4df1c7bc571d4af0f48e68509094b01271788fac21e5fc86011b8bc9ac956e0414b7fce027ddd1adc6a13aea82f5bd6a9bc2a0c5e4fabebf4cc621c5d62bdb28ebca2895dd07cfb9fa2eeff90ef1c230191b141e7980b5db641c24806936eddfed1564d86d2f4cc7c24074fc4ddee2c37ebe9c6e89e72e60949cdc49f49a0ea4d1fdc9a0b224c19605c3d42a2cf249cb3f3f8777bb2f694711dff9c04c95cadbb6acbc1af44332118717e4f06417d8c1c7a41d2d9241902581ff0efa7e822cd5f3dbcee976e7def657c8414c7c64147c14cc82e74581472647121af604ae9ec8dde33e786d87608bc94edbaf83414fbece050a9ee79a5698df4555ea4fe512beb74fc68657543d3400a9c0d425ebcdb51ad38e1b676f63b76f90c85f0af0ca056cedd0ecb67bc1c8869467e8a27274b4a882886f1d011ff22d859140703fbf69a3a1a11344373582625a6939147491316fc65b1d8915f8e3e0405407f29b437fa47b97b95c6152bac1356f3d0c08e504c1fb653662eb3303d87e9ec4ed090009179514698f3ab4af8ea80f2c0341a985e58b341f74a8aa0cd53d317fe56bb9f7930ed4676af26fcaf4e4596a4fee2fce4094c40583ac729e651a4f36de46675834d3fef73bb91ee4f6165776d07b43cf31426078589f112e122ab675a5b190b27b4842e67da394e4af5353f58772dfc95e150c25e6d6a58239d5b84d201901138683a1bb7b366a5abf7f18d0f9c22bfa2033a17acf0ed6e075620d95f3cbf0dced41e20443a6af7f7cfd68154a5f4297ae1e4213e4e0328e322741df99277520aba7c13a1d8a57822e64bf41b05e01e4d33e2c3c0c239680397dac3ac45320bcdfe4daae1e43cece972982988346a6ef15bc484c166be8ea264bad374d89baecd79d5bb271d9dcd37682c46653c1661898f15bc77aff55d77e8b2753f5e382618e9a8c96431910d263c1176828b463037f0e092d08664454da6ca77eaa07a1ec2a65699783ced889e0a7f91a3ad09c4628fef1061afd1c2b3e0d423c11354d90c8d52d2916421f3bee3e8a262caea9f509f394f37bb51a152f60ea81d5ca7ac928c3c9269994a3ca81aca0093078d7fe3b2e31415ed12be38ec4aa8351f938987587e1aa78deb44e8da47cae1cb509a3f8702edad8bd8e1ccda7f9641a459fac1ab894bde3639806c4aff34b07ff65331fc79992891a8392ca59f3daace685e5e2e3b24d49de9e1ed50943d639a3c94fdccbcb5cec011f3f4e16993073672dc3f2ef7864c8343d6c01da72fd10d6703524bcdf5c4366bb6df48677c2d4be4f538de020f48077ea00cdb8bc16981d62f294a942477a2b00aba5463eaaae0fcefb7e3cb4ec7cb7d32a5ca3fb0c9df7c58e66d1fe5d648cf6dc6e5c31990a322268a1f65650149afe654eaeac1d438c100a17d9aa3a5966f63565a3b05436933d2d9dfb98f1e391fc80b1288ba6fcfcaa3b174c7bf02801005b0c85da74af045aaa182d8738230d902d72bb875039082d7e28e7867b04", "53", 0, 1758995106, 0, "7e7dd1b1d3ef6a1e8677c116433cd50e12a6b76c42183a5320b3c76517e0106b"], - ["030000807082c40301cd9fefbc1368ef2882cfb15f2d280bc3445ff2b5bf385268d0eff6b50ecccc97020000000465ac636affffffff04b13b5a0200000000055353525352b66e3602000000000451ac65acc8a254030000000007006a00005263515c48e4040000000004636a635269170cf500000000010000000000000000cad2240500000000dc6df03f07118515d7dd865c4e7bd9a2047ffba19d447dfd5b183b1e070cce6b45318f21a550ca0349b5340e7f62860eedc61907a1f88ae08de4e0762e0a56dee5d385425e092b90bb15de164ea8d4bf23714a6723942847aabbf15aee84744c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18a6723bcb107215245ac2b58cbdc85613a5e8cbe5bc560f498136d29a5cbd12f3786461ecc0d301f114d5a52df36b433d60d3a53f82535c484935f83d3465783fb9e87813ad0c073686da8cbb93194b0d7c0e9527b150825617c03bcfc776e65cb4cb9e08bb9b508a2200cd91c2a77de1389c5f856b840ddb4d35819244073021435d6d1e237463ea18e5e7d0220e38b61848c085830dd3202ae99d72353a277032e59b35fd14aa40b628a330203a51554e1a97fbd2d7907b1a5d12cbaf3db444d0b06c37623aa501cf245158c532b14e8a93388c87031488ca7888fb8c0f3c09d2bc3b9b4a2fbe28db7ee0e53b0d3313bda9b48e3812eb78ee5a7dea01f52e46ef20229c84f17fcc5e61ea45d971785898f7050b066dcef2e634ad9352dbabb1332010313922d0a91009941da606ff09e1c6a906496bb3d8240a9bbbc7486d9393c05d3030767e6d5b92e8c209d16ca65443252b8fa24a6ac3591c32cc28bc2ae7d1e816f0324b660067c255a135ba20f49700c89f6fa3113e40e62aad2a6d897c69b4af13b021b65b83a00a7812d52ae7631a0f5b35573c589b9de6f3bbb3c33067ddbf479053dcbca927eef1087a5dbef8211f38674e1524a5908e3537dcaa742c89ba05ddf91d787da3fd24f872253561dcc865920beda58c617eda74724b0d3b1247d093f3112b1e04c5590bfff1a1fbb37739f4e856771848f65d0f83fa62f2ad23465a58d8e6e5eb569179ca72c223470b4fcdb2e77f83207f85535ea660266a17b596643b0c4ec011e52ba947bac50df25dcd6eaa0baa911e4141bf24efbaadf5aab1277ccc2fed23a67b39e5ade96f8ae5455761e8e912e1b5736bc6d34cd6ce1d026a99746fa38876d0f54cefd610a3ea9070ea656fb594d3740c126f492237eedd2b809a85563877061abff52f8d554baecf8368aaabdcd3e1360837d59052cda5e51099bd9ca2b083103848c769595dc348f93b730310857dba9bbfbf2ca49fc916c2c56e1d66d335a64f503b6b5d919b895400f75b845b6dc1095a2c8cffb373e5ad55f091ffa553232cfde6d575ad6feaeb6f7332a26cb9d1633bdab4750f77df93fe87219f6f77f1bec7d310f2b0d2006bfa68b25e4743a5d77da531edb8c5556699a65016be65b86bdd30e3cac04915dc7fdee9869ec1a06515da38a6d0313a2a59d6590fe9005f36b4911d3114bfdb898a445b4e35768f61dd2b303d17f908bcc48f34354d6b9c592c38d44417a1a094996de9b8dbf81f76fe09464920fb106a64c99505660ef676c8756cb3abfe938b3ea37d4dd32be15f065201e2905b88490ac438dc5c878cc6eb6313b3577743e23744f37dd0831fe1497c281e37b1274faef85dc834a9d524c75081901bc1540d40759309c6b3815e5d3286488c2c7c62b615e371a3b945ab0ece0c29583c2e24f155f38c86ae6b482d74f229652a2ea5ec6434fda5f7243299e4a285e2fc0844731703b23d7932d4d35673990a7614b4b10ceadd117f350a2a94b1b8b56389bda14ecc0036d54f0650ab91c6bad8b1896a5d4c74e19b6a5943d83b566cb3951d53bec37a414dbd45cab18867d6bf30b63fd75db2cdbf7213b8e0ed539592d04f7f1f7cbeceaca85e04c00f6dbc2996d574c16e2f1c1e119a56e755daee81fc2264e535ba12febb60b139b7d1c5b888fd97ef948e1eee2ba61d35e2ce88d3189b9fc014b4e7eee9d488840a00f0b7b37799d6696bd5929c3647f5b75467af912a50a75dbe930132958af85deb60565a60b7db7e18f294e82405e762e6ff3467923ec41221797ef4c8d4317a78ea07212ae641dc3357a66262d71c94f92fea041a4bf9c36269fffa1b59f899804373997f88221bd4c59f5ff78e9e6565ac60dd0c43a132066459e7349dc42025197c2609214f47650566b225250956565b0a95f8a9fbcd09116e77d7c0275f8536f79fb838646a610253abc65881924a6c323f96ead438ffa82f05d6ae3d3aeab0dbe0b3678170891d06adaf6b8bf98daca0d7877da197457913ffa67abaabbde7fb13ed70087b73f3207a6f4b3795523f881b6b49d7879355fa11162abc6a66ca24063a9cff1e269ec98221966dea2cb688c22bf8ec80fb6cfed6c8847993f61896e085654781a71656e91944ef4c3012d8bbc65e7a15ca519c9b8513f6efeff8f02a7c59740966328f8581eb25908cfdbcff4a8f23cbf0f2fd741b70c18ae41c36b537fd3a74add3fb90e679f7d706e7a14d015cfbb112ba46a8c0c728521185422af692b3de456996e97aadd3a95f641e189ab6046fd9072aaef2758fbda1ed1ac8303586e3d33399cd03f6405651b1a0fb5e1b54ac0bcd224f10e308f3f47a0139630de9bd4af91aee7a7d2940a7f176cca681a9e36c6d3dc8ec60f0701808a1b32cbb7634e97aa253e212d794b5abbfdcb0e", "", 0, -1013848608, 0, "0711627bacca5071a30f9065c77b48080c24608726430beaca8e9acafa815b6a"], - ["030000807082c40302760c3e83c4df081ba04052358e32129594e71674e36a18cf04d337e536086078030000000700acacac526a5338eb17a452771a4be394381391cade7af5e472c77b15855a4396ed03da1c19023294b9f400000000065365006a00637e55d6690262d8d603000000000453630065f9974f040000000007636aac52ac6a00000000007133601f030000000000000000f0957a05000000004aafac099c3260c21c7a56e5f7366ebe9d2c6623ad88a31cb303fd8141de0a6f43a928065221b7e45f7bdd384d0b0c22e4173eda812ef6bda9cc8d8d30e80291ea015e664c1d15de612e97afad1dd6287caab409c7c5ca429cea8d7be85565ed00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000abebd469fb6cefd8f6cd22c9b6080a45c4da55207cfa5fea333edf80cf833f3146e30d6ff75ca315a18633b067ce12ec5d58b6ef8d032f394c117e381576891bae36c84145be037e9c9299568566eb0c6ae0fb35f7fe7c00478a903ab27935a5f3f451248bf1dee103244a98bb4f0e94e91226a9917364968a227e58f7551257032c94fefc47a5e2998028d6d023752140a81f3b136ec84ccc7ca896cb09a4e8ca020b928fa8b86f2c1b1612e9b88fc6fcde9d99edfa6865e463febb06246cfdff820b03d97ac4532cb025e300871907746baf1ecccebc8741fbcba1bb1cd3979ec4b0cedfe631f0484415fe878955b71855ad29732e4aad8dd994c4447b5b607e6514030f0eaa66fe60b23b00e465a2148374766e43fc309dd972fc34f3555dc3bb593e0206eff0e97addffe3f91c705f67113198c5d18b54f5ca49d97dd88ac49cc659b90305917bec604bd5898312651d44b126edea3d7ee0ac64aa61c7e56bb6f1eea8fd022f1161e3f84de4d669d668018fce528aee367a62d1d2b904e40c91db14173a5a032dfd71b8fc529df5638ffbefad42635d35c3af9ff299b2a40b23bfbc91a7ded345e42076a7ceb2156317c90e9aee789a7efe25be35f8cfe3673d7b0d32db22f3fab094d30e6de4a41a1a9cf777bffaa450fd492ac58c1751b5ac85089c079be172e178729c34c79f6aeb219958538e60e9a279463ab427c8aa31cf93713ece98f73dd141615ca9dffb18597be411edcb40e30bc1adbde1ed3bec37eebd502e297a124cbd7090d09c04f8d358a1f9fe274f911ab65d5fb4ec7ec45c80a3e5446e1ff25ece037f7e5c0fdf8ea0a3f0a40753fd760c74a3860eeb03be7ee5da08d80aeea877031fe08d7ef1cab2658cf6782e7beb5da7b10f9b39db775ca7fd80d375289758c500044ab06e61185c586e0907c323b470f350d3a708d0da9486a1df2972bac68fd2f94e8291fd45fb61f1b31be2b2452830c1323a971d7ccdc54b4cc1345a94146955c736069beacf09d452f28eedeab284bf6fa81024dc69dee7bf2138243b6d50a52e4f2599966fd5372a81e925c50dc20929b0452b6448ecef97423ff2d3b0d0227e6bf1e0311b8d0c6112c7132f9c6647c05cc2f00cf71e6930022e7125713b85fd2dae7de612a8bf6384a7418407c7f929fc58f247cec3d7ce88c91799a75c83508a904350fd9f7e80a9a1f0acb4e43e9ccadd02454c13d9632b9e59b385b93c6f7fa2f6b4684520bdda24dad08b610515afa8d5a0d3097473909bf9ac132a0e140a5f8590b20fac49f4ce61e5630dc730004903b382acf51002690cafda572438c857b3dfde2b90efe95b0011763b934ebec6e148e7b6d999a072df47026c7d4afd056ff788cb3fd41cca25e8892167d6257191818cf148d45a4c0de42a50ec0f161c9017c1d32805ebd9792eb9af058d4d41412473e7ac908ce4d1d347b31678044f8f47bbd90a1a1b7aec96f1547e6af9f256e73b353e1f5c2c4515d7e58dd6dae213202c75675929daf61dbb8ceab7818f2eb4ac5c6c6fa250d0f1d4de9ca027fbac287f777b2e3462a5da1ab229c0714e0f43ae898f65527d6d5fa584ccb70941efba9b06dffb6d03391a56ae69f50235bd44245ea45d77cadb1c9037d7befce017cc79451b75fb6cf37d38c7517fd1c18d6cdb81a7e5ab9dfb3c1509b59e1746fa1a7c1a8ee26131352a85b6642e8dc51fbac7a2022247046baa438c1b89a3dc6ef7a2cda3fe029ccfc59cec98d47db7cb78e9a893429433160c9c6584a3a3f2535f03981994249a893aefcb1adcd9a5183164bccd7013aca3539584d7c2c326bc881fe2f943f22d546c8d5dae3072c41633f422b1d7fae844debc25c6b895d5fd8bb36e3b493dee83cf92bec67c1c7f8964f7fc207725f261755c53602b0094ef0169501b4fb7245b9cb889af4f1377be7dd246ebe6b7c2bb25e5a0652ab93eaa1277ac633f599eb809f046118a3e8fdda1d0ec578b9e45c79d80eed6948c135dfa04f4ae6e621d141eaa033287de2fb11c7e32aa90ba93bdfc0bcd756c2346b4b8ba595c1d173e0810dd33a11da5d2739da72c256f411b97a94070b9b3f5131a416941e2a856a2735db3b8a9705116db704fd9aba0c69394b190724089bc94b06d6d7b69bfd431dc4fb99bc8b0ec89ad6328687767354f27c5f34ffe5e84196105e7a3c72e460688dbf5b2e15bbe926b44904b738c1cb57e93efe12f1a5a29c41235a7ecccdb778bc24b18d34b0c7ea10a86424fa8453a5b7790fcc169d5b148274d5c2e0795b7dcf7bc02000000000000000000000000d0f083c4f73e5d7540406c3a1e53e6e9b28230f6a2f7fa220a954d87ca72186dd61b5be9cf43d6adf294e320ebe2d372260f2bb203d120e3225e03d1ed2e44130c0c377f3f2dc6e8608bce8a6c968d902074b6de6c871867a0766122d20398b3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c7a5242a5e03a640f0c0612f953f5bd1ecfa2686870475fb5682bb42357f15a66c08b1663e32fbac983a9175d619fe222337ed42abb3876918db10d1ec52dece540e4bbf39d23b4e49425d342dc3e0f582410afc0da5d0b5efbc2e789c9e0fd8f5b9498011ef1c171cfbcb17ec901abd3ffd241e94b16f6214589221b7eb95f023005de800eac6769ba878a1169e185d06155269208b2a5ae535140363050244a022a0e27549ca4d189be595450bd2af823d2a22b4768822bc7d10651b33ceca5740a08d45fe935ed5d6a9d8fb443eeb1a2705031029c4517cc90cebdab1a1143f2622a35789de03e70fe8191c43c44517babb842b51c80200e3292c45ea421fd688c031518945291298f998a5015b38a535efc2a603c0fbbefcd54befded316c7be79202195c53a10c89164cbafa355f8593174999cf2d3f71954f77fae257ad180140390220e7f875b60cf588cf937c053c5ec605715a7c7af96c412e0da8f3b7d62ac213022db6e99abefe20f9968f83f93708a5381a89a88e5ecc51d24c505078d791f54d032bdf0cdff5b7a2205d44456fb118b7ad92e5315969630b874b4a630711357ee8330078b9213229c6f332ebe6ff5811a1ad83ea6708675ce2e07d6adb471f95ec6aafd7cce7ee5f0135ad7af16535d6132e9f3484e1580d39281fde308b6f212a1d44257d621335fee2cc10ef46caef70afeff74dba6b7bf322e6e237a40393ad9b244e06d998de52e8699290ac56aafd8f9a2732fbaee9d683dcbb1b8fd007b31ec28587d2f008944c94a91e2b279d914b5a78df87f0d1f40d8f21011c039e17b6836e967cb13b03231829f3dc55bfe1dce546d4fb9350332458755aa4d3c2b3c880da8cc9f106a378b4660fc8c7ed73e3575b405c62cc9c5ab026f58c54c2a9d05444c881992366827fbff1801d1f3cf853fd04dc65dcb83ceb66dca2b4d5bc531c86782f809e15d661e5eb63b7398ac852c90ed7aa232f12a07ae32177496cf67da110d3fec898afdf950b4ecdabfccde4e2db4faeb4c2110e7117c25ea0fe019b7115dd88bdb39114631b171c73ad4f8cd2eef43dc90c7c9f51af30cd677512caac5fca1b90a26f06986701a887509a2f90001ca89a1cc9a3bd703803f5aae01cecda798df51a017c7e8f0b96f38837d7af60f4b78b7d4264c6793b108372b552a6492c8fb7771dac915ecec23bdb48e04d9947f9578687e8b173c42bb92957b102618fc57ade8f5ce040d5d6fb8d657312d1618331c20ad2013f7e1203af9588ef685ea87ead617ae6f579a3f8deac70d21b5c2f6ed8949bb9fb3a35f68c158378fe3cfd31fc634ac9da1ff03fe2660b0867ed3d7050213348519c6eaa6e957f30e785e206115ad183ed4a991061a7bec9c22323efd555fe6e2588c1b1bbc791521d029a82b8a144000ef281ce07b68a99d78463a972651917c306e969bccbe17d05aecaac33e8992b1141056d30a550a9d75f70fdf43897d7db93ae7cb3e196364b17fdffcae4925c945d420f659b6cce195fc8850a10b6b76472adf763b1821bf5ce325535de157b07b4766890662bbccaf4bf8117ae5f07b0441c24c4a98e32d7154e893df1811b61c07cb2a59e420b217f588dba343cf04414873228a126c03ac33f0311fafa25f5b1e02322541562e627498e7b1b8868e2099e7326a56edc2390fd06ffb7ecbb13f5764744542fa2d90d51fbc2c6de69f126ee1b680552c5adedec229c036775326b3c3c20b02e53064bc06a2a2efb46ecda7840c6bf70165c86164bfa32f75bdb7efa7c4a3aab70a335bb405014e8c51469d0b07be127027ef616f8b71510a2831770406965e269def879ddafaa25fec05ee76249976a28ab75cf2b455940c19eebbe6d4204226aa6e371f7264db0652e611f1f35d9f3cfcc861fad88b840ff4c1bd70ef17f43c5a4ee1b0a3f26e8f6cad751f68afdc814a8ebc04848901ebbc4270ae5b95a1c3d21773fe6f38bec683f3809e90cdd594fc03918213cfbe165d9ad714ef18e8c13866e95e7f8560529ef2fcdffa3a17c8ec34e11b157e4b02a8944a03899674ccbdfcf135dae6a312faf1223e12f9a052b5cbc34c58f067dfe6435c39a48cf428e4bf386929228528e94023603bbb112026f3970de540fded66d3c50ddfb609b6896a52d3ad5cd9289f2e59298e62fa721099940dab6a4c882c6a4354836e33d9c136ca38574ffd4e4b2ed46598a4a4a10d5fba60c99c3fb915876b55f10dbcfd3167f738b74ead2d5e78b2c917de0f437c884f53d81a6e7709e943fefd3bf41ab4d4a040000000000000000000000006dc9a86f33904c8a5462b0f0d1f8014d11aac6d3c4cee9baf09322b014d9939b8e6cf57ecfc6abaca82a68dd3e5fec1974740b643245bf1016100e22852f730afdfacaeab9b17ca48905f6f32bc16acca1a1756a68bb84969da2f8fc1f3cc00c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000031bef49611509ddae1aa97b23e1751ed787db578a9e152f143e71244c4ddd40f252f1194d922e2e79c5be70f7f266dc23a06cccd3c7c8052f6636048d67f6cd0050afda73341116feb8ad1fd6e7613613be94e553a2f0fcdd98bfaacf087fd337ba6809e93d91f6256d4e5a60dc1da86f18eae69d02448eea8f91d0c03f3fe1a0305aa0fb243ac1938e72d1bdf89652b8e46b699f9d0812820419aa86eb7c4a691031d1606de644a882db29250b829a050239315241b1178433a98b4f4bd9d139f1e0b086904e1f692f81d0fa67ab673672dd2c085b43902de7a6a492bd1872acad0a4f193abb9f1ab7c89d134f583c2d41476eb6cb2adf00f2f6ce361a97ee34b80b20202e5730f1d9279dd84846136056a100588dfc71245b6754bf76d7ee51216e237020760b4cbbb5eae6dc4a794d5170e49275b1a6c941065cf0b2e5263622975593d021cba5a35f00263a6e3d6a4d9758c58de29897295806a5db93f8a7afb7bee30b6031ce94ee9fb193164feee4ab553ab51867ceb1f92413be04a5c7f4a5ab8ad1dce030cbe2bfbc2180ef986d24cd79ca84a1f03f52ff5e7c5130362fddd4608689234da8d1d054fedc06e30a02b4e165d1e1e56afdda98a62bbeae494bb5fee4ed1577022ce32b96467c8946695b2662633101021ff08f13da33ebf812a122995466e68f2819937ba34a532d37ac3684584135331aa222660e932380458cb658aaa10d4c4deb24e2196dfe70a89097a6a2edb70d83f3423924eeab17debc1edea91fc99cd2c33537b06f732f99b5ceb8970d52b2436ef4d8cf2a71f5346f87d73edce1e98685cba1ecb2269f76ff2a1aae3ba52683905bfc904502e91c97c9386cc47946b5c8dd0d1ae1c16b7ccab8ba5bf528c22ae03e6d161be00ae9dfcd020f04d40ea09e4db84b82399786af11c7cfcf533966f1cf38469ccc122eb9aee46baceb7fdedf5f81884bd2399c5c21824711bf63c8d7abe1cfdb8f5c9d056f3f1e7e22d61b8a5e366b31432d7eb07e4ad1f8d449d6233922b054ce979ee939fb076ed50f4d30f3831ec8faa89a8927e2aeb59f44e7ec8c4c5362276e6daf7e58af3f206ce1a5abe0be85f0da1d2a431bcbab12cbe4409a5c21a3cd424cb6f5b0e726cb342f9ca721cabaa8617689aa178a49e915652fffae4c2c7714de54243bdb531906b3a3caaf23177d58f676a97a2f375ebcf0253a3baa405dba02834710f6024113acb55c0e727432d4ad1a8c68faeb35ed999d9c54c208efac706423c38f3402fad153743da2f6e5d8463d1a2eea0eb9a52688ac8be81d4fdceb2debf04e84a2accbeffb0558e8ce9c71546008125b08eb647f790f9cba525d981f18d56ea57f2c7ce88ea875f4e461733df289247b268d4b21487779d753e93829dfb3c6a870f89925aa037f97e89d8734f4e7cf07bf6286eb916f7108bca762746f4d7180643c6077dc16ca0789eb507f40a05f4e447c3f105ea318e67e83856e4bd39f99ae993763e19301cae3c18ebbd96ab74b534c7dcdac8378b10cae7f616ee43b20bb190b79129683981576c7ef459c65ec55148f2ecc088cfd67eb6aea5027bba41360244c840e429366c1375cebd46ca399ff4befc3800a9e01a721f2c6495453479ef336aa6fb35615d0064a202883fe2e24f9409ecae30453ceaac51421ad0402c32fa97da0634829ef28c6c043fa99d18214c240b4e64f1365035808bd8a9ed8b08fa4aba63cccca14707c49d0aa32b5a43eebf2843b5fd7ac6ee681bb8059975c04faf4aa40f8aec8f9017830e26e88ae11508213d867887b4aa5caf34795ab4d4edc6bd3ebe51d1d8bbef833af85339cfd82850d70bc4869a5be1a5ecffaa5774aea5621cf36e01e90fedf067dc030bc3fcb6a72b5a4666123b7541fc8a6da2b8fb8bcbe649a261bc6d8c6272a1bde477c85106a9d367a249dd1d482a73b930d56a9916d63f988f9ad1661dcf52f4686a6a1f881a119b7ca988b58af8148f0849e88f2f3d2b369a877cf17529c06764d48c58abaa7e8ff5ea04448f601f43fde9256e2e99616ffeead0a80a25cf2a5960fd40ffe255378a8aabbf4abfc2f938371d23514fc44c519168455cfbe4a542b669578f5220025a657ded426d7717b2c123d86264c5a768f79d6e1fe590832a1e128d5c134cc849375e525dd0c1f92e1d855fac0ac00352a60fbe1659ccdfcec4f6ec205bf6695e77a220860e6677e4e9c0a52d0d68b5a5b967140ce094cba0b4b5a08c34fe0daa8dd81d2af78fb0de67d7cb88db1c86056b5d81039a978563d2d974efa52f4dd3c84e00d3a6f60871d8e939b62473ee8206b736f72ae9414ca5fd562ed98720c4bee4800850e63bbe804e8804c333e51c029a77c3cda38bc5863a3229f85e0047d759bdf455ceb623297c32c776fbacb649c8f256c3890cff09", "00536a516363ac6a51", 1, -2078962437, 1537743641, "3a8d045e91cb9fc9b33823224c54d3821c48d917b8d1cd6fdbbf7a96635c4f77"], - ["030000807082c40302b72e8d804f8a5b58ae72b11770ccd78999a671220c2b06303b3a021efff8a15c0300000007ac6a63ac005252312be3e2db995defcfcb9f872e688ff96dd004b4f8a338d0db6b587f9a56fa81b376b75300000000076a6a516a51ac65ffffffff04d4fd4f000000000005ac6a5353006ef2c30400000000060065ac51515366dd8b020000000005536353636520009d05000000000000000000d455ca890200000000000000004a6f6f0000000000ac072ac361d3abd832a86c7121e6d13577a68bb6a18e260efdd07b5a262d1da26bc5ca1ed2c03e69508e54eb2d6abc16feff4dfb0b110bf1c60052e395776af178c2c588c65053db0841332e287c9196a91da8e03036000389a59ffb03f846890000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033a9bb35c856077b9292e1f4f1aff046a574546a0489b1be1ebea0905dc3d4d7eb62782417abee08117aff94abe12c9a71884c218662262342ce377266696f0683c332fb6c8652b23fbfe858eca46b146dab01442db2c21287fd7d39ffb75e1ad5c8c09d124ae0387e911e3b37f54ab456dea0bccdb2313f8b84be84776c5a170321eebb273c836162dc88591fbb2729f919892d92738b5dc6bd160e2b9e4f0e38032ae12c00fa65b13e183944cf1a40472e475700a37a8c8759049f7ad2ee376dfa0b09183c4a7f94580f1cf85c310a9daf934751c68f14d05d3c4384b96561a7cae96f0a1ef7b90bf396b6ef72433180c3133f55dded92a06943e25107e54f48ca8b021b2c501ea2e357ddde1fbdf354d63a50c0ab34e5dc4b8e967336ceb753b445570324e9428f758792db39a8807dd9e232e167d11d9bc4c78b4df564e6bf2bc62cd5022c4247affa8eb56b53be5ecca6ef6f5a5355177481f11b6ddb1c211388c5e85703137dfd46ef7f84658a5674b4204dfb1d4127eb91ab064bdcb009b96ade9489b0031e100ca18dfd15900764507645aa38822d79109e85c167e6b822e05385cb3bc0692ea2671a1f98f5cb03fca0422cf6a2025161ea443db658c858269e5ae97310aba4ee97406ae98bbc3e20a4910038f608754e2219dfd55d2a547f0d6dbabcf883095df095c7f5e12980263e8b1d8c8415ddb9cae9a765cc2812d966de941b049a1e94b3d1dac79136f1282e2426ea789deb667148b945e3281102737ae3b789a2d56d12ccaac387116e11b2bafb8f37c479c7b9570a3b9107a31a072975439967084c4cf037cc0215fbd1ccccf0e883606561cc5c3efbc5d74f08c20290659f8da8a88088f88d899f1e7375a5e750ece8c5cbd6cf84f33eec1bc2a98448aa6910397ac8f1b2fecd05717afd6bf7f60932daa10a9d0ce4068e426fb417863541aba1db1115c1f23396f2715ae824bacc889eefb51661c0534f8d3155fc01fe193dfaf841c9c90a887b16569f2c90e30249e16f7d984de1c188e26c21c832c5d04e0826c8fc65504b87c0f712776baf6498c6fcd3964fd4d3ad62d90cc8445395c57c1083065c29e2a674e6335c2aafd3e59ac168f47b3b260f5fad9673845409957983b705edb3215d61f641648ba401085fe329445023a69c3a2e67a07a8e94b590c4e3ec240520cc3d9f63271f6314284e71fdb14b11e4d8b29d9407967f268f8b85333f26ad8bd37f198c2155471d1fc65dfdd914d91221ffaf0e0730e8e1b890d99000c1027e22f1d4c6f2dcee44d68134a1952684c1ce6d72673694f20747298bcc490f785958095e41e2b4c9206dca7233ada9378acb60624c393001deb9845dc2f227bd44543269258f241836c3f4342c2170ef2d9f6a5c96ca458a93da4c553664ce59371fdcefc4899a88516c41706c98469dd848c381b738ac4e09dc7d6e3aae952296b19afd172575de546a757e8a87f27997a05b79b156ada2625a7ce6fcb0e9c063dc357f7a17be0263ae14d5c2303559c98343193823f5b9febeb08cd33a39d45facb9d04d6f2ccafb6b36a93f34390652d3d60228d4b36320b1f9ebda3c90f6332910bfb986736e15341b74701b0491ba90d8c8f5768b6995925bf6e34f4e96e3b9b1f40d5e02b8eb6a1602b301c95625e0f9f82eb6f870938c7ddad1f2528509b036f2ad31ddfc6b63393814813f717d79a5c13d03605d48b88b826e5f438a56b0b37502bc392da5f435295d76a27837f0baa764866b14d764d4bc3c99719100001b61c0e3625e13288594e51af8630b77cb583b5d3a7e1c36e6f7c3318cff291f347850e5361e8512f3d5239744b6b3426ac2b9a1290c45b1b0bbb10faf51e3bc8d4aa93f6371a0065a6c01c42fc760e89c8ab2fdb6a5ff4fc71c396177cf175decbd8b1457b9ca3db23e393d951452cc71cc771430a7d271bac6dc75a024c6abbf1529302246b08f25ada9cbce203397607a9aaf525218e655269f19192f8be48ec169dc67750efa52709fac4527e84305d01ecdf7cb6842b4a0c091be4bb4144fb71c019204de9833df22e1c33102088ae5bd73992945dd473696539cc3283c091055029d5bd80ba8c332f7b2b545c955e01b6589b01c98631342d6cca25f0acaafcbbbdae9cdb438cd364cd673689a4d250ba4ea8e6f53a32258e0bea45c71f3fa48747a47d2efef0893280e100431a197df10dd1818e27a82123726bf3decd10ed26a5582c1b66004bcd236c725b9de09eac85575fc7ea157805ec64c66ea401194989a66676a9100000000000000008400e10300000000eb00f7ef3704f4b9c9d2f49cc6e9435e03c5ba2b96ac85b3672be499a97572700d868f3aedc08fbaf26a5b1b086aa723871f7aa58976e423c3c33377b76f79bb576fc0c865b1a81510d682f29ce2ddbfcbc37d97cd720fae0fa6e8563f92b2bc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f82167c5be495a1e6234269399670f0882706cc06ef4137804acfc2ac11eda4d644d20bf1459e95c215b8bf56a12a77a0a29d7524c3cdddfd88fc82d163ac7c635bdd55d095f816ef266206b60cafb5bde560d1faa364d751ce2b0b5cb1997a0f1ce01a43193a1b5531decf2ece1a5f950a4a4f0f6299f56ddd2063ceafb75a0021531045e93b12005651b19eb5dc21ac595553327b43a825672a76a20bb269a51020d6db89f21f8261a606bce7aa052c6b167e2c315178586d09403c128bdd19bf00b08edea0dd3b304b6a16efff1f398d736b5745d8994e50f69b79aad2ccd7d0cd5dc32cf10364dc6e430f375bf820c4c4eef0917fe7c40b82e1fcff850a660294c021e1a3db2c4764c4fd0839fcb8399a79ba417640cffdec2b8456b2588b4427be102160db5ae4bf76349ae01ec892897498e6e461a46b6ee2343f78cbf8d68e446da030addd6373dedc374ba938665e81f21e7785289ffcfb6d1b9d5c8047fe98f626f032981b76eec40b43b1c76394e6a74426c8ee4b8b9df87b560c3a658c43bc77e18031502277760886940765ffa8c2d2373b0a8a663e46cec905a3cd84424e8436d3a4e6807dfe2ba0cb6a3d1d70bd51f6cd58801432b07c8548a47ccfdf05b5c8ae3f64f0c3f227cf3d33904f6ed560e0c3637e72f8ee2e66224f6f1a6002a1c5f0186be966e007f7106e76e27251d94fdbf2b5092560deca1bed05956f462457b2ed51df3bef9fba621dbc3e41031ae8665fad7b85e72dbe65ea80dc955721ce75cab1b4e996b6f79aa9d775fd6b4594838109cdcdf68e90cad6073d93af1baf1bdb4d0bc887a027a8fcee3e0ff7c592128dec5647532bbb9cf9bc57b670f86d8a7db16a76b0eb24bd144e3aad8bbf1a15202b5d26d60a4302f0758797f423f0e7ae337b613a023039adf37f21984fc285c35d94969af3e61cfa1c165c021c71ff601788ba6dc3a370f9bbcfef07bfe166a74b567812b4b8bed740cb222204b49c2ddf45301395f5087690f8215cfa4f203c4f145c62c3dcf3983830ce02aba1c80628091284675c62ea06d163e0ded20180d64028d2a6abfe01b7c50663f67233c70341726c1689240466c26bb9a1a03e7ffbd23a87d6c2b9f4e941d8fb954e5f7937b617f6c2d7631c0bf61873a6783933b5597cd5eda6455c225a5a96061563e3f930722ee722b4cf43a508b0392b7802542c364f882a1f02481a7c4180b4273ee0b46e9311aac218fae769345e7ee564afa25fd03dcf2c2224280e0ddfaacf7781286ca0225bc87f966cdf02212805ed98a7bee8766e0f5a5bed3ef8fc3dcf611158b6b5c0bbdb2387e1fa8e310251a7553849b7083a2337309ad0626858acee3c6c885cab5941f1cd0de3edd8f15de2656d1dd27c0ffe9531e87504752d151bb47b04bca1e9ef2bbdb6f7a13d56f77d24f9a7fe060ba82c3099e61da4130ed085effc11b2c71a4049c9e286ee918d930a9d9aad18176e98fd886c2a668e38355d1acd91729ea68982aae7a4d75d58856e314c383abcfbcc5a3777fb41cc5de3a301e294c1359325e045a13d3f2eba1bd1669c9ddd5aafed113c44382dab9f6b6a5fe761a3d115368e3e7861dc9ded79524652e6b8adbc671d946e367158865c8278d24b052908a9310cb91ed6068d743c1ae87bc5aff127e62998477e8f8c5e26246e0c9457abb1b8d52bdaf30bda7b9ffe4dcb1714c9e3797e83f78943d390a0bb49e0948bee8d47284631a8d4aa9fc628d4e2654a9861e765fe875ff498e4c150424d69a3384f4edcec84293f2ad7f28befd69b9dbf30fd3f1c288dca0dfd0fb93871822e238e7e5aff9f510013c7e16ca5cd1ac9fac0505b134a44f41a19b13ad620e996c1c292cb85e8b293455bedd3960dcc665ef76121db41bc8c9a2c43957aa671db2307761a4f56640129637c8454f7f3053674dab4d7556e6805afd5a078fef309d3a4e3da96d7a69205499f39d5c4fd5682fa448a53d5d3a6f3593cd37a4c4d5024f8def8d2ad5db0a1e9ad345e257e90aadf11cc0689880d3ca93c245e22469b33ef6a4cc500ee6e0741c9ec2f85db55a16c51dcbf34e3c575201ea80b875c222c57f21f2eed8f218c337c0ef1f740395d0c957b171b9f8d77f2a6eb2c671244f9ef1e0fc752481094ef7ed48c949831ae2b31deba6a964cfbdd7cb8eb34f2a7caac178adafeee9d75d651250a83052fe422e3b3dbf601bb2527b27ad796fe02935fc2a5650533247e05fdf354ba1a28bb6631b95d31bf6b79a8640c58f4f6a270055d165a948785bc48fddbd9c0746ac155e7cffd3863d0ec1845027af220ea1bb7d8778e825977d2f41c765cedae69951f782aeac47610adde481b07470129a814fcab6746f1ce747e84fa57b957f13587112a013a0a046399d02b6509a954439de0ad9dc8a1fd582af00", "635100", 0, -318154590, 1537743641, "c1530ea24b727a781faa557d1f90df3dcaa5870ee42516341b59f16dbbe390d9"], - ["e11c4338033082f7c3c37c6e0d039ed4425a17bcfd1f3fb325fccea266df90dcee3baff9e5030000000751656a005165acfffffffffd9307f07132e99429f63eef27bef289267aabdb39742ce5def83e626f6bddae020000000451ac0052ffffffff5733260faf967084ca03dfc59bae9f4d8d5182f31bd767ef7f6bc4f9bd3d731c0000000005ac63005263ffffffff01ff1073020000000007006a63ac6300ac67e43a34010000000000000000af79390100000000e279ae93a2a9e17276d02b1f4f46040a701fc9de9e63da54455ae85095b8e432998cd1be740b1d90d913f35a6dc950763304e45e23c0b603859e674fd9bac5e2f997d2a13e3f516e096b66d40500f4d644a8f3f41ec4325abf99eac5c9c253300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069c1fd0136b5ec71d34e80be9e83b58030f199cebace1342da5fe53cd53886546138b9722f4d84c394351e7dbe21a4241851b06f752b36744e29ad4449d7a3bba9b3c0b2cac4913219a169263a59bbb973f615cf884ec2db943cf312fb030c9bb175a533e72e7e211749d62ede8547175cd1bf10c10be398136c3b3aed86cbff0203d0f5e4bb9582d2632741a7db85d522f766381d4738b9197d238f847d389839020637bd9763b65e8cd2eaa2cc763fd7c2686988846c5cadc52cc8ee008abfb74a0b04f5ca553f49b73a0e6bb81b14afb79414e22d5e87e5750f8bd8ac31eb4b992e520f181d0faea706c94006162430fe1d809370c4aa90f7193783f6aa3094aaa6022c8ece28dbf58af1ae98c496d50f9d71fdd760cfbd63c0445892a96f5853e728031ebb85c7e736b541dea920b36322772797d2e5bdc03ad4c328f7aa7330e2e9bf02104c2a1b08b3d3b6aed1c05f51160a89b6c3ad66027be9e6f25626cfbdfd0185021fb56bbf5c6247ec2a08c05962ec73768b21522ebdf95c0dd1189633d2628d21021ecf6efa6d1c4598d7739c72f5925a16b0c7e51532e5d2d7f98387b91d0ab6eaf1d9b617823b7af03f1714c7f62f94fc1d706d860b8a48372d604bd75e66bf974835b3099ca188b1901444c609c37c39041a95d594e8f875c70db5256d7e305ec4699ef53d2d246e84784c9071373c7589b6fcfd57cf3df3c5ecc87d0e1fa3b77b5ff55e0e9485d3eb3dad6727ca181074c4bbad7ef21147881ce6f278640139097e5de7e943fa374867b51108dd8f10bc07d12e02f9f20210b6045b0b865e09477fbf385d3309a56d1dcd4e6f83825f0f9ff9e7baaa3425bc7abb12998a0d8055d113f0ce3b6c68af2a6db65a47349d77a87621834f316ab8706f61bbe250bbde80277f36a9030a42c89a0e88075c9c5031f63e04134c55009114210473c0ada5a627774b42ed07e294649dc300d0da0798f8de166ac7ef2c2662917095e1445f73c4b0fc49918e34485669cc779bd38df20dca41f849aef8f73b574232f0ca674e6c81d4f936465297749f9b962c41f6ef9dea3123a13aa611644b7749afc82bda324311fd5a1138800d7f3facad37c328654026a9c1d2aaebea470ccccd2abf5149de2267504bcfd6362a2cfe4e532a7f660dbe2d9d8afb230bdf88e696a4865ad6447fb63eb4fce8d9c5c528e00c78b63f20fb765ec3fa624d1806f902da227e5b30aad635dbb822bc3628874c979ce39746c1e3497de88d29ec02941caa780a153126cecfa1481858efb001cc8700287fff149fa6ba7b4c4e17c2d8b6035d9aa0fd48feed1b3e65202c15645845d99747599719c8fdbf9319fd0c31d1bdf18455e5801d15d5723bbede556417d41fd43ac013eb7f66926d3dfb3f57c126c8e0e77d18d439d9d81cd6eccb453f4ef45975e2c623bbb63c4e7618896ab116397e0d0cdf92b406b07bb79d354e9a7dd8e8e99fe05d0adef90fdcc52889596bcb02c0ea80eef9ff8192b63502857d6d1f8d00a094525bb345a59cd4d550104c9168eabc562bb8a90a5f733d23fd3fc832d642cd36ef7c3fd176d8fc1bbe62ebf598e3fa4981705a7378ee8e021848661543259fc25d6d2b41cd373565148d07f1f9e9835bdf6178370b2b2f8fe2ee84575aaeca6c65e4ad4bbd48e5c9531dfb39890d6c0dfee89df710a0543bc11bc5d0966b86eb2c03faa8d0d8747e39890fcfd01e3b68fded2015a87ad238da4346b3a2eec1ad1a58121cf3708add04f2e43f00c822eda713db4d54d59e1cab92ee079035ec486f626a1470160da80e7f9dc76b4fdc28b6622942582445e148d17421bd5f86f4a9b5ab7ccf98acb58adfe8ba678791f304f24dede1a22d907d333c9ee9635f962b26aee92dd59a7e10b22c3247f24c022894e0efd82a7ca8b401f5c09c45c68bae4a6b86664f716d955aac6fb54f03e50020131fa1240bf33c19a7a2210d4aaa7ab8ad291390efff9e754011ad9467298a190717d839f3029384be0f0f337a2ee4c1faadb03498dcc2b49908bb812dc09e3540377e9f31200f774a964e1b9ddcb812f22b481f9418d1f9b44c96a1507c88458b6910ac6a765d325eec8c53d641c1601e9dfa205881d283c57a1d4406b08dbc81f5170e8536c7dae59106ffc0850390f558822066976a2e81bbbcdc9e99ae03e8691cdeef3901f31d32cdd57a1abd32fa479cb77bf875e59543d93f1bdf7f54a87b317fda1197a3dc6e7f59ba20f6704a07fc12b354c4acef244028979839f7492609d9afd82736df708b233741d7d200bbb07b4a58a47007fe0256387b9c106248391de9bc08414f2ca1daeb3dc593f85ba1ef6b38545a8be529fc4c52a487d3cb34f82b6e14ad6a04be27c536a778c53655a9fccf0f2d3d47a19c35c911fa3447f5f7e02bc4bf610c03", "51ac6a63ac656353", 1, 1730395550, 0, "6ab3682fbfe8bdde8c71857b5aade6e54c8fe8c40ba4d2088948f4da76015000"], - ["6846cb5401649a2c2dca02bf56e22b44675c7eb955e61a6bc815e265fdff7923474e7d8e1101000000076a5163ac516a00ffffffff0322932b050000000000f0803302000000000163e9af480500000000035165537a1b130903f3c2b90000000000000000000000000070f09a9fc08d74ad637a42233d43f66fe4a3c5d61f37d438d1ad66a38e48910ca1a430f2edc755f61b85f95c36b95ca2f80a5ae1cddc31da0c5361b57c11937379bf93ab68c2bf624068e313445a5edf4f6c01874191f1892b5c467e2eec5bd90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000067f6fdbfd6244b0273b258470cfba06973a46abe7d9ca3711cf89f40ddf808b466f8a830142ceb3a35a80c35cbd7b7c771944e861bbe569fef35f596401019f1cd81fa9e17aaf3bf9687a13155b055ec4ce48d3b2e665faa15bbb553de5009797e12b28876c8619359cea9dad9fb1a4b6e158fe819660a9f4101a3c93617290a0323007af32685702b885bb69566572d75a1998ae92f8bc7eb69d72889e09aca80031553804ba667210882f0e6e7402971782fc9fd2893daca90f27a06b174bd196c0a01b438196562968433e1eab47188f1fbc1911050b983e65caafc82947ca83cdece5d1dbce0558c6597bcafc9db15499641f20818f3d48f2e618755cb792793ba021be357ca56581c881e5cfeeb34bc6ad303afabd75737e6292f9b6a95f791301602256068edba4b83ae1e8cba25f123ce484046be259afa70446e444c726b0b6ee30328826d541d999738ea125de217a83290e7430b02e28dbc8238d5c323e015c7150216d2a4f33a2d3e7165874ff7f2c4279b281badf4e6253c2bd6b24d8993c42a400225e040804129c5b4af5c075842a1b46b8c7a693998821fb66883e632fdc507bfac49a2497cdd93c2cc6290c0a9d272a19cf07ceaef01c02defcde2f152be93ecd3ad07e2a1439047a70d05513e4ab906b6486788b3583b5c6046e1613beb50677b3d514436e7f4855de0e61c900e984acd5c862fc78ee827c6c68aa9df87a31108bca9136566e0aa79d538cc2a0ce478c44a1ab58cdad5944d5ca4c188894db986b156fb35501135beba117da7848f78e6ce159ca789a3ff4e37e49b4a03ae92adb1cab0b47f981225fe78b8980616ed7c2beaadff5adcb5caefec6e4af862604644eea9ced16bee0e60fb4e739a1116d8606ce02836a9219ed0b324f78094ef9afa0fc897e1422c743c1fe35bf2d75a13f842efce2565235f4aa1630e335524ee3a73455f15b379efff2afcf322527a0ad08870153529a4036a6a24f7ceefb4c26da886ee232990b1d5bb7d2e1fb44b2a2652668b3a603eae186943ddac07f63c0df27fca6923df6ad10b686ba391b74cf9fb6c82cb0759c9b7d97efba39ba829f9e7c8b3e9942a97181f08233ef00e9d45ea195308c80339f7395afda8da4de418fd548c4c38629a913147a1bdc9fa4dbbcf2a963a75d920772868efb851ad82c48bc332bdaf8c0db6cda7806290be6b547c996857f876b6650b5e7404f30d2497e14555b2b9cb87ac7a423e54fc623c98f2ef3d07f20442babe4138f9c635850258ac83e964840f495479c77c125a2a60083b4126320f69f16fb1b07d3134394df1d8197daf979d55619b99435531867d732dea13e6981e75610b48ffd4afff3e39067c800f2e8833b052fba0cfe742e5e79a031b2c9142bdd83bf1309de41e02e97fbfc2e59265016353ba98e7ad708756fd834cfa2e450075d909af1a59ab79d5b8cda104f06c2f450d771e8a06ac0263c3069512e9d2c9967cfd50ab56e8e656ba2d281e80dc938b088c656e8320cf6c95d22a11390ab4c9cf63bfd2dd0010ee817aaaa4ed7a6894b8e5e5ac5aa4467ce4ccbe35c94d7d6d4efdd1842486fcce3cc50b8f91508df3d322a2be0e1e05e05a1041ab44b0c9f3c6747b5328e36fada9d9f4d5d2adda73102c0d8b66f95e1ad750c652e69bedac8a217ac87ae8edc70b1917f3c2805cdfd489cdc196a14a7e49a8fb15a6b24c29744ae0a8153baa5dd10a162e79d84fc76b0ea908f74e19e90ae5e2674d311b5ae709c0cbbbad829d2b25262854fc73307d255070a1e4a9de2ff1ab21e1d7c7765ad59e94c84a8548474ac2fa19a6287b20fdf7df7224caad0aafd405c0f18cb9e67f7714cac1efc096676e329255badf334f429885438798d8b0f284729ed1da6e9ad1a7cd0bed5ce8114c17be95e04d5561ad234508265f2c3096ef12a0a4d35f0ec5157fdf43fa050da09c2d5ea7deec8e365be52ede0be9e9da2593a3bec2f521b3aaaa9ae794a9ac3552982096f3f93a11df83894d5520c62182404bc0df00970b4edb5b61eef6d3381bc9bf73522c02defb8e51e186e537c0b409631a0dad763f615fadd4ad0aefa57771cabbe9a5bf2f4905ebbf4e4f4f683aa6e9828fd540cad28d0301e2534abf3c9cfd634d85be5f1170bf3c42399595f7a7016af3b1db17f403e7d822fa93b620e0169d7524f6f1ae59ce9d7745ae129d4e747740c4aeda101aebbc80e6cde72967fdbbac8a4dc3cfc4d4e4a3ea57ac4b3e4d7328750edbc9081000265ec1d796ae4b8ec61b3e861ccc9c6000000000000000006e66ff0200000000262e8a65f97c9d817182529f14b9ea47d2b131987a5869ea4067dbaf7dc4ef48126b8456b2a415049381f7daabddf46e1614bf4438f28ff28a3ead987dde1de3e455a81481058fb1b40076941f271958b3701a4a7cb670c28871523f7da81b7c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aff329f11b263bf4348097e97c29d66b25cf45be2798ea247b6295d46c1ba6da0bf05dd5b72bec9a64a4ffdfee4e8317a0681696d2209a1093f6f0a0d5c96164efdfafc31c0ecfff02e3dd3cf7cd47aff04fa63c8d7354887672606aed2e3c93388643ef34ba4df4f10e013a2524a8976d079a49e26ceed79db22f81c56b3a0e0305ecbb636ebe52943adf31a776b3b124c1dcb658b1c1c03e6bc3a3b05d42a0fc022beef268e82aad42ea80411562964720dc2b28498de5411a7b4d75a15b5e2ab00b067496e6ce62a321c9bd0f1e444c0648039477129166e076d4090db4726625f01502ffddb893cf9070579d74eb3c9ba07b896880b42d139dfa268209e9c7303b031cb1de1531db63a042b61163594e4976a5a6434df03b775b52272c84dd4bba0a0202023610df54ca283a2ffc1ab7382c2e4df4038759eeab6c120c689820ee21ca031800d5a5bcabb95d9a4cdfe4834a69c3856b2a6f268063a705c398625df539bc022bffaa3095e4e124720b9d12c2b5035aa51fb9546ecf5d12a22a44151bad81380226574e70597a52ce95f370bfa90deb61a74c06433c27f289b9079f0de0be8f7d016dbf732852061ad53a8eead976f58a9f60ad4ec91dda886826b3152b7bee82bbaf9a42a4c27148e507ba070b1d2e3dbe4627c39579781341a9fd8e3db81e2da3ac5508181ed4ab243c03bfff5b88ac4d25e03417b6339812a66e627e9f683cf40ed48b96bec7e52aa2b5462230c99a66dd6b20744c2cfe856903a0560d4f95f5581955e1ce303fb9d5a1f65fc261279a88b6668e7fb4025ab96cc43383938c027e616c5becdf0f25b309ab5e659ecdd625b42ed5a5254c7b6f5b9da7723d2037cb6cb121fecb3be6182ed84f586840ab82483905c93de741ae7399be9b84f7ad3a76a52d4ed7f2512ad4006fb359bb8941cde319474d5f6a18397565111fece0b544efd4d1b2a24975e72b8fd6f726d79903dbb7e0afddddeb56b90762349177305a9edf17cc69d421b66f61c49866ee71599c4f8788da6b14b2f05b7b55128105d1bbc97fce3ce1baf146fd7f6b1698e4a4ba1caafd7b8a1bf59259c575af6d34a9806dfe801ac85b99e8f5ffeb806ca1ce043e096a4dd696f31749edbd9472ba2446babcd749147cda8ff9cbae5c22ab9458d0bc9767ae69a180561763529c6fca6e3a7209a15e472df8620e2b4d301f46ebc5752c41b949ddd1b81d52d639361591783838fbcb62c14bab27ca58186dbb4b2b5b9d47fe3b6c1369718b08c89d23d6bbf4bc8aedc96154568356c9c7052fb2986bf426c74e93afc5594797e9d20fcfaaaebfd0b012394bc016c6c28012348686f07463eb736de844c18907ce0462a00e52fb44d5c7c4a94ffd879ffbecb19d8f44cbccdf83483030207e8c5e85a373b99be0cc3335780bcb223f94f5f056662260a3ab29dac90e2f32a5fc148ffb7083c85915d290ae623f2eb22ac558309dbf221a69e29b1493453d51b40feab6b2e5f21e15df1980a5c502054f57f389090a96370de3d439ed26705ef1f5e17a60e186c6d432afa1592f50ba6dc0eb98f8f155af32e94242cfe06a29087b1bed7c5b1ab4afef7bd0dce8f552adb568ad3c63d039a9810a0734db595f3dea38d674cf800bf1b030c35912a6e97f2a2d8aa6c97f12046284fcdc101795944dbb30641ac1a8ab1b8e169e2fd5342f37733bbd05f05fd81aef950028171580a1be736010abdb3858fd6b98bce766f07b51f2594f79fd8d3096725ac56ded0ad69a41962aadaebf3d84a2469bfe95ed2967d6b3e7c1e4aa6fe0b81b85484a61f5f476d6cc175cc15b34ba7c7fa8db5f1c25d957cfc611915db71cc2bab53b95760614a973a2b5d00bee3f0c6dc93bc7155fc2e833a1db97ad431f1193ab119c7bf953b0e29e7da8bf38bd783ea8a1ac0e0eec93ab9f571becc82f2185ceb1af2d105b14714d74a3f85f3bb80cb08880302e292a9df7eaf3bfb4c8c872e9506f81c1cde8682bb3e168ed62b3243fad6100e1a76527d1ad80cef97aec27273e05726701eac9d1b585b63adf3dd5e0f3a91afb8a15218a3b0357f60234a76954360785e6cb21bcac0e53cf8091cbebf0a0205e5336ea46030918a3f123240cccb67fcb811f673807b3b61ad18934e64286a4792caa96f076feb0e32e5f6f9aa721658e8fc64c24e81c8f7f8cd90f3c17664a98d1d27bcbae949e34da8c1ec384a2bd66a6e6d83d6c5d74274497bfcbe725f01fccab42bfba10fd1947dbac418e61fff13b96a235aeda12e791c9b8cc59615cd30000000000000000f94583010000000011d54cee3eab05b1e545e64e0fd5f4274251fd33a73d33f41e663138d4a07c547751c9a6d383640feff58fc81dd3f9cfbdbaed301d227c99b8bf8d2bbc5147d4e89f355cc337fd82adef94ea33f6f28672606521f91c9b8c444b9a42aa5ccdee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000956f7c61117d613f2b4481abd34410c0bf1006c32fda51df0c28fea95bbc58eb119ab51666307fdc9a2b686cef1c0812ddbcc9f70cf0e840052de66ce0bb11675d63da61fef0fed97224000271e14a01c52dbd80eeeb10d7642df70a61f69b49023e57f11b098964d29ad7410bbfe6ea9d425c4c0693cd41c504d0e9accaf5f0205647d0bee47098caf1223a8238610e2d2e8b2598ae9d0b60bdf1f25b75a595e03155483b20d6679ae1950edc15d9950cc8ab2b18ca21e13d1b98b06a74ef1faff0b02f90d88a4579769f5924f994ad31b661b6d26d0457e1877aaf5099779935c247e7909eee334a5d4e3dc31e898dd1aacc1712c2618e25154d245f327a5eedc11032f4c0e369db0a331eb967483a61ce6dea2243a6fedf3cffa8676db5f4f8b4b460227fb4a5885ae04c1e4786d999efea0c6995b9dceca813f2cd0c4b786dfc8ebd4032aa9c8e698423c42b7eaf4be44d937cae507ac77c39fe0c445f7975df96851bc02110a26b01419a8433c4ed1d37105d5862a1993076b58302f36813b68df243727030e37f29d8c588613230a0b0366c89a7efb05da57c05844741e138b52c89b5a1dcd2913c8f2b4353eabb8e84e55cbe4c28c73b8bf272a24ec288cf273db78014677d3a923681f7d6db9e15ab555ae892eb6028fb79009ae488b6dc104ab8b3d23afda4de48dfde6812ea3f0b871e0969dea408283fb6b2cd53f2b2c8e6b5b4f2016495e92ccd62901f43afac785ee489c79a5cca5380cff2d11d387914b222b16be38c17f96847c05ceaa055608cfb675b16373db742de9257159f04b66a7cffaf7f80acb02ab71782177e65b2ee67b689d69dac2020ccf4f040080d297db00e8a4f3d6e063319ac8bfcd7ab85429d13089ffbf9910491bc76bffe62bac1bc2b56de77e49a8158b2b77a930ff3311957e41cc975f8a6e88193a7c7d0a4a29a03606300bf44f5ddfa628076bb85c9123dd4c87c9ffb5477fb8cc51b822882862b829de486beb4d8504beafbbd8feaa2ef0197fde1b1c2443c2936052f213891b0e8f98070c23779bcb1f2488c69e89153e4480820033974b12342f20cd0ff078c0e3364fd107dcf94f4cc84f38b68f8b0bc6630efe334ce513b8817390d31e5dd2e060d30d049adf8c3349ecb55881861a411feaa98a189c20d08829cdf5008eb950211d1173f7679661f6b8081d048e019dbdc860ba8abeeedf51692641269243c51d167e97e60ad7644f1c98faa45f769ad53fa654c13be7ec0a684b55b09450321fbd57ca9fbb6271c9507af516e80dc36b2c205abc315f5abd59f9ce73575b0149fd40b734cb22035587585ba814def9b16c5f37c56e8935f49ca385671de56e4ec13b4d1e0bb772214437ab0d8dbc16b7965696ff1567ade2f6eb4185b4ef6ec95f571db3110b27dc5538b16c0154421ebe5500b240d0ec94922ca972053171eaa3a3970a9e5cbcc7c052ea1976b7c69ed2b939ec54338bdd6ec36b10f3cd80982438bff9d2a222fde8d9f3a3b8731a32f551a22ebc7dd51892b62d016c32b090080624dcb0cc3d0844435af1c72eba586d820af65dc86f052529c39f9662b3fc8d1a56339d4af2f987b8eec0161f7625bdd4d78af3f96dc502c13ea40ae54fcad9f824b979612b96cc41b1b98dff36de89f0b633510c8010359a4f571c35070d8a7a6ec29235ce7d5da12647671d7bbd73f5a68fb7b063cd5fd7e852f27938811bad56b2b2b9b028e47917546d38431e4f74a1cb987bbc2ed5b05a4e48dcf0656f90d68628db53fba3d984405474784c63b2821e9a14b49877d0b7a846adff6b8275bd751d6494e3ec291588166e5f86e2e4a024c56133942e4f6a0d6f226fe1cbcb5948f0dc6dd2c4deb10c2899190b0e2fb64d5760c2ef46f9a6bbea270f75941be3f3974ecdecccb1c0f2d5de294522546f1330e09749d26ecb849ddf08ce198230e54c66fe461a548e0889eb6b7dc8f1a16770c1ad8d85f37bd16f504f7627e384b77da94457889de061c80a1c297955cd330ce635a836c9dce7f56e8fc94f0c978e699649fe842e651006286e66397fc3e3b2948abf9dc64ea30f162dd467e467ba010e60489a47d409814e066ea801a8ea0adea835930136b6783bbd0b355ed26305da5b9ee0d2fdcdd0007a6955d8a994d0a94a9e33f234bae8caf27084a02d7c4ae308109a72a1e932973f0227d3f06ec1322fd9fcddc989a73c4790daef0ead994a562acb83036303040b9ccca90c622ed90c8d9875605d61190fc8cba7a0a671fbc6ddee4105e8b6cbbd1f09cc6dbc7dd020953d75426b42997f60172a023e23d556983564a6103b41b7ab80fc7c57a0cda1e54fd9a122de123b209999249c3e401742cb31127d421d4d51fd61ad9a905fb6baec9805d765118f77157248fb3a7a55370d985009e5516d0d", "", 0, -2124061690, 1537743641, "b0a2cb826ff470ab318323d8893923cd11f668c665cac189d72a140c41c45e84"], - ["030000807082c40302521fe8234fd6afba095ded5ef50674f7db4f2b67092e7c04e8d99d6131b1847700000000036a6365ffffffff987e3a6ba274d19a5b90366232564aa92fdab754104a838f5574ca40e9bcef0802000000025100e187b79903845feb030000000008acac526aac536a531386980500000000046a536353eeac3a0300000000055151ac5365f83e795e0000000002fc74560300000000000000000000000047626105db7260710929365c1327e4aa18490b32c382e525e4f3d841d18cd9fe840e92d927cf30bb5f50298eac4ae74e8ef39db3bc473ab0f06e4fdf98bcf18f3a8547ac1f5a9a1b58042e6401492235669b77b6d9563a1d5952d6884a92e90f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083786673370671dca103248a3d86fc698fde2ecb207bb203d09b6f75a06a07d1f495b07ec2a9a9cbd4033efbab8577d8b1518f233c6cd01ba96ef383bf1b93ea2738e3e7cb8f93784693fc404cfa0b65488965eaec2421902ef8e8a6a7446a0fb5cac6f59d4a3e392b2bdabdf297f52f59d10face5c526d9c164a23a4adfb3aa0305ae0b7157fc333eae618e7575812bf713e8c0c135d275b212cc0336c9972d9302182bfc1c9532e3ff367eb1c9986e993ee019d3085dbce7cccee783f3b6433d040b0699e0e799870b879efbd709e9e53cf139188d59ab6081c2c68128c2a7fc4185fd7eb91fb0143288323cc0048eb107a51075a54e22568c468c3ba1c4223c32d803051a23d187fa079fb726f34d42430407fb1237c5c53fc422b8f3e76736ba43cf022cb854bf5478367e65fba257a483939724157213f04f129103e936f00bd92c79021f624f1aa0e847f45cbc75adecb656e83e8f1f19c43bdf07fda73b524f6a2ffe02075401be8ddf0040a78d9e46abc8955ef27f0fb8bf8a1c6d9da5a7c767fd8278022cf76c96ac062a0662c78a28393775dd312261daff7761fc882c59ef8d6ea7d6727c8160fb826eea8f1af996f7a78a2b0f3709c35dd8d9fc98a9222131b779bf7147832abf6afe77006919f57eeb7d8503cc53bebc1df909d15f4d72614b9e5f3d8cde95d517e35232c5da02ebdc491c4ee7dd82ec0d437229c33824b6a66e37c4fc6ba66922eae6f22199b7da1e7817c6506a5439fc00433f53b2610f72523621fc9803326cb9da1612a6582697575eec0c3eba5f17c41241391db0acee862218c5e6d7e2fa3850b07ed3dea295359a17c7a09d19d0eb871d6693001321b0a49a276ce82470786a0ea33d33306e62b8a98515833d1a0aaa3916f9372e31ac72b6650f14149f893335e26629589e462fbea0780a12bc82def7d7f614d7ce530770dadf4c97f08c5f479ee250a4e0070b3b4769a5bf2ba96f7aa40ea94767107575d9c85c52fd5ae4d4fbca90cf0997e72822337cfddde1dc77dd8572ca1805d3263bc8cc9b7b794b673cc1f26e991881e916278463b6730693cd307b421cb6b78790ef7307563fa3845c0482acb7f8f216da7dcf2b81b6cd8121206187af2709e8ef1aec86b93a365043814a191f5cf41b3135d9add23417bda408c754f56c825d17eb06b34e88d2d183ada5e50e57fd8e6f161a62a57a2bff9e7b3fd04e3104f7b9c68a6799ef4842f62b8db8bfeebff77fb5571dfce70537f881e111465801923b5370100ee18d373a82fe143ccdd9efff631e6f1908d2d5dac517f4616e70fcfc2698de525005278a1a33bc6da800cc75fcc125a86d877ec78b775a4007dac891be888be7d8d3d4e5a4c3ceb5840fb9a3160258a2bd1ecc71aaf1fcfae76c28f07e66d43d455eb069b4948f49a8e462702eb1897cb13fd06bfccbd88bf1f52f1efe92d1d2a00eeb2f7e3b975e2ef5cf27f5228845c949f234f7319e1bfd6f8e4f75ba17b367a7b09dafc2645a566a57373173d4e9f390c3c78b449af23b49e657adb74d6cace7b88d1b1db1154792bb2e0d7ca034a19ca8e2d5f4960240a94c7590925ca5469181f77aa453fd454fd40d65c3044248a375a4b82778e9663fd6096ae9d337e7032f4ac26085a4b502f9c3c2b2832eb6ca48984a9a3b219166a77ab7af4a4625ba44a8c1ac3cc8c9c42459bfdb50116fe20140997b35c9ac7da5ca41070b66cab17c3702348ad7501d914ad074b682018906c6c73be0136e18cc766e8e5c6c608a332dc1e41514d71ae1cbc8babb28c692d53591f729f058e8835d54901f846b81ccb42b8fa73492e05a903c968b4f935943cb88d579a68ec34e6299a2a93d335d5bc138e9aa134b9176f42ad0ce09a882752d567e1ecbc970cf5356db98a9910747cf1ff361cbcb6b30d8aaab77f506e541b3785270d2df331a20b1cd9cb9ada83d9b77b9e5eb4fe6164260e1ff10f07b49979a77beb90c827a1bb15fc29d82922e1155c292f747958b052a73f5f88330e37f597364b74ff46c8550672d6c4b8eb0b6f1f1d0eed3c24fb8cce9ab84078c182795f2656889b29fe45d7d068cd2b5fa7c774dc16ecc748478ac9d7d5d154fdee08d91875d43d1ef808b34714d09892c58de37497bca76ba5948f454d0238f30022705a530a5244202329e0d1fc671cd1c5587ec6eb3c43689209a1e8ed7f09eeac29ee5833c6a885497679cd2430f1c9d605a5b735745e58c8a3eec0209db0d663e0d3f2b0efb5b43796dec3d0615f5f8bb6246ec69fdc8de000000000000000040edd203000000001b54718297458119c433590aa9cfcafc1cb8dc5f36fb3726084fec50b35be1190d54a2cb8a5c291669e4274c098004d78cfb349231cfa2ad7bdd92c5adc989c4765969b11c5440d501ebd2a58610710db2c4c41ab3f35cd122e0b012c5cbf0230000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038c0858916dc989c657de8b0132603ef5d143784808f21ffb7c0f14c3943aaaf99347dcbe1866532389a3084d5ca436a4325c67119e40f71e123d582898a2f1295e52975d84e05a8ffc7bface62517e88908e3f87ad051d1299ead4071b8c9c131bdf9868adde98dc7acac9aee9ca90cfce09e742a7e0ee65f0dff4eba63b2ae020be37238772aef64f487984a836994777290d93f2b17393cd076156ccb832458031b117cba1dfe51c82b1a35e79fe1ee6b5653de42b17b881213e11594569d45440b017cca85f88b6a8247e94c0a9342eb2468bebf5f5fd807d09e0e7563191a00c22e8e3f4f833e615606596110c66e5bd387913351643584fd303dbaac03a8a8a6030c619f75b71300af30dde0e767ed7c29a96a45cb83abb2579f3f3b759228a5910210b651c5173a0b4137b1971d918b6e2c2a3f327f8ebfc9e9b517cac9158e0788031b5c790a318e3ea27f21cfe15974415b060de36e9a695657d3f027b0068873a40320316c0e6773a7d65406149c58325311d9b3619d096e71ed1b6fa75419e07e19032af7c9e1ba456d9e80c40b414df5ae7fd95f8fe105dd38fc5c21316d8e26af33228bb4c588a88b924fed54935c69b3a5e8ac2467865a28b69b312af03d576ff2ab1d825f80ba268d2313f64cb450339fa8a8005ee584e9f353abf3469d9cf235b84c80502c6015da3edd9d5597d79714eb4f40ec5e6294a0cc6d677b302d0734dad4ae63a08db6566cdc4f9b21ab9ba394f2af08afc206a646cf21484d0c02ec39ed5baa5f3bfa88d4b270e3ef81575fc413dae1f552d2aa9b36ca5ee226e1c9541e68a3f72ad5a86998345bcb212fd937a157099d11d89aade8b73137905e6699670847d3cde0eb7dcc553cd54185efa5c22e70f892c48114ff206812492a64f72f62b1f4aa44d401821f6f4ca67ac775796ff38ebe1a222315d0a4ae89523a441503a99f3f1324a54c436d8a4afbe22633127ec82951e79c2c293896cc666c0df1568042d9743dcd8b783174b5e76f0f150229d468225d92ead0c11e492d9e97d0d37e1b80ae4d647035b6141b979dfefd0e8974d25ca5d39a5eb174a58361c420d1932188c6ec6af98a4e933b3171ce9b52f405011b8b46a001fd8851dbf0ecf20a483249c169e20ad447a80fce6e4474c24f96fb8a2b479a80bd807d44655215ee55fea29f452e0c33fffa1181a0d7937cbe0baa9afc2e829fe6eb38fdb5151cb97ccc4af513980edf76a67c9964bf646e0a30c43de4a4d6cafe95fbc304e6dc48a5f98f0dee3f4a5b0ebbfd782ffd2583281698f79bd685feab4f6015643361fdd20fdb423da56d161d419307f0c74899ba766fbda84fc0d93ee198203de74438fdce38f015b180092167c6da72839ee68bae318b787a972011cd899cef609c3a4fda2cd7da91f90fd657be764b15bc1b7e3425b574b21055bf72737771dd52c810a84451f4bbdecd13128a1ae9d05cabcdd44c01985f1ff356fb8a074ebfbc7c21fd47a6a907ba3682dc89f60e640e201aeca043d5f50bd454c5b58ec493b835cfa54156ae2d0c07847f3ec2147a7bedbfe3cfc41771f3b67e025b5eed7dcb615205180af8203001ff2c2e8ad930ef490773b1e85afb91db385b23186b604d54e34b7c2f61c8ba7e6664bc35d69922710c11b6b6751329bf410b6b8e9c971e6ac977f203487689b841b4f2532d90a9223739c0e3f9f74c628a00085bc741c582f9e8f2250e9ecb8b383f06586b59a9786149ff05d2ad4240f4a4f9395c4280d6584c68dfd52c038251452daba750941f9e8f07d1e72a34ecfd210f2e08b0af7eac9ff15dbdef843c20730e4ce7310c68ea2d58a9972fe55857cb5669c240c1b3316c360ec85ecffd4878539e3f94a464541ec94fbe3a00ee63b2a9eb00fa13cb0d9e1d2b32769ea743eba522a44f25c23dede244a55a6abe48ef8605248c5f06821dfb3afc99508526536437c0a79c490bfadee0b2ef99830b75333c212c90e477ec99c1b54707d53cf3b704844bb995ff24267f655e270f7b4698f4b64c33ee3d441b4ba329266a0fe7d5ff3fc34a5cb948fe6f9898ddbc684a66f7563c7b4388dd82cc8100de5e87f2f1b8f2731c59b3decc1b389af3f9f0578db1fd50c620dedcf845820a959f80d2a75f94a2276671603683d8af218fdbc0fb0e7cf5b8bf6d1d2c2b98284ef3951ac5d701d554b29252d9dfb11b3bce684d701270326c8b2afc7c412894a81f9953669cc0b0bd245907d439c5fc00b94597faf1a9e7c832abae74d07a5b5567387fa857d4055d1e5d3462acf0059f671196bcef827d41b9f00fd29909652678ec426ce0cdbd3894bac61c9232150c88714d8995736ed357d7c6de1c8f8feb4afcb1b3cc4dc689a419e219825973ff1a6703344f1b09d7af6552de529e891af24ad520672de40e", "526a0051536a", 0, -319181006, 0, "253402974f846e0e2f7ade55b3f098ea2b2bf5b410c2ca754fe9e7c4b35879f8"], - ["030000807082c403011186e9f4385c0e2c03d8f4aa44397a0abb32b202b16aafc551533d4ac8da3d1900000000066a635253ac63dd4e3a8b0195f05403000000000400636a52000000009f55f9340300000000000000007c0bb60200000000ab96be23e57cb264c7fd82566ecfbbcd74ac6bdcb9e74c0682e535e3e1e7923dc7a2de6a80a02d37f49c897d207cd6000281595ed5bb16cb41e40072aa4ff5dc5e2c57f5da1530af1cbf8e488e013871bf508efc4cb4a3a85a7e1edefc9b1fe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d0802754f53957cf1441576100116af809417ecb3499d35c1d50044f810123991a1d156f9a234410970c2a63a59d3ba9c40ae50b3c71dd0efc21c2756c7f54ab95b6b504d9fa93f7cde34520717f088d51acbeab8edd26a17c37296088315e3332a6de09e29fe354a0efa6e294f16c4de6c6f1434b70583429add0aae1b194b5032d6b2374e5ec097f16d8861be367fd63890ebc9c5484adf7a91a1351d3bca1bd022be4648299618e4d32078b08441b57e1d70d6b7ffbb06e79015431f32f76e5b90a0491302bd8adb475527349727e4329d166dd0b5a25dacda74a6f108e85c4bc7a4cb8cf99bd9a6fbb0d282914f6efe7c5b829895e84669cd72fd30fd6531dba520305235f0e320b5d824e0c05a856beff8bfe18bf91b2c823e1703120c3e757a85b031edef9ccf8178845cda9b0437923d1cd54217596616bb5ad0db750375d80a6c40200d3460e858d75767b34d6db24826bbdf757025f765bff42ab665a3cd4799786020061eadd6faa852c9e29533d4cde95107e300994d10634bde3494b998746d23f032837fa0c547d1e2938870bc4303fa6c0f471e5f79f3cd15bc631ad3dfc1c2880556d5d23cb1eef450b11aad832272b507c4561440abbaadef968f3aa97833fe6b0660cb6489b9ccac4ab37e96ef34a5d0697559d0ae5eaaa1187bc586c87a2a0e347437e0c1fe8669d1103063bc3f97796f5c2d3478d90cc654de5971df201e2d6b8cf6ccdf6b6a0722dd66bbe706987b07ac991847137bd79571e8a67ec8448c86f76085eae8f80300985dbb68e772e52835f0f5c6edce7f146a3b956b7401f4499ed6da38a80d4664575e9dc1b19b8c3bdfa3c4a2dc7b119ec264276283c2387bd2808979042902b48e921ffcabce63a76256abb5019edaeefc1207e89a77d275953fdd4d86c1c63c290c9b007da2c4c7943a4b94be9c9b9e44aa8af3f37d6516142375350095cda362e19fc4b20e83880759d8b7caa8c7b0664f8ff913b1d468359e4435a44a7a767878357870c5ab2c14cd3e1b7b0f8ed8eaad9e13524dae1cb5fab2bdba3f3b5f38fb3b6dad9c4aa3c766649ac5d528ac2d28a0f47b31313e865fcbee4134a11f75559e5d8442b1fdf98647d56a2755b901631b484ccef4d229851b3c2bccb560d2843854aff7a98db3894111f44aa391e8592f244755ca27eb2300e23f80310f0b5afb0c80d4ebbdc951c10985682b786298bb31b6a26a4bbc52ea31ce8a5a401595ad2a74a85bf5b3f0229c965003b87ef1586a42585c71b9301509572df1a2cb494089c67f75c0965d6d7a6c5355d1ecece256aa3648ebd7b7df7aea129af08158dacdf1c8b9fe46a4ccdea60cbf0ba4424961eb7543d162dde961ab7a61763a17be12b5de7619c825cc670e64fe80a6934ba6f2ba60f7a0c08f0a3f2401b5f98f824b9beaaa4eeeba555c312e7c0a0b5d6c4fe039f5cdd1243af938ae14b86125f07360ccf70e85a4706e7c7379677ac308251a58e00af4ba789675e851223affcbc0182807c0fa298efca0e71bd2aa97c6e052a23d58072b7f05758fcfe80a4759c832dcd43b52c95b278d918441a7ec76e1d208b5f73a0050c2eba73114484d3ef207a5c72386651e06d655ebee502318db880e1c61faee371d298a3843424b287a643bbb70d70f35dab1a3de2f0f27c7a4e6a30b515fd26e2295a30761d178620085d9d241bc5018ef00fb39c4362c89d523e675f3f0148cd651198f681b9b4547cb2afb1235282e80dec2a4cd1953ab79b27f57fda69f085384f67606c716fe4c9b227b9020b38993b5378ebddca13872da8f362d4b13d003eae14396f6a9efd0e8424558219e34b74a6bfcb79af10477b4586e684113e4dd3eb2a12d71438ac198c207102e3c6452a17888f6d1088e8ff3556ab8bcecbe3ff23fa1c2239ed6ad55b31b65574b99e1f79b70abdcc266fb126e3611b8d7d200fc23dbdebc2af350c64892984a66472a2432195e87c92294fb0c334ec5f35ca4c7a2a05e229c343ad505c3c06dd09313540271d84019f1ad55a64993b17c9f4aaceec733cf0a0ffe6a0b8dab863c7ce9b0237455e29b4bd37346d7d4f1c22b90c7463c3e7253f3f30fbea8f89be63642a42b7367a6b2516b407a6d740f45811dfd5a693eef28d8414911d536d81255f5d38cab15cf561d1093ee21ce007695300021729abe9cafb3a37c96e31c02693801a76860c6cf58fea62052a6f5de220e9392e5fab463351dfac1809fc6e6bcde57c363ea3b6eb53002f9facc7637083bbcedcf7da0e66ba37d706cb1b58114f0500000000000000000000000025092581360946d024da422cf7519ca72c6c9c14ab7cb18487e3644c3045b6ce8979a9501fd1814eb4522a904e9f8a6d3bdd3145b6b7da1a548e0360913385a99a3526e915f6ab59d314fb64bcc1125e0ca89466b5b651425c008ae96b95ac2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e415e8bab4dad4d1c3126c1d6b440d6bff8602c3cda0c13bf42b108c8126724b9cb23fa8ded423883108cf70a3bb43495b0a4ec3430a6dbb7cd610246bba8a4475a524d4c8a226ec44bc1f325bbbf26b9542820b42c6c7409566c28fdbed07379cbcc9252ab19cbc6d4bc089867684d5e4edc81c28cab119b89467fe8d2e4c12032ff06dc1ccb8918418e340292993981829af6453faeba5588606927faf5a2965030de41a3eb824982988ac0ea8e2ba9858609af301795e9968fce47eb9d98d8c180a02b3d47dfb81e105dfc1512ef59f5562290ac31da01a5b530bbe62470c2dad64496ff7b2a13b42402a1fd08528c349f90ce61b4bbb43aba89d1d2adf3f45472c03294089411fcc463535f1e48fb3100201d75f5a765e117206a8f831975e0d471802077ac00c5dc219e533fb00d376ff61e3de4ec0d2873fbf80c61438e2fa852b2f031e699b39bb7e90f47a1925d5fdd52b6f1003de0d42c88e43745d823ff36f44a80325cacf83ceb647e3ca145f2f9f409df173e0d549b7c93bf4c69b688761bbb89f031f57c81b7616c012f59bd5b437c888f42cddecac7dacb43b883f14d5982c995fecf15b76e4514cc8a4e63bcc79768aea2a74d4dc626dc492b9215438161d4430621dad52d0e4b1da42df458f034994915c15f2be6fc8403943bc32bc96b9d5b16ca7327db944115d6922ffdf6bf9359ae2fc64e1850a03a6e17cd2d67266a1e393c1fabb2af4deecdf77fcdf0ca196cd3864850626eda896a3aa16700a3001a0c50e05dd94f144d240eb0de6b47016875b5aaee5e86356cd2fd085235b4dfc5b940297089e0d38663e02fce7afdb789d261f3dba4e382248de001e53f57f04a3c82bb311fa098894b37c864d431e8de8dd672427637a8166df0e9dde9a7f1ef53083d1937be0ca530a3b5368644213d5650eab07dd7617012aebdcd763cb8f8895d358a091eaebc18fd121b90593aa9c1d8cc07db11c7d863acfb80759b200609f795a5bb522c34851b9cbf6d2fa734b6153cd3ba8021124f75229a3857241704e30797ada96e8ad8ee8358cce6be05b8baa7aced2dc3242b89409c4943e5694ca9d0d17dd704bf4a5f03cb6d35433329dedbab755376a490ebd419b18d30d1c70da37df86c95ba0cc577f6f2a27ddf87447e28ac28866afdcef79bab6911e8284612605bb8583e8ac6d21d0ad289bd59b91e30cb3d64b8fbbb347b31d67d0a4d53d40076ff383d0263f252078a552ef38d4099cf4a9be91c77f805aa1772f0c42086a711d23f762ab4bba9571cfa425f50340650ae22959dfa15b1bfa5839a53c685b663ef8255e9caceb1649c63512957202996f8c0a645db58ed462b8ba25ed8eadc2a0a095a281ce7e0d1878d64fac9fc8d8570c92867dd18ec92e9191b6f18493b630eb400de80167f8d23cec4cfa4d9c5ec13e7e1eff1e7c0766be3399af5233db80fa8938466388471ef032c712d0ee31b027fe6b97f5a31cd312f2e70f50a69d73d94911a87e4b45814257943a624df18f1150113339275d03a78b1d3c61c38da6b52309af22969c36dc3d484add56ef6666115e0a579db395765071866d4b7fe6f1990ec18a1919a3b91722412024677483d8c55a7dcca1918293026b2afec88adac570b2b9ed7a8c8fe8d0662efedaf9926b94cc2efc1e14ff98d6d1f41e0eca2b369adf46f126b682e8f15fccd8fb2ed2a4d201f01d67c9d718ebd1bbae15d9c73084d6872528be2b7a9d6dd7fdfcedd486fdd163026db0a22b86c26b0d7b598c90c6dc85c61bbf241c5519eb095244282ddf97749bbe4b708e57f91cb80eee2f2626dc866a40adec60662aab278f3a4bb284d3c41c730ad4d5a3f5722eb10fe18112739baff5f136cbd7ea1c975af3b0b45602fa3c00791cd89c26589726403c8f225b854fca3cd0c3c3622fd3bace2735317c7204db6667ac5206bc05d446d0dade8f7d8a24dc6c5b50979584568e080ac1fa47204d4af55f80316b20cc14ae7ea494ff7b7c0e6ba7b8835d06a04fd54f079165019dbfcb8e41b8383c31f5c0fa7567011e37620b292b16e6eccb1d95bb77ba93532c7bfdf1bd5a55f8168c495bdd9a4984794de55fc6240a76cb21674efedc79b89629509efa7a1fc8e0d6f42def0981d434747f3ac9b0bbf638c4eed4ba130200a90868fab28f6df0e124aacf8d2bd2d693a08db725b2a5217d7187de8bd72fa6e5017b743e466fe51a0cce9054e4897acc34f559eec7b3bdde8c2a28e8cc3311e46113207912280049c4edc6ef54d3e5551e8820a17b680c7ac403000000000000000000000000b6901f6bdd72a5674247b6351edb6a884ad7ea26a326e71e6a0b7f4b5b8bf88a34f052b11d2cf30c023c3189f28542453a2046f104edb7cea92dbc7e438b5d2c0a2becd5b064181568b65b227473f09f318da5f0bcdf5b6a65ae2a976a9ff3fd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000865d553fedfa2ee74982e213040ed01856062d02035a66489932eca514a00715d3bc42bb133404d8469e7b2ce8218f1cf7d34d1a1474e49bbb1d025885e43e6c070e73fbb22f2ccdd4278989eb62af41d94c16d85ed2c521d7651fda5ca5a79dd551b32b03034c37a2d95367993f7e71e9e1ea7f797cd67af0969cd865756421032e9825b71b1aafeed123a7c47f8fc49af400c4abdfb07049bee5dbd263f8740c0301a9638f4ad8b191b2aff32672ba41a5033b32dcb68403aba89fdda8302a4de20a010168be1f07a2076c0f2c6e13df51b949d63d5406e8a305054f3e9d4bef17f7ceba8e3a958469f0a9da610977c1f98b29dac2c06f38f05abe0f05faf0fdc19d03091bbfbe7a0574e87927421d542b620c9cbfcdc297edf9788fd15d0282e8cdaf0315977f8337deb0ea46fb2af0d9e8e4eb13b7df4080fef38d670fe7cffeb95d7403293a6c43c2f8d900aa77fbb9bd5a62bf7e62503f77c2d279929f0270bb5c28cb02010e7d4df276d38e231897c6ede6dbedb196ad95cfb8f7772302b455c886e98e032b9effa2e72ca86c60ce99588d4dc39925f9bba40d7ea86a634880bc27123c5105f437a5b94dd1352d4f6603664c1eede86a0ad1e7c7db77e73e2eb89241b782b8daae63658ff05e9b7f64cc9c862aaf60b929b12eebe32bedefdff8e938da303fb1176b4cfe1e94d8743835d1a3c5b61a281758e18ff53b90a91e4eabb7173be4697cdb31827356f05a5398aba672a5c479824c9cd90ad8dc24a89ac800f9b8a979bebf4dfdc58182da428a47a1bf65942edca12cac05bde76fdfe130818df402f362adcc0b4847dfedbfa8c1f57dc3be77361786b38d45566aaa862fcae21dcade338572a133bc827e9f3b1ff42ad94fd982fc710b32d48f35f5555992013ac91506e044808f4d3f78d82986eb3e6db91511e58ff8490c6ae9fd27f33fd682386e5e20e8662be0bf692940a799eaaad411b7f30e3f0cef5d62d52577405999ce33236ca54ae46a9d749ce927a44b693b96ef52ba1ee462054bf0866f953fc2f37ae4430c18bbc4d8154784f9faa7cabaa9f158e3adb0e26e27b781a94970fe56e2e8bb18764f42f7691c2ddbf5dcccc224b22669fd87fc64b491e225126675b03243ab9ddf565eb9d3d15a989ffa5b56ca5b603edafd5efb0e8d5e612da8b826bca2c2db43901c0c13c490955cb91b5baa1a49810b5fbcd600f13a03d45cb8303eaa4dceb45eae278567d81bd85ae82cdd727a68e1b79a4d1f5f87188c850546730151e351a2ef238c7d38ac98e1d998412d0186b6970648e54ccf8fa3b5c1dce0dc05a4b1afcce69d24abe17b995e5527fdde2c0894496448259e6ead0419729a6399ddeaed0d6a06c8b46ea7cfd60010221965fef027cdb62315e36d339aad6df9ba20a3d64a3fcda22dbcc92a58afd3e087a59922eb8e7e46915854950d446f5b4f24f8c0b8c041fe0cc4e3b119a8287fc7cefb1ec8365c3c872e12c1f490d85c71b77c14427b9e4baba088ecd6d39eb49fddd2247d301fbf1fcebe575807917b8f5df184d8ce35173b8b775c1cdd8fcae53e410a070713521ee3a8873a30d193115b8fea0664d11d34bae418fe62e32430e3c82ffeebdcced610d9d196f84543b757fbd775bc526b4afca2654b0297289b7d0a32425bad4ba0076d52d47c942007d2f128061ca97aa90a529160c675febadbb1a27dbc86785b1480405fde139bce42b7eedf9bc99fa3b1574eab21ae09b7f214f28f2ea07430e22148195353ead1b9c3cd365d2a8ed8ac5a11213667fa0dde6f128512d1630ebba1d9ef200141b58b6116d8b2b9bacc2f386522e950cd604bf2ba418fa7bb23f8420a219e1de1630ac506bf9bf77db5de1bc97597617989735f1cdd1fa6915bf39bc567b88159593a8809eb514f121a9cef2442c6697a064774378f4a1b09b4e7fd91fd304b2e04286d7687335bba04eeaa4e97ac2306c7b15a38718383e978d3362346ef7f79753cd823a9e6c3cd48ae2f15c625b296771a44c1c9a7a22432ad9ca7311292339240bbb32c3e663a3a476235c9306a09596a058abc8f832eeea3d4c629d9a92dd4874c80ec50b647178c204b8dec9602df92374c0a34db73f9f8d4b72e32631f50ae16409af213cd134edc0859ac8a1e922f3f5b20985799deef72288cf5bae32fc3cad6cab5f4c685606fae7a92f9a19d073c09261f746af1415551360a0e4fac9f8fbb4142959ba9f68915ca95ea9dc1dd7ccc5611df50b1db0e9494bb45c35f131e51d9ba6994c6c9caf8002484ad3a10a70edcebd5c4ac19a236595d7b2ebdcd81ff48d9a44faaf5236d3e07fefc7ee584f25441c2625703ffb92623f166061ea33bce831aa25f1eeaa11afe8f22e46e016277c3255dec5ce1dffa222c963c704d206314ec352d300ab86a380e", "536aac53510000", 0, -648092853, 1537743641, "8a3fa820155432447a5894adbab1c2abe225999a69a170ee4c1c8effbde6eeca"], - ["d73a73440227c7ee5b509f3e4d765377c515d99b267461f0ee2431b0ac394b1e714136d93201000000016affffffff0761b45b262eed02662d576d2e482e1990a0f1bbb8e461618a1fa0854715a6660300000009526551536a53526a00dae24c150295c38a000000000008ac6a52ac5200536a3f26f304000000000751536a6a6a516a0000000000", "6553006a6351ac5151", 1, 1931441140, 1537743641, "ccbfdcca0f1e9aaed9dfc6bb7b0d96adae473dbe36327f2cc5cb91aeaf63c77c"], - ["296207180227c23ef84e5e6f47c45bff8841510e64155936cefe4084dfd693487e3519447400000000036553acffffffffe0b1914a90e90ef62628b15cc14835131197152c5e927104f5b75ce377a7c9c40300000006526a52ac52526d3cd466014a70a602000000000665ac6a6a520000000000010000000000000000900ce3030000000074b9b692b7c50159467771184aa8085902f143b64880825ec478ec086d6a509b16ccea1a8039636a234c82bb6d3e75f2a3264b2bab735768dc27209d09f1d997e9b8b2a968d58da46ffa36500b3383a1c226ea3cd3abd04248452709c872ba87000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004dc59c7b9485662f62d7c961e62fd3400f25c52e8680c920d8acb33a91d85d93c288cc7edac2bb28fdc3ddde9c05650effa380478b9c35e5e7bb584a0526a2f97f24f4cb6f50af9c147bd48353964de218d3804ef1f62ff78a7f8cd8e0a5ce05dd9e37be71cda665debd2aa11aa749904a05a9b46632c1a1f1b922ac10fe356c020437a7cf91243959d22ef455c23ea54c2b52a64ddb0305248a66f8a4193460d4022553399ca089185f7050a22c19a6a230ec721a5126d6aa5ad4c5b019d079476b0b06bd36da68c6d1ac9eb92f5f0d50d31a6fecf77bfb6846e0e9119316b98ce58729d9c3435d9220ffc460102bb70d14df4444dae2bf1ffdf3d946ee458a375ec40330076f4b8f4f8865960289cdc26da59e5e501e2f862207350e807fcd27bbf8c7030e1a79b16ce177bddf9127f1ad974228ea47a552479a52cf2b3758a2798ed974020fb22c1ec2bde9817f3cc19e67d26a4934ea6df3a303e74219dfe18bba74c51803195249acdcb2b1c9e139f3f70bd407d627d4c4e0d0dfa2902a6357801eb5acde03044da0e57786567e1792fa6168dbcefc7b282881f3934dd1896d447ccd81b26a00b3c9788bfb941fbb55e557644af45bc29a4d2e7d2bdeb69bdcbea19381565f88af0c99edc8d31541b964910417fc52ea25fab1bf92a3b24e3b7cb4d4ae28c2deeede5df9e0a6b9ae19199d23cb5e2ce789367bf7e041640abc9451412fa743faada54f0ce71ccd11e24a1e5468d1af751e52995557f38a67ba296e42315df54187b2bacb9b3bde73ddea8da00debbf0ce220c7487dce9b8f4aea35ee15e3ab203de3464c85df8531c5977f35cf6f52c425e74f9f39fbe50d2111bd3c497a20fdd10fd7439344866ffcf1f3ffbfbabbe979bc6c6b66bdfaf18d443786a9febe4e2c681e0fee225fc758a966bfd83048e4f441605f8c7f222043ec28c7e6155698ea20caf58fccd84c8ef96051c68e4a375bae11ad239a19f2253ebd3a5234d311e480544f5b0488890f87eef516e0bf183b14487dab4f3ab30b6e13c79cd4150b00de7f49ac7d05d4f073ae926fdaa03c7dd5e9d42166fbff31ae8b2961315e2c5ded04e076e3888028e5b3ae455f4933d5c1e3b37e7151f2176c7742524cd8427e0b51ff7ce5de2b6c58bd18b46c3f363b42d3d7b47f3f5c867572817dd80195fa8a66ec8022b375b2319e1c040f657f923dd106173d0e79aa1ff0ff1d0f2d93fccf68e280cbda1d5fdf3f4622e6442082db188e141c0fe5e0fa1be1566d84d04978dc301fcfc9c05f1ff72b3ccbfe2d30c60bf53c983ebfe6917b9373198109c4d44ef4c2071c2a0b0776b191b8ed028c7657adf21f2a12a7cf3ecc229e07ce387dde301eab624e40aa71e04df015faaad2bdd2cf3ccd33a9832851030c0968d8d5c62b6f6b122d68f961b83d1ed0fa543549323d8ea841cb22df9c2560537cda1772669d0b925a527dd538d359370f0584ede17d1317117255a0d37ba865e6f17877e0411bbbdc8cad9269568a18651217d78eda4a6f109a770efae8899cc99add742335909e4c815e27c228c8764633fbec2c140c81c9dfd596d4fab458bf38df5d7fd83e0abca30b0ba9c0ccc867bdb3d96be1cf55edb64de9a6066de0475286cb7626e552c12966403c5b7c4cc780c81bb8fecfc5dab3a97a55f4e11cf17bacf0186005813fcd5a051de76673dc7ee4d44197023f5e16bb57f62c572bfb9695edfd245325d5a0a0ac654088901e4ed18b0ac1a0cf4f459263eb44aa18c0e05a433e037ca05add8271efac578632ffe1c1fd5b63561bb60673f8b137504b4107e6ac6d2ab7fbe6dc1db741c9621cc71312521f7ff35eb6abe68ea5aeb173f569dad6650478a4e17df9d536f550079d2fcdfe1e12e97de0381080e0b86fb1c504535defd0481cec12a5b9377b6e87d51e92d1f356470ee12d2091374de42800dbfce60a63964102bb8bef4cec041e91a5ec71367ef77931118b8c8bc9ea028c6cc604a92d142e612e44e4deabf5a8d01269bf42f7d04db392be06e5603003900a2c5939d9a10ec3af5490d76f86f642787a8cb722b3bf3c4049f029ed77eb3feba7a5db36e4bda505d6c512650ef0282a362d693ef94240ff1b03f7dc4fc276ad1a61a4670e200047064e1c3634689cc1bf1698a77e9b8d0e3c0df93d9c06fecb6b674297b75b27f8dd30ce3e46f2ea3a52b9fadea047ec5a3f4dc79f3253e19f1f3e480e484318782ca35957fe0bb4a3fc7052bf01653718cca989906603232f73f36c24b570684ae970e89162859ddb34f3d60afa788fd419074d2f36e5fbc587b49e68edae797845ab3d45424e03cf640db85c653c0d0ea1e7b12f96035ddaca8c1674e120a18a7c3ed9ff143e41dc9fe09d1d740ac12e1a8c3dfc5890f939878e10667e00f25b78f5e164a21e0c", "006a", 1, -1478734053, 0, "a7f43ffb50e55aea875252a7a070a907d04b910df0d5bc0fdf5d8c96e60b41e2"], - ["7905c90501984355289909fb3a37fce3829cc85e9fc5c6a59ab9638ff81cebfc1e9a513dac00000000026351ffffffff02cf58e50000000000008933c00300000000086aac6353ac516a6373ab2fea00", "6351", 0, 1517385538, 1537743641, "41866c3a5efe420d2983d42b51df46ca803fb07e2541f86b4360ec868380a267"], - ["f39afd05031448dc49b0135c4c9689b52305b0f10e845cc570349e2142919f40a3c8fd9fc100000000076a636a63ac5352795c4a05e08cdc773a88a192414f5e90726e5fdb880e9c7cc2644377dc196b86856ee89d0000000000ffffffffe770de20d7a70879e45cf0ac36809fbccb71d5ff453a72b02c2136b476c310de0100000006635300ac6351b613d032029c6de1000000000004006351634554ef050000000001510f97ef7f00", "000063", 1, -300882257, 0, "cbd44def51441339a62776d210e621cdc7d8aef1cac25ee5faf570b0f451198f"], - ["030000807082c40303cb608b37bd8893b7e4bc3c9aa79e5c5dd04da135427a4e4ed0013f2565d7dd3001000000035152535405581e765314805d93e36434031254067358f055182daf857361cc5522ac6ade09abba0200000003656351ffffffffcb14872dd22016d1037f7dc334ba26f5512070e23ecab344af3001dbf45283270100000001ac02c19e0602366d77040000000004ac536aac23307505000000000953635152acac5251634bb1150016565e17020000000000000000dc00930500000000611bb2afb3e739d5c3fe845689d4a740572aa192d32eb603c7a76d3f52684ff58f342f5f9c8777e72d3b4159314e8379c9dc77ef2f22cc745de0f6d119b06bf28d1b3ca662e7105fdfc004d1945f0a1c4b79abc10b7094ddeb0d0fd9e0b34edf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ec8d3f1f1a79aa028be80705b8f41123601ce4065fd63c65e10e02f3c6910ff188c255bbfec1d12496ff527ff3ea778d659f704b767997ee34c30910051ec95197f6570a987da1cbd2c4f677526ea2d48e85e8165e5e469179ef6e7bc47155d2ca64c3a0de26643f4fdc132f6c6f93b6e4ffe5d1042d0aeb54dbd25e5841408c021c3979620ea3cd1a8c86952e792dd329f49fcdb2d4faf28dc6aa29b2b37209240225eb2c245382230524b1858a832395c6edb077d3459c12dfccc1538eb462cbbc0a01c13a786dba419ed8fff720ab46795925c445008dd87d76327bdd8b364260c23d7983ed7a39849cddfc3641e5d10b9c5f13d67f50503d07240e46dced38177403251985d716541c956b6330ef87b1b7bbcc4fd5468e807e42ee5c9a3ecf11a79e0310e359f50f50181b880056c1da6fdfd5a05e82df82ab16ec1147c1804a420ada02091879cc7294a3627ca24b8c1544b10e844167e8e340faef5b55a77c6c016e04021c1fabbd1b2b8f214bb6cffa84351c89a0df5b2ce011ad86c8efd680d81552ff0301d95e138072e5f8fa652a7f1284a60fa4278bd424b286bf66189ad465c2050e3fcc686bcaf3d491bf9e32295d4680a600b09f6d157f3310b79756cce1acf9a987bf0e2621827d34d9baa1a4c2ad7f808dc51993bb5fece001f10eded04c35efdebb0e9675785aec7d4da21d38ffcaf0fb7a0b649a6d2161c1c741502e4b092833904bbb7a67408dee1e47b7b101690264768b7cd8b7443a6814e8cfceb45451ef655f446489e9fbfa79e7e5727e1bd1294f88b931153f77e892e75869865dbc053c6295a02b5d053083f2d15f32ac8c0ae5135bf779191aaffd1ce277ec3ff880697a19c122f6880e6614169479233c5cd6aa37e59e95673b9f93787a7030cd3fa9a2ca784b1d6df0ba6334b068081be4576e99e66c38b68db535ec3c2dea910676e88db924efb1dfd8d6f86d4eb3777540f4a857c1e3e399815f06e0f08185b1a2566452adf439fc946a665ece0f5a61c456e056ca887f86b74e494ebb950af2b04489ce664bb4aa9fb4c135591204e15cd04fdb80bfc0132ca1403ea31569682a3194347ed9817499279a910b9777e62a5227cb5d266919a70046938ab8515da7beb2517e32b144674c3a953ab3b64cae2bade39239342ce263f084024d8bc215cda9f520904c807ee02dcfdbadd50ab35fdf20791d41c2b5042f8cfb42a96d33c2ec613e91518b4d772264f1f8f57a9ff0d47e10962037e3116d4d90efd0e5876df8bd5956e1cb034c31fa03231dbc561e66d4e50242577a93b7acc2142eb4d214aca758ebf4a889bca08a80f86db7b73de76eb113b95e50f3ed2e46e0ff344a0ea6f8a82261f95f5be0b0991d231849fc34d056e0cce5f6098372e8ba17b78fb924f2d7b836786b2dfe3a381baf07ba6495253228943b03f5970085ff8df6487b1532f8eb92ce9574a9c4783096240dd794171c490dfb8886b7551cb9a75708b9042c0f26c40769f3578d45d31c993a892058f8964f46b7f9da6b0c2eace39b3d79b6a8605425e52654ea10d0258d9b3959e2e11b48340496d912a8e37c29bda12ae454219ba5b0f983a8546fbf5c435abbc18f4bff30c6d5813b3dd31e1267bd97c0f764c4ff5f3a543549092e90a7724b97390526d3ecae849ac2eff699dfacdb9e204d0311cf1afbe27c17d0f7c303fced47666fb82d128e5404fa842a398d99d875a52183fa5fa9164d1b2876fc04c746c11b1b741d4694b5c9a2d6fdc11ae931c5c2fcc650364116e14e2f8773c84860da3798a446370d183e13c2d493a4f4b21407fc33cf9c73c9e6c4931a732520bb83ebe4d22350d79f21701469fd679f961ba98fb71db674648c322c1e04baa6764a2ba263eef755a9d1bead0379d1127a0cdb6d6f7086e3cf28a147ffb74b3c0a8e896032d961231e44675ac22ea59308cfedb0bc50c7851155bb3421985f0f173c422284398fd71dd4d56b0febd9458f0983abefdec4e92aaf40965a5aafd802d2fdb83b991fc9350c7ba6c2ced624702e20e104e2925989832c101456a40976fc27120ac25f81c8eda854123c064dcdb99155fa726e21e81b80f6de9239e9102fec39f128bff7eb3aebdbdc49d8c929c112c56460ed2d011ff69ffac791b07226e6422ab2b1dd54274afc337f9f0f3f51fedaea4fe93ad22f4470af808134c7bdde77aec666bf253568783d1f93d3dadaef506769a7f8facd7c517ff54d2cc9ce497bab416d85275cc95b67b64e64ebfb8e2b99155584773dc4bf1b920000000000000000eec07f0000000000809b27435c4803e771ad013b31d84ccd238ac4ee81d23242529e7a1f5de78adce852301c750921c8581acde6729237a11507fe5002d3dc152d1e9a803e9a18967e3b2667b8d67e5fa6a1df131a890065dbf0f9fb58f979bd063aab2efc2608db00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f450375fa4f196d853609451cb8adb6a4bfa136418c13b1bfba1f3996e9df8bf6ddf518cca582d44b824289760e8b87e4b3703eab26ae22ed65f6a3b80aa79a4c8bf657683cb0c73c56116bbc9434bea7e88c2d1bca9e9d3de9bf80808949291ebb77624a038ca7a7eb5a5dc9dbc47d57998b5362685bebdf7002c4f6a9e12c4020fcf2d0a1de659cf6d4923873527b4c165369a75d205c294cc57731d6fecfc44020060c599c3cb7ccca1f9decd573e6d5645d668cac0e738d2f34bbdc527280b7e0a0014a31a8c1f04100c0ab01bdf081b6c0802e0c371def10bbcf105a35559907f98ffbdbc0e412396aa510f372b1442de440e4c58b4f80bff491e1a7cec8ea696020513c4fbc61933c90f47cd0fa4a52ce22c92cf142a1fbfc9981a2aadb3826fbe02007d737b7de4b86a0f6e6219b90c25cf46c437a59b174fda8e480e5dea87ab3a032cd5b027f9d23a4ab2f0744bbdc664d906a0c0fa38cc95f85f96634be457122203268300609e34de29f9618c738d77a2d146e3e5b16822619d93f545edc5897f27020db186cd71f78e15dce9295bd1a1bf9669e6b9c2bd22a8c85f8ba6629016e3f3b27b0a4092e1dae75e396647fafdf969fc91c29a28060b35f052f8bde7c1dd4477fa03735a89c68359962e5e530ec3c76abde3575b5334f8309d38a7d7c080a54626e64ed50a85df275c797795fd9ec9aaa595db569f00847375b93c5350abcbe8d3d4c80f77169a10cb33678413628cbda668131373ff6145cbe9697b51e8cbf1de4aa10138f79d94e26ff72c1deeb7aa7de25757e281d527ab6cd007576bca7e337515f0603f30a430b89dee06fde2260a988a624da06d316e1941d657a6a7840b35005daa3576651dc3402af18c745de3fa1f3150c041e7237b81debaa09e087fd8f185a12efa6333b7fc5544b649f1e17a19963a49aebd50394cc851212b2b93b7c267ea58be753fe04440981c2d8a8f047be31d1a889a4325d3883915f0b2a1e46ada5fcd18f1a4127b8e79ff0ccead231f49ab96d656a624b96f1d98f94194dd7626ec91430e4b87d102f05615d4f8823f0e933728c837d23692ba71b61f797ff4cd5ab710c0cdc26fda411b8b4f3d8ee1e6b9abb83ff15e99e54ebc79f17e44283c76632e58c3182931d73f3d3e5edcfba6554b6a0ccae239cda3d11db6ff2912469880f7e7caa6bba893dc3a85460b96022e52c8771f1125e84f9ad94a5b20bad0495ee9e90b5313c32eec83d0a3e5de3e42279e034ed6755943ed6db40132c7f69b48cdb45f9cc4e95f0f81716703a05c65219068c3f938e677a76264cd7d2ffee4bcd897b1d22b499fdc98ff6f8a8d6fb8d2ef81220428a479b90a192c26b76ebbf55e4942cbf00a6fba99292055c3f72d540de7df226e81e9eef1819e1d14dd25861f6d01bf866c0c9e053ac226be76571c6b9cc26d870d84e797aca39577fba3c6c24235c81cbb63433cdcb85fc7cc6a64d15f51edd5a8fadb87515ed17b3f8651e93c4bb1136679134e00cd7694b8a33d4b4277bf14ed417c43db4b62b17febac63d3d78b742a0d1772b3d82e21294f13dc0363f883d66bbf3ef16b3a5042ef2d214f91402e102bac940479c139bb98a6168f2deeef059ee29b8b6b66deb7887f6042431d5b012f01738039df382b466e91761ebb5c349aad9b8c9cb4b397f1c291694f43f0525592c67feef02fc50f686ff11584375e4db3b98386c9f3f51c16f508199985f87964f46a19cb8464141dfb1d095a44a132230c10c0598c8b099238b440c0f277fab619810874e5ffcbf68c7cac36525e76d9c8bd9b0e9d7252a0a11434440a9be19dcad699214606fa9be056f0aa07f42a46076f8090199ecb98c91182328fa873cfd5bc49b3fdd33242b8443e7c5a76054ed849b64c4ea8b13179e1bcb815dbad954efdfb6d8d1ea4bda247cabde1d2d272b235c687f180be88c429f19db93a8794e8cda8447b4160b4f09374f08bfc44419c476a7317e85c49012c488780312671ab212f26d337893c0c32850041c92efc1c65b39c8a8d20687d407c2906740a3ae8431f6aabf3691b674d1cea169ed0c762f7ea8bffbfb0817ebe4f82c325b5bc7abd439a79d66189b383218f00453416cebb43b99382e2d4017f78099ce63e4555409a899798930ec56a73954eb13642cd371953868c1adefcd7a3886afeae35ecf2793dabd11e0cdc38bbf13aceeb57c5c7a246752b484676576f773a1ac6ba59ff7adfde8fb613ec99fe9710fffa9f94cd6cbc4c1353c0a2f2fc658a22a14585822dbcbdfc461b7a3706d136be2a7d76f6c9b3250219c9b85b162c6ebbbd2cef962415daddda4c0232bdb550504c2787ea5edd4d0c04ca4df77cc946c6695b3096eb52531aae774551fda0513b35c1dd94421cb75f9182d7a7315e225520af282e03", "63", 0, -727033431, 0, "a7d3d0b3e51031c1fac4a7a5c5ac9df3eecf2ea00b722c85aeca8886f5b30bd0"], - ["bf4e0d6b01f665aa63cbd26580f6ab673320df8412d6fa5c90c7f19515d3f64dc5031d0024000000000253acffffffff0312105d02000000000765525253536a657d40a5050000000000787b4e020000000008ac5351ac65656a6500000000010000000000000000dd502e020000000057ab7eaa8666ca73fc5c0a0b83c27da1f534f32f46933795a7139737b956b8a37ab23e0099e22437b9ed8c29c002197cfb2b85114f415dcd3c78ac38b17ba0c4ec2d97ed8d28f4bcde733a74fb2052b8274b0480291befc56b59f7e2544e95f5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b13bed1b49347bd3f27d0952c0e774a2bb9b13cd854524eb2d93f0e2e8ee9919c4d67915f878283e6987b48725fcc8112a5f049872d7e79dea3715989ec916623587f33770cd7763f05567d3dbda2f776911e31078ed6d7fd2f32af37088c36d4003471379f5f190b66a904435f5111a3a8639fbfe6c3880d5960d705b7ca4f03099d8061c19a57292452fe072b38473323316847c4bbe70551f202640c7e34b5030ab894f3254aacc40f9e006f3adf9ca4ea21a242be3f663b78f11f1a0d085fa60b0391870df2dff59c741dc3c952cd08947304795bc9313a81eccc1d153c84665a6773b82fc79ebc856a4ecc8e246d85bcfe8a4ff73e63c595bdc7ccc524e592c50318284599dd213ea5b2b475a07f1b1ca6770d930fbe775e2660dfdecf5709f346032123125a622dc270e5c3934199702f3d2d961fee1ae32a163e429d368e855a94032137fb64b9fe07082979182189a64434140b7eb2fe53760adffe6034013d1e7b0228d7f98caa5b3dfe876021de17a9fbdf98e744f9382662b3d8010eaa0716440003097c4f23a05d37cf5fd1c2cb307fc529943d74b3387227364aeb34365824c5f388e59fcec707e35cfff3b2af38f6a74070a8176aef38ea27a7a7d1aa11c92c62edc903e8a7c9e167f9783ddafa8c8e4b2ddaddb9ea196e19299948eb71287acc0b6eff3ef776937183a1fd71f76ea9d4a2f367190224b4a147de2b94ed7e1162e398c475d9033bb23f4ae299d84a181d22f3c17696b9d5b39f2b09a76a19eaf8e2c845d2e88f71aa3476859b3094142feefa18282ac06b838c393f39aa1b53680dcf325436474d40896e30793e642c592a6334ed7ea152014e61e837231cbce5979aeed0f10e18b91ae943f063cdc97e1762bb62bbb5797a586239734fa336e0965c750273c10084dbd0aa45a9bee3c5feb73e83918ce08508429b010e17f2e515b32ec1135008457ee68e1cff494b832aadef8173bc5dd6d1c94233ab37bc0a17d76f2dadb9ce3b253c00eea61317f264ee3995bf17509a537ee20e4aa17f564177c72a0261f6be6b299682755a9fb42e8ec06a025e10ef560c2894a0f4a315677d3155cae3c1cf178cad85f1071b74d138a711f253ab5485e61d15cabad880529a10a5681ef7dc56bf881abc191e867c375ec7b7fe5dfb30c90f3a5f4d958be725e543903d04610c10a54c714fc8770bd77e9a06663d3e2a58a9ff0b6338518d593c227cf82a237b88721efb8ca76b0240e9c0139b1f7cfb3636d0f9d229ec96f0c511c8cde8d724ea1559bc0210c484e8de579739d7973584e321fc632c8c54d48a301cfd29104515ae1f8d764dad5d7f0eb9d7f174cd5530e77ae99d808744b210c06b9e69b8eccf1ada996b3a97d2f8ccd645cd219f9fcd969a560c1c5eb26a2159fe111a535158d9c8ea23036a279fa373c52765f0850360e0cfdc063d98725b5bd2f28c1caf8915b5bcc560340f8930299df5ecd0f7853be0b0cb3d399385f8fde80b634e79048d4a9d64981f8a5b72087ef81f028ca841f1fe87daac8bcc08c13b959ee1e36c3330ddac9eb7cc86663f09252250b2e733bd9cda9138bb279066835790050b345baa9c389f507ba76d7dce6951e32cd22e3de62e832ad0bb5d3f22e7a562333c4713cc132b15e394be944ab8a4e87b7505b2a6b34efdfd63ebd5a948f4b061332e16aba35f46c1a8f1c5ba15041321abf89f4eac10bf17b1d9d8ae345692b027e2934e0462c1898057c22efe4c44a6ec515b7d3b5cf3399275b52b61838ca1c74538ea1eca0165e3665f9005e1cb927355da6e3d21fa93a59fa09b798b8d3032f7e7963d7da28196cf09895bf82d2947230853bbc42e94e294811057aa9dad8e3cc6ecd95c785a19b2ee5496058b8b1d5c181f573bb7ac6e07cbc256786bf2aa791dccaa51d17a5d8269f7f77f6f7c169bb1aab92a20bd31691f7258982881caf074bdd9e3a2029ae651c186a80e32bae99665268f1476d5ffa7fb92db642c686e3ba2bd9a90ba4cdfa241f78bbb856cd389ac5fa7a68c00a9ff3ed27e2f3f7cb079fc1efe70da51dfa9ca3c79b7207c0664aa426941146c825095022d0985a3459a4137c1ee4efdb6141d3957e272bacd48211506e06763e44dd36ac0a271db327e1fdc9af93da7e1626024677b0e3ac251497b72290ac182a58c041179fc5d98521e0c55b2e8e252d05b68b73c54e548c7f2dbf8d83585954d61f08c210dcf439aecc3ff7c76de09de9e611f136c71476eedf09613ff787c21bcea42ce87cc12eb2bcfdcf40fa4888d5805e8e89a7dfcb41d976a9d14d4944fdaa0296db7cf94abb2b1fc8ed3b72d4748418049ba6ef6a8ca955d2b1997d4953230e95679cfe0bc8f9fe96105d7b52cb8c073d0dce0a3c21509a18587fbfc918a0864d746aa3c07e53b83c11706", "", 0, 1887415636, 1537743641, "4d8f41f40b0fe7265bcd1e62c01234e91750ce921bd2b37363c0c951f4a3ebae"], - ["030000807082c40304c4fef4404f9aaf53627051ba20fcb1a1a23aad0d530afddab5fa2f210ce481340000000006515251636552ffffffff261d8c1f07d7c4b6d33356bd289e84270f6f93fc7a776ed9b511438e6ac7b5270200000003515353ffffffff8bf2f50b4e03ba17ef434dc4d9e27bc721cff46a884bc4ab74b97a2f8d65697c00000000025251ffffffffc6d3fc750a9fdd087b4990c9653a0a20a4632a88a3e30aa0812377c7acf1e5a603000000026565a422ae4c029afc87000000000002ac529810cc040000000005516352520056d70ab50000000001c19100000000000000000000000000001e1a1d2af381737447c196a9af4e16062a4ea252005533844e365bef819008337c36fc4fb61af6a148aca0c28e1841253e3031c39688d9ea14a77d10f5959e975dbbbb7fba62987c41ab0794d8f51a3f083fd47148576ed53de1115eefb02c1d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d0bed1df69485a8018f212523d0fab1ccb6d2b4e730324a98b46bb6478ee38313f364cfc16ecbd80e131432f189ce444f457b8e08807e251a4b137a78d2b283a1e5cafff3870c3a5cbf0bcec880932e4ae39d0dca15c1dea001ff30adcc6066852cdcf60032a3ebb4ecf86e7bb563d0907f7b4e4c8afcb336bc3695950cd0b88020d0bd1f7fa6ffaa8664bbc20d8e37f41107f3b85913fa716a0d2f8bfaf30a4dd02090c5386d76db172e49ba9d4a844f7099a51728f3e9c1bed5037840308f3cf8d0a0185d36de26f6f8e26165df719413202e91eb4704ef979d1041c7f5e9ef0889be4f5b3a20250d3717fc740d39a3da4af1bc9a206301c9382d6f91df0a1ff73980300bf1182df2fdda58bd40145c16dafd64136090b47a919701a02d9f77aee558403132f50d5e01542951353d594653b33e20dc3031fcf5b5bdb7a5b3e22f582a73902091c5146736aab285d0347b9dd094d3ae35654283853e4318993e3f1b4785da702219f443891fac1e9732c4ff516da94b065769d8cf16373d0d3bd6ae3fb1725db0227d648b132b6cb22b0d352e250c5eb019c72c64e6f7c7d07631aa273cb32db4ff4b9589753391dc62fe1ca4eb71a251a51896a5ba84d6dd8dc33a31333ac6250525f9e783eebee55b936221a7218391df6bec78f80d1cfe42ff3f8482ed5e7afd95935a1587e728b3470f872af96e9ec76fd450fe5e3fe66585f798ef1bc25ad5bcbaf1caed7969c2ceb17097d71f195f73be806552ab96451ab1cf177a8d2bd4150b9373bf9b57407561f4ff6c38bdfbbc12a735360e73dd3a64f65db11d71bcfaeab3a6d117aceedd4c788790b110ce891330538a5c2cceaa2a43cb0319d602cf6aaac633703e93b8ef56d7cc3c6103a793f8307b392c944f9e3114a551bb88919ffb4c32b259d88e6256f713002174335af6b3753414756c434121da752117f5921f4cac3a3179c2539a6deff50ab8d9945f95a32ba1f2914497ec35e5302d560bbf04f2c6e03639c519a94504e705bf050c4e925ebed7a87e353dacf3585023bb4d8be1e55b0836bd1e57a31820d22f3bdffbaf6897eed0f70ec1cc7014014fb689678928ff5afa2a13c17957bc3eac74749cadd6ccbbd22e2a1e1ce1c6c644df389ffd59484fe41559a903236cc648098465ffba183bb44eb9edce2fd9a4055ae5d698f59ffaba78104e31dad5284744db7b84c081ebe4cf86250a329c0b9cb5a64352b40a7abe6c1955c4fd85c930a495745ed15c90414ee9377065e88d21f97f919d03c975794302c52cf6e21d55ac05e498bcd08d6806514b0e1d18ca789ff942b4b9e2032aaf9160c67643339a3d93743de6a34c4d2f500dde0d14e33a374e432a2e08c4193ac14be01910799bb3fcc296be16231fa0024939193b3466292dc8317c742c1eef150d9c789105ad10170e5f4e15594d92e0151fee193da746dae0efd8d356ceb291c53ade61eab0921c547f9379f6197a20eac68cec1b3a54ff2805b1c626f5b4d53767e53be91c62c3aef3f3aa215719baee724a4c5169659f51863942a6d4e19440722398dfbb67f16f9e54a7a2015ab6f0c1cb1e90e826dc34664bdce5f36ed2b97530795b515af3f833ff95571ae6fa03e50aaae29c94f1809050e286d0c4f70f81c06cb5bfac4712570967bf83f8923e863710f9d6957a02ffba668de86232e87b076b03b3fe0b6f20c8be56801c1cd2290ccf1340c1f2c6a1ef62594fd532b938b405e21afda5145055f852a55ffd6167313d6f8b908dd26861f6bfcad224116ca78377f43d69314733ecbb43555b8aa202ef03b9cbb496269ab8df969f889eab49c73ac3ff945b4d33446bdd6533d6d93405e5304d53e022e0f8edd1b38ebc6bf3d4aac148db709fc600e4fe23e29e1281bdd15d94ed9223d410a9f409cd8ffcc8302284b4713c267897cdd12c8f20dd36e9a9d9ea5e7fd9bbe643d86d0a6bbf6c965f3be944d5c75f1295e98ef71312a7a15f6128ead6f0d8b969fe7ff916f375431dbab9a6f0ac63c85ee08acabccabd1981a89feb56183f308c92db83ce9ca27b14fad66e994f08aa6909242f6b5d385dbbcbb25c5bde7ab518665f87fa8f1f22c9057612653a5172ea796a5b2544244728826b24088528d848b888e392a450d1cdf42b99c2e3a0dc641330df339538a1ac47334a20e07fa2fe7fa8af515be4bb7ca716e8bdff2724fd03f5a57a665febae50e90aa20b8fb589cc2d54ee8d103a461284b6dc1f749d02137ebd30da6e5d586b2b537eaa4b1b358215c8bea72d3d78dfb5843119516d6fd2d8594c1643db939ec048dbb25d0408f37c082d1a44de9dc183232c4f6532fd336e644df031c2778b953598143b7a9108930aec839d84cddf71741adb31b18c0413b23e60bcb85202e70ced5fcc56394c081805e8567eb5306", "656aac", 3, 1226794776, 1537743641, "798cdb96f2f2370fe9660a095574862f651bc8dd475ea79c29f35402414a237d"], - ["33b5b25b02912947c97d3f628333a4e6a371d53f9de9aa1e1c41a092862841cc2dbcc976e902000000096300ac6a6363acacac2d9768cc1debd3d5668856c7be90df2568c8cc8f6231f0bdfdf733f4775ef019cec62b5f0200000009656a6500516a6a516a5bf8fb3302ddc8a405000000000057d4ec0200000000036300aceedfdcef0200000000000000005c05830400000000adfb8c5dccf3dedb23d46f97fb16299b893c422233c338ccb6fdd3fed05ec9f16ff250175aef57e64423ab71ac76fce79a6e87e35e956f0ec8423a7d97c2c85f9dbbe4e8b76a3ccdc8cda5efb996f10ed5050c32387ee8499c01971eda88880400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fb4e58d73f0bb461d1a5d56ff577333f2697ab7f3164a1cb20c1256b399453b406ae4cb695440290452cb1418621951cea3975f2a02688ff1fbbb45018822d8d8e77f05f0d0cfd13a3115ecb7f48673b95d1929a2d1d874d4f98ad7ba1d298b63a04e4ae8efac79223209b3ce6ef47f5bc03d62c146e927c1691b1cbdb5d83b6020881b2848c7a0ee5d89941869e322dbb881e6df06ef83a5a75e110af2d6143340209511d0292263005be140e1557bc34fb441f8dd56dd466a8100e78fb0b7f79610b03d5d1e63204a3dfaf13ac405bc1c75d81a55d7df4c4356ac1af10a21769d4a0ed67298af3c696ab86e38240308780b40e93f8e61b9984709bb01367a2a3f6500217835f99d1f054fc522dbaaf4b920706659724359356e9c5d6132bc03f4ff22f032e84ef044a4e77ae443f1bfb4f2b3e55b97a53e8a6f17d63893a47241e6af4be0215e1f8469c5564bceb40bfe677fc9d6537462ba23e8007144a450cb0a03319e9031e48ddeb0213c4dfb8a129478e8cf2956815804387ffaf9b15295ec2bbfa0f6b0203c9079eb06ea3ea170c262eeb6a7d503070af897fb26db7bf9d7703a35acafe0683119ff4132170e3e6d628637faed2d26a51d32a5b8301d8bbd6651084c5ddc6b882a661f0424d258ce128515dfeb4069610f21bb8f522e195a89002292c6bcf10ae255eb4eba6c4fb14f7c5686253c5288eb5ae47d6246cbadd8c015cb1d5f9d7c7b71d04eda24e0e5a498856c19325490dc9c7e79006aad670d737ea1c2ba50d0ebaa6faa446881222604661be2bcf6bb10df7052b6bc3c385576fa0f494c9a311300ceadaa3967b5f85a6737ccdc3b573080743d7b8c642ba04f6d16dc5ded6a2438eb4f4456b2be218652dbf8ff29ba44d99d55abc02a599a171c42479a187c4cdbb4ea94f1d5ad1525b0331cec397a52df70dd15a4c1258e37d049113b124ce209246b832b2984dc7e6eed721eac6c7135c0139e0a3f911be30cfcf73bd580eb8a70b58e9dd1f754e657aef9768f02b6cefcc64951840adc7be480048e20f1939ca1a25842f5b19bd9bb8a3a069b3d73e880485878090f637e1b75e1953ae2bd7851c8cca51d6d4d5a90a73913fdc9c0c3cb7ee2ca7fd6750b7160d4ddfe24c9f4bb36ed592d78bf1666f3e6e1c902041e3979c23e9c34c40ec1e85dcaa9c6d297ff3e9b73590c298ac32b618519d54ce35d1d974ed2e77ecb2d5921d4e9d97289f976c01f9f24ba4f2c0018d6cf8b082584ba79f5816167b769dc8a530cc65d47aa0db6b5fa6842a5a6af98777090250a9d7a360bb0cda112def9e00b9a6a3d72167c14703ad278f5affc147f51c635c3b1b18d93072bb421428a9f48092d4b36e4a422851c1107c37120afbe74a20a6af9402655627f07353029a29045d70bf0224bd36c8770f24c92a14af3b3d3865991c3708cf009b256d7b9c8026c01ede7e9bf16c1f555bae8f834f333b184056656e34986c65745670ad5356673a70d4fa9a56ba46b07a53d43c831e1b5520982bb73ac2da36ae3111dc45ddc8eb0c1147b7895f40f7ab5da85aa1d9eeaaeab5498469db7a7d30683f7ba1d92f42eb653df7b9676713bb8bf85b8c829678e57d518f0216254085f809fe040ee46ec3cf5dd6455fa81494cc689c86f091f54024d38cedf64a44bbe135afc8ce4df51644bb449ec08220fec741c4219f229e6e01f31f9338866dd88d2d09d5721d310ed2db2fe6cd756e4fdc07045d5ba60df2f7cfbf53963a91a800a76198ec86f238dd393e1b5fa218f75f720bb80155bcd66c2733a941cb119df089c5d9f018f61c5838f6e44b57434de4fe3ccb3a5683bafdc10131f980df345e1f557acf39c1d1213ec1b40f18c92864da63935ecd1795d287eed8052a1e6a6983341b4cdc97f759cdba34606ba0ce1c6bf4505b758fcca2d7b03f7404606abedd6b1bb2c608a1fb185ad80b6519fd98c8bb9fe492b2817373d72b11bd4a7640e1808194ae0c452415a7dd348a9f1ece3a21e2e00db4c6741075694d81044a16ff5cab5b1fbd72a6fbd5e708e83b84768ed8c142572b77ff8f1300d5c840f30f68c6135cb533044b82bb0d83e37f99dd0b25653477f67eb37fc577cb6954d4307ee257ae7136a0037572d54bae9bb6a0110efb0b71daf25606c3c09dccfa42352730547e8918ae98157aef2ef83854c3a236efb9bb55519217854a80e2d8644474c8c0a67433e2cbd54e14a379e87f7faad0fa09eb872008b7cbaf7c4a2757c2a1a0435dac1952def45fb96cbcea8eb10f920b3f8188000000000000000057c47a02000000004602354fbe6b753f50d024f273e23d932feb7a6f634ce98ed0c5d3bc4cefa56b807a273f1f31a35c25528e1614316911b0ab5d73c657e56147fb965117f241474f04f93debd62c152621a4d1fb0f8a82bd665d2b9c13f58cd94c80ce76f2806e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b7f7d157a57c55d9dbb03527f256b528844e006470298f5f6c6f1fcbc2ac1078ac97813fd4e29fac71f47e4ca657baad15ef51058eafa708edd05f07b2137d54f10a33ebb19e31da4b975cfa8e09128dc236cf8e4ab704d9d3ae6fda8f1c75831da6cb4e13a7d8dd0c23d6c4986af5bae59adc8a24b706505b49b2debc09b7f021f3bfb225f05c1b41ed94da6a94d90a3edc5bc97d07236ee8bd9027012c906f102044a1733bd492d6e3a2d12741619ea3b33555baa24d7c0bdd1371f31650e93190b0463fabe66a4945908b5069726367dc66d92b8c18d28fe8261a1b6db127422efd8dac4338b189d126c029ec730bb6ef07469435922a872306b84ff9f07048986021b1ee5eaab5114f70dd20c59a38beceef66c8880cc56cc228dfeea6e82c65468021822d64ff2d25db42520b5f27d0373a223b30f7102ff1f222a26861163e4aa32020239fbb29e324f39b374297ab04dbac58bb6f4dabe0144086e3bb4516ef1bd770326fa9593294dda0fc49fb804dada4813cd3bc17c8830f118c38cdc5ac8423e27020a728dfb7a71b9733f1736a6fe6d0d8602da31a9d97b720310b4732379585165e532167b8279ddc2bf58acf38edea4c9b2a6f08bc1885fa4140857633399800aa19ac58dc72a216bcea31bcaee7ddd72055c284299b99d777fabdb6cdcf4afaee3aed345932be74ad6408b882def80cda68154faf481358e4493dc56ae26fb5e55c204f8345c9be02699d2b9a3c4252507a6499051a477d928048705aec23a89b0060467657705ca146f31065ec76b33c7c453a4b511b344c86508ac5edc5ef15be7712ee23d0165f077ec9957618ec91effe020e3eec32c43be745457fc4350351949209da7c4a4bfce759c78bd52bda86a5a50d365136858273f642c5ea213fc0c6a6f98a2f19fcf5f98583884605704d37147e184fb64ea00390d94a8b7b5f67311edd8ec89103e941019a6437755e0e2b03c1eeac22c43de82dbae5c4bf451be49eca6c736be2df9b5556cc3434b1174f0417a50111521479c79ea5f2e44ce86032bf001a3ff603ad057796e343323d8c417703fac0416be96d30ad8917bedd631b9ba6d7290570408253b996f13e4a2b964dd6eb6e7856ca40854547dba4a29c36321454d28e3ea72c76c5d9aa3f92698fb5e718edbf1f5d9a9f2cb9c9d33f15ba56ce16da58ceb7c901415b024f30af6caf0348da58b7bc5d86d40d664c8ac32295c65caa93a3ae2a15b9830dba7108eca44e57bcc496d3ce142d1d4e6c4fed43bddb174729c6b74622b4c98c1ccf7ec3ad6e4d309b438394336f0d574f3d4ee0ef03f0f4127afadd5da0c14b4bc0517b6c474d49e85bc14b1dcd0cedc22e998a3e2c0290375da3a01d122c77d0f751b2fc8a2acd9a848c8a9e7e544c330d2a53832c262ea7117f09031e57eddf86dec8c5187601bdec13c242de0f00d9865dcb86ab732e2929992a7de5dd3e2808b5c23ac965410c5e478f5167281b0bcd4628e8870c1b1b518092f8d91d4789326eb127b1e0dbca78fe6eeb5951a79568bb27375db2450edb90d2233c9de6dbf98f05606c8e22c2018f65f6ee3c47e9a01adfd7792dab7896aade5dc305ef9a39aeafe8fb8259645104e19eda3fb6c011546aff7bb451c620c42b0c1da4d078d5db4cb7deb57bbae21a56b37575630bc91c74d8c9f2dbd939426808aa841108600adeb7cec5c1ddadbd025fd9eea7e71eb9fd68b02ed6b7bb68eb2838d2c014a42f2ecf692d1961afcc5bde02eaa19e6aaf9d74b49b3aaa644b1a275ab569612a35f154605bde56d5876e3a698e9b4d3f545a82a2646cae92e0cc01fb0219951e29edf3f235ea7be377b32d8f74b9537e4d81807dc942bc4ef97df99c8b6b1feb1a48832df2b9a82c0f2bb37a3cbd5a803c44bd60fed395a60c7cf31013ee3eec912cd396fbfac05c7f4e8042d2c6c98e8a368f3f78a5c2f4af7f6cca92f2aae83a2e4a15e6dd6adb5f3018991b9fa9bc97c7173ea87c59b1c433637612f8955778a83afd90a98c3ccfc98615cf505c5381af2caedaac77fae5f5108cc18b5edd1c107dcd5388a78cadf502a2e74eb191f3388fdf24818f7fea8b201651b5fd62ed869621e289eccf1685aa9f7c4b720b68929aa43c83bec579d20532cef6e94911d4e064ac6e5326484a1a4c4a05a6bac0a98e21785098c84326ada24ea051d2360358b9cbc85b20136f3b872d0aca50b1b99fdab05c0fe3bab206acc2bd703807c249e10f5fa7b2913a27381ec80df61eaf4597f7f431e4c434830461a3c00a348c6ac327f534bf9cdae0679cbb4eabb7a7f9fa4932b02c36bc78ea4e3ffec143946d8e46d3c6ee8d01078b59127eadfe4e2c8ac33ae225b24b3341ffa94c10cc62fd82d8d4e8e73cc373100c552427307ce08691f4898c1aa33c08e91a8b309", "6a52ac525163", 1, 1435162964, 1537743641, "b1920a71ffc2342efabcb0a8cb9ed3165dbf3cc81d21ef1c5cb48638ee0e9c7a"], - ["030000807082c40304a4915cef77ce7970499d11da432d11c99a983b247c0be086fbfad3d71f5690570000000004636351651b2a7c68fe87daa7c70f1a8aaa32b1ce2af1080209bf4a11c6fe02120172b30933f8064301000000076a52536553ac53a5e79511313fd148f27e117db94f1152c090155d78fe65d3e9f326f8acd0ee0689e5516e01000000096a51526a516a6a5253ffffffff837a9810eedfca95b06aee0d702724485313a213ed14c8880af4223ff879ac6603000000090053006a6353515165ffffffff0153e8e40500000000045265510000000000ea9fc95a030000000000000000e2a7e10100000000bc17b20c112a3d997d0c9f01f2f2e11024282b512f26561a7b4824d94980d6a301544b4e41083861633f969b39dcff002dbf4ede122a082340248cdf3e6866dcac7eeb973b1a77cc868c4c4080f2f0f130e4c8a082606655ebbe5504372302600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035a3cb3ec1e8b6851783cbdac884b2d373fa991fb4d921320b2e1033e81832de4fe23f48efe19a08e6086328bf67c705f31c9eef7bd00ec6319a5625fcb51bc8ffdb0064db792f47c647f917602d76f7bcfdd0acc248c9a094fb6e003e0164ee75769b3e54e34f2144cf3b9264ed598b8508d7a07a4d041c23a414a9d9bf69a8031b2e46548e05e2a60630dd10095dfa494cd2da7cd5024c0a97c3924455ccdf1803016c27bbed405d37245448b8a58642651f6b53daaa38b967cdcef6365918f9870b01e6653d07ad7a47be1441824f6ad3ea8830f29cecbfed4d8ea961da111f871c129901be4ab9158b17cc90d20246c08aa5355f21c71e2a90456e843c9f500fec0216a882f2da95493e3edd4f556ffa0ddf3d8f198042bf4e8b699cd11c273c4609032a9cb431fec46925fda4dd27e9d9c3cc7decfa24105ba36961624528346f0ff30216057266b6f4dd5a6cb6110129f47ce6f024b73ba4362a2effac34fde2aa7ce90310adf2e56347171e1938e7a32b1c13e6d7a6132efd1297e025bd8e0efdf1daf1032521ca3190ac2e668f4582f29c41d3ba9ce8376e42d4b7716595acdebea44990678f19c159a9407d7ddd40f97d0c522515416e5100a1b92e3ed16c56fa81491e73aa007d63c874ea97a7fa4b130900795ce430e5902f78f983e6a55df40a7214481bb7a1e67a682738955a54d59d859e8713b31053af7e05cea7707f4bb7bb85f0c9c1e7d6e328712df2463a0c662fcf09808231a2dd96e6d16f80fb76694860ca127c9ec1317854d932ed8b6a8aac1d078c26b3fd7dc70d1d7671c1a3569ee855635cf12d6b8f17925283f03b0c3ec787172322f31b1ca26aa32e2b76a999ee7fe14e99b796802f058cb11a412e10ba7122b5307d8d6b5855732596e4f2a5e34f204bc733f9c278ad50cec0e871175e9191a413049ae3675e1ac93e86e6c942b0603864072d77d59702b3ac192028fa42229d06268189d31ee1aa184b4e1e39095104e243c78629e15f12a6b7c2e127eab65239d50d64a267b76153e39e6bb43a4dbba64b7d78716152f3196d449ff39eb362a558a9225bdc31ddf6d5158f71d3b1cc93e613814bc41039aefd9b86d6cef9d96be74ef6c78644ab587c1c9412dd224ead0cfaac230a1980d3e8914316e63503f960e19a3a87b74df6b3658c9a7984b17d495c32642a77ab5448cab151ebe86cb67c097fb158a8f13d7c1eefc2eefc77ae44f57fb94df6bfeb53a192b83dd6f69f9dbb77a790bd519ac8e7f52d6bf9024702a60a32bf9c8f62d15128b2e3510e7ff732fc301173fe411245a7ca4e03c1bb3d177bd854d592f5d19a0819a2f958d38f3064740c06048081e82e77193b3c29fd92e9620e21ff8561b45763dcee8d052936a49040f42bac03e1140ac21faa5bebeff19117bcae7dc9765799d9b72c715850580c90a2bb16a9013452caae49fbf2812d1f1ff361699f1fd0b0c66b77f32572cdd988372fd6ae6042e150544dd9fed3b7ba587db487df6151220e00a59056b155649a2b81e7158b6fe3252bddb63c2b078d9a9ba2cf48168bfd5f8ec0f2b3cb7ca5fb4e92b6de0ae5d84bf45a11b1ae008579bd5868d08ae746a5b1a76748110ea4808eeed124907ec715ef4be276c78ff24950bcf8cbf5b52cff7ec142ad4c1c69510c64851f8780e241892175448d3122f5a829edd6437cdd706198e61d12ad698afc82cfe67c14b0bd04820ad95b59e8d6e1c3514f0c39ced95149bf7de31a3256cada3d0930436b49f6d010856982dabba450da369d2568836e47efb1b283e21e6f6cc705c27d0a7dcd44ae3b200391475a59d6961baf6dc06cb5584276b14c917d03b899c2bbb5def006b1ae6a1989b4a7ca0be14144e16e108ab5cae466d5a1d9f10f304c9b1e6bede06e46c74eae4f32df6d691bb9307171510fd8af4f46cf6ad6921c625515df073a7d24a468115f819c7a552573ded8f1dbefe4e06f4ca67d87898333344ecfe30232071e491cfcb4a5f4f2e5bb124159840df9514935deb280bd3a23d476b419b1d22b6a19c25a99f4e4bfd9b8c8e7aaad17dc275da286b65453bc28f6eee565126b670c5983b56214020bc286465520d173259c655e03903fc326d8d86018c216d5e879f0b8f6308ea45ed46a4ccc37357a14814f02684539c58b3d603d334a2a41cd2f8071c25c56a4ee05a3342781473bf60729c1ca334e641dce5519e43d64db8645684994cca682cfded6de65af598fcb9626971583c2ce79a09dd3fc14f3b7a7f2c7bd85558ed638c78a9305f2a615b40100000000000000000000000000019c132bc25d683b8754c4b9a97dc25f4ca5a89fcad3c5dd31d2236bcccda479ecff1b43470b356b81c2d2d82fd6edea402f9a74ee746361f3f2cf31938d6af2e99dbfbc1422b82021fdd9df4d2bc2f19761e703c57b63e88540f5b75c1e04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f1e6fec5e85ce01ead5fd62bdbba17357b146bde5ab4ae183b6bc90aa01adb905c6a521caa0083d9b18450d49391686f7ad63031d54ef11f118d503d163aa3c8f574cba6d5590b5ef5d0cd01baad8375766923c0fd53a8d3e518b1087e612f9a22646df51cf90ea33942971db2783039a8fbbf3d1d47bf0fa205abe48fa9af90329de8a2228e9df32ecce2d10ad697db7cbbe9d7021f5da2263faecae830722ac031f06288bbb4ee893b431c697562eec78458afb7a327cfa83a0b7f6cac3de4d290b0651cc6da5f90d41954cb98d2771ee8effcc0d4902bdff79fd6aa84f4a3f7b40f39f446d662f0c3ee0e293029c319a854dcce3a7cecd783b075c542b8f42ccae030eb44867ab0b4ed49553dd31534a9883665bec536c84edc45c67664ef73cd2c60321cc139e5c464a9f4772ca07a1cd12b31725abc9892d536b0f5bf61308c25666031968c248b7dfd68cdf366abaf448eaa277fd62e49ffac6880c5c8fd88f9f25d0030d09652d92de1a4238617228ddc1c70fd217e9ba8889f1d780a2661ad8e0517b0307f7f5100498c0e17af6ed9b71b55a280df9c0d0cf48f3ca57b89338543d6afaaaf55f17a06f0c482b585b520800771eb2d1b96f9b6b63e88adbfad50581b396cd47c064d7c903896773cd9ecda194a426994687e493c50a46f4ecbaffba7dbddbca0f9d97672cbb3436e83594f37fea638b6d8b3d5c1cfdd4a16ef63c040b20e2cf945cd7c70ee5c8cc89f56c8eddc0c1a13830300079b88160cff9ca868ec22aa9865781e790ac9691ca0a4f1b3ea397b8a774ff96a21e5ff90ed4c7dbb2e711a6bb77f5c8d2bb840f340c7ead591721af431fcf69e77317da2b4a6a4b504185b127826be8200f74fe8a4b439386cc4500cf40aeed1789a5263ded034114e1e1fbfe2407b4cea0576990f4c99e2b0b75e243ee5c76927aaf7592ee219797ebb4dcc93bf5b95ff8e087c589ad78c00bc4116b69747e2143ec0c25150d607a9d24c603461ea4a4da19bbfedbfd5dee5f99c62d2563abc53515ff1dc048b77832b66c86162400b4cda5c06edce49e65c009f69b7c2221d4b91cda797e3848591bb7240898126befcfaff42f1ec3367f5c5415ca9ddd923a8c88bcd08f418eeb2b540af741289188aecd1860a8eb9b27af9e03fc415085309fb8aeef0fdbdbeddb8821c26c6df5f1419cd43cb3c3e5db5a3fe85dca903ca68ad5715b781f6dff83db767e6bde546d9a05f721272ca1990bf134897414cd5bc7ee6a65c9c25519e49a0ed56e32b9a4806ea24815e43538e2d722fed073baf1312d6e6179a73746756dd5dcc719b870764eda30c2b6b066b97bd859a5efd4cd7984394433fd94f788d7953da184420259635bc803ef54d7ffd039395456e753decf83fa4162655226b99812726cc69b97781c2d8c58edd1562878842f031eaabc6cfade445ed04b5277b99e814c418aced6866a0245bdf04770796e7bbcb5ba737d0dfdc61ec8eaec8f13a1d82091fae0936ff61d8de828c524a23b844d23a34ddfd0f218bce97a88c26bfabf0c45def67c0061b1f5994e45f5ba39edd4bfea9ed125964b9ac166375151806cb46f24dd644c2d5a9993df86e41f7c9821f8166aeec2272b8bbefc70788730ace8325fb6a856d97cd4752f3e442acd30428a2eb84716a7a17f1b6ea85e2004b3a88dc883ae3c4918abb34232663cf777443ba19d241653b36fcc75a9b4e8dad280347460a0036025814e27de867755b329b13009c22972e82ad8e6ed15f58fef0b27f260565535a7387ddd3313416cac001bbf19cc44308157ab410114458a37ad62c2f6372fa35b7a9482e3af51476357ff97ff80375355923e1a5703a543f9380c619c413a4d620e94d2a12480adc1607baa2c25699a60a774d9fc066fc5c1d530c594350c3fe44c90c9bdb8a12d78bd592c3db443cf0abe6af5349ccb594248399752df5156fd9ec11e6e1138162649d776ce677a4875caf040c5b1cc6f6c63446a08c75cc37ad11dc63481d8eafe7710761577574749f59d5af0bd55626a91a0f9d6387b06f981b64d19d988c497045ab31b7d273742566004bf5f21fa2fe9fca906e0d929f1d3be6273142cbf151d658309c916a28ad10762866ccb4d1c8e417fc9a76168d62810f1ec13806a953463c3da2429909a8f9b1324a5691a1a88bfd2d8be5bd3de4b1b914ce1d015ee8d9282174db42f8279d4e5aba46665c74b013e54929e43e91975c6677de9a76a663b01b2ebd24506a018a3ec0c91936994c79d4028019081003ae861555f000000000000000090955501000000002d8d4ed7aa8a37ae42931e32cb2898a2c8d6f8f06c5deb21d009709ff066db3969be98ad2e356e1537e7f585409c32b59b7b0cdaf86b9b7b1bf7cca92f077869356b9e1d65c316d6f79c46ceeff648f3ec87032262536b279bf40df909fe68140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055ef6c181d58508b250fb7e3f66b3cac13fa419dce050a6f823fc6f84f811c43969af9cdfd9f9a9b7967320befb768d7cd795398b4e0b32a999af36ca06c4d8ac68a619c9bb523e7f2204a038d0ca406ecd9086966998ca16d11b32d78a23c91fdf2be41dfefdf4aef9061582d46be7ee1aa8f535d33e00ade9341db884c9f780225aba733c772407096ab6ebadb18a387d6a42875e453a488c6ecf79213ef3a6d0304d18c0308edecf1fd66d2e6628543c1aa294df79e38b41d3bffcd500232ebe80a0768e20614d7b868de95920cdcf6a333721d49e7116d7f58b0634a443e0f3b9ed8b7208b1c882bfbc69bdc7ca9673e4af26c29b3b76c4fa3407823fc2aaa722c0222a024ce0275027a73e501cf2ca6fde0f001320c62650b010ab05abf6b404a18020b6fe98dab961dcd1605f71086c0ff83780f65d9f4bb51bcfb97e0c5744432ca030228e10fdd31dc703bba803eed5ed4335f5feacf33ce6d970b14af761658c187030fa090c0f1f456f471fcc82083d034a091f6692d48b332313281dcd7fb693ffb020f828efb2e545990f8bfa87b47653b102b60971d92b8e0c381ec16f1a5fc7bd8878106b1dd10c71b1cf814689d849763e7fbf9964b1276469e9301dddbc6cafc84a82852b7ac0fd23d45ad4fbd6c62d6e7b284f09d226c048acacc22bb6b029bd47ac3ab7350d9c00c9a1cb5be4834834a18eeb2a8134a27682bcfc9c31829c0c16f5117cb664369da81742172f97913c1cbf835d03f314a7799569a5f0bc74b8f1de5ad490c38cb2da4790aa2b18ea93743b93dfd837d600b64b59349a2f0f8eac08c208b4a11a19270a96dead71490536f66ce7d818af7cc2ccd58cc39908e6df173b6b65827f3235e3ddedb6b2ef6b57c209a60c1c4fcb4b5812f07fb4f9f5f95dcc86984f14c941a05d5e6f722711f61d7e36531194f127828f8f7d6de04f18656a50bf3eefc6c30bfa3ceabadc73b06fb1fe5eb3a80203fe451cf8b95eba070a53144be64706f9e55c94fb4c03e5a765848bc2660238df53ee3b157b767a61069691d994d773c3bfcbaf65fd12d018d902933376e79b2ad4bf496fbd4e0b0fdecedea37935d7ff8c264c4c84a4e9763681d4a6477fc2eb27a32980c2c499629464eebc94d677cb8a5df066585f84a71fe6cbf00a8824241a55b6ca688ac7b1549e8171da5665300f5579e0e4f078b12a7c55997e44b0dedf274aa4ddaf31ed8913f5d8f31a2af1a957d780009bd9462c1fd800a9ff6b17e19b007a66c122eecf64accd6533f7589c6e5c2f50aa6094732b8bd213fd49c0ec699778a0bac735ab2a81986908e7aa7fd5389b487b9dc0a03023ddfb50fc60f0867875f6d77b8f503792c28f838d1577646d36bd81eb6905e0d980959c1ed449a8ab5b09f64d3f74bf3bb560a03c7d2be1ff9818fe5018c4ff6edb08a11cea31f99ceeb1c9b9b458955467d0a4001ff39932ec795f8b02966d8b5ba5e9b9b7cf4ac1b4ee2fafdefad6e4d6c35ce8a01c5491357085c7e4ea13c710fb353a91a62a399310be4ab1874da7d7a9123684378e812940ebe1954a58f8ea5e8c72e1d8c87e67a8576a58809b91105806a02d0122630147e60cf1abf9dd5b39f8bc3391ecfe60927d60f949ab3c82198ea3414bf1c071d63ef4399747d980f3a68b080f89c551ec03aeb29991f7631379c38c8a1c82a2a8f55493d5cadf9addf3654f4a39c6f8d5afb4eb36c36321cbc4f2437db80d0cedfae21bca078163e45fd6ca29a3338172dcc6a0d4980193a1e8b2fe670ff6fb3d993f19fe9ac80a04c45bc6058b1977617aec59ff50acefcf3512d788058deaf6d64815da8cdac8395e53715846b2eb69d2279963e05de62e161f9dc55d9d84377522ea29b8f06bb2bb5c7c88efccdb06730256c539eba05da7aac2789e361312d530552efde191864031a7a6a0680d8d488425e8cc458f3be4517092714ba35d177786d9a2f8ad69af9e7e124f835d3f80e43b8df374f845af671ae0c2392423177165042c54313b43ec254c0c987e84d575ece63d97673a054467389c63e564e5ea67f5997a720b60217a92aa9e480ba450e3094c770c27aa3329296990279b7e868aa5cf48e557eac64485f286a49b9b0e32d8c9ecaed5cb924ac47c304a0caabc862610142a54b61a6371b9abd77191912d2c224c7525d7b331f3a4574a387a781c53a5da9fe7db94e8580cc6fd5c72148e14719dc014f03adff15bb49c3d7b2c671154be637c465a1c1e2585f0c3804d403cfee2f63535513e3e1fa4b9bf2f468e1370f0565a461bd7ddbdad9d829e16c77c038652df879fbbd96ca345f6df6f4eef14cf1c3081d35d0afe0727e6c1e1704d2d9252d232a3aa65bc9732ebc04759a18f094954523ee592703ee218e6483f56bda954431d79c53fd9ce002a0b77b04", "006563", 3, 1232283717, 1537743641, "f24933bf3eafaa8b22c81adb0282858ee8667251dc4b3c9af5e1de2985c5d1cb"], - ["030000807082c4030178daad3361b257405660b00002501e02350b0cb2fb47f84cdf539e2893ab35910200000004535100acffffffff033a326e04000000000700acac6552526ac03980010000000000c53f1e0500000000016aa650e8f400000000032ab7cc03000000000000000000000000bc02bc71512077330486a0fd1f53ebcd72f21e138e9e3f2d30bce25f0559ec2712283e939eaedc6a57e344cb621742cebfdcf77175021b5e9f6223ef69f2771d59ad66becf4d3592206c824924eefd47649af92de33373aac6c3d0ad16da940d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090a11c6dfdea22d4ffe7fc002e7c77cdcd0ce30ff7f88b5c54b07b6980af43fd2ce82195c015b7945d6cfe0447d323778cd843379f40588c5dbbf867e07a824344a49bcb0d320e14205422f0d14de391da028472ef9de0ac60a9c0bc4fa2fa0fa4a517dfabfc9e65ab017c71622fa739716ffe865245832a8ecbce99722f9882020da301c2fb4038532751a428a2472bb3adfa0260ad01a26161541f7611a8b75d020162827b062f5b017e14d54347803b55eca1698d8c2082875074c6f7381e85b10b02a67cadce78c73c4f99500e8a8e8f741c9a3497076c28bdb0405101b447d85311fb2211fd6e6b9e4469cb2edfd2c1b50cabbf61590de2a32e65772e8ee1377c02109c80e01b0205d868a451454379611a323f2228ab0bd460e1258324523774740327fe88f84c9bd068027e608031c5bb0a7bed0c7433540d9dff51c131cd0a9b0603065c9a44a84ddd3ac9ec79c0f1e45582299c8d6759aabed2b5b40f09c6f3754902121849b6a9d60e312d4db0a3a9477c7aea3d3f3a738ec76dd9101bf4b8a304b6021cc1854d6bbec6fac68bf95147c0122a68714cb8afd82ddb7376770ed48eae4f917c778c51b4d0b06bdc68b10390adbe52d79b1a55334bb8e1dfe3195ce620485d9ea58588bce5aa399fa550c0a45a976d81be13a617d1b6f7582e0beb459e59bd83cd9c50fb9125d0954db365c068493b59dabe17b8dd10f3aef0d7c6e7bc675315e5a15521dcae5d335f085d00c169c91a50c178849686b1ee7af8f44e1cb02abe36fc4759170178040b4838dacc817792b32b21ba8e4afdf4c918ae1239a2bab8f75237d8c237e0f7b2f2358bb8c59fed8b8394b65d589143b161ecc976906a0da58162ae1af3133d3d4a2c11f478c1ad44b8713638f24c9cf9a7145ed1922d2a724e954b14b948cda81c6bf68d25a0917c99bb0c3721a3343ee4d506e714d8b59f40698dd5c0a2c5e337e33f763ba252dc75bb400302f67b5e8259d51c8fec191a8dd1addd1e9e497ce1832272f1d34dc04232b8872ca934cb559b5e7ed34583e486406985335479217e41fa805478704e7e85ea7d972c19a8f8fe108272c972eabe1cb557166aa617f2d8fffaf87601cdd6f17744b22d7947c42d34ceffff4c5ab5e136b5d5bed8b1a79b9156af26109005518e9b8f7f28467cdf4c9da2eb6d121ba8d4208078dd48be0b40b4c9cdcdb224098da83c9074234fbde41d88d1d01a8bd44671156deef05e5455c2a7de7b8693b1bf37e03b96772013517fc51009cf6e5ba904f858e8855df6837fb2c0ae38b12ba586cdcb44da4ed7c93f4ec249d0ce64db429f76d5bdc7cf3c77364390095024704bb203672dacd5ffc7b0056b3ccde69efdacfd7c7a07463995798f38b978b5f4dbed2af3dfd97234b02ceacdd9a6aabc9003ac9939831b18c9833c1d39c7b3318c3e0d6ea9900d04ede4fbd4f1f68b49adf287e3bfd5170c0afc692618d704b1fe7797a7a2c5fd066d8b6759e01521fa92acb1e30fee973e63d4992220499204e9985a929ff205d5a9349c24182e3d3f36c55c2df31d16323385e030f3e4fb78cc94e643def5e10553ccaf54b72bbfb8b3dcd9aff2307b05a2f16755c9c1b9868519b1ce84da85566533c6b901d8cc006f13e3e2f105d914470d9992ae291e63732567b5e52c2a4b244e840d896f853c4c1d3dc7a6cfdcd7e15c98fec20bd828fd626a6f2c5bdf64e2bd25b7b7b5a95d8e7c51e1b2447b0d8c5ac5b74f9def073f17f1d7d4a09872856f375d9d04344133c1b3708d6e06815ccd73999f7dd8f9e3a587cec0b4d331093ce678d5e8f1afc50b659941b7a7f9692172f7796c1955b4f681d1f6019c8e20a09f5ba686c628d53644b4475a08f5da8b4438560e9fde6ed3b607497bac7597e76d9e85c86c80aac4629e13f76200d45682b673ed714182521b409ddd4a730ecc1dd5d852f0b704388924de0ef7af2d217825d992e8cb570405158ff7f0efeb208b29c07c09787c077753521d88dd50597088c77df8026b84439af41843ad39b219741feaa8cc1b98ac076c0ff2449be2f37822f5aa96ad80194974b68550027289bf3d42af9c2f75d6cbcbf994dd82920bdc0bef66eb14f5ab320c54e19fcc373cf182af779529ab406f9e42d328bb036513fa19aba855a1cc5d978bf920e8ca497a96dd2b898c6a04bfbedb6dd2b3c333e3f4802e975a5eb30bb514c9b8c11c8d4e90ba62c444e6a34ee97ce3a58bafe59205629231fce04df8f58f1d8854fcf5b0497b2d09b493e1cd4978c0ec7422115a00000000000000002c28fe0200000000ffafe7dc915b287f3bb0f88343a69dfea4687cab9c41e8cc8731fe2bcc411831328088a0e19a611a406b67d612bb9da4d1d0c60528ee6a6ceb72a4b1d7a5946c2e77b1a99c0bab7fde8be42b5ce9ef640a24e4aac7446e9e69c43d6370ffdfd500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000403414c86f13f912276313b5ad3765e3dd00b7eb7134946c52c7d183e13cbcdf29206d9ce7e263268d6742d5ee92c2a2b04f1afe4b73c2d1769a7c9257f5682222ad1f1f9ad06d11c58673fa6713c2050184a154db36323eb3800c00d705f07fce23baf2b298d238f0eee6b1ba66bd8104c2931cdc42502723a8a6fd12c05c13031a5934fe1a43abe37804557f6c9cf577d296998a1f69e96bdfedd6a719b264070201e376db9df819f72b7620e56a1fad38b6b600b726b9bac54414fdabd940b27a0b034c258ef40424815800061d2c20df0549022cb13b8e7b61d885f98229f348d01c4b98224478289e5ccb3bfd4bdd6d5bbe39733635c7aa14acec45dfdcddc4570315efc0131d4a40ad983a26805840863f3c72a8b5bea43008bdd5a85d818901190321d99f3f1257a151aeec966d549c01aca89ec5630e687d720eec475b41c09ef10217e5b630d606e1f218550f8566c416c757f2e977e9a121acf1935446370c7eec03232a5c4628604372eafb7782dc5a76634b87801c3849940029940eac117f64370225578b891e10f7691a73f8afe4ad8ab96c28ec5fe8ea30af3ecfcefe118dc5f0dc4f5ef98f63d6b15042e1793b678eb35904bc8803fd32831a8d0d0d36a5ae30799663a8672ec72d9d69ab17b2c82c2fc2d6f89dae7c2bd41a233d44be6a64ac42fd95a780ca83b9fdf1ffd87ee748bb966b66b303b547a46f003b4955cdec0650399d9ae41ae72f824f0c96988d866f68bd4556052345dbcb5d09d82893c10b6e11f129c23cf80b25817e6432a28102c42ca72a95fdf8fbb5a176319dedbb866c5b4afa25d124ea786c31f6b686da7bb5de2e69ceed9689def9c2cf5d7c946d328d9274fa0988283244898d3c6bd0b3823b86a78707d26778135dbdb812b529e9e04a4f3230e8f575736ecd1ffdc5a9d8091ded9a3d96a48404c15af23d09afc0f0bd494dfad86aaedf14a576ab092f16640f2e10ca0ecf980183c6562c2ad8e67c629ea2d8169619301481e29c8be2ed3ea0a3122bd49ad2b2820a9ef23d2e2e0a011a089475d6b01b46749282b955b43dab03ced18be29e4c79c39d522dc6ccca0b8f5f2978011d64b725cb34cc5a2bb7d7e7b0072874057ed34862af2b0ac3156879665b49b60addc1eea024daead794089fb5dfe371ad13e5f1d9dedc023f11a8096d5bc35ede3a7107360119c85cbd7bb4f0cdad49418cad60b395cfd9ed873b3c1839ad64c69142f11c74797d1bebddec55366db471b74a26a2960ec8da8224ed3f913cdff2523b696b2a2927ab39426473896196d2b81b79ec96bf90ce06591ef255145f3c481f8ce22bc004e011e4726504b7d73f463269ab9bf9a9a63a51cac0ca85162895343515452dc127d45492df0e3073c80c434f31f1555e01bf31b885f8a7de4c1d542d4ce2e53c91a39803cd3fcddf8c118e5ecce9675c8538edd9d25267d42d2a0894e25d3cecc4b4a54e8046f8da05eb50291862069ec6fb54d0c8ae3e9782ae90b1538fb4be5934dcfd476584aec5c628cdc39257fddc8ba6452ae4d5c6aaf93bd8c11433756cd83ef92bdbe86c418d3a6f0e0c1395169f3fde27aa2860f009c199b59c45d6486a7fc71f65a50c80d93a69d7b339249ae6fb4e4c00253b4530bd811603e77c8ed7699cf610247640641f930e7d074342181b525269e0300c2d2b965d809ba44c56c09a50f279097797b944d26155ca6929bcd7f5a285c738c0abd11f2dafb767d658c33afa003db74eb7e176e6a32e574fdf13429888b83679efe883390a33d81b2b0f0a9b1e1b661d68a254dc5725e07d193864c440de168fbae2523d6e967bfce2a97d11248d5f4bf97f0f982a3e3f8ed2aeb0db3646a30dc25719841485fa46518ea0859a48f4eeff1d1724d07b4c07938effbf4f71017f03c1ed73cc3f133d9f2082972273f80afd0dd5c201caf15824452a1da0bf02b379e70a9ff785ef18f67a86e385917e14352b46d29fad2188f874328345e645ea213d2eaf92f7a883b5471033e821294b04777bf7fee20f3db25164462321f9d0a20ac26f065733a735d811c24b3965c05af868f5868ffd052c496c3125d6ed0179216a0e2c918f2e40856a17348ac4d2a33a32342571042d66bf027394db45f4c277f7b8416ef58956924489a5c1217e29d1ce76b9cc62f70bf4741079d298c4cd0d75d45655a8b5a59937089af29d538ce9b48da4fe7e2614b666ee7c4a8115a22fc50fedea5fd4990b0638542708be372a83a1c325623d1d8276861df4f447e169efd27b3c9047e8432e03000000000000000000000000f8a201db54b3d18ec19f26d99f8f8c69de9584c24aa3e1fdd4bd3edac785b80678f9e1bec12af623d29d39d48bdf273dd606ec24d0baa28fc87b4fbd937fc0d03b80a3370f471a4150320e330161f27b17686e225371d3d8ddf7410664be908600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4537c3f19fc05ff77682c8c43719dffbb709085c43dc4405cada274fb6900cd72954574c9e28fa0d8a1eafcb16998a541c00b77b6f6901ccd411a33c3cd8b5c0b5b37cd3cdd5105da0c4b5a6f8dd61ce4c9fbf5e252960607b303e6d6c020d3655b5783ab088c1199920cdb8855d70a25e3af28f05ddb16a14fabdb1e0414dd0203e78f401964c31e240d16aedbc323a32b3647bbb64743ff1d4c666dcb1497630203a0181f2da8bf9c324f3c28904a9c61e3e68f1ef33689d8c28ed17cfcfb02000b007fc3e6bd831e6a718ecc44a35ca0b7f6c6042f3e37a35b94a108a729ddff4a482013e22215068ca3be402cf984756a2fe4aed13ba4c6f0208fe701a5430620031d1256092f0c163566da76e68dbfe130cfde73e91c93ce99ee12760258650d6f0214f26b2874c159a34d3fd90bedb7c3d98e11a219dff8d2a8d8a5242f14b211f60203aa625c4b83b37bc19acf1eb2289f35e7ed89b52918f9623a2de7aaa08f9c69032d0a6e2cab30f4dae6c6a823094a5d3547f456bff36f7ef9f851df09a5e89ab8022b4a62268971083bd3a5dfc7f234d4f67ac2dd755ff0f963cb021cda840584ebcf56af69d85e840b99e8d872273cd716d777f015358f86ec63847b401f25271e687631d35462980ce4764a198db80ac3882bda57c3d114add80d4f89f0aed67a49d245d39675ac1e001afc65c0c5bb9060eb74e3730f40b1557e6afe1dbee9e20828f8f21416387ca5a915dbd560dd51c81ca144410aff848cd6926aadd835a6f1deeb4385ae2e4646e20839bc076b1cceecb9b070b6249a7d2afd57078322e5b4482d43a89716b542f0f3e6b9e35bb3fde8e0125d2612ae5643435f56ff107bcadf3e9d062c3d6ac819994abc8e61ba1b37d9834997f94bc302030bd668ecf2292eb2b65ff3a919306f296377c85c6153c50ef1501d52be749d7b2b25a7d7fb8e31186ce1b8ed69c7349837d2c31ab723aa287c35ed342465d64d6720fa582619e3d2204ff7621e6a2917f852316d5c47f1d50caef1a40513706c65a847d3e78a7a80d2eefed095ff929532971bdd053a1275f5758c935e9586693f6ccf701dddfb198206a044fdc02616e18e43bc43d81c036e27e27e3f6e1b7d74d2d07543973e63dcd4d0391528a3e99f30c50c471a99dc5d40d5f9a534c34eee4b8730d4209416ee84db014f2ea54753990a2b66f1d4e2f147c5fd5ed9d45c5b6107522b214ca1b38cdd96446d9a38e00d5d8f05d4bb35b704073df290e9f9a59352fa5e3168f57ea5066e14bc7b517515f2d59a5a8c644bbaa3b6e088757aee0afe44f3da5511626f404821a6b01193c046493196a00ea1188b18c1f4842b4e63a686b52bae4d72b3e7dbd2455e5e01f0b5519832141c309ed11b479d3760889e7cfec626a65a08c95317a143e072e12eb472f8e2496ce0f3cb77a98b75d4df11227d091565de252c4bc7dbca920c9a902cbec648d0763fc6fa9f75107e460e0c35b767044ced75a2b2ae0666d0d94a5d7af4574abb261f4cda25551235600072230edc199121bc3b9181dcd3c0d03e20731001be8d41b94324f4f0ede51128a8d01f5031b1d30ab1d5e73f878f42039a2f2086cf18daf4e5b46fa39689cefe043ae6f5647817ae18fb98a3015f0a08b8498b533ee54e593a37fa9bee4e1c650d60341abcdccaf8a506741b9e1bdca243b6f57382135b962de641becde9d77a217337a5ff1a038823207909f98f391dfee6dfb21505eb0d44c3abca314270cc28a6d172d4e3aedec1308a9c83d1774550172e7694d0bd07e6f29ec1358fdba229f21b9ded1c01a159f1ef5ca0df3d1216806635d43280bebab184167657c79fe2dbbe35066ec25908944f067fe8ff048f46e82ef7e69a610b3dde9ba32d60e559353f690fa085130b293fa2f3af7053cfa92a5486ec8a4b3d3571f69f9b92f9f885ac7ce49bff2dc1b2ef037ae4697fe4f14de5f51d9d98c551f738e3154b1349271fd4ceefe5e4385f33b8385c4d772c46f1b74867c7fc1c48609ececba1ca9567ef2b566f71c7a511a1c2682516e653f0e03b53daf38f905e962ab363cf43734af9566c953a308ed7af15f29dc6b8549c85e57cce6c59a2d99a6c34d62dc55304b11565dbb504ed122371c29c1b89c93a3115de87c6e923e151fe89f8c433550e5b136164c9542a0a56bf0f88670d8d64d464a99f94df9ae17ebfe855798059ffefd3465862250d95f43501eec628ab71bc8ea79fff8e663f7f79960f37e39056228cde59d1f14b1a423140c29280345d7b1303f2a37e8a042948aac1c680887d2433e630ae75df6d6c647ca9ba444df1bf0693e8da53f5d01fd7ccecc533b69d3939d6ac4695fd587127da1f7b4b65290f35c8b16998df9dfb4df5bb76c6b9b94c82bb159545bb43692dbd040f092b5201f9480c", "6553", 0, 15429380, 1537743641, "fce8edab0269ffdbf4e5be4183b1507230eef931f1e287b13a93efa88d906fc1"], - ["c8e4a42d046ba593ea54d55fafa72694189a61456f365474cd3a4934d48c3c043877fd146a010000000763526551acacacffffffff2f0ba5d214faecd8b387e8192ba11f96f54dfd49d6ce04dbd794ab728b3e345901000000056a63525352aa924a36bb1afb5dc68e016baeebab372fc3d0d1d84973250cfdadfe99f062cc5844b6300000000003655263ffffffffd72b31c044639096cc0ed3a0c606881efff36112a821fea9eea0c7cb2c3bb9e8030000000465635300c28403e303f2d92e03000000000252009d81a302000000000151d8c57200000000000165352e5c3800", "5265ac52525353ac52", 2, 1138111481, 0, "b267850e01e0cec4aa2cf21cb548b78161de6c32619028053792501f52d79c0a"], - ["030000807082c403026f3f8b4f48834c0584c774b1e01bbeb3a4b59d61e78a98df3b8d4b38a0778ce000000000096a52510052ac6a6563fffffffff8859108bf442c1f76907ab040205861dd7be47b262fdf6fe4d3dc4d9f36f96c00000000060052ac53636a37133d69020c224701000000000751636a515363ac2baee103000000000365656a00000000959e431a020000000000000000b0fe640100000000071a48b8a4587f2a9bbca6935faa57c19f2730a13341c1b348ff64b7e987ca525ed8a3f62ca03d5998ab035ec69fdf97602c3dcf92fa66d965ab6f274ec3371a6f6cee20c344570b19d82ce16527c22313494a0b756de3377953c190f393b279000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009029b9df2c430fa1993fe8903d6c943517dba33e214a882d2c167a2c3e36a705357fd0d19bd81d76ee6f04c1b8ce25a7c6139a796cef47498622be71eff9eae12feca9b358f18ffcbc30df11600df0eaa355e4016c687cc169c64fefed9386bd82f445fdfd3eb01118adab127509f32a3fa1bd9496d0e45ab12e82e83eb75e960317cd5538e4a4174c279dfaa3566359e1a83852a398778ab13ce252675b93cc550208f08cfbc20e3d972476caa41b8ab0cd0f447f0fbf6c592f86d62bfab6b330330b04afc417d050f7d25123657b31ceda32545df3620d3bc8e59d8e175bd042dc8ecde955e26bd7ffd546d79b2ba21e462f91d3a104181691ddf9677f7b49bd18520300a90e008382735acb96e7e200389a4a4d5c58e5967eaca32e6b831c0fc86909032c95db004ae084d7030de66db3f4e8e477e8d58cd93d5184cd86873922bce79202246f4a5d1e2c172d75b9bba9fd91480c2663c2f230fca420a7a4ad278509b655020355baa04e6a7d5f6a717269c696c443dd50e7a3c7b83218804ef6e5aa91b9b80213294d3481c49b741bf442109e77650ae1a8f145f7362c95f22e181bc56c9942d54ed31c2cce22db0dd85d73a47bbfaa7f147fe597ca42dc5adfe913a5e6a4cb3973f34e62580edf7cb1799444677c4dfccaa848db1f73512fa03e7fbe849f6a1f383c75a4300a648b866a858d43f82cbb7871f3d4e50e17d05af35a211a5423af008ea67d87f6725417aa7692237569b153dcbf87a372f58a1eef35acb85c45b2cba4a44034dc9bd5cf66d12bb48ae8cdde3106d32245c91c2527659374a7c2df4d8204220df36601d15246c2d626fbd1eb9af7340285bfc91fab151502820c07547b2d5f268f421b85b835e43da4e5b9376da801ab3b453344bcb955a9db58453ff3dbebf136aaaba32a1c411d3265a0b40d1562b51c0b820744a335c08267ee12c8145cb239c1249ae79a31202dfe33176a794ee7726ebafc2eebc325ddcbab02071f4901a0b00125eafebf55e70f3643e7dbf13dbfad507b0c24203a4d82f14a6672f46fd22b35d1421aa88a27a30feaa36643ea2f36295cb2f3f0b5cd9fe1b2c6dd59d87edec5efab9ce09a68337fdcf8916f390aec4b3516d555b4246e0ff80609d88d7cb2d20114e1b757e53f5262844524af16153ebb763a027344bdd3da239dee927be4a89972c9878b220b371bd00b70c5ddc0faf0eaa35f4c8d4eee78fe17a6ef9ef1f5d58f06b59cbc3ba109eddc6e539ed35959c468007c98b35323a916b7432048af62dc3a989a53b8ed6f07fa06b7f4aadb523c8f7528157ce609deea40755970034d8df82f9336a534913b572a8da31370e9c79a11cb44e060675eb324a9706e89450aaf7a831974e44797a1e3539a0543b4c2172bab01bff7f8e13bf5a84bc3cf2f5755113fbec260f8d97476870ade1493f73cda1edb3472282ae8a78a278f839e2d7168c8b8f368c7ed6f804e4180c9c46a6447c4db4a56b2766fa5694131471b9950ac3d7a359e4840e754f160472c39bf25cac57fef6bbda5502c849cc669a2e678bb2818e44fedd7a701911fccb3713ea93546682c8954f72be3d2f7a3491a91431803f033063091783b977d704bf7c3e3fd3c5d8235fc17ba46f237439877e7da54997383317dadcdad9af76a4819f1560913fe055ce3b6eb6c5fb75752d80f25fae16b2e263523371de8b1945c145e5ea8e01213b237c7be66a32b4fd3d864491e19b43860bf80604e01e7fcceb2b477269346acb56d7f140b1308fca11dc7f7f77213be3bfe10cb14a31dc388e3e3d10917fb95109b75872198b85c3a4f9d876a29c823a305570d6b49f2accfd20d5a787d7c8fd661f28d87c432a2e6134e2dbc816b315235889f6be28c507e29f3d96c56a31dff02aaeb1480a5898644b904ac94e9e05e539a8f08ff9ed5895ea94417cc3f75ff45859cac964a8fcce4b3194f31ed051895c3c43791f52acb1953f682054cb3445cccb859ac2d9f991ab00a9ff99a5d96da8db9869b4a610c7ea4d336aaf26bab59adf3fa4ec4ad06672d301ca0379ec4c317d964d9c080f3d4ce0a21caa608c89bb824abedbc6c9dbd7d518b3feb8c16fdec69bc5ed1da8d179f04a7b009b5d58223c63dcf18f61707768249d6d1a6aa05a764d00e1b62ca57ffae807891849363605237ef4234107ddb412bce623044ef4e3a861aca48f5b1eb7bd097bf3c01bfe35ba191913a80ce4b86da384f5e90f43a4cf8ad98691030126b98ae14f8728efcd3b5e00a768f9761dd4d4a4788bb4257ca1d04000000000000000000000000239800b727480a70f4a329c18fb4959b795b9a6cef42e89839f02f155069b1089d2d464b0e461254412b5925e85b93999406301731dd24b6132a8437d3792b429efed981962d793c28f262e533510bc50a0c6df6448ed5050f8cb7b4469f259900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d8946e5dd09b31dd270d424f56c33fde2c3e43640643e945d3eebe11e189dad9dc01c1021bd569de5574433b79ea541f7dc908af3a31d42e116ad12575f44bd956196d48676986e49ceadf9e98427905f3681d6f046f44c9686f0793315a3836af90a1f5ec14fa43e4c0f896317fd711760e9142433703201d637bee649a0e44032cb34d4ad1e2438b4a938f2296dc0cea590ef9b8fe9cb1b1c90042239ac7498d0219bcca3f038490dd54ad4c8c75cee60963f0fdb0bfcc78d09b530a99681e21c10a08f88b0aaae21fdfc89bc7298b5d051830d709451c317d5ed2f00e8ead6b01dd8673721d871c5315783d5e4f0844b514a959db50bb7b8fa06e2a2f53f9a55269021b8fbacff215ec8293cc3a334ebc3c3220f6831789506e42e91ee204cf230be3022b8a49b3577c8064cc98cd587e395eebd1d56740914671c45b74f276407521920320b32386c252ef3515ba1dd2278d927f8a1762804c549c2874587817ebc6b31a0325f369a580b6bc6f6d4722bd31028ec935173f7887b282ecb152cdeba9829184030c27407498fb2aea9c0544525f8bd3e870814974d79b979f8fae00ec32eacae750f25d8dbad75a27fec3b2c200a2cf29a59fc218e33afd0779cefaf37183bfcf03c774a970eeb9835974ee646abb3136675d8d696f4549db6bf5abaf92bc7ea6d1f31a77cb1c81a9b7d1625d98513da64404816ce43df25e0cb10f2a3accc4b9d9548963f61acd3e0b1039db20ea18a9d4fbf3c3a0d7bed658ee7b328008c277f4e862c4edb736b58895fa545085acc26a8f6ed0d53f5bc8e9ab3834edeffe8db67af8b0b741fe8d4551cf4c02120aefa432a33e89be7dc661db55539d25df539f143f72552106c8c575c2af9b9cb793667387563eab11c57cfb2ed11942b42d8c72e5fcb95354ff22fbc26ef9ed58bbf148915750fef521752096ad8cb7a271d6ab761522566a4e7d87fcd9a0c272eb4f6284f165249ecc1c382b6174b58010f166634e5696e13f79b7dab9b92542d94563021e56edc7faae44970426e2554d79d4baca4149de739c03b363d7b3524e97afde22544720e903094a45f8f46190629a34502dbc091fbc0c86f687036d24403f82c0f1673c978d673198076d53b51ee52750e04b873fb9a59409cc5fe37d13d2beceac8adebaba4ca3a46d434f0d8c2334e77ccd21e825166a392fd5572f2aa46f681e3014a08e49166d380a85ef8216ce04c7c919a2497c8c7e91da18747169089b7bafd110a53f110ab93cb0231c2f1abb3c7ffc4ff97399edb40964f35dd78c5c9bad140730c28246b591fb13000e81bf5a0443d32f9095ad0033bc73c44701d1746046894f185fac60eca65a9c77486ec532e3ba2ff7967addcc99dddde76a7d7dd6f650744bb03db6f0cade3aa201ad75702cdf714aadf9f3abc75b453c63842cee385aa747a31989d5f4f2f1e8ca001be0fa08a9e53f6a1f648c12e9f9779fa7c0a0f8429b160a32ccb20947fc50802fa1f79e6e1d42c8f896820404fab27b68be2b607e2e7fcabb310d8fb5c0921873063184fdbcf72a164c9dca4ce22152ff62705b097db79df7f01720564f24a9449360acdd0f0128e71e3f6c3c5b821416c51c1a00485680e12c7b08c9163d2a051662544457fb2ca76c30ab66a5a639e229d943f6ec29b87481324c7ae042d64f0a811f8def38a595c509366a31f7627d726b381c1d26705b991830f9f8dc1765ba4520efc1a6be02967ddab6ef5d70c184a53ffc58144b265ba8188036dd4ffa1aa9ee57dbde42ab82d947dff36b55ca76f2fed6d013805fd12bc252bac60b3bb293d863695bb5c2a65f605865b416365e6bdfe4c5affb9d4752d900faca6947968f9b3ca2a9e2018d9e1c310cc448299f2b984e0146a37e2a406d3738a4cbcb4486dcf9c7a6f1c35ec4e2361fd298251c0e864bb2b25a8fd8194e00cb2dd8ae93111f2bbf826a57d54307e46b11e6a4dfffb2dc45ab7f402ce236689dcbebcf925cbd841423593873bfebf7db1ed9268eed43976c5815ed5b71f8369d4c9c43f008b1ff378fa5502be1e0fd8b742b5490258a818551cb860e8efbe31d211bcd0f715a191046b111b2611dd29aa8280ffe789ed5dd163a7daf97424dd0de13b2d2eecc804890bbacb86deb6577317f5a9a51941fdba2cc5d4727c3f17d909ccc6270dedcd6fa7b561b290b212813d7e56891a2089bb0c72cebf4ec6639712d1acb9dcf00c2b01ee4463f1bbef56c7f7f70389779a8fe82b0466a04fb574e01ebff93997a8327c0f399d5cc286d61fb00ddf158fe3d3bea45a801d5347bd220a3ebd272232c4c6689fb17370da669cfd191021850f1f084d0a443a16c3074bc63451ef032ceec1917c966668e1f4637a7e49f693fc9ce755ebfd83269b20f131fb8d0a6708c1095574aafa2de0e", "52516a636a", 0, 199380110, 1537743641, "595e97444224858d12fb151b25fe2d1cedd383c51e4d0a513c17819ff00cf0c8"], - ["030000807082c403037ba50e538faac1edd8700342c0337be49c71da640a8c2da0dd2ed4fbc076e8440100000003ac00634ed7704f9927bf4ecaba2b171d93aa82b83744e153a18b09abcc5a463e6d0a426e2376d9010000000700535300516a6affffffff125889fd91632080d43bf206f04d23be90a5c1733925b33b5ad925c6019509df0000000005516a006a65ffffffff03ec2a48040000000002acacd647720100000000066563ac536a0041d96d010000000003520000000000000000000002de97dd03000000000000000000000000db3e4786a80a7ab4dba869216992d20b43b6d00770ccefceb0f8e4ba8d5f07f8a55b2ba8e702bca208720f3d7a1d2c8a7154a3fa318ddff25de9ebb3d243f17e91911c4798759d852dc4883475f03442922fce1103a58bb70aa5ac0dad420f9100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000efaad46eb45df277f55be9963bdc5fb2ed2c4206b619fed3df77482151218744af3e99536b8bcf4d6b0c7c7ef97f52f2525c463386ce9cf63758226d1335217742a193cf83314309614955cd244d718ae7697cb1ded3017d6ba4bd144e7aba0d72f4546e831dbfffdb05a6eb4e07ee58c1f3211c33e28af59b6c079aa8342b0202268895439a9025ea654820d5f4d933778d597f708bbc5d7232ce73aa6d57d18602003d08318e9659d5417749ec88c96253d31bf0110a9f26ad7d5ee8533a1b95f10a06aec2946d99cba33cdb8452108467872f542db0e19503ed48a0b3c8d6ad56c65d4dc39e4e8a5dd3217992ba342b5e6d6508180c191d40953019e840ea10b0b3030bc9d57c1b45628cfe59d9991f641a999f049e6e6e64f5fe8ab399569126e1aa03135d0d60e04178f64a4dcea4c866a494a11db71c1dca8a6e1df3ef05dfa6c7c2031a5592513ac680fb93101718c884c38f7f380a90dcba2b8c32149945b864402102265df526fac35a2ba3130a788a35bd90f06ae7463cf59575a854a443f1e8736a03075683ae7a0ba1e4400d8b81320bcdd02fcbcfd54cf8f1510c32c28d3b95d5c0fcafa523cdfba92cdfa9bc412409100a0ac8d31d728825c35793c7ddf4aa299b6fb80bf78c107ec4686e45b53bfc1971ee64e3655ebb8a08d7eb1fb922670ca7cbe8984883e7223dbf0e23e0e5e4c7fb2be4cd23b4017607300d45c0b56e728b02b10746b75680d714367c31611052f776cddcc4c1942515ef39fa644075eb3c26e06c77b88f4eb54049c281cbe821d7f390698dca2870a37e37f9afc625e669b4fab32fb1b1db44cb4c9a2f2dfe9ff784b838ac7715127fab502753b44f63efae1c458153a6ca881cbf1c992dc0a1013c4160f11c5692efaf3dffb5ca07e638bc5ba567f150df9ac29bd09d72cc35e2a807ac07a3134887a87417f76aacde61bfb03f9cef1d1b43148b6cf3f24a1de1eb4840bfc1d115d909fab28516d8375e688788338d881e4720ccbe6f861c71469c10da066efa791d1e6d6f5b401fab47dc2e6f6c7c4222d5b5103a7c397087f35ee4a2bc574d7a5917e4d9c47274ebcbc03061ef86f8a36ca92b62d1b961988d6016a32d94f979179e83f740a78c1be15620d44d0cdc483d9269ba7d9907b8b9602692beb01f6d2761a6232a7579a8b3da7d99921f3a4bc259381466805b39fb43a2e1c910fb3fb1b1952ba9390471a344ae29899c1e9928789d1236817f021595379b851c0f0c8a260186e4c4c9c13d320912b410bbfc6e7d88253633e051e438140e44c3edb838c7edd29b7309ec0609a457255e836843849c27e28a9c84997f32af91d9d16019604fbe9c0fd20974bfd302101de15c170fcbf23ab2c2313eb34907cadc96fba18ebfa6c82c67374dbaf15501a43b186b81ac75fae6a5ad6b162feb9e88fb7f7822adafe778b7e47c6ca05d6070cbc62178ffaf1c3458daed82b5d1586d35e5ff4f088ec3b30993fe32e0d053f4dd82c0eb28f1dd5dabcdf2a37477b1fc2d897be258b297a5813c2f380497af4ae99ee3ae030ce76e4cc26b2a9d5135e14fb1618ccfd86c313aa83e6341c3f78a2ff890a9507bd1489f44a1fe79e2f9ea4e46c3cf5f7ca24e253a3a55a45fa5b01b023e54acbcffa06cdce7e1a86c9f290e9eda2b3191a22bd5a27430802de499b626f2843b3db8baffafeca4077732a6e0b7424488c60445f456975e4c086549c473179e1db7a6cbd31f17fa1f3bda68b73aee13c7b0284e795d2bcf5653ae18533a2455f8fcf5ae04d0647c80980b4f6a73a29108a97d912fb18579c41d5d790e8e410b5064be9ae7290680d36de8bdc078742b643f3475ab24d4642c255e7d799027ee1848ed4029de3f63651d6b982e43c2b151c77ec85b629bb45d003991144934715991832008caf0ac81440d9b7ce9da0cf76e6b23595ad40bc568f2a35b55b3d8e22575ccf732b8c1ac2c6ad5075f128cb7648ec6993aeba4764d93fa7baed9681184e0b9b2f5824ff46ee0cc6770e8670cf25829adf3aec3c8bb9435016eda4ed1cd06592238f375af92e2b7cd62f1351251e32db92a00a69d04515c09ccd9dcd10ff1471cf353e1352664b8dacd33299c91e75f21534a639d2f354a75d301ebd0c6eefd8b9a9b3290e0ba1e44344799244bf8ff96c8983d072b48fb1bf0a02ccdf29ee2e13476d3dbb8ad16b7be7a95ab44286f99b860784794d579867ac660ccf65fd03fca25ae72e5b101a68ccf209f68e6de65f7acfcb05f7c0bb19323ee6f21ba2223883179680ab25f00000000000000000000000000231a8486b20dcba44d5a8e3c362c62154aa66358c6f06c6c43da838456921a6796bbe195c222f59a18e31625c7a687df30cf98afe5967353b5044faf8afc7a0f7655c491a6b27cc177ba66157f7471a7d7b21bf29e20cb08045597ce02ed385400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e6d6e7aa3f9ad43c6674759af09ad633e2d9e46806269fc4816fbddd7a928b5f1303744d378fba95d2f373d2085c94f0f29580baa42ea59fccdc41d08434c35892fbf294b9b85ccf59c48c34a42b625157b5f92e1fb5ee94d79e660fb36463b259a2262ba42bf9cec7a2726536886e3166a1e3c8bc3f8b7c0fc16c62aa5057eb030d04f239e1ab227b04c6b6adfdf757c965a325186f7792f0fa89b689081da00d02015e566a405556f3c1ac1dc59e519cbe53276aca213155c41a91ac3f0ab1323e0a0310e77a270af502818633cf5a7e98607b1a91737e82a16bd9c129470499c49f58425dd0fb1777299911e60b435f8a0b649fff17f8a0b3641d733e965f267e02022f5349628e462c68ea7286d796629ccc58c83841589b28b4620fc508f68b9bc70329ca4abcd6d9fe9b03068c3b5a2e4303863d9ca1740f616c59435f809d844a44021cfb81d394d560b88a5710503255a8acf60b058fb2862b3e548d1cc275c0a96a021a7c4f316062c8b2dcefc81a3808ff7df96526b72c0cc77a3f23723b309f16740330491ded35862d1bba9e99da25f5a4ec2a1b15ff85b20dbb4fd6d5a957d71afbdf1f4391750ffc7746d43b5cbd422dde68923b72acc12d5c5183442cbeffa3d2423884781112001fa3d5e4decc3da75ad435df61c60433ff7f3fd9dd1438db915a0e5bc2a1d5ba173c1aa49f435c96eadd81ff6704894549e969b4f3722227b8c2aa4a72dac06ec428544938734944a9045bfece0d4910fb470fe4bfa947eb09b919b09dd6bae1b2ee1b1b65d3bb260ef2ec0652632636b2273605e1a23897ae50e00c1d7a449266ad17509b2a491f862dbbcc52448a012cc4de6dc21b27ef4632fa09318513955c816b37b2666e036dedf60e2d4e4236201da225363dff4893c5765fd25330d16d9f6adfb92673f4b8ae0eb97bb1a81c527a5c35546133a439d9ed5951a3b6229936a1e6b5840603a23126bf8eff59fd3e7202c1cf89f9530914bdaf2575e2b9a4d5c7b97177e3cef5232f74570de1662209dbeeb530735393c7f6699d39cd40b57e4954c24b09977cee692134e55a4139d2e56450c231ed658e833a39f61e495168bd4cd9ec20090d93533c4101b479eafb3553f921da0d8b9d48d661f7492cd2689bd6e3e35f030e65cb41f0cb0ec5e8f17b0fa7df4dcc4599a1c9c2a4dd569923014a8f826771bf99b9ca5387181e72b1a1212760bd311729ff2f443141a791548dea00cb0766302f050cfd06a26b739b918114487110b685febca77cfe87c0c10b86d75ed38590d7c0234d42d0a9d542a5ed6e506d55d4646dfc31a331b0b256983183ff2ac4c79d1807b9a4bd8ce5f5485c9628f3c18bebc8bca2af715079d94d668037657a9dbd540f11dc2d9866e0d229c179a681383b9fcedc96c45977c13e0e48602e00e70982d9d49b5654b3192e8f881d3cae36e7fc58b4d0d81a3e70f03d1caaf8738cfa62c9a6462f113bcd0b630552df74cbc8be4723837c61b8861ef99c913b8c148a7712bab3c39f35ff2d130f9f460c4b7d7d7ad58f790ae67f50938b74b7ff8f5d8df1adba08ab3bdbb92a25500cdd548fd57da121f9ec807c04d5cc6c02321c32f258d29e0008b846656a0402ca60801cca6d884f294b82973831167cc3e2c8c5a305f149b7dfdcdc414c8dce883547c50e1f6dc7377fb880f499b63f357c3a964aed53aac9a3360249b16d81a96eb580a56951f57870df605722a72e9d2a90d6c890afa31bee679768a22788f27960d513cb271ccae6f14dd7fdd192ee684d6143aea8a318ffb06f3091493e269697b92e603985af92408a12e9e7da2db16cd46148ec5af3edcaa1c9bed13e6d7a9627bef0525ab86d73c635dc69f31c536dd32628e57839a0fd13a09f2a54577ca4f73bee8c0183844456d64e3121056442307ce18dd57fb7c5a8b0535be6ddfa5576783f238a934658dbf0040ee2bccb35e7958ddc124d0d873d8bb4447902f8978a6ca9f62e0eedf95caeb4b4e0c4bd4df5b75c8bcf245a84fd152f095cad77396e729760ec02ad01902c944a7636e6a4521e52e7648755c0bcde504b45579d80e7b18e3a0f6f7f17cd58aaee5e5679891cc376c7439d3905063668b13e73dbd491cc3753c68cd9325fb91ec3affe220e86c4854e8487f058fd4edc074a50be685b4bc2da327557772bd482bdb3e46abfdd025ad87541cb6f7a5ff2877c9161040eb3f0ae4da1bf39bd13f19f09b45ba6078410befb3560445980eebd0276e532ce538c14c70e0f0b101485d775a1c9b818d9e87d2dec74e4e85a1f8e7590b0f58d5527cdf1f11ac4282d999cc855fb29d97649b4242c3cd0ec1486743fffeda236ea12bb20392543fcf95e3ebadda9bef4a83299d83d1625a938b25eaf718bb9da1f4472d4b4240931035c700108c830460a", "6300520065ac", 0, 425718778, 0, "c974bcd40f64f07f9406ef8039aabd946a0fe61567883ec1d4d6b1c08e02da53"], - ["030000807082c403033b35f0bf2094e3bcd6ec98198c8b18ba71784a57f2237515ac5b3bef97ecfc550300000007656565655353acbac7fa38da3046dea273a7ef42e5c75163af3adcc2789dfc554696d11ae62d13708f575200000000003044c74a7641900d6765c542eac075858635b38c252d4b78f1e389b3a257ecebbb79cbdd020000000153ffffffff04b4f32d01000000000465536a5119220d0500000000046a00006522342d0100000000066552655151009ecc6c05000000000453535200000000000000000003000000000000000054a3680300000000f8726545d15df80b1aaa0ee6de4c25a9584946cba9959cab4568a10198a5d2637cdcddd235d1a9b4a9ea1bbf323e1a786bbb055c4279b728cb9ef8109d7a2c08792e874f6bca095cf51aaaeb7381f457d2c90cf5bd6c7ed77a9d58e34e818bd1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003736f8514939c74c46b73447bf1923b25c94ac0d8b1246d855cc402c621b4c4ad780eb1721a9482c77290c70e452c3848fad0abd796b11bf0f36b7d9524e79106989f075b5f020e0a5b3bbb033183d39f1ac00f092628d2e737f0fb5057d606e18082bd5ecefd9adbdaefee3f8f12def9af52116043f901636a5df51263fbbcc0308d75fe1cfed7cebbc005189640b6b669148a2bfabc42e58c454ba3df89f7a480328fef2783d5cf81105fbfd97689189488c779f4e3588b02badf8bfda6b062f420b091e6e15daa2b121e5a9f698d96e9382386a4347dc8206bd616cb454d16bef1e09937b9b36ec7257a01b827a94b707ee4fae86ed32e8ec5f87fe3a4d3af01d9b032aec4a7c88933e00080e2fc7b4aae875e90678f2f18b093a04cd8c3e4a6a8b2a0219275fe022c014cae92ab6922106ccdca9169fd0d487fe87b1d2bc258ada96d2020ebb2cd8ec70b6e5443e23920db63c9d51c854fa3f33357ac1d5a91f86a8297802057e5c4d0b27da01a757e18517d3321b55183993a742c5b6f39a551e459a5ab40327d1f1e3aa946d8fda425812689a0805ca792551f222730a9093eeb7093b0153e13cbfd38efe4d6a451600ec95fcc07dcddc001b4708a809292753ca13d6e87030330aaece04511abf298509d47503d1f3a50c1480d1c2a48bc02adc426ecaa0309b4463fa9a62fcc90b7ca97c44188a4b0237c0b229e990eb7a4a9b9203c0215b5a420cf1bf78c1871d0fd9fca5a722457930ffdbb4316bd0fa4e68431f58abff7b2a9464430790521c196f1d46dd9ba0b63e11b78a351ba1d02b9e351aa0c126c07331f8919f4806980e1b6ca87a3028441d6d16776de32a3228495ef08c1dcddf8cc5fa52ee51c8ff9473cb9b71a3f44aac8a374ba7daae67f0faa0c0819ecc43a0dd754385b2c78e8d3d92c430159632361c53193ed6bd5be7cdb387db1a60f58a02a103dbe9e1907f8e3a60d02905cc8f733c7765ae6cea00e60830c3954d3a074d61a944b1f2cadc4b8d9b0fdce091c2c719f068c514baf202e33a63aa108a51022f8d9db35c388b258f28e8831ab54443f11439dd0821ea106224c176e37f164f59fa79adeadf35d536f49152d80d86e364cbe6a08d32387f56f5f7059f0f0f7527a1d362afe0cac734043b107357cc2d04c86af2d1fc4dad7dfa19b781172cb13ef0f199f3f55192f1ce9ab042b421b33e3c61dc919f8341ba831df1f95802ee0bfa7c2b6be2dd64b8726a44ede6e4825c622fa62667688e65834dd75e44f607596c746743f0cfbc87798a0501d88a39141fc8a5ccc2de78aa31dcb6b5a731fa37afd86c0090869674180dbf5cdf8b1b175cc7f7ca4411521157e4d9c6a6698fc265e3d0cb7c21916ac8695d6f67f85e994b7a993844b1b02ac2295217b99e5b51bd5cd0ab36263da79afb9221cfba99b2511c28045f3427934c9d7be5f40cfdc9ad35df9f83892b5fcb689474602e11a84bb9a1c3050be78c9721251b7c7141bbba78f15246f96f46a782df72b4684b369398aaeac80cd621e669b79cdaa83b8a6afede64c0fdd1efa194927bd1535b9e5933b3ed9ec7b34808828b976ddada1cd2b1ef957f50a37c9f9acf17b984b7bbf1f8643dd98ac2f907142403fcd0e7421e3073522530bb5dcf187d252ca3c4d5b091d0c101ba42257ab714440a7daa2370c7e5b005d1d198965f96b89d9aa52cf00d067df202b1ed757d8f37c12dcd79a3c29703aa2dfa8ea717ed5445f596857cc9e869e424e8937b023580cf05653ddb32d0910f3aeaaa12e0cd3d164d825af0635c6a9d3642256bd277ba76eca6ad7c25a13e7214bb8ac3a3b87e05482db7294391b716f6042fb973be25adb97b42feb4cf296ff8436a5a654194feb459039292af0944c7a968e0d2d148fa7c3c3fab745d968a52963b1dcf58d1304132c1358a8fd79b15d146382a096f2b10441465d84318e7ac3286f28db56973fd3ab24627aaf5888cf4dbb626c1891de08fba22f75386b9088920fde05d6e45401de9622130cb9db76b89099ff72c139fb87807939cdc50d001efa9784b9b3d49cab5d182b8a54dc75b7607c968112b3ed1bdac26646ef426204f7fb893bf49409502ef43eced07954eafd85cb4cd8483ab8ed70cc385e0974f728a65162b30a3a3be43069fdae520754758fe7b93e9d57eed9e81f78f50e38a80bf6567134c1633dcd8bb0bdc4efea0ac1b5f4456c8ffa4b91252879acd0e12bd909ce6f0ec2bbe2f9f0a0e2858151054c840a8c913cac1b44e3f11802d63274e81d2f456c20c715f04000000000000000000000000cd385c646cc39a34fe5da2b87f463404664118f1ce1ba62e3258be81de1113f36be36a3e309223bd5f626ed380b7b72355ad53f2df48ba96ad7a6f8ee4c9ef93eb2ae5c2797dc9342e279dff8b15d6323dcbdb6988bb2e37f237c76739057d7e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009b7cceaca11911b3f1aa69d372297847928b06ab2c7b6fc8ebfebc57b8e706deb5c1b93114b3bebc9663b3753fbd3ea8d6ba0d243cbc741a959e39c350ba56f87a8a68243416741be462d11c8466dc2366f2f346fc3bd1b633413136fbf27e80fa2d75a0fbd48feb3916ee75709cf708bd1e13037597659d09e3d4adb0a2d745021f1fc49e07f0901bae7ec8e0eb1637d1c53a11117f93e351cca2a0f51aa30698032e49fdab2381152aa4cbe7fb797ad809a5d1cce96cfd62ebf09372fe06e79a050a067c73306fe2de38e38dac88f2c801b37baf0b451cc1048447376b0e3e2b7c7b7954fc94cc165f6b731b80758bffeb9562897e92d1a7f69acea01c371b1a71c0020ed1925c77cb317267b9a984f1b45fd2a6aec6583ef047d79ab3bc0c422adc45022ae3d8068a74e52aa9b4b19f7a77250824ad6eadbeaeac8425fad5dbbba9c6b503189f7c615ff22d841d31d3f0cd3b6e635fe37ff807cfbe55a95bd0add19904d3031dc17b7c1b5c6e72ef53ce5e5d846359fbf69cb8876580bd2d7f9f2b2cde657002048d1c8a43301c1652eb775ce09206f21f4852563dde62068710fb45c170ebe43b8138a7566feb0521bf6021e3c7c734900d7a4937e5f31e739225a38d1afe8be86128718f9ef75cdfabf0261759db3128ec727f810d8d44e5d7020da8f8d8789e4f6abe2c875013123ec7fcba066179caeed3f245ec916a991447084a4fb5364f9906362c01a6b84fa003549e188acd29c3d484aa096079ddffdca929113ea4c49939db729a228bff0446cb36f0d06e29c75225b127ca338b04996dc19181e80cac4ea3c953636a854182587a771655301040ac0e50982f10bd08304907ae40ba05ac8bad7932f75cf4433dd73b2fff1aeb52f2d084027d67603b80c9c9e9abeedd8657528317f2d30964e503a154154eb878c46662979b952914d247931951b98dcb07015ff5805c9668bf8dc44b0d63c1129c94399cb31b1ed32a60716b7228eccec42d84fe04cc8eff4ff9bf79c243000d206282ffee1a40b161ab3b4726d09ef24c922ab3557ace81ef1b9e4133b695d85736a137fe06c0b07947b7aa694f06a0c2d2de4ca53761815bf35ae2035e6db32bc5ad07c22f2431a8f8939e1a99f354bbf5a1b4ce5aa18bb84ac64f2d810ffe02e947ad9f5f71e824317d777783fdf4e4810900d0efd28be0d2b4f6ce3c95dc7e2e14bea85df9a435ce7b1fb82df3c6a82928443b20e6f97757f1ea6fd3d2b685583acd84d12fb59315fb45f17cc7c6e5021d46a03104aed2f966934a95a2dcbb9f6f1e7eb206bc767c7771b47f91dba3cd29e59f24d2d0375053ce928fb290fb67a90df8d33a7849547f336c6b451058b737a8823e88dae1ad56a0c31965edbeb5db2c6499c44a572465220506d91dc52a381990e0e2882534056969d526ac608f867057112ca2ea98a6032cad777c773a65d4240ad101c1c81068952a0f40c0f1de18447d3beee303c43f573b4e4a68ecb86a52d22ac5cc0533ae1d0039ac882a1d6ff6865086926ba7996069a5cbc87d876047c325b6678cb5fd7337b06fac18eb5d923e367a95134534c129fe96e4e70a0fceb4fac5b34248efa4fad16209a0ba5c2821293fee508ff3861dd8abdccd1d9fab8193b6e9eefd406ec9a9aaa9bfa0083f13ce4ec7e8463ce99a3d5bc246b14c12a5d8d91c68fb342f4d7b8eca21eee939cef0143f11b8e39a4138d26b35d3cc6b2c880c98b59224e88025bdf366b274c1ad0748b4da60739a8dbcad0f7a2c2cd34775f9b20d9a0ac8de096f7cc81a33a799574f72701f2a5e3034d1ae2deb79ce3e13b1a5c11ba3efd37d7a9734e46d4cabaafc0e251067d72f3a7da1197742d776f643e064c66b57001d20918865f4632d6cd319269b2be6c5b3214b7b21301a4280b1784eee0b9fd31d7250fbc6165cbdefc31ac9a0a2cdd85c13d24c77cab0fc6f40136b8f1b8b470c7154149eb482df836ae765e1dddb0a1dd8ed3c083a0cca2e5ec67a705f10eeda93094286387746e9da91e0bb645d37d6d495c3b4ef9829c1138800d8a49f5b2373d5fbfbccfebf78aecbc5d523960ef4b39284d5b4ebfe244ced3debb216de934fd644856c842fb8f5a635501ade98cc951d2fb4953fc56d7ef666a84edd8a50fed1076b2fcb6a6b6189186cc4b03d21f7105f35811023a26e982621e522846095920362fd180327d518cddfe932f65da6da21b1514510cc973265e2ed206f2afe741eda64d9906bf7df3fefa7c1f38caf65038ae9b5d0b9f96f123f82549d660000000000000000b17fd60200000000550899089d0eaf15b78a1ad1a17b381e68183ff78b2be708d8a823e35e244423db540cf9dbe2d3257757712df1fe4b4582d15c9b4d256f6f43fbd1063c8cec5fa948df0d7b03b7cf7c688f17929c55f69c8b8fc296c50acb22d07a8548320990000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e1bdd929aebde0b4e7bf706e195397624039e44d07a8cb4c7c94a0c5f0a22c1a8418333044510179fbad9784fe6f77fd1d08af05d55e3314ece48b6904aa2792715b8fb2418802274cf6f868542db553a242da825fb11cce3417e9ff4b9cc76c8622d1e1ce7bab9131ca3ecfd49a5368db03f285a8963d002c22b1fb2daaa6c0219ce0c0790673dfad6b3e93bc39d2b67a6f9b74b9da3a080525af5eed9f422f6021daa2c8021cae78f7ae7e1617af3f0244a2e968c67f2af95136c0544ae8acaff0b005f3c4319617120c7554576615a0b35e9ea3bf04cc4ddbc77742f139607afc103512881faa3a49c72807c70d1118fd623b23aed87fdb7a08344f64d0cfce6600306dfb372d952ed0f2f04635b0ce01c761efcfec6f2b9035ee59269ea433d5b7502178e5479524c451cd1ff2db0cde07518b2da19809c7ae1e2291b945500120edf021d6ec675def2f02f43872160ccbf4fe71689e8ed8fae2079703aa0b61cd3557f021c3f47bd4ae16d19433fb9561e926331ecd28c4c6e2e06172cb57668989ffe42022a2adc46714f76cf0b050b195a7535180692f643b1b60bcd4b9cceff0b8212c5be42a417302f759bb602489a60a63378836def3bf88d40e39e3595382c71b08924a3320aa2917844f2ef337a77ec536542ab58bab7ff8a262646c9ef85503dbfee7ab33ff08ff48a4e0bb5df23ce3a86648c40faddf992b712193471fe86d62c9033df5658199fb2490a5af4443713d29455d4d00b97029589c5d4218819a1ab9f31a91ae80452d633bcdcd0a6753178820f498b501ee9f04e1537c93d128a58bc84eb91bb598661c8b4a55bcc7a3bc0d9580e3b5516f59c2abb196c349a49ffc1542370da9886b1fc743cadb98a2c1a1134e97e99509ce01f060face67669325939b8f03eaf01e162f6a07a990c857c3253fb613e4cd33d6750aa557d4c902dec9f8f5cda25e1ea0dfb3080340a898290534195a6ecb278060d72476e046bf5cfbf44262cf7aa753121d12f0d181827ce844482c2032f0454ddb03bbeb215545fc307381c633213acd3ec274f91e0b1d408dda672797939f39e7601c8a30c98b3f4da4cbf282e77e8a24172349f7b8918171be4287ac96ff5d184e4236c7ed39c66d9a7d68b66382b98e4ccd0162a9ed2bf8761a911efb8e41e803ac442d02c30dc4121e495e37b1f6b2c2f698c0eba8daf02556c5c4c9e0c0e6922c53d7b60bc93d1314fec0fa597385d67ba3d3ff5b84bce97a815aed52b81b336d6dd881e92cffcf475246d7e8a4fdfeb381613c214602c17eac455a4d8170a7a26dbcb1fd0c11bda66aaf266fb9c99e82031f6288a3d339204f23d2e78032dc213a57fb3cf4831afdad40f66063276a2f9a1ae093fc6484e923a393a0198718acf7b16d4222e3c66a5222d340ef8f0ecf1ec26a0a1ca2e38895159c590c00965de331d774153c7be2269b73be4e93539f861dbb6314f271035f3d464eda337c3d946c34f008b477190da4c557371236bfbd8a71e3ae4b0e5ffd8eb120781b77e9d550972bd092498e49d03bf29a2f9537890edc476f4d2d02f3e6f2c0bc16bcf98d802c3d16c3cd5e3d80c69dbb42fdf4583d65673822904272ccba5cec3d5bbd198e1cbe3469875ccb47b90fc9ed162cb329f0973ec298c5619a6e8e7818e15914d09efd0315f7655e7de1ac5706b663763173bd5e64abbfa2bf98d5f099088b3f0cb20867e55d7faac5ed4a18ec8d3628e6dfb5228ae5f4d919ff0ba7a38d5989914f38f31dedb582be6aee96b44f3891e22b3cbe9a74423363977692c1dfde7d9de90205e7b204ac236dcf3f2fac395e8da2512c2ae51c31474e3a5b8c3922ddf854fcbe5e6c2abacc8cc010564b4e5a75194b327ecd42872cc493b499caca78c4c86e467f1994fb1e9000036b2a5448b7738091fa11c7536128280368232fc4c2b9b537d2c56e5a521d1a843676a204e10de86cee692af1e0c353be7cfe1a2b01d1984b18a822de793131fbe05795360069a1e0da7bcdd49f3e4728b32a1910e17997a4170e0858a845ad282e025cc03e24242193c0dfc3dea8180ce3f9f42ed38d1d2be4b0e32d08e522c5ad1a4ce42c4c372e9f86031bdda558ea062a71695fede0c20ce3255a8e2c6d7f40325f3f7963b83bb13c24b8c7ec0f67a8dcc8e357b534ce3fba3c6464b7ea16c0dd70b4e9ed4f5f1f30e08332729dfea1645a2f61abdd5d5d47876943a611f6f8bfe9ecd7b873765cef62a5329e65cf7b2c2813e742d8b7023ab026d0e04769d24841cb151421fbf32dd1b014393ee0ddd810574502ffc58a206b9ba5083e777b22e6626e467bc0b55c3ff13b86da1f732009d008b85e737fe9ff62d82ad81db50889b98ad0b57a87434e58ba50d23873006c35c56eb05bc971cb9934b6417243ed2de8dd4037b02", "6a", 2, 904344293, 1537743641, "08d2df593d60d0050c7fdbfad4c42fbf9d37e51521ab3db4cfadac87128b89a6"], - ["4b6a506a02a65c165fa41188ec33cc712583cc234620040288a2218a9501793d8040fa2fc00100000007636351656351533fffc35607f3f9135046c2c1971dace4d8db8d07119931dd55c93fc2813defe535380ebf0000000008ac006563536a516a65aba6810349ef310400000000025151b1766e03000000000751536552ac6563cdc1ec000000000009536a5363515165ac0035ca9ca1020000000000000000917d14010000000012e3e9d7d3e2c3c7c059e4cfa94c7c63e378d979c21e2e551a2a6d3fabb9bce235950669e9d127e40db8c648ee7afa2480d77dbe48f702534ccaa2f788c94039d862ac8f327bcb3b07a50c4ec3f01e27bbac3ad6e8cd68fac62ddbd8ff224c3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dd67be699832a975a41234045f0c9ec042ad6394d09f44a1b1e0c27e7d5bd0d72dfa8fcf86e76a29b59ee09a30cac07e324e394b46af3c06d42d383d4abad1943a96855b6e2e0f7a7d3e18a2915e42c11688eb35604f8087ffe9a121eacf57aa3247ded0efaa011ec1f333be4c04a007980b384b839bc4618938e6de6d162f3d032b34cb9e1898c97d3e9fa6c691bb1cbf9b603a77b0fc15b493c47f663dab3a4d020f72181736b745c714345453d126ec8585c263d1da5c9e16bc428105876a1ae90a05bd1d39958069f5da56e3a9b3d52f45a40e66352311ccf583ce781ebb35cc13258cdbc3dd30f7192a8e7a3757a9a04938e7d8f5ca151262a7c798883280592e0210902cbd6339081c002cb9e8820a9dc467792378298d9e1199dc4a217579a27903008a88598b66502a87959e974ded2e6b89b54e1226112f943fe82712d8f82af8031b419ef902085c1e3df16f6be1859ca8ee48a3076dbe10228f9d81bab1f8aae103032ba27028fe99e23b835eddbdd642684fbe2b7e8fb51b25c2e43eca4976c6bc0314b129230cd9f19e3e2768acb517213c4a3d9fb3e068836b8036d072268221f409bbfab23ae2b1dd6356beeedf0c48c028fda9c890c130ed53fbfa4983e56970964fb707c1c1a084c6f6964f2dc5274942074cd30b90cb1d608a6964594f3f4b28a3d2a2ddbca578fe721348f90d7f82273e5b5c32ceb1a8e35175b239796e0c06d230c15fdfa5a705ac8507064fb7ecc1e580ef1b4524ab484020b8a7033e091b667ace5ba2c334e3df85b1d6f7c0c9178b0e6a893e82bf71268e634e21fb25bdc4054d37a5c7c7fc84d60e0edce20e818b373e61b8facb818c9ade3ac53d26928000df02331e000d46607f760f6b2ae01cc4eee809322130fbafabbb81533884e38063f27ff3f218776545cb118b6ba89e9029d3ac349473d85476dc3d1688d8f478ed561e34ac8cb988be0a1757f86aaa577aa86d90d49e1cfac684dbee52217d7bc133955d975d6dc7e6f8e2368b22073ab799dde342b4330560bc61c4947bde5710040f6cecd6f2ec454c562f9f820d4f6ebdaaf871f618ce5f8485de1a0eb89798d91bede1bfa760b8f309a512e90c8e871feb8acbae4340c75204739eee2fe76d8d18bfbb9ad45c44bda23ad44a49054fee7a460887bd4dc0b226f856fe23016bf3f9459d05bd4c8ac85878b6f031c4e1bd1f8257b5dadb68e7d4bace69b04de94c7f61a2562476ae50b75cf7b1d5eed5a41e826a2dad267d4dee9e3a95acea483f021965218b40e8c987697a2bf818a762a5f9d34b51eb8420df42adc600e299ad5150cd7b400dfa011e4f0a446c4861773154f4ce0a0777e6d65767ea7f0fa1b989f511a5e0d07f69e3308ff1ccc09c732c5e92bd743b0f9fc5900387a63ab2265fa907816546ca9962cdf7f11d20b6743175f5b0b5ae94e96d1609983f07944966df917f42f7beb073bdd645032935eea12dfd6e447501b6b4b105da62de502cc65829bc19eef15ac79652d9bed1033ed9a829cad29198512b6bfd3f953344e77129e5868c3ea5175adf1277b7d407cba774cb6e2a316f2e434de7b5f0f62e2f90700ed6d0bfdcdd991090dc7bac1c457d965976a4e49611eec9ce28dc202fe6d4ce501cc074cf890394711bc82ccb8526281f32d0b2b4763d323312980c7013b21a2fbf79c7557fdca73b414d4ded34767f9413522a6e6c069902b06abee2f6d0b1973b6c373e56982143b6ac5a8e10d0dd99e89645836f23bfb6cee52c07848cf2343f990f406a039b69890610daf1125ec6b2cd51431744feb54239c157825bad7de04a586d59e7c91f9fc131c71eda6f0abcd84ff6adce48277ee22ae6e6b59ca81772fb51c496bbc58c7ed6de78ae9c1de0f5523f1942310271b23f7aab96672f5b520c57434830395ebd0aa4d7f3fc68f989557b6a4b536f99d4594d68d87f718c825bbc926d4b23b35c19e3b61dd53d2c6f9a0d2d481e365825a45ca5086df8b8f32df93ea141bb85734b809cb268f659097fb090ee0fd4d42b930a26b535fdf6e48bd29ad179b79a8711cf2905014fa3fc825ce4c5a5b9056e171378f6f54ba1fda5fce512ec7745d279f9289a019fec2d308646d871ccce62392a5f5a89b05144ab5b524e73b004a390a85174b8d61afb80d477db8f3494ac2db143efbcde7b32756da490818a5b3932b0a7447dfba5800867b0cb9051d5e1307fd3d812da67006dbc46b82d80d44fcfecf8f46945d0d9263ca67925465abf05c5a7e0ee3f5cf5a58cf27a0285b801000000000000000075b2900300000000a395fa5040271b1feec5c7a4700ca0af1a5e258f500c6141eda1d669cbf7b257bafda2dbe283ac065015aef74d3cd8c20c3cb4ddeea89f7eabb2ece331600fc33ccf61922199dfd45a94995f76b86ba9ca4d414c996df38ef62a6f9bbcad1677000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ff237823143d1e3a638c3b63b2356849f0ae9e357ec09f506eb15d5f885f2db004871887c81545b52c81af5ad0b9e0fbd329143adbdbea18f9281887c73c29cd2cf176fb5d5680122432c79be55ce131436dce3f949e961f259868eac845f8e59443ed44a417a9f7dcc61f30d21f984f5c78cd953ed885af38a7ee4d0f51f9a021071547d8eba2f09c9cb985231488114335c981a98b5e1986a6b71b50eff1167022a701a7d88299d5a4adff7ede2813c58bc4f5abec57604ba9dd35af326e7bc300b03f6da3108ad0fec4556bba67af0be46728a010b7ff280cc554b462a411bf88eeefefefe6b62e22f77868ff4cbdf572030a2a5fee48e4c1c8db86169abae7f4703025ff51d10943733152156de3766069b5e2ae6c622ac248e8bbf9e8f1e921a1f022c863d2bda1eb58a86f85b8d343dee6582a030ff126c76f5959b6c04c49cc449020fa4ccad256ae4ed7cb5f356fa2b4cc3e7836620f6284c8bcb2b3c7647275da8032984e82c7b069fb124a1953d9f99331f3efec32d55c122916fa51da70de09b410321a16276b5ec497ee3234cf0803e954965a130b5a6bb2ca3e83a515d5e9a47d2b2e71fc23b19505ddc7a259f024c6d584ca1d99de439e1b80799e36385237b89b4d5dff4c8c21de26e78c7c5b928b7ca471355d8e0cb92394f0218dc2127983036ed1bf92c60d209b92bfba41b368280fd42b109dd5a39af923ffa6144547f261d1a84ab314de125102d1aaf31b063a8e81ba424869ddc3bcaf174e06c8396d9ddf008e2e91aba3c8b6b972c7f1e46b83a2cf21f0d8eb573c235d0f527d298013df0fff8b349a9ee5efc4f44cb68df708dc38c9d2ba10c2be9f189faf1cf968159f371ac1f7117fde72146b5af92b681fd59a5952044aecc4e17b164ec21e79082e3e5d38fcf2004d4b4d46c808821309d4adf37504b72f3703358f81ce77db7984afc14017c5a823afc4c7ddbb3afb975b4cf0b37b5354c704db3b8527f075256d3731b3dd3aa4f95c09aa5d58c49fd5e1ac03835f981982b827548254da8dd4d05bb62eccc8d1ec26dffb30dc7a64c18a1cfd4c5ae7f45d6efeb01866ee897efa50bf8c5fb395157fe23e9ee8e1c3bf3db57b62296fc21f54934f69689ae5147374a5a595b1346cf47961d5b2228d141153ceb4e781d1073df4856c1f2fb0a671ef31ab9681a502ed6805aa68a4afedf7ab1b30997971c70fcdd28865f52926b94f5b885524a605016651c557fef879ba4f197dae18d7b5a0f8914a413c07d41d98f34e56743c1c88cd202dc0fc8818f462f354a70e6bd9f9dcdc620ffcaf6e300982367f828d0d3a76a3f5798e6c741bed2fa653a69163803751907106ce73e79ffe91012ffd3bec841fa68a2af7267d013b82b9f6d11d2fe2d6ef6819ada6da8afa8df33041e1fee3d00ec679beeddcaf0ef651757290d9f2b913c949e00e33f78ea5b28d6ce3c1f4e077a7b9397f7b12aaf11595983c3c3dfb782ac7ac988e426c8e7092b00d4591cfad560fc2f212d09d4a3e82596a9a6986db274bd1dccff62219fa01b79c65dad799da4a3049e6571510e743af295bb2cc8329a3a4bde2652e31eb30820be79c9f713190c183d5e0f486d0a6157c2de09195ef29ec1815d1c830e407d4d16913df61772e024d476eb0b63ff26e834186affb62d4c77a7e7d59c07003734ca9a3f6a8983b814fbcf287667ff87454c028b2516a6c46570318115a304816dc2905a7bed87b33ff154d8e206de4826505ac50bc415553791953b267d360df45526777335026fe189630929ec78b1b749f93780c90691fd3866d7157922ced26eec3730d93d4a8dd5f778e05cc0a84c35c7e050693952c3d87b40ce2341289d7e2a84e43d40e5796d8d436e0488fdb678d6118a0a570a0eb5c285e7ccf0b837ec2cd45a64453a0e7c26bdffa3e9ea14f1f884136d5ee5912cd14dc41ab398b380de377c1009359b74a4c163586957292edf4f3254d0d2c07244148205f19c342b96ac2958e58b42e1220a15bc597ee8216f1f4302d4d1c18da1a928973cbb57527654aba9ef6ba684c64f1e6dc11035390fffdfd39f16edcc5c256bfd5ab59ca374d24c6b75e274f48f5cce96a2eb319f633baa741ea9e3e8214d133ee38e2d1539f801d58ea54ebdb88c9dbdc2aa09262ffae968d1c3e8720021290f0849f1e48fe50e162d36b45cd166894bcaf44b059a76ae8327aa7c875eb4e9ec56c557a81b438218dab6a6bfa96e24abf0342340d0c3d353d392ed2327812537b9bce175c671c309b402208685562faa2a941325dfe09697359c7ae91e9804286379074f5bdd78e6ad25db41649ed8597b23aab27bcf77e756b1808d07fc11deafa8d97fcbfc48ee36292b7221c1065d2df1aefdae6e32fd924a8a5a062a6c4fb81167f3235ab1f97abbda5209", "53ac63", 1, -287044860, 0, "33bd0fcd5a5aa40d472bd7a2ed6ee250c7bebb0c68d2841d87d10799a3fca52b"], - ["c835f37f02119f6d7515a85b89d5f534089a93c19aa3aac12a4c65fd77c9a3f787bb1b515700000000076a5153ac5163529f6e342615c5e85e0834d40874afe846d77a0f3b8ac846d290a4aab9e105901d986bbc690200000005656aac5353ffffffff02b69a490500000000096353006353520052516f6c94030000000007000052005300530000000001e9db9c01000000000000000000000000893eca46039fc7f1808170d9a250f77c0fafd7e9449bb778221c46a547a7c9ab83be8eecbf6683b4fd9d7e8a7fec19cd05e8fb43c4bd93efecc8205235a217cc5f7047d4864bd95ce9c5b38748540706e90212fd98964ddf5cae824920c6bbaa000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007c9a7b333c8ad11efa33f33b1eab0ac31f48a54101e975207a355d849d39a663aace70d4ccef82bec844551b09e3cdb6e061cdbc2449ff14272bbb2ba131bee6724a6fd5b99bcaa0655a412964ddfde6457e0286ce7df13617c97e2b63e7e881a822e322fb68ef450a027187d53926adfc5047c621a2dc0969b12f4410d3319c020ff9e7bc2073abfc704b796a757ee0ff765e330623caaaf9c3cabef69b0bf68a03241031c4deafccb94a9dd38aaa7ada90a72ef78b20a05e45ef3cf032140b85230a0423076c9fb7f73e5d629cd5548943a755b8c6fb155cd225f76a82068edd6952236413547158b09c9458dc85adbbae3d42c4b5b2764ca9b6a579342dee2233800200e6e97af65860904b7dfbeca88dd3c7629a403c605deb1372efbd9580981a560322ecf9a5e577f0f0f066e83ebdddbf29478da28c94682bd979dc57e6c263c62c020ecb163ff8a55eac43c8c28d4894567a5dc60146d83786bbf69fabb547d4be22021b3efd99bb28c9e1aa6290dbc1d7e15bc3726363c69f44ffcf4ec016c6f34c12031b44a1af00ce5cf2d791077f2fd6af33323d94e5652320abccb7aa65d950dfed385535730fd43230e13db7cd91f8f303df2ca74dc6fab5ef104a6cbc054d9fc96888c607a827c4423662532e13996d84764f77cc4e4998ce62e2e4062faa444c3c11773862b1c94321824825ae4cd7ff8962e077179e26da930b3fa8ed3d4a9791acf9334d1b7a01213ddf6a6d6b833b62258273081b08a318cb7c07f0ce0aa0d18ce69f5c04b9eabcfb93ad001ceb83521a416c167226e6c769697ce8950e4dee6152faf45176c156bc5078230c5b9f3aaf2c45f21eac3d3556d109eeb04ce0a04dc3a4040e6daa41bd5f87c889955f1c0c1bd48fe7d9d65356b67573eb010ac5dda0eee3515b3b8bb6420c651aa79a3a4fdd3b7ea40b61c2ae1005b857592d9e682193080737d3a0ad248afa197c61b8b919c7ed28487051ccf0ede5613f23c4d55e567262aa88a55835fad3ca9773fcadb1842e5bb2c078a6efcd795ad2bff6609117ed6ae1d53192801d0769c6c62063991872f3cef26e28d048d34e3d24f482277b8b2ff654d5979578d9eebe7d2544d3a28544de66710fdb70e91dc376338687504365d2258ad5b947952606a7eab31113189b64f57034420fe5f29daebabc9ec7592e8cfe29f030cac9e5d9fe5a14b5c804797bdc59a1db0f22da188ee8fed7af6ded6827221545584728d6cf427a70373fa49d7b6fd86e4128b1a01e72e017f4950569c82544704509d8c69400fe0d197c61f37cb817df321b659fd02b227b0454c48feffd9757ea2f294fe249aeda4cdd4c947785be42b81d5944202538ebe94170e1d078425c27fcf19e97a73f9fd01e79c65a3ffd26c1099e6dd174dd56cceffb05f0563b10acf7a5d5fd0a02b9384aa551d596fcf0d40040c63fde909f68723b1bb17e808f185bf64d55430af90a3aefffc8678722242d85de371720f72caba4b47e43b2b7fd04c7da166a1438a640983e969b2edb890702a06e2b40d181ca0f6d824f97eea33b7fe7863659bc49420e4ee7180e00ced8e080c6367e9e471e7b9604999d02d1301b4f26e34f4e6ef09b6ad06cd250d97fa7182793d7da058f7f0e5207632b95ffacb160f4366e1a47a7a91914fd0987a180ba5f2fc24980a66a0cda507033acd5a021b87fee259ec4f6843c4c998b91593cd37c338e64b3fcc0bafba659e326ea54350995f713703aea10ddf50c860c343aacfe1452a5988d671c9ea74638c53fc1d67c2eb1bd90a5b2da2e56ed01bb3e8c5c50389ad92c62e0eddce7ff7428ecfc060919a0752e81d5f0255d36aa10e20091263444e39668df6286e439ce09c16d2db5f25a538c770d84a4f4dbd83c11e605aa8fadd8e2a28b7deb3eb71a7127a90096cddd876b47b71c66b979b3f5630e17a383b715529d1469ddb87a698c6e8b731811feef9f727075a398f518d64816d82dacc3c4cfece45fdd5744e7586aa8c1c6c8754ab62eaea4c073900796550463fe2595fb6405b43a84ab060d654c2646f5d5b43fccf6407a95cc76d328b557a3aa23ae19e4d57e919942a0b9ef139ff6af1c304c509a3c5fa7efeb1f8c6cc25eb6f7239fd15583d075b981e66960e15be9d2f605ad20e543ea74edd797add33764640e6d5454f2435e4bf986058061764b747cfe821c37c0e7d7eea52aa387178b437a0dd774a1044d9f88fca7e08b043191253ca5f2032e4e38bb56446b7dc166f3fb7064213d5cff035707cc1c4a78ff2dad6a3af82daccac3a37d22307b90a099279d7cb8fea458af88c96288f38dbad481b4f275b0bee14c94cee31cc4b6784ea3fdb4919c77233d2e9ca6150d435e8896064b75cd8a18a3ee9ce942c8da8b80ba75a77b2ccbe725672b5b9e39aba5df06", "6a65", 1, 1979779015, 0, "c2960d90cd7835688c41d32bd2d2120891b1669c8ceca5ff24c6d760479724bd"], - ["c3614f4c01580abec10ca01f8fc5587a7fa4ed809a7857dc4823386d3c08e0e03c6200699000000000076a00ac65536565b30a712a03f9f405000000000000f408c00400000000070053655163ac005f5c2b030000000005006565ac513b99f14303eccd79030000000000000000000000004876e8f75d9b81fe6cd8da3ec0661e96412f78421ba9889296e73524d21031f9992302b1e699e88d8e279c905cb4ee5c1bf764a36027c17f4a5d1515eada1ea1d8a3f402f20580dea527ab21e129b229ceb04746bfd8e49e3230836c649b5c7100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b4bce3651e8244074629e2541e5053b508115d993c9a8640fa1bda66c509fed39a0a8c06de1dd8b1181332a43f09b4b979d3ac44a77d6c7ee3510b90a88701564989ddc87d5abb6b46e90fd9596c7bb5213ea7254c417883d70b4334a577db647e1eb92b768bc1d132891e3091323d362ea9592f5f0a4d0bf2658a93a0131d53032321ff87910d05501c42cd07f6f720cff45f9b0ad712ba10981e9d61bbe857c002001630eeb4ca5ab974659127618aec4980b000db565386203691cd733e72d3ef0b029381a0cdb69211ea0f4c84ff2b3613e1d0094eeb3f6a0b68a05532f2fb440ca288bee892768247c1ed0c58d572eecf159c926816df84647f091b77915d034b0206e711a9af30f899bd4e76cf29128202b30658cfe50c4b9cc8326875348c6d83022dfe7e1f578de44c9803fa3c286471ab6316e2f8fd00a1afe3b53f86dc0b71f9021f6d482b718191f39688fb4a17b7df987f88ac9e6fd029ec386732aaa9c13d7a0322eb8a2bfd0316146bcc28b209d65e49a1a2960b6a96b3bac54bba5c7ac9144f03174af96f9f58b136144a6e68d821ec87cdee0e1395786a1b3be09574903816a9b34636396c9a1b95bb9de36b5a4a2444ce72bd00950e672d5a853654a10eef18896ca63604f0b0bdac7f7cc6ff1d791b285994545930956fca66800a6f73c9ba471354c1e155986453eaa268148ac2b2caae030070fba0c6b7d3920eebfad36310601df968ffb024a7240f58f46d99f481d7e7f0c2198979655cd71d88f9784140eab3dde6dabf083740ad7d5dbbf159312d6274e2023e9bcb99efa1e8db2187a3aa68799a70b4c70c68d9078623f72734e43863ab614e2f5c7cca1d55cd54c85545fde7b34103bb884143c12a087c7ad30cbb25cac48eaad76a8e96473ba969b7524554e9608a23aa31186b23e5b98e4fa8a33135cff59eb871167f097a82721c277e46788679f161d5786f1d078fc436114f4b69c164540d3cb48d9d2591adf15af8365a5d8c0474f595678fe948ae9c24958362a98c4f38d6f53d6660b3f940d6bf55eadf2c1e5cb417d6e433531f864b629230657a0144cb336c910105fb1f8d47edbeb3cb9a168e13f0962289d21f967a03c42fa9d6dfc1303e7561f0d6ae519c1644abace2c76e76bb2983b260fbddf6ad080b8c5da4488961055b9429fc238e55e7f771a49a8dc8fded40f5251c1c9c7a079f38d0c5d19ad833387d4d10f7047447847d70d8a68c08333e9f867fb124e496561baed34aa69e9c60d5945b852676e02fed22ef49df816cb70ef1be99f843b40c88932e9bb8d6c605bf10394189fe22a9b9a3e63f040398f7861dd2501d09004fd60f0278f93f0375f2e1c3add8a1c565fca40707d69bd78ed84f7d9a85c61a9c57c92be2ed0cf39304bd287d455526c33f772773af82c98acbb6b6e6bfeda86109f025c040db232cda67017a826f32fb4f50d7afbf9ee05b07cb7a0d3aa64b151515fd4fb4c3c3a0ce5c5a86fbb62107e6de2c23c26a61a99ca67b01f0c93dc7d9a2d85a01e08fa85f6c9d73d2384326a43011edf9f213b6066ef5f8aab61696eedc82545221ec777fd927299a6c4150f65efa3b60c99e87c3126ba85838a9aff5292104c56d380d40e9001d5435c86b96c8aa3ff4f7aa33c293aee45c83a96359c53719fbf61f2f1bfcae70e12114ff175bcd819a831bc96a20a0824993b44cdca38777e6f12c1850eab41507c62deb078cbddae56f9d7cf84735209428c1628ccb12fb3b02887200b23591d8467298c9f2d4e7c73d397e4a28f7fe73c35859b0955ceac8c805764e7440ac1cfad06f81b61d325cf9bd489b45c52b193fa4e69fcf647569f320f2bb01dd22ebafff6cab1533b54f11f55f194c15beb1340aea7902920d04c787136189e090d8360d31c567001d2c2e9d3c73e13d8c66b8b2014dd950c8edc2b0a6e5de993d0e6bc09a71187f5fd5ef13da59a038dc5c661996aa38e4afff61ef5e201223a3cfb858e0cbabf8be181e81136afd0707c7fb7e683644ba0f45435318f23e259c7813b5628ec5867f00cc22a2b324c24c9a63ba0401128988e93d1b16575ed7b5b9f533bce575afe1b104906e3e7bca5d04939cde8590c2ee0d92fc88794756bd651829114dabf83e652c8de57a469e3b7c76fc0226220b862cb8091d8e4d4abf02e008e2218d2289a7099274f5d0c8bc93c61487f280d62250c897badecbe56becca583e8369f9153c921bef9b3057c3050449bf69a3bd6bbc604cc48e6d0dce7d2654ead3184f24343677fbfd49bbfd29a193000000000000000000000000002d6c22a83540d59d1ac6ac7b18734f703d4cd51e7eba6ee533360d8449d385072792911d827885817b2aa42a7dc2df15c82e04e9b6fdcb0071dda6f10779894a415b26857db2efe33598ba72da3ddc38691a0091f4a8ad58811235e1d78fff2900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000be59458dee6648dfa13018e5121a6b747d5ea5bfbf41fae3086d6f73285c213bac7811976996edb2252a9436f1b2eef9bab3c2124c66e453366bace41c2f41e8c3ac59b9c4c67bd5cae87b5059da85d489ef3effa6634be046eee557a5e7cb7223adc66817c5634c10021d891fc63cf3833b29d9d4d60612061102235d0a91b6020fe511a7f756f39078d25c7cf2d326b4f91a17ff4aea2d83c04830d4d29f929b031aea20b947b02aebf5dbb8b99e1098d7c02b59796dda891b1df6e242272f35d00a07dd2e5084872a6ccfdf25a0ded16121cdddbd9df01a7f04e2aac910190cf1e3bde1a0e952993aef5874b6d71c11cc957da5c0f3ec9f0a69a06f096e1282b043021c8bc2625cf7aa178b1c03232fa798a023a8d2f27db43f23b1f308f25df40163031756f720acbf4cc62b01b1e4b1dc1d190dfe26ddc603c4078c7485df3f3b58c4032b12e4fb8327f576dfa9b48c61ccb2ebe67a140d3b9fe4e86d0fcb9a45dab2be03276b12ce1c44b51a0b064e87f9ea6fe30a916c81c03197a47df19b983c23048902213d511ccff8c38df9086e74faf9978b6d34c038c0ace42b57076592e9b34253d170143cd811dd8f9e1f8a3d618ef2f49709dc49be793f13d7cd0f02c748f9a71452415febf2d852c56c77275103665c401141e9512c605a2b41f40d7dc80f70422dd6ea42b0c3ba002e3444dd7c32985b9d14078344190bdae5fa64880a61e5cd892ebea62da4ea1c76798d28cc9943dd6933d13e7c80efb0c2561962e5c87db9612374977b399458132bb9e5d04ae76c7421743036eb95f7181928ff9b85b4fcd7af2ebd5fd30362f679149e915c489da89f1a5cc82b0bec2af7988bf39b6eca8f08314a3d9508c1359cf4f0617fbdbafe94bb3bea208ee47f10c0d983b0fbc6a942cefb102a89d8e36fa7b8fa2dc42788402615cdcb46e250d4e6afde13572f2aa76b99b685806d354e173dab3755aefb9c7d51d577aaa7e6aea2ac71defefca6430413d5a9eb51cac53b01f1e5279623d9eac153bfb6ff6381d6291c07392870a9157a00239aa4896d0ddf3aa47c48d06d44ce3b3334971fa91df3ac5603517d5e6e10009308d2ed07e0f67388cee66a870b23609fc134966713ed93d73f981c85fddee818f67b5d224d4487cc34610a8a46eaad3da4bc7e2ad4e562bd47a92065927175f5cb19781fdf356b00700c7272fd81d68b025f99163e1711cdf505beb8e19aa776500ded4b76df7e4e4dc65f3bb66f51801fa1e04003477cd0edfd6a59bd09e228dc8785c3414bee902b202e04f1f5746c87aaac63ca5f92ef5fe14ae9226056ec1778c80aa83e0b5f358fde8a73cd75b6128e2c096fb4e9ec6827c466261b1e4af8b90bdd8bf27032b5c3b191b97ae86d9b8818a9fc8ef26f83fd07dcf821d0c309383bd1a756777ab06afc1a2fc557ad20fde26a42bbed0bfbfd0dd75561d9544996981d4c7fed30bc6c44c475533378c2cea06cb722cad00cedb1b34be361d61c1b3414366a7c781df80190d061299d4539122a4865335452e58d2253c66f44700332e9f9db2701995f05d29f951d14e362b2ad273010c3f3d383c98798a0e6d76df04afe3bd1c0273d5c9b2e62356d46d0d18f1ba353aee4a5852afa05177be74dd489d0a8d6a5f6837993e73e06194a77e63d05a80b86398a5c9fdae1c52699ad4cf43e4c966bc1a37607456352da3840383dab7f614bdb3a873e51a495e9fcdefdf751d2abbf06cab9669e159ce51cc18d8db39d608d4d0e9c69cb52cf167c80ff3c76057d4e8c4dbee44fe85aa35afdaeb06bb7f9ffa372d97ec389c6c68b52c4d3a1ca6f0d42ab42175b4691b40d882152060620c67cd0a54a7b3496d1ab4fa1111db7a9a9a6a92abbe05a9876656cfee37c09dcc83bb90584a0b7d923c26b51db01284ca1abb6c6f9d1bcb9a59db216b903847503f1d08bf0f326bc1b946b91efdc50d9806d9804799b17f816b4b6c8eac9da4f9f9a485f0bb218318ecfb579f10bf57b5351245c19ad3f69245a3ce7cb8c419c4a6efe33b3d5d20f2912e84b4d001a8ea3c955806fb74e617d063be74ef7fe02cf0aa29417d087e95969e3fe185d205d98483c1365c6dfe314f77f291bf6423e887f9c3fbfc9a05956d666a016ce72fe613f510fdd918805bd7396e92c18742b3709f5f4763b2eebaae4ea0004b0b3c707b1f6634b72626c045de6db46f5838a5fc5e7f0ef05ad8c1e49a7eb161aef0c405dffde32774ea5403dbe38fe6c9d524519aa7f343e4f3821d02073af59715b17c8d2e65bf0f3030000000000000000000000007c080289c5c944fd6f4553fb1d65769f08f3a7b3039f8575a064682a8a7791f43ffb4949087f8a11077c721e3895d683ed6a5e7189c6230cbc5dadb7ad64a88fbeaba62ab8732217f11aec2b4df48fd1f52fe86188fd56315f15644c9672796e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065859b521e5ea68fc058568c0f9fcb2491fa63232c11ef85233c3e37dfbe08d659d04794bade20fdb87f947ee43da83c36ffc8da93e392e7b4f8ab49740ec71ff498beaa080f235b311212812787184340187027c7ee6586ecd875ae6f67da84a66bde9ec0c1bad24a3b4ccfdd0106eb293e30e1e0914a0605f09cb119a14f640224eca89572902eabf0e4d4e865a482b0b813eb942f43cbfff0a74d575ec05ae8031997aff3ee5667306a629d0e424dc69991587b69c9c03d724742594628c727080a04cae317a1608bdc67ba2d8e5f42e699d27d86ea98a4f1196165d6599b1935353f6b2f0008414731e1aae65335d605ef5ac68d402dde0a2f14b486d6292b6ba90311383a21698785a08cbef595abffe15e3b82dc0a988d7bdd95093ace35c7f4150305484e4c2d445b593c4fa8fe66240a619b396ec720075a02f57a8f07624a18c70221bf907572db310c6bb0f7097ead1d29386192abd14aed84d0d7cf34230d518d021bca418d1802c982df643f711ca759f48bc282bf7dcbdedeb86e5ebd01df5401032ea1db96db0dc39e0f006030c92469661131b5e3a4f1a00f1535a555113ed8b13796bc6a927ed0edd00904539aca815f96906dffa0c0d0c3eae75684689f376132b7770b68dc22accbef92f212ebb5446a4e9adcbd1711ee6d115aaf6e351afb552abe4b7132caa14b90f6d2eb6efe9b6dc6e51244f9b046b0e5aacdf4f56990d45d8687adb897937b734e017d6b30ad4f88e87c2a75c1d28abe729d4754250e686d4fe5bfdb333fee1f5d2a9444e1b48e2bdb6d15646466688846cb5cb8930223f2fb89912f5f176540a330f0924a23388e8827991f377ef8c888fcf1164adcfa1841b4a7660872fabaa1b5265196e0ff454841bd54d7956fdebaf94b3fdcbefbe37ffc414ccbfcfd4ebfca1a06fa29871d2ab3039c7a353a3435e6b730e89748b1ab002d4e2d01f000785dc1be2d952042036b610d40afcf3445248afddfa158d80caa41cc9cd7cb37470c62933a8185fb1345f55a5ec0f27ca6a56fe0c9932d94dd1cc266d0860dd9e3721db4938bc45a54d548368b704c1b841e0e9da9d2298c49f7423e309768f038383dff5d9696cb6de48e4fc595f148108c62e71fcab67b2320effefdbb2818637d0f0265d99bd709c437f4c72d1f4014d6f74ede1e6c97b7ea268a35a0f5f4feb02af11a7e41b4f019ae26af02a3984dcf1826813bb7acffc549795e4581c03f76e8adfa81eb7dcede301b62bbe2701e6283fd6a5979d8893719e36dcd79dc94b67e4040442680c06e884cc07089f885c782d96c3d64ded30c879b57d78fa8fb3a5c9eff38aad0261d86e9e9cb17157485239a199b633aad0a6a1801adf84515bb0f6b853b664b180cff45919429eeb3d7fa60b30ec07dad544bb8fe63dac0e838ea0d77087a1eb6b1d6c6d1a03321208232f4c456e1abe6c0c148a28520ab208a3222173fab4a741a6f9f2a8d9b424371ef9d6b586b08466dc454016f58233f1fe60c71a86c3d2099841fb5946c9bb3acf45a7c189238fab8e6947880d13f4b74fa554326a556145235c4cf4d78100254b07119a863cd41712d7d90ec0c90d037d85a08e77629ba39644cc5bcf2a65b1b29601749d818f4a96b4dcee6c3d7c08323067d8d8a6ef004c00144009711c04e134c460fefaff3be749a64c9d1628047c50d5f6c8a153a07006644969a0670799c5c8339938b62494a59604f51e39f568e3fdb3292e7e9b2f0ed6fda32e58c3f2db21f7832208401157e06a83df4781915fdf90b7735ac55c22b0945ef210de5e7c506d924ae5632e7ffcaff5d0bb67124327201ca17208757dbe7aad7e070f91d4f412d487c6a22aa41c0668b3ee66ee0bf9af5134d6eb9b2c2059797e22927be449641689443cd5b03ceb2954dbf4ba170978463952131b251c30e4cd6f05a6aceabf84771f31f4cce624b9c90c0ecb2e81d8d94cd22e0fdb4f1ad151baf8b94482e53f195aae50b2ce8d4c9adde7f74b2870f73dfc1b8197bf1c19a64ad5e8014a38bb9ea073b68518d6aed41ee8f79404b735f9137502524e6b3f0d0fa24ad8c41a82683b504899099213d6a3336098355162070d064edbe756bb60461717f49112835cdea34644912c7142047b922cfcbbe17ea98051cab7abafbe14686984341b35909e4919795e7e7dafc13cda70bf2c8c2db18cfd9b1cf4768a0a0c8d234a7eb5d37fc04234f7d4b9a03e028ba6d081028423c593a675a84078b6edf6376e3c2722a5e17b3bdc744e203d8229d0a950cac047e57d30b9401281eb82c79cd86d1c0bf115653795c6fc6b306865fef4fd271a197af39e6fe863af5f95d1963d838c432afc5b77d890c9ab1be22b4ed06cc0650b9b56c52a26a2df7337245a959c6e1a2d78c5b2a548adb6d2ba4bf99e6679000", "ac516a63656aacac51", 0, -1372799624, 0, "eedae3dbc270e933ee5eed4af53bb3f06da1e3d867665e9578c5a96f0bba5d3f"], - ["030000807082c4030459922c13039878740ee365960f1d29f6a59d28a476cd0da2c55a8a68a2c78824010000000251ac5f53575cec0553e327eee18d5c0f8beab9c46d8acddb340595e802c26f5dbeeb950f53ba0200000007ac636300535100ffffffff1c2c86764a526792bec0258dfc7d55e4cafb420530fdcb4e6348f6569f37732c01000000045151ac51ffffffff0bad84af076b32e8f98d49f14b906e46c15f442ad3e61d02b00f694fb70e76b002000000066a00ac006365ffffffff0258fcc5000000000003ac526372fe0000000000000700516a65526500000000001a74f7de016c635f02000000000000000000000000ed3692e306aa27e9206e89738417ca2154d6b1fdb561b44edfafba5fb69176ab23b59fbebe555ad56946a00d2afcd2d32350e1451af8ef45ceb1d57a0c268008870c34406df8fd7fc4011e0a06ac9a1e9d40b9dd4787d1cf3959a03445b9f38300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c80e1b3deba619b72e5bafdb15e3517f7721c3d00080fd5080af5002d70f6eb7528a0352ea940e7b7d7b5c4759f2b1bdd89f5865d17ee21396d492df278613cc96ae20c433b112b96fdc2b3c9c27130cce236ad250dea987b7b1b14ec22aa50c0a38e54d3bbddc9bc7bb82ad3aefed20707421cc84b8fa38009039cf29ba99f202089be2555031423f2918577d98c678e51d85b9f7abb130f757d5e23514a1ee47020a6e6dcc2ab84505048bba9bf89408bcdba543fcdef464eb2bf124715624a3750a04177908b637d50f2928f6f3c5901c2db44c0bea1021155e24eb4f6b80be3e7c0fe1f1a0366d2a947865173bf9cb7cef9e4f513e6a79c77fbc421630051c6a3903216daebdfa6c1c9451ea3841639c3ddf101547264cc485f9dacefbd278ee4f43022c2fe3ff1f76acd9c08e4812978ca675c87f43300e6e1a96ab30f5af4adaf780022b32dba307f01d23dca59b4e25062fac07554b3fbb5942721560a3e94ff5d9c7020109ef859a0e97c62ed51474b64e92c44c5b20a6a87ac752120415ec51759d0102229ff8a3a46909f59d065c557f5e5c9efcb9cbf0b7c4bda4c8049f6ab265cb1174599247b48ff98f6001bd1359e1bc86811c806328badd0ed1f564533c0a501034d3bf9bfa5a127cd06ae18f40b40288322086fcd70fa7bfebf3397cf6fd9f43134c120b76286a9087b93a03debd361bbd8876a97504017a077f690e6bd87c9617f6f78bb3d65b5bef5495b60c959e536d77a0070fe021e7df117b1283a5d208515499e896e272e7992e685249c78c6546fea68dea53d25e47eab67ec5951845d5f65c603dab3acd95346da61cce4b1a21a59d5b5b02a8030135c9a3371cf486274ca09145cfdaf863a09dae23cde627284d84cc67041d5baa10a7d66a49d8e446a706ad43c4b0651d97a64cf615c776115e6252b152708573fb652edb0d6406722e29e14d4081b2022ddc8c1f4d1965e40c893a302e72aff144175d530ac7228c1ef68ec7e84778d3b75596bd9d1131ce1b5fb674b20ac910d4b1e0f1980b0cfc2ee71d971a0c2ba1c3a6c390a45236534102180cbb3257ef6c173c4ad187b2a40161fbe43fd3490930f5e0be5fc61a7fe2d424487fd0d87009528e7dfd386445663e3dbadde808d585d3c3a80eedec49b148951db26ba44e71484a088c8024261c842acf3032c65b3b5619d7f10aa87badf3598477f1ca02895eed75e1b119089dc7e79960a1f17e69c5c644b83d19b21eb8285c16c7cceec57f26076c7d49d3c9e965451c1c054d395734e3f4355a6dae7aef3933f7aaa2609186a35d0c569d39588e5ee1cb47badd8240cdb5f91fc1393cba70cf8b22beb85a718eacedb9eddf69522469457bb80f16831f729e0a2e9edd02b5548070a27ee6b61c60bf3a8fe198c79853cc669fbd0bc99806a3d306218714c8c026f1cb1bb1c26d48eb755b600bd911a3f16f059cc3a4792f9da88436df65e4b4cad98b01a801c3fcd35646a4af132e0e618b71298bd55e381e2d5ea662c3bf9e61a7e98dce54c3cb3e49e4d16cf7f0ba6dfa35663d8fd398c254a55a75a2550d3d48e0cc083572f3d3958a37fadad77110e066fba7673424ae978b3ebb20b63b83c68e088f338ed4424345a3c05e88368ce9467aa59e0129227ff6e12df09979f3ece00358ad949ee0fc99ca1c73bee7585ddc2dc333bcc9ba8b69bf674843bfa433d77b34d071796ff5519438741963936cf49212180c8ce2388d84eeef135a9c75d739bce0c4e115e7b013f6bd1d77a8ab6505278e93d3bd99a75712656635eb0cc1634472ac2551ee62b3d73bf3e92e3e2f75d3bde3dac409a99c540d03e5f66b15765892f1df9a16286bb03806a144befe3ce5fa8d05be63d60a26a2c7446e61bd5213d76eab563a14f9b09ab27c7b671786d75e6fb8bea3e228d5a5d2ae6b1e36062a4f6a37f8b49d8370a1884f34a74bef1c180ea7c572f9224aace3a9ef2d2d1f479c567eb87a12e5565005b1176f0f3159a66c556754457bd4c527f8ce65c5a1fb870fd5d1062a71d05d769e658b2ca020b27b0633b423f50ffe4d3ae2688d015c9465da4a2206e92f05685a275112053e1f768c034423dc19a7edd633a6b270dd63ee086eef95bfb971709976dde11df1be49b3e208c832a67a56b5fbce455bbfa5a84a955ef9191b762ec18b30215a9f21d3d9b88c823baf07715b237019846f107a722b14cbca5c489d3951dd80454271b553fdf2ea54ef8a651db1bf5ae3d5b89b87a370f16dfbaebf39af27ccdeeba4b85fb7a41541a81196f5a55e9d434d7ba9f9609ad1832201988ec3218ae2b096b7458c928d0fb7befd2a695f286585377ae3f6cb451a172099bfa347d157ccec52de759ffbf4732d6c92ae20a82424ed649997ae65d68bf450b609216451530828da8985b40b", "", 0, 1957292011, 1537743641, "0ecdeaefb4b90e487ccddf02e9bc73f04aed5be29f65add88f3943dc9def49f0"], - ["030000807082c4030249eb66f1d7887320da8d3b550daa64cf629cec26544ab744f5ffcbe8cebbad5d0000000003635265ffffffff780062def0490e2d36c8a4490ff05e724baa6cd4392db87cb1b6539977246972010000000600005100ac65ffffffff01f0b9ae0500000000055352525365bfd5299f7eb1886100", "ac6563005263630052", 1, 444754781, 0, "a168ac3655a61e6f750441f7e7adb386b02fac1262a97efd2bd0dd225f280ab2"], - ["e6e5e2290171e1961977008334a3ffc5af444949fc305c5280677d675c4b4b5430eb8c95440300000008526a656a6552ac657b0197be04074eb9050000000005acac51656a7e50930400000000096500ac00ac53ac53523a11550000000000005724cd04000000000200520000000003f9b21b01000000000000000000000000afe850874260fd620ada5a1608ce8d6b60964ea0c6c52820be0896c0d1cd52407cb0352e4c987dc9c078236e4a185877755f039fc743867e0b900cae50e210acf2173f01b06efb9f7ce8ac05a666c60c7d5aa56dc7c309b011f8fe302187388b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003bba67cf12a36762bc140abd8fbea35b149654c5a4886bb4612517582e9e2d91b1bee175cbaf2c942afd9cda94a2042cc2b820cdd618c4bc54167515b2de7f0c46d6832ef3024a1760bbb4a9d2d87a65be313a869d2dfe366ac68b360787849999f8dc817d0d9ad35a6d9942cc2c06db5c911a35a0112743a92d25219c4e24990324686c7e2abe7abf2e7d6c0ab376cbd0c97251c34b53879a547ce305a30acdcd022217ea9c7fd0fabc58cf9f9595b068f892061a92a98e2b2c4b9861efe6cab77f0a00b23102526e944b46c974fecda56260044ffab95679ca5bba43b69d276cee38bb861fb576190104571b15b030998828e3e0bd3539b3d948984b79227c00669b0319b285c3a871a964dd99b3f558dcc63149dd23d29d8c8d29c0c66f9af927689f031e47d166c80f739351b4f1a4a74fd9cb2b6fe7a0275e225de26444d5bcb49f52021e1f7d93b85f6a152c34ed8d0999ba4ab430d1aab40472dfcd129c4963da23a70323210abbcd3af166fbabe8557aa28f28cb20cb62880638edd7b0330489a273100202f1e587b5fdb15622feed41153e28c18cedbc1d35f95b27c00e8a049c0bb48ae591243ebfab8d559f128570a6e4c7c9cb51612c86842426d80f0bbc7f3164ccb2ddc0a7effad5dfadb93c20ac3e9e590ce161de70e360cc206eb2ad5bef87cecfe1ccc6dbba8d211a3c9233efcccad1f4c3ba64805f55812d1da6b1d8466be3dcbc8b9eef169f33222521a503dd9cb732de0054a7354830b5682958d5e638def9e9bf1bbf94afef78ff6eeecbc794c2561ee1894161e371169dc3a518988c6b774ed6ef4ebcb1a7ea830f9507deb20859f79175b01554acc1da27b6a0c6c828e7c7530373da356619f252cfe22e41e5ecc3705f3d07460b37cc19ba4c1fd1c47fbafb317ba2fcd34e01615eed30981ed34eaf689e3916a2706c5bd90b4310a3e9594d8ceeee058a0375883a3ee3d53ae2005bb27d8391a89ae15906d70b4691691e409547e4218caf2b84229b8a4b05eb0df7bdf9fe96545150cd76b32262428d1b2692bf719107b1ab65e2ebb2548b9208c847fd841acad286fbd362a25cc557dcf4110584b2fefe590e3ac1fe52927e9204b5576be6eba81a535b542a324d81f6e340c2db3a0e2e76e0b9dbe4a7a9c04d166b1e303a475f57225b10a80a308ee874e9d71e55d785d9ae11d8052995a6dfa77227bcaee169b557f3692a1e78abf59cbed37f21dae22f0242f9b9826de4a393d3631d14aa50d29278fa21a112e2f31da313afeb97d3564614aa375967ae3b49609f5feff732ba75b168662958ad13e162bdede4dc9eef471c16dd7fba07a2cc970e58a6e4f6da0258a0b4309be2b0939bcb01f856f1049806cc8591010a5779007b14daead4778043d80de6a2eccfd958d39212915278b396d6a87af0d552d5bdae653a9091e3fbeba0339cc7c99698115e6d4aa5adebd9cdb29f8c195a914026c2312aed7e03ec7bcdec19c14bb3471099ff113c656694a6c5295fe07be7ff8b7685248b99747ca13894b58987a4b3e2d831481d66e11e6e52f1c83c6ba3264b8f246524b648ea8a934479dd04d35f31ce1f57eb405b50b719c48ab3a3d96a52fcbe2c9ced245cd7260ca04d97fcfff8ad732f5445ab606db809775961f35ed8979c4671bc9d52fc6433bce57a5acef60838611dc1fe4f8cb34539eb16eb560017ece625f74c17239e3e1a9cfd57316a759395db72579297248d1eddd2bb2f8f10e89cf96eb1a3f35126718cc3d13f9d585807cd44deb8aaabb965105649978ebd7ea16b20282e9f2eb8c84ca606f6d4af728c7b830ed22c33fb2aef5614ae6c8b145e1a9f1efb31d6c8d02ea32e79df1a735b91e6f5babcc3052676e0123148bd34f75966344e6c4da4f40bb0202850d4c963c033ff7d43a126c9b3408f8da709eb827c4c3e647b474623989bb062bb517da45621efcf452f49df76452e3763e0f2ecb0ef68a41aca658d22b11e8cb89f24386195bdc0625ed00f505457c4483b662cf04ab91abd24027b19193530e73974fd47500e19dc8ddc8676ee44113270dac7c726ede96a6611c5d36c49fa0831ac70ffc07fa7c3a2931748e562d5e5cc529842e5cda74e11774af6160a0f2edc7e1e98b3207d0147d1c57bef49f829e23f5bdd71b02177ea93393667f053e4b2c5a39ac442a25b13f7bf6486e8ebf0b06a96772360f70e4cc941c8297545a66fb14cdfec7af73db8bb5525a48942c86ca2e9121946168e0cb9de76e6334f630aa598c25153f9e1d8a830d6491e0000000000000000f10a2805000000005240333ad9ac4a6ccfb069fc687730c8ca0bc1c6ddb760b56f6f498135865262f2e9513e0196ff728343446191fa79e4f3f80dd5e9b7a9ec761a6cd136c489c2a85333524384068c4fdafdc843b8279c770e8b70798f148d042cfb8abc2a248800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c2ab20896d0504ce1a8dba861acdf85a995423da2e23fc2c4c7941c4444a5a632f9685154dac15eaf8bea48ddecad749f2585e09513c859afb9b541c38241d8b8a8e7c254647086f145ad72c7b924521f7e666868f479366706f686fce6916691c81fc96e8d6c02f70bddfe441c578f4a59a40cba5634547cec55e94113f1a86032c5afcf39105cf560dc13b80a2000723aa74e0bf777fef9559fc2e2924592e8d022014ece609963273c85f86407198f42adf7446c5c29694330eb693370ee307070b015be3333f4a6f935b9cbf7871d692ff5c5876bed274111bc30d051836244060e601f106c2ac304b14a0eeadb2a4da0d7af0483887af1be056ad19079643b9f8030bfbae4fda446fa9452afd722a96eab21a21cd50ef29de2ec9d36445b45131070205bc330a3053a37c221da377990795b2b02259b9284fc2d40e70f4b1bdacb94f022b16f2011b8fa4c6319f3c9e7ec1c92297cfb566d07393cb64b1d070f78cf01e0214f3777453302e31069d34dc69a2d6dd0d24b7ad1b90696dadfa00f5a0b781310324a408135db13309371d0a690177df803b18373695575038f4716d43c41085e4cbfbf70bdd8a907dc0417cdcc060ceeb82edeb89a1ae343e5cfd15d194c9b8e6f63f175512ce0a2dafe8800c61aa3f97670bbfca5435c37c360bed3be7bdbcf311f55e7b19a27595fb0091cb902e9e8611a910f09f1ab0729d0104c572f4db6e4676213598dc347f08e35b7c13cea1a2b321748f3ed9faf1256a361521db8e1f92f1d7e44c278e58f66ed0defda85753e030b983ffa3bbf82daa9cdcc3dcfb58c7ba5fc1d99cd0bedde15aeb6dc1518d06f35f3da46a74ad06fe75666315b12398afa86a3a18a924c2c0d6c5beda6e5a7f768b0b3ba30ae3fa0bd53bfbffd6abb984a7ec158a4215333e839635ba248a5d2260ede52b77a2579dac732b43099beab33be0941d98ea5eba2912dc2949fca23be955c57b92d96fcf4f19e424f0b4749255d8a47e53808a3abcfdefcb2b89589ff8f419e30bb6d2955b9622bbc43c02bd030e1f634c6af7bb574fb22b86731bf3a0d38f260ccbac7af5f3c185bf279af99f8c4be3df27d60350ae962881e2eeb56e78b5eca9972fb8d4feaeff3555349df13937c22760c070fb4e1496ff3ed3ace9a12627e867cef57c1aadd150f26bad0d262e517ad0ee45aea34ee8283c1642fcc4b4acdc7a431bddef2d31738156de056b3fd26f35ef48b3801e2a1a27c65ee6f6e65c79418393593975e5f911d9b944723d332b3604aa54472acaf856de2974e2c8e64df04d6b600b0bcf54d6e292fb48849eb5516b7b4c4a0232ed66d9668ca8adce7f79b2a38449c4b33c298e74ca9713102f3459e8a26650d26f3de78aa594a16db50fb254e8e73ef074785de11ca64ddb3791891728a5d8dffd8c413e277e61ab5e47e161b68b032f723e8f6b831d63453a52f4ec9fd0d8243d178229f36476fbdbdcbb397d87f37df8b267b834d26eec060172d3412675acab09d0dce425a3c753ea06c9bb29b90a193b116a2970608926e79583bdc4ef9423d9514f9e1d01d69e31b247d64fb94b055fa578c4890e9edf57acf12a01b8c71f03b9f0b03d2db9585028bd2924bdedfd5021f444f4b9642612700ecac81fc251d21fad1ae41b199eedc53a567a3cc9d4b809d25c2e7d76b310b30fe89c8814ec18743052847b4f698ea4ce84d60715b6dd585dc334be5d1f8ea9cce43f3bc40cbca332458b6d6d676a14a02e9bf6282ee25041489ca5c2fc9f9ac703e4617c2d3ed78eca4fcbf90ad678d22a7e9bb979712cc362e4dde2088878b4a553ab3d11450b2dfaa1ae589772d5da49c89e1824069fde59c5635196306a9d00ea99a996eaea95e4c02949bf893ce71568914ce9c15fc524d1625c15e1f28db8c1a9e077abc64eb37820cf0cc8cf253d22814099f67de565dca3526108a88059cc3d93a95fe9f047ce876177dea53f0a6d5550d10ee6299e6f49d80e85f3d85cbb7618f236837ef99bb3d12fbfcaff146113e5445a2a5e44881345e3d629b95ae58813ad974a1b76863152e11912a53ec2dd273e2623d7eef3d8dce39472be0ee0dc502344162935de221db3b8a96502f410cccf450d70c2b53a966084250cb8bd9cdfc8e96f45dbe4451a67c2333640de69de5f141742b57e9fc9c40b861a8547fb5d98c538ea976381a1bc852f54f5aa587eb355eb82291eaedb266afce32b4d72f0869f71ad6e0b63643523fcb1ca722e6791945c09b5e12992553a721cfad5b0e8188b0f8d0000000000000000519be402000000003102dd2ae8d5be460197a4e9a0ac79577ce3aff2a4356340856f4e36d8615053aa409ec53de0ee2acd0dc3d9a49076684d3eaa6272aa710a804ba8adf82679ccea256cb551a555135f2d42c63b72e1e3b7dee9a22ece675ed4d87bb1d7a11b2b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c97022bada913e33e8aea02915ad1ab9eb1b3cb759993c673b49cbacf7efe3e4dbd7e4ed79bc805e4d20ba5e5e87a91c6a945f61ee1b20baa796a34b98032b362c2c831b5d6ad2debc723ea03af2b33745cd281b0ecdbec198c5501b93910fa5f5859e5647e9f0cd0a8823779f320ecb4b6db1295d7dc42c84770113c1eab64902055d716acbe2b121984b88bd19d2307a38b5be41690c729aaed7ff930351bb7e03292ccd814ef54185536c2b96bbf417016e87c51899d16ec2852da897607275080b03143d9ae4852bb555c042152354a88a6d3d57af172bd14f84e1e902c8250627014faf7d0583b7a00e595112e5343bd52026553320ce1704c3708e0147f057c4021702afd665dfaded24ba91de4bf24f95d6992d0d72a9320578c0e2e6649652b1030c09e355177747980543ccf6d1937623ade70c06e0d92a6c8877ab287cefb2c00219d5fb7d9117598692460597908e0efbcef6cb4f50e0c489ee5dd868586a7eab030cd7f7e0d065d25e822f177e853b76dfa0bfa5a12d91be293e54f1a2baa99c39030894ed93cc03b76632677265235d38854bf286f315aca4f922cfc5a33769c08816d06d40cb199ffe6068c63101b2b40061a35d5e108ebbb1a6f886e8807962663fff0559986be1debb49a2350105a999b0c48a6cbd6df1ebad50a0d9d3964799e0661f2b810214073cec4f899495d96dc3a63b8c4ac3beff5f706b523da2c5d2d21f60c6d4dcb8530168b24e718cb6724b8ea5ec6f62b795382f5de5eb9707ccb80249cd552f704749a1ec6e8620df0152c71dfecff1487eda0a7694446017f38595183e5b2340dc3470d3584635f71774c366e4f12ce1c3ee8ff4a865a14299c64ed6f44705c247dd83fa43b83d94cee424952a819ab53f3422c5d5cd93758396330311536bb8635298599c0284afbe8f68d16a706baccfe4e89ddec231be735c241af8359508d9835aee21b1945041e2c52a8717e2bd91d292b03612dad47984e11133df6a1e76ee1b338b03928cea9ac357bc47a9934e2b29e5aca54edcd6521ffe9e3e33f3e26df77673e974849fa12709a2d4ace3028d7e5d311211e0ade23899956bf5b65079c104aa9e9a9225fd03186cdea74322e4413403c57302bdb9398e4adbffdbef7f1621fe319756bb265becc1861360ce07c09d2c99ff03f7704fde1dfade96ba4a17aa6cd9190fbfde3d3def39445fe67be8d4fc4f0da71db2ac6a9512dd7a9e511f5ab16362c50deaf03eef7e7b13dabfbff23deee311e09a56da38ad436c0759115a076b148e393e2acb0349244824f0893d6d3acb3e341627696bf6227a63f0c1e953a17b57cdf074805827350ff02ad2fc722fd5bd77258bb24d666daf4c6b635e4f31ad9cc581d2ca3fb2346cfae3b4bd9ea563edb0aea3ef44f3d886def239fdc9fb000714f21263236bc2b48eca50659bb0b6e84b3c2d66c81bf9c832f1e491b727fddb1abb2fd990c3e1109640b44d075fc5ed72a32906747fc51517d2413e07e6f6188e55d979b22b6edbf13b39e0ce65e09509464be072bc1ef81e6009b7955dc39c1a32875dc31e0284648538f2aa619a4918e72865de9893634e2cbb3fd95f36c6a3c2738d7e63b208c1ba27fb5e0b272aadd372ae40dad1d48d32d2105ab5c817ac20f84da0af12c42b927bf572e8046c37d60993fd1354deb7a5604ec2df298cab9f8cb0901c052ecb9ee07a59a3240b73ebc162a9ebac187f9b0043a91042024774df770e9b5e474549e778e7f40843265f57dd019ab7e62d94de42554fc9e0891d457beaef6a533e6e81b64af1de94c49ed87a881f55fde098ffc2b9a9b071a9bdddaf9e6d3e0ef51633f9a1a3b3705a297a70ccf068ca56d9cf91ca673073228939413adbbc8ce1eec4709ee4a02b81d0c0a3d89c57ed42f241585aaf907c0a4f4a9ddabec7756c46facdc1ba904d60e8c9af1f040ff54d0414802ec5108026ba52b7c1fd960ee7474298eb469867d9da55c346855eefc72a8107f61eb4370fa11ac773567671ed246974204d65aef5d4816d864708f93879bf5331f2b15fff0d65fe850ae01faf9e6601155a1ba4907356b89b5739bde3b81bfc58ef691b635a29cd83df522d4f02775ef9fd2488ace361d48655ddc7b30f9f6276a128e43fd201651d4ea04ee3dd2eb837f4fec1a133025746553198b79563b55615db42b54db93a8b8796d8e8f48ad8e351efece26e97200473caef64c3ea7158ee9c0b2353fecf7de32c3529bb3b084d5e5332405907063ffaa1fb589a958ac527690e9dc9eaac0fd23cdf7927cdc45aacadf2554a528f24212c83460ff40d9af08ed9449ad254139ce75de3fc7648c6c5e29023057b57577762aa15fc727413d60fe9bdc2b4e8a0f8d6ad41d6dc3f215a580062d305e633186cd5f47814784ac1acd1346d0a", "6a520065ac006a516a", 0, 1696061112, 0, "61a578064714a2387d9ad1fcddabd1703342c558016de79358f6ab260b0e673c"], - ["17cb8b170186db1316df0d874bfd7dddfdab688341c599217106c6ad6bb058b26ad4c2d086010000000952516a0000636aacacffffffff0423b6660000000000085153516a53520051eb1d21050000000000033bd6050000000002ac51bb6d320100000000016561b7c174035c062f050000000000000000000000007cd4e76c48dda6ae9b92b0c946516228c3bbed23248352394a7ddc3b8489a498b68a3e4d892016eb9857cf8a52e3c80ac89ee5f180b851b5f92fe381d3e4f2fc0d4d45d798a0f7fac1afead5a418f4e97de96e3a7224d525dd100945d505007100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8dd35d3bee57dc3432999b9887a805ae328b47a3c1a6fa7b9333d2241f933ab696d795731f21d8af2e3134581e4bacf3b0c171456f135330e8bff4a4f6d340e4933358e66bd0922abc18d21a9962cdbcc539123ab3d3f8791aead457a62b1bc490de9e7572b1324df3d3639d66712f5693fd1068f6ac084838cbc8da76ac26d03128e71e21c729bf4fd233b08493876ef89e209b0b41fa3ceb265e6463871cda9030c15b5cf784dd7400ac08af03a1ced6af9e956b12c52f4d331fc1ab43019d1390a063fbdd04728eb848023eef8a03d738c644a84031213c4262d323b8603727551e93cf51a93be62126aae544eccac4931c78013664422c76dbb894acf51c8c1030324354ec8e5b3c96752040366c77ef3dc401bb20aafbfb3915207070969c7ff3f0206e311843017f34a3d8d2a6a5eb40d5771f39709cadd8a2805b7cef1cecaa618032e6cbf9b6af6c337d172cdaa5e58c324cca8b1cb7e3639495dca7be8fce703fc02056c35d96f7adebb9e4e5a53a9ce0045a845069e24b9b6d245525c331b516c77032a1b73bbe48a1583df3489a5b32770cd1b3d618de35a80d9644471b92fcc191b3e42f3d5fea30e1f4f78a3cf1451e0b1276271c4197f6aecafa1890fd9df75443c1220dde0b2f3e21bd5715690f8a0c2dceb214856193329e02f9ca6faff95f8c0dbb9eb22675e1faf4e9dcef06e9eefa3db908facd02ec17f2c55edcd03a1b8e109fa0c2ac9f9d4abda33555df010161991a4b012be46d0a053cca163f8a7cf313b0d2829b7e3df9624ce3ad645a72d4e9ef0f08b10428b6f7c8308a40c5301f4393fb0cae80d6677ccb45af943906de7f177d2b903e28730619623cb835b35bcdc1587044aea354e739664190f2857e44bf6fdd0a8971dd07c703072f47e538cd748dbfceecacb6080e2e948664774cd576e060cb17fdaf99fdaf96cf13b2dce9cc2515d43e443c540bf1f8f87c1dbf813d0b308ecd10b75ffba9080ce747400b92d890e0396b1bd094e30d67d46f709469c1429fb503af1e03d0181074def54c7eec184faa8ece8435c2f062894eaad2931bb946de06a1d18d9494144fd67168b7af95f5cd8109e899c31627f8bebdd4686c28df3b05f9903b89f1319491f19d0fd7fe573d2c6490afab858412301b0ce7a67b0e3da5661ad458ad960b4fda42f4672d19011640cb3f39f64003a12ea7f8214f4168b2f98494117d33c0a0948a20e79fd23abc3e619169c50782f128b53cf1e40b2c65b0c074c8c945ae16f6db86a23c85d830129dbac66d94676f658755944938d982f8d2bacddc3ee78751bc0eae2b0abd2f34ce8220cb6f3b3d7b8cc8855ac60293760693cbd5600881170d18ea7d81a9a816a7e5ff54e308fc6a105f45fa91621767957128548d33f4c302105e1d8e5c7ec8facdf6c24bbe3bc8a8ca2047c0e2eb69fccdb1f4795cbc616d7e74325624ab8e746b81260fb2e616364c81a0dc26d602750e3c9c97b958110d06cb523ee73ab42e6195fab9469eb1a3aa0eb5492e15c6aa36b4ba0cc77728180a76cfd90438d8bf3298b7c6ad28071fbf6d8bb0533f64b36825cd342b4634726875cf9cc027a23696f3c8752dffe0e9d20cc627a3775effcacdefeccff777cae492651f90fe8d497b9583e78fba6b623b1a3418a81da147e0a7ea5887d614ed079d52bc34b3a79e8567b3baa68b4522561d6439a56de72a154f757f45de137d714e16a17fc79fc1d1654766833a1bb7159c2592770f1a0b1f7bb527933a2abc7f3c2d1882689f7e72e757ce470d761e07dc1c2776a420f644f9ad456ac9aadb51a05b3591ecd375bb374485e2f5ab9a4c6e481f272a34e79075ad01391fc0a7636952fc58fa6a909433f230fae022d134f9f0b4041ca8ca4cdf0d184e0ea75ea0a25773f6d015eff3d9e734d345a63854e053d038c6d36b35676b93207153fc559b42e19f8d95122dff2cd3f7859d9e8c00205fdfb5bf277fe3fa93daf0e83f4e00d1b6890d92497b3b7391cd2a7c38172630431ecd74adffc99761e6af8f4cad4d824d13f55d4e7607e5663edd5949aafd6db1c8da23f0344cea389de26e66a7348746dfc958ba01142716fdbcb2b5be61f3978a2e9c447f9db572a5be582ec0a41a2aaa14c8cbdaf26106da8653e9ccaad733bf6da4a00aff62e98ea8970313552935733c33cf9a25e570fc2286205f47bd6592c61f0f051ecd7349677f2d2a4ec6886abd9f716b8cec3892b5bcd4137adb28fb25aabcb708a1a751c5432987cc7d424418aea5f65f7e91af6d21b136faf3303000000000000000000000000ab73e035ea2e00f484f8bf78bb72ea4e23a1d7c4f6f58ef003fade4ce64839d5c1823b5cd3df165067df9d08171ec0e5ac430f9ca68f8c8b1737402eb2a2f7ec890ce2103c27ef26b4ed8f000cf9c35d4eda9bee3240eb1124abc150d328808000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f733b6b8bc702a382a6fca298eeaeab8bce756fa2fdb1852e8682c3ee8972986ccc0d524216de40869e3f2aedd0cd885472c83832882519e8752553044ba6b86798f7ce46050bf6e4adae13da1baf4dd847bc87ceb77681a88446948d64ecfa69483955e1abc06bdcbe673c4e1d063f2e5f6b3388283f4609b895c45adb977df032099caa03fe900e9ff36a919efb1b5c45dfa9a94f334de8b4a2529c872abf3d8031278c03a04a737640895cb7d44f5e69fe80821384a5919b3dec3cb4f5e27ceb70a08e93823715b464702dc9d57df2510b0fc0d5d44f13847e375f2095ac31e4f48c7e930fe3f25e4f6741580b98b425029df3a13f550bf44b6c076973f22c8fa27021c3152d33de00ebdb78ab0ee82db4aa14715cecd4243d5d740967d2ee3de3ce3020465c6b1c05432f5659bea1dac5750e08f259e11a1fbabb2c9b6b989652765bc031d3c0a8918fbfb1771e9cd001195e547322c600be840ee4b650e2e424aa369ac031e96d196761e802024b08dd9d6699e2d63671088430fa9228a02f57866de124b0320bd6cc896cd748a8b0e12a07bced52f720b0d0c2c54cac2776f59b6ba624913642a6052cc88545ceed1331d30628957193e191f3b5d36c1f241063da93418c68a1fbacdfbb69001990d1177415cad72a4a1cc453da807ea698a60298667f8e3213d2dcd27f21181b5203f2f98a67588859f5836cecb09a84541548b466d171130145d55dda99bab8a550d919caad4ecf832ce05098e7ed27cfea35d904b8eed18cdf4fa4066e323d1ebbe95a46c9358d968354e675a5140b4288b6492130fd6653b3879e8b24b543de084ff9d0b0cf2974f46b710ffa17d3cbecb9ac6f85980ce6017970ab0e87441224f92d83fba00b493d4aec49869be04b3ca6f78837d18459425c75bdd1503f9b933af6e2c34b79b5fcce45696a370ff9dc4866d2001bcfafc04d2c21971d860f077ea7b3dffdcbe79341c3b5e2a52e492232caa3f3fa3fe82a7b4e99ac7730cee6a79740c732a4ba1a13c5dce0e39c8fee3ef803ab226cb70b66a7f40cf03186d9901f4d8b8f13b07daa2e594a783b62fb9d0da45d489d8e9b9875c1114956fc1abecbb7d099fd3a9c8ea24f1473844d0d2ff82a40b5f29aadcdd2fd39b9c3e552c7872a2976930ce6891942256c772779875d7a263bf9e34e08dff266a8070f7dd2bc0549f723fea69a1b4af04d82269614bd09e11c21695614d882aad8ae7b52062e1da434c52fb1fdafb1a1c1bb5a8cb9f762506cfedc74d38d7eb3e9053569371b54369c050b6f3c9520559334b371e2a5f7503cbe1c9407bde3e81d990812b4772d5688e137a0d50774c30cd9924240161bd05c8c0b97ecca069c5ed781c05d29e62c4ae741b1c8e5adc30788927ef99f34e4ee756c7bdb086c9651e7d9c107540c0d96682ec49c75d34ff615a1fa047c0b3f811cc0443d8a411b7efccfec56314bc713a2a6a1dc474b77761395ef9979b95fda0c1d1e6c955e85e6df930ca289667e31ffe68ca95ca38a10c39e67896a85340f7505683fbd5b0e4ac0a401aa08f358d19a4b76b3aa91b75af9b218591ef50f5044a91a4f49c323cd58b5f8bea9523eb0c1c8ea2c4e3e1b9ea67ab808eb6432e8f04838d5a2a65461ea39c00dc24aaf156349054e854da03c18ef18797a224cf46d78994eebaf6c003bbb9dc72c5b4124b53eee93b5aaa644f88c3e685fbc7b44f92fd5a79d4f70d21dab24ae2c6daf9d5ab6bc178f9c3d496349ab3d40afe7ce4322d743610cc2b5c76e50a6f36cacd960acd641fa8d3a65892da57d0790a1c8889999bc1014147499e3e29c6e72a9c00bf9d1332d3454c489cdb5a05c8e267777d1eb20a707d83c34977d72fd2279abd1740c70fc8d9aee552e2d45bb66d6962b7bc7004731e8eb14945ad9e31fff0af05ef39b723c81c3e71983ad44cb6ea1732c595cea044dd50a6af2e78f8e3556217210d5b522c5602f9104a05c5efedc47754cb6e4781ce36780a1248b088a400f2c4e854f41846535af1590dfedcef24918cc7ac0c9764c6c71577cd1b3bd43c2e4a5424bdda045f3fb57ce92738bd77ebd5876f6c5d28ad742f072a3f9ade77f118f6d7e55b864a11c0a7839058792d1a1a7b4e159fcd9ede4e5c7804291757f91290a3e936da2a7618c82b974b4b1e061606a5517c331616cc5b4eeaa3727cfe5501bd5fd9eb006c74a25208b8b314fd465498c84864f244fedfef727bb753db8506aecc1b8055c7a0bc928635a89cac8c0b01429f4d3da5a6f9827f730fa7e1750000000000000000a27fea05000000003fbbda5edeb96f4328599662ffc8e7f4417967b15041fec333b8a41bfc920fdca9435f7ad8f8dd231b53ba69de9a53557c4caf4bb499eeb8aa6284b7451674bd9aa2396b23e03e6d1851f34505a0af82f8e330772ca54fec5dc9402875c90e2300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1bd4481ae58c2a869ba30b3ebfc0cc1f65d9f374e70aa3dce3139022d82c0591d0db18001388a7cd8674e10e368f0bc8cad4af002ba7e88c86d9acb02f451fb0f8dc8f86dfddda186c51f2d278e35fdb1409e329569c5fb62d7c78daad4e932f6a24f8b92bd9a86c7547559cdba6f8ffac05e1714a9d69dfdbf221c31cc8fed032a55b76d279ef6473672f8c99a83405bfd57eea6363fbbc1905f89b1e33c1000021fe937597a2d3715b5bcf398d26a47e9c4dd1b2917cc9934ce129270cdf29a310a05b00155b2657915fbc2635dde5d32af0678c34b9ef1e828fff9e1b65c72ffb0c202bd2a4a90c87c5753d839f002acb8bc52bd7c6e68d6a5be537cc2f4f0451f032c1c93ce81c746a6b68fe1d7c9e0c9462dd117bf4bf8d2e3332ee01f39c391200228af4ab49f3f8fb3c7c9e1e4b001b5e641a364764c153170ace8842cdf54835402242794c980aa270d2949d8844cc85389afb0ba8e68136c0975f30846a04af0f80213d1322e29328525a0fea44cfeadcd10f9d562a0c61476086058ba20716c6e53030824d4d648fae970ad7b8d0bf2c3bc9ce761ddd8374512ca8b772ec8257c789e21d68619de98f2285bb714b105bee3e19ee1b6dbd07b86f5e2d6bb7ce96029d69e2716c9559672c05577bc6029adb5d2a81514c3fec77e9a401a9e930cb1886f5938de5af13450964db6a7167ec3abec94b4c9116d77021f3176905b7f364b587a4f33bbc6fc8cc20965645ce17fea790e3bd0582bbb842d1c0236c8faa33c74fad4c17b9ce28451235cb04b7c600fb12b3a08793201c47f1a5c9920e9bd978e7dfd62db76996737987153f6ae156cd186f53100969ec62b4f71c5ff6c7bb93927fff8114b3eeb8a9624593d6736f07585adcbb6dceb320b5aa79323bda66e37eec4de4b4ab2f2aae8ccb73a0b0392c7b6fd65c61902a8ff6c9ffc6ea9abc4dd7dec89c3104d3c3f9569837a56da287eb682b597b74d09c40cc813667145981eeaf00d49fadcaf8fbc521767e9e0088ca31e2e1272fcb261802e09fe5b8fb8e1fea229fe90d0c0822c853f24f21095ed33bed0766fc116b24a5a3578d4b7b389ab49d241f3826927fe442a358a824b8739936b786b26b92ead252cd9588b81d78c52b10e91b82bd217d0fde5eabfec5d84ccda33d70f02773a28506402c475a6fddc5514ec7b44807efb423a1657b39d0b84344fdbb53d3e8896ddbb243acaf1dae9065d718668c7e2b0cd4ff254fc51429e24a8f7a1d914b99662feace4d5cc22b1ac281eaf1490d2203a41f899af6035a6c6ec12ba2225074f96a8abe02acc9750fe73389b456b62d3743bb7a8d16a571a00fcb8cccdd6fddb8e8b9890f62617d3d56e3f1c237687f9e972903ae759f502d5e6ff40350e3b684834f2e0feda2a542fbc8d79ff007de9d69b49b9a37b4a1d8bb6f36b34ffbdeb6d82e51559ae32bab3b0f73eebd1c3ca3b018cc1ebd1356dc7bf86b6ff5b75adf0b5f8b2d37c28af80dcdc91fac4e08107448fc968debc1e3c89eb40b2195c4195055e263bf36507bb78926d3db011164e8040be5c0984dcb278e08e6364685563ab1945401fcf5b867d80a4b1ffb48ae4203ab99143c6653d703bdb205d99135a04724c8f1db757510ae342333a9725f664a247955c677c4c42ba70cc413a091447cbef817c718df3d2559387f348124bf5c1a05920917cfd364fa036de34d03a1d950b92feec647429d6928471d335ea9b8c7ec4aeedf1c5b59c0c9cff9efbb7c2528367e40434ea5ff3e398d84c7b505b514952f1a7e0d6430b7a76e76acd93cd80a3ea778dea147eba1c1789452ef64ca3b37e836f667a9f2a024a28b4aa7b27e7dd9e44f02c5b221b6836c1e29a6dee5ecbfe802994a6b462dcaa5eb10316b31fe07ffee106a35ddbf3b8d755bdacd829b79ae8511ca3663d8e7f09f11d881e39835c32d087be7d23705a7ee7f6ae4d4feeb25cabae9da1de2814cc2dfc40eda0a0b0114656aa294eacd4c937ab333bde6552db5d5ab99ddce1ac336415abaef89bf8ac97f25b7773c8ab48bfd5629616bc4be85ce422504223eaf1b9bef0c0dc518b7ce890f8cc4ff47e986e9a741c79222afff1bc9820c29d2856693db48ac99afed4bc32dfef9e263d6f2bdac0e45b0f3f1f832ad4c1b39c6412faea557affc74e9235de05f1611932e306bbde8e36c34fedf9754883c66b8e1b94eebe9b36b8e7786d4a2bab914a200a57115ba1bda6de8c0d65f3033a628c754c0666d3c4c6590854e90dc067d1a4b2d4db0cc4ee0eeb0220de1d8530c6f5e75f59a3c0f745d90b461464a0aa283bc494db42282956902929581277bdba7bcb2a2dc9c44858f029ad4bd3328681eba342c69ac86621941fde31e557157b47892d59fa2f8050f61bd5ecc9e0f637451bcd8d83d81013a1e3df07", "63536551", 0, -1538014879, 1537743641, "533759afc84b7655e0ccbdb4b175b375314bb4ab2296e3d7731adbd87ec10541"], - ["030000807082c403041fb3ad31d31bd8f1950db7b503830be85c7094f7d96e442dcbf8e229ecf530ef000000000365006afffffffff2a912ce8b159aea75d392163a2a1c8d5023f25c38422a2ca0634fcb10d94a820000000009656a52510063516565856f6e59fb06ef6e2e23ce4f01c77776508f1e5e48e4f03cf6a3f24f653607e0b2f9a9ef0200000006656552636551c64d5146e71411873e40dfabbbc4dd54f93978836a3032be6523741f1f9be6c3831c021f03000000046a63ac00ffffffff0251ef6a0500000000086a635252635165653b38290100000000036551ac3cb30223000000000300000000000000006bba4d0500000000f201861963af29c44b9f8b0d5ed42d4a7e0c1c638af349376268f787af8969b45dbc19fbfc5c1fc6c47208792ff19a5f9521c0f0e78eb5a02579d3ac8ca90fa48aef610b7eb5f2b45f62f0dc2d09449e0229860d990db5b57e012e7e631bff3800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dcecdc8a62506cb1d2ecdfd8e7f6b35e8e9a1be27c309f59bfb26895ac30d2a6d03e03ddd9ad2e67bcfdac2bb80b309d89998e2018fba89f946436d8e0bd1c91a58e75acd6d541d81d005dab7eee95145f1d9330112a6b98e55a21633f9b1b224f2568b286a249f0a2a12dc2b1f529c0d9b3f1231496c2ab4139dd37fe7b8d7f020875fd161b1447d5f8f11f55b896ce7dad864d84d01b02d0fa2055c45ba6da230207973a677d13474ee58c8e71646f399e6189dfee4ceb1968ea3721529cbb68030b001c90c9062dc59d1ce10f8e949ce507bf73b104d8869dadc89a6bdaa9d51f603c7b4052e1d6153e27b092ee095b340b5cdb999af79d3a6f72ae5ac5246ac3b90216d539e7b92363fd113cba0541412c9098cc3af11afdcf7d271ba3c1ebd1b7b902261f5f644abb5c8fe90468a17c60cc8ef0c0ef909f05ca49c0aa0c990fc35e7a03266dba239660ab217e21327659764152d159e5ff95593801c749477c12dc6048020589589fd708f591bf8d381f59732d686780e7d798f442ea69d6393630307e640311deef2286e6c86681db7e8af741e9e50b728bc0ea8eb7450e866d574628b2ed21fa87ae64d3afdc44a739c3bac9e8b8a167018c77f221d7df28ad60e021c4dbea9c63c7a1911ddb1716b9c42ca08d43d6f9055254540e2ef649a87dd3ad854542ab0104fed8c34d39f7b273d579ec98ee7d13c753cbef82e16010e4129775c9b3ce3c1b8bade5845f70a19b7d54b688219b3ae3b49a38d8a43c2ac23e5a7991e9a4097b6582fa981ddd3da70e2c6732293a87915400678854269b359994fafd91e8f610535a2a856d3efe853b10766fcf22173c3615006498e3f2e13d48763516b6e958a4e08ef1f02b7f6de8a438f857665fbfb12aa05e3a9493007552537af428210654974abf8417adb553ed866ded8fedeb079a6738c8dc9877cc1747aee1cbdb270684b1d53dc23b7d08bb3d22a9d0815d328f7783fbdc0d32e9475652d98a047dfc959ee270066efbd0be971762e95d6725aa51b99deb6d4e3448d9646888d99ecdce15a6fc40c0dd003d27793301fb435f7579458d07003166ffa630b07edc0247d35421b8e1aea3c8ca5db8054c1d0c134028a6f2748c9b2f21811e83ed33a2158df4b9657672f1a9b3ef8a061bcb78cd36fbc90e74bb9e6aef0093364b05aea653a34b77ae8b0eb101f0efe7ee474e60bb4fb099885b45f689acf4491ad077025c19bfe4e9e4607452a08109559f1c54d428c5adcc6bd3ca5ffeee656b3e214e86df9e28a914dc23618c584ba12adead60202f6278edeeb95d2479b70367bdbcb6eaa7b39508d9a8848162aa30739c94028e772c1ff2b2531b9ca2ad7e1aa2e9d32f741669e296dbeed5eec4956261d7cc16b84de70f71a6d5068c07fee985572833882cccb762013ccbb45007969d8b02707e00074ba4eab9219ecfdc798602ae440312f13c988dee1404a33b03908d5a047d0750eb5c211e25d7dd659c5467a44663e7e67222bcfabf53a38215be3b21f8249f115faf1b858d2c789cbc57f5ae93b72d630e93d8a27d76c3f6ddb384115a98810684137a8ebfc65f6308b8800015d4570c26120bbf7e38eea2be7dfb9ff9d8e7f7324a7416b41698cface3c458707280bfb556f86084c8ae5f7fde676ea7893e2987e3bc8a687c04ccceb2e1dd280dd6e671348327fe811a457897be9d85161fd2ea0a2d803243d20477183ffca39f08cbfc49102cda373550a0b8dc6ed2e65386243f6e93522fd23a0cfa6f80aa01a570d9df81fbd8e9486f42157b29d25dbe9963922daca99c2fa1f6e45f41b41ba19cd76e1929523a1e4542859cca493df9cbebe9d12b2709778d02f490b06e1936ca7d27c1299410e4a93e162f7f0136883cc225387c5d83afee2a24dc2a3b6ef432020d8b68fc8281e37b522aa0c2ac6ea788591d76a7d7f5d3bbbe91d8f9730a376d585c7bd65aba268ede5621dd0142cb535e3c03dbc14c055c00871e708c40cbdd1ff9bbfaa30c853f654ad4376282c8e28fff68813a11561b9c353913d3ec973c4c4f95b4514c380a8e10d85ff484fdd47af0722b8b6b6a84d4ab721e891c1217e69a09ddf41704907c0d12c042c99687312209d262b237115c86eaf644f6b829d63d11100631ef8299b587452c37bdfebf851be702836ad65c7e5f2c9cfe034f441cf15dec176706cc3b5ae2d8bc97805f942d5a77eec6a6f827b1fbece2eae29827a0af74e7f8ce8da242314f7c0faa0dbb1844b1de69163a0b27eb05bd1d7f0a4e139a353aa500000000000000007d0b7d0300000000f5b35823cdf499f7e8f4003a2ee49e47503481f28e6c9107c77824cccb2c0fb8c9bf3d81033765006a19ae07462d5b86592087960d93eb8a3cee37d00bbd8c67b26fbbcdf7739a364498d12ce17b760c4ef5848e30c581dd54cf48dbb815e873000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008afba2b91307eff023cd79f28273adc048058e8d7e48b9be94198b617634d2e39cfd6605d94af55e4195d5ff4057d7e5f3e0a0efd2d8a3ffd8f401521af4493fa659ec35efe56cb3e48720eb2a5e6b3ea2a1849612fb5e13940305a745ce74cf1ccc3bad498c3cf4f075394f190657bda3f177a2ae534f5d6250b4ac3e22f244032a0b1277adfaa7fc534084366f6aa06bca3eeed73dd1d1a7a948a82a42f5f8e8022876531c89438463a7f40bca8fb83df11d52853d34c143dcd35a2814fcf9ae870a039e8c658bce0618e069cab74d53d12529aa2b4edafd71aeb30f22862a8468d303dcb38503c9dce2f697f6526087390a9a947dc8add0baeffead67aa7456fc25031de5772637e5edcf2809eddfb6805ca1dbc376c927c88460802a1a589af4e6720225c5eda7a33f63ec7c0b8b6c637cca5b66554b6e297ad2f8fc30b10e9d09fbc10325518535a2ae5a834c0f834d8979687bfc1a63bf95f5ad50b202ac89022f150b022e42297a19ea47cd4a9096a21965fd3e099f1a75545f670bd263b95cf10e21d80219337ad34e1cebd234d32a7b3a669b70f5103b015ed3fb10d5b57c41a4c26a4b94e3c04b5b981e76d3f4232d81a478956251b088b50547e325ca0acb05cbeda79024d3adccaee4b366bebae0550cc8f364d532cd71e0935f8ed86256f68c065511dbdcb07a0b344443023d3f448ab7de055ad43e53a423c0a61c4215c64b8bf1f1b03a41a0c0a0cb863ef52b782644e672190484f545ca8013de54141da301d7210ca3ab40f80eb85585e3e9971c3d05666e386bf6660a53fec860bb4968c28700a3422f8953d08bdced2ba433d49739101cf435a1ffb29dc20716b496621b30e74f5c58c3c35551ee1c4020cb413d487141635ea8740efe5db2472041db69629c544082132442ad8ff35f2cb77677a89b4df1dd4e06497bf67c07771420fdfb47edb378be5b4277e39c9f1b73f04e46681fc8009a40b1941268805ea389fa904247f70f8b96df8aa80c1b7d0ca943fc16fa0fb86de28cce8a9ccf005fa56d2a83df4e87644d64d95d9100690ef9932eabb978291b21d8fec2e45757232f91bda12aa38bfb23db96337bff7333da86e952fee8a7be727f5a53cbec26cf99d1f1b9ccad664004d0a2ab58744e96ba522cc0d365eece0dcd6e2789f4361586830cf42945d81a41133380563d1e87eabb8a1c32c6a501ccf5d4e29f3e50fdfed9de7fede2bc40b9f457ae48d713f9ea22aaa66e0bd69b3025b695f9423754f99d59e537ec0f95c0abf2f4f928f0b3362ad478ecaab02a9e6c9fc53962ebfe7916be8338971ff17210755fa74380e79f2bc0472b56a4abb9058979f7fd3f9fcaaa86588091847f6eee885c922cd021ed6ca1a57b3ace731328ed312ac370464ddcd19dc7aed4531e602a014f9b561076ddf56089d585ecd2dbb00c6b41fd4d4e9692f20d706e359af66ffe0cc7a73fe1119486b110549cbe01d1e3080f25cb63f30277db863375da853fe8c19b423f7137f6620a6aaf120e5c6a375442afa533d71099d98bfd2ef06c29670a886e890c38623503826effa1dfac0ce0a0505196aa6c15e53824cb0d034053c5be66fc8adc405cbf80b1544affe862b13abf86b248e3d46cf1e261efe1f35859fef2ff65f5c5b0a31f08cbfbd1147e4c751a5d30677fd18e1aa9818ac6a0a5916c7c3de3701651b5d55916dc7909e5f495cb259bb784084e2f70dbc9722d6fae5745785e3d384ed85cb6cb0c7aab4a07cf13d11f82d2421e02ed349a753ef4b16354fddb43bf5241829bc2d5b3c0f4365779bb9b9a386d0eb1381a7eb869667b465aa2b771621beb966014524f4507b71de525ab8c283591623fe9b81184b284249682741008203b887235ec8e54dafb9462e4a4831f5f4b824fb3cc434a312a179854c85909cb74b198bff0d7917016b4e77bab0ba75fd09b6738b13c0d09c1dc5b35ddf5d8a702a89dac56373d017352bd4c4b75cf4cdfd3e4f8167a21dec8b608ea8de3728c9dfec74a27411530f39807c909dc9e61a9a39a82249ae58ca874490105626e4d3b1e459d228d9b77a31117f44395decb18c52f96e2ad22e2ddc29f0f28f91181e9c9feb287b9cb5f292bd2911ffeac313d74ffbdf5041ac117e1eed6a84f3973a0f36f276a27b985c69aecd41e3b4c0eb920f31f4980354867ae10c909a9871957a32102fb9d5e72ef7eb7685e3efa36c103b12570c49d444a84389a8f504c30c8ae57e663a429de08e8e3b9c5860f2ef5c5ca693e65ee9ac8b970716490ce1fee000000000000000009b3bd0000000000cb699b7bb151eb1316cc8dc2b3b0f266205f52394740d8a066dae45a1f36324b4f4042cadd8e850d899cbbe8bc3556db9f50ccfa20e0491a4c5207de443a1aa4b6dd7ccfee62e1b335f5afce847f703ddfc5218ba031083a7f586aa956ed9b280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000092518f2eb5e9078806b87c96065665d6e3aba06872b7c3395b46bd0ffd6e0cdaeaeda30ba127e42bbd6bda8728bc69d5190185db342762c3b33ff8bb7ced805391b42d5ccd4be30019bc2725e306f19f919663805ea7cc9acac92cdc27b5321454df0a7d39d25a304c64f6b341e06f6b32bcb163039760d7a9fc576dc7d7e2cc03060d217a6f2156c95107efffa86df009f4d519ecb02d71825916f1804302dcde0311fa9ef2c7216ee0ac37131bb420485fdb038962b81c75131fdaa3b48e850b050b073be908a36ad329bcc593755384480547a6a0126d889989b10ee7b5d2316c62098dcca46e754e93449b0591ce518d591000f50a187d1275e0cc82f20838f79a0217545334ed16b08d6524d984999de701436388f7744af2d2b9a0d64ed8d447b102231b6af134e6ccb743736799b8d4fad818c385c7080c3c9af5efa00f88ed4ac3032a800323e913890ef55bf74039e5bcc0cada3c2d4c6d1d0588bd2a08e2c9131b020b52807bcb64ced694dda77c042cd6730eda8ff9ec5e031217e29da91cfa876b0207753352da3a4672457412c8590ac3dd14baabdcae68338cb1ab1c8da488a5e5de07afe1b94b5befec5fff58c3a26705176cdea9e6a86db0532b5b54e14afa53b3df393c8c1c42142b0a4b37216697e5f130f58ec60b7f8ae17d84defe6885c6e41100c19e87979f089819637d0c6d54cc26a8b5cd3bfb7ace9a900beaa2a8538bdef8732b650664b54b97a6d4f01c95f8c25e1b99f54ccd2103854ff8b3dddee2ab9f96c3afb6c14476375424fbb875687dedbcbbceb7a0f416ad85654ba56d706660ae7658bb705a6ad8c95d807770bb1ef9b899798f96dbf261bd95a43ac22f734ff53df1aec6d5209b9a47de2a9c3b8344db8e041f65c86eb4a280d6f899e405c9b7b711e32ad973f4b37c593e185162aa9fb694d9cce2d193cd31714f827db864dc333f05b44d0e7e3bffc7c09831754e9a7861a659fe0af3f540dd6675521a3a59a480b0042ec258142b7a3099f8d639a25b3d308c80e1fde849c58741b1e5ed7922ad34dacaabece8a966e8edcaa64eedb0b738d4009b2a838e8edaf93559a41726eef172a6c90f80775da31fc2d7fcfd01f7cd08d2413b0b6601ee757948640451f44106b32d4088069324cdcff0dd3fa65c700270075c68d611d3f35e6c97e29f142826415ea72215cfa6e1cffcc48b8a6623fa724379a0a76b3167925552d0aaf68b698cb5031190aba2055cd3bb818d3ae8b2cc8fca445e388e9ac3f6ea55214f6f461741073956c7a7d4ee858b97d04aedd429ed3290870aa4ea4f641dfa95a74c6b35eb2ca6331b12747c72981f3a6c0cbed460dfdd76745e0f93af7673f923a7745068391b0c47f03ae846ba85d0dac6cf0006e4c8d99a07dcb02802897b2d0fff6db7569282aea0bf7613cda005dd38d5396e2205015b368fa4ed97440b5a920f7d480799ecd909046283484eeaf32fb8f11d452709d16acc8d5fdba783dc5b469f041d1ff5287075d1e3ae3152089f198997cd4ce1ef4223716099fba03f12bcec6292e20d23ffd13d8cac24837508f0cfaf82b22b27dc86878b7c38e2a476cd618d05ad60a2676bb9b34c7cbcd437dba269d09032d0e832ff18af646ec28f5f29987e7e76efad38584e9b49cbcbe2aebcf4c073f81f8abd3ee9f7207e513f8b1156bef03b43fb5bf4886d49ff7d0f60a2cee3727565d73e689e3d53b420826879d20d3d94736322044f7a612302323b208b6a6f11d2dfe96e5285ea02450dbe2947689b357463c7a377805e9d2ef219caeb653770364c0cf90d2b3d3f05a93887c545d700da52c3657971cfb97994a3358bdae9404744ff36f078934b1df3dbfe7f3220934edc0f028cb855f029ed932985c69e55f3d3f491661a53d9d037ff9e6e5e8be3d6c0fe14622189e41cb1ac5d665fa7a79f61988e8821ac02951a5422a785f2313215cb6967be631bbb572edd727589cebbdb1a5b75eb6f924612b28ce5d7a1c264e9484e6173a43b6b9f495df0aad1febdbb759632e50de8b99221fee81c3f31ce501e35145fe63c69f43279727d4d8fd8867a1465980de9627fbc5a3306472190166fec98de8cf1a42564702f1c8e2f7d3988d8de4c3d6c639fe40f1f048fab3f6199960f88c25cd561e8a0915ed8525287e973da728ed170b5b92dea7d6bc996b1736d37f42ebdf9fcb75b5815f6cc7da80cab689d24e819f1421f9dcd51ab6c24c9459a1178f2df43aa39cc87070c46700d67b595a7f56e345d506222df2dc23e146a53634ac9a47a4e502150a7ea662743c73cbfdc999413fa85b2c26ec8638989797c331ccd02965677afef34961f401e4e6d2a7cb5c7efacb4dd0ccb431724ad0d825671247bd380d0b723674b2745e4bb3c2b0d0815a2cc3348b42c6c1400226300", "ac53", 0, 240408717, 1537743641, "710ad41777b62f384650ba126b0ad63ca3c999738e23925967cd7b66f6ab7768"], - ["9cc132000157354c20a6a43565b8bb44202fb5d8ba5b805ea7cba1aef4fb4abd4bb4b75dc400000000025300ffffffff0363bcfe01000000000563515163632d65b2050000000007536351536a53ac23407905000000000451ac516a961c7636030000000000000000e1ccf00200000000bc421d468d3d4bcdc403f70ae3ae02fef7ad17b847df74fd5c2a7c93a0a4850cc6ea8750d49bcd7b7f202a6a0e665bc98d66c8208ea2268f6cf1dde072af6b190e5749f61ec1f8890990342cdad0daaff63d4f08c1e49ddd538f4ee6f5bcf2a500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a817fed9c999a76500f0fe02d8b5328d8e07c473da0087f4c6ce352aecd00ce104d935c134bd9f287994886ad41c5ce950dfaee6cfd9d89c063f4d4bc18bd9815b4d821101c4f462c335180040adbde0bd0a0cc237ea96d321ba2321fc07c79127ff0dfc1ba00a3c174a360f39c50fda80b3a98165465add2f447bfd117d6bf20317ba22f026df922311ef835b9a472ca24584c2a90addb6df2c68d548e588732e0212dc345357bea61ba62e87a75aca262439e07db581267a329f5767a9acf81e700b02d4749bd5878537d3730940dca0d82b1016a88f493bce2725ec7e52d0018b8da4b85a0bdc2dc14596ea961ff14fd2978c2b2df122d8cc5cc2cd0282505bb67202058bd6aff9f30cb460f3e4c5af82e17d6146f1b5f121ba567fb381b6be2ee649031a2a45e9832ce4f0ac58deeaa2bfb61b5709fe1daed2138f72d66309b187e5f402188374dcd6ad55cb7438bc19835810e4a8275f3c70127dcb3c58048106f0a18c032cb9aced83af82c51767ff8bd790368bb501b64a1f8bb61b7ab43e85b909de8a03168378aa242554a37b924ee9f09329f66fef99e3b54f04ae4e1c596cd1baa8446a9f62ecf6da1e24040f8ffb3a3adf09db0a3c5342919b2eb101a259312ef4b72ef29132c13cc955fdd82a222476d7e6c3aa39b45efc8b00a6f0369e0572ecf480ba46240673dbde69f4b5bf09429860cacdceba21d01101daa1edfc5a9115aee4726cffc4e42508e3323a3c6f5748527d74e417a80580b7e5aacb90423199ad8cdf986d514ef62d328f59fefb1b5d892f7d143867919a9a802b8bfc9b22efb73653661838db00f84ccffa3fbd2379f7c505f5b59a4ee6b25d93bb9ef3e922808cfcb1c80ac60da3f98396127d261e8dd0115dfe1a2435c87100ffedcb6207c63b6f57ff9fa782ca31edd3fb93c145aba907d92b2c0ac0085bca5297e7ef4b7877793a6a346d3197549b922187f086911be58dfbc68b571381f733f837043dd2d419c3b05a9ccd8df948104d9a34575f48321d62b5f3fbc199dba1008340d4dc41c3efa744f5457ded614b12d38e0cfbcca3a4411a27a8e589c9c48f3185228bbc07550bcfc601eccb093b572558b1f0bb0b898bf48ed1c1ceb00c37a85b97cea74ebca8458320999f611e81778c87c73ad9f26622fe492bcc799a0c1fed9c664c0efafa1432c345ded17b4f587ad19db4ceb9899f7d0317bab2eefe4b0754610e823676e7d209e4c8a738e52d53b1172df1bdeef3352ac209b17bd6590c79b7e2aec0d38dc07bed9cb02b71f59fbb283b50497787d578724cbd7b5fd0773ee94efc852107bc81634fed0421cd508b18d0f8c4cdc43d41239d93a3afa57f321757f65fc3216ff035a83c949f33cc8583e7dfee9b42ccdc119cca1d39ca3c649bcc795dbeb3911077ad396dafbe9a36c7d45073195fd239bf44c0e6343b4b327401f620bed318b25106cf5a0da15e492ad9ff19976153551015fb7d83507a8aaaa5427509be6d09e25bd515410d64fd68ca123d91abc9767a832f09f8ccefee8f2b9dd1118859e775edc79fa333022ac6da24e065c8131c927ebf1a91f269e9901d10a6c1d1e315e73b24f382f74faea2159cfbcbff3990520d27648ea73c114971791385d60f1121f0b4e6280de5244c6ffc7014af16e5ddeb97abf585353999d51225542b6fe42599d4db14d96b8657b6a09b857ba4b94bd0f8d2e884a8a42fe7c77a118ee6baaec6bd32872179e46783f461fa905bdfcca566d3ef1786928c27c84c90ebdd92695ffc146b4b456c7a287206dfd2a2a512569176d775f20d38c11e729622ff3c47354542eb35e65b2747610a78428c9600143be03cbf516fac0af4c4f864e0a962cc6725635e5a4b5f4402011df06d75d60833f9fe6fc5eca25ed70be4a50af6889b6405aba809bf0db6a3dfcb3f904424aed1caf447d40bfcd3fd1a5e01b96e634428ac83051d4539f49bc4fcc39f3ace0a2ff99045c5d89a060c0e59ddd671ffff673e4750a2a7a494ce05efbcfe984acc98602d60c4425852d215249068e811903b2eac998a2a3b07762e65e80c7249965e81e3649d2b9b359f0583672251d4ae04f0e1cb181aa7c14bc1bdc42c5a38af563c02a00c2411b9cdef271e33a6df348af68de94de3ae71fd1e049e7761060c2af8905e74867542199eadaff89a7359fdb418677d587cb8c95a5e2b2b85006315a3187e77dac856031edaa112e34e3acea15086d80bb81c05440579b25eb3cfa417f2801049acb0b0aa0711dc7628f2cafa5dbd95326095f1faa5fc0000000000000000000000000021a57af3aa4891665b83f64abaa3f20fd23362d110fbe484cf009d78dd8be561ca6706eea5090a56c81686fc8310463bc98f82eae41896f3838f6384312f87766d66b6b7994af594d7c1de131dc23a0e6a30779282a092489c85ea41818292bb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055659da792a492bc96b23df675f7c558d561f5221a3cea83811b18d737f6ce3abae78a198f246d48358bcc6bd8f9f5f6c91fb994b50179cbcf5947b27ce6b695e66aa4d3dfae78f000380e689698956b58fc6e1ce5af2d3c1d92064ff66728e7906079e4cdd685c2db639eef01ea884159e2c3b33f8a977d6ec2984792f0de69020ad2a33f6f2ed3b0549c488cc2f560ee65ca206275d883c7be08ec820699a274031cafb40f2c222db9856258750e998bc50806b0beb5aa73d1444b409e0b0422bc0b052183d47b385075445ffb9d2918ea117f59e703ec2f88c8c9925ab9ba3cb9bcd9db8473e9f9a21dd934599b284280b14d3a4744d4014a3a4ed7927d725d5ded031f70ec485f61b8a6ef1530d0dcacf424de557b6d2143d8f12b508f5bae0b03dc0219b35a7be35fb52a08e1113d550c3f439730c6318f917e53ddc74a034121e71c021518443c0a80fef2fd047b475356befb6e90805d85138166fede98527aaf81460326bc09f9f04be069dd605cb6bfe284de2186221d406f6c1474f93801b3d563ad031a5fe7798b661e53c439152e8e67d42946122069884e1f3c630129fdf82efc90424060c98fb764df9c8dd08be87270d991e94b6736551919d4729604ed237cb881b43deff76bc50899ce1559d2307fe048a6784d5b8c379bef57c4b221372820e1f769dd2ae59fdd1d8f5d45be4f95071dc08ecc9bf553db5d61b0b3a7db809301ef33ac98b476dbd41be11caea54bc6c517f542e9e949fc14dbf4a6342f0235859b10c06f72be79e93552ae2b60a142abae550481809b3b11413fc9dab3ea6fa95c0f6d2503ad45fbb07ccad3afe91466752d6ad6a4008bf78a7efd08a91a9f10fef66d1a33aa471426d965107c2f92b8a61d872aeb11437da0be8e4696cb8ac06a316a5e59cd14d5ac53b324da5d043510c1c28e6535ea9bcd5b8bfb0fbdec8e2de7820da2d88e3c18230b8599cce116acf6913d07a974fc02d878b226b2158a4e769b94ba2bbe87fe3eaa7d56ba42d08c4ce2d77c321b15ec405d3153957716274d01ddf357ca9b87d54009152a1625c80d360d50251e14e590b20c18296788d38936d4e038c49ecf15ca75cbf5452c18d166ef9c35b21ea9719ea1d9e6f14d44cd9c15f95a97e0eddd93438f85f881a35a92d77610dee6ffda9fb8c51c17edeb23934223467b86fc953756fa828a1a600433c44d7c97ea4573a0e8b0c4eee7c6f88244a62edf39ff0d415acb4fe977c5b12d8f6aae85808e17dccb6535554138751493d5a417e2b6b5b222aa8ad689f3413991fb23fcf4d54e3db47c5bd0e27a7fd5b4614644bed47c5074e4b151736c3bab5151a14cd1c2a63c4f32ea4e3b9207b5254c7789d31d423c5f83a9140a40a0b2344b2d291715a3305210bc1cced739f7719b1efd7176469f8a6b6eea9624701d8cf9e3cfa0e5c6fbe27e47066b44cbe650c5f46cef09163d73f23cf38b9948664013f97b66eed9537dd465152990b928dcd9c529d3df58a95006ec575686d1647640663b0b38f6c9db64d9ac95c41f8079a2190485b57c711cdddad15764c76fcf6a96071b2ad473c3f5702fee3b95a8c105bb68d62e7e604389a2566bf4b01cc285d245bd6f9874468e735c6b52aaa76c3a44a2c597c38d26c2fc9a638cf5136ed84325da335451edb45ca72b82a9848482fac4b670776972121ff694ef4dd5db0ef18ab2bc04ba13342cfbab5b421e362d44bbbc34c562df95a65986b41169d30c75edb8d91c2d8b0045afba16058b60c8092728b430526cd0761bb53d414b705140e290171ff18bc7809435fd044ad7d20b5e0a92b50908f36547df6828d63c20f1bfab0a8944c2138e96e85e4d09e1b806208a9623acbc096ae016640c2271641442c0eaef5765ff3741836ad51425e9f41f1ab8f484e9c3f42f1387d42f6143cf98a94f8ece116e96a3b0b00c45a1aedce853cdd717b8d52a807fc75f7c54a2a71fe4330cd216f043112b8c348c1df3a7f6a23c738231686fe7f66d015360a957020d6f5276830f2f9202643f32c0fdf253a46771fea4cb8d830a9150e0e56420959d01ca0333de33b707a58f4a3b2e12bf7a3607743734f7a12c1fbac746c97c4583c041a985dc15f5c6dce70e6e98f75b52075e08b719c9bba737018992d96b8571043f8218818eeb0b8d50c822868e7ff46fa1c0df48b86468f709683d3e5956a0c45035e5d84434dd20792ae76ad13863c9a31509b3420e1ff2108bd707ad0ea3ea4209b999cb8cc0233c47d439851df945ace52fab8e4992a882041805000000000000000000000000950de15ad1ae5ecc60a181cfcc6c941521c48006326af187371dedb9446b7da0adeb87df69131cb1e2bcdd2297641d1c0e3983e13e15136dcfa9a098cdc3d0fd85c84b0df2358383d1c3267bf207bb9fbd7c0f8ca0bd7e0cc4d4119fd3be55a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eaae8e4c925662f7897a0c1a58f66b119f1dd2be2a0513388fd5f3f9482ab9f696f7d80c2bc75e7e0961fde51c0e1d0b85c82091ce310eedf8653be64ca786bf013a5314d7fd6e5ae14125a0333610835e608ff7a91ba62f21aabf34fdddb43609291f7ccdd28d39de8a69c6632eaa09ef704e25f653cc2f36f41ca8c8905aa0031d82f0fa5c386987f7f61ad2b396186cee1c5d1995ef842d046561999994a3df0312edcec6a1fb0c717bc9e5e6d0d1c94ba4c2e8b066805a1b588f1477140ba6790a027dd264f20b38a2b5afd1fd0d19892aa7d045bc69b9643e5ec4e53f7ac7ea0993a3f786b4a54404ec9e81c6bab85c57fd2f6c66c757e0caeda47874fead0d4c0212115b6f683d44ac18ad045ab3ef9642ea447e0854fde38328633e42f1270221022672fbf15fe0552af9dbb924636568a652bc73999e64106413fd9d7de37276270200571d205db8be32cbc9357f48e76663d37844567fc073c7b0aa5f03995af089020e8f5ec593ddd5cf561a44a11d9cc79680d400241c1cc25d99525025d5563eb9032abeb6adfbf9b748e2db1f09c4b33b31c8cf277411c05ec38f14b7ef58b21316f473dec30fe7396569879fc3ce1074e1706d92e04efcd19f29236cca27a3e074a5bb0b0d1db91f0e9d747b0d75cda1e55164ab9decbc08d1838641cadefaabeca66976bf826c0b1e45ff2f67200b34a35e22a1e785e8d11121a3df29931b545870e4d0670287babc890d45c0b96e73ccf50eda69f59de1a581df1ee908fdff96049fe277d8a72995e28075576b4d206acc681b5fc5b0e3969c0d16c5ef358a0479400afbd438aa6c1f66e1ac31bbb4adc1ff4a5c7d92d0718112cbcc12029544672bed9025660e43270f5f49e72ebedfab6f699586035c541c24036539d7aefc57ce9a1ddd9a8b5d897bf8fe400a928660d30597b2a5ed2a223a6bd20d7b9dfbaee0446a315dc9ab8e750b0a025858b3de24b0fa6634f76f2b12c11660748d59e91a79a3e18d0d88122bd1b38a47e47adff9c26876e617c3a4cca5cb9f2985dacec0b892681ac592ba6a9dedc6286207a684df5d441b53ffc16b4cf94d43ce1e876b9bd95d3068e8b0ab4d8a4ff5673cb66531caaeccb99d86cb927f6b84e3c5d72a9ba3e40034d4d0fcb17eed29c4add03fed3c4ae08a7f0175a9ee0d609cabdc3a64bca0f8ea8250ce5b890720334b3606f960f53c4dd961017e06ea8d6816c90fdff594ad245b6d50fcd0f58dc9258950989f954d998d64196b886ccc342f662d4ffce0d1a62e035fd9e5312b109133fb748fe4f4d667d223e1886d063dd38d282c267ed48bb825b28a5813260c04a4e4f7b19901d2343b43f5538fd4b080c5b2b8fbde9459111dbcf0e9eb675365ac63d5c44ae256bdf3772493b911988a2a3dfbd7b92bfbcfde71704c6384cc2b276d44e7545db8d96f943b91366dcb0d0aece81cf911abd9845665ae87a2bbd63b2901a02efd42502c209c4bdf0cbe0800398b49b06b92a0c06b1826574c270d0c8a073f25fd47ce1424f16cea5ad19b15b0565b0076498dda0a43f151272fcf7da042f69096fac259bb21fdcef759b24c09f46de545cea1f91e94d5df80fab9d4348c1a112437e4b348050feec5e1dda607e611be1eb765fa82d8f3c73b3816c43f78a96a215c86214d2ae73f1d3d942679766a23d90521477af675a54e27f08e3b7dc473318a8ff4ae4518f85aa4f0dc6b431ee2403c4d154aa9466fccb24220ba99107a13ad7cb29d4a22531503841d56167edd27133eee2944028ef5903c404fb84c68cd25f9883df4fc5d6acc640b51cbb9b66b4d59780f6c2cdf27394c32fd85301527477e315f85b911c0ea14d285efb6a90a563231970918a0f33db049b1c1118d9655635cf34200f096622250a187e26ba7d26af6e4c53a654b1d0703fd9dbb9984bcb974d5703de5d4fd575ac53e80d341eec79d70eabd8ad2d2320dddad067e8ff03f0d7672f86b3bfed8073be525e05efa59af0e8d792b6a8b10d794a878cae98b25e603de15760d3d38f895becbce5ad84bb9fca689be6e16db4fe0e87f9acb70e9a47919f93303a5e0d87c4093b66055ed559344f680fcbdcd136fc7c5f7d1eb74c07a9d93fcef05d57ba8afcc2797dea7595435dce31c76f394ffdcf6cc701703f22b527895a3bda783d9b229a3f781578b7f3d2b634e4f91230a0554f480b15f6e753f6b1e90ec30a354856aeb0dedf63d7e2669cf8f8284760210cbca04e37846126da152f8f2c707b14148f8960a8b0d67666a2c12497324c4d53ddadfd49b0636f681d886c411a9f3c8c4edbbb3bc070e9dfe11f1cc7ba8cca9f9faa95349d4f16f87012c3f964b75609233634a0112a5c4648430f2662a4d81cedc161781143b7389bdf45527752c6e90931f75e153a82a8f86099afe1805", "", 0, 293341050, 1537743641, "7e9c4ff306069dd46429f5faef4360eb24e2dcf14fabe82168e7cb84fa1b06a8"], - ["030000807082c40302e89bb5fe65e44c3438c4a9321f9fd568594f99840410183d80b4a23f8c294d1b0300000000d7edbbfb6fe95c85cbac09a2228a538585c5a1aecc577858638f2e7fe82057f81f31f4e40000000008516a6a6300536500ffffffff0296c8250400000000065353630053511e05740100000000010000000000e359bceb00", "52ac", 1, 1334908246, 1537743641, "1006f3c4b2ba2f9396792b2ccea1de87f725ce15cd898cad21ca32a1df0b4562"], - ["030000807082c40302b1b3866ab2402f39877a1ec3198939e3eb7feefb5ecddfda9d848fb8260970ca000000000900ac6565acac5165aca8cc480ff253878f9f1f1eeaaac5ee86c56e5b5625f0aed58e540a771d257062c5dc6dcc020000000200ac58b653a102505450020000000008535263006a636aac7cf61d0300000000056300ac6a63d2021b670000000000", "51656351", 0, -1276903339, 0, "5f9ce422fd01deb7c6dd0c4c59e39e1de4bfd31fd7e3f5470e705694b7ee51f7"], - ["cf3fa65503528eace6b896a4bb45ccc570f60be6cc474f4e6e32649c6d4dc67a9388bc8cb60200000000305de448a3362b079b8d6748a27790f8f5791f8d8adb785e36aedd44616a69cf1b155bf600000000075151ac5153ac65ffffffff26bd9006589cc8e34914a300818a11dc08ddfecf15d2b10d5b29c6c922776d29020000000453526a6affffffff0457c456030000000000489400040000000007ac526a535363acf0ce980200000000020052653c7c0300000000001ee2ce2500", "53ac53ac", 2, -685353509, 1537743641, "81b60b7c1240c1e6e8075950a749de2f5a6fdb92288117b71688c977074b3a45"], - ["030000807082c403011d29ecb93d267c645180069041c498f0f763f45590dfff3aea2968c5022ba5b80300000001007b1068f6021b7fe90000000000036a006398b2cc04000000000551ac6551536c9269ece47774e501c5d7f603000000000000000000000000fff28b965b58933a2d73c4198014ce81a3d22831d09328c140089275eefc14cb712928268dbc9830a2e02b22d83ca892d56496cfa14c6b648d581f2c05c19457ff834d65a367be4f0c7818f25605063051da84edca3359bbea5809157ebf3bde0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085787019b8c5a05dd7f070948e23eb6865fb9f2ced77630c438f901b71b98440e0d2762a95815d31787fa3c34d2b97dc9a01dd9efd19c3bca9da30685e69724b16a07b05243194ac1d8d98d15e85aa28af181d9f0a8258988ae13139147e94b65378503412587bbf73791cbec83448701543acb1deb8659f86861ce892392aff0208ca549d36960b9f6b7e76d0f0d2c6da2f54aeb97f5085bdbd5c366597f7e008020afe3ad9f162aab198b6c9df038eeef0f539ebc0ebe95fe53e33a389d5d2ed790b0128fc1fba8c50f4bb7e98eb4a9e7bb510ffaa95b3388f88decae32d12bfe864fe701ad15e2d4ba12e57cc70439f66ecead407104a6f2ae448edd1b072646feb022f1707ef2b3eef6df7b9dee94d4192072518db91d80066e65f7aa417345aa37003131a94eddfe2c403a8af836127f04053f93358d5447c4c1e6be91375bc18af3a0210afb50f63ce0f7fa8ebeb2632e8b1f95c343b67d0c1bf860d5cf9658de32f2f0320c485e142be28073665b7c2011a3466e0777e81095530df80cc88774e235d4f0311515fb8042f4a3584d21a27e4dde6dc8254199e55b0f121fac0eee001a0b681a35748b8ad8eaf87080a1562a7e964ea84f350b5d04cdf8162a309955c0e3073a61e9e04682b6b78e265309237f1bed6485a818f409f3040e6a414a666a5ba5d9d9bb727032a8dcc5b80ec36e2e9732f644e037b8b5bd30397699de65f357171ef2d3193777ac49262c93137a9d8ca10dd81cc89ee899ebaae15117482944526385094bca23e7c6342f1de11f2a193c2ea63ebe84f148384a711a85072494b961708d8e3711b03a4ca345a1bb6d1af3860ca0b6b1085929676f68b223435512df512b2813e16a82424dd084799f450bdce4b968f97475a7fafac904abf4731f5aafacc3236e65635191a5988bb0eb31f6163b07aed3de5eba045f11d467923ff236e4f3c211a5a9496c1ef3801b0a055ab968decb88e331ff726a67176cc0982a54e703982fd82b225c3d74f0a0e826a44f8774ac6ff4c901c674aa01c05465a8a299a14ade68c7770b588e54f683eeea105d3056a2f31f095cc3fc753817199661bdd1cfe430273ef6af5a553bc36438dfd7edba8a01da9b618bae9e6d4e4069b93b8b0b447e35f56495bb0ebeac4645c0ac681481db2f7e10d308d0f287d55d010aa80660ed137fcafd46f0a05ce3de2076a8219579face6886202b89d70fa46f5375f38eb42f0081477958cb15ec9e2cb5a141ca1af778d7f9030f07f0b8bc7cebd7bd6f3a5b9354457219d432bceab9b9126f56efcef7315af2111ab66683372f1266166cd550129f694f6db764b4448195d7ad8dc7dec911ba3756a40852f8f6aacbb23a90bd3b15724ab4ec75563441ee3d345f2a5e2c6c4e62e858350d3d2ea31e787a1aeb3f0c32034e7bb80f6346a4d4053e1b85e61a6204cd4bfc29f85209e3916a5ee4d8ba78d8b5a69112181d8eeb0de990bb987491ae1f577940577e1bac16b7bb41c47f5fb8e11b742f45a4dee3198cdc1e90368ff6e71812546229ace37867e7a9edd1f2ef40329d7a3482d184d941b1e1aa95b767aa3ac6dd60fa80fee798d755efcce832e8ab6e4202d3f40130594c2e3a3fe544238f0c4ac7408020578757b27b94a225ca8a5962ea05fe5d4121ea9f097b37460a27a9fa5eeb4cfed2ae469137367d99831343307605b39749d56253b793c23063464dd28355f30f8892025294ef6c527b98c210f3d202ca076cf394638982e8404346d4813f6c065cc94989d27bb90ec51a72dbdfc4ffe379bbcd42f2218bfced4e05208740d348cbef107f833841e67af278f3740f71291ee6a0ef3668431027e171915a706a21c794cf3305ae34072812e1c971227be776ee215286e5b7c757c03477ac8bd35b0286e5e81cbba8fcff80c5fcdb54651c0c4f258b74e78de152355c43abcadc4d67bd41c76999bb29c79d9c674d7ff9f899ea3973f2ec6b1014b0a83f2e0e21749f3b65c89c3778b45a991f859a34b5c588f28639abca6cc673e387ae9ccc933ae4ed1ae703e7da78f8b7222949788af5fec27d1f6257a4895472312dbb1b448b31bb1bc1f85ccda1d640f221e20f47ba4d5694a3ef90650db20592cf06b9a02044351d2476ebf76087b3b3c57fa5e439f1b63559f245d37b9d12a903f38514ea3836a791b6aeb904c010273fa7914873588777c51812a0480fbfb6b5f1e3b8934f649dbe0df77adac5463f9a87c29eb57d88458feb86c979783e80968337c12940f48a6acd549ffeea397261e0a2fec29025082eb6af1e16b7184e1dfb3c4db209385e445e7574032edc10f4bb4f915062ffacf1ddd15e7de9a3d049d267d34671c637c9dfd96c7d7e22861ab622f02cf34811d1c2e27dbfed0ad22de6c15c41cf8b2009f7db3685fa406c7c007", "526363636a006a5352", 0, -1479193967, 0, "d3b81eccb22c83b53dc1e8660db950c8dfc2f2161181e8196271fd3c8bb1f383"], - ["33e24b0d0474d19b9c9c9498c6d4ebe7bdcfb58ccc2a8a5ea6050ff8939eb71be9ae5b96c70200000000ffffffffcea3377f0b4f5cedf9dd1a585eb6f4b0ccfb0b4dbf42e89af305c10008056bba01000000045100636571afdeea82786900d3de007e86c66f7e28ddfd40060c9aad7eb22a0264d63c8cc13df4ff0100000008655153000053ac6a21d543d8c815a606e5bdbd52aa43fd1b0b680623b41c56531d64d1e824d71937c5993cab020000000465ac52ac53882d330495c6ef0200000000036a5151e2388802000000000465ac000077060302000000000700ac536a5351656226b1000000000006ac53516365536073c0a0037a03ae05000000000000000000000000b2857c448f8e4a68e6644e409e477ee9ec7a42ce8ee2f2774490eb7159aa1a089d15a6c924e0ccea2e42c971909b9c4e3ebd050eb0099fd34fa20aaca459ccbc15a6f245d569a5f1186ec68f6a7d0560250ff2d0c7401dec969c7bab4689430f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d57070937d747239d27aa44e3b6725aff2762e7eea5d63d1717f6fb97173a2da14a29fcca18f38b28275486c6b46ce8749e769e948ef7b1d8df2b0b904f0a12dfe0163aced603908eacf5aa025bee83ac439223d5c84d2aa5875cb479f9c39021ffd1926720b55daeb4d01ea62a017912b6d32aa5c6980c026754c2e48a6357c02200b358b622faf5fa7f0cd2fce901abb15138742d18af0db2e19b205c14b2caa020a2bccb3653a09f02eaf956639ec2631845127e864d3c00c6bcbcd2b215074900a06c417bfd66d161e081c4d5bd22c8b923dd5877bb5ed681c1d75d0abed89e1a0fba64fd32ee5514dfe5635e6f9eea335ddcfc853e6031fd45b73b59c1f91818d0316f24bfa56663507a498c10519f584a158e69bb2d74bd7bb671a303b4ff1789b02201387987e49af4040af852802e3f87cb5ce4e8595208ff89d1e709ffe3e0ef40326238cbdf02ea065ff8de7cda754898593ad28116e9a30a17906147c491ea7e202104ce9db14a6be122589495b481e0561cadef4f42295264eb1ab659836276fc20300d88cedf2244e55dc4b570e0db087074ce8022063bfd5f038ea82fda5506821ac2184d42097321d293881e7371fe187cc14e73846d74506943ab5e43ada089ace3b2464a20f4a5ec1ca0f3380d4e2e88b9b9b7befd099c7a7991e060620c7b1307abc665f845205c4ea029b7053ee70d025eafe2038864b1c6efc21598cf46ea1778c4cb61baaf0203924e367818014e17d031ed48e65903953c8f0e1bd48e5a75cb89dc8d67509f640648e23db6464a88bb7009bd2c9a1e98492f62d71d4b653c69f2284049cad95da9d7271498438ff8599920000da696682977d82f12b60ba0c73a8b8e57bc48022f66cdc0f9daa8646decb63753a4173544f58b9414009d8b9787f88eb83695c3f5330d33511df43fd2a121b9923d92b5261c21bd531f17dbf26daa2cfad13f91f6d10d4d2ac7c544f3d568fa7f1d684bab8bce7f8941eeb6078c6fc8165fc90b24a59eeb986d1a85f745072d64aafb935d9c05cf90c5be1fca825ae2ba2e87e5c6e8a21a767dd87bc032a1eceb4c21471262f0a6a6fd2509ae46f7caf310e8a7b5f64d1288d69491cab83124c7617c87a26f21a5c676a0e4f02b56477289841647ddbd474a02004a02737e786bedf76154fb8923e7b689cc05755702eddb962254b29258a0967831fb2f26f220aa6c2de924daedc835373e3462d4a4b6f5e6790a65bbea444036f317eb9acf81141971dad3e19b71c5f68e9538154d4b32a1a4706f104664f9edbaccfada1af756c831964e0190e658cd34957a08da48f807a06e307334160044bc2a0145df121b5fbb1ef0f340cb8f1a6722cb984d93a698e5d2928a92189b3a8045607eb396c6d3357227baf2db9099d1b2318e2b574dc5ca674c49fe51398602b42b7e85c8874b0f3ba5be27dc8ac09c19d7183f42f2b3b13d5ffc6b98b78378e4273311e6e0ebcf3b2b1ca1ab4994fc69ba5e19db0b55794d66824320ac1129f3eea7fd78c45ee974ac3cbbee5d623a2a39ec335caedafd0611665329185cce3f0af9853d50896a6c12134ea5486f57f7b0d4ab4b2e3c0abc5fffb2c776fff4cb04a6d68c8361224824058bf34c9ac245700c5c8b095cf96be421a69dabcecdb9d3aa7a5608a7aa73ea45d55ed5989bf2d8bdf86b42c34ec11a32a55ddabc0fe48a85117dc1bc508cf2d119c0f65cc0249dea91a05e43fc6a4d2d38a3310f2f3893a048cacad018673ea6045fca9a19dd3a8fe8d87cd7a1236c174aac04c13af2b8ac6317b429fd7ddb6d102cf6175eadb75d44e30a8a4e0a4f82513acd65f87e696aad9ae469223a33d6c2fd449b277ceb3341c3694ad2f5bd2df26b1e022c4be4011b66456b21899fe5c767fb2f913122a1e1b7b0ba2620c89766f364381be172da5949d80af819a5438c79fd880794f6d92fb27545fcf1de6fdc4c7224b4a9a3b170451e3d7b7850e903f21e14b4d944e5999b1861b58d7070580485953328bb30ce4393b74479d7d7c27d59372daf948225bbe5237d8243d8471430c95c49be374e2107a9903112c10a079a3a0958d58f430ce0f49f781a0285c994447a9dd11ee57686f3ac17eb557ff6a1eefe63f8e5f5b32b41dbb42c10cb1de7b0296728e66d1f4f4f1e135c4c6da1b753cb2455c834cf9e2169ec0e3ac6bd080841ec4a662d6c77b1b1983cf72b8247ef084d3a1c398a7a8042cb8c94c74a3e1f9b13a5cc87c2b27874930e0bf069a93bfe5c093a5ccf6f12a1152817742d81527baab0c95040000000000000000000000000be6e81f1c2ac9cbcb66698d20a06d2ef80d2d415f8b25f337fa76c1cf15e10db81b895f7dab41a4110808d6d245b460cced3f179f0622ab10dd4084150e7286d0ddf8505d082841832cc61a2ff06645a06b0d970137078987f0a4bcf4be17580000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000097a79357f6f80c87e4155ffb5664e4fa0b480661496147db42edd1b1297e821067cf335b4ad10dc4bfc1dc6173488cd059dc932807e00c196117374352eec4191a412c42ef347af4c1523929de920c0e03d5d749abab4c789c90a9876fc88bbf49634d9ef0e774be803e7907dbcde5ab9ebd80db6179d75a841b6d79fab4642e031773df126b8e978f409c552591c64647f188e84886cbda0537d356a6492282440221f868e88d9d8ed111c702ee9f77eab9609d1311257d52612f578a90b793c9050a052a24c3b3e17013747476a26c14e8c42cf2ee0160341eccde2b6b971a6fc5f8441afba4bbe2b2a3e0dc20d2ac6019fd68118afb80a27214d581408f0fefcaab0323b75c29762da812284a955230ff92dcc4ccd8c87b3d6b2458cc1c355beae2e90316ea00f933f3cc237b8bd7857429c9aa95f4908ba32f29285cccc8f86e4cbbca0213278a001d5b3821fad03507899b317bd9e388d915d2a6208c0bc2f524c5ba3702101de47cc60e155e61bd2de1af7c357ddd3985d883f576fd4b670427a67276d002131ef4bfdf5f6586dfbffc9e8f6fecda6c95bdf6b9a7c7bffbf54e67adfacfb6496fee87cdcbf659cb96b1ecdf644f16ffee0b8620ec1b3c5cfa9d27bf0a38e1db76a3717995b142995276ecf98de7c9e5ad777c7840335f0a509ac57d342ff3c5e537e6ced1a65da06bc0fcf3c3f0487039473bd1b387dbfd58f0c6d4a78e7eb15fe4d2a7d3e93377edbcd7f4e67a9ab06fbfbb1b6b782477907459f112e030617dff784b4f264343eb3c019dd9301a8e533534ef5556956c0771bdad416836871000671449f931b9dc2296188efc410c28074e24d47d2d486ede317032352cc8f2f30a0aa276b076810043b064ee45690509b1d3dd475b5d14b3fd789363146bcb653aea63c91294d96ce73e20c6b5a892623cd8848f67f7717bdf22796562d3dda81a726da597b0cd98380518fef542025e92778cfc3f31da5b538bf64b1f08c00b6f86eb30b5ed9262658c7cae7acbd572df1e8482ebe10fe6c77f2465ebbe154a386a0fba1092916e034326ac28651b5129993de90e8353871b30b6255aa00f543e896641aa54897538539b88dec027d53cffccee81036c4b522c4b79327d218c39265dceb9353dfd96233143d9cbde2023a7d43d5302de9168ae4d3caa6bfe44496072d669e5e7f27c3c70c798ec851b3957862de7df2aa179a6a8e5b7afaa317e851790a117fc50002c84e52a4b6b70f44ef56253560f86db0b14e5d1336df9db0abac400fea8c20416580d7e0ba058a3b0f155eaa45b39513353a88162a72d895f181c528132d602bc0be5970c46bb21e8899c8056200d59a4609a11b16b8f9abfbce4afbb19bf01e68904c51ad7793e5b1f226763e34f2a6b3dc8ac465df047a67673467301c0009520330f46696aa1a47154f2cf50426538e1a54be0c80e9badd25639a8ee62ec20b4e19f63dbc1578a9e8552dfc6441d0e9af2b2e836d8342c0636dcaca31d0029019eb8e2b0b66372fa3cd178d0f53c9e3e1ce611d7fe0ed61a86f578479d6a76bb56177e4a7c7ab7b3c53d0f8a3b1ea5863fd604ad8350da65eb6b9596f04bdfd64ac4336e7d7e1e7b20691ee8a1dfe3683cf05054d4fa3b74161e6dc6a2bf9a7cb64eb3075aea92b2d8842fb5f729feb79297a50d78131ddbfb73f5d8e27aa723b1f3ea3709cd3f952a773c44675d8dc0288c0aed9be0dae0a3ad0e87ff3836d3af2a4de04c753a069ceb1189f97588c9df0f94acbd5b65b884b22d6995b11c38fac860916aa9154df2b860b3ed794bb51807b7302e5edfcd6f584ef68e73074d94eed5223a27b2aad2fbd0b919f17babd51e066fa58f73037887b5168f807633cc27b5f2e29e43936b3beabe3244d29eab4b8f141a09627b1fa10785c291f1c9b82002e3e7f220a9ccee1b6aabc2a32c9282d6ff1b82ae4415d2b21a60b75ea1022c1695d1674fc384a811f2e52530eb88370c9113b84c9b3d7eb9074c5ddcf048d7062fc524f9e47f5a170213aee2a0b4b112d8edc1de5b211625fb70b21f6b186c92cff1c4b9a8da9f53bba4932c68e626d161deb42e8a69edcdb5d75b0d949895ab4e2689e8bb683f51a283af5f1cc44a228c0e67b0031ecb5bef648a5cb55c09e0cf1968e67bc1868f13e727cc8c0a36618a93e31d2bcc2bb09d4e2e9095eb2741388559fcbb5fe826eef20343f347e1d43a71a2b0807cb3b8adcfb548f7e8be6ae7f4a2f1c2d7e7d84c880906ca75b257f49b98ec4bd178a130b4885f034ac1c92224096a00000000000000000000000000f09c03d6c08bc5b31e39bc22c86afd87836cb8385d15574a62d19b8bfe278e60ed35add68d5c4ef2319caceafb0dea7e9cbad1a3d886cf7e6b8682955e236fa9c7e57a98a432e1fd659593289d5a11f7d8aba5667ec3f6d432dbe68eeca98e3f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c45c6f3390113a29d7ca52b94ff71cc8c06d2b1163fd34ddd37c0781d0cc6e31ee3777af63def329f023d53a42e63bbe3bff4e860066d1b224ffaf36556f875d4609d2e1566fc41693b8c301d5f1c0a9b48f3d015ab57e60d29df00f5dba185eceed51f45d0be9629f5ffc8d25f3d0e51521aa577c33ff2916fb669ced3e7a5d030e1130ae6a7826b4e187fe1d21252a338cee6b24620ffdc6076b89c89f9ce72e020fc744a3de971b70b512bded9e7cf1966b51414c0d4a5ad2cbfcb843702137c60b018b1cb818c04461174e6d1e8b6951c3f3303703803f1c96ce49ded51532bca03bd05aaba4223043eae2f20e8a52945ec56d03769446c55d0785178e51ff95be032fb9d5cbdda096179d259c950f127daa1cd34375cefb134c79c799e57bbc2cbc020ad6215336d284835a4e67b13a761a276622993541b479225650d8ff3b9342150217264ab5390148507b0a0985e77c4d2141720ff0682c7d9de90dd481e350ef09030e35b10dac031cc343586ca7b8e4f8bd9292d21ada39e83b9efff1e24b8edb7a0207a7d4cd8c6b8fb929f07e2545483d6b5ed312ff8b3aefadeb6969c7e0dfab7c5e2a282015b6b916f5dc11a2ffa8a3afdea3ccd1a4f01246c63c90562a0f8a8b3ff897fa7d34fc454a6c8efae927891a53daaf6ec8d191fd8550c6ebbe349c6a3ad0986736fd7895c0059a30aa5658e44cd9b68019b4d2102a1214fe87863467ce746c19f45791cc693c3746fdcf050dd4955eb6f4188581e0223bb9838fb5afc1762c2aeb779f08f085110171eaacc7479477b3824fd51e721ed30bc4955b6d288503a1c1a8c7e1bb7b0ed26624a92cbff6b142ee9872cec8b21a4098d82ae4e0d870ad83fb6af663636281d25e5cc00c899cd3e5deccb0903e913a7a491107a7def8d8f40ddb7a48897cecdd965395676551b4129de2b618b8d93b98ec1cc0b6c806accef62e23d09f1784285eae30ae29e75772daa6a72dfbe4575013e99f3306cea63f461e85e12ec88fd25a1505420a0bcb712a0cf67c7085b47450c9d03b9f47a8acf9f3f603094c8ce5f01edab40b44c6640a6219317e17990c3367e0e071adb4c129eff521c9d880a8d052867bf9b967a735ee2c30802635cb7091faf3628babe44b248198eeb3ea09b67575a62ee5c49a8038dfb86026cb193ee30785ecb36efe79b57a09edff91f828e8fb8677d842ea74b7551d4acbf42ee896f95a28ee876e0d37ac06ac9ffa3872f222bb0cd5412b3a1488cc3d33c106189746b493f5a154893ffe408ffd57ea9c374ca8b3089639f81501e945dbfee99790220cff4b2e54981d4849ca2c079aa1b25e38d7de1aec52ab4723c191abf874d63e28226bbf088c58892f597d1f53b855bd8fb68db3ed48224d3361417bdd2107c8c94bbe104f1332318f39d4dc242b464b47335ca0f754056d14850107852d815a94fe0b8b9f37cfb9dfb2f657e22f2128dc32b66bce69cbd5a7e9bc1571514a74c648f42e7f3c56f5db92410d0443fdf07dd97a190f0af26b78e0101ac917753c884b8976d214f661ed19b096bfcbff67e54b8079cdb4289ddab2fc38cd1baafa9b9218a5cc5221de46b034b70b45af66287ae19105f2fd858b6eb162041d30f758f213ec2d73347edb006dadb2e90139f0ebc8619d3182a3c81ec0dc6499112af2606f2de3ad66b272d632e46506e42acd793379fa667dd8049a14ee1a06bd087fc98612400c59d08afdd03af52b9481fa6cc50024b7d01da376790ca6c6c71220aeafac02b3ada6cd063b88d919d1799f58b8b3ada23bf8620b7423cde8575d5732a93e64ffc00683bdddb6fea4a1a2fce8ec0865d6e314935c2254fbd8d5aec6da855fa5f7ae63d0b64760e12dfbb6680314909d1c7b5a035b81f5a2ad9f7e61c6617f1ae724749636ae8671a3bedb3024db0ccee59e9a13a2b7a703fc1b89f9e28d31aee82f114e1dc5afc051c0f8750815adda0110ac84cdc18377b2b9b1744ae1ebb6b4a4a2e8ab256f07d652b41faed275b22564f39a7a9fbf4b8bd4999457a58092a9e6d9497cda42b7ea17ac34e7eec2bd84e2951211f2cbde13a04c8943225195db05e74ac9aa023a6ab0bc60c4f6484cf4d9c5979f0663698f0a30c6671fd1fed156648197834822de3bfe878620f35a4101f11f34ead0dea05ac7893852e20d1349d07b5467025aba2c74e48715cb8b6a5acd05add3cad45d2e049533192c8b0ed7d8f97db4794a5cbf21a6f1d28e67bc8cc97e1880de7ad11effae39db6adb319ee15417b76d0ec51662d115c0cf3cb227cabb50bc029a7e99a5db036f47d7e2320c01e2d845140e541c1bf0e9de8fcf22932a314c47bf91c576c5f09957be9aa925ed0bef27555a4f0e799d307e5c25b5e82271450f0628017ed6c38b923ec1d51bf37e2379b28a4388000c", "51", 2, 1226813584, 0, "cc8bc087278b8e53947b034c707174ce3aa9f441cdd5e296334aae83f25fec64"], - ["b28f7f1e0377d637bf4cd9af14ab25a1016814ec2790e6c6ae75c2ed82ab6789fbf9098a88010000000400006363ffffffff0721d452b1be720cbd3a7d64a7322ae7c53246fc76210be2d76490428bae728c02000000026a6a2766eb5fe8159927359554eb00a9e2832be621922c6859efa880460e4e23cb76a671d52301000000035365639f9b55be03514bfb010000000004005352522e440d0500000000066a0065ac51ac17992701000000000100d2a2e69f030000000000000000d04a7f0300000000d1b45ab3469516f584c7a298a107f56589373d951e3d2bcf79863b77e8d4db5ba884507f5f68b779fb6ee9d39ccaecc06723b4e0b84c2d98af15778c10cabbff479d602fb67abd6238b161d1905da2bbfb85a463ba0a26b5f45fb7ee273cb4080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038ef2c1d6833ba6e4066adef21838a708d49db0042634cc22b61b672d72068f28b7c3e778535659b9d2be45c0a23a62416dc62fb1ad2276f7304156247f6848187375c166fe518e78a3484a5cbaeebb6dbe1dc5cca4fac90be897100e56c3375f8ddc6ca22c9fa1e416f821d4c9eb06fa87846b06d6c9dcf3098b8c5715bb243031ce55755a0508fec33b5e9e8b3d7028c7a8cb1d366cb4f84a47c99e41902dd14032e64e3bd8435632e11df847a6d975259dda09dfe7413d3c040dbe3fdb7764e7a0b06c32e85bf4b4bf82534b7bd3d7fff0a66495416dcc139986a181ae46bde3432ae2a12a53337fc56467691210336560a7a53fed8985d2a890ce2cd40672726d4030ce15957ec395f414e8991d83b12684158c159a38bfddeaac5713f6d00f34dff0319620c2202f8da41b5613899f86daced637b4e4579c32fcf3cc00ef57e67f24602175b9d2531ed8679398e9eff2ee0671224e116db578c0d814bff153ae96958aa0228c0a164f020968c86f94c3b7967ca18106ff2062aba5d443b01a559a51d34dc020bb764e1ff7c1d8456e572d4f0d29163edb9568fe5276ba6506871a0ec84c47de6c44dea88728fdc3ed26bc52305e30192439956aa1b9992ea84edb3703fcb103e2ba07316a24556aa90f0caa2ab860053e187d72e0778546717c82fa6fc344ec262bcddf83f7d4cca4d284441b753ec2527f8b36045a3007999afd18158a027bc32f1854839bd9a57645b4d895b239fc89a1bb31e0a3c7f9531bc46b87cd2a3f6daf082df45fee2d0fba7e189638aacfe68512251e8ac31cf64d17fa2180e6ad8278dc100a6c8a8acf15ca513165bccf5420c6887875f067ff14e58050f644fc1e8ccb95ee62167d2d1c06547449e6a71d9bd8db685943269723470de0bc716d0a2d83178a962d31da9b4f67ecd6c8667546782b68695a62afb2ed1f177eddeeebc97fa79497fc5a472866ee8a97911156fd2d234bb0aefbcbf03fa8f77019770c0905767d33589c83c30d13fdfd965276f1ed8c2605cf15e9e0dbf31c9bab4df93eec78447d75bed54df0e952c3fdf531b82972595f08a49cd690b3c5503d5adf44d3dd48b05030b21b13fc592efe88fd7e0076f2b8cc059b169e4c2f6b9497f2e965f6ead02358f676e6c194984f0010ec5705dd2d0ca71c2f426b384b40e8f1e222af40d69b4a0156365ec3b640fd9331e68da178f3cc2a304d2d9da0bc79b9c101611ec76489f5e01757e69dcfa831b09ca5411ec2775d0f4544e5a9b2b92f98c58d484893a1e9a074405f3186a0347f62bf6b41d2a4a3e0536c767b6276d9da9990e533907506b1270548011d0c789bdb7dbd877564817cce1fcc7aaf7d49865cc9ab8cfdb572e3ee1d8f625a228bbc9acf8c64ea36408212a34283b49b1e43e1803f5009ed2d042a6bbfa23d6a58b58d629374460872ee9e1b63e04e355d0fbb2e81139f345ca10bb95039f5eeb45f291f52d6846a8dd7bd3e5cc94057d347cc6852bf7462cea16afe1b065206852d3ae7f1dbf2c7e1e36eaccb86b4181842d412efe97860c26bc8ad1857d720b14d8e530f8a3e3e8b38e356f312f5929c0abe652fd40b48d94f91670f95a382c12bb541a8e05000a2dd9ff93ec828e83c95e2abb787ab65e2c39f2cd59b931806ea91dd42c9e8a1479d71e3af279faab2d98b0eb722b435a55c0bb460b71ca3afedf6f40739a8defa49b854d0dfc2bfacb543add1dae227375646ab87d2ce4792e4c92b1b1c0f9aa5d59c77d26b8d7b1439e2815f1bd280eb434ae79e88fc499aad13be4aac53b35523388e8a65fcb4e309bbf56104fd35898c73c218175a6bfbbd9fd2f2844ea942faf13f2fe729229e1c88dad96c7e9af87d328ad419b1607bd9f5cc05a022fea0c9f5ddf8836d20e70e6ad1e5795847bfb19bd520da2158c8ac472694fe1f1e91bec679398b6801bf4dbfd66d4f648aa55df023dc1056d890cd06f3985d153d86f75671485fbcb74a78547b556781b010e4701d0996f82b8daa50854b1c2ba62f2fbc162a7c8316ec945032527ceba8fd69a823a600fe9d4bb54846b337fd3bd8066337c32c815e9e78dfdf5a6d53ba6e2d5fae13d3a9c7e507f7c3668eb279992ab1c693cfb2f8e1db84c9707a8ea40a3adf4015427c3bdc093d266383ab9db2fd3487a39f58fe9e7a9b746eea16b2faf1258c2212fdf73cc91e30bd86c71f5eb582388a61af2008d238d775ef145a7848a5f3bbd9e5be3d78eab0c9e160abb2df24a6924154d76e62bed9233add379e30f175e678b5b3c270000000000000000c16bea0500000000e24dfba862568a4f095e152f0bc828db74d31f5a721bddbfe46e0f95ff107e34fa2856766bbeccbadbbea1d374eeaa19821a24db98c339bcc203d1e55e3fb6e344a18428437924e3dd777ea746b038ec357807e9dbbff773023e46e4f3fe9cdf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b92dd1570589e3136b258f424ba3b113630ebe5a7ecd2fa04b5e56e45a13660f0d6b43e52dcf302b29e788e8ce5ecd681cca9aa6188c347dbb3d3d17d043beafc487b8d8e5ebdfe821093ee4a317e2aebecbd2f255edee47f2a46212fb8649d32621cd20be74acecae8738f1dff04c6a22eee1a2d4a04bdf40a58980a97c30b022757858f200c3945ae5d5a860119208428eb9a84518d8f25abc3e291a9d21d640227757dbe5e9f882d313ed4ae6842b8c84cf8deac748711d09fe43928897f08e60b001453b667cf6fd7117141062a74204fd1fc250bf772e066ee8a46a1516bf9a384cd986069fcd7fa634d0ccf74173a4f423973a5b1b6b2b0bb0747e7c6972f8d020eded90405100e89c4e7d2ce226fed0de22a5c317330181fcaed6815bb279d860304f2d530fbc1108363b6b41a3451892f391d4b908535b761427fbeff0ab4b43a0200ab710f19ba36d7204606cb076c61177c5d5ddde8402b991dd620ba7b31ca910206df8944d04287106a4daf14a6f9592588bffe2ce30031fcbc904d239c9a5a14032f5a3a969e87a8f9378e93ebcc9dbc684bdd25bc6cb4ebba8add9d97a6d8eb193e237d900ca59341be320569a2657688ab3e7e7fc050158c5553223297c7c6d09fb7f809c9f113bad8178185fa8efbdc273b30a63282810da5c0559c1ab1d6fb80732fcb14339c46f0a0cacb49ecceaf859d380dc06f30427377990bc017aaaf93a89172b0fe09e705b2a5cf3c2b6768aaa3573be7f76266be6d5fffea0ce036861fa9fc45c8276ffb4f046538ed0d5cd2d27fe1a94ea0b20ed303619338ba4911f432cf4707296b16062a20098407d310071b54b884c06afeeff41b1775c9048a3dca4ba69162599a2f9f01866a3c61ce210a9884278c5af573260fa9d1642dc5742465ec2356cb06f9e52f2e16528459169dc3925a86c83b1e0bce48c1f512869c79854586c775e06d21f1584a769b5775a03b4a3ac84a63424c94f8a7059e8afdcd1b7fc74f1cb3f8265ffdd53fdd425e0825315c1e11488dc2cad8215717230905b4d3896eb295349cad471f50ff1ac36c272f8deee3b2e29514fd6182a8dab6dfe55d7360b45effee11dc2b706b7a56a412c26fa257e5837edbfb9e5d2385fa25d87f91e34ffe884085992c52d33f59bae41905dadbd430888db3191110ad309c56d2240bb3a099e95d6f45251229b15906651e850995267e5041b498953c37567128a898016fec635c7810dac1e4eaf8726bc3d1668a182e38f88c1b59222156c34233ba596e357a072485078ddb9298cb219ac659771b80f28fe29c846e85f570d83d4456ea9e6bd5e0d46a900b24f949d69e3204a850baedc82c2e0b61363ae3ac81d1b8c3605400e0b1c2165701f8524126a213edab91afe51e78fa8575172b74d65acd573b2c7035d95097ef140e687295bd58e7952efcdbfbfbb724c1c91921a859c76c67b0d9720ce4dcb61145d458b19ee61506beadc6312744d9b0d63735581f75d6e68701daadf4603221ce7e21a6f99af4def3f54477839a51cc6b1fea3c2c45ef7f06f0a5bc6faf9a9a3e05ac095f22d0bb0ae141c116c01e74178aea65b4a048f4c33223cd62eacf5cb6997d852d81b9a481bdd6e6ff3af8b5c9b31ccfde560f5aa3023714508011e3220d87fe6e56e575525d6eae1ebb6d20c4d8b2ba09275eef4c40d1fa9a6f3d76d64bae02d05a9be7d4ca7648daa9d4edf971c2752289071c3528e6de9af836420316d8a853013b0b79e3c137f2881faea1317a19b2fd8ea5a04febf5d70bff82da535748f63f1df1e2df3dcca376702d5f6a8080f6ee17aa079627d6f84426e6d1e4de87976bf301427515db19bdf3a2846d44002b03dc10bde1ea9d71e31dafc1707e70da71da05b6f7783c2f543acc0f8f0c83adf09a375fd046d924ffb59e0b6761a08ad05908c1d6caa0bcd190c79798381ecea1d2b22995af0a4d8947fbcadb1daae9135082df9a307be9c900d9fe4787f39cb88a5049cfd31c435c4481ebef3a78a894cc90f17a538f19844a684af703d393d729c77809d1d5f6c1ba5f1c2b07621a08a68ecc70cab2803d865d09e2b5cc6b7f1222a65833fc4e14f24922dd6f29617bdd690ec356d11bd6e75d6061f6ab3dcf80008a7216735ac020d02b9b870c6e80ee118d2ba24eada2073fe0f5562cccaed217f6d280ee0d4edf7e95acbfb0823051f1cae3d33d8a361669c6f1fa93c03c82c3141765e0058b64d8ccc64c845d5a8ad5cdf836a0dd5c3b7947e6cd10ddb211f3bcf8158162f8ca312bfd3c01000000000000000000000000567f3efac5bb567a4eb184813c71ecb77e8d415ffa858c2208da6e04b3053e12d423ee216207bc38027162d0b3151e230fb7993739af5991b4398af0d96bf9999caf5563c8c3f866eba9e622de004090a35386b8068874a694e0ecd20b119904000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e0d6d0c565be9213b00d147749eea4d31e7da7e40c14378ee4374cbabee36b3764618ffbaded88f569d6df7ee7b8a550d205c7074e4c37a0fc2ed1d7f2b94202638e8bc24a95f72e7c03611204f2a9d3c914af152cb3b43931e1779d00adbb0ce3206a29e75747c8c34606dbbe6292ae390d2e1fdeaef4c488fe24c394f8842022b68dfbbe0dde301a184ee928d6264578803b7907d4a4c7fcd90d3432e46fff5031ab83803aa341fe76e744f09c0459251b55a3df4982cc76833ead55876c2a5d00b04e6284e4d3c9747728e742bbfdfa48e9caa29b2d8abc8a3cdafef1b3a525f2b5320e5b16dcc67136cf635360a3443d1399484393a4b75cd96134bbe6b74f00d032d226252883c57ed9b27ce873456be4c43fb049e809b603ac2278cadc5c63ef0022415ced084cf597c79ad75c507d75d0b662a755b5fa87654e26bbacb83c79d81020105f757a6cc91ecf6f5e4ffb1eb55bbf681432ec80012dbce37919440572898022e71e15d866d1a10b6e83da8b0a9f6f16a0c808bd566f4c2a43663eb7a35d564021d2cac6d8d6aabc00fba795cf0d5603ee4549e433ddbff05982412c25ce290d51397447c31263ed9f1fb63b20681c5ba28feb8a25e40a60e72d2aff159340e6bf2114b12e0d921922267cbe75c4805d36756ad38730ef79d6ddfeab37d5d2af6202c34e3f70f4936100d541c8bdbbeaa619c0864876669fa02c4cec09d98227ef65e929bf01f66d1d0484531065bbcccb2cdfe44a0bff9320fd2babecfd1e80a0e42e28334e6ea663344403cd05fcba2846f953b4438d99dc014ee30f234e0a752eb0325e5fb3a1ea51c1e17dd01dc299b885b23e406656ef1c2eccc9023d1890c0c63d802c68b313d5a4d43cb7bdf6ee4f5eb7bdcdbb05d48b07d69de54f0facf9e292376b33ddbd259f9e4a0c5b9e17e030d6c705cbdd3f5f5d6d1e00610565a3165e322ae6b07709400462a07f8841b4a94568ce147b33ab381ea2ad90431fbc7fd995b3fdf0e8b6706aaeb2a223eaadf02376a52795c870fdbf7d74e42b79269a748d5ff96e860f1b9cf3ac42c0324bb88a9656c5f6833cba858cfc8cde0724327d2e86549e449e4bb2a6a94ab7c43f1485ee4ad3f3323e360eabd765d7977f43c06632e8df5f0025c1c3721ceef6af085742896db1582b605888bbeda51c99e679594f101b9642d314fdef47fa1f15d0d3a641dd521f423c1962dfeea3481d277b0b68f85c108423e936458a8bfa921b026a705244d6560fd9fef800dadeede6314d1de09cb62633625e5064be3473f42a98ca923ca6203f1571cf53bddc39ff25fc9f02b6e3acd86d209751276c2bb72a5acd1916668e7592def48d42dc3407c44022562cb32bfedcd61282fb0b18900d55c5336230a1505f6cdd914445f9f88e1522e1d56852663e1af58d94637b0a2c05abed724678a083669a5ef7e64cd23fa6a3b824ca623dd02de31c27bcc4b6dc84fdd78ad8a2bd2a06ac274a29a362d11090ccd707bee74daad6926788fc447ee7b5548d0e5243c4bd89f227247170c36d6ee9283bab9ce62a6ed70345e4e077c62b56c8fb7fbeaef3419b2afe33f41685df5467e7d3d8edb36e31abd7012c4ece23818ba0a10b943357054fb0b8984900201c4e297b3850bc4574f7a0766be875f480bb195c0170ab0540f56b32b27f9c297696d1dab76a58233d411df9d87a5cab40bbee8caec66adac5eb0d048ec1a48382567727669464b70dfd6e138b3008ca22ae3c34d0b0a8ab27c6b8041b6eaa0d4f8c0353720b415d1ec838208eac173085efe5005251d02829f42d034e7debf721b0d9c0c574816a4fa943ef26955285ef28ec4c5ce8b9c837cac7eacdf37a2598e33ad07125299b25d50dfdc6d68353ae8aaf260146cb3b8e825860bad1c9e0521bc90b5e5953ed065636d89333fdde4928656aa64a5553e7bdda772337ff6630c193076d04013312b35b64e63a7f6035606fe77b821fe0ae9ae453ba472f99599bac781643b37b860a0f0d0e2ba148612a29d2d598b786afcbe2616984711a51d0721cdebbce5ab60a3b871dcf173066b63abdba45a0b3574b31505606de6c726bc2abc0ab7c950e227b3f18a7c8d879d52fd9d4e5fe58207b06c2e6eb459b6fa386f9dc9495a0dfd42527a820641aa9db57611236c397d725d23e5db2087666a58b03d1d5f9cd78ca468f9199e5a4da35f689fc0872a0c52808507eae497f23e8e0e9b9b9da5fa4024642c04517fcbc037dc38c1cd8323b2e4e3e579fbff3a9d5071a7cdd7e15bb28a833fd29d851f3659a7b07135b44a0bf3b0fb56518a876d18d1df0c0968b76ec07d9a782c6633fc7b66b882b1f47dcf86bc82bf248aba064251b55cecf1320285c4cac48a0141f960e1998aa96ed91560637e162c8302f80287723146262acfdd3905", "ac6352536a006565", 2, -1333188795, 0, "4da4d288cafaa1f4b68584134dde79036b02fdb786a81cb75306a23795adb5ea"], - ["030000807082c403019d6b0c83d63003ed926648e8f1ef2fe78690756747190f00d3e970062323e6d001000000095351ac52530051656afd0bb7c702282c57040000000001529eb4fa0200000000056365635252000000000000000000", "51", 0, 94763418, 1537743641, "330764efb197cae4c6033c43d1c8e74c99a28006e893b394a54cda5aad559990"], - ["030000807082c4030214922d934dc61430527308102d1fb8d6e6f4ce6ea2355d6d502512069dc2e574030000000100ffffffff9ab0eafb1df2874c362c589c211d14391450260d4935033c8ab5d7303facfb95030000000163ffffffff0476ece70300000000095353656aac6552536ab06b1d030000000000ca84f5040000000000168e4f03000000000151a7b656780000000002af1cc70000000000000000000000000089edb747cf5754df5545a51ee4d324c8fba86948599a5f70a89cb43f3ce2b14b37f13c84a2e309df5751099085d014e24b6aa2849ed3cb0157f2f9ed53c4f2a95aea9e4a58479d3814e5343afcff2e5787a60c23bb3f5d61e6f9be5c9d9937cf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000097ccff6cd8594f220b17e890e8b62918f8f9eb0e8814c876fe05582d010b350aed02977b63caf69fc8fddaf0e643a4dcc193f9d74fec631269c753b2c1ef74a58b35fd7daf114d59a34bc90bde64f94e7a518c0bf41529b4fcb39fd85431aab958960ce5aa2765eaf0d050ed7d9f14342c3a0ae77b27975234a62ddd3e9deca031a50996c683ddaf5e751055707ce97273438fd62c5214db6b5a9868b77152b0002248c2c219fa62ba72e690e231ef76d93f1ad2a38524534971d9ab86f7c7061f00b08d19709f610208d5dfad4ebfc4601bc9f6009ec7022db2fe86ae67a4e3a6c122626738d8c91d1300751ec7dd31246c23a44c12debab0e8983c6b107a74b46800310f7cdab039ba9122a8c80c5de12762e5376a46dab8247ce1ea60a77509f8a4502150ee6d8dbb9d082372e1c6534e67fb6674008179b1af46d89fa75bb5b2679d50200097a6fb230c83b2d5eea11dbe3d484d75088b1e94c7b9f517f6e51c48597360222207140c5af38529ada901ecca425925e698e04325c19dacd546c67f37476330229293a344adc8043b8d89b1e43bcd44637b58be8336b4a9f2cbd785e56a8e22df31b7dcc475ff08624efcb90bcb54fd02a841123001fe84e4d033f8c8dea207702fd14bf5436e45c8bf6f8f934a09796c4139ca718995b555dd96f98e448cba3e22287ec348002d1d25a768a170911a563a08515d10feb007cc706420e9213b8a509a2ed4be79216311914781e363ca756d52244480fdb2280d5198bd819b45a35dc66d11fc4b7581a105d3cb3beceb4f2d267321bb91cdb249848aa38895558c2a0fd89f6cd61fc13c95e06a652b769afdc80f91d8b02c39a9244c6a1532aa5626bd291fbcedecd384f6123e264bb790c513f6a9ff46a1c11b6fdcf8433f3d8d923c64fc6f6fede9fd9eedd074d0918d77afb6702dcaeb0e2556876942f91e9cb86fb0c9376a81d9cd2508e8527c2299200a65221f2e75dc74b72ce98a1c7dac32e3b15885d60d2524fa2a764a38ecac8d8a70ce3f0db6484cae986e9037f7882556ba6f629f0f95a4aa79c38127ccd35da9a7baf94aa7b824059142fcb23672c5f80601cad51c8d25d008b560bd56e594dafc58ff456916783a8395ec8e3b3064c988739a9eeda82a9ea7fe9be579a4d509e1d5731c2b3172c9793ab7f8ebb43b94b176ecbc40892a36f3ce50c44b3fa0aad9e7ed7f8739888d476b201460e306702eca8b6f314d0e00c0b884f31200a6beaa2388044dc27a3aabc828314c9ffaf26ff81496a9d7f418b539b001394384b7f33c6966cfdb16586190a49f610b7436b4053a84f3e47b26d8a85e2dfb7a6c6f424550af7e39b32481ee087627a3cec6b9d4f1780e0c4b8406d5027dab2288a0cf412b30dd052eac8d85fbc74e3aa9c0d7bea1391312ea4e6180f76558317a7d96ccec50a1b9ec64740dfde68e1949ce7bf497c2fbc2c42aa9a8f1033b4d34e70c61f3b4d1fa6ba197160eaa24a97b09e47c1f17ac11ff82f5196ebf3c1ff5746a4d8896c4ce5276634b173b846d32d8d324ac8af108105fefabe854a926d99b2b8b86db7dfb4cc5bf33915245c48631665ab7afe0992950f6b8cd99f9f9455388f6d1d4627e24ecf853cdbd53450d7a18d1050145d2db34cec77759d2abfaaff7347d52a7152a45c1d9ce160e806b74a9568be5ff47a7af67c31905de5d9c5bd4d3c1919409232385d164225b12de0aeeb41773072de5be3cfe59ed0bbbbcf903e365ba4c3968d75d6d8ee61c85ee19e2fcc376be867720232dcc371611497134d5193b55d5470afd49631e1efd916c0e309feefd2c8d6d9270f1588f5ab44f9690c71813fe836820ca45a96b5b5c182ff51ba4c9f91badc8f2dfa340dd8093553c05eee3677b3f2109af569be1f50dad5b2a123438cc8f622cf97259e7e0881d355b426db0187c79f9d56da9a5f73b5ba45e2f0967f49dc64b05d6a10945df5cff1b1ba82cd86828853971118703dd6bd27570c8fa62cd50814996f2d8fffa4bc46f670a736ffa32785ba9ea2ac9257296284f6f0cfe64ac9e07585812e1cf8363333d59b4efd4c57388e003836cd367053282e89a171fd9b92690617e068338fcc30da44628c9e8d51d9260c896d74dc1375da8482c9aa577bbc3e2e0413d89d4b3987ec956bce07962554090506b5fac30bd993077bb4427840ba3c2d2efa75b9e8b417ca55f59381a9380ccf255273e6708a3ed6b6323579c21350e79b948edabd0454debf03c1da4fc9cc111cee921fdfe631e358b4b6237b49ffb82f0000000000000000f66e150500000000fa7da482ac61fdce32cde93a81c530454bd68b1af30c8665ce2ca42c522566b07499f84400bcd0c4990a0dbf271653980fc9fdb58390af2957e79e335fcea85597f1321849954088562ff4bdc9d58ae4749cbb60ce2c749b050340c7980c1f33000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000652733ad027e87f454b009f71d847e04350e54695c114f5153bdc934c018dea211aa32680192e8db933651903dac05f401980541a9ceb5cc2ae8f9e456c4202ce76eb642fc585a1e5e983892f8af3dc93bfcd992114d2622e5e19fbb7f8a576a99f620d02c55539085645e31c488184fdfc420de3e1f32270c679fbb694731e020e9b64e9500a6568c981b8db758183d40b2630b82422310f0f7bdf54cec420b402097a5c230bd3a3e07a06c3eaac64995d994fa359419b7b77724b2debbee112490a07102be5cb30a927b516b8ea671002c7985d1918ac020a2a8510ac579a03831b04d5b22cf6e2e3be1bbebb80c248e328dbb9b0f802c615727b5d8fa1788198d3031b5918603fce996c2e573b5f7ac572e0d14df6b4508764c16f667d30b89801730227944f64ccd0471e7f43e2a525dc747e0c8f8e2315512431eb8129729348122f021a2b984bb3b3fc2f6c8933c403aef6819e97b93062fba1cee8cd1d0b67a6e2a6030eec5f5504ca763bb67fe55c06e1e37a38aacac4298d3cb4f3ba59dd0da66e34021deacf7477e1ff0c4cc51f634e9b931e57f075e56fde397c9e32d315c39a0b46de37146b36148fbc72e523040a5b81adaca3320547c3a230d62f7fcacdc9a4ebb3dfb0e35a3086fa7be605d4705b46d84f174ffd5cb7389503e76c0961040f40d9e8d236135f640dde1eccda902bba59c6c2e15af98e344763b8ed7f8a7005da82e394fc04fb34103639e1a0bd916e5ca5cc4b84ca651a62429127599e59832f00fdc92370837d0eac3cee14882119064e7be35c85bc1c02465db9a5eae64cc0c0675ea30326a089f8b2e98f7cbfa2b536b6181502e4e68779aed610bdacde29c5a27e77814e54e5503d04b0cfae4d3ad91cc96f7464e22f86b221158dbeb683e567c2a8f387e2f5d5c8ee7952cb71ae51c1cc38f05d2f82b73f455575b250c84754bdd0e65e4735340b14d857fb23cd880c3b7428534e6bef9103888608b5c07b949d5990a7dd7e77d5df0e0ace418e5c268e91dc72704adad5a80ea552dfd8fbfb42c18c319f939bdb85db5b1c778c68e1f9f771155e41eb07451a3b1bb12d04d4dd13c09da7155f78c313e0fff9ec8d2b504af2fd47c9d6194d1987b1d4c47b57566f93ee4f876494285f2a1d4459b91ff55cc46c4924015d672f3957e5f5de9d8375dad709ff0a60861a2ef93932082e9047356032cc89c4ee2fc4d324dff4be57eafd2cd4875b14c4182f7a11ea89d73e1e1a7d6d93ffe225efdc665cd8f8e1f40a51819ef80d3bdee5010de04b1d85f2c30b64b082b1f01fa2af7670177af18d8777df44a413d7cd480bba1957ac5a05871f58a79dc571fc1d600abbc91a54cca5ec446f88eac9f29a87fab627f5f8e0fb2344542ceb07ba94c4fb28c2b4f81b775b7b135a83edb4711c34aded399a79682760071b219eec632a7c4645f22a6825a45b5081230af09014829375b599aa0f993abbbef76b1d6ed8f246d20b381ef5aa31ee43d639e4a2425b31a549e685e419b890b2fc85aac6235bd8c4463117ccb83067884f64943a34eca9d00d920b63b28862bcf8934f2c48b8ac7ad7bb1d09c4e3c20b6b31ef2a7b7d964f2d862a0b1a222936a9a242379a64982a7dcf0f824609fc3d489c74ac3ab32b72244dafbd2d8d62fbaffa50c5bd02207f97386d57fc76e512539a4a68825c3bed77415c90066257111932d0c78e41e4e100bb5cb38aaea510fd0d45af9a0b43010076215ca2fda650dd2eb175cb30d2e879130b6afb4a8b7e5eb3a41241db70c32686d86b3728886b7fa7735a4ff87ef3cea75d32d5293ecef8d5156db70fde362620cf63f0e108cf43561c1768c16ecba14cc76c59bf8e9fc9517cae4c76629e72e64b0fb643f62af43dfeedb75c5122f63ed5f984718fa79d8b276b5af34884d653cd211f650dd383f6c0e0ff68508d9525fcf1ab3414e8a45288d53c6c518c0c5f41b58e036fce944098f8aa890f8b702776186cca4eb921f651d6fc37c6dad04a15c9a47752758e4c3b18e6b88a4d7edba3b1397bcf696efe3609c4df72153965182e6f5bbd07e21332d96fc4dd852a52d0576162b2dc7b9d98b5b3f1cf689e1e17566b465f9300c64d6e8c8e77ee68a098f752a824ecbea20ad4313af3d31e3a14558629b67c56ac1963800067c6d5eb4144e6458b400dab780958f1e71a8039f662a65abfab10ff86bb71f6d024b82fa5a397ebac6bdc1c6160b95992f441c9ed718609723e8b7fccf2f0e93a26d1be8e1dd4c9be978b0e429143af7a75869a1f0c747249b51b845a93bc3186f7963d6085195b2c535d2aacc470ab706ec65b7238c432c111da8eafabc115681ebbd15595679a1bd6c8a4861816fe33880d8d97ec012dd978c72bf5e27289e77a5565fddfb2aecede151f94f8226479f6cf06", "6552006a6363526a00", 1, 1378826469, 0, "231bed6626bfc34adbcef51669b7cf0198cb851f33ec39bda27696fbad913c69"], - ["030000807082c4030350e9ca671cbf74eb3c64bb876d762ec70414a61c5cd6831d219768775701bbd20000000008526a6a0065ac00acffffffff4a971e5b6a5ad3f0d51ccc4ba0561a473c06faac1bf61f668b98b6d279cce47c0000000004536a0000b7dfd4652ccab6d18071256c6c519c6c65f61eb67997ce1f6bb4ae69c8f64bbf2a30a722020000000651ac0063005251f41f9601317632000000000005ac526a0063000000001619529500", "", 1, -2083504619, 1537743641, "1c0c3e7ee738fdbff8927274035e15d1c9c20496b882766e820887c155bc96b6"], - ["772c931b04a36fec0938b8b0e618ecbf238020ab6cad4385477c9ab36aa0ad1e76a4ebb32e0300000008636563656a006500c3d22067a065c3b7165886b2b4a3dd68b98806fdca3b32f4569b7223b27ec00ae66223160000000008ac6a510051525353ffffffffadd3bbfe83ccf9e177e5a154cf66173ccc2112ffe1ca62960b75d4025b8030fb0300000009005200ac6553530053ffffffff3aefeda663d6d82e0cfe4242c1211bc6cf59b63032b700e991f3f5e8c2e9c1990000000001acffffffff02818839040000000005650053536373a3c70300000000066500526552633e15813303b3eb1900000000000000000000000000ebe1c7e9fd4d5129ca149c7e76782ce7bbd120486cab0be4a182d2d05d43d9b5f02e97315afd592d3f46f4e60d764075fa86c4c1cf177e58a89834806036af03038afc00403f1d03b0a31d716fdb3a6a77565d47808b9fb5659b1710027f489300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c27c44efc24e2a0d873ffed3377ef42ad4138057d2bcbd956242abbdbdfe6c6257639dcf1146dcac4da4a6e07f3ef4df4815e78c0de56e0c9c5134cebd321b630cda6143dd7d883546301716431638d9b6f10548d3c3b61dea1448d1b4b7dc8994b4e7058a1312b3abc37d3ae99fdab1a41f24bca68bfd0e48288c83b6555d5c02032205a80099e5a0a3f5f95cd6b29e3aa6f05a4a1f504debd13c0499c9e69cea022a6a964b2288accace3e5cc0f1b9148309ec70d41964119292488cd2151f40e70b009d36d813b84af6073ddd78c37451ea327a91378b16c99f64faa725297f0b0913190c88ceaa3f8d86c3e89c6d84eedff767cc9df8e8910f7eee7388389eed330206673dc53295223bc222eb5a9716449ebd68fb99ee2a5bd9a196d2647075418702046233a2bafbb6ac178ef5a82a99ae650fa787b3fb67c0fde28a437c292a19a90221baeac67afcc6a8d4419230119b400ded3bf6963733f4ba06710f34306b054f02178ce694b8007142da1269b031bc430d51c4b75adda68d3d513125c94eac16f8031191c6d1d3fd562f70878e46b7acd39f46934d56f4697ad46989605890fd86673f4d9ee013a84f1850cb4e0fe2ed8b11109759b38076a66228388c5f63b1987fc20c212bf3b02a44f4680129bc5b5177c35b85eb2daf803f6a1537c4558127602b99d787a9f640f5d3583191d9065a5472decd04f5872a4a4792a68c03bd4162a74099a54340a63907525f16ec36ad8f8bfe0310e08ea84d8f6ea53c5097a0a52b24a43324931229415a6f4883dafc1c803f20e8b1cc6c06ad8060bfe2f95ed8bea288d0016c698d0d603f6525b56489450d6b13e091180308b14966bf28a66fc57e816349ea7632fb240adfd1461ec3cd8662e7b3483f5f07ec59c37a9345d7f122f19f5d5066411ec23813d31976e072aeefe44c117ed2898670277649c2ec39f44b5f14d162f19877364562c945c28038fdc918a768062a92602b414249eb05972631a2a4bdf67dd9da2dea1c23ffa347f0d03a43617fd1a367154639082f020602c1288cd2bdc1457798303586a59c854689d1f4c2eed8f210835acf46eaa089291d01cebf25e1752acac71bf0785473de977b527fb0922f60b5edd393ebb98a751203900587ae767d32b35a17ea7fd88ecde75f2d579c58f9ed578265777b2a5bcaa4331d325d3b04120a663ea4a4c9b0150fd9f42a2672078b187cfac331145ead3535b5860c3799ea61bdc38de097ceb9f236abc1dd73bee5f7e6394543d0c427fb04c272c7b52b5dd0b1f1b7ac766538b1a161b920996be25848474453c73e64c9b91691f5b180d281169aac615b3b3fd2a56e532d64382105f83718d0a4648656fa3aa6ebf1fe24971b78f7f598207bda5da2b124dd60f716c6a192a930f7cf35c842929a6ef42f0fd0e2a7e1238819d79e5f9b44fffb22eb5a20b08baeeb7a349e6ea9b9440895f7777c5e782fe8815454f2af82fdcd281bbbce8e41b369ccf007cc3186f88389cf7057a8e4d64f6d492e08b0a1d4cee6e5a3a86879493e65b774ded3c13526cba409b0f7e5c706836874321b1dbaba108bf0890dcfe138a7af147b2ad9dcccd6c5e6a746a376012728bc17f8541f9cdf48248ea79f1f03e45ad0aa5d8ec2403796a12a40d1c055d1f54447d95ac684f2dbe0252a6582dae94ea868a37fa3a5c16c6a3f3c25a00b426bf0d6d54d043bdee2d965a60dc1b5bbef0c9fb561e6881952c39f45d34ac20f1553372c2cd0e8148fb837623b18a7cae6f92877f9b1b6569e6981492f4689e89541072e7a488dda037492f9b732528f0d76a6018baba69d3d633a671155d94c4c69c34b78454fc32a583aba518e84ffed1a714d2ce2fbd9e65b8ef64dbe2a72a00a87eeefaa633a632fbbb4bf6b42699a4f7dea6cfe0078afbdf49bfff78fa2640d2eb6f238b741caf9e5f554228e848bd5580cb61ff405a62c9d587963dfadb748375811aa8d29bc014a615d62a8b1de534234a82486e7b9aec2b6e3737b38da89fcc4c7489d7bed42e8299a981fd2477d950af745c518fe1f2f1cc1a74c15c9fd60bf490c137d3a84ebeea71ad99ed197b3fe933c82ef490a81fb8327884e00b9f860578e2b8e5c1c2414d3b628f4a5331882652f91580f21930ed827ca6a1e77c52b57e6aae56dafca54d24129a7f73096b7a9f591792b60abf481c8b7dc7be8839529951810df8958c87d8754e513acd06dd48a8395462bb5179af69581b520e42a934b958195d731ff1c0a69e6e2c23263cacbf55a76f455eca57a0000000000000000daf56b0200000000a24e70629bf7e4b389d520a28445ac15e2bfbc0e9f1635c9b449f897e35ca3fffb694557da6ab29308887fd1b6ed2bb4bcd29ce80551bf3e865fc5a9eb341949623d65080c0e4b844d235ad7a52a5fba8178ebab344c1cf8957520e7b0db3ff800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c884a0ebd9cc89a7a51c9fbcbb6fb2f29c07e2b2673e2a96cf94356cfe6cb6ca8212af507ddb75e7ac1ed66f1dbf5caae83665a8e7ecf8bcb836c4515976aa8f6659eb6acec3855999a691127fb97af9320ded78503d800885ce553973845c52f8d2f5bcc45e3c4c122bd0d04bf81406e681aa42900957101616bb0f682f2ab5032908048520578a9905ce82e81dfee3bfdd54dc95288773fd9fe1f2c51a31d1da022012312e8eacd7b8a0a98978ec264f95cbcd87fd90d218f1d4571f6734bb56c10b06ee0b0190fbf5d914ab176df83c98ebd1aa2490e54b45040832366055fa802a36e952cfc3a591a371ef19f5340a3caf4f62d6ca9a5e5545a62b7e23bd93a59e031da000e53d8d9ae3f2d703a4eac3b39d2400b6c9166b548192053c17164850dd02177751881b8f59eeb90896ba387cc3eda134c3986c5c26b3de375f56fdc2386a020d45d1007c31b92d7755a1e32c879ad4f00f4b81627d786a89c2f7b6bf2f27110318addb5f43dfde9b43d83939e761a9e9bc239faa613c877730ed671d75ed3c7102150a4a4bdbc3af3ff51e5744d32ca944e00b592e841dbe17a600baf1768209ba1b6fc72b69ccc3a58e4300269ad665e3e6a4a7a44221d9b0629745fa8d0b05817f0cf1730e53fe2473c76aaa796226bb641dff1d805e1052cc653f3aa89368bf8877d11918e4723233b50bb744278172254f92f44ddb0e6346d681cd9070ae283b2b71eb15247a1cf6e5a8275bd5543e02bb5d669043fe3646eabf8d3c9f3aca0833b3309ec97023048617430e4192a504843418c0f76dc47b94a4a8054322e0c5ffe8e32783a9452b41178f022eb42602a6f21244bf4090655775520f54415987ba75c50a3ea9d982b961c648221b1c4a1668c5926d422aaac70127e12d69b71d4d789701c0c4ce6800d5a853130d12a46ef35ccaa8cf29d3626c200487514d1714458ca5088aacaebe96e0f3cf0649ab544e640fffe0e14b60e6ac9d0529a8f7cefed7ca2e6f6402749fd2f96b716b2b8710d41b4da4b166e9d7ce00d1808793e4b43fdf4b2d5c78367babc250270f8f621cda9f17dabdad8ce360b57ec31ba522d64ea9901d32754971a32dec3a667d02bcd98817ddf80391c36f4055a3e51086a71facc99a67e38ff2b06b6d906df5ad16ca420499a86c3a3762899d38a3478e118f4134bff1a33d4bda6b3c4525cbced2d3aca91ec3a0cde802b243e2e5fd8ed2fcc13daf85be1a33e9366c87c046322ce440b92a8c2e1b74a0f72d96dcaeb4fe2914e4712ec7960e90a1114c7c5e5b874f3c4342b92c9226a28e6c7e836a3d559626b2fe40443b214d8659e0b51a655eb446fd9730174570d660b9a9d94f949f91a929aed39670216e8bd3deb31b3a8ff7a0e0da5f99213796a6d898f366a7771f0d8cc9fcc95548d40a3e50dc8c8084e105ea56fedbba72bff9e93106d0041200bc01a0765d0af31fffba5a5e7b2e20e7e079b3daa08d527dcd13e21d33dfc8a731ddf7e4c6f2ca509a25bc752264daa422dac1efe76b881af71965a04144e14d06184d8d16530f0b5bea0d2f3f199604484b82a23a19a37c576a1f3a54ae010f64a5f19666d4323efb8326076686e6be284d9b128dd3e146731ff6a03c4ec29a98359ed82cbbebd0b68eb8efe2a4b47b07d1b87aa5692bb0e8842486aa130ea29f80b1e1e56bf7f7caa444fe5038fae90fa53da9a32156ffae3ff79914429bc126a8f3d17a49aa6b36d08a2fbd2f5b2718c033cca7636dd5dc4fbc35f2fe5850a6519023d00a87bd8a6c0debd15d006952acf70ea4313de137740a0827237fe7a23bfb940f3a011af38ba9005045c6677aa56f31f1e2ae6052d45fbca75a214c36064203e27fa25a9b2e16a43834fde6899eb775c29b0f5262864954de97b1bc2ebd9493e7fecd7d944922a0b65750eb160b730fe6a5f02a52dcc6f4bcb42ec801ac8f186700c00f6258a75692c591c11bd8543f81c6d6a1b9418c6e58ce5653ff34aa87d61faa7c83572c23d41b1c278338b5bc09a657f2cd020ae4ded1d857619fe38367fbccc1e74b23c7b94cae498c9ac279bf88374f6f6674685664d258afbea3c8ab6a26fc7f7745472c8336f9c040402f1b825dc4b97e93c3fdddae3e4f7d74919af2678ee16f0c9cb00b35601d35ae4379a96b3ed00e79f5d8c6c166337bfe1f6ba7249832ffc4086a390ffa1b1b2a8a98918b7d58626ef3237832e0ed5df85f6f6f359ac650a7900f9580b0433bb2e291d8f42c4f873f1df3df3d8db0f551913e44be75a6491dc187a6032fa700000000000000000000000000084293ee9dcbe1c9b34ee34a6dfcb838a648f5f1e2b6477e551da59070086698df82a07bc05906431450b947dc541e6716be5825b73aa0d41699c3679f87991084a25bc32c0f141b2396ba8f9de9326575ddd7e251ef4a26f0e6a3fa61f139a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f1b7caa6fb9718e5006988783e3b413fb7c54b32cccd1024214eea994395c4573410c878519cd5590a3425860380b33e5baed59d9925a5cecf0538a93bb3a225419cf6c4becc1cd5fa628dfa102e51a3e96b98b44f7d8286697645273ff4d55e01f132737378b6a125ef1f55a6f8648f5d3a915da9130568dd18a6518b0831a0224f61a98fd632ee3a1666cd3b75610e206e079e36ad470000b8b7eeaaeea0bd2030a4e4fd09b7a49dd0a4a4884ba69314c3d3446512886a36e74573f534dc9e0f10a0114bd5982837008676965acd4f25bce8f6e34d8f67b13697937358160aafc35bd14cbbe95cfc95e778237fc50c5d1a433226c977ea522a89e166809ba66bea8032b7d5b6f28f69b64d7fd6e8a7f6bb53fe1f09166ceb47ee34bc00c0f32b31e3c030a767b032bb0df28c305e46da3ff16949d47c7429c8df0bc5f9e98c4c94a90dc0227410cff2fb5001033e263f88820fb43824a1e171fafb97141c80b0f6d4d007403132e5502429104e76fe2a8946c46598d3a7817aaac949c24882c4b716e0006c1020beedcd68d7a8c5362e9d884ad3283a0f7626dac9b8d3298744c64cd194fdb41b5c66c87249b2a15a230fc9b7d7b8eed8807f27d83a6561634a895753c64f78a3d07638adff595d293ddcb0fde4ab0c0e9e854b063fad9c7bd61f25917819e6d28ae76c1566b1dabd3101712541b5fb9401925e6fe214bf9c39e8e19fb7d474732b2644ab158c4980e699fc76270adec5ebc0e7e37be7656d929b501069f529333a833f4467a3424eb208b88b6495ec70552940780a5f08058684e5b7b7aa25875f578b5f562a02e3b9757f66127cc9e0cac4b15e2832477e57928e24c5fc3c456b262ffcefa98b122ea363dc28a21ce7e10bef28f98085b266410df9b133b0819b48b88483c1ab7eb650510a04d46f1df3d5cf550ffb45e60c25d39a07b09e41ad8c2113962cb1fea46058c3c180c6b5f2dcea2e8fab2bb25df46a8b1688316b4e53482deedc3c50b3c44cfb351a475e0f8285365f8771c2470a8c26313dd13b4b43e5b60a75a19c05aee2c34a41e32905378116c3fc6dce3a88cd55122eb8f42ea36eae5c1ecf4b08c4093d6f82b3b4f3b4d98282e2f359e1500fad15bd01cb8bdd03872dae276440f120cb8c8ed19b852008788854202fa2cba4c1142636a142e912e37e35544957175d8479bef605bc9aa45650114dc902fc43f55bce05c8d13412f4ac12bfc845baa5c0d88f9c2c62df0a503b6f5cdeae7f25106226d5a5803a6f671b6d747c938e3538a2c335bd07c2799952341ba05fcdbec8a8f93a37bf36b014df501039a8b6f60040a36153f41ab59dad5f6f8b3a684c010166dba8d835b85983c5e989f6a9733be2bb00f30d7b759c9d361e0db8ff8e241259b64fd19ba82dd68966766e684a8457d215cc3c9ba1f50d1b0ebf4ef7b87457ceffd1984884aaf248318b4fa7b4934fad2e809dc176b18c5db96a9fd267eac74c1ceb67ac68a082202430aeab3deb8136f1b491100d97a6ba1d472cc7702e95175fe13b78d8192cf0616caf56bd787b4eeb1bcab8f7fb5088b3dd2c3435aabb0731921e1b86364bf9907115afe5b55a2690b4163b3a9437531528afe8efe042a17e3ebf157c4f4bbdc70117f85e589adce805fb823743c8c4f7d1bcf0af418c94dfabbb1f5543f91451fa94ac147da4706d43a96aaf97ee2ebd72be0de03508db8e8f1c17f3c61de37098cfdbde4c0d7ebd7661e45de63795b6905a9320cb1957f12be9839ee54f714655223420fdbceecce61f7d422789b2f1a74842d525a7a9c54a7a5f29f2e2cc069143041d369dfddc3e7324cf90f43b08f30ba981f29fc9984d226b4e769960c1231e531c01f59a441abdf546ff7c0cedce373aa0a8fb5e0b7ab90cea300d8e27581b628115142465d3376bce102ed115e36311b00ce304d583370ad459d0a9d02e8e34ad104de96bd777d5158407e49213d2c79d6ff67bce7b15bfd8cf0703b0adada4542984bdc53d23fc86be2b11fbffc4555057f74df1e6a74ef93b24cf3758500e82c48790e8c1c1a77789548eac4c75eedf4e2e0713623afd8f29da0d0c02c9a9ea347ca5952049e290c4942c1cba06ce8094cbded5bdf1b4ebe33a17f8ab64e53139eec1784bbceb208b153e92d05a54435860687e0f8bac82a3e8c7cc93547065505fa94bf511e90c993b6391725f46fd0c313575ccb7f579da84e9660c552e00d53cf57caf84d34a89f961efa354ec4e89c40018bbd38ede6a173de7d4a49987effa2e042744036a1fe384d81ef4d7f61c4418c255134d11a85d7714271b6852b30542aeaa6b962c22f32d4dabcde226e84714ad13138822696e42f631072fef11a37cb9bd53aaa5caca350f5f7ff441b292e9be156253f8cb0a06dfe8f8a1e7f79a348d15709", "53", 3, 1554572824, 1537743641, "3e0888cf03e63c03ef211193b36e05765079a99fb7df3ba640ee72c1a73dd7c7"], - ["162f1741033bc32793eebd72931725036ce690cde955ce4c53d497dbdbaf48e7ae917bbeb90100000006536552516a6adcd2b2c017d7e5eb406daa9b90eb5db6d7ffbd5b4f9a287072d03b62659c2f66593c73d5030000000952006a005163510063c0ca20b072e626661e258797e1b46356091f94587220348f86493f561c030976700f7ad701000000026563ffffffff02b04c250100000000085100ac5300ac53526f67530200000000075251655363636a00000000010000000000000000e4da1f0000000000624f8cb50d7c81ec985bff1a90060c05b0c11525271238ea932859a6422da60fb33c060c6e8934011b03f00732ddca2f17b5a3209ea437f4977b89671663e4e9315e1ccc458c82cd7b3fd957bc754b295913ea3bfa4ee3cbbdf247c038c78735000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814b87482e5de9a029b60998f5543cf4be83753cf4f5564d2288e97b18f0d13c4cc91c429d3fcdd4b8648f1576a17a8d86ed41104c31c1fb4dc1a4cd5634718a4f5ecc931cb17ce5e6a12de1550c0647e023271ad2da206e008d4f94dcb93aab93f471ef21b91eaabf4fff0cc471b7c6fb9977a4b789b4a7fda66b0310045d0031a6e441bf7fcdef2e7da46526939401a0eaaa02b00e2a1a415c1f9b9ce0220d802142376efd7f4658ab1ddf859174e75dd9f69730d119e39b6007a2e2e1072fc350b0091d21e38c5a6be764e3eeaa7d2d247946cfd2a84009ca61dd8eab22659886caf8bc52fbed3a038646a693dcea64c5db8f5fd8b833d3d192e43ad8a52e04c73023014f87307d9aa412a3f7d52e16073f9034230de04558432a89cd024eaa716d30307eb25ab703d575999e0d4ab38e9b252ef67f2bcd6ad72b2c7a1afa10f04b870030c79ab1108100021606030930d88f19ea12e340dcad7624f0aaed6a30d29343a030b66139299d813eafc395e72d74747d9ae40da97267baaf6e969c679f35a863b03115847e4d812d7ffe3df1f3278500c96a4043e20c9cd02e7dbf5c6adb6820bb37cc76b09262ce31c05d5aa73abb26bedfa479867fe09ace68410c8cc67e69d4673ff1d0cd9a55998a051937d13f589e1d0ad867868af1407f4c202750129c44fa7db077e1952809b84970d11e93fb0159e795883d60d578fdfcf8125788c87afdf7c32ab1188f27495830dacdc04ace3bcffe4e1446308403be7fd4ac2e16d6f156a4dce53fb331456e7ebe285227b5fabef5460ab3a144ae5d29dd42238c1f9904c18fefcfd96c6c4fe7ed6308dde675ad59d025ae55fd742ed3c31f10972fe1ede4c1700386b421567e50cca9e7af2e62e8bd1f57525aa5261ed1a9ce070698c5428b212cfa37cefbd6f10e2c94a719e60762db0e631d57127939c36add3265d28526a975f36b93e8a29318f78266a987d20af977cf4422152cf5053c9e8156f40cb954358d135aabf9c2d021db30412c375eb3e75f7cddcbb07da5e6cc58131a5b7a822eb9225c08d3bfd54c10dfbd21abcb29fbe064bc82d16894da0c503a6495987affa38413b491064b9e88efaba74fa34c1307502744b4a5d02e89e40b7429fe7f16db408caf85e8b771fbb04cbbd64e952b8b5c8995e0cc74e003bc8cde208d83443a03658578097ec57cd89fb91d2e9bc10c2e642072f71a5c78298b4acbba4b228154ea9c0ebd5254fdc44017fc45d4564b78ef734c821cae20177d6818537544457a365f83648cd70a92f9d6094703e8491c668cd03703a41258d93578fca006625f52de2767756b270862e89a3d471f8a68eb8da07db589771103566ecb156f179a6cab26a0198e7b6e4f0acb56a9f7b8f8ee7159741274d62ccd3af060677dfaf7c51bef08b573c3ddfc4921ea8c10c2a2a098cb6783c4c1a7a233f071f3737d4faf355b6d253adf99b6d50bf24084e7eef95371cd3e244efd58f581c91792a90d29d431125e0e1f76739d29ab99878674c42b6bba45b7312654a753cd2e9264917f64eebc2f294a77f786a6f66b77447fc31c8eae60f098fb0cd57e8487838ead36769065667626c0631cfa4b1a3b8147e04221d9932374795d49fddfc471d024aff8541571ca5033911f1695cb4a2452bf1c5edc22993bbe5d548809ef03bc2f04ce193ff07377dbb4f5a3922d5c608496785fe9417953020f7a1df7f0974526b703c2ea8a471bade095e2e193bb2151f2692bca610f6088e5e461b1171a2c79b21b27e0c6724e54498e879d4ef68beb46197a646da79b6f41b8d5a51c4bb2a38ca25e6ab0fc04209ac7e953c12a02cbb81b219dbf42b903e9e75ce01d2f2fc8f04879cb27fbacc48b401220e179b21d81da60acbff2d5619f9f71e3d3b5cf7c212ae8477d2401cd5f9fff5bea9e1481b791a288c4494c654250a2737a05887c3f18e1c982661bf5b2643914484872c22ba2546bd7ce5d7bdfbaa29fad30fc1f29fb1e60aa807a34d198e9edf0521db4e162672b3e1334d34d90c64f505f623b1c61c5ad19a068550d1abf37f92c2998d6bb93ddcba826497e7cf1efdedf1dd459dc63cda2c6525be1dd85853c2a0890a1871549f819f41d4b2b93f556a07835b6a6130ee2d41a422ba89a5c6d1eec1f8d3b4584d483bab78f24a0d6bf115330918ef66076a43a52a3f6abfe31af9dcd5f74faa734f7cae434499a9dba4392b22d626160da10af9bb41a8cffc0801a4a2c25cfad69469ee5f50276dacf1d096e8dea6fd235fcc3af18237247eb37be099e8c111f408f8d21a78ced88e496b878eefc1e0b23b6a1ad05974821ebfd80665b6700a05056d168a2272be4ff5ba65c3a3b6ba5de7cc2ff1e8a019a46dae0ae3267af4d5979d7add62ba8bdd9717ae626677a0f017ecb7438301", "", 1, -1382628643, 1537743641, "b229e82632fdd019e3f45083168a62958dc04dd43d6f790311b1150fc03c7f50"], - ["030000807082c403033c03d3aef3d99b381375da2522f82bf34b26398a842656b7788824545b3699c002000000020063f90ea13f2bf8dda68c8236c59f0e41036a12ae35bc213f1ef788be95437be2cf818b46150300000003ac6551ce57967c265687fb2a373a6c25874849c2749fc6cbe189fc25b6bc4e5bec74a1cd9abfb8020000000452525100ffffffff01f7cb89010000000002636500000000728c45db0200000000000000002c1a920200000000ca42a0367e7e9a74f4e014201b950ae03585a103b6efa4a1da86365369ca3b2ef77e768fe6e02277e112cd2abb7be5f73b7a4f77915ef2bee2c2b0182adf1bb8070a21b9e47e8ccd9f1624df6edf4c8342626b9bc8112e60009d53089f50b849000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004b1b9562f7bfc5b911d46646055c33792e91e378d775972a169906162b1d1f51d0c7cc2fe2f49986565da8af6713888ea1180e44c7c466f3e0525da77a0f3dc5d40db1133fbb0cb2faa29587a459ef8191007f6f68c577693389eeb226c99f3bef4a1b20521ab6a78470aac9da869597db35bd9be81e5dd9ec603a2d59b92be1022e356f2b1c3de664b0c0ed06e15ff6d6c355ebdcb20a28218c59e2e6c428a4c202228cdd9e06a34dc5b6fb29e2d434b340797f83c899b7ab28371c7a32857f24260b08fe83e6e1356a8d20c79e52a863e310d940720473cb7af97a3fae4f19e65a6c42940e88b6a4e43dc814588d2f2a49c26c77fe77c8106a83d99e9ba3f7e8f8670217eac353c9a2e91b0ddf39ccafa71addb1da22004c076621acb692aa576a36c4030bae78745645e5644e5e0ad03f3d242e0c518d26bdb8c0770968c12475d5e1e4022fe7037be6c69b9224b74f29212475baf6cebda60d29e35b27982fdf8c15c8f5020cc6feea3426e602dcccb92a8ade5b7b703257383cfae7e2d6d3ed74161870e7032136bed3b9863236a236b492250fb9fe6072ecb5b077a43fcbfee8836f6612fc49a1c7273196c942736c9e54b8c9dbf75ce20cb72702c5a359ae893e4f03325c8823c104fe0f6e28e3cfa44b6284bfec3f49c4f6c5633767801a3f87b4cf550fd5a65a17a6cb72730be1a87fc04d2523f322f709f90c601d7509bed196c50d0c1bb41a8b6aad2a8ddae802c7b67d8f0c7606570a0a8436002825aa25641f01f76de33828617961652db4f93f3875d8b983a44594f50d1b4b1899db54598129dcd47d4ff45085cc675f256306155dc9ede5eaeef4b6d89f9770e06aebc4d07c761915da37aa313708d8799b167c00c89570e2432ed11cc734f131d9eafa3916314cffe5e25e85935ef14af97ec8988ef1b68da8f805e14172bfc3c9b3121bb82c6cc56ce3f3ad0ebc31193576cc004084748e390bb91131387b54296f9ce5a6f6d64ccee114c22211622a2373e6bf6af29a64df0790087f54a02aabaaea23c1da325e797e26696ff51eebd8e4eee62d58864ad561b810b151785e1c5d3ab7e9e4b3f7518a5af4ef0a513b44fe39f9a30744ac719334abc1dab267ace97002b6f52394cf8ecf3089a6d2fa06dc89eef1282b85638f61dfaa6a466bb2051ce1311ef6aec2544eac56db443b5ef45b93e782125057390d2b958a468fbce9f0a811be87e410af2297f7598341f8e42fe5c2c26de4197db08acd38ced1fb3a6495fc80e81bd3fa0cbb3f719deaa3850f78f8942906ab14e49d9746df33259c4398d576ed6c2050d53aea8e4eaec39372a52d0fd98410d6ca6c7e2bc3f63e81bb35bf1e91dda49b3ff82bcbc25f226e83c5fb87800fb644b148153ae1c180f19b489ed4459e5ffbc534d228992dc28a35f7a0f4cfff52e33a433aea6c63c855f978847c47167fc4e4e967c0897b065f8a40a682db252bd592702464a4648548080d8622b207af0f25e5c403f96dcd14f98996b230701c7b63bea63568e2a87605adde7542cb988695f86d5cc3fb379c323e42ec1c84698d8684a52e3d110c97761da5b9c41db628492bbdb4bb82f51d59a24bc50c1118ccdeb06a89cdf99882972deda624e4174be7aeeed669e292c06a65025ae215f1aac456267a3ee19675341c41e110a40b2e3c027998af2494fe7eca8d5130c98758172678bb46281c2e20b10648e6daff1094430d956f1edeac153aa6009a3e10cf749f9902aeaa0cff3f5619088ef06509cde5749ca235a3d30574dd3d8b0443e45459deb52edfc83fbf0ccb5f19add9dfaae2ce4f1609b643c5f1c77bbfcfeb02178372d8473e3a7b8fdaac0e9a18bb717f1cd9b791d7be2b3653acac93a3ffd6c8563579f8b5d26ab4e198f2414300622353f3da782fe1d8c14c5c2f2281d5058d563fed40dd3a49252cbb22c1720f422e26f3beb38e822ff700b2d2cac7df4d0b5ea75b0db095fa7c0f3e79dc0a96030050fba624fd47c7768aa8e7f60e35ed6a2090efe006b89a003d5e8ae84454f940130e4db06616c5e4ccd10d392f442e0fa12556b3325c91816c44192d73bbc25d39c0279d90da39b2306fb1a8c834eadba6bf7e37b4841d2e7e73a0df0443a985577e50fa88bb83b40399142bca20b872969e5ac2c3fe43ec7b01d1f150855b6fe3e96f06b3fb01ab9f91c8a0d782602c17b4a31e8c7b4cf455506e09ebc7090e18e4b951eeba5a297d095a7962ce3a6b0fe1995f99ad52db18a2e55335235ea68dfcc8e0d14e92b61118c5a4d4000000000000000008440b02000000008fff41741b99382ba65865e91b2dcf7e396e6dac0e4ce74d38e13a02fc434180e3da194166e5bdcc93fd544318bd2cbca28c8badc7820efc7c8932371ee2dfe7bb13ba770ad257656788ce08de034582ccc7749302ddd55ff4bfe258e33157e300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eea09801e8c7b7d477e27cfe71b59c0143f55a35b8a922604dc0666555d9f907eba3cf387ddf17a1124795ac64a9a3cd7b1ac054c0d77eda5786df13e781f95ef573a503d2a60cc1b2a0a0bbe0e46bb2cd274c6bc8ae193a96d37180a494955e10fbbd835832bd63e7708ef9f627e8f431661a9c59e7cfa375840d6fcb03d4c60308f503c8f0edf4252d7b9fd57fcafb6149476190653adeb692a31164c3a92b200224cab0f3305287d57f603690bdbe5165eec4e27d7d87138506c31e21c8cb242f0b040f59ae3537bcc8f5ebfb41ca0d4f49e1a63e5eed13d7b764ad8c0c884d266181b6542f35c7147397c23df3bbbb59a5c0cf16e7f394a6ad2ecd6775614c08960304ae7149c8c33871d943e291c0c5f5246160ebb63ea4c71cacc5d63e6e209f830212d1d78e482427a4502beedc0892292dc1bfef766182a7fef87a9247f17ed95702116e40240a23fccd6ac3952b9ca2aeaa547c1ddfbc1745bed13b5432a419ff98021c2c14b7168335cfc88b226b8300447ed0b530465f880f46d15ca18f4d1ea8a80307897fd29980a97abad3c87300cede21e62e4e1fff9ab2dcf8a1154ec8f3a0b2fe502832167c34acb54444a4cdc76a1823083204572d135f65db1ee06ab0ded383f39a34977e9d6d1c678eca5c4c4a3e51b57e848d068f0772c44c4d2a5ca79a377a3f4ff77691e7868491efa744d63645161adc11d103b4891b6aa4fbaa2a114518cb3a10f1869f9a0780dc2806868e7dafcffe20200ace44c617c9bd34b96e561d4cdb88d58d532dff432233a5b23562da848006f20ed54e14ae16206287e19d9925b446730ea5ed7d0c1f2f1922eda5e55234e0c33a4106daa162c22ebeb36081eb76d94c293c5d8ce15936cf79843e657af211651f11b6bd54c0c769fd452299255051165985cc084b269ce4115bc5e1c08e6b383616314da457c62616c719ec5160cbab05f844702655df58fc54ab003ee89f7b91ce5ea667929e49690f9bb786a8efdd99185f2eac8c085748c7bcc7e2cf90b78a5644d6379ee8bd5309ac63a27dad7c23d2a11488c9046962434b5b733b3e3eb8130bfe5d87fed9962214f95fd3a13a60c132700dea71946b31ec3a47f0923e034cb4e58ed5b51ddc53ffa02401f0f2f9ccac9ca895998ff20ab4f6df24bb55b897980cdbd419e77c9e1348e817b2625d8c8e6916296b807be623270484e91d628642424b021c28f8d180ffe97668274e2676c3dbaf2633803fb85c2d90f7aef98578259c04a16ad1b96759e9d4fa79a028e535fc63e06143c165d7b8c33c8d4fce0cd9801ff8862215f2416f82bdaa88f315bb846b4812c1eb8e50be42b6df1bb62faa1e534dfd40e194bfe1cd1b3907c3472be8c4fa18b7bb28d093524a35a9356772035de5e97034fa7a50070ae61811066b4e345fd7509dc88f7860a310f3f5da13aafd9cc121b5af1ccc35b9a9e2df157f8170badd49693e45abca4bf2a75b1ba49baa2ffdf0472ccd8f35e8f68a8a8ed96dbd3b392d99788369943b5cf295e66e5aeb775e4620be0dae5860885c3a7848d47c6c3b4bd917c1de745fdaa7dafcf3381e960c1f5858d2d3afafc52b23499a9d4aefc7bc7097c5792a6b588b730d83fe8b29981e07ae703b0f719a741900c843295c81fc3110420c2d7febd356a842ba570e89d0cbfd6cd47d8fdd95e0e1d1b1be4bf892fd16da7fd2d4d8e3aea0b6613c712c74a37667646e5950ef0b4f083cf20d1c51b2b001a0ce7d3f7d154a3def71a4a6fe49e030b7b0833b54a71397e6f6e845a6eaf54639c6d7cbb48ee244ddae9346b7d844b623687407c669175dce4a74141723eef915b83c9502d021357ec93140b366d48963c891e021677e4329d1bf1634d9ecc511ceeee06551ffcc6d8c1bf881330180d015579d65405bb9c95afcb962adba2348d2a8a73152fd1d163ebe80f297f5041bd3be158d7dc569f079c2f4456e45ba7d8be6d2e7642ddf2a562f10bd8bff18239abb53e394a90a8e176deeec25329a4fe5804bee4644eb58036ef3372b2698153864c9c0c0be8a43a7f4a90e31f50ab625a3852174170315fe63b0c9b646da384c0d1bec3dd4a89e3ca635f746ce3adc79cdd7bb17ee73692a91c5dc266272995e07106b516b816caebb04463dad5cccf1c5e9f2af62b68553d1dbf958bae09ba9478f5b7cbd35c8d28edfdc71759c018abdcf076772605a61687a22d27194fd281754738b43fe0343e4635438b2eff7410b67bf55380c8f8387590784c4c8d8e773b7b08f30f28ad1954957276698662244e9220bd7dda1f4068d589d5a7c21a5e0a6541cbd9504ac07b08c9acea95d51482d19c2b6045c984af650ebdd3962ac8c32889d4bc8bb06bd73e15f50435092f5bc3d8447c838960ff68d0be3de474f0a93355ffec5ef10c209b7b94509", "00526a53", 2, 229310710, 0, "d21a505ceddf1c08977050834530ac1e30595ceb13f25b5f8d00e40b5d996cab"], - ["a878280a01e862d8ebe8e9749ab9c884fcd13d27163f5ffa7a82507f2793ba768f6507f6c3000000000565ac5353acf918f51302aef0af0100000000046a53acac35e41901000000000753656363000052000000000300000000000000008a74e905000000003c3ebaf53a9ec5c0d18cd59001053a65c467b51ae9e543fb530045ca160b961dd601b157165a088cb9a6a30f55d4aafc08b9870dc4857b70494bf707c447beba6b7dfacf9a201fe189bee1978f2ee426af0549182bf6768c56d12b2f69bcda930000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076deee0e9982a4b1de0762d694a9468ef2227181124cd648c4aec0af4221fd1afc993cddae7b9cf72fdedd7859350ebec7f74d7779b647e50dd1034484d800c1806cb22b909c86decfa9be55b786a5e41518b837711dd0774133739a941ea1239e44691574f60518f06d3b2e0b687a19b0d59bafc10ba373d68e03ade4acc16802182c65a41bc40a86af9a3c749436c0388fe3d95a03510f68d9c66c29cfdd3e580218221ce0a90985ad45451dccaef143b523ea8c87622687bf2a20161ef2e5838c0b0483c3c40c41d850936427ecfe4897bbe31163e3de44e45b9bccdc9dddc3873ea7897b9c527a0f91c2e7e6da63e1b7bf41df218207d192f5f6b4829659dcd0b9032ad742e5d83fcda96de6d89ae6c9e12003afc464a5c7c9b096fb2690af9f39fe022f49e265deecc6b832b775acf0761e2cbc1bcb1c0af76a2aec0ec76234605e7d0217dc55b98f512145d79e60f54dbef3a76e07dbd6da7fa2fb7fd94729914c95d3032ff43d30c12e05fe59ef4e320f6e31290f08d4130c1d4489a470125fedaba3cf032769cb48e9245ea17aa71471ecc54a4444c29aaa74d2b04764e11fe9154210f90c68d4c7018e5225da58f3686c24a98d49c6506c7d48933acb46884782aeaf7d0b701efbe76f083fb55c108688bedca34c40cc102533358fb65f1262b8bd4f63a125bf085c0fa52e99f25e55b128ee7985ad7439370a272c02a903f2b61950ce30169aab385b4379891bea86de7107f78d5ea37cfeeab844b0bd6b821add2800dc56bd1eac7f3d0f8b842dc147bc10304664638d915ab83db7340f912cb7586f124262d8f50bae3e20904c79bc45a04be71cb3fa610ad0774e2595b39f664f0f69854f955dc8ba8f78a9a832744cd02ff21c5b1e9ccd65e0b74b376eaa362ce27ab563ddf5456d141aa68a2262cf923982438d6f9e57c470a8bb1a7c90e619ef0b18f31c58836a2a3519fb07fdd9fc623c932a754b137f0a7a3542c97bb187cbebd19f1f8d14f10eb8ee14d1f3a7e68e9cf2fa7c7a8349832efae28dbfd19baf5997030c6d689c9aa2fd3a91de012331db4e0b5bbc952dce2f0305938f314888c0ce135f04b9243bae519b3b3f92abf1c2204761f2ed1ee26256fb15deae05007bdebb4ce2a3b303f2170c29c02916ff6df239c614357ba4d9556c7a98df54e3acf4697a01199c0319be5c778688e8eed700dba93d865b28878d2905e0a3f365bd9c00bbf928d2b4ca6100cb44c8a89caf85896ceaa21f99825fc0d051dd7cac3f7a3f66cd3346c540020d02d3b061e029926118f86e4efd303e915a836882226a939637f66a214ecd50169919f8bf0cf2414b55567e6b2cf5f6fa75c0f48f2933911fbb71b5ac51efeb0fec432d370ae50b9cfcde6a189eba8bb54a669526e60f9fa877cb649a7012318a13c6bf9cb0fa2ebb925782e7b182d94d443851d7aa3df49f23e352629886d13151dae3b4198c1dcbee34b40e4a3722bfaab6f704f34169fb951be5422208c408737b596dc1ebc54c64e8dad4450c416e6f74370635c0f0f5729ef276d39bb6b6c3954ce9193a2aea90f970e2b5e1a9348590abd3f798732dfa563fb2e901847acee5380639f1070c94399cc20637dae16076fb73a12262b8b96a2f03bb06f57b596533ece9e1ad621a38d8824ed6b0af3fb2d0b39b388f3f348a34c64b0c2b8a74fec35e5e4653455cd6ffc6474f39dd68b973d4791bee0f0717e4dacfca309b15961ce50bd9888f53a3413f87372f4c12634962916c6f812c8b084c792b992ebe77a3b1b1ce076cbb1363ae41c5bfa13f76752babc98c8a6d20a1118e7f37529d8130229edbbda2d193c6c594c41cc7e096e36508a3a8e6e764de8ff0dc7f4d1086c94c5b3a19400f855d93955d884229ea8285e9e80b23108ec2a75936af29a9214fa3abe1b24bb85d634895c318f9862096d61c2cc4262a692bb2e1be243febf94c0dc7844acfddf6b54c4f84ed78ec2adb9e32b189124a8428d3c7d2d0c7a57873f2738a227d571251723474b6ec570d8373dec31c617f29764e3bc7eb12719d203f32dae7080ea424df37e66a5e029e4b31eb6f9319149d705abe1ce1b1fc4ed4b746f0ad3ec0dd05594240b637119df240d67e58398528075fd2996b8607b1cdff324cef92176b866cfefba18850a8e9f0c344ffcf5343a097732ceadb7ada0afe8b8f1af5917b33749f46fc9a8b7c353d028caf9cf3ae90e03b585020a27301339b07b5db582213782a9ee2078c9a3ae9f914c099bb2816c9454306c664c399cdfec16711fba403000000000000000000000000e0c8731a89d29c228c8aea6a279284aac0b76fd2b259b44387894e324a6d2d07e5272288d50b52414314bd749815a5398ba663f57a13e9711703ee4bdc372e525d8c38f89ddc7f0ab2b84f41fc371ea6223a238cd80390efd864a0dac54ff1f400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b51a90b431f03f82c325f5ef710bb94c5866cc78c4e46a8a62cceab3535ffca6160f8219cb50282916459cdc4770f8f6ce79d51f64dc3129495548c7e41f03954c0ff8a1457473092ecb9564652a5af98adbb7547b12c518a5661f794c3f75b1e974837cee0def928f10606dcb2305ed0b844dcf7496eb5cf7d48c279b162aca031aad267e75bfc86542aa0206a9167e56b1838dbba77454fbab462ad49a5f4b57022806637acc130b1917b476b8344405fbd6d18919885e7ca3afd28a113e02dc050a076beeccf5b5afa8c590a8f5c4c5ed96ecb5326a0dd88c1baffd56e8dbe01b530b1be2ce47db69b3acc3b83dc2a1a4086fda21c53f97dbe102e1c0730ef109f8030bbeae905ba62f856e54ca012ca10d2ea26e13b1e3ab1189df409ff89046f2000228341b5c8abe8e5a2847f30b50495690f303bfce2e2f211e7cefd20bff99f6ed02086baca18d8ae5e6ff25e3ece6694bc436f040ecc13486919643e2ff5caff0cc02110480dd169e3dbe971ccf998645ec0b6aba2c4f65678c06e7dcb64de834ca1e02097390df3465dee7b28e820f7fba67ce0d070cf7b13f21b17e805f838a8329f3aba6afe939e95a78e3980d4d777507257f2e08d5bbcb074dbb2d55a50d96d9e5cd10ebb3f94747f1b1e5b087021dbcafe6d7e0e17f7e6d040ac0bbe157e530af1ae43c4ceef52ca1a6849f817ecad92d90fbbaec96db27e1f8005456acc006e74800b730780d859e2e4273ca0e3ed5a8616bb4266c260fedff7d316d3a4a104e47aaf652832cf73170e98392204df52b8bf872e0aed616106ee2ca384b024bebbc0b25d60ed0e825f7e7047b7c55fa818040034e063ff3d75e9981f1fc212444c4e840814f165ff04b72d2c0bb75ffcdfb3cd7bbbbf0f6b46553d068f54f732e500f158460be12a5c33de00ee7608f022c68a63296c532746707431067e8cc3cef3fe6165f210691da0d5a85a037e87498080a67fa821b7d06d5751843122791f8a62144ae20d1fd9d85a3b3e7ff10a130326f7d9ad63a6e919b04f304b221b1e9232b9986963a9234885db5ce7ea71673e895bd2190f87514fd09278ea7e7ff7029744a49e780da0af1dc82f04c5b98efef069cc81dd51fe4d300c32acbefe3226cf2af04b7df35b9c7ae49531aca9ef713cbad290f9aca9fd86475c6a5a68791db82d05452c7c84cb6b7a72a693ef455b4ff8d7ce5a93b4f0576c7d178ec233f918e233f5b68fb94c6d504a8094e9c097eab96caac6e42a730cf1abe9ad3b3162934a7d28735e43ca62f616edf11e627be3487174a82f802ae025a82bbd2d8c62a95c2f0f9e7fd5abdde230787f60cb0f593cd3e3f801650e6ac476a64c18f47fbc3b9bca6e7ba4dac24f6aa224fcba9022be23b27cb9a886bfca58e35919205cadbc3784d7516149b6a4d75969800274a41673b6ec48f6f4924f3c693639068c289733dde647b348f27bf44fb70b571d899c9c4828b0bb33889f6f353b51a10bca7f3a512636e8a3e652517bfa84ae31152a540ca333ad25b89187f168b274a08177c29d122c7c70a7c7cd20ee1d259c49d34b4defd85260ff165bf6f6d7911af18ca64759aa9512ec0cc043f8b7369ecd36468ab23601e9b443b5d5cb41ff46b6a0d6c929c75332be2f32f01fdf31fa74f963306f61ca3f4800ddd79b408b3a9d2397406640208a06ecec1969e09835a3b339bfc85dd732be3e2f9861cf816116f6c1378df9f5d58bf53d4cd0f46864e17de375d6711bafe993a60c64d990566963d7a287f6f8ee67daf785b7cc1df0fecf075d64a3733f4d378b47886f4ab61c181cc651062d863273fa1480096d0a09d35cdf347b4ead9fba413fe82c3ee46d8e43f68dc2305058857ec417087a414c27b1d8739875c51b2390b8e199f875026115c2cb8d49bc30d247d5972e1c0370ab38bedfd25882ee7a73cb8ee450a02d121f73072549222454f4a744ad7b3139494c3f3faf90d9d48a126081f0d903e84dc893eccf62126be3b50132f2e80230580ff8e39c38ac23f8a5c2370907dfe007672abad632d8e05d233280c04a6e6ddc00e3c30acf69dc0fa8df368a5116641451377a0f83ad5cdaaebc55856b4c1b96e09556f45e8bce5f5a9fe47690c447630e464c7314c0f06b0041150c40623cc11cff100780452482260c81562785c49c3b7a2c483dd0160ba36e992bdf46b5bef600da8465b94a0d639acf5a6a64cab589fafd46fef1da2fde1dd167af0bebd7eb528c242add59e5aae157bb2f84f19cae30b7b4c336020e0de38eab5150cb7693205000000000000000000000000612767bd01b73c8c81db68b0f6e9890350e24c7f75d0c86081d8c54e2215c84bd12a6db137d84b0d111469587a75818a2f857ca79d34f92e10c2f756f7d6abab01a73231e9e36dbd1229388d74830b2004e12372b5894cebe9b9b54267b0cd0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002655614aaeef9faf7c670b43707b78ddbaf90cdbdfa921f157a9745985b5d2f6b5d024913524861a9e7b3128adafa4cc74c8b4cfaef94ff9167f451a35388d201f0c6fb495cf0e21ec24b4218d0a37a499ae94785cffa0728ceba34b15edc2aa0d44eb596c895896fa6364a4b321461d39f9337cf7a25d6bfd01d7611e716aa030b0bc1116bc8d3c1e2c38a8b566a272c2fb3adf69d14a9a12c91022489a648270224d25e055e130bb1b6c7a4946ec52bc7ae21af29c7b94ebe2017d972abac07ed0a01343b20af58b015d975a829dc6b95b7d36043a73345660708c3048ce84715e104288b4e1432fe8a0a69ad4ecbdc529150d8f84f9b6e838a481df60ed1dc2b9e0211a04cce0742297c59cefdc9a4397a8c400c7bc9c428018e3b5d40eab3d8e0b50320852d91a29a82fb74176193342c42e11b5f8ac937c80a64a5dbf2fae4432557022d03962d593724d5a3ccce1e43b8f7120c1f5690200ff57a7884ef54d0288753031175b15c60aca512a9cf3a287a82b7c2d313a99b3ed3770b9e44f52b36b1af7a03027aa809ca23e9b75db1d623fc28802616666d75af4f6afba82b833fafda437ecffdb6f7554fc36b481480450ce40bcdc0b016be8989a7412d98af42edb1e53a9110925fc073779cfa06c6afe800607a318025dfa94019f742ce2f36f5caa1f486949e2bc406adb7706a4d5f8a0ee3f004e9b1a938fde6cf60a6f30c5fb0b0f680bd21a109e0c09d4c5f4e1ac243b15d0d8c09d8e52a87fae17031c1b88b22e756b3df196fb723663e41c4209a2491a30149285edb00e0fd4acdf2d749331fac4f84eae9decff4b297705376089ae3e32b18a689dfaab4379a6b4b5491266eda496d0721291e8718212236c6adacbb020da320b549c6a8a176cef6108bbd1548daabfe24bcc13e293057b82b30f933c29cd7d53a0f56f3eb0c2509cad4f2c39f24edf3abba022364c2fc7641c0655274f9f42b56549c77869addfd10a253648ceed075f31696784c8ef0d7c4757fcd72f32fab9432e0f50679ef6d2a4c8232e8b01d5609ca4bfb810c0830a4712d4ffca3385a4c54c089f150cbdd5c0612a0de4a18388d4688782ded055daffc71c0254d3c5b9125712eafb71c7201615aaaf8a782e47dfcd1845ed33ba15e202158ebc6c9b6e98c42e5cf7fca5b2523c3d80440c0ad4e74db93554c5cccedebac16ce9cfafed9ffc9adc7e093633c5ec67d06be68fa01619efb01123bfb589230f7dccc4caa1bf9af22018c0480a17f6c73f153d5f461cb33cc3a5d83a9df4098f7b6ff854ecce6a4c2418e29167bd5f145e1c586077941e33407e1a2916ef266904ff833a29d900d45165049782c53ce4c40dbf21e8596b064b5ae2270d29026575dd9c3838d7657dd1905018350e3a916d1b5f6cd7f7fe90204dfcc315d64fb23c72f767148e4a9380d6e6d7b2be6e6655b68b5e3e0eaebe23be65eb3d1f46c9a4d48faa36d890dba5d0c6d1936fbffdfdb9ec56700392fa790cce97009aa39cdd62272fdde260dc655448cd70c31d34585648289adfe75b28b7ee967963b787b9d35d1833333682c9c35c78eff7f042c2b6e6a8b99a52e9e7369e6c9f2b5caa5b500fa2f7f90f14428bf39010f8a0daf077ff4e8c63c9bec91934be63a883cf6545b09256c00cc97d12db2bc65868dc727c2965ed345cc8242258e9d4c077a87efe55045f36166d2d05ab38951b79119d9696f929f61b0a2162e2abfb96d8ddd452d42cf2b17994ac4a2466738e9a09a7201b532149be3dfb1828ab0ffa0742bcc8ae42a59a0b5a3871f010b3e59cc30abff9d5549e6b0730dbbea9f6209b1a40b91386d07514934ece7a070ad4565c9ae9203d7310696b8416aa0faa9d375a10e637c24cc1f618990f1de8605ef80feddcde9519341c8f9e96593de4d83750ccb8a9b99b0854097d0818ff32db8d010b646739884cd1f3d08b38081ca836331f90f1c64cb784da896f1536efb008f7858dc716d3d2d323fc96579410dfa331607d1a52c22b74e0dd86213511e57b348ff730d6aad51d9b62c048d8ceceb713d06917fd7759b8815152ee6fb0e08e7085201bec1bd5ce3869f2744fa9ed6c5fd7ac4ca02ba5b250e51e7952da85b89b16520e0809d9b6d9f60a662db5da20a82f66b8b6fb8d04805c7e7c6d6b678678584b4f4a99994c2c74a4569dbb226e9794814af6d193bd994ebd0ff20f7f9e319c1b8031baa8cc31cf16eb225e51b9dc002e4cab46e1d4a8a4b041ef904b2d8fe4d2435f1bc81e25fae6d2ce6e2a4d9320537e5230011e8c589d454a74cd3b6b6cf3cc974a306b3c87b820886e89bb825124e0fbb30839e47cbc6bbff5fdb89eb49e9544d786bb7c106c99a39571fb862ed91764dfcaa8e4c9f34cf0edbaa490ca2a692d61cff2dbbf6fefa82aff929bcb3c10e", "656a5352", 0, 76459793, 0, "3b514fcbbbf90b5608d06a36d94e7f64e2113dd7514b0cbbba1c63b73ab485df"], - ["030000807082c403020ec07a6f4c8b84a4838666b81ad944560ee49cbf9609a93b79f95baab5f57ebc01000000056500635252ffffffff0b5dcfbab15867ea7bc471ce20ed6f552af0d63a51e977cbc40549c6ce8abde1020000000765006565656353ffffffff0209ce3b020000000009655363526a5263526a8ebe8f030000000001639a66d7420000000000", "655363525200535251", 0, 1164859344, 1537743641, "a9724340952b8a23f90d45ecefa89b4cfa9d91b88308a23374e203711d996850"], - ["5f92ac7e017829c7f975e50ef88b42d765b384e3569286a4239825c580baf1a103bc976ece00000000086552ac6300535365ffffffff01b17dad0400000000016ab4a106f2030000000000000000bfd5bf0400000000531fe4add60629d9dce43d89613b7be4bfcfbce337fe0da13de4549a6658a8436ee391d4fff25288a9830cff8a7acb189c0f10e65501cfeeb9736301e5eb28c267adbcfb1f7428f1e342c71932383b107eb147671d18a34d1a1fd20257b5010b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aad680bdc2ea686d3d21bdb8680b3df9650889aee716e624cbe5b3753dd4902b921440f42011e0fd673f11c5c9541358ac328fcb87084873b6257d0aebe93a3d577fe0735d45cee0b2b625c5994171f89c4b65b417094126d52a2772a394ec8788ec2d4f7c7f0e4dabb0b661b4d021ed34d7b1c790a4070d878eee98aebf29fc0227e7a5cb197ff829c0f5da35f1b32137eb40583fef8839804566eb61dbd22d94031385b3fe24c797b6549dfbf3d9b9c1ceac9c34103f7b9e6ad0b7fbb64f2acf140b03d7734441e76b690809c00cf8eac861c128f1a3d9d8d78bf35952b4498b2b2fc15bc5860c2b3fb50d6161fc7cc63418f3e1865e9798d835c9b8cc19fa8791220305eba55905445e4c4e000e27cbeb73afc5efa7516fb712b70978ee21b5997de1022d1a79aa34ed5b256890e6e558a2573d096e0a6a79f94261394d655906fa40da021ac46c8e9b34847a49096f6d43de65170bcde46e63da6233f0bc26aa8c29d17e032ba2bc2f3d3d17f91f3a26f72a1b837f9deabf620636437cac240bd6fdee8c620323b87877417f6a469c294dcc2bd64ce136400369c4d0c18027016d3cc8042743eae4b757798424650223475474a50054d66f509cb98f7a6d265ba25ef73ffae5f81da10acd08df7747c4724c6bd0226b81ab09f8f4aaadd1ff0473c636e683bfc1e559ab0210ea0261bc61b6430a0d9c4749c9e47fa315898403171df8ec2cb88d4edb7de5b09c8ba8e1679af61085900ccc63e4d106746d2c289d05027ae456bcb4d60f0d6d3679596d950ade4d4fc7b2805bd918709a0ced17287f3e715a8ebe1e4f75a3dd40c6284979b86f17df824c2b970a62b534141181f81ef1c2610dd03627c18e87ce12b9ace7577fdf433b65035f4b4150069a78232e10ea10168e75929fb25ee8685e0092bce245e61a0ef96d70b0326f3cd14d2daf07a1c6f800babb158d7c32e8a82a781466f483e5d2b72b68638c75f33f67a235aed9523dbb935e430da70a78973857a478553d5c786e45fdbd102b22e5efa31455e47f86aab3e24ae1e9528b254d686b824a8f58a5a10a73b4716e38f34d412fd29cf70e693893bac344f8c2618fe828cdb7576be9bd38379328156fe395e98c89280d7a5b636a775d5e82e3e589e620cf8a38e803a49adbaac1e627eac9c2487c363637f714be236cbe2e844d6dd5780780f51d39c2062a3b63738eeac61d2cb499607a0c86c83b2dd9861d4f59e2d65318984b1cd25982b1172628fafd897dea825f026adb359a80ba42a4e2253a25ceaa309017719d14dfa06771d706992e7b0d1c0ace22cbc4d1ace37770f7602ab2baf8ac8ef2d5f5e4d460de907f090df24a318765534efce334c8e006dbace80f22fc63989916ec77006d64083da81c02a3b6bfd3fb1521017894e6f99e6afceddbdd1532ba4ce1549bac3e6a786f7091bf52facacf487f7f1e52c5d4381cd19bc0d0e0c07d056e3619050d9641fec77c6ae6e09d093b7b62c86e3238c3ceaf09071316c5fc9c8b17bd550fe24bae5b60a958e27ed29a6afe653a85e85687aa54c84c76bfe9c9b8ad014b08fc8f4b6c33f493b5c220aaa94f8a9e510a3b615dce4fa8bef338a234b3b42d2d85e9d5509d370497c231fecf3f5375ef3133eb56a804a987f0157a0171d1c4cc78f0b164fdb3581cdbe66a07521ee36b4b721e1fccd1d5d78f114ce7ea6757331e5f6c39f4ca0a83d00b3cb5b77f88fc7dc13805777bf100c161933b123c7ce23713547671ad87f69336396a1dad81bcb23ca4b1c814c9032ce0918620b286f5ca38c565bb4b958b04849731c1e72faf443273c5120a55e6ddfa7f4d393115fc1f8358d5341235994517c0fbb9e8342fcc70858517997107fa3fc61395acd2c3c8ab0a867782643561fc2af6b5c3e7c3a0ce44ca2b932883124360badd0a28abafa07fe0cbf83a02e75e9cf554e73a9ae9e01c1510c2dc09a52c9f6e7689881713431468fa94f2140b3809e13d2d3622e4bafeb15aefd7131912b410221ef8bc9138edcef4a7c018503eed644851db982822b96a658b35e21da24393c216def3f0f052a6b8379b459710ef244ac3a46609daf2cc6f645a9a4c5f483ea681a7fc771c549c965f67b8c6f49869753b4f84e61c561dd422c4fde7f2b063f40b9e222a34a01f8731fcd038b0e32ee8ee2f85080b5976a4c4d855fd8b0492742f01435fa6fc9f5586e2f9eb20af449fc63a72c0ad52f053bf6026e0cd3b12e38702deec75faa62d185c1bfa205b0a31f06f546b441de0358f01920252a400000000000000006eb59402000000008357ddd3dc3c43d4a7b4c702a2e55dcb36c32bb666a671678ad1a717ed6c16d1fcc29ee347f92e22ce67862df7dd58945631f593e68e3106b7547831b925c7fc9246157f2be782ac4b2794c2949e83c05f6d90c4faf678e99cde60ab5b3533db0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034eacf9da7ab10913ce571d68456908f86988b6c4b7b9fe7aa369d32e8c79d06b5abe1eff05f0f11d90a97950e8f02fda98c954220de551baae200859497662fb3bddeaab5fd9a54ac47db965bd42cc32e58013630bf4b7c7f6fa0038fceea8bc05f330246afaaf21005b67cf656b939ef8e9d5eb8ca91024ec8f41a4fad12d1031136b23e427eb3d64841fb7680386ec0c27c45b3b6de1c3155f6c5f600d070d5020f91558985b9cd5327ec9aefcb32acee40b80ca08833c2f4ae86cb4e823727d00b081a823112cdfbc51b379ee9e55fd7b306f2a49a865977dd61b9908bbb80eea93f4c4bcf3802e3ffb1c79f90995f6d51fb3d32f9f23264ef6e7c3b1b2992ac79020ea90467576073d6a07ca382eb885c16d91d50fe03d850b18bbe4072784ff195020f51f3869fb8ae283940bea472e1b242686900d57f551ceaaa9810b0835157c403012b101e5d923f141b7e9584df47c370346b0c4724cdb4f26217bb41a9aae9c4023052a621cb6d403a7cef41c7d5fb11c3b1d16c80a072d14efa11128351184a0f021640976ec2ae4d2994dcd2bea7ad88e7bbb900b4240b8356c5a9ac82e16cccc07a8f7f2af4dd1a6e9d3c4778c29f85a5cf44ba36f189165e39f721ab6ab70fad5b65b1fe4a25b4ab0df599dd978372d47c7886bf937cc38b9f37e0e243918db53ad28e0e2efcdeceec7ab6d9e700fd21fb181fd687127034833aad95bd91ac56f9fc19edbdab6a052a3f06561d93ddf83cdfe8779e5811cd82ec4cc260d5a61cc788cd6d369650838f7dc472a7027d52174be0d8916f0231d7d19ea7293d3e1a90af191e07872551a0e3eb5bd5273f599dec2b4a81184be235ae80777f1c463ac7e4f0f79149c951f62713e7dfa3080ade294f8d386f390ea43f14ba8d612808a92a3044a686d6460082521ba270e6653d39b76dabdffa949afcbf58065e6a70cb7db6a1339811d8680f8117220bda4127ac54f941cabf67ab7b60a2a1eb11d9024bd7a8d7f1ecdfdca7e13e7ecbcb60f6ee3e2c04121526b10efcb990f4f60068811004008b35a6afb11b73e9cb85dfbbedd06b88647fd8ff97aa8d29adea0dd28f2c5cfb426ac647356a8de0e5ca000906ecc6aeae56e02d1a048d3cf34e44a62c030b6ec8b35bd9827e1964f6bb105f51ae840aed52d25271d6a2633b7ea4974d28ac1626e09b5cbf6af830e4380bd51c111c9f7bc027786f6b3204f17f37f0c69b27157200b2bb1be4bcc98028fb5ef9ce72ed7d42bad47047413dab4986b59e959817c304de2d76ce8dc5edbc70f782219c082a142dac3b7942b21b01bfbaa7faef95bde10de4c9228581e633ea647594baba1c1ab9ebf9d239b327b6036e135aa76d6187e677d422bb68806668d4c9c03be2cad9938327e31af90c41daef6e92248464c86a715597dff2db30d1e19210176c3fb99b0ea9cf569cde3a9d7d09f4ec27f392b29d5798ae0054e86a655d23b1baa8b6943f2f09f3708addc6efe167fb3eb8a8e2607c015de81fe8ebd35bdfec4822d79d0a7deebb9f5c1596bc5415a2172b4f590c093c95ddfb3b0542f75cb07d159a3a42e734494c111fec72e580fa65b64e8958bd18ef0f00b4ee415f38c4d27ab0b757734cfcb1c503d5b9d06b3bc75e71d4f6ea2bb2a74781ad26ca24da38e240a16ba538350ed1486e234d50556f6b2d38c00d812cb6d8cf0c3b7b969659ac4f7447fc6b281733f3a0df46518c725fe033c2d683cf8ba9471b033e90f6f6f3e3efb7700f4c8aa3559ccf05edfb3f4efd5ac2257b58a01a48fc3c991b738a3efce8d98a608edaf65fd359c9837a032992838b8fb6415e14bc70603b76c78812dd9f4bb9851ba6d42afa5712ff7df68834104918a07e6f3fea3f98b7053a1fd959f158be29e31fd4c38559a9a694eb0cdfdc29a4bc560db1bb468ee256682e3b0a72b5e1fb6fb392b5e8a35e26784f96a90ce269ae5cab635fb6b44cf8c90910651a633d58fe0d00b6a7a57a140daf2cd8b82df26e4586d059e5503a2c4b094b87dff88d8b1966778a3c66173a6fab6c9e543fcb39249afc3bfd7a8af32dfdd335464445cd615ae2412d815f572ac00f0d9730aee052e8dd16d369e550be4d2b049e30268d4ffc6a45bde544fe5359b9db635811f04b3df07dbd7f5ba0934521a9a36160e2fa3ccb89ab0149f047d1c1487b8f04a4dc194ce87d1ca07408d92615980803acc4be75ab9bd06ca820d98546c58fd32edfb08404b379029f93610d83bd79b9517031cf28006b172ec47eb76c4dd3733a435d4852853ca654e4ae01000000000000000000000000635febe050d8aa2e510073f1752ee7d807b5a323a6d08a0fe7e642956f4a50d00a6f688efdc692ecd7027dddf4d3d12e09ec01fda6b23584ee53ad3d25c94f0e63bda0d91de3fcac85976f87485a16ddd225d7581542c28f7e4cf30e82026997000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004729c32a0a408243f52a065b58bd59db3c51dd7b656eb11681b7f6ca56d523bfbad6dfe03be146c4d9b3f47bcc73cb6026904b2f5ff45e56cd23ecee9be01e47eceeab6b226470353773d2974f6b7c8759479ee6cdad68a67c3fb02b71698ef420f1f4368de2b4a244ac97768497e7317aa8048503810b6b07afc0c8b4b7b68702065e13a6b9ad9ccdb4597451047ba7ff835e57ab2589309bc7913b9451f234b202247fcca82d44158b94cb169ce24bddf3e8b2e468c4b6f18636d808af82c995680a008a79a0188dbf4fc0dea86db4f320e0236d1f850af9ee11e0994bf9ad7459621b075bfdb00925400d4d4803f13a0a83aeae9a34c0a9d41f25402aeac497887b031ca442af3500282b4d752f25e7663616fbe7296bf374c1f719ed0143c5d3cab80319cd9524b321821ed1d6bc3131f43809d9cb796cee111d42ddaf63f6f9287345030c5487ecd8d765649a74f59540140fea30a63bfc2b8ab3763c73755d6f8f2e36031f60b279eb9fb24ae379e2cd0263506362c5ba7155775e869afb5c5bdb4f79cc0326ede959d0253ffa86f62f6cd8a4d28f0b63042bd109d9b8b40383acf38fc21f5f434cffbf17a247d4960c43d25c905c47eb7a493c555e9b80b686877e93894ebebcea3a94b13c863bbc1bf76df6ed28c63a19fd9ebad8ead72bf5e9ee65cf48679525b3833b37c7bb9c26fe8f43e1810a3768f5d53f8a57386fa716cd55a34e18f08c1f793d3daebc9ac67b917cb8622a90b00a987763f1aa546a5d3b7bb6e734e0b0b4899144d78238392851e7f6db0ced96c40b188808162bde3772da2a51f1de9d3c3296c69339c2778ce4d8cadffc781af53a0fa6dada0d295403c964c5f2772b39ea458917121727884b570e4721badb228c6b0ea702f83f1b072b5a227990d99695088dc111bab2f7c9da221591256d7a685e2402e5e3a691c0b784d72bfa24a09b67e20c6c896ada79c38132eb0b87571211aaf0d67a75ed56733c5d299f044b04667b993349a02969f56c47480c9e7994290ffe1eb883e910db536af435464147215b23d2da52a9f71170dd5a09e7be702fbd5a068f2c2587e543fa1de1fd713b6029304decf92576e22c2c2db0806d96892bbfd28fb24c64a9ecc6449ce90e9ef94ce5958445951774cd3bd9474a593b9d5a3b39d25cac160e19c7d23d2015ad5337ea5e264862d3c96c5b2c39fdb78799ab1c95776fc266a51916cb0043f6216fe1f11600fef5141c60e8084e9425ec51e6f95ac4bc2eb9a8415d929aee1da9df20377c570688a1c2faffad6060b491e85cf5421a32a73bce79a229ba86a52fcbb2bb6dc1e3f283c87ecbeba6638892f9c7f6e7ddd0f186dce9601ebbbedef1ddcd853fe967a8fab84a1b7e59fc04eb7a315415d13f5f0b4d18c0ea524c6d2737b7c9ca84817635d6054b06e994579c881d992f829c444b64fe39a3736492914c6b0ba4520fd8feaf65f6d10cc37cb43e3f93097252f08b9a62f6da84ff39f634d649b509715831779a60cc4fd4d201cb090f0b613e7dede44877ecd9bf41014d657157a73ea5fa46d60d50ef3747a143b86a2eaaf77429aadc8bb2e01ce2e59e464d46bb2f9e7481ae1cb2f41c0b56aaa22ccc0c339ba183c4fc522cba4513ac1bbb2506531287f5b32edeb345c7bca3cdb54c5e9b5b6a73e0f7e9ea475b91ce0b2a8813b0019fc431085488cf4f2955a1423f11c69871cd5a04f7281f65535c99b30534587a799d568b1eabeac4bdb42dfbe63c4bf52ca6d3500177f4060c32a4f46e3fa9b2ac55d2fae8a1659ca387801aeeb20e6044a297a2999bdc21b47a0a7accfa55a48e8acf8a95acca44175e66206af9c6e83f1bc457c7e2b202c31ff1737b6496092f12f8cac16f215799515303b047b972027d3efc965d64428a61abcbf8badf2d1eaaf0e0058056adf772724a8c5db80bc995ca2516fa4a7d8f1962305e02543ef4d0f866121d99d6b103137ee17b6ad25d6c2b2f6804378156509a6a2d1262c92b79600cc4c90d722e72de2cb530bd419e993a742c47433038a0f76cc88598a59ba89c3ce3129490e569394d36725df412f23d5897ca80bddd94bc8121774e7db5e6eca139d5a4290216a1f6f384b7d977bcfb1a96b48a5beca728835864036605cea11ac8792a3cd8ea5782e4c33cd5074b2c0878785c904ec069033b507c947e7683814f4592ca5dd05cd31739c09c8bde35634e125a2fe138b6e71fca5d3454fceb9aca3beb39c66878c1fd91d06f94dd474a3cb42792b3cc4a3fdc111a00d0084862fb2daefc754d3b98d179e02325d945993b01685d4f09f99528a85a9348b6c7695f47238f69d6b765e9382d8f5784c06c9cff99291bf79a499e73e018a48408e8c4acc9dc80fec60af2154ae635d1f87df6e3188a0692a05c484093d5b986c447c101", "6a6a526a6a53636a", 0, 616347975, 1537743641, "f8db20a11c8171400eae13204778074c00ca33949b79f6bc69271cf4e843c02d"], - ["0564450803238230d8cf5e0fc2c981926722991ff6300f8ef5a808703a49d3d7d3c4d01a8a0300000002ac53ef4fb6b79368c5aea0139c37652b71ba9645fbf95e8e45075b5bc8aef24a637a7fe25212030000000451ac5153ffffffff9e434ef0af2333caaaf9937823e9c91d2af9d0eaeb76c506018768be7009d3b303000000026353ffffffff03aadf4c010000000000db48390200000000065163516a5353373317000000000000000000000200000000000000008104e00000000000a1c63a23e7ef595e594037f3ef2b66ac1d27e46b579f116134591097e2ab9eb561d968fdfc7d8e923f3f44310afebc9ce011549eebe98994bd9a25cde7a967e53a36b5a74a984122859784fe55b16e0e83b00c23a61442311f101ee38790f25e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005702ffbb8efc9951cf2bead95442f84975405b9de21150de2a042bd0dd5ce8bb7f1105e4a00435d153b54793e224e83297f734a2d0d207121d3b12daddcc580ac3975c330e628e7f087b1012d7a91183c8150f46cb382e170467ac2effa0c7fba51109172ee378ba31e17d7ccac46f9a31b40c3166202553ecb7cd3b581a70a50315f88022157cd444ecb0533b0e1a9332ca0e27e5f1bc2c5eb146edd723015dc6031c14fe1e109c620d92d5d65ce2fb6134fadb506608fd608463bfd7947de53bf40b03f0ead750e265edcb0faa057702774e9d222c987ad5790fc88c14ec3845f1f296c8a13e338bdae779f913907d4f95f30200b54bde78ac63d673237437a0287a021b275bebfa0c65e0ce9e19559782dc91d11eec0b119012882a985a6a04267bd4020cef9785cc54328bba7e3080f5150e46d6b53023e0525bcce364455545da6c08021624405a5d2c7a69634ceaa27c6815bc53190bc9ddbb5a171bfb335d19e9082e0210094a38adb3e929ac0bfe35acdf569373036559020e5428fd1219b581c58502032d97dd50f46f848729e210cbc91fe4d9e66c2299d8bcd25df0ef5bb69fdd27c763d6525edac4b2cba9e7f38c74dcc4f4e94089029885b82b667bdfcb4ef211885b2ebe2cc98209318e6fce8dbe2f27f6e105ea547c5d115d25cf56c683ba8872f26f2973fac8a8297ec2cde67c0726035cf825da1cea3049afee0b3e599cb7f9498b05258dff9a9c6b230261bfda8810d536531d70065078e442b0b3794f397236607558bde2b7a34cd5402a251d0432d5ce2ea28a3dc4a7e0fbe2a4365b0c5ec75f64f7d1da424ab0ad2016d7ea4403ee40109e0820d60469551287ed3d8e0f1cd689a822ffae25e41ad2b71c3ac35471f65804a4feb9c19f2d865522535a7f63d2a84ef908d86c519b4d56189928cadf71c4e1c02d465360fa77671be8e2abd4f597d5b654fa7517a630fdc62e4609fcd3dff810ed5611d681dc481ae61f6672dca27a5cf3fb5a31b77f7a87df0446356bf0274270225830e3a26fe9b667a061e1965f1dfff7149355089c840cf01a67bd3325e883f4a41088955fa96ac132d06cf883bb970ad1e86904adea7ee2b88b7ebfaf7edd5c16b3583f0e94f05cfa01cfe85928db98417ea35c8f9babee10924aa5930b3b7bcf63f1b70ec646a10360af06fffa61b7265126acd8daafabec9274f95aead1949e97ac2cb93f79d79c1a2e8ace4039e8149278c80b9977fc69724ff9285e00c5f8cf99cee829fb872ad775dbd83e7986b4016fed71ad272b1c04dba40d85860022983d53ccbf57545bc24aa961b3d99291bf9e4e5efed72443cfa2d7ac90e79b74f81e6eb78bec0d73c38038dc9569651025af82752aa0b21c89288266a5d6b2d1d24c312ed10bd78359c97c66092feacc2a77e157f3f3dc5ba5fb00421d8974a42ee50faaa478edce824bd24336937229340418d3d5bc7d80164d007cdf6f5e77020b9b082b7e09ea9bba2aeef18a87dca226e393b841d8c6fe6c4572aa11722cd2849d377fbadaff6c3d9ab1ed0c4eb5eca9fcbd6ae586719a32db6b7b5d8892fa74312e143c735837db3ab01f840c75f97cb7ecfb63c6da7f2936094f6bac9bf6517882dc13295920a92cc5331fd9748a342d722ff0316ce3d0ee1001b2552b48c2c95d25186508ad98371577b6535a33e00657f6f981522ff119e0e7067ed576466a1a68b1f9c0c92bbc05c89422272e9d72c69d0d2846af787e1e6db763945829cef8ecf911348a01b637ef7c36ef2988c1c527c178ddfc814684e2fa47b142662237e7e97f987deba05e2b4a80c11f85255157d1a15bd8c2beb01c9f25e2edcd6a8d0ff3148344d2f56b93c10923930302f845b973bf63c6f5e41fba8ecea27054b39b09cb1842ac1a9c1cad0f5d8d0ec3ce45ed74d0ede67852ed34e5a11c3d4673f0efdd41e742741160443f0e1c289fa185a5e516ff8bb49b1807853b4b0fb2d9eae95d0157bc0ee201e416c9cf978bda80741ef1d94d9e624e3a42871a02e9880bb792988891fcf43359e4b27502a43abed26301a3feb17de2a5ab749f8f186035e87890527d6b8da0b6920e9adf9bc8ca354f9368012cd840ee53f7a67c0d0b840d7f5241d096fba6c1fea307c796e0c6b5f41bbabb82ab2c94dbf91b8e322d6226aa85c884e0ebb17024cfe63483e44d8aee953690264f824d495202e6e3da1492bc319034823d3a9e1d9afe2645ce6f98393c2f47e6c63e3dd676898b5d6e213aee9c6d1c6988c54d29e9e5f658b0d74b459928c00000000000000000c72800050000000074f5ef68ad8e907a6732f6235753d56e12083647b4db837fc3603ea798ca08163a3e8975abf04dbe226e6bdc8da466dbfbf494199693cdd75ff5e1a20ce94fee3375442b8c303d79c5418a6878cfd9b868afaebee1cfc02fe4d748bdedeec03d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034988ba451dd9e026ef0fd8fae298f96f945dab782e721870087fd64e933be8618af9561b93c5a27e12e9d222b9e044b059d6a6eb9a2b619724c869e362ecd69f3491a38a426cc3fc20be8f7f62ff0fc497790fabc3fab9332af7800faa2308e3ad9b13e40979151a4197834644b25bd9e50c93416e7744dc2f38539e1664bd0030f29000eac9da9754ca0fbe2feb74dec0f50425419532eeb074b0ef56e151d2203248c0fc89bacafaccb28f46dea8d80ef8a1d59e3d0cd5c98ec183b1181f513ff0b064d942abb9c8157b59c606f6ebefe96775668cbfc2c473acb346fb0662c8a69750569f9354d8278ba3c01b307f20a8ee5c7854b89aa708c8c730db85dd2bd1a021bcf7525b015ab30f597caf7408dd255c267c357e51b19c1fa6b60e1145efd600307e5d60a9677b3b0481d60cd57b119d7b5e9811a9ae97ea3a73d0d66fc20c916020386558abadb6bdcf05a763c93c2e4efc5791e845e7711d712921c95265f006b0320a66f89fb699886279483a655b6720a492181f5f0b0fb71a948f1bfa82cc15a021e89ba7975061e256aedf73a90dd8da9c5eb5eaf8dfbc6192c1fb33d61517a25713306a13e96b26858b938c6fb57b79f93ed36a6c322889d335c61377c5f287044dc8f0a98a2e552de88ef880a2b2dd0baf85a1450c3f9f7c3e5ac3354e24715e67ed9bed087d54706a6669b49c4735db8c88ecc8a5f776c42a8ce5affdb4966393d54bc783850f03597e8945009443c5f23a3c8db88af2807fa692dc4fc02e825f483e4d941f74383fe8d76406c47909447d3de28d8b393c3d8ec276e365d54949d5013d66723f826c9545428d9bfb0ee2f5aea3eb388baf5d48db9c8026c08fe33f44b15943bfb0120b2c78f9f382a4f7a269cfbd2c2fafb4560b6a951b897f67ee13177a0acb42dd5b141470bf3fdf90d095824f9d1c3dfbd3d4f33cf93cef785b272a72c0b287d066dcea8a68da0654e03fed286da304d9aab728cca34aa02e16420917340c3def2b52e8d797f2e54fae88acb26bbd6bc75c83f196e9689d88e06f7d914b3b21036f806c96780b8fcae391903e6238a92925bc6e5669434333c6af5c0d119f42fbefa60c0822b5f2970864d743eb706d83c9e31c622904425920446678a3b0c3f1f85d2c1d4dab11bae541105a6d63195b59077eaac1b9167a655744b8cf7475de9898e9b067eb26882179849ea90e671ba8ee8a502ac606bf3f14fcf3395712364815f2b38b154685ad1c7dcca02bffe2335ba5500f4197749c125023eb4ead306749ecc9d537ff67b25782b1efceb0329eaa651b46debf3b94a952e7acb6203b6ddf341aeb7a6e49c635fa90b1fbcaac75e1e35306f14153664511cf3d7b2038e05b4ca9ef29f53c42145771712355cd16f0b688151395b981dac771f8039fab6531368d2de7dee8892f9843188178f800bbe4c2274d7217ef2cd58b67ec993cb0c939b886ab9c84abfa7923f70069de68675c1b8811942cacbb8f41f1ea4c35240305b7d0329f46ac3f188568fe07227dfed47c93dc02e1c249a219e058b746837a7abb2027198863e2490c45f2e7251c27a35bef37589d6b72654ec6e40701225d8c80c722e9a1887e3c54b4a3e35066b3e9600052b31e9e9eb2b5a1964b67bd87b7e9feae75447a72bb01ba5abfc126676cf057fb466d9b4093f03e8e05fee30955e24782965e57e53adfc47f698c5a315a52584f13ac76d64736f850a1c16b4b947d35ab28aef565fbe4f82eefb1cf55d220b706d19c18ffccc64508995b761bcfc8f4802dd53b6ba6fa5f41e73bd5222169bbd91fb80f027de29ec197e59cdc75c26f300bda8a26de51c68afcdf1332947a8d33fefb5f8d1361541a1405ed88323883601448cd1f6de8353c00c490d2980a229351e8eb336dfa0e4f08f68e16b923ca1d424fa6bb91c44dffa07a1baf5f958af79252355c51f5e993884079cbd9866fa73d98625bc87ee76d5468fd56bac01e82244ce52a4e1bb374e0e4616908da5327b72fa607c1c48d704787e217a9c17270c91db68c82ee584d982996d859650918e29d0e9700d15c6c314a1402a0578e83a8160aaa00b3be586a57bb44805119d81424699d79f88517553d3da08ce2b10ea02c994f3698c7f4c657c1da1bf6bd4e174d42e5f031b2393b7878680e50e4e2bdc9526f52b9567daf991a0e990fa129537bb7b5d1ddab44b62336fc3b488a85a05056389863526c8a54171c76cd6985021edab9eaabbf687f48e7572f301611e9c3485f7a808a82c75ec6467553cef58974256ea9c000d36e7d17a5e5e975cb7d7cb55f1a8f069eaf08ded0147494edbb6ef3d7a9e74c484bf16f129550585da91a443b5e698251272965f0c8208dc9bac890105e8190764767d68c7738ab786e1fa87fc0c70b4cf910f847457121befa303", "63", 2, -515139458, 0, "1d9e4bb22af4663aea334ed05dfd2b411ed7d2d7ec74dd6a93038e9a932d4c2d"], - ["dfd2511f04358f881f11dbb59d1c6f16454f8686e5422a050f83ae578f5cb250c01358c0650300000008ac63656563636a51ffffffff61348a34379cd69d8da9a525c90c81c88f196126512283abcb187b3c407c564102000000035265ac56d9b417f816c07a2ec1960267dfbe816a7f009053dc7590d318fe51038f828b8f6f477d02000000025252ffffffff97c40630ceb2f479206825d8bb295ae6d0b7f6173e07c153eb89bac382fdfd0f0000000000ffffffff023b5d9004000000000551635351637ff8e70100000000086a6a6552ac51ac6a9614d0140108580703000000000000000000000000777dd7b375a75ac1e3ff379dec437194e63bbaa7e1afa28d786ba07d179b0edd7c77f847928f12682ab03f3ae58ccfbc5fd8193af78fa924a751c8e2cc9e6c70081b4a439dbbcdcbeace8c5686b8e799a09b3b78dfa20120b10536c964a5267c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052591fd6a3a3bed1d584b49a289a0a1b42e9632b7c4ece2d54b6424bae362b3b896922b7c3f2713fb52a58581b10d501de4a2a804df65f6ecb7a28986b2f65d5424e8c8cff12b10f7b569c9fcfd89254261cabef4c06fbf6a0f2fdf9804bbedb180d388cbbfdbbea285af5652729f4af6803351e1f21aed49e85162cd81afdca032d0b074b62584e6ae35dab1df7cdad3c4ebcb7f7fbc00a59acf610ff0ec3e3ea020a12262c2324a9e1ca8427c6c12f6dfdb8ffb06b11ee82c1063396347a7f1f350b03d8fe0fb910595b560a8ce4b5efabd6accff615167a696b1697d4bdb6af12674bbd46c7c90732e3e1e9bc79877aa46804dd872e8e1f7a0fcbd2ffa84a771059031550d4a53982580598f1a6e15d6e9fa3011d377815f87390366e8dbe0249e8300226ea097a71b0d406935f0e678d255a689fa69e042e01aa80406b7f19900af3770215ff256f702451c77e35ced80b4f145b45db3365522a446a8af549a599dbf3f1021c61ba1d49a498626a3dd92ed7b7a29c2b1189b927d045b69434eeb1454f212c0324e5e900fcdbdce0d6289da841d914d18e41c838558b58ba4c4de96b2e33c634da383e32434b9a8b87a54dd479694e32df836c7071c0d4d01a92b429d733de69deeb0c87b6b61f7304b257e818fca8e60cd71764f357b3095dff359bd309feb72545632f2ddc5c0146fe45d9fb47df3068b6f83b753004eb2b8391198be042931aad5c9cb40ff1c40b53e34c432af4d0706faead2c9fd0c2fae54c81bb40ecfeca52d2b46ef3e589e7f69cbfe93d71a5dfc5cce4dea9b9b3152be49a7709fd5b9413336ed3451f81e62679445ac87f53475d212e38fda782ee18ec0bd751fa0e87f5cbe746f8af8f8d885ec6ca722f3a004617c1af3b6dd6ddfa41d2b8163fc8925dd2f18d101c2c955ecffa90b377b9930e8fb78695b8ddb9d02886a8ab91922c2b9b5e4e389b5c5da4e339888ff6f9e99a96cd894c569524575850a13b6fd2862c93cfed5dad97a27f31dc46364979d4cdaef959a16340e53805890e77b28e48e963322dc91a77f5b6470222abfb0c5393be611366e5659998bd5718612f8e51385f240b0fc91f939f34e29cac6148e6a27c8f2b0767b04c12407a1340a0cf47207e0c58c42f401a4c64bc13a30b356ec1c812312c15185c063f14045044cde4db19264dd2ec6912da430732df72aac9b8995555742f45ebec0c3ae40122bb65a10b29187f6795233b5dc579431a47631ff7b3471d289c593ddbcdae58826f1209bfd6be65f875be7f722f3b47fd6da2181e0a632426216983e79dbf1d9b8801b81c43db6c6bfc24ef636d9b2127f92cb46ab70e9b7d8720843e1117969ac9a6715cf6d2a5f987d3fa3a6937c5fc38946f39d2d36d0d76f37c7b40a12c17c24cd3025b200f080dfede975259a20021d9a7b39fde912b9bfdd2ebaa6be0f7b54501fe04892ffa55feab04d81b36d18f2efd76b39149685698da186ddab6f91273448c943cf8d463f69eb5d54335a11a70f585af74493c78e4aeb36054c215bcd5f65f0477f3ca11c07ebaa4d244053f84421757feb69139d90c059d231f49f3e5946e0fc63f90cc25faf818dde2d6226c4309527eba1705bc9929529126336b7c0137a76274fe1de339463078881d08df05bad2df4e71b86eaaca2c287a087961d20b4e5304a73f9f268b81ed3d6c31fd1df857870d91bc08fd36e82cab52b99cead2307f328ef5d2fd4ca0e36ae2f2a747bee75a5b611e82c62d3c01f786a2814c3acd86c3c5d254ae4f105d9e32445f37f9eb878b21b96fd5dc6bc96998be42bc0e5bd762bbd57955affe21411f6a5247024b7e0477d8df38a85d886006d712c6b10b8fbd832a109694886ce35fb475f5ae5534069670545a9c475c63826bd38561724daabf5346579593919f6fbacebbf759b25701ebe87cdeb6439b57f0d6ebde5628ead6bb7899cd5685f029b6bb407692eeb562f79883df8fdfa97db2601e962cce2d60d7f433d17c62ccf92a6442bb494e5d320f106bdb8374c9977799727743b04266ebbaa71868168eb6f81249170e97d8e29bcb10bed1c907ae2fc5e17714fd793d3b0796dfaa75de51c49308d332f13172d4f47a6b44277d060120d895f72fa855e6c63e5e64d5e127ea48f51092a0f644db29381c58a6919a4183173ea4a8bb5eda8682ae033cf7323f84cfd8208f3aaa02b6716881fcd7147bb77e51ead51aca6edc6b37de2c5345ac3f85d2cfdeb64a242945ce1e0d8744f07836fcccf6dc54a055d21d58d7aebbaba71ead699e232b3b4acc3f8e72a74f9f47b58535a22991bc3934c67126aaa31c0428b7e5accfddc2bf094538c3f7d4ba50e9e30241979c0d9c2405f022cf6f071d02dff667994735761709de61687ea2a047210cdd887ac0ad1487a2ebb999871100", "5100", 0, 1331992336, 0, "985bcd39a458d7942e1d4499316d104ff81a68b270156fdd5db9098f3e2e2007"], - ["e748f559023562d4e3c76c7a7d2842bfe36ceb82b304a4be4347eac6155842c543c6e2138403000000060000655253acbc69260afe331eb5c1e3f4fcb515d3089f9468fa7d28bac214f4cd06e3d6c6a212f0220d02000000076a52535153526a4974131c02631524030000000000f5a052000000000005656a535263000000000200000000000000005a28ee0300000000d19f1197ed510c3418085c79dd2241b486c122aafc1dd8e68465213c73b76758f0665e75d99bdef44218c5a95ac8acb5472ede3d22c239fa2966aead4e1294d00c0d69c869b12ebd234c0a8cb2fc5c2c6ccb63829c624008b85f2a80a73bf4ac000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b288e417ec9ae4dbca68eb1289406b95e76a9ebe2e665f20bb7bc487e82080a280420beffe818e917574cf17f062a55fa17eac548d97c0264342d134c3687b9653ad918504a9f41fad8183929e5d197d3f7b05653896ff76e5ae8e58a108e90f32abe8dbbb3ef4d5f4adc913aaf786020ba29b1633061fabfb3bdefb5e05a6d030b70317db298c426bdba3ee310749f4569e87d0c23c62f6e6ba84e8dd4c095990201b2013748b9363f2278a8c5719731aec58e8e3b57d380dd122d2e07f1acd6920b02cef3bc2fd673cb7a6a0298d0037dd01198aee18a955c246be42f0934f476799007a5340b116fb3be72df15f68055fea5d348ae1f61f27eecfea0a3b0bd83ee02280f354cc1de83e626b9c4af0e69103acb8f2f2c9ae682dc3adadb03c2b547ef0326eebae365e4f59a8471a2eb3f8e34d77a6e4e1d18ca71e3bf2af81cdbc18c240314171cff837761de54a1e2b9bb2aa869851002cb003e36d8202ffb3391089a8c030d429a48fa0b6ea33caa02f66c7fc8b1e19b8f32f64bd125afb53a869f28e6a80219cdc83f23e7fbe54e1f6453775c48c93fc5da2c91fb1cd57aca9f5595ffd246f66be7f4ae16b0820745cc4c0eee8477250fa21a958ac5d4bdb73d8801559099b0e8180c1992cd2188813fe6995b8077bd07e128771272becc7fbdc4ee7e3ef7fde230c413ce21ec79056db2e19b33c07432a1720741dccac49d88cd71766ae28370993ae5f4616d0693a49a68882896a7802ee05f14be78c9cb8ca9aaa7e0abcc5e7fe65d8769dfe1c0f2465c726a80896804435d0e22c527a151e653f59ecb9fe3199fe3a2dffb6d6b1d599c77b9871514a28c9466867908c4b2efcaaefcb9ea847063f8d2a2f85852de25b3d9df5a5588a3222b371c8434a78b6a6833da0ce27f312606f11f2f04fb0e605b0fe6eca510e8635dc9b574dbbe0c648ad019dcae47cff98be745e502fd4ed8022aeab8a5ee00d472a6d42a46168f7560a5f1d94249ea3878f6628ff346744ba1f3ba6c00aa3bc471567c5b949c6c00c920f8e4c7dd8f2888135209a5bb0f84c23b96e06a1e33983b99192841760850ca3e2cd23e5c3a7712b570d404697399f5e772705a86756a92381d5177436dee72e35cfd6ec69c9ae4352a282e1a4f797ba879c44a0125812612e1292a90fd992ec111424cb4e62e638d4496812bc827af9e92e57ad2ca61174111300051513a288bd186abdd84fc6467227a45d51e8e44c61741583f61195de065b983eeebcf1d60641698d2ad7bb869a089f76afcc3293a44513f896cb1f68e6710ce15ab19c895a8158c2c6115fe13e349bbd4ca12d3aeb056a4df6b62542cd24507efd0b895df3c7e9099db10bf8e91ee55b8451e8abb0a2833db2a30cbb0dc828616fe4981bdddd1723710d464445b13580cc0ccbc5e4c620faaa914f02c6c7091b39375e30ca2cc479eb4c90aae017b4d898b1426fca8fb001a5666f7d170ef987d3214cdee81362ba09c00b57abffb572fe37fa707357cfb216e4723f10860fdcb9119cbbd30ca575a349201ec101dd98c77a024c802e918c5dceab529942304f04040995c5bc21e04f88ba7c544aeb00137d50ad50f15168075e0e50ccb1d77a79306871cb2866a0238721c807d517131a1edc15d2e54f7024a5ef3ac6d9b06eb8969c4cb80ac1f252a6dbb103cdb76129607cbd27dec9c7870b35891f7794bfee9b36d4f581f22e8197cb72ad17cd1a4778b30f00a28a559b3474fd017775998f08ec558a971a9d8082b415cc7a7ed90f97b47cafcb68e848e8b471d3c69cb2a5c9d13ada98ad6b110a4fde3fd892cb1ecf7aed96265b1aa66e54223e8c7d189ae23029b18ecc641355fab7afdc300520308795db1577e95d3733439dbce65c44c1da6d5961d25049535dabf4a3bcf9aff6c30db9425a8cd435363ca3abcc8fc3233d5bcfdc74b89d8ee49b34108de937efc8100db6a33b90c7c9e666f4b0043fb2aa282f91ecd9711a76458974c9515b660fbd182129d39fcafced102f4658bd6e2bfa0f17b19093b151fab57064addf2f34d0a67abb3a65e4a39ad2399a363743b1dc132fe5d9e32eeeb785b6baafd549a8caa72d1e492670c99c33707bf0d884f9a95b7c8fa4224e95afa65e5833f154527fa5f2bf7c25d7f8a84375d846b320bff9852f5afe6752431f6ced1871fea756c837351e88dca221ad3f64ef2ac606f3e16f15a8b83391e829658a95d794a2ea5accba2fd59a8187313c582c13deb4eb11871f82c2bfbf9d8e30823aba2e0a4315210abef5bee7f57000000000000000000000000000e55b19583fd8e90eacbb6e025fa7577563d3e6338ed29275ef485539efe7ae9229d8e452ca5efeb4ead57888ecb7ba6b75546e622f354f40ea6ac3f438cd684f9e566ac2175467860501990089bcec8491f34bcfc09139318fc552cfa12e2b8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007204ca2d44f7a04820eb2c1776449f69f51363f2e67deed77465cd324de51bb87faf51a0d2b1d7513d647fe21f8efb941630b819b9a4d7b5835f0b9cbcaed3567dc0c587f6fb02dd8146ae450d07a60963de7aea624ec21decef401552eead93ab2e0171ce07c23c6a3b9318b6bd22bb1232e87b47c533e53e6e0dafb1efffb1031ee3567f8d7149ace46909fbcdab997f404b75c5a1d16807a203a6000a78e1220202ea7c467917e28826012c9b94b1649c30c83e314bb37cf60fdc207dffcfdc0b0a08221ff4931b369b121a429ec8b4b4fb3fb85d47af178ab4c9a15d9dc911dbffc71aecef90b7854c0a7f615eab93985ac4fa12ca33d02f2d8e509edad92adf2c030836eaee86d9806bcf00a3dc8b5337b46b5289a53a3fa735ae6a877b281b8c86020cef65519918fa83d8bf3d570935bbd83bd9cd5e25ef07c2e9a8d194e388f62502017f548a3d490af529623002fb6f6b5304ee9cbcddecde3b0d9d02f236a631d6032fee3c816e980cd2fe15f07e8c1f0b64aed33b0c51b363e6f2efc65eb1f1c6bf031f961e2bb4473ff3db568dc49cef758646df0e99d25435c2c9eb826f3dbfbfc2ce698305327f7d245d2919a8976fbe65d27b71b5d00775a152e648f0763356fd72750796479b0ef135899ce68226d3dec32a1d34a87343acba7216776db4ba26cf78cef6be76c2b085959fa05bdfe40f055a04d8b17c274e57d17f5993df1b4ba6ba6c037a355d203e3bf79a6a83063fbd6f51cb5febdba9171543606c75f5c5b408b40aeab2778db993b33f2907a000f5605df910083f2ff6566bad41e0b7764ae87f993c8f6340a43ea590c68a984776e71621a19d7719e4e83eb8e4d298fb1c6880e6f68b16bca0c9f822a580870159128e46587b1e80833b9df6694e946193ddadf5ffce53b77b639bc86b45031599169d5298c7ebea65e5dc1274b001b664278de423de7573dbb8329fee73f87e5e9854deb388a73bbe1c43e24f1795a9e9eaa33aca975c9da10e46654d5389d71d83da3e1984e8f752f46275387920858425b4baf5b86c51ce0faceccf299c5cdf3624e4edc493dc8af0d7aa3a3bb881256ef76823343b9b7708ba2346120a3fbab0c1b6cfe840e40abaff5109202a09f1becec625340bb26095d3b5ee3291db18d23be740873775ac03766ea2fb3088a43d733dfcdf409f106b1c7e3a1690f14b874c1af202d127fc032885964181e669cabda4f114d5f86d01128f3a9a0bb1bdc60e59dbd7abbd16402d8b37954feb9d9ace89d97a9d387fdefcb1f26781a55d8a864f7df0e6544d3284d10d4c5148cca911a26f9e0cc59d4427f2c851211df6aaf54c3bbbdaf974465f1590fdc3448e38e9cbaeb40a192430702b008604547785e89fed19f1f3a70523f80fe1b2c08f4b18d9471958bddbe45144a1372f9e3135d94f5ed18cdc65cfd6df9aceca4d255f864dcae163b7fbfa24401a7702e97d95bdbcce3937e04d0a5cf03a60083338eb84367b338188011bc1496679437cddeed987b5124c2220af16b93cf42e344ab7b9708770c506b2813cbba9a03db54b2121794265bdf0bc57fdedb836afc4b64f451986611f4e4016bf16452bdb2b59fa353df8d571985feb26b9047740ed59944c2447d71db71a8087a3a88ea779858eef0afb318822e095a2879c2071c1180770f0e84f4e8bdcca5531aa8854a93a35a40fc797a48f9251d9c0d81ce6b12ae6e3d8d79ece0e6fa21f9d20bf6f94906479346405e9f8ff34687f34227ec375afab27f7d3cfac46061e0dfb206a8da162407aa9306044540263c47d47f26a381ab0918670c174f48d21cb7d7036a54957ca790c60964bc8a5f3f53d6b4e04318548592ece9595afe734b3f43ddd900df532b2f0ac5ffc1351c93f2ce23d4801b006cd6a983fda690502db4733b4e9eec79f66221044724565ceaf16deab18e1f21a6508615907563fd8e149a9b2079e9e5b0d20d85c8f2c9221fb04381fab52a743ba9842b413142f7a2ab6b90fa12339e1577ebec099c2591f3755f757aa91c56b6d930e3317fa8bb50ee55d98d56b8a9c1153fe9246cda7e2620e011b879ece6405c8b352a391bed889541918a605ff5fb2ec5a5ac72961b42e76740594a528ebd13e01422689dacaa32b41ec3505386c011dcf10c981c8b5914d6d71c5847a735adcbe3f6029338dba4a8feec8200b8441eab7b351b0cc2ffa8a73a282d26debcf5501248c65dd13f3f2c1c100e96747b89dccb651551f98983b6b2361ab25353da646fd7fa62f0d6bcb3addc8c972b49a0b0da3b4abc5c942c89cfd0a5bea18d4dd3ad171954b98f9f882da137d5163a3acaab1bb6c6b910537a513f590092339455d9c3cfd88c1d92ea5ecfa7b77dd84d21b4b3035f05a1af4e68c55dddd56625c9b6e29fee60949a34625177405", "006a65ac65ac6a", 1, 1883818395, 1537743641, "dea6b05ace029dc44983543bd60840c93d18c3373c7b226e7a4e961dc72c61a0"], - ["41a7cc6202975a45027b7aca71a0cd353441fdf6e6608e6d11f0c02a175833af531e3e9d8e0000000004ac6a636affffffff42560a9b7c1e65e0eef48a4795dc69d5b825a35dfd14fef4e824ec05a5d3c76400000000056a00535153b7da9baf02f638d1050000000004ac6353acc6cae105000000000763656553ac6aac0000000000", "", 0, -217334880, 0, "ebd7230e847b2d4d97902e9ac32311b52d2304c1212789efa2c40a454d53dfb6"], - ["25096e5d0295307bd40aee81bda793314f6050902255a6450c9bc702f2def9650fee69bf4d0000000003ac51ac16bd23dee7f9e0e97103b8077508de8461d51fe4319fa9559c2af5cacb734ce165f40a470200000000127953f402ece5750100000000065200656a656367beae05000000000400516363000000000100000000000000009b902b0500000000bf7da4e1a5a813d81c52e6b5dfcd1645def061978e0d5c344860a63d2b02cf7d2c9dd81e7ef09319885fe9aa6101da38324fa43a21f17e61fb7657ec20ae8f3756fa54a9c53e7ca18f1220f9c6dab131257d672d18df89e896f7c3f6e7fffd07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c46fabfb93e034da696f7802ba66dd926f0d41e84f1a950ba3d32d0529bfd0ecd4c55386d203e0461a3d3b8e82a56962c481b8773bcec7e0f95ef54452ae4ccae2b5d988f8228785487499d1d2f3b6ccf0412479bfdf087979a7a0f8bbfdd84606fcd4b8ad08fe4bf7e6f357dad9b7f5ab0fef0652d15f4ca0c031f6a54c4a30201a90e1870e6e3858b36c68f748204ed4dcceaea58d39621e2aa5532dafd6a7f0215555cf974b0c0fcba2b7cea6472eb49824197e76e6668e0ebbc9a78ea7058e60a0350d45685c3662bc8ecba820038b5fe383825994e68580da2e9722001a4fa05b00789448079b656324495f1aeafd97b3305c33ef412c18a8044356e9e0f6fd20309d96daa63705053d3e05431f23e60e97283a4859233b30c0ffa3d3ba8846c4e031cebb9effae1ecdabbf6fa72919a937ca952400a115ca5de3258cad902a0a21d030f4fcf33a736ca4a3282ffc26f4bd5fae0546d4274dca3434842c652e5da228f031da599c84de58c1ff69061b8df57b15c0ea1f2a5aff5cc075e09e2d804d1a99c022ed8f0e3383e87de03b9b1eca7eb2e64d50327ce784722eb8a82e5b5711d2e7fc7b14dd300545cb35b1fe467332e68128a4b5f147c5a4a7615afe3b704a9f093d4229d3fe3c2fc5ddae1774be340a768248e2404c57563de683df34377757404aa18de8c856a555f48ca032fb02bc7ed17ef64df7cc138769d8dbaabe1b58307a3cc982a3d3d9d852cda82d134a4152716e64aff7e5435e8cdee71af347ece16471f6cf3819dab1dffeacd7b302c5cab0c49f1ec5a673048316380cd978366a7e6cda5e3534449f7515c78edb3d76eb83c73352e83f6ed4082cca0fea460728eec2b5ee453ac4c306f34070ce44fb7d60c29ed8803eccdd8eb27809b04397c75e3b6a027a59d4cb48101459d4b294bcffefa3983d1f7024d6ed945debad81382e30e1e8c3af927696f12db3456254cb15eee79adcffd05d46bc73a9c0840fef1e5314df43b82ae620e3019f47685d6080dbd7e26e5c791faa89596b93588fe5910b03742a90057da3f99edbd3e119a17648f907e19ead03f0e0c01eefbd7f53dc3937d76bcb783facc360779578fc54ea8326e08e8b2ca6cedb155948d22292e7499e77b12db62d218ffe04a56d90563b6d354bfd2b67a41083dc98606016449d11bdbe876e857ec0d006780c31f4da41b6f158f8a49e64ba7dcb2e4dd715b8d17b251bc5cf4f26c61ecde37434476b119daee28ff3710ce3faed5ca0578f19589aa128966707f2eaad956d0c8807386f66e513e381d0af3464a077df8060229b7c21b49dbb25b683b32c376936cc0d917e323b4a64828fa42226ac4bc6f2053afc03b1daf62c74aabeb8c978b13fd706beb1daf716e230e7a4b86280d2fae694467b6b3b974ed90734b6743460697a346f5097d78207bfcb0ad7ef13f23d1749962e4ffe1f3bc9cf5a38db44b5f861ce593e6125c5be30561378556efd1ba8467a654a9bb1d2b5f4d9d90bc724d0bf5b0ee79c797a8b7bbccf0af39615b9987290d2cc8baae80d45a9397a723cb8961d5c127c66daf802d903cea9a13c988bf94ea6771e2ea13465e7dbbf5ccb0ec277bfde10b757cd2a0576d486cdaaf7098be4d4a32e7b3ae5460e4f38c03695a001ac748a433fba416f895536c5e0c78367385e5b5baa8e47e46bdab7a6914c3ed3949637ac583c7858d8538d3c7d29a0796d2bebe618edde1f266d366e12c063172ea6b377d1a204c94b53b6e3a2cb65ce00470a85d71e6ce06c9dc7af5ea1af62d5cebd39c1ef1ad54e192787a591307a876f65358cb2cc5af67d2426afe2647b827932154bb5f09e6ef9f2c1f4f2f0af5b873b78124253df9baf999444fcef61d1073d45b0aadc3dca23242ea43b1a21064f3a5caa790a760490d5b17a46b19fcb1644e5ccdf3c30533805a6cb3f3e67ed8c53ec6ca778bc34a3050bdca41121c30c4dfc737059458950fc39c45508f4c1020b72e34d87c421ef2f99bfb126ac622de7e20631cc11df79f7910cca8279bab73d9e74d80c80ccb37141fe7ccdb2a33283d3cfd6d6ab996ab3a5f952336da2fc854f6d102ea183c74a2c2c62318dee3c51167710a3d2ea4ea44d6f1a165cc0ec44ddfb5e63b2fc85b1c19d37a59c2081922b5673abd8cbdf8ce51acb9729025255009920f53278136f4366d4ee3afd865a4801e527d426e05692bb187f14c9997b868f715e805dac42ba0951d2be249ce9e7c3b77048604a88d417bfdb40e9dac01cdaf27461ac229f5e88a2bcc3bbb64a54656f4c6de45f3df8b0951c72d1a4607b6a5a13b52b408af645b0bdb22ed0861c48515f1216432058db28fa3eaec5aad4f0833cfccc787716ab7fc7b553413aae698bab95f0ca4926a86376ffad6fe9f8ffa3ebf5fea165ff029d683300a", "", 0, 1689297479, 1537743641, "526ee594c0985a597e917a5933e366962a8d9b1434301207bc7314e747a68baa"], - ["ee9aba2704b1084dba79b294bfae56f408d7bfb69bd50320fd36b1a0aee9910995f72ab994000000000400525352ffffffff0bb8b4eba52e73e5e5208c510450cd14e4b0a24aae0288d118bcf2a2f2fed7850000000000fffffffffa902925b45601f895e0d1cfcf0721748e482dab21addf08acf40529dc728cca030000000352656affffffff7fa2168cbb14f7c2e4dd825d65f8ec711b84f1f1823a41f9d9203ed26ef0edbd030000000653ac63ac6a6325185798012d5e070000000000046a6a516328f74fd402404ed601000000000000000000000000aea81ba4e2e5feb947a956f14597ee5a227f2244be7a7a168be43ee9b0b2cc4f8521f1fe5c002a9b5262663f742aa184d7c9e4e50ee888e01f03b75e151679e18c8f8bf8a0041ee429bef97b881f7482fe04192b4ed3f2a41decac12d21791b70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000037df29a7ccd7d7aea42752b8059776837e68fa0488707bb70ea4bbdb96fe5d9e3fc769b267659e2678ca6f80b437fe5502deaaea46e173bdeb51329feef82a27c0553f65ff69cdc274350e9a913c668d607333d81dc0882a945da42e96710a08818f58866c2c6f149fe0495a873bafd03743aad997393f8d3c2a8d0c866c34c9022b446c3a6b673fad87b6ea2002cf2b05e9edcdcb869782203610e504397aaba8021c8821e85400f63139fae475fe9303ef9d1d140b903c93c64dc5f605eed74b5b0b053537f17d8ca4dc7ba38b68d72383c56d1ae3bba31d010b6d0f1e2af05ff7c389b9f9e8b0ac9164a5788d2832ad8bc647472e77eab2fff0439ae164fd444d3e0214a92238a86b52131f3911cae989ae0e7c97238f532836ebeb9923dfc1ab7a1a030030e4441dd14c74e56573e7d8794bdc8888309be565e2e89b20981cdea120f1031605a5fb72774fbd24bf9bd9aa22b1de5a2fa3db973da3ea1ef481c9105a3905020129aad2006f567c6c34482f5a7df87c1004b979d0ba2e2147c72352d5c79f970305ff9ded025293a13be846c618c19e052a24b340f51b71c5011a3266aec226ea7d6e640364611c268acadd5bdc53ebf1d0c7baed782bc486cedb9ab4b37efb0d3df466d6bf489fc9bb45505752ae3fcadc5dbdfff1ea5fac4eaa33cf8aa1a1c5d4d18999c75fc74dfd067c3f5e8110d0c2dd8eed5ace6673a916659d04f327f029b0546560c1ca92afb1978488f000afbcf16fc07ce982c7829e7dd1479b0df62da4dfff79cf7b3fd41d1ae41761e231d16e8072f93924db2835335e412758432ab20f33666860eceb31e8153b260d8350093582b1b5017d83f19da0bc62a0b496110491335b5338e988aa8adece41afd21f35d52923742c7b59c1f9609d157512a6f2f04f78f6eac248f0139fbe51d36beec18de36f2a60c11b26b296408bfe5ab1e27a0500dac33860fb8ff867a0f35b76204ad4e96cb24c0148c37de455d99d0916c5b14a7c023795103c3fea388c642ddf966c1b0a847f6a58ed2c84d6d4063c8327ff4b7f1bcd84a3173766d2dcff7483d61453bf210a5d1316930d31a141e707d05c41b771c6ff7f8c47b7cd60520336281d7e2797a8f52542dd7f1699edbd701dc0017a5b3a99d930cdd4ca6d954444025b984af5defbf43486383ed561a836d54f2c629f774b807ee9a439f489871e0f0302a53ffe76db2c1da4ed48e4aa81bd17b31d61e0102ab874c914717813f2dc541fb4d99b5179e1b8e82176a828bfe7e9f13187adde560295247bdbc253b408a09e12da9bc88abc02a859f75f1745ccbd5d85b6863fdf7bbe80b7654a1c1b78908d24144262bd3b805794ea8163eba5eb1de871d999d268cd2024487b060cfa78673dae0668884a893e2c1d0dc1c057fb5931fa80783a07365862f4208a91104627408573745fcdb989fc722456fc815b6fbca17472e86920dba865adb5978663a4c903c17a478bd8b2e12081e2a10633803c5f445a646b1f6a9cbafb8222587abc12275c2e0fee5fd95220099346a70895c204f6f15e88dd9bd9b484da616551d10b677f84d14dc2b4bd065ad127108b3cb1fab4e6fe5f88d12dbe40a2fac2b46f6cecf0c32c17ee017125be0a5870b6d699d5850b81536364be6a785169c7ac84eafedb740fd29793f4447c61fddf0210896dc6af98ddabee202ddbb07923895c284d24fb76b4018a1f88b9215217e66e1987666df923ec92d655414e7aa543bf35fd350bd916b131c588b9386edf072038016b149b6545187659320a2481fc926f28b632985554d55d5ea414f5ee6843d15428290c4a41a3c1879262f9481a380529e58dfef3079f9929b351a835466db6c6fd9c9974bae71bc510b625f21f79135687c13a8c481baaab1a7dd8e7656129c53f80240e4a8382245dd28f7ef8a6ee4eb1fd72f4362e8be176ad73508c5107c4735d93eb01f11c40f2da8f638dac5b5e44768fce30798b0c7990298d4abebebd0c549043580a1e749914ca353cdb146aa89f6a72dfee5304ed42a585e6cc243ef5239c3ecb58c5154af8487d10522b3dc0c0e9976428a93f408b72f17fe11ccd868581b0c0ca930e5e2debca261a21d5f192f9147ce4fe644d055c16ab26b1cf25ffe9efec72089d7e7f06aad83c0ea3f10f9f1ce913d80a0e0628fc8cc3d39665c6a8c11a7da2d30d4719460c4b56220b5a6cab67361ec72e7e8e44e11aa24f484141fe5f26d0b559dd508d1e236c8bd8d96a30a237ac741fb6f375f447b14663b361837b1ac8938df00000000000000000504d48050000000070e142fb4e7d5c0901accf5e134328ca740ea97b850d5061e7ea62d5a03dd26019107fedef17246fcc9bea953f3a3e7d5b3f225faa30c786a27d2c6955edf80f9d233ab6d12171a0851cedffeb9b659c58e10a1d77acac4adcd62da5386ba84600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cf0eb636bc21bb01a335d4ba713a3f0931cb313c1e57d6be430dac3f00cd825405f508a0b3457ad8e1cf4fd7de59b5a6c650f78c3c2aeb8002f72acee51dd64f5ce2f629d098acda9fd0eda4285150149fa9d9ee0b92c7fcefaeeb0de87d23710bbb61268ee284442f9119786576d6c46f68b9b23791013e8ed6e2aa0068c7750212324fee1a3c22b15d64fa0132b4868731dc2553dc19b9cabece34e80f04d0020218466ec4315858a2e7b1e9ea8dce80890af8a24d38022af2b0436e51e16a28160a0427fe04806d1e2bf366c865745b44251a065eb717e2b2bd8ec76beac6ef52ae513d091b5cb81291bce1e1cf1ad08259c75aabcf2c9d6aa720a4b879d24022dd02054ecd00ffef639c2795f802ef6f0f1db084e12f66156e59705734e2c38bb268022bd9834b8bc05b22b2b53cf0e4c5b0878baa577dd04febe9edb05ed222823d190317a2b9ff3ea7794b5f72a12792a46e58bc9c15c68ba9041836040a7311b4a9ec03218aca5e95d50307151940fe78cecccd61c4d7c346873f70f881289319cf6e4f022575843401ed4b5509153f845f62a5012e2b3a0e0003d665580809685d06504ccbf7048509c2398dda4e5637af7bd20ca75e85d1c5b7e2ad57735adb78502e5e6a4f7dd3f60742f69e1215ca440e9a8dbdaabdd7f555eb563e0b678b8bf15256f8a6b87e1e3cb9361b1696b67899580f38bc3b1d806dd7819a3fc4703c3bf4ac8c8f503042c5f35a3e0174bc17e9980da86d5a65d562450406acd0202a207dceb8b8064578a876aec64cf62bcdfd04d6fea13651a3eb2daecc160d2758eb226287ac61f3d4a224afc708bce09fa68bd449188a313f0503b9c46caa91dea218e40b09ba942fc82b3a1f7efb2bc3bcc6367a0e9cb4b2031a41aede577ef3bc5d813f1afc141cb2b2f97533cd173d5ccb6e4fc68b0fb710a05ecd9a7cce93258ceff57d1776d785c00d6af396b3f4bf2def60323ddf831ad5956486ea82575ddb9788111427a125670dbeae48279f739c4998cebff9c229a4f9a303dbaef17c7a6939d84fbfc3f002f4a87c182446a15fe76fe9b87ab2a1b3625a2337169abbe7f4fa2c1e82199a367d03397e4db0d1f6910385fc091ba41632f31463dbcddeb65fc175f0d1cde5912d597c1373b62c4f8d55361abfb485a3c820b1dda0a8049b4122b94fe339aa34aef8f30d837bce9cfe9562037a26bf4d9f60e50f8be68eb6f067550cc985a01cf0610341c73dd5f998a904388715c2906f92c33738ee3e4818445b0a33e5acaf795cc36071f0c4a69f22a181ace87371f27a8f1436eee63a3bb8c6709ba62edec720430d9067e7fb15f27052b78661d7ba83cd0a6c8212fcea4043a48222569d67889918ec640b67578e58c5e4a18c12b55e94face13215ce7b8fa0be7fd136f72dd478d7982f204cd062674127b25de63811dad3d786ac644748fb3ad8703ab8ac00528f99560ea54ddd32b6b2d17c08c753e885734c5212506584d960d5308550a5ed8570d7a01c1900aa1697c37d4ef695712c48c08b3ff4b4ad4fab61f308158b019fcde7b8835aa4a067a23f480d9312cfdf4a5cea3c7d826624f187da45ab70eeff017d07efa264c4665e92b1d8053f7634559558a9f097a06eaa34ee960cc74e3e7d0a15361ea9582b5ae464ed223fc3ec9adb7d675610b7417ee34de9d0a0708ff120b86e18d21c1ac617f6678d81ce32d00a3d5ac4aad761f5416e4b4afc8e17d9923ae622a92ecf1d6d35ea81161120f63452176ba5bcf5e2c9dda80ecdb1c641a3e13d1e0a9d7981060b86b7d852caab6d1dfa75d0757024edb692ceb45e81c5ea035dcaadf2f404f4276b9070bfe699c415c73a9ccb8b91014001ab1c24dd24e19f628bba0ac97ddd1112ec55c4962964f670c00c132bd2718824a95621a51239e0d05197d0dd3ec1e01fb719242d07e6004a7a7251dfe90ae9ae91d841f4b95923ea343081d463ee08f7d8cfeae705fe16329b7c914c1192370c5c76c2cabc9f1c5f30e165aa8004a23f6b1fb179b0cc9e69da5f091f54688686449602af1e38c44bad0afddb2926dde9da57efb1264482d9da28b86ca38e96697093b0dcdc5e1562ece4ecafc09f012891c0540a4b19845f06d8fe9cd6383c6995aa97479da1327e45ee0d24ae2abe6e74a7dcf799ba214fb9793376b62c695ac0fd77151d27567d48cb31f662da06d4314afd45b6ebb7a07ce3477de573f15c20b80a47052a224f0e60c7b6acfb24b8cd582eba95bc6d3c580b6323e3dded22ff8e19484a742e60ee5a3716341e415e2e6c8f5d81ef303a538548df553d5bd7e0b7cf4ff5b7a96cdf85e2fa0b6aa6f99f2597ced76abce55f8a52ce52f7e73290455e5fc8abeea5c06980de5ea2f731c5c4f490f106ddd63e89cc274e5486747ce6e059e5e892b424e0b", "656a6a6a535152", 2, 201574854, 1537743641, "bd063cf8d7f582319ae3b957d032035dd8a7e5e4fea488f5a2fcc4a6eff10d8c"], - ["030000807082c40303afc29a4c605af3aa4c9e860424a76db4e4f7e188a4c9b0342a852a6c1e03ebd602000000035353acffffffff54b846bda68ce6fc59bc0fa2f77b0954bf7b33446a0a2ebf03ab41c637ce8b310100000009515165ac63636300acffffffff3b97b88fc262add441cace68840aa61808f2ff19bac1d5cdf82ec50084d1c2d000000000026a53d2107ee6030a162d010000000005635351ac6a28a08c030000000006ac00006a6553ef99f8040000000000b297b7af00000000030000000000000000a5b9b4000000000047bb466cabca0f30678a181a34f0aca8b624d1f471c65a2460b8b6421b390174763d5c3fd3db7b96a1226d694d8427914597ab6f0d705d755e699a59c307014f2ebfda1040e6ef3f9c3449b7ea06f3bb75999e9db515682342f9f252715dc29d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000922d7980a7abb63bb6995bfe07cd3ba4bb38f8bc3b55f39a29dbabc160846ebc5c5979008faca749440ac113c87d9ea33ba87cf285c059663cf6f1538513bf47664aa7e529ee1e5537ca1142c35116cdeb9440422985e8e9d280f2e2987b25856a3e7064e387d783bf470c21e90db3f391e26bc3f0bf62c31bbc3a6ef42383da030bdc04669bf539275525dfbeb14c4f79a31711789d313980f76dd3777ece85770308b1cd5e74ecf230b53ed1f41c8fce2fdadb6b9d4c19893db3f3de60940f46560b0015607c2c5069e9067e7392170f9e59f596e20c59efc8caab5b0265f4880410869c93302bc4096fdd790f5d47be37bc1467f970dc6ec8d526de7ef0ee5b8bad0319f2c3bff2b71205716aea676c62be25e337a6f752c1bd386daddb829c003b8d022ae93b31377cfa00ee0e4fb8881474ba3627f056b6e3527dea090ffa50a2503502164cec1060ba142c1067fa8f90c3a6a9f1418438fa9fd0a1fb1a5b914b11b93f0220641aee7eaee968a576809ffa9ba604625ede4672f2edca50f456d14d59b8810201b4640472c3953a48518c84693016467f9e7cf11df5bf6d10b3a6615586b5d2e748969685c25f802e4833b4fe891024517427bdd0b6b9db07320b72579adc9f409856ee8f6b1fe83d5b508a0221eb67ce2e3b47753149ea2e8b9809de4d3a35a46920f9ba80a55f690b9c662bd63ce5a844e956c85b5c873051d3ee944702c24405e73c9549eadb735806589967206bf5a04c63cda08377c7548cc1ef98b1f445f54e208df593e9c5cf02c4610293325be38db10eab91ffb167e5b384a9a57ac35906eca7347aef840fa6fbaff0db2a630cb64e0fb7b2e7f8a04fa340ec5ef86b006bf995b00e162003bee575e8089a2fdce5384e13741782cf89a65768b74a115598887eec0b05e28b7b77b9d5cbf3ac9ad4ea71dd45265a3dd52c66853813d53d158e8ded93b70492158741af1bbdd3639e1f558ae2d22e027957cad85ae6f58e888328cc0e1b3607a236f1966097295f2ec5e982777143e021972cc203f12d95fd3394a1f51fcb6b4896a4db02019f7ef04d7ea781c0248bdb36814dff52e3dce13f46315df3a53877e7f17761e5c24cfb6f2f0bd2420a7ceac6c4d5c7dfb137c7c91e68106d22b59b4c9372e5cdf4e73e3ac5afcc978cf2cdfb5e7b6e171e78a1478cf3ba27fcc28e2b3d527930b3fe3d8d2d407a8f20dc10dbc7a3f16025d85f98622999217dbc239fc91d47a7360dd8d18490e6df5a3d7238bb4cc94fe9e0da74c70d58939d921feb53756883695a675732757e2661b010f1801db8f1852bac91657b2c955a399876da3b331f049d2af40b95157b59420d1e581f60daa9f125be05bea0398b3a3745cc095b7fe25a868269bebecb149407a927d7bd9c93ff46e6e5060f92feab71984d7dca74e33d757affd9343441030274ff13d01dd9a9a72a6f3dd68a0ea9e1e528e34227bf1d01092098618c55145d7ff3e2c198ad0fb6e8d760cad808653f5537a1b705bcf5529febf8e057ce841f79ad60bf8fe4a5c9407ed32e2f420d4aa670bc9c7ccc4d329e907d2b5d0c3fe50ab27eedc38c7a69f90b3b3833f145f72e5de0628bc1446ffe043aa32502c4bf12bef80dcbabd304a50c5f34b11329d9059c74f4c1194dc43b931372e5478b1e67a3415d2f489f3c0ea92906fe8c44bc0a7c9188dfc94c1d0348fe45b03901007680b28513adc1ae09dabdae0fc4acbd7f53d9f13876197317bff7f19f0146c799f21ad327001dcf76627241fb6dc040647da1c02023d8800d2a8b1fc9b9bdcf7ab6faaeb5cbbd3a4d6aec45dce645f6a0dc074b0ca8ec007c838bf3093489c2740e872d5e19eff39a0a7e144c345a67381562243f7a2d1e5495cdd86ff2f1b27a05373838865fd4a1bd1f591fd83af1945cb8de41253808bb2c18cdbc76e8a5b24a36680867ebf616910ba010061271e4e1bf8d3bf5650625c4e63893634440bc9aa32b0524e73eeecc76c5307d4665c3f6b676687da575b33ee31a997c1c234e9dfb628ae7265d1df20f77b5a829c19b16ab9c11923cdfad2d79fdebca6988663ba1f7deb3c8a655c59ca1c9c786335aa56018c4bd365c4bd03857c14eec1f488e9420832ed7a9eab8a5f40f8fe418da34c071557eb67a11d9aefe6097463da17ce570570710b74f1c405364fc2ec648115133de88acdffcd46e6e656cabe66cdeba446e67a72027af5a8b05228c9f47967b06508e1b30f08695cbac56400692144e5a10ba144ccae9f9f23a0d8ab3d1b5aafe510bfa00000000000000008f2868020000000029ae80b59074f55569e89c76d71a899fba8aef14255fa5906854d1960cf3114dc77b29385871fd56dc42b0b3857ed69cc9c129a6c59da5859d1dee1269e7f128f24bda13633886ac6baea0af3161f1ab8b60bd04183f4bcfa3b29baf5fdc5686000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001174c4b2066b81e55f49b6e68fa6471c9139a6c9f90e27de700cbb3144e809a43dfcb9964f4a688767d8e8041d6cf3cea3864f9a41bf158608e1f7419c9d154c09cf863d589887776d133814e807dd3bcfbf7a0cfd0fd5a91a74f973a82622137f51c0c30e9983a028b8c0803f04d92c8b5c1d47ba8a2584606249e8fcc58d0c031bd89fbb8d294ba80b76bb0357dcce1143d1a1035118618e40d04b53a060a1250222fb43ad1d20749c7cdd46293aaba5f7590ceadbe13131fd131dcf6be604687a0b01226d57c8a0187da6d9d2f9cc9396b1e9b502346c4c537b8ff2d660df599b53611f54e73b786be4b8b94db35006fa1e64bdffa2c1f1bb7cb4e731c3751d4ecd03073cebdf9f5499b412e69a940b72549421e06a56ec47c7f7fb946feb458327d602232c33fa5eb621bac99bb4608aefb04947ff311da7dd4c3e7121357d931214a802175f432e70b1bd9afc3fa8efb3cb10dbfd717ceb37d50e7b376fab57ee74faa90215678c2b38f65bac87054e2c82de21a210b49649bd29a726c684c6ed8e526e27032c4dadf2cff1eab32c765b374a6118f09c7b77b162328dc6c20a5dcf7798e99f86ad400cc664f3ac890ecc940f5bb529317a462beb7e9ae89916b7fdc53ca311c1d4956120b4d14fedb31ae6de4e1c83b8f5d817c075e42e70631e9f98262ba685a959d77a907ce0d91cd486eedfc16028c0411f478479ad0bca2e77f6c53bb7fb2129a4ea301ac45eddd79f9307ed0d339098203c8aee09ee2a0c992b2e581ced9a8888e986eb0823ef877d72f7510947ecd245c5daf70f21c774ac3fadb57ea0ca74e78528dcbff42500b7b5bb656b318919fbf28880ae9137674cf4b45b231076e789d41398d7b4dfb685c41f7f696b97888fcee59db9ebaf7c736cc2a32e079b6ce6c21ba26b4f724ab56618292dceeaa1272e769c92ec8a34cbad00623f804ef5dbb863313dbf4f6311f7a05d849f50fdf2df4a9e806ca8b42e7ebf121c97b85164691a7afe13159f6e99fc85219de802748a932c9c4469ac62e2bf2d2a2b39ff7b38dec1514453a6bdba94be1614c9cbb650e980813c2cc24609ed64fa3f367ada3f696ea8703a2ffa62410ae546d34b0147ad5642aff6c71826c0902e17e9a63c64fa11ad56b39748992eedde2d5666775ab7918c2aa850b07d47467b70f179e515dfad6cbde9fb0df983b0ac896a250e92cf9ce11a89bd6eb1715299dc6a631ee68d8a418a89e9dc299f731593bd1634b7d940e13b5f5c47e2fc60d8e87024b818e8f6acaae0054c852baa83d4f83a010c161e25d4c6a164778f5d307b94a8741567752cf46730d1ca5fdd3c4d063be2ef4e9188a111847b50c258a28bc1b13fc29c6456fadc61bac4b66ff0b8858743f2dad4fab97375a29dcd9dbb760a7b78007d9d46587b58a08fb0dd68d6e5770537132956a6a2957de7b10415d9a41e10236df4a434cad0288e7bfa7ca737e8a0a3f469c7768e4fe8addc3e37138bd6489c623dc85cf1d2ec3f764e1c3a6188d1e09c3aa2e4bf186743ca43a6082bfac73f77c123cf01b1d81cda20692303342bb2caf300d2da5f4c288f125f62fa49f9c6ae149543b0bb0930c8501d9962c9d6dee411e5487011446b8d8b4db8e8c59c7a6875e2794bac9833486ded19ad49b843d218bf5f73061652ca1b158b7c41a0b4524b19d07dbfe366eea649189ed5663e8b638ae4d0ad09510dd0fda80844d1838d2391ea1bffd7e7f061ae2544b01315373ea49df80f5e0472d1b8dc2e20195850d16df084f15d4bb5ca3b3a92f46820ea96237a3fc28f6b3b86cf86359fdc511562a39cd5e393dcd2852cbfb81d3d0acf97b1cae8e8e639abcaf683137a69f5ac48b489ceadc6f79f816ca5c1e1b9717a09128bc98b34d682192c36c030265255d6f31387b0135c3b64438eda9aa8ae2424aadf21bafbed9f2fb384f5c313bba0543d23077dbec14d257963a1d6b18abd40b8a62da4ef34edaed6f11c9af56f738cb6ccbb225258f14bb5aad4287c4920c5bedd5132f569288974dfaaa3db8798b9c44a1ad3727943c21aa316075bbff13df3287241f56457a0d3889ef7cecbb6e2a584a53b008754a1d240de6502b40c557b90a639f04ed84d686d3662a1ee07b22575909751c4de9b3948cb383d92654356a5f8c324052a4f7201d9df43f3eca16016c35a5745b82b7c02ad9633d8c94b54a352cfce613a82af1efa9ad1db862493de507e3f1462a87fa137b9304a8a343dfc64d31276b6dc4b38f202ca4ee338fe8bc3e46627e6b002b57a0000000000000000996744040000000052e02cde95a3771762c72732c54a562f0388edba623b90be226d52f0680b02b9ce1e393f7cea3805ad3ebed7adaaca2278927003adcbdae356508ea4b9edf7232b2452b1aa49987d438c1ab1ab9c4843262eeac49cbb02af9882cc2292e381780000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058a9dbd97f750eb0ed74d41b9968d6bc0b07c032ef600295a04833a4180a6e954d2d4c2da4c61b791c66034473d8e42e9b35bf0fe67d7cf09ff9fd83f7eb9269a72378799f118b095ccc56046e77721e70938b1527481b85759545f75ea6a87df47e21f08e63f111c2126a4a1de0ad50e17fc90ec49d9b4adb7200ceefc24a710208a1ff77a171414a562d96a189b49b246b4632c23ecf562878bf06455bf5fb4d0229158af44883592c02a04a92c18f61e6ac64c704baaa863c3c549195871f33d30b044b7cef19398b8f3c2fd1af5b790c5d37af25d010bb6512daccca3abf81924f2e46de42576cee6f941c68c2b1731bd8442ea3732b3361f3b1afb7c4f9b357da0321489f0c35e033bbb70b070b83d560c99cba1447d70d2d1fa2eac0b289cadad3021d51d8167e4ba7ddfa0578946f50d26d6fd2369bfadb4ea3882c20dcea62c740030347ce43f13b3323043eb85e868f01d90c3928085b1acac3b034a1be8b584cfc0301ba9fe7540bc22574c57d0f48aeae3091cc868a571448dac7900d7da85f5df4022b65ec499d97a94105692f13fcc93d84380862e27df87a6ccefac2624bbd2ab2e2abdbdf85f8c6ed2ed7e342de6370b0c5b5e5bb8c93e60a20475dfb8798ada622234d5eabc9e718769500f02fe037bbb7d4aace630b126d96b7349e58e6f22403626cfcd6b815b943f2140555139be8d780e4d4dbe3c86a3c917adf7ef9084a1b5cc5e810743f122d9517377a520e4c3785ce90eef1d5752edcf1df733eb8716cb24883218c26c908a054178448367c182340b101e365c12c716c45a5e586b02bf70ad1ec47e0a862e5001cabd6d37c3658e2556cc35272a674c90a4fad3ad16c61a80868971c25c8a9e943a8030c782b3b844b8a5fe75326596ba3771c4e1e2b85e88132ffad3dea5189bc215ff9b897efdb8957e43e42f63ca021d3cc4f7dcafe71b2edde33ba155edfc854986b7b8a2d23747c7896051bc1d9823d51a699459ccfd5b2aaf74b6e23fa9f7ce50b531410e65fb8929c88b2903d904f0c419a750a3f7544dc9df83b6e8e66737588f2ae9ca6fecd73bc0644dad4956e4e2989e1e0853335c37c0929a2b7ab2415c0a1d4815abd43e35a1da89f07f10ff214ea1b5f39e13f2e1d9fdefd590c1e1167c607a764342583ffdec7610559cc2bb5951cb0cd5a665030b6e555ba79fd13c50f5904ea09772103eb7b43e24a70d722f48a4f08240315a5fc2bd1743a75c1f2d02e7a92545e287bd2e06193b717bea6ada1e3f6e6e88e9a6870c29c542a23344316e7d1bb5448d9d73de851f67826ae14281af4000dce7480203252e8e2b69dde7c2410d7185a636b7f267f78597708289a3175057e405797b56f7bdde3d403bfb259c886a6a426064769f30308fdb588b74eda59fe870875509c0aee6f786bacf1b565f6903bcafd144a20d3bdaf704fdfe097ccc7dfcc47f2846154c212db6b2f8813d168d57745d23ca20a611dc2c76be9d75af7ad356fe4a82b8884bea2f38695050d8aada6433dbc883d1c5939f67b1f2a37c6446433e0bea0555d78084927102b7dab4e3fdfb1e40f8cf4a516c04db1882cea82f81860ce4c7279d0145984fed6ea1e1ca47025b38c055ae27e57b56c886d380f4b7069b9da954ea5247330ff7039cbdd31fc7022aa9289ca4f48068e7316e5d2da8f1c40d96ff59c94a258c2086f4acca861565e5c60d0c93cd995de306ef08f39c4dc30532743ef9a3145eade4a1c6770d1f376d655d9a2894c690443712a0752bfa98390e835457efe1ce375dfd4e652c639be978911fcb5074fa4e494a7e4b9e2027fe059d5fe3b4f75696541ca607163523cca801d3c54e6c3013fe97779e16c4080d69ace4d69e3ebc7956688032c0fcff94a69ad47b5c546419098aa29799d8d32d8e504c66fef3f622c94c6d706d011c31df10753c82f7fc286e5bfc5d5692f4d4b05d3b21763d200f5d03e2c25194c966cd560220c2a62d3b410c7c36136ec22be095860c6e4fb7a24ef7a3dad281328ac2859374943ee837ae8420703713a8c89588500c288f443c0404742dbd3390ae3cb5c320eafdaa107419cf5e9376945777d8858b362f5100d495b7931cfca0fdd2cc2de4e71696737d3d98b0e7f70b618e15d778ebdbdc249b00a7f0196e5ee819a0e97e45f61ac1fd286a865e2a59c727cdc0eb6e5597748c406c55112f0c88e15465f1d854d33cf8c0aa26f6cebd73f8a9774c7bf0dbd008d273b55d91e888aab95ba5fe6c13c77322d8d1ac7993b0de13efc480e5f69ef566cdcff2e196fb68a44e50cd4f3e01fc5ce86b6dc39ee8445256a00df28e596d28cdfd64d5bfb9e993c84a52ae0e01c185f1e980701dd7b2f9d26470051f0addfa6135987b1f12ddd99c8cafcfc8708fdfd8aaa12383e1e5f8fc3b21ff70a", "6a65656a", 0, 1838507095, 0, "427c56f1d31900a4e9dbaf026890a104fe9e8a1d43c7f3198515a014caf9fb1f"], - ["030000807082c4030311afccd385c1c2f272ea2795d699946d85abd9136975d42e75d20737d8ced0ed0000000006ac655352ac6376b090c6183415b962e83112c3a6785a50e44d6d39f1c72e09e1acbcadc053f593d797550100000004005353acffffffffcb8f2967b93a61ffe940149a3326a33ee17fac982fe27f58c10baa68360de67502000000085251536a636a6a63faf4258f03402a7903000000000153bb58eb0100000000075165ac53516a53d3ef0b03000000000552656553acb687a8d8000000000100000000000000004fe7da020000000099c9379ba783b7e2a322d22c1ff7b3868856635b568380c8f3ddc8d67582032b131fbb5f7413eed36d2134d861a1c6f11a10bae098ffc69612f4fd9baa40a0a660d6a76ae7689dc130c313a190eae9d68681b5ba2c3a532e01f6ae938aae7ac100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae0a5005251546f14c47a253d8dcaf26394cb613151118309708ba8861185b9edd5d530023d770da05c0479df103faa5dea782b5e4175b2914a7e3915796c4992b8fdb0ce8f8c049989d4ba5a83a5385175bf3ccd0d8c2134efb9d6bdf7ba7437e7af93a7e559dc7f61bc80ad44cf9b4a469f5e0a8f1e8884bb341e088db867403261db07af4693da7f21c938cc46db338f4c95d4ff665e596c9a2627cee162d56021161a86867417002c022bd768ba7dfdd594e119f8236ad572b07330f99cfec9d0b0902929343a246027de837e0aea7d0e06d34bd914c4d365fbaf872bcfb342a66967babef39c6d0e7b5dd0507682c4caa81813b92775d241c364e740558b33c1d022819a87fc8629a49aa2ed63449813058aaa26a70672ffc9563e13e49165e0702022e48233da013faeec6395746b0c8ae5503f4895fd70b349962c3383aec49a8c8031e11828e63f3d8dc287344bb5cd171c76766418a7eef09b33be0790a1dd8d3a003005a2f104fd058acc631ac819f932cec86eb84b29b3e7a984a21c39cb233a33f030aa5f8d1ea5836d529eb4511bba38e26201bc302542777be02e991b80518b7567be660138f98fce5404248986a908c199adaeac13b24546336e7ee43c1c538a08cb388145251668a473d0d24e61ae45cf4a725030524c8af1fca02c3cd5fcd883bd9fe72843e70cc26fb8b5566116e0f97f4522996665bb3d0ac3ea8ddd6b85bc60085ec6cf4104ea7e7b64a4fbb9edcc4a6da8bc0dcc415e41829efb2d20fbff02c5f060eeafbe976918db426ebf1f9b4dde02ee2c518f4c05bb9136a66ee9a7742fb3cf7c3abf902c38211ee68e754a7d56e35f453df6745e59955dbf018307f63df111f5e02f28f9b64cb083ca732ddd3a94856f1eda073c908e412bbdad4742840276790fec007b798bb589dfd01d88876078787f425ed76db2a0c539a8de449e8fe5840cdfa14edca5aeee7456d81a4fbf9ab7ec0fe73e61a54d4934eb5634efa4aede85172c4f2faada9875ef7d0ee1d8a8946522a93c407239feaa275f1fb7c7fac0a41ef69f2fedae05daa66a6803999d1b5cf414673dd61e6ffce973cd25c621e8970e6b5007f15e8e7b5a00433dc2a577fd5a6e3295aa81483039295bdb29f59eab37a885e04f5fa344b7c687c79e4f0c68e75273973f7864f887f3fcef607b276e880dbbb3366388f0a2959833035bbd77f1011361e0b23484cdfb75f2a7e04efd9d6e506ffa8b9c1522b439dcacb048c781c0cc7939f223da9d2cb4363ae695958554af657ddafd43a649d969d8af4e97a4b6a0ec1f0904f21ddb7967268ffb3cc3fa7ecd0e846580a045099b25470f5fa3953dc911f02a88d41071832a102862c02f0f692ba2c2de988ebf85d3811f189baff5f2c94d325ebdf918c76211e80c9d45db9fa7af67f0a2624a91609f491f9288878f66fd6567d544b763b374756b0cd9077b1607cebf0b446a9f3af744b85e97612344163ec18fe477bd8c3d696b0ada897d0ef4674b8d026da0bea3df886243d982be15dce33fc15f1dd4d4bf298b8c195206125b4af28c6e7270b5f431350af2ceb20baf6862f60d0fbff2e1de78916d822391c7f10dd52b36373d3c26f60536cd6a5df50ac2d8c803a933d29615bffc81f6631927d24b2de1cbdfb42bfe48bf09630657e8192147bd3d74456181ed7489a2556066c858f698e390673392bb9ecfa998011ff75c064d378f7ba768d0a4fe12d657f09fa3173b0a4b153944600eeeeb81a9005e8892e7d2f9517ea2c16bc52e3663e9e18b459208419e57891c12e10d898abbfa7bec2c93ec2ff19cb60f49604f97d061b8875318ac8985d1b1d8c096f19b0ba6c67881e886ce1f672fdb2157a0d39cbec9a46cab10d80819cb9a8aa5963625ed4d5fb45ee402f6372c2eeec6288e8ee46f3a69b04ede21ded576c731dac53039cbcde8ad35204fca38ab1c05a2ce20a3c5f37c74b08fd8ced6bc775903e8d1994f35604a5422df37997918e851fa1f5749e4bf64454565e8728c6e0fcc03a768a421d3073fd05efbf074dd9ae0d417c033a695bfb70fb0a46ba08022a2b02323fbbcc2b3594985a0f69da4047d8c1ca2a3e8600cfe48c6da197890be3e8666295c05393d8a56986ec34448716c047193799a581ed3c053a42b99c3a6d9b55d68dce8fe2f98d79062695c30df25a622011d8d11964d71a41a674c2730c7db62d86daf888fb29f898aadb9ad19c26213c2c30f681d074d549c21bf08e6366cdac7b873e13dc032ea4e1e65d1becae47f630d96cd20fb948f824cd67535c0c4812329f8b117aa3b7020b412c967104ee38acf9c32bf164cbdcccb271e28f5aa4c188ab6a32d8277e30976a00313485fd730009186d269f31204ce1efc870b0c1d0720c82760b500a856cde0636d3ccd1b0d3a804", "ac", 0, -251925958, 0, "6523b4ae75d4f3546a214913a650b3b653a9d14d2edf4c0584a7604c10099182"], - ["030000807082c403041942fe2904cfc11ade9b5673d5aac9919e79e6454538aa79100a3030b5f3dbe20300000003635353ffffffff2dc60025d85f2897e1ec2861687c2cd9acec613aec44408c63d6795bbe20ed160000000001acffffffff1dc4e545034e38e6245e8976d69be94d143fd60066212699977ff851fa7a4a5d0200000006636352526352ffffffff92e45f8684be1d5a421d1e864ef51f3d3016770916edd2014784cdf4f9c605380000000000a4d77cec0411de08020000000000b0661e00000000000851006a650052ac658d53e3000000000004635265652f41a903000000000565526351531a4b0a750000000002e5ed8c010000000000000000000000009d10a3297c79ed4b467489c272c530cc708acef739feb2184fc90a28822782598dd062d9dc63b7b757df14186c328661628179eeccd051159e2903d624c15edff65f9a4ff57a6240ce487e87d5831ef315fe22cc01913b7cabe45e84495f5a8100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000678ea73f6b58e981bb19687c36be94b502bc83a60e5160a0bca15af2114d130f3f8434b4d0e3ede5c140f4af2a545cc5a2ed975db1597210034f02c3909c454eb99ed01b2ebc7529cb3b4b9864f2b1781de7b7bd207f8b97a726abfe278e59ebfc3b34539117dc75b6ba4ee71ff62efca0030595d36a248127fa30faac4d8460030a4fa80e1bbb8fce28bcceed13d21047e0c3d162c3a7d924e0b749dca20432ac030763dd72020717affe6657bc5ce7f3115ac0ebffda861e787aadc4b4e5728cdf0b0870f0331fc0582750415679409d30daafbbbb3cf5dc320bd665e09066673e9404ed356daa229cca8820c1d958f7d55a47ae880dc2621c9c197d29e562ef15ed021e5ff720b2b69403ba8da3affda68b3f6aecc8a8c8aae36c75f982cbb30c6a7a021e07532fb72d66dd99cb8152f5d806ef63fb8de8ea3b63ac948643eca37d0c600305bcaa4360297214453d099129794956c24ff7199cb95669e35bd701c0359b0a0206587be8f1b5770477d31884af3f5e32f816d71b86f9e21afbff50acbc0401d2021f4328b3fbe9eec7d0573674ee470e8fd82eaefcc2c69370bd3c4d3ce8188c5d62609d6b7c892d0d0441f905eacb275dc15ef000ff32724da43400ee042752ce854f8db87bd6790743c3d644a2df48c4230865de1292f4d666d4223901ef4fe4501875dcbe119969b262104c29c35806af99497c1b480405d5308bae9dbd450de6529ad06e826c0fac4e15464a4669258516e6dac979433f79e5c972c83d1c2d2eb503bbfbd2094544dce83ba38e304b245057b176529434510d3d1a3651c234b51738c7b27232d50ebafb5e28a23f8863ec12aae7d2a916eabe2fde35fdef524f2636856e18df865b13a03d1a5af984c8520f82ca05bb764038527c1cbd3d495f7a75ec0292a6a65ef8f6fc5122aa38cd87aec474cd04d8af177cfc03acf202d9e8c5742adb56348d2723aad2c71316f348098fcdc01c5d008ca35096318cec1058c19736935fcca1f666e17516ea252e871187a4e25461e7d21cf7ade1124a1cd6954b1a466538e237aa1286bc2310e6f468012d822e5aebd0522ce08b9242576f40874619d77152b3e11c364e9c8d4c7b7d99aa38692acbd6f2dc8d9a76f0378978cbe5b55b6ad112439cc0ccb814c085ed7256de0b5c8e599c988ed915d75d78cd8a309a4c7f151ec008eb6db7ee1226bf4a91ce7875f89a919fcdef5c0e33370c295c483e47a10e9bbee9230af9e11f8b53209c03386e307ec5f3f09560394ab8d2b97b9e5d5155bce5b3e490c161e9a75bd427afb378b4703096dbe5e4685f8b3e6919478dc7cbe8b06a22c7acfcebdd46c388491b1d04d5dc5420413c9137ceee0650c4a482653bfcacdf38648c19b4f12961c49f4cfcf888ce94c0460f9f6978e11aa99ea4487c390060421ab389aa6462d92182f78c149594a2acd1d66752a86ee3feb473986f9b9be5e793f99065048c8df7f927e0d7cefc95ac5a0dac07cda77d7ea260de606860b2671f6fd7e8fad66ebe6f682932489cdf084bed74e71da157c64f35173b3ae60b1df56cc26b1d05761929ec0302bedb5c4f01ab21be90a7f5d161d9d95810fdedaced3363b8e8717d1bdecb30f4ddf76d23b12a3b040fb0309ba2892a8d1ec4bac9d83d8529582e2377e0314537f79971fc7a6d38b33dddd93a16e6bd0b04f24b90d4cf3c78f143ca528b6cfc7f22c4161fb62c79ce9dac1cd9c091990b4fb2da872a7e3b4c45575d75c62b3fe47d51ae38a800ff8acc47731676ebe9ea49a375eb2a3cbb319a1246d811b0b5907e2189dc73523dbb3c1277177fa5a00d3745d4bbcb40c7c40f76f49a04333ebb5e83b18b9be99d1cd3840ae0e19360935bbd610dc2328c34f47e6e8f186c6140cba6cc14ae54233f0343cd42ffea09d563b7802beee570db0c569d19778371a0a26c6b3a43ae387c4a3011a8b1a4a9463a71d4cc0e7509d6bede4157e28ca8e25978da9246c5d33cb7ab0221b407f8c1f4f57bed39c556eade97e2875aa7cc754315386652664744be15394c670fa6877c2da958ca592b7de1a8b1cbb9ceb935436b7369d9cf5c1046169b4ca6e445868a82541e63d3ffd30cc24fcd225b21f250bb29620eccabf3834ed27859abf78b29a4d8c00d8ac554fbbe0678ef78f579e8c950b10a585f20d5d8a44765ad903fb99ed06a521acee439a4172dee9d4c2ac3f9ab6482af48a1afb6b969e8800f11fc92e529de9cfd824d02ba17d4763f16d6c5c183c743b629267a2ebf3f904d93a9e7e6d99106620000000000000000ef6aa60400000000af1298e56718edb17caa8f7b525950de97cfb253da976bf55ca6dd1716e6e553eafeb8456fcdf8a8a8fdc8f40d619d2010c25472360bb3fc21aaf1d44094c789190a4c34879cba7e05c9d2fc3e25c79a2e93e2c4ed165157ad4838daa8fe8628000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007754a3f26f8c71e423cf2a6481432aea7aa201889a262b6990d66170460c22b3f17c0ee4c3db68ebcd8ad0fff6b35c27104d9ac47f823ae5b230f6f03aba7ecaf476a10bfb0e88b9af413271a0a91c38adc3dd4c010af68a39129d8179a9e219185d0c4ad1fcc29e62b4eb9d4b770854151d8c2d452121dfb1a2beb40f1994290301d85b5b1e3297c59d0fefe51f5c97a283299c9d16278ccf9c9213874dc0cce2022d5807a588531e396242232497e323c17120e851e8b61ef1da0ddcf432e9a2390b01cbb6eea020e40c54fa65b4dfdc4360b95b26ffefd7ce9fdad6d6476ab2347925cbe694d0803cb0ae8d66e2ed55c276139edd905b2731e5a24077ab4d9e664c020927e6114348fcf1b4c132f4a1d5e772a1c544c5aaf819819a0b01d3ad6f58680216a71aa9a9fcbeb5e7a853379e29e29c9df4220e46f7481a45236c0c8176306e020a1d75a7d6c8d95da6469bd2f9be983fb3fa0e3a02ed47de67fd4e19e7e24ea4022c2377521f0b05f8fdb7cfef0f4096ccba0b755368b187c9e2747634dc309c1002195a3a700ef2be9742c25a715f551d6b7f26ea00a68b4f3604f3bfba4519736319721cfa153c3eae121025b732a145683766356250fdd0d8bfd19e1c513c30d6237d13f6a192cf9f3c3e50156c18e24d183997b8f6bb66d6a9f4546699ad42899e44048d002dddadf0cf7f82c71736f24e0f1523ab9383f8015bb405dddbe74c84f0d2e66fc51fa29432f77cd54e67c82fdb5c82b3e478738edd1cdbcf4b52e91eefda4f294939c8b4f2006921e072bea6bb4e1477ab0e6274012397c2313db36b2e99971020022c73df2e93170230e4c27e4fbe2897fe45f46431f45805f29b449cb71baea946ed16aec0ef7561e26bc888064ab5148f3762ea91e35751cb11caa8e39fbf7841a445524485b1c38e5a10bc04bb32006bbed40500d60ea146d9268d57a17f958a4845504acacdb0201efd3c5dbc8ab247f9cf54ed3648125b642819184e5dbff14d3353ee4b6178d781c6a853526552d3ce3dc5d9f0506481794589b9b89fb4c3167f554dcec35f0fcac58e0986fc0731a67c7502ab4bef85d400f5541d40e245a02c2fe826cc1a0cf28d56efb312f1dd1c6835e7514b923dd5373b22b06ed6790337042bf371cac0cb3766fd1a08954d7fa90469e7a93cf40066e1f4221f1ef0b23fd3cddb2abafb632694ce31384dd9b847f744ec80528a2e076a9ad434aa99a79adf8752cded5c74245745f465d3720150f73e9018dd291366166b87bee89dad4d1c1d650cce9647475154ea0a197b5d2199e251002cf72205b7de81e7656a4ef33374eaccab091507f9a7a31c6c42f653046a00cf814d81304fb6496b84fdd3c0a2ae42031d75a13f4efe8d6fc25f2484bdcb530bdd1accdc7a5bf8e8eea87a2af8de36127fbfd297ad67d1d4bdc65963b4054fea162c2d423145d44b1320ba41c94874e5700fc84417b7e6137a5abbb0957d3c93bf41ba727572ceb822e2a5b516e37ec94425b62591e7f05f5e3f66326a59cf453471535f350d0196e0d409c2844d4489801479b7d6ccc39a074ed69dff6683ed6951d712fba3b27ec4d4a72d844a42902ed6666295d71316ece7974d469383b824c62da68cb8d8644934d7bbdbbf1d14af83ab24a8d91ca41babfc4272c91dee720003e8d56627f3968db355096b6e9a888dbd8bc83d1e45f8352c4b580518d4d245cce1c4ec2f8916c25ac45e206f5f859e8194a73c004ea24d299156d32e129573b4a578baef8bb191876c72e3e85828707ff052bb5193344737d7c7c3eaeb66b3e5886bed96c8624fea658a63d03651087ccd68f1761e5e138f76e9ba7fdc0d1a4b97d55a58d2e1d6de08a89a871060139d3870c597b1d6f786904dc79bd310979840d8254945f7d7d06d0ae73205773bf6500b93d8a8ddc710d4618a1d8386cee33682759311952f1eaad81bb7e15bd973472d16d1b2ed00f1e6f6635fe94a597de4f81d729aa8bc41fe296d0b1eee02c7e7318df27fa9c812e191a25327dcf935ac55fbb8d6f3a3fe56355c6022af295676c023a998211e600d015e7eb4a3c7523c92ac04dc7e0f542cd2c818fe6100b65d5040000de7195cb02bb908d7c7e81be7fbf3bd3080754c1adbd2c5c981c59937597e2cb240472174cd358956838b08bc5cd9af2bf38609e1a097442391e4070dac10aeae9453c43fe64a32337ddb5d31d7601ec4815b8a7fce1126e468b33538ea2615a8e6ef59f8b7c4816d01fb87f541b16858bb84a028d3e44031d239db746327ebe8cc0658055586951a44aca410727287ab000848e18e9b487f5a8a00fb21758e222745e288cb41cae7b0b620559a369e0bdd775cc0cb978ec5fd3ade4296f160d5e735c1d446be1fd97a695079100531b658201e11248a908945cd95350b", "6565ac6a6363", 1, -173165032, 0, "03cbead52f219765a74b1a0dec1a4de550a73a509297a95a335a51079e99ef66"], - ["9a816e2b0474812c6e0bb3a4bb11021f7fbf306c7a25a622a000945142eecff0327bf7a7aa0300000001533e26fe385c0dd2d78c32f1dd3096bb3318d77c859600e10f971878c870d102c9bdb298400300000000ffffffffe1ba8d5d8d62dbbec3ea9938378c1bc5bf07f7dca25efda1a3c02db876ba883900000000086a006a00535200ac7638608ab7d1383ac0b3ba749ab7686d35634f55ddc71c235ca0a1e1f92b6dfaee33a0b7010000000651ac5252656aa9686b560419db29020000000001001d833004000000000763ac53ac526500110b3a03000000000165c9135f000000000008536aac006a6a65510000000002000000000000000042c85200000000006e516a52f62bc87737528f5d2212cb69c68cbde856c63f901576e99ff85c41062fecc19f51e679662e6bb4eb658f4f5a0e8f1b01d75f998d8ac8fb55bd2693e0b0a21a63279846273c8795d02ce8084379eb3b1c22d55955813937bc540af549000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002317e200a582c3901c126937e9e880d01f19dd819bca7406013d20a6f94b3e581cbbfcc7129dcdd63b0eea8e2624e136f72e5c2ee4b88dbe591364253490d8973c54b5378b72630a432f3fb8f936108911b6692b7f93d84e3173b2ba2b9414852c2dddb1bb97009ee8dd881694efc40cc8da6c8c56c8cb26a3fd663534ae0aed030d4699cf9de9a1d6bd1cad403f35e57d5df799e97474bc4ca07d2ad530bb2f9802048351dacf1126ffc0fb39a3486e073e4aa29d8c76c22a401006fc47933f640e0b024c735fc52a93a8ff987d99fdaa927db716ec9401d65ee4e53e279b322faee60dcef2ddc23a4579f35bb3c9ec713927fac7d07bcf9a1b58a3642cb4cc8f6fe302207150adffbc930825ff801e6e8cf7e629e1268594233cceddaadcba0f0c9ce90302c1430eff13829e07cadfc65f8ea02d1545ec3408cf022737aa6510565973300221ce2bee6c128b6e2077fa807a271a0fd5f90fe7e79a70e1b61f4bbcbbda55bc0329534d1d89cdb6d3a7b648dae8b41de06d695975d2ae85734bdc46e03e6b59b70319011476964cc0cfb3ab5c798e5d61be8f72a2789f63052cdee24d38d6b11caad761a8ad1327237a9670091c0529e71727cbb132374113ff5583a3f9a1108d16b8490fd71968289290f4438ce81a257990eba970f05b872d725c4808519e493fe6d75e350a720788d1c9df2b266c845c6c38fefb598506d93926178fb3bc7898dec267e5cc23837dd1deca754bd381a034939ebcd850485cc6f1ac47fcc3db09e293d5e503919d8d0d917136cb19657b77b826f10e70505d660e2ffffa5b03954f154914673adfc2621f2f41decc585ce9b7e5b0a873682cded8f32d1ab89552b751b7d8843c40de64cd036b602ed385366f341b86aa6a5a520b8df7bd0ed525e433707d7d91ccfbc0faa6c11998c60d7e0b1a1acd00aadf9a4d1c21c49ffa2267424f1b77ec27e7536428a289a16ba448f899f23e1a2e0ca38fb4354d8515e8ba31d77346e230c3bf27fe31afb569d6cf1f931f60b33106148b1ad8ffe36d7ae4446c76697e45dd58e9b99b8dd3fec8c41f088f2b399dfca3a1d05de88b21d30c3c51437e93307815ecfbb5306b343840b12963f4fd1bbf8cd75115b326a1b7b62ffee88dd93be70a7d88fa63b10fd8e52b7564e2cd76cef3cef6c94ce093a2a05aed6284f0e65e7f6fd4b2ebd4e94c107ceeaabdd0846a4f445e6ae86b8a4b289a6ea1b480848b35ea5c009b74ce1af7134fd535269ee4072d54ed1a3f22d6b044d1002532ac201ac8a20f84e5f6ab0c00034f41fdc9f173530d797bdd38395e168cb13361433512c11e03900421be057a97c318b0173aa4a049da3506348ff51564b20b8efecfa6676248414f9e24a8c8b544110441ef6d2db5fb45989d7016005085c6e51170cd132db01f04d270a9d78b1e739c543f5c725a85c5f73d587a211eee41e06031eda9cb1f92232bc949ce6af30d8c33b7813ebc13d7f79e576198b1a038e02a1c93852a43a3e9ad96dfca6bda5b0de72994fb4ff781d44c05ab5aaea05092d687f795e38cc016e55a280cde38f490cba9cd0343a9c17bd2a2f06cb37f357acd27af06c73b3397bdf705aff9cdefa51f49248ea1709a69d33954401977d3a5c0e174a34cff22640ad946b6ac23e6c898ba0324336f2f35d3b46cba4bae141f387ffa4b9cd4ebfe0611886e2593248fe6421e301f818f923819b98a449ff594222d1d23554f79a023dbd1961c7ffa24e8a04470e2c2b449bbc2b14d51093f806f78ab792498f9d3f48b5a3c1d2ae5f126175246c69a53f216273b904cfd35c455873c1fec8c02c74673980ba679c901959ee6c1c9c62da1e11e20b8e07e56b9ec58b7c4559236de2cbc0df545292a647c8cfbd3beaeec1e33036ead56cec0dc1a8f3e23d15c12adae0021534700562737cf75d3192811a807367d6f800dc148d4d2d9aafbc377a6ffba9e88c2c0d1a2185d81f1b7e855a6c9976ad87da8fcdb08184e5acd601741d1c9cbf8633f73ef1ba61eb51bab087603b8d4a69e93842a785bf1dfab76a89e0dcbed97383474c658d9c19e1b1d10a14850da34502a2cc7ef3de4640e26e1de33cfcba3b98e48bf1c70031bf21f2297053783ed384ae84f011dd301493a880352d09994ab479e89c7de84b1d9599f72097e888c1e885331c1a5b5fd979f44b800f46048bac3be82f171959eaa645cf357a82d12403b6b30779cfd5aea929b22cbb5f586ce4df09e7b9c819dbb2f6b901fcbee848f7e4e0be17a6f5b0eb0007466fc1456000000000000000074715a0400000000c7d8c353e029073c8d19d03f780a005425d717d03d09dadf8e8d5b4970ae7cc025a85752149352c6e8eb298d5cd45c8042fbad34a97f59587287581cbb81d0cc5d53a3afa91eaf375917dee97c7b3dbaca8183c6f5b1fc0f84a6fc116e43bf7500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d4cf884265026d4a139cf6b06e5b1d9586a024aae7d5d9b5c8308cde390b45dd6d3801c51018ce32495095e9b9f629fae366a20ce84ca24b766e135bf992977b6039a35f81eb4b5033f5b23d37df4e7c0bd05eef398dcf579733671fe013a927cefd52f12d47aa8f01e9a51c47b5bf4b95f6e5e868148b8a888e3bd541c2d26f021e9b36bd0d3f00af9beeb2a55cf18e507267dacdd4ee7ae21e6df54564fa4133031b6e6463daff57232bc7f0d8e82fab8c5f27c3115f0adeea30a35ca461bad5ff0a01046d647e79e8338e1b6bd4ecc21cedfc9519e56fa207586051ef2b721cbe3a34125e12d74b2eb511cd515199a306853da8b1e23510d1c366ea2cad5daaa90b03226e61ef78b512d378124f8a629d0e536ec152a1cb0a7ee9bce52757f561389e0307a6c454b8640214c255e85b835380299ec7d33ed9039cb23a9443c7cd82fd1603112267a4ccd5cb2a9508e409f6cd340c7c9611a2fba1446d4b3d4b748cbb0658022192904708145ccd47937070e45e5dd137aeee708d3376ad3cd5a5e08896fee6021114525b778dd5c5a7a490bb53d51183771aaa4c7928cb311bd2d591b6689701361edf8586b43e110319c716cc5fd6d80797c974134e42a6ffbd2d5848b831d19d4761f9b97e76603a1cd0a7ac547c7327ef9b36352d695a82f7facb145ac6a512459741c2e711136d48cd41ff981f83dcb6117b2d04e29f3818257682df136991e8092f886b0993d4abac46d2a6f16ba85e227f7bcb8d0b98dc374575bb3bdfe134edfbdb6dc96eba7d6752dec64ede2ab93c51d5b7827d13a8d6f1e7c4f3eb54e8a39ff4000b9a479aaa26e657c32194a6ea5c9acab4e9cf648933bf45023e998be1564358e3bfbd201268ee1c64222f38248fe432046a0ad52d11134175d39411d9e89540dfc087612fa5368d1d260404cd1516a07944c7fe19b3cfaa53ae41a1f310952b00d3f8607351170b60e91d2949a421c2da6c2b588108192c768eab456178206b00e3e5df5495dcccca05920602a1ee628853f9971b0ec4ec6e510a76745c6a2a03f8090f2398bd8d84a282a2c22106b9c937ff1b4e673625b1ff8b219e5e176d69cf71071c2623ba9ecfab2e1001e6600d1ca8416522cba2fc21cd5dd62b58abbdbcd223bd522eb5a2e2d9629d3b7ed6646aa674ba285e4eae528bdccaf4404e3fad48df808db5e949a6b8e6a265c3246732bd9f0696947d1146edc1bc27323f66b13091713d680f597af21dafce1d9754df65b0a31cb64dcbfabb291c0fa63ac0ba2b47ad884d36d9dffd2f9aaa10d8f3cd17bd2bc885f3184035b0078c22fb53595d2f06d826ff4713fdd2cb7ecd190a4e3a7807dcb949f84f1ec4249ab3e002197d25df11b6e5d776a300ad11a90fbbfaced62f5372d1a6a7041c573541f51de5510f3609ffcbcb6bfba3dc8130c69a37e510ee411861a7e8c8f2f7fd0c5a875b02b524398d65c0b6c6e4373df30a3789080f5d11a853bde7201f6bc07908d8e2ac5e6f54d30ee3141fbe7bbe7ec185f6d7e3cc6fc02cc280b698f545c7f132217882a97c473629006a4aa6496f2dbaf40d8751383f3d6e748d5f4015fc9f5d8d35d03d0c0e99891c08fe4bc75d8df07ae4ec8a8512f0213527c94b5616222852dbcb5b4b2e150f600748a8d8b75742ccc30a06c69b01b6fd5165f0dd7dbc3e150476644bab46c89cd0745688a3b1a6ab17b9fe824aeb5a316c1b06aaee6b0fc9da73595b5c0ffaf93e3807da35158fbc0de5b8eb8c49577ad43a08075c713555ab2d0e9ff9128c36a21bfb7ef30c545340dba62479abcf96fe748096b4f39493c261eddeeced312e54717b639d7cfba675fe5a82f2c1dbe5adac6aa47ee6f62ae7390b51198e501a26a5fe9ff7f833cba21e72c182c6af6b903a418a31b7c037ae7b68ca6b5955624002a1796471b87d92c7930640cde9e4b0731418c6df8936c26bc10d992cbce66a733a1e5c3678875c5aa322918607bcbd57f330e944af5324f0303afc7699b659525c7eba20aa91635c2c3a0f7bfaa10b91edfd4ac631cebb0a37215a9ee1bfbefdd6c7c713ac148402436b44412fa3e21b4a7b9aee5ea726afcc75a2fd823417e5a4f3332796668299fd3379d964e0643720ca1a52f59884961b3f169692d93b0ec57c983f83adb7390fe4d02f53438679cd2c1531bc2813a58f7349210e1a405cf91c3fb231690daca3ba087123db4fdda21e7ed8f664fd02ca9331255d9682d0538104200bb2b14aca99dfa53d257e2f68fb04719d66bca9c48544e33c24e0f03d1ebd7d36010ca5e226005c2ad8a99973a582d2a32ecd130881ca7991de8fd04644746a77ee2254d15c1873950e43b76be498cbad9768eed40673999a25a5ac360cf313b7786c13097d1740708120b4d20ced8d72174f91932d088855944806", "656aac006551535153", 3, 1275578156, 1537743641, "12cb988927e33164666f24494d5afb7456d37d3a9f6ebcbde339081e8a74bd24"], - ["030000807082c4030491635eb9137c3a686402ec888ea338d475fb9f5c4825304d77508f7982ed7e9b030000000153ffffffff1cf4a33c87d93dcd32d50b4a9bd5b8a770753c5c0f0c499c4eb081c1ea8ffa14020000000151ffffffff4dbc9d09ba03ce5dc4a5fb496295849e99f14b8fbe91e08d20be9cd57cdaa7bc010000000951ac655363ac655253ffffffff08c523155287d8208bacf26a4f4027e95542996007a3980d160ed08764775aa4030000000400530052d38fd0a30374dbd1020000000005ac65ac00633cfd6503000000000900ac525263ac65535226dd4505000000000651520051536365ddc30600000000023c065a02000000000000000000000000ec6959f53b210f357f400477abcc1a57c24c1bfc9267f2fd74a00d9ef476be9901500a292d043500a9ccab2988eda5f01090f166b061421a414136d18d8c8438bcbfdb2b3492b5457280852355d210466d293777ab36c399c9c5db3dea0a075700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e7d55ea8f39b565f6af34753cf989f5cdb30ee3dbeff857296b9b2935eaf00ffa1c7645319854be62f35e88a22817cf23bbc2634c1f3071e321598a333a3d7eb59df8c22edbd37be2fe5a6811460098d38db9ea9694c89e1540939ac56f6736a44a070b81f2a39242c60255747e54a15050c5f100e0ff31153e95530b5f50388032ef429ac4a77b16650087b82d125bb9dd5980356d1fbf72aaf679e6949e9def5032b1d7b49435972d27a7f005d0b3b33c3908da917d48f6807bd3a071a1f1d06f00a0335e08941fe31ed29c16bdd0e346f8ce9cd3a3188d7b95bfe778f596e67fe1f83ac7a8538c76e01d4076cd48ade0d4cdbe89fcc8cf72fa20e3499bc68e98cf9031d2c3bec87b9cc8c5ada02fc4911baf35336c25dec067de71b83e28db95895d703194a7afc591c98fc6b49bdd96ac12d952792eb5fb7c4387a9b7feaefca7eee61031c29fc87c1abcd8194bf4d45d9d4533233a6f0739f171f843881d4a54efdaab00217cbe054ddd5369c901e4d8cd07ab962f94a38c19c898a6f4bc51bf8be4fda6c02120db275535ab52c87a5e341bcdf2f5cecb0fc43e8b3297945bce32de8c8acd3119e77d81e3eba0655b0583eb5bac21fcca72e2f4d19f2995aee666451a3163bb45d08cde530d5b81053a5405d35d1be08de3cb616e16e1831a3be6eef7ba3b80936de457d39de7000a18d65826a28b1441afd410702e07f275363507226735257258a908f02b9a184c4809c08541b3bb3b44c5406618f5cf6375aa4f8306ec50248f23551c552e2a30fb5486b3d17852f9bc773d42f5583122dfc7727266e296b7c542f557a3eb5a2b1225e6fbe4bab9bc76da63703905bc66dfaea986be51de59832a5cde33d5330f72068d11120dd151c96a3ef6f54e86137e8d5ff774726ca3b0dad26e33b94bf99ffca5f3ed92fc417970cffa4efda54638014983ade75e746d18f97d5f0055c040d4cc511499d0a74bf140767211de7c98779a7584a283dd27b63a359ed273f1d47139029f02affd1afa12f03c4b79ddee2bc39fe112e38b597fc7b3fce4c47552cfadd41c6a4f8deb1f40a58a41423054dca5f84e6cf71589a0cbb2572e11c74b5ce609ca11bf501bf5b3f94dc71485733a0fddeb32981e39aaf47c68074e1dd07bdfb51df39ebe0c31b81b189e5cbe195e15ae9da97c6ce253e8baa5ec5cca86f5f917b1c117996690a127de2f6ab3c85ac13adedb930ab71455016f47738a716484342e41f2ac4cb859754b19b68f870a60f68a8955815cfa2ac337e1ab6f747ac7b4d60d9a0bdbb34d9bbc182018f1b574ab798a399cac7064c93709629e4d1e43c48e42288ba58995d2ee3c2266331a78c7a1d61483abbf9876f12a10f034b0b45e0f11a1cb6ba328d773e5e8023efc6be2b4439c36d99d8b6d405c92e30fc8fb59b74c2dc473ec91b28269089ff4783aa4660da8e59b2688bb13e94bb71ada53cf8ce9c07a802a5201d04e62e8d3780991f2b387f657382c7c513057de7a041c6678a1b0568565c963c9c7a9df4351d742718fe91c3773f5c9c0760892ffbddaa53324a1a5669b0107ca0112030772a432170f0bc1b25017cd32346ffbec068f013bc7a31a52b56a02c5e2f8724308ecda69739142f3e1f8932fa451acdaeef5769f5a9d2901c8613a41d37f0cf248cbbbf468f8a5d3c4527d888312db0eeeb8c4199ce074a775b2ba0198c0486cbda0f6994ff68c5988a3c77a7305e80fc495134f95c03be7d783f57e93b4bdfb35c404b385e67f9473571e409f50ddc0ceaed8fd74dbd0d77ac4afd689f023246fa766b5f07e912f29a9c361a4c55a4cb49917b3da6d5d4a8a174125702ecca15f3efba7397ecbc3b2fb31dcfb5fbde75a6cfd7ea81dbf708ccf54cf8baca37bbe725181f9227818d2e1423a961e57a6205eba5a4921e9eca3e1975a5ac2a14d5f672a266e3db8bc589baffecbc076eaaff9fde391ff23d79608772607feaa9a18e1a2d0f8e81a77389560c5d73e6750db3be4a661e3b92365bf28bc303b67a4c3476b773daa014d4e16b4cdfaeae326f3806e18bd828a852c562ecb5bcd4e6ff22394b0669b30878f4dabae261d80cfe8b8d3410c22e6c395536935197fee47d1945b0b97ac76dca3d26e487223fc21c8021f18ae29ed93713899999d744cd98e19ad179d1af791e1f4ceb6232a5c040ca885b4ad145b4b6d4e7908f8457a2265ec945153f9d7aa335e4fde0cf15ced296bc7e2da74c184aa3b2ea03886aae6095fc3e3981344e9a4c24aef44cf87c426767d050d329687e7631030000000000000000000000005263f00f6600d006961dba0301bd1e1dd563865c1651a4fcc1b40bb376c110d728eb4b202bf2e062f43e9d76d0a5f87a79428bfa93da80a4d0188160d6085efc74286b21ff676754d3ef1a2be7bbf1dcf48705bee7e80290a29deb7bda23a1a100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000310857caa3dbf90d83d6ee42fe938cecc5b239be7d965666a9bad346b2e4948e8c5c918c8103c656f7971779907aed1aad7aa98926db4200a75fecc2ae25f1563608c88dc1ee51ae1f98376485b217d70ad501d10bafa81d43ec29ed222cfb2d7527783f47cb06033b4bc79e6ce06046ba4fae190f8cc2c1b6d93ac2b4c3ddac020f4df3dddad032a52b6ccee0e2931e896b008f4215b15d9063f144ef6189adcb020b87a9480a78e5f7f7a58abde16e0aba203ea7853afff87afb271d2ea6e301410b079a456b99de344c76b029727b4780bbde260568205400ca7cec50b61e7d2d566aa2c372b29701ef361d398f52bc661e2b6b37219d8d482c4a5fe80793c7b4c602230e146bbb293e26e6ccf7df4433ff0dede9d2538c0edee9647f12091b8c5f4a0219f33ba001830ddc2ab4a40afef1aef6938002af9f319458d61cc5bd588bad14021cd9f13f5aea1558c47ceb4fff9318c3dd9e5b42f19a382b2ad25012a31bdf6203036126524a142322bd0a03e31c92453e6dc5dc2d69cafa285eb3152f624c3bd8032ccfbf4e8b8eecbff4cfedec83c51abc000d782ec108d86c2e65ef5dd9848d07e206a8c3a9c5f7e0694b23de923b19c84b2c351b00a63693d26ff7707eb5bfc0c478b5beb8fe0f848f800352be080f69e1e7f38bb876d9651d158cf97808b81987271f5f99cb73a1d83e7b0c7d92ed3a650e77c5c0569b2e33e4d64f010f400a2bfc9ba9d59d6541a07ade31360e5b2302d5fbf9b462a58bcae466dc4739bc7ecfc947fcde7dc00eeae3183a448c9f8c8e0af3cf7da24eb7e857bf6f5f0df01a4b2c92bcae7b101d5d1b3903881106be493e46f597128ce1cc1eeb5785410582b8baf856f1a769c90a32f4949af1a32313decab9e8049f1802b5342c07ee89ba8aa2af2687321fe31cb5d77e26fb8a36416f859fea69d4b26b50eb94d52be900b92b08ef29d7fd15d729bcefcf928f41400fd0dec9e3aeaefef7787c7b240ac4362558a330863e0bd853d5954f49de97ddf60a3203db748085ddcef36e486173f8004029012581d402a23fad618e83ff0ce3761dc0f29edb1ff4f849efb447b04d78f99468260fe4c5642b6055fee3cf66615fe646151e16102a2178d35a2333c99187d280b57da8553d2fc88dcc766b451590a30277e7ece2b7338c43cd407755da3dc084fb73294bb8b7386117e1bf35927d3cf06cf3ac12cef231436996770b99ca1c3d2badaac064969bc47661c092f1bf5ff1acc5117c74b0a77ce647c20eee16d1633065f278f5c2f4489df9f9f6ebb73f00e87866273905336c9fce30a37e77e9c16324d6d88cc66bcf210192fc2676272817a5cb8b72047f63a725ce5acb2819d96e563850c84b1b64c7c5c33e96e39eea014df5d41d90986ba29d5f789d9dddd21c5a7d55f340028fe18cb1b413bf23e6f1a22e7d58bfbdd118dbd775f6da3e41e90f992d124c87a57383259d7f40fe6e1c09c762d31fa8afc06a565b6a46a183595cb4884e5376d5f7ad0c3d50b2250ad4b781ef71098fabb5118e409b98bb7496541915b698b6ca540bfe910f81df8482d9d21b15491560bbca852ba12b967d61698f4ee63be3011d864ba513767a1cf3f79568ab35511711facb37863c8486a4ce6468f7a559cf3e54f59d6daf7769dfb2cca24b64491acf0bfd51d0542913fd832578d60e4c64c16c425332b49c993c236029d0975237babf805d3f2a9462cc517fb55c3638a05ac53b20bc500f8efeb41caf27a9af66e2b4bc40b5ab22b3ed7cc90caada1966234a1b58ed2213069c7e3406e38df03847587c3ef2ae002bdb235bdcb939a0b4504adeba5b2a231810f3032abc09e13af62106e064caf368b50bc4e104135727c4eab963ccf3805097983d493790f40a0ee4e76317d82d7ffa1d1af9337c7c538bca7d44ef93d4378a9234373cb7ef21fa85be3b1d648c7fe35c93ca7c99e6ab4db6ae79efcf03ac7506b2c50c2b66732780e706e0ac06ee1b902cbb117ec851341ce9f664b7de674f6eedcb6882799c7d0644829dea99c035bff008f655b75b5bb2a0c37c077f333394731473e9bd41839bff9f64145b6d3aee323fb3681a9c25c7f8c8206cad392aa07db238a00808f4297bea2b8897c0a79915692cc9c2212cf6f3f6a4f8de6c0c58dc276969b6254e94ca2558978ddbb511be0165540bb56c24a1de0ab2c0de8fe83861a5f07060042aa3e8e485a8e02b305597f3bf09a8cb64c98b1d78393875c4396173e196444c13e868d101eb26d3fb28c902b34b24b9daaa4c4b3c9d6bdd90ee621c168c8304882abf32f07f16e160526aec4e6bccc36d552f18bca2ac614c9a9d49f096263226677e928b29eafaafb20b59d3e0793b1e3326dfb5e2d5122a852d15c3f893a7a3524d98e9c0d792c4209ae532e972388320b003", "51", 2, -1884610699, 1537743641, "94e2abf3153f4d9dfc4ac8f36a6044780c25625839b3e0abcbabb2a111c370eb"], - ["fadba90e01d0427100c9270135ca139ca1ba4d404f6459ca83e59a132bb836433b34b751090200000002ac51ffffffff0370cd2200000000000163623b2401000000000863656a510053516a471bc5010000000008650051526352005100000000010000000000000000e863330200000000b1704611a66f406637f5773506911e95ab45095ea97db6a032fd1c609acb8a44d0883e61795854da3533d80dd2530e54b2bd724d1c6dd415b6e680c8d4f8e716ea47ebd9367a2877bbb272992900995596c527e06ae40dfc27739a83ae9c72d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001510ef05fb1491ee051d0bda3c64123b9e85e65d0b3c9e9e71991a6777aea2bb93534c2acb2319b5f008bd709f0356bda6222f26991baa755bfcbed9c31252b99648ca715948faff3bc77ab066526973b7f372034768f9611f84c307c8b772c14b3a1d2a4bb31a482f63267ddb5f98a044bd7724d1f831e4d62c1bf74d15d43403043f890e4cc7f17936a101c5b48cafbbdb12653502577e19f14ad163c325e4b8031791cdd34fa88ace397e04511cb3a2b644edc95d3b37ead6821c4ee201d6783f0a02d15bc3c5ee18be7aee72e15cae3a69e15fe5ca486bcd4da42a0a4362596f76ce3885cdb08bf0ae4357b984584dceb14178bd8d9b51cfe3ae17cb8f52ce99cc022ef4ab7d0bf7a82533d830be9779f5d96b57669948b1bd43150d96e39824ed19021ba9a67f47ac92253fa83a978e683a3803d991c81994f9318f580310287bf6e40210265476d7c2d6fbaa7393225f64b8dd85989d896a9c4f26a2e4205df083f0890224277a0f9402282e28bb13ca552ecf600f997c814713b624eb2c48d4b45d291d02182d72119a5d8e25c9855b7cdf8c83524e1807388bc3749823d413b3dc87d6c370036158cc1cf4875b66848058415b44eff08702946d28af4041331fc14a4a3a4d1b2c9df80151db59f23c36d0eaaa81874ccc88ff2d7fe0591e272c314b5a99b89b3e572e290c9833e931d36f01cba25a096356590be3524f4fb4fb7f23977b5b4a7a65ce69b0269bec36821c546a4843fa886c5a270e7da28f9440a454c5d8b8d7ea1ed08a09f4ea581d7fe0f9e2b1ca0354f4473df67f9b956691a08854fc35decd4d9ccb7ac6e61b67766f1299f6520416ef4c0c7862da4745b65bdbc97524b5b8bcf8bcb69c3e4fb146b6dbc066a3584bcf47872d4b736659813c5edee1909ffc76f27bc046b11f6fb38a474a936be2fb9d5b6f55067d15cbfe04db683668fad14f52916641488b6ad6108b549334f478fb703d729afe21f5b78d37ab33b02868b4cef6d04ea2c4d93fcb3721b608bcb81df9efcefad170919fd6afba04ef575d7e918c87e1d253652a375153184321a94838e0de8bf7802eba95e2eed44c3c0a5cd683f21813b3520ad07d8bb1ab9c50cdaf89ccff20a242913f75ffb987864d6e80bdc4ce4fbabde48a0c00899bc2f485499c9f01eb3cc31d08736de6333c3bf4b4e99dcd74a454cc75fb8162c003276ad7421e2b22d820f952c59d34caeb0f66a4b6dc3800af1882f35ff7b1a77ca50b7dfabbd8120a04b85cfd886f0f91174576acf69cb46dc53e8c9b4d392ddebf2e03e462862f3b91d99d72ac76069fbbbca531bfdc06477f89418c7a4fb5e8e32808beab4110b7bd02984d0addf2efdf7f6621415a808b2b06f9f6f913939c60dbb7752d37269063f6e9642ad0260c60683c81a97c624015c81196c76b5b028c1bfd130f139bedb3da058547a80b2e098e4e1ecb312b278219365ed52b4fe456c7422baf2eb4b8b0458d1c71ddb359ee087fa793e76dc7a2babeb9b65b36b3b1b8d11dfa5b16954a8649f04aa4f352aaf5ca05de9f4dc17cf84c318e8bd1cb4f7b86d423420c81c7f36c3414b6e83be23651e893527b71b242a7d1e629b3741100887e212f71a22c7f51c3271b19ea1c31d31703dfd093cd6ee99ebae9823653581bfa1ae68d69178f5d80ce850987477682a3d8208c74bd1dc94b5434027e48c530765d5186b44541cce387347926494f063fcc875364f7aa7564b39bbfd7352550182eed757afb3f8b901556f3f65f5f5e3dd833b66ebd73165e5a4aa4e30a2ea4f70a8f20acbf792f4bdb67050be2561e3a39aa21406cf41cbf0dc40de822260e7c533d7170c9cf2e5b09b70e1546a105bdcf7c8a8859e17a2cd778543500c627a0ce6d91fcff16336ce3c64a603b5df3ea83a28d9f71ece6231ceb6117829300dd8b88c71274ce18260734c48acc301150a13249c2bdd5baad26dec2b85aa18f522fb5ca8b53d69140f44c1043ae163602d04d6195c2e17af24dced4b3533df6714920be81f19bb35d1c3241d9adaab45008fd93823c934ae832325025dc214d4cc5ec47ba71e9beed0f034169674ea66ac234c5fad216e326bfc4f0a24be3aff899e94994cfd55565922ddb2ba33a1bc94731af46619a3b962832d230794a2471c5cccbd6abc0b41dbd4b43435b1d3f3626d1a8e1f2c14db1bf6803436e5a193c0c7c5138e635c3f12139e8c5c414d46090efddf68b582b9fdc91092f3a7438bb5759f2d656adc4fb57f76db857fefb22f685083682e09900493821f028c69e4c2c5d5f1d13a39981ccaab841600af83049c87773909948209e131e420430916c47c723264293b8a67136d97d37b42b060a255b541576ebf7c9ee2942e9cdae582aa0d1e6f8e89807376444492a4b2e0a2a14f4d4264b45302789940f", "6a530053ac656353", 0, -1761066051, 1537743641, "c73f9c8a0a6ba3964fd0f8e828aee8493edeeaa7791fe131e30972c66c1eeefb"], - ["6b4d0f4e0272290bfbc468e371a9ab2220392cb972c312e3bd199e7f5647ba3198eb68a9c80100000002516a921afe9af0e1615995aa8ae6c61310ddb0d451b4c4992c7562ad14ed67a20ca43d8f62280000000005536351006affffffff01ebaae303000000000700ac51ac0065530000000001a3807b0400000000000000000000000015be29a8c6ee467e8087b93bbd8bb32c1332085a25cdf4b522f60ed453340c92408f064eb8a0ae00d22061e3650268f65c03cbee234b1f0f348535f34bf65e5504b54957dfd9b69d7aff047d2046b1d8bd5739b7c0036689353f83d5e7faa9a300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab22c1469bd9f67add3930deeb4b285feb8b62c5960cc7f314947d798c871c06d9f5775d94753eeb4f2934109326982b94e8279a83c6b8c41183ef7a4cd47ab03cdf1110d5423e592c08be519a9ee36f0fe1e45ecce72090ca1338681ab31da61a75437d4c2389866d61137b6ef489abd630fe4b871520d32995618493078a2b020ec59d84b7775c408683bc45226dbc775a6c54291782deec9a3bf9e8039f8d790201723bccb9f7fe81e935f282ec0348f42bca9bd20adc5929462d31f445300a1f0a01eed8fd6d5d38f2a32589de950beacf4a252a607e29aefbdcc1d2b0ed2d86d84307281350325a93275d2d1df1624fc2b4391baa45dedc9ecbdcfd65c72920da022412defcf8326e8460a84972cd332ef5cc7687cc012244a2fd6fabcbcd7477e2030f8084e24bcd4cb998320bdec3efa40da596600c9c4aa96f71802fed4441cae7022478ca00054728d27df3b6c61420c6d9836b6570a7365880abc2ade8c149e180021db1a888698b2a807e37abdb53c92868d796a6c44254dd051b3f217fd9bb2657031b4dc2246c56290dcfe4bfae2c341264cbfde91fe28602173062c3852175eb43bb1161f62f510f90f2273a6d887e4c82853b0c0b1182810c8dc15b7a8ea394f1ebd9f6b294b5a6c8f0fa59772f11dc4aac305f311d4b9c842107930e1289ebcae4d6a11073a411aa28b6453902f34c22d8576c47af4896a0a45ce5a36514c9f9cea7d6ff386b63e97e1c70805dd82fd0af3d5fc60eb6931e26d6c5f48007778425cf7b810a9c5eda6a0658a3ef3437adb5b9c205c01c5b22422653683f8e4505084502344ce26d82ce7ba2cd1b270007638ac06dcfd411f38ebed27e7ce5e24c6c1d3502ead525d8c9e84c9c6ac4fe5f3db5138ab684524e9bc30a48d24037c3ea514dea27f05614eb56c5c221609b0e1efb7cda1d5332496d2f062beff0f8f045fa6119726ea76c54180d730af70ea935e0543cfcfc94b4f4646e693f210dce40059d009ef6f0ae1d8d2e02b3ba43543aca922959acb39d2cb2e101b5e006eb437f62ac90c0bf51816c331f46a2fce6124de4ceca6a1f1cabbc53dd7d3ab35dccd95fd1334634f189c53e0b19e15d63735031623ece876e43d314609a1a0a705f4ace366524af33ac67ffa021eb67bc9f92f977349f76e9b698573377dc845b9b62bf587f4ea87c9d20d3b4617d27d802055f1b0fbe4689ddb419dd8a1a86f0ffca9c3c8809b4b24c3bc482d6f4c9d546c303bbe3d72919a6224d6f43fe949e77ae2e7963fff2e40932f0f5f890fa256a438e7c3da4fe1167d33da21db97130126ed7b31dca209e9b7252d14cafe1b4fe6f0cbb762c1d7d7cc50f670c2c47a4992351ef32f6e55fc280b413003c72a764591c92fe17095893521bb77af35d4098bd7ee7349c854a4e2a2bd6af1653d38408bac28a206d3a8ba8667d877d95a6c5dbb8521e8e9cf17ab7fe36ebee5b71c53a88c824b8e09792e23f143f87411c5d6e331898190b7278f8d70adec7522698668b27e7f26406e405575dacaa07fd0515e6d575fc5a8a4659b51ed72f5fdacf807daba1a4e2a4dbba4925c4a4e9c9525ed468c6dd1cc01dea730f6f0db59070e0c6c60d865d1ef5a105e221b7c475a4afacbfb3ed6d80f24f5e18357265f9cbf70518c5ccb8ee7376e66c6e7bae9c75fd51e0dd9b7eafde0276b19d91cf46cf786b6bdf19cf21089947b63f4b0d64046214160a59e3cd6ab747407ba4a4dae42e1b3f6941a701e68df527b11ecb736bce926ab742f198b21e04358ac164243731d67dee2c0a02d96f866c52a5b6e0131196cf197f2a4ce0c734b3a403ca30ff1dd26496e06dd9bdca38f16a403fa1667f207e90ba960a426f339133dc56ce6a5c074a0e8cca54f3b2da200c7e3f610f9f0a0cdfaa557f54212c375cf8943bdf4f82e95a63a9565a1f383821972cb99fc267f31aa09f95d2baf588c2f764404f4b4a4eafaf4e1189089a1bd63e407428c88de1495d6a715dda867eac5f4fe933de97e5b488962c9a6af92c0660ce12a8d4d2ecae39f35de06041da1a735e192802e49b5889a2c14b0d6d86f1eb241f8f7caab927faca73fc818e4b57a019baf6f942d52aca00366073a4a307a14d952d89151cf1f40d5075e69430fa516b68bd189962412fc4e388c63320fa38a5419035151498e13ec87f5060954aadfae03a511535ad315b63161673cfa3d7978e27733fe3d4b7a2fb641818e26068bc4b08d4c7eeaf1e5077f12d2c3a801c01ff4dd30812cd38d89d5b1bacc6d13f2300b45c67f90726bc370e63a4b6f61c4e004529f93d9a08a6c05ef4d04b799e572cb322e2829ea63f887d984430ddda5435f32e4cd6546cd29f8ba8de4efb169b743ebb7b22dcf01fa6890bc8993bdffedd028b6bdd72efdfe5e9056c5c651adae08302", "5253656563", 0, -2125964044, 0, "8299ff2ac40693b922f5771ee5ebdbb6e7c154939dac4688bf4ef567f59b96dd"], - ["bb02d53f0439a61c4db6ed60bbc0ad99a5ddd33b0cb7229c124b03b960afd2404b59e205ee01000000016a9ed7a42a08f5772939cec9f061cca28aa6a43240fb75371a8dccc7a1ccae24a908ad91cf010000000600ac636a53acffffffff5db973b61883594148cc7e2be1ca8a97493509a95525b73141c99af4f3efbda003000000065363006a5352ffffffffbed6fe02183fb064275b9c6a01a90a00e9b7ae35478857a07bc048e6bbcc8750030000000752ac5352635363ffffffff04e942bb01000000000100e54a3b050000000005ac520063513f9a4305000000000851536a52535200515b5821000000000001650000000000", "6300", 1, -1143824940, 1537743641, "a0b44c2e32c62ee51abf0b32bc5bd10133f05e33f4edbdf6cc76676bbab049b0"], - ["31d5eb4003c2a184cef99442e04e6dffaf0d1fa46052ec9757f8a481d74663913b9d7fa5770200000006005252656a631b3942f2a2c4e8fba743e3fe3c3fcf865baf5301972d9c0d51e57dbf91f83c8080b8d6df00000000046aac0052ffffffff4844d4c50d769341499bbe26e37d261938d006120dade1b0f4298ac93244ef530200000003ac52acffffffff01dd286c040000000003ac63ac424ab98c00", "6a65ac526a525153", 2, -1226198225, 1537743641, "cff2af9f9e87b462560aa8f51f874ecd0f04e52dd7a1b5d736c41cd305f8ddae"], - ["be6e051b02a836e6e06a9432995c214edb435f8b7845165e9f287b0daf10c3720aa8dd0997030000000863526a6352650065ffffffff55361f8fbee1106161125a2a815d50972823a06a006cc4bcf2f42e99b57418b600000000085353535200636563ffffffff03eb7a5702000000000752510065ac655258205d000000000009536300635100ac6a63fd9adb0200000000000000000003f5269204000000000000000000000000f10c095497d56e9a43b34a30c3d61897645e3ee4191974fbbaca4d7ee20039f7087c5479b08f5dcf2525deffabd131bab7be331d67c2ed4fb3bc61cc1523616c64059f54a1cc74e3c895014885b7f417f53bdf4f8d5ac3775533c3ea7b00943d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e4d40693480ed2f06758a02a96255a12cbc4a45e276099dce976f51e0d5d9409bca81ca1421b64f846ac645dbf08fb2369490eb7566912e51c20ce21ff0fdb144b2da0b14ae66d9c08be95753b757d7c6102e0578e568ea2ae8fcb3c6ff4568c137a0fc9bb3fc4bb3c0d2f29b3ca2805a73d5b513924911f9e6922524b4c0b3022923545af4dc990efddaf192e33254c0c9b21a154664b7c40a9c389895b89c180207d1f6c32f758e19ffe563930a9d25013f78af5c0dc2d41a1d3c7b98b16e29be0b0054787edb75c868274d2883f2e62af587025c10f719a931efcb21df84e8109c2cbeef8f05583b0b9ccd9021929bddfd049a78392b015d8779d7114d9316f3d1030efaa043bcd818a00a4944c8cebef5166588ac7096bb23b43f153e4c7f3edc0b03212dda993b6e2a5bf513715dae946edacb0897514940788e68f3aa2124df5f620326d55817d8002d02a53634bafc2d223d4dd90b8e9583aeb71ea035235f950c9203045a03d393764927f978085e1fd178b6cb3f52518914eee38a46a0d3ed544d75032aae928f3774997bc1e0617c717239f6f394e892b9b9ca533722ed80026b475c77d9d4c19c9782e3370089434458cbec222897a3041e9b697e6971775858c5356aa49b9f4ec97df51d9178c9377a1ac79d3fe0b63acc3f87c3c3a9612256470321364f8a5125d183cf957eb2ae661cccfb3dd3b3bbb6f34a2c2518bc1bbacc7c048853d95ca83dd3ece292354fd9092c179b5a23132e0109115464487d0fe87216c09e720dc2d0e5ddfa3cd67c3733281caf2558dcd8ce32862f33436334b6dbd7a4d00eb9cbb12283e408ff43fb49d8b40a1533b64f0ae67c296d68c9505c639389119e277c99155b1770a2c95cc8d9b8b83e02167df2150472b9123b9093252e82beffa381eb34483ac5f841d7907a8f45e7f7530e62c3bf3ce315d93686f85a3c5a9086fbde2962339f143e031944b58da54014f9b9cce4a07e65de1b6db6e86bfc1fafd7779d885abab9b73367051faa4a75735b90ed453aa8818bbd57169fc8495fa2f79f4e0c029b30ebbfc1d6d30c3f5d261dae617b38facd919b28ae69af5bb826bddb14928523c3d09368cc38bc7835121914ec7ad25716e5f9a1d08c905cc8745d67e92af76978756339697fe1ab68095a5deb1593d39cf91182f24af0e7f6432ae9393a1124f370ecf95e5618da8fc9bfb49f0b4c6b905c31643a8a54754746a91a08ed61a0b49628e1d9d8b5f679040e36bc4db03becb6f01f83eaca0634cd3733fd5081ae38774970f404f92f365f8de964cef12ffe9aecab17882e76463eeee4351bc08921573e54b8abb291a81eb04ad88227ae88e59fc0f533c9a6e8070fe254daf00c77a4c272e24c0caa39efa97469bb9c7cbcc2dffc78ae887cc64c616298c5cd32c303d8422386ef9863afd3b78dac95d09d219b8f1ab2883a502d2b97a9d95b89608bcce291fb4f10dfa97db54a550d277292770736ef1379ffac6864a3a834729ca8a403ac9a9e8b4c676eb3459a0f710d22ce30e0dee7e56d0e47962a7e0b02d2a20a0b0326d576289d21e8a0abe7667b1cc991dc2b77cb8feb1af1715a7d2c64cd0e9d6f41ee94e8b771b94c388568c5f094dd6abe2971f7ac953a63ffd8004b76a9485d7693c7900d23ffd41d69d89a831e54c361cf5599ab5dbef3833356ac14402e6407f1d0584c3c56265328f949ac00582e5a205ca259ecc062f34b728175f882c30b4d53405a2a4b7ace871489d4a6f610aaaa8308606717d6c4b4469b15056e30ae0eb37d68be61fe573f37a5b8c95167839455b0e49e6eb1e59d39871c45b83ad86286b8e0105a98515d8a567ca67025ebfc7374d6cf67677ab2de7254d7030dca952854eb426a7586ea14e158f75714b01a6fb5f94cc48db88161ee460247ce4662fafc8ac9df983fdb959f2af7582bd0e719d288cc471248edcf20ed353b0abbe20993ceed6cda580f3d489ab5792f599f99980d6bab75b51699fe212e12ffa2cf3e139335aca65342230ac4fc2cbfdb4ed2e41c7f8f54ad152ff770ba6e670d2258f06ddac957fa1af5a64a348a5337576972291237bc1f52b0fbf4d8c554c7b4136a0237490f20eb6cefe1775184ee401ea03def83d7598f7180adb2ce8f9eb4d9e5b2898731cb0a9bbd5d7c059eac1f4a35e3ba40eeea0c247b5d958fcd0ddf4a2f38884bd43be30f160fd77face6ac264db2a10c235b1b161cd498ff08675fa1f7edd9ff07c28fe52dc43883c7941d57f33c170e00cfcc46d54bbc14f3041bb067c203000000000000000000000000ee3856af8331c0b27298c9f644197984b6656fcf661bf00beda6d13622bc67e509daefd8d9b45ed78fed06a9a93c699b9f1d18d359851d22a5d89f97a53d37175269702d2c8113d0360723c3a0224dbe39d9a7f56dc32631b235ccd0f70902bd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075be71d76d1d1fc56e900fb3c6625f79eaa01c4500be6ddfde7999f9e8654b679788110003db460417fbc5f13b3ad111337d06da61f152abe3e9194129e77c1218c5556624c5bc1ef081769641c2a4d0f60fa926186b32b8929550035188daccc70202aedfdda0b3703482c1648c44244f1c208f916e5cd3d95e5cd082b6294b021719cf097d890d328d5d10f160ad9823f871e44a622b53e02f5f7c922bc43bed02201a94f29995e748f783ce676405e43061b305e4a738bf4472dc0bd0ff80c1b40b02baa60f7d4d380aebac06d8766e877c9ef62bb86503314ebb19b22b4015c5033acb3937b9e46e1438265377e11db1e058f323886d5318546a5600d283a237f502230d48eb8483ba58c9ee5c846d2f60a7ccddf00055b19a3c7b7ca943002e526a03132a9f91dcf1769e6cc9796976eb59463f99a05a0103a58ac4d7b771a7a1a8520207ba2fe18b3aa21a40f214a07323fe7b6b14274b6a65590aa2c0777a75bc7520020200d2fe11fcb3b751e27aa77e1e14db725a54ffa4df750eb53be035b4f9f736031e5b8d258754a0b2ad96a68646415763bca29aae06ff0e9c8caeb1517b788e22f9c37c93ff7c50513d2469afad7dd6d85baafe9d0a97813e42669369f7a7077fc1573ff40bdc86d2f59fb1221aa0b145dbfc9719f062a06c25922e3cc805faa4cb5e61afeaedb8e0d9414fc7b925084d6e3bf2ca3f93a6ab67ac3d26383a2c62da3d123bd6d30969528da1d69656553e05432177f0adba484f6d0e750babdfa908569808fbf100b85b0afda0a88620d829d1284778f5f4320c2439d8ff2b33bce8fb714e98a3eeebbf11de8283b24f3c90bde9c8862f5ed65145693fd2c7370851acae91ac03d2099f1e9eeb8f0beded549f6072d1570fafd7f32924c0b629f5b952e6ff328db76d987df5fe1217e2c74e8f405c41383d0d6805d1c23594be8bcef148a50394bce0bb3eadbbaca197e1fd8eec19b61f361daceb4cecc987ba6be7434c6d5e1d2e848a37296779236d9a03e9f95204a923c241ca10efa1667726ee5180866c58de59ed75db3775844c4a354123358e3f8481159c22fe7fb7a223493673d0ee52b86e5264df1add893ace289d4fc8cde539e9b96a9aee86c54e1d3f269feed4afb089ddbbea9842ab4efce7b23b296e545ae34d2e7668f0cb8d90e6876d62bd58c2434dfa652769c4c2fec3f38280816ad465cd96dd857e59d15591a7612a3f2e08bed011ed1cec547d612b109d286996dfbd7e7fb1b8fdebeef041151361c4bcd6c2eebaecb567cecee87569c9013c0fac558f17a624fdbde6dc3723951180148af5c0c2e860fa60bfd53e0c7054f9cf07bc40b01bf1832378db9cbbacd2cf38449e19206f25eaf9979506b088102253408cb381bc1c915cf61dc6eb183d0c2a779e00bd33c24d1e26b4aa21f7922ab538d481297104550bb6cd96cc711e54abe68551bbfbd78b5fa6334fd3e378ed6ba26e877b5005bb26f95c64f7fcca93420bbce0ad347b6579e1fefaafd79f6a3a97639a5065d1de337ff3e9a2db12d0f4fdf2b1f11d64bf22bd62629022d8724f34c48c6b4853e001adea563d3361fefb813ecb6631cb55b2687028b0a113141d6f56ca563eb865935c617b26b279a72f8bc4f01e65458853dcb27d05a1ba3a3db1e11b19ee17628383533a3fcf526a4f4ec542b741523946e52163a1cfaf5c705b1e40bb2834638e1a2d85c20ca1c6254d3cf8007f302d9b470199e64220a6b9a4b45da8411ad98bfa324db51ed508fb639de82190366fcef345f14eb31695ca09795279478eb02fb6aaf0c207e86e5b6073ec28794aa0a0d06d9e704d79783ff54a4d16e1504bb7b3915b529368864f06b9dabb7f5e5b350e12a0c5d1f40bd9df02c563d418283b3766946c85f353c3b00b448368ae1c8f2dd63723b696304648de5f41fd240f6a0977fc3c5eb63b018c55c4df58096921afbd193a5bbf5e0d6fac1842c056bfb0707d9651f7371d3323cc3b3be5669d1aefded4bd5af3d552d9d14e1efe3eccf6c3f807841f3459cd926b1bd5ba865302ab67e8b8cf6af5075be87e0120d480e4b606502675603fec0830e9e44ecfe1872e1f008f647ebe251820fe609c1aa35ca832b1c29c63179b3293dd51478db45ee7e8fe63d53a5cc010ba68a456f88c872a5a8d1a14eeee4d771c8994c036f80739e20043df26f7ac129b49829218cdfe7a752c8988efb2473704b48b877e2b72ff75991fee6c86daa95c29dac7a321bf457a389033766a0dacbdb35dd5c9bb3db8f5f495b5e38e00000000000000000000000000153da45872ebc866b8d3726fed19bc473d63e9f58efbf809c0311f1d9ccadb339d6993183aecb23b29130bdf14b03f44d26790c972ef8be3440a60a2dd14e33904f505cb2c95a59ca80cb4ce704fec8cbfabe5a465838be9ae112af6fe304442000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008169149ea0f42e108075b6a9c56a4b24a4930449ab3bf41e1754f5ddd8e2cde049a8b22fa33713d5db114b7cdd62f7f024326d27803abcc5c5d1d90eca8bdf88662ba4675f3e49a8a789a9e0f6f4ab1532003da727a0a95ff1dcfd7435c3e4ceca892789fe4741e83b0f9c50c7bc2a5ca65419e2d2aafb3ce77c260f6ac474e2022fd35db8932806ec2dfec03a96c0f2c3622e9ce53b3f8809a90c3436d6080f430219733232a2439477c8672d209a48ffa3524c9bff80c5a8ef6f8404fb02eaf81b0a072c9f4306607574cde3fd496f73c9b50140a74f8d5620ae497ce340d0d882b314aa7c1b36b15af03baa702e2b6aeea284f7c98e038efda6b9512663187b42a10211500d928130e50bc97a099ba60e57ef783f0c3c3710ec2b02f2790a8b4e7f600321c0930910fc4a1ede640ae122cbb4848a71a00267175d1c58f16478c820e9370321014f98763ddbe41ff7bcb727a1c5ae01d33dc62994be140eecfbb81146053b031cca234c4654fba6359c4602521ca5a7bd518b89ea094339db53947b50321d4402098dc8e208f63fd16b3111e5b892ebbbee816e637b618f4d1940a77536835500241c91499f978be0e83e8a538a572d280b2431eee389260aa70daa26790679548aab42b6c17807a3326081c5523dd1574fc8a6708fe9ff5966236a320629a8fa82741182807c10b57441236b278ac95624cb545e89c515f5f0159e22aaa407f4b86ad2572f2d04b683c0aa13360d620f5ce6b4b3e661f444f442fd7b1bc8f205ed2b697bf80ab3bbe45aa369dd01ee361980a4294fc92e338abe65f6b99c349d9ff27d202301410eb9d214f1806b71dbda1fe4906fb3ec378447ef3abf83950919fd075f79199dd9097752f9195df746ac91c2243f84cba746d653423f92ab13e79cbaa0f891978615d631717137f1926d4fe9f44089ef9ea45ab2482e46f12d316e8ab3a17eaac1847e0aeb093d98cf28ffb94128de71fc73d9f136a1c93ac5ae38777b594306066db832f57dd065c46300519292c3acfc190e38467c3e23e61e59ec765ebf0c2c68e33cb841e8cf929ec477218b12ac1cbd2ddbab97436fa4a160fd6b46898ce80b1224a0c9dd40064a7c07db65107d3a65f62eaae5e2a0b7b7e7203dc70c0a7e81285e7abb0edb599ef77103b855525927cfbfe683d9eeb5cedf004a7931dfe029cf1e66cfd0b7775286e88e13f5218cd5debd2fc95827d21951189caddd28d6a0aaddff382049567d6d487f3619bc68cc79fd4dd9fb7914080b03ce16729133f5329e3d90ff377f87622ae00696c1cf3a43b372e2ecd332de3227787a82a1a008ed3b02580119ee90befeeef9a797ea2f710934f4b68c8069c7d19a2f155d731f12b34066b4439a0ee09157dfa318809c91c577afa77e476a7bcfe0fccdb0e864487970dbecfb855222a9bcdff693514ed22a414f16838032d2492d93222bd06c1c541ae4aedad919a63531e05e0eee377adf22cb304f1b6cd96651f6039e9fc89762607e69610a05a2e8c7404eda5e464d15666b2d99807ecddd7c819104509bd5271eb79b14fbd12b0cdbdd50a48a2239dd926872d0da3781a4fe7721ee962e438afd388e6111200266d93cdec94143cf036d1243ce1d3c9901b4ce2d8e2189560c125113308ac1defa0fd62e586b89787869aa3afaf5beb02d8cd08e3548cb6db197ad31cfeafe25351de62de0d270eeba3ca001ba0ef09e9be9c6ce9944869bf988df3b85a25c0fc180d0911e0faa296d92cfd3a8a9030221a82646f2b2d15ef3410ffe9a8b95f436546b1d150d9df446d95700da7d71153c68ef3cb96ed7d41f0b54e9a9d9c3dd5017018f50429a38195a5390a90e8b36cc546db726ac642431779a2cb6dfc14e7981ed3095cbc1ac1f41beaa02afa3e026a5e2d673f7a1cf4021c81b7878cc362e1b4369eb31dd776d870e7b3c218a7d72d85ae04d4fdbab6657d243538ea0a22f78339fd86b9a873bde8695fdf6769fd8fc0177dbce6d2ecfc06596f4d0a392975f708423f0e20db8f6e24cc12b5a065d2f38b59b134d1877e3ce39ade35caf4a15e5623cd44d4eadf34eb44a74f35eaa347abc400e07ba2d29e415b0e952f68bf6c9577a273d5cbe37a42fc3da3dadce056aff0091a3b8db015e16803719eef02d1acc3dfdeaa8cc4af72956d827c5ed6aa47e4ca45bf7c77ea98cc878b1948e81336cee0db8ce641c7de111e81bfcb8f194849f9eb1b6b4c16425d57874bb45b61fe20d0e33e3f918d89b3c344c3fb0be2e56463672f503c1807f6161033d765f6917f6b1d606bfe8be992c8f53c5baf0764ed9b81b133d575ca8f8fc58312a7f5d922ac1fea6d9a3d7cc3a6af37e6884b269af32d2c0355127b27a14f0963e48242aaa2b5a94959da29a02985492a3aa3a376d2d74a71e374c0ddd6cb608", "ac52635200526a65", 0, -1466349462, 0, "6a7d36f736acaf9484ad73f6fedc84981d404acb5a20249c0dae77d1d2a92e08"], - ["a80c6e02029df34c9188d0a390a3f5b679adeae6ad66e724f1d9db953be175755e63ab090d0300000000ffffffffd0b987931681345ea000b705eab572e03f7834be1843e59dbb3f1f2e4a89b68c03000000025163e096e88b011f46cf0400000000076353526a535300cd05f9f400", "ac6a5151", 1, 173198409, 0, "e11d93fb1733d477305f0f491ea52db85b2ffa1589187aeec030e22b107ad099"], - ["85f0937302c4657eee97d40ac38d18e631cd42ec3392b36709ef992be0a40c163c4dac6a24010000000263532d5975a409c4627894c34266988f27234cc748d22b19c0ba4a1d8d601c2ae28c8948a60c0000000008ac006a5252535253284ef8230129d598050000000001ac4cf8728103a4a4110100000000000000000000000092100efbc62d6491a4cbddce80420776ed4371dbf31189bc97ad1dd1290f3b29775baa3db0d8345ee8e884db38ea02994cf87b95b9f8a507081c85d39e58e13dd878e8ab3a1f16952fa2c4ea97d110ba63371f38270d4ac9f6b1d2a14d9f53aa000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e9f98119fe57e7b1b14859ce238224544934f6e8360d38f1b8f29615415c7db7aff72bb0701b8b7e9fcfecb52bdb98eb774942af208e43a3e1de0ab32bfc97dc5438554acdc5cebdfb3b1cf006e4ce73a4d615c1d57e406beb23983b0eeaf1554125fd743cb2164b4a7155e3359da0d846ba2a76af9a75b09c46a02a9d2bb3b0230632e22a0a995aec5428904f7da9e295dba4bc5144671ccf52a4777ca97cf11021930ffbe56069c02b91232e8e3dfb5e2d9d9e30860ed574513c7c36dee9c72dd0a0850b346cea9ea6bcd100377c16a8fc6b5cdb03c3d0621aadfe884fa637d3248378b3d8e853f9fccb46b0cc08000bbe4d2e11958b680cff2eefa953d072045fb030ff228ded53aa5f8422866430f9e54c7890f1e151ce03570453e2ca84b828c95032cc97b5304337ca7715f02856746f28516ac2aaea971f16a980a8ddb6276d641022dc70840fc21e78b26ca05b6408098440590ed6b93ca458a3671f0dd2b0c656b020f838ff1cdb1db56970c46852f1bd340a0e9c2d25f43995c0ad51ad19df00b850200718dba61a7497a354f27f91d911d8337731158274e3bd9b08d9f8d272b421bcbd5805d84a312c819de00c948cade05424805bcec1e89d266c477a9369aa7fae4370facfca1221c4d295d40e359487d84cd0b46285d9ce28e565b3c3597c850704be9c2211ba6e4989fa6fa7bc6b0086f1e9fa17079ed0e4b1788cffa2312391cdb4e08c5250fd109579d8e9afd182ea43e1ec6121dbbb523938406241360e5f10473071c8ce292c442985a451099fd746e93a8c91945e5e4b568221f1c778fba0f81e5e20ff69b6356baf931585ad1d544fb82f97910d012d6852e3eb3b8a65d0b1fcdf15ffaac0a877644645f298110c7dd97282c4ddc76c65a1a09a78dc0cde4ed82a5f4ced5387fbe820a7110f9743294baf089214b151feba7388cda48b99d693ce125c6c670451e8c119cddbb93ca2f4d89fc1717074e733f0206baf1b9f2c0cadbfec529acffc749f093e05c51648bbf904ddfc0fd9dd017d7400dec7c1a2efc6e0a6a38a85bb1b0772950db6bb117d54e5f5593bea3f2803734a17a537a6722054fe39214e44f71a89ef4cc311539a2473696b5f5801092c7fe058006b113749907d0ecdd3b8aa8bf1475df8c46b87716d4cad319be0cf4dbad2dc01954d257f9df599b54f79690258db89ac662b46d5eade4cd6e12e293d86a4a6f77f02ae2c087ccdfc4f7c82a6bc493ab8e5275a4aa8bed602e21b412ddc58a5e96976a6a94217f2ae71b1f89926b773afe1a64a84f4783de196f18a575cc1bb30bb749718b2ee973b336c3cdd71ee2130dd655b7c256b01d102d1af18ea168c30f9ec16264056a6689bdc62e05dd05dec8355ee5d40cd87f9c21d9aaabca63d9bf3d62ff3a5d2e7ac2db4e64001bfdad2f32ee31c46ca8de7a7a0b4b444f6742efc54a1beeaa49c4f412e34680b3257d776d59574364c1b21c0750531daa278d71ad5328af4aa55d0df98ec2d760c706174d094c5797a6b43b261ae54d529079025c1eff423996105174aed74c2ac93b9e04fba2c89b138d17f53f65b008fae688ad816f804a09c61f53b36390073ad4db8a8affaf85248a2740b1ad8fcda2246c4d0d8e09723fd14256c1d19fab442990909975bbeea9074e928f0fcfe1a06fda225063b6df6d6a30512570f986a963d6c1466eba94ea34faf3bee07ae5aab1e2f957254b72d945dffbdbaafadd8220e2df81d4c305678e51ee8dd8391964c3047a81ab5f656f9055f9a5014e3cd698d1a9eba35806c20ce635fcbf25e77917f5613c5519b66f92fc5602740996b4f4e629ecb7285c5cbfc0dc0b85562540ba5e4b8558b779d45f1da39f12aa4cb5ecbad404cd0e1c31911b8090d66e8d61a806499d83b43a328bbaf4e73fb83c45ec122b26bbc0ac813fea4b88a2e50fd9972c172d1756526f58df8ceae0f0e0dda4114237ee89d1c187b3eddd196c4c42b800cd65bd966f6eb912431531b9388dc8c72902cf07c0009641c0adce5dcb9b7da7c8242fcdd427deb148c37cab0877c62322365c0afaa0ee6798b0bfa9208b17c22687d9f32fba2297ce1afb571890c024871fba736487cdc8f81f33a6ef73fe2645412ea9c742fe35d7392d0f872d4721b357c034a13a9cd86fb705549d15064e6a0ff98422e336a5310f0b5b90bf58882a80aaab61b2852ebb92836da06a0e64a13b83375d66242ff9d65890215589cf65fa98b87bf1ff04926f25d937cf0531cb71f22dbde0afbcfa3a6203026d71053e999827010000000000000000000000004b96a810a71765cabbffb99b37afe175656b5c116775b7a20a3c7d7805ad459a0406cbcdf29ea961f395ccfca51aa6152df976d206a51b9226169807dbf24318852c1faec324d71c733704d44360862e1e6e51db3e5ed8ffbd6da4f64c6d205000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b67146409836b35867e4622aba73aab9daac10345229c53ced396f075c8e02a68dbe86aff24f3702efb9b513ce540041fedfcc4e9da3fb6f0bd6efe3d3d96c0e5d057d25197450b05ad42cd92c79a6340243797db5c9d58dfb7369eeba456f1a34779897d6fadbaccf6728f8168a3fa4539746c4e843c8aab382905e2aa8a26602215ac16e953e577499a45802b2470d4ff6cb287cf40ee37aaf9a49949e61e1910300325c7f02374c51add60bd7cb1a0a980bb69f15b52b5fd6e0de9e64dce52c9d0a02cf68387102e0fc42a8ac52c88103831bc16e9f117f5e43b3a33334a35da3d31133066a90b5f37f264afaa5b93b39040a64a689af48e7222cf91375b0a9d008030ab62b7d6898a51e944b9c731c294db6d4de72b31426d40bd7410daf42dcad09022c092f3f98a47ba55dca23b123bbfb1c6f98a51c15afabbcd66c830f6e761d01030a3be6d42ca9485532053d69c8cea0c1093c8bfca9dff2ec785e2e8d59e751bc030a27f31167719aed2ff02994acda0a1cecdaa33d1bc27baa3b3e472ac03448150325a37966471188d61fd7383f794ce5e17481babb9730aa1db63025204a1ed45181ddcafead0a2bad5f04852f8a2a9a092f0a7e584dd40f58833a640fec97e4243fef6bac589db3a3cc64e6f0db4b58415d4bbf22d32566b8893d28e3750b28846622802d9b03b6e91a97b875276d471d3daff397b8518dd54c5c0becbbe4385e104060ef75ccee64443252fb83b736ae7f8f4ddae3f6ec6fee67411880b2e2f3575b27f51fd29888e6cee34b7a404c838a66741e65c0a0a4b5c3fce838fe2183705003cc2ba19432e01c67e189f54dc01125f44755ff19e175bfe7ee4fa6bb745b672c6472721e365f07f396a525f53ad9db179c43ac392cc1d4c1d08c5457419f17a8d720320a9cb2eb4c35b1cce37692eb471d3a8a35e72c2128714e4e7b8b639ab83aa624901f6ceba735e9d00e3c0b04d97d16e1da220834076da65f9593466016b87d1101a6370f45d6dd4c0b925868b231ebbd759769534dcf109d717573436845a46ddcd0cf9e118c6776602830ca81f13ff168f183beb0d8978ceecee9b4854a6c9b5f59efa746d782c89afd7f31995f7e7893d9dc077f05086e6c8c014d418e6712aea9c18b25a0ba3e2a88677d369f2749b74e3302aad19fdd9d7b5fbbb1087b9c5682a7065049c42ad935e562f99d19320ff810bdba113da86ec807b2f8a1c788b5d86e7faf938d06b92f6b8b201bd99dbe0a8a3002047cdeface34f8c7c6f870017084285c0f5bddd1a0bc4985363705d950a985a0c05c3293af8a023834124122ae627a8d0c205595f5b9d6bf735c1d5037b11013e20090cea2eb42448067a8d308abbab91af1fdd9eef87b6489c2aeaab571f92da57b1dc64d7d53b8c3e59e6bcf71c3a3b7ada1109d621e903e1c3bec2ef14857249026d8c22da8bcb72fd76654167d194499323bce63d43ce201b70af5e47140027d865add3d5141367534a27902f32b0f4c42bf4dc9594d981b2862f6cd393ecf7851aaebe8aa059acd2efa2378d3cc4119737c2a014306244252db4d804e2503e35e554352671d45e8e819bf15bce768eebe33c3a879ae79d9082513dac3e4aa6d6229f556dca0f5e724527ebcfc8067277726ed8e1c4c9bc0c8c4dd32d4f2f4af15e8d4065cfac7b1b1966c21dabda9b6c17832cf5ef2365267bc3bf0d973ad7e3272909e12aff0b19dee1cd95292b5ea7225c0d14016914c219e649f4618a4b597b79bc9113695a07e98f3679ed140ca08f6b9c5f56bb1e802eaa760c49af74f6452d4146590daa886074e5dc8a36d39965ac22036eb8fddf3578c426f1a1794d8789e59166c0cc2ea3d9447d0695036ee601bd44cc03e0e2e93882c1d3547148e2e632f022deaa0366d8085dd184eda6c4a7e5639a76aa0057b4f710b2b0b18bda9d33a3755073ec36b76cfd8e569bf85d88a56d93932ce89ffd37e16331c8e5d31732916f808c2cf093b7e646a231850537aaedf580b8268d5a61812b8df18c4dcbe8b49d2d172ffad4543530ae842cb7208dd76ac74150c49f2debcde6b2f08191f9b18e1d75166958819dde5d2670332f150064305d74e1960ab7e1e774f0378804395bf004baec734aaa3d48a7411f04610806e6052cabc91c73d5f997205ed0055acb6501a03d6f3e6b352d0363f69d9155835b295fa8b2c6dcd05cfaba20483d7eb42d3c1bb17b689f175cbca36f6c6274819a8e3a0285840d35d10168152f616ec638af114a13417dbc75f27989c18992e58685302000000000000000000000000d24eddf4c1e6fff671967ad2b5486632ab1c8003223f37cc90d4a7afb362fa880b40a4ea93f9d5e82222be040ef1c558d9d49baa2ad98556145d024d89dae66454a53336fa747897555964caf21c77b1c62e54f9770868d0684ce683b105e330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004b8888ad1c64c3fddede9e28a20b1419403e2e09f0892359ad5308fa980c1746a36d4fd1eff0e3e75f325e7c5cfd2f1a8c5a2564562428c853c5a2c60c45e2ef5c38d7949ca021e7bcd199ad153c90524967c780af5bf18c00a963f4e8da5a243fbdfffd1d04b48c07757bf532fcf151012038aafee1e4d2c42147b755cfd7e102013d2a0264d2cff0bd215d69400ad40008a8693e90fb88674cf34a8e2ff7c50e0217b2d12b8eb50ef3b03df12cda29deebbbf0c86e73b1719ec1e4f24ef2f07aec0a0630d73dcd7615151c1280527b808103c01948c44cf0aa5e1e53ce145883579fa7fca048db4e2941d839b2ada02fb4f9853f650987c4a6eff54203db21ae87c1021121cd673203bb1375b5cb373a2c799e65d6cecb79d4267887daaca92d23e0810216e705bdd20cdaccf0d0509f99e7e3f7502cd477cc4c75638a77f91de73a476b022532b87348ddaf52e8a63a070ab7b920dbb11f4a1c4cf112860564eeb25499f103229b182dd512940d3ae31b30769045b95946e40a47728313c228041e8158ba19022f9863dac90c0a9946f3225f68cec816c3669322c910249792b65abf958d4cb88842eb39635ec74605de3e0a8f806351265ff416b094ee2a3c94984d8595bfff27a09fb1a16c07e36b4b2ab82fc27719efcd1f1c0903d93d3b971eb905bf0175b409b9703ef457697c7e170e23dc8b8fcb85bc2556084456d6da7ba444d59cf4cc76c65edb840213cf35905bac1f6289c44af4ac4316b1cecb8c7d4c1a77f3389fdb92f8ab1106fa9e4e5b1837b290f8bd1164fd3d77e3c27bf6baff9b1e91306173e0c716f8750e3e6c303c7ce2953d46c93e1ed9d32fca877fbaba21c2d654d18eeb60c68bf94b9a80c1eb33e460534cd98b40e16b03a0e76527c47589dd795879d2012ea3f5b95b2b1ec7d8101dfb363db2a1e12b113fe61e5c0c138fd3d5b32949bcee2374f4a46460a4f63b3660d329d8ce32e93a0279a4abca84cc6a0cf7c953d03765ce0a1316cefec8667f379c8f60a58d85ec3cc275a07b101bcbe23ef2f21cf3a7a04755e7cf4c3c3a9413923f9d0875c5c088eb574a281860b60c784bba6ee3bb6aaf5feaf7796491ae38932eecf757e42a2f9c477b2fcccdfd28dbaf6d92d4e0cb1d42f54abc0da6749b576e9eed55ef04990fbf376193236fd746ded104ad02618099ef651e40d57a619eb1d7700f7591d3022f249fc15f140ab3490b7de734c7d86a77c2a279f6e5cfb27cb7a0168a224fd276c26391b3346824e9de8349c801a2486c6a0ebed7715595c30002ba145938094a3b2163855d9c0012176dd6e4dd0b5fa8d59dcae3ba531d974d2bbfd07f05f0e5284b9fce5d5643f8b429acb2db8b72337a78abf782633b341bf13e0b67beef52e2a4555f444d4eec0680922a5cf59acbec489e0548a9ad30f73e40f02389b97afa4e9702be0bb27990d41bbcf2b35e3b703d430636a6a72e88dad0239d3f40fd977f5c3195b6c61cccfd207f02244158b30c4c80d73e5011259517737960133ff1e54794184a11cc88b71756c877a96dbe4bc965f1df5ca526c110c0efe2e1f227df7bc2bd5ccf2f2db801f24c7b42d91395d80dbfa191e3e7dfdfe048dabf0ce87b69bf46cc391738dcf451568e724c8f2840bab099be9df7b670b0df62f6ae6ba9d05bd66f5e65b4caeea778355df10fa9ccf20eaccde38f6990934117716181fa8315401a2b52931714202f87e98687d5d5f01d55c7c60e4217c3e296b911b4dd0767c526c91056e1cba63c92717735d43195e8171c7abaad44f947f7cb462f24df3d4c94dbb97d74832831fd836936f5c39b26fa0f4e5a911aa584e5436f4b470602b731e4407158201b5f50da923236957d31d7ea19e663106dcaed98fc4b780469ed096ecf75d8eb8a9d588db356a99dbeeabe3d64220a711c27f48296b7b236b012f5e7a57e2fee9d31790701130a1c3a73dad79dfa95318e229f81871c7993dace9ac763510279bcd2e33d778cd81f2592c088cd3729d8fc6ba8ee184c7c32a9cdcf28de5e90b3ffa8f5f1222e053664a9a1028f3ec8a455c24cb2183b4aa33b2a2e8072855084a7538cc94b33c1681c5ba16b4252d9b22706d4b60359a556133c001a20d4c0e7ef396ae8edc4fae2a3487cf1c167ac70185fec73007cf9e9a32165dd51ad86cc2adf13a83228241a88446a96584a0bec749f6d7310c0cc83be523a9910c05a9f730a3df44726b4ac1131287add54b7ce3fd8f4f6e17c1ab7cbb9375959b390375f4a0fe4898c1118fc45c6eef948d0aeff270a3dcbe21d6668ee103522e7102b4350eadf77d31c2c964128f8e332984e5e13ed5eff40a2c1fd6a11153a81cedaf183ad04ce26f09cd9a1b51e85dba3622a0fc55e243e1decc87aeef4acbc025e2dc700bc5bfb34f85ba9280e0b", "5365ac53", 0, -1457150850, 1537743641, "60573e57ecb4e13fda238e6bf99f98ab7c1e3104460f52aad0c7aaee75f968ba"], - ["f76f4736012849bc8b5a4e69a437a1299a28d09313cbaa907f1a86cb87d836a4caaf5cf0b403000000055153656a6536c4db0b03952fbf0500000000016a62be9404000000000700636a6551516acc19710300000000076353ac6a65ac6a6aaea5e302239961030000000000000000000000008d1124be2c02313774ef0f193ad88108c6b573083784d27cb57d16ec5708db93bc75712a05e576231f6bb59e949e87ff52d994dbd4c222de0b63fa5b331140f5e55c3de00ab731ff869c32ad2aecadf5c01d8e6c22d77eb7da8bdd3bdc53f37b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013b9258286be80a4ffa2170983782cd733545fc7482a2451075f5ea112ea6175ffe3504e95a3cb72431418b056038671362f2c47ba01955f5616c4d912b30c16c18835e60ad90538137d4c6d3fb7ea60489dde5739a0717e3b3a1eca3da76cb44146cd5031016934d9f9f37888b20fbcd0f77bc1d97c650e3eaf7963a15c8f52021eb3640b6dbc7f15c9a30bb8dadc5c5338dc462136b584fc27c02122aea4c82a0316104db539bf3fa10c271027c29ece8a8910d74583591b3006ab50ff7d9269580a083a779f773ac6916ab69f791b9f123193602003d596f0498659932940e69bbb5b570efa1f57f417c1edf2acedd2ba79be63129ce2daa92071988b5918dd278c020f6777bd2bb30fae0b592e66398422e40f5853526c3730dcb12da44577ce038203298edc457e2cd3a21b5b4271990b47fdb90cc8161e205e54336243a4daf98ea1020dd1057f68f8e3a906b85ea6d991c18feccf4356387eb6ebbc7976dbac736e690300c190b971e750ec8154b3953a3111ac643589ec324562b40b4eef6ab4ebe927020ef878c2e3935db5c3ed526257f61eb098b7cae0964fe59a6d7b181c268fa9fe71b0a6d6c7d887d1557b509d2cdcb6cd5fba86e888fd5481b01c0c8a76bc66be4f705ede4e7bc11946154aa8ee50e524aaccbc30a4ae6bdcb4c6ba9049049a09572b58373909cfcec62ecda3a4b2f3cbd3c5b8d82f70e9c7db33322abcb52a417b8deac2b1d2d59c88038e37d76ef012f81a59ed4779287dedd2b854decbc37322cdb67bfdaa7644a4d14dc61a4697ec81a61f6db965e1d60a2e3eb18258f7ff3fc21e9aacc1054b93f30c46fd7cbbd221b89ccff74775648183e9b37548b589b8be0aa8a5b4c80d0d73d19fb1dcb2696c196470fb01676b125cab6bf27c7fec124d0bb9833979062c134424370cd36813ccc39e401f59fe11e173236c14f61dba4b758b481ea118aad31307bb584379e54d30ca56c18dcdbb29010c0808e45fd29593b56d78653d7e3d06b61685fb156ba7526ec2b44d9c5c3b3086f96d39adc7783ec950f5c350bcad50ec00486d48d39f022c7286d5053a09facc7fa04bf4e8557bd2ec506c124deddb58e857ae526fa1b9930d947f19ec2d7b7fdb192971b5e37c8aa9be64f3bff41e51d7ff25f3fc855df6c3d06da7ca7455be9420b4db11026590d1b1e902ab4871791dfe2bba14f53fb45fa5bc3746473593aa43b0abcb6c8f441854ea0868a9cf4d6ba113c5d68a1401bc11ffde44fb21c0d28d7b29337cdf220bc124cac46b6b26addd5bdb8f9861cb0c789ce27f5904e6490107b0894bc2adf40ca01652cedc34b5fa8dfc9c5a315210a636a74634328a53cdf5d5a13b2a1859e58f81f79b71a80e9d73f231f06ca46fab99cd2e466e7eddc9f877e575e67229d34f2c0c8c991e643f4602827b69fb1d33929ab5d958ef9e28b120f9256829396939a48afc1874179d132fde9613372feb004281ba9e95e18e97e2869bcd729525be7f1ff9808a803c57a6d44a053f0f63f68e49a22430a6c26ffa5650335040984a122af7ecfb164ae705e782ea2874cf701e97b09c8d75f5bc85bb278bc4910b18094a07ca8dff9aaa97d34362df821922855db10485e803e64a18178aaa9d990f49fdb876f5fbc853596fbbccb451b5dcdad257e1b0119c211a451652e235171afc4756fb5c01ddb4c184e9cf7c7aea610cf5e82e3347fec476a1438a245424b8bbd6b69b08c61d526d4b589d1c7eb8c249c1b037cd3870f9e0ef80a221028b67d32aaa7cb26f30d82483bc09f4323155a4cd9d1ca1c71ce6468e40aacf001ec9e58653a897ffe20a3cb2b58d449c099889aa73608768083aa0ee586fc0d7ec10028d2e75a5ab8cc7a3b00fc0e424d60f142339cd322e88a70cc7494285ab4d4e470822e178a2389bb254dcedb9728a011af45db42a43dea01a0b93d539e5d8fc41ae07bb0b760838b9ba681f6ecf796c01403af7dfaf923770d74df0fa3d340e95dc780bb7b96aa8481cef08a8abfbb6a64abc99c3a913c7a4d5b626e17119e33d48886b5bfb718847fb5d6326ab59c1632c1cc6f2f781b4126e01aaab8077c97944ff4e355ca484535a3e19745966f7e92ee052498d1ff3237c1ca832cb14347c40d255a026158b288a2618f5f4036a92afc2f63cc083799b491d0f151c1cbb14958ed5d1bb3f77d1b10f105e8adcd3df7b08bba0c355c8eed357cb4a161c231921b0db96916837337e75c5561d5b6c6ed97b7af225f01ea95d7cf458fc55d9dd58b278be6bbd1fca0c23a7e55700000000000000000000000000b5686749e5f06ccf3cabf36573aa0a64fa07f0a453b0dbd417d65a9dbdac450d5c3b2badde5f6320b98bab4e3c79548a9182172352a3c7433b5958438c16852b46eda1ff4644cf735498180472f19dc5b03d5517fee30dfed20600feb3687291000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c22d6b1a15ab4bf8b77cd87070a10d90c5456679633be962d84c357ec3638092200ac1c5594647968b35dc11f3845c25f9c617e5d92208fd12e294336b340bf54718148de92fb4ef69e537cc3c440df79e8b6fbb544388a25bac8221194a2d390e732a7d5cbc549878d982af85dfe4ffc239ae106c17efc919f43f071a15b95022728f97bc59d7ade8b08d87a16ad94a09f90ef1d1efd126c46e36bf13477a2320305d5a67590f3759f7cb7f80f8965c12ee059b266d9f8065d561158e45723371b0a00866e1d59489bd46aedb9bcdd8db8b4fa7fb7ff16928e7203ec946e3127d835079f2912330149ce915cb5f8543c7296dbb784cf3f9cd8c19f8c58bbeabeb420021777ab43275907a27ce94781315cefdaec26cc84b89a6852a1f46c1150a0d500030899ad4bfa16068c90caa69dcfe685ef8d67d5c115b7b601c44dfc3b0169243b022768114f14351b8c5a1450dc408d9ede1f0d2ba5327aa52b1a0f6e481dde76f60223c7d6403bd4595325df855591a96e83b1ef323e320bd58835ef1f8d28f7df6f022b6e54ca2a635fb0ea6339b87f8ad4f5663bb66418c24be259b38ab5fbaea6fc4b14d5b1e5712424e312cdd2cac85ec091043f8bdb3a8be0bdc470819755aa848d887010088ae3e2f86dec86b39faa8fae6108c52a9a229b1d02df8cba68e4caf7ef7bb95d6aadb6ead06f783c25e206c73880e4b8357c07a5343ed8e95bd27d846fac5e7fce53a252e158c3b7df7fdf30776192ac784f202182a7bf49a8dba66c71b08bb5b32c62b92cb504fdb698b4660da8c2aae253a06a41b77425e172719c3a663c8e7535f48bc10e53b92f04fbd87b52d057b14a3ea3b1f6d0de9c455ab2f26c09eebdc2d465afcd07cd0b7668965ffa3d4ff6a90f396058a15c53e6845150de2a95ab34d623780b45c0fdc7bc89cc80763bf62ae1743dd8a070469771191aad67c41156ad56387a6b9e198d5c2fc23773fa1de42237713a5fddb9d674be92e400de05209b978936b78ffed9a2da4e0be3a3b05bbc18b427ffedcb4a0b3cea1e08104ef83f8611de39875148de7b83d169f4e08676e05a146df35681f63008dad8ab0a2f95643a4bb105105f831323a05e284b23b838501aedebdeb39c29d98d8ee726aa48f9f79f4d84c7e7d26f250ef0a8a7a63f5f78b8926276fdd70b70daf71f031399ad07f526f6858f42d977bb6cd4ccb3baca6967a7f373f90270433cf642375b053dd956135e8c5012ca25f92b1146f83bd58e01f5a80a9fa9081df102da30c5d450124ec2cbe1363247d7e463ab823ce42bf5ab4ff7eae21d7d5843036cdcf579dc094fbf4aa010a29541c15d441d4385a175717ada888e578e40a783c2387f358ab2b15eccabf3e5195c3ba6b2a6943cbb464fd6051d78e16c2314cfd08f32b84ad509bd04b859002c76e35d157daa5b4539c21e4105eafdec23aaf1fcb023bfa96737d7c1a934fcb55222bbd99eb49eb5c14d7010285c33db0ba3e81b4bfcec86bcad9c61a45f5b085600bf1a2afe03a3656630ef9fb1aea09073aac517f4db175b37fcbe40e9ea9d6bcfba55ad63dca6ba86ec67788321b903ea67320a4e30f9fffd9fbbe858728f72bea471555c25938844899c38ffcf2da918ec6941e1f13e7c88996d76004457e1c503b9251835748a266d3ff347400c910133d1097e4273a5097ce668ce3a2bbdbc1d3117519843250516e1de33ae6055f4cd474c1eb08f7b8578d7691f34ffaa22336e1ccee45b723eff2712c01a1dd770ff0561615503d5821a6a20f0e083668ba26e8f55fc44f347d827d16bf765c6b3cb2e0689937b91a6007d6602764523e8257437ae48bb653ee6fd2a1af9a812d8b17c54afbb027ea7c759ad5ac69d39b796a12ca953df3938968f2f25feec0991bfa32554ac0beac681cd7a9997c3ee8607d0ed7cbde0c18e9528d8b2a9baa715654b8437aee5f9b2412318ef76be47499b80338ddd598449a8a1cb5e224bd75465b90fa93ca0d5b11e1f449cc45ca329314772e9a71f2064788512c3361a60768c057e38dfe5b535b8b2d413daa89d7433b26647e03eb7e7ca6fe6292ec8e00668675efe2c58c25ce1d3e4d523fa6bc3ee264390a3901b07f15e7a444c8e92817c3abf21ecba3bba972680284180e967d01b7a41b7504026d2e0a574c9515241b989d3d25a0184ebd9af7f711cd95e9fafb07e16fe470af14c809b0d3ce0ca2ad1cc97b01d5d911a8a9b1180852392b15f8d62ff3d1d457c6317cfa55c96f9c3adbf1b574283ffbe588fe61713e9236e07aa0d3f85d6730c048d315fa39b87b1020b24d479cdf255397afbb88b0e8f2a9afe529a46e200fd57e50034b593e944b8a061ca48a920b917321ddaee5adde8918982e8452cb705a323df71cd81642c9e2e08c6f26e421d3328714b709f02", "6a63", 0, 684917721, 1537743641, "b2b5c891dd6c7a38c7261d1f7a015d2518aad1ed568cc1c23500aa130a0f7a91"], - ["1fcd9b37024c0eded0cbfa725a3e7f73a084a6432a08453fdb3f1530fb4d4816bcbcc1062c02000000026aac241769ad8deaa970318504c12d34de966399c01d8838d38280af9295cf78ca4a377de4fb0100000008536a6a630065ac51ffffffff04b999160400000000026300996631010000000002ac6a9f5c380300000000055200005253a644ae0100000000065253ac536552000000000300000000000000001670620200000000649b96c827c4e35ba2d73540a799fa1c7938f6f77c247149ca5e04f8002f1dd5585b3786274819a1921502039cd1dc12df942c8b7af455c459a4de24f430b3db2dc688d28942f6374f938223e9b0778024ee076a91e6cd4842469a9c7d8a8d5500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bcd9aea12b0941712621ae8620a3e54fcc0e68ff573408714d1c838b2ac38d0ecad24d04f1de334dc42ed33419e0913f9b0e24546f32d7d54ae86ec8bed4a01a61931dc4fee520c3c96db2e392edffb1ce35a0ad15812978aeb65619732546680a995263819be2c0ad960dc8715a2debb940999e056e18042ced10d21b3fd8090302f58a2adad8cea06432436a99c3ab3d372b6996aec03bcbc7f92ecf160d6b4f03106657b67e88f113f755b5fb4d67641724bcb34db1d93ef96d65ed0da98256190a05993a956a4fe1c59895037b3b2225e1fa3f30628ab64716dd3c8914f7a1319caf664d6a3ae6e20096811ba1981e3faa4b26a9fcfe45c4dd684b3a672d4e7a3a030dbdd1a5efe41068dbdd18f7cb598761af89f2c866888d91539900a31bb28a2e02133bd22a0d1da04733c81bbe88d0681ac794b27c91b3b35eb0771e9390363bca031f5ce5fc728440511089d5cfc3eb6714ccba346784fee8a6e9ba664d3a0d39120329d05810ede62b85560707aeeb69bec0cd17005a0ec3592c8d9ea7841e0a7c5c032d76e378a8090a983c8183e6e14be45a6ad869d1086cb3f1d9e8cc615b05d06bd23e10fa003583b0e9e610acc56e1b1ccf5c8d98b5f5a45e3476391b571ff955b00c6e7a736dd898bb9eb802cad1e276ffc68a2a1001e39bbb733b67c4f04c4d2f6eb84c9317b64fc4fcbb0d4aa27506ac66a82f2b9c6b9f3679dbeed6491bf3e582691e4e2b9ad20efc3b253e3a346b4b492020398dcdf86130a6c89d30ed9b722a069cb85a467626a0ac5f90eb256d5c909f99303874736bfa46cd221b0913611cc141af2924c4b12bb1a3e21ef06f4d22e6b915cf40453e942139606f471fded7ac6871f39c48588ac8b6c111d9eeb6109ad4a208d6a7448fa0304ce0509f5d1d7770213a80f583174cb55d5ddac467cfd1ce0ee2c3f55eee0057fae9c6bbed49eb2faf304d8e6d5d2b6b17df420e99dd45de34a5db1ed4d489e54115a9ae7e9f639a1e6b6a77f4e29cb314c78855d74762b35332bdb9ce27109d7c7789718041cc25cee3e88f29c28fe24ec1f5cc7948aa706cb7588ad161f91675ff1145b6baa49005e05123921836cd3eb264c9c926ba519c14bb9a6afd1fcdef94705fa700adcd1e34d6402ef4108363757bc549679058f7ae8da183c36e8e1a0cc03b7ed8ca5c7c32ea00b24bf4e5c4270292d46327bd9c2ca6e6ae3d3298b4d05e68297f43f82d37d126119de7b8d3da2864f9f015ecb62b41295a8bff6d8231245d1dc6f8324e90760e11942f804d84e22a1704e7e96bf56155e04983a334279663bb02b26d6d538ddec54e27e3d89c7bd113fc882ec7c54542bcacff1c7246733faceadf7d799fffea155d0d078e3602fb0416d67aac32c17f192a0fa464551e738796a28e436d4cee1cf9ac665534c0c09634b3c4f02f745c2c4e27870b64e7e23a5d26833c1ac05acda4612027ef4a56ce3ac881338eae7b0f05d246e9b4713baf5bd90f58f45bc02751642015aaf0e1484b0022c271a4cb534da65018ecfe3d3a7744d4ef9d5e3108ee7cd3897d3dce7743b94fec220a64a40a3bed92899381988f04c45c41809e8195e5773070b40235319feefdf46503e2d1d3e188327af3ac69b65d2017bfdb399fa45f082830fae5da6b77a368778045d2e6e29b4d5b48e89065b11d477235e76eead168b94b7badce6c883002dce7809f3cd5af9da2e6b681831275fecaeb88a5e66ff9dca1e6bf090cd2cafd03feb51b6ea61fa121fd15b5f5647bd172f3b5ea29d29c20e47d41aca7ab82ea4043824f1bd008c8bbb4a588edfe3558a7ca56ef33ce95ebfda1c21665d974de12a21bfd87764c185bb9e4b025046c045fd5a72cf86183e6e86b3c5f632b265a20a728a0849e1c8412170348f1248d21818c2cb7276e8ab1f151022f3a02c6494a869b99885fb407a112ecb1562e0cb39eeeebc54cae84102456c72ad701d4ef9a5edb3445749d34f0cda8bdf08865bee92b0dca99e92cab08dbd39a65c51a525c91402a6f806b8d55bba03f3b5b561311c29d4196058585ff9e20c0621c4933f24596c362b927a30b1c605d5ced1bc5bd16ddc93f3a5d5b9c842c3b845c4c405308a19c7d28f91d3f058ce939c5b8d8de1c4c9f5a1b541ceb5cf7760360847fc924f390cc3f72b6f121eaa768fa39e1ec47446727aa9ceacb1a19e8efa6fd7271d305d900ca9da629a9fb971159d661e9be79912e3e7e1e315dcf490e72477113e2c0a83222a8b77df4c50ef5c3e8237b017d3745cfbe4bac21fbc18e18110100000000000000000000000012af88e2333be99b76897894d5d806cc62fd39c976181e86f7524f21662c339ba0a2e879bfc90e0d9c0507f935ef3ab4106803eb05e295a411c871649f24d423c4617b1d9df3c5d3f419bc744db9a868a3684e13ea476afcadbf33a2db73293a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000da117086030098021b71dc00aa89c04dd90eff2786ef93b92a219f392b7074a8295b7f5c59655376a76d00d78f998af72640d96b07958a3f3221cefb050c8e69c6258ed746772fdf97740797bb51b800be07122542aa2b1ed0a78ef0edb04856d8553655eccec48c092a1eaaaa236d55ff0b5958e666a64977b6bd5e549fbc330229240dcff61dbb13557101d866f1671ec3ec3fc275c6dc5174b21c1b2820d9e9031bdb0faea573594ae35b108def476d1d068d37e910829caa5361b36047cb06760b04a604603c2d201f491456ec62ed782163916b1127aa7996063bb97f404714e19cfe7a6aca3854fb71f6572cb6cbe32a3232edd6223b7e84d3495cb17baf9c3e0224d76036c0c19df6f697d72cc881b4a7a7bac64530b96ef5f161e68f1dafd8000329e7c52d108f32f373f6290696a7617c6f3ef3babd0bf54fc1be71abd96a95db021d7f8ad465048efe8261d1f2839ebd4e302c5a2954c7ee8ce8c9e8f51e358b1a02023a1d689656540ec8a19f5184ea3d5934e0a4402754a5a0ae39b5470a4f8fe4023061124b39705c31cf19173f3e1ac70891700e5b845fec8b5e62b4a666e1452c860944a06a6f8ccba093616f4b031523e74e6d3e18053bec97b489556a36b776ebc4d22c7f3d3dd508ad98226469d79efbd527f887826bc72b8efbdf6a2ed05bf6490401ade78c9a8b8ea2b6c6afc29871c7b4ba226cb1af8aaa07f394b387daa6504fe48b4cadd07a25924fa879d5e952aba625e7b49e6a3fe548a0a04628a01a979939f6faeee2441fe4ad7c2bae26193015ac195495c13e06d723dd6e55cac28efdbaa01dbeb55d8c49bdff68fdabde280b5fa326bbb4f0571b77ce4ee6ab0baa75c8338c2fa456cbbb89796f3b721b96a4fdc5179cedea57a0c8cc1a48b62e8f9bf0001b5eaba5b60a383caa440c177638ac526d061c90dc24d1a55fe7f8c2922ffbf5c490888c95f9f1e2bfd96ca1b4ebedad8fc451c5def11e5775b4a20d13970704aa29a7b7cca2aad64bfb18f00b96a8d85eb1d58dc453740fda6a5acb843ac95c43e3fa68b28b7f57e70567d5ac06cf165a53a6bfb3965a504b15d82c4b97ba9e22adfa37f1e9fb335e1d0a802b6472dd3f519a3a47b9764e280ce8b02db330df53c0b578045b16a93a00073c91e55d0cf16140fbaa949ed4bdfabbb02ad92fb12184ca6e9e5140e9be9f798175bbeb38d4b443eb9a43711f48c4eccdb5ca8fc7ba72f0eedbe0eac582196e23b7485ad22fedf5a71108b02ea28519020ddd9d222526ac50801947ecc50d5297e479532c2c84f535bec1c69fb83b986506a958d929e9b391018ca753441009e70571e91bf6e7b4e7df5ea678ebb2097384d7d2c3923789ebc80f0625076e2069dd719d9bf4d4e36f16106989318c00e67a542f67b12c89e0f2127bafd668db1f36019c59619cca4dc3b945324d617269af2dfaf695783c7486b758dc7a389b5ff512208474eee7b2fc3b461cc430aa5d33c743082f1842766ae739d02baa4a1b64b100207b97e150bbdac77a2e8003873b87fbf065ebdd92a8fa6aff30a782eea67b96b584a502fa510e3a6c27f87a14d87e1579533fa4b6a5ed4882b76df2a9432ac6fdeb327a04381b93cc38d9b9e36869c9b2d4c3d7fdab87a2d4aa8d6e4ce10b899a67ddf687076e27949d2107db63addf0976b619130cb5fa82712acd05b7f50493037c1884d20e5928036ff3ddc0aec0d5de85df1c9cd177d5140e26dba714bea1a354fdbf566782c63aba62a3a6d2fc4c6d9f8afe843c64cfdfd9767be55777fb7f882c2320b20e4fa47d53da00ef03776c17de5da0ad1ecc7931714307bbcffd8efe4badd5378f7a14bdd9499d61305fdcb1413019ce3cb59f32316365ced5382929fcbc2d80481fe9999bcc6dfb7d91eef86f4577812163847c06b5394254e5aefaf4bca95b45f29e77c0fa023335576c631a91d81c087aade1fb418deeeae074cede9236cd164ae5ac414c849249f696b754c994e06d4208932b503b9b67608eecc27442ccaa2b39142611edb16908de6378c111a95beec38bd8da763846e2bbd192b4646c5562fa9e4703f2e8a889cb5612e1a42eefccbe9107ce6681ff949abce0b3ce3b476492976c592c93fe6a5c5377bfc014bf6a891364cf3f35b5a3113adfe6ff0b4cb518821d5a1f20d8b75fe0c03b00a8a72f6c8284430ab37258fe71b7f904c400f917ab66e1c6a82f96c3565ca12674d26b423ece9f590f743f7744bf05aed51278fc31213091d35e19451980638fbe526377b23ccaf600000000000000004d803d0100000000c7d085173a018468ae89e4ba260d7f582fe180596254c390f4169daa35e74e4c7e55470c8d3a988909c1e422fae1b2ed1ad89c4a1e219929d647efe22b492073cb8a69258a50e77c5744df6827cc418a105077e6d86caee594c14fe9f9dd067500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c48fb8e96d84309cff13a7bd4304a9de9d9c877342a328c4cccec2896230f940881c1380d44005f1ebb7900454f91edc98a6ca556ee54ce40540dfef8515e88e6c2b3a98cc456dff906c8308985e0b4d3c804f19b710482577865bc1e42c86f1b0102cbfaf49f72264a096a95c692c50982f8d464421dded8cb08854231f52fa0211dd3bb60556346e68ed99e793cc5a1503d99b255d358b5aaeab69e8568e949c022f97e9bbd41f7989a1c58c3ce54f52f10b3a9018528b145edfb7874f4d5a7aea0b059e4cb49356fad14c082a18981a36ae236312ceab06a0b58252978a1669d24e7af6f24d6c28c24ba1ca054c5358283cc1ce9d051216d9a6a04bd5b8a8da0ff6021c98d8983afb256351b4749daece33b59c10e058399de5c5bc17ddb11bdf45560228a537e35c54cb6ba990df34db41bb9885ef7d3102e8559814d221577aedaf43032b67cd37728a499964361999ec18d72606c8095a8b407ba3f855e3c26ffb39210204046c7bb8eac01d51ec91afd3a9ca574745bb0772bfc8c3ad4bafa6047b94340328e1fa71dfbdee4ef86699fd9ad27b1d2c907a682039066cfa1219f96322d851ecfb53fcefba4dff00ae286715176c1428c08fda08c8d9e4461255dde4977ff20e795a298e2c093c319f64db19619b04f4f9a874ef6d3fb9c0e056247a0ecf636b52ea00a810af1a6771042639597a5422ebce6a652caa052d49b78858c5d711cfa4c9499833bf3e94585b9cabaa4c12d6666a462a38cb1a63e2ef61d18fa2df9e64fe197b489107435eafa6a2f3392fda7c1349bc4d4fb5e644de4fdd02e62c71497f15f486d8be78e9c52fb7449153cb49f57409e1b7f25ff2eb7590f939fdc43b07202103c9c4cc816b72ca3432b3bbc812575a6b571bf32aad41aaf2c13ca8f228eeba525a81601c0b15bc27ddea502aec7f84c86bada71baa9975a0d7ebcbf7831e1c7353f19f218fbfba945fa09f0e746994b328628019e48cecd85031c565f93fce169b73b65f50a34fbdedab0254a106e4d36ef8bde765cfd2adab8042e1ca734cbbad0f606bcf4531492eeb29cd95ee19b20ce48d4f76c201d386d1afad16027d5f8b4e88bfd8f4035fd613e677862c3fd4db37f18e3ba5b0dcc29ff8305114b25415819773cd62895b79c80f0ecab90f13873596f89f8b2f0abcb460513b87b8268e8a1cbf7a6ff78ee49c168a4f21540611975bb31f7371085c50ef7e6d07a3a8d98f73281f19b70e417e58f3393b52c8f69dffcc752c24c7df0d84bf54b7189cfb97943be77d1abaebad4c2afdb9286a762d6b39b9189954003d45b44564932215972f4cec275ec7f3229d2a5a8ff5cdc08669ce430b702bf5fc7764877acd3fd65038093cc1072444cab6c28f9bfc826b5d9eefbdef069e79a61baa03c68905ca409f7f5f7875a9436a11d8da0fda87718db98bf54fef9a1c4d3472a766f670690fc4395943450a886ab1244cbf66904e07b0513c61d87d0f3c072dc11b128a9dabcd2132b90149753e431691ea3d0b718394e3a17f0642948db7f8d87339dd2834af280bd4ea432622070fd778b9772eede722160ad51df125e5dd6b812f43ded9de6643122121ecf1884fa625ea5492f5ee9a32ef76aaf0c2de939fc49fd24bad94a067e1beaa7fec0d31bba3f71b0759b40f6d9a3bfbaeee882a779dc3df2030ded3a7753253dd95bc0cf8692c0f81ee6a32c6001370001e64581af593fd41578c8f81d5a1f8e8d38e757df66606297694de099580f494ce48184a7899dd2d5890a47fd0a747e091ad9a5d6169fe312cebcdad72189bd802b4fdbf4e6a8181e16bf2d727372d90cc39d7a957f64f9eb188bf94cfea5e33985e109f9bb28a11e3fabff8facb217fcb88ae0bebe37c95c5e99ad9fa07220e30112c90af52d1bc3ae4ccd3cae035fe08ee75894b9e9bf46c11937b28e1dcf9943a8f659c9c1b58f51a0986bbba85a73549541d4a336f0c7debc10e9b110674996795dad762db9c29dcf9c9af33919ae2a8e78b7893387cac96a30b6728354a5ee397633421c954d049d72f4dd04c10dbf6f5e7224b205ea9980f6952b7383f40672e331a74e95de5461bf93b52897f683577d4c3da13c443cb6c3ffe2676d550860381b2e724e56fa7ad8c4013733af8579041072bab04795779ee9705ee05ebcc0fbce0825177ce2e4ff3259fda6bf9ce9e473059e6a4b33a2adc82e0efa78837bec24605d44a9bc3a28fa98d6de9d2874935cb3de03fcbf325d3d394e805873288689161ee308b7a5980c1279dd6ee93de22a824c5496e127480be65e03133834f1848eeef947dfaa6bced2f5ed7ccec2747602a9ea6be1a2b3316deab35009a85bcab2d29326d248d6e3a9c118c62c52777c0561fc33ea1ca59f6d3c34b988a8ef2e97dd578b8a1852354542a36c5c20c", "", 0, 838851709, 1537743641, "f6cde7b8f91ebe48f548b50bd8b7d1bf4e2728ac4e1d1dfd9f696c85b0021087"], - ["030000807082c40303dcd2e776cd9fdc1450167d4c82d4d82d7c9096a79c555042e1d44b948fc9963900000000046a63ac65e2070c8748d780659df21dff1292014740b33d1f8e1dfee72af298de41fd1941c5a760a0020000000463ac6a53ffffffff99133aab252032eee5a3a2e0fe759c99a35c11a8b1bfcb9eeee48cf82f277aed010000000563ac635363a11b9a4f049323e5050000000009656a52006a655363536c59430500000000096363535253636a53534515a70300000000025163c968ef01000000000500ac00636a58c49f9e6fdc443f00", "5265", 0, 1228994285, 1537743641, "2e064b811b649965074a6b58f519990801af1dc1ef4515f631aa4ba7123de229"], - ["030000807082c40303a24c39a01fbd56b7a1a3d0213a4abcd0cd2b5a345fbef28e3096c4ca37d769f503000000085365acac535151658ea92f441d75f85f6c52d9ae6939205ec3fa44c6ec36699a764a83ec4d16fd46e37e723701000000065163515300515da691b0d42182ef47cce66b7946bf9e80a6c1fd5e2cc4e59daf78909c1ab290358269f6010000000765ac5351635152ffffffff04656bc8020000000003536551223f68010000000003ac0052ca7ff502000000000953535152636553515392aeb9030000000003ac656500000000000000000165e3dd03000000000000000000000000001b8f42ecfc0ab16be482801640c5e98184a27fa7880b01d865199ed71e3a2e9cbd7805eb35440156312af6f18e109b845f4396221fb7387db34a96bdadf02c59da4e08b5c7dc2dc574d62c7ba8c0992749be5718896a2f87e0843c716231700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012732629399a8daea1a7b8f8b8c877beaf730124173d597fbaa51a2022ac8f055fb3d2d7f787b1a55b7a0068a13a7855e37e2989649b496d598cb0614e0d018f0f63840442e4615400059955fc6cd7e7a111490944779cf8060060f80ad459ac2a1235202fb2234d8f966304b2240608022ce5dd508420eeafa12b2429a234e802097a6c6a5bd42bbc72b9fbb1b1ab6fd81159097376df6a30f30e79dc08733d8e031b2301bb5e710abbdb5495c251f6e51bf0e33024618b089649593b91079632070b08674c1f2102f0c7a0814ea33d4d9b78674d6f33af590c1f6b25da0b954df6e07ef72dad63e53e24ae1dc7f1c8d8dcc443b1c2edaa4d46a515f7448b51195cac022984aa366f5eb2ffddea9a42402597f0dcfa8b23e4af6bc51b5c4c139cb72e53032ef6cfe20bc84a89a218196d52c70b192269e51c1ddaa25f9ea190e1299601eb021ce89ed3bd65981b691f707afe4eea257478afbd021212f32c66cce06ebf0deb032f638abd830404e11bfe86fc3491a32581715f38b97f3d7d2559810706c71cb1032c7716bea41ab28176b924cb85ef5664889c21aeed1fb75ac8be8c1be724b7d7f2df8e8ebc0651f49d1c038cb34e3e45ba5eae10247610e25581ff346bc39d7d4c810777de19fa9e34a8d26139045d617bd27d705172431b81af57759ea29feb5f9289321f13cd610bd43467422ed65752215009a9da43658dcbef9d1dffa57544d4c51f29bc220f3f0b71f463f1e74d892372a8bf3e06313c91015a8904abca5aaf2074e53a94b127f6a1936a4e7f7eacb0f017fbeab22c594d74e107cbc22940a08e4ec8f6157bd0e1d0b3fe72fa73fa66f32ed91765832af89eacb1749165c2bb9906e18312fa016ee7473a9b079afee184ffbb772e490f8279101b4d1c093eb2c5234cc66518fc1744b325707abf4ba443bf330de053450a9ca4ffa8c7f07e08394d2347add0b195f3874d2843d85b010060ffab00bd744ecbe0d750fb9ce39777ef5fa9e160d1f88f56d40762f3155936c2c6bccf19b560887b3979d46eca01aff83281bc945e98c3a1025c9490e3a0350cd917367be0dcec452abec80fd9c43e3cf443de29540301453a524684f3807bbc06648fd2346b34978b5f69f065a95f181a10734066847e155693912b73328120fc5b098a139a3930f595674ff1162a5f4c3703bc8830a41d91f11e12c77de3b3846e0ab99cbc8cd593ea51ba069f5f38a2ec2cc1fcbae823eea221afaef9e9a86e4ac4e1d6d0e37a30c4096c788fd2d96a40941cac0c6a02a7c2484103abd5289bf6311b1fa7203667a38ba36d4341684c83803c5b2e28a0d6eae190136f204109e1ba327b0aee0820ba99f00cdd8c6056d22f0eb5226f32aad1db4fbbc7a66a5ef601a0013f04adedad7e1b076d739335658597e5d96893e8e7f1727435cabe75aec69a955167f44f2c98fc7ff546cef155da11a65846212cd3824d001458a8833e398d3d162b76ee321e7a37107e396482fa69d7d77160df06a9c2bc5438d42f2da10e61d220cd974a13fcc582455268666ac5239ee8674357bddd4db4133b3f82130b912fa09f3e7d027e32919c10d7a072f9c45bae32e98d320bfe496f655a5097af61d2d77385386036d1b665e0c7c86eef788274218a96a5e227452fc09a205828d290e424b4e2b7a0715437da5667fb08a6c7af47eccf054f81b8aa24cdeff323f96c7a836381b85237d172b8390bd02841f73bb3ab4375d8cb454725d7d866d5109946c422a9e4eae89d4cf6517e2ac3f627d7300b347b410d220fea794b8e7470f50a367d3104083122a7c13c0728e31af32d10decca1d7dd8245ca7bdb9c4362cf891dde841faea1bdf80412346e90ae023f9fd90c685bf922daaf95723c468ce678ced0817bf3df351a0995e6424615fc58708cb5565ea892a99411a5b3b9fc0634c99ed2c6e7d8d8b8dc89c26e4db405fc2b8274fa077aad6e45f14938f5a0cb9216556ea4a6994dfc1019d015f9b66ad05d460cf682b31832fe133f3b61afb17ca1ac2c5513f61864440d0d42f7f8e715ad24e7c0325b12c3053345221286aed06760d52e74ad0f16e49ce36747349a1f3eebc60b4856ae6a8e62ab31e4e6ff091f25aa1f56c0266d9e89a3b1663ee4e9aa3c734fc8463dccae511acb82398c56580ef1e1c3bacacc37176272cd318a64d80c967e4bb4c6a0419a4c70a0adef8b9f4e573c4c4be3648c9659a1a4f270225c075402b71e6f14114c116ce989058708802dfeb15e68c4dc735aac53b73c5f6487b8bdcfa40a04f52ae29e04a045a1f2aefca12fdd344ecc8df56a4b17669ae650b9b2420629ff85a3d1f3ca6899f1da16ae674c4fe58997858ad265011e72b67ec93515cacead46da2561202b2b2f0bafb69dde31dc44b412aedfb2a0e24c78aa579ba8740f", "63", 2, -1062287712, 1537743641, "7e039487c99a21a202238b5d571364889de6abc58cc95a00f17d96bd090d8a58"], - ["ed16ab5e01f9dbc1b0eb88188dc34ef9d15539c2c8f71d55b2aa015efb11efd8286cd6f66b00000000086a6565656a6a656ad40cc99703b40c0e000000000002005212260403000000000700515100525200e26f4d0000000000066353526352650000000000", "656a526aac52", 0, -1538454665, 1537743641, "c33bc501d0563557e352228a8fc1536f381a8d37da8ae4506ce527af39ff2954"], - ["030000807082c40303c1d5fbea54f56c55b86475ef2da884f3f8a7300c2c9d94c5c1183fa099380b1d000000000865525165636500aca6eb0ca597f69ca805df738474246bf4d41f99b015f6cd68f94ad2719e69f7fc6e77e80b0100000005510051ac52ffffffff9e9f63115b145e9a0f5fb353c1c081162ef4f712bf53a9f17d8fe4ebd52290cf0300000005006a636563de5dfe1c025ae571050000000007536a525352006ac6f88e030000000009ac636365516aac0053e354b85f6f328d8300", "65655200", 0, 2051083950, 0, "33c0d4794307b267cb7f56d06ac6af935e8dcdc30823a357d65f8fb49f224fc1"], - ["e33a886d02872f61d714d01dd4cc562ddfaccbde58bd58c9c969365efc6b5892a0e76fec15030000000763005151006363ffffffff96f35bfcb2687c0cebb0b426045ba8e390e335b2ace4652183c8899aa4dd090c0000000004516a536affffffff027043e402000000000153b656ff00000000000353510000000000026afff600000000000000000000000000823a57108e96142721d8d632b421daa2be47ba48a9b4f4f6246699c11abe11bb42408b73d150d4b54ed8052a3ebd11bb9772809462521217339de67a5bdc76fac4c29f2c8822f474112dc7da09fd01c2a31794335d66225903ea59a08febe16f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004cbf1a20822ae810d699e8df5e686780e4218c1d63b979422730a713d3708f88a5aa1d0fdfb228b3cb0966d069dc2ef3d5ae40356fe0aa2d98417dc81e85b5b9dff4d110d555855626fc58d61a45eacae1ff4a6b455901dc01e453a898eeaff56ba261ab8dfe34ef01afe7ad2aeb8dc8c58821064bef3256d4f87d4f0b834905022afab1ad9512a74896389ee8bcce1b11b75ba889e5def5e4f1f93626c1c04a26020df256f6c21c58398153f1e4953e325d9ea680d07697f0cf35019ee6fb578d210a00b316171ed502b6bf778148e4cb6aeabf841503751dc4fef083f3e6723323e95bf7d89d71dab12e52cf668588349760d50ce2bdd85d63eb9a50208febd1a3230314b5a6658ff03f862803e89176c2e489310f3d654af13a37018fb9bbf627336d031eb335c3023886111526aea68fc4f125da365b052def290fc75f63c333c5e9130310022ebcfdc57ff2e3b4313414356f521bfa7004d01d42a6d1e6b2f5e61fcf820216bb8f4bbe9b0ebea28867e6b32ee9ea94e8e479a90a25a522da738981c1f7cd0208de32f136b04ffb0c53137c8c625c2b1bd7a8717ade47a5def02668a9942ee89dee181f18bacf275e887da6aa17107efc9ccdae1fc1882f1a6413a829a834ddc7f3124f9bdbddcfaea6115bc22ded6bdf745107559200ba20d9701d190fe8bc8ee5ee4ac4dcab3eab3570e93bb9d507f552906e519ff3d30777c76d6505307d39049a61e9dd534f94ed8616319c39fdfde1eaf02fe088afb40fe8f4e0550c68599177af7f0c69095edabd5b28a69ca3ab94daa6576b73c4d3372f2ad18a5f96425cff29d6db0f872a23140ad1f0a90cee3483b7a70622b81a8af758704c2f3bec23d142acac2056d12d874b60a14decbe0bee5a7167d8971ea3efc2e52ab3a2344c40aef824f94957ea104446fbbad87fea192e0b847b206f59f54a485ee03fd7edcb5833bf660b4fa84f3546b8b42074e5d07371316bc0521e4e0680e130d3d61296ba6907ad382cb383faf37e3eb25b74bcf349bb4746db5e505a160dbf39e0ad9ef4a71218b15a4b7274599d0724d2df38b1fa6d5d3cea3039b9fea565a2a07469f33865c70f49fb87e768de8a0a454dcec223b4e93414765457d901ab299b576803ec2b52cc5ac45061925e600de258c9a8a6afee5fe4b56c78c67516d9c0cd5a65329e23bc4fb4858ba64c0a1e97421c1ae8d7b06382d46285f2c95c20a93c2fccaefb558359839130937f350c24e1b02a05e55b6522837fafe0185c4b9f2c9f2dd06044f129420aabf3afa29e42542198bf5c1d0fb92df0ad40d32f454cd1a1fb6a13c051e7da52c9533ea12a190e54a6d6deef8be9d5e2b7ab0b9c6e148c11c80726ff492ff1c751c0f38f029d7a5492f8ca0bb9c08e671f95367e167f317ad0852fb89d5feeac1e49a8a8ee310cd65b8bdaafba363cfccc691f5dc756d1c2375b9b67470d5c9033c407da68477cee0f2c008d840510f9dbd24b41bcfe7c897684cb4ba54b37a271a47c77e6488336f2b1b686a48113b75f0e32d9a49266e42de4ec98b37b04461131a9497f2b3c7b31d094049fcdb40b9c9861ad22ff8d964b05d064eb7a5824863586f95545359336577568e197430a1d2f145540da4c8c494d13dcc6edb9bd739482317c43a0a7eff016492846815ee121943510d5b8fd8fca19a732523f8de7c456313a9c9a6123952690afa4a0450e51988e24e63e96bbc3cbd555ca82d15d64fe93e7afa004b511d33a9215484405518534b7b48cf315717d7b04e1442e042cb254e83b07ef87326b1f1fb4b5b259f524fc2acc2c242e75ab8a34380f61727f8cbbfe6a4ff362b2a757abad794964d7f491867b2adb6e4aafe290c56f4cb7e5fa34ed20ab7d8047e496ad8f9868c0bca2edd27a0429b8c29be51d5536ba69458c84a4fc521062c96326b69043549d85a885c6cfea5d94f32050db4c25c40130f5e7d7f06d1ad00ba985e927bc0235448b00b014ad7bbb147b4b267243ca8539039fdb320c274b08137aa2e4d24adb7977e56c4291d0a0907556748bcc89d703aae0994e83cdd37d248b2b480d112d675792c2448c67e5ee6a147ffc4a1e40822229e25013b68ec7a8b9f443b703ed2f883f1dcf30777d389b703e44dc5bfbbec709c7fd6825140553680b32707d0194925fddd8c04317690976cc9b0f9a7334df77757b9f5df01acfc86e05ff808f16be31d55cff8d8f60b280b127acb7f64ed605c1c11532f220e722249d62989241852afec6bec6d5408c8a5b4a29c4c0513e05c3c2dc00000000000000007899940400000000d6fd8d0b5231c781dcacc592d6a12b410273d1db85f40222395bc5fc5c3a7fb05ec87bb6708de5f046b865c09f351cacd5ae33936354112ae7a1f5f1aed018c22ad7f273ce1205e2887d93e8ddaa3a7911ac6b7b123f4daee2fcb97f01b19a6800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1c3a74f114d636f58449d7f3f519a50f838e2cd71c9cfe2fe0635c7559416753a5a6a2ef4546bd4c0fd615093b4cf6db961d7328111cf00ac25f2c93d9e390a1df32665d57a58954ec5f5034acf6c004abf6d6d2352f07f3f3d1bb1a54fcfddb057b5969d2484825c29dca8096d10f923fd57e70ea734b04f98969d945664ab0204230f17cea268ac2cd5776e8a8242a1034c3b7c44d60c717265d0be8de6e776021f8294527c6b9de72479b0ad3d7f7f02eb86a3b4b5fa5c6f60330cee3880bcd30a04249da10014fcbaa34d1e32b958d0af78961044b7190d1c44a1d0ce7839874b40a313cac6cdff2527d37c6c4d62ed8166914c6b81f53b00e8534dd01c9120b60212136e7023b18033f8d53c2a00e42e3dc3b670f11aaff1fb7a4d0aae87e11326032db5dc4d659425d0e91fe5ba918d3a36515771994793f5e7143d074b549b038d0322d199a402c50a690853043bb021aa26a86f362bc3ba07b5e3a73845f28eb05903299ca31d5a12ee168542da9e1f95f7875cf0f780266c62b7c651e5460126adb70201b6b54d3511082369937a70324063bd4be83b4c22c6fc8fce5c764d1c037b6968ac1cee26183919d905f402e3a5600816bb482fd1f8ed3b84be82088a8c930fd19aa463cc96ea5f03bbe574732aca75eb0cf34355096a2d109109dc254dcae3d70cc715998fcafba9e7edbd8dafc11ce68b51dfa45892f526f666b82b19b8cab68b63920a25bf2741bfd030658018324a3241fd5ee5e54647a7b3707cf0852dfd2949967354a818790ab58597fa18aab9a7eaa75200ee80b78711bf7daaa828af9e7ba9c35b71b04865775e38414c8aa56b7c3dc4386ab099249157dba4c7a0c104ced977178e14bf4a1fe8360a8d3f7c831f4865795beb35824cd7a45ab90d3a6d857565ba81099e312050369d353f96dd0eb261368eec1b244f2f70f950d8a928f1a1652e3a27e4ae7a8db9b1d8ba2c0b7c86f5abb8bc0046f1ef88f5019e97a26979d43765048a2a18b2c1651e89f26be967a69e8aff39a9e735569fe950b8f17ffc192cc1c15ceda7f084249636607124693153acfb6a3310100f662be64f50b33701a08f2b9d3f6daf25165d43015ac764d79f686840f1eb7c88b3757fc7bb4584fca894d0aea221bd25fc17cc4b3bcb1db52e3b46072ff171bd32c8f4a852e409e8a367bfc7bad9505744657f25c874976847258d2127f54ea955cb057be3a68d3f9188aa9b7b8d69087b27ccd1407f7a38775cc7d1cf2db5446fa34f8761ca314143b9fba3a176a1657a4f8a6ef0a5be5781ea523e88eda866d2b4c0db12ebf297fe7cd7209b16d7bd06baf95ab2e6b025e844eb71efc3957c8bca8aa232cd8f95904692713b60ca4e15cb1fab946664a2454776ea5352f078fc3cb0a790e8609e75b006bdee8d4adcc798a370dc1855b8cc65577802a474acf742b819b8667245f404930f22cf0d57afaa6d1c1abc20abf52a201814b726cbc65863e6afef9509344cfd750ce9854fc6a2bb75555939dd5cfbfd34a522568ce931d1ce8d2e390f8aa8b5abee2087a0e3c5f74e6b15f4ef26a5be096ceef568ffec6803f19aeba4b9a1f82381429ad5e6d8e39b70e624a31c54b929e184d5fe1f83411f4c7b280389f5f0cbd1465654c38821935c28fa606400009271954a69adae6a9aa3f72a7465a92957b9c91f855cac616d9b0e63b947a5500161e69b841c9436852022fdd7c426fbd4a94fea96c636b765bec00a9f313c1cbfb7413c5bf82035832c4394039c5bb1e5cd894d54323d2964177c4a3a9fef980ee154a7ee907f765acdc667f41797c2618a1bc32b5269aae7d495deeb34deaa67737c7afc3f95e106f032cad1d393e6782aa8ae8b6f736f12d8565198817ebf82aa4810c67030b8b9e321cd1a31bc1ed3ac2047c81dc567f1694de0f323a9f0603afdd5baf2f6b27f80077b20b7f5796e399291fa2318fb5665206472dd22dfc711d07af503b51f9f89f6fe3a29e602e9a3c1531f33701288adfed3dd9b2385c9d982afbf7308aefe9d6f6fd03bc5423681f36dfa7118fe7fd99e0e0fae9bb98da5e9097fa7c80ad0cf052da070e87cba20ff8dedde6f9f99065c47ea5dcc7004d2b244a2852748f0023b4c1c6ebdbe40d6d97297c2615527f0e9093724764557f75ab6a1b9b5cbcadedefefcd67577631ed7f92fc853696f9f3e5272b2076eb73ebdfd24f80e0fc7bc5a6cfedf9a57eeee810e5b7a9445a5321184cc1a4ade618480e0199df5d0eb30e460ef7fd651ecc7e20e6f3ef6f6a0f7c0ae1f77557710238281d1b0ff490c1495698ea2d6ba4448cee1e64cee1973512351546ac60facfc0bce5a40a2897f530f8734cad9c3924c0d37f538b9d927d46823cecec2b4ccad1dfe5e6cab4bfaa73f2b5a565912c441ffd339e5d6287202", "", 0, -675573198, 1537743641, "7eef30f298e70c032b40ac4aa1c275e0fddf96dd74c59a1ecccb869066cc889e"], - ["030000807082c40303ca55d94a1bf8c01a337772baf46ea3b684f8269924eb42b550d3e4e04d282c1703000000086500006aac000053ffffffffd0ecee4acb4169e8b5056fb15611d911a037cc6cf802524f38d2556bc200a11d0300000001acffffffff86e9111dcccaf8ac48cdc26edfb07c5790bb869cfc732ee55a2e16eba33844d10200000002656afb5da68d026db8cf000000000009515100005200655251603e69050000000003516552000000000000000001b95105050000000000000000000000007937ba0c26f1e69393184d6f700d7424ad3c765297b4d85e45476bbb0e8bd17f50070986d3c9705a3185dfaeedf70c0d1ae7a67899d0272a536ccb9a9672bbfc965ea82842413207115d47de2f7c459b2e4774d9acdf1009256592d837f1370300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1dd5a51322fae43742b7fb53553baacc0a630dcb3d227ce07a90270aeac73fed887b874c5b237fa2993175fb7223e45fc1bf99febc264c4aa6d38fdd0815682083cca2beff89d44ec3f8ab6c89891d829a11ce00bee9695ba551588ffeb24d0456e87c977233c5abea6b6d42e16ae350e58432e59e05198afede1996d65a912020877410feb490c537c2b9b78475e65eaab32150266cf5e153e2cb8417a592a27021317950836da066ef54773551262f6800572b512794f60caa253f038eb234fb70a01fa27d380cf60386f42cf99a7baa23bc58b0e09fca6480b3eee4fc66737aaf3f0d21e518bb53e5f5353ac03a3c40ae3bb50e8e8a4e08e2ba3d6729990f299c7022baf29ecdfd665f6947d5215a11962ad01d4b9445f2cc58835b6dfeccd4c43a9022ddd757116d7f75081273b34a420710fc0efc389353641d91cad7728b9fbd7f70312f01b5549111cdd4c3882b3417514562533aa1f21e40de77f136e7f0fce2bb303033b49d7c57d0067e70fabc3133f4cf1bc0fc885dd21532d0da7dab4594f5e45020e7e23c8178b6b7911fa7bc9cf166aa2b4fe57e2c428e84a87a3536120234f61bad0ece92c8bd1d5da95eec33adae4b999f2fe14ed1d39511e5bc01295057c33a3d47b6132c91ed0bf8ce87e76dfccd8dcf8d9dfccc94603d45d0ff10aa7a0405b39781aa2dde36ac5a5572aaf58ea5812f3e165d40412466b4c79ed9a8a53b32b668ab99b6ca95cbf2dc37946843780696f11456ad1555ca5fab29aef1eee7a5a81512c0f3547c43622ce11e19590409c2a24df79cfb53e271c5ed691c62af70b62477dca8f99d2f3ec435a1dfcff8828b3f9ce438a80a93391de38e4cd0b3ebaa2a4630cd02a458e709628f9d35d6dc43634d521c67c5d5109182761b006aeddeb2be6c739a46b287f4a151eb7fcce6810c60bef27ddbbe2ec3a5f2cbceefb4a97de5462b20196556b6fa533a850c5762f65fad4d03e45439fb04f0508429d2ee802ef4c494f79dc93f406946be45ce3b2297dc98f45544ae898394cd39a8c47b766757b4102bbe04a25203fd311bc77f72bcf5f2bd6ef745ac2639fbcd3873c27650d934d3384b03af34478ec5a16f15473c83051f685bb0e87a1cf804d925aa5578197dedf6a2d3bfbe117dafcfce09d5f279121b8b51d98b37d22239bc94a024e8f6078b90fc5e3ac7f717e5dfe7df9d5809c9ff3c34b46f252457bba9cd8e317720325eebabc99a11e697f45ae5e322776a14918e03f44441489fa4e8a4c01c9d8351738caefe8352a4f575257e9292e5ab8d09e82bef02d1792f9b879a91c9be67dbe1d2f847b489126e17984c714fd061e44284ce5daf3f3458e235842f1ef8e1d09de5c4c8d6180a8d2ed8807553e54ec1a22b28b8968866aa2da596705469b152042a31a2fb578fbd949bf8743f3a479d432b221ff099e158f688be429ef175111e6920c414ffdc9996432b8e9b26a8cf00df8a53939894f680df3fc2b6ac030fe20af3b94ad9f646e5c2506da50b516099b35995bf05a9158e5e672ae906cf2f37aacfd14931ce46f112bec978de9d8ec30389755c0ff276a11e15b3cd088be052a0a00c9c4a42ed883a28839bd56d3735e11ed38c90b586e78ed2a3a52d23fb5a60d5048204ae6c540b2bf59e83db367659f7f51885f25005ec16f4dea460e431c592fd88c2bace70db9a51546a4f7606255c5c3ae07d905370c78501ff57999c48ccc7959ecffd7dfc9941e9dd76c680e6733a7e4df4893fd2886faf30a62483224957df1fda689d0c375282988fecb6b0dc55cdeb2b88dfabef538e8c94502e71a74e720ac6f30121e51125ccb214b365f4151f73c1acfaec955918153d104ec8df5c82093c99d049a1eef34ffb5df1e16b9561aa1b644a542c8fd0c020cdd9db47937aba6630d87a08df40c781e5da43fea97e21741d6a4fb48892462e474ca46b10b4102ef7f2d330593ff67bbfa98a522d492a950080c1c57cdf43237b706d54b2c64ea56fca7e80f330a7f77ac8fd35f9793941b64bed6c2944e32ac448ccba66c9040b5711408f2f48107d0324698f1aebe0da880c413eaa8e227fccc177a6b966804d93b415982b13b1c324380cb93c8bab98879580c539327b81f3d2d990e2032ab63e138ae504ed4fdcfb1f985542b8b2b8c3405a042187183e604812b09df75e520ebf9da490a99e95d43135eb482482cd4c50bec76a6e7d3babd51859260e76cc69eee9a17e75f2288d6060e7bdcd29e5fd5c0e7dd4218c211f39d25c2ad79280e4d81053f29907b1975c188131ad0f56d9ff30972468432b468260386e069ebb3c608be42d73df5070fd33bb1065e42f04ce7540613ff59cef1e21abccca9c39610ccbeb543ea900b2431f779f8e3b9af3b39a5be2687c37572ae10f4b6fab1ce5e7376ff05", "5365535363", 1, 1268560951, 1537743641, "66abb8ca7acc4344f2886e325826eeeb9184b916f991c62b2c070c3f5c672fd6"], - ["030000807082c403040e4ccbbdc99f1363f81c931785bcec36efe194258ac26b9d281d2ab8afc2aaf502000000025253ffffffff34065ddbfb76e12de218ae8b011c8cbfb90b5fe250020163362c758f7940382a0000000000f5d96249c712d23d8be8ad6b18d3cdaa001c18208b733f8e05e83b06a1f04e82382a1a340200000007656a0051525365116df73a0aada89e596e937d46931e4b0a78638c34816d37a19ded4f7030677da81f5db4000000000600ac5351535368a304da0374d1710300000000076a6a65ac0063515b7ecf0100000000076351acac52acac2f5b7a0300000000030065acff08f1690000000002e0ef0103000000000000000000000000656c500f9e31358f996fb30bfde20f1307c2d646806bed06dc2523f937829d9f8733b8e3b94e3eadec5755c588bf5f669a6a329327567339617a912d8b82251b8f6c6362eb0cd018f0c1c13f4bf6778587d37c4c25bc7ba9011dd47e0b5ed55000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa7be75bab58c7d2c15e201f8b28c73151805017cf4e530c910e129a7f8a54c59dc0406b7aa0dd58e3be2f67493a69e41214d07c63ca35c3aa1350c45a02de51969100595c5dbc29f15e5af5c0adbb68cca7a57ff96585d8ecf9db951a366e28a79996996349df1fc882c49fd1257b711d1c63bb760c40ee3078b1794d8813cf022569da91332cea051628ec4a5e7225c29864c3720361310f63adbc322241a5d0021ec97049900117ec27e5fcf0b3c45ce68cfad8f2fb9fc5566275515d5e2f51aa0b01c3ae917cd4dd5e74076399f7bb34ebc99557d177702175b014aafb9a877d3d2fdd389f0f13e5309b368e0184a3459df2de63b3591e02b75af1c6bac0ed37590221040d249a31620de3c0cba80cd482422cf90b641fe823b8c06aa1b085b15d8b0227b1c516f22bd4969f6b2ae8213b9e64d9dd8dad35ca82c972d692c3314f653c031d507d92fa7f7c7ae84033bdb7e15261fa2926818efd2bc54271e7e6826e30d60209037e2aa7b973978853ee46622ff18be6398865ea738f2736d2359e6f66ca36022b59c9b0a31b1af9edc0da3e8041cb6fb24b1fe9a6ddb3f45b3674b4f39e2b532975b3d6566335266a238bca6542659058647c94529a2f1d05ad946eaf6871d9c15c81a8bf2b66ec684dffbb57c59b20fc05155aba4b66dc8781cac51023525e05d7c32428a22dbf591952d32114176b1f523654363e16178d9952d6647461559a8d8856e345b481e2147becf87db3271896bfd32aac0870cf43b34a69a435fd6ebe68b49e42a5676aa5ea206405fad2be7f68152a51343fe04e016dbca30236723f6d500fb290c40c86b73bbf884b640dfd670a01dff48a93a533a19560bcaeb7f2ab61bb86527ade66a213867fa5405fe26ef8726845bd79d3d16759a58ce721376746be40500dc24bf1c9e54b117a62d617eaaa9d96a9e75133f527af03f79b823f742c29704071f34e7059220e0cb195b140b55bba5a174d8b70a75759f6d3704994645fe6fb0796b56f8f458963a949da46801d1a628e11168b8061f5a16f2230308272b6e45149ebdc6be71354ecf7942d9231c6d198c0b179fd871f51b8b8ae567c0962efd505266147469fedab8052b2c305aada0538e6f7d9173695e70afa7e08787e9614c880aacd8ea943c8fba521cb47da2f86056338e0422bb1a9842ba1aa24a19cf2ac54fd4fb8574952813ef18bf9d829d95d7ade6b16fa0b8061a6e2ecd36ca9feacd67b6e2d36db04664a7a479a7ff2e759cbec42dd2f39cef9fb107fdd7bfdbbdee079606ef2fe98d77604eea04eda6bbf11cda48d6af94ab2f1608c7ea6182a58d5597c3fae6096461d18af3d5f31238113201b1c59887d3d604913189916f56b6d97fc7366a8207d01c6ba8f1a103935ecf0bb8e806a13a88106e16cd81b43c110685ab9d61d4987b5cdac894e66268e50539a824ac2f394ca36a86aa9311ebb3b3b97f1a3959bf0a23c4cf4e283d613d27e0bc2a6576805ce2c1eda2a465bbc3e76259576b3c001b2a52371d9b2ba5e457f4361f6d5e4141bb5f59e096a75469f8d6031b167d36ced439f9aa90946e696a3bc3f551c8e2ddf1ae59e31683a11996588da7f798a6a8dcc9f9a5b021f4e17a28456cf88cdfa0147f5aa5450b20cc92651111a8c73dabac42393c744c0db47b1ad577c249f961e526b0023217cb162c05886cb6dd0b7fb04573d091d42b282add16945c10bd9c3828217d02d513a4268e550e0536cdc4246743a1cc0485b6068ccf9542c2f2e4985b97dd5c78e29879ccbfc7ba10990ca743d69c4ce77fdd9fe50cc8a04e7ebdc327efbde4d7811fcb49e1a2f27a94b576b0a272ea0e49db5582a5c072ca2ca551205c6264ddf6b2d7d525753bb2d859b859c1c5da21e203b1dde36b0e89551b14bc47e08886ba2c29d297648d95033c7c98bf2ef67c4eea27cee29bd68217fa48143955d7214a3e61f636351699b0d96cda55ff990ac9838530109865f771860c27546aa3708336c63ee2a13e95015185123a57673dff4560cc00d751341823adf95c05b75e0cda06da9b09b943c4ee50078ac7159253d70e39e585103a0b0a112304e038784bfbfe7af56f3eb802031ca243ad9214bea57d738e8d2e89c97d805e16a1308272183db76806f82c923d520c9f00f408e90ceacd4b5e97999f3af0c1b900b27734dceb22d43af0cf21a4038ac7b44652970f518b2acb1d8c41e3b034da54a01f6a67231854acec3c5381061f163b085b6b3425242c91b93534fa465d85ecba9a90e9ccbe21daa6d76760000000000000000478a680500000000c611238a42fb594e542d4d4237cf82a559e3ca4c89a9511fcb2c9f1117b08db5aa1c8a3dc906cf21fb1f6ce05f1dcac580efb1fb27f2975d140bc9d7d23adbefc79a66e5c17ba84b2c5d3be136ad75d0b25eec2e8510d8fca7dde8e3e06c57200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050b153646493d0904b6d1b43de68c921d8b1fb53a57bc84d67c8caafca7e448f37f6f649c6286a54190a68a820a9e71152fb2bf2a8c5b5f9eeed6186159ea8c63ee313f4dd086e97ff0f7165ed46e8a7747456fb87922029cd3820259e4f0473993525d5a28200d5e0c246e6b99af602668a14f7f85833df4beccb6a6ee66017032817fdd2ec53a4f915e37229628af6a468f03f2e16cc34853055f136505fd6fa030657bcce007dd9714557f18feecb49eb89def8feaeb00cf33e97a40a247dad180b08ee260161982fdcd39cfb163857f7d07e27985bf59b24bcc448815f8151bcbf41df2b7f6bf6b390eb2ddfa7432f0c271f715d6fcf14a734272676fd488c4f1c02019af459ae5ba06344158f4b868bfa071158e983116ce3aa36bc7a1c7b28389802128a2fec05d03a6f0e139862f1375158a477c0facea341840a671b76775052a402265203588c425bfbe7d1c33c63a96c0fc394c8dc72daf6defc96887f0821758b030daddab4fed03d2f216bdc349791091484359c28b57fb857eca1af32b37b77a2022ff162ffc9acbdb259ad058358ef72355a8b2f39f7c4f6c6d79c08ea271fe3c0e8d36d0c684d5ae284089817d50e246983a2eade7da235c9fe0151110c512e57ccbb48728a2ea3eeb5d7af10d6870443c37035558dfbd5a099dd7adad2b3e4f5f55257c54ffdddb19c314d454284346263062b49e735ac0cdb56c7764859fba7b802af7e13825292f609caff7013356ef159ddf3402e045e45fc1042820546112252deef34580fd3aa40f45087a374a211ab4820025d138bfb0857e6718c594c3584714dae8524d4127963719d2505cf1c48cb07f456c13cac0cfd668d40ba67a57e0d5aeaf457f641551f99770a82d8474d664ee654fdc4bf220d0b0b982e4db7e27ece676bd20ffabb4eddd8cf8b26999544abf9194c7fc6bc0636627ab5ce6566a2068ec2547a30b697fb5ceceb1ccdb0a5fc00eb4896d75e94d4b0330e935df580c8266a7977cf61a769cecda467ec4265ef98ec11d8e7fbfbf4f6343d09b80993b6fd561f1ff0e2775231f82075314acfd7c530443774d87ca3142820faadc2d253e78bb5e990113798a676500a0b53884faab0e18e6b2b5c431f448f75b473fa272f7991eaef9a356a9cc9cab6926e9b679b5ceca07202bb139daebaf42933ca740fc62d8c64a51d3c2757b3dcb12621085c0fcfd381e76069a80afa9e8cc1ecc808bb6985ffd9550edcd7f2f7d8d2673834633a42f8642e6f04dc76a05a2cb64abdee2357b297fc7c292621c767d6a6f0b0c3da55a0e00ed67c08f58f7f3d9dfb356a17e2a4442a364af4577eb856800c6ab21485f751f036e822b097abad79303c615c00acaf37bac7ff2a4a25a9746a87d7d28e1c5b34c9cc02ad98a573cb1871947b43d273c3892094b50404badae35bc82009a0c456ca66abd4a712282149eda1d86436f06cd6c31f80dcedb3a0ffbde4e8c39bf6d2bfe794e5d577c512722261dc794cd383a172b4426396ac276fed72196d9e74f422e04c0f9af113b8969cf696d2cf361ef908e512bf4eae733df118c57600da70c85fa4c459870987f8654744ddb5ede457c3bbfa7da001e8eca87f3adc3bf306df5d8971d7c060b5481cab2dfe5716698ae7616b6183863d3ea2a245f8b4dd0d5f370f7b54be0a79a92b4ef3d5f20206591441685f21beb12bd204664fcef875b0ed28c2cb089874b7a12d2d6bc1e7faa457c0d021c6b427a3e5b741f9fa5e74dda66307e4378b562c53b9263129f475989ce4f051793b1762dda179cb9f8ffb42713e76926db7d569803877c53c8dcdeafa02b5535e73b79edc2e495bea2b1aab160b0af20e268eaa55d77c197954354c1fc5547941bf3260591bcc1ad181c53ce374e1692a51a5c1f643253fb7f973226675f10ac63c15aa4aae4bbbb7df7694e67f00909b7cb786a7defa73a1e77e45fce9aa836017f029888cf44abc21b7281d470e0d69913a4d09c4bf4adfe219edb8d50e4839a5aa482cf12940dd655de4bec2151c6ba6fae120a027b8237835f7d61703f36fff9ab6ea7c4ca40dfff4bc916716f5ca9fa223de0c4824fb77412ae55f9404cf3cd9833f0e66f89d9abbb2c6c549deee3cdccbb04f33b383db86d43ba8ca5610a1527c259fb274cffe7a35b1309709151506474409e1798dc4044c84512c189e4393a7ea0c24a84aa93ec8b7e126e539b22567ed2e33df927bf21547f644cf7c1087e1d1b09df66fb392160b32f32b735e9e1b84733ddc296b3a11d83511beb82975d4b382d2795bb238b9dbc17bb78a1030d893f95c2abec218c393230c5cbf99831b8744c8eafd181164eeb56c02fe24561fff3c26cf086ddceac93d9925bf11caf65459bd1b063d9d079f4357647545bc3ddc8966fe32641543493e16aa660d", "6a52ac00", 2, 2027553693, 0, "f67db42778e385161b644d6237ee5591b4e906aa4fb3ca087a831287dda2ece2"], - ["455dce0001167dc9ae7f35f156a63e5a9d74e7a35b2c13053acd1df5fd0686361a9052f759010000000752ac65ac0053acffffffff04a3ff45050000000006636a636a5100cc58d0010000000003526363804d7a000000000007526352515153004b97fa04000000000000e5a7b800", "52536300", 0, 1203113559, 0, "60ee773ad969eb32659f564139ce408738cb03d53dc9359c610d5960f1411b50"], - ["3871c76d04564e694c0657ee29090bf0e66853037020a0c63b38d3db007876660232d341d901000000036a6500ffffffff1b83e5c6f111d323ec0c717ef9428e31bcdac236f58841bf33379ca2a323fbf40000000006ac5300656500ffffffff1867acd89f016dc915bcb40781f0fbe8412becfee5a8a74f6c65e07c2b50cb7500000000086a636a526a0000528734cfe8922af6700977baa6cb2740605f6d5c50b513cd89d0c5496f35ad946a3752ff770100000008006aac6a00535152799aaecb042b68e2050000000004520052acc61e38050000000005510053ac0001d5ab030000000003526a6a4b9c49000000000000000000000333e2890200000000000000000000000010dc3ead5315f6441f142e7eeb07dd20fc6cc8753718a3da378d17ec8e517185cd54c8efc190663c66a99d553ed0b10c949bb48ee63106e01a6b3e7dfa6da2975f9f9f5dde43e6bf122e6c6596ff77660e97eda6450e8123c4b1c62d77c2db0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007fc3262af5c839d16eabad82d523b829f7639fdeb062e2e8536cd9b3aca64197369a464203801ff6ab3c114958d891edfbb08a24544ded0483b32bc19fdeb04876a7c88667d7508001398d12b9fef088d6d0c2c7f7593500bcc4538dbbf56bd14a0758c3a9f9c9d1d8b0c3f3bf656a30bf1f54505bf6c6538db9573d67f305ae030cd9c6bdaef60cc7d66d44caa8eaf51756fe5a616939eb1d0cedd74425adc2e5031af8e29d31cb0680f76e5b57dc67c15febcc255c75914b811836d5a2f27f651e0b05911721a6cd967b33b34e5c542283f9a215593fb87d183c1219e5a573a40f212e512cb98009adf094807a8326976c8cae55cf667182c373244f3a9173b58fbf0222bf109b09225a1ae10a510efe7f2abff6af6fa9ae7a568f68446f57ac0aa11602268bf5c9e2a839da0f5cea52f137376800bb82b897c163e5edcedea168f78efc02297525037873ef6c76dddc00b5e867b5c1433ceaea645d479c56f1deb699d3e503054559199e83b0e1dc52377c5b2c05d9adf008139857bb90aa55c7090c4b8f2a02064953355b251ec1bc99f658d776cc5a3cde74f0a37b44e243a57d9571b693aa02e23f5002cf9c03176ef1c6e2d100203a55073f5a99dbbf0b35a630c0ae0699a4085e275ea26de4707ffafd5e43108bfe89b700fce9c068b6dcdfbb7e8ba70acb95d76e926259c2d509b569810e7cffb91ffe0a5f561073414cb0432b80c764b1bc5ccf52b6cca441fcc0a5481b56567e105cf731365a38d912534a19f4bc0c09e3913910656e155394b2d2d65e3d0ce17728756074524d4426a5e3f1f65bcc2f536efdec2a1c842ec9780595164411f78cb389996e5c5edf413468555b29e773ad13782cdf84cc8b9be5f8af46e7476f7d4f2c43ef1279a17eb53f4c900cfaaaeb2391fb08e3bfbcd5e4ba20809dfd3e5e5216a1261f7790de651103fd282a5d0f98cc37eb85145e999048d3a3e527253fc5235067bf9489154f7ca3afff2ead2b9fd311062c02f82ae4e04cad52bd502b900bfe68851d14cc386b07319539c437ae2cb6715638e0874eb0805401554e2b63eda98fd2b1217486cf75418451fe175c0653562d71d8b61e5e32fb12bebfd2818ce5b252f4265a9365a5c07ffb92579cab512a2cdcd0bc76a1e7fb2275521e79d2b19eca32e74943b17646eafdc334004d1d33eae8a79dd4a38c190a7994037a3b1aa8895cc534f73308434b8c79bb5a9a5a2a5bce1679ab31cb9c7b6284557ffd9635c187be580e17300b67efe98a9691b1eea3a152bd87d55795c575215bb983f5615f8d56b478f55c6387d2d528fdd34794c15879261343740fb8c78971ffd783ea90372f00783d6940efe8c24ecd85b31bf61d50e90ead4e59c80c008f7209c4327ff50b6483625cce739db5e17b35a702de3b60e7e8490f302ed04bb5b0893b3d7b37e7a3e8b116f6655cd649f9764707878a5764cbc8bb30f0949d799bd536c51bfba15420dfeab886e84f8b4f823a804debf9bf5cc387fc5282712fb58bcbc38e4ea269201195e14cf316d574c4ad16ed50c68c9ba009aac5235e80c5387331d2502210cc4e43cf0ff2efb12e0b23084c1119ff2dc1f43277a8ff856840721aafec4fd3537a2b7bbeb737d6e03cda33fec6a5a6366ce9a21ab89aea86f1b1e656f521d0ba19578737bd18e690a66005643adebaa1d9b53af1fd9627288231902fc560493ab91fa5d8d4738d4638e1969775a37b8c67f86387b42d0e47e21aaaf07a694577a1d7d702b16d9026087f91246b6b1bf4b30fe97cffa2eb5aa979132e67f10cc9b056cfbf33e294dcd28026299ae05cfc116e3a9ffcc4a31dfe31384ff6023fb8e7155e23efeaca878bb025ab460891ee531c3cb94b38a4fac57dbfca4323f2480a59ed6caf8c7b1c5c5cd56b3db0357cb7166c2fcf73dd02fe73eaa1b5e1d9c1f8ac2ecd89213a4771b4dd8811cf71847fb8727c76ebf273577639d11d02ca2577914f81e6eaf58fc3ef3a5370623386c29c42453537477de700ca75ab3a2078c8e6576b91b4747e3c05057b0a5e9d5f72de003b5c66d9dcfda4967b3559d1af0339ea1cedb5f1e558591de980dee404c575552a571d041029d887e92495d642cde894dd4bfb8bf5885a035998f126ae36c5c104174f1476a1669217ac41687799f74b49ac0884717123a6100c3bdcb2c2a7ed52128ae56299c492cf339258a5aa979587979b74208844d2b85dc0cf39b87dedf8b6ce73ac2f890ece9cea870d1a85ddf14d412038837d643debb733238c314d650a4fd7e85bae00000000000000000000000000a13982a6838d137d7d8d135d6467ad1c75bb54f9214116ff9de8f70ad35ac851f6389d066d840c002362bbc401c37078fea5c6b65972412725acfcf411888f1bbcad5918a15014ee5d34d800020d6b956cde31b4d7ecc916ac44370fe05e3a1f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001bb111268022570dccfe99493fe81e26eeacdbeda7c7637709c317ad3621befa8944bf448a9be41043bb37d825a9ceb9e85a43851d55e01972b519575df91ad2b505df30e18e1e439080da9a96eaf58d6341c4de49537a20c8d7ace0451fe90870b874658846fc91d839493802659f99a1189d2c1bb84089369b04123b426d6302139157664e5f2141f5524e0766fd27e15aebba65fac8425584964eecda25f7d10325efd33a670539cc26781a2ecdf4d81c970c85954525ee9a79a3287273533b950a00c2cdad34593c180cc3f2857c4e5c9ba19860e27fae97641ca8ba022772709631a32f21f86094d26956a5181568a8885a3808cf34af18bb06c2269856d4085d02257351cfda31cc5a0d5acbad3aa4a9793f4f471e92f701484ab84aa1f434b5d4021ebc729818348dfae562c3e1564c1bead344a329fe8cc40f5c3670accb4f2e5202087c35f984e0de755ccbfa0fc02f642bc7f1ee8b01b79920cbd35cd395327176020b11b3a2b5872ac0948fc4146898d730bb3fecc6bd97ced95a8db4b725710dec02150568a7db9c31089311cb19bf51c1bdbc97a3402670113b34729c5c1ea7fc3597df0fb797322aadcc19a634a31b22e9b6c2fc4c86c17a39faec68dbedef8bcbc629f5a087d8143a1fb2cc99994b394eda18f692e1c9e97c85c856659ad3d2b556ed6bc657fba3a38760b7ce8b36982e4d5ca2a7e8702a25cb22b327c95f5e8598ec230df6aa01e0313d81f7d0359ccdb2545c01a43bcd4a7741ec259c85defa012f9c363f2b693c07cb79076c49cafadcfa91dbbcb59a9c3112c7d02515deccd12d1003bee1be3ce716974ea46505b71c4c8d7aedbcbc1814176056620a36770d29445e9c1134e5230a675e764c50f4245a23df9d568845effd6a802574afd8e0353aa5dd8e366af453feef6aab859dd305692e42abc791382253676fd7869cc457fbed43e3a5d86c0acfbbe23c0121589890eaab5566bdf20f22668acf68fac9aa208a59509bcfc19ed1a4b64fecfea5cd1c12b1876a5024335e187d0ce86874cc881e7b58d097d25986858f72cdf3b18b861897bbe518949287ea0b28e248b8e19de06473dbafa9c80484628055e31809b34fb4b7d122a2241c8aa0287697e7ae9f987938c494a7f069471cec9ed268a159c52c2f637b5858187df14d77c418d242c7b584e7194f464a73dee82edacb556b44982089da9cd5e0586206df79872869742c283ef27d7727c9277b05c8f2375823a50cadaae366214d4c4f4f7b366a8683dfaede67698a2ce3c1e72c49ab5a5b7c816dc291595dc0d58d5e15b1ed98daf72bdda3eb0d152dfb5a533cda821375aef07612f9abd25afb489a901b95599c488dc5a0bd15cb59c17a7639018e25a582b20e3769a1686aeb97af316b93ba70724111d54bce04cf322f30a43a0ae499a71f91184c395b17d1dc71aab84d28b7c5038dac6333bd555dc003373c2b6bf101a0585b4251fdb3df250e440ccd64a339f4a685c16bea6b6538a8be66e20edad2143f1e1d5086296e0b2fb1a91ce0ed5558554aa29079e6e34aeee56a8ac9751699584a191b1d63309266774f253487c03b2535d3554bae293867f0e5942f04bda2f700d63d967a949bfe8df06fa5275dc217e11b66c76cc86115736659b39c5dd7bcbc52ab80232badef4ec610c9d713915fb3dc850160b71cc6ceb83e4c3200ad6478c79775895e0246018c204acb159c0ea79bf04562f1a7e7fb25e34f8db8ca626a9c952025bf1f24c119c24fe1ad349473bf3f8398b76859225f8b85e2f7506f8d3d4f575124e2d1bbb898e5bc24678d4cd71c4cddd8dae0b5e1693aa2343857f00372d9939119d24cf0d7ec042db4268514970bed2e93940d50fed6a27df0ff7e7ef3722f3d638bdff303c786293e78c4babffe82ebaf29808b700bee24c3b8792070ff74cf1906bd6905cb7a35fd55fbebeda40509882262b2b13ffb875608a9873c527b483e430192c67f3349804449a9bc4cea61a8d608f5096663e275a10bbdca90145de7477d41917f147253da1e411e435dd5d95fc05d01a9b90395811f909c063c0865bc25d32227ab28984ae213014073ce238048874ca09a4f45d99e5b671d1be7cafbfce750102db04d4edf01b00731f739aa8a6555903ceeaade9a1e0cb41c11f00f8cca68f4994912e61b0f2c701608d77fb759f9b7170957878e1a5eba54f88d4bf3c304472f32caa547822c41f4afb48d3e6cea632fff267c8644b30c664132cc38834495492066bd5c60004b165e6b43360555f1bbef0600000000000000000000000000b2fe61500a9abc2bd0364c0629b2cd04992f10e7e303a18c6fc4fd24f63c0c2a01051badd51d83fe3e43247e9b6334ed1ceadd172e1351266a83747bc8b5b33ef26bf3d7d285b055ac02f6667a32ddad64022cdf5e32d0981854db7b8edb6d0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dc0d4aa4c054ca939bab388fd7d721425e0f4518281147265c5675c837511162ecf48e087b0ce0c0b8e98705344960646cb9c4b228555b3d5d58ffd1dd8bb5fcf3634654e68db2e3592868637cd98bf90b80a0207244cf5e2724a5ed272e7dcf53cdd0f95aa42c365602def39489d560f7253b6bd4f602d0e1ab2d49701f0b110327059a10b9c2c957ee6b53001a480cbe0c18b3478b79e941c4926a9fb9e09dc70215a6d175313c2a3182dec9c3c2f7433b17bfc70ba54fd2a0fc13c0f963760a9c0a04488bcc2ac562286fa3e88756a081b56f2d0cc70d00cacacdba2ced8d367cabb8512c463cee272fc1319e5f7a6fe97223667b82b3647f8f7e32177a0b1d08be031ad31432f4454712e603b8f7ec8798b24efda29e541094e6f5122613c6b71fea020cee6cdaec0e47c49db62026e1a6084accc95f0be38e48e07fa76310c5a01db503150ef9c9e840231211dc3c83ce5473093b7d40c41be34f176b6ba4c231843d360326af8e4d7bb7b9bf464a13d9ce44ea16072b4d0846c52ec5230919573d5cc4b8032cf789f6f285faf6b538eaf17ee40f5b5dfe83cc39f0ceba282f65f1bf70bb8034b0e681c846f2234721245cea74778addcb42445f626fefd9d267f2701a03a03acf169dc12fae7497b48b0fc7c3747172679605a864f98185ea65b39bf42e831c751b51b98346891e786a8e26a67b68204eb93f223476fe92ad046db5e3b77d1ed8336e60c1668ff2f29a7c0e0c80c95d07a220105e4a3847842d20b99f5c24463192e69b6bc53ea2f35f80ffbd5a1f3023c05f8f1dcd00386b1ffa062736c872f53151f6f852df57d5b69a1145c0bd2d18b4ae8c214631120e3989382ff4f6f3a685a42898d10d98c99a21c4699affc3667c15d933c15298c44ac19a088ab7e58149f006b92df5c456da7475d74854254ecc76e15f0756c0320fb066870d7556ad28de46b9a36a29b325db7bba4baf5b3a6bd6bcdc00fcee39303d377dd7291ca6be5dc0c2ed03d691de9728913d608365ee5be75f80a4a0039f9f07d5642b030a70d80702fb96a7eb3c97daca8db2d4bd0efda52aee682eed3eb7e907da31d109c6f8893dc45ff6113ac7266b3da3dc2e70329fcd42484c36f29d62f101ded2602ef029eabcf4ec7818ca3e3c8fca465367c3320c2cc837fe2264998c75f2f49d2ff4d015bd91307852f522d489b2276600b2606ad798544086c68e915036a7ae9e12be5769d2be437aa5a5c9f8eb0febc3ccd3818b13eee8c6bd15dc9e658402287323cae0e19b13876a222f8b9e8a5f81b215a249579027206f64a11aac2990ee9ddfd3c82604ca517e555bbad1b7ccbb376f044ea1c4c4576ca8b6ff3fc4391049c8cf662c31d731cccc0b37653bef02ea888ab1273e196dc7b302249a99e926a8b1517d00f7c681947314694a366f84c54acc3247dafb1bd9e2eaacb0330d4f879d9684ea691638729fe8200014fe406d102c3942b45c477821bb3738580e2346d3e1eb0ca370dda4eb63f96f161e363f18df05756d9fd191f8239c583c248d7042455a7f0ced3e07009574bec8127a47890a1616e3e049ebaf5a0b9971eb72149dedc9ea4c56ecffa8341f1eac7b4c6573a806b8cab4ed29d2282bb24db4bb09744f611144b2ad7fa90b30ade67f4f37e280fbb34dd797b423d293c4c9d2d9c7605d376ecda010e297d62996dfcdea5f06383e9d98b4c20d0d923fd423cfbe53aa7c0567e68dbe751fa0b738dd8624664f3b0219f086afd851d749b7cf006a08b0a2cf28c061dc7a636e5fbe7f03d4f57ff4fb9b55f4671b6b8309af0ede36d656059685bc1ced2311f050c88fcef239c9d72754c04bd3f664432cd5988e8643c07ca8cd2ca1c6f82553a11bca0fd5ab6bcc2fe7773a0709b1dd1f8d7c534838923e14f59f5bb88e38fa4257ab7a7e6348e01073198bb691b3d422ba74cf5a06c13dc7ac767447d6cddec1f35f86d66b3c09fe0dff821ab5fc4576a75235b9f1369e84e77f9663f299cffdc86c727a1ea5f90ce6109740e549d6a8eb216089593d8941b48eec7f1847715c46006d746802be79b18b7528582fc6c97bb02cd80b4e9362489ffa5f7cf9defef99f2f55dce90a65fb39b4efec06a10e70e92331227108e038155577393f99f5758f1c8a351d906f8e12368ba63396c599a8dd6c456c2eb109e5192c8c44a880fd5510324c35db32360bd956a094b5cf3934d33ba7781180aee975318e03ce0d5c39651efcdff4277056a9cac749ee10f4932a3c6949333ecafdb69b2a1f1d4c24d55ead54a889e4317def26974629f21376ccda958c13b6efdf703efea4ee3eab891935d8bfd9bfc5916572ab467085a237effa8322703da0f900a3806c6107465cfdb7b686e7b4c457fed6b2c16a48a4923e4b5da6366890ba6a6f30b68dc179b203", "", 3, -2145472693, 1537743641, "13f0128c911602d3f73cb30789cabb443e29f5ea2d7a0c046cae5a02bd74fa0d"], - ["3f1917490262bf7728aa7c82e754e8c7d3cb9970ca49a456e9f3b451a7c06532a97caf194a0000000000ffffffffe25846b4172ca4b0a67a11aed063434f1ae582a2b957f651d441a436c202b6c9000000000100ffffffff01293cde05000000000047aa59930200000000000000000f15f50100000000b601b7f96dd6dcbd8067465471296fb7140a2116805d846232d84651fe077b3db1fe246915a6a2dc903713b1bb052ec36f25e82e94c8594bf52709448f899cb4efa85614e40e0f2bad1fa3d6dacee4fd368a3450f484b97345c064b2e1a53eca00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c9408c84e31cf02b6b8f96eddea3bc8bafc2ee8dcf90e5883fafe2c6cf604d5f70afa5bd06b0bab5fa8e376d05faefac4664513a1955f34f86b5dea9af1f8755667a4c3be7126e3a2949ff6565df3298f2730deb114e02986da8a9d1e33e2b78c4100230157d7ca30a2e37098fe46b3007d33dae6f95b486a28c91fc4d96759003028fcde9fc29a6425033a0697af61476b66ab2ebcd8ee9e0b7ff7588b75b184d0223a70580d56c71f127d631fdf896446ca5d35aed0e9352290daee8b78d3e5b2d0a079f6111da06952019807461eb1cf45a9428afab9d64cac15440460f6c6b9a47a5813ec8dd703cc9c0cd54b7c99c7e19d66bb32a7fb4a7cca7905c3980cf268b03202924af9a07a273665b31843b2518a4b7444583c605ced7d2f4baea5236482f022f1cd646855107c9e8a9a692a435bf2c30ea7d9f49cc77bcac9bc3fd771a71c2032659355e26e88239f8bd9b2982b3a7fd84d4853a67527447149759379e90f6c30322597a9e447b4cfc366436ff289e946be42603f52a76918638a69f6cd4000b420223032856b037abeaadb93e06ee2bbb4a289fc0ea42aba67315a82ea6bcafdc3ece622c9d585f0bffb28b53894b8df5820962fe348a1ec240abeb4dd7254ddce0ca0aac96cbdd95af37ffabf85d8eb7300a10df5e9ffb18cd76701744049c175c79bb8078ead72fc69d63957f2eec02ea925395ff03d5b899a93c040bc709076ac27ef7295efbee23e947fb640b8a5e332f0b0a21413a8f49af5a657bf1f9673d02ff6ae86fee636a0a4c20ec88177cc672ab20f64a7359b6dc2254df38052d63dc411035e977af959eae1f93c49c0337844bca68c414701cda31e0f6e2300848bc3cbc88705111baec9a1fa0143fa64d51c4aafc354c1cd7113ee2b2ead2064c1bed279f8c9e20ec47e6c31d1f020e97f60b10ee8e87280c19a0717abee75a832ccfd8f4fc2e7f85e4dc3437c2755ed2710b1b0cc8084063b6d2f305832a6e5f03ec62616abaae9319e3c4c1193756c86d95002971232fb5d3964764f041f6d7c5de112f0794eedf9389030f33617c48dde16c77d6d1c00d4fbec5f317d1b86361d1052355e20f964ac1b6d127664986a1b72249b11a76e17b7f0459919ef49b413e550fde53dcd0a38b2b68514b716eb57503f659050654f263ec1574319fab47066ca6a4779df1f2787b3ba1ab4e156381b6ff9ae14f17890e4b14f5bd8d7f6714406849d5f355dae9ca19c5d61fde673a1ceb6d7815974c1db49667b45c59eb4c3723cffe5b74d5bb2adc6ddad7885e19cf7f116ba3cb8948ad29c4424cdca12abcdbc8119a12d0167aa340b8d562daafd9913c2e0c4b305edd7867b6c0fdaa5f6e22c33f429a85582e3cc114cabaf941b6cd07ae3d10c353c893d0444611abb8519a2875dd6a4c399c2d95bc1669536cf5839d311228d01f1a28696996b9d4b8fec5286307218437e7f58f6311b0333a8a28ddffec6f4e0e52a1c63efbdb77669649cbb3b7a8ed632ee0da742d581b8c7a468076d08aa8225235d3e82aa1d58df16c4764085dc95c10c746700906e98b32aa4d971bcc91c5f41e8d72cec27221f81a52efe67b9fe94b818f71f479d46a1ef2f304d3e9e6a14d4318f65b82fd8a5e757454cd8123a88d860cb3cc668ea87c0fa2abd92bc2e13bd468b28b84a22848be9f889bfb348ed6471c493737cec9624ac3fb448535c3148f4671b595dbf67ff3e69147074a850bbb2e80418cb5d93b7ed9e6116988ba9b20023e249f232a530f8f7e04c49b5878707c8c2e8847c6ff48083253a53fd7b5e2491db892b442bdd70df712bb050b0d83c30a90f8e11493b5c0eb7bc222350c2a57258bca2864c5c2d45e031d43bef7fddd4d9073a47080e9ca7cc91abe32f07fb2206ec47edbcc75e12667cb599ae3240ccb309fd3f6c07167c347339fa704f703dce3c7fb107a48c98132bba9006bedb9db71c4d2c7f3d00af060f2f16341d28415adba88f2e7f187f6044f8ac5e165fe71e4fa05ce902026e91d659a779f808f85d6c132199f444676bf34c3340635f4bb6219645d3d4dc2d2f8a8b34a78c8832517daf280753db20f67a5dd2ea605701b8769f757d197bdc5c1000eb057f12dfde3703e72cb8fded5f14a6f8dfcd8e4a0ec2b6255029e41c4c04b918e2c2641820843f5f022be00c4aa8397e05cdc073dd2e8155e263b1e226f15366dedf7b2bb153c0a81177421275a88c16c4b033a574230cbe6ea7683a8fbb727beb70216d8943e2370b8811d0f06f90853c84083e80dfd1947e365ab00000000000000000000000000e96588094e211eabf70499a1e781f4f63307db36348c93be08d5ca3a0bed2989590264ec67aa58a4d2ff6c4e553cb04930bcc2212319956716694791a3f48aedda009e48c1bcc638060b7c15b9f21abeee06de3128667653a2c332366212f212000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f9a127aca35c9ed870f35755a8a6ed48b985bdf9b6cdc4b5077752ee861689e661284510e96112d5d27b1bf76bd11151957216b0f6835d6f8bd3967fe403461b456001141a535f7d3577863285cc5b0d42cc881d3f047dfdf0db13cfdb9d6d85f83b2a0d9952d39a4192c2cfd7c56f52e7e27d736c299824c8981769967f1c30310ac75f3357169226c050ced3d647daf2707f0aa424011aab3d831fbbf10d23a022cbb2f6d15b58c11e4e4776f82a8e50ebc3044387bcb1726cdfe9d8f19ebb0d10b01167e92960b907d16c56e966a349ab28f840910e2ce800669cf74653e7ee4ad7c8b4978bf3e5d71415728af75916c4eaa440db4cabfb0cae2825dd9dc238cc40326154303e5520eff1e418c78a8d357df758bd2157d3c0d4eafaad9a6a0dc561002122fb42488fe6e5bb6533f784e0ae301a18474fbe758c3db7c311dc787dfd3b70217e8dd96af229d94364a47691ae6d5edb3d19dbd600579ccfee9f28f08f63ab9021a6f2a500994703fe41c1f39aacae25ce0cdcc596cb8550adea6d879e8700cc2031e64f544d2b5ff3a0e64f60e958d5a7a4340a288a23d5f7087c963f645c8238863ce0ddcb91c39a1c78c75f95d87b3dd7f5d3bb46c2ca86fcb03967871536861f3834d89c6f057c380bfbfe5dea95d103db24e2667a42b3cb0a16fd81cecab7399f6fa6db4dca0846f858fb6c53b750eb674f1a2149ebe723a7182d858c3a9b62d498786f170d7b13635fa059511a69dc751809ce0567d257fa58553728767d148f01a88457cbd75f9e6daf10048bdb9759ada044d0010e909632c603e5e798f5b54456afbae3a83e13e96503aa8d672602ec1221cabb39fd0125d8863345d28d7d89962e6473c1ccb31f66170cc54510ac593bbbf540af8b663ac62bf0cc1afdf0a61d62d35e1c307c8f8d7fc84e2ab2cfd5d30fa0ae01c3ba3aa26031d9ee2f28022d9bbd51a86415cee1d99e83753886ba985eede302263d6cd125dde5b5e3684aeb57e4c2a43113e6d23a7b2da9f0a7e7ad731e851fb1925c966a17a76e304c12046e95c286f9140a3d24ccbc74bbb9864124d1eb1962f2022a93863f7fff1e8f99bbb90903919f64514bfb58aeab1ef8b2dafdb7f8538c10ffb780caa2d34a6bd076f6d3ab6dddd22b6a911c04319ba4159e474d91db7f6400ea94581d713a803c5f7fd76d41a408428886e3231e87ce484a497b65566db73d90b7dde44c7ee571b228f9dabfdd4db588dcd4a0812150a8df8ecaa923fd1545daf2d0dc7906088e7412e9c313842905f07cd08bbbb1f9c0405d7aab9df241321457b8b31d41f944728b34885de7913734e4e7d246e95e54fbcc671930dbf1d7878d16a1ec23d78587fdd500906499b93fe130df3e54c1f2eac9a7addc3e1f686d0d28802dbe417743b957ca0f24134623afe35f891cf03dbe4ce89479dfe5b7740389cc060e18273c7b83f4e3d6504507ac2a5d46a725263c1af62fb861c96ebc21074b7b02eb089587fab56906c9d41647397e35207cd247e86f5bb3db9d71f90a46292dd40feca836df5eada2a941dc52847589065db6d9eb530010b8cf8c6cf495a4cf8094b4950d5ff59e06089edfb0fb5b8c63f5a8053c1b4bf59684bddee25931e8b3c3fb37b06e817799d10e7900baa2aaab8e9e185eaf5ece7bd9b72538e4946191ad31f31fefe56ac4af43b7d94b3a7c9836d9e8bdaacdfbf2c45f486ac7c1c785008eaf0335b9c8e6a51e3020d717d7a57dd3a8d0082f7b8e3c21933590f60c43cde4db9e901f01df534778508ff50867874f73e6389099af1ed861efe6a438bddedfeccc0faaf5a07475dc95b79baade75319d3700e180c958700831ca1e7958b5b7cd40e4df3cfb013e8926ad893d7dd37e6157e272b1beb26ff597873ae3f6308fc7c4835df5cfd12a2d0fdcf9db5d43b77874b188931feb2c38edc60e2a66f9043299f7c1b77909275658ef09ff18427518384aa4a964839e87164f831dd688533ddc3dd2c27ed8947a17f9a11114d6f3c959c47b0cbc0274b4ab363cfe0ee54ec463a26ad70a948c8633e61cd6b1121001e3f5296f0962a7372542c39b0557d5c806d7fe586efdc39aff99c47daa487ed27c398a258f02c4fa73b651767ead85169cfcb32d8cfc312511dcf72e41b8ba73f67e7af6fd9e01b0e2f5983d8ebced039d820ac8db8c74564d6742006a190091abda1cc52fc8eaf5d3542c17da6d28aa8e976a0e5fa00664c4a77cc756f8d9c69776552531623ec7de35e93805e636ca87440dd905f043db9d2c353e508a895477edc0c96f3ba52d69980dcda4f3c89b6f59231d062fde691ca8deb17d1aa1b51eb136eccf9ccc0f94738a7212c77c84593617f4c88fa3a7ea70c42168329217b2add24524282c6f7993073356b318b7753fa537313ca5d81f1b4bc8a0f", "ac51006a6a5263", 0, -141643227, 1537743641, "c2623bc97267839e12196b6497ca08d0a119a7e8a826a8db5bf9d9ef07f6ed37"], - ["030000807082c403014c357b915b5cdc61ae8a83859e4dbdd501dc2a5ba30be9a8feb3271eb6fa476e000000000752516353ac6365c27cd15f034e52ae020000000008526a63ac516a6a6a3d1c2603000000000552ac526553a9a93e03000000000000000000fb7f0dbc00", "51ac0052006a", 0, -294310016, 1537743641, "9fc491741c92e97632a7990387076c07b66c8a02d3c9e50aca8d752aab53f44c"], - ["030000807082c40301c5a3ace94ebde40f649d8008ed7f7626b445431dfbeb17b7e97cd8b8453891670300000001007694ff7c036cba13020000000009530051ac5252005100f11bce03000000000251520d132801000000000253007b120274000000000300000000000000002fa55702000000006ce031987db0821f984e5d59179b5d461d501b63d8120581104338a6d002724434fa24d03bcefe8acdc29c4867cd5254a102220d5dbae5e02e1fac1f96f3b2b52d819697e0b3bb1fe68fe0c53579d21ff2c0c892c0c8284d2f9a0f50748e46c9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009635bfd7b7fa3efd69a870b3c0400f5cd14967be55050135a49eb87f1055dac1fc1ea3d5d63e41b8d997f7fbabb795d0a670e0da24a2f677a71bc3d85556d73f617a6f72f5aed0666748a351ac19ec2b263b3170eba2d81f5d5d4caeabc9bf53df9aa5436c928d1196ce0824364516e20c041d32378246060cf3e75c0b85a8ef032fa51205ac5fa38ec130df2c6aebeeff2369db04e12d88b88a0eab7b73f1d1d8022d31f4f37ebbff50b3dce6eae922960d925fdff8e38424e4aff863d90131f6e30a01771354fea908b4727c0503c36deb0886634638f0caba637553bcf9c84310ddfae337d59c5682f8055f75b0c300e1d8e143e94576807312a64137434cbd4f82030ea80d98c3611601933a5efca8797cedda3ed6a297a4ed9e65683a9728dd7cbd030597f1c34ba8373b285eb9d0db6de3546b1089a5799d20a6b022d68d42e9c8c0031aa8559a2be7e1048e8d5bcda2bbc07c13575c4ad8fbbe936a8ca848e081669d032e0a7cfe66cd1496053b416d23738de3b34142de064437ff1fd71cf93a18e332022c84e526013e08563e1b311e1d79d52a722fc6642655ba1e27431d82551a7f9ef444c72c9fdf0c789704ba14292e1169ba0a6851b62c03985866e860a2e2c20b47d6c4ed045ca26522620a0cb96f167036c2de94f86388ba7de2a6ab5be9979970bf5c034e108e3c58cf8e07ae47d04713d800e09b94bed6ff16f5ed306da9e4271e42e47e5c664cec1aa39546c21c3fd77ebc57a3fc49bf44382defbcb691758d1e6183779a0900144094082b3aa2dc42234adc3bd315a6c2b2c8de76befe3a4a21c35882b3e89150655e798bb68c1ab2c8a9b140d1c468c3f36696cc4671417df8e731c010c4d4a4bb0f8ec01c61d9d4f7524d590b5b678e43ff100cd5c032ff7da25a17733d99531da7089438d699fd1376f6c132d21d608ec462ddd26e3da8da5e857e12840dce52a8dda0651f48928f46772234881abb78aa4e508a898d552615fc7242e65bb30e7d51430c1c6f61cd69fa8d7ba1c85139204865fc0965b531c158ad9b0d81144783782bde21538d27a82e0ac06697f5638b3d5919237bd4217c7c02b82db5400f736c7b50467c529e2834a43f87b6cb4300fa232f59762f80485a613e3210ef3df11c7c9219da340997ae9b1a6202711fec3f814e0c405df5b3acdf964fb6d0e37bf5cc6c5fb540b42be8a2984a872b30c96b9fbc0af5b8e26038ff4f1afd2079eb2c45e8d3bcd9117827cc4bc7ab5ce2fcd4f20b701d98b4bcd1a2127e4403ae679b7af48a03c3ef84812e54a03fedd78842e0f15f2e731f0646c3a49c2a7ac676a43fb569351c0fd8eed7553f0b719245187d1b4412881afa0b73e63971474db4ffdcecbf24c07f0cc1dcfd36807eb1554c7cf919ac8e9427ff92dd44c47cce5dcfd61cf8337ec3981b48d7ebd26218e1cf59e7dcb36ae9c48d867c625c3472ce52289f59703ddeb6c82edf54a3ddd66ce83b9faa3394b45bd9732e9422596de026458b3cdd1ec47b7e65d329f124ff710a010265a7cbade33ab41557fab80d9f47f148d09ed7b7c3613ce288251a359080e86dc8fa9742ca840777da84af81907e4de291cdd5ec92bd0fc9b9d23c097118025b77b915663913098c5131993418ea0479398ba7e942bb88d8ea23073e4412bc6d01dac1f568a2b9f113c101e4161e4018e876c862fc8d83cfbe855ce9a32c0a77f4d3a2b3dee7c5630c92b5686f022871231f122e819f7444c33a87e5ce863883923ed7d70e0595d128eb39b4565e346e8037a2a63c4dad338ed18fa8965ddb936f47fca62fb19e00c95acd2b76fa6c0ac497386d1589ea0bd2c13526d5ac1607afb956696f73273d1d16bf865a948c69fe0e54b092b745ec53a4a9c03c7fbea8658c08bd2e72b78b335f42db0d75cd53161bc5682880182c499095018d0bed143e5fee053696359d1f795ec47a35be7139b792f369b5ed22828564ba3ea5023e1881e3e9d9faa6f579e07a106560e443c6084ae0f83553e5f11c610024151a42aac54577f26acee8374b545f2e4ce5a568cc8c53010dd1bffc33785373c1087d67b9c729d426d73c43bebc8260ef8cd7d2fc8d2e0011f11f1326234af4a756d227c6b6428da525e7c4c3de6e74439edd844e37784c055a259ff2a6ef95ad4a8ce0620919d72977f2b252cd734ff6543a37dc80bfe8ff491a4e749d5108d019769bfc5760e689733b8f924ea231be2ba89c8b100ae40abd88aeceb0b7fcf573a6e6ea20f4a903ee421336c4b60658327276589daa0000000000000000db219e01000000002be733c4cc13797bcbc2317ee99673c63c9cea8f40321a1beb875009dc8175a2928252c487dd2e4cf5eb0350b7fa091d6cfe596f3bad47d68520177d1c340b261ff834690b30342546b9f5df8a3b31a33a3cfc136b936e62d59694c0b967c03a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000676243906418f0977d95d29920b4c39f78b774faf3277ca773125c3fc3f352a4cac5a8d7e3a29047785f7438160eb8c161828f13bbddb8c3f837d554ba63e18232dded5438581992038223caecd568a1f48559b87b142799b98ecd6a65981abbf70c686e06bff5a41e381e4205df7d2da098a33ae0de9131d39f7a919af118bc031f43d19ea7800dcffef9a80247626f6a6e7f7afabc27f870563d34fafca96b460223036d37f2fe9733a2e5f71c3fd0a4261bd8077cf07a90a1076e6c01fe0616a80a091803c1e3777b67bf7d81e453bf3abb507413c8853ecb479339cefb33ebbe115edca892bbe8c5f0e17142e6e4296db94ec3545a95ad5900f9da6aa9cf091f89031409fb7615af0199d71985a598be330d23bce6b347636af82ab58897fd535b610228a2c5ee62c54b682ef8b0aad6590f8474512d0462c05803b96c74856012cb8f02132305a476b4c24fcf7f61db967e93acafc73c6226b3c81f0aaac3d75b51ea30020137c287449b018a69298514ace9454d8daa504bda160ec541fd36a40f0df82f020bb1231ccaa97ad9fe539befbab2c66b51a16147c382aea00780669a19c9df55967fcb5439fad775fe0c2e1f12e51b8189242ce44882ffb80743295779ef539a64870df97378106f209c6c0bc0e34d3fdf8bd4d1bcb457deee28c9f4ef602b471e48532dc5fb0be60e9498f884382792a772120c9225a23ab2b5b12084c96d90ab411f6f872f4f8d4f653e7d0971b11e8f1856924376c4fa6ff16436e6dee73f7ae37be7ada53e9f1bbac94bf5aa090b16cfd215d681ac4b1c3f73894d9b61f52fdee3ce1788bfaa422d64c1c533a503b407aebb87660a83bd08264ee068180f032cef8f8017c38c6627eb28b2a1ea107623156e0f6e4cf2f9929674b2efb9fa6e6a661dbfe90204ebc1889d9a2edd9e03777756311847c7467d2f29daa3e06807531b07a8173c90685afcad7146ce3302f5bf6b7b422ec3c02ed645a72a10b83d72d92b21578f3c64a0687627b80d94af6665502be4cdb7925ab80492a5bc0d2ca67d332c8ca7ced9bfc1d7e833a6351ee5cde3f0245c4c0b06edf7c8c064c29153bf9ee1733712009c93355c0f957070d70fcca909f350458948f1a5b2bd043b33af918a154c26e79ffe066749d7044084418beadac6ba5aed1c65e384485eb682a0e4d1292b158826569559e0c250495c90a3c1b7bc8592280c28021b702963a53c28617851029a36fcbbe692439c2e760249890a59b4a4f63d5f2a91e4a084f7b9c995600d7aa6a4b5336bac07316940ea73d4a8f95ee9520a48661914f9e862e2958b7a9d5c673560989f7aa269b3f8308828d996e9f61e19999434a6c35cd898c751542249056fba25b79bcb49bd6ccd20894e417754877f0ba20a9a744e4badb879d13c3014a7baf611074c423fa47df284e171cbd916e3b4a8d08413bb28fac98bbed7b86234ab965c0b1e328dec8e91f64f0548540ede473e25b74ab6b6aacef631d1f33fd153f39b1944a579a60132759f29ce1baaee98dfb57d1e58675235dc5339af686ccc9156b8f86614052793d0dc5361d5dacee719fb7f3fddb21d38869bd3730ac06400a63727b0600cb77c5c463871afaafb54b7b0e032fbf897ae3ed86754077d6c15d3847d75142f4510c692d8ef25ee223cfb841e1f206b728058628e24150bf6ff60c819b07c0cff10245f56a00b0efcfe940a72320ff9ff3875926db02d0c1397b216aed3afc759904f728dd4dbdde2701bd2acac03e76e69629b13ed20c8008281815103a86097ef645b7eb657fe112add43917bf7c663c75a1f78268d71b925a46a4389184efae16f79bd67f499431ce971252cbca565a0de39ffb5e9ab2bb8f0f83e5367e8bcc453d57d6833a9ec57c8ecdc8f6ba736e5b1c50c31867a94e00e2c10c107036afe804e03a010a00cc5484913f4fb88331f8a5fceda37d82eb50eb7985efb09d8a9d966d606a9efb807cb73d6aa318f13eb08ba301d879d99d55c6323bd71e94210c2bc4617edb6d5073a8938fdfb036fb8f74bc5b0b4289a99fd8d6565ba9e9088b01db2f344feb7365b3ec0db6eba0bd857321f18d1d3128028a0a91783e1b0ce611ba47776787f8fa8ec4d212aa943577f991694ed88e0f0d9b2155721bf39bdaf3f8d3929a8d09b9b06aa24a77f0838441736ed34dc6f38bbca6096673321555ed5ce68098a3493d6a1e4fbdd1f4402af06107ac7007df89583da39bb70d904a0e65046e6057ea7fde0310b4e565623c76257a25e6e71ed87738df82c7f0000000000000000df4ade020000000042dd12d775a714a01bf481528d9aab9e7329b0a89159880a9e4017079ad8bfaa7806d65a0761f97c8737c39232eec3a8d92c7a8c93311f7dc9d00d3a7a3f0c3f7938bfcb96add2afc8b5ea0263726c149866f4bde6b1c29d13b6a9659d11425000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ca98456b24605244163aec7211ec08e7f2296e2b966b7b1bf23789d14963124bb76f0c7367739b283e353479bf9cd0c06dd8d298a5f34b13fcd8de3dde545ae5d959b89ffc0d0b451a89e6bc5b17353a09db7a3ef6e9a64f5eed3b5a759a4cef2ac40b5a274ec1d25af002ef18c872c2581a3b27a7329508b0dc2ed65da6e608032304ed1ccb074afd7fff9c40bc5c09ebae79e78cdeb18f34915690884065e506031a2b9e3565bd5acda392d71b7014e2e12353700429ad8874d1cd46f995c89f780b0333210dc1c7ab3ae191ce1f9d0e1595fc059daf11119ea93484b6abd3ba10ed67edf020dc4c9cec07a14974ce87e4d2a50f73f8de66f17ab81b38910795a9680219da9e505a15c10db8a60e722d322ec00d921869ccdb7652e755d427872c7557032654b8ad0d6e505f6f2d7abbc561555e147c6a833a9d09bd72d55fa0d3f6bf1803180d9d4bc2425d70bbca98e77268e1906f692f46bf40361e83eea13399d10b0503041f5130a3e953e20c78764c0c7d1f361eb5d07df293697f6dbd6f8e242d929b020d65477e34421c9bde6b0edc5e826d6b95bac75279fb5b19a0b067e4e2f8f3cdf1051eb3ea34191c008d69b2df36d42adc8f232ebcede1ff78372706e5042bfc817fe226620e8c312edf7bbb415f516f6a33c7dfbfba435c283cb9983f79e236b362f5552edd0f84f22e5236ba45aa799b57e720773fe7b4141bbb3da8033bbef2a574d98171ec91061830fa52f59b7e26d0a9d575e9003e3d3fcd8eeed247a7fc1133440db119d0b379203585a113476091cb15aac0e72019a7208fc3fd3c44b7ca5032b91f144dd03a944a5e14021505411af938b1d74a86b7f856f663933fcf0e23880b82ed6797d630baec93c735d5ed606032fe2f0b8532b8bd08ac9d444143de4aa20450acbc698f4a40cb768750f1295f4849f3ffe073209c910c0a838ca28803a94d56fbd497a8a02d7422f03996d56ffef09ef72f685a1d8eb20b242ecfff39a2327ca51c5727e8e342dceb0f468fe1bf47aebd5d49949f30ea2afef3f99300ac4159a70e79c28224c1c9cba87f60a08b7f48cce3e71b2f0f98b42f9213e6f7900d6ec0687f4fa1cf73e2275d8b66b234e81d9c9b22771a3f3e3b8110f3977a1aef222694987771d8936afc064263c99171fc7005d7e7fd8dbc57b252e6458e20ea499a963578dd297a22c0bcfaa508231e7fe8a894cdce25a632beed297728b0596baf1b751879d304093fa8f5dd95f57b763cc99ce75a6b124910427b19e4fe83643567b953b10bbe581d8379994e23ec7acdb4925749469ae1fd1d9a7b086c09385b1a147fbd1d8029f21e2f0e14f2409adc08bd44220c7d815ba02eff118a46609fad3056e4265e0f9388eaf4c82eed88667c8b8896c9a295a265356abdf46244949c72996c1f5edcefb8e6ca0b0b6dccbe29162a925865583989c380b231cec7de389f2aaccd5e0d8076659e915bc7db2ef1794948b89ff0a6e4d9548fcd8e836eaeee8c861455533725f443aaced2ca80fb4a1fb53d73f8654f5d245c6d3bc8d4b13ad52f050444694ad79de9db4887f4484f9a39325e536c86921dcfea45bcac5cfc3e5b4a5a03aab77068a7999f3171d13004b374e56a706729718764a259053742f5fea0c6311efd464879d790ab64aa7a43472ad2988918e9afe873341f4aa4762aac96882b7f7a877152d8e77c8f15aba4e02e107613677fb28729f61f49aa2bece4957d8514de8c579814af0b4b6608fe2fce544395fd36adc9a2c07b825ed22eb7923bea585e50e13e21e942889d23595db4a178406b11a98c090879fdafe1596fe7d91766fac550f84df428e9d0375d1585b12fe90ba003db55e4ca62b2eae1d45519396953de8e2168f364add7810f658efe0319103b2e178ffdf01a62842995533026706db2071e511b28944b36a0b2257a675919c1fdff14ff5a06fcccde130b13395e09e0c75925c3c725a05d74d4f6bc228d5713d71b48f4cff10911a309feff0782cb6f7616bfc2b9c3d814297b660c6ec61b8c96799d9c19b0abfdde10a8648ef256df374f9f9ea490ba53171d895a11508dd129a9338bef5c0e72d15f1e277f8716863fe82d42d39f497b732d87b43f9c94ec08260f89060ebebb3cd94fb6499472d3a674a40e0e3b3b123a2178b50386ab27c8ceb2214bb78d3caf05cac7f27c52fcccd64f4224052467dcf427941f1aa458d79b56108124df22063953bf66ba750bfebc73bb9ad96fb89e27b2558dca9958c96ae3899a2ee92dcfc4cf75e211631c042c5b62e31335fd9bc374250b4fe8f4795cdf35fa0b85079a8c8e627135a7f9530aa33872591956f0a559630d332d04542bc998c6fb9583e42bb4944598604569c07181ea28b3e8bf5a8a5b2ee74c2cb5ad200234b3dd752a98e953d404d70b", "6a63006a00", 0, 1443795217, 1537743641, "ed013d233cc9678ddc44d37d7dc1c79ae2af95a9d25c656fbe6194030aeaee96"], - ["030000807082c403045526942d80f27291d15c245be8490b5bb680ea6c01193a078e5ee656c500100d01000000035152512aa4d7e1aa46fd4b4de57d7d8c4dbef15cfd3b0d2d3776156f76cc54f3f7ad1d15f198340200000009516a63535200006a63ffffffff7be8c78647e3f6ea93c399840cad3102370ea3b1721be1fd121b922bfca463b90000000005ac63006a00b713ffa5681134b9098b7dff0d28e2abb1d02291ce198455b33934715390dd4436a6814a020000000163eaf036b604caca590100000000086a6351ac53516353d3afec010000000009636aac6a6a52655253bfacf7020000000003526352f412860500000000025165000000000000000000", "536a65", 1, 1362626858, 1537743641, "a61a80410267407d88aca743a17a42f5da3d1594ef8cd9767c0335bb95f17e4c"], - ["74661d260142bdf6ec0e16ceeda6a39be86a35322cf38d49bc5c5bb3a43dfbdeffe9c0b21502000000007239ec620368abb205000000000365526a9cfa7503000000000165a2ad0c0200000000026a6a0000000003dec64003000000000000000000000000c2bbc88624a484eb1036b3dcb115a9451d9e1966738131089f70f903a5646217c92115d6b6ba5cab959148bf86d4a8c7f805a0033b774844a99ad987a5741e9915d369cf0d597b211843eac1d270f30754ad1baf65fa73ce9d7d76843b9ad01c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb2e4819b857a07e0dfae6bfdf5a0ab06b075e39a6dc0d723e533b75648d60c64812aafb54bc76296fc1a06e099165482902b3295d8c251df94c3b20e79ebf9634c76fff7f8e262773a6d140e55fcddd05fb6543f379dff6e3117c64ec3ec045f8cf148941441f4f8908a3c6720fe108b1697eac81c3c1798277c013b2d6153d0306a9fcb51536ea936972ccc5557c4a29993589fe2dc8ebcf7bb5a8caff60bb92022cf3d51d13d09ab1a202d67faff7f20395b3aa068ca75f5dede4b0eead99cb2b0a04e706a778aa66f6d01a0afd104a2617f90d65f806ab0ea6157a5a527b2f4829ec84f0e2d7fc67b2782763ce9110d09a82be1d39d0e3ddbefe8e66a493068fed032c5c4d24c060b9599494a360976efae8bdcf5c36637099c626fd8f73bfe74ee40320f6ca4ccc70d8921a0659180c362b8f7a7721c4e6e063d62bc5a4c834e66856031f4f653e4a665b40607025881b4ea417caf537e6e0414f5826c948831944a1c6032ac9a5c06ac207262832a247ea517dcac802775c6b8effd108b866ec50a13bb80208e41b9d54a634bdb57432847fcbce473f51fea9cc597a12fc4729485294a5ec4327a82e5f24c3406e53e9fbdb190dd9077d286a1a9ba71809e945e84c83916b48f768d664243c046661b57be3052ceea3c54d1b7f94786bc9ec891e08f849debc0b2c978346d35b596beede6594f50801c122ae955dd690cab8d1516a577c5acf86d543ef1e9375f23cbd2092e9522f6c2369f71631e5da31fa45dbf401cf4b1f045a9b762d05bf97a2785307b38e7a2324d58969a515d87a69f5d4d68e9b724ab94374c99dbdb99fc5725328e5a881787809ec7c7027f696827204615bcb051b5cf0b4934f36b3b0e8a8305aefb8b4ee7608f411dffe511f0f7e143d96db069f03e0a682fac54d60b960f6492fbd3bc3f1ad00bd8ed3043560182540c55f1d9f8d4d2ee0b1999d12f33e5eafcbe338933c613f51a71bec0c8088fd02b1888f496b71cc92086b35907cb873f44ebe5a9584506908b738e7c7c6b6b0e9110b3162f4143380ffc6ee8056b2adacce8106a26166e711b4fdaf345e4f5d581ebb26e3e7385a033a556610e84ba12ca9bc8d1d22492e3bebc4dff5d0939e0144bf1a9299891c0c334b82fba3d2db555864b1bf86d2945fb9176d2a148b9c869a7855fbeb608aa6c6c5133ee308f32cdc2acd027f2595ba61eb2ee152da82dfc0462b030683f01de615c2792aa4a23b8aff33cf167d0faecb1bde81005c5600374665b83d81652f50c9cb4cd5726e55030e41905336115805cc8251f5f0954d5b9a571a195f4809863449561bb15c705a2820c3c2e7e1c1fc56122972b4b2a953de4e7fc0dbb28eef3294fdc34de8b85b1c6a826f80edc2afeccc11ef4350df129dbfb2aad0e857fac75cc7e84f9631439d5b1d2705c5a5dccf7b310252d999f6c0651e8b40d6b79821be30545dd295c66f0ac5cde5a461a32c1cf2bdc176cd75c1935857512d6085f22c915be2fe0e64ea84a04e31158c6fc465690ea908578ca850a9260e1e825dc81f419198ba4e55be9d4934c12e7a1632022a119e04ff18f8689100a702560d6373bab01014ceabfeca0ec07bd43aac8afd3f251ab3d86c3017f06d3ef4f65f635dd1e3b5aa452b4b6e77068516fd423cb8993f2fed23a272f5734b5141567cf09a376e4f1fbf3b856043dddb81efcc31958d2ff85971abc0c776f330a1c358e6e9759e2ef518906f94bccff997ddac0db48a9832547f0dbaf13ae08fdcf1d128a486fa703d0355a35cc26114645f520c63c0503186cbba6533c3db58a7c5e69ef5b93b4be3dbe831013668315d08bd44b01c574cb48612e769b94d104a5984e3a7b9e585add865b3a4d09041d477bd8444d6de87c3f55952876669ad3d9c55f633b24b703fd5c4d3606231108cea4fb1085fc35f66857856ab354fa1da39588eee53275b85c3a1f9bee470cea742531ac0d49923451262e926c920ddae5d6d3c8d84c972e331a5cee6b2caf25858fdf259e9a5ccaeaaa69987418e8f2c3a4b3ed8759cf541a7a007d98b7b951b37b804e9b4f039f65d63851ac1af7b9f5eceb11d398fb45a6ceb9511b4e9376c7155c696bd2bcc20e63462bd3a87d0b0180746da02b616f814bd83c90c20b3f417f12f7219f4c2a0ca4fecfe90c9444c4310aec769ac81825600e02951afa7dc05351dc7b4ca4f73baf483c17f7eaf7b7b97796d8a61ad4bae5bc390f7804ce3bbcb28c13e05411863ba67c8a236a16b50298a2c05c63f448218bda968fcf9b3f503000000000000000000000000468c74a91350b253707fa958120a93020eb90d3af228c4920021cf17f96fb3359161a2ef6a9658c4f87cbf9dbe11fe33462fbbeb053eed8d3b8b676fb9dc0948ee0b33da1c4eb2be08b04dd1a9f5f134601a3b3141c26d187a3aabdf53e1c0620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040aa57763d6a17658c6ee273bb3ca91e050e26514420fb58b09667d1e160e0a8d6ac69bd22dc333cd2e45c11910e3cbd815739212097170c1e9b26f40c338dbcf6e5f955cce94051601c822292d78f920338752f6aadee140d0faa133e3eaf7b4668a5971d08cc42790bca64735a3daec10f3e71a540a39c398705e8f2dfa93f02209dc0c57a156dac99f2669a3ded04908f5c23cb456298ab66afa169802bd02302194145b2b9b8028df553000669866c9228f2c7d741041e5e5ba14e2f989ee79b0b059204f10e155897095961d4b76e68dd3edb7fe4826f52464ab10eab8ac8a64ae83ccb6fc72e7ce47166913841856877ca4d1cdec3ec5cdd695487313fd19a3803126c92aea8fa4440d1dc30574512df02db887107263cd7ed009da037f5c561e6030d97a69cc436f2ccb8b7d8ef98c3a649412c872e895e3ad574c8f0d9d7133d550206f4fc3f00d4cc077dc735abf3eac1e7a17c09dcfa2d5de1de619c335540993f03146e8792a22436181887e73b8ba4970f266c4ea8d9df8b73c0d6d2c2878620970230206cb68b94826d639cfb451df1772208c0fc738f31a5e575674cf5612d7cc08b1a16b7b2d3fc1fc591c7336bb52df1f38306fcd6a692b3b1fd8396647e6329c9bd136c8f491d46cdc274821bf74972a1663c7e374343f229148555c8b427bbaa94cbcc3788b62b4a1f7a508511bbd94c7e7fa94ca67091b9f69f399f27e1a8ebce24e7fdbf6c9aa44b42f45d4288c09ce197e816c97afcf828d35b764c48649acd4ff652a9a21eb860ba3b2e40f396b4314a5f66892dd9cc1ac1cc6a72df455272c38df85ea0ca06369fc1a6f9eeed621b30b8ad54b367b47ac8dd1544eb2cbded990099161e279e1fa95b926c3d10b5cbc7a6976bd64dbd45a4a3fa570a7dbae711fa0d8bc5fc6af145c8b1f48b09d6e2c9bdeb67e7b0458db7943c6e3b0f362294a2c4bf128dd8f6b7c22ed2af9b0f7e537168df58f391857fc52e3ad8bcb67ef52fc8b9109452cc864dfafc542127ae278dab94ca1da700f9bea459e62cc550dedf01a9751e223f213842fc9f2e374c2442000ab97600dacbeec44ec3cb0d5d92aa00627fb42d4eade7631dc847fba746d67dd42ffa4436d262dacf226ad60fe3ed7cbbe67e68b8b67787e36b5bd0916864cce3a17232fc72e14f7dccc5aff15206dab779c526dab683a8b060bfa8faa64821f6f6f04750c3fd4f58a05e3d3b86c0ab3e93e06021888e4a394b3ba4e009ae4d807d4b2b472e2d0e1b0398c34c7ba2e19e4d9f3c2ee55017b7bf4616ef07ebf0b14d4cee791faf90326d3430682856ee04360fdbdcdf724152b84cfd4ff2f00939dcc845483b3517a2a058afc7cc0177a69d5abd892f44b322983f7e6592ba15da146947ac0af1404fa71ed0a108b1944e10a8f17e40f1016b3171967a333d1a98a3b09596ac50e5ff3ef11ae38d5f36127345ec6c6512c5b76d0f21589a14ef3ce5d1df8051104018db11090fc52a6169c3e84458f35ee6ba694270404b771435e3ce2d5c95974d9e6ac4cc23ff452ff327243e2e29f8889c203b4ab558c9050d5680e5e43864960fb122b6b1fe5141b78ba759e608ecd5831bcba1d5b41cfba1d087d67016232664be5cb5385f8cabc550b048ae6aedcd9fb1762498e40cd36a0fb561458c645e8650583cb6f6f724732da8f3339c162cf15c0897e874e8be838b01644f8343e1e2f9c59a7c3d0a261e2f3d794cdf2e2cb28259d5ce180f79ccf6dec3df0a0f7f2a3726bd53b3dd4b80b5a0d9b3edecad70a2e67ee254db017533d816dbe3ed8669837a1fcab658c4d6fa5448eb7a233c9dbeab5f21511337e3e269c858a8fcff31020d6402773bc3384e5ba5351481a4159df5312eb0bc433ae2a8f0d5fbf79ba4f8d80d0a5921a9520828fa0f882200c8f9fc16931b641b836abe8f27190dcec9da93414b36b78de51fc58707d626044df94ba71d599aeabe2e5a5476dd8e15678d08b279777dbcb5180b736ebb777d84543ebaf55ba3e9fae54229a40b2ee9a4f425cb529b1265c5ebce674849a94198ab5f1e551881d766dff8c7d4c48f658fccfa8d4857629651a83c4e6877aa21d3344abf936a9b7b12164d3502d820cc7aff2bee593e2bed4fd951f360e9fdea42135f641b384d9d2cfeac73739ff28aaef36b89c907c84e449e22a5fd421f1538c594e904b0783e3800de7f8bc76ca5329d10c9133fd9b0a1bee023603fdf3ba01db969cc83a8a52c67a90f74d96fca2c880a576e20b0ff369f9e53c4b336a41f3df2b5761a1e0d040000000000000000000000007686e061511d9d5cfeeb694442243e9e28275d6a33f12600015448b27c2458c649b3e3b58f939eab60042879dce2e4771d06b346eac15807b834d9db3193d6d12708bc3650c7e3b01f1d4c6a4eb7c999e96157e2068f82959a0641157bb88c0a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fd886c8eca5be32b9697de34e21115c01a40fe7021b6ed5a960005719b55868d3380fd7b06ed18b34e98b2c526bd91f0928e2241d1026998efb67bc27edd349a66c7fd9e77fd97eda2e00697858dbcf2290a3ca2309785254eea0ff27fb5ee6e9e995eb345ec1f95803d9874dbafbb4b245771efec056ec1e2cb04d3984321dc022028f2387b1760c91d8a355ca96ed49e2639b7185810647b3b32ab8b7e382f9b0314f5cd5e5486180e3d30c75b8a4ab149e1a6007fe7b786b9203e793c5b5fb9a30a0231684f0da5ed38e9a7c81b7a96c4e1f670a65472b4df85bf8ca57d2c82fe6ecb343270d3c81dc9ee5d44d1ac1085f700746d84e38bc3c6bb1743d46fdfdee502188f8281b5be254f404a7a8ed018da8531e80035ead8822bc6dd63c1e35112aa02156bf91028e28f432a482c9ed27158df949e1476ecab93d3eac8884fa3a9b7540225f4081e8b8e7244acfa44a2fd9dd32fa369ffbad4640f0bb7b228c788c67cbc0209ac7daed7a1ec8737e5096cc0ed70bad154d2ef81fc7218c0ed147c5c78b6cf0323d8ee65466422bb9600d6939424bf625b2473f4b127c11e09246b3ce2b2c4cf6a617f5d7b3d2a9883210e0aba38e24a8adbb6d4857463e880f9c780b652f7570e4460812e84b639b9fbec6364cf6a013b07bfc9d0a6adfa69c363affc70e0c7bcc4ea296b1ae9e92039a5bf587e40acd807816da5f8b7e469e92d9061d6d4390f864dbbb6404f105da11e60c697530f6763b2757063c5a451c94e43933cdef39e1c9e5e29d0add68db73834204751bd71bfdb690e07814597c9ab179defc36309d92ea3845f575c2ad43982624c54d9926c3ece82f35cc7bd5e92a8f9c8f10538e152ce3b67865baabc37e3f7bb00ff64bb22ef4941bcd8d364375ef8686ae94ee3682d13a8532953460d3c4c41d733cb2e4a9f3dc618cb51b580b4ae92116b844f79d4690176203d646887bc11b23a3c68155bf086024721b25b964bc884bc0a23fcc1492f32f5c7a7efe077e33e00946de34e9ba9d913be4ad753d1f0e9021b4ca606c68ed5882ff3c676a4e92bb0a5a5270d59b661e492e470d7a9a8f6839eb15c89df672e836d64f6007b1473a57330d3f4dbc8fd32e2fb32782cd5769b887c0db447ab69230e1b38c910519246a70b7a6ba03a52a56f7130888e1834d84fba0441dee27fa9d175faf2adc5c025ff2662a83d6e54219cd27959f336a975617c1f95efb38081ff2939c24bc6b390bb4bc1f7e2a0c32165e4e758b659c544ff31d2974031f3532042c1cc7be90e7a2093e62f2989484be1af2804e0d37678b7cb86d63d1b4f8744264a388019770478176d6ae9cf4e20f58ba5b0a5ef960698e9a5294290f988ea60080812dac6f818269fd41ce67a24600b22a49a7494c0d4bc04af612d2ec6cd142474384ab65efa7b1bb479779baa1032210dc8fc8c8f5b4d1ed507b6966154116a090e3a0673a717c8eadafc13d72951f7fe89af6e8389bfca8e72d895ff17822d44899565e9ae9a825af97ff2126d036603e6df998b0a831bcff034b1f97ef11f11b6e1617b0d6b59c2252afa02b41985664a87fc0cec9671696290ecb7b9bf63f34e533796ffb40d82d0c5c147d8bec2562d73f193dfb47552dd2829de48dd5813fd334b40e1816c9781e3101e242430729960f275909900401cc95dcd9aeba5a5ffa76c50a252b09bad79b412cbce18f37b1babc90eb82ee59f59d11c223898880f4e4b2f1ac86da8fc0bcc8fafca36483c0189b87945a69011289c843d10fa5df6502e7e1ad88664020c811ba49ac88a98f1dcacadd40f359406123eb866d66944edd40363e19480207ec1c2f9d890cd92e1b44dae5a773a813ff00a2ea02cdeda294a4c276c0c95edbcf773e94344dbe9c6c1a4ff23f3cc0e4eea2657fb7fb7a893e05f9c17110ae68d938ca1a0283993d47dc8699639832d32b97b926a0f5b73125f3e6f2232316bbe5f4f8bcba0b27ea12635be94bb89fcf42a155457454a25609a3cf4e9d0786efffe5d18419c858e9fb8917e4a25ff9d4e5d6a8928b40b87ac5149fa4f5471892c4074ad501292520e42875bcf2555005e54d6e9f6fda3398b3fbad945cc946885be12686de8dca88d4f0eab73199bb0f2ff4da2d99f61f815735c9060de539ee4a19e166a193f3126a3f4153838c31e3694904029e57de9eb7f4a1bd008a5df58cff359f05f5d9fc4d9f21f3848c31e37755e59f056d1a166d6b5bc2804ea76467313e047d753b8cc6f56c1d27e3a79256081c9641d4f438d95b76792cca168b363a8dc7689dde5c18ae6dc6acd634fcb0af1423f8fc89ed35c00be54cea298306c413645a9885863d843e89bd77b1f7cb5748c88189850bf5b06cd39e709d3db3766b2ff62f61c92bb0aaca3224c873793fe2cea30eda20cc38bff0c", "", 0, -1023941094, 0, "f44aafa4cff17e27fa25f8ead1690093304ac3341fa047f70d75d2d02820f947"], - ["9683f2650213e092d80f170afc329b957b0df005e5d99f0c725fd9b5772dd93e0d7cf66b050000000001acffffffff2e57c74b8f1e09e74d315ca2d7fddd06c9360c46e6e6fa0fac07e23e6b1df5db0100000004000052acffffffff01a1599202000000000963ac525365530053ac5fc3fe74029125e002000000000000000000000000c98134bdf4487525ea60cd7ab5b16422456503997f0487c830c74c9423054d17bcf93bb4c3c644c5b9f18502e8e92fcd86928ea1cee391ab7948a6e770c5672654301ef4605ed36030c35364784dbdfad0002aef8d0bb24fdfa786dd71e6eec300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a70c80fe07f34540b9d6752529435dfb2963d51688d103fbd2b42c1bab5b7a6bbc65e4ca7146b7b459af2417bf6660af81199ee7f32c003d000ad78cb9ae4bcd5bea22f52d4d208c9f98dbdd7478cf3b9ce5616d4374524a7cba0c5d01f0e9e4c4689bf30102af0f5398ac99c82ae873373b3fc52799b6dc6d8fe3e07049298f031630cf2f458dfa66daa875381f740984ff1a9b0fe5f4594438324dea8c2fae6c0211c5788393e6ee76633e6ba80a398cf920875bebc224981e31db46c2412ab3520a05ccbcf4a104158f12a535ee32d5294b0cd61a6660d0bc548cc3e3a0f8034148721a7decd7304018066609d482cb7454726bdfde048bb0f42b3cf4911848782d030feb0d39ca3835d202a40129ab60794f849f73eac639999aeda64f64c9f96cf50220757e33585d8a0efb39fd782fdd8446a1c9838b93bd1e89b743f86e57fedb5c032140b62bd36d7adab5c13be75b63488a70bc841d96b215744f700f8f43dbfe5302058a29beb9dcfa71727bef253d81747d4e86ee4cb133c6e710bd873d977961e10209029600310ef9c79f01629bdea60cdb150a5dff36e00f7edd1dd2fd34e004289957e4b24d58d88882069e295a3008bdbd47785c44d4083c505702a89833860615b521b3e0ae2e6ccfa59574cdf87768d6f60a1c7206074da3e9651121ab3a913a163d48425dbeb15fa50d50c0490ffd4b318b50849689f09cd123f197ec7a7d8aed1d8954b0a468ddab4bdb85961addcd1238b7cc82f63f01f0532162a1b2f78262470dbb60c4720a2d48fc5e03c507bc64d92e29efa00f1f57a4b2767dab38dfdbcbcab166b7126806dce0f3519472672f5bc1ab45682b29c6e415bf69b999029dd4d75fcbb8f8d75d7e297425d7cb8c48f9abb790633772dc70af294f92cc718f42daf52544fc289ca750974a82deb8f8bf5886ea41ae2ada90f57afb9c12ce71930b93cd77613dbc9eb8929b02fc59ffbd45cfb327462136f81a9eb2c343599c3e71165a3c91d01fd5cb7f8f31d273d274eedd71f21b321533f495d51d8d615fd4c3d982a3c17abbbca96b708042424241a98dfa120308bc80a882fbec2143c346b910c97a4d22dab1d07c1d4d2db2f40d31e4657cbfd6d0e8e3f2c742431eafdd8ea01fccb3cf5de29358360a3e2e424801777fb5f0a7cf212065ac55de37ab0193a1745f1fa9eebe7b575321123295d32d35059730b185ab55eea0b304594ceb70dbfe670b575e8c31e5a59f3e0d6dd0f51c72d8b4fef9a835d709f4f5c6502fa5eaf2382192e78b29d8b23e3b5d6d8b431ed82bf25fc75da38d8151d2461d22e029d76d30aff9f977ed691f1fb146a6391386f8e876a5b0ad6d471e4721b07fe911ffb00b8e70e42aa2724779f9bbdf86dec929a0e5250ed20ca14baa6d2a8dfb906ad80754a4c257b537909eecd9a742734625a11d133bbaec220007b9d19f7d021b529a389149255e7b94821f935b55e085bf0c3a3e0480a99c29adaa788de430daf840d3630192b5cdc99a232a5fa1f30efec77f956f04c9a246ea849b94f8ef2e349427cfbe26067e7382c298f0dbd3d5a80e55d184fcba3ba177ea1fbe21a957d8c887479c9fb9b258081d16a2f1eb56180b50548a084239c4fb9d955641d3c903a741c6b49a252701aac278f0fac00c9d4338ee5bd8431cf93fcc9bd9478989cf0d1d61cf76d425b6ca1f9991389e495cf98751314e39e9c885167e15eea9107f18f8abfd0bda7ff049175516efb562f6fc145b132a48fe9325b9a74806827d25c3d75f828f6351a204f9e77fdd65262ff7842d71bdf04f62c188b37d0a738f4096febd6be060a098fb558cd1043be88abb1b101cea7c165771dc727526edda1c336118c099bf19ccfae3debbc592cb16fbd5c3301bdecd1212dd03731cf89eb1f76cc9c168fe1481965695a214810b1b76951c48e6b6fc6884e79dba5825c2e4a0f13b4e4f16f9b6ed5cf809b56d30addfee9141994fc285588d3eeb837e8a9da1f3fb6cab01074ffab428b765cf9a4d7d67fa8970659b6f506d0b97b7e8e48bbbf7c2c51729b7c35f8479875887a7224d045d3555914f54307e0c9de66443e4e2249db780e77592b02e81b9994b5cbd539475ae0bab8111191bd33d6476d337c09db9b2c9c369a8cca9f5e3c82af300851444fbbd00b3bd7cd2533e060a706589c8045955a2e83d165fe0addb6c9ae131be88769f79ec71ed68dfad19d1a869089618fcb14671a2b445b7a670aa6ca89d2a70e44a5943aff76aca0d20051615d88036678f5b29c68901e40000000000000000594f7b050000000015e9995266ea968d1e190650f0bf2d81d654ff4a6705f04a54b4928af8e9c7b15046c37266a6733dc3ef16b9004385671af4adb0d3db0dd95ba3f7362eb434fbea740bf995f75d0ecb7c5978b27e015fbd11bc7ed3aa0677cd2b378b1fce91c70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075a1adb77e4583102f88a3fa28292c7e32bb6a3e5746b29e38b0880ff6e9a30dba45cd78f3c618aa6c6229b22fd2be4c1168185e3b4eec544f446da6529299053f2707a6e2ae35817561e1564e19859700f293d3a3893d9a6ba0f5c771512da6de09c6220fee03cebfa568b6c75c85c93392e97123d65da916875d9353224b12020980b784161912092c7beb54b3be09336713658fd3d8bd3a55a220d494f5b154032081e822f8f947cdc0909d52d8dcf60d7132acad437492c505d4afebb12e0ad90a08f8bec1e74f65003a918e4c552f938ef599910f4db82dfaa0070141bd188eba5e5e4ef85b66ce8430a591b16652ed8fcbcaeadc7ec42beea894cd4da306dbf20321fdc2d68c2ccc0f2884f9468896ca1f0f8288e3fe0847e27fe62ce993a17642022e454f275f0a8cd2b6a0449683c6b2a7fa3b00048aeff113dea5562b5b7acc60022981521e90916776f7afab8844ab7f5f55a090b6596219de0edb92d03203835e02284b21058a8c77ac2c17cfe24ed64d6855506ecfdc0fa13972ecba4ac4b0006d032a3254aa7aae9ec2609cd40165ea75afea48a764d0eae5241a88a757cd12e8f77dae159349c25b783c45ec633f393c5a29efb666bc8bb982ed3a541df11699913750fcc5edc283a2af5d4d81d4580aff7de12b521972f402c667a1068a8dd13f8b7fce786b2aa38afc8e3539b207b4adb04aa9a5c73d80b2190bd19c2f804ca7023b528e8e5ff2e9a58a5cafcb70a93bdcb12c762e8c9342bcad304686a5aeb1c13ae05d4d168a03645dd3490c2d95eb0a8ec19b3dad641e7edbe77c2c2c7de96f96148d7e28ed1491c90d69d2af98f51c7222e0ee047f8e3add770a2895b1ff06a42d3334e51dcaee42b53ad5c1b61590fbf5c9a38449a482b54b97dba11baa9efa6cd05013b649fde1f501e396ab9c74d25efcaf857ad7a60fecdc721832814e086f937145c1618dd5957c443f5898ad8b067e9298a40cf722fb6156b4e74080daee3856464f3b8f31c622cfc904592bc8a059adaf8d389214e48e90208ce23ad061ff46c86ceaca4caeb744db0d56aaa2766f3e7b7ee810b33676f218147fa1828dbb133ff0737cd5f857b2e39c4e2d472069e6fa55a74886da58040592232ac76645d655ce4e0c0d971ca9fe43c8bd469fc1a0f2f82ad17b0f2a0fd2f30bbe16d3b4b24c2a3d772f5184abdccf7ef61d235c6ad609185548461b1b7fc36fd347d390f5a0201876ba71b5033dcfe3fbc2fbd2ddcde505d8306227ae3b37603a4a06cc3fea58509ed9f61532d81822f4b4c92bad945ee9c649eed54c89a2121602d38f2488e1aca8f6b902fa2a71226088873f68b50b117207257e15222551e509a644b6a80b5d4636cee61478251bd408b50c547c8251d0cde5a3a33adc44c9d20ed40aac44b9b295212681cb989f0b3e1f6ac683dcf56f17f4c68e7c7ddf3493045c552df8ea8093275d12b08cf141a51209dc077281254607dcd78dcdc9d8b7dd82fb7aa42a047c185cc27d2ce31b5d1a05485b0c1f17ea3e2757af3b5df3da83263f9d0f6312a79c1ab9610a2a02933e15b5462ae185588b149fa52cc074a3344e5f5fb8d4fca56a324087f65573c7ba613dd2309fb365786abba8f590d083384ed0f715a707d644a13d0443afe6390ffc042b709eb631af3b917fcd995781622272c28c989a3f8257c2574ba00c4677912cf5254f8c5f0dab9b766c5aa4c5f72012d4c0c9f01930f58ca3bbe0b7c1a69b91dfdcd7c27353ffcf7ff9a408e3ab705168139aca01ae88893c659820ed523a5d8bd2dc223994e449d12f33558d6fbd4ffbdfa99302edb62cc3f68afdcf0a41cb2993bd0d992b51a7e454fccf2c6611a6dd698e832ec98802ff64c83ad04b19cbbfa92e03ea98b585f025b97a682bd839a325863987d689949462a142260fbd0b07f428a12723bf5e0760ee569d044322388a4e1d64074657b4c83e4516e18f12ec5be4f20037b83670d0f6b3777d33bca2280ab3dfe0f138a41d75cab456a0abdbc8376007f24f4313b7c346356c5b2181b1dfefe0c48cad04759301007ea6b330eb3ba351c462d5830cdaf4b507260efa79a830f699a28a98d989d88807f06a27700c14030c734776f47e73bfb0506d734a99d14de80ef439c29362e157982bffb89da0c984939f50bd07f962d5551b2b3b19121fc961a4bfe2231fc4ad01afc49a25d5883b1c9095e6e286e6d01b3e36ce23c761194c8334e6cf19d4e05896760bed4fef2a0e656e06558263fa9ef5b4aff25deeed6aace7a4244e7ba5c5084ade75f5b3d35b62ad795969aa5422ced3534c40d0f2bf072cbd837339d4383ef9075e854fc309ebb8fd039551e1b1b260eb47b7c521bc1e7408e37bd93b96a5d2b6024c9cfbb7047f67643fba9da2490a82f0e174fc6cf64c0379320c", "", 0, 917857606, 1537743641, "50e4d2d6381de2d0e574be95d9d7fad4f9627bbbbda00b10539560f766170b83"], - ["44deb058021a0e2c04fec8bff8c19046a84b9a8744484d5319b8d616567c10415e9173889a0100000006ac510000005144bf614d3edd24f03ed725773926cb730099725edfab2e4fa18ba8ff6e5eeb47caf73a540100000005516a635365c9b71094049f8dd103000000000100487faa01000000000252acddb296030000000000616ae300000000000000000000013145860400000000000000000000000064a7ebb501e5cb0aa8ac6845d2a8947a718dc504ac62f0018795687101d2fd503c7ffdf7c0914c3e1cd929319a51f5e4bc7b0eeecbd865c7677043632a73456fe2f2aada71952ebbe42dbbb827ada011f13ba78d2e971e736f41d2c712cc1dd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d982f79f716161299797f84d8e8f2b18ea59cca9b05e13038dd8ea56540b2e6a6e3074005780c7a8cd87095bcbcacec80bfc2ab60f932f46aee36d70b50c3eb46e38160d7fb7c4fd14eb857fa7ca6d06d77515bf3be09e541aadaaff3a407163452e45f9678296fde7fac155503854ead13c28d44cf480208812fe9e121378fa020235a7e822bdda08a77bcb8377e94825c2fe953dbb2a18deea2ba272fb3089b80303d67eefb57bfd57566e9fe1bf0f8aa026849498ce8f7a69e519d0fa7317b3fc0b03b517e9e9c268f8f2caa5d696f33a0f5c8b9f2819aa8d847f3b823612acd7e185d9352e69393b91b069165ff7619ea2c3ebb1f378d625d66d11c2585ed901560317e68c8ad5ef98b7dcae819ff87db677db2a8d3a3611e4fc7018b82acd9181d8031b55ded2af3b5c191d96153274cff94cf6f6541b1d68516d3ac4fe7d5afda0af0300faf570a910c3dcb1ec2d7d23a4e7f8bfb1963143ea88a1f1a7ef6436caaffb0313c53ba0569351f91c6f65e7c6ca4dd252776200eb0f2e266ffc351990c5c46b02291d28d79547fccdee231d0aa7076bb0df49d3d3fe411f815ad1f85fea3787a45be323485a2460f4bc63b1055dcb7c2bb1732173801bf57ed4df716f0940279c20917c737e8755f09419926d1229eb295bce6be632256ac682f0cc0f966b9a7d20ade974e5fac7874282bbd079a0556a442a6aad8e0b4c8458cf4d968b41deba33e89136f68a28a274dfd7de69ceaa7e1ab3d0b0052db5a5c914aa464b436182faf377e47b51c5824af86415a24239efb2ffff0511074cb9f08e8b0c65ac269d8df208d36c750d1b50b4fc207673a01b6b549829cf09d5a18bdaf45cb1498de15094affdee1a6011e37ddea53e6e8205567088bf4d6a6c1ed10a3c75e7c5b3959cce01f3f091b63e11f3066dfa30fa07891e77bc9593007a15b56665f3c6f49e86a864f881c157f81e8358c6a48baf4202c943f25731e72db2d2fdf35417afaffbfc5a4131f9a6bc8149ba514a7e4c4dafd68b38a050e2a595bd6b0df18d33e024a806bc6384233c70f0ca3058de4a2aa117e726f98e1fde9652487e93e0474052ee4b536e372f57c2616d262f22e4d53adca363b722dcff9b1f8a1a53517fbdd7d614f120727fb98f6b60620e345795cf551a7e5072f61db32b401e80589a780170236aa2991758554e3143a642836aff784f1d23ed6f0102efb16a7e0dab6366f5c3fac9db798ccf019782a8426284251a26d39a5d41fb5934ff714c39ed39762088638b72f87427c3168b4f9f4a4a5c143303a18ef8cf3352b97db3f70294acbf5e3f4e2e6aa709b3b6da0b174b8ac476f7ebd19efbc3424a1a95d2b82f13a18992d84367c192287904bc37a24479f3fbe0926ec82603a61aaa3bdd1faf12d02f0a02104d450a66416d4f65ed74e7638f686c318751c54b1a61256fd8aeb86da2e8c38034fa88bf16832d342698744b9a266e8e34d1ce6c689688b7899374ef8b1a715b8772b9f12268c47491ab32b09d9f3a9f6bdc4e8eac71291e856c9aa30ede0fa12485eab7a32a0e2f4d6e1bb7fa12b90ba247e939e74b209bea44b22b6c8dec1f294bc7adec34d56372872c0d226ec3ea1d40311125b09648ac208a880ae16ef195a8348a2f7c7cbf591a9de7246fbc0531edcf8cd2811e932e82f317a24f92d0d856327b48fa3d735e03b29e3f3915eda8d0b64c59be9a21396d511f5be7bb4f4879bbd56c107a61c3de01df8f99a2f444897c1fe68424040475069a6bb832ee98f3a05309a7addb8d73a18322ebf1d9a5b480cfbd61c5a773d583eb9d7e8b625e6fb81a696cc0f32d04088bca15282692ce881a1b36c44a090188a77a960f905475b9514c33a80e6128df19aaac3a3f29bdec9e9769549b7d520e9c7e0b97b8c9d83015c5f500da26a70ef6656751c3c5dbede70e78395184bfd5fae6d36338496e362497a7073bec4e22a731cc98ea0d298e0f30ca12960d8850d39f9dca5038a1b920f1de4a3bf71d57ec9ccc8461f7c16f667f2b08d543f0b2bcbbdf8de7edab51080a1c5d8fae8b5fc2489597399af400886e3c828f2b9be9b088c0c1366b1ddcf763c9f4853dc34b18f2ffd8c793cc2acb65fde6707d2a78d9f11148fa2c28a1d532869e0425f8f0c551eee178d1654cca9b8c2ff16c2076204e487db0ef13f1d24ba75681d40b631225b30f97ef9dd0614d2e962b318796ad4294a273e517268d0d7b4f4e5d4defc2fa6a88a0c22b94a21c53fab5b23af21dfa60ac9673402528f6da358573bf58f6c0036405e6f8ca3f25f8d1eec4db72d96ff6e09e8cd1aa7a4dbc17091e9718c4600913fa81242edb0c4888380b7163d8183f1c37015ca82d71eddbee9db9dbfb283f2fbea35671fa676aee8ce6b9e81572036250f519b51fbb1198781b196a140d", "ac0053ac536a", 1, -739913700, 0, "4809036c468ffb8af3c596818c2ee92fa210ffc260411aab3dbbfaa46b5a2138"], - ["030000807082c40301ab54f9ba21b915f2b2a8720fffcb938c87554a9b5b597bc9efe4885d028b0e7601000000010003914f19041908980200000000026a6a6cb4aa020000000005ac63ac6353dc76eb0200000000066a5353536a00a7a10d010000000004526300520000000000000000030000000000000000f84f6b0400000000b44fc9939f710aebdb672293bb19643f817d3f862b6c1bb9a683f974a9bde2b3e13663e2c0a31680769607a8dd0bb02febd822f70c7f2f0f363b260eccab7cc5a036cc5a8e6b48eae3632ff004363608b45bb48bf58247b28b32d5e05716427a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000414839a74481c0ccea84cdc55a9e2296bbd1360584505d2e13eb17f05162a23b6a8116b4bcaa87c8c5a25f107da66de3d968889e904d5fe369f1578ff37a13ef22c3ad555f4a90a99deee2d8ada13948019ecf63e2cc1e137176bec052a5178a408bf4656860ca1e15a7a2e2cb43c4a36f55e9ec3f17b250242122e03739d1ae021d272971d01ad58f14e8cf0cf07ab94e61f6f22e664ce59020fe17f8820d428e031df2dd88aa6cdc22639c8833fe26fd2ebce619d2d614e341b0e9f158465ea3660a0552e6ce45eef3f83e48730d1f87be890f8160f740bb7df58e63168a5c248cb721f06d25f111f62970f97c81cbaf358da91a3e8053fa139715285688efee4416031657681287929be655d5321539ff0e1dc51025a27d2efef1bbc503bccf6bcdc2021eaf24f63a65209534740f87d812a1e52f4916b482fe781b27d427e044649e91030a08a180d2ccb0cbe73fd813aba849b936f5254e46a3ae2cd2570d7a7f9b7d120219efba51f3c203ea43d2f11e986066e2bd126854af2220f06fb36543e811e3f2020bf42a86b17103580663c076d57ed7d73afb55bbb79a43639d838e05a89d8c7d96c5d0cc0c1483df8ad9ca5fc4292f0028d3cce4061469d2c25a38b6b79eaae1d33f466f096fb381149dc79b4d1df4028018c8181e48833975562f9a51901e6d80ce1d7659f948faa58f70e91d177c146ee6836c47f01b4ed72f8d3fc7604c017d2ecdab06c6a70c793b96d65a9eca9bdb53d67dfb23e9d93bd828703e9bf42b34a46ccb1afd9ec570ba47b63805db30ee1deacc0aacd00c928369c8a065eea03367dc55b2d630b4b42451652797c1ecbb54b9e71f59680d88269259dadf05f484cb1427f18b325917868197e3a9f9e21bc5e44898603c66eec260fb93f02a7671fe9fe6ea8453b9f88f537be29fdd751271287297c43a2529dd989e06731b34d216821d96dc724f7e74b313d042aae25e84a46dac5f47203c8951ee04daa18a4cc6d087f9c4d6f91cc3221512586c5dbd7fea79e636bfeaed135a72aca05d214bf799e20a09fcb92dc96f5c155d62b864f840065e817b90e928488ee365aa8f65e1c93a51c9960522b24adba726962fad6669d8e460bd56e23353bd2ea49e8e46c4f8e3e3e26199f063272cb99f3849f81416fc3d196fb10df0442de10caf29b13462ac2bfb4e8019722362a9121f1af342e3871a5b0b12ee221fbab24100918243a0e94e2d15900550cb5c6d1a0a7872e4423c9a31f87229090ac3e1af87d7ead58983b46d539e0ce0317cff815b66955cd19d2dac97230a6e808a8d06f5b88b7a20ed4d9d1d3fd7922dfbe56703eacfbbad67136c5e2afd9d4e2e4125a939618a88fabc9729e10296f69c1d43c023b6b6732f61e842d4110fa1ec91e29bb11181b17fd2ea40973d4d37e60680aedcf2701c712f71603d209bb788aa32bbb02c5e934dc36d00dfa2c246faa5aa97ab724aaba57a0a62e650fda99502cb3ae9c2da1d332b40a4fa140baa09a0d5fb49b7d64ad2f40b1aaa8780491623f8cee41a7dde43f4dff1a58dfb1910ded33fd69289af1b850e96e92d60801d510477ffde2668988ea653a977b3f4389ad9e94ffc257be635b9d74b39020a2fe560059dc2b0466e92a411aaf3b748559d5cb825953d8e188ed19b45c0d1b159fc53f8d4f371cce512c1391cea734aa457782c6e6ffd549b8f3ab87242498f7bcfbcd5bb09a3b9869036be5e1ddeb6bdda1568cfe782739403fce220ba2e7444ff4e628df50d84ca6610ade419d826d5ca21d95309b3c82bcd3e02b9d104ad9d9201cadda1be4bbc36a2c49e64ffcce297d78bdd0bb37a1f7842c60d2df253e8fdfb36c928a0878118beb853dd5ac970658e5ed69ee07b4a5f54aac8ac9caf5d2cbb3805c4520170ba8e34c26d45a5583d0383c58fd66a2997e7ad555d03e07a6a3ae7262145e41d4fe57331cf7a0d413c1edf50a9b9b62de0a249c3966a7dfaeaf4fc39c6f5e7176fafaaddb8de7c8b88a7260f8aebf073b285871f50768f39647dc2053c13cfb88d4da5337debff63f9d894091bede7d9f5216fd6e1e81f0e0b9068475be53b3aedda76c82cf3fd9e9f764f89d165f7635d82376e387ba190d5cb07cc09836af2554ed3cbafd94c6edccea402cf378de9f261b5e8eb35b7d42bfd6afbf84966585f6be6326424b345fa2e8ebd4d06bb60f980d5da46fcda939fd2b9c50564d2c8c2f5f589daa6ca0e7475d312810467d00bf9d4887dd6a3e931b63e8e698b7fe4ee1b7086faf7416999f3c9f8d33bbf870404000000000000000000000000e0d1dc821136db5695cc7721c9227e1c1f83a75f61678041c48507ce4d594c3ec54475da854290f83098fbcbe6c65a8f6c4c6a93f0a6ee6d12e3f49eae4311a43b3d957345bfaf48196a77c4b97fa3109bc36c17ddfe602ae40150c0d347f43700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c61562a698cffb4df2082b0633eebc1a11f99ddc96236a14e54d8ba1b2e8e457202a7b6a3726cf9127976d207b28f1527c3ef79523d38aec19b2dea0e6bc22530edaa90173c4d3eca5518f1a3af402f24a103ab73f83854df2366a4c02bc3f688f3b3147e5f2af03d61a9a2be252ebe92beb0f23939dc1bf2e71a535297a586c030faaac8b83e7730c00b6cddad5374e151621f0eadceb24009782f99598b52135030a37752366b3071854533f079dfd9d1b7e4cd262c2ffb8daef145f2516dbcd230a021d80e07613e0b1a4b3d5c4f6ce8d85d324638ac7445b6c2ec0580f7979b371f5b1157c19d48e3af58efe8c45c6c85d4eaa54d8941c9702ef0f1a2f53d1ffc4031a6d43a9c1f2c3cde7cbd58444731c68bbb529772a8844fdc84c742ad72bb7cf0212860c57fc743f48e0dc137d822d4e4168b6ea56042697c9520e665f2745d044031f743e570a6ba0989e4346c202d96aa5de1101301a6584da059df24cecec1303022f3767d45877f9cb693a9a68d722acbf00133947b7793c3d07b799da95288df703281480da74adfd3453d82d0f2393bf6ad72145ce93d3471b6700399578a705c9f091b76e98cb32f17b6cf239c7ab227ca13b68372ad24d812c73c9ed9efe4b5c2dc2fb1883d5ec9c8e848c8dcb00b029d732dd54033b5c90e6c71246ecbe29677fcb387edbe427f476dc050a7b5b56699940d667818874c9102f0b368fdb4c1ce5d8a035c129bf476fbfd14c63d3e124617bb42841137aa7c554c5c13df7aecc75ba787c2e76aae5fc1d66bcdd6e26afae6050c9960da6e28d5b9d278362f4fdc14fa4f47997306e972ab0a5c9adf80dbb5a5604b94243ccc2d5d72884ce78e0bea17676a9ab3bb5e9c23e676755ddc482e068e99ff2309b084726433d95ed325375dfdc71f25a63681acf71e8207eccf8ee3e1f8b3554f3af771a2bc9129ab56bbf160688f8f709b619d4d57c56d7bb56e7b74ffff93977b663631824ace5850876d6a3e619bdb719a125f726a425290eb0932f1f156098342ebf8eb8ae42a7ad099dcd5c62e932eebaf3e3b8a513b9f344099a0467494d7b470560016735c878cb39a2692b87c7a3d4f4ca4ff6d4f7e2d5583047692cd47d4d51f121dd07aeef926a9fd62df10e8316da8699495ad5542d08d32618498ea7f65c9fd93df4bd12676719beb65f272a306d7d0d2ec7f85a3f5833a298bc0f21a573f013c5f740ea37087e1dcf117734b97c53fa85fead1883587e404db8d5961833823953b7eb5eb0d9451d6766e8fee625b1c7b59a2ff3c386785737ec7d80d07406c60aa2bf05c4bb8f571a813e06746395b1d8bedbe1ad5d4ad021fc488a252ba79a74fad854f59356886f0704301de3527a77e17968d4578a0c8cc7d267d9852be3173cb0830e1aec3b023197c198586d0d8721df3d748cc4e85e5ee65ec3023c48096e2967d6ae0bcf6e5788cc2e6d5a6a0f2ee5f04a83ea9a9bffb32e64b7cb8ae30ba196962c991b5e146aafcf6bcea17c7b66dc25f8c5abd76385d4ed108a018c0cc9240520f522449c8ceba84d3dc222c507bef9924e3fad99f8da7c270727e3d2d48eadb238b45b8e46fd99cbee34bf5f3454bb314c8a79d85d6926ae7b77670e489a3d9bfd11bf8353996f1fdff6b84ffee23a9b016d1f2898cf885202b6b9d0b327341ba35fdbd6a00706379bf91926e9b84e1602003cb800fc3933e6d7b65583ecb2d9d06624844f9fc4cfe515a2a40bf4db4b04bd9e014e8878abe1f2c06855508b478c3bdc187f2af5c44bd4213eaa30f0ef03c1e66dd812525bc3c97324801a7c206334cd4c656df2071fd7a3929b4214c866b5ad2cc20b138d2c31edb43fa046771d3f93cf3df2f24f8316572a40db9c32f838a7fbc78120d37e241870c755b1ca86e55121fb555537bc8eda7f42b29db00fd44399ba72ff13005250b115312c0da528b71024b5138e8f643fecfd6b8f86a06eb9bad0878c499fc537f55435982a950ea95e51572b55f0c66c253626419e87ac722bef0fcfced34f8682a18afc0127759d95eee6d0a7eccdaf9afdac27fa270cf6759b31f9e9f62de139774aac6356aeef1f46b0f967587eeb9c6f9515fa9733fd899885ae1d1105d0ddc807e653bb2e6d471cb1c270c76b69e520fde78413b042b09fa73a49d8c1a69bbe90d67ff69b537737ae0cade03b04e1a3f0dc4bc7b6d5ddf74c75b827c78820eb2ca0931eaf679f44008fd3c02b617e10e6d249044fb33d6ffdf4ef2421cd2b75829b185b922b26368e601b587a657da51c07000000000000000048e8fc0100000000c11978c42907d772ba9cf1fd7b4712261da2487a55587a53653515419cacac5a1a9d43dcf978a6d42de9d1a2aa00e15f7b7b36ce1387554a8b56aa27ef7f138a2cd694a60a6d90d00114f3db021f839a3221a65751c1d7192a15aa5e3128bc4a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fd6d521468a898bff68fb919b1f2abfb3ff4b00cc8aa59b99dd9f5e54157c984f82eef466fad9fb534ddd0c6586bddc0ddff655b7c19ba9d2dabc365769c46dcc6931c4081875ac33c4815fff3908569de5cb6d24cad1e1a529d6ed824366a046230196be972afe25e342a683e17c700a2125f569dcdfc129b8face02c300b310302fa824cd0295774e4ed70201713d878ac83b61386c13165aa39d0ad69f61466031e9afd1f69a7e616c2de7782fe3a7697b31538aedb21bab58ddd67865bfbbdda0a0057dced574c9c9b712bf32581ca2f134edc47f6ff2ab9ef1efd794615ad517fa6ffd35eeec0f508d252c96b4f92562d8d48c1d0df2cc120624b3ca4fe574cbe0323dba5ce9c02ee27ba56b75d30869fb58abd1290ebb1edb2fec6b1db221de47a031668eb3de040be99854fdee2fc0541da8a4ea421063ade83562d5575b9b7d039020eb1abc51f4a1b5820d27908f454faf8965f8cc8f7cf5a506aec4a3908bc968a0201ac9ab62418c3bbae24a6a58ba4aabb21c42093a21cd0708211231711808eb10316ae015b7b5869b61486dac4189a1fb65fabc431d22a31b16efa48a54362bcecae4b8bd32f0ba60a7471972ffe45fba38d6c99737b36c02e4a2a6df78b26d8524b1ac9233f5f8a6fd601690dba94a7b5e8d1652f98529e196c82b0f02cb611132efa00c190a0ed0983b814130600f9a030f1481a15cf5fcd3fa5d8b1f5b30713605144fb7d684d84e127aea09abe25b61f48de9f6fdd61daccd19d32af3d3f8c1698f0e1a4b787013ed9a4ba2656e131d509067ed242b1ec4e2c9aa2c42b8f8f5ceb0a777935b2e90ea71bcc8732d53b715b0944bfe47cf7a33694b1fd4a487ece1ceb91478b990c57c45d9d6908e15fd382c493f23e0c81c4d5f0be6893afe87622498262d93694750d36ea27cc0b29343ac7a6b673d7dc375ae2cbd43b633e874af2e5df31b177aa7abce35a4991723135c3a66d4c1adc5bd01e28e0ac02aa70d9030d78de18efe8f963c6102576f288f1a7e003fde7532892e3c802d70d41874284c6e8c7b7649623b982da54ea0f38900af725cb78512eceeaecbea13dd5af1b2591ea69524dff1e48ba83ae3049e5430af70611463afad6eddc7686a4ddee041aa4454f2a8d7bb21c6aeac965baa4ed12c3a34158a3481be99aad4ecef4ffbd588f2440d11b11d35fcbd43eea61eb68ef04c1311b0df928cdbaa740a287fa6406e3f8b6cbfbc050b814408a7cfe3ca0f1fa151b9a79310f502704b4328a60d3815b2db04a4f0f265298dc3bfc04472c399f2a00fa86737bdc5047957ef51891d5db8c5e648324319d27de1744ef20323a258176f0650444d662adbc416214a78831c15efe96de65c6deb39694c148f44bb9c48f02f983ed16c1ceb4682ec7a672c1e4b68fd0997c57176bb4a83b79d1229f73382400bee48698ee5e28934300f7c7887bdde58b023ab57faaf0c9a9d5f093c89d8087c72cf408e2d8dba0f9bf1b5e663f4c2d8a1e3319df0c387cf69b8117404bfa355cbeec7c99ff7df132d942adb8de2cdaa5457940f53356423749c686c668d8f04b862fef3e5b77b61ac0f23b8380932689fd915095d09a9893c4c567d80e48e3883fbc3ac4fde360b4a38b95572bba2bc36de31dc646b15d1ac3e693f00c04109218d1e6c2b49b7e9ddcc38aec623caf691679b85727f710952395609f1930f80f9c5bf20e6f86f59a393d8bbe18524dabd5204f0f28b15453bff7d49075f7e710a67a8f0972cd6e8e05281990d0816bf9c2b6076ae01ebcbb766986f9003bb0a0648f36d6e9b5bddf78d09e7bb0dd76c8eebbe5f58b64aac883b231f4d72cfa50dfdf70dc91597b97c0382e9179682eafe6688ec136e99fca7a5d8c656968fb50d875c7e02dbd4597d9e3d6d51be4694877c674d0294e97ae642b0fa822ffcac087125804960f9d5f1e6f47b44de5baca296ac82f7539af27f72e5e328842a7dec6fca676e87eceb2fa4f4841962d8a6fb717acf4767b845ae22c66f40b6393a3a9661110d5016c6667b072c4630d2fd9eea7f55e87310391ade3ffd8fcaa30618ef605f312eb8f2d9500619e8a3f8724b38a153ba3a169f0ef0c73d6f335443af2fd5bf6e86656c216ecdb683f1253dd1314544ac8c42fe8d1e4a426245d2b2f5e3a19ecedc718cb6a82f9641d124c1d00106ea40a8330448bfaa7fcb93ece348fc719f3daf98ca812a8d6e430f364915f2c9b792cd28c72f697d13e4066d56bcf1485a6e9ed73119158924325201c65e733a1739f142f70e04931a695e6990c2b406eee8a35fb47dadd8797c62f71777c1c5f7f8a3980246fe5ef01984bababbf94bf3aed2ceccaf4856057d3c5dca0913a833ce4c02d9784a1f9447586f5bfd964e1a26a806108dd77738206b1dbd3a42f35f64769a8bc0b", "5163ac51", 0, 118218022, 0, "2f09d22232991bd6e7ea87f5d5388ab4088432891b00c650d5cedfd358ecc66f"], - ["0baa787503b732a490b4d3e412df3724ba135277d8d3721fb5afd30dcd63ac016af5fd64e80000000005ac63535251ffffffff74a6d70ef8546e90b68d30c423f5d0534d3fbe28c2ed08c09b2dbd13300891f1030000000753520065636a65ffffffffc023f2f3e6c6f3ce61110976b9903e9a649e22ecf24d623cd4f44ca423fea8db0200000007ac65526a65656affffffff0272e619050000000005006a6553ac99e8a60100000000020051000000000375bebc000000000000000000000000009f2d7e7381fd456e5288011f03d1de0e3352cbe92f80b89d904647948c8b98c51164c3e00279cea28bdb234fddda758fb1ebccb5594c883499d9bbf597365a4dfeef712f3e2d37b1ad7fdc63f967faa75cf7d210eedf215b48c05d38933d01f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e798a5ee6282e69c14c0c8b20ef7eaddc92be5727f1e459b10d28ae6009c700c0d0e934948b61eeff071b06f141cecee4e9f46b7eb8ba3c4a8220a9907244b552b6203c241feaa1552e169abbe01162e5041d2a231d47acb32e64f904d5cc0433a72518ff40d29a70abfcfb53aa61dc469176184ca5220a23b3320b9c387a40a030164f80051a034d43b29cb5595072263e256b88916060b3cd2f2405020b8d37c032ffa912aa71254898b9ff98e9f43cb81c46ece16a98cceeb7a3751574f7df39a0a090bfba3deb9cede68f56a4b9aa4c73fb9c075c0847c46d29f50be4660fea7a9ab569319d4a402f051d07c5dac06fde960dbf1a941e2a265f429bb907e8616cc022ccd47c922c4030d50f8dfac51ae08beebf3a9dc78e3e724e6460fa37143f0ae030d870c305e13da811355796e94438a35ac600a4934fe8b00480f98c061dd00a8030a696381a83070dc13c0d2bce012eecb18b0fc91d7795ebc9b480c55ae80a176032f4ff684368ad1c8c3ffbf19a005fe176014b3576bb53e15419a95fa40b691db030ad9705b6d73214d02cb64d345cbe37968f8fbddf4360a870f76afcffc609b0e82167b85fb6745b1f8475e131188f03b79d275c86299f3931a1f471570541424717cec6df668aef5acefb5143af2dff87359c03df26819c0223eead2d98543989a437bc55f35a3e59bb5539832fe0f1e7622a82e5734623b7847fe85fde35917e6bf0129a82fef2847d10bfbbfa732212be6d6ef4fee2a562145c6f8f918de57271283290e5e5de0b21f7941e7ad8ae830c5beabd76779410bd1384a0ce4715d4a586d30908a1696abe746a67860b76ef3afb252f0f86263888a9ffed42924625bf87f8552aaea8cc1a1dd9e167c265e7b83cf439eb4d850abb72eafe4a908ba4164aef45bf8920d95845fcc64bf4813ff1c9de0eac6fd5a39e04d2a3b6ace22c9825b8db4a5da4d44d20650e8fb828bc2d4c8c733cf248c0e874cc3a8acb86c1e763bc9e138ce66802ca71e35b2b5341f4c0814bb9557790f7676a4e5c12231b20842a5c38a2669775817aa6336e80e4404a3c08d47eec307b7eb099007816fd691b0a8ada79a3f38a125ca3b192401490d2c78de45c18ab9af41a3f7b23d8e3020f35e9e3de6526b60147219fb564dac848e38b2f9714740d5deeaa2a241b7c50b7873a5b2d6129902abd1d2ac5f6e700c691a79e872ef7395ff1ee11f2710fb1f9e87913303aa8b7d9f4ec3dc365f516864fd10df73f5fe9027bd1cc0e3d48dbe0ccbf9fbe1fc95f2788fd82dedb19ab142252ae81e43ee8aa809d1b70cceafc58718eb580be399f42cb059946d3db696c65ec8f8896d33ec4a474757827f17d86fe4f1caad8edda0df7f465d2c754bee845f545c26c2d8c1089c4ec2c77c8c8fffce3b494277bfd49a1186ea9db91f99a7ebad344c7569f04e735b74e593d5584405cbb265508a658a135b0229aefb55e571e83617e02a1ffc229f7b8d3e7fa3aa84f7faded0f35f702f5aaea425662eefb0828634a028bbaa0980ddccf404539b3eeb7dfe431ae6a54f0970384f5bb1367c24a55804d11e8fcf3eb7e40bc7152523f2bcff147cbe4874eb2f3e9756de827e26fcb755d898c9ff17a86b930f64daf85698817f38a19c8ffdd75aa0fe461abe2bd8244dde0960235daf2c4717a856d5ae51e9405d60cfc9ed927d546bd0bc6f16a92823be1d6f05f9f8c6c4b4a082c002c5162b47840aa8f08614bc86ee917ad3d5b23bf1036c57b06e978db7bebb2eb5a568e6e2c275033ce61e23ef27966ad3b8e69fb8099b236d1483ad3f64933fc1b68c4eb1c2cf585763805694c45f6a46dba169f3b8ba3d566cd182e20897bbee1383d05fa8ad5f31d2503e48fa6b3edda952ed6c9ced812db8a63b60e3bd2ea12ada5004c83e99bb8797cc995c8ffeb7b353ee296dea8afa2beb8e516284398f982ea441791d1283237478c77451800a704d0751510e31156ee402c8cb6effd181d11e96bb2f8515504b0f208970b83e58e0940d8a353eb78247259481018323768f3ae6120c8be42f3a0f0eb31cf29410a6eca1941d98d3f66aefbb11ffbaa901c6b5017ad7af54cb85935f5983e29f32ab0098bd28d3c254cbab98a11c6c56aa183ddac9628eb26d09679f63d96b6829bb964b2490bfa236e2770b0088697727c8f5351fedd3fc3f160a11130922794d1f961e6b1161480df598169248cc1f4a427124d0100b9cff9b25913877454478c36ab56d16597df10bf6c26f11c0445bf350c4d2ef3325e12d476bd7ef5bb5050000000000000000000000008aec8a5a84284fbff1f34a5e09d52f24241105c0ed053bfced5c57bf3f27a07cf3e08dfa4f3450fb840803ec27db7a9aea50bc6a081abc349a41c96acbbde7247c5be68a2fd839d367a09749db1d289e235e70a109733dd31507b2a4337ba10300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b7a7d7b8e41eac9b955dd9c493f0ff6aeb64ea98759d2af7b9f243982b77ffc2868adf56a2f6c0f77a7dde2db3ab31f4944eab2af23ccde7754c3cda958f7e4215a7160f2605b8cf80ec3626541dfc914d2f5ee8aab9f47751f79a471758abcf44d16239b7c1879b389f2f151982ef5b201b764bac41be5bdd2390fd5ff623880321b4b2ba933758be7dde5a0627306452a8a4fb3ddca3f6d28841c231c901eb98030e05d74eb1255ea55dbbbf2aacd6af907dfb6d608e1e94bc6e9e7fbd7934381a0a02834a782a0bd49c1db6a04e5692e723cb6f91d3b749e65eae5a24a42f5832420954a807a9cd93b34de7003d0491b70826543341674253b8f1b055ba8d985afb020513b3bc96d43d06cc794b02bf4234627d6c2e590094a68b7985bad9425cc80a02213c15e193817a86f1fa7cacad62c4a2e3dc3a934599aca7d9891852d3954ba20220d86212929223a5235dca909f82cf1b83f389208332992a0984ab217a8773b7032c2203c984e7b290bdef9df249359b675369192f1bddcc33a25030c83df828f903271c8de9313a7e05902ba93409dcc70a1e45dc77a972ddc43271e9cdc08a098cfa288a69e6ad14f2b0103fe16aa14ae66bc315dcdce1b2852f5fe22565b3a353ae8e6b057e3f47522c71ab02281f49fe8d983f8cd2bcd65818b365bd2e0f162a7c9d862596b525eec070acf485fcf3ea30181682b3a254a9f397a80050bb8bf5095865b15e34def21c5433af6ff3ce356203e92ba038f33ea56e185054c4b53312c8acf44c78f133b7e7d67552748df2b467d92974b0921b1164181324fbac4f2e4819ab8df93aeb2a4020bcd9a14d14565c74bf5f610d44cf5cb28df0c919b11ddca868df0c33baa2fd17e5e067cf1393bab40e16035f765781b7ffac9e218c138bd15c80ab83dd4a918811c023a2cbc44721270f3ab53e62a03b9536d57107ea13dbb288d532b7d1a5312213159abc8feb27d6db2311318ca4800894e4166ede2f0fb4d2d480a09c429fbd6f2fbd3e40805a28d95dd324179364afefce16a205b620aacd3eb07fcc03f7a70c9e8be2e31a930de0b212bb2cc03043e2ac9121c3c58852097f104979d0191fd8c89cd1d552e176d7114042ad0906dd3a4311a4b0bb257fe80eded515004e1146adcc2a74e66ef4f093da9e58096e01f08d0804e0f7f3e6748b35af437ecf4dad5608ced6b308c67cfc4df61cd238a52325ac3dbe3593fbd055ea735eeeb3096c9a0de01d9379f316d95950146a1952b4e19aa46cce1bc7b0f0abc25ac3d8cfbcf7d284b7052ba4535837f2d248dd064f8f3b42172b557028f25f0166dd0a554decdacf730fb84e749a50072eb9d7b861688ad2f6ce26099b59282da5e4a3be30ac7d8bbfdf0a778525f5a64e806df33e8ae24d913075b95da20a3661f422a026050664395f2bdf1b6f3be3b490c5b420c8b8ee5dff3006ba6fa60154531cd7907959f3138ea35323627cf5637c31cded51efa5c4299448f654e940d3ecf82da2ed3539bc4a69afd9894f31ca5ab07941dd4e683fade441b428cd8b5d70478110e856e8e7ca9768f695330e8f70dbba4062e571d7b827a147f3af15d0827918993cc94ae3460de11a027256103937e6ef06b5f7329afe1ddcbe04dd59a96d1fb96eb3d9b53f0984b0fff4c420b6c3697c6315fd096b78a704aa3563fbbfc4170a9b54fc532f34413aac341553fecf66764973021e710816f8a987cf8cfccdaaa75ad33bc925c74b63feb0105afeaa5d4caab95e603d4a4d28b65659e6f25bc7075f1d66e781cccae398ff4584322466c0fc1dae5c3bcd309d60d629a651694c4f573f84833328232297c2b21ad354cc8aacab85738cd5df6c471afed8a96b9d792390cc72bb3cd57106a214422a9d7710e1f1329da23e13636a3d1b261905772205764ecb2662860b8ee1ff31fbfc28adb5f490aa0128843919946f8905c0ce442e6a4ba05b4787fa5efdb1a6833fd040de5d5074a3dd09593cc72a9937c4ab2f3ac98e9eec069dec5b3333043dd4ddfb2385916cc04bfc8fcd7d0bc8d473cc8bdc6c6ef9d67912344bf77f671a9f97ecf577a4f6960de2c4b98b59a74ccc5e4defa76a7fbed95842b282b1376051c3aef2e9c925958e90b1b3ed9c2be23737f1ff038b8fb4a2e9247678ad40d326329fd3224c3a6845cdb2ceea233046ec5c83a92712f096951d59aa2748f2bf2cbe9854fcfc6adb40a441035fde9c6232d905517e30bf6aa1bdcf706e0bf1b85ba6a4f66b0ebf0a87ed050abed951ee59e1481a8ad1a1bb0000000000000000fdd3cd0000000000e39b03dd99ad60058aadd43c347709e6a3b3cf8bc0b010d6e99ffa09990b2c8ba9fc68b8a9cd4d6decdd4ecaa4f05fcacf3071b39058b0f74488b3dad6ef04827ad85ac57a787867332c8206a9acd431700c076ab1300ff8ecd1c73a7cca1f1f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ed00b85072b0141e97143f218758109e433f1baccbba103bb980a81f9e37f2ee9d24e70a29a62258bf9e0c99f71d3968166d30a87796c42f53a08ef04a2f1e5b3e7785e4d521dd457ab85535873e7cc3df5df92fe1f7ee72ad90e26ec34624024681f6a55b1543f730fbeb18fd3e71062cfc76d4d361b53a72758808708e9f90031adbc247ca09759f4e23a06eed690d491299544634a9a00a2d02623f92b9e9db030c9f3ee8632a52897566e7e494a14f0a043cb5de7a0f189274fbcd4bf8d3d6f30a054202a67df17a33d9c6773ab5ff397562cd80bd83da44c9fdaa76d6c7164c3014060dc490841adb03ffb0e8c9729a5fb14c5b0e9e750ab6328dd88d50e1cedb0210ee248e9ead2e1efd2f805ec968f564ae17f5ee3cc8a7b0f04dac258dd21f72030129b506a4eefb5cbdc82e312424bf83ce4677e41db126acedba40fb28872aae020ef8bb48c47c23c445be2010b9ac61e87d9ea48ac7eaeb27aed4b24066a2485c0323c5e04abc1eb943cec7d247d265566b3ee98dc42358438f798700d96f31a551032121ca7ee7e71b5b565d338de123e40a504903e6a1145f7ab1b522a7180350d786c07705453c4d7fe9aa0299e477aae470edf2d6de6bac653e5281bc0864a90dc6cb95240c8ccb241d7f5ae25061985472d2cb82e27f341a88594ace79edf70a0560bf345dc2cdb5c2972995ab4cdcf6e3400b9c8f8d7e5352d6c6b6d80ea50e9dbc677f4528a9a1287dabe425839222f65218519b869c75a927c22e54d91b41a16c33442748bb259143c5a8011c4bdca41154f862bb07734af939797abe91fb2a37e6bb7c2c447445c62c5ef50956ba9e02a14c3eed85ef867b77bd94a45d86f7a58d41b7396619d289669edeffa73245a28591e0dade92127b2a6777557943c8ac3addd7fa2c6882ef71bacaa58a212a262f579b3ebfe281d244fe024bf19b3123ac0b065ed2238c3088770baa4be294684dfc09d28f69bde328290801c97b436272330e72632a2dc7f77b737ba650312478c884032ab9e0d863891fc4b5bf6b344640dc44d88b20984b7136901fb8a8f69743f6813411f434ff2c66a10114b776825369806a2c92b5e8a0bb6405a8054d2cddc5afb980db7c547640c39eaa2e231690937018cabeec4b952454412c8943d6a51baaf6db91ce634ef4535353067b8d45896fd087b2a86d5c5472cb16400996985543473b03b1e423ef2968c9298805ac2e5b81ea46d3e360534028e0886bd4f55140f7ee9c57dc389478523d163b367b3d5ca542503806e4c65941542f51a5c11bd1ea9155b3acc29b3172e11c4d58634f760d033e04d0337f5a9ba095cffee64e35c9004d52bed85ab4c0e2273e110d322ac6e1efe5285a3aab57b566d5cbda9b6b58e157b5046f43f48c6a335d27d2301f90211bb99bf53b2944fa4b0b8ae59909dbbd6c7d2fcb96722e1a589d13d37fe156ae8ed8a3133944d43879f9c39e72b6479eebb1a0d9a5ff730816a6038f90bdc87ff70afc4bfbdab3d1bd574feaea61b4b9e1918b9b69b904999f4a2ec3ee0d5b70ae2bc262080c6088baf6128ff5dad91144394566111ed0fe9aba31fa9b80b080202cf8fc8e41af514ad9fbff4e858cc969cd3f30413df37fd0420cb5fbff46cea90c3b678e5afeb73ecc04d4f8a4d1545b3987846c865df0698f2996535e23ef32ce3cdb4a867260e024ea64f5745a6156cebbcced4a3e4c13931a685a6fe8c351cf33aee2a52cbc55115d8060b9168b0c1b6569ee5de6a41348c97e75b2f20d60da3c45ee0eaff21cb6b608678a1c88ba57729a0b0ecb0bbf15231bd5989227876fca3f46b4e818906104f1c44da06a7b14fc3c59992e35e960530c6fdb77ae4f40a5ce58a666d86d1733690cbb9af25ee170c5ea526249b4e2d658802b1f8ac9e7d773c43d625d7423182e637d9f9851b14b10e83a13612581321317ec87888f666c1565b34eab6fbf3740136e58cf271a0cf0572abef2d954274eaf714564721dd5331be765911497bb633077975b48fef9f02678b0d6e0a2df365e8752ce73dbbb69d55e690d63bc1acd4aef4728fc9b47a3923c79cb2a9ea72e08714493ab80bbe30bd68ccd579e01307d34935aa171e03da7efbb51d296544c1a9c89305b8cc257b589d4c62ce77e60cab442c3235fd58cbbfeaffa2bf2178890e91e186feadc43c4917435ff4108127a7b2b817c78925f1fe54699b976447ef527cec8afdfb64cd5c237c899694d6cc1cc488f8d7fdaec87ea1e0d96babf66c9afd8396aff5e23a3a8e87377f9e8fc8e654528e41f6a7aa556000f0e1a1e739bfebc597eb05fa1e641bfefb5979587d07726dc87fd66897ef46bba81578b7413f53972415ac9436df62e51ac963828b14a483110094f40992c3805968770eafcf60210b8b77b8b071ed8799d0c", "006a51536a510052", 0, -764231268, 0, "156b3a06895f420c38a290150cb10a1c2bf366beeb6cfb4961baddce68a248c6"], - ["030000807082c403019ddc4517e91e65b9327f895103b4a1c6331ff844c8af8cce29d21b8563619737030000000852516a63ac636552ffffffff04f1c01303000000000100f459bc020000000002ac6a73bd670200000000086a6a656a6a52536569aeef010000000009635353655152650000455f8090e2cc7ac2010000000000000000bbcd150200000000cfb021eee9a14326080bce89166f529027959f108ac5da8aeb95e35e031cf7020e1ee27aa911294af01830d920526169f7fd21194e3919e42d6708b6ecc4b980c469aa6a1cd30cea868a2c4733b31eb04ead6e21d00461bad7906917cd76719500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d97f1d2acadb80ab08f8e3d499e65bc546fe0e44d975138b01743a8ef9fc14c71b16acea7db0d2fef50acf562ed3aee277b8e2afcc61c5d844d1eb4028425418b4b327ba84f0fbd86730face59d0dd87d7a0b42699b71705ab342a0c5a1d4eb571bb21b13462181f6ed67863ec15b67be7c3bf15b5c17a610da6423a8cc8cae802096b0c49e3fdfbd8f70d93955e36e4992fc23f37f3105572dbec35dc8224e7ce0218e2515b924d406a2aab6c320f00629e529ba6feb4773f704928f414bcb8567f0b07d7f63975a5e2a7825ab13a094eab8e2119608cbaf325722658ccc31e7c3aea788e050a6e02228e00595094953c497e6453c4dd48835e050bbb68a1b2b2fdb0020802e48bab4a1e7936dad5ae8e7d341bb46fae7c56a65fc48f2bba02b119918c030e42557b87a3e1451c039b67e0fd7dd03c493e89230d57f8113304b4652c55ea032fafe4ae8874ffe517bf807bb888dd8325d00574fe4b404f40d5dc1fd210fa320218a2d46fcebeec25edbf649870b56608bfa7fc716c7cf78624220b979695fbb3032e865adcefaeae42b864e7c5b897132525cd915a684db9961f61a9a7e7e596475be76dbc81872c87d86a783585c86a11cdc30cb12e66eb98b0c711f8eb72a1caafc34a401e58ecd1372f82fe3a318c4fc2967bd61b59d88a89f85bc33d95f9f15c95714b94588167e33254575a96a50ba5d5a784dbae76021fa6a2f76e958a69a552b4a73f0973279ee4943d3bd887308b1eb47db349539ce663ae8d8f645507b3978a40583d9713249946b5f275cf7ed7742530d220d6cd726d3769e3a54d2c8b4df5e2091cb2195b10e6a09469a64a4b14cdc2ecfb10e09ccf712d44fcbb41b08480206eaa7699f8c38c6a30a435fce680af089f5cecf465fcc56380fa364357550194894a9e0f72687824db6f05e5a92e8c8f247569bc0b14206469b5dbf737bccf4968389f58a10aad45e5e48bd09d65326bea6fc4e57d488642d3f998895e03ea5d39f3ef155b650f41482b40b2cde12cf013d1d72082b7f00e3a17273f0bb88af26aa5b7cbd6043194b06a95f13d85a25a591d3fc1912258d31047efabbcc4021b4078cda69bde631b5e8ecbad6c5e40e27e677b58d1086582c4c9f0026182d0c60de2d696b3d88c13ff4181110a14e6f42becbe3079f1061bebeaa4660f864a88d0dea1bc076ec5629cfab09b97a7ffb925e11b29a8a9de87ef3fff6c7a5ae06cb2fa14e977b71c4ceacdc19e419d24ae3ee3fe18821c173c26e1e41e30a724a54b9b1ac57605bbecdde7e61829388f4431928a3ca956aa892d43776526ab98dadb0121710b36f0c5f3889faeed4f648212bf72aa6232a5fba06668da11b9d38f73fa1fbd1efb9e2c65b1936018b84545e928bc42835382625b3d4d58fb4abcd596498b99dbfd3a2480cdd14c87fd1d9ef2251322b96d2e62d3ef29e3101063cd521f1ef750892c257aef8d5e3d05fcb24718d28678f8fcb53fb9264cadaa55f2cb4586e02b1846dfc48f4a76475ca3ead3c5a10f42140c4f025f2b2f7f4c2fb5ea63c79c0b0ee17c0a92737e27c5e4bc6d51a02bae2b7a488ba8304d76d35c779f9a616a44114c77a72f53e9ae90d829aae8cf8fa04e81dd783db6bc7c9216c7e8ad76f79a58676082897c43fb14e19a061a01c743e07b723904074ce252e9219ed2d0dc5780eb34363064e9cb5e1bce2e40edbb2121bd867c2697e2d750c4795cec39f84acd6c5bc453b1e8a67d902c5e1ef0ec9c4ca3b92562c8631c91f55a049cd3d0098c1b4770d06bed824c5aec86843efa8eb5f829f4d1ee462b9a42a003f707af7d3b099882e048544529b9c98ebe15049d9be318d5ae34285af1def3dc8ea01c0de7d15ae4691754b8d9a406d2df1fd63443e7c364bd1abbfb1dae8a8d52d98b5124a06d3bc54b4cd910cc5b03c90b3a64e126a063c5f1b7f8d26baff5fb06c242ab6156674cf10960a6c2ae36fb79f7dc494c3e0e751df8238261c3029a3534fe611866ffda07f1209ab30f547f13bde44f8f65eeae98f85d31247f733d8911bb3baf16b112276ab8ab65575d61aa4cea5fbdb48cdcc7959311d9bb7dc83b65a7a3e19b2555ae7f8bd0d94a22f6276d56cf0af376c23ad851bc0ba0b269ce3455f6b790ed0606f8a357a0c0469a30ac0c1f596e78471ac8edf3bd70b6cbf6bdb84a09c1324832e78142e7d672a240ffe9d77d674527f99c9ff70f29945f6b7f04df480dc50bf5816b2fdc1ca85954f6f9108fe5bfb1bbefb03cb6869243f0808b3fcbf26d19d9dcf2be42afda253a813c21cca6780e37847974ec40b726f0572a7e85c2a21a2f28d8a8ca0f493b74005707531b6a1d110c6b5862f80267b4f6bc23e6fe2599125df7475d1603a38b68a36ce4b93a3d277316af125a6ea498b0a0108cb126cec92f3406", "ac6a63656a635265", 0, -1322206947, 0, "34bc97d239b267a9752530d117987225d74a437806374f5b43abbe275025a609"], - ["7c04bc030137207b948c0d78cef2bbf11e1081efe5e2a4aeabdcad571f1812747ad03ba59702000000066a526a535165ffffffff014c5562010000000008650065525100ac00000000000100000000000000004170a0040000000040fb6fc6eea9a7064cc28fa07e276ebc5880cf2fe8f27ee62a57c67e01f034d0c719c1cfa8ad3f1eb31d5f86276970e3f95107850e908ed254a9ceb3156e4fe862fb112a4f79d2108c5972f8ffe9facc0e228595dcba6ccdebc7b546e6f5d788000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f75ca674e3f6a35ce9001cf28b79c4a92c47e26cd6da57661f26d3e78594fc33d2b3085f5fb86a756a570110ad7e046dfa9fde76efa81f7bfaabc2ffe52e433299c151355ef5129c8d79a100703aab71fa79561fa8bc1c5f091c4eebf5f235d4286a7bce3f66d4c51bdd9023ceb0e563a11fe67d033b0228819354377816a1b03080fdd056079f30624e649171aa3ba8abb2b991c3045a2ad3a78c74a8aca261d03292560d0bcb6ced1c37977c7e88992cb4afd791159f2de63e847471a973bfec50b0820089f376714e1e7595a5d0fb54fb04fb9c715620eebbf31bab08ff2da9a7f564c9d3438c33457a107c375be96732db44feac97fae3159a35a352986be5003020919f3be8feb6079d1dc8ca4a49d8a7421e1693a869fc73aceced9c690fd6f4b020e09ce8854a9eaa2fc1077eacdfd075c141ac0219c820159eef6b6564d99fa37021cf12731bdd2a662731820e24ce6730a19d492f7fc434dc1df867b1744ab4e64031d840188963af464e05e21ec9470ba0ae3f0d8349f299844d6619f52ce402127031b3aac95c81010f043cd825ff8bb8a898155af7d052e450e70540d1d446a426a41c357431e635324b8bbee7c088bb15c93cb910aa16e5ebbe7c789fca7b660aa6b985d3cbb70149c4951eb9296b1ef2e31164bc897c13eca2ab3076892fffd1374ca5a67f3c760020625afc20c225d67ecb0d185cb9aec7fe8cc7cca2907c32fb2c81a94fb5564de4b8bf2ea7ec6bd81723344346b17bf9636ec8a1a630fdba18845c48e66c027018041a32a94b1f0fa884e580cbd4d89eb2ad4918cd8aaf04b11f4b9fbabd91604f661b4eb7545ae9702fe8917750578c9b0284378671acf9b569e40dfbc2d5140990c9090399662d551d3c50302b97f516f3d2a088ccb12a06131a6693d51b8904a9ef95190a21aeef6565b069f4b755a0737d18eff32af1da5ed0620a77e243be12032294f9d8e4a8d733e38ee8b85d1a249ded3ecdba5c4e6a82e7a6c3eade8ec0e1158844878297a29558bdea43f8eb5057313ded3e685a0f46869f33eb8388d0970c4415f7c5ec72e781f16c53d78043595bcce930ec6929b00e786640087119498ba1ae2adf2e8db2aa8d075783e4f1a374afb97215df85c7798e158d65a96e0b64d548c03b75c8d2a813d2dd6332dd6d5198c86f254c4182c115914e87d504412f36d9305db2faeddc9904031980629a72a1ad4aa1efe30e4c66ce7c29cfa3c37494dc1d0c8e407c295cac5a387bb018a33223480f931f5cc0eefa582cad04ec11f6cd2373a40b22354d47e4467c468d0a4983791cfaac0ade43c80f6dba551a7c39ceaac2cb64cff233f9bcd04df45cbe586af6922ea758fd9bc0a360aea638776b25dfea7ad638622ff67633d70e2ea77b6b91964b173a61758f0ef31231e7776892885590438f2e3cf7e734f98bccdb0f70777a2450fd03321923affbd7b6a2d2a03592b59c5b4560ee1f54ccbedbbb60f1a8df2790351bc383ac0cfe54f08058628abb8772b3f666606381158dc31073a15f18bdec424907be61cf9c9768f89a5e2518dcaa678d6cd5497f17f7ed7f880e8633bb2a59b309cfecc8a26eb30a88ca688e1b966742c92757ada8d718a5f7e24fc1532cf420efbed3ccc9175b1ee6a5abb24ec65dc219b7d406b307e86c622fe739aa30e2b23cc75d7edd5549eac0b3b3631b0e6eadce03f2f0d27b67770b9ece412799226e44d5adf47e0f3be19ba7b5d97fccde205907c38cfb32117e1ba4e9ab9f64acfb70c70d46967828285c5836c74fa48c453335753068e5d93bc2ef30dc41d0bf59f0cfd04fd9b6cb287ded001297e8f5da5a6e1badf8bd809c1545c3ce2568a72eb2d3e76f801ba744326d846cf9f6bbf49045c87e10a600a663d8156ea4f1785afd79e91072e03399f65b40dbf4a326081bb41cf81ba71e517d77b38782eaa31a6027849600c9a919758e2b940393e1b0912b9787ed12d1f15a1beae82df11b39734559ed46deeceffb472fa92eb0e3dd74fa7845bc74ead083686273617a1ab934ca9a55c150ca55e0a78a768088eba8d7efb346407f5c4d0545729cbbd9ab9768718a6f1844715a46d6d525940dd692ae4fd7806c7aad4b8b3266e73fe90f36c3248983cecdc72216e21db1b87c04eec7b4ad02e1cdb16f1e04ef46b895409c8953f212ec05923781e64d3096d6f00a363d86e985cb9889c1abe648423929860d7569658eca056f56f61dc7e8ec88b37cad55e10d458d6d5467a05a545a46af88ec7eb78464ac5e157832748be6e77af685e7b266b594501e9307e2d89f53968058bedefc73728522fbe263ebc984a1099749824dabb7440abcef35dc0818f062e35e48b17ecd2cb5dcf71b07c6f8da6c136b865e2bac92425c74f8e1b8ea461be290601d6f9f62d0ad6cefffc0a", "006351ac", 0, 1321613283, 1537743641, "74be3853e09457f377cd56882a8f6b928de160e8b28d118b50887e716141b3de"], - ["030000807082c40304fe46e9ac31b4fcc5f8a8f6d2437d9ff7f8ca322a094d20ffd1b77e8cadad85bf01000000065353ac53636540cde1a3d14fbcd0a38751998c3cc6cf061710980ac8d2830f2fcf7ad9c696a69c3860540300000003526a65ffffffff442743b4c09ed1249e65fdd4893249df88b7f34bb25add04aa55a1ad24ab6577020000000752536a65520063ffffffff21ae80c0b272869a8f818f53e6caec418dc83c68d8bbd3624c27180f85e73cb20000000002515304daf6fc0142c8ab030000000009655352656a6a6a525100000000e434e90b02000000000000000053e49e020000000098a0cfe6a43edf866951dec26567fab566b4535ab76766af7f4fdb89ce825e0d03079d4f1a78bcedfc4fc09c3b5c9a667f5b43ef799c61f658579d1a959c98374dd9ddf24595b836287cde223b71e41768d23d33e3310dadf476435d92ba202500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bddf92aec958c316c9f8f30c9c720104af303e86b15c25c683d82637ab1389cd2927bff9093b49710012f69a8252d1a59481d7ee29431dacc7ac3a7ec961f8acee908c2f61514b0910b4a4b27b13b0cdf5c1fd356919958afac643b61d619eb302deb9d0e1fcac7af975b9883d727f23e74f40ca4de73a213cac25c4db31ce650311a1c1ad45899880748b8d2bafc613b6f150b51e172570cfaa07aec25012c8d103214bb38db39fe8806804598244ed7f10fc00bd4ec7c3c234132c0f5cad6652d00b04e9cc8406ad465e790e8c88647ce41dbea026d4305142ff84b18785f27030b23e2787be9cd75ebcdc943a327f25f7fa6699789629d1c1235ca2ed28c40815b9031caafd40f10a16566599c8a9f7af6db64cc02cae8fc6a59fdd90f6184bb8e06c0305f44e615b148ac8f16448e5a254a1a06b676297ddc5edbc4966663a6147aaee02094b5addcf5595ad66c2f6ac18a197d607a6a3500fd7acd7c9360c8b7133d1b4031328638243e4d7de2a8ee959b5c13dab4dce3feca9e349f5525d6cb72b71a5fc0228859b527bfd730bac0e9d9c6b4ec9f0e88c637901c8310849ae2f535a4204176b26d2afb8a235f35a1e2aa43ce6a462809819313eac41c2e9dd6dd21bb3b39004b96ee4e8e044526fd4529c32b68f283a8a618a435c25e8bffdc00163c7b71b267b9ecd9be6e4bf67429723c699d359e8a42af7d11eca7b995bc039d388c79630989113d36cedbd82e49941f506e599f466b02558ba429ec6010dda20bc8272591027c8f7bfded6c97049226660c45c55c89043cc48edd9f4064961ff2fdb55ccda611dac0e8b81db5bcfeb666bfc9cc64a753796ad097bee394498902bb49461be09f803c510388fb7c333ee893a757829e2397f0e344e3037fb569ebf371eff131ee90e2115e280be37871201f7967134eecf3a8921eb71a85afc31fc993760d5ee4ad21f658242f99a8f37a7dbd7618cc6d50cc021df6cd2d794869c7cd753d17969cc4ba92ffe25045218967f70a6ca8577b16d0e55376c59c02f8a9cb9918821e3512f8f1c582f327f78bc36847891d8dc265027bf499344d599c256041f306ea8e2b1d196e286d4a119a2b2460ef6190477e0a30e0f8a960119b7e3f07abf0c0a6ecdfa0e5768e8457b540acddbf96fcb5f19a2c1beedb901044e8c8079e9363c8cebfd804b4e530603deb50d0a96c74938cae7aea07d38c97c2bc35da14655ccccc569c83ab5a490a75d80d1085497c3aafa21adbda4929b2c951db5b2ce8b09a33c566ed46ef3315467f8d620afc5f84e3a4bdd779b00528adcd0d1aa69c968fd1617861811709e88a3f4a54658703d73981002d60c97a7f6c556183588e1dedfb974278066225aa94d93f27771a238f7f32e33ed30cf28573ab9e3f3009c95f8fb2cb3389b435afc317a8af13c8b6add397d6b2b70a3b8bdd18c34bd6e629a788fed5e22a80f9ea2e2dcdcc0255cb25e5a19a231123b5521c62678d639c88571cd75027bfa58154b556fdfed941b8b39d172d63df62551f06fc4b9fb2d54fa579ffd7f803786b072b0435fb4035cb190798fc213eb5d150cf0ebcf4cefb63dea2c08db57d5683de9a2531f477d614ede510ce5779a9cccefe99aa0dab79055719ad3603dd85bed7888b5db334690882cf35198e6dd7fa667bd9128552ab21f2f942d915c0465c05786f292aa79aa4f6a48e8640a9d5c6767c636680dd100146b65b2ed84a57d1447c01b7a7dc113de7c182beb16e1a9841912e061159806379d6c2f260c3509820cacdb771515d6f756c62d80c4956df36a10ff347f1c636f42a07a469c94c03c60bfa5f84b6beee6094356abdd82f7d1fd6dee6edebf51c15c4eb43b68c353e1d3c34bc459cec49df9165ad3e4ed4a003434107e7c69928b3cc27823121acec51bdb8d8f753dff2f07d94f0c850133417f239f9adc409682735806e6a2c58445d320676ba125479bd13178d73ef574db888f9263c2d2645c0d948eaabf39a98d9e76dc8d08fca5cac382d53da88cae74c6f91da3317d0a9aa7dded787a3efdc3b7c91cc7fc7a01c18462b9708760da86b9f339fb7a22250541fc90e99276e40d199b49727cad7a2fdd9db7313b1dd2a54ac54bcb5fa5d983feebda228a8775d4a5e757fd547de735b63abd89c98b11f2a6d70850ab285a4e1ae8cc3d0e556829aa7b3009ed41fc140f912ae2e84cbf3916d8c2193567dd48e24fc7664b0ab060570e32eb0d2256a1493268068966316e2be835d7a7061996514872347bf54e87853ee19f93b778692103000000000000000000000000d8d097bcf6a5b2b02985edae85f7f290a01698321d939a92dc0ad043df3e8f4fe09d8339bec1ba3ca2b1a8bb769acf306918675570603816f9bfb37a77429bdc904a7c5efaf3ea6b73179149f99e929aec35eb7c1156cc4965a9464a9dedeb7900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c6303c9998c5cfb6365c9e5ec2c5f2376891bd03e1c4990207d46dc89c159092e69cc0295af654b9bf665c3b28eb6d14b79468f73026e33cc60b6629ce73143db8d2de9ec84c12229eca2082ea2555535fca0ab5e8e6e9ee5d5f289b03f683dc1fced12f20a78300082959fb857864e7b91af372ae509e441f9065c0f0fbf1620208b742847b5798da28099d45ea4154a918f75b42a91429472f8ad6e7bc387439022024c8b4f42f668c71fce12b4cef74f895f57750606d3434b90454dec0d132a80b01431a0c77b1b5358cc224546c7c9ae87df06ddffa53b574be69363bb02a7fc73d361f84d7037ac1fedcccf4d9d1e15911c35f23f058c718b35799a08969b40d02220104d62e1854abf29613139fc78de1012c4bf8e275d3426e460edbdf500337022ade20ab2f17287e8e10476b19f48aad6adebac0cf14abc6e6645b64c193cff9020eff82b0d0a355b3e9ce44f0c4a0a2e3447bc9693845ceae40b80f2ff1964ec802078afe47729883717f38d33328eb60e22fc2c15a714d3eb75f3d6a3f485d9e3b0225cc0414561541ce8576702ef23975a790d26e83a06b4143dd7cd962cd2b182f833b4a28ac08988b5252c159c9a1aaa92b3b82595a4535bf3930672872c77d69a1ad51691fd4f837e41b7abeb25f5d916607e1e64ece650b74dc4a5892665511f8476f2da0f2fefd4c0945e046de201eb1c560c6acc95b4ef77fe2394b424005b208cab0394b93374ad13907398c3afa920983b2b54e0ce4e3b8043dcce3df3cba6f6eeb3c9c8c121009ffb22a22dc5349a7abac0609a88034baa326c5bc405d005a1068e02858bb00b19e8cd663d75f8c4311369b004faccad1f332e9e7a811ddc3f6f626fddfe0bc2227569965402536e0954f610b110cdb065e50058851c8a165d3065c3539e8e8cf2dec35b9823960b1924f3fba33b58788bd49b0807aeb3176cb9cd7d63b6e87dd0049e5ba717964691b7807ba106978af5139a30e99d616edfdf41572dae57643cd3c145f00b1182a2269c436811c5b49d965b6ba578ec5a27854f6ee78d2630f4dcfe686b36de48d9dbfbe31797958f5a86f09a053914ed7943b4d0608bc91e506b3d19c71c64917489cc0f096082e344ac42ce3063469d997560b7f779373e8c6e80ad75920491b72e3e4b5b65f2a2d25ab00fbfa17971a43e467cdea41bf0f4824b8afd0ed1bccbc9b14bf94387db8238989baf764ee3d5e974c7babe041a8a3325a31713ea5576389ed99a99a50a083cc91e75f0a13d8bf3c32c923b6c4b3e9f9dd3b804e656c7bf51f6b712c240ec74728ebc788d1f6f7af07ebe61b6095ae1a75492b86f03ff0431203d415f4ef5fea32bd2d8a6e01fc1c809c8671fa5b5c3ce012c459c2b5d8e703c2011944adedd7895f906697c8217b0b640daf743ceb805f21bb2aee9d1f169d34a62b73b2d9a2218e07cea39b12710928dd0cfd8d41fa93b520ae41788717dc69208f6b6b8bc535683eb4fdf0c0dc24efc4e1158a3a7185fae8f54859e6bf1bdfbc0cbc0545bbe02671ce093a7c2089d94ac7dbaf9ffb8f102a1e1e862e9d06bc1076fa7c77b9be6a6968d0077fe75327512e42f512cae9fdd89d0167700cfcdeec2804dd2a38a42e92649db4f749db6b88601cd5008284e086c3db430df7313e00a051763227679e29346f2296d7cadee086442771796914497c4946d49f99b63869348d53641fe04112fad3824f347cb7df69af0dc236506ce76cf91fce8b8d6b8eecc4c90a33cce0397618f7a8cc209af916a221a78c769d1eaa56ead165716cab907332d4f1472f31253a749e565d7a82d9eadb306c609b5b416a4984fb1f8d573a6b6b5e3c20977807b691be334c749507d3d049fb3532f1617ddccef37aee58ef280cc478c2ea0c9b4df16eea84c7d3104c7e6aa3b282af51a71836cc627cbd6a50319cd52925c6fb75c0ced024ca97761bbb84a277b1ef5df0e0ce8863544d30e13a37624517dc2f4d0f5f7ea7148769761290486743b0b42fe6aacc4af0f3dc10bcc51b182ef1520ad2c40510e1bf01dba1ea6b7f812d4d863e608b51e65f019c641f1c380d3e88c41a5d512cc3b785241678eab2476bbae16dc61bec62949781cb4fb8003917ebb6ee00361ddebfe8a57d2efc4abac43c7d873fd218db29b152981c4d9100bfab174ae7b6d0647972321f9d151c0d6ebdf9f1fb92a75a23aa91852bb16e3c87b0e442396eaa6b8de2b7ae75d07b779b5a04c213376cd15d855912a0299d5959547ea02f2829502acc3d8aa8ee8eab6c8e061186df9048438040abb38f46089b5b08bf02f140870d588c79b235e213a9c2d0a0361ba32d114e9ab2402f1eb6ec4c9230d5668a41a207090450ab70275846abac28b2d8dabd6ed02eef079d81938c1857b3e166d1c3199f02b70295962fd907", "6552", 1, 778737329, 1537743641, "06403f95054c86c88e05570e05fba70e7ba90bae2b06537127ac31ad4d71d3cc"], - ["d860a96b0182a97e3204b041c882b2719edc0184d8fc709d62d9f8f17c12e8ced0723613a0000000000863510065ac535351ffffffff0136d5e904000000000652005163515200000000018352b9050000000000000000000000007e375f2be7be80b0868837718082e8df85e9887983a190b52a66a62321c0c08905d5f409e5b92ab030f5e97ae7b646c7bf9522d77c30d90e40fbdcf1442f905378b20d295b033cce20cbc5d905a085068945ff6ef51166d6cb047fc9c98b1b3f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e813ec793e393b85a5f2f15b62f2f11f9eed90ecdc7f09e19e53740b418281fb64eccf99850e8c2ef1318c169283f5436a5cad6bb62cd7f0c3f232e051b55d7e6734e31a717ea60a6cb5018e238733c821e0899bcf94c0d6c543f648bf7b529ea1c16e2f469f07a3e4b9e4e7436c265defab307fc7a7851b948efe80ef16e778022c9e6811de8e90ad5f215805dc7b61f8fd576d2d471965095fb8e0b120451b620327ed3c79830b57f66ba6f4dc499fcfdaa6305b10edaddca67f14f4f826db5a010a018bebd1d5163be763f81e70b834f041413e00dfe18c6cd4afb115c071ad390dbd4423b37877c11792cba3b761a5efed6b0eb1c3c37d617964b30137f7c0c804032260f708e65fb7943d5574a8486bd0c25051e4b21a292bacff75647a1a0f3a45020c8500cbfb72e6783810f1f6ced71f0b5d5ac6242972d6589399d8c98442d6ee0326c14dd40b94441dde1861d68f3f6c3d1bf3cb2c624484acd7aa8766c1fcc452031f912ed16add07bd2cb895329475269c9ce93615d9392503948df1ebccd62c69022ccaf7d36e5e8f2a471da2b4221670bbb91def3134173f45f3336a9b6cf43a21d979cf2d81612c6c0de0e49afef5e0d99aadeb720a3c6527d53c2cf71aa4c1998f8fb18791625e9ee503c90d9dfcada4c30f7885fed27b1ba7d7b25a253abe8136dd054927c580f48fd4e68380d34f93946310bd5fe9b81b76172846b30d5897f73670b193c3d7ba3bade27c37f6bc4a9f7babadfb1ffaeec0f1a5e0de39afcdc4acc9ed4e2fd471348974d290c9d55bdbdd1caf7ae70797a704005d80afc9113aca3e0cc8a80751e353086b371f17b398d9c8049913ea685badb57a73f73b47fdebd7b6c8f2278a2e1231b6e374b6155d3ecb26079ca754e1174dfcf6b8a3f7a68b6efebdfddcd49d2e9dfdbff3642ebbd2398f2258ef2aeab7224d9dedc9e13c71c83281b1baa9f4247a5c6d0c7aaabd0ce7a561bf5251d541ab582cf1161ef3246585af5aa8e8f73f9d46dd31bf7392a88815f29c2289d7f8a48a65d691a0a1eb1bfb5285561b5cdb7a7404172a241595e9ed1c882aab2ebe5507dec5a7e1f6f62cc83d2ff15ff29c3c7bbc6d58ad0128afcb385966ccf90329895c66afc4b2e38e6a1aba1cf8513f9330273f67ef6161b8c2ea8a9fcb53dfa68634659f73a0a35dca09d713969f5f128ccc93adfcd651e0373e33a5ddeea6f939300c130c1e1d5fb9b2f1a5989dd2791f270a075619c3adf58ef45d0698f1baea9211c3a3abed1f2bc3bf653200195b48d862f3c3e31f27a2e8e53e053b6e6c332b98843b1d218b24b6b0d566e3482da2a37cddabd6ba3d04a90246e6b3d250d6d6dd8f5d1d1903df9c6101df5257f96c5382d68efa17c4675dc64197ee92f109947a2203596990a43f014e9b250e2be8cf0274afb4b991d24be9d8a49605d6b76908ac4d20eec243b9856fbe7dc8f3b3e470d7c197e4248aa2d80fdaafc738b70922630ae7a59633d9b2d87c4234b11ffe53839779dcb928ea4bd6441bce44b2522c05a0257f99faed6661ec7655d0bf9909e243a341c14c6d80f8502893d4edf4068e8cf0f22b71ed46e9bb7f199dc3ddd3c90bb13989832866852643a573aef9994b022f79950a14ae8002a5df216e0687b106912f188e1befb27dd6fa92ddebcdf51a301f78f3b79ca44ebd98419fa0e171476ebd4239d476234e2ec777f79cc3b2314a362daf142e608fba223ecaceea4b973e25ba3f40459f507b0ddce66b342dc2da2aaeda28ddc51b039f331fe9376536ab32852b4ab7650bc80148d606d9d99a9790b8097837f9c5cc78eef7a8140d085f8f0a44b7f06e3b4402282155eac106fbee5a98c9a4998624daec933c3f22d79e779a277092daa6f5d2fcfdf19c269f69ac88f4362a5915402a2d244d000813ea29c19597d8091a888a01d3370449daf74a0d74cff931136c05d0703d78ddd2de79126125c8c61a2d513b5682a6fb0a8eb4881dc8e7646dda6194f8faba7ccf6f86cdf642feff50a43d2772b9e8805460f95b46e31a0f43daa928f85cc1bbdeda79e3eb81b4fc4bab5b1fa8334a17631251c51b02509d21bba71257177dc2f64a64333f08a8811ad309850deeef6e39636e99c6769256eab35a75b2f0de5322da7357e8f528027820626dfdbac6d3448efc9d11eb87c8526005ad2c9aa2c068edd5056aa3a20f9291b1db0e00fec4eae223805af6e591bda4b55e5a6c2ff7e223c69163ccf2117036d931d3b370a8e21a6685adc8809c7819ede470ad99fd533775c6cf34776ab05fc5d76fb0dc558fb8f6cece5b3bf12e2de19c4eff912abb6974ce1303b520613c8d52a2dd4605ad64f651fd631f23586a8e826be3f85b4537dee919c9599c19c5eb9a610cb2c4e3c28674fdda4d145f4e45adbf6954e8f2e806", "6551ac52520051", 0, -1895402285, 0, "11f3946e9f3d621c8441d21c923fe09069f41d3885511dbb24d112d41ebaab12"], - ["241d17210201aacd3e8c0829c55f7cccbbb49ebbb63ddc7343f370a092b6a571276ddd633b00000000056500ac5365ef5bcd60c30f8b5c15f72d0a599fb8ccada630bafb997eb167cf6379cb590e0c2aa7e1cf02000000025265b75df59f0340362100000000000352536afb79f205000000000965ac6563536a0065ac0a64f2050000000009516a6552acac52515313ff2ceb00", "00636a00", 1, -1702354471, 1537743641, "892531c0bceff3ac5d3cb503f7de5e19f5647c96076ccf64691222aabf9e249e"], - ["030000807082c403012160db4dbbc18908f72374a3e5e949ee78e8df1d21c652aeecc965debc32a827010000000451536a53ffffffff02f94d51050000000001acad1a5401000000000100000000000000000002000000000000000023ba1102000000008fbd4b452cd3543f8ee0fad4bad4367ab66d3cc36c61bd9608cd385f24581342472a8117d05e8ee66246cdb0e23e277da62cf05dc30bd221d2ad0facd22012254d5beca422cb2f174ca29803141def390fa7a41ff3aada83008a09ab31fd7f0b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027eb395846dfe1cc338ca4e75861f869ed4c41e12b6705fdd0e48c5a6b81ef454cda70acdccd96d308cb3e9fb46a6d65b6a6787aecc12ad91e695e3cd151afd0ae04ab7d51449f82597e344bc4ffe5d7b5d856ddaea233d54305b6830e8d747fbfeefd3526ea85ed9ad230adca9f2e1f519f3c49a80ca9e78b63f04807a1e669030f00e336f2a0bb1ec1b0c3fc01abffec199e7fc0c20bcf1c8c34e0cf8a6c085a031129af17427fdb1ee8db6976783e7f015f0ab588a533d37fd180feb2222049600a08601629c99948e047caa62a1f81af7a13e86b3aeb4b1c0a8f78ca57e9df5f546427a6186688e05e594a7b76440835f1bc3a5269146dfb63ca5f791827533e13032d6894572acd2604e99a855790c07431e596bb371301c98d6f17f19d8ce894f702018730c0634e43616823a215391f4ed5d7eaaf905d0ca8e08a5f0b46bfa8b7fe0214d817cd284641da0eeb81559b30450427c770346971194d67f37513151f3356031631da70d3c6abecf76d56057c17bced3c2015fb0a1e1e536c72cdba7bd5008e03124a619fcd6a8a896e8ac65efd214fe081d39dbdacf19c1a9df85ce893903398debb578bf803910de0912360552440b84db1c767557d0d2d7b2fd3dc0c88c86600900497e5113fc3757e223dfa842fab856dfc55dff642612cf5454b6445067f92c653996c323763eefa9d77df9321ab0534c4aee72b9fa800518ae05cad487afeeb98a74857d7095c0958fc7986e0969de007f5a8fd5d6533b77ac1ac39d6b782528555ecdce7f9b0d6430aa6ac97c31c4603f7352569ca3fe91bd8192cd5ebb0b83a6f58389184fd0a5b7692511596cfec36be6cb87c092dad07ac69b4a04c323d9c2d8c33529458c896e2d44921fc370469281b61e2467a08b5e118d1e03fe3d0bd1e58e2758f4bfca2c4f905338510686c93497ce7e8ecad65af567518a23a06930016a2782481d2e521ec40b5f384691b88ac8023eef99d47575acc438192925e9b962406ab7e90492d62884e6e5a3d44ef7ad9b0e3555a67f7fc8f4f00a478bc6dc7a923ca24a69d536f0fc653b78d4330fa2cad689bddcaa7db63be1cbc5502996f844a23d2f2c73bcef64d736fb75c8859a69aee35a75f21d0326625043addc4d13653ad6c2ca9f8f78513e05b00dab09200eb7402652f95a75ccc80b3ca2f9e52ed5de64bf0ab8afee2067e8f02502fd82a9492bec45fbc3aa8503099c2c5decac1bbdef2f25941028cb8d8f74d5bd73310b9a2f4d5eb684aa5bd529b0c85faf171bd43b032417097ca090863c818e311357693cb36284430e7e808e923f1df677f0de19c781da3b824abd217fb57221f3125a391a5f788f63885ae0ed4ea31db5fbbfd8ecb0f5c597d115f36e20888affc1b86128145934f9156443e88dd5b98c957f8be1c003735b3438f32f3d1d209ff81bfb090fed4dbae259c61aeebfcf176dda18d2a1fb6e595b0e98543765dff1391d2c35176ed9802563a151d5a3ac017ecff9d7f8d02e232069f1c6adca2092f36adf0b969a9d996d120a87d9e43fdd5c03aa4befbcc507d6ea12032bc0cdf83f6790c0d18df1eb66c1666ff60cdfc57b540954c32093ee0e55e683bdef6c71df4a4c3ffae6d9539c33ac09db287bcd036aed9f868d5504c989f4eed2fb9bbc5ead8b4f4dd4c1be62d11fae694f28504dff9068d56b16837f04438c9622784b661fb90106f75c60890aa1967a7f109a7c081385567a243305bdaf368292caf81a51625c014ce9aaaf050f6f0851aae90aad5f124d36baa49c5fd2a09b44f32342bc81d224878e5ae786bf1415b65d879087f4bf9557be65ded8a642c1e2c7b79c310fed82fe8ad9fcdee981f6574390c9b6595c0b8fad4fe1297672488eafc6f59aca3548e99b6dc5600576a3a0afb6d94d69c082a00aa1f607b2d4a938c508d8a4ee3cdd2a60f72b1cbf30a914d6f13fed973a24fc2962e87d6fd2f9aec4ac8fd6a6e64d3e8ef10112f122ebe5d5eea0c7be8dae6e888f68d6ef586f879ba8d9849b349ec3eca7f6ffe8db0bab2b0978392e8ece45aa88c01477ec21ceefe315940a3bfa5b5d39ec24547987c6aba2591f0622145e7c5ca2b4cd363920fffb79a1dcd7e66beb271cc6a843b5e933e8c6cc3c2b3298502c9b0cc1ee14cadafb6616e014db33975226bf0e32e92ddc433f198628cfe5a661191c42ea635f651589943276304359edf4f35fa9b5282910ff0683c8725d124ecfd0b850acad221ab0ceffd04e6238863651fce3143f963ba65042a347524fe6d1d81ca78b81da30200000000000000000000000064e8b217be57ad11bc7a4bf73a0579c66140d3654de4032799c9e4391694c504080b490133cbcb892ebf07faada62bed40bc343854191e4f3700c0ce9b9afc234c93ddb8193b7cb6a388035c27a6fceca140d77f2f468f98b6ffdf59cb305fa60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000095ef9e59f03817b1f887dd74b151552323ca9e758aee6331198599865c111af1bc12e7255803daea66f8b67b9376a71780a01e9c36b5d560506473cef0ebd3afd4e7e82cf94d0565d540d46295d3151c9ea2937c9870865b2f5d59fd1709acc1f9695fe7bd19e8e66ccf848abfde0b4d3718266cd4b5f36d77ab6333ed91cb2f030c7354371e3ec59934a744bc9e1d1876bc5a6777d5cc12e2e7be9f4d0b84dd28021fdad2bd61aa80a25d9a4e0c0cdf3af683fa9fa9e5b42402bc768031efaae3e60b07593db901b4057420d09d237cf0a34c75257955644349bdb732813efba0286881018e62957ee054aa065400892fcb8566e97360b845597069293be22453a0a3020db2ccd7ed941b18021ff4e4754b47bd0ac83889ddb27d07b048608fe77dc8cd022acacbd1b0ff303260480df278c3ce47ccab5bde2035ab96f2018fb7e7561b72021b73298026466585fcb16c2c0760bf30b8ad073ce5558d02b9e481113654c6f7030bf924de738323a6911e6d74b037b5d2a976ed84338d5681ccdd6932543c04e3021df3f65a0fce532d416f45ab8483b58326564e7b163c7968e8e685098310956fe7312e52df04c3de984c16c77f0f33bfef56ad4c634cb8dc768701f4d8a231b957548555a227e8a78549c68bdabf5bcbf1f59c715d0a6d51f59a933d7218ace576de09454d51dbea4aa96606f7856f3ec8f3d1e0c321cdb2238c4060b9a0cd9176fbb122d79b81eb35f220ef6efac9a0c5dc008fb9051b2a0fec87dd462f80a484f8b9dd3b44981206b94433e1457a0fbd4d86e190f65aafb6e9048b99fbaa4ef8dac6cbf0ddda4f6fd35d12234873cffbedd8d571c964d3b031670c4f093438b52e4d58ce70ec1e549e529ea2f43ae09d50bafe9da7f2abdd4e270b957fecaef5d2c9dbc902852b831e6808413ee365b62af1dff254897eef8186cc56a1fdcd88c900060950e87641ccb74704d20c6b733dd2780c39fbe89df418c99e36bd7031ba8f588550fe414b2576c18d70948569c9c592ecc23f676023ce01381bd0523a75c5ede4ecaf98fbe73cbafa48c46066c96871e8182df3982174c0f153b774061f7821d14cdba11eb6e32638793d19891683cbd251de7cc43048628933a2877533a40f0277b66d51125bc7ba68d47b5550c14d875997f34dd02736acd2179783f0f93909be83ecd12b222067135d36db9084e49edef93fc833d7f42b3ff8f9ccac4bd2d613c65cd1dbad0a4eaa052205eb5d7cec17b8f0f778bab2c5a7cf61f36a7d578ecf7705fafc95505a27838c2e146818b469eb8868f5037c8b94d9eb7201c4b62789be8d444efc50cbdf278f6404ad2d455b8c4f5d50f15d74312ed6bd695416065b8dcac109ecdc3b1581328817053a30bfe879be7f6baf31552db8cfddc8f35ed038814ace754c97ce30fbe6d63ddd4b1cb41dc81062b143270cfdb1dd390fdb57e037d11b54fd971147bdd5810964eeff1f0d5ea21252956acb35a00a9ea0260167f634ef9cdb792bf9f361a9d904ee28f0c76705eaa8f96c34ebe77e6816b64446c5079391130a27a4b87bdb89b344f7739ee8d372e0ad0f5481481296ade57d8d7c526406775b0bc3e5eb3f9f0099aab442927f91ba556d13c3c66850d970d886b6e966e42e4c5d18100cf71734dc3923f20738a917ed3a19d35d8d4698ef0b5ff8e13442b7800c2943d96d3f94b5177b0450181d8420595260bb0a9c808c10783908966b1ebcd1f09a338e9c0f6b6587ee6ff8589e2f516a4e143bc62578eae6cbef7555188a059a4027e82d6d9cd31ab41ebb0f34fc99ebced21325802743d5e1b1f9b2430431d6739de4a8431192f4451b797bf148ea55cb84e29424e515bd2a6bf87aa779787d91a87f0cf5bad54dcbb99ebb691dff2ab6da96a3f37fc8ef652fa1a233a7c6db23eb2e184e838e23fc94c30fd2e441d0a4dfc0da8b3d4ae48456497c7145cf4e2e4e5218fb42e581ce6617d60ff6c9375fc0c3d2c83a7076befaf440b153b2469c931b5334d9e7e835f152fae3eff7261c4c3d44afd691f0e73f87768a1e4089d0aca1c59575ad6da57c51cd999fa85b2a7c75ac8fe875ef17e2c305d2a3c1c16c2a90b8052f700ea4561f7cdb07781ef87f129c1468d8e79206f61a3a47aadf511ad835d5404c3a6b03ac2a619d3e25effa279fc014e2044530344cb225f3e9277c759790608dcce5076de769da8c84d4c42bb53a3452411290ba62ac0c2a726399ee56683bce829fede093a2be0d47d6d889301f4f028a5ba23ce90df798d738450480443e3f5108e1b0ee645cadccda2749c275ab34f358ec5eaf8c3a513cf00f2e78281364e5c31ceab27796472df9109344ec413189fd388abebc77d5688a59bafd470cab20504b375986045d7393464bd466831203fdd998f1eabeeffb485c04", "6352656353636a0052", 0, 1986728598, 0, "aa62764d8e4216bd4638e5703c601ccc4f8b7f797b0482caa3fd2bdf1ed4ab34"], - ["3729020702f645aff8d91f228be352d7d10215e6abf4bab7b49d4213f9dbf746271f0f89b70000000007ac6a6a536a5200ffffffff7a97950403578aff38854a4d49195c0a8ed17c8f183cb12f81b96bfb8a3d51e601000000016affffffff037a8d1a05000000000900ac6a51ac52006551143de6030000000002ac0007094503000000000500acac526af88da5580332fa0005000000000000000000000000c565d6fffabd04da753b1325f6e8e3af17469b010e5147e232451e5911308c64aa3984b22ae4c8fac505d3159b5d0a36c7e3f9fa842711458e3d5e54c7c9f0471f97c7197d65ba49e235d2f9c1714282990a4845d30fc628e0cedd0eead973e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086305070dfe7f504b3bb5cf4eda7dacfb061eaf70767d2aa1f0c1c3b2616bc841f3249711d3a1797ddbbed3fcdf29953f0ed5b2a6d1bdaa45781314b4e4a1dba941e0a71f2d55408267dd3d5e2814c4a582cf94b5f523981fc91faad6de8bde6d03c7956d7527605b7e23f1a402e389ab59c01dd47f625c82919a0c60d4f294b02094beef6b9c8ee7ba059796905f036d6fa805328568a0be8534d5f2d1af370f40212ec999ca8c80bee1fa1e228c96ffbaaca563e92d9d26cce5169631539cb52480a067f908b22efa032cd86a2fc61a43fe488b2e41648c959774720a2ab8723dcaa9e93792b11a174bdb52e5dc80cc66024252b8eb424b25a7e4264060b367897fd0309a109d1c50c5746daf95f78300c0dbbb334ade74dbf6b43e464dea0969308ea03151cf3f7bad86462892e240f54deee3799a463fca156c76b708c5909589de7020205ddfd6373d298bd5e1d8312d504a66e7b92e9721583e2ce020b3e05d14df5ab0215df6f6940af81506671782b405a066b768183d8df30ddcc6e75fb04ea78251b021b65725ce4453cd8b1fd3b9f283daa1f989a8ce7ea47656f5fe74f3580515e112abd1158ce274312b098ab156dd4f6d3fc3517e727792a8e69e87a27561e2ed2bd089d8dd9b940cb880a387303305a671d2d2a944e84b989f85a6d04f2092baff0d2145945435f035e6a329010a61d1f95e6dc0f0db8ec09036dcf8873ebc41ebaba5886ae71f294d69c8f6280f04c9e5992d93a82a7239c5ffe4efdfc9d279f655767a732555f80f1a39df9918e611c5f61e6cc7b3ce4152e571f56418a0ed8ee6a4deee6b3265fdadd1ac8a34c7dcbbfe35f8f540d34982738f473e906d696fb186f47883b67e17d7f0fc95e988e2715637bd4bd2291a6dc08bac5b3a847cbc9188b475bd023da9c394754ca2fb226a3aa58f1ff89bde93d7625a1639e56a77484c3843b48bde509cb44beafbe6dd1caa393a7f3c51482bd77a8ebd7202ffe0ef15306a9e38071db1674b86a9120deb3ee09caca5211fbbb266216e44a3297fe3b6cfd575919134fee7ed971101a380c5b80418ad27fb5deeaca66a1f6cf7c1e2a9fd8cdf8c8c26b0b58718fa5c9a363ae7c8ae24494472be71ffbb0590446fc67dab80edfb98a2ec4d345ff575003ff41426ff645448839049288f0af0928a35a3964cb31cd43bf621ba63008936389eba7191b87de04ef2bc3bf42e927cb8e9c273af0ab64c2c581f3c8cbc7b7538d5975a128c690320ff6e5f89031a6a06a5d2b96cfdd86c1101acd63b7a81c1e9389332ac30c19ac8641c67ff9b4d85de0fb747686ee2eadd88f89225dc053bc2ba4cea994278e13f9a04466813b61b8bd5896fa01aa54b3c5812a754b43150445c358450d73e5c3d95a09730faa64147b3f814dbf096f3001c5639db74965bf3adb6541d756292f80489a6011c9287847ffee1f8071f3662172996cff71c795647ee410f88977b9919c4e4dc80c83410d69c518efc6007a076b2110aebb9e4e76df1effc3c62aee867307ca813674d96fc999a7513553b6539817340eeec0cac45c8ed99dad7767b2feeca938a62d26cb6ae4b6c8d46af7ada3e1fdff4ccfa001dfa2d3622db8ebebc405139e565aa6f3e5553d1c87434d45738442be2cdb068b5a4d74afa5204a603ffc11a66ffa78a518787a4038b8412eb241aaae33809d6b2115b3a7fe18b1ee2101555eb9dd393b6465e7ebc806cb1ae9efac0143fc0dd9fcdc9d085798f496abf0e60173650a1a65cfd344f9ec5fd86c49ff0a3ff61cd4e79b66362b7325c28b1c40fdd43d0fb4454f40d2011dba03acd314d659868898b43099b3e1ab59dfc7bd4f9d1dd0376041a9c4810f3335cc1c77b6cd902f89388a668b5f7f753ffac9ef2db1133869d43f488486a8ae6ee1c8eecefde1da5e68999800303e25bbefaf284d0c9db424d0dbd6c33feaf36fdf8252c3bda6d7477c099eee90cb40ec83ce3277f845edbc284050d9377f64ec87ec9c95f04e2ac87d2ee8a3781f3b256706873de6795330d570b5e1be8e74e5ca80b1b680a8a97967fd95627eb8fc10c7ef7adaa8f5b2ea6c88b190a728ae6fd8e5de5eb13b63b26e296557983c1be58fa9c7fcaefeb172b86c93cc94de11f18323cd8b99cb10b1e351515a56db50089c515341908e8ac4283d3e007335eba9517b2f0bd512571a051477f792239fd94df08cf8a8ca83b625786930843a772b5b0b11fc2647fed3b88fff4208f2445a4a05fda1cc71d3676e258b77cff8e56b11386b74a5e39c0057aa2e20c804000000000000000000000000b7dba57292c483d924c98880fdb754a74f512c8c2a19c728b21eacc599e0dec730b109a24cbcd96bbbfb74eaae9875556d5b98ce667fae1f932a02d68fa1408de7ca35721371c4c768ec46766e76cbb1dd3da92c5354b147c8067caecf2daa6300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b87cea796aca0a69817feb75bc71bd0082da1957302936b96966bdb16fa85e8c55d6a686e78780b3b7815a487748c10d8ef86497d411a57a3f4962a030955e46af1079f39b9b5ee8101bc811850d001e6d49a8a663321de4df7137d11a172dbda11efe090f1eb0ae8930f559679c88dba18e099c8eea5cbaf3a9223e481cf4c80209c084f62a62261a2db340968363421030bd93b23463f20df2f43dc67195e210022cafbf74f9170259d6e84cc1cc002c33edc8f7c3930f1987df100b65cb71453c0a0569cdff42e08dddd80de1a145f477c3b5802559894c7cf140ef06fbe5462053fca1102ec730b6096475ca66dc6e9bc3b9bb96f43e8f663a6833918c00fbc20902014be97b7ce202a2de37e14e4943d6190049b9df9ee18ad52d27e4424f1c691403262e01e19f6a4cf7f22d0a5ea3ee39cb105183347c32cccfbad1ebe0bb2cc86c021ca93f7edb4963af0fe5b9e38507cc721355fd4ce01775c5d377a1bf6865aea102148d0615e45a7191d8c951ec8e7142de33402a0adab6d7ef8aaaa8939a83ab360216ff82b2794a0cc2e7fb72944a85cb2ab9f6b1705090145cab9699664330a3afcfc508a5da3d14cfc65e549dddc29747d54dd136d7a27c06616d82a85dbb6e392981d2e0e469a74ee18ab63dc8f514f7d2f5dfbd481189511d930f924bbcbf1aac536ea6709cd852666968388aca63634841abc9ce81335968c9dc4488f8a79c30e17c3419c16f0c9b350503fd281ced8f081ff6f3d8c4f398bf9821950a239dad1229db676f9f8d0397fe91c3477225124c6d191140302c3d21390247a4c4865b66f9f1cc44473b57e540b2e6bb44c4aa41ecc0e8eef2add35a3c5a92ef75a06299787ecb8a93bfbd9f5eaa876027bf666e0a635af2675fe6ddfde50b54691d3ca1af77e4177adbb3924ef5c4110b24e93da93e1a145d29be9841d2dfc183cee489033dbbece366d13310965053c00a4474e232e31ba7912c11ad43a4630dd9e9bed47ceadcb095176922ed35758d70d590c08923a3bebf6469efb6e8e12878b9de1714c833202eaa2dd655b08d545dec215c2096cdb2cd1dc166c60649d4b26dcf021918b55b17c378f8365b9980eab0f17d99f6219410d6ff8088400a74f91afbdcb05d058ba7134c21dc299cef66718a423739c28a1ad942003c73eb59667bea1f79f499345200f0a9fa0a78b2b86e2ef437dbe8e41ca10fdba4ec31771863ab2b08a4be25fc3791398d39c2e27806334ffc931352b0ede22000135fe8d3dee02d79e5783bad6d52f017eb9c31b7ab20f6ff90e09fad2a3d8796ab597c6f53cbd2019b2e0ac73fd7956296c67d319fb27b7d396b1728fd41cd8b752cc4ee9f3a67bc8fc58becdb4d8c650f5de0352b602f493bc93df5b92b413fa66c8a5c5f83db37377846278d345c457dc330ee013a3d130539fdb0f9178a57ff353c7ccaa5346727bfa6cf50f69f0feb38a41e9b6b1e077ca7a108f598a193695e57a93df3b8a7c558f7894c01364e69f5e7ac2e93b4cdb712c0db5ffc9b8d9c04b59cb030cff9212c96d4d35cbfdc0fdbd71c9dee0ded698de1f3893e014ebced28e4bd9fe7b54b9d5a5d3e6b5e2d4878156682aa123a631f4d126bce3de89689b2e182b436a7a0d54ac14391674bd17b903d67a4e1131f4ffac649e1270b93849f253766f1bda40f1301fad6be1bd2128176db7807300ae94c4c0ea530e01f79565f716bc4cabdba7d73dc95cb2b874cc00effff7edf5e1ed44ff99c2625c6a12cae06ae8c48a65a90240998cd9e5393f3baa6048c9b14757566b26fa22e7757f6dae255c7b001caec159370f8097b333851dd368634d1babb68fbb8a92788b4377fd8cd328badf8b203feb24d40dee38d7bc2362ca2d4c2ddfa0cc94654a0fc8c56baa9c427a8c1217d81d92d560bd5674407cb2d27c576d994a7fc4a7569c7993a6cd2762d5a248f1cdd7e949629c2c8ff94c490571d0080bd73a7b8502622da78d520cef08c1033dd8293495e5048f1dc785763d1279efa6c7794aa226357446ea6f94967ec02bf5d981c69bd0c8263ea945302f26d81f6d25bb34fd40b03b7ae4d0db6276f99086ff1f8472d0dbdf1ddee36644259e7dc11331ac3e0ab213fb1f4aa55958ae322b84fd28bc585df97da0adb8dab2d9b5bbee79f103abe55851b4fc66137aa8775fec6e6b6deed94615b18fe325cfc24d170fe91d039d5904be4321fae83b09317a68391fe039c471645458e6c7daacb22dff4fa4ad2b22ea2a0e8296c36f2a166223a0e79b94b3590d0f27ae217d301000000000000000000000000dd1cd389261ced07e0ee1dab95e03dc6298ad4fc4f3250d32b7eab49a9e1537cba5419176f2b64735b78beabd490bedafca80c29103ba369cc0c4baf50180eb3ebf7997e3e6f86aa767bcd16e6081c3edda694ccf99fb067efcb7274245f60b9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000662d8eaa9ead8f38cbeba0b355b9ae6a4f437b9783aa8fdb6e4db060a552f4121adf475fc04c8ee643f5482cd4bb997762a32bf2e46b580d855ddd1e1f2058692cea18c487650f7568555a7601f71b148a506ccaffdc76bcd4153e7bd737a6070db594ac96b4d137b869da25a0e51e043068a3226d064775163b3064947295a022fd9d4b1b7eae1a41f42011d3bcec4e19ec7550177dde7f982cd8911376c2924021a67b96588c9d8ce2b61bdd88e99fd931f0de7f278ac360de33fdf2b6c276e4e0b05d74e039368edf28feff2cb9f3458c2f2f2537d9a7fc30e9312561efed8db3610ea0324d0434cac1e5391ab9a39a137201ce6e5cee2efc10844eb0638a0978c021c0330b7bf89eff1ec677d98ffdf5d7632887d7054aedf11605b4af73839d59d0207e48c4fff4a3e2f6a60c3719be33971b98dc96fb8065cb8dbe085fdbd3a01d3021c07b56647397d35f82dbd418a41ca48818acbff3518e453601dfccfab7365240206308bf2216e837156aaa026af1785859777b7374b3e7478dc4c6655b35ac850020b906c007251c2215b42c379460912618c833a174355fea4a86f0164b63118156dee5b4cad42318a4a7d8bb58531cf870a0380ca0dbcc54d5b89c0332337802df1daca91dc5c07edb82e0f6dc23d75d769af60c83b4b8036ca4a1238d7d14c14dd9db2b5beb17b2ba87952bc34037aac712bd316039acd6d683c80706c711d566c67dcfd6dd8371b250ada5ac59bfa47dcc4c9b537a4a537775d25178aca8291219e64f3fa348d84e85af3d82f05cf330451601fe3b330723195e78529ecb5658ba67d174f636eed1e8e332d8d9ff5cdd4fbe20cff2401a184e17f7d1549f7600fd25d83b3cbeb3169354620ce4b17bcb8a0c522d06a0578477af7fb78f4510cc762287ab216da01e7001874009a911b77fedc603fe054c20ff4517a048d93fffd9c0ec2d0a878ade69bc35f94346c7c797b281b271e075212e98275863ef69c62fef4512d4c317b95b8d3d4c5e130d5bca4287471e619f9fe184b4f3a3e1b52f887d578186586bb9c85119459e4a6f4937aa009c9183242ed5a49b6edf1be94169a001491448db8872aac5c67826420cc8866d98f79e5253a36d7c689a671e3758289f74d3aa031287c46f36c385ca609e5ce5a7acacb57423ddc814ab57a7b98ec7301437a365583adbef044da02f9de97b1cdb04cd69128999408b4ef31855a2f06786c86be0f29a3960e7f9d571dfa4ec3213171d36e4531b37b088385aca2898fd302feba9aefb222fd9dbac6cec8e35c22864209524bd75329814aeab0d1829073196a223e556d12ee5a820a2c67b58a8e28c73b1dc538ec963ac9a1401f645453f0a431abad166fd42f9abf39e2b8ee29a9bb5622e6348592e26f4581d312e40351bf339211133c2ad89e465b30f4d66799547dae2b3e505caa34963608e5296e186d3b52bbceeae49a8c955b68398338d2b87b5bcbd6f4db9fabe126b95497589396fa52540c5458508d18f9de0862c4b46ee5e31491db605658b0d49ab505bb2c093f1691b67b72baea742627d36dde25caf72885bd887bb8942e43cdafc2ba844f37923294b6b5d70de34d1a273ce9591dfb22026dc26d4d1ead14fbd3251c9aaaae10d2f953fa5e0ce202942bca3b9fe903598afaf9cec97abc274975b651b72c284a9ef81505aeede46813e3444865262ec93c755ccc456448e1c8daa9accc26fb0775b35e183ada71d11bb2f5dcc58f7fce3a202e365c77d0a1d1cde37d8920e566714701fdd4ffb2dcf3168ea88f92fd3832cb421914ce763616b11bc3b729f153b76531ae6e60655732b7af2118e1075b2aa0558d1d117aabaab86da2e8a7518c675dd4e37854031df7969c03a260ef33e20741e38d02556f8d6a520748e1b05f79587939e650072e53b2e3b51378781c7bfbfe8f6a4796b518baa56466d9c13a06de6a746d3f61173a90ae69936ac084ced71a29e8c9cad96964d6bcf7f7c557d8cf29a18bb6ab0bf00929142051d40438c437edd4247646665554892bc93a668f5e405ca66a7d3b25bec8f982507e41983ede5c5721d71ba39db23b4b1b7e36904962a46e3994a47f0d7519878bd685e9cf677b2bc919b7129e58642f1eefc7dd369582efac032fee7a8d7f07b2c7178f3d1c782aa27532a73bc18257e71547eedc0a51ceef14607f6c01e1d38b1f1b0316beda9059fd09a3ab9a1038224537bd15743b9cd024316a8a6e78707a32145757fce60c965f788bfd2472869a1f996d94a23362cf47580a90e29aabdbcfda87fb5ba637924bc1dfdbc3e73a503048cdf6a4d820adce8468433d8324d94f6d546b99fec8673e53c2c81a31f414704d524d67426280be99911137e5e68c4bf7867b1e01754a2f5276b69e73b343e1446bc6420b5c12e424e60f", "656353", 1, -921078842, 0, "2926e25463ee4930c71580a866d780c4177b0296c400a0bbf1bb411908f1e0be"], - ["2d921676017ba0a8d98ba949422f88e1dadf389934c32da3cbaec918e829de447bed707b420300000000ffffffff03d536e505000000000552656565ac435d7f05000000000753516a635300acbf54a801000000000153000000000200000000000000000d67ab00000000007ebc4bec6479eb7511ed540a5cd58dc3e3d6def44e6d6a1a12a05670131292be91cc9e6d3fb93764f811046c34c7b4186fbeadeb98eea2d45dc737dd5389a57da56cc2fee5f0bf7d72e69e705c6afcd75a239e0113b53227c0da16e7e3db39840000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091dcd086f1baaf28c2d75b8fa78ea287bb8cc7a020d49465ac330f89e30af69b7b7995dcf9fbe60cc49baa856c93e5a86bf84d4ce1d907435c28628798ba95412cd4932ae3d815b14daff6ad08905959e3a6ec32bcf6ac8c360e2532567f66ff527c4aab8047ee9e68e74c282f1131f0f9a2be799b3172fe0fc31a256c4070180328abd62509e2ec4966e74a50709a68efd611768d2f8590a14dd1f58203467ea10210b908733c0516e46beaefcfef40649157e5025d82bfb7656f2b6ba6571eba6f0b05a13a79ab1864d13c2de2e754db049d259d1c32b42341d82679cb9c3c8ce0d3be06a14173d95f9a99988b5bcd845a368017d4e95f369a3d91d0837e493123d2020b9e8a40301c93fad493a51878975cb88b14a53c4a9bd1519ef6ecb1d74907480201498dddef9cee661bd5e2a94a4183e5405137f060e6d0271da1c96db46b8fc1032ffaed0cc23affbd7d8c809aef15075858d33f9480216ca2da585f33958a71780215ff672d8d3ca9c982e676f8efc1b1050f1cafe34327d8dd5e69aaa95d54d5ad030b5fc2e1689f2e090a6f7a5f27e097e732e8301729e839bfb92fb48aac07fa0821233d1dd3223c92930d7b31c3e3c8299d711bf8a7ca4631f72ace98ebb00137cb211b757ef8e2fd74b447b8874bad9ae8c77a73574f4821c1cf927c7060b6200be1592c79614593047c05b5cdb8c7052de57e6e92c5f11873c29faa5fceb137fae3e514d6c4756924cb21fc785ab881555344a6c62dd8df69f095461cef47dba282095c3a02251122e67511ba7ba6c0c4d4e359c658e21f051505f2ad90648ec4c7389a470de49d6b8aedd5c9f3fd6e2bf58449874cd682537cc722a71ebe25298de4cadbba21a8af98a372f21d7ca798b39976e72db940f44c857c68476ce8e0dbd4b8355ef9b32d75d8190173dc77f8b5585f4c2f14e4b28656e5b591dc238d0060438c440e1ced7c10b160a5c630d58126692f1f4f2fbe5c4ceaf2b977e1a7fb4151c28ff887d3e5909e903864be4cd1af0b6477a66dbd4fbe0a5aad993e711144dabb45bfcddfad7399acae1da7c70df21cada52bf638d8d835e7e7b511ce1e7e7269fa6b5e6be122435ede49ff706c2ca1efcaa8ea7d259564633c7961fec17bcc34ad6fef2c2d144d2499dfaab79ed5d9df486677608cc71de154dd386a5664c3f813594df68b3f239553be42a0d21268a48c8176e2174748054c4fabe0b6a76728999f8faa5a01f2ce8175cabc695a38f7a4d6e8d544e71e29ff34daab598dc3e97d2da32abd3e7d00fa7a859e09c73fbdcd7a21cb11efb0d22238bbdc68ff89680f6e785525c63b105ba3b24eb63bdf4ce174ddb956cc53c0a319273136d1c0ad87c7c0fb29e8333ed7c734c6c0d29d5401e52fc4e6a517de6e4842bc22362820e9b048f987e58beac1f04aa7d56d556bab32d665f37e666e13e757a6c9fe4602892bff6328b0267d1f6b92a4dfbc8defd61d58651cf1cf8e7a13999e5b5be8a388f24f7c0f4e2fd64ceaccb2bb5f19e2e172c241afb00b865cc7dd8c2db6df4ae80b698e38c90b77a42db085facfe005e35507262c4347f48732c5abd6512417ec0e0fbbdabc6c7dd67810b437410fd5c8c6941f7dfbe87e24b3e73a4a07a3a866e12699db4bb9a7b139f9f0e12e83b979750c7ed7d4a83c696dff065b3a664fd37ae7918100a4bd8d80ea0cfcc0264f725a54f76b89ac0d98e5dc2562c61a7f3b3b7a2c09e4cd4761ab98df394f8738191a37826d9a36231beee1efd183c8a87d8a2ffb2fa2f082429fecd4562faf865579395e86d246425a5ed6ba4e34474002515271f52d6ecaa0c8a1eb6a53bd77e77506a357b096364a9eed4153b9a452191359787ff5ad77b3d0f0d915ce2cd19752f1113a32b68adbeb634327d900a923835606342d601f5ce93de4ef409dcf35c198f696deb9216c63ba81e437f04a1136880845c7007a95621dec8b9ac067e5442fb37597c45f28a062a6ee7d836d0b8ef9e3996da6156c357b138875a0d5356c7a3b224b9e1faacc693f4fcf31ee4548d2eedd83b1f3ae32ad272b527235c7ad94d51faf311e5628d5bf5507d53cc1f5471911756364a9f58377cd64be96e09f9bb5a9f84235cbaa3e8d92085c22a2e8e6726f7484d778b761d7a829eeeb1d32dbdbba96591a0670a455994a0eb468389e15a0f058a12dd08dc577e5518f935ebbc55cbec6c56cdf96464f7d8137da7022bb27681adcc2406ca500e26ed001fb4ba446bee88b4feab36439ca2760dcdd8bcd512a3114626ae107070000000000000000b905a00400000000b550ba485a73da8d29de2588d3082c71eb47f2d1ea24e4eb75d13243ff12610d4072e47841cfa3b3791ac0af2ae0fc7c3a99d92760ea142f130fa9657f534d1c94d9711d85ba03a7c8ffbd2aedb043ddddbec797f46451ad53b6e63538a2f2c8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ce2fa45ab7cde0ffe70e7402364b939c16a193323823829426d9ba5c06f8d6e7ec61cb9b38d7da493cefd7efc1ff692d108da60c45e2f227096998a75899cd19289385aba3740e0fc175a78e7a8ade951e0dc9b9260bcd45eebba5f08eff2509a788b768571f0b52162210f3e4c36970e4f91176da655e359aee394598ea48602294523603d7acbbea44a739c9ba258b832a4f38d4b12e71c22e7460f6f2679dc0220e7d1f7bfb8e76bf4e3fbdc41d34e94f87d33c097fdaae59abdb722a7631fed0a0919bcbb29ba5f206560f68cd0e236b55a2a1e300e1cec849d209abe29c0bc1159e9a4c562f0dcb3c655812e91072340ea5ab97c2d28e9f28691bea8097c3b01021e066a62aa7a9c80e202ffe6c84009b64ce376a94ed65097a7f332dc14306f170229af37d7f3b766ea8fdcb33f941e9e1c13cbcc3ba31b94087fe1fcc7226b86e602145227ab34209e1c352d7a395d36ed920a7d08a7ebc63c1dbbe4fe83a7eace6b0322f8469977c7d4ca15b74d073e2949d1359a9bb9a5d7d67a77a3a73aab34e26402061ce75b61a4dd71085c2a03bfdebd3ba04c268cefc981d15a26f2914441c649bbcf87bdd3bcd5f31c7bec79ac49bb51c00c213e492343aecb2bca886d277bb66087fbfcab133c1f5520f3ebb1e7e70868d9273fde94bae1d0d8b61769a0e4a97f8bc0cc04ba5ee9fb3722972d85ede2f4d510e91befc513b27e6494a8b1d3ce60fe9dc86dcaa9be1bf2e0934d3ff779397a0762c1f1cfc766ef1ebbbf580bcb41846a89c6117a3c317a3ea55bde78dd2d3b29e25b6797ee4e822d7fedfdf51513439971465d49074b20e47474301552754410ac27d80b6d05db8d2e73771ae445b99e7efd25387936b83134a5b8c627206a5ae1f6cb98de51a079d9c77f5f9863f21f02046cd408bd5f1d9dd51d6975eb96ad38d456684ea916c8b8c97f1e24aef345d3de976e7a86b8e81aefc0878bef1925ae33f42e49a68808eefcc789b8d1ba31c47d4319023e6e57c9a1e7f58759f39fd298b016c48fa9567d762779855b0fee6be190c090629ac63a4f6e2b56bfb3e6c71571d8453396d591c7e6f8e8f978e40ee4868752522db1a7678bdd7028f9faf12e75190faa2a9e7d2d342b7fc05d82ba2de32d604cb6e3d87355f8582c7dc87bd9ae8dd33850caf49934537bccf2c7ba7d83106d1c56b2881c946b7bb02463542bca756d024b55c8601f0bfa3b732132d3fc5fbc06d27b1d017d9c8abc21c7cf85b8452d88691ed85334322fe284a0454bb8545ccd352a462a49311b564293db8294a04cd64f94e55ff92e43038b02b8126b7ff266e74cad84593c08ffe222044c9663c34e6542397ba5f74a5c938242ba496a36118efcad07413d67bf38afe65d21501f9a97c074da8140de19b960e5000fcdc3f16f46a18e27ece7570f43c07a022b6bd58dd643fe43ae78d58a715c243e4002c1d0a2b73fc7084eb53651df12ffeb91fc9ebf41075497e86859a38179ec5fd889f3aeb0d25135b7ba10fe5ce190a2e58803588fee1d9a835b8cb3202cb82fe11d8a1ff9b79a49d5136390c11b1d3457f8a6a217d4028d30e988770d6fba6e24b86ccf3b97d9ae795e062c28d91d6e5b68569feaf35da420bb8ba7998624ebdb3750935d769a7bc8143fd08c6e6c9430ab555c1c1ca306e7b1258ae29daecc3c519944cfa90eb7178c5596864c96a8124956c0b269d74ed81e68c7d0714fb48728d4b21fe0ad038760fc8cd8e2a825b580fcea1924c0a0d51c81e7f0d7bc2f291451d6bb29ead37de3aebc865e18b9a5aac2a60f933ea311b48bf9560b092f5f5c4062e2e84e58aaffae8c2e4cab0905b570fdf7805389de8e52a3e3b1a9fc9a6e2340df9cfc649cc5a44c5decc49b59019600fbf8eb60fcfa173c6191ccc3698bedd27c6d420218f58a7a3980a374ec0ac2106da66b6e92d04d33dac7df5c493328a10d8a67b94dc2f92963833c997266a31973152d395211a1ffc6d7e7a31b7a81c3dd0fae5d8ad51e70ac414f34c8f61a8c4644d66989e09cada88b727f363272a2cb13460ca3873b0af563d121cd47a45186875285c29053558d0e7d8c6d8d06099612d916b1a20dc2b3f8bf195fde8c96e920ae29da3627dfdcc7157520498648e5731d209fd62d35c1ab1817154ba2079ee4fcdac52d94c79b7a5cf286edbbe78edaa98cbf6e9cf63c70d69fdead614306ebec4f444eaf28efdc795b30ebfedd173b47c4fd797088c685a285e4fd2d527ec0b7643a759f7edb6259f538f3243b480646ff7a21affe69e400a2630c98eda3169795c06949dd93b02e42711e1f9942cf98ade75033b52c2d4f6b70948fa4f6edb3a03799ff329b00c970712e37e375b81b74c1d5f42caa55ba795b61af98071ef1e49369b8dd4c782b6df587aebe2357bed20bd60f", "ac6363650051", 0, 1171371995, 1537743641, "d7aaac82ae0f720cbeaa76a9232bb640290e3298ccce7a5f67bd76dbcd91938e"], - ["030000807082c40303711c06d52af47ee3e47365db5a8e25697e5480115925c99a075bc3677833dbb30300000000db03b01e79d24ca136f8c0ca0bbbceb4a15a82a76884d0835fa659c980313003f12cea1e0000000009516300630052ac51ace7eb6b659d02581ac122a0b97b3d290adae5e65973890d4f9b7ce42185cf3391d466ccad000000000852526365536a5300ffffffff0306b90b000000000001ac6d9e070400000000016a111f30040000000006650052005363e80a1d78b8bb53070191e4b8040000000000000000000000004035b29d2690ffc74dea7a799d693de76e3db5f4cb35a36de930c157eaa195fcdb484d2f76d8d44695f661e0af8efeaf238c89a3435a85986ae70189d2675c0f6765581ae7856315b898c554a561283882f23f3c306f9e764e8d7ea7babb938f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005d695dfd751e1e7188c4b359d5d0e8113141e53fba4c910d5c761dfb43d724635d2f7f984e2d418584492fc4003602c2d827b848bdf57e9c3012cc2caae341043822583b2336a160a8769bcfd51ffbe47657e7c24d09b3856547893b0cf6ed75b5940a3a74206f83aec9bb3511448cd20c71d0cd70d1e22a110d456a894951760319b5cf81992602cad89ceba03ca2ddc89e218f518717ccfcbd0fbfa35167cb3f0328cb92bd5aa0b720d6137092e8a81c8e134cb234dd550049a4b9691f0e5a43380b031ff51781fbcaebe3a6f7653a6246ce36f0a2aac419ae9bae972338ea0b0c1b82d1da264ce33fd699778adb31e506a473e576ab51d9905390b7f6bad8c30fd803068e68fca5ce85fa21c0164ba34b3c1402f940a35fc15e0ea4dac78987cf256f0325b7332bfee580209b1b5b243563d9ca49075846286a06d67541f5625669d5ea030beddf2eeb8fea35ffe450e6dd176cca877917f16aef2e5bdb92b3269fa0be8d0208df136be13fcbac0fa66ca588a3ffcb72074690b89de6d36da9be9dfaf2a996022fcedd7efb21a1eda4b547b64f92ef6c02229033420ecd7550d55cbe0e3dee9f0609da1ea5aab272477e12d67ba2f1ec13b1a2d14f2a29adf9437d0b85ed6d500ba3c3f5c439b9d5e4f0d70ed8d838414d99a0956ad5f8f495521f39a063fa83a620d21cd5dd4325e4d614f69005b5aff74fa42a69e98e5a9b9c4f81390518dfc09abb9703f2ca3c6a9cdeaa700a9f013c6d85a8b2886750affcea41b995263a63057b3eb69c12693a2a1b250ec520d5f15406557d4d7e76b1b0e69f70d0c410bfeb1bf9bd95604610d86f6fd8dd96ba0fcad4b5cbc7456f19307d910e880614c248d8e7b001a71dca94f807ccc8aaeb10a3e367e448b5c1eeef6e4c96186187704cc7417b83947b450405addf8f5e6d0026257a2c3c7343e26fa66726231d3e476f467c8e8d78239da7861aeee4022608ebeb66bfa7147a1c37005fea0ce693518619a2c6209608f7365c415acbb8b5e5f50a86a27dcee42d81a37d44545177f3c73c0e71825e72e0aa5caf5a0e46ffeb95be457e5456248fb0ec11e2991584ae17945d484ba919261bf86361d360748cb50c6e3d290e9c51962aff4524bc66116b09204e220af413172c5bae60628d29c209d576b50896c45c90bc91aab956953c64e55f3aeb7cd6f252e052cf1c65a3661649561a8b35a078efb1a56c57862187a0c3cc0b5cf7413dd7f26a4c40e44c861f196063d33245502d8d0e594b1a8c5ee96888d6bf80fb4807ee1d41bc38726ddcf73f5796966cf6e24e18950d0751ffbe870ceb512ad867b6abf2054a269aaf8891c6a2cbbeb08f88d2c797e5ece5041c1a210afa170ab693bbcc57896acc016c3326d0af6ad4af9c89e039b485e0e480e70754d0bb56c232a27ee6ca37abe6505dfd799194a3b2df186e301d4933bc42e47d1de252956a58ab1457a2c9f0e4a22f1c24a9c6d5590db40148fb8bffb2cea7b9048b116bcedf1291cd5241d86e05a54a7d8896b34eb6976657c0e7c0a6a9958f660bbb96b8e5b90af74916c5edd8d61da8b58a934149495d77a5f05b88429fdbc221eb79d6726430e3969358d26c83d6436cab6574191f881b263ff74a3154eeb65ec125d510b03a5c98e192811bda3df0b9c89497af8a8abb47ed0bee950a706de35b7842c2524c7146bf8848282d34e2e88b165587a04cb367aac35cffc5a59d87676937120b227203826e0b493ba37359f0cdead3e2f92c8138799744746e9b89bba778fe44af5e6d597b2d3fcdac25468d4fe13ab7231131f44830f2306fcc2e73cd1f395af3fa415e5ee60ce89e90310bfb4069b315d6f0ad3da84d69af71e583e6610090ff98f5a4a8c4e00784d10843cabffad96644addc81ac19a3b72558e5273ec657a5348e782588966a1388f9575855babd41e7861e2e3ea6102a20c1ddf7d9396717a93af4056fca8fb15432f55896e61fad08200f7282ccf67ab6b05e483c89a45894da191d7a57f30737bb40211f34ac35cac8370418d7cb4416dfa37faf6f322292a9b6fca5907101ae16794299b2571da59bc3bb5bf47db10ee4ae1bb704cc3487963326c657ed5c708fde2c5ad992642233fc1cc0e21be29703da24b220d001ae651c9890d1092cc195901d7157f81e2f276f66313f0a529b576cb38974f0ffeb8d81d3e2443e6530e3838506e4c39c7c32c37e20b177271e25f0a1a3d1f212534b947ead501160e4adf49652a5905fb14b1332802804abd3db69cbcb216bb04aec6860b16ef3fd706998ca92c851575dfbdb26dffba6bf99d0764bba05cb9a3e82b4a141d70764443633676f047d2d5fbf3278003efa10171fcb407b04fc2906eb7af8804a9238eac5ce7976cf60e58e4ca2a49482af1833b3353dadee3897952358ce06", "ac5153006a526a", 0, 324722184, 0, "32a5b96a7cb1aa2bf42fd5b1a1b2b485948cf0582580dfcce1cfc4183056e02e"], - ["030000807082c4030318d330d36cb794b8223969ede87188a71be282adf3727f993fe941b4833a39430000000000171711af68724b9e2b8601cd57cc9ba9e69b93af4c4e5e9ddb52087ff06592ae06f370010300000003acac00f7cd34006ce648dbc053fdec9905ba6780c362a6ca2970f4a0fb937e5869367cd4e1fa2502000000075151acac6300525b2b1adf012f99df0500000000056351006500217d9a4872d0700b010774100500000000000000000000000070a7605dad432c295ab0563f737075b107e2bdce82ca16ea8004903b40b2c90b7e8777c697992ea9ff8e778d703bd3b584cc4baed3288bfca461b398238e724e98ad5749b8f951e6bf557a68fad288004a081cac57539a4c16f8df8d23f8958b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c7f381bc19cd93ceeb99d9784b69e636b8aa5f02e333ea72218b8752fbfc9e2c99444289bdf3db565c08a061e468a68e44728b9dacf5c41c5525ac1287c8dae2cf01c0f9dc29cbf96c22deaef1c5db3d152b1e1ce8be7b0035185f26a8b508e3dd8680aeef928a19b2ca73fbe5298c917e4de420218a8bb91e8d322ea4713560229fbc0eeb8624cfb1f34adb7d816149747f122ea29d44b85652cd28dda43fcb502217c4c838775656cb8c011214c973680109e2e532298ac02ca59d16b061a5c0a0b090a77f274aef328bb53cae0a1cab214d34a7ed859fa7402be38bdd9fdd0a60c133d88c96781de537633ab45dba9f5d668d11f9f1a5cc9c4472051d37e04f4a1020294c99ed40fb44e087e709ac26f900eba786754c5df91c876d789a79c923d22022ea34988a9ff19df6f73ddca78c26e6cc6d78f7fe62c04434ab73c5345c183ac030f1243d965c3af48ec5b117ae1a0c73bcc364ffc49e185a75c6308d79ba4159c02263b79c6e14ad20826ac8c074c27d0e177e5f30c5620cb691452f0f86e6f5b1602137a171040e617298c86c5af3013b2f22814b21c407617178ea08e8c0e37eb9a474b4c2bd6e9c0e65e1dc7473df26f03487f042242cf2a05b17099ef0680a33a5f546d3af4de571e528804d53642d94afa6b81f51e0a5745269a48009cd64ffd526d859d09a2c1d19130c16de11345b1f7a3089344c42cf00fecfa21a1c827e9a17fc70e79269b620a93d9e9b1647d1b7c3cd981c72cfc9bc3e5dd01e94bc308dd677f9f09a6e2633f6581f076522758addd5b1003873293c8007645beac758f50aee650123246eb140490bf2b76ab3b9d5dc47d0b4ab044e7f8d5d31d1a45f1fd9479c667cda81f340c1d4ce339bba6a463fcdc9cb019cc6fff4ca418c47ce59e206162cefab97ed51da494fac03114e8a2adc5b89c8b0d84fab3d74421fc496e98675bf43d039e5a1630ef9d46af7250a75a950a616be36015bde9fcf0fd87a9003a8934ce542066b5ea3ee69dea715ec66512455d1f641e0d9ff8a7d5bbe2eb1cb6c7294c0a528f1d614b40d284765eb39015184313f02137448365348239cd14d67d7efa15645dca4e18753086801198472a509d7da945d5443078cd7e21c77248d317fd4c6c279ea22e6b61d7a5174026fad82fa6f0e1094f5140997231cc89c2bd15130d80048560d584e70792b2f32e016628e31de524f517dee61fad16d5ecc762cf1e0a1cf51b74a0c940b0413dd7e4f9da770afc272749ea0b214779f9f87915d8f3ca053a5c2b4f307c03daa7811bd9ec9b8e48319feac4cd4726772ce0ae7d8bde4eed708100459e5c112f8d0c2410a5e7c24e9bca8eb723e9550042a40cf9be89d78b785ae9f2d682d4487bae4088cfb8b4e98ef0cab728c7fa890c214da2704674f9dd665abe8ce3369b13434f28404c5ddda6f3d95d508fd731d65aada2152854987e5aaf3a9e31387ad019d34da58f97517925c42554d9423a339c3724559be3ebe09e51dd9ce7a55ffb6bdfd98e8fcd00f0b7126a86c41bb505c056fcb9a9084178e8081257993b09c5dd40694c3ef3494097f3183ba4da7f538d9c715895bd6dce0a6f7af247a1ae1e8871e996944ab79a61a8cfb6145b85953f3b4eaf4b6e77754995a15fa98dfcdc4aaf6c2d2f52bc9560e70f943ad22834df96256adf5600d5cdadde0cab149a88583c2d2d4f9cfd561e87087bb5820153eb9e49d1515fabdf712a7dc0018ad4053050aef3c05070f7198aee421fb4f9f48fc15aefa9ed767d3d1968ce9716259a0dcccd8eab14be9ee5345fe42c000caf209f703c44925b06635a73838ddada8fb32837d0d6efa15d40a8fc385c169267447a8727e874703d0888f510598e07c6a138ffd4e534301c87b468480e6746affcd1914d2d7ef261ff02f42b7206b3278302cc654af61dd1cdc05e1f17c8719cb8594edd0bb692ef7fd1ef21a4a6d97c8335f87069e62e7ff28918e824308a46b5c1c8cf87d08879c782dbd5e2190f1b5f59aaba0ad02cfca4ea176da8f713036247fc1d5ed6e041083fd1ddc47235153ff17958a714451e56a61e25d3fa749361716c02e3aa053fe201b67682dad640c32f089f6642da071925b9c3a4c971fb54f526084fb6d8b93bebc59e41ec1e8f8731f6d41130d642335b289c3f4adc4c70f5bb18c3763620cf4278fb9fb9addd72bf1f7c1f4de92f75c36df67194bec0fbe471c1463975859856f129b2093ccd8241600d3205d2ff3ae2f461d71f6611ea71c884c996f3db6ac17b403df9c31cee1d9a0f83182dc446b4ae7c2175a3adf60d353e0239834ddba6c10117534477ef3e0cceeeadae3442d99c320889edc8bb9cf829ba88d25fcfcd8cf1ae246c4ee6652d02b88630e0037bb3abb16ad327f3c89b4b236830e14637ff1d5619e503", "51ac", 1, -971819882, 0, "53c1a8737b9e947711bf63e13e7f4c68169543b3da01ac21cf926caae387ef4d"], - ["5ac2e53702d28a3209dd8976060d8b5384b0760580e4fc9a2f97b2469eadb1500686407d3b03000000010036e087bed93e091fcf068a8029ea72fceefba89640ab281ef09e28e44a5bf0dd25f6a8870300000009636363536aacac6553ffffffff014efd3d010000000004ac6a516a834de58d030000000000000000bfe5f4000000000004dc5313b9215e639693b196d9a72786afef2e5d117748d5c9f9f8da0eb7cb5e8a5aad86ae81f671cd1d565c59b111e1e4c9c52686a4b4109290b9504586fadd40746078c671aaec0c652bde6f22c8af9635325a58b05e4868c302dd89ba6aee0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014013ebbd9908793cedfc8fa7254b1366e9a568fc1ba0056fa55417f3f8fd39e03cd87cdc0da6241d2c3558b2b6a2dc733414215b1e4bc6105a9287e50e11a6ad2f57ba0c2b4d0d707dcd566a365da2e15c6f350d88d3341266f7f6cdded15c88b2b60a8018949e1d9d38527e0dfa7990803bd5c47cc03f7f7ade40881e8b33502224ef3a87f1d1d998b9ccb4b8b4d667083d2395f70594978ebaaa828dac5473e0201f15124e2534d8c0283ce769994f491852128c66632d86f5caab7aedf9b03570a0745e59b368054ee527f8a46584bcaffba6b4858712b4b97f8c1b3df480ed9d727ed98379b3b79a2aaae8ad5c14f9db5293188c436d556707f14263cbfc3bd410324f642da112ca4c8e108712ee709c9c17891aed5d7e468f6ce307aecba1f5e97031fdfd96274920a5e34bba55e87bbb0225baa7448e2d8b3073c2aecdde1fabdda021313bd0d84825e8c8d4197905867c6ca19c8e3d22f57eff259859dd09bf13d1a0313e091016850b2da47311e4ff3c63ac1eea4879ec09e0703d28412a656844240020d860a1bf08b97521aa26572e41e6bd67122bfaec6f758ea407dcdb32bbaab895f335557e1f914d428c38ed821a4eb8303d90bffb7ea3fb1cf20368bf595278ee063c3941e9cb018c3072e310903e6144a81de62fe6d40f869606bfc5941a60cc5ab7fb4dd6215f451ce971c18d9ecdb6221a3f783c5b4955d8e8d4b1ae41176505f4eee1290e59136dc68fa3933db6aa71fcd1746d320b31502b1da329e7816e1561a953ac844c0633a606144ba525e586c4585326fa6b9c398a3d4e7335ffff333a894104752b609a379f15b6dbf40d76727db33888c9b591720fa2f1cf4fc1d3be08cf88cc65df02a17fd84c0cec4a0c6de22e7164b7c9a080c15ba7b01e5d1e125e507360951fee881268893a0d2241c62045decc2a08f8c440d6d84c403efc4853ccb5f4e2d3da20c700d46141d712c2b9063345cf514404c8c08859dbb98fa08ceb17cb235423b2b1782f0d8d5cf4d89528322d5a56112d2b565519fabcd914c30bbe5c5096ad676321fd3a5bbf0fe9d6aef9943e388716b149c52c613b2571a756be7f6c1f472168a2d4a59be495b24cb89c05eb67cba7edacf1fc7b0139bd8bb87ffcc343cd001f178fef6825c5628604feca0cb51a9ecf352e7276b2fcdd92848676e4b12c87403d23181e80ec9b971156705f5eab00f53dc611e8f0a88f530000a5866240c074701009963b90b645e871b18ac146eea1ec39651b1415bce059b08d81127311261f777aed4c284506eb42f8199a0595dc9688f1a289efbccc96460941a66a941289e1d4699e87395422ab71631d1e6bf3e8be1ca1787e222b80298c4d50e19ff658f134110322ea1ae21b56bf0b6a7040da4f3300420e16db414469374f85c385f5baea4e531b496a53f06c93b23caf5933b86672365efc546857fad58ed80f4ad087da2f319a5ac1bf992f419772727cfb2ba0c6529cd8638b348d6f938d1083f75dd47993926502ddd4786d6fe5e28f92260b90514b9c739ff7adcb0852fae28dcca2040124fcd31e0d826a928bb6069fd6ca22d7e84496c539e8e3407ac3adcd45631f6deb4fc736b123e9927a5c0ec211eb6f24000ad5ecda15fd1f28d0c82d86d5f1b56c0399150aa0e80d59b5a5602804d81b2f5885b0c0559beeeb26b019d10109900696898a09657d13967562e14fb0c62910589e68ee1e399d471299a006d93f0930020ff7168c05f7627ff22d7ec60561179ee80e0b9838b4ae665c379dfcd08d9bfd8e0377c44ba4e5f7ccf6c85d72a95c62c06b85f03353585f61e7d4a147c976a9013dcbaa55204e4ad2cb5733296737eed6ef41280097b78355e96bfc8325a82dd9894303138ce099a63e9c80b030f6b5826f99a433d59c07e1993a0c31b67689901a51b537b16817a20c905a1198d6a4b2a12b9c1346fa8ba2f72566f8aed5a5b41dfdbc185d45f5610dfa87de30139362318057716e3ce612ad8d3c10b128013d6a1315b4a7b5881f17f7a0c3b050f9cca7d38cd97bf0c7ffed7ae3eeafcb6d5d1b6f8e3f017201c6d940e5db932a6c7d3d3d83119c93f3a4774ddbc28e93bac6024cc076a9d12c8f39d007fc0dad73154f81b95a8177cbb2007c2ced647050dc8bea10deb955a94ae2a2bf971bf3d3ae7f0b10ca6c6da00013b996c7985d7d2a18e779f8c728e4d973c2d608730cd3fd4804bd1f53ff45c0ba5721fe71ab45dd3060e2335c441b931c949dd4a9e3d323f1a551c004c49061e778b01e31ce2000000000000000025bd090200000000929ebadef7b5df898e38f59a89e74bfae1ef2aeb90bd1378e67aa5433fb2ce482ac789e5555ee152b56201e24cbbeb9aeb5ecb600b2156020463333d90bfcb7aa96308ca14d92eb3523bf022a9bd78506a35208571bc44c593244312b915961d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000053943dd4d51fabe9c0d95566e3898ca98cabd53a32b19d0321f87db09f4c6c3f377dc5fd7781df5ba5e0602a4435c016ecd1eb77f76b91c5e006f491b16c5678335dfd0f60aa7f17e0ca0e480f307a316b55b77e5ba50bab3ced774737e9c3ac08340f16f3f2bd9706f4c6c6a3077f24cbb1ed278d9790d95b223781ccdbf47b032d5dc0283bab09418f1012be0267ddaef1bd0a5b51c61c6369f7d2373d21e6a5030c823f9d09cbaa3bb8dfd256b79602e458821e16ceffd51e1f882f96dea3e89a0b036ca36eaaf75f9071477acefa2b49d21cebec308fa9441b4bbb3018011b9c6d8659261fd788cc9d6b140be78d12ef6a2832566630b9d801e7e64ca26b706fea0205b4ed88c0673e6218578d97bc086e1d4fa9752a9a33a85c6880eff39d47665c0223946a78a0ad984c55e6407fb3c39fa6819e864afde854753f3513770e7881910300551e3bc7667afd8a03d928d3a498973209f5ab9a0e43ec85a9059d20debfc4021dde377ec56f1e15bf4615e54b68d6b01da30c84f026db525333db54a06e8f6b032e81c79dcf437d8a95310a04c25828c58be015704a374018edaccba05e8ccb07fd233e17b5e9f2695700927835ebb5106bf591363d6c029894e7123be0f1c530097aee7a1d85e99ff94cbfb3addba889efb4bb954527cc6fc3e2ccccfeceefc2e944fc9b4cb96e073cd2baefbe636fe848301236e0da72fdc46c690b1aa632de86d5687a799e8c35dff528c948d5d9258d896cb503dfbdfdb1f5db5b3dd1430818f69072911c183833523474182269b8102bdfcabdebbb6ef2748b25a2b2a0c4dc43e8ee5f7e5b51d142b3a34dfd57e1e33abaaed0135c9d5ecab6945ee4c61589452d635ed4cbdf823a6f49fcfcf82a01a828caafc9289c02b3a26e7bf9efda0301e8ec2d1df9025a32164c6c652af02b360c63c0756da3acb2d8d78f1b6b31bcd77457d32fe2984c8e95da347d96ad5ffbac0555d7a7dbbed7c4c2527d9b51feafb0d3d1e6630d52a0dbac068d043826585931397eb26777168116fef11b60a297ff2b3c878da5b3056f3b5bf9bb48e20c19f6b107bcc50bea9a7bb3b41e5ae926a3840636fa98b3b11095ca19b856ffe31ebdce9efc9f80757a8d4f94d9934cfceea643eecef0d48a82c5ee25948b17c13fba26a9a807c766aa385a6202e543a421d334a96d7d38f8073904dfb0712608fc9da75a075c5f86923136a602d7212c6cb80c944bce89c8012fd84be25d3b281b3c89668ceec1633c0465709177592fcd5df64a9bfcfc00ee539d5eb907b68acc8f026b55eb9d7a90c0d9399bcacc12c8b4dbc69c7f87e3fec8647ce97f28ea2d7d6fb4a497d2cfeb81f06a734050dbaf640bf4ca1bd4e404c4bbcdaaa85eac030f16a99308a8b064832abb812d4d078607949640e1613a8cc1cac5530e98e2d394d9c1ea6f2726d57945b0e7c7f636d117959e7417ee766faa693eaeaabfad04e0a0c0c55e840d13ad3b615614ddd965114d1b63b9f0d1af1a2e7e0fa7655b41471e427bf4bceb0a13aa98f7d8206dfa7c5dbfbb48491f55c965e78d08ebec7650dbe143d43cd3b1ca388267968c8d1a5697a24e9e99d9d3496e13975edb5a7aa4579afe9902bed3f859ad1c2f8baadb3edaad5b14fc64f9dcce7148b7dbc36c96f1cfb6ae4b7439532845058b4139e6baa3d54e06f833ca5481c9b514ab8ed7c45b2eeb3b8f2d70c3f6f2e7e484da2527d29e33e8f7531b7dfa06eb7cecab238e3c725320a4bb4462f1c9cb9d70aeadf89091a5bea78029facc0bf862a8f4351defc2ee4a8a0853152716cf589a5222c191d04195e7bc3a7eaa176c1a7f4b8af7bfaefaf5c6ac1d71a859431bb28b106878cc35ea901300f435708d9fdf9102dd3b1ef6c47d124b75d90035c57a0bdd4d57f2a61c8b74c0254a29f94b3c69ea9e7d2095dca13b6d24155e9a86bbe9cc0027fc328f55822e04e68af96406ff66610d3421c0c4cfa77828a75f87a41fdaddeee9fbae27d6fe343d2128579369b31f6202c313d941576d27b26fb1186a5574a71a918f19b04ea07408393edf287d8ad1cac74aaeb536beafeed3926c67ed7d10afa4ac70c7d93256529ade6b6674e9eee52b6b36868e16a14e0a6d046f22fac7eab037e196ee5d3c2b34c20aed79a407712588a02de12f3382e1a34856b5673fc5ed3ff846d108d0ab907f78de67bd52a37cacb4d11624cf21918545fa8a4cd90a9459dadc7d0d9dea1dc0bcb9ebbbf7f90a66f3338de2d36d5bf966043b5f3a6dd30742ced07d71db9b3d86c800000000000000009f87d30000000000cb9ec26f233bca790bb2602bfb1f21cb3d3ee7d48b8f946bb2987ed18e1b8135b4cef8174f56077dbea9ba91d7bf0d76be4637c44a69ccbe01ad97dbf8271b6ae87f46d1e2bf3161c044df0ef274a30fe001767a32bfca98dd8fe9ca7c1548520000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f589730de927fd0ac1035d1fc3a24b054d5f4d042ef64f5075577f696b066c90ee9ab1bfaae981f7f89886dbd758ff7a348dd4686755a2d997fe47a53e6ea69b8c6e2f915ec47c04c77d2b8eab3447be1b80e13def9e8d9b6a841d627f32013521c3e4e6b924b37966e90fb0021acba8f6df38ff5fc2807fc791fe7ac320500203497b13491ca628bf114a6efb2af67da28993585b5e1282931bbacd5073cdc90204a295f9f43ea99aba7f06d5b72adaab6f8a4c14206e8b9e50668fefb1f2e6630b0020d4876c55e62f8f60614d8308e3cb9c7a518d97f1cad83feec4fc4b6bc17d1992c47c3cb2b799c5b290e783975da04aa69df7139a0e6782305666db1ee34e0210cf32e88c7803b2192e7194c79f665cf4b753489e44f29aefae4d31ddc34664032e28aadbbdbf5a460391e8c0c8853aae2fa39cba3c1fd33b682148b1b74e08430307a07d16a147be497a4095d3e44783e4855e55133cbe676700f662dbf741186e032f1fa4649574125a9d8ae4d0fcf1b1564193b72ca105e4abffcd38761a8465d702142bc273ef98a7a93346f552cda7a92b3d68306e09a6df7281b0d3def699bcbebf085a59c553c47910df4cc0d6b8f669f445ed94d19ac4a986efb2d78079de308d1202aaa378a78e75399be9838a25a3c7725e12b485701e8ca06bb0ee350f901a59c6cd995364841b1d43ca1a1f3ce82a3b6c31f0d716d11d96829f64f4e27803213b252188dfe263b6db419b22418fa96b54a5897df429b67875102d40a82d78439b59930bf64ac43aba0bfd28d86a26abe965c6170ed16d8ae31e3ac84b975583421fddc66706ca1834f3ebfca486eb32b43b62afa5c35f0d28c755e972bf82a1a23647646784890342a99f763d42faa65fa9b38584aa06ef934dd7c2ca67f472b7f32d6c983facfc6c8d581aea74510aa0517e84a935bb1c081aeecdba20d8c5b05b6c05621b0e19c70830d52595af448063fd87d0d102dbf2ad6140eaef0a3b676ab235936f076a55ab851ff261bec5bff3ad991f751353cb40f2d110ea90f6ac11a3eb27f15fab8d44df670c11cbdf37c50198048fa18ab714ec3f94383901a81dbb36c0ed731a55eb37ea2e90cdd553b43f07b740891f6c69ab004f7ec83061c2595ea04fa1bf1ba36be6a059ec8c9ca0ed54ec367c125daa77984115665e7c1ba49f60cc5b9fb48f3028815066677de1e278eaec772cc3ce63e329e42405de91370ed73f0fbd3388e60a9bb7448d32f5538ac1e5ddc75bdfebd9eb67e0e778951b84b8d080d52b45dccbe86542ff8a66e61bbc268f1a3f871bb178c6f64bc9b5550f8d3c45c686bfedf524383535cc4c090d373f67daffea3bd69e76be993bad5f9ac4b8ade460a7ea3b5f74aa177b56e2989d31fa15156940c5b61feddb9299f1210cb87841496bef25ad89cd7a842849cf8b5ee847642ea8ace62842c879a241d6331a241a53560732b9d9fd2b29c69edbae35c8c5552c16204bd9de6e8b3e0c28f37fa590020567a874f2903be920979d90f459785f8a9dba30cc5dec47df61cfad5f44640aec4dada08c520774664efecbbe0facbee0e1b00d607ff07adf9f8272a603b5b197a018262e48f28533e588fd7ceba7482a6c79f974e1d06a789fa4c70cd3dc066b6018d28ba2972998e2ac8dd7db790c6ccb4b80a310fc87f24a50c661d836500943e3b908a3a127fd0db38c251357d2f2e8c24717116f753a58abcc75ef73238cbf6a9d535d53bfd3af9fbbdff19e78b66b1dab8880d7fb69116d8d62a3862df110b5a3d29b3df61e19606557c3446e237cc2941b4d60744d381d272110a4e3cf9b3fe27d1975b214d98166bcebe580475aabb3557d385a037386a3a80fb511fd5851ea0362952a2f8b7bd61ce9766b8d49e136c5f0fbbfe0504438a368e697008ce3fd014b0c881c662e8aa3f97182a48b7a25c759ac02c779a0acf9e16a8a4d7e3dc48121a66de57cfefd3868ead1e922ea766ddf6c8285bb515135ef7ba183776d0d6600901fe451421932bfbc89eb7a8a7f5363d8e6f9b10e4b228e030e864d0da74b2ec3b6e91727ce97d77a6c2880410391f5c75c1fc90b409f45a5cee5ed11969519cc451c551e92e90b77578ef9ec5e0ce2e61b14925266e168c95cb9b41b0405766fc8018fe49ebeeeaaa3bd5209891785249773ba9b669bc2b9d848fd0894016d5ffbc55472a59fbb195e9b1f0b134d1a7026bc1f5e70b00a67ec9d66549fd777fcdb13a2a6d051153b35dd2cd28694770656b4d95e5dc90c14918baa6ac94fb774f555472367fba306baa0677eeab4420df40bb0b13a8c23c9a2ba7d4136edbb743ba022954a85dfc657b43682d3a85903b9f6a596061689f317226cc3d2e6b7e7506cccefb13d5d547a317d04a4e65bdc720071c18a88abd63d1101088cc5df00", "526352", 1, -1643598176, 0, "a9f7ecb68db1e92d9ebb82ce31a5639867269ed3ca095eab7abfa3775dde0e9e"], - ["030000807082c40302e7396043082fb6ca97d730c932ca2c4011769751fdd3d3e26280e24700a63c820300000004ac6552ac5995e6e284d0dcc787e24aff61c32d2351fad1a5eb4fe74383a6e338ce4964fb1c6ae6f10300000002006a4073971a017b6641030000000002526a000000009a3a04ec00", "655253", 0, -1871778050, 1537743641, "50c34360c2b4f3e7ddb2ef2e3c0f0c9bf921493c3d7d71ce4f3b810c09eabc98"], - ["030000807082c40302c9c7004d9ca3d1f13959ee07909a5a1d821b38f4de86912ef3ec2f3519342a5302000000025352ffffffff7a4f76b875acc064f9fe98dc160fc2a7d67af94ebcdf65076d1021c322057fd1020000000165ffffffff01de0c2403000000000363006a0000000095faf090010000000000000000bf996b01000000002d560e9dee93422f1e41a1570b8c0b45daa6935fb47e88fe5d11e77841a17f7801e7f21ff38c0a1d6da7797930fb2a30fc875c6345c036197588094a7a3692634d0eeb93786ef15520e973fcb478af2b26b7ae5fd5ae04bcf20762e9ed2c76a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a87c674a50ba9af588ac63408d77ad23a5623b299eabf89238eae8c46c09e5a5d1b8de1ff70db0a998cb53a816aa3d0d6dd7dc566afa659c4a135e1af880004d1cdaf0ae503da464c577a7a9e13cc0991046f62ff0ed4f1bc9dd2c512dac0a6eb66a9303e352a5b3f90d7c7766a74ba55238008eb90624eb2c5fe65e0896f627022b5fab8b40e23a46efc877859e5a3f31c9fa68b805ebfcbcaaabbd34fc22228a0222b4cdcc28497bebe453e458e478c7fee7088e3c8fdc32e2677e80bfd79b754a0b015225af6fd2bff7846779277a8295979e886b5b5b6d8b6b5a1c9160582eb9a4a598fa4013fb6c8cc7a718a115c371ce419d3242ee3b10806f6cb02de577bf66022ead331a9d98dbbecb7679576127b71b36c0af22bd1eb734eb26f766d7c7816d0309cb89ef700fe3daffc277950e657b5fdbf7e89b4637b8bae4f2ba8378e8702c02151bfbca1e30ae1871044a972cb587b84d2827dd7f6d94ad390d601f0f18514b032ed82504fd9e693edd838fe8f8f43fee1eeaba9df07c30afceaef4b266cdd118020b31d6f572c28510e0705933d45c180bcdc3a024ac11ea39e635383d5755f8289768dd6ecedff332a063d2e5a5ef7d336b17b111ac19fae9dddaf1c814e1dc4e3d172a226d037a8b2bc178518b9f34a0e4c211f76949b9011dbcbd266c328d2b7502d67a7f810f1c54ba1c0d82180d47c851484621481ec8054ffd9050001e9522d281206522742491b67d351dad021e7759e9912f205eb213a6f562ffbe093f7062d1964aea6edcdc0439888d90a6b3ef5b581ed294124e4ea6e0b88b26a802cc2d8131f31f94f06f299dc7eda634af650e9948b8e68f62f7c3c1111b6c2456a2c4938612d25e7f74b85a13226e19ee61e8d24ec931cc88ad487571f6a6248d23f5e8e01087f9cfc6cb77679a0780c35c1b752b1ce5f2bb6986726a570b95aedf3a2f5408165b7694d31ac999bc466481b41ae2d82bdfaed7651eb83532e9052d9b368ed8601cc385f634667b2a8c3f6cab10d83ffab81ad2ddcaef2b18fa214907ef77a3c93c568bc8faa8cba6e04eaa1e57d39e292aeb29602901a293f1e04669b33bd6386e922b1993811539fab637645295d0b3cf535fb0170ba418a319a784f2f9739c349cccf8a274ef828f97c58b794c1d457904eb8825f5c5213d6ed2abdf2a4f7513776baf29f7b6e2212cf7b0307f08cfb094bb15d6fc864577664130b2b6a54534aae5ecf25127a6450ddbb4285370e440c391896f174fd68e1388c7908b676c41335ae2e68e79cacfbc64f2395cdfd7a30034015239ed5127dedc3fbd0c9e36c0724367d7c630463c2a4ba10bc7a76e1970e814918e6b2d55acb9d2d17c59829a635cdd60b7fc73bb03162dff33d4ac819d7d8726f4cd66ee7082fc25261ec141d5162fd6aa26f450b95a289017108b41ceb6f090b92926b3a91331dccb0deae47fcd246871f1c809f1da6053ed3426da65e5149a62159c8699c333e0049e3b337e8fd7b1399442ae7789950f0124cdfb3e324fe24245686425148d867f032cc027124546c6ba3c88e94040cd2ea3d39b6b1e7c252622601235f3207c5af089bcaa94041cb7a90cb3ab1f99b954c94f7a57d48ee1ca82d619df662545cdcd79613f55ff3ffcf8ef84386305ad420915f6e41b764d5406f67ecf506fc9e60b02b415540de1f772c9220670f68d9dcf28665cb4dd995ecb4c6a8ec2c28f55dd45d88e14ee21125e1813b9bf5f90721f15503e9cb439734a575609a915ce7dce0c9e626f7e51ae854ad209d6785ec5bbf1c9c2853dde7fd3306c7dfe0f1520298ca7d5d7c6f190c703041dd47789dae495877398e61bc8f832fc19a36fb57763f7d6da75542103f0ff68c09130d3d66c74e0379ba55804fac69ffd8cc48a3a30a62c4d705ea8c9f458a25f41e14d31bc03697e3a405f073173099e0d2fc20789a15a85970347cc230b23eb915ded39ecef3bd21c7bed7ff4b0941959ff49d5c98f612204e5b7f2ba9e9def1972778aaf8c82b97404080536bb96d752c0668ac5ab8d1da36505398f90392419317471ff8801ff7254ea86ff9615d2d0a91cda5176ed6e8549dafc3556d5099c8af67cd8c9d3e0feb9f0b00085d64fbd4005abb790ccdf6614a9b7343b6cf7a727353639b87f068472211a5f7fee877a819b5bbd7049d417b77780092f1900af72a2b79e7536309356bccc6a172bb259b4fc7799c86c0dd3af8dcdd3697a845f1ff778c5c0d6a9d7064dad3ff04f270f0825b5ea932be9d8fd98c7f7e89984ceb8aac82422ca8483f7005a7e7e79f9d6e2c1a381501d0afc01643fac92de38a6d4f462d1666bbe5187b978c8fd200d08e3f91304f5ae798afea815bfb16e2e733b6eadd23646e7fc328f6aea18825762d71e6327a4202d523b4e0396adc225fd0a", "ac5253", 0, -1831914951, 0, "470cfd066b36a8127041ed9a881a3959f9f3390b0909a93183b4799eb3853549"], - ["ce28f02004c58cd66bfcd746d9979e3b0588eca2d0558ca7d4e99815d78bf3856b79a719f203000000046352ac526bbd602fc47fb08ffd829355ac256d3cfdc5a218a2fcdb1e09ba8829cbb64fb0facf1aec01000000075253ac006a6551ffffffffde51d3ea6d27bd292d388892023758dc0ad4f1f8593a0ab451e4ca5d10fe4ce80300000001acffffffffcba70ff047b6ded75f75de18a2897ca2346abbe189e8fdf9d34986fe750cb6760100000000eca290670145e430000000000008ac526a00656a006a0000000000", "6363acac656aac52", 3, -1719650179, 0, "c1cfd587f09c948befcc12e751756c36687cb92a9bb7a0480ef48f44c01c5c9e"], - ["9ac2402a03379f0d0425effe1962c483b2098181b82dd0661276e0bf880023949c3a9849f70000000009535263536565515252ffffffff2f3594ea95edd8a9a3c7560e279dcb2d5821f3637d7001aa00cb3aacd4a9015903000000055263636a53ffffffff43b3d5d810763d34abcee607288f8e339105d1fdd3e378ecba78a3764e7a764a030000000600656a6a5163712b3c41045fd0000400000000005350e402000000000665acac6aac53dfe9af0400000000056353630053882c050500000000035100520000000000", "51", 2, -1792614044, 1537743641, "75d384e787d8a0e3dfb04062d30bc1b5a69ef8f6498a48d7be9e1eadf60613a2"], - ["b1aa5548034a3ad3f2e75b61eb5c91157f25e16e57c23e0d0d2e758f07741cb57b618f473f0000000009516a52ac6a63acac51f39e5933e60c4c93bed669c7c465c26a0551caa487fabe8ee290d1a224fe68fcdd72733c03000000056552515151ffffffff2b93c8975d0332c2f8ca2cca9bd716e59bda8274e7591a2b6c6e4c922c798f1402000000026353e6a4eeaf027f15ef000000000002acac95a8a50000000000095300636300ac00006a8a27a3f90100000000000000009c7b0a0200000000c697c6eea1209148622043aafd7b4d130c9bcea3f376f0a113a782edf93802a34ee9836b5b2b640d771fe5cf42d7ec69c7849ef458b50e8e224eac18d1dec84013fc63f3d2f7826b4707553981dcee6e153a57174f205a5851d540629f27cc2a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000161b8ee0af18257ff523923c7a2448db3a788bf99c3a680487072dae1939a877d4619d4d3ed214b9f7ad67a8e6a5eb300841c4b85d739f12a5f8db2a77186ee42158e78d7feae382fe274f64beb5f66d105f1dd85ab7e0fa172c2b8c53e531a650fe90c12e1e6964b1d507a230964a2501016fc05eb0aff837d941d0f24969750306a6bd47300ecd20e29f90afe36ede2e7687b9d62da97cbc6bdc4ef200d4dfd1030773d580d219558a915449489e90b979ab3e337f286b817e597312dc2a82413f0b0636bac1f17ea4f78409f2051140a482d42285049c5b8a407e25a5c6b7bd505fcd94dd026de6373ffc7a9192b7015ea6d6e20240110756e9af95a750d9664e73030165556c043192b68d3de04924777a9b0e44e869007bf8d3138ffbe734c8206f031cd4184e8e029df7a37937ef1a7f5875f74a93f62220ed9d9bde775c1473ced20226b94ccaa5bfc570b386a91886894e8d6eab8458cca3ca762c6454d97fd26e40032a65fb08415e4ea75dc3de17e5f5c724e6e85c33401c503c6d994d8c307e1974030e2b6b2b58da8ce117d60a2f34f8edad4cd41ca4cde4c4bcaf521a99c7b29bfd7102fdcdbe83d2786d39f535961804d7d6bc8afc8d126a4548d6ad5b21786265afc5f4f09d309e6b1a37ae81c5449c825bdfa83df4f60638ba196895d958400b1e802e3ab9dfd219cbdedff44b387a69e17314eea8d3f693c224edb3ba2db401654655182b455f39c7f586712f9abee6ac939142c5bd0308995a6515490bcd8a9761d46b7a76e53d40d26c5f1cd396b4ab441786988415bb9048f7ae78e5cb4ca81e484b252ec2bae9bf88791816674a45a5d343f697bc7f5f0b75d73d3ef4d8b6cc7f86552d7df11628ff78a5ba9497fecb3d384b67e0bc23672795e6cec2c24821ebf2d0fb1c78a69599322b2f212789212665df10291044f4f7c5c83e07c2dae7973b375e78c38ffdb71f4174f360d85533b943e69468e857f811ce3278bd60f5d26b37c5fd6e35ba23dbe862e5ffc8b53b26b3d8e4a37792d8a4aeb247215a57801312a285121aa09292ddda4a29874a78104ec630ca7b2d5ecd1811df1f6da70cf97d793103b1d832cd9590cf8d0442d87615d121db1c86203fe5d890ce7571bc5ebacac640d627fdfe56431147345c892b4d6c403668c542ca3b0264845f7c5ef1f791b01a0737f3243c28a3a8ab9f56f91ca7bd10357e21d3b235474450db60f54675b5a31915f3947982473196fafa5cd3fd032f8e3b8e722ef004a57e9fae5c114bd1f5ab920e0a664f70b8849017dbe51dd63c73d15fce7456fda3e097f8bb3143cefd2a962bd94a2df54a633b262d8ed424e1894923e876a681a3b379a2004495c09da0ea68cef82c555133c4afd0f655eb8c9cfd3eabbce528ebc6ff29012b62c76531c7192e009431fcb0867efb85a2d3eca80d94520fc56918491d221b400b476e8fb71b8bf1bb057f22fdbeb6be32dd21b637d8b49e6b5bc2ad37696f30b510b8cc18805a7080902bebd619d1f4be374968740295fad0304f814f280c59c64eb8c01296f1fd4eaf81c99338da20ab56257ed3a6b06bfe623643e32e9be674ce5ab8c5f6bc5d9565ee0f99a20d1229ed04a9194d5b4e0c20e4aa0c6f2b31d54932184438951f6ae2c75f0a869f33572092b941ccfdf92320b98c1a3618c1f8bbb816aade9e9601cac9364613ec0ee63e370f7c6e4e6d90523faf6bb397cb8e155d7e44c42bff1ca1115191366d2404f25b77c0b82ad224ec8245b05d6c3faaa08bd821d68f068e57f5ceed303d164300fef044513a1a2447ea72585506cc594d3b68ac4e2e52e591cf2ddf8533760f98e65181fa61e8400755bb2f7cb4da8f3d7102080ee861d61138113f129488f49df8c68a468edec45b1daefe5533612a9598a74aadd9640914d12c883bd911d7c4330eea255be2c9f51356469ce7513e865fd87f709d406c304c0efa324b07721bdf773856695219171724a6e64b58b7de141a3f43d0b48ef2e5cdc7a71885c440d7b59d425f269078888df7c793a8cb496f67c3aa9a988627586990c5854e151f67eae8e57fe55576e548130d7ee70474842224bbad0543f92d98801a8e90224de60a37754418ff4573ea0d3486c75742c487b882e5fb69c7ec3c86cd89a58ca0cb34e4bc382b921d251e8674e863489dffe7bcd711e08ea5717886bf0680c25d2a6748770a8ebebb0bea710610ef4561ee98f46ff7ffaf75ea122c5d281a582b44fd4d0168066c5f26ea3c50a2335a282b9e48ee4fa8b8fdb8dd48869bd7af63384612c4d72e028f33063c02c63f49b3e9051655ad7721d5a4780c100dc1fe5eaa883931ada12979f2a2dd4a03a76037acf72f076a7c943178c6bba86b9c88fd51b0b5ea81c9edcdd002df6984157cf125e0431d1dbda54be1b205", "535252516553006a52", 0, -1050771990, 0, "d19e17d6c3b1d14bd5c56c303b7aee2d467e9db794c0f9f1a9352bc7dab6f7f2"], - ["0d2c7b4f029da2a466f6816c4e2f51073b89d07cfb6975a23edd420cb34c27e2856164003103000000026a53ffffffff0acf5ea13fc3a14e424f62211076803a8396958085952aedc2c6451e6093a72101000000015358eb8133045a901b0200000000020051b596a105000000000363535113482303000000000865ac510000656aaca456f504000000000453ac00ac00000000010000000000000000a6b869020000000043b6c3152c35fad208d91566316a5f082fc34e74360ef55ec32d7f752d12936150aa496e7f2f3940a91761202287146852535778794078431982bc73127f53564c1a0018da7416e4e7a8b669c874b0fa64588734ad1cfa06578e3c84bdcef0ed000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a17ecab9cc3f61a5ba4afdd163ad39aedb204823bd807985e1128a21a13434673ad542ad88d7a2c1679a947e036f07895126a8b38406db5930274d8faf02c2b583f4678aedc8e16a79a7aa8a281ea3548b489f1a4c6198108b776a449cc05ea639de19d91fde1f3a6d1e30536d35b395ccafff88c57d2f0aab2852929c69d2b0312339c8bd5adfb74381a8097a972a37bc35af58606d30aa0c0b48374843bb4b7021378821fe603413ef8cde03368c1f4e1be0b843aedb7986f47c57912aea0b50e0a028970053c6eeb3ac95270578760560061fb246e8951c9760d508a99672bc37ce1f20d889486398dc4ecb9967397c7e7b301aae38b5f7956bb6ae580f826bdef0313d22bf260cdedff42848513100adf40acbf713ef079a5b5e7692c2fdb9340b1031746486059f1280ea5d72f51e2030f61a8b61e0620d57f3ba1a6269338f132720324f3ff7c5efb81ba6ffc4b21aeb5845de844b3548242acd1917bb3b34b8c63720213d6ed6f0142dc181c300a3aee47375669807b4f1a647f16fa988c55dcab7c5d0218a89addbf4337178d676a3c6e62a6116aa57dbc8a7cd71233a597f434b01432fabbf353c62e8384e09b6bd15a17e96cd4b859fa46f683cd5a7220005610544d46ab8d8dd5dda07131e418c86adac5bb6c1d2db095b65c2f7ad78bcbe6e84d41f900114172b5063cd2683bab4ffa0beab7ccf626db67360b43bc1bc92dd932be35cd5d31717698a290b80fc1fdb9f76c863a0893e0e90286434e48fc10506053fd29b15d4b773e1fba8e336af610277034fe6c6bf07b91638bafe74ccb9fbfb488b1d946c095eafc0333bd14fdb4746a56914ed162d7e4d7da7a72606e8647f1565bb8b82e0e806295eb735b15a3a657be1f8d890406aa32b48b909ff663e9847fd8689a0231ffcf6f0dd85f2f2b2ebce8f6c5501ff109aa9b9ebba4598d9603ca4cdde5a08f0a3fb1d69460887eb5191c85c87afb630bbfbc6239ce54076c5b5193071f808b10c5b436f4112880a5bff0fd2569f6fb59d5b1b59e18b72d45ff78ba6aeb6d494d2a593f3ab8210225ccae9c168652527ab9507c202e082fd8f1e6e3008d8019ab66822e9dcf9973ded490ebcfa1e80ec99b47b7d95bfc2df551c173484909fe3aadc1edd00ee72189a71ceb52bb3dd1df054a69ac23d0b72b32e46796e383e0cd5b68642324b82301704be4ae3b3180442e7c98842c39e1ec9a3cb245c5cbcad592b988c67807d5820b08ce9f1f1834643b2a80716908ae972cbcdf5872178d856b577885ac43e728b40e7fc17fc0b50147ac13fa9feacf9379bc91ec30c2e18102440d664630288318c82d4e4cbc6da864afacd9309f0a75778f3ce97b825101d589ff4bf1ac192f3d9936ddf3fdc2ad12922f88d46260319ce5375ece0b3d0c926e88b4b414cd4022307e35cfbefef67f695a09df5ac5904ed5e4c6b15b828aa62c53b03660a569da45d5f2b7e536ce4f4cd793a19e47f677a59b428e8f3b920b21a290da8e4444c94e2158407bf8210fbea2f0099c9b5516665986f1d75929d781e150cd3a15185919e7dbdd71bcd5f450bb668b995aecdf26a0cf0e2fae4f0005f4f2fe27371ff633cd339f94547211b300436cd597f1be511eb557b800cff1187528ebdbcbe20dafd434d26adbc3dbd7c23a99e644c8cc817eef64048293847531c211446a351736256686e341e515d65ce5b3e114579620e8cadf19391da7394627033b9df98f92192371339a6a3ba7c3b0431602314eaed0974385e28ddbf058b391346d85c8bd6f24c7c54b7040da9fa3d0661a4c97dbbdbfa5f0394d8e54b84833c87397a2c6027d40e4a3ea9a155a9acc379f71efc7e9f3c9fce94f0bf0dfdfdf6524e90ae2be7823e13ae7ce0e6d2d66ef498482697cc0911797d2159189dbb78a8464066d5eaeb1f4664b406e1b70dc14ec6124e6a320b42ae864ae5f6b8a8f714acf45f4d4a982ff59fa2f4cf2dfe649989bcc75f754a35b928daadaa36871d03db3fd66f05be762e69599b256f435f298e8ff0f89f7c576946264376fc8fb55f6292dc6f90b0fc85dd46fec0f423f2c3ba08b2d72b91e270247232520cce9f25c9de01f9c97e7780001aee1e6350ff4f5e255f5fa18a63467252c0de1138f91ac50697a3be7cccd36e0b3109fea91210fa3a12bb8737f8c3a2ec4b353846a4b2764ee9859a23430319f131505b7f6c47c86e89b3ee5c764ce2208b393cf9e57394e292632cb149b8a269b117142fa8ed233de5a90fa0cf56d15f26faa9a7247a057c134ee85d0b30fbd7a15c94db2d958864f5f7858428601b5a82ffa38d7b1375a9d6fa91aebb9a45b48020f7d798aeb07ee816c0dfb633c109c7dfe9ba6b6c361ca8edc36c675db950c6b50bc32c5664de28ba4efa608d77fdc532cba69cd0ae0360404", "ac0063516a53ac", 0, -662221973, 0, "a19dec6a34a21c8177c4a579500ce0a3eca2e80e87d6de7af40596998c28181b"], - ["030000807082c403021a13aeee00556f3a0382057518300f1b820f89c2adadb1b4bf3cc17a7fcca942020000000300006affffffff2f6346ea4747a7e254c5e132a480ee4f52a91be0bf2ec1761d28f9726e074d750200000009635252ac65ac00ac63ffffffff0264c97d000000000006ac00510053acfdcb47040000000003516a63000000006dbff67200", "6a51005252", 1, 161192067, 0, "103a372736b00426bff1f5e0b131ebca28f0f006563d4c42aa4c118dda60fa28"], - ["030000807082c40303385dd1276cc3e1dc21bb7b916cacd9e1821c0700101b78442523a2959d7c96c30200000005ac65515352bc941637a3a5226be300b90acef742fceda9fe6715104796a9256f97f1a85a09512a8e03010000000753526a6aac6363ffffffffb4da5183642f05463116ecbd3a28938b08f407ff976a78a582bb1499fc68f8aa02000000015180e1fa5d01f7903b05000000000700515265005153fdd37f05243f226603000000000000000066df940200000000c862ae3311e753ec546ca7ee9f8433ff157d69406879427eaca94d630684edec1cdb093df91a9ecc0c0e3b6b7168e25e3ecfd994b2031ce3c1408368589a8f5dd8157ac328bcb4f6df07fc647787a2ad4f6d87c747242a12d526d4c62d92abfb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7de715298ec4b52a48cca13eb6f5ea1cc653b867b32ee06e9b69205efd8c9a3466e7d1959b490d42875ce31985813c95288191fe3d4993a7452cd89f2461962c03567d25366193eba8b009338142ad01af99d216925d1579a9635746f840be6baf14fb59145aed7291924f35276e2263d29e76f81b06c242ae94899b73a64c003174d0ab7dc33b3322b01ad3cfc60138d93e8b95c6f1d5836fc971967ca77271802165132faf274999eafa339f87284bc81bd85be5d970113783e29b1824e995ff60b0713a019c1a1f05a34f7bd389666de87a12bdefd77cabe022c0c6955ff4336a14d2644714a05265ba703ba3cbf087e3d3442fab2c6a84ba3dacdb350447cd846031a67f352fffc0ff5cd561ecc313e6464645d633a18c3d148aca1e950fcef29e70327e102761a501eeb80b4d781cf152c27c2bf58f524280c63a8058d5689895a6502106ec72a24c12b626550b504576d352fb4d54deb7e4cac626aa3a8dd0b36ab5f0318834c7cb79d8a851bb62650b6310e18788df808c8a7f192dd3d6a7c3d85509d02003eac82e384480866a84f49f133ee6777aad574d7a048f17597baa06c1646ff7a60c5c4cb3e7493c22a4999376f2ac4af122fe14256070d580c70e66a629e1f89015a6c6d684e152cbf65c20ffec5767ff254c166d9b7c7cb48dd8101ceeac04dbba3f73745975228479dec23eb5c2d3b8f108784c13bb797e917b7040708d406d27fbce53f151026a8a6fb08dd73fa14618f9af3973ac7c86b7e9deffe1ef2c2e279ec525e528647088b0056ec13e3370ad6703cb7ab2c46a9bdd8f5361bff7a6d7856e0a002425464c7ef1605c144669a0b316813dee7c6c524adb61272127ee8a3636ef075dfceca0b90f7726fd1bc6180e900e84984207ee68ee0522d7ceac39f5250652e4bebee1c72dc1ce5323a5f9c2aa280cf211addcea1d2e9f4fac7d693423a8a512a1890f0fec1b676ee45d9a6e3f11bde63ca2b85992d723b50ce63b80cc0bef8eac57d3d32f7097cccb98d4beb8158c76427f19d0e927b8287985c8c800bc2cf378124eec9af8c4c164dc48f4f18a8975cfa0596fe75e1749fdd4d6be3ebc495912df2dd47a9e04dcf941b9a67fd1686ba4729acb3f78a6eb2cb7b90514224caa613aebdf8a58600cfc682181fc0713cc7ac1a658a182a370d3311f74d05d815227afac9a3e8f0c26c5f4a6177b0f1edc26a0f614260eccd8cc4c237036d260035ee0a3bcbc2739b367f3f1f68a852752ba86769891aa3fa25932aa8d3a82dae15c5e119949f3fd8da9d068eb66a5c16f3254fa9743c16707f26c70919a6a7b82553f9340b03c1fa3a237c2395c6333e98aa4115619cf0a6824d8221e9d2e2719b16570003c81612d10c626a5dc0219e610de20078b2dc18f5f2294002ea032f0e01e2ee58e9839fa92cc99c70d10139ceb05037b054144de0241dd80811f1c32a84f1b9ed174dfe21e98afb557212c50e5463e1cc02b70bd558cbf0ed8f0a4f2ae03fc4a6f7e834ad5210175fbe6a164616b6eb3f69d7fc1e1029ab72bfe430b791b91668321a9c32adf674ac81edac479a693cb58195c9190686b1d3450c633abb20aa181b794679976f63495ac0258f1acb9aac63f797ec84527c05fa598411e66acc21af2f61e3c81cd9a64627b2ac6eac7d592f0498ae95f6204e310deb5c6a3bb0df4c8af78c0382a1eb34cde8d81d714974b6e6a4b120497736c4f87d0728964a5488cee820608c2ddfa5be6e7b36d3f46110d439f8ef0c1337728e98d1a0437ca3c190d48ae43cc45443879fbd6130147a5c46aa6587aaf132a35c9012b26bc83d2ba1fd1174d7a60e4634a451385cc9f6c428834f595a6afb0c2f7efa1b65c2561cf8881df07602769eacae853e640a30bc7a3b59022328c2ace2c6f753a3230ed58e80decd503439215b9d8a0d5fb0bb80a7a820a180317939437672f35a04c9ba1324d744d1cad39e3ff0bcee2edaa7e20f358c2ec8fd77bd62dca3360d834b078709078f7d410d82ecb06a301d6c9c340da417eeb34d0e7ac825a1eea664c3e72a115fc374c7ffb7a0eb4ab79b93d1be5e74dd13be966b6d65a4c797dbe29fce82bfc3c0cb48206f06c58ca56117a1a1f1e670d3b36cae41d515ac271df95edb1d2ebeccc84eac1cf5d826052b191ce0232c53d633be675b4896e104a12556b9d8a59f9c93cbb887f05011060a880d589aa1ce47743113c5bd045192599646ca3c96890f735a3a1fa116f95f45517e7df1143c27b7456e8e77ece7798e90407adb78bd2ce08672d401000000000000000000000000ff35b19dfe2d7325cc67a43402ed38aab03360cdcbf3d9c2af5ba5381a88fd36da073c181ca9ed57c25fbe1613ed2612f3f61d592e629d732abedc863088ab0c36cae586463b6b6a2cf5401c3848e507a043329f52e5c1147b37c0372190e92500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000892554c0c869fd92fe83b68416038404a909ee139a791c4d9379026f89d1f8373bed17c53f443212ab7cb0ff6f4ff34f84d8a5bfeb772972dc47d8c5504beaa1cb4f4006f8d5538ab7d218620c4db8f9379c9de1d03186c4ebf4a8919c86e9a7b64a14519ad921652e38796f35caa31a03c2c2bbc5b6c22a95698c992d48d5ae0316da8b01ca7a7d01fb4a11894cb7250ed449edfb0764d81c8e891e09f1edda3a020b7b03106b8550d6ff87996fed91b7ba6320ba7b3ca076d3063544f36efabc7d0b00d474213ce6ae37e320fae9a9307eb2d37ade1629b714d5eb35d906848232f971635a350f7fbe9a23e2205d37f2927446d72532c0cbddc88e5d686597bc61c703239460c057bb68050696e8918c6981f1700445596eb6caab4309cde9eaa5d2410301b23b66a4f007c4ff210002fe40d5188a8f6656633c82ff43a7218850ebb302022f1d05721de59482db28609264d9ebec2f4b5c59b5ef8697d34a7938694f17ed022c8b4521b5e741e63fbc0b44c3fc95ade841da5ce7eb64f8d874ffbcdaae64500214b972341764aca20aecb2f37c4ddfc27ec0817a601ad70a926cb5ca13736fbe554317fb37d10ddc088708c6ef4eb12b0d7e1f0079f70a39f6c041fb0e339f27f98dd9793a0c4d5f617c8bd948ea8234fbc43a020f5bbae908d7d7f7e59b9b34adcab7e5c051243800297dc26ac2add93f3d8c377ffc2ab02a315aab466f3c1d455cc8bc714fc39fe360cda5b14e38ddeac4c7b71be6e176acc25782ce6d558eb7c16e56afe9d4c98e5ac141c4f8eb7c981417cb6a07a9d284e02360cb6fa48bf5c15e9d850c3b7785cdb8faa588c29aa83dc69daf167f682fe30e61f064d66487efb95c9f378d7e082cb3b35f6942e49ab3a6bf84990a7c009d4b49aa241c1816fec5d6650f9589bcaa27ee5222ab73eb9ee57f974ed0d3dc81152c4fdbecc2f64f90945d2dc85f9f03b429fad920a5d8f113a14abea78eab1d361a9c172aa736cdee9653bfe00f91372e128d78f51475fbc2232b736832d64215f9d4e3245994f82b53495d4cc2af108aa38a7896eaee484b737ec70396fd0eb55bfa7ba77576ba73b8c36615ecbf7d450d3f392dbf3b26051a2846e7b97323e0d3eb87dbbfb063bd4aedaba54ff7959e25aa938c3e43d65f10e743b2f54f096353a71cb6503b2df7c575211537ed353467c40557537c4cef8d41f58b3f17e48e5685288245fc7169e31dd0a8814f0365a35bbf71b057ca114fb78d6f4bf1c7b637ed2ff68c6bb84091318621cb4d94509bcb80480a8b4e2f625c10b270ed5b312356911e2aeb6589d25d7711954dc582011f37aaeb14abe30875256a08787ecb65159f7a654df8460732f919060158518b5fb46aa51c88aebcd8b464619544b824cbf298aaf67f4b465505f70452bf74f388b513ab55cdfd39c91399000ff0dafddfff0f433b78e16a0586deddf9c431d8a8986586cda34a2be5ae356492bb8b0f7af38b1ec7261221cb28715a068d588fd4abd6f5bb0fb18f141fdf9092fe33068ab2a64127a7ea4b9c21889c9b47a2d76ad141bc5642750992b2854dcf5b17dd99390c23f0a0aa2437ac6c684b945fc62acc444a39d18669dc91c1fb8655208c8414d6a8ca4a7b77abc0c8830dcee2d9d9ef3adef27fde2a1af6b47f2b54f1aa30aec23c84f0640d160bcc20c86680e70374595d1fac3ce78ecd3e8b090ccb368a6251d3b9b0cf4df49491a9e746fae331d7fcae786dbc3de0165c59c7b56ac7c921fa4f3ff4946be2b6704843d1b32c0abcc79e9f78c8bd9cd4785dd0ddfc3f30a59ab09c91b40242fbfcc88ba65941ebe91e1b8ee97a005cb98328566e335ea1565e4c66f17931dd291bb6b574267609150d589c5aebe899d200a472e64defe8c90bc75a95c535fdcfda1ba3c8645abd9f1b4d22852b3b272acb4a27e3e00f725bd6031a82ad7dc94ba60120053e15fb670b66ce80810f52d3bc08e73babdf5eb7f9b5c5785abe279cb143f14757e10031b73aeb1c7a7e056dc9ecaeef24f556da781e8a2c41e202650a63219c2852cb8cfa03cc3b9ca3985f3ee315482c5398b15dd88588cfda286435d7b52c6ba9fb6a2e0c23135c4f54d792e97dc4d63dfc93b9fc6ba2950054686dab24cd58d4de780e1eb6e2554ac493056f040be0f706b26e4356c4b2656def6afc4b206b97519fa8116753ebcf2f596c3405c75b929b57485c35d0c64db937c2e2263948da5d741370d7a8aedbcd3917ec82f095fb878707122d3ae7862e70d94d919379be4ba7d9712c79000000000000000031ca8d020000000069e0a6acceb5c463269c0a9a8f903dabd17bc7d3ffd2b6ee3bb9b411a613c84b0b5f1a0d5120e02db4f9dfe2b37395233874485ff9054c878a7589d48c559edccd510b80f1724fa9359f0c8ae45013747a186c3f5251d28013169e78a0cf0c4c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a42f5229fc435f733f639611908f40b4bd5ef8214bf66d8035390557a316e45e331885a41796f68ab81f7f7c10b2c849829d6e0d836292d1151d30455377264cfa0a5d64f82744f253cdb5e7aa2e81c4678fcdf865c1af7079361f6a933d66196a775777e17baf9f9a5267166f16fc7672aef5b7a55a1c9cba0d5b2fea3cec7f022164a9770d8900c3c711317d0727fca467ceb9933fbd56e4c4c6c5b2658f6bd5021d8503cf849eaec4e66dd712c3ec7ca0823829d9489b6891dff73c370ab0643f0b087774b6bde70e3b475dc94b7ed47f2f25b79411ba136b324e2a3eebb48710981dd934a2428e8cb2ab9caaaf9a4c0e5a3ee9cbd5527835349ffe6c4a75b5953f021b9b74fb1a2987616f8cb34cffbf877b3a17a9c225bcc14e690c0dc6ad9dd03c031a681bc7f770739755a503c9fb200eb9a49af495f03d170a118d1886cda2089d03296709d92cb42efaec60fa36d14825d8f87c092731e16cec3ca240e6f91e46db02135b3ddd57bbbc0e59837c771558981e47168eda88eb850f3e04a515117ea14602035f6aab2907368e259a69ada582f4d3dae2bc90052f32c19dbd7c370f4dceed3b00d30af8ef29de00ac71c5016b1b43a9152855817899804b22d6b8ecea0cbcd9fa3f58ff2f83e2c890457bb5aab4b0e57868efa00cd97571c40e7a5090e46fc1063c7a04c7fcf2079545b4f38f461e702fe4d476db6a9925fc948e57bf94d2266680d23ec9754283751a330dae72039d3d3dcb171c2af57e1520b767fca3ac4ec8b3762ef334470e086da4770587e128e6488e5b7dcd1032711c6c4699511c07656dad7b0d2235d1089fadf3267412de166ce9f9f2eda545588acff0b2846625852f18e00b6d68dc83660411fb30812fd96e4b7487170f5a3eea8e4b55a44ddc84bece67ab5d1b988568f56532d8d260fd64cbc51838a82bb1c07733ba528b3aaf5055ecf19e715100f0d651fff944fb24c0bf1ed225d1e13e28ac9172a441709a3fe6c184534c4d3c401ba18f78c0224baeaaff05727348bf25462fed5e95e6f66994522ff4f543ecb25078fd027adf0e2eb2879cacb26ca1b0780efd2ea4531517d76d3d1df18089827d090f7fc7777c08f3078a61aabe3c8ef6195ac5dc1cb4c5e9cdb926a303507682d449c027ba14c6200dfdb0142540589cfa7e65447841ac745e764d8ce85e8875c707d9199357d32215556239dd62caa98f442afafdc619b738a30f54d80861cff167fbdf9e9efde407d6db6e779af0c1855f0f252b8acee3855ed3f6a002557b4a493461560abddc38979fea5201cba1ed2d4626a75f1f6c0a036f2b191b220b80c2feb9518f8fed4786cfa65ea118f80b8eab9022f602b3c722d0b3d84971aa18af8d64977012bd4fa81a3a18021eb075a318bf82f7c41a6f28c2c80947b1ac4cfb15c5a11bebf1c3eee32324a2d07ab0860f8e9f674a704fb89a648f21986ec810b34aaf780b02adfff0712f06d8b3bccc31774cc2520b4a21ee7ea6fddf5e70570f0dd3b4dcef128df5c6ec9b18c2433f518701909aa5be2c4dae1bd44740377c605a336dc2cf882ab0263b66e0c49cd29c5f6be99b57dee2d5bf1089b7dae5555aab9648179ead5835e246977c031f0252ebad0d059a9006a8efa4db843cdda01d8d153579a6db6f8effedeff06c753f9958dd16865785b1619e0acc680365a7d4d42b5a60934c4d96774b6f7acb0aad44141749b4a35f8e1d3b37a2406f050fe9952fdc0ec6a3c8ad1e9e3b6bedbee4b0937ffef26446b6bbeb2fa16b2228dc39a46363e0e7f915ac24db44e8afc54c4c533da45e1c1c76781f543f552303d8f7d49725040b24716bc44ca932bc49c148d481dae134c99b9f4b79b3cbe2354bb2bc04c9ef3893ff23d12bfefdac30c4e8d1b4668a7cd95c1328981fb69a3bb7fad3b3f34b384890c52d8f099c20838be39c7e832df7235cf9d4280ddd4717c0e16d39f48b001d1ecef47da4c411814313951e0c037fb4044c870919e91b71fa645d98b1e5a2de4cfb79aaaa2d24aeeaa3455cd077713847023f6619cd6625d13c641f76981fdcde68a04868e43ea7a47cff7e0bd3623313844432ad3c854794c1350bb36f7392393b8649288636c5e53d988f6947dead504f9133b736fdd5d47d1b8999be49b0b4a5425c72df76aaa30b6f36d3d0735f641e1f374d6adb4060e97d906a541e0de487d81a162e0795e016d6eb26a7abb4ffc7f2d6e8d872b221f5604619a68d35bf48dfce9112071dc860f193d74f52d29d345634453bf8b88bb0444af5a0d6773a66e329e65173b8b05ec780bc11bf40f94ba5b8c706158873c2cf1a2c800b3cbcd078a5096f0d8808e9f7081f9e4cb4ee3fc2cd20a1094793020f89c79f51ed1ac9d56b4c47af3cd234fb11172a5605e08a24cd739346178372d1500d", "53516551525251", 1, 726060232, 0, "2366c9f5db5ee54ac7ea9b3071f62332bb1c1b585361fb1cd657e1643e7c87c1"], - ["030000807082c40301bd59dc0196f4d4cc9e5385cb5c7f9da64f7596fbfc72f09f04f64d29d021f1f60000000006ac5153635252c60da4f803e6267301000000000900ac5152516a5363657c18180200000000096aac630051510063530d841f01000000000000000000bed4772b010000000000000000962fa403000000007d88dfb402319bcef161a720bc7240aed297030d403c60c9a8b2cf109a3eefb4901ad10fb1cfe53541f78a5d2c60abb0593b00798f763f011f8b86462a8bef6b9d125a3ab541c8060bf6e336cabf749c8be44e544b50babb24c257e5a0a5333e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b3b244058fd029ba00d188541cde462ce67ee71a79ada2a9ea1e34d996d59ce593254fc7e6605bc7553cad3b13753228ea913e45d4b7a4e2ad54aff9ed0c8ba7311dd9f57b21f639bb632cf0c11dff445d016d395e5d464a95cd60ced8cc1cf9c14fb48c7930c1b79ac3172bfc1744f09af134199d0b7a4f586e70a1b14e0cd022bd5e526b6c4750d3654c353fcf9412d26cffe81e14ead6cc3e04c93109dc36903299ae125a2d57862bddbf8766ec3bb7829a8691490971b3ee601ac0bef295e6a0b02d3333e508fe87bfa1a9fa959203940b7a22777be9c62c18117e5efe387324cd72d4b8465d2d5db5e338b640115693cc4b912da03999eefde2c62e66358617b0230387420d9e889d5eee971b4ff0df47c2f037d1b7b0ec575275951334f7a4837022877b919c9edfebe569826c3db4d390a15cf2ae16dd604d3aa18627edfbf64310322956a089a9f41b9b15b56327a2b39f400189e439d2f19d3564bbcf46c2864450220f600f33df01c0e62334bb477902fbb92311af4e3fb356f8127c33aa44322930217876272a42b91263c427f2f2b6017088fa100c3dbeb4a1a3e87cae786a1c95e4a2fc06f06e1072efdd5685f0b10827c0cbe989c5536598595cc0fda0958a2c09a37b6eb1fd8510cf6711be1b8be61cf1ebc6fb320684e91b6d21c9072cbb1a7987d3d94424d14221eb240122c049fa08630bfb85c875e01ea2470a6c2ce428c6193881004c7885e3d85f0d887e2905b8db796e4aefc9c1b352e8bb656b1eba6f3a4419c966657c3d644da98f38dc76d862c7b0369b751e2e26f7ca03a5ee8aee5cb9559086e2fa3b04e71ffc2bd8b852102bd051c4f7b79437cbd8f097f35b0b4b678d0c1cd1ad3dfb5131e6b0d5cfa8ae31086f61a110af949ff7a8a47187bc930063f96cedd8186ba1cc757e9681c8572078379078162edad0c8bbd72729c362eaa4c9a86cc1dcb8b91e3dce761740683049efed8d00f1eb5959929ca56f5710d33a40488405ce9d951e3fd660542140c7084ea4f8ddd969a73589d5b398c09fae3004bd4dbde9abd86b1c1e688b099ce31877331be58d5038568966e8f3ac4866a2d2fa8e2790da2bc550ca2b48a1cb82df5549a9760b3e5ffde3d0edb6087a7691084a1a39bf97734fef0e757711533fe60cf4cb91a5e6d476e0df094cc28aeade3743d116641e724e1d63ea58f038534c399a3fa4192d64a64d995399818b9578c43ad3b76e0c0ec605980638b46906d52c21dd7283df3395378f05970db2afa75df6422e7dc8f07bb8c2994613ff192db2bad0ebd00db157100670f6df9fbfbe2d95e3f6ab3dc49decf786a1fc742e8134742737cc79e5ad7bc55c559d8352491b3ce376418b1f5782f4c8fa69a558a7e209d17dea2a7682d9e004967b69c76133be770002e129f12367e31ebdf388e01219271d411d6666a46447a21d31faba4fc3cf776f8fd5788c9cfa312c328e42180e0db115056a87fd689c7611a21f3fe20eb164148c7f5fc56be01785c886b21966c2ff2ee52cec4830e61a00884c59cc206ef92e5bfabc4dac5f9b83788ee8072058476b5ddaa056a1e8d0467c381436447e62d244cfd22824f721e36459c493fb65cb44b6f1453fdebbb1b7b887b18d756c673b67b1ede4b813e0372e2080a6dae4264a0750970440944ae9db3fae04d5253b6e72993107c020465e31decc47ff5415c73d82fb94fc19920c7adb94d9145eb5091eae6e217d77185ba2cfa9b71a1f5ca471f0e92fc207f3b55146b47baf744d025f1cc0969f48b89c819ed93d0fea4a402693312d899c83cfecddb0dd1d3d07ae963977f2fc72fc50bae3016094fb23dfee690cf6b09e1a17c514a183c62973dedf58f87cc1ac00f9c281cfde66c2bd42213fb817fbe5a1113d7fccca6aaec43a95808be2880f7f45a61c9babfe10d2e00e00498b94b58f0d78cf561cf34c1d8c8a8b0d318ef47a828fa597b8c3a7fb178267b8775d83fdca8392a4c46ac8d2eaf514adaeeab9b45aa3d45e1e8a2cd56670b6d6afada6cd350ff933ae17e3473a441845bcc47af4d31978039198c88d52eba14909d13f3d9cf85b2d8a282f8466f0e364775890e2111b4214ee3e0b55c7189cdee2baf1426b0637e6fe5554382ace2e4128cf825be800661c9f750229c13603b8611f14ac934fcc9a4c14680eaefe9d00fd60096d2d9c096686fbcc5536ca16b1b9201b7adeaff20c83d12ec5823fa7f706a465d432608007b2840abe0d098bb234a0d1f017fb47ad4972960593425490ba671abe844218ba707504b2bbf3227026a4fd580208006a016ab231b762c66a9905657ccaa1b5ec50421572bad8cbff8855898978e2c64d3ae77471e94355863455539de3f866bcf6ee877c37e94f284785bda9da12845fd8e23e74759afc37197059efee70d", "6a5352", 0, 1303675994, 1537743641, "db936af7023d4350a314b8ec1893fd0675645b0bc9c09faa26071b299491ecb1"], - ["b9fe345e04c463ea7a191300ffd6284909840e26ff496cec256411fb3ddc1f9a44cd70edd502000000056352acac63ffffffff00aacc59e412734d5b746be92b393696dd2a61d2dfd004e22c951c4dd32548ab0000000002526affffffff9e26072cc20515f4cb09999ce8a5b2f93cdbcb8b900fd7ea7813aea8f327d23c020000000951516553655100636affffffffaa87b9c03d121c6844d7b17971e6b5ea11707d030f74dfa803ac4efb08023d9e010000000600636a525152ffffffff04282490000000000006530000ac6300d0d47105000000000963acac51ac6a655163be103b05000000000752636552630051c803c10500000000066565ac650053000000000354de4905000000000000000000000000387281ec24755d90ec97af3165aa9a6d3aff44a795f2d1c35449fccd09763dfe6bb1b24c20dbf18744f59a56bd4744f3cb910c22a6b7707ff0e51dac1d441e733c25300d85bebc56173d1fb8f249300d1098ef55fbe875c2a4205cc1870218bd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000037e91e43ef981bb32dafe7f6b8db75e107f08c3bd9fe6e8f2a9d6a3bd42bf7b8161bfa42e11352e4d866e7b9e7d5ee8c938bfc8d20b0bd39a10cb2218dac45a31392b85844694626d0d666b12d27424bbdcecad49ccdbc7593f7229e1838a8df862eab3f543bdef126b4ef8ef5daaaaa1fde8cd9507c6709395bdba605427bcb020ee8de22fd47becc114e575a113cf3768351f7c5bac5d47105bb8a6d396d631202116d9209dd87de037b3887d575460b1ff9edc90d9014578d339279dcfacba3880b06bcfd05c433366f9553955e97fabc30bac6b30e35c0d198d7a102e62d09142d6a91fa2c721d5a6b24698b35857b031c1d7f5a9760d7908729049519ea01b8de0204eb336990a26ee2089e23ea651012f709e3b45be832761e6710cd7f315032cc0320597119c8cb40d9c5972b99164b51e45acf3c5596ade1d73c2d3709f0d8af21031b1bb53bc47a78558da3193d1b147b36e04e8abeb73bde5d5b224e0add41794e0304c426ac663e66073b7d7ca174e06c5d6389bc5db6a6b0477f0091041de56ceb020e48d9da1145f50c342b0f66628187a46362b1dfd491b0dbfead3ec222aae9ed67485c2f874d06be19a3735482149f5ca727a0741b2e5bcd06ac6e4c3126539b0bf2beb5d56ecf9cfe2117d4ee30ec01d586f74321de056b67382731bc0f9e1c8e28372f7262b20261c325b438bde901f486f10a5bc070b77e7e9447b54cd527fc24ecdd778dd08af042cfb43f2a38e013821a235f34c459ca289daded3170f50d8fd0a881ce0e53155b2cd875e1918ffa6bef94c844884b4aa69f902628f8cd6846c0156deaaf14dd6037697f3b64f1041e9126873880e24ea08611d7d6c0ed63e60a7c3473272642cf6107539d40140a3d8bd486d524cc02b9e9273114f34bf74cd17609e385a611d729e0b793e6a0bb8d6eb5a7ad6909f4c2af52de70117c638bf91588a5cedab198f6cd0d8515d1eb8412e16e5d54af197729604c1a2ac9750ad6c38d5806620c06efde83f1e0c315e285265f1e193d49b88e51e18a933ddc6c3d8974674b7d574ac27fed32c6286c04fe56b87164bd9a7778f0f01669e2e90349d6a39d47c54f9dfc36973307d5417a72df879b519357cec6e829615d47578f95f276433f68be73f907f0e04f9917609e4dca51c3f1844e994e82ad0254142cb1cc1fb6b682cc972fbea5ab58c568c8839559b27af5ab33991117f02e59a2797f88be8262de000be26afeab3f56f99cabb37259bc74e58c21089adac3657f1dc38913f92d9a58453cc6d0bbf5f7427e80e7d41f28b24853f7bdf5662f04ed1d1acbcbcf76c3b4e261859d4003270759acb79b869a0f38671be8250f231786efcfcba739dfb89e6af8aabc82ef57630e7afbe6fd7450b09f1f2160e4cd0e7dd012506e5e0102f9674ed0300041b0ff7c2f3582df9a103ab72e05a9489d87ad75f1c37a9945a0999477e1c37e087cd967a06d3e0b331f7e9105ba03817b35a50000d34b201c5a0f5e288e6e23540c35d85b6358aaf64f1f16972a28aca71e3ea058a76c5bb56f625b450b85bbf04750e76760ba25275d878c5fde776c8915418f9bac7c014fc93f14e1261841a1c70b1e499288fb28c71071785616dc4b6a50cb09e138bc647edb00b11388b91eeeba31b572c53a95325d5ebfeda1cf5584fa07293a3f821400371bfd13928afd770a13735bb55dc355c5e2ac89f38a7d400acb82ddfec8f2366ff224a9fc7ac0cdf2f3a88cf0a1186d72ff4f90f9b4979c4ae1926b12efe7620309116153026675eafe9ba7bc130fb9cd995151b680c509e3ab58aebf72df2e993129999058428f3e536822d70e42964ad85eca91371e0002372cf5e3540a303ef5c3b7e27760e207abb5f7e7648eeda582b6dfa1d652d291c626632b8f045c01b776687e4513578fefd8ba4a48d2fc19883debbf24b7d9d0034073cc085f339785eb5663a2eb1658b4e830c4645c37a3235c8f5164688f346e4e8a5de4d0712b9efa7749209582102f9a5cee2b419a22f37bb55dea11bbba70e74302f28d7d94f67e32a3098af02c7748eccc84280bf3a11f27fabf6470d6dd750f9e86a1d5ba4c6729263bd5101a78d20940aa922c6d45fe1f1cc84735fdea0a975932b72244933f7f40efbd1342acbf3ce06b0304fcc8006bed8f8ac78ead9b27b9cb89e7ac0be7062bb726e33f997c61c29aeca912b91b0d0fa3dd685e9eccfc497e9f7f3d60161b44200de92db7f2c14d80c2364db0fe76200b5ce8dec084319453cba70813c947eb10ec695cb30000000000000000f06df00500000000f710c789aa162361ff5cd9d9c1ce3f802e0b817dccf3f88fc783d71345ca7aed3876213ac329778bc8b45bb1355932a96cd424f3a5614ca1716e7b5c9c6086e85c4f3bc1af8f017114b9d4d7433982e04147a95ef961f19fa6dc7cc09e2cce8d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b58d64930f263f34679932fad8d3fc961452265dcec82bcbdd984e5a2551bb0d1bee16714bb1bf5b337178c14085becfc805d5ec019c822d825a7a52effc57f27c882c96178bff6d222d260025c09853fd109d9784ebe18b5056b6f290d68a86621fe60fd213e723149cb94a340f9519f126e1ec966e130df8a895883307300202077e1fc28c7d3ca4a26fcc697d204eaface741956655594516d682af7e546e81021fca75039f61197a8007a33712a4791b872939f122811928aa60203b0bfeda850a0427b71334e0e8c9d839cb32440c2496449d84e60d875261d509fd1ecaf05eca43d160deb4fcae6977fe08a5c7441babe1df25a5d132829f181f5ca29110d0b20212001582e00eec50a3621921836ad31c4ae084d25da3a6d781d48504d82461fe030d612474107e403c403f2fea27a5018fb7d8820d464a4a84cd8a6e57dd3921f8031f0bbee2861db024f3f5ec4d9a153639c3cc7b7db61717b6269d511fbd5395ed0313f0884e6873fb221c5e0c6270b84904c1dd676176fb3dfe712332463cabfc9a02171e3dd77416e918378e73d0b4e654716748a913818eb52fb3c84f772a220fc753c50e8529e540a53b045a4012933027f73e07ff5a8a4204584bf5d11feefaa40ea35c0ab0eee5b43220929d9870ea4f8e9ab6f812555516efa80a149d49c50f2f96f77e18e889a065503c66b31214ac50493fe824b77dd1490903ef360ac8fedfd0f4076ed47344975ed71e69ea546bab4c87169b7a7906d496725158405013b8c641beeb5352faee133f5522f010134552bf4d89029a63f57e053415765b947534c2bcede9da5b7b18b0c0d96ad2b107ab5fc67bca6c77e147418a86ec11eea3674e324e091bca1bfddc2ff3f1ef7616a679d5b963c7942d78f852d7d57688bf9927a03cbc01801fea8ae42a75d217ea263fb1af731f0e122623d77fda3fc997f336a5a36867a6259ee0201c8e9bc8091394a047ca488cce2828db09030e6d01ed8379168449fd47a47f59086b71032668bdae8ae18db1044d3603834b060b2c4bafd688f2d5f27df5766c2c70b96da4edb48b272bb016c9d5b10440a869b20bdcb52d5c5a210f486a7076ada73eb04d5b71fa890da152b1744d15e56eae2b129b76af268347834599b180e77446e4674da134427832406c1073f20f698518a60b3b004b18fae642ac8eff1b235f4fe33f761c1fa9834cd6f8d07cb66c8cc540257808d5892fa9a16ba3adad9f5df961b9d0938587edd947cf2157254c30514b32b6f7ece0fcb3d79d261f9793ad100136c38b4666198ce55dece37e61203f733cc48268a845c99ddabcf3469052c0bf22100195b3db3ea3041d84bdac064122d54cf0b9ef56db18b52872cc88d030aa7c87130b57e772a32a0f96a60f768a32dff5145d8736bb133b1b612cbc9e70bcb73526195a92cff531a0478ed7ca2955f1d8eb350e29a18981f0f889d0781ff1a7324340eece2100a8c0f24996c9c139953eba1b0d12fdc900f1e488a69eaf34f52810e3d0c7a937e24d517089bb626ced2825b1725b97bc642efd64e102ad98bf3ea3884cf7c19bb68be255964a9637a99ad9b1036f3e1ededb6deb927f949c8d57e97099902c870b557831deafe2d8de01e33e0fb2ee7c22c01860f147e3fbf23005f9c5b7160450ad23c6f8b2c83a028e4bdd22d5a048b8a2026aa232d03467338376152132a27618837a6153cbc5ede0addd456273daa095298e17c5142fdfe784d9d84f68011e94cf4f5f2ee614399274633ee146c67e23c9af70d64a27f32e51324e4b0a2f46da873c4e0ace79ddb79eb449792197d7b2bf315895afb0d14857e09151beac565c85571f0a776e33e1dbc9403efe029d861b90f1ee53781a5a12ba8834368230c08ec61dee255527b8be18feb8550451e2e3ae998ad9cb0fa54f56fd687045f803fbf550e724e69102cc61543456ceeb1306d054497793f5f13ec80de42a9380a3dc58602dac81f8de4717b603ce74b066365fa2a350ee716c454213420de87482fef8aa395fa7e37c5753bcaf13094d67dbce59e121abd6025dd4c84b398344ab058b8b49b3fc2c5516f63b090e57f12778bfb11004d96589e3903297e8f7335d93b5f24077824e141590ecdd6711b709118e676a455e6eb1fed2008924e0cb381776b58b332a694241625a8ebfa0f6984689b02cb7867da656366d51cc655e844b76ba4553c56d26a9e3d4cc472189e4164155d395f5c905b2e784297d73f6f430a1978e1506540377c5859d849a28ff0b50ba5426d4984f38dc0500000000000000000000000076146d911e6dd3afc408cba06f83168290ef466c00e2d14a4eb0f722fcbc8585d24aa0585acf69ea5c14fa904ea738113d435bc74c3d58e8088d4e2a9db0e8c3b056b1aba54bbf90636fbb2f76a412b5211326c681ea47e01f32aaf9667644f500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b3b622deaf7ef8058a1860b715830d55e79493340a14ed637bd6b1bf0de1a257cf04c4bacb7aad5412447a504c447b01492fd01bb8046938b45cae014692f7e3578ac3a38424b75eb4eb7040d828a79c7c379559645f5bb092c2d25a875e2f5b8a9a9fa41206308c98265c87b52472a06dd4bf43d68dfe95863df31f3509815d0304cae73df1070a609f0b4f27a436c58dec73177e6d8bd638d04336aa2d56ffbb0300fdd1d1f7d6efbf8fbc6b87875edcf36d7b11aa16b228a6782c19d6a5c44da50a08f181eab8f4df1c5796fae250e77891a308f9983764ec7efa55c99279def95a196041bf0bfbbedd3595c2271ea89e0e3695823c0bed63f068a97107add7bddc032347e1cc1682141d4c4a086deb3866b8801b0948be296896cfff5e1eb1f772710304cfbedeba6f7745d69eae8b3324ccbaf4debf5c3b34ff9876221fb240d4d287020e8e6275053425a0c214eb91f1d7166675497a3c3f89b64683a434e04949aa2c0318c056372fb7b520951a3f7aa6baaa41937f352ca97da324e6b229db33fcee7b021a103902f24167e9437b79c3f5de5afece5a5a058b9231570965e8c710a47e6a25bedbf88831586f97b0dee1e4cef068af24756bb3b41f7455511140b49d71dd9d906c55a10a96734843ce5e85e1fea37a343b372d49c102a2ae8cd168fd2af9597684331d66f80d09a4bad67d303fee69cd2881f637cb20e8a95031919d09f978b895c930f7cf08f3e62f967dcad6fe64d70bf58357a7e32e7f327d42e7134a27e1857edc2c385fa3c0a6b2ccaa5af5ec1ec0d6e71c7079ba590c90dafb801be12378101c1f051a1374e8337f0134d30f5523d57cc6f0099d02eaa5ac9754cca7f0636e64f20a672e3788869c95846a5765917c78b1991b3ad9ec64749693458b1b289014bb30712611b394d268cac2abfa69000af0d44971b072b041ced0947325563afca548b660b8418dcfc3a9df310ff8775e827671f76c39b318bca8dc9d447f9b8ba32f053e7028109e69486b372cefd61cde7709d54904951c32548a2321fd75acbb93b5885f4482c78928d3bc1ccf4e8af995891108f0953b2a78dc5880946f6919f0e4272cd0bede6f1a573edd6dd2791a062a29ab5867d7cf3df9a5d3f1dd4fba8f3cf949d9f031c70b00c54af2b247a3b2c2d61b6105a665085ef9d5d209aa591bf1281a87a9fc376e1aac7b0c6714b889eea536b9c884d6ce1cd0f3fe3f9d9eca6cab6769f2a6e961a5abdbdfdaec4009fdc0fc5d1a0205a01e2f448d827af6d7970cf29f7426166a6fd392b934da81209b1496dd146c6da4ae5511fee9b4e03039b0beb6f87e24da2316bbb7d9bde6399262eaa5a88087a43fc145725fafef25a82df17ec3cb8b2a9c7ee2ac9c63e73638524e277257e732e369ffb72c73439dae7df21469f9955efe13adae91548fd88b0a03cb63fe66a8e4abb1c8f14fabd80a63dd6b70ead633daa02d132c4b2d7e67054c083cb4264069aae1fa1ed83f69beed45c72181390205ab160048d04a532b7a5ed5f4dad29c3d17e23e891e85fac18cefadecea319a8943f02c40d527ebbcd8823e662685738f1a35be609a220e76d7ef8cbdbf05ab7e858b20b449cd42deae7d27a828c361f0af8ac83bc1c94aac861a6d4f545dda4d06063dc5771478f3b98f977f8df84e98894a31f9eb4d585c2e66b3a5a76f69469e5a7d7835f6f249829c08519f56ebad3e356954c03776e8d6da8c50198a52fe25421c2f96f4d8e8a8b6e136d7866653d798a2aa7733ec8023d8f94de963033db9eeb781bad44117e2cb9f1100dd616c469ebfa7115eb9319308711d51e5f307170d868ea0eab6d63c6843ef79ea05c96847fdf965c16f6ee7d65839135ebb95a53f80f08db709ce1eb2a4213ae555d102bb5222edc816c547eeb92eab46031eefc967107b4ad7b656fbe92437d28236644fbc2c334b10c47af2ee764cf80b296455c44f182146dfc9f8d22a7a21bc0f2a54329390c38180e50526c058b04a1606bc0a42211ed6d47461787cbcca666f2fa2d2ad010f6ab1ebfa8477ac60420ce1267b227ffab941cb2e194f059f16dffb6019f47e2fbb8e384df268addddbbd2cf16ef2d30ef17ba00680c1a4ed57242b96f71ff41562afe96ba436f21843547bdd11df116952500c5a7fe3960f1ef12763df92debc8b0a050a68ab6ec795745114533a3486d2b0b9b23018e6679cd045e277fc20749de983fe1358daacac070d0d321fe7dc4e4b3346ae83af7ec9ecc5523f8b9bd5820f27859f2eec38431451ef7da5fe611dc4054ef74c7fcad3892e2e7bc84ec521d74cdbf0e0cc2c3f58b23ddda97b958a42ad4738a17a86ec62818897202592895e806319ed78090c6cd312e95556ac0317c571ecc4f72a0d84ddc3642f44d2ea43d0e57790cc7fbe9d0207", "ac006300ac63ac52", 3, 1108910967, 1537743641, "d521abc22273fb8f2b65a6edeb07b46e3a07c136397706cc1bc038b4f71d2cd6"], - ["457bcf6d02a46c51673a25f15b89667375cf3261675205071f474cc10f1da5f1fc7d39cb890000000009535300ac00515352acffffffff70ced3fc6ca50f5797f4325941fbdd5d3f759e73e55d7ca4d5f318cef271fd350000000001acffffffff04c62d9400000000000465ac656adf64910500000000005054dd040000000006536a6565006ac8f268030000000009ac526a6a6a51516a63da2e526e0122c3ce03000000000000000000000000c69c1dbe6bb1ae2b706b3e055810cfb09e52c6945ac31c8c5f0a51f8d53177f5a4773b21ee72e9a3d15cd67332c749ca4bae4f744e71cb4a5e0fd0f37c3228ad483390e335aaec460219949118abf1d9e9fab672d648e27c3e2b89118cdbc7b700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fbce6a0e446e486da2ef8e35e58213e609e0382695f1bcebf0726b7ec7102ef94496e4203fb949e69b0631efa58dc84ab4dd9887b069e59cfc3d4ebaf52b826dd894e41f99064265562ca4a228d8b2c75d698cc8cd08eea00db65704ea3b2900cb6f14a85023f6f348ab9e143ed566677cdf38d2c3b1b1fb2e5b98c7ea55b60202224e81dfd53981f01e84fde18558f3c21d1a59baa4644bd1d3177c1e85c3d46f021246999db9630f6b8db106f371dbb494ada33a8244684c1eb83532ae84cacecf0a0021906767d8105a08d2e99924a7dc00c3dc98f05e84a938e0be679599b25d521502999edb100658b46ac68b7912a7ae9a5da126d32797c7608f3e9619cef394032fd198b871064f215704c2bab132583e23747e061d4eef162cc2d0167bd4de6403018ca3d2ff7dc3d7cf79d6a47363c020dceeb146ca2dd36a579d4ad626abe77c02099f038d225f497820869f2b6f70f2977e34dc6cbaaaa00d115e2fde071cee61031b9365c9a50478d17b913029e84a34fadf1ea96d85dc1179d2d8d800385eb968030de48ea9947d81b0d4a189661700a77b2cc80cac04e049e2cf2bb8a5285adf7a561617def6ec19fb6b68107ce5fb14b0fdfbd0d773e4e354b97f1e49a2f8265b79d47ec98159f906ad6a11fc9ca3b49acbfff3b4fc1f0652cc2a4aeb76f976c1f66101920e5735874a2e85d68faf25b37ad8b4161f0dbf2c57f001b8475f23736d267e2548783946d7e65331e6b0e094a6e75fc47ab0d74b447aa4b4e6ae6fba2a987da09692aa90c6ae5479938837b32161d459ca52c8150f3265b846490f2ed785e6e0d25d99eb5f7cc726260b51da74ff7bd1dce3dc4ae289143697604e5af7a888c8cc586aa2f62995fcea1e7f406ba643da68b3e3bc8ea483b7dd1fa66ee3868d8f29d5d2106e31dff86b300980607ce9b71b6b87f12e2c1296a2e6b7da4e1ca13b45b60119e3d9c6ad413b31f3fa3895721714d249fc61c4ce87f80585827ab069dff7c25ed9994df8415276a3960dcb0ccdfe55f254777981e80661698a845e24c72980df0a16899d66794aaf4eb6b710c55b087e093b41da59f15b966304de1f22283291446fcbab2db049239551b9cb27eb2326c69a8364da75306de054aa43038ef228f6decf08b80661d6fbfb879907c53ddc9176bc01bac549921349cbb6541fbe3fabd6a83ef4927a59ffe083377d730968507acbd1c76c1d1c28ca259889e6829fbd4049550df18b6aae02ce1e83162cabc19ece8c6e1c5c19df6d21f8853bc9383e86ec2cc8c8a080b71447d878408252354dafd6070ec33617ee00df74e39d2fcb7062d6e78dffe6e588f70d193573b98f5760a068c857c839c9a583134e4a2c0dc731b853770f1869152f1272d9b2895375c1ffd426e704d2575fc0bed19b74b001281afafcb8b86ce622d290573ea7056e56076369255ac9a6d8bac2d2332c77f2ee6b5ac459bf68927b65b1d6f38b71aae4f52af492f956d5459f4dfbba2def1b1d7445a8b8c3e922e422562fc15d8cf64beb900c26f48dbf0f3d668d3b890c4a82a18dc94dea4288fcbd7dac1636c30b4e8f8688829dd54988972f72e20212ff39e1fa37b9846745369e45a061c34dc571f4301cd90ca88606606a7f88c63f9b393aed07326b05239f2a19faa893175c2954f30dafaa7c6996a1d24a2bb87a4fee6dab56eb218039f7443558f4193e9f505ecec37374ee61a326c37d43d7e08610685d5cf9d3f1a75350ab56a9cae0d1aa2e2340ef8cf48cbf82b8d148e6e95198293f720f6e6d32c70130d5adb65fa7feb82e330576d32e8febf486005d816973b596d471c416150d4d11e61c6a7f5d08bdc21cf7556b7a1dc4fb5aa46b34cde4de6dc9b98dadb407efae7fbce647838f7c71b6ff00750c86a86c86d02af1e6e53616e651bc0fb904e758577b82940d242dd89d7d357c0cb232756f4275e1774a75a78173fb1618b6518356e1517fcf4798a97c7d36ed77c1489d807dce31621bdc3c75ca2c67741cd4c3d0c94edb1199652271c57e8538591bcf091df43215712fe87e3cce200b0a6c295272d88482711e96044e33e3cc3b9f34bc21f0c92d069a1170af46287d291da961bfb0efb1133db58a35a44acebc9d468c5e102766df684dad5416a84f949d72713ac982e5f0a015daee1675e40ad16e1e05ca9450bfe8504e581aa258299a0d896b0485fb58ddf2e10f541abbc97a999e4131c9b5ca8ce4a77b074d6cc533d4f9b39521ceee68f9a81f23a5a75cbf25a9f2409ddaac3675c717a077826432ac715d99e70645f7cecc075cfbf92f46c9725f114247ba87d5b2ed171909f03da7e7400f3146764497dc8be7f5a411e40bffe668355798605be204bc4ccac93a8d1eaabcd3e0a241be898ffe9e1fb6eb4ecb3d2f863dcb97723802e56403", "5351656a5353", 0, -2018095024, 1537743641, "2a8d39fd551d27f9c6d8997d9f7a0bbcc56110694a0e5f66331d017f27f6695d"], - ["030000807082c40303ce9e15cc48db5b02b1648e99c0c139db75bb8a0205eb0289a932e6fae546a2b0020000000251acffffffff4b7c4171c6157526c013f95e0dad0e1e786236a729600f5499a4af035f6a19c80200000005536a65536a6436e8d27e69da74c242eae4840036d42b32c4eac63424016de06d5792bf3bc43f0252e400000000090051acac005200526539e265c80322d24504000000000153ec06a6000000000000c02cbe0000000000056a63536365a3d28be3000000000300000000000000007869880500000000d18a0e01cea3304f1ee450668e3fe7e1c963c8625cda815201d4703a89165a56addfedb4cbcbf428235a4a2c44e17cdc7f3c02409de5df1dc51c288420a461b9d52dcd0a32d802f4209b8cb450095bcdaff102efcb4d9518ae2ef51ad6bb3c81000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fb7bf96fb39573f166799da3f8a48b7ccc5624c44b382f8537c0111fd45c754bed683fd76a8c8244c95b1eebfb7e3d444034c575eb92e6be5404eca30a58dedda271a1c289c3616c7915ce4d365b66c5c2c64bc05e1e540a5aaa2c8407eae564e72b791ae4a73414057e9211f8b42d5c4348014b02904e71a4dcbbe83fd33de021555e323fc575b094eab89bb41b474ee42e0c49a2f4bf3b2465b739412a4f96103189f483eb87525e6822578352c89869e6e509216daf427ef68b2c6b3eb803ed60b02c007ca259b4c4bb0e979d50edb5292948f616ca9fc240bef37cb014a07cd0416dabc823c862a97501673e868a2fb1b6aacedc44a400de1a72f0733e7f278a1020a3e00e6c8ccc04d9ac8ea6dcad4737237b87c8bc52659dc295e1efe7e3bf6b503281f21903a30170bd450cd89c05d48050587782f2abb76740b223d395b025056032f7bd0833f971423f1f208799fc97f66986d830719c007dd064e06096b52608f020cb3abddd831471ef8a0b340af47399e9f6a91d441e7d3005ecbfa344279cf7d032d043304ac70fe8c1ab251dc4a2c83fd3927e5e18aef253ab5a49c4eebc5803e9d039dfc0c51e63cfeccc76fc9b6d234117bd21fb97ad1516f4a01de3f8b66103ddf1406ffc0178844cf64d9f11c3fc6a101d1836ad80dc52832e742e525c89ee652d8b0636ead2ed7048489c9b2152414f047b1fdbf27db6fe6f29264bfd625d814fa72ab97d6c10325ec42224275bb466dc3de80e66301aa9c31c51b3851fa8c8ae0ca2212403c319f615ac40835c55f1e2bdaacc239bf5928980471b4a7d9271f36f452e273aa4eefcd5bd7a22de31773826167e431b4cc0fa8b6f636c41477dadd44e850375504bbae26118557ae9dcf8849c9f06d76432fe82b4c4f311c615b4b9324d337e0cc46b1bb7f85b45abc7f93b768f88d64913750c71c2c967ac1a6280d315855d2d64a330053bf25cc7d7c9540071611c220c22c2685785c16c6643844b02391a00bc87b8c529af44246af3cf69a4d75c03d42b845387469317d6b0582e4e263dffe3589db68c77e42358b391a4aa0cbe120eb083913ae11c2d45d858dae4e84ddbe455d3e75310b99bf069ff70d2a2199dbe91a2e124b9222475a69f5f202ad1ebadd8d275c87ef855fc1b18e9025a263743fcd0094d21df7b6406bbaaa742d295bc274309623ecc332053ef53c5072bfb7f59e607b9feef46502e95f0601f0f552d56450c535b56c819c4c64c20aec1eac6d7f6351dc3a15388c7d56fa97f568b92313b60d08ad9b3bc92837120df2a8ab96e5cf6cc1cfb4013dd09375687922686f396dcb46a58bd5670eaf262df1fb1c39423b1c7ea79281d67352755f9d176696e5f8e1eba1b25df5ea46720034ac8dfc061aee95386f23b4d0e26d90eb1ea88c1d2c40017b4dae107890cd40fd7d3b6d004b908476d2917095c026184641412842fc10708d21010818c0e4663ad93d9fb9c2533f59b47c9804a1ac70445c125eac8d9dbdbb3520f6cbb7a496d35d2588928bcc14d427ee15418c5b51b743fa6d7324375f6dd7af0e4db19171326046772594dfd2221cff7629ce6cba411fc8faea382c8870373283680491d716d6ab825a9669d2cf0baf03b2af851094eb6fad00a50b8dca323b1f4cef9d31950e7a5568298269d03ed99f5d2bca6f63d5c03f178797f256f972cce0bbaff2e6408c01b61ee37e77b7218973476e41e9534067f4af2463c5bb037a8da9084ddfad755d1f8525baf972cb1ec30d4585d71e0a3f284b15ee647f6aa2dbae1a59e20e4fdac9723d0e44782bcfbc7f503d47ca86fd72e7a0676d8b8a2e280f8883589f0ae26d09237077d4ac0513235f5e438135007e79ae8154425938559ec1e5ce95b86d0bb5624493ed2209a50260cd4d8fdf95ac72b582c4714a4746ea24394625844ef5b76c7e1d0282ba528f5f6edc675d600c41cc541dbf8c3ddd9a4c4a5d062dd6ca2609f9ac71d019be3504a547442c74b9d9d3b3465d7816bd320b17770842bf9313802e5f10e67df3da6b2d2322f72d9b438ec5dbef4875cb3c5940d6f594f09e8003e8dd2df8a4ca69042e242fc5d3b4e473f11158f6c14fd527011d954ef901fb834fce4fbb0695c454421f609aa13bf6699a4088102bc2790024ca4bb6a430a5c5c83e307651141fc0c9f0f0bb6139e0fb73871a09ef9fb47e3a84de7895decd3badd31a5e2c466773339523d7ea7bb5af558471df927c12a3dc3840d411fd3f21725813d3dc4f3e09a9f29079ab130b0a9a0de7de8bbdc9ed010000000000000000000000000b6b53b48779b976521679872b16457b25d225518702b0f92a9c607c76a0c1f6c179f31458ee44967dc2d80020d31fb836fc7c9fd8716732850168ad5ed867944560d8dcdde79d6ac310c45f0e5a5282c25eb3305f02c9dc50e438a2e3607f44000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006036c5ffbae073b47ef13824c75437d5d476df33595c820fa8ba642c14fc6b37a228c641ce5e36edf32fc8f4872e1f6a421f4d1b6231069529bd6867d5e99c21a984a132588f2bc6231416a357b23fc9df58853c7df47b7e8e8e77eae0ef74e82096c2909aa465f7df8f85d74fb606b359cd6d2163ac85ebbc8c1ff63d75eb1f0204dca648d5e189bc5b9f23f8b035d0ce087d97bafc411d867aa3a8e69abc36b2032ff50e0ef36c986a569b4f5af7fe7ce18ed5af9d482f74ddca5237f1b75e2db70a03eadd18014f1ecc9aaa45786d717efbab32352f012a757269d05bb826c46128149784003b38bb035684e5833ef88971a4ba4449a6a14b337dfd7757112640770318a671404955d2a018cb6abe903408d514802b5e8224591182e438afc98e44d60311997e3c5ecc374265b3701ff7f0909dc0827b01b266ec829ffc105664efb3a80208dd974ba23af06ca99f949b7d92444892f6dd83bb58d929111596d6dbbbfb6c02035ce4d74462f825b53fc2d1fb6801ab4da26f3484af47b6784db48cd8af03300322fbab72e75328ddf68c0bf004a54ff2448fb08a36eb2e3d89cadb2aadad3886e35a3f2b6ea01035a1c25ee8d01b3f017b19d13fc9599794672ffaedf4e8f348a473520aab5fa401d61c35631fb63e2c61d87996dc79c5165af4591cab2143884cc9deb21654dabe298dfcb2065e97dc033cf153b8c583b7b0919c343cb7a6722f455bde1ac91367b5cf833f38f0bcb7b7ad8b79a1a086f36a4670722581c3ae821bc4b8ea17986839229fad91060660f87fd62eef8e2f7cd3844dcb839aaec2fed0664f910ba8fd8255c53201c887e83bf994f084fd0dcf52db26625090dc62b16265c1c083fe45416f6ebd005d9fb845ad6320decce5456578a6088a6a6c59d5a9f5458128c6c99204ef88536ed9d9b118d047801f42c63023241f7eb5ab1f43b04894e46d88b08a6fc6253d034355d2c4a535325b5e7f1668300632d1b2542d4c7b04bc637774bda02dc77e8f4a21ecdf722ed25b13ae252690a659182c18671eb8401995e20135a266a91c18bfbfcab89b2ed9d6734735e322e8c0dcf1fb111bf2d374be8ace7893ecc041c76ca6cab4211f68b3c421d8c25ddeff177a8e94cfb6e150d0a7683ef6c14c5884444f7f0f97cdb82f7ddb0bc6d2eda1a99a35c67cdfd63c689ac22dd7728c988c34572a6de3ea7dd4cdc39858d395a6c56cdee09e4e86df10665ff76aaad434790640539cbe79d55c7047fe8d72707b7c58ff76a98f6492a76fdbc35ae6b1dbda5351df67467d4ddec71d5bea76f027b4db21f08ed7b1b9944ced2c64516ce712072a30198ac086af9f1927e8fac8b57fc0842c09f33cc71f13732a4a70229613909c780700735cbe75f0bc49dadbe13347fd73bcd2dbc552c90dce0c95ec98bf023e143f1f1ecc2d1d13a53ce030515f64ac522072684382049f8d2979eb31e9856567bfa3f1403875cd88166eda0463983a4b37087dfba4f54af7bc065bf12c8cda82834f4627c0fca11a5e45a0f0f96b6e10d86498535677a9d61f44ad21b7c3c7c21c6beff65fe051e8f254b144d5874d44d76ac146e775b8dbf6b567e937fe0c64ae41a19f6f40ebcb97730a225c79b3f8c6da0a3b112ca764a9fc53fdececcbc486d120b26ab284ae4bf2d86640dcc8a2ad18976fcae202d4e434aede623bb06a8d9a21bb2cd2de7006c1ce1e2570f837657200847b6e12cc074e3187328d6983515bf7fe3522cf74dda17de9a81c505e32dfca7aa5e4f6af13938102da83efb9e3ce635d9e47e69786acb47526328a488bd2dd75de8c8c455ed850142d15b3a34be540046452b064ca7bdb156407233db1dbd5df3f252f43f3d816d5cc5ef32be12a1087013534a1c793bc7a4219ea097bcc109a83c9a6ce477d36e40a91c5a30aaca9e42cb328e286734cb404a4f28e9d6f399cd81076335e637d9d6350059b47a8938c56a2c05b7bde5333eebf4be94bf88b59f70bf481aca33d893592fc5777dd821aec35521b4ff97cdfad9cb02794e83ef8abf64e1530c9110076e4971dff737e45722bc9b9e86ccc1e7959a65b6e8ff19e8e4cb1b9c2ff19c0835e26cdf92566865d58ab32930b012343edf68dc1f8098dd034a0f7b67661c76fd2005c59393f9233ed62122b16957415e85201fc48d8ecb4d903194e2c15dd5bdc74cdbe1136fcd4cca7dca49abcfbfeb1cb28abbcbc8c0edf2b929a3038a5edab1c3a55e1a8f7af3d14fafea16caa2d8a31fa7950636b8d09055e204f033d56d54b49fb7a2fb4040000000000000000000000006b68da4c3b16d62b9ebf575558b3b8c4ee46926be61b3e4e5a0d990eac7675aa1d0b1bd04e7175ae50ffc97447a121ca1fde08c555f078e29a8eed790f3ada577bee735aaff4f799ebe2c8faa525769bc2b5673902bb693aefa7a57bc009885c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000089101ee39878609537c2a5f91f16f0ebe2b17cfc3a2b8b1dfd443ca72d4b3bc4fc03a85fc6a100f62ce7a288265f88b0bc00adc55b372d15e17ff55a09330eef68dee564d439b02398a72bce52256b69ebfd55953d4e7512980c2f522abb50673a0487a5d2d755090ddd85dfa616727c190cc55c83cdfbc413c37c5ae93da105030cc6a6766b72ea3f8c1dcb7051f6ff6729bb9364c42131e4ace60b845b25bba5021d407e2fd3d3af3b3d9888fc8e7a136f8369f0ef66922f1c4924bcb12d1ee2010b03d967d056a7c901e3ef8debdc8d711c28ba344a051d2bd90e2eff0a021e69da1f55654b3609a5681a1101ceacb887616577b117e2a3a30f57eebfdf777a9f15020f5cb8430b43252c0f378f2a170ded10de130f2b13f59415d3403a149a2ae19b0207ea654ab417b45125c92540db09d260615993ad43d5d3f4f2c34e59c9fae182022a61442e852603a580b1535d43a2b8b9467b415a07904ca6aedeeddddda42cd802048499dd5f3813dcbac0ad106ca5a21dc6a97fa1147b620c177bad1888bea93a020927191094c43089680dd433852cb0110064901b3d53554663dc793b7abadabc354a0da4b9660c4670ad22b929cc86bda96037f6b046e309b09ce5fc062f5b14b5be097002f293badfbfbbef9cd50d6d9fb3bb3bd8fbfc30bf36563eda6b1fb2b1edfd98b124f98f66ab3f2be2a95902adf2bc2767c7b9e15c1d489c28de40fe221408f223848de2c50f29b68c7a308a5b10401bbb7a647e9473939be56901b68ff6402f5cb687212072e138b2928643bc5b00baa7e858fbb4eee63bf78860ebd006e10a6932d5c0ae17e0e4335bd490db6c3f20c2cef50c8a2c2b83da6e68bb83cf87fd1f1ef353cc7f6b14dc017d5a01f6cbe6a7cca4fb309517b3a9527ea17c291f49b8410cf310556d8f660ac2cb1c7b9a6e6e27616e1dcca54455031efda53caf3bafbb8178bc6bb5cd6d261d3bd8c5bd3031107bafb556c34fe63690989037b17db05afe90bf827409b3e9648a6a74b7579092f653964a6ca8e7c4f8a9fc20fb4ba61a9e8b7c5740d321a0ed090ebbe1427465c4dfed26f23aec60862f15ade410e6a43d33b5a7e285a219a81edf835f5efdf13cdc13fc693bd1c52436db16d8485927392d00ae983208311627fd315a81a788d398837a390bff2832c61a2de9e63c48fc697d28d9df1c81f541ca4bdd3622ad01f56ed3d7e8e303e6939ef7d9a9565479e418fefd887d152c61c04997968cf2c95bad8190c3be4c57b936b31b7ced3251c30844efda4d3097c99132e13c105d9246c2bf95b57dbd040edcb93075c165ed84f051b2c999769108399937e5c48ab596466ca83bec2c5424b994a1d5579b0689532493ecab3e05099580875554c2f928b9d2f9c258d051f11176da6d5e987c3234ac17876ab7883ba88a459c968bc066e9eb0960dc2f7db95a7ed3dddd6fb61f4ec9484d5fc704af242f5adfba394aeab3f5a60f4d05506d995b1d30481ea5047df160ac285cc5a520323b91799d4f5034d26634acde841feb0a013854025710c48fdd1cdf35b0fd6cae797bba825b31381f0e13c01ce8a1b5de2cf7ff23ebbfccbb17c4bbb8f486b49adc93f53942c5e963faa1881141d0833fd39d9d471c2f36a904af7fe608b9eeee885be3a35056204d4da4045a8ea12bb6215b2b1a9e9477022bf5e9504c2312066d7e1c9187b84ff7da8eb0087fa3e13027c31fb162245815236d5e2b22c06e5ca6f09b6f2df2db1c8c8afe054a6f762fb48edf05e29ce40729581ad8ece39cb345844c607a766727b0ede8be75c07e4760370c5029390ae32edcb9802dba0af39ea51014037e9c0a359c7875299824887d5ac13a7aeac6b4c434063d5a74fb68d59f9bdad76d3d1a91e2bf56efc6efe8bd6880b41237bd23521d549a432e566938d2ae93e6cd0d7aac245e7d589a0ca42f1e004f47f44ef312f34f5fb1c6d07bb07d47d2f192d7c527a414b8bd90b8496280d5e74be213ec74589c93fdbc7f41f56f17066d4d0c7ee59cde6395a0f9892c9201b69155d0be0c7ed69e741d2d2ea3c2c51f0dfc6f409746bfea3ec583cf2ff79e3deaa777a35fbb9b267eefe2227eba06fb4bc9cc3e0bc97a36fc93bb0d09c70f19f0a3c284673e42c360e82c890087373f6379897e8fd31e520016ce8a5ba75310ac95d7f37184efc5d3362b6782fc88818eaf23d446459631e69dfc6e096a91060a74b3f973c3c29d18322cdd8e5834cb2b9554d9f59cf141915fcfb35c2d389bbed12092423fba1ca6aa35cf1d53c655e4798681eb44a069e6f1f85529729ac67da0d5b273710b5a33c19ed6da371b233a6757edc52dc44da9fbc16e63c121899ec905ed5ed1ee618175b0883bfb2000cadbdf82f3eb2d91b220863a198cb5e31515811e40424118d7605d02", "6a65635352", 1, -1163512439, 1537743641, "c2ef2187156f269483e1f53b49f9adee4ff9d516740593fa392d14af9d401bc1"], - ["9b2bf22b03f099fe42f8b421cf0d5bf6687f670d0682122c88a76d7269afc0027b5a331f10020000000700535153515200ffffffffd64a21f318c5091b657a0ace47985fd92941f32d4af93a35a50db637fb69af4e030000000151ffffffff60372be77d29308c5126f1d6809fcb5f22aec8570ad525a3a2baf80f0ea0b4900100000009655151516551636a65ffffffff02fe9c1804000000000452ac656aa895fd0000000000000000000001ebb6e605000000000000000000000000205f570ff956ade2f6b5b7977820ad7bfc6d1220cd77127654971979b121edecbc18825d096e36818d0f0dc8bf005fedad149e07babd2666db1839b2338cced6dac663b2d55ee29063f77d452cac9c900e60f2e329c98e654ef1d62adb654cc800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000450e5ccc797c7256dcf1d6def5c5033b425afe84e819092193a010054227a8a4b9a343350ffa55b17fa8fa8be755968d9af4ffb555669a64ef817387acf90b86c365fc5f17d04da0b20e0ae474a7bd1b209fa5d9c9150266a2d6881c1f55ef0226cc4eae753685ca00ca0d573efa808f0dbf9ec31400c160fea6c46e3c87c517030b37a70965c7cb29c20420d50f1c81a7089ccec25196388ef497f88ec8c387f9031305a1b0b6e5d8115d11e276e03e78fcfa4725b750e6c96a70c0435d9eb1f5530a07730ba3414b6583824199bf733c1dc5489067b64f9cb2a08c42589a1d983a443a8916c24f855dea5ed736e5d5054ca1ee2456c1a395f58c5e7e39355ff31355031f84ed4c8cad8da7927a3158387ef6224104fc1b32bee465452f3dc21a6bd5d6022b365dfb468c797dcf9efb9962c19bb79d7fa44d8191178d4f62c0206a568dca0323f18f7151d911f63c632a88cfb60b02100065130755d8c2420ef72588ad30dd032cc2155497445c39ba267c74b653d0e817213efabc5145807c93fc93fdb72d14031093f7cf6ce9f5b274f2f24cb049020288a36a8e767d0e10b971774ad71fdd82038c118c8811741ac12c35f9da3b706ab0dcd34e099436a54f6f6ccf5bda60c366c5398a1edb81663eefcf79be245cd926bb64e172e5f19b56c6616d2043368d5448f141c66bcbce5ad3ba608c3e5d22fb704845404ab669083ac5d65ba0a2bb149cd2bfca15ee339967337ef991d64077a61670b015be8343ae92ec00037be0790a8194bc38bc398187f0afa045782dcc5552c26f8e902b70a78261928d59fa6191d2563e7f6bc3408150f0a7e6d71349faf75e5b85046cfe88055afd5d3ee28c60caa0788ca2871c73f6d121ef1e43aabb625df1c44df0781748fb1929746e2b1586c2eb5c8d2df59d3b31dab4cc49af0e9db2fcb64b3c694b1821ef9f764bc83f1d5b33828240e3a33aef418d98a98cd1a3cecaa8327b4254db3318a5172536b1684081c9f765652c1a06ba22e1fbf7151d4da0979cda70ae008c1acb68127f75b3a3b4f388acb98145f9018eff8b2a0dcf735cda25ead75b2d7b6d811b4664f3e81b44233940caea844eeb990eeb755dd574cb9711ef7dfd81df7cae0daa5e0357e1106a8edf67057d69e22d55887a573d0117139f076c7ca49714f45c7721b0c7981dbd96951dcba162b9ea9d40a09de853c6333d0b55d07d31cb5d4975fc46a59ceac4280fa78d3ff2e650f09943ee77daea0efa1e80c1ea6c6627505411fe5174fd7a11d97ffc142fd3fa19b3472162fa88f4d9f0a7a68b9e103297bd1c9b2169b73a9843922b120145eea04fbe105b2dc42a3ac92aa9451b7682b921a6a89bcbeccd6af84b82c4772c64a85faea351d2b18d2d8fb7973bc4f2ab7ed8ac028ee14f6c7909ee487ae823ed3b996c5b2cbc06599746a46eb14629c5aa069c3dc07634ab4a3b6829a5e66c46e5d9b875a926f694c4b57e60d16782a6d2e240b3f068ee420e4f436651b29558400f70923670b1f38fbe1549bc5dfb2a14c9a75cfb697334080820712bea4bec0517efa48f29e88b6285659e182553081a989ee9bd070250d9efbca24db3c7223d5ca9f5390f1e7df26664fac0495aea95c1da1273ba9d76499d422e23be66031bb39dd2c6df8054ac8f901ab6309240eb3f45bed1f6789ad43940f92466cc7ce710da6d16c84195e63aa8dbd6d604b67c44313e18afd88dc19186407b575cd8dbf620cb490e82942a911864b91a2bfab2137ee75c01803035bfeca12cfbb9415aa9918e282b2552b81325e2ed711dd096dfc863e5ff1d8a2786b7feeb6b354a5671eec170b362433b02be301ec4d956e8286208f6c499ec7881908649defb2b3e65cb5f6d9d05a843125ee6915eaa401faa24266b7e00b2ab5e6957e3ee722afba0ce113b522af97f2e20b3d38889a49ca00301b1f417bfd40a2cce4c11a3450219375043f88c451d3f2de8885251a1d35c4695c0fbe2f492f00f23bdc3debbe79fc7bfbfffc869fef866d218a9cd28ba3586e628ce7a631d467d3343e97b4b055f45d68679305ec3b7f999199e8730c62330b5aa17bcb674e6e2269410d14b90dd13142f655d357d03d0c49d638fced6d932c6b959bf811369f413726e40eef08a9a72033a5d1b74daa3879bbbc17308728fe76f6bd783b421e11dcfee6d352c4bd65614f041aa0323523b90d152d00d19d7539e270f170e7c1b4c487bf9c239c2cc03bd2646cc3c78d6322d7730c177c4d748afddc12c3725fe9b58680ee695738208c78912f94f87b5887137eac0a19b8d7db358cc0c2e03249b6e84fcd1df9ac417c1a4ad58c11b01e443d8696e1cc0d3fdae4f11cc32931bb6eac5cfa233bff1831190ca656f714f82e3941164cf89a4a9b5d9d0260fe91ed23468e5c4575a3c0f", "ac63", 1, 786336351, 1537743641, "86eb3a0172b317c1edfa4a52e0fd5c98f7a55cd434c1496714f6b45dd898b1be"], - ["2cf9236b011507ae2dfaa54f753bc302e7bef66cc9b359bd5e6a582bec7850334e4eade68c030000000465ac6a52ffffffff03eba3fb020000000009525263536a6365006abd43bd04000000000453006a51ffa3bb0200000000026a53404fdf6a010000000000000000f8980d050000000094d90559b90bdecfc513e57c0f05a8ff8275068f6cc11fda3626a97b4c5b328ec52ea6c50cad175764a42bad4fdae7d29c563939aa078641e133e5306888cf3e476b29fbea9f795bd8acaa50d0d43eba86f1da21b23ce0ece7716d45ee82e9d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eec0fee2e305b8dc75ed21858085850db472f5512cc49d2159558b72fe7d987b6f8d0063b36ac7eae9e69cdd86831904031859cece1f16ca672a9e1d8d15fcf764c14052fce226499259797079cb6b35ebf08b2068a5207c2b8c875e9f53640b07abb61e0723131750f0656b6effb006267ea7c5087ff29d1efe6121dcad774d0300f3e601d992fb39a4baeb4f3c300945d122cc1223399133352fbd70088ed88f02052d5f082a41d344c5a2869e2fa6b46ba2ccd30ee77e88ce11c22484079604230a02778545459786cc80346c552495b8e5d16f7bf3caf24a0af911c975f367dcd0b08691eb42cceaf5daf46ace4c34d2d0c7dae6e9f2e86684f596e18d9623b85f0306aacea033cb0c6d242f83fe63913bc200bba5720d5f33a741330c4b761fb7710305a991a6563376049f09993420008753621e4edcc19f96ff669cce61235ee045031dc7c41eb88006b2cf614eaac2355c5122e5b04218831f97ad055e4c6effd68c0222b3ca7fbd62387e795e2ff18b507c8df1f1db9d2e648566ed30da937cae6486030b4b6f4762ea483ae7d4caa5f9ae2deb029fee8205bb8a799866cc9d4b756c3faaa5c3caa20d4cca04d6a38cb804367428880c7a40e54c6428434a329145d82c052e612f91c0f0ca2ca51df746f57cba47eb4e991255ba6d7b5cdf1114bb0ddc309ebe1b94ea66048e2e54e1a54df3327f4cfbec509362e12d346aaefee74404913a0200a27180c7822c333c96148b5596499e8b11bcd67b6554f09be227143b5ffb28e8eec467a39e9b58dcebd4945e63f3b67d743e7a68c8416380c1bfe5155eb3c45c83827ac839586cef185444020477f0a5c741f50142c5760b4c9c6f8796c929c93d5c1b35341c9bade434cebf762b850ec042872f6307d95373a5d3d141d9d1b88751ea3cc766b45819a5ca8069e9dc40fbd78e223d8ea00a173b00a567c97c7384a6749b5ca6a631e47067ab902d9f1fe30250cb5b2ce0f5e823d9ad054084ff02d8ec1f658041b003a63d0ebc61ddc77a4e8bd66455a3a74a4b9405228368e25ac726179685fa7fe9b7170d20bc650b2cfc676a115b6fc63f9ecf953264ffe06786cc3fd283d699a4108a1ce959ed02163edec7ec4266dff00418f089f1e8a7dc27ab3842e1800a8e91027c456704cbbb45ba6e6b495f938792a61324cf8becbdb3908ad63e036e62e48ec23cd2b592f719e404b9db8e6956b0b45934a57c874e88449fbf25320a7f293bb54317ee59a3cf41715e8651d0a060747d905432f5227405fd294ea2e8b5309c5045a1510a6704241e03e7ceb6d83d2b9fc6f8a42b869a9938eb10c5f58e1ce672b4de6a53902994c2290b4a6126c76f59546f64f1bda0c23b6001e2b705f6673a7953fe4bcf19a738ad5f29e3dd655a8f490d81ef7106332c8ba2842745810f88bd5d5b7da38c75a74eef3d417fbabe5379c5cc1d7561dae1af7d29f50e908eb07469353bf546f16e36872b3e3b4705f332179c714d604cd4c13291cf0a5933a39be7c70abd9f1866252122eeac9932a272256e9002c7dac6e83fd058676a12f5c1e850142fc10999d36d754824a9beedaa8488dd8911a516e0b47415c2a97fb6d55c994123f61c2d5e5450f39de8c603acc5ee80d1f1b126c0416c1cf206ff86b7278fdfac6174200517997d5035ae5623badd0ecc0cfc894b64fde85c0a83b324f2612da18c7c5b9206988af36387b4c1e8afbe2130d46d94940d011cf9b4a5f906d8c4039cdf08e1c695e9ad248d1e4352bb9ddff984990067409e1e6a9262c96a3f9e111bc1e2bf2eb5b9716ca964ff916c77eaed02ebade37794c4e5663a19d7652f5370653bde10aed771d455f5ec5fb9551e4135785b9f074682a8c3fb4b30bdd7c6f0ea43b751833eb9255c3a4096b27dede98a277de780a38b06754c293964e17d4bc1b1cccda2071227a839b6de36b4009cc430d52710a4c254f1d19d8e5bf4245b6a79bc24d11edff32b464af5411c78099c06d2dccf1a4752cba49637d14df7df0279121327ff6502731b34bbf420b5ec689e109265d2d1fd22cda46730a59ab78eefbb3d17386bfb0a4bbd7b55704364f882c6eb858ac5b9c52e9cd04acfa316d30cad5cc4b1ea9a4c95ee5d8e856f68a4af840172dc837ddcda6d11dfa9adcc471d56430eda383f4cedba74b538a01dcb63964d89dac205d7a26d50cc7e32a87759bdf4a7bd7b14926ea5f69e48ca7e91ba99fc4ae56302d9c6657280dd414edd6a8fc1e83c2cb30ac985394256ab54ae200b5bc95942dbe5e5ee589510c1613bfd0be60ac75bf8e0bae1f6971c39e3b85751140e279df435f13dba61b49a9a638d9e5efc7b83ab52c211e1fffa3050a02225d81c0c14dd9322eefda7c5d594c76d965610f68fbb031d15a53e3b6fa141ade4f9e2c023e25d6ed60c", "53ac6a6a", 0, 1334811215, 1537743641, "bf7ae9b757944a784e248d57221ac773acbe457b5c166d2952610e4d8e955ee7"], - ["030000807082c403028dda02a8e06d2568475b4a32bf7e93e87a75d9a65e895e909f75c66b8d1444070200000001acffffffff530f3b310f25d04599c310b6146e395154537e5c65c12b128a4d38e985f0284e0000000003536a52a9e7e9f6010af9f7030000000004530065007c517f7a00000000021b98be050000000000000000000000001fb37b9ed63b4ff19a1c16d60865c69313dafb6bb31f77a2bd5deefac16a8fb3bdc3104924393ba53f3b529d2db16c1ead9e30d45b1c43a020a55581cd91d6572dd927bbfd018f6a8da1895c5139b52cc1b055b9928871bf279c19ac549c40cc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070da99d2623f9a10295a5fcaf2e71112663d9c21516b884b7cab9a9ff4123bd4888b7f9c45f5429db02694b3f8076f8969a2d7648c56436ecbf685f7f931a99d56678cf25014ee761878b6b3d606cc994214150fe8526410a8671cc970f188694ebe21d32b039c0eff67a69a2de9609a478ecc7e86cf8c55f34b2ff2525972cc021ecd6164d3e9a199d05f0095a2c774a09724b9466f366821204bbf5e4b7622e8022ecbd93621cbc481ccecb1642a29e20692bd4b235f6095e227d99e8354c9d5010a07cea20ce202c242af7fbcb7f57c385a39dc522139a57a99310e3b3818ffb03899743b1aad5928a073e115957638e5254c1dd2d64444ece6386127a964e5fc60032ad6d796a1019f079898130f224a6da8962212a106775f8376725f8a740c369d030a8ab881cd1549ea3ff9de071002552d1843ee0dd01ff242b3c281204654c1f20203474221d8e6197cc6074652a12b0c659615bea82ad2547751cf00200c0e92150303640b3c6931432772ca1498ee39faf7df9e88bdb6692fda57ff1921c5256457022bc22fc515e0153b2af6f580939f3b4b8c6c033888843817cfc5dc590c528acde14a54ad997069456224473848666fb83d706e4e540a510664a601abe61db49fe0bf097ffb8423528f751de7e9f4e658eedca303dd5fa96002daa6ae0783af7b9b6398be09c9aeccc1f4157b3bf83069b945cb4b3de6001b0b8069dee3e25bdd79dbb597bfebe0e7c934f1b972938f7f96df2bed8fd67b5c18c4606da6cfb4de3210ad5df292f83458154dcb6b1464a115e447ee47d30cafac6b30ecc827632f3b56fb9d042c2a7204b5e6e90c223557b58c3aecc76603bebb7918975ae1a46ee84e87f27e803ebd95a0d7e78a0aeb12154a158da360006ad84c36869f0c66e5383f830189e2766f68adf6ef9418e37d58cab4897237453983f2ee60e76ecc6571ce4c5fe3ac6577f59b14e1093c94de180dc6220887c0d7e5781180c9a8121e2006318c4d915f79ded5e4afa5550a2bdd7f300059ec230fb6f232d464b7ffa86f018444017a2117844a05dbbe13bb2f1019ded5025651888ddce9fd9c97b41aeeafd043c8184277512eb9193baa185be6337fa59f41124c56b8b61045d5c409ad892d6a19474134ab8ecfc5c3984b4c0b690eff83b098ef16339d39b9c385acb65d53800e187903b0cff2a690eb6509c0879de87716fd2896582373626377d54dd5c627c929d9d7d730ad6f7778d2f4b5b39817f582a7362d03490d05c7557760cb7c9ae120a5825c444a6fb7dca95a11c6fab5bb871becf8f995dcbdbce50cdaf9e6cd82d6e7b0949b9d0a02cb53c5dd7264c12db982c57eb61537e902683b9b8d72424e6885669094f5d8b317bf8f25a3508733291a90aaf804024761641b50a10bf7db4d4763114ec42c0bc23b08eda1d7b52331b1cb305d9439adf8e056a0b9eecc6a894474886ab3dc3719a779f50d9b9242705f9e9bd11ed54c91aed3c34270bf34496ab3ab186495ab11c693ab992031b4ce5b18800e99d1e306e65700edc1b5f597a743351fccd8bef2f07a3037d412f85d06dd6133c6c67fd13fec29f1507d51ebef831ac61619fd496fee599fb3a7ebafa784fb74fcbf012c6a7dde9295af8ded787584f8c9a3abd0b1a5084d540f54017546fc77bdf94c3fdf4500efbd73367964031ce63d1a9661aa1f797cc23e52f173da83594725e267cec9b323d075f5332adde6043284005125e3119fc0466f58ad53aaf15ce8510e5b006557665ff9b402fa82a594dc0f8c46a33cd40234657660a7edad1bda32f7625c2a9ffc55a097ac7047dbfa62cbd48f816f3b8b59984416bab873ba35b7e81ca0afdf1cfa8c8860ed50d33dd87ffeb6a0052ba78854e7bf39ead4a461543c4a17528a4807875e3d4ea82ee60154d5b2b79c1ece907755a3fcf2f24097e6d9429221b0eb6e2e02472786ec0ba732d0ad241056276bbd49f6ae873a674d16b513ec662c1d5be253fd20b389cd50d9ea090094d4fdace080ca1c33269b820f29637c45edefa85d685d92bafa337ff3ef4e09951bd8b47903cb26ad2ecaafdf6957912762ec307e10f9774f5d97f39824ff2e9f1b730c3474392e4bdb8edd10e0926d62b49997ae2e16f9cf272514ba0418e7952f392f00e07c08d06fa23adea5359c283bde5b0c5f50e6f30cb6abf7f5820157e2da5b6e95742836524da496445aa5d59020b573def9e29c82158825baf21177ca525b5312150dce380a06658e2ddd25266ced0440a58878ae66716e36f59c07120000000000000000c1a5e60200000000339f91246772eef35f36b9f2e8efce16deea8c5c1b784b6724d3cea6be1bc14376a4c362dd55226307bbed325a985a87706ae42e1354db446066a5f45d01de0f4294a88ebc6c3d9288b8297c53779c3d8f0372780ea3456405e0d385561f13fe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016d8f37d2eb5d8a1c94d085fc9706192f8aa2db22e35aa70853a7b97da1a8c96e96dde32d66218c40566b175fa6f5af165252150dd6cc1082330b66d73f222d5c5ba45d1a9e6eae467dba32860ba03d688568c9503acd811c4655b7893e3fcc5e1c682fa6e17741c897b8de0d307d16a9863282a988ad275e2e3f458afcd80b80318dba821cdefa8283c5d81956e947b523be89b1529cd0751367000772aef78f20303c8c3aa8aa70ce5c619fcd6c626f202112ba77e3b36c8f0d4b1e2d83c0fbbb30b03328abe137dc3537e1d9ad94d13fa8b5f06769548e4f5601f57743e875ac54beaeb3d7e38ab6cbd7dd787b9468e28d7ea798ece58be15d1f5b357917ce3e293031f295c170f6cfa785847069e69883af985e960ff606739db6a1cec5a50af46ea0322d799b086386e0c0eb4e2fa2c8f7b39f34df3ef76e7ba420ab3c1ab8733a737021510b1712d23038bd3d11256f38f38c4b5b978a5fef8cf67adc82fff8d8a48730307b59c94234dfc5b775d27d5dcfe180bb9e6e57d8c58564b4299a0a9044f89c302132b659e7df5d2718c8f6f8afe2073fcc560f1511fd4fac0855cb77f2f53038c81c54aa6ac3e9b543e6d49cd23e09192bc5aed33767d901907e08ad82c4e894c72c856f880de5f42e85af3f266b0e63ccda495d2fb0ab34e1327e1bffd16e9da611792578fdf69e31149f7768628a3e37405011da5aba6038ee90466180982832bfc5b524135b542318ec3057238f3781c22a5f73c637b8dfa36e9ba69cb60381c7542d48108bcf9c594899fb68bada039c2c90ca08b6a3e037a158b61eceb28daafda9ad98047d90a4ce3e2589df49954d25ef464d6e98841432909cc9d60d8f2d9f98ce4144de216dce99b7b167e863fe2645fc2c26ca47a6bb113ca3477e0222399ad16bb8be281e71b36ae1b4dc69f584595ddb0d896f6471d6a16f8f7788136ba7590ff3cb1fcffbb845b4127813a29a8a8533839fd9903e816a9a891104aab0d99cd13fedb80e57e79dba89a2cac425346fc58ea2a1ff9b533a2abce618a11917fef3981c95ee0ce1dcc3937f5037b92f9d2acc60f5a42c911827c5394ce6621886302a7e2158c1cfbec8c593b9d59d035e4a0bcf0b89f12cde89e57f7b58f4fe898b87b7377bcc75507304d993b7a40b05396c9f30df4701323de2ad8d1bdbfd1172dab439b4f9557f4d36b973889cea2bf7b7d1b3c1e1274d1a1ff87e9c0ed2929837ad729e72f19810a0a6c7017f9ade9de0d21391a5ec2a4d95cbbbaf03f22160efa6c8067c615cd0137bfbec7e6c96111d83a14616afd76cba1e330044431332deeb404fb30693bd5318418f35fe58c48d4f6168d2da1988597399fdbef839af2421098d04ff04ebc259227e2eb0a1fe5a6fc28a0005d6db7c56e0cb6480ba4fe685bce36ae6dad7b645754427320d4e8193f65d207d65378eac07dcd4a92bb485e6c7da19f14e30c417178cb28053802a448e9bc9b7b33fabc8363eba1d182c56cc9c97cdd8814138689a6f82b15fb7e3bdc941577009f7b20abdd13caae19eb668292c591e749dadf24c97d47fdefa52b9f95d95603035d8093395053faefd738994bd1dd567e81a801d45679ff5d7c8ac99a02ebe0f87a3be58a5b208c8372e1be41f5933260e6615de137e61b390fc35fab8f7bd5d022aac5a16470fc53435c977af939283606f5c18008cb5d675cd6680c3c9f2b8e3917959273ba00a0a565f4c832bd0112da7f32a7203831df9d8fa31bca278885f222430ac11afba848dd01a3293929c75163ba15bf0cb40d634936f714435fff39b74fa8f74557242a1fb9d487d2c18faa8bce7d3ec884ef4355a3a19131e604857779e9e45f372ea813d684bdd822842fad8856f25141f08274a090fd55e80b345d6ed254371f993c37cfe75c8ac6122e8efd7ff3583ee0a123dae97ec3a8c7f611ef8f90f99b9082744625a705f61978f90bad2601e7e1e62587001c4430bbc7066c12e979e92541b77c645c51cc6d0ba395c2e829995e9c7f30dfcf862685aedc9961cb078a99246fd6d51dd93fac8acc8e00d0589fbba9fbee1eb7f4bf7a8811745afe0e88a02705c9a492bc9760a24e035a105e13f770c7a76c919167214108a153189e185bb5458c21b2f48f38db8f490c929715df4bec942ec49d8e6376f0a569fb655604cfb5b02bb3d4c0f90bada9e5d1e2205f6d3046ae2bdb7969ae0c6d7f4c1483e68af4d73334e70b37a073fe918245757e143d120c21858dc4274efa80b362e67a5416e405603bac63a1d3f81afe18801b280605d3b6be7f1ea08435235563ea4987b8b83c85f719d8e2e671307bc1aae735479214d9e7da974b9f461b8380bff8060b195d79df5fe61b7dc1f14c2548182795a79f9985c6b5a8a8aa2a2f392f8fbf7ed7b138499310e5eab9ce08", "536a", 1, 619680087, 0, "e4967e2ecc1e0ff0c98e56d772d5a3e7fb2fcfe6e03f092d1d96905c86b0f29d"], - ["030000807082c40303501208f0913c52d8f8897a05aa92767000ae29188bb49e502034896e436f1c5902000000036a636affffffffb0c1adc73af49b20a6b9125bea685b441cef0dee99938beb33ba30d704b72dc10200000001632cb5429005c912c377c9b90babd6370055292549cb55f24d19a577dfdea58502cd2e143a020000000352ac65ffffffff027772cd040000000001ac83723e0300000000056a63ac630000000000e1b9c8b800", "0000ac636500", 2, -1658692678, 0, "798649c5223666573a7b7aa2e2d49756ca2526a84bf2b05cf3f0ed254c201233"], - ["030000807082c40303ad4d794407cfe76f61a39b6a97d344afbdc027564f4cec24407c630485d012990000000000ffffffffa93eeff131489d98ef48565707616cae7ffc2d4077493a572a4cda1a83e0e7e700000000076552526a526565ffffffff0e6993e10532e1d28d1904d72b7dda6b3cba596ab9498da2d9a18ad00d9e4f020200000003ac5100ffffffff04d8b25e05000000000352ac6a67271b010000000007ac6a51636a6553c74aca000000000003656551e4a2460100000000045351656a000000006f8566d6010000000000000000a9c1860300000000ce6fe01e696e83e96a69f2daa6807b0844368a59056812a9712c39e5894ff38ded0ba5d650a3bb776dd3a1fb3eb603c5bf4dba5a3acf617f67518e5fb66ea20515f7a712fd80896e1c6cd70b121a6eeb689dbb02d7de79a5d1029e3b32805648000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006fe84a8db9a06c0ed439e322489c715cc1272dbb0ae10649e8ccdd17d2160ff35c98f91ccd53def83be42c54b83d607b392e82ac22653baa70f32bb454b4d9df7f0bcef7ef71cbd947765261aea8f6c4ff25b4b26cfa41fac92d1351ef4e93fa5414c383de48a18b721918f8eb28dcb28e62ae88d26e676b98cd2fef64bccf200217a297fb4da733bbc6e7cca177345fecb303f99c122bbd5ccec548cd0086c0fa0208c7a4aa0738e88919723e6ff50937073fc73b2c16bbdc8ef4eb13285e9fe5520b0815676e4302fd2073a0659186eb01e1240102ecc19909f2362484825c4b76a6666436cbbfbe145b5efbdf353cf2c97e6c97171b9bf45f337ab88b1706bd48ef02118ac575c4226e9cbc7475d96a68154fc3def07019c640b26a8b31476e90ccce0312430f6beac0eecf8ca8b284d1beb03753b5d17ffcedf433b1fda339785c7bf9032546fe29c6497f2674e4695fadaa5a0a1894f92fce75d8fd40655409f4e65d7e0323bd0bf2d28e8ce84e2733425d9bb3a4057f9458aa5999f3a2dd8b3b3189160b021db5598afd2f4dfb0c39eb166dd41b31857b9aa6e7782ce8b42d6bf03725f54cf8d420c14465b6c3cc6d61afcfede4f84236022511d39887d1066354cd9fc9315a41b38fd384811d7e61803bb22cfed859f6e4ba4f394a96939c127074095b517aab4f28f12fb760aa9020854bce54f9aa46aa6824f38d655a58883af3387db5d4a055920a814f340aa80ca37f342b734752b8ca817e237dc96e928e8c13bf8d978ed518c312454ac4e02ef86dfc01a5929f6e50542cf3bb092063e2dcef32213b562eac2873709f121cd8f2dcba9ac79da14c253a40585ce50fbfe7ea2e351f5507faf57f2d581b5bb8cb010c4a27cd3502586a7fd649067b133a741d8b882b661de23780df279bb76abc170a67865f84b37fdfa04e79d8447a7c71056d3bb301ec7a05f2deb526279f56ea5537c7dd6fd12c6e6491089a956243507571d26f631b98bdb7ddc126090452cbc7bb3311b3c94fdefceeb1f9d6801f34c9fabcbc1a6f4a7a959f4ef2cc499defa5e4caed68cff1da65ab58bc4c78b5f42b8d9a0618759d8c4c2fbc2a5a56cf7c21e0b31263eefe29fa91be6a683181fda2235b235a039e7ca46d802f5c6298ac928908009b6e3f8772ed0e3eab2c1d2d73dc3038d927f0a720a2035d9869e34395053c95137737301a5c74b6a91e5c36c70e528e646e541d15b2217dec532fda07798c987eebb8f7a056ca3e9940a09a1586fd558b235c3d20bc7cdc468a2b7c8d22c6a0de399e25da53b188b0c10f1158058de99d9a59eff54ccb58260c501c21e567eae57f77ce5015867c5744e4408ac041bc362ad27d2276bbda91f9524e611644e1739b869698b9bc7588de2261865c717c5f3fbb5c34b56b4637648f64e3304de5d35545adce5022b5760c28cafdea6f43e59dd16a9f7498f48c436d43155a3b29358d185bc351568c8eb6da949a5415bddd8361310f11e8ebc4ae04ad8bd2bd6330c04abde1ecbfa5cb983c3a86207a928e739c9daf5fbe74676d85d997a0d41e5ba25c5b2e5ada0b898ee1f0240db67bb40ed3d995ee1dff639a5cd5a90f4a1b3b9d7d22a40d6085cd87a9e9c6913e50bffffd088cae2efc42007eeb98fde21d5a62eb1fa6d1dd9922be4504aa7eb1b9526704f4b10dac221a8cf64af5409daddca854d6ca3740623d88cdc829d2910521d5f2ce59eccc048d5497ca174feb8d6f22c9e1c3ea8ed9b78ad1a644d39f937fff4d971460f035c6f9548c6f85a1561820ac5c67e37bd17ca4e90414074a7dd6b949717aa7640bd66befb89858d3a9df73214813eec630a4295fb026f48e025f4d405324459233c4eaad3b0f83426b257f5832efda8230fdc76ee8d01b598e1cb0977a340920ba3c0c164185a7b427cbd76667c0562a6cdc3781fcc42059b8b1867df5e920b7ae4147a1e43ae69007154b462ffe2c4f66b74ce6bd374799e3e547be376fa542d3e360e650a7d57a6d0916a510bdcb616e8882bde3dc72bafe2716b9d7f52be70d28220768c4c328d51fffb5cb231dfd312aa749d97905b8ad0a2725f09c5c14e65804313b50aee9c972709620149793d3c68386028c119bb0e9625f4692ad976f7671b1625a78b7093446616be298f1e7189d87ce94c5c3b88d35a0f7213218c56aa53c30c02b93a701caf303438d9f5dd6dfefb1d534107d07b62a2d2d233b3e34ba7e98e75887a555da8d41c0fd3697eb95ece432a0474a992feb17bb37c8bdb7843711e3ffe1da4924c59b2629ef3c6474e4486b8684fc5fda46ecc49c816045ee6fa63418b2a65cc4bf677a4192d96ccd506574b2494ed74db13d4f6097d07499802c124e5f49d976d62a821e482ef8e660beaa81a066ba5ee17abc3b9c1cbde21bc5d8f8e423b606", "6a6a5265650052", 1, 2140781944, 1537743641, "e84a75c5b99b072396e6f39da123f9120636cb8a4540d3c0c3b6f80b342b74c3"], - ["030000807082c40303daadd539cd7b85a442174ccec34057505c2fa00e35b82d0efe5d9431840f6f8d01000000030065655e1a83ea1e48b85b3f13c64e4be8ee6e638be2ad224208fba77f38606e3698da3e0bab8e020000000900006aac52536a6a5331c0432318be6e3bb6af0d6c531c976368d3921f8f8d0b7b3551cff91858b15eec7a931e03000000076a510053656365bb789590036b48350000000000066aac0053ac51fc01570100000000026aac9a9f3b000000000006536a0000005218324a8900000000020000000000000000c9e8ab0200000000020b1cc78a653a9f169a7078948da2f4da6a95f060ffd3f3a829836085feafa9382e4801094891909fbd030e19134e87b4777533695dfa9f12529ad11ce2aca4f599adc957728fe22cc247fd4e4408d71dad9bde3a303cc94a855c6d427f2eb300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a19e89ca98f1abc7b88dcb8188e1c6831671c520f9597c94cd35df6be00139e7acafbf08b3956cf325d004f084a9984e986cc752c04cf2b7f748167daa0edce9d24cf53c186ce3510a6b7ff3e98ebe5261e558b5c7d6a1263dd03c0824a9d4081fb9235329b520fe0f9a44d967f6196a15dc2978163c2697e4424c361fdd83da022e7031f3bb496a9d50e66fd0a85e36db04b55448d10753dffd952c02a1491b49031721ce86270eb34ea960b5403c6657e545e6cada4abfbd536c7a121d06e881a20b08550121fc3483763c75f30cf16a7024bfb79d2871fb72948eae81aabc7f96bc033f996fceb6aeb35644774dc1edc8679f7de59d72c1caa012115aa6ffcb834402135a75324dbfddafbb49988e7ea18886a2160036046f4a7b06a0ccb189d952eb03011aceaece339b6a6aeaff0a59e0efc2d1ea862a146b17164a5c5a351dd3854f021d7fff0c699bab0ef1d80249b08a71c3b3d9a922716132946dedb638b865e3c5030a6ea6508572308214cff5c2c1cb2c6e0f0226223e07c9226701065030c8a757020dbecd4a0900ef4cad387a29944f14e7d23ce670505ee93e6b28a811f02791c5ccb025e6ae5e457322c8ebc5c997106d720bfb4988a899e57628a5e7e6625753d286a02fb92281158b97c581afa1ac59a4e504c7022726353ad75eb1bd7dd332496c76b8584a30782ce9888616e05a9c74783bd790a7e58cf43cde1d4fa94561098213c2d37a620d288a1ab1fb982ee33721e0f24f9cc3f120746573093ec50456c3688d5575388d3975c36f7d6de6c07145c197173db83a90be9f73b3dc754855f4effff99319308bbd3299a934da3e0c49573c26e007bd0071efd41ff645fb324241002c1f3d9562f9ba309ef4bf3f0217174fb95d1fab9239184fffac1c33177e6623c5026ca533dfc2a65188f8051161632e0a7e1a9562f8ced497e565b3bbfd72bdd5530414a63a59cf873a6872473c26e2af035f7ef8c349a8719fd59a848ed0e1d3f89b8b33b942ddf8de49a6d17f17778d9c444be1129f9f3f422d98e4d1be5776b85a0404cfb38b333a14e9f71f3ad153f7738de2ecad56b641ad55b5230fd72854d2a79f8b320b7938646e726d59015171c68748cd3b7ad9f8b48de59adec48fb5fcd1f5db6798969583b45dde16c3e4295ecb05be82e3304849ecfb18e6239857ad9f8801c4646a0dab410e571fd47cbfa25de3491ba0501bcbf3ddb986e21380a251d7c469982318ad5cb1fef7ad0ef1c6ae9a2ad476d8b29b1d0cdf254e2ae9dd09efaab2a0d50af390c381c6cbe90d3a5a3a2be278076d42e678294ee0f1a42cf9f98fa30beadf8f955d2e45776c709ad0a49a68456b2f12f4805397884bffe3349dfaa1026be4be791ad3258e9135e7ed5bf77f425b7a8f10825c044272525995faf895165a789da7cbb5b31a055ddd6a22f03aff61881d73a4c199eef094b1377f81d9e66d739f532ebfedf711ae2e80161b582699b33b6475a060ae997fe061862a808a86d13bf1a6deb916bb877183574ce80597ecd624e87c3b439c2c8b4d3c52308c69d3bb496cdbff6ebdfd22b98599f6c94a800d8c815ea29e45ae69f637c6c3f756d29e4aa05b61714096c59ec1dc3e69a7517c614adf253516bfcc5906331be3b1b74f111ac85e535e23c90f9ed25b3451487bda0d5de45faa1995d457570e044b91dc5051fdab79b9df7b870df76e3a406fe55dc6a0028a33ac7ea026c7ac6a895c0c04aca307a2f81824ae1568e51aad09331879241d5062a6697c5d474728731b7ecbc169a36eb6d2f8d92823c909629980150236e4233e3f1701e72f5ad15e05dc83cf53db26c18397fad94a913d244f7f043d7578dc7cea13b19a36468e7700ede3f5297e6190d8bbc642531b0dca47f8e359fbc2695abcb75fee6165cd7a6fa138bbd9f4eaad35fd4bf450deebfee6d7643a1d8cef7556d2c7e3ef256d46c195111f7ec8dc32fc1a6342e245a24fe591c1901b19a93775257f8de21d30b9ffb47dee6c5fb4c24002bdd60f972b388a5a31328291312a85b9670e84db8cdd14321a544e6a54954861dbbd0bd3a4bae73d3f6188c71213b6619123735eb449320163c7c76be135ec215d226ab83c9cc2e966e2ebedbc9e970c5b6fd5941b2900c5c8151fdf2843e590a447016791f4257950670b0a0e7bad0493de4892b1a6d2b1cfe99657165291223ae45e8e39f6f7ad14aec467cd138be8d7a747cbfa424974722e256ac9cebc535d648dcbd3c717118b968cf4f0a38b979ff33c931db672a1974830c3d52202000000000000000000000000eade47ee508d6880247dedbeabd59297399d87d31b9234ca241a6a007f561af9a5a63438eeadd55132ac1f15ac76d4deb95f485eb4ad587394d22cc3a7624425bffa1345d3bd86a635ed87d4b66f5116e437dc6c797732d292e2774fc9443342000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b44eb14a0a005400ec83124c91d4400b3272fe43787d52e09e02d284dd2e2a915b3ee13660d4be092012767dc728ecfb82fceb439a15968bdcf3d40a21c6eec232f8c69ee76ed0d4de0530a8195fcbfc337a721364d49ca53c62d0e74fd6c3008212821231256d8a2f5d5eb4beec31dc61b230a39f4ae5f787ce48a7bcc2b280222bb7d09506ebbb4865d48042370710507d8b0977c06f294b9416c873d3e0114031599ff7ad8fa8acfe1b44772f8fa741dac40c24ed5fba57c153bf231552077140a009de59a8283de742b671d0433442729db17dde64cddf11979d23e96158fac09c15d0ab84d215679c7ebe4dbfd9b1c9a6d17bb4b1e85f73ecb36fcdf4cc2c49a030a69106bf527d88c0ecacae60d520f332cf564e088094c97c17a75d0ce0b80780327c88bbd0fe07d7cd9906ae554d8e776d1fcbe00a66af15516be51408b2d575702073a7f0d2d4e2343f7c55da5902999b679ac5c8fb9665530824ae361939c3640020a836dc8601a8634bb6bc3decab386610d31d37273bdd5150beb7ac6dd4bbfa9031905785437d1f19b2366b14f9492a1315b995c26a2c3076bb1a8b5fa6ea313997af6edf00992fc119e66d83250af3ed050874cd770360cb6290c36fc307593502991eaa6ba93c67f3af603ccc7c3215d9f9a60b7a93dbec16004953d720e9a6fa958fc8bae8746ea4decacf3148eb35bf5116d7af6b75299c745760a4ebb4b4c006828950c10f4fc489a133058cd87c009e24db6954c217d44cb4bafbef91ca62d486eeb6ceaff0df71c4ea4a311e9d77d96d91c5f37c86bf19c87e7ab8bc5e8cb3aa2c1cc31e74e67d1f170ac8863f1143ab2c515479c4fae53f18b3893746ec4d7692c7f56d80b26abfc2425889b43851a2549fea6d8b98b7e68d8e4fe7544cd7e5ebf878b90afe605fdcac043ae082154343fae1842c48cfb7576ce809db2218431d978f2a4ed7b1167afb52fc8988500e1e78fb03cb307a2ac161b5634b8d445bd1b1ffb3d1739f3479ac59e10566183746cf4dd2342c5c8267364abcd461c2340febea986ce5c2548a323cdd0c633300b155192dabbdfac84787aae77c46630bf2cd0ec342ce86cd11fc2c9ee294a793aecbfbf0aca1e529f8f9b8478231f740b994952951cd5f81fe181e4e750a969e041353ce24bc62b94e811384376f009e84295b8b10e2a0a2e87e065c1f8e3530aa248a0a2c7e76fb234c2f90128df597543b12daff81bb695d0e724686902a3c9a4a05996af3999bdfdbb715c7cf509d11d2ece09209efd9c053755340f3d30280afc66582042e7c296d378a9cb5219fc123c5d99c81e9bab9d3f92721c9fc063e5b86200c64723d37dfab14641ab83956c41c77ffc359fc9e9f913c8eaae22b47454771e60fd96d95d40b12b50fe1942350ed57ec3a089016ce4c3d79cac4841409fefaeef5b99e75c98baa904930401ae995b29c82d807986ea80825371add98795ac35f6dcfac3c334f8d741e799be28f9b8962ed714f8d016c3a4594d089c312f9f73b6a52ae4032cec2db28c6d0fb4f8c46023fea4a20f6f64921fc23dc87b28486a31bb4a31da42fe530dbec87d47035e7fb1cec0f98b64d19a85260e27c6bfb5a1de18705a2ab96d29164818fa141759b5b83f71aea3c2b55631387e93a35762e7de6842f2bda2835260502ed2a93d6dcdc014b9da9e47bcf5aa2c8d1162b9b5f4f1f26e880b462aacae47e6bc71354e19f1e7d519957c0df13466246ea8c944243971ecb1c5bf040ef962a24d91f54ba300448b1d07ad639d27975116252e452de03f564d4ae376a7e373df491bceb38186f99d4eba9109491c2b6d8642a7edd4fa8f8214b53240af36296978940b382d44c94908a4974ef549f9adb793d66cd7a5a08dcad2919784ae63398ca2990036fc41a389ffbbd158e059a8eb41e335ef202f274e7d2b2e9b395e35f19a607ac9d77372445f950d045be7bcdb479351721384e09ced76a23801c86c9499b4e6486ef6ee1217e5bd6a1686964c9cde205dfcdb0c73e4d8668f2cde8b9a94ca6a34903637e4e3f0bc3c2fc3de62f983c66c689226a699c15bdc56bf99d3600bb8dab97c6d4a192cb984ae1a11ca548f48f3178b07e47a74b7045a6cb489b8ddeba12cd13c3d95668384c1bba7ec70ecf7bc094195f5e05c705a64646b05ecc221bf40349f727a1b4275f1468498eb0718e02cdfaec17a90cf935adb5fca48261a93460fbcf515b2481088edde91dbb874a9d6525cdc402768cbe4a06039e14281621444473bde13375380e05e56e82207fb6e02c4bd56b1bbba59b7778707e4799c8a96b42cb92dedd2d51f2461ff7a21fac0306eb162bc7905e21a8aa9b9b0a5ec9cc619496e7fb31f527d06764d9c0228f4dbbbecbc370974dc877c1ff304785cc388e53e4b06ae104cfb03", "63ac650065ac5353", 2, -1904664356, 1537743641, "0b7f1fea7ad223c7ded7e5ee684e8ac5d4cbfe13311cb446e17f5001d9cb2c6d"], - ["030000807082c40302dfadda200b124d8fb50e5239e3db85397c283fb5c0989b06265806693680d8b802000000025353ffffffff5035260b28f52bc52908de6b1c5fc91f2b8dd5bb825d84deab7786e0a4505ed50200000003656a65b37c0b9f049e34fa00000000000400526a630f33bc02000000000865525253ac520051789a5b000000000003636352018c540200000000076a5200006a51ac6cbe7dc10000000002f75b5d03000000000000000000000000032830894bdc639f452031e1a5a83110e94a082a57854672a2eb4df9f4fe1b5526ca91812f4615afcfe875162e4f457132c76f82b85c9e865abd7e3fe54f7b5c93fac22fe96b7e7074a5b261f858f26c67fb0a7eeec145208ad5c7d4eaddbae60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019b291723b7fc6ec60417295c4ddd2729492609ff052d2ec7c39ae297ee2f1be48124b477e36f765a968f4b818dcd85daf8463f6eb4edd17298184e4287aa2a2dda9fed2c9e367d28b27bc15989e1372c3afb5b0f6055dd338714eaa459685b19403b1353ca433b9bc170de80ed302fa1c28e499b9d06d773c6be8d68109748a0218672b22ee5974e729cf5d08714a4edc1ae3ce016f92d0621b5c83fa29def42302070197cb7425c0d76de30b055964366621081c6deff07349c70129ff54ae858b0b02140c138abc35c46c895ffd4d9d130567c0e255821e65065606cd982c10963646f4c21cd1ebb3257ea463728fabf7174570cd6ed2c87d1fa2ee63c58c5eda5702108ea1bf1c72b63786735c3408e4aba9801801e7f33c01aa460c3e8b72eb9b3d031c5661ba3672a67bee85902de58881bd06be2d3a13c677be3f9385aedcf4587a0320f2e79647b06e3743af3f55e9679af2ae81875a1342682e3166c365907f8b88032c822fda877ea2cb3ec80763ba8e3f3bf61887efd04ed8876e3ee276e362bad202279b8eefc16c803e4451454d229e449b0028baeaa5ee12a0b864a10ba5c6f2999e69a187a23b604d8aac987688b81da1c0ab0c5ca358e166983962105dcd9659c45cae9f44227bcaebd3805ea925dccf93949b60721d1dc7bf92f4f6dd99a5e484ec1caddaf17a835b8e574fae21e9a7cc734f6cbe7f40544912a5cba5787429b7efaf79c658c23503be3a1ce274a84f1d3dba3f58b9f9dd3b7d8c652579251fc7177c8370e7da9b3b439bd0958acc988e4ac12f65fa823cdc1e557545206f3d3b778c00de0c34e85dd8b0739232bd3a38c4bf1812b95aca498940dc109b20d15ef357047d64c9143a3060c502abf20d464583c06618394070a673a3696a176241d19c7d1382f497c9f9c233ec05e9b1cf3141286ac351a9e28410b90a3ffcef4da32462a0c98ac4580eb43bda1ff6476676866caa8249aeec26c7dfba15c0eb0fb4769ab4ac918a91c3214d44cad983a5edd72d6b3e3e3b169a1980c6ca771d65653ec8d4d836724c605c5d305de02c99843c90062fdb124f42ea1a08dced9ea976832df772a76b2f06c1708275821ae4ec54fb4792222fb71144f7a0d31504f4f4339ba597ced1967ea7a5d8fc364b5ca83d6769ce924c4669baa71b86c5e7ec809996fa423cd67bfed68a12eefbeddcc599fdb7a959b12fe1e0307c805643cbc2fd1ce6868d1ce9fba08844af0da1dc95dfb3db5466d9fdfcb59461ed3973821438de0b6cfa46de8304602b6fc066aab36a045405f3e7c3631dab62eb59b9ed8f71913b853976d90e8d95b110ea36c3cae5482f5056046ab03cfbccda6fa1825fee5831fd9d94227bda4d91fcd27b5f946d25848bc6044cf6f74a7376da5f26b0a139d701ba738d97cfc2bd6c9940b34efead87625c5859bfc62f8f6b8f39d14f22f75bf27206c0b0bc0fbbfd790e509519b3556e67e4aa1da8cda00ae05ada84a966d95991630a4aceecc5713affde132c4e59d24d16b99d698ea1d365b3033a8dbc43026b3c10315488d04f0b304d051ac46879f3715ed4a75e9790a67950371537d8ccb74ab964792b3bb2b8a627f1b17be913fed43209cfb2c52066109f47e4da7e009489a5be0a4af1eb74a658c8e7a10930c76c0d2d1287611ed730a4275698971088cece134f16a9fa61cd729525e18523b62a5284d725662ccf602857419f3e3b68b125213b010b2c1c5a25b4e8b5475b805797971b871580ded7223c4cd060087c576ce3f66f2eb6fa0e0c4641884046c36e6e9de9bb16068be42f63f792fffd38ee247ce27f3067eb1fab820dd91cecfea91c22c31f1d1916df397bff22226e51f5f639a298558e05b96bc940d49b9bd05948649d676ce39d380e3cb94f96e108812d24daf3dfd28082d1e7070cd218ec021e65083d4577805165c1c1e3b51f6b03e5c2a32448090a28784026aadd36bee2c06b3572098c0ed91564b6c33b66ccd30b1e9efd2693c4c3cf096459f6eda59aae4da90113f4702a20b7a7346e890506af8daa748b2f934bd4fe8e85462855b19b9323fab80bfd997b10f76e7ea8b76837c6adfb58163025df1ca343ea7903f7d46f2524bccfde7228543e1c037fee9eddb0b842b3f375213cc4e90111c30850b2b7c378b158d80eb4f55aad0db0417edac8b72c4be08223ee07d716ee3fa7abd99823824086ac9ca372c8493334d7c09421a4a7ba70872d65496bde2e0abe4efe632275606690dd3804f28b310c323f1e774b2e85a8e6464eee00000000000000008c5d260200000000a7bb33a7368ebd10fd8e1605ad3363481ea9b29797f7eca996f3db710a817c1ded390c3a486bd2a9c81e76cff93cde2fb5b87fe5b99e27b77792ea2070cc6a1c2eda31e0123aaa3ab864787a44239f7f7bd34383b430e281b8991aa9e7226b950000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033ad6aed308828d039f6c8762e8cc9e49013f044aa84192bdef28a4bacdefcc03ed670c25489615ceafe7138a50716cfeab0fdafa4927e77d8ba3b21dd482722190d5f3b02e98515d5891f20db6cc90aeb68028ccf5d039725b2ac83cceed2390eff19a71957920693eea4dd5e7969e68940c9c6540f4b05cf3f287f17a392420323a2043982e3225fde090332666e77bb3be53b28ed9ed33ecd75ba68e353c60d02026b87b7c8e965878b0cb38c4d64ebb723709ab4e4d84e260a14a2dc0c788fe50a01b665f5362c87c7c44963f2259b14af44c49c08f270fed06f2058b9ebcd949d163872873830e9f4d8e13f71e6d7c352718015b749cf58540ae5aa51bb9874da03220991248a5ce3939d490d70d2af4d360302a97fcf63d653de92098b056e2c2e0217d77d255167958e454191aa9128ab045cdebff52309175e0b80d06169f8da67030559331e628ab79595ae9215399110cca58540ef5232668f0fcf66111068ad940316002da357b464c8e028e045041bc9301ed51a4a030c3e15e5427f97797c80730202208ee67f029ff6d8cd820db9cd508c668c78f8136f235694d18ee1e81f52683cda212f5d86a0afa3ba1d49f96e1f8f07c7119577b86b9fc77ceec52322a9bd8747ef23ca0344f9a161eb380108e6cb8eb789f67cc5e627f1ee1fb1c910091e3995388fe0bd2361445352ccd5f5b8f522c8baaeb83a93bac42d3795b0fe93c1d83bbc2e1c83d3892955724b653206a84e9ec3c4bc0113fa84564e2ee423d018aed8fd00345933599d379dbf784487885478ab91aabf56462e7e6dc03b8cda5813a095dc420b72381093e0d0c8c746a96bd2b5734bcd8c8e7721281ca8445687e789e67cf0cbe2b60d37b757289579355629c1e3f3b88b77f761e8139d92984b8e5a757460bbdd157e99038db67fe729510abd5977df6b7cb5514359875b5096742703dcac8fe588148e044964305beab4e789ba152a33dea0f3ef7363443bee686c75065630688dd462ce86b5f30db37663d8d44dd0de1852097d3d48ff45354975be7bd265165a6b9bd1e1d0d8131e939558ca8dcd68f7dbdc269f1b200f90a9bf43121ec54db976591ca797b5324a95011a0036f4c8c7d35a8edbf1df3077d2439ede0dfc6bc3ac1b3d03443704a9cbcce4961df9fe58e3a45aa6d7be6320dd506e609e72e55916ca0dcb93d689b2405adcc2fb1d6910232bd66a33ea09e614b7f5a7943c84da8972f1226caac792268163194ec28f9298b0b4bc3cf10f62784f366d77585a3faaf2c021842459fc2ac71b6e4de7da7379425198b4dc05e80de3da62257119e319e1db59cf17a469fd5f6b88683c3c4f06b45c4db64cb95f763b284f01329597cf46a92cf7eb2b8747010c439c9aad39acd56a7408cf95e1f74e942490736268c7de501eb6c1f34c455868b0e8d712be5fea1bacaac5df073a6d2da66f7f8f413307a2fcde84a62c3df3f9412d1e0e6307370d18d407387c30bea8a7122e672b11f3abc015930b7aee70efcfd01a68f9afa9bb6e291ca8648ecf4aa9063b9257eea1e68565785534d8b83815143948b6e31736a5780115abf7c251610adedc48b12260e8fb3c3d7ebb31d7a2eb1321bc47f936ec4b80a4f4c4302ba4e4cdfa5d37249b098e101c2e79f7b0a2a38268c1792cd1f959d3038e4fcce1642615d816e0faf80e3f3ef66c46f8b724f7cc2f4fda8a32cc22f631929afc0d8e99badcc8488cf358c62601bcf1ae6aa1183ebe48a266f23842751378eea2f762a348accb15706f7cd81201c40fd4201ea575011d3aac5dc061b29b790380cba84b46cb4916ca676e7011ade08950e803b5bf71f632fa37528e6c83beab656b30507a3109496e3fa49f083ce579e357391d49025e061b599661172feb4061aa9f9410cb182d26eb045e4ea654a942cf9003033ed5b34044a915065feb58bf098ec3cc09902136523c174a1310e7c7734dd6eda46c6e7cc5a30763afe706e845b940545d6d10b3e3d3ef3039f02f1c6bfc51b0645ba8c1e1779be6935cdbf48cd904fe5c77334de2a9ac4929d3e8088a475456df77d5ce340b456df0e0d63c0c6db0de07eabb9816c45d854156076ceebdc47fb7aa94e8a03f3c5dd9fa7e928e062403d7c59432b05684f25b4bc755200956ccb00585a98d45ad1355d2f3de153cdab6294fb2fed396a35373195626967a2bfa71f8c3166d7f0347ac7b259496b499b78f10d0007675a8a8909e575efa6029fc0ff22e3db3efe9eaa33eb7cf2b92bd2603d9bf18eba132f678e613e9850baa42324621fb9d8814c0888dd040d3cc654b1ac91f7b5d4e626bdbf4dbd0240cf8b290cbd1a93880b72a02603169ec5f4f27bdd2aea6127a82ce7ef54da748eb9d8e482a9dc744ab62992266c98bb92f647f379cb3b262716159cfb0110c", "ac63535153535251", 0, 643614427, 1537743641, "ab83b6ce29494b0a4301fdc8df1ea517f18d017f3a2c869ed799845a58995a44"], - ["030000807082c403031c25f7a716c21cd50a21178f7329f290ee832f1bf9fdd44adba1461d6ed7b115010000000400ac526affffffff4edec9b5166f0975f19e1b02260374fdf2811364ab589e4c72a603bd1c4b50f401000000026a63ffffffff1989665513a8996beb593f4514c9a7faabff938812604cd522ccea786ecc6ad70300000007635363ac510000ffffffff04067ce403000000000465516a5119f1d30500000000056a51510065a82bde010000000008650051ac5251ac533283ec010000000000bdc2f61d0000000000", "51535363636a", 0, 550879437, 0, "03110aa8a25b55c741e6b1f362e049c82a1a3775e29623abf6d4567b28494fc6"], - ["030000807082c40301a4166fc370b991dc063f5b9ce20a5242d8bf054a7e917a5304081486ad8b573c01000000076a635151acac63ffffffff048f733401000000000453530000a39eac020000000003ac516ac9b84104000000000653655151ac521cef7005000000000000000000f12ff07000", "00535153", 0, -989816332, 0, "763b0a130135916ec827b235e42748f3afc9e33fbce61eca6f8d3c1a85f75c16"], - ["030000807082c403044f1909feccb190d9efa331a3871571b39b6095db7e022cd775c89c7938e15d0a01000000025251ffffffff3b94a3cc80717677aa01f707f76f955b48dd16b440d3473d4ea1d8e2f485769e030000000163ffffffffc80e04197bddc511f3115f6deb086f51ba0b5fd5bb5fba1fb75d516c49a97f930100000000ffffffffde515f6bd9b9f5dfe3ef8bc3b9b59eb7ebf84ece678e2910b13f76c99ce18d9400000000095351526a6363ac5265623fae4d012ddda00000000000000000000004a45dc40100000000000000001ef075010000000063b2896d2cec310a63ab68ee096937e8e4e5c6be09001b1a5109ca45fe96f161ab028bfe99a32abb22c298fd52fab2855f76449334ac7223c4f3ceaa4f8c83e7312b6dd9d3d2f0c3b92d76419b131644ea203fe3c3cceb25947342b5edd6e7270000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004beb9abca9ab67ca8091f17efac686e02fbf6980ccc3d6c8e7a8d231ee346a26623c7db774029ea2ccbe8d1df120be6979994a71d8738e873a8f68d527003567411f8db2ad8b66aac80847d0b275631cf1b36d36b580ab2940559ac5fcfa7d26983a4f2423db1c5c06179e61bd68833b5e467adbd39a78948c48c098a1b93010204381252ece7e0f6094385165d5033ef93f155de4064f3f50f32c42007e0110402286f75cd4094f14c57d975ee9f0a0d9d9e19582da0ccd9016b77aec3905863040a03a5604f6401d702c381b3750fae6c29eb16b54a39ef21c78630e5091de63af2cc561cabf84878adfa200ff9d3390ef1546ec4a97c13d47a571e8030e1544d9a030c5220ab87497747c1b8b20e4c7f319f65100d2a46c9860475d06bafa917f2600301e6322a5a80eaed10e66860849c325e7510fe987341dc2e89bbe8d650535c6a032d0349e4f83110d589b94017fd8fc765d5a039927493b4326c66c6d0726cf6810305d1c5a576a5d08519e770171e31b6fb596505de58c7820890f9b58c26ef6579032d4fab0e24d59d1ebe6fc907c4c626ab0a6d3e1b263a15785f98c97895485f80028625d61a43fd12c46ab959395a7e62f7e7c3c7d102107d2230256c499d702631c050ed6f230c3976a7ae149308abaa0ff2f8aef681f9432a96a190305c35f341b95b9d28cf36b0debc228c1c0100ba0b1521aea2cd330521fb4a4a4d2d6a6e89d2b69addd46d052e38f3fad2650030e08c2aa6e2fdb27a19388190b546435085fe631abd9583e69ce3ea3d80543bff97b771e584463ff6fa828b839f282161d2346fe6b6ea926cc5a70bf0b3d236596728cf907ef3fc52eac651f38d856438d3f4bcce45562ee34569b591f40cc04c0cf654d8a471a4be5d13665da2e6fa75ee14e1967986358ff19546d000d0bb860d3a009e638fcd78429df2f2dcef8858311e1dcac26aaa670aa4364de809dcd29f90a599b257f4c8c5da9878b0401b432b95ae0b6caa0636b4b94cff1a0616249b336662f8eed137538ec5df27532185b5dc07c3d1dda2f0f90f4f937c485acdb7c5ab670084c811522cfbd979a1e11f85a099b66773a9ca6ba3b0d75c0a0afdd77e827dd1cc9b0c89164364ba09d7031a003915d4f376a6216c6f98da0574f743eaa3e6781cb9cf57e1bab813f8bcc16abb3b68b58141ad2cdd5d914461064705549f45ab5380e07e4b4587396e7fe01717c1ef2d827d20d0484e449111352dd5f0a0167ff9ded24ad1766e31840b3ea5e53e4f2b522d89cb749ef6e0e69bbbbf1ce193ba6fe7b746f9103d1727509838c116b72baef8dd6b97e3e3cfe07907800639cc4173816430cc4e412411a7aa2b1f45b5555310e4091889ee20b36c2a0f8d29829f36f372262b3120b220548c8b0121086394b5d0cb8ac0a8191a3508ba811d07f3c00ff27fe4542d1ca27ea7c67cf0c26fd77c3a6bb78c61b05ae5dec9b49b5918aa15423592bf70e1ae3877228de67710e958671902f3ea21a9fc2f35497c11759734dbbee32a1bf640bddfc5b1dbeea9643ab4cae8bf00943940d0ea9300964e5ae8ed5ffd6628d69ddda03d48fa560ef747659e8fdf042913bfe88841e5d2daee65873e279eac6bd617310701bf69054a87a914871e6ff6b69c1f679b379a29e0354a22b8d9297a41eab7e1c45ead3f297681d1826c6ffc97698db228794b186e419722ea0a84118a5126076ba48e3cec21431cb7068461c706329802d5930bc005f5e2f69be406ae4401167a96e2771a798260bf017553e076c0af7535f38c2519915bbb444ef131939da25121f845fbbd219a07363b9d0378674d45d2f4f60500d96d9fd50a5b4edd610b1cde89db28e30c4bb9493ad93f5dc09dcabcfa70510a54acc22cc81bcfa6abbbf83ba463c1d425a8ab1a3d85cb8918e3839b539d28041ef3085b0297bbef8b3e0dae09a0659136f3622d772e89244b2d5c308b430b39633fcf6a59ada701e2ec3ce1a43ca140e573a7e84be290e0e7dd4e1da11fabc372570e3164528b625c86c8658d51ebe44a55811e64cf8b2fb239f5b68f2d4ce43cfab3cb38fb8675f2c6cd93f5634bbb1dbb80fd24de883c2eba1a12d657b6172dd0b23cf9a8a0305e95d4afdbd102193d7b2df549a03ee0a12f64228bf00992747eec36d491b554d0aebde71d01762b63950a570ddfea268d6458dcb7223ed2a5e877a8a88a2a003a4a31a4d59109a39edc553f70c95659cc930112e9fb7341a1248fc43a7ffafa57b0a6e4b6f01597966807af063d9d0a9577ee121d23ad24bac387d4d25d2c1d1e9aaf1677c566afd5dcd2b2a7eb028f4a7186bd8385a65a0c6478aedc04eba103cf1cdca2c96a1d5d07981b5b5dbdf15ad64053517ba1ebbcc3a08caa44b0fba4013333e56556de29baae996f5a3110cb430f", "", 1, 1357491812, 1537743641, "304b2eff05ac62795809836d422f45d5dd5f44f558333d2e44dcd27d221fc84b"], - ["030000807082c403023ddc465e52b25720064b544d7a503e3566b8837169a9b346b4f12e823b48d996010000000951acac52526363525337efdb08f6e0926ad59e96bde77d62ddfde6dcd54d4bea7566bf4190d64d0df57d8be2720000000005526565525295f8c29802b343f904000000000067443400000000000900005252516a6a5365c5b974e124fda0f000", "516a00636300", 0, -841897802, 1537743641, "012e082d7b33a03642b3d8fb8bbf69eec8d17f6c9067d38a1b7b818ab92c48b9"], - ["b078fb7602f8bb1fcc07365001e456ef0386641547bbf15d04ac7c0102927a2163d1bc2022020000000453636565ffffffffe7452a69106e83f009f1c92391724602ad8de34fd959eb93cd7e08ef8bfacb3b0100000009516a6552006a5263ac21b6a6a202935ab3050000000008535165ac636aac6a0a2c32020000000001ac00000000010000000000000000eeabcf04000000002ac496fef8f10da04e68935324e9fa66a5fc8a2c2e42fc3076e6049575862d3b0f8ca7c887987b56d52d75c8114b9d4c1da9e7fcfd9717571f44d1821ea26a962a91a06b23270dcc2303ffc72ab912c94801385653c74e9e88777e9b1cbe9ed100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ec7f112b926b9296a10202c58dadff3ac73374861a7bccf1fad6074dd6b1108b30986061c05329b360f093a950543a68057e97462c906869d8b8575fe6150ccc6b85b5d73833c5763f911493941153f1321b8e7a1fae2d01db5f5e2e20fe06c8c710e7b556e442a9722ef6ec22b44cb310511ad44949e7e1d011386bbe84c993031d54047ef9156c695d9dba8a383ecacfb3b6e1199b3c9b7f38e294260eff20d5021728cb69313d616dcdbd30f8969ce57a056031a982784d64f0f8e723e594895b0a03a1146e6d0aeb17445991a6d5c107cbb1081cb442960ebb97cb56e2b696b2eeeb62ec49df651278e24b420e9271dea3510fd32233b25ea7cb2ece592904a66e030bdc215ce11b6b0af76dc88e9b19712a1872e2b10b0b1fff3fbc63c575847901022a63d72659c36866b5ab1713da84763c9ba1b2a8a1001c7141e32d6d8a7aed28031859485580947bd8baaad49a097847d5ebae9dfa02400ba4eb0feb1aafbb29be030b5259cbd9e7195cc91253b4f6e8f0a4a157f3281e66fadd4ba89b1e3ee27927032ae657095c527d592b77f5ce22566b9f7644d76724c639e04a47e0a385a62ac9bdf3b6cbc5f3eeb8f01cbe343ed9a199a666a8003b875b5706219817dbfada24da4bc8e99e125fa2491a11ab5b6e9c321f309cff3f4f6174d04a6360e542d6aee8ef6ff513cf75bfd9d243ff9158d50f2a6ce3ef6f74eb10f11e07cb83a7d9b42cf51a633cecde2529d9090e900d4cd44f73aaff971406e39b13755cea538ac4f681ce370d5734749aa8d7e837196cb6abbc2eb0357893e72ebb5bc69ecd2c8eb603e294fb7fc2a00dd17ba26cfde778d9ca6e6b77d0565a7bed0a4a14fcbeeb6ceb26b90f7afcd570db188e76c5c76c08f98b6601824a3cf06acd01d687f3799c38e8ff0635605d7164f160d87074e122ee34c77d6a2413c99cccd4737fab8ec9eeee4bf629614865c7ae1d94d114a2041533cfe42e54c2f1327c5b1d6876f211691416cf9b1fdf380d13f283993e0fd23e3ab7906443a6ad459d0a24259946cdef76e2d886b1a75b8c6007e918a4d6f5acfe0832e1fab387e7f98e78204d7c50d703595d6f99db16ab8099bb99a5776d6d4bf55b2d05b0756a159d1eae9f1ef7c798a463c7ac200807f3f4d03248a9141b5fb094331d7640fa6e9015b4bd7c0352cb33dd9d6656b8725fce34d149f2c14bcda12abd2c4285b8d53131f2b7b595e24fc06d27b011f9967a4b56ebb25936e97604f0e55ad7eb56eabdb4ad82a81658f010b7b5cd8e19377a2b809ab552302e6873f12250d12c56b08b3b2f5c487a76b161c01b87a2f7398a44bf93ab39b8b414ea47c43fe5dab5da3be20f7c0d30fd94719ba522a5c709d42a7dfdf9f733f1194fedcf1ca16f05fd0d06bfae81e93a92a9b758caac23f319e918cbc7dd84d9f1f79195b8d6373d5453e59f281e7abe0fa644a7658f4688b23fc9c805756ec96963f7261aec78cd39bce1157d1865df1449643c85749e82d9d7845d2526552d41d8bfb3c5b22c53ec94931a9c357f4235af3aca050bbf7ec184d7afacb7507c8d3ad03c6d69b3b66207ecaf47ebdec9791cd6ea9c708fb22c5ab7f345f86da5c1a268bccdb1f9e88957c6a0e1f169aa283855ff05a42d1c81f11a7519352352e9e787d5dbc17b1052e4ce84c34580dca5600ce0a04e186128e28c888c66ad61c369d466511a424cdd7236c5b54af58b1470fb96dbaa3caed881ba30cf5d0104d5d71b9b0ec5d47e664b0034bbad508f542f44d630881df4d659cb37118b0f771b58d64236f9926c9ebfe760d54fe324b8129a3a242dc58773f08cad531c212721b0de0a9b44a3845744e8ae05312c01966cbe2116558221c7078390f3b0945109e6a31b6c167889fb288e9e7221c4fd5f15db9814dcec66f3d3713a86959b6d86ac613a3b787b42edfe2209d30fb65dc398889412dc67ed73efa3e792cc199a226bb45e9acb40f3b58fe9bd737135fded502df2d3a821ce539f5f041f64af06e6dc4fbcf695cf041701a8b8a6961c806a6708d10cf602b5a4b619bff23fb58576e88582b03582b79073af1247c537ced861c3a928bdd7cc10d6443bdfa0555e180b9d0b2403f7bd1770855637281db7a365774a66beb11c23b39afc013c9b86cba9fcc1f5432baf708e89068255bae35372589eeff43c558145e2572f8df0ccc63c24bb324784774d959d3f6a99659c43100ee71c5c599a0e2484a88126eabe556ee39ade18377301681328a380ce8d9787c0d4217b12dc7cb4d680f107090b48e9748d81a1773af742673b56573a0032493c2e96a64cefb15ed88ada36c331cb68b4d2b9e273bbd3f2fc539e75cca9628ddbd89c875fe23c26f3bc24e7097ac2db0257cd13db23bc87cc81496a15e4f87d0919a339e56cc5c07958776daf0a", "6a6565ac5352", 1, -737953323, 1537743641, "172a6e2e34ecdafc669cdc123bfce7fc4906e3b2b7d3ffa6b5aa703dcf754612"], - ["030000807082c40303aab1bc9d4718c5aba01b77806c299727c0c277e4b350914c5689166a8f33cba30100000000ffffffff5c2a5034ce23f34b2485da4cdf4181ae97cabd949627e5785b17a8699f252d180000000004ac515300ffffffff99d6d5fd41de78bc892e21f389afc2a754b847ac738ff8de39c6750f4b923587000000000463636a52ffffffff0497c741050000000001acc5482c0400000000086a0052656a63535294e385030000000003516a53758ca404000000000163b1012f1000000000026f94ef0400000000000000000000000098531f9ab32f2d89781859c2c15e29104083ad43b2ed2a08727c1f9397ab95aa298f05eaa229603df4081192db42e0db7a1013853ae0e5ce9e5c5118acdc98d82ea2665e130c12387bbc4a2605a767f5319f9973deed27b28610bbe906323e4f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002dc76465cef39a16844151e5ce2cfb8594e61c8dd38d30ade0b07cdfee09d8b0afc917560e6b6d6373e60802f56ac32ad81c717e5ae62fadb7351537ca50a04c561e71e71b46bc0c8f1ffc30a7b432978de15b7f4d3797eff07e53549ce0f9ec0c9c9c37ee590c91b7b1f5ec1b6c6fd2f727cb3fb309144e84da10e82437cdbc022445988cef85d68d52b1df4cb378d7a6fbf87387ea5c02d9e632b458ab9f0bb003164e0a9cbbb0ee533a703e8ca13beceb9dee80970249c8c2d84635b9eb034be90a01c07c65c4a781a6e6b8eccf393fb7824f7181a0ad828cef8655034748d37e49153c1f54655b284b7ea729a788979a54feac622ae00227da94d1cc15a36af2f9032ebe53a167e2324f985b5df4d6b989c01e9695cfe165b216bfa5b1f694725bf2020068563a64687e58b8fdc8479fedf3d4a6d1725d4d225ef6bc9f053f13dc3fe902096f0f0a03c42eec9280bbbde4e4e9059089b39a1600d901f72b60038a853248030f19782580f7ba4a97cf151ac16bb0bca78a9629893c72085e1d54b5ddd0127002032f5363f34d836532364e94a00b1e75015cfbe9da23367f784a9858de3c567049bffeddeaf312787740d3d9cfb567bfc1c0fbc637c232a2271a333a42f476e392d8da20e4749c4cb1121fc7e4e45c3271e8eae31f2a454839444e8283eb917192bf23fc17f15f14680537ed978fff2166b61fc040ea15cb96e1d6267428cdbb651ecbaf5b348df1d4fc36831a868c78b5ccb58d45f67f7151f44fc0454e0f06a28cf755c806415d2fad53b5e30aba2d8e41bd22df9836e5120c59ef0efc069dc89fbb5f73957a02464dc38e8c9985d0a8a0b4714f1ae19cd00914747726b55479f4bcce79bded788378f8d376867d9112c9060c6491a003baaa2b6c24aca46c021619353fcebee1e36725390c3e203e0f6ffa0719e7cd936a1eacd7028a3a9f97729a6d743bbfbcbb0f8449f8dd91d025d699beb699a18b99f71f2ed22ef9e4807dc027dcbcfea200fd514f16f8a07a478377612d24265a64d962c3a523eb5902ee6c510a96ef56a48a831498304265e3a1a1a118b663a7295709f3e84989e90af138f6a5b162f64e338d91d61b91e21a3acb430b04734ce589be3b1be6a2885c169f404d1d272f06c9bf8f83015d1ec9aa7ac2793b9aa8d511d43531ebc81c8e6dc449170ef5f198e87a34a5a0df4cebca5d6ad6536a9f19bd0ea44ab246529c712f4d5db0980adc11480abd39d5e58f78bc428b986992d7a424b0e925f4f66ea2f916b11f53dc467b38fc3aade40e2f6c5150d19b7d9cf6dd57810d94d6a6c584c13ad10113e706950d76b03697491e5e5bca1c0d599a947211a1248d52fd3b417fb75e345bccd2efc29ae280516053e6e900a5f161326682cc0de4a2ad618a5a269f30d1105e3619b724a079879f4ccf5e244c917cfdaa63ae7d40eb967510ec799d971a93d967074c1de33889533ecaa8b5ce8cfe61a5de7d2ab6d06bbf28408996f88a9f700ad297d27ef813ce402f5c3ab40fc9e4ee8e51e49b6bd0079c26cb6f1ead1d3ac264a96aa45aaf47070c4b4f7962e9b3b1803e04aa0edfa0e6e5af4b1efb941864dcaea8f0d4b0e749a28faaa4d94fb1a412390d6e984855ddc414408d7458ba12c005ef87abcaaf33523a9b24612313d5c6bc8d18931218b1c4b1132820b9eb02b279079a15470aa43f42dacfc308cf9f83278b995efbca1b621cba5662a9b168701dd3839dfaef803cf2552b0f1457c483177b5cf1b6f28854ff59846bfc9dabfb32e3b0d466ae655ba2c68d89ccfaea2062fb0f9e7fc64119f8863f83108a6bfa2385b2d40b507d80e4465c54a717a8cfbfd9854a5dc2f70cdbf297f2eeb73e56fca2ceb6b9b79503954f33964bcf416bd2fd1ac52ab96ce9e7991a1e6ecd4c564549f4be315c4bc49be1b17df1f2fe1b28d97fed3cbfae92c8737f9d200e0ce28a9eb5bfa48f7b39da2b3d457c1bf25e0e477ccec283d5d877bcad6081594c44fc38e0981ca03368ebfe80f2d9355ff6a513befc05149f4eeccd07de83b851cd56ab555194d75958f5c10c4f5de4b3c2b5f4849ccf8b2d6e26492a9bdc8009bba7ab2b85472978d34f31a2a1a9a9e28092473c8b282145457dd69a8927b49a3258e2377cde2397ae9e7bac6f9522b096c1990eb1a7a9a1c38e552510e8a53804565077a4c3776c8520414ea4d8d482eb74b86df05ccb622f25557618eec3cf78e713671a19b7e0281ca76b77a83b393993ecee69b9154b48ebb5b90a7313b4b9cce9af9b24dcfbdac04de204000000000000000000000000c0fad6d22589d9302125b8e932d6cb0a972635122cbe64ec14fc2f20bc7abef28f3b389a57205f73215c94e1c749848bdc29b3603ca48cf1323cc332c2bb39d5cce61817b43f56d7daef648ced1ba648d06462ed5285d26f7d89f18ee08c95d400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bc5eb20b1da56b39c37c89eee58c590a5faf7dc539330b52ecc432d2aaeab57311e6657e5b6024848433154caf9f7f12b3c7b4e9b4568bafb43a1a379a59e0ca1fcaf0d52878799316b0899312370bc5f7d395af1750b96455cfc15b305fc32c52770849bdaf09805e5c3f209220d58a609461ee8d4cb063f732ff30c764bdbc0303dc99ac65d585e3841a52c34f8df53c27f6b65613f55f48569e0c62bd8fb0ea021e86f64fb0c065640e757123c11d45aaf26c830b34658f226d67d8a74ed823c30b07667b54a77135a30e7486445141601dc094e57ef6eac011f4706abd6ec1c6dd439eeae8bd56a462b08973a11a7e22d38ee722528502e5f4cdfe25c4ffd317a90222048f7744235e6d6248af248352f4c304d65fc73f1aa087ca2622892f31f7fe0307c68a4aaef4befa90ef65b8713c1916fb4d387638c244b12238cbf9afa5371b0214d3cb028f0ab0bc283f372b35ae08c5f92484f9f64223ee1aadcdf91b85e290021ceed1b2bc1f521239da936b026225c28c93c1aa4038f509744dcf7c1fc90e7a0317eca9b4950caf1281110bd78c95bf035edd573ec1f88fe82b7fea87045bc35898c89025f6c258f861483757d1da24183b2415b4729bbca26891a6442cbb840f020836eab508bde3c3796a73b5d3fba068b71725ac886e4aa3345818ef788919de2225e3ff7b1a3d75aa293f7f820059b93c3dfa315e610f6714c1b879aede27e1b611f4fd1817f6ff8ecb128d4ee7fd77cd7b0d549f414ba4d60cc7e2b979782d8e174c8e96b4d3a2010e9fff00afb0fe227b91b988c3ac80489c688a80941d7a4d091256225b972a9d5da75905b15498af66f73ae8b9d7922262282efd9e9c7306c505a5ee44da27c82fc92a023662e94422504471005066fefc9cdf53fbd762b50c41402e177693648857fade99df247ff746093a2bfc4df37c1768763fe9e52e16be068356db5da77f53b14c6c2c412b222e54af6894afde0871efceffee3449e44d602ca19ee63b4b5e38343ff69a152d08d8a9337677a1ec3d8a521d9d635f807a3cd1f00fd6d960f49f8bb3ed351d163e8a3818559ba0f740a9946d1be1706affda1cc5116cd155c58bd50fb9caed55a3048c13865317bbba6366fa67081de0ee53d2407afbea09011b944b09d8b72d8d602dad0f00ca2bb58ca51452d729cb8bfb4729e4b0525db761ba27c5d3e37d2ddaeacc668f4eb075e6854f8a74830e07d0159f1182b351ea296ee7e5ddbc885ff3bf7f3a965d0e636301494d00006fc5d9226589a0e4cb35f19ec7c436280cdcff364cb71a3edf414904ae50729dceff0ee1f7f9fbc9789f3ee55ce52da008490117c69c39e76ec112279ce35718f4d68ac1c0f46b64e6b3df390bf3a3b98d993b6a592ab2268d859b8bce4b607dd56d2b2f27bf1909a6adbadf79531345b328915b7010042dcc3c31e43c547b4d1427c19696c327a4f37aa317117314273538c8c5cfb9ff9ea5a9a4b4a5f0e3262a7028d0cce450c8d4aeb5c2ff3c8cc867674e8949661450d6444480ae66d54f1661e0086f2f44fe05fc3e44d3f308652ba1906b21a9e2c183927e097548ab409cb1860cfab39ba27c7d596f59227fb7a7b68f4e4e7b168136cc00f6b9493c8970b0b31e5ce80a7605a7b41f11a5a17ee18b499d0a3ef0ecbbfad9b5e1e38b5c3d92a39de77d35b478d523a598a08836819b19e222999e13abf5c792c4c2cec15261f73456b5921737ea581a5baf32af42741a8e2042976d4da3a52917d03df9c95e5eeffa4557be1d043d6f8b1cc8fc943d8e779ce68b102b35c4e89633f2696871d2cb23e92eb11f3de8ab193e90d0572192401c3b09d36d9ff189da1574bc94c4d36d405021e658f3cd145b872197cf498dcfcb253420794c9591ac36d0219472536f243a4fcf70cb0da1dea6c53e09860aca2d8336fa0bcd8525f753cda201b310692a864006b8b3819e3a2046f132152ca1cd9ca1843602b330de0c3bbb44a3f1a21253d38e5f01822c4659c2bf061a5d1f6d3d6f8394d666adcaa94059bd5b08eb94901a94ae8a3c08df969e92c9e0324857e9c8d39f3a8e0b15220d87eb99450370ae35e3ea4fccc5e8b633b20b1fbf9023ea0f25586021842294c154c95c0e9a0c140fb99cdda55e50dc5d887f1bcfb3274eefbb1b6a2b98f870a59dd1a7bf4e4ccbc2642b9c2b6783c876262a749abdaeb28dda76c228c59a443862b125286e3ef0439a6e8e269a291cdde525a42d89b22ecc07b024cc501fbcc1d28dbb98ad9e5877979549f73886e2d5c33e667169f685446520600c138aa60fc5d3d54a2bc165601e54237023f78ab2e51ee4d325782e23942f07c4a480c82397c66c8abcde681b366888df5edc8d1bcc2bab17c6bc38cf6e59539d67b2af6de5b98c08235cf2961fa71fa92d63c55b0c", "65635252", 0, -393192261, 1537743641, "56f393b2523620e54dcb1527918272113829b3827d1bb31ee5dc6800ae589ba9"], - ["34c9ed4e04871827f4d9c64f429af53e8663eac0c0c1af65abc5f909f8888c7cbd1dc547160200000009ac6a00005252656552bb8752dcef1ac91bae9a92b617a5b177ff101cc80d1902b00fa0255c260a25d6db81abdb000000000852ac530063006a52ffb8450531a7ba1a606d9c6908505b0aa0b0cb08738276a8924a635ca0c1c312cb95519d000000000900000053515265656335a630f9d12bcdc749702d9920c7e91baaa7da6e23b4bf3eec41a5fd0d55010c303e2ced03000000036563632d06eeb1033a6245020000000000a8a6870200000000096a526aac5353ac0000074584010000000007ac6a63636552ac5b71389700", "536a00ac", 2, 1245199199, 1537743641, "0c0b6695a6e7f08778b2dc68bddb95e9069839ed54ceb97d4e3cb693f750a7d0"], - ["96abc322021f5e03b765300f97582a78dcf925439f09dce3c9d0aec85558a7de54ef80760c03000000002df318f4b633253d521ba0219b52fc973568a448c5df91e242dfcd2938f4e024dd3ee3c00200000003ac6a63ffffffff02d73fe402000000000900635163006563ac002165290500000000076a5363635365519533ee7f010000000000000000769dc70500000000ee0c1269000e1a24a3e5842a234d890fe74513e10153e0366e3ac32b4ac807392ff17426b2dccb0593db9b8214bd7391754e3f5369c5cbb0d3371ae4b751520bc992f302ca48479631c8cb049b3b73aec72af3a7c84711b5479ff8721eae2c1a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ffd06882442d141bd855c42d391fc92f801c38f95a83ca6d92d6a18d7035fd4077c0a8705a99582979e5a549bfa4341ddd7928f37a8f81439465fa95a456baee9c37d493298f2e5997cfdc41bb4a3f2fa50729df1826c9954da2643bef1e945481196e79609f6d51fd8a884127c6fbc6cf1498d3f83512547d1af2324e80b5e022671522833def61605dc28e840002321e024dcec57d657ac01a6083020bab6f403064323ce27af5278ea5bd47728964008dd2d7b4163e52e75348b90f922921b320a07dba744f47ee3ead1ad0a16cdfbdee4f657803ad39f475d7483523987eabe73c8ad20d0cb0fb505337d055b85dfe115792289e1c8bbdc7a271e0aa697f47e66032a4f0d977b67fea02a37a4d0f01256eaf8266e0b173f28661172e8721752a1150224f3233212b33dd344d71126266809accbd43439b36473b34a0e01158e41afce0216e9f8398193819f574837159377e44d6af492518d4f07a290c516e2b6a953ea030e0f68cc9eb0e63faad0f64ec6ffb0371fbf43b57402e41437d3d10a0b25ea190209d0bd1af99c41a34d946eaeb69b96bc639e2590d1740eadf4d6ebb0c63dac345098737fa9a3a7ae0617302c4b0a3f354ea89505ef8ddbad3bffa81a0adfd64de0c4e169487fe5bba985b381165fe5faa1b646dc6160aed1e9db83460537258778f6efbeb2c6817338e461273c178df2e6b163c6c4b6e7362f1e21a075c3c7be83db0fafc0a499038f5f3c9f9e1cd93badd9e84dcf1f5b34246266ef6e75fc13be75603594f2b77325bbebc390c0a793dd794b9fd275fdf91a09ba5d1692f8629471aae991d4222005991a8b88e0b248074de778883210355029029c30aac96514df8a57bca5ac4a3f0ec96dd9e0a74c81b851312f47d808eb178a11143f7397704752e963241a511ebe0a175736d648172d19cf5970d1636dedb9c999e545f4b8ea2e8333da71217459a6a9ccb6336a84dde35b690fb7aad41b3e54b8073bcffba80b2e01318ccee458a7467e46df26cca868428eda848c0074c44a93ac6facfb14fd1028286a850d9b917d6413559ad97f8b32fe0934f16674f07b4b54798158397b6750ffb6e14a6090408a4ac861d31bb6c4ff43dd85cc4f82e994fb297303e069e38b1567f8be18ba581aea6cffc31b3f248ef8a1bbc6d2ea6acf75278fe8c3d38bed3d2f20624b9bffe0587779c807b6d62d705a8ed1895a33144ee3554560322a7c38f452ae700e120b4301d59e24c05170a4be8ad159bfef4f53ab4b874122788c50d193bbf6f4fbfdd48d589c2068838a4c62fbb8428b7669e26e230501d68b791fc9ac179797a3ba13f197aa6dc53c6984e14fb0a1cddbccce701b006c77f638ae3ed1970e43371c68bc7719f730f2a79fad90f82a2394566b685baaea7606b83e641ccf78dc141c05a1f59ec52730a7c0b5de8601448fab816913bd74e04ff1e7bdaf6739edb826b9200d5dd78e017d1a64885ce1b6f2e042449afd25b5649e37497e7dd44f6d2871f3c364000bdaf706b54288b8af1b5c78a7990e356556477d31291d0530a550bce40f62ad53a3556491303fed0cd832219ef5d9f76553a861cb872590f6e59bdfd2057d3468ac79d3d0addd3a9caf6600792025ede7049609287d5c85f4d015f43e1d64bbf7ea85647917012d5cba28be91f50d664b919a2ffd6b7748742abbf69eb492a66b2c1fda08420083f6bbf96c2e1ac0743666c21d1f1aff3aab95382fb0741cf8a04d5e7b5fd7984572b7d27b851ae38adb3c2d9e1822a6a8471896ddd8e4e6eaf34f799880f3bda2b2b905bbfaec2b6108dc4badf7fe52256a24285c4193c14ac19407274e9d72a30f82e52fdb6d74a43354a93ebe5d39c6d3167c43835819f8758875f89696ad53c33dbc387ae2bfee2bbc4641d6eac81c2402d579de5f42d6057cc06794a51ef2ee6b50ff4d7dc91b1a43c8f15c2d4603c111944746f9d07081058e53b3c504a95819c25909cc153965d503379c83948e8a77e538166cce86b7bcd76cd00f113e15230d61c3fe6a889ecd42cee85c4102059d50fe652926d9276a7f4d5af8e5f11b80eeb5cf6268340082829bc59ca941cc12ae8878c224873cd2715a0e4c61dfdf16990791080975adad1cff0ffe91c20a5f0c1ea94e9637b3637c0f06d2b31d688531fb7ed0509b661d3968c506859ade5bd04e03d09901f026f87adec5f6f6f27deb64619c44318de6e1ac6c2f33c70274595efef4e62b0c5a65b5396a9c43704ecd0cf4cfd6cd6c25ce76f5daaf823a3dc6c861d0e667a5d63b03343e6f552d25d0920482ece89992eec653ddf684a7ce0d66f5caf644d2f560bb3f907bfb4070d0031d48e9d313d174e384f66333360965d198622691b1723b98e5b0bf43b64619a43ca14aa7e34671ff8c5aaea056241dd68e52740b", "635252525200655351", 1, 1226602468, 0, "1722f02a8528724e73ea62c7f4af2f6ef7714f8ef53bbb593c607c475e4ae6ae"], - ["030000807082c4030460993698e925f709df5e52a1e0ea4bf2d524d8eb1cfc8e3554f7fd4349755ffc01000000035152ac1eb5207ce6bfd7a3149788da36e4faccc7e8f22135b25260d0c7993f21254d01f33ee423000000000963acac520000006553ffffffff9a7a0ffd7dbfca06a6a64489ad6840754c399d86a7b3933fab41592f3cd7276900000000046a52636313a9acc81c5cf365f85d530abb17d8cc8e8931b5abeec7b5ffe1ec791e4a480b5c1d84a1000000000253acffffffff0166774201000000000045d192290000000000", "52516a5251", 1, 605872301, 1537743641, "281222c646722924f5a944bd546d84c0ff73300c944091db9fb0b478da4d4b9d"], - ["030000807082c4030429f257ae68e6ce82b5dbee825b34f4bfbc867dd6d8446e89bd429986062754b601000000045365ac6affffffff358320f9525bd2e7e1d0e9626fb898913957af57c433af0630db6a574099e3b8000000000352acacfffffffffcd404d993bef581e48d660828bba03f10b389fe6bc081de3133449605be31eb0200000003636551ffffffffab4fbde9ff0fb91ddf1a22e35a58efc9dbe545212b73f47b8a86786a2be42d2301000000066a5353525200ffffffff016e2e2903000000000452526500588807950000000000", "65", 3, -1112243543, 1537743641, "1bebe553645a422bb9200d0ed5421486f8257577d48cabdd63d8bbc309ddac01"], - ["030000807082c40301369f486bff896db4ec440c4bc13023c96b518fb2cded4c1ba1d658aadacc45a50300000009520065006353516a65ffffffff0150144f0400000000006307cd8600000000030000000000000000d406680200000000ca77e384e40c7f06fbd020e01efc9ce5a40deee08a08900f99f1a621df6274ee52953c23eb2b9205d8f953c2781384b4a1b3601c3328fc03390f136ea6cf0e7448f8202c87ccfc5a3b433538bdd8959dd8a8959fbe1e01e03429419d7d6d458200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000118d145390425ecd745072dce363de31fbd44ba3c3a7f4e01622e7faabaa538a05daa2b64fef50529e19328c31d84d66820bf3312f8eb779e25eec70f08cb04c01e872f141f04010b79226d2eab2d659ee003bb0e483c7b4792c0bae2ea6b7c5c2032fee7126e7a4276809b5066d7f77a8d441a9f0c03e07c6da815631a3893a022f6de3246325d6f39c51cc50620cc465be98b8b40b734420b02c6def97d4503c0316bc3e2c3954cc7e9861639c7bda0dee4203c65b00bffb8a88a838b2b11800690a0507cb3586e681dfbd7091a06eb6a45482c69259f5a68de26f84dcf6a0766a6f149b900b3dc8594d2ec25e5dfc2dcda4e8ae2d43fe7b2cfea92597dfd9dd879d030644a6904c14f6617471e6f581d31dc9202a0ce0d8fab3ff042a19f67c6363d0022ca04d05944510f04d51c96fceab31469ad4a1604419747a89a631f2038fac140222c89dbf0e8b29421cc3e5a82f5820c3614b956b2aa1a9505bfba833720bc74e032602cd2f11c45723effef919dfed07f288e4e2e0821e74eb74dd81df541bd522030bd13f1e4a0d25d73cff6e4c28d58be2e926cf7af0be546d64a9a8f1b8404fb726dff318ab0e5610e61621ce8063a9f6c828680e6969b0570a3aa1f261bed2ac18ecef4533c194e9c2e6e871a89207a0af8f55d718ba2efbf1eaff399980207d78861df080416d88a3fdc317f6adf794ae4714915ba3d18288971bdfddf646e780dd09db5c8c6d2fd34d5e66e9e61da0bd4282b15370ee72c3bc42d78a9d7a6ee8acbf635c32fa31b0c560167265c6c2d51094d5b88cec73f27c6f3faad29d468206e38e28d4ffcf3ccdfec52d0aebff12c44bf2070b35256278479970c5d89edc774e8b550e3f898509ff3da09e422c6a4afc53a9d924c061be155f57a22491ccc08ecf62302b05c5d324d5843807d66f50f9f34787b30bdb241d44b70855f89ceddd806dd22e91c3411ebad72d5a85c321c5a325a6005be971cbe30542711adea92cb3ab9dc4b0d2d1144eefc27185b08502ea328fcc956ee87249e8da45e683d729b3a195939c30a475d5c5cacc02937a6f7c8f53b26c52a7be71250a5ee4fabf2d3b80ff67c71c3149abc71f00d193336bbf113908e3c2e3758c3bf180bbb356311a6c540af76ac1cf991edbed993f9ad7dbcc4b9e014a6ac76ed850943cb0781d3a7b24deb82f23b576b20058464476d8b91ab3d0533e34874abc3149b555797f8dfb5f6b0bc7efa5156de455b32003289efbf60821466368bad0e07849d1d8a6326ac366fa748f48482bd302ce2a5f50a52d3775c9d028c3f14a9c09941bd60c921c3b845d35db21b8dc8cdecee85fe984285c262477704ed81228fcfe7f9239941a01c5f2e2d109d2a04b799931850a8fc9442335ff83e5a8f4134de0a245056f25d8a84cbff7f9d9f571beba4dd2265b123f264691599ff4097a5348b74e9b9bdd460fdc87d8552e66da25e64570aa868e3a96ac43cc4ddcdaa836e44061ad9cf20168b5d62c5e51cb0085188e28b84e8fbc8f702245aecf8e5bc2fb4a156a278724022368b0270f2352a50c19b8d7c04a106363bde9e57b2a35b73a72ad4ecaad99deb57217eb15d7683c83cd8eb45c092f5794bbcbfd5e22eaadfe4d526c6e46a281bc5f242ce4ce7dc5347d96918c66046abdcbfea3208bf9b43639d49d07419f0a3d08e8099d969562257ccfb65bea49a1f63670227390359956dc51d56f83f6a20ef4f6b8249aced0b7f8d178cc2672b9d08b5e6ce69e345f2c602a9559a790491978e40144204cb1cc10cb3fb696d2b5ed58201b821e4e28c3450939542f23e32ddce40319b55401dceb32d76768e5f5899d6c481e126e1c5dc962a65b881535e0daa1be98bcff766414478d557df5605891f9d289e2b0554fbdb9ef778dd2a1b7d237f9c216932e1deaac7a028ae96ba1b3a4c611e48d865114a97e6cd19538bbb8c198611db8236d3bf03d340491afc53acd6f266f1981bdd459d851da585f1c406cbca503c6bc340196232ce9a81fad6d99e7379c1fa53f79eb727614e25b455c0036740045929495d926562d07112b9b0caf25a285fa1742f88506b042ead83e2e1fd288680f31c75f5b1720b411bd32d38c83df1ff9829e226b4b902db16bced55074df2944ccaa63d35babd1dc82f28e4a9ed7abb0de213382fd6d6538ebf0b7a3e3e0461ffdefc74dabba9884b0c0782efe0a9bad9c0516750bd840c8e8eea30b7eda05d81d5f62ca4b2624cd5d6bd7a1bc6ae48751ab3583927b6aee56ea907ffdf15bda88fb72c2362201000000000000000000000000d207dca9b23d40c4a513803183b576ed1543a90fb2caf9c879f2d3e09bacdb9587764b5e9595867033cb2e403959c052f6ba6745f005520c7eaf8e3390c5e63bb09ecf0b4fe9f0ce3886758d50d1a677cda46d4ac9155e355b652cca88de85d800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000be9c318f271bcaf9aba8f84f56adf558fcaa995492e8ba6056146d6a288577878bfd1e91db628ca86173ffe9435db1df5aec146da61d82e1c9f39905672e353cb742f84584587e5a53b9bbb0d443a8e0c59b74185813d8823f822ed7d022208ac512389044abebeb4238770e1d3a1fc6303de066a8f278a9c8aaefe6c53a8f30032ab84ded7068f1159d00f8f0febaf09bd09df068a6bc26bdada8fcf9ba9ceb6802000838fbf80a9d1237a6e34698dca4075dcef6d8457c9bc5542af16af1da9cdd0a06858221c4bf3f0654c73c27768cd3dfd371461e77c88b8862abb4d9a23bdd0ec6e4e61cb39a9a87105969084bbb2761e10109e95ca131646161c64233305f45032fabb716cc5ed0d9d61d46aa734ad1638a0afe5bae1a41ca7eb6d2ab4f03fa37022f0ed4e3ad87efe0c91e9b37b3bd565e5ef640db6d874cc6664e1173cab3073e031a643de92c14ce98567072444869a378a31693cffc938dcab39f215871efa8f1031a5041974cd01ffc7c9d226c188a89733828a64651125fcd27209e2aaf7701350227b52f8a25203bf09603294a42b91996878598df352ea250b1130c5d9bc56929c23de08f84579294103f0549c1858317878cff256fbd0989fcf1e6902d7e58ddd4c4e35583eb8f6a3d9d39d20e6fc39a032e190befc3a04cbfba0c2e2e2e5ac9920318e229a529b42595c9eee6a2c8cdf166b7da0742210468f7027a500ae8c941f38d4a547c924fa211193d37446c7a7d38d5a3ef7cf43c2a974adf372c505a0e5584627e5144a9f0d5a7aa8157e77042e5b3cff35724a3a0be5d818538e76ddf461f917bf49502eefd7c4c82de675a1569e962bb14ddb73c7bf61e7e3ac4ce86a86e22ad16417df1ae4c9253ba2652c4770d012b134d9ac6cdac80fad9bbb610e30b0a4bb16e7e5e8ac6ed80f8cf5185e17906b39eaaaa712756f6b12258e2ec307106cc3523ff1147106a1611500ded9be53a22953b4dcb85950b423ec3e4d461eceb29bf2e201e25b73bd9f5fb3509d18e0585d7106f95135e0c644a9951ca275fcfb24ae4c51949ca866907c147860b9ddbbeb6e05552200a2f01d9fa3fd2daccfd3fcf5be7773892ff9b8c3b426502a4a42ad3b67747cd33013cbf39a7ef33ce8e5a3fed96325e645810d32170d636bbfec509b8c499114147a94d78402d67d36bd8b0685d9bd7b11347bd9f9558eb94acc88e44ac6d9b94afd953e5af8dcdb5091f24620717a7f179a9dada9a54fcec425da6f79b96679bfb9ba4608c7a0a4ec5984896c437c5d4e8fbbf2af322a9fa3d377eb9e467e464da8e23fa843fedc62fda73fb64c3ac03df253a3edf65a40c63e3ada63916498b9d954410caccd00e948174d1666e1b11aecb6e984c8c246d6fefc6149c75eb73dad98193bc523d4ad04d0ed142a1ff4f8e51413a0d2007dcfa0d50913271589995dd2a8e0ec95e7c72c0b559746b9d821dd2817d7843ecba6d7344cdb4fb0a5f979cadc49bc76ce3935beaa8dad6710c3a80bb59d5a60385fe8591eae04c9041b1d682d9d90ee47e731111c805223917c4a38e59515ea0feaf3c85fbe1cd67547cbc58c0a8f58fe55beba0d21d89a097e87e86298713e812b7a7e405db548cc9d33bcb47aed721695d8460f44d399c44adb32150ec38edb32468d1abb9c4a9d04938ba717c0c68646d8bf25c1e4e208488615ceeb2b5580b0f52ebaf912d5b3f919bc919a8a612e283973f7b445a42c153bd6f02de08ad9630f1388a0b806d06b73190e7c72ab4c568c7d445128bdf39a264497097594a4c4916b386ce22445efa3d19c7701b207515a89e5a47a6059cba53ad14a34de8dc23a0d68331307ab7a81264a5b9da8dafe3d7e3a5b86e3f4189a2dfb1932e1cdb1d5700b2895a45e0023829bc880330324b1e29b149718df8b3194b30c4945d882abe13dced46cec55533a011a4765a1f91b0e8daac865db99e8931ca2e563b5a4d726bb24546dde9d4c5395b637229337d09af9d1205f3caee9642b99113dde05dbd494fcd2f451907367249178bcd0562ac4b86608f2ac3af1429b103360998126b72b719258520067b791b91d8aad243bb63a4c7758d90e6939fd5b8dd46c12f047a54950d18dffd7a42a12d2cdb69428ce8078213781eb5fcf6496ff24b2389888b6e9e31abd82ca5b1883aaa22d0b7a33445d546a41e22677a9f0fc1e4dc606266bc5765c11e870d5eeca1e10049e8864dd341169bea11f66dc9ec75c90391d2e95b2d8395e5eace456ddb0cd99f948265355b60a712b4689d14378c380000000000000000bb991900000000003bab2604ab23f30b4f812cda78fe2eea438fc5b16c0396400ef61a0097175674114e474c13a1c13bcae404a2b7b185084b5bf65a707f8e74d3c945a18c3431478b8d1ea7df9c2cee474059db913db333a2f940193d6d11bd718892dc30e7ed59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009fae7dc13a8bd5d26d7555123d2982a4226477d9c747127081234db67eb59baf7f21e55dec89e2631ff58f35a25cb1d0f2b48f18a6f3000a88a8180b5574ed82eae998378ef0a414af567e6a4cb72ac49afcb9b17aefa5907938f72994c496e21170444704e1c22be2d4c1e6a56c2b70700d2c965ca1318cee063c62baaee731021deafe2f580947db6eb2d76c99b26225880f1073d6b707c855da8e1035501ff4022a97b9017b2a199ac127cf2070219631f9ed8c3566c8f3525739de352b6ebde50a0855b56c951f3245468781a158732a63d0a3a0d0a11677743d24557435ecfc370ad61fb5ad972060116213bb0a333176938a827299348c529a57fbc79710fb9e032cef71f18f610f8102eb79773015ab333aa4cdc8312a4163a35a48aff08796b10229506b560a6f36a426b6c947947b57422484e03f8207ebed52a5ae93fb75bb4b022386f76f53f315b4c035e675635f8de0833d90f602b28d454e726efe6a21509d030f3cad753bb3270c6f9c40d162cd8ec2b2e73101c1003e55edccdf979dc20b99032293b16b6d5589ce5e62e99b903b6150f4c969151191667f10ce58c40be5c03dbbac2e918ea776a912ef8683a2429cc1026f04a9bd2d5308b4e1ebb4792017aa93e608c4c5e456e02b48848186bd1a98bf9251ae91021147fb74a26b1dcf6527511907c0ed44cf2d86d1460ec6f79cfced39e4cc015719d384051f3c3b3a2e68226b01f806e66f1356bb2f610f8d459700b9efcb546c830b595d35f9b5bdceda9cc7cb96c90bd965040c5d819581770c687cf133390984c9476af36113bcafedfa86e1a060d6fe0c6932a55c8a3777a33f5d88bd4fdb01e4911624df16e75f3d94ef400d0192fad858cea6ca5e3f6f767e9d2fc1310280cb980a8504d7d7d971dd634be1b28925866f30f5884ad75744446d892cd13511fcab6d04eff67f178581374bd787b847e75fda324e19fe146323903e9de7dc4250b999542fb09fa9ee2aafa6d41f46476e85682d1049ae8d51290f71c681cb22d47303dd215b9eb150d0ed9f80c28ac320dfe73a20f825889e5794d4ef240e35c88e82378873ae0f11e41f658d48f0c26d5b7125b8508fe424c36d4344c8daa4b02636686ecd27018f4ffe17ea2a6993d425fbb09bc6db5d20fa6ed594da45ce3f9f27b042a3446f94a0823380e89cfc6026170a6d3a6ae52fb57ea0d4288af6c6094eb9e88591032e470fc8d560478c4723ff47175ea5f63f03f6b1fd6399a4d83ebbdf7086e5a953d0d5a8b1e2b51ecf10352f2b0caf9f13b2bd396460986271807f89f02bdcab8e3cb52fabc3e6dd32559c20470d7cb13de23b8de3577cfd2240eda14d678f0bdfc6503ade3c65214fb7f8f0d0d95ee02b3d2c7bf41830bf43957ce87718fced463076e292df909a8bc4020f543f9851dfff222e27bd1f8cf17ddd49729da0a42bb5132e474b500d79f18536c800d9af2e20de6846a14409fd0ca7f261fefaf3753355b831cc702b4b9e9e0eb2755ae605b0a8a44d6c752dd1ba3155aad196b944ea34a6825613c2978c00ac6135b5c7bd358aacbb4e72949c77be4dd99733740ec95ea037ad89a6043724e64fe7201966d5d3060e740a78919cbb31ab11f872193b675ed86a709d70d970835d769bcc14c67226a4c1acc8834a23b8aa1c3f06d77c0a3c8d7eef011edaf0686d1348e01cf0396fa8711dc3646e3512c829192c8d18d99f3060e4e1795957039034f7a50d45d0dbbeaa872c15a1eeeab4f4fe19721a9f2ae5883ad530af1e2bc55e31d2459ec66eb562a45535415a6c8474d229248fb53fe76af1a3ea7f25a45f01ea89fd1490c3ac1f8203c36609ff6a5c608ee8eb56f7d0e3897297e83c1647a398fee92f91a165b605a5528a9439cdd87bd2d852bfbd657edfe6fe7460beb6756e21f25218bf8897b39d7827cd36f8fa6767bd440757ecd9c07b285a882bb83ea8773fbc1ceef85a785e584e2e4a5585a5d9c3f361bf83156bff983ba1ee09a36aca7a15ec8af4fd3de533e8059c1746d453c0dff4c31a22503fc5c8d1ef5f4ba8f096b824b91a1ea44461df15d523d3bb96f1c37680d9e70352db958ca24b59257f80bd0a7976215302d3c59f030928ad682a7941bd550ec84fd077e12a6e582615a4a0ff2c6fd90f3de0e6ac03d5c9241283e0ad50240c6cb748fe6758c777c1a2764d141f936ee5027700491d82b82a7dc50e2fad0c7aec9e465a932cd2fc8ea69ec2ce7e5c61ed5d522b8e09c5d128f6944156f44030cd598edf26de0057fc565b9c80226f1987de1683a80bc8633eb6a2088700f5cdb76915ed6cac9c9f83b12573f79dc2f9fb30e894c7a9e6e183a9e7fa3fc1c7175f01bca92b1483fb6f0e6cdae3d64d7f4644a6bae21cf862c7ca9de581e967719173e3cc52dfeb2dd1c65e2007", "005252", 0, 1214665202, 1537743641, "7ee525ee0815e8cc5d8da270d16190f7992c886ed4d4e1e02d140ab6696f6998"], - ["030000807082c40303e9407728635a2740ec83c6794bf2cbd78c2cc6e95f68fb98e67a2a8040b96da103000000076a53ac636a5365ffffffff96880f40a2de38820cd647ba71df5b32b6bcc31e39d5de09d0d4e90fa45a84cf01000000056351535265ffffffffedc3215c42e4e93b090acc9aba891adfe51b0072351cb773e836c06426a546ab0100000000ffffffff0123c54c04000000000263008f074df00000000000", "65", 0, 870048480, 1537743641, "d4a7d028ef2abe20c420fed5e672a7d99dc1c5b73c9ccb621e6937a9a285f8c9"], - ["030000807082c403048f02f952bf38f915138b9dd170ef14f3bedd7b42cd4790c71bd9d4f0e2c092df02000000036a5165ffffffffcdac79469aa0cbd8c3583a7ee0dd2df6f6c67e51b2a28cd1679e60acfe4f283b020000000753006a52ac006ac6110b90c1f6c26009cb5d8cb2c9e4906b82605dfb23577ae0dd506a9048f007c5b07dc002000000045352006a98d8c9f6fe6d4024b262fde4ec904b228ffbc1fc365b8f1824862448e1083c08a08efcd0020000000852ac005153006565ffffffff0116733903000000000451006353d1a8f11a0000000000", "", 2, 70481422, 0, "fb9888ee3f5fa4577233f5bb3e819fd7b8f722bd8f1adf7b51be6ce5026121f2"], - ["030000807082c403046dc9b425e55d74fee5827df63d5cb278a3069e7873412b1ce4b6d5e92be3a28903000000045252656adab4eebcad2214bcb8c8dc6ae6ad2c785307bcedc7fd176af13e0681b092c52b2515ee5a0200000007656a526565536affffffffa4e61eefa4d8fc4a7dea6a9bf112ddd6fc7bc2ae8b1f114a0733f16cc30bb40b0200000009ac006351515152536aa67641526826778a6dd02b0d734873c1836708b80f6f376aaa57299b746bc9f0efb4afb80000000008656a5253536a6351ffffffff0102863603000000000253510000000000000000030000000000000000cf4ba70300000000d53b88c9a9a69506b18a1a87771e56dcfc41e73c9058d5783dbfbb089c0067860392e052a07a167592ef22ef292bef1fa2644f05afe1d51009b2fc96e872fb8bf7520fcf5c0360caabfc9de51c85ee9711508588362c84984017f71c1e56470500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000315113d782a4d9ade6746825126fc485f9afdce8f998f7d9936269dbf2e61641c25d20665121e4c0597621c0e4d8114e871120ed4781eb1799e5c9b1f8ad88ba2dca415151de11608692489a9290ccd1beca3c6e9478817497004f681e8dcc15eacf7d0b0bf2e0d823a01ed98f01e3a4a5eccd44a2bdc2b5e0bd1c8186dd5034032007f4c0cee6bb12e87d7ffd85974d2e0a57bf32f972d072c16937a470353f230306a3b9952f4282eb3305745e3b2b7725b63d289aceeef460fe3c49c25325e9610a05b4d909022a05666cd5cfee5bc784123c7a0c6bf9180122798de9ba3b362da9ef5c29d1d9ecd8908d2e9116b804aa66a8b13c7bd833e1b62c045cd540ff16eb022ea73f07d45f355e26617f76c605c0f69933b7314177ced021b9676d88d37f320306e8979ef2bcc487fb1194b7dd6039f2a0fc56c4091b1c7d2d5d2ce486b111710210651fd55887c3a6836d2640e2070c029fb2541452537a33b8a4bbad4eedfcc90319b3b8ac977b9455d20ea8f70640e1a55a35ff231d61708121a7e1815d88bf5102155d168243d9aba520aa2b6e214c6b3af619a312f3f1908eb1e5e6d8ac8d5076911880844295feff3ba9981a0d5311814c4ca70152c89ff7af5e1a0aef019dc86af1f7aafc43525ce971bfeebf022569e62c330892426c4808b561d2b69137c40868af6699e50f395ba72b1d773b3a72c3adf7c5385ce1e7ec93d8091a369d95fb20f766e4762e761a98eb370ef353b9102b2b489a28c8820c79e59563887e11f9ca48db3fc019a7aba1d11fabd8f100ea846f140bacad7c2187e376251a6104b23dc65a998576b4551aae78f6eebde9c6a06d484c9d4d2cada478acf5c610c7ba49305d1db6fb51d4bb2c3e15b0d1c3e91134b4c4cb2e2e1469b1907854a4e8d5f685cf5256ae152cffa8d5d900763dcfadc7a04b17576c7433422b44281e406bec91ac828184f28d22c06fbd92ec1a955830dd89a42017b3ec61f93ac8096cd9c663b4eb75c528b86cf4c05fb52cb8098fcaa0f4387d731488c569da1794b6ea3479bf9feaefc26e945d62afd5986f183dcc82e8b41ebfafc1e0fdd1beea5f7e223c92efb7d0afc6a56a5a93dbdd6956c0beb91151aeb98ead06cf088ff4c70a65ee5785fb1524d1c9a2bbed814e1529e2423a494b3bc05839064f14779ca0f9aa1d03243f42a8491be6749d5bd6b7b9291288c370a012d0bac8a392ed94c9853c7dead5743b1feffe8fbd035ef330c1a607c219e65930a2cf2e27b70a85d346d5615ac3289fa31e49b8b8f8f6355a0c1358d5e7949d418f9b2780a5e739bed0acbadda034517966f40ce64383f051d408863fc22edf481c76f2c12250b91cdbffa9f55b986173ba9a578a872209627214882008e20886db5abc660b460e1e98e28c5eb0426743f71cc791d3ac5e2fd043edb79137525c680859c84b36d23ad1e228556c832883c4965e583d6522ce99ec9a20e8972c440e9f7a2da5ca820beff81b9f9ab752e782c9675195724cc7150d6f07fcb0e2c53458b730ba3a1bc4eb7e300b49d060e304afdfcf18f4987c271b195efaf5e94aeacd0a366c83a48cb5ba891856f5b31b3bec7947a6eb8079f543445f10be3c9cbadcbe5fa31033698854ce0773192cff7f716b3ba0a954701510a3b8e8327a056b33640595ea668b8cb4070555388770332e681794d34c2f643aeece4df59f191d4f572f7d61bed0de9c4504e3e6c0c3ee0eb6a281bfbee087e1325232eaab81dad9775b02f585babece598f587aafa64a28bf728751f22ce2a22b3b97f576030fa11ec0b549a2e99fa0711f1cd3e52a9297a72e2867933c1d631e206e6bcc61ea1bde7aca1b9746ebea972ff134ca199a70b2729ce1e35de1e27c846060932183fa781517de5900c9d05b42fb0e60ccd1dba88e902abb4330cf2771565d9ff3788f3d2f36b070b198cef29125e477647a57ae6a0975135df7d596f8aed742462e4aefa8fa3dc18e20d0a3fa3a2f64ff728c2e6113974e353e330103070280aede5f648e661e8e90fe9559ae1b3fb52da46b0d45be3a5853067a42fa94b47f27a6599ecf2893b7b719f430e0b263b88f8bc477fa55d222fdae320d8f744a962ef2283917a5e8b64d75ff7d7f48e4c6f5d3e45cba7933683b5fcf4e12975ae244a4b8e99f12565bfad8a072717d0d8a828db79a29017d2d0b165850b7124dbead77577e8cd82cf0bc14ddd21c8ebfe2d76f4a3a90dbe21e5d6d4bd1581c6a43f8f7ab7559cf83d6da9a68b0515a47f64f0cd7797598271d1625a6b0c09105000000000000000000000000b1f0f214551910fcd9503b1620abb132a07528ff27c0cbd98ab4334b15fe631a2e3ed433bcec73dbab9e73144592070ffc46b507b55ec279c298e2f7321bebbde5156b87f429c6252a2ea591949f210f7334e5f45c0c87bb681869ab64be3f48000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ac711f15669c792b5d97e2f22009c239ef45ff997b50d37f7cdefdaaea2578355bd618ef96953a5eb9f2766d479bdc185433d2ecc30d30f8098e8c4c7c7499c4e86439552a153050a0b4b8c68fd38900280f89d4b349f3480f61ac6d6180c99e46dd458594e07f74ef6a2616a9bbd1b22b08aa010543154b34f2a2bee93e6310319e84aab1438684f2250960c443e3d940748f0776b02e1e11d99075657a0f63d03158b55669dde2e51e42674b1b25ae7152cdab0c01b471007bfe004b29203e8a40b022c0f0c56e23ef86fc11d5e95f67c174e0aea436e588f8534dc8c140201ea34334cfa45ad16999840f4975e06510ecb012093c8dd9d40e6b47e443c6c44b29d021f3d0c05b133b4e50e6a282f193a17249bcd11eb38fc06555a0a7133022f42640229701d7c3204f52ee1dca8e6709f7d11e01b80adc1f90b1aa3d8bd58feb80426030a6e9948e8eb4d0e021d82158672fea16e9b90c512befabcbd6de41c86daefac031124819e6064f8f173883890fb57d3bcb16fbbc968e2a98edf45abfbb5f21d1b030b79953589645cd981331e11f4efaf53f489f31cf3595d0a28b125dd48d9bd8b4c289442eb3ad20fb006598e704732e367b6d81aa517c014c6d20a0eef6aaed682acc53423c86cb1f7d3134380e10f98a5f476ba7637749e0fcfb76065f7dcf299a6a4d6a5d83d8687c261c87c42bed23a345e873e517ca2be84599c8f22fe9dd15a8559e057cf7fef63c372d5d901a13f691882137141e7ff8c45c67b5c8bc4daaea3927d27a5ddf6d21bf14caf6de819ba602a676b0525167cdbcb10d0f1847f7e70ac1683e85b5ece7f6c11a008b4f3728ba5c2a49e8ad323ff6b352f7a9453e584edc5efb20ee1a3c13431ee266491314f05d25c06aee3cc294de2619b53872a8b0b8b32e5c2e83a24ff530c24e43c2fed93d5beb8333622a2179c06b97f16401aa6aed9acb436de163260600f4b1ef28cbd80e80d80b5da616c8e96a74b07d6e50871897424b4fa5dda55a434c3c8041adc001c615d1a520ad0ccf6f5c005d9a5be2511270d2f1359841b6b148dcefecab6db40b01117ac7be918ba7083bfbd52fea38ec713d32fd59009ce66a6ef0320f4a974f190b916eeac499a61036845ad8dc6e6524026c46c079690261ce5133dfa2b5985c91e6dae377a6ab953d1a64034ac47c6dcc54c023a2a3efa8b0c6f8c255f015c346f901b15e4fbe24fd5da5d8e7aae13a8e798d70091dbe119493dca595bedf0bef23ed4266aab21b9376e6709b5d0531f0fef4e7f7959e1be62317da271002f8b399b816422e6a6d55082c65cc0530a071cf3408375412df38a1dfdebf254f033e920527b790c85fddbeb2822e52dd7968b46b25e00c56c7dcacecb1ef350e420a3e786e4d5df91550ebe94205ed7969788edd7ae833c86100f13c5f1d11d2d69752f0fb6ff74d57cd25e2369bc385987dfd3ec291296660ed280ef5d697716336a7c226c209c83ffe2a67951efb7a9f1f6363deb01f6a15678394833febe93888ef20be3db4c4abf455fc339fffa3a68723372fd9191dd9a33e110f67d6205852d122c8ca691a948078d40990b4da0e362559020eec1a0e7d4577308a23540d09fa275db7b18f8ee75044c5b9efbb54cc1a7cc8641a6ccd129667615751e39df19c1f9a676cc2ef55b2a750ea2bced83bece1c6c7e3d8956b499b7acb39fa289ec509949150304455323f24b97d15afb5af7c774e7bad98e89a65ce8f19919cab860fed3d71dc1fba9de11441475b55e2ce64c7436bfc06cc44d0e2604200324888b2d66dd5967f9cc1f4991c542325d35cbb2f03f0e819b115692c5822f9ddd1da75caa24aedc0d9c66e5af848402b054c48d42d2c43aedc264b6ece2acf3131346a11c35daa7f6eb8af3881e0ccd828b59a45317523de54a0a57adbb41fe58dbe1bf9e9d365e76c8ec91439ec38bddf6804df8e35a928a55a945f19a7ee402763064b87a7462fc40dca97304dd87b825143a6a246ffc5df7a5969ea0e241a251228cadd4e07b0eccbf841299f4f2144bde21dd1661a78138dcefbe961d059498d6d08762fab8989b9a2b353e34f464835d56c32353763e7c0683759c635ce7f010cf5a3f383c080f4c0d2c3acf365ae3a177cbca106a254ad1b1102273f7c5afa731f647e1d68b57c28d7c97321bdab63a5f815a9cc364660f8e43066007686a15646887e7e94eb11376fde7caceabb668db4efda3fbd2c92d2f9fb4b55fc226c59c45d1b6b48b96c3e795748e8c67515d0eeea5a5dbcc51b10000000000000000eb150a0400000000a1d20079a05e26aca57598011f18b873edc581c22b4339b38a167b8ec47a415e941326bb31d24ef5bd37a842d87a5554c3e2e34045a4efc9862a7b3afecaa68d7ee23871821e3014d2b641c4fa4280d3a5da487ce44caff61bd26dffd293670a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af6a170f4724682250de20f8aa5cfadcc78d7fbbfdd4a963bc2747aa40d3ca0e264978a316e02bfae08b4df1639d6d309037f840db3fdc54ec9c3f13c30b83332549199bbfb8d36d86fce777a573066b2a0023ec59fc966ca132a713d12fb253a89ab98dd59e6c840fcfca2a97aa27f985e9219d676d16be37297d65b08f0204030696496e93942561477f3a6292f088f622eee52829797e5d06f5fe13f8338e2102221c611936ca35a0b19e679fac9bc6cd0c73dc6ad4b2ae72540fa6190c5c25080a09007f8d22d50b2129871bd90221ad32cca1693ea6a2bfa4899051ee873e2c9199dbafc7b5c0f213f4b5a4399d93b3cfaa86285c105876220c79352d5f582c1903283145fc003e2841fc057680c03f9c1d508bb1c17dfa58e5e954441c3bdb000b03193db0dfb7b5a754f3105b75c70f0d4e3b44e54e484dc14357e4a7942fc83797022658993e5f1eeaacf267ef2202f788aa3fd6cbcd1485de99ea4eba84fa1d83e403277ff7ecab34064ff6a18127ea738e4f799a5a86eb8ce9416aed32c5d086da5e02045220476c8692dfba069a833a0cffecc75dedbda7e0311ad465ec1ff983127c4699241963b1c833191ed4bd6ca11e90a266a248798e4c8e89843c354c9142db2009859a350860e4080bfd23db3b43a20f7910439b4fe34b57001f864f1a1eebe8f4786796cc4611766533d81868700b64a60aee6ff3d1aca982a929094b3214ad88b9b707d9ccd56de99a44964fc5d34cb1277be7c8e2639e28614b2725d3f900cd7fe09ab77653e35e52fa4d8630f747bbda60a52506ff726fe04e2d29c878655b236f65c4f445259069a6afb99418e411f6245a15a4856663f3ea7bab6e1a4260114152750a94b50c45d688a8bdef36db49d70d08947c66dd4130d735db295cf9ac5a6cbbe303821e7f27a0ffc00bb5e56fa7963c08014ed30c4f7d7d3f34b66611c297dca17cfe8a2aea003191ee4bffcab78cc3731786400bf6fa5dea36688a4ee7dfedf690545cc27480bd0df7c60f46c6ec43cf09463f75bc5c4b101e02be1d3daae97c2ffe8bea6fbe19dbfcec4d5070e48691c0bf1b51e2b04b7a13d88bd7f14f35e2d18ef5b47b3a6dd58d396b5a8beb294a9fc74fdada10ab971225ef182b2b33c02021eafeb85ec510c37ce2327c76cb9ba882893cf6138012d830b0775e3fc5d69493e877b3f2b24c901354fe3815ca0119f3ab056454df9839fb4445dfa0e5c08efa29bba2fe46d097d3c470d32495a1f4c2356594decf39ca59897a1c63ce86d542df2abbea7e10d19d729adb5e2ba0239a3835096cc116ac492d3e78ef4870e94f938d5de072a392bfb13dd19cd332a98aa865c6f0880ff36617acc7de13297d9f7981e02d7bd8443c656bc97ee764f4a998d98dfb0dc6f6c5d0f4fe392c131badbc8ccb818d8391c312795e96f30b343f64f56d9458f671a20532c530e3a29ae0fc817209be769ec8d87d65ebe43a4d2796037fae02ea5faa26dd587eaa9e726bd4bb68ce775704867551762ebd0a80fc15b932128f98a880a9d84586e86f7dd400ba7c467311141f6bf2ba0a9d4483f7169c08e4c9de33e2fc19af0e3efb1ff0bf571ad3ba1f1e5a58391c71958a41b52ed17e936d87f28075539864238a0e8249dd3f42a13a1275e768f38cc47f979df9fdd42875aae45d65875997be5a5c960650a99c4d4f277b4d85bdf2cb6544fed9c558cb14161c2525cdb07f97a9ea5f57c9e8ed4593424e0f2ce0a46049c3739ffd5e396ea744f26a85d334ec7cba6d068832ee2ec565699525165a12179dddf899e645bfe548ada19456a7998ecf5b9f792ccec822f781433f8414027c08ff3bee5ef6847f5a59d4858f49bbd60c1a3ca8f369ad9b5ffb3abaf6478167b3f9b4f2699e094fd93ec13b2334bff78782bb6e7f4265d24c1babed694b9fae4587896218de20b88e92e01cb7be2e53e027e0525624ba1b1b0364a6a4ca6b49f42b0357d4a76b1a54e0fee0970174d6c39261bf95ef66e7097ff3669df425401d390d2e89cdb8b4d69946802300e121fc86c441f2329a1242a44197bc6b01ec04796586e290445ba05669a9ce6e0ab72bf094afad36521b379a3f120f790eded52a317a3af7a74fb55a9661353a33e9096eb4ddead695e27e3998a6c01be35674d28b923c15901318ec5a8d6bd3cf9b60a65680d3bcaf0281c789981a5c5e1cd6bc32eba03f31a6a11c3a30e2d336d56ffa5257077889622b33afe8d2d0e2aacdb17314d5186793a3d785983c4f79d755310b35fd5d20c3b6b6cdc0928b08e16632512bc70a29b9246f33798078fbb5b94e01e427b857b3f5b0b1e25fd3ddf6b443e72ca25af464a54900e210d79f2394b40cdb5b3533132479b67d3c34de31a3b629e2c24837b4dd9d4c811573e2abe5b197bc5dd72385a2580b", "526a5163006a5153", 1, -1823252297, 0, "7d42d6e22d7cc3fff4171e9463d90d0a2f5bb35a393cc400349784bfafe8c338"], - ["a5f5574004b356988258060dd79fb0e9e97a36faf9e1eee14e2f61a460066b8fabb61ec753020000000151ffffffff299ee8cd8414e880b4599b506eca1a4eae6816b94184b0fda9a262bde350331300000000096a005352ac635353acffffffffd8dd747cc69fff77e2e2cc800de89ca51e70409e8c27fae72aecff955f141b43000000000651ac52ac6553f83af4b4588dffe191bfb5ee9959b6dedb9e573281613f98612998b5aed7564e037ed438010000000028ba19c00251ab240100000000005ae134030000000001002ac688bd0200000000000000007cd44a05000000004395a5d2647d6851978e823be24f468c763dd3d2361013f91d2937c6ef5a627fbbdf708249f04b554a22c3089ed30fe94b06774725dbab5c71dab07488fea571fa50cddcd2198cf4ef6ac3fd8440eafb8a125ee5c01da6cfe08857567022472a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ba4e7944f6887b9935666c50ebbb2c94b6fc66a4725805116196b9a59ce1a837fa78c72df2ce0018459fc65948c1a92419e740d74dcf2de8814f25ccd7a91c759b4304025304142979e6ba1c5ed507605ecbc05eedf45bc41f119e071cbf52d54270d1e04d929ee0b40ac526b298eb9eebd58155a35b6374c432d621f33f0935031ea4f8a43e45c9ce48b8c73310dbeaaf898b199d6638301ed9833e9946698236021467ac1e6afde508c9a22aaf7eeef738eadc745215af58856af47de7c7f2f6e50b064959b2c8fb21acba86a7868eb3d3d5e2429120579c9fb8fc0fb4bf60a863c8847a51dffae717104ac69803448d0a2c336ff2f8c1d1f593f387a8d5587eb2d4032839d5e228e99a0e12e0b3f096d82565348df6da29c309fa50d7b8b98ead6ac90208f2eaf23bd083bc9d089118f33896bfb249a9f2c4f78a3a866dc7a9929b678203199ba3ed2f5cd264c530b080c38a30a5b66c5fd6bc324b90298065d4cb3f9acf03184caacda1f5e411ef50aa2a82a0f8841b1e51a05e115e86682e24563f095bc8030abae56bb12d5496cb0149320161a5876645724a9117b099dac1e24a800e1ae40bc3b3be58129fa3bffb7ac8dfa5054bb0b7cabd14ab6403c8b26c96ba7dcb1977a1420012fa286c27bad23c581cbc1ff8525cc1d0e7dfe5caa0e3fcfd204c1b18bc07d805a0f4e14926f8bdd69fd5809b55e65ef9a3ec3dd37e2e532fecafc9ff8e626cb24d2ce133368c4bdc6086ab3ece0997e3ba9f01dbc990e9dd79393fde301bfbcb9ec0a97e98a5081c91220362d125dbc5a09bc2bcc6fc26caf795e0329cc4b2575e7bc2f7399b0ade6d68da7633c5c66a404b1f1e88d678e3e4f61438a9b0d32a79674082652db8193b618c38602379422fcab435cb4b52865f3964fd9b336674ab76c4e23bc7f1ae8b2c6b9e11b1b8f070bffae1aa3f96365871151129d21793e9fbfde89672e296c77a7eb332e616e795ae1a1a5b26568121d36e5a394ed0736db15ea34fb252e72cee182bf0b031932e4753e9127a580272abf8d34bfddecaf0f90530d75c5d225dd0507dbe23bc649507c96b9052346e9703b9651eeb4f42b93ecb90469aaa21724ae3367adaa226297901a55ffc910e89b984db6aded1652ed10836de47e8b41b81921bda8bcef526f134454dd5220a20f827732a334a747c444a59719a619d2175a93b926cb491f61bb4aaefb21f9e1ba376ee9bc5bef8ff250f75a43f8591308012fef0b1eae14f63669971e48b605302daf95d0b4faadecbf9caf15d1ccf971bd1cec7012eba63002a91f9120523d064bf4d9b6f78e79e4c306f6763763118866578cc5884d4f04c221cb98b6645af4ad4fc9a4d05bdd6d2cae6e4a0d895954e6197b5f997c21b7e477dfecab196df0b162eb063d4b8486cca3fd64414e2b2e2fd4254ddf66713532addf1f049875ebf7576b202c1199d854562f8134e65107eec6835c26bcaba45660574ef0af525e9fd0be47738b00097ca40a2dcde34cc778594f5b11191736b3e4f7eda55e2fa0aec57ce622b13d3f182ddde1ba5ff682b98a7ef853d397ba677d6767cebbf51e6d3803741ff7bb4edb75bd2509c2ed65e1a0b91c1af5eaae86d5bcf819e4f836488ad41dcb53e7db2315aca63943e5d4d6402bf070c81d13c3442a94068c82d89fbfbf2f1f70bb3625408dadb2f06e9d86abc780620a37636110878404d6fc1a7f8da393610cbf4e92a66ce6c2cc8206b709a4143b6283cd67cb66644b5d7eb2cc52b3904662f0d6f3d13ae5c0df721631e65a8bd90ff6ca6280becd8d5bc19929e286bcfebd96c2a4afe8d03135c22c58aa27e39cbf8b20101bf37d097ce1ba7067156b4a066671d67f63cf7c08626cdfedfcbae4693bab05a5446d727285f12ddd5979e11a012b53e2cd7ba4ed2d592c5bf33ad2478997beb387ca13c9e701733d89e0e4b4801bcc5792697df762e3c89f40c17c33ad1d053249398b9c3fabc81d1c5029943038c8025550e22420c6852636c65c70f38857e20ce106d6ad1f8153577141b7c90a1c9e859ae90516eee6281d8d01b33088f68fbd4c17ed57ee9066cbb71e75f54772ae18f4e24ddc3bcfb0b42012bd1bf501c2c98474f9a99f8b83dbd8e045e4a087af5481c975a9007317b9b3aa639566d7b16f49896feb6673f88ab4891ed32246af442a76080c16227e81aa75735da6698f540dff0ebf2ae709a7ea0e7cf5a8000095f9c01027d2b60955bec66cef5e52e8ea63d1366912ea37c4a6311e7185f703427723eec2e22d404f10000000000000000d0688f0400000000074439289e9d9b0f20ba1e105a85794f67805608dc169bff35b3e5c64150e2eec75fa37f7733b7daf15f3df4c1df457a85e2dec3d860593d8eb07639d1b68987a05e4edf0ac98e0d8e8d439f177e67ec199063b2efe26827748b9102a2aaab6400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bcc436595c97fa67a8ffb9c41bfe3bcba1a19f214981b34b6a57e1908ed0cd239edd73e690af0c56ffcea9483e901b9519f623540d36dd0cd81ccfef14f8d0cd31dc440a81e3b1d59c6371b53c5376464c7275efcf808e73abef80c75e8299825c6b23dbb18eedd43892a5342d68ffa22b5a0b5c4c6687bf63f3bc82da21d2cf0213ca4ffbe842d936d95148a32799daf69c3a29bea4a4a3db301a5589bb6083150313ecce2cf2f10a5b14145e281d09cc0c6594ea663a04e3d323841c1bff4996ba0b08f1a626d79240d9b26ad33dbedb386006771b50be3ab0c7ef06904f4491f17ef37da268970d338941c379e33b734d3b580fbd9f2e80de3b2b3907baab4e22510229aef1660b3574ff0d05812d1bb4586fe2e6b1802ea27df5fee135636322aa5b030e06ecde8b298488a0dc53c7161c7b8d84306c20735afce0f8086c9a69534d340302b2d2b8c9aad6fd5054154e1ff021b044bb01b3bcca13ed4f4d8f67998e4d47032ae2a44ca783b747a88009664cb2ce55f9d1682b7addba1a89647d7729164d410218d6af5897356d73c815fd84df966dae6729a7f1e0b7d94976ddba48b6765c0bc94182f0d6ea422e7446bc2f9245b524093a25a0749d49c75f4b14b469c4066e6eabac55078d186183ba0d55d3ef81d6c30eaf6b1467dfedf7d91caba011f5d9b9b7f80ba6a028ae65be2e51bd0d36568ba4e762b6e460dd6d85bea77251f1e1eb9144daf92fdc2f560b19d0ffac5b0912a12154f534cd320ff8171ee015a73df870b9be773f945eae56ff5e0946f0409af75b13e3279de2548a174f2ac7e44cfe9293ea189581fbc608eae41b4e1c24e772724f320abb238089eb6aa52649ca358b58ed12e48dfd072f82186a3797da154dfe9b053a2fc96bbe3675a7ca976214d4cd2a6c39bbb43f83f1ad455755692ec599f292276521406ed32c9da67beee7b64c35be107eb05189325901694f779d2df10481064b1cb0df450e08ff8b404424009be3432bda28e16ac13f86681a9911e03948054433c8b000c82362cf5187eb690b972af5012968388c4b736f385ab050bd438c8dbf29a26ac19055a1c29d3ca5be72c89987696c9b593f894f1f291f387b2c6e44baf0f53040aacc58abbdc235d5faf4d8e1cbbe644db8e307841bee9dbc80a5d33287570d161d502ed3951d136d78387391a5c2931a5e0b206be75f1f45ff8fac958ae8887e90c9206fbffa1d0e7971cd8cc288683369769f2bc958c96119b45dd1ed4e8bb31ec63eda7022c6062e252c99f24fbc6866d8f90bf8aa0cccb045b54dca1a45cd420ca5d15cf0a25ee9ba0de03637904fd9464a8aeeb224ae03ad05f05cff83fb113a1cc69f7dd575a0b0b2753837fa5fad7ee0d57bdc7deecffcc94a3dd762066cea930ec924872b40f7f80db50761619b0723a6cece1660e45eadcf6830b5e2dc8a25ece6e9fc29b910864a31010903aa15be9f7ec0085fafc3573613b692008f76d585190493d31ea14793769e5b652311bd463a0f8ac9c925fff831a25890c148993e713adc17740cc5da1e0960b908292052a10334277d1f8d642e420a7d4ef7bd6544b3e548f1670b68fe0d9fed3d268bb6a4d3357ac433fb8b6298abfaa413af1ef2e0e5b8c934a39e295750a6d728979c857d03b2ffe43419de7f898c062bb35a9b0a70332513b914e1003c4db2878f4079a28c2bdd7364cf079a1247f897675241032081c781d2c305cb85cb7b8e6a7e04bc0beaa798ef0fb8fd7c319d80a2b65d61547b3ec22f9126a53ac85c75261bdb7bc7a57eeb5b2303a1b7d996f0355c04438b4a69e803753d1400639e90a435acb3c6400c0bdfe938e81a20dd954110fc946bb45e9836f7b5db8c6494a6c180403a8ae35c41814bf08dfa1296a54eb9e2dbd498bb01cf79bf760e02292d38205f079fca7f88cb088b1779507f3088468d20aa720f7df3a45eadf002ee1b8d47c48b56b5a1afefc7c3a6d908a45e3692d1cad97828811cd123c17dabbc2367febafd3675aac6d967029792524679584fd2c7616474042cc811f940dadf9c608e79362d0125bed83cb93422f5c51b78d1904a34b2448ebe8aac943b1e2e5ac232779a87ebe5ec58cd832af9ea7dad01daef851299e8f2498a6887d551abfabcfac50e77d249602b521ba913880243b0de8a05b3f65586a998cd7644e811d4b44574500eeb773ba92fbd70da821a0fb96234301f280ad98d16141f4da51f052595b6d69d708ee46bb0668efe064f3aa86ec908361093a9bf8a67124c49bad610927b11c2f043ece2562c82103f1def51e771f7b0a040f4fb98b54acd82fb12b518d12087c37c7e9b7d186f3317a6ec5da7c93a72e0425b084aaa90065777ad86683043bf1fddf96e77006bfb849f7c0f0d97f0b6282734a973fbf21057a9c96c640d01", "", 2, -284521994, 0, "7fe3017e0c5d83230bf307e39df440d126592deea405f935c6aa3198782ff8f7"], - ["030000807082c40304d36cbf993062594685d0742a93d98e12fb4dccf6a3501ad7324865b07f287a900100000006ac5352516565cd86c53df8d2fd504f8da7ffd5083a8c04c3df6666d5aa42d3d6a00e50f475651f8df10f0200000006ac5353635300ffffffff60bfad8fdc5a2be6ae5d56aa22ab90baa6beff69d756037305a68907c2c4e1870300000006ac6563656553fffffffff8aec083b4b0c471d60b707fc2b8a0b0749807b9a4728e347849c9ca2734dfa9010000000853ac0000526a536ad3af2dc403476a1100000000000400656551a52d8d0100000000096353525353006a536a714d82040000000007ac5251526a00ac901d5f5f98b39e570348109a00000000000000000000000000d5bc1d40698f28c21ca6bf2a90e927afe20eab9b5257cff5de6db8a152b12cd52caa3e0ed6636b97c135d535f1d3aaaf291b573711609900d4ec7c5de32fbba42610b65c1398469ae0a3f8bb90de35c5c584fed4940c06ef2fb6829d064ac0d9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b27d877c0340e91f76fc88896aa36ef14938bae55eb12eba4d4139701554a8e28cb359a6f29cda83428a35b633508dae9570df62e252e5403cf35d7e5177f4b4e4ab4def3b81c774b021803be7421ddb2c4a339dd5861517844c87ede87520d90e3e4a1021ca2a75d5593c404eb582e77ce01cbddb00bab8a958cd685d2a5a9031e92bb204bb5883e3c165b6265da2a5830d5fc562acef247ce2facb5916a4efb0205f36419e6e6d1e9d8e942f5072730089c744bcda801a2beb21c8203795a1dba0a04e83bb24d1799020e4d9d6fd82f553595054de09e472bc8e61de8975b31fa69d2d38a682e3ffcf2de93388b9960124f8b792998b9d1dbf6ce6a8a3be9e26017030a2463d513343ad1d0c3eb0105bddf7043108deb18b47fd515e5a17c414bc363021753b765119e3dc4ee36654c31423c49b45dd5c71e2f5998132c07ffe6230ed5022f5b6424d003a73fbca7ed8c6a96a16f9812a8c5e62390a8281d338a2fd3702e020e84ad10442462fec0a5326230cd8a3d62431873873c0f9583eb147cc8bc996b0302649a704d5b96076c0301a7cea84e6c16e8a15c9b53088aa8249ce2a9955ae8e5e023a36559f6122fd5d89ef0aee39c9de31e6becd2f4213412b279466cf82c02b1bb688d6acfc243678e2687c6ad1b3f6c9e8060b35932ac62525937d0f61ea8aec029b99a58b2086c1a433f5decb9cb9ecdbf014695fe2b92351402e352948df34f600e9f59e4b2689e3db59fead59c26012887b33dab04142dbee8e26de34cbc62a13a0b1a09bad53ade526eeec07d3d70ac62735517167cccb7250a6c3230c2d18c26049a63ab089c90653ea468a44e5d9b826529da1401e43f86095e8d1cc36092b79aaa112899419fb1c6f0ba64653dc9a5d6e8b1b2b7db6725aa0d113498a9a7408e411219d24e4833201bb375f3e78cb377a5bc393f6ae58fbf417384d78275a3d394552048721ade31d363b9a9e12de432a5d8b18f4ef5e18b173d96bbe39c8c74deada3adf060f12465d03976c9c18ffcfc4d1d2b3095093e4456d6645e0ec2b2a46b4cb474e6c5760694a7f672731d3bc2da692c5230942158d89ef0802f41a009fbff3fac03f4fe31acbaf2d7494e348f3787131be4149217b6aee2c89bc13dc5fb1e108c73c0ce24f814b6b0930b24d09fa0db478a10c463fb695cfac99b319ebbd1ed672653eab7aa782b02f9d7c09f061c507bb82d54a332b3eac4e114adf7494891a6d0715823fd3931b3571d170825d6496d2543e83614df73e2a6319c7aec119d82fa87bbbc6f84f8f90bb2c308395f472383a49cf35d703c7e37a8ad341e646ea5b36d200f842c7ef164e1b2f94b77364549847038bdd6a1871e978c92ef3aa471b07e867efbd63f2f34b4cc0a5b1db3e19770862cfb8a8ecfb01e2b9e76dc647651cee6974218d807b5b4cfa25bc9a4b5779deca61c723729715c318f854dfb3a6e2de70ba5b9c5f4edf7f2d8884181a9e72b7124ac2600a7c9125970b3fa3c64e7c2e1562dafb77c9e7521438a3706ea5bad50f63f6789c2d048d20b1a6432b7030d6b336f7fc11d3b2b32a11d42278d4451c9ce18d1ed6781a9c9586ecfb0e234052e64639683f95e9cc943a0915fd6c4f8adb6579f8141efb6287d3841e8403ae580ac88b3f3295148c65a89c91cf0042d07a44b42d851ca53107c8a038ad37f8a41284d55971012aa8a3979f6d22188ecd9622642d58c309f6ab7cb0d3b34862e33ae11820c0449878504f3886acbbf4a7a7469d36dee2339b4c1d1c2899aaee7596dcf0c107f79dcc608c9df79b5f89c8f89aa54a1ab35b204d655ce5044ba709c6d807dc818ced14c2e022a2c5769c3e3b98608b46479d22fd459e6bf8267e819c2556e502ce5a1121b1150e09eb8934581056ec3d22b23dd35c75d58182bc1c340a8bb9986f839660362b489d9dc6412bbc98d54cd27f4018cdc6d6f321b25138cff20318e3eb7d8851e5548b3d60d385b3011a0c95ea4bf03d181244939523e58ec9bf3a0915791c00a19e1e3cc3d70de231b52460ee62b03c5f8e33ca352c885c68102a53a38099809faee402281d2a7d805a90b5717703daafb0949a29dc3db04af8476fa2055efdaf3d8e70a270fe7f4183a9d889eecd525a26d278a51199fca6077f8772da4a37e1f7d4319930fc53e5e886e7610d80d89e47cbd0dd05b65b1ef218587bdf523745758a0d14fffe288fcbd78f0164f3363039df005e88837f9a57d94895ab3ffd1764f01e6c854b9c74eeaa8bbbf3da22818495ff3704d14a01438000000000000000040f46b0400000000825f5d958e49fbb1017bfe10b13c32543ac767039f3f8ca510cc9cbaa3278402f270e6241038f134799768b5f6e6f0a08fdaefe849fd824cd00376153b410d24ee3270f4cd2d314bd2d0fff13083ad9f43b1a079ff00d3a45cd077aad2754e4e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d8e41d98738b91b4f5bb90ddf411184a97ea213e45c812cfefa85009db273294d1908e2003e5f544271cfd96533a7270d3589b5a4e4b709d0eede8807e9057839feb2f3bb48d1f4389a1712a1298e06a7da0dbb397e9f0ebdacf81f9cd424e6e53f7c031e2665c6baef1135c163176d6faef60319991559107636c79b44500a03243a4bb7653ff3d3629535b877635468ae4b08b8723ff25981cbef2f6b5be94e020f4fd9f9d80f0ae5f6c0f407fe4cef3c4f1d6689a4725d3e4f0e093fede8dbea0a022c67adfb83c4b2e65f583caf5e16c2db2010a8c5fabbeb109261746819a9a580fb463e5da5a4b585ae1f422d287124e2d9221f63f9cadd57e3430a66a1de17020b556b2e8c2b852ce82df4c386333ea87b0f7f78cb0c1f639bc20dc98f3b52260304be23c902e7f2414403ef63c861b2da0d758c95591286ad34ca849164d87ab9020bcb3b5a22f5621abbcb63b5ebdfefd7d8c63ae8e62ae093f64516d0d7c2a843031d7061ecfd71fca1cf1da21bbdd0bb134c280436ef4cff173ef358c8c5a5445f02294cfda11e8c356eff0014fd23c183a47d372c7052216a942b5d471073b56fdcf57b971569fc33dfac1916f9c09181d5ca40b9266c2f60e5e1beaab8ecf66aa0cc84a4e6b09a1230b88ef4dd4b03d0afdb008ab0065dc32cdcb751f5d84781423799a307ad241526271d346e07ee0d910ca4cf1a7fb5cf1cdbb25d03f61ada4aff83ba99b9e95946635287bb7201c4ec84be5559abc2fd0520e4c2bc142a54423575e1c94ec91bd520bc149d65186ada22f634e6ee4a91b72b3286124caf35a5f9cfe88789139fd60de9eaaf9ce669954932bb317b23695ffabc18e0175487ad6d71a938a0c47d90f03dbcc0d2f066e403ecbc445b7f44f4935e00fb7bf994b127dd587a1c639fb51aafaa9a62a791cebf5a69653599711b1f370310978b20fbe1894df6b6ab8ff169f27111853e2bea8ef13dc3b47cd5a8cdd0e185541fb96c21f123bd4470062a5c26b3636577ea504b254fa581291732cf395c5694dc332fe72d40365892ce78fe818967a64317c616e5f2fd173f6b27a5497b1d71f1a2a09f917721e43e9b5c895ca2bb4fb92bdc0dce3efc19b44c1d630ee300d0af79aa0a6edece65e846ef7ec009a1ae4875cefb0dcd06a6c048ac5d4a7c62fb1148cb633975cc1653cdc81d93e995f2f2877164f225b785fcf877cffbc58fe2083bd4e3fbc3a780ac85f5cd6ea9c1ffe992f5a42cb179005fc7d1222eb138c07d3de49778984e91b4c3dbc5a080a781dadad800b93436aa6720f7d05cf51718aa1cf96ccc9ba0692d8e89ac9a716164e67063714a732dfba025dfe9ea622481e1658e6f7c306641ecba51b1029bf55b10775045db18bc65034faade97c0808d81b2335cf68c632cda040a48c808ab5a60080a35ca0c142c074bdcbb8ac3ca4eb00235bd0744ec4e2f91e4c7dfd01d58db57e93f7678942775a57e3aa460561b1bf7942eaf43244bfcfa5a437106d6090d1f74e1d75de6b1582a1840ce4d7b3d516f59955abde222240a428da22482e942ddf92675001ddb1a390c945aaebc696586434bc44235b1dcaee11249d787ccb72dc14b67f77ed6f749f5941e5f212b61e26a32773322d3b04316d35eae9ba3d95bbd42dc75b265ce37fd70e499f1f57c2e4ba427b3f8884639c80a3e2268ee8c6c2213c6217c64ba1796fb1045b3dcaa3a444ae5d87790d2591910f65f7e6c95587b8fae324865653a87a457a859a19a438fa5591e6ae7aca26c59e6ba589100cb551405757c473ae5647ac6a25f234fbaf6971cc898d2a6bd4ae73663448da26c41b32bddd7538caa7e12d564b71817422a38967c1a2ba3ebb29e871fc7b687109275d9397f4748957ebcdd3a5dc883b6ace482d403482fb6d208077e7de0d2d00e3f8bb5f6f7d3e436001f942024ac44f4ce7b6b836009875b31f21b4bd47b2b28a1b654c407db0283385682539b87c7932f6f145e4ef0d7d152de98de441ca14fc0d7cc92636081c63a71b61e7544d76b90d52e51ccb3d7fb334d02f9d86909b322ef702065251add916a71267eadd65a5727346702ab41824bc736e2325d6c27cb7bb69aba32bd1a47254cbd343d1c69b48c5c567c121435993976a95d944c81cb1a1bd22c924cb5122e7dfab70c1869c0ced57d0af003cce527da3165e1c760e242df10e2afebf738b473b04d65844b8c289dd0c7b15d55f4b35247fc7a6bb45c0e907156322b2a819fbdd1c9138dac55f7f7b9f4ce27b59ec9c31fc0cbe891aed10fb5be020000000000000000000000003de3f97ccef5232300b0def2c952c30c2bd907ec6a59fefd154a07eb43d400255aae5e249fa6a6a02d86cd4a0b93a33634c1f3c239bdf059130c0e7c2107b3548ca68d943499ac0ced0cabb7a9d6b82341e53958fc63e11153a54044ddefe81d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dc2f6cf0e012224ad7494fa53c0dac3e98cd755f558b1a9f55c27140ff0da73c1d3c80e226997b22d1610daa9b5208582fc29da335c777458c17148308a19829205791dd3c65e39bab3ebe161dd7bcbb9f88b825b3ce86fd62b6c42a50a995abf20728cc839bef8a85bcd5a3b2fbddc61c932a154926cb62133dd969d1e773ca02133bacc4a67dbcbe3a2ef2fc5a25b1b83466f1630150ebb19a2d09a5daa0c20c030deb141c2d0739fbdb6f7182a06387a9754becc5f7c106b37d48e4e8a89a42950a084632a8e1e69558af273d4933ebf0efe2c91aee5db9ea2b0e3ffd37ac5463b96e9b845f37950ba62572bdc49d5473bdc001a98941f9d0882dd3b3b0245935d703288ce28a13717b6026d5e1b341816950943ff1958350aec26b1745077422ab1f020077490e5e2f843994950de0b22f78c870e4e0b1697928ef231dc22b1212f6f80311771902ae0278b98654af2642023ae50d63dc3157e22aac53f74c6fa4366d62022c8b28ee36e118401d718c2ec68bbed90923a2b02deabfab8014b82b9022550a031e9851a5fc3e0bcd5c75731f9ac39d03b66ce68a49ca1a155ed67c58f3e828153f66098a022215c9ec5ae24d18e820bcd6393fe652692a3f59245ed9995b872156978ca2bebe1dd381d55b3b266e357c5721a91097f5db198179255c188e9177e78d2a1a25bbaf30f516ea78ca454db154e6489daed6452a724abfef7db36be025832aefcb69b28470272af65b94b44b9e04706d0aae797d96f78e7fc95fa67e79905ada1c48bb318a6ae79090b239b83a365d320a137a4a74bdd4e0bddb39e7ab74b96d4dc9b6d28b12bf0e9d96d36019905477d78049f9e6e6e3b7d3c896a20306cab6166e805b8b88e2b60c5b97db0243712934e7e4589dc149113b548f0099d536d8e842c46db96f257ad939140afadfd1546031d2b38830aa70e1d8ce76b85172b55a9dcb72aaf3438098bc417dcdd76903df5842079269e179aa3c4360d76990602b4a5533cdf8bcb8d01b625575e78f0d8253a9eedd8aefc9928f7ba488846572c8efc298605c60a97f316363371b28121271ef72782cfbeb35f54dd27da959d5b3e18fb90452846f83a4360e6a36cf6867be8f5c089e1eb2565e01523b6533d17a740ccdcee9c20368daef2909d9b184b101cd9a25c715da8d5605e5b074c4504ff17d97fea9940a2e41381609e717e182c4119752bcee716a77fb21def278ff0914c894e8100687f60458533f429572503462447aaf593a04f480f9d4b9d22a92d44143d20a3d5a353c0e30a92b4adb2c049083f4c8d982b19b289d5b6e6b562d95f44235e546ec4b2c9199570726e759c180d858c8a15387b00277543fe622a8be98305ed87675130d288cdcebb95cd8e3a97edc6a60cc0ac4dffd8f093e09bde3628d5b04db4be816ae91c7222331c3855c6d60d41099e30326b457e84bc6099dd173f43942864f33473f250e39f8b0d4aef80f19e805e2e4836cf4596a28bf9facaf822d33b1eb6fda7da2f86314ed1f1da84d37650fdd9a6f84bf837012823de7440ad03264af7c56860c2ecdfa3e07eada725cfc7ccffee44d9bd0764a3820811b03a5002e12d9360bc0482e929ebf16faad40f9cbb3e4790bfef24a8e6c7933ccd9b074e5f15256531a2dc4740da894f4f0fde5ba6e234da1ab3dd506cfbbf08bbd75cbf8cc7e628006b53562a373bb556b35d5b62009e5c01bbb8ceed56accd8fde2818f5f24fb36ef81a2bc8f5c81a610fa0db6415f31a6c920ef50ea4add8e574bc4807634cb0d20655a3f38949176396026183a06cbdcb30a89b0a5c983ec1c58b296d59b12d366be0667d993688064d915e9be875c19a6595d26367ae8806cd7fcb463e00941028ca5bb548e33d7aaea3bf75b770511bbddec3b2ae8050ff4035292d1e91fe078208da176ff50dfaaf442152a7408eae20df78bde4ebb0431dccccb4c691ca4bb4c24505d73ce485fef438bb3472ba2ced235ea4d16d4250328cd7e4c4a4d3105533cbf1b3962d0f3e89bb48d983bb19e1065ad50bdffac692d3b4f0fe89e5a62709fef2507cf19db5c9ec939bd0e690aab19cf4679d3b71e8290051b0da9402c344e5ceb3dcc9344b0bc4ff2e1736d7baa1de8de731f7bebd5ad9a04e2da13e457501dd43774094cefccdb395e2fb3df15e189ae3b8aba8122fb0a29b01c96a4e7b8277d22ce47a761a6c49ca92c8fcb6cd568dbb88066b7f7946bfa913ba97c248cb1161240f13b2f46f427cf628c7a1a0153d6824fe20e6e059212802bc4cea6734121e03a1d4824b85d00f07a9c226e2fb37bf1066ccbc2a6ea72424ea7b58156c7ea373e65c8049dd8aebea21a2312aba0633eb970d3ec85b13c7bd526ae134d14401c5afce6a52dab06d4fc9b1c8e692b65b11734b8c685590f91713d7205", "53", 3, 1653385265, 0, "d4d06189ba01731959fe3d138c7c413d2035ba831b7b4643066c10d38a42279c"], - ["030000807082c403037b57b295052b89835ca7998305c02360b2f422963d1b522845c175fa08cb86fc0000000004525352654cc1cce603ec8eaafb9aa979d8208f323b5eb9be29aa9d4cc63b03272b450cdca83f748803000000016af634d7e06273484690067012fd09351881565b0711bdc2dbb97f5e29c5ccbff7c16a3ddf0200000008ac51ac656a51655128a8376a01565e900300000000076551516a52ac652efd93c4000000000100000000000000002398ec0200000000f6562920ae95fc5adbd26301cba3cebff6227bf02627b366dac7e15cc92818f069790d78df7b658443b1afb0cb1378616bebb563bf77635d9be966228199ba0c9a213a8856cd80b9f2b1a048bdb724de20b88ae031c0f6f1bb2c4b59721252510000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044fdc54d150d5d9c4b878504ed4b37785eeca8129cc9b275dc9ca0ed94a6e2079c9743cae721c24648e75df2919955ca93caf80ab95fede47f711b6374a959503d57a1c55dd4b6ffaf3a8c756e4134fc9f124f37c7a49f5467ca643a2d9f28bea248f6ec1d7877c0c58b5606f7a0fc9ce2e8b846e4e2b8dffbaf080dbfc7e704021aae40be3fa30e9a0ecf3ea0b3e39fb64895755acf06fb20485759064be7f750021a2fa64cb24868ec253f1940e12d8c84cdb0c902303ca0e33d4ba110eedeff500a00b7a29d8689e7ff47eee7b8bc608ab49312928d8233f1042045fb58d91f085d6434849f9d3eacb3de29ae2c07d445938d5c895e98a25d1f8066cfa2516f9631020350f7702bd650009d15d4f4ce9af4ce16c713c1e7bfb3cb15a2e16a82ae06f40204bdc6092014ce0a1d21ac34bab0772c9f961078a877b22fef124598ae1e3f0803113a8751d30382712a25ba16c32950877f31805185aafd4b07ac37d9bda2a5ff032bb23f5fcbb5b6ef7ad707e1fa9554bac2435fa22fca782f5f07d6e09e560c90030640ca419cd5551841041dbd137c8346cca5fc9ff27f052cc52b0d9fd20758685966f73b5c8ef45129a71dede3de0fa5a12b16fcd2b5df37692660a31a8df50d277a7cdd349fbaecbe6dea8332566cdd9adc1ea098bcc57eac8efe8829697735f006fd7c2b1a9ffa04a55f3171660beab2220f4fa99bb4fadeccdf795d3eb03bc507f22544f69e0947cce62503f8f6fca6b472505b8c45fc2e57c0609b50cd38b676b27b8e3165a87a9cd7c1e90e7d6f28086db9535fb32bd246ca5d44b0115437a119ecc23190edcd99d94b84a9a162019068e81be71a0202db4b2df4d614d07dfdaccf0669b11c27374299be5fd221bd483ca572759fc54ea995e8bc0adf124b03a4b195cc8838c8242e5d7d5b8a408c272e59934e99e189684599ceb76f554b1d76dde9251e72685e6bea6c0762d56a084bbeb278363911f7d69781ed91c0e7b1282c1be5b15b536efd2f26d40e2412ca6c0be7718fdc9f7636240d00187914a10b95f3ebefb674d783b37d8c9b911a23317e1c54f27b335161f6845ec4c5105b3aa63829640696b687e4114989569f9f26004ac73a728c4d2d9e2386d9eb23298c357a090861255081185d0c62cc3f83fd11fcd83dce7067422d8af8fb4dd3c7df1fcb5ae3d3b25f607a2c4d43fde5278b5e00c4e6959ad6a1dbeb8647688a9225480517194d2b7ac13f9ebbbd45af7c0f50cde1e873150ead8d5e92c421c7b44aaa7769c7524291011597408d0158435cb618d822a9aa03c80c7e77b551de57f899e4b0aed1b2d29d7d7de8c6e5516378a911c0b589c6dfed18bfc42fc5438533bdff96e315c0e509655ea6783916fd63017db9f3a3bc3e379ec40ccd377e8972e0047f97279d296afedb8dbf211dfa848372f9daebdd2a810b5e61750896c62f56abc7c2d338936c818e32c9585b848e4c4d443edc7a50eefdf351280fed221134bc7300d6244c9fe7c5e482e7b8c50494792a1297a978465d0c5ca5b5248a26efd6460950b6d4d54e0e1d54a52cd3e7dfbba2ed951195238641ec38ff2eb74648c6c5859f6f65c9212ffe792f5e72fb41f4f9e69a47121702cd70dafc219015a24e268f0bc7f875e0da4d54dd2db6908c74672a45adcbe0f3dad3296ac05d92e4f409f962fe6518f5af5ceea5361fe89c9ee6339eecbb7979cde92bededdbbf007d916e7c3d3d8e1e0054bb98d97ab0ea67410e509ddbe4342fc47375f160dcb44bee1cd707ca0c4bc026b9f5406463732a41e074dd68f712e53571c4d30c8cd1f22e9780a316c15fdb75d865137e55e123afdccc36dd5a2ed4eea76a35bbe422b2de93d085d8faa19e87985f9fc16cbd05d72e0f8f549489334ffdfa9ecbd84d6fde69374851a583902604d7ecbb48336be3e20de2aabd5c93de3bf15654c18012b0b682c79e980799788fdebf586fe8366f3c7cbb3fe976569991c0666b0221e692caf377cf1fd975ed2ab2f33c5c1580352dd881de979c2527cfb12ec71460cce22109f850f23cf99a19f2c81e49eb559096cea20856fa3c361383d2926d425e82e1563a8513cdbe03407b02e76ec52e42ba531929e000d8794c405ed76c2cb8f101d69d84ac7fe619eeee4321eded840ef780c4398df0912bfd5d83e7204dd67461f73c44358639ed32babca5f3cfb7b60e7c10758e14f27a89e3324ff37fbd04dc95517b688e7818685808fff61d787f3c2f72fca60feba92de1cb5c0d36e0202171790e0ae6babdc6a112c7f770e273aad515474a638a2684206d90203da6471bff69dd30a11fbac48aa6d8bfa3bf62fd4f871c5532f3a464bc9ef161bee33ef0c0dc1e3d4762174df17f45a6233f26873e7b769fe48c8877b2ec6e26d200ed3b3bc7d2ac9aa1272ddda002", "636aac536500ac", 1, 1105018156, 0, "edf183602cc4ce4b1b66abecfad5704510549334474464d6f91471dbb1d9098a"], - ["2da9ce0b02708168005283914d3b898be92e3f6911ebd0a3e8f111979caa9ef4d5ecd9551501000000046300ac53996800993234235994b5965b75d7f65b92b955e3aa10bfe32e42d86e51e4ce0235a257b100000000096365ac6a52636552534e3383600163ca270400000000066300635165530000000003bdc39c01000000000000000000000000c28732861b37e0bd678d465331d3589a9566d7dec95ae70e3bec60d5cfaebe85aba2d03b4919e76e4c433de557d8c1a90f29f215a4bca8c55756096655e48a34bcc6c97a90dff1d1e960afc423fb40bc3e7b76029f744a9fe33449b98d6232d400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dbe51bf7cbb5463f8fe61b52911f26bf4903fb89ddc3089261eeba0ee10c80b4d69565698b01c2396246055d6cf8332ad70bf34a80b6f5d9e50e670abcdbb2e37bd85ddb2ff01374f150abf4b2bcfd3d28c5348f14fe1a22a8acecbc4f8ba74b3f3f26ebf6bbaf77ccb8cda3c58448734aea293d38c6fe05336f5e8a11fec904022a9bb4dcb4e529b12dd869aa0b6b1c417f2e940afbd94ce14a42118a81abb5cf032ed54b17b9ccc3592799b99e2b04924dee6992cd1015bc77849d9f5ecc43e4810b0733480b7ff6af8df47f431be84ac4bee232ea6749cb94614d0cdd923ccf30dad72998643d7304297ea18abbb2e45a29c037251755b642aa0544951d67d02dea02164114cdffd36ee905c7ca4f9edd4de7c528b172baec5ec508de7dd98f1b95070203d73451b9037773b5e1e7f3946156b32ed388f98e7d063c92209b5306460478031e7b00ea428ecc5b80d79401fa8ac4e85b83a2b45572faf0423e8abb680b6ce50324718a8734857388eebb91244254efd52106f5ab35423491e3a6dfbb78b7d5ee032c6120f0cc20838be9004e4ac94e65d42035973ebc3a5d0632d3c3515b4606e46d57e35375fb634c05fa93098f2b973eb1a47b6c797dc5f1e0f844ff0032e5ac7f7446735677a9af3f2fd0c97fc6d5f13ef0e93e33bef02b9efad393f86f88a4380d551dfd26f65dbcb0917db26729b7c52776aea669c6a723ec957615b675433a603aeddca282d8db310d15a1e87e51f68ddfa27e6f31e11382ab1c241144c6f9e6c38e5e90465ab6632404efc1fa30a26d609240ca9986831586fc2c14a2367b18e17d35ed046df2876f42c5b7a5516741cdd9f283f107c7a01eadb33f0a688965471029c25dbfe711753a081d9d75b47d8a185c263f696db1d0844019d9cef9d2efc1c765389996d196cd31870d87dbac81a5e6e1d7940b2ffeeb672969e171c2c745b1685a0fa326a90d1695a5d893a0b257fb6cbc80876abc418eae98690ed1ac1948fe74ffb27345fe1b965bf4f6621e700670f975579d2d7f1f282d4bacefa53d2790a899290d76bdc32b24e6572286d22c1836bd75f69dd2bd60e748d420ffa762a60fc0ee3f2fde9ba8ce14779bdea26eec25d1f4166c3d46c8549b40d112887bc84052acb0d4e520c930b304bdc68659d5d260ef845be1711ed5c34ad1586e04815e64efd2a06d0ee0f35be281df18c267106065b8734283ad4d5b35248b53a099c02f0b098a60c6835de8bbf7827979b726faa5e3ddb7d5b01c992167394e441184be98608112b6010802a57f89b1e31c576e5588737a26f0a6c21a245e1d3ba52f19c60f4902f8e79a62ac274aa97e4bd96372eb4c4058538cc50b7847135ce5fa2d5577bf61e72e479aef06d84c7af52b7293a45e8f2c99c151bb3eec5a738256fb359e22bc1dc234eb458f6b41f9587cedda210b8a78b772459b81bc2b0dfb3350862a20438032829d745131dc65aa9637c278afd8a742440d62cf04df854819262d66ebc4aa4d8a7fcde3dffd320e395a1a9017ce083a616146acede378bd6808570af09b6588e8a5ba0f1539291361a88f296ffba227bcd6209a3d6bbffb4729c51172f5c0f6289fa4f9b9c07419f22df4f69f3de7be9edfb4b06b1f3c2d1936bfcad8fc434f4e8a83d97b4f3f414e27dba7fd1eca3ecde31636c9676096cd335cae9132855275e5a92fed0412783bb72fc846c612d19244ebb574a62dfad6e0caf3f05ccde2c03f23142bd54c8d30554f711958efcf876a908ab1da4d577de66626417682778486e4543a5dfe17fd0994a5392fbf3c3826188d6b0fe065cdfae862f0375f84b85df20d25bffdaf26787d507136eb05204d36beda5f132d483d18b23d8a767daa9afc054a4720ce1ef3b8795aa4eae005bb8cd82e67409febc7474fff5bebdcb6b59caeb96eb7c47fd418e552d18a67566aed24c15275f6b6903e12d0b961605cdc8e79c8970ccf72afb6ab43bb0524fc8bfd792456f0e680583bee387532045d76cc6af16a3faa3bd4e0c3d16cddda4c28508f4f5a44c6ea874b4654adbc2a4e2ee47afa6fa5d5164645114f82c18714c933ceed2b75b132bcc5cfc1d270446e153c4e229217e7f8662896750e30e1e08059b30be2b31cffca3d50c8303b8ec36ab48a3b526fdabb965a1277305a19d34ff7339920b75365c5eb04ae3bb682dfcbc4201ce9c7d0a181efcdd2dd7b0dadc08584a2a930ef001f8d36ee5cd093423e7c028c9c86c80a22e0ff13f16314cdb013c4b5d547b63cb18046f5e214862523a51e000000000000000096b7cb0500000000ed5d696d990dae5f718b07c0c70539b796f72c18ca5089395aa284ed9e62c8454b8914f94f197924e609c99bc72fb10dbbfa866fda36abc6bbf1281165195ea7c13c2a15f94b473bfbffb6cd418d963096fe7956cbf54a1d7881e19fee5c9ce000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ec687f73d8ee2f3d2ee396ddf771032d384d3aa3b10efc08635a8b5ab63c2ea991a523f4e99f8ece6b26e9bba13032bb5a7fd9289a279adf9cc9cdd875515152d81c64ffaf8ad09b00c0175b424c349aa74377e538b711acd87b6931d31d48eb702c06c0b359b9389a437755d67fee579a7ea7b79db6e24e02a8dc5f3ad22f5f0222d12c337373dbb41ac3c2975b420ce58f618e05f264fa6bd60be38b4980683d0302ac362f50407e6f0331c577d985f913e1de523880758509b6258ebdc19433770a078c2ffc03cb9ce464b1605e4ab5390544ea6f57d453ebe265e21ee281ff9bba70cdd81a921ca6ef449c351982da151d9580c43a3f2358f42d316cefc0636ffe0315bdc225833b35480aabba2276741318bb1db320d047c27685f0675e3be76391032d7b47a7ebe30944284018ab384f3fbfa7104a1b1cc02a98a3ef3a9fa9faf2f70304cff46fb9debfc3e646d54bc52eb8dbcb1122544a10935007d55253edb39148020d4d121998eb434db1a3633367e3946c5a2a11c9862229c2b91abc8f76e2eb0c031b3fa194b6da15e4a8d6d22a03947c06c3ca81c8ea0b43b68010af5a110204198d445e7a57e50415b9e288759773eeb902687f1251d574a916625b1262106aaeded36e7c6d3961d9002e2a0455bf83eb00765cca7e535fae8cd01be5d3f54e52b3cd088fa24a26d5d85a88b39f0403b8eab5405d42ce11d0eef665e5e22e3bc32bf2757df73b797542fbb256d87c66787f752695fef15853646b6051097b6aa394017ec18bd7cce0984bd3b1b13ba255df28a182c45bd46b1c5161275261ac47eed3a36b903225c173d4d03d48852b24dee37b1deaf829af7fff5e51ccf8ace4b874b4f859f5e678d9836d1c34630d89d8a61c794b06575da9064e378b731ba5427fc6867ca3b0887e5a6d4fd80634bf0448c67fad7a7483e2fe2b745dab189e099e70a2d4ca16ab28f3690f844798d0f24bf681d15071e0b65e2dc49fc664af490e3d7e3913d9b99f0c9faeda21867a569eea659474198d161073863c8fd84280a8d4d678269921c4b9571dfffedacea3e08bff6bd1cfac99d4f338d815d6c9f2bf4ebe3305b61ba260b5ba22af0457486f56ca6a6d514caad29b17b25529b2b9633a2a4b8fb09d886ce63ec107e3077af2e5f740337d42d0807759b65ac533c68b155a65453a8188fb134311806e914a7192a310c381da9e9c76af0937b9c840a559600db1c4cae8f374def65a898fc3acfb16133e0c0d0d96b93b33c4c8891873f98788c323649a829fcc734a05cd567073ca8aa91ec0490c4ecde74aeac2424c7616a68f8ec2ac103964b3eb1ef29382bde80ee4f40544fae0a9cedcea7c28c652f27b6f2a75c04ed49384aa41cb1f2ca12f6aa873edfca4ce595ccb9deaeb51f3e9baa4c5e94ffc729b7d0e1d710a01d62f4dc47faf5f226168f75d432a28a10194ad3f2ef5f747c245e67dc0378e5f7bf0ab7447ca26d618889076dff647274e5f02490f3ee82786e42966c6c672f45b01c660c1a0ea299b24066654ffdef1d2213b45939427aa023a11842048c28ba054be3e0db048b26efd4fef2f1a7d1d33d24c6fb596dc639aa7712381024378d8441b1c930af2427a43f8bf8acd801082c3203c04b0b37d33f232ca3ff04b2241e1de525cddfc9d27c93c673fde5c0f2adf837c1ef4641b07a3029c135db736ac4a6301a1ff552f5da69b44072fd25b33d39380a0edc0a3edd792facaee3548c53a2c692c0450b91ca87c442fd252bce533510ed7f04c2d48ba4b951e258f1cc680f5dd17ed504e44e2adb6a9d7fae068ded399705a6b7061c69b0af04a7a765a577fe5c766ebf529dd2d7fc0db453f59de84aeb9229377a18e4bb8a7c67f357b88f3090fa532c245f027797e55a5a6c933d243e45f9c2ba47532b9aacd33aff8f061f15fb7d6402d30fa9b14aff905d1b2b41f0788a4cef37f3bea5c0bbd938459e0576edf4d8f04f81cc350854c684486a570b46cac188b9c9b38444417e7cae4e37e5cc07384ef195027045e7315b1dac813bbe197ebcdd3e85fd24726da6270fd6ce779f00835bfc46411aa81829102b823e2b643c8bd3845fddabdf605fb27bf7e654b3b38d291c9298fc5a466c0b58694097571b329e49f2c56ebb34f137e20b27074b46671a46d11e2af0c6f5b3cdb5ed585791bb5105f45e31a2eb42f42b0621a2dc5147532f5610f586fec7c74d576f1c1369eb4f703832ad40ad373790e41a667cba97776e6c1fec112c8a16c9fabde3c22b89a8b560ec9d78e3106e08602000000000000000000000000a5f780ab61ab7c33f49719dca8242839adf9f60b24481e88e24202eef5a9ee3bdee0400e0ecb39695c4d949abcf09619f86eed5cc9c5ade2f3c172756c4c00cee3924e7b01448bc7181bc676ac572633d18ac2ead33f9e6b8a67039fd0931d94000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d08351aa872bb3d304a45ceb282450643a4c9c5f83c51f555623b6ba9d5b2ea53786ce30f0a84b255b312c9fe37edfea1ba7cc8785a96ef9ead86da5ef2d3d5294366db0bb643cc5782d20e4d759ed1f5876a5b4b236545d411887eee0e494ca35fa81742edf4e517fca3a881f8a65d8aef5eb7320b0e0608259f65e22a57b6030be9287dbdf1218a1c3b30dbea4f522516585b2e28e90533b4b2bbe82813c2bf020ded87073df96956d9ab4b94fc80ba4c884a9e59e421b22a6667e186d4b7fcc60a02bc2291203a4600ac79b6ac994fe5c265385d94d66d21c4329289166e2b2fca07809d4412ec858196372112b51dbf29dcb5b5e38daa937053e355bed4d3bc9a021a10edef6c4b672d831fa62dd192c20b3e90cbb741a67630f8e121f0f9e05b230219abab071fc914c0d3aaf474173962bd3f81da26db38a787600d0894334b21f603218a7722ba90c1e0dfa85f1684a4ae121e1d74443928e330abc4ce73154dc58c02254f1a64cc75a055319687dd24aedbd15f539173930ffc6338f7418fe822a68d020cddb0d05224c51cc57fa7b84b0eef18cdbc4aa3034266fd74e4efb1d8c17d31a5f3da967d142f50b3681283b2d75a627c32111af75831f12b0a99b518c8982d7c399ade031cc0c60727fc6e64e3ff3bdc5840e7397826cb3b504b40c855e1af1e541fab1daa2eff961ffcee01fc294dee57aa42c0a3cc9d1cade7a00b08875d86f215d8483f9023d3c423ef449741feae2c54e30e4bbc669751ea0b0edad3cdec8a096daba038fbde3576bc3cc23dffaa562bfe9b6937ed84c88f86ac94261c671e41927e6e7d254e13af309fc189dada077d5a75c0b11cdc228ce2d1bb5fb7bc871f44aa1dd1e249355fbea90fcfcf1f6ece2ca9b04dbc7e68a8efaf75fb94d68c3d81a352f2b44fba648583489d21ace516c9c9fba89e47bbe26c7be5895620480f673e0568d52b3fffd09341c2690709a04009ec9283902a659e191fb022a7bfbe3b5104f06f5086c83f1da74d26030e54770d67e1a8b301e50c0a3aa7b60710f8afff0b9d5b0a1a672c43af2b1f484cbe30f3ff26eeb100b181fea89bd9f88c0cade805d646f880caad6a705195ec3d90d2c43dc63a40dd304fabc8f0dee5db3f5c8f1076cc67d9826123d6bd6deb8a918f45134dbbe88e1382897b9f3ef5f82ec95d94b9cb7b3d574161f736f05235286e6e52058727b3f5996abd351bf0acd3b99d8be587ba59202f2179b0386766a15450ef163327a69beaa2a156e460da4b89bf706d8b8fcfdbd85db804adcb3a991c47aa233c37f4d277d433fe8005720dceea2103df3e2dd9cfc2a8cc50b4f490ce5036e852357116e5459cd4dc0910e4aef63311817126896581e104d52476e8a68d79ddde84d5df392bdad50101b98d97b0ca3319ac89ba65a3565aff4476c869dbcdede212dd02b50bf5b241e366e12724fcbc8d461bdc4b01aaae54c2801c06c5bc913a6a407e4199b94fe00d5b1cfcb99524b620686a2d25cd9c932a6f7c37d4616da045627415ed8cbbd881f42b0809b011b37de94f3dec3686a1a81f4d5815731e369977a9738689ecf05431891f569bae5fd764f84eca7ac79dc98b417a81c8200e086ca4618affa7c8da7cd0e816e5c20e767305c517f1027055ea2cdfb866a25f522b4b8c066db6a4fc88e760dc52e2ef5ea26a4b90ab66e41884de1156a77e167d1ca21f62f1e410f3cd0510b95fd8fbecd62cf3c2a385f44be5871133e43d55464f03c09e1a96aa124dccdf9edc88ed93491943c1bed3aa70d23fbc4f9108cc01cc62270c0e2b67387e971f6049cb53c0caf41307beadd2eeba36920fca4c6b9f0812fab91481db8cc0c4e772449211c6e0569caa4862c15b8293a0cb14fe531f644fdb36f5d5cca9823bdca5a598f287e3303c9a42df29e823508f06e381865f8de98266ca7aaaf6b3a6344cf0011b28f610a70140329eb480138dff3d349baeab8a17724da46f2d70f9f99a2d6a592eeb312159c5c9fc5f6e1b3844ca2cbd05c5609dd3e461ada800b8a0e7af65a696e6c6fd1a8d07db2f371389fec6bb7444c4be250e99e81f08afc57bbd6fd2deeafdf5f3b87b90f10c74d238d00ed7b6ba1d86c8e0ec1670436ec9e26cc20c201efd128b1351d011c606212f3fdc428144b7963852c2a8e3483100a3c1970de57b2654c6347e7af37808aa66748e4c40c8119c4afbc61df48909144356bf3bf9669ddc37967f5f1e3bc443892cf6b565c01e09acf91c90fa8006a2e30decc57ef8aefa52be1bc29e8ba9fcac3d83af60993b9c04622e2d8ba8012db45f9eec7b5de59f9e43f5569dfcb8602680c57465de5eb9053edf183c16474c6db933a6918d4d6658a4266a27191a693972fdc3614f07b916f86fa20ea021d5650491b803235949b9c88628e0fc06", "", 0, -268106367, 1537743641, "bab22b58ac219700144c1f8d239d307643d2238cd3468c867d82d6dc79c244ce"], - ["2958065c0233a80259ec0e924dd622efe89312f35d8c9b050c1d77e1d21aa093ab16405ca50100000005656365ac5140ac2777228ca8f680f922ae4c4950b23fcdfe43f5e3d4ad7d9c094038fd785efe83fe4a03000000066a6363535251e9a8c654027bc205000000000001ac8718650400000000016a04c0666c030000000000000000e2f97404000000009d04ab430397301084481e67231a6261c9c1ded3e74d468bbdea34677ab06c6aa6860021d29dd462a90109c199b31579a96e8b0bce1ffce92a9ad1e531c2924f430884b3eaae758ea5adae60ed2b567cc80cd85d90a68a732983b1c54e0e251e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fbf0b8ff16da01e39d4127f77a8988b95b6e8d8fb4178ee5b2fbd8d742e7c3d878d95a9b64546627714c8fa7c4e274eb33d4261f17160a33f8a0fafbbc23231e8815ff2e4e4b8e440950dc7fd804c96fc5386e7b3c4681f679b06eb9ccbde3bced7221a45645a2457f47c4d8aff154148830ab21719c7a6332f3e43f3b674ba020e366d4c326ae0ca9568ad1cc48b6bbc859229822ed4c80184b66accfd9815230201da289a05a2b8b264559426e315b845477f63fae3e0c7b2641ac358d4fa58d80a045437c2b3f17224fc681d322b26f4f774ea7303d851872bc4f0964e07266b45f4ff82bfdd98abdb3d7061d8952bc36cedf803ceb018d1510a2dd0f7532ce195030a9308d57b26db9c6ac226d21a5aedb643c876a33082ab09aaa3bf71b88902750205824e6d4c9f43885a90fdc6e1594bd56dd8e6f089ec13a9cb988add851a5329030287f740b10d761400f2551a140c9400c47cc905741f19d5b95dfb3c0cfbf3f603260c7529120299e8be884c8f36a0957949026c526aa9e06b46f0a38e7721b8260207a1da3f35de3ae616960ade327830e8a50a7b569d1efb820d2970eda6fbc4940f4ff619ba324093f055d11fb30d4c57c68214985802a22e7fbaffd413caadc5255578e138ab7a54ac94f2782c383e12026ec4de7af6aae7cc72ff6ea0104a5db43b4e3e596a962ef4bfa3d33e49461bd116a8ea67dbc89049ab45bc878b553052a4bfa03ea9cb00a34f779d9e8c0d8ad28c9d432fba50a1b1b0185b1bc7276c03a03f01a6b1c1a5861a15228c2198e10abeb49e3875a0bc3cb87482b79459bea39322b402698d857570e33a184da8022ac894ccbf35e1daa28d6d9ec6b4a4b2df491175c4fbb331893e6fc6e470e3031cf9b027e389160fceace16faca5e4534e730e5543667083770ac658359a0e8a3a220a9cb60234e1d86ae2c6615c0e4b370f6c165b8944fd72cefc599e099ed47efaa99b7ab9d2dd898d5c9f146f1a930397b48b668e9734f7bf8c9bf6bcf5feaf3f136974419ff05542a69bacc529883a8ab41b692c753140d6d84b71d8f959f58f868511e4ab77de25f1a6bc3e0764b5c7809828546156190b90391393822185434c49d81baf629b8a9e5ede68234f085e45dc5d0497ad0a4887d382575d96ce802007fbc071d29027c80563a50e423d9fd91994ebd9c548280009d0d6078163a3ee8054bff2ce2e68421f362352be6e08c76e99acba1d5df1f8099cd8ba5fb9f84dfa4f95555eeedbadc94485f91fc96ce874a20a3cc7eac73b07a7876a4f40f3fc30ff092a7ba2ac27cee973862d787e9abe857d9025f9c1576dbe434726af88856d97e402b528e7ef697e9e657d93c7446ae011591942d479e4eb19e23c622b75381ca61674a77d9dcc18399f05e935f0d3b5b225d799effa4a6a337b79c4c2f604d8ccb30a73a531aa0deae1767f84686086c5209e1860fd1a17a600c92ec240bff4dcad7e0f1733d29d0db9e0f716ab353697d108c7ccc2b61e6fe48f336f5be14f6656e2da4cbff07ae1cc3ee369324e1ff5ad0c369d952469978103c4bb1f73cff44be1ff4e348705c710a368d3e3339c9522fb113288eeb9015a94afc2b6e1a9db9d264a196ad5b5ca463726e2a12822107f3f4047b7f2c4f0ed66116909ed2eef9253595f221b62209b70a7a7c3b2dc7d6ce7678682ce1feac20e2f5569a3f9349caca73b89bee8e593039f49aa69e141d2b799e70ed91d4a4e65db715cb1337e15e635416df3d43cb5569b80cff986a64163bd9470e9ac65d5c9ffdea4234c717b8edcc597606122e527070401bf559cb5460edfdbc30c680ab87131d57fe8992025fc5d09fdf0809898a1b9c626be391b17b62da6fc6f3732673dc69dd3e9733134e5fd46f6d6f472f2a47c15d7f56ae6a3d5a112cb85d36e9e1dcff3c1024e4a893d4a0be9bc0f0397f27ae4edc6546fa9142ee884fc4c37e52be58614b6e36f6387e8c9e939dc546331479391957634ff0bf94c48dd36d5b27730b33356093d751a2ea2ae1a410bf712ccb44e3af6318cdd1af692726a00f5b9cf011d183247d5f076787a3ce97dd73bb5f5a2eca62621f7bf3758c07a872cc28c60872c539eb7364a5859f32b18150a650fa879d4268a9105762e9143f559419bf507828b72cdf36907fa51c52de8eb718987c3a7c1614ac927c51a81eba86203277bc0599d5091725805b59bcf5c5316dbc0bc0980c5bc36ddf78cf3d3bbf4558846de7cace8c74987612eae3de3b2166418db504e690e3303ee3b93fbf9af6a0000000000000000c0ec890200000000ea6666bfb6bdcc18dd1c0b74955d8fe0997b47350592af27a008068555722f6c579d9482616ebc9790672081c571c59b89fb10c857f66f6f75fff4318a63a2ba33ece7f0ac43c6a9cb01a012b0cae4cf0ab7c64168cbf8d8b557a2948b79b580000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006018f83a5c3e232a0ebfade16214d7b99e28ef8b5c3dc6a1f38d283cd8fbed8dcbb972a65e3262eb9fa6728a71bef96503414b7b27b37acff4bab3e6d2940b6072f31c7df95d6606180e026852becf635b38e51e23c4acbb57d0c0262589dd1d71cc6d479601cb558fc82622595f589ceb3f118c827e7fb59de9fce14f71ae00022d64dfe61e8c2c7ffc66d3c027c9df45df931f3bfe3c269bb94199f6f0d89bc503291da14b23ae157e0dd86ee244d457d84926f7491a7e5d88a0fc649619f7cdb60a083a2f8409c6629ad17eabccda328f1df8e24026af23846e595c3247ae5cf6ae160f7afcddea4c6686ee7f4187813f91ffc1299310b29504885c6a6031e82d3d022793513cb1bc8f185bf184668e37b78a4e5baa5c2ed19bcfd6935ee1676c2e1b020b1259bbd81634b649b862d0f64f26c704b2b85195eec974b3caa37783ca255302091a3cc3a6910054f58f65c5c420268543605911fefa36b23bdc355102c7029f020bca6e44ee3665cdc2563815e6ce80c54c082d9887e7d3d976d11b439177d1a9021088075dac93d95edbef1d1f882ade4507b80c14c9a46b03024d27ac781a6988eb8272d6efe7f04085b0862ecd0483b015773955da75b1bd31e82972c8360d1073fd55c9bc89f4336f095ef804a423a222fc7f329accf9240923aabca3ff602d42f96836fef8d77ef9c824457e57ffbb371cb4a980a44d47932e298d9130efc48f48da4bd271b90b002491ce3b2cac0cb6940b077b3bf9e47b496fcb8a2a9938f2899fb46080a60ad71917ce26368059d204724c7f87a52c9237925849fad429bae9ce4934d7b7cfa16cceee4c86a9e04787be147c1100ce9c144a36d07f9777d1c4f5fd648e6baee2e0e15866664e45319cef790e5eb7706dd4f81c3c99376e8d54cc5a60f35ae2a14e92d79c35a95bb0bd0a7f63263c69fc094e3f2007b161a83cdc8992356eae9d9a335e8f3fce8164e790b7cdd6cace7cb35bb5013ef0754c81b8d74e61b09f37d8d6ac4597bd54e0ac26ad66f1d89464b2c25e09d8a97aff53fed5f5d4c239e661899fc046b9a8afee195ebad2867c0a2c55721a076855fd33bc7257496499a6dda40db2ae4abda1d4ec9f797c29ed4d5c9bd97de499caead76fd305ef3e4c9186eb0dc2f67a62f18f720558c457b8f7f2c4555042ab40f2d286afe986735d485205c5f72f08da6be1cb4abe14d32d9036ce007a4044200e5571afaa01459c4d14e9f90eb684099bb2ddd568ae858a11f34e281cc6ff5f24112d3761c38fe6c3d85651257daa2a71781da3615d569fb35e3ec95c7dd94f845667b423688479b9d892290f320e36d48b2105b6fc4c9cf6c605b2efda63b9912a12e9fb4451440679876643e0fc257bc61c8d7eccf372ee9c659e64f7b59bf75ae8fa25f9c0e0871596931c792a268fe437482c27a31415228295692d9e274101f307e2da5f725be3be423dfca291a30193f3d9f05343ce13595b2410c1f0f196ecc767fa2356fac48d3fe5ca7b6c26ae6ae49a54c21478a804f49c25e2f8641b8ca90ee9b2535e22b4a7c86a57e5c3aefd3668203245192bd6f458d2e5b62690999c86a67f4ea346e82c0bfe3bee87a79b77acbfff1ee2334d2ec1949b1c5f3d5dfdb536e92b7cd825c99e3949ebb9113642c9b45fed946639382df3afe4577214f97c2f11bfd1a79284d336e276a76058d34c00dc14e14ab2e255ce309d7cd3eb8cc886aa34069be95d3e6bdc695e21474ed2af25479a9f8e91d63bb9d9c6610121dd949c78de0fc08240ac8dfe0a673118bfd96744c8983fcc8ef19a0d965eb2b1e8e6030551dc22770df589c7a3b5cc832c4bcf2ab2013d9d058300999ec5d0c97984d3a328fec8c27976ae1dd37cba94842688498e6911b3b481fe868552d670f22ce1a01e86f75c03d463b46cc7c77288fe2f20d31e9eb58c89def829f272a095574c9fc7b5ebed1e8474917dca1e8bdb016fcdf10e803e18a0ac8887fe425a7606bba9ec35584e72d248db5c6c6df63821372bb266e9dd8fa383fcb237bd0f52fe46d471e0a73d6b094185ddf69d06e1fddfb745982bcef44964517ebd8b35c6cbd7dd50ab7fe7f5c145e77641af508151924fa8a011abe8f1962c3ef500a1d3674d099478399746dee22abf1633ed7043403a4baec67e29677588ae8bd6454eb347a0bf2259e2c63042f87ef9b41459712ee08e46505d9bd1fc1e9e474904aaec6659b85a5a9c3d50bb07ee9dae2de50337fea75f5664a4922914bebc8aeabd1a5c8dc5d536d93f02c42ae33c00000000000000005812770300000000865c6842b197b4ed4200223e3bb0a8117382944d42f6e13ce840345dc839fe4c3e75001d64afa9f519b11c8a628677c23145668cbda38bb1e2be02f5cd68a9617947b708889f4a851cc38f370a1bbbf3e29c056fdef467ed50d82f0081ea84b2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d045b23dd2e89fa54e8d819d79ccd1f705e11eea78ca09bf01f9970aafd3b24b131329082edf81731252bbf399b31dc21a85c15cd38634602a584d87e6130f6edafd06823784c57dc792f4a0a70f1160277c6ca8fdac9d91f962c55f30e5750f7ab8afeca4398d160b2b6289badedb47ade2b2cb7124f5a54886b608d5b7e340201f38752234aa9ebf960b60a74692f2f58a3be6a4befed8f6e6e3f20f22befe3032e92f6561724b601bd58ad3430040fa54bbfacc50e9598de2b3d30ffceaa414c0b06388c0a9946f2a1e2d1d6997b6d31be9a3569aa1bdce84d784c8bf38e46929c64f2875fd7456d83c4289fa3706dd1daa5fa99b67c3af9b3aa13c54ae28f03e50206ee42956959126c62b93225a59afd1bb9353f1ee26722a9e850f34712e04a290329e14e253c846779d8c1e2963f47f42ee489a733b232496462b04ec34c7c1d82020ea56bb467a3f7969427f13e87f6f24cd976194d7543c0bb9ee5b04cb232f5cc02102da0a92995543210ce0758258b235b45d1d60b1d17ed9a81560c0bb253acfc022088b28ce36c0e215245907e2fec63d014ac866c2a9f8eb0b7d6d948648bfbc1cb0eeb9536c933ff602add076ad0866360d4279f97b36c4a9d936fef1a01f4818e6cdca2889b2edc330f0d207fb6e784769ca2e8073c11cb5ea20b14e3816052214c793dbd07f49746866c6e256c159a09996b50e84e4567ebc012bb2069a037bfabceca5d4b3a21a8cc7a4b192cf32ed313ea78df155a5d167ee5adb4927da9383d2f1c07cad6c3131bd45fe4b05c4f2962ddf2b5895a01b2f0704a16d67a43a442d9f09f5ed007faf47f479b1cee465c3d587006f491e4293a1d4fc45bdae7f169063604c58ff0c609d26cc36a0ed9db2bd75ca31c948ac96abcc57c39243bcd6d281cada81add74f60be0d68082d7d08873d8f6b27f96ccb5a37bf225ffbe7bcd27ffcae9e658426c8a2e3e40adf0b687fdcc53eb588b6d0165d37333796fc9dd37c9fb98f18799d4f2becf75bf65d728d7ce37c1b9a8d036e3b9bb0e0bfad6cf7e7dfdd88aa9599656bb7626655803e055fe8bac4c8b14d3b755df3d8bb49d37736c906e085c59a2f0da63a48f62fc557b784f465c719d8c041c29528339cb442c5a1abc1c333b8b868b3abfd6b00b9299c98affd68097d12f085c9def44fe0a3ffa28caf42b92fcbf351c548fc572d76de35498603b9a33f0237c1eba4c96cf26ef8f7b6ad0bd7e6eff15e6d94eadc65a86785d5d6f3986f099b09c1deca2dddccc26cfc6b5aa953971b3bb5b4bb86380af706ce1ed599d947f59ea8377cb5906362cc9e426fb00592bb5405c71f3867e48ced3cb4eb04524b107554226a53f39c00263c8555fe164b51d2e0ff0c05c21e57d03c21ea8aeb1a2745b4335084f5af76b256d07f058d9fba3bfd37dbc6e6cf71340a4318592e00f257c6886fa906d25a3e7188346c2274aa6bb7abbaf6ce216943a8e5ec9ed7cc0f281079564e05c88c45bc130bdd9823809d92f5313b5c4e451c252f5c814ef0304305d92562308efd9cfad4f947a257ba6b187ac3113b7e7d76080bbe3b6e1eef04dbb1bd8b03ef4a8d3b3bd39f7b3804bd6638f890bfd15baa5f7f4a6657a2301a2a0860358fb2f149161adb31573f5cc5d0959bb054b696b0e35152716fe14ff2f16615b95afc1a6f1d2154bfd70e51e7cc6d86b29cc814510f9c773c5725389571f4aaf6c39964c98b51b1d041ebb51cded8e927f38e2d3fab21da131891a19c6aea3cb203cc74e81035bd162cc432fa1b88f711876466c2bb82bbd448bd0530b06729d009636e8f77bfb32bd702352f2c871971aa3ae89acd74e502fb2c3a2028fadb0b080068573eec2dac733581c68965221c7273a738aede130aa37811ba4f365d4cbc14436af60ee79cee23b3bd4570bad1951b612d3cfa8eaf84e46775b2651982d9de35890b836d6aa11c43570a4c75ef270afb51d7d42b98f0afe07eb2212fb6540718a8e3ac4822bf9cc2fb4899c3c7c0e03ed1eea0ef31f023961b87d43de532c220e376165d9645fbb8ee59dd9378e20192c33aa9f72ccf21c1eb0eb39cc78a007c0a53d801b0bfa0d43ad8aa77608d7ac15c5645a67f398da5945728bb247c6ba08cb8c344b818f5ade9025fa72b5a90eb78941d23d86da0df43e90bb4d88911d631599dc99ac4d4030b9e0ed32b32918717098d2444344f37cddd34be09d17cd37e75f70d8b79adf6961ee64651d8d6eb47039bebdd17cfa77987ba3ce57403508d1ee8cd884005767bfe63f05c90eb455a8707ce37cb2871b10a5894a50f5670211eece38c5193ef13f6b7328b0c65a6165f59edf9421d6434dda1d6064fb77b906bd36c3178f64a4c5032278785375752491dd7f61219a23a24ecb419ad7285f3899512a8e569593dcc616430c", "0063526a51", 0, -379953022, 0, "e418db516032739efce5c2bcaf1a55e3f0fce48aa53dc4fa5ee6353a1c6486f2"], - ["030000807082c403035c28a07014707b6712bda8f721a708c06e246b6584e20949d30457bf196de1ce000000000151ffffffff5d433e2b48df263d83ddac96a8976acfeb6ba8036993f12b46fb6dc48e5916730100000008510052526a51655121a09fbb91013101ac3d5cffb367815054a53c1ee9d2326f71ad9a3e50fbc9ba230c1d75020000000452ac0063ffffffff02f83a85050000000008635351656a5151652e00360300000000066a00636365630000000000000000020000000000000000f29b6001000000005dcb3e0324a72d82a7cb5975f2efd19d0b862c7ac247aa75e6bff348591f45734044efa25e55df947f2fe1e654012f48c433602db6b4847c2cac486746115e0bfa7ef9f81280f22525e68211395bb0da4a7d32f5c2cdb00c2746355158df21d8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f4d717f7058066759f27937dc454359563a068f6aa3fded4d96d98f1256a9c5853c36d525edf431229757486a8f10973abf49f09343a186faf50027960e03977f50de46802bc2ce7790bd5b701a758d4e34826f8dc7c8a112a0d8f2b2ff7b053ee44db92363dc95eaa55ea8703e16ce4d57b764451264f1368550f3b330945f0229f58e263188566b983e1b51843f168581aeca107e275066dbcc0549d1fcaa4f031add2319e055ccfb2837162e3480f5e19081c811d3faf7eb4869b247e936fed40b03b612ee36810362965f922c0493c896acba2736141be64afae0ec3f1f94b37d12e224bf5af00dafe177d12e0b9c2fd6e22427fd6dec0d6df30743d6599533a9021512b7720aa32e12d608ac5772dd1718e505e43755d039e0f8c5916fb37b077e030f46643689e00ef6c73c81d1ac437cb9fabab2e350caefa7f15064ebae102fce022974274a7961fc0f06d3990aa08d51fceaf031fb392bfb3e3c08945e868bf681021a2e698055c4660da30356851650487dbb843da55dd546d924ecffd79f79ad130203d10edd1aed6cfffe6926c11ada85f41deb8cf590dfda583b8a771cd6bd402d183ec1bdb7dd5bf1cbc8dd2f82149245af3b39c8914cf1d64c83cb4591cd803beb3dd58e0c1abd94d063556f89e4e92310fea1267a06a6a3444ce04c63c64cee62ad1b448359d408803384836c59db9cea53fe5274b1079b961eff71f96ded8336f6b22a55c3c13b0710fbbcfbaa2c2636339cd3a7f08f957f95d7b911fef0fdee9e7268a9431a154f7c0a0845f3f0cfa1e211aa17ee3530b5ad174bca7760b77322a53b1cdd1a98faa42c8205cd756d9666959a5f43101c74d8b673716bb3c79996f0fd90fc347466665abd7df0f94b0ed7236fd6352e7493588f6ecdb0f290817ae9df503198e832a3941c4eb9c19a87a297262af3895c2b346a0a2a86ef219fd71c263d18dfcc1de911e276ab86277b4480efb2432b1a9eb794297f461ee26a4308710f288691f8a102f114e78e4dbdc87ed2e0bd43b3f888926601c0018555e0c4bb6cce20bc627ff49126796dc2e1040555519bd4c840708a877e193410282b0bef3a49460cbaa4cb3b939e8ff76c08ebf538e0aff3c0cf1e84d17d2b1783c6b05a1a390334e3abbf54e2d4bac914a146b71e74870abbd0bec5ecf21cce057934bda27ca8914700b8a790b25871fb7d8d12c66cfa6f4d40149d0aaab8ab65ca7717ea8b7b1be889d9134cb773f393d084841947bb6cfe9b917297616f99f0b672acfd745fa49e59d6e2ecef587178c3962a0252ffbbc044483d87c27922ebe52b063a62149acf919509772b3c6a298ca3b5f426e9991830c929244474ceb5fa7d49ffeb277ec2fb07e81b0747a6e5ef27833fa75bb71488b6beb629066cb395e719e8089043f9bf3c36f6be9e896cee99c2cb17f639557c324e771118db9cd8705b372793d4269a71de258bd5297c8aab88ade56fcae97ef149241d42c838177cd653a149686cc6b367b0a3d854bce12cebf9f8acb2193a9efbfa5c8dd92ccc7b43aaacfafe9c9881e1b82f994c4d3c8a31f326f8774ad2cd3583d1021e61df3d4398c05893d40f15572504d88e7f480e82bff655f06bbf656f8df4f763fd65a65958964dd6b412b6444727d1a6d47e2f6be8af91350cd5767bd9c3152b9b213d4973641fa9b2c5bb6ef84ab0c071830812b59cdc9b4e34fcb5cc63d6f698935c1a968b2956824be6b31a27e2a29db1c213af47c2cef0a067ed73306973aa6dff39ea6bcbc5101abf9fa79b511a4916ede21904af60a09013acf8b26d799fa6158412204a991226929d6e48220d168efb352574f5e685c88c9dfe75521706e54e633b951eb2b6e59226501e5f579f46c0c45f3315d3515f79c2146710c2b88a7a1e97bce6dc7b5137ad8ba7d24c0b57ed06fedb5bd7c8658c2112283939b9ef6d0bbb3da20598befc3b58c284f043d0f52ab5f65e03d5d9742a18983c226af553eaee35adc2505cfe154f3cfe274f9bd43c683be1467813fdad0efdbc96f2b9bfec0acab1347a9c724fc84fab2343f3f2807f43d4990d5ea519571fe9af81696b2ac154f1b2cb77ddeb9a5cd098776fe7730a3f2599d3591a74b3bba3b44b279610722dc56e3b2bc3357bdd8db7575532829042de2584d11e038eb916c5c6549a2f49788dce95bbbab0a69d80e7d90be695c7067e0ce06984d630e0e8d5faf471bc01c991d63787866e17c85e1d7f2ad8757f168d7be700b50131498f0b55514a4bf4f08869bd3fbf878cdc953787526c898200000000000000000000000000d9c1f723a07d005d615facabe3ae96c3552efce8dd2f489845c4709b5706995e36c1451e6e2b058379e158dd407b44b98325b7ddfdc0b7b811baa2bf0ea946aaae5c78031acc18e081c5ad111f6c87f175cffbc5a16d9d7df9d438201cae830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000323f6a7b39bd07e30f2ec199e4d856bec91628c9da2f7a8931f32ce2dac57864da432b3b7bc3edf2af143c9e7dadd89ff186b1dac54d12597ceee3c5bdac73345e5de832b2357fa9cd78dca98af6f883f4157d9c18fc478d49f34b9d7a14a4cfc71cdf8ec9854a3c1c05b3e9cf61e6640ea57dca3a9dd4c89e7306f8f91240a30322c5e9959befbb885ab3a450ea414db05a1bb9789c2ff931d82e2a96a3958934031355a8f35448e3f9dc4c93074fd3ca365e934805b82c107fcaf156644a81d59b0b0363f009f196266a1312e0463738f4ca8c8a56debb0600f262fcaa4faa4307ffcdc9c60468042cc0059c234733136b2c8b0d072f251ac42e599c0f37b197f24d0318b5d2962badc31be50110179c0631b15db202a8dedf41800cf13c64bafcec5a030ac7cb11787bedf73334481a853bd06f723ee38a8ed7451261cdee6563a29157021748413eef647b64c6931c78b50d95b72a0901b9a3cc53665cdfff252db1334e03218a300757eb4b77b98e01c19db3def1b59f837485b89553989dd7faef85176f031abae1bc09ba450aebe5910fdfd4b4f48bd7df95806692c71dca3b6b2c053292f8bfc8fc19e806d750cad802a50688a6e1c212886e3f32a5b2ac8b744730a042636aba3ef6aac953ac00d23ea69ca2f4e9f323121e0425a1fdea009b6ad00efc2b5416c92afeeb6e5d49ecdf88fbe5cf8f119d8f157b3fa5785a527bf06d6cce0823875e0aac75906d96689cf78eee8e4ebe7228e24ee39b9e6dbb13975ed0f497d8b4287dbd48a593d17a49a9f694e02085875e186c0bce566916c45c233c82b3080a669b0f09ed48c0381d889a2f82dd4438b8903b9bb3e6792af52f513f6e8faf647c6d37a4aab5590d021603bee4628be7ba53a4681f4cc3668c62311430f822cc64141d1650445bd7f320ea27165da5bbf70747c0b0e29cf3016c3aee1c765ff4be251552c3ad556809bbb1ec471536cc0d9e6fe38c8c7e4b189b3fbf9da0f39bf8faa7eff8c05ee0d7722752fb6354def90cec1f6e94ebba84386b405e6243b7caca5fb4bf344fd85f8a477ee24909474c091ed54feffff4cf960ad4f0f72b3538861dcac356aa42b0d925201ea3b081e2912c8584ccb23f0d5f8d7a0a65067de22f23a822674684a718aef6b0da18ca4bf089c3827d946bba2b9ce1eee48a5c5f3d3f6777b1647f115fbca7a0d1c34e29f582679f67e448b823d7ed530d990ca85b9c6c0b9508f68ac173d127f70d7b3b9d9912827379c392651124984a3d67d7224236c39c5d9c2c25bd9d78961ab553f057205530373afef1f2ed77d55a6d302f5ddfbc6617e2d35b8cf036eb8f112c2280661fe143d7df183e2dfa607929fb2b16cb684a17cedeefeb4a1b81c7d6749d55fde6fabf37e5755e2af3d0dd5ddb27c3282886f5e9700ecc58f6b2fa91d66d44513f91f14ac83087307b546212a31edd81069d72d13cf1cf96adb14d76205d0eeef2332187c2adad1f7aebb58e624b2bc7c8ad402cc69164f0ce5acbd0a87021410d9a31fbe73c90251fd7550543c754e2b45cb4bb20f3bf3f2bb4bbabbcafffe873c9f26b8dcdfc6d9ae34ab2b87ef2543d4c765a24416c4e21ac80b69239f7d28127eac820ba35b6d80b2ffb4c61d3ee0c78ffeb371735bcc976032e8fd80ec41e9e41e84cc4645669fe7833a8eebe4d29f85774f979c94562e0eb3120a5292482f201c7dd35525c3641bff17d0f87f838ec00266a3a177838ffaa838e5b56a38b5873443f2b5e6bd09d8a8d4b56e7f56a61b7b16005f7127bb56b1a85e52e8f96f823dab28b0a60c24741022bd823b2b3f4b2e8326c11cc25b4f7a806d5be32f36bdc60a5b35dc2efb980c0e2af9e5e9634c97572b191e9e685f82c23bb648922e1c64b73e3a1b3b347f861faf952972d4e6a69fb6b753573af491add21e50b629b83d577e712c002230cd905cbdf21fbfe402126134a88f4f4a82264e14e3eb088c0c36cf6d513f78254fc8579dfd5ddf139b7a84d8d48a84aae36848d20a0752539b7cd61c93f70e071bba876bbbf2ffbb19a5c80680e484040fa0401b0a679eaf0b71df7c3f436c84892ac530a8c34cf8061bad4be9afb45c94b0f599b70b0dbf13ce5931bb233a17da31b962cb4577d45474eb64a6ca58e738627ca053f38f71fbf748fc4deeae2d21d31687c07f7adfb57463dee9308558088bbb7c7b1d9f5fb944e7b8fc739e43802c6053cefa2072175368eb63fdd7212552ca4c1377504bcee459123e5f9753fa0a3a65bed564a21085ba2b064f7a97eba35c88a70b13c0f3ccb82e63aad2ebe07bb4d62b43cc31d75bb30b585a2bcbb2ca2361a46a1f7ca68108717573444bd405ec314a8246f995434f6b8055f1fbaae1fd0662b66ec5b61fea7734c1b029a90ee112bb123a4cde1bd8ddfc413a802", "656a53", 0, -255701861, 0, "c8ec31ab4b3927345a9bcdf14d9153616dc052335c2535ee594b5cee24263208"], - ["030000807082c403028ffa3f926132b75606f19c88fbd39381efd709547f528182cbfb41a9ae3ca6cb0000000008acac5353006352513f6db7826a03e12b8a957ff70285dccd3d7ce18fa87cb75adc48678dbde8729efb22b5e8020000000651655253ac51ffffffff026653ed0200000000006155340300000000035152635878af7c40f45c0000", "52ac006a", 1, -2105110150, 0, "d64f4f8e16338ee8d37c02eae77f26e3c5a6d6cf2c2e272282bf1e54bd1cc65a"], - ["f20ead22043ae7d479c1c28fba38c6cb3af8298ef386f32a10949983f0a3cac9cde554dfcd0200000004655253512c537723bc98dcfafd8833aab10942551e724c2b1beb1fc7dee819b0b7804aa5bf8a274b00000000095100516a6a515365659b465731649dfaf64afcb3120ce6376f456b6ec8309611671bf3a979f0b3957999ae7228000000000853acac52ac6a6553ed07cbc83a09ca9cdc6fef5c9f749ab847c13f3a9d6bfbfd6ebbc744332b1cea3c98e0b00200000002ac6555b6cac803ee17c704000000000653ac52ac656a14eacb02000000000900ac52656552636a65011a520200000000076363525253ac630000000001cf0f1005000000000000000000000000fba03c6ef1b52d709174576fb2b6931a4ed4dcf36c5dfd1827290d640ab79c1d3f12948387f9492838c149a8e69bf4d125a82f02acab0c0fea24455ac2be0dfa540f93daeb9019bfef4c1480b706b24affbecacd3b4cc61fb0c5a81eb7e919a600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0f97dce65865c06cb214c5e8303b21a72759c049150f6744c03bf8aefea155ceb263f8256c7a3bc459cd2c6448ca5fd5ae1f6e4a0f6156fff6343490aec6d81984a3014c1967b6bf1bb1be6e3740a3e6cae0d3c7d62b5ba82a93d3cc83a8171793790d60753d1abab4e95f1fddaa07a0946f2101dbecbe1b9c18790af5ecd4e0300930674b567dc4a0419b78e4c3fb55bce5caed41886701d4827e60fcd546c450307961e37ca46517fea89e890518e10912bb5a434b715d0505ff83ec388947ad20a0908f0f93cf83e67fef283c8f78733633ba11805796c1e506e943fd13d5c2c23dde55850405a0b3b9fc463017c0c0f329a2df35ef9eac2b8cd8412cc720dd25402147906a08e1fe5480dcbc1427537e697d27a1246fa059cb3e58d75164eb19c5903068d48e336cb3e6fe62ca0f1545a48d14b592fa98512d98e28ab9261d46effbc030cfc6c0f33c83072b96037a705e60b784eb9c4031e3a70295b4221b74d38585f022a87f018d05a75b93d2589c918aded108d5821cfda60cbd6af3434d8208296910200815d0a3b8f5c92e05b3dedd8382d86a4cb69a82c809ce79f8b20d7eae47eb97174914d7eb1f76e9402eb6aae4a43956018ab1be2f955d9ea229d164845e271dbb3de2c5f83f26be3f6d34b2fb700a1d358eb1e265ad1c2432f4454c3840f3a496002599c57e6b642139f6bb01c665cd9e26563324be78a6628d25ecb453216aaa8d6ae48be06dad8ebc27838bed3372fdba8423ad955bd5bda2cfa4a2d9f191c1b136109bdfb53351df1aaf1dd955b8826fa6b59b46a90f70bead6696c634399d9c87cc49527a12a388cd29cb7c300dada6b8d18fc341aefc16a34d39d0d0a0ce4b41a526864ff0ec008c9d0c59c2b3316bf1b0c47c03fafe7697c38968847ae2eaebbe59879b9761bf95ce3590d7fe6b2d0c886b3a649a11f40790edead32585f59796ab78f0418a442bfb813794ad560311d2b479c02923c27df89340782f06212993091732433352829122da517e1350a98a2a5bc6fdc87798b0a89ca6ecf62c3d3feb335fc5ce3559a70b6ab7544e70f184748a5cb6015501ba9070f4fb20f28190db9fc922c87d9b0ea3c142cf11abc07f5e05cfbec2a5e107e8f8ff0ba6c845bac2c318bf20459bc2bce33dd5b00a653d1c72548351af4251c51685787e54330d04015659a5046eef4e8abf02b4b9ac375994669c1e312275c13731b3e2241474fc3b47fdc90f5167a3075e9fbf06d934c3163bd97706a1616c37567a20523d3715ab7a718ba7c5216cee4826ec9f40ee05d0856810c1cd4d6f1aeb729705ebf98a32d02ef3d6eb0c9ff1176ee09d49a2e0212e05a0a74809951406488e290fe8c005ad101d998b1b0ccfd3155dd82180ceaa8e0dd14643e728c5620f24a81ce335c14103eb52a384e56477694d82d65e677cdf55e3e7e0ca1a5d9cfcb03c53465ec99f2a9c93063f08f0ab4561106e1af848074a7f8666a834afd98ad2a2b04184e468750c82a0f4a0df8ee2f14b27dfa89bfaadfef3fa9ee73c042311ade1da0bc33893cc9defe6c417b7b73b35adf391f02cd3505a62ec1849a228649d336b5634466f95c5391651a8d30ad2f253ba703943ea464fbdd0c6daca7769ff8c8cdd753551e78bd84658a1d475b552a18eb574ad2c74534c848ff71444ce434e947d120c5aa8e47c3acccf75d616f455743b140d2bf9d38dc9bb3fd207f2a3d711ad46555df5fab8cd478d7b8d3b8fa9a8e14ff9aed5bfcc76c58f069aede6d993319659dca67b6ce8e8503c42f038fe82f6171496d76d4f3ad104500ba656fe9001846344d77fa52b60ae53e335825a1cc7e41aec8fb25d027d7a950343b316a95bfa134a91da2f9873b8cd2c5e9b65d83ebeb8ee9969bfd93870d36cd2d4800150628ad93268e8c19ab94f213bb4b756ea35392bb5923176d9406c69ab34502df8d4ccdd492fc7921b1fd88b1db870f3b0492b723212e1f2b2ba7f99122c0e4120c8c0ce5a1c70db1018558624c2b19464186139b9984852b5e4dc9eca917c2f6413cfe31fc64c37cb7cb3517ae7dd91553ae8f111d53f444ef4a4f36c0bfe288cbaa12b2db5ccbbe2b4c46a3feb0c13d9f6ec1b8e0ced64e951ce5a74ba1de30892fa1a7d5017c7348b226b5c7461ad15e078f4d85b16d6fa02138d09afe239dd5f7c1f1cf121c900b6d9ea164a6617f83ac4962fb79f16665823577af8fe1ecd1aab99849fb50d4af5aded6f394b4c427681bf314263f09ff086b2fb21c43565fc92c01100797ad977c3aa667cd9d16457347ee237c5879798fe9b215bfdc2d76f952440ee9a2d9f624060b94156f141c8dd77361ad9b953d5f212fe62205626b73fb1aed43a42646ceec5946e21ca743ff26159bf70b16ef6b3cfa5f12bf159434e084df5b971b24eb846904", "536a", 0, 1073323069, 1537743641, "f23c907b85d46c8d3f24c8b81bd4b49c7c7a9a46fd68bccd08c7a8ef0f8904b6"], - ["030000807082c40303508231c03f152aac399321304f0d7e643586888f9e91e7edb217eb00e54439d00100000002516affffffff9243975b0feeca704d959e9bd82ee474785ad8cc657daed3120e082b390e9806030000000152ffffffff47817e3b2fac97863291bbb6625e2545a32ccf62de40294a874d2b7d976f6b780200000003536500d215ee900412aacb0500000000056a5263656377e96a0100000000016ad277f1040000000000c2802305000000000451630051000000000000000000", "00", 0, -79267209, 1537743641, "bcf39b337eed8ad0dc6c8d999f9a1b4ada9bc681b5eef9e807e6b143c2da9b7b"], - ["030000807082c4030169342984a4bc7ae1fc331b19287f87b752c28c7b1975100e51a53291acffe394030000000765ac6353ac6351ffffffff028295300100000000025100801db20000000000080052525165636363edb9ef25fc55ebb002d430d001000000000000000000000000b530b06718ed028a34412884d9306f04f7be4dc117fc2256e98d4077bad71185546208448bc30c55a1330f10cb9deafd7a09665702fbf340b4a587d66dbe443dbb8999eaffdd9f936bfb8c9ea91dea046fbc29065fbd1c25d055dddafd28ef6a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f188c64463f5331dc8c6de1249b2414c4f334e53d1a4cf107e644ce1eaf57d6910613db6266863d5963ce1b228e168271512811c9bf90e865252ceadff06af5eab8878084a1fd445d4a60ae4053ebed71d2aff8eccb4fc521eb00344839c5ab8d0fc06a62d8cf0195bafb9bd03e2ef4c56d76df72831e445fc76208f54725fdd02108a52f7cdcedc996c071cb74aa0fd9c01e4341e3f847ce4afdfd766ebb8a6eb020035e52aa347ca37cbce2f6eb9238cd8b626c8dc6373c654c7c7b72ccf98b9470b014e9330505f9adca3f08e59fed053469362a7cd04975dafce466acdc34aadc0baead4e8a9c1b1c682b9348ef4c1467e8aa1f6e49b37503e3375cdf1011925ce0213d262c06806aa629753d8787de3373c223a317ad62eecef463f436468d4a7e402210fad7d43730feadadcc83af8a67e9856101e4461c47ea662877b13f1f4179f031601c37347dacae5715995670fe3fccaf709ece766ad8237135690b9cbf96f29022a71da30709d91bedda193a37fbcbe331b62e57c0c36fe5a32ec6966458cc0f2030b916e1010c0638d464816cf5ccf31f92bf2b3d87965d7f2ca95e8d001f04893353580a2a692a9d65c3af138ace3fc85ca1107d24e1ebef63ba9e872ca21feb4a0683358b36972b7dc13b1c9555b2dbf8425116bfe0a9118e704d44e03c3e2e5eb420ee132e3de4a38e03a048239737e269e916108e8f37d209f5079d6888a6270917864a9f1858d5c69c42bdb1ddc9a3ff0e0b64d482f5898674dfb2ed1e7bcf40234e34f485a50fd420d51059ded3487537b7bab843300692ebd061409afa115c7728d5aa520363b77ac5ff7939fb4e55c3f8d7b396dcaac8da6e19d6d8d1089aa319287b3bc0ae1b092d99029b0ada8b36605bd975bde4d4741938f3a2d2ab97c13325b5e6327593006e34d99c0d5a1cf58721572ad075818d3590279b458fa7484352b1b50d5c18505c47465ec99077d5ef3935333600a57f424c356642c0be2a8d74fc2e825725c9e10d613ba958e47f63551c9b9c29439a75641c27d8b6c4ab73c76afcfcf7524c7528ac4f0b057b3a1c94712262242c4bc7d7b1d0bf6d121892d59be4d680afc577dcf544f8fcb09ce5fe55e851fb13899d16f3cec0c58976b4c4960c3063898056c67f9ec58e5a106b64d9727192ad676a877fb4028259e6821c2feed2c9d0ee4f02f2e30dd8b7d1d73e05c9e4f6541cdfa2e848e2cf91ef79b67b636d353c29f161340dc4a960ed205d89cf28c0a70b908caec564bf5ef16642b3702548820afbf01ba4d631129d441894d7712832e52f28db8ee6b2def09605e7750a7d8f8c5910492bcfc8367238b6f40cde264121028f90bcf2956b388f9893d8834250e3e48c476e606883383fa83c0c502df159f1fea53aef30fd229957517de1852a7216871673d032c88eb4a596c7f8fbc3e29c9d1cbff9ce28133b481082d375976a78c590d7a57154f4d6b292336c4c5f58a3698618afd673abc41faec6fd785e302edc9287b8b8ac9d10e97df35f90a89c3eea2d28bb8f4f6684249143c3058a5a2d669f3fd29fe01a0bffa5cfbd62786266b35fa6f0c5095bd3b043ad0c45a0fb2994445dbfc86e996c6a0328ad966e93a36cbf0bd35b37e919e805e9421ba100c24bc58ce10ff2347f0060bcb1d654a342a412889a4a626c58a7bd8bbd3f69edc087600d368bf05c264f608318e0ad168146172b8eb41ff0079e763761aa3e0ef83ac5874d611285e9eaa558ec16fb4afe08a96e2e15be204ca65273f2000602c85b03d389368de002c8e1d59d9e48be44c87a1477a5379e45b87b543c44108db797283551eb3dda4a5485f88361a13c62f3e6b1ded5e78705d4e9e2751a7abfb142ba71a2c481df71560aa022726ea1c3f87fb23c7ab5ca1949c861c79f155ec00042213f04c1e0182e98f3a0361d7296abf28cbcd273272d6de1222dfa35113b9a5752e5738aa0d59ca1e90320d78afee5b64b4abba5c240a73207da022e0c08e9a753d101a8e70fdfcc74b5009b4543f34f17f5134f6277e1e873fd4413341162b633b07250c0834339b7faf085b4057214cea8f3ec1056e3f100ae023bc7ce33829d04970568a324d9f8ea9ae3b47c662a0a793ea1f59a7f7f1843ddf45d65bda5638f09467723b9094e759b28b8334fa1ee54ab948b1c27c327133c55dfb8358bd0e5df97bee1c2eee6525483847e81cc97b561bb0c9d7fe60a596f66e9ac4189c5e698082421b631605dfe7cc1b711992a2b08ae6302c13475470a1ef9fc835b46515e2156ba09602000000000000000000000000217f683f2aed72509acebeca736a566248bbbdbaf6b073c9e7163347bceb911c607d2011b207eb077c73f40fd62c9fb5a227050a5e156c17f597d536fa2fa259b7c8b1ff314a09626d3d3de6a2c224077eb8b7496fb23a3a35169eaae1fd93e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081b99d58424a03eea59f802ea4426f380f01af99806c24df0024450b326069707aedf6e8921c3048761efca90309260a5d89fa69d7e2dcc252be6e6dfd883a0e42d5a2a3c61aa8abe7c0ce11d5d28a1642287232133a9ebf784f19c6298b11cac8c513e7ecc29542747b89b8adbe51f99188408375ea61eec51ceaeea0e147f202076e759ac83f4db3c7459f69a242b5e9e7ef1d2b181a3aa6edafb209d659d4900206d260d2a75ae57ab0c67c0fef9b28ff45fde35330e9dc1e82e1743f9acf1bfe0a06e9909f91eda7f21070d0709f4791c751713b61c59f692a8a3d62489f9581c080e00e62a64547291d516d9ac2891e415f6b3739637c3e1b4aebe074e5482d78020985d9be05a807fea1618b1efbf6b00a10ffa12666e5c27f5045c94e6ed402aa020bfaa5f3424c1cdfd897e6631a3c8e1cb965791490223f7a45bcb84550af309c030f73fa30b1b20f85edb2cd809148273b2fd38c9ca38856e93c46d95bcd06406103157427b658fed999b57fea09279a40e6cb6a0661ca9c477217543ca08a4c1912022127f1274480c9cc3f3f48e3b7bd16cad13ab4605416c116e1862252e6af0838310d65e70ce27e492ec3ac5ca210ea51cf2af4c366a17b172ac07fdafd9f019bbf4093d8e0b787f6509039ed0fbb421bed81daa766f8d9b2bc785263c6f97bb9f38d31ed2464c388e2d5ef96ff52287362634724996ae243b9a7ccdb1f86cc7308b583c641eb66231bd357cc2c309b2f83ebbd824f52ffce0b3ecc33dda7e06ee55938247268b61f19113e2f6c67f1265886e68d347b2861531018366d0bc6d8e157f5bfd1524f300303a2744f84b577ca95580363f93f3876696b6f115ced21f3fb5686572921a6606072d0f85f8feeaf323232e0808bace60d10ad07ba0a0a1d190efce3984018992fd8d278e8f33df867e1a8640e1f0dba5f84b4af650aafd1f439bb49be0759af02a92302ba9557caa44c02bdceeaba542639d2523b03b39e361143b6dc7d616b8e1cfc3a19e1ec323047048dac9fc4a9491d78c893940ff7d8cc440ac1328389dfeb16532ce302a6f5e1340f0bd457015a6080005d8db718fcef8b5e8570dc9c22e6d542a1127abb9de5f38fa82de36f0aad82956cb5d0f4e68620cc2aba1546ca011287504b9002f3aaa8b8bf932f41d9a49bc98864ba711566e88c430c6965820b4b899af1d2e215398f01a8ac1c11efdaa803565b612635db3672f54126135b381155e8617827f60c83eb6531e64a2bf289f2b4b87007c372e31286171e5a8059cbbf623a4dec11fb56a465bf73aac45914883f974de694a98f89fbeef371a0eb61bf3a3b669088b8b098b1507d94e6f2b5042a1112bd5f6c71788d5e15f37eff7bb8c9fc17a3be0ae7c08bd52ba49e06d5500d7eb5174392f92d97803594895b8d3e963e4ec05d090a47d3a06027dea955a02ae96cca188d452e72c61b4af8729b5937f9f04643178939c5e28700d0e3ddac5d8dcf24225e316c3e8a3e2c192e9b60a753e8b190a4af0fff20b7eed948ffde178e9d8baf894c0dcda01749bd54e745e1ccea7c7aeb355a0e6208ec94a8fe2acbd3313e5799abcc97638558e6aa6c6c391d904db9f70afe3c811badc9483665b5c333d217688dbff65033817d1686d5a34bdbf8d5670a9f54ba55654c9447e27469c34cfbfc1d4764f59db968bacc9a7e44ddd6099ccaf829a554dc128e37544f6f9057bbed80abbed7cfcf855e16b1a3fc8f85ddf536dccd739e2fffa52bc4c21e9433867263e61b9a64c3593d53199e2544b53e8e82aa78e0bc5432236bd53f5189b9ce3cd8995050da13f38a242503fbac2e285e8cdaefe63c8ba76d7c5a421b13071e0e1cb392ddb8f97dd022522e4af23d2a8e849b04af6f663e5996f25469e65ec312739482075e380f8c8ace8b4bac5535c4ee253599664e275939f5c2b7c22b2ee6f756d3710406de92579d09f7fdfd9b2cf6355af41884c698d1da9dd9c63e9e7f8222944b3a86a5f5343599ce5ab486c03cb5217d070e08e4697c96c3b76b295b679723983e48092b22e191a98327332033be762ebe626f2c5eba10a0b4d445ec8ecbf47d0d84aa20fbfe1d27f1e6fe9591c2565d4a5026c4ccf1b10332e50e7e96e2313ecbd5d75a27c6b382ee4efa6b2de272c1649313fa027464c7d44b1cfee066beabd552b996f275d0c7d93a5df8ed379f030b8748b9a9602b7d0ffe32170dfe98d54b344ec739d89524fed414a2619d54711c1bc60314ebcd07f4ca77343b49d93bbf355eb9f5c4e7a449cae414ebb622e5c090d46da7eb2e1f284c3c0962567c379bf55542c8304d35978bfc89379411c0f57e96952077924184b8f67719c9fb2d370c357f42fb956d9bd3597d1a685f3c81e6b03653a3e2ce44e924f493d2ee14566c24f69da0cbe0c05404", "63635252ac516aac", 0, -1222217186, 1537743641, "c669489ef6e53a59eda6cf15aec4384683832b73fa71c312c6fcb08160044954"], - ["bab7c83904d8f31fd6ac6fa9e8707f4e9c8d5c591143bd33af568464fb9ebe41d20b334dc2020000000152fffffffff958f810714e334a1672ecf8af93a56f173f865a6163f1f7c7622974ca4730250200000004ac526a63558efc24a4bc985ebf1d2d4e4ce4fd92aafab276de62a65171572da20a27e182bad5e00702000000007545bc0676926c6135d9b36f5e7a6879709163cc30ea782063f483e9a3fbc9f866062c05000000000453ac5351ffffffff0263e1260300000000096a6aac63636a65ac631bb8880500000000000000000000", "63", 3, 1468050038, 1537743641, "5ab3f8b05e8b633560a902b8c983880e72bd1ac5e6e52431681c6777890f99a0"], - ["030000807082c40304f8de25198e9ec44c664709490ba957f956d9804e19ddb7b5486d72fce2bb1be30300000002ac6a6da36f2a94f2cc08a1f72e82269fb8e9f326fffd5d1037eefed26526a1b3f9ba1751f67201000000015164ce4495babb8d1c86849cfb2200dcdde3871e5dbc56f0daf3abb55dce5aa45e096d36920000000003530065ffffffff70e2fcaefe94fd10409b23dfef2049b03c556e9546ad1ad9b99fe2e11a578c6e020000000453ac6a51ffffffff03cb9be6000000000006635265516553badb4b01000000000563ac636a0035c86e000000000007ac6a52006a005154be080bbe93801a01e3b35c0400000000000000000000000040acb41b41130c55f7bb46d830df914ba410fac4162d944f968f761f9d65cde3a43fcddb8a165914da4adba77591a84d87aaa23a3bcd67fb5d96aff35b4ad690590d135e0a974a22a89d112effd3cfa658dcff162b31c23da0064a22d9fb528400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e95d18baf3d9124b67c92fa67809d76ab60909d3401c1f97cb0915cba7e9bdb70a267331e1b3afe50f6dcdb27a3305615e0c4ed28caa4afffa37a33700b818bed5d88a8d93845418a53ba40c7b1aacf58b57bad9d7d96fc3e1d412c593b87a19baecbbe833bdb2584122a3a53963a5b73a30a54e60f8be72631dc3a730f8af830223aa96e56063360d6f1ae6a197375299ac02e90388572be1acb34a9b138d987f032dae7a0a4d39dffd9a482385b499b79ec70bdaf3645bdb95ecd427cc888cd6150a01df189cb80501d9845d9ddbd950053765c3dd77f0a78b0ff31e1ef73c241e5db347d63a36b89ddc35e4e878aa87897316db6c6f5be50b2a7552072cecef339e02054c22a04f69cb5b226546e7c5a8df007af30b2cbfdf6339e06392f1d2602c320226cacc0bec4f6d44a1f0a76841c13c9bbe0dab21917e09c17969b36e367c6e7c0307893e58f3e287b9bc6181c88e43be694c7513c74ee948bcdc8a1c9f67017b3c032614f675fc7769bf1850b5aed8dca2c5adcefeea5babb758449b5dde7b68537a020665fe8b34e325dd047a1d45733ae1d46bbbae64140f4c8a52b93f369807e8d20710b15b9a6d8458aaa32fc8e51eeb4f394634d4ae9b751d78464a0d08a81e7d69735cefccc5fd05a3b2c09e927d042126c6f84ee03e3dd1636e95dac248923f1333b61e00220ccd22379981faa550fdd701e357f29a085c41f94a3932d3e2fb88b255c15399b94a2ae1d82072a3750d3d45a4e52e19aacf651e287c597e6cbc165969102e876a59708f3edd694b829a0b802140dadb809566caef324ffbec4385d6a97ab106bc93d87c12185a8be499756fbfe6d6b823c7658e0be4a2efd153db837a16a4b638bf5f8ea62d5da89d0d9881f3a625a5001b7d0371047339abddf9b05d9eca87ae8bc4395a4f7e208920dc9cb3b11dc96ed4906b7c96769ea218fd19bf06be36166d3c442fdfeaabbcde02110107e8908f690299e64b8430b65b920f083cbe71a2c1fcdc2bd7f43aad21cef244b3b6a8406f9a5cffc210a28ec14e67cd781f3071089558433acb3b3ccfa75440abb1e45cf6ff62a51437feaf6153aecd76488bab8b1ff2ff5129b68faf962fcb1e27466507f0c9c28dacc75e70ae1a3b4079e71e6094a38ebd60bd78e373d71667c99306a8502bb1862cb09a2a197cbd50ec230e2e4d88081e39a15a454a64a65ca1aeacb3d0dd0c51e36f575e9863d837413e0094498f4f00c927003182fef5d11d4c73b42970a4a189f3887cbbb87ad5b5a85921a308ce1b67fb69ba2d2395326a49e21aefb77fbc189a9e50bf207032d22c7cf940cd9c88b4f299f5cbe7cd5396ddb82fbee44125ab5023be6efe255914148375066d184eabfa6a9a4e3ac0642272eb407ba97e94bc8f43ffa2f96df1ac53433585cd1e58933743672cf6d5d8749b88bbda59dabc8e363339753543cf2d9e2cb47473dde45d14f998910fdcf8e5ee1b95258fe074bf6d778bc6589faf77188eb6590f024ba17c2bfe37279545c8bfea1d66275da2b8d5091b744359b1f5ea49007d520d51a06e00ba5b8bf4de38e5da53027503a03930b3df3dcceb4eddea0f63a4951a7d453e958c44aaf931d76bc49408536854dcce1d3e73b7d19305dbae35ab560f97e7034f6433d7fbc6e28baa401eab03de0009063f238f84493682abc1f72b0337d106e5016fa0b681305c68d54e5703acc48ed8874af09ba3d0db5ffc206d89b7481d2ccef206212d311bdee884e4af57f62d524f1da10577ab9e8ce49eae80398bbacbb35b4fbcc7b985f20e1b5a6a52687ecd562acd687c631a94995ebefc32d76632bd8b54183ceda517e60588ac4659436212901daebdc83b2486476dc872f7a5e25506dfb188a775ad9121973ba237277d7288df5a59e323dd2b900878e286af25d646db6d657ba82c5fcd46f76a88f8f7e4bbe183bc7fc31504e4f1bb555ebdc38b294dc6e5341de04f441b775b787b266f179a61d44179467a45b339520bc504b0dae93210cf9018d864b77aecd14ae06b7ec29648ddc055c55fd10bdf3b24ea57e93e3b54a4c074733c41ee127f7105f00fc25bc651a34bc5e50dd33b423f98657f3764affe89148d8641c42c00aa77e2085c7b9a1a5e8659e47e92162ffb2190d20e270d174d6e5c43c1720558e98ccc0315949ae586a7ba9afad27ea57a223e2645d60a7e7e4355d21653d450f6afdfe32bc7908cad792f72bccb7a9b678f9a046c40d7f5e00a7b784c6fb916f2824a4092575a878558c025f8125df940334802767f7eb895e85e5b61c37addb60316fbd4b5ebcc1ec6e6374624321ba7b085c8b712d0ab4ff86a6c413218b2645fafea6cbaf8639c62e79fa92e450f8afb93fc1b1d3e2ddcd9a6cb18429328ffdd2ea77ad086e769768b4dff0c230a9a581f1d03", "5300ac536365ac51ac", 0, -44332183, 0, "a6512dd1702f4fd2003e1d0e01a298db44bfe8f7c4c9d89511485333c784c50d"], - ["4c09590102d20aa87db148b9a0215588e0530cd1d349ee127355bfdf86e8894050561600400200000004656a6aacffffffff2f70d75ca6f618c4c81e7325adc2e8bc9a4463529ba4f76dfee8484c661601c0020000000451ac5263ffffffff03a13cbe04000000000765005353536365a4c6a500000000000365526a1faa9d04000000000100b3768cf302c447be0200000000000000000000000099aaa6721b532be626d43e1a7942fa575982545b04d40389f5308f8819000c0ba0200c5b1fb490472e37f85136156c3fe9dba60f01faf9d260ec9133e87bc7f1de17acf304d0aa0c4eefc44f8b00697eca6b745f27206fab2c3efc443738ef6100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d8cbb1f6800c918e1eb4f9ccffb4592b2a50b30e67f77bd3ca6b8ab2c82259dfbc30b73c2d96707a5690fa7b25595121af830d04e1009b90ccced3987877aeb7e2c103a499a01fe163af2fe6e082f84f906fb462d60a756cc065835933276bca10f9547d7d131bb2f9288254cd3772fd0aee5c24276a096acce6e1de0964ea7c031e9c54a01eeb74cafc58cedf370ff273cc4565516b9d6daa57c77064bd6895100322c1d69462b7f4b0ea8536aba6c6ebefd809e4445a84f18448c781a09af46ced0b0016178701e119cd5bf3c07e68566fa9aec43395a9ff0e3a5641a97411825e7e72c0643d144880b49317f0cad0f380d7c9a3175a8ef4945d31bb508ca4e8051d0324908728075079c03539ac057a2fc1b3c9ff2f33137a4723d61804b6f820bf01022d37a73df1201894e787c3a151de790fb099b8737b38793169efe10684123d97030bed7d3f2dff393a24e2884069a9ac03dec92bb2ff3eeb2038c97d4c2bea7e81022014757979ab27b8377859c1f555507d7f0dab8b2554e35c770fe5abf2b279100202fe95c2c5a527a9f0bebf005f230d4dbcdd7d567b669637d6b96c06d45c97a6b6dc9e9fc88620bbe22b3233bcb5ee5d89eb7403d95bbb9657150bca171b84da67075f4840c747e2ecba45436978306829609b9de72d0760e623f264bb74cf987fe8f440f8e3ffe76a25f6437f119a8dafa4df2561fa8a4b1ead0a95285c8735e29b826710cdb531d19c7935d5f9709e6909a488debc88328e1c20be4503b3c4d7a1d463c9349c8815ad0f517c45277284404d664b0d77c96f47c2341cc525408cc89286b1fe8c67e4e10f43bcb02c540d41cfc8bc9207735857ca2d6b2d2deecf5d95acbd02a19e6d13f355b67b7d2742894158dd18cbe073a9f9e82adabd5ca6804bd8abe4cf6b1bce8f5fc9a8a545b0e0786c69ba707e52feb6f8dbebf823bb98ef84312229cedaaf40fcbdb344902a05a6a60189b9225c043edfdd8b5f970b423afce85c1c729008f8fb2c27ed8326e2944491959146bfd20a6511f94b8592da0da89343e4627f580062a3d9f367bdf99bcdadec935d25b457801d44945eaeff9e9ebf976d5ff90487397401e9c57807b650d1045831597235911c1c53456c3a746ab8499ce9a2a5cd6a1ae487c351889c1521b5cd57114212316d387be1ebebd4e99679ec84cac0c8a83bdb09a1257d95f70cfac2ea4000091805c6507fb95e134de9404aca5d385836116194c8b3c2b86898744fc357dc123bd0c9da56a55eec0b65bdf2a13c8bcca4c8f9b99aca4ffac2056060f29c8db4da650347df0dca5a6f6e3ff4b19dd991a4c8bf50c4b3067ed885387fef115e57da298e6609953941c3ef81750470b19914781db337c2f221d64f9f0e24d1be4acfd2dff8c9b7121f6e081363f2ffa7eb11d306a7ba835c8f810aa62848190f5148d56bb8e45fa63185b3eee54757b4e1357ded478c441f4dac375706fe7d8cfcdb49adc56843ce4c396497d2cd650dcc6647390a37355774b77b82832e588e885900b867ac65bf61a0cd8757376dd6470c64661bd0edf54cd28e5dcb7a467a40696e1d5c39031b805ebea6e92af08123dece9ea6049deae69cbabc4e9ef629df76262b919e38a52d97c15f1dba54c4c2bc91f1e86caba4be2c38dd2e5308f2ffd8f5415c0c5ba9c2bbefd471f3c847f4f93e6f258feaee136d03d07d284be402e03b57867d64edbf996733e2f76b479c48bf1e8ac4dfe151333e0736ad36fd327ab897355986b6f748e4366f39a5baf62b75f8ba16ea5c791e9d4603841cb3d3fa2356c06a440f346ef19a63e949859b09ab7c89d1c7d10da9b377d2690feb114b16920a2cab9e34f29d8cd3b1310990e384642ba87e10369ec62465edd8751e49d328df5728362dceab997b84b084e08e4f44f40c6ec63a7707348ed5b57c38427a76bd73c9a2be2667f98af1892418c0557946a71195ace77117dfe6a8406599b7b7abbb96ed638f81f739aac44b2c8e7735b73d1ed77f1dc6a14184edbf79b0e9e9e23e9593c2d669fcad27c41b178be1c65ad01b29f8db9ab8552568bf754cd6f5fd8cb6417b1910bd8a26ac91bbe42c0158e8a9f4e9461441d2e72892050176bd2e812bee370b916cbf168a7786fb991fce8f6cecc00d305ba8c31a96d158f849d79121c1c736a442d6ab5e3bd7e4307a2f16e8b0dd161466c1112cd586a6cffda3cc596cb23c5316a7f50fd313b88bce56ff2ac7ccc3d143fb4f9080eaeaa567629c52996e2a7663e66e25f8c88edce181352f0e00000000000000006434340200000000e8043b522b2f2ee136560f377f925710484f05acdc2ce32f704d2e7150199d51ba6064f522ccfd4375ebbe621f6ad96d39490c158ca38738a84165d576d16d697d7cc7d2d1287ec73d55b9f8b4b541fffd0f27af4e41c3aa8ec2282e6a78ccf900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000abef9a9234d54a7f5e7dbf80e3d594ea9fd78e10560bd852a33ef483bbcc21e18b6e149ec1b2c2d14aad2fef8d430e11fed23a5e07c9f3c51484e4caf65e7084b277e2792a8a316382092997bfacb384754481e31f294f5f1181d1303e94f6aae845cf7d230e1c78d75504813ba6b7c2c5f941688035f74749bc2527a7b1b7fd0204a88c8a94b6ddf65d7a064a6003b565995780b13146ea408bfc59bd08108b7a03030fb012a1740450587d4e63915d5a9c742159208e0c478dd01bc87948b3a7cf0a0550b9ff5fef50fea0e2c4f8258cd351d4060350b54ea2d7ece32230561be7e57acf878bca8910505c3cf300409300079b790ec04412da7890ecca25c31028c0032af3509bab77db245ae6bd1a1817f4528932d67a4900d2dc6aea4c2cbfd7f87402304d695e1f6ff520f9f6e720a71d34ae3272de898ed1533e4d68b690ba5c80b602061b7c720d9fc0825ea9fab3be2530e6e317a343419f68e0354b36a4abcba4320226f2a867edc87e33e7788f7a2a684fe4374d20a985a970ca614453111d65f32a0224294bd85029a5329505672e3cc3f197905d261b613065da1335101dfabf6b11e753c52eb410a3a27929b1bb2f2091e37f8833340f2e169bf016fe9c34a812a1342486ec4ec9d2f1e2d2006e9775dce3870e44fe2f4af2a7bbd3c3a851394ee15f9c31c1234b3f65143e9917c187f9740768f8004786cf74122e02410ddec278f0d65df4d578395d368ef431800cfccfecf6e58fde1894e052c2509ed6cd2e9ebf1b688e87a8c8942a6e3c0d45a4b6f3fe5cadaa1d189dd9116b4aa640152061693d0ab9b4e9bb586aa473545a9bd61d15a10b0a872e774cea38c287f973249354e19b0b744cdcebb0bfb523ae7144a13c4a976554bf81de732a0d0e025a73ce75672193ac3330314e51ab48e66f144b3f990b9919915331291526a486c88f45491081f2263c87a21aadcb9dcf8e5e310ac5121f78931ce8d347577ca515d3a5e2a8bb011b76afd400b95dc7cd2ce5e9a973672fedbfc509e8550d4bbc1d03d4b1d5c0d547c01bd9592c19fe97c12253fdd26f4436111e4f72cc2d7abd6a2d30f9409d9181ce3885d89889002439f8d99c9c58ee02169a8aac0eadacf50fb1b531013751ffbf0464b819048bc517cc0a2d2ebdc35f76b4192484164113b7a4edec2bc39872b022bbee71b6f3871411e292cde1f2a2b14abf79db5b4df45cc7f0c9298b75fb3534b5d006bfe0d64913a7c23fb282899baa158fac5cf7ea6141018921bf7f10901aabc52832f481d2aaf2f230bbab65b463c9ee13c5ac997cd4599ad16a332f72f2b7c03090a181249faf4296c02df5c7880d5ca5d5970fb60937bcde4aa3477118dad7c63997a8ae8c7a57e7ce72c925520140ae32b85b50c7d11ea74538cdbc7f132470573802d10bddba000228e6a1486d33c03c0a451bb5350bb27f82a8e384a29ef5201a4b06122f345413194af6b2dfde968d4d1396495395c429680c4e6118dde29dae8642dd3ac1b8cac59f99c959d0989b09c56d4c0f1a404175bed9261e492f2e2f06e377a86a38288f4d6d35153b6d2cd719b996368d2fee51ceb42209f0ca2f1c02a5e7ddd3e08496e3bc0003fa5dc8719d588862f59629befe13c16f13d7c8240a76116cfffc8f8a411f6a246dfe70c2171f98f95762221a742eded79cbfe22e4a38365cf4ae222efcade719de4e30a19744f352b433e53325c3714c5c1bf91f216d5d2e69321a10f054130bed1131bdf21e2aa602f4ec37b25f80ed653119f789b8698490d6fc3c75aba6b6f18303be12612ad4b85bb13a4b048caaebc6af7669b5c2f3c790696d4040297a93e881eea3a01f81f9154530da05ddc72d0fc3303fa40fe7d870774fd3a02c3d29f1aaafa9a0e5cc463f8949aea9a381b86b051efa5a714ae8694de15e42e741fedab863c0023772bc4f7248396f97ad5732a699998416f30a79ead8f6d712c8aee8d271bc34f94eba0035fa87ffaa42745a13747500b1fb4011fe2eff8cf3fed853bd1122675bfab6c7cbabca0c671a03de12d228254d3bf5d57373b6a9e70053fea44c0701aabf91f4cea73713eb9df7832dcaf30b88feb2a47711534d20432d7a8ba18c9674795b7303a45903aa7c667ee619d1328cd5f9f2c00ade26304c63d31e0bb69d672eee3a7a90e234625e7ee886ab15e98c38a68abbf9125c30965eaf56f0e9c386e9d5439e3a99b59d4e5ae00451591ced69dcaf0c6cdb8fff20a2f8111740024ed1dc550cb7d466f828bc76e011b1ac63eed6d5e44c07a69c8cff46f79d6540232ed7119ef298ddc11d6a359c1b9d33fd40724e1c2a13b8be99523a0fcb033807258bf9b36fc11a887d9e9a68289e7150f081caa5147519218ea026700210876f06f2687749f4aa0a08a29589d676306f66b209", "6a52526a00", 0, -1065760457, 0, "5a26b9b5ab0c0c33baf62819fe63edb7be9a8e4af47b76ace853694631382c02"], - ["227ea20b025e1f8ba772e6a01808a3b923c85dbc44c5be0594f0732b9dee0bafcdf6efab4d0200000008535263516500525130ad7e9d2109da55452131eeb701008245271635b4f0cb96a914170f30253c6c9bb0b4040200000004ac6a536affffffff040a5b95020000000004ac65005213952e0000000000001503470000000000076552525253516a647389010000000009ac63006aac536353630000000001bc538204000000000000000000000000b7bcf58144bf18e8fcd1a92855205974d4c7c581b0e0be3c6211fa5206914d5221d295abb840a7b0c5765c671bc79523bd9f1bc2e3235b93142e70be17787d1531b74869a75e587e4d9a116956bc2e4b7baca665b9aed73d3baca4885889493800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ec0041179231bca4f78b1d4d86a8973e9e4121a4adfed744ea42d1457ed881a09a012ce2d2628b95945c356c3e1410872c8cf41a940e57c3d3d26155ffd9aca92c71979267159cf7c173d78d231cf7b4ba50f202624ee2c1498f06f5358b2ccd73644d011375763dabf23cff92450f82b287fe8024d4acde83a504c09d4586eb03189fcceb76dd6f2b4abf94ac2c32a8004b0f72d32625a836b8ed7611c9f74c6f02228fd00cd1c58f9a9075ad2d2f72cea5b87564dcb2a06f36f985c0eb18aac2930a071d4aa9d2136c2ca73216a90541e7d871c231c87166a816506adcc11b7c0786370dd4cb4286a02263d974e796d25e8227bf15d15a96f898acd8154648601147031df6fb17796a573e4a05474d5ee94f2d7c2e52cdbcb9487a39925c8a1b3d80ff0212fb4a3dd913e41efd2110588f0ce6791e4852231668235c977578202cc21cf70319ef3c9c4b802ea02e65f8815f11766527d43836babbf492a74168ac42c0b4b3021724f0158e1267f7cf71b367183f377dad0976a20b46b5e9659fd9200cd316ac0328ac70543ecd51b16821b5bf859fe4091689235ecf25576fb22ae85c550971fa3b0b761f30820b7e38f02afafb6028a2aabb70d7bafae2eae6c0a3b7b83832565a5a8e5a7d949dc566180157bba4a9be0c95bf368f89705e87b33a41a6f20be7208caf642ec50a832abc7ccbcfa270f0285e4cf5d43a9bf3bc02d1973e07b08e7f6690a2902507ee85e641b4a30e6993635ce93f46289c7a2cb8a9cb10fadc5a317735967a402b401d0c936a2ba8cab8addd94a93948e25ff2c4b23244a2035192a7e8bde28a32a62fe6daec8e9afdbb237f07d365e55c23e1d1162e66436fd08d6fd6fdd8099f994904bc4764ce6e8a44c51de74beaa5e0e9afad2b8e786db447959c0cffe89a047f38681eb71cca908b010af327b58b3596d15d5917f26a95da8794dd7e154475b955c414e4a164c6779796cff9daf0208aaec6ba481a39434da54d304775f06e58e0fcb84b32f7e65fe85d606d3e9e2cf75eabc006911c23b333017afe39fade17525fea77ad37a03590c582c082ea5aecd8befda3c9f02504d031525669bc82c9bc46cf1f389d4ae26d16f8d84b0079a96d6b75e40751682f10bd9af1b32e334cf9d06141d7bd6cdbc1ec940700d8726a19ab08db06690816c8c288d686ca2a53404d5989879e23ffd187ab0fdf8911751b501b4403c51f6068bde63c663ddb25af31f20ce0aca3f3732236e67178e539f94b776f01595019eadd8ceb5cec89a66262c59b8676277cb4dd4296220cdba44484b1627b84fb5146de2e9cd35d8b021dcc4741e1101ad591573d63acb9526a8d68e7ec4a41b47c5063666ee6dae0fb5cc64f2d36ecbaba010f5fb0872d9292d146e2af317f69beb0193ef5495a081890ef350190c5d3b108843fda035491f84ad88094520fc4afce18245fc0a5ad5cb443e9f3155702c4c0e18fda3ad84f88294016e41a6488ce47676fb69f2ddd28f63b308815e482f3d5070365441f33982a15942f9f843055dcc4695ff01fd742046c2803f15aae56a53e698501e6ee4a461618ead5b4f4f70b0c29fa5f3c749dc976a6f540aa68c7ec43f7144b20a0c83138eed5ddba8b6a1831294ef9bbc60121e8c1b13d78cc1e9d813b0d774c7d86cf2fb8d149784f9e92d0554423542c27326ce00721be8646cc6aa5e3b91785113d4fed2c3a1857b7b37457b121e28fec62c62456a16abf0d694a5c1b982ad84977c0c3d12ac4412f4a133a77fb6a44302a140b328b41197daa4d5f5ef06bd7eb84cc4f41593f29b4996905f87236fb5061332f2768e8f7d7fbed4214f07b8d74912b06d57b37835d5b8dd5044722e11fb9c62ed719a957be154417b0124c32be77d372a5d2d3209c43bf018f498cd435be387f55a4aba64aa8e0601948ab3b847969d3309de8c65ac11236de94bf5cdbf9d534c73006475e96c70e34de8466613b23e5e13a6ee9ab784035a14c6593bee2a9437a9fb7b21c42bc93e33e7342d17ed85aafc9b16781ee941871f5f3e99e6cad37860082f3d541386281d313647e7bf0fc2cd7d9465eb401cdff355bc07c49db08bae3ecfc5755f0c8723ee002841c2f65498ff1642a4389b5986a6e2d047da85a1063dddf286c3873cffc6a2eb017889f61ef8f9d69ef75f169d99ca22d0a339de64c6c6ed4af8987630eecd62a3ab6b35be56e6b6bdc7b12df9ddeda2c161c4e61159de13a0d1f2354deb011df4d368739fc8afa2e3f4be66ea63f33ecda1c8e051ffe0670cc8ad8fccc3881a73ec03cc7c9ecb3cf62b429faf1db05d47d337b9de629d217aa7579f158cdc55f0ec2d0fa6f512adfbbf8df48ea282c55fef83166456b3192269a11e8c3e0572625318e642923b6dad9a00789348ff4e2eac1ed2bbd985d150f", "51006aac005152", 1, -548961653, 0, "ec1dde2b2f537c1815d7b26f9118670b6e6740a8fcfd11ace3f5b890ff5e194a"], - ["030000807082c40303c09f5efcd9cf103c2412ba59b785abb7cf338ddd7af6105d78da39857a4da73301000000036a5165ffffffff38b005cb8bee8db0d2cb5e10ceb508898ce4dc5c92d6a7a782f53ec2d4462feb000000000365525139755e2ae3000909f2676a3ef1fa2f60f8b79a1e2f96b1770b0ba634e84b4e470f4fa6fa0100000003006a65ffffffff03b6c2c102000000000152e1b1b0000000000000daf77c04000000000200ace37f02f600000000030000000000000000602470000000000015094f7cd14821ccee757a30eafbf566f440b6e8479468a813de853906757b1ed0eabfe9c4b6664c801e1cdbd7b47e68db579e6fd23a9defcd8874f34939279f6074af3ed1a7839f210b9a89e86d1885bfe8eb05a58ce1e4220f92ec6643e5d5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a302ba5ebf647d8514a7e5f6ba1bf55428a27a002e8d3ba2929fed7ac3a79d3f39ea69e2ad9514483bc9635189dcb1688e951641e0111b0a21403ae535d6470a4a746ab0bcad831614bf7d1984f89c94a7819d4490401bdaf04cd86d422a3aa02a2aa050010f36ccca4e7cf007f0c2d2a4939cba5d5b71ea1197277ce42768e022ea6b43ed8608b8ae18d185931ea11b96553d8cab09ce2fa46777c671402b7a30226544b84498e0d2d536f9c3708471b46f3082805b03b6b156de155234277bfe20a053b7d61e22932f60cef861723da81bf6d4b83bd0da5fdc34c02257ec75bab047aacc3e2891c77edbe5577eabbfc919fb9ccd34ebdcace2de170d5eb0d7d3f7402002064b20c2bd57de3838ac3d8797cd15d49c6172faf4b025ef0f105c6864f08020d7dfd174a0bee5432512dac8690952364a21877a3e31e68100912b7df9a3083032574fc6553ceaa686d4e3efc3fec068a1d428da492d1075270786091a5f1e165021a7c1457e9acc35258baca08a7cf64f92af26b23e07f07dc89120227fee82bff03016be83431a4f0897e84f7f7b0efbccf2060948701b104c375781318a3f2ce4ef75f971ace78ea291bd897a895a8399d9e9c9fe1f14f3216ff96e73468645928f3fb5252898944cfdb911e8ee4673a094d3744353ac706ce5e55bd8b29a0a41a0669c0517c9f5b3fa124d4fdf4c94f445f9514e79d43d7a62a63874c731743e518367a2ec2f0d5ee292709c9bdff519dbe413b4b5c0ccb8bd455893778ec32225b36980a18790403ec8d616ddafcd7d002e97b576e54dfce68ec3aa9e68c83a9cbae78a5b0d2f9bb8ff893e001ff92b55227c58e1bacf1e48dd8d909abdf139b11fed65b661c9507d7a7982751da72fd49a626661da487260ea7f305895150526e7442ae80ec067a666a6302b287e1d6c5b60786ca28a4f72e2dd6b4d3d48d82365742c5944f96bc4aeda5ade00f141737ad4fb51597328a0af5373541956d5448c1c367b562f96a64b2e1c9a7f26018b3c9a15305dae204a0e5bf233f9852ce8a4f5ee8fdfbddb778b77101fa8b0c98d4c7df90a015907f397f230e022d6da9276250c380bcb1efd52e52a20b4e460addb377790df81f229f03c97d0b207534b05a2bf78a135cf38b8ba13edd3aa4d6249a7a91c5fb7ee51a8c0a47470c9be14538ab6f2adfab2fe87cee9d215714a60a19c95411e0c3538009b41fa87d958c9f30c4ed7b10adc40675bde5193a20708355fa6ac7433ef0ac1fa955668770cedd79afc520c0b6128da737c9b3406aa2efde3ddc39f822b5eb59c50005be5a6da96b0d60c4bc6391e3aaa7af025ea6eabfdd0ecf6572a23657927bd23562825166a8b6388aa6735c8d386e87fcbc127df74ef763aeab403d9531eaf78390bf0e9b23a3c632e690dd47c9aa7bfeb41aca9def12e18c7521d8fb286eda3f5809b7e7c12a45dcf52f8387f3f7d9a45f743d1c4e7907e25ef4c0877af054283b40160d0b47756f193094e77a0651c648707fc551aecad61f8b840f1dd500cf411c000ff4e834b3e2cc78c88cf2606cac55781b75cbdf374d8fa4d0db3828998493c7d30352c6a108dec5b8b748cbf20fda37744675c46beab9bf87b6c65adb90b77ca434031fbd670a4d315582352e3ffc9516d0df0f08dbc96ac1fbf9614050018f0fc1631becfd7c490b1a77f231c56635131fc6bd29f87eeeb0af8351a206bff14815358021f26f11c11efd1a45de10f61588881c356540be28eb95fe3a0a56ff0305074c12de2366bcdb7d1a63dfc4804f5570a061cb44ee75bfbdf706d1cf4f5154e6e6b5bfc4776c7f59f1efbc1817e35b8754d36410245da6f0620cd41a1a9bdce92b399befe88de85bc02dcf638800ec56ddb21cdddf924a961043df74ceefd80efb8a242f9150c5c0ea95a2c886da3f704aecada2c32d663b168ab2814e0c0aba2738235f75a081a542caadd692a48715828206a59bc48b5d8ce9aabb844f316c43959ce1c69dcd22a597836426dc0959c83547a0b70de35a03602fcf0ba033916fc7bbf2ff7fc2f44e6b010255edbc115664ede2aa00513fe14beff02a1d3539ec9dc2b096321de779eeec0d9bb56fd331cb78521444e2d47ee93d6c762e0a6208d8535c988ef5c51095c13902786224f713c120d518ed33b74b94e603b2cfd9d3d4041e447a262aaa85126836d2a3b60d51becdc7f060e8f3a470b3ca51de785944a3c37ac5b2c5843f9f489dd39e6645f23eb6b459af6b1bd9a583e4be13958ced7d4f9927c1690f04cd483732f40000000000000000fea3700000000000c9319c4715524cc4a71f26c5b21baa70aadbdad4a32b4e256979cb584b6ada3c70c57d4de5c56de27844b2a0d2d3342eb2c07d153ba0454fd7fb17d62aa8b6f437ac328dc2c99243cfe960551cb15a6222f3ad14433fef2310c1c589e617835800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cac243125e8effa09d1e8a13f6e99c9085bf70d5051d4455f9f32c0f570c8729ac0e294d206eac3758f95cd726086f64ad2523e21eaa3d740a468df08489dffdc244092628bd0519aff8b96ef479f7ced633e27331099abe00353796f1a52e9d82be2f56a52b802b0db171b4e1697566bd1796f0a21a361e988c2dc4e37c8c62022928c53b4d892d62974b0d583644cef97dd5391dda197ef8a5cb0094696d59da0304dfb337006d9082374898bbbe4817135d529a4f8bb0533e9500832760ab83f60a0588191f8ccf07574d5bac145f77e482e05e9789d63b2605f59a60461cb6463545b5c2dd64870a1928ce263e3d962e95ed4f5bef600c7dab058bfa566013373a032d77f0c643001fa6404aa1c44ad23aef17bb46ce2e92e1a68e24ab7e0c6bdc31020f66d3e94ba84ccc916c0aaa26c42ac9ed2bc787a2b0d0ffadd843bb5efdc04803020e64de80be37fefd8586c0ad7a45c6b293783ce6389cc487375f63ef34425c02302966918227797d6b6bad0918caf7ca21f43f4fe389cf8d39ad144bcb5819c9030c2b047a1912c9cb3ac4b3a83234933193532bddd57244e49fc6a351688311c4daf599c66eae64fcd6383cc01d4629ec8f2549a267b5e9e8c9395ff5f7f35c5bcac877ed125b343870102fc00e081b54595c98c87acbc50d1319e3a92dd558eb1e81aff8d3dec40a9ffbd13ea28ae4e06e3396d34c9e0ea25871393e3eb3b107a8416efc52211a0cbd4f94c53d7e941a0366d1421521bc0777c4117201477652f562190d746d772b8580e52971eaf2b49dbec8beb740c040ea147c4b67420d2fcc49cfe05919fd1485864acb0a0277eff7e3103c60872ab2dc555e1432800c31ca6666db82365de3dbdaa9ba6f12cd6cea4f3844de0607fb84fe71f32fd6abc43d43c92dfe807fb82767302c1d881af9184af467db41cc531c8c48d306cc8416e4a17f52a6d7cb86ebb97e19848a776af1b524640226a26c8e0e3c64c3243f6324b78ecbf4945e9991bbb60dfa83d2656e0df4cf081a8c99ae01b151cc8a674794fd74d6aac8c4b55699c6297302602d9625d7ced2d4bc662ed4d2ed23f4d9d562689d1cb236edd9fb1eec64c823d43e5c1265e6daf1765cdbd9f605de820635344654ed69207cdd7a34caaf2235d6f8d2b8e8c1b04c85260c7a24c9716b997a85dc0b35ae00fb21ba266a0867b0e4cd12d56b917c9dccfc024360b7c448020492061a2a2742406de2715a843fbb8130beb6162ecdb2731f3d20e9bbb1e14f599c45d4313a300a8e9439e3f641a87841924b778daa5c701bd6410f62b515c620477fc60669a3e2b87aadc636c786d6a1239186ec234d4b46f903a598491916486f2e6862b81dd62321faba8a3ed71cffd0662fd3ec5fda92cee52ddf23cb42e80469038a6742d82eac115db7dafda37d469fbb6b593c364304892a10448a618c0c534c2e00b64208d85a78db67b0f9b2c21676a419e645d1eea1ad4ddc1b38b2dbdb456685851f79bf136f1a4c8c1483081820fd54b385b21fcab10338fef87bde623d54421e46f58c69d09532b80abeef133922c4163cf404afcc8ac2bbf1cc60776b5b13d16aa2124b8876da31e7970947abdb7dd582d00c17d62c94ecbf6a11cfd721ef539bb6bc337de064fa2049c7af39e57cd6bd753b802d69d55a249d3842bb57b9bde7057ff728530fdd740f5421d79eac8df6df63f79b4810de3c497b8a1d7fb896991a24b37c83841d888b989a1a38120190513f28cd9d64f135ad691c1eacde8a4c1cd7c94c02563c490792316b594255d9792978ab7570fb2bb8572b8bc9c1d08e2396096f888e6695ebe45bf9d4bedebf80b23a2ca3c9157442287bba0ebffc1a1aab33c7e45a2b9788cc286de4536bc969b283f16d50dd74bc6de98a55781765064c30a36e80e0c652c6b779c53a9049a26db6204cae8662c1ac1fd92119469314bc2e376477fa6614f2b228d116d47a79cd1d9716575efef3d676538034e01ffe3d35b8b0bffea44ae6b5ac599d1f5f8552c091cff5893a8664321cb751bb4f16e860621e7351d06229d317e7284b5d46e23964dc1f15dc45e6328b0ae5682cd54346f45d43a83ca996d6b4454d6b69750aac09af004a5ad21e1a86d0f4566075086c5954a7c583a99d6436bc9a4113e713f76e3a45227e6796946479b2fdc47dc451a66b5d00e0018a96f7a2f8e089b0c46ffb7fcfb02c10fdb31d05ba15ab9d7f326cee66fd1e4210a70727193310925958015e63cdfa1e87684021221b639ce4be0a5dd10f3e1c8b2112b70d04000000000000000000000000273a6afb3987a4a04152a57513d541e4c9aa472be8687e6ef7ec2c00b57b71c5c29e8ac3729fc3f47f54c3c9ce84dc3a39c3f4e530c481f056377c5968c88d0fabd1cd3a33a8bbf4b423cc5bdfc18092f70b31d77201e14a1394ae04059a376e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021f14471443c34ec6584c59ab8dde43759480987bd14a00b8c61c5a5ebe5fe0b4ca1cf2869e0bde2fe7e970ae30f3a5069f9943551c0e4b9059ce8b633363b79c9b90d97dcc5e3c6eda9d3f40868f14f7437f2205e961328d0b609589bd81ae61bc9e701a1e5f0bfe583761b23b8b55a8d51ee35b860dcfa9ce84a5db178ee37021f876931847e934f1de6d01494446455337c3176ac95836dbb1fe285a4c286720320bd9be71c11e539e600f2e7aa55068b859eec473c6d9ec220016e0aa6b3ff1e0b0381b5b4c889c0719b5b62c2795697067b4c57289affc857fbe325e0c13d4e6bd7dee58046f45181308a97095e340be95a27e577afb9135d0caed86e86f27d0903206f52264b90cb5ae4f66f765681c6e36c31b2f23e99cbcb68a70dfadd14974e0215bb151d6481e7e142dc31c822905b0a37cfbdf7b0602286218f07c822d07777031f65052b5a0609b23bf9bd246ba2c5e50bb5ff7869f3a85fd272cf477a5a2e9a020fb380af5b8ed4d1229d7cf99efffd27b7ed0457d97c827a5a1fb81fc581ccf4030c419856212b6e78324d710f10ea380359e91067de76d96e0fd9a480f20a076244bee1b17346cb7dec3dc97b34e52e545917acaa427a18676ea6589d851f6dfaa43007e1d9b0b334212dc60b1c0d2e86247cbf9d26faa71a13cc5a85247574f1c383b35373ec5ad7b8b55ff4fc285e28e2f5d51694703ef679a547c06cebfcc438628041b869fb5ee3c423a5066e95d1f880e433ebdec9b8b719ad9d9fec3181a907341465ac505b67e843fc20546b2f2a42078e6b4500d643cac62c3b26430e2f56ce3b626cf771b90d9b24339ad7d8a919f498ee06f895852a26a33bc4f61ff696292d141e578c040d37c5a28bc92deecd6714140f9ef048238e044f2e03b4ee1f90aa67b365a0123e97b3f2e9231ac230189d49b167202a9682ab51e98774e056e541b0c725fa00455858f192c98e6a031e1afd4de4818cd42ddf4e27d43b4ac8a36a15bd389c76d91c931d546c91489060b8905d837d1cde7f899f4cf5cb94c11183126d1040b6556ce0407a98b282eada798074e5c97bb24fc63020fe15a6f6143cda6fa94ec6e3924ea74cb49f4c0b7937f4b258d0692a29d227dde6761ac7d7eb076bf4b869b8abbac2c59c495afbd72ea111443b1bbddc831154051e02ac314b1cb32f32746d9e8a2fdcb1b70fadf21901502154a0359d471a7175774a45bdbf74e55a81fc9f9119f70643e8473837b9f75ac02b961ddf7c187fbaf0f16b596ad0f88c3c5c00e2c51a7073b95f1e25cd301cc8c58a45228df852487a21bfb0813ac77bd93cca83f7c18d659ab564626ba57304cb6e42fbcc3693868160f07280109f927cc1857979873221d41af3a2a9a02a03e6f5d9b5a2530e47d33ac177469f2e92ad2d85053aa20eaa2fc99cfe2c7a7278396874846b3df596a55899abe1e069bbe2a605e412b5a3180cf4aa21b698a0b171289a7c60549abdaecce6e4c244d38e6f011cfea0a500795896386ec40f0e66c84d4d4e91cf3b5672ba146e7d2d40673e69acc265e48afcc83be0f336ad74da4cda94530cdb4637197190a364ec4857d00cebb8c2d08b28c5a0e51972d3b66e6a321ec4b21781694b6d45b7d6cc0d2fa65f51bd2c1cc49b549c5e41dfc7698ae2f741bd1d414b06d4be7a169b67f5c24817402d77329372f2f5079ef02032f99121ff6edf4a2ba752626c653a964752233070f74bf2e492c51d19ed1a94f27f9b29581856dccd90e676e90f5dce69657cb9d9a87991b93de6e9240a81c7f2f0f34248c6f1b4f8c5c7e08ff9bc83aa76946346cede7530cf69de49a736582e7d474a93cf7f72806c67bb5f26168c8d2dd6fcfb5ff933b44fc91d57ce492cc248d561978040ddd58b16ab4e9f6564435584f59f2ce7690266db5d380523aae034b047f3098d67dd1d010199478f182b0cb631c6586156a35f7f2759da450e20036e90d194e3f1634a150ac8991e3da6388c657358f46e5d6d229ebddc6e0c50c73130c9a2d33fad97cdd59ccf652266075cfe0b6b9487747002383562c0a2ed89ccdfdaa0e2412b0adfd4ef95cb8fe87305e9e22fee21757ac8185113f3afb72962e9ecb4da243fe63336935b2b9545167edd929760da7d43cb58d8f5f3bb5517d48ae5135cceb395c3df925ecb2ac8a3cc4d3b72509c499082dd58b0801f215096319e54857c58f768fd1c7a943e00c1ba66917147be020bbf7c63706658a831d47da04b5494f02c864642667f21aa627eade11199e6743204ae288151293e300d564a910ccdf10eb6419d3339bf2bf02fc211a4d2fb9a3243d4d3b5bda60bf88402953b4f81afeed7954afd05d14a772bc78512c6b52571d3c9dbcb5a8016933865d50af0e5a136f4891ff134b9573b9296625002b8a2a3e6150e", "ac63655363", 0, 1179146788, 1537743641, "9980b5e2b8f8f21cc6de54f3d387c1b807ac8a554a1e66c366954f24c238b0d6"], - ["030000807082c40304a44e90734edab04f43397c6309123d4a2c05841af54e334d74662d9929da55d20300000006635351515251ffffffff71b44c35ceecc45dc7432bd74e9bc5c9f72d0d35579e2391834ab392288a7dd402000000096aac656a535252ac6affffffff477129738b7117df6f2817a76b5f4324dd21bf84543d9efc282f79798e156bcf0000000007006a6a636a5253ffffffff8234dd14e0b247ebf97af4b10abd72efbcd0b1e3ea48b4d6ee6e54f56b897afa0000000006655165ac525367a8f1e602861fe303000000000365006317faae0300000000002207761e3502cde30100000000000000006133ec05000000009874043fc7b6959ea2aead2ef53f20a686addf6c86abad7665a3be9da23d5e65af443745dbc3ca2c5347fccec81f2d140a184df6f3a2b79500d20096f1f52bbc2e36643cb7d81c37c59f113209063f5a5c70495ab64c93f046004a1a13abccbb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b38a463e2d60df539d4c2a4c671bf810efdaf5e58c8ccf264fd9814428df3de7a8aef2ba9517d99b91902920b37b228b915c49f7781c706928dc2aa934e513160e454e663a58b95776043e8e2a728e6d123207c62bac813c348e30fae47cdaa4cdcedae154829db8ff2c77a1fac312fc7220c52833f81a098f28209a85a04d710213e2d44a94d3301ddacc1eedff22498209d2c5afc85a6890d7133e1b04f710da030e2a5f37ee768380f33f60ebe75e9aedc364cb9c56767216c8f381ecc6b525500b07b6f6346c605b25777f7caac3297c2b3d0695b5613c9846766436ee43cc34457f95e2a4d66534f504454452cdc4ae30e3126065b25a09b5e149efcbbad32d730323d556b972c67018368edc788572e8b8ab4dae9ae5436d8157b6289a1b0d2e96032ac84964be45bf02b3f6e9e6096d135af3300f29ace6b26211780ab2575467ff0306a91c35bfc566ea35885982ce078c4fe089a14d481fc377538f52924231e1a2020ca66cfaae322d83734dc7dab4019685bd40328747d99246803409bec1fc81770221e30729db4f35586f449f418309bdf0fe4047fda31e0ec5f54fd4ce1ea8d9e8dc96c6ee8e6391ca44ae5420762b59f256566b8fd0a0933934b642c0edb165ed3dbef6e30f9da20ae45867e7af033a2d75f9349f75ac35e574404a485ca6f6c106db5772a063e63e0e5badbe6a94e01cab9d8fc84a6aaa5abbd6cb9d1c9609cdce54cec2f229a74654cdfb922bfd750edfa53dc1703438179595fd1b0bacdf84871ba20e962f30150e447b99e8e7891b40334abaa47339c7a3fbd2210a92af1f8a988f71e0d8078a2bf500cd5ce391b1fea56911adb52dc7b44cbb7cb6a5d63ce1683ea3f5d1e201985e482583f8271fb2dbf76b63cf302fa8dabe6ef76bdb621734782109bcf3be51b09026de7b333924f6fdc4940ade1b3a52066a2d8ca964599ac55c3e180503cf1f357f42bd04bde6520587ff5917d0adf49cfc37109ac6477655aac11bdda44befb12e47b174aa878a30619fa621a61a6f0174b6aa2085373fe9f2497097e9c912784b79008acf60d8cfd5274902587377b0034fbff82dae5d9a66f14f125be7a2dfd2aac179201ba82dde5da64675d916388ee99419ea3e38428aa8da2939a665b643a27a0055e3da14e8e61c9a0a7a597ec911e10bf0d7cd678513df7b6a12e43fed814e724789500d1d57e1cd5d87938a833ab6fe63ea9525c7eed7eb35c631660581127fbac0fc82c353f114d76ce1d95ab1602f73e099212546a451bc4b452a57f03782bbfbd0782858647598ab46d7c47282ece031f1158863e04628be53db46aa23fed4bde857d34aa3c21af0b9e59db3844e8de2239482a4bf627746cb3a25c58853daa6177aa2150544ec4365649539136f3a0aa56d8915e92f225ad872d887282939653f07e43a3637dd8b41c195ff6aab84a9cd2aaf668d8b113af2d476b954c19fd9bbfcb34e4448a7cc1069ba35cefaf6642c9ce0db0376d86e0092c94de7eaa2961dba4e51d04db6d6cbb4bbddc7dadf6f504af19de2451f2946f01cb227060ad0ca3fa8cce323a1999cb3195d56545b4260f7d71df828da3fb083dbf309ac113e2991c3ffba3e90698878765206e898b60a05e36f54b8045b17885a124168a94f3f8551516c0711d19c39227775b1fa4afcf2570f214989d549a5e7a446bc50711d5736fef2c4ad12804d22f0f94ac973fff160f181d7bd484b98dc91382af4ee082a830a9021097d9477a4943b875a24f36e7c51f36f24cbbbf33ff271216998d49c9ba1ee8aab41951f12052b976b170cca8f203f1484c2cbcaae74e4a74736cce5503b89b8b5f58a448fe5ebe1751f651bec49b9ec5c2eec1317b872c11f52f2791ec5c1ff2f56c4988d974a6f60f5fcb6107de81d5bb1f69c69316b0dd5e5fa54e44d3c969deb0441e9dfebfed10f7304f69cb4bf3ee1c6fae3ef501eb8300f73dd2f3f0fb9531ee209bea323797354dde4300e51e96a51c2d58db81e430fd8ff124ab91aa4af84c80c6e079c1c4a413f6fe70f2e23152690fcaf4de8df1264aa3969c3ba34ea323423b335223a3cf9ae649a3c4b5eaa87775f544a44f811342b3d43cad06bce97974f3ccce58eedf8c63164ef8b4400466c34ad5e2039cee589d43a22555a92c62d652ee535b94b5a02e8e02047e21f0ce92cc8948a332d9461680ec7cad4ca46c1e33fb390575751823116f517973eb5fdddae19105737b81ccaca4da0dc56fa75e084bff0df9e38a0aa52fb17003605813b91313eebac31a4205e54c81b8a3ceed8f7a04584917b57dbea608cffbe64c6407ece2e5f5a5d1a73ea139d3695f80d46adb97349eb928c0375934fe339ce2e45218190b39416e1bb76de030d3c6aaa027255667c27e19dc865993bdbc8bc51a844002692f60d", "656563", 1, -1311201187, 1537743641, "cd0e21d4636c0811e74abefbf7b68af416480c3f7413f599cc2472e89770f80e"], - ["030000807082c403048777850a4994e18bd2d68d25d2748e8827c7fd2b6826c809f84a1b35beda4e5503000000026351ffffffffa8f2225e696a218da38209a11abb8b33db2cb089d0800d86b1bf712234eda6d5000000000652636a515352f5657c2ea975e215da927bd04cbd9f39376559084e5cd5f7d0a1948b58ecd376cab653220000000004ac536563dd0d96a023cfc8b60f09acc8eee2589a72cf99114d17b46f92b0f8f5b22f688e7f905f4c0300000007ac5265536a636af84a7e820463b8f50400000000056a000063acdb104403000000000163a26f2b050000000000736c2903000000000353536a11593c23e1b41bcc01d832af0200000000000000000000000040607260f429fa2e4075db48796a0423451650f8ec8b697f0a3632b66362d44ea19445d2474883f2ee41a82c6c8698cc6adc7ba587d408f59cbc202c6c42e49ab10124101d88afc34dd89cd17210d108196a9640ac80b5f6fea0cdff34e484eb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d5a7c32799a078e374aa2bb02f78ed856832a8f649274b153e00bd2e0da54d4b90a9688c487d95eba1c02187e54f7145a562901ba96884a5d41bd171413f89e7069e2c5106a2b68185194968b1e11911d49c64a24c3dd332f471941d63c2e1cce74c3d4296f2f393276d1797c4a217f291980bddb11b3a1a06fb8bd1c48159b02030a80b98752faab1ad08ee50e8646dc3859f1966dfbb0c9eb422c22620b0a39021ff4440cd66c4b12b6df5d978338ff8b5b6d8106a200031e740f93fcc57f3f860a047ec2a906e2f72640393ebf955bcff1b162ab094160e9dbaa2f502f73cd16f31c25939a500784812abfd76ae03584d6f6fa56de8cf97d81b20b4363999bc05b0328b1c5fbd31182ac90df677677847582bb459fd0476f4aa8d8433c46d03087b502067d12a4e5fccb1f66c30850aa06891a66e0799939582a3dbc7da56fc4ce721a031576647f83e1b146c0e9cd663c020cfa6da167f057d3f6e0040e5fb1b8d067ce030ac0ef3e2b040005c8a341267aaa8229ba2b4091fde9b500e601b1e9c55dc368021548094fec2ffae10eea76e85ec96adfa594f50cf7840b2ec3d51ac3ec29a4b8098fe3ae4b26eaa023697d0869930a4439a3d1571021aa12ca945b126d41aebf194d5f662145dd1835b3232488215f88b247f8667123b9c8e8e66f9cd3c896104cfada68132b79173ddce7dd711a19dd1a0ffa5ee8fa4ee23c89b1382ae547f2d76a93a44d0972144ccce2e356b79ce20c027a604d17022ffeebb0e534bcd69840ee8e85c837c9b954695c8629b3aed6d9d9800ad14ac908e9e14e8f3535be483afac4a2c7a6b873779d50fe9075a9f00e298bf6d0b91946b005aa14dd3cf92caf9a3db62a9fc08c14d757091a01d53ca3f0b953bf3e84d25bf066d861565ee93aff3303ebd753b7cc9a7c2d7882e9c982a62643c7eb63fde700a106eab73b1907eb2f284624aa774d5cfe635a4146fa8bea9853e9fe9470339879d090e48a368fec96a79812c0fb59a64573314144693f0a55dca4168bf6f37942a4934a65e5795ac5c569da760a85a1b5923e5e08f6b185ae4d8f9934295d9c7d305a5509c3481a5bad49dce4d8392259dcd9fe02f9b50452f2018489c837b340d3f7b745916954a179bfa61a12a73976d8a23fe16033b604529aeb6194a34736e759796816e1da27beae61986403b595c556fe5249651d2db51e13bc45eda13fc2943a7c3fbb749ffac5ad8490a036b9e31c1aa47cd9f7d99c8dc63e554dff5b079800502305d29cd4bf4180304f60b347f93bc9cd4e65ce51d357d18c99e91c9b7dcb5fe2dada950907bc59d846e70ec3a7714aef7cbf3fd9f143585a5c91fe25c03deef750d8a31b42604c6d6d7317737f82e8994d9ed2055576a4f425326eaf89d05be50267fd746e65c4407a8b6c7caa91be919d7f6e409e2550285db15e1c6221425e3c2f532a40b6c82f1cb362c9a512f45d22d53e2ce760998117efe1ac6f17489e672d79b50d34ef8105da4f8a986d15951c908d38032255f95df353eea877312900c6247da7cd7d88b6ef176643ae59b0f0d37d3a04a91d9f67e82bf9b83642fdc9aa489e246a94f9af3092e4f40a425addd488b886ea4871f9e84fdb2e9ccfde2139b693582961fcbd19c30e2e21916ea1d95ef81115a7ec05c9beefc7ecf66348f58d92030bb04b0c62758607bcf2fe6a82a2f88d6fdfbdb09a7c80c239a9698a4cfa49ca5b0b6c37f7aab754e6eddd8adba72ba41b5d53e4353c02072535095fc09881f6f62f1d9e461db8e4cf06f009bb3d901b26150cd91c3a48f7de58da2f7dbe3eee6d3e3ccc3699466ba4f2343c9928e0536705390add306421432c375c3ff7a59195824d284e9a6a90958d9cad324bb3457cf0854027fdf928aca028bff2934ee17b8b545821fb8e6d0521c7bf439897451f3d84642f6da99ab8d3ed04ae6ebf4e69533c31966159672c11fb2d4e74f27f0767bfafba99275088e903807573a6f0c181b3cf07027091cc5c5aed84b97a7915f65f96c682fd70a73f03be8fee799f62dd974ebc1240c3b422bfb391ea09abc9cf7f0df9ecad38f14e9b6b29f255597bd0ffc9f68b30fcad9828853263e03e2c8ffd835f6437d4cfb5b7a644e45313786a79d6e32b7164a2651acd5025eeeb75a7a810ab82850d266a6225dd2ab5ffbd0b964cda5faad2fab588b95637afada5862b487ea97363bc5776ffbef78256e97743e78b161eac3f9b1d0b8a090bcc0f3dd6165adc706e63a721f6cd65097c4d80dc8cc8665560207539e581cd5e4ce08b96ef9cb6155e7899d415a4a78db7c57dd1a34a4eeaf4a6a31e0512e1a46f5ba3c8ec8f9581b0d401a294ec73e61eab9f1d1b51c3d45514ce274e8a8514abc2e5267d133ca350c46c59ee038ea753ba29c97ef1a0a9d3e5959fff03", "65", 2, 1221315612, 1537743641, "cb396fc51b8407eec4cb9186f667c51e3dd12dae57328feb0e921c401c31fbd7"], - ["030000807082c40303be28ea4ecf82ff4c29ece3d264f3c1d5074f1ce24ce1a8f2da4900963c9dc85a02000000076565ac530053ac5cf90c558120d1fbd85d93965c09e02af84a8006dcf4b60cdcddc7e6b54993e9f83e0f260100000001636479a99de76f2750f0b6198ae17e78a70f10c6c3bae23039c5cb2afab0f7cd6e8c0aa40a010000000351526affffffff03f02cd300000000000752526300525100b7aa0700000000000765525151530065d77702020000000005ac516a5200000000000000000003000000000000000004d4280300000000b6f9ea77bd030a5dc17890c051f7e2c5cbe1d3bc31b29da5c40d40043baf796d86f302bb710eabdbeb3a34cf2aaba4b0e4f04bc37289dfd4967186a5acf0c13bf091cf9da6e2fbc5ead71bb37fb052270ac59bd8537178a8f498d2a0398af8b5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b7c2f9283ec7b6c13358ca6d9092e228c820bb4098455c12ffe7ee3d4d6dda31adbe5e544f1c42ffb6c2a056f6cba03e38ce8775d72052a5c8117a4bbf270a0f0ed5534eb551c334dccdfae0c15904f255417f772a013900566cde1d6229b68777aa732e52f65cb462fa5e30051c6c9ef90c538de3d2be05e224937ea0c6b2b0311fdb26cae2445a04b99f78431b1ecf1f2d5edbe4fdb75490ebd95227fbc3b17032122319a25968931528a9a5d056862f8668c5f5abe6023a1ba74076249263d990b022e4f345e77dcb5019f1fff87eae90588e37585b0ffb952c2a6fe236472592947b2280b4d77ae0def96f802d226c2e3235b0f852064623198ab939314004f6f02265443b803bf50eb0a4140ce20fe750047c889e6b452f529857f0c5702bd60780226316646f158b3a10cd994ada4ad353fec7e951b6c8239733d1074094e4b60220324c35f82b261c13b635f2b846a366c579bdc963ea4904bc1b84ed1bf42cc83c90317c2c705ecfd161627c49291cfa0bced9d5d25c4e12ea1a193e78740314a37cd032ccef8975dc725b8f992597e64c4a50c5013d54420bb5c1878620dd9b6f6b425e5cf2765a7213ff028d2bc4994cede0f9d1bdad1a3ada148a04225ead78725bd49ff0fa003c2e576223656ee260763bf9e60399a92eb8f0cad0cef44898f420658a800419bd7002573959ce5de94663b47b7cd45b86a77c4c47da84733682b0900fac8d4ab83664c313f6a77000c5428b0bb9c0223eeb34ba12fc8d1d678f33e1fa237807657ba013453de93ffb56d36dd22fd3929c54d29487908e38cd53dbbf700dfe5e49464116304e85f5a6dd52a1ca04efdb6be0bc2d635020d77f43b0273f3db132869aac1f9797559b2ef52eea38d54b3f7919ae24f4e013ef80ff42e12ff76e565f23cec9762900be0024c3bdefb98d4448bd7d63ad790d09b690c384701fc27fa1ec6b8f4cd8338579462d6c3a432219aaf29d76f9b541cd04ff2defc7552400d5cfe7f24e831bdaa58d21b83085a0504f5dbf06da22769ccb583b1c47e2cebab8541bbceb2d25ccccdb096bb887255a0058fa401b35fe4b1ca020fbe6fdc25c1b9c8bbbaf8ccb3bd0c5d4943246e1b2ed0b6072c4b6345fbfac0364881201cd7aafaf7b4bfb4fb6cfa195c5a348ef876f97ba55107f6336591487af3bdc3bba41a0bfd340a026c160a380915f50d485b47e06803b5c3947b569a63a6e7a8a235b74a1f828933ecbe014765ca4d0cfa1fe58777c2f019d7a514b0d05ae58041e01a426341469bf71ca079f6f82e5f25667bb7273d410a8034ca89fb665095c08a5432dee6cfd64677dbc84123c05226528eb766bf238e32b845292c85110e5af32133e6581060d2ec91688d0ec4e86dba09753d92cacb9cf1d22b6149ca66a0f9665c66e23d480ebe89f0c0f1f90bee8c2bf7ecf9ed637ca447e5b26d76d8f2a82ff9c33200145efcda54cc667c4ab9f575dfe5d83b6d220bdda882fe2e34a25d3875199b926cf729fdb59fe8aca77a41fd6099cbebbf9d17fe2cc0d1eb93839300e902dae5d748130e67a9025e285678b73e89e1b877cfb15614466e77fb19d209d10f5c758413eb08d1546338c83576deb387a5938a139607a95bbc346c4d24743bb4526104e37d7607ee5f5247525f6938a0c0304b1f1152b66927437c3748ac94f29c8e0313dbffc7057352f3c73e15fbd949247d7bf7b0c20ecbddfc46955e673e9319e2a34633e2493f586509c7b2a7187c346d8b2ba40422dd31479c66d88ef10fa0e5ebe3d02fbff1db150f99ba153b82b9163417dd187fa5a185ed5c59250735d4ffc2eef55e380c6b1e4f6046f049581de64214ad7bb344b838b2ebc6f2327f881c43c40c5670797a33eb7c1d00485058ba2876569c3c1e91e064db259e45ec021dd29eda4b3e9edbf8e128906c4e4084096eac0e7b467acf56b3cce141b8ed62c0784f4e1a0d4efa6320bb0753ffbfa819cb9c4fd92e7a3e37a0fc8e9cf16e15057bf0947fadd5db445a95512e00c0f8ef4dab65f25fa22832731ccf71f6dde180f6ac16beb87dd470096589435537cc03b6829e20bc278a7f0afd69eba31b318d1473edc7910f7916f1ccd707c7b9c745a12ee8048d3dc6a4f3eae55a1f1db060cb51ebeacbaf192821b6161f610af5c9adf43566b8a622a7860fa0885e4f9f2e387f25dc7bda2a70c0bbefe2abf5a746aca9acd40d11e5740d2e8ad83103905b5e9f30c2d4de6d3224887f9955dc688bcb8ba3e8d305aece588c20d8c0d441eeab877612c619d400000000000000005a75d502000000009ee2c311303b9bf42fe194d5f4c3ca901099cb681183044b77967b30ea277d04eb5a3e97553e39910d60198a6d6e9458639eeb77f5fbbe4eed364dda81a27df1029f637de1a29becca58f5430ed5b937b6a26bfccf243d53e38861daf0415f3a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000932f51259213837dedbf40d33d35d59ac079767ebe024f7a038417051da634699aa6cebeb31ebc97d369fc6a042ac1c8ea66654f71710df5e0ae07ca5f8145c91f6179532cafb89cd0ad9d385ea2aed3c1f41fb196bcafdbe1a064cb233c28671e1f9273102fa8a3b90cca7399e2ceb2a77736e67708d11a0ec69e084291b3303249437a4bb961114e3c451421a350c58caa1b94c2af71ede4de958a65281360e030fb78722a2e794068a431e9dc69b00f22bbac7a85fa30a853a12c59bc6e5c39e0b08b506001854086597c6f6aea70115504a2a929660f752ceddb29f951a19402ec12033234d6a415c20c513fa20325d47d78e71e5132c1cd69724a0e10e53f580020031a5e561edd416b76c2cbb33409fc807b2b040c14593eb96028e1be885c0a1021d2bcb848d006082233aee32b3e03ac126a89f36bba56f118bdb0a8acc0312f5021c9347ddf383c6ac90b3d3358949d0283f7aec76352db65d36565c0a82f4329b02047e7286bd501488a97f00731908614cf5da1ee6634a861e5be48583043cd5e402282f7316621a293f9f8cb3eb25623fbd2989cc10f8379d53dde812757e7b1a145234fb1f62f3c684c877efe3e9068fc6be8d6ac90e2be82a94333d059e8a2789fe10d6882807de8badcd4132c93393af2f662787649542df4f8747167a5c962929fa014af4e832bfa3dcfd3644cfe88094d64b2608905bfecfddd51fef63f407026eb807de51b746ae82cdd153bd4e2838e2b48327af12a9c30d156d030f5f6130e81c985e10752e8b36345b7e409e32ef701a05806701c89f3d1a0f348146afd980aae737b80e03584492d3452c26eafbe9d2b4dfbe1809ae292de3418585c8ceeec1c3c05cf6598b1be89035e910da02423ec73acfc3c2fb39de0c316409f4702a602d772ca41193635a21c0b642b4e059304dfc0d1f0f7d0f449e02b92909c16cdc733824dc808418f25b2d1ef92806b6d355e19b6aa88f3f04e7fb6a4fa4f7c61057a342f918203ddefbf996f538af016e21dcc0e2a46773424605268c256ed71e06d771fdd4d4ecf7ffc76c3249cc7128809f2e45fe411b11e508fe00aa9dad7cc73bd9dcc78433effee1f3fd0c33dc3ca1daab9a8e05ee83e710925ce88cfd8612da84f0ef711d6eab5334b9051ab6040785985791c7e744fb168e3ae1254c4471218ab52844446449b5a2fff54076eaf9af81a2ae7264586d9ece60fec53486a30aede71ed72b5ba4add043cc1a4f9e37e1ef19a58c368aa1905812bdcc88fe9a99cf194ef8be4eba942cf915641fe16049c8df4b9636fcf24aa9557a2f4b2ccb460dd21671567dfb84d1aed857c113b3008844611502f41837b740d718a2addeb1a2f56feafe8d4c1a86c5801c54254025e6d2292e9da4d3d48c70e62959a639899a4e54359c5e2b4f85a92905b15ba394b5c084ac57ca5dee4da719d775f53cdbcafbacb51e3910675e7871c3fb2d5fa776001c6e26cc9c4d87d9b159b744e0af9e18b0c9b99c6f400d1e6820973d22bb023609f64e5da5efc8e5e4cbd7c6d7aac6527f2046820024c90dcf6e1fb4ac8a19a619c5259f47606cf848fde695a78ae736a346fb6ec346cb713494413a0ee9e9c802ccd287a7d85546f369780c84011c435db1718f924bf329d054a649aef5394b012bf15a89b78922a16f486cb56d2a65ee06bd17b3c7612fb72acccdb4ee427dc9274b0023fd886ea9c54e0122d8827561a6a0dc0ffa5d184e9a2f4ef070844de61ea5e9d8a33b843ac245c8b92c1926461c36796caa747d4fe075a35e1182ea793c9b3510d9a50ba968adc262f32e3b3654faf58a10242ac1c615f278f4b94f2ff5cb7439536c09bfcefba8d0957db561267464091dcc5707df1c2e6eecd5258616f9b846807655e935a13a8401a4efc27b1651cfb1f80a783fb2550175ed9e0093359b1b40fac1bb91930c6d516b3921c73664ad359f5d733e172721c2f5c286c700cb85fc4772190b1ee74f01d4504ecadf1441c827df20edf05592157e4fb0dd51aa5a1e0620020462d0c9587c24f2ec5b158d251d6b815f44ca1d82a5a9852572716627db9ca48b7979bced80a52792a3d4a3205f0041920da409fac07cbce80053a89e5d58fe583b68b882efade90b3ec4e1e25b3436a6dea905bdcb26b4e93cafc72dbbe00a8fe7631d15f8ee1200bc8d82822b1084eccb5b25a2b73cebedc9010f0e2bab1e6b3ac941d2095557f78cd79368a1679985351a7775587acfff48eb1a134896dc003da84aafc0faacdac3cb3e1762dd6e518d7e6d1105000000000000000000000000714bfae684b1e73d5ae6df499fb010423005f7fc1e5a8b2ae0999d2b445d92be957e1393655470053f294df454a888efa2062d731fd1a948488f5b011e6e3e3a51555b6c0abfc55cd6173a46fa3555ec02b999bafcb7435715ccd6666dde443c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a38a0e7fff9264f3c460dffc4722ba5081ea94f87331a27702d790f73e4f544fa48e32357039a4b96bf6c7005c672ffcbb8d8648ffea86354f5768734a6994243c4974a1323a59655186dd7087161db7bb68eb401b84e0eff198ddc3ae952f16372a0072110906985a066a4619600097c5a1035971cfb4777b2ecb6c49e9f17d03047673bcc144869cddc02701842dbe3c109a4eb79996462d0e328d2ee7153e6903305fcfff8800b696122a2a911289d03db2e4f085871d3b97cb7ad84b7b2a84530b04b0c7afb7ccd8995dd48f088e9f7803b7496473b48fe97d6bd98ad5c4ab34dc5b7f017075070f62a7f335121ed21bd31e1bf7c2135f24d0b38ae4591f8d19a4021e43572307439af22f6292b9ae1f076d913c68a41e79e74e9577ecd373718ea40213364c42e4af25880009fb12b8247c89012aaccdcee0d1c33f963f04e0cf8383021a7c712d5b0c7e11c277421d88182f8a98aad1847d9c9362d30aab57bef5fa75022294d723b9bd1c44ea4de605c3ae3305b3f0353312d1ace00d9baf65bfa778220319190acfdf65148f287b1398f916c0f727efe1447d9f06ed41a1d5efd970a8845b393b32cbe4c59320f7cf6ad4d1a82e6467e6fad3bc26d5972eeb2d9a7584b786be994a0f387919268f41d41e5d6148f4bc3d80c2390d00dc5e970cd942a8de749998aabc6aee3ded988a2b5b7358ec7b8583102a4489096c3605994fdc8ac4d1f71f32bc126b554d982ca8ce5503e13539ce5ece8761ce854611eaf818772c2a592f98a292ff2705df9103c3b065c0c55212da8867331f78882be46dfd47dc0d0adc9389d8cdcecdb1896698d2cf68bad734591ebd8c39ea1b6f49a4cfe28d53c0e5cbe1341b52e694cdcf4b7d3b51fd332c959f8f5c27a9ee0b4c50d5039e226b60798058362aafdcb76622c7d4aede0477ce053bf7a1f6cac408e3b152b83806a0e36568a0a473181990baa60e38d3ba6fa4a0a1f488b7698345c61b3d295bdc656911e15aa7329d5b0602d0f4422224ab6f878996064b2446f715b2c664274462b3f9ec4eb4d724f2de1207e49ac035eb0678bdf45bf7479c925251d1f1d4f615f78a8e5ffc8aef6d30a69c40e201fa83fc080c1a021820397aa9a5083228cb02955f13de728489f4ff8f846b1c593e4f681f8f9e9ae8c8a7dd3061da6e081788517c1a8c6c60278fb29ecdcc140180d9ede0def608a4e536a43d9de978916066384010a9031983ef083826d18cb76513976fac10ba5cd1729bb55a5828935eadea7a8ed201115b0c412a83a73c5d8c5d05ebef3da8c393af9af9f0337385256f30f8bcfc2169999ede6694c8bb11fe43e62cffdf2e500c247a6a3787fcf96ce6d57866fc836392b1e47bb9f95bd608e05895eacbe27e852763307cef51d4c43db0b3a05a936189147d65e1709ab91ed747ea1155ae3a76220d4cdcfab8b1fb87d791ae78ddae11572201600b220c0a8954c363af533dde7155387825647de706ec6c1c8d35a744098767b4c955ea8f57aa8b163afddbbb24c6ec42e288df12b0ef3a13e340c57dd7e5968037e58dd58b3d2845fc0e35519a5e8ceac308a4dc31ff00f36bba55878f87f8f9589d6654efbe46f7119f1b2a82f3f3eca36deb7296d927e3b5f36fd41914e8c182d687f3bc7f9ecf0419950cc0953568ce5e39163efad6e2c267b159be426bcccf5474784b2c020c2fbedcc7db146642beca0c11c45bb178b06a5ff99f4f64c33f9e7116c03511eaaa42b98209f3065c9b57d39f6ac6430ed6a1dabb91c1b0460a34a2abe12c354639e9b00e14a34caabc9ee845fded053a5fb3a11542b1e08613b2910fcd28c2407e681144b42bfc1007452dddc96f39a811f1b2391b03facaf2d68a27719a1dfef6f1b8e25d98a088d37805029f12cca74e4af57111a0f1672245e3fc0e022d7ca129673f9cef922ad9c2e5b40970b82c3c97c702a9e4b314f4d4d7b184b7275e8be94ee6e13fdcd6b346cb312d6fa64029644070bb48221ae2fe07eda116469a5c82a87a71b9b40bbeafba6e395a727d383863665b66479983fcf28941c2f38da957a9c47c58307b926e6e17eabcc3d7e26f617af699371219fae8a2cc3e869204eb88f32aad1b11b5941efcf57fcba2de6f29dcd020a1654e167d1dcb5ae6871e674af0e61b600f5af70c6898784170cc1db6ba81fc32eaa579c44cd39f5274932065cefdd1e0301a55bbd790aa98d82a599568e62db40c0757eecb49d2afc6bf31cdfe5a1a0c30448bab56d6d7d825529b87874121b77396ad7f02c436d0944e38aaaf9cab5c5dc89bf1b25bddab1dcdfe137760e17242ec5f2181cd9bc6967e51541e6a5a7ee92f6801fa4be921b22bc385892790b8b9bcc93b2aabcbc47f63b42ba774721cbcbf375e919498e9e7f0dc000228a5d4bef92fca04", "6a52635365535351", 2, 1526933674, 0, "1b5e610aca8d5f5cba4e040a7dea5b13c0d763bb939d494825ed96d16182dd5b"], - ["a1d4244f022a75fc62d358850ab5a7344dd3a8fa3507c6e9f73eb9a422090aedcbbf7132d1010000000665535151ac52ffffffff68b498cb22386cf87575473b8735f4820bb9b02321708ab2cd3b05f3fe3c98d6020000000151ffffffff048074e504000000000600536a63ac65146ad70100000000086a5365ac526aacaca58b7d03000000000451516a5309b90404000000000400526a5300000000010000000000000000657b7500000000004c0b8acee942554c2ae17baa70f307e2966f1375d552ef0082912208a80a63afb45d39cb15b257666c7ca81b5d78d67e82f249a3440e5cd655c5b52500acbba285a785a68a2d39549b9b437938d3303e9d6b8e368872b039b00a892714135bec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b50dd7498d93d2fe544a888c1b51e4bffe8bb0a49c4db5fdd5f8ec0ca7b3f1bc3504fdf5e98064a7c4c4c7396b9348ea86566a9686d2fdc4e3444f0f70080194e8bbaca2fa3edd29c2b09c5b4910d5139a7c0d75080b509de88aac80b2272a984488562387f0046074dd3b976ddc52e1d15fcacf7eed8ecb5c0cd12da5b951e202282cc43f1394fb6a2e9efdc4bdb26f4abacf3a91e71e87fdeed94575bb3d595003114707abdb16058454c79ad437e90b0f3a1c0a1a80a2093774e9d165c7c7f5a60a01fe89114867b2e85b7692bd908784f964b4f5eed80842322412dda7efdbfef3f5f872f609ac4785c354f17deb9fe21daf0db53d7aee8b3e3802c88d40e4d0e0021760308f182dcbe065905307e023fd87413b5e9a285a3f5c9b1b6f82360b793d02182ffb2887558214908e6c49236e10568019c8c5d6a32c6f31ff7151618574850323f1de6fbc7a0941d30e0037e23664b0b4c67346be13d99ccaa9de48e6e8e44d03083f587d461bb6ca6aa72e16c3c5f67c3f2b790496a608ef2408870439be5d86032978ee7630a5a330bd74bae73f87c67af54ba6861e1a244a9c22a7890fc87ec9ece8265f2d57039e8017ece3136212dde548e1ff7e8ab076bff2d89c102a27c5d45bef8835c6756ba3bd9b4d45f9414a4a5f7f8c7e53beeceb732c51d1b618594ef4c68df1f2869786b053f9c2e735352cedb5f764f4c85f291a7cedf1464e18991a852e6cf62fe8aadac042adc76fd8c37be6fdf6c19b31eea2f08468f80596ee3bfee5889c1f6a52150f4dd5fc484b8f2b17f324d0ba4b100b3c87f14573a2e19de020b16367495fda7065355e295a80779116fff602ed1043e8ac3bf405595442897bba1352717f83b85ee4454338e1f97f260e00194b6cf7e5a17b068aa96f1a64efd4e35c4cbee2b692ed6afa69b8502be34ee10c40e4c1dd6fd8a899286106d9a1d788b84c9c824b48555e89f4bc43f66d6dd51ff87ec75949dd32b67ac4cd99bc91ddf7f3f6eea070b7c38d69f79d5d46aa1519b1c75c82146e4f811201ff591bcb0bee7c97da03717d0d741c98cef129052b86907d9b40bb01e3fe6d2d9552e66216761477b6955365729a50f4c25974e30ad8151c611ddf0b7eddb0c06227617c47c159d9a9d9029f943126af36bd68e91b6a2131efe8561d12fbbd712096f0fb57967df7924e332ae24edf32d29bf26970e3b412fddac94da0194b8378474b84a56f71e66b313a701096efaa773d57da20fdf76e0d266029d34dd7b2b4031bb80f472dcd2589a97431a0db5269237afb1380a703d0c1ba8c9ae7b515e05f520a9b117bbb3ce781069b1c037a0db24e8289989285f5f7b37204bfbf40ef2bf8e1baa9e69789471d6b4044062c6ddd9f8fcd135cf4417afc23cb412da07b8c2427b0f1609b987912deb97cd1e28ceae39a36056742d75570afadd34da98890fb01f5f6d77464b77c77c5ef83d51b9984ff6be52ea214e03ac13d27c81574fe2abbe10a10d1c8f645d7a9fcc251148db0bf2b0f9615573e137bd4e44dfe836fd7c731ec4a3d21977871dd9e676c464ef3d0e34d68b89961c74547c2d5dcf4392e90c2e7204b84909c78b74c8fd3ec11dfb105e4da908e5d9a512c503bff0c1c8e5cb8d66688b4cdea36d600e2112903bf4ce10cf1f8ddac8a6c29a47475444d9909a06aa139575eb5fd572a73f6a9ecac5ba0328b04ce6a622ca141e7875bc06c5a02d47336ff09f3e1f1058b8dc1f8d4c8212273953553cfa3a776fa7fe58c616506b50b89311567e6be89365681e39116036f651f3b807a756741385f86e84408e02443e3292537088b131893f3501a1aaa1f01984053056e9c9532b43931110ab06d408e62b710f0c3db5f6e8d99da3f16777cad95818fd9c1659abfda1307614f05290dc67fab2b6a162b04abda0c5fe075ef8909c49ee82ba586430eef96798a29cabc9defb950f12fd6d3882caca3c756700c397993cf056328841e934aa165c256279590ac242bd90a4a66305349f3dffd165e39c7c4bcd139c56e864d0ae13f40536823befc52c27d9d1f04d0bc64569698c982274ddad94fe3b753f5fca6402943e79695e7c98abbe70a20a9d6bd6ecebcac7297df7e2967ee3ed810c6c8ab7c04b15e202d393918126bfbf577b9b6c079a283504c41e1b15eeff85426ff599965294fc631edc39c6e00fe50ca1ada0ee59cf6bb83948cc3bbd551ff789d94940dfa443537c8b0767609077ae78f0302ccc085e8a8001c7a21c3e5f1f1d057fb71cf665ca60d50c18e70f5ee1afbf1014030ce68de42165d8e7dcfdf2b6dd859cb860d767a5f5dc771a0adcdd3ab5ba15b43a82b0a04c4803e16bb45bbc68d93dc0cdc7c676cc8f0862d3de6454e98fd79c59ec4656da94d622479cbb3e300ac5cd51db4252a32856003", "00535200006a5251", 1, -389989653, 1537743641, "063c95de06a23528defc46c86729cd90b595acff0d066b461290b577f28abac9"], - ["030000807082c40304e7392ef184720aeebf7222e20f9bbfc801116b7311829dc86c74c0ba69be8c020200000002520044c45164202c10e26cca465281d70bf2db168806b598deff0df24d4d7e3b513f7fe51b4a010000000952006300635152ac65d98763822e1644d5c1752be042880f5b9edb12fd19a91c72052bacc798655fe45130644f03000000006f3df6e7399ff23adb256287d6ff323ca5d56e6071149f7035b2af1cf80be2485705695503000000076552ac65536351d0fa0f090156b9b0050000000007ac636365536a517daa05cc35ad900300", "53650000ac6a", 1, 1741047596, 1537743641, "04ce4a21777e642dce454aa5d5a9486e0b7008c7b20797a325c4fc0cef756ec1"], - ["030000807082c40304996ac3f81fe0d7cd6fb80b3a55418036a1a05a28289c376908dfc9c2de5782fd0100000008536563006563ac51485099bfb8f816ae6feb48052cc27c698e696a9d53ae1fa1e7c4565bfa7912f5454fc73e0000000005510065ac65ffffffff5af4cd930a87a02d6434dd88160cb66af0ca857a7c56c8d572db2893d167e3fa01000000026a653dbb5bfec53e120618bc3c24fc4aea63066b93f2bb4f5ea5ad5c2413c56503c2d7de95d500000000075100636a5252ac17a8e74103acce65020000000004ac636aac7a05a0000000000007ac636365526aac6220ea020000000005ac53635363e475b3f5f730db59010000000000000000a83c3a0300000000536522377a00d833fdebfac17d0c82f9d1cb84bf2c1dd807bf3e0639422b0bea27e46e93a4c11a070579488c8381433dffa7b683b48d619c454295c9940c5b578c6480ad296ff8f4d017cec3335896cd0d67b2a60a4eb767a49c41ca3dd900710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000095947dac073d25c9fb4757ca4fe4c140a88cfee1ef9e27cb3d65fb2b3ac45c1febed471c8faefd94c475110ea7f67b9c6ac15f52c410d12d47fa8721bba85828d1a6c3ed95e78a9ef99068d18a4d4e1052cc7f7e679c1cde93534cc6c473cfcef8fa46b1d785330d37077168bb25440ed63da66a2fcde4fcd7b837f1a3108c7d0301a7e6d58969dbf86c05664ecf5a0073ddc1d2125fcbbe78c0d0bdc1529fb7780206e7d52b798a9e580ef04348bc3742c717410d945f662db2e15930ce376c5c850a02f7b02162ed3a13f1b8ecdb10f302f48af7cf5ec1b9d8cbe767ce5a4e915d0d47fa03c4585725dc5647e78a1af5e52b1f4a5e3533798cb34a6af1501b61d9f6032905c3b8548ee0c059ef180e1615b9cd5b6af0e66ee0a0325c034e86647a01a4020df128a50ce1df5555267340a0fb2291db7ecedd6f7cfb8461116b1c682d92c50310d894d4e5ae867fed2d58561759726a934136f865759da67bfad09c2b119b61021fe509a80712d4139453271d3ec93dcddb48e2f5d185d9042478e4584a28572a031272a37990f2e5cfe3fd80e9076b734c2d2ab785faeed4cb2dd01e7f88896efa6afac591f51a2d4de7cf43f94161ccf958dd028f1b23924c9548432867ca6d7cdd025092b437e548bd7d09c8b92347e95f668182f94e3d02e71b5dd73a60f31d032f682fc6fc384dc55efc206067bd2cff8b99c5acdb4033cfeae3f2893479ce2ea913959e182b966508ae440dce4c1d211f4cb94fd484f5b57bbf05372ccf32e218ad86b5cc3a408bef0fff2f3cec8ac200879a05f2f018cabe324b8d18f8dc3c69138c5bbcc6986eafbf0e965638d4f516d3ef5ac557cba906ad6f5363af2aeb2c20f830aa72ae7c3839d51c98a9251a5286929bd314b73cb7f07b610a80bed00fedec87c56e4dfc9d38d7fef2b7e32cbdc8f2a73ea070825ad3df06b264c91e4b90a3f7e07604df90d3e2ac31b40d15ac5470f020b2ad97d73f3b863a79f87e1165634ab54c5b9ed624f36fed91e199f71030be8b157ff6fe045ee7f9e8232c0a19a01c6ae9d8f06c79df2e95b7b64805c49015faec833a794296c1272747217964a2baccf2c2461ad7bc355335d16a18b17413e60625ab73926e6d91c0b0c594f5d9571b64236324bd9c47d96c23e4d3771bc3ba3a22570d391c36b45fa3073d179643ed831f7359458beacbe6338c67d92af5ba04a18b6c00c8ccbe14a471b9855e6f6f64cc9e904ae6193f9c420fc3e458cd9ab9a355c920e104408151a115fecd84dbfa45401b1563bd21eb764949ddb01d2361be6ff560b79cb99994a859c237fb9a0a757f6033bd9f3f09074b8a1de0f17fffc6745d4370a32d647aa13fb101985b0ac1684a029029d4ad4c99c55f2f26ebc3090f3797abe7530516201e30e1f3e86b30775e134ad6b77560ec50a4dc440edbe692e2b277c0dd703b752185fc55772232cbb4ef882153ae38ba81bd232820470a90532727f82c421168a067719d5889ed2c9fd89c11d4a3b5f7250a65ed4aaea8da2243bef3f1841171b08ef649ef8c6c1bb2c3fc740513f4c66866cca0fd79820d50090eb316acd7053c2f01aedfbd5ea218e5c518fd41ed5ef9ce8483571e3bffc91da246cc2f5cdd1beaa0f3deb4c602d11b4f1c2d112c25b00618840a46ef87eb4a6a8629b858ade24462d2bdf4fbc9878245eae07f7fe6b1f039a945a077709e379728e26cf64d8bbee65496dc7923ed8eba3e2ce599d1f4f12beb6dbec9e62be4b79c96bfa5dbd76e94b7a1b7a3fa98107c193ba073739d0a69b66b0159df13f39da65274a44d7f03a6cfeec81e2943ce2be237e58ba6968932e0689ac2a745445874aa65403199ff46b2369c31cce91780f61d81631174127ca6db1691fbb52ef29ae3618c10453bef2e9367775c3823bb2d47947ba1af2c6281cc1c5470392bb07d04c5466d5119479a69adc44fff1d1eb4664d460094a80dea6361dd3e639dc4177704334f6f6a6af633b3264c3cbad966d68633d8e0114e225d23100d88d0c138aa4bf6c7a1507f98d0da12c8c49f3dd83a2db5de842c7561c9d3da54be21e323c3b433c8ff2f62101b98072df10c397c645e8df8fae4bd9f288f9aa01d9fcb4aa166b98f9988b2f292370ce49e3d27db576dc57d5c78639e6e27ef8dbe79c4f062a4938a0e38b7150c0c65bfc0bb09b75a0322025aa7e9d44aa0b1e91bc7c6b08902d8d161fef3260688b00ec5cae58a4c958571d1208c8417bc4122f068848a1d9f14e18213de4807899dd78e6826a0007e1097e917762812abfeaf5e51e011cb04b8b244a3c555260aa3a04fe85811e37f5b8f9862561d91b9aef17dbb7ec35c32db83b4e1d83b0502223c8e1b3cd49f43ecf5b44b7e4018cecc87fe0e20957ab6858c6caaa12b92859219e72595f9a34960ce06", "6a52535252", 3, -1784537446, 1537743641, "1a016bc2e3a5d80cb80722311918673435750bfa839d956ee780eadac5f05e19"], - ["861b877303290a0ccc050e7203f0eba6b0f2ae4a93dfe4d9df0a1dba5fac8110822eb3c77402000000066a6553006aacffffffffebcf1e120bd8a6824a0de0c19107084c3c7ba846aff48a163e8e92c03d30a63f000000000852515300516a5351ffffffff620ac24448a063bcb077daa967be24b2bffc0eee4b3772d5808bb2c9c8a7ca3a0100000005ac53655165ffffffff0496676e010000000008636a516a525352ac61095d000000000003526a6a9efaec0400000000085265636aac005165c6ab7e04000000000151a0fa7186015e8600020000000000000000000000005421794794ad4e5d4be279b9513b5b9fccf42234978d0e30dc79d4fec128283fd8e90035edc1dec3790c70cc6d61adaedd8e9b9c5b30691e40e65ac1fd37972064182e306b47d0bdc51fe6ef68c4e860dd1f311faadc8c4ded60092161b60aa600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000118023b7e7b7421699bd400d15abd493dc4e7620db7d1e537809de7ef4df826efc889c0c664d516be892b1b548a56526000459db84eb2ab6f7ede3fdd3dae3a72b0548ea9a2fd95583fe5a81a22c1d67212db9002f3f523004c9ea085048ec1f2c05a244d485821334f4f1c0aefaf92bbde8d141db7a07b78c3b9bdc5949856303118b16c846963aa3ebb00b44c1ecde54475174de74b62cbe3dce2c0390ad0b18031c36235e2594967c659fe0b4a5cc446f967752a45baa9f9a79b575838a38b1e10b03c181c0fadc56387a0abe8b0f16ae0bd5c9ae4312f072c85adc0485b023c1624a2b6dacf514e0d374fce3bd71a67919b1dbcc0c6aa3c28315c65f643be8f705022443763242db03b7d37ffc051cc7a92ca47446ef1e67d24933fcc46f8ca29055032857b309f3c5456b7e32314311c3aa35ba3079dd962c4b0cf22775b814d417d80217003d51cb1453981b778c18fdd68fd8050292985307767e99a3e52b3d745fd5032968c1364b71e34ef381ce5e5a124212dc67d34c6a0d0f80fd9600678f29d46203198d3982f47f36b9590b3d2810dcea18814b34dd90d82aca85c407ba24717840bb6c4e83bacc81b8e452055ca493be84fa3e5d6dd9cb5d1fb192c7439af7c5f05ba021fe9715a2218d325f2337ff51caadc1e9f608e6f95f3bccaa87422ac35229e60c204472289df0cb135f57f9f00a16ff62ad471bfdfbc1be839cccefe04fd0f252d9e29042e1d24a27a312762ab05baf146deca9fb28f1e22c7df1ffc21aca885b2d209091df3c89b46a4f8241d6f13c35a70db437438c5cf49c59807ab2ede92accd3611dfceacc2c9435e79799b103d32b55261f27ac6adbf5998d6827fe5a29455781cbabceab9f012febbcb533552d716e6a33a5b8b4a84850ea7eacf267c543794e152e91f6a4b08755d72cb044880673ff02fcd81b2b8eba96e2c1c14723709918af56c8f09d39c47c512292436316d4b4802d31e125388d352b0554467f1270e893179ba55aa9772eb5e2734ff9aceac905b9224ace2762c85c581daff02b7c43b709e68cdf6a787f87a757d7dd2f38f80f94c496a0ba39df2a52ae3f7321238bea6a1ea406831c8a546a965def25354b1fcdefc521308df5780a25323e1878a2875b2a57be059b66b75322a6692eedc5de800b113ac6759b38a93688a323b0acbd1e1cdb4164c7c2ffe552d5972a956c98ae50916c66f84974120ba7fd4eddc5b642790ef588e0224149a2d39351756363125fb3bb509dd0c6552e393c1242e0bf398eceef64f22140c99f14dcdbfe12a3ea045762074ce748a5c08f3c854148e6cb05330e0a3286612bb7c73ea6c1f64f63cc9db2a1f3a0b569dbc140b65cf629ba91326717c895705019a6ab8444a62924de996166b46181f27b43db48cee75280074dcc7d6d7ad95378c22c11567118d94e70cf436a75586a7aeda82311703b71c1ed9af705a0c846b88af51e0371e2b6d1b53854626faaf7e3d7d3153ff6d043e0d8bb76489920979b9c754deb13bf2c5ca207bf104404e5a3ed054f30401412b5f1322fdecd9d51404e3c7b4fd782514ca524e46ef36aa7c17923487bcf8e651da096d525039f5534b7682b628f603062dbc839ed252fd39e3e670b9ac194a30146b90c5ade6da1d64d12bb423744bff4f0f9303bfc3189230698bb0859a83eb4225f1346261d124d238900a78e5d3216de551a85ece17ad0d1bca6108c96582c95301a469e99c8cd96942edcc4d084eece01066c2f259a35d31bc1bcbe70e916e833dbb44e6b01b1e5c00eb1cb62aba0cf4a8e5588025d8adbf2d101fd611adc9f368672d68284db1731c4c125eaceadf9c42043137207a7c494cca25c2d118883f36b5f96610dc3564e782a595b2ccf478fab016395b40dd52ae22f596f26119b69e033f363c308fa4e213b3dd19a520125331529b67064105c821023ac5fde713711a160d17106e34407858b15ba44670b93c57f6401bea5fe4e9a2d088874ea5bd64dfee97ccb09c76b2e29f9aa2b566f30c83231a08692b4f9c1c6b82bdb0e8cff249bdfb69eb35e2ce9e9b071d623d1cf5ec6ba20c37d7b7e997445e159a5fe875a79ea76b320a6ad635458be866b3b111c187c934556ad2950efeb294c37c93dd6878493c704411623dea8be6f4e0bbbc40f9f7dfa91b123fa395e16571b4b17974cd8f0282741c8334e1d6a839dc13d3b1ce7850d525cc87756932c59b6561e01f4d0879304b21ecd6a7f350caf87b45dee108240bb111dcc6078048d32b4a544c4734ddd99baaca27f8397eb06b100a96ff8ebf5f4340c4cbbaa03eb1e3012e381916cea98522552368d38e88ac85b98aacf886e06d24af046b7c93453123e67a9f90a738c9a941d450a3cfa5c83745967e6ba8d9f57377c740444b6aad0fbd44cf5f7a408", "", 2, -1888566932, 1537743641, "c052fc8c82b444a46e5c9c25f69e65f4b7362675050ba78341f106349cc4756b"], - ["99ace95303d718bc000780eee08892d081308d3c32bd3944dd76c5608e4bc9bccb2879058d0000000008ac51650053536552058500344bb283b6312e827b6b591b966cd78b04093e20e812f278d31f9f24793faf07c70200000001acc1a9e2abd9855c20ee40773c59fd18473377cce78c0292ec5d2bbb702e6b73a28a19f01e000000000451535265ffffffff035fd833010000000006ac00636500acb7715902000000000265515f41060200000000026a63c266041b014f47c00400000000000000000000000016ed52f758329f8542cba72aafed276f7b86f6607d230d92ad125f22c9952b06c5ebf4cdf2875876b51086e8a5490bd25747dc001ad698372f68fe98587f75928007df27291a700109c480c48c003ebd7e81c7b557354853e86d32124c619e38000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d0f425acf849219c4bcc7e51362670bcdf9030c0ef7e1e6db85753c5061e7adf131866a6317b85e47fc5297dfeb33f77ae4387cd78c02431e8fa3e7972d35ee3c84735a3382759730a14c169852c5293ebee82cf20ab6c3578eef2d04bf638a9f3ddc4e3cbaf5e6e4f4edc9952f40ead4ffa897dc62051e0b381fd3c8670bd20322c7c38d825e11068864d7e46382d9c5344c72db3aeb0bc5af5aaefbff86787d0203d7b4b7e2408a816ad6dadc6a55a3ce5e1467c7e15c6931e6af6f5842a906050a06f5c610dca5c0c2bc5b56b9b9468202b719fc38b0f9d9a45edbf67aeface9916274dee13aad604fd7e46ef0d1be832a2313d377fd3dcde218b8a3b83c48d1c0030330c42c2f317584619a09fa7bd7c9fb7c0d7da2004f658d57f3002b8721a18b0309201275a15b4cec4e4806924b4483a74e1c6b48e59c3056ba69f90f1ca6b455030f4c62d05b62d850cf7c37bafc841e1b0bfad381cf5af859c064934967f36f8a020554bec9fb8f411d02370a60b8d07ffb7fc6207901e258a6446741a387f8cefb0304ca8e634c0470986f0553fe354d2175e87e64ede2fb42c84a670afa592059f26346d0b7854e757cc468fb37d7628c27cde6b97b2ce6e90c206182ea8eb1eb7d7a979128b658092f518e6716e2b35ebfcca06838bfce823cca7cd00720b6c2c50a0b0ab8ba78c7eb22383b341829be7fceb8770ddbdb940453571cb2f28c17be12bbe3a172a37bd324dace534e378e85a5c21421b9fd3def9864b5a6f7cd8a93ab47aa5d7af14e80b35a97e684f73ce54db7edb0443157d026366a95d6219e18d1082e56da19f7238849cb56ac6742cd68cef38810c118ac8d6deb34efe289443675bac6c1878f73609d573d863ed6b9f1b85f65da7237e3cf524bfb26bca9632cb74b874c2a10f9756f7342aa5cf40a07a518732b1bc2e375dae62f5809dd4da7ec8314ca34c65bd67dd5a5f19b8482380627323f74aed78d3188abd4978d234992ec3fcac17585776f9ef5898638c8e7be2f77fa120a402385ada610053cbc6b8bd00610ea0acb7cc201a904b07f9428d363aca01d17e020d751759c98b4e6867f6ea26df784b44be7f4867f86237dbc0c5316ba701c13b7f5b51cd7a4e311345dff2e760aa74778808018814411441c3bb4b297af0c47ba777d8326de5758de5c99c493892ed4039dfc41ab13244ca7ca84be5c13143e1179f50ffa0fe5158de4cf7730f4c06a814447777b1c4f943b2b46954e9ab58b2438f29be8d004684a8d991137823d2d8932ea131d5b3087b721a0f3245fd6c723f01c350263fda950a1e2f2f8e4116bc967bba9c1aebf4c3b1772ae98169c551b1c9432248a066fbf472c809f875dff72451f0e34564a9a27c11ae6fbfc1ebf3f7fa8619642067e82963382e42d158453a4f647bcf16a208891dee02786775d040daf1f03a54580b73c99683d37b15102bf099ee709b0271ce0232dbff15c9e260ccef772a3366d264fe0056e0331b78cef1fcde3d5a6e5216d877bed4a24ba28bd8e8769956911a23352300b837520df1db6524655235ae3b2ef7775e1496f4af08bf4bdfc87d5c8a9074c93c695e5012e80b74d3852a059932fdca7a9da04b7f1b5f5b13108057e11addd5e7c4f48f60e8bba67681db8b4e9e8aed426c33f225a1d2c9f2aa3ae8af8ac5d403e56386d1d8f557b7587e8161bacf5e281986a16fc75922be8db0518a12a43516b2a5c274d1eae894deff853406b7e86f48d1ec1298d7e0be6305419ec2be8cb271fb6f6e66b3c99b5e84727bec754359f24acfad73599ef00f6a4be8f50952aeb364cf0df091a2d17b1732127b2bf02169356e684d5690aa9824818c9fe96d5eefbcc10f7e96515f43f045a9f7a61f770449e36e9ff3d32117d9c2ded4d765902cae8f3cd50abe43b5906d9873f159f7ae1d565b7d776c4b0ce919211761d43479be292be58a17c1a38dca3120a639a6833a98c1dd5b7143ea5252969fc9077945e1d20ad73a214efb05cf1157b5eb46dce75563964985784e87b718625272a1df63d488c84cfcb91b0d77a4aa6a59beaaf89e3cc2a8df274679d1d33fdedda498f8c4b1523259b5f5ac433147a8a0f4199e18badb017751537570cfa4d65d31eeaae43f0a356e859cfb8cbda4a320a03b6ef89b5058e5d5f804393280dc477006e9af47aaf276d1044da28f47986c960d63312b7141edb2ad22110dc02bba81517bae518b3e39d387efda4a7d9ff81d9ce02950d598c486c3a18625c0137ced1dff9530cef7a1b88ce93f2e908e17d027d22f17bb1766e9187819cc03c45be15a3fdf5e6abc08de3dd691d2976d97b9d6d99ccff87237f43c8a8e480571596951721ad1b36ff299bfb2cbeed9f45f6f24d40e142d8374b8c8a1c9211679ec9a17c7375e5b64e6af554feef0e", "ac53", 2, 2048922539, 1537743641, "04c0bc2dea8971be87eb051c999233f46feb9f55fb1a1e1647c65305a0ec99e0"], - ["030000807082c4030371b2a613b19dbe8d4e5b4f55d306b77a572033801cfad3b92723dbcd1659328301000000016512b97b9708c7289951ab83514591a4558b082f0d766d0839a6a83239bce4062a3673e7d10200000000c70f3910b8a0b70676c005a7fba0995c45acb3102be60515ddb97ed1bff115b1ff7d9a96030000000752515165515352ffffffff03cfb05301000000000963ac656a51ac656a5330a1650400000000086a00ac6aac6a5252708f270100000000026a007f10740a0000000000", "ac6a5151", 2, -2009777839, 1537743641, "ce311056fab2e8222b9f641a6ffc2809197cf83811b773e86cf2987deab92b52"], - ["030000807082c40302d55c48cdba8d65380a13e59fa17b2878e06601be340b2ecb18a3b544da28d2760300000002ac00ffffffff7db561ae844e5b619163192a2bbee546c640e93b119e4d82b9bc460a80032d440100000008536aacac656aac51ffffffff02f466e10500000000055363656a51e6759d040000000006516563526a51405d45ccb58d5e5102b536a60100000000000000000000000071c0d38541772766cc273e69d44decc3fff8c1fa05eebca2c93dfad17b6214691686d26f62fda8a0daa219aac8e093608ce0f0339bbf07b4efe187dfa5a954eff286c877c122582a6ad448b737dca3ad13ca29afd2c804fed96840921abd101e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005a5c560d78da29830e36b9693277996801a300bbbf3f9914d82e4c6f15088df20b8fe776437b3fe3a9e12a7f2fd7778e2a80e52d0f09ac9344d43852e8553efe63cf4eeab343cdeedf03c0819822b3f4159cc47f549671fffa224924e8f011f99a38f1f2cab0aebd404941695a4f681a3142f6f714c9fa9daf4b67158792d9b50224e421fa1e11a238c6750dbadc3eb98b846640103e66d1aa63f85a01b5487ddc03053b89050c16fa993d9340dcdd6eab17085b3c89b268957b98152f306d91ad780a023d2b5b9aeb5ee80ac462e879860a19d3eb5c1b2790e8f26d2763b6744d0228ee03855717f5517276f630adc61c9283c9a3dfa9adf9cba1caa99819706981f3021c71c01673b46a2e3eff543717cccae118488c3272ee0363114820c54fa0bd51022eb575e56173af42031c50eeb7785b70a978321553564828550f154626ba75a1032433510c9147a7750a281e36bd5c3a0d7a1b800d994b61e0e5694e0acfdc2b440206a37276065268bab9c5606b3e97b823dd5e70e44d063efff9b75576fd98cbcb0212a032d6252da7ddab8840042d181729f891b06500b0069d79a4e0f1332f1974565031ebd93fc94a296c1eddd3a7aacf4b865b15e84bfb3e0bacd91e5cda7381e6d6b1a3efa6740406bf7578d4e1e68feaa17752a110bd4806e6b76a214bc49109b2a5e1d8373e2817f3a7d932f50ea2ed4388cb83eee1b357b5effb89ee5a365525433b2709458ba9bbb64c724c9ab383929f1ae012f3123a3775fbe377491312397fbfe7faaa8305ae99410c14bed150687a30e2dbdd199058164f237b94291109baaa4d3e25e1728fbfe2820bdfcbdd720924c035eebc39c0d0ac1a233bb3d8d4f94694232411c8669c540e07957002ab8e0b6b3874363d6a501f5b781a997e30429866a506e4e34362d85bd16ba67690149128d1f38a2ea36560d175b07e4c58e2ef03bde5f11f1a1b15a49367a266963a6615b0f24f25d9bc41504f978edbd42ef1b2c5bb5a6f348339e6793b0c5790db05dd2c3710de99ce4c7c1963c5aa2cf01b465877ddd5a23bb1d1a3e0deb5bc8f0b872d2375a4809c13224423dd63d945cd8a3cc3e6aec845bfc1b3a69181b659554d537b04f8411305e1129085ef81425ecfa42ae0fb7f7a06199881fd0f015942b068c096f64a736a5501d9295191f3b4f005e69ab279b3e43f293d9dedcead757f4ef8bc998c13786e8671ee1fdc72ec2f0d3b5c4d87772b96f4e65c7e2c1f20bb72db558083b6b91d0a32633549c284a393d4c1bf503a75d77386658ef2dfa31e43325dfd5620b6db1a9c0172e21764eb634c99b33417c47014f8f8d735efd6a223d1fcb39719ffa2bcef218bb07a5698b7338b8cf0a794ab9d67fee8ab626bc2a196f24c41895da0d1cdb81f7a5d8e493c93ef3e66cec42c315e9507439857cd1370f83d0a5be3e551fd98483e099061cc37b68aae6edb9638c8e8184d102ad2244a9ad1b20c145fb822c2ed768a0229d7f38000fd0a4411a7b457d9f8b211c55fb29b38dc06cdebdf87526194a06ba873fb6a1cd77bedecd8be9aab03ca25cb7608037e7946e5672bc78441e838ac295f2bb57030e31bda9d8824f3768fabe38a34771a5169e47a8d05f794c46d559121d7eec54359e5c2359ee5416d92af1d64600d670b9c19ce84bdc88236f5cfdb4cadbce478593f7f49b94ee1ea66358c9466bb2ed7dfe83dc05cfb606e80ad8e5e90c07255ec78f5bf7b59ce6be40313d82d5103d26327e272f4e52841ee52a09a217faaea3d10e5564e3df9f5ebe8725105e326328a7b7323784d6b05849bd7261978dcebd08b4ed3e9490f654ba1bb26cb443df1af8e5ca21d38315c28842284123c87c672cdee04af99096878b2db7f6d9d70b9bc99252bf59d0f216d21a976557847bee6bedcdba4152c35ac5ac60c05b1b6fb74237eb494ae2b72253feb63296927d8420cbd0ef5c0247eecbcf72b06e851aabdaf59b3b9dff8e3170d8540d33717855e478a889800c9e4ccf66b57e18a1afb9e24a90db86871e7be49f1821a16a2ce3ab5718350a92681836a63de43c5da5777a32be6d3ce24b8ac07baf0d83d497e0ab4855848880be7f4a0ccc382008870223cd206ac964193bd4dfebcedc9584c67bb9ab7f70e52a99629a9226f6005f71b7f753ee827ac0eefd47d3cc90aa9c4dd64a70f7e4d5106e1b15c5bffa991c85f6fe054490860416ba7a8f9e8d309b6956b0c24406c65e5625ab1d0ba8f3df0e74cdce38e8aeca2ec0be73a01a3f70fedbba4bdc5672dc500000000000000008d3b42020000000047078d93ffb9ab5a74b59e08f9a9c221c88a581445adebd4185e4aa003291df33ffa650cddcc3d9c31e83e7358f7fcb32fa0104feaf4f29caeaedbcdc989a2de705af78597e4e5946ab581ba66548b40645906347848cc71b816af24ac6326250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000067f008dee2ca35da54206b83454c270252fcdac728181cbadb7811f18bafa075530399c50ae4f2857abcb99277c45504ae74fc16fdef393aecd2d9eaa9c95839c38ad8ecfd80ba5118c11ee703e0470fa56a8d090ce7eed283817f70b885518f1f8116a1cedd0ae47f40e8508957a92f5b042a6b066c7c10c7d5155d9b6a7a2a031fa5828f1c91bd2ee74d87b6e88ef4160d1f9c99b7d80a676f0d8ab7943f898e021c24a291e70ee71d9dda6cd546fb5bf94bb2e1d4886c5cb46e0a4cd87d4388680a043864a2aa815ac54d2d3c1b6d87ebf3a968ee5a7f9ad12cfceeedc17fb1e4836b26701d596eabcdbe10f73901cbfb7aa4d1790a7b5a1d68c0d4cb1688645cbf030fdcbcb253dfacc5885083d35de2bce835e2db4feef62108b25204cf1ca6bd8e0220792de4c76fe15266f888af1e7ca2633b52187cca0e218617ce5b2214eba818032585a348f3c655ba4525e47fc0f41c7d4f67abf4d8b9dd2865ae35f3160a780c02121559ff98f0d383748c4ddc1439163c285e912cb59489271dc5bb05d8b424ea0318b825b9113dff0a56d1325d4178d6a3e5e367281b12630fd43d8f99c28629ba4a9380b737a281dba7a6a8e6c18d64761137303e1e382202fc529948e8e5adaf80592c32cf8cea2099591461c51544b090c97af62bc041ebb3a1873c18104b4a608c665d117aea7491282e46c8deb6fd27bbee91e5063b40868df461d0c9a9d460c0d0cadc92f74a4a520ee1ae2202494bfa2f3b393cf632428a1b60de087b27b00982deabfff1052319b19384431a4ccd7fd83105eef740445988462811f960d21edb3ede231931884014d6385abcd117f4ede0a17a1eb18beb15a12dc9763a7a77ee4f8e651bada5867d850361ce0555c8d39b2d1f9b6a526197f1812a7a6d49934b702f226676ba6c4033df15b86651622ec8499df2906760f5b61219722bb3119db957cc36665ef96c4ba853732e4d15762ffa1ebd400a4517ae5438e7067a89b795b8359358ef52e5954dd8996b6b64fa65380ebc06d1ceb2475ad54926cafe25f6bf5ba7438df89e674fcbfd4aa4ed7b600cae8d2194c80d9fe1482dd39c6a5371fa24f034922cac4da72597a889fedf8dc0a8d30dcd8545ab8391a11b77f5a35b7c68b6838fc52ea168984e64f4bf0321db5dfa8a31ab671c8ef04ad7b934b068c70cba0d950eca5bf53ff491f1745b58e31af1ea2b3f26464f76fe260decda22e7ac0c7ee6cd7be87267293c6482bf09ba84039519c6c9fb87481929206ce03dd22c7ccfa103f4c3fa968f5604c15a4243c6dae9d19a9afbc1945397b5910e398d1d938cfffaf4d7a246fd55b35880f5655f70e687b1f805776131dbceac3dd3b83a7d898e1c6b79be0859afb2f42624faeaedc029915a8df371f4475ffb327aa670cc9b51042a644a09029a569b96fa125eed32c3a808ee844616c2b80f5b05d91519e047a40c59a64b7eb7eee05983958bdd5add6b4b0b42e4766105939f73abcf88bf8b3cd17eb99b6f2389e7f1030b35a970aa3021d667910416c95395660c424515f2184f7b502a501ec4d4bc3b15053f0201ca01ce62c0615b198d4fee712016e9a6d1b1edb8dc368b6c95236330d7f474a340eb283b99e45e999409f2aa8fc51e6756117a091917d5333445d01b4bcb8ca58b346beec158922c2754f4d62df25db23f69ed40b9e852b8cabd10850260e1c8a73eef50652f61e707b097bdf162cb006b1701dd42e3082c8efd662473e31a91a30146e30a6f8d5c5e2fd05a91c31c6f0c7c607ee02152e9552e061f7bf8ff39664e1384a67e6ee71684f1bf81df4d455f983146d6509b6b9c736a4c7f4382b14c900bb7ff9991cc6be99a035423fb2dbc640e75c20e5715fe4511edb800da71e3bd99c1622e389458701534d7c3579dde632e4d42a1b9b31838d2f7b57417597d4f46c4b11b12e15c429031e332100c5f0b4a5183f6e08fd7e237854c32eeaf640785ed26ead8c54e36bb07a46066b4713ce9781ce1abc888aa7b253bd8b89297c5f0e66b48f24a701e56b0192600b8ccd1623cbb3a1440d9cbf87fe3574c94f07212ad31cdf2144c79deaacde6afff828feb4f43e83a57ee1b6068bb904e0c124a08e3393e41497c50ae1007b9176f9072e3a822d15cb52bc1cf9661338829a150f0358b373c65dc1d4196e68fb628416020d874b027089f303900648b39ef6d4844fce7730f302cac3abd2332405e7c554c3f09c9d2499ea7e64b168dd8a692b276210d31c52336ea66b9805514de92fe578ddd09823f06b802a0addea7f7bb82c9758cf9029e4ad14d36c6b159e7d601fbef997135058170a5cfaa4ac7a37a01671b8e86cd5643efbd51c8e116811f4f40bfd84195da0f5f4555aaf8b83dba389aa9705456fab9244915025e2141cc1d0926f7f01c510a", "6a52", 1, -1806089140, 0, "36f8bdf65094815172977ddbd85c765f54f741e4faee04f303b6ce1db51ec8ef"], - ["030000807082c40301264a153663c9b25c6d9188961bb4215eecd4abe6340fc1e85569f97d1026454a0300000001ac9ff4396701815fab02000000000752526a6551ac6a1e6e7ad6f5f855e1026b5d8502000000000000000000000000d548e5bd42aa6773ce95e0c5c8e753d46826c59708cc81748260debcbead12fe26493a48d458e6baccd6822652c44475db5a6d065acf1e04538f6900cef42258ad1e588461e405cbefd20eb2c87ad9a11858ea4f3262ad4cd8df661b9f5063f5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f3d7b353c02e638addebc5a379f0e69dfd025bd9ace3523d9b86ba253c4075dba83b7915dd9cdde457c51f936994ae18f3aef980188ab30cdf079bebc820c2181e08c44f697cc6e14822a2df441f479f3efbf2e5b238bd639638ec68c014a0aea255c06cf7a1f11bcd4e2cc59749f2ba5f2ccaf59338f9500316e4075b11c64032cc2645d3bcfab9c24f5bed1e0e57613ab97ad83fbea0a6fbc026704eb7ee55b0223f7d2ca52f956b83242ac7b1611657127fc07ccd3dd7b6e739780745eff99cf0b028be6c72d2ce1c55a0a26d4dc9b9133ea12d470df8cf2877e55fae3d307721df7a2feccd64a9e3e968e75d86474fe2c5c76bde5dbfeb3c6378f6966273aaab3021e14e9e2fe6e73a4a65e3acf7539139fd62f2ed1b5681eb22bf38835dbd73aa0032825300148242dd2d77ff096d92dc30d6c573aa05fd6bb0e097ed0b44789851f0315c3f2eab1046c335994ed3b2546d456ab3332990252c8bfacf1c58adc694eea0321a9e53cc107f9bfa64a22fc92eaf4364276f52de2dbccbfc849c243230a3966021d87b6163dc64050d38fb6187d6bed5bb8780e77f5664f46da4f8f0631e9313fb12c0c91cb951bccf1935ace7ad2e078e127aefe9507aeaec5773af999fd5c65efb478ac0d6999fc616c4b6ef07014d5e54553cd82613921ee12ae5a4721121be0ee0a61719a9e51d529f9484766ef6f2f041ef179662199bb0813272a83cf6af623136f5d9ac4faae9141fe9640b8be526c3a6df9a443cdbdbec38908280e83d52dce076ad7de2a45687bcb6da95bdde9b5be3db59c6e675dfac0fc50d2758a370b667ede40fb0872abe3bf31ad0dfc95e347f9ca02d61fd966d0232f277878f834671d7e4c854c63093a8aeece7615f17383c18759cd079c96136e7a923df6c475e2d5757ebfac1559d78e386e0ba87a6bfa5cff43738c458c4fc40adb474c64d3fef215e4ac26d50535e217eba4daca8cf5487492eabc4a048fa1d1a0c05b3f1ddfa871a9211486259c861c098d0c27b1d4e261057f49850dc4ade637b8a6bd180eac1f069b4a9fca321ee6e9a6a2d571f03d41b04f341b02f7335a1a69ed4557d61d4ead243c125b879b4cacb3939d86eb31758c9f96eb9274282dc9767b26de816abe51adf701eacbf094a2d222ab8ea7197534b41e932b25498343cc1b36b46e9143a59a00af545af7cd093ecee58859a1232c496acb6955c0e3420a9255e4844908798d0fc3ace7b9645b0e4f9ea89d4c7bd8b996a88b14b49b34d39a6e21b44fe547b603d5d5475872f62c0ada79868ed25833a0706a7846ed451b4f0de69285e4b913c65baafc8be9a747d0fd222104894aa5349db93853ab753045002740cc66125910fe9765542aa5ff60da709b7a6617719faa32df96d5914c317e4419b225727c1c37beb148e949437241926d1cb5c40aff9ce46f272814a9051b00dd0591011869216739a0c4dec638b354116eebeb51b56f08a32176b543e5cda6aba8ed199e4f935e2db835ba6be634fff01b6691d82d433a541ddb7e128dc1284f77869baae2993060116de6161fb42d957805796902722df947e3ad2d1cc593033fb8b53a48990a9fb0992b1bffbafc5a5e80fa474e52ac19c7164a0455488c83dc8359b1038d3eb7c447645cc0556e75698619ee649c8541da9d95c0c0b336c9f09e4f9432e75260f02bc745deeb9bf57a71c0a197ff6a1ff3439cf0b6bc9c11db8bf6374e09e3961db3f6109a72e267ec3b56ec5676efc6a3c783534efe05d33d1213ac9035afcb603731a96ee958598720d9f16d9fae6548e239758461671c5dfd385121b1af0f5da4db8f65075128d109fdfbb500382ac49de8a4368a0c73b261f9454877d875348f781a1d0010df2898e3d6957da259e9ec1308e9023caab1ec544b34505f2753561e9fd0f9c9e34df195419ab935f47223dd751dfcc9c8b1baa4be0a2f3402aa545f3baea037ce27c8d21b8112f4328849189a6dedf83ecd6777697b2bef923c9d6464a4169ccb8e3368bf4ec7e148d64d4d1e2898b63895990e187702cad67ebfc068ad7d22fa2b3be84f460a0d07e2a89993f619a96781cb9ddb8861a41f43d039c3fec29915cdf133c785cf559df7188e14836fba5cd64711dcd19a8c896ef1eb301c0be5e31954385ef71612cc4cb30c6db4aaeec09a5da9cf1cdbcf38787cc0028172ad8710bfa6140492b004babec3cfbc41018a3a9e7bc809a8019a1528670be14e23539203206c4cad44e83e5f6fc9f93eaf16dd0b8542ff53a50462e6023e177da399bac4040000000000000000000000007456f43fbef09e3d0414282af45ae4e78cde98bbbe356e94a288659737c134b9c5ea0817beb7091a9b55fe8c7caa44941773b168710757823efae634626525158f9f7b5423e753ab47a37be6767289a0a4c68d34a50a63b644546ae5ad003e5c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006803b5fe72c45f57aaf2f0e653489dcee4172782b452d2926026b08e40e64d39cc4b4ef0004f4fa2c7ffa4d599382e79ff742827fded961eb627494455d0d81a94e312b8e046952c1584172b9098ffc0acbd119261b1a4ed9aaad0f7b45cea0c9441732ad0ac9bd9c7793076570a7332f66d8f2d0e5fda4127698627d65aa4ad02252416390d9f3ff4a47e41dbcd9eeb82ecbfa25ad85acd34c3c0154b8e4b6dc8020b99e4d43a6a2148887ef795b311e7d56c9d647c913b2f4d9c14fdba682100890a054e10cbc1bccaf6d94f6121b3f6ad6bf73471ed42c2a0e7926ce45c98cfa015e26047170dfed965f4baaf2f0186867740471328c34d43d82bd5c61db7a2c0b4020d88377fd026a2bd0a04c8f8f86c3e08a399c86d1f58bdfa0e9cc572ff9aec37030d00466275fbda5e44127b1bae79f9b782b0a545d24a89623716ddbc8a58c86303113a202d6be0b79a4a193e4d00bc9e8413b793d7928778e62e9e332d3c56866302079b332e7e65186e3eaa678bc2536c3a2bbc4ea5ff9225a0e035f079d274f2fc030295cb27ce2e80cedac312618e29736d288ec34ea32801ad40e6109aa78bcc97a140986c3bbbc6062d2ff4f77815aebe5b4fdeed3b07cc36507194625afb3e276817f2aa12e92abd5ff5814445ef94a25aafa69d471172ed46d479064921dbe58fd0daf948ea6c4c3bb3404a22d827efc5f2923749d09d5e777b06472353b32bcd3280c5da315aef5400f90e389da2b79e39245b96d036deae5f6617cfdfd8b02cc7fe14d76a60f38bf32aa31ba3edb26d531e702685654d68b690fb94e8210dfe41da44a24bb26e8de4a546a6d8078fed7f20d30d04b73745a6f6f50847eaeedcfa17c6764231876eb3859802a20c9c10652c86aa867151b1a1c6e8f4608bf2a2e4b1f55f7d50ecd804b5dc3dd61b1fb55f0723d48f7636f6e990b476c30aa86d47b2e00beabe3926deb47c2a68d167077ba9c7b2301505e149a4ace48830be57d0f0d94067860829297434fbb467b4f331b776140da735b3dc3a4d5a7f40a27401c4d24bf3c3cc5fcb66c62ffb2cbcf29ef2de5ea91f65787de4573a79bebda6c6fad1b32a031c91413156ca57adef62b47ad89cfcfaa5ff6048a9ef4ede4e099e85c08a7e4aecea583625363b8815c2588e59528c3953e2bd1243fffd82ef11fbad3e7f2b74597d671f6b935bec72f7982e78c8a090afc0ce309caaff1af6baa7b4c504de55cc09fa7836f252be73e6d05e4e33056a543cae0c10bfde00431adbd2e2de2662de76e239f5de39fece02761888b4f8cdc4607993b94730e8acacae591b643166a6962e6020362a03b44559b4b8eb9ba7b41ddf01ef11272c2ee093956b98638ca6c015f66c2b849e2320d372920ed650f3e0c04710eb07108a1336a099c7d9dfbef5573f5f3c679a8351696fc3c096c398e1a3043d5071103de32105b538d16248e48a4a31dce286a6d4b752a8f2e37b237a70645e223178ddda8231543f51001044e859667769691cc91fd04e25f37e9be98b3dc32284334a8ca4a5197364d56920b567d254638b6257778932d72758b4ea88e84c3ec5475ba406456df878d7b05ed8ffffcbcf91706872b6d9b29092a22d8f3a80b22177e3dd1c12e06c7a05dd39d0518faafeb2346bfac44854cc40c05ae5622442688a15d5bee2dd91abea9fc198cf91588c3395b437ce252205bb7418ea39199d5967b55d564424b788bd6feecd3a6378183948601331657cbdd2e52486ff1c2302699960d2423925606a88e25f7109201e0d979c59acdb50e903cee2519f196d66dff304ac5ea05aae7f2f551a3409de6e7ea4f2861c994010f51ecd6f4a50700c1a8e4d263b174e7f0dce44e3287fc020fa329afa5f2dc9331057b290f56d74ea5568d5415a0261ded19866646de1a523ae3ca463dcc4da2e515b03e1a7555b6f7df7d30a0d4bd9057aa8734f20ad93b19334b615ee4b41fdd19aa789c0ee85b7634e768c975c8610673bf7c166681f79d683c195c5d9c5fa3202cd5a2c8d9a4eb2b51439aae25cafe54d8982f4a6f29308ec06d9e3be94115222f6e5c6fa62aaec13ecf75020c0395cc2dc2e0c0709de996cbc1f04a97fd009b4e5cd281dceb19fe556e3efe2a55a6078f021b3f246643fc2040ea2ec39fdf7169f36f131055184bfb8f435163f2d7bd7a37890eaebc055dbc17329189f22d659839bf5c5d94d63eb1c9e4cd31206703ce6c32c4a0486ae5d8bbee55ddf3364813f77ef85f2f42b3c6befea602c37f36e2818f3874033ad3f266c89798f2a3ff3eaecda23b2e7b0ebf89286f79ae2fbc062dd341a8fb0a60794aba352187e360bcbac5a4cd11c56286a473ebaaa9200e4f2aed59cd41f649bcbcf34cac835be27886a347847e5afd76d2e2e0ddeb1914c7bf34b2ff5b296efdf02", "5165", 0, 2041087164, 0, "ad4d2f932b8004ba15b204a3d4b12a1f12d686179de0699a618802d10c7845f8"], - ["948c5749016a2475e7355b7c0aa1f55e0e94590b905a8062079bc961eb8f70c564e01adff602000000026553b279852a0281386d010000000001651f96ce00000000000863ac5365ac6a51530000000000", "005165", 0, -325844976, 0, "1ea694eae1e51fb697936bee8bb182d94f8ddb235cc006c66fe1247ac17aea5b"], - ["030000807082c4030260d11b7ff59529c3d6503b4f8839a9137348e77b9421144438b5ed0f23b383a20000000008ac6aacac52510052c779b21ff6c9438c545035fcffddc3d088abf89202efa5bdada83d742f58944f48bc0f260300000005536a6a6551ffffffff041868c603000000000863525100ac51acaccc908e0000000000086563516553656552924e0b020000000002656520b0530200000000000000000000000000027546670300000000000000000000000096b2dd6bda16867d49219a48ef3809420d19be979cf25e03e8e64268a1294120feb5bc1145a310413bf11968df399ce474eb2ea96b5d1d93ddf3d180a9562d5d16a0c5beab2aad59b269b8b8efbcf466d56ad8b2c7ba1902ef9d8d1c8c40e88b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076f5a372969a2a90f17bc381b28d82d4727efc4cd16f615890882986a929421be5a35973d13c13933a88d40f0ce7e6307d68a11b6b71ab54c0b24d6d5bba48f61e7172c7d4963aa0e0b8ca0d1f258d66040744d4e5aa25ec1e9bb55ba97cd0f85c1505051c19f2291ef76d70103acc859a05542c24e794ebe9c0942ec1798bfe032b5c7c986e8e2397cc5799c8bacc1c7d42ec363a1be629be990042bb6025a23d031f9f06a7647202e7586b1985538195146ee4d837452628267cb8f005ce36664c0b04b4daf5a1c5ac7c7d565edd8cc77cdb44f08932e44d00d0ab0ca74b7b6496cc3b7f1acd4cc12c5ecf6c0567ee7fdf3705a73b33ccdcb68eacba3ab61fbc50aa0326a4293208d3138b237a5fcae3dbd8b5771fd6d85a3542a5509cf61c7c928e4b022719e30c48805219046ccad1706021f0a941324ce37b6b9a7e6a40971208e19703044dc9d3595028997aae8f9a983a8458cf81072ca7a9f5a69a403b85035cac73030dfc55504036f988b685d79002dce1464fef3c2e1602ae2b2a6c5f13fca02f88022edbf686d316b39b85f7f3e66f5b5d7e32514adca35355bd8f2deb96f8055079d5f144fa4e94748f78890b485ae50adb30a6028c10f952e8205262654034ce793cc0f2c0e5596458373db8ff095623813726db009c467f29730fdaf02954ee582426cb9a489ff0d168f33886fba4af0e117f04c124134c565ee75c773e3bd62e0316f62b86acdd5a4b27f2c96c94706dc0a846c2e3ce0aaeac71e9ffbf1e13e980fa7aa95b50c89b30692a06e175e8a046076317aa01cd78c07c817dbaa41f4f908bc070e98a00e96913cd2570231c623314a6a77b3550e21c52e4de6837adcebed80aeb5eeb999f7e4a0feb5c93702a55e763558f075dafd7f38701d4b35f90779251e6d27e96e1d9cb0412f30f10d882f5856192ad2bc9dc46a6be4d87fd41f9ea349bd06131c387b3268823f00553ee481411708c620c11b3ab1065bae3ace5a297eadc855245ba212f278b97a73f12b9cb15d429f2eb6cf23bc62ba0aed5c5792e5d212282de713795dabe59cabe86e19e3d975980239f2780acd93efd4d1f3a091a444e203658b2a05e1cf0ac9032c3f158205e39bd294a1ab36f8532a58264251a43cf57b895db600f489f34c26a37dc93f85e00a0f3ebdd7dac87b2647b53042bf443bd7bdd0376bf2937c73858715e682430f0a1bf06e2dac2703131d21618ecca28004298019b0ce1b3523bd6572a4bd832ab77b9ee9ca49ce98cfe75416ecfdb7aef564a89aa7649d99f5e231a6bd7231fc200ac3a403b5cb243b9a1a84591b1d932c938d0e0bda1769861ffa0a25240ae5962f51f9f13f7d0496957872d0733c1af627fbf1e11f62141de28be8b6f4aaf3e2dfa3e8898768bed00652a413484336587dbdc4374aa8d183cb15d53c0ff16ce847e33d7171a69874752a3ed15f46bdb5cca4870f4b2a0ef17e4b92c54b344d8eb99f131d4d8b691eb12c76bd07a1182a8bd2b4a678727ec2cee166dc3faf9f5668557838d86af0794edc4ac3fbf23b90ae27ea3e7867e7799fe5491a00c92341b67cfb30d1c132ec7e2137fbd513edecf5ae895c674b173d181b02a164a09343aa7399264c2f393e4a238716dfab9f4e21b12a196de9cdd61de3949eaf70531454eeb140f4177de5e2d0e299a5d97ec781215138fad3c06804943f00b06b19c8c7b2c3f0b9318991fe3f9b481bbb8c7ed9f90977bf1243b644fd20b03b3187d95fa6efc5ae30f4a40d3266ea5805ad6ed0f18defbe00421232c945e53899bb2c3f1748c8f9a441b138832f24b214e7cb6ca82aa95744f40cf8dab304ca545f027879bea5b3aa20e386a598aae6bfa0bcd452e16c989d652ab568c6906e27606a5fdfa1306e31530e4d13ecc2c1a670394d6ed7d4982859d0ef191f65b5fbb5e6087412f6ff0e310d88b49d90ea6a76824c4e915ca79aaf22223ebc342402993d296a40d99a2959c6905ead273908580d737b2f95500710af1bd35adf2dcc633de8e64918d652ab349eb3c8d21cc5cb249a5ab10910cd283ef1a8f98a15c0e7279875ac08db6d42a59c014496c81a406ad404801a5b40e2bc100e325ab5b290218040c2560679a501a4a3382a96086b4ee73681742d46c45c9c27bbc2d9f14195bcb64080ccf7929f613cb1e09fbea8eccbc2ad6b1dda7a7f802b70d06b6c8c5756d197d1b9dccedfac48919c18a824e11707143d010f903c644d70af23ebe797da2c326ad00c7ea666a6f2e4a33cc98ce523c7e1c3a96dc1d9286fdb7b80500000000000000000000000070febd97e47a4b78d6a33559486e7cfb2f5e77a3b05673093844df366d14fc53f273db683f8470be5cdd145ff319a78c258289686d326793359686bdb9ce2a0212a7dded8ca8e37789feb23efc011535bfa1cfa348749969ae225ee7f10648930000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090f850279de4acb5de13dd44ed46a76b49819e752a98bc9901be6acad26a72cb11e813f02d73834d2cf9e200533773ed7ef1f7dd2a3397db4c5ba812cbf99e684778dffbb7973da31e8b51750d5beeea29b63fd7c3fa148116191be31c2a84e671905ff5ae4cd1fafb5f063c7c79d450bcb4e33555c82ff3f34ab6a93928c9350316847445e66a9d78b1cd2a9ef658325f62cf5004a7e0a72f48626c61ba0f8d8e020395ec758719f270479b51154b47cce8db904ce7abdceeed4fb9c767885f57f90a08e19683921e456005d26aca4f556377696b85fcc919753042c01ad7a4c6423b511acbd6aee72a265703edf02d8d010d1c35cc2c6ffee2eceaf7ddcfe3f0e6f2031f20033baef6a7a099c69a2db5985ae1679da3e433e9441d0b7180b859aa0327021768700aff3f38c79429c8c64b478216c96db292916027e68f01eca5d23a3a630208beb4736b61186d4e04d17f35535383218cd177233137a544126eae105b8b1f022f14b24f82c9305865a1873b01ad2828ef653ea94ddf0906204bc0125e4a70e00202f61f60f8ca4191f45a8ec9bedf7dbc8bb0c9ccd7ab09e9090e650d6198fd225821fdae912a32d2efbb9c459f8a52297819c639c57b59cb6f6c61605a63cc1c2bce2283fa222143c50db22524c7c3a566c901a0775222b8e6c8853ce4d504fc0fa28094bcf1a188595362af614b06c072aa747dede9f28dc83c23c3073eb8456b800435fcd7f8d360dd463b5bedaa48e7a5429f7168d82dff9dec10c6d13638ae0640951544555d02fad54153f72a353f6f0c48f5507367b84e3c0bff1d74343731ed0ef9c82c4716c091342a03eb78a6da2394a7b9ba7d535e38631e9cf04c7631aaa68bec12b210bbf11e0cfaa0dfea38c4ed704adbba980d0260559894b84c6915fbf00b8832e07d83835ec8c9ff2b9e26d1921da3dc794ad3fadeedbd53854692e26adf82237a24371ad7d467d1a1fd7a0ad23ab156a4edc733d672cecb4a601bd8b1b131408e8b4c78f67809f2889ff1ca214b7a4f885ada27dc5344c24c83c4cd14031e0154bae789d6f6369c16fd8f149d8b31716b4a0439abbdf8376d180dae329224a7953f3cbc9336af15b7395807bb061b92f029d87ac616d61ef00a9d31c182ae0b4bbe109ecfa4a0a2b01bb5d05f4f309f8995c4dfbf1325ef1a48ffbbc532653cef9924eb6ec98fd12b2c7e41f03130b6f59630b6a349df96ff584eddb44a3e3fe562560e92438ddb1abbe9457024dcff0c14e44c981bd207d9a619cef03510a3705bde685bf3b9a13ffd9f8c075342069448efeed40eb240a4661bc2f7e90e1cda5b6f9d927ab7ea3b3366d0b75ad7170f000a40d3205a67d41915ac344adb7fda0082df39735e4fdd8e83f48e4ba4f2acd5966b9e8050b74646420b4c2bab406cb1e85a78b95e279827ca7b9ba3374ac6d69ef48e06ba79ed7fc28c9c386dcf15a756c88656e6d129b23ab5b759ebf94f20541b34a6351e860a4f75f6feb2197736c7572b0756f84bb66ea3665a564514f3f90de218b5d25e26fb35fae819661cdfb6ddab73b6682ddfa1621cd1739289051df8ab6c0239e58b230e8ee3166898046ba0c89c12ce9f3c3e68c08c2acd6b9e154ee5b34f700a0887dd83376708cdd5288a77e094388a32cec7c1a3c772be1d718d248a7f71845d0120062e723bca578be361b2481ddb2512bb3989d6e1b7616102de8d690933b8990f5ae0b540487905f9b77d3321c0831cd7e1f7e922ca4edfa8b2dfb6ceb16ea6659cb9d2eaf16efefd575300e3d3f3d2937dbdbd1a88c44723b50b737dd2f2f06b5851383ff01f5fc22258187dad0c74357c15c9cc092756d9d2d2bd4629ed99c08d040e50bb9fe52797d210822bcca1354b9753b6963a81b8d1faa72bdb25b2c61a6b9c68ef495a284c2bd6e0981100b0b73211140779b90c44cde072be7b543c1067d07499861b5930816b4d7d5d01b5e7a04e9a9c1028632d3b91b1f17e11097db1ab0b64e3a97b5204776738bdff05264afa87a1cf3c50d339fab51df6086508d06f62f970b3716c27e1283a6bdbb85aaaf263c3349ce1c7340045bac416078221c35f81d496be8594ebbc9e7f3fc766a12c949c732c3e5d892abe735b7af1467ce2ca5bf08b6e30826437dd46fe2df1efba1d5a433f65b96067e1841bcdd4658d7f2e012bfae66572ff586390681e9bb2b7a1ae51bcc3ac618fc2eec3f3efdc4ae0a643a2c59813cf184479199ad1791e05363324d23fa3384e6462a42de61b312e5b737565c91bb8706e6e7e02f9a1ac5a163a8df7f7e6e6887e4dea0c14f0904761638286c18426772b04f008530313d6a72565efaa320fe904d2e93243e95606d59a3ae06ee6f9524dc525eafd0900ba2c40e125b696a3abcdcce850b705666d24cc238868ee14c5f30d0f", "63536a", 0, 2112995176, 1537743641, "fc786d69af81262ed3b3352231dd70489480bb9ed707bc3b152d2b3a2b8b3cea"], - ["863c8629031f83d52a62df821834498e2a05e4f5cfe4a3e59303610b7ca1b61da514d17182030000000900520052acacac6551ffffffff49669c4b5da1d4abe3143a2fa4fcaa51b00eb3b77e1932ba014b5ab50f64c6990200000007536a6a5152636583ffa414f5767797ae52e8b5786b75968741f4a79c46229ebb342862d62f689684fec2090300000001acffffffff02d5dbad03000000000153848534040000000002ac6a0000000000", "53536a635200", 2, 1204216542, 1537743641, "1c0512ec15f2b7e02176b592b05b1016b2887b26172f0053f68ad109f6fd9f24"], - ["030000807082c40303b9dad4f54abf4a06ae5b726bbf481cd43a8ed5f615991b2434519a28d375d9df0100000008ac005253636a636a6ecf67387d2f55ca5cfb9b8ab120501e2b364827e236ff8e6d4f027e0ad7da17afdd027202000000096a0053525365516352ffffffff32f838829afa2d3f54d870bc7d860cdf7977951ed85fb0f6297a28e48338e3120300000004526a6351ffffffff0118ccda0500000000035263ac45c3dfd6000000000140071e04000000000000000000000000aa9738ada7024e953c41597c21304e28154f63c983e995171ca2fc5f21232eacf0c911895012320b733a5bb7b107e774f00ec992171b1fdf0775ffeeddd16d12870a05bba8baa22e790eceea15747ba7f71a735cd7f956b1f88f695e0fc0e714000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007d4501f136296a87dcd2fc449d36d385d50d980948a460d3420cd648a9511eca89cfbd958f11a83520694492e533965aac3cc0107be81e15dc727874a9bad1e61bde918af6766f96a633d47e60b64094b34bd7cc9778eb28b1f97ee930d80a6232ebcf1ed15d56dd6f6545acaa3bb5f97ad434fe689c70ca294985dd489428bb020ccabc5ecfaa3bd6ef9544a874b366b60ba639a83a459208c671e6a2691ddead03201ab08e1ec9f9dcc70e07bc8baf9d6a53a5f08caaa45e7572caf85efcd71e140b0453fb8ed7c57dc4dcd84ae2e7f865ef652d49f0b79a5ce34f3b4efe37b3eb1558ced602440533c2b595b1bcf1e7cd07fcb6e9cd7004da399afc2f73cfab6b77030284bdb838bf409d2f7c02fa7152a9d502fb33cd7bc434d63ba06ff404c43eed020050d2ce8be913bfdd9097347949cfc79815ed45b2419895ee690b944b5d8e530319dc4f8afb53f25b373bde166d60d2a4a296161b7c818b5d9ad19b7653b78c3103169028859ae157bb84d4e3b27ed8933dc9111aef4cdd7d17919ee2af642a415b022967b6ee3857241c906e005e0708899e7b274b2985da734b3f1b899e62b6f8b8a3f1799b0547602f00dc544c3a55ef09b3927ed7f06f9bc3d99d08fbae3f0dfca513e3b32fed2cc34829133a340a67618d48e847508247e1d68a6f7f0edf66419b091f219c1e3d88523b83bc2e081e60f4f85d1da040748c1406bc689da8b278a47c2715eb892461623e5b7a74c4113d2cd8911af01fb0aad56ab8ae99d43f4603d51f9f1909143e20e6baf431d91fbb191a1a3ad0cf2be5aa7f16962b7dc671ff477ea7ce09806107a1aa0309b6fdb6d3e5d93d0c41d0899a2e3b7239747249479c5f979dead2533a41a7af7c93b3a66165293246a8ab7334859f86e4f3fcebce113418b8b696dbef62198f197e6231f5811f29e32f0608cef09a41df4a27f8dfce0644c9818ce271fb30ddf97df2c42dcf7ec60f29fe1b80e1f1335875f0c663e8bef06beacd6544d1d28ec8aa8152d3bcb11aa2cdf4eb63ba882430151f79c4670067b3d6160159e09d2267442994f561719146a613f355eacafbb0d61e4d18c35d3126b37e8944e3a2f139fbf11701c88f8b6abde5b7b973a4cd9a98df523ffd645e24a4ae886aea842436190ebab080f6a3f94337725ad1f94412b36df46f642bdd5d12d15c1ab117cf47b020c59ba5c2a2dd4472bda356e780e5d626ded4e1010ed5dbf2bbdaec6508f33992d3f9c97d2e57355c7d64576eff4d47f9c31759f565e6a13a35e53a41a215575b884b8f192ed56ddd977aafb78c5554866b6375b854288d8c65899dae71609a7a2a96075f56de70b047b3da7af29ae8b6f03176f41716735a1b0bdb8ea7f5548f7ddd7d0da04b40f337001cd5e73c91f61cd7b65f864419d51f3ad77aa9b9951c15f8c3aa78a5cd958d0e523918f166cd599a3fe1454db6e7cabdeebbd15813bcb0539ac5fb0b9fb8620edf850ff9e4bc6e09e23f7a36bbdb6775c8b186a965df28f59a4d6eba4f4301891a5caf22aac1cc34faa5cdda7af969f321e21d9a69d2788c7813e3e28367d577a77c38ef74097ec90f6ca4fcdf395b77ce69a656d21deed4cf8d1197e6cfcd2ceb66611c62336a68ceeb131ceac100f4402f5da453d7b8308c38222b68f7e0b6618495d46ce7c5d4ed831c1db53e9620448b588890d17b7b49ca30ddff6964d6acc433b9cc527a4f1d6ea6a1bcbbe13d7addd6631858f185c2bc7c74332aa6416768fdad046e235bf4759d6a4e2102e0712eb2a217642bf8027d8dc78ec37f5b6d57a834bcf18a34e1fb3137bbe228ef639f7c80888b2ec003537b310f971cb73aadc3f0a7260ebc4b73750d01c9fa3ea8b1c9152e1bd774dba4934b5deecdab6e9981f78e567ff868c21efa401b09c8b6aa20a541dbaae18f0bd59157c79e756f8107d7681879b612e3dfaf7e59cddb390e0826bc978e577b111348e216c5b4598d247a7c3a6ae11f0199c6261af1ba19b32a2ccb64d7b04040cf495ab329872b8b03cfaea69f1406b6a7f4ce4b82241db1e097c79ae8a2bdc4b3861623f5d86616ae8e328a158e1db01fa34f43c392df2eb775ed0cc8c8dcdf3648d020c41dac628b445308f07b5fa372790b2335d5ec3d8e969029d0bb5d538c34c6bb4ba52a47e56d8d626c89a1b63422623339dbbc3321c171f6803502654b843cda6a265eb65ac4c7ccede65e9b857fe67b30458e62651510a1d7772762c8e08aeb8fea3ed5edaf46d6ebf75234c24389ecc8cbfa3522aedfefb302eda561c215b78da5adbcf83f4e34f7d5dbbf42b3cd4ce80a1103795850e75bf02f296f9698d4893d543b33103973342d69b9951102adf394aff4ef2c2f25bd79bc898eb85a113f8e3e0b7d99a3e0404e0712bc6cd9bb0ee76b3d97f91b68c5780f", "51", 2, 477568973, 0, "26c34b1646baa31943208553736c064cc8ace4bef262b335cb0c79d18facfd7e"], - ["18c2d76e043714888971376d57d75a67620bb52783eb88d3e0d447a077944cf4122ab523950000000006636a6aac635232d362f86332a0fd3d19ceb5082423c9cd11ebf886d9a20abea10383171b89c60090c27f020000000865ac6a51630052acffffffff05bae8b97f2545ea3083e7477b6536b580a05502b058c5967519ec2cb2d97d0102000000025300d15c56fa7a8402f4e76fd0dc28e6e63e711f821edb2aac886b212a2576fb0c67a15d1ee201000000055365510065450cb42b0407e3e6040000000005ac65ac5300334559050000000003ac6a007851e5000000000005526565ac6af542c40100000000076a51636a6a6a6ab6b3785703000000000000000089800c03000000002bedfbdc4200bae6b99d72d30ab36a5226ca6888c379dff7da9e452bf0f6a1d4bf57360d89a76384e2c9cb66781bbc9c35f3467b6cbc4feca9f6cdb186c772838f81dd0ff1f2072a2bb1710df44795330df44ebdf19217bb9e075b237e881331000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b781471362fa5b6dc17591d1a9a619bae465c2cedd2dbedc30834c563964e350010df3e389b66f8b65fcd9f5981cc7c777dacbbc19bc2cf5649c0af6abded5452870f5a73cc9827dc38cb4ce2c70308c331238793b26ec66af3c8b58fbe0dd0577569075ade8ac5a8dff4178fca227d26d1a74a457d6072838b88d5a0a48430031acc520aa136bf158b1fbb628d044b4a097027af69dc7c10d152697dc648cc7f031672d7ceab0d4f44c4a60ffb7841adb4b33b7a7b4c036443db72a48f964564ad0b06ccee5188e4b20bf48f4a2ffdffe6d5277a93da7b1611a9ff77383a0e2453c55c9976277e52450cdd3d03b3debbfc23e89a1ccef6aad13a8f9ccee1b4080fba031646c1fc03dffbf19247134d03ad32c429c28cb4d7e8799f5974d8ff01e708a90316fa98639ba28633935abf3fcb40a2578772862e2bc4d084f2f70964f0329ca2031fa83835a8f517fd51ec4401ec34ff19b4c823752acafdd6692735b1f4e8f0c50207bcc6038f3539fbcd455b6c1ffcf3fcafff3c16ec80b973aeb88797385a4e560213e4e3f7b6591ed212a55e634cef26abb69ac82eebb5c4b56d573b0598a370379ad54f06e421d28bc0b1ad25531703d39cc79a5f46a0db44dcc70de8d3b503b64c18621f5717f53ed4332bb0903903b03b1cf0f4c0b080a1453905691489589d6e1c75ea06f6fced99f3ca4ffc6e7ccd143cddb74a4052486416cb87bf455c5b1b3c8c6733a90396ec6060fb4a37400eb4e250b1056dd593f75598550f89fea9fb12ad5f4b40ac131f8a78f537cf74ab0b7dc433ef609db09585aa5094c5fcbf72019c791e29aa1cce3668410378b808f139c039eb7a7f993d67f63dab585a34eeef15f52162771f11b2776c4346e9d8d33f10865511142f7740ce6f66ec9c01e7466e556d22c5f559536c821ace8346a5bdedcd7b3f6f503d895e00a83313cf4db58850c523fff36498c462ce057ae25ed096eb46a3f48f777d0ff0e045938edfbcaa1324cbee07e8e994825132c59fac2475865f6a012d8f64358b1baa29b0a89904210ba1eb43a8b1de8551de27b85c86cb4bcbb281e3239fb95cc9d14b506c2fec4b7c46bcf53e58ecfaf8c8f7986aa1cd4856e0729c3ffae24c5caa3fa0e0abddd39df7399b8ca0c6b210d069c89105335afb6eeee087f0a923292716d8dc07655150cd9a7c38a649d8d325006a8c9e9c74be4ea497002519e670b61a27137b11c20c052638fb9ab8fa70a68abc59cc394fc69e8af7fc1a8748d5a190ff01015ef657a335ab2a82b0e0f31f6a05cd7d4a5d71e06739eec82b7ad23df70af946e9595cc25fe68f2c6e383c242ac6bbdeb70204523afb165ae13d1818bac6a037ea6016cc06a591d2c943da71588a4a7d48c19cd65b9610413ffaa69bfaafd824410f85cb9a84d0d0d6b691cd89eadbb60284fde9f97ee17bbe23729f5c3f18520cabb9c82f9810208d129da5bd43c134751318e9df28f5cc6b63a76db5c63657cd351b297a8f862121e6b8701edfc5842eb32843284ac2d525711794d332de822e8086a08c35589d0a3aeb3e37c0bf2808ac87cec419812804076b6c9afe5c6e32a6176fb17789767873954c633f6612018b775c595b294add05e33e771501c295e6b9b2c87703c681836c0c3e99d07fd2dc6032524736ced9183561af02c28fd37a122b3bfc2cdb73e406700867ffeab851b94c9d3760bd42318a8ed95f2ee4fa63dc32964263e342851a5ca7ff9af60297d733e3d71d0b21976e653514c433a37d5191a2008775a0ad1b097d81481a8ca70a736d1766fe9efab276c545f9b0dd15565c9f752a21d2da6b773da506575af3184d29f104d065d6e18944c8fc326c820fac2df4fe2b3090abb800c486d59b35240cfa7ecaad25c77b0dba3a857221bf64bfea51f8f0e7339d01b83ac01512fc5cc97889ca45022093d06f94df593603626621f37fdab0fd8a11fe853ca106d5b66ff7191ca63e5ae2f4be6ee82345aebd29069024e14d23bd10bc9687e29bc8a7b60209ec5c8004f66703d4d7f800a3430deb8e423bd43e0b6814b1a1c76e1717e5825d4e33e1f6a713cc71c303756f1ba58240b5c1eb3f1416843d914bf5995f4e10b13d5ef07d5632b6112587278f6835812d85bd4fd67018301c9c6d87745df0e6904fd7b1f9ce4d8820666d72a52ece9a51769376653ad664e467ad850c50f20b8ecc944b3e422de44c492d15992d619a518989345488e28af30c007590e6d475d3607477a7931740d5602c268ebca1f0f94b9388da1d577dc9339601072104000000000000000000000000a86bce573488082c6d2845a79f8cc3915050bf3251a97005ccfed7ffaed44880ceb9013471747c6d8284ada5d622bee0859798ffddfd4ea30385c361ee0068b1fdcf684ed2c283ed5bd8ca6f0ad451353a431411a58f5a2a2fd0de301ddcb1d700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e63271d7b5597b1cb014033db78a4c76b2d9bdb1e5d31b044636ab7830c195c0b976049d1261054a91df4d2d3d9262d320501b74fd923aae9159494ddf75d52ebf794a7cc8148b9f76d6fc7afff3ce61c3dae9e3d15e040b5143c98cced258c016f0e9d589f79c125283745fde3e898d75f04d5acd41a0446aa42e825a970b53022b698d0ea4f6a7465b041038d24338ccb9251dd87ef6e5193ade031333460c8b0323c4a50fb0826e668d2639e2632fb023c3d50d0f49baba3dcb7854131558fa330b0796d7902f63000a3cc97a3ef366759a50678f6345ff19d4420448338aa54b5a456aa8183f863b985d3dd8841707a81ce7b9434cc53f225bc253a87da1530474021a37f86454809027a82355aa47afb67a14f89edf1ec22644bc3786d3457c6371022d1bdbc853044dc9d514cf88e7e337cc874ace25d1bd9a78098def38276eb5380312bf18b34930e424f6720453237f416d7b32e268c896cafd801937ecda318cb8022b53d185851f9bbfc06a6c0ba98c1bf896f415b7c01a86fc6b1e4619acfb9ae50328f4df0e0b0fbbc16ec84060e8dbf2111791a936d837a8c44389f3ebc11fc182ea9f7b8b1ddd9c57cb467a9ba114e637e6090c0dc8e64ca5b91f340032c21c0f123c25993123b81d2611ef21d2d5ff96da404b6040e64bdb3e6a24b1a790ed6a7d53ed85861b9dd418c8eb3e2d6e56e0c949150688d4e253f1124704f683a5eb3401004808c2b32331475c4509ec912277fa4a6fad7e5fc81322cc06ee8c828385887a462d0a52e4e0a26954b2c23c26cf51c94d8395bdf863171d74dbec1b0b4dfdcf9b36f67db8c5378770c061436bd72569372ba2ddb4dd4e8a6f3fedf3f69917fe51f8e1dfaacc56d5d1be5ee7489dc932fcd1d1b3a78a19de2e4208dddfcb8f6cb507d44b7e824110aedc5131f453a58c8625de3ac3b907f57d76ba218615d3c66681ac1583b07e9e8daedbdc174b4f853aa984421355ba81a2a8ae6d4f93116398737573ef4a385f7c8089ed22c8a1dd252b5626fe2b57104d197854ac809a1f5fcdb5231a43ea7a3b426431d5f24c1c9fa507a90e22d775a2792b5bd48e640e018f4fb5d9121328aab1f502d2ef84cccf325dc48e1a3e4296d397735b509a877b7703f1e2a28588e8bcd75972056e6274c702a03f1bb94808a9711f530616cde488aa5332b5b48d1a12f11cbac622a3528c675486a91b8a5cc113b35f903789d6462833b58083be4f34330479f9c053e2994fff230984401c22cfcdcadb79f55f453f8a049edf90bccbf9c55179af79214d7d3210089ec76c2f4834227283f68c4056ead942a4dd442755bcaa18c4a98ebff709c290588cc94e981101b780f9e812f0eb1cfc906eae02cf79fe110c3b6a53ab19ec787f6e50e7a555415bc82abaa93de81941e8d6525fdf55bb88510557a11e6c44ab00737b918f18ca9c5d8b8b01de8b70a06fab4db6502e192b1cd36b5830163ab014a7aedfefc56d0a2efb3372f925141a3725259f10496c2be789906786a775aa20364a0fbb5477bf97e1f5bef2f58a2b6946adb8466ac650e6a8a7e63eaf2b71ca94dff730120bb3dce1baae46085be6edd2256c30a3d25ac30888b55d61e38c73b4820478ec41c177f8e5b290ad5acbaf6fcadc75c593b01225371a981adf8c6f0f7f404334ddc43dbf1feb671b8e2ad559d163eeced372d9f96c9c929598809e7b81196fff35ef19e5d43afbd8aeabc2ffd58d6973a18303257e9b50343a4b683e32ad932770712a5c9ea43a340761eb0d6c6565a3fd48abd87e87f491c01d7cc79ee1945a6792f7450b3948253bfeb3e2102c345cb80d1af9b0e61b0a6f158731a40ff99050590b6743731032a7d016717bb31691bfe541ca7420cf2a48d3baa8d33099d8b6eaeb5eb031dba389bec0d44e45b0e6dc79a8f2fa3a1e276d79000cf30f404efbb172ea636d5d211bdddc0a01a6440a791d368fd3eb201342d82501055e6205ba6bac6ea6d8c2ade6d2c78231b195dc4e57e32f500cee6a5b8d42cf59a1c589d9b76d0662e8439b13bf6aefdbe418f1b8f56738971b7179561f99dba5133e81534ed0d376d19e73971f9aa5472f13213271e1979430cc39e9b9132c2b8fe9b51cdeaef42675945d5a39400653e6cbf8ea8dd8bebe4fb4b44e6b16e7e714cdea76e4f820a515880f1b2a1349f3d3bf7665edb728e48f8b31667318c42396c0032db716e871d9a03b11a9f1dec27bdd4fda94941e69456db7ccf238c156c87e5047c6a7f0f9a60e5421f7d8aa2e7df0b1bb9cebdfb5c3010000000000000000000000002c59fc262ac7ce718087e91b1c35cdd5e6545b7c194789e1f1b18f63bab83b35e6604f1d0a95a126dc9f7f9b2a490b740bb54588d258100e02acf73d6a1fd05e0711d8fbd92d08a67a30fe9cba517ade72003f36fd2007777f86e5716fed03cd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd6dcaed6727db7670660d75975193da71d294c01d0b9749ad66b971586f75e8945c90e30494574198c3031dc45c3158ce23513ddb79eea95459b608ee951e4f1ba3c118a1898b38e98e17dccb446761b57de060e588b685c36339cf9b3057ab19467baf2c726e2cf5681b5cb5eb13bf844b435687fb7c833e04f2ce30951a0c020bfc4f641a3cb154e9a6e85cfa0cc6b05c9e30e7a69721b03e3ac1035d83571c031bceb198d178b844bc20ea750f426d99ffd597e335ababd8aa977af01a46c1a60b063a7d9761701446575516e4636595d6d5d7b1df7658f865fcf7b494a6cdbf1db75808c0a250307abd787723a9601ca7f1da29253b77c7387c07afb3e30a98710201441f2989acfc9195a5a5f543dce08e7bbe7da86fe4340ad16fac7742e13da2031a6800b7f62bb9c1dab162df61e0f12bc043b52f793d774527836499c915a64e022571e3e914084d38f2a0cdc42fb10ff47a19a8ffb06a55c2af8728b31f4b2e49030869445a8c531f19ae90794ae32b9330baacbe7b60490fd876189332536ccd810327942fde449e88620394979e1ac0ba5252188eef7bcb61e5005cdeca1960c32dfc20f1e346839ab7eb1d6e077034dfc7358b0a95474558dd8d59275bc5e41db0a02838a09d68727a6de5cfa37461925fb1ad6f1adfc71446a720b2f7e992817bf1c0ecd05fc504e392d6675a6923e0a0c8896656f4483d2868d6e50cab850afe4e4ee133cbe0e1a01ddc4eb931ec9ee5fc92301f980ca3d3971772fdce1ae5861ba5ea8b21f13f3da536e623b67ed8268477a6f7e18ef647d0262867cf9161938bca396781cf795669dfce957e09099015d0252800598b4d096fe964e3defb502d90de0fccabef6c2b10640ab8bdd9ebc3f19acbd17a0a43a73f37e9287e46de8eb13b37bbb436ab640f23e8925b8af7456366c34e473dbb32e2416b1fdd403d04c8b7194f45a3d2ed0dd4d40c2ec8e5aab18c86edbc8159d911cc09d925348ee48065b0e347acbf225e385b9caa965d8491053e80354bb67bd63ce008e4e651b5ae894131c12736d1ac1ec8e41340a419d234e1633abf5925faece585b837d2d91c240efab42f166afa9be568adb74ac49c76d3f1b562e5d60d1c65c62b7dccd77af4cd937ed744ff5130783c3381dcf3a743b713ffa32749890ac2d96318d576dd987c3b28ee7d4c321acb0c5aac067a18a50cb59942b8917b7b00fd648802125156e69bbcf650a4e3d5ec3bae9ecdb60f583f29f5f05c8da658d8957b55d28feee0d23e27cccd70eb2d18a59d8df7bf7e77d9e5abb1d866b61db0dfe237398a5609d647d9c4845b7f8d6149cc1cd611e1a72a762c1f60a926439d69f7c70c2f4a1518f7e4600599bed9b263f0bc0663cc0083a0a1eb1baf5e288df4d7bb4cac6e90763c83b8f38fcb3406512af43d34cef072235a37c0a329aaba95ed8db3a4ea26b8d2f23c40f297ac86b79bd9529f889af417e7ef6139ca676d409bfa2ae9c347d93c1c9c47b64c86d929e77e8f82fc23ecb44320d9e8f05d73594c65a1787b312229b47c92ee19c531039eafd706cf628ace4ea8c61b64f934396c67c98e4cc0ae213ba0baef57bdef6e77aaa6683c6bb395f32b5a0e5289f2742cb763ef692623e7be61f627a11c522b28df949e3216470a00c114942c7200ff4aa8d6609cb9456d4844f48a90794295b8b6e446052643d954dd49398e8e7b5ebb33afea5efa0104a3cad8397e0d0c7bfecf23fed0d9e5a40aec61a4b221c1cc095c5c212209397426801959a9fce1ec62fe42e41e8d4e368f99076204fde8fe06cc93465fe86390d1385a3aa3783720b4860598185762af1fc67ab533514da8551b9e18bab16a07811e3de37e8b9d907e5f161782c09ffb65bc8b7c4ee0ea2b134152c78c84a657c93b668c127e19b5d0028a47bf422953f7b9b2b72cceae5fc4f94b32ff0a87fcc1fa36d932eaa2c282be0adaecce04acd39ac9d935a0f5342494213ad2cee3891291724cf01b22d302bb9b3a2c2c90eaa997f811ba6cec3edd5c16b5af3b7798410e90e349a2a43a1c9776f277977dd8c4b7fa846d592d0faf0eebc5bc09187df5c1499d6ad9bc3f020e11487b0cf8f42875616fa669198559bbf7604cd8946b1807ba0d32faf6196790f8646c2370a9b015b409f08dc1806a9e9c32a2c427a5ada240e1e34fc750266f9225435b2330b4f23e740072fbf41602ca835648eaabbc54331acf82184efca8a10fddb52c2ee8ea39521b822d881279b1034a9972389e000d5baf44afad6cd62a673b3935cccbb95d2bb45c657904576dd1a49d1f50cfed45627977c21fe2dd9b902f58d7644d1365e61fb89297bbd1375e43368733ab4a42c8162221fc4f1aa0ae5efc98faa36a7e6a5ea156f0554bae74f1d0ddc36a011a7619f873579b3e8f550f", "5100", 2, 99633523, 1537743641, "5aae9e497b554e4c40b7ffb5a0099b6cff49bfc9b45656b603c5cf055a8f70ac"], - ["35bd1d2b021099c24d37e9219069170a4135cfb5edf05808951e45a2ea498088517d12bc960300000007ac655152525263d16dd30e0b93fb80a6fe9ccf89a42c7f2cf78101f979034549e9c0f4d172635515619c2001000000096a63535363ac535100ffffffff034f90b50000000000065251ac6553002177820000000000009ee1110200000000066a6a65515152842303f201000000000000000083d3e00300000000504d333c8911122bdbe15cf727f86171c69ffc687fafe908fc03cf4e3b3a4f7818ab949198c9964f9129d6cda6c01697cb823f8a1463884abe230d390cf6def8c5a3c84511358472862e39dd9429e74b5815dada516ddd6b728430891f19b93e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ec08476ef6e403ef648949a43a2b02692d689496982f6bb36d2a6793011100e941bf05b07540a32565b41bc42e2fafecd601169038ae84f9bbb7b433316fdabf2d5305b7b31017a7072a5dd88bf30255a018377ecd25dfdfcfbd7ec3218ff54c487f13935f4f190265c06c08a41e493cf76b42d1dc2fcf4e472cce0bef7783d70212cf973153960232262b1dc378ba821225674bb1df0d48dce618d21ce0ac4fe2030d1eef6d8ef2f2fc049a92ea661e8d7fc4d0e70b35d72eb555b08af2412589190a0752c243f4a5cc2701a60b478bfd5018d0578d0e74743bd323bee9bd9f2ee2843c05f088063bfe0fb0ca960512ff8b3605750e4a1e67fd9e9009e6d1b99f53e1020bcd4926aaf57aae63cf49b55fd069d78279f61726c70a1e26be3d0d5290829303026ccef06829cc64513fa4e53d9c6723c445e5dcaf48c969018e709b4ccfe95502199a08df7d647ee2a367de7ca77514ea6a55fd6b8a831ee2fbfa276024922b860324025733486148036b7f2815eb73d0a9e8b50c5ad4eea09ee5e94bb48592bb9502172aaaa7d23c1c2738b28cb0d6484ea7da0b39438c8ec3d07fab0d3a6742fe02b523ad6094332fc2f46b2f8bcd77676fc21a251980fbaad753e0d25e1d1c3fd2eafbfaebb3f13fa4482aa4870891c96e02424a2916156b4ce18909fb8c6026761fecfa6db2cfaa3e3108f5b9db8443709c3e895a3b39687d94e5029f9d06ceaee58251fb5020f6bea4db3b02dc8826416a74fa7ba294cdd3e90d56a57d0a382d7874b26d808944af927c04dfc9c1d4bb8c8384a6af942b9b28e9fa5061d85928a05a88fb849759ed3df08be973f8935ed2933a7fbf604acb93f64cf16cfa11594379c408319d54337072e3b12a5be0b453cf97f58add9c3e28103008c34fba96103d9a6257faa542ec77af697d839b1ac48f8c5005b239dbb94eb1f2ca532653119c50e6344a5420b4a1cf2fef4c5f48fd5d4351be9166f10c737f2f6618f9a18004970ffaeef1a25a9159abc109e644112b7fc1ad573a121801e3e4997aafd9ec7bf54ac44387b07914f80fbe04020906e690db718c55329bc6ab6aafaa3f7dacbbb2589f318783e1a04d2fba5cb3bed11491b5ed10176c57357692127db0bbc0d42aed0942dd527bfbfca5fdf825cb60a5f29a3c35c9229635f98e9737be42bf5ecbb1ed0417d045c5a0eb5a92532ce3e4cba60b50c3d20dd4d79e0b1b2c905d3ce14005c9d578b95df45412e452f4419d1da366323216c56e71b206c02dde5507024f6c5f494d4532efccc4fcfd7238520f79868b9d552f84692f7e6928658048ce827789a3424c081ec51955c769fba33116bd3ed9e3f4ff6c50753809804388225dc4af7d621171955e3bdec833a1fe4e35e396dc8fc7e74e11eaf0b76e6a78fe94e9aa0b1a32cbd297c8ef9aa873e3a250f4cc76c783da4f481c21e4feecd7a9ee65c79390cf64f89479dcb78adcfa678990202491ec48d0fd3c405fed821798cc2b18c7461901e3cfb911215af502f5467d4fc61f4f14843aff70ea7950007e25d872daa54cdd6733e7096e9b553b147ba19acdbf21e73d2024c90aede6322b38870ac564563f2ff5aaff7e2f6774a64d53e0c0ec54a01c9743f2bdbb22a83d4b11e769290179edfd73b5aeb34e8d974d66e819b6a6a2f091eba4922b8ff436319cd969a9a3b60bb93d9ae24c06a48480d5ab8cd0b70f16f260c3b3a619c8feb4e3d005321f566fd8be6d806bb257bb17b75ca43c200932816defc38d0eb1214e365846e7777c9fe96c070d889039b3680a9f0f54930dd52c379be664a147847868686047d210e979507cfd1ba799d42602baafd6bdbffa5c3e6d77c693d016ce6751c481da655a16aa4a16fb9900181b91abcc0fd7856917f8121e7858b90f8935e4045ef616f8253bfc3a497bed56a7d0d5b24465e3512372698930e1212eb3be2ea4b637e831afd50a7e2f837636c2704db7e245e6b01ee88ebe5b12b959299b3cb7797dc26943972117b7dd7bb9655da640921d9c275a0825fa8eb826eb0e3aa11111192a5f6cdbd8c4b7dc82f51bcd49b0667e7705b41f8289425f75908430d71d0d8d959d2df392987429d6529487babeaa7eee769d23b07d5c8a506483c33555b6ddfa13a5e85c93045df95098cbfaf996d6c9d909cb417625078397dd8b89e04ad5cd73ca1f74aba955c767965c714702a805037c11f5c95446558b21dedbb1a36738a9992a1fbeb35cedc0ecdd79cd0bd3044bc92757b3d8cc16f98a9dc16c159a7031f2d6666393f36dcc656ca0d3535ed61a1c48b2693a39e87af09eb9540b5d51e9999156a3a6dd84cf37ef023dae01b435d0383c1a0bc8da0fa74b83f86fe45f060dd03a09be71edb2f1ce69a89afcd0d2e9d61720529a9d29e33a9f21034a0310c52e370a6d1400", "006aac5100", 0, -166798197, 0, "44df50e4222110d976613eb8cb85a456d024275b56fcd4571b763d2414764c00"], - ["460aa51003c994322cdedc521e1064c017a2eb2ab7f769563b23febaf5ab8e3aeacd066d850100000009526a53006352655165ffffffffb0ff9d35922527d106074553fcaf4c346d7d8645718f1a6bff41d2b17577dfac01000000055165005365ffffffffaa8b9985935a75ceafebfda2f2ef16562190b7eeaf377a8b92bfad7497b19be60200000000ffffffff033371cc040000000001518c9b9e050000000002520036c3b30200000000020052f339203100", "515300acac0051", 0, -355966301, 1537743641, "7b0dfe834e2fac2df4b3c6ecf61711cc402b74ecae8fb11c34189f6fc131771d"], - ["030000807082c4030341b01a7be73892a3e7c314b2fc6e316e825b982a47961845d70fba62997a986e0200000005656a636a638505c21bcf8fd5f1b2df3a9afc2d8441e457533137832c2529c46def7c2d0731431faa390300000000ffffffffe5292e4b56be4a233cb8169ce35024e20bf0ed78767eea26ed84b4e8297d2a2c02000000060000636363acffffffff01ed843e0100000000010000000000000000000108089a000000000000000000000000005c1d578dd3a2f7e791c2ffc5491b687d3b8bdcd5bfca246cc2933eb8b66260fac56fa64703bf19f0636ec8595d433e00ae2a0ef66f42b68aa0b056520c65b742647053dd1832f096fb74dc9c0fef0b7cb0811523d08a686cdd132818291e0bdd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e5cc1f9657091e71427649913bad8e967234d9e68ddf1609f7d7ab44f411449647336059cc7122e67e352a66947d449ad41fa1a5167318364c4618295bb5f297eb42ade88b85da5432ea790cb861e1037112695067a4a5017695638aaade6dfdd1c87b87b97c596efbefcbe13099c1c66e1a1bb20b20ce21b7e1492987d4e9db03143ba4a457687531a9f4eec7d22ddfb48fdcac2d4e134e78cda708864287c773030d1d300a487cff5e3aa2a59383b31046266a2bb798cebfb94fd07900b18c83320b01e1f4499fb6a50738083841bdced172c438807450653e143a04145f232ddfcf679b342d081fbc3ba71d3ccbbf3d4e5049805b43aa307dbe709b7473eeca4faa03149a39ccbcb0b3294ace2c47592ca7cbb5b400c9e9f7dfc7f0a38de2b8071081021309849f84e0e2d5210888fa51117d4341e6125771630c9b7e31e6d4eb51fca702090f0e520c5b106b5188c8c46745faad68e3ff7cb05043612d1af0359df38465032ce5d5a0ceb0a9852f4e29fe3df7e7f37e5a71bba7a6fac9395afdb97acd1d520323ceeee85a8cdb99a15c54c63945c3376d2f8fa3c18ef7ef5ebd9a6667913b06e89a18cb59b75fe74d6edd76194e4abde6d543a4c969093cc89005914c52878b277a64e127595dbfe8573354c691d05596a3e901b9564d6812108c067deefa8b599fc38e8b301713d9b7c60af3ce226d56ac6a0cf5588acc4595d5507d64faa15d1d307bb3ee37d2199aae44646f21cf7b72afe07a01aef1fb165a0352f8a563c8044c91547257b7775e88353448bfaa90a760ec0a983c57f4feb83b96b8e547fdd821b5fae8ec3fa1d0ff2aa7af1c3088f163c58f7d9ad10b000dfc71b0ea377b477ba4976f69cc0a4553c33983d755dabdb90cddcfa0c94d528c65c8f1320445f5a0ebb5a28624316c65c61de3eccbbd535a959f05f998de0b762b49993eb9345055c1d54ab95edc6adcbb3ba0ac1ad6aa15d87d0cfe44110854b7baa3c11a84e5708baf8d23bb37a37fca9bb8489e59ebd714f564932ed60d38a1cc596be660b774ee6b9c19449549033f6fc216813eacf397d05ff4245540212474bf35b15c5057f142c34d8fcc8d967b7a4afefcb85824dc0857588fc6cfff5db7f60511ffa36b21033cd1c2426d4701517eb8eb34d270dd87dcd05a36d6c5d44ce637a03643e5f7f7729e64671d0f577bf57f3e74c422e71aacd4baf07a5cb9fa9773125d38241fc6d7b015085c0a339f1b08f58523b462fd0239416a89400f413c99abe964a1ccf502f7a9a14615e6e15b3c480d6fb132951cf3ccc9979638599db972d6091c77bace7e73a4707bf6a154773e35cd5cb03c3d42d4a5a10540d3561376fe928e4622c78dcbbc3e9cb71a5b34a8a1baaa723a58450fbc8f99d85bdcd744e5f49f5d97a1d4fd069f9d5d29348954ba6197e106c1679cba7baa078ac48b8346e164ae35f0a1746d23b28e98ca15bca3d01b6101d4babaef7efab969fb58ef43bf84b57987c924af95ae7bb48b01f3d586bdf493c0bf126e4522e67443c5566a082ea0d46c0fb0f183be648a56ea740e429831f0cbd2de3f882cedb006a036b12ed73d3e86ac22dd71614412aac6e244ce2f047086ed4ecce454ba432546ce8143c6d5bb9aed86f605d5da702a929c63dfec527f5fb6e505c6ad974bd528024c6fe55099ff89f3e2cc4a2d3f012e14572959b92d2517285e5774906bfad76412e7f6e42171a50587a4239eb89775ea118d7b244350bb18cd3838a3e738680d94080d9445fc173e91ee8aa38cf1d6baeaa3a13314d989e1d96305c9813c2ab97e670f2ece5f4519c880ebce754cab5497f109a82cc832830a598c4ed147afaaf375bc3e2cc44092ad96b20b54f3f9bb722b1e71b64dea196f8bd41a12f542dc21a298d6b32d51af1618061c20a62996e0fd7ab83b2a23b396f9380e4c8fc48723b546a7f3af4745e08b9c0370ab75d0dd873c21e27f45c00afe6d768c48f696440144ee055a336887da57d3d62e146dc740bc56248fb7b16449953eb22acdd4e471fc8f3bc2f7b3e3b7dc11b254c80a8be4dc779abee53832be979d342b876fd3671d5b4911d52af6d12f086bbd584fb4c861b2e9d6658aed92d42c8d40e66f74145e847cb0baa9bbbc0817640f2f6eea2e241add506ab47aa423620ad37efcdadc7cb283fb0b180f706751d9ccc220ee26b41383735fcb66f49e086ad28f8f52f44e2d428a92de0510a7c9aa6caab94ea6197685bec38fcb45bcbfb9fc50698b3fcbd3b8cd8d21e72118a5602479b7b5531856e5b42fea466fc57a462da7f59a85ede33568c2a4a06516875777051573263f4b7747310f2f335003307ab5da394100a2297d21c27de876650cff1dda256a790934a068e3d759ef76fa5d93011c4842186893ef380b73223b1fe6b300ea00", "acac5165520051", 0, -252135003, 1537743641, "dc21a7d1280d3b72bf0bfc473288a5d5b977490322af2a7c1eeb6223febf7e9c"], - ["584c2950016b941279376d65ca68a29e1fc4d6e05db5aa5857d8950e5ff9dcfcdc924b7607020000000153ffffffff04db1a22000000000006650053ac525107ab52010000000000e52859010000000003515265d0067d040000000008515251ac635165650000000002c920aa0300000000000000000000000027274301c0453554288f587512a95d47cf4cc97638f2806a491c4ca47bd8c6efa7a2cfc2eb78d4fb32a01a83ea242ed8f0b48df198298227b1f2564495ca27fdb5cca93bc02873c11b6657982fa6d9c94547538d589ba9ded2a138e581487490000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005e585d6ce9a95a9728c955b3efcd1ad204b421a930ad30c9deafefd1fdda7b5997571da430a0a2125e2b23afae8bd3834944063863137ac44935850c2bd28e79b5834c8526a27511cbf29e2b27912722851539626441f202e9aede8eeffcb06923c42cf95aa2d36b2cbf8c2889c96da7aba4ed291bf82fe86e0818aff6fdf7f0030022589728a03294a3f2803d3916cdf064ce40559b3db24c7cababbbf9552d18021b063ca7b790d3f66826f1046a0ea3e00078eeffe6b1c34a8dea0f68f8ac03900a0311c95fb1fdd82c852110e0d4c29b1f852dd8da978b96d520a2f2022cce56b0aad5cec00c8ee3a49cf37f4fa6cff6395d4a43cc6fdeed67b224e2c430b63142031302f04e4152b307d7ea9aa94afe2305b9a2af5335c1c72eb27821551084f36a023060475c8378aa4b6e9fb21a5dcc1a5a088fd868341705d05d2a0045c835de11020040339e07e1f4cb10fbf3274cdae466b355b49b7c7898bf90f011bc5f750ae2030623a4054f43adcaeb6716f42fb8dcc965c182614c44d4a8eab763953363d1ee02061f8441a0d581abcf67a97a0a5382d1187bea64943f4f069e14fa97432022b5d86ba48f7354ab0dcd119c369025f85b34c28d97994b68269a41d32a0525404257232e166dc6f0f2e36c03bc611f8ec482311b206cd194a4a60c470db32836684d5cc400f5ed4879860b06ed1b1d8e45289528f13c9124c10880712505ec5f69f33912cf5423ce2092a748bc4b9c66391cf3f7ee151776843fc72150c227457759d9663d16a999444f041d8a6ebd872d849b04b531364d4aad59dc61ad1e7688c3e8dd1b4d72ba33ade4a070ab135c2607a86db1541b48ef3f8fbab9d09fb3568e4c0bcaff1483867d4068bbb8ebab2cbb34ad46499cba06f2a982e3b847f012a747fb0b1b558d73bb6648d75949786f6d045874edb9a918d582fba361de9153d6f2f61bbf24c060027b7944a895a7dc59b71d322f359875406793594dfd11c8fa2a7542c39ffcaab5e9d0ff3ab7c7238d6e509d728bac7719ca5ca24fa9f37a6863580d010189e72b73f1db7c61f43d74332348434f046301b54bbefdba302bb5a290a764ba230b11a8248ad9807b25038f22a87f6715bfc47cf11ea76c1b859a2da392aa4678bed2ac8621ee8285c9fb632593310ab287fb7681b8a7d4e3da23d5ed177fc171482a385319105c8570d24b420023e039045abe30dde8b22e0a22636fa09b4ca18c5e749f49774ca4cdb9ff0af05ccd3506b4835ee9a2e364308a5a96d19edd02ce75e8798f109df6c1a7b302c5f0e3d776a2f8609e678bce46edfa9c2dd87b629527b76ab0561721e1a3ef486e1dcd6f4925474716e67c829f768c8764c4baae0ada130052210c4baaf057d9bdbe0a1db9f008ea909415d4db6b248826c8bb33f7eeee70b87de436a1fb0b076c2e08da33bc3d7bb104748168f72157df2bd8f5474ebdcbf8240e6c2a23ee1d2e564a77df10a3687a96be4f6f62c036fa89e8e493969d58e2f06d5053a015622a3f53a8100b519c42d8507bd7e71ef39928c865cf87bbc88ab44734bf4bdc0356c9e3da446cd09296a18a537757b66ea72ab2165734a2c139c12ca731c5f7ab777b4af858510306bb166ff7654dffee0fb5778ed3e2716ff7e633e451e64d944dcb7791457bb59d9d360bb4d746f7ee2f8afdfd2dba602e36a30ef28c1291067050373363c33fdf8b69fce18e3016e3f0d205b3b60a3e55a8f02eafaad33039fa81039576eca7dca49eaaf03b7a5b98f4964b029f6b04393525669fac3ab76914613a92b68ab3cf38389b09bd05ea6d6b64e87b0e4233ef169587b0cddc109d990c29752d41dc8b82d24f6ddeeb45bc30cdca241c789fb8806e6e3e31950c7786c571b144454d2da0af3bccc2440eba3007bd85f4960e959a189e61b097ef77083a925669590e4c775d0fe8be7678d20239d18c9948fad1a08cfc0f7a47cf988bf4683f9cc62fce584302507843417fe2451bef434ef2375ecfab4d2e0e818a1195b5b04aa36d09c89b81e226065ef47cc60cd33bbc055227dfb3cd137920888edf91c4c958dd5cef130134daf5c2abd1501959318e3800f6beb4a0b60299335a75b2d210c1db66a8fbc22a09a2a112630e4d75b0b242f3389d051009ec24954f8f49999e2bb89c0a33367ce10a931917f1914892c94fb00059341ff6d14c6654dff42b6970792d6f3631312e6f7b67d152045ff8e4e8410b9ce1ac73ec965a601e9aa0a6d35175f8c98a690423471a606dae621d161b29f9f7c188b73af645b38d050000000000000000000000002ec37d9b90411cf3664d4304978843f167a2375c5b434a6ed0748733ab73edaf97b9a899869eed7fd873c131ad8a2504ca48bf70c797f287f8f2493e4678fe67c352288d40e29ef839ab1d086f83fd14999c39d50f9ef916a184acea572c8a810000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000097ccfe017552dad14bef07d65b651eedae88a62baf787475f0339232500873a6f26db3b44e35be90dac65bda2f74671bfcde1332f188fa9d0f0c43a83b5e270b08d7a22df69916e854278215952b1a494e12a7b0152b33c10a188a93142c707fbbd39ddd94eade57677e90d6db0220f50e46ca70631aae80b5c976408268fff10329468d9040779085eaa8ab1d831e391cf2d409bf56af36cd9954afb2e144ec9f032c5fbfbaf4f2a5c78a2f1933c12b59415c653338199f91f36a14ac1551c8d9d50b05a0a1e7a42f6a0b32e48067de3d4b7f71777be94fad29411fb429da042f44bfa068cba23d50e3c6133ca71b45d86a8b15cbd96e4ff59f1310750996380b96e1030afd6a1c49126aa800319b39ce9e9e2de9ae18c5d24cd4df621bb4d56b8ffa40031238faadf3b9f2d685c3afc4262773557d2b9ca4cf5e946a11952bb344b0877a031bcec4e7141c701da1dd8e51a935c7f6493acbf1406b7b22151f89ae8a9dbf5f0221c45dcd15ef60c03b6703208e42c789b3d21822392193d9680c5effe3f76729020aeb36e1a8f509733bc75f272ade11cdcf882550719272efc5cf2e813cf3982c80ba1feb4f4cbb545a82ba58da9f2600e825dbbe385c3895b7e8ad9df90b4dcda46ee713c38575b2aa554d14c91202eea38c74718a7e87086e972bc37356dcc61bb2f08e4524dad8f83372cdae59bcdcd039b5bea8e97ebd88bc0d7311c9d1e9be4861cff73586074c96b110ca261631a9a5de7499cc1d556d5cc87b4c843f881970373fb487b527b4f0c8775cdc5284479332ec69b9298284eecaa83dc36259ba6f5dda35081c08c2743d6551086406237f02d73e255afe84c485f662ca258f1f412a8072e497b8fac7b907b40eff7b01ebb602142c89f149130b97de53c7aa6eefac12734a6480e86df1e270020f99829398792510065733aa810e37377664b29dd8cc0ef5595b5618fbbda062f4e31f869c8319a5d99f59d09595733e9cd351bf1689453ec15393fa490cce372becb77117b6d6a45978094959131860e0284ea07fb0a7629f608b718996090e2b13ede0ad6b8d798e18bf25e4195b7df67fad3cee0ed2d67668d19694c8bc6442abe30c312f75815a78ec233310f35b46ccf0eac4e9d39259e6390645d1127cb49931d447772c4ed1c30c8f9a07ddf0fc37c93f9d7a860c5cd47b4cb3dbefda496b86db18f4d73280a6e7f0d1add24b3a80645a8ab95eb1504b5ba1f6acc2c03d0642e932f9a4bfa0299142a3b8af23d6ea4bd80a0c1046ac8963be7b01d7ef3b95502d1c6b85c64274b61b1a78c54e6c762c7d8cf70b42047e4588bfe1c2dddb9baf8654d07b5f614315ef14eb2a3b7ef87bcccda53b31a25490998f090aee60dbb18ca11f2ccfab83a0bde32fbc8a28805afe6ecfc3b11bfbe2c450ac77be0557f29eadfb4de4a2235daa02ef4c928f6d10b0d4ae15e75cb821b04e2c39486304c3197333c4759b9a1d0a2a8d55fa66823c02eab5ccc9e2574dec1e665ef8dbd6e629955d53206b08672ff8ae093ab501a7a5750207962287b41d128cbe7a9b3e34518a477f07143a3b8a0dc6b243da4513f45e2b478d2eae773fb2c99b113e197bc25dfa89fb91b5379d5b95460704f0ee471375f5ef5171a76680f48e7eef26caaf2373d705ca5edafb84599a56e8282b91e78a31383db58e86c55cfee5beb41e71c159c992630f9ae359afdc5764e05fdcc1475bd6b19bfa29869105e7d8b56e6d76fe4a3f1f7ca24c55470126c9dbc58a189d8e7da65afb32fb8499a8486328b761fbf26e6620bcc76e4ee48eff6e1eeb93ebde5cfb60a7ba5682453a82441174467cb6372264932dcd74e07172552e08543483592d9931365fdcf0c09b7292229846bda1f36fa8474da19c399fdeeb5daf008abb84a0c3003961fe470791dd51395aab8c5029134097d141bc3ab0fe61aaf38ca235941fec61ddb2963b783c890aaed4bcb8e150f177c2ab4ded6db84c9b65861394c9282e278b9a58e9b30eeb3dfb736e39d2eb2b0e34db6783f7de4e329ec1db17c36c45e8bb0f5be72ce69d84b57db2c1bfe4a5ee090ca0a6ff8555fb6aa36099d17dc069bfd2dfebfbe35e17dd0b9b4434208c1e6d93813f3ca360d0531452a7bc7d2c26b72e5d2915f0864a822f2ebbdf57b128312f7679177a7597c5d77c312ca9a23cdb9689e7fcc9bab518a96aada43c41f595c3f05cac31b11ae8a8036af22c3434e2a762506d6c9d59171c44019f8d6ed4ebaa538b3c008e5ae08918b5f74fd62b0de93eea530d633fbe83d153c8ac4cda512bb45dc3926656bb9fee4f382323423f253fdb08a7fccd7614c403883d56c9370df3c0895dd805bd6f77d8f9c1176160f29856e25f24e2d0720e1c43847feece4ca3feeb606908820bdc57ee44edb8bd4eab6f716d08", "53", 0, -2001251959, 1537743641, "8b437a7d05b25200e3eea8c3e81f8820fb28519c7fe0caa80597c951e2faeb4c"], - ["989ad70004472389f678e573e3565c32db111e238c5acc604066c788ff7dcb455b9c1441d702000000026365ffffffffd9cb3d4dc8c98052127644376000ba418ea862dae6b4ee629cb40813406c0fd703000000096353636a0051656300ffffffff5dd7d6d4144e0d3f61ee0933ef42431df9e642048612518957235fd5c6c302c20300000003516563ffffffff2eb38db866ee8d12af41e4439da531cd93ee6ad4d8e5045204186b41c924871103000000008c66b4760134b8d6020000000005516a53526300000000025285660000000000000000000000000084ab3fd39e171d3bd3583b83c7845e94bc50cdcf83fb2fe5760ee3938342151155fffb8f787bfbebaa20a5fed1980841d5ef1e27a930195cedb676b7f5df9a559046b62328b3017496797de0f292d8d880678b9b9244e39bf0b561df5cf10eba00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b32076df7c272cc85b0b90a0dcf907c2410826ce7d83e1ee9d6f174581b03f9f9bf921e7c73630c8a7195d0eecfcdbc57103bcaa1db369db7150c350c4bc3b512c92cacd878cdc12ebc4ccfeaa79d0c724e76a3a6afb3dcab810d7309b42c8ae674110f8c34677ea1067f5ae89c2b3946d1a7746614ca30e6e095064437bdea4032f273320d374a46577f3293f471d66188e047415cbed35e185a2a7f8dfc1f4f10222428e0191daa7cf5a1f7951f83b73326d8df01b7504d7c5d9f53c23278ad5b80a037a7993f1e546afa0b2d3ac75619c746bf1e0288315ae7c314b94a8f15b12954d8226319a725b1cb8d2c6a0814d61c42069b9038d45d3a14563dc60e97272ce020b7087e4532284ebdc4fec333f936077ab76e1be1bb7cc4a3151e172ad42b056030b10b19f9ee8262a2f68efaab8f7a7a19b2a079484f47ec21553767d6e4ecdb3020c542be47bc8bbf07aee35c4442fe585ba64f6047a7b40fe84ab174895bcbcff02194986c7317cd568593c20d8981cad8b0d05dbdabe15d6cffc7197e1e96f425c031304a80dcfbcd750b71fd0b7cbcc18b4bcd91d040bcfb52f3bc1479c9e5d43a9c74e6f19e1ed38a2dfc64585bd2ee0b0084c515e766907af0f708ef101c74b6c827387156e4f051d0f9fd9417bc71aaa05e52e2cbbdd2e5497483dbe9ede240c89595face58297a851683c5d6f13431d2e01f9f3e8a63784d0f6e0132b39a6a48a8a54639ed56c9b73b49f09433a89a80183f3069a2d1f50c2afecaaeeaa21af8390f19c2e78732a5acf253678d64681f0fa5f3b42a364aa2222944a89bc5edbab5d3e4409c0707bfd992a978108cfea0d5b49a8753f44960269580ccb04f2fdfec373dc99bca95ce3e460b5f34b2674de19392bbcc05de75f835b2c674bccacd56ebe78586b10ba1bc178f4f3ce2cfeec394d1781b1ab86bd8673903186296de7d67cced6ef3845a87b75bdca5d703fb39d7d804efed91ee2594e2209f7fe020c4c29a22e472abeba0f74e79b3e89d77f30a0901d57513dcb8aac4eda8f8818345ec4cafca2183159ad6bee19d190240d7e2b9f6ae5a4ec6964a33aad74d68cf41d17bcab816f3cc8f0a54dc25809de3fa99f184e9123ac4564f4bcacf7e0e74569d6ac756b63d21fa1c7616a06f54ab52c8d5a7cf2e5e503aa03781156c6b898061dc366aa564dee5da8336758e518a82d3948075a657ebaf2aa9366e696f138c5a067e954a40a8c62b589d9e9a337b67fffa2a08d146cd03f07ce1b103da8b2f0157ce3dd6b9f450943d9840020ebddce1c60a6eb966c21f09924536686387c9bbc2d4c7ca498901fad7f67eb6409a9e9213a669fe45212dc62709246c343b752287a41da06a37716c9615417eccdc3a6a272b15c32627a3bc22b4481b38fa8c96ec82fd8c14672b48c98901cbfd0ed02e970d16bc5288182ee1935439ed392e15ed340c81d55e3473580702da0d04af65650a48bf84bc01a20549353c06ba81a958a8bfeeae4824d4e0b93a7d4ba4c07dc3ae3077c01ac3a19b96d25b6d0343c51929c9799a7387f89393f863b331ae921916541d4253d8a9da36d5fd7d18ee25a03f97d41ff221fc3495e9e8c2cbd0d2e4f0ff4e1efecda9817c9c8c19d6fed0425f4c9be5d325235d642fc25d48de21e4fb564110413ed1010a5e65c7126ae5265c2a5d4af98148371a80e820dc6c567d7142a3808371b547cedecc2c0f44294e0a1c7a2406f1cfcff327ce4177d2907478a88c92c595473cf56b70573a12291ee7fb4616f8f831e4f6140316c430e57520b9c5545702005e4c4260d463aaedbee1c0b6b834b3d58bd1b8ce51e0c1ce6b633086e160869f5a0be1e79a1e15f68796f1ddade729ebc09ad8f4b9b032092e664633b934ee7bda90bd6e635f2c29ca4290f9e7637bea3f0a263dc869b371308684af3c585510f78102324caed97c0fdd3bc6d6f2bfe707bc6704d44b1d8b8c60ac31e936918e80a9b23b2447fea0aa900dbabc2e99c609c1e1ae2ddbe3573794d261104d3067bb3dadeba08b2a7ff4dd43165ed57c2cd69614787c79f5707ffef9dd6eca22f85a5c81d000a18fdc010961122658915ce0220977418bdcfc60fbd36704e95a1dc18eba6f4e0a78dc28b6669614f25358b128791b4d3f6011d82d9d1262affc4f60ea537bff72907fc487881ece10a6287bad85f761f249cc03e10f655c48e4ecbb21ee84581fbe3af3a82714fd77ed360bc2d62f4ed67fd78ed97d648446e7d6d9183b38e4e00785351beace0bcb2987af68f90ca4b7ad012152e03000000000000000000000000ef13c02cb60480ed279532f3f83cb16db08eb716eb1b2b95fcfc76ffd92128e7adf4c2657b0a6606a4e13a86e4e4c274ec2335d5bc0c0df37adbd242b95fac56a1cf8996b14e9f64066e4419fc783f35a49b7ae874464e9cb3b49f891543548500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070bb2fcdcd7153c5f229f05a27045316a4b255b718f23cf7f89e523478c401583ef042ae26384d4e98a0ef9c1268962f49cda7738c14ab5a5622a3999cfad8e96694d4cca4f64d0d2693055c806eecd08dd9ef8c764e2e56bbf2c0dde7ab2441e3fa9a19e6c16dfc3d0be94a83f95b9c27ef38a3cf07b6fd1919419e32bd0c102185fd3985677cb0df9f3c201b41120f787882fa5d8a09745b7b9904f09e00f77021649e315e5209c28b3defb9a7728adc5683755e7cfa76f19a54d70156559f4420a0694c07f0caf372de3515aef904c728b6e5a6d953989f5f7bd262a7f8baab1243c879777f940e18c71cb68280cfd8ef01a86676db405eb47dd379b7bdcbd96460304a406c5ac94a2b492d6f7756f2c0ee2d9a2272ef4cd1c8b3a93892e749f701102225d0ad8f58ef8d637a648c83b85a58db4c270a1dbc4d34ca71a7cc2476bfb160321115ea33fcac78492758b7bb63de0c30abb27fa3234e95ebc57787e6e39ada8032edc342eb7638349f9e7a637d55d5841b53d4c2bd250b1453c179416e39b253a0313c13b56c4ef3ccba634d7d85bd875a60c084c2139e3609e9ddc65ea197d7bcc056d33d7e8dcf92be5c1a54ad8f81082bb6cf3cacf3465ea1462a798f3d6f72120834bbefc9fb31341998ba9d3789ca3ad40b1ed33791efdadb5ed3eb6b19aa9afefb36a1b82d4b0b35074841840f785119594f3c0284c6c6662c9f88da8d66e5850bee26592533ef460679358625a01914a76e64e6c3c1f79343b89a2b88caa6d4dde2fd3f29324ff0c43e11be63804d07031453a6422294c1e845453a81990e5e2d6683b9b3d986949cee143dc8fbd23746de5597cdc7b5d1f2c8b756266b62e28c2811b57de03b5e55db85a8b3a090beb73e51d623f625c1c8a3104c8b9bf53e2544d955439491dd7727e014a684c205f9b8cc1d584792cf89305e18fee9f1405e9253d88cf20de32f08c2d27218196a3d6f6412350652a68ae05ffcc57d7f30d894a179673ce5918858481053242208c1b9302df99c30a598c2654d55307a5a9ef404388a4628a77e4825c5ab5a105db2c93ab711f1c2755e1a85c7878c1a1da3c71fb2fdecf75e56c0b8af81901b47a179db82264b1315ed9f424a7be641e8ec13fe004d2699826e5b12a4876a135a0395323996cf669f2f57db14fe43ca57d8f5e19671c8d4dfe80ee99f92c0f196d443b96722e0a1517e28c944053121cb6201155b548eb10940fdaa19be96e42e8c9a4d503d102a1810b9562c051fc48dd475f2e812512d8d5e9eb75d72a7beebc716fdd95488a1409f9496c253347d9fc192c87155e74df679e02d5bf1c4cbfad64260609baf23109ff251f005aab5674b73f1b0958bf127863be9795faa6d9016c83a6b166b314c4dd5047a9d2416f969e9e6462d4a8c240635de6e553eb32f92b71f69a1ac29cf2b219207db2113798eded4c860f11638b07de86ccad70e5acb0bc1656a7820d3403eed61504b00e9b03e836fbe6794b49f21cb3d5ef702312e420ac141f691523384d4b76a016b53d460848dc921ee19c095817c89ff6a20061161574289c48b5b3a5a60caedf723224c548aa902a2d4c5dcdc38dd60a1b96ead2b2b43d739932172c771bc4e819a04afffc5c7d44d1cfa881357b628400d28e8bac70f0b2050d8acac0c171cf20fa64111b2769b602c13ce41512f001917479e0ba40d4d6c155389b92b4b3ecef9268ac4b4df68a0f5741708863daabb03af0a9488aea049213a7f2770c5317b0df257a3a5041532d6ea05d79b81e0f82f07d78b9e4b1af526219251ce3af9350fd85c621fa8764bd176f964f98b79992753f93037a367134a6208444019a7f445df0fc1ddb447b5d857aa5ec4153f0d75886539905d48b8458fbae112ba13d0f3f2163b7e800d1df37f6d9005e54e4e0c4064b1ab6ac27e03c6295c7ab7dd03884197c397698d091b26f1e13a91d43cfc6cabbc7c02e384e7713a7b6b5845c5875ad7527ec8e4f8a160cc8a7b8fc2e7eb57620e7e46f36261375f3a76e05af30d14e6dbf4e687bedf1dff26df9aaacd8874d271cf17f1b91d42797bb4eb591138c7fa7cfa21c40a4deebc3da5319db17960fdf2ce5e36044e23aaf6ec91692f00a0abd9a75553276d13401594d73b6ac2d948a100e374705dd15eb913807e2fc12150faba2dc4d6abe9e9cfa2738c276c2be37a67836adcb59b79260004b3a43daf1a26b367b4af3cf337d42702df6e1d201df728e1705dda120215a2c82d902d82e55c0b008f37605b45c81b280ad3172029bbb729e3ba22850fbded05a91d3785593eae9eb1e10a09afad04c4e2b5d6d967cb6959e9a33cfd0e19ae9e2329f9b86fbb793425daf489a914ee288627905d9d17963cfe600a7aa887a341e34187040121d7fac87f3885be77ff46b9fe809", "5152650000", 0, 1986275034, 1537743641, "35d4149f943c019016f830a91166d63342e127a2818979d6f5d937b24374b383"], - ["030000807082c40303dacb7ffeaca57f3dec35dc35977f8010847df4f27e852a751cc57c9870ac1a410200000003006a65ffffffff4c52db48f959e229cf5364317000d1ecfd5c10dd4ef171da6ac22e039144c3a501000000085263516a536a5163f1159602bc958545e1250cc94a2221a5321fbfad43f693026329eea90e6eb6707865aef603000000096aac5163526a516a52a816abf6010db5520500000000096a6a6a6a6a5153ac6300000000dae09fd2010000000000000000a8a7b3030000000024d839ad957e938c70711ffa299a141d04c89502a5fc01e2ea84933aa2fedf911c9619f19e8e5c721121cc1d4242c6c71aa9c4c54324a7ad3ec2ed7ff1d46cdc656089bcb1bfb60501aa6db1f64d2fcc30d75523f1d42b2b18aa684d6cbebf88000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006a563d4b75b5b130a911a30dd7b4ae49cf4389bb53c8b613f03c7c9dfc95ffe1f9fe9eab3cbc36d9c3c97ab6f4f402c6894ba19bd9f618e351b3abd523422639795de8cae74dba4a78e2f81ca1306979c61e8e98a7a791f85b1edf4633aff4fc9a93a6054c6db3c7d3bc59b8bdbe769051bcab5019ed93a4deaca2d21319989c0325444f6baa40af160ac001d48616c4b00fe1c21ed1c90503fd199c37dba841b0032961c1b33bc1bc0b6528b8eca41baae2fdea1e0aec38a69b81963276920299290a088132f40e7c228fef77f7e781d0100c3a72783b5876d3325ee9747f0103f50272cbfac0e9861bcd98b5a9beddb5b2f3346a454c1494c1d420ccaa02d679a32a021e8e1bd1ab0cab1c7adcdc86bfc84c67d45c705134b3cfdf2cb99812e9087bf70313c8ecd2107ef43340c4a6d86d36d72f67f2b54098917904d28aee96295b07b103231cbe22cdf933db65a5099314e398df9a5976c7631e0c3318a3cb0de9653828020fbc5f2b3ee5cbb24addd6a86a8fcfd1533c7c81c1a1e6ded11b3b2299acda150213e629cc374878018b620157296dcaf5fe2dc9ba4110c78efbf6d05599769c857e5402c3f0c74a5e69c3172c0a89bc9f80295d76d9a30b2a9ab42b44e86d36877d97070edf048e8a98b51b22442caa013cdc715a0620f32e7644c55fd6457063168d3deb7c9d516346561d9f074ba908f2b5d6fd733df0174ec2446fe6f582d0e7630c1bd3d3b4f68689bd83cdd7209354339db8b4ba78009fbc05376039ac62cca978eeeca4d4c067439b4a10600ec959af299a3ea0bae8b19ffcd4c67737ebfbb7eb743d75948e754f22f324084cd504fb9e11f2c21ca9edb16fa2b1deafae98c631abaacb79ca94e115c72e7c6c56ce74dbf68ad79a79ce4c471f97420684b64f510c0cf229ef2932a68014f2c97f5a0c4c230bcd97e2ef308ea819c21173e0e52f450fb0db801e914e22c3db0e47111ceb3dc02e23d370586aa3e0df8e33346d3b34e661518791056e2d50b1d7d03ae1544bc794afe255e15fa689adc148f4d87184814aea9bb27945a64b98801fd6eb0a4b4468ffba1826e5f13f0ee20267f3127440e155f5e888806069a142edbca0cfb71c97d9f2dc40983e67dc1198c4646c0f7bfb081451133031b8e6fb52253be43ed0a72652d2a255d89617f8ea7a362887ba9682b02fb974c61d70477054cb3c569093daa5847d1f63d186ff62b4bddc6c240af4577dd0efcadd9dc608498a8865bfa288b5e0d75f0304eb5d638fe17efe9935947cd427358dc5eed02d54c1fcafabb3ba46b8202216c2bbdef87e338e457ecba9a95780b7c636ef34c34dfc044460bfabc53153ab4f8bb930e22208ffa7687b7255a225821e5663bfbef2f2386295cf19cd7687b8b712517755e639599acf51230655a8ca2ce572f252cfb8c1433ef2f98e808b3bb24a370cf6cd5b71625cf46a908102d5f6f961a308effe206df74ad13d931f3d515f620743a5699e2f87308e53c0ebaabc0a82e658e9d71c8c373fc27a48406dc5a4a21cfd047624af730f5613cbf9504001ef00ac9e6817ea94326a002cef281b97c2b69bc56825113e8ded9de577970744e51871e87557dd24ade8beba867dd7a9412212f5bcc8de5046d9e0306cd0530187c50af9c8049d40a1dd9aed9cd9469884cc1b89f879dad359326dbdf82852bb4dde274c0d384d1989d1cf46f1040bcdeda9adb1484c5099d37d38fabc48cb4a63b9fc3c8edbc31b5a35c9551a827cb0a4b28b0bb8c360da7e57f1bc4fae8c81c7a4812862d740874eeec34aad4cac03b471aaeb69a345aecf9671387a78ba981d02a8f97260c607f6ecd9c87068ddc2c393dd3d2f7c7411545c78b17ffe02aa347c878673dd1b4749c0ff17d98644afb1e718df43254091378ba6d5473dd52a4f9a0ec69dd25099c6cef6ebe29eaa515996deb7df94c8df953ccbaafbe2717ae6bfdcbcb4e79fb2ab384ed57b3da33aea6a1f06a6d5331fd21a1e6e3a3f094396413cc456d58405c03a40cb5b36d96e62be6d6e3b3ab24ef95df02450a16b4a00c17d3976e40913f225c43903c536fb073903f649e2fb4b53a5bb3eeef9947c3ea6c58cb8edeaf2bd22853ed3c53e1540649804f0bc53dd47db606278b56986b45a3a772a6d79aed5196a0280b6d25fc47e427058b48fd63514f38657fa741a05f2ff0c0666225a471322cda24306b6025e2d458ba02aefbb07470af51435bda3df03d8f10b5793f9ef31be9b6464c58a349d2f49594aa80e968db2b9e3c1383a320d23c36507076fef6e3d3ca6f3958a7c18c41ea7c66aeb789832657d67526997085ae296d79474d42b43a82f66f51ef471c83db028bde2f7d9459d326355a18676f41afee92c3f323565689c49334c10d4b2d15b88e172c72902ea961b85c796fd6c09", "5353006a6a63", 0, 1406849082, 0, "b3d90e7c15582d6759eb6abdd01194b82df2b40c5008d7c41f4d8ac2d85afe6c"], - ["26f5273003c4df62a20fe9545dc36fd62a6378c34094b6732f53afcec0566dc1b6d37c270a0300000000ffffffff8842b9e1197a3d345c39b57a72de213468fb3e81d7eec070fccec90624aafeae0200000007520063525165530942931430f85351e7e314e6e33bc1096ee532c46b6a341ef03be26b8355a5fa5bfea9c302000000060051ac535252ffffffff0189daed020000000002656300000000020000000000000000638a2500000000002c3c228cd6903eb7eca6fa3c979f380c9ce1af4e2c94304f5ec7ae5e0c74296b1cab3117f23a69c932bdc83478d8dae2727d7d56e0f507e6d2f746c7bc84e8fd1cbdc0069de123368573144b910b7ca7c7f58071eefdc4ed0f99704497ba4c99000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008ed7913bb15431bf102919dc49db7bfbc3108d4121c64784254a882955e05b9cb89f44ba89b61c538294863f9f2e7190407ad73bf1aeca8f2e01410f25f25afe504c7443967314490f6cbab0188032890ca0595c8aaf89410123848ac508095e4bbcb6f6f3a62b47e44534b5e754e189dd06a606082bf438a28c4719e3d054b1033009dd666a7e0b9561cb1b3b12e947a0d1514c55240948d2115abdbbf1243d400326280dfad22211c26bb3d7b1b231e514588dc984d846534cb67eee579580f1640b08ebd55316ddb040ca8326aaaadd08e87e5cb304ae2bfabc3fb50a41353211a38dc9a436b805d7c4d840e52681f27e1c86dbea8007b174cc6fa2678b4e220a880311620561ca06b287f71a408f33edb7deccf4ea38bebe08ea7fc67212f87504830206019d59f4e0cc15d86bc8b00f2fb0688f1a414bc49e52d457cb6232b7dce20f031a8013431bda0330a83398cfd2d8c010758d106d9f89d621af19f47c5c9a8708021ff14b0ad22ca1989c9f4fd5aa42ad3597a58b4c75d1b7cac65f3ad74ea070290217bc7b05d64accf86bf6590c5ad76ee34fbc6033c39e261d85fc2433df1245e42558350392ae6dc47732634b0635a2d4504ed7e68d7468855a3e87e9651309ee9f234e14d7798c692c70bd6cee108076a051a9ae49635a5a4418e42f19d9b6d310bc88bb4c01d3296b20b31e5e583b7a680415e39c86cc23a02b28e3873c83a3b5df93b377b2d4ae1c0c39ff437fa1eccd81488efd5be8b74129ba23aae82a634a298109ae442d8caf17c12659a65ce68ec609f52b453eef23deb8265dd745130094482093179e91eff75e765c431df3809cf1fb3a5005ce53f6f4283df3efd8172ba0399d1ae57b617705b9d93c898ad5768de8ee6a1360ab294eb00f93ac6324b76bd8708d2c651a3c1dd4709ecbe2bd87a74439d22fe7c3eb17791659b9c4d79e28ac6feed77151c0e2132579a0a545ac9ec95216a33e81299fc62b30c1fbae2fffaecbfe43b76ea00e007223e38883d5e9c9555806ef2c968950812e5ff2996731847cd77d99ab722226c4daf2a67c614ac08696158acbb87dd319485f050c93e82c2b074e11b5dc975d8b5b79fc0bff13061336b352568396d3ad862c977536c9c99ee7f5ef14ad216dfc07bd914f09cee9baa183f9253c4269d3d032b0b66b4d23cfaa2f10abdd2abc0b6753c9bb36f46894e725eb5cde00d33c78129b85cfebbb0337d27041160e7a6097d01adec31ca8882a1ec9d06d713485f6c0b133136afb9266d39fe937a516bdba14f7366abd89e35649bfe25c8ff83b7c0dab0e6b5e0665450df2dfca227bfeed5b1896614033d223339898f807cc042228883c218a5bfa6b5d0495fcb483f603c80b73867292682434913f9da1a6d4b9196f5c155bb7396e69f69dd74c785255af8c859299df24950b9aaf529e69143e3c51914c41813ca779b8b9ab993bb662b780e64e347b47ea224b58f9ecde41acc989478cd5226e3947ce5219bd681397b138bcda16a480de936fd971a2763884ad7f7ecb57d9f631f5cfa0cb1d40a491fc843a52a0b46019b5a3c182fc37d3e7753fa4d770edf30da31b7708f2b864fd461de06e45adb4766e327ecd72ba440eaf632a6ad30df6b0ec8a023707823a49e494c199986002d7878076a6616ff058788600f51379fde74b5ce049d5451c32a7b9034d9df2e2b1c5f1a5a6c9b15b94f9a4674fe6cdb415207c4fc406667098ab31802901025bfd192a8475fde8ee8f648ee30dbd20e50a2b6667d0db68e5534dd3f795ac6716683837b51ca8f5dc76efa7670a08e26ec0e424f02d115d3dfc7635f106dcb9d4e540953d3432e4ad71552d14c3ca381f542ec9b8390d79f18603b4642b56c254ce97258725e05c47e937011e8923d98437caf06f2fb79ce5f4f2b0d3fee24bc76270870ead9de16d6fb9c28f22325cb9eb9876c5813734532a0140223fff407fabfa8a982de4be902a975e0380016a6139b13f04a3f0551db177af4ac6a572fc9dbc69c9c88c343deceb110302df0adef6bffc121a96d27709631693ba6ecce59374bc5242ab841f35dd69ad1ab527cb41cc51ce90297cc356f6c154feb7589350607db8fa156a1ff2186427d80d01a21989fe68bc537886ec1d6cc55d718f291cb61cca6e7cb7318bd1ce14a57e12dd5c00988e43acbe049d36d647cd98570a86d15f3b4b3bddba49d052619a4a49697d31590a83932f37d40619f67617f3e02766eae1ed572fe33170f92d8dff832970a2724ad2a24c76bb4b0b33a1ee2c2d0100000000000000000000000068a7e3d724e562d131c25239de450461c5ce2dd5d84d97c08ab7b177eb140a5f2ee30e65dc2324dfcc86ff78813af3572ec4a0598512e46083aceabed34fd38afc73001ef98f4f0db491e87d6a973d35536b031b51bbc098cf9873b26ee89b15000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005200d5c40ebc6fd7829a53be81231eef958ae02c55c49623457519230a8d798ba8a624281d2e9ad8e9b124d78dd5fb2118e08ba85d163e0abae414f748a0a7355a80efcec4f466070d2102125e3ecc2a1f8253d6ff8636db8821e666ecabeecf8649fb0135684f7c869823b95e252cfc782d2c07e53937d4f4595e2b74be347a022dcff507da35c4787dc889b106c99ae7c9269df7ba8e0deef855ba16b686a8a7022cfc840eb081f377c9d2878f34a8842b66ca86c120b84cdfdf0c184d04b26a6a0b08a305ac9a174ab77a8f1eb0a2bd8c6de914804c827ec93e47b8e296594f246bd513998f0a9d9acc6c66bac829d302a2dd3d832b864006840f9b5e7cdf8cdd0103161f4a3ef079a873cdc3209a819d87174da851a5ae52c1ce9cde5013be0b86d3020b1fcb45954265b266b672da1eee17f4ae2acac0bd8960f927473a0ad0fb92f80221091afeaf7e784f9a205177bfcdc62ea27535a5ca7ef413487f80913c1a088e02188c86035b9511d5493aff5b8ffd397c8bf6a31ecc3cf5f0c8fcc3aa1784a3c003215493480b315c764a4a37d8f543009bf55551d9d4ee47955267fde2863c5642426a63c40c5255533d8e1c6b9b0664199de251c412d5a12cb147c2313e11e12c4e1c3544de2ca429cf223e5da5b2c9c09041698f8d745d09d7a665ffa7440dfc8a4960167942003c44378ea6d5c875facb80842aa052df1bf2a06efd61e89ebad4df4e005b3c97f66b623569fc5062f20b49c63d5ed75fa26e45201094e7f4c0d88abcc63b2e47b5f5c44c730618c07200b56f220878778834570710539696a0690682d1a4cb53678ce89101652d927ab37f8d1bba6abb0d4e6d7e2680f0fac8524c30e0ca71eff9b8e20ac4029b009418d3a920d74485b7b90ea7a1766d466bc69caa850301b936538fb9434ba1427d54a929179d2694161a1990693323a81be58bbba9b8894a91b93f2f7f23d246f5f333753c954e40fbeb07fde0f5c77a1c63ea51dac1e24fa8d1e8a3b67aba35315504df24f4d8b8025ccc0b5089be6f84ec21c8a4adaac0d9fb63dd21ff112116e8cdbc489bf306add8daea212252414088a53764f6ca5013614544a498d5348d96ec5f339867c38328c5362637cea3e2aa4b8c1d7c54a75935b666ceea0f810cb518b34bb25a3e73272c9f82e3e30500f39f3ab4e60adda60da93e196798ff4da52f76343920aca9e88bcd7a300fc012d944e7ae872d409d627b4d1f4b918f9d812c52fa438b43c6797e8fa3e52822ad24e4cb21eccf60389f95f10c52858565705086b7d91dca4099f78499dc9b72a30df205b53a0dccf155d5020c6f28c4e3aadfede2253f2469b07720bdc1e901564bd0bd572b3de7109979c2482c2459b555c4f2e1c5272e66c0b73177a760227b63be4d3388bece1df66ae82e73c46390adaebf89d96b8e6fce88d7674b1534aeb14f8a7ffdd3f57875278b121a9239709bc42d14646bf29228889fe6501e7f976d4f3da2f46cb57112ba7ad054314a77fa26b48931d6316896d7699ca47bdeedcf111767b8ce4197426d02c5219f2405f532fff8c418b8d7045cd7ae897654cfc51ee10d90f519ca4741b728c4f89822e9d064315afdfcdf529a7a731745e6f3ac6fd748a9192a823cb8b61a28867e3a47d0475f8cc9aeaf23e236af8631f16e13e0e74b7e58f53551f1a464d9d0a7f83864454d37b58a7c4847b16e1adbca2a2f70dce7435f7cb4ecbe809ea388cda85b124c944b3ea8102d32775f0c292ea8e60cae7b30963fd433a6b1a73a42267e38f7412368163a9c50c093e32809133f2ce2b0a97ec3c545e0951c5e29510a8fcc727ee36baf713ae27f96da6d5efb4d690b4abba29e523dada1b2513462ffb9bf019d3fa8b184d91e0586163e193f732b8d87688bd7f51588a361d35d887c7be52a6ecee2199e01f352e7e515b793949e501fdc1cb33d4e709ded22ab3357263a7024e0fe5d191ae8d960df15fd17f2cc4fd12ec5022ee494b2f952830364d6c19477378fdb8851c0b73e31cf7511c0384d3e669a11293ee6054cf302bff8949afa5696be41868e216d5abccaaca6fa8553f9c882d881c5b05860099f3a01ff44dd0576cdb951c5d435d70bf7fe3708dd6c74b83caeb92dc70a4e74cab0324ca3a3e5dbb05c58ddd6c1921576d26ec076a0550c30231e249846f297cd5c9417a8febb59e4b6d20ec5b0032c004d97313ddb99e3d480c0dbd6fd08783eefa013a65e5023d9041a200dd69abe45846f9cc51aec19e5c40a0f461ece531dfa0239dd40a16c4d2008175debc35a6620dfb0012c6b5efb4969fc095e1b628cbc22edb5e113152f88b375932c2da2a3b1402bcf8a473d21236edc506adcb3084e825d82fff03f95b4c4951b40a2e36476a243f8a6a04493c281794700ed1b31ffd4559806", "", 1, -1772345326, 0, "27a713da4657abe4f311abba06428e16c815e7a4a3154f8cec8a97185d65e31f"], - ["030000807082c403020c8282358b0cabd07ecaf74c2b9247151259a944bcb50cd8fd3fa1d88e29815c0000000008656a530053655165ffffffff7b0be56dcd3b6d61f265e7dc922f0b3eb33aa8b3c71608a82012c2eca4cee7e10100000003655300949683cb0125e1fc040000000008635251655152006300000000f031827d00", "630065", 1, -1189575931, 1537743641, "199c29e0874f89227674915e5d5c6f0318ab4d20b50d2ce73d4c88f846873061"], - ["030000807082c403034ea9803d476596e5b896ad367b958d1b60385cefb92650903e3f71401e3ca8bc0100000001631a72a24783da39abf88d745c839e77f374fe8088843af2cd4b2701c945b6ebacb6e706b20200000009acac526a0000ac6a00ffffffff7dc90ff4a842a9841503e207ccd28b61c43cb7a2124fa6aa5a27981e1b7268ef02000000096a635253636a516a53ffffffff04e4a077020000000009636aac5353535252ac8c50230300000000085265005251ac526a0136fa040000000006ac6a6a655351118c1e050000000009acacac6a630000ac53000000000000000001000000000000000064054d0000000000ecdd98c16b5ce8786513bc6f8bdf15faef041786b84391a9e172547a90d182a8811171359767df0ac576425a5c94a758349cc5619b51337f1742799e3140960f0bc8e1ea05ef440c6501aa0b1c6afeaef046c3c17d6423c4b47423f92362d285000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b8bdbeeb0067095f7cb61d1c561b8770114f3e4cb6c89681a96abe7f7e935218efbb9665eea65f85db2606d2bd849bbbbfd7afaf3eb20d95130a6b478d9d1c3781ed049fdbcf482fcf6de18387d324a390406b00f347cdce9e133270626dac06c94c37211e0e80922d3f17414291f0aad341352c79fcb727d75c108a86c29720313df485d4509d5b1632871dbaeef87ee956d59c40fec0283beb51b9c7bba9ee50313c1000c78609407e6ee18f40e4a4cbb8837c69926a6f249a2b01de46adec6230b06f82d222475da5aa3a958b17b36eb1b8860e940eae9914fd200284215e5fab454f005241264fc8fd63e13dc063456d103df4fb24040ea85c79df017b8be6e2c02259030267e8b660ea7ea4b7554ab4fe5d56869b7148f7f825d8cba5e3b3fad7e02018c9f410dab67abc1492a17566b77081fd2fc9a470c5a0ea1b91beb70df5cc1032771582c2c412299a2073a765f9f2699b9e29f32425d18fc7d2b41c6c4d1f9de0212c5e01dfcaa3a1dafaa7963f9a5d527918fc46075173162ee23bb8ede1ff3d403262e88373025a93541cdaa39f04293cf52a9807d990b259c74d0fd35e556d08bb39311cd527075e488a48045fd43313dc0ab6babf42697ed14d2fbfc8004f373bd99b3352fe39aa742b69d258d75e9c818ce8219608380fab774b46ea3456b17e8dc8be0d505b2a4cddc75c6544174630274a09aa1734731689f50c414201cef911fe0ae6d23920f169993114485de28ebfc96c421e3ba494e689ce5ed43689e76752d72ef6d819e5e5673ec70756c21f43b5c23bebf5b68ebefd96c26ea6772dc704dd26b4025367602d32fb3869bc46a96332823f4a6883974aa04912fc57110a9dbb9622a198d5459fb647ff84845b82c4d0586604b69c32ff19b3dc0baa0a77838177c7cbce02822220326e4276b23fee77a051d5ee3d72d50a2e341d0b24299081cde879ed576a1f428fc0599cba414f1463ffb74fa7f03996a327c9be3f3c5600ef7a6d65f217697c8b157bf401889a2f432d76143bd1e91cfde82cec9e28c29437987ae3aa31786e4870459420df2f6ae0dcfcb39e4d8715853c6cb1a7f45f7652db66b3c9cd44fa75c18434a239990a2d849bf9f4ccd9cb887441876c9d90d63130fce75f08210c4042b1e3e5e673fb4ddfaf8d7a685991ab0f0c4d3083fff557e5b2e1d9f3eb563ba0e080748e990671e32421494836155f1bf3c18cdef07dab667260b764efdfa453454a9b8bfc341e3ac154ad49b038e4d7cff2daf039df2de8d6a453d265cce449f2901079f3e450d820ff5b29870880eb3350bfba5f3f333810cf12aad5a413ab31ae969adf4c00574cbb53c83d6e0b1138a80150b5ecb8e84adc53ff5080808cdd62f443e9d829a21f637c0cbe7e25672c38a362bbc8f201a3ad6c19c6f572c74af0814d1c374e09cb9743865e717559dd887aeb7017f70621022757488bd04b42b3ccbddface176f68f7d3853d7cd8631884819144f9f2ef46e8e279c2ec85edb1c44d7c91452fb852352ef550bc024b6ccefe82b0dd46e279c83494c22faf32354fcc6239935ca87f4a3ab328bd39cbba562f52891d43fefeeb67d769097d12d6fa7f14b24e1a982e42521adc4158da959f50fe6a9056969e48c0b7778ce9c76df8a3d576558a3601745a84a86614a4c77ed027fae9bb42cb937c97e41acf81667dbfd3d767c791170217916aa7a6027d8495ad5ce344ed843973c103a4b315f0d87e1bf240fa657b247f2fa8d53dd9491b8fffd2338a0967216de4f353117d79e6704923588af932fe02151070264f80f9b3b5fcd042d313fe0a51e010a793e96c29ebf80bdc7f17bd12721e1846d7e857ae481a36bdec29796984b30c64cbf88d4fa61d023276d02a9a060dc8380f7c4cb1b645fd4267b967361cecd7965c9b16f44f9cfe0fad7fcc498fc7fbe03515ed2e42921f71beb7f00a0a443d725c93fc6523ea69ad6bbf12176097e97a16b11ab3cae56a3c38bf763ec2b4bbced38a1b2f791bb6aada495e687d26214bd3ce8d0178e6563dccba6448a22f5608ee12289c799c0da22a7ffc2fff999fba3b8fd1618b4ff34834aba0ec25f6e3b9682e9e0a9de1fa88866ff0d330fc9e9baf1770e6e196924b0774efd9a5a17d031dae9996a060e57a6662c94a15322d4625243e2ef94d2b3975a6a9727b6bb9c14226e14e568245582e9dccc38591a6145e6780dd84fb74c2dfb57ee599d19c5d5dee9340f64f3ef1e756684e4eca41febc9190501b0a247c94bbdcb3a0a0fd3343b4a2258165846ea65fde12c55f25fb41373c21585f4f354e315f43bba44a28b2219cc779e5bdd8f30adc1c801d41c52e65d422010e21372183a0643f1556ceee98dd1a75a73a702079d9e85529eab4f74f2561bc6d76b5414adf2c865864e9da8c029603", "ac63ac6aacacac52", 2, -1660238594, 0, "26ec35daf158840e999ba5cd48517f7d2855df78755129e5c164ed6835acfc44"], - ["030000807082c40304fd67490f9bc15057e30c9341536e61f420470686adb06c2ea9688c28599f36300200000002525229b9a4de68475da65fefe5701580c85b8cedb18a0467a458c48932a0dd9b215181759b3a030000000200ac5bcba627a4909e78aac06d048f9aa14e203849e2de8714d7319b744685e15b69dbbca9c40100000003526565c69bb2b268b3aed686acd5c5fe8a0df3aa4c2d9a832b2bb9f29b338df0affa2143e9af4b0100000008ac5100ac0051acac92290017039f3e9004000000000097fa86020000000004006a656357929b010000000007516a6363536553134048c40000000000", "635352525153", 3, 187069378, 1537743641, "7f9c9083699624164cef58bdd6fd0dfa68855b50551ca112dd14b493c3952449"], - ["39d67c6b02c8915b8806bc625b23005284deecde3c4a7d63719a7e7bcb2f9e4f3cbcf537040300000000e2e2df6d283c4201b5f01813d762b16b74c24b24ec79fc55c68b2aee3d17ba8720595fba030000000151f1e6c7a704e0deaa0300000000066552ac5352aca3060a03000000000752520000ac6a5244379e0400000000056aac630065da514c0300000000066500ac52ac510000000001d78da70000000000000000000000000098a4a0b1f1478bfa9a12c2fcf8dcd13f19278e69b831cf889a63177344272798e4bcc6b6aa320d8af0880a236532dc837e295b4f81c52836c5859e4bb07e0b836e3ab11e04806484868f598c793b962b6db13c6d678cc0ca67c54f380c0d6a060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044b162b8084a5de037362cf676bf6db743111edea42536246f1e402b821112028cc8e6848a7725bebbfc19cfec412ca77a82deb2e6876af08888faa949955e56c24a16af1c4610232387d32e5eb67bdecea9d8bade4c711e951f8cd7345cb6fa9b98cb5930aec1200a419cd74f25753b1336224a61e0b413fae45d8f5d19c932021b785c35609ce37599b0cd5a0241adcf9ab889fe51ca278072809d8bcc6a99b1031d0a7226592ca81f7ac4018bcdbe82bbba717ea89c555d038e0397158d70936c0b034254ad35f66d6f81d2dfd44f41965deac5d2d9a1ee24226e9d1d9ef31f901d24006a24782cdbf87ff250c2834042675e1e25c36338af100db07ee254b7f9a5030390087530b0991268f144c9f26a09601770ef18d17972056ae14df5d4ffb706022a469cb8d646e2fee11a70c42daead68f5540a8f31234da8f0e69714740f531a0227c26a430a50ad178e67587edd876624605f89eccd4d3b563f8dc425f52eb625021f86091f4985d8e9aa98c2abc0279aea4fd6166b49020430f8c411860b3fff1d0300fc60dd73f6723f34080d49a3f8c555f1537071e7f7636e1894c64e66da901f59344b5f9948d8cd80362d33273436138b6e0ff5e4a17b4e41a4a9b1f3b44dbf1e9ccd82139d29fd18ee733774f990412269ddfa1d5d06a36a9abdbbc3ee59b978a634946646e6713513e66af8fbe269603b4d79bf946a587a6297d952692e5bde2b3f2dbced555e8753d7b9c1c44f573a5fdb25667beda5d43ccb82b99050c6a3e040ab23998ad11e56d8c0430434078c76f45d7e08522231932acd670843df288fba1fd18861f4d419545f28e2a738c0ab84c0da80dbb3607966c5e8d72f436b5584ec42383655b969d1553cc6ae37cde36bbb244c2b81674f24d89ec08758ed7734071c9b160ea57a3cfd3838ce5a5c03be508bd13dadcfecff24fbfe9ea07484a1ed4aa5c7aea4ba96121b73a88aad0f977b3c8ed22f5370fdd012ec745fc3ec3e967af76a11283fe03cf3ea0dd418f3543ad33b2862d59250d2b93b68544aa92b148bbd1297bb518dba5f4f4834f9c8b8ec976c12b7204f52f9ba876c5648cbf99ece82c7ca3f48ae8e1bee2b5c526b3863ba8447905f4983536ba2fe80a0a2a2fe9612a0a601047abfe524c1a0bc35419eafcee243e7ad44af494ffab7ee635581254a0b7a3306dd31674b4249d9fba3f2e06ff029c1e7196797b2d5f931b878b0e4c7516dc25fc2951bf1f2fdcbd9e6b93cf6a772b8ebbd4f4895381497cef970c014ba617e4ae813a79422f5cc33df0b5922baf41ed399c57e240c7a404f7c6963e86a73213f10d01eb7c5f14a03e5f8d2ec67ddbdfcf85ce1fa492640aea12c5d25a905e19f1ae6176b44c2363da265c1e6398633b389ed6b9504fd8b18d6f52f6b82c0feafd90888f2c1572f4eed51eb8d3487c32882cec75f17424125f67fad72b9ca070f7e3e3477c1e91f7e709fb60ced2040d9afa68188179eee68040353f21fedd4301359dd3cf3eddcbacf6886b830eda3ab58c8ae88481d6ee42a42244e17542e5109392edfa3938673299c23fb7524cd1f397a69b5715df8bbb59facbb593b1ff262319f5c48a8abfd16bd5420c698fb4df43909cd683384f3f42b125bc927dafd758b4264cc56ac05043776f508c6c27132ef2a1f71e5f793d7e7a72fea623be52d1a9e31d90c0bb625ca006cc7679a800008807150c3da5ea2b5125b7627194c64c0cb9337e0577c018a7d9eaeebdbf78000367ce6508b314f3ac002049cefe7a27647c6395fc3651554e625f21dab8aedc253e68222ce78fd15adc264d90e98a5f386737ece0082e498b1c725a47e7b6f794024a08dba59e4c98a691ebb2009a8ee6cbb63f69cfa492d12aa1b2200a1f20b9d757c297befabc0713984f395f42543eb70f2f75f493c05e17ee35214a5becfef58af2f75c1b996a94341d46f8e6d14bd815296691a64ec60e6fcdbf716206298ba26b813b26a8d35c37ee4c6665174e59de72a8d713c0ea49d9f1e5db875a982a3f3f12370922d8b66388102b5b2d57f05e85406501a52ec32dacd85821f86248545c961119259d9cf4ebe81c08ceee5218047f55f9ded51985848b07047e8f9a7081d259de556c20809fe5cc1ced440c8c495543168de6b4af4d9089df822d87ff00bc03bcf6203675b04202f670707d0b4e0d0bb26059d745e480a67ce9648c7b256d8c3abd0a1304a1910e0dc555610c235638c54a3c7b813381d1ebb037264c9f5f406c39afe7277f1b63aa9ed5f442f60ab7bc6fe34f5eecfc20816240c4b57cadb7f36c1b7aee15740e79846ee8d621e750cbd3dae1ee363ce22806a24e4fd00e129df43fc50ab6d610a7d8658c2d649775de84281a1951bf678f8cd2dd28b816b619cec90e4b3afa3e6e7aaca2bb9e21909", "0052", 0, -224993414, 1537743641, "8ee46474b30f7109d9536c7bf9786ef9c646332b743cc76360ad5a2e2aebedfb"], - ["030000807082c4030325e07f51b47bd66a93b762d9b161c75a6823e589ca2c4cf3e531c74eb77e9e1b020000000563006a0065ffffffff5392fc4b53ab8a17a1f204321136335dd9e91f8a54e1c4aca7ed8572398d25320200000002525193344a03e63fe881a764d42ab6097e02cc0eb11a012f982e3df38847663a1cd84956aceb00000000002b35ac1101c82d53040000000006536a00636553cd32f07e0000000000", "6a51525265", 0, 640965724, 1537743641, "4ad147d102728b6b7d9b0197011da01f7dadf6435d8d92c46903297f06337b04"], - ["c0d9fe6c01b31668262123fd4f68eba62c501c1c221bc52b32579040289f4390abc90f1d880200000003515365ffffffff01cd1846020000000005ac51535100d40173a400", "", 0, -2094712411, 1537743641, "dcfd468e82b8476e916978d0bf169bb22adb1a03e401502cd8eb211c53b7592b"], - ["030000807082c4030210ff19f78e2cc5f130bec93124beb656ff89fcceef5f5f29945b4a44999403ef0100000009525363535200526365eb25d25f0b685cb18e22ee5fc2070334a4192b3429655a0eebcce99071c3eba8b5f90fa70100000003526565ffffffff0303d883030000000009006a00536a535152654e8a7b020000000001510c604703000000000663635253006a00000000f655867001c3431c010000000000000000000000004dfaa701c8d1ac2620cb48d72118a61279ea4a4c6c65603bcf05686c6fc4264aabed356e02ca5428ca36c46cbbd00efff0131f1c0ac8766bc8a4ce043906c82a92e2ea52a94cbf432fbbc673f2f7dc030ac94e0cc176099c8681350c03718c54000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004addbe76c1424df52b0d61ab5bed596559e85679b2f325558e3e3496f66b7e695d1a5c84f1b6b8679803b235f9027bd02920d5a201ad4fc6e5367968cb14a46c7d18e01d78d3982e8b666c79819179e30c03e2d8f35b030d118722aea844380c9af058c863a8c570200d05c1f236ccb5aa2a65b75627595104422b94c0a2a48f031657477cddcfad0ed14bdb5049ed04da299d3a3b60a394192c496110e3c07906020bf557e04b11784fce22eafeceece9008b65ca1db828ce2ad10e97a6b202b4a00b07b4e9b6baf1dfbe7b586d7795792b7de0f30c91fc885a967f81aace7bed03fefca264203f436268d65eb33714a79a6c30f542a692020a3573663eb968b2dbb6022b4de57cf998a8bfeccc32acc721dff47c8e728d478bbdf73b2085095c14eeb402099fc46619c48aa04d7e52031fe5382d62e2c4f213eff9b53ffac509b3f6b4ad0226916ffb8d270651d7ac72bde978c70871a28f95e84c601ba73e212f069f1b66020e29cfcd9bc69c1c5e8cb5663a2aeaeccbe5f8309ea112bf9a31e65f7bec6553032260500744f21b247aa5ff9852def940a3a067322b1e3967136f9bce4a495ec47b1951204bef311c333536cc2b3ea612dc67ff90b4d552c8e7f7f49888c6fbd7ddbd5edb75487ab016f1582c9473deae6942682ca560083cef0ee0dffd42458bb58b542618ac815edfe81fef39448f6a7103ae9203c4fe7ed11b17ed7f42d18619287efee5f386ee35e9af131da926327b2721b2c43020b961e80817797dc2d67e5691ce9c45b3ca2032dab93b968537e8910c8e528583a08cbcbf631d9c9c9a14a89be5085c6b89fc76d67519fc7436e96e47d6b6d33f27aa005ff41989aa59a11805b5268d542e6625fb1fd131319bc6d392ce57c1843b35203d9eb5d2aa25f335f3813431286443c7387940609dad6e7073caf7f92596b40267b4e6df713fabf729a5c74a4923888f6bcf122eed5881bf6834fa37fc1299b70fb4fc5c9640b356092b4176e324c01a0f2146f53149941ada05f6c7e07f3a068ebcf452fb5be80041771f92c655d4e61a974871ec2040c6c06ec8992a443aa196cfc74a64c78561455be327805e2075bb9753fe75cedb99af8f77258fb4445ed0451b3023553704ad4c0c5135a3f51f4b902d3dd48a05dd160395dfc9413da42783ad0ba605b293b1d93ee45459573f15f537e92eafeb85dfec59b086d11ab8333e49b9f83ba372193670dbfd808a703ca6cf94628ef14ea96132c783dae671a56ff07ebc1069e8ec094fb60ad79680c0d46b4c2dcf1421a9baa94908191c78b116d3a09598a54370749cc8fd1f462d8793108947a5bfb362be181605395ff68cbe2d56b8c47ec606c1d013faa9bc8a83607ef60be0f9e599a0f24582f6aa645537eda0df40e351966c5cb955d93c9fbcbcfac61fe06d93d1bb7e33ebb5643106e8cb85926ca473ede8bc6107294b4776d3f1772ee1022fdef84d967b6995c400408ba89ce1e0a544d07b5af047bbe1b5756cd12d28ed29958865e69b085dc50170337684e940e6522d6a1b0b6b1f77f1c6b848a6c048a365f01d81f933961319fd290b7b32b09556d74e5fa63472709812500857e8c62907cad2f6e262c3a4059f5ece842e29e933cf4a1c5eb49c91aa63ef719bf15f5681d42e453eb20005f8ca5034215783e1e9593c1932071ac2a062efd7d332762c90e327d18edd463aa45cd20d832899283d165d3f3e522814a23ea6df31a0309ac2a78f504be50536911fe622b73e9c7ef5fd60a1b76d9a9d426bb87d3549ead9550837713dba7df62a5bbdcf8f8bf61ae5b6f9b3d22a6022f57fe670dd937c1afa7abca2826f35fd98c24829023604a11894d1ffa085ec0e25ca1aa4292ccb523d8cf817f35f73b27220fc73cbced41cac9c2af9cce464f62fdae57054017826304851d4d06bea084c6ad848b88849c725e150fff7273ec7ba14901ff67cb432d6b34c0cb3e3e6d87c07e16eb7863003b6820fa84d8fd179d1cb0315c3619c689854fc20faf19b2f82d69dc5b11230902ee54f7e88f9d438991dc76a9f9ebaf1b3a4164a68d566df9233cd72f696b2c3948c82b9a54aedfbc15e2b40e68436939ede3da9a14ad7f9b97c628cfb4473c68bd446fa9861a9d9bfd44736bea6eea46821cc41e1277abab75663c10fb3c00e2be539e2e8271bfcea33113d65f5ab153f7ef2173e2e88dab32121c6af3b53a0d093a70d6e123faf16a1ad153b1a418c898e6f29c926f365b552d5d8776f9bc62285152d6d367286aed814fcc4c8c6d5e1d702fade8837e2cd3105149d7f49d3623e6a41cb7189a0abff789c8d86f29a1f6bc396fd7d3c772eea3ef7c02f385e163fab21c17ac9ca4e46b4d3a8200887f80fea7ee31e2110265a4b9e305c48468aafb099031d14cf89b6312b14523a01", "5165", 1, 600474104, 0, "10a8a3f78698fa5abc426bab9acd4bb73ca846465de26ef04d3facd559df8c6c"], - ["030000807082c40301326ab09ff96f60bbe306b21b027508e4d205cc2dcf8f369fee1230bab1ec67e1000000000700525365acac6ab25ac0b3018d0a1e00000000000265650ac34e49000000000300000000000000002045400100000000e8a914df61167446198ab9f73baecf581d3760c1345b6d5bc291e9c1f52dbda13244542e2e439f5bb3b048863d294dbba7c5698063445dfd2421594f5085893d4ff15cec03053b34ce846de214f14a7272b1343684b8cd34e75d8c14112049f7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d61e00537a5160e46952e547009bb72297e243b268ad1eea57dc23ac62433662100ae804b04b2f41597d52e13eb9ee247de90a559e470e552dcd01120652ed454ac34c909ca9cefc90be8b7c6042836b2bcf89544c15e9348da949ee2354e224f69928dfc46b67c2fb29b31b0b5d83bfa67650506cd31f131801facb0190709022273108b0af23f8067870e8073cbe8c2a2c7d6595bfb48a6f9d713586198afd00325bb6a501831ed304bb29d485276ba97b9043dbda4addb00ed3ae0e1f8e59fa40a0146d2d9031f5cd1e4bb9742d9e3a53e19c4a345ffe49690db08806cbee25117739a42096ca0d9c9d64efd69b06f40364053f9772a4a83d688c4295dd8bbd174020fb2aead5aa8c723813af41881d0526871aeec9cb6ec5ad12aea2fda64a39901031d57a49bc2b6e2393411a4489551edd5e94078476b553d5be96290bbb2d27cac0318b66af5652b19ae8a5f1cd753618e0a5c35487dc51cbdee425cd40efc895fed0201ea445074b259e89a8b5318588a6181a9cc0b4c311cdf6675178e83645bda45022e7d59b3d2f1c1063dd948f2869c9d760187563c364afbb5845fb650e889ffb70675eae5b8fbaed68739abc37feb510d81dbe1078c51338c883305c0116373d3fc8bff2cb29c4403daf39f5fea1ea8e8a3e98a7d4fc1f21f0f61b155ec7cd90eb83f18835b2abe3e5148c3ef3701fa0d464b8465f9562f5c50050c0fb8f45ba6e694c14c2e55c64ccb01c295f2d5d7ae5127cd62d969e6ae2e29e7c8d204129abac503e751823cf24442e72f9934ae32bdacd1baab99f0253135c4ff7d749eef20795cf86d2a33960403d49a6fcac27b214b02db86604e5af6df5f5944034de08299ae1b1523d29114c18e630b1a968fd69738de7369a296361be43fd23e05a3c05fae91da56ef5552c5939f1d0a643dc3f8a1a736f5c403c31f485429c36503bc2491849b79f3b262a0e4f49e1d9b7e15850d14059fe5963a56e72b26f05a133039a8336c25da3e088693d9918c0d673315589e492b6faa5c0fb2e0312ad89ea86141241a512e7de7312f564c8f15c44c820bc2b48f9be64c4ee97188599a0043db51bb10633397ab37f554ab44d4a2fa64d584bfb768c84914fad4133a6a98697bc657a7b664d89f6884f63cdf23b76e8e87b1fc7772278a2ebb31855d2b219189a29b9077721e96e1e92aa02aa5ac6efe5de0171061ab138afebd2446f00de2df5233af83240f9ee919be0721830cbd7fc450be126e9878315a680fccceed7ad86ba45540194dcf41013435e38b8a1f2c0a9a9b99d0909874d4a496f201b2de8d51f37b17a3e42374651a9af583bc85a13baf3b12f2d07cbb98d92bccf3a6f1f3572be515f526761113972c52e2d5374757f9e26a072a4f335eae8aa5626a24bd8ce6b59af0d02e5ddfa84cde836d6c78c42584f412e0d13c0763eb046251ec8ada38515c82ab83d69b31ce89e9dc3f4f61e418e8d9baa316d3927e0d5a46b2ea995f387e485e46ddefa0cd9ae9d2835827223a3edb4931b139cf38a10a99d53ef9d3dda38bf2b2a01a12d4cd987c223660234b60d4a995979bd747ab579903420d510cc60fdb89541a95074ab6fba5475b2a683f08a150a869a132ba89ad0e0b387692d546185dfef7774b0ef900a453acc34f9c2f1639eb0e705ff359a529ff2869e4aacb2ea2b8f45eb16b2740a481b2cba5863ebfac03120419fc5440c6b596f3eef07bd048bac14018a7322cb54583ed09e8408c4bd1f18deb3270a52113614336ca00b89b67e247ab154dadae7723052cea748cd739e8033812dec346194642139e298f64631497b11047c28f54c3b91c0f4eb384a1ccbd77f499eb87196bf0a4eb59ea67145cf6365bc99361163fa6165c3a9c825ef6a5bd3c7166d290ecdd4907f0a67e11145fe6ceeae4e461839b2b6526fc4ab59e8d88b61612382143b225b48c83c2ee92e4f66f2c2baeae1a7f490b86f7e4271d8d45359f3fb96a9bdb9ad3684327fc304533b6643380af507133f0de01e6074ae8ccc348d80f44ff6ed6f868a7eda9c725792604b56a692f0b39cf9b5498bf0974bc54238406db373dd0fbf137e639e4fbc3b68f064ba29d0530f11a439ef8815fb5269a595a2741a74c6e49cc7df0109032e7001db7b580b406c357f55b80af61f0f970288047851d96da200895118c056b0b34ced437c89a2cb4fdeb4992491a0adecac81ddd385115a4170f7d0757adfdb0bc92a4220a06389c9f672a707092795854f96c348b6ac820d1aea318674289daaf7f4c585694a400000000000000000000000000ff900b2a5a7ec780d959d652bc0718812c9418780135a98e4fcd6f96c17b490f4f4924b967817aab80f24e0742fc2c892425b33fb40927ce624de284796690ff0b21a45c2eb0decb1616c01a40b7d004baf9aa73b631033a62d76c3994cb5c19000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008878d3bde69f732998e9a8322a0c9c2a39f29953e346bafb4dd77e2b75e5a0372894d9b45d0098fac5703725f321d3178aa46a34090912ae67a2b2501551adf3dbff7e42ef813c69dc99b662362e6f92d71dab3c9c0bcdfb82c1aa8de88de2d4e87639b8194f627470bd36feec8b148f6c6cd82aed853fb49478cab09464fd44020e5a1d8bd7506e783b6abaf7faac61b2d9cc392990e10af33e229c614fc63fee02157a52861003bd956499f68109f3e96047297ec143b3dcd82b6e744705496bc40a00d294941bb2a7a3c1728ef4ccf1c8f2eb38e0124389d5e524f006b749be95d1ba7ae5609584f7c3c1fa5e68f815b37ec6617ed93bf3ca56d8455e867503313a021a763e433fd7216091561a01a0d45367d5732e066ad743f93b6ca987270a6c7a021b650533a748ad4707562db30650dc704cc5c940d81a9fbfae4b95a24d2c16d1031ca2298fbdb1be42c474239b3f3d26f881d46657594496fc47b1a98010cdb707022b868aa0fa6c9c7b9797af6ce0960a192ae015431d8a7c344340dfd33f278bcd02235916cd3ae5d3a7de4d38dcc4d3e202b588ed5a4ad47ac3f0588e1b5e1d1a5472fa81b9faa4ae90e97f56ffdc5e5f2c90f986e7432c9b2c004d279364e1b80d2d62922d65fddd6b5548068b92badc9e5209274aecc88392f7e234d8526d830686620a134e25d72c00af1fa54f5d9108c2d1fbaeebead9d06d2f550d3ea75ff17a22e9e6f38c83b522cac1a2a8049daa9a8b965e317b736051f61e166eef05b9617a1d0c88ac9906e9c7ab85c27944651b88b1a522d3ac57e0374d2690b91573c1099c2dbd92675b2c75d8c0596a577b7bc22ff7d99c7d24a0f47592266c4fa5a410a86a62deffeb72d69415fd5b19370c4bbe8c5da02c857a7d49a2cafe27c7e8b250460178c0a4f93dc17e433637abcadeacfdc898ca5d14b7ca0e2a21d2bd5d841fb36665e824a2b1a09e4ee729897f85ab162d5340b3a8860f1780fc7be4673a3adc57194ceba3240623041d8065ff6a74792e346745308feea4d8e783d965791db7409129db7495b21f95f0f341a828e0bd40895f06b30ba7a16f31ccc0f1fea5a09f6007d9c6478f396503ab2ecd13da7ba5bd5d30b48d0dfbc1e31ae3baccabc5d23f93e5e9f10f8c6ac11316a60c88c9a22a9d0600073145318e1ddd7b7a5fd1fdad6ac371a21c6769883b116a80d3b1702613b5a606324d9d5b4c959081685855b5de6b743181a4a7cb7dfa99ea76e21525453cad7b787532d8a9ebd1a2274c8c7a8abc706faf3b789b9bb6e8a2b3f3cbec5821c84b35594bb30792476f7d9ebc65b2103e752c258b00bfa3df2d2582de4554c89be62160d3bead9dadac67d68d49751f9147150da3633e008d27dc554ea00d78dd8dd1f17815dba6a223c5ee50ded94ec55a4ef64097e67e99d1105c088ef1a2aa04d0430a36b68428b8b30fa85225ecd8937d50685076dc9c35e5a4820a29b5124a7e14f5c16a5dabe2c472df7943cfffeb692097a05e47dbf8372b127e2469fdb094d98b74d06eca85f732c5578cdf0b6b8b6d17fc1a8caca446b516df04a216d2368e6e55a3298d1ccf5393dc3edd71933cfa3a02d2860b90eb3e88b484c1d4ef4c2ab0e702b9cbc6dc0ac342aac12e62972df214d7e510ba0002bc3333a7d13b7217a9719696da6045a3e2dc122d90cd0c63582cd40801cb86a2cbc3615d6813796ea6ea0793ba0b8ad64142273dd6fa9c23240c656857a5762b0c8bbe634c0741036b36b86206508d82f501e4e1f9a67ff0749906947ffa57a05f771e6eb5e4b23780a800e92b227de82774d24a4c17c1ceb14a2b4d7c53b0ac73bc586b5d220da277afcf69633bcf8b454024f4556ff0bc382a883db1f69a69f61a9e2b0f440b8d44538d38e09e622e0203bcca2fdc9e61ea6a2692d4fa12528c9b0b345e1ba8c02a18679daa8e6219cfde5e2fff62fc240662cc2fdb424ac99012b6dba0bd3501125af3e8803826303ad9256c3174a7e37a29ab4d539dff8dd24407fe1b5b9eaf8e3b92de6885af0a7e8b9e1a9bee316b82d844ab3c001fbb5a636da74a132a4434fb5940a58e495dbe8f962150ce1807d7bcd226118fb86f18bff65ef724a04e4a25e63d3e719b572d002a0a6c294301485107ade6f613f8d951f66588313dade9cca39b6231e849b1752ba01c30731761015eb997b946792113a6ebc8b0b69de3579d8fb8ebd2e4baef1589d95894b1c711b39f9bb1b4af810f0bc01bb0c23c6bbb77201df41e00f388c8872b34cd64c680028a3c9200000000000000000b803d040000000032fdd341f98eb941b69f4534ccdda49d8d80825ab1b70886f1775ef9ebd2b144ac33adcbe6d778250cf60e41877278a38ce1ec547ff028f0efefe729e43c1d5110dd8a89aad251b07461e7bdd7b6458790dcc0a084bdb56209093e25ac3cc82400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e427f8261964ba2b77c51a264222082d63fbfc74423dfce32af1436f90d2d8315ca70488183d401a5077d8e4663da6c459107d19fc7534ec5deb90f102b8a3f0371b86afa0c026695abc35e4bebe3d002d7ea919272a2b0dedb13f7d95855d4c1eea078271615dac3d8a599543d45a757585bc129e4fdc42d40fd32669f8026b0304e0627058c569ab7cb6d57771de4d0d0d8d8df2a874480246257fd872744f40032d208900a2ada8c103f85a4e8c1b888d215dd59619edbf734e4cd1848501c4b60a0700d83a38202775d9c21b0fcc70d93daed310dd712130275a87bb8309e2bcd8f59829384b4c3b28dd6e0d9942ae650dcef2d28f835bcea998ecf6e03f6c096c032e65505b9673c059c3c7f37ec228dd53a2c766602d979d664c4c3f872253ce380207f9cffc70638b27858a2309d915f4b51b07d012d94d5f62b8e1d406d10576a1031bb1380157b59f9d3290c012e2d251256f5c0497388953cd7dbd59442e6204c8021f7c8355c6dc10f5abaebb1f5880f39562f6441e4b3466a998403585428062fe0226f408709bd798dc649a96304a1c56d2625ae5d5b2ea06ce96fe4f075e27bb2d3414f6a78183d37a6fb5bbdb3003220d5fcd1ce03ab3ed527680cc4eabfda5b550f9b3a407e46df61442ab59f501227badff97960cb1e9dfdd76fca62965256e00deb94b1824db2eba6358738635158c037d96aa9419ff85f10d84304d9fda43a8ea24808f499ba96b4ce4981daadb46d12e73a4ca1ddd8e21d78bdba88cd22d8df2645fce5f2f523b7d40ba7a664839e19d2ddc1b636a8fd51569b059a9ae703778b22e7fec28d91b9d17aff31b00195b3df36e10aab01152f608ff91d235c2225a0287be936e139572a0cd4f720208cda1e7d4b66937e93f4c65793c7ca23b742d70ec0ece462154c2931b5462259dcf8af4a1ffd867f6c8052dbfb7c2a9c5390ccf17f82d01dd3cd59b3c5a38857b7e4dbe571046de8958a08d99b75a80640d980446d12037530aa309b9f0b3ecb1a84fe26d425bd4d7f537b752641d043190bac9432c33d14a5fb846949c50fc4e9c8ea25eb27b00e15f85955218f72bec0055ceec8b023eb148ed2597c49f52dda9a06b7079d0a7a816f21b89c6c5b4af2bdbdfc5e0826555ad57f8dcf40513ce4da7ab8e06ec967685a9d0e055c220a00e84d0205d53a5510677b2a05f918afab8ede4572fdbd9113cca339a93ef2e67b42d8588166519113c7592af2638ee5ce3a6fb3973e73553ac4ac07266fe0e6c1246d2f99349577b74a63379dd5565424d226eb46ee5e71a67a7ffd732e4f85ab2244df274acc6b69ab9ab0a5372d6627dc2bd5b224f2b4eabd18adea97e668b439206bb72d7dafcb3cc881d4f17c8d38ed296e904e0ef5e5c60ca7171aef16fcbcccb95e76e04e93e213182a0ca9f1710583e4858a49dea1c6fda84ee1a2586afca0df9b10585e4598d431830c9d39c56b9cac181abf54fbee2f72c4c756595e7bb6faa14c73e7d5cbb8b1f8ff8ea589039f51dfca8e0a744135c0b9d9671d81b48be034cc771b98c4c3b77fd26b8d2cfcf2e0d3b0fea0430e1e786aed4dc0ff03069b5dfd630485840abf67049b0b8328a5383bef297ba26261f74712c5da7fa19cdfbdad9c88e109844c3ea1a4f61ac1d6c0e9c1ffa0e2c4d3dec918172fd483884ad798d6e000a72ab8372da00f82deefd388c5d25c7d62e3f11aac1b1851f500844a19d6b0ac940433c1c8a0b84f836e838352295d6c8852f04cb1b7ee25e57f16e6208bb33678d1fa0e9b98f36e055e84288c62d9c0322f9c8f5171b5b166995eca79617375de5c3e80d17c5c834dbf248c16c6b447442e01acfee2bd040a9ee03d74cfe50510c113fe121dd9ad167dc15e1752882901c39080df7eae10f1abbe70e9afbdbb271e11cc26cc0db2f09b719ba5348bb80f5de37d6f91c6e6bb560440029aea0c4369aa58034f9086437771654609d2ac939b5116619b4a47647e50df9ec9879f02b51dc27e8e31bcc2414099d4f523890023ee31c0344961cddf53f4104d2a6b03785951f5cdf0ec2f148cf1ff2b515a4911a97efa71c59392dd0110ef2c3e62e0bae5c9362ac158a896ba5a5261047768ea7d0123ac17b5fc8fb8d4708a68c7c28eb4ada85b3f4310bfd6a0d25fbf36f02cc3e9bda3111038b1471f878f6130edd8c57fca1a5481db6a4d68ac63b271ebc4284d810967445edda656c31799cb874cab55d5f19f4b0c85b8b08d5db625993c2548895da1b7cb858f5b99404ae155051df0f52b29b0e021e9627c9722f627a74ad80091c491dec8eb86b4a10d4c8f6a73ef1e572cbcc98db181e9eef7b092e822ecb9544a69742b0e7842e5dce391bee9fb4b6779a14385db472a0fe625a4253896655a8db04f7cf3eb97a37aeebe5fca822deab6fea08", "51ac63", 0, -420306464, 0, "7889d6bc222f499658b2f8afaa4a9b8804b03e12dc4ea74044d60032e71b822a"], - ["06576c5c0253c67bd44c76be6388a8e84e546d4b68ed16d91212c73e3023bc4ea8d3d8e42000000000070051536a6a5300d67d6e7a539be490d720f6a5c41d19f92a782c4fca6423502386ff3fcbc2accec7ebd6e000000000026a51ffffffff02665ba201000000000663006a63ac650727670400000000096a5165515163ac63530000000001c480e904000000000000000000000000d97c2108da2aa2139fe265779969166ec965d1c59cf3c908ed598a82f16f49570164cc987575165c355ce5e109e98b9c94f01b89379bc40fdd5be51e3919afd34a2a51f7ea78d6ffc79b9225cf293af49b4d24bf27fcd265513f94e0b100bdab0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000068c486d8a82b899449fddbc9771b6d82cef57b64b1210d95e21930c346258a34a072c2d4df6617bc021208a1c240aed04f5dfda08e2ab1cd9d64a5a2ce4e0ba1f4599ea9f4a5ab4ea08de5c51cba7ef81fefd5eb7926d9570e5814c3cb85b3750bcc2b01fcb70e1a38604db705f772c5d71d1ebb42be5226c98aae61babe659a022ceb19efebfdda9ed9f326463425ccb0e303256baa5d1d1060ebb07b6463a6df02158210fa5db881d94383c0bc810f3dd44555d0ffce9c682d5b23ed9cd46297a00a0189b1ae42355d665b4d7d4eb861d6d86d873fa425c7473dd233e34c48dc156cebebc3812d180168c04f0accad08079d9459630cdba6ab6e6a437e352eed3feb0306db2ee9ba31194c6b6231bc36079d2fd34771fdf28612a0ad871fc58f2e941d03173d4bdfbe63433a8baf2daf1acf5a5ca2e1d196bf701200dd0fd8ee06621067022f5a5d7800ec5c07ad88a493082367489f123156ac7a797a1149e39dd2dace170213c9a02e5f3b0d6f034f58efa07bc3c341cdc2e5a6e780d86b677630f6c03670032932a7396e38d25e767650b47947ddd75e06440a8d01706e75ec1e5145a249d963136e72db2a6c83143694a6af9d24381f43c8b26283c3d06fd516ed485cf4cdf77da7dd8d023f9047005a65133abdd4f190d2b5a1ef32e35e6812b92c32cb4a5cb78712420d16431e1e4f828b3a639e0389d32d7dcc9e911fc3904b500ccf7269547cd529b6f282ba365e0344c57ca4aeb5da7ff56335e71ed94c929602e4afeddd37756b620c15a3b3052908aca894d0c40f7c255474779a9186413d3bffd8d92002a1ee2136b2f4018b3e4cfa5b05043378245aeb7b33675963536645805f113a835c57e91a26204aa588c406d3751e0b9490b68b79897dd8d447ea0ac322f87fbf554f4d33df8e660a7cf25fee151567497a5b49d7b9a5a11d49b73fd88c6d564018ca9b290c01dff5a8970caa6f72485ac456e528f7b4258f2f3cced2696c7ef5373e755061c741c62b4bdee7c63a02f23966036b40b61383b6562be8c42f54221b393fbbd1c33510e4e0369e927f710ee0c33e0b90c78c709fe754be86bc90686e976effbd33fac2b80ad1f424e0bbeb7c14926f09e707c3977c5f3b0326bfce2529a2ec1c8b3263a214f31a645ff6fcf6dc5603bcc5facaed31cc99666f01a54d9e36cc2565b1ca1c1fd771ac6fdf62b53a978088e0a2325dc6a9cbaeefa29e1c7024ea26e5d06e99bb9245153864cb0c8b2f98bfa70d7ba1955583c1157f358c40549a33c91114b8ae9ef74e777a662b1dc7931443162046d8fff91accb7fef8133f5aceb845c8f8d20e04d6f4204ca070f5786b31042f8fee064c24cb82b58fb8cf9a0874441deb0f5d7e12b24cf71fbd3972230706da0275ca536f6867be71aa4e5ea0215a462e37b449f507eebd4d8f3a0629d331f2051461d3bbc01bd3b15b2a6da67d8aa7bc6ead7bc515873249381c0edb712d48ef69720565791d5251349eaad7e590a2930dd9ec906c93ea2c541027880e88577c06b214b502630f0867653ebd5e4c979a24e5ba2c11e5994a4e4e0b0e1febdf07216bd9e8292842b4688e014c0f80a5985595e863bf41d2a2de473516b9b213658785eaa58ed34b4796016d43f91a70b37c537d7bab52fbaf031eff85904a79d10e16ca9fb112af5edd78c651cfcf955296e31894ad4a415164e0d31ac76c6ca22c7f177662db73a98bff7ce413c9266cae1f06db865924ad4979f5966eac04c1b3daec5a94f1949f32e7378e8e8a5e2a388d5fe352965ee08ffde8cd55619742f6cd12b6a39162601c60c2c7a53fd5818830d078897426f2f0f1974b9c003371cb208130f5cba4ccbb11daac800104a804c7c08078ca4982441924b1dd13c94c3a585583ae7ce8974f4edcef615d914d1284c8d6c6f2ccd5dffa7ef2212fb9077c1b308159e64fdbe5000e3dbe6c61d6beabed5c6322f792be262252271e6bb3afa3b55788386ee297e5e8b102e25b785bf06f914363b61f0b97d645aba97c1b70448ebf114f83b9fb0ea633c499e5d88ba4ab77d5b1b02c248177d51c68c5ec1a6bcb390805e13e4a1b1ee383677294bf9e9f4821ec5b66f1ca2257728f6ce6c67c40ae49712e552d6d27fb14574ca162e844452268ec1d165f042e85ae80e56d70ed5daa4800baef1bae4cba59cf1fdd442a82b69f7fcd9ca7a783a097aebd4d82fb675c2e173e3e095841d0c69f4a6fe1c0622c6aa4d200bf0e265037fb723524b5b45ac063f7627bedfcca1d0645049d07ef8a227266801fb127a88c68d49dc56a672474bebb8b7593fe3826c76afe36d7c8ae339dd44a672971bada33c4602d0896f08dc2ea3e3b76c484c6c4d93a61cb07e7db64a9ae07fc884fd8f10038361e8c4ab4d5648cc79f941b8dc286cf130bad410e", "ac6a00ac", 1, -389512860, 0, "93a44b0e49bf7dba8fbbbe7ed487911818155bf819d9b28117af9e1e28dc320b"], - ["1320363602f21f3e6d70a335358fe452ce9b3de96d96af75ea3aa46d6c83b1a4a3abd0f44c0200000000b22d760f6ada979c26694b91b389feeba0269593cd82b417d16d4ad1937e59640f9771e1000000000951516a65535100ac53458a36e80242afb8010000000005536a5365002523f40200000000026a51000000000307837c020000000000000000000000006107df8cd301bd7ae4526d2b2abf7211e86980a8f3e0559244ac2f53c3480b1e7b298309c8dfe7e40261f45a8c582a07a92c553a2bf9d6cd98d2523673580891dd305da8ba8f34ad97bbb7f7eaf40f51978fd77dd485191bcf618b9ae8087279000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001843964fa07cdb50e2805de8f4e3761c618b333992bf67274bb112756eafced5fb6e20a410681a5b3cae02fb99cf2d4b16c3ecadae17f61f224c58a0eba1e91e7638a9f24caf3dc1e84dfc6f2f559af6e9d240e4889f235639f0469cba9f19ac441b4d15cd7411bece38e60a8b790fa76d0973283e3d70ce61302a60150234d603151a73b3f94417a8e4fcf6b1307f6095a66ef443086db97ad0ce0058bde91a49031b7b738a434fa036932e623d3e6afdd72d08969433e3bdd33a643b2d3b19ec3d0a052d14b9d531ec26f05e6673bc2dbae94ef0b9a493dca2930918ca826f5d571e86bd5d6449f0b562a1691eca0b9a9f0d485ba5a873e912b80ef0f39c6d6996c1032a86c792492b7faafc8877026c07287f447755c0d8882e59fa21d10d446dc7450210cc7324193315f6eb23f5c3a7e339901fef5da6e1059436bbbe518fde1472690200bb3ad330e8463320a600383239d67807fd163bdd8ceecb54a5f861f6b86835020c768324c0c411b6a9cae6747387206b2876c8437e3d11258c5beac60f173566020395a2d00714e60afa26ee3ca989aa840649cb8e19332f36a548de186bd7b7c0d50154cec65775518ebf451452bd946b007b80a9b9083a1339f756fedad416439b4d1b15d1a1be7484076dacd2e9c271ba7ce2ea5cf74d56fd237621fed1ce61b164175df7d34b418404df5131ec36bcb268256487c6a2f943e5aedd57780879900ad4cdcbc009363f97ff85277cd655bde602758d481099181c97026dda570cce78b4fc3dc6d47906b1314cd5d214eacf26f5c6ae28dc0ebba75a2bc90869acd8ec4cb0d18ea261cb763bebf55d3cb5abc96c73ad93fc015a7a701d9c31160aebebb52a20175e8c07ebd0156f5fc87fe25982ef6a9a61640d1d46f77f66cf10c328934f87c7f4e47792eeb76a000a09ac4f3cfb9da7fb4fd000fc32f956123446a853cdd99ae5e5184ade07187d31edafdba263696421833afee3b1323f790cc9541419b1efb1341c5b4de2c8733f87e64798c26c8362f68b390660b77d954105f9f47ca2839a3389f94cf24311ce555c99d69efec13d2b2328ae8be48dca74d9bb2467cb8e1f1feda99240f31043d021d47ae9e332e238a512d96ac4766411c5a7568127085d0a2572a59ee233af9f81d9c7cfa9d3988de4afe9a197873614bb625d885c02e5ba79d747e890e8dc804ec605fab2efeb42096675cb44fbee8076af80afbaaf306122e18874644d346d38924b3d2ef92891f780f08ccedcc2301ca9228386c385a0eb71d783aefc0a346918a24bd8451e14e2953801de5e3aece33e04d9fcbd9cdb57334e9ddf0f5cd7976fdc4193b30f6f1cc1d9893a20db9a1fd09e0f848089989b418569b4f2f9399467c830ec2611c413b9684e10a67b7f584bb949d5a71a9de8821b5ba6674417e838b5dfd4618dd4f82e07f6e03c7e8e01d6857350e1fb253cffc3d5ce234d0938677cf202ce24f941c87b982b256bf5b2a52d7b006bf297da004d8e2b07d39ef5666ec44e89ec843f62ee8df1c30b4451e6dc69fb159aa5c1a5a79f58765621c43ef4b21aa7ea58b2da3a2d0d797d97ee5ce2f14a65f63d372a82a1ea012beb68dea9542886605fd50390711eda648e85e3893fb372f3b849a2516ab04777e95dbb22a6a1747ad66ca9bf41faca937b9aa4a17d4e37b3dee6ce30dafd98ed3b57b77aeed907359d06b7d519ae3c600a2c3541b3ed13af8571e32c57094a8f0218af9806ab841850064a987f4e07f66375226640258978476deb5f56412921d966957626fcffab7c301dda57ccd6c8ac99719c182b1b496c59b6de4c6b878cd1b4a0b47b7e12be5db1fe4d77b90028da9a64a509c4b0de83a4073c14e8647d20179321524fa7d4f1396402ee13e87df885bb126fc7ce417b71af1d720346409ff9d91e17a4356cb676ef32aa97f2aa85eddc5ae7259d95b452b9eb1f2b0dfc12525d6fa39e060e15e761fa5e53404b165f409405c0203d32cd9b5341b3c08c19f9d0b6ee6d2acec407b751aac6b52249e7a1cc52e94621f17a4bb8a5c83f89683b7b751e45cf1274e18c60ed4db3ac9f1f542d9195ed6a773ebd5f1ea1046410bd98f5989ef96312aac8afc249665f1926221af7c8fd1e27168519c4082a1600f3cc860cf0888cbe23f1f9e6c9c0cc516fd650e61653bfc8e4d896ba3437e7b554089f6046d7ef8d1ae13b095a2e438a68c1fbf20dcc26e8df4511aa940aaec325ac6f521f579cc1549401d8bfa97a31732546e0bd806733f8062c5a8f50988f04640000000000000000cf3ff40500000000535fab7d473f4016f819a39fdf708f97d1ee2185ee2100659113aa4220d3ea4f1befbb00f702e61cd387789d2f9f8a8e7fa2ddf6de46daa5aba0b7124e3bea4a2236ff51ce6128d317820714ccf8db31f89ce6c6819c61f2ae03126674b5522d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b3ce7b6f5123cd31f087a63171ebf4e16f3b605b057c55922aa250b420fb4140aab3059b001db68770e5340492ac4224e99d318a38608ffd32136c8428cb7232419514a1e2017975185bdbedd89857f31dbb8d608338c5af865bbac89afe4b874d646d02e1411d68571f1f74715894600d0f139b9d5696bbd9f10f46276098fc0214206966d8cb22bce7e97ccfe1c8c6fe261174452be291292ce6c989a51024fe022d4debd64db13d7a2baec2d8906fe51e30cea2af00ea1fe006750d974f15909a0a0324bdd5f92055114549fefc75d5dc85958ecf38dba8251e260dbde9cddea94b9c989ca5689dd06e7717c94bd82dc0734afeb31906ff8bcc1a6872ee8e4096d90210019df20889f78816911ba9a361e5efb23ef5f7d9672ff72fad0ba02d8971f40212f0df452a5c66318d820226f177c4ed344996f09703152444736bc82c70dda4031f1aded9eb45ba01354bce4ad0f128ed0a611b1b282aba335b4f231bef255f680309ecb773f4c5b141ffd3466ad70808ca3b27979c8b23ca3cfcf734eacc03e901022c22b35dc78aed89aa856d870435281c1535af9a5ccad7ca7e8f1a918c469a3722de7121f76aff00c15396f1e81a26bfa1ce7d03a3a7647a7f8da05be1928a2244a5ffea01cb4dd92f500f70c77eb6c0747a4010dd226f4d01ba8118792d68eaf76729c62bf7e3c00ad167b7369ae11f9c587869d4b2a747bfe6e3decdb3d28d441705a73151e8b3e2556db74c3b1a51df3cb28f89277615b5675cea7d5976173c050995a5058258270e6cbb55f948123a64d7614ad2ead9f06e8ea5e0c7126370f39f6aaa454703fb6d99bbd771eff8234992bee1e53b56a759aafa9091f485b1ab6e4a405632a8c50770b5965952bf79353a92e16b27cc4afdf8eed172a6fcd2a407eb16f4977ce489c15a3bd63ff9027b4951b51edbdadee54d4803f65b0dcd562a4164a2fee5fb4fe26ca92f262873c0a0f2a2a33fd67a7c82043ff9f505a362839d5327c1148ba5a72593d52c2eb9bd7f19a45238dc8fc79d94453a9c0441a1fa01309bf93a2b1158a1403daca579fb6f4952096ac7e5430bcda36a1b036f91736314bd2d468ee587a6bf4ad7bdce2f5cbeaa68ec65b189f355d9cad10415461429d01eeefc7f0dbead6f8196ff6f7929cd269c860bd1a01de2e1822f26cb973266a79758c98b7dd1e1af54e45a4db9d44d10550363957affa19d0a1ffeb5bf5c442f3db4d03c74320d54375b3c8492f06bebc5c880c545c4cebec1c503a2d036827b025963cfb813e1f0723c7c4e80f0e213b8e5502a661302891f91ef2114d79700ff0d0bd9acd90bd38d691c9bfdaca70b0f6be7325d61f7588a52cb64631dd1d02cd7a3c3ea401781108a4f7d08246e180dbcff816e2f597e792217a0f87ed20908fc4186492f8fa9bc17a6632609c7e6ed68962987e5d6705ee580c85ac1b2ef6fe4394a7a7d5b5069b05211a0b30c2d01e677b9626cba73a386678df6624a0d4478342571e4bbe93247f0c0c57dd19c86b3aba9fdbe34dcf89210b8682ec0cd615bbf24871ac880eb727b9d13105d1d8e7800030541012357b3468a3953392199c448218f90f2d92fdc8de15f8fee4fa55af4994c8261a9498f127de9ccf9133268fdfefa96cafa12e1cffed9a4b9417fe7eff8e0f38030369b79268d4d62ef386471728e455fbd318034b2d985dacfec0965f6915a0c59443d423d84f499f6d1bc48a1e46787e26f87f57f642e1b2a5e41efaa3bcca0d20d7b927f8f1f9766c4ea3e6c469a31d3397b11308d5500a7f6b693f1996fb72e3a21442a2e639b644ab23acfdbbe8f97d189285c405c636688039d9eb9347817ad99ab8eca07d0bd9a0c747f4d85fe43fb1574681d4cb764f0d3be830abcbff9cd3b5d6ff67901d95146beb10b47f2937687b98301432912345314835452c62443cd02059e12c8415eb69ca813c59b0dd4b526a75b91a640918a2d9e79e21d10ce0038908f48ba5c8e195488a82bb7152220c25780a714b292bce86da135da7f19a3c950d7b1e727f236e4b86f7bac5659d9c060b3d1560afb8b924320f194465591b6b324fcf315ac56556ecb153d4bb5c759fc7aa328804e6e9c23e3601d13bd2f796bf9369efd60fc16870fce6cfa198e5bfb1253c91fc6b725b3e9828bf0e528395408c1996d6af3d634fc8e19b8350b5049ca57a1e00eceb721295680151c9281358a717c6ba80bb9070800a924df8d7074a1909b588f5fe176ae71cb9743c978fbb1c855d452d67982004a1456b7c52ed8c47d88a005000000000000000000000000133ae940b1d7c8816ee36906b87c00ada166d08eb89a59a9ca90bd9245b037e9c8b1627df8a71b053d6aea3de83ff1d4131067f94040275550910309babf22f1b0cc96afa4ecca35d49d97a16cef07b0e99641a4cb8db05ca22a8366cb682d2b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000759ee370cdff673f092e9384078380e0876f98f2fa67f3d7e7cde7e5e6c8dcdc94d8adbe880eb35a562a22bda0a70c9800e9bb7b7e4bbe7fe4c2c8a254761eeb57d771417b8c5f0116a129bebebd640450a1536cb75303954138c0acffef82e93d4a090e8bc8c7ed040c1c47f4f3dce2a064248189f2befeae9f9996604198bd030e27e77105f5742a540e676b4f1ee5714d6266e23dab8ac4dc0877949a953e3d031132b3a38234292b1225d15d42d4f6e129e6ac0f09f63d23ff3308c350bbc1ab0a008ffe8219d72c1384b0bfd69c1ec277a6a2e3e2774397578a7cf33545aa752cb56321273d481783337b23bd3bc43005105c3dfe45aaa9c152a56d4d2665975b022ae6fe3606453d0c18ad0773916e96869ac0f81824ae32ec5a551776284c0a4202196422c5a2ce78c89f609303f947fec664e44d2296bac3ddd181213281a834870220fc2916a770fa7ca85c2de439cd2a42d9ebf31254f1177689b369d42db891250203a78691f665e4ab12353c180b9c81f4f502e7ea77700eeec2f3753308b1024003295c1c1357c90dce844c513d437e5ce4f297dec27bb82e1cda625fc4e5c64468e335b4a08ffe8e480ada75ec8f1aa5ca8a78d37599184e880911fe02add1be78837f24dba747dcf702445e17c684133a71ca405512bd49af01d1223362221d14772f3b49fe06f4694d991ab06562ddd71f91fa28d2395d4e66f2af100ff4cbc4a9b9e4035a52b3ac216760cff1a6a37e913dc2d111398d1edfd1d6def6e764849bfceba5f339821628db18f7a68f6473c33edffb580be438a8120b882735ae2619c32d31998de5d2195a3c11fc699417774bebabb8c7aff93daa6d97baedfd65100f4c5be069c77b41890c5a95a3b1b1c4de228eeff72f1b0c8e958166834f559ea37d7c75d816a4e630e8c1929f38d07c92158aa5e2ee181f09898b02d1a893e8b73e472f489312d272bc3df37d5460a67852260ca37decbdec11072fd531084733c83ce7fdef70d05f487c97c556349086ce885cf0dac9690437226fb8b1a455de69ccb33431cd270fdc1e6e4d6e6068fc471fb866ef64daedaced7aab5249db29220845e00b989cccad0cf9593bfa124b6535b301a751a04e8a19fb8b344c8593e4f4a63f111565d4c416245e3110583fea43e3fe94fd38cac0dbed7d086ffe576587702187cebb0765658e74c0fe4bb8748e9949c6e410023e80a71c17fc114205214f846a4a7007c11974ec1a8b8051f3c7157123773451ab444a3e9cf80180838f1679cd5e664c03393b46a63270a041d706615c2e577fce29cf363c907497f55a12d3dfbdf22cc8dd88e23619c5099ddf8b9dcd9f0f8f8a0aa39b100ebd8901d081d0c2daa2d154eea2168853b2268c786c7d89f40a83e1ce02f299f603b2aeb56ff9702b62fc73a8e2d2bfcd5d783fa6d0410c275c5501bf69c8a58d10c4b34d890ec49d452c03ab403a62fec2a9ca5e5cacacc58d44a63b59f7484e3dcbb2593ccab1286de5ee27c6e47c36f0fe27080ee01865f0da46e35c13372291110e96a97d3a5f771f539f4efdb38776ab4d452fdd52346a10b6c668ffad8088185212ab454b68ebf48db3770317d2f621cd523aecfb80cf7a42e3200a48127cb69443cb21b81c1a82484fe266df98b5ab82fda7787a58a6719a3d6e2b0dd1257eb9e6437cccf93a951f7e8df3cd99dbc4bfcc9f369ded691389085a16a51163b6fccd66d9fac33dab28feb2178f3c8963b451d577a975fd3248a676470addc517766678e83d7e5d552ee8a7c8f72bd4accc4696b4a168f5e10fc17c3f04b54ba20e29501da242d13fbdb3b6dc7105a1e2e4c7893bb153743e2611d05208147c0ddeac566e27648a562d87b79a66cd5dbf01f4c62cc80f15f1deef5b45aff4409a3557a92f664fb5f70f8bded5c765fa23995aec3cb7d014e7192254029d35cc1499809519109f0f68100fd09bf5605f433d0bc8c1f0314ab16b8564b9c15620de498d2c1f4fb16d2fd686ea874739c2b11a3b39aaa39a8683c001a09a03f3a547d7a0b35489f4a6e3f3b868f27a1fc961a845ac109f5b9ea5caf87c45353e85b45986ce8fb81972e0c517d6c7074875795b8332c83c47aa37086660fb1454f4c2f5ff4c44ec3d2bd58164cbfb593325db3b4d08fce902a36f4bf4cc2a37072d87df97b8445b12fcbc2a295263c8eac3742b82d456fd70dffdfbf0ac428a527afb8ab87db5c55039a487facc0f1f2b1ce677905441dd903c758e5ef87996a2c318c399a8d95cf6b857a2de88416f4631a1d1a4bf4d527d6f2e5284a6e616ac8e9b1314574fc79133c706a701965271b77dcdf6ff2167086425274be122e5312a993847e43e984e4e811e9263b193cae62a0fa81600d8100913be850fe88239ecdcf4bcb44ad4dcc67bfd843d1c22f20f0b", "515351636551536553", 0, 1052202482, 0, "e31f7adb9351b26e8c0b1303c0b993fc2e6b76677bd620161fb6de842aaa1f64"], - ["fad7c83401b06ba876a8e4c84bae2143f4a67ba5b31d8ff0d44f79257872daa162dbd125060200000000ffffffff0318ded0020000000009516563526aac52535236af7703000000000045154100000000000752ac00515251519c70feaf0200000000000000006dbad4000000000011b1bd312eb3f5b22f38e1ed38164aba00bc4c27af0209610ffbea484c4009583bb93add54a81e01c999d07b33f34aaf74ab63362139c99ebf975d46e390cfc0598ba0d8f40c5e800db8217e8743bdf2352d7653b4df0fbfbad502561fbb27000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000346161439a89ce8b20e5e2e4716795ad9532bcec3e5c4d50afb974c3a4300ecec419216b4300cfe743fb6d23bac0ba4ccbb3f220b356a0dc55f724e4086104d860ac684e302b6fbb814b10748ac16e7be1a26d5805ad5a852bbcf19b15a707353c087439597f26d499f441828a26042f8c423f1c51f3af40178625cadd5f430328e76c8c391f69d6addc0ebb159dfaff89ff122d8fc1d4e1d9faf1c94e130486020ef151e9a83031efd0768b3da241832a6cc44bd7a803a2c81a0022039144abf70b08c9d5e5922f5ae6bd24c749d1ca40b1e8d2dc0e569ae99a82c6e27f496d0218fc2de59b3e81cb8d0b486ce0293ec86c057c17ede202953fc8e5ee5a37e0a9b40329b4610ca1e48ae077b26a64991755c270130daca827fb9c22cf3c459a6222650201034fef9795205c0b24228eb72e4afe9da25220439e5363502b43c8d0a16dce0302b9482edac467e7a41af4c6ad7505aa678df32b5ff7a07d46901cb79993ae37032b4a93008890f82f24c1c68e54acf829c1b8c8f92569e7ebdbb886075b2d5f96031ab5ffbb3ca19c5e5af154bc37f3573b37305f3c08328f81afe1a530016383df45913b98ec15054f5ae55fe96572798c05bd2ccd4927aaed9749a1acc993be015271e7dae6e4b021ad793432320925da76579df4bc29c62ac3bda1909511479650a4fad027dc56a0785230c8707d6604acde1dafa8032f86fb424bbfc8b90963de5d27234f206b284251490db4bbd6b289b043d78e385c836a3e009e2597d5c35ffcceb4693fa3107e1c61219261a7c929ac5ecf71f47be56fc05b3486f390e68454c0b4c7d9657adb52c3335f4f8a44d77b3456ef4b21c9f9d89cae868120a6cad631d5c0243d7a4fa51a00fe5558d08652557cd93772eb32694e95d32e19db4e40ed8b691e8db65c9fafdfec9ddbf8ae22b44925deb065ab366fcf7b3fdf16112623067b1a380fcb762d49b36cf8d14d40a5302bdb06660c5924f9c444841edc344541bc75a10e8b70c9f62b6f2b7909e0e22905424ca6bf59f04334b80a7a7396483cc61e09fd3f6065e79ac023654f569a2edb6c290845714a9e25354a58517a0e3bf14ee0fefc1975d2b6a10753b2d886c4e053861d68e0b78cc4063df14ea942ce15bb1f559d5492fde2ae90b6962d2fe6e74f9f66478ae964bc9601d6335e9826ba387812b9027809b92667ecc289fb69476c18e3b78457df7760cb8e2810f26ccd75d3f3eb3dba1f1c441c43c7f91ef941181890227a0fd6352c2127a6323af2e1005ed71813ae98a56b01bb6f65e47d86b010f1d605593d2f7e53f77c2a6ba4c4af22840523cef0dbdc5b99afeef80fe196ff121fd4b7e9249f7931384f17c1bf80c8b9036b8a532429d3ec13ef39a601e73a6ca23e28af893af9ff3fb55dffcd0b157f3919004f491952ca420812a6f90425ece5ac7ded26eb40d2e58d9c0cbad0597b2fc1f3228ecc1bc4a39e1dbf9d8526bb8f45abcc9e637f2b29987fa53cb211e9b0a6e0bfe6da117e1051b267c2e396e08197a6d6ab202fe7e9407e346a89812ef36f249624989d30765bbe3218675fad59e1df114cf34a83a9409ae587b4efef6c0ca1dbcb2f4573e925be6c6e96ca5eaed5e83d600dba688a2644eaaeba745124c55304e07132975c268e87c04bdf1f7eed7dd74ccb405b77ba66efa9fb206827e580d543f9c8a9fbe71b5b6d87dec021c8551f1621123afda20d593371ac389ab3f7bcd9b464b7244e31ad519c60e769fbab3e031a0bbefde361c280c56041abad70770481441f8c27e2e2b10460df7587ff545bf7713888659ce15290b6cad93d2992890578f03cce0c3278429cfe49ea3981f168552b4367215b48b5c46f0997619bf24d1f2ac2decf633463f71994e661536dac72f852ef6d213ab6e586a2a2535a5f00eeb698f5646e1f4444c1ba875d6578e47873f7e85e961864b28f557fc43e5812491a1b9dab35ce19535bbe57869db77b4f41cba24c7ca5a90d878cfedb003c813cf0c69ca1caee1d15ec36e5fbad000383d5d1d728318f1cb83381e9804d4129b03b7ce38ab608d6057811d1da1cbef72f9936878ec151befc46b19c36a537b66b07b49d9b59d907e0f7a242c14f70fa8ea68e9c33fdd91ca0da8ab4425f2e2e124875c906d0f250d0d397e0dd47bfda9ed1ad35ec6d7fb6759b6f81c09f435a5c34bd8b0699cc413b513f0638f7fb5dc75a2370dd0e35dad415af9d30867d8469959aeb1cc9d0c8826f79bdedd577a77110699c6633dc455ce47265d6745c175391caa0000000000000000072a7200100000000b983bfd4dd9c9451fd68c98ca7d4eb3e01724dceaefb6b7a7b57a581c805b8bccf695f5680fec663817930a3b3851a65320b12892c00e76a2e249ac64248eef1cebcbfeb9c830739b2adc810ec0ef46a8cc540eb3f6614604681b05db21319d700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fefd28dedad83ea9a7a1e1eea6a2e4fbb678be5d65e4ba4e57fbd0305d1cd608b0774dcff1f5a8b5331bc20d711ebba84d996ddea34e4eafc24389900306e5a6dfce14ba041d187a7cfe1a861a7f4e062e78d3a996df28c5874216fa50fd838fb30991277f9caaf0867265d79c92de6e99e458e0d1f7ebc9c515c704647187460216d010307db72de842af1ca36da4a1068c85f59c0854f3e2eb91c58c5827d6000215f5be19455f2288e78b406edec1dba35633680ccd2a24e9175283b0e730c4670b030d71a3f002b6984abdf90e0f0905401fbdadad941b66190cc725189ba444c13c2c3111a19e4d83d2551c7c50aced3aa7b984486c78575810f3f48e6a2c9783030da6b524dc507d1f12d59b2f217b025cc43faeb33bc7259492af5eb21864b97a020fc3b1086b3ddd3b3e3a4d36667859fe270cd6355fdc09f53495ea81a1403f600312e75ad1113224f78132f2daa1afd699f815a413f36bf544336953dfc6fd624d0225bdd81cc0f993a144f6236a88e6e6f5318130c516a9f81f616e929b0454d7de0322df627ab5c6e21be9b7252dfc517bee449d8ebc1c0e1c2eb0705b94d23a78d402390f6940c6eced9d84a5037f6f59f84e7a6d03de18e337d99dadfb0bf3b6d38a6e5e8529cc42b862177399779f4fbeb4bb575b426e996b8581627d1b0b98a5a7e5513864df7182908cc716b8b3d67e3913d6ee9bc251ca6d8af38339d5c2d7eb20b9e8a454b51258f2c37293becc03ca7c3908759b5c808fa32e50b80e401c8729b70802b44e5a054d04e5709a36f780fc82e1efcf7f4a055933ec7601b23543b1f7eac20415d8fab64d16d991f179bed65b57fb92947c8c6673667bf7d61c4ebcf25bd7d07252c0b71ee9c97fc2edd1fde69cfb589d369e3e5b58c5280af03a01bd82d9672a4550f8fb97fe26b7f589992f1b6de7cd3cb925f634c3e16b51f9522d12bbfdbc8c49f79f9ed52b6c71b86054a2dbff76f33bf87876f8fec9ef9305367c9e9607088f5db6a9280b1aab01f315a9209629b2d25135bb095c04abfcb9fc20abbb97a8b641eeab794720232ced7b48589f13c9e1b4ea5944743cca1043136684b4c27a0902d64eeea75807ef8ac2f09b3b7f00f8861e79faf30489046cca98a54db7543b41c688c5e402c42cf08c302c3a955f4ef6800eda6303fbd5cdd293fb4f7fef854c8b216bf8c447850ee7e09fd987df32db698ae0cfcf40add31107766dfb485b3ea747a497a0dea0845a8451f617142e840ab14e46c2883a8f3d17b32758d2afba11fd03c281f821ead8f676a4ca469827a938340becf3e97b2c6cc705a61709aae0ed97551545a89f91b00930612211cccca1a16a559119b781441c398f0e181748bd1c99900ba91a5718550c3677233e82ae37a5c48e79292e0222b0f08f9726ab8c3242b6fd67a98ab7e955d6865caa072db5ace5e2177c7221a666171f411e49f098cb088c5189f7c4e6ab806e71fb2c64b6bf396ec347f205e5378323652bf11277a0982e706746e1462b4fbbf414043c8d9879914ab008264ef5c4146106bd471f3bec07bc8e89d7ac6e0befb0b80e5f90471b826abcfd79904e4b480a1d0f0fa3b7afd89608251af07804fe8ce0dc9ce8830e7c0f79ccd6831bddb1e1dac41ac9d9da0506f22e2fac85d6d6f138bdfd3a4f888e25b832480e0a3d6e0f68298287ac75895ee1a95fcf473b61a92e4cb2b96310cc77541d5936bdadd0144655e640a71d5784a3936edea62258e78f4180b1cc8567824e16dda2130524f6dcaea0070247fe279e692c8a7dfeef034748fbd1d156d5c6bf596956d565bb2d412f706def21c10eed246be219e8a7275982c618bc2c1b4c4d348040c7cc570c4f9ed7baa53c6d60532633cec8ca019f54f1b14063e1df08dcb23150c84dc98193315c25200ed0a5472f3c7f11706fb7bd0a5ee72a135d48d8256887eed70f11b253ab74f25f68ea20383aaf2f59d3f76198457bc51cad72cdd206329e181087e9706be79e51abc71d859a3fcd2e2be6791a63da34437b204a2bfa0d59de94ca7500bbd834c17f14a0d88caef57779a1fe24c777963d9ee95df60f2e890d4618e3c3364e916786caa6b1db93a88c6990093b4fdf2266ef039bee48ea5c25b3361c00dc39f454aba189f132c9f2b261a8b98a2e6419dc7c31b06d0a45633cc53d40803934a94ea38f1e6339d8747adfe50c9893e91e350f7baedb8bcd8a4f023a532f1e6700254ae383989d17cab69e7c0d79e4c4c26f8e8d4a75b322d6a5206e0a4872acb27fb5e3eeb96ea1225d076ec7f99c4e760de6523b33e1d1b965c23d5f95a4ffe73d249a35d37d785670709bb9689d2ef9750344b171b4c2599df554a6aebde2df0de077e6e143bbf68955a05ae476df48a11c93c26b1fb187bf242e4826c698d2bf9dae0d", "536a00516aac6a", 0, -389797540, 0, "bbddf0b37ed975393868dc77487707e5f92faf7dd24cc94bc50776e23d6620cc"], - ["71f8bf0902c0e4460f2ae416ac84e27731bcb4cd1a39997a87be3618b7a5fd1f12ce4e72f50100000007ac6aac65520065b4f56fcb78db169a886b191ed6c177eebb9ae7ec3ade43bd37eb293e36148c536967df04010000000765ac5253ac6a63ffffffff04cc0e98030000000006525351ac006a0c9b5804000000000452655263883bc70000000000020052f40a07030000000008636a53510063ac53629979bc00", "65525152", 1, -620424284, 1537743641, "1cfd0cae597311150de48278ba03e55c9501151c50b36cbe5f933b06b5a4e5e5"], - ["030000807082c40303079dbfe198e186fbe5f57af9bcccd9ae0f74bc3fa773fc51df300115a2689fed02000000056500510065ffffffff61c7831a54d903fb9fd738be77fd93409bb5399708672965124fc0d3ccebc90a030000000265007501080461e4798001862b63ac2c9daa5c91e635f69828edd0226a0415bf311b2fa9c7600300000007656a656365ac654839645304a583cd020000000003005200bd7276050000000003525252c3e90e030000000003636a631de2ec02000000000565635153ac20d6b3ae000000000181e35002000000000000000000000000b9e04544dcf7b3fad42cccd87175ff31b916c49cc4aa6e1ea4d7fba974f4ce39152b881f3414929ec8980d44367a5e3db61f3a68d46b4ec7e4eb1c0576c93eff3471e29da1d81f8eec015b924450301b653c03795512589ed80857524efc506c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b4e2bb5bfb4c3973c710e31e9099ba18ab2610f3adb583b0b1aae056ffcd643fe70d59aebabd4970ea2dfe9ddd83ffb51e74fb41ce3bcbf3f28e8560781bca24e42847ea69d8dcc1f8ec7812374561bf405587eefef70948bc28270f8bae4ad8c0155baf7f53ca6f0c04d0e12e75232897cc7f20ca561b35beb012117848db2503002a55b1866ac53c8ec7da6e8e9c8c6ab853cb50dafb64ca7d3f1d79eb8d2034021258088cb60855a604722c3342b483728309d92acb0f680bf2eeaaeb3f67dea00a0790e9b7122dd67c9a7527ab5f771089f09a0b5536ec883e60335715eb3edae7013e94d1e73d4db8698ce85039c960709d955e5604b4aedb0c7f8649230a059a0329fc1ea6fde689d9cfa7a9dedec04c9a91aa2144b00510af0a5478c30b22a224022c703083d021f2abd7eea7d21faf8dd497aa6d6d5ab52b5e0ccceafd3bd24657022b129970bcb74ba82f4353a8f96d6034bb5541092667c74365aea143622cb9ea0210c41c43e73b66450d963ee33ab9339c39960f97508c76ed56216f738ee6dc1e03305db90115d0ea5ba36b87963fe7970e16fce50700ea030ac7e4ad4236d9690289d2948162cd29af093acc75c918d35e1b123bb46bd406ac55ebd0655f875a0c745442a734aee9817aeffb0dc287ea42940f015dd46370c5fe3a4ba70261aaae349867677fd921336f39ab7b0bac87d3f31afcbe2b811189ca15586f83c634069de1fdad2207b4496b27d593fd513c89f2bac416577f74d1f6e73703e7187c313ea7429df7bda1728398dac29844de6ce194ce55ed6bc208371c55e487afc95f9078ef39c688ec66ef22479d5727a7c7755bf620949dbda4a52cd12d3ca2ec9cc16a7488cea67e952077494b96f6953bccdbeb7941b737988c668462dfda39e4dee96376c4ec358606701491126085981bcc263fb938e15eb8840de78c8147203080d8d97d60be84925a18fc6f26ccecf17d604eaa9a311a47250c10bc860709f7b25e25b45930a0e1d0e37bc9da8034d2ead8acb425f7f3c972f31d8d0df35e2372f7cb943c8790ea4ede3d0d298d1072a45a490c50868ad7d7073b6ec404397a1900ba8ec42110dd1c04bc1311718c172ca7a15ccd3ed0b87b10af5aadd78efb429a4ac40d54e53d9d1245c73862466f92029e4c6798d791369c353eb558dd0071e97172f05de914aab06976a93d6786e873ffab34130573d9ff168e516764ad5209f179cfb916e442eb5689161ae60d732d4389576c4edbda9cf0ca020db223be7c3ff194d23d06304b8691cd4697fd86a0b2830a95c915c7f81d7b2493c62edc3f4c0ff86f7cdbf5e9c995baf309d4e4154825a1518af50e2cef346a13683bb4e368cf6b274e5be3c5bfc65b8fcdd53f5e82f3ed990c58ab0222923058b1be4d10a29fceb7c8476d07857533a7da3050bdd45974169c66b35ff6223038239925dd0e9aee2ed23e9a5eb30cc11a3b2877c07496146626d69e4bcdbba91684ae89e8549bb79d3fe8479eba313c1670c35427a21efc068f5d1458e2ee2c89829af835ff523d66f2e17c593656e53be34ed74331bd76702680b29069f3cedef8c178dcbebec1222f87c2f8d92a819b31ae5f78391e7bfde49a14c5c23aed707d18f4daecb7bf8024ddd667ff7a6f505d2e913efd0a06c2496ca011e8882fe418067e46967c1036a871b4f9c0a45e7a0c174a0bfc909121f2acc2c9df4845b9b95953b7846922cf451e15bdda828f647e4fbb62366cea0891d007de9f3303abd0978794daa08edbac13b696bf7ebd3b55006a8cb16a366ca473dd96b7230db97e58f1d05ac10a048f3c4cb9459137023551bb2317324851837d0fd4c2902a4afa16b0939a92e521171635bf54fa1babb8bc8fa40fae4906f568c4a5d1d95e94f7e397111f9a8c8df8abe38f99d1215d4cc26d26fa64177f71120d6c74e7c2e3ef5381d7688f8be35073f1182a99132996c1e0f860ed1453f9f39085d0657300e940f2a9ba1ea69a095abd9aa7bb35646bc63def8671f1a618cf242a28ffb1d673720fe54c9f71e779d05b362dc52a25012d62c65406ebf3128831a420dee42c8d1d629eff02cd5dd953cfe4291935295b935b19f099c55bdec6314f0088dec59918302a1730e0f4be126b63be02e78611228af3f1253f85716ca5886d22d32c46b3c0b43056a17c132fa9462995119808018197b92ab9e965dbcbe7588e0859256067345c2c44e73e5ca15aa583c0e04f007339223d1217b47f730ea2c7b325d600e6d205acdabf22cdfdfd2a48701cd349fd7c128a09dbd7841951cfb0a7c77a83b39920faf4a61f6ffd814bedb9e629acaf60781e22f4b4bd74079bbc7a0d7b064c612c51af10e3bbd7a12b65680718e103c71167243aa98f6a350ca28df35348e417cc07d9130fb8afcb9e7981cb812109", "5151", 0, 1284679100, 1537743641, "e02a91df2901a41f95f7bc8707bb46a100088cf0b2c86746cedba315c4648be0"], - ["d1094b0b02117360f0e4cce05d6653a9d76816b6c0ab0df47a8299f3220a93fcf50e5785890200000007516351630063512ed70b6453123ce52a311ac8d8614795ab6a1f9ddcc7afbaef9a0b622aaa189a87a269770200000006006a51525165ffffffff02893f900500000000095151636a5353ac006ae32f4d030000000002525320a4810400", "63", 0, 183932446, 1537743641, "4800a49d220f7b420f48f3e1f6c3a88304333ae33276d6ed2836399424f537fa"], - ["030000807082c403044071918d6663c860261748cc49f7b48cd779e156fced84880375037fa5117e92030000000453635365ffffffffb1149f2a7d997d5d5f3bbc80fc2fe20dee500ab064295a22580ab91c3f4780fb0300000001acffffffffe4890766ce6cd813db40cf190d55e0f77e0f5ca1fd99dc9e4d69a5ea6ad6e175030000000851005253536552522835ed43aada6cd904231a5a14b66eabe90de4c6581951b3e60054fd10157a97872a47080200000006635251535352869381eb04d2c1590200000000045253ac5302d1f3050000000001516aa52402000000000351515258461e0500000000045365516506ee9f860000000003000000000000000014d3fb0400000000521afc27f723bda3d11064a29cdc41a089ad2fa406b43f704ba504a4f870808f29efe3e77b607e9650b15f4440f7b1cb80c87632d8f1ec6b2fd858167bda1fbb3b84c8b839a3d22484ec5304de73b0c44e52a9ab9ec389d079bac3602e551bda0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c6f6f8a0276cd7201c3bf0743cb7f1fad6e91eee421e62937d97690c413f272912c86142328a96172bd18c36eee142fb7968344d00317b4b0e5e57192bb48a777c2fff2f8f2f718c1ae1bd1c6bc814311dafc654a80434e0d4ac2489b658adec6cd369437c9a332474d5c1024d2a888e246bdeeabe26ac915a01aae9433b69032736afb640ea7c1ff793c0e819b832933033ef21da7b409b8bc63d77e50d09ab022f1acf4cb919a1fb7dec425547feccafe2112c3d38989473709a7de57267cd270b057418e15215fc389d1d75365e48d06d05c39e85f9c275708788ece45790be309277ae95b342d193d2ec61d0a6a098b7e93a5e2321fa4f360904ffadaf0fc657032c96bc98207f1e4c922d77a80093a55c02aedb682fa1a0db9682c7d4f6bedec003094743c6af3579c5c9a9543ffc789c9e6da7be45360a4cabd23b81a8e8a1b54d0322fc3a3dd0e6849f2f0702703f2878f1480e42f4289038ef2c370ebbc0b061cc0317c05fcf56d910a037dd0e9c8e3325cd10d3c361de9bce8c97cbf482d71bb4960316468ddbee0e0f2077791434b34a5c7bccc1b37075515adafb5c5f80e23da6d5b571268db326a6ebd8a5b6496b827f0201e628d2a399700a5c3dbf6eb5867a2d7ecbd78a4bc63acd3c6f3dbf3cd9909d7a1d7232c35bb78eb6278c78524bfcde1f16756ee5c85e926c3bdb95c044decb3fca9f4b71f1a3791b8f3bc09497a03e000779a666556ba079af1dcb8b39587ea3132e3738ef81383c056db0566a90b75ea942e534bb63678ea19b7e668cface6c19c934fda4365d24a3e05a95356a53fa1df2788899de1ebb527cb5bfc82fcdf7c1698f0e9f2b0219e202f0915da33071623c000c324413f9f7978cc94dc7c52a43e418596df18fb87b858a50811eb63e14ea9d0152aece1c838b398a73cc8e568d721a90b4842d4b7e8f9121b4cc2e32269397d1d6acb09d7e38f8b1dc02cd5808bf0d8e400d55f7663334660708c64a4b992bf1ce711ad0167b75a0f2d9d3c9b02c045d66fa8911177e169ddfcbbe05e83aa5026d5ffffac33d60ec1715144fd657c73279647cae3700c92b4cd31a628ba711dbdbbbd0feb131fad9400f0dc73d20cfc2a3468b652fa665ecdf28b9c36256ffe9b18b3883da68b48358d49489cf7cfb7161facf64e8eb7e1bac422612bff82a80c08c730bec87a2ad7fa38f9fe49f82a2b4c4438495840293a20a11efc4c3ecc5b5c1120450b599752b9b6481e33637021f61b67236f9ae4071db8ebaebde7c12dd11ff33254c925ecf77a96a24768e153a63f22b49fa830c90d5223af028d2ddab6732849bbb503f479b272a9cd4371bf4967d29bbebfff7d7d7c091ae2fd9c884d580f7958f0d996f811a659308eea412464ddc94d6922cf2ae3c6c41e2fca1553f0de88e7b0606b56e9742e19437d0694bd30b6ed83422cacbc074d73ec684508c102c8f88a7cb174b6d704d9b29e718e51312339c10de37efefd62f722d5aabbc44b5bdb3b2b7363082f3e0b03472a3cf658b62666517bd57d250d5f02b3c7897c1e3d541706233bff3cbbe7e7ceb23fa08983d9d0f83e745b1266f814227ad3a7a73e77f8f3b0e75ed9d5356c84bceb8b211c3465447f20143aa7e59a2701f8d6e0d57b432339bdab8952f8168aa90a9db5e013e5d0a7e296617aa5463f1c217c420e2060f6cb805a842c0934652146d2e792976835d5b984f8f605f16d7deb0e4387b81d3aa5dc22b1d3f8a1f0a3a16d8579a06ac60b49a22e05eb263ec5ff1af1cf8f4305a67c753a25c7ae47df5d361b825ecf04eda197ead4f56f15c2d61aaf0c9abcafb177aab868c407047a2928b19545864bb3e7e2e4b4c149d2c53ba8eae045e392da39ac2f5fcfa4c8ead9462754474ffa55eacba86e538c07a585dc7f9fc72826148cfc730c9870eb2faca76c96546f9183d9aaa5a927adbc8ca9aadc3a1bdccb23f8cf022291ee467b9aa9b769923d950e300001067b20c66b0002b810a0389e4b1ad359073eeff774e59423920e539032321586558498f9dc3cffef359081ebb487aa25f4d8ae79d4acf50a49f2cf7b4122bc91c5a4f04e1dc8e417f9de220ea405e124f718fc04b5a72533d075e078c51c2f169ed1378397663cdd69e6bbcacd137a20593ff4bb3465b41f384105f63f38819457b462a2c6df8f689f5452d27366a46d6abdc8a94770d20c54c0a574f30776c41e141389b6f16ef831bc5cc9385d56fc925b7279c51bf17c002fe6b17c8c0edb46e5aef81955f937931c5ff3f6506d40c340000000000000000dbafb205000000001b030f29d838b0ccb2a515e9eb0e2a167dc9f820ccbb4a71299f28de8bff4947c5b8214a820dc0a5fbcee48a4e942b360c0714cd35690b7873a00aa0730269886907a7933d9454dcab83a61872a74dc91850e4d9a6fe02ed32e4ee56752c235d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000031679c5093719f316593520cb0bde2229329179ed2edf88aedd04dec9824e44db19fccd7b2b9a713a4bd626bdfe78411899569157b0cb9ea30f06326a891e49f9f9bf6ec8bb7036c2b8b6797923da304d8dd0637e1f41ef07a691f0161e04b1a1ee815e62410ac1e8593009ecd4fbb1bcbe0b6033a6403e89a36f200ccd210d0020434d01236db8ee8780e47bced1f5c457029116886b5d1c7735ece6102fd9d9b0200776c2b9e9fbdfc9ba9115340f3fad155de1a7cad387abc0d5e1202f20b9d740a08d4a99effa3f7de9a92743be11eade341c3d322c9ffa0c225865d3c40f56e3f03059ef369931c9d19e0db0a114db2cdf41f2c9b600feeab7e6f010b94301083020cf31e565644ee9ba063d34cf55c33f9130ae2f01caf94a1c5025e34aa22b77f0221be7ebb451bfef81874d264a550b8b718be82f83ac4d28232302feac477f44b0218bf69a750bd956783897d04a4a1573ccdf198a8646c53960281ac710ccb578a031bc81b90fdb8b9f110fc229a3f55fc9c7cfdb160b99d3ff5daf09a5b0a48d0c20224d820680061d914ee7e8a21dea9b8f8c18d444d0ebae0460943a26235435e7fc62ba0d2d083681e2ce77adaa47a11067657a3efb6381875100695f779e1aa2d4e55df82be16a0e5c6fe5dc57e3407439977e6b5c214c4ba3715d3647e7970b9fe39df8fe3aec43b0529b5320b8ca3214f1b1eefdb85a356197a2dae9a4aceea315e490e2e54c225250778e7c8e0f81e78235927d8f34cd519197e8e217978d0f8f42ff6833edf77a3945736cb09f673be711e0f0ede0541ca395d2b900258b5fbed468bf8c40ea917f754bbc3a8a093fb2748d059dd7f02ad0cf715548a1a97b288805b4b2c2a25a7205410413b03565eef76ed789d98ab547172e3174eb664877c31056d204cb3bbda4ebcfcba61ff5ce848a36913e73c048054db1c3f72c6f8d082d7c135a4a477f945a21b8f544c8034f36f0c6003017bcf6788ff67b81bbe79d5c3d8d4f2f56feaaf4b0988ecb7b03af5c464fbd7d767dc8141a9d4e0ffe3d1247d6086565f01de974c5c1e1bcf392de68534d9bfb6fc2606a57f9c9f790cd4688b292c307367f124d0458240123173ea170d53a71fff727271354ee02beaebf51ec903d693456a2d5e26f5eea455ae045551105148e8eedb19588b18ba8df157dd86797cef02f6fffa874b70bfba589742b24b251eca134646b12227fe7f9905fb82c43c0fe15d550699c7b0f6c77cf2f537f376bfcdf66e783e20d022c7b254a4b2183cd7b01d7079cf13798aa0ee043886b5222d494a29247edb369ba9876e733c43572904ed437b6c0057a342591e3f612953eb6bcfcc3b71c75f35907c7e1fb808f3b4bfd20e6bdc8f0fc39c3830a010c7060cb7ba613c70fca30be248943522ee89be560f6e38adc58737beb2e44bf9cb3dfefb62989c56a2d029c3558e6e4818495a7090874257df344469f8f6f8c55a877f99883b4b0b6660c662830e640956c5649942cd93933f00a99bc3680700d494e232ec3c1a540af033a10f067d51b14591ebba52ba89108676f08871fe6b5e026d90a92e0104aea6628bcb5cd4eb64337bf0b25020b22354b8a0f66f18bff0fc55d0fab6508c5989ea6f6992e64a960581e218dc1843fdffb9732cf2ea0b55497a6a733f3896416f2e24fc787193df33a79a7480d0f1e2d65841d10f5f1af032895eee78e59ac321dd1e46771e63d6eb83c83fcdded90964e0d3b07059cde3cdabe57a7734c4131229b9938a2311d209be00f5ceaa26d4148703f224e6b76dbfde4fb11b0f6c64bd588e7bb88965e5a4cfbfd0990db3569aef0886ae8161cd993efe69f1b78aa666934bd0ce925d14b61219ab7fee8b19eb17d9e6de77ae4263b8ecb0f7b1e30c2411c5f82258d344bcb510d3593f02b859b9e3b88978223a42f95d017080a6af7dd4ea64e268b03e188762a4febae0f60772e969b47682f1af12044fb09e9c68e2a7b941989dc15e9c56ad677d16041f2c7b8ab6304e216ea6e898448f883c2fbba87dad4bfaa9720add445d258af42786c1aa9208a997c7c1b387917fb19329fede4e199a682cb94e780b4ac24e1797d4bfa2d26bd9b588e87f22e7e026b98e9743d0a6a82672b961f6c1d72b0ceaf5138ecfc49ca88ad89972ba2119fd77c407f0bdf1deb87ebb9c1144d66b8b677aa9e2600bf03d2a6962d20d3541b262f5d57ae42aa69b5c9653831cf921b34657c85ea1dd3ec0f175575ff98d92089179e3dfaf0c1c1d1ab679013ae41add7a282bd43229de624f04000000000000000000000000885ee158dcebe93f9dd33607150cf953cb008b434d84159312fe4d57854ac3cd57b2296574390c3eb28cad7330d2670f716384b265c4e6e6e88ab09cb5cc3a0fb3ed5a17bdf7bcbcf209408b117c50e3c7b8b046a20cacd2810743c12d622ea10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055b821f8a6b9c87864bc538033f19e27ffd22b43266ace61663d0481cee154d396f478f91979ca0ac4316774de0eb1ae20e67aa9685d22602a5186d31a52a830842af538f7cfbdd0ece5ffefd49dfa31f178814252b8864956e35c22486e8b3dec64fa8cefb0f5712f06f731c39bf23d4e285d1a5ad27191c168edb5b14ad8d1030174951695b589076d1c8eef7647fe0fde4fd379105c531dbb0e817a2565f1e20307c23b0d449e3be254cbfee89f272153f20d1a2e457c321f72f5dda63b569cf90b00e4697a6cc62944ac21843c084d6f4cd5338afa1716379fb3df4a69ea89ae0567d5800878fc8be36dcdda203e6044300ef80b6adebc3d0943a434630a6aa0980308ecefd40a78736046e0e380b41573d3960dcd36fc885a466e38e3755f35aded0304743dd25e65323662bb9994734c692d02bfa5583ed070472cfcdd5e25fe978c022df00b51646b05d09683e206905278ed559e0d17dd92cd22235b40a05cdd407c030fc2d1841fca5143926b2c0424fa29d2ab2b77b833a47dedb057379333fb876b021efb7ff64eeb696bb010f713321aebe701a29b9f496b377403d97973a28e60c7f22859b3a871670a4bf9b12b42bb912a62bcae331a55d72e9ef94cd468e499b09529c51f73255aa9c42cf685d6824c1f1847d5834bf9a9a6a85a4ea30802da1323fde222ff68e5a98fabeff32df7c87c27c623a8f476b0f278a88f37ce751d86bd1b60e86c349f129921c6e06d2ac114c7bfb6a8d0645d5d53b3bbc9ae4489ef729f9e9a8b8022e7cce57ce7844957f01d50e918fce751cf65849fa52616bf8ad5d3f217aa4c6924a09cea322d4f7f2cbbddbaa5b25abd8c20c2ef736a2daa3e347a05459d98a9406fbd6a9f718ec6f403591f0d39f6a6583d232039e4040537c90cf24141d73bff854d23a6c06c6d29a6a3d5530c4d40f5dce3974c336ff2ee1ec67b3aa197f75f8a3454a62f3b5f82ee05b9a0bf4d3f981666fadb4b803d57aa8e1389410b858e28734605f1d1fabe6eb743eaf104da538b2147dcdda518c5fd19d19e1493a0ec99726173168c51553f88a51a348d6a9734f266946c3d5a5319fb4bb8ccca8a7a594c2a08c28730f450aa0eff13dddd240141267ca1bbceb1db88722036ee723ccc382a7f323c8f98d48c26339be5e0bafdb93ec429a3a149d5d1548886a5440368834cb8a73142cf22e29478f59c502a37ac1ad40d2d18d71d9f33dd479c916cc65688ede90fc6de6b24ef8aa156a823185315b2376b72c8a800c5f23c70592337a6f9c1bcf8ca97b21a777c302ad77ac6210eaebfdb8d9f1e9767027b81c76c8387017e9ec84ec5794ddead3e7f4642982efbe630b04e309b49b0e84aa2b2bf8fc64a85604ced15068cb12f50f8fdefe019db949ccd382e6bd24ccb77e58f9635f91d0b379c6756176b7cb5c4090bdf7311aa0109c5d9d15581aace7e49d647fa2e48f0f192b30bdb5699805b5251517d90f47379f30e8f3c9cb97eb08504819e9739b3ca4abd97b7fedeff3bb782f6d3950119c3f53029196e51dae56603ae3c28bc10a6361182908fb7484fc56efbb3c60df831c7aa685d54ef564250e1af86fd2066aa9a8ce45fbdb8fac2dd5a66c05ce6443071f6417bf29ab85423e64d6e565c682395af53e242f72ebb4b17ed2e170533ec7483e34dbf90a98327213aadc73b7d1bd8bc0ba889d083cea8c800cbe3072fbe3da3f333ae96913ef8ef5df4325eda0d71298e402004361f9e1e909fede567779a997481375efbc1c8b506df4448c397c6af09030d5bd656151c12c646842c2e0dcf66601a10ce9c123d433dd7547cacb8012b0314dd26835674f322c0da46c12065e8fed77dd37e48d1a7449c35370c431360fca6cc3245d6be38ab7c9b9668137136e2d0a6cd8829d11c44362d1c16ef59fff3d568ddcca3df79eef74de32db96103c86a3a7660052abd4d34c2484091957f4b0fd5abeb15a1f6987dafce1474347fb7d76975390b6992a7582abcc918a7acda0bd1e4d04c20068721f2031e1a9130f08a7c8751ededd71ec50e46c19527ddd2b6bec9e8578078c161ac663e030cdf8b1bc78960b725e7703a59464927f8424f146728e341c155104e275f6992673343801ae7d5a52e113eda6cc11fb2ffc7772721bae1570283d426769ec66cbff43ad5b295504e25cc5eebf447285d561942e739e6a2ba85ea29cb3f1389a28e6c5de403a8e1987d5664e657b8d06249575171bccdf0daeaedd346feab12182c40a7e2f132c1edc2041c7cc562fee25c2ccfddedd2760888da9a40dd4bf75f9f15be7d40f82ea69065d842b838f72549bfd92789c515d9d462977f43601de7bda1780cdcac65147b85b30f67b344a5b3fe323de29ae43acf2370854d01df8fe7461710022a2b99b55a6a276959dcbde271f60d", "00", 2, 658863945, 0, "5bb35a6bd3f33f9a47b656019ec7517beac422d4232644df54cb6850de5149f2"], - ["030000807082c403017e7f4e01b5caceadef4debb4919a864fefa0c11ed347e24566d5ab076f31cfae000000000153daab69e5017b38d00200000000026a65000000005d561e1e0202dc2d020000000000000000000000005ade84ffb04a7cec6073d4f418cda7eb46c1ce0ffa059cf4e1a18f75db6fb2a69ba10da09815896cea812099e603123179506d00c4818129bf52b7bf2ffaffca2140aa8fafeefed912364e9596848bc4c84443afc5f2b6745a73f26de1868bb300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cfea7372ae43f7de9f7defb317698c685eb6af5396a39157276e0711942b254ef3e5ce83470f648e6b00c7bb2062faaadceea9648ff1720269d0a45c1cb8ce6d245f51d34b5003568731c1ad8665b4876e8a4fda2230a0d38c138019e817f26b9638af9d75bf199d1937e7a739fd098cd662a4dd0e1e3589cd41e75043d016e3023007b34487558f4da2414146cd591775528bfa4ecb55cfa435e8c1b47727d86b02104880da14251367e96e8f4be9141920959865e829d0650b1616c3eabbed2a890b07f8ee462aa68dffc54d55e02f7b39f6dc1e64852ee47616f1a59a44e4054e793ee97d26ca1e8ec80b56ad2e1a2d0628f4eb2da5de9559c5e569807f91f99abf0300d718ff06ef560b3627fbd49dd80d484eba68aa9e4d7cc86f7cf0051b987d6c0315f4b8446ccc0350018299ac9878c4bffd36a6a5f34d2d4a4aa7b1397323f63902107fa192946921ff26e82f49098247eae1972d62d8a2dccb50239d183c901a11030c2de09940a8246d27628d1e8d72a9247c2e1ee581643c807e0d416eb911de2a030244500240a089bd80de6b6dc85dfa9dff3ffc75ba3510f9320cbac7a7faa580c15cc0c6205e4f713ea408a60d9cb60f18e86b79fbd737b659ecb20bceb0d8ea3e2dd927adbe968efe385eff9dbbbf700ad7ecc86a8f5680da34b71dc362b48044f8d36bd3997568f161002f7a62fbda6b9dc7097510a037296a7305f8df700d15db0959f9fa4d812950bd245c7c105875b716f00cfced91d0b3ceaee6ecdc5765386c0268e08cb09e60c801b8d1f71bf0e4b05b66603d763f862eb2c4ce71b45e3bc7e235f5cfd4aa4e5a17c92e6e387f66e0d6bb53dad2dd9714bd8a4950aedbc66006febb8fb6dee1ac7753c3cb4364ca6ee0665c63f374685209efd865e56fea9d094fc8dfbe0b05164d9166275bd23bef8accb2661db245f33fd14911bc6b824ad3ce9e587a905c739adf52949c48b297e5f318c3e634ed07d391433f0bb826da2389b41d05c597aa9a7caa6b7fe4122e89106e6df28c26509b5f2f29e02ec3ed40d072f173b9a743222c6f77bbc7eda6d058ab138ad86bd1bfd90fb5f3595142dc924b546333f754611855a2a54c8e11a6fb95b3478bee84d2cd6aaa12e161fd9cb133112cb5acb54da857ee109e63a2d1bd4483a3234db5442eb0ba2612971a7a91d108cec0fd8caf310e0d29c53989c2d87b7ccec5ba80a8ad8229e538710567081738ed64510a523cef8f03410d7ab65862c430cd110782e28acdaf0043928be13683a8f71b0d21ba727fdc8eda0ab52dc3508c8bdb4aa7120995f0aeed1e4913abd18cca6e068a17c9bd61ab62609ca5fcd566c2674dcd2d71e5a3278a775e369a38853534262e233390cac64010c30f40a570637cc92df3e14e7403d9ea45f3a761606a8cade1d2d58e7c8ced7c95187782d9d89a51ddcd1c8cd9c309fbc2723b56960f3927af6102c8ca837542fb5b7931780a8e69c47c6d24f09b43d92ef323397f1af6124125d45a1028cc64ff4e63fc61faf1844bb438d6416bffc535c151962895180b6840d795961df052e5c7fd39ba5336d1f2d32b1c04dc03af9d918ba795fb4b03a8f00b78758f3626ce76f79eac9e380384aa0c883990f10c69a53e57198c4a9a33d5702271154e3727ce45f1e9df6e2d9aba705cad78b082fb678968c527c72f1337d20079011e1a6d18d54da08cb35500c0ffcf0724c08588c9d64c078a55dce5784c927090dde35772afe574bca9ec5b81ed46e84e476cc4f8b40933ab320da04e0d3082b6d36205ffb7d4f442f71b8ba5579074f9a8d808806aec396e85861f0903f9133e0ccda1787bab0606e760556f952d077d96b72024d225d9deec485b0644a4bbdf503860c99882358acf64dd93cdb60304ade2df56db107d5f96fdb76bc66801a2e3d18d55bea0fbe2790f3e26476cedbac3bd69ad6335d3ffa054a7f2f245648a5ec2290b984f22adf84d1e6759705727491ccb4a8abd3029d8dba961fdbd38bff51d85f38447f2ce118bc6f4064614dc91ba93223060fdb69bdf1c3ab31268bd322c4703dda9e2e05c2f7e596d0e6535c793e9eefdd843eb03075a8bcd9ed15dff01b19d042194c4f8fa890645ed790809c9351610f40601eb4451ac876f3a0b20ce7f0648d34cd1999e2cb5af5ee647f40b6590682b680340793659973270ba2870b7de70a43bbee8e98214ccdce6c7c2c2dd3f0d818566c4b491f166452daa8acc7d54dea24c4293fe5de47d1bad65719309057a0a9eecf9e2eed623cfa6a2990000000000000000c59e250400000000f33b6d9b2a3c1589cc532a829aa4f05043a278597c84113fc1fc424c5d3fe5dbba517586ffffaa50081343ef8e7cf407489743a4eba04768617e794bc501fd059e9b3d4fea89c41c9a925d9b6c8f0d7385081fa903dd38ce768effd72fee015e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a014454012f5df9d5ace838db478235a1bc31d43b5746b5245124d224fe26448bf95ca8a56175199de0f42746a73ac225e1af369d0a020c2df7e98c0c07f6d9feca2d4f7b427478c6f382c30987e48a30476b20381be09656d0404c2665e764774dcf0b9212034a961f33f6aa126e24dae4df1ac40f86ee02aa72f41034d2a44031d304800b8bf1f7424a4c7f194a9c21f841afc4bc680a0f415f29f57aad7b39e02202bf2df6ef56df804680e6b512f3437de093987006bd391b5589d64e5f8803b0a035990d3f0ce92acd2245d65e3aad7d67ef3cb6eb438724bb4b6dfe49a159abbfd711ee78147a4a6f2514dd56d5c0c6f5afde4506c2d7d8cf3c048645b6886c702249fc5553f4b156b10cc646e43ad6e658852a8f11777bfe32be1847995d50696031fc63b84a5eefe147db08277841cd73cfc53795d39165ea9e2509a452bead7750218edf63e699157a0fe52e7e4cec85ac4fb0456ae7f7d8b8cd336a753ea3928a20207690f4605ce2d23451b4177c7eb0d3d2a16e164ae824331d9d1a9b90342b538021ff4f0c6cc19f9e5a6b7385b7fc903032f5e79b2f57e8fdb3a895c1c8cff96e37285d9cc7db6e3cf4c698f3cd048f2c78195aee901120351511c8ee6426849c9494b99000942f626f13aa4a011b8a5304b46516229634913e5bae048c5627eb91516eaf90a92a06e40f4e6def81d87aa78e4e74837e531b21f88e2ffaa1fe71153700ed0d926f614f425cf70a13a0a757d24f0d0cbb8d6a42444175258b39a730275f0b904d04fff8843766fe9dd9fdd1bf267864576b57cb3eb0895eb279f683fa0bf350c2f5874b1b8f7b1570393379cc2d4f0238b14b3d21f23e74db6e403a699df00fc76c40c4722bd7d0eeeda84f13c5252b2fcfec3e557a2968d63b6d05fe567b67a6c42c739d93a021eb3ca1f1faa449c67a97b36e306f347b4579f83094dd1ca2ac7345b2b8c3d486006e3f5b6dfcb3f420a72cd8f817f88cd76160fd41cce55a143bfc0c8b31aaf7c15c73c1e484bfeedc3c32a7c3ea7772eef71d1d6f84be00a6021045faed139e5cd975db7c5c9d9302180fdc75f9ba675522c7eadd12077c503f5f6bc220a556c502a85f1d811c32d25b6188125ea00cd10beb3df5ab348b915bd8601a00ebbf3b9ec51686935e5dd73de30cf8eb6e25bba5019748f37f35ee757e25e3c467167ba543a1b918f08d99efd9d825eab615b5db70a4b39ddcdad79185499363ddf59b92c40ec2d9e75b2d2f2eef2727e04850cd3491f94ebab1cd7edff0f5f98785e1e364c2a809ecbc97e55c71843695a4def9864c73bb86488d7ea8940acf5a4c687ece7d1a7c64c27b9cf065994aca148cd1eaca50fb173866ad729d23dd87feee2ba6241869beddd3e7a855bec054cc7fadc0d48a6d7abe2e060ac9e64c6b2e406c825431cbee23e03cb606db6593932a991e2dbc7d69df775bfba92b685f1285b9b74bcae077da1acb5a1effd398781555f94a5edd8c505002cc628cb7fa3c03217ad65270526815c173414ea0a1b2965a41b9f5446cdce35644d37b90008030ba41f6a4afbd17d5c5de45ad801d8a5cad7602d23ca0fdafbcc8db959bdb63d6c6c16694324056fd088205fea5e9f1960e2581ccfb15bb9b0b62a9de27be37320d1f5d06c41d33e38f8b67cf17a9515f6f996f34a8ac3a7259502a92dc8fcc0b2f327df8f675ebf9ddebd77d627078885d0fc1fe8030b5ae7079020a3264ada95e9f33e7c4d2d1f6e87d6a2bf802a92de7fc4e85859c0d091bce5baefefe1dbc3af8400c8b1e7b273f6e06faa4b6cf4e34749973095cdd3fc10601e5414645c2630fbc8d95f1377122c97f1ba28d51b5e1865775b59930db415a47fe3e7b1fb0ea67111e2bf91756819835b7ecee94711eabdbdd1eb91029de955e406688d75a3a8bfe9ab1af9d1ea49b595db502ec00ef3a7b69751521c77f4912d83ba1a87fb67ecf96a0837579c339e240264e7aaf78511cf7a688778b12d189ab6bb703fac1c3021a6df47728bd4187001a85048c52c98af963a8d2b04257eac18ecb32952ee538da2ab93a84fec09807a070b1d826ad682a577a9b0f075054ade85603f6592dfeb18f1ecddf90de03208083e1e1a20eec70529d15e8bf4a773f94754c605ca913fc342e3b05e25ecb0e0f4b5b5560608ecc6ceb6a3f3ce349482a254502b833a517bb6e846a7765562294ae010b30e9f34cfc848a742b6e81be3a71d3a0c33277f6afde0787dcdb0cb47ae06e3e21a8775fa684b5c3e425bcfd51ae241a641c1ccd3ec06cc7bd5f04924fda8d306b1131c303896e4180fc435c22b8248e5595456a6a1c2508f8c80727a54e862367f07ffba4858883132385fa89d2078f1da7fb33f12b88c8f06bb88dd683cedd9a262e7fc56f34df3289c58dfaf5535e7313c7b07", "53516a6500", 0, -458615217, 1537743641, "f8331d3057c62ed7845b9e97ba6032bb05da87a6cdf51ba855d43adda113568f"], - ["030000807082c403030ffc42325fe773f2c81b50ebeab65359411c5514d8622f601675f6b9a955f96c010000000465636563cd6dcc5f667a446579ebe3e87cec047b109baaed75f845365e3f2468ed0ce7c5aaeb8a63020000000851ac526353ac51658e274377784e869bcebab12f8ddfa4ad41d2311ca2f733792060c58dd25cb1b22cef5d9d010000000563ac52ac51f931f86b02c5edf4010000000009005365ac65526a526a75f53202000000000153d0a4110400000000010000000000000000b4636c0400000000eb44ebe3e950979ddfd0e1e66b878f9cf0718a3daa5d4192ea741fbef070cfb7f1279a066363ba03325b8b90960e5b06bd32c595beda3a35d1af394b0c9d9b84819a9666997b1c9ffe4364d874a8b785cddcfd9260754cfb8783fb8e7bcd1a0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1293810a1a1294d72b40b75a7150cc83b3f3a939bf009bed6c8ebf90b1cfc3bd065c8906dd4b87c704f003569833fc9096bf126771cc69f5aaf2be59b1c9d9e6b5f2d20ab4464d96257c14e50c06699f488ed749953e603b97390d1bc6cfbf55e30ada60ab42c95c3e884714111034abf51633cee4224ee3a461dcbdb9765de031eaeb387865028844e1b7910c94a964964c95eada83d3d29f2d16b363e971f8902252f5c050f5775e75dc265729ab6fa8a1066de91b256a5be377f4b5bcf4851e90b052778fba1b8042d46aa4e9f2453695764843c511dd7d1b0213111f43da6ed97bf92000d8b00014df0a913559eeab1d00b7e2d5658e38a4a5f37cbe3659d5dd0032f8b53d7b98d932ced095a057e0bbbabfef0d4a74537fb164d3e6ebb457c9a5e02123e19d3d4096ab345f5f0160b2a991a290a502d50238868c76618f67239bcb8022e02f50a0553c69f5cd5c39331def5fd151e5da39f03e95df312073824d2f0f0031016e9db6f79974a4e2602fee4d1e87ca39363bb114a6e6e87a6338e8458c6e4030749b511f040fa40435fd01d5921abe217e7fc462e67ee6c80d717ca4746306f73ef7b8be4d01efe2435f1ec08bdd50bb7bf187247e715d165bce7253231a21652c0c4e3d9371cc38c964e63525f63f88425f8dd7dfd5b5842acf44502c9bebde39875a7000725b71455adcb6a032fd2e7b0681588e37b5365c4dbaf7305d1c451c5832191e842fa556de3b50f45a49abca68cb0e1168cc0dd941931bcadcbb6cd7e39ea71fc71067203abcc30f4b10ed1bc9209df8c46ce3a004574813182c56d735431d7038fb0cabe958c7d683bb43807f8e14899556b709b40cd9e1268ecd038e6b167ac9195a7557852e0f074f0077fc260b5ba4f3704c6193a57c9b325920395091d5370a7718e959c678e7b4fba93d8e04538dad003cd3ecc3300947470f534e8b291bf7faa5c1788b0455c46c66ef002a008cc707abc9c6e27b3a864c988cc42f87eb8654dfb33ba6b3bfddd565a021f141baa983e331a5c1809f5321fbaef6d22d74c5362a79dc659706c861363f7189fda3d351b72280f066ebeb6de3100192548b9c11b53bba67b18b8a37d845f46c067507479abbc1e242f9431217e39a65cbfd5c7e67dcdc29cffe56713c63afb03dfababfdf710ca74b5855d16b8f92b6dd324e52c10746d77300986da47126866792566b82ed4e8f0fb7bdb61fe0b3ba145741f81a8c8e6179a442aa463a462dcd5d606b62f5c97450e07c788024b8d3f609f354b2d2e6f8f28a8259f3709a3c98350a74a4c3537bdbf5b980b964596a5ddfd3fb3d0a726b028ad1ff7de38cd8fea6d951a8ad615cbd06ed2734d0342d9a18183534246b3530f7fc4d7c41b880d6e2b879b2d6e2a4c89c6ba3fe212052887e20e79a68e4b9bbbd3dcc0492171ce34b526dec89e9bc794bf91fc0ba84148203331ad7b2a0d91413287584003c5dd88b4480298f68e935dcff5069daf0542b338ad3b30bd0e1a5bca2bc375dc4f6d6437c23e435bab85b0b10f3eafb9faa354a6db479abf44d3172849c0c937f7efb7c5a7cadfbe49dfa76b190e2429614df7833455b9cac20ad0c20afdf1216761447708e02ceb6b534bea1cd20438b17dc512b4bf01885ff870bac43af3ed66de0821044cd7c9dcf845dc73f760a71873a9ef8540124ec00d5bbcccce6b8b279982333b0d07e023e8f45ac16a8c7439ee538a897827ce07473da21578b7bb073201fa355c0f7431fae8de3506942441a756fa02ca0de97985ad80a375eb0b26a5d55336c19802ae2fbdd2ccc404600f29dd4c866e6dd337fe41691c2a04198af9db10e5faf75de09339bb55adf47ea258806a613fc5b60e1e28d55c4f279d52ec44681c1e75eea9ca82041c7986ddf0670ef459fca03d14d8e0f52edb13a2b564f2012e00af4c736c26c6b60839fa6cd90b872a0b2a53dfb1a0d08e536f6c06076c0ac34b1fbcbc1ee5657050a51cac8f4d409ece48fb78ea992df15af970f2949c6c847da148fa9efed2d972897f2d6cb2fe356dce3416c5b680b67271e7014f12b272af7fc60b04c507c1c41b2dd1147544984c19325138f5823937791447b0978ce19bb94bc8ef9b6847ce22713904a60523144f126da4a113577c80558f8ebe9eee81934b585d46caa42cd37625b528f56d83b36b78e5c67fc6ac93bb4434dc1310e542cc12751ded13aa72fe4c64816271096e9df21d68d6fb7995012bb086d649dda54bc6b37447afd3128edcf9e098526ef3b70a7cbc126141283bb4f8c9774e84427f3d7b1f0d0c7970b5eb2b54d526b93646acdacf8d1f851e65e672c8761affe53cbc8f08c367dbd059a7c368b24d61447c992c62dc74d82bdd4f494bad141af8d0c971ab63ce2bb64bd8441e0ec275e96357330485860c01", "ac516aac53006aac", 1, -89765870, 1537743641, "b97a1a3300cb0e11a5faa498da16bb625ec0f4e2f8bbf6ab220ca0dc0946dded"], - ["27a63d4203fb9f437234b7b754c2818792604e25312374b68c1491bc02152c43e50075f49f010000000081b35da3f6079cd5b217c45f5660b41596746d18a3b85c9ff43ad3e2034e3636cd43e982030000000363516ab0b7fd6350ae076b5d6062b82b38edf014e6d8fee9720355c1158dfaed5096c9e499e973020000000863516a5300525263ffffffff04e69a1d0000000000065151516a0065fc709c05000000000952635352515253515343f5e504000000000100f6eae2010000000007635263000053526540d47b01351a1402000000000000000000000000b1a2b16140bbdb6342daae0fd3b3daf6b935869f388a274f99f7efd5fac3bb883366ff8b3c128e57d27fa8f64b0e234f6f66d09fca46ba347f5c4e54909129d6b37191b084077f70609817e8089d55d99dcf05a65f5231021b7bc728d15311cf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f210673df2ba017ca78299ba549e7c9c06e950cdc48d8f24faf8bbfc9cd37e1b903eac3e2f382ca64deb8b7c49bed26c5f555b90b9d1e5d274445ed73d758c07157863ed7b27a97ad232a5d5fe399f4b235680ea35c719af51138a489e6dcc7514e9320e352c37ee7e22607effcf573ed8ac4e2474104aecf9f07676ad6f1e4a020db6c1f43e4d50495467159aea6726059617c34a96e0ded97edfef442d9c78ef03249f2c840a0d3e8c1d58aa07efc56706ca85d061a26c89a9c534f652d7bdb1b20b04d025352084a7ac767725d748322f9b03787f522f45f2ad6f4651612eefb8ac1d73825b3bc8824f82788a55c82b7e640b58f60879b49f2913ba21f28dab9b15021ac118dd23a6cba8dd45531cab1d4597403898db39dd84b62267d54c220eef2f0306f0be04b2c435f770083c5c9fe4f88caa2f71602d325a68aa6534082123bad3020f5ec32301f367db019c9c00067a2c9d7dbd97da6b8f0552b7d220e3f919cde2020c4aba791555a37acfddc46de786bb54574ba492ec02410f7f41fa414e9e3cf203183f87928062cda659f2e2fdef9efbac42190560d72b50f5d950afa5608973b71f4792463e4da58549bc80503cc6a1577d736b4c5e0b4700c1f63c49ab3997ac8c537fdaa74f0964bda5af674cc1ca6b3849966b19a33a2b9a83b6dbbf1957892f514d0264cd1ba95031d572c3829e845f5ce0a00b3db95fbcaecdef28caf545f1a0da140c53f3b2cb239caaea28e6e4722ac3002ca285909c77ce38da05a43a4e93ef591d6b461ab503adfaa2024d506daa7c17b6768e800ad788af56e8aa90ef8b7f2618a53a60852db4fdc4dd9f02092d772823e00ccef9debb08ea70ece354f7644fa6d7936abefeafdc9b0eec7afbe96bc082359c917941bfe931fb64f8ab7e910f0df3b68e6209dd8979a9f454013ea4f07cd26d00f751915a9409ee20023f8c0564c071095d9794b2b34fca7763b5f38f3fca6d32c7a93c9a1fe37ae872fbf8fb6990252fe69728d79d5a569864bdf2540d5a774c0647a1aaf464b8a0046af977e19f9427b38b9c85348d94bc36d72dc1fc3a62e9562c6f84935fc6fedd758d008644eb2dacbb50c5023a96088f355d619ce82675eebc0a3da309b8c7491e9102198b9e0196c496d46a19bfc97b980802631a75e29ad9946be174dadf78a2e9070ed4c2f9ac0667f046400a4cd56318022f27a09485b0c7615a9d5d9738c9d3e3e986d6c908e168ef1f62a33451c9f40fcec87f507b4690a250e9523cc1559afead59b2a64d5a712dc1bbf0330a0fed32a62030b4fb90c358f054de404e7f93c74d1eb8f474e189a65408de5b9fa4abe286a9125285f8642ee73868ef9a575f01b3e09788be91cad785a68dfdc690d239862d369f57e6629d18af437b5f88002aa6ce724556174ea7c8c1250c089c40df56d24399502ffbeb0fa0d9f83cca3dd821a1db264906a69e915bb6655daa61a4feecd0542f48b1d10e730a483f2e17c8d8ef9be1c6753e499241741a96d03504c14770fa8b4edfbe702f950baeaa4cf38a9e92d92a2c04f4b094dd1e4a5e11ed4495a7a6495876a444e1a53526aa457bbaec02af80cf59b2d5d0fbe3dde3be19139f9b227fc7ebe8c60d6b3977201dc13889a292c3233e3d89f8313dedba90f5397d7983de36fab57f1e5bfe84a23b8f4f7ca13364ea38db4ddea31d2fe5572fe975b29a1a63feb1726ff6da2908747bdd01b1d73ef4a89ea67cda6260032ee3a16ed1e9af255390cd47cae0769d4cc756dce194b7a1d487df2e9f9de8342affe4553b7ebfb41b8671b9ed0db29402c4a90bf3bb04872a5c11466c7ab2cf831c27b497b1bad4772c1c7cfb954fdb9628ff42f5a6bb7bc5ef0fdc1b5967f389be68e740821809d965c2019d9aabc61102df419cb173321665cb7f956ebbac45556578e3ece2cb01e643ef7c188c31ca8e5ca1dfd2bf5da9e094d2873c22479546c83e784bac28d485a0c9fb26bc8fad3e8b1d8980721605b10733805c53a75ef429c3e18afe3a4897d1f1347669f127c98a5f3b4330b417f0b3b6f6f3869537e41335115ecfe17e2730b1ca86af8f260f52e3cc2bff1936e7ee8d668b3880a8755bddee5dd1856fb02091d6b530c18763bd80982eb11d7c98e058cda75e573f922e580eac086708c31b018916844fdb1a4ed0cf62383ea0c1998f09e7d9dd2f1f4bd7dada72dacda4db76ac7d962ace42bf95c8d685ee116754dbfb3fb75e5c6fe46d91247d83589f66d42802ebc5f8449cd1a60bce209968b305ffc854c73e597115f530d428d631e7dcc5dfd463688e50c4f84be529b983429d038aae95ee59e6bddcf710992c26e9b48b37511138f206cb11f8356e7763060c8cf4c2f56362629c1c0c6578097e3e0f2bca0398649c5eb0a54ee18a3400c4cd7245fd04", "5352ac53536352ac", 1, -888341836, 1537743641, "b940b4c2ed342db18a1aef93dca6a70b690427804cb9f201242efdafe56a3eda"], - ["4f59f444041d14afe46a827da2854adbbb2b069b340d42fbdc0cab90fcf4fee6ac0261dfef0200000005656553650058195d0fdf6d0f9db3118c0016a0cb560206191c4e56cd79faa22e3a524c5ded77e52b2402000000086a5151006a530052c78bdfce086427852e28f6efcdc5b212ed421d61ad61e9bcc679606333a552b72f08f765000000000163ffffffff0957c958ca574f1292594770f2461443208391776e857fda702b48f41b2c232f00000000002b8c4ab5016581580000000000036363000e9a9c90039591a803000000000000000000000000f341e94fc7fcf297ee7000ac8232448db8503e4fb0211fe5cc883f151f0c2077ba03ee768158d5abcc0e4aa47efec1dc32b74b81b36bf16f573e991b29581d9464637de91a390e89f78abafbe59b173ea805441d16055da44bd55b36b44d994700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f1326e22156dc505dca584b58c51a8cf035bc366b18d7a082c89167e7a2f92fd2d8c4b35813014bbb7b908700f2631f3b5ba72394db77731c6f860e1b13f58c3a44b267fd7e3477de8e0c3d576d5190f5b095145f2d80d8c34f3da116b12c25a486f27e9719f077266828fb5c7ddad0239ad42bc0faffdd12ae8819f255f40420203de9a51541bb5090a369760280682069883c41cc3805b306856599a4d7e630402304055fcbeb46c236f4233dcec1808054bf05a05b19b197af57fbdadfe9204870b006d4ba38c932c8501560ad83e621a93e15ece54d9e9f0d4811756ff5399c0a48b9c2eafa4f102183507a5d466c6335f2b3d26a7997aa9c99183a4ec8fe52e1d0224a5c6c97932ed3b0354c174ab039bc95913822c900210921b1b74199bfd77d2032a1ce134ddb4b3d2778ff5ba42ce4e317c8f582c116cad17b2c8fef97871a5d8020bd51d3286ce25c79537be7fceb133929f05a350163b83d8a683bb68c5469f35030548865be662c1c9fb8593770e5766bcb89a7d152a698564cf02067f9ed811f90202a5e27af7f7d6e58bc319d73e00daeedf853371003dc400dfbcfb6246cbd42a173deab15e7d511136cfbaad9ee034972812f30e893894ce12ef700253960e82f62e7b2309b0eb83834cdeac73af040431242200d6b1877e963ffa2f696b35287334e3ce73f793591bf954bdc878f530705b75b1f4d09d98a083bfc63479ca88be0166f6005ba1950373179e9ef62fad134fa0558a89d6e8194c0021c8ad964db0dda4a78b4ea1f095becec4a558cae298d4cb98455c9811b03c77836725ab97c75e52c3a73e192041720d8124dd8e6129ff3da6b9acf6f36e34c621a8c2b11ad72be2aa2bdb0397f588e3078ac419e20be4587bc813dcd1c1658b65dd191a933e03745a8083b7dc096d1f3e9aa9bd38613f2b05eafccc5e2f0050cd6dc33fc62bd81711c844f6f22221afa9e34afc186a3e4aca2c7b1339de0f299c37b72fe5366b0e01b7776b36d434a9a90feb71733e9df655598c4a46f9a697e77d97a3b582416a0aadc5e5ae3a4dc63a3a6b7b988451b6130545c366e88262ee52be50263d24ba1d2b162b2316a780ccda4fd8459ae2f5e42d7f3072577f3ea143274c00ed5a349ea6112797ee7c3e5ccabac3bbce9611a08e42127757a2c084f6f6384acc2639dac196f361d4835cb4d5a6a3ca830b20e8d50183b7a010088f284ff7a499dddb82e7ca68e523ec2a2b96530694fd7f9d530f47b6299e7ca0e3ece0aa40e2640071637891e98fab13291afdd7d564ed11d666efe41367f2c0911c7887bc862c8190371e123c23f05c9804475e05784225d42013afef5649c21a1dfa220b3f34a74b085039701923a46379ee856bffe9f7223126295fd6db50b50639382656fb8313286e2a271af9df4ef24671edbd12a130c5870d7c602c59f9da38a324ef34f356852bd32eb5ab6689cdddfbcb15bef47bc2318a42f002a3938f4651817cf63f59d0ee1389517c55fc19ccedd9fd43022feb9bd1005c387a6d7028b13dbd42e2e954f16666ef3f0660e98687711b7771c7c9d569805d94668f2ff2aa165371eaf399cfc9f5cb205402ae7dcf583469dd58ded20d33fb060fd4d45c3b677e3c6866765bac54c7dd55a4143ac55405a26c308311dda87a2904d285e3002c12244f5d6e0d6e1452048f4862482f33180a0440a72328f1dfd69aa6d63790a5040ccf73277bf8961aae68487e190c2e11f9d66298aa72d733f9019c13560203f6246fdbc9b3e47a6d2aec094d8792f37683c0cd7188b7159fec58badd4b2b91574de268490dea3272f54527cf7f3d6105eaa8a9b80793d409df92b363515e047733611bae8a9847b596effebd843e1c52c2fe4b76b89385e93e916d79895e4e78581afa36b3f2fb5777dad6f31f0165e0d5161e8dbc78ff119ce2909ab1ded0de0b66976bb496630261401a4c6cef5f702d98db81985bfc6a44eae5d89db5956af551ef3c44a6d9ddba7ee4532a7c086973a98d29d7f0755e0db7d7391a83007437d560aa9b84c9984d6c6ced2ce4e5ccdd9811cffc66f182c55952c4ef04a60a6ac196e38743444465ba4e70e7f959a1775eeb4fdadad9a0d3d69707e13742690dc561d919879e5c9eb271df2e1049dd0c9caf4b8d35566073d801149f307ad256be617ca961e12e5229829dfd9ab51ff770a3ea99fb46a240c55f4635c626ccfacc2ef3d2eee92e7cff767f438e063de196c22b434d180aae6c3e02f3755640f765a951e68d44d53628fbbadd3b62e68000000000000000008ba13200000000005d8608a74af5720f2d502d6695f3aca71659478bfd6158283e775b952eb6a2aa82eeeff8baebeb23891d9cbe1476752884ea3b48b56727ab33acbb6947fe884c9e14da626f5ee1aacec2fed2f8a030a1cd63fec93c3882bdd4b7b299097255bf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006d004ab2828bf3f769af7ad0b7ad7d068432c22cdabf99ed40350dcd5a5a46da896cfcae3651b769c7bee32af138d625a966dd85d4072acd6b2b4632ee176eea0f7fd9d815454589e34d698c7eeb83c0b2d3fd942e20a05e559a2eafbdcb990dec69e48e19c2bfc9dd712f685553fc3779cd3539a527a7f2447c28a18a881009021da4dc416d7323abe02158a72f98a0efc94f59767e3ed2b25433169d7415c5fe021db59706c128bbe9ee88abe5b2de7e7221d0789241f0e510441b2417b0dfbf990b0474ad28adcc2787ec34c2b35d4d3167a0ad4b98be78768b13ba18abf466d3739374e635154592a43ee3bab61c2f1ce9d8675a9cf78cb3bb0518a0cef0dcc7d302176dc9f99a3f8e9063b641e6270b89b5f8bc181b2dc7202b6f94b9426f8d3f4a030413b2b31be54e6551e17aa138d429f663c360607d4eb2c296b527379dc5b1d50201aaca3e9db176bb2f42664689bde85689caea0cf28c02d01bfaabd307632dc2032a424bc5524ce67c9341272e947c17bd773adf79aad4a47c29bf9f1e189ab8d0030de6aabf2168f98ce1722526eef937543b4c4eea0e15d8c4eaf9a41c186f2000cd9451644b49c6ca65f1a417a6b6724a3f66162f18b3f4721039cb84b3e3d9a23e21377762d80f1ed4073198bff165292aeb118ec77f46f913825350e33a08d7be9eb3b25e20d283ce3adec7444576d75acc54a0f47d0b0de91f7f289173ae177f543ad34127a72f31567d7eaafb00aa7db244ed9759d9066871a982f50e7183fa0fd38acd7788726b05b038368ca683ebf7efc5056b1efe2f2dc1071b0c7d728fb1e383d69ceeb5045f435792a5d523e2d9f2ea39408c55ae24193404701f13638e718db0e43e773ead55ad161a006a0866c46df28c3bb39f2d465df551008cd098587d704bcfe4a15c9004776f9da05757ba24c819918789ad60de7034d0004cd31660e4b073d4554c15f157672ef137518010d61b66edaca8ef466dab79eae755a07346400a5ebb1436a4b7a1990eda75bad99979b6ab48c62318f04caf5bf6920a522e0dbaab3c7c7a50c4a6d4241884ac665bfd655c0073ad4d96f015469b75f8badb7f3c9662b648e1c06ccd2053d91c4d4d67d9f3cad931f886682e7a0e40680e3de90daf19fcf5743123f9a6bda6a9f9a77bdd46816e0d4e084ab63b08a2e4b8b936aafb338efe96dea1ccd11f748b2d99750a9d3fe322ca5f0a179e33f24055856dca57d3eae3ca83c2e9d888c8e00bf1754aa56a3b18686da233f137968ba3d66b5cc628d544052022fb35dffefbc3f90bfe51676510d5e036731994bcef6ecc5bee7e94c56f3ec5d35ef2b7e963aeac6f2934460142b5fff2df72a4b623ccdcfecad0b711af8b373cdc3da63ab37bf1f894b851e4402b262a9428113c8d662718abd8d8db1317bfa6814603d48e7391c5104ca857899930ab1f8fdfea0b03c538885e33a445ecafccaf66c433f50ebea1dc25eb1d370c033d7820b2f3bf25e8416b4e4be05675fe5f95a966e32be10d6c4674d3b9620ca1c4bbc2dbe0adf508830ab239effa4417a71882950f2a247b62e35e6cad97238aa7f4baf7eb35faa29604d1b4c8447d8ebed8e470cbd43846475a3915d90c551a9493ea306b7c0e0edd3ae3a5e42efe90b4bc3de7925d2af9e49f4d68c3d81dbbb0f1efb3813db4c361b4d4a2fb9d0bebd1634a7a19d40142c5e99b9354029cfdf51f8f881b74d6fcafb8cb4f317246d69d243cccf0e52e8a631811aa069068be05c2213b02dc76a3da58a987df62b066f9747ffefe90fb75b66cbae5b15acee99d434f4047fefe9384ca5bbf5d0e7938b04e75a8c4196374a38bb781ede2b1309f3853d9e3db3b5d2488cda1cb78a3bf2aab09a50165325280b3b2409d0369fa1ae648effa1697c2a8ec82c15be1f1876766445409eb9564f4154f219fc0cc3792ec65671c3d3d00673b0cb56c9daab48e9287d33e20e7c09f5caee8b1a3acd0deb0b2f6d902b26616392e63a99457a51778a9da75773595d622fe31f11e828b38f4fe4fa6e756d19a3de22ef3868c9ad75974a4727579d9f00f7c818ca07c336b4795084a73f88e1bb01d2339497527bda9bcc94428865ec3b8f3ac2d691eb80ec2f581d3f60c52f4f2ebc8aadd7e944f9819fbfad757d6a5b9d2fc4be4973311daa0d3968fbba5b1ec90adb4ff4c1d2e0cd17e613faa30eeb7f7924414564c44e85b849445c718c0daf11aae7f16f80ebb6c4b6c30df2709f1ee0fdf518a5fad6ff7a6eacf5ea6190e7c7c39555d02552bf1418e0000000000000000de37d305000000006aa239e0665ac5419a5aec34cc1ac22ac4dfcb867d8f4a48839774a697da70519a03bbec9fe5048b45faf3fff9dd59b1ab435769026b66922f93660f8cc6ed301bdce13e39586a1f9761660ad097fd00e62ef7c06be7b350d1c0eafba59df17200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000780575b64b78df17e32a5757aa6f4cf2bf51cc7b9718a719c970f3840b8c80a30607ba2dcd91a0370e3b31fcbd596e68c82560507357a2571c62ac9201ed27026bd4edacd2b6f475845e838cf54de14edb1d942e72e6ef8e5e591440adccbf2755e50a3061476d1c1f8cd6ff5a5e9519d99ca1eaf8013f257ab1c3fdf1a17b6a03216134c85ab9f898ac32b1cb06d6c8bfd4c81ca21cc41c1757464fd29b84dc16030a50a9a1c6e841006d8ea900c6db038db7321af805758f08b76e894b610bc21d0a08ee62193c950d442d7cead361313ec1a6ce216d1dea1a7519ccb420e99f5185ba3d45bb739d632b9117e938d0828661b766eb51e87ae23251d00dd0462f7751031a4076a99b7cd4f185cfe21ff47ea125c6c98e763802910cd74d0200921e7acb020acc9c8bbe14f85639a5cdf18eaaa2f8f8f54e2e82a908af05e9a57a5a23ac9b020de531af4ea6678711739eab87d0b2a3088efe055b6fbffded631433d11163ba020f75feea5228bf2f897ada7288b5ea4723ce2ed6de9ad33d5b3baf0080835a100309f7154dfb9bba05f7d4ebeddc58e01f894393583d4b9d3ae57198c107baf7d68b0bc4dcc287c473c46311dbd28ea59481daba4e6e2e006d560324861b591b3f367bda23ba52f4d43c32c6c4ab0c704340317eddae0fc28205b721d4568b59e91e683fc8d2448613a1171b378cb32e39c5bb32f18f506668443aead75bd1c64326507122bfcaba5cb32e06ac3a04f0bdbd270e50b78bf71c252548aba07db949b1f220d3ea7b8f2d93817850233c4543a3a2eb2bf659cb37e552d7909ba222732458e260b64bde42f6a8573ff7fe53413fda7dc8754a2ed67608d8c8f6657a6bf9e953e7ab81c95b8d1d32ea960db075d65345af87f6dee243fcee082866b173a7e3d7c1deca57192bfe90fbcdd4543f06d3fe9584a4c8e91d347b6bfca0497e947a0608709530c516a535d174454ca1b93fdae1089de4f2aa8367f826f9f97e4b6285457f170e3cf9a22ff29e09ee14c81933321bdac7c52eb554c0c6a0c038be40ba6079346236f3035dffd4dce138e33d4065729ee37e6c81aff343ccb28f9fc7adeb5b1bb3e94754bcfc1db85241ebf093b4a3dc79c12eb358e24f37bac70d913d5ec2f349af21d4d313ba9d35f325a59f450074fdff792bd278eb359f9d2cb4f296f879b13ea26f3cd59971c7311d063e69137527e842d5de84643d7f475fe9a2929768dc516d1c4b037dd850432a4f9eab79d301dfde3388540ae08a9dd0736beec73949a8e431ee7a2f9017e6773a2f02779c158dd81bb1dcec10b72fed541eb3afa0abeaf19af13d75db408bd17c07af3c2815bfed986a5b2e474fb94be5d596d7fdbf7656159b2735127d1788b089bb8e25a14c34abaa86f668f0749b3af481354fb56f84d002fb81e182abbb7f62aa5f5ba9fd079250eabb7064a28594f61acae76a35b73eb66f09f69b1fb5505007ded4bf299569e260003f1ba655eafa013c19730e3c63fba3466ad0ade05e55c80b13070b1fc3d1135d8c6146bad2b35ee4dcfcf29cb8f75284cc89386ee652c5c16ac325a3ed35f0c65d0ebaa293e179006c9c0e20f06e408069add48f851f58cceb4853ce6ba56375269e2523afd95f6a489651a47a2294cd8e13fc57af30001b86427dd575d1c505f2f1c8e051a85f390fc58333bf70152d1f55f059627b2d0cf0569ed4030ecba4c3f0ab2186b38b2da5743bf7776905c24495fb40e2ca1d2bdb0bb09ed0c41d74ba499f0ac35fbd7b3a4f77be250baa0122f0c91315ac5470e1161a5eb3f91001e9902ebc44c9fe580cb06f6124cfe822a9943bd79fadff1ddcc4ac9b0d4e1fff6f2eb3302e366e9666b9f8ed4f6be7b8f334ad07beb48f81bf68f3b9f86ada2d6988c054ec0317ce1c9e5d9c916f5a992a6ef3af2584a0b6061812dc17eb0e64f8a0a90dec07a962b59066eca040d5de5d39a13b88e51d1e72b6ddcd86797ad37a1fb3f4bd2e4c999cdad0134d375b91da0911d9c6110fe458fa77cc07f0a5e63c6b8a3e120f861da83e780a0f2e2a00c83f9d9b75398bd8e79f0b468a82ea43e9cac10a193a92f4ab84142229cd6d79b853ee798a4d0d32227ab1676c548cf9dd68253ac8ab4f3c5e83b413e00bd9d1f34474175f171b001a620052d2dbb428dd73300355f90228036e491e4d121f4c79e2bd220cab399b0f6e5d9351fdf3ad9b78da4471d150fd30fa8b189f58e7ce142036c303b3ac5162fbd6c585de924b56e176da0887194b5c0beb3ec217e3484fefda755e3c1867340e61a3ff766291c975b139bb589570a77ae90e04d524314cbc7943e67ba8503d9980605fd9e4a321fcdca2a330cb107d770966093fc04f75da254518f4e92989fb335686230277888e7ec5cbd96317e2fcddaac3ae815ad630c2840e", "51536a636a63ac6aac", 2, 1135949468, 1537743641, "684af7a304f718b6a63f997bff8881a2792bab7e4f7aad7509785aa5c6247fd5"], - ["030000807082c40302456d52f99d38cd25e6192b02ba8043b5133aaeb4f799302afc3be41978e32e740100000004516a6353ffffffff07a63de5147c76561b77096ae81a82adf94970a5eebc59f4a89578444046cabb00000000070051515263656a5b0fb91f0427b7ee0100000000025252a1163203000000000700005163ac53538841af0300000000076a63006353005145aae7020000000001512fd31a7a0000000002e24e7701000000000000000000000000b465aabb42f3495cc3f6044cf327e44376c34114112bbf73e305188970687352a32f9fec1a4ce0ec1fb34a4676bfd692e677e39cf7e87b01338410e353a14c6dce2cd079e89c9c5f96120f96a773e61a4a55d953e9362b3fdfb13f8a9712a7fc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dd5f7ca444909c0b5831be1f7726f5368338c4db78b235e8224bbd38fc38eac962e3aeffd3d0cc926e8841f9dd34ca46280e3c48b79b82eff6b5fefb265201741bdfb1f9b98d45db7e9fcbdd072ccbd96ec6f0cc53b47fa921428900cb5fedfd418d9d71f66f2c06afbcbacffd9865e5703c9218d3a349adf132bca0e9d5c2ad021ece4485afebb1d0d59cdb38019b499e9b46383c93a2087c82d89798258730ee0223a73fc3f8b9c5f2c9e6dcd7b6f6016b61c487c5f24a880e27e42f70ceff7e2f0a00ef9c66139030f1ca4e750354136d569c84dbd5ac448e552c81092423e4f49168b0ff6ffccc6060ba8c6c4c54f558e44c064eb004c93788d4ff36d19008272a02006bf526e1cfbb6c2edf760ee4b9a99d5624161b9ccf41e2d28ed8a07764112702027ffaea0915d9214f9dcd56f75adf712fe2fcda8393ad1f948180c1e8b36af80302709d138e5ceb51e54ce3d9609a225eafe05db383fe70e617951a0fe9d4e3d00312ad8dbb738edcf08262f6f833a52ac2e346d348338e90f98c2d07dc478f85550316d1b4e09a47cbf56c973eb48993b049c3c6e7bd84f70adf235439dab0b1fbe68c11901d3b9af441d823bfadf410307c6f73a77186a308c2c641df1c7de84b28afe920d1a39f36ceed3830ab542def6a5415c40bfd6e05d014810f5cdeb912dfb21d5fbd2b39e5faf6c397b90c0c46ec427608e828a3825dbecbdd3969799b1d84b2490b144bf35cfad2de6ddcac64d0643acf602d026af43463df8844a4a5b1d05a0e658b72adb431e024a0788c189183048c320735b753294460b5090b7a979bd52128666b3b7a31c47388d7cbe80033c88ae4a5b2d626732de60dbe8101279487fa1e51b0098c0cbdbba31555f2743bd83806b463ecf095bf39afb4901dcc69386d0d1bfff997b40b9f4f0dc1fea512720376d3cbc02d9137ab6ad8ae9c146ed051d203a598adc17be89d33b0ee445d921adf3bf182d8ff8e3d2ddbcbe1d627578493bfeddc45bef4a7d6defd981894aebe3ee6d31d165481efa0819cdc7a61e97116e1e21d76e609adb712c46bf1e7bc53bab20d8c11774834e8f6b58e5b3bce7499394e34958b0465db7aa86a8d0cb1cd122ae418d5e884c537cb805b25b3b1ee8ae9f750f1d9ed2ae34f61368a2889ef4652363d2c29d847fd9e64dba054c58baff8de5cab1733ea7ae206937601a47441a71945df49cdab38f820bfc4a1c82998db053105603f9ebb26ac6baf6f05890481234a41009ed69de8165cbacdec5c0cf635ed250594716973efbe2b583dbbfee4654df0f391f41fc4b4e107f99357a7ed7e718451c329dd2da9a314167a07da995438bdcaf4e6b3e6b6ee31db7206593a5680d835a821a6916855649d4f60fba6300d7427efd826f5eb92f5f20eb9fd925e1672a5765aa85aabb34eb09369b035dcc92629da3e6c5cda2a8855fb28ca7bdc62aa7da09e6affb03a4c0c22ec74cb1f791d4f3ac8b0b063d0dedb7c0f0d07349c242953dd1b1cc14305a66e0934f98b163b7ed46a4cd9d74a56d9cb11c65c23e228020f77dbdb09f5acb42c6e4b8d4e3ff49c1fa563d06da52748ecc6702eeaa3b9c4065ffb47945ef9d8ef87e675496d0e340d0fa5fcf0e33ea34e82274447423abe45ceadddd459efe4e57d1ed180840792e5f942bdcaf9affb885400247427e977eb55337fb95abd3d388a78ec2bc64d6de2c1c755d15b969aa7ee31a595693431cb55a45998ee1859c9b562930a9e64e2f52124adb036067042a52345eb8de60730c77d6c89c57627beeecc1a4974bd1f81a55682f6038cbe18d6862f0caaeab0f5afc1b6516d327e91c80ac4c279b30f77d5808813adea2df0b34269eb9a3140e8585a884efc1a30e14d1a90936a264a423d4f6f5ab03e91d0300ce3f96292d23d5cce18c2d2b13a93a4fd402faa694ae4ad08c64de30e17ac194199f16daf9c89d9395be7614ee2cbdcafdc29c5651541e13b62d7e07880b3775d0fbefa789e02fad3e72ab3395f092c7b126ff499ce9b454ac79d252a7e982e5458a7fb271e7867efb40ddbf3f95c9b7927f7355f60105753676908bc50ca86259780f93f274bd99cae6ea198afe22e577c2b353d4d48ad66eddab318b670c6b28b1ab925da0b63635d6c0b845b08314289a2481f49dc76a9819b96e8e4519d68e3cdaf34a4c4f390c2dca8d9e9c8668d0966d83cf68190dad18b4b402ef634093cdf8870ef5cc0ab49fd246a2efc0d7a4b885767ab2c214c30c6f4a6df4b1c2c3eef3833a0461830109a2c371b46659bc1000000000000000000000000005b611d7ddb3ee28fe9a88bc139639b5b5a5285a58dd73537f8224c36040366d86cc735c2afc7300ac3bb60342ae470db2c6a38b98621b4682980d8bd4b88227fcb72252a0207565275a98d40ba013ae6df9bb9141ce092ba80228165eae1dad000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b38ec1970fe838f49d1f90e6a3f03ebc1b9039b21d085143fd4fd38815cd588867fea695ac0e01c42c077d7a1e6c644377f7f170d1a51e50dab1730f2ded29962e10bc2eb3cdaa7884d504f64ab39a15ef7869228f12e1580b3e8ef0ecae2dff0454e9850a47be03cbd9b201f3af9327ea9b5e96babb9632b52b3d3a6f4964560217ffb998cb61bdbd6e3eeef5c1970f981b3e8dccdbdcf32f28631d384a67c70f033045d6490022172794495228bd671e960683f989c441d7a91c48a4ca07c7dd030a08c38bcaa70765e22754fb35fdcda755dad637aad5543856429b225b0dcfb4297636de7607f9f8989000b99b11f207b238c44864e2e65c8e825fa3e89eb765120222f6b8572e112030e54972a97dd2b49fbc12caab33395d1cf72bf29a2b906a6a032a98d3b75a20f58686206b2a44b8ec4a543c747d8a273f67e1133eb58e52417502071244e47abb7e423f8eb469dad2b21978ed6d8a70203dc0e4fbf9011ec4d4b9030ced625af7639e419f35618fbe3f40ab8fc0fb67700e488cf2487aa9898e11d4020db1ad0dad1a136395206f9e48d479d1020047b4081683ad42d702790aa5d4f452a315774a093984aa99c8540b0965d9181de2f253fd0b1c99308c7a05800c02efaae3d64745517011fb98907157a097986aba96fb92374e159de072758f2d120c0b5c6cb30ea4005d80698e28fb255a611d03291b8c0513f12a9a3b8874cf0a5c89edcbe61fb6619822c622c8538a7e4680b45336cfc29fec6d5054755b8ed02272027b7e3a8347c130e30f8f8210929ad83ab3ef176d983698170a407971a44dc3430eb05278cec10be0fd00a816a445af2cb285e7669b4b800317ce8802e273850e8e6b6d6c23affa0712fd91e7c1225d677120c2868e9d59e214c123f04ecf90ef282a0141673245ee484113b509b3676142c41354d837a6fc4e6dff60f8b2b97422a5b789c8c783132832111fa4836b6cf9219f51a8e5fc2013c8cfdd92d19dd4b52bd23515b71b0d8d335a171e3cd4a54fb4b76825456fc166cad9e4a66da12f3ea92e99a2a997f2e0e3f4ffc5d323b33ed376c004997edb3bb9b1ae812da1238b12e273d2dec05601b306b899de337eb1092b2acdee8ac94fb4c93656328c9a818d9fde345f66721915b7064e48e7286535a23ce9aec8c7311b8a98eba060522745c2a2968597e2e8bd8ef61036a47b2accc975c3db4f6838e2164cb88dfdaff3e0e5dd0c4731ae602dd966cf31e3fd3cb47a9928edbf5dda3ca7c0417e3c73b51815d109eb36211b5f457562b58d634f477b9180c032caffa87b494a282ed0d5682708faea2c972d0f766ff08e6d026a99e29c1e36eee147a36f0727b8e756eb0ce26c37ce0dd170519271fae3b1c69cd67d0902ab0768dc578b9ab10f05a8953ee4723241b0ba605cb913eb7c08a82daca221b3124b4ddedcd1fa2e4335bf90f028b78ac28f2ab9f1084d08331f4aeed0f4fa6bf9a30b2d8b41599311605f66fb58875cf4f3b4fbfc8095786e985b5432988d3f2183fa1b8501e9c92e7b39fd6da3b0e2b0c8c6601740624ad7fbceb134c06207d96b095500b6133aaaf8ef1039794b31f15c3f1be5af05e8287e9692171cf6182ee65fbfc4e4eb4efd6dd00815e990b4e9d687eb5573618b7450a3c26fcc8383412b33b7618eeb9d576545ea4130039b2e0f4d623ecec4ecfd4a1b2fdb79f37f1e9a69ac2984cdfde0da2ef0fad91942f2d24daf6d4f83cfa4a9457953d81d149c9a0c90d93318a44dd9fd49bd0faf462dc83ca77debfe3292e652bde64411b1494d1e0169bd0fc581b106d907f8a9b32ff3db15079b2cf83e84836ff4acc0c64e86906f0fc95328ad6150198359195e10c0d034637df618b819dd3534bf37c1a73fbc31b773859a767f94279e3e46761344ef0f569d4b933e326ca353b39372ba381787b0d790ffb060ad7d92789467cf6121c4d8ab0154ec6a4a60224b82772b5d3191d7113a9fa20104f2c084465bd240a726ad481601f84bc2d3573b13a2f58692230a7d0f66e3b75d3bfe04d701959a0b385d525d582c7a504d5b4308d5bf5d45f9c64ef228665b6e3af3bf0d11b05d9cbc6f92ef0e6243dfbc27d5dc5d9db0f3d88e64dbc219526ec71bdb2244b826ec4865eb8d68b44c75f7cd478904adc7eae06767990f2e59b816a621575e9f71759bf77ddfdae6c554996b7a213e62472c994bfc239f2953640f1491d49309736223a41c4a7b66920ffd5f1cfa8d267272516a306fdbeadb09fd6ea19e398179007c88be9b6b88a3d28514c9a69e2a2b5fb9f9acd4f1003e8ca3f45e130bef86047c64404eb797c65b821254a23fb37e964d88940a70595f2d81c1ac8e49f0f58bac047db7d7b403e2ee27dd13fef9bd338831040473571aa704e85e3a5e960657fd36ebe2d8cc0e", "6553", 1, 678986230, 1537743641, "19a2f8c75cb9ce0dab2584888a740d5093b8d445bb80219be4d258047976e7d4"], - ["673b002104e831d5985699e604a7a0b804738dd54136209f121d7ec7367ae957480b66f78102000000045353635122bcbfd2aa15b019d16af381312f6390b8de804671063e234870a695b82879714e994d0800000000046a65acacffffffff89d8107e15ccf7e50ad917cad4fe2339258a94a254a8aa6550f40081e96828db0200000002655132f2e86ed82bd34394607c12f441598bbbf9fcd6b41ffac94fd34500d810f8082b8e1f19010000000463516a51ffffffff02c7c27c010000000004536a650083c01a01000000000652525363ac52cf3cbed80200000000000000009137f2050000000053c99401129e8002cf19bc27a5532cba339624ba446bee290b10349e5375a87e5bc8d7f0d11d032d5d9b015ee9741caed2608f5261a67d2ddc14314911d8f8ea2e3d13614dbcf550868743dfb24977f708ee1d62d55b01526264dc885ce3c3ee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b437ae3e20c10a7de1b54a6436f369bef33fdb762ca9e5ee91b6e48d3ea874857cfb11dba8e62d2c11365bfcfa1129858b1f281a1ec83bac2666fed22eb866110c23d13f7a25976cf1c0be8b984f6565991c5b8970640af59c15c37a41cd471775f75ab205d4bb1433034ecd0b9cee2710eb0daf55fce5d7692ff7cd2377a52030b8254fbb9e648f0a1809ac876850229cc69e837fe0a307252717a9c18156bc002123e7eb8a6decbd98e662c4e283c7cf1bfe2548e6d687b789b7c5756cd8799000a03eed1810454a784f54395f7cc24973b7d86e1fcfdb4ddb9daf7b11f62b1dbfda57ef37a56a41ac05e716a35bcb8aaef0df86d53468ea73b10b0d9e5775c1288022d4ced467ef52ff25e04df3721e524eb4665f2faaebf8267c9853cadf5c5340102272fdd40dbe9d879c0c057c40d5b611375a6667f8131037e5a35116e10b40b17020266e4ffef8cf6d5b47578f01e3d9ae8e11187becde97304121b785852785b25022be30c4f14de3e543abae9d2925cb1ca6761703a6c3641b1d3f64874c317e0a00315f8b36aaf2404a0a0ee427c5fa93ea596e1d19d39e8dce01bf4db13154b8fba03b2f8dc993644345900ab97c6845e03edfff27df962d12c9e954ea05e0ef963682e913bb066ae05db4abfa83769c5c1ee06296094943abfd71577d70b7474e5fe42ba0826f6733d6dbf5f0c9c6fd6dab880990077bb0b0ef6d0c085de02ea2d1ff8d76dcd2dfa62e466b074a53fa17da294bb398fc3564ead62714bba789c17c74d7cc21aa6528cd5ee01bd6fc0a0c2ffe555418597c6cae52eb571dcb2e069cddb7fc228e607b141888670e42263123762bc44da33ddb29a0a2fad2f2f2c9f812c0589148510660b3413df8644dc14565405e7cd2a846cbcccb1fd7778dd8032a237b2cc60840c9406a8956fa7317e7a777d6a70d3ed1ac7418029813754460ac703cd273609a70c75220a52992dbc30ebdb1a7e91a4117351f16ce9b0ad9a49597b9c3e981cf072f207c9ac8ec29976faaa5dc0736f4a2aa07408438a4a93094aa77960c859e3458dc4eaa8c7fff6c7e8719147e508b06c8611dbc701d369393afc873d2236e0395bb73f78235b7aa2d1bc99421f1ec755b91c34c666b161e58139610ec251da151ce1a7b8e348f23a3578262ad2c5f4f5899b229671a30ecb70d86a13b12a87d5b14e01c31410f0a32b0663c351aa85b568e100dab2b28e6ad3d37776a4d9d644e31b76dc881aa5371ab29e21d6d3e3f6bb02f6a58e5279de3b5c0824701505b6076455a58a49b7f4ee12c6e96ec780da120374fd505d61b9f44eb8675b55ad2677ef96a2bdf8d9543e7e0158748bd1e966bb7dc29fedfa24ccd253887d147e09c964279757b5110b3db29787aace03dbd26b4aa06eee3c903177c0245190e17fd0b7b89f3caef0fc1ae4f7001ea4ba5195f95d4848c5c7b4797aa41f38f55fca39a2f66e8e8557fb977302b7ed42d12e2fed3a7999b75b708f3397bb0d9147144612323efa0364fc86e295c7efd98665b54361f9fb8a5c76f1cfaafffef8f704696c662a590ae3d61e56ce6288f4198ab7941449239ed74751d953d49b54668953c9bcfcd33d98229d92f6f381ad51ae41d4396537a7a16e7c4bff608d67944814617a1cc7db0717b2bc9809478b7734a76bbda621e3ddaac5b9838143cc538aeeb359347f476da6c88aaf595122da5147bbf1454e7b37a60fd8b086af898a4538deb0e98578020e40b3afd6ad875c4400b4f10b57a8f25ce39923332bad20d2b0f54c6fdda13c250490298b11380bfe4ba0b21f290a07d88e375504f5a97a35072f3f84d41bb107c0a5ea80c77e7f2b94c26eaff55ecfb13e0c8935f789c621f3e93fbc4dc747aa8d500150bc7d033ab585a410f04deb330f8a9adc36bea427c112f547108c842474ecd12cbd6eaa934b19edba198e93cad68750a02040fc739450b8bf479e7832f58c9e387527723b6385d2b33e001251ea33274c077c3cff99844a388f05d41507a32ca877970e5a5a5a8d1ab3bb87d66fc36f718b9fc898453b4e62b907922b09d41ae1483c37554ebabb8cdb48d25b8974ca42e0dbc096c412947937035b4f3fa7a56746b4e4d5930567ca680dbfdda538ba5d199f64661522a523c14db36aaa63573d666f1b13ef3ac464128629b53fb2c46eb16bbe8dafe3b1b2bf018b9eef4a956370b42a471af6b6d5c3070dd13e65b11f4bcbe916f4fe3560666035fa596b1db65ca71265639251524181c09a569bac696c0582d5978bc792a3b32d256efddb33050000000000000000000000008aca9c8b1f615f17b158aec0aea4e69fa6aa8bf85109b5905f843fc989eef9602f6435ea8f3ab9524e8b29025f3d06162a5beea68bd5369c4b143c487418eb0eadc06f5d9748f47b7f56fa6c47b0f0bc39ef9972e70709dd26bbc4c6c27f2d7500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000291b5d369a28a12dea50e51c31ef82a931c67a8d9969616a82180997825bc5b14ca81d097c2997b968f178b8478a563368d15a7b199688ece7ac7cd2acf9634b870174ec7d5a80acf8eccacebd768a961fe61c71844678419c1a82d6e03723c6f9c41ba5756551945506d7a71f5ab1e90e0b19947c1fb2e7c356e2128c94a5920301399bf51d85a7c758350005adc83c3edecd37e2e2b8844b01b3d59c1789895e031ff7f5a39a03bc63b13a4d8e16dd82716d28cd1c1a445b02cb26f12f56cd0b3b0a07fa8850c9174a9e164e1e39ccfd8416ff3a1dcbae9797c4715affa9ade5c071debab6c47c39c4816e3fa9879bdef3a35441025c44fc71d6aefc7129d16a93a0020e3963e903ed6f84bb5f41ff4b45a0ce7e79489be6b521629813110f234c5dd00216656c8c15b9cb9f8bbf059196e64656d1451ceab12f14c9024bca21c43e45e7030463fb341fff836955720f4517823fbe350dd450190ea06bae2874e91112e28a021c65d8141e49a315c255deca4e276b349667eac42d6eef73104d403822c90024030dde7b1a3a7482a57a2e26cddba8bbd7edd6bac7ea7dc6098d853ad6b57322c405b3f73b791670f4f488e6314ee66900b05caf563df689df424512918691773b07723e1396fdacae87ea8189cca1d3a979e7452ae1a7768e90632723fa801ba9f53159c9f845f939deade463f1117e8a0f28c266cdf426e0e7ebc796251a9917ea87b0283b7abf0a69cde295cded0a2c92a9e8b974c6d082f5795c3bc10a9b89c97ce49136c8dc14f91ffd0d2d0dabc73a1c6a2a4f55e8b24a0374686ab580ca1413dabd204984e4e25cd7786592a08b65cc6e036642732103570eccb9cfbc2de4fdc550794eab6a63a5aefe596faf03e1fd153bf9bd7c9b8cd5bbd398b44806562a919ab5064eb2873ddf655358ecf0e27b5914370ca2665ab84bf687b304c0bd0e80451945afb4ff178e5815e7e3b052e388e6801eac054d62d40c925eacf6ed1023fa409a4aa85ca3247e999685c0ecee42aff6f97f652ecc5bb93adf5897704555f15e93dd5bf0c70415d79e9d861d4e752c6e27c95de820d5ee3ad5ac94f8ffa5533d6dd4df23e34d5bbcbf8d5853ac87956919925433fb8e247287fafa18c64102d9e5ee8d5e0928e34ac7a84001546492dc4617da2f6f58006d584dd9775e4c91de5f41dfb6bed0d6e805b6d163eaf74de371f14e7c1f2cf5af3cde58a6838a1928e0cd7c438370695816287c3f9e358b49336689778c7a0334e96bd55f29497ab91db5a734bec21d1f83a244869355d7ef89fe1354ece4a14022c2498f1bf0c13f62e2e21b4121a643851b589fb9242969af1a5a2d8aac018a93e26e995b8c97a38fa7ced2893adf057c557a5eefb2a338db13dbd723804f9fc8c71a95d462f37d1d93be5b4a44706abefe9c44d2aba1de4f854ee43489c53190ca18a040ec5678005c6cf0f4ca7b07ec5ee9f8b8ea08727db72c41dfc9c9683c5ef2eb786a0d5b69873c9ac77443c2dadab22840ad089da6090d427067b50c9e17a871ee36b980909c243ca86997f199815891ae0ed4a02e058c01ceb9a47dac564f262a45374201877297ba12f5695dea8ec6536b51af9f8d90731eb4a860b87149301971610e67ddd43e3c6907a4b4557d7bff9e9ecdf8c8a9378e07da3187eeb7342f4d2ede75e6d4c17e824151ba3c858de806c778f14f6348e95c802a9c5dc541ba68577d9c8b3facd5ed4183e2e380dfb1d99204bb3e94b989a091f470daec853a8123741ba5dff61a08f83a845425ae9d48c9e7c143476318a3ab84787bc8b0dc2acdb5d4cc08b3f6aa0fad88895de0dd43b767f4cc42d5ca1f13c999544182fd9861e58341f6828ab5d261dd628298d1eea8370d3943edfab416af6a44a44384aa13f250fbcc4d20168aec13c4c922d1fb02b7d0eb5d9ee27f71f2585727301990c0592a32388bb1e7eecab81eaf4d6343f13183e47e7eab0339350a7c83ce7fdce58645661083ea8b630c67403cb07e7a4852328b8d307ae90a5d7d5251721131bb4a0fed6ee08a24c95b7ff3f7f6c73b30c3a52c5e610eda8ad80b8198e71346129b7e7f31e1ba0d9bc22be28432a2ae29a4a519f0ea187b46a4560d8a858471700022e66c7855cfc63acefd521cc9c986d90aae813515117a1704c0758a0358a1aec6d99d56505d7cb5e55cacc43ade8b0de9ffd48374b13d484ea5ef6442fbd577a57266a3779cdedeb9a94f58e95ce557abd3929a6208d6a1bf1678e45edbd331664e4ce55c2f037d5fedccaacabc690a1cf8e8d92646931b18493bf902017d3799c6eb46a4a6e6c2f0e268cdb4639a37e973849089ed8280acd34bc3e8f5c579cc5bbd9ca6bf7399f03af05f519676317e61a198b9bee5bf549a43e69ce192bc102012d0bf5debf8c73cf99a06", "", 0, -485841379, 0, "4ac2fd91c5b58326c5bae82081c5f7b801bae5ddcdbfc47859f8f49af37d8b7d"], - ["030000807082c4030381544c5843bbd270f0a0fb21a4a05b5f1c23dde9bf669828d0b20f98e5850dcf0000000009516a6a536353ac6551ffffffff1a59bc99cd1fcd7f7e357b7942d27f277f100a173813f1d5139a8b76535e35090000000004516a526a0a6b83ea124fff31fcc6ce0cc3e99638e7c15f8fdb7e5c82f67cd74f4bba54b7a6d7bf620200000009526363ac6a630051523f7f3e4b040c78e504000000000100eece5c02000000000965006a525200acac63dda48405000000000951ac6365636563510018e19705000000000700536a005100000cb3ed5b19dd9043030000000000000000a5f81903000000003911e547abd948a41a6008a3e2efc02848fd8cfb4dada585a27844c306e2a2d013a8820566179b7b193dc4573b6fcc0b4a7baa02c96cfe574127858a337c8079e7605887ced7f8a3a2f479fe3b923a05fce5ab52904dc1a03c1ac21b608bb8480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070f7b21b235491b63203b4a27aa7786798e8be0d7d58043f74a59ddf02fc0b963b8b88e8153b2d488c9cb42e776ca2facd29d180069405ac6321ec3b0c48458426835be4e3abb1420a5feb86e28f2650a8805b2dfedfb5d845ae15b10b5fa9a512ff4289bf701dc55272c7ffbf4a8a94b1491017df23b6bd3be99349f5f6e29903063942e3837f9a26ab587215ed23a188be6d4c7e83b7e0b211d8ddb58ea2a0c1032503329bd251bd79c2d3464d87600e50a9d3b844a70a19182adeff83761a81be0a05fdca700d34505db6f9a62789d77613cf26bd1458bda81cc26138198aad809287ca1017bd93f6ae01c018c5f5124c2b7055415fcb93e4f8f87e1883c14a33c9032d12c49bba1bf7364939eebca3584850161954350b7fc9ff551223054173fa1803219461165f1e4410f68b68a5d83defb02143103c9f00ec01b0f3fcfa345193800309d3eb339b39317839333c49a356eb18232f0039d6b2ca27d224e37a58bfc07c0224d6176add88523d418b3431cd84529c4f12e51bfc7689cb89f7bb59d9b9cf2c0214a53de30dfb382e7e9e2989b9d2b464258e0a6f904a2477612d82f126090c30c7420f28175ff2c74a9bbec2ececc28def11d612aa185624da71d3e45864a55449b88295eead68ca1da8f236b3f7d3a3f9f0c97695bea787fb6c0e711396964696decf40620152a071e03f3bb1585fc5709c4c4953c2a8a0b2530bd0067ce658e12279c29e84ae9d71423b020b3098223c3d38e1a20fa3b8e2899bf166346d7fcdaaf2191018aa6117fe1faa6fcbbe3c3ed3cdf85818203565cf841684d469c0e3ba3e1a04a3af2d2fb52efb510f5463715f6bce459c48dd29624ae5c85a8f1037ac5a2886506e73f13896479476d04e47c196a08f1f9569bd33139c668d07a4ba3def12b2488c7cbd0e9676a74f262c4a5b582f8785ccfecb7a7797f5ae11d3dc3bd40c07982da8b1f98bf02b352448a0623bc41fd4740f1be9e7a5dca8c07a0470f61afa9e04d446bede28ba3c3d8b3386cf60f6ace672580338889695fc61944584a676bfa67676ed04e3dec1fdd19124971c5127bd74de853867a5c50d91584fe632efd0245e6fd02f3a1984c6c548196b1ada4c8fab465bbbc54f80f8afdc6c8ef4f04ef26d717ede1028d28f84650bee65b42b033fe40734e4833eb9466caad810319671e8d7fa4fb561ac33de8a4b089395307c969af15ec77b45af9afac3ef812671c675f5a1469211ce9f516273317289066df4c742eb3c5c21a0f3aa75a0bbb2213c7e622c7a3ad3cd7686ad384f5213498cfe9ebf8ec400daf0dbecce59b6911505abb7f7ddf43caffae3f9efce917cdaaffd5d2426bed723999ce9c2ba9137480dc3e5bfdeb4a772364d7321895070207725b3c0fb4e7d84008abe3bbbd703c2fe089ac667497d9f51721f1d86b29eeb066eb041e4bc3c5b87222bbb57076b84399d78fcf4d04af2779f37cc3cd5363ed5e76546a95a572110c0b4f87ba0508947cb6fe1f98722b58f847ea0db654d8e82cf0f5191dcddc3d222cc4bb357f8cf39e95dae0feee43095a183a012f1cf6ce50b4068c52dd148aef4d0323038b4f5566cc5c13e6d95415d8edc5e84ad81c0b4ceae9b67cf7d0498e547b7d4451c0eeb41637b1dd5c9fac8f0e51e215c41921c03cab624fdd304d886b062348cba6fa436c0e83286b97d6d336f264ae7c622d7eed0fc734714f6333e449e00f4f061dd7644dfb2a5085934cbdbae5fb481d3d6917700ab2b1e8f3dee0ab5b7a2f8a96efe5ba2dfb9a9c8b0b2dd90d78df584eb648dcdc7ca2adb0361b88f64f4516339ef563b897a10144a3579778543fb5abf14554f787209f3594d16d4e87d3a99a79c6d9da86c77ddf92473e88b7ecf49766cac115840472b588acb2809eb7a14def71ed5dece9e7ffe54a484cd6698ad4fe4cacad7743dbbb148a0707d73d8c0c709fd0d9522cf77ad35ccfc3dba4124304d82d0c8413f08e3d5f4e8b801dba5acbacae9390e869aed98e812d76788f425222ff4df37857802fddb1bd8f766ad266b4d03c66496d4c01594d4732ee873edb6fda848cee088c9d11dfb31bfe83e3db74f70c2e2401b7af949e0c1760d39714719d5d1be2c3e361b9783bcdd46b3eb72d9495834fd1995ab0c1e82d3ebdc49a90f0245045c9de818e57ad879e9f334061eacedb1cae9b198abb610680b937f809054e92895b3dc3db2de1940b27a2cc397419df92521a2f1f1e9a72eefdb21443ff52be73b18d571692b88e4de090a633fbb7f53b721129658ef0000000000000000def14a0200000000026f08a34133cb44d2ade05203819e6b1b1a368a181933ebe0c2aa2d90fb690fef6154f1e540043ae91928294f51c7db03e87f58e1a481306548a08a379dbee06ffa4ecade40de02309f5d6ee9eba18bb62b353c03c24c2f067d53566e60fd98000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001020734489734d139c6cb2333623f7b6df593e38784284fa70d0bcebd2e493345994c67341ba47e8ae12b993bf43209b0bca628f0e4bd5393411e7c11bd6531abc48b28b08d6c62019a747ce8b0bce77f4afbae854092dc2267859d641ae60e01d2d04b4e6d4d02064d169f2e75cc44aa100eed69bdb31b89ad788e8b102a6b3032267b73010e28a6ff25a8189e4f1c463a923d0d84d354612f168eb10c85a20fe0318ae54270196df3d74b4d293cfa05e4acc515f55c2017ca062d9b29f5aa540d20b0627528423e6e54771f60ecfd77c28d541c3ca590c79731fa05293fd63078e0aa55f984c1cc6b7012e78c92d67e55731689a3a29e79864b33b3971cfa6aedc09032d19a5472366ce7d0a24f8393a014f09537b2d5fe81b37d9b9301f2b6d56be220228477eb446c04fa3b83b2dcc451158de909f470b5c0b9f9bf66545913186b49a022081aaba7b4192addbfa9f0a939c501813e883a2ffb9ea65f7e1efb0139eb34c022b8c8a4a832fe3dbfc034fdf28b5929526aba2ec1081f0f0d9d01f67ecdf61af0222b93b8582b3d6dbc23967fff0e0046de033ffecef625891aa1e3a10651480e4ed50172b30231437cf6c32ab3228eaab933898699535050c59f9e5de1f43c81c63a678aa738ff203bd216b7da15a82beb636e57ca057ed88fd3d205da321d0ed165206e5a33211eeb20f0e554647a03c3fce5da12d1da0acc44b218f7f4ec45fd64c4b48cf66c9b64bfe6a3cbe507f484208f25cfa17a654170991612a4a1322ce3f72f12f3992c6c56054ee39e0f9cf9435ce633481332e58e6f7205b6dd31970b8ae61efd1e55e20180182b9651a053c835b90da2a4e4462ae614e9b901c6d64ff815c6d0103d933c29144f853fb0d942925798f60b9ba57a400da1d99bb52b9d2aa1650813ddd2dbf3ec8999202fa386f3b11cd6ba6590f50c081fa508f285b391515d31dff887391dac887d0457eee0f48ddd9374d426201172f23eda1ed0a2fc72a99f162e8aee719604eaff0ff00406baeec8cd4474a86d942f1393999f3ae8d53a5e21450e0f2ebc71f3d56930fc219e95960120a888af5134d9808221cc502bf0d05e957f3e03168de60876c9b0865797988fc48e74d03dfb1a3792ca8b70333e8dc58a9228efeacc300e8261e2ec74d25f6a6a644c63e4fb550071b04a3e378f394e17358eb46707d7d9d967e2c0e4ee3d48968cd17b00bbb889d660455b20845bdca408612fe52de50d0480e6eb0af86013b1d159c8d52320659ea43dfeab34bf959c7fb3ea7c7b9bf17f9ae95fe207a337ada0a10c36cce62c2f60930d8df766f9d7e736833e7b378b9aefca351a8051d55e4855cd1ed380c93167668c82b9405f7b70c7a2c8e2b30e6b9bb75d71cf9d2955d9adc08d056dc52afd8526e6b29700c5edcedb3fcdc2c6f6a881ecfd2ac098456a53991bbc5c84000c8669adbbd81e356be3804b5c4636269f5335bf71120293e499cdc2644a0326f25edb88ae20834c4233a2f871830e6a68e081fb227b5bc755929084c12468fe9c4258cd7e81a2641eaf1ab77fb2caa20097caef099078008bbb9fb1c439a32a023c612ddd892ea47f5a494d0161ec25430de7311eb4444d306b641acb0b158a662eefcd42658a8fb0c28467ff2cf66720d884a113b1398e2431c98c3646974d4d7c6f9b58e95cf17857d92f765454c63a97f750dea6c721fe308c94cf3b81d0feab8dd20eef9620430036d9aeeedb18e3681a2426e1514e260910c58f511247aef79679ef13b498338d4753c9482f08e847170a2a666887303711d07f8655883587ce80e4714a25544b2d3de6f80c20620490cc239b4ad1c83912a3591634a4c611653f50e400b4119e174087eab8e02e27bb4ebc183f9194495538648327ad34659b9fc8e2835c16964d610a77e7b08725aa37605c76f6e1ef2aeb30afd426d2d8f303caf4abcead5f33d7b9f848ac21a5af46691f60665e8dd7e8df00d0ab411bb993886d4f6a21aa3fe6caabe3b4a01674a7da8b8dba1a7d5c3d7a7a9a03162528a952c38f5fee33b3dc7244bc60a55cc81f1442981c40e326bdea5ea134d3acff506ff78bc834ff552c307224ea4219e222acc082ae5eb4442687f553b0b87676904ffd5350940fa7d0d9219257023fa540800f7da7f1a51ac5150de34a5bdb12eaf0a6b4bae4fd295310101596d473325f7d0a9f2e5a8520dad1b994bbeff408de8a5293501cc4c598c0e29b892babb20aa4b0bcb5757cf8fec19373e2a7193aaea1ab09c78234403daf47a699530c1000000000000000039b2b10000000000e94be1c0758b2a4df24fe6bb9be007f90f2b211aafce707aee1798c12d0670851f0bd0fa3fc1f5d28d325be5ddbb36d7e9ba73385aebfe13d8520a8d7955f28b1f30d214a7a989f6355ca2179a648325f011541dd81179db45392a339f2ed7a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c8edd4c4a4b775681d68d6959e7f269421a934653bd4c790b4b600329613809e6d04f9d944fd9a756995f174ff5b6f3615d4ff454164cc0f63520b9a8201f1903bd0464afb27074fd258714259baacce5f10119e3b1d215ea9aee83418b11b730c11ed6f555c84e64ee1e8984b20166e61a31116899147d38a4ec57fece5620e021ed43eb650d7359b92db89a05833e25dd32b40e37f7a30cdfedd0e75b92db1c40321ccfebecf04f4b2eab5700009290263eae86df7b30c1c6faf3c547f3611b3f90a01c8019b56ad03a292a9a87ef99cb35424f6a677192737cd085133d205312214100928bf6c0e0c8d9bf3b7f6c40a4c1d72221240eb24157d5fd371adf244f49b020b5cc09fd1aa6c4f8254d3777d79648049d35cafa7344731cee49d024d1ac9a4022244c4175ff85a578ef1fb9bc07c1b14f2faaca53bf98d1dccae4d19b1373593021a5c44b39b6c2d3c860110378451a3c22a5d427a84ca9f098788cbbbf0201c3802225861e0c7d2740b3e3047fc7dbefa5519a91e90d32448db146eec5530bb0725032225c89da753883ca104abea423b81022c24da35fb02f28d8d44751d3eebcce8c3d2b93cd06b983c7e82e7491721649ab7c7864885f1892c8e35ed376a46f2dcce8e0a09cdf2038d1006f49c8634b90d5df7e4e1363174f08b51e95cc479b0b1d6709676618ae2450c314523d342828f25da417b676b0584d582ba89b2257594290baa5bc75c9cc379c8527c96b98a0b45ecd7b7ba4f0338cf5732884f1275a3b2649f1d4f2a134529d40f7c6c7c13f4fd9db27d78dbbe40bc52ee53d2bf86bf4c8a5d0a6eef663e13192b64f191fa4de8b1d7e4b8e051d5a64c155ab8806b8be21d05eb3d0d25e9b52a6e34b836017de64ae8df0d27b3978e510d189f7a5b897a53c08b083e1c4bd13af31040f7f32a1db31ef66ca0ce3a2b0c0b94c82f7525128f48a0e76ff8477a65f3a81c21f59d386e7623b1f1af0d697296fb5d10f45021f425cb736572e29069eb154866d21a6a33eac97018be371222e6df955cce3592802ca1894cc2cc5c9990a85b0427f2f2deadce73adfb11be1a6d9892c2474c1d6e7e86d9d4e8733951aae4ec6f8903d523964d51d41a86a3f40d6cd1d3fdb08ccb5301285e3911d21b8ce19a5540930a7cb5daedcc4123fff144d96628b4831a95819af114c12f7f299f13165c2f47e528f67d3627c1ce4c97c1eea3292b25c07bfe459a8dfe191007ff8b912f3679d4e58b6169fdf3b5caf2bf67eb79e54b58898f8ef070ee7f5c62b1d30a6518763eade5b1322b7f6e7e4ced94678dcc28dda38a28e44904de763c1a1b68099cf82a46f1444c3c0f0f5008e0b42adb6eb84685425b27d678c1aeaf0ea1cd8630ced4f0e5238c12f8590f9065e68556a39667804fe1e1e06a2a6e9e2ac36a508c84feba3e47f39879fd0e252faa5683276ba6780ad3400fc87b02733333bfcf410ae8501ec309e8e04a63c17397761a73c79b38317ff692d5d4927aad42a3fd351df79152043e0a3fc9c9b8ae3cdc220592ac600a565e09eaeabd104fd223b7a1ae96d2ef8637d1e6885da76d7f2616524b1ecfd723633ebcbc0e6b779e52155a5ce55088d409a03c0cd7131deb724d1b1581c215b2d2d94f3c3ff8409437dc6ffb169fc23cdbf44666e731592dc382d576f1fed2d7e73614b059456e94e6ddf7027cbaa7e222d4239193fd3fd8596946fd379a89667d14fed45e74253b23bdf5aebf797e90dee84e80bcd3a7a38aaee7b2406dbe172e2c677e2737e7d3ab3924640f3f1daea4b4b73a0fb16c1bf71835d529e013377c042a9c58baab43d2c9f48bec570ee08fad108357afeb3c17fcca59e9064a0df37dee6c1f7c2b418be6c04842160f81ebc6b98db84e426608b138a3e7e330419ff680d14e49a1bfd5e0f61d2ca6c1b872c3394a8c97ebd3539363ee2684ed3cad350b3b9923b287aae38b32efc25347e932836bd4ab9eec4ff9bb18f6ea9790058f0c120337b00ab451c25516a46fb670046d368239efcfb7d17f98bb1faa9a14823b5add9764abbec4e5fab8bf9617675fadde32d2bb0083bdf12bcbbc5ac0ca98bb863ebbf51aff8648398711c2e4f79044fe56c9fc89c62f24ea26e0c18e15a17332f9510ace122d2dca79d9b58dc06f7282b322278f93671fbeef339c74113f68e0e24df08a5f04b16855ebaa37d37105031ec9a174182c04936f36b3cc763e3544b466f6e4ab57068d528352dd66c400e2b2191c339928dab6e63b1a13987815f487de0e1f82b299c82a3d4fe6a370fa577b6e68c57e9d650ca2ee3c0c5161ee2680d161028d37a75920e17e91d8f06d6ab47a9340d475009bb635584095932edd2d7edd424cfee7b33547f1a29eff508b4153b14c9e4bab9fe4a9454dc174dfc4d23e4c11c5d90b836f0c", "", 2, 117099813, 1537743641, "93e869fb49e3e77e2b6f2d6bd516632a4913a8d9d616b1aa74c71caf4c58bfce"], - ["0cea0a0c02c77c7cf36ea0eadc82c453a737f4f973ab9278c7929cd4654ca7af59c5969ab101000000095253655265536565acffffffffaa0147921dfd69f5afb709e4db2e5a5633a56c85bb67b873f234725d51b6b3c70000000003526a52ffffffff0467251c010000000006655200005263646a020400000000076a6a526351525331bbf4010000000004006a526a3c7c18010000000005636351536341b2e1440287c59202000000000000000000000000500ed313be9b8232f92a3cbb21accf42a595354237b778444e6b2da5d445511b752bea8ee6e7591da630a0be01c3ddf6ad071e643af8a0cb28a2aa576b48489e187cf970e71f3dda771ba76f427822485b73a2b2ce010967fd029968b39f694800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e13b9344eb8515cca05fa5f0d1eeb5935d7727cb6fcb3ccd2f2b3dee678e6ddf47473fecd03b39073557bf7fbf1c815443ab159eb4667ce4591b585881e1b16cc7176d2a290dbf9967bf877418d4b8b59c56e78e30948acea3ebe6829a0aebcc6db025596703cecb93657dccb2b9dfd2a464bd1f76f5b81b21905ae92a707480021d3133bd0731563c5556bc9738e555e8de3118980430846e2c8cabe33c2594ec03199a437cc7f3844ef13bcb5b75e49a88a7b49268bb4b23705761778c315c72b20b08bc03080b3b1d3a6b06bd01c427a8378627fe963d790bd2aa2bf18b2f87b3aa4f3245af25945a660d8194eb42f4529840dfb9d2dc31bdf191b48ad71ba3db45022275f052fa85b0762d2735c4aaaf090f6289510e3e93d8d94ae3d9be9a76a5de031883857d6565f053aad8c40a56b449f0a30cc6f4ad151193b993741fb7d68219021697272ab870010ac48b99dd1f99af05ba3e08e5de433ededfde0ac9703337b00328cd14863bd5864db1ea134c9ce3b618e5bb54ca23b63f5ad43ae4fcbd9d9bc40201015ed983b447c57a8d7856d0129613bb032ba4e9077dfb513868e4eb68b66998edf6ce9dfa3f2d250e5e0bad9cbd435beeb7e9318986c87bcdf98fc6b2454f9c26118fa741693d5a1cfd9a984993ded8a44daabb127333197eddd63afc79c327d569b0623394f9ab66f6f0e1e3d0718e43497a4b78c3031338b6c0a99caa9243fe7570e7c2032bea466f7c0c1a9f66c65f98756465f8f61afe8f29bb74285a6dbaf7ba5014f69cf3cb19510dc6a1670e49ab5f802bd1706926c4b8254e872ba5f1d01b97fc8c6d910d0cc210d52175d209581478ebe9608ecd67715339ebd06b79a0deb191dc433d9bc5b4a9c60fa980be3cb259498c59ac204c3fbacd59755598c4807aa0e8e724e7aadc06e10a0ab4cee7396987c6a59e69dac5c0c767a7d3c046c573fb3c07e77eb078e7a05b478224122fca772304595e83dec01902e059151709b31a96a81c0f86156ca4abf2468b9c74b1b93dde8c3bb4044e0559dc1c0cb9f7f0b3246bda661ba868b17701b62ce696e534c97b4435d0de41067dbe5e0e59a1e9f6dbe886edede2844520f4cf954e425d8d69debd79308d9dc2cf845eba58ae3e442ddca4c3b4ca729273455b1a6068edc122f91b2da86ea86934490afbdf07d2eeacfb9045d117cc9187be0556643c84c76d489d27f143e8ca517bbc13462bdbec8ceff70600f1c4172db9717c4b0178567d4772dbdae53650a358e5a5511a58584bf2612a5def01b5b93f622a4a6be07a0935dba66159cb64cf7bf6115a7c63c91da7009b9f65abb608794b13a2f1e57e2f0fea82a66b7f00fdf5077a47107dc792ec7522faf06f09fb71b9cbea660097c1c0bd675487822e064385d2d0671763a6218c89d698f45e6cc2ec19c60360641ff898ca0e2bd71a588a3d8c19b208a89c2714dc9b181b18d11ba3b586f0b082bb5669b29ea4d128e273fe25eb7f008f8ab0a2b72dc92276fef957956e240be53934bcd40f715e75bc6391a4ac61195f227a380be2cd070a5a13c2755acc5e720856e0f425aeabb39df418562498af6c04a41b92fa7c16a32163fe30ac9d91454e8deec91865eeb0ee16f40194db16aa6df99d1e4b30eb536b04b471631bdde2aa49e42cb2576c07adeee6abce9e286c7774cfc05fafd26fd0b2694162720eab59fca11b374fdab50c049ae608fa471aa788c956c3c73b3d4b24de48d5867b6c4c47499ec6cab93b3dc7c0b53d922556c5b57973fba3ca29910b8d0d066d9a6dadf9940a0d103a6e52ca85f500915a3f5d9e07489eefae16dd906f45058138a8a6dc1d2e5a6584fa40e57ed99189b89ad14e60747652f46917daf41fddd1c610a18f62df3fb2a469b37e657634f94c15113dd4ef2b3fabc7a9524d4d8bf1e597e4037a8ef5e4ba4938fb31c569c3b38beae750f8cd86f37525030054a17097890a0a640353429cd71ab2a273d02fa0b4240acd52af63baac0342c9ef76798bfe1cb009c6a50e2e1e7d34bf1d3b6658c5c85a00f08e3e35a039de6dac1d554da1d3ebe13069ff3788e3a5ce1e146270805e281d983facd3a8537b8a43745083f2ce078086110b30cbf9ce69b930a04d67647b8382ee18ad2d080b854fec1fce2176686a8691357b5c29b2d976c1939b3f71784802b692bc0d16f60257f11f77dd7d1f8d213af431a9761ee34a85b2a7e452c684add4888f02e5914f6a9524a9f26ded8d3527f668df37619a9edc8d01f2bf9bfb488b3439f210c28e36000000000000000095aab205000000002dbd50173091388c5b2fdc638303239b386f3332bd62f4613a43a40fbddf0d27be49ffcf0a69a0f91f81c4f6d21f48d6fc5d7736c4c467f182f416c232eb35035153ff274159b44b97f73e6a2be8e7f5ba4eeb4ce42c3d564e16922ceec4c03100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000772278d9a046dd7813a4ac1751b57ab1b51f46491505faf2ce997109c6d6e7ec3a6a843509cc4d561da10b87d559ceb6d8081c27e6a9f25f4b10583c8b0e94aaad1ec1299efd88d5b72e539bbfe607fd6a83f5503273584b2d38b2f06b38ce7b173c90d39551f1ae87d49e5dfba66f0f490da2a26f0be323d79b935e68685d1102036b04b5d1364c05787ce64279c3a6922b65ae58cc4f334b7901871d5f6dd857021a667880b90947669ac3da1b5bc3c688d783a7a4dfb7edb3f1c4d2d268f8380a0b010d5ac39de290e8c7c2b0cd168fde63b5575295c95d1b7e5866cddb9131daa244a1f85853b7424052a3f2ba4e699bfffc7330a2412074ed357409c9f68371c3032d52df22738435ab43fdbfdb505a18aec66149a46260bedd302a6b9a381512f302218b0647f58c296a21b7f5437b61cc964168eb3505f08269a8839c8e8e78f240022f5234cdc5dc955808e7838dc7d130c6111d3c01f2afd88e66860cfc9ab591f30308eb98399ba6489e2109e2930f2f2237aa162c91d1b29a16df87246e8052c56e030fd1a121bc0176bac93602f1e79c998aa0231e8e7a5343a1ad8a6b398d3c35927d891814e02abe37f25ff829f4f11b8870b92b12dfc1a65ee5a4a0b73fa740a15d95c33b44d6cbe4aef9341ee9a5e99c777244bdd41505b40057bd0553c4dbdea88ec36a14212222ee9e71ebcb546ce5182b3788e5de321ac736ed1c28e35509fc618e94d2a2cca94ca3f49e698876796eb4aa620393a2f782a54ac4798ca41693a60097d3c5753f65b18ee8a4abeec751887be2f5a37ea9aa0dffcda4a9d80464dbbfa7e14538e888f21217585e5e19a77c42c83c11ca86e98c00757b55d48e11d32709845f37ad66f8a6afa2913f26da517126fdc084653f5e443f189f58afab8c406c4719f989b3435de4b8f57ca6f0971f058ec5e2c58d9249716636d8041f32b28adc9a00e18628d9cd454695185fe5dcf0fd5d835599cae6c70d74fa424d817324721119293e1e4ecfdb87ccf01e5407cd4cb1065a82f8c22a164f04be623bb82ac45e5c645b9ba20173c0b398bcce7a209aeaef7ffa4f445f7ec25eb97e2dfd495aefa3440f3e6d9ac518bc8e416feabf896ee47a51469280a49dd2d60f1455559a8c693c6f17397e4ce2e0a3eba7ec0576c9ed4347854e0e21bfcbf5976edb2a199e22c184a6121de0b8193698b67af47e78ac3495110f310535270720a351658b45789c696ef8e0c790b59fb2b38277acdeb7d3b98e2e1562d66c897434e05e909dd682f79807915fa121896968d627a61248d6d14cb08eef63935327d0c568e4df98b45553d7f0d507c6364eadb6aeee1c6782bfde052ac5fa9530e9fad1fa18abfa7a49341eb6313efeec79eb2acc4a5501df925b66d9f70eec2db7df29e50ffbc7c20fbd0eb2086873f9fe8a7456445f04f54ba08e7e62f9ca5f0c50a8dfc3db9542d90961aa4964d0dabe45bfef08ee7260ff68b321fce228124587c7a7d76b979d9859ba232f1dfd752b2a47da6a7bab0d52949b7fc9e5dcdc12d11e2cd3811b1741b7ac7a487193e48915eb7f92b614bdc006c083528e4aeaecbe64311ea46286de09bea55fd47f7b2782155007e286de845b58431fda2bcfcb813e6f9c9c00b22edbacf6483607aa6a330db0335517394d9fafb9018ef60a738849b1225d59a7077a8c90389ee70eb7febe05361a042f489041c529824db7a8b65746b29e307f2b80f9500e06657f070c0e6b25f3e4552042cf510e87566b35e6cc256b400bdfd9d09256e99fb7b06fbc8a44c17586a22cb1a62a95e8e19f3b61faf791d71a5f413fa3fc11d63491389483c552ee6175c92fa24c5c9048cd18a15a67333cb00675436f724d053b0ff79b7c649d4e459769db46cf1c7a329e1dfecff53cef63a9a8a6141c9a6ff4a9140b5736388809ad3a6065226845ce78cde0c221145819970e645692e8d8e861f8bda33c431788d3ad4f9f713a85886b48246ce3351d67d2ae583da230f421c89f7fbea68ce765b8864a71560a956589107141b409dfcbe5e09febf70a226b54da45b22d2cc6ae9615bde14b26c3d85595d01a3852010f80d9fdf805d2ae4f070076bc49279eb3e9c5fed5f83f82db83b6c2cfacf779e538445dc72b37e33f573f9f632246560414db59d8b26beed3b3caf54943e22b5bf7ef21983cdb5fc36f2e9f1f10d834b703c2158cfffd535b11a4dde9d0f4ff63a4063f47186a1d8ecb0c1075551b91624f75e75de432ac5760c0c57cde4fb5f9435e1ad2798f51d0f235686a4475ec7c9fb0f5aa99cd2a0fb292ab015eeda4b4c87b258101d04c74ea8172283e468543f82268cf98cd7efef62ef1d3e23ae295c98af6b717086db68b4a842049d4b0d206d118103b904842f14de2e8dadb462484f463820d8d338ca9c304", "636352655363656351", 1, 193287115, 1537743641, "c0b708f3ef740dbad64e295354638fd61ed64b214262e8925aba822db2368c6e"], - ["030000807082c4030306f2a62686c3e0fe8e0b7a80658680853e750d5e903778a603e61ad5669f7a9d010000000065941aceef3a67cb4beaad3875eebc6ea32168ade3d9cbceb34ca858dedc387398578bf901000000036351ac2b71200d864d42b684c6f3c7554b94e0feae2a7faad75acd8861d0146dd635c00f6e99eb0100000007526a00ac6351657c79253a019b1f25000000000000000000000000000001000000000000000005c1ed0500000000df6cc230fb53cb76ece6c61fb6d2a48450d14ad737629c654f635ea4e596951f85e6f814bb82e04948368c0427ddf360f5c50f54c4f60d09f9897fc3fda470da29ae8d3e8c1c7d6daf783ba04379d61ae7f939b8248e0f4d6dc65c57c7a54e550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064394cdc2773f8b143140d2187ce76cd4fbab6a1f0c7b05e3b9847020be6775e9f89319a5436322347e3fb4e87c090a414e1999f0603774349726f50fbd10eca56ba2e9279958c76e9fb06bf239dfc6d855afc94e3fd9f91ac6b2e81b7622a2140747cd401d641a5648edac3a03497e01860a11e583b21f96e9f5889617e68d0030412c6916e5151355ebfd67fda3166cbbf8be7d7b9c220b11b370ec9e5e8066b02064005e6b71bf6cafa179802ba69d09a737c3e91e79750acb9b901e8f6fc8b7c0a007b849b79032032e8aa0d8f66f79d59df92cafd778907842371d0bb265d8b2d34818e9ae2f5d6ad353866bae20a961b03c668c9995be31391b8a170c52bc476022b4f0f3649a6d4b1ef6aba127f20d0cc59c2d2c535aedf72ab4930f0db1c77310220871c1ed569d0dbb7ff48b8c6838d415bedfa0e121f2a1af3a62a4161d4a7f60201e58b1ba7a23702ce0cb465cf40e01ba93936274c5e78380a0b7fd8f9e28b4002284af5ae0070ff43d67ac9403e384b94268baf4112258a7d108daaed1182d1540325357bf3f66c840552cc8f3a16073632faadd5d8735079bc4506caf9fef3550f08cd0d41185c229e5d734ac51c3559b0307515f703aac7ef18e235623bb606e9a722daf5281066701d14324f21f3cdcb71a5e020b144f5b493ba3387a40621ac5bc17343cabb953e248d561e1a34166e657a4eaa11803b63549b3c805f5ac3c1edf99a1abe4c9d7b8ea68333bb832687da28d69fea564ece1b09521f81a69d63ffe25e969f70920892d5f0654f36afd15c9696cf09873b5a17e490f3cd2cf6d8396d92baa3d9be479f486c8dce42d23f2abe8694ca3a392649cedbebab9aa7be3b20e136f67d96cd09ff4563e58937eaf5eab0a7296384bfd92704741d0ee001a64ebf3db059b36fbff7033fb34c1ef2eed5ec2c5477109b1056613ca6d8752cc3265f96343923bceb43ea21f6b6aae406b0148f966d11de35789bcd92d035bb7bd52bf6a7889527e4cfceff953c00322661857bba1d375aab29ae1dd1ccd75797c4d7e21c8c0695f1e2b04e43538b092489e6e2ae66ed37a2b2bbda9f34d2efc4460473d5cbf447729b72b2a743ed32ce5fa02b3db14262ea882df04d3ec49cf827a52d91f6fcc1fb622bfcb7b0cb2fcb2236fed8687264ec33c5910216874e34d768fb3c3db440f1f6e3e8e9fc2adcbc2e4dd358d585d18d2cce9875193c474e58de98ead8d50c16dfaac184282f8105f1c45609f6919a16e4fff1b08e79c540aea0f7ddf1e20539eee7e54959976b7d65427d0000afe07ef93886f78b255094f2bcfda3b0126c0844f3acdc31cef28ebe081104ea659eca2cf58b7aacebb03fae8e97e1faef9de224aa5829f8224e3ff0927a118a82389d26cae8cebbdb009977da94f845ea5016e1c43f3285343f0a724ecf26d50ca861a7bf9fd62afc6bbe36a2ef9fc1d9a7feeccf883eb5c069392f47379e01d9e493ae4849dee9cc7e7ad96786a8e670986da6a83f3037cea83f00905334d363bc2fc9ee29860e0e49a160d8c3cfac6a174249a69aefdf1f5c2ce976f6f561bb39b4c051d446e7a7a55f8ec43e20d2cd6ddfc3aeeeb025b142ecd54f783f8a191e307657ba245adcb541bb4356906bad09872e941977ff0c3a94ac90f87c7fd7144c768614063953533e27ea36276a80ffae20a470f9e8a0eed94f4a17557dee040b6390e285575dd15a1d3daadfd7645ee773e0614bb63596f906883c0f4046d988b7e933069333b16034fe9fb4b9b3afeca36ce181fda80062bc920a4935c65acdc6022f68764fef5b7416bbdfa786d7e692ac033ff7d56b8514df34a7dd53b02c3dfed7544850ed4d4cb20867df478466d0faa399f72e483ff1de9a527ffa4c08e39e1edb5a6ac0315d58a1d1246b96656c63dcb71d1276e1a015220a023aa35d16937cd6612a17f65c85a92a9cac107e4fc513223ae212ed142750e8472b5c28004ad6c9a7ee52e152f2383a38bbbbce3df8d28e1518a8aa30699ec80d9e07e84cf2fdb6ef6f1fe03c5b6c357a832ded59e7729f7f9170a6b104454bb2f8952a4c778ec9e035b72bc55361e688bdef94a5b4f6f484cdb9fbcbd69fb1a81b13239bf96f42231275ae4c87e41843918fd02f798db72b733b7e8eee61fa8e1254207acca854a089c674563f6789d1a7011c7832d001980b4fcb22f7d179fbadd9942d1934c2eb00a417479c3a2adc587eed8be835b314d4c0562ac1e905ffb67c53e4fd507aaecfa4aeda00a6d7150e9bf625f74e1ef6ad4cbcbf3d50d8666defec9599b4ce41fd8ac53e8862525b793745e0d8e462c33c04b2e5fb96c72e1f4c1612c77aaae53c7652c461c2df6602ab243cfc7f17bae36751661be1284e2d4223542668a9543ad55a2cebf6a48698108bef9cda351652630c0c", "6a6a63656a", 1, -672108803, 1537743641, "fc70ab8b1969953b72b9d525a5ee629591319f200b6a5fe7c1734d2a3348b882"], - ["c3721573021b751e78636fd3bd78047519c5cdd64723c2010b6f33dc629cb9c98edf7f739b01000000085163006500ac5365ffffffffaeb134cb86844823f06965d2e25db06c0d08a6f81201fc48dcf2b1f9ef73c37c0300000008635353ac6a51536a4c1f72fc023e5ae8040000000009005352006365635151547d4e020000000006ac515152ac630000000000", "6365536a65655200ac", 0, 149104131, 0, "3d6c9b12af2b8c009bbf0dc7d9dbf74431fa5a27470744f054d9941d7dd1c240"], - ["db663e0601a87e44865316074ee894c0bf29b20195ca4496953bda8fc593cd795144a10ed70200000007ac51526a516351ffffffff033370da0500000000076a535100535165cbc75402000000000463525152fc6be902000000000865006aac52ac52520000000002f9dc3a04000000000000000000000000c0dcf81461549dddac15493e23e4b4517a6b30e30a1e9e8648eb6ef2f8da6e6316bd1ed7b953eef9d29662dfb5e086888b146d050044ba61b5ff34741416f33b90fa795c247a452cfc12f83ba866b26079d36a0ec5214255d29f90ca8164718a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003a0f50e0e70bbe4d77304edac37e03a6d9fe8a98ca947e3421296f7c2ceb87784759a63f3e6c2a4f73a77e791d5213e17de908b51bc10c6c6e6b18db246aac6fb45b6127c8a4c19d0a395baa65d32e99e70485543f4803cc921be7b95068a30ba5adefa8714ff6876cafa52a3eb5ace6b882b23d41d08bb7d3d6efb0e9c845e1030c577d491e63495d3ab97ceb640f69b217cc02f760f33ae58ce6c7789b7d2aff031708c6734a89b9f8bbfddf7f00a29b20ba22508197f4debb54c34a9baddbfc340a077a1bb4422c2f72cfabece15601874ceb51042f78ef4ca16d8035623b65808364d754b9b0df81d711b5cc285f3ba93cbd4fa57618bf27ca6c09aef795c1af9a031eaf9cd61241f36b059829a124a38a0207eb315f17c8f88a56971974e1aa2751032f8fab69bc1713f6cc2776db1fcce88944803ff3815248e26d70533f130e26dc0223aeb967950a223cf3033693a070cde9106e706c4b62e7bae7774e35ad2bf2cb0323f4060e928876352365349fe9d988b5d00180e055cbc0c6706b74afd6a53b34020df35881f5871d39180d582b8a53b44f34264e0cdb83fe203632980e565b7db7082050f87da4dd0648b4ed161666bfb03146edfd53117c80e0d85047ee042160efec3eb5fffa7c0504f02d652f8cfa31fbdda0cd31f6deb3d6bb1feaf08d95781f4be9b7196644087be8b9d0a0ad86828b9e38938d6fd45dfdce078de4006ef8bc9358be3630010da1d6bf1a4363ff656a720eaa224d787a603308b0d8a25ea4d3f54be0a10469ef773efa3cbf1aadee9353e3d734cb53f77b55ec9e3e4b90091d82cfcba102b7de3087486fbd0359d3e51511b0075407dd5d86a56023e94b840dbc4faa52585ec10a1ee0ead5a02b6877d116c44211e12f0bb751e9d669dcdd2b1de9afb0364db05b02c5fe44f091d874be09e4698eb37967c42c3026ed44bbb1be3f10da73a8e51743961b25a88492498c261c75373486ca72b5c02393841de4c3c317e84437c10551d4ae127f89d074f9e518c282005c0dce6ce98e666b22c2fc01a54d23169ee4b83942ec50c5e714bb6591454218107229559abf48a43b0ea3b0ff328f763cb376fcf0b89a002bc5628dc6c89e247af93a66d1e5668abb893e794aa3a30c6dc7652ac150599fd6534b355c4b700dfd4b83502940a2575f3c9b6a480abcd7991e1ac528dd6c28099155cb7e27b03b97367d708162e2be13366ea521fcd19fdaa08c54cce62b887f1b261f8b5a2495626e9b583c59770945118af31fc36f03c9f422c07b9ec3eb783d932732f659577105ed559b93dd559c09768df3c45246b852c9c246aee5ea0be99616253d9cf1fcfbf145d1e5aeae0130f7dd9983c88c5d2080596cf8529218ab6b671c4f83c8ccf2a517f5007d0ec6c0c314f36933f1af7a2fe112bfc7c7f810a1e32dab86be1a423593d3eba1c1f1e694a5c2594b30630a3c633b7e1576232b160122a33bdec8b360053ddc73af3fb736566b9f4ad6f3a1c7336c6a469a50a2c73c096498e3e8914ec27d908575497eb827ba8e7b98af76b34e24e944116173af2ce152c53ff530c385bad51a456d15c976bb6a7fe94422d16f3b45e4232b98adcd2f19cbaed2384c90852549517a72f4391f4b9fc026949a883478020980e54f4359d43669f591fa161ba0f625a0074b6f673c6f5ce6df258bc2f1fa1ab2cc886da4c419714e16f7ff6ca4f48f8e001258b3612199a2d11c66659a3cab23fa398fce166acd16865264c3d3d7cf8381cc486cf45848d9df54e0ce4f90a710c9a94499a6031d5396fd6b5bde2f97478ed0743eb631f9941263dadbbe113da20077c31c40fac7cab44a2b94f450cf1ca0c34015fd02ef74567d588231c21ee3047722bf4fb97d17ba58e5da53233149655b98e1dc40be3a0f27c84e162bf70e3a4ff375850bd21ac89b8700dc14b1aa45d44e6661704d1cde21172fa90a7922ccefcf33d16c6021a134d644dc9a7c476b1494277b28a2778a6b52b91527ab948a8590b4248c66dea3a203cc230101e2351b1f38d47e84807c2369f96f3910afe9ef31e85a89382c981cc3cc3b549b62660e44dd16168955e4658b77e3be03a96c9f7ab13ec8f85b9224321b993ff77faaaeb7d1cf0f3cea436ee322149e5b0476f2642541a010fb8294ce5c9be291b69f1026672a5a3e030a3b767ff210d568743ac8fd9bac6bec43456d595af137b252cdce1b794337bc0f42a0dca00655ab7fa9f2aeb926e9d1418b5175ba4f86bb9ca54fdd84e299e6a47c6c689844f4d434ac07b8cc01000000000000000000000000056325c0fff8d21e1a96dff867ec6e7d1aacce3914e6e162c45c174dca4f868b39ef1ba341846579aa615e1f8433e968f6a98ef2ca1813c900c77e2354f8c73ec16dd7df73f11a5efcfb457d61752c7e9a4b9d9de4144ebfaf55b9bc53ad4c9500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c901a3cb406bdce7de4b887d29ebc03097c4d771cfe30d681e137296336ff7f4aeced60f75f225adf7050fdfa9ced89df117614a42f8980d6028af80de763b0e874a0c308e46b33364ba49bb93d104f6b7e1fe621ba767d5e8aa292efa0a5067de09e8cf388edb523dcd4afb58618b935021b45d5775381f80748b7ff49f7a30022a3214d947b473ca092730c48b1187a37dc7a7874dbf1db43bad423771108f590323b801fe6f29e69695a5c1dbd4a325c0115843fcc3011e7e06830e034be4fa5f0a0535a243d0cf24953198e0f4336ac0b777a92e5227bb92e8c626283e67e5b356aff9ce97f8212074e15a59dde224d726df2a2b2078ef5826c0c9735c62e61446022afebdb66bf3e4deef11b7c1455be3ae9d74ef02841fe297262f39fee8b736d50309ade68bbf32a58d076c5c1fd09e908df55b252920ac74e49b571c481246269e031ebb5f3ba0ab8fefbd3b5032e8d431f2c829951bc28a7f32b99c26fbeba4964703161b149b1544260d0da6670a7646be12899ae83aacfa1dfef4db2515fbaf9d7f0327ca39388860eb74b14e6cb0594f06a2cfa1276cc7c3e0f4d8a40986b3e5fb9e3435517630fed9b2b8cad0b9306cb18ba5237fa1e0c4cb10c27ecea5f85eb25f9a3f0e0ee65115a3949874a2389dbebdda0da419a43b44a7c03539ae9cc2b3f8867129ef2cb9f518ee92d9004574e1533e22b89513206e18d20423c5778b4b6d9e093cbfb1daee0f1cb28acb2c135ce4f1b2a9fff5454a69fde6dbddf9f2e21d9752b2fae753104c5c9bcc7376a0240f1f5d422f97c18d58c96ce60f40711ac438b2edaf00fce9de14084d27269a66ad84d07412e368562d83f7742942ad55e5f4fae34ab8a1e8864e256a3141e2eb2a1bf16acf0410c8a2d6d8dcf36d44b741edc92de46762d6c4655121f98dc831ea103ffb9e03c0f4914aa1ef2198e584a28863c9cfdadb6a22d7b09b1425e22aead7ee69c59ce02df014390fbf74397e45fe134b8566debe32c3dc911f4e2504b5c41d7ca3a2fd3dd3f25df1e499134744da478483135c0e71c0954910722d3e619eaeeda2d52b84fd18c8713824352184f120f408baff53b21982d090d9710ddcf873881606970d4953b3059dfd16e81b3000708d0ab14db2eed802130df95c1717db61af7916e608412cf647d3bbefc36759c4b7d9cee3fd2ca24a663d4a26e38679791bb0689be13525fa23a8c680aae8be456eaf8528bb91d2a261390d2477aea75768b4d2d9d675de515c48c841288404f1bad01fb0c7ad3f1c9e366b1e11a6537d9dc5f381bfd14d98d9048e9e44fa28b5c912f37b000991deb455cd756ddf8817f82bf4fce00b8a6efb52fe7b2ab068b12273069bbac1f29ff56597dd881b37d6cdac06d293a1b0a2b16a459aa7662746a992f813873dfeb21c46717437f1b2e8f4ea7fd7478a74644abc7b6a6e4138c7143515b140b5f9c13dfb9682155f249616ce8ffe8649930ba67630aeb363483539524f3a56dfa2242681e6be7c6c5382fc3900129e6c6b7a67bccf39f130d3220e9606cc53521c45d6740fbb1cbcc5b2a5df7b0b03a4a112856c5f2a6555da6acef9f874e509efb4a03a22205a8022396c13f6d0bf759a6f6b62e0d7337a206861ef89a9457c04fc825cc8669fe5e25deb1518261b1c9ad5795bdb554b28987bf46fcacf7179df323578debff9645dd7e038813b70144866aa782c24778e727210a6a8281df230304d5468255777f203c0f5181e1cb8b61a46095a785b131a89d0f79e79ac3f8faf4df8c87f1d105a5eebe17320d44b3ca5e5f1af0427f564c69fa091e986ffe022dbf211d8e6e789cf476aa3df1dbd9ae2512cac9eba03be337106bee1e414e300358c0a6c3de7c5edc4c4a780fa1a1085ac2fec070b600e2f69d4cbd925d6cbe45fb0cb942d7eed0ccad418b256f70772557e8e841157b59791bc643f4d0a13bfa72d3022d7cdf392636b955d18a1bd03bc7ead7c0d3ef5558640f2128ecfa24fd9f87742ec51e50716cfa61f6a42c113af2d1f21429c97126e2da38a65ba2b7f34b9bc88791d8e4818fd196878697084a59a060c13fa1390c6689b9ba203d7013e2027f6546167816151e0e0f7c23d54defef3f57de9f3651e7026285b79c93176e853e7df986b0e1a4c1d7aa916ae02968a842c8fb565c3740ae08616c9a1faddbeaa7d4880b454b0a0904ce3430d429e812466e70a33b37257b8b8b794b4eddc3c68885c7478848309f7f067b72b76a78db4d4aebb57f7e46228371e0584b1592a2bac725f3402ce460d735bc7b532f4f1c1ce179f3dd200316f9a9c4e3036831eac34bfc9d50b794974f9bcb918660353c5745f27b06d44f696ae7843c4a42c484b7df22a35323567920f06df6a2bfae1ca4b4d4fb07a8731de05f73ad1b60c0ad5995b0304", "63", 0, -1339577064, 0, "ecd2e15e51c16ff1f9a5bbeb571df65b09fd1b97f1ce49e9a57305114d7b47b8"], - ["030000807082c403028d874697330be69a16b912c21476d3af537e87fd04e9351698cd47bd898d7589010000000552636a6552ffffffff16dc376eaef33fb9e409b6abbc1db091efffda1335130edd1105c5dfc468e4e70000000000ffffffff03b14b370000000000056a6565535334219501000000000763636a51526365d5c0670500000000025152b7778b5937f91f1a02000000000000000087d661000000000013c8ad0a14374f9e1d05d1629db7ff20e808ee8edaee8c0fd4e74f6b7a4ab6f03b96862e26cd21fe6e08a6f693cda3960044d35a5e72df1e61a228920a0352a01be55de3cf7031834f3b8d3f9c6ddec405df9ffabf657c462dac37dbd97b3baf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1abb66c431c059220da5e3063e4949adc827f878769d57d45f4a1ad80430d1d40fd03eb5d560229a80c458190611d92ba7b4cb6d9bc9cb2ee1487a4e36c0f7efe57bf39762ee51b54ada31078610a0703fda458e899b6a2c4b2f2c15b09997a09148fe6d6dbc0d56afb6532762d85821c14a52063c0bdfa36ebbdf077da9f020326c9f419912999ab61783fab4dd6d29132b2359c4a4c4149e2b478802e506b480320f8e51a2bdacd955dc2672306edee251adc660c4ea8f921c10443b231e129870b03233a7bba1e35deeb3207b6879f65a8e146446d9d98c329039867254303dbf3e392f936655059ca116dfa40a524c57c86e7d935cd9884c4f957d87372da3815022871ff08e38ab0e25e45640b108faab53a33038f3d1195ccb5355d077175c7a2022225860e2f73e9e7013316af3729d08773d941d120bf03fd7979b9d2f848046602069f6fdf8a102cfa26232c5f039cfbbe0296b3ef85fa4c6d4fbad91efccea17c0214f4c6f84d3e2a8f99c5837345dcf486444266171a8d8feb614cfc5001229cc2020ef25900d726e484e4fcbe49fb08a3a6e2714e8d48add65c86e5616c4f72246b7c90be9e58fdbac1ae8300b0a761f15232dc9e6fb95a5cc426381fdbf3e57cc04652e96fec938f42f232f4e4d04ff0bcfe751d2045319e30f8f980369663628bdee2d83353bf053aca953e5c8755ddeca669fe9fd72104387feafad2da38a9bcf405bd0bb9b90b1e37daf45ffd7a417cbe9e5214dbca49b60dd0a77dbee3c7f319f5534c1bd1fec5b74bf5bb938342d90c5cc23f1f2c42db34a2fd7f5e5826a22e334fe5a445dba6b8477fd11acc91ce637d58acea222c3dc58326965a4e34d62cbf6f5844bd078d2b0b4ce480b622760f863873e69082da56209a509394b5bbfc6bf7f8fa52d1a922edb58e227d9e4236a39121eb0c277ef1f55d98b56e3ed24eb82fc85b6641c46cb55909285088cffdde830921ba34c270f15f6816daf421ef09f9a207ad6bc25dca0251d02d3abbae75b9ac2d9b3b1e9a670b09f1e925860798d3903824a604a9bc4c6dc2e64f602e8b0d4d496c42740eb563d048db478293afe808acdf3fddc09dfc96fbf0801c27d4a196b0e197f20edc3c9004fdd77179c8a25344a35a85072a9bbd5d4bec2e62389fb32b833af0cf47d6c4892e2c64caf5a6a32718d4b2d557cb9d54126243c7114425bafa4d196e9ad66849b3f9ac632a7d1b3f2b73afad4f83dabe59c482938c14de501bc78af4c0fbf0b0c7479c2642cc62fb625e46162527f8c9a1df8cd2729b307b197b747fd823751140fd9a11a5d11ba34dbb547e0c8d1670afe4adf5648034a2de9677b432ef9afac19b0ba8119b5d97a888276cc9eb1273828f2d21dfc79c2f0e020fe801177adc7daed033f11878836e62532aa5791cd1e412c9bd526151cf7e1f023b0f40d0efcf4c60458e72cc83003b2393886c3dee1081f29b0d285ba26e530a28a5c595f650e14f464a7baec871282bd0e6320e9778a7f5b0419df48d4977ddd6601421efb443670802b154fa0fcee7f65f3da457a19b4d7d0560828659c357e4d0b856ea711fb8e3565f08f6a15c95fac78094db4d00dd3715bda79bfbfe85fd13b9946e9407431433a3547202cfd21dd04cd48c353eff95852ac8b34c427024f9d5652f299ded2f7c28deeb9da172434ea513c33b6bbaecfd07e6d5f9d3b4fcf1e26e7196dd56d86dd95cda0602531eedb227701a21d566aea412e73668205a0c21560828e2b0a0188cbfa6c1b8234fc9599184c6a7f4b0d683e9d7b9bbec16536a773ac1fd00bc147d7b5584b76fcd64258bc43140fd4ba80bd3307c6635d7914f603e30280c805faf7a7ee273b3d63b8516612a6f43db3d0af38e7890bd11a454f0597db8bf1480ebaf84f24403cc9d3e5b52d79b3c4de071af56ef28062874adc18ca8ff083f8ea7875490c4dc6ec0b5b59cef78efcb4d74cb709abcd25d17b4770e502dd895b76d92547cf4e89dac66e10513ce8c806d31b59fda060f1b239bcbf6a6556c8ffca24e96c67ca2dafa0e0dd3dfb671245c48039c4b0b1d9cd12cdb296f63f8a286e4ca59aa2bfd8eb86ba00f610cc6825645fbfe3c0e2051bfe159db8c27c298ebf803f0fc9bfb3b67cbdcb3b159b34fb44da99b248eb52c4f2bb65fa4362bc3049f3eca0a33e05483573903bbf03a5b8ad8eead0252066294ef2fe73c599c5659263118fe7ccfb5c1225299332064dd92f10ea9bbb48e0d7778359089e14ce5cad64e651c4a77bc6078ec1e4b69af948102d4ba030000000000000000000000002cd2dd1d0953aa5d617eb24c4681b9cffc759f461c45fc72cfb2da79c224929b4aaed3eac2cccf182d7144704fcf2003d1c38083f56b38c83af70365881d1be2dbc2e8521d2beb1b6a257745a9a8344375273e94dff050600d65f5dc295781b800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f59a2c78fb4a2330739e312a268ed8968a2cc0f69802f5f677f065022a7f21a608ce4463ed251b6efcc2aaef8a7b363f5754827f4a7084e91e0e267e0a0fc690c96cfd6163ecb088e018a00d06435c7b304c7c61a9877a57a583fc7c654e7c93d38cc921ee05f7fe4234c08093a57c28524e58feb71c833fed262480329b13f5031ca330a15e30d71edfd71bda3f8e10239011aa6833bb956ab94c16b6bf82470f0313b7a2e4460299b78397c7d0e634fc169eb79cce464726f436269f72fcb220010a06b221d3c91bd3eb479fc3a9bb09dafdace438236b4b5a289a92f63114879dd661c928703817dcc7ed4dd025766bea5e9697e29ae4da5f170c3854c76ee8a6e6020ab5d6e213abc651c57927670c893a7a01d92f5866f21418af00fe4d4c432cef032d9bdf4c89e7f05c2363f2fa5cf44212ab75c409709603cd301c9957056315c30316d617da38fa78ae591b2feb82b56c0775b0dd0a74241a8ec4bc03b99060de0a0213aa87f2bdd357dd2da63440b30ad73c43da1a5e1944bba5b7405d518f5028c802209ed0eaebf29ea6fec031be452f7f88570775b38d3c57a65a19d33bee8e1bc1ecf955d5ec312ed4825a8cc39bdbabf6b0f0e44b05f2f53cfbc5c935f899329c9279bf9c9adf2e1cc8d61a9f6bbfbe2f4c0963a5d8d8d3f2ebe0a7ff07017083285e87a12a35b543c4e560b68bf3f8262426627cc79c276bd28c6e444be71afb4afdc2d0f63bfe68e3def3bfb48b2fef445cdbd934f811fbe619d48cfbe61c4ff9cc7ffb6d19ed3671b0e593cbff28b2b3b7d1cbf7b9bde3807f754130939589edb9b0664d6f5112b5cdf2871e6ea32b05cfaf88834bf08d697e7d1bb7996f1a3fef4fbb9468ccc581aac11abd7884daa7cca459ab3813c38791f5f61139dae4fbe920662e139d7c3876a9822379c1f3084c7d64efd73beca924c96c3b34c979e73be184975fc371cab7babd923f7d34dbae84d83fea4e4a6f00f92c2411bb4c81fe9397afb07aa1b190d7151a62468f0b0b44ed8006c5cb4413d91479a617591aa7e749b90a4fa04ea7d745b1a53767d0beb9fd0761d0446641ac1f5bc18f8e2757e29cf750082f33ffd8c11fbb6b7900c948f479df28fcc837bcd5514e379a85c414ff20c1904e72a122396eedc8de997433be66c406b8482e20971ab53bb7cfc4691ccce81dcec36ba1d9795c5b9cbf3bbeeb13c20e4f779378975a9d2eeca6a1731a7bcf0ca3ed7c6f660e32913ea52e7b19458cb8759e4470a20ede1bfc171e0b0ca0b07e4604ffa608fc3f05610cc848e64eccf774ae296511b3aadc3d966a9169f12ee050bdf2ac6889e463a1839a616b23e93c871f87dacdfdf727be74dbc8b1914d3a4c5f456b0326ab85560e3c3de82b1e66d8f9e072180b9caca2e92b87720ed8bdae107b840c9b9db39c802851136c241cf00bea65337dd9781a403cdfdbcb564c8d0a752f74b5d778b7971286983e8569a417864fbcfa3f0cfb96ce469c70023b2e8f1d2e67e7c8c0e2384f085f7e5f0b4ba453b65f7f24a1f25295557e6489a4738738c6255ba3f5cae0da66a111b9a548e260e64daece74bdab1fb8cfd436c8fb8966a22bd9ed687ba24e580918e886ea2c69923e5196e78413dccd35db96ef84bbc34f6172c37add2bbe96ff7a7fe1430ceca830ba4311dafbea555b24d34d88eb9123cd4a43c8bd6ee6f9fee387ef62f6c6c1eb93a6ec2f6fa53fc1600620d6539b048f943d620d6e62419657e4bd8cde62de88dcc521103670f48da3e21a7f89233449de24068e033e0f2a5c900a96f323fedc0941085bbf119b2189b66afa15e09ce317f42d6865b67aa25ce78101863df2739b1b4dffc98b73cfcf05d43fb2694cdb22534b03b7e498d98d0ce5737b563292d5425f5c17a22b511a3a01cd909f3198a082fc6310f67b1b0598e8a714f98415c73df5ef27db22646c943e149802ed5ed4265a523a6f61666ebb14c68216ba57c26ea5b8796ffb810ec8517e82882b945c0b1e16466edfa3c7e3ed6e2d8da8642c7c8c5057dc9d4d98a4b028610967c831fcd7d83199e3ba66ea2d016bfe856a39d2b5b5046959895930bbb9760bd40a14c51e0b2bf19c0c652e7f296506606646c61d2bbcc433558060c784cb9fc8c2ce2f477ca3f9d9d5da29128d89cb66368e064cd8a440edbc0c65b14ce3b62de27df40d3cc92765a8f035847a4c950917b26c193a30bef99197cee677768215a3c2cbd69d959f7dadecb4f81147730e9e66b418a51676cc711f01bfe844c3a3a561a69fbcf5e6c4469d1db1c1c8568066fe1e76313d97c8bda088a5b12686687976ebf7711b54ed00bd72672c51f23af9ddd5a31c65610b1b592d5682798002990dbce156bd6cb752745acc0f26ff1843e872aa652cfb94022a1f22aadf9658eac1628ffed40e", "00ac6a0063ac005365", 0, -1337571518, 0, "50fbf85e0ec9a3316b8b37ab5185c755fa0c0ec2c825f1f42e48fb06c7e39040"], - ["030000807082c40304528e428c7727d282d2d69bf39f7542248e7107178ea877255f4980635b2146fd0100000006656500526a65ffffffff3045dcfec2b56049139e3163e65e53168d4d15e979e150e560365212ab8613cc030000000863000052526365acffffffff9dedce7747f2048c8715a136161ab89dad362b28e1b2f376718601f57a0b79ba00000000026a65ffffffff4d48861959037c77060882d862ba079e5091c5a8f5385b815e7fa97720074ccb020000000351acac3326f42a04b88c6c000000000000184f0003000000000200655342010300000000055251655151091c90040000000002656300000000000000000200000000000000002f93c50300000000e2373442a2134a38aad4529097620c370419bf4b7a6ab1f39d2a6357bbf7f4d658ab689b6a630b68bf2242e3c63787fb6a36adcfb8c4e3ba5b0cab2bfb43b78cc3a1866dc5dc7dade2184d70ebf2a96a46941f6ee02f0e19f45cdb635d6693d400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4705eac076af7d947d31ddb1530159f92713f096af7f39190127fbd03ef65e530eae0db897dd03298170ebb7ac6302b90831f78b3cd2b452e028da23faefc4cb8f3e4f92b56056212e598e9f505086ee9ea95ba6be61416f58da9747e64d778078af95c86f5a56e05cfef5c9bac398663d5ea1471c640030f4c73643d7f37ae031a832caaf0bbdf3ead946ba69f39eb146fd93ecb56af21d49a239d5da7d87639021023ae8b245ccb04b61178bc267dc9407d127a29d4a40ef63528ded751fefb030a03f9cbad06260aa82fe3506a859868899acc62a01204b38f17952d09e9a70e144bf7422d491e8c2192713f5a0a3252dc8d1e04e74b4d1cb5d7d4338f8122aadd022f4374f402301a41f0eaba4ba359f1c772c9f19a033caf82657caf637e20478c0313d98c6a6c666bbb18531010bf558b50048e47360f15e69bd9cb77bbb9a101470201a563b9cd2a7239a084150a3161c312253281f67955d97e3b6b63274ac6bd08021761cbfe4eca1f42116584f32249397244e992c3c97a9a88d8b2055d8afae2f4022ceecfe80fc55a23e62ff238647ae82db7b3acfc9139676c36c3922865969e738bf64010ebef91a85ba17e57fdf696929b5fd00c32f8dd6503ae6c2e2f736f087df337b95edebbc87d34e370bee12ebc6e3ff3c813c0d65f79da7d91c1e24dcab0e9eddce2811ac6d8531b1f176694bae155655ff4fe1239e0ec6c7a8207f6bd95e990e685da75ca8b13951d766bce3be9bc57e8d4a2d94d12a12f5f1c70fcb8b2a8351fe68e610485a2e6f33ad2263987d9a13c00c33d01005d2b3b51f18b89d7120165441e6d1300677938ad32559da91dfad8dbd43734e91ea3d20450431998d3452c9db09c36bc2c678037b5bef8463e6cfca1625a87d18361d4622d5f79da2d3dbafda529bf112c1cbafb03d39bbb98396349e56c709e385960800ca4cd4f13142b62087d106aee28feb2844c77d8206eb05846147e917bae392c40cf240bc5fe8555c25d91a385bd04d9778f52f9a07ce38bc671d16946b16f4e583744d2df038ab9675695f1b8c0c9683d2d38c8340904a61c8a4ef9400cc749aab7078a6580a4244aa18b3b982d510920a5a2af3826163016f4c98ece0e6cc4f07025442b900e52640d76305fbc45b8844ce050c36f8703c2699c91b991645f816e01723393d8aa07b1f40c0ec7a15d226da17c45e528989fedd90649655979dc41a3bb7dcc83adc9959d914673cc5205bf7b6d232dfba446d09be25d34cb80d41a393cd9a7ad9e8478388eb48d39df535932b239e55ba7497c5ccc8ca3c9816c75843b2f2d2e185873216f303bbf6b2f334dd267accea671f2eeb03302d85a9a45624d37ee67f8f300811e58f27746ea859a5530992bcff843ab2018fc0cdb01c128f7201bbb75c82638fed62c5400d237e11265351bb966945a19029acd5669f54acb76c4bc70c5e5623bb4cf01f23357d5457ed64324b3874d9d552ddd36c274e4b94185c231c7645ae10671a23583f2d6d3c38b92408a63daeb7796476c7d68e109ecea5f79a9f9f6962d4825c5071e159ed67d6a6827131dbdd30075ce482ce38f0141169b7b995ec266a54023ec0acf98e7376d724641a3e36923e3719118ed0ee23a096daff50b1b646b52dfb9b04781843fb3005e538a3514c1f929972d235290600044fa8b8612aaaee40b6ab43a87b78ceca3fcf7350d3d44e6562d46ffacb6f843f68281f233af976137d5e88a577c055ec8ed6544cf59cadfe8497744402e3f8df14d60ee6df954bd498c0856c003717b56545ff2f13f884a4d7717557811c3155103778e4c70ed31cd3b2c0a418f58600e9a6a7b3f3ca262d0fa4c45542dbda29e8412d71af229545ebb1f4680ea49f06cc1e9bc108c7f0d0897f0617643a17a8c3151421d832c702df1bcc103e3147c1cc558c048af3c381ae63f28b9346287a232f2fcd199d6086a45ca8b174d5ed959bee1209e78d26e0d2d7ee9aa9e62f25b152287a3d3a8a97f2133acac5659673b2ff61a67d1354a7bc76e85a65a8bddfb0554575000ecff38a4e34a7249f3c6bb2add8439e2881c331301b3ba280e390ae577c073f9ad9d4a8dd3868e29fb3159d6e2dd39de33588e66de44e032c0f59da3e4181f43161b3afea0d3f0c07d2688366b094ae95f95349d05b2432d43026909b8198d269219ce6214bb8022e6da08a8fc4132bfd963edbe40ef334ef48f6ff7da5a2daca546831959fe6f1dbdcbd3095522ea99ada77090ccbbc15cf6fa116727d89f13a79a63c4385fae91c2322c0100000000000000000000000072eedebe90d4058b9592b624f766b924c98b0d891e322b83d5e7b836b59e12f071cba6cbd440b263e81e5e97345a1287a450a2efcc2d71d58d14d727cc5ab9de88f141d05be41b87e4ac22e76425a85fafefd805e333b50cc53240cdf2e200cd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000234d3a1b39b25e3da1ab1560cb9e6a1151ec98a683dd07a08487f5e9cab2193c8d08e90f611e3725ce4f62cfe9bef87c6e15b54157f86d521d3a48081b54b7c4992059b5d28e0cc59a55a56e6d3dbc36b7413a2aae2eb3df70710e8b75883355ef6216d3464a210d2352d1e943fe2a4123a573083899ecaca826af5ddc01d6d2032935167cebb9b0faf1ebd2692cacaa4dba42113d3463ee4a1c896483d23bf51b030a7fdae5b284f1ede817cda6a5c95d8cece8b92a588e1342d1719d74819f9aeb0b04511dfff0cddc05e53d4e8e0db8dd2a0476e2660531a51864563a8bbfe3b0350471d2659cb620fff4309822016c8bb518764103d4c073d714886a632538f16c032201159ce13b7eb218878cb20ddfec896b264ec13bbf12658e99fa8d8e023a180221e10968fa2d91df4fcb4004aee64910c0f784b51b5e1302aea3bb95e685b05d022affbfd30f34aaa1e716727cdd76dd2489e07546572008412b481eaea003b9c4030daa1e1c3722341533b8d2d6e974651e15b837f94b2c664e7f4c2c7d978c9c1f021e99b52816c02c80ca9123bc70458e90ec45bf96e36368f52a847cae4cadf4616dd102d5bd2e32ccc73425e1bc050a7cc4dae0f1af3a021a9a9813c25fb02271f434e34832f1bf3974282c9480129a31da5ffbd3912700a05e1315973ecd28f79acb5bd1bc310ac6ac53a8c698eed9546ab3ee12e3c7cec4c02b1b38eee35585a4fc98fec129ab4a6792700c7a3cf06b360d4f0e4b69229fdc8f0b3f1e3bf48d608338495a26219030ae439e70293e5f1ca3155f280f24204b52ee514f6028e0b237daef63294ade89cb3c850a8703be4be6128fbc628c074c81903af2b244f2680d05207520aed1f6c1c3894a6f1cfc4961015e25b34b29cf8ef3f5895cad01d27a39278835afa3abd86405980d1ee674562d58e7ce30b2df810ee013146c3cc12e11cb8059acb97f79aa9f8a35309ef66f253eeed2ff46a774b19de3dbb3a52fbe87ef4293d871086509ba4557948f967be70d6b61640ad76afb9ec0eee9d9725f5474ac34fcfc5f7b18c59993bba198c58a256d7ede2116e20edc7896173ac7fd70256d9405f7927148c8e38abe096a2831d3b2cecd934a286620a331f352a5a2ca36f88989679474ebfd9f7a1b2a71996338d044d43c189b5eb83ff88071df3713fb7401c98c68b9ef95e36c80d350a3d776edba69fe7220a1cf3890a1935f5fbf980acd5a03aadcb3737dddd5191b01b27f90598f26ecb9952fe7fc7a8a34a255fff70534a377fd85b6e939e50b9ff9dcce4bb8508de51f8c7ddf89dab62f61536f7bc533fbc919b6d591b7450f29f7854a3b7dc02d8021ef9664e007abbddb8eeb8573cad6bddfeaec9b5546ca969e5f766141dbbce94d2a96441016748e90b1a471b00ad3cdfa3adb6604a9cd3bd32e7d65fa95cc82f19bcc9961093b98bc7ec71d38d94a307dbc23c6f3097836b141b15b7ab21146490b377faf89d9052f9ec689a969ed72c5801778bfe357e9a4a6499715e1b8f85a7a39d253eb6916261eb2e88851cd075a4a1c219ff55e03b3f3421d490e2cdd09493444ce3690e7f5c0a55b7d45eb74fbc47fff559edad66fb08be109174b780f16724609e0cbc8979f790d18b143338188efe3cb19a48c68c24e75dd27250a7421a5465bca01d9e615c925b73aba21f2ec2f5dba938215ddd337f32b28e3fc705717c886fede7c637be0e65b6dd409623b534a7411cad44154b958344b76291024ddb94d3cf9786b5f14b80e9239241a7de9ebc5c02aaa115822ef12a951977fa7ea8074542110d5697922c0ca040877f02ee71e3cd455a5f0d409ae17b9e5f475d8dcebf61313965ee006950a6652535992ccbffcc78b3f2d683a85302e5ea235ea6460399cf3f89e05543e4eb9fece820af9482b72b2c5d72dd2c6182a69160cabf760a96ed34f40a3ac8e89a844e525124556a3d43e02452ed1f6df9816fc7c63929abefc2ad7efe4d2e3f3769e397f08483325febb0a73407da06de0a413cf63372b44625948094d7be3af96e2def88d33f5c3ca29484b33877349e2df4edcbb31ab5f31547f595b7dd90bc025a795aebb72d55039f402551433a28f4bfd7ae8d2faae7f2642c3a97fdd34e78fb5267839b1a2262c04aa316247a3bdc59acfa8b846859a36fb005f3b805437b3a173a4b40c8d82bd1897f8a9c80056004332dfc4067aa2789cf753aad5dde2e9a98e4d0a8aa4cdd4732b83c576d9c4c7fcf077274d1feb3a4cf3996098f365f51751097fd7bc665f83434fc1ad96b7282df24543dd08b35468b272bac070e7cf37bcc01ad1acb75919f024f5ec17fe1bacaee64199c6770be581f0ff2965f8e9109073a0fa563dbc51eab3c54197a59f7b7647abd873d41faae11647cda91a482dba1a3c2a445b3e0c", "6a515363", 3, 1681858874, 0, "2d288a91a636dbcf5d310eb3b02a068abe241d0d6646ef5d3c63777262e9b0d4"], - ["030000807082c40302aa4411d6cf0938e42df27eb75e9585849d049d823d706d7afa7fbe685283f5a10300000009ac6352006a51526352ffffffff5ece7901de3631cc03faf992b93cce7bdcc510e4fd83895642fe66cc7168045f010000000451005100473360330207c10a020000000006ac00ac65006a1e8626050000000001535be13f5a0000000003e964b1010000000000000000000000002d2303f24578e9d35cdf6fe284dda3121c7a581e140546f2ec4d77a49b2d4b2e1847820d026327e3fa80d59446b03345e7f0dec7087a4492511b86b768ee58a23197f8aa9898cf93ca8eebd62ddac8ffcd55c480f21a7620d386f8f023b00bb800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000212d136b53d8c5fc80f17b1aa5e9ac30e0c4cfecd90059b00030d7c70953332d6ec386355b44f3952f9d5c10aeca4b6fa59a1d85b916d7174aca4dc03de4f956cfc684cd4db8422877df80a4940f28fbb59e9c781318274a1612abcdca64746fed244d98cd2df71b643045422d450ea5f581d4dd6212ed384d78f20ec118b263032501deacf7c0de18e0ad997e46ef3ca09207757193cd7a9e0568a4d5df02470b0313b83f311ae69e276a955d813e9e3976f39904aead15d9358b6009526e22dbca0b0282bbe8889cc455bdeb59cd7752d95e7f335d34dfa92705595cb6f2a8f9df4e93089d514de4718e7bfbeec79cb98519eb35cbe662e61eea24f8e7fe0bd0dc580329b61879daa786b73a15f630b743cd3fc2ab0e8f7e20c409dcf3725ea9d55e52031ab5bb60d42b3ad7433d6fa85f2a261538aefb00b9280f4b2e8ddc6e3a08484d0208fb8447ae05fc14facadde88632de9a49b9b39111bc13c0a8b757c268015f08030baac5e94518a27c9797c2b6039d3123ea9cc3e896be93bf403f85be959081dc020ad819776e182d0cb954d5ec17a21428691d7645b876caa28ac83cd57c5959268f62d361a40e29cb6e8e2aee94ee16718e0693c65147d9c707410bd56c6acea055a940be0bd29a8aed306af2bceab50e55b7fff83762b0b05bc633a2ed7b44ad05f44c3d1cff3acf6826e858b3952f44f7773f3f9c4c0d97ab765ec25a07bc270bc43434b8d80c263e6d3531e961e23ac93a040a8b2bcc3a9a3b28a789696a7a01f18e9a628b9f8fd527a9599eeac22a136a622d43eb496a13f040eb93b5249cf9dca23384ef8d11d0297a73ba0e9e112c8cd632f74887162c32f02654a4ec0abf58338c679f36f5766649d4adc70bef46ecb0f7657e8470357201c7331b06ea5591da1e7627c613f9bfd5f15b8abccccecce831326510ee2b9fba51aa18d8340af604f956aef31cf68e0e533821f10d975d65045fc71e5bc456b9bcfbd1c9e0ab0e893ec7c2a0f1d7fd9117992efbe743d10253c37331d7637d2226a63354cdbd012cd38156ac281648f475518c1e960bcd19a6606a461b1ad319981eb16fc616e8b467cb7a60bf02a64189ce9fe09689511d618a90582c6d53764c07bf134647b7ef5329ed6447f597b8c557da9931a4e083fcc9ae418bd03e67d596042b7c3bf638c7eed152df72bc882725b7e73c32781248228d7e53af8311522a2bed69f71cce60bae5c0a978b6bb23dffb48c4c5faedf117f308c6e533856d3bcab69daf9281bdd02f9ce16aee7bf303455dae7fb87b14c04ed7878666e0f56ce2b2369a83c950763a1b73f05b10a173048d3b5e30298b9e198c34a569e97f2a35accb62f1c69a393832e528590de5bbf5670a8dcbdf950371988d8314f7777345fbc2ba36a139b859ac2986650930e30e7530c0af5f304e54df7e957978c685b6c8555ec2faf103cb026bea66875b62ad1b13f6d71f544edde9a24d6407a070f33f3637e31ff643f050e23fe6253e99506643a32a005d3550490792e45309bde7fb46d9d2ca508b2e2b1ec377a424e41708175a56afb7cae5a3677d14037d9497343b420a1fc004d30d64c752157f701774256bd2732e9a6df5eec311c01201b3d584a4439d4363cf102b8740412057abcc263efba78a987c7c9e9680351fc650310e39303be5081680df501a0654bad499c65ae22791081d06fa9b7d940654c8411ec0d52f85b72ad61928bef2d12b4c48aade53ea9daff60f47d98a91a12d4b1f1ba793fbbce26bd9c0f370d86fa77036db8797355edd505fdbf98fd730cc67834e65bff32d9a952739cae6265301681a66cfc28b80a57a1e512b8edbd6a391dd555b8c596d8022b844874d617a099c031132403a65f4f6c3329cad589d7c9d8c2cf99c3b9b5214bd3dce0962565f69ffe7a324b2e3c0594e74ec476d8df7a04c822ac88651c714881eeead8a421ff534aba59d9e4f4230cc93299cf9f4b314fbcb2ba7993a4432adcaa969a89e6ea45fc3b676ccf627c51a6809bd772728d3c85d07d6059887bbe1fa31009abf67ca66d2d43d945608dc84267d154a393c3b114d4594ee233c4af573e32471914f7396fe1e094a5ee105793dfc43c80e87076dbdf61e3c04da582a0ea45c431be59eeed6ae5bbf51a101428b24b97478e9d45d73cbbb3278f04faf5ba77284609f19436e6f7dcee0709767d803097dac8b1d23432366093c71769112e0b5300df9674fd3b96cadc6a7efee26f6fe455ebd9383e69a0dc01ae0b3876418e332479516b178234ad06c57010000000000000000000000003c40fb152454f9f8402f951b9a21a137ec629db6d79343e683f1a32d7188d356124c372306050bd913955b86c36311ee99eb6a08ffbafa57e77c3445b0f67afc88674fe5829c283e89a017b280876e1812533095b5954138675f47b75f64ec1100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000774996e6e2793b8dde1386f546a7334f58b42d6541079ea5d5d5bca16fe808c01c421ee0b588fd29a9aa0ad5699ab8c170d8f23bb3ee51c98ddaa9f86c74e9818734b920e3c5e7ec8bb327bc7fe090c06e816622316dd2ed682a86bd33a50a051e8cc569931b94e6021c4148bd0b9db4f531adb24629b439f36595c6d302e18c020ef4748c7ecddfb1d823649c6a89bfbf3e136ccef5991e4bb06f94da96cf1ad60228c7423cf87a4c8a4044fa528c388eca2d6889a006e90c1271a414dfe76cde0d0b06e1bcc35e0a46f68c3f5753891c3fb0490647138c18dd1553a13090ac6eea20645136967d2d8720ee3d2731389f1a85f8dcea1b56b3b0fab7e5a5e63a060fa302240901771c41af1099530a2171e3bfe6264c8a2a0a43e0487f8575799e7c8eb90203a117526852d10a2bfc0890704f61b8234e1c0cdb7b647dc210a7398a4a3187021c5c768077744ce2586d761184088bea0f0d231dce82fbc0faf796338a4fc002021f1b5c302eb242a983500314eab8c26f74d4c2d4c4c060bcf8754cf25b9820f20323a119dc52d8c35db9ca1a0250521cd2440930f4313cf1739f8b20ddf228e5a7d3f28167beab0a86413277e8512258fefb34b0a6e8e003147de98c3b0857b48f505f019cc709687d9529f4f18df88191f08e118aecb64bac7b1c4a4471db0868c62db17cce04d29115917ae5088e9f211894fab1cc33948f709ebf29252b5c6a6da90fa6c2a9d538081174c01703a535ed3b33a0c0a9bdcd5ff2df9f1a5879761c30f17ce747875e5da016fe1fef5b8939020f6c49365996b805491eabca3a59d0560895b5f90f078691fa0fe07b63c86fbe219e9b62edc24ebab6424d2551ce6563cdb572d419afaa51b9672ac88d1e050d470fd506eecd33216eadd68bd89113b6d4dd93388ad87b137057c0730897c5f9a1794a14b674fcbb1848c1b6550033b6be8c7bc6281a17bc008020f1618ce22aa469775fd1f11c057046b91da0ef9ba8ce86262a26076765bb3f3d1b55a4def882ded6b4d39664b181d828f72fe8962c4f2e28593fd9cb33112d91f63cf9b7a1886728f6d40f4de7952a8945df49f21be3d97590dac3d840b0a1a6cd5b88ef9169e9e920d7d8ca112a232e62ff3f1283593d01dfa6a1769641ccae677eb42f011dd2170188d5e112ae689b75dc5804f5028781b75baa0412316de1b41833f2fd6b530d0d6a588f7716b1ffecfe7c0794aab87a2bc8f482f1bc642b7ec4af90631d45ff2fcf68caa4b6c2bb63097293907ee8256d7dc9550e090f3ed78996637acb5617c83b1cd405c190c6e291080ed52513dc3edbd5e55cb1fe8805a10cc9e2a5fa2d00c758ed8e530d1aa868c48d7f09dcfa17de513870f82b0e9b60506eab7f4cfdf7caaef942dcf32b673c3167805a12af1c38ba41c0fe345df617c23852da132e9e838e51d8041bf0a54174f759d76992ed9a8b1b654fde8825279d49974e1f21c079539e6d087b309ead9551f99e2d2e396f46488c310e83ac7bad11c1d69699eead756ad7f1dd7110c6c76b7ae6d08852b220052ff88c29017ab5dae18b110ccfd12539ce0086b2816712f86f200f7b13132b6a38038702e2fe9a246d55db5555d85e5b9532d1cc2f6cb6c4345961f10d48ad14bf468db14ac07260aa8f289358b5fe54d881fdd9ba38f1ad8ede6765849bb99ce00a439a4e72640294099511ac6a29e728c6494fcc5dbf64b815bb0e6834e8e55e8ccc13f5623d8ec16d0156129b46ff7558e747d52164d00a3f34fc51b4e1e644efada590a53e789d084483c980d089acd628408ba7f47bf341cee7ad07d010f5d23836c8bffb61f5d1ea0879194e5a916dbd386c75cf10ed8b35cadc6227a72a6bb5ac525e3878e569cf39c4a427ddccb5c22cfa54117c536203e778ce6fc91fc5e5312b437626bdd1bb11a37be55b2ca458180f28e8bc6fc2fe04abf15421e8343dead5ed296bfd16a43c25be5c2124990c40eecf1b03287a149d0ffe59253bfae6e5af8c125df3cc62ac09d23fa08047fd305f9cd055dc5dfa1d00c5e8f996d6961927d9b6a1bea7aa81ec83655e88417247302a22e9e2a5f50c6886f1f74397004032542e6e926bd9c71991feb399cbf03ef2b4cb5dd40a1f2d84e5a8efdff3fbafa24a1b00e033b0a2bc33804f474cc95baa51ed1aae2b2e2eb9fda830a7ae55036ef2014985da7f3fa5283786756d697ccdc6863a3a0c25368974c06bf30a78ec1ed99ed6eebaea348a138e8758e31e070dda38d557b4d6b56ffef6f5c8ac864c000bf998460000000000000000371a2e05000000000fe9112403cbffdbfaed1e238789b373187003d0dd0d0c54b8c46966e650cb0060a94dfedf18eaaad867308bd5fdf51919957123087ef66ad38f96eefc6e5e2cdcad5266a00f81910f53f18c3da2977b683edfff65cf5738b4360e80a9880ed20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027d992c390191b3c3c1ac97978a6cf40eb553fe073779085285bbd0c3457a5921e4229b4228707b0a326e8c305b7760ec5c293b4c07c63e72f9aa2e5e85f185175987e26959e00c7f0f8c15baaef76fa56c666b43ec4b9e81698104f6cb753b68bee08351a1580dcb08e53b2a0c85b625e16dc7bc4de54cfd762c937fc178dc20208c4194da40c3f2b7a5ccd929ab86ef73ff1103adc955d87c9ab333877df5a4c020ccb248abc3b38c5c6489801811eb52c6d1e4a1cf4695435da908128faa3e81d0a0624c353f2b9b77d0cfef97ccb5f8c56ccdd59a4b604bb28bc0e7d707515410105752c8c47d4232e17e9c3f726be2f42a3b16a132d37288cc4a9780f9347eeb7022af13114d773b7375e05e939f9d2e4ae2a1e2e0f81ea17886a12bbfbf0ff9cb8032b0e225ef67c844828f802cb7a48470c52445db84e2663b48dcfa88fb7e5f9f90326fb27f0511e6ac2b98dea2b427aa05a1a6e2b93c7b44c13e60444d542864aee0229c791071c13fee22d696894608d7d902b31ff53f88405da71edd6f60d1dbcd00322c3b1cc5221964a56ab99e1f2b818ff11b672e06f85f69e022656aaff8680bb342ea551d71b34a71d429bc68c844d650dac4e1581eb17f6e45f6b1cdc2bafe344c0813b897b21450ca7d6c2f91cc543d04174dab670f6195aceb657d34c1e96f6981294f57ac060ef5760ddf1a3f636268cb1b295a97995df172e5617da6313ce264735c5c66b1c27d1ec7f6aad7d1c0f80bf873c0d08dffc44817dac19166d701e6d493b22660b7eb4e238416ab929470c994ff78ab8426a46b74fab52855e99d684e436c4923d3640e6662215d994ef525da493a7e554a7cc76592fee9a279cf89fdc7ccd9211c36ef82266034ff1184f9dcca69c41cc4e77d96f51ae74c9e2f112f714abe3cdde03b4e4dec88fb46c1a77ab5b15869c8b031482dc594b158652b6462fcdfe616013104d36677065b87fc4233df5d1c318a82b81ac226523972c7e195a37ed4baaf9093028cf023f9aed53f25041297f5192d2574f5b5cff19a929a3437676f940fbe630b78ae034f3fa2f885cf759b0b9ad027447a415c5e030dae95d51c5a7e9756c1d972ec9661941293cfe206ae1c4c983b68f4924f485d216cd8596213a321ca5b9b69f5e3f01d2ef2c859cf70124e8e6e72ec8bd636848251e83a15e8f2ca5b3303ddafa0dfed7251b461de2a2ba89b0b352377f0f133133c42f8fd74f22f932d925c08bc0d1ab87ae772f48cd91cb35e269ce53272107a0beaace49b4814286f57cdfbc363be58b2fad96a6a41bb7c1beaa2813dfe534a4bfb0138ef51fa3aec1225b0b69ef9609cc4c413dc555895c180c95b2b4454c95bef51427a7d9e70f1576628fbe7e11e320aa5d393d5460802cd9c6cdd1522051c7b3d36aee11512236e84ed232c5783eed456792fc25cf65aaba1579729347ba95d2f8fe5e8137440898703c9e923f64925fc308a367037306e17f06dd615e7c767d0f16e3c7b960b03b2dfdd0d748fee95ffb1bf6cbe90e4688bc88cb4ba7c16bab9146464c45df9e6cff1f1f6d999ce187bbdc93409440ce69b65fb02cc7bc9c048d94f86bd72e3f24c59de6395e925914581b71125e4f6952d644c53ec2f7c961f4eb4f878711c24740813711d66ec98ed1a22d277317c547ec149c1a2e04bb2fa52053443c94b07343bc3cf8dcc40bc26d4aac84903a9446256a66add8aa83b0f01a6cbfd2237a0d74d932f71f01159b6883e7005f5ded303f640d3f24573f7ec8244437f07ccfedf42f0e257465b759a2ab3f24927852d42ba561d36c12c81565f0d777be2833cc03eb180866925113296a56d9aaa70aeda3471c0133d8ddb598d4c1c022522e1d11bea0e9c91774241083a50058a97a7e94415e0d18a3cd07146b7bda092d0cb2659cac0de2f245b3e1e5bff72b22610a65bf09d715c32f147b96b1f5083c81641cc4a76f6208b2aecc778e51c59d98143d8cb78f9f3677d2da6255af3803028b4b9a74ed8661d0b3749c9ba1d3801c65ab7c1d791a9625e2477c5eabc591b729d54f8f08e0ce95eb8dd97f87316c289bc2ec7e873701357cf8730766c727163316ff45ee9ce91cf49ff8c78b021dd54292fbd59f55168a3f5d11543c2de031f28277d7722b734850f98ab64564d175d1f964a77d4d6a34ef26e5f4e70efc6da8bb335a7dae10d3d67cb785b50d3801509786148e5cb40bea33499f3f2dc98ae1ed5b29b2c97714f926543ff404fab2e7d19c7eb5478091101c5f56968672fa324c5b6081a162604b792a0942c0f158c971d8519583b3626be311b65d7b3ff930967b2c7e73df39cc6d4f7daab4ef7fd75e711767e17b47afea9244932338e42cffe38356bed2933b9d1445ff5049ff5c5684b4d888f80a29dbc4cc5130eb10e552149a5908", "005152535153", 0, -1661958772, 1537743641, "6a30bff940636f6886e640d67ae594b80fa8060fb536428abba9e53d353329db"], - ["0e5fc93b01add5bc8f153d80bc0d7bfe892b801af029fe44bccff76da2f086e56132171b2e0300000006526a51005300ffffffff01e2d5c20400000000016a3ad8124702a5f65f010000000000000000000000005b5236a0d5cc79b3d6c480876952e05de077887a1485bea6fdfcc3dbd5f517b0fb49e1eedd14fde9ac71219e213e5434ac513e97a0974d7f613c7f9c00970978e2fa20494e5fa0c72b469dac1e1004a1c1a30a73ab36997937b03d10fc47f4aa0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061ae976b6738f2e5d4872e00075f8df0179ec7b9ded8e3c88643e0fa321e730a56a88c37749face2088c3bd88619132918635206cd1cc849f35e4fbfd7b93da9388ee60d1069a85e93eaa5e39eeef1c7d2e3b770cbba69d113a63f5bcdf1fccaaf918b84745e02e111d554e1a0197fa5859eca1e2df9b8af5ec1c1c9602e5e82020504ee7b7c690fa688292a80570997b9090e4026eabd1c388075bef786907ffa03124618e4fd2e3cf3b64ee438a9165243ae66417e2ed8190b2da6d0484ca1112f0b089f26963baba7867cc239689a8514c213e081bbfdd92083da29005c69612e988c93040e4397796dbb1b96499fa27503c87948b6f55989bdea99618270d4fb750308d9057ad1af2942648a964236a48c6d5bf348b40044eb1a7fc3bc85c4200ccb020082f54b5d1b9c7d83222e2c6734aea5d1c5ea41875de0586f88aba4db3f688103026433a2019cf4715d6f621934bbf604a8dc1ace4457930ce7b0954356ecdd7203076965b5ecf6fd4154fe204d4192b3f797b989c45a10a75a5df945862813c06b020a1fd0873c67068809755b63d38457b985aca418be728997494eb5560b8e3cd5bdc07b55c94822fb079732fe98ddd4123b068bd77e390c6553a04902c5e1713dea20712feca260cc29756c6a63d04edcaf1d5ef14f7496739a81c90f11d0a7366fef53ab3f13fa4c5d8f75409b6ae8debcb7b554db43c765ee66ba51191c60eafd0516597bb3a99fe8e2e0e0c6037b9cc6fcb51b432180c7d05535bdc87ceff9341e581869053084160c92223fecf553562f29150113a175040bab1499374e083f86c2c7b4e518f39d363ea439d4f889250257bc8a1eaa3eb4c68c5f609c7eb986cdd41bf14bc16140ee09e0ca72b2b7fa65722ddeb755218f59bf5630abd27fbced63fd3d06c484c9a5eb102b85ef443496c19515b531caef74ac76c4306ff9652c9314b970522c020d703fe5444493ed95da46c7708d1418f5612d2724b9069ae6d45aec1ff38fc8eb7043f0fd00e20fee9e2fefb97134529285cac50fc3f559ee9349694b1d8dd6b63c9690680e3eb1bd99f388a06e5a3bddd9f1e6f275cbc2987e6088331ff3e426ac594056536f1c3e66065c01318b30e92224932bbb841b10c406c3460c0a06e74d346740a42744d1482410b0411153c6b3606792f79f66ae5fd165c01ef372992a27838666ce797e7432a2da03ca39f7f2c54800dfe62e9e5e3bda56bde36842e20f497efe81ef9aeda53bc1573638262ce59d5b9708b273f8880a3ce90a42eb42152fb72dd191f998110dc1a0421c9b58154136241de2a37524ea2987d35a8c67ea14dd8ab10c0aa69416b9401f10168a47d52782011fbf170521be0912cbdb83d4a0071f21556280fd6c2788a1bbc2260f5eeee74cd4fc69ec01915c0190bac489552ca935af17a00503c99926f3e061278a17125a45bfd3418672beb026bccc536bfa8c4778616799e4a656bc3ccae4255b3057ebb7546e0a96f3ef3aad0b3938fdd3123bf1bc1914728dbc9ccecd1910efed29b495b27502f315beaae869da00998b9d4f72f772c19184bdc71a10e775f940f138417d903b845738317b938986e09b2b965d6110ff44f37ba30436b9c345745c4f297f40e1909ec220616971bac71f4325867069a8eb0436d293b22202e04d96dd7ef89ffb15702d087153f06bf64bf7fae8cca7afa7ec5d52fde36005cc2c062dbc1afe03249dc1d71f4fcd8a4208b3ee89546cf5c8d09ce4b3de19fb554aa45e4eba08911e231032f8ae074b3dae334506b317d1e1b53818a855470fb21c9193a4708023e5177f6fe4ccb5040ed04fc9aa6fee8b86673268eb909c6f1c363e496408f823c95f8551b9500952407c854cb7f50c6b678d77906812ab361f7358c43c22dd90d7351441e9027eece66b835b781c93ff7e624f6e9609bd280270f801797f004c231acb9c6ef8008002a76dc0c9f73cd2c9b3af36e76ccf16ca592d22ab8fa734ed23e47a7bf1be630048c5cc0f2b0e55c24f5d967a72f59682efb9d7a926746404eb20033e0a3520f122f389697d4abd269ad85fdc0233286ba7c931ac86093d2efcbb4c952259654c3a2ac624a7b20d5d956e5f0d6fc72ae7f3afaec5ed40bd0a1a73cdd5a3f35c1e801ba98092f5e7aa8672bd590339cde7ba0aebcd02d11ba5179dc7ad60a397d162a0fa484caf6dc163fcd9b21dbf0d4a19847f14096a3405607b69757d41e5ffa827c8d9bf116861745d6536da6ab244a659131885359d21f39600a9790ad65fc37d6308a8a1570a030000000000000000000000003648a92ad1cd2130a039b7f53e99cb6d37867f27b1ada21bf6f498d55ec87f9d142193d1bc192bb866137ab8f4f35cad2ea3fc6b51f39764ca1677d887af3e63db00690a73982d5e1e3f8b302e10134bdfa9c72095d7fc6222fe7c0111cc910c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fdab2c4dd33fbc4a1cb4308eb75b99aae84b9deb4b7a4ec921982be1ae6410f935db8bb0f8713b13f44480e6a2592bd2a2a1f551becb267f0ee77164883357a1dd1721c67f2a3b3f29e13001ee1e473991b21e66f514d5e2481f6f1c0a380835ac4f0b5f8b8771586ab0614d329da2795bf94b29cf3de9c59426df472d101b76022c6869455d5681717b13afd39f9e9dc5bc6c4fe899da74b1ba69cdb24dbf1dc4031b4dd9ebaa8ac90e936e6b4901263531c7ef229db3b3b3c40b47298ab6a779e20b00bb1ca95c3409ba1853119b111b8231325c7c6c6fd9fcdce76ab610093bc68e93c663950aa05ebce167e423d32ed58871eddf3345c920f034e1f2a013990cf10209c24f38b730f0b0be06f6fb333d8bdfef221e180622795281ff950f92bb2c9602197c37c5f12a094343e07fd81e66195c9f1367999fc943ebd6631025a02c0783021fa3c04697e62d76315180e244cc9d6fa02f7ad8aaf9b4a4bafc00dd3c1727f30219c0079f4883d784d4b00db1f022423fa60bb18b5c9c900fb2bf2f5f4cab2bd00316077c388d4f362cf15b3532d73a8d807f8e625e9e6588beb6e372d7aea0ec45aed5af7f93a38f7e9c37f96d97a51a1dc9c44c6c7b289db47de65cca0c3488b4e4eea96ea247999345bbad1bc7add81a9ace04a711b4464565567ff496caff2d10b93222d3a76c4c48057bd9ede1b73d9426d7a8134bffab270b548486a84f48eb9838b802fb5f66f6e6a522dc9d9a22e0bcbf2eb78dccaeb4516cfcecaddc479361dbfceea8babc3c0c2dd6e9678b79127b4731ea50d133bdaab838254883e6a4bfb0c1126db18ad9e4b08e52e9fdf20f016344ed344944d56cb49da89536d75a42814f48633c9faaf02a9f90cd9b5532f35b9a8046cd554c4c84b8c6a0b473ca9a777a7d235e8db1cc791e5cc2cae93c23d431ce162072f343c6ffe4df36597ceca8449aa1f190a356c4034dd6423e171fa35d0562fbcb1ae44e588674ab99d9ed9bd060c77b954afb98d44186494998b9cdba40f3b14d6b2f030ede88170f79172756557cfcae2e6c27ec799d4a210700a78b69aa4efbc8847e0d8a98a12964e239d8d14e6f660e9bb73a5a20cf68dbf5aca418c4c246b194a0136e2f2e6f953b983ec8f91f8f84328bfb35a5597f0de0226c464f147f705c4d020e45f8b92c03ed40301bef9425d0c6549974dff77667e9b700bd9fa93b0105877c1a0c72ee82518938a48a47f803bdba47c8d9c700bf91f89f1f67134b8d37643ae4e66a6b3d593959b55364854b2cb2122936e751c8bee316ee54213b3b5afa1687a375fcad8c8cd74a4b92fe81033f3669048efc0a3ac1cc57d290a6dc3150884ba5cfeccd32e33dc6fa9dd5f2d02dbc33c229eb60c7c629232890c9369c815a918c2c72dbe4ae948310b66d08a56a0216e3e9067209051ab7f29bee524cc20da150a3619acbb4c2571c7f6fdf98d80ffe4c3254fbc4af4f4a88aaa5f68950a8a8880236ef5a7164d3e9e55efb00d3dc440032e7f336fd26853085dbb9309ca61ecfb01a7dce3d9019d1f51a855dcb268c839ea5b6a2227b3ef8d166aca650b7a53cb8d4e08f0c828a79383a24048aaf19bf51e266846908eb6111f0409cae578055512fe89edde9f7eae9fb70b2540bc0cb9e02a3299f45cdd1db91947abb3354fe397706eac4030b385294455e0b8be68d8cc4db811a7ce88f6aadc14f502fa5d1e692e2198802c535ddb080d75ce2c81325a0c705424f03bf431760a6dd778d16248ace45170219df3695645d6fef832427f0ada4d8c900c5d3d019d9806adfabab5a7311bbcec6ac0c632f6f01b3fb39f841e97d9debc9c456812e6b276f1825628efb31c7a599587b37fde9b89276952eeca6cc6688313386105d4b8530be7cb184f55eda285aa4a1a43b541cfc472198b3a9d11a1529808577ff19b7604b23105d73a86185133b6b5ac3b5d2201f5e49d8ae5db68e1cdad159e57f3e26a1fe652273062382449c45325f14dad4221f6adbceec6ea0c7e94079ba35ca695184d3f045d6b163e5a4ad2a7634680e02fbc1b85624dca022f835f62264aaddbedda2fdff05127098ccea806afc574cbbbfbd75d2f9528ae559e25226d21d52146aaf751b7aae46be2e5d3168d382bed6c0db285b61da69760dda1ac782f580743392825cf3ab1a6c5f506604ab46f475db1f69a79fc1abd36bb6f9722b8e5c95a77e1adc085ff327b71cfd34e776dc2f38eebb4818e8b57d111d5576bad77b109d8d6ebc10f641d134a8d7ed42caf158b7d105facd709791de5eab550416a47bf5382144e3fb0057da070f93f99e6a23aee3289911efee3c9db2b9ba96287cf19fb5ebcf88f1c18b71f2e55986773728d4cb736de4a945940430929733031a3def407037ad3585f0a12b0680190256b121c4c904", "51", 0, -140033843, 1537743641, "2b6b2e80472cb89cec2f1f949ae2756c45c783a54bc8e6958500e3dac5fc7ab9"], - ["efbfc64202aa58944187cc4e94d84aefa7f4643e794686f2ef16df86b28e579b573ec1e91f03000000025165ffffffffda021e401d7237d6802cacb3ee06c607780f684a7b8f634f8b0eb20cf5b54ece0100000000ffffffff04ff4b320300000000090063650000520000004332fb0300000000096553ac656500515251c6ba170000000000086a6a526a51006363f0c0bb01000000000851536a52ac53656a0000000000", "51635165000051", 0, -756377186, 1537743641, "b66dc27e9ebc7309a076265fb4be075e9bdabfba5effd202d0e9b2e72710cab7"], - ["d100bd210223baee1b2209245a92622cd9f6d8f5e630b03e8af90db80d4528bbdc56d98df002000000026a0038c09b8fe00bca9c04f06668341069e8eb01d3b0b1652bf40034b44eaab381cccf1ffd9902000000045251655241a644e8018e8f510400000000075265536551656ac7f238d8030000000000000000d3c58d0300000000093daef3bf36f95738238fadb4f83080d114079018cbaa0337b2d4183ee5521c3909e357ec4d0521627b5a0361aa7bad2239c8576a04a7b36f6526ac7441b52c4d1b2d54596d1d33f6d30d14be3409d2086cdc78b0dfe063b24e2a9aa989b7b600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000174e13707c704faeb481cad1bdd9709c1b462067963623f2e42a0a69d64497d7e6a7aff7b707db473ece86c2e294298072b9a9860bc5a2f56bd82ef2b6c3a948a0505162ad8661d448259a22421ba77b78ff35a2e92df814dbcb1cf67ab8ee1a40465eb5f0109a2f0bdace39a4d122a6369f2d9244d3dbc46d1cbb92bf2dbcaa031e1a37345af135630ba65a7e776f58c1abc6f6ec5ad76a820376bdd7663b757903008e9c4815212044b1469651322ee64dbbba1538c061ac64e635e892387818c50a0446cb4d82682e5a041fcb055420060697927f35d5fbe815b5ecb1f4a6767abfe55de4e65283866040c391c3e55a4af9b81648853e68d6e5e2ffacbfb7d0ddbc020f575d657a8b368e5b3b0969e0c990fdbfb5c1e1132be1757da134843cc20603031e78d42b44b7bc657c9b32c321b0fc86bd1474b323296952ba4cbec30f9d35e903263a96ea8a3e0d6ea4b2cf0da38f30a7e503c282a4285709c95a4427d7e4c350021b90a3d52ea73eb3d804ed4d4dac2380e40adbc822a1ee3fdeb77352e318299c022faa1f1ef86fcc4125cf61fdac1647c391193d94227e0d56a331c908c8e8eb66db47acde8e5a7653c007ffc91e84f3d1a756d31773699d824d84e0a44b942cc2ce3bc30b4da706d212684c15c30a01b42ecbcba4be9a0a3f1ff7af1b2384df4a5fa3083009a23436889cb6dea7793e34d15d7c235d6003b9e09b01788e7a791cf6ea9a892269d8f4635f2464a1b75e0f846ef879b997e62791200236e701b7829ded1528c5de077046e4b93b4b57096e4d992d411d76360e6f3a71946fa35595ef2b53b27ad40953da5979f3cd51f3ba1a7fa43dd97d2586b8fc76b9da843a22db8b26af0e513468a53e715ba8c34184820e2ad16abbb42d4d234eb07f131ec3aeb3deff115904f116ba3c789f23dcb3a70b62fd03c47f5d433a682b6bb0463a67ba842353b11e43269766053a269449c345dabde4389a3b2aea20de3b526a5fdae5bfa82911084771687e5744b68c7d1e7c4be3ab6b951fa0b309f98dfa4de4bb7af6f30593e4909b73ba01cd821f00b3fce9cb7bde2cc5f1597c6d33286ed6727bad2158306e16cd0658ae2e681a7e4904c14735f9e28dd80a2086d5083a295a6fe4dcb1c8bc77f5511adfb988502c7f4ccaf62e5b1a06e5c9862907f429a3bdca404a3c37959140adc496ccaf6a2dcad445fde823d2bc84ad50f67897ab869fd3fb5d0a11db04e81a7753e183f4dca7fd0e93662e68f8b19db1361ff0399befb4c21e4219fdab458c41e0138f6e6c1df15ec85929c3f9ade1c3f4a7ed1fcae6f02a7c4ade6e9872841b88e6c36f59ec976df8b52f3d68148a9e63d6b9e333585714d4aa6c948ac8f4fd39135a834fce268e45ccb995d879a7847553dda3685b799e29730676622e6fcae46e8fa4d34419498736441278a91954a8512e179b6d41e6f6e50689207e00bff01f84454e79fb6bd767021c31b2247a804c1c0f2a67c7722a0503d1acd21cf7c4ff5bb0126999151b5cb58bc7e345284d92cacdbbc3cd65c57e48727209c1dded2f693e93e836a0a190fa7eba8be19f3f8167ed350624f3406d9885c6015943de82c0fb208e4d92753bfcb609cfbd64103061b39d23bfdb025e0a3f5d92ac39f0f655b92232f484ed1dfcda3ed701cd9e065934cac165c98133fefbae89eccfa7a20d4ce9904609deffdc720df8db66a2c55eb492f9d010ce437d8c348343a6620081ba36edf641187483b6f06283d2a24ae2a56e7efade1e8a8ea1da1b8145731ff78c76c8e8431dfc79781349a7bb91703b3bd6a7a12b4aee2edbdca19a8dc1cc6d9a844e8ba5d6a1d3bb83e3dd2551241fab2e0c57d57c585c74a24bb1a2f18ce833fe802e626105556d4a01fae1df4f7f1c74dc43e91b1ee5800764a7def388e4bc9ea9cd04c48ec4f3a460fabc602b0acff9ee4ddbe8fcaf05aab42a2941ed077256325a25d6687849d53828df68350b498f2b32a5ada80529d1216c8db3efb2f8f884877695ba419ffa35ea4c43a04b35d0d68edb8ac03852a764bbcb76abadcac8258e71e33bcfe6a27a4d693b8981dbeec52ca27bc1236b4f9658b8a978c213879d23feffdef2b8adc8e0b36378fbcb822caff0b1c690499f38726d1c3a8682a858e3efa167aec37ab363ee48b6059f451942ec790f4c5784c7f87693af21dafb8e99da1c2c1bb95583a1da957e260f0b74ce5a04f099db6d15c8a7b9aec8cb0476c0cd4bcb21b73ee652ab619eed235986a9a594b1e711312a3b68f05fa3d47d67710000000000000000bf6e800400000000d55a7ba41c99ca12bedc327399158478ee9c4769289eaf3588381e12a242fbea2e2db9cb1963481f6c9cbc4d671fd5f1e9c7d6de1137292f9970b02447bcf9c5d21919c360454fe35677ccf6ae2599c38309c6ab39bdb57e9bfba28019d8f3e400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a72d3c4ea41cc3a8684788c3f3a70536617a38ae40b5cbba37c9cef4ce395bbe62dc28d43b170369ce4fb346663a22bd2ed1269ef1565a7510fc2239efeeee4778e497a3cf2025c9ba5308dd1244080fd27bf7653e37f2fc8a89bc4a3e5028b2f69b871333b6c1ef6e8986ed440737a7c21cda8502e07f3c4cbbcb545fec052303137b5691d834455184e9e2d3b7be947e7b4acb522f8c6ffdc7f85bd8996f25ef032bda0caf3bb4edbd82f4e63652a89ef2cc0c688e95edd1ebcd512c5262d7f01e0a006f517304cea40b42152ac50cac126a420cbc60353d4ec62b8f86da38821a31b5345e7b3d16860547000b5f89a94d1a373ddd72b2b15f5be336dffd716b17450220b9d40281885e50a068aa011b226ed2248fdb93a0b16134c6b0279dc78b200e03206775fbbf8cb67f70ceb3c19e8047a88d724b0ef5fb18f86f18d41cf091c2a9022c6da72ce66d68e0913629d5afabb7e7a23667bdfbc7de0e5f8996a8340d899502197c6d044bb52c5f4836088d5289cca835dc4336149b6db4f8f6cc52e2019475031092175e984530956cb92732de62daf31657abec66714a633cc09347d0b2d481732bd0e49f10f96bf28a4cead5f4ef6ad50b422b1431343b4cc74ca807112f1b04375632ffdacf62e465ee2a719f0d82b80007c84081e3e1603e13a4a6f81329c6193370a77e2d46131939c4065c11d391af1b1bb1a9611629db811cc70667579bfd796d405444595c9a3c337103d1866a4b70d5d2b6acf78b33dbe3ad4120a543dfc922139d0452414bd91ab5b1802bf14037faad54e74a52e8475f24795e6b526804e5129cb17f9803cd6bb79ed87d5bcab26377f83d66a33093e838b8cad1207c01ca4f8d311c6b5c7d82dc0864b03978614a35b8e778062ae791047ad1f37c5b88e4e0a49cb1625cc25bff599cfd92ba0d5bf66df0726632355ced6ae5d4739bdb1950146e96b67995352f4fee7d241d11578545d6edea1bd81fb8668dc97c09dffcdc445c005a30ab3eb769b4a92937c118197802bac3ff4e1989bc71e202b7c63c7020d2edbebc2929c22f4dc2ec43f4e3bdeec5a174c07862c3a2f0501aca12e9fab9b650ed35fd7c5a7bf0fca01bf4571eb6d2f6849f667d231cd4e23f8f1ec9954048c0b853aaf159366017f0abc12e87420e0eee7b5c05875b825851919006d05d01292865277aff220d5cd9548c135fd2609c798b9f863e71d518ab676717856a75f954c4ddf4e8edbf3c34023f950566702562ee09c270062328c5803fb8643de4c5d8e09e541a3c6370fb50e6b5e424bf0cf938b9120bef92c57a4efc5dc9423a9a329989c9ad018f4b52c5681526c2706843af26b1f9e8515e5052d96ea78de7930736b953e0974c6b1d959fb96ab4c7cce57470a84ca68198af56ac0e71b98bddf6acbce72787bcfd93e4180187fbde0832367f2a61086aa083b5efd999135b1ed6543e65e809fee917bd74ae3b8dbd699c4169f2aa2e28c213dac352296a8447fa7dadcdc3af197e32470f13fc19971b7d9e717ab61f79a9ee6c0bb8fb63b3b426cfa318091335e09e65a378282b4d5e14548f52caa74ad3975df2a21711d76d95140917f749f336c545fde08d1f445051466a6f47a39d42e8d2b742313a65e3754618f96b49f4503473ee698b8657e7883cd404362e6c1346f669b3366eb322aa51d9d8621c4a10a04466610d9b321f2571145bcf2747977b08c6c2d627d78a9bcb594575d0163d11aab6904ebe6c8bb96de727e5f3ad2552b1e4b9ee903671e4e7f4a2e1762195e80ed94dc0ebda18e8899cfb3598775752ea57c66af24f8802787e9ae709717edc9ee83d221db7a478ba536a6c91ce2539ab2e1b7f8bcf22895db6300c666c6f7b5b645e1bdcc6921c30c955ddfb7bc3e508aa428969100b047d33f0bd6490f32150f98b204ec91ebbedfbd2565c5fc1d6cc0ce56b386deb0a9a96340e0ae42e992d071cad49d2f8cefcbea21510b0c780ea87e6fb62b5f3001bed3a3c21a5a39e7c39ce3819ca1fb43320589b7de9d8556b0cd4472bdb2ef01c74ad7eef23df76cd821e42be02c273086f138ea8acec23864e66f107e44fb26a79a97c1969cc9cd7f67e45380ff125341b4bf30aa6632caae6d858dba0c68b055cea0368ee550e592b8fcec1d66e868d52c651e27bc2410aa02e4bc453d01e0ce25f5eb94b8fe08bcbaae3527160c292cab301738f28ea02ba4ef66dab8e42446b0b388aee2c836004d0a87599fecb08779db950d8bfb9d3d6dfa69d72cb668ba9f8111c4dea6323a53b0a04000000000000000000000000976758a2151504ba470ad2464573098ae8a7210ab6d89311f2b79bb1f9fb789edcc20e60a0990468f78f63ff7f2fb4968f3f357d32f1864df7e5cd8b12e422b53163ac14b5259a2ba1e59c506f45bab801cbf78a70d535a2e9922d7cea50b10900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fc9adbdab9d938bab0c2d05e54cab88fddc6d5af45f4e0548c05b7f4d3117687faf71d2d9fc9c4587d51e6e2562fe97f3fb24c8271d8ece405f6d3be60d1d13f620154d346e182496fc93d316c327b67e4f446ce5a85ce488df7187875a949d2d1dc8e45e9cfb1ec7ea6f3fcaf2427afb45d2344e872af0396a9a31bd4c2490c030d8c050493c070ca8faafb1c4320757729e6bc8e99b4b72850faf0216d7a718702301313ac3217d58027f5c0fe2df58b21608d269d78008bc0c1ebf976dfa9d94d0a00aac990c8571855013df3890674aef97efb6c6bd2c059363fec933727397188dbf39e721cf8a55d48b049c63319ae362e5edbbb511796b6d2f68e788cf7c05c021fc81a4c1b6fa388e1de0f2a22b689ee724c786d764c26e1a09dcda06f62d37203245d0f89a18d786d2b93a9aeb1a90ea85c288b3312fbc8e67c6b543b29052f44021480b6c88997b65906d94f7ce0abcdbef1ae7515a58d9b1b3ca348a86435367a03253b30481d69607e9854ac4fc2a33befc893af47633085c82c031b5f2bf95540032ffb453c635619b6a8083adfca0c69c52fda64087495e3252d8ae06aeb38dfc97846f769407bb18d6555da3017bcf6fdaa4b35440eaa3d941377336dbceb2fdc06569d9adf11af5aed109e4ed72165ba6df5cb22c5ccd763e2e63601493ba90d7bc8887232b1a473ba4ac92c2e8134b74d96b8eb99ea0b8b99041cd3914814f8141e2179df1bf3a8609d389072ca8bdbae34e9457d186e2b32cf6c3a1b56c34ece86ffae6dac48a96f939510b3089b13c90235dcb171197655dc6cb264f0774e0be94ce867f10f78e52a9a2314bccfcab5a7fcf3e6b09d5fc066141fe49a5e3f0cce7be265d377618383690a0c63baf4f1e3dd7d9d53c542a6a5a350c106a5a80b210ee450ec9428fe84b3bb192088fe2396b16b260580fb99866df56e323eb08761edbe964f105924d4e6736be91e1de1a8fceba7325f7238959d4f4f09221834c50940a4b5d8fd932973df6d96e930609e9dc79f7e57df9ebf8d16a2205757ffbb7dd8a432150c52613985ce5162f1f73541b4ac3152eb0d1914397dddc25ab6263479110bcd06a941aa58cc664546c785e1c9a80d6bc11f9b50792f6d2937178784afddffccc48e00ead19adf127df98aac9509212db650ca7d0eeca65402e22ffcfd13944b229790582586989d1d0f19a4989f2db5f46210747fa40da42fdff2e51c94121eff6eee3f4e0fd0cad6ed8ec9339b97d2261731c0ce2c0d3856d3f34111bdc3f909edf7fd866e52c1aa964c871106e357b78f1b1c58962354d40ff7aa1c15c911d0378794e0cfc92d07e6ffb1fb53b52ef498ff1cd7e2636e4f1c7a701aacf1b619e535c657c96428480cd1725953f679ac3d4f6786ae6bce08369b5a6aeb39dfdb40252db1aa216b41505c033fe0b3102fff8228d9ca0c0bc2832d7200932d8677fa8e018a4db61bf19b01e9c8caddae5d338963170e9cb45b304ea2b1941b83659044c982d5010221a7c22fd08b2c8aeb3389d84449c311a987261f07eee4f36401d7773f8714fcbfe2c00e263a75448922eeb37faf7262970c10b0ba951195a91349e1f4d94735d37d9fa395fc4897c16a9b3ae3f509595de7e3f4e644ed6e0dcac09ed97d6a4f247eb29d7034e4835cf05fc72885a25a1cdb28bc6eb201979e509a5df6d9bf37973addd1cddbf9817aef75a2c86c582931fea11033c8a4081ef9de3db324530523aa5c936e0d11ce38d2d6567c53cc2b2472569f0b44dc961bb91ef7ab4328d43be613d6fbc90ba0f8b9b9f1d51b8878a0d2f663d90c7f5731cb5ee00addb658614f0ce3562d9ac151ed8158bda30395d044b4b72d46e9fdeaaa9b286b971a27305f223b30489997439337165af3db1c7cc3a45e976319b2e2be2f9f9fd1b6c6f3cb3b156f70f0c6c025e1ee67b9aa986f63afb3ce14af2765680ad52c160939adee3eec21b2072592cf2cf16da2736a001fc60d164e8cbb9237b2847e6c01e0996cc045ee003384525bb1f138156351dba1928cd83ce05815e21c1c5dfcb4f2134714ff79fda20e04b6a82f15ad5625daa922f9028c46f352407d15e891084fb53c0cb792d7ea4bc88d7442e90bc60fad3765abd72e2dc1c5db2ff327c6c937922b57ae1a152562d225762a1ee06b555b2a90eccd46bef0e47e482fce3d03ff337bb6046c5f39b517ec5e0c6514005d0417d5d8fc73b52207a54f4d5b0f3b693bb7146dac46d21cd9e679fea1a8e25e90dbbfe3f7c9b3ff9de4a8a35d7c850f8b3f72eca61c5d06fd70a54b1cbd548604e4588fb835a178dea6efc551d6a077b6bc4ffafdffc7d96ca4979b5329e669d7b8fa6a14361afb49d556a381c862f56bb35f073a5db02a505646f8670bf0bb4e8214eaa638c78aab7074efe05933332a1e0c", "0065ac00", 0, -1958665865, 1537743641, "2a23e17a9fa81f06cd125a69c590c372baa107d00137bef5974f8be3224a2f77"], - ["71cd190902e47716b44962d2a4bc566cc7b34d5b87cefa4d7692864f351ace9b09ccf40fc0010000000963ac6a6aac63510063ffffffff13077bac7d0d5742a15219be3bc05897e9cec9a3ea06dc2952a9dd7f8940eac5000000000752535153656353ffffffff03c82fa4020000000005005153ac0055ff0e02000000000152877d63040000000001ace102b16b00", "6a6a63", 1, -1846771875, 1537743641, "69602ff006f460b46bcb500696f15904ca334633090c8804c12981dacac42d67"], - ["eb07f25b0134ddb5c861fd6c5b6f006b050b3d4ae7d4d517162f116a4ef1e8fc43f9cc1d5c010000000353ac6affffffff027c23c50300000000010064d84e050000000000a23bc8c50300000000000000002a60820400000000c54b084c425fa1925d0f851b5267f04140b9193c39dc82ff3a25eb50e49bd7caef8eefc6ad000de437fdb89fa6f4580bb9a9ad7db0aa7c7e38b6e46864a6bc6bb475229e9a3f8e7708a86a0ff2949e8e1bc23f5b37363f252b178e29b9e8da580000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080152303fa326fdccc7b40892c8ddaa70b18bc0fbddb4e4c1a896ae3f39178dc3139bc2ba8fe447bab052c3a4b064c09aaed379ac76ccdc898a02db41f2ec0885b49ee0b80b8137b6e99e5d8a2baec88c97589a2a92e464f959ebb3b45b49c5582f5ee6589bc7a0d55dfbd594316240d42b69856898565d650a08b7594e346ad021021abf4939fec59552ae250e3924e952a8e4bb4b79f9b307eb6eda2a8eef5d10218d0f6bcaf7e070b72a4e190fe3bd13ed3e126497b21ec4e0c872e0a998be5c70b000061161eafdb5116b178c68cdcfa35afcddd690368f474f5721cf55c30e0c6a7e0ba4c330050b1ba8c6e77b8c59ed82e224e212cc20f59be1c2172fe7a17af022475d65acf891b52d95fd744adaf41d475298a333a4f6845c6f9d77bf0a3079b02211b6c82d56932af50338886f4635d74200bb3868ea56a3785b94fb9781d89be0313ba44fa21b53bd545bdebdaeacc6490c1b95dd607fdee760ca6109da477cb3202287d3f761d228a9bf639a88fe9d61c1f83977b8b9a5bc26c1f055a356f72e83403267c2f5df2607f1d89a775a2ceef92a4feee893f9174f43750c8bc60ce76cc73ce96fa252ac11f883ff9272a7e916a15ef6d61a9b7a49b34ee31852875b08948dd50bf6d6154c2d006ee3f15ab90b8e3cc86bd3d01be19e9e8c94c11c7f281e2b15972a2c70b68b52ba7eca7402e386b1866ac673d33bbe6bab38e5e195e876c206288002f05622ff48cc18f560996d954471517ec5aa7bd8f2f4baddbed7f706a95d9e5871004af757db7ccc3f3c354a7c52e5b7494c0490e4d07475602802e8f3225ddccbe1f817beb457e2ba6395e769d837b338d524242ea44203eb3ea1892fccfaf81fc3eec46133a6753cc578c67563780a75bdc15c047dad879c498deb45ff2217a5c31737496309163ca790a941bc6f548613ba8152586db83ede59728e9eefad2838222a0d99b2eb240b2ea738b2bc8d7b9d425675d2aaf5e22b3a58e204cd714ac42a1d4a8097525d069818736226767666128717064f659da08a70245bd9ed27e415ab350050e9ad7d2df31a6c4e1e4a8ea5a6a24bfb531b2115a100e62c20027ed3611b47751fd5f119fbc7e68d46e1eab7fca4d1e67580e2a0c8afb50bec26da04378a1b32f9795f57efa78b256a1c4e5c7538faf7d6bfa137059932f23eb4afb0d5b4c5f53782223bb7cf1161127ec1cd6fabe8913c1f143f55d89647e557b6fe9393e0c3592fb51ac6a77185497b208482335b5e6f94e9079df4874c578de6bce3944b91e5e8b97ceb0e4f897e72897bd0f40b1b53c5e057076e4d81b5386b029001f09c1abee6282a4c74734fa08cd7489583e0088f6b01e92d74d00831cbe5f29c4de28d5a1c23eb12e8c70ef47a9db59095be504e0c6adf1426c6fd610c15227dc34ad383ef9f4e9af0d26aadda3011c007e7c109463bbbcc63d6dbe8865e928acf802f4006d17577ab0aad33fbed5b137215fbf5a976502da2d4deaa96042a29a513da6a679ce83ba81d00ae1a1cbb8aba91f659ae22e424791d37a7286166c1cfa7da1f354a611199acd3135855f1ee9f09ec6d3d335bdf6fd97d8633f1c07d833cb14df38540d96513a7c7efe07748e17fa2c00c9d0c5b560f43e7518b4aaa907be5d12a25af996724ae46d712361b9060dd59952ad3985cff3f5eea8cab2ef6d17c54c27077fd5b1419bfce73cb101f99628c7dbb249cc9634f98ab6d1122e09ead043074f178c8b35e4e61f584f8694a370fc23bd59fcebf27a077fe333b73988289a5ac41bba35774c78ec876f109732af31a1bde71ae4b95f5f73fcdc2c5100f6bd92f7842fd1b320b09059e95926624f3c18cfb9b882adf398e84b2476faae06a5aaa1a394ed9d53c09b87e09f7f671ab20455396be6ac0a981245c66024d33853df68caa011d6b76ac37f117ae187fea7340664062f95799c18a4f45727bd90c337dbe9ca39f213cdf56ff18d6c35921bbcdd0af0b3ecdc225502e0e9d19820c397a6972d38eff0b65da5858e7cd099f7f73b457173042c4ba072a5dbad8731a661e6c8e90803a987724f0349fc2a9903fd46a77a0e7d03b969e61526f19a0564fee944304ad9fe028c489258644c3e1f6f7500d22c9588af5b603a5058ce2ea9edfa45e421f1d4f85ff00beb130411d719fe0aaa927572812b19e064e8c3e456d6f0c19d697dc0984362d3e585b0f30008b84d341954867a190dc1c4f19182001df2226604e71f79401640d02c73509998d72cdfb7d3106a1badb55eb3840193657dca062300860500000000000000000000000013bf9ad529911fee442d9954596f1016fb1c1ee363f4d07dfc144e96c6638dfc28e974d15f0f3a1bbac176636d319318ff3c763548dfc40c736e1ed4e11396174071fe6d8ec53285f6314ff44a8e988bbc4039279b629b87f08fdd40a404b8ad00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ac63ad0187fdc04a8126d9d80987ce2f07beca083b12fbe11b3ce195482e7ae6f72d3e59c787ea2b80cae877c1d0294887cb666bdcaebd3d2511c3a09c582417e0723fc419338ad89fad8779b6922b4f825f3b6664fc1dd0f0f93aae4d70fa3e6ae79ce72abbfaacb154f7fe2629e84bf31238c8d196eda0245b9cc7bf19f3780319162c528fb1989d3ab27ffe713375a31f66efcd34f6f1561a896bb8c788bc7c030b6ad56e4ed304c0bd16e99af4a9c5125b857e129804b958d9e4e84624ec4d770b03bb181ae81e5a2ee5c7a8beaa79bf21960f1776c89c00fe1170329729c057aa2683e3146b22759657f3142e0f42ffa8a3f301731b631c481152888e5316c5580324320095247c11659773788bcb62d32021eb66fe88bcc86ebe6af158e9bc420a0301ef231947ec0fe46183bfc47726f559a7788f42c8cbad5beddb652b53238ff5020a464b2d43d2e20abfdbfe64a35403f957537f177c08e9caa0a040e6880a53f40223242136d4d4c6d89633962cb04477170ae01b5385f4a19fc83909b41857c7ab032985c97bd07ef4e9380e21945067026c28abd664c27149663109cfd5f18ce8826f516f7bcff94ce25303f5906313164c9cd6e90dd064ad6fbb0054c7c0d0ac1b916732e339e02e23a436436ee46673d1a1da364e70ac7c43694924e0e49a989b90dd9ef4561b10b85fa4578fa959d067366221f2b161438cfd532af75f871b84628d4aaa3b625800e6bf416c7db409eb86d4c521610865a2c2aff7168cd2b7e78a5c23edc31307ebea8693f23a44ef5ea61f076d0c49eaaa356fce9a4f4a2e27bc888fee8ea09b8d7700409ba865c6e8abd8bca60143d6c526fa16501420c2182875a685e403354de4222df6c7b0074bba9ea7b54aa55720ecf54ec867e84eaadc74d07856335f73a4f263868cba89cdfc926812f9352b43491f98f32e33fb6452bf07112fe17d267f54a9fde2212127f8f9c19de3f95541574803e5ed9615555e8129ab71c8eb77904b1b7e42a679788fb2fbcc0fb73674b2202ff5716c814259035d15457139ef4c3d1775bd97d4f62b7aed027612a95f41f4e03133de549dd84286b0c2974049e3c05138e4b2b21d4f282db265e2ef83ea7294d3fd5f48e74a1ba987e1dedb0973b3945d70238323988af1e91d40dd57f4e864950eafc9f08211a25c598ccb9e6b71c432ec3d9b54d152bbf2ec7e0ad27ab21d7ed4e5445c2c5ec62f138d4884f2c15af514e8cbaff57c95bc1dcf1064753cfa595d54d9f145d84245f2051b9e5a5c56d09f7b1daaed108b40dfe667c6527d6facc4b701b47443852e2532ee7ef3161bf6fb4a4f0112f84c44b6d44a01f520389bb037b52977d29f9729fc69c7af4826e939eba222f307043b701690dbb1c0f72d1c619d1db7c2c6cec0025f254552c688f59d1247f19236e644ed8c1933fb06b194340d336f4e5b71751b5dce382b734f84cb91d949b55826002c7c32fbd3dcdeee5771be3ebefaa4d54a9ee7498612dfc5ba7bb848a9940bff8ab60104a0ab591563a62918d37648dfc60e9df98432316a3fd12393230cca05bd24a549d60f3a8bfb15c772f3cac06e3f50dc184252ead1bc49797d338cab705841811e99066e1e5a6f3d8ac2ee91a618274c46bf7b0eec4f5a475c1f4f1a0720666b9c5bdfabebb2c516931ec3688fe4d71e44dc0bb9eb2e58faf47c36794cc5c7af57bef88f1189c6e304155f42e1f517312d03a8f8b9cfbb0ab26415072e6ab6d2d3ff0ff1bebd40b74547904683a6d4a823ca407470a5036612f6c3f8a3bb5101cc79eeeebc309c48fb05c3af8a392b0dc3490a23660d59f3a36afa3d5cb86662c15fd1f40a185bed33365f09ac075cdc5952d62fd519c93e703121b117b2551960befc2140c5bbc0843195d3ce54e311c3a752809119690d2b64aa7a535db3b6521e16124bea566e8d987cfc87a2486e97bcbab930f56ebe13dae7ac8e81a99a189aba3a3e2d2a21d82a8c7ed6f8d2b3888112a1b0df30a6c3d503a329652b9379ec3da01f8f98b02be6ff1b2dff515b8cfe27bbb9fa801de76fcd4ab20404ec5ec41e496b4f0d20c1a288c33a095339e4bd7b66f1b9560ee15ee96d2a538d10a6cbc5b333cba7d52ca5655c75f04417c5bdf9fc3af677e9f39279ee355ae63d6e918f6df84444d51444080cb8d38aa2d4dae81586d62d60b8c47756f216005b8866faad47d0c664b09ecd9b6526bdd4f10e0cf11ca3d1fecfe8c0a680353313a6980c1c0854b2176cd4f5d0789cc86362ba42571d31c598e7105714db02000000000000000000000000bbc84cfff6ed335c6cc714722543ec4e85f5e274b3b8abb07e44fe9f998c5e1de685cc32f646e0d5e760c4754f02eb9bfce07028b120b02e8c45fe58cefe3517e3452e17b7cfdc18f0f0997e1a53b87fe6c832b72520655ff04c9590bcefa44e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064c4293aa4305dec0cffed3deee8c34fa877dd969b8f030aedc68fd208d70d200fea10bcf2056e4880dc985ebce5cda46d7a84c60bcb00eccf25f160efc8230e0d2746def33066faedeec4857d9ade98fef83cf81b5c519e5089ab975579a3e4543dc7846328cdc64f96e2dd1e1e9ead2a8e63625bc3437d17a0dd80f226aad8031be8de3eea129316231a0495fb79534af359e3c6c998a9e35372351ecd638d320206453f820be80aa4139ef5b9581212ef519226ceb382a7a4f2e8e81950d174420a014bb0885d48928922f5e3f70cbf47ee38ad282d17e158ee062e72d30f1d35cc98a59500e5b94be51ee5085ed3c08945e92f275c11589c385d8f22ff6ba3238a0321944d886bd0e4f12e7e47fc885424961f71c3e5941b26bcf2b10fa86faf018c0203c54f8212391e13a518103f859f4b0a5ba8b2dded37f9d726e3e8288b32f9cd021b0593182cacc2e9790e02a4c02164d926eb0d72c46afcd36b8739af2c811dab022b804a87d06294e969a86d926f4d51f1628fdc5ca4fefa9a00c18ce4d8f500c30209d6d9a0e17948e2041a6b65829b246cbbb5607e886f4a3756def6921172a156b1da5d460cec002dff782522f32c2d944985cee4b5065ba0ebdcdfa1348d0c62a378177e61b94004e11616c157018d411771c679e13413c06a43e91c6b6917181d161d5e1ed044faf03319b038a28df3cdbd78c19c85ba237ebaa2c835efb9b03b869b6ba42f9d0b0b666f61f55ba5291a5e39848cf181ca9ff18ce4dc3cb434b284cb25cc959e65e7e02253299c0616b1d4952d018f0a46b5c6e49c51a295bec52771ad3ec38dd4ba033ddfaac1a71a420167381a294fc34bf51805cd27c70d28e8964ec61cf01f0344136ceeb7593cbc9bf63989a1f92048f78917ea5ccfafd23b7148b6892226b35f26a235d8002ae95e3461ee87697f7563063f8075c1f93d219eacd39daf9714d12e6683447b4d80b1f5c1cad3ae64d2ea65d7a047d552ef640aba4136ac9f68f20ce87b4b46119555f8b837979cd51a293c32002d671c845161cf2fd03f4e2278e0db2ff7fb2fe25310c68ca8667e532e0a293e4ee027336ae1b4b2ff45729c492f6385cfbcb0fa6c4d4d218ce02906f5a71ad7a679dddda7e40c47d248d840ffa76df09a34b4c06bacdd6b3d5832c31297a466dd43b9548279c70ded31c163aef74e9955508642937f033f50bedaec178cb17b21e446248ca819c4ea18367a73baaa9e6d41c6a30a6bbbe8e8c395d475ba130205ff8a2a9945576484571edabfd06619301e56c8de6460a5971bb6b1e90d63ebe6205b189674427719da626daea0f56451ae84837e65649e5e340cedda610037ceaffb10da2e65e42a9991b574f55abf605cbdcbe4325145f15cf68ef7d61a3c19456eee3bc326c7498c13fe0f7b80e83a96392f54255797fbad9d976317cd78dd04c7e16e83080f3e6f5590440362933e2e8aa5af703507d36ac3948c96732b31c34e46790907305eb9283299f65b776fd4dd1dc5c678eab98f7d3bfc7bafa22100c78e5e1d073712e59f1052f1cc871bcbbd1c210daed3c920456a6b5df8cddfb45634d4f94ba5cf7907f2482d680be6e379f00aecaf6b2585721985f2a9d29d552395db8f6ea971a220bdc1a307a55433fe5f18bb9635cf4e446776586356a8dfe7da298f0f4b3b9e1e7bc399f2a13652f63d3427fbe364306906ab912f778443d178f28cb444c049482a909a957c9233d4022e33c23e077d2d2169074cf34e22b2e81ba6f336b677a52eb35504a7a3812fe6b95af9644e13c1b029aa57bd3341dc8c8c430852c47f8ed78a510957b768d9ce6c417e4c4b146d5701276c403d545a400ab65c2b691100754693cc0df797ddb40999d861166415d3cf85526e2a95a954887b7930ff1b8c99d3f778e73268d7c596dc79c1992de10c1eff4cf3f991f55d792785f307cd0699df3123fedc6dd845de6b6f5e8ce5c4a9185838e7f61b4af495fad58e818b276e644bbf9f310231abbb2f006e84a2829d0adc74b6bb88eb8d911d74ce9e5768f2b061774804b2ee444b6bb809e9b8bb765e54e6ef0588cda86354ce1917687102473522baad4696f23e4664220bd64b3647c920e00733ae00178b27475da57515b35da036e1b15238e2eab7606daeca4dd929372d39d9c5fbfb06510c0f15a30cca4378651a85bf7716ca377248ca2555c0a233ed87b1189d53254a456d49303d6659d9df23e11180a808ffadeb524725ec0c8e7132800b563f23b03573a08be0fa111dd103f579cc7b23e6257ae58def34b5c7ad31fe56048f8dbd4ed2fb488970c7838f104f5bbe99197b83cfc2ac17040438f3c3871f6f69b3f3fd77c538cc87e3f4eca33c7ac8b8e350eec28f063a4015cf67e86c5cdbeb127b962e880e5642f96cf78ba958630e", "6a", 0, 324602984, 0, "165af8cb3caab25931ba0c3b832ed061e1ccc5253448d4989cf3ecf24d82a728"], - ["030000807082c40302317af3078a73abc89ca47b3ec1db29aa08d71bb7b1957a7e9583779c1051faab0100000006535265655351ffffffff0b05b84e88d1fcc9be364baf4422820d0ecd1dff27f77aa904606611ceb973040200000009655351ac6a6a536363dd3c0bda0130b03a030000000007526a6a5365ac53f9a720e74e7ca7d100", "526a000065ac5300", 1, -1245418366, 0, "0e50b750c73f5225cd7a841df6028c87c91e7fc2ba69fc4472bbe07d1a7efa97"], - ["be5a592b02beb2378abb2e63ea7103c81adf1a6403b3aa2b2c4c72e185075d22916ef6ffcf020000000553656a65acffffffffbb9732d93c974a724717315e2068753390562e3ebfa08eefc62b819169328b5f000000000963006a65535363ac53ffffffff04b299dc00000000000753635251ac65ac6263f701000000000253526aa08304000000000765ac6351ac0052f7d49405000000000763525152ac63ac000000000129449802000000000000000000000000873f5c59c5193560407a2bed64e99e583ee05fe755cdbe07f6afc1e1733f69e662e4a4e4b10ca094c22efd3fcc311ebde32f150d3529bc98e7c4dc4c61485fd20be79ad383e85f02aea21cf2e73860ae77d3d2bf55f362c58ef5e6e91f50996800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a64659dc7b8cd820f5bd19687502cc29221cf1f40ef039e2f0c6d9f3964a69dcd65520b866be781e978ccd1b45614b494bed279ecf52221234d1acd710d547d8c7568284ba78550637eb1cec92648d7ba431686950cda813957258081466d23e5bbcf05eedb7066c546fb6424e16cd63c8e9512fae1ca7f654b1aa6cbb4351c3031fac6422feecd58cd98b901fa163fe2e3a146017c43d88d4e6a64e91e6fe53770327b252f802a76db1e95b1a9396d4cc00e2c0bc80ff53893c0763d1067498a46b0b00e98ec3692f891ca0dcc2a7de2dcb6b883c9970fe355891722ef7450eb0c7b7ad330a6bc4b51d39990642f46e86254f407b840663f1f007aa7927a1945917ca030f10759211aec1d366ce1effd0ee27a27cf8010d3b0289018c804caf629a6cd20324687c9ac68e3b3fdd2478108cd33611bd575fcfa2d062169b177d525b2f2cce022fdd93b2cc34467968486f65454c30603eed8f4d224cf5bb9160445ddf264e15020710c7ff3f996e098aa1e79f423d2bcf19393d5624c265cb1431bccbaa879d960327ffc309114d4fb07c748f566a399848e8cfa87167296f9eea8799c4c2869eda3877b8b983ef7a3d07a6b47c62f555bce36cfbe8589ca33f81c6993c03d805a93e6da3707de1435cf4ef9e848b67be078b62de2dfaffc970687e4da2f06bd37dd0da9708ebcd46627641ed8999e88a1977a3964def71eb01d596433fe2de8f15713d1bd05eff984439da81681930ff412642da57e5d4055249fa479bdeb09f74332ac14d8fb868de405ba4252a0a4444d26c984bcbd7d422464c08eaa1869bad6e16e5ac136e7671c9da6c67419062cbb61b9b77d5a4ad812514c5d73bed029a54fb80f32f4d4199ec1e5804dbc156358dee2f02664f30a96c4ee44ed9968344e6d0184be38cde22824f345be4c7cb80600fc2900a02447f8d3cccad8b1e5830a88ceb4cd6ca31e12affc64cc1666ce7e5148010bcc8e9568b0ba8eba1c9917e5849caa51c762ae55be5a07404463f08636f14f735b6106d1cfffeda62ae6a547f4cef58e125d9d2b55938e1303b1d6e22a323e6bd73bd80a9386d096f6b3ad5943620d79b634793902bca70a01c3acbeabd6f0eedea75b93d38a54c9ce2be0e8cdb9ab3524462e444544c999c82791cec8dbf485ef85fbe02d61dc2ef63e67be427f01404c773dd41bbe44d44bd9bf7f28fefea5a8017848788699c1551a759b3fe2c2837d6ed05dc5f31dd00a7a9c67ae1b151f2ecdbbdce853062cc0941b7e2599e1ec3397c14f5e875660536a32d0335ba22436e5314cc53b70322b103f70a3cae7cc5cbe0be150bbe02a7655d919a7e99bfb0b381a4c023f509b67fb618e7a4c72f939cab416a04908d4e750b7288f735b753d8af9a250dd79a22b19d29cdaccf726f8e439fcc8070cfe75c7a0cee5292475a9ef744c5c686f366abbe5e1e111834dbf3ba7c30701fe8c5acf9f4f877cf6522a2a9985a065964099dd105f70624038c580d53a9e2c720e68bb005d35d6409ccaa795e736c191b65fe1bc4dfccb4af215b213f200d5e5376f4a7b6a2824d088c8d8b76670a8b634243a4626114fdc9056a85fce5b28da2b8bf45366ee6d6063408a7c8287167f5fd568286cd6b450d1f94ea926b8936a9f1deca466fb620e85c90dcde553ee6192d717bd990b90f4f44305c5e586a932f015e95620f37a40769a4389af735da2f8afdc74e6280cec6af3788cbd733d6b6b320d4ffce6431fb36c1f4f6f5364bdedfe4abcce8c1f678876f522dae5b799632fdf96a0ef44981513f4f7f3189ca69f828407b3aeff2fe6765faecf766f17c68128071f7ea7a62b68ab3b02870d9914d179e920f6bbc9e7e70ec6e49a9c2de740932e9a09a2860c53c67616f98534366cbd6cb6427a8e519a5ff05a7b93f9d1309324f8fdfc297b6066bd4cda0fdede5eeb83605658e330dde35cea117967462583b2a0544bc652e148fc5a3c2bade64781e0eec6e60bd7b6723c4f02578c118f13aeacd4f6113e6b6540029ad3d4c93f4c8d44b3949fdc46f32032b72d94fcca4deadf5bebc3d0d486efb57abc3dcefdc0e3fb4d1a0b1d152894064b45757c8150857f62e5a23e4511e8443519e68147f910050ba14c0752859b7e73f6f06ed1c895ed23a08285d3cf9f83e93db85c82f7242d64e07736e1dc3ef1af18346b56792a5c1be19f9359a11c7fe9af7f204429f2258b5066777d2e79a222b75801fff6b014ec1b580c727606683d4d85231c48a2c4026ebd0e655d3cb3fa087d18805f0b755a415e0208d74c0248d25f8a8ceb008a6a8ba2acdae7fe1f37a4f58abee05c6b3f7c4e54302d3838476c6b9027fc8056c425e808f5cc15c320c5d29a77c74a26cc492710b4011a038b3c4245761c7ca897489788d92d22da27ddda6b6068a92ac0f", "635252530051516553", 1, 590163298, 1537743641, "cda2cce2c124d1735e6b49038eb5a7d99bc24345ea0c38fd5f939ef4530a3e1e"], - ["030000807082c40304da731f0fb98fbb9dcf1ac69b2b93dfe6c14135253781fb89f24290d73815be550100000002516a9f5797c99dee4c26744071346973b470cfdc65e905a673369c4a7f986742cd33f2464958020000000752636a515265acffffffffac5a611d97e698c8d8bcd7a3d4e87ec289ccf6108a9fdaf4d5ba91f3f05597e600000000056a6a51526a7efedab6d4f12c0dcfbe4ff6ceaf0bf087a8fbbb9bd69309ce38e535297812ca6e30e85903000000026551ffffffff01954a8c030000000003ac5351db7c779acdaa4ea8020000000000000000c1a5fa0400000000f1fb8d8ae2f4fccf2eea90950f1c0b745092bfba1060316df13ddc41fbe248e32c31133edf3c999496b3bf2e84c4b732fd25236a4efd979cb7d19ef4313043ee5ecd68eea94dc43fad085500b38bb235851ad6ffff0af05e5bdda6a2abc9acc100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1b3fd015c229a5444d9fcb49d78010050945fd8b3636ec38cbe3d56cf7100926c32bf5e2ce7e1f2e799aa96a82fcb18950f040b3ebb958cdbc53b9b25908b8583041d301923179322168536facd5a50cefd6fae7d955a3ae65cc4ed0d46b5a81db7c320a6ce61ec0bc00c1c542b1a1e59fb07a5a86cb3ac087d6dfc244f43250205d5d1d8e991cc94a03b91b3bebb61b1622fa7cbbce80fbc7ca9f1234fd22267032e63348b5eb59ca104b0c5d612d4517ccc13f13ddda40df8e2798c9a54ca666f0a0370b554f0bdfb5716633c3d3826eaedfa931fabba31c322832c5974bb741c98fe7ea29191115311926de9e3c68c2c43d3431cc3c97cde4a34507769cc2303d102007f32f76b378188ff4f3f01fa92d2111299eb652359ce678406a9d7b01761f402306315cab21c0a09d5fa4b34bf5c141b82b06a9919c0a71f1495da1430245ff00330139dded91d860293f361579cda500bf5720602970994e60680826de9e8fa02031348c0e1cbcbce01278330009e41b5b134517d5a66d85411b4a345f9baa6f614022046c3c889488bc17aa5c1f6095796eaddfa202df10cf1a6a78a8941766ffe0f5b0b40d86c4a03e690e5e33d9d5af3ee4528962eb0cbfc38260a4f6dab651526c03e8e294bb0cfbf4600b65d41f277e727d690ef7c6d3c80f69c0fd9db7f8eaea72ad11cc93eb87ea3b209929ff557cd171828bddac56bfd63fadef19379fc63704e8050b5c8dab1283cb9da65d3d6af9650d6c374a7920881a371f591fca5a713d65fcbb1ae66034b97a5d6eb41a77b6a1c300c40e446e1019816705636b1a4f237720ac105330ca14a1a1981e5cc9c1a0b894169dca6a28780b0afb2a20e3d0a6ec419d89707eb481216df640a575a1e960c741e78bac917dac42c73ba4067ec41eff2b6cb03888d85a59e893d320bdfe7b73461f5deb53d40da804b2435e7156a4ab97f3ad96689e3e35aad02489158d4875cbd93897207516b5e38a469adfb314e977ed60f65dac1ee493f0529fca14f31a528a381bc505593c549f33835057f8ac11c431e8d053b7f9f86385c09af7f996cea20396f82b3195aba7f0c7fce68a1d52f671f582839da9b5bc15a3479bbac8a330fd6049adc9e29870f968d203908b0d394a61cab1a3e25a311d388a11b43e17573d490e8080e0dfb2157bcc5e3803d9703038948a1dfc309f744981a3248f67c15fcaa13364e1638f59e756b1bfc8c0696368231dbdcad820a3088fad5d654a457b4668223120940e806c6a7876839dcc6c6a1d4f836797af0224cbf54864f8c530f052f97ebe4963b1528edd3b600e2526b0e68d93c09ac710d4ea61c98da170826f29009a7005e2bf2a1e95648c00c9ddbbd2c7fdffe972f74abd721c252aee91169ba89f88b8bb22b9d807b5f3228d939fcd50ede7bac22f95dca014dae296d9555094c0a3ccbff6d847a2dd9c124bb461b26d0efb4f8d9e6ae586908787826bb40010f189c4793dd06cc25f03cd37ca87433ea025bb76a197230e9a46dbc10179fd43fe676e2c77a366fe0d97cf576f864f56cfccb819fa692826b1f44ea1f40fc3c9af368df924512698c7392ad59e026d99b7d9943a7e18a6be3146b6ea14c024973dcea19a03a0496eccf849abba417d5117b657a3bff770d8aa3cc8ba2beeb9b893568f0fbdcc7def99a4c6ff4badf08f1f2c66c8245fbfe12ff7b56ee8fa422123dd06b78681fe5a2ec414ca5e9ea6f1e41bdcf1c9aefcc6dfef1e0dc98b43b588979c00850e8074561f1455a073f103ec293e84e00b39afb4e97448dccc1baf23f9247f4d5f7a91df23f8f59d0a2a97f11ab7900be844d26f9d5ac5092cd0da5a4e756f300dd3948b7a7e2093d1e45b7f47878cc4d3f884123c1ce07cdc5341467ad34b2aa97b04e2cc8ec47d854c3c53f3e5cfe410ccdfd481f23574dd97ab2d5e19e32a990e927e1a6ab34a8a3529a86ec0f56e305f1f6edc46cab09053e1c74bb0cd08a35fc8007c0d9b2a1b63a04942bb35c82c63d7cdab0302f4976bb05791923b69e245d7c135b7438fd948283d4433947c65d800f3bef7c93ba6ab85bdf9612c8ed88db2ef49ddb8debb8e7968234d0993827e3e07c84a9327b1714bc5dd5759dc77be3c8c1e7c806f8d11e155d901cd3d9fb3e4439ad92082cf0a90c5803c0fce673eee48b5930743871b08d3357820b6b9b05d95b769ef1bb533b27ada3d41dc5cee51cbd7ba0f501bc2bd85e977c983dc4c28201e2661c422faea7deb1122c23ebe3a5b89de6324934c35808915231c47d2a6c0000000000000000636422050000000040991bcd7e560c67427cf67f2126a3ec29c50e6e8e2c8c55b2eda220f10fdbefd27be3e49177303901bfec7806367b90f2ac66e6b44ce35c4bc71bcffd53991be641fdf207e7fccf93f474ccf791bfbfd1db956bed0f892ae9f0900b1f031220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005958883d29d87a5c18b853a325d4ff06e16923149f22837803d8a5316895bf8b527982caed61e323bbc500dc687f7f4cb3d2bc3c328dde6eae241c4f94b5a6812f3bd6ee178b343dc2301c7342c69a70caf2d0419bc486c44f93b219bc9c7bd2f8cff64e08583c8c46dd19d842fc65904b8dde345284267ca419fdcd288296cb03091445481edf33d538f9045d32f7e787dff88eca3132decd14eb6b82d4856083022c2ce8098ac6ddf505536428bbc16c571c74307df01e82ede500adb74a0160300b044df381ed453b203c7713342c465a8d43b14a2e76cd71f650706822fb3d68038e6d6bbd38510ff4bc054f3a7726978583a574e60a12952d62163595b8700d63031164e3a1ac26f3eedf263156041423163ae37479d5b538496453fb8b7147e906020285c2a4df8b72e894c0eaa5db4322de5d59291d650546b399bebfc9cdd4f3970329243cc65f434fbdb9bf993ffe04b68e4669a78bdf1c3d20f67aa0eea41b45ab032fd4df1b98ed2a6e2176d5ce951124b8572c929c6350391d2849d60b371de283031740d9bcedbf1f094d21225e769716403371a28b902311115d588a0cd02bdde810bcc5594c063c96c89b565e2656df4c422f927678a53f591f3b214c9f8307898b4b7a946ba8f53e5ed1ff9664d6251954423cb06762f9858ef75a6347336b24c0c676780d4cba70dd563773c942c63bff09ecfb8fc7d39ed65b1edb6a4a85a08c3b9a4917378c6de42572e3acd50a4f94606e91f2c644b825b0cbe329c8de564c5798ea5eda6ac31bbef24f4d9cf2a28c8ca6bf242a4f01fb525ac166b45a8f3ba5157b777f244cb032796827013f5a5f59d4a56cfeada661b431f3cf4a5f355d11c217804e549e68da6d2e58428843381b8def23181536cf13b6654b481fe5dd95f9c6568d3b2fd9eff1ec897b72c20c6be573dcb51d426e81c6e4d2b2765c7c581042a0ce946069cdc36dd40543647d633a9421726a0a3a20f2871772cfb33da1fc4ffef56a6bcdf9de1770ad3645154ceb8666ea59428b8f49857e862fd4d9d6dab76c5eb76416c57af2984441236a2d33076f6cd3ff8790b04102097cae36561c811bcde208e42cef6d9f2e8860cd7a2f0192931eaaf121efa17d857a0dab8a6f8198c40e2f12b42a91cade4be1d0bf35de3295fa5b57723e21928c1b36282f54f5729c88a13ed81bfa8a03871e81e00323b3d90d3584d54ba2c63f3a915c8f99973f6b52ea6ad35ddec66676c09bb21004fe68cd4976993740145bbf472112c9112326c07539fe8de565b9e3cdea070e13148160189c646d5b620fc03236f4b4dc336fc877979e80ce4c097c361422132fcc7ae78f490b4fbe784119a4a466a675d1877fdcec9ff3d457e70c54afd0053fac6af5f0bc6ec4dc46c793666aa5488a8fa9b43314c014a9e6db206a002d328f8e46b7bd3ecd7eac21a0ebf3e903afb38ea0e0360e4a18c0b609e50eef7c44d62efc7f443e5ac46c32bf5d09baf7ed6922871a678d1407e2e85c72896ace7c0e8011189bfc39c630563b4614eb6a4eb096c0b0ecb3bfa7b2727fc8f077916ad728013246adcd470e4e15dcc31a94574965ee0c9ccd914109a5807c25a4e21503e3ff9fce76b40fd803afa74e598c62192bb0d33ac75ee0532b132213e4c38f6405a0cad348b3b43d6a3884756260cb47d92043416fb5a9bb18bd27c926b80c993a0f7184e1ab38936cdc1e613314a7f343897f6ad1dbbb1f58d3182ba433dcef0dd6ff7f8bfa2a4893b370de535f0379fb92d8ab6df8fc579b14924bdb1d7ee7ada2479ef6d541352b7e510f59b1f1be9a42379d690d73fb3a303b7c4bb12fb8cadc148515f73c4594585d64bc9617c49cfd3fac7d7d8b34cb94d813041542605930d38390fbfd16088d653b02a81d05cf050ccd0c02789e25cc642fd97b6d314359a37cc6af29f716f420c3e1ccb81c0e15b858b9fa3706f6a57cdc34b0be6dc7310ea818123dc868cd43d4574ee43586a1a52ce0ae3265da8fc404e24a0653dc17829463f7be71b2e672f25cc56baf1183de6e3fd9c4a30da0762812a1655733ccb22260f5ca135afe75554236ef1690b6a6eee2c2c7951b9db87f3a60e9887946841989c5cd638689045203ea2199fb0660c43c0af8f4c7aa1ccf9dff4ea9f5c1ae3d443a7a120ca67c5f79c4d2fb46e8e95eb61bcc03c789deba3e354aa4aa250d16532b37d6be174bb2d6dff78e00503c41724236beaccfcea01befdbf7b75dd0d10565990e0bc6eecccdc50a0896f53fcb7c97310de84a3614d490d378592abbcc4fe8e9da3f593b9d245ea4f39f744cd7b562e930f73557d5385d71e6dff6019940fa7581a0738e40b0cc8329741399e2986d6755a00eecc6ecf9ec33d2eb78a883dc99ff78d7e691618fc8c54899c61c39b7ecd4f78d0b38bb08", "ac526563", 2, 792629416, 0, "15ef78367492b537db356e451ff94416ac3956f2f84890dff5c799233daf3564"], - ["030000807082c40304e24cbb60ebed7a10e7bdbe9a9cba6af3e4c8d6b11bac2fc6aef7d00a47734c8502000000076a656a6a53006affffffff1d12782f4759a3e91aba47db5c1314835ac1e64fb116a8b3c1b1d3570a5edb1e020000000651516500ac63ffffffffdfb842b3acb5ac515666cb3065f1da55965c1120d7d7f464c2b1060d257818a801000000035263639f623dd008bc72bf8218e55f62d4e3acb210e81a394c23e60f7fcfef1b052d1021a7a4b4010000000963655252000051ac510e89275b040a6552020000000004acac00651a484a0300000000016a46ce61020000000008635100ac6a516300e376430100000000026a0000000000b505069c00", "6a6aac00536a006a63", 1, 2024892155, 1537743641, "2762fb36dedf33ea0baa88d842029dfadb5db325963bdc42974dfc3d197efbb1"], - ["030000807082c40301027ead8891caf8eeb89f3baca8bb3098798f4c6cc73f8fcd6d26e74764ce3c3f000000000365526ad3a757fb0491ab320500000000036a00520474e50000000000007bec950500000000056a63ac5263f5ef6e0100000000056565655253916c8f380000000002ae18e9040000000000000000000000007d51cfbd052fb98e003368cb20cff91a2620035778e72a4ecbd88304860348d1c2abca03b22443883b3e9f2ed13aacd8d78f47cca131923a9b0a45369a4138553d54df60c5bdb0a9c88e775360f11b50a8fee5152298cca650fce6e12a2d3e0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f9a95306483cf5a59b6df2ccd9988b71304c8e6e0c468326f02acee2710de68c3d14bf416ced70994dd6f987e9f4a349cf2a3c550bfe68b29540cd49f00663ddab192f10a4ff0e13713a03f924703fab7c83ebc215ae991befc12b60defd8072de8f76c73b6201c0f5f629dc3b6c835c2bf4e795c22781d08042c0f0c9e2ae390321a13aa2a7ecb9bcc8b9e598155aea0125ee837d813d9b9348b1c3e56e984991022bd80ab850bc99a28f8a30e50019b378f1e9eb892e02ba07256095a2ecf2bc740a05514e998cc8511fa817a38582206e72178f2c2630c9ed55fefce2634610c35ecbe1c2125508f82f26000f5e7e935ae07548908de614786528bc4f9502e8172603173a0b18211a8a0a6dd97ae30eca3ef6f042b5de60a5ebd04053458d55f85add022db6f717879ba70ba28e3268e09de370190065d20afc4a60c632cfbdfef653540306c686bd66ac694f5ff6b5addd4a530cdf5a4f3b12e86cd23f48c761ea06679802300d2a742508acd6435c366d51dc6abd605943d0d5c3494223ce60ae9492fab40216448b36be0d660a3d47d3110b7a756dd265c96131d8f399ca55004d9ed493773947c729a76189b638b8523c8c09ce8d6cce3c38ea0124a35fcf3deb92dce8654e96ccc6ea728f14fd40b36c59d24de712b70b3a1a4039214a94806016a71954ba815b6e3689e2ca54989424281be0f3ff9e8b5f5d86c87754debb75f9aef2383cc7491bc0eb800da0736fb057245874a7cdd1e7b6611eea9fe186d4bd6e30f802b80e8a56424c45c9564ebf6188ea491a1b8a0290ee301d374479c75688c986a38338111980d665fb36b46bf0686d80ded9e543841f2f5829824184a4b2a2ee2e7102890c6d1d8febee3d9f6599af530da2ee115fa01d75e643b66a8c5314ab3777e95ed97f47afb9252f5ef447e59d555abe443735c2dcfd1401d06b96cf34e9b47b0ddde7d1d794c78c9425627896986153c412e9da1317d66d8b7b1856624448d944758ba212fe7cc9bc7a9dc004a7ad8fc054d4d0af0b77b702aa43d6448c615ef002c3eb00e6d0dea9c1fdd7daf0b078207894f361f7ce27dee5bdc9d1dfff10ddbee306c5a5dbb32357d99aceb219240828b4ef026b6b538f3f102b9764541adad8d965edaef539f7a9cbb1cb6f1aa115021a61ef706778db86c1a1660217495e5b237d390d6df7428a3ad545fbe3781e93c5b8c85a0947a4ff1e663974276dc948031220a3399f9632ded7d0fd0d087f4f47e683b2dae1164efa9f6feaeaf2825584c251ef164041eddcdc5e2271971bea3069385606ac9535e1d3dbee0eda20aa8776088c3ef23aaa50a9ba6808146a1e5ab6165c8ce682d3026ccef499d2b2c3bc4bef2aba254c288df455d5ecd61787b5be6193b32c1867a7021cfe07af4e579ad0e5e32bac01b252c39b20630a85e5cf467a6521b469349dc6fa9c3432c12cd49b2f2c7e54f172b9e014fc2e29a32ce0998493aa4df9a9e2e1036ba4a25198de1f08e1992c001749930da75216cc2c1b189c8c495577682fa0bf956ef11c6942e157e7a1da4841501fbd817ef005bc239d5bb0289e6051eda714998b855f6d37b10031fef31a8ca84caa6d21779a9baa55d08b7e8e1e9c7cb3fb363da28e3ea168b71105ea3d10d08bd617e5c334334755db58c9c065922f9b67288842224001ef7f234e8742a912784fe7ab43bc69c18ae06094333e594bec1aa1a0bbe9790cb40eb34e9e34adff5c6bd4f4349516868fa6519fd9b7515be249289b07bd66d6680bf1ff3dbf7fb84d44b22e24beba69345ff297ef570ea019097bc7ba3f58b8e9b9c344a9ed660ca61883f77751675a38bb7e832fa8fc48691d53688d1c3cef11ffe95fc5892eebe6d2ce343d322eb0209d8d47d7984d7a1c02e77272ec2efc5d26809972282a7bec77d08d9a3bf7d0317402f9f569a1a02bb21ac2425394cff663a9764dee991dedeacd50e0c873cbd20971bbeaea63cddb13bec9dcfa991d6b149fa6e3b73ee74327c5fce8bbd413d6d19a07135fac69064782b93cab76a233af5f3cc0124776894f0fbb5dbee348b4536b1c3ec85cd2b4c8afa69245b4f65a9f36b714546fc7cd0a546c1a698b1384221dcaf5f035eb4707c2ac802f5d6b193e6cc2bcfa2cc657ad339ce3b2a3d28e8bae690d298a40e0149113e35cf1539c5488e61299f5c5667908e4d13202cbc1920d922c0569dd010bb4f0689a772df5861139c9c502bc52da2d3f32cb1507be2d4007d2ff6bcfd63f68a9b90cfaa63dfb02a9cfc96a85bab3480a0000000000000000d554dd03000000006eccce9b71e645e886351d15efbb5badad57e77d093abfb9fa34ff77aee44a495f4e9b53fe8f42734eadde461c7a0b0e6d75fe6b9fddbda7e74bc330a9dbec8bb0db4c1c6bf4299e05151d343ceaab54e468587dd21c16645e2cff6aa8e067c3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006d18c97b824bdd9e20d00545d20fbdc5d983a687f70ce106d2304c7e3f3134a2cdad77961317de22c79ffbfa1e233fb1c0eda9f1da71e812f83d650e6a1cc4331610d822057e035611e5e2133e40f805f3c18014de353eacba3ec6f2d61a517af6bc915697eb3e0cbeaec4fb5c43577b44f3d91e6b4d43263835f13755a8db7b0307cb885e037945c2dc10413a40a5b3c7acfc4a80a4ec4b8b59655e67e1eb9d5a032b106a66d84abb8e70d874df2c0b012e9a6834feebd26621842ed24760e7bc8b0a0004e8243c4296bf32c1f10376bcbe492938cefa0bc01478b6bf9017f4f8d4ad89332c8faf2ea699780e88fc39d8c1566605d5c9bf639a43f963558f1fd3e2e3030b4dddb3b3be7303f777af7144b0e857dd8ed354c5afc0d6d29f8ac02ac93fca021b839a76e13c7a51cad8fa28bc394857addab979bb75324f6a6cb8bfdf9127990226cccade7d56a1d178766647394540073f8f82463db27010834c6aefafbea0a802235ff55c4ab39871db5b66244fafb6d2d2ce91b6b1b5a48a956bf375925c75c0020064893aa8a615f052e9fbec7a52560693471e57d6bdeb3fa9109b45873121e28727d9861094ad4a70a94ba7fdda06a5815fdb127d02b16dc4a9c1bd029831fcc16d95ab349b32d108dd487ef195da6b96d07fa60e6a09dce5aebc4614777a69d37b6996e928f658354136335cc5fe564f9a7a2c30d848b8cfa7295b88a7996800c67f5e5d97ceffa6c5375f3bfef38a7fcb0f48910804b803cfc5e01bdc9b58ccc335f45bf809d224ffa71b21ce634a2c6b4c0a3822c796bf1b09b09868a8da968d6a0851f3fdd95a7dbf53e5614ba83cf2ceb895f08bad49d3d2f2adb912a918e8c736006da2e4a740e3b4e90477be06856ea1a5092023cf00138b4606759a6a817043430f6afe44525854696128cbf758f2a840ff7851187e968294db7e756233433f4ce7a16d4c91876824dbd408da978cf0ec57acab45dd14353a2d03b6e4eab9dbd08a177417d903b52a6a6ab49eb9ee6dba13ff4eda5f03e4c1522feb90ce4695cd81d3ef42b8bc6883a6309c8a46a4189f0b6f9f607c06de25a77c9a4031a66b8ece72fc6ca9fc56a22a8f9aa3a6cfef4073dc3c8f9ff62cb6420521260a5d0d285e3f0168354c206dfbf157dca542efb0f4f630b6f75e52518f5fd9b7f3642ca822c3a24f276a46e6bbe6de42dc8649eebba14f20ff02ec27220e07352671e79e3e1bb157a610d924952ae05bf9a5d9fcc23e483bfdc68dd29b8b35f2b370be06f77003b11f0119447964ad1d6ff6e02e922f57ab422cac35d92b9f6d933f8dc1e89afbb694e7e40d00dbd1128008a13bea8683e693c941041ba42eaecdfc07b96af4132c0ddd071286dadb6b9d55e7a1082eb5faa450de9b4b4c2b868c100b4a1c4291a933bbd84b520d565d5d77843900cd4911ab3c4fb11aea3c6516f74e73581b4a2b928932c36c361892a6c8d9d9c3a43d8f90e6af90c7a1be1bb81554717fe631f91029ce2990295e2e30b54942c729d63ff85d29147f0abd088ed799f25f31e485f0f0bf45b4906ded52da63fe96654e25392a3f534e17cd17139281125d7a1d00022b589a948e066a3aa7e9f499361b8c6397962ed21256937d5dbb6176b85c2e2ca53f2bfc0298131e402cd213e16abb3db3dcb0cbe40b9b928d2eb6609f9db843432e1104150c0d0930f6889ac48e1e22fb73cb17cfe9e37f764ed11dbb5aafe64550028a9ca6d177fd85c21dcc25df4967268004952ec61a91e8f943be823e172068efcdbfd827013bd1876c9232f2f32d352fab5885b7f43970a094f5c9fbdf0e0b6773968f9507b36b7ec8522fbfce1ba4451f9b5b48181a8be951d2203a5d3cfa842e2ac84489d4e5a58660980d745843377dc8db3633a5ba3234c6a620379613c095de9f594c17890db21c94b88be7b984888ad9cd8301ca2fee1cc933b30a17a6e9bd44904ac5d2f26e4e6384058946dd04816ba50dfe2d0d837d9b64d2f77dea3b7f556dddbb7d5f6e8aa284bcde788bc23261950d5991cf1910e13b043e8b2eadda5e5442fdd9f3b0656a433fd916ba4877195f6763b842cadc236483040892807bb6e55e49918e638411dfc59d15867b704b85cbe2dbec0eb044dd727ba02b04cc996d71684b74f91145780c99ade11b634a6ec6d231349bb4f26ad9f09ce36ae7e49f4eca3ece1fbd1d43d47654d23825489dacb926d934e7c388636b53ba95df126d9b449936a31e0f525040cdc51ea3bb0d08befb38dd9c6f7d859770e0e5ab6acfec8c3bb10207b586c308bbe98d93b8313afda4ca8617868588ce6cf2be01ca6ba0eeae15edd22b7d781a4392a95f86d870e5a45728b70e34ff95345e5eb2d0f41fb90098e870380a4863eb2878c86de61450ebe21d97b3e46e9a14d90630c61903", "5251535251", 0, 1600617601, 1537743641, "d87e739d6e79ca57778e3b6ea60c410b06ff5d9a9e9fe710b9a605dad2c99635"], - ["80d0fc1804bbff0f0b3ea36aa1b13674d12bd6527c181dc4b2e88ba3b00c24ae692a9cbe5f01000000036a5352ffffffff6c90598a4ac7239319c6bf09b0d45f9ee9cc175a0e7e0d1564bc3cd4be027dbf0100000006525265530052ffffffff480e46fea7bd17971583304a5f2789222e5cfc24e148f8418d86ee3c0c63b1d50100000004535163654b95705d8f4a44821d55020c2b28f40f1c6b74ef791315f3ea519ab3760e8fd7e9ae08120200000001532ab71dea02f017f0020000000002655337d59702000000000751516a6a5153658c9e2d0600", "6353ac6551", 3, -1671120871, 0, "adee02d873d52da2a694ca9b7ead9c729bfcde32774071712cb05f62793a869f"], - ["030000807082c40304e9703a1afd33a44337ba84a20619a52a14ea72f9d00565d30c409f89bc3321b60300000004ac65636371fd09e6446906db28027b58e3aaf8fdabc890294424b718c033c2bd0b644f9d4522a07f0200000003516a51ffffffff3c0973d46e294584654e342dc647e6673a2071f83cbf11d0d573231a90b1e1ac00000000066500006351acffffffff6c84297e96cb93341bdd2940d3eb53e539ccb50d064239f2a844a431842b6a2c0100000003526a5357ce00aa0488fd5003000000000752515253ac00529113960500000000086552535253530053f37fb4000000000007650051006563527c18000400000000065100ac63655100000000000000000200000000000000003522e00500000000425040f20b5f3b978d782d947bd1e5048abfa4d56a8e9854ce17ba58ca2e251f83dba129a6768ff3e161a7c66dd6d09f0baadfa37d90342af12b0a416abcdbb3ba13e39c3860cf1a84f963d76494b51e3cff56a81da9ac475d9d5e92a27bc9e400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f94d145ed7e1141f5b9a40964169315419821e323e702b875f5a733460b025d5a92551c8368ae2d429d39033d4ad22f9554cb690d1c3aeb1b4072663696d8f93e7f550f80cfdf22c503557c527e4df992289727ac97a02f8fca49bcefd424d495d93564ba55460cfa34839f1d6b2ef1892b5fb1eca3a688c417d10e01089b3fa0329a2b32d32198daac1394cfeb83f700d34550556d14e08da970fa248ba1349d3020c0756c164ac4c1f8ffead793b5f88ab2bb909b2444eee13479e08a981aee1190b0625b3698035df9c433a7803916401965c824b9f662f72f7b12e719f181b0cb3abfde308c050442d19ea178779d8b707a2898e5bbcb539e0b4948f148aa819f603189d14b74cb443ddaa58c64e6cfd774616a9021f30047fd9f11c929339a26c5c032ec2ff029310692b6537abbc52916d8f8366c1a60d379312e69408136113bf7b031b69a63999faab5b2947e72f46321e688ae1f195a87290d0ff20c0dcaca3a1f80222cec295bba75a15abc9a26b8205452dc07a146bc8124537d7680023effd1b7202071225c8a078ae05821b6bc68fe37b396591ed8241cebc0cc51cb4dbe11404e7aa09f97df1005dfbe6c6fc50e2c021b22a79e1cc1d531aa8a64f40802b5a7553afe0ec9504692215636acf1d167a997edc4df24357fddccd03c6bfab5a7c241bbb7e0404d96686e080125133e5faf2beda177a698eace1afea459f99a70c8c895280afc81ed5e6de44a26fa1aa2af85473d1d2a24e5dd019be1b4af11650a5b1af5b9592ac486a137e7ed1e1737310aceed05cf70852f58732f47f4385c48420e4abfcbc831020fb7b851afb31451f9a97249b7e86dd38b59c204b32af70d7088cd020cfeae6a2a69b7a93c4f505e3c8a0d41e3ffed01a51021bd1b5fb8912d4b7f1c000d1c4b6cca2a67dbd1702b830576cdccab8d373982f74f652f83d564842d33ec27bf1b76df6f27b139c2e6b0f5e48149cb6c894e9d8e00ff8459cd03c452356025640e4e108ca50ae6aa82f5bdefb422cdc311a7aa50739967201e1e4f1005a8a61cde4b3cbde1f06826111342061ecd5b0b1cf6241394dbce5ce49170562b43bb3e999e6a6debfbda9ab0eeda4847c7a8b4238ef3a78891dc885486168f7b8c481da1de6965729c36400e812c6847dd916a8752d5c95b2e527c0d6c591e8d3d002d3ab9c48329e4c1f0732e56acff2ef8041ce9c21c1bb65e045614885462ad0fb3a61cdbcd922aa845c0a83e16647be72f278597bf7f60b38f4543398689a5557721013992e9ea8eaeec3714ba48810138d4b7c33a825c083c1eb6695ddb957dbb23e70151239e1ee5c785fd96e8819ef96228741f45027a2f6f4e0fb5845962e11080b6be0c43eee2f0fafb08bf5d3370c8d05d819354f0ef475b7db00bbb36171e2fa6b2d3a14efce84c40d30217668d9eb16a303ad9a8bb5419ea08743286f09e76aa02dbe43701a49160d09ead8b0cdb9227c1b7e6a41f15e887679fc3f0c77c089760f312f582b3fd429be7be4aa58e239204840b56edfbe8a45fe34c55dc8b69c090e98d5b208fafb8390307eb66bc41b7b8d631621d0dd0e7983301e898ccf6efb8877eaacd14091818f93135fb0565770734ac431389c3b6a22e939bac52e073f458a7cced0c197fb7b33b8f890b0cb5f06fe1bea98f6f6c6b6db1baf90557e1228cd5225e425bd23da3a8474e37cf7150e74333b15518cf473966a3664d55e63875f9b126dbebc88014775efcaa94c7979edb91e9c89523c22f1f3f9c3025ce986ca0b7dff1acb41fc1dc4f8f46040fef0f342ec2b6ab8481585a15b96fb94f247dbda7a6db8606477b2d671db64efe5171dda4dfa873bdc52bbe69342f3cbe4857237b14dc89fecb084e13d43d7632130dca2b879ac65cecfab856b41206cd82aba5a46b050096c23154d581625ac649f537f0a30f1d5f826adc49f1cf70d852e7ce032dc3e6e7640d2fc79c019e507e6d6c8db60849cd2c3b5078a7b5558423c3c676e16d4d3ee83c065dae7f1907027a1a1d35e4439a5174e4f014fb24861ba6b1e36060c0fd810c244832c3abc9f5120fa22b755d167889366d2b9c4e85f1f8e4e5af7ce1128206f7e8cf8007bdc3a67755e193b3a2389179c71eb5aa1f311223e077e9ce7337f5b5b903380d610f3cd62f0efaa564ec872d30262fdd14179a4fd034f9f8eb9bd06219fd527a3dd8df688be865a6a952267543289ebcb10fa0ac80d9adf73266d30087cfdec9c43504b0d3433d624044cde35e6a9fa9ee68ab854241fe2768b7c4728a503000000000000000000000000308dc1276a7d0ca9898bf02380387fa412dae44591ac54330b7ec21a8ed26a38ccbed85c99b1934d80fdc1ecaf155058d774c77ca63e5fa64af387bb253e029d608ba19ecd8846ace583edb6502fa63e41c8d9bb0a2d252ab7ff6f60c3416d1400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a3e6f4f91a24bfe9e249c44ddcc2bfacf5e9a0d6584440e73ddb161fa712cd43494ebe90a39dfe70ae03e883bd28ad2ea88ac1e383b55a5246da59f19435284c7c40b24fd67467694929b335eb23049038ce678f07ebeb05e3548bf20d677597777a249b9af27a939b390427df871e583ba924de26d8cb4ba6061fece553c6150212d23741e1ce522246372c6995e0ffef774b80574666108037bd98b47c2f07fe0307ba7749e59dca23842baaf66b7c63299da7febc74e3581b370c1965e83f11f50a0428a1a7b0e19e9b99cd91811b0b2d55102292eff4eec613d2d7b492d0dc8f737e3e866355e3d862c126cc7ae9ab2ebdc68416aa7119cf8e56d5ef4e17a119610203294cc12a4b583556dde4ab5e6e91dee61e0d5aa3907656990ac75bb084b508020344f619bf142f4ea533a62a6505191ee79d4fcddb30c95a1ccb61af0ec10ee703023508e7718a2cbe154f331dda717348a23a132c22052d98bf07dcc0051e9d14022d174a1ac02d84dda45ab85eaf485a6b6ab69ca04fcc7c2b5cd4ba52591a35270200b5521c1224f29af60a94506d240741ab7f297ab84c6cf806f5c56c950e707a956f082260c92e2285ac16d419cd007555767916262500ecc7ce9f37124d20c8d2628de62db1cad713061a10fb06abbe654a20bb83653a0bec9fdbbcd6fbea898046fd3bbb86a18d79c9b1f1edc05092684d6e4437ad3c3eff02f1657c323d81e2b3f66b9a512c1daaadf8bad8521f0eed46cf439e51b145b3195c63730e6aa6604f8ed004577e91af7bec9203f1df58617330603107a5d799c2673333f88f62dba3fa0e6de8768a457230e92ba1408e3b7a10d21ab042e4359efbb9b6ebe3648df99b3d832d2c227929c08fdd12d8e27e86e80a61679c745ce16af8c5c9b336a2f49e34f9465640d81c68b0ba38419aaeeaf9cc651282b12d6b0bd3f2c11f3a5ce202e49ca6636190bfc96c62379e8cb1007112c530cf22f377ba0b9518d33ab4f9421c59c58b5e5f09e58a0cad7bcd3bfef3ebb202eb07b3ff8caa03ce37b6a93097e3d23fdd0f77d0ff1af2c724035c13def9c3a93def37de85be5dc50dd42b48fb21c9ab756f72245bbdbf4ea9e55c9ca4fc4ca2f0607b1d033501d14f811ef481563e18f32cbfcbfa30ffe2c42dc768826941e9eeb56e733e9cd05b32c361b61f448de853cfd7bb3a13e8c070b2b798a9692877fea82b67fedc889bdc09d24e5383dac3ac81b722521009d453279156ce3cbd58e184a44fb1cc2ca0b91285ff5f6ec5ca8475ee2d1e4b7d6f285c1f4c3e1d2e515206ab3caa06dd1f2b9814711569e68705ad33e65f277712298f01001c72676d4b25fb8f8c11ba9702a2bb517193c440eea2de18165b3f8d1d6eb96a32f03753630caf8c88f7f747a826a76fbfd2186fba05134822a81724e5d44458d3e9cbb20cb97c3844dfe27970e29a0d12f186a1d46dda2ae6bc6c157859550c76b706035d651a16400d159e2cf84dc1708391396bb0bc9ba20623cc8c7d87c43f31a086e65c4cad4df0bafeefe9854123a373b3a5321d8f6979f1bfab240158931ed3174c38bdb306e2df219f5f978860194d47472f81530bccbd4b64c4f2bfd0330da39e6382cfa40f9e3e657597106835cbc7afc247c2087e7aa7cfaac1175208149f8c7d074cee7493cd2af5c3d9558ba5a920c3d8baa8665ca770636596e9f18f4fc633ad5b5f6d831f7bcde1f887b5c58f465b42276fd0551d8b5c8c64ea88f60553ccb34d7f66ce61253ab9a93e6c7b02875a49fb94e44bb4e69050fc3af75e1cc70caeab3e83be31d1f775359a4611e24470a9dd15473258a8f0d193712834213af0fe06eab000766f70ce27b0a0649f9ce82bfda9f0a7aab3c522f5c786b28cf6f9e992e312ec8e57d9f265cea609900deca667363ec6152370d7b255939dfe224ba0a747c16e7d1299276aede9d8c47b3048cb34725630061c35eb15a97ed2236571db1639d0e73159d8e8b7660084848c7f4dde1d32da75f85abf5feb605d8e7736a1161b4204131b1ac9883bf08c24849a3905e23cc4fd77dbff457e1682d03ac42fe730ed6b00715e37b0e6a38aa9971bbd29796c55528f48bdfa8e5d33660d8e2ac4cffc55ba52bc9fbd9a44c680c2fedac0ded3c95773d8af55bdbf91e1888edf3f39254aadce23da373e6373047ffaf306229e95425a25a4308d7cca1920d41cfbd71640d189c597c5000d7b6af8fbee0c8e9f9db6972606cb9f5869894b32def22b8cc57c12f8a10f764f1da8ae474265c56f072451165245ec079d83b62b136d5309794b89503ef5ff24f8e2cd07293ea0be9963b1faa6dcc5153a531e231308863a6a68ac490918246eb9a0c1b732b4ec0c80e582e4b26ba212c3e292595b41e1a53e965e3bc2a5dee8e02f2fd94a622319ca7240000d", "6353535351ac", 1, -169274258, 0, "46e4b22703ac4fcd30f4c8b1ca9421abcf5e138d4e9c7821d2224bb87a7e401b"], - ["2e5dde7104c2637fb07aa70b5973d1900d999d824792e421216163c6a8fceb3189e0431e0b000000000951515300ac65526563a6a5086e32a588ba7c5ce4fe409d55b062d50fc31e1b427f49b05a41566e5767af9f4fdb03000000020063ffffffffeddf2c96669b24e0c129ef5858f71e9deea42794577affd1d8f8717fc08fff3b030000000851516a6352655363ffffffff312252aaa69a1543854d97e92fce7124f52d5ea59e8d7d0a9db211b9e5173398010000000452ac6563ffffffff0254f4d2040000000000199a620500000000025153abb3c9e4020000000000000000e0dd9d0400000000b734aad0b6571648fc3c8c26ea9cc52722561a1bf19b589c37befa5f249acdef192431f7865dd8d783564a05e733e7ce9377156e42d9488b0c3e7b32adaaf53334e1b15a25e1b98110e7d21f558d8048c5e224bfc698328e1dc8c3322f8a9ab9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002dc0fc1f574a9104434c40d0d823c072fd1fe942f7a6529bfc5f949464cb4e0ebd2956ab4e3e8e5447f93b9f5c3cee7c9b2155796447d9f89b15f2c2545f4facd6b45c6c9463fd240a00e0d85d2cc673b645dd8f41aba8a661f1b58381175bafa76d76ab55f3e5506c6189396d35007d723c4eb05e2f09ce2420cd60c49e2d940220d9da5fd96e84a6b188c0c0548be565debc5b88da2e0038f5d9d51db61ed9c40301c1b06a9fe0e77bb3a1509cf3a6c1d9aa54a0eb4c80908214fc5d7868f61e270b07792a834b6c7cb8ed87a7747f3562eac9060c82cd9fcb8c3cbb428d71b8f6cb6d0fd9144d1dee3255eca9111e93342d917b5b81d83b4f320c6c5f4df8fc6d600225555a3c53d02e8d4da03d1aecf7bc8275f6f5e5f013c5ebd3ee244ea4023d280315de399f916152724a4351b8a1695023a70f1d0c28afd6325eaa758a39edbee7022fb38f0b13da87537e21d54dc88f09464ed6d2fef56916b1fe9262e5e63713c8021cd4adc4dc198a6d1a7fc35e676222659d399c8d46b656dec90806dd834e54a303200751a0d6004708734ba086699d6d0e3cd3fd6b7555e8efb48a2fd17214ddb4eead36e09c0940db5a32cad3313dc0bb576a6d684276d5949bd475390ff4534dbb4e190b128a351bdc32f2387f165de2711ca8beceeaf8463647d1d05c43e2ccb072648c7c4dbb32b27b506b7fc8d916124208f685e91c992821b8b06528811a8ed8bf7911b34795e04e55bd3a036c6b54d8430888678692eac34252e37898f13fcc41765186126ef328516190dada7ff87d3f2b687202cdd2a5199360e820ab666cb99f132935548ff1aaf0430c9dbc46a688d1166e4f4601779d634d777dd746842540e26f4b839bff893f2e64abae11ab6318a42d00ac966e138190ce33a46e977d58834cc8e8436e1ebf847453b40c3fc98fa14f9f2121ac340803cfc78a11a27d31bbf631481f711d68f26de7bc1b36b53474f1fde39a670a04e005e87fad709b0119afd8a507371172794ed88184dae39239c83d267c7a3b17ccce15827edb5a4fa231c8802daefc233d47179203611b7f4daf8997d7fa4db2bc338675c52a6c1b706b99c7ac024bc7d78d89cf1eb2fd118f1879a925f20761e7037fcf5760aab84c9700bfa639a131702f027a33a8fcb5c6d91c5e4521a79c6d996c56a6af058ecb2f1ef31ac81c6e18e118073012d4aedc6a21ae31f48e3e938383e0e017f7a91bc08047a34125c00a62970aae595e57eb8cd83dfdd2ccb604ed7769347c12f3d15253817cff90949793cdb5e8dc733b7601f9b139a738bf4acfcaf84f096ad845826572e791b491c521244cdd2521553ffdc6da2517e1fb0d61738517c4cdb8326164ff758be7842eaebc9f652bc8b74bac171e0a0ca665af47a8caf4f9d3e6ec44747a4720cfe9ff2a5d39260c1d59f6eade5403efe6b24e7e2534ada77517cb63a46f903d8275c8a40d39b67dbdb5324e5bf6d6fd46e3619ad006744bcb24f86c01331118e836e19a849717b87932d2652802ed98a3b64d544dc78a8a9ef895332610e953e11af5949a96ba0b7e5af9912273eb36022839ec585128254212fa0efb7717f5eb1ba73c1dc61e5704bc463da36e2e129020abb1812d9f8b0345de6a145099ea80d29856ab08bc5325f85d302e9cd270a4112e4abaf303a12d415c4bed570e440ce13f7580ce8d54e326fbb3fe597ee5ea6771d10930b31762e5dde5458241bcc6a880c908e23b25462f00f7855a5d8439d861f3f3150140b2d56ee1ecb5c78943f3104021c37919e8795fa01092d8e89c144e02a9f0d6e4ec991ee237b840a82b91c92746152bcf59d1fdfc76a6484a89d71d40520abea5fcb42b6beec7e85a1c8f46686a5f44fc8d12b2e9a10386a54da113cfc0f6df2e4a0c8c1c29178c563e05620222c5fcd56d21ee98623ada6bd8b94b6bf8e4a898c10c56d06e6e0f611e6623deadae8d04c54d1bfb1db539f27c55d69aa8aaf4b760e3f29b89e97e27afc192bbced610e79be11f25165fcb3e52032595ee6f0706452e89136037f3bf9c3223a5cde72d7923aa620e68b94d65697b027ab8c2ac0448e0b8f6b0c740a691ecaa1d03f818f546f35d8b63ac9f12c7909257df110c67c37aee50ce5d3723e9470be62de1aedffaa4d3e3fdcfbbea44a24bd1dac848d20feba9b6938dac219e1c60b737358281df0976ca4a15f3e11eff4352e35e5168f0b88b52960aeee10a544daec4f5c8cc634b8df61bf5c5d3c919fea0dbd96cfb6f326b087a1d5354185ace86d691bd180000000000000000777209020000000081358d278130665dfd8d57e6cb383468448f3f00534a16c7cd71d4cc734b6c53d54f1839637957f9e658ae41c8e4b70c28198aaaa534e00b7676f06bf4548f79af35d49ac5a9308af395096be373460930777e4d9a1e9c6b4d0279c64d9b509500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e32997f1ae5d6fa902fe5a766add8d15d2a024b82f642c62d748af5322401ffe7f33bdef067e21375370416b8614776d5cd2c4d0754f8cd0522c870cae3229143a550c312b959dc9e472f5182bf44dd23be5ab957e413ebbfbc14eae87a12c0f968f6698f71f09524db6708bad95b74526d479abc9ec490aae0545f99dc5dcf203154f8b6a0b1c22e1026af0198bfd0c100cb90665fa0ab3a857cd7417ff11ae2c030007ce95960602684f5c615ac507ebc582fc94e7aaf73dc6528ff594f53122370a054bc8ad1db52b7dcc604bd7fc20168486d5e2d87551e0d4064c0032749e0ccc274f2c6e47af21153bd70c794495a0de1a91e60d6edfb778a0295d669860a268021ce13bc8915221d435afa8797fa686a5b254ce1bb88f4665697af6dab40cf465021d1cb4ef2bb6fe7c28516a388c83269254a3edc891e4a37713afdbab32bfb3920318f25fad81b8277a8a8949e61f483c1abf910f87a6c40a07b2468918e3348d510317e73a3cd1494d786a66bede6fe81160bb4ff177361a89dc1146436afc827b68022d5d5e1bf814e7f249504661cc12fbbe8e25257d86f8ddaedfc9ab5301304cef15e4220a73df610956efbd7db776a71d341e309db2b865a88faf0e1b50c530b35f0c7570a73db686a423c4ad148d91177745fd91f95257a149183a7c2345a334d01c43a529658859a3eb2f98f95336d095ba336d79c049186ba44c4584aee4604102ca0df4669e9ebd8cdebce96efa86fb348334aae85c69cb8c1a487e66205f03997397254b6f193e7b040f8be569898ae313e49441914edc9442f19db721d99c0f5eaaa84f9b54c7d52d9836e2baf886905a84a5963bcb7b7be014bc61906ca8827e7d85a01759088c557e2b05fc2bfc07dd677fbdd814c6ac458040dabfda5bb790df3e2352ad63a4e89a3a6defe75c6122c8c143c61fbca2bf2aecaea694363efbee79e1519b8080844958b7a01ca0cf202202def79ed5789d3dc5415e0139118acdb89f4a8d28c5f7be916450ba160f2b44ef92124b2b25e00e1feaf14b81a88cead3f7425a37582539bf9bbcfa4d2849d1a972ecab5daf71ff8ef08e8cde823fcac8ea8fd57dd12f8cb911b614c0b25b045b18352e8dfe9fcf6cc346f0f0ecdfe5658fa2f0cdd513e2f4f052a646f3407457996af081f3d10a6789726b65d6841c94d23933f778f61e274e164419d25e6e973a9eebb409b07373148c21f42c54286504791c2e96cccc11d2938498718d4ebf3a503b9211f3bf47bfb2cfa57ab85733fa44107dafb4fcaf6ed8881a2a8e377e1b090faed8b01f8e40265966c70c268da1578ed4bfe00a2e41648322ac19c56241bca746468e9e6351bf81d45e73482d7c8cc6a1a8a2d71987c330a02a46226a8c6ac5c029ccc75854a0b32b68ef643d492e3fdfd6bfeed1466968ec9bd0e2e070470d6927082284ee6eebd4fa6857a67fe59ae11660b472d4a09578c8890e3565614ee1d1f09cd7fe4dfcaa26831feb662c082fc330ab55a7d3bcd63b318a06f502b27ee21bca0af7a5be180a0ba2192bd1599274d1176bb5885e43b9ebd6bc3aff174ff74dbd3cbd4511de49aa46b895e8dfffbc7ea1c4e7d4028022c1e3ad7d4e7f3496067b8359435bc9182556bd3dfcb2490e46c57589a142cc97d8adbc6081343fca020ae7fd9cc26b02b275a38ce89eec31fd9c4ac9aa9ab09a74ae655df9eb4a75dde6d67f6a72d8a6e997db648991bd1fef61541ad3ee7576f6755d6b64af17d8dab5812a2dfd70401a08e0bb1c3df5292dfb773c88a673c53b8791ac7433483439cc466d5ee9410d4be89ab2e2630b0b1f405e554e46b1a00f9476e74eecb427c5ee9115ced16e42838b53e8b888136a8b3f30cbff64569181ac7b44922ef79b7821919c3db3959099098d91829a346055e7eb1a666755707ea70738fa49e6f98061685471215da805416a74b1625e39c6554d7982bb13cdc62985d091c58963b4944149043e9c92965d62abc5df3969e16a6ea140c10c7359e4c7b66a3a728e53bab7ebd7bca568f6d65649870a9cc3af09ac4829f0031ffbfddcf4f91f5b1bcd3f9882419ee6fdc33b4fe927397e63f21cdccf214e8731575607d3221f9c6a5b8706ecbceb66ac2868531de922d9d869f1ceaa9867fa53f38a1764a3d6ee1a1bffbb7be7d74913f3612ae7c065b5baa49310ca886aa4a2bb4dc10b680226c87c4f530fe1651fddc354658b6d13ed8e12194cdaf1bca27f98a8e7ff9885f4e0c911b1ac087065a62a95a2bcb9812b4db7cf303e76084fa4800d4574ef210d54ba1b7ce475c555fabc8d987c48c944f37e057e9dfa941ffed311db01d8015deba255fb046f763f38b51dde088368a3a99a903ebd98781e31359c4bd1fbd526d707d10927efb7f975fab191764ce0e39b596f5de6171ff00c", "ac6a5152ac5265", 1, -957946193, 0, "df24a7b8e1bca2e2998cf05e1ff4def677c38c16554789368e39748718528117"], - ["871fb87d0360b7e9bba3197747a1467399c5a3c648883d5b121bd021643ecaea9204d2908202000000095253535251006a63ac14a77d09c40efdebd886fed5837af869197e0a9d450d593c33c528b4ae29bcc9dd2eceff02000000070051636363535316260e337ebea1b6be07fe3c8bfdb7356c3f265fa466f3a8249ecb0797631ea4d2836a090200000006ac656a005100ffffffff044c9d40010000000000d0976a010000000007535252636353519ddc3003000000000551536365516c7d1602000000000400656a00be5ff62b02000000000000000091e8530000000000936ccfc954e223b956f630b273d2b70a96159ddb0db2acedcc34f0a689398e8036637dd063ba0ccadf50bf132447b4cb790711a54de826aaf0161c66fe077e4e354b397c5c141510f97df80c1383dcff05c4fd95c6accc5129a3cd7c4a59762e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000843284f372de7a744ba05a74397907c93d893529b1386ff07c3402676573660e8b685e1e4e32a0e0c927e1a60a323615a826b8738200afdb88942be86748e092b4c72ae283a149ef5c502f95c3ceefc2feaedfcf059b2c9127463a6118f2bec6e8a8c8ce1af7fc1ace7546c9eaebf52f0ac9619317a9d5079be4d918cd7ac76503051b7e240e26438ca055071fe6c4e59305bce5302b520d85e365700f80a1130203068de9591d3e15b1ae1ad567ad1cfed866d1a00e62b2dc39ef0556c8cb540cc90b08bc8838042dcdf5483e868bad5154b8e6564311c11075db20295f9a1d26de4ca803e743bc2a01fca12595d0922c790eccbdd60bad507b07a138236f7ae8d3e40223ac067ff082615c719dc1898d3ef289269daa19501bcdf1cb6a09546026d02b0230423354e7091042b093d81cf899052c8f8b1b567dfecf117a1114fbd1dd59d4020d72d0e0556b6c60a7dfd4f0d394e8a82f6104574c274596ea3dfbb064532b45031b6a770f76e17d01710e3fa10b380bfa133be273f87065a2a271eb2fd63c6316032459e2ba35e809bc1df9899e9e9329b74a4a26636763b9eb634383eca1e2a65b349c07c28bd8a25d7f85419f6149d76297e7b8a47fa5900cefcd31dc43957c99d324a426d9eb6696a46aabcf26b95d5fe204be95bdc06ebf295c2cddab70b76b5dd30d0553eea4b57b692e0ae49869d4903f6bf146c26fa25699ecfcd18334800e11e1b7ccd9bfe7605f04d1187d7b61b79df042a53025c20cd7e234dde9045e4deed6e101750e6448d539c9610f800bae5a10d1ea1c92203754991b65a4c85a40d225e612414440f9079f7074779550f66835613036b579c449790b8a0f0feff78063ab932cd3da7f8aa2ff0526938fa986691c47898a73094f1b4c8b15200fe493d70800bad94f91364be96572f9dceb199e2edf6554e9f7b2a51f820fb84d8ba34a572d67a76054316b2014492c632936ddbc8af6930a401c00db33b5fd24cd12699ca7824f17752eec8686fd0aa6a2263e4e7ec5dcf2d2f9518bd751c2b142a732f210561af23289e1a69fb907324abe9c5096d8fb0f44c0fb7301cf1913f270015955ae240439b34ede7cfb4007c5e762e9e03a322cd94cdc8663960e2e60f46789c50de2df3227714d75798187f098f32e08d9456f57752120868a5621b76c30c8c830853d01e0eef29bedad1fef4dc5bbe0889f1b6ddaae68cf0002bb3cb26eccbe817d219d9c748a425ef5bf883deea4dfeb6541f37318ef3125249aaa036816a9b7a84a848cbe1329298ac1cc338abefc294a9a27b2a7dc281497d7e66064e95c5b11e5191d13118c2b25dd5e0ad7c14d661763454e22fd38ba4079a1fcf1d96fddebd8cd7645991c03903a7bac477c5d35d4e3c3ec3e2154efb7a3ab1b89de90a4c8ff63ae0c7e90ea8ff8e48a9b07256b58d1a0b69ea701f1a1e483fd9360ef5b15b5d397323767948fc56bc2f62b90997e5e52fc86e4a2456cd48fd69cf7b090ff6a37b7ab374f727a992aee16184d440e145f3684dd491a0a3cdff9faef3d6722afa5b2531f5620db7b9563ecb79c89eb3b88b055f9820b1e7529b34e1437eb1cb52fa9f2905342ed5684b1b305140431d009d5c23145eaf048e616f65991f907934f2a19d65e4eaba0428f0a99945bc1eaedd4825e103810728f30da09db839b23b807911c6eee31f2a2efd66c97c4e5cb811e0c472524fe0093eaf45abd1928be3045d64dd7d70e1e345564d4361be50803da12b469d15ec2ac51b46140841711b20e326ea287a813b75c9d22fba692663da6851ec193c455c7aba9e0e43dcd348156f9a14bdeeb71a05a93c5e3871ac6e0710b0cb57d3c3b23501ef315bfc7d6aecce59921515658a35089dd0541d5fe0f48a1449b8f336089e039684a38184edcc731134584e84cddc012a981acdc5de74e16e912a1d2a11453551ca9bfde16389098a8e9f5b311ad417eb439034944293bf5cb315b3bebba3eaafa9870e444d4fe5c56d552180543c192453258ca6e27cdb59670f8d77c97f11a9824eb2337e8988c9abbe05bfeed8c02e2371b3da90b1a509fb9d9c951ee25293d64e25ecd4a3297743808f6b1c1a6914c60bac444eff23621c8197fa8787060e126b13547c916c990fe167b7cc93f64dcfb5a460e1eebb34469fef7160c7309300e261519f82f675222acd80654a8db85fc3e0f4143d35d248c42549279fce3a7eab372ce28df12091ad065ff49a3e6f7857382719a3096db529c7a9b25e2610d04013b57fd1c2f0b6a64b1824b445b01da05000000000000000000000000f49f9678d2945793a2351a336a1023423c966ed87cb2c7e2d5a991672e0766baca0e8f7efdcb3665372e244d29b160e37e66e08a5df6f925cff94cf6068c49a438c85e036c2aa35b91132e31b74fa009b6324628fc362d1f2e786350b14390780000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077bf0af3050e5cc14eed877f0293e71a7e21bca5e624483b18391402ea0ff3567e457930efff7af05763ed6ed6eb25e9850444b2ba3a65df902d823a3a6354e5b40a43c6ffa5d169a143c972aa16379129442bcf75da625365dee023b0b322f2f623b7cd153001c8e9a15c2b534dcb66f67489318a9999542b91d453e14a184d0225862cedc33f371ca751d1d43ecaff6be58a8ebcbf4770793861e81b0269cd9002104efdf8b5ef84c4c8a9c49b57ee4ad5f5ee2c1e34186f024f372c7a36ad28570b0189f2a874dc7d2aea0f445f7770f97cc92c078cab92762154e783bd380f3ad9fefdf1bdd12e76e5b237e9dc82f7a7919acb59e84c85595f67f7758dc98616a1021435792c8fc9eb2b9ca1df83b875ac0cbbfe29b4f52a766c05639c0f210b8ad1031d1d76b6fdc6b456d2f2371e728c8ed4fd08e058a7c9dad798281e751773ef6b022143c7023dd4e0f3298e5ad0933b9549069a547113f9ff7b77761ea22188eb5d0219762b39f95fd3b841c33163e29e6064b3d98f35f76dd33fc4f879d7d76d969b0308884cdaa18e8c0d9d6fc5e67739807faf6dc382c4ed6da20c952b15e35d215c0d7d8b8f99793a400ab3e3d2ddcf6e042c871f88e7fc59a31315ae836b6448ed421fae77a5431116e33a87195f66faa784ef75032783d34da8eb482278d74ddade7c458504255fbd76c4624b064f09b1815ba3e8de67be362bcb5a1383e70ff063623728b5a9d979f5b734ba453d56e26bc718848ba92fa481719c23c926085f247ea46df0f4a83a2592c77490f6b07b51e5a2abba236a0d205310e7b6cebf8c39d96997255f27154ae58b09413a2624c07780b2b1ebdfa34785828d06d95113b3c8b0fa6d5a64e4a89ffe35276f8511ae2d704da60f9e0a12cbde231f21ebf91a1fb837580a4dc2bb0946a86af6577d30e5f0960b18dbf18a8765ae0bd9b54a8d3a4615f24c379a1ca1e04e21a4707e51ed355eb386c72e4a113665c030aa5a5c6d2e69cc84b92eda62014adb793b61bd167f67bbb46b3ca5b71cda3dac10d75e1a92d0879b5e94aaf47a0369ae6d09cde23d08f8fdd8927e2f14f04e872c98a349a452d26860aa9d286913854c463d49f2ffe370a9ac87c49b34a4f11646f30dff82e95863077578d769f222c0879d7a5b4b44d9beb8442320a4a8d7f4c0cb1bec5a794d0e83ac4bf33870f015b1af9440c21ecadbdc8ec01b111d7f5fe2cc11cb08652d9deaf94cbdb05cdb10893d14416062d1a6e43ae7751e979983c7d898ce451678f485b1526e0ca2d7cd26047e0e8619e9a142625451e2eb10553959e891e307793c7196fab86eaaed91acd16a3de14296c3de0de0111ad6b46b683dbb735257c99d0558c16b706825628f8e4a015336141e55f3a0a3204e64c8caba4c3827267fdf52d667c0e5f4622ed5fb78a5c0b28775a91687da87ee816dcd6284b0c856ce155cf0db7c73812217cc160af47a0fd3bbf6d6717b3314f77b0472793abc2f0448a5e4fb9eb6847caa18bc777b731702303ddba2b42c6b090cdbbd9d6451c8763ff71bf9a56d8925425615e0c6c6bd613b066e8669f4342c8c6104bc5319c8b1078d15c498a83b0ba2afd67cac6d177acb5dc8a9a63b775c9e0ed794ce537d426981196b29d26781a90b6594c6c895f235e1c849f6ad690cfce8473bd3564f1a3df2750b01d8d63ea799abb47bd523b6bb02d93ef8f80c91d90d7f25866247765cda486b9bff3728652f6f7b4b11219bf12e6f9f1065547e7b8ba79e95c78ce183d5cf56241b5a11e3ba9e9d85f5b81be9dd8755b86f4932c72e6d49d32b49f39ed0cc9ccce1bd1d42e3dd1fb06332d5aa8508fcb60002db56545551dee1c0e5a6259ea57ca52d84af32b68841827a9294e709eee79051699de4c917acfde0cfab515d1d431b645bb7e9555c43da405ef53dd0782f1ee13954f69cd182599de3c355c3555c2d27cc0ead27f2f8e935b5753e68d2f44dbc5281c245727aa7a26cf2ec99981a3111dd7706fa1b2c571627d58ceb06d4f9a3459e8e803e02897db85efab3007ff19a9f6a3fd5359cf54d29f0bcfbe2b73d141277500a02d918c29f915ebb48df98c438ef107d5229e2f6c63ba196401faabe81204e16caf960663655bf1ce115de7ac7d994ff79ed1ccc68acad5a010fe5bdbc293ea7b6d4cb0223b99ddc29a6eda83cc2701e7c9faf131205456d319fac47d03325672e3e678a680fbe496120c34f9ab594ab373d37b07245c21ef37a07bf7b065cd2b27aa33fb72378a1dc760df92d787a30f543118738b449a73f5f1e47100f1ff0a1abf85f47fcfae08ef255f4879e09f52123fa8a453b7d6ecc459e41b1f30a794bf1f35f273bd0362bcb4002a7a778686bf96412ed2ad2b2581c1d9fe9350f729ea34bbbda361e9245bbbe5d6e9d2082580a", "", 2, 563851874, 1537743641, "95b9641dd2d93e6ce95e50191fccf29679fe82fdf85a99eb41354bf59f16182d"], - ["024bb929022e5a9660d7e70d1ee2057c8f606f0ea30d64ec3098764e94d4bbbcffa85303cf0300000008516a535253526552ffffffff23aee489848520ad742ef082c3b13ccef6fc0531017e1ae32111b73d45601d3a00000000086a52526553526552ffffffff011f9ea90100000000030053639d070dd10117bb48000000000000000000000000003f7c59f37b7b4672d52c2db341a5fa755bc896616c896016666335ed9c37fae152587b4bbc42a03329032c688dbe6178d5d03d4b59ad9b4e1279327ce33a7f6b408ce1e5bae1c9cbd334e076478a1885c7d51f05c121d1990344bf71dd6368d90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000078ff9a3db5c389ab62d188e50f6b769eaa90fd8f5a7385e0959fb4b05d92402f71bb3fcfb5f23fdfb23052b00f7d333f71b98bda951a0fef530190413566fdd3832795d604e7ae355b0284a31cbac2a0c1e7d91ba0085fc9ca12be29fe953f9483a497e2fd4ab1d100a1940c998b444fadcaa1ac3ee0eb2dd0b82c50a0abfa1b020e973cceb3952719885aab45080dadd389b3f4e38ec97e295c07b2da5d2dec78022be1fdf82c7f487cd0354dc04c7cb2da78ebcf55c6e4990f03a3d9f8fea028580a067b246aa7835c33ecdf199b2c2013befa03507665000fdb86f6c3444a70987ba60b481aa45b23696609ec920d0b9547bacf5e6540ac7b6d72907ab6a21168a6032dc1181736157eebbfb1cbb6f1649ab015b3df7e8fc696aa0f99a9b71ac206cc020be34c2fe734086dc87db8985a02882d8626e8210b609207b3fcd2c5a2fda2a003119832c172b6473dbe9eaf275275c4c7e1ddcd42b9ba7fb1834e67ad23ab14d803160cbd48cb5d5c025efb31f238cf675c8e0478c8eabb2601ef1b6ef28edfb29703127f209c97b9e40ca1029adf91975048fca138e803f9ba21a0bc8b281fe2cd8110cfa66576a92328e904cf1bfd9608dca43083f03b00a73158b1003dc0bf14909cef25fbde11a494c0a79019f6aea141ead7ce32f9bcce2cc38dddf118893651d7918f694084b1ca9c01b5d89679331435662b5f0bf365e9a63297c422b1be101bcbffebdb95ff12b9070d3b460e98f7b912f73797121f0daa327b7c71f2dcae5951707a3ddebaa7b6b7e70a7074d2c0b938ae4fcbba1c94f4b6a887b3bce920eeda49436b168219044c01f7cac3a3bffa642bcb1a989cad474a342e18795355889151ae42e4eef39e9c57ea7fca5568b5eedff965d99efb91c57b3dbc5e1ec02442b51992d130b0d4e51b227d5a420c288e27ca10396d55aa3a7adde9929904f618b5ad686264d042642e964b829e23006de6dd2af04c78907c278d98291b934f00c63e00b15c2b29a50e5d6490b3b345d1d3d835b33bad9f32fd9d86f4bf9e630bbfc470cb847a55bfccb2acfe81c45975b27e77c18392bcf5f098ae560ee0f4493bbcdb330d67382ec0ec6c02220100cdd2d6f05d6525e2ab7ab5351cd3640589defc685e730894712811e3b407afe981aff882ee61ea220c823a899196eae9f94d17f4d66c008a9ad502d6740eeee9c05040fd88d55a87d6ed072105068253ed475a05cf4a8efd7e0d1afc10d5b9253bac58112cba6524e892afb4b1d382b85fa62d06803c9c868d8e8cd78a9fabf8a22755fd0b6cc3832702cb1fdb687ed7b304277a9cd3abc156cf5c0e283c33c3042f8483da8a07f189a97fb3eecc45d4c529f7b9dd93d9798251983ea02f22450cc7e54e5fb533a269c7b034cfdd33b9d0dd304d617fe1943d0c06867422fee4a5404295701f5b133022a2a838b1b363102d91139563e42b5bddb43789a483aa64bbfaac7ba54464f99ba7c18bfad7c35b5bf9b310e548ba09074c2d60c608690fb946059298afa689dbd639e51075011bf70bc70b4b70564187b483c8bb7e06475d121dec8d66d4efd4f0973b6e767d87e9e6173f43650a62d8288846eb4616ea84d0b0f44023385276afcc9ecb3ad26107313796c5b5f6278bc5b9ac83d1dc59878e9086c7bac6231647de061b8e6679c7446490d7275ae282c9268d3e9c2df39048678631436afcc52c6a1195fb9991645db5fa65d8e4ada2b083835e5aa28567ca5fbe4a5f4968d106ea5b876e4295e73bc6bae62f681587bac97883ee01385637d9b21dbc1b5ae9d98535d5216b4b769e7f68cd630db018b23c63f6514cc8550782d51fdfd5c0cddd19f35758dc090590934b9d57596fd6995844974daa6616743f7d011f72c7133997a16c0bc052065b36e3d84b1ff473ed0488dccde4147e7b10aa6978d2af50d13c016fa660988ab36b8383ebfd5775b1a58156598c9c6d0a39f5513069c88540c21715c01ed057698200294b6eee0f1707c7462d6d8ae92e45de0b6fd0d47d0b1ca42df1182b42e043914ebbffd26b6200c691fea392ee38467fc4f11dd833f460829bceb5bc2e96c1ca49bbf4490e2f981f23e2ee05c5f9dd6b41c286de00a68359e88361b8c09cd4c4936f477b9f9561f56ea1652958f889dae2de73cbc5f2e2661b017495547c4c7b17566495f29582fec238056788d7bacb74b66fb32845c1b3df3ac2fb0ee3c0414485b648e95a6cf67c839d2fcfd1ab5a151e7657e88d4fdfe14c6bec736fa34d9acf200a2f71569112418c0a40ffa88e0fe88a992ca606eed4fe8cec94cccbca54703274f2753bee0944d875e604df3363cb40ebf7d741b6c201d3f0ca7d81afd3d9b205e1493989287e1bacc35aa18d2b5b12433eedc54faaf539cbc71bec6a6c260dad8a157d06f4a27f01", "ac656565", 1, 276226642, 0, "589e57bcb809d169d480aa2f8f42e62da549d80a983a4fb87a9a7edbe96c1910"], - ["030000807082c40304f7f87622fe5d199bbe989786e5cde59dac9a05dea9cd791ec98418f7890d4cd0000000000863ac535153ac5351ffffffff1354cd3784e22bacf1202627f765c54d7ed4e18f0d1b71c4388804c333a2421003000000095353006a6aac5163658a3f2edb1c1df6f660ba6406b2e99fff45a0d015e5189b67eee3fb96700d5da1b07d28d3010000000151dd405aa0e6623308691cb42536917da6f04cca9922d600cfd4a7471e81965830b94937680200000009516552516551655252ffffffff0158a0d20000000000000000000000000000020999620400000000000000000000000035194ccfe001261f3a122d231f87c7c4ca57edf89179a0e6972575441e95b41713f3aa8ec9044d708282ce98cac7b88b6e1dae81f343a6098f24eb215c96471320f189245bf45d6fd2913a48f351aa6a7d028ac358a8ec3636e2ec8b3dfd3a37000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003985814f4b1344aef0765f8fdd15acbb60632e16e1186d2fca558dd2c81b17b99913af75b7c814a147216284eb32d9388f2e0461a0d084bf7632fa0f44a6a73a876328510d6ed27e5ba0b0180f70b5fc6049a42dd1262c159d55e93343dff398e62f33d4ae4ea9b763022c993dfa8055cfdd253067201be95de6d8afe10946a002016f18e4b9e360c0b36836f8522c0b53bf029fd213360a1cfc3557e2dbd915d8031cfa87f8b726121ea057e14287f26c728124ebc72b00cbbe98fc1f1b4b0b7d130b01f2367a9bc3a6b7ed197ac36dab37a70ec18e240d63e65c62f47839f5139539bd05a016e0bffe7ae5c6b7915cd7bdd9ba31e1f034a6090dbbac5055b3faaa25031a0417d0a12ff4256a769d99abff27d63962e7294d78ceb00781c2898893e6a0022ba88fb60b4cfbf036ab006218d749f770c7872ef4efe5151aab71671bacfba9021b9d97907b99b28d477af088fb7569a42c2ef6926a18224bbfab39a6d54ea5b9030d5c53428e7ff2b3787cb9a0f4f389a1599e807b443f058de23195918aec2003030cd6930841424def6aa8feb967af717fcffa64c2bc675b2841c0cd73fbae8fec7d054834e60da64cb861165fbb395b53bdf5e9701d82b73231cb64eff1232b6125c5d7ba994ba8fd4318c0f1e8d53a5e54dbaebab221f6c70c4995a9fce419f540829c8e1bd1beaa7ef8d1b15e5fe0a11fb7fd1a98af74945d474728d6cb0a7bb2bfed79414c05c3b85985e6c3e1672fc0b685fd4ebcde642c376a72e31e333d5d554ff8bb6501a100a06c9dfc0111b0202fc9780d09c3cf49f242faefa9aa5bba962be317489f159c134fb1c1a44a8a0eced4f6d5ddd9ace78fe8c2e4424c54f4156e553224ffc0fa9b2f35ebc2154975df708f5867599cd4eae3a5fd20d83d5509d4ab2e9a3f70f782b139c3c52546bbe508da9c0e1299a3efcb763b75bb421b8c8ade4172aebcb96dc5573f754ad654cb85a65a502dd9b9adc96ca0968629a2e59dcb926dd58ba18f4f4e75c8cd73e891006ffb5fc82e5b484267171cb43886c4e3081b3d4a48e1c4784ca5cf0140a1f2f53ae95a08e04eaf9005edae9439fa88bc421600b84528db9cd764ba4ed48904d438ab409e0e1ee3b62c9378c2e8fbe8416760e8b5c3cdbdecef61c5e5e2e0a6efd6b232202751230057cbd1e22887a1f927de9472cf18f22b3469a14483321440099388d0b56b1ca1fdb21be5aa6d6e6e614fcd1122adea4e938fa22e6c3611a08fe7ef4cc8cdfc7cae68ee8aa2f07c58fa20962a2760fc7a22084af6852d099a11b4167adfc95d9104b179e8305d28d6da5b44041f4f53643787730ef2f9140e79a62c16c0ab570916c5a27d4402a36ece9eacf31885da6219a903e536590d3c8560628cbce0e4fd136744d04eb49be0478abbfa494802e9cfcf54d02edd2ec3552d332cebd14eb4dd7043bbc84a5a66cdd689550e736695a4dd2a718e937526759ad3a830c4b708d375ad241d72ca8ad2a8969d1980577287f22882faf7ffb7c27887513686be1f8c4acad3652570ee862b7a22d806f6e4380a26499ec9f9ab4039265687a455d5a55a41da8470433e6063505527c8dd2afbd0bdc23ae7d83f57aa91d872371b92f8afadf6637538ac352d0370de8dbe5c923587b9aaa25d8302c58f98b13247c66fd4cb5cac62a5256e613b3d4c79964cad5b26159e6e5c38fc7bee15ec5f117a69f4c900a055aef76794b692a0b27cc696a83ece7ec38ea2549a8c9c8c1d570d39a26f2f3aebee7c2149174049497a992807fdab3c36dc519322e2d25e3125f94f6b42d47eef8e018d4f642a0b3db8af8c0497a96c0895bbb37d2324c6a33d5cfa817d4a944a6a7050b75c88889c7c7b119ac33d2fc05aad6532880228a8d30ac2f289e170d24dcc6a0b5ef9bf0e42c1ffbae72aefbdfcd8c7b83129f32c23dcaf300f307f31b2f3a35d2684d06b6c54c7f7ef219c45a6550abfb78f09b50b8f1fd869e334ea4613e682de61ef4dca22843cdd20a8b618bcecbc322cece018dcd1ac31b04d93c0c35463eff526c7a5ee5dec56a439a4db2971f2a12d5393861f2123b883b8e57c59b11b194f4b3b2baa7ec2fd20b7b6553375770ca2a07ebbe27776530b5b56a1a3d7fec6140cc76fc22e9b318b73471119964575f0eb5cbc1b10271accefbed27e61a11c6556b1aa9400f50f4ba85e6dee479154b23a07aac80a436e1e4c96041299085882b62e4aded479895f1f29ace47b33a79fbbbcbd5debf7ebeb6e35e2936472f1e5afe59dbde4fad84f8d8d9da32e28040000000000000000000000009b547909fde07373f6ba763dbcbd94c84f1c0c30985d1924d109062bf5b90e966648dd42221ce112dd36191112f4bde153f09764b8129f75a893fedf55423cc97c1ad1ea9a9c56a7a29e12883f19f2a08277a7b135eb0acf4f35f1dd8a663ca9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008abda8bd150db0753698911b36e6f09bb54cf545f7bcce6b5f2102d081e0571e46f67e81abc45a04672c8f210aac6042e197ffa5f5258a48dc17ef393b207654f0e373f146bb83acadc640a4f7b4a1e242a5b31ef6c11c901e9ef41caaf320f43a5370f2e43a4e09ad5609339ccaf1aaa0ab832edea227d672c8824f2a33fd270311d0407aee1d26cb64f4290761ad4a1de8d69dbf48200d90d336aa22f4bdabba0326eb2703a61634a7aa6e8783ac17a12ba6b79d4971d81f3b6e797cc21f419c320a0460695c45d5d172883460c45ce1b8728a66e843b7712173a6aa795e02a5543e2c4067f3034418c4a806e0a91cfcec4923979a7e62463fec2059cc5705365c7102220f0d5e3130f671db702ae666c89c76111133700b61a758fbd229005cb8e483021a58502069d9d841288ae5353a7f72884f8297cdfc67438d1156c4efa0b5274703210421bb9a05e7d2678ddf5f8c1728ddcbd43cad23dcee0e4f5860f85d2a1f44022a1d3f0169b86fbc4febe37944501f2fff8d35abed59182713dd272b721ff042030fc937c1f2b86387543eafd47e927377f8c322dcc7cfec0f683e68f73ef2f5bfa54e80bca2d6928c71d1ce0370193f7e2f0b5ade24ad3c6f2bff2c73d2a832043ed8fd9154c0a95793781ad999413a58d0ad7b2d4aa7b699f7bde4a21e4f7c7ded24823515c2b63df7b7c93e5b72a1ce092a5d367f87222372e5117f26f94c01d2feeb395c3fb945d3fe9e3fa7cf5a712f7294a9af89a6ba9810bdaf6106515d0fe4bd3761d97bff83015ecbd8431064e572399d120a9f6d6f69d156b6b0be4c573ea6b18f096d85043b0b83f05722a934d13b6a7a59c151bad43166d388ebc347f3825c2757fac6513d781c22a773b63ff6cf1b94769f386cf45fcb359966c4721e1bad4daece1134331c8e90a86fdb7e523fd56da2de16b9b08757d2ec254508ae4b34f622d539ec0b802aa26e1cd1e4036ceeba522ad2262e08b5f997fab6e4d0d16cf505d18dad6d39a990f02d1df0f5525197658fda15052947ff4b1cff0eec94c531feb2b678d1ac01911cd1e402a6fa20781e1c640b54c04fc152df17d74d010571bed159ab78555225049bc9a326d6bd44d0e117df1cfec0fc6dd17cf96f220774e2dcaa395611cdc57d27b114515f15cb12809af6c82bc82083980cd0bfca6781ad15b6c618b61af5fe330c4d3529b999267ea328790f04cb35c90930ecb08026d8d68c4420d8138980f343af2858ba07fdb656bcdca94c4897e17eda3521f2475c09bf4aba13265f2e33ea54960ae343519799b48313655baf1b8bd1ca36a2ef5bd7e847b367328a8de6f0688af89f57ce96eaaee2ebeaaac37a3704da24353731a90c9dbd8e905605217edf47e0c624397b3d11c763d1ff06f86186c2828480358f23ac912d5620412896766b0bd99344afdc32d1f90c1fa1e910cd2c7aec03312b8223fc627a276e4ad18feaf21e78016223261e011a8228a6913fe45fc083b5ab5acc17015a20987ec500e597e206d1ce0dfb067025c1477b348c0db59128af4f7412efece6868dbab3fbe67178578da380c0fa1c3465f13fca956b39f15dd7c16faf18d61109e397925653d74c66840093c16ab497cfe4c5cbd2fa34f94d00371b7f85292eb061ff21a6a91c57a5bd9176d4a6db996eb77ab1371038734072a1dc68a2131bd2feee679de7c7720d2e3e68363b1200d6c69ce9103e770ee6735fbfe24c93ca3fdc10b825bec3b1bf955d0976aceabd334217d4ca8755c7b45b8a26af3e74ecd8fdf387fe6a745b499d07cc41af0bcb736f1eb1743a71b68b28b3b1ed37000b622b9b3dfbf32ccecbc703ce6d9ba8e43d1bf14a500e3a3395181d4e758b7a6e07aa52beb64a548669428be383540aa792fcf3bad56f5593aa480f95c1f0f1e3d00453b384b353789ff8768b86cf416ef86921f067d6d16cca2ad9d39c352520184aab11173e415374f54aee5adaee6a29998acac41a4c0b288b32dd93d3ba4e9923895131845417d8006e1526845a021854b4a325460b90c924169a052c676a0511ff6d1b9d0c8bd0271dce599d4a1d8c2566b45879d4145fce5f2f49858d19c86aaee93d3528a7b1efbe86656ca67a5374c56a0aae65ff4ec8b4708a565b8dca9e120d9c97d16434fd43ea46fd5b6177d0dbd10293d3e8ee5bce6228c3b15d2f0b7ee3aa417dd43d04efab30ac7da847721433172b84371acd8026e01c533e07da04c1f29d28dfbd31d4399b8cc4dde918977f310626562384dc02a018380bbb7eeac0d694e05d3ebeb1b449dee959a783f728c752a47ae2b83ff7b8edad2f684be8044d61e3f224b1ad196ec88882de377fb8bc95c644f61b6c29382062d5715ddf7a5d68527608e5c253e005f0e34afbb8519ddcaa47416e37e8459b2acf012061cfd000", "656a51", 2, -1281801593, 1537743641, "e5c7822abe17ee78435a86b7a64a0f5dc999dab4fc26271e5b5f3c0a0e2563a6"], - ["030000807082c40302e423b5ea8d73b9670312eb5d8b427718bfeea64aa22fbe5a41eddc6ae9f77dec0100000003526a63f5c0a5d6e4cb45e41d5dc88c63d145b846c7087cd17e0e7e1b861b03a93e16a4751d2d63030000000265512505aeed036b4f920500000000080052516363005353c680e701000000000265accf2fa0000000000005ac6aac63536be9b1519600a7ca00", "", 1, -1729389779, 1537743641, "d3d3a99133f131d490b21dc1083d5e7f8b176cc6fc14c2f9368bb38ffdc404d8"], - ["030000807082c4030371497f25d177bca86f47010dddf5cf7f02b2328f2d5d40a7a9c6ee7acfe529a203000000055365acac51ffffffff471c5a04e2a026bcae6b19d684686534832ed5d52efbb07128969318d688dabb00000000030052acffffffff6e5c9ac223bf23d8eeb51767c52332935c6d88f07e749f260d91aa42c7ecc9f5020000000553630053528aaa48f002dc33c801000000000651636353ac6332bf2701000000000253ac00000000f482201802000000000000000050a49603000000003a6bf1df3937afeb7e527ae7579effc202e0b96e781c4e4d3604f256903280f6b964a184cc7c44cab397fe0a80c1ae7d7068fe388523948ec1d6531ca400b453c03e91dca19fba5099190e5fd15a08b32f8cfe0939258840ea513a160516f3ac0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063934331d9e53e7b5672ee465855d9162b94baef8b9452e2713fc111519a2f742029d5cf8b58077a6fd831bba48f13a1bc047a9488804d4013bfd008f0438ea8762ebbe86b19c632dd03b7274105bb519ee405657751bd6976eb2aa1460f69f4258163f2e6779dab43aaf8fc3d60afb2114913b2524d89b522085fbc09340055022cf72d623b212215148f3b8d6c831b330f2b1eac914258ab2b6327b9870c5abd0207daed9156e63005d1ec025f36ea2d59175da6af09c8b32350b0e94627e52fc80b02468011995eae2a4b1c131c8e4b1a9b481208292da0326d31ba43a2e479db98dc273b0503f9a6c7e19e24be677f130858e2194ee764f879b467a49e9521ef2b03233682eaccaf3d75597bd87c6d880966af15fdcb9c20a3f0c23a1cb4f44299c7030319cd802a83f3bafa25e54eacf2abd8bcd3abc9f6ff7a172dc1fdaa137406480212c8f1a85f5b150889180b4ef3a981676e820e3fa44b4e9af880fc742faa69d2020c308799e5a7af88e01b00c0bc15901eccaed7d6be06afcf48545d0b117009290317b29d472f1d8eb16207cdd78e573cf5b3e779d99b45a70fe31012e2883122c86132e982877344e31d5480578366e3a28acf1622d7236eeac4f2fc8d02754a20cd12eebe2083b4e09044fd52fe522f6a6d057957da5ce480d5fb5d9f5ef593b8264eda303924c043ebb0f86bbb3d06e23069c9a23e8bf6fa786cabc2aebb2b284eb8f382bd5f8a24df0bc8e2fe06b9c9f514661d246f91b73370096688de0aa2b2c79a108894e3f24b704a4f154cbcd993ba87eb5cfcbca7fbf53f17d9333b8936235e875d33f1528e366470e3f02e99c7488876fd122356397a33f0a08f876f6a22a13a870f02b70c5e88d1476188654dbff3ba894767de858386bc701ecd7d3c3d7d12b8049a42252dabe80fcbc0de49257c528f6bf412bfee502e3574977be7a2ff3ad516a239937e93cdfa0816854024a4ddbc63779b47146854818096b4d4279ff831d0abe21faf87d0a87534317fffa95f351ffd6792b594cac36c980b88c01f7fedce1099865f4b1a7e20ebe0332cd63e3924d64b6210dee45d0630aab6a1ddf316007e2d83ef488ad62e413b78d277901a81e3b5f39518021913f6702de93c1fb5d26c332a46709f9020ea31a6aec207037e7db9323cc3b2e74606a562ff2525bb8344b6494feff6b572a7b85d895d1169a57f65ff066bcd23f47e8676aead9817277ad1745fc857a0863f0b603e5d329ab76b7bb92edf88288063f986c68684f6b2f3d391e7837d85639f7999cd66eeed7cb03d78f9169141b97a6582f6768630d56664e5c5ca48daa9d51c4e57359996c7745f265a8d325088318fd5ef70189f17d22c89c337250196bcd9372815b439375f005682c40bc462ff39dca4d572ec562336da9e7b422b691091a399d6acf0845d2fdddaf7d8c1991f60a498b01395110ba2472298f1c1df5c88b27150219225f5a4ef22e37a85af654ece7111c4906f485f86edb8d5d5cbbf794853a92be93cab4cbf465c1c454c18132b70ad0f910804c4af92ce284f31096f146451656c1530d5a1b38ec94b38a239d7c71e869589a48fbaed51f8dd724ecfeb85cf21d06a99cab6d5f6b24b3575cccb4ef7b231af09d0927f4e3ce56a7b74f2eccc95e0d674ef574ac1effb2687c8ee8bf87e498c8663dde892c366181193e8b6951c4ca182911753496b756104c90a01605cd238f703f63dc609d43f229b968587edbb2c9cb9f3363476968ef7d5a7af82cdda5c02f6432d2146b2cb4674c98abb3015caa16e6ee9f59899ac968088b0623bc9e58f9a3f7ef53c93335a618faa276fc34f7c633a8dc17b201530dc8e6213aa39b1d3a6bc077697b0301c4cf5100967ae2de0780d5e6d18ec701571faba9e6dc3f8b94841daa8adbb5802ac110a737631b25c305d1eab058faaff8aa8f548e6906c789a5f7946a4c3150fe2a84aa459e596eebaa899cb43eab7f4c9b065a4ce22209b09efc2b7805f82df02c593180e3439db8beb21273940a8c20d5defce077abe48cbdd27847ded30c7ef265c4002de0b22f59083ebd6f8b96a58c0aa26ae47fb6490d8cff9795346375a19ee736ed5ee94f10e559ae3dad8cfbfe68fe25d2c496b06a87e9d58e666a5e5727940954669f05ef2da0fe6af63dc5a5145da7e4bf85780f248557efa5f5e5356b1c40e59f4b996991780d6cb4a4519840de10c8e4f70379a6ecdb6f90262081ef577e48b973bb158b50b5b4ce0c48d3dcdcf52761773283c283ab565f23365d49a16fbef0500000000000000000000000081c0e0a685e9f52014e4416a11572e81d224a4740163acee3c4d6f94b12e6b45131b1e52def5fc5e0df5ff7da93a6840e21ba6db885d53b5c6226d2d46ffe8962f3e8d01863773d57eeacc34317b792587b9bb672fbdcf7a03e3b5478c22ccca0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038f400488e42ddb80a9c94f4010b20d6928faec6be15d08c64688521a5cb8b5b7969530f18ffb7f25f85c7ceb12caeda714d1027aab8d012a779f34ab13b88561943219c6d2c62002b3a0616e1458ed0978f0baad856c017a29e8a0e4b5149c229894c50e1e88bb5aec32555c72656789c682af835b13d63030f36f2c83fb4a50201a545c15fb0c6728dee4b8a38d697e8405c77cad64ce044ff2bb3c1c7b192c5032947451e411d7b22ef1795b47968888c3399b3120a8c214406b27eba85ee1c320b0011e1c3c07674035c073bf7bf463b5750fee0e258e59010fec9f82fc1fee2a3a99e3c5657b1fe7c8b7d38aa1a3e46af6498503a914905575a14db9d139ab0aa0212333193f218259b1f53dadd3b5df1eb5fb3446864d7738317b537f7d03e166b0201334f79cd7a7c8f32698f3af290cde7b2df6bea090758cd3238aad53ca6a895022495b29e3ab70e6dea82dd2bef943d0e5d0ba5c3eb4a52319a5a4e7cbbf57121020d669f668a15f8604dbfedee0993aa5caa05e27b8616c2f94b4a2276d66278880213ecdb76af6aeb279be3389aa77847f87108df5f084c50b1f631987fa80fe1845542824167536e2e04cc49ad08a07965340bc5c660fe95f3627696b0fa161b6ba1cfd4f3674d30b0a152a94a7d89a7db1c4e556b6f508642dab9a7dffe3cb226f4e1077b2c2459faf663df8a224ecbee7fbb04d3fdea0d3d7196b888496827fa03ea8decee52759b9a6ddb416c87d6e2a6c38ce6628384448ff98475392ad069d9c60477427556876abc361d9ccfd906f2ac385111f448162c62600b76c75e11c1278812e40635a2e259541293fa402c179628c125983807de25716806e1f3c564f7651c6c1dddd78cfdb7b0d2f61f29cc74bae51abdf0bb920c5e7814c2a5ca92c70c014020c0a8143817670955af3d41e880ed2fbf96e0f1586647d0556e63068a77bb55aab597481ddcc557b5b2b7bbcebd5eb103ab7a48dcd8c8cbd7658e93f069033f889c7ad63a7872eee07c7d7e20b97a9fef4d68c9eb1f6b0fb2cc03a60b655439d237d8b8e46d6b97b35dd6e206a14ac6ba3efd2906a1dd1e906b15cd93875e316ab4ec4f89e11901412220d7ebf0b77335e91864f2d468894aadb4066443ffa5e4eac75bc9425c601980962b9f7c15f76914a4a24f24295c0da7d68ee2fd57325db1ef3fdfaa5565f69410f55748c2e6c5ef85e241b84558c4b60ea9821daf00ee0bf4707ded0ef137de327e2f08665ac2f88b4cd743d8b1be859b8ef0f328bf9f3dc307d7feeceb57397799e50af6faa3cd9d331b8937998221ccb3584332a40c02cdc8b87902d5251b31149c01076276cd481daf13915d260c42acb713d3df768bf6728eaab98debb12adfa3f3b33b78b9ec0986d6ca6554ce7d3f4f2c681764144ecc5c5d6ff20413da29b49d59f27ace29092a0788661646e68d339a9a268242a35bd7d5afda1aa32e78198e708dcdd6db0d8dc3ee8676dd0fd452b55452a75309f4a47b8bf81331f4f6b52da95a0ba157ec87de29c0facee454de3af9dbe764d4b42dff12cd396c4018fd370a2ece2ca7709038f697b4cc581c03333dc207ff2939021bd33b2b11a0dd4f613fa3de1b69bc139fae77f96597659c0443f8544bc95a2ef4bf40782a63501df5a43458c4c6c5ebbab2cd9409873b31ec9cb17d29eeb0124595f7a45e82774b17a908be0cea0ba8c3007e043e5f132beffe9f007c0ad4feff9554e2ee9a6745c3e75ee8a18218b42590db6b69a5666bd55abe6bf2b1442f7f041a526c1e89f86dc3afe6d9a081550a4c51f9b98242ec08ccf94a2ade2d3832253f52d76021432ad893e1a17ffedcceb161fa23a0db1aa8c103b066578667ee852b511ce57371c76771f4f63f8f093b64b7e87d2dae49123adaba12ab0b31b924103c8aad32ca81507f5e18b24457482609b7c481941296838dafc8bf9a3369923eef3baecb891c5650f1ca25e970bf241894dc7929d6a024a820effd44e7684c7e6b87bee4f44e6ea06269b851d96683f80c238a31cda038dfa8ae7a3a7d880562b5c9814acae935d46c1fdaf34ab0f543b8c7f8162a9b5d54c2cd7de023722047312c85a8dcaf30c7bcd86c9dfcab6ecebb69a0aee2d1b6a8d2d93e80d631bf184abf14e23c9211473a9e43fc2ae369a72619781b023bb612904632c179a9f210827d2e670b1c1b53f4484a7b070ffdc6662a0046c8b35de0fa097bfcdffe7ee29eb0cbec3c24354a872442c535e2f83444a4826e8dc34b220427172cb976734c1872209c000fbdce342afb50f3779f3c263b8e6f562b15a79a7360b15718876336bfdd36764fddd632ab9dcf12a2f153058b2256d69fbf3e77b367cd07efb36b2164e730eb397fef742573c40fdd09fdb1b244e5a9aa5104d7672cc8ad5257ac52133d9f07", "00636a65526a5153", 2, 1136457586, 1537743641, "e851b8f83609b3efb8d39cfd8fdd8f66777e5616b4721a98a10008ae2f80291d"], - ["030000807082c403033645f031ae559612a384505b4e87a9503fa5d03693c4841ade8ad1772dc102900200000006ac6563526553699c046741d9c6de16a5f37918b4cf7c8085cc9ec18fd0466425311abec20a282e5c513402000000076551acac63ac65ffffffff5c533b793f80958fe00aaeefa29437bb9c0fac512e00db707f9fe3dd5c0163c00100000004ac005352ffffffff01a5dfc7050000000006ac51ac0065000000000000000000030000000000000000d4f1f5030000000010c5125f6d480bb307b0f4a68570684b69c3757fbf0e0d75ef2e62371bd08520778271672712ac9a0de653a6394186b8f8bdf39ebb1bba99aba71fc2bc8a1c354b3e38ce841686a9d55b8f7f05bb4a2a6445a68703c6bb49cea3f7d7461ae58e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8f008d395b6d383e4cbef63e2a6e63e6b9a5e62c9a14584c08839abb3eab79f5721a7b49ca9e1bc83814aedc1f1ad558f2e06bc6d439cf24d702383d12993315aee4b5172477a38a50db7523e7b2ccd39a88a069648f7208c4bea9bd838892147ea70dc8254b0fb8a2cdf22a4809182be8bae901518b9a539b6c9f74425cb61031b4f891f3dcc71b1eb7b6cd757660ed7df9d9c6a1751746b2f2dd3e3acd9393c03088d329479bd68ce5adc97f5a6b9b2d4d21af67b9c7bb78d2c611d82bd00f4da0a06ba805fcd1cd2f1fd01124db7156dd6d16ff8fb0ee8d61762ce82cfd2788335de3cba0949207da9e121726ceb22905f6615ed324f82d5098589df109ef2ceee03120e973fe85da709be04b4f7cff30b2e90ab860f40e9b1705abd721ab007df83021b8e261b0a203b2270054a449c31a58b291b9b8d2c4c9304bcf92d371e7de8530303e740414a80015cce00869ff849ed769fccc9a55e9cfe1f1d36bd42935683de0229809b43f3627d0900be86cd0e9b5913d4b657d93bf9f342ad14982a4bdc4f420330496eabd3d0932d3c133670dc821abf8cdac439a1f1777925e115239a34cd7b9f112ef2f3a4ce2021c6cc318a078b060fca2079bc90ce78180f846895d389dc9e155b92a1d2518c493f55865b3d2a45d0ebe233100f802fb87794d334550f70f9e6dcfafb1c4b7a2a6b674b2e88b298b69aa895d9f72877fd65a1e3cb96ee2fa119ed5b44b7a7863b85fbad5f7378beef635812b9a1748de3258f1086752efed94f021417c6936283efd69e77b50334d71aaab4d4a2b134440da7eeb799377bcd8fcd465afd3a7a0445156d8ae3c2e3ccd3ad56e32b80d60be5ec393097381eff27eac186736899571ce4fdd1136ef0e469d5bed13029052ef3f7882f9b66cb8da27d594ca81e6b050ac9558dceede8bcf133ac10f9cb50460d82053f647cc170083b9047993c6f8a8649983fd49272cc4cf8f12acbd5dc94e21d25bcb3e3a1f93a580860835abc16b6de3013aac1accf881862b9c331417646568a0677d74eec746fe5e6e04729f6f8ce83a126c3b4a12b261da1eab2cc7e04451cb3faf6d278e263f2b12e56f2cdc736d5f746754729e7c806160532477b70b845ab718aca8207f1e8fc67fcaafeb0314c51c4a8b7b4e0c50ec4db214ac85f3dc5313b66bff3707320d35d2fdb0abde9b0c8aa0e65902dec638a4f92c510a5b5d36a73a915ea128866e651f289badd525f6db1f671f1bbc0a58eb1423b456932893283aab265c4e8d45be4118ffd8a7263359de2fc3fba5ed47a49f39f1f50a14e039541f79dfd1f986cbeeea04ea5f6c99cc1de762d312fddabe16b1a52447bc3f0f795beb57661cece9f10dc08c403280720b32d5113f726c99e697da886410a92afd488b7d86c81b69413d0aa614637a2cad6633f2274f8422fe1d5fb6dfe72028efd5d22f1c704473b0d4a6afde47bf814d60e60a0353cec8ded6d60b21544ababd2b6533294f1553bf76b630274033d3ebbc474a0c3d0eef88b3a02be4edaa8b9b75d477fecee194be0dee018f948c55bc5674577c46609b24df09eb58595e9cd5ab23d7b7c0573b2a80f38559dee95f082da1790cf5470d357273631034bf8643b768c8f5076f391a286d9897a24d17024d6551d60ebd41ca5686b5d91e18812b62c0f56940b29936f092dffb209306b596479d447a773182d4b686777760d3a01108bea5357f66ed8e45a39ab7c931780177c8d53c55c9b75da86bbce6cd3af2e9c6af39751bf0834e48bab2da7a99869f6db663c318baecc2592e7e089f82de5a3417067b68bbcebcbe51394505800fa8b2a6efa4249ed4ca6d3067ea9e102ac365a37110dd76be45c7932ff3588bba67460f18050d10765e827ad9873002b0c09c00564db6bf91ebf445e6c513ccd2329f01693f6324a9a55a2af30fb5a9feec5a12bdc4267d9f5b0ce70eac94b8305fe2e3b70f49e5b349b391d20150f4eabc723da1099c5d72ef50a1c4ff4eb9909b27033a2a7f6c1ebd4093577c73e56abb1731c91af7f242e360b95b7c92a66ddefe9a23aa7d80453a6d51fa2fd55be5ea7810908b5c2ededb17de7b65da0cf9255cdb026cea4db908258238d52e7965409342e4c2c59a856af06c1dd070a52089b78abaf241c02c2c98056c09abaf1e8e7685ce30a08c4cffda88105bb4ab1857a3b99123a9afb66c41034116b8a1e49d078288e11a6ebb9a25728845992e0a4746c75c86a3964caceab68dd37a902455dc2b18d79eca1daf7a7b6a13b80bc74b4fd21000000000000000063c8050400000000b366fda1f2400e22f9f3a8fc403f22b0fb40b0dbd95b05a11808f40e645751a280a4df035a73706847b5bc917e1ef02463cf8209688620d71c807b40271d9fcc74bffdcbfa7d24bb10fefdebc4b8a3eded248f1d1a61ab17eb9f6e8cc67a06720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034c06db689bdcd92bd2ba5af82c9812b3f4d8313c1d1d10a39d4e1432b3c0233226e24a512764ce6d6ae4df76e8ef88812a747b5cb657975b7ba6e48ceb34ab8d80443c1e134e1612b252ac0a33f3341134859e8b61ef2457f479f9bc91117e3c56bb0bde459d875653ad44aec969c5e7c0e15cffa37f6da94f04efe20cb81cf031da7c3b5ef4d4c260d5213c8d9dc7668f0f51a06ad9ad1e88bcaa73574f5c686032280b414b8d2713569710e3d5b9a2ea10a65fced8ab9d428f01296870bbd57e40b04f5f0c33459c35890c6d13e45e2269c63505281d7cc22b57f699e1c149acd6b3715bb19d4ccb05962d1a48296ff94c8899e4ab92b37bd92f751c955cd26b5f20202e43f3659ac7649c7d2a1b99cc6498e80285dc748c57410525d1a13cb0ccfcf030e914d80063afd994b48e23a3b24f6d3e73e5b08440683ee50defbd25dde95f80321317f3ee0b52324f974db54ad3df1879d6ff3b8fc2b63794236854f26fba19b0206675dcefc66658239d73ba343e0445da11cbc42916e1f7b891f5039f1c8034c032ce4400f322dc176acb9709241dd918b789e812006a2195c76badbbbd3b3c7e8c0234006c5f073746ceb34398483b98c4d5d80269eabfda4dfecc3f652ad161f8968362dda08bb946ec4a843c25890a9f2f4e2ce8d0d4becaa73c397b69f033a2cf33b2271e8a517e20bbbefce51ae9eb31307a04f695856750d0a35721b0ab2e5f668087b9b51d9b9d899d4a903e33f47c04980eb27927032bdf5ea7a513a234140501352812ec6f135d7f05c83cc790126e4a4429bb78851dd7c9ffad811ef6ba803e20ae2e281261c7714fba18b35c491952833e90c9ea6c8fb9b04cf1c2041086b91d6c934f87910e7660e441051561e4a68d97bd269e042e59267990691175873f5b254ddf2e05a5d71ea9caf9e272d45e6ab6100937ea00777d5b1e436e8ee9df07d48e59790f88574cc934b93441a89bcfb45689389f0b7917403364fa76e7edad4d80e35fb09a816b121f70e4414c8c5df7185f23baa4b5e4031cec3571e09ca83df66f625a686f1d69205049dc39191352f6763ad38c17dc1a4f1b908523fcf1db91630d541270a7e03f8c0f89ada996cda59658f198b1ccd465b363acf2295c78d975390905ab75bfeb4f1b129f78b2771102bfc6e184eea37c5b96095cb09fbfca48e4680780be89b19209622c4454febc79699c04bdc52940cc56d957b178145f45a33bb5e878e090266abeebd1d1dcef968a042bf5dbae4a1ab7f4c5a41e0d00240f5ab98241db26bede1172ccfdecea2b05bc1d09496439a17061dd6dbaeea88f1e3e3dcb50062615e3554f58d821605da30190bfa22a59bf2563dde9d67994c6f5a9c1341885c509185b8fb45cd0ecd1840fd7e4c3b74735461ef7b6887379644a5adf99c1e76e2c0542d0445da80c067cd85bc5fd55c7762c3870a0d5ba9032ef07be0248a83a9a7d1446afc54eb2d547ea7e5145b13bfd4ee24ca7cec3ad75b67e7776ae400859fb08ddb9d88a40e1587de5bc82c7c2d4cdf84b23265bd8f5ee4450c22044b1d42139cc8b47efe4ca91769146621402a478e85e5cbf0de833fad9fa9cb47ad1baedc842ad5dc1d78d69ca9e9792b980c251e19536f264adbfb6abe8183aa0ffad82d8452b0cb5318239b241f48c948e46aa54368d67e4daa925c1ab7ae056659ec534e0ba7a3e5d97ac36213d6cde5183c1cffdffa11ba893986d5501c0fd23fa9a79e42ad9b4dbdcf40cebf3a0eb4f1a39a8011776b5c3a3af31235a3f98fbc85af0908dcf35fbd23e5283f9f95b3a4c9f1a695429906d5846a664ba25de890c30ce5f9cc3c2a66d3379bea324a3b9b1107062e98999863246b9f858f8016bf7de1578da1f4227c812fcbf644c84efc18d11940243c651b0d4b3bf42e3a67247e567ea175c6bb75d2d111192566da166befaf0f47c50010a67e70f63f17a1de02a7a696907db29f5d535124cd1787c688e590d04b053b4c259457a1aecfc42cc74cd7631eba98659666824ad503fc54f0a3419108b506616af64872a8cd5c19e5a0513da49b3a37156629f30a16bcc46e772a02214f80dc157e0101178d6d3aac0634d1a0ae0d943d7c5532104399c636048fb471ddfa63943628e79c447992d052dc1846cd8a3e760c7f111e06713f3b08750f037d7fc66f7290f3b6b20f7982dd3a056edb1c36b08ff3da18762f6cd8171ea67460ddb27dd237d5a3cd2a3f957f6045eb0c73705f0e9256213c7406a931704801dfabdf2de638f65c13eed9a355f6e0ec5102000000000000000000000000bb3cd12681c659a56ff494f05221e48f7211219fb989811f5d59cc7c90fe443652abdd4155331d4eb23b033e34958feb4824e554b5e2957d836368145bf3d565e0c00b701861ba4e2acbcf953bcb0753559e6445cd362840597f9b054c17ce13000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008fcac08a00cb0805daf960405ff92a66b6757f1f27ac42e28c77af486cb726487cebc0727f704cabec42318d0d018c1ac39dc66a5bfadfaea77f230bc7d7947d20dbc387a2fcf9aa33d83c074ed7c845c1593217684f23348b915349fbe1f91874bcbac727145744928dbaf975848f13ef4a6693df6a85ae4bcc86252d792f22031999e6f5b4f26161ecea0c710bba0d3f18146f0aaa7215bda5f78bddc9929d090223de48bde9598c0079bfd95c7c288614439b71dabbcd73b3197059cd7b2f39590b050a48899c1951bdf2b9b3b47518973cdb99964508c6520d1a2ebd8ff5d31ec956823afb3d9ac3f3e8218abcae1ff163682f7a068edc74093ffc7e92a97aaa540307ae0ad5d3d2b304cd1f1e9dfbc4e3114962612c8a442d7d7c999130444fd731032d4d2186fda9128525a74890669c676518fad4d966efd62194bf22e5117a332903205e576c865b9590a9e5fa392b6713c52081f81122283c9916fea3b1683248f10210bf2a7fb467c20e2e66762efd10e2e7dc99775c8f823463e6f8270404aa3ef302239c1789b0604492a731ee9b0a6ef86466ed8cec75ea66a0f7bdc50ca5a1c1d42acc3bb2cc90426e9460ecaa52d5c3ca86f2d7ba231145c27b50b9e2841932b5543d3ee5665e41a4c09e35eb36bb01505934c23efd11e18254e500fbfe474dae2ceeb7621a7fe5ecdfdea0575cd33fd0899c9e0ec86475b984a7134e371d6a9c1f025cff523ee9fedbc694d3942d7a6d8b5a9f267ff8016df7414af35944eda56e3a5d116bba6cad3597064dee421199bc2d709eb6c21eb0545ecd9a48ff6bc8744796a38b47416f0d70de2a8a19c43e5c948e37c176affb6aaf670cd929f0b6aa41524e980f7a9d78a44020aae3a5d0db3e6cf5ffa46c1cc12c359d5df926d72c1f749f46ee0bd336dbf42a09a128b5a2f585b6ca6400049cf8912880c59164eb6e62be96d67dece38df2e17e3f4a91a7f591cc5d3b48a8f98105fddb13704c9e0a88dc0642c707436871d2d59503e6faf342fbe07234df55c2700a0bb6c437857ec110c5d55470cde35b8cdce90b4a6313021f571affd5de1c1ebbc3a8ee138f0b4690e9e3ad5a0fe7472884924fab4525d573a40a4a0b9ec3d48cad089e118fc8e7689ab2096ef3f9315dde8e3c02c2af1d42990f9e8d23f96fae825922af474d05440f2344f3149ff156a7ac697237ac15d6c66f5a4fd22efceeb2e5546c99d554a07d006e438e3743c31488d73a8eda9a35c2ee3dfc20939f13f791b525906e5fc34f24dcaa80bccb776688149db828c4b1891d08b227c36a3c4eaee79042b3255e55fa7947beb32f247be2386714f009f1d33f31e707558c24553095644185c833813aa944b23a3a72be4da9ebb9fa9e7faefdb553061356e9f2071b90f292d3c559b0c759a2b128144650e2ad019bd27500e7c85f4d72adf4e3f2dce6d9684d3805b5f8da4e13a70f0fa641fbda6b2a0037d4c9209feea3a7fd905ed80f44c0944383441786c91b4232d10fc5b286b6a79153f8704d2e83e63d58998bd0624a287d8be319cb9677ffa8414fc23203deda2616f1b19216e11a4e273ac5d1457fdb19333e5f56028fb0afa1746bb2e3bc88df2f9782ec19a083e796feb9d742db3bddcd9ef71dbf4452de9ab681fe76b61fbcf7bfee8a2e50efb04820f6fa6ec58add61351e0f3cc994976f5e3bf153f95f0d41973f031523e60d0793a9ab7d7be4dcd64096ebaf978b4ea87e404f471d09cd629c6248427de4ac68f921234ad5269a265fa8440ebcd9497d9d40978f11ecb65537c3fe77a2448855cd94015722e6305779d33f079f1b07067b7c453d75d6a4daa68aad3407094b66e77420aaddb62ee512fb7e6fb8da6bc4c919b4f5645a9465e3f0a3c4066ab75013326a626e833842b15318328997da47d6b6c3b7e39b0eae4a6b66e9a959d5644277a65b6424482cba36381e22fdb3b4ccb6a8019ec648bd9ae5a6fb651b6abca48b9c838ca31d58a12b45b8e6eabd5cbb59011eaa418130092da63839c104fa97bbe23b159a8ec5defb1b3c608ef1b7279ba73c6eaa090a739edf9b6e2ab9f68a9eb3f2a8a22ec6239acbdfb8bac21b374112038fb7ee02e8315b19abb347e5abeae664ecaf549d80007ada037765f6ba69dbd6658e09a899e29b9e54e7d507bfc8432681c7e2281179690847f970d4d1cadfb707dfea3a6a6786d2b8be54a0cca036c1457dcd0a9718dd6f06a62713d61d33a517368d6fbc8768aa09743f00a75ef98fed49bce7fed8b8c7d972873c6cb78fe1ddec489a765e6ab916ac755040355c1b2b338715fe3c4e6dbe8f97ad3bddce47fef0a9195208a4b6f0646c848a0ba4b694044314285e5bb8f8515e716de0b3dd1b17fc75aa7b1f7a1a5c0931bd0e9ead68080212b1be0e6b7bdbb059946c4105", "5365ac6a51acac", 0, -1950207824, 1537743641, "efbc3bc790d67f8b4cec2608f2ca37f76ee54057a4ba47719f189db685ae75c0"], - ["030000807082c40301dcf962a71c7d88ad15ea808b2c4e9208578b6c4c2528a32694b8b8e27d491e3c0200000008656552ac0052530012fcb45d0212280a04000000000952530052ac636aac53e073ec04000000000153961c93b00000000002000000000000000003b5880500000000cba8ddcb763cac79936842a3c6ec8ddfad026722ee88b27426f56f7f9c3e0a6a8f454c1ab014d5df00d09accfdf32ccff11ea02148b5338d8a80490382af3afc957bd4653ae1e8f85b408de6f00188f41660407dea616460347c7416fa5f905100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d8774aa1c550c935a2967d175f973e0813eae5fddf838f48d7771763007d1cdd7aa5a68816b1fffbfe29bd4b9808b22702503932897b3985244cff209d1d98b26fa13df9942feadfcadfefd3702007c84c1def78318cf63c1a5ac0b4c82d995f651fc5c229d063199d0694032a78247d41464926e6d430359ecc9a6312382c3702191cc7afc810b74673064d79175fe2c36ab20432c33b324ed6a961332771b2fd030fde078426d40ae8dff163f5f3ed8f7d80c6a298b60bb99936f11f4f3872b97b0b03066075e53a1c7dc1af6585dbb571269e6490623fa46909e645165bb093f9485e54ca8ade1925dd9bc22ecff1ada187482ba6b5358692d9ea64769975318a03030d1ad49faa1a0ec11cd095621991e865b5ce97f3722cf0e6f9c810e936a4b18f0213645d4d44b0734487f3e728adbcb163a5bdb814d2e980378fb9082954042122032b344209bca42832f71ffc62d164788089f2803b37f38475e988a7ee725937da0323e083f370858d4d9f354409c9260e245c6da5584e3f439d3f90776a346451f502168fd306aafd31bf4cbd8db601462cd46147005f097b5e3789f08386fb8a082666b69252d2341dbcfe38eb22174f375a0f4d8704c660dbd1b969e9bf93122ac48244c3f6bd1db9fea7fdd19053605aa86e1dc5306056757fcdafd71c0686121518677985de7c94f2dfa8b6c78f5b46f65e3c3c5c5942c2c75aad40f2176090c9452cdaeb5d1b8dea2365aa606375baf1a4956320f72f3012e1f9670f0160478fccfb722224b0070882f80738f44d639eba8ad36c06f7eceae26ee1f53eceb50504767f5784b7b762bb96422e6ac6a3efeab1eb3bc32fba0d4720bad7c718c6cd17f8832bb57bb04bc5adf5a9076ca87a4db07d395fb22b9c748bbafa635adf31567648b86b533970a4af417d059c91dee91dc4a62ea73358af43e96980d6be4f8739d25bddeee6a9415ee15470546594b69483b1e070f1b63b4425799ac4293e3b72faac898b5ec9908ed22f2b60befbdd6ca5084cae23317f24a5ae68d5f5b73019085cd01d4ad0643b2187f3506532ea2f2771231fc930504d439cf304ade1bb2b95e56529f4161166a42f4c1fdac4b24e20d8283a1fbfdd48bb41f420aa64f5892e479faefec87e971b57b6e7e5f57d06d897fa14a82e58df141a4648e4bc08be0ed098ad682510642f98fd72137f69eed0808e4f7d4f1f2f53855fd6a83eac8c512036eb34c5953b002033116d1aadb20fd483f9cebd4df73b9f0c09def7ffe1c05adc81e1d6204b2413a1b9b66b68dd8cd23488494a3f8fbabcd3983bfa3e5d121221344ea21024b92d8f4700138ac0488f32fb5cce489459900d5cd9828a9e16993fc254d45c460c394cd34a888819c5f6564508da668b868e06b8b768d226344c6598d4b25831223a0a8b241bd6150ef9ea83212f404817a8b5beeade7c0cfceea84fc2a3bc999686f3880de42c3a22d82f52af110aa745808551e32c2dbd56bb2b1fc17513604903701a8dadbf1a0360a5b760f8bf9bf01752d35ce9f28dd4e84fbb8406d4da50aa2943b3ed6b1413f79688555ffe57328f60ce82cc4cab1043a2208e03d76b31d2ff3b11115c7cb97ac83d99634b2df00d4a704c016a87045b742a5343defa19cbb8044893a888f1eb98d5d7adc2f12f7d4056278372d2550a47ed3e5b95b7bab1e32fdd0d1fdad61a7fc7c4da4f49d344893d7ee3d6340881006ce7cdebe64c98dbad1d975c5b13300162c8dd9aad71e2aa8e5c6f954ab32409b3790b8c038b2d4982386999a2bbe3e64b4e7ebaafcb8c5b13779a372b25fe351a27e619570b9442fe7279876fb2fb51c3ecacf09397cc247f7923cd4a5efc17c48da30ce4e43e9d243ff8ad088cc6fafcc3b077cff7822d04d1efcdee49844bd3bf1ea82529e23a200355f36f77397f31d86c18d9678e114d32f35a4a6a0fb8285c758b6a4148f6c94066189917fc4c57ed901194baf9c9900e52e76a281fbfa7ed34e028933b0ae6e138c117c8a8bd863d82b57f77ebe6015dbc689556b05d2a9636136c3df3626d19791c0762bc701c7d4bb4c0edac3d8bb262aaa3912b60fcf6b539757ab16118cbcd75352ea3d2f0773ab3c8be820d9649b104ec3a56d0941c63e75affe81702252a3cb11280253a6147dd05f3c4ff0e35a72821cfad81f83459f9bae06f709fce878b4daf848d1a15dcf94ca2fd0c0f54bf5af711f2a47fee888e5fc4fc9549824fe3ecbeeb31f8a96dc09269629ef0e26e2e1d715ba66e5680f49b1735a70d200892494db65b050000000000000000000000007c86bed0ceac68974d6bf353fbcadf2b8489c1a38f627ef58369e1871a2605bf6e9ad69a9749381d590dd5b4a82ee543d09eeafb1952831b5ab0d59990832e74a8a0f1d9aa622461d2d847ec90f9f71499b10ecd7b566a537a29b1f12d27fff3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007947a8e167b9b55d3d3353705915ea7e325ac2a608cad1021223fddb2a73432f07f32a1bc520d31319dd084bfddb3eca92e1ecf2d1a031bfedd8aaf71ba3560c08fe79021bcdf8df469f7a611b1fcf0214091c699086976a7328e802502e2cef4120aa9b8cee2cb1f3e3589701859b894a359157a7e1d56e053d61941f93504a020b813a32049b9ae771baa6ed0027cf6d7bc9d8413d38d4ebce9f57b15a42fc18031387d0868e1ad1aaaf45ef372dee447a8073532ae9d3f9aad53be58f1f927a2f0b06a4ecd5bf34ad3e054d9879641d8532d4529f9dbc6627050825d9fe43785f7cad13c67477d9e7fa58cf4ccfd1539c05236db55fba5a11e64f6c7b280de70bfc0206d5f61ddf2c9d7c975b06e080f46f177fca019f803181f4a25b299cd0bf6e5e02008f605bdd1e72909f80675284ce249da8a5b951c5e394b4fe0e4bb5a34d21c3020d7d4f10c30fe6f79cb9785683840972a8f76640d90ee5ed9ce661e292f5642403248b52c2242773785083884c595b846a442e3cb651e423bf2df9db99247f038b032f3fb362331113df89f512f11aa38ee2c5a0b773bddb3f709d9447fbde18aeae9fbc369d0a39c22af6133aab6281f56159b03247d215b0e442e5afbcdd4451dbfe4fb0f6e9d7f77406e50c7880269f9ae01ec98791724b146727f950ff598bb96675977198a05a8a09d728de7e9eb917efac0c8a6f64abcb6e3e82f4bd6e8a4ea2c6f4dc33e8b8b3380b6adc0a4d35d0e0d5d801f530d297634e6731b3298be016d205ddec83430140c3001d705d01e8905002314006c5bd7bd12ef7f10c55b805190a874a1727b0e2356f0b3c9562f66e23d3fea77fc7d9776ee022c549998ce61bd49b43272e6a0fab15a1950254e0d79906d51b25b774d26aa04b2c694c0704ea1e7fe62bb34ac6c82126a4cbb5d576a97d003696fe9f35769623de410493c71a979335497dfd9f56f424ee1222c4e766fef871975cfbdff950692036a5d43aebe3728d3b19940ccc2d60b4407f0872a23e0c722cf30302318bb2e6acea161358000286f451a1b9eb4ed02c17da0d7d696fd62e2fb3015753866872f911ac30912d25c04bd59e63c4fae0707002e0d61a3fa7a96f9e0458ae1cb67e822cfc5ca35d93e951a48580085c6db075be32e01af4b559d5a7614fa80b2b9e07876c219ceaff4ff6435c1f7c2d3bcb5591da92df2273df1ce94f2892593a1b3016911b571750d443dd26054d881df04e4479152cc08278a86fea4cac7a0e35437e5dac4d6d1e3cf0c86d7e0b5a0a28620e3a184bc5c2239f466c72cdd55e7e17d091b2aee981e2b4712afd24b94d4fa8938852b411ab54f7c80badb0daa0fda00661841bc631c1b9bf8737fc564c2fb231dc785c6bc1c7d9002756302a460b152b0766bec8b52eaca7b425c984cf067dbd4b2d7a6a342d5c5c8e4f62c46d813b239c493d1cf0a6ea4560292460851edbb48abd7820bda29e187a01325fb3aedd13eedce9998e8226102e4c3d5e3886ffa008e97e11c5c37f62e2161f1badb88bc24b5d63927600c55e64fbc39dcd335f084b8d9699069574841b4db59b8e9d4c2a8ea61983d85084dcd582d2e65c6fe0d39ffb90baaa6ec5d60f2e8adf16cb32e520e3a44c17af30100c9e21aeb96f86423bb3e231f3389d8b80ca56c46f3bafdd6535c45895e52170a52c26ab295c369c1a674c4136531d64721e8d3ae4d16d45d5635e33bf6c07deb3b337142e9350a4bfd3eaee187521c068aac6e725813d015ef4fed16ccb2627e7774f1ec26451bcca34694f7709b946bc4dada8a9697c060f02ccf13731a8530488b581b605fa08c65c322f21e5b40fbd19fefe7d6fa92bf951c86953c663ad84a50d7b931c40160230cf3a4f242215fbe8e8404b68809c92b2e162454074ded18a30c906c77908f12de5f9b5a1c07e09eca73181419c7c44db199d09395f483cf90376a05c62208938bfe2808486364b547d63fe71414e41f08e0f88852a209b0787267eefab516bd9c68da12b0a2d2ff01a95a9c50bea04b7093fc57c43ea4e581de5760dee8ab1e721c3a5c4b01151fe78ed6ccb105bcf56dbc48f4724f2ae5f779c9d6cb47cbe9c79aacb8121322ede0e6c3f3a244942f22d20a754f478a3954854a8f3ed93f30547999bd1624597da112a74f851e15c17ca6492e2c1208914e0dc3f978a8da8803711993021b3452f883c3e769701f34882bd9772c335ebdd62852202871ea18a5c88ad68f59306a9e0bff7a659623f590134a564dd35efbbb60dae825c0c3b6b79e04f61ddb915e00af573d953ff90303616d70839a9cd9ec1bb733285462540feaf92ef61530125e5f85a796576344b7845d0db2379d3b32d45b9924cfb55e6c2e85b0f632a1e5ca0bfbab4ad9989263cda8c12b8be8667f0b6bc3d007c807b0f", "ac005353ac51", 0, 312025353, 1537743641, "03870cf2407e52a0485bff5fc0a87a7366f6e1ecc9341e582e83b39674f55db8"], - ["030000807082c40303df41495e39552d2aa2e2bdd046ecb9837f0a51e02daf46b074925e5fe2734b23010000000251ac94e80cb1d3bfe95476b4d3df7c9b49ce179e65f7aaa9ab3dda55bea6fc148a709f40fd63000000000165af5c224cd369a4d361cab989b28039294f12de2d7e40a93f48b0a675f749bdf9e81048bc0000000000ffffffff02749b790500000000066a5363ac6aac94c9d004000000000551636a6a530000000000000000030000000000000000000c2902000000005325d592bd9305ae9562c661dfa28c93dfacbefa56df925eed66cbf3260dc46c5949c90b20aa696dae88b31c22831013035dc0f258c9a1f0d54f40f28e6ea5dd5722e790ced62d1bcea865f5c75590074a629c124748464ac8093f32c534d19300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000883ed71aebcd37b0b78acf463244dd6b887366e197d739f8d3152cc719428c912c2b669afc4ac4f2a99f87d18382bdeb2ff9cea43cff4bd0c0ec05218c2545ea6af6293406393b903cac60aba91f5e28f1b4622d31950c9f0396623c044aa851793cca888a377fe59caa95d9e99f19e98ad608ce8814b2540c4f85c888e373e5030d8ca562afd32904cde983b837d5a04c6cba61429e7e4dbb8a98cf5ee295fb39022fe57922e4204938e162f751cacf7685fe275911b7ac995f319c90a5e7b9e1a20b047d020bf1599520a943ca6c9a7bcb8b56bf0da4c2b08a48c69476699476f47de42b548bd8697b462a067b9cf5392f23985ff64cf25c667301c0ebdf703b1d490203ac92de638c730cb860a69f0410de4a38e181045bc25ee21d9a51eb4353ff41032dd880f407dc747191356d7d6f84431207b8c4078f4216c5cc40639eb476212d02259dd65a64c7d190fd9cefe691fa5186ff0e0e8e3178986aa9515ce10d7e4f0f0217f97fa5a7543b22bfc1d75be80dcd8824efa4677973e9e9ab678605dd1f1ac2020f943bc88c43eed8bd3cf326c673521f171d2c4e5b57b9b5b000c88614ad49835052aba21fcd201677d9cf0770fb4ed1bf056ee14ef6af5d43bb2c8c13c65e463cc20e881326c3704323091506ff9abcd841c838fc2e6955c02032f8895ce65956670d2395cb1455e305c6067bb05a4f34d1f66f0a823a8c623f3f38b4c177e02c81afa0a22352843c0d402cf9df7e6c31a51d44b58bff705c6f7454bb539653e0915c54df0e028647cd325646220597bccdd94631ad6cb998201d888826531eda02b48c65c40adae830a7d47ae5bf242db10ef95ffd05b94347abd5fc79b865d6a3bba68d67929c85e3b9e1d433eff311f27d653ac66c704828cce95e57ad1d408c7f9c2c23143d617ef58e57f08e81d70dd51d2d9ed220415ab022489bbefed477c9ea9db241a19c7dd5c2efe948a46c9b44c59ef615101ce6c0598298968b65f8927cd1dcd143f3221b3cae2018f5f93368affd8f296dfa94b6d7d299c6a3b4ef35a3fc48572e9ee0e5ebfdebc78586094ab7492b09da4b5c73e24bd40afaccc14e2f195e7ad851f90c705339f79d8475d4799796bb3cb7a20d266c873752e3777d90a6e0b6e258c2c3a91c62c762191be8d88b247ffb33a4d2bdcbbe8fcdf2c38cb7ff33f59787408cf63902187169dc5a49629d5210384314dd568692360c231ec7b49a54c0319fca9a8a82a34853471c0610ea0ef9a8a51aa8225e05717298d6ac82cdf9584ef10622f6ff68ba4abb264853e9482f78a6dd9c3e6a3c4c8794d45d0e4d4fd76cc0490bab7a28a05cf48ab12a8e5da82f0e08a647b01438e40c70c5899977cce1c3b1fe94aceb41ece1ef0e6a33e373f90caea54c0e01ba2212849328443d8b4a4afa09f26e816fbda0fb6b89dfa9884baec93a0adc940195c79429b93e749d606fe3e2a7de6572d7bea9c930a96e41b7fe55bd52a342cf8da98423be92e18d71d9c4a85c4b6274bd563ca181de181bc2b39f39b6321a8490337ae7534f5f72865abbb5db72a4c13a038d747df4d0f99d3271269f499af016e8c9a698e90b560c8ea1a0d0b6872d7ac96113d4571d1797ac41ed598afef5b723f0b1949b72efba38942738518a64eeabbc75c78d8c2f0f2677889eb5a0acc5f43828abc3a3438e3067d3042056fba2ae45f7b6f66c2f4cc7d973c82889b1e01120d301bcecc6254fe99fb643d273d3fd0e0e0771947c10efe888da4dc968c67cf7f0be18833de636856d5691d0e32d7bc09ed1c5850381064f9143eaa9dfab835094f8673ead6cecf058856be46d275fa8ea32827e5e373cff58d29a080dabe3bb48d8e4bb7d4ba992278ab48b800f31a63a70434a447bef42f99c9997a01e9a547107dce20704351ba07738803ef55edd795316a1bb1965a1058046dca87b0b10bfd5485f412614f39f7a132dd397f581db486e69f9f2e81d52dba81016a988b4d9243ebfe1e17a44340f414c5d3d1c433b5c4af8629442841b283f5f7b21348808527d2ff67366ff6d31bb9dbb3c5f39478a0c4eb51d3bbdad309fbf79d231ea1564aa1388f017dec369ba95175def4c6493d24f5fa456b7d0d43dfd3ab7361c490122fa3f047fdeb1f4645cf200481923363aee19e9490bebbe8fddd80a4a228df9753e88e47857c6846ff0886588a8268c71509910db12e91c0a6ec4ab4fdb5936b45b05aa5004629931e67d5241d107280aed3d9d97f9ec66c5967d49001e766fe485f3abaf4e5419de7de427e300000000000000000d0ddd0500000000e286346dc71e82eb19c12ab8da1d90e189d77f97a085762a0e7d8f9768e0d0b02565e862677c3746cd40bedb21fc48ff43f2ee7f936964d71a4eae8f5ac0cd65fe1d03ce7762c4be008d02575db37d6f11cc6e910f78b88b92033e790679c6da00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa71e6dbf36bc121aed97fea1e06d0b24ee5e196a520e2d7d5478f7716ce1087cb5e11c452071a0da8b69e0348ad6fb30599dc93429dfbf0367d7b2f20f1412b6e757abfc15e474d6e92c665fc858d4ea2f96c655fb01a60301909f79d4df402f41edd29625524d1077dd6fe747245fb317334aa4a5dbcf7fd742b51e3ad1ba10305a0040c2b2b7f882c4fdd7a6837443dd393a7e3f917d52912b16fd7bb7b022e03133b6f9b3caff7801259b1e301142d66ead7ee76b51997f7c61a9ffa3c7d5f3c0b025d01d968326a4c372fe203ff49c6712df2699476907de64fd58818cd30a8552b2efaf9f87f6152cc1ed90eb45d7291a77c2ba7fc1794b1110684db7efc06e80325c46c9c14fb8a085d8459546a48153e77e526172e3bacde2108836fd6bd452f03070a2d2b715af4a2ac44d5884ea94b0700c281fcff7086e80ae53163d5a67f510301a80d97d01d48866021becd32a354c15c64102ee39a1a989e445583878ed1ac021808091ba0935feb426bc34a96edc5b2721204ece1cb3bc928da774a507aa8df021541408c01171505237d1629fbf3c62fde8651be2bdb0af127680aa4324a8e025114080a831b7c99720ca3b1de59e4f1a2275aa3d892a0698f616595a0619cb7df692cd097a16b3903799b082c9b24c242ae913707e5bbea7b5459cb77f7f0e807bde9898fabc7a84fdd4de6d08e1da86b579f28609314e52919a271950d59a61a72cd59ced404350f39dee3a9d0e7260013ca05f750a749056f711489b4588083b50a16da74fefd895ffd67cbd4db718b577c9441902f85507f4a3f41fc9c25e6d4a182391c63d676554fc7d5daa3bca2ce6ee8be9f647ebd02ee506958e59a4e3e65867080ae14099489bf5f56657087720f6920294767e1df51340c9b64a09a06f6bcce6f15e09ffae09a0476e5f633637ebe4550d46a6e26bb60549971026485d82a6d9b7d722f1d06d9e0761810100bcc3435418d733f0291895eb339457b3a1660b0471a9f73113dbb9c2e4b3acb2740cdd104ab00c481a1746adeb8007dde843f0a3bf668ce60dd5bb915767264e3e05e50df7f466212f5297ed25642bea55aad8521fb9e24018599794f58d9f91894240ad8b3a4320783a24ec38e9ecfc4b5c3585a68a219bdcc76b3a8da707ca6a646e3ea4bd6ec12dbff379db360719d7def305433adfd94126daa6dc4e2275477dd212e0e819a3719bbfa6426b8fcb635d103b3cc1d75d718dce16d62092b18d79e6275f9d3bd9c0950c9d81f618e47533bd4977a27d29182117be3f3e2d99cbe66177b456cef74ee305912004562a16b633b45d0a47f52a06791f0626c33115bdc6d504d13f26aa88901c050c646322b6e64732a9e60376ee687e1177ede9dc4994e5a12a688cfe98cca7d0abdd2dc55b0b40f5f0fc41b67f029597606330d183a378c936db4ac79b2f24363bf536939c40229e7bea308012862712e941246ddd0d1a3db786162fb5cace15903846dc852f13e188c468ae6527164ab2fe497753b433bc818f83899fada5cbcab7bb4d83bbe927e53444f0022cbbeb7186511b9a85cfb9be093b5a68e24dd69825c1f9f7a60c4c7b3496b328733c20165a431359b46a451f24dc352f4397c2ba2c72368ef5d656e5f2c3e06be9031ed1998837c680cd010b18227a57639e617f308750103ba91f1052c8fd0c9290163ff65d0a4a57def65d92f93eca686e4bb49a595b9d66239cfa17d96cbb2944adfdb7aa7e17c4495fa9deaacfa055c5883039e9a0efae4328330eeda75d5db63ef2abf6f86d7074d69a40c4592c8e87f887e9ed20acbbf7a5fbb50889dee431cabb85bef62c3b7a4a1385e1f23443d7331dbf5de1e27772f9efd64e80f5688ca36aefc3a6519410667dbb0a36c20e8777db06d362bfb8bd6e1efc7178139119e9d9a7491519ca3373780a73026a4723fa2f6485842258b99b72c5f1f1b11fde33ad23424c9d80960b713e3d1808c021f069f1bb5a13ba86b964ce674ef15741c8c4e05dfe37fb97645e1a71865d61b75b7df2a223f6eb7ee5eeed1961b9cb33f21ab08d6fe2064983667ca491100bf62834fa427f8dbaa2ebd42c669192d1b846517416c2b815d475b93e25febe02830bac4dd9daeb9ea9cd15b2b1290c1c11591b3f42c5466bd3e03265d3abc4460637a64f07cd9302c15ad5c84420cdb97758dd18dabd02aaaabe96db0b72a476cde9a1730db7256356ef75f3bbaf0b860104d3fa8cd99d3bddab54acac4587aa292687973d4e0aee897e16e2c0f2f320d6800550fee0000000000000000d9dc130000000000b4f8f36c3bcf2d9b28de7cecc2a932b032f400dcd795c99ef9b8e131fd381e91ab74858929812bcace65f41965b366452bba920e575b43a699791afbc7a11531ea5cbf2a069bdcfa73e6f2e608eda0229f649a24f3f167e8c018e987f0cb51f8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d33ef13679dfad84a0df8fdb000cc386d6c9ccb883053fadca921660319769d1ac71fb0c32d8effb2e21d365c43fc5a42d180a557d766aca61f8e8299d4bbb0ab186547a8b72e3b937bdab6cdcb49125458e6c619a962606d9353417b3385b1e060d1d8f00f813f0a1d6acd4f90b5999090b06a92994cb24e022f6fffb8d0d2032c40b59458b86725ce7cd93ea3bcb428d5103f0e7737646ef6141d37d7050e870322dd27691c8477a23ef8030788173ae3b3178e5361652bc17a925a71d6f282780a0437f19807d86119c04bee8786076a990f65eec7e4037588829a6334f8fe960869cb4f4841a74aa5a7c913204f25c2a15259ec41ff887ceba152cdccf6b7f3b903272e810f64e17f58b919e4fad78ae2763b3a7da55d94bcee0769638737ab7d4c0325c4b890ec97c803cdd54e13acbbf7c983f5e1633cc8d8b94dba1230b0deb144020c2e400967eaa18f9c344cb42b0609aa24a0b9b16f04f7c43a07b0d32a6478dd022fd2dbb33f0eca2772691d4bd72ab0160bbf70ecaa3b94c05485c10153e0f6cb032cc485184d95e331583c1208e4f4e25109d5c1f020c66e806026cf59e0a4272a16123974ce9e79bdbc57c51d41ee873921b578945da8c35cb99ae9835aa7258555d0450091d16105b00520056d3e7de27138da020b35677000c40053d4438fa3dcc820791535179dfd733242c82e0bd4b844f5cc5114ac732139df1346041b9463ef1e7ba2a57d8d700fcf97635326d9819518c4816dc675fd1533581eef1710e20c5971d06c3f33f3b8cc011638b5708f70c3db2a7f4a6ba20e2a62726ed4b98f3685fd02df18735c90a20163d2987212ec4316461552468039a81f9baaf66b64d0d5e5f5a3869a9036f2d9215c8617fb8907b09f61a46d5e89d9607e56304775b7c54b9b5b3baa124ad3ed43a9739b9425f588879eb6694f4108e414055fbf0c5548913d7e37387603ce9a158a57f2cddd0dad00b3d39b5b6fc9866fb214c3aa7dce167d61b1578e7a232a2de00deb3211ee9e2c7b442d49b4bf6ae1619c9db40e7c128461710f9afaadfae8b0285876156a32cc8b465385fc17973a0e83113b35637a0926db283de446bb3672016466d7f4ed9af667708c5bcc4756a05e145edba14176c431fabbacaa72d5cfac26f5f6bfe9f3ad840d79feea2053297dc0a471d239946d7ba7e9f1941837785c8c72d5a3ffb4e6285048ccdc0d3c6e6646284e35d8e4def584cc450d511b4bbe784b1df9e2f5f0f8dfaa01a4f14789236f4842fad5bd16ccf790186c6b1d1d694b65da93d12c9ab36a9b5ad808e8676a6f7731e92fc42b88074b1448fd654cbdabc5a3a5c4cc83ad0e623f640a9ac776d3b3151c9e589594d7ff9facca20f6eac3e8e9c5b39995f2b1f1ce25a97f7a2d45d95a67337f59d8b7e6f4a8d8388d6b001a94c382d67c2955eb84d79aa37e06aa8001c374dac1d565b8f3742bde817f48e978542b61698f8a42e7d0308c2942c094e5a16c48d0e363405ab2294f376f0ef456868650e30170897e271a49079530b9616afceae2d75bff96dd1ce0c78ef1b683bd1f9645c0f8c8e2150b7f15e0149a239290b0560b201c5e9d9ea4280d49ea6aa3d8c4489ec2f4a34628019b049ca4b0ff61217095fda068b9b762983ad81d085d54318edf06a94c266a0006fe84ef9f73de9289e709ba9c707ab2689a8aa6fd2954225254161d4e9d87b48e28b6d06dbf791714221c45adb764c12beccff4e65fb698a81cc7eca76a3094e255ca6a4f694d7ca829762481f4a2e0f32f0a7da9489509fe0ffa2f8d3c665f3d3c13ddfe916a0e771ff71508699a5a4c8a9a9b9cc062619f2e9a4fe72a7fd354da8b4e673bfe768358c49f00149376b7b99570955dd4f1c3c692dbd6875c5ace171ad90b40a96b4917164cfc36db7f172e44fea51f849becd5aca543dea71908030dbb13e218c2cb18e0ab6471ce99703c43ae1ba9535d899527acfdc3c578fbdf7fb0ca3b00ca6ee228dad09827d49f7ceaccca8155210d1af20de4895e91925b2e4d080c2ad603e8cfeabf4c7a1350a11bd00eed02ba252c8a78402a0fd4e391dd95c264c5785f4098ce5a16b20dd7f47b300413be509a5760d7e2bd533bd09b65bd577ab1496fd8b356f1bed8c40ca428fabd3140c840266f709007e3bfb3e081caa964476bbd07a2cb6a9240e7d1e0138b523ab0e3386478ea4ddff5fd15685d8349acc9f1710c521ea18950273896e64b66f613242f1006833db06098deca16b8790269e3a4a9c21ade5f2c893e1eab911467aefb634c398060d43f54447293b71dd5ca585be4e31b504cb15ce62b72a98e53174f9399929671947319ab6cd839dd9aeb4f5d59327f2d90b0767667002c605162ba1454573545c846972d9dbfd01b1001d9ba1c92358ce915ab2163d1a401", "6a006a", 2, 1648714773, 1537743641, "28d638e2dadff8ba76e695146cb193c60dc606e98bbc26ee25c4132bb05f7665"], - ["030000807082c403022b0f1c1ffd3ff2480603cb63740bf22ba2ece002e2c2c47ad74694d7b04dff9f0200000009655165ac526a0000acffffffff43830b264c82a1d9c555291ee8edb93c5e95c2db4817e915f81016a1b2f5a5da000000000152ffffffff03cd1ccb0200000000036a5251eb33050200000000016ac05d5a0200000000056300636a0048ff599d0000000002524e2700000000000000000000000000008cdad9f8ff621867cff84644d0b04d1fa69660c97a120c0e3075fc415229c400e5ed9f476534192a8c0294ef87058a21a9e2d4565bb9c1695cde590f1483717d279ca630d1632327275da20c2ac49cadf0fb6ab06ea0d15fe5dbe97dc9badc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e49b4f086af296808c233baa3a15b474ec6307db0103462941ed0e3f64a960b16672a11c4eac41c0d8fb3d04a15ae02f932e1101b4e146a1d0399b2fb7765544206cd4047e70f4d35d96e1ad26233293c73e0e7f2b3dfd22c1a9c466a798ad16f9173f4a5ea4f4276b8658882b0873253dcc4d1c266574c7e02a82d690165e8022800a3d28d114d7eb3dbc5fb38a742eb9e9b5d004c8fe7b8f6965c0dd9e2b25202174582af9b7be6d238a84170a24ad5dfd7ffd6124b43fdb21cd534aaa2fc78590a04d5c23feabeb7a62313b5a6fb11886d93397c5cd33d0560627c7db2bea2edfe682298bec63a1ea67798c464e57db9691aa3e84b327046339f16b5231561da6b021882d995d185b80d9373ffa90a6868a197a1185b1358c48e85944b40b09d06730205c0639aac81d7a9077df36375a7d7cbb6f92280b288960934cd141c16cec7a003228905fdc8c52b4459474e0def0cf5ae10484dd61d9e6b29ebfb6c46964e2b7c031948046d392577350c6e105d80842d91423dca738c4ba7ee8d97b7e5bdbf7196032b7a54a1e4830521d4f49ac590e05cb858125fda7dde22f58b5460122babcfd9160348e21edfaad829df9889986dd7d6a227054e2e9c9fbd182ee0aea4e3c7da750c09ba8de8b9c5a696e581b3a0f91b36dba6b6bd708446cdfb5ebda1ac9d99c5e251849ea0c55e1890e539bab0881ef2a1e82335bf8739d9f6538c6e98223fdc656807e4229a74aa3387676f3b76a97de09bd4dfbd9ad66283d5d6719ef72368eeaf2b6c7c79a38d2d23487855f90f8c92c0719453b0e289da93292eaf869cc70499710b1b3410d75b4e6624d1211a622d6e75215ee303b2607105e5e80f05898ab84614ce91b7b715c319c112d381a55b59696f308353c851540d6e43abe06f8257f23a2f3ea247a20df7c058f3a1f9863c2f38349f316de9e80e18db4781f944d22c3038135b420d956b290b19a601ca97f9a78f1bbd0b66d3e5df7fd502e2c0e510a8e9975727050b563ca807c013d2acb65c89e74a17220021dcad878c5382ed3b12329f72586edb770d0615a0e6438513e72bded9f01cbfc957216c20d7f3cf9ed21a80b1a1b858a71ec1604d791747da94cd539e4bc7d5894232bb81105795c534e1d0e46740c99685d511db3cfafde6333dea8d7b0eec2ac0448e9d73c92790dde6ddabfa5d87aef8a4d797cbf0f6ea61c99b617a6190887f6999ea4d93387d66b8f2558d73ecb463db33484b6771210af2b585fbb085f034b0cf29638c7e2078cedcdc8449fa4ea9ea7e04045044fd4b311a12a1fb49717df8f1f4f727f80bf55c3d3ce24e87345dbdaf6256363d47d117ab429653a277f619c897b843abdf382ba95ea0988c4a1c0269959e3443be8bd87f85b83e7c2d447d9bff2ae08ebebb1602a0f1c6157689f456741396dc3882d5fa24cea3379256c2d6bc6c65d82b0458352a51e4341424129545fe8cd649166ee505fc30f00726ed239b5529c916befe4dcfd4622bfa6d8d8f78b40e68ac146076b04f7dd9ba0f1c3a15b901c6e35621e1e2c95a86d6d96494ea4efc5717ce107d72c3cd7920ec6903f2d5b133b5f86a9d0a93949d697b146d666cf8670e689842d74a8aae5f8deb1a5fb8af7182f0e64085cb1bb2b2e0ca80a861a61c1b5896806f56d10fc2292d927a74feb5791ff3999ce80b90134046f50c16ef7620a41c5b4aa69c647422528459e3f0eb0d8d937c8553054d7a13f5911bc8da431e728d911f4c14410882310881901029a9ee76a79eafd4dd9baf9522d6399d94eaa7eb5edbfab4e02bbf2437db958f7a0c1255b50796ed295fc648a004ca513e26222929682a1949f876c1a2395745c0e89c86803531f2fbe7048d83a87548107573e5312495756eeeb878a7ad86844839b074fa57dfa1a8690600205a09fade82b328af38e10007858065c013d3b7b7a8ab0d6c5f1dbf2bb16ab843019b59100bd4668c2b490eafe04609bdee398872c9f175fb24eb6cf9471f816d730ef55befc40e80ca7ab759a46745046070894cd59df167d2d9a094f16338f95c9c8d13bbfa867bce672b0f8fe0e46b0c81011d694422254a666760a9449d74623d9bf95d011247d791daa58419e06595c71958b45c8a64dbcf7d625f2df11fff2f8b6ac5684b72dbca18b91dc513a5a3899039c570ea0d805063491794ec235358b3a58dff8570d457497be735cb2d1aa43679d86aa120fd7e3605a6b36275e2a8d3a6de3134feb674c274b81b68ba756376bb5c8eb0d339495328245038688e08ac6290b301000000000000000000000000862d84e74f8a4081601b0913075c6a255fd1d25b82574fbf21d1cccc54694486228a0149d28d0ac2b479fef2c75fd57c07bcd00c02dbb6698d40cdaa048c8b4b8bc5d2f42ba6f3e1d1313cd410367c80eb0003db0941cafe5dff4b867ec9f2b20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084a1c79420b8609fbe7e130c602829eaf05ef7a8892b73ccd687180ee85c0670b3c1489a0a14dfb7594583394befa075be86db1efd6832ebdf4b77f84513c1a34d12ae6529a5c1c1d88d7bf159c8c7095e30e3eddb67303e0033628bb023bca790144a9496a6332838ca376a8a96aa056248b3fe6501485f3419e1624e575213020611b31e42873cdb1ee6dd7892c655694830e8454dddfa9d657dae6cb28fe99603203436fa84226007fb599fb9ee7c2d0c879fbeb2a549832ed57509722023af370b012448b56125b18bf200c69c353d2327178f0a953afe776eb7a7a01d1b81e95ecb402232dff83839243c57f222f028fe54f87d68d79350230b92eab1fe804c2a0204a08155c81e81e1956f645faddf9350b2925b0e99ff7d335e56597f199b3b7e0207a33472ecb89042353a746122d628c0dab1159e320543836a044b8ec3867ae5022a8c37ad688d1285c8d549ad4bce2936f0977a2152a233daedd5c3ceae7ef9a30203f0dcbaeb5d4459816854b572b730163534c6604810ee193091740ac66f8d32030062e5bb22bd7008477459ec00622f3fe17ef98e3582b01fb61fc286617d8da4e60001acd44cf0189ec7011927c4f07e324e76dbfe87f8a78f7948b4b002ef530d1d96321434f275bdce16ebffed78fe4cacaa29bf6bb0f561eff05635aa355a1057f52e5786e62b902083b9839fb5107c62b12438260d29eec91dea90d18731f146ae1d21c74778ea472b2c821c1f1230132a880e141ab95ca33a340e6086b549c3a4730fbe820ab536a62b08526fd2e11b44581a37b55648719b444bace18fded89d9f1e97949a72abdb42ac60d58662237b2710ba197c42a567d5c657f21ca5eae9bbbf00688449c3fe81388236ca17a9c94a08a8d50e72c357d8f8cd7c551218e4972dad3bcea8bef7a09a98c6bbcbe7760e636f47f2a3f34553c1bf6d8bed053d0a2cd5a29a3c886f8cbde4d6c0b3d8ae026186e33f3f19a29be0432444ba4decf02c292b4055bae23306b5a6ff21e0e039b711125839f4b4c7045a998c04eca1ccafe6650d437f08196552bb830dba4bd0f337230aa08389fe26a993458baa1d90de80e044483b2dd4d4b2b75f078d85b3dc43e50b2cd06f8042a84d1215d1086c856a9a682139f4dc59426d0e4541c9bff3c90fdfabd711ca9604aa00e52b0487f4ac7760b8eb2cff0d11d242923c503eee3d55c74884ecb97c898491dd3e96a8c295a3840682d567d5669f1958c99eaf5afddc55028f254d461b08b22feecdf4b33660edff2ad2395e7f7c880384d8c01880a5ff5a744bf825f9ea8390fabe31aab6dc5ba11029e105221bf2640285007d4b3730d92550aaec74eee476a2cff91c8817bf2b03558bc29c510efebab83381dc6746c7c4f9c76941430e5c6dccc771620b96d20d7a451c0a775cf69f0a9a385fd9041b17df0813197c99a2f407bc0f5d9d1214d2806d1d478bce6f36ed2e47dc6eb18ae9ce7cb4bdc1342342d87d56c2ff4c80fffd7d37b51cfb72fe303ca1f9386a34d60e7645dc92830094e451c5998985c5f161836141367dffb2c35d4d0433266a7e46be64a79eb4ed311322658b8dac21098d5956f13dfea9eeef3951d594bee2c13aff85e8ef9785631cfbc09f02d506582c40d01aecae27d7509b4c72265407ab383b53f20ee96f54bb0ed98fe7053f07e613b4bd7743c30f49f5e27190858a339e3813bee6561d92fac3c483831d379d3051721eeb6f870c3a90bcc4a268910a3850988435ca5d84000006d87449623e17f229d02d46d759348f641da4b2e97e514a992c32028dfdd31e0d31307b90aa4c2668271dc3f23eaf1396bbe928c579c394c3533c9591db94c813985c9647a4f3193557df7a323b4289775316195915ef64a6f871aac705e23c5e428582321f8743008bf5c773bc1ff69a36c6eb0e01ed782badd036c15af1cf349cd4ff7a77a7cac1d155509b771e185676ac353406276930e5c6dd69f29b7224ddc866727c23b90f041bccf380f2122ef6b1f1bba74c7dd685cdf59636697a5d20d4dc7b08144ca9fc479d2d636280eb5bb765e1d71d10b58bdd6b16f84c90ad3932a48fe144c3694825cf78fcedbbe0501beb98fcb32859ba366f70fac8f39974534815dbf19d319c2375d44931414f0ab5a909789289fa2ec8feaef08ef4b0507a85a946c6c23f4d42ba895850f3dc3c5be179ac655a75350fe0f1cd0cff944f5490d65bb6bcd425633005f1c0601c7f966d738bf01b3cdb6ffec7bbb3f30b129643f12fde84169936870e50239342180d0a18a8d717472b57ae71b2a981139c0a97c74de97c08a0a2994c8ba9c5d8755eccf12404c1c973156b114d21097eac34e500c357d227886ccb984b7da76d9228a025d46a72c61a761dcf22d169a6e67a587d1a33971e2c455c4000", "", 1, 653125967, 0, "e78d98d242e84a7418120f000e7c3285b2ee7422a3b55023f653e94e4f58b765"], - ["030000807082c40303788c1860fa5f8f53b0036b9c4103772aee4be9512ef9091c6685b363f5caaeb2020000000753525252ac6a53ffffffff8830410b4001b5b62c96f7bb1f8c02301c2de9a93c90c1a185b89688b2ba89d501000000025253ffffffff9336aab55689bff61224db18a768dfa04a4899ec020f749987df81a047d6ae660100000005516a650052ffffffff0445a6ad000000000004ac5300517cfc660200000000085163516aac65ac00933b42000000000009656a00656a516a516332475502000000000853636a53ac516a53000000001d50bc51024bf34c05000000000000000000000000e134e252f6570669fc53fcf51d82d1ef95db146babed3fc71812c3133c1d003009f7e88af513cc4625923cb2bd4330549c69396270e31f0d34c447604a2ef29d727f5e1e451a923ee985ab4aa0817c98a177643aa13d78b91766846e397240b70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000053ae84f6c3bebc2758d36eba86e2841dfee9545d6a0b193d60ba5eef831d990d7841b34a89dad96805c4b74a495f168ccf25abd42282ba0b05a8f7e04b330fb87bd6faccadbdf257958b1cc4eec71403d18deb63cad3fcef36d98e4c3bda39249d49c5ea6a84ed25cc84df8953072d793aabe197a3b59b3040798033118e8bf6022a9c2e3c5664393e3c675fdb560893fc3e2db20808fb45f536f969a2b1f00cab021c4bbed4c44c0b598bf61b7db1324c8ae8448bc8d47129c6274ce6173f2847ad0b0060fed8198244e2663a18cf777d4d08d6aa1c1b118de85b21e03be66ae991277b489b1aca72b6e9db03e6c42ba47b2ecb34189c1e7c22789437527dce3523ff0208995e7b7cdae4fb8c1e1c24b843d83b662280a15460405c71399ec06e254a560324a311021c8b5c9b00cee0345659a0b889a49b4b52b6e82be533fbea55b1022c023028064a7e69a34a2dd8e7fefc30bdca7c3ec9284205a4ecf67939c6ed54d766030400ddd2140e3859fc08f635c89598241788ccb50f263350dd8010eeeb44f92002259689cb54eef4883d925e9e214d573f7e8472910ea95200cade8fc0b0e9d478720451efe162545ec9caa94dee1326864f5dd85da9202d63dd81eda18bcbf1b9c494033212c1d655fa8a4873b79793a2de3a979bf9a0819ca4ad1f61dfbb30b1aac2faf300f1d3a0cae44b89d3ddb9ff7998e6baee1052e96db6ec32c4b408d0150a2b835b6e919dff16084a249425d80088962e48f9065e42e82dca179cc06066f9f4673331b575127a214411fb234a451e9519db7c876410559e23d3ab76f9ffbc70daca062e4c222d655772e7438dbd95c979022e9d44c12db2ed4f68ca416d07218f0456aac78108edcd52c0a185e65a7f250eb81586449c68dea886bec586e444cd2467e1528f3c167897f9aec64537e204e02ff1a6fbf9792b3380e304c57c6c1754fefc1d1f69a0bf1d3d3760da31dc2a8e25684963770040d8561ddb4ae716fcc98dd4f02913275be8b162cb34be10bb6a5e9bedeec34ef3d753e90026ddb53a929392dbad4d72b81e73cb9b67412763a6e967c1bd49cc7a736bbd37ed73bd599c38f5954bacd2bc99ae8a0dc92b7b0eafbaf1edf1585bb57d544d8f1ebe1120f30b70f38808564082877904254589b7feb6ae2545d4afecb9de56b99c4367d99bdb0c96f49539df6c547a1085f9d3d0385eb9cd447f4359a7663512b9b65c4c77d0a8f84bf002fc3824ccb836a6fbb7a87b48e52dc2b14ff0000b8a59c7a5738247ab5ee4cdd8d41ca791da6f768e340e30f4bf09a03d1440cd27b3d03f01cf6accf05ef6cc254a1c47f1dce3ee7be3a531c0ff9b80044c7a7138f1629840e50724fb0e6ec01500dc24a070655fae52987298ddfb9c082372960bea6ef19c72a337443d6f12ddf16f724478e74d12519ad3b6153197327851ac6b962027beb8572b7689b5845795fc4666033d5003c08a31d8f494c49f034891e5f713e62d03ecaaf09983b874614ec422e226b743495cafcd189e22636393f103bec893e4fd575366e61abac625ce05bdb452509a071587aa2fd10c896726dc2eeedd0d2aebeb8bc9d6ea23313aefbe737a00a10c7a12cc3ef80bf7fdd44b3fb870d49ad3abe62090572936264ff4136432ee2b9ebdcd53b4c3356638e8237c546c88b0447b688b2b80bc425a319ae0e17e4cf1bea7896bc6cc8474ca2c6a36ad6559e09e0d01a9c00eabbb68e5088b57763d5b10df50b5b5687f723892213147e0d68a037c097ac953e1148f9ed88e6a82a22be3259ab535dbd823a9ed947e1d00582a433dddfa1eb351baf9e3a4fbccfb8b4efe5e77f693ac868be4827e7feef5f0c4b3350ea423806cf5e8e82f156a45e8d3def6ddfda24b6d80d11d8c0048e63146d37a94a6cff8dad0a9d58a8d56af93a4b4b2274983dedadcac62410620907db0a5b7301c8cf5e9333059ee34c51f34fea5c6c8ea8f102256e36347cdb5627cac10da7d9c199f01576162146ad34a4eb19f45e2d13e7a61c8a21434afedf1b1b1b288d6bc0cfd09b181c50459d3943ccf6f70f4ebac632934f8edb5d6d85f10904b4c9c39bc508d5a31a7139300c8671134dc544440a3ae5eabeac84589c61fdfa4da9f7fe3063d3a13809d9b20aa7eeae73f1b2372ced63a31cfdeeab1caf2cc3b1640017cec2333700368ed63eff5c20984075ea66864c8b9c8915c8e9b096cafe5c1d6c003d3ed3cefbbf081796a016c35be4c337f74bbd1a9b2357b73aa68912a2a11bc21f0126be8ff5d91a936b130d0c0040000000000000000000000007f6bf55852d01ef797fe76d3f7516f248806d424f7b01a088d9056880e8776ab72001b7016552e43bbbc78624b1630df530cc08103b88d94a80cc6f41a486a0727b03facc1896c41290b0896b56c8686878ce9c483b348876830dabe39346b2900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bd22f68cf226b3d53a0a376575965ab20d1a8dad94ffbefb58929bdab3d436610ec871e60479ae062896c5a608bca61d51dc507ceff527541e6b3be6171d8e1ff6ace4868f7aca1d3584e96789e3ef38a58c4a7508c65d3d60bdd50899d24eb8b333b5445a733fe360c3d2674ad6bc44e2766268dd7cc1262e7c3263146a5ff4031729f1508981a250eaee238bece18505c601634637d14f49f9a05e30d15021ca02055d0be07dea28f3591c6bacc2e3bb6692fcc0f4b69b3d6d40363547a319799d0a05ded9eabcb54cefa753f50c8f8b4d98563b994ff6661583979b818841dc73840ada82e600968dba1c1578784c4a5f063162033574891021b1ab6fed7ee2a90b022075fbac12aaa5d26d8eb7d5864794b69dde3293eff4edc52689e109cc3103a7020929eeb083273b1c0985bde70bd9bfba730a4c4b7b0415f7c7a37db5868e34900314bc92731c28e6d38931b3243b90d36c74a2d70a333e970a03639d56ad4797da0228141e1d7b6756e9c5a0b19d69811be4fdf9fe729925ca49a11fb03096ef0eca020e11bb498831a18f36cdae814f95f87ca6d0ba66fb85d540e83715e998572c0c29f1181d217e32f7ad4d74691d288cf3c0e18faf78cc9e203e01604cbe2d6873191cdb12b3fddfd0ca1f393a156d8a3193ea5ab92b0f9944334bb7ddf495fe1d2f26afe71886c1193b78b62aaa12623c1d598d98ecf0cf060a3744ce46db3f4215cd1572b2b3c22c61aaef169f7ea03f52b76a798c203bd587f237844fbbab07de4bb8da148d81f32d7bb504f8fe4ea66cfe2a4a384f64b4e338a0eca9fdab048278db6eb40b1908756c41ad70c1bb759afdeb51597805dc2709d6d2b95e66f4343ce17d2e638edf9577dabeb7f0295557e316e1e086af3de1531b072fab9e22b607f26b13d7c0d5031894823a7afabefd1ad0d65998341ef632847ab1fbb8ee0b1802d77e5ff4ece994c9bcabcc462efbe58c774910058e6ccbc2580de371676e3a8ebb128677cd437bdb95583c16deaec43b5198858340f29709b8a7aff337d93fb33965af1296c95c605f2166faf9776513c1a701fb12e405f793eacd53ad96d7e2cd9f4d6af11b11bff671e48919176bddf19ebaa7f21ba3688d646c41d05330ccd95fc433dfb9c66996d496050124515079ead308bccf16d761b489714eaa50b82e6e5ae9ccc11571e365fd01cb12251bbf7f8f73a9119228082c14fcc1fc05bb6c6f44a9d400fd2e266d59254e446b0343f934b4edef7821dfa527c6d6c7bd96249c77ebdffcd07ca01f179585346f2e13a063373f1a857615e31844bdc0ad60dd90f48a7dddf73bedab58fafe48b95e766e04c19bac3552378930c9bd86cee5df175980452f67b2daa471b8a97296063d0fed81da84c209c648ff123aee152a1eebcd5845553ebd99782ee1a6090abb50bccd337a9078c6f0c056b7776ed6603c494313b09f1bf7283e1b677a6d0061b7783e9a2a8520ec7cf850d9fb9f6a107f2bfa9e27852cb95e68a6158af22b0757eaa3a98627a6b999c841690e68f9e8bb7925da1aa13b1ec93fdd2f5130fd77cc40205606f788c4185035ef4246ce595070aa681b6a692488b42339ce49899da5c61bc81bb37c54e29c3ddde7f05032ec75d2bdbd3f9d7fe72bdfab9be53ab6582008668796941d1b6fb92eecbb6ce3623abc8cbf143ba5ffa025d5706664e044647e84db33c5fe86e9974a608a193bf546a38fca1de582aa5b04ca006e321404b31d04f23ea86f42c51976838663f3c9e998b0643106e236ddbe375fd5573f24ae984d0ee2be53a59737265b517d966f4463a2cfb29449268a5eed3abf8e70f9d4ed372e535abce072643d2c12b24fc5fdd2b82f79c17e943769ffa7a7afac5e26d8855d660630c5869a8ad4a910cb97940b514da7e651e9405ce4eb7818053b8ae5120649459f3979e2cf185d3e568cb391278b72ae3a5b12a4040078356873f3d5b900efda29cd788b834c749ae618fd92d41412903cfdd04b5959addd6982496f30cbb533dabf156a4370a7c95a64b3a6f95ed35e2afb3c777ad2b9ca28013587cb0d62316983dd7db9a5488b85f2da0de96b442a77c630335f776cf422c6432e3a9ec85d8ea73de420d7242e602e5bc7b4f9714b0214986bd903290eef81b1e56cf61b81c825f85f6761a7d8674cf37cec664305db534737d56af6ed4fb939bc63202a72158e7a89b378c8337b9fee7e153a0ce8012442f9376977e003e05bc73db24f063bdc23c332aed4214753fdc1f93ea2773ad471bfa7ce1c68b5c8aa722bf4eefe894cd7f64d8677211e9e14eb191eeb6e3664a5f07532ee999ad30177dc3920a6f083a07c6ae9e0c459a576cd291d1ea742264d62e4d8d70a61f97e565462c94f65a4fde57c829072a82903c3c518c6b156bdaf56d761d30c", "63526500ac6aac516a", 0, 1511899, 0, "a07a69f8edadcc661341f1ee75d3c83cf3d2bf30a98bb8c73cafe6b3d369f829"], - ["f170a07d0431d226b2440bba72fad8202c1b377526e1345ebac6b3001ffeb68673d1f515e5020000000853636352acac6a53ffffffff72f88fb45a7e4ab87210066bc1503920cfc1ef029e9730c97f2a905a8e1ebf140300000005acac53530036adb9973e0f2ea2f2ab4305ed556fbf913a15a6114ecbbe193f3b5e45992061d102a58a000000000553ac0065636d98c774d50e613b55333f1e00036cbc992ba6a5543dec54432ac74f8af70735938b644600000000026551ffffffff0100d4f40200000000046300536500000000030000000000000000c606cd00000000007803b8c5057302eefcf3b56f991118cecd01cad09634b5a362d986e877c8539ebd35d74acf407cede6377b373505bb823c4436d40f04e23c26f4d20259791b34b6d6612042448ba7bceb1bfce620358bd80296ba99bd3ffee6191937e493b51e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8d0265ea33cd25ec626c7e7f5a93bec77f5b9e97d88a886d440606606126ade51a5a1abcd5617aa3746236ac4bee48394fe848837bd1769f61cc2be1c08ab414ce538c34c718d51d632ff1ed04d90bb9d1c7ec84918e1c559b8f34aefa48749ff5c4d893b59ec16317d6eba04300f811bf52035b575f2eaca3c5459562015cc0203ebe4b6d8f121db9685986aa7dd7b0dbb99ae9a9f340d9a27d681be490fbb5c022fdfeae944e803bea31e1bf14ff18ef8ec151defbb47dbda12dcd273baf0b3fd0a087b675c4406dd5924aaf791d0a359f267f66f5a9756a280b7c2a271e5e2ad05b04ba596696401a82377f33e03b4e84c08676769be4b17e3a7c1c4b13345593503160f37f5ee5da861616c7ee82f79aa5d6de0f88662b7c6d2442bd51ea34f055b021c1cdf938b76f078c190a50b896f070b070372daf3ab93353d9484b84bfacc560204686778759403acf9e3f2d72395d9e37b78f3a6ac1b356ec3b45661b5eabed1030867bb523c167d2433b4508fb3ee27e1313978046a65b1535cc96aceac602afa0328daaa793e98cec9ffcb287eb3c711ac27bb3fd32271823c2f82079b4ff0748d87c6de6fd1b702084a62ba31800c8c4a3dd4d11125d408cca1da074f275807fa45170094083e750b5626e245fa61b6fde3c24e6c8e11dd4b53670f169a63cda1c452709a2b7edc5f5c33ce0f1ccd40af8e7dd8028f39ffb270f256ae4b93e6953c0aedce0002da341e97b31934c4c6af6692ca28c5d3ac6dc00bd2aa77d9d9e1945d40de13ea203cd399d8269b823b4f83b88e686dc6299d4d1d456a8b1de437351ae53c1ff093697151c4c09f20e2987c23cf2622c82ccc3699e66378037c08a6b5da2231f89fa649f7f57e4cc8e573214a0ebb409e79bc86a98a3f7d44699f9046e7222e75e2ff998ce2560cf3f8431f61b678c1e705048a6b0ecb0ff57676595b670d0a4a8471ccd892929d12d174825ae3efd88426534c2d189bdd960a986d98191df6c18ee80d09f9050dbc4edb1639e9f8f4509512c97747b5dfc74976b2480a605f2315c3b14d107604f6c412cf277286f54520208fc0471a1715e055c8f0b2d3b4dbb85823c81fbcc44cf278e5520002086ce3bc0862806668e6c7ab5d44343982eb4f0feafb0067cf4cd196d058bce4cbdaad0ba863cb3cdd44cd990ba732fbfc4c477f00f38a749bb783d024728ecda8c4de21ea7d1b5a902971f0d09275320ecc2fb19d6bd9b6139e6c3525ac87f55b53965147dc7a3ec678b8689d55b8dafddf75576580d90439a3ebd569af8c0d6ba5fec069906066fc8f538e19d0892d47b2fc2b126ab397958aca4ea1949b0bf06766344bf661ae96b5b5e676d076fba17444b4a192d08a2c01d2fea1e4fdb5e1dd6a7ec79d72d6540dae052315531ac87de8acf394dfc168152283ed9591807e63b1acd1f8554ce30a545e62d82102fa48bc636930d8d4d46db2af942bf48c7316d3ea0af4ba9cf369fabc8959c5f474c9d9c23a4adda2352071c45476f52b6cd90054e9f426a10c7a02c0f0c4ceb3eaa5664bd3cf0b28bb8530b14781dfa055ea81d8e6c0658fd386afb44b2191400f30322264cb999b08e5fb2cdabe2fc4c414f5e3a16729bf908ab28d353b5e070701d149b5785f5471083b733160279409ecdab3880fae86e92d95b674eb68044b3994cc2b2d116898bcb792b7c5737f3eabcb753046ab744ac25699d61045fec23be1fb097b85698b883781f6624ea63401aad0e56474b7e1c108c9cccc88a759979f6e1604450e73636334526bd7b2536684ed9e7048f5388358e535b7293dd5c3b56d2dd4f721eecbf5ae7c6854890e1f13d1bc8a9692478a1d88fb6ed7e723ed41a2a7fd7a7d76d1659a672922508e8272d6122e9f43e70a89917311cd8b6abf780ab9eb782eccfe16fc4cc62a4dd1e508c3e7f277decea6e92d2675fac76352007729fd37f1ff9061789cf8c2f3ec455054226a84d5185bca3ec968936a9a6e1619d211f913daf72c773106f5864c07bbb466cb5f0652cfe13836c48d8564dd7fa6b9f487bda6f1a89305ee413af7d80cd3564b013950fe09d1bdf401ce6b5f6589bee74fb1e5b35ccee91405eaa655ee21601e0836e8cd34e253773344bb86ed230d6b0df060eddc85431c439d7bcb435e1a51a0659281dbc56440a31c7ef33d4e37b30a1e0637a30935a1f94d182923ab9f1447f5b6fde40c5b0c9e40e2d593a82abbab90369118c3b2ee1177ec7ad15153eafeaa1208bbb0be085a52a9c995b002b32943bd5d929f19136fa71101000000000000000000000000ec19b939e58909b2dba5f5b2ccb386bf251e5096d0558c32388fb6707bf46dfe7885325717bfbdae08284b0d884eb97f6f6aade4566b0ce3947c1938004b00bbf81f6e397687b7c808595fb03ab41b734f0c4ee501961edb4af379a28b7009df00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb00a9627df576ed11e82d1d332d5118e28204511ea387217b9861c6612e124bc0179066c7099d7a7411a7782cc205c76e128a6b089ef6a1fdc9d352bfee950ebf898312fd1e027482aad68cf272f3db1db3f5bea3cd93c16f9958a9cf1d94ddaef0488f57b952108017ae2feaab8b45272f5df7c1f7fc916f35ae7ab663b6c20308d0efdb290d9394f6e7084de1604151f8f32a37f54a7a66ab9cfd99d46ef79703293ceb659c6d269a546b3fcb6012c37dbdb6e59055e2068780303992f8fab06d0a00041c88c23c94db3e31ca7b8c8ef614d909018b1e796ad11228a1e5e7fe696fc5ec33a2d1d6f61c91d3fe494fe5da2f0451ddb67d5f0713d61353efd6c49c9a021e551432b8c7f7f7fe6260a31bb8ff1afd9e6a3da6ccf9917257091e2a1003860221649dd84244822e1b3e865f4ac9d020c6c6d08e4ddc6414a2283c8afead0875021d0ecf79da7e0edd8bc668b4ad1bc7d20a1becbb87e3061c563026a0ce6744e403224f9a98cb8ea8aeadc723bc341ae910469dbe5cc2622864bfcbad3c16cf08190305a8697fd7d4272166aad7b20ce86fc1827423aa5efc9b51bb7e9e1f47666ddc90381dbd731017d86b4c804893ab8ab12f2d307089a903de773f660e3df8cf685eaaab1a4cfea314a3d992de1c0e0e33855bb1d9bbfa849665d03da965ef1c5d29e6940575e8eb5edfda6c3f25ff6912b38848d57cb3af758afaefbcbbd99508cba1c15bbb7827c8ab116e42f1b4205764021fd4d73b6a47cea2cd3daf369a6a6823e67a269541994ca16c385112fc28adf7cd2ec849eb1f526e0e48f69497f43a5da483d8a76c2d5b7c9cccef15d5af3cf62ac27baddb11e715d8c3c96d9c3b901225657d41dbce539db460535540f245904c7a23b5e89b92b8063d85de34f72bada49130e5079cace727bace4e8d0a3e4c5c4920d5dc14e399f85fefa600782b85c5f5a19fc116524f5310476497f59d495ed39bb0f4b3f95215df34abb9f2a29a8e674c2b27b5c57094e28dad40e17517820b766050307263aff5913cd1f4c910635ae287cbea5fe8dba08415622d84cdefabc1b8042381919b62a73920ef654237f2f5e4fa076cd80c92d72b1af4cc4224898aa84e43d30457f650e24153db1e30c728f30fda751d2935fdd20bed771020029efa84dd8bd980622fb12a8f509e1fa4f79119434162c17b94eb4c4ef6f4e74646cd9bee105b76ae8004133f03cc7e42428e4a92edfb3874d1980cb94dea6948f1523f31c5941cf5b7f2822277ec6100cd0707c0147341b8b29d4aba1e8f2eb0e101ce82a1974989451e29ee2202e3fe0758cb0e43a1eab1ca7329db98693006fcb4ff30a9fd35ea7577a530cf0821cd6ea5ad1d1cad350db4b5eafc59c57997c6dcbc47deb5c1efbad6a0505fa32dd20d8dabbf30a8f75d5402b5d3cab4495419c85cb0d30351ebcad690853e7af0ffa0c1a901b01b4f147b0f1d47527c0a7c70324776ca8aeef3a66977c9096c168a170bcbf7948e8cdad79b3a5026e81c1630a10511cc8c2c62cb0a67116d31932da82c16c34ea1982832dc6858f8534a6306bb79ff7007a628e2ecc25a9a79073f74b0c588c605fe15a8039fa6bcd01b185596ce3cc6641f603bb4b46ed18adf5060ec839086fc9dfb46ee669d422dbbacc38c03d72de5f2eb923364fc1eee584c845e2ddb62e8774f0bafeaf2ff1a096bd226ae6c38b3f822d40d2ab31663fc785f35e6e8f3d02dad97a3ac56f39b1231dc538b6103818d38bed19f7f7e69bdb22be6e5112354b9f82a99f76819a41d66ca8286152e881dc92669c5c011c9b03c09e0ce1a5d82c2990ca2e4def766db126c085f388a4fda45764de2a0e98047ad44581be4316d92dc9d978b222f40f298ad314b5183b8f1960d760d52bfb0255f621ab8dd7f762d473f4f9b7765e0bb1ae9ceffe0a8f0632e81bf7d08c513a4344b77a82876b0c9355e00f6ce0cec3c176f1f1f577a2c443e3105615bd853ba002f2460ece84ef65a66b38e4e49ac734be13db4098e8923e74cde0812272454c5e50424349fbc60676179bc0ec5c11279e802f398f07a742f9bff53832e97a77d097ed9da4d0a1b449a5e6d25d4e26af8845816cbc3786fab9298f6e05ff8727a08f0930437bfb0a08f4eb0294ca464cf64d64a3a968c5779d7e06ca497c0e2bbb5980108f3cecabe79c54d8b57d294eb6f90dbd5a10ece744bdf5cbc75db319ce2224e60d0a4997eb6c15de5b1cfbc7b8554b094b43b18a1e3a36502d2bcc1dd61aed8e29c287f7c693478f06d4e65d57d00000000000000000000000000d935ac0fdd552937c44e0b6d2856f52b7b5cdb785a766da775a42923839abc237c3a1efaa885da34a79e97f02985eb470e3f7d34273988d9f2a5c906c7c145b2f4d09676276f32651951ff32bb469ca5b7b613ed0a134125b6b3e8d05aeb43cc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d0ecd1dd3688eea3bc30c2ee90ea5b18cd401e289d7dae2e767d855b4f7bb5fe367d712ab721aa389375fdb73660e702740d8a75e68dde5153783c36055c9eaa1d8d0941eecef32192c6ce5fe580e43ef5239c0c17e606e6c2a824d527c429271e72ff4effaa7c8ab4511b6bee3e479f7f1fc76739737cff8c89901b4e32337030745a5700eb9d37a15ba38d1a89ddd46e2ed9a58a700cc10c765c9e9929db625020f9024310bba3de326fdd923e406d0f833d05eae1d932367db5409f0d04f21f30a07ab5c2b6293e2c8b07f222602d6b243be29be59aa0b9b28f7efcf962115c99b043c376ce580930d28033dd50058aed39dae2f347c19bc0a753b020ee4a7795c0203b40c0f27f9087ca3cac84623b66942c9e6aaa475b719aaf919a613372c221303212e65feb6987dbf252031060e158dc29a07c05dcff8296d3e9e39e0df7385bb0311bcb7731f79aead86b0d059e420028b3e589f4f043ac21c49503f6185f325c20303ebbc1c370c987e4dad16d4be919f1759c2fbd1e777c5b9747dd9ff423d8547021b5e33d42f99784046d9d52b0b7a90a9ec43bffbb36793f5892f2affe37a9c839e1d80c702538871aba0d680f7c2bf5fb858e7d4659dad7d998bd1d0548fd028324831b4545ba39513ca0bb0309dd1b3d3c242dd025e9c5a86fecd4e87749c4b6dd8f22ddc1ec9b09df4d8e9c305d7719848f0d590a7715353553b6710b24be7ce2477f5790d9f299d635821a776ba2f9d0e6744ee65279d6cb97cebcfd1cef1958ac88456d4b633a254d05117a4b594b28df1c154d3c99b62d069c4b98ee9c3df6346113a41f1c1590955189d1fc91480036a8e528ce637ff2fc7279eb7cec95dd6f2b8b6cb740e314eeb964f91413b095bc7284f54c973280037b3a7de812fec22b9c67b601cc673964bfc8df25c9d284d1253bd8e612876181bd92a60e4d35b33c8c3de214c86313fca96525e739aa8ed282bdf518048ff9ffb9702287f60c9d0974c5320f867b024f0825ae72f9391084b2f8d6b5922e9defc12a2802e8c2fcf18f666df16c28afbf061389087e8fe652c1054ac55acc296b0e1f0b6915af3553ef66fd46a6a6e93c815f89aaee6410ba82ab40262aa12e82cd8bb72094a84ed6f5c96b39f49b10a9ecd42f318b9c37253454ef3b3f72424348232d46e706c8dca462a9c3ed8476e2414f300fe64938ee3d91ce787031b897646abaca140d1f8be71c5bbf0717b92f5c909eb0cdb20295d9c795548f9d1ad0cb8ba7c16449ee18fbd6bc130b64d325502bfbf9930c00ae4f3492794fdf696c5c11cd152272c6f5ed2508dba165148b54245062ff3e3ac05656acefc14f2045456b63df5864433a99a01cd45725ed7df5f36b3fd7cf3bc850923c6ec24480227afdd0857f90baf78e72823000745b42c62a29b1881e62ddd4cc32f160b256696de7975197265eea49229b7befdf53afed12ebccb115459f437a79cf911a50e492a99d30e1b194bb7d8c5d749f36ead7b50cfd6cb4f5c73bb2ad3b57574e461e47bb742b9b0a84e19ea86f55170adf16bc866679502701a29983e449c8ea9f3c6b43d95a0b81e3a126616ef0e7547b2529aeae2e7eb8ac74391173f66dfc02abf0a591d3c459b849248fc20d774fceebe1badf58365931a8eb104f3b154392ef640ea4563136c432c0a7cf860a48d6a899b4f18106590738dd3a68b12c2b57a71f574d2ec49735778fdaadf43dc222a5d765728f3f0dd76be1e7a753794d050146784e1dd648c1941a67d7177eb7470b5664bf95b79a55df3fdc3731d248b2cffbf9b37f4e78ac5d60a348a9b124ef3df11d10609a30c0f763b34221dfb5866118a72e859e0ace49a32f66d10afba7cc20ce686a66bde3d68273f8ed38ce2895ae59a3f681adb015510a4616bd24cce3efe798b3a8a7f7ad29334658967292d13d8f5f1923da3d542ddb07ac104ba07fb87f7935740918db6410d8fbd725dd6623d670faba3e59f5e497fbd017689311ae127d91b0a244012bd06ce4f8678b6b4ad750fa6ca57946b1078e1b6f4f10f90d5e51bb6d560056dde3929598e7a98245525c0a9c71beaf3b9b03f32934aff3be15a48d1b67eb31d59b49c0f9be0c3ddf2e21bc15bd6392365ccdb8f81795b014f329cd8bca09226b6a2d9a9830f07adf3ad6981d59f6659db73e7acdbd578af157cc87fb8693666eb7321585a61e4d1706e7beef38800122995ca7ae42a13fe0eeb686a4a26789120626cd80d47701a9c00c80321e46ea2c055b62b82f75e5098c99db848d02466ce29b720c57c2e2fbf0f00f3d69a62af6aa13238731601193ed69ad9a485d18dfe8c821011e8e019d44d98a9a73a29f52ff94b9e83728205bbd8e8a96fba8897fbb14f270a6f10b191f37f96adfec74a7a9fdc98cb670d3029f97b0342460e", "0053ac65ac63656552", 0, -1773702360, 1537743641, "4e57f632f8103b20003a1d978ad94facb9b63838cf769d356fede42e1552dae8"], - ["030000807082c403011afc947aca17e7a64a88119e52b8d57baa96c62a37f1799054bed7c44c03d02503000000086a6a516565636aacffffffff01df46a2010000000007acac6500005253ad5ebb7d29bb70b100", "52", 0, 1970757565, 1537743641, "947c79058e8930799d6c8bda587175af7a7c71b8fa5331e6e85dbb47652398a2"], - ["ba1a4956049338ffd31825b75d96a98a9808feac81353128a76167786dae816065b773c4ed030000000763ac6365006a00fffffffff54fc30b27d19a6f155d15b37e8ad69532aa13804a5a4d8f7b4e86ce2e2d016502000000040053006ad5004eb694dfcad4cf61e04b05ed2e41ec7fed09220a4de09108f31cbfd05d20989fa696010000000752636353000065fffffffffadedab721ffd69e3d061141dc17550c6865cd38bdbbbfce12b4eb14b1b887a602000000010001095f63023ffeb80000000000056365515352f515ef0300000000036a6a526644524e00", "51526565ac6a52", 1, 2050582395, 0, "535b86d672bcb801a52e1ac11f9b95583ccbfd47eb2aaf1422380bd7875cb0e2"], - ["030000807082c40301b0257f6b93c5753b967864ba181423e30c538e7210cce9b54426f42c9c58e4e3030000000096e112ee0153e89e03000000000453655253ceac29ef57a47b3e010000000000000000049d4d0500000000f6cb8debf8ee63e7ad5720ea3d6c800d3cc88d86f64dea49b3c080c7d285344352107b9efed39b5664267a559b18c3026975e2b9a6e313b2abecfb22f3e219b9d5a0de910328e2b120de0c6e7b0ad20a05db5e0f0596099e3bb05efba061ba9900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a34baadd6aef0e2503c1f129d7f94aa1dae8cc22ef76031e1a162970ff199fc0171862f9ac0cdf77d31d79b242b0c5f71e77775436efaa8b46403785bc5cf8c2bdce74d20657b050cbb2708bc51edea7ec3042e0bfb5c56987cf3ac8541afb8b21614c3a3897f242f1cf446cbae4515f58088af64b223a723a8f5cf856b40c19030d05d03d75c0c5b99344b70290f262e32363f10cdcf9df3c2cb0227b94ef6b9a022a425b4181564c47b5789a4a93b55db3a1c40753d5f6c4d82966d2e2df627b5b0b08ff00aebe0b9397a05fab696b4be4649e269adb5e21f7e26968215a02be609aa3c6fcaba5aa109171560247de42e984d45a71deb4b97ca682f63a4fec166aa703080fa1a0488dce545fa66422249bbab6afd08a9a2ed593c56b709f8366e4c1640227521011fac67d27dd487547781ac1ea505e6b91f93a5261b65c33a33e8f705302253a864061715de158ca827c773c61ee626ea8563a5a8ecbf7e1696efa761ccf0215bccedaec348606a621995d4c79d974b6f26b88bcaea298137b6baf23ba040b03090977302f6ab706382a031120d953d24e9d8c023eabac1d39c819823c0177abd3bc928ddb750879c2c4dbdf795b81c9c87b448cf144c5dfdf0bde17178e239e21ddf01baef1fc15bed5b599ea9a0a55aa2b99dddfa1e908f89cee38f6eceaad94f2e6c8799b43c3addf70deec6117f625138706746e9dc84a7043820477402c6ed8cbdcaa8159a17f80cc258404759c5716977bc02baf42bf7c05d04065eea3fba519a39cf0419d7cf03408c1e900e2e2adb172a79bec0fee26988019aca22bab67a54e7452426459afb110f9d9842018d000f823b3b75cdff49299ae490ed9314ed6be28f172e106c96dfd9d3c973d7c8c29fae6c5e986beb14a26252c887effa71ddf0e933124f38b900e09ad0007eb8e8d4e4405e42a2127fd18d03ca5ca78a7abff40a367ba295dca840b277289ac6910712361663887d5654d405bd010695d55c86d33dacc186369cfc2a47ca9cf3cbcb1df7b47633ffe5c7b22e786ed98776797713ddab060d5cec992df8a1e39d9ceb4006a11c9a1560e7054f50ae20dd5361aca155bd9ca555f134285e35b48df492cb64c290c40e16123389352658caf4c4d8d3b6e1e62d5cf5ac1191f1e6bde400ea8bfe5369963e36aa140de162c3540b9eeca863eb43346d60f2d2b53b84f617abf1fcd160f0a46f318c34746a06077bc2f7884d5070b8e54816cd01b36697e36ceb7bae125f3bea63ee192ab0592de7122215eb7a802c8a470a1fc361b690dd4111ef9ef21bfcb257ce175c70315bc1b7deb474dc516a268da5977bc13acb4db478b240f913cd0e4445c715d13d772a3f0368058c302f331ad27d53c507e2a122f3f48b17b399585395fcd58804dbad447e39a71977df786dd6cb0e1e6949b19182f4a4cf1e9805ca07869730b6fc372e58bd3150aaae4a4ea344b36d714ae5da9a15e64b74c002dd1dac8899d3786d6004a5a22d953e715147318559b1f44574a706fb9e7c7f7bcec8065fe7f0e2d2d498f7a9ce445a9e5b5b8e863e9cd83caa42f4acc1c613abe4bf4806e8ca006a57cf8437551b47848ea1cb614d3accd8884d078e81bdf4f559f7efed468be8afd0a3d3f88c5ce8c70d9793b6ca0fae094819cfaccb783bea5cd41367db9ca11e1ebf8997ac8b8efda40388f0e01f5f37a253a600c178124cbffcb189c276947271bf9141204568acb52074d709eccbafaf73a87b1af585024ad7c39d1616a262cba440db78462959575255aeaad78785a1afa762c3c1982b7445c6dc1c1fd13765b1a3678149cd158fa312dac31317fe1414b845513dfb298fda4f9a8ce753e48e233aaa41c23d016a44cc2e1eccd03eb8b82afe7db3da0927bfa8b7552168a58145ccc393914c1309d6c72cd99ecb1000b9826548edee3d0870b265766672940f60490564feccada1163e9adc1c053843db6a95335cb766ce8b5ac98cc947804713b93cb96b5f29d7155c3ddebe1a22a5435e8e57c41149f37655b3ef431c70ce0ecc0a3fce97d937fb144afb7d1d91f26a777d190c5d1fd9454ca082f3d627559fc24aa1cea0ac623ce4327a6459705575fa572f00414fd957a77efe052153455db9503cad93ce9a000a9663962306379459beb5dceee77933469d39336d2fa426bf5a45b8cd92978bad3ff3d7b54d91fa2326225c9ca33079bb4d70759a7b12233ae2b6a0f12d78bf1acb7182969f17e4fc8414ebc178833861029da7d4b590c6659434acf11c8afd5e9e8f77ced5dbacc4eeba1e4b71cd56973113783062c9ebebf7d8adb793b3c1929b8c7b787ba1387f5bc76dace3e242e12e3859f4fd1caf0b5188184f4f5b7297bbe8b939091807513f35125c8d4774728807fe240952893e6fd35b4d673c42828c9950a", "635263", 0, 2032974094, 0, "d8718c40758a57467a991e906fc223addc97416d2b71b75f94479bc4708bae9d"], - ["56509d6b01deaf550f676ee8cc0a8a1d61bbc2b40331f0adde01f15661efb5f2fbb518e96903000000030000001b114c8a02e6303305000000000665656300636a8677010200000000046363515200000000010000000000000000d66318030000000096d02f32209d7c22d5a407754f070a0cdaa5c2067c3606837f058311cf32dce0f8636c2f5884ca44b26c8810eecf43527ac5c790338630fddd294d5562593e9683cb96865b2ea9b7fc04073eca4f6ff6d302386d1d2fa1a2501575d369d541d500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c815edcc82ab328d9664056776bb6756aaca4185007d4c7ad1bb0e49f0e2237fd4b36ca80484fb2fb28b244dccf1e15eb671ec0c5c560975d6e30dd05d1c40091dec344f647d791c162f42f99f97e10c62f2f3059f4f3db661b3ec824d03a71f4c02ee971a94304d1da25a6f37b8a466e599532329b44d7918dd404a726c7c57020e8fc2f65407f50dc883eaad0b9ab2bc014651b917dc36f98aa4834085aad96e032d7a28cc3f9b1f2c957f2d4bc7cb56e32e8fdcae43dc764e3148bb33769594b20b03ab407cdc87a25f1c8fb5dc8d7403d89375c48cc8ebb89abdbf174d3ba6c74aa30e6bc42c4546a870063af78d037a5a1cfb8db87f0872c8496c2ee007ab9b7e0222b2afca94df7292d13f92cbd2d7300ab8a5b37ea0f5bf1b03d38a0969615c7302156eef6f9353d510fb79e601ccc09c0ab280593b21641fc4a8200ce3211913bc02207464655bed3c103fb9cf52efa64081b5ccd225c7b229c17dd8af662fc08e9802100224b3da0a92b587a12639a910b4a7c2c550a8f63f9336bfae919a9e709c810226ae6789f826f2f6a7b37c018e9febe3e33c34cc2c1cad5cf5841bf2aae74a6aafd9b12614e4a593b741a1371dcc2f35549def4f126b969dfeced3199b9f870e8751f2980aec251e1a317572acaf6a5f194471f1db1564b236b3cfd6923b813b6e164ebcdaa1250368c42241083ec46c378e9b67b8b793395919f165037bd93623e2c6cbe69e4675ca84f82dc0724b24e6bdfcd0e20c73489cef71d851b5b9bc3d86a56ff01403f22fa1b1ab5e88364fd7bd613b4e83c9dab5a6b850613a6aa8f25142e6d0744efe036f53c2ab1cea9f06b6dba555ad7655441662f106af2e037e23210e09ecff44417ad0408e20a930a0bb732fd6c6d0fa9f192b8ec7ba7ac4cdf138b968b684300b1dfd501892341f6c5414b6725780b1355c3fb7ed19703bdf73d85685dd275996db1e6ed53c85a080f13333d07df7842223fe4fde511bcde05d976a584bf6edfd04af5831265f6e54a47b9df90b86c525fa3d6f725310a1be2682361415197a22d59011cd7c1d0a5337ee23a8fe4fa5fa3d404c7c0b4091a9f1db718d869291245c2bf340db846e09ae47f1c9466d1ee9031637afa4c3655d4ebb75308c0d5579c9dc0a8cc5fcf49ba78f9e1e4c5ffcdcc2d0299a4526086e7b7a6ce9cb8b1989e57de6a8ab9fffbb21ebc888118ae28bae471e176a75ab36a28348be932e33af55f439305d3224308e75be4d5dcbf26276b05c0718682bb6b531f75ce1895fd30725425155c476cff016997bd1f605257b243ff24ba1ea626bd7a8fc787502213abe7d3209cf8ea670a849db5db3aebb3e5dce9e8273e8b38bcae4e967ca2c1a408a8c7450eaf3c4b8a0485ff81cbd5bb301258f9f0ed46ef57e3f88b8e9534715ed022189488841556a9cf8700ef0a95de80ed34cf27bb81f5dd055bc2f11ba5cf43ab22dd807104b4d62371b0a82c1dd0f9120976b9c5c4f104ff739dc17b357c996d2134059fd885163d46c5e9bc9a38295d7e998d7aeb219f5dd991c56d787df9abc42ca25a7c33b87f0f0a7121598957aba0da5ed1ce69930c56f27ad5d4e0776269701f94f78ba2b9c7f2617aec5e434ec5aa6c1c1f3ec3c9e55e45d8c4d4a5fc3eec4f5df1c783db4f05ec8d681fc762596b98fa0d565a2304e5573bfc0e55df2c1129c41d7dc085c8004a478f1b4ab8da64a32f1e6f5a0453512abe859ab5b478dc272b0531364312ceb0bd92e9b378650f0bf48af0f8de425005912c3d78b4b2ee38dc6dc7da28b0748ccddf12003f63c9dc419d7832b264e2e0a4e6ed6339c7600051d5a4f96cbff68ad779b2cbeca47c41b90e884282aee3c57323d620bdc7767c69aae875b16cf2ef0119dfeada2fbe6b4eff0cd705c28a01c3ec6a846d66da534fa36376c357a1b5364617f3eaa71a92d33296221632ee3fca6b1720674e477726d7b6dfca2b0b59334a67bce9ee2d30b57ff311e4c414a19faf6536ffaa2d639bbe3deaf95ba206ff58fb1fb8fe66a11f877abd774efd2559cd18227145d2f50b0aa25d8820b6a9e9c84c5753bad0fee4f3a40220a461fdff929a329f726bcfab1738c8b594a392454c371a8f656ecc723d8ca24a2b50b08a4cd8b32c0cb26aed59ec3762589b4b9f38fc8bfbfbb7772fd942948e9ad2d47dbfc4857d1d7594a426acc9242f1643d04ed0a383a89d7e2fdf53f204f8c85c26863e8c1de7fc0c9568888ff58bade2016a93f2a94e3e062f713b2269325f7f683bd65db72c0e908e39435fb44fec138775e26baf37c2c5eb5770e5f7d1173805cf527f3067cf1e3c6cdac72cd58ed06aac34a33d422372a2cca76db069ce57fc514a54c2ffc6c6c9ce40f28995b57089225ec9de6b5cf091875fe0b664442b5df1feccc261fa3036b0b", "0052", 0, -1077671953, 1537743641, "87ba116e5c157e7f32f313468638217b41597858a23c331d8ea70f7d79a4f882"], - ["030000807082c40303b2e136b96629d029dafbddb8c733dd3853dd9f69b5c8cadf43a7b69e74b9a01400000000086363536a00536aac410ef2dac9ce468b56289055cca81430063a42e462c8e5486199c714903ad4c4a5aa4e9b02000000009f4679f2f80d6c3b9f034131f9d0fb31141ac45cd12386ed5cd5527b498137f9289a7a52000000000851ac65526a006352ee984a8604ac75f0030000000000be7ad8030000000000f4879f050000000000df9dd401000000000365636562af6e7d52a368dc0300000000000000002fbaa503000000009f80441612e9987c3de3b9fff312461ffc0e366952bd025f3210bbf3abf51dd154c0d0e763ec2facc92789f650cc6d2272d57afa46da47e056ab8f44b4df51e264bf3051cc9283f9724632f5f97da7b04de686ddd5fa2a266342653b7c60183700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e2e623fa56cfebc382bc02d19ec66b5ff657d4b06a34014c7ba0da9891b79d5fd1fcb50c3ebf5b65056a1ec04048e309b39694d3f22268b38edc694a6b9b3577e62148cff43f9fca29e3fe165d7c559ed5e863d33c930d5721af80216055e2546eced83b5d8d07563460114c6cf48108eca7cd49fcdf37c1c4110f9a6ec81ff103289430a503fa3165d0a9c21dbcf9217296958fe97d4a588e401d325e1e346694031c955783120e8c3e77a55c4f8b5d9de65f8bec521a23512281832aef8546d1990a00f6a4fe7b4e784cd59fc955dd68f2eb930d15dd738f358e55b7964f8690d231152ec6f82aca635b17621ec9717f9ed54110baac26feb1ca62a5e9c91df657b20203afa38c8e233535c105f9c973cb2294b3e25a3af38d5b384927f1a16bbbae340303179938f7016e0c642a7505774703bbef018fc1005284a24e10b73c0d6f3933021ce560553d228249af32c2619d86a583bd6fe90126d00d27907048d6175f5c450315dd48d7d1f3aaf1626fa7fa5976a193e88782d1ce34f4b28f45dd16a6533b560200989db90942d1413155a4a672bb44d0e62ae1ec958282392332ec8b128979ddd265a3d9dfc8f16b63dc3389bef39ff7be2ab10a241919773256f614195cddd937ef327b2bcac64e268a5cbd592ed28ef1fea08c8f4a249763cdb925a5d1e80d0a9dc44f5075012ba580056fb7fac7d118dc51e08e1bb188c3bd2030bfec631036f9b002c17d35d68fd526af28fb559ed722dffb6641b6ebb6a589aa8ccd7e2a7763e8057e304d6cede712f81104f1015dc3295fa489f4376b8f96b0308de683eff2c81b59fc837f2b0a0b97546f73afca8be85063bec90a5b212f060f8feb597447e0cc988d61d92aa555d048f4ad3b6ade5a5f557f76b98bead227f86b5450a9d6e9ddacde750d0cb21ba9b4224230a7e999c926356de433184db4b168e2aacf6097acd8e162d51952f8d618588b88f4040259ff953df55045af8150fbd2c202c54e1fbba2989dab9fc3b9ac438ebd1c19e7efe71a7ac0ebf803cc909cd91277c4dff3193bc3c28ffcfa24802de90f4072b1203ce8a3e4a277609bf27a34254b5691b9840f91660fc61b3973ae876bf6e4186b0a60eabf65418cad6047be5e64b8408aa0f18eb4ee2017afbe8cf028e141c74d84a4ba5e6c6745e912dc4c055ab4d0eca25a1745ea8e13fdd3039312c60c6338e65780a128559ffab3b3fe06798f15648b244ff3e7c35c148002415e684795bdb1680507ec6138f37e6a1f5919dff2a65cc27ce730f47478c776f4a8eb9e6ac3217a8eb88172edc055e15011bf867d789311217e45253bc3e9f2cbbf5a92990dd0351d6eac78a464a5a6497dda0337be71bc17c63c5f6daac2c79f0050bf0eb22ad2f1925651e8fc3e079236f7de0e7062a747c5823016cbace59f60d65a8399ff756a3712ce03114a7b65552e586d1db47c3ce107663e8971b5e199192573215bf8ca1abe224f72023dc0a0ee7c4857a7712f524fb9b49d7737c96749a4f5489432ec8c69622912e7d0150dbfef63df1aa2a7f38631d247a0afe6eebadb81b9ebb0834fed78d4cef8ac73f5339b2f3f17d4320ce5673015b87f9d3b65f549b653034a50ae3502d130f7bd4800d4ce6e105589fd96bc1d729453fdc544655574b453014d742d6e91a1d460267c3d50c853c1546ba38580e7a1c3ec1c47460ab8a028aba1f455b6e2e925df826adbc3b79558377d46f31eceb0da8bcaf44caf38cf2bd073c2a8bd9da84d373570721d930fec88c378e98825f3d77510a841011bfd17e2bf8bc76c9690dfc29c3d491ded54b564a237eed496e31cfcfec7aae14810817e7d465eedd51336b8c82066f4586a7dbc528986f155324e89b65c63ba96dc5cef79b7ca541d6e611a9536f8a6f980e9fc45ef54328a7c38b07302dc609418047963ed295e5c456769275d7934c9622955a4fdf291160846a1d81753a3ebaafffd4bcfdd42405db09762611649ca97e1299161bf972db847359e5cff25308a663403eb93a88786b5fcb6e1927b904341c169e885235eb5abb9576de1e60dfaf6d372b09cbfce1590a11f635143c9a23003843a264cb06525a216906815af37f17c69ed3b000861f9c47dd58e079938de6495bb05e83e4f58666b426e6ae60a20bae451a078574259ad7fd0afa394a74cb073b56df6d538d33f4dc7f9822eb83936459024b37afc2adfc08644f863b82247f4a4b21b2af56c8604ee33929166413585b9408069afb65af5dfa0a16e4fe05548efa5829052cd95d16f5c6c687705000000000000000000000000d0ff9e9223772080291e6975f5708f2c4d8144a07fe8beae01c6c7f665ae5441f179d74f38dd0bcc47676ce64608205eeaf333982f18887cab8997cb54fd593c3bcdf065306ed697cea2a0dd0269b7b1616836be2fddecb09bd0908f4cc7fce500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ec6d0529cd199f6f64693de6332bbb79a835b8488baa6deeb8f3071e2e7ad185364206cab3715435032e4acab6b023f26688b1c6fcbaed1ff100c651068c02c82fb2445ce461045e3021b5517e05fc980f0b3b355b37c7b23cdaa7df1f7a99f0ccddd5ffae551f6636692526c38702549c301e70c9bcb2c5348809e576d832df022c85056eb0edeea71befd31d3d40c727fdd4171ca5b2479eb0f6c375e6d1a620031967704bbc7f1b2e394c09146a092b9a373e58dbd62bbdb249f5a5ea11bc7b920b04435da22d8a60f8d12bf398c332054853cdcfe74fa03b7f93f3d8ae53c8339d53cee7f0ab149c35208ce7233dcf3c3dd12cd1fb306a87e4b827936bab131d920205021f978fdd827e8f02cc920ee599c32c3d53906a5d2eeae2486d959442ebac020d68cc33d33ee4ac6414024607f634946d0866cf6d88955d042cd61dbbefeb1f031c8100efd0800f88aba8f5e16f4b40e8ef41ed5c9991dca23fe4222f76751ae30329682f639e4abe008760f7c9c88e9e40224005f72ba80508115dc7de28f519e90216a211623b018cf3cb3d942b83ebcd0e3dd9aba57dd9ba9d2fb51c48c111b79527894f543cc901c401ed209bb7e9c13e887ee5b35b12c56ebfc934989b7e712328c5ce72942044bc23d7a924a121b12339c26d32b9ddec3c897bcaf25690e928204cb5b059bfc3afef1582e3a2bff79a2b10c7efd1d579779817d1d1ceba8c31ae38f742bdf0e1b06fc24038f20b0763c6bb982cb9314ceb74f3271d0a79c30dd0892ea9b1fac4aaa3a1782765527b3bb18554c856f462021821a81c2b49b48dd2ea398242d8711944a06c397c0a93038b1c8a7061fa04ad19bc5414d8ae7ad898106cc5f4679edfbbda7ab9e7305074637940b8baf2dcd9af886f710510f3ef845f3a2bef593b68755e046d8a5dc186e3536d8387a798d0f9ed2782f91e3edaf02c8f119c8705b769949a46d00bd88c594c033c991fed044d47d3a54df8a09b72fd3fe28ee081bd376846c23d9d028e41f40e1fdc10aab82228f7f1b806400270ab566b390fb15a3863537230956f432c8d3c096f6cc09f9ff37a215907ae03a5ea95d1e56c2a1116774598fbec073f9bdc2bab89f8770a85b4a96d280faff5e7c6a70e879ce3f9a1496f6ae848bfa0fd58edb12fee4f0a6a7b2dc99f8f8785e4d6a518fd1f900a9129dad3be05e188f7a36ba97718b493a8cdf1c14d6645a1ebf85313de5be62223cd067298e631adfbf0ce9bf218ebfb6a26001d8724e3e1480b7ece11d694a65e1a2a84c1bb0625c010e734e46e41aa2ab4ce8efd0ab52fdaeda2507f32d5750c3a8e4352bd28fd1642d10aa4b963ddfa61630cae1f3e9f8fd4adbdef7f9c752f7de5a93bb63fa0826aaef97673566fc20848353d3e822466f9e7b9cf6c85350ea38439ba4a0d9398efd4e7a1f94c22b58508e585bd5f0a54ab231e8d8f46a789b0e037a5e541fdc7dd53e90e3b63375c80dd23d2ffabd11122bfeea22a949962b576233a54497d21bfb2296cc9bbeef5a74d387b0a1c852f04019273ae0f5442ff9c818b3ea008f5a1feadeb0dcb6d2189f85da6ae2b6254666e7148d8fb9fa650a101ee222fb47b5948bffdc8e7be99e4d14507c988dcc31e58c259a541260f2f5d4a226a8e852f9a0a6581d74fcdfe5543feb48d2f785fd248b61019252a18176869009b404bfbd14bc5d0b204c801c827f69bea54e095b11580aac3ed23c3dab1d4d3720afea31bed8a0979a00868937c0cf368c4ba5d5fb4b911a1be382a62251e9e96373daf9b159bf323e5ccd01445ae08f1310fdb33b4e505ad813f5bb8f19f8212015dc7ff624e4edeae14032238fb7535bd976f2e92e6a526d60e484f484feeeb79e1b5e51d08d04957d7699ed64c8638686ad23af071d475b522028d4709d3ff7f65e4a73edf83b4eeb4bf980f1f0963048ba32acfc2db7984fb0b1b0ba378755cf00328567103760980ff884dde7ddcf10bef0730efc1b7f215de31f3fa8ff43d0dfa48671a2cf279f5e0d7f34d04cab36bfff3bb75f5e051cafe5981f9426b888be1bfd1b95be7766d4479d6a6238a7a24061688ad2e92b2a7ef9a8c439ec7d209dcb4e2cabc446d2a3971990ad72bd46ff8b7567c9a860ddb6ab629e24de64283737591826205eaaff995849c4b12606b798b1b3e13b9bbac771dfb9a2538a594cd332a27678a6a39390088e2129312d4010724c4923a413209a05e563701e321fa3479ec4472c006b2ad4feded6dea43594a8f28c45fb2ba4c605b196de28ee8291b57832202000000000000000000000000c28e42dee2e7bd78479f4b5653fb8634302d69d05ed528bf31f4650485e1a258e9820ed796fc39a3ccbbff333de84148a89c4e77f6ab94d10acd8296540315e30526aa2e19a327754df1fd4c42f12c7b827854febea9db2fae5180c742c1dd830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027ddbca2c8e420046dbc9d6a16d368fcbe1a39c9cef0d4d5651dc4878b7797723dfb19f2b78b2b3472346f1cab3106f96e5a0869058023b957e5f1ec8388c8cff67c340e5ae7a677296e200cb840ea300cbd1d1c7ebad650e0a8c29f3ee4e34d2dbaa618f099ffb28e1adcf9c5d4e2ea0691e5c0bbbeda6b20b388421f5c68c002033c0dc1feade4f23bf20e2d80155047d4f290dd9ed5d8e3ac651a2fefbb7df80204a0096dd36ec8ace7290f0354eea1b02b590572fb8e753b601de4bdb3af3e460b031d04ba8d40612ab181456bed7061ba768299f95c1985e8cb7a25eaab919eeec88a0288045241ce07122374e87ea8af6cf712e3456fc00b54451cb275a0ae7003250a3acf50b874e701a616a9d79ff04546319007ad476221193f77969ac8f593032f736159a1479152bf8cc3c3fe76f70409d4b4467d29bdd7a50744d17976f6fd0216c1e6a3c293a5e4dd97be70c18aa765de339505722d2c468a4d204e40ade85c021033ac1485ebfc1caefd89d22ad43cc3af9006a4ae83939972795ec21f1567f3021948858af3b7e6ff84d69e88c16e0d3930e49d67e2e3b72db0046466434b0bb411bfa766e640d308ad32ac230b8b0c645dc655666fd59957e68a6f0968e05707cd866e1939601ac96aecda3df6589e75aa2559a1921d492b683d595ced24e46020ddc5bfbb904e053ba3980bb391f5bcb0080df85390757bec16aa9dcd239df86f9259a003be7ee452078d4dc277da61c674192b0ff2d16cf325b4fa23391b7f61a3a180b9ee043cebb0d02e8ad0372dd17b5a027d6eb09a0cc240919ff59f8411e2e463c5a25c256ed8ef5c1344043883cc437369e05b4703efed7c8dd18b2b40dd177acb4c24b8c161264f77eb66b66195cd074efe344a788cbe4ed246b7f674c150bdaef204852e262ae53251331f888cb33f12160a101f9d5bcfe5f2d2b058475e61309c79d3d0d3d2509d2e80d86bc067ac24db69f70b923ecef91cad9d53a027e62b981f6c7f27fa80367ad73040acccce8932dcf9edd0e4c12c358bc5d4e9d075489a1f520e2340ceb71c7d7a5974d70df0193be3a025de8eb3b86f3c9f204f6aea0add8819a62b63648e3bd39aa0b36957277a936f2918588222d7520ba84b63db99c12ceb184a6848476b501031500b95abc96a28a65975a2f9da385e2eb08025a85363a339b1e620dabfb04c92810ebc4f14558d5fa7b8460f3fe3489ca17dcd120d52a0979f111ad242cc687358b7c768d23a4d0e8d7407d84809bd014bdf1608df02d5d628dae15641d930c106e0082fd5d096ea5806670e8123289cdd1e00e04505d566d7744b3c20743b41562ce004160b3f38811b361142dda88e54415037af21dbd600ce8daeb7c4de8e636a623b6b601bce0374a929f63cdc90ecc6c9bb9c36fb1bd267844bb02886bf74ce15e3146ce0076f40ea993ba41542b1f2bc3b1cb7da468c5ced3885a52876dc20e0ee697182ec33c4dec25ed53c61a37eca82549a7d475a0e17fe48c946b4011f2510b03b464ced54f190a59e27bd18688c7bde68effe72fff4b75523cf87b1c7435174be2318711cefe86febba193ad5144813512b7a81c767df0f163ba98b33a6dbe4f6f1465be932068f21756557a7e17036c6db26ebd3453cbf5ad328bf7660067943f7e4edc89f0e3903839ddadc577c5aefd43d29124d38cfb567301045decc140f60ef97c3569cfa7e9be87294d867ed5936d35f64631ee842c6ed6ac0e7b2ee4f1c4d607f0796f79709c3bebf38f80bdc94ab11de35c82e2ea0ff62e56226833377b51aac96b4c61c44b8033cbd707b8530b3710d7b6314dcca40e74ace05540d1339b25d7e7895995cc6ef11ed891ffa8bc783ca776799e3ca024038eff9893e66033eba23ad418026cd26f989d60e23e85d1c640c05b44e49058988868bda573996e56dfc069c37127733e723452426f778a0738f84b982ac154b12b2191809c8978814fffb50bd3fbf94d344a1a135fc8455eb5df737573c469861687f2245d962713258d01d9fbe6d47ae3bf26334821bf811f7ceb24f669d6f380437aa896af27cc4541bba577e53cfd943861808612f75e4ff0641229a3b7a1f91186d44d4ea766e6d84b1c508983d09f2e269dbd89fd241c08b48c70628bf5955815c773fe5c5a02edd8856f8993719aea2387245292d1ae8ff1ced5c22f14203f65d8b0d8caa84c13a90682daa6f02c5e9294cb56b7145ced6f605ac7791e84a18e26659b68c09d49e9fc3c8f460a390a57611abe45210ef8856ec810a9319d7dc731dac09c7f0775587facecd973f60a5f04d98db2296a75f53b6edbfa4e4f09215dd207b93c69e9b94fbb31de364b5ead5264dc1e3a292b62a95050f515726dcf3af271615fdd642f560d7fe2f5fb4e9b5d8dc613858a963c242200a", "ac5100", 0, -406933549, 1537743641, "8e9e1dbf0c4413ece4062b59a5b47450a54b81632b8df36c5de94000458bdfc8"], - ["df07b0410311d52943f0b8ceb9844c0b54c4d668ec8ff2bb0de47fd433f34557b67424126a0200000009535251acac65525263146b0c35f3d155d5dd5dfb0a23c53674fda46e1049c4f7214888dc9693213b8d445eee6801000000085163ac52526a5351ffffffffb421a19ca10d07be18de051e6985c27b59c5ddd0fbb918d54fedf2512c78bc040200000003000051ffffffff032b3bac0500000000076a6352516a53002da2f00300000000025353fc65030400000000035351520000000001000000000000000038d76d0200000000b4c803fb2dab90614220861c4f14d84139f18a57b20cf07c98e7e9404ddd633d2a82bce0efccc22d2a3e2c6d1329d181861c9367663a7a64d262795a0ab03338dda0a65444ef940ab542ddedce32df273346fcdc6b7008f098aaef7ea6375590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006bb95d8d55e68a92060b1d43beccb28bc0947562738a630692b181c4fb083810cbe1f2c000e80d078e42b6135bdf10080bd5e8e39d4ad8454fbba60842b59c18beac4d6c3964c32d45f8c08f15b77f582516763b5d7683c67c61f14efdeddc6695c13b666f133fe45487827401ea54820403c9bbea30ab8f8b28cc9967da921c021c6d3c847f75771e6a446908e2ea9992f8c1ecd2f576bb712108e07af887e1bb0308d58e533d8718866cb9135e741bd3bf76e79b0b88e10e51fe095c561f46da470b04c04c8c8594cc0fcb69bc7e1d7dae6559e79990c46abd03e37ac2075b20385df93f9a8393436c74959a92a1396d63fc812e8c046c17baf85c8bfed8a0ee4860032a411a4a11a087d0f318e08ddf59ba2fb4ded2422d305bbffc9684f8333f7a370327b2b256a0ac0c76e735a07596ba46e12ba299672b9366560095c15ea0dc0fe303061375556b83157947a56952aa2643dc35750b680cdc549c60e7d2424421a245030da63d291cf0bb5771007ce44bc589b0452bf9a460e5778fd4b7057296cc51a30317b2a97bab829bbac4d875989829594fce81b0bc8c991d072910dcc86657029b59256bc2958531df56b3b3e3ab6928482f2a1717c02b37842ff9a887020028ca257deadbda7450c994555ed880264dd4029cffde8daa1c38301de348595cc0422a0f32c4b1c363a514f5d0c750f7cb66e0d0115e9a99c12bfa5fa7c79a235bc8f08a796995e4e0945e7d39a2c8d90421e8c04b0f76d53f4f7c6635f8a57b49ef71ce89e14b69526f3241c723d60959fb264fc76ead67e57efe839c19e993f1c5b7dc537fe834fc87f68fc43ebd2ee0cffee92dca5ed634b19a2f2037a885d2c1fd2cc18485c494b7f4518a096a5760c01890f68abbfc90e121b0974c4b2ed45a1df53ff36fb2867b183485d3c0e22b4770944e9b8d0171925267180542c1d17890cd4f46f0819845ba6f6c7b7b1e2dc8b1186d044cad7a19ec016bc4080060975a2f11c6990e9dbdb49957ff88e9ae983314870ea9bc0c9961420b9fda66290d33b7d7d51011e94543a4e900f4d39e68db51d664b85ec6592d728d3eef7c5b6b727b9126d907c15645a150d19e0c8f9fb62af7b4d6a8905b084c9cd50023c04e55d53083f06911bcc4ed53fa77a4a7afa6f44a67d0e494dde04b3fec11a6edb0b247508aafbf9d54662ed911166c81bb92541611f602684c0387ade94984d90b08e89ba50f6ba71a2e8e6d9b31413e39f297c1b67c203e4c086e90be6deb52dd0223647e1bfd42fb9fb577c318f892c3f5426d2faac0e36a68d8b02359d737230451173f5eea70dc1e7a8646fb5701f834062040d7b72cdcbf2bbb961c2d768069212cd6c9620ac2947a858370b33870b6d8a2d8cc0dc4d1340af1ed30c4de7a0d19cc79945628650fd0ae7809433b85a96f0d67f55b49f2429d5e5ef343334d6210d8d21cbbbc4a5554f30f3696e085030ac9e32ff07e3b8e61f44f0c4740c0c2dd1661d590469ea703e647c232ff21c4acb3ed7646d21c9b9a2622361b6b11a9409a0d4f872f0c23f6d08a952c6eab3ff8b54002ed1575e48b62bf0522cad6c15c3b58cfea4dd808d16db58437eb9c9aece39d95023fc97e30afe4bc98c499ee66b6786e399bb504110c2423d60fadb59ae2c6a7fed113797f5ef4e9c98d83144748a2edb14d02f0d232c174174bd8cd84190ad81d131473353c1bc7d6b8ca1805b2ca66a5f7eaa456d87cdfea465c5c9905f0d5f703465361710f57124880638a0ab5c2fe541b84e480ab1921a9c5acd8ecbf655e80d409ca738acb9cdb0998710260cf0398442967b05319adf210b9c4f31f2ee622b69bacfe08f3eec95447de03c9906404a86615b05d9c237f9e9cb79ac2727bc3aa70e0a9e6f4ac6aa1228f7f8628bf3c2505cdcb6269f1fa16eb4c8108642fbd1683b009303ffd081c26479e9ad9d362320b34fecb4ce40c2174698ba7ee3379a10d75d7628a42ed2129b6e08c9a46618a9ba4d9c1f5eccbdda9616438ea5388560a49137e0920e020d4d8e10a36345cb7fefcb11de7da8635b1ee62d2c08520d571a91ddb389247441bc4809149dc18e3b0fab2fa4b1bc00e010837270dcb2fdaeabc16b3be122a894478be23113bc446a8ca441c1f4cdf2be6f86cc0588ceac9e946c85113e66e599c39a5d5154b0e7ccd1b749990c37ddd58f3eec69387908cd3c6c9325664756b6361dd6a79c4a5ad0c3946afb8898f5116e2e8595179ebbcd90c5058da6ecbe0e6049f9e41fa1fef93846d575ad84592c279938be4dae33361234c4adbcdabad1c926c0ccfe115f27838f95e50ac5d150ff5f2df474701169f882c8e91cea314ad036d411c776363c13c91eb65a70457f55488fb0f581ca2ef0bf3e76a1e5d281553a305bb58ef4919da45ac2d8677ef3e07", "5300635253ac", 0, 320836924, 0, "78b149252157a8b122cf37907be593df2e3515776e13f8897160b113ce2cc403"], - ["030000807082c40303e31f0ea80b8de0072e290ca9b6889c9a7f0107b73e7d2a908d2b483a210ebab40100000006635251520000ffffffffcad7fe937cbe54420489cfedd05db767be6a88c7c59c644995cc5dd9fc3d7c570000000008635152526a655251ffffffff017ab60568ba2195b125ce8196725f34f46f56a26ef8e8db60215819707ce28d0200000005635153655337980afe014a94830100000000096a0051536aac516a51000000000000000001000000000000000063633903000000007374bae68b63983acf129baad7e61d535ef2b3893952b298ad97aafe1704cbfb00a3867440d1c701607a3b29c0d09dc6ca885db751337da48718d4e4a37e306185246cc647509677dd37ec16c41060219247768ae8f26463002a7aa191ae1d530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083aa411a63ccd5188890747da11b9c1d57de857d325a907e44ffee797e9fc1de739003102e29b55d7481e0b172c372c717b13d01e196fecdd7e3cfdaf66d0e2da6e7febc8403a78f19659f54661bd2f2bef64a27aada27a8a7d10a276895a66067126c9e1d6cdf9b721d58ed0cf0243481272d03c812ca40855a7ce9abf205c6032898bddda63f47d832b846bf8ebe2292978d5cd63f247c1ab79e21c305b60c360214c78556fa35a299ccb7a74c1ecd0971cd84b48fc3ad5399b98410f5ec45b5fb0b0035892612608240054714ca008e14ce207c726724fed18e9c9be4849253316b13195c26983e648915339a02558d16869cea73c9c7119e5010fe7732edc56295030036b90a5130353cd1efb1682141e6eb7c0176d232d04f2477227dffb05197a702014398ec3a3c00c92aa0bcac82e4b0dcd84fb5fc62f6694b5bf6c6a3a7b0b40e022c136e6496133ba79e470ae90acae74b8942c14b2a1cbcd547f67529afee909e021d0f05a37abae3980f8335fe6332bcfab7d6184fefa05ce21a63aefde8fd6a4e03208f6a51b30bc9db7f305b0cbd8e97bfd3ca7df16c146f871f8cbea0a5be788050145637185c1ba099fdf59787e5d84331d7ec7e59422989ef9225a37d3a329dbc14f4c30e9166096c2fe973c87fa5167359cf918982f10072ed8df7070c9f0a2d49ac04a6a78e86f15da7c35760e568a43a5c7ef6dc5585d9751254a8ff6fcc31802a8bb4a9579c5b516cedde8f3984461514229e544429c6d105db575ff8c88f48278d2c2efa8514011e41030cd8fe6e789eaefe7a6812eb65a530ad3cc4f9e9a5b52135ef938cd22060e33e6175b3bf5d2e3b37bd4367f36d091269a84103c2e521890e1c1960f2f96132fbb44af2bba6fc7a4fad316d56993a97db8771989c56e09b9e392f3336761b43f950dc7651a19a83567ae7fc3a245159715dce8a2b814b7c5aeef349aa1344ac202472550bdcb6ff42a565a8ae996b2a5cacc75a5c4f1bb7419995d120da2a5019e8a6e3551c8de8331f3452318c2ab181d99a752314641afb59bdae5216989ef81a05fcdee17307a02290d4b58d65b89a299c466b03aa1c6024aa44a301784eedfd03d769762d8b88fff1d76073c754be8f7d22f8a055057d1ba4083f5b32d2d97f570878d37607d482fcee1cd857cfcd29a5a05876b53d259dcd000d9f46b83a19efcf2cf899bd3c1bf7ff1f95749d762b5a3dd95886c5b832a93a2121cbe2d46d23e337c8d5a0774eef85d18b66a9297d587efcd4e72d015cb9b40c5dcb388e7aa1dc76899304ee5cefb8c05f526dda42d32a8994fd640405cd4332cb87dc07ab682d13bcada9e851f5907592c916979469fca8eb02c26c91a99958d0f55126b083efbd2c91a36bb46584e4a0dd36e6d041e33968ae9fc5b08437668519f57bd7a1b28b407b99d6c70466d86c82f70c5f33917bc6223dd492ae4aca115be938a6c8bcc23f0e0e90aa47c6667e9173d3f9cc95733b3ebfa1170abd51f7749057b4ef26461a2fcd5996104bf03d9bd5f10ed8cded7ffc209a83ff76037db2594f9bca24a08d2fa3c999ad0abce449d8a65a4ff86b1a2a2f0da14ef531298ed1a23250c7e338f3d60c666f171fb5d5aa79adf6f38a945bb143e18737b35711edce24af9644eeb9622501f5187b31de4d3361c1bad241a686c408d96f41cfb7d78062330c70b3af2ce76b7c935c200fef57755edee475aace965a36a5a5c00fcfbe67f6666e031ce013ddb9a97d9ed4385f7c58b4b1069bd586ac5ee6812f3c7424b9f3850581e04bcb3a3b5277143db4650c06e85601baca88039e61a792e179f8536e1e7116a2cfcdffc1189815d2253f3d7717b6b9a54282a31bf4e2d937298643e93d44d389cfc15692e0414c0c7692c4a6542df5d602d302372ed40a88729a326838baf63d3e7637577920d82b5795a9972e96801cd07451f985cb2f3452271f95d23fe2f945d0be33855908b9fcc014ec7572f2bfe7399faf4702663005f9beebd0c7266fb36bc2df74f7268763c8d1be0f1b0e4f4652dda3c89ae1e5015a55d5d65f776ddca212fdba6ea9e007e01f9635779f013b9b175d3dccb5894d09e1483f2d242ac9d44545275531ab218a2bb1815c9487e6c7994348244fb284f28a4ffad602e44771fcad5c48d31ad8d5f09a9f0445649e7b39bb7478d1810cfbdf202819b60a1d3e9eae37a64a0629471e134eabd8e706da9173cdfeb88fd62d1be6effea29740fec4bf1434a48fb0da1d8f918dffa50ea89a4a993c67018ea9eda504d6175ee5dfa199e8bc2a086ecf691ad4fad493293c00aaaca7affd099d0cf33e358731b9cd06c529235784672f202e0e276337b6be4c146ca5006ea85b1907523cb1dd2661b60d9d4515e983f73ae2a262d57e427561261daa498df9c895928bd908", "51655363ac636a6a", 0, 99045297, 0, "8be2cbc69337727c6b4703655cbdb97e71d6bbecc6d901148cbb55abe0ebef25"], - ["913c9864029b62a45a31f7e36a5ea3f569fe66bca71385ae19234ddc5c9d8d5bb45a569b5b00000000036a52650ec7d40e5c1894ee50dcbe055829e8b13a9fb3a228014e28650b4a15ee283950d35571e500000000050000006aac2ec7552d0308cf6b020000000009ac5151ac63650052514296740500000000010090975400000000000553ac5265510000000000", "536a5100acac6563", 0, -845805069, 1537743641, "594392a8d51d78e0bf179534693c63b98958362a23ae100685bfb6ac6b4a9247"], - ["077e04680362161ae9d08680a6a4a8e8bcb935dd83f3e50f953bd2f107d66c83096dca06cd0300000006ac63515163acffffffffb2aa817b9d429663b2cd5a9ed72f83a3cfd30f826288ecdd29df4c015d077c2103000000055351515163fffffffffb823f09c575b71b34352f48b8b08f6ddfb4b2b1e9bfcd4936018bbe753559ee02000000025353ffffffff027c0c90010000000009526552ac536a006a528b5ab60100000000040051535300000000015b18d802000000000000000000000000a51e58b1971b77cf51b360b3513b3ee456897edc0e56b02468502715b9616532c6043692f4f716ac846b15c418c9faed676c3c8ba2e034b69f8e3b32607df78ad351f7548e673d0fe04dff087b2123f1375644cacdd4b67c609a832d080965cb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d72078b353e9cb777811340c5c26e483c745aa93078a2816a5f6b7d8cea12fd33bfa3cdc54ee3a3e1c6a84a124bb724963efc1d2f19911487612e5d93c1f5b5576c3c546193bac550691aed7ce250964e18f44720df02df0f4305998e93344cdc6ba4873684ec2beb61de72d1eb30583fef25e5ab2ccd2b1affd9ca73a4e120022684be553e11831a887d13677fe493a8cced1a65719d45c640290b4babea315a0208b5dd60c63fca527123a7603f6638efbed90d4a7bc5242fca6b30dab9085d9e0b00da11a7ce527979ed45c80f868f1f0a09f05ff6982600383d2c361d12ddcd1ed89d176744f538d636c4363f9ae37b33950d8e32678db03b1de4c891aaae2a8e020b7e6ecf60f20ecb90377bed3fce480a0381c2eb5a03df7195ca23816cfe39d0020d59a44c533b12cad7149a1119429b0bbcf2de0fb39a02f3c28ce3e9bac4d66f021763b1f65cae16198490ac322b6bc19f2adfbe14e851198887263d21eeda2f5d020f6e449367b6ee7bfbe6156ba135a197a910d07162a2145001facacb8f3ba2610310caa9e66ef3c08261348ec1b116741148de0975a48be8ced65f5d7c88283a8200bd45e017ba20897b25656390295df348d6e37e76136b71bc9461183c7b45a99df24d6f8d04d1b1fd688875c9459663ab9f9af8001e8bc3c49ed9406cf742d376cdf25a6dde038586a3ac92faae0f51addb3e85eb4d80e93d37187f53b9e017b366bafedcb6aacdb038a8fb86f83f8c26bf815a63cfe3c6c68c7fedb586ae5abea7e32045da2deb78951a021b2da15b371406640b5a5837239625e4dfdc4ab0c5661c8e575f8897bc7b7bcf9cc92ea057e12f119ec567fd84ab599190667d014c28fe39868f5c2213d4a22bf98494b1c0aaae49679fd290f031664181a0317498c6a13be69ea72220e9d170b712e9ee00db07656c181ebaef64d10d9b75a7d3ec48d5c8bc1fd1baf09cb4df558bdec94e0119495acc9c4397993c653f446a70f80220241fca712324f6d7f56e76640fd1c626bffecb7972b51be641d0f93e176a4ba904512c8334c8a0a444e81dbb66012b870fc1f3febdabdede4cbc1e9576fe00a89ad1e60bf228e05a4f9083241151750b7a9a9d80c227b70c5c1072f7903dd0da4fbb9318a713b58e617aa5f910f9c830003bd2a22be4cc17475307f973a4e2c04f8fbb8222c0f53a83516b4ab4d731d55acedfffc13ee233bef76927109cbca1f90b503a208a1a3771f3f687a73717890583e6129a19838a3b0d48d3ac468b5c3ee97cc1f740612d1239366ed82560b777fc26279fc91070e0990703ecd06cdad4fd0115947f95d0df9f16f8caaa1e022a42a46e8f9cc7a27f35e95878cb20f941c559afff480dcd44f32d674ac2226927a012d93f53d75f17b92a32a823c5af98b534d01ae1090453b882cc05f5455b301be27774de23fc2d5b06ac705a87ed2fae0d736e7ae3954b7e1cc5ae84ed65a9d332b6303c412c158883b119bb3318f5349f243610b717366d7ab66ca90f2b1f209f0af607a16cb4a871e05608353e7e4d4c8b415231b445635a3aaf2e96104095685efdbb55e6275b547be8778e490a97799400a9f7e3712e49fba88883d13e6072190a0a0921f7607d583ba87267efdb3718cd7738e76fa7787080512d0ae44632295179c04761180c3be6d61f30ee2d7755de035c91d797f012ff74f39373b7f2a7ba84244cc1ea6d3a9dc47d017bb38ec4165e09cc408575c674cf1aa16114e64a32bc1ea5049758c2f37b59299cb8ab77fd52e95b657f72d021637e8cf17e73c35e4ddef18977c0cf55543fff0db94d491f73e1c87845b955ad8d469e89129fcbed38ccec0ee282f8188b8cd54f81673ac585a47428cbc8bbee34e4b965580606833f61e5fa68fbf200480d427c93e1e8b633ae8bea5d3484234a3f4721218a7e8f9b8b9c919a36eca99fdfbcf21fc10c050f81ae956300c1f2189a8fe255cdd23779656fa39c640daefe5bef1a9d22a9137b1ed5b29ec36597018f54330f4ae57c67b0b8818c0a07a24ada4e9c6b121f8f76f9fba747287d25ce31b7974f1d618341617130762d77bf3ee077ac6eb733f561106a7afc9bb44508c2176bd6d67cbaa6a1d6900c42bd89b07beb78d57f12c3ea024c889a38fca3d88fb25acf610a5652754b687988f64672ff2a7ef6f1138961bfddf833162be57179dffd0d5a85e74f9f7ea125ce52216da4fbcf13371613ae9f27c1ad97542d69c20029b33b816d1aec5088f9a52ed52caa4bbffadada98eb9fdb9e83a60ddd8bb4da7bcbb823c077bab4b4d1b1533785aca3eb93965dd92b0528a90ecd90d6db54a32245d940eaa6f980480934f04c39848e39ce2f979568e27e6f07d09b35077d32a46b3f827c217e609050d4163c36472abfbbacb3e6d0b42117de749b9fff07", "516352ac5353", 1, 221181554, 0, "36860e724b655bc51d5cd77e6c5b224d778183c6cccfa13c0365837c8758ca22"], - ["030000807082c4030355c398d577e2dd9f50814f938536dc111caa2449c33de54ffc8ecf10533cb39e000000000853ac6300636aac52ffffffffa36562b2e6af5f78f40b355a54d33214481c2f24f44c48acb0e5f9370f9fe9ff010000000153ffffffff2f6b6788cc0d5ea71403f4c4fd036c47382fb957577d03b06e8c1f75a177ebe802000000025153581a446e044f4beb02000000000551ac005351d67f74020000000002ac52ebdc04040000000007520052636563ac87b80e0400000000096a656a00526a6500520000000000000000038cfc2d020000000000000000000000002d0dd31f373177b1188dae63e91b7867ac08791e602b5cf9d1f4d275df14b728c6280f97c80b2bb17e1e1d5b779efb4bd171111d02c26545ceb98d9f98ed9af5e6a2fe2a4604ab3bb73c9f5f570f52a04eab0d4918f842312dea741c220c2a7a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004f4791729b1aece06bc7947f5d7434b154581c2c3c44091ba68f4fbe99775636249148031469c90b9163cc7379efb722b454a1245f65e22f74d92903a0e418cefee5879601fa216cc2709d42c9503bbd65f517f79979ee73435a3857e22101747e698948085f7ad95e573705e924a60b4871dad415560696a9da7ba4a6a5721a0307d3f3b1486de85762e5587d396b9b25369210f33cf68b732010719cf2654ed602023a9fb4ea1a60ff890fb202330e76d23de239c53985d4e857d2c449b1aa51f80b08bbbbecbb81f5ba256f88c16ceb515a7da5849d0c9cdfe8d575753b3a1195e9c9fd93e59731f835b1b5e77a4dbdf9f42b1d7f235ee51684a108e23b6a07b84d021964766fd97e835db36c40f327f473bfaac8e138eb21634fc064748085a4b59302189c506b249df9c74bbc6190aaf620a6d38c74443edc7f563d37afae8807f53c02099c17947fa55518fd9f941186e45ff9a96d142a13e9a047557af64289094b27030968ea30ea0d6e5ac920a2a8c10d09fdaf5d5f94341fa6f593d91457392de0f10328ccbc84611d3f034bba108dbd5da757f5c9c4e922aced76d7cb0eb9f963ad8eb573de6f6de5289c19ca1587c348d4bac1db2a3bab17f91f1c9d2d33644440b328d8f9af2b6346fb8bb2285d6a75e6411a8bffbbb2c7488eea3b7dd33cf19c68cc5e37088a1a945bcf1dcb641119693d126cebbb178577b7950fe60a9c15469981303422def12736042dbf288f07ab69ff1ba5e3529186ab6eff28969e14bcdbbad1a412df4bce100e93241ef3a37c10285e23955a9b1dcb47f5da68f9b554f8b81512ce8a5653f80148af8fb56d63e54ecf0575e4a12ef343f6b42365801187cceff280327726a2b7942802a5f0d0a3bdf36880e44b42713505605d3942322777693df740fcbfb1b7d84e045f39f03ce6051e7aff6a239a9e8dfef23c2e8d4c64d8c80b15b537391210e5110a47e5150cb02652c77651d9d60e6039763fcb5a1e80a21162c3811ac945547a1f71551ac474a6986ff45d75c3202e468087f168a547fda0ac731edb1a820a8d0d018a6c104881af33e6d1fbf10f97cb6ef85dc9a7ca3d8a05bc63af27badb7e1d49b16e56dfcec600215a03741027ee7151ec178865242b35f3fbf27e24168f88bed4e8252ae660d85af9b8b494eb8d13fd58aed498bc429a9a1d0746d8f30774c3330f9b18e479ea3e26ecdd3852d893d7b5d8fc641e588fe9a75f2f8ad0a9308ac316975044f342946ac96af2e4efb68af8a7c819fd2ebc74c43624df5ef57285cadb242d592a65db43caded90cf8701b76cc48849e8a1dfe9d1b13a747afc4ec31132ab68508b7a6e8074f514abd665c6dcfc999d9e46281e19b86d55953820eeb3ca4641c21ac797bd70a5f033c5a1e13290de9c34ea5631a82bcf35336d7116ba81f86db584d289b3d7115918ffbcb88f1a32ac5ce5861420ebf0e51f9360a1853a5ba5aee2cb21376a26a4a447804623bee0c1bcb15b4a7f0404af90b7f121747492c6f124a1fd2b8a6b93012efaa09f3beb4bd627c694cc430ec273d51a012b88c750c96924f16a9c777d48c0744b6fc8ea81795e03aa89ed6f7dfef88dd8b0380c7d5d9339afcd2522a2ad7bac5c2ddbef22ab7f100ade889669c76696d5d1ade6ed4f20462349e54e86858b7e118d5a4bb998a39decd2f6d1f674c3216e95059d0e358a63a89ef292b5b93b174fe0173e6761dead6139a0b63046d6013e5f6e7ffc341f008770b97d6206b8ae82d98e814f33fcd68f20efb0647c685c03405f33c2906ef66dbf81073951c18163e2b391ca7a519ce6ecf08ccdbe6dc95b8037b26c65e5eceee48a8996cd22c331588f63de1fecd55f8cc6926ed68348893c756ebef3cb34be9e3fd45d8894d747270ec35347cc5f61c03a72449324da2589850f85686dbdcccb7baf90732a5388e06ef23b3425a337ff99ace4df883038f8de3e1313decf73b580c6fbdb7aa1e168a29d36ca6a368fbb8963d4affe088cef4ef526531af158ae9091bbdcce6bec2c41bc226fccf48437388097969dfc444cd9a71f96d0d76939bf76a235b341427896fe53ce3c0d52a341c1daa06a0010e3ea135796af76f1c19e418c9d919dbd4b85986e6ce2f6b655eabd029ddd05d9f381ef9efed931910e026f487a3269a68fe07e3009009f2f973a7ef7cc13187123d28184e70ecf6c703c9fa96ac5fcd35934d8e6e74178fb744957bb75d7ad9ed537b81173cbeb69e01c36d8d57ae4f243d3484a6973189dc7923412a78b5940f3a8999d5f33b03000000000000000000000000400b14cbf0d3c7c20221a3c6644d3d5cd735eb24b208baa2044f9a669d086da76c74dfcb31195679e2b86232ddf18459ce2a5673df0b32a22985685c0e8817ca2a12e1a1014e969ed99c05de0a06fc1ae1790add8b15af6388c9729251638cbe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013efb8d62bc10be436d80dedd1e1ed13ff42f48de157d3a32769d95f8bcbf32c79fc46ca85ea3bcc166a052c79adf306b5950b82ad58ba6ea522b9491db87c95123f946716ba12bb287244476db0b21c56310449bdf12d403b3b30b00c8a8192a6527b57de2123a5310c1fabcbbb2f1017be1f9d40718f9c039acc1b602cc04802098169f305d210eebd249a2b7048ebdb8f52b10a3b3fa0841d486789ce35b605022c0ddc4e7b95c9c9d9eae7c4dd6ba2ee7f7611ee5cb8ce8ada8dbd1fbb8797870b06b51564445b5669de107fa4e7cc91ad2fbf69949b92f79dcae00b93b457dafff0bff1560871fa2ce229df19718fd6769b5c44074d1736a83913ceed043559d0032a973b22a5d77cf24e00e2db3c46aea618b29090f0d9d8262c018e393460462a02186644a995232a993c5be69139efabcb3a357ffcbd2255f9e927db4a2dcb4e280209aa9995debcb05f062cfaf4eecf8ce2c0162056d28e1955d572c8c106956b180216e3676d8853087615cea08ce4ce4beb2038306ce320f229fb7e08ad38480178021d2c986b4f85da89bfa9ba241697b6e061afbcf5eee63991a0f42f70f99732dc848be82ba7959a0304673170a2690b3d584282eff0f24daac0e02ce0a0d3e7f7e3e7568eba1d3689f9ff93bb896a42cc366e7b3af37b33ca5c8ad08c7405e7d7a6338f258109464d96e07627e8045c967ba4e108b0e30f4fe813b6951fe9d1c512ebd50bcef87e7cce33c2f598d5a30967298ec6729e356f481af5b0a9278c3ae7f3fc7b8a767079e27b35de840b918c80829d395564c9ec5acfa618083eb23c1b7d0f8f3e9c48dda54c3505d97cc412cfbfbd8e34c1ab0e46347857a8ec272b2376f05873dffa9fd8cbcb3459d43f584be23ec2f526b738f4ac2a71a14aa1c3543c8ba38170b3cc244078cd72bd9a1c48b047cf55034d085eabc18ad5e991f77f52b328104856ba321b663bea0e323c1f225607f0c78c0efc7664098d300630c105082f50e35453121a8c1aebf4aebe60dfa00b5c23cf513eb9220398f567b44f691fa2b94dfe17668a14baafba1bbe21933c4e45c2fb2443a3ec02d49cca4c7069c6bd9b1db25980535834c9f0152ca910d04939e3c1091098e8172cd79fc6278b9958077f90c01c691d2eb6d67c5385d895006dde3e49eaca6c08a60892d7f3cb70068592cf03b11eb46c0697ed0f7344d2d76a7452879925520289ef318792dd5afd897c0ad6b2d16c5155b63b725b146c67f0904e29478c9ecbfd561cb00ac67636850aa68159c1b43c3e218e1d122d62c12d4e032c25104616fa3e9afd5a60b288b9a17794ddd769555b08590db2bc28f9aa118d4158bfec6a7353853b5e5fa93d685a573d3436aa3c1fe69605e23c9dd6f7b59e78b867679fdf9981af8264775a8f6c40c3420e647dc451247c0d51ceb2680fd0f8723096f54919c32b571c53b06c3e61c819b389bdf3abc1375b73cb57951b1958c5d4aff66099fac49db4950e004e14898474b138615e280ecb81da97b965705d0e24aabb57082700d9ede70d8b1f7ff71d5260caa80e4202a3d9234a211abceb195d7abf7d7d963d110ecb8738d077ae3a07739daa6b44d130ee332c601a3bb7ff87ee887d6d3349f47a8e7c3f956277c564fbdbbe4b42735d0be53ca19e08f28137b60503ef049ebe55945189908d383d9948fe589be188471b45e673edcd09ddc111ca63cccbd1a559a5e1264828691efd343c382678cfe00e1dff10f32acc26bbe3cffaa3871e4c987a5be1f579bd16a37f7b871735e16529c49ef489d82068c4a19034d49d080afe83cb17585a441449b505d67f215830ea8bae0bf1461d7a757afabced1c0378354c1e6d11771e486fb6addefc07c35beeb0badfd4ae53cd1994b011d672d145d334a91aef690b179fb6300638c346c2b2f0fc29ca0d6e6c37859e2dfdac472efa05aa6c5a47597036929bfa2d4a22fca03fa8f8851397c3a976bfb9b149b27ae29c7612eea9f5db3d99ae6c314814549df0b0f552e9c54036ebb064a15d2e6f46d8f58de49739e9507d3344fff73ca641f1d7d908d47e9752db6b33cc3659ef01af1b9b0b8705556700c6c0649d08f30394d1eadaa76f324250f36895cf4454d12396889dedb2cbba3afc60e1bd6e9a21a73f08ccc2f38f2d252688f12bd9809b136d9643d123677f4e868ea8c39c9514a708d49e6124c71e2afad1f435f5893026e79209b63cfa40d1f8c13fa682bd74ad313dc2a7dba639bc229410a5e8810566ea8a7cc46c31210f2a27c6a11b08ac5a1070050000000000000000000000009b0f6d8289f76f33ae3e998bc54147bdf916b44b05b5014fe1563745117be62fbad5bf7acc47f72f613c163b1e82267499e2b24cb053f33d79ea8daedd0b6a9703ef2bf8dae7fd73fee6cc353d432063e52f853e9f5ebf3b07462c8a510365a400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cbe0d0bcff0709cedb745d661e7d51e7e44e41ebf3bdeb7e9c5526c30631875ab5d4645bce3e8f92c4f2cfa199585b97e331f2a70c8f594a707a5f5d6f41675e5da2488e67f13d4fe92dae26ebdc8ae8edd62af73e715bfa9ac1f43fb8b3dfee4f51c77633f28363cae5b8059871a338428736a3464a1327071bba71a8b35003021a7bf08758aaa4ee562dd4d6d5d9a7677dde3e8920775187fa8a35f44a5aaeb103173edd7dea0bcf4a17b4c385d57e7d6dca126298b28f7fa4cd2158f5e843656f0a07d11b9d394b1acbe7cb9db19e5936acc1aca2661af2c288cbdbfb717a1bfbb9c6b490cebbefbd6030992daf67c7d12b54841e3b5d8dce6942fe668c206bb0ca031df4dc211f95c486b0937007b1e6db3df374071f8a44e939159b1010cd70a13703280212273b12a2f3f442586c30fa8254a451b5482ff0446ead30fe8c3e704e890323846e7b400c81b1648d3c800d25c3bf6f5db81d78fbd24ae5ad6f568252ddd402033d91251a02770e205c975c89bf1fc18ae9b1d1e1c1dccd2530abad7ed73fc7020adebc9cd5b345502443735f168dd3748e519f143617f17c39d3c4d36f00407fc7054a9f9f8cdbad27ec9598c3d34e4ec315feb57f39556fa84ef67ebe8b77eb15753c4d9f2c3005dfa6782cdf269996f31c2721c3c72c816010e02d152566d9ee5022ec8f99c504c769f7ecec801d104f461b965cb55a35e2fb9d9027e9f686351a9764c2ce6a93c480cd60bbae0f0bf96c916db274d842b5aa02c7e83cfe1eef32a3955700145db1e99940b33f20b45ba3f82830b1c14d8a3273a0492434acaad9ca42a21418f66f3ba227825c07c744b24d915c26f88de49c70375c33fa7f14e8a6d504f0d30cb599e7ddb88833d065270dec2f7effff7ee73fee142bbac99fe184a87cb6e4c3c99dcf4bed8f769cf2ab6f937577b545b04a185e32d66906322b12c25424e23c3c320ac4571ec2d57068d76ee85d7a8c74bc8c853554f9046a2514641567f702c2e93501e755b6c5c5c3585e442431f57dcf02ad8d2e1bc20c73b0ef34b767eec81e0c2751cad7e065994471fc88e43ebf480797e316576d30bde2f444ddb1634a6fad87725ce11331ffb3965d5a272ee62d828cb4e8f202da04f443ab7be9de4521b845136e249e25499764fac24e477a8e8411a6cb62ea7d863fa3eed013958bc60daaa1cc8e1d6939fba237c5663a0b1cb86b1bcfc2ae67a5fc9c7a20bc3d6a7639902b765f2d78330b9c716bad9a6a6bbe4700f2214547ac66cfc718e03f0dbc620f873c750353d50185a38537d4028f50603569594a485d587908a2d6eec6c06c614d8de9969db8ae4fe4bf17c35520408bc3e11b089a6cdcf020d290b238171d9d94f67e3e361fabe319a1c4de5fae469abd0c2903b16b118f7283cdb0d4120262e8c3e04832b9a9aa7c28ccd9e4807d049fa01f462291874ae21b30d64bdf2490ac387331e4f14202cb13f7216ddd9d8c0f1a31fe6f619e0f5b5c92c89e660c7ed67cc6c2551e8316bdd635100ff454192c9f19c93e6e0b8ecde9a42a2264de4c1057f422a1a775e0940cfccef71c00b5a897acf78689a85a043bb97034e791c47f1a5aea9a1cabcb00a0081a445f0b2f4842aec8fc9436e396731630b4ba5590935eb01c67a1ccba3af0bd9ddc41656416d4c4e960732ddf2377a36dc5e5165d5b2eed1314eaec7aa60c27997aeb804e01de63f6090e867e94a6d405fe979391c82e62b2b0c27ce79ff5486c36c4471e7b2d7e354c2a1f81282c1cacb0b43147c5b21e6cfda8599a85659fef99b61844d400318d8cf02e4eab7f2e7f0b5d9de110e9039ef9aeddd4b8de445e3b5d97065c8a7284e4eb6597d35af6b31cc6d21377717d3696bae06d36b7aa963b0093df8f692cd137bdba8761b7bcb350c02c536e84349148cc0dfae406f7b4c5d974bcec34fb03bc44110f53eba89033edb2c6b49daa1e3433e1eea5d71411dfd3c06cb5fb31009aeb53f8d6ef1eaec44d41f81c4fdc99730c5712cd0d5832211f23edb6c3fbc4c7dc76c684f520a106b0217cbdc18370b3c6830d9f9cef0df253ff4d1ad5027dee3540e88e465d6eefce363cf73b4a498cb438ed0f0098198a229ec25ff61243ff24a2c921a557c08b18b20b766a37346c269116e70c64030d668f7fc479ef3927b97ae9248e952bb699babe5b589c50374e89004ada0cf85f3533e8152619e673cf9c97049dfd177198ac646ee596f54d8211117c893107d5ed19e1b58c664e957d5fcf7284972bf07b6e9bd96a845455433ef7875313cf61aa586384c1a76647b067869db3d35d1ff23f3d30d54bc40834193fbc32a572ad0ba022567ebb722dadcfa9a667e4a586aad3f8064ee330e0fe6b7e1667bbb32535b58d07c65814d470870e05637ad8a0c04419ee8cf61e2d0c", "ac6a655251516a", 1, 2062899955, 0, "b2f26e48aa0f534eb6668c1f1479c166aa3abe1939da36d8810da4fd7a731d11"], - ["5c04054803b922b002457917d95ddf79741a2553d5a1610c67c22b9b6463734d56dc48ac5703000000045253526affffffff10b32d1644bd7599b830b15fce4b5b4c6c7ee8610ae3069551ffccc26a39c9d3030000000151ffffffffeff3ad84ca40efb96825b6c2b53e6c80823740c6071038fbee2c88653c7bcfc10100000000ffffffff0364cc7a04000000000853510000536a6500de562801000000000600635352006adca8700500000000026aac5cc9fdca00", "63526a655353", 1, -657018171, 1537743641, "e583f2f9a50ed8ea4d5d45f39f9fef9625245187efbcebe8092e27d03fce4ef1"], - ["fc4e895b049bf813e80cd09981c858b95456a1fe194ad33863ef46df849b2566e4a436f34902000000080063ac65515163515978ca10a2d5d7ea0276029b8755a3774094be3aa819a4be6eb1b35580b4b3a7e43ec2af0100000000c0f5b4451cfabdce2bce4054cd233807deb8d3d8d42c73b824c668f62679ba1223150d7000000000095165536a63636a656aa181e65e68851317a5fd2ddded0fab7fb13889fc37ab02a9998678e58f5722e4ca5f0bb30200000005ac6300516ad9bf8aac0320d7430400000000046a535353daee24020000000001654a428d0200000000036a6a51000000000180d214020000000000000000000000003c3bedc5a45609cddf3b0ba52988a3bdc538c3f6029f319cdb9b4bdec4f7965d25873016150d5d290a5ab62961436e23be4dfd796a28645c0ceb311ff54644f8a86fb9ca133aa9e48d516c3b841101204aa31084180a695f493f26c27b76edf8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001517c967b7c4062e173506591d95ec5a4980836884870d0a17b1031d7871a7457febae1735b3bf12960e25229804e3dcf2345562140cf3a3252d9041d0bd70a2a3b53cf6241a6ebaf5d32bbf7faf449efa0bda538a743fa65f51cccaff56822a56c4e0ad911d8f28dd32ad685c873944310f002cde32501af451fc822ca8a003031a77c99b721e15172ef66ed6a0748333656c838bc3d4e666d3e601f2ffb977cd021230c37548ee655368fe062c204a8422ed67f404a8f6dbefee28e70e087d90740a05392a3902962ae2210c5c3d94984777b34c48a089a86467c5635306cbd3ecdd284194dd632d90736fe19c29842894f7e7712c143fc78ec9a18a1f060abfddcd031ab924ba1433f7538bd43a92983f441cbf3bd9741229c712e6d1ab9b1b72111b021cd85ba5604adc6507eb1eae0d473e58dd6a6195c2657a9959a86a55f3914d340229470a70e2391b8a49a4646e5aacda74aaafb725adc0e44780fefd86c367b9a1030a2cb3d38300d0dc8fc469ace34300e855265843a8ed1ea0bfe0266d10672af2021c5d1f7c857f82b92ecdf3da0f012797b14658aa2cd14cf16125d74fc8843d69c18139a1c7f6fe7f6f47507a6b98af84770721ba4d7c1bfb8677b2473c36f11ff70af8da7baf3522e0c63aeee10a2b99dec372929e46a349800e7c71c6c75301bff9d0de2b9d8f2df175248b78857e65e52a16f88eeea5bcaaf2282fb7c78a7e776f346abbe2b0ec480f4f50e483fa42d23c0f6e9985a4d2b94863388a7b7badd1ac83da51cfb81283238d8a6d50093e41e1e7175f97b8c830ccea082319e43eccaba5bf315008a3c0d205640c8229cae486a3efbe2258b4992e95aa11619eb02adc4b72cd006d45ff2d137498caf17c0fe2fde6d6bc3f15b250fa9d9d9903b7d8a84e7f6cb96d3b232ce64366e6051a0cc640b2f7b017a86c8c2d1e5293ec4789d30ccae5fc081542f490fdf1096934f19315853e129feaad5f5abe204194f11133c53796dd371f06b7be8b4302b5d9b7485aeacfeb06a2b5779ae7f321d487b16931d9cf2573119ecdc9ce85c77af8e32704bca85e8f349e10b407da31c673d352143545831c7ee092ee9dcae0555956235638e0f186d03c9eed95067ae783c499f6c0b21fdf81dfaefea276ae56135ee6e388ff314ff6f9be6570f2af20c45f3bf71a40dd414e59219ca9b8f41ab6b64ba12efd82be03f9ead12ce81e442657849adc4e6258f0c7261db42c6f82c4563eb3cb108bce1edb0b1e562c700a0a2e558ce6af6fdabf5c3b70fbd24af9a2bf27004d196d5659fd8a16d8c2f82b2686f32d17bd00d024eec3b3c6e91681885271a34ff9948fe5287a0ac39e230df0f0cd77d21808814f97b171e0f9ef0d927881f8841d57877ad5278b3e1cda1a79616cab61b7373afd1dc15760280a25cda4605e2da8c5533d9b84e24a67f871687bc112f0dbfc8a31c6255733d8796cb1751e264f10525fc7a3f259a714ec0b2601478c7d94b5dfdf9d019771802ece69e0841fb24d3a8f5a341d801a13eaba31f2cea95216d8f16f178104e49181f842502ac9946692bbf6db8d508588035ad6afb908d27e4bd7d76d4bf95db7cb743f5ee6f92519dabf9cc78212aa421b959089226c08a41b6150e51c4be2c992c87d0339a5715803f011d4c1215a51968f7fd4df9e38b89ece8db702d4c1453d8d4e2761d74171eeb2f998f78a781835179cb40ca62be45b14c18349a3310dd5ec75c3c1c254cb68b029f6810402ef35494251b8916576137a674f38171a4ae8a3f610eaa5b22efb000ee0261ea7163d93f5ddc5758429840718d2cf943da9e6a026fc8051d78781bfb3ca0bf81986a9a6132cab9ef4cab442a97ef86bd7fefbc8c56e449e2d8ef53af7dde3d857e31836528b54b765940aa5ed36af6705950bf6ddefbf95ef05d32c36a09f5ebba749d2c94fbc5a566f12d38b05b7588eae538d0f2e69aea0e81f079a6787fc2db5e5f316a1fddddc12650c0558d02bafe80ac933add8b2d517ab35eed0e61c026354c1186dc53e5fea4e1f21b6205b352522a55f2944d823c95bbee8844c6f114f53e7f2b483b93683501172837025ea976ea5d3605d107e4ee0a5033a8c558927fe0d5ba5aa2e22ad095190f59478bc2f87c7b7d198c56a9caf2cfe00f6eaf3773d349974b36e67a8eb82f9812ecf5d9d6d71f854fff43458728d24ee41e2182a1e4aa65789e26e77cb95a4131b123e216d28cc2b46bd3ede0410378c0d4bf5197253e3a438f9455ffc9c282d5038ddf504b357efb06637c204a42770373399f503cccefc40d42b07115736a57cb22ecbc1bf1e65642ba31208a0cd3d5c583cebd4b7b43f0dd2f399890a9a4444f7d064ce61a8d659f08d985710111b5d34c332b5e607a067098818710a080337f0053f69fd660807", "6351515153", 1, -982982286, 1537743641, "2a6690cbf72f41975fcd8814a1dc496214cfe05b96263e40be6275d9dc377872"], - ["36d2426e045de22f7cb76d61b0ffc82e148c31f2804ed66868ad7f0d627a6e19ecfc8a63ac030000000665ac52006a6a8088326b8dae600d2886a5c50e0e84d0e9db69893cb39edaae7b25855a9dab7fe191746d00000000000ff0c83b91616eae5a9169a99031483880563f33d9c43b3ea0f8e264ad8728073c03405d00000000055251ac65ac0c9821172bd0ec60ed50a0cbbbe69bbd4985be6ddddd1241a2ca2b5d7688de71ad0e4b75020000000951656a52630063630048d577b1028e8093030000000004526aac65035fa202000000000163db70b45e0174ff2003000000000000000000000000ac29d630d8ce808d72b64b224b263ca42137df11c74e0ddadf8d58fadc3f92ddfae09a19143bbed9284825fd30a18128fa58ae4efbfccbdab1fab1940101bb51d8603bbae1a5763f83723a3904904f881d7a27b679139968b88e72b5a185b9cd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b9542471a66bb8b93ab8101f4f097f9a2321241fbdb5708e7f3ae8470a3a9bf0a80cc2d5d505672b7199ebf079edd7ebe07bb5f3138ea436002a8071757522f050f30371787734d860add4d61da8996b76e197f8fa7afc63e679fb29c3753d1a5183ef7f65595b2c515f5bc0e5599e0254121cbb1144682d74542a352bfae99022e915f1189aa4eac7f7884812101083362e43eea3b9b3fb79a2f867b22508e0f0201092ccddc217c864da65e52602cdff9bdf0a5f267f2fd01febaf628099e95f40b04aeca095b03300f217a47a06a4bb2aba235694ff07146aea165b02da9863c3738929915a8834a0c2e03a9d64d38b77043d655172303c787563033d2ea55892502123118a6efdc9d8cc4ebb67063128b982bd837e01e75c7986c2023eae20ce22f020e2644c0d1191127d3212f87d973c51183d9f9d989505975ca5c3d777cc05c3d0225548637dba33df60afa689ef868d4f44bade5feb0032a1befde2f90c6b9f3f7020a105905935aa067588009e7ac36478dd5c8b8956ea83ba88ce70c5213ca0617020fa72f2118fc7e4530d395d3fa822cd6a4f7a91df8af4e8f8ee99de463bb693d577da34bc82730aa7649678b20afeb7d918a86c0909e8a9d8af2e04c3eaf68ac9d0661c1f4314dedf534e132849cf78334e55d7b2df82f22a17711afe5fe5b0860d1a06e98ae003085ffa127a4d44041afb87323709a1e9ec8ad8db80037c5e7c3dba791f5bc4b7236790cd6f2ff3ad79a5bafcaad095fbce70dc90cf508c0e6932de0558670ee8331e68786a135d404b971045c324c13e995ea69b138b195fd9ed456ce556b6b544228930f8c6705e937038dd0f9224b8fde1c2fb01d14d7993ffdbbd9054c43456aa38ae8a6d76602dcc374e7981a736830f0d4eab0a33d7250b6ef9a32b54ba677e8e7266c077386c462934b0a33cbbd24d63288dbfabdc91042939b714e0da072fb05a598cdba9bd452fe9a9dcf8bffc5a4a5f95db16f18d5910188d5e3bbb0cd28a71223c08886f32bbbacd4c8f1bc608faac75e54930d5f7d062d4b7091fb3f34f8cc36f7856bf54c8142f5a972c4fe614588521a9764674e45f734c9e4cca58c4a9c87fd40ac191e217e90a731b3b9e43fdbac9f2f102dc2cce6c45249a109a1f1bdaf677e11470df7b7aa076158474e8e08466bbd59125bcbbc04c49542596e9fe75bc337f92c487cf415455fcb23b5cb03b5fb998510600df6d0e91ccdb332afdc98260e96f13329b75a8566952e87761d1f8336bf7a16d9e79ee14c6de5b88f5f35492cc61b8d09cc648da3f4858320fb3829d4a0760179be6b7537b1e56714e2d85bb0fd2b5c1766f09e0acd727940156ab74b667f65537123f7f20c2cd7d558cd7c7f9bcec4c90d435a3be23ff42d976960601f77115a42b226ece2c6e5e3be8d71173d3838e5c1ad825614d12392e809bdc24a323d1746f5b6fbe2f3f58820202db48e4cc20520e19c5fe2fa13fac33e883ca8a7c7d23736082faabe99e04a2dfdfd13120abac2b53d9f4548fe6da08954365943143850056ff9b0f0351622a83e6a75def375105d287f561806b98f9a5aab6c3a579ba7bbbb27f59390a8cc1b2da241c4c6a2fc85c30540b9bd8b23ec25eded5bcb65e277572180aac553f6b0bd1d17043846653e5a3ed32a58c0a3e54454a5c551ebeff5092108ab9245f3a09c0acf874e55b85be2c8b90290449bc6d110e91c905a22f379982f0db822e76da58dd741bd1343dadaeb6ac7738120b6e9e95219e71f2aa515d7521cbf7611ed403b17290d65d3572250257a94b21b267c5a99dc069227a2500b40b81e5ac868e6db3716ca0c7c4758cbd7a0ab5fa52ee1f5cbf1fd41feac1287229f436e7ba1cab4a14f82022bb34199565032feae05392221d1f78873aee8f4537c9227b1e47516a0f7b2556353542cfa40d5ac18049e99c33fc4552bce168cb2e2f864c73ae47dd8da219be01fbed02e3c2c465ec9e0f65c7f10f2b1569a843bbb84679b9b02e2d8dbd32d1df21caf33237e7b9440a45e08c23d76d3651bee1d8fc7760c0cbbf56b299eea23ab32ecdd92fca3f7a90890ca227de5ec1ce809da2662578bff9e5c679f6638e12bbeedb32346e5c99a2dc6b63fbed7577f168b86bbd2d2c086b095fb9efab0fad5be6da830fbcaac5e238394917e7d01a2b269b45829eb387f7f97a1919dda6b60330fc4dc4d7dac599008c834953b04ce1b1f8f0fd1d7284b7eba92b042f28c8364118aeada2c366e9251e826267ad1837a35f23c512c299645a4323760fc1820b2776176fc27fe283194f05862b20d7f48b7f235c7e59b86b75dccfeac16d1f6248ad1889ac6175107183952f03e5d684f588ad06dcd6c55f2b36e0edce1231ad435b9397cb32042f5fa05d2fff8620fe6491d1a916398dda24ca9df0b", "00ac5200", 0, 2092938953, 1537743641, "c0cd3b44d294d69c83bc9bc398cc5c381115ae85f89ad7aabe5e301c3c0c1bcd"], - ["030000807082c40303afc2ad6572f6124444934e5e0d2e0ac957994198b6b7408bb4a793514b1572ab0000000003525263f265b29ba10c5f78754df872244a26d542e0c337de8cd584fe201ffde288f2251746829b020000000452515352ffffffff68fe77a8bfd4dfd57f00994f0f7b553e2226bf48d5a2ab85f68fe8cac991823f03000000065252516a00acffffffff03873a5c000000000001518f24e4030000000001004f8fc50400000000050051655263000000000000000003b09b5404000000000000000000000000787a6320be9cd98586646a50caf36e83d27144f1a478682ebd52ec1bfe8eccff8c221c40f4b9e7d904aaad86bae12aead9c71c1ef13110052c1394985a18b1213c7113f6a0315e5e990b8ccbbdc0d4a3707d7f895d0c18dae2050efe78779fe200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eca0fd46619f9a64e0c2ef0f0a3b5cb4f248f3f2f453f8130ba865c0d069e497b756a18a15acb4189dfd93f1580756aa8941a6b01ea1020d7bce5e872327de7a5b7661f2f0d1e9e3910f64e5bdcef4ad306a20da6409e03e7fe5c39fba9cc8ef4e9543013cd42c5d131fe936e525a53fd71ace8cc00b03d043e750faa58ef0970216c633f7ac4f73699dfb2043bb9c8091c00fd086f8c8c4b64ad55fc10bd13cb0020885573acc3d5537d125aa72050dfdb3946c41c3c5ea899975c9bcabfb56f96d0a03339dd38803a4031be96da383422a64b95ad6175fc6080fbc08b95fb52f6daeb438489e27757de5c156fc6b0de1ce6131fabd97bf402ee13b70e1b813a14ff70303065a5da61a5a16fe7b3d2d06bb3d38e03407b1835ff01e51c7fc08b4344d4e020882973689b0a2294b7a927994e12ee27a68bc0d9b469a25cc716d00444c01a502154caa4fc7887700fe7f1e8167f26f0424e9a15b784f627df250d43ceef375a0022ec07f11b377ef777f6070730bb56e6dd6a1b1640d60b1e5f2b9d7a764bad5690229a57069dc07e91430ce7f1b24b20a34b21cf18540a64fc906565a52b6ddad16c9db8f2dbbfa355fb6c585fd55df7e31cf909a4ce548072bbba4c5d4131ec1dd9b2225c6cd65b6aaf7b2c05b49bf6bcbaad335f7e085707f85ef1f2425acb1300eb23c3cc0c7ae8571763f53322c704d6fc78c5d0ad0ac6c71041a1f080b575002d308581e9708fa41f5afaac568c91a76dc9c1bc04d133d2eff56cb6f91fabb89ee597952875cb7330117c1f3c5dd247b485f94a0eb9bd3763de58bc87477f6331402455e6c792e3e7c01392af8e82e701071989d4a837fdd770f1d534a171921a5aa83db68e9e315cef7284ac45ee91584462ea767d2dc86e12d9b95dd3c09275b528e99dfe4c2bc05147eca4bc0a9bd91495281a1121cd8aafd88ede2891b3d83d34ff048e932e731ce15dbef7abdd21022c0309e9eab2572a1c67fc714381b6e642070c07073159870598c4a18c57597977c65bddaf7a6b0178a391b6159185e1fe4411f61001f374dd50090251d3ea804b7ea69547ac3b04353c1d9069524e824919b0451d13161117707a2b2a037801dd4319179223aed2dcce99b1443014a90608787dad2c941bb005221282a7d2dc89fdca0c2e3c4ab022ae4eeefa106f94e0fe405792d31a290c9f1c316e62a9dc1886aa451054cdb239aaba60648949060cf10e7fb126a8968adec8fff71ccd76723aef0c1830e93daa259ef56b48d30354d9369f555947788ef4089475fb50e4b240f41b13e64925270ed523f66726786565da97b80d918d73d78c2785bd577f515d6ccb1e65f408d3d40cc56ff118688884a3f553b2c75d73db039040529b98b28cc4e0af44890a930ce9032e8b5e00fc07ab0eeb3ac9524f864fc2e43c3b00020321e8a38c7f381f5c30680740f1a0d756b68e280fcb5a2092404ed1b30fe0f0064abff4018efc058b07406e290c13ba4fea706be6751ff81953afed230e6bb624af3bac81e4196684987e2a009685619d458b0654631ec38ea37c312a62c0c39d8f99052132d13279bf6a02d798b6e653b59dc655056bad9e597cadfd9b74cbf04da57c7b3a910da22f5e4d6b8926bcaa6c021745ff73a044abcb3f0c21ddf24965db457facd3a2aed2385db1b088c763c0a9a138060fbf2ead80a0546b3b70a4960b7cf689bf7e11c4c6e1dbbbcff67dd16c9cf8c3c38d86f093be420dad898af446db2f6e047d00aca3b1efc2e581fbcd72d436531916968dc90e2a2fa981628ec275bf2e7cc2db9df6c70a4b59c1c2a9c312212dc8841de379794895862746e0d6b0e6abc513e1c98b8d62b5322b14ec3a6fd628e47e4f9b3818a56fc0189d843dc395a6ff63b0b6b633b7d87ce88b4c647d8a50f04fa7dd12cab06b22865b045969ee6117adf1f7057541b337b876034d9fc57a32878b62f9e24c9346f29ce41eebd87519c8a46e1c163b487f65b58261b81b37e235cb9d4f5e7a36451d45a440d95167db0788ae7080cabbd30c8f0e63c18a8e3df8b2681adf2e7aeb87120b504714139f9253e732c7b47e904ea0362b67df2eb5de56d276760211ef5ddbabedf522e5d62ee0f4a731b5c4fca06d29f3db6842d0b6d084ca905f239e45e9ad1336a27ced411c5b6bc469c6113e19c83d7300cb64d13e0c4f368e53395f21d6bbbb04b8619c2925c45bdbcb6dd5dfc0463444cadb6633784c6510616aadfcb7b47280c979c20490c1c6dd67accead28907d0177c232d162fc8dfe3a08d16e003000000000000000000000000983e6bd421f4b96f24472b865a28b6c2101362c81eb1f831f4e189cb352a38047abc8ee15328127860b64997e92a0649a3d870996de2b37002a3ad99209a989ebdbf91ebd1411969bea91bca992f408bb26de38d7fee59128e3bf35a01fcaa7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c6c0b8c4363aee5ff217d7817de3468c8dbba18eeef69399ddf2fe0734400019d0c3009a9fa65a2d7d9d6ec2a3326dcef2b13f0935ccf632e23f07a5d7cbd47facb0f0cebc9801b00822a9d2d2629f02161cd9c1edfa95a64ea6f53fc4bb3fbab166b0cc07f74fce809a6eba3cf8637e7578078611e9f0b9f2012db7be8f80770229293928fb11fba92b34d65b03777cd90eb96e82006e65fa78f2baaad075f3d302058a2009ab1a6e9db0889a26e0ffa8bf278fa393c37510d67fc5942e095a70260a0414b782f9f940be25426a299bab0e8cd6b7e15297df48a966bd90c2036c01d9625fcf8e997ed11f161766826d01ff052dc3ab57ff0bf66c55d2a33d9e2e49bb03289e6660d2c495fb66f0ddac95a17862ba63daffe8c0e04dd32a1dadf1063df6031ef97724c43d3256bfcf8e9c0f185357e074737fb6fe10f8f5dfd731bf482ee9021a967c1f1b68949f2ead754dbe7d11549204b89a2951bb65070e248ebae215ba032dbda18184592c43e0338f9a533ee5394e17a0042c0c7b0f167b58ef2cac38bb022dd46e4ccc4a75f7f5b914be0430cb949e3c71993c402bf767b4c439549427a5536776753b9adef8edadd073dffd4b1e201d9832310ce1d61d5366634800356a5f0a1a9b7623ce010bafa6a49c3ae981475b618bb050b2ed18857110c1c8ac9540f3e53b6ade82fa3174eed331ba09dbc6eef9d10bed006950b975777e1f937c926a56646f859b34a77e7cd8dbd921d14605454e24c01859a7d1af961ceb4da5b7d969f1ad33ee6d687209fc81140a7a3408529ab6d1a05897fde16f6f8044a2c528063d0a0f87daea013f2c00542725fa55c08609f27f87fc4be53c74cf8175c95d506b590dd8ef73c1e0c26f3bee52116626295d2ec6cb23b12d6ff004391f9cdf7a291ce6c09e3c731c07b17ef9a5d9f4deb9bd87b4291c34bcaebec56b75603ddfed4681c3eea43af9c0e13446d3dcadfa071c8880d4a90338e4480b8b7ae7f5209f0abf73cda482f7d8214fc66c777db8f29afce4b2a4c3589a2879f42296a4a406598a95103da9f0d44738663e0c64b05adb47f3f135e773309e7b753ec0c302e37335bc30f560b7157b88d8d0220c6f30948ce14331947d5766015e64aea130361df72510ffaa914440838ac4375ed0a884978e1c5b86de610025c56d02ae0d0bef64cbff69afcdb50908d303fdfcc2032f0366a1b66e9a899fe6c7a43f79bceeaf83fdfc91dc0edd271e24b8cac0597f2a03a446fbdf824f17dddd833041a299d8e704427c6a4b8fedd5c123c8ab98e09b84377ee1d668e1f7fcd2e0a5aa171534038740b320eda0d586d0f1479b908fdab8176f31857cdce3d63a75599b0bd08caff52476acb84cacd2c6bb9060a4ab5026c859afcf5b908fefe0ade11a822602ac9470a41ad8c4e597169dd0a391e09cf36bf5e9fdc95e6902125e37e12bf8f22f28f57f376213c890837eb8c786355d96883c16513c0d3f26b1530b99edfc5d0a20c917599126f3e4368d1088d2f41119d217702fcfceacdfd4151e71d3765f2abd0c58ef34909cf379036daec03fd566b8c7ea12e51694083edf541fc0535bff43cb3e59c2076b653eb110d3dbc2a2ccaa59b740d71f093946bd178c095332216a895d8b74fd9b5773ff85cfa287bc6147cf07ed261f888f3ce18447173d042625aef29491b45c69bd25eed81044aef59fb7de5fe48210a08bf89d28bfdf4eb45393a5df06f8e89bb616497ef6bdd886a586c19a84ffe55b8aeae859414248bb86542921057c7d3ee14d4b3dbfe01c3d20dd4df4a89ab36e4bbc6ef232ec71d089020fdf2d8548312d1f73b5e36b10cbac651aa3079bec76e87a675a3a2775af070f481436928d186676111bc516386be0a0e6c7758290b3779527bf098dd35b0f15b727132eee3781aa25e242110f481a09962c684da53ed3c9a87763daf93a0fc0ed25d60d2bf171cd80c3000f314b99cfdf5481ae6cfc7be09626ada3a427a4fb43741416f249bde59862caa1062418b92e639bbc801b2b4e6df17d5ecaac2f39669e09d7dd200b1f105cd8fcd4dd454b207158876e1a700ab7fbeb3eea2572f81da16da08950608261e4e17cfa4d049301dbe3286a5ca0d11600d5feddfaf4736c94b4ecd939ce6c66c297800bff66631048acbdcad7c853030b87af485d6a98412c680016bd2d245daf2334fe9fd524b7514111dc54b146e83640fc086d577d0b80bb9f126839453f9ad2e3324a35cf34565f4fbb8a52cd80866f804ff088d8db9e7a7dfbe9d405597906f28d0200000000000000000000000079bd529a23f25454060863c310e0a0946d81aac1a5313299dfa077663d5dfa67c406800cd8e424bc24c447f2f45fdf592cde7f665d840f1357f84ebdae942e4f9991735c19d09676f91dbefc3683ae954aac2df02669b1e5b119c6295bbcb7c20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d16568186302a633e18be1d42a6df22ece09fdda18b60c3fca95d2eb8bb0b0e472523b32ae0fbf7dc8273767475cb949ff18f6369732ece17ab6b3af7aa385c94fa272fd163d135f95cbc0afe23ed9ca97f6c75093f91b6d46084559a249649123aaa4d49eeb0b02a27052263de7b6212f3cceef28e98f4f5ee652cb81370102096bfe9338b7d1cfaa2282bea0629192f3c659233fdcd86064053255e7ede5df020e6c5bf78c3a8a66453896dc07ae8a1c4246a8e0ea1f7f9256221231e05f88ec0b08a16941b75e008e24943face34fba802d83d08cf6e079ca17fcb5a71924a6b92b189a0cc41a01a12db43a6497b258d3090223c81396f30d94c3345017e471280323e46fc8e8ee2dc3ebf0db74d62ecb243da8ae6c939a7e7c034e06874ed99619020a180c5dd91037beca7af30a175ed9e388f9370e4ac033d9da16edbb5f999710021fbcbb0dc2be709fc12442dd4d2fbe5e2b3236677bc175cdad68fd6947eb525a03000e640e0919e2edeab757459466932b0e00cc55b5803a76a4c08cbf8f082060031100deabde5f6c8e4d46abefcfe0a601a0be0ac3432ea8024dac646fc3b69dd9128b90d820297f82138b66a417d38c0ed09d9d5b615ea5f3296cb0f6793f8ae07432e98f6b5e89e24d51fab8abecda5e15ae1b8ff823eab07781a94c1c8bd065110cceb5fc1cfc25415e79424d7d6daa5e096c01fbc29b92b4fb137ac4daff8aa058dfb4dbcd68bba8d264527ed820f885b2a6f169547358b40e7bf39b2b5bbe248e83c89dd109e30e209ec9093b9c4ef21210c9908afd02f95203cbcf21e9335a9ad41632e6921d9c69e71059c16d228359b2346079e6c9fd3cf5f07d913f9c781805e59882e65604bb78349162724daf946a6c173952d021348702891c4fa77c7caabe9123768e8fe4f41b5dd04739e5811049074b9ebbb6fbedd340d39877b4cf6bfc9f86c012b85a24b86ebe31cc7ec15515041fc183f70f1785e1256e9596dd35ce075c3970d29e677127231c5f73d7adc74161f899f4c0046d6c90a6bdba276758394556f7084bec9afca4dc864e446b65b5cd5e49653d592ddee2ca6bcd1efd58b5dc04b44300aaf3f799d22e00db7c95e83dc58bb98ffd7984151966c88dd9096d50ae7905a360aada545f5ab6acfd034519f20b31f5925591dccec9d80bf82d69b05b34cfe07b0d6b421be92617601b81b686a11a310cb7bf4d066040f432f5b53afa002ae218a7f59f7ef837e2382e2a794a86dfd9d8b7b7c5dc356425985e374e3a35f009f826c6d0624269fe3fb536d6f9660bf79fed7c6d34dba8d41ac784746dcd4fe72fce03f4ff28f6fa46ee8ec239464df3dd40cd5d5411ed6c8551d495ed3a50e1941161cc01a67d4c7c00104122ba884d3e638fc2cd07c8e9583c2d8ca9841f84ed3be82d4ebe4db0a1a92c9689a1162cc24b887ac81dee28da7273cce32bb8e6d24489c678530f57be603e9290331809b59545076c4796d82c86c4b573b8fe5e55a1dfe8e63a99f8ba33e9c1443045e157b1bc965919e1be580b9d544f39e3c20f6d79fd06bbad2db550545235a8870e055bb69562442ececce852d339be1acdcccf4096f6261b98a3dcdb54ab72e0623a67c4da2b7aa1038a61f2736c1476b9cef2d4275f422a626750c6fef205431b34ed727f74b4fffde1118b71b66a7519c84c6e5e731502b36a3e343901891670bdf95c531fdc0ec71b30f4ae865c9f88367837a291934cde9038658571c07f5191f36bbf3640e187af4d117a9431d04734f627b433271ca0bb6f4872ffad18b6a7b57d7cbb5d2fd0fd95f39bc0ece534ad842013a0e52a212a9258de8b35004e28acd17778ff866eec01523a817f3c4d3590de6566a124ba9e999e9abe1abec331f1d0117612183fb8aea9332e7a5f237d9539b7fe25125d832863d69697c8cf85e2c95bf1fcde68ff55c6ee83c65d99cc75f8215e90f608e0882b309ffb01e75087912822c4b04f3d15f77968252177758379e0b1e2fce1435201f926eae23e51116ea9289c4f33e58cbfe795cd6e1e8553c6102023c99e295960907495912bb37ffe60aeb7df7142ea387139929a01d7c22097c11b5a49e5cfa8dde0f93451b035c6bc9988987a6b7c5886ba0a730d2ab0b8fafef0f5d909b771b69d9491b29077954a4a912f7c3de0edf7efc2e2e19610821bd6e1bb05365ca430c5bb75c7609309a9e467cd776475e6fe9b60be5c27b77be91a8d17ac882b7c1ffd3d224560a1a8bcd45decbca05f9a371ceb138009e244c41e4e74881be940384bffe59402bee1ea235261d5d857bbe4743ee61b6f14b8051c5ef0f22a3d22b34aca23ac82d4bb845bc7a12ccd49deb29e7ad879dd11a8d29f4f871430b338ad640a7690b6bd85840b52a3df2c724b048be78fd54f846fc1526cd20b", "00ac51526a", 2, -1717578426, 1537743641, "d348a8f06d4e0aa3337252959170642ee9fa67d515c9500a45dfa1e6acdf1559"], - ["030000807082c40304e9b69e59533e3d5029937b848f74146342d2cd79d012d7326daefd441ba2142400000000090000520063ac525265c519208600f27d5ab58abe8ff4fd3d8bdda50c9fd950559732baaf00d149117fd5ff4a860100000000ffffffff6484a7e82a5f50a08dc30880fd772056b2a3b9fa1f963c9f699a8fdeaf0c4f7a020000000452005163ffffffffbffcb13d56dc0dccc5a3449df9d584a3fd85fd0c0ffbc26f6983d7591d5afdd70000000000ffffffff0224fc5f050000000000e190900500000000046365ac6a0000000034ce4e78020000000000000000254eed020000000020b8f7894e1da20ee7011d3560ad8a29a8cc565aa6b2b8267ed86747ba7296387e026eddeba27f441430b7f848d3829c675582c82b9de9e34bcff2607e95561c450ced96c4b82835ad478a623605caa5296773d30c46ddb6ab197d77b35de5c200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000909171a6663039956730333552d981665df4dedf182f9dbdb2814629c6cf8946ff38e291e68f2c246655210dfd3f09c7b5c24d2eba9d90841ff0a0e7b102b6f7ffd1af4049b39a7158eace0a4f7f20ab53dbba179b4fe66b86ce13fdb39d03205cd3aa92be242c6ec2019b29f67ede96568e026cd39c6c3501f108ff358ec0cc022a9af4e15d03681441e1d821f83a3104160c72f1ecf0a94d0e7c368bfad7a07d0310952eee3e0d3246047a3f9b64f56d8c52a0ba2f328d859535a80a38568e44eb0a04d30332b7afcfee569fdad657fd6b4a966234b15981a2f5e2aba0290ed5f64fd2138d643041ac9ea93648367afb2e4a417a3bcf38945f1b2330b93975455b2202238368b4f8930bdc01446bc3552c56a0d53829f05b7a72ec84fc5c66719aec430319ae9d164dc86854e210ddd1d6bdb360128ce0f4e5e19b1c533c5b0afa1d9595020773fd773f279604f1cdc606566a65868ebe808d4f49cbeac7d42d952b167588022f8d3273e440c0d6fb76c0f744a59a5c747c8ae688699c6525bf40ccd7f4c43b03222689087e00b866273a5a973728a98f2676b2a8e8a153ef4ede11ae7198ed44ac35ee7a078b612475625d1b2af747788ef79a0ffe80cc87f9e05757f43039157c43c943b5743c925c414f83deefcff19e262e5a436b9e75e3e7347a4e2081edee3b3a22422066233ca0eed1a4e686df489048aacd3853a8839c3d5bcdd8f98e57f0da5f1feb4395aac4bf8ee9739f703c71e4902866ea20705337b871c9dbd691866aa7d370759e41c5a2ef169854ef62d42a5848350e1760ffee0f69b6e12d4878e4f310e8e017960ad1f6a8703198cce1143f5efd71512185ab255e5c1db474b01683df4207628c78f9ef2297c1cb871159d1d7de55c19e7b8f00ae109e1a505d49e92be4d28e15508a39de87c5eb6a01dddf1aa290e13faee9b37953b22ab3c1df881a90479bc75b662eb1037920fc9e5aca17451f2abd780a930b67e25129d1655f1149e6510d0df82f46f293791e085ec61d519756368adabca8686bea92a29018d724cdb4caee3c32cbdcbf00f587d4d0509d60cef6dc9dd73ab69ba366b1cc9a9ccda7429b041339087622cf1501c01b9bf8429f1b9807ea665cf2a811c68576dfc99f73e5382f75b6964d6fa90a8193bf883ba18bd53a774350ac2279ed449e3e9470e8c5c7354a04fe50e4d15fbf586f92cef823a91e7e4c2a9dafd97bc69deb0a6806adf1e71a4f433500b5156a371cd8623b9158063e7274f4b32acd4fd6d9ef0a786e7874c5ac25869cf407f4e1b7b7d57150af51eaebfd2bf1f9fcb8e31e9b6cc760a487b9b731708623b23a6a927d711b77b036fb3a603ce80d3bdc4eb58d62a8b8eb858727b15be5f9a1a164b5f52a301769a1d3512c82a11a9ce5c8d178516668200b7b39a6047f9ceadd91ae81b5e7928bc30dca14b45a74862669c05beb08ffc28a9915a7466c2ce54feae7eb065b8a75b12a0f4559c779c848f15d3d1fe0f6866f1cb8d7672e67f460662f8326ff73d7bf02b337589ffe198fe292481591c8748f35cd2bd34b39ad8ceff91e34a2cc639e4e476f867f7ff85af268755d1d8b28dadd4467fd430f67344240c40980311eadc5e7141da81644362f0f2ca48a5b96d0629f0f3c7fee6b5fbde9a06fba5b19f46effd2186355ff994c87354dc1899e3100c9d9d4c80ae38abaed5b366ecdfdc0ce9153c866b6ac8bb9ff6159a155a0afa53b65e92abc38584e2d1107b8dfb7606ffddfd2491bf265e69e776d12cc16c639cf4c474a084d4c295807758de833a23284d1ec61f1f0bfc02ecda36cfe711d09bcf3df793814193602ef7f4648951f16718b27c9501b8065701c1f7d775d5668df8a0f3dc9b023f19d4da35f2aad3955f20849574160c12f6c2e13f979412f01a174fde2240f0b7e3a774eb6e2c40cc2b64ad4048f5cd3dff7472fb70acf01ebe0629a340c672ecaba5f2212976c2a8a5c489e9f2d19b140b77742d2714e005f09d7a049af41fa421c926311d14d8134228a89792dc9ebd8e88b87b32c891709bee9c5d3f737a96a4f41e34579b1cd7fc12624a5410dbc68666c26ddfb9ad1b6ee030404e8598780352cfe42d0104eca47236ccb9c1bc2459d9530705ede7c63ac370ab0c59526900e453b73a6a3058974166b2125487335399662d0a16fb3017bce6df6f30b3110d7d697a5b7cfbeec51ebf0b6ef2a383af5933df7f042c1f6342c02ec85cc6be173bef810eb6630acf1f9ea62207f254f103b0f61f525205a52f26109144d0000000000000000fc1aaa03000000003f0054a232a11d741571157fd0bc74f43382d23bb5973818099f6ac633061c536e23a6bba86f85375296026f0c75d62f6d00110559122a9bbcbeb1596898f773d5729ff6bf27d9f102fdc0d13e140b2f3f6ab52d2277a8d052e3353d4426a153000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002360aa903bd5dcc9567ae54534834be2bff9a429f607f96fc83d0927a4610433b3f98e775dad391495f13b0606709d0dc33ee3757d64a32832a2b5e508c1daed7a131485e6f0729dc8c161b707c527bbaf059d1b18ca14ee25db78c207372b6778cafcea1212c467ed5c366284aa12deac84086acdbfa1007351ff730b144d4703131754430c1e6a12dc7210869cfb3d63009b4e270e96d4ea45a4e7049403f6760310a1753a5d4f7e942b2bad408fcba5b6b351588eff559e73f6512106da942f410a02035bf641505f2e5438f840aa57c300397e7fa85247bab13781f9b2f395cbe7c8992ceadc4611d7dcc6a586a900fdc434da909a66f4e3ab4ef8674aad9bae090200133dbd3e00dc3725a129615d8218366e44b667fc26be617c3aaeade16c30d30311dbd089fec11508631d9c0b4a6d0d2ad6a4d6fa0b3efb859f13105409c28c81020be8100ed2c1a3fcc23ad960b071a4ac4941e558303c4e117e5b68a07e5ae33e0316981f9720c94601ae54a4d3c0c98bb918c2028c5dcb42d90df6ff2bbc0574fb0221e815ffccb674d5f93b8474bc9a0b6c579db503a4122db4d651472aab7295e96be27756712f8b93d89b1659cd9b94147cd90cb53c7c1b0ddc7ae9a0cab805550d2ea6081e7eade259a1482918557c864ac4ea681344b1d5db17f792066ce2c303baf16eed4acb7ef2f136abec93baab18f347751ed3fd9a78485d422374cd9b305362ad38f693ea23cac37b8eae310ba7ad255fdf04cb25af9cace83e490faf6cb2f9d4c13326c18f3eda0df05111b1528243f3f6f8fd0653d5308e626281106ea61dfce04a2e9ebc8e8eeaa379fafd0d405939688aa7ae33751fc899b4c1b3698f161b7ccc933dd541acd7ab2f6425f3a01657ac94db882f592188450cea656f5651c3ccdfa757d2c6a6092d5522c536b05c7de668e29f50039c7fbbffdcb2a38fae585f095eac5e6c9eb9c5494041e6348a474fd11fd0063984199a9669b1c00c50a8eba18bc230855fad22c5cf54ef9632168c2f169f7edd23940f97d12a50121d177e52880285c588e12ae05042bf020b53ddebf0e7ed7b3126d332d37510a61440e831708ca31d89b51259124d53cb15044031b507155c8a67c12067183d7c39bfa0cb897bef082efb1111fc3a5ba634ea4425d409513061f9c36881ebd266e3decc8d391410b5d997813a5e00df0c196b6069672865b00fff6fd9da44194ad61f12730c52402450b2277386f4fc10f94dc630580c69e56848cdd4d1f84498d59a351ec4b04e731eccbbc88a3e3afdbdb09920a920449e8547bf8e92c223fd50b55b4c37a8589b3dc3b4f9ff181db5b99e412f30f79fc5bae9a2d9223088d39abb8129545c8f07b75ec5f25804402808799c0414aae686fd500133ca118c10fa976afc58ac5062ed95dfc8aab3840b2093e4d9c13a56b99f39467a2b4b87b52bfe0ccf5618440180cd96e25a6c65e6c74adf56f3ef5fe0b0bac1e1faf2786ea6fbd8b4a7f0f9fd4d1d020639ab7fdfc74065930a5861144f9507a77a0e8c51e9493a841e4bc353a9705b7cc5b015d05fdceb10a74d9aa62ef0c1aa216fa875219fcfc95a3842f69785e1931f32f7c9ff60cdebba1d47227626478f4c4080732ed5ab0e6f59d43a882543fb6eab28e0fd0be8ecde8edd67b5e6a9f4df96c88bf816a8e35d07d0fd64961533fc075902a68c4437eae6cf626460b21cacafdf242c0893b8e3e4c71b2ce0f303b569094d86b3b0c77a3ecfa931ad8aeefada615af5ed70147b80ec494256962864d196749746b5b1c530047d7287145f903080554b49a0f39a1c27888f97e66e64f5714d5f6a6d289670007bbcc2b8c78fe4549fad28261aa27d02666d0ad10f763f8e27eda5e20b58d3df39af8370115db0ee441111b0aabc364e24d8b1cb83f94891c45c7fb18fcd6f1c965ca09fab48a64f05a3efcbbace2a57d69741a74d182ab01a1be9d5c7b1d015d52da288f1697c28de212f14519fc4b21e790906eb1111f29f4538252869d986447bd91a91e24eb972a09f67a66d98ad056d4163e8a8d6f980318035482e8f748e22a9b2f8a0d787aea23c2820362821ff8f67b158200b0f184a584e319b3a3fe77186a1476ded65fa3e003c117dafb5532e5b6feafd31d03566e05e6ec016bc445d93b2dfd0e133f7163d14002fa647626f4c166eb706709baa5304498c607d5620c3e25548a79f7481ff599f87c50b7d2bc004ee5e3a6b79f14b84fd2fa4e22fd771b54e8c33c73c559699bac14f99e46590885940865accc7bc22cf9cb383666b83c11f300f334413765e2260f60e696480dc5c8c35eae4c77f30123dd88627ada2841c096d14d8511ef7f7db7c0806b03edd1db8b30a6c8410b093db43effc691f6bb07a906882dcdbb752467545f157e32e9b702f1608", "6500006551", 0, -132542783, 1537743641, "393e9d0fa5532b6268ce40a281fa5425f2b40f46dea575d7fa36ae95508951bc"], - ["030000807082c40302b695d293c94c40331b388281dbb974c03ffb4e5e717a43b64e899578dadd7ed600000000085200ac5153526a63ffffffff2e49ca1117682da2c762cb20b4422f913202d1f3c7b65a2acb700724a1d25d3b0300000000987d8c6d025a2375020000000001ac7e5625010000000003005151000000000000000000", "ac005251ac6a53", 0, 2120921453, 0, "13877f714889cba9e2aaa7f4c4c28ae095a96396d05a6c7234f4f0cef195d4b7"], - ["ede6c64f03775aa7859bcf4d2a34502bc6fbda14d2fd192b9d2ecb30f830ef50cb870c4d0102000000040065636affffffff90040cdb1e94472d2ccbec109bf45de77a4568e82676853af35897566f7d55740000000005516553ac52ffffffff915386ee987836dccfe7716ba88f3e552b4b05d9368a380edab5e1fa6f31431900000000026a52951ca5e2049191f900000000000300635264067c0400000000086500005100ac5300cb161103000000000965ac650063005352535a741e05000000000352515200000000030000000000000000a2beb3050000000033c552a4fb523cd43decd62674071b2e9447f0e8cf2ce731a8e6051c1002d43f19ff197d525b7e796e5e4c57d3260304b61a9f35fc96f0209517cace255744c821c0e95f41af06d787caebce32e36af926f682ee52397a7dd1468c1d10b3c65300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fadf5ae8b28ca304c9ece9d5083b7b022b7fd0e85e3011dab44f7d69e28f0985cf9584306f6f58e1abf36f37e6c49b33c4fd0f8d3992ba3d2acb991519927136291b3581c663b9e0a2dd16bcb7dc6bd2732cbed6d0276ade4689cb1429c1eafaf21ec9368ddfacb923c2669ae287bd01179cf036e59d0131be9bd09c435b4b7803236007ecd26120b9e7c8a20b0c12c63a5f5b1ba15137d69fbb06d6b843c5838103301a1be230a6439727506332a6c9655e684b93d3df91579af76fb390266f9e3b0b037a6fb6da9ebf31781338ccfb2b15893d55594f9dd3c29c55ecb6bb6da28ebf6504aa0374b416bdafe9ed47f6ac7433d030e3538e72838bb639982baf1c725303241791c70c2cf3902113571d1387661961bbac500cff2e83999a3e421c89a40002291386b6d3cd058b10a39bdd35b946039b74788389573c02d9a3368d5352f2020230589e1e397ce84ec402ff5b4976f55eae130bf8af04fe985b7aed000d3bfaff0314eabd745670f8b666a89f3f76a40982c27a62ec2b3c0a26b47b5ac669703060022f2df340059d6bec2923feeab03d901268ba5ffe0bd1f2f6324a943e043dae3a66116deca4e173ff702f4c17eebb5ed48b061a9909ab1d177f52d06745d25b9f3f307bacf596ad1343e2a4bab8307b28e4c7fd8e08846c54515dc2f4ffd7344ecf4108fa5c8e5774ec2fea955ebea4395489db5bc40a862dd5c29dbaf4c12e1e7d586dec9e264b8d1ec96c2cdea53b70936d5022b19c56e7840d10e35a9f9dde05e0767b2c1f6c4d921f312e641eb7332c6c7ae767dcbca2d995c5d361b0f528b8e1f62a642a819a48db66130edc90b16dc25c4894d9c1bd8f460fe3a071e006b5d4d1910b456ea6bf416ae3d415ec8c15feef978a05343339c8543b720c4d3b873de09f728fa1d79802e271389b92b4a413e8703ecaedf21b056eff2abfdc87d25b886eaf85acb30ea1f5e8ddf1b0781285da770b148e57166aaa0a20e079c4ec2aa61f10228061cb6aa587105d98debffa0e702fa3e96d2c4517ea1b2b092fc9331040cd444d59cf729936982357e3c3dff0703308a5d08dfa5cfa5c72f0bd385e3fe5c381fefcb3dfdab27b1e23a542a02583318393c4093a289507aae5c2003e9cbe76b19fcd28e1d41f1fd963c35a7b0aeff2378775846761ec66a7dc7ccd02b5b0fe1a5e9b44ccd5cd3c406044acdefd3f73199a8ff5fc0beb55620b702eb69cefe64673923c3900b7837e28a519e9e09c6e1b447f7a7f5909bc1b444797230c8e9f733758ca045dd832748024556ed9d532d9fb970a5ed982985fca743f836946f9cd0bb51bcf19be0a52a4534b1f4ba8c10432e67f06a3de74135486267f2d4524b344303c6cb712340853a6cf31a76bff08a89a95bf42acb6fc1902f2deb141c32284b6c40278396b426b63edf90f2d8b3f9a3c5fba7cd126406bdef77c8ad9088c42717f1de3daebb4b7918d0805d61122a2e45ac4675c282d25938ecb524ff2d5d390ec894776cd57d27a98afbdbb43f82d5feb9a9bc2a8a252cfa9b4c96b0b65da74ef38445b9076d84828d5d6a1ada783486f6a1cbc51ba1aae4bccae8ae27bf829742991d385c3fd25c874b89dbf0496c41466b2df5eb874b1a219c026cbe352e5a77e854dcbd76dd682656714234bd75c83b5fc9cf99647bfd3e12786d716dc389ffe192518950f1de1ef94dd2205c22108c08b0277dbe4389a5f73c02393dc8bfc6b1b74a5fe1c63d76ed2259e30519e1f33849e66bb0aa65fbb5ae463939ccf1b18e1e9fea82e7d5dccf9c434f9e02f3ab0cd9bc03b27d22b64c98f3436dfd01d39b11e8fd272f27bb33c3457c853d1ac4d2678074657ede5ff6bca21de4afe4819b55e3258b047f75a515ef750bcfc88f85da667f3574c4ff90dee5787f9a376f063011a2964bdb49d1886ecce6278281a93839db258996c115e6952a9cbe72999b062e12f4ff7c817f84364ae84637de2363f926b5b2bb1f5d93c9f55aaa0a56a19085ab0b7ac91067760418f73fa5dc655bc092dee64bad189f631c0361d302c61c08fc29ee20ac5c2b01404407c77138782f8a2f8707c6d57385764e0d5966c5d5804370dc2ad6a95a5159afc0e594f1bd9ef9231639b95f8c3c4acbdb883f923973ca6c67a184160405061412d2a2c344f5eecc51bedbcb0f860177a605384d89518a9be113f043568e693f11232b4ecbc3361c3370be8e5f38b0a5fb9dbfb28cd44d21a65ae719143d286da5472e33294208554bc808dded37ccf9a0742370f5ff4cb72fdcd43000000000000000021ce020500000000de1b53b94a00e79c50fa51f7c87fd6386846b4b768fac54c57f653e578d0db0324beedaa187493f2e471f8702a6c8b1c77593ee1cc12eb0e6fb9a5344881b667c9b56208d802268900066d1f89972a03c90a11ac4a5d00f9777c0af9ec1b3682000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006be8fc77a36f622dc69ea42cc5ea23320730cdd7a02dda2eac398c433a8f29a67a6d33c9605d89b780930a534a4849204a685fbc1f04bd8c3581019d62f5582217d0a4147a55ca71985af1f05aeaa45b371dfe7b78407a6075241901af07daa607c9f0a0d1d0932ea3bbb98fd3d106867db9e772cbe7cf2b8fa55ab6dc3f296503020c7d87d5cf7c070a53297e9824dd57e2f81fb35e7d7549862a1cf6fcf098d3020d623c1a22377a9d35783136ec5b311256e544ff307ed32ff46f8db2f0b365d50a00be4866669cce04d1dfcf2803a369f0826866b18a05a309554e3553bdac76dbf13e99028484f8a213f9fc3515bbd132260c80a1e8ef507b1e7105a5d66ebda10208b9e3c262107347d1a3a4849f19ade55be75a0bd4517cb9918e5a769380c9c50210a8e3d80b559d6c6b5682691bc84b7211f690bbdf33f3de07dca0c1e504084e0328b86115006d13546f1c7fe971312450d6f2df4167402b5ed913b45f2244fed7030c30442d5bba34f28ee745e1c701059ce6ea6cbcfb992ddbe34166a0ab51541d030cd8223d752bb8c7da35a742bc07c9e165e002fca81052a886f79cde93f673f9a81e3f9a311e232326f1231fb8c8e56306cbfad89bc2a1dc783a1f80767ca00774c455b3b88559dd955c42fe86f58a75404c5acc8690b3dd422dec8e737c3a18d8b9456e45cc7eca830640bbb29fb32b2f990b72e676274c5a11855c48f9be95b15be763a5125a5e79d309a8e360fe5756d168f1d19e797bdeaf8f93284376fbd6537225cac070d7c39cc4e90b43ba2615ca1dd090b6235d46e0171846fa02936eeef967adcb108fc003bcc917dd4ec19f03aeeb00142896288f6c43ce668a24b42d1bb52c12641467b1f9c3aa9047531d47e3fd45bd6a189bc7f019a004ba8465327653c9a25f4c026c0ca6974cc324fce5cdf82f446cf18137f7ff4d376929fb5eb66421211eb2f453037a93354c89f33b9502330c36f38d41f6d3cd77be8155014deebef807f716ebdb589b29f656252da7e203238cf4d08b699d9be91e0c4facad671242db562c3552a20469191207419b902914d03a5848fec92f945a491d6d9b60d53791f48864ea6f5c51867c4965b5da032dd3c3d105d40b4eccaf83a3ce6b314340ae955860401de56bb73aeec390a29032ac9fb298a8a2d3ce35b0cc0fa9acb1772fc41b0450000b2e08072da79f5cd1a3c67e2131322f53f0d2fef0beaacb725123e8f145acbbd96bfc32b6030111a0073946671979d84cfbdfdef650ff01ceb6abab91d8870a6d4d2a4f992951726d3085e31edbcf3c0a7ef2ff2633db5698810b44e4c2b6d1a0284d1377e579f0b2fd9192f85010582b60c67b35ec516bf78dafc215614a854c7fe138675eded5e902b7e94d86fa1f4ea28aa183834fba281a36fd23e2a4ca73658ffe58ebb0d2f5604ccc194cc7980dfcc5effa2f8263a8019a4b765560b8888754e21fb0798b604f7155d214a0fa03428fb4497664b60b4993c18728d791402b9d1df3050d840e5fec127c6d32ffd671b91efd771d53aacb37fbcbc32a7c7cd62fa364c10601bbe052b71e7bb77e2c6d39a9700470e7fa8e21482f25e4ad2d9624e7531ee198cd42dbafbf29b21e78b947ff3d08277bfca064a4a34ee7af24d9faa21e6d6733d0134d0790d33e9880d9fee022eb85d21255ea5e5b24f281e5d83453e98ef5f4966bebf2c7cf1890a3fbd1ef25402fb0b98928ffec4e7c72fe909cda9a87374da18a52b4d314718330552445c1741ae4b2f1e456455ef13cc2a6506370a77af766dc1917a9fb363ec328a5529c597e8fe183708e0e9fb109e2b822a92200a8953268ecfbb02ca57b6c71e112c39b21d3ea47ead7359c8fbf266e94b4c028d7e40cf67beac3e407b5294d5fcd07d5265407c04c924d2d21abad08ad91c9643425656706260a2025620c71760ee7b54374786e758accc1b645946716c3ed3c26473fb9c70ff5683967b9e4c68dbda8cc40c3ecc0c739b956c4a5dfa7590fa724cdedc3a603017a337266ca88ba93715e4579f454715ab54a7617c51bc8f7f9ca0206a45212afe49dbb531c5ed28d7171162ea54f0ea5aad937276c6d1005bf778cece7d646f0d9374eb71266ab062e20d49750b73ffb798f98700c25e0e3766ea444a71f1bcdbe30d531507c9d93bd606da506c84df1d2d25d356a7fade8cef6113bdad951dd358e422ae859d908edd935bf03ab4eab9db61caf3a12a6c9e14ea63ef8307f7c135a713cbeabf6fdafe76472a762a05c6c4c5206cb7b5c874900000000000000002b8ed504000000002e9dfdce804fc1e236e01717db9ee7d8bf7f0b0c01bc48bf24c5d6989fa42f2dd7e0f6b71d1835500a98f7e1a35e7cccf51be02f1563207e70d1f808a6103c536e24e82710680d1c6de960ddc1f72e8204e4f79631f1f3dd692d4dd08d78f38a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c214bc3df0f9cad1002b021e8fb96ba77f31f0aebfd1865ab8ff92a0f3dc6396d2a70e85d4649e568bb6604ebe52df227b41616d411d321fa681c9f1df9a99fd5b87acfdac79d53017beeddf4a268ab234ae1479fada15c0edd549cd8ca880338844552d806c3c42bdb36a7d23143d95294168a2a7d9656088300ac8b704a805021c9393dff440dcf92f6860806832a3d80c18cf1b450d4e61816409270e7ff4e9021e126a7cd541cbd759a721f5b585004fcc2a3e732717dd82c3cfa4ed795f701a0b016f32828e4452a8ebc39b10f5efac17c2c5232fdaa82cda251d1731c3f9f93634bc08b0cc2887dbbc39120be5b846f3eefaac9003c5daec4ec6fe2a5992d824031851c23e1868f1170734a0d3a3a8060c267b028f09d6e2e4fc752d0b3585ebbb0228f558103ee4becb92e9fe24d272e03dfc3e289de8c2dbffc3807182aff20e92020fe2344677a44cbe35100455369af585d6e93e39d5b366d5c975fbb6912319ab0206d45765609dd5e554cc2c7244e6cec6d6ade737253140f9bba5db6e75e9d8eb031e46a87667e4fe4580db8a71e84c0cb096d54beaaf70c1e1d7b66bc5b96c2ab0fd6f95f0633db4fef75fe9044cf959194a195431d6fa335b9e459a6ec3ef42299e7b3be6f71c069405203d18aefa6d08d35db0dbb0337071fcb769cb7b27d35f88534937f4de9d33b7b500e2dc972e51f22430894b09e86d4bf4dd28cf218f81c2ba5ed1df47f1418dd2f2699fc3b5e5dd22dd6fecf430509784116ce4e7c4fc8736f36a29f53f61bc48d41080ad42df2fbc2c3b5d057721962a944af5190e3c3606b1122e2607a4ffb8e3604cf3bdfbe2a129760ddb2639dce872b5163e72a3b5aa43b850a9fd07fb478c692882bbf7cfd96e89aac4d56c2d551fc8be2447b960f11c0f0040cdb3b0baf5c98d911743f28a43f6c92a0491e62f2e31f53f381f61e35698dadc700cddfdf73f3e72f64b84defbaadadc2b7f2001fd5bc0311da7227d0e93ef7e0bc4b723c297e87f39085aee94e7581aa101430baec29bafeeeeaeddfaede9a6f57812dc99ad6655bbbec002a77b64301aab98b294247a3aa4018674f7055e282ca0db50b92665aa0227c4bd472044990bde878b11a166107b3cb770baee93e84ca80b51d172cf2c1050e3f1042d768971ee3482d9d6da0a269165b802cb1bdc9b5d3917b1be3d5720302e0f8cd48ffe41c079b4f081cb775a2b14decd7c27da6f5b399231ed55e0eb404f128de12d4d5f7ab2870bb47c86956267305ea9cf2b6cd087c0dc726893f88be01b83fac5e74a8a1eedc083a4f5436fb93167a0afe494ea799c2a4129c626d099dcae6ac67fb2765fd1a995ec8d17b02590c58c1959836bceecbd2fd0b48ad6b0de273dda252a3bfbeb5fe0d5ad26973996ea6c2b5fa2d9336ead79c0575443caa0c380670d03b2e99c0dea915a4d0327e02d42b8bbaddb9ba18a090f75287ae71992bef18489b8a3dc05a8b15ad6697032785ddfbe171ea55e41a46104241bbcf0bd5cc4052af6add274229872e82decd7b11d7fc67f8af0c2ceaa4072a66ba7831da74c2d4b9a9bd842a152edc8f750dfd2933142446db2f886c9b1067d197af2c83b72119d7b1a2889a44b1e60acff4548bf7cab05d5d04866b030994eef53c054c31a82daf6baa84ec4f4cd23d0123b16da7a731fbb9623667c39b2e89d6947c5fa7f689a88e0441291ecd982df5d32b7b24c267ad2d07acf63a1d0e47cc7cc0d6742c2e47154258c4763f7fcb0dbe3b89a6dff8347e16c86c44406413be7e791dd7773d9646bbde2884fa4ea8d9cbf85f19b36be269615eb88de97be877143e643c34d8b68534a1428312b924e7581c259435382e92b10f3945c4551c5efb585400040d57144c578fde3934d863d1d1181e47f7e615be119bef5b4dd5e0663fa438c5ea84c479dc853b9c20abe02a0f5379000e13ee7f500335cdfac8fb17341487e8f94e803c1b05d6703d6af63367213f1331c0675f0bc0442c09c99a05b5d26588aa0794c3fd8adf56f759dcb6f07b6f4ab4ac781da409270824403c3d9ef2e2088918009e843808b16eb7c652e665977cd2423f2c3cda242d5a89fb3e2112d6c878b0c30bb03fb7953062b477e1dc2ac70ef979c2ee31845653b6692b764f402ad9979ea0aaa1fb6709b333798146a79ae912c3e5f48af3676b0b450d27db2a1fffc7aaa6b8bf5dd14f5431f99e4ab159294a0bc7755a71e57e265106889dd5af1ea15b67cbc68040afb71188e7d7511e3b196a4bd7d6db60343ec8fe39c709a6edb8f2f6b3b07f9d084e4e9b4c9d1de89d2bad3a0b480084a8816a380cdaa39ab89f947779ae30440ea21e50265be9939393eaab8e7d6a1aad4870dddefab8d726af45293614642ff9fe3b3f5eea3b94ccea6bc57bc5d26c205e0a204", "51536aacac5163", 2, -919615506, 1537743641, "2f4ce91d2fe32079e87e60d0773f77561de7424a8b90feca59aa5171fd69631e"], - ["d679536b04d0b84618f1c4b5bbc894a2c10a34a26eedaf9b79f325f29a716a37ddfb9327b901000000066a535151536afffffffff432cef418a83d2bce8a287dc37b2513eff2fb48d5578502609e8891ddce2453010000000452635152f99c115dcbe028069d188be66903d9f0bab518bedab2d9b2148a41032c490517271eee83030000000551ac656a53ffffffff3d46b6ff2b2ac64eeaf554dde0f4d851ff47379967defc60c0fec6d9fb3ab7f5010000000200000de5893e0195a3800100000000086365536a5351525185a2af2001de6ef104000000000000000000000000684d23de9d9b07ef71928e1b0bab79263d2211dc50ca0b615cd009dbf1d55a2c85e0cbcf05ec4d3112843f75b0980f7e4dbd01d9d45bab8bd60c112ced79901132486ebfb2083b53b1e3dd806b125bbc8bfc4a84604a346e3b864614cf266beb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d5feeba17c8156c84e58533710b996847fad4a784acba4b9f4106098992600e3d1f43112a0cb30aab18a45f5e15147f0c8dfe1a0ebbaf14d2173f367ff59693c66495e1c6e7d8825b92152b823f7b35978134371431ae969cfc4c9a5ecf3932351d66ab7a32b6346915e066dbe6536b919b233745bf187748b9c00a73beb8066030a5debc75f9e2f3f131d5d8653fa0268a55f29435c84dbd5c2c153be29581ecd022bf70d1e1bc8e8084c2a6a95d3ef5aaec1f2ab66be5f967125e405f2a28e04850b03a090a3878c93dafb4959b947a689ed07a713d863def65ee9c9bc9e398b2ae842bf2e844025b72a05ab5e165e309dc7556229079c0093ed95f9079cda22e7f9031a5571ebd932fb4640209cebcc042943803c4c53f695e231338ef0ea2412894d0225d6115ddbaf347c264ad968d75ebfeb419fc4cb265cccb9074f8c98206dd5240300187212451c7d8df51288b57254c0afb51d7735be3dab22494d76ffbeb4bbed020e7594ce528016d10d3f5822a95aec100265b02df0efde81c7767746932436da031e6977bab6f2c6120891704b242b79269db45861befece94f21213a86afc8279239ee5f5126d5d5f0c74a59699a6666f9efe9091c5d491accfec9d235f3d94ade725d5391884cd09f6549e64b20c975a1b1cacb23e01a60c020bd93168972cf1718a4d17feb0d3e75695e9690156a42e81a189df71b5380b7f2f68a8e27f026f28bb70356dac840ce3c8f86d3f384b607adbf4a1e3d7edfaf779f7ad7999559e734995e2439ac9ef75d2d0c412f12b584e2c6f3058c9eabcc019bfaa8565fbcbad8a633691f69e606fd7b2a6afeea8b31c620dcf97ff46a47ec79247beb72fccf16d3c4b89def6470245a41f9cadccc1b89b287e1222034938439027eaab4d1ff0351ff6e220caeaf4147b1509867b87c64e3079892bca74fa3bb0d58a1ec89892d73c76c8cb1bd85d9b8870760a4a3f2bbe561ce5c8c831118eadf909ca3d69a7ef1f37c865345efa0c26c1373916e988835d80373487ff15df79610211ea7272ab75d2cfe3d8a13908ecd7dac5525ab61e2bbb3d42725624c3439878180b8d5fa23cdf4b36ad05e46e60120e3f71db5e9560702c0dcf5cca191cd358fff8978b6d305eda0bc23665b7013874ce01280c339c2ba3e16ae54c95e61bf7cd8a395e5315b2d4c6d2c63ad27c0841a4b729686308f2667116ac12a6ef1d1b2f71536e8baca8c639ab93bd476698a75d6d750fe3e56724dfc96d97ab3bb38648ffd1e8536e4af009d27d1189293ee46c089cc1a05bb542159ad41bd497fd3115e05b57a85c9dbf044e927edae8823cac546152392b71902fdcc9c5d929890f9573b456a282686a29feb45f31ea8c81c1f0551a367b065152a3e862fd533c3a524fc6f94f2158c2f1c0c839f115ca8d6e32ee21fcd4ea9e53305c6dabd3dd1b9ce01334ac810cc538192b59fe8ea505629aa5c3e5aae578afa8db7dd95f3d587af89cc9204c405c5e12ae0e9520d281aa2a4e2d83acb73c9bf7391169af76f0c41f83f5c701045a5a1ba6a06e1f660f0195dd5bc248004894c5c7c1099eb078100375b5f54def09c2a91bec3e1426dbd2a1890d6e5d5755465077f310fc41acd6be8a4d4b885682281cf12d40d3c17a3215f70d592a12b37e7a5d4dfb129b27b93e0eb32629674f0172a9852738c519229c990d55e718b5542dbfd589e8aabd1739dd35de24b4dc2ff5c2359b4804545f8a7f2ae96b47539e22e8801f5f673ba7aaaa3a6d8cca5143ad4f22c62df368c04897351feb8584a7f927f851646cc0fbdfbf65ad59490ad68d93a0ac6d03bbf948272f0d4ba1a992838c057c819ec0341861978a7bd1fbb9cbf31fa4258e897a4bd12d0d3635a5bde5b57e414a24dcdabf9c01eecf229d0458eacd8ab74ffa8ed7472c8b264e8131fe1729eaf28dda037610e8a8b516672fa99b32caa8ec29e395fa261d6f873897213266f6deb81242f7a1ae78e19484eb9561ea78f63638bc6bf7442b68086ea9a4ec858d8d2a72366cadbc8239f19bcdf025f5ff4196487ad0c2b1b9c421fd703505334f71b065423a2494b78435e8bdc8c4dfc3659e9f4482a83d0f3d8ae07eb5ce96032b509ccec8a5f11e65a7839ccaafb77c0c0f36673ed73ef93d35aea9825cd94b0bb0ccf878e1306a2bd66212e1dc0ddd5e750100002d2418b9e5f9217e722ba63277475ef24d0864fb4bf5c5f450cdca3e64c5e6829a6d2f79e439fc8e48f0baa037cbb2abf368c220c9fbb94d816e05093e802d9c49bed996dbe4e6de0de1d6725efed5a9f97690dae4f357c437e7f7dde8dd12eed267159c2c8384ec18240e107b88e2658f60b4461b77cb854059e76ade8a377f939aca5fea714c585688ebb713a3f6a60fcbc2cf267d73ac2e756c65084b8dbe53640a", "536351ac6a0052", 2, -2032993264, 1537743641, "5a606cfe10795ba4f34a8c3d9263050b832b0ee7dc6881253ed8e3b7b0cf4e2c"], - ["030000807082c403044c87c09f3af9a50a4e67c6257b554acab8fa6a5572b72e753961ed4e8615d584010000000900526a0051516a6563ffffffff3d9e7566418340b9a2c88d7adf4ebb69de7ebd070e82a41b565590096467f38c01000000066a51ac53ac0009ccb2b556d5831713ef98d9a7f958461e0332173f9747581bc99e6c3c35903184025fbd0300000000ffffffffcffc144ce2ef101b10200cb7e63b610d39b51bc9b664c7c021daacad20e50c9e0300000003ac0063ffffffff013e0e0a000000000006ac526a65525342a6ec4938e55dff0200000000000000007ede9a040000000056a3c9eab354b23f5caeb6b3b04046619a2ddaa3033669f0ec89635a5c245c6721cd98a75f294009bedfd723e88d4e6f06ae50798e6fbb6fcf191d7ab2d005a6e465b458b6049c1a9aaf74d9256a62c3c94f76ae20d39405beb28b3625ee6e500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f785f57c7b35cece1b42cf38744086426eb73e9e64c56223724a467fe604743f28210b923f42c02d5fdcca2c19f6ce9e333f17400f4d971610b4a488b23e277fbf0201c52dbd4a713288322b8a06d9835fb254c8678891ef12f2563d22961df2e748a70ef5a51dd4dafdb8eb71eaf602a105d42842ff925182fe77fd72edeb032cdaac2198d506be8a6619d43ddbac14453982d9651eebb2ac2ada94084723d30204f74415c7f37a8dcc36b631c0c654e02427d2d08be93604da00b4c33412208c0a00d8951975aecf1fcbbfae01b551b976b16d62c9a9f2c59c737a1959eb8a29d13e66e51b01d59a771ef076450cc4490c913b2fd28d68017a098149639b6253d9020d128a184c95c32863d7d857963bb6e0282fa3239b2be3f41ba7d2468fb05abe020435bf5c573d70d3e39eec2238545e33c8dc562cc72be2adafb0859a9582d1c30227833e95859427bb18806aabff45255b695173a7e3f085cb2d284f01dcbb5c6d022f0a23c8c5d4d59bcfa42f47bcc45f2b1966a94918f6ac0d08c54f4622fa4fc8021e9063641cac06d75e2d5557542d77a6bd21102f6d1390753d34fde09ff6a711c9a67b43afe85a0f9f03c6e64ccc8c64dddef53b8f8697e020e7cece8091aa602626ef587ed6c55d8ea4a8b6f2811516cc16c519067cbc205a1f0814ee4fa38f804b86816ec53e2c84d96d2ca85a02e533939ce3b1bf0a54cf9ea125da0abadacab43171c45368e8e4fddf7053c182b3d4d976dda1baa52244832a18a2b3342e6a70230f895c24f1da9279d4dfcf3e1f1e14af36d2808e93f3d925fc6be856b5833b73505d1ad5747ee662cc03a53caaf5bde64ab4b2a08decc194b01c309f6728b99595223c4f76e1fb9648cde702c4ab6232681cd8268f1fed076a5160887d09e07641475609e606920ccd4b76ba641e227ee7e7f24b54cf892b9ead18adc5c2416225491fa4c4031129616b8a4f1b0b62038b9fb1ea9eb04df1fc583de5b4e1059fc9b3c99d23b43634a8be7bfb124b3dc31113876ed77ba42e5a4c4399fa5a8add88cd10d69c1f6c49a82350d2b143d8f6176dd3a463c58f09fc03e9995be68547c9ec31b1c4d8701b2305fd56ba9ab52b72de61b5e3c8ac62a2939136a06e70b371e63e35eef8342e431a6bd8642a8e699d65238c352a93697e479174639bb175a94db278aaec6bee7ac6d53520a80affb87f63edc4366ead98bae893091c9589ce4dfd7bb893829ba91a07265828381245f8cc1d96f63b8976ec6a16730f1d0543df8a3e2c51708fdf1d5c0e0a051f546507a3114931d6bec9374aa969e37cab95e21b7962e742cc5f98ba21577595a0de66a110a6d137074fef1fbf8cb4db7e5510b8799758713ee24256b92c4bc7130ce2ec6403596ff500d0f4d24b9adc254234cfc0c54d8b6d8b3d730a78b9d201acbc57f94069b5693cef06243d6ab9a96d60704f906b25f01157d6e7667d3232cd88b7875bb28476fb1c3483228a53bc2c38ab511186d74f214a3a58ace27ac204b606009de0a3850fb26cbcb41efc703a5262981d5c77d740d6c17f36545ab5150fc069d93e68a38248665da220754e71935ffab26464d5e30aa89db627c38fd6c490a504aea4758d08db3118126ea8120ee8f87c82f20070475c3cd80bf98b2724a97eb30b4ff62a23de44747837a32499a9a9d6c7f57d893e4a7245be5331dbe3727b5187e67d3afa76c40a774afdd4b2728655398bbf6f9d35d572a54d0eefe8307cc8bec4ff78312bc0cf02e2b525aec9b5210d3c67b8a6413a8b24ce5d8ab3cc6b52d65502949244e48006028fadda3829d1fde5f37ba0fc5e5d805244399f2c71d3df2a6385c3388fb1941620c56a150b8ab7a9b0bf13cda4e50f7f2b805fffe5a91ccfacf8822ff4621b94b82631a084a99930b2986ad9bd014199166046c2aaa339e6a750f42de3b3ec6ff8778be3629ae078c9d49e6edb10e781ee7fe605165163dd2396608bd7142ab066bb2faab07a2e338b4de6e77fe5fe2a0ad077b40a16f09f5cca80d2ebac267ca8bcb031b4f754ee5adf607b6e97ca570e5af69f18a680e3c9167066b33efb58cbf857d0b544944c7f5c2c95d7caf3a6e4f5df92aac394868fea6ebea99595d65a1762e303867f015f054c24c6cd692f8fbfe3d1ce242925827e3f930e271c1bc66a481f0015a916a36870ff437379a0c5b5281538f9561f38f6b84996e4f6e9e902a35f61ac0ca7f6c826f5cc7c51ee535c4db60cee87d76b1d49bd3d382f2e255a2a6e4847b7307e2c1facb73261860000000000000000f65f070000000000b323e576942f12347636ffdf0df339903298b39a7f64db836a8af6fe820819312f638319899201ad994e161527389a9829c7426bfefafa73afdb2b3e4304287cdf883830fd6c5809cae82e06151a375ae825c25df38a71bcae9421a673a9c743000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ad1aab21662a82b2f7b3150b6c0de88e9204c8b7f6920d2411dd3ad80371327589c726d766390dafaaf74c2a0008bd289dad6e71ba8ac671f71bbded9afaaf1ca2610c7571bfb251330c0dcdbdefbc68c6f0292809430e0451a6bbdc6e3bd82e54f475195b338a40ae2c531f04fe6a278d313dc9c77cf66a0fed2565b4485110201939a17a771b50ac1628ba07e9f63ffb6cf24fd5bdef64495a4548e1ac3e698030c29a6134a3e7c39772ab52148d5e72663b1659aac0e803a3b4d177647e46df70b005bc5301f7b390ee7b0eeae42760a0a3f2e435fc7242b8a77f59e3d8ee8115a2f31ea26106cedd0492189f7bead2403730ee5475ffc447001eede1b48242e420317346192062d3921fd8948007b1a00ad8fa41c927e5a8510f220bba5c70b5df5032e10a5415135634a44df0331202bc65520918a4e1d0153b1dd58a735dd80318003218882f59e8b191c0969d9694422eabdba1cf21e4fe605dea29eca1351e87caa0207da95b712e6c8e839f320bf38b00be9cd2103926a64d14e6fefcf22e3f1c63e022bdd227b4c86917d04cf8561e45c75292c12c187db0b87b0a75c81ed0ac07cd5d4f9dfa46d5a7a941a1279bf746e4f1b337500210291979e56552ff5b2cd71cbf591595e72bf922b57e7e88a00a62567004798e796cccdae2d53e4276dc851dabdaa5a0094ac5b63c8f91b0fd2408569bb5f5a3514eef52f52df2567225d2984ddfd7452e567a7f193b51cf45a55afc488cc9a66c5135bf215be4cffb19996fa9fbfac8f6448bdfa74718fee5cbc295f3f730f2dd2422852bb1b072194b933933d21df1a4556ab56e8b857d9177bc6cb1de20bc33ac05de099e526b047816226d0b24eefbb2deded95f85f4fc38c2b16690a091c0e959c8381d84badd9c90763851f7ba870e353233d332ec95db0a92807147709848986d9ecd4914ad2d6e3660dec794df51ce8c2f9e446225f33c21c3d2e0c3f4be9641a1a3f74ebe0d7a2372900674296d26a1f1a43f580df88f22cdb76df94c7fdcca7b2b014d590e7a9934375d6a0e8c0a5cd4099f2fe2311ad3bc37b11887c93e3d23245d40ec52114ac374696c8c61ec405b1f445e55869b26b0464954cf5195c9070f77054f299bf5b030e7368e9df8833222cb55772cfd41accc317b08e9084eaea815113d72e9f26619308828104eeda6094744dd9e88617638bc401b2efadf3200863a185881fb5ee747fd58cbfc4a0b5d90193f16e7a7c3a2a7da95b7aba2a6faa252701c36d39c539e76ffaf745e6d374468e3713634de34af2211dbc99aa2000b996a55d9fef299eee1a57e6651c910513887e168cbf7c597d17711b44cdbccd9c07a8534ecc3785c8802decac2a2a13b1854204a98e109eaef5ecd450ef639983589a91e954d803243a8047a72ccab38e0ad06588bab10e1154a185acb919ae5a5bba18543f91332e148a3c9298fb7a64f60175ad45b30314ec8b29008567174ed3080f5e8a3d096ea34a965f65135baf3d1c6622c4b45f54315b9fc0a2657c4ca91952fb93437164b60c86a2ae3eca749f7f975fbd9e9d13ed1914aff99c1ae9e6bd62039cffc258dbf2b95e7c9dd0d6638f4b1afbdbfc5ba1904dc44a118cba682022e89fbf45e2cb8298fa629b4c8d2058f6e0ed7691e859c5b2f0e10d886744ad4bb5c586202f3a120d102c4863b254a767055280ba78b9f2ec350032cad156c96a2a9adfc5c2d24f346a35063dcfcc0249db0bd4906544588e9a780864a5ef17517783aa024bbfd9a46cb1937b1c09124d3085719ea62c688463d56be140458d1df6f5b383a13d02b18f2a90dc85e5afc6ef6bedd06e241799b3659f96e533845c4eed24ab3d5f6967e64b9e29d6d4ad3ef606f00377d85253da5b6b564b1e148dd6c41574d35663d3b46dec98da69604db5c2f10a5359a312831b7b9fc8b14b3b714ca9c606cf36b044b5f51d1ee5b7adc68bbe5d6445b4ee9750f7491c316a709b058a44ced9f2b1b54095f8ccadc1abf898e3e3b426d7d46136f078268387bd29d673fcab6ee698f22de93243affcab76a1c01150ddaead8c09c6eca9f672465fe227fbcdee717b4ef31429ec76a033ab9ffff099818f14086eafb421050a35fab795de480ff5d3082e91a53b85da159ede6d90648c0ccd346400c98be656acc718f0ed3569d4f77ff2c1cf1a24bfd305939c04c3d6b6fb2ceca92632daf3b8906f28a95c4c8fd26b85ec91fcaa2b44323da1e7ca65bbb87851c243e4188dd2d6b819d22406389f9d8e937568656b258cef1af096a72e0adc68a7f357e147418406c491ce8b5f069184cee4c80fa5209c6ea857e7ab1280b5bea7c1a7399ccda2fe7eaa9f7812d3eb78cd26163398b146beef247a74cc543e7cbbc1271c5902f582947017d0546d9ed5143b59a6c8369fc94e0b", "536563", 1, -106775545, 1537743641, "14db19cf0420cda9c3d8e658f576e974cf8330f0e509c02257a443144a090b08"], - ["030000807082c40301cf1587643cac0c05acbefc1e4e0a7655c4f7c8c86c345e547e14dfdc96ebd8c80200000004515165658a711c6701cdf8e8050000000009ac6aac006a6a65ac65000000000000000003c599710500000000000000000000000092b23094a79ae403f33556a2f90d51eb7bbb429f057fda35a827bee2db7294c1b6dfd7ad7a4bca69cf80b4e4c957f2daefeb5db7f131a2551fa99787e50294f5fd4fd79461ee7eda46943cd76afa10dd56197e38562e37c4c9f550f848a1c8cc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7ecad0cb4322dbee73967ad21b42e8de711e5cf27f79ce7818fe36e6bcd487d80adba23b07e83bb02a54bb1e60e4191236db8b80a1caf8adc10618ab6d360952e667edd00160c5d8a31bbf8e9db74af8739432cc9caf7ac0690761ef54c2d7b2ba2ee9b7fff8d7aab4f079ec3f2df5d3d28377f5a24e4753dfa8e7c32eb7c3c030a04c7f5a95381fcdf567697759b0ed87e5faf3ec7e531bd5bdbc05b11d14e7c0212e50074b7dad69786576a8d5c66ff4dbe96150f7bd1ec9afae137c7195895480b02f260f3180bdf6a57a3c0183a18dce74dce89590309aa7946374e9ba6ab6d832d900c908e3e27be953bab729bf549d6a925a2d5467faba94472ead5e085d06f032d1f2615d7f828aaa992f75bfb140b9ca7a3d83f0c08ad78f5a78fdce9813bc00328ab5455c926114ccf4b5fc18a045580c1477aeda0fe2b47bf9446b8c90a3cb502213e23acf4056660f0d858979bc9abee684a04f7bbc02d12c601533628339dde020ad93d3391b77db99034bddd5bddc9903b1f0d8099893352ffa4b01bb927e220021e86b6741bc60f890c318b820ceb0a6d869e90529b0fd6ec6bb26ba68ef9cf6c98d420eabb06893cff2ea6558de15b0743dc9b10417795735d36fad33697bd5e778b57a4c54e7943b3b12c46dc03c2d39e0443815d6e4464913f87ab213ae9d84506a0aa3b47c7d451dbc91a60ef22143e88ad9a19a7366fff4e7a1644ab65885fefcf7709babf62740af725ad9ea962c6b5cef2e2eee50117338efd6d1abdcb98d5c1ffe5cab83db9e1889405d456b66a24734beff9cbbfbfd40e575a58c394262887fe511814c74b91f9b2af29fc207f12d2f949ddde346188c4041531e5cb8ec579da75a6a76c5e716005fb2a503a93e843227d886c6140fac770b6dfba1c6f1b015f1e3efc30f950997988f503ec139b9953559a6a38348b168341dead5bc5e1b4d053707894224ae8964d2c102b82718d749f32e41edd62ef243124ec8161887ec5a7eafc843de908e8555dca6fea9dbc0e3d80f2041d333b821c33017c2b9f918ec6dfce4b192e45dc5b5e330a459efdb9ce13e96725a7c09ca2b9a833636ead24f0161c7c91ffb3fe79bff16fe8ea874b36e7352d3cab60ebe8959aace1e366714bb4247539645b8f13c67a6769dab15c4029899313883c902a914f620d130874336f40bf56a29fc18fbdb6bb19f85f04127128a3862dd9c2b112279024f565292d8c072a3620751ed5089d1123d5548b5e530a60d4443040cdbe2be2ea944cfcc69a8b49f2352ff7b7e7f422fcd3a911677cf878a237a83aea08a7fa09d738f71012a736239e2b33126de5bb1d8084bd545b92c45b59baa794f4dd9ba1eeeb7ac65ab69c39f67b658083f220dfc016fb15136c264ff4bd0ac091d9cee673d4bf8adb1159c85828aadb6f203e3a14b113e3c0b6576a648a6c999838fc1da048b78457d2d9aaafc4a140aa8ca145e97482a99957d419c6e56ed74fb89118df78d03f9cb49a1705e13fa90881e6c5ab76c45829a948977ff6c317f6d95cb374200ad5517260d19353845f9d8aa87a10cd79dffe25d4e7841ced933d6154ee6c6301e2445537cc66ab0b812763c7d0516886beaf9a7888286f8f5cb79b0ade435c499d1132bcf9f2b607993cec30f28c5610fbc39d880bdfdb598cbc922a474ab6a7106e8ea9625089ef04188a3be7ebf5b0effb82359192783dfcc27e15bdeeaf98ded757808b153b8fa756af0c95de72f043554281dee9f86f651c0f8225c81e29bfb67e37379ffbb18d340aa75bce9e27d6de7115db2f7aea50b6fbca97919304e83aee9c55e3176c7eeba2e39c6f95eeaffa75a9d324c43b4b63a4f8b2a34e66fae2290186591eddcec174ef8ed38394ee6e407d6bc20e49d19ba0c3413f2af2845513db9b9df40bd914895245211e1f88643f3e0982612ba036d18865b6c810601cc21aee104d00637b51807b5183cdf19975010f37fd21aec9aab35a51bbc2e7acecf5595509517f21d9bec9a54dde85a474ada5cae932ee0089dae5b24205214bde3dc1e2cd12123747eecc521ff43924e22fa8ae67dc4d7201b28f0a58b024f9d08fd1b73c8ed7f604d23c6757abd6c132ac0a3e04cb2c00275d151b605551bc12756aa2f1857e949ea2545334a456ca30a3de3b3763531be22ed7fe2d48d3a51f29c973ebd06aec4761395f9bef0ae42cf731ead574f58b7a736aa6063962a286091be273ac03caa6c28d45763188946294d8fc3aba9879396117e0d66f28f198c077f5cee96fbb090c3ae175c03c010000000000000000000000004cad9fa1024416465edd2f61bda73b201adbe1300d84a8fcd63871853aceab2b0169bd06ccf16eaa8a219b82a62d3059a7239291242cc6226999996865eb8a67c330bb416fbe55eef80f6832c39d1e09155686b831fa7fee4862c8fd3ce9c57a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000be6bc9bb70c74d5b2331d98dc63e29fff30e2a6941e0a9cee1e41d15acc1f82547fcc8473e45f9c2e76975a3e3ac2eb5f39ad74713c13fd3898c44ea6a28322f57982760b230b80769cc5dba25574eeba90ab672bf62832798c3bf7dac849dd2df243554b01347fbea2ba0bd7369c62809dccea2f93725472d715b64fb7b828703121d8454afe77c9413100110d82ceb913854c58a2918b42ac68a79eb9737b52d022ecdb91d1a9b226b6c3a5843844aeeff753801b182d30e348168b285fd24e3eb0b0670cd770e35a4e828b9680063869982388ed7cde9fbf9d9490ddaa30244105b85badc73b7cc0b0267d1aec7800ff07c27c5b0c754aacdcb87182fa6b0c46ed002196b86229b667255f1c02656b0fe4d60a594bf37f784199d081ebf05bc65056e021fa07058a12dfab3f54d0049458abea7adf5ca098ce7382ddee8d4943e2af19b0308a6edf2f7783c68525aff6cb0c82641435c259c7064b9801cd6f84cee53b8cd022d2588dc5cb9f7bb466481fa7f3f0bfff7423b7dcb054a7dcb59017b33562a1b0329bc2a780c4b6370b8a1d033b454d2acb76e5e6ae311707ac2bd108a49a65f40b32135c096b30289529cab0e888c31c86006a56cd24cd164f95cb22f92c2a03c313692486aa0dae6b536d2f6800fffa189b17425bb761f3a8d851a440ced8da2ed674e90c4cad5344fb1459eefeccaa82cf0812958b1cca348fec31ad0069479ad11c4de165521ff09f1b5bba39cb135c5d9a7d3d2356fd425448235f9e3c0d6544f9508e7109e7d03e74ce10cdc4c03192b2ffac3bab707f4e44137d087cd0267afd4a653d25320628e7d8370255c81402702803e74f614bdfefe5b1ca34cd703abf9dca9548ebf9aeb7d82884bd093c733cdcd54332f979d0466ca8fcdbbb88f1ac5d464eb6f84cfc0875de30f4350350c292f811d047282d6b4b5d003221ed18bb3666ae08befa5f7d63ed05f2b751451bfbe5134f254d8a736554dae1ca222ca54cb86c8042570bbeeb058a0b7639fb442a2bd9a2b7dcb4e57dc0955dd8b0f86a1cace36ba81a4a3a9c001946ced140786331678a4625c212e7ca4206b21a8988f93d0688c9ce4e9a044bd36e25ae15b01be87466adfa580f1403e765e65a62cdfd0270f5391e0bf2844878eb56fa5d5f1ce3e14aebfcee062296d163e414de7ba35dea71da03e090bf2ea7b1cdc1ad2c40a06f377543b822bd58b310f5612edbab0d32de76edeb1e6486b918934f2f919ba21c0ac5d9b693ff0d9166064af0f41f0aeecd07c222f94a88746096aff8639054f66e76c73e5ff44f654e193aadd3c81658cc0b48fe129c6fde8c653450a69b95afc8a1e4dfba9b0c9e233ac262c00479c07c6c790212b597c59868d228a30f8b2ada184627f8ce73211a4ca79e755ff8fcb1d14f35b3adf6acc6c4096f7d196dc6bdb6a562ec330c6912fae8be15c33f2d707d2ea095553a00fb7fcb02d36e0c99fd51ef5a85b90e1dbfb82313a05eff9a9e97b0bd342e3787476e0c39b290c3b4bdef9b6d967b9105b025f9ffc5fe7e00f7cfbc5791d782cba3f97ddb98d7bd55d5ee6bb1d76bf421ee87b81787ec6cb626c0490c3c5ccb3a88df6bccd79f6e798ada35628891bef1f4abf8fd40bb1502b6bf7a59f7ed8e776938d147c15cf376aa92909244dcae00ddfb804672b60795b03928e985d9daa615d5232e49efc048f1ff887a99876cb49986ecd79231361007261b0bdc8c0ce6b9f4bed9f232bb2924f9e89aad3a476351913378933d12068fa44b9e544921e3e3de098a6a16b44e923b852aec81adbf7fc8f93787fe74e4c8ea937a311cadcb415fa6ef7c2f68a40aeb46b157daf45d46524c090d8d00639a8634329318866861765ba6f70efceaa882acf4a3e851be62dd5c9da630a8d1978a8f108d2ffb1810224845a7cde47feb503c2cafa2a494e54262b2c404d5a1b793a8c1c961b642fb27a014a45b6505ed74ae6c144e7038ef0be5ada19e6195b114761d037f5967386e943a53cd766bd5d4b529aa639998841a790fb075ddeb49ad88c95aaccb877760c40b40a57edc2451b4f68f60963ba3f71f71417f902ac4bbb21091a285919e37b6e99ba64940d0c4364a9e16095c44812c3e69755021579b6a2b29e04ca120f9043f396bb6e6ca8262bca40aafb13635a214ad87fbe6390014c7213884a3f426f4d38193cadcef541e603d709502f96664b296aaae9fc857c63cd7c547caacd403cbd51adbe73d81f84c0ca8bfe72710ad1198c793a198af95be8f8632ef559b244350000000000000000a163e405000000005f9247149bc449f78241fe7783c56dae5c22ca892cf929d9285e6e4291e0aab067a6a16d65357f6c17e18299bd5d76fcf1b4e6a3ffc440b30f8ff1b43159cc4a64cdd75057414eaddc13bc56dbea9cbf46bd7070f174e5a79b3d31b3aa2a9a060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012ead841631161b6c35de53d031981dcfa3baeb45d751bd34e192b0347d1f03f2f2d35646b561b3a8107a058a4a94b85b91ba314845af5988cb3421fca3417dde48b78afca26bb08a5706815f78ef10b00ae2263322da7234a7b271881a01e5f7f7490767e38880fc814d7db65efe824499c19eb0845a4672d14bfc0b46f636d0225cf6a2e661140e9acbc5b9420250c4a38e7f4d61b3fe315a4d1e87992407bee031255140720ef7886890cd8840b105d572b6135e25286fbe0c4664cad0bed453b0b0772117ae1ff18a36b7f2273209ba283f1a8ac6bcbb968ad5db0e94418e7cb36e48bc50c521c29dd4af80d45a45564243afd359dc29a47203cbc130026765e2c0227c3ba34eb0e4c7ee01a102b73023c44d6f1ccdad59edf47da7cfafb4cc8b93d020edf92789b719d08c95ac849bdadda71f0ed4d9f6b59464876e76ba0e42291dc021b42b06a48a6c77bf3e84b5c1948f7258582c9fdc7608c5af14a0ef055a78436030f3e55fd10539a76f6dd5a5437888342de4811777eb0d484213b592de1c3bcae032db1136808339fe69926df9147e08b082958937d612a94261b7ffb7f46736de6046dc17f422b0033742132f718b7df8f79183f0b366f7697fd0230dd18d5c4c352c2b6d203fbd17784e3bcc3e6c77ec0db317e51b6b8bac2cb48943e2d66736bf639be4202f4db59045a3cff3a6880553c4b63c8b208d15b89f939141accee597cb779f331ae2d2aaa90310acab870d39673667a6b30c4ce9e32be9aa69c878b33e444149b0a594b1a832aa5ad1aec3513414e7c71fde68b069f909e5d37b63206831afc70213a43bf8cab89a70d2ba0abe370a95ea5637a0d8ba0f507c16bca27772c3c39678fab6e32fefbdb179ff49873025a20dc2ffee73937dcd5b3eadef0416b61986a8be0e9788b714dca7a6c412eebae78c4c1c51f1d0b4e3c1af10cf7de8d0ceb27c1632acf7a3194b5da8f1c03fa17981d27b5ffad7554dab99af0f4c5992df097a337e3b4b6a4fb913a16a42a6e4024691d4d03c53ec7690d7b754793ecb8d8cfb69ca132733fdff252d59bc92db35ba34a0347bb7795c453ece0c2ad7a9f0dfa0740fec1c8281b4dba86ecf8e6c06c86299017c70cc7f09706fa745f89696664aa9a46175a1e4c08d4a33a4c3b8a300303989a7dd5a6b5862be7a27dbbf124d6684655a66b97ce42400be673dfb4ac336e4b5a458faf3320f52cef87ddcaac7ce7b55de34a3be4dff5ebc97f423d3ea530455c164cb50fcccf9c153d89d90faae6c2823d2e2f889ebc73fe90b48076518c2be1b4e9287af2e80b47da34ec3e7eb156a602a0dda31532f8ab1b9650b6effe7e59ee7a34056129e4fa6de1672e980746e4b0b75544ea67ab960fab74ffc524d60350777a8c0f2af3c79e85160adf7271b9a9f973ebee4c6fa87967f9f5da9edd7e9798ff725ddbc5c28335c53298508cdd6fecf199d51083c90716b9d1dea536c302d0dd89038239838f06f549d077b28fd5bf86d3770c01cb1988e5974a4136b624dee745d876b6b2249898c57a6459d153d89cb99186dc6dab636ad8d94351f8f4d67c2da94483e597dd4baa334eaccc6248f786afb18bed1f0dc3adf19fe4e4fdaee38569dd4740410a950de2486dedbb332a8c19243256c1fa7bdeae3a3efd3e4805468cef340f188ac004f5092c922666ad6405ee44d9aa79b36cfaf2ce3c1ff108c81ea71e6d3b144bc571a7ae519b9a6d2468c9aaed123c38a86b66fb2d3da16cc711c7279c98c537371e3895e482d31451b23680ab7aa75845b71cccf42ee0d556eb8452e1d0b41f49907fc8c12f8813f72ba0fb0fc5b3c337dfb2f2337cbcd7b41e0671cd11c6c12c16036348f710bdf672575ee4c6ced2bff9b7995b6fc07ca8be1220177898b4672cc352311dcbc50906542a74b1c2167544a44f0a677584f00add61d2f6df236a513c091a41d1a14048892c20949af8ad31bd89079e17fb5b826987c61e2a903213301631830b770732b6752329b785226ce9728989d5b78d91a1776ee9bfe102835851b7900882334db3c560097b950120ae66e46cbfb9fd27ce64c3a87f69f07e9eeef097f676ec34011c4db83103645905711d53eecfb32a42409181717a1b2436a084b3e30ef2a64cf53848335854e5f7b4203308faa3b4abc5621d8bd5a420b6e4931ed95078dab5d76d4b618eed249cbc420d23a01418f57c80f91d4b5f950de1c87b7e72be911db19e7adb82f5967ff3a9dd36ecffebbab57d9c45e7b72c71af02bc9da707b901e20f34b7018460f210381259258a1f0065482e3fe1406326ef3b99a1c31e5828a8375e71e8efa18dda06a529fecf1b042c62b800bb329a72395a313f066e12e08d0a53355bdcb6c51290993ed3d77076c07d9598c79903307d8e0921e5c7b0078ba90a", "52ac53ac", 0, -189656669, 1537743641, "19758dcec4e7d1dda723ad14d13a2870b88d7591dd99a46317729263a2566fe4"], - ["030000807082c4030191772efd0468c4a78172cae344662f3f5e0ebaea56562cf0726663c61f7d455900000000056a525163003a820f3a022ba8da010000000009636352ac6a520000515b35810500000000075165535363656500000000000000000100000000000000007d4c1d050000000030423e50d4ada090f7fb80936ecea65dc770e1ef93d5a5b8787b2dffd28dd0f51e52c9a049af2b57b90213734ebbbac8915c7430c3a2d69583434105e1052598cc26b7ce7a0f6f54dfd66026a6cb9ff2e191f1ce85b99027ac960433a78641cf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000812d4a6e55af2c26203fe4b33cd80b79b883c7d64c7ff0c5bad35cbcd9389b654792e38e76b59d8d7eae045137071b21564e73cdf9b5e678bdf7621d16667d148c3c843c32c900d198e9690037fc7b338b4a784e43e49c72b675c72d8498a7f5b462b304de3836bec636b9775bebe2efb077d894c2a06502caf831e7229b8a9f021f59bf2c27d4fc7e8c49d5f48d7e1f7710f568b4ddaf92a3bddf1cdceb7521f9031a5759e24e42a1d3feb55e328b341086ef804f578736ad3c5d304917414dd0130b0105fba8d381bb32fd979c16b2b99a2c5f64277a3f0ec96a66f9342dc69face5b97c2937f2c5e4c270363156244a724275a6dbd144cc216951ba34ed03e0d1920219eac95a6e8c9fa76fd55d889c2e3934e48992982ec9d91cb20abd0a0d92fd0a0204ee7ee2f61b3bb4f6209cedbdb1ac82b73adfbe6bb6cd352400348b6cd898af0203ecbbe2644055eb2dc117338181d6a73d0913536741aa6af33137bb49849dd20328202df1d507c41de83224dabe2919853c1510d183ebc2298fb6a9aa02050f360309f9b566c87010ef085da06fabf60dfa450dd4b99cd681f71cc9b090b2cf1e284185ba626371abda529eb7a68c525cd7b0c7f3b37d3455b9dfa309f0b30534f89952f7d892e490941e99409fe7de0fa5cea11a02c4ea659e14b0687dd733ae2a5e717e53af98f718c5565b556d62060b813baa61ba0c4d35cfbd840d489f73bab424c21e7192ed4256878a76708fe1d362d746610a8c4a9201309c1fdece33939c01fcdaea84c91cac47bc3da74876c5ff80b0d406b77bdbc56eb90da25af026d365b24f3637df0580313fe892fc9443157de4b86b18fb27fc366a57ffe6d7521e2bb0ad21f2cac4adb72c754641cab03d9146e13a3636f0b48585f6ad207732863463ef2c495529489c454b1ca7e8ea9298592c12e450ffe73b01ef90af121e10ec14c570c6d820c160c79146a00be7309b28c61ce7c2cec3d5a53826c571a928c096d5feb744d22e2f19c7ece0d13dbbe594e80f3d5f5cb6317e6ef1e3a38da00e926b542df6c31b93d22d28996e77615de3ed17795799c0b133773e7b60e45991d18ea7169459eadb866d3e5e199d4482597db4111cb09c58f37495b35c575b539420bdaa4c41431fae6211828e734a16b01ad0154ec1a793ff81179494188970e9e671eff66abfccd38f70576c63ed1796c8cb170a02716b72bcce26726f1164e7c8cd728cc84c7fd33937824a9170da43d71e0c79b0a250e21eb8a3d6d535a55c21ea3544ac76f3021573ca4602b8256c1d3fc7421f29c26f9d8c901bbba7fb606fecc0e4bb7f7a50cec0e494ac5637c31fa11aa37a5483aaf82583147ea21552adc4826aa82ff4f37b857d92c040a8bec5bd9056820a4badcc65935b9cb3dd29f588d3666513240a24a116038df9addde4482d4c9f72da28303f8cf0327eccbedf83e96f5caff20c5ca21f6b380541eb9860b7cc108da3b5c81ff377fc987d08978eb83c98576882acafdc2e75d50e498d7e6d27714c7bd4978cb427de84f772dc8098ac37085a245a1c868975d8969676c28f653eb59a5c48ef6e271e82a78a7557d543261d55843136d82cc7a4e599fdfe3776088754bfc2119a2a0da6af9970bd78e2863321492e5148b07db061e3953133c044f4ef122158bf38989d80df61cc8b9d651ad8d461e04c40a4e093a1a27376f7dd039f746e745b20802d24689826a06cf30fd01724039c7e6419def5bed7de251296963c7b82d0062b0ab18e7e94b59114503a4f812c27b04d19e6b42b608f6b7fca0482eee6e052b9b1719e57ac08e75fe6585fcd2b169b0eb90994cb74f850e905688f7548fd7297cea131d91fd0e77905d2a8d681f449953e7178a8f451220b9fc005b481bb51837495d80e924c3042eefae19313d64d9bb310a45818508e6f68981b6d2cc715dccc791ecfb0a39c3b7863d0dd4de9fde7d940eee556d6ee86af64200ab7d2a682d66178149167acfc4f54d1e230349834d01e7ebc599848f33f81348a3a52e939f768c53a29ec97647ce14aa01f1e6942a128df5959eda5935da4e78e76b27f29d9656538ee683ca88bde051defc1b6fc200648e74b27b141caf2f7dff61f7f5f1956a9a1b71df0b666f68950afdca9c2e8be749d29660abfe3c77533ae35e27387d15e079567798c3dc9f2977b9e1c46e8ea3091571fddac9bc7a86b45606fdd0a93e1c6a0c7b5125e71e63963c2e358e3bc0d16153df9c4988e2d5a1249032c42ea42e97213d37a1d5aab912aad9e3c23ed4f40b7ee720ec087a9bb12260c3a1483422f2e2ffd20d36f67602204efc0ded0d582994dea4ba7a2506892e10fe7d4ae78f9645ad916ced821a0417ae6218b614eb2a787d460147790ac0ad75e978a82c07cc6236ffa9992e21dae2fbb889407", "63", 0, -1629129596, 0, "fd90729f2e9eb6b4c764efa3a39227b881ba7340c967a081e85ed4370cfd2f78"], - ["030000807082c40303b50a27a9886e78cfbc2a65523e2869a3aeae8a656f4ae53749468f507c3ed012030000000100ffffffff5aad6a66bcff0f216b8380828ccb5cb6504c7e79250a00065e35a9d7abf5a8540300000003520063ffffffff718460a8dea5551d831772d315cdae4485bed069d30b332c7911740ec13335b60200000009516a6aac5351636553c249069201af68b1000000000004656a650000000000e9dd73a6034e8fc4020000000000000000000000006bd9e9ceb1f534bc4363cd9db2a435d09648884370ec2d803d9321bb141633347f6ad88fa8d6f079bf27456e114ffb11c45f1e1ae636c34d2afeeb802c01250dea35eeccfb97ada9acf032d31198d2830d2a7ae9841816d97bd909e60e5ccab2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008049651d6301df16248f3ad0d64f68466fd677bb3a26da94b37ed661ab1cf57221a77f4e81c548079aae2a987f138c5a7d43872dc9c9999099ef5a808a332ae2d58de177200078ae478c3c761cc4b873ad6b209870c1c355d04131a0e146acd72920b4493923f42d55f0eb00db4c4df0a563bbc60136f7d1be473ee39064bf9e02247171b157463bc8a87f1d02c81167c5829fd07f1c740c7065488213b0c85b8402278418d33d1f3a14e6892abd4a99e6a09e6e04432c063df0596bb5f46ec13c510b05162d87e5149a8cf315ac74f36ca7549d8f087682ff65974ec7e0efff06d51866676a85b9ccb492986b4543a41390fd04cdf14e438c51035401cd029b4ae7ea030c3cb4b98e56ebee1fc96e9ffb3d70b56bd1f5d4e3f0943eef6dc7424f92a52702254038bcb2561d7c379ecc6fa33e662a2266205fb084fbd8eb98486a536b6f8c020a2e230a7b03baf30c02d3802da56ae06623299643c0135a70972380a96ff79b02256e0d8cd4c5fdf50b5a388931cb08a8595c39410a66bbfc1ed6e0ee2d13cb7b030d4548cd87ef76a33ff06fe7bcf095cb8806f8b325f80bf918887ed473f366e3935d39ea905020b6d8edd43367681a545e745f82c7c51a56df0b4136b25649a39f8683204f0a7c0a33380e8dea4688f673a7909159dcc60ae082081d9cbd96fa651f6f9283c20c8817c59fa65604fba62e10768f96cfd23af614c54222786844192b40a315f9a4cd0896dedd51f79ecd7e0be79e9bda973b4d466dd3cb3f6bbc7f3b593677779ba83d69e9ae8f0d9e121fd44751506c29dcfaf0c443fa6808d43a59f9c55b577e8ec95f387668b4afc01564b27e622532894b67bcbb96ea689998410d73d6783c02d0e5b866cb1e5fe4ba3d639181fcb5a1be1bc95783275b8f78be46f93535b05ab3600e9b8190456f4ecebb99f12151fd2c3a7188a9106c790e1306325d5a11180c6a8869b87f1d670b12a8e72fa746776fbab7d4a8a2dd821340de84dc13dc1657bf732156db50df87ae0361dd6f8c322b85ccf4bd97745b8b3c0eb64bb434836fb239c41e71e2e657a40f56c31b6f7c1fb87ba02321b6174b1b5acdc7fa395713c864e8c30ba197e059e85e76623a485930d435d3881c1a0f401d9670a64f1e42c263137f73270cf4bd4e94f1c7433edd99c522020ebe09bd4eef03c14541e0471ddb558f32fe7bb89db7ca6703359cfc7d7058326cde5429a4e19bc8ab05873e46cc0bb5f3aa442bd1057f9a9eff741e0c8e3fed365991667b3aaa1f5b877926f36b3ae1e5196ff5aa0229409d7e375cfe890e762b52877d4782e367b14c156a15a609b9717818c7bebeb569d108999925d6c49d0c0a03131ca88acd0d48a970dc6dfef1f8c8882bfa5aac2f3d5d740b74328cf644587aec0ce271e7311e2d2b63459a28f6eaa4318dcf957281767b47c80eca60abfa9d873de26401d49dd3251fe802f6be6b685bd16d3099ee20fb595350ff4354cf800e34b1ffc0c857c42d8c3bfce4de7814d3922e74a193f6d4a26daf38894f82fabc081525ec116c41d633415c9fb4fd6be00a5e4bb615ab527e4c24386fd113d1ca214cfaae1b73c32d3cf65ab6a59e87e8282cb028a9b7d2832c983a877490902c6e8c525a7ba271be9f391ca4c7117a3374a33bd58193a767023fb294ae34adf498669b247e0b1c3ae8d9918288f64e5f4d2c92d781193dd790ae3ccce1712d5495029687ef447eea508d5d0920ecf9ff00d79d8f1e27d5ed7ae1c4707d17a975fee79a038b3742b9dca1720831897ba0d2a9b4e78f4587a08e90edd08eebbe4b3ac18a0597cd1110b06c5a06d6c144ad91f992e156de0b87826dbcbec0473323c6db051074f89315e86304517cfe82861edaeabcb68be9c09ae165df746cd9811f69c8fb142378465a55a424ccf8a0f9055090017209e3647bf6945eaffadde2510c2f1cd22f4be6447e0f6163ce1533ebb8ed3720d3138562e0e019a5a1c2131e65cd9b8f191ea36caf5d348f0aabca1ee278aa9b21723b631d1d4f9a0c093448ca338ae761636820f1ebb246c646be5e15fcce1dc81551d1ff7d558136d11f0c1c5c3beaac95288dbbd6ecfb34a4497a8655beaa835fdc734a932bbbc821f7f1433047a110f73a67faa136dc133555ba462f1524509dc2a3747f96368b861c0a85a05425de76b09ec99ee461de685fe63fb5f75a3733e8fa0ad5faf8a9cfc4b2c96f2f58f815e94e48e225ae342315de244c98896af04c142e0fe6acd5353c89d778c020edfa983b126d1b1a1aa97dd4109a270000000000000000000000000084e2700ec389e54f97f981abb81605b9efa8851c856846ad6f7b9ee1d842452e3486509435f88afcfe20dae2ca09976c0a1a33f41c9319736cbb8005f38d8157460db3f206e11a182509f2fb7602aa6fe2aeb40d179b3e3b2c67edd395342a3b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028ca5864fd6c406cfbd1eceb4d2887a1d3edf7b25c10e2ef05e070ba6a4b80294c8b60d3eb22bd540153187728684023eebb5e4b8332da4beadf123691605a17c68a60574feefcf9c4325f37bafda7f724e2150cf3fd39de59ff29c6ec0a0eefe87939aecd237fa1dddf9391cc0e7fcbf6842adc42f77f7dda47b3a0b0b4924102071257ee618064e0352413f4f6e3adaa726d5da72fc9f06720e1968413e2294b0218156821234e35a1f8caa56ce844d8e6646935b05a3bc6fb40a0be5ff4a3e3e60a037ec4d955659360b7aa99d73948d390525e231540809d91405f7689c60d8ebae0dfc25396f110b17a1dae198c08005a8a67744dd0cd11c11555f9e2dc06db28021b7681de92bff7bb8debd02c402269a9a8a221c67c7d934a46c9e5f5faf866a3021250d4d6b5e509aebe1ba4b7fb188b8798eeaf19283042ae42472939ee5c6669020ed64786afc1e8f1c65463d95ccfee7be355c1c7f8a1bdeb889d534067158ffa022376307b100c36402ae617e4a651a9ce939a09b224e13833103efd2554d5bc9b0313404fdf0581ed5140aae19d89880f98b966cecbd5bbe339d2f98b1faf78fcaeadf5655ed83bdf831cb25400d53f28c2fbb57f716ae90ec4a08509f11311d2948349b4e5a6a361430efcee8c92d831059119b9edb059045306931f4f438d5972379f152b6c3ce7e72cd3febc5399da9bcc30bad448cac61abb4a9c22239681ab60b7fb263e038eaeac704167087b82bff586756dabac7618482fccbe957888d5ac7c492aff1da171ca57c58af1251b0801960d9837d633eb7545ec8dc527fb1862b2c66dcb2a8f85373d3f9bb88fe0fb960a9ea30cafb704d3742830c0b640e0ac8567516a5437122560b44be771253de2565ccddecb4fd7e0648e7c094d38f7fb0452a14ae6dd9a5f37a178cdf74fe4eea339fef3e4c27f2bde267b54a4fbb61b3fa3b1c23dc0550b9aa057c18cc19256c8aed070d6911e6e4c2ca48a516443ceaa3cc4676a5865970463c502119b0a9b00b6615ec249da3a7b99e8c31a1491b34cf1f757408181b9ce5f911d507db756a0f609553bd003d0f467e567e09623e72a5cfc9d52ef581746ff15fc6728db3445292c3085d526b82a4836ddd689de7f86fd69f2bdaa0fde01ee35d0369357aeb9f759087604aa9e0d7e3c9d98c5995d56cdd1b9ab2882e4298c4bcf29686c74e0ec3b63a423e5c15f19025588c31c2c3f641e8374364a7f4bf23a02aadbe271bb00daec07079ba83b21d3da653f21bd0e26443acec2ddcadb519a9b7a50f21c951ab6206be8c9662feb350eaa67e6090d037803673374aac108190a6b82ac3c129400931188e934a7fd7c29391c367c81acfdff25295295e98742719a9cfc2d43aae80fe1d5a6e4cebe55a74e0f5b0fb31ac38272156603d3c989267012f58a066acd01e70c5481f2c3fa8149dd1def21121ae685ae64811551ffc44dd744185df5c356dd1ecfafdebd0367afd719c408e375d78b1c60d61ded50c9a0c547ae710632c25e58ae162c1c9f8b4f851b69977279f6be65e6a5ef5cc528c7a716204aa268957a556306bde9b28c82a6a472aa8a20ad91642e3ff29b6e61cb3e0c3aa18779226b43ed5b6a0e660d4678867e201b5ac0b16785459b3ace47e95ff6cd9c02739919f080295b764bc3abc6e38abf6e4491f2f1fa93404ff3692fccca698b3ae2a82a1c9f8fd2d9469e826db252dc1ceb51418bc8a8a866e0bb0111f773f640ad3661303039ca8318645bbe07aaf0bb9e520f7a3dc04fbfec2fe3f8add46b17621e388ae1f3e80a314c60128163ed48c19b8b2659063d951bd538de041b2c89861635ef94de0c578929ca437ca4175a1164eb3260d424532d1385a78828bbd16612ee5ae41c679fadc3f1934abee633335de3cbead263df2252ab118d704e069131bc2a07638a2da20f7a801c2c23dedf6ac2a08298f91bf678604e1e8c617d53403a13ad4488f9c73c6b359347ffd1519884651099506a89bb8467120c341bfd29e0216dd9d52b521cfab04301036cc7d77edbb8965068bda906cb5efe0efbed506c02d6498514a1d96e38d5b8eea75d263ceaec0c478f5ea1f53c00f684e543ea103d7d24842bfbdd8f1c1885a1775ac9846ee7f3085266105c2cba2368d2ef37916d9f364a0ff591781d8e23f844499a8016b2ec382c9168bff415cf67a0fe9c49e769fe3bd9a55b1cdeac8428c91379bd82ba9259926b97f39daa024a740506565e9b59f563cd69e7d735c74dfed14a2afaf63274972a558c4c9aa82b6c09c505000000000000000000000000ce2103fa047b5de8ba01a1336ce26141b723cd9081cbb4835c37ddf4c1d85c822dd2bd11c7caced8c4ea8f656075bddde6c531bfa29475d1747afcb8749a8343b422bd445dc4479931a922e7a40bf1de78ad9cde1a68b0133645a8ec630e7e4500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000da1fd9f415f8274a2234021e01ba22662fdbae91b7d84f4430640e170e6e2531918715c280828e1c96e5399b4f6d494d27e20bb815c6b008b88a03a123ecdac612368015a59679fca3a0dd09b1096f53da24d40ed210e63fc039496dbe14dda871641368b2f47034af82fc20cb6b83c04f7bb8c950dcffc921722791baad609a032cc20db3ffdbb1a3f795f4e4863036e99b1df18a471bb19f54b5d31cb4ba577e032e96bd957e7799d41c586fecff2edca8013730ad0bde1e157ef175c66ee5f19f0a03699f48f25b5b3a89b7200ce1646d210647230db65e612b07007660bb40fc654b026e8b784971c91335cbeb729f7c4e0f0b186026baef2605c446e3dc016b9d030e1670bccb31cc15817cd4f259e9f1f1792abafe1a3ffcc50506966b7a7d8ca8030cd13561cd034a1ca490a0a28b06504e73614cd4dd118a292ecc2f2598d08df0020476bb15881430b1343090ca76a0ea90dd02fce76c9b0b72129dfbdbd6265b8f0321b157a16e3024d9b8cfbbf76026a6c560b4631acc1e3972ece7e02b519a55c8020c21b7b92b1a89134598ee35d98bbd161e5addf52c3ed8bc691457fd3a8ed9e5208af950b8456108e8811b9b89eba314acd425ff4ea85cf0166a6cad5b7ef9a1f905ad8521020924108d03a75284f824973e6b279bc0e941f64165e20e80e271d5507a3cfd90d3623f46ac4fd5bea18b8b97965f99d5c394c1ea02258c73f3d2267e8d6d822e28366d2d6b203821751661c199d089d082138a66704bf70285cde9ebbaa5361f2b9fde5fe2a2ecb64c65410c4e111a7b91f9ab77c95e58825d4ab945b74cd04bcfb7e381e089c6ae1c26fa36b98f7b02dcd7a5aa06180e44ab726693d032996fbaa19d6bbd21c314edae256ac4043cc330097db1967d5e2a2852e503127fb69432f2262770a8ba537fc4d632a0f298be0a9debd2659eb7e5a23971d2342863af4dd38c4e25f3155e1c0d809798114f161fcd582727b0ee7b8b573775d191cd8ea66e9945821559102496c178a257f67dbddbbf6c9f7dd7e5fba83c79b74c72d406a84c031d425880d98b8212af528eb5476ff29546e080afa3c532281a97ed1c5fed397cdae7df3a04f06cb0cab8901a5bed5ce2cb0f21b64a7638ae1ad5019dc52aece48eaaae5de8cc87126208b2ccffb7dc53a33639a6336c2785adbe01ff656dc7f8e98b584cb40d0be7de1166c351ed7765a3c601c7051b7fb9a7c5892b4f66fdc36a759551294b628a6ac40402e7ebd8daf07170a81e5baa74aa9c986a157fe5bc00c3cd307069ec18b0831de8a98ad5af393043c8dc4da909080ee49f7325d104865bd295ee965ec04b5c7a2ac56308d11439e106f3821df36c5079e40ffac915793ca2fdc7e456f4dee1e10e35dc1c10406fa64c4a893da9438a62e012d1d10701cf6ab37eda37864808ea87510456efc031c4ac8d658a011b75b500955751aa8a29aac12bff211c154ed6a3e8596827aa8b59d5e63db995b04e23b1210b3878dfb920645747231334a04a018ad12e15b20e6ed330c4c6d3a5b86c2901bbb7fc43011b16dd7a6a7caa991e7b637bd400c4cdb722cf11cc73c02846c08ded81f76157b7c46b4dbd47f76cc8268a6f2ff905415e3a4b8ca9d354c8f48a53b9ccb8130b224e08991cfa383005bd343d8663642ad8bd76bd845c88143a9d5d504c179e9018376154c2e4be8a2abdb75a8954216a8de5fed9960b3775c8bdbded4abb084c5bafd90484c6a182cf44125d2536fa2248ab8e0478708970e7c4296105df22c1d96f478def279791d7cb90a6641e9fa44d8e1369964d899e5f9943beddbc122c7270fe85e019a4eb4cccccea711e8acab2b60ad7d9244aa61a7237e67fd601e508c5b221f0a9ff4dcfc00d45085a5131af7e58743d92a670f9ce2bc30d535a1e8b41eaa8ced8f5cc6a11a85c9daffd668794d294ea6ea54f9899bf4bdefd3ae0034cd59449b1de7c7f4e1f492a4aa11a01e1072608cc6108986f9b6e35b2cbbd3283cd98c5e334e868334ac8670443b960635902da41b7d58aec3c2e95a74a26afd40481c37019b54b8e382f14c1410591dc88935c81a8ff9480bdc566a017783fb49ef1dbb4683286a58bcd6050fe92e07fd32f79dca12e880c175813a98e0c141f7d0c7a6e06afd7850664f48bb91e829523baabfb0e6766f6013c7dadcb5d2c8d8a8face16524b4a8ce1c55858403856a1471f3b4f63b9e2f3845d975125b0308b8825df13086d11e4eff4c1f34621d04a17e107707bdc84aaab8319383cfe6195ba2c46bdd5eba40542e0ab91d2e7165a91f67dbcd792be636fd0df556befe187aa407ec2a7074c39ff861ad2f43f2dd11e1c8dc0fce63fb7678facb08acb1525261acaf76463d2092ef04c792025377669aa7f598ade3402c416545b930c913ea531501", "5253006500", 2, -743904984, 0, "7c0a79659f47ebc16e1eabbc7d709aff5309202aede3e744c8d9b00aa6230620"], - ["030000807082c4030469a5f9227d1ebe88a9cf5566ac6f59d6a4734069bbdcc55d58eda002f5d297e70000000002000078eb9e53436a6557f1f1a2dc20ccf87df407ed9f52b3b95d434c524d1a29cdf4e335d0370100000003ac5353ffffffff99080365df9882293b1d0961dbafb86b8330f933efd2999b8ed74e6209b6c0b500000000055165526a51d95fb2e0c3ca4ac733ce1cd73fffd08cd7ae041519cce28f1969defa6506e8fa963fa0cd0100000004006363523ca345d3046a391a030000000003acac52e49175010000000008ac63006a6300516aff8446050000000007515252006300ac54fea101000000000763ac6300ac00630000000025e92afe030000000000000000c82fd30200000000e519c1aa3bc39bfa2b88fe40b15db44b74afa3784922cf95725b8021d54e5ffb60732defa6b7a6121f3fc75e232acc5c2d3f60614e0bb5788acbc839adbf3a8f1505cbd0a1146c0446922718835ec2923a762bce3394490257f31a1f1ad7ee410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060d279bb9970b7c2987b27e068f721eacaa3de7a8ba1ac8cf9077d547cdf26e1bbfa713c0be35c1d5af3e9a369dc9123083340a11eb71543acf697eacce4df6cc4d5c8c859fc7d65c34644210c0ea3945deb0901014bad5127659462a41a7a0987e7703985d8f997431119e3c908eae6f0a87182f57c7d20101532ea7faa4f4f02147de1b4a05f7dd2665949fb6ae8e0a75ee28fc5d749ac1f7ec8727a90847a1f022ab0e3d73fe1f72dc95f79a0ce68484e5133d10ee51b84e0439dfc118fd367fb0a0582a75e46db220148f70a921be386a3ba48821434107f1f256fafc3b3ffd86b40b6ef69391ec02f2419d50d23c59813254813858eca0b7fd3c46e3108b8c7000312f3d10ed442c4883ceedebf941b2528e7d641e1400d3de080947eed782591b3021e04e6eed90dfa06087f11c1499cf0ab9627c880c7d1abc8dd41a44c45b7a8b403029adad29c4125dd6e2625204126b5b99b2073f9b421eac2ee5d3dfe7d9d84920224cadcd4ca53858a0681ad7f3f795de63ca04c817907104875776fa125ac0067020521100066407a656e5bbf940560ddda89d851aa5761922c7aa5d871ab8030e8166f23f1e306936f185f0c0cb6468a88f60e636790e779bd2f5774a9568dcbb7ac7c56264b115f4747787a54be7c71207913d772e9f25e462f089eab53c7205848d1fe439acec03bfb5ec40c749d258c865bf5ba33b608ff021df235fd2703f7cab094cbc9f59c9547483e018226f0c3b61712186d4eb272b175a6d5aebfcf0edb20ce9b82ca3e5699cf114406aabafc5978b209713416c277d7430a3f734b42683b8d03299cf265fcd786199753207ec8ec1daf13e2848e2973b6e984e674382952440d0cabd761c2a5b632b6b646f423744fe3914f16bd9d61068c50cbf5a3fbc6130c8ee9dca2bb2be4399c45f28f9ea82eaf90cb4f9aa81385f2f46fd2fb4c4c54cc3fb9155dd7fdfbf371bd836559eed5657535acaf79e24a72aeaabe75cca290a55b7c7d11a70b523682302bfd72794015702bceac55850eae82fca5ccaf2907dca9334a06c747fb9f07dafcc977d382e2f20d6d595d74c1e5481f97d49b6a423ee70ea2abd0729fd7c562eef6033ad6dc0a96b22ddb01ea61ccc86ede50f9be56ef0a33f3d6c75b582ecb213a9325ae60883598007c46cf5266b9afc0e74de69e9dcac81986d66f9bd1ae159d0ee8b582a934c2abb3c7b634f0a700bbe95a404cd26e7c0c510a494a091a7a79d547f5b2627231b871383e6d988ee2dff46e304e491b45c6cdb2cfd6cdb0ea24e4ef858f246ab15faec5c88a42dca8342ba2343e894bc38e43380a4d33f0b86996485cbab9fc0ea02268bad1ca6212f98fb583b6088ad1a4524d0092142cfe4156039c41e178c541c799a0ac04e2aca48bc3bd6684291a19fd3cb13ed6ce6248212183877b6d36208d4a939377434be66a212272caf0923bc09f312105900832aade0f2c99b1bb24ac834f913a50387c62977271b0ecdb6a312211bd378ee2d2d87bb163b4661eb46309c3b7337309ab0f0e92d1969cadb01fb06b898104cef64feb5e652bc961e81350b1f095432bb5c29750af1261e762171e657f41e25680243ccde717c682d5cdb9368211137f223a452f1cfd8f3e956665375d64e9a7ffd4b04489d585fb822646dd10b34003a60c7d1a7da3d04f2918433ecc6103d27b917bb8c7faf5c84354aacaf689af611b036162794cdc65837791825203b3f1c7cee423569725ee91c99005f0087a07539be149497afa21235cc9f927d0b1b1b43668ae643a58817b0e352de82baebb1b9fc2e042e70d41621b8c09bf1d3dc13a0fbcf4e10a602b64c9bd70418ae2c8a266e2ed433e9962ecff0a6aaeae55500a15bd361e39648bf0d107d8b8ecd696d034c0f92ae555f56feb209dd2ac292e3d9a536b21e348ce1487f7156c0057408ddeb532d2aec4c101610bcb6c8e66859d6667e222e62672b77b1af089c2f8c2d12754762318cf8d6268b4e63e4690e6dd7acae88f027afc919982f4de33044bd30ee4d4efb9c1e0fd583fcfbe00e8c8d8746a6ea06ddaed6733bf37d1820f64bf360e2e9bed9879d9f57d7c305a1079d7a2be86d9cbd15b91f89e2411cd68bbe84d2212feab3a903f5aca6ef790f882917d22eddacdc8a3a4f8eda1014226d37a9ba2a68623623cc9e99a4c4968fb4ba1987f0c041e24b52839d0f8afd8f012af2b47aeb32da6efddb797cb7a4212e8b223f02865d3cdadeaf53c9255d71b6636e1c48a2be7a3c4be564b42e1df1cf7d948230000000000000000fabca20400000000ec723c66ecd1ef4e568bf5381e66e93bc1ac0cf89ae255ff224f2b8233ab8087f1b9bd5bdc7695aab16e231dea9b1e98fdace8de4ad8f7a4b1b3885f12f0e628b0e4c2305a92daaf14d6909d58022c5109e31b5d02b3ca0224dd333a85c20c3200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000faaec8d050db73fc542ec526afe41468834108107a53c6c7354a507dde4c5c91be08f401e81f7d2e6a008c02dbe07fb2a83007e5d6e4483398d1091f09fc6ea038c08eaabca7d7111ac61eca6ebd893e198dde313e0094f89069195a54caf8b7862a56b537d84b2c18e2d5dfeb265cf0abc3eaa0d1994c8e4435a03f97fde41a0206895781669efbd445df437b48f692a03bc2a15305d4a89e4ea9b47ba6c797f2021941408b1de75dece9f20d74fade70f5558f45e9b093b815c230a76b78e8d7870b0904a0f2da20fcc49591e4b9543f6d5bf36d3672a4dc96ce0265bd3bb6571df89528d77bfe7ea4b783f291a39f5d1549b9b1f1a5142ee0b691d93ad001efcf860211da405e2b895c3648c01941c897d99ffd642f0663ac3d6233eb1a715a33f094032238a5add35393004374d75846094f3c670edf443ef842462c2da0f5f768247f03297d5c9171244e489e0379dcafe3f8528d998b0bafaf4f801d1dc949f9dfae1e0324a5d2f18838af1b9bd59f49856b5aa807724618de429c4cb3843923b366355c032facf868eef7962c8b6c3cba9aadea1caba136a85468b86b5bc224c17cfaf676cf8f1aa8ff86c00efd5a162d412f78c4abf4dceac02d90eb7a825f5d84d1fb475a1d009118ec5d63a6e00711bb17a658228546a6b5647981ac73632b496007107828cb4afbd8407b3a23e7818ce21362a1eaefb5128256013f79fc2a672c3bcf00976762a753399eb3dbe1f26e88ba561cce7d1089bf5ee8881f3127d562abd9ef5cf419beccc819d711bdcce9c5c05b12ddaa409df70da9dde0cd125e75f5d8f1c1d5cf468dbf5653dc09c33de2776d131fe811d023e655fada85cac5c5bf914be401fc69cd2919ee4e21e7749edc23679ce6e562c8a4ce1de55a7cd6d84d4e899b2d723ed0cb824a840cf456c773c0b7f193450b011186adb0df015d59a3534e985aad7c884140fa1759b23aa8293bafefced774be5112589c1e195e6f4e4a08066ad1999ddde913518c133d1b065eff19a128cf6303e64536585ccf7807695efd724f98769ecd639e818f4695bead664353ed81fd44636fb9cb545024fd87f478aba6fd9ce886d02eb6647a5accca4e9b92ec7d8641361204aae533eaa2c80edcc44738e9e51336812424537f569698d1776850e522cbf25169d798fcbe92cf72d30d0bde6aed397e82f1f0df37fe9602fd05c38366403b195ef4c86162e782897e39f98f65896fd33427098d9e5859471e699f37c874b591b792e8bf3b876527e09120c4fdfb7f809eb22af11b709fe1378ec3e5c97422e57533ae4578c4922b4629dd020632f43475200a74c4ca4b39165c42fff7887dd4d424277fa2a3fe6376400d21a73a81a63d2c59a83bf73c98b53e9ee6aed18e812c499bc098d8549635729e8649285bee75c5d1677dc1f921711b679bbd5ace63c51ac6901b52e062a6f61271284446f4e25d1088a563f4a02770ca95bbf2d6704b6c2b46509c5236e2f78a056f6358a872ebd5a1401a05eb874c646fbad7b5d5db17488ab8386f93559476f607eb1839ebe47e5aa8fac860f7173b3ccbf200ad27289be03fe55d18361522bcb0f1ac608b7284fea07d9b47691266e7ca63e33b8a1b5f80a298e4569a435340f70cb673e783ea888ef98f54e6c032917417df337429d575895c8e72b5a5d04828c1d07ee478a9e4287d2255fa18d3c6a287c9e96f50eb31d930d52f667654fc848fcd234a183892be6c32de5b3aeaa486f423581198d968b3d4f436b8c47b1e8cd398ea41cd8c6eb2a98891b965f2ad7c1e65ec4a149aedda35eed9f4355f91298423083f05ec572f4de0a67233b8fddffdeb94f1c8f542485955c3bb847aa8dfc66f243088dcc77497f2ce6d90261a9836fa1e830ec806b1b2f262ce2905cbf113c0325854634287dff01664308f03fa76c329e01074a4a5b4d860092dfeb1f449216d1840cdbbe7a9d1cc149bac52890a9bb9495c773213535dfa15aeae75027476691a00f24f956440b7605446cbf7c38dc35d5f755a60579f6153ef775aa48db5551179d714b0120b871bc6d0a4edc61fa3e94e7b251e62868a35e74b71573b4a6612a8270a5624f37817885d89c6ddcb1161513138c629cd440ba8257b315fcc59f15075f705bc70e41059064292ac359becd396f75947475c743eb978c2c4859fdfdc1a347d07268b9c94f1ab96348d356c7e3e34aca0a5cb2ffa40502ba326d895addc1d5d54d3311eed09249d75f7cd8b7f8b4b6f672130de3da44286b9f563f0ae79d5de77ba2b617df903000000000000000000000000d4d017ce19487122a512afacd8dc54c74785f6cd155b4b6287615e6c4a6e7483bbe5292d371e984998b03d6b722b55f51a703b90a30a779c224fa1eb60026cf3c7fa383d989a2a3ba3ad071e3654742e8666201cf73d22e5f19dcd5c1cd02be70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042f95f9bfe768530bae6f546ec14bd44842eab71c3eff0ec907aad4b02cc786a4af02f6b90d5c45c89641cb32720b0019dd9616feda57b4f20173553819faddca2f6c8ae855fea78726e02c744746087e1ef3983fd33aa37f7bb4678f3bd95cff5248315e196bdc4c95540fa11bd98d5f024895f171cf27b8cc3d589b1c55ecc021e4e026b9ce35ffa523f72d652ba98365f4cd3362f381f24663a762d0b52cec5032d6462df4a104d4f827657cecd3012270690003503d938a43086b7426cbab19a0a0554437d98ae0bb14e445c9832873c5838e36257ed287801920a960c096bb11a3e113d4842cbee42db2d832db6c312689ad9735cd441e72f45331b5b9187b375030bd2fcb5f74066110e9e145b67e23787731495161082973bb11b56e050bdd570020e42576828852e386487fa99320af9868c0848e6f5f399b7837cb33161a5749f0318a12f363ea901009d5d64d1b7898bcc52c1e7dbb4335c38782367045114d594031c3ed875a7b73a3f5beb03ab2e9e5546f570c7ae05a7755708ca313cf13361b00313d22ac49551cdf81d0fa8339dc73c729404dd48131a9b9957cedd9aee1644780a010268688c7a31f17ffeaf6bfeac37fe76848ea0bc9e59e10e833c604bb44d407821e873d9cfbe9d5db4d1db9899e8940608d23666febf257bf30dd79881688a714d4b6dfdcf474cfcf8c2f328826791889d3dcf9877821cdc06b0b177bd79b9cf992396c2e1beb5cb133a2f239c5fe01179ba247b6a68b25731926dd72e2b9fdf86eec74cca9d535fc1be7db78aa6b4451fb94c0a02985cc38cbb30f4141a4723e5ffd6df41f5cb027eb09229fe924584e324b8fab6de938f1d9fec7f636046d2cea2ef56f81a88e84855f08ff11a0effe56aa9771bba721a803a458e0537f87a6266c937994fa56e9927b1a82b493cfce925d92c7797ed384f88532ee5dab18a194987be6610cc93f9e02bcbd70db14a5e7b38236e635ca10300752cbc24056542f183f50c5a632207526a7eaaaff13381df55a2c2ab7303f076277f67f6ccaef5476f609853c1731110f8ea334426c752f206283a6aa13c91db8d0a48a414c16fbf576e49f8816cd185e69910c5f8c8a5ddddee492017c4122539728dedb24258866faaa982a669e18b2c6553c42836c0f1ba684626b3d7e4f6cb6fc879eab0f61c1b400c0ba8c4db870e2b9a08cb9035ad3c4cd07da4288c8e7889f6a120bb2577158372eab86e536a42c24dc6a95e58baa5129c904e2741bd00b3d5ae82476673d3e0b45f6f42c94678aa1774ddd998b5f85375ba1447b3eafad40106650cfb170b975ab2941f48c46cffa3362914ef0198d757c5325b4af83e0ee1f5cefaf559fd21e6786f2eb952d77b4d0306d0d024a57b4d5f7555af651c4ac9ed481f6f50de07b6c73430d42ebeb1e8c64ba13092073b5c0bba48b6866fefddff5d83b2832678572297c6a371e0094ee4b0cf6896625a9e6389467e2cff3af1ea8479a41cf7c337a6a09c0600d638687c96ee718ffba8c6b1b834046b503c966872c278f10f35c5ae0f1e2cd52cd97bf3a0289858dbd6918b5afc9abc7656c86ee7849035d8f4dda6a0e57b1ed5e74cadff1be30fe108753dcf4bac4a4db80b079cf1b2165f6ca91ec18a753cc04c378f6dd816392cd3a74b34ed07b6009390879192ae697ddb33f1bfa24306bfa3a1aa22766db7473b6eccfd468a9573d8060b4f62e844949b94aab6da2902f3a1ba8e8b119015d2c3c9d005cf7c092c85039c16852cf9788abda5c9717b74cef2bf653fcebdb96d4c12529651e390cc978dc3009c8f93392806bc93bbbe387554532a9094c6138e487fee6d011f317f8d76a1f340cbe4b239fec45a71b0e85f3dcd530e9504a995bdff4938356c9c3da93d3788238489e432d05b8c1ee12a025757cfeda6d4428ad75469714f338453c29b56f6e45891d8518f51bc05a326c167fe17e2115097e72d49815bfd5144a7594461c2c1521ed2220c1d73a131f758d4c54a415f89c36bbddc089a1fa7dfad879d7f5f6d7e5ea9c8e1c18917771ba785be379b3b0f859c6dac1cbd2dac373667db75b18222f0c8b453b0629d93b5ca0276c5abfaaf59605a674090ad8cecb0c41ccce1204f437bb9725d53e9f3ad1959f86b884fbc2373009fceff0c75a788531201c48610b83f1379f5b1f62753e06d9ccd63657dadce1669844aab345f86ec098e60d056d3038fb9316bca9e0fa9d975b71fe144ad2514c4646ca4955960230d5c96171552a27b00733ff1bf46c15abbeee4f4cbc170eb6aeef7386341e5b726c640d996c76a46e0853727ef1bfa9e8059c9cbacbc1fbdd2bd63ff68573056083310187571b3f4a87efbd1acfc771eaf3acdd0cc27bf2499c667346af302a35693c2cbd05c1b7e523e6f40e9e70d6d5bec4308", "6352526a", 3, 633892843, 0, "954f0efe2ee1c5c3c888fd01713032632af04a9505489fba2c3be22461387a79"], - ["030000807082c4030450506aa2e963d642319fbd8884625dd60e6791d8686f23e265725b447d3e595e0000000000ffffffff79b143586334edb7146c7b83fe07fdacb77d96cdc282a82c7eafa632286879a0010000000653ac656551acffffffff9206b14e252ecaee856f91d04a87615ccff8f3deaa0d0bc583af6ac9ae51220b010000000100c7fc510571350e2ca08799eb09bbf7f71ae7f64a2100d4c45c55bf6070c2e18f1779fec10300000006636a65ac5265de07c772010132a002000000000765ac516a65656500000000000000000396a506010000000000000000000000006bf0e217eaeb157436a882967d203e4e081632caefb8f3c03da55244152ad52c127869d0a3168f76c007b219c21003dcb7b3fbfcb47a392d44583ed1d6dfaae95a0e08d052ecfbae65c312fcc88ff8f333f922ff0d8d5e17027e73fe510f001500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b16471115ddfac1f19a2f443e6e9bc946d0a053ddb80d9305c73e8e66a731d7d83dbc1256c29de35375e1e23a0c2bb3fa4798167c86e58dca18e1ee2f62c3afde29d18cc86e52482c77d2f650e8beab8fb6fbe1cdf88495b7ff7195e6be4255d18361a71e5e80b79a7cd7cc7323a12156756cba6c1e9d7013a7d759a98f14e990324bf992075a54ce97b1bd310dd57abdce28bff498f982ed3c5ad9a2014edafc20206a5edc34a8675358159691e3e3bc487853674a550467b7be0bcefc0be8edbbf0a05630a11d5545038c76c0ad5ce8b8744f4efaf8d48ac6b328fc6347f337ae6ad8f9225003349fa5111e5fbee77a6f92eded24f9656d3e3b4bb8eee31dcf0b7150209436b6577e41b20323bf21a496d76f180943813dd5cd256410f768cfcad97ac020d5ec9cde5263bd9bd99e6dfce23c530cb9f29b283d2da51b76c2e7165e7ced3021848224470e216ecbbd390b5b036967c0171154f642aabd284648ceb63d4fd5e0219a61c80caed0ab8a7ff74318dec58b1cc9630a73f3e95f6e49be0ab3b1c4e84031c119fb0a2537c6ed570aa152d83c3c3e56c4c839062fccd23b958fd1a848d8c828241632231aabab257964852d854465cb8b5ad4e794744d95ae2ef433bfb840978cde9901f406d541a3987358d67f5b051de144906572940fdedc923b7b2ba6d3fbe26185c7cee6348406d4d3ca18fa42a21f8b91b34c549d1c8aaa8155360da5cd805fb28b52389865731e0aa9e8467118baefb52db0ef827917e2722a473729cacf08a11cd46b368ba6cc884735fb40cbe1a4afe59eae05a8d4378f392c52f45ededaa8b11905be0cdf37fa8e0f117e3068229d392c0afa6737eaca972957a87c450d2bfcfba571e05fee60f12b3ddfa6ce987f62d93cd1ca22dd620435672483440e7ec7df4840e819f8bafb90db90fd9e67154b9a84e63b798dfc2477c7d636956fa752df71f48f392b760dd6cd25063f722cb0ad3d58992e3069c617e7ef4025bcfb10a2751051a3c2eb0dfe6d4ae19f19ba2acbae3309c03c421793c4d42e8be4f89186a8ae58b022559c4a4c8587e203f72249ab5b7533fdd516f586c8398fcc7d1dead18bdb924bbb97bfa1573ef251b5ee4f4ab87710d1bbab90a85ce02904ad37768179c39aec83d4e8d21a1daf18282a5adcf20393e4f0ef0b60372bdb1b4b6183e6b133542cfad826ba5dd8d009af36bd6aa4d0e9f1a9335cdb8e0e4317a1838f4e28f8f21cc7b1b2f1ec0a45ca86327b1a84cb1512f3d0b59cb0ff810c6481662fad3b04a734e842834d8ebd1833af04c4e8e4baf66e791c7bb6c91fc6927faf3dd3002716b153eb2868f8e232d7cf7be62b7ab09dbe8f1760a0819b1e21e4706825b38e92f911821e0278d803dfbae630c4782de9c7d79e8660b840481feed93ce883cfaf9e5978230cdc25dca23d53f0d3410fc226bbfbf9e67f1dbd92379307e2ec79e14858f1b7367e885ef6da8fdf332ac6556847daccc406ca2f88b83d725d2fac46ca132d2081fa233528bc8150aa8e725288825d4a5349efa5cf5531c1603426ba9649de2b481544aea17a662000e54a31d055854479499419c1fb032103fa27ab35ce15434e504581a3e9de0c9c3b1777ba303ee29b5e4a14dea1c7c6fd663c317eceb959099631f66b6c093c0bb4209c9fce52c4c31fa8f6f955eb90a22e502a30caff859e6f463dbee3960dfad7a604cee90206ee340a0833a35c745c9c0e507c3bd76cd49500d3957f4aad5ec60e33e551ad13e40d24d75babe04d6debef38955a5da9c819c1d87db4d967249fa66d1cac8f49248ac3072c245a569850bfa6ba23ec5890f06e1701af589f8fde85b4357c19acb75b2bfce3c97df6cfd4d70079401ebe5664d63efa63a6a56660386c180812178d8dd7031ecbd6bca8d78e5e8b5ca3285fa1840b109c1d82c6aa82c7e7f7bf013e5c05107169e4d6af39e61135ceb808bb56fc0d98b9e3a72ae2cc1ff1758dc39de56e878bf87802bf4dcd211f1316060d9be4f2db646c02af3d17e763ef0645fbb9ebfe81d37a96daae0cde1575b5d190f3502690e672ca084c1e9e5ca98cebb9120a017d344c1e83278284cc53f03b52392603059046bcb2f97b8a0d6b4be90bddaab1108d2fc8e07e7c4a1f54c87a6e0a0c17c501967b2095c18e7eaf8bdb352983fed5e0ade85be160071964800c6a97efcb3b622c1024c858dfa8bb1fa13670098168e6046e5b37dba8d83a4f563eb17ed3de3d7c15bcd2bce13e9e969d43b1e48fa1f91a3712a336f16bf5898299eaefafe020000000000000000000000009c245c2209257a94981c3ec9dc13eb9f9a154434f501d48bbf9e25f1c895e133128b1383e104642a0ec2afb1abd6d2f782a317fd0cfd7091dd1e80191c485aa6c3267af5e6417d1842a23280111ea9d7ceb24d418da38c1a61cb900d022d5b0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a3ac1db941489cb0c3ef8b4ad978e2586c02b20bb3569fd97555673f9251cb330bfcb727d0c64db8e1bb35aa22e65fa965b9285bed3a6f406c84c9da347feb1bc31a25895c23b95a8a0731be7367edc891b3d0008e295bc07e4c20d2e29911c484b043a36456e72b9e0ee76691cab0958b7e57a084e189b6c7ce0e77436318a70310354cafd8c29caa3d313aa37b716dd59143d91f1898de049584847a3daea42302184f070b2cc151b63b3e18fca9a784b3288cd648fdf1cf72391160d868be677f0a07c28520e61e9fa0d987bcefd42a3d7addb0957f5bf55a4925d3aaf2d929ab97736f7777eaa9b4ef1abc1f0b342bc7a4c971da23e184729ff800fe370065bd3403096cb5f78883692eb09b7baf0b3fa5b9e743013b0ef43975dddea09cffcff6cf03054dceeb11e7bbb97d96b1b41dcf50b87dfa5d31c572af747915cbbd986ecdd002124d6bab4319ea30dc7ba4a26c708e643a372fe128df66337ff84d0473429ab40208720f769bfac54078b1f0b9f7f9de6aa943c1cf5738ef13baf5f0cbabb6b989032dd0f6ba6d0fa5082001b21973438f3348c752441b808664cc1b4d053b3b376a3f5ad69ed73a3cd606a1dac406b179847852e2eb3e0052f90af98cbcf4502f2cc53c6106690b975a067cfd7bfd4b6e00744481ea8fdf82f56098a4564d1a1b0899fd903c725276521dcea8d9c44a119579d1d98652f67e91d96d563555b7310a5c37e2611bd4856dc8c3d6291b6aa80848d9b57db5304bbd74a387e1d351e81b0c0a03cc2ddc55b2f563d04db6219d36c587f2bf9b1a47c7a5ab288e7b2c842b4f6b3eb7778918f5985a912c20e74c60f9f39ba07972689baf60a8a26f8d15f38af99e99ed5cdabb061e6911278e62aa101778b308806bf2a8b1f8eb1caaf68e05839a607859a16b3a6d459723e1d374b12a3f60d2c6ec5f67f164ce2ec0d45aa2265b33d01a21813ee464ce3e01785609a22e9cd7f2e79c4ddcb795a31a1defbe20a91b3b75cace322721e22f7b1a7c1f1093280421ea8eb847e462c6495cf823e319c1d82719d821aa653c87f6ab7aa97140b389a6f57ef95e4af3a030a7b42a26b9557faf6ca737e50f1929fda106bc319680182b2dd0b553c230f3eb9cd5a9013de74ba455ef53453dd65232dee9466bfa763cd4834a962249306a463e5af92aa2c393a2017b608fbdfa569fa5a829fcc66b83b7c12ebe5faa7e28deadff2c4b038698b3ccaf89fd9ba6cf0b136e849d744ff7816869a91ead7cbd8d61743919056cd5c44e397562c4cb3787812dcec349ea2e74c051ae52fb9817bb05c8492f70a1a26cc9aea2519872e4d05f559676a0ba11431c25534c2c98e7456406b2183b2fef7f4435440b4edee01c9b5b75d618851fb294dc12ad272cd472bce703542742f780515a157b6bb4cbdbf900cf82968b554c1d35aa39fbc7b6549dd6b47083996b2f0959a228da9c6019d24b0c89d5bee7ec808383e83f931046b625013d3b6eb488f0ca13cbcced1b3fc50d40d611dbc962caa548a11e7a3ab824de2201e9012f8c5caa58fa56887ec0a8dbbf77cee7de24541b7900c4b5bc824d3a7724b5794a9cfa48578357911d8e0fd2ac2354d4db7ca0450792bdb7ed590823156b198683c93ff13ff2aa3f20993198b3e41cfd86c1b1aaea9b36dd22d9c950d14671fdbe31708907a453969d44686f61558f5e28078c3cdef71d25165f7baa473d11c77033365095b3df0ef2cceb1332c98b7a559bee435994d75928fc4118b61441cc388331fb0882b18ea1bdb38e19b5af19a01f5e30e34c40ce238b2ca511d750a76262c78eec29b590e495689e16be721b2e1c48169233ae2eac3ba7aadf224539843b8e773fd0f1b5c479e351d4f38a9b7e1584859ef9a7fc41e596cfbe113a883d8bee1d0a713889518efdc27a60482be9a3b1a05396a80056ea79e0ce44d94064436e2d63428b91da5e43a92a2975c0604e7f86c8ca7d5bb8258528f251a73cf7ecdce53a90be9370b6ce14a7843804e386beff35976c0e98ff211a43b9f41419fff8785452e72c36de7a7c852e311504a4b532bb67964f704b9c5b9cec3bedb86a4d189f31f1faa0e113ad0f8a4168f757a7d5f9f812ff0533a083a44cbe20fc57793955a4761261dbefe5cf2fe40c0e9b02484f1057e6c1f029a0ce5ae521d1b42e6ef4a2834d39dc2e63a70d46b8c77f6e67a9d0054b64197c8a5f51e51e062e5e150573b7bd2437f7894d4e0bebc6563f0223ba219ba25be0156e9d6531aead8229f8cd8da1573f2472d8112234ff04000000000000000000000000edca4c6b5e5c11f5ab83279a96a58eda3a79cc396e216a2a848a94c9d5d8be34d9cc1c3b08bd6a9db7b5208a556eb464f98f4bdfc0690ecc8d24a3efbef417c12ecd3fbc2fc16f562625941a56785d08b5077d1e576e74c4e368fdea2230645c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f3a51e2c11f9e269a82accfede7387bafdb03c3b5f173f41ba81cb3dda4b8b2d4011d36d7905a098d06d7feb1b2b652931aef7b1e6bd4c1fb075cc4d4cc857f3a0737d29dc3f1632e9449bf1ed6f02bb4108ebdd41d32ba09c49b57f6c1ee124a46c746e42cb870e7d09dc87513883cf21caab47db621dba86b190756f3f19d020216e8d6695e8d689dcad69fa436896da0db891434717a3c03da4a65a43ea5c902303533a4694525ef470ad2d2bfcfba1d33f672b39cbb9d8137decb2febd042400b04bf42b0a15292caeb71dc7e709d39da838df7fd695e5f62b65230108aaebbd56b90b1a483e2613d040cd15afe598e888d8fcfeeef257879bc8b87be7434d7ae0328ec5b195f628270839134bc5f8af933faf11119001aa6ee4e8849439a197b650200ed00b46d49973a574b3652271935b1da2da8cf5855d61b3f4b7cd3664bcc410220ec531e70027d50fb764026007a1fea28d73fa660449e2585ea323920cf37d2030b4307e70b9389aa948d82767318f05d416cbf0741e59edeb2358bfebd9c3858032995d83c89fa7ee0ea1affb8d1909782a9b032e57f83551c20d80f390d98989c464e1cac97ffdded19fec37bb0486303739615eb5d20f55312ab2401c692d88a34af2436183cd4a919a7af311f81d88ea1b6cda99efb1a3727554f456cbcfecbec13b2271679fc0620c656eb04f6b170fa450baaee2799d020c9665afb6241e270621c141046874c41197ab847603f29cc86d418efd516ea257b924b3001ec3e23f10107b2c73a04669f7793cc54381cad4d0a6bae889057c7b4995aa78ced635ab6613b166a360adff94091fabf65236a4605d5fca14d49b964b08a7ce19c7b4a999a49a8ddd96d56720f01976947ec12b5f916f7b3fad5afcd0c26806c84f7721f8d07e219ddb7d9c12dc8701779cf88fddcbcb3be437813958cf27ad0ab4191d7ca95972bdc00f711819916b47e9fa2098aa5721261c44af6c0a4896312be93ddf159c3ef2b57fa3bc374df73710d9d5ef67fb1351ec456648d909ce81031e3728c0e4635bdcb425500962d43c7b01328c16d719973fee42fb3a7186b76cc088c11620407c3e1580f8711359ed6b7ac462a31121c64ce277239c117c0dc074cdb2f106decc23f543159da066b06cfc2230edc130ef7e73dd6720c6357c3ae59bd6ebd36da188e0addd18398029e5a5e748c7e0a861c19a1074c40862ad724a1da16e57381a45fa70a951b7def95e7983d9c52251f92bbc3ff60885d2fad4ba3662ab51118f28ccf6a30607d613a3027ba63b7fc8ee51c482f0a4a44f88cfb71c52dec1dd2ffbf4dd2422afa12a7c7a0f4a23dfc3e6cd48df08de25eed5746f18e350e55e0462f6e3125d755961af2722aefc353befcc88aaefc1410c84402e2495f91bc565af2737e405665b5be96d43813c62392b0f8ee48a5c7d781e02ee31252d462164eafe6ae1cc72cf1a479087afec084cea1d33692670815cce814a3fe64ee0905eb33b7ef922721cf3e5d4455c21e0db9e243197daa20ec93115ca97d06b43b8eca4d2d1d0c30dc39bf530a8d500157ee0aa3e54d0894a2b2dcd4f1350f26893aac58af5bb61af6fa777eb36c8c353d58ff55406b48c83961ad261fbb96c8d3aeea9d455768927a66cf00a7b6e14c368570edaca95e7d1e2ba46f697284009d077fcb53b5a34637aadf7b07428476e2f7b1fd1e475bcae1411d1c93129717e4fff66ca18d1c588ad1d7404241e963528b06adda5fb02a64ba22c977d7d92843f149d883bc9ae2a3c8c10103cbd8702c4af80d1c66c880789ed1d978d8ffffd2196ab3545ad78cfe4f04835ff9a8477de2388e3398d4549e15df3d20f6a0524b90360cc99e5ed38ff4ac830efb796e070a0d217b89d43f11876521b42f5aa3c8e21b833eeb0e021f9b4f0442a866c393ed2223e22578b6663bea0ccc9adea8ab0c68e6a9a2216de161380d7368286af44a6521a79e4a8ce94d7bdfb70d87c5d3535ce82170271939c077d7ffe5a86bd2f6754946b6e2089d54698dfefd6f8023426a69665f03151712b6c5e67b07446b26b90cd2f6480aefdb464d5eaa3349359a92a7c5aa63a4d2f1565ea3c8f1493d2e3bb50a3b91d023a2b675a6f7c7d12c44cbe05b047839004201c356e06ae43a7053b7c85cdf9e623b4f0671fad15c9cdc45a6403955935547d46d1b1ad1f36d9e0ba4e8010de4e3d4ecbe820d9fd27b8f36d51d052612eb20c136c95631d44ebaed3416f4de8bf9f6ce3f81ac0ea4ab16a724fb8941d92b2fd57b27fbcb50a53d56ffb172b2aef35da264c11d129c5f94a51580e2c7eed52b70b234d40ba37e10c419d02fb87e0105a3533d2391d150c20eed778af3cabdc8f9ed053bf6c31ee364046da0b352fc940ccff6f8779ab8569370b942e5d3cbd3251a5b08", "5163656aac6a53", 0, 1043270996, 1537743641, "dd1ef517cbd81cbc1a7ca17b46cdc3162a07b3ed03bbe1494f14a749b6031dd2"], - ["4075703d01febb934d9ccf4440451aee840bea194468dc8329aa3553108e5f265058eb7bf40100000000ffffffff047f110a010000000007526a53516a005261fbec040000000005530000636536611d000000000007635100ac526aac48419002000000000163d5ebcc3703ebdb5e04000000000000000000000000e26d326e9208badb0b8837d7777d1cb151c985c6a054b09baecfc51e27dc7fa8dcd4664676c54069c1147cc19be0caba30c25dde3f9c48ce3eb3d77034de57f2d47fdd3b73c8fe944de20e50429a183215369df87e6491fa453f010cee896ef7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d8a1477f26cf77284c7d5a14b0c1c17aa221c0efd7cbc922a49c0e030eaee202b0ccde1d5fe8169a79b9ebaea0d312a0e0625e9da32d087fdb4959a95f5eee81c0ba039abbbec6ed04d33e28935caff7e88b3de631a5cae7309d73f4f1dcf54c993bc57fd60da6242b11f57ebb33c86e6b7162caa7f0f839f4210aa83b24c1e030a1431be69d7182e88d6b4eda72dddf3ded4f8d4c44ba303232faaf503c871ac0207b321b9842537818888980d6c697c336285aac3daa6023901bc268d9f0f0b5c0b01fdd9650a191acb19a57a712066d4db9f59d1c7e30b9874bc536b44d66d19847e3eac6ef96e907024aea332992d26e0ad4a492581e9056d92c227cf0774509a03087c4d49b25b3564398fb9a5c93ea229c69d26c6a5e81334b62b576a4b5e96950206212f6e3ee82b62bcf83c22de6d1349f985f23d8722c7c8cbf26374186985d0031758f4963c658ad84e547faaeb4cca86c4acb02e65f4ba55caced7c6d74438ec031ef694de68a915526b1191d4e26d3bd5f4e2364c52f23e7faccbf46bda7e5c82031e5f0b8be057b6ee2a3145c7bd9caa06f66c83ed133f2bde4013b1a8c29ccafe08edae0cab2943bc773a1ea372b405562e1715cc678e6eececdad9bf4192b14443a6cacdb198171ab80e2fe05c21764e14be1284d40614e1bb266278ce66bd06a23643451301a6bc28ee6d0709ea8791239cde3f4a5ec36aa87ee55d2838144165f250b87d61dd379d61c81d33eebefa9b2c5ba619440c7dcc22f3282d8e3a00a425444499169e23d5c6165bf3233d81ad04ec7cee7eb0e3c0049865545ce0d4d5479d2e4e5fcb7dd3a020dc6ad517ab32a37a2216067e138adf11f129bf2101d0a835bc89cd084dcf9cbfd027ccd6d0f725ed503e50679c8f1003da4ffe8c07f78d7ed3ae6e882a343a1a068d2cd56ac64a93bb26b512d9ab0ce948dcf207368c44d9a90411b28343081ef94026b9c866fd1c96e77069d3fb30bcf15b20cc26ae449d1f630441f20ee80bb958491cf49ce9ec0ce3e1f7a9c2bc762bcfb0261dabda3144653d3981e7f379032d9f1f899faa7e4fd30a7d76e677c4591eda2d4f3fa47214d53ad45a738e941d813fa808932337f59af6a692401e54132297eb2dc61a7a3cdd93c1f4bee8ce95debcbff9d3c05c6bac6e8ead857c031dd17848a5bbfcf947deb10fb2eef27be20b80549a0407b033dc99cee3e59df24aabef75281fd396e8958f30f9eff1333eafaf5a9eec9fa7ee397b2d0d03231b9d312555dbe83090729b6e1fd7025842491c9a6de422b7912d10afcf971079880a08df6fa6da028952d214cd87d207ffd740d5ad6bff4de269d7bec94a30cdce04756a693ca1539c257f5fb9461976122af2cea7568f0c71911779449e5e760c783ddfbe1154771734fc6339528b964838cad65edf3e1935174badf3e16f9d3f78185a55441479aa67c8d4edb22885860d402f5cd21dbad8ea4f459589a150bfa08b25e13274f482469f367d26163c80fb15bd9a5b9b1cabc800c9e6206134f2dc87a81c83fc50cedeeb63a3e516b38a5cbea4362f10212d747808a31628d456a3801088ee0e2ee3691371432514a6a9ffc10c72ff03553bc3b799d971d1ff28af2652de4f1f7e5f7af0f9eb61e6dcca646b93dffa5436e040eafcd48885d036af44723fb7f0611cdd4902c737a3b88a3f09b4969e77582980361c87ea0fb3d83ac138129655f6e3b17cc56fe83582fa2fb616db52c0a97ff7e2313cb2e742160af1b8429aa3b2b69235f15860912c5525e10864ea0810b98905cd4af1691877e0d1ee8f926ccd486ae0f4a17988a6e8cd2409bbbc794aae0a988185d3d5327f89425e98b1719bbd67f5aab5de2e052f9e93486a8251d723c7662f2c092a289c2d6040e72f4c1c0669e4507d8205c210001859ef2b5d3eb919156135cd7d064863be301d6b67f96ecb4fe3b2cc30a1445c746476ca2d23b0c49d9fda027b0ceec8e01f190c1140089a863493cd2ea590ce1ef813611f96ae63a67ac1fd6186ff9cdca1ceb654321f3367cdcb477d1fe1b8e63e0f8c7ba8b2c117286c6f6298e43e6033485ea8e75f66065f5b55adb483bc66a01875f295a452d09bdc2d95e1cad40e2288833bdea2d9ad80f828c8cef14ef7b71d51295cead64da062a4aa6b61009143e3e1309a8a0319f15ea706d131681d3ddcd747cd73dac9f701765e473afb46163aa28f09111e654a2546e56d96a1246ac3ea41eea877d7b8344f8a630a2e501eb1dbc2f9bfb357202bfe0946aca6b1870e3820166045c500000000000000000000000000a9f6a2564f9b7a60987957da72c7dd3b02123afa75635c77172d9efd4b4d38d98841590dcbf85db67296002277e7f49e5cf01ad2b8e02bf66b5f8267c89b9aa7d69b7281272d4f5dcb450f2976763bd1e299db999c3d02246b2c0f55ac161e3500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c68035020ce99d11094bc3d17c4a2b00dba6e50524f186f9014b66851e33d31583d87b3d1a526f41a28457785616a2fe4844765b41610799ae926d4506519820258d9c209f4eb122d67c6c089a0cf6a84c42dbefd7c2f9d482b03cfda3f80279e4eefdb4f1f00f25f5ab5d28fe10b34569b20fbdf59b5b675e1d36d20ffafdfe0216aab52c38cdebac365816db6c5f376664dab58284208dd9c76c257b00c0a87d020f23e7fc23c57c17bf74f175039ea910b04457c50128d425b6b36ba4582b074d0a0770156a7e1bc9dc1bc7b58585053e3262c2263fd7e3709dee3fe3dca95a5545e2f7d1285b3440a66d582d3db749e9643ded8072897afbface392a1e009c12bd022881ea1dbd285927c92863f1dc9dcc19e25b6d6803ac51aad91864b935913353022177f0971195997b1b186eb1d193e2a3775c5df5f5df4c426a983034e87e3669020e3eb474fa7a91e3128b36544029976f4940e3a601dbc45c96a031b102ff1745032c3f31d12c00812365c8f75507903f245ad97685b26ec58c42068260e30343a003003f111956c3201b312023f07f19be57d10871327cd898515834083084e3548555afc0b0eaf243066c0c8eff821057e5d21a7f4f60d064dbbd71c450d8e11e9121de317f6141c1838fb812b4154dc7a7249b026cdb18d1090d015d7d7a0453f66d3cd353d8961eb28ec0c722259c9ab89fe28d17c4398a10e5b17b359989438348862c503578e282e62be1a77ff2d0e9dbc02053d0c958a6b6d2d9c3c1187ea3ec9f5ae500be15e63849d8f1f1e98ffedf550e5efc63b810860ace49b4cb25f1d5673612468de46891219cb88a91c3ffe495ef6b0f57edd72d4a262768ab6b28f4064a4cd1f679334e25dc5832a313973e7399212b9792a43316d80659cfdb8e57e7b449e6c7c5eb46df6a084470f1c13a1f93be968fa98e19e0ae371c4d98e10151e10190d63e494f56b99e3ca41d307baad947faa133ea310bce8c180079926377916a376cb46ccd412022901ac9f4f44cab74a4be33e4c07faa073fd2ae69fe3e7964574adf56973555d7ed3f770fb0d66ba1082a7bd720f9250bb064a7c39586c0e7d595b1d961aaadbbe8c346791fc695f6dae6358e340a6f18dd777fee7e50d3403a35fe0ab712e28205536100f6dbd2db846489d208cba30854792ea4ec48406ddbe07d83fd5bbe051e267ea27b1049468fa473ae1211f136242e2558c6bc707685fcb61a45e8b4abc62c05fb5fc5c740272ebe0fd4de4aa43a523dfa92376fc22b2091f137a4666b59b32122374b8e032bad008097755d837a60e61adaa95c7dbfda57648de07914dbcda12a0666c80756eee9c61512e2d4fd3e5b14da710569b72b136c49e34803726b988caa84ba631ae4b6979be91bcffc782d427dbf9e1f745a0fbfc4a26d2bc4c31944889aac2a6f80a12335180bf6bb64bc605ecd9253f0795e38ed8d548c8469faeebdf103bff186d9e3610bb535236068c8e24374a9e7f5a978340364793991eca1756d331fe2badfbca7f04558e0adfd4b4031b2060323389e457b082cd9d0177d6570935a5ff4d75aefe4fb3f10a7ee053b221f42bed1eda188d1dc0e86724751635a88f36dde4226a8c36118f03fbd0f8e1d6410a4a661a27dcdaff9f684c85e1e79da4f54b4dc46b100ddf987ba5dbb8c299f29fae39d4a717b6bad89f590ef56c5d6674dc5a63491750fff1436e11ec0cfdb9425b18e715d4b839998b3ec9be4dcab4737962e1c77f403132f6b139d4007ac6c1c94a41489f70ea71bfeb8efe5553398b92a734b2b75cc23aa3bb4a7eaea32d2c257f5f1f3fa38c924d5432b9df9ff2a1d1222ba03aaa8b12e742d4323cd9c9a3261511b176752a6eb546eb3f467084a2bb4a68576ffb0153e88bfecb9582cc49b176adde0c11b1c24d9c6d57585c7f66b3323f8ec04ea1f0d1868e2b550947cb8cf390fe4a06ec3ff95838cc52bfc8ea6a5ad2f437525b71a9804ab31c296f70dd14fcb3347062147f2dcbb178af87d9316a6b70b6c5e66b43f96b4b9632524930e4541f592d789014e9327aedf0fc031e44a3a3b7e97134a53daa3d81ff8100015ef0ff83656c982578fcd4e78f39f946697a793b0f66755b0098444f51f25663fe9e4384c761a532b87c249a16539647ff290528b008d3f8216040b61f5f4773f10d014c50fd24fdb8b20ec739e2b4ae97b19b0b5cac620688c926d4e248f9af8fdca0643f747e3f25717c934fa4c248baeedab88ab9527b5be1b85f9a6b77348fab1ea885551ea9e4bc0eff40000000000000000c25c4305000000009d97d7ed4b6dd327906139131b7ecd3e20722bf66712820da8275361aa653542766807023cfcacf572c261b426604e2e50e68f7220c931132f924d63fddc4a81ac6e7dec538ea78cdd758f303044a46423326c8f7041bc86323c25850b9fee9d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076d96fff5c5ae10996d286e6f63fbae61492329e3dabe22427a53b17b1e0f1a7851185c5209b3036b3523b711859722eab67e82c31ffe9dac09e0a73c3be05e534ab1328b3a762db82351b06ae4f0aa5fa6443986d83b7cad3fed69a074ed4abae9bc80b127fae732612c4ef6cc10e3bfb781e9ed034731a8a7316c058c426ba0319ef9bd215d61b556e63f2e662eb2e8579853e110dc13ddbc694f85503f0e8d10228449bbb51a01d78e06a4d1861f5404896ceccad8ce24c9eed18707d664f93880b00221ee39a500c7f65ba57032e4726118adf718f54c434f68339a3f7984e061e1b6d07769a8f4357b3685ff723e4ea8a0a3ef1389ae8d70441b1c9b9ed3d930d020e7a5ccafab2d816cafeef62c6841a1d29b7306ea88b7ff3bdd9fb4d0aff87a30217eaf93a8ab821d3a5cf73f11d8d3eb4599ad4721ad92dc83dce3ceecf9e3efc021e9507b4090bf99d79ea84573807cf70908c8dd26041a2829d6e2e7e118997eb030860348e882241a27078bf72e687a08a8c92cc8845aafdb8499ef947c514e2d103270a480a675cd13ce8ff12526159f1f4cb4e68365b950731cb158c519b5af23ac0e0558057c4ab3329bca96c12e4db74ce44ebf0b42350afa63f798569ce223d6fec31e7b6e01cfcecd5a8dc26f90ee9b1d9a2c16d899240b95947e881f2b5590dbd41c3ed5f2e3107f9b6ad0a39ac754b0ea50572f77ae2457634a541679c3c6dd3c1724e420aeacf806802b2df8b9006fb7fbf980fdbce5cca6dd8cace3bc8358a7caa7cc675e8155a9bf24d695565783ed2eff3b13075c256bf131708d59ab1fbab9925229b1749f502698d9ae02f1c80c13a1741a29bc35692cf194136d00b8083554d2c22844ca0916a824cdf23e5b71558a1faa53e6845bd3a2249b15e9bf46801efe689f84bdfd6784de09df61d5a09ff94e6b3d160badd5c68265bf9cefc333d73b293444f75959565de22ea9de2fe0d7dc0b39d038ec9da907be99fc62d8303a20a6134cf788d0622af5022ecb393f188f809814508881c7919688ff7bc10145f5c9ace1246380d6e5e0f0a43353af7cd855bc7591b33b0f9d94bc50ede27de259dd0a928da6c7ebd694c82d39252b30d49db101b0c5ec8e37505ea5dad090fbe5b5cec66a8b5cfd67af500c3ebfab19203a43a8ca7edc251809312a91e17fcefc4c278d1df282a3cffd1927faadbb79d122102e2e4f955baee6f31e2f533a1c61dff9ffcc33cb8076fba7703d6c62ba04c20242401fbcc56d3549476f111c9e228e4dc7cf9d025b6428746ccea9839e748ed206f86f71f11d1c99d864e1e06fceebfdbee490c07230ee3e743dae731175c89dc6b962f0f63e0b9155bb8851fdd96cd72797e352c151a7953bca1f1e32d07b1dd9ac61afdfecaa626d0fe89b22916baaa67c59dbda124234f8d6f2a7a44a08841da9aab574d473ec34524cd3cdb3fe61154681b072a798caf4dc57ab3d486e8b90a821117e8c5c7ca3300ba00935e617b6473f38987f0ccf689e81726f1fd4cc7ba3bb3b5d3468f4c398476e2843324876be83bdb548e2eda32f4cb0d955c6696dba2210e201c73a988e09da5cf05af5196414d67c113a7309d9805864724ded893d69d494764e0f2e5a7833dbe4da5495913d4ea052f737b6d826508ba5997ba3e877517e053141c6c4314505a8725f1004b9076061e6b29ce30aa2386d9c6c525501ea9b8107cf0f78389878ec3d340a7765037bfdc5906eb5be1eab2ca5cd03ab6c011c9f7fb009b959bf01a5183697bd547083abf6bdbd9d2060137b707ff9658e2dd75e103c167c34f9442ddafe4b7898b9b7132b865092a2fd42a9d8251ca99473f10b0dfd49a844b793c0715329baf87d80b0f1ea922567b619f19e512e2ce29d680593a1f3a17eaf7aeefa9a500c9a377ee9fba6004fefd632421d755cdba7befcf9b71ad4b89309efc92ac66d190cd50a5b1befe4a3d1bc1f6939b9fbae03265bf66e3da2de0d9c361e8c24d94b0ee24fd4fd69a385d2f040e784adecbcd6d66a03f41747473154b905efa4df8d0d33eb78babc1d43f8eca263fb8f3a7b61cf57e79c92ae3fa764a01fd598d53bfb354500e8e0b463430910560a9641c5d093badb4dd19b1e14fdda4dc5d5de7592257bef70a2cad58efcc55728ff318f7d6f92210c21615fb7c7b90ff5b0979b7e3ae1da1f8f8f2076d999c0882700cc23e7ec4a1aa0dea47e1e01372e9eb8e088ff505fa95913e2c2a9835897a092cc55c746dc23aa9b693236dc1f78a460b5b09396b15dec4903759d663b03bffa6e7c1d5420be2e59ac1de3c8fe9756e2362fddb6e78e4e9fa9e985566c591c465be2e353ed6cd9d0fe930c788205fff134ce0169d755d2d9b459cb33a68d644edcd5e8e322f929e4524869793ecaeb5dee4c2e1455245662b0a", "526551526a", 0, 1823463484, 1537743641, "a5e48034d08676c7e3056000426581fcd5529f00c98bd8120cfc51d0bec647e6"], - ["f4d3f46a01eef3b3549cd1fe7ce7497062b4dc5e9e33997e575d807bf40b0d6dd8e50f6b7303000000046353ac007bbd2215011ae2730400000000026551e56e367c03eeafc00100000000000000000000000048ac8fbc6d2bfdc2ad8e243aab289ef4f342bb69e8b449a966d62970e052a22020e05ae1f1c148a5742f838abb677e3fbc35fa25fe48fc46074fa0440e9db2495cb826658299d609388dd1d4cd6e64cf1ac3cf9d5945b278e2b2f94ccf1074b200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000973bb49cb557422cdbe281b07320d753a3dc1d6ca0968a0b9e09f77979a0fbdc8a5ac8ac906f374b707382577777c0a16e0fdb8b7c3fa9d38597fbd0441b76b657367acf544ca0096db9e72b6fc29a693ff073ecc6d3302c5e6373d2b7d22c7ebf60fa8a54640a019d4740cf617ff01c78f40e9d918f2e2a07821756e1fc5c7f02075d5c82abc219aa200d7fdf61bbf88bc4c258dab5ff610d3637a67eed22c6270228253813d42d743bb6374240592bb5e6f3d9af310b262cd31f86e5cc92c4d89b0b04f5bd3e54d2498bdabd3a0a9a23e529dec67b65e4bf7e237e9ebd3a463e547276f77192d5b234e62eb004c97604844b6296f38225c703a2c446859f318252a903080713ee2a8df320fbf26d42667081785d82f9c1cc7ed3b2681bbe880d45783e031ba44e0e75266a5ccb17c4cf298a2cce2d34be83fee66c72ddced96b1b10a0cf030c76d6551f2d75e334eb1295468323a0cddcb79f1d6f5298951c2a86aea08ea8031e33913d9e122e8eb5856fc9845a15bbfc1d81979ba37f394f5471f8b69eae8b030328f743931cb6e0f94f830910fdd598c6a279044171592fec6a38e20d8d7ec41ab03506116fdd5fcecebe6f1b4e1d4808046f44f2dcfe099f8aa5bcec292ed85be53d2e5e9747e0871b3a5c526e82d470d4e026198b4fa4b30773ee44bf834a664efba5fb241f4358c8a78903b1cb7f43e30d38dab47b146448151111b495db32befb9d708b08123bed1857619606e133a633370c39239a63530dfe2e47a74710869e28721efc4868b34eb6dc126d02e5a5aa990d46ecbd636d066dc56bcb2109b951e1d4e5fe95c3c391bd9dcc10a29ae9c366b90d5fc9e140498ebb4b40f9735eb6d8ae9d8956f5cc52b435ce7a6c9bae0c7cf0571ac903893db10e9109ddee5d55932b6d1e3a5d2b23eeb7328d264c7892549e7830994d3a8833d275852464ef96859f1771684ec73344dab8633d11c105130bcc2dc051aa13bad77cd1591b037d38c0f479a3a00f316d6c8ea139d0ffcfba203ba0849ac28941703836e2186817cb048e6d4eec7b6db2728393e18cfee02794563bec1c5273ccea2bb7a617db0cbf5dd949fba477c609ed79afb353dfd49483bcd0a8c4d6856098f8f44a1ae63c2260ad34a1153b817c42154dc41579ed7d6f4de823f416a1d36369eceaf682ad1cf376bb415ef9de1666263e829e5cb1f173e59581ba3f402ec45f6201f1fdd6c91f3d955c79bf2c03a9d2e188e0b4100ba5e1c679baff932c56220eafb99ecccdb5867d9e60c4f2437044b24b8c9ac8265d711381e8317112f51f62a5f4c2aac4729fb614133c1dfa84dde756a8897af631c6206ba9f77de6efb2dbebe49b0b8249c9a927266415aa061b7fe66c1defc9305d561b8766e0fd6f77fbfafc24e1a20989fb68e7bca58a8ef452b8d8543a34994e878563e047b79b6c953cedaa933528d5059f4852bd58270fc13a29ff137b8aa4a11bd7be168d6edc1a0fcca114e4e398700a17eac7f0dfc5cee373ce3677b25a5516a174d0b0e62f3d48b9c863081cae1df68efde63ea6ac9d734a456f70a7cd4f9b97a511ae2cb7fb48b5e91c6e2602811acd52ff2eaaab081d3c92dc525054f7f39f5cac9fae1f26c69bdbee250b9eb286dc828ffa845d9581a0e9dbe2ddf10bea9fe955672062215967048d1d489a8fbef9a62dcbfaf0b7137c4b8e6137fd40e8f37c0451c9a8680534e9cee37b06944096c8a2ff9ab083fc99fc72ae78d2435b2b2703a0266cb5d7dcbd4374d585f0758c633c00047fc35dd6b9144e0374bac123f1a9d12896deee4e9774b0ab5eedbe3c87b7e42d77e01e1f097f26ae517efe9dfc4520ee70c4a955fe1c2a9b5d5305886a86bf758458f0bc0aad4a1da175792ebcd8de5dbf2c1b70ce221b205f67cf5b833ea3b03ff8afdb1d8b4f11d97ca98e6d56e3327bf0d18c1014755a3d38f71c72f3f2ac9a9393cca2ddebe89c51dd96197e954dbb961e2f5f760a4686e1dfafbf0a81d5d9a35c19b6db6e1fb96a415f5f24eb3271d9696bc167ff4a282451ddba778865528833e8c793c25f42e3d2f16ec049ac98a7a9612a71f832f6903303d95122fcab8e7e2f31452d80244c58c0b38c06158d73f6a29ba145dc91e9a078c57d8695e0302bd5426d28a42fd19f15dfeaef956ac50188ed4e40a415c61226c2654bb876dc10056f79f6ddd5b6acadeb2dcdb7301f86f04072c429615092f6e4fe588454bc22ba4f7a78214c8da57a6c9a3bca56b9b2cd418d2d04d730b14926287133b92b5ffedf0000000000000000ecbea50000000000ec28bb563aa5d4c7a472f3e76cd0a5e855d0c1aad2bd6a4a2cdc1b77b240847b2716dfe5cafeea7c83bddf2635e7cba50e73e66bec00547841ce72e3b2719dfd321f7bb36a353989c9ab5dd387ec414e261854466511017c0883943b0562d4c2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008f766d302cc5b5b8ee5df248bc54a1617d1c93b141d5e76b65359f84ef1cdd36bef3fc911d467b9c2f853a1bbdf3e4a1554eefbda6a0430ee32f16dde3a69958f8e84db007cb6d19e2730cbab994424331b4f2f7cb1aa38d912aa43f0552039f67ba1e29c1c7e9275429f711b43084cd9f1f9b215d36e367b62cbc634e45736b031eaceadd145d2b7d404ce2c8de5ca6a8e705cca2a675ca1b60046adbfd3eec9f030b7a3c5187acbfc74c330826783fe5db8f75813254b304cd6f47113a9fde3ecd0a043193e8a10c21ec5025b864892f3855fbe813da65768ca4c342d1dd891d88640db59111286079e142959250f7bf9fac14e3dff8d0013f4b6b2fc2f12701d3070216c324741b0ecb95035f2a088dc76ec981b83288a26a022edda81360b98dba40032c4bf64889fe7c86d7de71e0698291a8e89dbc92c0a08270564012ed1188d5b40324b596406f178c5c6b6173a495cd55db9c2583120bf0060a72f625a69e5e15640316b5f6e7c007d30ea758fbbc9d48fa20a2d98b128c3c681f27f246e5a80f21220316993940b67088a0ffa28bd0cae767938fef23d93db55e2127c2093c88f160f31d95adb9a433ca80e3c04d6c41b1ebf34617e455ca9f11adb1c201e2c27304877396f64fd45398285de9f060d3ca06ffafdccebb63f274e3cdcd65c3049f7a96ba1b516196c5db3915de2022576bac56ea9e0f1ee175325f70bf119728a62733250a8bfeaabbe18c893889fbdf19682576e63f9b6594cd1935df16e70cf8a1e0c3192c4a73d682faaaf0a921bc922a1c624edd7a900e38111226e3261584cd84346632762e713d5fedd38d6b3bc10de41e8e46a5b0892d38eeb4f6e2da8cb80ec6c01d9ec30726c7ade78ea7c02ce116645c0cc64a191b9b19740260a491002f21a9ee2df855db0ad4ec99adf3ca8213bf1317711ffeca51ac394bd82185034de78b4ff8c1a1ecc6d0f5a7e767d47e603b8313fb6339eb98d9fae54c2fc05b11b0effbfc3773d3dcdb133b9b6e2706bcb7b74ca42ba18327dc5e01bc18f9636f6161686ab63ad12d25f33216482ea6000d12dff7e3f63937088e6e2cd5553d0796aa8ea512c99cc68feddf209459d3ff3bfbc1b77bf97074b9be195f8472d6f445310cf15ceb545f0b75df81d9ee794feb7373b72f68d87c7aeb480cd47d42972d85b9a98b7ab99f5c369204d01f5ba970cf9c20fe15a854e36e214c980a7fbcf8b153b9141811e59a0a2899ad75ca92d6b5dfb1ae5f7ab6baa40e0eaa23989bbc42526b4bbdfecba94224d408ac3cfef44023fcc10a588dfed0327a69a027c139c2a3e68502aed8d1a1996da90ffaaa3272c460b7725b0b3a66d992da19d60628e3d92c4370b7e7160be41492454d106b6963b983f38bfc742d651637bcdd5b64bd67fcf9a22645c0f568801309b31047e973a3cc6fe9c703a3710108ae86cea4cb9f6d81935d3be3a35060fe7bc447ced12c83b40a23a8faa7cf09ef35aeb5bcd91d844182a832667ca6b2bce7047881325a77a127282ed8c7e9ce71d436e30ec18ee0cb8f3b6035044246df3c5b9c1d2bb2f2fb0510e844cebe16c581f90fec0575ca878d2a44dd700e643942db3a0d6b960f2d26c59f0884e3af1f9f775d06d05d0a6782322dfe9561ba2c0d80eb5daa22b47e4909e250b5c24738e96ff7db28ee3e989c4c7d093c7c4147978560add094781359a18732ee219beba5ecb7ed6118dd62a473956663c3b96f1c1a84bf42f5fe7db18721e3e7a8148840599e7b65e8ac8426b85195161fc2a7afa4e6c0a37695832a17e7c21e7fd1c8ac2c21277d9a3f0ddc5081eb55cbc020f3aeeff53bb6d3d06c099cc3e2e665ac379c9256812ddeb3606b317ea9a4b47ec46c22b2c11b3b02b77dd518b03afd7c273062b8c12cc0a866f4470e83769b5815f356400a91544dcf56759f070b53e23f2e8d4850b18c1ff4226bb6836af9b57a88f3c03738f0ad2891f55d6173e5319c94868be14f330fb8424438f25d8a2e889615718f82d4290a99bdbf830c571104f125790ba0955352d150beebb6cf52e01d14b9700896d02ea24c3993bb58cf75950e92eb205cf0253457a685b4f5f1bf4c3f5b078561778913c94b38acd82fa1cd8efe529f3fd9a967893254667ce45d7d45cec5899704c47c29a95cc5c996f96d8877e1b968c4271c9c0d46f92c055a3aedf6bed4d37f79d46492ce5bde1cd5b3b9311d22c61428756c06d8634e35634aec82a307910328d6d4fbc5eda8512f12191bb2d3cafea71a1d1c610a7c0a2b8397799d9f7428000000000000000000000000000b7623521ea1aff167f0728cca7494733fb2c33a1a29b198b816aa670cf156004e8468039030f76677a07ca845b594b168ffd62e9a029ba985c2bb2f74c44b7bd412e064196aa3a0ae9d8af8e7f22435c333f8fb198102fd63fadaedacedf18f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000724a4c68a43b3f249825a526b71e36112fb31f67feaebd55a466e879314849c6085f50e5f5cf96185846b9b1d6d47e95fffc97adc38fc3da1528ee086d24715550e569fb153212bd30e4ec8a09b86b77f6d556cea4249eeb1cc7fcf53f56aa43618f384195638d5c06061a588d1c9d770efca873514356ad42fff695f355ddff021a251aaccbc051ed590efbb5566c393ce9a0f638b1d1898e70d3bc0cb1534b05032d7062e02930b19a94bf435c406d8f0f068fb52e938e25c9e67162cfc5819d6f0a01d952f05ebc39bcc195d2989ac9de44233026d79df658701087398d5d6148b9cf12dd1097b96efdd07748e43cb1685014d83137d989ca6cdb8b173cca097ac30217c4de9b6ba085f4f9be5fb86ab7de26a5ff24925a9def4ee9069486a201ea05020154b5fe53ebf40db5e944ca975a354f5aa24f2a0d241d42d120e4c9128b77540225922841fa99e647d821be9a9a20d4f09ef7206e1ddd50a272b2ae961f237bed03086e9b44dadcc9af9110361312844e024e91b5503ca1fd827756efff28072ebb020f74a092fb5cf0a89dae8caa16b64eb14260cf1bed5b82261c38f365553e1c495492ade43069d780c2eb982f4aaa1a2d4044ea546e6bc7e9a2c3473156820c212315ddaf69a6892ca958d8e366304e72e653b1ce307abc7bdb6810269d8fef436d5ef6d9a09032a8ec71f24e6c6ded364cf50d66f6194e747087aa48b63a8f4bbd15c30b348f47533ee1fc4527b1f83d500b7fe584bfac6f89a4a6d412daf656ec7a5490aa7bf2843a883d89ad37acc67a91d7b4cd839c50c56df9908d077e7d06d870cef258606ba59b85a5e0058cf154494cd1d940d4f299ddc1a36e21583a94c3866b129a3f72e7dfb961d04d1e624c47176af2def9e99bd3d1e0377bcc22043d86a99561a48c9fc0a44545218e9cc9fa8ea8e24ec641e26250b2f346e716830579102b1ff30946879c800077ef84e2162445cfd7eafd2565bb7d128e1715092a66a89f106335147664eccad3f1dac870da1544d9f0f69a797495e4cc62ae732eeaa298aa91615d980a5a06223604029655e06a9ac639f9e6d6fcb332a8dea48f69a8d8a449964083bb2a7d139c54f94639666ccf93756185107321361bee826c7de1fdb50c65107455f97330b1ad3001fa67ad21ade5ed2567e9a60f4b866856de33853052b6ac461ab065f6bef5d66d4fef9620ce065fa76923139ecd97b83ffb0a1645bb43eb772d65d9584fb82554002a1af864a5764323257c77938ccc892b3c8890497663bf61ba0acd329b78a0749f5ec75fcaf5a7c41464db287699af86d8af6617860f1a74ef60ce59579955c130e6ba6dcb2c0a3e99e934f2286e1821a90c3a2f55f325e42aa28be55ec864289adbb6de9c8712c2f9a82017db2af9d40555f0e8578662eff0f1ec07fc68b858b95dc980e5a2c2911edf395e817ce3e15baa20d717e8545fcee42e1802465dfee30c506030a06da22d6fbd8da02dcf503da199a6bdc01268a112fa2d05b830af1f6071643e4aee1e14baaf104777b1a8a3fbb2d9b09a96590fa1229e9580943e8dae853fd5452b4b994add268ae7aead91e913bc0db8077367a3daae78b3b52773c2fb889ad785f5a404afa57e9cb670ab6ecce2a8cba596f03343be81369e5072ca51821ba4c2c7ddbd3d37c62959de8ac01e97e658f127de513ecce4507dac25c2cf8d0c04e8adf9a41f52fe418b75b2100531c9fb1f96e9d0512fc54b28698b889c60960ccce23550adaa9746e92960bccca3b9ca66271779d095c326b1e8fb5f3117bbbfc9ea48ed1f979de4e92ec785350b41058028cd0abccb23bbd6764ecbf52099496b84d76846d56f865fc8879ed78d256a518f6020fa640c144b392644e108076215faff4974e5344c50d0f5a545eea5ee6c4ce59620ea0138eff7850add09eb736efdde51471da3936b429aa1807ef5da14fac460f6917ac7b74458b896aff1985c5bc165e24f2d3f013564ee7617c282d07b746c13fb6e2fb8d64f62b2bad6680997390a28dad5eebd516dec1deb06bc91b7bef3f562f3c4e81ac9b9caf2d71253ecc233a9f04ea597a1fb31036359c208854c366d65f7c3172909a81573c0f3500ffd8d368c3f03310b39f2ba35f0f6e967593b9a2f01fa8ad2868796633110f1358311e18bd2eccb13f593b9b56b09e8f72dc965d2ac3111cf08d08ed8898887c9d6601e2302d2da8bd43f746c6959d388c9e8e9d43b81b327fedb2231cebd16dfb57069f45e7d77b1c7953025d0249fd65be4ea31463ec08bad3bc69e7912fa392b03f0779160051d6461cdb72396c4f471a9cad43dcb7469b3319a069b1884ec8a11f481617b080a1be4373308747fdad074dad002b310ceedf93e2f1d8cc0f18dbb4173e1382688759316a7de50f8ae872c9e1ffe2901", "", 0, -1858388, 1537743641, "88e1c30b0e0f120ee6845a76c3a9947b9e3d6bccf844204590c77174187cbe13"], - ["030000807082c4030165f18e95c782335f5fb6df157e925014e02237474a40dcb8d187aa49bf772a1503000000046a515165ffffffff02f2365d04000000000040efdb000000000000000000000000000000", "ac6352636a53635263", 0, -193887426, 1537743641, "8ee428b89c178fe04c6317f63b630a511f3766bd17c6c2886e65bc9bc8efcb27"], - ["c87360460418588af2cdc2c3066a848bd896629f187341cc01685e555daf00061e6e8637220200000000d78b1e75b0f56cd67654d5d56b46cf02bf2702063cc78c38646ca7f9758d4d535ad86ff90300000003536553767ccaf006908c8bd2d50bc699937405ed1a730250e51657e40753e0a585352f6c5dfdc601000000086a005352ac005153ba0e01ce0f0e09a79dbd185027c103a370eb54b8dcfc91b7fc4f8e497b92e98c1b7f434901000000015249258d94036b59a2040000000001acbd3e9304000000000853525152ac6351530a5391020000000004536a6363190a94ec0300000000000000004b571d00000000007bc3b91fa25a39d565ca476b0dbdd50dc71ab1596f199ca7e5b52b0bb2dc9021b19cbaba73ff8622e6cb98bad5461c663a667de67eea424184c274293f06b25adef7bdd8a3a56f8693c949f74f93f0640c1cb5e67ffb893179f7cbbc5854c6ea00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000825499f7707a590ebca984e28fdaf4561acff705f92178eb04294e194cee0fc56765433f378adc8473287aaf468e5c9c00540de9faf4809e4dd479d76ce725be82e25b910f4a0c7c4fc7c573a9be1c1fc10446f78c06b13cdedc68c124f6be1dd3949287919d965bdb116f42d633a7b9cec7e6f3b68bf37b0baa41e2e4dc928c02031d83050434e71c933a9200fc7843f33cf57d1cbf775061f60db27e3d21ed5503111c61ecce2702b3959ca886be3e9d660fc80bdb223aa7dc99bc446fb160e1e60b0757de021b5dc60befdbb82140faef365c463984d91567f80a1c3ccef413b3e53f0585b350271a19122f2ebe19d8b031c5280988fc798e453207d671352a8ec00305f6061c7ebf69cd8ac4c0dab84f6972d0346f1fd378e589ba09a9f2f7b53d3e0306aee4cce142c78e0a70a1a2d61ad0082954ec5ab7caf4277914ad4831d94f9a0315d802977d5a6ee1237f6866e35f60c6a713fe379a1b65b67468c95fc28d0e330219ae5cb412fe6e36d44b9118e8fdc5a4e61840db1cb94c3dd6a8fb7b88bab76902089c04c22c2a51e94ee272ab1ac8fa961f975ee1a88f34516199637f7ddf76ff49926f7742489635d63cea2b2b19bf290a86f69c382373dcdbb55cf5c82a81d264e634e8279cbe3279467a561a675c45a7b691aff777a70e808a3d6f5c75c2bb2bcda5958a782eab77092cc0d7a6a60379571d9fea56d3ec5842cba1f730a12df910512f376975e27bbab128bd18e073dadcd200e078ed856edbe2f8772408ae31d561105a5c1e62be5b321fe4f6a3dd25840196f63f2cf670a38dad6bd78b935bc978aafe532e1da7cf0c2bc6285b8f81f2842fdc5400974fbb7dcb43feba6a625e42087261684ca101afc8ca5049b3af152139a2ce2cde4ab0032b19d0c1cfb90cede82ff2c9c4b8642d4b74ff08d4f290fb2af096a2e9a7cf17b4fb1b27f7e81abb78d8dfad15646153488ea0d4751d8827ea2a8918a56c3b632311c2e0b27911c5794240fe57a83b43199552782d53688d928d7d4c9129e77861ec614bbba0fb1426a75bd74e415c9fb97cce9fd196b9d282a6fccefd00331b18b8748852291dea047bf0163cfb6a8a0908e46cc1843d1d63870d17068c335b28244c340216a617574bfedb199ce83c8757fc9b2881b0d7f0d2c979e47096dd2ea8f91abde9b3fc5bb935cbd548e3a23f7f188b7460eb54181ef83fe3ae861041d61af4543fc13edd45c80ac344edb288b3ae8f1570f464f621e7f1d9d01bc16507248d95db1c2f92e762d037856517918f930dfa37248c6d3f8c0f9ca7203cce57fc0bcba6066ca36ece09dd4fc1759ea5ce7c84ea3c458c93f77ed6796067bb36e03cce1dfdf43edc3a1c7203998e31e6de844612980e85cca6dd712cded2a23d1e06289e3e7d8559fc1f0f220211d546a431d9796ace2b10d01f93fe3c04bfea5df0aa42beb08ebe8f7e778288631494a5bcda8cea447fd611d68702c542d5fd079296a1d62989b45d37e0b91f37361460e39d2aff2bc7e9bb2a5cffea39a025388149175410416d9891b99f4fa7df14bcdf6963dc604ff349e206340cf057d421cd4aae47a6e0b8bf9984b28d007c33af50499b6fbd1092cc40c6422d344b932c5d2409a1a5f5eeeceaf59b3d11c0b293edd01f3c10d5698d00b8492de8e7a81ab7ad5b8b14869478e21810e571faedc7e4d135024febb073843c711a5ce22e72d06b8ddea5632d3ee789619816f0ea18dd594fa6c627238681994cb0d170eeb9c249230073d7f06056426e3c7df72bbfbb5b123b3352a30bd65c8516687b14a0433deaad767efb365e844ef0d25d88568c15ad9b3cb73fb13899e0a792011141f320036f5709a626975d2d2e4d6b6bc7a8c4337cb18e7dda86ee2d2dbc87527d41d6b16466f73307d6be3f3eb588564f644ed4dfdce43a61af5c46ec08b2aa41e41bfa5e42e6b771c4c34579e2392b8e195868c2a806946d0a956f78c9d6a7a64298a5bb9807ff2ed5ee57cbbb59b2ef05ba6d1d87826e09d4fb47305a76db7998ea58d919c1ad986929cd1e98e8360841676f909e08e58555105e1395fdcdc10d58a306e0a5cc5245a900eb9caf25a6ff3090be234e57be8e2823a12c2b86d9cd9592405b53370f041c5e37d8a9727c3bd885b7370386a3b80eab99d1739d43a3774b2f0057c05aac770a68bdfdd7b3ed987e20790aa01392b030dee1d99781c211498cb13635d1be5749de7ff547784a1a631287d255571fc1d9b09946cd31392f7a66f66c4fd41e7ce1f088a41b4cbd6862618460ac02000000000000000000000000e6402053749bc2d757ea8a6536492f6ee38135e9045b6d4babd5a182d6bdfcb20275a36e85b1fd20c8f1c06e85aada519568165203599c587f546283285de8f49432eede4b5d94417fbddad2eb8842b01bb99389ccd1849e524f2090f5bdc0b1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004427944fd76e82655ee809aeca6c7b1a789f24cf86261eaf720db3f06cf8979ef529996ce5c8b4374108ed16486643afb37aafeb9174952904c864de35cb900561e2ba158a5d9bd9a5f608fe6369969c8acd76bb12a8b9284a744b735cb3f41dc0cc17d1c62db3ecb374af57497e77740e01619aaf302711c8dd8595254a2fa203108d4ec40169cb80d105bcff4127aa68827baedd52ab5ee67fd91a45dc05b72b0329b8ded9e100abc7c16550baac2111104cc44d28019f8fca921e5b37428deb020a07d588831aca71022186fa7d3a9b65c68c0daba5fac0347ce097b3d0b597c5e06a16fc21ace02639043e8c91dcab17a68cb2dd26d6dda8da0af696ec482a98bd032a7fe71b84eda154341b84d0d7bae2701c2697bdae3e286d8153dce657ddc765021d33de7c70d8816aab642decae6534a0dee88b0c5baab9a698a4b9bda95e70f2021bd7f28b1e7c243729409927bc551547b822b4798af79c8e17ef5a5a9ae608c5021fa4e8a179083f32e8acde5ffdf90493513f847b7a7b36cf928e4e364330e1c5020f03ce1d19807eebee3ab27accfdf4291a572ee41f7feb47487bb5a73d18f26c583127d1c7a42a6771e83bb4e58890d12b73e79ec86a102196ca0890a4829c5acca4b7829eb8c92e701662e025405edb4564803912e049a09309ffce29808be4f8193a341529f42b6a34578b8a8c5de16f99c2f75e15a251085a1b1f398ee74f880404cff0aaa1dd12bb11bf798f1300148917bf1e66a1f1c9df2cde126b1806f9a6d0675e14767c6b3e94cc9440056027c3316dd2c77285bc9cd9a2ca4e442717c4a9e86051bd4f30c204e0b7feed8c57544289ac693a807e346236faf99f77f21062ae699e579e7d08b31c04e21876139e7b0941f53e8b4a2706c91b7a30010d4f85eada934ea2a073667f0397094dc31a059041b2171652867db4d486893c107381f22ea08bc384700f633c22e95ee2ab5e9284a6babf31e15bf39979e8171e7dfc3c117d70af9a16b7b089ca6227d1fa948225fad256c9d1006f698d3534caf9a3dfcb2ee6f60247167a953c62c8ae8923487e6be70e41e84422f66a137ddb35b6a621c8524e7cec84f9a8d80f94610d87047db845da810935e54881f14290beaa5a16b6e54fc01940eb9ff281c047443ed076c1a0f6bb24baa5538eedc2bc0548df704babb8e08e6777ae5251a39191285155f034aa9e17873171e88df8f9c758f5a9d6cc46a057d035cd2886a1216384c017780d2b59c06766b8e1c78898c29dbf51c4b812b4ed87c2397fbe729c8934cb6ddbeef34678eff0a7faf57e1de6716ff95b7b95ade83941a2b837351411629090f7ffdb90007573a784c6041ed95b53feb906e0119f9c8ff41601a264bc7b2ef669d0868cb282d31e8c268f77a527a45f305ae2e5e953db676fcea5ec777fe1a5bacc89e45710265b57db19a8524e8af39e75eae0399be23a1d026e7d0b637fd51919db3d44f7b1de39d3fcae495a73b4f990d946267a7be7e3407606b07c7628c0982b508181caaa22e505b5556c220f7af6551b094ed3f9da04d986310b85e5622f87aaabdea7a74b7570b7b34ca9a68b1809a294e8f0a15a37f146fb23e8ecbc20c24aa00608f82da7e3286f167b7c0b154d8a5248764ba22b971c1eb31908bbe6e498614729ef7f9ad5f47ebc4f72486e2654485b00e3c260a9815c3c5ff6b3c69fb7e17553b0c94f631dd72858da031cf08ff038a9fae54b28cdf32423d5c3bad84d91b625a9a91590403c540a43457bba01431eda06f75b170c67909397a64254e6c4601055752f917d12e23be2cc12dd702b9834bc7e288a562ebfd6e56301d3d83eb32273b35b938e4ee1da39cf9e9ad023947fec42bb5aa685f193bb98a9db26e365537e3ad3000652200c51888e6dbba425fe776f76a42111e44fac0808c4aaacfb36427fedea5ca6d8123a4a213e5f17b7f9aaa1b5f330b39cfac92cf7a5dd8442d1aa758b69f64d177491c3403183383d0d89f80315f34652d40ed1ef19be47396f74de57e0fe9525636b2dc870bbc34944c6a481b122f066863b44c26ad60df2042292c7778f6226dbf68636448cd508e48d28df6f21799cc0c96cb0703d9e80ae9cb2f00c47960d98fb46b13d7771c91aa5db2402dd87e17e12a073e72df3af9a083c972c0a674617efe6eb300ca1eba751665a8b748608de26c656460edc51faa68699d31bb07aaa3e86d50698407e89cde4e670986b4b2f50759a3c9765fcff625dcda2e62e4c8efd73de88f64b40587b08520ea74d000000000000000090205502000000007ef9ce7a8b1346029ad21276b5cfe9b64c37d3b1d665a9f4902deef6b4c6d59ec62a8cfd50454459256ee3dde2a00a0421a2b06b4a60ae323875c7e3d46bb65e6075554fa64a23fdc13f35d7afa23f9e460498aa96f2bdcf5adc025a40c6e035000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f6e43d26d6a86af156432e30e00a96359a7e34baa06abf14d6c8c07b2224d9958f5b88a9d8ed78536e0113224ca2ba07a3be6c77b9d37d35e3052d2413d215980290dca6b69b9005881134926742eb9b29b04cddb1fca8408634584da0635e3c2172568d9d36e14674dd8d24a837bf591d89fdbff7aaf195db7161a2f8ae7e7021b475ed12955133b3163b01c2be5404e2767c6ae2407959953125c0f53d4d62402041265fd3ff285e76b99d128dc7a5e5609b48bcfab8350a0dc05dd32d59da80e0a032179c7ad6e4d8aabc27d503939ce7bd967e9bda4011546b181f3359b018848571ec6f84ce49fea2f0a8dd88260c965b148f2c3e5af467630f178cc3bd24d44021127fdf27d5f466f9d21a57e262103da1efca4a40c83cbf9d7cd51392447cb560227dea65695b11a825f8b2321c3843beb40c72d77df0493e387ba4e936bb354090306e432cb3140e0268be37318ca0240bedfb1369ef516ccd1f178c9e7093c6efb0318b6984bcce10a63d17688072f6174ee323b6f87af80169a41e456ddcb4ba85803156c76e80ce96c767078447d15492abacc828fc31f701d825de6e3143f0ef9f029ad9ee442cc4375352b8e4c1a1c4945cfe93b1ee85865ec7f5a4745136e71a914eef79574783de446950650b6d04c6915fd318296bbae6046d0ea9cb4a824b15d620c7e7dab9c6df345627a237252cbc924ad4c296563b2bbc3a0c31431d7a4601eb7fd34f14cbb3d6feaf159430fd8dee70f636e54183755dd87285bb0288fa13535eefa1c314fb603a09805e53059b97c531e4423921f7231a2c677f3303d19e49855464deae6bbe1aeaf27b35a26d3e367c43fbb0182aba94779b43b79fa53bbed9336bc3e21d7fb484b0df98dac156da86bad8a3b36a5af4cc41a07fe2cd238557b050f17a2324ea58826316cece6c08870a41c7692f8f435130de6e9b972828effd5ce2a42814b25ac8dec051e0230fd59303d44c8f38d43df88878b359165ebaa18e159c7a6fd9f753bb23a1513441636ea351700b20a1f6c46610d6fc44210f276277ae89cb30008c9ee66c15614c8b63bad3825f094e194f1a6788516848f7e29d6474888855676aa3e525317f49c6e35e6ec18ba1d2a932a2a3b4f2b7e8ed98e2e95b4f03168047b33705a4449a5205fe57ca9ccc7df7cfe3eb31eedcf48374546ccb7420e94dd6f8362d55a2df13a07d6604acfb176a5c525c627536a90424870a0e747ebea7d21ae5ad9f1c5fbf2601c0d2358c952c972fe950e2a02cb336e8e1cdfe9ddda06780c31f2ce40c862af1bd1a50c7f0767379d50ef5602c266e0abe6267ec15f8fd661284096ecb0f6cf2abea468092df79b7f40ef94fc14a474b2508e02425bdf3e4e331502bbe5469b04475c2a48a5c1c12dcea75ab93c807b9e4bc28352e477f67d79b5df72018e83cbfc31018b6656de84bb3d8184e70e05fb0db318bc5571346caaf667d477f6a09a15ef76e65a4d524360e9925ff631dcc6080ba34e2f606afd35c5deec96296a2c74cd3115d70aa5be1d8c4d17095edac5d67e9d128b03b8455dd287b1db66503c8d5f6448877f576525fb75d5a7b7453227587ebe8b62be234a3e37fcb77b1ecdb467b3b3b6bfca7e27c4ee9f87797cf008fd433a5bf374d6d0c4e39bac9ba5e9f7c893c25b23306ea89daf8b1e25148a3612431ac72d3dd932539836adb1deb25c7a1863a8c52d6ac673596c50e779cf4c6fa9c520cf01178f10c9a868bf1f5f3cdf49ae4004f61a41646d7cb5d29af74d6fe0b5815938fb0ebb6d9bdc9661320e3242bb353e09987bba95051a52def9cf01b021b4cb3d5f352fb89d7b526136f61f7244fb791f7c6bedde7ad27d4205a525b7aa84bc413196462189fdc227743878cc9c2aa1743a08c907f6fec3a8952998db33fa532fc563ee4d4fdadaa06258cd97e137f1965bee825ef0fbe53ee13a2ed05dc2a337a21ea26619b4155234dff7431b2541cee99b309799fda889fbe51b35c2b646e1d4ad3f9850d3eb8d76bc5e7e201bf03d76318f25fa1152112796545546698ba50106e0d4cf61273b4f3dab145be3b234c041bf53b5d444c0b13723d94eb9baf19c317cc0d69f2573f028ee3a2d5da784ae32011dbcff69982719607bff4b42c8dcee5e4e21251be244327281bad27f0a7d7f40f29e16e03e6a6d23cbcc29f5f6546f3a353f3c92f1ce5d2bbda51dc645ed54a4dcdcf2d15d7e6201984decaed038ca05eff42561d080d76a591fc5dc8ce3f710a518f8f5ae8e4459bc980cbd6f82ea0f78f47ab184386e6aad55e00bde56046859d6d5e86692ae65a8c0d976c9b07ac5fb71467eec1e15da6f6f1e3ecd72556beb664a894335f2585247eca4fe76447c42073f3ef2d99ff3c299d72a9d54fca538a048251d6e12c7a29d81bae6c976e0ce0a", "53536553", 2, 136953062, 1537743641, "46ebe00adf92ea7b7e863e46e92aab55e64f11f15b945887eeae91cc4b27df09"], - ["030000807082c4030122f9a656fb00cdc325abc2b0ee423eb4d2b4ae52ebe9ff5a6a6a22fd04a15fe5010000000253510e5a190304b467540000000000056a6a6a51ac49659a020000000008655100510065ac5105a0690500000000076a535251006300e4ea1705000000000453516a5163994c0292d9349403c9e365050000000000000000000000000c89451ff6758e93b719859ba47f7238454c094f37b91b4c8c7cbe1c401c507934665f66f773b9545ff35b88d63db13c0659bf6063da6f3bc79b65516ed565d6942c86a4fb62ba95654d14040be22ef57f46607da617a66999688a77ff99b2a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098f7fbcba4dc86d28b9155e0b3c293eedc8cd27c903ff097d3b97e1d61f9432001b5942cf3f1d3a1cacbc4294442efbe711733df5aff9eee6965ef792ef108d0faae19bc50129b3613965cd7e0064fb7777d83fc931050261868310d7e1bb1bffbd97c3b6021840bbca8c7329dcdda80e8aacc609320abeacb995b48da73f9ad02075276fdfa4a4b4413693ec77fc4fa88355c15a52d0da384c8efae839c018863032e9580651f513a472de9586e219a86807c67cdad4c783761ec2f49e68d9d54a80b06bb0b2bb5d944fc3dc2eaff0aa28ef66dbb15852e7feba0fd80ed417b3cbfe03a42740b6de805e7ee6bfd9ad9a417696c9c6ab3a685ba9f0a7d2b23e145c6be03032ad3e0bc3babed0234ca769daab2d0908905cf833ca81775100fdc97db81e1020211c61c8932cc1169f4e5aa02de1a32f8f7fa30a6754ef77f37aca866a62c38030f2e9d5bd35720d78028d83237c68cb4422189cb4524b45770eba80b920d5dc0020777a2bd4e3b1ec165e026ca2b4790ca74225151594631cfd0f08277250621380302cebeda62c90ff2073ad70d635da2d1cd7552d99cde33d53ae22eaecc966cf4e5c456cd3459b332ad90e1ee4b5cbfec151b9b7013d9fc9171e3c9bd74f3c6ebeeb59c5b560299113981b8cad03fb036e6d8a4d554e57669bf5477b016c250092b10136011f801e65c2fc6c8e036416d15f10f43453d3b281add105406049007dd142d059a207ee49d36b90cdac63d6307720baf5f43007e8936f82e7ced5e25187f1d36e243791d715f5d9f56f06d9fc31976f16bad7b1e81fab11030c020e80b36515c8f04f5f4b26b03f5eef117fc3fabd9666cf2663d1d91b75ac50de87f58b6eb054910606f927f3dfd36fb49afadc59aeff843e707ba805250215e07183f2f7bd102f021d4cf65ffc85e22998f94ee1e9a7450f0d841a801336176eca936ac81fdf73276d229980167498a4d2c24653dc919ed2ee9ea83ef3a66716ce28baedee9b8958541c39c4fbb5a9f7e3e17100a654e059b821bf4de56ecb2765c20e8063aae8fcf62868188bdf55c5949596925b5d6142b3428f78dd387ac665cb06949f22e8916fb283a3af7dc5b8ff466ed9a7d883175bf20c2de89c7260bf63b20de071589564e806e24b2fda1b2fc7c2f35c227b00ef2120fe0f3178a2bd623843f0cdc8d4332f2254678526326ffbf0cbcf859defa83a5c050df9bf1af1136c9674c43dedd64268cb59ce90b50d1f243f5c8319c40e0fab3476e826ed07a4cfad22cc41c261d6fe71358cf0b538000f3c791db4c394129cde91d2114a75ca4c1c6feee5a429afce4c802d0540b82ff9a33ccffa76317bf9669de2deddd1b2ec1890948627c07847f55bf6c4060c84cccaccf9479aae43a0f2f4f8fcb17ea7be8bd8ac1f0c46b9ce6037cea7ef3f0808a7676485b76f0facf7f8312fe30ac5a8fa0f3bf4758f1b4b16f8ae77ae6514310031d2513c62cd44a40641e3692e261871a863bd758f412a8ba1577b44e7ca560242772e41633cae5706f29c333cacfb6398a2ad8ecafea3e9b65ea688deb5fd2ff3f81221fd39ec1a23ea792b090a46c45e2ca1580a273874802058704f92f0313810c7e8ad9e39af79b785f338285be8510dd44c31702bb0df66b9d80ead671180abc0c12e9e97ddd4ecc7dcce66f90d97505aab5898cc5bdfe1246104a3dc0512c5c73b729fbde9b7c1e0b2a69cc3b32c7ea3d85f44681fa465d6ae852603a59a7117b661d0baaae052b61f50fc2efef9305f1762204ad504171be4d5f8c76b5e78ad9dfa005b6b0168b67f5ea3f2b28e3046a002df9c10cb4840c64a12f470451e9771729fc3da74613a82a9ad3bfd4952ecf1c4446d0045cb4763c5168571d0490c5f62a8f8386e74765511b47be4f024f7603151b4e1c0e2293e8f4298d42f0a8840b34624c153e3f947a97c273c48fcaea8194bd0a66a40d66e850a9fc311b58fa8fe8719bb071f94dd57b31128c88f6c03d73cf01de8b69c1c3799da200fef2fac691de5ca7874fbc7dd26783457d26298be93cfb75777735cbc40c01d10f0adc4f05e571312cad744b74f905e336a626355425329037dc1a8749b0144766cf080262085df85226d8225d7f7dcef6387addb0de2b66138e9c1a744de847fdcbd27ad0776abb8d38cbbcd7fed0e366d480adb688f4247280ce0c9fa2b93470676c405e22eddc457c9aac35e9d84806447c5189ecf770f6eca8dfc8f395ef98f8b3a45d8594ada39c3a1eac04cf73429bc656546cdf49e56e90b0d240ea00000000000000005f4d9d05000000006dab60279fa1dc7f0f03d573aa19e5799d1e2f41acaefe9e881d7afd89d0b685c73b6d66c060fff18de4d81767a0704e558da0b0c0a46d0d8c934df412bb3020a068d9be36905d278adae435713c60d4de0f915a5ac9739501fc9304b23696180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069b837c087efa9bed796649ca51a7425321de020b605594d9e7af6ff0f6cfc5560c23b6b1360bedc3e650c9d0485c4e5709217ccc0b012bc6df52ba2bde53a1601a0eeda250ed3d778b0faaab53d7791fb57fc69bca6951d66e71b60a99d660a155f1a5ab5f894f16f9df4ae9835f1499eefa43768f6d2b5860860d063c99651032439ecfaa911678dcd979071e415a94800a4f8fdb4e908255628ecebaf8d72620325f6c7f588e141b89b77fa08e44c5175b67802f6751d0fd31da41752a915a7d90a014748ea9be329395af01629c00728b3bf754c11dff1d088f199478b45f52816d6bb67e9af8bc00bbe536af9cc72f0b5ed90f6e28a3886383c83f1cc647a7e1f020f7bc46e26f42b72129fcb5e8e0bd30db43f7371f7305d260f20e21dc98ce8b3031a9c095fe5c99016b7d8b63e7a44a12599145cce08cd4f066f237143938faa4102102406545daf2edda15b67fa49a81741946102747423d99539090d77e5e962640205504780994689f8a8225fc6181ffd1f79682a4df4df4d5cbb75d428b37a8106020baf0eac296d57a756ba5521d620ae638042c44a69bcdd44978ad31ff68d13f49fb048087073eae48aaf5f1375912756bfe211eeed682bd3dae842c498116cd75a656ec280932e1ec064b5bc723f1f9c275669438a94c5cf900aca09a98f8c946a0447a9972c85d9f8c17eefbfc4f10046c6029f727e39386d1d698fd4095f8b4c6580f620841e314a42c96400a3ab4263cabaf6d4c742e40ae671422a8bd3b6d24703a4e523a98494811a98abe9b5601be7de8dd66bb43236528805a3db8a1a3974b418fd5028b6784819b97952c8cf8087e28e3c02d73f5110ed99b8fa5159bcab7e4d572a4333682235df4b111209febd87d0f3288cebf17705723f5b5d2ab7ffff078ef644133ae7f1b463f70adb0e7c0dd0a595b84aab7216e0e808f8221130bda561479dcaea336f77d92cf40b54f219cf7d5a6ea422a6acefc535cf27e1340b89caee11294a4d571b42be5320793ddc9a3b98ca80f1feb0d1aa7c024910fab0df1512d3026d25ec83cdcc132671279e19d508319e938dcae5a70b79b5af8e0a02383bdf26a9e6c886fa32d4f58850324d8ff303d2dbadbf2fd2fb2738718aeddd794081c5fbbe37889f23468b96d1c11b4dc43144e87e7e49c651c1bbe51e62310a33f77228b2e355c3b36b8f6a04a7aa3f95b7e5fd0aaf86bcff2fbe692183d70599ed24171627520f95de0824a69967c8458e310b13b78f2a89d6ca2fc2a043e50ec8386ae7be9f41371a43586d943fa3ee686143c671881c2258ef4779cc1cf8f55ebe0a5db2b1558eabf5336ac47d7592882efd5357c9175f693f9c8dd5287442edda451e66c8630cf31469853b4cb29013a76aca71a6593a08c607d1a1ab364e4a18fb53ba75b56f0f508128f768f2074f5918e97226fbe1b3871526d687381fe5ce5b91fe2a2e2b5c2c1ad4fb9f004df3c46a96c05dca12c280c7cccebcde91268a6e6903eea0ebc429c21d6f9aee2a309c5f4cdaff4a831b14531a297c9305530687b928e2b803815a7403f78669af3c6fb6dc2291c119091f90ca1dc650f794ec1ee74a084f22640e656f43f513a605a863c492f95baa8accb5ce9b547a1df72bb15567af848a916bc3674d97c47ef8696ee427553679b85f76654d6c1cc3c1d425bef84ca3976df69abe2c6eb9c1e0ff6d172bb46d85467745546d6caf4b1677f52801cf5fd2c2e2f290e111cfcb6ac213f5c116bdedfde5607b5805f04621eaf3a9ca45e36652ff150305e54fad5e68ce4cce790b6bc8991108970bbe2942eb59f3e942a02b2d8595a86c4b6ff4bc585344237c8219d39d8ee8979cc8a14371588137051832296d2bafc756a5c16063ae97143da6c228b007fa4519de4292a8137a17e2ab9bbdfc0fd7bc4a69654b276058bb84bd7a3f8114a8d1118edf15e2e8ca3a29749c989f86a4fee3dc17f3d59ebc1d0b164c873ec2649301a3bc7049c7ccd3891f0f1256bd2be1c2cf4c310f745a98a60d3c2fcfb135a7f43dadc52e874280ae574bf8e94b5b08a4ba4057a0232c6a0bb45c1b45c6eb6b2972c08d9f556b21f504f8544943e502c3414ffef68343133b8212c1aebb7700a5d21f0ef93cd4219c57904e2b4bab6bb86ac9c1c571bb36f607c01931c348e971fce74180d427e1be0adeeea8c9608e1ce72182272f8ac27ec1826a537c3d43b5f2a067938fd3e97158a71017f60b55f360bca2d30a70a5aaabac98c35423b15c3fa55fd37ba7ce9e4dfd600a34050400a10100000000000000000000000087b3f8be02f2d5663d379b5babaa2211b37606783a2fb22dfecc8e66d5dad7a91f24041fcb49ea0cb23e4a4bc792e62745eb41b669892d09a8245ec37bc95bbf7309f00c1efdad834e60fbc5cb020476e9cd2ce9752785e76bd524269588aef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000501b0eaddb7f639a3da1498df09a1c9958698e7d9b214cc92b1c8f93d2d71ec212ffa45e47141ec3f176e3ca314dc44dec593c5ba6126d09dd175434f49aa9a02583e60de35743348ea86692a1ceb930500b8f983073ec0014406faa713a37f1d229eb2819614c651f0a90abce0fe6d62b1b719f5d3e10be00e715bbc18cb82d0209bc95173af337f6db66d5963b82ac61ed8032ed67a4d8b20c6ef332c9db597602188408104e1fb94df3259b1d2d1b12b63917cec80251e61bb510cf4c5f6ae57c0b04c68de04ed9112d91cb4e0ba64256cc3cda680a6830b9de95fc9b2b5901031b044ab18aae5dcefbcf9bd014aba588552230d68710cba81851fba1752b2895ac0209f156e7cdf8536a5a7428089b89eb4ae8434f4997c415f08a3a89fcf17e7424030beaedda5c8e26085977d2e5564577d9a88dd1574aa3b65b7c7b2f50c402f34b021606c31041d422905b03badf6315989f8cf40e233b90315eb825018ab1223bb1022d569b3acab17dc15f53ed124bb1edff467aac72d55c67c3c23a50895df926990204ff156de742d4b793180f930d414e8a36a311d8b59ece9ceddd904b0113d5899d973c2364ec7510e8ac2f7d4f07a153e575ad05fae49afab3cfbcfb2359372c7cd26b073b8897c9b92043128c418188e456d230b06721c68fc76f4e9dd3ad2fda7bab1d4f8a9b6df312464690ef1d0f86a0baddb3c5ba63a36800c39cdacb5169df37b7a31cdb9d56d04b2c6c30078b8f449bf61bdfaa11b3e5e1d1465d7457c822ba18b16be251a60254744ebe21a59245f89f77fbaa79cc24f303844bb5ad0b6eb6ebcd14d7d4980b717dc5657490f36e424af64a3176b10f5768079112500f74c33fb294011516f15bed1ac5b6e9f738b13b0df6adafb152af52e0e5bf5eef584a1e90c60806746a46709179ea9723c670065a0fcf5877bd79f9d862eb317f9a4cc529f1e70faded30c6d016a3f03badf2296a4962e201eb850ed4339e0726d6114cfedf145bc575c4476ed0b7b24d69ecea07fc538d0dbd33952c89b9ca8eeae60ba3c801c284b43574037059910be97e4e15fc44ce8dd1244a60583061203fac429cd195d9c3a28aff36e43bab8cb52fbe336b93a271326daa814dc2b80488a325ccf01f50b1d618bfcfbd8511d603bfe5495270cf3137a7f253400d4bd2e1c8a47c21ee50d634629ed61626235c27ab3b1ed9de7c8380ff6e334bde0be9b3c109e911ea2832500a465605cc5eccc41dcb7f7169a02bc6a6502f5de285fd48b70990cc9af99cd1c74af2a809cb7680218cacaf35f6905d6414bf66226d656bef1f7afff89510fa5f72ff64dec234469da34816ff8b73b0f7c13eb633d412457700fb0abc641527e213aaace38e889f6af57bdb9e31efafdcc3574abbbed18a68291d0feaf9d54a71c4a3d7df8457344f25d158e9af72bc11d94a765b4f7c3a08f1dc37d8444155e83cb99138c04db815d950c667fcc521172f08aff889673765529ca08135ddb69f3cd111f4343040b6f2528a776d92d757d7beb03af26d106bdd3779392f7ff26450b063d79b65b314a6080d9921d75b6d2055fd7914e0f4bb269877c3f512d96f7684668f37bced4ad5f6b6dbba6e81b2d60d5723322190bef7e3f98412c8185c562f2325e49fb0a136e3dd7548117b5ddd1f23e79a3e494fff2820897310aba15f97537541af67d39b563305c8c5a100671d696094e8a2d251c0c88269f36f45505c1b4027e93181aec83b83bcfeade3ea90785ca329fc9026991d8ffebc6149d98a05804c8705096f242c84971f07659e4d87b5466330e51bf29c6daa532626f4a2d2cfe9ece85662f7d9b91ba0a5d642f69d86d388eea41365b1d8b362fbae5cec181ac086f2659805847c2b555b3b4090dd976377b1460c725427b085d5a0c9f6161b676c9899542ea780cdc92630dd1080f965ab0ef00f92b217b64a4ac3dd92fa812afef2f2beef1e23b88e14f38ba1a0d87ce6febece93458e01b6ff89af400e543cbf5ac90f91dd07d9a22c3eef77f90fcd8c6a73bd964f821c76b69dcd8e930e96fdc84a636975bb5b63821eac96bc845dced187e17412863df738e38093541073472588ec4612e369064d83d0cf15524a5048e16d2d73eccfa4ecbe9ef2bf9fa3b5b7afa1f27743d0feb3c2d4299c466466f36abb400af041ac6bc8c637c4ad62aadbde5f3c096b51c8d115cd3b3e6cd954565ce55f841aa19599ebed96174d7f75ba8b086fb9caec2a02aa7a7e9d9b732aac74378597869984fd91d7379cabefb4aa2c31bb520d4d1f9e1e6e7d00e5daf08f708c0a58d01f651b68ffded6c69307005e9e3fb98d3f8130024d5289678406c4a5e1d7c5401e61cb58dbce9c4bbca0a83574edd5e7a45683dfdeb381a3650a46dd644c2659308311881c4a1808103f01", "516aac", 0, -962025450, 1537743641, "744663c9f8a95087599d967f1f308fc2f0ef102eca496360291fc0e011eff770"], - ["030000807082c40304dc89f7f3d0ee918baf1983fa6c701d911078d644eb8cf48d465c3a81d1d59ce600000000036aac65d455f36a94aa9e6575dfa9d0b6ea565ad0426b42d3b7fff6729c7fc969d5bb1c3bc513f602000000045152536afffffffffd26a999745dc6f899690a12531b72c8d1fe582e7dcc5b20ada427323e34fd8f00000000026a6affffffff46f4f09251e2538af0e44446ce3cb6f6f25c27182dbbbc4687e061df83d662ec000000000453ac6a6a8f13474d04dfb1af0100000000016a34b6d00400000000003e05450100000000045151530058c0b10500000000026a5357eaf3850000000001000000000000000088fc0203000000005ea0eb38ca4cb80a7b59e88f9baca94a7aafc4624eaf3ff8edac00a1597d5961521035e36c9605a8f69a9371f2e589ec1a9517550b20b70041e047cd4389b4c7cb4750b080bbffe99e2d185f190637f93ee05e3c9f5a5ed8cbdcfdf31b55dab1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f9533e60fde524bf69b8e24dd1fe7d6225add0993f8da6df3bf021b4669d07b12c237c34b1ceb5a57fb52fea69b2cd98dcd97149fcff52e61a5edc9c874e8bff19244dafcdf294b578111054660179d2c66c9758afc4cf8ae00b81a44cda6ab7703df500a0478ae281aeded22d7cff10d88761fe2264501415c0f5e48982e900312f25d77cc48cf6e0fa8a5a371da0fa14d59ae35f60dbec6f93981a30dabd9720227ed171562d36014ed1c5d73836e114f7762f5b2fc39d6557e940d3cf9d8f6360b01f4b145cfda43efc1b417924bf08600918c15bed9b7ce3d1983ae0ece045603d1c6eb5a1680ec389330b7691c724219918bd2da91af1c3dc938a9992263156e02241d312776f481c91e7f62968f7bce9e197f92cd6a7f44cdcf7557904cde75ad022304a9fbffba6278b6680971da694a46e3b4482f2462d4b43df2084acfdda968032be1166181df65a438bfb7eb468240698509eca931a794397406b561bb2c4893020ea579f93f39c5c5bc04ed8e871e6bf303dca478eb2661cfb737726649db75950208a5966ad3db8e5411fc87be3811fb718f1be031c0e527c2fe9fddf7d101702314200090da1f84bc6a301ae0b4f7b4d37fd64ea1aab415e7901869461046a0d7c386d175d377cd1f97763e7ed85ce249a16c5cbab3c7be5d515bfdc9ec90decab1a9170160bfd5e7072f0ae8384b8821608de6f87a74f267fc639c66e1e3d0b06e96f58f7feace7f6ab4c87e07045757298e809485ea42e90b0b60e7d35f2b94c70959a827e99759f42aa058b7c5953586002f5a6e2b8c8b77073b664fd6621acca3fca0bb6d39dd08739e02de3687b06297c7ee4c7a6457719a5d6404c428ae953a21adc441f2f9a0ef5a746be295ced3571732c5b94beb921b91005e4d0424e92f76097671e73eeb2fc3e4701ac0e36556404a36baaa74d70f45a8a19f2132f643ee933bc2e5af9a66159443c9ce3e96a33f32ea4175de372df5589958348b0d9b32f0e7bbc0c8805935408ecf2cea01fafb59c2e44ea5d4b854a92a31960071e0ebf855b8cc433b3a8156a96f5ab73476b28731c7a5dd3e630aada9d720d98ace391aff790d0f2bd35812128b5f07aaccf01b0a5eac205cc0150938fe7ab1ea46a571fc16dbe9f21f6fb139fd51c9a9789c1baa791b087d30267ba0f9f2c84ad7e8ecda81461dba4ef7cba7edb755ac2f638916f0c60b63df9d9767df8362f272ca6dbe54e5d795a613cd42257d3e8572c328b7f9a9b7e655955edc798e6844a6426e7b6695115e7d8523b5a1ec02687ca7d5e6462e1efdcc42a43dc2e42371c8b4cd823284f3e857fe7986d8b8a312ff1f5206e17f38ed4dacbac897374c7fe7c692dde0ee5eae6ee4ae20c0e0c9ea13071f1b7aa9c6698d78298c84ab0bca43cf1f5dd1eb817663a89a16bac40d024d7fb7ff40a2e550d6fc431438ea4c95d0b30cf24aefd94276bba80231966fda1b7dd7879a19e6cb368af8391686b4c0e68badd260b4387bac139919e74659b0f9ae3f6f4f5a71267f2b540d7c1604c1ed719e38b3fe8ea9a7845a95f57ab8f57491ba567f529df8d12c7e2b30ebd018490aba6e2e2a5ceb372596d3d1e5adbf523a34385dd112dc4753d1a30b213f696eb851c7068b49293a3d952fda1f88bf4bdfe0c17843283f93638d277d6761bd3249aeaa2b2214bb3130b5295c2a66fbdaa1df95e4acf9540d5543e21fa48c627a1a7c6cc34a05d223480eeaa2d93b1cd3cd41cf0ccd16d9a8b51a3f71d1e1942d1d516a303381610fae15467197d1afc1da07d273a5f2ec0adf5a6b25f5d3745c424dfd48f2347733844fa9a8ac4870547adc22fb4d2df95a43d07ef9d4b9339e2475eea26611fe95f2b256d7e1910313c0a70bc6d4122e6febe4d5d3ee89a35fb027bd73ce25e445928d130c0d1d55f706afc60c743c9e681aac86b6ac4b45015e7a4eecaf626656cc4b4f4df29e315e6242963b8818533a7ac0a754dfc8e2b3cd0145bd4a3822c1b4c04663d65e9a76af540c30b6f1313b73823054dcfe2ae41f08cdc15a9fdc9318f7857c840adb0d614e151c875c59347967411034ef7d3038fc1db8df5b0017270b476cb11e30d6530cc7b19469c0e683bcf1d913c1ac5fec96edaa5a79e817f9cf40489f1117d2e66b9165873e501c32c5fa40de51d685a56557f090476963f044cc7cf94ff11098d318a705044a26e1061924cf7e25b6af094777c45b56d6b072e792b45d5592290b62c7f3d5e7b078e5b99031f6bba961c87e6475eefee432024a4d3828d4c107c51d6300360f458f8d6b4c5e796d6a1f99bc93667e2f7e6e9df19608e21a70fff1f470657ae1585657f50ae158b3087d2271ecc5df57d55a5a5c4b78e617f463847d41231cea6cc4dd1c53f6eb514b153455cd6d6a02b06316831ba4752f09", "00", 0, -846030359, 0, "a4d32c8781d531cfd5ec5178867f341965f25725e91288376688e6b04a03868d"], - ["1086832503cc484bbfad24b79df774fbe66b539d6e8f54ea6b4aae52657f54d3612d5732060100000007acac6a51656a5220f2acb80bf6827c798c812a10290eee7b8cc5a12ccda7b8b3bb73bd55aa70913e60ab5b010000000853ac525353515163ffffffff2e51cf5c429652d69af4042766b070c391e3fae48e50ec7a4ae84016ba8dd75302000000060051536a6a53b4c1a41104fba00c040000000003635163b9a885040000000002ac650e63f5030000000008635263516351536a940cb2020000000007526352536a655200000000029d504500000000000000000000000000588632072168bb6a67513ed4a9acb9157b36751b692c7f40dca64e1f7d2f47832b9d0898c940ae66044d73b6bb6742d1fdc082fcb68be8563043f7977ccb68dcead481c327fbaf4fdb862f5ec5cf30a870094383308c67e07935f9de4dd4bb90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b0150944e4d8286dcbbc86a4c1cf9af09e28b5a6b4e0c80f690ce0b419ebea0947c12d4591c47c1dce25dbb2994d3666b6b2cd4b3ca6880691df5799111f7f750e706dc3f89595fff7ee3cf6e1bde4f45b97486a333aadee7aa35eb55c6f8b9d1a4f40708fa802c93bd5eec3638b75dca23093810c63f56c0f81f71e0d90ad402026cceae18e00b6f8243f90b06faecfe52bd0005616f5628e8885ecc36ebc58a0228b9a986c204e0c53c33b995dc2517a6abe217d2b6d7ce47aedfc182d420926f0b082e16d21a12d0518c9ada0b993ed0b0506bf1e35a641cc3f821ccc041fe4d10033f15a151c7504af60df51ddd9436c79a3ed305cbf766023ca1b88a1ae84d56030cb4fc8243b79514a6544fd6bd64db0ef8018eaa1a5844c7f10749c6afd139de0321d72d4f6c32eff9bbf7d3e4f0623837982eccf16e54a539e21ef0a281d98928032ae5828ca53261e88eb3f6646051d1cc101b97fea2ce467cf1a9c2d59bdb9207032dae7b0ec0d79b8136814bccbd578331d8fed464d1de7b871547537e5120665d022947e36106dcdb9c1f9c1d99e70c64703b9357d545cb776b02b3933ad312bcba35b5ca3bd3c70284c42b5b53da563d7429cdfe84a6791b120ada86395ab571c2641fb9662a8f15817ff1c68ec0d74ba23278c5dc01c076a87f37c8aa2e163dae19b683c834a2a7ec697b4fcb24acdffdd762c22a0c51ccf7231e4675bd20ca856d6e18fb42141809e1752085faa1a804f1f8493990e80ede43a0df88ccf7371798d80920836bc0cbbdf7490143d002cb01a585009276478eb804b651f250a37fa5a62d41e086e18cf2b13726d6ac972451bc495a3ee5d7a6d9c96cbe792b2632f80a9aa8a2f4e195f953bc0c008bed4a68588f270bef20f67d44373b96187f01bad95761a71df611ffe0063241750e9e9ba42bce3783162f456cfcc075b785642058da2349189d4e249d2d43322eb15f6b6919dd78593a67b43793a4faae96160cfeea38a15222c7d65f6f02d043463e41e580f00ca9733244e076a984b10a74d759c806b91342d71183d10cb84723bc5a7a75a243863c44cac776464ee4edf39cee7e350093badbd8b047e6db8a83c51009c9919d258892954c82db26db828dc7ea6a1e88536b97f8fa28f4ec745f727cef85b5b7744a5807e4a58e1fa2cea86c110af59548e9b0fe231a6b3c8e5879f1eeddcab76790b7f983a101733d6c30f28969a7448ae1c2d3115f80fbf3cdc1ca677dbfa3c07bceda658a34a8ccc4d2ffc51535eb9f1598e70ece001b33de11f475f700ea9100c3e5589a35b42e5cbb8e03f9c9ac437fcc0c66d7d37336d7b40bdae8d5a18ebb205b5a71e3beb67da90d5ca16c2c021a31910c8efae62ece2abf1812dabc25f3354ec23c04fa8d4c34ca2825cef1fd9e025fbdddda3bb25aa828500fccfa8642f0adc596f8a340b734b412e51eff189d4c0965b1f2f57428ed8339be8d54593a12fb168a462070a251fd37edc20001fd6d4d5bfdf9a6994144e0e87d7afb35ec900a4e80767666ebdd19c4cc26b459a908923b3fcc4607d75e6c821e5d1498c9e8bac315cd72429e7c9a260efebc09496349bf9b0f25ea283a4f189df1c84e3251079e0a5527ebf228b34f14de6ee9f51e12888bacf23aa6c6905881a60162a2bd8f2e2b9347058c5d6425302ee8c7695115adc963a4ce8c14bab21be1124ffeaa71de1bfe3d046adcfb6a6eb0d51a15b1d878e92200b2c64440c8720f7f5eb932e9852511b567a8b75abd2ac9473e88b65e776330b74b84f39372e1aac4a9aa85e244b6edac7e33e67e2950930712892b1f5823516cef6e1ddb02d33f81b98149cb6a1ccf87b2ecdc4f1b0b4eb9871d8c0235fbb43a9fb1c050eddaee55731304fc3b2f66c33233e5edb1d0a5828384727fefe4d8a9e9db03e24ba0ebdc8721ab597d658254fa33ddba7ff513dc958acdf3344cc9f6a2d344ad4e5b6f1a6863a76443aa5bbc5846ab0d7d1906da1c1a4f2d5a51dc992123255fb6de3e1d947a6d2dc532eee75b56dc625133ba1ec9023169d5f23347913e98bc6d0f9d689e6302cb39f0a8b4f8c29aa9cf22894de07dda83e729cee3a9df991c24a2cb1b7ad800382586db99fc9557356fb87fcf5db65184c06f5e92139d1b722b30d1cd7ce4e57c5eaeb112beda3b92deded917a316b729abc8010940b84bf56517432657d95a719a1a43836adf47489722e91bd8709c0481f74e59a7d7b04d642e9f03e3e4a1a8625aef974d91f29213f7be486a8485f2055b79e696ba8632d100000000000000007c42a4000000000061f27e9c899910d6a74ce4295df0294592a88c972f607829200e0a3e8a972986a7fa1717a1401ed4dcfa625305f6290ddff58ae46c8d1d5e6a054e25614ef5cda63627d5cef00875b3b8ce2d6e4955380c5a61f9316284ac94c12bfc8f689c9500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ea3afef520ffcde0429b47a815e1ea4126df02e6c5efe24332edbf63ccb3da50e277dd8df5a3faa0b12574faa9113ca4210ce1e94603d0f2bb93ecf5326ac11ddc54862c39f9da1cf82a1685f66fef99721f2780657d30713f5a3de2886d84e4b031e806e67c56a509d5386b5d9d001ed1370d2f8bb63bb01fcc73c95f812bbb031aa0dac2b8d8ca6413f6b1f0a1c6e8acb01a99b2344ce93c204cb218eb27ef08032c3bc5e051b5c7d5573348fa7c6d7b6feffee7679cb44c62a8461c5a8282b1800a050ff231f1a2b16c134525d9d7b883a88c7064879208354aa8fbba3f5a8a46a380113e05e396b6b0a298a941306439fe49cb9ad956ccb48a969cdfdea0197a68021ddf4903c2722f8dddc28a6933875dcd7c3211f779308a1d85c20f6b9c093fd3021f4028f8182bc942c20b4757a676d421916fce1d27c35411c7727ccbb45eae7d03055fdad769383b38358e5982bdf5c200e9f54fe8bc97fa77a78653bedd043b1c02295f53e0846cfbf6e709d803cd67b64ad96a6f64b00f2011a677d5cb262d07100305734c62448e1493da24ddd14aadc2ff7f2960c4f65500c15d35f0db510449d6ddd757a9981eab903d0f1883d4ff79455f826a1da05e5f636eb0900a89eb37a94ffe718dfc6a281727489be759b776658a225c395ef4ec95b6ba1200487710350ff8a74ac583be2150a0e7c970f97c4a2e155e8372a6fab0cf9cf9bae234bbe82f36bd4b9743ec8e68d2acee370d71a83f7f1ac9832b0ef2944fce453d873417cf03a620a052c3d73cc41a155d69cd209b3b823e6026eb2739426d26612cf59682a762ef7ad97bff8d77c92ae5ac104070389afc67d82790326c61431e11d218e21d81f5cb9b62917389a72702436e14fe56e121f74cdeef0e74c71b5198f9adffb416259ab84705a768e0d5c86efb679c0f2a61c5907c09f8da1958f6208f6a8355d1be0f78b5f87dce4d91e15fdf44c6a02ad1d0a8479b8a7a5546ee24d4a026a210d436e932e95e19cc14ac7a04b95d32ab3b4efac007c3237005244d4b6f4ea041fcac67aa9258ecf91bf74931d23c497e634b2233198d5f4362a15b90365579a85505347953496eb6ec5860dc3afbf40a63477845430068c7482d462c05d041ea40b0f23b34f55a17a0d242a82211b3e523fe73be8f587f20f6ab5a82d48a420003284886a8fc2cde7aa0277737b9ee0446ac3c976e18f30d8df1ff7badf99091816c4b68f1c3f52285207eb34cdc5802eb81e2fa616125498cee5d799f13134fa465d1c508e03629f13956d377d31cb77bc9883b26320cf5c99a772d3483e852630895c8045c96f25ee73b910b81eceea712f5ace8dd7d135764ae499422bba9d10b70b5baca4ed6bc525324a9c3410d9d23405c4b4be7c79443d95e52f7ad4cb73f9a743f14772b06e5ac4ce383088f05da550858011306f5bbf711ed2e4be25f81fa602079c5184df79a6db748d7c1d302ace63ce11b11ba3f042467d988639b4f4cda3a1e20e62833790b88e4af1eedaafba3d40b0793c9c4ded0c2a92dff780eb63c4afcc98ef01637f326134694407a906a59ef882c5b197f1cc3e7a249c27965afcfe4f2a552c1a05227dde0c933e9e562a4df2145cac1ef93090a48eaa19a097fbe3020325505f2664af1290284e6a39d091ee2b1669c4d9693d49524fe5081e554b50c89642d44d81a22590e6eca870c5228d7e08973e422e9cd4f048229d0833b9409f463a7ca3b51d865f63f8642c323a888c3145282da5d4743f3e4efc74e565f920916b91e703466d1eab1e03a3c98cbd0c62f147201a7ac1ec9683cd8e30ca8307e357f6a9141ef564bc79fa7952cd05d1f316d41ca6f536e69e16a161a75f336fc9a69aacaff0fd4f817cea0af813a890144b8856c6c5579cbf2483d56b29bcf7d31c2a70db669534c02a9cc1b725bd375204908d552e90a777b5b1e92d1bc6a7d1c3cf219ed3a2692dd924692c48127fb2e32ae3a4ddc0680d0ada553acac409e40022b5b9e26865a62fb5b57d7de5f0655d55e9fba2a1bee5a842e3983eedf1b6bf5e3ead7387b05f98af59899f7722310f0eebfb67acade3bc99c6ce1ee4be4a27e76ad8abafebc130bbfc8a629e87a3eee9ae813bae61c69fd1f3ba90b4063ea2078779e9b3886d1693c07c84f5019eb731480eeca23cfc59e9bf1eab2876de66283dc8d4527f415bb44cd53b802710e25b042f0b538d8bf5943e19715bb174e3ed2dab79df4de2070d800a0febbb39785ecc7d925713e647856abab20154f46e06192031df07ea4b711bdc6c92431de6b7ce2c6028886722f4fadfd601c6e6be5d0faadae6480ef00a79452580f1b7d22ee68f820723f1a08e9a15e06f80fff0b01b69e6f4a652b2f94fb80c5d59937e4cabb191f815d07d1e974cfffff3fc15cb72392a905", "", 1, 328143003, 1537743641, "28067cad4f31b94926333d0a6b5e357f4a1254c23c5bc789eaa52bdb53f87cb3"], - ["3e1c4f270353d7f808348eb0826cf46d86572f12bdd00f691c9a0446e157abc9e213ef0de30300000000ffffffff2b399b7e8c4d20ea298a3e7830f8f539a81a52a5a9bb43f361054cb207a49fc80000000000a35ab7fe9f84685198dd2a214c597d1f7eb5c6ffc8ec822cfe13577005d74ef2b91b3545020000000353520054111c06031b76f702000000000100df8abf01000000000152f25ff50100000000035251516fd64cc70355999d0200000000000000000000000020a9d11b7c0876cd53fc603d8a12f3d8db3c852c51df74c3b985b4d13dbabc72a380a37b4b9a7222ef2ac574266c019a540469098ccbc4b94d864e906c838918cc1d4d2525db3f45c0bf62bea7482aa24b6ec3fea7d1aec956167b8fa62e07850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016ee424b14346ef4223b8b572fec91eb2de0b05615afea16da283261d768d0d135c49d1a7cdabaac241b1060bae2e66620422f00957f7a5ab5e4267dc361238fc0d917fea178ab95a5c19beaef6158fd0ef7bb57685c8fe6e1ad481ff45dbbbfedcf5b0eb843d3f84ce03c5b90823ba51b17aa9533bcd6859167e3a49c5cb3e4032744f688c843921bde0441cd7206dc2483f2a9b75aa48331e81bff5bcec27d60030a60a61b91a0000785afb626e02c9d409ed5d0d3102ad3458ebf7f9460b1c59f0b08a99e603ae6a739a4ab52705c5dc1a3c768f5f9c736485df6f6683a5a27c9bd71d237d92f87b4b732c74ce44e697c3a6279966a414212a33aab15a69a2de535022e277f44e0aa6eae5b26d3eeefd2e87f6a3596cc0fb2b4df7d8d60d216136140020e2f2e121495e01c6e4d2321ea407f4b29ec8afd86e3bc8099c874d02bae3fc00222141d0fca6716ae55ab0aebf4e57be7c2010c6cccda9e68c70ee7d2b25c90800202d264bf1d9bb07433c7ca2784bb43ddba17c24e3e6a966808fa1781ea6eb55b0228945d0a3d13b6a8e21b6dc59d4d930bcd2acf59c72140ab374dd5b5bc982a8acecbf02565069bef50e1a4a9f5c7267a50ce8d81faedc78eda1ade88487c91433314a1ff3a27b614c5294e16cc274ac0633e564e9d785d98c421b02fadf6f5c6c82e9fcdb5d8eb0587d5a9e8c5e673e4a8aa8c833fa6aeb24e175bf3c65daf4fa67644a10dbe375a457ae92a13ae13cf1b7a9670f495683829d7217a0547bf6606313b8011d08dc3775abcb6d71e874b8abc768d199b3fd26a4173206381712b28ad55c80d2cd0196a712aab9d8141bd4a998f2bd46370f4bc06bad45299f64488a4aef2a26b0d1039644110fb246a2d628bc920c517ecb37c46aea4d1213b166d06ac8dec8fbb71902bab779af9b78ba569091b8932139a239e67d10cfd93e457acb8b206092ff2739c111e639c531d818496ef75cd0ef0a7233a85724d426315f0bf5bcde91c2c1e30751cf03764c965355678a063de8efcd9e63dae0c464e615425a20dfb31b46ff9cb0dd30f87122b9ceed8547f6a15150056309bf1df8cb819c63754613a71d2347fbc2585dbe428bfdae441c98c5e17a594dae06a113c1b126721febc2179e7ebb2e1ea20e3a938f14c85f8544422d3a4e8d12816d6cc717646e65a2b2521411330af24e3e38fd6a26760244df1806fa06d9e594660a39e89f61d8296e204bec41f56c2683919fb77dcafa35b9bb036a1c3eb663b145758be101ca39f048b148fdbd406f3e0d4dd01b78ecc0a27baa9c6b0e760a32d512040e0ab3e56b6b1461a321fe0d26c3afca479e8023269723915778bf279e6f61a6e91fe377f37d4b41d6788972ba26c697da0a7a70a457f62c6b8eb74ce2443e373a09ddb7681cfc8bd9ba8b0d81b3382a63b0e26730b5424d754e3466be70cec082f383f1b51bc11ff5478ce9e39b12ee39eb38d6c115d8987ced46e4ba3c0ca29147c1e91ea32dab39c5e4923ff00b86dac173d15bad15bb5e5312cd1f75e84e6f1f1809bdad13e7dfb390cc311c57f1ca3b74f315b5ed8dab8caf773ef64d670a1a5fbda745416dbfa92b4c8865fd48b61d68e1d75249274fa28454a7da83dc8d42c1c9e802badcccbf5fe530dbe720296c718d07ae9b2cbf1d786c006814b8af39fb245e87fa1a6245e71c34b581daa6c87f981f21c7808b5b203615d525647bf01b87740343082ffad8346132e0e9368303dda78cc88ab9d8f743fe067aabf62340b22c2bff05725fd7263a4b8501e91bac73d4b2a49eda9c954f1d7edbedac6adcf6f2658f6ab76d828ea1185d00f063746a8c3f7521a7b639b4d12f9979a23e646f2f12294372a4fb3a7e653c9a9ac82ca85865a8dc5232341e72711a6dd330189ef687a3ef0005d9aae5ebf27e21eb978364642c2f37a964186dd40e8f19648ad4febba4b25cad38eb1ee3137ca601fdc8fd5f3a503ea210b17178654eea962b3be7f46a83dad2c84db01c7a214e043086b3e2ba7d625a8eb89d283f13bd536341b373e184eb2d292789b127678e0221de82226f0248edab1e7cc52bacda4bbdf07cfca55330f308c9af89c9afc29506837d9a58cad05301a0aa1bf75960a8308c67133782cfb61c8234a5d17d46493cb4f821102eea03130c116268044ea9b21939229cacbed221bd987e33c42e937787521bca5fdd3968b1eeaf4bf4446de84b4ebf2dcc2576e6ffd6c5a5e29268fd7c219daa4d4258f583056df1e97d6f308829fbe74808d08ec9d4f8cc62c000000000000000093c51d010000000000a986a67cbd9e8275469a059c3e6a7e205aad47ed5485d0f3c6ea923a65c2fc0a99cc8cdb2dfbeca06dbc148d8d26c7db5a555c1d8e5880058df8a9772ec5b583606e46dfb80efd134842a57d2212d95a1b88665c9290fa7664c6437aff8d0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e2abb1024fd696c05d70174d4eacdbc6a2a49f8c7e9d28d37838243693de94d007aab6383488a8bb2deb447f774bba6b8ccb758004268931a09c07c278e78f1a70c412a64a454a03e96858f25f8e9f02efc37c17aa7cdc059074926f7f3679f56342cd537f2aa05eaa86800be23847338318901f2e5b487c51192479a5e584f4030143ee5227e01b8fabd69b09d7916999d3fa4f602cbb3d5ff1f2301278944eab021e7b5ed38ae7767b49fe86151f806d6b4e03a4a31bd8845a9afa580acad7e8cf0a08aa440f21ed9ded99e41f2548491141e8670c5cf8206ded4f71a480c4e46c94baefea26c6799229617253febd6c1e5039da9ff102aca44c9982a1535534d6050306b6815b762d9a67a81abfd0c360407545383c922a8391782de9ea7c5fdd7a8902293259725ce1d76898e5b37e897a1193312f294c1891f610d3aa75c209151d38031af4f454c48aa9ad614d04d0ab2ebbbedbdfb85e8dc8fcc7a1ed6c3d10f4f37603014147dba63f636d6f304b79d058dbdd2e710eb2d37c5fa6132a4f86a408d750032594dd9c7b54c7699dfdc339d057fecd7ebafe9a5e01e82b52aa067f3e47b9271823365a4f20088a50c29dc8d247af55cb32da8311973032ad62b45b8a27e22eca0362e5b8cb4898808028754b53f2fdf498c91315c930ccf1fea3a8622d1643fa99bddc62126c3b9fd89e2b286e541d20fd926ae5e37104fd31d99f3d6f01e3b470466e32dd81c2d8f17ee5b3cc7d84f6bec473daf9a595b8c3f3fc0781efb3121b316a6cd1ed5e5bbddb062349336130daacd9b03530574d1b7eca5dee427dafd14f3e738351cee099adeae69e95f758608bde90441968ec36efd870d52e85c2e91b02793a12bbb10b422afa7d16ae290ad4257a63b7401ffee761d0b2807dd3941b03f14da1a6ce2d4a2f9c870e30458cdf9749b9fc113a032813f12f101a9ecf145d6d51d8a1bd1fcb58b52b4c2060fa425a6d26ac620882bdefcaa20eab89af6f03948dbe001441877d6ce8410c011a95f0de16fd631292d7025760d35cb911cc4cbe6a5598d21d1a2c5eebd364326d599cc4a0884b4fa6b46aabe83d08adf5d0e471a611b1d3ff031aeb3194183d648badb897dde9dc67740f878d21b1f0dab8b5ae18fb03e10893a73e709be5ba738b3bbc39daf83ee069493911345a8fc88585d8abfd769bc6536f276f59820fcb5735bb587e58fd8675850e2570857b2dce42b1191e7605689991ebb3cc505879ebedcab3631666b5422a1b454ba36e93bda6fe7f4b0265789c01e9182690b94fc8f54767d6689677f6b0051ba2af9dd72710b5418902e701d0d1bdd74bda9426b8fad43a349b6e72da87fa3340c71d8b7d3dbe76a9162976b77810552c36a38b6a4617787740305a3f0839be8e545e59ce392404d90cd03dd315aa2be9b21df8eafea368875b5472be0cbde326bcc2fccab96fff30a9b884d1690b86b7a6d57bd8451462b5ba6cef9128efc91ee2007af008c7a4889ad354c8667e5a62b783803dbea8beb903511b109256187654d5ff15bfc612b7d99d82f7f7563c7fb2731db845442932869aedd8f5ea60c2aed8b3bacdca4eb6d14876592acd0413f88e66c8724ef2636653c1431a501546dafc907fd6002cd8117c4b0a17264f7df3dcb21ca8a135f588f61c6ea9c10049fa6d1b5e1ef4e17d706fd1de52b8d417f986bfe8c7c6163052217191e872a28ee2b3248a235c98f56fa619c056c654a307c299c38a22ef7d8f74ee0993c2c855d048a57ce24d9ea35649d95bb000c3abc1b3af312fe195789988715a4f39f46a1a9368746d2dd85b5359a623d38d7c533bd48e56d70bf511f35826a9548e61aa76098b9f43ea731073177aa73b3849a300d456ffb9c147632b07db38fae46c8d905e5557f2b3d8c17b85d3998ac1564050d8f8dbdde2022baa95c4dea19c480290e179fe5611ec5373810fd78fc26417a2e55589015d38713092b69c77389a5f869d920aa4e039332955aa687367ac594a8195a3d77fdfde49c94ff052b03c25a9776215e7d0e302f9e5d9c0ea384754ed010334d86f8abe5c09e8b85a37d07a675bad2b9111f0434d6cbee8e66af4b35aa1eff1f567ad1d0263275fc48447cba8c6d108cc346b5a0d4dc78e485886917ce9a6c26a036a76a47063156313e0774638da17913a3570d5f95137cc01f0f15d3455ddedb3220ad05300bc2a2b4a2311c62d72dbeebc12209eca3d67b76ad0867b9a4a8048a36f2030ded8c9fcdbe4460819c4aa6e9f67f203b31b21c080e5cc34d8ddcfcf03000000000000000000000000c91384159c9fc2b09769610aea4da3ef85e0320fc580f618308f2be2c87ac6d92b379fb8687cfb326d13615bb92793e947cd8a1ec265c4d0fe8a549392aee0e29fc103267057faab408332ecd0ccf8868021feb5dd3e2c5206309846f0fa75ac0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007922c90e2f1150765e457435828fa03fcefc7b371075e57401a3f0440168692d8548b7c23988ba2b0626967af0b86694bea6e12ccc9e073bd0638672fb74c510cffc13f807d716fce2a408b27498f3c9121325a9bb492e2186c6abd9e36cd3d4215b6b66f20adb0981e4304e8175f1a73731b5e300ec2e0cf7441b426ac7747020f1c5180425eebf5bcacfc5c6619461b869a083f5059b285d7dfb144310bab7d0317b5ae249cd32c2c586e3d4beea82d681020be9bf6c8b67694e5cdebb5c0db930b0457e2966280b2bb3e959d2cd6c0ae1f1a05f7725a7130314de9ae241cd95c1c41cb15d9484bfdc59c5c93a36bceff5bdd16dcca8ab6d8ce9bb713822f4c65030215c53a90bee98d70ddca370432bfea9fdf898cc6a4f884f00580dcf44d553d27032788033afc6752290b6780a41b5828a4f63596bca1a3887856355a20d33f3345030ca588f2cc64f5c5723e45d3c0bd5fb4ff46f86efc805333b92bdfd929e321b702259f9c13da2fbec59cd55fe7f57532fd336b5bfccf0a4587c9f9d630de7ae0ce020a183ac5c66fcfb88c4bb646caf0ff645c624fdb33a78780bb206f20611de2bb0d791d3012b83973364bb4b22cbac8c9c33544cc27d0c0141e5f3a266dd6687aee0d77332dbe175b506950bf877976768ced2e0617e4e87b211be14ca5c13b12c47a8decb1d38f7408a00e81b051cbadde17c58041e0ae8f21df2c717c479a2c2fbdd1cf6a010f904a4a23080e562d2632a2b72e39435d0fd3fe426d16d2d0455c8b39e4e6efc38e53f61a9037d28b7bd53aa465a293e2136604d109970fa55de61d4942da43824664a9a09ee96b8ef48b7c5aa40ed0a8e607bd1cdcf226a0e24164884714f48307b42e2864ec257a65c87514985c359f7c26acda55f1d6cd2cc0aadb3de81746fcbd345a4c995d626488c71d0897eaec78b7729ceb51fa6f675baaeaae8d746cb86377e922c9342ec29319852447bf16fd61fc3ef7386da20e29d03d0ed21802d9a772f9debb666141839b4c80d0f99d9498747d781468d455887eff2bc8bb7f177da9c11446d5d26f67e2c405575a4dd456882c9f22c2af63c2522f9632ebbadbf08ce19a1b91d40f7a25668884f1ad7ad6b43ff91349e299b568fdf5d48b8ac14b6c61fddbc66b9bceff3ba6d228dff8fadb944ce0072e8c718b88363fadf537e8f0d7f4523ca336b78a1534fb851c8d05889aa6fd39933e673ae15fcd41d06fe24103ceecdf13c1a06617fa0aaf2bc1915e844a5eff5859e46aceec623047d1da2109ae47125eb68bb12cb678334ae85da6631fb1d2eb936121c750adaaeb6191c686c41c77c2ea4a1b2e93a91851067d75d211685a0b4afccff7b013c778cbee9af1a383ed576c9b0b04edfb1355d31a634b13ce52b0e695030b6c065f17eb3e6ed30c8b2efe8bdfdc0f833e1faaaed24cd103b399ba7fae7ac06e920d43e4fcef365ecb3bd441629cc11486a56d54a7700250dad9afc4f24200b0149ccc2f88a8d34ae3e9f94a1f9c326d9689f8341146337cfac49e4b5212b9d8ac51738bf6249ebee29ef977e7fded5eefc4cfa3546b8fbe75a1ffc36a5cdf99d8c5bb667a1281078692119f793c9487b83e6d95d86a67824419b658c2b2e23d6ea84b8648a103bc3d64378198198df7b2fb34be62967b41710c1be4f7b6c9631618de397f4dd00ff68ff336fbbd02a260c0e587aa45fec01a367160aaa98f40adc1d6d4995dc65ed2627350f7480fcc7dd509510b63b40fded83b0c80cafe33c37e2d72d61a0fa79b11142bb451a7ab0aac4bfb2786fbd571af51aad7ae296b0b83bb4f3b61b0b423ae199942630d6a373b12f4c35d63c22627e1db687130c797e2a7ac0b8396367e57dac92f194014fd9dfc861602953b1ac21029db74f6df7c8214df27d6d3ad548c6e3720a3fcad005157246afae7a3c8a84b2b452909a7af3084437bad968a5eb9bcee9a9e147345dcf3e9a9b78be663eacf05d28ef75f00a4d07fbfda483894efd9646b907fb48f57726358050556afecc7ffde6f9e6c9d81ca278b6d7fa174a4b5cb5d4f40ffbeccd93b9f4bc9d7f28d2c89625abedc8ea60c43a9df329b4d0005dc938ea3d06e20c04994375f68a018c00e5f80bc7b46223095c576341a7fbf4628b3e18f62fbc7184f1723a980a9ac6c46e5b6d6e4ab45d2833333226275cb0b036802daff08d81afe33ad33745acc7c435899d870f018750f3b524a073c760d3c97425e3a4c73301956914d11f38b9f12be49943f6efff41bb50116518a0e70ba89822d1baea6824fa2135e098265045055aba60bc8ba0e19ee617161227d885050b1234952cab0e0aa4e7c90377cb01b210e55acf54dbdf88e287c3a688e1b33a1492f65c94263b4a4715fb18266bec417bd330857af7d02553b25f50aaeadface0b", "ac51636a63ac6a536a", 0, 1454564863, 0, "65e5710dd5613601e4662aa1d7ba57831de397a8582067852ec9a863789ad783"], - ["030000807082c403036021d0741c4ceb4e0a2af4815d20c5f121ef7de992d7f58f94d4290a309def0a0200000008656a515251005153ffffffffd9608160ff33bb6aa34a25fa4a72ee4d0ba75293e09896d584c91dab86ac86fb0200000008530052656363516affffffffd9d070cc0174c3e6f14377b90cf38d3cf4bf99bad87e774b103277684577b36400000000020051ffffffff02cdb0690300000000096563536a5100535300337bdd0300000000046a63525263920784ce739cfe0300000000000000002b5c2f00000000004ece0d938657ae79729989ddc6129fc46c8f149a1b09e4b344d310b09b436478dc759fa1f85961fda7fa55b071465aba9d95c198eb132fc8a75e8cdacea58aa142ed1d3eda823d82438f0deebc18904c12447e1ebaf5583b239a7ad18f2de91300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000432148846547d5caaf2eb28131b8fbb69a980b42b167c2f1cfe3cd1c14710df5dd5c394af2630d725291c9d8080ffe066627c4c42b8a2919d462b807a0c4743e1524636371c3593fe53adf42717a1a675e36d45fe1e85facbbac40cae6bd96bebecc6f984811efba07548e226e727958407ffceb66327be0127f6611de76e0e10229a27431288168bd2cd87698dce93d6c07765319d83edeeaf25f2127a00cba5a0203c9d5182d66b4124708ade671149f614bbe62e08d7ca8b41bec9979a491c7c70a0178565ab77428eb73462ce0680eb988c01bd7d28b2f7c0c925cf31e23d64bc7c81c5dd3c5ccac3d0a013eee95e1506ac3f96e36c4f27b9c30b1347f28f15417021d217830a53a84bc425c6a9d5424e83fd7ce8ddfc07637e2aae67f542bedc87103057061f43cb1f124566417e179d15faf29291882e0ec7fbd3cbf27eebba43b0e0201cad47475aa3d0377d8cbae36d3a98726163bb35068394826c995e05dd4915702173aa3e5f43154186bf0b03f7094cd8f7aaa7758c168b18f23a5063a4db3fabf0314de9f3a6302c636b3d3591ef2ca02ecb0203e8c7448145252655a8b073f0bae03bcc76d01713054b2197c0eb7fa496541e7003242fdad85b3e0daa4a6fc96d3da0bba39f16a8b437c4ab50f9026acc0c793c8d67f88344cca8ef62a418a77098bb315a98ab1081caad0b94248dce96b4edd770e7a36f2327f489a0cc1375ef943a86da9a1c8db115bcffb027ebb66170bbafc0ff41ab718f584b231c9526dbfef83308d3e27ddd584a7b91e2972abdd2cdc0a4cd8505b160c86dc583e051bf67420441a75a73c3c1c130360e7ffefbd2f71e62f0c302aba87b79bfc3246a369b5313fb713433aaca7b308dd5f96eff0db393c0dbfab899e2fdb3c2bd9d77b9823bf4f66fd1bbdb5d59eb67e978d0ff9e5ab098427f46f36a98d3e34cdc930a5d1071b5c8681dcc83078b37f491edb4910b66e8ce26e8e9f51caef185c581408948a7a516ffaef3b4418cf4908ddbc7cfbedbbb3a90890179f0b6585e21a3358056bf714bde81b5e88022a4c876baa4a8d0cabe62ac7dc5704397654aea3dd10d18d37a03c2b9563d73d3a0e72c75884c246cca8e9f86944a93ede6ed24209b011feab0e643773fae834a7deaa015029c45f026f3a5fc4140e474da0523ab48e90a7b1d7fc78272e5c0220133ea6349731a73072bf2997cc433a82fb350812d22c7547c47037145e604f5c29d8b1ce91bd1d4394a2bcd44ac08ed44833f9ac28add24410b231d0a3f2f989cf88f75ecec716166ab0efe4fc45b2a16da2b74f626b687b44a4a1e6a38834ce96e4e3f432c30ad93624d6267708d54bcab9f80c4ef4c4b302c246b82a327977a94015f228fcc3eaeb7587322a354fed2e1104ac0737e508dc8831b506bb1b8328125c692f011438b4beca9ee29832cd789f3b8d9890f6d0621876a6af2da58b926fa78212da57e99571ae0dee57002ce8c3605cd595cc1c792ef556758fc2dcb20b981736d16889c2988de67518590ea4790e194f7b58b130ce96df795aac3ee00c5b75b6abbd69c1c77e2bf8bb79f1157f499726af0c70fb016d4ba1424ea41edd357e307c808f4024ed8abe51a58d8949d862d7fba53aaa7df58bbb1ef04e5a0d0675c7168b878d5f9f3eafd78e7042f009f4ea562f29c5bb8cb58ace2e70e2177f3b13ca3a67f9d90ef933f14b3fb6e967b3cbc7cc4905c3fc5afe7323e551665d6ca868a4961f0acc844a8dd0b257852466e2e0c086ab04de5546e52794112ef5b7049749a5067c4a7dfdc8676d65ac15d8fc8cc5a130f328dfc57d206e3320e4a9865656d5719b5cd029d01eaaaf5bb1cac47e52617a8661aee73cd3125ab343e2eadbd76ca27847561a394fb7106c8517456cd67384b6ab0d0402af3d24189a2867f398d927ee25ccb2565f455b5f5341f12e8c1f15dd251efca17477c057e2277d8a544429e3ec9215e83936a61d638a3fabb061879b7f18d3579c91fa217e303d1ed2a41c7a0faf3241156c2baef63b234caa8ed25158898fcab89ce956ff34819c7114b05c615a2987816498bbad34a0d513a0edee514f3837656dcbacf301044cfd97cfef3cd54e180605c28dc18b0c8772729ce0fc516f1110094c0387ee7607aa89d9a55c47f4d6bb51be39ce9395f69d0f16039bfe6963512d447793d2f3c33708bd65ef4fda33d15a1765e7b871d34f108eb4ae81cb47917a3f933348d2aa2928da3133c6d011ffc648d19dbc34ee9f262c87692fbd1356ba1d1f9af4229a0d000000000000000033418903000000005257327b664561e8facd0334129f501c167cd33544418d1b76ad75d61f6163a1a6abc008ae53643e0d5a0cb783234064dea3d803bd1b754d17017b63b444e6262f2a8a91cfc43c809e1d3d8989fd886f7d424a7b0b45615e2a15f6aca502dc0f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077f3126482733af081840447534124b62a8c897a717803a8aa99dcd9fa7d53f8b4a52d18e73154d0e35dc27b3acce9fbcff849807f7908eb5dacd01c7e22d736ee1cb1b32cf780c3715a3111b55c894967f37f28d02fb25089ed21bd636b8a65f524d14508a05c4cb6cdd8a93b503f366f529c1a5863bfc5d60627807b03be110212821d09e830d6c8196298c8021876ca7a49293b761e4bef56998b196b828756032320566979b7e180d903edb1a5278626438abdd9873b581265290689569c56e60b032d95056be54fae5557b961157432302033b193fd603eeb7400fcea10642f50c019fb39d70d8d3194dbe173176b72ed1374786428a9bd230696c2e3d0127c0d020415ecb2d7eaf1f4530b0d53c910e20190f8993509a0b51599eb8224ef7979c70329122e85cff18efbf112f5dc5efbf818c5f67524a9b6aece17dfe72d59c259dd0324989ffebacd2bc4c9d158a08868d41baba4cd87eecd6cd9c0c184f755ba24ae022fb5280a19f4acef04a7d7417001679803efcaeb4dfe448e86ecc9e1cb54c2de030b67765c197e908f73ce71266caebd8e447e288692475126707d10f02e55b32eb81ca1ee388450ee5e7ee05e632bc9a3585bc75fc61925f500e62d83e2f3c664d39fc4abad92878dd54299fc130eab21b9bcda4b5c52a71b64f46872cc01e09612793b3b9b0e79ed2429451d547c3cc11716a958cce5da22b7091d984f3096b11953f59008d7e03be8b3d76bbe3f1f83cae29b8aeb8ce18c186afbede5b1b39ad940a9f43c62fb7fb4726a51e8b2476f12f9ea08f1c829a47d7798ef9bc190fd099076c510d608e50230e7e59cf95220f4e63c001c88492f4fe687dc777df4de019537ceeba01748a580629507619f81f27b55a8d6daf99d7bf59db43a0c13300de3e2045280950f992e36f34e7ea538cd7816f54dfb0e1f8d24681906431c8a0adf9b5c90609cd104b97786ccf9e9903e6d01c97c806d077085e27d39bde277b0425ee568bd4d09af65f52d20e6a96435cf94f1b5f085d6b8c3d777e3e1999cc887875ad48f12adfa414a1bef49385505d13a77f5b9672d93ddc4a4f73073f38e519cd361b043ce20dee7344c95fbb662a6224dbbb3403383344042be5baa9510b23fb06d82694a937474620c7dc28d7517c1c50816ef56e87ee71c0f69f734f6f65aceb68d710af6258d1eb825c56fa772fe07f532c91d85a003acbcdedb07d6dce7cba6875d90a034bda1971d9c8354fea301f6ab5aef3958edebe32b54f70e650990fec27a3fde89b037615f9f0b89ec1f25556854b6e49100bb17c6c61bf201813c896de45b5ccfc50e8f44238e4f1c0df9afe34ec1da8d8439ae310f4ada6818c64e699e51fd16b1538466ed1dedd033a0c52751c664c940adea4eaf7a60a42fae9d0168ce0f3b6fdbff8d5b03682dcbabf3342dbef0bb5cc425277621b555ac9c64d74c1acb3c5b85beae4318372593ffd588734b1c43b21391e3f3cbed109d39d50b6371d9917fe89e212bf94e451122ca002a1b0d87c9a7d5d782f1e3ae9eeca194274dfbff7240b88709f9c5c87c5658254600920e1ca9bc6c38c11734083bb74c56b0b93f2675c5a5128d570bf944ccce29bde5fa5af3df97bdc81a91eeccacc6b8001463066408f0e6d86c0c7f09fa469549feb414fe8bc3f861a8738b18b1942e8a5be8bbece9eebfa640951aa639667c563abd80051c65ca7fd950b27979d175586ef9ba47cb836ee6d5f50ef09c152c36d1572efb46ee86721cb0af650ab406f5ab90c21567a750a7c81126e3faf0d64598a59d132c279ba72bf14397feb9295109fc0d5c358c41d8226f19c2c56203bafe456cf933b13cc2eb96ede9fd295b8df44e814991ca339b3ae328eafc46c08bc6bb871b8c0c8a65ea589425efa9e7b6fc55259c1d291d284c16a9cf762345060119eddd9922779fb7d470805333b3a2419f6cb2a046b03b511535d8fddc5fa2356c702b8313ad97886d1203bcbd5abd732f4d3fac0ff66d5ca03485094405a2fadfa89ffea3e2242398ad2c8ca41066f05f03605140a17cc2e189e881c6759b0c395930de81a6b09ac8513b6db0a7a0fe6a8e1b595c10a04f9adac1e20c3104a4522efe4df688a692c493f1c4cabdef2a211ed56a5b5e8ce33275100e750fa48d756d1b482aefa89fa01b6505c8b4abdb5dbbbd02d8eeda88eea6848f2a87b413d0951d740842af6a6ec1a58ae8e352cc5a577ccfbdc9a187cffbf83feb29f7d6fb7f4f37159d1326a5d97831bd5af813d7ff7db0074aa326e36c475e0100000000000000000000000092415ca124f4477adf0260d9790b45ca9bff4c1db273a1c138730ad0fc53793cdd160bbecc2fc73954f3467514bb6ff06e85f8e4ef41e5ada957a22ccb1e0cccb95b00c8dc004f98a5badbb0b2c18ea01390e0e3a80655b559583112e1897000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006d4a345c12892b575cd264a0788bd6857e7d0719f21a0b6077c0f8586cca55f6b573580a8d433fe085d7006e9237fc6a8515a1b6ea07ded90d7533a32baf0468df75361ab8e04b507d82db69f89b04300d2eefb44a3a7ec34ccb600ccfe318a65708b1da34674d366f8d5cbff535417bf71749ec27d914cd72de524935298f010222e73d1de618cd4b4177d95e63c6eba57127e33bb1691f1eb8bc20a93354acbd020912349e0442c6b4bdfaec8473bedc015a7f245e1e23e9e7626f4b67b3d6c77b0a05176aae295707fed9f85488c46faaf88932bb6d1cf16861331a3e147cf9c2151c18bc599e9f9af18db577e3ec40eb7f1210058d5aaae606b621e2d833ba40e1021351a69b066e02b7dd10668c3faa5938f723784a41edc4370e01a881c7bca42a030678c70ab6c4988763c603c020bca6b97cc2467cc3ba87aad8f579d675814d9102249995d6a4ac497919dd724e18a3fa8dabbc711972972f591f552a90d7092769032271731c8717225ba0ba125260ae41758c83769be0cd6911f45eb4bca31928dc022ef05815b8bf3e532d93434027ef69d4002df44ffb17b6f528687fc42c5ff9dfaa630222f003b7da75942b525db76b3976a2919ef0262c475420718721ed7e67e2026954578bf24b61b8e47b20e3014c10b6b73d69fda374e8839c6b3009fe1345890f8b4602ec663f7b1d8f22d6d744e377ed96892afb5543bcb15cdcdb21364d97fc0fc5760da4bb3f1a554123404cc7538f422dab5e39c24de90e73cb123821335c45059240ef86e8cc067917cc84db2a78023dc274ad360d1b88590f4ebaa911e65340ecd8de1120a878133bfd315035dff0f429bf2aad433b356692e8013963a5b5fc2d27d15f9e31af7985b838e782c068a1ca0266cd6ab2127d26f741728f240c61cdadc2d65f3fb0d5a1ec11a0956287059378157e1be7a5dbd7aa4493518d348bc621e84fdab508c637f819a3b98c3e84d98afcfd74885bc64a41bd7c75a048af89a469964af722f9a70472b514863ff6c913aaa4167d55ed5bd1f6097e52a68797eefa29d0e4e73daf0f7407af8a99ff5f2c39732db219e4b1af90409dd12aed153d66e17932ae92db4f3db2f7c29398addcfd3b8fe77a435ddfa0421023cae329d0fc9d016df508afdab25373c6e14626aa14e85fa82e9bdc8204375c2adc927173d2189d072cbe2be4613334334dbb9a8fd93d60df80b76db954fe6805359b736894fbbdb9c7e5a27b99cb3f872062f7eb1a369574563e6b325c81315427b4ca914431468bcdb36cf17901a6b413f0f434d3a650ad7c0908337d5f5a26e8ada13d937a73fce3b70af4117a64d891a036b587007044d13725ce6f5440ae29e8524c0717c1ec89eaf278ee300a8ae519c9b27e9e07e757975392d3017c4bf16cb79a7168fa7ec0326919fcfb0735c73e34a48e1b8a337662ea7a71ecc76ce54301e1545a09cd2b0a117e0075b2cffbcbf4712eeba3db4f87aacd57e6759a3c12c2b2da98c139aef636f7ea027f1f5aa5c47ee4078691b54ce8c904b9f147dd1928c00643bdc0e03dda83a90175c954153fa7f249808aa7a6cdb902bddec81b769a82fc003125bc2e481589cb53f6d05245b3d7749e9de087e2ba646f8753a1ace27c8bbf86af7c59d5c575b6f473fbe5c235d958348fc0520ead54ff8d207e08d79d005fc3f4c919b4f20e6adb934635256b2c688133566ca81cf10c1d92859d04feb2d9aba1ca961349ca21bd819a851e8d01900adfe6f26a17459c8f6211f9196a03d75312b16d252d8575c87754983be9edca5d15b884e065fe557587a51c6420f712debe0622bb477f139ee547134b01a6a3eeb453d64e700908a517a5c30c43bb019c68a91ead2eb5d30d1397ba876cdde2f8818a044cda8bb925efa5d39c5c2c5e9f580ed8f9b6b2cc7380e2f22ed78b92831e71e56bf2db01cf65354e81340867f5c50cc1229a7280dd3595eca9e6aa98eccdd939cf0f50e7250fbd41886c867d3cbd96d8c91b9ae07f5d745754a985056d78a7e670c1c3b2f1fc6a2ce3448eb90aaf5ca42367f0c8a78ee45a60079db4d96dc2272e507cc3e6ab7b3f1ad1551a280955420c57904efd08f4dc5351f617c5b9a7596748c0906d75baf0f5f5a3c4dba8420448a29eb4f4356e6a5303cb935d64046caaa173d8d7a205bb3d2bdb798189a7377ec9d5b40e6d8657310ec8ad0785e21e6f17c15b39b8e1130df0972c66b60b1aa8428b25d678b178d836d77fda37cad608e02ad2aaa26e7b32291552bbd218f7a8bd698aad745e850a1fb0ba17c5605b8eab22644f1a50b9a033f7684ccc081514d14c4aa793c2fe9386775498fe90d8154f961f1769f5a5e5cd4c056ae08d322d9a4ac46d48f337c76121c5fc559beb503818bce2741d4423187d295c8ca8f54aaef09209", "52526aac00", 1, -1288311379, 0, "e480f427c0ab4455e019d74663dcc79773164ea79f3dd8a1b3574e1543eea100"], - ["030000807082c40304f5f1c9c1d79b2363e24014c306ac03de9c9e4ceda2172cf9fdbaa2f8e2f1bf0f0000000008000053ac63525363c648375fe2309678b67e5162e88583c66857e9d6adba23950f2e3ea7576384f4f0c62a10010000000663ac65656565ffffffff4e17afdd65f8c28ab44169a94a68cd8d098ca00684441156470d047ba5ec8226010000000752006351656a632a8afd92641753633a34720b06546e258d364d50217f0343b048e8b6dea5052162dea2f50300000007656300636500634ae92616041250bb000000000009ac52006a00ac51525351cfd20300000000045353636ae3512401000000000952ac6a536a006a5265f31e3002000000000263acfd32394ea62d95cc030000000000000000b1e8350500000000da9c8b99b96f52e9c4d2d1c019e86faa0315a63108d88a8ad80a9c25c237c615d94d6a012dbab0513999003e7df6327e9c6bd2b83bdfd60dd6d0c0e67803b2e2ba2ac947168a683a6fa36fbac39108f869ec8c918ef966c7a00a5e5b39b52beb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cb012b5b9dcfac4a1f173400bbdfa491743e8681c4e46c443485c7a6abcd8a7dba9409643351a8b841585b0da0b9055fda29dbfeb11a783e06ebd2263beee28e967864a0427805ce05b614bd8ef8e4223eb544c49b8fcf5e036dd351e0f7b2266a10f5a42e57de3bf81d0b281e3ec1b7f01a42575b33992465791991709989ff0212e531220fe280c1ce3fd185382ea58fbc7e21756f06838bf82ade9770b03baa02230774982f9e20a265c9afd3ad632bdb7a49bac8bb2bbd07910ba35c7856754f0b03862f50df3c997820f7ef314d343994b592a285458a9c1398d02d288f965565e5d5d23007d3719f0c20ae3d5f7b34fb853e452afbcea79a81ab382297e22d86022b31cc9a2c7c76af350188595e357bbc0c7e99a1372e3b9478ce8d16227486150224d4f363f2d864aed99d5411aee9e77b71a603f7fe26d150dd003f2fc8ae98780228a90ab9b6dfdbfe90ccb2e43ac3e2a1dc29024e92341041b58e34cb45a8902d0214fd589c0c6d7fa6debc2d01b6373a303cc8247988baa70f98a51e65e3a4904d0201bb46d839562890a8033c0427e903d7934acf99b2c31cb8a966c68c515169b0787be96fa5caea1242d061661ab95bb0c8565b16f064bfbb6195191e8a1774f882ef366696a397763c684f672947d111c188f9845776a0a142181972986167b3013ade1f895d3e222aa110bdf472b181058b9eb3731ae55743c1809278580d67233b19a0b9356148c6f448b292b7e716fd65557af1d007b86b4c2f7383894b13ea8ea54582da623443ccd787876dd1b818ef7de21e2b558f388eb0653a1d65e6b054d02304924230e33b27f75f593253ef064c94a26021a18cef7a73d65b410a54ccfbbfa5646599bd35fafa1f4fbd9c43b3b40c8061284b6bf99cc6e36a33647814649519a1ed94538e0897f92606de145657a65f335dae11d24b5d107806fc43f0028375ebfd565ddabf3a7bd5ba7298613efb3b96e12492a7fb0d6ce12c46f53033136be6c53c9fd3e1e57d33b8c925d2b596f1ac663c3498ed46443bf21dd04f3044ec3b1292fc136672e02e3651edf27c9de9a4d63f9d7690948850adcbef7ba761963a3547d1bd27e97b2bf6f45f83076c8ebb6445935ae803610aa580080daac97fc1ac18545db26b6e171be5f4b5bc4cb64dcacfede0a2df5e126018b21f48dd2f7b6a4a16210fa787b84ac2ecf4940b463b6d704e6bae9c4ff2e13f7519e190224a09edcc09e26a8c4e753580077c7fc20cc1d841085879c4ff7205bd7b7d8aa49cf6d8928e3ef6f62b4fd5bb6d2b3e54ebdb58c0f90973db939851a0b56083b8d7f3d424771adb06dfa5449f30ff675432d767af559e1ea3a810b5dca55656a886e6573ce88154f62ffd6c5afca321bb8e58505741ac53114a997b6ef5b68a4b927da5773177e2c6b1d24306fe77ed9ba11590e0ac67b50a9c614cb9d310faf50726b0829bd35a16398629b9056d5f55609372c448a40049ccb68c9791121388f1f1acb18cfee02b8c6d4fb1b1253716820631b2246c5bfd375850021cf91a4967050b9fb8058a88651dbd0eeaa34b3a626c8351692ef2a6abcdf82a512470c4b8a810f2857129ec4d92feab618373042af31e1c514360f34b8486703b5cad39f9204772d300608ac5a74882e46f852d35b0bad71687631fd23767a4d3f417af7262160d30dd7f76191af3094c46196b2836a0386ad2dd2ed9003f1cf6e6d0d3f7793144a18de86685670d0611c3f25de5e4f2183d7665565131cd32307762aac3365165d48eac281c00d813286b65b28dfd884285c38cd9630d4f57f6f06eb4cf2a481cae40788dabc9e6c5a0406b589f1850b34e97d3629e226ded508a47bf2f0e7e9ee9616b7daf9e77800229b644e447706e83f2ef90b05c62a087eb014b3975e830b83aa4e99ffa40d9e066b4775f30aeb91aa1771fe04ccb1a5a0067ffe0834c5a695556b5c4ef830c97c03a1a470266e4126679a228f5ca40d42680fcc9a730d5bb50edbf2fd62e7951570ac2fea88ce23bebb21142adb4e856d8970503a1f95aa78192d36a5ee4ad6fc3301030d009b9c13f87b7b8012954e0d56d8eac353d2c42ad6a2d90245d7fd79e7107be13b10f1fe1ae3b10424dafa58dc1d6e18e87310628526d2eed116a139ac665fa1b424fff775688daa881e40451f3936cf5b6054d2a53b87e07030ee79c8f60e0d0c590dcf0a7892c00e7a4072295f361b552b14000ab050bd4ac2bd76f9fea130f9665ca0d27c9f628e0a5e1ea21ab23001d489673d5c129c4887ccc0000000000000000095a5600000000003a490c678648e55992984de153499842b4bde45d35db4558a410985f7d5cb4a26533d9ac8780df451beb06b667aea34e1ddddd88f01c2702e7ffafa05e0b46061c2e661cadb7cbbced2b0e4024974664f196dfc8d4bdf6543be01e817c216b0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab0e39ee1db930216fb7a62a72326e0dff2376ec2869958708c2f899bf16528244d6d0638b9316bd7a586510bc74712e299a82c64a5cfea58d457a43e37cdf4b981aae4833f12d50fcdd6d22febe066be8f2fd015a1eb8f85a5ea8460b76aa7ecc353a4a247511570e6d17c3ed7215eb902137e72c37f1639f1efe21f292b8da02021984a18481be5e86def1c576c41547da785b4e4fb4423be8be9bb103fc85b6031cb53633695cc2763b2efd2edb1508a33afc6693e896fd5268a117455e50f60a0a068f03c4350f74095673886f4d0a23c201309d1421c8c461f88eeddc1323081ed36b17b231c3272b87b60742409b650e4a8ec03965647acda70256db19af9352021a6db52b5e68b29e25a60df1d4f158739095d2856ff154a4456bc0077d80aa330201169a876c9889b24286a3e99494cfa7c22d84d8acd9c277d309cd1412949298032d79661a8496cea4b0cd11aa41654160db5c100313025ba7d5e3ffff010d15f20307577a2b1cb0d9a1b15f35b98fd4ba1ecd233dfd511c23cc581fb6876c8d7947020dc2c6a0dab29750d94b92929f5b76c6be6e938d7742d603566f6224cc24d02a84d6b667538a8a92395a300193b7acafcb77f3d2c25ba31694f72bddec3947f65a10b2b751e8af864e6cecbe1de68daa6ff62e9e3762faa71fa20ff4d7b2c5e3f3fb88724b622ca3b4b470fa2abd1a1baf47a0bdcb92c5fc4c9aaa4fea39aebe373de7b89ec2988968a10854c326f288d1e33633b3d90ea272b566479b2256f33220d856dbf0dc2e5ca1cb07d5a2f5503d91257ea4157c0786ba32848e4943f914e913512ae9421d7dcff3a8f8ecac25faf890cf46f0245a099cf9c38426cda2b2121015e289019f5218f3d66a8ec9ccf49318f6376151ea198d75baf8ab4bb4698e360758876084786b03ed7b1b4cd7dac01100244199d4d6847b1d5b092cb59e32cfa042fdadb202b82c7958f0573c471fdfb84a70ad95fc01a0b0b4dab88d27e5fb5c9f401e8d302d44ed41300f004ab3c99ac5863f0bf0867e7aa7e4d13b2b983f3dd3ce2f1536b8006a7d046fb09ee6fde424196c457643cae3a2c041481b2ef6b25e5e3943eee8e639c6089d6b0ebb2fb2be479dddc3a7e210b5c0c0a04fe092de524d231e0249760dff0b0fe6dfd49114767d7f9771a5318499beeba6a988a6a39e3012ad95e29d61ea6589815b500e1610ad808890a6866bb01d6d137ea8ed233d13ccbc80dad53ec03b15217d59c4554ce1244ad8d90731959fb065cd10a4987b6c818ba290c10b0f3b3afc49be7755430ddfd2878c4b2f353c207b5f70f38ce2ae7cb7c2358f7dcde9229b8ad24409a32f4c88aabcf8f4d70765c780c8ea9e766b49da3afeeae65e13738d371097670f64528e20c6aa90b85e18a5738245c6a2a52355d784d4390aa682d325176f4c2962ef86b3cf468229e8cc16cbc0530feac59bee8559ed1aa2763c788df9a0b52dcc8009d4f05e89f2e45f9ac8c2e60f698ef3264331f69b61fc975763b7470a474cbe2ddae8a1cff996658b04159eef06e4a8c7c73c24184b5e1e2cd538f7b19f6f69379551794f1e538c782528eafd0fee6bb69b28fe6da04711048c2b67a749f14568b9692863e403d7fc278c7296298217d28cdbdad799493767855aa35774735fe00403bd9b793d06d31f892cb324f4e0a54dd7e07ca4527d988738c684473774f1ccd8b61bfc6d2d74565b23ed7b49c892cb21ae3564bc0829fa58875eebefbcba8079bc388690a9d9f72623cc4b558ba18410fc92c7a7015b123a7a9adc7915859f83d05b81fcb7ec79d550e2e2e42199fd5209d371b23e6ef2efe3a527bfaaf20836604e696d36262caf010017dc90a3c6bce68d6972289590954d354eb8c37f2dcab222b5e5f357a1cda13fa7545593c087995d70f9e651d19ba267127cd0bd0de0c558565713ebdca46b2a52e3a9f754c23af9ecdee3077aedcc33e6a31233bef5cc04ac5a89142b6cba02723083e29738e98ff127fbd2122307f5e9552132c8d5cddd8a7185c92d921fc1efcde2be7d4382a2d12bf45a17a2320af9b1b232cff91858ece1ffbd6ba39b85e37fbb7eb0465064cfc30675c43d73c8d823939b7e527c94eb235a152e066b656e65c0e7a975ee0b61c0cad10e5003ddea1aa8fea1c620cc45ffad4cfee9e5897298e503eb60dbb7b6faef6fbfc6b05a47425f1dc4c6ca04015d2987467d21e359cba7519dca0ba0b81e787e0291c7766307185ade4356537ad61f8448c4eec2a984cdfd9d7f5ace713acdba223100000000000000000ab742040000000024702378c4736085c1ba8408f7ad9dcbb9a1f5229dfe4f414aad32f39350d8d1acf692b118291383a00e78c991934554e97a04d3323664f43ce7d911b0c4bef4c74c9f12025631b0758894766aa36a569a972b7c2a947cdeda5d96e29d20db9400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d75f21730dfd102298f88a52b1dc9213f5b1b95d0d34fcfce36e669ef880b9fa8d87485b3aa77c6e67013c4125752305829734e83a9f1d6cc1d2ecd899c41d27215dea8639fd237ed8fc4f0f02947d71960399f62b10db04471da5858c30daf6519706a83d7b5fd608c007b889420690ce5427aa7790061ce2a16c956cc9be4e0205f2121b74bdbba9432e100c25d2a631b5709a590f1062a94c8dacc872b0a001020e2378ff60ad55e52d7f52b64afae502f13032fa703ff5bac1fdc94f6af5be3c0b032d2e1b23f37f5e0114dfeada65319840dde8de13231020ea70dfeaaa294ddc90e7e7d19569b3df442fc6b2493c60f10682b286253cbe31cb31915bbcb0a13f031623a30370c01cce29db09024abe1160f407d68bd032c22cb557d379a674dcb5021d7fea961b218cc9a9d1a3eb2f55dd6f6487f6d278ea243760a02574c8fd6c3f03076961bc3d71d460e132e77c6e8fc86607c5ead080ec2db1e1d7e7eb7d6c6aa80213bcfe2debaa272380987ca9352dd0ea16f2d8c50ae10a0fbe7c52a9d06e4e3d030ab57c925eee97f1b342a3bbaaeec4580df9d746fc7007e07bd1ca916aceb775f7b1189cdd2046cd08d44c281f87b99b7e0b51fc1363e4ab5bffe3c937ec7b7ddcce519da1fc5da6986cb56d21251c5591c5a0b7137e165104b397ec3339e30f9f9cfe30be11914cbe47e18c82d3c318463403a102822591da97f86000d3b0a45b3282ea501f510e697394f9659746a8121b7ff9cdf2708dd05c182432d1ee03c45c68fb0bfd60e89b0a1531ed4ad1cf6c5f21d225626e9f7b27f778a0025168b74f0fbb2d4d6cc136132bf57c2d0de8c98966a9b62b5acb02dea300a1ac0529b03ba5b8beb376a48184ed40a2f709d680ad15c6d08a78ddd243a6d15c8cf8e7d5fd34eb12b2123e4721bfd1a42d19b0fbdd2ef210a98451d8b12387a25c32e7c2566f30c5ea3adb047144d798c372a3f66cd14fdf44988c04dff30fdc3662b3cfc8b176009bd5badb797949583ccde4aa173dfddb2395cf32136cbac58bcbf3d499b874a76329f0d21619e3cedb66b5164ec544fe61c18fe24ddbfff48ca5bd1745f95a13044c94d8781045f89ff7044ae04b8f3d896582f4240348a9f2517f86522ca4bc2f07a6b3b52a46a5a5685d4ee3d5e7b3dac494e987f2b1aeb1fab6957811a0d26af893e29b4a10658d568b5f2846d539233b12b97b3b44a1e4e2eac2f6ff11ac038d20bba96a83d15e4b5ce891a584667d3f2b97351fa38450426ffce20b1e43f1a09bae9c4755583f4f381cfe084ea1dce9637b471fd30f07ca49d72158bc50a2f4fd085f521ac9f916e86f5ff4b8a1a8adf893e8b9f196b7a95cd1643feb80032bbab225ff768a8a2fc590b906df7594e2283a6b1d6c9653388116d56592880c38c0743716da3e807d233f98af8c228a3037804b09ec59301a9ad10fcdd21ec23d2bd3107f07b896613794b50ddeaad9ef10dba7a34322f14b57344cf26a115b5c9b11d840c5c54163f6b370366b4e9998e212de15c5427f1fa53c3844f8b165530fe52a93d4088871a094d64df823c97d1e0db0840a94bf4303998da3200f4dba555ba436fa3bee5e9fae8f9b80018117c048b61a993ad0391bccff60a563e1aca01b4ded284b1306d1539af32bacc41a1264b21d40d3be819ae2bf690a878ce8ef7433c6c5f9df68dc3cf81df3b122aff17620159e3cb2a96f4e5c59adae2cbaf113dba301fb0a7fe091c905d11b6fbe0c2907033fde5a98ea9823a90e8ef9544b7181cf0e6ec5ef515340dd291598d7993546df9f97fa356bfd1f3823dffde5c8997d252641d7c781ddd7c99e65663c10a4711848bf4d28c8a4e0c3483d0ef294773d353b14dc809a84e49d44e078c741af342af2803e312fc660c52493e92a910c4e41a85b7300757e3e29db067bcc20144e8d3d0fa31de2c7916b74cb88353e89e7af7e5944cfc8004f33827efe96b0c77238a5b3246163a973a598b1e610e558c57b30757c07667d4595ab473432511b6552902dc95e28981b9a4bcbf290ed5f5bb9d97c4a78cb6181916c1942011b5b6d76b51dec8dcda937238dd06499436b22fcf90696602b82bccd04715672eda6f64cee1c6744cd5339ee2c9ac0aaed016a469546ee590d2c431ba73e3e5d045472e985a86dff72b7e3825be1e36e24d531da37f3cfa98b4f74227966d141e15442efd79e27cacf491f0b6490a1a1fe4bd03463e479b2e973a52414a7bced6405009268c8624e50c0c365685fea0f6d69642a0af0e20ef0d6f77c45c345552f7c1fe584ae349ba86da024d91a838a1da4042e72ce6273f279c84cb4739461f3df8f9b3d8c30ae7f6936b7ae8b4e3f3c2b95e0b4a319c72ac1457f017cc6d35ed38679121a8fd4aa2d2ce7d80fdbf9e8444e45939e5e748fbf02", "5351656a51", 2, -2112800587, 1537743641, "3efef57ef48e21f0239504d3dc9f408378624474402c1059ab4365f71271ea75"], - ["030000807082c40302f6ea144978f759a2ccc3eb5f174476d67249954bf16cfbb2ea4013f0d21d367f0300000009acac536a0065636a6a0362a50ad3a2ee18684603dee294b0549f60a627c654bfd582651d0499c7c55a7e7e50fd010000000165ffffffff02f0f25a00000000000700ac6a5252ac002605c8040000000000b49590b90000000000", "6365ac", 0, 718875641, 0, "65fb06127eaf2f8b02c24e83e86a53be1cdb5a6d60b5dfa009f5718bafaafdd1"], - ["f02c763d020863f6ab045b785edad13cb4eea7ff9e0b3c42035da0e2b31c8085375d53ee0f02000000080063006553635365de3a412815cfc91803dc40bbe9b220f4d42bd9e27dd40d05de2c04e53fcc8ea63092fa580200000005526a00636affffffff01fc37360000000000056a00510000000000000126033b000000000000000000000000005526e5982f0797961e5136546b28c489db6d242d1c9e3f03d8c0f1f7a58cfc46a25b39e3097c1b0e61afbf5e8bd924dbed6be389ed16e88a1cc94d6a33296f8f328847c3830177135fd1018f5bb2f0df4080484f106b6679cd10b381d274cca300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cbfdc60ccf51219ae8c3916ae9a4fce33da1e93f06d0a0f70ac8cd9d0e80d795887041b12d0b743d5c5e0bf562900a29541fcb90ce63c730941940dd334b6ea9ed95a2e107511c13d7fada96d3037d6dd3d07dd99a3947c5ccc22762b9421cd20bf5562c6761585e07e3ee55dc1b3cf38fbf0fd6ba91f6c28d504266401a93d5021e5b4445b4f1e891714a083aadd49d2416fddfe4f2a3b6e38993e3b6e17e018f02197edf3d0f314a41780f54986cc2a6e7c711f78c4b11a6d11906d7a9e008d5430a04f194ba303ae052229339ab8dd212e6cb8ef103cfccc7dc14ca6b443635f3fe92b81bbb1164de8441c1a6f28b0138eeb5292fcb76f31e1f975af64a412cc6e5021b26af02240cf1859bf60197d6d41952fd762121fc00ee8c7816631c542c094002183432288114d4d37c56683b54c4a02d5964a11707c69c96cb2f728b6682ea9c0309de07ab2506b149088f128f0255ca22f325898e88dcbd210b2421428263169c022b1003d80e13fc406430e95700707692b235edd65756e932965807793c8395a2030e27d0f074a772ca4a0e1ed423ceaf39ae5ab19a2a7226965fbb9340f04f56e14ba82f05390d8718cf54fa0acfa8aff6d2ff2e22a699fe115a10f4d700a540e2c660b51537d99da394899a8dd4ac6a22c7d3804f8dfec15561840ca123c7fb27e3d80e35ba27afe198bf4dfffb4aa35e5bb892bfc0ebd410477aabce26459f3760489aabe0b82e02aa4651b63690387dd6430461fb214ea5de49f0bb731dda617ab67d4806a115b89a11b7f76cd2bee577074d6dcca41ccee303a681d706fbf2107331f2d84c42c22740a78835aa3fa6cb1cd5466638604756259aacaa25b7e513328937c3985befd11448d29455231d84e423c314da86de10015b4fe499b40f3cd7356e2a7c4fc0f2552e95f8ca18122410d3b616e2d3b47f73d71b0af79b54b95a9d40c7679bda9eb9e16878485023985fad726eb58ab684bb9d670eb3aed3426058d5197e49cf8ab6bf4f1c1359e2c27bed36edfebc4caf268afbab68904f6b6fa4ee196dc45f4db6dfff9f103d26b885b474c0fe77e81c8463efa1dca6db4110224b10034d50b826be552a3202d2302057cd184140254ac77195acc02eef54ecbcae219c905e32a0fef4f7ec00736efb7ae298d7e56a0f9ecd4ab616a58de5f279b61b0c289631068286b2066109c5c6a23e3884265280611dd1f8eb3bb0a6cf78b0508b5f743ab91e0e3544aabed790d50fb775c56a10d9e6f6e9d040c5dbcbaadb4bd45ae313727b44b8fd0ecd1ddd0636aad0608750e12030df385b125f619f0b84cfe3117a3a192ad57b3a0cc1176f4baed096f41ea7dcbd7d0387604808e7444d333f90dbdfa1c531dafdad580fece9d0f94fa3007d8daeb64f016fa627e577eae4f75f42ea60b39b607d799de67980e0f74dbfe04e1bfc0ff7c3e481eaf161d742629fcc5473d60f572b7d612fdff62b366828e0ef45911d76736972e44537476d258ff26248ecffa5d449f0fe133ea14b0c3a3780dfebe457c3150a74d462499e4976eba352e87c773b8644ef73736e6f238e0ec1fde61e6376ef1e9f81388ef7e5401a2ef193d824db7c02437ee3f03ee3fd7a7c9a20b7c6366d61eb15b8a4418a9f0db60021a51bab4ebbded97b90785e8e9c83d86412999bf4de38cb2512cdce6c80b9e981d4b05e389f7e45a8bb914311aa0b36395e7b7671d94e636dec3361c7be5c621981e32ce0db4bd47a3178d7bf6cddcbff3b759b127ceb70d677b085d426e28690478f46e64b58a893fea20c5c689dc70d30e6f75aaabfd3bdb4bb2a11a0861e8c8123b72c5c829cbabe01b738d9dfb99773d91d4b0dc38010e08b68ee7155a832c169e325ffe436862007acf96ff501bb7860a505dc86fd011da13d9c065f024e4cce42cadf6fe624d3100c1abe151db37b05000d77c6b8108cf991847c84d8bbded4eb29507be910f7edeaa1b05dbeefad66fce82a53eeadce009d61e61ab291ca5d0a0454e0a30a74abccae25f85441eb4fe7efd3d78f0a9fd1bbfb3700cc0ee665e1e669e0a56797c9c9e1fa6bfcfb0c8b4f09024767d9b6ad457f5c5edb15ae1427e0603370ce7b1958d7e9ad992763d10aec3238533432c80b34e43ddf45c5615ab596f066e5256dc5c58468633fa94e9d66f08e6bdb82aa0f2fcd35e24dbb7d4788b6c5e00c4c44707e848663295ad43c815795e82afbf8c80f87939a13d4cf601ad78ac0d30e08a452861ebf7ca8e02ef71c7243eb71d3babb2ecb59d922a802137d59188b648a8d00aa945b000c592211a93b9cf370f5a46a83fbe3a0c00aaaedbc29edc5464c695480cac35097a3aa6660d07d4ad0931a1e73556a29d0544e9cd04c571ee0e526ac20ff8d0227d07cd5898506e559b43d7268e5c7ba96ece9a6c10e", "635353526565", 1, 85120961, 0, "e9b6936ba60cbc72b9605ae284861c9c883fbd069f2a03304e1c95f7636d4d51"], - ["c5b8780d01100b06eb59e62b8bcb8bec2b85b37ecc9881597b0a0a8f2ae6e37304ed9181bc0200000000ffffffff03fbbfa4000000000005526300ac00eb131a0300000000040052ac65d6089c04000000000900636a525200655100b58322cc0200000000000000003c869f01000000007b4ed7f2cd63cc0b608dae91c1ec74786fce7e0f0c810409cfc62ac93301325299fd2d1128f30ff31e498357bcc1f16b6e76453c403b852affaa65514df78fa62991e84956b05928a95600719abda5aaf31bd0ba777bb7f84ad4f833b0352f4a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e79f4cea3bc83e4e8f062fe93475517441d5b4efb2dcb7262fccf5e0d54d3c75f59bb2508feaa0faaffec10065a04d89bc37806a3ae2d7a3d68a5e55d9cd9d86699cfa35ca2545b9e8d0f70710599b774ad016739ab3797459e6a2828889eccce1f7566c02589fe599e858c5f799b47e02cadf92824e657a08783cf255ef36a10203f86d80ca2d20a113d4c3202efc5026d9a26436ea2a814a6a30b8710bc8c2c103303d85ad8044490b8c3e7e9eccce149d14ceb03119cbd1f465c8e5603615b1090b09205bbab8abe5a85a72b1481be709ca2a47f6d63b2b4d62330f14d699a2015d3c3e35ba2fb7629ae61c89c835a7bda5133602474cf2fd4a2325b0957903cd400316fc858b2f6e586351a2b8c5742b912d115b1e5af28cba7f66d2a023bc4f918d020a844d650258ffe606b285bc23e050d3ea020b078a059ab7816ca965c76b5db802204a451a755825cb342d3da85636d8f3f662a1e3983b6d7d2ad49319680aeb9f031046b301b8ef5982c2bbe8d0c6cec09f49eafc8bdd8ad00cec6727b3e90f29ed030ce65a4774297981b19eacbd2df1f04066949f042597730504e4179a272d5efe58468fb82c2fb8768145d9161ee46b183e9124d769daf17aef762f05c9586ec98f6cc0c0be1c2e51ee16032675847a10503eb8eb52bb165b05678e8e3026c1ef67618aa7eb62ce235d4423d1b8bb7c2e21b114c27eff5ff93826f032d21cd83536aa8ec3adb9cd74ca4799a7622f34167dc8b29449ac13fc863c8f6e650f08593afaea49a162c9babc660e586a6d32668804d9d45808cef033258b3c47f20207f4b36cdae0d5490c10e087f45585f4cd6981eae5f2fd10dd390b718390d8a39adeb5ef4928aabd5c41b639d58d55f6faabb734d774774763a6cc870fa102f0afdd4b1d9482d344c944c4c0d35c269a70c2b377d3acb24e1f6ee47802e66a936fa83432f54fc8bb0abe969ce0e828342fcdfcb2dae1ac2483efacba1ed40e4c2574f1758439b4e9b51ab00c642dc27ee277df58019666cfeac03939ca40d14c42d98bca286b1e5810225b6e351b0affa85a2a5bace11c7fc960aef70e4019ff60698f5608585a459c45b539c3bdaf90b27a7039758d9b639559dd08e8078f8d7e298709d2b3debdb878f75ab2dec17f33f59e239840c5de96636a2123d13188db2a49804bd1387e867ae74545c19231f988f2652a7a4441e89499ecc5085ba9657e518c56b8601d726a0b598cc7ed0ca9e297127c56b5f9565ad66525a7c5f9e9635abfa18f4b5105ce9dca2f93ff9f6840665c4b1def7242444ff31f6ffe2f3ae261c24d53d188788dcaaee89b9f6f9d71464e7d2394494e8316a7edf8c8a25097ad04186a012ab7d266f60047cd10a0c655642e0e4f9edbce9fd35cc2f85450487be97219c46787a039874e13f587753d2eb78ca81ed1c4061cdcbaae5709ae8605ac9641e3fab4352559e75ec104847f7e24a8ba3be6853b26c7b7f7955ff5475193b49671ea8a18cdd112bcf4cdb22cb96df577e6faa1eeb9d574daa345dd3e32a96b913cf34458ecaf3c14fb94ecb4a0457e6e581512f05683b1b8a70d0966a859343bccf3ea7551c26b72f5394ebc7aca8815f3fea96d86295d4fad6a46409aa4961edc74536f75d0e088028daaa3fb60ccf803197e7932eddd4f71e54d7bc3d03f6dbf4d7d9717dcca72e1ab7acc340823bde742dae5a1ff4fa47abd01a1ec389323ea0bbf3471c9819c1f06b8e188ee863b87923e0c9c7f8eb3e2f9bd5e8ebcebed49c991e09f849613c404e2b2930ae5bd384fdaba4bd57019a5d5051f9a2a9e31e353a12bb806e2872fb33aca81d91b08c8078c0967f36c5a729c697395559e021393677fdaa37a04c0d0b535da12b7ac4fb21c13cf76ec00f00c724f79ffc6f0011fd54846061fd27c64adf6b7e96e86c0566749a969d871e4597379858908b95977f4c07d7d113a9073203eb488a50d182957ddf6e2e13ae11c6f68427dcd499941aee3b8f258ef4bdc9c18ee897173e4dee46a855d1ccc1b0802cca4406df1696651a29268658065cf0af315823eab89010179e13415e57e26d1b244da7b684fd3fa4e9896698aeb77442e2eb2d8358fa7c300b3173bae52db674d6f84de72124b99d1dbf57bdae98a43283a4e6e9808d1064a21f690ae1fc670effde6551e35821e582e40ff67e697a67104ba23527771a9c3d3592a7f9ab2496d733596f9f865a47d7f12daa92a439965aab7299643b6c04534c6a86d87894864ef1be702e5e0186deb4522e99d7636d2303732f3030000000000000000000000005c2f5cd4f35631ad562b132f0aa2f5a32dd84b1c88bf8b10b74f4e682d04e54a35e78af8fda7fc662e8d5e447975ef02f4708d55baf3859ff134cf4025741df5a7bbe405b7b29bd8848e0c1df6eeccbddef2574d34fb189a0a0d10c59af0083600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ccaaf640e2a2cc796b376b484ddaba0511f75446e0b2fec46bb4d7cb6d63a519d3680564dd09209111991ec416119f89be3725841766d008ba70d23083b9494ba387023a8a768ca2d44cc19215f1c0c008b6d92d8b4d358c966a8fd58e5722bf189d0a23e6e24a53a2f5ecc9066884cc1ae3cc5ffaeb22987d276f50064d511a0324b77b0bc4d819add769a53eb2e2ac36c7077648c54bb413091c984313dbba2c032f17f434f1b5650459dc5bfff07d40463936a26380c0456f05ccf3175ef0e9d10a02c909e292d94e6bd5a830e49df55683d6649d385349c69c4333b6d45ebbeee308e266ff5d3c2c934ce2c24cb0ad29847e7bac401bce478bea2441a200972ba3030875a779db5aaa292d5e6b515e65b9958341d177f15158fde0fc290c7fff21b5022783b8e53d49275a4f5efcd3ccd210a709d2b10da554066e8f490ce9c55c81770221993c72230bc479ed74c2583b4b4c793b10379764543e509af29cf6d006eb1d0209be25172baab2aa11bb6d7892ac1e3de5fb34afb9a861bc0659e05846fd9ef902212921e5ae0599d574d9f17ad396f03c2985ccfed3006508a72c5774359a6c19d5f33a8ca496e22f5b6c55dbc46b45b5ab7bcb6db34d639f6cc729d8af398a73804781ba270689ab88275efafc0eb4cc1fd80f894e77cbbcf17ba37634e0e4a8982ebd868971bbaa40f454e24d9c282d060c46890dfe5e4f13ff3d475ff825bcb1cc2dbed29b56d5e74a80cc9843b632985dd34034f7c58b18995533bbc69c03e3b112bddd4fd330e9fef391c91cca6431628fb9c352f75f4dfb7ec08883840b8289127c0185025041d7374c84187ec60131b7d8c3fff5e71cd982834764f117c3dc9312aca67f369673169cae4370da01b24c3608c925bdbbae57f4e6995653f33995227f7ba4ba5cddcb0d7a36fd076284d8fad861915cfd183323c55cb7cd840904cb6cb8b80bb06ef6752ec5def16bdfef5b86b21b1f747f8d762b6f8212b0a24154111d848864be9b2f247ca3db894aeb467ed40219527aeb9c18310a3ebbf94fa342f1c2cbd6dc0cb3f1da6525f9222d340aad1cff2a01c7ada4d0362dd2bbef210a716813f082d105ef9192f9247a3705a2e3ecd5f0f86ea58a681c2310b38a9ba8aa2a9238f5f67ef02d9288facd00a87ae8f42ee456088d1af6c373c871461bcbcad6bd2ba9d733b5bc077e666cb85b900bd61548e33621b29b29611bcf080b78fd262af2802fa64c3af19b43c632489ee2e7658de6a8b69d7f9abb8d8770eb715774212daceb25492ca49c8f40e17d643312343e2586ca23d319bf6c9d45402ae0e70c93469b6dbbdbd53f0721d6cbd7851ead94fc30691d5be28f845eebf61b571b685e15b06bc41497bb964fa407b99bb5010d2ee1cfbd10fe64e131397da5151edf2ca737af701c6d8b3dd85968f97b12db6f5c02d1e862662293a650776cf430a5effe5aa2b4ad52925b6409b8b7f5ab544074fac8d4c74aadd2dc2bd5cc482573a4513b7dd2f494c4d647f802e41936a5753f2beb70520c89e9d275f50a577ea6dac2490c40d5d1f6bc0ad5975722949c3451d3b6e8fd10aad5479a8a9a1a9e26a9ddf90a342dd09614756638e07885b3032c68d4ee0a22eb4ec0718a3b9e068bd4bbe9a57103aefd77bd576c4b0b2792b93f38d3b9a6467c854c2bec52ada412a06d3fe9a141ff2ef9d7668e47a29ab17b6f434f4070c946a915bebd3d91454fc2b927d41bf255494cb97fad79a82f9e3a0afcf8f8307215ab9922855a81caff838d08498e0156036139fd0b60949c0847e308dec1182020f23b4999a137b17890e96da7031b8842d2ce49f00fed5759008aa479b854cb7508f7a9d593d876df3930d06d7f15fcfe7582b6b0f4711a98a3921262279e9a0d412fcaa6840915d3860ee08aaff69e40399b67281df192d1ac0383c99910a6f82f3ff563be943dfe8876935a59cef11a7917930a21334c1a2e870b3af7587cc40f7700946c0ac734859c4d7ba4780cff1dff34cd660cd31ecfbfdf09e2e4c33bdd6ea7d1b5617bd083073866339793e06a62bd628f7585ac0f37e5b6867b8676c90f6e9e2ef1cd23614b1e84fb7e1d6d2298a7774a2bce095c90a0e383a7f46ab4507b5a514401311addc74ce85a8cf44bf7c2240158d5864b8b52a5d8bfe3c6ddbd7bdbf04cf1b980d763adb715e934dc744750cedabe944d03a19a65c7ba8a4347b0cb48d2d89f1dbb6d3bb4d5fe6085318d808a017f93d731efffaf44ad36011d0e54290236541a08d926ee72a133619c3100d1f22109a345d34492a6f5f8625ae8cd8ab40b798ecbc543cd18e4d95663e7e6152404658271141e55fab829a782bb1409efd72edd849eab65b3128169e3c01dee1361ee1edb29218b9ac62321c808bbaa7febae21cd282c3904a563b202", "6a5152536a6352", 0, 913978334, 1537743641, "e200d69ecb15b8a382ae49cbc3980f3af60ee30539fc1602b472c52326a08ffa"], - ["030000807082c403036bfdca605f379c98b3b3d7868d09952e98600273e8719190dc1cf98e5878e02a030000000152ffffffff1d6cc945b9b005a2a1eaad5f9d2d3eb79671157418d313ce08e6dc9e9971d04f03000000090053536553535263631aa458ab042ddec367e3f465fe79f10b5565b456be50d6945eb547a0938102902c94cc6f0000000000ffffffff0348a0570500000000096351ac636353acac6574fad10200000000056351ac636a5d9d0f02000000000152e5c6593f000000000303f012010000000000000000000000008e6207d63856baaa5695dbae0f6c4361bda905e8c96211dd2baf8cab5b7d6b2aaec07f4c980f27c444c98c44964f0d5cc6591512dc0c356d9731ef116a39a36b975ef9684a471647182605b568d39482daf5729498c2eca79ac3a24f0ddd1789000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000db1c16e3a3fcddc9111dde5b78001a5689481a39d870ed44906c5a78da55b2161904e4c9b5e67bbc080221c06d4dfb639ba4c3b8d832d699061c268ed1563e146263fe2efe7fbfd45ccf78e3aa1b78185952330aa7478c8347dba80f54b46e1633b08748d6ef24574d1e50a7cfd1eb4448bae95e52c200c23419758c8b0c45f032bf620aeff23e1f1a21c8b2a7bc671b3672bdf7c7464ea6b0c9754d6489be59c020310c2d692f5d49348c3976b14ddac2f1c038bdb507e47d48a5889b2e89598a80b089909027aaa93c172e2766934a8796f97501a2e03ae1e6defc8b4e09b2138d4352503836d34cac374f0ef6361a04607a2f138198c5b856317c7926d026d8393021b05ce7cc77a8028c558c07c0fd2529f864578e595be294c9d9d6ae75d4176e50325af71f630ed02f6a21d3b092a172a156333ad5a38809df92e114f6da8575c7e03116e78629ca70e8b7a727c3d3e6c50cde9b14bd4ff3e2dbef8dfea05d00fc14d020d592c061b96fccf1ee4e04db03c1dd10dc6da539c9a7af3db08a36bab2297c802055ac62118e48218d2ee2283a056aee38c490080e14d65ab6837a21be9ab339d6a8588588c385c6afb939e0ff3c355f5ca55af6c774c88ccf6ddf8aefb33bd1392959559e677f1ccadcc1b1d704f7befb13ee59c9bf41ad7645dc22bcfb9f1aaf0085421312dfde8c1cf235895ad192100a40a470607860acaa9d11a43064c626af5ea2c9b77b81d9d7ae81545b62595c12fc1e561037defba00933c7310410476ba2bba9605c33b41b43a1718c7b779f2e48e6a44feb6bc41710cef70c1f518c77c3c9a46971059a559d6a67f4e43cc9181b8b4e1e03379198c96629574925bf741f335408b95b61a4b5a8424b6599dd64ef7a1d6323c77d85e2f4db4cf1af3960bf5284690aaccb0bdd0c004968376b267452e2644ac1209ade1254dc1a91525198498c5adf04d6c6ebca572eb397b5206f7a967bdf066a066cd8a413c788b07e5e106c8beee5c4f588e906ba3f0aa903ec1a3b2d4659ac262c19ea38b4b46d355965ed2038a18bd77d6475fbabf763e5d52c41077b3ecacda113735486d930c470130e7b0b643bf887eeca7b0ab575be410f1a625b86cc4b27867d2ada8491da82ebbef839ce54010d9939762f159d5de0c90d315faae5770ec328abaf175dbe25d5e21c5b87e5f5c1d905adef438ee42c0fa12a2118162107be71ce48e671bc215b9ec3eac0b031308c0eba6ffba8349161847ee47fb4f786e4a95721e77694406c8aaea8b025eb8c0e3f3754539358a085e0f4a803760a05a94f93e4c61e001fd1c060a332c3b1fe159691c6fdc4c34227fdd7ab10e23199e56d4c9431e945c397dda9d9bd2005ced04553035d0132dbae8eb8a5289bdae5ac2c0b337313e2a01af7d2c6df40a4ecad2ae670bf9cccce679b750b89f1958c9da3a581a98ca37eb315a5b386b3da0d4fc71a888c67e4497d454878f5015d17586959fb3fd516cafd0eb92f4dd9e2d456b42ae1a264b5c15c2722bfae9a8e3dfe4ac470db3fefabb1fb785dd99f44d63b03e4a6a2da85565926cedde091ecc232bb2dce2a3b1b58236655e4ec886c8310d656c237e6c9ffa9b030842dbbb8f0c2bdefcc8c7f957fcdad1d78bbc081662aca1124a5e3123ec096553744bab5912ef1b9db1f1e4f5dfcd8e70a339c878eb2ac4794042da5e34bb82ba2c8a09f3d2034ca9385cddfb1f99ff2d957d8f6c2be78ef0f7541579ef62ab7bd04dfaf0a5061bc01270a977bb0b8a068cfb4e825967248c007a217c2dd88067942c63bf46eb5e8755dd5600dc3e9c0b2c31e59c57a6c1c74ec60cc916a328444a8c37ea7b5c8015bbda675fa621f4992be173d05979919805a8b4d18866d19a5377fbcd68da2b4cfa6db033f9285636b990e379151457e77abb5342060088d0de5afdf3afb7c83cad4114de6c870e9954e7f011b59bc742b2d1392ab4027f005d424d21d67d8364054f2e920bf2d128aaae3c7c2809c2df1b3136c52fe737d63d89d773fcba24e5796c98d36bbdc9f1118f72488748ac70d4e5ac36b5a13cf97ccee49e67609275fe40aa14b8e02d9320d09bea24deec003ffaf08218f22ee78383c1776cf8c751bead0817aeda9de974f3fb88c5fa06b9202fb451de71a2d751a7482830b463e7a230c9567facb09cf1246bbb4c634691467ace089eca39bcde69951a90f355c359634f78cf2748c02758f08a3522a35897d6584050d96d8c618013b74ef954e3f1da542cc8d87e0523c98e3268b2e21a4200f06e00000000000000009e6ba9000000000003b7e3238a778d3d94b0ed9c72747752a5f38e9156d5c7774d72204a714028f6fa18ae1f1e39872d3fcf4b2b1c8d2110566dbc2d59ca144a07f743badfa6f4cb6096d4ec3c1bd5547f61105c77ce2812ec56cf8d111e973d4232e6647029d8d500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000adae829c0e19567b085a8e6ed35fbced5464a6ce0c70e25e7994bc9791d6ee5320b764ef6fba31feef928c88c0c945f87d0a0dff4bda8fc806d2ab48f4040ed2aacf1c4ad912601fe025b4f0760d04edb9459b6eaf7214fdff5288794996a6c3df5c9a6eae74c485d00cbf2635d435db435615d15499a76d10d3bec7a3c3cbce022971c9a26e2547f172373c86622b335448a67a028e5863ebee54533b01cf2c3b032c19070df6b278815132b5d6bd0ad676f62e9c442635beaf8b28b29de2d90e340b029f53d1fd8d2e7eacf20bcdf37229951b16fd5a283946493e8a49c33a8b877bc82f84e701d1d43108b4c8636afe00b0471516a1aaa493703464f1a2692aca93020e7284fda02399f52e8aadd6ec221fef8553a5346ff3311408183f3ded7ffac20214991fcd56d2896f48177e21b86b31d4ddeb800733d5ecf129fdf2fbd28a571b03205b3a6ebae180e1bd291a2ffd205c532faba67e1b498549f4b23c02b7dab11f021ccd008961a1456b58bc63eb4d40d4ab01912b44475557a70998213289b5c403032a0f2ed3c92f4948bfbdda804077f1c786ca0d6b756027a1b7143af5f0141d933dee89f819f50f77f33b4bbe74f5e8cd86f693f8b2f2f6facb6997b7c9365ce6bdabd3424d1995c66b65ee3bf05cc2c929b874b90d141197dff0d1afb76822cc9d574c2a9786b2f973e6a5552ff821e01606d367535f6f9213dde28014558de406f6f898b870ca7b6748be2ae2b26c7ac1c6d32b0b2726b43b2405cae9a636168dc79bd901aad927874fd870e461007697d1ca9c0187a04788f0695ae8029247934b2c8e67b67673930ec50d3ea1a2707bc41cf703ccfab5c18bfb8f9470c0329beb301fc0b78783d870a68fde6f452d165013a1c2d2c17dc96e59c6bb6d33fcc42a3f8f4eb3e7c1cb6d1e440623e52e6ebfef8b67e855d8cb8e5cb1ae7422300c027bc204426be7c19d2af477d7b29dc575ed98351077fc024f06b41d2d5af9afd10afe61ef42b2aae3ce9039de5cf000134f876aec261e3c85f4f71393a04b0645ed26b96c88b1d27f8d5a867c15a1e55826a249cd77702d2daac0315349ffed40021beceea3434c69b37c498ceed27e49af36c3c0a23b9c7870ca0e4dd30aaa4d91b63f788cac88e2b307b382e6c549a91f4ad9baeee2bebfb8e98f263b1cd42d1f0362a66126637f45ff0fff64e0dba7e4a0e007089a2d806637f266ca7d353a56e05c35cc0ab1ad8c371b506176e3d07718d685acc2058092996155774d81314d669b2e5028dbb3ccc0f062e106fdb5d7750931aac44bdb331a435f932dafd12fe6c956891f4df0c90cb630b8d1a9083c8784528a2ba64b9e4e37ef0973e38a2fd66c62a8216e4f2812971a06511653a055e7b9b5410596c8f1a79c84509bc9beda038d22f9c6739444a3256bb46e69553e43c4105f0bde64524e2bb4b625c106e33f4f4dfb2cbd25b7a7fe5406baf2b4742c3ed2f54a519c12799734f0051277a5ad0c553f78a325c6ebfef694f2e9ecb32e9acaf3c63a55857cde1f8e8f668408022b985b78bb72557012130b5cb1c756f9da9c3591c783fca21536b8546076b3685c5b81e27e318c75cf54e81826c613c6781a2294d8dd9695a1d290b87a4866be47b0d71180b834206fc92e1c1594201862b5d72318c2ec79ade4c934689c4bd6a7dda59e6bfe582f834706c447ec1612b8ed71202cfadced18a21c8db9a8e1830243848db2a9fe77ebe4b7e22e0327e73967c00debf085d4a245b120a774e8cd2c77e8924e7fd4870a0ef083de3d8a89bf69f0aaaae2c9d9fdb8f1290d43ac79aec63ee0622ccbd463f93f26f9faf55a12fe96c806243f66aa95c9e5ea418d1fa88ecde0f48a2c42bb2a19dacac0b6a588d0ef238c752f219c699b60d151b3344eed529495c0509b849e251194deaf052690a1229cb46f32ca4a4e868af257499ff891063182d6406e24660d654fe51bca33c4dbc57ee47776e8689b9733abdba0ba17123231bfba4432b7d809c93833e8c6ba689bfff85332645d8fec2fc044dd291c9ee3ec329f98c0aaae9e3ebd24407e248daf12bf02016d071de80ee8f20c533c08b6f65a8d855b570e47071077a074f02f4390270e688f061b0ac073721ffc45b45bee3832de7ca6818d87716c2f676761a7a10f4a442dc9db7b09f59555a8092e55454a84b3b2181a2fcb760496c9262824c0a8658f5034d188747c4ba2a10e2a80c95d01dcc63d318ad691234444e69b8be6a7c93cbaefa5e23bceefdc8c334b9af3147ed0705f882e0000000000000000056adc0100000000a4f94f262117c0a58b9e69e45c9c2fe89d1d8c9dbf616a288b3c4857edd2463929dd6039bfba6e3122e1cc3d09bfe0075fd8f3024554c0682a67bd4dbba6250972fa5e1c494d11772c73a4c8bbfe3ffb2c8c2627a9fb6c503b2847324e40a39c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e3501fc673d8164a62bd774e17375a37ba8189450df5074bb3a17329a73c030a5ae6316ba7b3dcd21a5dbc146f4b84a0cbc333e739620dd335dd805bd919bccf70ce0d0f79065f3f54c1140b2e4cd8cd845842b00553fd12c9bb5f2c78ce641671ad4e26eb54fb1a29fbd10976509d804d6b8a6d254bfd9b367964b62fe3071c031f575847452eaa2c2c6bcbf7d1c3678463bcc812ed07cbcbafc531a84c85094b031457e53439ce286c686082501d632f27e6d17fb1a5297a0b7ad41aa6760e108c0a04d7244872f8948e1e3545c2a343798eff601dce60d3e5b1da4419bed98d14998c9c0a1cb17d2d7767025d8b7e42c40e5ee1aafdf80029f78d96b2913ac0a7a8021e303a8798a89e6d81c21032b35a0285f6932225b07df45a6d933f99d45368e9031cb8850deeb7d79d6203a6f1f2fd4ccb865af56f02c623bfd6c93f14d5dde60a0320bac06eed25442a3215f701d9f61a84825e78584cf4b0939a770d8a2c44a8cc0218a24065ba177a706aefaa5cfe8a41144803fe00715688b822a5a8be1391d27e020f796b0274fd5709f2d1295f0ff3bc635545ae826c1da7d617a3cb48b0536c5fab614f04bd067bf83f3822ea3f828609bc5085c97fba23346664205844d1ea3e1c11c9341a41590f13be63e6912aa01c250e81aee868153e3da823017a7df1053d0f4a39c6509591ff41520a4d23e3180d1d719bf12feb82f7f0fc71a2d523b4fd4fd0bfb10d366bcaea1bf231b2615d373d45c2a1b4483701da5d8d808a43396e0e648fd0b7b555e1fb6de537c1ca1b3b422a03fc91a7bc951a5b81551a18a0c5cf6eac34ebf318ccfb0b6f95580b1d49b2cb52073ecaa69bf8274b2716fb06caaca8880783356c47d0705254540fe8c056509b3af8b1d0f38ec2246505d27b9452536fda3ececea3d39370527a82301ceba14f58aed1a2fc6723998c42cb15be78854902e1d66d055716239b6c4e3a195eaeb0e968446d1868db700b971d4227f5985a0fde00eda6f2ca07259e383c50b194193a3b25f41867208dc82fd3838b93a2816b77f5868212746323ce79e5f742a8aefac66528fda53c39ed723b393fc727a22fe3f14494c871a7587bda5a7419662316ebf2d8bd860fea27d6a08e676b75bcae043d2c724d338c3741a4563da6863e41a4cf7efd26c6e0558789da14bb630385c52ea24c51b0f324d6b00393e28d13446c0cae342ab4622a68ca78d116a442aa8ec19f7fdefb48e174b17709c16a1fa9e45992334caf41b32af446abb3c07338f729efa6da3887f1eae5ce96541a8368b60d3f8701b69a596f9f473eea86751c3dc9d680e7aaffa8d65f73abd086cb709ebc411cf9cff69e0127647812c4d2f8ea3d91d33af31e7074d3207803f7fd3323e9c2a9239e28b90171b868a67f5a9f5adcb9d698e813b0a3797f9153a66a8dcf58ff7690137d090f45a249d536839b83615f2971c3d96f9ced301e910bd36a361b25cde2cb41f72b29b9fa9f9a0b7f6e4901869d5368f91887703f2653c33ae4889988d6990fe1d26d89cbae061a6e6f7a401f920f12241138f9a1f68c22b9d56c84d0d80b603b458a777550ec909706c149c8aeecae37407d2d669056a7eb84698610bca99e2c7453dcfbcfc21b6b62a3d84c92abe6d925a38bf6a1672740d865fb61f12fa41971cb92edfb65b7be59c5a7fb0ced489d47de35a5f6e4222996e81f843b41088532a182c9da30521cc8e17a49c607cb247ed65f7bcde841e467a5ab23a4e4c3f2d88bfec7834ddfdfe9fe5378b2e92fff9f7d01db941388bc408d66de7653077c372777386b7f1c34248d85b2cef31f690ab20da2721edee79a6904fbcca3584c19a8ec220fffdbd727c69721cf060dcf3db15b7a6897f1de14f8ca4b587b12160485c12814b2ca5040000a0e443a1328b8d77e9a6538dc73f579894adf8cd68c0d2a1356072636543b7bd560a81d3853221aa266569df544c52f85fd220195c9e31012416d92b6c37db242275a0969929786a005c1ca408726fdc51d3bcbf77b7e8df25db287707d37ba642a03b873bc6b863c8cc62f1766e7ee3c8942a277d7179d2f34ee28ea3db18fd01039b8cbd2376a6f793a416b94d953fce269f3a7d1a9b776f2b6a6b30bf1f4f93cb71240d45193e2c102ee07e9e66992c5f5af655a640c66e6d5fc6ee155073d10df6e72bba0e750b6acba0299faf583d23d186f6a25738784a5b4900f45662d65835b27e43459c8047fabd0fa2df73f3f4a13d0718f863855b2d36197d6813553b19145ac08de3673171fbe20bb8bfac4eb67aaa973a69fb96f19638d69c02a36c52e75eee9263ce65c0ad187331ab5cbb99497ec1b50ba3ccf1fce26478718431650e2991798fdf2a52f4aac8a3091183b50ab93bf4a878338fc31cbe20a7973c05e3680e74fa3eb0b", "52ac63", 1, 222470011, 1537743641, "c44013de32b25538c5b13dcd9c709b2e94eed496eff316acb443e3cb2048d5dc"], - ["871bd52003475b2898b0e06e14e99413a524969f52e937576c21373a45f4ed48b6f4725a2f000000000151ffffffff03ce2495c55146d0498f47e78811e07bd0eabb596bb863fe2c42ae303d3d71d00200000009ac6a00636a656a6363ffffffff7f79ea8e241fc9b35c52d29ee3057f6c52b9759505cbc676938f8dc6518e249b0000000008526a525365ac53acffffffff03a5ca610100000000007ca5f90400000000046500656a0f1cc102000000000563ac6551630000000000", "006a", 2, -1509465465, 1537743641, "ffd27abf003397ad0fefe6b026674d7371e6515b3562042862013e96f457f6ff"], - ["3acf7e5702139b27627a81a4dd7af21097e37abd26b4034194832f4cddb236e4893bc8a80903000000056a51516351ffffffff885ad3a7b71d0e8479051bde6eaff1f11529b45311cfa68929e9d68d74384e2702000000070000ac655153acc80e2b4d018e74220000000000020053563b6a730100000000000000006c91eb00000000004240d56ee7f8ce8ae58038e14e61b2c038b78ce8c58ad965a5bde1b5fcab56b8ea7c835cbaa4d463e08ad2c6614c5f4e7eff3c5e41a5f04e02d7517e8b33588f3cffc2b85982eedd9fc5ac9e8dc3ef9f22ebbbac07106eaccd48d264e9317f7200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c5598cff8fe2fbea6cb5f7df2f11c331de3d1dbcdef9144b785b20f6e05d2c6ec7ab2ab7af31d674f7279908088ac3c6d3ad73cadc46ba7adc51f43ded507371b401204c89e9e7ed35911ed3e943db5893425b1c21f6ca8f7f8a4dd5eae7f00d19ebe1bdff37d779f2f5aac910eae627c4810e535191f0420ef93c5c6fd7d8b8032548d3738534ca1d5102d7eeb91e5739b4166e6cd57f2f444d42df14853322af0211173b7758f9af40c2f2a009ffcf40b44234afad8712a259c2f33303b809a6940a01ea9959f2ac54fe6170a441d2d119f6fda0089f591bc89bd144a894c22a34bf27a8121778b0273e0c9bbfcd32a140aed57ab0541cb07014cbb378ad47bba79e0206cd7a4b499d5c9564ec5ae04b16677dc2f2560f00bbdbad12f84ccde99bb12c020bba17f5f72432983b11b7581bc248da1b45ab96b4fa3d21cccbc9fa959785d60222408fe61f7cde68e3b59e47fa31f55fc4f5b55c8f6b7f02ac6fad1dd797b826022ca38ef7fd9ad8ef2221cd351034a266b0e68128911f9623638ee4911d6244d603135253899f40d8fa1cfbe6fd9b669c92a826e94f193acb47eed95d78d1773b0ed4ead19a96b45a97e2a7c78f7bdd64fb5457917fee2a92e48893e5fed6a45c285a306f858ea17cacd880ee0021400d4e4adc45f427b97da2f5e14da119758d2f6f020c03af229b574b2ec87825c3097b4d888ed8e78696c7bed206b4f49b16283cd00bb1ed4241a7dcb16e9c39380a192527218a57539b372b23b5fe0aa6cb2615c23f83d417c39b481e72e726f33c0c24617b3a71fa500d7c96fbc4e4ed10050628693ef23850cbf6d711df25585eaa5552b438085707e6d8f63f8441f3f8b2a16eb5aa08a7eff2bd479e8906156d88d7bbe1a0054c9b82c3e60cd9ca3dd5a74abca8f3f2cd84bd558c3dbc0910d9115d2a5920e4c7e2dd7eeffe9f52d01df161924e65909c0646d8079fa97f02cf7b334a07108b80cfd134ba901ec87fe8c6c1fa5946df8bf1d9f0338dba9e27b2d30f15a1234f0c7ea73c06e258dc2e65416897f2335e5f824eac115d1960c3f284675ca29b6bc961c26b8afabf27e08c97e65008480958da34614be0ace88a49eb0bafde9c33c1bcd88c09b59f344c1fb79967ccfcc8c7e931e87411a4557a352c8de314042827aa2d87aab57ca7b027fdffa491e1cc1a5b74ea137c476e120034ecd3f355d3d894e0c185c0462dfe7a7bbca781ae3cc463fb4a2dd69b7e108bca57ded975c3aadfa18931037485a4c6a45e051f8ee762baa1177c8313238a66faba76c4099a40054f79df70e708a6af7f53559569bdc11b504887e9c40fac32be8c8dd892a3106d3f584a44b753dcdb2763c7f7f9c2f94d398d3811218ff55ce2b57cd3bc4dcc8be6ba9bcf3931bc7f2f1c4451d1a44a8683add9076bff3229d1576ea33d85d5d73e5eca9fe9803e98644678a8448a6fda1369599a0c847d515fdce26ef4303804185c4792b6481cf8c9b4a653a4fd2d6a3b8a01d3887808cdf42324581a2385010585cbda3e16da6030ac026af34095c1861c4c214a00fa9c19275d6c227723cea5388317a156d477aab7a5b66de87da92acbe343655db9d1acde58490d394adcd687d69105419cce70ef8d65b0a39f9a01a1fdd6f1b948b29d6748d2f23c1ed57d3040dc69bf0d4c77273f8369652e0dd8e808748728f1aee0051d7f89162cc89af486e6ae14b707e74496a1ebdcbf71a7989d8ef79f89103ebc2b0e46bee2d99fa6c6aa8dddd27f1411c449289e6eedeaccd9a6caff376248ba7a405f03b4461d1aba12296c32cb978d54e78a152888d8d41204154072677cb879439a6cc3241811874cc1e6242db4f7b6600c2be63c6ac82088c8188469a24eed862830dc6008f6e690b88bb8a197e9d091e19d050db149ec68607f9836f6be904d22de9083399427fa15d00c3bc2a619bdcbffa8a2723afee9b1706a2453d986beab89b0f95cef2caf8018b3eb97a6782bf62564b13d94abce55dfbf515cce0b4078054bf2fce5d99009bb58361e89305d7e4870eebad04a6489b6e7bf4dcff74d73ff60f4835dc74357e1620ad5bcb0cdfca71211e4d4b3ebf47349362c337d0706b74934ca1c7050c0bde5e470508d45cd284d069c034fb8d38bc692176dbe82b9cd2f88a08529cbc803c5bcb75da9fe8eae9f97d4a570fe5200820cfbdf4e8d4e2a5e36440f43e04029ad25e95ab1a46dcf818667b4ce23a2a892a27ae37f418b16ffa88f2c1740f2a4343720e487c48ced7a0d912d32dfc90086ddec73ad371e0f14e895e721d3eb4ce2a7420ba536c83ae1d91daa8344bc2a89b89f96235a6564a6b7e5c337ee8bf30d289cffec1be4889d63d1c3d4490a1a1c513636eb1832a111969e789463b938c2eee7966bc927ca9f59199d6f852b7e47124bba09", "5153ac6a536363", 0, 2126830952, 0, "0551d80e9fa73be738e114d3cb30f1fe31bff90d1102f8f3b729e2b94f4a7153"], - ["030000807082c40304e6d8e76c0e2585e40a598f9414ac0abe59aaeae605ea3f16406cff38cbb3591e00000000025152d56066e03abcbacaf52d82a01ef923f6d14853518478b490c31b8c9cb6116bd7be4140020000000001658174979f54c6f5a2162781eb98a5383dd9af37537743723bb2544aeb426f811a7898996e02000000046a536363ffffffff5d15fb5d67788d65b77928a8daae3c88d0e099a12a138a840287109461b0933d01000000085200ac6a5251ac6a6b12b92d0191d34b0100000000080053ac51ac5152650000000000000000023d33ae04000000000000000000000000c2d29944242f723e014d8357871a520c751bcb04a9440ca79329331c5522d8fce2b0eb45c797db49d0a0d67181408605cc7faebbb073b37598a0dd8e8c72d867b66d4558298130290f45c7be512589c16fe2029ca0d946adad7393e0d94376f60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c9b545c39716362972ab73c3432ed0dceafd5de87af0793cb91397c13e60b26d02fe825427d184e55be7e426309d93a68ee412e4d95ed6cc59e418bd53db13c369815f6c1f4092f04f6338c0f7225fa7b581f2a64f609d97cec57353023571ea092b16ad8c7d224a9bf99b47ba0293b4a35a8f205bd44e8626e193b90962e00209acf2198b6211be7dd686b74e4346052bd80946bf75d5dd51c5a056cbc0b8c1031401f043f31dff40b16941f1438fca7bfba98bc2907b46344b708fe20b39ec6d0b06e842d5ea030bd06a99849c46623b25a3b76bacb92b636eea01ac76ea7fd5026ffa4608002bb6e267ddf239033902c947204ef030419039894984603eb3a913022988e67a64ca6e611e20a9c7fe30a4db4c735a094553fc980eddf9b60816e5bb0222193e496e4a22f0554b99b5f5d94638f9a70dbd5507e5cb6d2b262c29c3165a0305319a87cf71e88badee276889565d608ce9cf38b3e81d19dee6cf4fc1f18438020c0d60dbbec19ace63fa1d6a23d7af8d79c4bc66cd6a6a1506d65c59b54528f102212274fefe284e0e46551d6e345fcbfa2c74f8cdfbcd2134c8a49c0f3913cca4ee647521f272d119e9dbf0d267b0ab6dc5f15f25f6cb290923251bfb21f69c8e6113988d304a41e77dc9e0e7a8ef74f2a7cf758da065611409916a844c5bc4b9deeec0bbd6685cca599601bce8af2cbc95cd08a48a319719291afd4a18a7be4ad393e066ef234164c6fa53fa81f1d5011b585eeaa2a40605ee5a938d8d2bc465653beb6bb78be966b483058e0c1c44da58763ff3952e8537dac9e625257396e4578bed48913ed11178f638d8b27b42fe33fc5c47ab7326f82c6a12ad0d24c67bb999e3da17dc5d8bd65380c097d0784a1b855bbd9692f1b24ff0dafcda14cabfc8ecd6376d12b3e7a0f1a8972e5077c662c60ef1dc538a93073bef44f76f3614e801454e4483b880383b8542619049c63cd9e0e87f97cd3e556ca5f6c60da64e8fa8740b59cc5bd6e9570f157b8b7125121b0678685f1622b3b832e50e4729389a51e219bf36158ddd6eccb13860bb99277173efdd11298c92cb58771f5072f3d5e788f401fc4a789807402b132aca98bd1d2716d276c2d4cafb6c4c438075148e33b55f7d32fd79d4bf3d8db42790d1ccf602a08ed6e6eb79f54bdad8c1cf3eb3476cd9ee25ac626ab26f199e130285b3606e366b58be6069478acd99042f31c6da6e3501b21a4d5975107fa53cb6fa579437f81d3b619e1c51f5afe7444285629bc0bd3594c93be0fdd0780be58a366175e4838e02ccc9f1cd6c8ce5d75f929511ea0319cc3e4c14309c1ae054791b46bdb272f0fcefe74944a7127a9394e6104f275078d237f0815718d36ed1b77976659caa97168b29913057b76fdfa82478a08b6811a202ecce6c79c87478d918c85de535dd2519d1ce7102c159107f71fe0c9a4b97c70203e4d9779a45c84732ec5e5ebfdb01036cdcc4a1ab9648bee1b732e545352e7b877e93d206ec877ddd112ba38668574d5f81d89e672d0b5798be361d5d5cd614ea375c024f16b9f0befe4a3ef9b22357164f38ff5c9dc96abfe7cb0f87ddf6821735a123da744a989ec1b973c5cec03f3cf6fd9c32348671513540bfa1d82999b20ee6e642b7d22f93e5ac72bf7e6ebe5e982b5d3e79fd1049873f4fc6f4ad22950d3053afafa25119cdbba314d346e9f1024d54ff3ca53be102cbd5da89cf2ce31bbfc9c93aba76632c25aa9b9e91803723cca597a20622c40db6f59578284ed9754ee9d3ede644aa0b1a674820b1f5845a53c91c3de1f7b558f9cf8ae80d5e623556b5a87b5b5dd4d46035b575ac61ad6b0defd1c59cbb3c2725292b187447af70b668e2cfdde9f08d5259ffc739a5202400e0eb4389501ce84680b625170b1af8a209a3faaf6e5a66ef4fb8edefed137203d6ba8df4413c9817ef631768155811d3da84d71fd8be10496859fded200d4dfd16a8b1c25b4e6dc67a7b332461559cc7bd029f25e00f1b2fa0cb11d3251ba76efe547a5de317eaabb4747a9760f97ae4f2f2fe40f9bfcd4ba26349d5d1bcfb97e4fd46ae0a87c919c22bd0a0f0596527a17b228107f321b131c69022b6b0b5ca53b1e7b3c31e72907c1605400a79a6c956bf48a958344516c8f5dae4cfdddbd97d5d95cb3b08b3ca138cfca38b6ddf66a661bc739215494041f16e5a975efcd287e398766f3b5de8a3109f283ba9a45295ae777754f8ed9101ddc27d07cdcd6dfcd89539bd3397b868202b9b66f70b095251682b35a81b570000000000000000e8faa50200000000bd44e6229fe9084fc89e3ecd152fcaa9f503d912c9d5d528da354dcebf38f3a05ada924b778ffac5778d05e2378ca3bb923b831bc6fb5fc598f08d667e9cab23a47e11a64273a3cac6cf0f2a7b789a610fe9c0f9fb9dd1b10bd1142beddc9b08000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005a590577c822c8b09d001f7e5657cb21a538571abc99ce46d30eaf1bd8fbb3f7d4c7154b466241c3b9038ccb465f1dd15e77f59034dcd76a5dafdd0785a616dd235e1326869b72b57a836f4d33ed3b6e3918dc44e0b4fa759743ff81ca878fdd2c506e7ddf38c05c08537c0eed89625012359ae26ab89ce04b06022869c5c1b503294ed5a0592175ff055efe35402770125c65cef7c3d0f1370b70b39bf324acee032ecd35c66202bd264beb3d6f7ab023b042239ce2de14b88540f01ed40e51acda0a03fa6a0c373c53e25198e09bb91dee8e2c2654c34060014d77954f49495e290624b405e402e035f1fc71f6e501c93a2b174adb0b5eee61c7fc9d65549e9a4b32020ac9c9a84c3102738f3276812e1686f7feea4efa52182b877f9ea07f6f06c16b03084f77ae7a5a8d4aac7864bae163d13a6b660aa227111f870faab3c742cc986e031ba3414b736fa99b8989bdc14669e5b86a3042ee0268c836cf0da3812604adfe0316cd5d0a61186cd7bd4484fee6fc734d19ec9614aa3ece06ba448d13e5d3a016030e2da402f262d608ec2b75f70f549bd3b11e0613bd532106e7a491e94877292c5dcf00ef6b07ac3cdaf0820aa8541a968efcc8549bbdb2051916c05ffc68ab4291fb8ebd688d4d3fd14eea7ef894c2499ea5dbd844c048197c696996b0b387825816bda6542f9701a4c29ab43de2a9f19f1f068618686ca37f4fba9b160889750f1a861638c1e0c178b8f43129c6a1e18a15d06398c427abed838a9494af4547dbaeb0d81b9274e320dcd0a4373b8b29c0468eb34c24bb45ff85a3b41dbed51090f0aa75998ffb69ec9b7a1518b95b8d89264bb218375d621a182b5868c041fb1edc090c361a17c04e836b7314425fc6d2197fc0384cefe741a4875467eda1249be8f0cdb73671ac9f0a352d020c7eead1783bf8ffaaef20f970e99c50c0faa7d321ac9b82b0773cdd6d65d9d49bd4c4305061fcb1b5cfab822653d517cc6bb6957effa4c12e43dcd979fae34e568bbca4d852765aa7be7cd29ac516d14baf36a7579637f258a66c536e757d7cda64b27c7da752a4d69d6a4ab159480fd352e5a4d48495b7c46f211f7df3b9d196a325f6395ab73e35fd3786d2a32d9366fd4f55409f2c598e3998fb370cbc0f08f0594638130daeab26faa462b24e6509b60fe78b709d734fc1f71dfc55ad79d67e8d97e94b5a20bc28eb1f694dca0c2b1012c8438fd8dae5465cd7f4127f5c6fc8fe54a19144cbed0db2fb0b46739be9c92c0b6836bc5af32daf9b2c625a7ea8f71135341240768965e10a817dc5ce5297b4310b7479de5d592817ebd69f4472f80a49e9eee8562455a1dc74246d89fb1f44db29122386e850b2bc4285ca114e54a950d5be6d317d5fe743a48697946e707a66038ac4530b0e38a3312bcceb66571fc9c0895cf27414b234b8b26f5475ef9438ab8da915aa6271f593f9a093e48aea721ef1b42bb58d49f7a67ee1b57fc1f3311be2a5fa611e94e379dc4707ce4d8bd2e3685a2b149937c5ef665da8a5deff074e4aeb54e460d82eeae478f262392fb4e7a8f1851e18e7433c2df63bcf31341a6782c8a825cd0db6d376e8c92b5e634baa5dca893d174f2cba57df2ec30ed5c76c64a208fdc2d0cc7410fb9d3fadae8034757bfd132df136e2d62430be777f27ab1d092f6d7fb1c3f50ad7bec7889e81e7c2869a69a74f31e486de1e912712bb6ec3e3c8426bbe6c8bee69aabdb68021421ed7b4c56223aea098acb38154670954b31801c9a1d992a64176397d740c43b8defe6dec728b02583c80ecea42690a6a6932f1909bdd0a291a1e10190f1c0a9b7872ece51b8e94d1bde5313a06bfacd547fc0f1d288348bcab84f9f3b8fb4f7b9c8d14c7121ff6d6a6c8f22f821ef7e0e381d489c29406595b837655c5ac3ff5a5ba9d0a943fab300bd15968de6fed754f8062498a46e0fd7e986fe7ceccc7537608d5f26469e61d592e35a6ad4a9a89059a063cb42161d250c8d398708c41f44d17a5dd5aff43fcd081826d02bfb70257c0db18a6744fca97ac7c82ac495ccfaa84bafe9abde68787d01aadcbf410a00635012956677a00854a8112c6ea0d1a1545d1ca8d261d2492814d614970e8ad834266e8deac5a98c3f265a6fb975ea8b4f64211623e37c52520aa09ba7de295d4170f9b5eb46e40ffeb7cc2e9c202f74f05f8a86c4e9728c3eb402a638c1082d76c5731d3fa4a4983ac1cc86f8a55db78e2e493f82f29b19805a6f988b19dfcd45a6299a157aa707a4412b06fafb2e2472d2ea15b1a50ab373a97efb8b61180580151d5a478f01a2336a5bedc7140ae7925d8eb8e06c8b39d335166fb875c9e93ade90941c1bc2dca0b549204ed0725bb112447087cbd9a078035cbc2b3c0bbac8849a9d124e104cf4002da0f97750f", "53ac", 3, 1934892816, 0, "fcaff46315594d56e1f9e5318c13fa673fca840bfe90cffb6c46b349cb21ff8d"], - ["ce17102a02de29ddf0bc2410581e14af3acec7319b11174d0e23f70f945c9cb3446bbbf0a10300000000ffffffff424ab9038c53f9c72087db0c31b85b2d484129a1a5790ef1fc9c9f1f63677d24020000000100ffffffff01fad61003000000000653630063ac008e3d596000", "6a656a6563526a656a", 0, -1623204704, 1537743641, "ff97d1901baca975ae53353a8e88f1daea7b79d19e45ef65d66f0cb5d889b4b8"], - ["ce14b51601ad3c417456580064137e4f796fd8add0a1cc7c29afa8a7688a6b51dfbe59f65c03000000026563368b8c2a0141d14301000000000865525300536aac6300000000021b5882020000000000000000000000007a214634368b7b11e1655da6d86234ccf8f0177790ebe93b0a895008da5e6d49916fc9ed164b7de539831559b8bd794836a9774b10e397d6c6217a2b1a6cbf4e6d5c3db95c8cc230461d064523964c95876bb743be8c8a784320e8a847dcd86400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4f98db438004386452f236b8e1b908fd6389c47b441ed3095dff6d3ec61d8e57797e39a6b190bafb0cea1359deb47e39ed2dafb95451a798449b2ff4529a0d9ca0c7f4038e8218ab4bd035304000f0d8cca1176535de1da16d67c13c785182ff8d50915e389e546c4c9787f27b816855562ef39c503cc4c63a9c8181b54c5e8021d4b0873b0418da4d3e625c235ffa8a0bf2782dc287447d5c5b183e5911330f502207be6e9847b696b203788da5479a68719859849b562a57fdfd0d6a3db68008e0a00feefee14d44ef347ec78c97ba50be8a4593b63c6758aebbbe3af60b03f65c42570f80f1da88622b526cec03c910b734259f95fdef6a0d1046d88841fee390703088565ce869262507c9bba0b86dacac7b8fcbd2bdc99dc091cdd1b14e43e8edb020f8957ab76b7a7ed256f296486f65cff423d6f010eb15b9fe9bc697c68d11fe002006393c33d7f5441bec4b9be1ca677825bafb53020d804b199e8aac22b9dd5ed02238ac7d6b8d1e5a0df3c055e0f5727d56fd95e893873dc067731e7a8f3e989a80228bfabd1a2e02e5c4109f75049e830c88604cc6e32d03f91b1de72f125bb5ee976212c9997227d13dc164ce41e6d202d36f50a89c0ebb356df30b389c04ac8b7d496c6e3add01f00bb6cd72c353cbf2818bc3e2cedd9ca6741997c72a08c9393ff35379c21d738e2e8f38b7220b69ab5571e9c5134beb5bbf751ac36c6d1c9994ebca1aecb55c2a4e620e7c25400dd7ddd903f0816b61c46806b8878bb57fbec8e4fb25a0dd03f344c2803f3c8228b76f01a304961ecc05cc455821e53dedb9121b8ae784cc00f5a74986537356e23fe79419d09cdc98fe1ad6ba802a9989c937e61a20afba7e50eeb0cedad25fea3e81c420cf58cf613251698be75d76fabcf363533205bd031615bd8cca511dc89ec88345240cbbea9e6d890a0b1151c5d9132514801a70716be6dac840fb780d745abe087c579fd047d53137e330c357e3ff84025e7e766aab4383017631811e206fc051cf57b8185f05cd3b9f02f1d37e1010b9ac3865b8b887155c4934c19d825cd4a398286a8ba6b93725d5dbbaa941e88022477ae89c1aa78bcdea5b695376377bb8373945b4970efe07d6b2665a9216a5874f72c8f91d8ed8bf5bac0823a4b9af0b03ea0af8c0e2bb886910ed45f9a82ef16446915c25e7e96ca30bc2741333f580cf84d02c94031756375099862c4d39938f0a563a25c07d46b50656e82e5f98fc81fbcbfe77407b8c8bb17d060b3604a79a4abf0ff18633ec7caf2d7897421eb936826c061b1095291fd253cee2518c5def3575e00ccac0c372e65a95aa11c2374de9003ba8c52d13883bd9efb0aaa2e2cc0b220af6203d4bf212e40f7bf1f34d90e6b85c2ad445a5dbcc48a0714f693c4ce624d34363ce763198f376caf6bde31445c4ac5b4ee9774d5c527a96a5af72520813c38bcd945c37e3ce355091db333bb0d5a325fb34cf86a2512e12bbee8502f9070538fca520b1642c802a1f59e6e5c60a1537abb68b2adc2e81278a9b51714496befe828324a87fda3fdd1fdf52732c3057b9ab085ee9edffb05d53b6106f6a06336d6dffadcaf34248e83c063177163eb40f2dca3d74ae0fd3a9b0d49ead312628244d4e033d07fa2ecdab4f1fb3d7123305eaee8f38e36a93da8a3d4ac7b1f3d2579fd69e4e018d8337516078b16af4f26c8a474be1332cd52a8caaa61bd6e1dcc3ef201207936464547e92234b9e74a0d70380c8cd53e50490830f66a5b9054819fe78631936b5755015fadc6e82c66400aae23c9ce1bf34193f4f564c81ac6a67cf9b1d2e51595109b90ba04fc263b5eefe764032e995557f69b346d514bdef49743f6efada303613946b38120150d3baa394bdc8d7c26602b1652e3d6e7905327f06eb763cc65ffe16bc856e42e40f34dc48c45a3ccc49e3ba451d3909f5fa526b2860ee3b68ac576831fe765b7d076c5aa049545d10efb9a75f74feb04d4afeee457170e0bd5a821c48f5c5389f0d13d23b6282f70416afdfe4a1a87b642ff56b200ef915a75af32625c5be6ff35487d9452a5a8f06a8ba0888756562760ad7147de531cec52b7ec457f7a5eb337544030e1e983c34829d8fb1487d2cb08faf8f753326bf98da50881f4fd9cf551f9becf06e8f31699be2003fe81fda45be0ec223ffc8ff84a58183d961737ddd6ab01fdc286a5b02b4c75457385d31a9dccb4a98462ea42050634709bd03b189ce618b9f3e98cc41d458fd3c9eb7162e48242fecd56caceb5590384cbb66932050000000000000000000000002fa944fd7ee5356b96b42988f11991781f11f3902d4e427dc2679378ed88e2d3ab3fd98086306d3218a0c256013fd1a5e960a66d1425009f928ecd0a6ffad77e2241cd430a89fd26838dc7445032ade49c817dab9e639677a06b94950a5050980000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093240651fa0ad859ddf5630f85a11ca8ec2f087142810c8dc35e61496678fb3d343c7cd68409ab6662afe349c5c10520a74fc3ca8d4dcc17f1c71d7d61ebf1360212bb88a43678dfeb630ade409641428d6b23762d55dbd744a44b2d6403285af1536fe0a06af13bbcb9836bc2e2072cabd7fc2d2a2393a22f02bc5e772fb642020133df175e6e6aa53c91cd064ed3ac030586ab50757a3de35b0bfab3532c1181022b6509dc7fe45e8369f79a8fd499ffe393e5e2c8ea23249c2e8bc9c57314d02b0a045d6ee03892144af98afbb4d82f78b97ba9553c496dc90e0c95a47e77941a0c0df4c3fe858eb58da64c21791318773d252116ce13e72ed5db6a696dfb8b2cbf02048c6c8d86ae9f5b16b255a8d4e888bb982dfd58d4430809874937300de193d3022fbcd8885d9d7153a3e1f93fb33adc726140a8d01b4b432bfdc699d81074a114021cdf2c73368c531f7e56c048e500f5ffbd3c6f114b28b426568e56146c69e3a303202028a2399b43efc8674548bc9715d151d4e1787a236a13945e8a98ef57a3660206b200837f3afe927fa902ccadd62f7c900ac3d5a1752bf2989e143d7e56e4b67d23392f6736fbfb11d6535ca36348a9a76e173b5676603fca7dd3dea0dec4c1cd520fa5208f702ccd6d66e8570054b3b6c070f9272f4e879bb81c8b8252339843738cc9ca847ab8c1640aaf74707499a5154cfa718523de3cf364e64be16a342ba2945b5e385543bf8c6b78d9434d4c0b1354dfac43d899bc9041a89f78b011499f0cb7b0ab1ccb31333ff99c48cc9fdb6b692e58f1ce51cc6d903e5229daf2faaee49fbdeee17c0786a5693206921427569cb70cb892bae19b9f10aa89ccee9c21035fc07c503111a7b8bda52ceaf8ae05b38475f09246b00ab0ebb2abd791c2bb13d1858bd59648d6c43cff716f6fd758b51da41a11821b0b609f58bef2417c2c5cd834ade37003dfe6f32802206581392b6f20382a8a1f7b4c8d491c21ffcf53aa3c12e9031a3b792f8414b3f0149976b8075ee3da3168e1ee0d3f79ea94f602ae15854d5a6467c4570fad5da7c56b34c8f8c1b82f462b19bb26d9efddb5f0a0c8b749a263730eb0aff1519c499dc5edb6efea4e7371ac2ba893b994b159ce70d22fc101dd565224ab6cc4977a6e86ed8ade474b20311619e4ba199e808b469bbecc968286ba2c16583114d7edb43a94293cac86d530c10aa06234167371a9a45ebeffc69fe02c1f86299a0a2106f742ab2fe8a82f2015aeecbfad669b84a55432f3be944d90c492105dfe63291b4e0750692e745ba20d9c58838f45e3329d19d210b3bc16153287db8bf618c22385e4c9e9dcbd72b19f1a68f7283aeb7c10493020ddf246f00a16b5e4003e3e63669a8db991a515f385010295149f547b8c227910166c0693c67eed3b20500cc805ab557aefeeee6586726186ab97e03a69b79b2e3b0d45aa6da0f4f5ecf59d014a750a9b9a60f5280e998b91b196115b0c683bf3dfa31504c7c4332bb972b4d8b89eecce7cf45b2392bd6757d5f6d4db97f9ccb12e72299d86b5fff16cdfb3a87ffd560c35362cb02a3d24f24a7d057c7bf936c02c476c8f70f2b05793ef68792e4d00107543e9c9ad0e622dbe233c5dcf8101e9f25b6958f3ae467481e261b6f514851f14ce0169eea288378419aca9972e8e05bdb5d8c4166dd58de0b52ad1d6c9f6dab76d9109c7de0d5f9e5e16417d26e27dfd61de686c552e01d96d5baa19e38d09d901ff57427b92eaa9f7cd9ad6bedd9db478720cd5c1d61146a43668a1d61b0318c66dcc90440919e1a6e6785975be4f35a4ed314bf3fd41f893f64c3065fe292e7a6a776f22aa4320ae1f81d9edf0a099688d1e36837a521e10bb7ef2ff878e2cfd3bb1366e1f8ce5132adfa4728fa5259d02f63e59c43a5d2edccdc43e7f8e47d5ae0578161c1613945304cefcfd670b1cf1fad7092eb07df6532e3eb395ce5a754d32579b3eaf13af5d3799cc28e1e7adf358080b84e382f2701d11ba61c1b4870ef701588c8b83e10c125fe9d85e5be03b85657d3dffcceb8d0e2ab2d0cf9fc9a096b8cedc109eb32c6e1fbfb0c0534914e28b9f9a25bc24866168ada68d78ad0eabc99e64dff2a823321fd2c828a7ad5babe155e15e90974a81335ccd973166b9f5444f455354dea6b8a347d663fca79dc6f2c6d6b0d2922b0bea35ac79f7e0a876a0fbae01f50656e66dcaf1b2eef523792a83c810651b5eeb762f04fa7b9a8452fbc04f3369f60523e56267c4875f540ca31b54c4afbef4adcf2bf94e90a27921bc3e9903c5fd4267526721737671ea2ae01a1e2fc6af4a4a63a3ba6fdf986e065afe73205a9b8f7e6506ad895a96ee79b5395e8f3b5c6271c5cd5a20ce48f43d154951ac2b7e457608b547e353ae196e51e8f61a704a99914209", "6a6a", 0, -182655138, 0, "599768128714cec7a11499bd4ac1b7942be7793f6db6e1ad1b9f74037a176c40"], - ["030000807082c40304227db609616bf9b8850fc8cf70ac08ad2009bf283d1154636c054e95d58c61e50300000003656351288ad83e49b5aae83754a96810f2bf15940f487b3dc6cef5a0ac414c85b9462d525ae3610300000000ffffffffacbac0bcc5283269e083bca5deaf06c38ae03868c52daa21bec5b1d6f0d11a24010000000200511855ef1fdb3ee4487d9a56e6c857e31ad641f220f2fe163756f1ce1bf780c9d6b18f9b8801000000096353005351526a00acffffffff01333583030000000003655365f3944fbc193898da03b7fdba02000000000000000000000000c36db113d58a11440b3f8b159ab4b4a737dc59f49e744335ed06245115a5e5d60fc32cbe416fbd4d29643dec16a7f65e853872c8e0088a71223a7cc81a44dde955cded3a06d29015afd04138a7b9bb053569490a95975a64b36375fdbb968834000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000efacfb1869b3cb65e559a1f5210f1018dde6d19ceba5e34d7bcb27f56e890b668d878cb2f888b8ddf859833fdbc958f55e4c6501ad4ef22c56289d85b05911a4d9c4f8d30e8196a5057a73204089c5c864fb7d5cd168fe60adb1f42b0ac30d37ef81b3390d1f10043045e9cfe9256f4eb65283db616976a2ebb6a29e598a8040217c0bb59fadabbe3e529edf9302676c34978f45b642e0f32fe452e3a61f67a580207265eec1d7a20ad1e90bac3bfc9486d03107f24c7f9871b2491533c52ddc5be0b07473b0991548b2a215d64c80e2223336dae7b60f2b1e13e2165111857e4468f02e685a2aeffe153eff68a1439960dbbd7ca22a54cc5797483e4a486dc1ad78f031f7e5d52199a110770113d08f306f5e7ada068dc5f3f1ba8a95cfad4f4937a58021a78285cb9abf40e346a44bd754435891b6055b20f0b909f6d378bace85faa3702152a9ba4971e8c5bc55a1848d476ffeced3102a9d389709d320870cf9a349fcc032d3b269cf28bbb698f8b8b9b060d2739c48611e9f7aa1cfd84d122834bebe95f021dd142691ebc6c60365a0aebd8a73ac68bf48895bce42619a874c6bc52fa265e30339b9707222ab24509b20a04786e32f62a3634eb0807fa7ab748479d474077bbff85531221fd8352ab776d8541e580f2ff167a8120ba42151a31cda69760164af041f1159b020e4f718cccef89c8729295a642408ed236abbd55414243a5906f97a580b3edf2396d0c4d6952d4c7663672f7aaddfb9b10d5472aa84764b47bafe61924341e86369b36f5864bda7358ed0d5613c5aa7d87cd07c31db8bbd47c53f5f83d96b8a4ea1e80c56a9893149809cea7d5b2d0674b9c891f628491ad24fac84672f3739565555aa25475c1da23e6ec21ba46cebf56c57cfa56a78592cae7be858f59d313a033ef66bee64ebd8fbb6fd08476d4a98134913332c10df4b46da8ea3d73ad4c6643fdd061b8bcea05795bdfad541a5bfdd5741c7237488e03f810a3261a9b83a5b5efedb79b7855da1884f3c364dcfeadfc32b39bf89ead68267e18906e968f3f0b3a015e356659513e10c3659fefc20a79c18f074128c55886d85cdfb3a639a6d9f2f404b0a9e6f85703aafcb4d112fac78118b049561e60a233a937413b7e3250dca1c560280bb2b212ba63e9977769777f1d83fa38b942e7c8347b6df49691a8c248b0b4e40caa93367200ffa67afb109e511562390d71f0e3fb965fd8ba769bbaf3b359caf94607a2941aab0bf776e94924d9a351eb4e4e9b99004f25818f2d9224db8c173c8791057a783ac1d391e49140ba34141562358fb05251f2961eb0cb8f381656ccecca990042e7a218a1aedce8f9d637059fa2f2c44747769ebc6c3ccc4993af6384352f6429d86c93ed9b90dfabc27cb3cb210bb4bc2a219856aa775f62a83e4d239adb36f45a7aa5109588a4a71b85520ecfbc9921fe985b69f3fa25e7bfa12e048aae852f220cd2e41e41292a9523c5b300706212a0b8071ca778b3b37e73d02d3b05a80f22f7aa4f8ef3b3b50deb2f76dbc7998ad9252d702e0a9d65c77ff372eeba5fad90dcd9ef1ba09bc3832c33b186f6acc755bb98c27af372a02405156ae0333ee3cba315769e0fb3fb4c40d1ac410e335b0706dbfa40d2361f43209dc6c06f4b930e882df6303726e1e348ee13c52d4e07239c2e2dabb1b99ac895a2e95ec9b34e0f88e04f9dc1e2206a7ec4326582f81b1a9bd3e2c42af2fa3253ea73e46cc5cbb68e9baf76fd48f181ed3e5e5cda52aeaa8521a3691f60bc4f6e2bc91122345f77510788e0aff9b1a75b54979e0cb99603e1b26037eae41ab7cc69bfeba9ffa1c15b13865bc69fa9a4195ad3dd4f94534603fa6aa1c88f843a018d5272f2741b9800c00207b63ec2deff877ca88b8069437fb17d3979045b0c6a763ade604476a1c3eb3c27dcdf85af91431e97ba7e3359207b93d0f47dc4459639673945554834d5073fad02ac917481962a8ffa23eec86158608f9ab747618576d099aea368be6cddf5a59d7661d006908aae3885c848aad185ad777fde160804ac19a65e8ddcc1c22fb8fe2d1838c9197fd3e5dc1115f7b51db88c0205b958833e172d0f271d196a2179276e472afc9036d4c40151a8788f7ecab51ae1870e734b5ad8498a1dc55d954cd26e6204987d67baf852c2ae05437978bf2533fa00f009c60dc18bebac9e49ec41935a0a61821fbc0904996b0c03ed676b6226ceee9d07100e3da10be58c50820a2799461b64f2e1e67302dd4a66cde4c48a7ed10dcd07df200000000000000000e02463050000000027c67ecd32963928b73397e907207e141a967a9d04709819ac3a43eced97f06d23ae130dbd745aaf3037ef6ba76bea4f1546f0f99ce70d96e3210a49b8c2e52a06f93bee49815f1d8fc7faf4e95d6463c562a97499b4f05d7495b79f899f90ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dde6750f654f47098b18e0e01791a48edc111e40cc108327b96c3bff3f074abb8a028974284d6c712ced7dcdc62c26d58ddf69af406f762027eb3b6ca643a57c146e83a45d373fa6d2f15fae7f707c3dcf7d9e91f1891a9bd0c89af12a31c0fc6e07e1662aaef038a22538e87c57208393d64ccf3f6299546fbcdf5d13423d2802245ea48051d3f0a272ff2fb73fcd65e89e7ef1a0a08ac397442ef26ca74078d0022f85c0a39823c25084c14a22c75a4ee0af19cc935afc6b83b62b56b2994210030b06bba75367378e34edaabe09fe2bc85b504ed872b0e20fb92a87223615d3a60ef7da12a813c3349260b4dc5fc2ef9cbdf2d7bdc70c0d23f8c9a54a5b67f39c160302b48f9f9c8dd68129c67168092d3ef4f2673bc8cff95d29a9f082f3ccb18345021c44830451aa2d25d38c1569dd8731e1068b07593740ab3fcd14bfa44e09aada021c529d2a82307b32c702c885a2d1841decdcb886be6d56a9c8fd627b18abda270321ffc841af4f45f932adafaca55a6b146b2c5fa362436ad0ab23a940094d84260304d873da450261211bcce5446649afa7718c42a17a882cc78fc6b082b330973a4e1b6ced32a5aec5c5de48f12660e283d2a9b1bed2e443d05164f3f10c93f1111aa24fbd41b3739f027913d1584233e4abc1ed9aa9d777186bf51a65adad288d6dba44053a8a2dc6cc572aef2477629ff99e11d306ca79a9ec40982b340d07a298337146d7dcda4677f202ac7ca73c921555173774fce0f9c3596bf66fa6f659f1b8ae54019a4b817197e8e0267421ddf7ea0010509eba66992d1bb2b39b26554153f537f9cb562714dee81222e89e9f584a6e9fb551262f6332aa6450c09fe740474d30b06567eab1346eb6181492cbb4387c89e4482a4d42f5f85bcc151943e6e26d80e6affb65f754005192cdcd89f6ec2d1ac2b0e4e31b07bd4753d3f582803be71eb65ef1b48577f50a43ab92afc9b9259396abe21e06795949fe7cf8330010f3ace2d7b95e9c515c501196a9f202a3125ab0e8621fbd5a210666c5ed80479e9ab147799fb9696ed28959fbb318605880e37524cdd37a8a3ab39bd98ef28bfe395acc59b417f2afcb7f4d535e93d275431e17fb11ba4149359ff89947fe6b3c29814bc0a6587dcce10b064c0dd90b237efb7bab19a5abb98b23cf99ad1247246107cab3d4eb92f9d866612b1be198cc2328d4bcad77c19ca942c1d284ab8850fc5539ac78252ab4ead31a3342223f09f98f926fa6a5c57079366259364fef6a85476caa515be19829b8dfeac62acd9cd764a9ab5451c4490480d0407ca4ff9233a092956eb1f67b5cad497ecad0a83a5b69777481056d7db40cce5c89d08ea88970b7593fcee4a809beac4ec29a434e7bc60aa10cc0cf5749e62bf9cc40ff27de8f7f9b3740777de41cf2a7049177789afd1038792cc8c23469f6de848d945cbada1a8e78305a6ab84846f2a0ec66dbaca277fcff472fc4a58ae8b3a9ee6af94a62e73ce6f04ac3cf0633bf3d35bdd3c533059277023763b00225528ff200bce424227c225d623a3e15ec1bd08e64bf5440d6083bc4ab1f369c6ac0b7e0dd64ba29752ddfa755a9bad8bf132246a0ad4484801fc00009436c3372000525c5fb3a65c5c44c5b6a895b1a8830e4a832df7d7d99b2e3d1eeb7b14e433cfe2a176fa06e9d12e2207b235a2fe7fc31650974456cfe4eaa144749503375c67fbc94343d9f6fafc32b17272dbbfacf38a5e8e7483cc268569f602347e1742c66b12872b7e0d889c6ac08363351347c55ab0417d1957823b66adebbc7d3ec108eb4b40a22996e6aa107082f632b00b187f9a4390cbbf79565a93b132ce0246f8e1f87e11bdd51a4c0e1623f0f27557d8d0039e4b4704172633a4fae5303b25d51fd4bb8d48c6fce417c65f18581111ada1611c0b6529ee3cade794b09c35029c642b348b6d1d0e791ed52eeb1da1478b1e80ada036248ca854adf0d1c75829203d78d1e0612603f78b4b3d13d81b08409a098a475c4df62540d4eb793f8801733f8d3a0b859456bec57dd8bdd4f98020be57bdd54c7ff55daa786c01bbc6409ea045a942ea7caae9033325cfa8feade5acdcbea3d4444e78944793f2ea14dcfda44de1162e565564cd5fa4d328fee8fcb84a54183d20fbd6fb5c301b9646628dc06e2159adbd63fd51dbe7d2cb2ae8c44520be0bce1bbc566adf6003ef9b207246df03475f3a1fcafc7d531c16981a26ffc1f969d4b90775ffa03aa44403e79a4590bcdcd0f2692ae7f095c12acc4d3b3bc008d5ba4c8050000000000000000000000002db8e4c301f0a155d1cf9b4d9666f013347b95b75d0b9ce935f1f93300ea7e104e15e8d14bd1148ab36b7f813f1a1b5f14b2f447ec05b7bc11ffe763f4b2a4624cc78791a52b81bd6bb889700089bb217ce9d5d3d8a1eeec6c7155d702722f0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808ee535d72eef7dba9d8d7a583dcc3abd15bb7cb6bf237bf5fab74e1fc6889d0ec129227f4fd904e3dcdd4600e33ec9e1d4cf53392025a6db4154aec3968fa41cdb73fa35846989c94ad6c3c6636bdb85d4a48489ba3fefeda8622c5e23786b2f9f7e88ffca2ec31bb931b30849577916b8a5a72d54e6235921005ac7462020030a252c75dba242395caf72b95689297eda1ca87e39533fc35ee27d8a24ccf8c3021c08be7ed663ccc3f65a9549732a620ee658569424dd47d6fb15caa85badb82a0b08926ae220fd57157a85b17930f9781657cd019a230fc2ee52dc6e210a4a956e332972ffc8ea9c0c0937c6b55e4e9b60f92b1d2d70c74f18b493af62b61d7fe203108b306c8a4ddcd1050e5840e843cc52b5b0c731ea7073ad5a5b9faf26419d4e022bf049b500728e7cc5c667e365e401a81e87af9745af3aa2e1d50cb80e41fd5d02286b42656f09e5c82f1256aed21e80bb85f1eee09c521bde6df84f264efa15020226997c7c36c50c3742b2b003bbf3d95689165f7ee930ea9a66543a1cd454c566020888ec69364c7837ac4123cc8cf3c0b3c73271ff588d40446cb8ca9a9d94629a8d0f8caad0d46f2d765bd20a7528e51a2ef7b69316b5c49387d4df9eb9f0cf94abaecb45c63cc9766e24de28d89c5895fb4ca3efbc54ec725c029a51f62c0513db2fe013046d439c5c971e71d8b75f24e985c836a01264d31fb9eeafc2169ab5c5faf499d8fac30819642dcfc172b5ba2a9fd1bfedd1ebb3973e0515177b8f46bbfa7b063f0354c2812e6702b983b5eab2141bf908416eb14dac077d9cb2764624a6ad735fe108737074819dc1b86daaaa89c01c32fad27c0fa8619d1ecd6cc8b7ba046cd3d69f119c9afaa551e7a1ebef9f89cc49faa74966410224e478e78d3343c32821dfab6b7a502d2af86bf25b68d35e739f07357be57c24c42af898ffada08d37dc5877ff365060eb3e49504fa6e34405b948204a34db6d1169f7d586242fddf4469d8eeee2516c6dd91035eb54ce2442ca9e01f7a37fa862ee611ed9e79b28da38037d79016aa10ce0df959213fb758a93e62af6645f563e36a8a02c8f819d9e53bd84803ffd799145d6494887a673d4da1ae4020c04a2df7a1fca41046f9039c4d57f817f20cf42e016535761cfbf6ad03ee540f41fc83273c487476fc9bff0b06b901c086617756316f184bd0f2e481e80c40f33cfd2eb4357b2ee5399884342af3b2cef15a82584833a47758c577947c45d189cf2fa4b9966716bd385d50ff1d60d36cb1170f88e68d26fb9d324bdeac051d15033bf5c07fbae03b0d21ee04e0cbb2d66b966ce3e8a58986e783143ae76de9e4b13246ba7a9cc71136ebbe324dfac283461ffcf5c52fcc8a80be3c9be54a66097ae901ab256a6e10a36c1343cefba5780bdc2e986662211c1662f79fc9b3fb5a00f01cd32df27afd58e72ce8046dc24dde2a0581581ad61e91b5e1f6b596eccc100deeb33d1f99f2625d61b033824866051b533a3e1eabd8f32dd795c1249b0c58ec0f08e9a2c8e93b90420c19cc998ee5b83f2cb6c10f830c7fa2097904e8eea317e011e009359f605529780c654c669676871762f6b7d8db72f8f77b8fec3c25cf23b2ba05f0e42cc7e9d5e32c7678dad7f0a956ffc34ed161106eb50948b42a24649721eebc1c5b59cf79f64cc9c523ca03cc65c48fe8d925f20636aa393910c109b5e724b3d890d26d9e45ba5e534fa8c773815280554e2068ef9761d13b577c6d5924716e44239f33a2fdd97fd7a0483a62fa694d0cdad91218801070b341af65b9cca6e62d229675fe188fdcecd9a015e55fadd49b0a61eed0120a46bfeab132f2805e5d97eaa5c54d0615c6bea6817e8aea52a29138a1d1a386acb71853d7f79338aa30f1e30a5edda1be7313936eec7cd374a65d9f67fc10e5c0e78ad982d60991b0051f09403f2c248806745eccbca3539491bb079bcd0acdfe005db0e09d769da44c5d4510d25314873c3c4d6e36ea693d67c5601db6a0da636828cde1ff153c9e2f5637f32726883bc2df094d90ef6ab4098d0d70c8048424c502278dadd4ee06330ce5f800daeb78b74e2bb937ca0c1cf6e7a10cae53adf38abf72b661e2928622ff352e57cb7fd591d5661c3ff723161c9f06ef5bd7d33e71441b86ee296c122ae334c480a6ff7e2ba4c77467158bc6c9f7d493fc8bdc18126305bfa760a60efab21d76ab3b32255799954818edd58bf0fc30f7fb29218547e4c8f9a341007d41084756dedb6863d649e37f0707946312ac8828af7e64d70be16d0bec5b875113c72cd92d463422ae7930b0961e9b9b6ec04d68bc3a5af055e8d910b096eb8d13543eb6f4e7b71fb397d41bb7c36fbf1a7680d79bf56d5873c521af6b49b9cfe9761ceacce1bf27f6638ea724dd123e89f4109", "6352526500516a65", 2, 463709879, 1537743641, "ac81e4b5267457055c44cbe43142c86bf402036a307e838e14def7484fe61028"], - ["030000807082c4030182f994a9a2a1e15f2b24775144f3fbe519e4758df7fa8d670c6dd2042a436df20300000000c875050801dff0d90000000000016a5d0ec4bd0000000000", "5200636500ac00", 0, -344090194, 1537743641, "073d9ae130d457bee23db84c0152f5cc5b8a014f688efa9ccbe9a3ee3a1b0289"], - ["030000807082c403030636ebf41a3418111e0ee5d3c687b0286bef70e97a43710b4e3f3134627272c700000000026551ffffffffde12b1bcc05d09de08467dc2210b6b74f0da92d0ce2ebacfcfe3147de97753130300000009ac52656a5353006a53aefbaaadab1ae9ece7086256b3ee6004255688fdf1f110a9c0d5038a8d21070b84381f520200000005ac65ac5163ffffffff03ab686401000000000653530063ac65fe655b00000000000300636513843b0400000000025352fb0be4507d19937501abf1b4020000000000000000000000006b85cde49026f059fadf628f82a0d998da0800cf1eb2078071d26605e8bde5ce5acc80e460a125ba8beedf22957595b40dfe0b835cd4b10dd7a9ca94535176b80138127603465bf193ee987e558b8d8b54b5eec5b1d0abb6b09c363e28aab87100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000583f2ba8d32a84345018be6e8e8313ba1a5b202ceb6ac701fe62ce928a7563199664b0c01a858c7a3aaaca4972fbd86ab225d8df6d717aa8f9aec420030864324d19639307f4f43c4efaf9bf42e1190135007812ccdce23cece850f587a2c12fe8c2b804954f3c3a5a9993892f2db35a62955249ff82fe8d910cf0e4fbd0c11a030c946ffd05c6b79d0a9b6b6db9d4ebbe460709f0ffc6889bffc66f8526e6c2bc030f7aa36fb8187d5948a146f1bff5a44ff088e3ef4e4363d955d2aaeeaaada0300a060ea004ee04fd4ab953d5fea32f0a587dbc0c69968dc8aa89a3d10f18d6ea1abb08d349b8a9e729700f6e54e8137000fa8126f607bbc8239cae1e183c0fc061032cc3ba60b858911128271b81197e8a1b9bcd8277f6256f0b89ccfc643efd94830201488f2dffb390646f1086309811cd5d1848b1c4c8c342ef8b3bdf3f8c8d78ef020eca19e8c79b0cdcfa56c82fe9c1b206cb7db2d5ff2e8128f32a6edc39f5f8630218fa09dc34a817a9aa04a6e5894c5f5013278b8758327bb17ba40098ebe685380224a169e997f8e9295005a6496dc7f81adc89545665be0bf0e33fa371e19662a5f37e5ac4e684e5d96ce6c1f5f04af6217cb3cf1a7789bcd8634b18f25607ec48ff7f994ad7d9592663eca85a2110a3c43437fa019d3d5608579fc1e37b867390d641e05e34638b12c6dd65fd5dec37e954444501a250c5aadbb6c0036f978cea84d05c0cb78e92690bce0b168548fb15eee1d6b7bd80d0e44bfbf026bd3204d1d174cf61f190620edbf2d70e54673f02aaa31b194ba058f138a78137be9cc02f05f6f6acb61d771d8b2623e275986f45cabfe376c65f481f350852b0451a238cb7c32ed5ef60929922ebf479505f8ebad03fbedf52cdfe08c4d19f2386cf12f1149d652207956cf1d8b90955250d4c3f01795673dec979c2afa22bdf88382d3ba1881dd268ac0c21f3b0f1aa969f0c0bac5e317e7e225b7ae06750f54803a94173ed4fa0d344b82486fa7eeb40a330ce3169e8822f91a664923fc1f3c67829e5ff9c4650f44e49685e687429db8b79dcc5190068f6f5c53517d56dae23e98e52652175944f70c9f7f73594a7e5170904291b3aa9ed262742e569c93e5d0ec490ff2dc33fef45ba27bccb9caf6023efc74c72e879b7e70ae1a885e27248d9ff9c84e6e3561478e9993d931ab9dd0b8eab9367674f61b2c7f921cfc6273932813b83109f17eb990490efdbef0c88fd8c83cdf6068562e1ad7caefbdef46ac92561f9b4541686ce82d78cfdaac08d6e528b8e67cb701a59b790658c39bca92c75d13dcb80fb9d3a02546a00bba64c1d356945940c14037c351a08d136bb1363184e9eaeac3e2d241c5011fcebd2f01a172f3acaa218ac1b9e4cd00e959d78c5aeed60d95d5878eb35a0b355ae1c779c019e3993eb7618358c65cb8894cf850c75f7f4e9a44ae725dfba61c4fc2a27812dd04d021584e2014e0bfe1f56b14b2bd6416119e62723ae9e2ad0019588948fbe7d95f541c1df199f403cdde230ab26af4e3da4a0ec84e9540c9253d8aa4ab9d24e9db9f09b0b8708cbfd9d43847e455b8414005155f4fb853ef66bce36936d9417405d78e2d90c4f95c56652c325e7f574fbe7fd64ebabf9832c3cd2c5bf1f550a7a8c6648f0db1c390a020dcbcf684f8af0abd99e122a946a660848f0707e2483b8543252ea86d17e59c67c655b5f3ec01109531fb4912a2b04ba60919d05c43adb7a940e72fbfb14ee670012eb72b252cff415e765c401f53960d2b6a159644f7253bcbe7b3c68a4b5064a4e2f7896032610613dc37a14e6c0dd1fd3cc37bffb65dfbd1de840a04c66bce9a3ba9b6e0035d7adca360fb8c1444084d0d964fb180671dce19538404c503b0bc9deddd32a39ec7a1164e49b5f30e19fc378700970cbef47664e936ccb7f1718eb44365ef0cc110be329bc9120a3399eb80e300a7e2a2f995cad1b4e78d0289939afec7960b528a5ed0d2dbf625ca9052c6e86ed0c8367b45173578cb01e0e7a1cf2ecc8b6d70d39fbe74d1b92dad7ccb49cc412572fc9c04099eb0c41111076bba73cd2494adddc5bb522b7d32e21df6dc753a5fc99e28bbf8d41980f3c0fa9efa77778218ff2858a675d623d7c0ef958055001383d3f871fd2b59119dd6778d482cf5d6074b32a5899983f0983d245c102d46e410e2bb774abe3c0d51264d448063f535146078a58c68fdce498356be15aa8f60b40b8502404950a474adca673e45aef83ecfda054062c869c03a04939dabfb0b33ecb8fe13daf67d5dc27e639cee9a3504c328961bb5705b66c74ed5bfd2a29e90521fb70ff5adf8c4860ec8f626ae4b585d1d60dfa135d050db986c7516d620bd8cf8fe91d25a2cfab7c18685402ee563e505ed6359a71ba781317ba79d03c79d309", "52655353656aac", 2, -375801056, 1537743641, "0512ae2e7f8b0fc3fc9658830f1775bbb5e93fe7c03e09fabc1bf7e42e2151cd"], - ["8ff35c2503070be17f146839cb7c95f0f178efe27ad1637d4c8ba98ba4cf36ad1cf4130b0a020000000952ac655163525100523afafbadd7a0ea35bd66bc6d37afd7c96b9a473732ce965551ac700206398d9a77c18b980000000003656a53ffffffff984c121a4322fdf11ef51ab279045b100684bf78e40737f352ff818cc6da0dc50000000008ac6a6a5152ac6351ffffffff049e09c603000000000263005883b30400000000065265526552533d06b601000000000353510094b4c20200000000055165ac6365273850c000", "53526a5300ac655263", 0, 359216142, 0, "f72310c0c1695fd7617a0eaae2f825bebf8dc495db240cd8ee1ce2443602e616"], - ["030000807082c40302416fb6d7b259d792dd16141170319389abf5b437f9a42d8fa8beb2d1f11b09c10200000003ac65637f3df3222e2d02000cbdd912cd76b5d1eb73743d2b19707fe847811f4a951c53ba55814b000000000663ac53520000ffffffff010c558d000000000007006a536363656af766ed0a0000000000", "6563636a536a", 1, 2081769940, 1537743641, "c8706e2095df9c93145a3b564416c7017222d2f8d922b0b2d64f004311ee10f5"], - ["030000807082c40304d0df07e0f717f3fc2c26d27f8f0be34d925ebad85b118ebcb2f6ce05eb389429000000000653516363536affffffffaaef8827ec08a4cfac4dc01055e90ea125128ba4fd3b8a5b531dc788b4cebf77010000000900525152ac53515352ffffffff3d9f83e797bb925a5f98a2d2cc1c3f8fd5863d805144dc48b611969d6715bde1030000000865acac53636a5351ffffffff49e92b9385e0640090934d5335f9659ba0dfd5913e717a197139ee00cef6b9230200000009535352535363535151ffffffff033f2cf8030000000003ac65acb77b0b0100000000056552ac5263fa7287030000000006acac515263513fde92a4fe27fb2b020000000000000000d149ac0000000000df0fac512da80448b0ac9ed59cbf8a2326e0c5639edd8f76818737257e8f937606d8b1df968ffd4b5cd11414676f7dcdd169d96b23897e0aea66f69b94c6586f138b089960bafe42ad3746af73ce8d4c0c058c064b2bd9ef9bc5a7f6365bbdc500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eff2235ea1fb9dc7bc094489429e72131f4b1fa67670e0f7d9794a6a14e97e909dad5b0898d3469d4aca241f33054ac2856f481fba76ddb7f0a7e3272121cd8cc473999ce89717b1843608488add99ee93de255d6b7c6b7b9041de9a74d5cbfd3a7612c83559a2b5c11b0308b0d98f500a931a3ceea02ce96e7e234695480fcc02057e0e3e771e5a3f92ecfff84f52618d19f9c0f37f2f604b6646b8c6fc5514d4030290630eacce565e2c24927fc754772d68e0409abdc7e5264449f7579131aa0d0a02919a65de1978ead836c147c9a1962c45ff579f7e0ba6383e8cc0559126bc8352a38ab951e2e8e226ffff3c25743ccad7814570b043baf1f5d0581f57eb4e36022499be0f39aeae832f21f2136742b565c511bc85e831a0090d5873944ef633940216b744b1b040904d2a2fc8a78730f2797ce254a657f29ea89c3399b9217c40820305d504410de03e0dbcf9820c95903a171d6fecb138d85fc74ab5542dbf17172c0307afe0bb94f2c6aa762c78612711193c3f5e11f9640c32d76d890b26433cf973020d27453d7d5bb7a712e1f67017621dacd0222206e9938f7686a1df25ba4149cb7bdaf960af8c08fc368c86717298693329b0e4f7e7d03a2472c42be2aac2b58c535a1a10ead3a2159c5e10b890abfe5b8d247c419cffc6bff083ceec033b625dabf94a8de9580e5bd4cdb49fc199ff94d626c57e60b444704a1fbd4c00612360e403009b0255509f8e57cfac8e801b954cb4d0aac78a72e3428204cdee5cde7d6f8a6607b66ab7683689c99f7f14f80134eb80510325cc096a81ad6a7d94c676b2ff3e595a14ef91188a2ac0d510c4f377fd2309b9d15fdc72dde02007fb89b2aa51ebf57a5af8a06c2445ffd7ca5c414af632c6ea40e49ca51a578155968461e5335fb31ec8b8586d87a49aed8e9777fb845c21030483c7747ff2c715a6572b5660a11eb483e958daac59d10d711f5121cd06992debbcd36fa93d9129f02746e94b53d99defb5235fcd282c6cec1b32158ceae4fd1588868d59f34f9a5b2f0bfc026dc5d12a05dc0a762511bd31e9f1670e45d336d62ed9b7926006e7b251cd0bcc4c96a65ae56cdd6818f853c1a72ba41b53cb062603b1522d3d2073c1d19c5a402fed38abe248f9ef9495d9619454e4809526065ef7c6a0ed94e1999bcef52f8ef7bc59828fd9289c2cbf49a82e72024e8d85fefadf7277c4e20c5867dfe07c58d60b5e8c0b40cbe0e245158563b3af323cc93a033a60d432afa9c0d5b480d6ef5ecfb2cec33b4aed0ec64f5423badb8364b81f49d953594f89a303dd6ad88fd6c4628006d03e8180752622e2a2f0f4504ba4de9efb028dbfd977ba4429c701bb882558c2403bc2058b3c48eed1cb6f19927c5dd170c45cf95a31c04742afdccbc426506c079fa250717f38c1f62a2cc76b6acbc0f2c1bccd159fe9094814bc99baf2b571900167aedbb2c1e52a5888525927ef04145d757466a3a9eec500306c0ee1ad746f93bda3fb5d499758f1aaeb01155524e78913349f167e7658b144eb506146da209346e1252c659fafe897b7bedb808c17cf9a6faf5deadb852c1fe6205d08de49632d5e3823add4c32ff307588ac7d26a3cc0c4d601d7a4018d3029a2986e0672d31a5aa1e61603ae9ed2dc29ce4251faf16b641d1248d04db181733d8128d4866f9d437cded4a592779e9323dc31eda771be832b81a5da6f24917d1abdfdfdd6d070b40ee7ac11a9aa14f315ea270d1d8bd1d4e78773c67d23cd276bad5156b3c812804ddea1eb20a45c55a77ae0b863176a9713447a22f1b6ed5a691228e0c69dd0044d256c8177a777c3494d6bbfc26d506f38d1823779aea4380f6664a1b8eb765336923a35d14e2b4a3a71168a590253f8d37363287d18462628f856f106d29bb6d23ac3eb22eb311653351409c7a91ddadfdb7a97c37b0d9adf6df2845fb2a31869756dfb405495f2dee3abf1c287913d318ca62ceda0cb25a237e66f72339e8d4c7ee609a1fd58627cb8000551204b7c8d18fc07726ee32f010ebe80db9c750be2c03f6b0a45264dcd3e296da1da994f69c3f6b0cb82f34ff0c3ad4c6acbcf7641cc6b909f762b8a1867d2c8f3e5f3860caf4fb14d29359aa1285377453b68d553a19d79473c2b696157cb37416340913680ecc34f2aed0a7f6d4ecdc52e0c1d71883304d88226711b1a3d0f45be10db6b3fbd7f6fe476b52b06f7ab5751bf98b338046ad4feeb849167f3d39d0114bd7c412a9ec82583985d8465b3c0146a323d6aedb34fe7fd7b6f2fd503000000000000000000000000b2ea63de0ce0b535c26408a3550fa8c21e9196fc79aa61eadaae536b0eaf3b7e222335ad4d98c49a77537019774db59ada01692110b2aac4183ce78a330afaca4898aa946287b428a24c9da52ad65e06e42efa557efa7bd15f2769538cd4a7330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052f9673b0c9567e6cfa54eb5cec0d6c1c768fcfc66dcbde60bced6ce4757e74bd990928893997a28d38a9ce854a3fee2f32c692aea944da05b95b2ad4c60523ca81a36e58103eb0dc19f4117eceb7d35532d28dee2beda6287fb5996d713c62f7c1f4112a46ef60d0215aee5939c4ec6489f647ba351b25e185c20dbc2de5a440301c2ee894deda5ab8558a6275fd6f98906c42b5c29752aed55252dd9c10a7715032b96262edc79823a41b39265d03dcf103f1e679cef874fc30d9ec075dae67e400a020df61a4e082c7d23191bd32e35c20098690540d1fc875d3a111e25259e6a96b1fdad96421f8d83a1cd2e4a97ccc48c37679f7d43431c377cfa3319bfe1504c03222fd62124f52f2d7b06982a056368a5effe66f470bccdf0cb573ecdbd92146a0220c8854d42f9b235d2a339531cdbe34b99e60f9676629a17557503ea8d973623022f6647aefd42f6ec9c0f11bd02c4fcab70809120e57898363949602a23acde0c03223164636cd7cb05db05c521fc7dc33b36d82edc83add8f0177bbcc50b6e574b03154acd6468a3d1a9167e6f04bc00e186cd6ede827ac51f36c5a93fa2eab0b12efe5e279bc9d18c39dc1f35c96bd17b574f2c2a52d296667f4adf44116a0be142343cf2af160f81c34e5b4dbcd3b111c2a3e793bd0162c6011aaa17355ff506d5ec773f0b35c82aa91770f69911caa5ef5c185f580f3b0f4e3ee5d10553536fe4b7ee865218e1aa3a8909a430d1ea5dac2a8c56412d26760bf31776335a13e4e2439bf0b67e00873f70d2f5467c2854e196e3e9d7aefa8a278be366caab65691ca90916687adea4caa419a49941d508fa56bc3d0585a12ec9626b7725d3b869fcb5ed64116755a52a27a2ad47f11d36532fe4f6ff506547848d4eb4e9dd3d0064c360bce0a5301a7d7eabb98d5572c70a8576bc7a1f18d7f25a931f331a218df987f0febb5e340f112ee892d927c025d6dfc023cf85726be2c94b28fbb98f74d729a13b38f944039fc03f32333232cc5345512d6ad4002b90479f9d04d82ce91d29d1f8ba88be93c6c1ece61cc7beef204f7d71a7f15cc5ac4026ad62b2f69fa0a2f4a9ece663786e8b48701da69845f68bd8d6a142ed22fd3b716b96156f93fe5ca45a0ee80ebd5c354bd64172071ad031c5f2f4c97db91f34f78304ebfd7a69402d9ccedd7fd09987c706d6beba55d8786ad9c2f1bbeb1b4498fc525a21a7a799cbeeeae3500e1698071af3c986b0af60ad1124647cf0f09ee62568f444aa535610f684e5169c90566e987c0e5149aaa5d61b8e6a3f9526e37458b038719028918d27413c5fdc9a8e88d703350fdda9f78b4449499ca83ef736c344740c14c6522417a42b079b04cfd9c0d5d9e1b94d8cf8d98a0c9efccc2dee055f61caa1dc657bcf555fd3b250a092e78996c1477c6ad55680499bf90c5f4da7471fa902118f36aa238a281c678a8e47f805ff0f2cc91150f11dd22cf9d0d483fe5e3fe4d196715480b602d7c50427679ba12bfbc80c88603eaa7c9e65420003ac574ed0b2bfd31aa132a91dc629d8984b42a8e56d6ed64793e02eb4f6969fb6822bb16c4950bc819327e37c89374fa086410b71c939755b3ffa5deca3826a6f7fccab51d41e7ff7c7c79af2eae1ff7c15625546ed7b9ee08250edcfa838f7b1aae90b7e9a6c747200f60df4d191ea9d4da960ba8c73f890a836c1584f159b1106e34962e766c784162e89f76e2dd801304a0941e758d3c78adca0bb8ec58d02a0f8d912228d10f99ebd676ffd6f0bed35d04c34846c299c58899ab53c1328102d4f26b4698b5d247268076ad93f76aea5f9d8338e3a1d586aa517e872135d169e2826bbade01fb6cfe934fd4bffcb3302de0117734269fe66cfadbd6a015455f873463d95bfe13ce7b66115eb65c6e2a17b18583b2e7ed1330123c054690503ffda8a893afa024b613e3e6a4558ca03db1b9efeff0e6d3d40352dbc55000dd6de79d25086db675526c4ddae7e1aa34696f129e5aeee2b08f79398b4ee358f7e1d28d0f81c5afb59c7e2e6813fbf5d1722c4799cee8aa0fae8826e5279595fc6cac23198ff6d894b3edc41d6f5429ef5d8c5a968e7a32bd1280e749a18bdc4905cc30704846c54a368d9416e745d4977dc14748eaec074cb00ec3534061a4b73f4b7fdebc3c3d5a150715bd7411a0b512617ad6be2c8ecfc5aa7ae4e71bd75f295a50feae0af411b8ed1b44ac014f477bce2c9f12ede80ae1b3dbcb7328cbe7d8506327b124f8b93d580cb28b54522d79334e2c4bf3cdf1a3759cf15ac12c4d2f6e3c53bc64c36e7e795abd7436ad6ac380cd56bf1312102faa1c7e7b5a54ba6ab1019074c1a14f55ec92ddb79fcfb690a110769ffd7c19006b4080b02fdec10863afbab7bc4b218b35c68d9096c445deb7b6adf40f407", "65acac51", 1, 2041216296, 0, "a71c9ed9e3d3045534c4e1ef813f6ea72d2e95c0e457ffd2d5851057197e7936"], - ["26738e0403bf7881e0f9831cb9d5d3b6070349a04dd7ffbcbdb82d2abeebaaf657c92b1e4c000000000763ac6a65655152ffffffff1e3e53e6b232fb52942a3fac7d57945ccef6a104c4da81450af1afac810428500300000007530053ac005151ffffffff246e8cd460573577b9676d69293f97e0c7a0ec5e3b4bffd36299e019fdb3286d02000000085365000065ac536affffffff01e4064700000000000251630000000001f27abe00000000000000000000000000e013d4e3f98b54ee145f03018fbeeab7d4b2444aff794318871eddbac972f56222e587e7e0bb4ba4fcfc4aaf8a554fce69757cf4881be001dc61f46c0ed82a56dfa07625bd43c39b0819bc3c17f76f7772baf8ed7d721d9687bc816ef118f514000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001bac78e4e17a2d428ddb5fae61760e27948cd28916de52775808b1b9fdeef2a4eeb4bfcdb3472043b12235cca5038614377b6e51c7afc99ab3aa76183039a57069f44e3c7df2af4081602327c351402da67c3257f7c500b56a01c1be1e1126b9f5a9aff148763631d4b770fc62a2fffa29a462a0998e052488df590011701f3c02221ca7d8b704755c515757ca7dd8d71f2830ed0ea24d0fee99fea10856cf71dc031ed006405d37b7947f76d397abe815244a0e1f2867e6645f58f20e8399a40ea40b07510356c7f49f26742624252f3e39d69abb330531453cc5d9b68cc4af00d976174615199902921093bb0c15bf9ef65955855b19c9fce8e5b32df3c91065d7340328b1f746fa9ea4bdc5d1650c80d1c5b82db37d19633441bbd918669d138889ec030edba97f057f3e3666af5228b923d8e4e456b08b79aec40899956cfb56a36c5f03237152f0ff6ffa083f6417af4694641b78ddab9da7e928c88fba39606a404eaf0207265d86de27102c317813ea1bc6e1afda169113aa03828b719cd2d2dba6b9bd0322f518782047486ac6d118775cffa67a5af2cedeece4d35e3ee5ded3e4074003a7c071eb2d4e6c317c89c0797e0b2f4b49870e42aa3a665653f8007718bb7ba2db9b27bc3848fb87e0adf71af7852ef0b443694c19f3b0444a574630dc252e17ef597826707baad07c86a32f00732f4c0e8b89f9b07f39545a74c95dc8e5286900576980b101b44f9b065c780c7064d22ea3aedee8f20f66ff8bb3702458aca02b0e9d79ff3fd47cedbcdb7c0f23b56740a86b217b9302e44162db689bff8a41103c67aa2e868fec8085ccda8f58a7118628833d2d5ca0250220dbe5ed123ee871aca93aa241138a83b65ed3f0a11886d91a9f2efd148e05c1cf55564dfb7921b7ae3a18c36b31adc147c19921a7dd6683717f7374c4663d79de73e985fe958f031688da11089f9114c024ec135b557007cb2841f15c1ed8afbb8e6a240e9eae48e3ab4c4e921ddc245dfe5f162259d6aa5f2ec48f9fe4d3ef2fc2711520967870baf4ff835895b2f2bc03c6bcd2935b6fe40257af7ebfff0edf390f285b9d29941cd1fc3cd97d671a149bd64b2d0b4ca4e0a0a62f804135b2685a8c410312537c2703b656cd7d3ed4dddfd39c3e7dd9250d93d39618aaf5b7cca1bdcb5d197ea3d1b11a817f8193d6772818b1b4e352aa24c0c3183c3673df4e9ded8f7b6dba22e6fbf253fccd92d0692866ef9b231c22407a7cfd5f15f40325a1902b08aca14224e06d9e2f492993a7afdb38fde508f11ea1b8f6f5655fcdb88a4cb120d9775434f4646981a392f6c38c5b9b702c540c737941986c9ce8d148165f80a8d5c20d6d9e9b5859235c0aa3dc869ebfbb2f7302f9b25d6ba7da8728904471d82d2bc154651659059055974eb5e1e9dc0269260666f827cb2a0ab575427a75c68a862bd0e0be0e82eeed39957a6a68287fa9e22dd6ff0e6cbeedb2b2f9bc4b54819f260c9f35a61682f61c1e1b23168445707b41e406afbb7b5cf529a9a8f09b7d1296ea3e6d452284dd3694c160855f41156988f13a6b2839c6e3c7fc16cbce339292874ef2004189dd7cc60bb3e8cc6b365f8004df3936008f5b3da4c4cef01cec8e0af35edf00782699013d01ae2660e4ace7205eabb09306f3125d4793aa228acd7dcb12efd4c0b2aeed39edc20609ab61483a04ae76bd26b972df1a888b7f42ec111e58d486c7af08a6537bfc4f6266d66ef02ae090b79318eb2f7364b4342d9eb3d861625aa5e7268ceee75265ee434a34f438b2262ac69dd23381c08bf4f54896d1ba59ea405b65830906da74a20b9fc00507ef4a7995cd7ea3a2bf32e0ec1690ce7473ff6c5ab450499ec33d6591af043c98c4e50bb36ab0866b05167a0df6b9364e1f27b7ef2a432993a8985152f416095129e5a0eb8b9327c0587ccb3fb45284a0044b154b2647c6770dda0cc680b76f22b2ef8bbdefcb5862bd6acbc75efab74d1a002f4fc5daf77a2c631101cc97fff865cf74c7765af46d1e88fbf8c1eff7357c20e0ec409a9a1b70ac04915ffd28706df94c818ee7b9295d874493fb50b30530760a5c69e906100f9f88fc38f825b5435819448cadfaac86924e3c90cad0b66498cca7580ef4e8297bb2117517a355b37b00cc3aa499fd0e6c1a1c1557bdfa3d7f562867eecdead8bff55234a04080c00f2e7750e309cba2296bd8632d4e5b79121022157bd6796b1df348826875001bc762b1130acdcd27b8f4a9c6376c123400772db44d39e014d34871711e14452290108396430b18fbdba2c11ce8152d57ce87f75423a9b60daddf0c313d30451e9baf1d2f6042f13e26e7f8dcae464ec242ee6fe59e7526d9ec32144c031ba2c4e61005a7efef4d65cfdff7815f929d8957261eec00739a1456a900ff05", "52526a65", 1, -412446102, 0, "605bb425eea3312615c25051ca444ebdcba77d601b9cf03c59fe35a13bbddc4b"], - ["2ac0360b02e54617fb69d3b9a9136572ce4e2940ff8f33946ef5cb32dfbf37d9592ec111c701000000076a636a53656a00ffffffffdb8349c276641f319270eeafe1a5f8cc16213ff3cf77f884460493193cb2f0ea0100000008526a5252635252acffffffff04ae7a11040000000002516a7c2d3b05000000000351656502a13104000000000451ac53658a0e8305000000000163000000000204e8ab00000000000000000000000000e5938a9ef770fa4e115ad8ef563547100c7751ad26e09b7e4206772f86a65780de682ed99e571321f6125845e3201d29f3ca8e628559322fa478e1787bf30543d60858540aea74efeebd7bdf2747516ab30a6cb1adac85f1a58c27cfc5d312df00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000efe2e91a2771c03fb7cbe57012f0314088fff969c5c08d293a3ba901bd9d1c96b7de9d262c4d33be541d60a9ba6ea579aa2da67e4290a0f75e28c2908bc5d6ebc1b68ba51b5f5d67257fd02d60265d082124f72fdf6c1c564a79b49c42f4df42dd25ca8c141cbf97f396a02c86abe7004aab9b4a81cf01769699f83a625216d3022a133e4cba28f40e60bdfd5145b90242b5f14ef80791fd26ae2707afc2bc2f5e020b9f34e0e879d1abf339d5c8ae918e0fae0357e2aab25a4c6798c279135333640b0239debd4a2a3f8a986268e244c1f067600513f024eb2471661bc24c2a4ec3b7466f1a9951a0936990757b92495260bb809bd198e364c44251bdc0ebab74e43c0203a80be951ca0392891ee1ba4042056f72a99c920287da24df9c4a3dd4a60e3702259b8e115bffc2dcdd1f541d8c08581b057e912df9808fe3ddfd78619904bacd020bf808aa9ac5812cea3ca3d06acf7eec319d55de8af4194125f17ce0d3f8ca78030668bbc295e56f0bb5dc71bc10b7cfa69a40dad46ba440eb290c07cadd6d7f4b030a91066860c26c5365b605128d2ddafa09e32c0ca88aa3ec15db79a644bb92996c36569d09fbd6931386200be98c31bdc08a0e7622cd39239cbf211563226a13120c13e3ed3ec38bad778c55f20766dba7b3b97efe6c3c5e0a34e7ca00a2a22af44fdc3920c5ca0f5f4dff31e4fb4239d55cdfdd10c4e5655d5df8644296c76e4f8147300b06651ac855072453b82ad776592e3f8de1e2b378aadc97e6d70087a34e85c982b8585621e131c4442194e2bc45773963f2e93373b5ece9c7735d503efd8c23f0ebfc9ae50b3ed3a13d20d5da08c47894c3ce0a5de38bcbb554d64bd970a4578f07896164391b09064022e50e78c8a72bb10a71b911d2410c1d2faf6a0c92fcc147133802d6c92d5aee2484a66341358d3c5a65161f1473e86f633b696cffb83746a14e84236c47ea157ba3f8a5d115bbcbc70e7091b2aed95f81c1eff6cd7df538a4a37fe3db9c08f963709914f9fc1c9ee493d6376591461ca65d986225a5ef513bf0606a3a8c5b8c901b9c0d9cbd384beb7e0b34e2b67eed0a192f881522f526e907bc814156a6eb9a728de2f6421e4acdf448ebed31f2c803f92886c87fce7eee84fb7176de86508481e35bd3d3b5eb221da5f2e335ab18b2c86f98e5644e2e5ee224d2ff048958bde62e04026d5c5cec2fd34f6db2d587fb5ef104d302c4af72ebd268f4f2f01156457137eb91d0693ee64ab954590b218ef97ebf2b3b8f877a8d5f958323680d14a7cac6e7ec8f4c1234ca61e37eb78ec780d934e280ddbab30e3c08ad618ac3c735f4a8fa771f9b356d0f39cf908887ab2e5b0d70952c432800560ae62d63509bf760f9e82bbbfc4ee6a560ffb4076921f046cf94f19a0766a5b195b58d4a5717a997925d84c054428138fdf8e4d1e5964083281f0116a484151c94935341e17aba243b41d45a23f2117a350ecd74fd136d1c7dc5184bff11fda5ab87d7cfe4c54a2d5476282a255c19760b9fc284023d42421fbaf89a070b000bc18d649d55aca50032fa05117341bee25cf8e0620ab49d7010bfd0a2af16ce5016884e2fa5648f3a3ba4af22ec408d2bd7e382ca04db31b97de98197f328c07fba763c0a77df7affa08aee19c96d24f3cffbaee06757f71d34351966cf2ef82c14855e226baff7494fbabc140b83ba17f9e874e0b41ba07b0c77b52c73f71a2e7b2e1d5e223174175b3525a3e60569218b16feaac43a84df3dbd127ae555e3f24c62ddb2342973b5cb3e473fa07d14fbf4ff6fee0c67bc2dff0a955df10e52459e8d9e531a5a936141b9d880b025d322838e05c900e7fed39071741c108653a9240fdad63bd1b8e24ccfdde46d463f48ae834e62cc012ed5f79b160737df2f07f49ea59893ce55c18b9e3d8272735dc172246274c4f3d301c4c33e99fde62871d76fcb96da16f8af2699d34d468faf55e7fb9e82dc36ec82878681ce6c74cb94256a250abfc81063e377d7020206b46ae5ccea231041c4ae4a62a962178dd48659f4451911cc22c1ec4007797ccc52e0e48c5c8f82a7801eaa08a17c5e2c130ede682d4db23f0e0ca6705709770dea92dcd5eca9fa5c8542778f451a2f8853cb16a5df6248921b03d8b0ff68e4315e758f2096bf90c9d622310d90aef18170c9a06345c84e315a0081e2615d8d26e07a4677787c582b154382f419d555b6efded6acc939ea10f577a4d854bbfa59e0d9ba2fcaf6d5918aa97f9aa68adb094cb1370a8df5d77549d4140000000000000000aa6c6b0100000000ca2fcf448915f6bc2e1f731419dc3b61ada790ce47d194f55226468c6eae3b950970ffead7350be80e859307bf9551653bc8afc79162008e2c0dedf4fa928f22830dbd2f3084bb51baf5a404bfc6bb8018f6bb22a0fd502f3cdd25fde439d5be000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006bc743479687a93547f22234c45760b49a57cfdbafa99e92a3446b85e979f15d469741de625292855ac82139a172e17851fa8c2f25549424eb5629da82296d1912571e366b59b99f47cb5b3103851b18398037689297b48273085a5ee903cda15223d10043f0f055d72fba9edb4fa9d4260be7fcfc0903b1db89f5b27fe2c6cb032320957a599d952bcfccfc30a77f2a4997e17652e0c02a2cd1ab930c034e6b1a03103f1d97979092b3b574e7a86d6d3d1fbcc64d15ce28258137bd7aee01368a320a06f2904bd14dcbca1169a3746ddcfd22f61a108348bc501573d165a7e45b92299d7f83d5d21556ec5ae7c99c9165d1f605da4d1dc1252ca7e534d40ced43cfe50222738499d22fe7e83d5717a93a7d540a5034bc3ba34d384252aa3791b9cb15020213a4877acbd42fd1e846883098b5966cf24fcbea5a0059be7385cab484ad09db021361acb5be5f668fdd9bba9bf23832dd193b13679d7e082f0f15374424a32685020253d8bbbc6a9d0cc5617482e353002b8045b40de04f0b2aa774da98376d12b5030f4f37c74049c92e75edec9d8d91a482c59bf23435c39ca4d3c6b1cf50ffeb5e931f7ffe1cad1c9dce0154f92cdc4a9df5a054eb1903c9422ce5799e44ac44ed586b20c8019d6bf8e5be1ebe5fadd60b65ab18ec2cc0a5960025bb8a0b1cf5a8b3e182a578e7c8a031028ac7de77eec2ccb6e3c51783eea6e5144b8ac4f979c0ff3ec11527bd401318ef8b1f8f7f9e3d408f77215cdef17dd8124ab5d22ad6d7b26cfcc331bbd31fc646cda150444356630f99fadd3ab7e59e44464df6b77f29303e87c68238c7c6253f3832a5a5df013fce69c6908bce47d482912f6388630c3a64fda57bb4545879de3d0d8b846144c363f433837719121629ba050e8051c2119f2c83516ba55129bef6e1a681f6f0bd5882688f6c3777af5fbf756ebd389907b842f35d1b74c3996670228a7284196ca11ce460c79f605b72cca868608674ea54b05ab1448f8339cdfe1b33131f0af1168f9ac25d879f796bc891a30fac8f56f937257158050a271ede03d696eb7184b8829f775150e2ce2ca4171a2eaeddc95b9b3078d8a048466a96379f3970e26315aead60ecab2960dc7175ab049ac25a5942571001901f9c6db2841db632617d35fc1b793bcb0b95ea06d651fb7a716ae681e0fa10d441af25317830dd13d0fbb7a06b65ccc81b3c71dd487c860a7b60bfff7165ab04becb2f7d0c49a4212d04e402e187403a5224518a43dfbb10a2ffc16979a87daf0596afb38d595a5240e34c953611c2cd5c546bf7affcba02db11f3608a5c33fdbe02c8c1dc578a943ef5073a97ca7747e89519e9a206ac89954859a10522dcbf4a1b010931f73a4ddf867d5a8e16556e6f5ae7f73491644f94d5d097a4acb76de79fcd2895bf73b329b11167b856b4875e7a2d7553ed47cac9e1fb52d9b106a0282bc1413b4387db12d2472b64130c8b9e3e8399db483a91fba32d43d250ffb4440abea2c9cded08db8ec1087aeafceb3ddd0bf341a3d6c56827d5453f5506f50d178aff34987aea988ef805fb571a805fcb520df763b08ed01f1a60e258eb7c3cf3ba914158c8ad41ebb84570d28d451f2cb735a34785cd9ddb3bf422e17c3c133b32e0a5e6d4c0ee01229e17f8ee2913db7849a40b53c0af394bea533a4f55c597a0522a6dcfe338d78d989d4de7caaccd50656d11a5dec1bd77ac72127edd673ffb0233f45db0f0982cdac00564a7eb483925f2828b91f1f74c29ea7e6323510feb63ee8f6f1a080bdb227d3521c29d2962ffeb68f005e32ba29fbed53492aeba745add064178b81ae8a5bdfaba6fa2d4532ee18f760430d84742f2fd8861db49f72a3a5f6b9a379e4219f8373ed66821286da022f67219370626bf500ff3ae9e540a292c5bc0c8f22ce5a64e6ace5e1a5a6285ac3ef55d8378c6fbee819c3e7dc9e851a15690a4f6ef2f5051c549bfec428cc6cfd06f99775b2e8cc4879aab1776387cd628d34d6b20a8bedc11f3e3fe023c7fe1e567b182185ab34cbe8fc64df83fcc778514914190d5736cb8cec669592c0f4a1f726bf4703d1380df1d2738e7198cbbf9dcf3379c8a0a9fb85ba760448d6f3a5f99edc5924b156a417c6750244f2566411754ce5bd3312603cc97bbfb1ff9820e25ced8ea936a1d66dd8bc480ad82c7d3503944ebbbe4372e87afd8b3c5564d156bd7b72e1adb0128674e16b9beb080453df0bbc669c3a3ec87fb55242c4f01571969973f7228895311b98d3e247d90be5231b77d628f3f60ca6d0135984ecc49b1685c4dc6fa18014f23d9fb62dbf087a4258ec2ca7bb812cba7d44af75e2c753027fab478a05966169bb115fd305240bbf3d6a8fe4187e3c9b6f7758db3d6a556e02393d68aba764a5660e73eedeaf355cd5109", "", 1, 1524981417, 1537743641, "555df8006235bf3668031108acd74fac5ea82f3386bfa9856979a76f2da247f2"], - ["030000807082c40303c5bada8a93d850b38e2220b443fa2fda14f380c520aae6676f3f6e06563d701b0200000009ac0051655363ac6352ffffffff5031cc293b87539fcc1d97c4dd258725ee217789a90591285dba83244c243d78020000000151914df462dd2d9285a8ddef9d461eeb67d453c042b6ee4fa2300e4010e6188223c42182560300000000ffffffff02e00de4040000000008006a65ac63650051428e2c0000000000035200ac353c521500000000010000000000000000eb4c660500000000e20a35af1e07bddb4aef1b370f12773c660e92c755b151e2b0261ebc4ed3f760e5d98b93c06666bfc11d518b5056a2c760aef8ec96b4406df798303b73c2c864677164c19f25eaf35d7dbd738f9a3532ba4f8028e498d35f1098a9c9f92ecc8100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e3f7ebaabeb762451b8ee9b0f77b312bf4f2758557b567fb0532e83ec6d7df56d5cddfdc0365e26ee728e17bbbe7ea8b84fc471dcb8dfbc6f32ac7164b5c16f6e6c68992ee639caf4075a2eb2a5f8b40889563dedc8b4713f3ca249b1b63b5f44dd04fcd4824c9be1d086efa53c4027fb25fb8c4a07bcce72d7fda12eab15e87030557ace808a5657cc405917f0df21ce59e44539692684dbe0247d2bcd2ec918a032d72d78f01379ee66e479d8eb3cd62d52c40b7032ca5c6c1e25f86a62407b5f90a039db5a4de79612664c173d9bd91f2b2138ca2d8c7d7d7b954b7bc6c2fdc6d44eff2fa3de792003df0811bf4d90ef9f08ee595d495159712f931d704ecc2278f0327ce1bfe74c26f76433ff7a055e02d7fe56ac4d04b03f4f1ae318dc9966f90a003212e4e13003bfbdcd4baf410c4b87b855c5761363eabeafd8a21eef1af82eabc03141981ee20363e3bf017107f49ce0f7d18e78d6f606feda1fb7556c3ff005444032ed7af8aa5aff7ccbf3b76f5edcd0c045d14bc25519e69749a3108bd3ceaf55b020f8d1d587f49e32e6a122be4b41f0d0ffc0eadfe5ed75b8c12bb04c92aa95e42d7f65a573fe0c59169a9f1500bcf88ff9b1ea26b49aa8443ce4b836a3e53a230556a03d4f8649d9637f7eae364194b1df1b53d3cc0c08c8530d30e8f18537ebd8ff893c491218edee9c54d31254ad7bd3eddd8b433c55c755d513669521bfbe628075e80f3b64d9736bf7cc046b1130ed98e74f064ec9ca34b72c8d3a82da4c9dc574b4522031203f423cab18cc8ca63c6ae5810406583ca54b2b48e84e9f41ab7f362cf891aaa95827413029ebf752f22abdb0d935d77fc0b165d7dfb2ea1e6e8d8f9dbf929020c9dd29b5dd937b3a2d7d9d72474759306d76149793a24669d0f01d75669647cfe4d165c822aa9fdbc36eb13105a801258b8a745a4e01de8b16032af8e0131ec85b8bf0e52f52f79cd8fd104a23d73449517e638706258b09d8dd4f8fa866144e886eb8c417d66297b6206bd4700c842f2a6f7ccbf2f9aee405c5bf0900c638962bb6a75bd7a490d7130ec81830a243c2cac0344a720b6467be82da6c218c65f6fd109f2b715a127af0d030f4ad36c60c3f652a4caf71f19bd5aca81be92f200789bd3d0052cf34411c9f4a629ceca62063864dc2e41ea115aef1ec078872b226e329b248b985a56b39a072decda5e0b2a4d08280222b113ab890b4afa9c2caf7530e6083c46430a758433b15c98c07125d734b3cd967bb121b26e069ef57285acf11f64e17ab6d1d0769c7dd6506697f8a1175b08d9b50b28fb39970e4c45304d9cbe94077da1753f9ceb8aad50bba0021f932a43ae3e95158ba6879b15465aeb59b5d688411b4cf7887764de7f0c3df4f8b0824d58fb9dcc23d7c5280719371a782575ec5cb5fdad95ea61dba45d0c04688a71443ce246586c2d4003ad8eb82ce679eb8604204a63d42f74cb859852f28c64abfec8b27c698bf0578608f354e3c5ab5981a5f9809f5f096a9290d362f0f4c14981ec81c2af28ff3caf88610be3b463f4d2484525c8e430ffab72f79bcff86e90d25caa59f242ed6fc4e0ab0234ad555d637709cb3343f03190c4c8155ba331e39ccfae899d8769e930ed7ec23375b6ce69840b3d06b60d935826383bc057ea1682c2586e7ec82a8b5332012cb751b07b9ba10b68993e7b020adae6766c1c3fe87d845260e801e78733488cc6c80f093ff4d5e41c0eff73889f73c8b8ded957945ab1ac21714dd99c40c114c5f2bfa130b7d332dd29b4857ca75d8437db3d9b469bde3170c6e260bb8335415f383f438b1865a225b4de60f1de17bd5d7a286c2876811b6d3e8b40383ef12c5f8209f82d758ef7cb936e333590a8416dddb7f71a7fc6b5f1d4faf79869349a8698512dc60f9de2fce0389f6e2f4bc9595dbef05c585b37006cb1f23cd0863a3471668b547f41920a7dd28caa908a36c66a4d991bfd5a5e268d4266b9e7378d3e9f61d151cc97a3ea1dbb52352135e0e006968c9cde969281fb10410c12e4797dbacee7fe4eaa25305e951503aefac4d2fbc3e735ff01b8580724215ddcab42eb1b726f0352bd4657fa147b1d2ab3eb404bf3d338a58370a0d579f33e33f7fe78b7b1ea30b9dd4d4cbc4955b429f530ac1bbb00fbb094291c24e565ffac3edafc114231bb4c7656634ee994478fec727148599cc163ced348aa384dc3e60288c84c85f8d108f619edcfe037a5a0faf01de83b88b500302076afee73db02198ecf993dd87dfd29cfd752844ecd5b08d57c8d86253209961cd3bbd1b19150221d4856dac96e1d205d6ce1c2f0527d4574437e99bcae9772ba285e471b5923a47e0039c48ae2498d420b812026d1aabc9e05f9a5f589b17a232da91b55d2e4e4b9da118a3f1691c56193828506", "63536553ac636a00", 1, -1030011725, 0, "7038292fdcbf62396c34e9a489b6b77473c11f30e845186f1fad3b900e134c79"], - ["1ad8a95802de52aa8eeba4743508d9347342f465e59ca1af712d8600eb8dab95585d5092b9010000000565656a53514911dbab97a0124f4103791a975e844f186c4a375be4c430bec39dbba9aa4910d7298f7a0300000003ac5352409617cf03de048401000000000951535165ac63535100501e120400000000065251005352acb559d80200000000016a0000000000", "63516a51", 0, 457221608, 1537743641, "4d8db0317d81a697378747a2e6d7031b8527f789ee0199af5ddd198396708e4b"], - ["030000807082c403034403ad4f93082b098e90f8ea2282e057c8954b3240656c4f230bb946ea6f3e7800000000085352635351515165ffffffffa51f8b68d81e2dc4df924075a2fb30e7ec4a1df1dacf7a3f120b10095632357b0000000003635363ffffffff39dcb7e57f45f828f163ef7218df46770e2fc49b4fd0fb431b0b9c9b31bb876300000000096a51ac535100ac636affffffff027057b204000000000465510000284d41050000000008636551ac515265530000000000000000034aac0f000000000000000000000000006af63ef266c074890067783e415ad15d0a39c6b8e619f6fbbb5f4bdf7d0c56dd660923a54befd3e68995a1ab2bd0c9a83acacf092061a81128be173cfbae481724bed4e22ce6b29a7847f361b45eff432a42531f87b8f808f405e33d09c3f48200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000490b70d7fb065ec74671d709d851efeb4c374212c09a79325b4c09183c93df7f3340ffc7719cebf2aea512fce260fbdad522ee68230a4c8e98a23fab1d3b6aa438c447e60e4fb94792da4fa8f759de5d53d47133849444109d08272ddd769aefbba90b2edad123f9d32d28ffb581a30b0f668dc694c41367a9770cfec6d330c303098874212f8282d4ba3e79d29e13ee8748b707e0c455a9ca2f286e11dd19142e020f0c13b961bd56dda5a0073fc754ee2d2b4b41a4bcd55128a58c45611724f3fb0b00a3fbbce2fc73901db2349686e03f0601e7f2c54c15b45b3e22d5b1e03bf8c49cb1d6b4019ef8e0094ecef29309282dd6126a7eb9d7be0bcfe9aae3f8f1a78503030c22421515e9222edfa7751f91871ac8306eaf8e94458ff4b5eae997e2681102205d792ef6da18ee9de4468d4478776d9609cb956f8de81f7e7e6e91af1abaa8021baa199b0ad9b81f761694e54f8a419d398f6e5621c0ac7489dd3fc64b24969b0223c05da69c72a20ee587235060048876ed8bfa7b4881676d86c569c0f38ae45d02246e9ab07bd02f84956c2fcd25209ef88be9a5eb63e7bc4b36ab4d0da3901afdee14b842c261c86249a08ecbea9277b994f9f68be042a5b483b9cef549b6f21778f55f28e3d787067fffda3855680c4b635ba18efb7f68da0cf570d269c88bf75885c1c65f2e79a1fe4becbe2e83c5766519451157bf803dcd22260c8d5dc71ce9487aced814b85510f43230bb74dc6f8301385944c226c54e1c4b6c22739cd8d0bd3a4dc710c6712e50fb93caefd82cf0ca5b9491a055fd81f84ee70b59b29fe81da646425406845c2d080b4556ea76680e97e5990c71069cc7c32a8c45bd5b5424e324c95e47cabaaecadf145cb2c13e2ab87ae1b69eb179445aaa64eecc2b00ac0a8146ebdf27b96d55eb5b4c6b5a4ea1e9c0e0a936f2c85b6bb4155889caae1ce1fdeb5c05149065243e20b50874a7413d4edcb6cd6c7c50c2d4aa538ceb99ac7583ea917df3a4e2aef066bfb061a4aedc6b54bfa2509bf673d1b0b00fcca913238b13809d967a463b0961a24b9a81dd43c9fcce9977c8bc3c6326d248c59cbb4b68309276308111b8489b17b7852a249b332e11b3b96e1904b9bd1fae9f0841f4455b8e11054875f844178394c3cc7738c89de157a68839c260aa9b51b1fd3570553efcf6952aa103f1481cb8cea37afa70b0e8196cd56d53d4e6240008c5ed6f1a7bc6e2532b23bbf8756c436eec927587207e64e7dc576b4684ae9079f54b5811629863d20396367227402d38b1fb781d146a351b8d444963b9521b64523235568e00ad2e6cefb02fce60120fb5ac9d90cbcdc3da9441aef28a7b8d464f1242d43b02b69c6607276e675049efbea2c4b69a0478cd64b21233bc0d4c6b6f99a7d88f0cac397bb699d0f77322370a99f6d4e0267b16780b2b9997a571c1e953e35062b32c1abde4c6e383cb6edd56ca0e2ff09b514b3faf9fd415e60af3e032e53cdfb0e03133774e15e1c09cf610d97cad7f78f54f3f09c5bbdc71eb9120ebf5df8cfdc7d2ba9efb41d8ffa8799c757e099fce255271677b3c31f1040f72b3b1d4cd73b965169e4f09cf50dc37797066d41edcfcdd61cfbd176e7faab865ed9bed67167c51f67974f3738adfea6fb42eb5e048bc62fe7e4050c6f4fd105deff10aa4d6743b7b6b9ef0f6aea5f1014e5fc494ce4306ceb52233f327acf67729ffe9d3a70412e3575933ec0ff123ffd8a6465707ec455184cd9021e23752437a56daff680fda4f6d52b981fbb7caa843430e0abd46a5bb33345bddee3ae746cf78994110ce6a898fc3badd2c6327897d01e7d1963d541c18fcdcbdbc850c256961979cbf11cd6a615c47abd34b339970491006878fbf7b6a5ffa621c90656eac0f118af1f663ba401f80e5212f2aa1386001de5492cacaf768e0e24cca87fdf8f973f330c28efa16cf42fb91a684c47ff2c0577854ae86c62cc6236962e61164b5c1e523fb62cf7af1136abb9257177a366e840d8ca8e3812611fdf63707896ba327ca37810fe662ca02c9315f425ede60ddac8cca65d5e708e376125b68645311d87910458ef97c21ebe88a3acf04e13ac74c4fbd999eb1ace82f830a2854ca3597b53185b099a7c43747dc6431c677abf6855a30e5d5a9ce1734e11408fef2ae52428c6b0162bab09d8ca568d455a120ac9e815e45962231fde6b8aeb7a6bf6b3754fb19854b5386c7e0b58747c630fa6a639967daf3e35d58e1957eed0a79741ce3e560c1d61a3ba50b8e6dbe6024acf90604000000000000000000000000a64f2c21a52ea2f71a77f990f0eb8d40e0b54c1ae0eefe956df202a9aaae5b85433dbf8f23bba7be142cce9eda0329ede58e6974dfeddab48cc3c6bfc3462221c3d2232812174cca7dc34859276c1ef9c2921fafe3a7395ae9a1672bc08092d500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cad64cd48423ef3503f883f0da56dd7707d1100454fc4b9db40e9cbe162006b7a50d130a4e1f3c7b4f7a71709cb3e1fda04dd4a32942bc83f77ff921dd59e1e2fde1e79c3aa82506816150419f1773bc6677564593ead5cc743f4fda4dd43b2777f402c2c3cb8dc9eec281bd5c73a0405a03f1875f0c632a64f1391a8dbedcd20324a5ffe7c40c6eaf84a27dfed1633bfa69261c3fc9755be428644328814e810f032265d88d3d4b1ed5d0b02d6f6d217df4df957095eb3983c686c9c118a51a3d400b06f57fe08ebf489a7e089abd8f1d6c315d0b159b803775de5f437e5c427029373ec117ea1fd4a5216a99d4543f5466ea5a14aa4dca1a4149ccbd98e0b1c4b52e022400a470291c6166486736f79d9c07da375aded02115bfd60e7440218ed303420205f3f6b2d336e2df2cbe39eba68413d055e5fa6906c7c61b5a4b6206f65428db032929988531d049e6dacc12d4622801bb12a757b99bfdb93a31d5fd7fbbf56ba50202b30a2cfc11edebabc949dba6d5dd6fee27f14dab02d050bb696e38ee7d3e8603122a7de46a890343442f6de94c269de0ea1112ae310801571c1baf2fc4ef57f7a77090f36525f95f3bd3518e926163883de4afd2730e2f8267ca609ec713780219f1594f88c32d851115aecd212052a80fc6e4232ac0090bb1b09883f33794ffba4cceed8392cb5385e123390e8241c7dd4abd05678f9ce388c7612ca7fa617aa965773f7b938814332e22024801ea0e82c24b78d07a93449e1fbe00532420ce6490d3287ce9221a0044e6402f4d15a9f776789556e5938bc5643d30299e79b623ff063fbf55b96efa007890d67fa007e7cd8a0459b0e205b3abc9e417ce77b21c514eb652769960d7739af0be6e63d4d83f27d03a642ab656afbf27b1edffe6aaf04476f5857f05b901b979e7ebf3209aaa681765477ba5000e8056a2cabe3bc2064953bdf938b8fafc5c3fde114df5a5c7006e27babe54757df0bd692a60be71c6893afa31b8e9d8ce796c1b5bb8d85b4b3b6fc0cd064696af06797a07b8b1fe241e0ad160697051e63331fc558bc7b24302e484778e4ab47f8dc5d855c08f5a6153d18614a8db0c2963651958addfc226182b23da63f315ee6214c8b10beed748c9c66e208548d9d8a1872d5d0f4a6de624efbd54d43cd36f24eff751e4788df6f5922990d0146dd487521ccb089d3a19d5ffe83d3bc6f0403524d94696c13292a03ce754ac78424f98fe40a003ca7d48adbc8c1c1c95b181f47244700a655add385f5f6453d8f94ae418591a985d115cc821db8edb021b16f0ba892825532cdc8bb5ac883753a99e761c60eb4b817893e282403968b152c1944256af26a9a68cc004f4928a1c9363081a7daa906aaaf7846b9fe4e13731a6146e503acd9fea2b2df4984535891f85d3ad51093f163e6ac8caf4e2d29062c58e96cdc47251347c079a7eae2192ae8cb2f76e5c174ebc257d46cb9dc1ab942cd5b706426eef2a9c58cb63169f1a7932aa86890eada4a787f7da3eb36cb72bf7d40db6f9817b5af6874d2e6796b7ef50786a3ad9250a07df52d10d3ef19e2a5e32156e5aafcee1cab0707c3d4c67ce04fa196eae06a8a5218532360154598e40afeb5e038447e62ca468648d43230f55d6c4725069b68347c4956f947dccb387c615e9795804c03937dc20efeb6ae62ffb8fe04d591de12c55118987edf3e66b252462b4079d9f6484e21e04cde55e8352ea17a23817414d73be143163a1ede081870f45aefe57ef0f31991cbaa9001686dd78c99f293a7a8073f02e4a7a5459fe45280eff85130a43a748619f193f53587c772dec7adadcf1f9d7ecfdcb81ba643b9b5faebd4c10e22050050d01053585e1c1a404f96b3b8339101e7b9b03202b3ec567316e94f754cef07f2b52debea8d77a6c2d0a0c4cf31df44063bd74cfd4a7002a0fcfc45182bdd16070ad6d3c111fbb34bb4e12bd254578b0c14379f9c6279ccc5f2493ef69feec87f7baf9c7b99fca6185ae5b3f96056a13b418195306a36a5a14918f3d558eba7b38781817e3eb8926b4c082f67898c4da894d0b65a379dbd76e23c9acb2740727907787eb0825f92bb54efebb8b80f8a7e25a86fb11b04ffb7f4274875486b6beb007d15b1fa154ce74429e68fca44ef996a9f26d0c6a5bc8053345755f9a94cfc4a17710574a4a44b7e888f5ec487ed1b7d62724b6e55771d0645a8c0f00e4e608c08905554b87d6b356b125b188fad9a4eea1a61e7f7333876799df110da2b84caf4ac04ef781a9f0f5ba050fe83e04000000000000000000000000f848631eca8be6c6e4fdd4396e4bdb9009f5a8599a3a6cd4bc8c7a44ee92054ea09c670f0f79f4b750d6535d57c9ce21414622f97e3ebdadcc93883153aa25709605a2107df3620b8b6bed2cc61890b75ce0b328f4964b08acc7fb54e2f4a051000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f86e18e0eb6c1e29c9fa78ffd9f40b7e0838ff9047f20a11e257a375c528f9a55cd007969b4ae552c9387b18e60e7e25b00e689efb20b755a90c0531a45debaba0b023e1f947f055afc5044a5734c1ff601a836526a8a61cc388b9075f409956d88c3bfc944c5a98e6487cf70ca2b8aed730f22f44ac6aee2cf21657ea932af032d2ff376437d3fd543a2b73d1be759f9a00896786c6d0fd674deb5cf3dd1081003204da3fb56a77f464108af838f7ea7379b2498a6c26d2ea0f2141c2e5a7a11a10a08744a639512f3fa851f21322f125ac02287d95db79317df8c726635da402f9371acf90a44c3bf632f1c4780f454ea1ab0b885ad9ea0a468c1d090712e2fc223020fe88d06da06bd14b6f95b90e52744a719242475f2a400d34d9b4dabb5af4d05021f3b27ed6a0786d1de9ae8ca46c8e112ae690509a5c27aa91aad939fc57413bc0214dda7e4562a4a24bce3eccdffaaac241548a6d6a76a874bec021cebb8a145450208ad3059de07922746b592b01df48c7a5421bd9b3181b69affa6615bec018df20225267972657587c483dd7b2c7729528d9d468256923477a922890ceef8e096c5baa9d514a4bbd42e16194c7b64489d8d34e0df66ceeb0b948a69d5e7a289373f54a73973e43c75ec9433d1280acaf7e46cb85eb7ee99368ed7bb344f674a5e4ca936a7a3042f79164d6fc68b2bb6726bdf5e8b7c5bb3bde320423100e2111fb4fe2e5c6ffcc10c4a0ab6d8baa370a92b148bc15384ab833248180bd4ca3fa8a65b18fcc28be68c2447da5e54647db662d7c11ed6b0790d75a1c612b3fa523dae3b8cc716e75ecdbaa1db6c1841e4c595e01c3aa876e1e70d374169259aa7e0670b8912ac6e6db7d0b5cf390a678d7a908e57110196b0a2c21c6633203b71d1b86cc1cceec213282c02f8121056ace1e4a099627c8460cc7808f74e1eaa1c729a2d429dd216be255ada19d11b62adec4efbffce575d38c2edd33bf314280c6f7a7105da17d8d9f4964027252179331294ef2e7347969839e9d7c4f7bad12bb6650e99a73239f33837079b9a10e8b6d11ab38dd2f244c2e9338a1205758b2dca67b35aaaae385803ce99bc09349503c468e14ca1f57ac3c2efc38894bded5e50e33b71263a0e11dcf5e2ab131a4e84515cbc7f36196e64266f3724bc8df3e989bca216b6d368e958846dea275719872dec1a0477a33dc048eb050b7171da192bb8334c3555c85e050bf4e5e3317f4ff182a8d40b96fa837cbdba64d0548cf90d9d1cc24c1e2e423f8d71af35651ec186699d518a170922e31b9da778b5b63085a7529152f1e501f2f389af6a7daeb70de4bad4e6b78634afb49c5d543dbb189d05d8cc13a4abb4f75d029501517bba25d333fcf083d53928ff66ce5ab7eeb9577d5a77e76e4acf3b5a3eb5ceae129254844b7960723cf3beb0e6cd126d53c9565f51fbe209eeccc61186ef4a568db515b69755a66cec6e8db183802276f8716a4bf48a664d32ad35606b2c18fb8c54b4989ad1ac11351305f4ccaac5a01d0dd7d63bdd1096ed46a199bb01031080981c17f6f0a91ca5551d61acc5f3e4d253df42539d51012d58f8ca522164ceb0c84ed69c5e36c4b5aaf080f516c600d25d424cfe75cdf1bf196c0e1a312601a7e54db0a962817973163b15b6f698a70bc27ca24b95d0671db00590331f34598b02b4210ae70ab428c2ecd041a198e9b2f642621bff4d18512059f7a95fde0eed46b24e5e02412f09f751d3d4c9252a07a925616f5e5a889d745984b3d7ec2a775ed146b420f9ad50e943afbcb229c6ac8df441a661b03c0019811dd6679355cfb7f7691081832dc3233978b7cbf11deec99fb8e54ad766b91ff979d35d69f1b450013f4a3b48d7e7da078ef839cf6077bba0258b302a4c789ee828a280a8b11c9836f2d82b91c2b53a98c871755c3a8369743c7057a1b24d8c8f38c6b9b22059834e67bdcac0e7a3a6d8237a3e289d907e01bcd729000c5c3413f6e939628b728685c3cc37ece3f0775dde6801636abf6c603e08349067362e0e49f89c38664f3001591800f8c20d6b4c6b6339e86d106c69c6e58f5f20206b7463d051eed7dc7ab958a0ebb95cd9f07df28de209f43965ba30286f9db68c3822db44b7aa264518afabbc8a29dc376665a3e98442f5b1932c055cf1fbd44b0f7012069cf1b5ed94a6aa111cbeb8bb822fd933f3ec9a247a2f033b207d03977b8b5e2da9119b66f8f2f9d7a842d07e060376a9f3ded97015166e607e28da36c0e5cd663e43535743f9aac4c9024a8f192bdf82d265fcb26d915659283114deff755f80fe4b8bcbf3f43144a7274bd3b96a3fc1bfd428200320a79aaa1442285b25bf906b9953099bea718b0e7ac4f351e5554a751a5e90b0b9833b62f34ad4c68e9728221f8996499ae69d0a", "ac52636a53520063", 0, -324054398, 1537743641, "6e66e00bd58f9c66bb8b986104a3226813f56c59c58d5ebb019b41ba93f5616a"], - ["477b21260299c0366b478dcfdeb17296be4a16ca7ec2473c4353fd78e907e698690f95f1e20000000000b63b9ca404bf2dcb20b1baaeea2c9d9970b21d4571a303a5af0b2df68972e7f6c3cfd6b60100000007515152536a5265e82b039301862e1404000000000200510000000000", "", 1, -39292123, 1537743641, "b5ffdc290b3652333ee4a6d2b18847139345e47c0d4c7094f0498ce6142b5a79"], - ["030000807082c403040f8cafd12da57e7cc3b5527af8ef7cb4ce6277d35b6ae93b137ce29bf3f60f4502000000055351ac636affffffffc48f80342802d3f0d7ecbbc3c3e9ac31797961294f508d79593f0bdf9d0f5db501000000085363005265655200ffffffff9bdcdcac9b965a7b9b5a5c613b9fb3d45e2bec9528e46fdf44e83f42ab6fc4cb03000000045265acac6f091331793b84222169b8f5a08f45c896f49db53e8538c2e47f05b820b3c0aed953d1de0100000009ac536a636a63526aacffffffff015e28240000000000085100005153ac6a6a000000000000000000", "0052515251650052", 1, -124405475, 0, "8cab87470bb6a4f41c0d6206a3cb22e70ad3c42aca6646a7a7b632851315b669"], - ["7ef465080153ffc2094961217f840de8a96aece30e4cf74281e4d5c0364f22653903838114000000000751526aac6a5152ffffffff0168f0c20500000000010000000000028d537804000000000000000000000000ce9f870fc1993b607f962ae3bd42a364da86ef685edcff30e45078509f600d48d621d2becc96573a5e678d177466a07a0d91e9448b87714706b258fb54c3fcdd1626325730dc510fbd93240b255410d9174da1e187183bbdb1a24dacc91aa89e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c6d04a1325e9df11efa7e9a3faeaa25102d338f19e6d5d22a68c7d6d06ce86234b01774edd53c94cd5b233e38bd134143c774b0397c22f47f8389c0149259a55656a63cea8c988dd190a6498cb551e0e1f141c4fe85971ca1f489a8d5cb93b33043d8e9c08b8fd07b6b271e002f7b7b91cb6a9a49be3794b0e90c9832ddf1d9103042530e08e8250afb164f8dbfde3e877631a2688dbf7a0f84aea623e5c028331030c45015ad9f4f86849dd82c07abdb928bd519d64cc7204c49ebc1a3c83e9d1970a05890869fd8c94e5835f466ca45d238959902c84519bc0d2a55703c3c78ad331349d30f845c58e6e30f4844e41a4ad4a724695a91c5f8d892a34f016826bc7890214aba71072e8337e100ec4d5f8e3bb583d6b1e1be21302fca47bb31edcf6730f0206b3aa8188129a60ea9e15cb7778ce597958f6b7022ee14bc0f84afbc5c84b730227d5ad124652bbf85563bab9904736f1420a11c055939046e77055d007670f83020372cd1f325f8d344b6a22da9dfc6d5b76c753727e1028d19d5bb0551d8989a7020446c424376ea38c65fe8fcd19f5355bc5812aa76fecc994be72bde78bd2062b4526f66cb3c6eae1f604b95250c5afa7d8a8dae9c16804f1148e4807a2803eb9cb6bffec57beb2dd4d18d3db72aa5169aab7655c0dfbcff596f4611d3103300e265518518e0ea53b9c51387be8fef84a3e7b7d77b0b983d642819d353020ac13efd5deb97d109001ea8d77788986daf2212425e7e984fc742d64383c6503290a5e56a14c87fcd79081cd3b757cddbebe5781d4b1f07b991210c3a9167769f18e5e61e3340703e06f05fee70b97aabe65e2a9b1205db502ef036e7698a196ecedf8c929861a704866b51dfaeb210917c41803ac015e41a53438e13acac03a074a56d65e36d1b364f0a82b6bed44982139c61115ec2ca5fb529e5fd03990016cc00ad146021f2cf9492e3da2365b89896662800b4c87499576fe2570a389e2894d84830585b65754eaf7bbc8b5ccfed0413dc756ce5d3ddd0a3462b4ad376b1fa10e3655a99eac29cca125938a09dae1bc46175d9454e5c4b7d6959a229ee368da37f0fabf1997b7f2381d78ff6813788c21ea7dbe256480c55acfe78f307676dcaedf04930dc425ad8f703288839519cfcc764cf709df2191e1bf2c22d93ecf66716bc3b7f5ea29f0e30246345241ad721a8fc271e6bc6dfbb8234ac1a5b2a585df92cc9afcacfdb3bad3bce84ccf72f09d3f5301785bf58d7c6b170fa126e417fa7cb4dab0cf23f0dcf5fe66b5ffd61d560709fc95ef750ad17f6c28581136ecea07c87dee10123166bdfdfe0448f00ca3a88f07b871326efd45c53e147ca182305f8ea6b95b1e2a74e42d495222085715c8a2e8557b7d435ffa6042d74fc731854b2da4121f3b8653f116cb337cbf35329cf5cc0c727c6e7109f0f04a13609a3f190c3959c29073bc11b2314108cac3e8da73b80bd90f58278e4e0d310c66775f861beb078be87ffb71009927ca784e87a2e59c6bdc26098b3a8dc76edb9f6229852e960701f8f578578a8a0528d81a96bc448af34e02e327bd9bb5fa189c0cb0b52807e27573cd5b431231c3b2a9576d64aa7022790bccc90c32d120daba1acd713df852418024914243248b2acde92189dcee9feecb092b5b77173ffd889bbda85463cc8599540e527a8391db645d945f4d7de149e67a7f6382855dfae40c2f0243e7ce4f7c6dc6b0b37ce046b4928934c78588dbfe618a339c78ef5dda5ea8ceb928d82e580b993e531d5f7e30a7dc18821d1bea6f06e6687972ecd722c84087d18e75c612c0ee6bcef08c8ae2cc0dc0c797bf308aef2d442f25bede0a1864069531a1e330479849f5bfc9af6be8bae4c6ba8853fdfac38493d801b972843add7684018fa39e0a67a9f62b16d433a62318bd95f4693440ab34cafaafde53ff16137a73bfc3743762094d0785c9b4161a3cc78e35e94ffdeb025de29f91a43822a10ed1e8d6c8e3340d2f3e30b5eeb76638ae1e08b4d799495790cd2eb715a3e33e4e171e0c4a6af1895ef75e1daab1e074fe6f5352dc2f28a89e80f5a1f1e5e267232cd1aa828df571152f14c0ba15a604ae877af0735661329e5ef0aa8902108c1aa723c62997c83242c17e1bddd6f4ea88cd75ba8b0df1347b31f3597356cd01abf01f9e0805cdaf57c7bda62a06eb276c1980b27bc3142dc475f167f03294d756e737e6aeb539be1c7e12652360c9bbf0330853c240421110671762be0bf8214fbf18fc55f5a57ad8fe2865adb0e1cf187e01000000000000000000000000d8c8d76cbf04c886cf2bdfa0b05e3fd445e203b6687834b75b727115bd43ddb4f714f8075024aea1a3d4183bda168b85f856efe9c8b46550d0b7cf61a7b0405c0b6df964beacd4fdcf6e5af6fd970c3af9bba14dcc13d5cb25f91728c9fa1cde000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f6bdf9dc548857ea64b2456a0f522c33f204dfa7ec8a75950c02e1469c864db4a1ae4e838141587d36b1b5fdf66cc7fdf61be4c62dad568142470ef2745c8562454936fad4ca151612fdf1ef033d6f25926b0f029bd81e6fe374122125c06d0575bf6c7a38e5a850063d1f192ec12c6a28732b5ba35617cce4fe0c50f4edc37032ff9e8d1dd913b604ed2b62b0d328e360c88372e93ecdedea48b0fb6dbbcf09a0211eb874636e52a5ce048b37b342a7877cc317f61b6ab65ea4f3d6fd55585ffcf0b0076cae285abec0d145564745ea657c44a7e4eb8735f09bec3401117be36058a88a2b10b11d305f472712e839f5214adbabc61b3eeb97ebbfad9f3cdf28e7f5103178f91e5dc6cf46d82772369fedd4fb0bddbf83c6097cdc7851e23cf9b4f60d0020bf40566171e09a243f83a56c27ce34e4a2a7da9cc50dda145cef14c333673b4030dcbdd581bfa9ae72dc9faf72fd244b979d58142656644b2c7f39c9dcb9999ed031c83e375fed82a91bd71f314e08461aa7d9f7c3f9966294302b9a9d67a84db1902187bcc2579b158c7f834dc86635b249e110fad46c934096ddee595414b9041b158f0cc318fee77f3c21406012aac7d21dcbdceb12535ce71ba0c7bfd8d01c95cd74dbd69d5d69237e3bcd3b528a82eb811a0b548dbb76d1cf6ccfefa2cf01f69c0bc4316f9b714af381228fdc322c671071dc82909cf5bfb699e8de8054afd7fc8be25d7366e289195acfc5254b4279b87a1af8af9a6323cbff676d221b32e83c962787472033b6eea61835ecb1f08ca25df071a086dcd4bffaf0d25db2bdd272e09d577df94e36f4683a6aab939a51d53f28c9d4271157fa3521143abb513284aa34b85d533ccffd56ba5c9c1e69e5ffa34c3ac958f043753716d7511d9d878355bc7e3b08d8b1a04ca2ddd0e2a39e44b07655bd75ed030bbc5ac48f840fb241a6de72429a13d126b974e5e0f627bb3937be2d5b4ed5b4b68d42ae7ba2c43029c477c20f8e6568ee5698f1211b3d53efbc69d2a1d5a9fd20ae2c73172f7c31aea182f73733dcb742f543079d97fe2bad6862fd8ac97aed6bd066facec895637f016234e24972c6f2f2d7937e93dd70684cc32941edad2866ce068de203435c56f7e1b17792a02d1f48b7e2c419942490d14c036a6018319dfc1a93f59d23a45adca1c2da43acc42840971d27aa4ca32c2ccc3e0606a5e4771e480cd3756c823d204f04be5f0e0e243c2cf3e6ef66accfe208a7751b2029b1672bfec5ef7512a42213be059f4e30cfe8f10c036a00cce07288439544a31e92773c4df7173c790e08c34c86b8698e4b5c3272a9ba6e381db2f1832801cb6a2019c108e2abc6b02e9d3dcde07e77bf7027ba0b3b5bccb27c9b25904cdad5797c877da46679e7b8c3b986b0a242a8816e806ec188508d805491a702305a89d56e2b835aa82b3b072ab36c08b709c4ab3633b338a445e31a1007a25fb82660926194e1d74f9fde9bae12368cfd7eb50127235d8a327edff6515c27acf9f5a953008f93f3bf8cee2fd4e8e8a2bece3cb63e0df359ed5340dae398d6ea3dbea56b31a896390c3df56792b4074345b985bd52b686b13604b093fd7be315e411a042411fcd16aa1b2beb3b2bd88295ba377115b4f4ee635b393b7754b0957475b6b078d4d121554b98bdf985254bb3a779b5308fe33d2aaafbd04d8c97265f71009eef1b9fbd668989242bfb9d974a935d5526b641b551a25e5d0c39a1579e721e60d0bc205afcff2a01ad66398187bc7ac3d8b24cf832cdc938fd5252374f9d09684d1b6fdc33da0ab9068a9aa47c1cf02bed5c13e7d7487b2d43d13952c88ba354b235e5c6ec92c5336501261adf43c05f6dff0d19c4eac612e61ebfebf07a1ec96a7d4f73220eb4688588dcf0564f0b840cf5c473ee0960ce9cc9e80cf18e0660d76cc93dfd5c150db7365a5c62703b22380a7d1573769ccacb483ef52b1307dee8cc06101161b8cbe3d5087bfa976138873be0ae9932f9d74f1102f4451bd3f3c0d50cf12c3624c250e474c7cf9252f611c3858701a24af4cbd67f09a1524cfee01feeff2767a449b284d261e88ab9b7bd090c7c3f5b508123905d05a2aeef04e7e58a34d8197dfea74240c9597ec9faf1da3286f288fa9e90a56659592c97d81b975dd5138d85abc2ef66e4abbcbb42366ff3f7b5f0bb383d4fe7c70163322974df75f283e67db6dfe1587f2b16c2c5b36497ad42405e963b53c06c0ecfc0a76b7cfcf49a9905d196e442a227d5c88b543d2b973579aace8adc5bc2b3f90074480dd0cb145e59356067c630a58f2d256c783ad1b9ced0ff9c2ae558a350f1ae4b8d105b9ee8a0d9eeac715dbb89707876175807b4fc98e7385ba28eb2740d55c0fb8c4601d132ea48cf53cca8f39cd1df67429ded00c9ee02204", "6353630052", 0, 1730867992, 0, "7809c714ac307cd65e31cde3e9ebb783098eda61ee53ac80a0809a80664c913d"], - ["0e757873037cf9df35995501f5c833821e6f0d9c4a8f4b6d6be826561c431bc5942eefa7350000000000c98823d2d75c93a32f4e22ed305e0499f04865b8e22b70f67b91a02ee246d11da8c53bf60100000006655253000052ffffffffbe618640bdf32d76b3861f6b23efd95688fda158d019fab293737817b08e4e680000000005ac6552526affffffff023976070000000000076351006a525365c6c5bc030000000003006a65a4a47f010100000000000000001d6c480000000000e1cad304edeaaf6fc95091c1571c9ed307d261898d62bd9fdb13c525076988a5613edd66c1660320a2b25ec299e31c8cdae9b08c05f26e94b0dca805ec2ce7baf368938a2ded122527cd2f33e4a5aa4d1bf1cf6dce523c0d668fb768b4bcb3e9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002cddbf574b10e681e95dc0521dc5f82794c2e6031eb172ebf46bff589908798beaa90990c42b547f67894a2cf0a85c23a2e11f1be8a742e6d9cc0e7b6d6198850eea6638b615f4a2825c877db6f2a57f47e472556caba56b1a231ccbeec1755081831e13a8390aad56048afa17f221f0f7f4d4283cd5b75812aa0dc390dfa0e40207e932e4ebe53f08a20a14dae77d38c70abd3b78fbc3bc90a79688fafc84e07d02238214f7a1d7210c72d6781685ac9d64520e0e492bc5b6b634481650562417a10b08f86d705bf67314d3948b0f46cc2c9d821d22be081dfd68ae20720922c242e3c8af6d26b2317677d8f03436c11c783dca62de6bf8e4eb3353e91c55cb49f17c022c20390d5e1eced815947428a1c96f69c628efff69325c4961bd0336a891d5270226478cce3c2a5205f36f55eb1181582083ad42ad43b91e16a255d609af488de40301ce0aef46c69e83a6226fd30c5ffe7f8a702cc4c04b26aec0b4437ac0300cad02040f392218c437be59c03a36a7a4786a8be328748d25d2db215e116c8cf14f7002114fbd08138386661d012e5f4e053f5273c5d0298e48e09056b4626ecd317945b2d208710b7f7c6c8a7d6cb23d4137e305440261909f70b9e8cd1f2093b33ed4b6d11b0dc804bba7faad2287a1f3faabb861514345efd9fb6b9912b4261aad78e29e3e873e771f1f95d89617c2fc7c5267a7f7699c7e35a5b1214de958d1ba15e13943bad3e2af1cc6328c5fc8f918b8d2807a48dfeed2b4743d45e508d9174b869b0f6f8c4876ad48575d8777921b839b02c30c8710e91f51dd2d8c12e8a23b9d1fd92cb90f2ab867c284f8d54b19e25cf3717010f6bf8bf45f91537b42a7aa1afed21d66c5cdc8602da431343f5d1dc24f61785b4499939e7a12e96b4ca76bb68b23290b65e07e3f5fd3d7d385da6fe107b6a329dbf348c2ee6377893f46220e60ec51e63c3704f6706b6192c4dbc71ec6016d8b6896580f6d0edd69ae6bf114b4b8adfa1801c0647786f3481c4b662ab3ec720542ff326c85082514236e42f286d326a5d5a8e7d4fa85a7b70bd8fc19702292b61d80b15943c2feae47c4de86c3f6bdad54b927d80786385a53c5c1429864581c85f24579ed49a56ae22ca3ef6c559658b44b0f6edf762df56f09a284778106c369233a956808c7eb1e8eeca94d9a9a1b2459d1515748972bb943154399a5dad7fe9f5f6be9d054362084fef123c64e784f53c7fa93f31feeda7e010b815fa4302dcd9bddad4b7d36c3eeb9e3021dfedbcf2e79ca9c5ee3e8e07ccdbb5fa044e442bf12d7399bca5ed831a1f64d76d15c14dd45bc146e2bb41e7314500d64b4279b9724a7d72a280262ee93325505fce89576c2781e1e467510c12be40b73d8ae9322899fd7682e507a5c3abbe7531027201e10319cd75fcaf0d3303b900825d5be73600fa1679f4c054e36e2088f1852c950e57d713f65e69ace7d966ed728fe3abd19c6cd7107829a24c7f73a568e645c141eb8f4c1963f61d46385dad816c930ad8183244a28fb6cfb012fc0d078aa53fc44fb8b263c46acba124bc9d7a0a09b06280d1038ad31aa13766dc1d1e9f1bbc172fe61edbdc513851057d95ef6806f27a4c394aa58e15b2f23880eaf986d203b37f43ee729b52b8649644585a8d0d1bea4f1f7cea121d09820006138c6a7d9bc30b964988b075a285c0078ad78120826a216c36296cda890e1420c7d4d0c08d6398bf52f66e46774a7161cb859d937dffdc92faa4872acc129ede5bbb0d0c832f9e023515d5c573bb24f7e2a0d6a3ee4d7e93abc66fe23c24c0b6effea1db94e7a3e72af72ef898ac585326c108ca07df054440260487ac494b67d61b8f38f8af47f90f540b5394303bcb3c3786c768048714a3c108ed8e30a65c4c7b330da2b1410805a1687092df2e75828a7cf4193df84df169ee223e6cd4ec0d9356f1db32397066dfbf2a7d0d363c4a6b9e695bc8a7bbdfcd6bd828fe12e61a9a7a2a58aa9a7beaa8d265b769a62c7a0663f70bb0ea270560122dd6493a4b3d7065cc744113142c08422853b8d6b0c23904717cd1229ab3be74a5e42427b457ecad04556dd14ae13f096b1138af1434dfda8c92cf27e0716947dd3b9ae63d9aaa41f1d478225fbd7aff9589cc04c2c6ac564d62bca4f4d5f4084b46a31b19b9f71a47c78cce2faaad77ce3e50fa71e995d53e55d31eefdb340dcdd30c0d7071c796fcf70a732148a8c189217c50dda29e71577cb733a619e6c9a25986471afc04465c53b2cb35bd5e2f7356cd0515943bfb58951a8fa8dbae6da9c3221eddabb7d4761b2bd34cc1a896b461265c25b30bfc3cdfba966e9b4f4a5241034dc46c8880501cfc1085243a07d63cd28ed1d82be638256da511a3187c3a37fee6f9ca691661ff36c3dacf04145155b636c0e", "65525252", 1, -1509671904, 1537743641, "c9729f88b6fe33f7d69d95b15bf58e0b5832754986ef57ee1c5a5bfc81057f5a"], - ["030000807082c403032085ee02931f7c276809395d9622ac062fb9f38559ceef32438bf561aee91ef40200000000ced432d9f535ca5837416462c45abb41128f73373dc595733866941068932dd87a2cb294020000000363ac6ae32d9d42a59e38cc618ad671a10388f4d081443fc66b62e02b6f5e38a14f77f1ad62080f0300000003635100bac1ddfc01dd221c010000000009516a52ac526353656330c636ce0000000002d4528e03000000000000000000000000861f0c2b17729944610b48c908d25c4071b39260e12a3c3e8333b503278e36c21f95a9a286217abe03b4f4cf2ac73460d36a13213b4541c0b5e26a19db0eedc38e6009262d0c8fb469b6b87f51ec4e46ae30f77246ca4aecc598a8cf5b61115e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c38abfc1accafd818ff42fdf609f07ca067ba4706249324f9e3a6528e33c7e4a688a4de903c54b58bc3804346780701a038cf3039ef4fba459d04ba656e2de447702b404766fda3d0adb5601cd6a0ed8546821da4c425312564429f2c12fe27c7d530bb48478e5f982a935f1d4266633beadab6e706fa810896a82651dea2cc021abc86c813f834b1b5fbb57f535829704a7bdd15d9520cba2fe808c5a2afa0dc032c458fe7813a72234cb956439ee334da32ef1e28453f4168b662f168f69f6e7d0b014a2ab4546a43c2ed0b4b0aa86f91992022f64bd45f575eef766893451e4d24449b77f433e944f2c344b7cc6fedfe77e48ade0f93a88fa26086f41e6c7b5eff022859662758d8d1414c9d0b5d212149b0dd4ba0ff045db089fede1d2db6543e95020fd17a1c48a752be11522f975583e85f5a3a2b5d984de1048e89b9392634db23022f63c07e776b5f97a84a236fbbdbcbdc02cba82a1aff0b13a1f8cd65ece73935022389bb3056d48bdda6a5734b9db93a1cc53a14448dcc4133a95de925dbbb5d6c020b36046c5e293e519f0d4622c42a60ef7e96660567b69a03a84d492e5d4589e4a7a2a346100cbbe4cb2a67b22fdba87ed547338efbd4a6e1ee989bad006edebcc9c2954348a7607666b556c9173120e6e17f441ce2ba839325a2785e68209ae93affcefdcfbe2dd1214483f85844129261afcf37e5621b367638c8a69eb1e5e0c25fe8c6df5288c867d0b020bceb8d3a5a5f3790fdeba365f715fd174341602038278b809b7115b364e136c5ed1b5823b7d376ea7db0dea1464cbcd02b41bc719fa4c66db42a20c03c795530ac45fe408eca12dc0308759e7492ba4f786ac7630779f1dd8eb3d9b4cb9de10feb85d5da939baf5c69d1981cc2ebc31f4a3d3fb7b45407cf9ce630180032562ac2d3112f807b9a943cb1f3f1e5b1dad02f8f3f10f1afd01bbdc1c31c6afffccbf7a850da60a6320843fdb1cb177c4e56e1e7753998869d3f2441d0b38eff7ff286cc5a712d85d3943f7fa72cdda90a435401860cbb105776c3b920182426e68e0722ae5aef54e598d8211fe8c3ba34c3965ecc8e9cd8b483a6174c32af4a9a9b89537dcc9ced975232fccd3c1c820c0c4317a65944b5e7fb7082428d4fa5d1323b80c79297fa47b366ad3e2c2cf13ac102292ecc1a7b6df1877895b2d6c5fa52bfa7024a1f5b2e75dada3c3c09536608fa2a722e96219ac18c38501cc5de0ff924242f01b13f1cab0b006b1f7326823475a29dc695ace41047ed38d392f3aafe7f8bc102fc5bbaf6d9e4056a1c2950ecd8bea7888f2e9a340b07c3f8e8f6137d211a5b15c18e8937d73b6242931ff523552361b9e9d4c9ee79a6ba07e96b597fe284c01efb7c2e3a30233bf94ae4e2e6354907f11763cb211f838ce0298803c0d9bc2792b1e52e362ae637c10f3a740394bd419005a8ed7370666d9a89230c8b546a4a6a76b215f625628b0204ff368eb80db44c8347d026324d88602539085e9fa9b51452b069889e3af1b6540a46fcedf2b404c70b23addf6c1d4fd049232b5602c2b85c779f01fdaad07479cf17651539bbadc7c507f3b22e490c936c299134199b98884e6dae8b043c699fbc78134e6e9c2aa44f60cc00e0590dfc98bbdb7d8eef3151270aa3acc4c00c0ae07513a396151f1887244c6b514d027da0d39750d51baaa026cabc31ab5650c99a6adca99d6396f4376ce5a02f8a5820ed9f96a610b26a63fda66e269251e82bb84630026307c9a5e6ac4d3efe0884d7e9d9b2f4130fc2520bfc78c6c9e4ef165400fd62f6e44c0bdddb67bbe55522bd3a236c50dea6557e83a31db47cafa7fd4cd9e1dd7329ff9d05164cdc37f9b337d49c9047b97b97aeda6b880069e9c6733c7e47b46feae0594e0ed7227930be9218da12f5e2afc3a60cb6bc507e0fdd073f335b54a70c39c4178d6d6ca7f7d09404c4a731a104e6744c3fec9cec3d58d9e6f54eb24738b5006adc469e38911a751634f24f47b7599f851c22d331c15ea029f2556a697472a3e5650885a4d3652d63e43a10603227e0cd04dda17a2a473d3be9c9dcd2149fd97765ad6d9af214b0c5e9ea8d01eb11986bb7be5e3d0aba1333593b4bbcd37900b4e2d609d98a393eccd229d4ed181b38f9f14039b6422a89e4afd3e9f16e77b2ee3bd8190af54604b5c93b0c32d498bcb919ec4b2a73d40e964b35976631de6d4f8f8fccbf65c7b5971a2caf3b22e34f26b9fee76f25c5d469ae1e1cc37b1a90f76e8ea0070134175949598599bc7c96610000000000000000a08e210300000000ae4e1b1428783875941186a872456f221e8a06c859ddeb0a0abf5dd227484efd76a05d9b5911fe1da0fc1c04d289073482fc37f63390a18cc9611ca5d7e58176c7cce5617954428d3601af4f2360f8ad849b8e2f36ded3a0ddd6d842cf28b0dc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f15750589f2aebea71913494a2fe6cb4ec73114e7e8e7dca18fbe20329e2edf0e45fcad142191181157b16941f3a9383e88fbb2df94d945396333aecc659cd2d8ebfb058b1f50cc4cbba5a708480320c96ceb000f2967c0fbf27d79afa480c3865d939268886c75e1cc7dccba6971d30079aa55fbd8eff34947b316179e9c9870307328d6076be38d54cfbe1238a8a23ad500f4d07d7868bc898661955887cbbff02286e8767a1384127e6a81b8388dc78eda47d1fceead2d5f79a5831cc5bda79ba0a020e4e172778ef565d814cc51c14b3086163448dd3e7a9eb1aa619817f67c9fb02d16cdb666ca35be6ec23a64cd6760bbb9fcdc3c4714f770a6af0ff616170500225be9747546e4b99850304e8b792ca27397c19eba48d7381a2424560f7d70c53032ecc09e86a720544885419ced15e3641ade211ac1d6b5ab01aa0eb1a9cfa7865032ddc87a0d4b629f8c10f6cb9e5e692bb57a7b7eab7391a9d3cf135ecf3f365ae0200ccbec8300f247b91161ef85437880b0fc9dd4224b2852a45f882bc38437fae031a0bace4dfb990b3790ddf7691ec037dfbdf0aa13e32cad48eee93909af49bd9b0340d459c8fe73a203848803ea5fedf86bf32ffb87e05a078b3d10c5528f32f9666e981c59495f14df4f726ded776a06ec9f749a2f4ce0f56bae4d25841bbc35e79ffda753cc069c3903797bf14d35de624e949d9ec15d71aea4e2a7f3fe3a082e60331bb417661f87e6f76632bdd943b249abfc2528fe6033f42cff1b710cd88e42bcf3246701a895c737771b3929fe8d478595a880d36c982c2ccf900dffd16d07f4af1a9723c374f04d182f9e403d5d8f8f1f86dab9cde7dba52da22b7576ebb65e2ca78eb2a45bc6349097b16a3af8508c35e272b2fbc3f9f536b38ed458b4e336a4d468c60c0ece2046e828f56bdcf39613146f7a1b376e65bbd916bb33031ceb33238117e4d498e5b9e05cdb2d1f8b4067cbeeee5bc7d97e70802b8fbe495ad2914d9f5d932b3b8378ea03d823fe289525169e4492973a475b5ab16017b4fbd9f69b4412df96a41b82bb454733a6053c71e32cad16da9d76e16d4f57ce1e42e96b393f15e4d20354d5202ab1b902538b50d5b7676b681451c78b3cc528b3f3b6b993affe54bb22ac36d2ed0cf506ebf1647caa5b8071594cf0e7278b20f358bf137463219edbc656e7d3fdff8917dcce1639fa64dbdc5cab104ddf0add1a77f62077abbf41db86e9183eae272ed39f31edd78c3d9ebbfaa51fdd6f80f6e5f034df728d804ac1a8e074a16a7f768d144bbcbf8781cc4733b66c124b21c71b6ef4215dcef2db683f8ee0660ba7cda4195870c1ee8de4d01e5e6bf6416412f3c7c17b0fd49fb6055caa49cbf47628761c3f637fde342a3173b0a205169bb9e4f76f9d2c96ee0c2a591f3e89115b5fb48f94d9579075c5b70ed3bb02738b0787856cadf10300bc02ead3f8037777de07ee43799b8cd672ba4cb7388f9695975fb4a272bd53236fae75c3f1408c44a1dfb8772e53ac0351f04608f5891b25ad66af20c634985dd1dad979a06ae25287db8abc3aed1c5077ac2a493eee3b53522531b0fa0d6c6b7c448e0e86b95b50fca565d7242b1d1fbf5dc2621b0d858b06ebede81067e00d0f71827429a2111c54a2aaa131348aa6457cdfe10077cd0e022ea9a920ddcc131151b121e76db8d7929fae95f69893643ca4584116c932ce3301f466224f55ac207775550abda2c94cba06d82977ec9ef177c0c65becdc6b2bfc9841bbdf46ca84d970108f848841ff4ed51f9fb536f39f5046fdadc4374727845adc025d366d024a172134e99dffa68f7287f70a3b8b9c2b11335b29951fc8ea773d3499bba8f06d91109e114fa869789b9db6379f2915842d9a597b7fccfd938cc909f39a73ba2b345f8c449c5c18d07a5d84fdf925e9aae4fc04715eac2f4dc036f4482726cd2e98b95623ac4af967804b27d181c7b97f0ece74c5daed36904651bd2a7895a05ff1ea9c336bae6ac300be11abfd4c0562a4e84a7fdd89f7fb6d8d4a9fc147952dff1763167fb30c15f9738dcf5c2c44c074fa059851d248335a2da30c47aa833ec9b13aecdb4f822deeb9a2599fafb5130be3ebdeee138c46aa24c95eb99c944f943dfc3e72edea8669f83e873bed48016e3edecdc508bac81634fa4fb9fcd1018a5d1b1ad284a163901255dc8aaf77697108ca800072a34d1875c60b155f5bfb8f5f7558165de35c82dbe8a079068d689c7a8b10e32542c97851c746b8d7e78e963ed5f9cd7ed88fea5f1f3c87032289b3c6bc2fbb1bd333294885ec42fd42d41a6936ec78f5eccd378c50f6e01f1c7ee3ddf5e83e0631d00fc31ef4a746738a07e0bae01179df6a018dff6b9ff789d53ab1c237e034b9522865d57d93a16db846cdc8a4efa8ea905", "acac", 0, 908736260, 0, "99e65184803f7d322f1c76a99eb8d7f31c2c649eb1f3ebac7b59238b1e6e46ad"], - ["030000807082c4030315f6be35e6573d19e08fc87aa9953e8f17e7a077ec964b805c0baef23f21e9a103000000009dc1d8fd3aeec6efe5d1600db184584db052fd4aa3d40f3c97990186288162f363482ff000000000050065656a52ffffffffc200b82e975f6a49c21be7a37da28839ad006326177665b808ea822699e8e6fa0300000008535151ac52acacacffffffff021e65130500000000026565e510ae0100000000056551536300000000004823bcb1030000000000000000c4ce8f000000000022f1446abffcde5780d8b792cca88903c773f9b33de99d143434a48aa850a2854fb9ef0bc5742947af49615335a331b4ebc61a150b66fa4687ccc48f9f47514b4b5075458d7c825c02a6e8daed912312928b150d60124b1dd19f6b639bd4bde600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000edea8adcad6057057ae9cbc2e2ee93b9bc776466fdddfbf8ea002740bd36c284245ecae5013ba23971e74f9e2e5d09eb41d0f200debd3364ce0355b15eeecc1f655e8f8d55cfdbd3118ce750c53bb068ccca6803f3b250cde88973c72ec96148588edfe7fb7dbf00ef1fbbf7e945f64c24fc035bd43c7c9048a00ec22c9b291702047c5c7450493709606ca709c54292c1a6f8314dbfe35af7c8b42a8c8b97bb790204545c225ee70aa0c5274d369355b1429cf48f1b78d01cc67983072e4d3c65e50b08da65cfa3b822876e016ded7b3c1473d94765bc54ef89256b06b3eb1d4f9429e075589f119ca9575fe3724c07076c6a882786da1c84dac43dfca5b0ec0c8d9e022eae18643c5e41259ca7e34fd495b5dff0e3700ec2a7c77067106366b52947d1032e76592da4884571d76951a4242fee72b776040b0a40fe737fc8ee6e5e25fc890207d8767cdadbf6c409c9a21249600301cf0e36a51609883072fbdb31f9bf1e650203159731b80f0b872e729a17d07cf5eb324791bc7ab1f96dcd6d8a5dab67caec0320bff69e0db5b0d04947ae584524fbd895896374f20017ed56d093abc0ce00565eb122e995390239d1402258f7006e785df7b6311d4b31483df5a249b763d68810409d5353f7d71a6e749a0118191b5cd082d27e51139ad2766d9e5b587a8c55ebafb89474fac62fcff98282b878fe2956709bc40ef114a9f30219aae987e2117c9001fc6d1aab66c0e870bbe1ec74a80610006514f9a6d32234e47242819a2ed32b0dff47cce274d3f048ab17eb20d2f5ed27f79b6946d8d15695d6e8bc7f053bacaace7429abd58385bce1658f555699e7e857c61f633adabddcd00025d8c0052dcf5429993e384b78eaae2b58686683a582b60d52cb80f7578dc2757c299cea6481181c4a2b6c905d8ea9c0316fc41eb5e8497cdc43c692c515746c9c6ed0e21a138bae405bc82cf631160b7de9083a4102d8b5132e32d17cab07a05cd7dd1736a6a6c38ad8491243bb16ce7afabc84ea1015e4c788005ae84fe9367693f2cfa228c034416d824bba2b715796be5739f5f045032c52e1f50b5f8d653e6d89c0168f4085695f829269cbc7abbb55e43b535a4f3c1feeab763d2eaa3423b796283401c35deec9f310414f9a58d0bbe82e6b6474592e7182597cf6f8f13d11ff5ca4aa1af9a22e53450458d2659d05706f87ee96350b336c9be88f74bc9499428a03877a95ab0b00fc6c1ae01be17d3ac69f528c857b1f6c782c02acd4a3b6ddb93dac8c643b21c242e907ec7abdfa3d3de60d2bcd97e31b64c388a72a156d4a1223b099b3738a7186b880caa64605039b09b497c3229367290fec5ee439549d6e8376e29e9ce8e72f13bb5f5b86171e0372878adaedd703d3f1db6ebba06a38a1496ab496130f8a8812a60794a6e1bc1548bda51a5a2195fdd381cfc0d79e0c8f9434d45bb6de3fe3561839db59fc70f79884d5f35ffe2e8d3179eae6b4cec2d88f84d1a37bcdef6a6d4c55cc3d73df730e4b7fc6d02c9652be7bfa47f0b92a4d7b970649ee2330f64575878fc50267d979878739f86af44cb1739451efd4c8825db3aaf329146547b58efe496d373db147c623d67d931867f5de9f3937cb1660328368e4f9d0e31b923270fd2a3db28f8a10d7a13424a9d663c5a898af16c141682b20b44959a915a89b15c788722410b983dbe81136177c56c28eed4c7fed960cef4d0814c55b6cdc9bcf53777cf3788ad6ec9ed4bc0014de32862b0b0898f96985431007ff918f1adff71a19fb8a18bb7f40d4e8c42173038b841a83bbed4073f79af191eff9b044c1205920530d31bf89d60f33de1893733009eabfdc787780479c6527ae80295049632f16fc974aa30c963fa9e8f70716e0f1b2a01470164955edf8550e28a441e5aea1c044b2b6bfc9e8ff459b15a48af23652a936eb4857447f22b7fb77251b3f086f27de37f032c6f01be33b08c6859b66dead306e94658a40aa836653b134e1078bc528b370f0689e9d04fba725ad9b76185f38afd5682f7ee2399156c7d62c2282938c869146aa961241e2be6568d8e8fb6bb3f2ae6c43462b74373f72562a9a6a995a0fe6e8061d840b44018104aa944d64158e7e32b01ffdede3c3adf815f11bdcd444e81e265370b1cf4032aeddeeedeedad4570c2ad8600e01a270ce7871433c7a798bccb9299af6aec574bf13cf62950a9be90dd1a52305bd58b6136008c8791c3e53a4e23cb7c9e61774f895e83baa9543358b2dee42e2c7988056cd1d4efd235910a20000000000000000c1a7510400000000142900b9fd2d3fec5392d9aa322e840ac584a4ffbc6f32eef6cc7b9a3766276a3977fb4d852278c2c99139e5762d6161df51ab819a6cdcbcef3988f071827af72a238d3db87dd3e83d6f9b6805829f70e570cb60067237599cb37e944e99a71500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d650b7081a4353d0271b1571c987fc291fe46cb44af20fbd80e5266445c579c4bc5020c6c77a91faf6015e5e0115db45f76d8f4c3041cdaa4c276df589d4e406b8c82810109f236d1a7b1c7ec8a74225b75a578e83977bf13da6aae6f4c35dde1f1e87b33abc672cd48d1938ca40d24e820541b64e8f69985fd326f130cc3bd90323e7873c249b4aa3f2872590487a0d255da4d060895fbb37e2c91c8089a11798020b450a46d9b087280a31eb66fefb17b646085d651280836617ca11f96b4496b60b0579f67e029ceba6fd7e599bd300472b45fa44f4a0a93f13c83426f7d2280d5df7226779ce05f91953e6d014ede7f2a703b4610723a9c827e54c79bf888ab0dd0326640866ee0d25bffbf9fb01bacae9cc80c52e1460a728e669a3824683c38bc50210c1baf830c57956d60162fad9d2dacaa9d753d5c980876099554bd51d982af102161bdafdb40cba9970d719f8c1b4d115463c7b1d19eba082849f2e455af4119d022335ca392922d1289f97eb43b0824f5910896ff6e1925b539b9c54fddb35c6b50201b884a3ccbbc5744ef32719407ee5981f5fea2934c8ca4fc83abd5beef9641c3a5c2be7c1434cd056bd8663c5ae2df2f616cb79f590c20add43dea0de068a88632b4a2cc97bf05d3d3eb6b0f815d29c9f545c8adf25d44be1a76edeb554790f4fdf2b93f7526019860dbadc004abd0bf4abb3252e17229059924c3d3ea5426f97fa9cfd2f95ec3da6231572eabf7d47b425c410e957588ea5ca07b25a641dec18631b90980da505d1f6ddd20acb65d1463bb9664842b7eb1eb59cbac9365760d9a2f5363473de1c7d6dea8d3bdafb1120281e49956244d4af2014b71708b2dc03ec22d476e24a4fc6bfb77f2471da9fcf66cc88d9279700fb1d8fd9c5e816cfee8eb7c5868a5504ccd25597ff6f6c3282d5ce344f43f4baf8fcae292907d0c26a4099e66e81d0e24f1a2d5a114fd4edb62ec47efdedb412c70c2b7936c05aaa5ea075356ac5274488bc719c12b5ff3720fc1af92444d1d5ef8fbb4d9f477bb0d0b642344b2f1e074b52a67071931c285bc9e0fda7f8f8eef2591db5a76a01d5ee754b1b16af61803c78f8d67880a1d4cb4a21515a86071d4ba85ac1e8856a21c1860229207f98fde16de563932c7f77b529498f3dbd441f92b200141cf1b9e9ff42a4e4bfe17b9fd38896c27da4796646a2dd657971551716a52ff7c8f2ac342d056e08591b67997a20c4ca287ccc8bed09b0adff0df08735f185e97f3f89b101420ba0703a72d3ffa8334395a2ebf93890a9227d099ea19a5993b85633ee8905e223ee3d55239534bf8a4f7f18a752e7535cc5ea9998fbf09e826f129a36b5e9235abd4210fdfc32e82af8303d980392ad13875cdaa4fb0c03f5ee157c6ea12af430b706da03c7a3ecf72fed4918a3d492400600e8e3b3e481415d69f283b9d5e10e300ded0ba1cdb4d28ae3838c98f080e5d4860249d5de209c0622fe2452c63d39286ef4d46a102a48b9995bda2a851980a93716e79a5c4695f19a258036fc22b0c75738b891d053f535d4eff4dec9b392024e3abcf936e71683bb1b8a508d32fc6c4d7101e3e1284e7c7466de24aeda26febeaf069e12624137d253b53bf0064bf81d7902c59cc39828faed0264c0d66535710a99f2b2cdab69bc5f67aae62f49581442918feb19e9051100cba72ae6c4be11a617f4a434d837ba59d0ef94eda1cf3f9fa025026080d6cf25f16e6d3b6c889a317fc989ca71a5a03ff7e4d2d5f4688c29dd949ee28760ff47e09337d94a24a3e472c26d62d41af2c9118900b6d80d676d27f0fa2503367e90e195dc0e386e4cf9efda22f306e9e8814d99f303c5f599768270f962485494493ca9800316c31d30cec356010a30eef91e6691309c4b1c4188e61b45843ab8c9b9957d44fd4e8bb531629e835b0977ddeb9077c47eef62b4c6e76ec44345bba5023002b76b94d0323dd9eeb546f589685dd5e3d12d5b9c6e5aba551112a6d60d86496cc91dd609a654a963cd7ebaf4e6f092ad17bd405f720499b7da5fe6f7abbd77a73734315c5b22b50e0eb88395e6607b10847aaba538cfea1e08a6882b6643fe559f056f73754b4fdc76e51d896fd351e9b463f7673eb5c6097bf3ec1cec0dda4f4427a59aeb9baa41eddfce520fe53d0021c3cbf9364e35080d0d89a7d310d386da726908396fa87f1c74347a74890183749fc597b98a10746758b29ccfb23ee840fbc8e2f146bc1c45cf730aa4bb5556f146b6a19ce2188ebba36eb51925d5f8f2611bdb0100000000000000000000000039955d806fd0e55e04a0a1cf237f536ad412cc2580da335246ce1991b2b5d3a632f439a46d84894e57241c22695daf752fd7a06ecb023f6d2ab1dafc4020e7b641eb210ef381ce4b36402c6a353587213cd1b093c563600f8706c4e50d7900b1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006c6dbaaaf607051e7cab20e0ca2a98f0ff1e05a484fc5034ecd012f3c42410ca2ef5442883f7c65f7c800b616b44299aa0bceb879554bd8de001ab16a6d81b1d00b11dbc6db58673a9ba329ef9bd8a319b4036292c1917d710af5db4b7cd371f8a6706164cf3a6623abdca1f50f3564eaa31bb9785090b7924f0e53c56bbcfe102079a88800e852e4466f4d8589f5becd2e81a5eff079797c48f469d57d5f943e9022b3a70886cd2008f83d9e295ea7478923962cf93284c0bcf3bce50c6f5b4b9210a0699366c37da066a066c71bb577ab794b36c49fe966dbca902efd801c4760dc4794d6f25f45f7af15edfca10b354566c906edf3eac436944d2d92102c6541b230210b6a58c9ac8875dc9055a634cea490ef455c864a7029d6a71b2dadea1ae0644020f3e03e3de038d26d13fdd9c6e9b38579e3025b4ae9567ecfd8d76ff9a6e18dc032ff97807b42031b5ea2d051517adbd2282cb92f92852917aa448bcd1a33567cc032b8cba1dae6e77fe93aff4377dae1290e084aaef7fed1fa9fef0c7c951393488020f34b3e835b67fc7d09245fc046d221046ef7b9d28e0145b8f7ca1fd822b3465835809da0ca97cce1e7b9db3b5c23e198c90b8e7fab1e30059d6b15f6b04e4689eb5fbec81c88c93a4ac55b50a028325c7163c6bf2b12e2f851f34be5f4494e5b08c3bdfbddada1fe6c780c7a32630fac06d0e6489ef5512909792d9f3e91067cc33872d291424317647384b74aef34c063eada13e723752dbaade27b8a39c0e20ec02709bc235557f3c2e0ea6e66ccb786c2d62d48bc9d3aad3025bb5bb706098fc74ac9fcbac9858a91feef6a9a52fdd7ed260cd330c73fe3e2bfb8f0205f56d3ef6bc27625029687e9009b6e220c7aa1c00b61008afa0ad460ded3dc20236ce9bba98c6161249c6e32de1af5f17d275ae4fcaf170d04f79dbb40844a4fc97b211648d929d5f1b70828db66f3e79a3bd1eca2f00b0592e990be1d7c03906eeb8a9050884f695f71b68acb35c3a35a667278f68b1dca573dbdf2ef02fbc59e37b99aee887fddcbeef0b014b6db3345b55cb24dc9f4a8732fd131c6e925e27690637743a81d0973356a36544b022628e3d8e242a70285f4d39476b3dd626090ea71f8cd347399879aa968a5c6591320259216c6579462ea8b52ec690539fd4a731b95f73887008cc7a31142fe4c7cb47089c1b472cdbccfa97b2edfb21ae65b5b9a9149611352f0a6e4d7218b075e348fbdb6256b6f0063f553b4222c844d11464152374b679ee68e862ade0aeabeed4ed7e5220ea5570ce1c37f14f309328c8ad5b6eba8828df9dd330cb27141540417213e26a76b74d2741b4dbeae435c46d0f76565a4720589ec0302cb5d9f9090774500463e7dddddb3d8731a4852092fe9801732dc3536e7dacea88f9b1a3dc9ac7226451d3d7913ba9d8c764e7fd7afd3907f064cc70739dac2f444a5762bd941ad345d2bf9b8f4dd8f998e869523ee398eb84512dab8673649cf649af6b9301c862399edb72c07bc19d7dcb428a29af8aef8bc42bff0847a3a944c59c871a6e365f2d1f8ca1c745231201a1b8bc78dddc9883ba5359e62eb00c24761bdde6e6761696e04ca565de461704e67697d3aaac892021c6be37edacfc310ce880f6b1aed1293c20926d08fd04892c84963a8fe8f31f8ac60e6543e1c95439edb85121fd6db023cc37495ad359367f86e80ecd37b499ce79bf44af4165890990c88d1f751643ad8e81dceac137f447f1b99e6d4ac644f7c15126ad2d6ac22f52e1c9712fadbd9af06a243c9b8ad06ea17b32ffe9a0bb5882e05d3ee3a80d8d06de9f78450af2a32ed617bc365e2dbb8f5728a0651a10360d909ee3532a0a7ab575f7c3b2d18d8f74302e0a2d452e6ab9ec8da197c568d32f7d3d789d99e5814f38fbcf5d77abe1a0ae5821efcd9b71d3c699576954a76ea1daae5a348f64b69718fe1a91037ad67b0ffb095d0421609058c66f157976f6fb15caed8d1a0f5deb569140b797557aa5507f42bd8c2ad60e44186f277925c1ef8b3b23f1df1d62e0e0b0cbb9b489f8aa24128a6042b04b95f2b996b6afbf366eb1a01b1433df3162ac36b6ac968792f3293ab3877c9aee46046afbd495bbc167667e6285ab1ccb8919ab5d314e4a6f2e850b38061098c979d6a486bc1ecdbebe3d7498fe99cdca871aa04286f8f965035ef2114e5e45f8170d4d7d98320850eb2888293179b120eeb848e00b6884b10253daffb899f9710af060e498b33536be7ca604506c6063abc1505945512576e59f4aa116db9a2f2282f37bf48df413e7706124d59dd452efdc351f5ca7d69fb39d7f7e16adeb067730b25dca9535ed1c6de6546a89b80f8e37a7c0960ba6f879611f4e6775d167faaec3c3073c67d87da01756425f48663d45c0080c06", "acac516a520052", 2, 1491435231, 1537743641, "4f9aa955d30ad19e6e275e08a8f010544e7b4ac1b1678f5ea2f671c282e7e768"], - ["cc59220904ccd656f82d14707f92522d88c65aea5137f4260a28cb8d3d3d51e2afcb730fd50300000006525152000063ffffffff0a6d5009d576abfda1b32032503b7e31cd57c252b46542e33de6ebd53c60e38c030000000652ac6a63636a6b82dcb55025c0c7e8e8fc86cbda6e01c4a9cce2ba6c6bd6a45099c62197c38afa6fe251010000000752ac0053515353ffffffff62c0b3b0d20a8a48ce889b9956d8753985626390b32a7e364c63a79b9b290791020000000765516a0000516affffffff0479fbaa03000000000665ac516a6552f300740300000000040063525206322e0300000000036a6a6afef8ac0400000000066a65ac52510000000000022d03ac0100000000000000000000000005e1707c57dd9195b39bd517ae8e45d8aed88dbc75fc65155e1908310027a9022df0cccd0e247dd498470fcde884895b5c6729290b1d29ec387e211e6b28636bdf60052f87b2edee64cf51440ad0276f3a003b5af74b23897c5ad01c2fc6d6e600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f283db789cafede422b456a961a141c873e8fd495b976104a74773ba5f4bda15fefd1a9ca2abe212b6860fbdba83257885f4ec360d67135f0dfe6fea59197f64c186646b59662adb811fbfceacd1e92661312e051d3fafa60f3759a8f2ef7d6233061e6134cce3d8b23ec1fce50f687c114254f030fc6649463eec140bb2d225030a8bb5487cbefa323b6000bf80a3a44f32d80b446b48a4e6ea87d16ecfaa28b50322f79ae6a1bb503ec9d25f3bbc38e88dc0d4a723c7e3f78dc54ac5dc02acef130a00a2c105444709fb33c12b574d718adcdae9be5c86486970ddcbc6d8577e9a60be36b841875bd3381d4c09ca8f8f2af96089d22526c6af025431182e1244492803059299d7d624e931ffff19ecc409591809122a747ec96a19a51d289388bf76df031cc4ad1bbe78bc19d5321c6e57c04111c9402791a1e6a7ea870440a7fd263bb20322faf97c389c5ee5217e0c38d7c6f49b1dc24e6d13d5e45bb9d6c30b094ac4c1022116b9bf7cdc602d92ddba6c79776b440748be8192c61de9a770b186f37f787e0226a86ffaa606ed6d1be3d5b19ace53240f28db7aede8cc1fc79b766d28cffd43517c8f8e11c101fd70922cced439de41b594a50207f576f86b31bf441252123ddff92da811f45b80b67507dd9d3c570e27c3ce9c5cdd845f18566c181f59e756cba5f1343d5fbd1d38081937a86e7c2c857ebc075e6c37f93b87bee9d50a5ac326334146d5b6a888f7e48f289d3e03ef809449d911d8a6e220be4061073e7d0bf721729e7f64ac3ecf96f4919db9563930da1846e2aba731ee59d2e7aa68b5222ef6ef157ec3357063c7f3e6f18072b906a6cf19024835eb8d4cad0c85b35b8bd1362551145477a98d19fd990caa70861c09fcf1ab43e48d518a5d4b9b5cc847ea689ab6a68908cabdd4c3c53a0d38d5701188d9525df2fc79355a76160d74ea003435dc4fabddb76830698c2dcdf09be24dc223c99b3a819589f832b0192dc64f1839376143b583339e87bd363668e4d96c6fe04aca9406ac5e94e1a31398e6d780b63913629b5b4bbeb5c60e9074fa37737318a74f0c9c86b04e021a29f8142383fb5d84092a4c5284c69180bf53073af753ecbe9a73b889ef415309027597296378ecc5430e00952a7fec1c3d9edc636e578603f27cc76914698be3ee7d8c86f8466d90f17e52d10e58325806386d8b8b9eb85e964e50ca36009c01f25edd3d781576cf1b132dfa0d99ceba7ce1c9450ec80c48c3ec83564aa8ab0570e6c1a13f71d0c49afa95885c51596c9727f6b4dac5fe420e9a2be4dd160ec676106ba2978e8b35b6ab33464ce2c354cded276562e148cef51b4cc201b30510a6acf5ab6552a269b1c2481de7130f018ececcc9787f3db17f012c6e628f7d9e459621392e2861cd3e7ab29dfcdfcb0bec6a74ca2fe59aa83ec4ca6d11f44b1579d77dbf88aa1acde70d547865fd2dbd7620be44598027e9db984d12acd5540863758096c700a9061d1660d55241c8ef93521a32a2428698778cb3f7fa76f22c8ce673f4776bfda628d809597af6baa5450de435331bdd4bb43c4c15da08d88cdbd7582abd3d560c85f5602eacb99831225549e1de2148a5ccbb9734d318df133aa6ab526c2c5feb524899da0bebd53e929e05fa8ef018789761a7fa90c1521183e330feadb277b87c703b05c1cab434a4b3d2d934125a0ce8ca84d5c1ea4c32d3032e9606ab77ea67085a6d42933521119d10667aa07ce736a66efadf51ba7c5c9a46e3658e345591ab4e7c6e60237ff906a0036b953be344457b7f66802e7ed170b83ea0d5a8e76ebbf4ac18d596e031f218753f4c2ac94ace90ff30d8ddf3b5ee99270169ec1a21ce4fb3ac4c4826914d864bde5290dd7fd21512e7318bc4c5dd88fe8eecfe221c261a9ebc68c848407bcc7ef10931ece3c5b7bd1bf10e40a2b2c7e0e2d055c24c70f139521540c163db4256bbacc7288e76f7dc0b188cb51a95fa1ff8c857f98488e591a303d30023852b7893e97440853c739b3fd0275fbb2a9ed0de6c2122a39c4f3111a67e12c4ae2b836dedce120fc9e5f359a7649c5c7200887c02d2ae84186e3e7a4f4ad248bc549022662a0318f931b2b18ca800eefceaef4a62df33ad340f320012cf489f621057417e1a4111240fcfca25461b6e24b1f930eb06294f0737f43bc1177aeee43ab439c876252a155fa408cea4ae7872dfe6f41864ca650962c943940eec206aa4621c0858c443a9113bfec3c9cfb4f48908268e53a66107fc7bee1969b7f3984dc468e4550002000000000000000000000000929e78f0d7df61df1571f5a707d89c6be8ecb09d4fff9427ed89e212bceaf4522f784bdaf2ecf52ceee921962a61d342b2a3c0e53857018bb446f14223e883a02473779cabf0fb8cdd7b0ebcb51b7108021881ce300b023ec3a8322f7cdcd33100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c4acca77fb1d6c140800487aab98ba15f7c69219ccc8da01882966c8c54115bdf3718deffc90567f7e10cdcf6a244daf25d4de6b7b85ee3d820d3031a37e768358a54698df04b6cd0f710bc1f2b521dd9524cb0067bb6133771dcb7ee317410f76d839c5079054118a5df1fa2a7f02971d2c2e03876bfb1abde30022035c997703172dbfe0347757412eec17218c39119afa9d33d5cb3e18e7cb366f2c9dcb750003127792e41246ebf058df0e2f8658e812fd5be4265abe9e176fe67508b9782b460b086202941b47094a708c79d54175b0c3773f3353046a740e3bec759bfa03dc84ee681a7084cd4fcc3f7e9f8ca544ed2918b02c8b35a00941e3d344587369984b021468bb1e920b02c6434d992255b41da5f7ec232da80f3b5a8c54d5726d0e63ea031c341371e76301880225b82caaaa0df05350ea15932432ffcb6302e93da144fb03157da5ffe1d2a02daddca602c110706ac4005e8907d264ddcf57f5e08974c088022ee8749cc03ba6ef99135239836f1ccbd7226b9f9353d7e7f0e6f30dc3a2327d022e3a283ce60075df0530100103a28f8983b9c25b1cc9a278f81fd085eb2b38667c3fa4610076d9e1f575f9196a50fb9e8a3e36bbb86712e63e47da95905f19de6bbf1a15c038167fe84a8c73b50a6517e196a7d0b3f592f85746ffad736b5de1104d1bfe7f5ca666709f6e49e98835759a0fad7244459d0c27ae5aaa140f4e7ad54e277ba942368dacf40a5510f38200bf5963fcd6203306066d6f436e72dc8c1f677a4af01f294a32f099b7905ab408a9c2d42d60afd4a1f2aa4938ce8010f4e15425a4d2649132a34934be4ee93afb091461cef2851c57ba8a88e44b9e243d30992a084e8277f971a777cfeff8e040a8ba0a9e6578d7ea80e947716bc6afe9840035e9405de8ca4150952788d13bac14ab168cdf3e3a976486c2422694e2f9649dfcb2170afb66b0a54a1a98e68d07def9201cd114597507139e164ad26915bc74d2da392ac576b9830cf4d53b79e38e6f602ee2a6f96cae72783cf5ceaafeceef03937640f0e29404caead4becdda053951ada42d18bb3a2b2dd25efb7f640a5bf9a44c0690b6c28b936d1375c73f30af757e13984f41d03709838a433e547358bd2c78f4290b70abad1febb7b6a0c4ff72202ae841a78a5723e5fb48c9d93fa54064885a6ba296502efcc0e0051b781f767bcc9ce983d72aef1fe1cd2ed63c0d408be4b45734c8cc8ca27f96d43c60e63c67c517ed19398dd8402573285e93e7e282a180733e2c71440385c37a60e8212ff0469b69ad65f98e9b52a94437fb8bec958f05eff6320d6e0e1edbcec7193243f0f98f40d84b4488f95a73b1be1a75cf65f94741c397550bcc2171c2e06ca8e11512462673b659e1bb9cdbc4db5f173475338b8a9d7d66454daec3882697fe5496acef101cdcb36d5ff4a4d6e270710491c6f730fca8dce1815cfad9ceca5792bd8da88b62ef41c20811418bbd494895805cd4545ecf00101824ad2f2b1bab71d9a05a2c3a4c2221f724b30aaedb5892180bd8218260d610a88837c62bccab9a0e47c71d124bc3f8fa146043c394442cd49b74b6cb836684a80ec6d75a85fd219449289eac35f32227b24b3f4e83f81e7a2e3fe61ed5cc350c7109ccc3741f4d405424aa0b25471d1be507b82771106679f7dac3daa00592180f90c2ff0469293a45bbc2e08a506005d7d0be8f60aabf044e6a73f9ce9b862fc2bfb835f4912d1afd73b4457f7021f0c7cee531b601510b39b15101ce9246603c258df57ce10f56b71f75cef1c071154c72cb0edebc5bcec6967e79370107ff9146151f4bc3a3b5035a86c381b51aa868518445b7bf2556b7328bb7d3be8a1e82778d67f43c2670e9fe7736f9391b23533ce774d923058966d9922c3737caf41b607327f5cc6b401c41796c9fd96d5dc7178c15a0cf5a3d29929016c28e2291585535777f1763352344debc021c6f9147592e67fac4e29f0d1a5f394c8fac51346a3f9f83da9d04fa98463c6476fce250aedf7b1d1116dccd17f5eb66132d57931d2ae22963b225c8bcd0e63f8a0861db7b14f173927685f88d755c7c24327ed8b413e9bea9fb0e6deb18c6b3d03fe7b03ed24c71cdf4ddf4764c4c8c3c063ade6c0836fffbcd3d3e10dc06c8b480efa92afb6cc59c7285dbae191eb89ff694824adcccfac7eeb9e9592baa9988f6ead93ffe5cc55544cab21d84381c7549605931f6145ea284102f0ccf3cd5261a95984c7dbc746c340363a250ff053161a45c30c6c3dd28311122264a5aaff3cdc6eb63682af511ca3d51ddeb0e4ccd7cb193a8d6105d68cc3963b082014b10fa2ebff1de71723c3acb118757511a551d0a5f03a496a55498dd53e521665c65087ce308c3e9b625e6720b56595a0e8a3e92d5c551172b02", "635252516a", 1, 177775919, 1537743641, "1d36e841d2bf6d2a64bcc57eb93475550de48b0b64d56ad8c8c5e78e9be172a4"], - ["030000807082c40303af03c103b0e8eba9e94db6b4a2f44d686ff87d4b4a12b740ad24f38608f192df020000000465535252030cb204ac1c4c94fedbf0bf10d190af06d5ffa5d6b1f21e4bb8c04cce5acd0db838a336010000000463530052ffffffff56185a3592b1e0f6f105d3689992833a2741b7d794a1a6c6f80ba2a31a9e3ad803000000086352526a00ac5100ffffffff029a0f1101000000000753ac6a635100535581c8020000000009ac00636a6a00525265f1b9b065000000000172f24004000000000000000000000000e69841e8baad00fe363fb79aba11d6a37db99ffa8cb99ba4b0f38dd2f42b8dae641c134f75ba4ab5514fd2c3a55af89bd8b8c69ff5fc3398cc4e2d0dd80894ef2f00b4d90d7d8ff1e0c12ee910a08d165fcd315775be381489d4d586fee0dbb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8e324250a058a4d802a3b36a6fefa7796cf0d14fa6b85cb757347b661055740e0ab2120f5b0270c66eaf0a85d42440af001e9ef21b2bc34c47084851719cab44f390e62e93731c543712b3cdd68d95754dd3bafb7f11db4c7f7b4650322ae28af6de9aa8675b55c5dccf9205f59467c3c81a34fc039873cdf945f84f3bb1571031a65457ae4070aeb072ea2b90b35a89eba80a3410c641a0efb363701b7b31bad0321da1d1f372f47c78a728cc49f80d7a76d702a6cc12ba3cc63937e93a20eb6a40a029d9ae8a1cee8d55fd0a15551c80669ac1689d999e9d8e2b04930dc54c536c5e937d000cfc71b66916830beb30c5f949b0bc16b3ced58f3fdafe25f250f9cb103248eea974253de6155c5caff2aba6a7b1fa20f9c1136c46daeb40cb2570517ed0221ec9c159d038512f5745c7eb28ff2971867be63175742efec4e3bcfd9c5cabd031c5d26fb3d7c92e0e5cb09342bf02bc54c142b428b0179f2748a173dc970878f02177ee87d1bbcf6264d2f0de1a1628d5ec4b7b17b2745793658ad7e0379c8609b0224b26346389a9b5314ded8154ccb25d5c9b04edc3aa93576f74b2f534c7b09b0d7355751943ed45134d9b61b24eb0e5cdbaa3598f21b99f8e9103cbf8147460f44d263a1668b4948e99b979dfe4c916a3c9f4b18469037f2ef3de58cd3abab17cf69350281507668a87cfe971cfac38334f2de04d8a9fb4d9d2634283a3c101cb43f655925f9759b45771a177733a379e46aa88392233e580078a0b812ad0108f180a9eeed9836ea2bf12bd2fa5ccc6f2ed543dec6f9a54c85a98471cbf381079613b277b2cb3e893cf7ad5ef2a4ad375651b52f477f3ff524b05816b9fd970ee05bec083e0bb71eb4efb87efc13f5df3d603983497bb275e8753cf98cc7bb27c5729d7be8a491985f7b6c070f7e41b5bc916cba9134f418b8d94df68f149dbfb1fa3fe831dd044de6b063a5368580b4130d0b62a761f6fb873400926967ea3ec7d93d8cf7e9233a56bd08004edc41898c5a77f800d952c992e0f4a6da94066506c8fa0f9ca3ba27192ed4ca7eba7e9095780962a867129c5d1aae17fd78014502ee277e8b46f77f9db4a6d26b9ca8b23ffad5208406668ae5ee5dfe3beeac8c3562683b77b1acae776401b02bad1b5817e592587962807977ce527610108a6d6305407be8f2739b2b7f236c24fdde64431e1706fd950de9cfa372ffd77fef2daaea563f6deb21834418e1384cccee14d3b9f583826fefd37e97066f7833e89069be6037458fdfb2aed7838aced24ebf4373c8761d32220fb8255792bd8ecbb92066a29b17ef6a531da80ea58bafe4523fcc4b569aea867fca99a555593c293ed230b158bb8d220a5858b43d6b12fd9c76154c04d580d3ccb772db69b92ccdc4ab93b3ac5dbb70b7515892c099834fb76a567edffbe5dd714f3fadfb73aeb41041b963dcadd77e5e73f8d50f9b7e3e98aca16c695960b2ad1f9ae16ea565ef937da0fe95807dd5635483a4ec77e1793c4d23f9a817e3e23fa573d6ceb2b6ee5eea948e370b6659fa7e9d541718c727426a1ef34756747f1b8db6c7efb8a3a61c8b1c4e36ac96669a50deba8f46e8938762b2b42ee1af33ea72cf868e8ba6a2f9144969777a8b15ad6427b16015e648d7f09810c804461e4d761854223d13604337de4b2f79afbdee035f5c0519542451a6310687cf105d2f762b93259c6bb977a8688c8edb54f5c9db5cb5d55c22068698332062bf8a2ec7cbda58a591f7d7fa449e760227b6588e3014bfc3b208b08b7ecc29630d9ded6e463193242676d148a7cb1e805d438f91cdbb1c03ad16f48c781b973afef0762d81acd33c275c88e78ac1ab814d454430180de0e72d3656d9f0edab8dccfef398dd801a6db1eb467636f8978bdfcd911a877aa1383da2a200df9ee168bb616de26eda25b5e8c6d92d2e993905d4672f8a3c8ee37c8dccb0b137125cc275198f8ef6bf4e323f27bfac4e3b5fe3105589a93c999ee1f41e03351fba182960b6a0bbe91cef38801ffa52e833bcb3d93a6eadd0e4ff755b371216cfb370b1e2903c464601e30d1478649c38a2229c3978a41d740380b41e8109a8855ef4b1e7654fee9ba483fbf0a3030d6bd9b4aa4b6ff30f7b120eeb8b5aa7ecc9006f202c11f63b7f295b22e4b5dfba64eb220534197d70cd1cf9225e4f1ab0c0bc08245ba71d92e95993fae33082fc8ef6bfa66bb4cae306bcb397b9f6603cc902a46709ab9f4d9e3cad168693f44a75705f0a5a5fdb73852667d69459b9daf240ecd2f99c696466e7ede374705be16c7c87756b11896c2442e8d2128cfed0a235b9c15081e39dc8eeea71166cd8f463b728dbe912057214b245b61700813bed19031016285ee2e7a61c52c886c2ee127730157240dd4f07b7320b727def004c01", "526aac6565535251", 0, 229156274, 0, "979960a8f53899b5525f889eb23765d5824a5fca97cf093f7e3b209834c14e66"], - ["6d3dae7702f78a419690d733b5784cbac07847efadf8984e163417d6484c28aaafa54ebc9f010000000465510052dce4f3d7b99803ad030c778b941a0c0f82ac1aafef9dff75fe13d47afd0bbbe40925a0890300000004ac536a65ffffffff0108cc71020000000006ac656300536a00000000010000000000000000fe276201000000000da654580b3a07698f9d86338268330c12091d5dec4d0a0030b567f0f05d2ada3fd28be62cdf2e716e1df522a51b9de558df2c6d4b51b8cbe2e8f71b8fa7f1dbb892459839239da967b48750a8ae4c756ef7ca4ba60797c5e2278db418c1ac8d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f71d4f3ae1f5aa696a7b558638fbf24c7d67953b096fd0bb01becdb210a59cee9fed530e37073a64d422767a85b064bc1dcd763d7e786f69619e884d2a2c0ea0e5c112d8cb73fea79a00825061f92fcf1ec3cdd7085f532f4c714b52fa0e0282d1ab2fac2c73335b8a519190097d66125994185be0694781331e2ef401dded27032296ec75d82149d1045cee4f258c45e713f7898d82554d151b094a3781b96b87032805fba7e6e3e3492794c7210398756f4ccb7e60c10bed5d3d54c62d4bcbc35c0a06a08b3a2724b03ea7f46fac5321ea1f6959001c02d3932337583787e6b57ee71ac2ece5c32ac1b9f30217f99a8ca4708a8e3ce66e5ea2d460326220db7ac5d7020ac74bf38cd5f561756cc2d39dd0101b99ce10e08a36bf9d3b17071bfa5cf677031841233f3eafcdefad25d1a878c2df6cb2875ccde2e9fc09e5aa77451e5e4a34022df5504ae831427946d69d00e7762a88abfdc01225e8c56de4c381e2a79eda7d022e96b1991c08673573965532c4bbca668a11523de815dd72737b3c8d02b9c55602021a8d0de77e1900cc7f7e52c1d3d1d10320841a678cd38e21fdfa7a29397e4e2f4f34ae757a0308c30abe3084a353a4e8a9de1783922e541fecf326e9b853692d7ca99681aeee5c1b94317b1cd1034910db706501f9fb418321372c90baad4f3655c1272d2925ea00af9abadd7a64aa194f49070d484c67487314c333cbf829393f77fe856f8e60b3f685e82881c10ce57c8b1d6065acd87df27106d97e1c2c1c048c731b69056d467869bff46893b92e79cf845530e6d32cd064cde2f532d27aa091baa98fec74d172e487ffea58d66e38d3f3e713593f8fc299ed0ed92323a335492aedbefa08ebfefd884f68856259ecc5fc969c21c1b20764ba3cba7025a543fccd628104aa289c2bdd102936a643fff74342ad332f95e339fb1619969dd90c3317e8e8bb40955893db9773ecc69e7c27419896b18744167d93f0fb35f8d7a337b547781e57a97b28290c4dde17524e9dcd873f53b1e745bb99369744e8bdfee4ac0bb01f5c09747ad642a956adb88e385bbe6257bde2a8b4c1e91f31751fdcac059eda0ba093113cc3916a6da058e9fc733fb8b06f002a680dab200adb1ce88f6720669615c54995a1e2306a302a412a68809a9f0985ccd0a9f5348924750a7ecf24009c8509222c55e847b6ba1bd5388a8c0804eb459e224fd83bac56f27ce9d4e0dcffa8801a8dfb8cd58d3b14570c143e4affdf071013be8eb3edcaf5cc3de6509670998be82a98a0549a3f38bc32b9fa08a135087b62116ec93caa381d53355a2c750e8f3c087c4f49adae8739cbc04e20443df1f50e2a81657e93ac442e1714d6d6f8236561e8a3dbca8f3dc907ca11eb2ace4ede2dd59d8e06fbfc1ab5eed1167aaf926e1efb0db3ce7b5d358949e41b7f7f79b0196eca86d5aa7ea2a5f3f8c865ee221199250071ddb20e76f92f3ab0cdd0e71028a19041a1d762972b11ec7010da94cadb20a592b2ae24c4749adc7f44731af5860152399e2ac1b5f48880729d52a904c32592af0996cd5e730238202766f598aadf36eafe469d71d2910209c90cfc15c977af9bf43d575202960612193456e2fdc60de8b7059e699c04b18228998449bc61e71b9d2f9b6dfe2eda0ae86f7a15fa9adcf34a0cb85a283fcf9c30e882ae53bfde1fbb5d4e56649c6ec80f0ce66e01798fd1afc5eae78f485e637ccf977287347da1d43436a6ad3a021eb8877a070682abb63119a78fbd4209b81c064c13f4b5ef76d7d080a519afaff1a21977b209ff1710a1d87e5e6655d570e8a4307853928403f46ff3bd8e80216db5ff129b8f85c2ad992716bb2aa9757c515c332d5f3cacd3b73da7051f5d1776fc2a8d4afdb3045e83671cc1a2999d8015164ee710dad5639c53a12984f4819d6b4374128417e9b46095be1d24279561caa7b293e28b2d69e45ef0a1ae07fa3fac4191b13c77d04579a11b49e66249f9f7be7b29fd40da2b6382ee16298768ba56ae679a236873f91232539279112ead73b0d528bd1439ad187d4abc2e7c13b518c2d4e96a9a61dc53e31cf84b5c5019a2899d8809f04c361acc481e7224fc2e77c3a54967432995333c590899dcad31c09af37d37df5be7be256d5c9bd7c2c459c63312839a07c4cb18623d044010a3c7c53dced73b37ad844f990dabbc16ac3bd58677b581b857f762ae5f372e70523640ae32a3692cce32e91d23e2b4a125d2e6b612ed7824ba8de4e2f782ddc4b4d5d2e547cf86603493d31501791d37132316f28751c8cd40ce4d3a59ff6447284429db48a2bd6ab4f0879d53372e65af958914ab069a682f7b35cfa07060a9a3218169d96d19cf57bab882ce7aa0d15d9c6dfe3a1c259437a413a2cd3c8d1f33085cbd43f3fb70efe1452f0a", "6353", 0, -322603624, 1537743641, "1a4101685ad48516cb541039bebc6deb22dcea93bb2d8e9484b66904dacc147c"], - ["030000807082c4030460a462ccf8b39d7ada3b2f8489905d4d091d6acbe9ba444d747841a1c0112785020000000800ac65635153525151efdbdc93bb1109414a57f2565005f3d16e4a41d93e7dbaa888cd06c6ff72ffc937272a01000000005c4add8dcb5975ba1d32964ce5bceafb93ad913979541d572fccbe06c53447fb28a1a69c0000000008536a6a536a515152ffffffffc292b10d5c176f368475b0ead3eeda414b39f042c135747f96e46a7a293d2cde0300000001ac2f11054d02cc50ba0300000000090063515100ac6a51654b28010000000000075353520052005168b93ca90000000000", "5352526353526363", 2, -77478050, 1537743641, "ee742864298d1282dae5c9374dfada9e564a93e861f11be2b5a75c21b498cff3"], - ["d91ca15f047e83e67f0da1bb77fd46c5129419d3ac51868027a7b821002e2d9232dcd9081d0100000000e9faa1cb42048c97f8ee27e85965ffb7c7726da6d48fee65c22cb10e48d5be47011e112502000000026500ffffffff6abc757e34477ef080baf5cd9d83ba3a509e4c97f71e00af14bb4cec6cf1ca0803000000015231618d7bcdc4e8a8d448710a2fb143a9d21da9a815ca1d070e86453156a11b44fe170ae90000000007ac6352656352acffffffff042f5fe6040000000008ac650053ac00535207e6bc030000000003006a6361378c050000000005536a0053632aec4d050000000007636a5200ac51520000000000", "5365635100acac", 0, 321426547, 0, "5fad47e20f1e5e65c0252feea6a703a3f13dcbb8c15c90e09e4f4fe3c74417b3"], - ["030000807082c4030200a5c9c421733c25c6b20b27213cfdbf0f50b72c0d66ae75b4d57929f476b46e030000000951ac6a005353ac0000ffffffff3d1d5190089bfcc99ff7e55bba3e6b69d66aae3bb0d62a8b3b4cc5ecde718df803000000056a63516a65eba382360472bcb5010000000009005252ac51636a5152aab2e905000000000055bfff0000000000065100acac6565fae62b04000000000452ac63653e3aa985c20b300300", "5153005265005365", 0, -140897409, 1537743641, "c0e8a865716e1de8278b204d6ad1821ec0f7c88ac956f549f6637ece2b8de6ab"], - ["030000807082c4030434ab78c4152424bca806214374e329d04c78ef340bcc5c7c3648ca6fbe3eb9770000000000ffffffffd258f99af2352a4c3a2f799f0bdb8b64a6b91fc978e582b1a07daa8bf75cddb700000000016a2d012e91c2188267e92dc7a84a2689d0df18fe85d1e6b957f0b5cb53d6f134d40cfe8d10000000000200acffffffffc3c992fd5b328fe2895827f4f02ca08b0425c8148635890ed47af3864afe022600000000086a526363525300003ea17d2502c922ee01000000000800650000636351ac1edc2d0200000000086a00ac0051ac516500000000b50157b402000000000000000064c66b0400000000773ec5b71403aae6079778c24231c5c0cef133b15ba238ed77aaa8af55ce7653932e6cb5b981ffa73d56a9309e75dd73d1bf78de46e3d255436a53e65d39f9890064f26215e73028938f526ae16a7d4711e2412944c892934c1b5b976d9b738800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000da42af72cad88328b7cf4f89d61bb174f33ca5fe9783ee7c0c5915aa3aa7179bf48b9ed2688c4d4f08511b008167d85e0a011a8085248fdc57434882b1215c43f48eb128609941ebedf0afba87d3de22a941386269c6fd726035376e4d74484ea12c3b809b91cc842dfaf122452c95e77b836d61c697e5f9e34915b51ff4c9030318c07f81c203c73b11baa8fc15e4f8e60963d26c3f0ec8477925528009cf3faa03175b76b60b0b9d48e42ef29137ce0252ea9dd051da6addcd834d090eba66e7740b00cbab5bd0909ee2ecfd10f50b7305aa844f27650c4ddffdb43b2a968407b991b87cfbb79218fd7cf902e6c81863f9d01b53e96bc90a4a8601da880ee41cdda70309c7b69439b09f6fb1bad4e94c19db02202e5a5127e0d542e291f510140adb42030d70e3dea2d66787a2f8cd492dfcf3378f8bf88666206bb5cb8c180898020d06021f351ec24a84f53288e33cd9d5db8bd7fd32e74e1238a448886e15c7a207c1ea021e57d28bf31d684b41055ce8ea22204f289d3850ea512b5287b0a1560b42c967020496792473e1d38668f4cd8646c8b87f5a4d0a5c1ffeedf600cd00c1ee1b22b2fb4b28f804edd675819bc636541481c3b36ed471e665ffe021f4de2149d07d534110d5472dd97d61deadabef0260e0ff8a5d57bb1bfc1810c0a9814a0d3aa991c911e12a6b68f825e23d95a0a2178c0719f0899bfd856f43a27382e3e998d98896b7c095ea8b93efd4511ec50e6fcea62be0fd32b14c537e979d4cff14701a88b299b4485138354ef3833b7334fb61c2b2ac7188213723f25c51ec6e92c4011f66d36f1de30d24a0fb43d7afca1dc3139fac891662a716705303b3e49246a913a18bdb20e7137f7715fd8470e59f441d5021e8a7db900a17803c70a7fd77f1797e7085e4c074c9b67add55d5083a3dece71f8596fa2eb21627c49703abb95a644c13db2e7b3b0b88ce6f84b8913c2c77c5ddd629fe74d03a7fd1c20ece638c1439d54ee7e8e8ebd07b7982ae525c8217d8e041774150c9d97bb5162c341ef2b539d099a3963e12754a0fd4f50be10a4354b3bcea62e923736a98e61d18b0c6a4d8ef06aa0a7e320c2b827ff6273d749f5fa8d9834ab5c16262eb7b0575731494d54cfdddb2a75e373039ce3fb2d6b6e2241b9499654216e0c750d64e772b881bdd18f476fe951c53b69bc1c0243a181bdfa5defe1f5488d01c8e4040887480b1910ba4d4868a6774e475c5f703d5bccc9309d0e2ea5d2452ce47e79ab48a07702cc562efb9835ec4e3588242cde00c49d6e9b419b845053328cf0239c514b0b83fcd5d3cc21a23c29a3998781eb478cf812b7216aab7e438fa22ed350d1af200ca5b445c1ef344169153cb452664a1af708665f6fc1e98883e5e380b206c56db7d164790857f1c22d381210a5167570a358bef538217d4cedd6a63112d4c61fac1cf31e8783c8211cbbf611dc589f0f14a23b5c0fdbc4c0606ab4d0633e9117c6b86a6bc80d4fc384830887f2e3c4ab67385b079a46cf68276ec3da5ffd2ea8d6ec0e9cfe2626654c4d672c40fef443d75c741351aec9986be25c3877df6563cab93bd21501934410f73769aceaf819b652cc6f644371bf17ed305df63166d0c98c7d4b2715309a307285d22701075f768d06ae51bc32aa88311402ffac72e3f8be184c6f7b6d786fb28ff31e0b2168c286080334062d196a6eb6005bc406665a6add05e79eb20f508830519d8562967d9b0e9be5f1a51a480d3375056f845b760afd636b58dfb8004334c1b0b3ff1cb7679814c0a1ed9da732e530b6f9794939f03a6c93567cdb1f091ca75ee0038fe4d6f8a39ed57f5bdbc494629118f8bfa35806fe3ad3ea9179fc8ba4c4719d1909bcc09d6690a11dbb3d933b9f23c920b17f27fd24d8c173a9b1eede66abf3ea408797bef8e366e437f3407c7b388c4244c76160472fbb579ff0b4f552bad04dd243676362cafd2d4a4c36e7fd371f4f308daf5d072fd75cce1b9493af48ac206123a8a7112a4155409f201ab20379f6bde2156e082d44e089a568a4b82ccd8204981d8e76fed48791adceaad7c362c9af15e17a94faaa228687ab417315050cff29415d6d281c924150c2c36b2dc5679f16df5b731ab3b85e6d8885d019f81da1d16748ec6ab8a216acd7f92f360538975bb77f0245bfb3b3454a1192da966cb1a6f7bcd66666e8a8d43b36f38e7306cd7d317f5401e9c7de569de883e29cf58696be0a1e651a827036b317d80194a5cbff25c25ab3a7f8efaf06ee6769b3ad53e597513cf01000000000000000000000000526c2f805d6fe24abe3ccc5edf5ebeaeca704a99365291da2344c2b6a851822ad0025251c005130904f6aa445e199c62dfead19e6f9e015007aefce1f5298987de60a05b2531398463b74f20e3634e333071696e0d956d8fed2a34fa3c307afe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002fb1ff8f0759e2efc838215d2c374de8f9c0e0e9f79f6ecf5875b301d6b13dfb91ad50905f0a087775b134648e6f31a7d1e5ab66cdfd5e13463f616220dd1da84b1a38be8eb0232851085d0afc9d14e3ff450eabb25db00d68d3419bc0aa872d9a06b43140230ec8cee38b46bfb46fd9a978064d659fa16a63325bc826770f32021dd77b218ddacc7638e605f504967578540077e5d787636ccbef02234958af89030fb960a769b7c60a8d81a4ff13eecf64162414e0452ada330aeda79532fc9e9e0b0518a9e0350e4bb857e5c45832f50cfc6743ae875c170f2a19340be5ddf02ded0e54794d3c6fa3f839ee7764ea2d78702e8d6ab7b519a2319e836e78e280035d0315feb0876a3fba60c468a14f0e32b66d243d4d82de2df1326eb2e06a4fdf7dea03198aa4fe8bdca48d55a0e96711d4f9f8e0a7fe8aa71b74a5c2f9cdc925fb7593022bed03652ee86852e0b121a78fd6aba7d27e33dc66b613e9ec8fdfff65bce91b02160f90b4a02b3c3ce7b88b582c8d1e1e16d91ef90f4ee9380cee4baf68a156b90314cff8d13b2f1f34df272dcca84f7890bdf389eae3b6a9a65fdbd161de06d8d722690fb5107a9e6df5940b8cfdd2fc0ff10e3e22adab3100db659bed180a029d62e8ca0cb6f2bd7b3e2d0acbfabc3ccf597a543b3259fb2c3cd7193d7112cb9367f1dc0f7280da61d3abb4f8ba18e24fee21134aca7bc1b8f4045a72b7bcfecdb6e909098baec71ffea7d2768c21bddb23013e9ea12fb1a03eb43ce77ac6a91dbd1a94a4927c90063017b81ac94fcd36426d84f1626a7f84786b20517262b1442ef9faff7321262c684245d75f4c2ff4dadbb4e20e9c87c19980ccfb29139246030629f3e7755bd7f6085a4e739b7103476897ab66992cc4a7a0af1e3a29b4146bd707b5d270495f6985b405bf619c3b3488f2fa09994bebd599212962bd290455c9a73ee3aa886c89c19c3e8b33be9d85a5df75a236cbd30de090e7d1581ff11f0a078c6bfd1a9d4b864bac5790bb25d6286fda14288de55df99dff47584181182637b5cf611b1051bbe4273710fbdb5444e49f7c245a20ceb4ace3f7d2af819f9e8a6e90efa45d641e5248a9706c5f79c68a767120f85208023acffec3295e919119cec02be76a1d4f0d667e88f643fb7ecfa85835ecfcb2e89e64d91fc4dd4c100e5245b0a763b60f665865eeecf30fe5469698239de5fcee0462821c5e95a4416dcf935e6b99811b0382876256f4c13964382bff08bb16375c5a4aad34e563b86cb3803502c17c8e77ded59dce949484c6f66fd50420b4308f1b9b5e94453db0e15c236bfd9c799052ed4bc9e96cf524863ab67af56af90959cccbb8d7c9747bac261f264288705e4ceb06be906fb7d40521774413309ea28137513b54b5cd5180c6c2a86b4b53b7132a4f4fafbca1d8b50efa5e943864eb4d7a01dfbdd70c5486ae3a111154aee753632fdd4e163453cbc67ad95a0f5a2de4546543e80ad29f24a89ecc748f0995e46234df9f7bd8a6f5d111b8c3d05591dabac77a96557de75ff90941e0586507aa6c564b3a932d068ebe046ec3116b7198a3a9f22de674d25f0b61c36130d5e64eeb8cb6c4b6337909848d49e1f9cfd11eb2b8b297b1175f7dc4ada87251e72b414d0fc4f6ebca4f2d14d9b8c8f5ba51e9112c331f87ea47f8444cecd95343ac822068e27c1482ad1ac9f80a356c661b2d5712de799d17fac1a21702df4226b905c2377efa7eed8344a4c782c81fe6c1ba548bc7dda6ba79c9f82995cc7e2588560aabe5579f4ad3c36db9f40588c36fffb9703f54143c5500f0bd0a4585101c882ad73cbf6afef186e0da3292535b98cee22a28792b19ae89916a32af21a9918de8d5bd6a3c8410e99208d4a994a5b1f0060462a1773a5be738c8a692e9d6c252e26470c3f1a66aeaacaa100b4a596874ee60e3b7a7f6c066b6ec87426c82682a05c7537fa54e140226949a1fc2192c0d94755393eb51270174fdbbff5554d95f16a65bc551c10eb44723339f7231baa1b2f5295906b45384df2a5a3fd34ef9f0e71ce7aa01405828c9a6e8546989e81cf39a0f936228c0ae9918ce56863f6c9536017036198511e01593f887b42a0804a6387858019d32b8152ceaaa1858b4b2ad26db4652bf91fd54a79769a1073ee40474e40d0a905e94e6b7996187a3516c180c3ae69a8697b2ed1ed7738858bf1e0891d4caf831b291fe9f9fd147c37336d9b430946f48515eb7cf31b6aba0fdaa1daedb97a838a0b203447772e1d787464ea80284979d70c1bb7049dfaeaefe1db133c554755e736705a7c3c2544bb1300d8fd33a9af72f30e049fa324b78e38674612b6093ab8ed8d2398ff6e2c4735cf64c2f1a6c5e9715bd59c99ff69e4a039f0aca762286835451dcfa9fbadc2a078d6a7c7d089b0c", "ac6565515365", 2, 835608112, 1537743641, "77e43fc9c392c6acaf15ce65faf71236a3fe16d994ff225f7028660f2f7ff89f"], - ["ceb51b2103c8a4a81e49d2209f6942ff20558f9bffb91b07975eb712a3119212c1589f1a7600000000096363636a52636a5363ffffffff62dc2308ca03c9c61051df2d02317294027012332fffe1ccb8a8ac4cdbb9f5e103000000026a524f67ed33b9dc953a3b28c000429d6900826586e193f1a2923ab9354cdbef536883a19aa9010000000965ac51635100526a636f68e16702416aa00100000000065100005200ac6b22820000000000000000000000", "536a53", 2, 418603871, 1537743641, "c0173a69841f1738523c5617db30b7abf0517978ac9afcb531e97310816f7971"], - ["fd7e2b0201e5a6e7bbe384b8c0c901be8c33aba1f9e161f6a1fe0081ecfa5558ae471b90960000000002ac5397fe8f3c03650db40400000000086365635100525200d381c40000000000036a6363a7daf4030000000004000000520000000002f503740300000000000000000000000027b0f8d53520c68eda44ed8be6170ddabd53b00bc93e4f35f41d51165c3050367c02f1a73f392ad5b756efcff4a8f557677e4e58f318f58ecac10b4c9fab59466d4e574f39df51ca85edc3bcf25c215607473faf8b2bb90922838daffae96b17000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007976302d6fecdc102779da6b30481a46b2171cfcb7c76e1da8d8314445c3e589fe47427ab67c17df15bf353ab6f41db3c0c3c7bf78219bc0e6f0925b07979a18145663a0f9db83c051d7cd1fc92b384d7dd8314c54a1836cf2099b344b03f0640a9c7605f75a01dffe4776eec904603590ce50b72eb181722ab652530bc351e60313a4ab81e2a0fbc415b4a1395b2172582614adcaf5ecb781b8c141fe2df09d0d030c04a69275e9d9ed9a7563203ff5185ee8f356fedf2cce610f255f06ca06ab690b03ef810c238deeda65d9fb90f389376a78c5a4ad5b98f6ab630a1e79757a030ce5bbfe82828fa48086688911dad9a70fbd6da4346d873fe7ce8f0219734801b6021c9d31f77690ee1f2a9d55e2d4e52b9c9ccd51f1a30a5fd7356a5ade30c99bf8020b5598e3283b5bf93ad75770eb6d01305dee2b67da9f2af78f83b905624d351b020fa196921b57daaa556fa53f27f36e26d0751a699d044f8d1e11c39dd2941e7c022e7c3a9792022796ac6ffc3407924207988ef126121e44c9957398a5dfea318703294de60d1f282ba7eb4e1f011cfc58ec986d9a362b75997e5c9979e1100f89b1aafe585fa0fac5b0bb0af2f176495070228cb6483f98a45de2cc356e391829b223cd45cd4006230837fa0ea7cc31be9a3e605a3fcda0fd033f5a9f7b1c1820be684225624326f67409bef6b45e4fe7396c4f2149ec21d5a882c2a318d02df7d425cd046ec6eed45264b2e5c3c7eb4d535917d2988608451279872b014195a8f78cf3a586e65833b2def74a380c9b873ae86ed92283e26c23006364edd48b0e46d27e85bf2afecf0de9ba14061a9556dddb258444d555c3fb4e282e21383944a0885b97c4d26a9ffd7612b67f0393fb7c4d90676670c632b8e673c4c800189e11cde113655d3d0927c3fe74e976e48316c7e32c63faf4ac5fa84182bd9b53a7912c3812a33b32391dd6e0e2c4a25461e9d811312c09fee58cc53e797aa9b40c1f05465f5d667db9b0ff4387ba0071e31e499e13a462a4fdb238075490359fe2d4f2bc88193381821eadf2166ca99ad2215525a84a059a00bd72a85665b7c9dbc52fbc9442484a26de23d8d99d5ba3dc4e0a8d0aaf8ecc8d314733a3c59a850c3080c5d5917f60cc5b77a26e7ac88487ce5c611cfdd467646d0f9c31229f7d985cd976c54fa8847f717966b00e867e0c18ec1aafe0dffd50c770804a19ae544638f39245b058f6f10a2d06f034c116d4fb1421a2789eb475b12ea36b6bcd1e57dbcd553137558def590a9bc28ca7d02738ca8cbc874c6a981da04e8215e16871fbdc712b6e0bc6a963762e6453ad349a1bdd18bf47e718860be70a717172dbd365adb6ea57da6b9d586372bc4ba00e6188c559588e8d22cab6957bab8c1dd1330f19b09bc9e20b8dcc2553e1c95b089e6625ee36e7f28e717ecfbbcad9b181eb4d495187c28f52958217bf594373e9067a949f9f1a02f2fb3c45843b06b100ed07d392fdca0ebe8c404687c82c7537c023c77b899a1daef377823952763900c8219666d2e1fa524460b690eff0b0db02426b03c382273cc1e9d320e8afdd326a563e5705cb2762c7cb62cf17eed63903c3801fcb455c5a867c4ac0162500c57363b4cd5908ed636b36e2741d532eb20fd4cfca4decb9f274417635c162d376d92a582851ab26b40f76043239197584dfe7498f3753569a247383a41cbbba321fe3a254bb2e8260c2d149681b22fbac0869c8008e86536b554dccdfef707eb3f1b84d95e253a5d43fa0e187534be36e2605b93691bf1547d5f551984a7506a88e66260ed60344aea77cc05eee0e00d696b18332d2d9e48085e619a025276af90d483b1f1449d48ffd5a954573a3ca54dec5a610962213606a9bf5ddddb8bb3a7342e60bf25bea1c34724f47a6d46ddfed8ab2cbb346410312a8cc61b02c67236510e10af49d6777507c939eae448209bb5f993a7aa6c35e2bf3f1edf31451984e29f8a2b59b37e275381cb1cf742a9aa0ecc15ce01089b53f4665db82c05262008d5ba404883a9de4732e4106cb84e4a00e9d202a2f09eb58e42ec1b7c610daa55fd99aa3de4f1ba7c8ac87e850c89f65dc99542a6cdaa6c81d541605a634ccb47467761edd86982167b7ceac8d13d038d4bd21edc36ca45b6a392cbaf0c13f4ef2c02bfe461f56416de1fda9893d5869e05a2f9d7777f01d1f85a969d0f4353fdb4d3029676f281c3aee09cd20bf2d4031b13d8b69dd391883215a0dbc9913371fa6430eb2fb656856a189cbe6e85900c04d4364906204000000000000000000000000b5ed1b3c9652dbf17469d7aa28ea6f89ac623d5a90d154ed755e4334321c2a5fa8cfe85e02b5b6068702da1d0b68a3b9233a8bcb41996bca40c534039c04460a1a2ec6ceb1070f6b8c872fb1628a0664c8cf0561daeb868ec138b0ec19883b6c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007d92381b791551a1e1bd4293bbb5449b390c97641a2b05255c9c6bf5a1291c357f891b33d5934bf9c8e5b0ed129972f59f28c9a1ecd2bf18320690aff327d7fe404d6c92da12653ad43c14037c85c01cfc1e13fe3e8b3ed47c26813bb3e85b5eefa1c60f444422504dd520ea3192eecd75ad942d0438e53f940137f40d03a58d03071881823ca898a8fc2d808bbbe9cf01ed79131be62e34cba3cd9731be855f8803155e1b96b061eae728555fef74a9d4c641a6b8af65fc549e1bda22f3f80085920a033f5ba3ae6395379a1eff4d7df20615361ddec050b39fa4f43104a2e4d26dc03b77c747c83736f2e9379cb2e547a41a78e3b4bbf29c8f6a24a8bfead6fc44a8020f2eabb48579547817f5306bfe3919d6d14d85ccd74eda660b8240acb902bfea0230310c88ceff5538ea405823958c01d74094165d39975f7e8d7f467ee033fd2d020772eb4fe90cef5a5a8eb5e20e2e498c53369c49e2bbee04a5bcda96cd2a13430204990a1db1320fb4407d2dee97bc5450e79f3a3b818dd89cc369735f311b9958020d497a95594b96b5aceae04cd85a8466fa773bd7d6a74938390f709f657e6d4a16fa11b401827d30600a37f4a5ef83d13b6155aede150fd6b47e0a32a8aa67ea204485d33347795726c7b75f9bf064f9c0d76624c06f6bec4553651c8c894efd179ffbab4f27c42a5165671b499ed770b8742ec694b5d295ab21e1811ab3da6e3e923be7077c16e223b5e3771dc89c0b09d1f208efc5dd8487d2e7768297b472e525d56b0e015639c948dd91d1b0da4c86b3647c00b9c2cc636a8c9b7e6caf7d7df1d8620c8f7a8a193ca110f5f1f0f4c40def7e1a8bf5adfc352cea09e06fa9ff0e2ed0161ff815891b6c97efbe1fdc1de9f934a33a5bbdc39795d7ae2ffe72e130d43d6c9838da872c0299202e99f20508e76542386d193e10068262490467bbb43916b1db82c8a5a78e0fc35529f01d1c977f30384c732196750f8a3aaa94ae8a55714e0c03ae37356fc112b0d7c61ac109257386f581042bc797dcd74802d1ddfc5d93a852954c543f9306c3f1d3d0feffde271d457c233c3ba0afea15641fc216c68303dfb27459b65118ce49c3d60296db93670af1e152a0dd30192bb201409cdf44b28a530aef3043f9ec0e43f4443a0d5dfd1625371d7d7e4e7339522607de86441d8170ad5faa744f54ef3a785c8b6109569ae185285dc67f66016e92f7065bfec695db031937c90b87ad1c3d907002df6884d4ce2b099524d67676235f8ec05efa65ad769b4c5bad7e3ef3d3f14451badb49f9b747fbd094258c4224f53f0ff5aa7b50e4823ea2b358deb98557e9f7d1cfead8446f0b179eae6f42d41250fa8bbb0e9be6d6e81a82797ddfaef8d82eb4da95a7acc530824775303498df8a6c490271222aa910066a715006de1cf2438f2d6d492d7149b49a5794888c6c8dcccae77508519b463e027e59e3f1f7b26cc1945ad5a403f00bebde4115d7ff12de7478e77035c09393a0866dea0c6dc7055e083ca4150f9156d3ff683596684d4f49acf724d0d46040196df955d4ceeb1f5ea59201c299594907defa800c7f3364af828335cc16780a3d5b8adab4ad31b86b86552fbdeda5abd3c46ccf7a8a8be2ed0a0ceadafe178d28c3bd1948f1e90bc7762b71783c8bb29ed6fd98673297d514577895e492fbd922ae3eafaaa57efe2f6d1451c3a4108a3a7a9038a096c0663ba0a2b46281b431bd73a111c6548f3bd56d30ca6a7a32093408f0a0a56d5fe280fd135ab12a6e45cb4f99073ab96f030fd7b7939ca300f25c8127c5336e25fe57be1e640a61d5d0b749cd0396b2c3bff5157e8765488fe9b7003d077ffd42faf7ec8f4ac58d44ab596e4cf60be2b1434a7b66db031e358086103ddbf105fa225fa58a310953174cd775957587fb449b239bc9e37f0738db43407b821a15d6e09aa95a5375bd8242d7cab16d5ea6782d36986437319e756ec60492e70f81ab7f9dfa08405d24da40891d8f03d9ee60462817926a4af28f8f1922d85465efdd316aef53b1a7c448680330cdcbe63f2d6449c3ae2b3900293b9c82c01aae68fd83e2d07e72d79f518a5a1b764ae9626524d2968c5374dd404d8a0fbf121dfcc0cae27ad24d0e12ae6f96a52b9c4e56dc02e5e1779c0c1d329d23d006ee325d72c80b285f71c94c8087d5fb6912287c6bed9c932e0f258d7263b369104e279ebc1f512ff154e253e4f63d800b9e8039a6ddc3b3010e4fae8863a54619a2867ae3f583c62e8877bc13c54e5b6611b10cefaef8a844cf9a2468e08f812c943e7e40b42b9ac0967c0deaea17e6045c0bf0c910883b7e160154dbdb05c74246f950266724d7848404ca1375054be158b4edcf8a72da024ad261389a72b79d86edbd339053ec1a5d69f7eec80016abd7120f", "6a00ac526353", 0, -1180892345, 0, "662084d38d18af1ef6b8b9c64f45e9e9ef3f7e64b1a8a962181b08198f326eac"], - ["030000807082c4030340b5feaaaf008c5e0a1d3c62f6afbc57412c60933abb4595d0118191316573540300000002ac513a725b5b91d942ad857ae6c7db38cbcaa0d2fbb863429bb41ed928999e8ba536fd1e62aa03000000060063636aac6a9dfdb6eae5519085d00b18f8024cac0ed4ad883d51a44ea3d09dd1e54859ef922baac10b010000000153c08244d6025a9f7a03000000000163dd38fc0300000000006fc33853e1628c9a01d53222010000000000000000000000009af32c6713961574d010416d1e96f2717d1eae9ba3473399f1c5f453ced9c70ec145ab1dc692daa3df3dae178d37a38100cd4e28be3381e4985a22d2204e60ec30aeb2babf6a032f8e29609c42dbfaa9ad4783fd42438430ba9f319a2cc0188200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ea5bbad57235f58fc7e8ab4f9edcc14476e8463dbc0b3fb9598682b3b91ec87f47d5effddf116aad04fbefb3b8a89405a0990af1f35b23b2c07eb576a15419b4fa86e1182386f0eba293608059ab1d9d6ae596fa040ec193cbd08b75caf77a1cd4c83ef75f75c621611109d70d7a4180c4a648229af556676caf9c9674696a0a032583d09ca6fb06a11311371a9e82b9401c2beab1739ceed5be48e5700c1818a4030fdbf67ca863796d69624801b5b111ea283c681a6db3af920eb5b0869c6fc6f70a05ea6fa3851a156a65ae3afafccbe3c7c7c17338185fb1b681c9b8ddc74f25ca52a9f3c786b533ca02692c316cbfccbbab7d3edd5a6b59ba4806db5296b0427703143c090676d0e47b082a05304f12042492f4a30306fa860a11da9e8935b5147003240c70210c135d9d69b280164c8397e80890b0531bb6eaeb05191228d4b14251022ed329c523b9bc3f54fabfc90b833d17aa5c6d8794cc1d1b07806bd48ae78e13020584203ae5c839f34ac4ad59919b103be4e3076e696cb940d01d40e600f6335d0314e1ae51523ea963386e6aa94081d8b6f0ef4ed8163c8b1d88d5c42849daa61804177749989acb53eeb79cefa345da6473ef95fed6519e0ab50c3514c0f1313557ee62473a482be274a8a37b76b725528b3faef656e850abbba0372cc7eb4ba3530abcb2e3dcad779890c3a6b21de3a65e6ff0abdaec2cf6720e4aa26a796fddf5a4b0c459bf137134db42153ca4f2bd4537cf4170ea582283faac16eee5e39ca8f219d47dffa6c37d2483f23876b82ade3d1df49e0259610336984e99faedf1d12a540bee0069cfc3040231da151ad144d6e7c42866ecf96d69f7dba3e0aa19f02135e531157142035e550edb49fbe5fed2a3efbc2d5eeaf86e81d5b8749cf74687707e01b095958a5497383d39d57fe4455938db1d3fd93a8d6bca8822a0fb7162a1ce9a069760e6b5738ee127da12d06bfed62ff450e43a53f96eb3164281b65d425d6a32d16e16ede66f031eabbdf0f31cfc8c2ce05604feaa04945efb32d3215288f04f2c8ad78df8fa75680e7a62cc291e0ba04199f56f25c7cd74b6fddd7e2a84be28039fb1f064d1ff2b0cdcba6fc165c19adfb4f1f51dc8a578c30d374f9fb7242dce9d30a046adac0b4cea1681b0b580da1c6062bbaf325e9ed8268120971c3f54c1bb66b4437cd5f132dbd46e0979573b3fcf8d7f6e1ef7b066d60d860fac0471a3b982fac9ddd6519c65ce66c7e8714196b5023048355a3b0c13aec28613b03ddf601bd6d8be3db2b3acff5e1f56d7f308348c4b4dfe4a0a452f75d7e93bf897c053a266ebfc68d6e95da2c34d7fff41c6053e35ae57296ab3e4cb79efa25541498d1df688036d40a3543e2a1fc15fc884f199e3dc76096a6936b7e3232a28dd3c1f164bd622a426e1c87ad92c196bbb6168fcfffa7b0ba0a14a1e8617413b13c8d8171891a1a9b4cef2e76183bc8dd451a9e83dba04f4ba02e6ae1053eeba17a80756e14c2eae5f481dc327304b45d5766bca7df00510a5b27a0a8a513aee690984776c6c3cad48b953cde021695276416154a36e9e52a528465aecbe2bbe9804664975fda2ce064cde0d148d7b54ac5d1459abd52c70a688eb63bc83ab652a192b3144db3a876b95a12d79bd408bb0c735050c558ab60d6ca7c1724fe7bc447e107d5da215158e671710efa047121633c058f295f71960e549d5c6bc1965809f9ac598682e7aa9b6a28ce65b1790b61b0f7a47b3095cfea0e451304cec5df2c7f97776457d3bf06135de27769b630a5e45943d09f3c9667ffe57609e1be223097801e0e2086760285a0366de88be828bbe472320e3960c7dda08b29881dba89f74800ecc1ee5fd1f6cd31a38889d38eee25d44770b106eff245e87e52dd22d779a3a39ff5d8b982daa7d0ff7e938a66871a543398b66cf9a02ced8c7b23dc2738af8de2c80306115078eed92a781ed325a466da1bbcf7a7dae1334318769f6a81aa54b742d982250ed8fc2a6f46718c7547b166331ab1126be1aa6de74aa697bd70a7ade459f5c8bb86c1b53e7a0f43836a081c234c172941abd614589bd734ce6ab4d42ec0f6fc45b12135fc98225f4e4c8ace1accb2b3e04708a434b15a174a0ffc658ba196e13d42479b355bbed95cd76ede45b2b2e67183453660224d4a49968678ff7fb8306d188a06200009c8e0eda1caddf2de249c8f398eb60ce3e13eede7ed8c74a754ba57a4eb4102b9d766b7f0acedd8c5cdd714559ae02843a653a9b0ab4768a5d726a2f8d380f4c5ab165231192e498b65b22b2741177c0fad196d9ee620c5db51768a42b19717d399767be0288443d6431454d55b217a690b831a58a7e1805fdbd6f5e56b6f2b4f982fffe1dd42611d09b9839316a460b328e9ad4c8be76846678b7780d", "515100", 1, 1551623671, 1537743641, "6c4e10805bfe519561f65986850af838dc57b4ef2c43c0ff773df991daa55637"], - ["d37c242a04d2cb6be0cac9764f277c9f8007e3734f12b8b2316b77618162e91ee2dc9d900b000000000765006a6a6a6565ab28e4b3dc73d249455ac1cec38f2bb697ce0da8261b0ffbf5ccc8c9443ed906cb0bd90d03000000016affffffffecad5f7f42d25e934acf146a71ca19a5aa8e52760a03504a17df308184f10dc70300000007515352acac5353ffffffffac01361f537c7550dae52ca6c074954d9fbe369fb97539f268ee5f09143ca2bd010000000900ac520065656352ac60ed84780112e1aa040000000001510000000000", "52", 2, 645074038, 0, "bbf05a993516d45eca88d3307d37f279924c1ab5936b46654825b783bc4239cb"], - ["030000807082c4030265667cf22fb68a26b079a1e943775a8c54188fb138a065f757f38207735ba52e0100000002636a9370a71eb3499dcfcc12458bee007d56ab4b7c2000198531134539d580db87e5d151807f00000000095152536551ac5263518f4e21380455d314010000000007ac635252635265002780020000000007656a006353630035ec37010000000004ac656a65d4bdeb0400000000066a53650065538923890dce48b3c2016e2d8201000000000000000000000000fc2e61b3bf5b8cdcd114b403c5c75f117844556cddf1e8580dc7329e0fcc515e9b9cb75375691078948c8093b529698f19d641580daa444f9816f088326f4d5f8517619b2c092d5631fd1d001e0a689b0329c798680cc1f34b97303eb710c48300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e06c65089b5d238d01c99e740146356a5e769bcaa78ae23e76eb2761363f3cb203e7e600c0c732641224d4a02fca09a44bf9494b3013c9c4a27c756b468a0058feb8d0285d40fb7f24981fe9f5daf3627708abfa961ac53ea5dbe71cb8c5e1e295c1f1ff199e867aed24c563f95de288f1d7ffe7335e9beeba61b5f6abd783d80201eb6d791672360b21fef41b38fa6842e6296a438c2fad4329c9a0223b21b99303124d048c2477fab30deac2aa576f14555e45c121861913d39d7378aad623a3600a075d9fd479db357c8c9605fbe687504380edc611246516e40049ab4788851a37d711107a422496d9ddba16d8e8d7e0562951d35d97aff7c085836ce378221ad3031431d346acc6d6bdc75ad1fc87858613e83c2ccde939b3e374ed73fc9265fc57030a9a7fcad86ae13421a5c640a41dfb6cf4fa02378715af4ecf52b636ccedbc7d020afd3ee214a645e0fdbbf43070bb010e39d0a590da5bc2509fa7b3d2dc6cfb76022fc683c9cadefcc26e6dbb856ab8e0ad00c5531a25a1207170cc99aed1359dd4021687c239a86b7f66e39603615aae915c2ba16c6f49c29443e0c83852015435a968614ce3759823984022542f1ec237d0be265fe26c2cc60ac4afbeec12141b3d147a59f21bd3990260c2b175ea7f2b815e35596d165efbb24f52277051584d4d726582f0b78d0d01be8ef06a9ffa0a4c6dccab8c7c46cb4036b37255166fc72d8920834eee0c0c6f77c614a173e44f1dcf991bf68ae41429fe1cc09a9670b84a980c6fd35e7b316d189eeb2a9fa98ad17fda6905105369b138352d1f9fc1528ddce9bd5d97f5660f87c4985335a81bea1e1f20e02b043b693431fbdf9d150a1b1aa14462a56ee9b8f2add637e347f4754666e919afd9cc04247ffe0073d0211bd6a9bb79bccfcc57f68875c9fccdc908cd4b32b9aad095698686f6bc0ef6beff76a00ae4b875fa4caac683b72cdab69ecc157513757c308e551851a2c6d05286d799776959c1712d8440649ece059078b3a2632455f128edea1a5b954f53ce26c5eb1073b9dec73120e8662006d70c9665b9c872248e8b768f9d0cafcfde0e358fbd8058218188fb4124ce0aa2b21b83d37b392e7cab788a91f83428f3129f619976f3b50299d80ac2e6c1c4cca52c463bde03b611f038025f47941c942b6f1c77823b84b75105a627ec7aaee0891e1192cce3c4bbd712f47917cf12f920c27cab93192de7b698648c95f3d9d3d0bc30e50a201494c555adb3ebfa41f1bee883817734b163dfefa01822f651859835dc6acfdce8c55d25ea21bf5260a2e0ffd7a19ff115e9336c06e901f944870776b131d54a079f40898c46c1a6bb48909c981c3d6091b7945222770a4647feee6c0b5d7da6bb3d0b4e2ccd9a34ec666bd2a490c1b9118618db592b5554c47e0f5635ee9aab385b29e13bd0f3b3a0840b01bef2fee2a4b70d90c310cbfb0df216ff4a8414203c686f8f94e65ef6136c37082f6e72731bdf3f6fd1b80b9b72450b94a6d28d53288b382f1caca906d0671f2f0bd0e07e20b0525e1f957917dad692e67d7c7e25c7424a6a8b0fa83f963557d8cbf64534b3ab28d35684053f6d8a01b7bab5b4b073b656dc43d266cd81f6cbfa0c61a4e380e99fb56061b08bb33f0878f90d190e126558da27b99d1f72d652d2e09e0883a2637a1e33491365e2ff39d95b8e6918083cee55827138b85c160d81aeb894d6dfe67703ff359aa6349e7bcc41188cab7376c62d13f8d0feb68205d2e946d93a51d142f495e16f6330e9d44f69480cc35215ed3babc1bccdb9bf94f0a6fb52b6be7f04035adf7f253c60f8d550a863a00c9fb42e97efddb271a568e80caf7d382495322d89d82ae5483e312b74ae0cae710abc71c5d8bc4c7a862c769bb9053f1a4a3332a70cb0181d3d4e38566f026847c5fbfe1d91b8412ff3bd36a98f7722b07243f22c1298ed437e11b7e25db671f6211959fb79dc85d6a5a90bf0ae9739650995f87e4893d94c86c9e730791fc21357a6f2ddc2abd8f4f80cc5bb01b54abe8cd94c88d3f5cb4f4b4453b5d8e27b7559db718939fdf6b9f4586000fb92cc39630b31cb50113bfb503526fc23d8842391794426a2014eecad3e16a48fd105676bb2e9aba02e916fd28937d62ea05530f0b9b96a1a1e7a864457fad5483e0e1892d1371424cf3fd351a7158b498822ff42a87a3d08f856a32296e2d9885c6cd4269f53cb44f89dea0cc08af08aaa9f19e76ccc71b9b7f9ad8aa03eea028233b691640bd62c6f91ce78607299df96793cc5f1d90d4730001cc852f0a827f158dd88463db7245ffd17c7226200b433840c9058b5c69ef3d2f4efca2e8986e72d4111ebd98feb7c4a38d2c0e6f892a3283c7ec62b1dbbb85d0b28af089321e73087b2e2b63da030c036b1f4583f190b", "5352ac005365535263", 1, -1413553797, 1537743641, "bb1eba0077164236f94b19ada6c9afed2a170f9a598f3f5d33bc04fda4741f57"], - ["8d7fe542023e886169057e1ed21a6211a4cb4d895fac3cd6c2655cf672f8e5b530889a2caf02000000035165acffffffff756741a68cc14fc937963bc01f9e7b416cd7d5a21c63f093aef8a8aca658ba390000000000ffffffff0174f94f0100000000015300000000020000000000000000a4ae720400000000366950b671785951f5192ff936b3ddb2b14a808d15381525012be4c5b2825320e854eba3dbf7559f61b8820a1464dcac97040a6193da21a4d7c840daf545f5022a34060b6428be116690c25b36cc95678f0a09b057d812cb9a68571e6d7d84fa000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009eb49c914080186930a09596764ef9aa39d900ad5fbb7a79d2102e187ca9ab871b98c7200a68baff1f06248e4a11aee9c8706837eda6b523553e11dae79284e431c87af9e7be9dcea74332362a144d56771922d999dfc0f3b5cd73a1a9cecbf18679f1e564e88305f50cbf442e0482bef6af3b7a1e01d2dbfb1ce6a3454c0955030498a86cf3f4791ab97d366b97b48e9b61682fce2ad88abf71b25efdbfbe37f2030a40581c7ac5e5fe4704b8406600db923488b85e524bd3adc96e8e0f8f99da2f0b0108e5b09f4348809f752055c9e1e019558fe15994ca5d0bc30c9a63460d7ebc1267c7f01316eb0a7cc63586833dc55d5a5dbdb7d398a968ac51ddb47b40944f02264531516977cb0a6b533daa7befb0c6b8271f2120e42040947dcd56ed864abe03159cb560420dc9106bdacb180ba21b5c2a182842efc5f5b25bbc23768b58898f030710ad176ec39fe0fe5f8de84795ec74af81c9be8c8bbf52b11b4c4e91dcfbb70205aa3043b62ae90222b9bb0cfc1c9d6b2f9c6c03d9bd19e7fbe5d7f52876dce40214bfa747419752ab5db530cfdeef4e306d65ace43d6f3df12ce53677c6df5dd5f6ebc087ed6d3360e14f9cfe58f1a661ccb95f12a6dae4b5516aa2270c0ca55a274ccdaf1fe85a28b3b69864baee266ded1f37378a519884679263b475d7583f2f235de858451f4fd9b18f3053973dddc3ab7139d307df38f9bdd68030449ec92d8cd0be38a2f978efbc1a7d041bfd580aeb05f5acb6dfac5d240d24634e06cbfb1f37fe538cdb089c9cc773985d4e2ad76cf83975ec4bbafa79f9d70f726372c2e088e448f64a96123cdf4ed372d0cb8a4a2421e5d5240780eeed927a4b122fa9a7598dfb6b3e7aa55154217bf391fc036acefd198d2e948a527ef8e327f24ff9573046c12d533bf6a3fe18aa03d156beef682e95dd0ba570416d79b8189acb39a548093fb970dbb8e763378f8716acdab1c15233028643808a91223fe240e719c9c41fa7a535dbb780c0980d42b21de4826fabcfb9bcbaa2f8fba39e9322ef7da6e3ad0179d49a21810012c5fb1c489321ddbeeeefa58749d02aa15f0d3e235ad0255ab4ced567c8defa0c069b93f0658ac6e49766541796594058fb9af43f209979f3885161b9be67e2972afc01e6d52571892fc679a254f765861aad8566d6a98c065f3fed9d0abf2ecfb3091ec220453f87f7ba6603bc6aeb71843cbfec92c09642d96d44c7790692b9dcfb572b191ba3a57b84904dcd6cb563dab6c6c8a6f39d9a61e5a81c12336de0d9926ea1c5843b15de0e56bd9999403d55855482dfa571ae81fd3508b0137e2089abf770499df829ebf6b817fe3f05569bd70313ea377395234459ce9098d00225db6c1d1d4cd735a2fbec807daeb99215a838316880af9dbc323792d938629e97398c27be48fd98eaacee0ddb6309f5070c13fc9cda031afd845ae4dec9c1030d6dbce518b42d49e8bd7bcb712d8526d71067df9a84a0400deb44ca4c98812f4573eeafaf297a124e32620ebc75a6c8b661aeb496804922efc58ec55c64874b743bfd90db0ad6e4a18e5d4472f52150020807a7ccddf08edc901d765494ef453fd9eb3506b0604144653bfa2c82760827b65106b16d36af4ead4bfc59573885de44914f40bffdda0505fe5430bc2f724c74afd05d6eb169a10adc04ac73f9baf0fafa42b09ac3b1c826e0275f09a3c5b6657c6cf065175ce22a93c7075dd303711c7c95b384524ad87cbe9a173e139e4ade5cd16457a349af0a26e9bc07c506a99bad933fa616edc01394a305e81a2339b6d47116e409500378c1913894f1ba5c16f8bbef2f166de4c58a88838e45c48d8918b3523c5f5d86b56505650abb341d824c4e43359316769699ffa333b33d51d28071da80e9938cd4326dfd0cc62725c09c871ffbf73d71870b44b4f2a40bb06d3cef7f9919cb559c2f70ab47f4052fed4ce20b1f29b48f4fb192085382094a0a704adf94d8fe6db3c1293d1412c17eb0878e22d379b31ddc51db09cbc57db971b4be74def99f2272defc8e46d838010ac511c025ad248848ac42430f5d625a1af25f48e5ac745f86e3215344b1b0484fe9960388e2116dfb64b47fee0d8c4c7b95b5b2460349ab78c2743588d9629bcd7604d49720a540df62ac9afbebea1d56b07fd4c49ffefeb388140db7f7fccfdf9e09ded6dcd4433371c62d6482837c9161a41220855432685d56d9cdbc670b8c865606c03adb889fb8acaf05744a755589388d54dc2ad15cd483afb0a5873c5780ad44ec0000000000000000c1fcd7040000000008fe8b44a8c70b9fe88252dc9a2a73d1337155a28b802c1cdb1c7ab65fed710e6a2b58b057a24c5ecde78b7f7720fc3ca8b1725ed4ab7796909c46c14cff7c93275084b371a1ae48e586bbb9610c31680742dbe518a5cd26136f1aa09be6be100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040f3162348b9bbe3d5d4e2a55a9944e96dcf4dcf69539b0005621d9558de9a61a2ac84a62abdf4600068d12f4d1d6e40ac205aa969886c4d0b74caa470efec899686e1cecfceef5da8376842cfef4fc33257f888a17794b579c147c7977203504ff0213214dd397ac9496d1f9278880d001c44cab7e384a3622ff752bad352b10216b676b6028059fe97aa6cb084265220903d45bff14619479ee3405a9a570b39031605fcdc62dd031509adf98474d8f9416b2fd52899034bf148e69a1a84a80f4e0a04e183e3a8b07dde70dcc43449120506791e5305ae2d65dbe98aa45e9140b5ecca9fd73db565ccafa27968295fe8143fdcee2001b4360cc88b0cf8817832bb55021b423e5f84563c1e521dd75f718f4235ec05651759eb96938cf8a9ad0e16c6dd0311b34f7362116a24d3719da73c07cbf75ad027e96ef1fed0288fece746a1c53e022d878d7bf69088cca2b8a8f4e36a20fe73fc91346a70a37a2bd30fe1b84f37330307185a46a8af225317a4fd93eb65a80a503121eb26b46043da15f53de8f0f7dc02190147f98b283d45ded4388eec8581188462a0f0ab3193a345e115f3c44f05c87d26d50648816408e6c9ad30c9dfe7da9b1a2803938797c173b734a250623c5158caa23f9780f0f0e48b65d9ce8d63595c66e76c5765e646d651dd73bdddf8480f811f151de47494bdc46911d05b1df0fe838174e096670049f1468481ffe0968c257add684570e859fcdda133d0cba7a13c6fc6f9bf63691e4288fb74b841f3a2ff457d82d6084b668d31f7dc6b4fcf2ad5b102df2d1127231235b4f8d2f6108e7c0e0b82e974b0da8e125e1b4ef66f1e2294741d063bf7d3ca0d1cf0aaade067532b89cf5ae1e5cc8e89efaf03785939f17197b89833463a9600f3a6e8287818fbe334668bac9c59e661f4f08972c5fba4522813bb1affe632741e1aef35ac2223ee7eadd37a0291006aafccfdb566cecf96d6f9c9f94c238fbfbc7b3288f17feb7c08059c6e2125544b74af98d1c42e292cc65ea5d48c874c902302202821da55f23b5c5bfdf3e92a8989e0e96f2a1345b67676f4c94aaf87f87ac4e2f1f4fb2d2337ad0f6068ded703e4ffc9797ba0ae5dde046fa1268bf229c76cdd8d5a832715ce802c235a77b731372717ec88906c24a2a811c8c934ccba78310a8d095c7bcf1f85bf1c66e9ea210e2b2f1684ae28fedde28afc3befafbcf16a7fe8666cb0f8d39a3ff04aa8aefe639cf3521cfcc473c0a64ce497567e26d9a38805d1d262debf322df8d961f46b352edef82a7b5bbdb5192c195d8f861e6893c44ca945de00259417f6966c71054c0f33a8acdaa9f77481f17fa004df4f4dbad289515c344bbd6e89f9993df8c7833725eea324db36cb29c27121d2ecc991ea1ff541d6ad2c42231bc43aa540f6fdb205189e583e01d231de7ab9ea346be617f888bf2835bf5dc17c7d653dd80f7ea7dab28a3bd2a384fafd9799965578aa94667ddc33e4ca2bf61db53401f633b6da00e24bc6e661c6e6f904b755b73c2c90f9145a6a6eb7efe01aad729e89d5e92bd9c4845db27c487951ac491ff56bef51dfe730fc7d05c70b310f4d9c048ba9c59c961b7e7dc07045b4cd181887f20dfa3c01aba508aaa0fb9d154b8359bcbabca3075f469788c0d598857c2a953440b6b02d89c636ccf1397c85b7cf239ffc8ee3fc2677865f31eae18897d20a3ceb9977417af192c1e2df73e37ffb66ee794ba89cb3c70ee03015d7996c55dfc3b8966d3bb8a10fc17aed499a7021801c4de835ef91a00a082c28937e39d4284025bdb3394b5c620b719d7180aa9e8a56bd8d766c01c6a5e64a444093ec0aa834c38e3f715bf5e25390fdafef410bb1bf1b65ccd5bc9e29f66a652b15c80c5b754841b9ba2c7c479aa5c31a5b053ba876ca9dc1d7cb21f3c4785381c4a1ea787702b29f7288789011abc8acdc6a27a6b8cb81be145e34596b239b9d76cda28f0db8dd6329db8122ab0a8fef4a13a54e70c7278c9f2406bf75416ae2fd488b35fc966a5545278e3e6760e13c84a7e454fb7f8d395b8c21b34b390cfd9b70d9b2c1195a0e4b759b548f1a1d53b8f933bb5c39b9ab7b22e216b48c539308ce7c6bd8bd5ba63f9daa86ca56c44a132fb64b3366083af464cef95f42948c5f7ba2b2c7229ff7b84f1a0689b7acae7bbe4e4b399f25a49b2cb5a6c23424da757ef3d43b1a56acc73621a25cacc58c15d3342148fc6e8bdcc9f0f4664b88035a7caf560b638c66e3879ea1a28b76d2b0f9eefb9ea49b218a018b8e1f5998df6afb02fee12fec249765c5e4a9a9242073bac0bfd84147dc0ae70484e36fce32c2b166bb0d95c246155aa11c4c0a90268ad6f580641b47113ffe017d22d1c5842c713c9d72712ed3bda7260cb067609ebecc134310ca7fa395b41706", "6a6365", 0, 508465285, 1537743641, "043b3e7b74cb996c0ed5786975bdb74989cb561f096d959d2d5014e70cbfde35"], - ["030000807082c403036cedad0370568c053b97bf16421253f8c57474e90ef6aeb2bb173a1f0d00557a010000000100ffffffffebed4066661219cc2593cfbd116c68fb40de7db8396ec1bd3f5d655c883cab190300000003635152ffffffff303fe1347c524df45baace880f15293e65b72150b5154bd0cd14551476f4c74b0000000008535100515100ac0089be68f503a5beca0200000000026a52288b020400000000036565005800830300000000036a6a52a57d4db500000000030000000000000000e3d8cc000000000031dc34fa71b075644d5f4dbf26816553c416873ee09e80024e825ea927800459c2f9ca24a840d5f6d1f3b9cd4fd9cabf62a42fb1eeabb280b1f0ed876030f31b1b33c2d0d9824172d77f54b04be68f4b9a9260611bc86893d026ad0f7267d91900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000562c92ed9220f38c3f68513b7ce77c4bdafb67e8af952021886b95cfc957c9b496702d93d292e0d1efcdaf7a94937d0274e7a6b045a4d87f148be574c1afdde36a81c78061cfc725f3662cdb7c355e1a60f79f5cc82379191352a103a62d4b4f06b958a77872ce00c8461e18b742df930ce47dfbc123bbeb4dad2a3f5bad4396030276dfd491a74af58526392b5a1c28c98a14069898a9e1f036b40e5c1fe8e602022eb468f1eabafec018054ca3f856d659528c79f997e8a00889d7507d9c563a890a07983c7d573d9b30ec1afe1220c2c70287593b3d549521274c48195bcf53e7d1631cc162c614ca7a66bd753f321a23099c668fd65ebcf9e7bcdd03be671296230321863c6bdba242fa71cb61fe945d6b050becdddbed4ddb0f57f353c739d9c0680311084aca092f39fd1261605cd612cf4cae82be362df9c12a6f28b2703b52c9ce020bccd634c8253476455893df25839ccd58c079d3383d3d7fb6a694c361cad3d903188d8530e0c6de1dc7d0dc7d0940363b1f52106efed3c635e343e56c694ef4b803076c04d8ab1993fbc2a73723d6325d4bdb7884907bbed777df922d97efa7dfca207003731a6710e7bcc7c1138bea1a14a804a6cd411178258653704abd4ef90823d4955ddbbe6b1498a00dac469fdad38003b5359a072ca53234111d0d3b49325e0681bf230ef0d9a1d997de632a5fc7107943ac6548fb1b513610ca06d6fb81d7625f9490ccf1db51e410c3ae8d159703f2c66f21bb3bc771aee2fc00e1cfeb10e786031be2108836fbda6872f9db97c1f9f48ee0cd89dad968fd91432b4b9b223433a6d8b3c362d26fb5a266d1a2051e3f5fee01f8642d6cbbadfb22c8747d94d8cf78a534713079427b702a9f1c68e972edf1426e47c626d76b89b80b1ba60cea50cdc8cb6ee1154b68a4950afcc0fbb450cb4889d5a76c99d4805ad98a0235a1c3392ea8bc61383dc35215cdecb2bbb48346ef01b2c63603eef1cecc464e0b6fdcc11930ad8c7d116ec0cd16f8f10ba31d01e285f771634b78c549de29166f919ccf5b01534cd6a36ad43f9c7b2e62ab60353827a905ff7445ade916025acdf0e67ebde4e91ef864bc5ed75b8dacfbb009afe65a82335a162b063766799de3ac4a3315f5913a1ce1eb6c64607aa474ce79389e422ad97b146e0f2c2a30c3db4e70e25a1a6c5fd0c5a7c3bc4898192dbefc063a0e411e4462c3b363ba0f27d55742392d4e8e40d884738ad1f232fbe1bfc23db59107dbbc991db930371702a6795fbb7f61bca888619694ef8d632e6e90e9b047ef926864293146e4e1911d5d93b758d2ba8ce327cb194911a81dde8a16dad6d02b55e9333c425e323cabaac398ad7875ad17b0ffa773c25e8ff5f3c75dab50247f24e3e94d6aad0743b4dfe02366dbe878b43bb112ed59196a2be097e53c8dc10784427eaaa9b12d86073c5471e376361c27275258dbdc838c341e5d8b7287bd60fe4f4bfbd048b143661fe7d2965f81150c0b209b5659f0bdad7a4402974c32d9b3407bb77ca6ee329d257c6c4d78714b35e2312ed535353b14c5db1450655c3af245e2d36d933a0fe02d4d76c0b142f6cc885b2a369645aeef2939028a58b896579792e4e65d81643932730b08380dca3bab2c39493e3edaa50b5d5816e07db5cf3303480a165128487647a26a86694193d951c9f3980b68730f75c4c51ec548ed6f3aa65e317ed2773a3c4ddba70093c9c4e2856d98afda898226ac26ef79d4eef2e5f8b687bb4506e7d97d5d1a3f7e1dc08c894930a2954bc9899503025466b9d694d84e9eb21de62caa36a7a4f486c3982458b82fc299a11c37bce99d4f5bb88638fa9c64e47ebc2b993cf4cccb27197fbaf3d173ab0d19029d50ee72b0c6afb4fd1e72f447d1f5e8b0ca74cb2fe4f14b1ac0f4d2d6845bc3fc79aef0501d869441310ed0957ba4c23aae0ae08f3adea73109499d57debc78f8094321e31cbc48bca3d5025e81d3b632a7b89082e73c3f76fce7e9b11944237865609e71e73389c070b6892e4fbe1efe66f59390ab7812edf90929eb375924bb00d9d5ccc380924089f8ed1d380ad4d3d0afa386d90561c67b24afebe30d2e7f201f6dd9a0b09ee3d323c4d0fbc40c06d5799f08757f312ffe382631e9140d36e47b6a83fb068df6eb34144d50be8b8b6cac608862a0dde25728ff4ac5e36b86d79407f091ca08e13ac68741ba596dbfaf515ec0f7d5a7273eb8a7a39fcb6be986bb01f8e4e2a19c4ffc1aa19bc81b10a840e86d4810b98a6bb3b7b4a5a419b59c0c550d05000000000000000000000000e2b798ed677567181d73416b1a5887281cd903fbd156ab45b419049a09b2f7b78eb4c4d2a249451e80bff8be950c5739876f1a5a5a77bbcf2a5d970cb06af07c1660a5b6f2e4783b8b196f23a937712b084837d8145d15a4a4e31f772d7ba156000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002aebfd4a865b23b4273ced2515e0ae7612d52c6d947afcbf5b8d3a2e677d88754f3f52af637176b434575478bf585de06443a8979c9f0e5ae8057d863ff6fb01183c9051006081cddff3d4dd27a34030c37c39591077c5bd5875ec2518266fa98533c7ff41e9b16993e8787e195254bf8daafffda848bb91b8eb5633c3f704f40317a2e0efaf127d6e4eafba14cb4c87ca6aeb1f9efdb66b2a2bb7bff47ee3f823021efac2a65fcd3364171df84f5bd5a941794c3b6370d8549331ec27859bcff8e60b04dca69dbb90ae428766244adb04dd0e6107815658114b9b9393ba6ea83ad0fbc24365e570dab88724d245af82ce8de746df3c729f2d18417ddb705763febe02032c1a83ed252a64058ab8825df86ec4a7db7ec9087f5457d81030e06b0f6690f8022f08a7d079ae8ef81c85dfc0e230a915f7c5eba4fd0296b91e2b9cb4264e0f600228c8db8ee5ebbd148ab5012ca7777357e07d3e1aa74bf64766c9fe33e0b130210208061479c1cfa1e9026c2ce2e3f2d0fe34a8d8f7a4adf0535b7a75ebc83bc7dc0316463d5458d0de5f5983be3fd6eeb0626c283ebde6de0d881ff533415c4d01e938e2141a914087ee1e66378ff9b562ecf7c71a644b27bac3afb74093d4b09f83c0381eb03011af6d4cacbae4d2b94bec11000329b5aec128997893bf54f72cc877ccfdb3b0d5e00038d36d0d38b6212832631215371dbac406c6bc88a81718c18e30cb8541a2fe86af005ec05b0559b6d0aab9ff242c3b3fa4e7ab5971f2ebd09a83437af4f6a020054e930be2d37dc4d1cc5404a756e950278fefab9d1bc1cc00fa4858849a446f7e79fbf18b6873a9946484b567c20c1968748c60fc62562c08721f47df8820a94275ae54e75165a86a116df647c07ca5abf5fb0d9d1e2aa3a7643dc244a6a1f71ebb406f229ba90a8514bf3e180ddaf0d3a88e4808b7e0b188523bbf0f978cf90bb3f3e4bd957bac7832e730b3aa93b4af0860efc092e6bf8a14e86989c6378041a7663fa352b93ee9c16002917c5900406022c414250d4e9a8c37fcb0d40a5d884e526c59d45d10bbd42269e7b6efe896e89cc407df3e703de9db12cc4415029fe3957561be7dac0d1416040e36c2f63d184b9896a26ac9085abd59ab148901192ef854dc527ebcea90e791890cc597974e4ed62f154659636447ef3a8908e31fbe04467ff139cd4783a5cfbf541e577de75257929f9b6ef464c0bfb596554ad99bd861d7bc69e96bfdfc69dae394b488982de69cafa2b2410a131727051d445ba78ec296058bf2e780b2093e1452ddeaeb4f90c13bb75262f61984c6c88f3c048ff0476f6513e6609cff9c4bfbd48824fc2ecb564d5f0618f5f8036d68c73de13468031b9ea2ac19ccd903279e5041299c256f095b12c15c92ea3a4c8259a3131de43c63515ffed20ed73436d2b75dc23d83c0ca842c54fd59d6c50125c4e4bd15c6605385b55cb1e53b51a32a1c7ad4b3708ef5d9634938315cd7fef8ac5c564bf05623e48c664c8e9f11cd355fbe740c35cbee933ba46467ed9942c5a0f5613419b77f804195aae7ed33e59c60bb86ebed50059b0ffaea7ef3da9d40f1414933ce7d79e5fccfbfab094c9538fd878f6a42247ec9dd30d39cafa4d10d108ff92beb8209288084e4aae21d978bad3330a0a379a14bc8d52f9c7c886b5d257b3f1ff51f8853689490948d137713c6d43f6d0185959a47a80334f9540edce0b757dd559662369306b7e07599db806866048fbe2d4c2052bd5a307755a056f7e7d8be084a9af4760d9017b5611340d318a4b17c646c1c5e209d155965a85304624f17866f671f14f023be856cd31e2ae203b362663d3a95e66cf80fdc5a290c11eb94d554017f4bd89c59c871374476941ab3f4cca5ab583a3a3a6b2a1f616f566753e88cf3eb438216639c24dcaf64c0072e0a7ee1b825aff07b768120b24babc7afc1245e0104085b6919a8a08fdf13a67b4e06d925b06a513230b9a3ae8a2f6efcd51ef7e4c486a83bab4843bf1f73b4e9da2f60b1876376ee06e340e90923a2227448d7e40db0a1760929b6d9494adb12ec074ca49f283aa48828925421a014cfa553a7a6859e58367ca633883ef8bc3f48257a1ca1e62298f8a9c83cd6abe208178862f0c2246758ed268f7bcab6600f53eb97299d7cfaa71a2fd37cc2564d0a649bff44bfbe94904d43b9c8ba279dc015e47f6e9e6a241126ac84684040b3e6aa64cd67b23323a6526c4638c19b7677db33b6c56cbcaf85cf54dc8f615d8ee14b31e4adffc112620000000000000000df45d10500000000c522f2a553171a6a64e1af850067b5c845261ccdf690ff01bc01f8cf5a2c849a6bd7397d6116fa6f67239315df48ac49aab772860e33336c4bba00c12b83c05bb8921ccdad1d1bf73acf173b715f30000811cfd9a76a42488041c8ebd8662fd100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cdefcc15913920f208a2e7540a33ade79da2cc5af4ae3a1cb2cb59ab8905cf2dafa8b7831ceb24189eaa95590c9f52dd340037e5edbc62ec248c1bf5d35127d73391405cad1917dcd57c3eac5b69fdb67ffc408f702cc1047d889cd62efaa577904f7ed6ea1fa3058088c139562fd0d4535d041bbdfda55a787df56bafd904ce03095b8b2a11f758bbb0c7252870d5020ffcaa0e2a98dd57b99609ad1f24c90acf0322f72d3c3489bbb18de8f30a4e204d7434ec1ad4d761bba440a6ae9eb0468e0f0a0171493e3e8bdda3144a95b4589def1af76d0aedb8a00205f45dc795c63e974ff7a686b0b86604c7a3404f46f76889931517c9e2ad356717e5f4f320b096a24f03145b25750562c955fa1036037d03a8cafb06e05025556fe329bba267343edfb703108e613abc7e4a5dccf8f91a9a076681044e2bb69ba2342dda6c88ab166d1463030c85cd6888416c48fa526521c750c57e70012abab78e978b1646d8984a7568cc03160c588f4c9814ae000e7790a6715ef85b857efd5fbefbb93bcae8f5cd7afa7a0201563540c3da12212533d3c7ce4d276415c6b433dca12bc0ea221eda78479dd2bb659556c5db4ac02afe75900bbe52485d6c46c5e5e813cc92e4cf9b7378f322f4c42ee10277b452db10dcd75b59f9ee8df3a6a6665155436bb1853ad5ba442e467099cd7b463e082440340778ec00a329debc352058d9778a0e0de3691d231beb63793f6fd51fdc24f7e696f5ca3cc9a853e53c8042eef1b7c5474ab74ea3b98c0344597f2a4fae9e6761dbee5e4d80be8e940cff5174547b2c5a87ea85df432fbc25c5449041e4ac74aae7c345e26b706a6b680a0c917ee44107b0552a2743781062545ee5d8ba46b21ae1e249737393732b5e6fbedef034e33702c217e83e91a15313f4f82ffd7aae8ad27680d6e65cead3c65cfc269892d106977b8ad6f154fbe9267b963ebf7a6f6b73aece0703a2c7b1b90d2776b88bf330ad826b75413756ebf1050d97cf67cae1eef1d1c6988e74415343fb4d5dda7b0cd7d1db33fd78dd7be292c342673160fa9d04575c109a142625b38f1afcd3995f71867b3591244b72865aed00ccfccdfc805b587ce34332595b81ba6db8b028540b0eaf38cf68c09094fb9779dd008d329e0a92ebdd5efe1ef797b476774ba9b3788a4fed52c8af976737ea734526e6ef0b8d3add15f60f697647098a191350bf22aada36f178683d9e9920c3dd3e83f3e00f6ee2355a62c03ffe6b92145c5c98d59e0ce9bf81509f867a7875fe9daafa75ac9a02d7482035db72fe6e1cfb56dfef6cb25e46b8b20020e3c2ebeb48e520a9bf9ca8c6f0698255ce2724d8015c3fe53fa52dc42f8d41ab04486f865bd29011f5df5aa044ccfd6c7c90bf5e8e1a182ef49555d14f7622d78b60e7c62842cd835896a1d7c5e0547249ba2cda9d860280c12460d6073d93901b076696083b45fbb6fafafadf26c853ce0c9f06496ea47644bba8fd7b75f9c2e6dd831bab47df28e2e85c4efe3dde972b324eea279b2938fa2dad7d3976e49db679e9f36258c070a50e41eb721e50bdee6188c20b4cc1b32fa22af5d0aa590d989d6ba0709108ca4a661abda2ed9c4165eda3c7dd29ddefdc2c3cd2c317b519f029e7f47cf2ace5d7015fc5d45c988b2891845eca082225ffa072b7b27a2ea197d7d8af88c9aefd797e56c2459fca459f464486ff36d45b540f9adde87a3e203328ba6161eb9d37fd4dda3fa56fb6ce47acb45577dab5fb92901de5650472b7713253b0b07529fe8835005cd18777a8132ef643acbb9c6e28531853653b8fc9d589d2e244e23091f966b1ec181e7f42c546821b355b4a48b83598ca993eacddf354d74e0028afd55b81a2c42670e9160469af005e2beeddb1191ccb5851af95b89b944666a4d2115b5a78020698f41f33f95804da4b40f9c891df69049a0a43896f278075b022c5944828829f3cbeb39eea4dc64507c9467be348184320d62a5a443bdf844e5d5f035ae31c0b7fb912ca4185b2a45b4ae5d4837669ab541ffca7e043dc3a705bd29453504e9c457067cbfc8a86633b403403e9db240149ea6022ad624d72ee207517ba7c4b59133a785559db6502b8f48cc9638ea3160240586581586e82ab2e8fa8d6f69dae5f691381f842b61fb2b06ebc51dea365d3dbd83efb20745f63c4d7b4ea82ad5079205d9ae1f03ac91cb6be22c45cc4d19313967b154d8d6c84d3ea4c36b522f0ebd40e3f2fdf572e218706d7d31fc8f734eee3981106728d26426278257f2c443817eae4de2c7a5e29cd7d35e73c541212ec55e7148f7231be8a80d5ee7667189c20c6c759467c839ce3d68b83b9e9f4aa459d5f3fd71bf818d58e694762d5956fac3fafe766f6365a45f5733fa0f21aac0dc68fbe93131a3f887a5bb23a236b02", "530053", 1, -1640362803, 1537743641, "e783c18a652fc23485a3f9f86381ba63fd245450e84275541e349141977e848a"], - ["4548a81f02003b3d90bd5b896871ae500bf6d021b89bde6e244fbf622f1d820e33d6e5f7200300000008acac655365acac6affffffff06ee463ad5626783497f0772dc4e8c882e449901aaf71bbb5369312c1deda570000000000465656aacffffffff028ddd470000000000015118b6eb0500000000070051516a656551ff31d29c00", "53520000656365", 0, -2134783281, 0, "b2724cc1d8c96a7afff15cb95fdddae9bc819049e59a2fa84a5c321f3f4b2265"], - ["f07a302d0198b99d80920053cfac597be621a18273c9fec998abacb8cb493bd7e94661f9b7010000000865656a51ac5163acffffffff038278ec02000000000079e7530500000000035151511605ec010000000004520065520000000000", "ac6a525365", 0, -376100747, 1537743641, "6018a2b91294dbd18350cf9fc47634a2b596d4f40baaea8de9b9bb9dca4c9fd9"], - ["030000807082c40302e472b9f27ac0d55c129862ca471e238e0638e6f4e4918374419bb1aafd7a44b801000000065363515365000049901a8007d5cd63ee3c3a1aa5255351fc7dba4e55d9ed94326640ee22c2ca352adbb201000000096552ac6aac53635151b3ee9ef60279589801000000000951516a65ac52006a63abb61b040000000000000000000000000000", "006352516353ac5152", 1, -1569707576, 1537743641, "b3e883d238d948309dd0ac6bcec4615b815080b0d31b4c047333660311385dab"], - ["8ff5244f02a23441c464b4a871ef6ac081359f8bea6c586cbf9c96930ea0b567622a28695901000000056aac6a5165ffffffff47bf02251cbbe105993bdfca747f536ca183e33f8d2cfba321d195e25030730e00000000055153636500b3c8da850157cc9303000000000465636552baca507e00", "ac", 0, -1073574162, 1537743641, "726b251b5d4f426accab96fc8dff72ac1efdc64a6493cdcb3045dd49c3489a18"], - ["030000807082c40301ecf74b4cfb12a7793ad92f65bba9529684d4567b203f9d324bdc84678874feed0100000002525148a7d7a101ca6ac200000000000163277510030000000000", "6a656351", 0, -163837513, 1537743641, "b4d5fe8bb29a2ac5535df50bea0ecc730a0f5685807a91d9df035fdb017db7e4"], - ["030000807082c403031eb20b6ff1f7d25bef3d2c9f9313544094a01c3af8d116099d075d77732806c101000000075100ac006a51acffffffffadf0160dfbca7fd4c1d8ff934cd0848d3ff3c8b36a3642d08ab87333ac469eac0000000006536365515300e78284f6f7d55548f85cf3ee0186b61d7d887e99c59ebd56bc9afe0e0f215789dbe79f680100000000ffffffff04626ee00400000000056a5153656582fd5e050000000006656551536363934fbb0100000000036a650073ea57000000000009636365515352515151000000000000000000", "5165ac535163ac", 2, 1694039558, 1537743641, "bbce0043255e3425ff20ca9705823d64854a264cef468025143b63e5d8cd1507"], - ["030000807082c403049865c45b8c53b94f6487ab79bb3804ee85cf55045eaf76c720babaafc4f0e58700000000025152ffffffffc64c0b786eddf5abb61a4e2386eaa40c5ec162a128c653c99064e8f36c696d040300000006ac5153636552ffffffffdfb8aa980b9eb3ea62538457b74253f2817765f5cb168927fbca1a13c3c3582c0300000000a423715d016fb5b5d4d5bdd678dbe4453946560503ee8715dcc7dd9c66af47a8dfa9fa5b03000000046a525363ffffffff020c9f7e02000000000652656a6a6a6398007b0300000000076363ac006a63000000000000000000030000000000000000d17c020500000000847ca5bbe6e0f4affd3033b708033f960fe9817cd6533bf9cbd46e62eba158b6b7bde8b9de763953c5bc82242d9d3da9a2ddd1f59dd9658d2c78654a0c36a2201df706f2e2f0a56f0b5763d41b8f9e602be89ad507dfbe7354f072d4fc093723000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af1efd5c2a0926e6e94c958751385543477401fcb5a8f1641a2d0eaab2bdf5b9a319fc389723e749aa7febe71070a3bfeb815ca658a71e089d632e976e167cae414e297f4b9b5cc44a3e88c75ee06c84983776dda95994967567a8cf2552a9e7c80d7d2e396d26bbc18c12e2a3041046e712421454a703cb6f71be66598f6850208a59eb44638687bd797c56f852f91a5c5a8b90cfbd32bc63e43bf465013629d0202d6c9c5013ea55f8e650417d9322f10da55a12a4833d81b80849e22a713bb8d0a05d1caf828bd327ff721748f9c8844a005517fb1b896c79cb55fbb4cfe7ac119097d53cc9475b8cb2e45ced99d641afe7cfdd7edbfaf449ba375e2bd21becd4f031b782499e769b6c89ce63069647e845de17557fd68e205021fed106284efd49c0316e20e9efa06142c4e31561fa4fa36d68606a82a5d370de32bcd4dad790caab6031d11a38406229319d1dded4f9ac15a7ef32c43f23f08c14aba2357f474f15653031e8c2dcdccde5546ab697aa67981082cd2f106f22e9727bbeb54cdccfe5e050f03140e3e094198aab24e9624a1e442420712d91739548042991f5fde048c25c1ad9e9597363f910e76333c045355c7092fd28ed0d3890ae5994fe996ef975718731d1fef37ce4e3eef9dc32ee6203cb3eb562cf55eac031a03bc573e00a00eca2f953afa16d202c6ff1af5b513f74a58d710eda698ae98005348e2fa4085372733213e987b7c22d1184ef7f0b804c428439b8c2bb9ef451e5fe174664676c7086a7a039972eca29718ff592eb158f0b070c815c71ad174704b36cb85aeed010d9d490ec0e7747a3a18a7959333c2cadefde071c5b5843e93035666d97a0f77515a0c03fc4456a9abf1ef1fc18c0e20e7a92a943b2a4596c916830d381897789ae6c131ffa3d8566836de39fdec99644945c07c1f05fdf2a1ba014c34861d7288bcf8e7f55a385db0ed11d0ee3886702d70ad47669b8104967b0a95a20508b2e315f2e2eb64ec3ca43daee0ccc91312afd3bbb55b562a3a28e08a1f1c23f97f165d5bf0113bf87db694d439ab75bf076b07bb8967017fca1d0537cf48fe6c63e3060f427602409cf4d40b1d534585647650d39ad5cdb2b7e280521ac8e5d9349c514084f1316e59495c24f21e04cee193a230b3fd8ea3e02b6941cafcd1ee79e562c4a1c35af97f0d8050d232f17dec49886901b3ff2dcbf217e3f347acbc5d6554caa5f4d1bb30bbd248ea3faccb1bb150cbdd2a67b9368803f103cc23e3e563ee5692b5ea5ad5b797b06c38dd72818d69b7a546b56c452426acdcfa799f5cd90d0bb9c224bb8c27ae32fe362fc16ee441c5ed4c6beb81fddc671cfde0fc2aef16d2a38725e5b5b042e23febb254300aa28723640bb5f81d18c44aec6388b0b30ea9cfdc0fd537a6017aed5b12d0a189e5752d4ac0e79f679ff5475100ef7611dba6aa43781654c2fc591f9501cbc1e56e7a77f034b6d1e89ecf9eaa1d775309bbbf740325f6d23cbd5ec2a015483f06e7d39a2dd41276b9c4f33556208167a965417edc3d44ac452b6d6f6d47ce178c1a49aa3b810a6a36894ae13373f0ad6f50e3ed3963ceb1ee5e14e27195c5c7d0546f3b3f9dff46c9f18dfb98861ec433996ea995eb165408fc197214bd876a9b7bbc057f41560e7fe66aaa1da8506690a554371dbd09e5d7c3e960c5475c0a5e812dc91f28008b5d0b0319b03617cb3fab61487a60e46cf68d4032971885c8cfa6589d3572202f5ec5d0bf6f0806b4244f7a8049d23fc58788af0cdb9ead4c6b4e14200222f07e9e75846edb882c23e2aa84e2035cc52f116195e515b221824c660e1d015433c30fc183679b47f78f3dd9eaa011f8a596eb05dc2f640a8ac5ab532b5d758c82b121ed930bf4d7e673582f5eeaef778420b1d875d24393437f74c010d2af1becc31b1bddd7fbfca2c516517d6a3dfbef4be72b810ad09d5aca314a572bbb8a2c474fcac211ce363c3e0800e2949368b5c3984afb4804e4fde20fcc5c3aa0f51f6939c4febb8877d65c28130cd05cc6f5089a3d95c140cbf6b486a03fb913aa061e98d2aee4104ffd6c69b9d527c3cfa3d04baeff54767b39b1db61aabb224fd4bcb35097b28126c736e934d280a61cb675d9c74a45cb91c2cbf04a971d8b8702d61e901b715377e981cc5d59b71ed87b501ef9941fec7bde0226fe5d150bc74a6ba6968e588bb1e8b4349f3d3a532292558a0a0287de80db788941ac87e03fc999c9ef23687fafc3174023c85c345c885bef7b139cb492bbaedb1cea08787bd9040000000000000000000000003fd90ac30e6dcdc939a34636f08fef0c291cf646f52f13947355dda3a1adf3349db3ce0131d0cfdda4246e324881e71c4f38f27409619c6499eb159706e7172daac56d71206fe5780a2af0bd24bee3d2a4365acd4a22b9a51a7f97ded7d6ef9a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000089c626d317568ce598343de3557cac077ee8de8f29cddf5a0c79ca16d87fb78d5f0b84f5a0a17329fd06b3a0361e4c745181eefb8a51d8be9b707ca4970952a3593499a95d2d884dbb5e88d79f97928c8c474ab1cc16f336e70c4c42fc654d9c56e529deca9a207265b45a8d2bc379c864783195f4aaf20db4eecfa2e9d475a503256ae1051bc48b0552811da39af4f2822a78e998fb108c79bbe9d2582b7b66a70206e60bbe6c3d8c515b8d7350c84f10d15ef422d72828e264029dd1c7751a8bc30a0007bf02c1e0ec2e2c97ed40271a4ccd500c66fccb61909033dd4dbf5ae1db658b991aff288f82b4f46aae19697002087bf46e274a64ea4a3bcde8b9a8ed7657031903706466d7424ca9ccbe37f6229fe3c249b86dda77a16f652ac16750c37b780213e6ba456b12591e3f0f3e852ee46d2f0b7ace9b9faa815bf64e42fd831415e50323b3362ea5151b56444174d0c2115795289261c80c2faf180794755838e18ba402143418b16ec5c1d7627ef2099f2fb77ba23afda016a0f0c0a6546e17331ffeb0031d846d200145fce92eceb3a8fe8629b8788e3dd1a7d4e2e356bf876c8fa2c493efcdf7528f1d7cbcb4cdb632c2c4b5b715b0d6f9fd71feeffe836544f662a7c34b27a9f54328d5e96be7c2e2dc360ab1c098a58b4db7311a1adebc94afa9eab700a7129f101107fcd50b0941b8565e6aae0aaf8e39b6e4815b5b5e6b9e7e00beed1276db97c223b92568b4b94646aba7532aff457240cf1679ed3ebb308c7bca6f594b07e8091634ad969ff2c5fc63ec9f0f8d40f6b1103c1d7444e859dcc266f4081b35cb8bbf359038005b16ca969e07c681f7de7869f5a3950dcb2e56a46c931f278ac8c89e3a71136c63eda10e9257af5eee85a4cc4e4ae0fda9ecc13660dadff3b07dd8f59b25de1dd4ec5a79b160a21b62a4b64e3ad1487a63e849d30d88ec3802628fde99a3ea5560852157e31aa8810769e7d2857fcf3a2624f5c4c298c961dc6715b9f349a65a7ef56435a76202112cf8224f8c52c688b556a656029c6cf12485a942405250d3739d808bb9f0b4ab77599b36c192e26240c185e4e958e49f09d30aedea5412d820ed0099f946d148bc7ecdcac830e562455c1c3efb13f1257aacadb8fd52116450406b6cc950e652c0b9cf9be5270d3653ee6e888035b91b0dd2f135c5e759563f54ff3834936e4b1799f5dee6e7db75a8e129ed9dbde05e3d4777a89e9340eb3828a63d4025aeb4c8cda5ec12d66eddce3f38743d3c207b8180e0f2672f9b07fe1b072c8763ef792ed5492645b52628bed9920e4271fd15f8b96948e30d3240fbc31b41f08713ea3d2165c24c9195ed967977ff9754c3784f2f3b9d0d94606acf51269e3df00447da0cb4022703ec0a117fecf69d611f251793735f5a9d66d43c544762473db868f9ea7623c3150a29cb83a03aabbc17fba1a7b13f395c977545115398411eab875aa43c764d6336c8a93481eb099c542fab2afa47dea42d020b074ade2e3edc0224a3fd14b4f38da31525560481b29de8eb7bdf98f0ac5d0af1242299557f6ecd38f0b9d2e46ece19f33fb00af0015bac5a7fe8b3d48c0d419eddd81ee53f90b0a7669f66b3978c4b0985287d5ad80e13374c8b08b92fad3eaeb9a0660ca5c7d88f568cd2b43d96c99584eed09afcb6c3b7be644397feff2c5c2723747bd2b0cd1ca44c16fa9d71563de96798e20e062c84118b5ff103963d7aa79697a040acf12be3d85f7b3343efcde13eb73354863db0d66d8818832d5ca2319cc669756c19d7a9716dda16274f9169f13104257ff19bdb306e3b1893592adc96f111f21f6a695a462fd0d4b493672d7914eb966b2a5389cfa58cca6a740175750d07d73e378ece2cff9670bb51cdb903bc7c59a0a2d25840c06630a2f4aa4a2d3660e8c221eb7cc599d6b9f27af9ae3ffc7b5e79b9e127582e03615c7eddff87bc81142f2aa9da3b88afcff943081792fdd10ec78eb18f72076883169b91a5393446fa221a0f8a9223c133485c48abe57c2afe64b18312287f49f932062d449796760800e5001ef58fb7e3ae3414834c8cab71cc3070f0ac844ab27baaf794b0713857650c062384a9804c32f37b0c8daa2d493e231f3589b9fbe75923edccccfe7895f9ea2772ec70398d75804b25461c530a920ad81cc7bb34918fecd3709f820396c939b271fa083f97ce20b62e3726fe72bbcfba26d63978a8edd1e8efe02a67058a09e036254aa0d1af125343cc2f36f98aba4b4a4c628762454b293583726b25000000000000000000be3d1d0500000000d9cfc2d44a03be733923f2caf6af64e70a74987194af462a17bc1ad22e6af58011b51d41e21d3c84d15f8bd4b2682e5af89a3e23359f378c4450c99a2acbcb0f2e015cb182b6b581a64e7b0ef88847d9e555078ad3072406a77f4b99d4930c8600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2a102bf0afdc010a180c7889ec6ef303c7ab4de186e112490888484dc7e2f222c6f9d880e40c9b8124f0757bee60f571faec908c467b306a7cd4f56e78dde94c2d1f91966dcf53385939c1fff0b298a3f8b41a787b8ce85ec2c9ca1caedb57ab58c87538eabef3eaf3d305aaea6bf189ce876fc7abacf46494d7e24518738f022d403785e4e7eda67816e999fd3bb927905e711ddac5391ea790db6b72bdbc77020148cf8a319050f644c44ecc03a6e0b1a166e1a38c3412f1bba44929100b3e000b0903764df8a0db2311c2c9f25441728d3f6383bf46dd4c23ba78cd7f9d393d2c56cf2428c6cbbbc68f707d13dfbcc026427613978d66e93c69894673f5a399e50308a273adfb98540ef2ae6d31e1bda9912703346e7359b4c2b468b5c34e5629f702300787798d6b4089a61459188b2298106c0ec85518a5552fd34c8961ec279134021f1d05098ccbf5722bebb1bdb6457fb4d65e83efda09c87560f292809fd30ed403132dfbf01097d32aa6e8f577c09ac1c87bdd7cd8301072532d21502021f60ff1020934254c1becebc5a033d7844f597f4f394f42a9a909f0b78880d381f2d7758b94a5d6b144ec514791d0ab9ee56dc84c63ea09273524e9f9323385f35f4a4dddd8f2391200ea94a4c2acffc6795d7b51431f288724dd818707f2cc0faf47665d9c68110e9edb52ac4f9a50f4a20c71f1c9bbd5f3f434df0c1dbc3316c99501de418a9ea9e01bd5c1861e3f88ecb082e55f1e8ce5806dcda74a79c9ac20df1f02516a202168aca1d1ed45a93b762e3d406d25f7ea942a821b218f1d0186ff5d6b8d48600c67f52c4b259fc563d52e6181fa6efd54171241a9fa4e72df6a3695d0b84dc81f0814d0eef4ed2b88d3753691b35bbfcf258faec4117eb41ebd4dfa91329b0331f5b78e3eccc9f2010c8a63a62e1589af03872659c1810a30765f2683745cf4fcff1174d8ef46b70b8e0407d9b4a87890d5a1871b02f01b8cf88e3715b731edba3f03b64fc8736f6b99497bbce921fe32fc90885678e2d6bd2005f6796d5c90ca17e0069d3326233289de60877d74c69bee1a5f19999cf826e71c78e9942ba912f9b3e577a58f111c66fca3b47b93f864a1fc796c9f701d7b9c50e36db56486c2ab8845938302e95ed5b56acae2d1436d1e9549850c2895782327345e6c07b0ae823e06768dc9d968f8483e06706b0b2fdeda5321104c5df93490460062433c37c07640f2f8ebe6f3b12862057ea4c3e1e995f6788dc60d1e50ad0c60fb9fb636ac225859d8f73198c716758af74dc3d8225b53fd4006c69b7dc1e935c4c743ada51b2c5ba40b7ab594d3e9d55183f4a6419fad0c5d94a8b984459250a04e09f86c6c2e015eb43b9c9219db9a8d0dfd6d3ab88853cd5a52ac826f0e882006cae7c40fd4858fb83f55e73a88e2448af7c0e72a88f4179de2309fb0ea631666cb2231a8b4d647add4ffda8ded705cd2b42ffb5aad3b453b6d77ccbe2965cda84039b79d7d0a3c85213b0d06872439bac2a526721a4cbf752a003838cd329f811f2634efc33baf1aac768d9fcbde65fd1a2eacf787c2751f48d42d2283931f5d7fa12eca10bd2bedc9f761c754ff7948f08691fd3938c6fe8274ebcbac41b77bd05791a124c5189e913e5c8f6e748dadb41e0661a3c0388b85efabdaa257ba0a47bf32834ef6b1ac7dccd387886abb04849c680288b9f74ebf3b8d76000e361a21a7e32669096c535fc60e0d43a298da8163f35a7613a6860d788d499786e9472a81e4c7af1dbaf85350c85da7c69b5717846775050e84099749899beb54c163e97ab440386583821114d47441158ef9397c3ba38be9c7989e95d7ed18137bfe675f2f441035e219087f7b3deb33d92af4caf42062cf79acd48b1c89934c181f47208979d5d0948ac87cad7c3df6f4b8444e66cbfae5720509f6ad056f5a1abfe13599e4e8b62811a788bbaa3f39c273fa8553b9193c1d3b1626ccef5065f21b549e31225e2ad4b0b5a82a169f6054cab2b1c79421b5dcca119d872f97e4675087fb6d9aab08440a95a60a5f3336c20c0ac14df3a7de5c9ceb8777cb2179f12971c68bce042239dc6aa3b51d70ccf4eff7b4f7438419704fddb013c0bc9fda9323827f025375debe32c062cd93c2fed31da0f321fe6971853ee314a0a0e6b0a84dfc7469e1ba7d8dc598cebcdfeb767af563222381e94b6690646d856e3fa8591395b16d72976224b932639678bef64fa6781f132b7adca1f851f9e302d2a2409e780ef8700b1476e59845a1ba3692ebbd1c1d8b480485c89a6eb0fa964c344c24204a22bba985823745819e353c5b9de8d16f519fba12ff2dae296d2e8f675df4981b5bcdfa95d9ab319e706d82ab347fd8045be8631304eaec59ed835de4568ad98451810629020264d5ba5b51c105", "63635152", 2, 1679280457, 0, "f2fc1348e3a61860727e596a2cbad63c7ee292ee872d61478f4dda51bc5dee62"], - ["b6e44b4304bd50513fbf7399f2652f2517df477ba48775e9ba313eaead6fa85622d746f271020000000900006a516565000063ffffffff2a953167101f32ba8f69b71912fd960aacff80875350b780c5ce96d0ff5efb0a0000000005510063516affffffffd89e818a3eee72e62f5f840562a563b5924a0a9762bbbd1bd75441328fa272af000000000072021036e0b47cb167a75130ef6a5a8060a50325cfe91b2c64a7cffc09bfde8f0b5489ed00000000016a9863f4490386a20700000000000252ac88f1b0050000000006acac52516a52e5841f00000000000652535300535233b1aa43020000000000000000f22feb040000000021b2601f7a9b37a011b03b5f515ff8643a0055549919e4f7f53b2b8349bfcc478ce8e6d91fc16413458618fe34ee6987b6f5e2c542a9cc9e6d8c4982721c7d38af47ee256fc246ed12f14fdf195363c56731363436f6640dd38e6724560282c400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d11ed4f7e2e53a7a617437fb0bf6cd5097b0dfc4ef30db07f5381d5d166399c33b73c5b6a8a6d288b98d5f0e2ff7bc766971d38439604d42e08f6f9fafa4dc313ab62bdb0335672450af797607e01e80345f2e803a54ffa2979f5b576c8d20af91d7a52b36d3b3aa8f386e0f8ce3bb9dfdfd167096484d43f27380f2f8dbfb3e0224b6d1af804d94f5b516c24b0b4d0bbb922e7b044ac2307d96a85c6368068758021dc04affe882164b1b80501597e63475fe700c7546088448219d89375e32bb1e0a07284badb3e9c1a01fcb001372b45d698378cc2cb4803b3b047488083a9362d55d9279776e971d83727a387c8d4f659ca3a752f9bf87cb04588fe9e1ed9ec6ff020e3e08080c6cd184d8cea0c5b52630ee918c586cee7289670aa545a1191d6f4a0328facc3b00a26043caee5b99e0bd3e53de73dea45e31ffa96a133daeed61561b021ef414132a21b446843d4a80c819e568015a05aec273fcaa7253462b80c3d9ea031b55344c6b3070a1f9b540e0dfeb76f2e776e5be0ca44b599726d278e3d81d2402219bad0ac6383cfcaccaaad88a5dad5e0e775cea44448aadb246e53fb61de91ec3ac4defac03b1125f3e0d5ccb454a61b850ff82cc56cbb5d2a59d2d5641ae3162b189047e10b0b9b36be54d87d0b8329621e7df3dc0ed6b92d755db0a1e3bb2f782ef2b0d5ffc1369b8be81de228db481dfa2a5bd81eb1d8bc222e6f17224e19dbda337f246ed13063cd2f65ab872d9cbda17bea66b69c8715722bb9071bcd17c9fdc1ea250d7fa891520138fd9f90e5f683f7a33beb7a13d17961e20eb7ba4fa155c72849130140c97da07c6dff706290c439827e5c0474c5db1e7ad392b4f0ca41d021580f484109e43079b4bb9f4950920e0cb9321273b9b1b5d01d83cdf3c2ebfb0e58a05175658ef82634baaa9a4ccbdc693990edb2e48d057dfbd4f47539cfcfd2755fab9d707b3d0e2b345e473c8c956cdbbefcdf7ccf862a4fffb7629aa900878fe4d44d986d3c66c95294f5a50b7fb95c4b3d0155e692d6e8ae2ecfc89632f169389e6a896e795145b56127b96b85e5da33731c7af089f09e2e4c73e55d1752b4f0fcd78878207e3c003fc09aecf3fcba6cf75c45564791cf246581bc77532d2cf3e6f7d06a70b4732aa4b735e4a2685f97fb031b01cbb35aafe8fb62b5592d2f1c7f521f25e31387ca8bb97bc7e2e9efc31dc31223dee2b02b9dc189cb83c253d2a24c28d76b426bd25de877a2465428b396734bbe0422357611fd04613a8c7f8796dc4f5a1a871d7b459feebf14db5ac33ec799993273126dbfb1304bd94f56e1914a31b9fce456340c9364ba0ddc6ff5c9662381c97810bd42ed8f5938e8426b162f5ea6c379873fabd50f2a073e7480711559992db510b9171f089f9062ea797e24941271752f0fdd79a4c85beeed0f76c4403d23e7bc70e9ae2658c744c2d0afee2fa44a78c6d1d3656866b2ecb3869418edef9f427a639869530a0b60661e3bfee270da394419d5648ef47fec4354f216a50c2686653793b523b698399a5d9ada9d8cf23ba3015a8b9fefcf7161856da74f0d51763dfdd1910762e9aa279baa06486d48d4d4444e63b2bfc65c368d0c8d47c4901f48e3d7bcea3a07a772322c58c1811796be0fc4745fcc5c695e7a3e4799a2e334d1ad8b720bf7312a155bdd66f6a81efa5cd41f1bcfc5e29d8c8e6655f8ee794719c20b7f059b703639b7c378d469896ed5cfacd3d8ca464bbe73e367761c5399814dde0f3d589554e00af85ae9fecea43b315285ddca11fb775c394a6672c3e58d6a6963db185385284d227993f16dd9d7392669cd86e6c2687aaae56d593d252c654f942f0d0db04ce5347f79510fcd1c053bdf5022f69b9fb08be42e39a60dd34f535b41abed443468d3a4802c8e9b1afa828382a404411ffec025806b928928aa786057b71bdf1d6140a9e594a16757c805db2121205779453fe541db9e8156970ec08af9214eea01fde166fa132e93d5c5641d4b610c0c662c97cf7dc1694e49e045f10ed6569e85c878eeeac0ee821868bc5dd501bf12f07df9ea628c224f766a9256c3553d3d97a867e25c011addab771269eef76e04c11e7d8a1cd084f211c23438f182a55b8d32379d7e2ab4c3bceb240b0896b093e5e26a239470029b3ca6d9f741bc8d4da5bd25cff0ce6d5b2dc7a4d2c5a52561e8d45f26c356ea5de0016527cb55e4a2da58e6462e9093dce486fd3e3039750eaf7b29d71114d10facbfabb69c26ceba5ab9c9bab96a551b216c36c0c000000000000000037c2a20500000000b23b1d7eb2efd1b8cf8040e9421ca9855cd7cead41a862eed1af82820ea9812f64a84e30d91e30326dccb1e8b08fae5771caa26e3de7f1b541eba7ce49d4b4eb8b73469d358173caf95f895f109fafb9f8208c62ae5318d111949071e6c7ef820000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072e73db8819d83147403ede0577541ddcc5ac8901f0840c1e41b5abec405cb9235d5068fc74caf20e2037ec0e0f606e3e8c250d828d195efb4a8890dcd202f542e8b85e6ac8f4a4a041b3e7873f549697862f2ebab48cd206232d301afc67b896f1f4e0601b3e349cb0327421213bb6db31fe0283bb3744db80bf310c866817302057f78d1413a68ad44fd9b7636b24614b6926cae6058e7fcafdf14fb769f8d5f0223512836593affe6c6e56fbc0d129568201b948f6c8031007803fa7d757c1a740b058cf15f05252c91d45e3713fe0edcc9e6f40b7c29beef20a0b1bae86e8956a245e1c1aa3b062b23552ffcc6bfcdcc16edf0e41c6fcd459483a34e6ce9713f2e0312d4fd8774481d00a4fb3832dbd3cb9a01c499741b7daa8d8f43e35641ed2658022b5083b35a20128c30f7706be4b4b5e02fcbba3cc11604684af35fac0fe1642f031bf8775358e226a02c1f3082e0069dc1bb016cd311a69051b76997d9e9848ec803026b8312627683e4ffc44a710a31385f88e3c031d71d0784956d1a257c1ee6c90213fbc1e8eebbd07e2f6a50525b5e3a7e7ba7fcbeec461d2a3adbc8b72d168c0c732a59553337be3ca2da2eabf9c9cf21819bc0769bb9f13a4ca1caadb1a7f24c82aac3c965f8ea4ae3b332ab9cfd35cd71591d1472f3e063fc883b6040b48637ac398414db4ed6e10e89cd5a392c6d42ee399ec88cca28a2e68b9ea68d1d0f4337b2fae715fcbd5d0dac49f6a2f6025990d831ecc7aec69dbf000f77a84c329abb62bf47ba332a7be99ffbbd6b4a24958dea213aa83b9fe5f989005425e12ccd3b11c3fd6b80ec434c1df55bd3153e74dd647820be52424a3ea006a84915280d9e112732651912eddffd617e5457150201e6366dfda06d12e7b5897bfcb8c64d933b1b1fc5c7a89e7e466d5a2602a69c0d473ad5783073ef7c851e568c9d4e8c5c8d22f75ba37949057a40759b2bd76dbedfe18e364b376c99883168f181a3839c3e61cb1ba397de892ef703feafeb792e6f54bf1047e60975294c644858f20129a4133258953e32c61f0a59a9826edb41a57644938d23d6e195801d0091bf23c303a61ddb7b01c074ce0545a4c69044dd6a1082b7d359ea4065f76f8d840c337bb3a2aca89c846862ffd295a1c9930ed9f615ef767f784fefc24049acb967294b7e43f8154757ad2d577f540e1d54241aae73e40fda1084330e841d00a62d2707f2da13cda26dd55bf1f6ebb9ed498fbaa1d200730e2d589d25daf3dbc713d0110bb0095fb88dbc1f402a608d3271fc54725633809c94679a8b1c7be80f63402728cc7efc386ef65a3756c7a2d05026eee58a0496678cb807ed75427ce781ea1675f4b844de1eb56aa983ad781563b7d3c068459bfca69cbe26d2139abf557b626f6c712e3590cafe0507861c8796bdfcba851c934b81c11ee6a6ac8f6e6d06c225a63ce72963a33e154faa1ce314c63f48b1b10355fc9019169241ff8a465112f3e262d38fa905c054bd4cb543740a59832afe1874e2a0b399d236a9baef126b69bdb4a5e770813a076beceed29a49a3aa2c79cac702c7a4ae422a671f4c47ee8c16303face26fb74e9e38655fd6f2692604b884f85aeb0f85c9a791aaf57ce66fbdf9ae5fe55a2aa24cdf95e3168771268d593414c474fb94d66c8c65840178274113b1a3d50d5b024da21d1f60e98d4e458eb9160e50fdb12207afa5c8adf55dfc350668d6e611d571c78df824d56a6e5ca07367660bd99696e9a76142a783e6fbd3c4057ca3a43b22d611ea8788ac77c92500410c164303928ec3e82099bbf3fee99070868afd3632acf58d1df1a137f703d9ee1a4b2783a2350034065869ccfcdfa43bb0fbed4c3d2517812d16d8e177e4592ebbdff2a581ceb7924ad024af385e930cb7e38ce0ac67399c4d6c0d14f65c3d16cdf61697fa7d663c572ce362d7739ae1f645644e29ae311ac32b1871edc742e893106c8920e8d90f9feb618c6433f90584820c1057961a34a22d699450d6dc16f8bf5e6f718ad4c365b4d567d06d5f9f81f0da6b02dc1ae6aa09826a2e67ef059f9cd6886aa764fb5468b70fa878660a472d0d56885813b1f4b69e00619024f63d576810d013647db702b5837fe964a72278d0183ef68222049c65b1064bb54db671be8818c2ea07674f1ccb923d6d0972d2be09042ab35da9aec9a8d47eda274bae0a2672760dc84762356db4683ad0cee7efd39720bfbf49c8235d913573edc812da23dc2ab3cd2781bc4df0af4a6f09ef62dd37ab061ffd26f1389a29dce4eb25418c0fd13a16ec7080cea944cb5f3162551fc127fb95232e65f6369584649c732b702701ee5269779278e79e425197958f18dfc1bdd98fb61636c98ba2269f9303e64569316eeae24f8fbc744c7a644eb040b3a02fdffb31e301", "0000", 3, 1827469288, 1537743641, "f95228bbd89cf40749505e1df87b03207e43538bb012257dc8789a2752c55a7f"], - ["47d2477f0353ffc01452bbc2afec68f91205fc03f70f82cc1b19ec375d811082ae23c9ba8b0100000003acac51ffffffff4fc6dd8aa9f5029d4fdfd8833d38872138320b86d81def15811ae8dad80547b1010000000453635363ffffffffead42e1dd125effd0701ffd0182476aa2314ea7681dd26217117198ced6afdb700000000055152535200ffffffff01ff364203000000000763535163650052bbc2d92500", "525251", 0, 1551048623, 0, "e8d92b5e9faf919fbf42951829c424a4fc3c69a9fe749585d72910beeb9015c2"], - ["030000807082c403018ed7dbcf386cdf55f9b71535b5f928877e12d361f87de189da22398b07471e4d0200000008656a6a5200520051ffffffff0324ba2f0400000000000c08a30500000000000e84b80300000000086553630063636aac5e16750700000000010000000000000000a2e8e20200000000c8b0326471deaadc5e6389a7878d4e9305d9c3b57381e1d9f5f9708e3c1338c1fc3a0a1a0bd2438199bfe86ecfe791f837a157bfbc516d76d92ab868ab634b0f3034c1c394065a5b5e17927c728451e7e228bd7b8c0bc07a4c22a392de78a5be000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eb8ff92813676aec20c271b236151dfcc278c0a00a7be4c8c91a1885808032876dbf5a2b2fe4050709b34e7e5bcda6cff52da5a4cd013bd4673ab4789c88475773c84923b44f673342fbfaa1fd818310cc7a79358873e37b1a2c3c6cdbae493123caa817d84c3f54eea966370b9aeffde032f066c81f8998de10976b02d729102238d6ce1497c62ad87803521a1668597c68a9bc73078a80719f4db408f79aa7702143bb37c8e1cb62922c8f238a600f3b783add272498508feb32e3e30999ce58e0a019dd7f3793f1eae167d352482e019984d69a8ff059e5b89436238e7f56f35b73f1c9b050fb700487939b9267903a5cfe47df48abcfa3cc8e23754ccbb11202102094b1b8d76320947dad2e8a6a1919106de3dfafcdf64a716488787097b2d2768030bd534198b0acbde8e87e81bd3a8c88d7de5654bd142e3106928f8f2b60a2dcc0315fbab24734aaa74084945bca974691c2a7684f2933a5e39458ae1cb4bbdb528030076fb79a9936929d8af127ae4e0c6c43c373b2c93daa7a96b48f033991e75e70324a52c9e15bb3405a08ccfad9e5a185f2c6376a900c05a0fd9a6e47a3d8a815d92cd19999dca4e2a2eb2547ee79fb3b392aea70b11652f365f477faf36a3f17001323ae519751d9176391be9bcbc00f78226d97b5b098eb0ea445065cb8a3319cfe0071cb834208f597ddb5370f54e72f23a799180d21c9da6411a209976ed2115fed7be3fe214acf76c757a799996118a18088999b563f32e8a6dcf531a36f22f08f449eff53af97957f1638a4818aac2e4839fadad692c6e0983f747df7ca2eab05f318afb655757b3619f98c41c9ec3a3be6c79278342b849243981349b6ead7ed1e506a9fcfd98e254471e09d94ef3cd6f274d39f7153e8b5d6564e08fd8d5ebe344023665026a2499ee996a634ddc057bdee2fd254624343e8cc612b94bf692c0d6e37ac72ba7cccffab358e9a7ce604d28db24065fbd8b0623b0260c9307d9982951b0f3faadc7327c2f791fa7f3c27f6bd583bd6c9b02bb97d2ecdfbc5c2064671dbbe921d40b70ec4400a42ba4f535975549f62bc9ec1c47b416bc9974278721f4fbe5519533453466fc95e6140dc4036f265373a2f2f43de72f3700238b84a621d504fcdbafa44f461638b6b5d76b08c7f95d2743742eb0ad5161d6f476771e394d74b5cfef1c08510bfe6b4163c82d9eecc33c543f8606a809665ffedd962d93f8ed741775c8ef30921e59713f49a028c7293bc508e83f7eea04524fb599011de6b14fe587696409c24e6690b79de8f6f78f1ae3e497c4b7d93a215bab1cbc018cd031703b6d345e76d76e6a9588684b07e75c7d66defb218837b83e22901ffafeed02760149c561ad4b100d981e24b4954dad1857e0abb17e5d18de85f25fe678af7af0282e220be094f4c9b4eb058611459a0d3c7b5ae5097ce1bc78c82332bca48a22dbe6d0912223b2c822162f58cd0becc2a6d237245e2f1d1ac6407dd3dd3eb4833dc2a39ddfdf0fadc20bbf087e36314374a29a2ae936fb341f944bf20335928243b5141e06017b279d6f1d95f85c30dfee3cb15679d4e7284ebde8d4825d0287c00fc0d5e825d41fef98ed3f9180a61e019541eea310f25419e20cfc140ed0d17d6af1311e75a5168718fab682394baa1209b8d58e6267ee46ab5e1d5f3c820636a6fe50a738bf2e9b9d5e8156a061a9c0e782163ee06f358a3321912af9b7e759cc11ef6632e1adcdc791f13c1723d38a84d173b6ff2b5c0e186f39947ff8207a52c65f738066956a85ec912b2f2c0edd8cc45ce32dc3c83fb65e4adfa4587c6a55a479a49b593773673743f99a28a0614c3de61fa8b212ea10a6b2a68b1fdd359ba1c7e9988ee6ae94caf0a9e62117ec26254ef73b07d3186ae1e0090683292166bbb4f3b0b1c1669ad12efd109a2d33d863e286d9528641079b36a1a823509c7b6e2c9877809fda6675d5bedc188878507f05ff34a43b1008e95f3f07cb49a068f47706190815b392bcdd0fecb752edb98ab76587e61a1a0dfcaf1c1848f0640af55ac2fcc4f07d5ef573b963edd05d308372d96e1161a0abe17bcd62afed06af8366c0cafd244462298643b08d6d332a126e50aa47a39c2f2e071cf9288738c30fbefb904e51fb17be56bd9c5a5bcdbc909540aa292ac62b77c36deb6c651ef582dbbf55d5f62d4c36c4178c3306725a6d1cc2716f835cc8d3fee45fb95d71c3cce953d1df7eaa845442bd500d1540efe7a7de117d83a8bf54e7b9ce1fe603f385bccb29ae6acfdbbda71e6dbb36a0d5e46b0777f4c2863c32d724c7522df61638f68c59a56a189ffa3135500d1b744104b8861c32bea23e6be37d5bbbd30b703294c67749318a7fa27784295abb3be70930c02e7f16779678d8a785cc84ca5c059c0e7d82f705", "535151656a516551", 0, 116000438, 1537743641, "78b8f939b429415fb817beeac02561da851fd9a3cb63bfcc5483fc4849f2d466"], - ["030000807082c40301fa3a0189e9af6cb4e1fc86c0444c049a9e990cf59a8d0c752e5a0125a039803a010000000665636300ac65ffffffff034a74d0040000000008005265635163acace97a25020000000002636af27b8b000000000001527d15e36dd2f4c66302000000000000000054454e030000000084442a3831343fc8ddcf22b01820a71de4fd744d6e4600585f8abd0574c86925d5f13dacd14b94eafa15daf0ac6b76d9b4f75c1d425d960fd21d7799466c732a2f7f4ed4e065c006c6eac99daabcb01a5be701c0fd20576e8013a8ded3c5945c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a88f2a16a21fd699ca98491d13fcc484d6534e761b1936828ce85d4ad924aba812b74d8daeafa85e61c38e386ff88bac8ce7bb4495b7c3af136ab1b85025b0afa9c1f113011ca73c939e3f9b7c893f68ec0ce43c685aca5df3bd058fa6242c6d4ad015a4ba4e7c536b30256ac677d04739859ddabb4c544943c86e476fa680e022360e358c0af4c71806df629716cb975519fab15053ab88bac3f714b9d7a5fc4021f526c6ba2a9c6da01a46d46e0cb640611e099df9cef32492e3c4f042fbca45c0b031b9c6b141ec1e90f4efca16a9124888208235f287dae77ca2e0842d48a8ae442550f70ca70f4356e4c42f7ece907e3f761a156a62f6d9f66fbca431cafe1e5022b9d5c18e4ad6bb97c5a14a7061977b72ca7d01a68e2a873e41da05f73608930031cb702ebcf30a6f100b11123d8d51c414903080c76bce652cd8fd9aab0452ee1032a3fc99387903449c37c9f995c13232caf9161a9f9216f1a74d11c82831bb68f0200efb994b0f0eba4f1ace813d4448ae603c03e4882333925eb485b81ed8244a90322c03fff4f93a8658d601629e508fdd013a79e7f5cac1b20050dd7d25abc604a3b2b3dd4d0dd49e67b4859e957fc40506e603323a7e6221e45a3be6886f21cf8a7f37cd17bfda13700264d06b66d189e1a7ecc1eae690e6936803e63dbd6cecb1985819915ae56df53d5ffe88505dd74639d338bd0e3faf22e5bed9b7d1ce02c03dc013ad668e2eddd95f2ae892e45e83a30f977d1d5c30bc8a7f58db9c89caa951af9ae6693d6f548a46316768a2208fb963499729bc46eca999dbb1d2a0e9b5eb3076199c62e4173f06609746b4d014747df4efcf2b406e8287769de82f43b8fcafff3b05f4841ca6ef69bbcf7889de61c1a23deedb86bbf04e6f927fc5b4b1f31426a0e9f17e28abf850bb6f70e4c07bf3a62001d62f1d83f80f5187e7aedc89d3029c1208bb15b8e3e6beb06833d10ebdf6caffe452ef59646b07b82f3d00b3750adc848e294c61968920e35bac42555b5957fd1f8fd61cfe0bc0bb9c4905025b59744594870ac6735cd7817ff1684fe384bfc7e96106935075f25b057d08a2f10db729d6d0cb12bf3e4e641ca5e91cb395b009a9ddf42d92a140806fdf2c833f094a53868dd6e869f3b2cc6a5a551596b335a68fb170240717c1339692258f3c7e75b2a0c7804720a09f95b3b63fc336c0eab533e05a7e6c9bbb853ab575e019c7acbae5c6c8fb02da77a92db608230c3f996303c205b50beb89dc182d7cd55c79143f0d2356f24327f9dd0fa9bb1e409a775e15b6113fa5242da161cb477b1c88d50d42b140d43ee56b025e3f6291402b17a6cd5536f8a4ec5cc0a22ff04dbbb8987a822ed41e52fd91436a984c3cc2dc7d094d4f3ee43dae246e5c5408f8e107594fc312257033c0214980481c60122d9e42bcfd581262ff38a9199ed75f40472281a7b8986726118f4af27623d4cd1cd9289f084bc8e20f5188ea3678e72a9c7e3cae35b765880d09d5f7cc81dcfcfcf095795369eba78a501cb42972d7f5abd04fb7d65322d3283df8eeb045e01b2216966a28d199629ecd95c6adc92a31cb59fcd460f50cb07e662efd3ad598d963f318d7fd7c6b892de1b4355f34823bee07d6febecff9dea26929d035b9abae4f90dabfbb242e3aacac350c3a70a2d4c442b0e270669945bdc17aa45fb2b3a9513056771cfdfeedd3efd3d48262add55d8a27b8ab98711b7aa3c2864140acb4c0e7a26ece7ef603a77c9fb931de7553f399b6472d095c87d1e7ae580db8a575a0266ccc29386176c761d5fd614d758ebb9741ee475130db596ee2390c1efd9b9277d122dbff5fdd2d8a068955b57a72af78835a3323f633e0c2ee72d5db8f63422c539ad15f59ac9c6e9a5494ddcdde35b7052fba1ffa38dfc5f55e868f57a4e8aa6d5c0f3946cb35f80be27394e7605df548951584257150ba9df968e2f868a24a998f0ef636de07087f00ac6f3f94143fc7b77375dbe72f3e72c96051a63424335e4715325befa6d44e955491d571e3f1393d2ec78eee875697c8a0af52256ab5f0c4a737988ed290ae1c4ca7b558ceb38ca441379b95f9a5915a8cc9840abb99d739c7a3bcd895c374e9b66b878ce5b13a050070401c90e914ef57a73acd5d6eaef0bab5a441aa03f71b39e7cfe747c384b378d9b38504d0edd05cb6c2b5f65b9b1f1c488a4cfdfb3415a48ffd7c26d531bd88ed431d1979b4e76f07814dd218afca4cd0a9e4b27a260342f083ea292fea2d19886baf455c6c26b709f3e00000000000000009db7520100000000be4f9d39c546fd19289c319c8018d34c448e6ca84aa1a56e05fb6a927c33c873bd5141d346fa2984f0ab8633a6bf55204804e7f5bd84d88aad05571c39d148984fc824560aa9051c7d2a2bef6d3398c3dbc5c81465806365147a6fc0511af6cd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e793a4003efed091fca2856649c7e8326a58480953914ca8698ec0ad54e2691603aacc53d9b9c322966c7df8c41497345fab6fe763dfab73b014a5beede12e1f0935c0b18fc5d5c2b5d4199d53f60375205ef72f99d29519b48815dc63041b4db9f93931c2e637d0c15f7c6041919ad2537b7c7f08746d634375c7cbf92bdb590207fb289dcb3cb2a0e7e6c5d378d6146900eeeeb77c942c8cf6063afcd161a669022f7e2c01a21129b9153aac8aa3321776d370407a1cae2f0f98fcd0c903fa2c680a03cba96f29d4a89e4262749cf618af2bc3043cab227be6e47b6dd5a142acb67cf51bf5a3bf46d92c4f1ec89b489c92e16846dd6ab9b2e44262c04d5119a0040e020de025133b9c86c072f45281616d49f4f4eef21a50be851b025d70fa33895936031dbf5c91a9ed62831a04a44bcb5bc5c8c4eccc37a476c0949b6feb8f1d3f555a0302bc2be6fba94ffa0feba6a28140b4d7d175f38ba3146c09e4375c547c723e940200adddd35c4d8222e36419374ea14523a79d2754de4ffc3b69242de07b93a271020e94de213e3317b98c58a5130ff224502d2273af10822dac31dc30088edfe466f60db12bd6afcbe040f1d5fd30a0226d146b4197ae2c90a20967d66670f84b5b510941a1eb29f4641b009e4c33666a63b3a8c2d1a3647d6a09451ad6500aa03398dad39aae75a0aaa8994891edee2537d7900208c59b6fd4138c1e69752f2f4a7aca8b56b545410e7fb586c050852ff7f63df34a5ba3402b74f4004420a415bbb4cb8b4b12d89239f5626dc18e01354437f4dd786a372ccbe0b7ffc3b0617e005477567dc525ec0d42167fb148e51d06563d73d90bea0aa9a6b909c776b81f517df44bbeff8254bad864b4f67c55842f02038c9f9932c35d039e60d8fa7882b12ef7d2352d473adee871e15ab9c09d6354036cca4e87751a45a33cb7eb1d8b531ef7f0170bbb3cb8158b969c82733efaac82a806321fa81cb9a50daeb2133dceaa518ff113ad127c8cf86042c4bbfa721fe370aa6fc7231e6f2de151c72489cb61c37260c1534a40bf706be07dcb5b06e917b15817a510564a6b84ee3e7466deaa6d2ecb1f62d14b416fe469709871db793a2628fff63b9c8f6992d0ab5298d15f77c5f10bce79bfb773d9e4c7e069ad93233ea84ce4c6302a82c85a230af2e02a2aa92f91aeda1b762aba45f9a77c5c849bf6dfdb853870e03ae0b879bdb15d335b1a25e5d454ace3042c0e4657eb49e029b934aa49f15b8dbf2a57e88f4eecb729dac6c27adcf0530cc2b364a51a5ebbbc2afce323f1a4087116e44dc8878fb3cb56ba59928b661ae7ec1d5a7fe151e375eb2314f875bd199fb58c1ddf8ca015107b46b186e47b8b99286ac3f97ba1e357892616e38123d25ea2e313797eba74556797feebfd881d21e0cc88539c63476f71d522c33fa7df99967074b1d4b7ff03c1da573bf9e4027539cb0901c6ad3f9d53ea74e9efc2b2efd4fba04da1c54e61ca0dc188443b3d856f7b429969f6e52c540af5eff53353905b6811401b1d20621d982c2f72cc8f9bb202d8ca0e0fd4164246ee9c8a2fa4d7ba9a93f064b143dea405f217e4ab49361d35e46c4d1b43f810a282d9e783a23b34d3d8ce567a8acd87dce22d3e1a571bd07cc39773019d1f2fc744261b70c2ab1f5530f8338bf2f81aba6fcad4567cb1825f0a7c27e42d86eac001d49815074018fbadaaabb29aed0f00b5a81e7c7f8995f956bc4cd3ee189570daaf6ed987075f15e2c44f9ba61e05b148c607ad178086ea820298f44abd2c6f4aac8664a13dfbd3fd9ffadb6fe066b7263ab4bfa679309c589ed54cca3801b72be1bea5edae9846716b7a6ea3cfa31ca78c5fa71d59d239b641d11cece543a32e87aeb9a1d2b994aba39054aa4068a61c220d681416a8dc419621c01c6bf71863e8b7fed91c86c07893312f11268d64531fee44666e62cf2d75ec23af8bde93d5540b2c4566a4f486a46a381bf3a4fe70a8aa85f144fb6cfac5c17d1c1cc3cf15a6ad7535892d435c81735b9a4fe416f6cfb6bc58340db96949264853ecfa52b93b0c5b1a1dc3c0344125e2fd4b8feeeb7ee757290a0a9890f353a1aec267a81d0c79b99cd4fa78d02087921e52d2d0619331437d8cf13ed2ccace1b5529f22a93dec94a9a76a103883142245f806270d53ad66c09b9775c1b424a41c3b65f49246588682b2fe8136d2a57094599c72f4a9fd5fc1f5e048318a3316381bc94d70a99148a278608275fbb6407da46dea83896972dfc837b7a674fe51b46d9a096dc72f20c1311d3bf77cb2ef938749efa626e5c298f5e251614bac90e6fc345d107e486f06d9d44d60d2794ed0afe337976d2f7f95cc370f729ff3a0c61f9d0fe6694bef61ac079a2946e9a2fbdfd765e00035f5b55ea70e9622d9f6490f", "ac525100000053", 0, 1672451232, 1537743641, "16c0e40ea9356acb2cb53d12274006019e048c8820efb334b2937b1701a3b1cf"], - ["3abae27601e2bd2003b6befc1d861bfe8e29921db52d5e24a4066a738685d48d94bc9fe349000000000951516a00516a635151ffffffff0214152d000000000009ac5153536a656a636a8585bd04000000000863516a52acacac511a6f588801d4c57001000000000000000000000000244198dcd3ce53b4852f678af6524e027949cf531c4c2ec7bbba7e5d0118669bc461adbcc13c7934937a9ec820100edeafaebea6881a40d17cc6fdfc910c8736089098fd7223ad6b137c46f697ec63e336736544c41a4093ab5ffa3ba0f2b635000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003dc1560912762b71b39b341dd7cba718562ea021b94082b16052b6ff9595724ae2fce476a65118b366e7c03facc4019c79c52995fdc710677211c226f8367411740c298a728588ef6d7d2dc33a3bfb98bb0078b2f68f783584ae38a8778b31301d7328f04c25d4ef9f590804ae9dabcf695c4afa67ec40b978b076d43ecc92e5032651a5d22015594b0a80b8004c9aefd72c1e2ba14bc07678b14dc9ada551405002196bfac25cfc49c0b30b449b3af419dc5158eef3cb4221259f2a58e9f51288d40a08e85f8c1cc4d9a75e4cc628e7a91885561c361ec8bc057e6d4fe1c3f0a23307041e47eaa330fa239494921882a9f0a47af97058e34ec2e0b865493a342b187d032f7a908f8d4f2ea1e956ef7827b24e2a5e4830bea1d626e247b9d647b66addf403204ed951626412958f3315460d7eaf1390870ff1bb274d6a423418f07dcda41e020957ac0e9c870e1719085298efba233458dbdf68c7d907007fc1c8e28faf56b70202abc250d79f338f825adceb0e92937d697ccf6b324dd3c6c7401d6192f7a5930227926613b38cf7c51fcb25546082cc59d8cb0aaa7bb3481a908a78bc7fc3240fe62dcf0248a3be3575865f728ba3ead3976be3e1bac5ee0914ee0f810606e95d0672604ed1f11f7029fed6a756cfb8675449e5e62e59a4a4317b8cdaee1ff94fc72c60467b2c768156d120c761a1b254ad0a3c9e9cdfde98f09b244ec404a92488976ce385d6e1ac2e7c8f3155e61057b820473454eba2888e0efa588989ef39081f31eca7c76e5a1a77c8d4d0c41dc1219ef90ed8299bc31ff354cbcc096b9a0edb0751819075e0ff33615579fe2a04413a874a2fdde1ef85355de7fb2bc0c6a87d4c92f03b3e767ff1fd686bad083d6bec24c60d82250e66e42947d868e38a4935d46963bbe7f992eb2b999ee5503e8d4907b2a0ec3934e5dd06ecbf79afab0ea3e256e884eac3aa55e125f386606bded0e5281df34b34a11a3b6d395ccbc201c782c04c622b2c3da2e1a7828f3988d9dea20a356b7007be280e0749c4e7ed64914e9d50acccea807052fb333806100bfd6a9d4aa0ed3493cb93963aa79b9710b01a3df00ea3067f310ca7693ddd63fd1ee847b4972260898295ce1edeac2e26eed28a7d95bcc8fae96f9ebf65f5e0e1dec125000f2f4f6fc8b077b200d375f9336142559f9ee1aca5fc011fafa20ac3f69ba397e94d2151af0f7ecdb1fff1b644570ebcd2e7bbac9bc4cd8c2f37651f3508a748296dbba2d0c79188fa3e753adf87310b104bd10c57cc6c7fdcb9e6b35c5137017bfb433b1cf0aec0dd8e6cdefcf03e2111d4c394398b835704b211507336fb27b41e0e4916b8a9714215bed9c53cb9cc203fd30bb9293dd4ab173dff273b8bd14dc0105ee4ea12f49950124e4085840bf8f511cb65c39aac8106e1f55f6611946e33a9c592035a268d489b5e3cc55834d5de0cbdeb34b3f27dfdc0e7d50cd3bfe744e7f660489ab7cac34fe87ab762576b53da439996418f918e899111c5e3fe55e0490011ff2e4a8f398cf01e7f055466b67e975a74b1fb3b19c082281c67e8bfdc1de29f72de6382160b66ce75a05da2d759953a3e0f145e3de799aede3ef9b09e8ea31f24eb87ee830a9a3ada7c20aaf53deac6f2e2aedd4f55a6142b6308ab409a21a41bb39562a0caabf1a71d56eb8373d7adebfb2222f8b95ec72dc96a4a77224bad5077ce1dfb55c39cf120b78e56d464014519474e0c88e87591d0f8c0a099983dd2dca85f00f790d09a560e7685657f8e7e62dd0ae5fd73426cc2d304cac237e4fb01b681310286f99498a31d089ddeb5810174f8bc80fa3fcfb22c87c3afc5693fe57c61869dc1e03000e53b5cdcdc49b29e3ceab3246531f38a999cf61992be424213174afc5ee563f9464bd33fc70cda09561d76f3e75507a00f17197b22a66dd90b4c0d7b87a0cf619b3bbe8790fef36bd1ea8fdaf54db357886e25a390341c2cf530319167118187d3f1794f528f33c5aff4c22744c6e0d3d1a34cb54c7a16f7916dd293c3c192604778986e08e83d06097b8a0a7a60a8c6465301835615641543af9427bc2c1c86b9514fd58242c561e02d38a990c12ad5833a35baf646e958683799c9f815033bccd7a7e8547adcbf0d86e0a6dacdf0d68ac266eab9c497df506f62e5fb111cae308e24172b798b37654e45a9a1df519dc03ce3f7da5436c65f15c536e73c34de1884ee6c397949639612a7de6d68c619a33732cd211cfd25ba925d8607913a37bbc7f2eed0f2d29867667802284441054151a0a80d46e25e4f876f18228cf37fa2533bf08609937b3349a552fcc4826db58589a3f2c3ae8413ef73d3c7040d59df693dd7bf6ae7cae1686b92b9e9fae07bf83bfffda1ad8dbd3e93fc9be5b95912e1b00e705f86185ac462655b06", "6a", 0, 2038609101, 0, "a24fdc37aba1c5c556fee6768217f78f2c827cedc5de1f90eea54fddbed2a4e1"], - ["19a7650b03b2c1963e58214b519a1a07f4403a68d53379063797d94d5c2d11e1f245d9aabe000000000152ffffffff8522242fcc546d9931121eed3f3185b7fbe387f35bacced85fdf8baed5d7590202000000045363005193fb75d47af62d630ccc25f5811d6ed0b72a702639fa30e2a2e861adcf4d54e3e4920d130100000000dd6d5a17037b81d404000000000063733e02000000000151ff5d2e0300000000086aac000000526a6a00000000030000000000000000e15ff10000000000f60b431c521194419956aa704e72e43264124857aa214d0a8640687f3e7eae729c9d22caac173e1ad8e4075a75a484062c5bb2c3e852d9b4d2183017e2f94bd7806856f8e9fc34d0426da1c5a9bb833a6921d55e3e6973bd5b528fd7ead1574900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b02504ecc54ff1f4323c6a09207b86ca85aaad9b01def67b62ba2abb1471a5a2ca5e5a8aadd79475eca2bf33cea3c0690e0b049bbfd765028f56b3b11c49863427a3003e37a2a24d3244a56f24378090d5604e7cb496c3e3f3f1e3f4f4026d52185ee0e93209d7dd6a98fe2ff82f2875861c688fa93243d78f300622ab6b863a022146142ea3d9c9aeebf82466844bf7fa984b4652a21df36c62a575c11191afdd021e2abed3d79c3f049fd2a51a288230ef9537eebeead9169cc7479a126ec754390a067fc3b96765b9ca59b0c3fc20dc006b2b062ed3a76f44de81f144082cddfb62a586429e06f6850659914bef19d6d4d99a202d01e54734587ec372d0cdd9c4040313b4672b35c8d3f358e5a6d99cbef9044a928c4bba05d520fcbf8dc048d164c6031e7825b57be948d17c6dde597b8d3f463e7e70e95cbba312a5a2ed69039d81b7021823e7cf3ca456e5e1d27e13663f237ef61fa7e29ffc87afd83d405294e182c10201d5625fec64a839f241485c59d6ad9a71db5e7470a54151f735c135cd17c95903301b80a11a5da48059bd45f3a4a3baf0d752d101e964a751c01a5c416f2895315631f4e8be626504148567b3f133a9913a8009495951ac3e32d327b2f9b0d2cdf2b4e5895160e71645041730221eda73a593a450074c798efed5500d88a0ae4a5ebd7c11af50ee83b68c94242993913884400d22805b117a291b71e141a98f4fcc3e6a06788e836b835fdee4dfc0cf18d9ed08ee948ef199c7076f9320193d4afc3f932f0e93d42e22bb58499943fad6302b7f7de17ee7751888b28c0e3113cc39e639854ee621c1fab48ac79d86c29a77639426546aa5e4d49541beb19272ad6b75e357c1b4b699bd9b3789eb8904812a15c732c59743a2e8d33a5f26a59767b850f15130f2e04501e12cb7f35577ba9228b1f4f987bcfc0df1fbe444bfbeb10bdcc3e43aa329bbf3a810ee2e5ee4fb91283516331c066a26860e173ba2a352f54492d6688f31bf8bdd026e5a4a5b7acb237e485c7fe78536227abe7b834ef021f91b56066afd9fc2d7e5a994d5b454ef3e7a4efa5e981ae0df0ddfdde4033a68799ed0e61bcb7607f24ce2f8c89f5c3cc2ee5b8ca0761ba1afb103416826da30da4dfee723e89ade802fa89a8ed95fd53134fd1b470cfa70a727979ba1f27546762e092609e99ddf95cb5f60aa8539abdb2c57c7958ff15c2512f1f02ec1f19bce378b0e86be9e7c5d8b0468a34afd0c4f681ec87a6f12902d81ef1fae9e5eca727cb8c915f4d6370c8302019d1d25040873e6d2593c6bd115bb394db759e9168cbb2b96a96de1ded204c2eeddc4fef69ce0dbc50fca5d75c73b6d3b62a999df48fa2cb9d6eead1d0dbed16b5dfb5e97834dfb18503b4cfe77bac15a07dc36095c1cbc731447ceb4b11407375b77662dc39ad88cd96aea3d051e41f44cafc3d033cee5d921ff68d191861a3f22441992b2c2b112a24c9a54f74f5a894985991da7a0150ff18171b9cdb1e45d929695cb877a0070c84e352c8f64cef827e987cc3afac47b6ea74dc93e4b3a0fa26bc628131ea89a322a0a032438f4c08a98643a038e04a9e1e3064f51c6f06c021b1002600beafe0a4106ebd068be6f323899209f9c8acd2312a1fa4873746391410d25deb103d910ce4850cdb51168c71b2835e8f904afdbf3c64e7191c6cff27ecf55da88232401100d8c3f0a7cff92f29a6f00b0f8f70bcb8a154b4b57779abbccf124b35f4f4f6a46f8bb50c6675e0fbda16fe26bc7861af469f3aaa7579727736a98475f3b3d795b70fe7f00c3f0a6f9de3447686165359b7b4f8cab80dad9536d7f9e0f7be1031523f0f49535ed1c822065df73534752bbd0cb56ba9aa3c797f3a7615f4731c98fe6691be5ba22473d32073329a48072985f37538e4e9ef4a1b01eab535a36d6c16abe47742e48a756df2d1f0b572b1f42d9c5fc6348a80f01e0f3c8e673b6a0ccadb33a83667df9fdab3fb4c3c3643608b5a16bcb9bbab18db09adeaaaf42fa813d39b05aaab79a56477814e5e681bd8610c7c64054eeae7c2e1ff4545df30f9d7ae4bfb66c0f545ae717d3a12b70f98f089a9e2258b5fc868e273eec674e43621a46f84643da371ce1dc1d12989b5dcf535bea474d75e303c79d17f7b6f065001005991bb4285290fac191f8d59fffb9f224aa9beb76ab5e56c63acb0d7fab679153df1e518bb4c4cc93c630b9222419360fe9f29535c9ea5446f8350df4edc37b51bd0eb699f12e0f29c12159b96da042127c11e5b3cc08c38b0000000000000000ca24140100000000de4e9130853cfe1acef64f680420952df46585ac52c67e2bc5be44ea6172273f471fc805e613c37d60c96e3edecf40d783ce343bc2d0c342f8eab9cec0d717956eba6a60b1e293973597ff0438b63bcd53210346bd09fd489a28a70d20be3b77000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003bfafc0d0702afee5793bf591f81c4840075f1717ac8042bcd75296b0bc9fc95933c9c1b8fe558c8d797b77b03b4aeefc3e11ced80a6ea5aaa3d8b1aa9ce195c2d2a3e6ab6896d26d116f874f6684c4399ecda98f44c63e968aabd1c35aa5d909782f0d5b38dde4634e24d79a9fb6d3c68f5f870210864d23e352b48b2942cbc03263090902b2964f13e0f2ab3f8e11fbaec2f0d9646fbbc1025ac14dbeffbf255021c359b92756a5b48d98b67ebf7e7fd3f985695a7722a192b3246688cf1326bfd0b03fe66841db7c12259dcafc0c4123dd89b6ddf8e3910ba4f62499d1f451386508dba6a6ccc2ed8e90cc5f4c9e0ac495a115f781dbab89e6c488eb170bd33ca3903279e7501fbae661950de0e7f75669a9343ba909ae7f42e7be76c7eea377d9150022163614c9c1a1008a1ffba31c8fb66b885a2eb081b58aa4e9aa115f1dfaf1143020d644cbd330758a25b119e34ae902dbd909d5df36fb81bf57a9be9d0676cf467021aedb93552358ef3926f539f4fd66f296a0af18f1d638fa9e12d40affbfc0c18020a0452d49189ca5450e38f9ad8a857f5519f2ce24a05d0aed4e3905179a2c590b9a9e95b6c7b86128b388375fbceb854cc38a3eb616238e65093c3128ce0c1ec0359ce4d3c7ceda709598f2e1eaebd9408083f369ea59bce59b615b7f1b3f2160675927cc71504dfcb4bec59fca4cd3c06e00d833f5cbc6086f0a2340080161da22980734a45acd92fb435e92ba47052b47119bf8bd46c474d4fc7ea0c97d80ccee0f337cf08e3b6ab40b3fcd4ddeadbef3c32cf69bfc301a7f83ee280e237e63e5a639c62b194d6963dc610f229a80bcb84791b5bb8646cd9bcd2dbf054e1f3fcad5289a0f826dc7c11eda24948b7414a26edee4ba8f5a0019208f4d393c235a5af03522cb85ee3d732db3327521fcdb55e3aef6cb8bd0d61ff4c591874e7463aeb36d7e07a71204d835baf615aeef931641dca12bed048697374872f41ee13472b2b9662c3e46b9915bd509b987837fe48aad2c6b09f5610aeb84b0b18f79577c2f109135fbf9e08e050abda54e216b0951f20c02a62d6e03b5cc0f75e211475033cfc5712a354c3f13915e509ee13dbe74abb756ff90ad61d451cbc09808be4eef93308a094afc68b514c71ca24c2b4788ebd59d0ae7afd322c43166fa98525cacce5bd13569742e074a07da9c43dad6d3bb68f7d6065704f9bfbc9b9504c9c80e462d4cc7c0dca8cb1c172c5a891c96fe89b85dd3b415fc44d5e2fa524bb5f21bb5a0f7d600b35935f713c715c68635ab418f61537bd3cbf3fc05ebf3faf1f9d74931dff26e813905e59c72c4af20d17e5078b9146032f135e85895542c2067289049a24fadaa2d4ce1faecb4ca8780c596e448ec777bd18a14e8a0245770aa813628d8e5cda24fb0e66e7f62312fd559edd49b6cb87585f7e6d615e4651d9fbc4aee0945a87f9a6665b880a2d1fcd8ebbce81ea4f3559473c51e11d362cc5145dbe6a12946033ca171d33c56b3dd16c37f8c9585684d8154696caf7ebe875420a95f6e0cbbbbd76d9c119f37c0275db03f67a0b92b124574d1d685dc949d89f0e7a8d83a732f47bcca22a3343ecb5fb57856dcbd33186d1da3fd299dbda3818ef091b7f707919a7a04ee36eef4fa0cf8c1d4a4bf85c44507d493bf6a19223385052ce93693efc785e5b0823076946dcd1f73bc11ac6165662eb2312392bc9f1ea233506797e67cfd2c489a935aa06ef4d197aa8a251ebce3a10af2417b5917bd4694bbdf13f5fb83643397e522ffe46b9af9b24d0b490c1f2aa6bc01eea46be63470900929a2ed5269d5a6ed35ab822c520c6c2a85c6fea7b9d61b609b8dcf1ecdf6ccda32973e782653d089c04fae717354909220dfe221ea9d5234c5e5de8e8bf45d978fd0aa2ed1e41a474d1cb4810d164ab0f126129ea3d511070ea6d404a73416a5174a9fc8de0194b116817043913610d3c1351721523f95e0cccfbcfa2571d555636cd6a6e7a7a92594d42fa817e2a9d17860e301c0e0750017b850f85deaeb8a01cd91f6e20348a3b8e68757d6774f44178fc5dfad0f66d9611889142ef3de420dc5476eff10a82cf8e147c0ffc3bd1259b51bb9a0f7353dfbd7f75d4d75612ae873030d6e2dfb7a4da78be72e61723030c046791ab8357c1a78254e2291d4a94fc2d6cf1a30f1570d9d113c32e410b70b3db78f3845720cd83b6157492b10861d2b53cc74b60fe41919b6bef55104ea387f8bec5f0635c900660c862f77184eeafc5d1dddf554d115cec540000000000000000858f8d00000000001d219876c7de122ca45da6b790ea9a653c907c89eb8df3b1e6aa8a917278d6017d97a8a75070a1870a3b151833de79689f1c2763c9d759ce77f3d03375e1a78245f2922ff38fc84fefca45c984f784ee9900acb63a770c50e04ac3e37fccc9ae0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041f87ef4b9c9272fea4aa9116a5bc3e93756910009fcdca6749cfa481ec00254e2f22b9ea0eaf68229a667774c04c2487349ff1c5fb3cd4fb1c419a832f40534356228a8220f5474ab7c8f83020bdadc967d059058107aa4a34e93c0a203837c6beff8462cec0407fdd7bd2b1b8ea0d0cbb200a16f5d2785e5461cdedfb9d6da03231754261918a72d015c500bb351bff65d8ae56cb392cc4b34e43d9767b1d97a0209ea1dcf37d2d456ea671601bbf1ce714a2533683587e442ee220b7f3504ea680a0549e7f612b91a1f485b1a795cc8279827950eb46faf52d4a90a700ebe2f4b8b3db8f40673634078b992fa5b25e2a09c7a6daa6b60281699f16028cb24eb87b7022186406e643bd75c59c8de42e9cc4f4d71d53b6899cce3882b03906a26d425e00311dfc33871d96537fbef8a68924d15940776fc1ba369e6d67ebdc96b5c9fbff502301a0bcf542555c6c2b4e3e153f5c646737279264fe23143039f365bd66512ad03158faac56e88ba0b7106f9e2b16c77115b20688c2125a5edacb8eea91c7c163c022d0893140e1adeb638e9e5600a25bd8325657c749bad40cf196d2d19e8195e86d5e56849ad7760894c1050989079feeffd050c9ec36cccfd92ed32abf12de1a3931621e9627cf99b3d81e2e75670b5f508f82cf44d10677b2d0f9b3023934a570a4e8921fb5c03fd85f4cbbf79562d298a9f196ed3e28f313707f0fe3549fb208fe7bc0acd7002a376a36252c950633ca98e36f3cd9f7ec14efa719d90f460683dbfa8fda3c6fe738a3ddc195340291f04e9b1d8042ca4b1e6013ddd75023bf6d4d2ce5a0a01ccecefe416206e4ac95b2bd3ec025a9165096bdb9763a706211c83e9602d7524911268a4ea59ac32e8772d32e60b1de905abdcf6c30cee4a59fb48afd9414b424e650a0a1fe3094cb32a25a452d05c4eb3ebb0866b535045a9f2a8ade0d71b660bb8bf3bcaee64d0778adcdaca7dee60c5efd6a7b3313841a3e8e09860f5d5f3a70094fc5545a63068e16d82bba04b33ff2a1e7eba87646159ea99e894b742d3dd8f9a64c161472d8cd2bd495ac4deb2bf3bb0e89f16a14ed387e3ad22cdd36bc7bbc4c993f3bb93e3b139ad969c1e4dfcf8a7ba0477727776009c29ccfdd37d9c95167e198d6faba554eb6dff555bb6add33ceaea8de827740a0b680ffbeff4aac6797c6f458aa09b8817fe2a3194e2fa52cd6d967ac8d3dfe681bc940a1e7f18791836a34015e5ae04b038cdbdbc9a9956e54fc2eea4b938e3d5b28791d7d29b85560ba20253907d7a0b7ea1c07fca0562058db1def9b04e9e96c618e14fd2e0b01f54a1c1aec96314eeb89b10080b2e04674dec05d7cf7079a8780556c7698aaa25642b1f07574680c980f0a9605f507d51af10f68d153e701c406d8ee87b80e9af586e869d4577810f73d9666457ad5730ee53cd00812e269c761865ecdd00e16627cc04ff26ef6350c0d0329cb3b24b7cd094794e0038811daae93febda683036d8177e4784fd67842f1ba73b582d7567322ae4f8053bd95b6708a6e9bf2b57ade33af1283a88ce22d78f28bf58567926bb93158c92b8c092608f06fa3133bffb6c36d461d08acac8adfa9f1fd891d37b6dc551749ad5b939c99aeed22baccc40fd524d5749b1d7ed305e429615fbbfcb1bd1f296cb188417c1ad9c6a755d82f349a945124d3e4d1a0f94ec15ed6804257da54832ab089a210f4b9f938d6d574d6a613fdfd003e28cbf91afa60af6f3c21c9e525083aa9a2c34f1fd7291951f027d9f94810c589933d3e15dd788361cc83fed91e7a480299b6956c3ce9e0ca6c1b72fb36cd1b83b5a66a64fa0069d2b83d6f5fa2f3c6a1b7dbd60b779dd670afa4f7f8a4ff09fac57d6aae18334c8d67ee2ce85196eb357b15672d3a5281baf651f3e44ba07942087b54f09ea5aa443c864288eb104bf3d141c950c549b7e775f0c9065be1ef03032d034993478c2ef7b42718eabaefd55e5db5dd43102e339e901eebd3681e747fe4fd07fd218bbb31d5fa4dc3307c53b14953cfeff356c36cbff0279d30156dd23b0e62eed8c438f4560442fe5f7665bd73180efc809bf977ca4812a343cb251ee79c86cf696668bfa92f307399857847a65354e474512e7b2a881938d15765af8430cdca3efa64a37d470d679e807586e7bf4cd0a143b06f0320b246467bac37097fcf9bea96da0d9bd2791b173a11a5bd909aa19f051725bc31ed5e240262bedf76a5149c1608f175f5104908e08991feab81103b1e268fe190b768c92ac1109285d2d08656c77acf6dd6fe9e309077de3abb88cd5cfb031027de5e559f48b918fe41119a90f3c986c114f0fe63b792026b734bd40becb1832f299986074b4707596137962850bb76813f14e06037b1297992948103b84fc8ebe16763fd1d47104", "", 1, -388023850, 1537743641, "92d1bac5bdf6e6bcef6a0b144d03a685fb803ed879c60439033f26921f8b4ac9"], - ["8ea0a1030206d4f5c770e1e1fed0fcf495ba0d0755bb00849fb4796877593b4d17c6a6e1bf03000000096363005251656500acffffffffcb7c64f230c6d171da4ea73428640f989b662a61859bb4e72ac6710489b67c020300000005ac51005152ffffffff03d2362a030000000001659fe4a8040000000003ac636ac3fa43000000000002ac52000000000200000000000000001c5b6005000000005f481b381b7bb1c0415bdcd5f5b73413117b3ba4402358ef7ae4fdd56f6c1e51f006a5205f7052079207637285fdeeb396b60aab048eedefb881dc13ed9991305dac08678a014c41701cb4d972f8cf1a80ba7eac8da5d60a775f00065eca5bf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eb0fded5b203828ff88f49a28546b0db4930d21de0ce988222ffb83151540ea8060f9f4711da996244773e2422f2297f8d4f1ff74bfcebba88fa1fa2b236d344e7d1e2716be17775e3bcada6d49f19ebd7dd94822af67d1b39248357863eff7d08d4e89adb4d2855e4905891b88816576f01ed8c7daf50cf2eb88c447daa3d7a030820565fbd0aa43cc80c1653efb710686ab29080a61c98b49b4050da882471c5021d5dfdbd437b0ebfd39b1e4b4fd84bad67077b6cb016fe42e275f2eabe3633e50b0564555b767f555e7ba4c0c62454a23570cb69f3812bfd9e623ad4222fb96831bef2c76bdb7c4e0ad5e8526ad0dcb92602a625dfbb7790457888002dfdfcf2dd030798858df24f4bed77a8e0b6ee33d37680d6547da63ed50141b78eb5063938a50317be21304c28f65eef02c3e88f7d4640a88663a9fc335f78e6030711e3518fe6030c3cf17ec1d64d22f8a31ebea1d3aa08b69a40e350dd74baf1b3e50c8267968f02228e9d3b49c8f7f6cf427529a699a3ef83e48b805be25f5a66854141acc75ab70215cf631e8f97e4ab05b877292fbb6cd1ddeef1da8ddfc29475c9f1f6884f775f13bc9f2515d547fd949ce7c5d712ccb1d00f399afd7a58e2324e8736cb5482dbffd68aff9181f802a09575db37b91cf6e18027142f750bf3297938b3d853c73ae8a48c58254ba679a68adbfec786d25a9a8fbb66307fce24edfe8dfcc20be547096af8525ab8709e61e56781898479bf2b29e95808c2b809d97d9833fd94e671aa2239db6dd50068f6c660b3bf5c6230adf0c0704e9ae70d3ba016d26207133d025d915917914ec1983098ad930263c1842b47d812f9cd570a7651f82b74dcfc888b95026a7bd43cf7943686c86aeb961741d6fc4c7fd8035bc4878781241359c6b7fc8c5ee6940ae7b6b47b5ff5c449a2e7036e8c2950008e0a23188ec8b7cb8f0d8479191c7072def8533bbb3ac7c031f6efa6ddfb37e57d87e0a2aca16b4e7ab5192dd05e7e8af861b6f65ab0fa0e0267355adcac88a71e98027cd04494be189d26f11f1268a9f5864c86c25bd8ed3080fa8a6ac93a48c75a696f412dc518736f24ba370d1754d4e31faad2984f1521ed807461a0f2c1dc8d14910b0945880f324be40eedf25692e7575a8d8bfd8e746956a610d5cee7f42574f911b1382a892c8530c3cb306069002240f1b1fa25ec369174adebbd1e2adb1a4d3daaec997f397bc237626097c5e03618e3ca1fe5ef863e4d9a11b17ba33ae0c4b15a23b28cd2c363303248525a53ec79ce4ed72324555cf9cdad8c389258ac3ec46f4a1a5c4eaaed589ce03c01efd505772e289ec70351c37bff8ed26af7df7fc271c35414a23f7ab6cd3bca320659fde07c98a9d52f8b141b9031b1c80827576b6b847e64c668fcb6297e1dc1b69157b621fb1b5d3661140b8873f3b53fe3f9fb8219c5757557ed0700517e6a0420691787b2cceb3293866bfac6fee5fa657e02853abab52d7f90e9c0462123786c6e6978cfa7e316de7ecddfb31fab6efc10892c6a2ff05182e161e5022637768b7ddda49112c2a3e73888671e660c992357127ac5ed92e17f04a03d32979ecb35cc2512c7365ee8b48aad2a9ba6c7cff6c0e0a7724e85907dce6fc790624989e2d3d6e0bd58e1f4a4fb57f176aca887f2c01fd1845882c2c8be6322ebbb17bedd2372f51f23aec23fe1944b213b16328da17022560e97f3c672f2cb352c3b332f82798fca282dce7519fd4dc80a23868d5ded76ac5605da8f0f2c6c5e48c5d461d5372612f088c04f74967309becc1cf27ed7bb109bda1c2e4615b18a43eaaba5d85e306ea73f8ca84eab15e545fdf85ec2157314d8a495c6dab050701651689a543b2b6030ec19a3b7d9459b54430bff372db5d028c659cd1261f1005fb3473ea736d618c70e2cca732a9dcd02faf2dfac7f440e4c6de9f153ab93350990f3cc2c89adf7a6517dd6911fd3ef9b83ce2e7e3c90fd0f81c190da77acf100300e2e2e37a785cd1a7f19c6916acf5ae08d20cfb77b302d27faad79c61f29446c2bf9fb710525113c50944968ea4325809e3444ef72c55e3cceb95d294359943122a6ab62e23813f15d319d5aa227919d6c013f9ced5c0df5df6893d77959ce3e4fea46ac7c2f602dda8fb1e479b1d39e1c528249a62ceebd9d76b52fadf09114501ec6763554dda9dde4e29e51a75b38563ac67a80b166c13fdb36137d9678ab402bd8ad89861e0388e73b50fc506bad794c473372830025bdc374d7313c962d7587d33ac065bdc77c0000000000000000b5b33b0300000000f333e51c3ae266837a80d5a31a1ed665acd07fbe16502242cbd9cf58509af94a12a84c8ff3d15274bcc1254697821cf4b1ca94d84012d69c2fc1d8cf2e2645d4c86420f6f1bef5d6595896666e2eda9b45686cd631bd8ae6e9ac71a69b17f86700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d63157ebc1833abf1c5deb8ece1febd90e3f701f102b53342be30f9758a14e74bd106bfea7966f8645919e66458f828f89fabf44efa57b9afaf0c9c177e2336e5013bf4e9a89d82296dcc5eb91f28e57c12a6e3dc533351e4d7178a60e2a4c8530288c4d22bf5d45215e8fe891a01db2e72db31c161cd39ec9c35a49fecf6bc2031f83f0a0942ddc9f63268c58c999ba2c7fe8ec85634f902604b3443298b4bf7b030ea2d7ff830003e56515df516ae30e8df11d7c5e3892a9c3052f311717088cc40b007510cd506b0555d50153075d3843e97d90f54aa7c38de5f6f94782990a4a5500f9812cba8c1929e1dd47556a0190c7b17bc207efd47bfd78fd4600f5db9f4a030b9ce0ddc634abc509da12ea1890a78bec22c5c764f004148f192378fc77829c0314f635c6f143ad5470759e72cfeeb3ae24b866d5ba81f62ec80e2e140a594dae03029fa46e99377da8c972b3d79974e3b41340faef7a531e4a2becb31e374d5b8b0316c5d5451102be36d461f5b75b2ddc75389458b8555e9d4892394bc551bccb7002069ec1ce5633ae82b56d448a24d43e6ff27820f9890999dddbbb4af36acd34cde09cdce4f3073d12f7c922cf4a6a8a781d3e45ad96dbe6e8cb2594c2bf6503700f17a4caef24028400b79adb1265276de8ce5963c64e0bd78bb325e59cf81bd1e745cd1f79d903105a1c6622ad1b94362caa620a027deba597903b9ddde0e23bbfcd96236928f2a3a7a442daf7165fb5f661b75e11f0b4cedb17ee22a7420f1fc1943bc2bfe7cbd4980a2fe91c83f05c169258e67a4bebb90f8ce62a00cccce468092c6a392c7fecdf53eeee6611f91631c24e6d95cb315b28e3be118f4ea1a897aec6c2782c455c6093f44c359177840f7a8dbec35de93de9ff0fdced17120c2613f456fd648d908e2def832bf3eed0319b8253e0463aa14538a4ea6d4b5c5fe975072f815538d0c8583e3da9bc6cbab5f5ea8a4f1508cc3988ce8e725e63bb80cec3190d4cc0ca9a485f63357ae7f403391807a05edf8721a9bd723ab8a5faabd7bbba92766e4bbd2c1e3126effb197fbeb7654306b46decb4df408ecde11d50b5106101deb75f5e3555eb4b1105801ca7447e2c5c579b318c868e3a1b1c44704d95e031c1606ae9d279ed28747ede1afe5c69c77acede01bbace8e51ff34212bb0da259d815243d4be3ea6de5aece433feeea0553e260a58a579c40d077ea88c918e4cee21347d83b9a02f7217f79ab76dc3c04213b1c1c4f03e1a758cbf3a55b6df4eb32c2ed9e8cad8c2a63c61e991f8095df4d2ac465c97950c92c9b49beedbcfce411fd52c977eed064433adf9b8229390a9f40ae08e6369e8653ecddb0bf2739028db6624c68da3bb5b6743697151b8363517602add5e36aa6dd89892c17ffc32fcb3bfce3ad3b3b99a75c5df46c1015f819d46d13ec861e6d5a5cc345c82d82d2a3697a622a2b8d50715af4384a0b66f5f3d96fd7b34438d4e3945f16201bbf23f26a882237fe2a21aa4b0f508e5acbf4a2b07fd7c4cc26fee9d681ca217eccad729bc3afa9388410966747e4fc099fe7079bb7f3a723b2884f15ec3080b43c76f2463f3a67caa7c93b008186e8cd027a61c86b87fd81852bb2e87aa480f30815f6efd643b7d63563f6b828fcb319b0b77fbf0e914b453d485a219c8f89e98628bb47c9a20b83e27182fa88df80caf141bfd3167110010edd8e7b0daffc2b46f1c1a0cf6862d9bfdf0f7f2633c6d2257d45f65a5ae324aa928d19990f589fe12277a15db6e9f87e2db432f58ff760f7279d801265a4a671985dc2de65293bead0a584f9e109eed98214f47bceb0068fdfc86c074d48cbb4cd98f1e1b1cbc17ff3810b398c09c9a79f3b915fa5a09639232d60c2835bfe9d41000b1aadc742aa294b44566cf6ef3f3c7d06b68081f7f226c24ef071bf6927df518068142945fd80e404c500f248bd23c87eb3f601fdfced9d4b5ca33518d781ac32cc687ae202ea598a85679507b6f71640288c380deb10b9209ce741b17e72a18b15e832b94b0d923756e9ac26405a1869c88f3bf5be55bbfc828ce2b4d9b0c1fe0d9c2e4308eca2f499cb27954bafa76c20ca48f6b2e739f1c9fb189f7c03ab183dd7ad66d228cfde2f8d816ba3ce4ecc27b5f7c75490e3702b18c526c5d4f1246adf2248178d789e099ba8c1f0036752dc863fd54bc699c2ca9b8d93d698464d6d7b9222a253f8ffebb6c2baf0a4310b0e7ea4585be5945e4e366addf132cc25d3db2f78fdc548892f9f4fe8b6c7c9bd763c25d9824b8ac873be42bc0aed644dab46daebdad3c394d320806cbcbfabf899dbaf15314d285aff7c1b1d46ff73bfe7a9e25e83efcfd0ce6d20cbd376b8649a0c6943fadc82e8ab57a685ef7891211680132215741b2b1c59b75286e0b1beb79d07", "63ac00", 1, -1766247337, 1537743641, "acc221afa5087e279ceca83f7dd992cb249983ef596d4c52678e4ebd201ca46e"], - ["9071f42c0340115cbd50a452a351fc163c5a1fe6f04237cff24c38bc3c538518e7e0ee05b50000000006005151655253f564603de47e37ae8db2ddd6d1663c6692b9ae106b36b602d5caca9c3c7a44b3ad50d66b03000000085252006300635263ffffffff84f85e81a9cfc2dd1802b2e0ab01facc450169ca8000f2d77775436b8785f8d80200000000ffffffff020b7f2002000000000963636565ac00ac636a14eb09010000000008ac000051006352530e0519bb02000000000000000040ec400100000000b65c32f61abe7307644e681d5edceda2e8336bd1052906884b8ae611725a3d700d4c7361140010795f6a4284eb2134562efe619c654180edeb80310ea22c9795d5d6ba6ce4c71a427ce6865c1227a2c148e471e071f1969704044fb064d7fd8d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008426d383fda3275c399947de87719dbea9f57acfc8a69e9a4134e5c80c41ca994407cb63b4ef9e96bc308f02b8d9da15f49f56baf00a82efdfa4deb0d441145e83604e226b869d0dd0382d4a70cb969123ccf6d1fa1c010f174a3cfb11c70f08287a0f4ecf076a38aa0bd13bb016c06fc6390efeee5dbd240d8807bc673bde2e0300778d7475391efe32938c0ac782718d24831dc538cf66002762a3d865724378031d60a74c838874cf3efe50ff33efad1605de500430406eb89176619d5268507e0a067ae45236eca132437b6a1d6a674a2a69ee6aaa82424a9fd2f4108bf0878f13c4ace777f42f53c9fd291c231fe2879a3d89a4f6c9223286a7c6927c6b6b60170223d34dd7bcd24d170e23a04bb721a29ba9d7a5367cc11c650fc3aaeae21666c50304967bf40faa40579055898143c0000f09aaeee1f14094f75b283ec4a3bbc284031443c036cc9377735e917f26791fda65fec0cb40a6a1a6608675814541a39cf5020305d6eaff02dd317e0ce94535ca05a08f712764386c05e5824dcb36151fa7ad0218116d189519c351150dca53d63386c4c23055c33c3c279232a4ab72e3a364d36282925a9a42d0dc620e7383a7ad85398c2229ce623df3fe1a4b6885365c4bcca52665d63ff5e2bc957c4eb9ee4211eebc585bd48e62b64f1251b155e2f268975f95bae502ecdd5dd0e5c8dd33c8ff1e9b4caaabe57f5b469970c30ec601f665066dd727e35cb745dc541682c60cc4c3c15862e26f86ac3f2f5cb2e51e74e45f7c9a0624c968dff3d695119b213957d79761d9251aa1afaf99813bd45a04f482b0697aec144a2c6353085dbc3328f3c90e12acc94f1b11fe045c2f29492beceb363de403a61882209b816fe0f9be34cbd1a1891a31c97ae9b995638d35e76c0436c6f42dd8bd6c1540fa06d31dc8d615254f32bb72fad23a13c2b6203fadcf5ab384b2ac65f414f38ed38de706daa7a769e7c62363deeea0265d68ec087c1305f0d8f5e1ead01682bf6d701b487fbb9d8f5e03fc5a2a1be7159439a21b982aef4f3c1f3f86a055e85b067562baa70028edcfd8e85f58076f8347c03773de0071121c66be7242c7b7fba696ec67d4bee717b04e02ed2d23884525ce307468acf9849cd537a4e0a157274e052ec7656e285db058040d7ef6bc003066567f2fcbf94c936682fe6102cda30a24a6da341ef059a15fae42c54cc180b4ea0a3aceccd8199ededc37c9e9cb5aaaf43d2c668ffb394c2163fd62ae6d6b99960f3d845fe93f5ed7fcd9ec18a0716bdd131818fb92fc799d5f7119ba7a1c8bd1d6e70a01a0d25ff8b2ec22a14231d01e1724511ff9dfce437b23c9ba3d64aec98c1a191c62f4edc771a9baf2c2960a1dd92b93643e256bb944197194ed50379acfb96de0053ae3895b420682c1345c5434413e2e35fb3795573e3bf77a0f443e81969f024f91d49ead5f08818491b489f9852735f774bcd436d22a521475c7c4afb7e429853390ac5f8ba6a191d7cfe6726f1a9050c0eb4fcc9e353df572987884610a97b64ad648b8345e607b9e5c4b49f0541890136fae3d6713e56bf7d7522d4a5fa12cc6606495c137450bc95da317c4ce62dd5207f71cbd2efbce39c191977741bcb208b5ce07ff88ed359c63a03d9b3936f000ffa7cac0a6ebfb42327c18a012d5a15d02ce75ab2b434eea6e08b5bfb045820bbdda53cdfd8a01cb760ab73211098253edde2d5c85aa3d53d861bf9fa2fd6e41fa729231ab84415a4eaaee597857c93e6d6bb03ef2d236cad9c03560bb02d95a36f41fa1dc7eef68fb7905f80685b4d3ff07940f0937e6ed6a9721fb465947f3ce533fdbdf5ca3cce6220f6b309f55a1cb06ae17dc5c541993ed136b6f1954ad4d45b3358cf4f476f0a633abefa2c369f8534ab6bced17f23a31215d39c14e055dcceb51900f50f574ab8c8ce8a9554c725699f2bda1acec7988ec147595e5d97d8c88b4496d07b8ec1110d40da5d28fb92d0dde2e96f31342abbfa7e83afdd0b962239903f90d50bbfd6a44bad4d821ed043f9e2f002eec3311bb87edd54f2b0511c8327417ebabddf1eb7aabef28551c8e5e13bd46307752ad6e22ad4e51d9bed8289ef31852a52fcb20c5467e91b67cf1a87fac89e22e435d0773cd2cd1b5a048f6fac378251f35e48b6ee03758a621a922adb4833661d9ef354130a1deb30660c2c0b4b6ab8363a37a1df422ebcfe540c9ca056edb5bd72ba605dce538d4223c0d86d4639cdb83e1e38a4da6613323feb17152e27edb39ec52a5aafbb214b8becabe030000000000000000000000003331006f1327eb3659943cc8039b195c326e0640ed769d799f7963bf522a3c8a6767e0fbe6765e7bb71d4c3cf318ae05654cfa539212f50bf387084a9e2e1e6710bd073abb5f4eec6485fd212d1822526ba0369d5ef9764c4c0d8de9e2d220950000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096803f40bc12460f50ce5466e4c95f228eeab41b2adab716f9ee4b2e8fd5fe6d35ecffff05cc203cd782c3585ba14ced8cb07f4b5101fcc0fd21c1b0ffbd9c9c5664558d7e732530c5c86aba2ee28fe07ec01b89bde48b6e0b98ae0dfafc740ae9b6429e9544bc387f23263c904a15871977007a291f68206b8168941e2b5e2903099347da6f0922a74de581950eb704758d478e145137c8ae54905a3607e3e6c403142bb0fb53f4165415694c7924abecc4933bfcc4bfa0aceab783bb14a57826720a0096c26ea4791e9676f44753cc65956e93736ca58e7c7541a151df73ac616f0ba4fe115c30427fe1031a1b8580a89ac3c369eeaf95559c56d7c4a745ffe38113032c600d009d247de2906c12c41e129b2ccbff831e086831a7f14bedec96cdb9d90208630c075053d390ca5c7c34b944f3c7c6db37808cdbd755a3521d1f71cdcab30323ef2b855c31c3e27993515d53f5ae88a0a020dfbacec615736351c8c7198f4202229fa12d1027014912e4f00c7393cdfb0e68040cd276322057c01131113001b9020656fec6a87e10718bc8590398a0b24f4c27bc785cfff17c675cf013e506d05f2433e3d6f6de517e8a0442cebb4543e3d92a96c00aa61ee0350caff94bf0a02b0b45ca487dd7e9b9124652a5817b5ee3aa72dc58cdd6f96f1e5851422e067f99a16f08df42b5610738afb631b371833ecb7c99840b5d2e8af51f57971ace9ab4574493e0ab32b8dd864dd907747f02685b6424058116628ec4cea1be4fea1a1d93e9c236f6827a01471ff0b33c8715dce2ad18b7b1a5d4b41d55080c8ec721e481f2511ecaff1feea67b4629845682260cc3b2e00a866fbc482f498f5540cfb102676be9898fa321bf50f60504a9f9909379c53cab99692dde3c9576d7efdfab7259eacb0249667f1c2c98667b30bd935b2e0e1d8d48fb32ccc2c4d603e5d9350da071c881c3e7ae176f0e8fc08c184cb199ebe965fd299750612f61441bc685a31c315ee54959b9b54a2b72efb7b7936bb49746b6eb8e1baa01a474779abfd6bdefab2a34e4e0d636e4f24b8e8b3610ec672317d6beb76ebad7dfb7601fd237abdf8d6ae2f45cf3f3e4ee1e8fa39f041250e0856525bd4ec6a9556d44c5a31613027b3dfa8175ed85d51715a81befa66ac770b3c5637aee2f20376b60457d239293131ec72f635b1b2681537c83b72f7396f39ebde62a0ddceffac0781ec267552cdf0ffa88f570e87c3aac1447b3c73de73a03be60f2f9b433b137e261a19fc28658fdd8fd8b56816de5e0531e96c4220f406ae45969043d20bfd195f754476197085a34c7f5725068d5e75476a1624b51fd0bf0c8073f4c587e3efc02a87aca0deb48d68ff06104ab8abf522915510e348fdc9179498c234c12f72914da10004d9150f2aec63db7f30061acfaa13f1a1c8ca4584b409a6db3f34b50f81cb752488db0c5ce8908d0982ea4a0fc42c1a5e7287a505d28b16438f99edb4f8ce8c8aecc5ef2f77baea7ed8345ed897988a02402f7c2d841172b5be9e665485188d90a534da1bf10b28e1ddbf61a95dc1df3af961e83cdc4d40d75a00e8548f88993b5fabf9f48bfb1387057aa3c5576e9e94e9ade100c53e1c8317cf66be86bcc7c30aa849ed30afb48857f3b3b7ec3525650d03e1a4acda1c228afb303dcf28b353d3824cf4439088da9a77a5fc8a209d8372f46264a31144e695426d7ca41739715f97869eafca7905beec27ee9475de08e6fde8b513cdc532b02654e4f5194e9ab8b5b777aef7898fcc1956d65d1aa62e880c0ff8326b406a46c592621d5e78532ede7f6b0f90c0999c7c9c4b6836ae3851bae5f082561ff50dd9e0881808ae45ce473044e06014be38abf80fddfd16c27bd26c0842626f4cf133583b38b636c696bcf987c15ed1376ed3b1144d24a9d053225f7601a561f1ffc6ed5fc891031193cbc4eb89f2c9a9b5f11f49ad65ad192c3d604a7a805cd653600dabbc0498a62baff22564d53b260d191f30d9a808c228957c478319ac0496ff35425d7d2f430367634484f11a364016e95c0292121343ba434422114c04ecf08bca06e8346d55602faf4d1e154d06e367cb52351f848cae70da3866136d556468fcb7c3778c917f9547d2fb4abef9b7a70f6576bcd609e95f05b84b813367dce521da351af0b3042ff08a16e879c230f737b398b9e80aa11949f04e9f9b2ab4c34db504d63ba8e7a26c933848436feb638a4103ad097bed521ca09744f3968d4f718255b0713d103841dfe106f5c0c41a9af1e28b59d97fc7f0b7235afbdcb4b70ccd52eb947392bc65aa100c67fe2a0ce7756fba7965ac953a4101ed41d4d27b40ee29031657cac8a3670280f423470b102587dc267a43a1d1e0e867c93e1d3a1b721f13adbf650ffc241ebfa7c263f816791448f06", "ac00", 0, 327909026, 0, "6aaf9171f7a2a49ca239a08c5228013555c1ab92b05497ce127b9e1ca9922ad6"], - ["030000807082c403027a09928454fb8fc3852192bfadbaa282df223eea325a1a9dbf506056a6496eef02000000085351005200525152fffffffff06991efdf89c780658a662cb909f32df4d63816b031b95a1a99fc52e5a92c0d03000000070000526a6a51acffffffff015aa473000000000007ac65ac52515265722a6729b4f7b4d0038aad5e02000000000000000000000000de0cb9c6df89028dece41daf7dba6c77859411b510ef88d793d680fa692a096fc8c22ae4a13429c82f67a752a459f218e5ffec7fd01f8ac60f120e96940d3045e6af6b2bd1cb9d6b9fd2250002fdd053f0973fd4b11061a571c889c595f4850300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b3d6eed48d131fa82581e3ba200904f9a033289cd4728ad622a9262ba136b8680f859e8bec47403617d86647934a99c6b9cabc11e5d2a725aa2ac18cc885aa0143eb21c2ff570c348dc0fa41c7703f11c24199f53c02b314f8c4d75c83a0eb479f7837a0d986c993ea16d188d52c55888a86912b2b5a51772e6eaf1282eae190030cc57888b57576d1fd961e571b7250f40c8417c5cbed6d33014ce4d3e3eabd700316072c6b6273f9df5597829da7115a6195bb2754503af019badda2c58eedc1150b00ece647e836228fc9238600c728c9ce472aacca9205db17c573c30098061818b5c33454fa9f8f3ddc22563d6d933df2ba17ddfc62d753f31321028ee2f3e0b20225cc65590eaeb86b876d4640bb81325b8dc347a036517a5fb56de7590f3aee7f0207ab6b1d86c7b321df917cd342274663f7202a33fcde68df520c1f3b73e58c5a02163d16dac95da7e8b58c42feb57d01a63a180c75de77f1bb4ce7a8e58eed09b2022e3aba9b1b8f3238e45859c3a6c42ca0c1efcef18a387824fa9ffe8fc18cbeae022ca290b652d64f7b01bf7e6b1ee09990aa7f695d81ffbd80b3599d8af36ed18bf1573bdf134a732fc887abc7326988a3336eb9925d9a195f51872ea85423984bc0f8ca1c6742943f205e003fd99c7dd853d89227218899a7925557c1f45012e048d76f94b497445ac6db7fcfe4f9a743041057277a410aa9c7e61dadc51cba890c17aacd4d906727117997ccadef153d444f7678667e9f115004c1b4d07107dfbb45add77c8944b2426cf5a6e09f1e7c6aeac37228bc8e3a072868b86f96dbee47eba37d57e7a943a7589dbe1156e889db754f6f3ca1dd6e93562b1ecf639259df630293d7db56dbbd50eb0ce0b3efd8f13ba3cbd34bbaab1594029e954efcfa25a0203ac96df1bca9897853caad90750dc7f317da3dffa74ca6fd7b89afa1e4028ce9e0da6da78a167a050fdf5756fbcb24137276a09c2ebefb61489227c87cb78e43b2652f8d88b004397e417b4a357fc728c0e0c651b1174ec8fb7cd6966b43f093054fe9bd13749f36417601115d13005ecaa86e0ea8ff288b5351b381ccf7eb9e2180deee478b6178849cfe6014aeada8ddba325a19b7a11b8600c06bbc561753f1dabcf75e8560a6658d61b4ed43cb494e54d7081822d96568a4b851acdbf1827daab0c48d7a2979920e49c6e6a1c990c818c2ef335edd333cced7113ff5abd671dae00413c6c7657e93f7a91b1bb044f2d279084875b347182b4cec20d52b33fa19d013de7f24ec9b7555eb86b8485d009235cfd429417dfe10bbc2fd8a3c50bf70740489d7d1bcdc7e86a65ac020c5d722b91a48b32ccdb894809cde34ab6b853bad130606760162066eeb2736f70e0af75b0f31853e7d024464ce06c052d8b9a11110ec86444c2ff2f42d45abc1620ed48c0d6d745f7949b3d404c62e106e6984e7a65890b157d06b41d7f7c3d2ce8bf6ce5f6480da1222d68c50f8c481b025ce2caef56ef16d4d23bd8955856ec7f72e85bc16c507fa9ac6b94b448b7c6935d55adc39dcbdc97592bcfe6d54bc44a41e76d1910ad2b741c529f026faf3e98a13fb99f2d5dceefa55f876cc0f34207b712bf3d0ac3b465916a06753675407efdd8bfee93671a00a1ab57f2dea58e730b23905417c6886f71d15b9ea754cc41c7642e25e4b2b0c7050a679db4b14764fd9fbe409329339cd44b16cd42bc0324e38b022a8eb66665b557049c990951eb3aea59670ad79c83680a42e8646f9e5a73faaa29f69b6e633ac3629f617f8edd701b5703421cc410da271832acbc3f10faf87015b6c63eaee37f07ba834510bd7c4595356b1582ab49c137ce7f10f43cbd5bc3f2ad521006c4d55f14e99d0da3862c74c360237829f1a7eec7abad77cde0d29d9ad21189d32c97bbb9fd6dde29a390bd9e8f5a21a8c29c190e80adc97608e1235de01552762fd847727b138a0ee8f5016caf32d7c13759e00cf79b02b8f88df959213ef9a8a55b65b7e0df5c4e4c51142612f71e1d095ce2655f29d67f21db7a8643d27f97274197ed802a99afeab437402025675c1251d4d09a6b5e63112be2097c7247a656cb42549a9ef6f53ee8683d7b52108a14cc07817022ae60ae5c4ccb9a0d885c50cc560db794c459df60a07a3c5d121b72c3c4efb866ef62742fd4edd7b258f26e55582fbea43924e1b435600f1095d4250916a040034e3a8312288e1720408218556731002d0ee093ea196165010d8203e69b997b26c1848d966558a9bd1120124c6c91da11600000000000000004645220000000000f0838a2cc159c9b52bb7505ec16f53c46a062cfb081a4065f6c1be9d8b2913ba6bfc2a517cd0bf1108c52b3052f25c6b7593eab1291aee7ff48907b88b58de54926f1fd7f29aa5695c3f774e9fe09c8999d2b55e0fd0dc7a6042bead78118f860000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000031c9b70aaea84ee53387c9b239bb4dc368a606987f8f8569f771cefbededbda7174165edafe2e5d7ae9170329a211be3f488552d859ab0dc2c21b128176454dee5063dc7854b856f7d5cf25160a6c9a570af120dbe2e0ca697d3c53f222c938c32a2f546feb8226def0fc4fa895de10c930d1511f08c79a4955cd30bf0122005020172f22be683010571e67dbd6a2b6e8f607c4988a2f2c990eac2452644b9876e031279505f788a9a879d1c1d21b6355aaa38ca8e41cf5d7600afe7638af30130810a065877873c90dceff2e78c0d4d6a314b71d0ef46f7e5d97f617928e46d4a19839926039d5782b83b33cae78d741197619fb9657b52a4651cfb164daa06aa2d3a021581b8e598e415cec73fb246bcde2fd53577bf8aab087463cae5378eda70c4950301cfda3bd48eba051453d4a74581224143f339129762ad44cc3b52045f08bbde03278ddb721f79090abd6d299835e4403f3fa2846c4394b9fc1ed96a81c2ee8558030167e742593beaef94f196594026f0de004bddecf55e4aab3efb4b377e8744c2020341f03801a6d468d0f16abe23b346b2749acf9708ed0d333ce5577b95e50720a2ecf90c9b95ac0754b1c37e3b321448cfd12dd20f97141b8c059361fc11f374b33197495bd15ae56b9323436cb4ab3f4d5dd59f5787cf2e3ed16f459584445857f47d9496f033eb251934182fdb0c251fdbf892af2b6e3c55e6f0cf41e683a76dd46bacd911a77d484b8495f670f964223ce441f4c80700cfbc6325b0d8b6a96c061595b3d44cfb390c9de3614d66f53d1c51e31325596ea88764a37066c4165a3bcf10d607fd0c395afcd8c908c53c9484b5b3191bb4caee087bf9f54817d3703cd8336c8f0861f88bd7b7e63fb89a45174895f0a1b94d9cf71493b783be389d318316abdd0b5b1f9c378f84e84f479c3c94c8124d944e8e4ec41d3625eb379fe316cdfbf2bb74fb05f35ce7df12b87cf8b0f88e34eb971219e4cb882fbb86bc6ea6c7f3ad1f522be42425da92d21feb9494ae4d5ff8aca653af8e48718a3e5ed5c83225d5aa6eb69efea32b5e4fd1aa5137c8e5bdb8a647acea2d4142ae9822b79bdacf571b0c6e467a22ed1ebf4470b5a0dcb56cec0ec835a1a4bc5bc197b058397096ff2a0f3571e664ca7882f8b05757f76341cb9fadcc7166a5bf9537359262ac9d0b1913a977a1af63df0a0fa7ace72c4c12bd6d511d0173bee4ec75efc6223ee2eaf654268a01f3e05a9d96a559d0d61fe38d506fdf17e11f7887b37dec0b74df62fc87a7dd158485b169bf167199ef08ea2215ec261c55e79ff5f0f55a3abdbdbf5fd88185478c552534edda29baffc9f2a13d32f81e5edd0ca35cef6ec1b73e9ad87c6f68253d81f23b77d32182b7dab3989b03799451e820014c0bff3c1d5870eea129793db8c152b1a60568f7d953118b2ff288a2076b7bd19ed90b141dd01ce2b2b16d013d304a9145bd01a3f689a5b6140efde0b9fe64687db61e1a7fb10cfa656004e2834cb271ccab755f5a9533dabe2439e45ab1818e7283888849e5355b30bf70163cf88128075b0211610da3c510fbef4687776dd01647a499a3490fd4f2eee728ddf628596554c4d86fb5e75ed5b31f183e12b6ca5df26355bf733fa8218451425df49a6bd2b9d2f76438eceb55c76045f6f5460124fac4099fe4692c810f7a1f9ac61d02072961e601a012fb17af1b3173cd982a5c8567672340144dae98dd49ca7dcc1f5790e7c3ce0e1f2cd720773bc56ef3cc777c63e8b659c98fab112b05ce3ee4bf66e7e4d28c4b9b8963a7e911749d95eaf0d0e8c8a0555463d4b5afb9c9fc0d4d485f63ac6f520baa33cd28f64bdbcc9e64d093ca0630ce64a31a7be2fd8c8016eafb6800a551689cfef4cb9c5ed26edd83b7d6bba2a8664cfc4146862710da1ee04f9746ca91b59f22c9cef22afacd4b420b6a25014acdffb50f3a32e3c0538a7ac645af9176d3785bfdbaa066bdaa02c40003db820cccc758f969e69fe756fdad207d4a601146f9a4e1b0e7d085478946a5b98e4a8565f012621c3e494f2a8ff8767e7639922738cf1a5759a30110d0569688837ffc2ad7b2c36d5ed40ed59905ffabf685dd175141623aedf7bb7e8119f4f39bd6d259fd17db56e507e5292f2af351dcbca6f64230faf119576060243bca088f692bdda4cd99806c9f3e282de2c659bfe25d39ac1f808e0f32e148cfb784f8257b4a17239358be0e2619bd24ed4c368b66fa5cd135a2d0cde43abcc6ca2eeb84633dfa827ab827b6f813f47619500800000000000000005950230100000000712b31cc020e1d4de832caed0d968468cf73e0cea9c8f8fcec3c4524be757f782e19e02533a13f5481698a266b7cf28091d61c96ec3c14b1d6e6315daa1c8f29ef1d7c8091c281b1dbbee53fd7b9faf1e88d92c5b8a34085afbb17cd8fc778560000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007d8aa83f784972a6a21dd5a2a184f9d81a741698ceb22d0230f6f2dcd3c84c673ff2c514ac0b28ac85b8849ca87121284d59abbd6107d76f49950334e0fd1914864f7a81471a326f3305c2bcf8e1f648a98c84cd8a21f822288e9ddf1b012a012fc2fe070cbc866c2550b273fe8761e66d741d065ce5cd522b1a9d59e1abe6f023005cc30d30da0c1f6786140563446c8707a68f4e2db6362654c431a8fef399c0201eb6780aec2c05621ee60baee08d2e786194afaf7b5fd3b46bae0d3a0cb65220b047693dfcd4820a3ca922677a7b240dc8522109d5753fd863ad454fecf2d80bc4ddb8f17e26715f70d576c2cc0db5c9f403f8b70b49f781aa65484a66ddc441202021dc6875126803c300f76df8173136249162ade5977b0841e78346c7c92016402270222b410a8c3837b8d23804de7cca58fc8e1b102ec71fa115c78715d8129c6020d3d536d220529e3484b4b2ab602827334d41d8c2dffa6cf7acd137e7a2328a2020b3204c7155abf982cad76ca25c0423b46c5036c9768c257675927ca16abd554022a955016fa8c884555878afe961ad08865d4850823ba6d3f0ff1b92fdaf0ac6cbc1d973f3bfa79914ce9e03697ce163008adaa1981063a4fc53df71aa3c23885f67e4cace84574a63fe5fe278be85952b6c5fde6a3fdb16975d280fc9b99507a32f576330ae390a69752444f1b1ed9a8e3b18c5411ca39921f6c2b8d732730ff1cbdc6f3b4126435dbbd9f0b9e0929295f1e316176be43ba829adb477499acbca2de32eebec3250b452bc3c06746f5cb709a7c2be4ea48c10b61a948dc3dc5c9c8c6664eff8697bd4fe9f241907596e85342678af9af76a84bfffb4af3e2ed03a7d064a22345e3144de7b29b6122ba49365b0aab61d3aae3a672b8302aee25ecf6c35b029f3a0150b36ad3f4f21f445fad90448f33b65287b26364350ec6e0d813ed720e880e457c82477852855cc85ca2a1108b0caed4154776af38316f11a759ea118c78a4335d47b495b5dbc68bad0dfcee2317316772258ccc724d2f09a60a64c997d644a54ddc23638dfc04c359c11051d3b7e0a66e275c38dc40b5bc5437f78700f977d5bcf64bf021a889e998d60cdecb29e2b6e02f483a4c0bb05268488d818ba1fcbf9270ba2e17b64d7aceb222e9b2b40babbef4bf7cf6d8601ea8d96c6a076359fc5ac51221e32249b9223c12325e3d48ae6b9ba0343deb11a1baaf0807f5d41d21c0b61b3e6afb1af22997d00e44b4f4e590c22f77f530486769f5dce2f2201272f53cf618511e70b14de9ca96c08e8e2041c744f31a6e6e99005f5fb5a2c80c1297bb286b55c294a1d92c125c22e1628861bd5d7f8ef194e6c67709c24e4f422983cb31aaf46de23bf811e71593ea6432796c3535003dc22075a1534da77e04e5b3b08559132232c7b421bd7053205b3a3c6d0484637f2ce62d999d9e652a7c15da1590fbab5fc055d8b6b1fb146b76f81b2322dc3aaf8eab11145d380a2bf672b7ecc963bfa3b498a19dbf6f8263021aba33dcccd49d429b56af054a5d6d781da0a65fd1b1dc76cdfb460a0620b0aeca0a1112b3c7e5833b8a4e37daaf821c47ecdf23e47077678b97114fe03ab5c7f6aafc0b4471ee708c25cf17bac1964f5e68caabb21d5412af840d86fda08bf267286c8f947c0ef7aa05a9e2f856ed4aee085070386b6744f0aae76d4b3ee6a7ae4f11e090d9cdf7f784d97e6f7b929477dd88e546057e59027f6443b898dcd6bafef49fafb7c1c06df1dcc1e12e2e9d2651c2370aafba49f28babad20e1d4963ddf03f82ffa7979afa9f944b4550035e7c3e3f070772ffc4b901804779ca45da6cb8d82adb25a01e220880e68d5df035b4dcdb304df07ae8048ef0574b507593a0d7ecd6344a88f0934267a60414f662c105c35edc85da1ecaa208ead0479910a922ae4fd6eb4a824b06540bb1e76f638717e673c0351f4157c6534831a7a2fffef3cae87a81c093fd9f3045cece34aadb630f16a5dea380447e6f5507ab27f4d5685ac13102bc7849f25e0b151f6d2a6bb74cb07bc372a321516fde2047179e4f191ee9ae029a029d86064b5fd60da33ce9679147bafa54727bfd0f982f05a9c6a044adb332e4a391d040eb9c8118c3b2dcb196d8080c10ad7cc0a5f34f783945431661357e6f24b1167b7929042380c1778e1d250505730a457e745ac59e2391ac5be20374de8bdeda003c2b4491049898fc1e8c7459fd5014e68f307a2538a12b0cc7b03be8d3a1b39c19cbf27436297ce9638cc234acee97cf302b8d3892e8cffdb46a66b4ad0ef4447357c7937b0a413f3b57164659ceef90adb04d4aeb462baefea355ef03043582f4a037696cd773743590621ba56df38c3968de2234af53d6510f983c6c5c9d7ca8f79d6a67785dbcea053017469330201", "00525351ac5300", 1, 82678955, 1537743641, "7cae3e3b3b26b3868b01447b130e46582d8d8a2526bac8fd862da57d028f364b"], - ["030000807082c403047bb9e34105780db8fd991a313a321d2a6090a05671e2133d05253324c18907f302000000056a5253ac51a08342d8131314b094fd8995794bc0ac981aff6fdd06fbb6c6905aeaaa3e336905454ba103000000055151530052ffffffffac83962584268d86f3670fb00de490aedc19c8781112e65b670f31a24e551a6000000000036a6a65fffffffff57abc6bec0c2542dd501e556035757adc1c46af08a51856720645e43fbaedc503000000009b96773b02cb5c23050000000002636a4f0dd002000000000965510053ac51acac53000000000b5862cd00", "526a51", 2, -1247463449, 1537743641, "8fe3fe0fd2126c2dd9909411633a6627649d405ef5c3d6778d02a5e927c33aca"], - ["030000807082c40302396660344b8a53a24e66ae2ff00298e764966d400a53804297d6e0ace894e16402000000006807f011990be69e80ad259788b4e72da96f86ac592f77535d12c2ab7c7e8ace024c55ab0200000003acac53cb8d8b230496047e01000000000253009c724a030000000005516500ac00d825310500000000035152536e4e25040000000001ac0000000001f903b702bdbfe4030000000000000000000000008627585892ef8964fccf008156472162eb1b35b8c1d971cb6a2b2f1cae2caca1d3398018f2bc7969b33adf9788f36edd8b8eba5e3b98476aab1560c5b4e86e1793e1bfd69c025687142fdb502a1946afe9282b8f327320a0e2f68267e3f08cb900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e310c88783ef6a6b7bcce470937e297ccf0f56ca1cb1bc8f5d2863aca7e162a450167fe4b42856e4a49727dbea5d2183509563d0d4152f9bb368ff3c878af55cd143b00059179024b9b4ab6d254884cb9f7b29e3bf12143f154f5c5add79ff5f8c9a4d29ed50dec9d3ea54c56a6cdfa5a0af20fb1369b806a9e01b45dc14cdec031583889ca1c4cfd21fadba9b13a18ad071bfd9a334979a55af0b991b9090a34c0219bf70798a0ad03941ce76d46090bbb098cde19caa6751ff05dc9e210c08bae10b057e01b63fd29f017a1da220553bd6cb822e85da53b90b96ed5e810e7a630ec8a311c80317d2343ebe65bc48f578e57194e2338d5852a15fa91bd275ca37d4700304e455c26ac3d7b58fe5a1db510c0f4a58fcc8744b3a119597accc2c350bd73103052a52eb78ca10bf46e9c9178cf5209288ba5fe29838ed21c6be023615fe1e1e02203f4fc38c7a6df02ae24564cf94432b651323a95c35585533b7df3f100b34af0216637ae01695f1e5e661cd31b77e3cd1603ad8d8d9c7672ef4bf9e3592344e76032313d87011453b712b8530b562753c7d1c1fb8388ff76668fd5235c8a09cdd2d7691d528f61062095e64ab2c48527e98cb85e280fbac593bb39e206f2e381b72f86e84ac05d6b208b656e94b0d2d2acb545acfb286c3c300b81814ee6869e41ea4d8e9605f6efc9323bc41c4c574a4ecdcb7b2819f6cf1f57d0c761686cf0eeccfdabaa439ea002c27bd7cd94cb49032a4bfc7608d14a3e8c45c46165203b29474caf5908ef0d6b0ac86c31385ee49ed580dc39bb4cfd591a316a3eb30a9069cfb111ba01e5303b575bf02be2d51b838818b67877ce113e2b364287156f2e2d8bb7a75b1270301cfba83010baf3c7ae46af3d4dc7d559240e8edca35c1e9d0a0d174c660ec369a296c7fc03c8f41c3a1e953301965b47e28d3a4445fc5d084fa9c7e1ec3077af2524dbf536dba45d8d296b7baa4cb9e01a31d0849c831747d8bbc40a565ad55b084a1ccd1578fe659ba9acca2e33cf521be4249a1b8231cc5888f7110dc201195f1d2d423afddf16f8ae00953e2b98198ce0005a5b050ec3b3b73c83178e855845694efb1fe86cdc0d73cbcdd614ac0e49e4b3a97d20b643b997a86efc80016c8ca3e10a9e18dd4849da83d86da6f464297f8d5a19de33ea5c7afe793493a9033736bff20b96e0a92b66646878b4edc43302218fcac08db1632fbb4e073f9e5fceabb9f7defce10956c3ef62d648a149ed8a301a88af9bd37f873965e5406271911cfcbda83c668d687fc3b5fa1a15b553346319a5aa89d732e88ee26dda407d5c0101620cdf9ee338b02cbb58a462dc0f9ceffc46724236b96f2085250be003dc69b96aee5b70cd8c17536f62fbe35f0007ad676bb08b2956748f9aebca1e5d375654e206192cadea6bb1e4351595851b78f13efc0af82c0cf8439720e102913b5ee3f733dbee53786747771134499aa3aa57379ef0fee4cb9a045ed9b27e798b79f4b519ac65fb52a90d094d1eafdf28d500425f9b3dd4bd759109db39b6621d611fcf1cbd70eacfa9d36b32cd151bf00497feaf13b2b896a87f7ffd0d22feeb00d3e57eed2468fcb7ef7df5b0ff42be196e0e99e0ea8e6514abcfbeedce3dbb44e338f2565a7c8b17ea1faa31c7d892ffca3ad227a8640d2807fe949550ba48433ba053ed3d17fdf511088bbb842e658baf0be7f255bf10baae544eb461aa76326bbf2b6e13a5e7180a7f07bd106f1def3732a877064af32998d12c5fc0ce6163b6cfd17a75ee680430db3242652fbb78ee10189dedd1a8ccbf9a0fb0fcf320b5793131744252ec0305aeae78f947178e0938cdf250eb7ec26c0492df8b591c160c42edff54e88f35776f71c2dd862241fabda4fe179adfc7d2b666b8aa52fa390060270cbe6651c1cdb7c0bc3c0f91610d9ae780f90ebaf55f993ad35f6a61a59094425bc22469edc6023938915b0b6d435e43c77f22a1d72f3f9126bad487781acd7817b9b067afe6c4f0a2f8a9c838e8e15f7ec386a298e2aaf276931538c4ac1cb8759b5ab6322e4378b729ece1313a2940d45b7b38721edc335b7cd356627121699984bb5d797550b1adf4fad06c8f5e312ee05ca2f1f503f01322c9296a54a2f4d2d01cfadaa31212dc7e4f224e9ab3617c18785ebb9eb1cf8e2263dff92d37e64b5b6f5100c969d334b04db554bd84c152e8bc8bba2a3ff5c97b24e0385cd0408d55f9680d7c75e4459d65c2b5323efcc7121ea8d1a057abe8f30a2302ebe9c81133bc91815a8000000000000000010342a0100000000b0809c5a09f7b4dc0150b1f0dd5958950929808463b2bf912afa887ec50609b17d076b5c64ad51632e109aa66392e8c2576db29bd95a24bd7efda10ec7d55c89c79e9f87e86244b1050676e884f8e5233f4ae67725e607e7a3cd8a9bd55f9fd500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bfe72bfcd4f2ba3cf4302ea5ec821c7cc2dc55a430c351579f41358383599651479718e6795eed9277f234fcfc9492ffe96cc9ad3ce2a50d1f28d3af3dde72c7422795dbbf5b3cf05acc15a2e9115e332b10eb7eec587327b62d0d6384b65760a27a2c7d885b5713d2ac75080a1645ac3b3ee928e68e8f2da994b5d00254590e020a9e586241c68397268e1cf9166290e5afcd5fa8342265e213aa040f07a1a654032d3b6b57950f94660d6f1cafa19076728eb847bd12726c8758ca82ce6eb9ddd10a06dd267060fa1c020c1430221d5caedcb6de24488f7faeccf89f1e06a3818b3648bd1a443cbe0411b98fc5f7d9ad1fbd99caab8e97e6338e8cb6f8d0582066f1031725e6b63aa60886c436d6c3466f1bdb97b434b5158bcc414875539dbc865806032e51db60b1da6fde98869bf5a1d39418ba86a9b4c90e28966a715de435a2216a031fd33a1a055eb618c6860ee5989e53e7367f9382ca66f59acf682964be9e50bd022e377ee0d3fe090526fa9ef9f4930aa6d65a7eb1dda3a8921b18f0f6853aba790215a81c62745e4b3dcf7ac5fd6e65f64247bd058914780207d81df5a3215dc9df18202bf7cf58692a61795eddee45d20c49991b49dc7d71fae67b1f21e8782595b2f783befe28eae8b98dbe5a0aefe0ad5e15e6aa1504b8eeb645ab7764cc38309f29909eaaacc7cdea1b72fb1c16de9cc293c82c222e03ddcd32bdfa10f81b5eef95a1160c4775f4c64c001a6d712a5ef46b20fd27e9f980f199d0e392673b879ee68fc741e035699dca69c8e0b00809d7c20d9b25243367456bbf79ee1d03975c8bfb5c2c9d5ca711b953cb89760cc65aeae01bf7a03f09fd285936ad145cf00b22ad151ef7c803d2a6414601fd1e45e68b50256be716f3a49f3eb4bfb57afda087794951993ed46dcb631006c3cb53bfd68f36a58ae6ed33bf25211a32cfdbc829520956003b695327d2866f30966dc2a5252658fa36b0984a60d3f9e050f0e698ea4415e0c0fbe6114ef18b97522d0dc9c64a585244ebc08a6c7b4a3ade5ac19abdde2d740b96c18ceb685f0c733f4dad56880dea8002b84207bfcff25f185f5371ffca3bd3f6d148613e15636cfe0d5d9db7a856e77ecd15823b07891f5d2d60809b83c549f29769977dd469553032212213a9a9e4160d61280ca466fbcf81bd73c42a5e0f2c7925ff731fa52775df51ca176f880f6b081e93854f0e1f86d8bdd012a9bb56408b2b4cd1c15a93a063bb7379a860d0297a1b4ec180157ac617aa3b8fd4a6d9bf10cfd9e9c0ddb6b7dcdbc561ad1d4f0e3b502976d5c4b0c1d15bcd3158fbf6f938b32a7873eccc5c2d1252f504c76963052073ef31f8b35e5f563751ccadc19140ca766adfd63f76ba16a08d6d31cb70d8787071ac61e4e4c525594f096443d3fe6736537e6ad980709c2f44b3f588a86572903097455a2a4f6c6f69e4e25d2df391535281ad2d13e8e2a602f48324a764e86fa3d856bad8a8dfa9bc105c0319f804dd400582179f3f92f007864c8ae8b51faae130b64f18276857429214c3c93553b9e1200cae153625fa41a9cb3c2f3b896a2b69f25b15dd67b5c4a129e483c0d2c1b37d462be7d15d1d3e6c5632ba1975feec48544b67bf96f6cc947da6db9a6373fa6e5807a23b2c93c6750b4a39ec3d449788c954a6905ad9f460676dee00f23845bc2d2f46376556a351d3418708255aa34f99d1a9ace43afae18cb2d55a66251cf8b5cc5dcaabe6f1e473eb7141068bc9b3c72d829b915b939335eb705f4819da973b7679237016e09a0ab819f535dd9e419e5b9cdc45b36eb29ed50efd46b4fd5b9e19b42d2f7854a6abc0efd1443cbfe8039ac9673689b9093ce97e7654cb2b56baa6d0622e67287ca8908c75c88aff8ddc13730fad236b23781d44f9458162c9747e4b921675073dceec6bad4b53c219dd07044c323d3bcaea49b5280daa5664a4851516a2345d10b9fa8e5f75aff5a03cdc2b83f2510c234daae0f387f39f6946db4a678fab24b86d69425185a7f0114c7501e73c1682082bb3eb5f547fadfc4a42c15f03617ba68dd50ae9701ec3e6d9c55fd16a2a832ef8bc5c9afb51e433ab58d71ff9e9ef14c86329d7dce8795e7168d06be8f6f98b2cf13e23b51d23717f1e261567afa1655e1bdf6f67e1bf2fa8a21ef87b993be075fd32a822d416bb809e9c1c8a67258313f2039ee4b66607bfdd72b5dfa6a463406d10321023727e643dd7062e3957899f6a86ee405e04cddf7db2ea26c5705fdca9b0faf820b107a2c5bd97475393bcb65c4dd20bd4fb41a6b72d307611ff33ef3585799c3f31c6ef635416cedff6d4b9efe0d6cb647164090129ec01a8cdc93d58434416b6d8f8dcc62017a75d5bccae846fd5889b053f04d5f9dcbcdc7ab531b7c85d4c046ebec239645701", "0052636a63655200ac", 0, 98649446, 0, "93a106a10cf71eaf27110e7a1ac5f4c2c0460aaee4dda26565744d35eaaaf490"], - ["cb8bd00a035a1c87e5b9db2e0bf1c7537e8dd1f702bf9cc56bf7fb4e8f6ad20fe12f6c3d5101000000076300ac52005251e6c878957aba03123807659e3bf6c0c13626be207b47556ed7cc4212d2743616c052f71e000000000452636aacffffffff167b067d58888c8bd1f74f9bbbd117672acffccaf4bacb7b6955870ac9c249c200000000085152515151006563ffffffff02ad090b0300000000002f244f01000000000000000000010000000000000000af867d000000000047aa9283820f74204bfc7cfb0a8c099d26b27e546f377c07f324c56a7bacdb1f58c8536678a70b43366ede7eddbf6847501a4f6aac8ab7b2c14aa93c4bdada94c08db45adf8163b14017fb830adca5ceeb3518979f86eb042f42114d16d2a79b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a201d73d4daa01441e531f7c140bdcc6877de4ab6d6206124bb53eea43af6ad64cc195e2997d138304e871b22c67812fd3100849c476ec51886962d068d7a50a3791e87991c138a88cc248b75a336c894711b842557f963394a5c449869ffeeb833021e661a57106441f18da06d4f512721a330395cc0905922802f9275ee139022e641aa60994dbaebd22ed683f5c77cad563459f71ac2befce5398a6864b49650220bbb466f6019f2a54d522af01f2a6c9dd342d4f400fa144a08bf44d39bfcabf0b001cc6f592a5a0edf0c21e804064e32b60fad84f5883a7b49b5134ac4c4cd86f44db44b49874616c9fa1d64482d8920a66e8f4ba921505256811befdace621310220a57d9fce8c748e9d35c2cdd5d1aea3c73afe8ece7595f0db64ecb63ebece8202049d4690ca83ee2038dd7b58e187c27a4e6856eb854cf841fe3c22cdc6a2c3750219ee640382f518c4bdf0ac5c500e8a4af1cecda167d2e3cfae127023772ac357030c33187f1c938010110ea5e0d303a74c9f2cd6834429b0703a463420e4b7ef33021c6c8c1e5c93e6f2271b49f2f56cb01bd49fdcd72765529228ea27249a70963e90b17ea4cd4e79e17bf85724a2890aaf87889246e7350a8393b202514a98014dbfb02546800c17b819b256ea88cb97b2ba707289b96c2dbf3870dc2df71b67fd627b4880d6356dcbb1c8efcb8030d2434fe3805d06cc88f4b0d6e4eb496f2b503625dea38860f8fdb216347c24f9ece57656812ee7c6fc2a3e4418e84e3fd2a7bd5cb307d69da54c8bd26340ca7ae4f7c2fadcad53707814e6c0d30128d31c7337361901477e888873270fde98174f339d0ceafc3a31d0b6d4d98321b6f3cb17c9bc7a12228f80cf5af3b0a185efdf5d5751a00ff03c816c033a6a87e597e8645cb2a91438e0ba1ba6221c3f2829149a422f6e7caa636d939f0854442c7b5a66325580df30906a330ecab7fe41d2fb7839931556fccbd1b431331228e6386ec86d7c5b6fe6d42e0d0985b840b453ace1be9f0fb2744752a03275dee580f9c11fb1bba6afc5ad3cf5c8328c8caf5a48db8180bc2100c6440d1b431863eaa525791675dc8dfe74d3cf522503c6f05765c6175323a11b94dd526b4958881bd3ddf612b07c92846a5159e79d81874de5ef7b29e6a2d64b54a6d2775b857b27b0fb90103af88e569dec9948808bd61fd97ca00e840b9a8f7dea467faf6c1a5c1810524f4975ebca58a568ee360deabf60375b1682475a8c5d61719357eb0d88d36e4a81e81031493684f33b0df7246be0011be2620e973450a11bed1ef4da2da44e75ae1079b1852008741f5f211ea954de20512561d2d917d1e84d5d194528dd3c0f4da8536b68b1a2d94a6abd01d4609be450fcb24572359c68c1189f939e7a6ecec0fcdcc716b624a6b02d89352487f3de750d159666d785905529c896a5b24daba1942467f45a3c1664d2217bcf2b9c7620aa3f1168c8c26a1c266e8e217ecd353c8dcbcd7d290f57c977e1a2c92ba5d69762730b60ca194ae052599646aec0fb2e9b81d456829820e96688f4e621d4972309a1fa9c476bd4fd22d4b14c7606caafa5aabefaad37a3168d1f1ffee719a158726aa9e09f5204b637150a47001e6594980d1dc05074e09aa0e3758119d4aa0588ae3b7cd2e297a45e523b8a9212c5576a6512237f3b7b8dcce20ce99ca0d8fbb5f2fafbab93247b83e9cc4a400769cfa36edc41fc5300117791eb560867c0b1383988f1d7f3a17b7d1c0a178e6222476b3be14bb242777d2b49d6a77b44ad53ecc6d66b7df2c48baa99a3a2671b9fd7180491122e1cdc3d90c25c89ebe9d6aeb96bc7cf122c8e715892592a229a26c20fb9c90bff0641a88893d082a0eadf0f459e6bc21d046c7e713f1bd930c750b7820a21af645d3869b9d49c6b63df53a0b49845d08aaa72535cb46e234dca0d6333d18fc655a85c33c42ac5a782ac652273a9f77c6e2df15d97b109d5400a7d67e89586658727e2d8bb6438255de02a5265e53ea5aa1cd0636de9c3b490b6d5f8977cbd6bb5e6ff01d1386b7f2f571ac22508d92478b0508f9e93938641e070ffa7c936f3e2dfcc085d5328312df88da2afe730e74f4d1049dbfde9cc5184b331ed587b9c8e32380aca42c039ee89bd01d6fb7bf12b3f6fd8d5634ac29239cfb2404bf70726010ab987007208e6fac480bb74b07fa8857574d21685c6c39bf6fbe48281704fab64b61929c98ea15a113ccf17398100795ab153a5862b2fbc245c5c82a277397a400bf296c1d56b76787507c83db2f0285248fe805f656415ddb2954c945017a1667fe77c4a12b081c168603dcc861e950ee9e90fd52749fde0ba413088cd362fbdc72867b2f56a2b0d5bd6ab9ef5d2b278eefb6c1129760f6e11d8b92cd2ab49daad63d1592a3631162901", "6a5153635165", 0, 1135424134, 1537743641, "d8a7177300d392909f51107b41f0a8eeb7bfdaa430c09e44dde8ab510d795776"], - ["030000807082c40302b077b6e2bd75aca3742e692be99cb58cb91f57c33e8c4e34c5aeabe9ff06e895010000000007342c4cf0666b92a952566f92729ce93075f7395d1dcf1d2984ccb41b7d4efc1c3544580000000003ac00acffffffff04935df50300000000026a65f23b8701000000000500ac635152f155ee05000000000253aca03eb90200000000016a7ca8a4850000000000", "63526a5263", 0, 1120705812, 0, "b2968f3a49fa805bf4d173b3da94827e65f9d17c51210b3e74db63c0bdae501c"], - ["9076695b01e2ed855a2030fa6d3aa1bde809835b34768842fa51d8366c7005ade788f08f4202000000075163526aacac52ffffffff027b355b030000000003516a6323c4f4000000000004ac52656a1ada72ec00", "6a51", 0, -1641546786, 1537743641, "0da184c88dbb1433cef4d3ec015a1f68f8681e53a513a5f06f85fdcb9f35a22f"], - ["030000807082c403033a59028d14289539e92b711a439eb4ee467ed8f386714f9dbff210d2debcdfd9020000000553516a51534e82c3365086df311738e0c5d12b3b3d0ba2d55b97924fc31540693a17b17947fec5297d0100000006ac63ac65535219d8e2434c5a1165dce204c5bebcebc344e521e0b9f439462aa4afa745dfec716f1b5d880300000003005200ffffffff02cf23200200000000036a5353249c2200000000000100d9e0b6c58dc3c03400", "65535252", 0, 916473882, 0, "aba65e7fae48f7e994f221e06e21d6a202b6148895e8a1839986508e078339df"], - ["030000807082c4030398dc90607afd9590aa8dfb9f6298aae03d457a4176efccf9973ca870600efb09030000000700525263526351d0f4b098ae6bf549edf0ac9164251f00909eb7b33a6a1422aa248f091f5f22507e2289ec0300000000bbafc886fbf5522ce0d206f98a147c11774b4e76cfc84fc5086df0c8b31f70944da8f33e020000000765acac51526a51ffffffff02ba9f880500000000046a51516ac8d9bf0500000000016300000000379ddb5c02ef999402000000000000000000000000582eb954719374b81e9f0481e84dfd50166d2788bcd877589264bc2678c44e306e2876dca0158305d1886b2338eda0bbb6a1d312a1863866d72cfacd606014a9382e0866eb0aa07c40f34a385c32322616299c04022828981668551c2ab43a7700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a70bcf775967fd35226fe9891862cf1f3ddda5aec043f886d680ac92818c4b1e5c3ce6e2df8b5737980e61b878ea5cc20a1fe72a36e8b34ed831e9fbeaffc9c97f03a8a00bc74d0aca576b3a1ec85568cab9ce40452c050675c9acfcf5683dee42c635c507e085cae2737e7735c637d105a83ca6be19e004b1499f32dcc15f100227c91880aed0c6ae6b82f6f04fbf66a760642d0f6ee7570a53e006647d7bcda40208559bbaae1d38d05976deb8242d41ba820549256057689287c96a5c39a79aa40a09163cdfda6cc5707813b3e055710c01911dc0387943b6b17e4fd070ed254fa52c0b1af3eb50ee4676f0637d65451b4524e0c60b9e1eea382f37cea026a7ad8c0208ad5dbaf1e93727ad13b2f90b1200b42dea6c6daa1c59c3d4d0b611752296fb020d1706d31f168cd7a0a0acd3a0ddc5b14bd81141a606a670e7fb948e1d233d980220f32bef0f1c40784a820898bf23f3f56fcdfdf5f22828da36e65f3a9047c12402212c46e907a98f9b0c9b2b319d24749cab2b3079b497052bc136a70bee832834022297b99f069e0113407cfa79ff4eb0f74dad4c9f3e6038c9101548a7c2e1b000cf0b3469eb6d3ebe6258641d7777cce9326ce44f13ee57c63dd689fe491153c23d00b7f4dc1f5d461878918e8c0413f20e987e6e296376f93401c8321875444372fde1694ab9c2f04f7e6f1b3920e2297647cb9ee36ec1429237ac0de031de47579aaea7f6afc7c4cc272f142f452673a91526aa734ba6f07c15d41ee210d2b1b7d93ecb07f358d5cba9f906dcb312ef25667efdf5280bc599b08f9c070c2fcc0ae93df57165ebfbc30969db165f009fc211ccb0b0076d3cceb77d53613209fc91388f017c74f727bf01fcd147a89f1e8621e5a8e72060df2669b0c90bacf43c4320f8f8c1abf50b7fbf48df8fcffc3e130ab24b7d25c8a70b74327c1414ab3fef4ba3258e2e093caac5bbd187e0273f293408ab863a1a2cd2f9a7338953d368cdaa7cf60edea60c69cfb203d5b80444cb3d8ed835d2888901fde77a03a9632c6494cf67781602788c269e7c2cfd304499e93f72899d281275e5e5432988b6c4edbc76918e59bf0afc902b95704c71330146a5ff0bb3c4a8ef9b45042d35f64b1a10e279946f2a0a86d21da7788ab5b7ee26f9eb02891f6cc137ef1387a5bc869dbffe7fab1b76636f9d5579cc7c56d8608fee4340d1db3a837692ed403fe4e6202aac1d015b1569dd0f0eab1393d589d677948c9c33e19a8c91c774475c90abc21d7b1bba5d9d18a946b6c25fb4f31af0fbe9fca50d1c9f63e8053347414290e8284a25ab355331a0530bf4444650f70c17f5948219d3bb193524963ecc0d37969e8e173c9b6cc1b65d6734146f28f950ce93d18eda5e75bf1336ebca569293f44787716d0bafe3975928656d300811e2a4f39b2b65899e62d510c6943b4b385c48ce4713624c7d6102b14192ac03307567d92b1aa3fb768abd2d5a47f5cfe2da51fffed73aff60f58f1f1271e7b95fa185c2ead4dcda3bebfa3c4791e569a2e968b8804e1ddb5d238f334a09125b345211aad9e8c7d9edbdee983c72275586368674cf3be7246584a3746c290eee66750e2a497518ff4ead070a54cf06008f1d336ea1db1fe37acfdb638dabf6e33cb26fc721712ef2489bea99108b842f1f22b33175b24bdf104b6bdc7d03c5475831f6c7f91d44c34d2c9a897647b42bed3582665276c746e1ae7821da188d5c3125049b6c487ee47ee3dc34ffea3c9729d672c99a99074e2204d1fe3ca0adbe79be285a7d71693e01df6752aa69fe635b4eaf3cd1cefa0504e4e669ec4a8ba522690eb300a250203c89c0ed375853d65ec15e5202728daa4eb861d57845a7a68564065bb8e067b4081565d604b5f00018b1ddd16cacbeea930795a2bf3a7b1de98a0643255c58122aca5100a5bef768d9b7122380210795324efe2d3faee9cc55d8ef08953bfd140ee0a51de7ff61eca97713024bca9782a6f95fe71c790dd4ddbaff3dbca79b014867a2a7c68c28749fe6dae64a2d0501f2b17019f6dfcd8c5b831475a6bb9422ef92ec29189c4c6f1c91a4d1bd11bbedf339c4253edbf379d9345c470ed1e005519286e7d6232ce8bfe1383263d52be62b0a8f4609f3d9925a48663ae0ab0e72a4978eaa881f48a990f5b9209953868e83565a5721800c041378b48fee58efccd5b7179dbeafa0625caca56dfeac6ddff011c2b18b3e72b33b98539d8f2c8ac7aa19d92c3209a794446ac0289b8c72d13047580a4613566a192b190000000000000000dfb3c20100000000065216406bf37537632af809b7301b875904e0c030a2a1e299773b20eba6cf4cadea936b6e225f4250d8e068dfb78cd1bf41072a6dd0b4d95b178b754db1ae77c1554c734066ce1757c6f3c1aa7570584655d15d0fccc4980825157add3993cb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082b8632874349101908edc228850bf0ee687cb1f8e75862613c891275e901f8417047cbbea4241a3550558f658e7b4f21b2eb6f148a782e484c7656111626e188ea17f68881a8d4e663bfa7f56a2f7e6ae84eb5d2272da56e264cf22b66ed8decc08bf7bdf02237ee2d7d70cb2c81dce309d33edf66340bdc8afaf5366e63904032c9807cda4f61e681b79afbc23d2f0c235c412c2c8c33d7abd24a599efd2c603020625a4c9b4707b3cec94599a1b2bf11cce9ad34396782659b341ddedf0e99eab0a09252851871dc03fa8fe1fca59b11a8fc463a9a9ce5b23687e0ac976fbda601843eaba901942c04160934d2db74d06af703a731cb2235a32068e49d5827434a302074918cb171d6355cf10625aa0c761c575e153799973f073a0f39cbda200cdb4031aae50f5542287dbdf17dd3c2825d054bed85be43c2e22a8ea035711d7347c3f02151af6c8cb1e8d1f1edee4f8a466b015852b2f2b0e97a95b9e609ad58ec9fe00022cc7c9083d802726408052629fd52124229ef09d243db4dd3ec8ed2bb4499955022a1f7fa16b9fb3081519bb665a64bfacbae81b110b4cccf0ee8c4f9ffc1d4f8b2e046afb30bc0c10abbf6fb7ea75a2ede663cf927d920d7cf1039504136d555662bfa6c2126f4ffdabda385eef96a4a29a7112fbc52ffdc3406412180f442cb6e77b2afe552e92581d21ecc9ba06c19458cea02e72f080706faa95a2c05c881ffcfc5ab57f06ea73e59dbff811a846d800c6f75fa6c72702473b47b73f03dcb9d8ab9486df6b15b35001d32345bc0e61d37a0499b02b62bfe395211a679e640eb8423e641e1f7487d691144c2359c94e58b9f152879aaf24ddb579a4e89dd8bd539f450232eed7fb2f3f6d6dbf1304b8a4683e5b54150d34726126de9958d1e20c5e0d231b34fff99ff3b3cdc204750201c7dda00e987469835e48bd05de2aa340600f1af24252799e7344eeb710482a6e3aeff452b8ec8df06cd9cdc05d11cdde89c49577deab3cd4b8fc3ff8a3faf97ba767d0a59ab683f182e260b7336dbcb166b6953f8f1ea60c797ab0b5d30616bed30e83f348c7bfacae8ef54f47f76b31f8714d983a3f25f60c653a5e6bfbd619729bb285870049c2d8153f1690e98323f009b880eb8808a2afe6ee9c2635995fd9928dfa12f8d2cb1e99bfa846b5afea7dcd5af8fc0cbd1956afe3217198ff14af2667ea82db7a184d0ec477c8c792d710796d8ed58028ad537c7d661c6e57d48dff8154200a52873c16ade8d72127e0122ea72ccb6fec5307e9328dc416c235c82d54fc7034aec745f34690564cf39058b3a94cdf7775cde683a0d8952e48335ffd49bd00317c77746fe7597689a5de838546239253b96b9a977655c843090e89b862c8b2392f6a47da114e59da2cdbbf3ed066e9adeb88e2c2225632096e8121d0f00dd7a64c5641e3fca477ef3984c77b9ac4722b052747024acd816de27de344d37358c1993177e37bd88d6055a7278598ca799ecde94c06886880989063ffe2d27e9ae0e00a79b9a4d7ab5f42c25914e41af5d79067cfef65fa70857f53182d868b59f8907cfa8ecb64e9bac5aa8f36e17134dd87ff554c79573b0e60a5eb85802b2629f8a57589c8383d75227c690668b0c1ab2113870cc63d14f2a612547100d1b986b2feddd7ecdbdf19a7f66a22d537a79b97ab0284f73a07b23a88abbcb071b8a9055aab794eec11f618b4ab66d43ebaac5a57b63650c6375a19a649900803c2f0a69861812118f226647c690e8e1db2a9535b2a44f25574aa406361113df157b7cae2a7ec07fca48bd203a224be9e87aabddc3916fabe7d1e4a522911bd7ee18f4cd1d7bb901abf83dbd05bd37ab075baf652bce8febd53d5c0a66a2335e2dafeb0ca54c9c7bb35dd0c6d682d050ed792670bf3eb9e7f92b6007cbf55ccc8f56a3101b37a191e4bf59a7dcc95a44b2159ac66b85dbb665af72eb158a613dd825e32c11405d25fcefc7592fff3e8d265883b5565d7a37daaa31bac4010b3282e432f0801d0957a23a4adfe37adfdd3b7bd2421ff3eec31996082b27c5083717391da12ffb449d034544d49eddd108bf3abd697fc96ee231e5ada7a209a635bc7c1f894d63ff398b7f053b73b7e138b8866a8a5c8945ea5a8dc5f18297f0641f321644a1410da85392dfe595695b09f7ecd7e1b71fd2681c346d9b27a098b77389fe8b25224a4670918e48aea5fb046bd4fe26ca6050d7b1c71cbe01a275af7a142a495a72eea6fd2bc6a51d7ddc9e0b276126454409ece8286781d002208ef9d4cfbeb01b21cec793719ad8f6817b4688c55e75b98158dd909e57366741f82b0090bafc9528b5f2072e1763b82a74b42bbc343237dc9a90c52f8a6da3ee952c47c012f563884ad9dc1eb2325b147c9d5aae104104a2addd02ad7d707", "52ac656a63635253", 0, -1151236311, 0, "4df0c07dea78b180bba7e230eccb5b3bd2e54d3c9bb3c4da4b5fa5d75948600e"], - ["19d5a43604c3356094d7d2c508f87bf547c1c6df1b0bd2abb1097295d10c97ce4cb7f6982200000000050052656553ffffffffa200b76901f31a3baa3b4f382a2b9b7fff5ccc3a26f305f86b6c217f3a2d8ec9030000000652ac0052ac63ffffffff3837220008176b28258e8273ca4d85eb03b5b91f8698a179541e1ad0a9ff712d00000000045152536388f603d93bd16af6ca9ec9a76951bb0a8a28f2841b3b3155558e4eff003b63479e54ebc10100000006ac516563526325aa830b019a6c260500000000040052536a50b331a10100000000000000003b7af002000000005d4684c34085ae8cd919cbd28384c849fdf2508533ea41f407603b8a28fbed674286fc624cb4012520912e0979fdffc040186ac350b41107c2153df60a6d921793ba73b1ba688be1e3b447cf03b7458a40b2ca6b5a8cd9ec31197bc78b903840000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001687e6805c2e57766f48682298ae62c0f01af86679ecfb5c84597212afa8050c5cff40a7a30a18c2c726241021708aa845ea1fe8935a3f092d558eaf62229120e7cca7e4e90f072d2383e776711093ad5dc8661f7bf7a22e0e98da37d5c3595e14ed3daab414c785b6e4d50484ea2005665fde17acaa49b0b6505f3a9e58bb3b0311a6745afbfe3aa8cb21381bae24d185e01097a7a9f8dbaec442ec26871f505a03048b81a2d8cf6d85c5523cb999ee397535816efef15fd7b124a70d37661ca9890b065f649ab61ea1510c01e5fd65a56fbb92a7a1412d53def2f089fb74eeeb3309c67caa106763a58835be62bdf1a49f851def442358a031d37972e755b3d07ab30215ef99f17331505370b61ec85ccc54b2733758d7ff03e2faf5bcf49a56115456022e02cfc2d22e9a0e76151c9e51a2f96e016dafd4420b3439a620d0ecb121023703304043ca049f0ad84d060ca1f5f555a230a19233f281089cc2550bef89d4fe860307155a7bee71467d8aac30860d0a0e0780d0c6f1c2ca7be7b6418bf0560da85c021c62277329bc30fee252a1a155a58d635d48c596a25efbcf39557c7ee102d19bd487ea349a141cffb12ebcb39817af70e6ddd19e593f36b41521f266b669ef5e5ae93798632ac9812b13b84607f3e90e15168b51005b2d1bad3abd88a2737caeccbb92da2beb51b34531249e37156008ccb258a7bdc9ef0515fe4635ad390020d37803827c130300a05fc7fb9e895f1d7c65fcfd4921a44478421b1930698aec517b729afdfa42540cbb1408767261d33391cec65cc7ac26afdcc7a5c130a72a4be5fb6e9061d3688f1084d1c8803e1e52918d14450f486b69ff4c56649fd3962b713792f4b492f371fc9cd21c52ec11c540f78fb883db09297ea1755727899e21d2d424710e50b419ae864625379de72adec437d420726abd4c92efb14fea3ec629bbcf2c30ecb4df42e26968f479176960951bb2cf0cc0325935dbc7c41ad5b827d4bb8cee5739aee347a0e53010c80a3e5312a0c6fb3a6940fbf93fc1aaf52526aeb533d25d6c04e3581ab99b0350efd3409a390e3ef1b5d278d325d1c14a33557b2da71b34fa57f78ddecc2790f43bc1104cc7e7b0c61e4d06e31f7395c2ab4365b79b07c30c8de0f29a3c71e2ede754c80e8c3dfeb7d3951b62ea8cb3f3ed0dfc145bcaaf69255676b3f9dac8937a3f3fe4aae273609895755866849315472ee79923916982f146e4d03e7fe54f8772757d9182827c0f03cb06356815f510f8fd27ef22d346145097ba29f9051ac987eea8eccb2991182e256fdc4fcbbf94a1d19e17f5740df98f5a628fbd1b1e2313b693017565fcf4942aaa143b9419ebb05171876060fa45105088fc9f0cce760e25f4d2adf90c19f09e7a546eeb1b399b85c2cbdf644ddc5e44035e7427dd57327cff6808354d4c647aa4c8ebedf3444508ee6bd9dc7ab51fba9da6739d2e9d462a933508d078054fb52f125acf172a6e0dde24bff927ae257afdf1c6153b2d38ccdaf97bb15850b611960730d8f0b00ced3251732947e140fbf941b2a69b2a9f82cd55730dfe1801a8076c4de88d03ce7087b46cfbbc2820ab2eecc99baa7d63a82007af8ebda3a47a7c69f373e2c823646a6a0d4fb2852f0f269cab939dcead6e676284a0fa99077b09ec624e09b9d464a407f5c0d1f92276c339ed64183b7ea052a7fc84cbefcd3b6f55aef85092a98998ef2c8486e1e6ea5d1642f0c1ff8948378394c3676ace4b4259c32b321ecef4c0ea4be8d6e38b1cd07c00f16ca81055b216803330d0fa6f26d5c774b91e55a9a59bc3f5f0252375e886bfb322c43ee7fd910b82f3862f774e78821c81461e261f51cbd7e2b10d5b0b3de3990c70aa92b602cd376623ffd2d5c29290ceec743c1c301eca16c59f1d259d734d879a32b1210a142acd5d88b38eacf1912d928ea3874fdfdb7d866445ce41686a2fbf139a425e14a5b603f2722d19a4d9d072ebe4bf2e97e7d573bae491f799d296811e9ece9278362f79cd61d53a5b8cd6ea6b88d108057d1f542d8124b6c9dec7343c9b6dfcf0efef18ffde17c06615f5e0487c68f5b0b09f2626e37b79e235e29de93c08102221d8e0327c8038692814b2e6d6202dbc51f5cfa17e9f30e68574f8f5d9960cb396eeafe3796d2c4172c7de90688453fd3ccf580c136c6f5d9939b1069449694d5c0f842cd23235bd653e4916947e55a0cfe610f802ce287e8bd9ad40235ebc13af21fccfa4d79adef642bef9993d095bebe100b565b1abf23d04b24a8164ebd2554504a0ebeda86baa1b675af3a85d83db119bd0db3a635bb5cffe28e13404749871e520427ec009c5d626baf6cd3317f2baf7ac4176372669d8dbe07ddf20ebb1522e220ea49fa5808b58ce2ac2d1e86af0e62959e0c5d1dd247e01", "51650051005200", 1, -2026969542, 0, "a08fae7788583c206450a4f8191c2cfef23e82fad2447d23ec93dddd071d9e32"], - ["21efbf4c04b805f163553173661d6ae43f52c29d023986df930c7acef81fbb9f5e110f51b1030000000151ffffffff33aff821cbf6bd797d8617653a69057318b13039ff9c816908544accf05008080000000005ac6a636a63ffffffffce78088a24cbc19c608b98f79e4dbbca76831613a7b6d9eea83b55efab29d6900100000005ac5363acac639814126322830bf677181a70c206631dab7e35eed9cda97088f35c9c70c1c81758c53701000000030063acba76f97e0364c301000000000005ac6363515316a0d301000000000953acac6a636aac53ac2541ca01000000000265650000000000", "006a5200655265", 0, 165614049, 1537743641, "5c558b391fc1e485cc09ec3aeb505f6a4fc6a0e3d245eedf3c913d4dd68a6eac"], - ["f4cf0c1c03a69a54aed47cde3b4181862f940e504db208c54977dbd941ec6976d1a83cc51f020000000165ffffffff35dcefd3e70566137e6ea9dcaf1487ed107f4eaa6b939a612b2b966568456dc8020000000251acdebca51e1de507c0dafca960a171f9371728e77e0a88553de83b9dbf8f922037adc9c84601000000055252006352ffffffff016af4bb0400000000066a6300ac52652721db7600", "6aac", 0, 714966917, 1537743641, "5d98c2fb7fdcca166536a424e25f734bd8d6280b090c9bfbd3aed96fe02c843b"], - ["030000807082c403031c39a065f82d9f79d252460f22b7d76873ce944a494ef306b52e28fc1a92b63d0300000005525363536a2ee42b59de0ada6d221216da70d30d41cdd4c44dd626531afa3dc7af3a7ad6bd921f5c090100000008526352526aac6a6affffffffae254e5bcecbda707899f9445140d8441397cd91d488efa04e298ea4fd901ae90300000003525352a069354e03376a0a010000000000a88c91010000000001000bc02402000000000500ac526353000000000000000003000000000000000040482b0000000000745415b8176f0ea4de3eac22318b314bb4c8ba7a974e29eb2539c0316897417f283e4629af2b489bfaa8fe10b28cab4a0f475c914d19044c156909ff0430b924430f9d1d0a2133b1dee9c0ee62ef03ff81f7b22d0dabd889c27130f0888e4670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c45868c228daf3c59e56630008477fb58f5414d2d4a250880f438e404e00011eaa08ea426e1e21648858c4236fd7219cb02f600da88c71e313cda65ad70a666e3d2abc45ab99d046422f290b6f85352cb0abae1b946b5bc0a7493f31f62f31730349c4d8aca52329af353d40e1087bcdf17fea610c2ac3f9379785ca71c150b0328c255cfd9cf88c64f3586424f43d935c023fc5d70bf12311562ba54781eedcf0204697da82e53dc55a94ef7b6178d0fd474eda2e70792c8f49e501db969693e020b0797c799a3a512e6e3148fa01d1b06e95abf30a1a7f3a2f10b54cd6b2d66cb2baa9df544088ea0f6d2fe43bc91eb9ec6762259ea6a02a86420afcbc48ce65a1b02041ed6ed248d011b58a0aa168145df8e1f64a9c662394773e25eb1482a1f3209032cb6fcc80631a4ae1125b003861e20a7e8994dc9bd4a54ace7cf6a35c656bfdc021036b14baa44be22572248fb9c6210d2d6d4af061992b9eff5aef98f07d2fa030315d8f9728d0e8889da66bde78bc695d9faa659d122d4e17990cd2ec2410c56ce020ff392985f0c0b24851d371274d3e1c78b10953aaef24eea80a83f07ec98f07c07aa424581986d5fb050f879693ea5bbaf4c11f064eac105a3c94d1a55561f95f2c8045309a5b8a9653de8037b5f9dbf3eafa68020d7aca22fb3f318fac86d831ec96baf840e1364665042454c72e310b683f26596965af7cfe74d01356d725b9be1d80f02f5e00afde31a3e91e60c30ef7a46024bc17564b0c974141e7e78bae6587a95c859120f6f0eb4e1ac55fb86852b17881c3298821c43dce998ea37da70dd0bfae4771fdbc3726279931b1a2c891871f9e5119fd3899d23a0969fc2373efbc2059f40c0108c8c98558a90e6b31bc7b9b79b357d10d591b3f58e1e9366f3c2cd84d3d80dece7764368fba4306addd3db794c3e7135fbf40e8345c61631ffb1b9d010b89d92404c1df03ca4c542e3d213cec487bada8c08df507880895e63bbbec76ea01295bc37302427af20951c623623fa375b3ceca0fe0570bc2fb4bd9c9469d8d6a1781c52a41f3b2a9d4321ba494b38b6fd5db93bd2916972e55e944874a646099b85277a38818582777b03caa3eca0b23deadc68c5ce0f1050b0e8d4bbfc84b78744f60d8d9d9719a28a7c768847434bf9adf606b0c3e12e3625b3c275c2996769b1a93d45fa3c13f014a662f17fb7b5ce42f5e5f5ec94a3c6a894184fce9bec229f43b4fb9951ecb76c0cfa5061ace9789056bd8dd5220ba03686e516b635aac1f168f382d2ceffa6e4ff3ee90a32053a0d40e2424c9b2b6cf2dfa5482ff86495bacbaf3257f0ed3469ac51245318547cf647d4bf2fbed6074e4db02e5422d51f4442a73e55d8eebbd148aa6a7afed18184180db9489d8cc4fbe90bd22feb6bad66ae925a08eacc4842c2c92a84af7cd798eabe9b14b6b9458d37062ec853192277846761cd9316812f53059157295be0db32eef414b2ff7e056630ad8c0f006cb962a4f9164aaf7f3daa6b61f20f3c6e4427cd248953dbd2affe502594eb7f50f63a944a0e39bce3c30c77806925fcec1e97343ab17a0024eedd9fbc60b80229dfefc748f47adc131807ea40a9249adbadb280fed5a6b1531dfb4a9ee067c6f22886e8c95af1ded2c89604b5bfcbf54e36560a37356e1dfbe403b2c7b05fe833542f9ec72f5f67b6d94e9965e359bc425ccc6d7c982ea922263085f9e3aa4b756912105b356fabc56a47bf2e5b7b94d31f183d4e62880753aa4ed75b9b076257b38e4e26d1cbaedb2619fd56d023707f01f78b543059e1b111d5b9f7a39440c30790036fe1d84abb5bb46230538d255fce291627615f630484312721641e395efa07f28bef254a64390029d07332d50ffcc1bc5f715f50cb6bcc36fc4f10e992fb851d3f3bbe6c8a5d9f14d7e07adad453553b2d2203e741a31f0ba3bbbd2e962b297031021c41e2bc2d8975dfdc3754e870d89dea2b695cb85201ca62ea160385bdfbf1f136589d746b55dd9a3d81d4c1e312abc5f4dfdc61b7f62f1432ed07de4a71f84f96d275e1466f84b569e2b6f839b33a2e15de20aa216a3b6d4e38d0aae8550f0157e32930ead68c12b7148a59f089ecb8cf55edaa81a7a42db9c8113a40386b1a678365e34446f4576b68cda7f13606343bc952c306b85dfcfbecaad3f405831415b924232c1b75214540e266414d361731bb54fa72e9e0d93c184180f99a91f58e7ddfa7aea6bce981658edf6d836a627d4da18f261918c67bb1db4823e53d792448b71055cd00000000000000005861cf0400000000120e4bb378a7484f028878cb236bfee1cf5b1b04e9385ace79dbc1918de31071609600adcef68830af123c058d2ae959aba7909a34a6c150967e6b3d495d5e2a6be0fd55cab5b604b11e77ce9790eb5f17ab8375902534a55818396ec37e7d1f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e97a1e9371f549e36743af9691dac42958c80c7a147a3e565bc5cdaf9e3265e540c7d9211cb9a99330603d93659d697ba58ee7ebe7a8dfefa666dac2094f1b699e094752e0440541ae7cd0ab9461b33620a3c3f80aa29a89bdbf2dec950d9806916a1088098ce998113d9e4dd21a0d1cc46f80633857c71b98c7d27556defa4030810bb4f6b2e5c20f7aafef980a669a7f990a695216558ce275ab3eda72f0649022f64cca7d373c3dae02ec0c1299252c101d004471ba32d200cce8c9292d1a9c40a07457d6204385e95468e6df133afe4d02605ba5d01e1f0f81e7768bc660382897f848e0eedb3e846ee29dea2e3d4e33724e2db14d92a35ce8d7093a9fd754464032759041d2d88dc3b882661d154e93ad9f0f1f469987ede6dd0dd8bef4a21a81e032c6d4af31c421f0d569fa2d8768eb33b9400f1c0b32d43df96c92f9a00913293020c651f91fcbbd698510a7655e0c98b11ac530cd422368c9151e285183c5499d4031f6e52f9d305db47917753ae849ea823db3edb09cae09d53d5849a65410b7445022447aebca2fea56c9bfc258abaca650085d339bdbad5327be75c9f15cf298fea587951c837c772d1bf9b2c6f2e6e23e90aec9a5b2d741895cc92e8371ef03ecb2706d50d376b077d17ce34b731ffd0ec1283b50544157c1fd671135d0122aa6806a4bb3daf7401305aa2aae6368734589f5f2b92d21a5ed610726c177b108a424aa6984f68c4edd222808cc0af4da7033323f49d444fa02eb231456bbb5dea1080e560d060286cbd8e47522347f31b42739cbd376e760d235bc708e9fbb83b8d424ea6b4596970241c18a7ea9498c7bff9c6749d5106ce70798f3931c7f5f1a923a3480341bd70f6759857f63fbc68c544a69cc512b5bbbefbaf63bc92d932a731c924d1c1d7eddc98c05fb88bb62ef1b86f962fce0c07329486338e99d671d55e1794b2cc782c5e9ebf5b624a183cf9b97df373cfc851ac778c1c50b35517364599183e37efb61814837ba4dcb48315513682b45f5a58325ce2f944b13ce4f8de5a892b9dd02c54dc55ebc0460ecea499364219b0ae2181906137168e6c56879c1768570964010c5702427026dda1eff90196926cef703b9a2753f54220f6e8284db8ac1d2e6f913b05cea50abb78ac8803044c55c897242811aebd6b4f921992ad58a5f1a0a7caebd1b6559aae5e2c48c8370d06d92754cc519b1ff9896ed5a51d67a98cb69f8943dd38c76b64b3ba64a26b98d1486f2164cb25d22eecbdc34829edaf49a860eb716a23c79b98525381af3c278d7aa46d0974bcba2fff5ce9c1fab0a637100750656f95f49d9f46effa478ef9a9bc3d44e0d90ba800e1f8085bf617a4225816cc309221cba6b0eef76c037348ba19c78c54c8c368e07520e34a4d41288029e7e346e625c5e0a23409671fc9afc5a93b92fc784541a681131f729ea5d17559a98090aa19106147fe78febe8c5a337bb718785e3c4a299b0ebc8a72fba068ed8cd7d9f3605600ef493efec78df22b9bbc4fa8c23b9089c33868e5edd500c9b24096cff08a2a2c838d338653ff431955b505c87cb642bc1dbd2fc73b44d923132a3d35f5761864e10a42cd9529d8250bfe2a0f095ab30341ae9db849cc12047a757e7826a00b2d91663b42aece52a3afe4b0924d5f46d5e54953d28578c4fc2fd35b9d89b79a912142f09a79e1eb499f9d6d09bb040e7a0e4f59f3c8cd7e211f485dbb99a23956fd56fccb88f55b29de4946f775dcdaa244f09d37a15199cad2ae5318dfd1a0d75671ff75ed31aac4ada717be9a2eea3b3d30a79ccfe3fd8c41a3a9623aa998dbb87f002c566db61d582ff3acc0c8311cbcc5660db6f47d7c5ee0b3516d5bab483c2386172a34bff83903699d495c543bc1d72bb03f4368696f3f10c8c0fcb6d54372936167c85c9509b4a9e94d7a6f2201f318694e0841c5ee4219d95b6423bd2093af09d104a097b82c0f758c3c8481561a7d9999ce6292042910f7a881da5b5240ac2d715b3c1a6caaf605342d08a739b9faed45b7328fefa231f515e57c114d5d352bdf7b365f9196460d7878741539c7813c08399f1eb014c392566f87314cb321d6992ef5e0b88fa4aae6c6a09dd43053ec78dd83eeb006402ecf8196303fc78a761b866868d7fa0f36930bb22f49616c6e1952c2ab603e41e2081f61f01b8ceede36439a55e57f2d121841826f1dcfdbe862d8caf8e75bd0d86397f7e971dbcc3f6d887e28b54329d0652c166a4b708af79f2bf94d1c3f711078d786bd573b43c8190000000000000000469b050300000000c9c0af7db7568f2f22e9e3cb877b31c82e4b6a4b143dd7241018a425a0b7ae9420a444fa0d8c33216be70c49cad85b624bc18e4d7babd8fee686335a3dea52e4c8b6dc992e7a367f856343e1065f944128ab3dce322f0aee5abddf1e7f655bef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000528cdcb71df7a9499a611318865306e7f5c0f2c456bc261b33bb94b5e5f01dabd5ed98e6abf20eb6114ef42244d546d048bca1dbbb24984c645920dcc44690d78fe4d778d2db826580d6ca2ff808e5bb7aadeb2299b172993e6f6091cf16a34c65e188b40f8adad133517b092534c7c547660880fcc1fe91c69fff2a9f8e46150311cda32dfcc7f023d68d0ce84806f9b858e3c174f224bb20d86d6156188ee5f9031abf90591c5bceef21e0a08b4c35ef06d11fd9c7d69fd921fd856d65b1a5a0290b051fe83a3527d53bd5b8fd5232d10d7161e530b9970bc8d0063f6708bd678c57cc22a4d11cdc99a3ddf70307d824032a65234ae5dc7323064df89b4927cdc50b022b4f5d4ed1cf3ff29b887a121f57867dd0dbcecc801ac678d2d26eca6d530c7e021c32ba966788bd7e638fc7c877edef8458815b4548083e08a2fd0cb81382ba08022ac241887bdf976899e6bb1c13376255bad4123bd64b2461fb7a835f1745a451031bb5ea1bc295d16d518f7d73fb60661f0945b681257885808b3d07ee00eff5020311b294e3613ce5a3a1adb0664f1afa5d71a919d0937862d15fe4625c9ea5c91364c68738b860d8632ba707ce9e49a6d0ada3c13df91a86d10809b037268fa0852d87adfaac04de71a5822d2f8550074e2d0e740e88213b0e2cd5478280a22a696123aefa8f6faffb228a47907c8f4a6b5c94e936e31793046d66b2599426d2d3a80d6b423d6ac184368e04e7e67de92dd0b37938aed620cf06d710a55246240b5bd2ef81120253fc63bfa253df4d1a5e7ef8f956114b0db92e789d68e65bd8cfddb99d3604e2622fd5d858faa77929638cf0aa66df039db3f5b573f2c9a73ba90f5325ae5d0a81ff0a29a1f850e2e2e9c1b2fdfc21e5f9e926c7705f474a7dbfe14f75a88203cfdcd307bcecb3d5bd112cb4a699844255daf15c5838895c8314da9ab2a1ee6a6f09b532d269c0cc5ef63c4a64d7d0ad3594ddb8b4969bd599bb69e44b20c092a2de51a14b1c69ba431d632045b533fea2a0611decee3d200b807340ef737b6bc98c19dca4f16214f231319abe39fca62d77f85448f3e1bc505915bdb882d06b2ef0448d3a4273e04935581dbf8f81736e3a0acc75da718284b21d96d32eb13403f5cf91298dcb1c9e54f4e87d8d1227d1b1cd4f08dfc92a99dc27ee0aa56e52740600293ff2e959e231c54fac6e92b2f8f93a467d16e6a652c27651bdda38a8af318551069087c3f4ffefd8a9dfd20f704c91943fb2c0b02d2d265a677b93d1618828bc83984f1bc2d73a58a767d3806a0944f579c3c1f027f99e386968d51e5a915ab277004c2f9a193d58a28c4f5c24728270a71340626eb4b27b85342b8c10eca0612c419f338b2273081a2f0b233f32cec415561cfb38bd86d8ffaf1b49ce27d3af0260d8aa4d465820677d06dc2fe52321fb3bd1f4cba31f9e00139e1c50d04c70d27cfff1d48e30f7a55d6aa919415de2b5a3a4be19db9b4dfafaa4b6e53a513fc57f6dafb87eba8dbae2a6fae970466a9b014dde555fc94b754dcf5b3b3c09ae877bd798731dbc848a53c350aae1e06583876bfdcdb2d6d10681c8fc07ee7ae1b04895ee180d870d39ff8c2b402da1bc81f59cd13472b4cc8c8965d10c50aa44c8b47c6da34a46f99042589d50fc1364908eb751ef56cad3d9b3d6e66c14c04ff9be767f65e3b4c7ed57c47fc156f0a19d00dda585e046b89fe8ce3638d28aaf7579282232f9d87320dabc635bb46df2744e1f5660e17b5759a56547d99931034761a9c2a0e33f3abe3d9ac5105a7f4ea2adbade7342dcad068cbe34e10e750ddaab6767d2767220b3b8a0115cfb3e5eeedf8ed00e73425f7bde059a3f6e4be6133ab9aac447a64920e6aa33daa660e86532aba480ad3e141a57d8bc7d912acd5125843373d76fbe3b3a2b4493a9a438451bb10c403e0a41d8c5e178653f602a4160dcdc7296fc6fe7a8c170474c3534ee836ae2eec978e6d883e8ce2b381aefeaa0385dbb1578caa70b2d05e62fda18596c5f26fff576025ba9c7c81e1977804e623daeb386a9f8df236b428e0a7c1f0b9225b5c20815aaa5594d93170390f2b3dfc6d33713dfcd1a58d5235202aa36754036163e440fb48b9e133572c9aa516253cbd2de8e41396abf712f00ec7f34bdc00a97aa266a26bd5a0fff35bf698eebf6013c337737ea346879a9d37edfb78d09d55f6ad78c31746f69445810a541494482d301b012ec2aa805b03313c123bad3b518508d8a028bb5c2078fc6608259bb3a7c69a85e3dd2bde48b3589520f97878a26a88bf0b64c510360e55b120934a8629cfeb76d2992d837841cf179099081ed62039f2c0b84ee73a66cee62eb075897995eea8aef0c58d68b7cc1408876497819d5e27bd3e049ce5bb35ce8abadc2d1f25f4ffe0b", "6a", 2, -1360698652, 1537743641, "718fcc233915e24ee46611b34d2e3f29cc38f22e00d514cd7eee42936290d944"], - ["db58f459026aacb8917bb887c68217d4ff6ee5b86656778be2c8b83da2a2210ecfacec8f730200000009acac00656365536a6affffffffbcdac9da76358369f4be8e64ed0cab5063146afcc06aac25517c8a35cb289e750200000000ffffffff039d5dd002000000000363ac535d7ca50000000000025163eae561050000000002ac510000000001af623b020000000000000000000000006069a138d01a9456099d13af8be102fc049370da949aaf8920986142e064b9a3fa66d8615c53804eb3ea0b79028830137f1b109ae3b8118b781410b4eeaee54bb3b2c4e819c09335c7f2b499434f92872552b113a9fef4f4b1af4697b50f0ab0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fef11192651bfb40d25ded007e7268840e5b813bb9c20546df49b7202a995bd4c9aeb554c6fa27acc4e98ddd9a8c2c51f4995369a32761b2ddfdda6aec44061a5275473bf573c0936aed712ec7ff0c78c95af7cfc15aaeacb0058656cc6da3cbe088464d4f6253741a9591960db9effcace101f5279872abd4182667a2bfa5d032ec00e5327498557d34e3875461aba2a3f7c4fa8d693d3774d74ecdfebad3c600314d618176a7ce5a7fb5c7f62c958d56adba393f01ddeafca84144add5076a7380b075f8d925fe47c006be6441eb07401ec69af072d2b18c884776bdfdaa873e99c184513396e88160e28e40402c4ea048272c2706409fd7d0bee8272091d76652403108a241a568796f767fb65d798d4429f079d5b116943b25b827f5f980b8b2c5c03058512a85f413274ccd66b3471d169a356d94651a7ee29e120eb45441e19a045032780d986ba6d63aaf1d3829f79f11135cee59d6984e9b26940dd44826cafc597032ae5729730a2280c6280b37f914fe8454d09952f74bf3673682717f19a98bbb703155b6482ce05a285c0d30e370cf720b4b7cc4c3f04990a6c23022827d30ed088a96fd7a5a32e3ae9a7b466b6ebd4a3d09e08d300d7aaa4ece4ca16bbc10d24a404ca5c2a8a80acdfb2a21f16d1c68cc2cc29a2ecb1744f9f6faf19976d9d9117aef8253e8d3776d9af5c07cab5308ea4093b45b2c6cbf1ab26b3a39124eb0651fa84e83104cf55015e6458e634fd1fa670c71e85958d978be62926cbbcfa4d4dc3fa65164db25ab565e13353f4a0dbe79a8b34a5c4f30d0c5b4ecbccec389081ee1dce2a1d3789f95a199303e45dbf0669a1cc94f896b2fded6de1af2709afcef622bb3f5c5710d0dfdacfb7508ba9fc5dba530bbcb2add4c1fe1ec0ccd0f01a6a53a21edde55fe20f67693197d43928038f7232eb43be3a8d294089d0ad56e38a3034c90e764ad9c029050f136e19831ef9f69ece19b114f41e1b0d8f97dc8c7d2ee7db130c717fd7f68dc5bafa9e1e42fb90b0b84a356fe4013e0d2a77e0b309424f1a4f64f41e7c16008031b70fd6594d9bee527222c4ea15058e0e126910d42739aadfa8bd526e62c52634e6be787e324dc7e9b0c7775f675bcf4a49f42be4bec8e76b5f5cf57e0fbe9cde19bae3442871217032efaa91b0bcc99eb4a813dd8af5109468b1003530b74bc6de9033f1cd0e792492a263ccca901196a6b1164f0124c75cdc2e3b65cf5ca20ed8442a7c642d94d279ff61814c1d8a4f5348b68f3ed112d75a442cbb14d9969a7d8e29d0dd9c2365229f0cc6366b84f0cd44818ef431686dd58bb8ed04e06284c4c195781790d2adf3e6173dad311d96549e57517e97b7b51f7954b0bb2715b1ae2214adfc7ae13a8a8ae05794ab59969d2ae325b21a3d49b86d454e6bd6609efb23d0b9185fdf31e7d13ed517c28dc0e7ac970fd25af7bef4b0705505981e451aa05b1aeaa81989e5058e19a6d72cc80534a754edc649daa4209b9551acbad3b4674a159babe45e41e3a5fdb10b4be9f83591fda3f4f4854b4b791675feb65ae272949d4c2cc8b379f605dbd9a1f1773d8788898e0f08d8e89ad70e7e300315ca82991ae378c51292a9758b388a78a42f85f88b3ff1a2323bbd80eeac634ac71ca21e990e7202c8e3f40261bfbe9da5627dae3fa45fd90521578858685b4368523389d7a95ebb4a6a8bafc206ab400afd88b8fb6c84b384f7f6670317a56c3532ceb684c3c5dba06d86c21bceb1644dabb5d35dd0b7f0674b43ace9fbac06b8c83c62c6c9b52d851e9c0e51221285cef2190c777b5c7be0d6cffe1d4ecbf84e748da24754c57b663b86375899d33a8cf57bb43b2b384997201d80c26fe9d582c7bc53459edaafa792fa2d5a6fba4505f6c7bdd807146127bc47f618498abd6dbea1d10439e384c8547dbd7fed1f8ba6bc4f6c79597a6103bc46a605c19b0dd9b69d1caef45408bd9225a8e5580fcc2cfb2bea58f5ee55c0b94ac6a90fe3dbed329930f0e93737855fe21796b0e4903b09e5b6a38df97ff28a259c9ef90f96408eda0bb41558a33e7d18d2a5f6d02a519880e623b70ddd05d87c6a289319990b703157c05cc7c6d60f094f8a8fc8da61a96353b4a84241e5c786ff22e9bf86ab735dd39810330b101500ba460c74ac70feb00657a2a10981a033e4da37dcde7f67cd47f7d8fa22b9cb2e220a1f31ead4cd3ee785db4b2a55da5080e3970589a7eec5c7f6caabcbc51b51ff1317fc2d2df605df418ee61db404cfdf55eb5b82a9e39fc5065695c796bb1f27aacf810f1aff71bc3624117b75234c8c5ae53b74c56cdf4005fde253ac667e92bf327b4a7a063b50e4e5aa172dad92efa706aad28aab9aa96d7ca73acd933f73ebc248fa8f49ade018bf76f916343c8c71276fee8a7b518ee205", "00535353", 1, 1180462196, 1537743641, "4ce258e1f86cfd8d5d24ef5d2ecd6ad27a08ce23544d3b0693682cc0e979f2ea"], - ["030000807082c403014a341b6cbc743add97c2dc52c12548522c611477fd8c91e91bc6ed156e968228000000000151f10a7df701b315de00000000000151000000000000000000", "65006353ac6aac", 0, 1871640883, 0, "f9615541a1f37aeb854f5b2236644f120ca662482d8809a7f28ded368da5e720"], - ["8dbc7f69043e42c6b700e0f893d13d44bd81067cd61d94f32330a9b4ac0bcbed057b1fb1bc0200000006006352526a52ffffffffb1fca26b26e8c56b984eb45d68538603fcd93e260731ba2b0065e8944d3f652d000000000952ac656352ac6565ac6fabb6a609aff31ddd0d0bab9e9eabd3f5a835112092ef6aca41e6e96a97fe607123095b010000000152ffffffff39507feaf49bc7a715e8cbf9875a81c5f937f5f0fbc0e53f301137d6bd59eaea000000000851006552520052005f229cb103203738000000000003635251d652810000000000016569ba81020000000005000065ac630000000001a771c2050000000000000000000000003bdf24b986b74ef36e3d2b5e2689a4f2d39d542a8cc742160f4ac72cc3d4f81cabbd601f2ca82fe1cf47d8a035636a3c760039254ebd8d9b7ba606dbe3bcce48ed609332fbccdeb03a7dee38e7cc0799645268b097883346d464288a9289e54c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b8b30aee844125b1b44ee4c70e78dfaab25026cd37dfdee51c8a424fce6179914d6e2dec352b8c09d70723fdc1c6099b73d83cec38210e5b1e473bb2a1091bbd088f9f5863827e41ec846fac2afb5a0647e19e3999c176c9011d2ce6cfec0ffdf046fae25236eaa3dc56c172bfb2d71e71e45801e45d30d5a9cc9dcf03015fd0318da575d18be12b7087a89bb53c8ae95ce1d7cac9e91c9ddb4eba3a3ae88db29023027daf0c3600e55f65440658afa9c77e3fbd90bc2f9dc2a654ecb2d9b507e010a05fdc003610fa3ec03e8d51977f3dec561236e3166c7704f37b96541011fa704c6f6076a7186152b740f0eb9138f9a7851a045ee5d1d2f0acd0e892bdba6e5cc021c025f3226d9a2bcc8cb6102dc90601daf37db8787d7df9ec2766a599c367cb8030c85b3f73f17ae313fcbdf68865c18cb4f65c160b0c0c352ec11035d7a7437e70215cfaf700fa1f6182c10953716a9660e67068e1548a0297b2104bd09a54245d5021939a3b5f9b810192ac721096c2d7bf38071e69fb178bab33814d6a62fec43dc0307d8d048a01b77834e39c1f0f521306cc71b8657f0138c450d7dd9cb8bd7b7e6d88f07449564fa5f8caaa1e279872156d25fbc66024dc1db63b2577dd295c437f261246dd4694b1e2e523df8ed16dc5bcc824ec1841a816ca4293f640e57450672ba4c480eb35234eb5fb1148b6333b7c6117f0eb4c45ff355a1045013f0c91afac69d51e524de29951d79734e9040b08d69e63733c0126be692fc10b403bcc2a4804dc9062e982ada5a98bd6b4e5322dbe498d92ef1e8a55ef8baf43ddb392aae90e860bd6b6030baff9f070715ef58bc5ba0df1686c9eb1efee517c34dc0e7dc8b375405e4486899efd9319615b427b564de7d3556f3c58b9519371e0c53d15de233cf5b5e0b5341c6f4415ef883d16972e742ed8a3d1670317a77cbcbc2fcec73ba8db62682acd85d5c4a689caa1cb0925448973b8c88163b70bb0eeb292e60a4edc94b572a3df933412701981082d8cccd011e3b05feaa8a37e06c75e19c4f73a77363e7f712d5c28539a9d0c689d5ff01f2b2922989161d68981dc33aefff4085c9d680c116eb1208f1ee75bd6227daaa15233e79355e04f4da3fca843b0a2e8592b8aef56ac8e54df6b1c3a473a743424c0ac2db9cb62860db6f014d4aa7e3c7000fda07a6a1395636a42d770f2124d39bb86b151400182994e0dbf240bf7c50b66e4853797e2c90362d5950c13ff159d3181f24a61b1df991dfb90272203a78d5722a8536bb6f04567277c94c0f187c084702b8ed71e89c959f1a7753ecbf8000fe3a8a3c24524193f804030024400ca052760de968d6d549a2686286134a871ccce182d90158c7d7d357234468698e45d4be63f50cc7497f194c134540c545067037a34689aa8d95d6b9464801f37b239335b5a68b723aee05988c1c1775c1fc04c3a63ed79d07824b8772683f80fc479c56216f1220366a7fad7a4105c539b231923ee113dac5f2c52a0a5028fbbfefe655098f54799745432ace114a298607529efb68552009acea1cee235b5770b20487c62a07f9d5376e08d1dad8303d33cc83480784ba8aa343ca743d1acb9438f8a4b17008610dc328778d64eade15f73cad233e369b141d0b57bee5d35afeb0917fd3286271db31c120e1da42ca36ea895256d7c838246c4c9f6e4088a0cb63293870545a8109348d366cead2a9bbd6438e75eb9051c7e11fdac741aaccb0ad7d35eec7178a5a6f4b6ce963ac2d48b7582f4790340453fa4db68255ef22dff1a5159c80622ee71277be5a13e7c288b8b91c289f21863d5cb1ad0cee9fa209fdc22dc3b33c53decce50f46098c6e51d14ff623fca63d221ca2ee65f26a463c794c763d3f4eb6286415d6a034d5e754da25c1ab63cfbb67c346661d562b14fd0c28aec3fe76362d9ca9dab738b4cc679f1cb36fdc4fcd4f84cc4652160ef4bf7b371b4e35e1829bdddd12335fd459371018a6c3debf5b28ac95624734943a5593f40df5e9fdac140eeedeb4940b0607df694e9d85495c7ab993ec64cfbb74bb46424de1ee4d6d181c51212ed6128230620b3cf8612279294a4b18f14b2b629842b24739b1ff7bb87da35f7b90b6a9ff428599e4f9454794ab40f076505f0a57e91ab5cd82c1919400fd06b2812df6d5e1201f6af188917d84a82f13ed7de000df8617ca7591960f2daa19370dfeaadd5ef32ebfaeb87e43e5261f822bf07f899d5366f690d5ee4a9f9746ddd0bc470f0c50f2a3b20374e19b7e9077d69fcd31366c50b2b427e27bf022090d5c160db6ced4aefa928b85c079326d10a89112f29f2414e4946a5d12306863990dc50fefc59f25a32153bc29b765cdffbb7abcdc8308dc6149cfc61ec5ed74fb99c6b8aa5e894c8ce343ec176739b23d82d80a", "ac535165", 1, 14531930, 1537743641, "44b5787c78085ac8d6bf24fc1bc3b041dc89af0e280313602b702a67e73b2796"], - ["86e73f6b0156e549c6241f86a62e6e467954277f1d3c14c7330cb1781687d39bf5c38f6869000000000165a0a36e5104d67c85050000000003526a520e9c3d0000000000016504e493020000000004ac6a6a526d224b020000000001009bd8278a030000000000000000c4673e0000000000255a56901b34d9b706d187e169608b190218b82435b9b5d80b050e00f7836b738ef291af1efaa23cdf92914f701e07e13e39d4d823cbce9f9f57b4c23529bc1ac40fcc9a4e11a89e750ba1751889ad6e129b79236e3a47f6aa60d96c6290cc0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000445e6ba015eb5038f6220d0a5e525f55f8a2e6ef6f830a405b6066fc1ec662d092b655f9d05f165a251043347577b6bab5ffa87d8cd36ae2b93e5abf7dd008c02f88d0e6e259d0d8afde17ae3c382ca577bee89a34fd4beebc860e25996fe7de4225b12d5a77e6d3b0532da93db754ea4bc26686e3e25ebce6c43e6da32ee22b0327c6f9d90ea22ed944642186ff57e3dd50b922906e99068a1a8834754529f9550306f1801abf3177d6e6175752e054f302bde0cfe59967f53524fdb6ca444533060b04bc117bb040af16c63b959fc294c26acafb14e11454191b115f6d6a40487a0a234fd0f3e4c6050fd621d30f9124d0226340817a766b4812dbf290b361f368600325311296162d3f797539ce796d1014eda71272140b65f256066e43b08755c86902086d489634e59b9ad830d569b74a1d071fbc0aa227884e5d5e043491e210a76c031054300e29d0ea436a53fba5c22eafc5d4305cb38b193c46edd5c4c94d2a9a06031d0b8930049017ff40c378155dc526e7953d18c4ce7b56894b68f292017c4158031e1205113668d41570dbed24bcdeef60acfda59e5cc6a2762401d01860ed928dd5a281d87916d78eb046878eb2837f85182a8716320781ebfffe487e3ad2a01c3ea72ec8d82c30030dded9a143cc34845c47a79cf24cfff17f7996f9e50171dac28bda4e714da92168782d138215806b098fa237e15d748d80b3ae73f3bd3711753eecc13417192131254b7bcbb1507f7e792987e9335d36ff65714c403cd37edd259787fb69cd4e8d7b9fe960e1b748abe1d01680baae38e9664f83ad891bb39c14745744d3ad2f50e7deb9afccc0a8a9442d2af5788571f5ea7114b88a3855f5b8ca6fcb04e09c1018ded6c01b7afd5710f6c847bd9fd5700c5de5009d1da4eeb5e693d88038599268e5e4976b6041d6806abb414a47886b90d76d756219c74795963ed6baa9cc57126f93ea928b9d4bbf210b946b9260d73a059828e7e8b3fbcabeaf515749d702049176bbba95f0f7f120888243243f183d210ad79b6cdaa92a5c17e38186c21495842f766d39a2089ddc40d221beddb82e7e07df419c746602893e27d340d17e2c602f6bdca71b53cc955b6a32345b60597de0a39c95623fffa0e06d534cf81d4d91e3f61bd7804ed85dfc930e6603e1456363969809bb0110b1a77b03e5fb0a6b5d2512abb760f66571c5f5e0fb8b7f1475dda23d7741fc385a5797a5016331b8eddea002deffa89644e762f8185873769911e4e5a145884d21bffd953d5015e716a53a59b928412047b21b609dc7a9eb68c6d586ac1f3ec97063d951b47a87bfd4e030338f8e996ba4c87836ee9e8871297d8939cc3e41281107715b6a4e0931ba9a66be9dd542e7fe0201b14cb2f3c05e2ba36e31fc464a75cebb4b4152e08658c2330687bd0e17e6ad45a312d4dfee0f4d87c7d1cdd57fe415c935b939af2f6f4e6e4d3d287bca8f1e1fa56a858155583b1d4d167ec28490bab0e6abc764c76e5b11f9a59f94b68f5dae9e8180b172e20ab1017c93979dbe7cce7fc32b16911a30ac5a99334aada29074cd00fb524d85616d374eb1a458b56e07eb1b6909cd863f890b17c92b930534348a94c7959cf434c4d3d83c26ca42c1d44e275fcaca420af7714b016721134d10bc5905115e2a61363fab95db2d7fd394f000ac95168db0fd6e07a9f429e25b100e5e0c0a16ced35b35ca9e20834b6b3da9f53c7c185b95e7b4bf813458f62be461b9124b67e172e45378b8d2d882e75b66c94bfe4ae383ab571ecfdb9bbdd41c13f1fbc5a5137cba2cfedd86289295f7afd7948b4ce616a80ea4c4c6c2e305237475c1e52a1d0f9fdac11d056078646c732d20ea2a02575e50133fd6e74f90bd2dde543321c6c9196959e4014515f1d7347e546dc2d56d82040c3accc67b512d18e55b54a1fadfb612947a886bd6ab68ada895b5f5c42e35459c2348143bde8f752fdf320f5f5bc701988d8e77b766eb647552af5a6e73dbda03d03fbb8c0622624df0bb568746e1d3ddaa7b58733faf5ddbd02d3ce5d9ec3f2d9120ee06500fd3d6de176bc47607a8d5a556a12bb6a8b1e77f6361f7ed7da1a88945d29b96789b331a5cfcb1f4840b20983d9cfa3c8219bfc909a86c3d1e38d38221421b7ab92e2d8207bca853872cdd4f9d6dc632c7879ab15d7cedbcfd995d6a65bdbc38594fe6ebe27160626689ca2ac7887a299a1c8fbdc8dc317415d3ad25c9288042daaac16e2d415750b1e89d3afec47192800717d22ce68a4fdf709e47ee80000000000000000048f258010000000091c6d48b3e6facae67836fb3f8eb9dd8561bf8705e51c6a51d3839ed75d56e4b6ded42557d1737bf5d40683978baccb406e5b550fa4cd1aa7657bfa6c74a34f3ddb4156f822f63f8b942bd8e4392c78d9497612ee426924ce991831789cd6acd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f655d7cd0ff000252c3ebbd4810377e2f68d8c17b399ccda3f5d4082c318b2f4471b73b5e01f565eef2976f38e28e08d132fe1fae0fe9982ac1aa168d13ec301071a86cdc1879a8ad9012f889edd5426eaf953e9f4ca7240ee07c27ab5975566151276675c578a8441656e29cde2001889d36b12b58fa93a46fcee78cf01d7c50220a0a73c4fdfa5c9c4183876691fdc04d7227eb3d1e85ac88b474a5763ddabad02048e604a0aafa0a757675e908216feb040bd2f92cd15a43c93289b089658137d0a080c606959dfdbf7639b0f1cee43e7eda68f0bdc70c2e9dc4d187204b7673e320d5a680d4da2c8690ded637e810358da6779dc57ad76f31ae4384345ba5dd911021689a2ea980e482f6005aefa8aed5c05a262a9e210e558bed6b12738633e0c3a031821aeb683233d5741a311282c4f8218dec539e3d97e1edd003941cbd5277c64020a42653ed695b9030c2a8132e01d6bc5eddc2ce40d305939797fdb4664f38d26021da31e0e77d9eccbcc34ba6abc808808ce3a850cdc3537207b70a5b42c4752050315bc83a68bf5694ac30c4af8bddbe962052c549447d048497e57085b362a25b7e24f69945ae0b36c750d497432bddbe66722c07b3dd633832f4da3ce066f05ec71bd36df48b440c1b78e47d5047c39a844626f7c15faf483164658ac177401ba36661f2e519f4c65f0a773061489df665d9c2fe7ebcabe343ee046dab3340a50521ffa9137773295db4faab0de40aa2e1f2b5b5476a528fcd227232a950c56813ec05d1144190678597c91ebbd8b00900605d99b83472717e523ae4a2385175e67e561e0b41ee70949b255172c255ee13769c3c840cd85229410b6f8af111a8a6fabeb308d3a2c1e82ad65835938b6a1da32a6d0c3cdbb5aae4721780edbd844191a98411f0a907fcb3cf850b171cb4dfd78c9bd75caa44ea7d442b66319347e3603e58081158d500f8e12794a644acdfa035e85fc8607de5440c3d8154202dcbf9718ecec169c322970eb89b98ce5d480761cf50f713d1d5b0e32d2eaacc2f0355deaa94b955b4db01265f5897e8326d6449e591d9dc01b7316cf88a44d09d9b2ca945b4d0da3844e67f27287f77a01fc64013552b05ba357d6c12bd317ecee478beed7c14d6dd6a94f93b66d9fe1d846e9bfb7a7137cdd30f06a86e7b57c45ce873e2e97a3da3c4f95dda48290bfff0c1ed1eefb88d36c42c96b2e49b3a3595fb48e96810e8f18ed20ce5cec636177c34b85a097d6e6ea2f2786a095d82d2b430eb7ded292537d4df9232657ee5942bf819e00f23f1a50c6e8f16a9f15b3daafae1a06be92b6d8b7b87ab3416aff15bece20e1712318eadcd741bf94989b4efceb2e38093dd7fff4ab89e127e811b30ffe6fd3fbf0f91fe695fd35198bf49ae66fc386cfa38eea5761d6fa87dd2d19089a6b2124ef80e46ff659f784add94e333bef91881d5d548510b27fff5b3a5000302a53f98f4c5da49e3288c8e9c8221914ddf0a976a93ac5e0854876854802dbdde3b0801223077cbe1c6942036b05bdc7f38f7ee7a5eb3a5b4cdd5521dad2fea2f8547839b31d43a7947fae27146422d8adaad87c81f8031ff8465ec070c472864adccc443bd30f55ab88ef65101267c8e187c8ead408663172a37dfd06378b8a44370c3fba9ed572aeb799687c4b200bc23289f2b2634b2a27a8c1342ff793e8cb262448f7a130a7d41512d05eaaf7eb0312722fe6061e80f89d3b81bd58fce6dc6439c110b4c900a8596033cdf8cb844bee349fd308c566d6a0ce382a4d06ef93c9ee7d641e696070cdc433a2bc5b8c008da13a70f67c684dc96cdb23646ac8c02709b2465924956c29a7ea80ea5f21af992866bc003d33562d428e5cf7dfc1607732bb0ba18710d2ebab0693b85d8d3fdaefc1927e3a8cbb886dbbef2ae3eae4552d820eb6e1725571ddc76adc93a2c4385239d4d8ddd2e416330762417b8f62f6550d93b0a4a905d55db83968057aacd555469a5249368d858b2b475da98206862061c4df5a1b47951e23a9930aa75769fe7de2047c817a9eaa7962d6e809f5b21ddebb347c07f8143542a9c9b8b71b7cd0a99a0db48f5906bc2bc6e0bad63785b107e9685e366c11f0ba66100293ce22197c8078ad2322a8a1df0d5408dba41713f4b2a6fc59db12bd73dcc0f0528ef3aa56738e3714dab221d8c4a1adf98cdc4c447989ae5f96fa96e02b2d6a74cffa838787eaf38b6a80b89f6194cde7a6926acab00e6efacb0635a0946012eaf8df63b4f62e8b98f5841c0e46fcd59c452cec020000000000000000000000009c291dd814c9bafd47e0f5d0a1721a075f4d65f068e9bcba794a5d33d8ca3a8a959e56b573dc80f81398c26b61c821c26f6ee14cf6bc292a136b690f08eab7c6072e9e2f3e2318f465a99d2f19894ef6c98ed9f71b4953064dc0ae303d5646f2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b9d0a111855a8fc0ab64e087c0ac8addeae48553263adf6741072d092b034c50e652f68a58fa8c354b9e953af69025e78301eadcccc5677e60c126331674fdd855224e98db0fcba95f4823cd9ab74b706f8619ec29021c1fc2a653840b0ae3c1ec80315f9dff5dd23e1748669c81abb007cb0931d2ac0edd0d4e4609850b65e022783dba0658c3e9459a10539ec9a6143efa9773992d7c883847182476ccc8d73031a0fc04c593524565df66c1a9fe17d925ff05244954405681bfdba2008cf83ee0b04eb70b808249459c67946c582056c487b16ac97a81a9148a24371e1880b1414b1e472ec4424bf4d6f2476864fdc64705c6237384a5e1b712b3527303a6628fd022475205f5940f94a1fe3149c156f8b1e618b4408fa803fe6a63a0302ac8f3277031307800255769e83f57a30669c38eccff33a64ef1d505ea93134a748a0d9881d03065d08f45a378cf2a0cf6adcdd6c0f5839e416dc4f1cbda62aca1c48677a89490322f7680b919fa71a82b9d9fdca5ea37d94be0c4484c8c34860d0a7c9cac41e8902140bd180c230908d0c3152acdf3c4273ed1f0fd7be7137064883cdf5a1ebe1f18542417ef36794c271a36fbdd59a4c983d21007cf72839dc7c5754c2a1ad350646004000d312e37f831c3d9971562e3391d65d02be9501f5ac44da037f360eb04c0f6c9c00077760a99694baedc9cdfb2a2704bffe5db6f268f4d480238bd492c687e2e38ef98e07b3708fbbc10d104d64cd30aa13a1327779e23626afeba2bdaa34a1b344bd7d407b324b20bf2a2fc46b61c83e5fffef9532bac6686c1a6a9d8e4c9f936560769cecf5d0e181078b4c9aac044514c9089bf72ba8222ee44fc5373f210078f0da589eb255cd27d70c83f7fe30eecdd46d74d7bc9c4639dfc71fa277ea566939999edb7fc176db211fb1bb0607ae209dcc53607e9e644016d733a04c8ba87ebe41dad435d56feecaab298d189616ca7d1731c200715965b3f3a0f902d852c749e9a7e18f904ef98308e87b27691d7702386a95959e20da82299d5bdb24f718d1f8854f04878f631558e9041aba1575f8f638d1707b548385132c359fd3413d4a31ba5347a19e589e52d642b8b46f50ec9e5781bc43fd3b34cb0589ec2ca8fa355d740f592c378ec5f074efd8ad8cf5243bde8a6257dd690a3ec89a82ae97cfdb90966c36dc7098778718fac765283619ea7b7bad636b3a5507a3c78a745d598b89b89339273bfd29f7cadaedf4eeb6ad87909fb95d73154eb8892a8ea6528906931a5a6a785b92f6f27126396f065e287233950d1b689bc30c3ccb57c09556f8ba6882a7ff9b88d6a3ccf8494eecf18350afb915a61e0192338b6ec0576ab152d502e2ad76cbc2315bfb0c19adbd7266c12fd8e0aee74689a74c7eabfbf0893d18e891732a1cd1eeff5caf139283c54c5bff4e4f5eb3e3757f29095468cdb557d29951b5d78238a82651c061bcd1f8b6fb140bc5644e3dd412de6c9b2395ac21a906c4072f7aa86b590a2df43609cc77fd43a503b98d3d15082fcf05cfede762a8bc0e937de5670febe72939187659c0e96a4754947be84a024b755b1b88fb872d9c52eaed94454b465363dc6d26dd8c0f759cd1014b5d08bee8473bc122e8d7f6b45d038cb8655b0ff856843311fc021e19fcc143c806013b2d021c31608fa9909f6621fa7af4972d86e4d158d8776ddd14f3c8e1c5255cbaf6753b8331bbc9dafe51c9dd2083f665b71dfbee635714e6fc077451f9726fc792bfd71b715bf99b8a2bb8a9a36721dcf90aaf6206cfa68de6d6f7423a9a0c07e0bcbfd332640d3a5e6458afecc453df1378bfbb4b3ac63d04f2e9359a54a0329115a9431db65c4bf42d878770869265d3178e7a3326e91390f3c45830abb6f3925d6815f81573a54bb6d668f892589a2f1d25e540196214c5eca21198c6d6148720f1daeed265d16fe7908d079c55aa586d32685d2fae795e8b1a79e5dce982289430b55636de26d568ca1abcb2ca4bf535a2d9d60695a03204ebebbd8ba07577f223636b42d667fad35ae481f04b55c33117912d0f09b76284c2e3faecd07dab739674300bb0a0e3ed2b4c0216f45c8afd0b4e0d8ec164e0ad62dc02bba0cceede46303065fd687d1005f105ead4d6a09e2a6655f83e413ff63a950f403adb479d330b81916e8b21ecfdbe578ce8ea6b944de51137e7eaac8020120ad10f4c6e46ed2f005b533ea51a82ea23d6e84d56cb779c495c3e86964bd290ee497c0f4c9cc0134fe67e1eb4d80c4e91638add0de82aef3413d154c9c2f010c4896d899917d824f968b0a12c017e54b8bc91a6c35cf3cf4335c6b1c53bdcfde0a9ce36b3f172c82112b157e5623935fefe87e4c663b315144ecf295cad7d811aab71828a3d961827df07b1d9ad0803c83ec701d25e07", "63", 0, -395268715, 0, "9451e0d9cf52b2b7f6a4af4f6ae4f53aad33e1d80cbdf78ed443dbfcab7d1848"], - ["4c92130803ef596011a24e2668153c103269fb82c7e358e0aa0bb69411f1dd7ba06c47affa000000000351636a5de3dd12e347e802e99fb0ae96a46efb09c32f26fe516445170c43342b59e63f43e90d2203000000056aac516aacffffffffd112ac6ff9cc0164a8e3139c4154561a2a5c3bf27a60874e04edb9602efaef4a0300000008005151ac51516563ffffffff03566f6601000000000963ac6551006a6a6a5243ab22030000000001ac558f2200000000000600635152536300000000018a8064040000000000000000000000006ff52023457ded66dc9e3e3ced202c2879dac1325dad00ecdee91654d7a0ab6bb2ec0fe5dbe8dc9805d9b3b8b5bb2bcb3d1246491d78c25a03cd6ef763f5175b7a698956b4a8e447fa97c1c21f5d873ec22ff9110d3864ce0fd2464836552b30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f014d0f7e8d7302902f108e1591c3d3857bb97d1ee2bb1b8274e10b5a52017f8f02fc3c9c14d03e399d021067758ef12a7e96fd4420e2880bfaf13dd3d8827a736d983f4143eb72c5fd0bb9d5e8deb4ff5242d7922e763514eebc23d01f2ec0736a0c1d74c04d92b7a95adf8b514df3a4ae7376c49e0214a9fe8da7aac2a82d03047e2acadce766421601791613547d437de659873ec59137b7459325e81b7c44031248d6ec7c4650c913db15025d0d1d5e82041410d0b75c3f110e560de30f699f0b0419d1a23f7915c2cf46acf4d06daf69a7ca6528fced114a41e8024462584a7f793bdde3890993efe3b7cbcf24e38e104c6a1fc88a632c9784e4546d80f372ed02218fdd3f9433c71689b9dd36736e2c0fe8c776089594c6af6f4f7267fccc82fb031fb9a7aa3d0b3050ccb57eeb50a56c046d9e83a2136dd6fb821b9301473787a00314eef406e0a5c01d93e1afccabd33aa7edaece929d300ac9c7e3f9b6efe535ff030a079b26b90d7f6e58e570b9e97805b1c1d3560bc4078f41343d5381808bb4f9021a2b608bab563026b588aa021a0157888137edc1b84a497e4b620c6b118ec176b96ed6b7325220736d5f5f2b22fa8a12903f4b21e5437e92686ee08dc7e7b0fcff7db81720f6afa40889e796a67fb99759ea8ead6aa3feaf3fde2a578381cba0518442bcb9832ff3ace9c1b03f188b4443101f8b93d3ce395aab502848afe4d84a9d286b2a6f0d5c5140d697b55c5de9622323aadd517212de07fdbf6e3f0654f0367cea07e6d3826f52ea8e2c5a54fcee92dbdca83510f109e6e5246b42e87353dc991e978cddeb733b64430d387397c251d81f88760803c0012043cff9fa3f6ad1c512c382cfc79b3394dad3436d55b8efa3bddfc25d2ff6593946ac4a2c00b2feafd5a0576f90c1b2b3d2628808b53018e6e6206431f73e9416d895a0ab58d39cfe8943421334c5843bd36dfcfd73dad30c11eeb739c664a998b4b48e9e8d4bcbc0e5eb0ed8be9517f4ab0510cd6ff254ecb4bdf7d34b36aec83d7a115d51413c428bf35c3a7af20673df48243b80b265c7f041ab41b565ef203cfb060ba310a5d0f378f7f4f37a132c91a51f6ef3fc0e0f6a75d2fc78f4882cd744c2a3c3e5fdcf82a2cf113d29941ca3cda3502c9d55064f4e6840d9490b6223b2e3197bd9f4bf8bd826b66439cd8d664923caf284b65e6602cda9ab5dd13113647b5d2d85b699104bf14b8d0d2408c485cd0e9fe5fe613a14fb3351e1d865a78f919e5ad9b1fc52c88b0826330e085cf0dc2a1e497da2ea4207a5eef79f5da9910d2390ce95243f074fdd71179f99ebef2706caf38ac6a5135f6431aa670485d629e86ba4308b0ba9f7a2e6325ad37d890a0fbe67e6940189ae874460b8dd9a192617f90bdddaee2ba414492c466d7500f142e567a2f00af75118eac7e96610db7a2cab2e8f307f470c8259dceee77c0004a25861acb3c78b9b934c32a1b55a48128bde9d06d04c149de11b6ff7cf84535962872ad16f670517888a52ad8a9f8dbcede70e955119945b0f3df79c4e46437bd410dc3016a705e6a12f0dcdd3d01cd9d12a80d57d76da3906c3f7616b76fe0f51638814e5aac16bfeb5a996c7e8dc65a370b28d203131623811ea3c67858532dabf33ce01fedc3ca13279588b35ca9753317cdb7c0dd688b6e17d938f0a522f9a3a913972d30b54bdbfeda7dc0bbdde7b68c88830bfad9832631b1a242cb49ddaabd0fbedf5e25aa78e5979df252361b4eaa8f52b5e65a78753d115aff95b3948ea43fb0b7712b5835ae4d50bb014fe7a13a15d6e88ef1c7688bd84c8d398df221c3e95e9225131c14769e181be2df6ff1ca5b3dd998a1364b320e42dcc8fa146d4ee27a54b6083c8709bcb7d25bf3916d0cc8da65ee7936276386bb9e8c5f269162f803f6f04c3f7e5bbee031ed1a4a2318db404bc813f561fa77c4468281428a2c5cd67c989dd939baf888bd8759f7770da9c1aeafe6a7e3ecf33e7b53f42e59a4f69a12827774297547352880383024bd848a135364f3638fce26404a1073137266394bc96bd27fd4247cc212a63c747cbf46946ed3cb95cc4915fb30d5ed2d6de478beabb2dfbefbbc55a35ce74414470e0bc2caf9ec93c90a31a48b4e7ea4a25686c323ee68d7b9285b6af873212024e8811f65757c9ae28070aa5f49e1415a0c4cfff37810d0dd13839f8514c7d86f3653d3089b058e2c9eaf433c8330495962f3ef3bebd8decdcafa93bf5af242cd724125717d0f74c8fdbbed3d10c84be46e1ed0ec05865bc006571a9f385bbd3ca0bf4c92f4ff221b296674889bb30d4fa5533d37e4cf5de165a26035c9668d2f22ca2c43253193afe7dc4a70ad21f5c6a966fe2066593083db7fba34eda2926831405f6b4d3baf86964ed2a79d72f457509", "526aac51005353", 0, -2008643485, 0, "037f25ceb354c113abba9e264ce86848c17ad279e7cc47e73059462ce919a44c"], - ["fd24272403760ca96a1b16b6c50414529ee34447b58476d32dd41088237034c3906197d854010000000565ac5163accca548f27b4db853e5a803920a0e39e567c1901c7f93ddc36a9087e898c84b27e777db2e000000000651655152526affffffff86ab5a51edde162ec935745689ef4bb65fa6e99163bf56142ab7d617fab0526403000000046365006adaf37003010159ef040000000006ac636a536a6500000000010000000000000000c4c9e4010000000050e156cbf87a9c3f6491c5c7f327c7ff2c9749f0c6f1e0db5eb81ed22273c96aa3ce384a00f6a11ecb27f9299a0497461c944cef6abf20036474e3ab10d723ca15081974c99c8394d484439672aab68826870955cd1aca4a8ca6af3c7e04671d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027f777751a98018acccc61a0b852082a319db5e15dec74129c8166ef3afa0e503991f67872349f61842673f78a13ae591b203ee48c3dbe2f81efa808fd4fa9cee53d0934a750c0e494b5266dd91e814e4a4e087d40748b4401b59189b03bf6688fdcbf72c97fcdb0c158a1a4d6c071be4c7bfdf1fc510946a0b60af63f58afe5020c1a08e6de51a28f2b7284788437591c57c0bfe1ad4652e229f5509c85d03b5903301cbc7509a731ff9d0b7f91f6ab6cc206e10494614b8ff648225a8e86ed9e7e0b01952d0d4a9cf8bcc3102006808454ce6472b9671d386e6a3e67c5e88dd8f386a9f2c31bd96fb3c027e2c4d4d09052c1b375989d9cee1846eb4abb7025141d8202266e8b4bbf71ba51be3c3096a3e0e9f87765750b951b4c0a4703a85a70df6f0e03109447669bfd9e38263a87ef7a8135f6a90a9bb5d51439e8000376530826d995031e9b94548204252258352f04e622f660a737d492ec771e603210bb2c5667c3c4021562c6c2972356a9fdd738bdc1806eae34b7e0805b7b3d6c5d7fab0b4bcc221a02279ec36d95c681e5f758b5b0c2ace9441f93c6192168843b5f205c49ea462b09c09b2ecf9fd8f49789c38345f7725ca955bf4890572dd7f4ba5d4f368b861c752d25640682aa86ac149cbf00ba7a75cb5bb35f9d2224fe07868d1af8488e6d4ed6fb29f2ec638b16f02f8ba2fc137a882cb18e0dce1273862b4269af53707a979048d42c316fb85e740d3d1d1fae24a9ad798c049d4ed1bd4412c7d3f5a212896a60d9bd8c6dea9e5b6ac358438a7fd2c207d865e67c62d198b09f13dfc6ceb31e3902c719943174f160505f67c59451ae921e5a4aa7824a6e0174465dbb8c931f3b38401cfc7644a9f1d3592687b370f6dee2c06d512ef18bfdc00244cfa10f05cbe15787bb6e9f2349188da904c6092e44af1bec6d5bea7002d3f8b95937c5418aac76a3c1f3b60947e987f1a91f372a62fb7bf806b676a897b290bb84a1d3a893f6841d30f3360f92b82f07de265c7059c9d3354c3d29f8f9af8492e5410f972c3631d3d2b25d56a3e325d003afb1f5cb32594cdd7a0955ebc368670140d58509bec1231093b628bd851c9cabe5765fb9b7dcd45d8c7dcb6516c4ad676523a37a2608b5a9670bbfc4c0c341076c92f4d72f3671de694e534553b03c22ad1820124078a5e9e395e99c766d7113b9ca74fb268b2276c4d54bc4e3e151770a672c1212ef6dbcb597cd480017cf3692df6f44fb2a6cb830a8d07aa798d618c31c3b7d91c7fbd2594ad6673f3a13e625751b2c964f2986676a228d40158b5a2b1f3c071d197a8146790373577c47e8716e37b5da500d2cfe48c90e42efdb2924a150d01248739218f8737ad3e56a45ba0b73588353fc0eac156f64f7034aa47e32fbdafd7973174e8a3263b28ea69b7412da7da77bba2b590b85f8230604108ed631925f61935caa565fd31cb5aeb8839639b053e2af4b2b994dd7d29a1b6a6bcfd04b6a22ccebd20e9e5d96d5c956dcb093165c04819c496078831f1dfbcf54f3f2e07aaac403477b0035b80b1b95559f570ead7fe6801611df4a900a18c6cf0932d33db2520ad4c8dfced7beab88e9a858e8e96139fd76d8f54f20e6e1b21ad86b58d1d305f7b03a5e058e7db33879599024ae198c8d603c30d50ff691ea465f82c2df7851babce661efce137c94b4020bc22e5b357b8bbd536ca2305cf05017206075ad76c8d0420bacd9e076c2102a4334d423a5605237c9ce603d696b553ee33e4566e00c5e0737075246d20bd76ee60fda068a621181fe10c29e363906b2fba4bbf94c2df9da703f7da53214d1f955e6680129f51e71ac53189efdf71a729db77c5ffa76d3cb3eeea3ecd5ac67a55879c092cace28a4fc3f7eb988515a0110a8618990c37db909435851efa3f5c8eb356e3b8cfab7573ef37ea72aa100dc13a8f023ce78a03b03f8d646e3f4479a6438f280237850a5f2aec8060852617b80d640e55e31b9d35106f01bbf1647c09f3e42e37fad8c2afd7c673c1ddb01642ff672fe5d84f43c58436684d01077f162d2a25a1d2148a623f5a2f2dece2384addf891d4824e9611f25ab76bc0331e433e05c04ac37b7bb01a5e3c7e67a5a04bfaa53c7535fdf8da2a35435a72c8365e88e0f1661b4c8148713cc2ad3bb24f52a096875006dd3ff30bfd91fdd789137548c094da0103732221bf3c240785de27973c9ae42050a0f4e822c5fb895bb813c7e28f6745da4e58d9e69f2ef70b061c9f0998f8fb9da42379a1f013cfa3aeabe04f73fbabcbe306ccdd53e226c5196e4aef7201dc79dd79ad94e4411c143ec97e932a8ed5d1470d950d22ff87b629ecf159b3166775f8a19456394ab9bf90d66b05ec0ef4098182c06a26be43cea2b44ea4f865436ff51a338e1e5b2f56c193b0c", "52ac51", 1, -811905829, 1537743641, "c26df0be7833332e40a9cf68f98c8ce35a6118b87d20d5253eaed07bf85ced7d"], - ["26a78e7201dcdca9dfb6a224707bd543b288e32fd46f0b1c4ae227e0e48fcf7ef1025d58f2020000000900535265005263536affffffff04da9b3d010000000001ac591412030000000001514b8259050000000005526a65636a9dab92020000000000a9470ce6027379d102000000000000000000000000cfb5bf345086fbd8e6c10d2d5232c9e4ba71461e37449148f7d800a14d5f61a1548d77337a7cfd997d7e1147a8c27203ab39002f821b7f85c593f097cdfc2cf375f813589caee760bc5efa7e92cbf4c01b216d2ff9ca24c8e9f6ccb91d547c26000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f4ed01008b697fe8346deab6910e3d3407e73723d8fe9bfd322e5993eb8c6422da3ccf29512a1c08707889bcf35feacd6be32a751dccf587b37f6edf851982fc857f73f4045b1725e596780bf800d7103826ec6ab07dd9f62033e91265bfa9d8911c23dbc2506525b2da7a9f38540f53af4f99e638c14381b4477b8267c2d86020ff955d51e992200fd5951c4521304fbac2584841047bc231dc5f5dfbf67039a0324804a87ddb180cad96a3b8e517d9d1e121948c64f884458c7842d0f8d74674f0b0696965167f718326ab28ca8cac8be21aa7059a0162cbe322cbb50fb5ea1504ee17aa91471553b441fa79a416d1cdbb9dc1035971cf76891206bdb2f88c7073b030bc473f6949182ac22821103ec1dd7fa286e516c08cb3bdef612f22dfa88c8de021ecf194acce8b7fadbb621bc0ef71061ac8b4c2bab4ce2e418705f1422acc9d6030239660524668a642aa903c52c142968e54c8aa065016db4a5ac7fcdcb469ed602196792985d526cc99c108a7d300a3e55935ab1daca69a8774cc979ad2f2f34740329bde355c3ddec18ff2e1559ae7273055da045b1f71141e5198037e6031363764e953f9af5c6a19631495e0bef1448f3c0458bf772cef163ca3acfcbda66095a0f30f1d4e1775f665d11dec17a5cdf5f183d0480501c7ac61b8d06804e2976a0e3fea9b885c99199f9a31c53912146f2feda8810b01b90c086eb8f1b7b71bc080cdf337af648d866b7d2dbc973837079e8413c24219c62ccbb8df088f3c12abea8b8fe217c60426961ca95d1b2c94788231785b1d56c6d6c39069da998bce4b7ae0bffe87ba54d221dc3fef6123bf1001a7bfd55f5bb7c237c10ae3e34fccff1ba538bfdf488ca3151be886a126eacd452e36b1ef3f3101051ffc4c9ddd6a03ff250368c66d1fc9d95a91b6e902a8fa8c982779a6531072129ce9f6189485b72f2843790cb9c8ddbb00be86f87ec90a8302eb68e4f0ed1c7e7bbc92201c60e7ef8eae6c9a4fb4dc449d120f1599d58aeca833028d137bf9c97155955210e17439a4e64f21f2329564ff55ac5697f56e11f30731a62fd4a4beed569b2893c301be187153aa8aadae5c4d23dd20ce019f9fe80b112d5afde03655ad6fa8c740cc1ae75fd8c90e8b53b34bccaff8b17ca6ecb10517234f2644fa2abebc53bf85afdf59153a6b7311874d82f33a0d68f9eedb389d3881bbc106445ed08f82269b222ae7f7d82ada81b442b4925030a46c3a202a8bc65f88e083fd8787255953a24f35e565638170c0705984ce883db06787133b3a9fc0ea86505be6948efc915988adf5df2f14b89492fad7e5e7705924f352dba8b4a8e5cc847be4324a3007f8347d51a5e6acf4dd4c49b5c3ba82f685a7449ca4663819791f48a6421117c5d1675a3681ee0399cb6105c2c8b4aaecc7d302ea499cd2cb36b06cd2611ce9814475c1a3a92932d215292600565db7c543ac885f8c13e860d778066fc0dafad6ffedd3581422bb28f2b8a059ba991df4749648df03ba5a863e3d485aa1d2b205225b95f7eedbf722dd24737be668e5a74f4014527ab6459e887cfea5a7cd21cb0f4e4b40d07339fdf38be6c855846eabd5beb477adb7846e0ae0e308a9383aef6efd943be3dad64852eac33598f2dd56dac7cc5f8d513f2e942458f46bae9b365eb78c9d109826bf83ff86b05db4561e53b222369bc012f94bc189a3e568a72dfb91388d35d438f59bdbb7b905856e8c418e93b6183d506ff59541b28a3f6174a9d41664503732bbd1f4f31447965889a48bda7121f8091dca04cea8acba2af3a555c99040f4bccbacd165702c78f64d083ab04b21ec8ceba1225e056d339ad9156ec5c795936e175c1b940c6d77dcd309e2c3287cc9d84e7eb1afb161c74f037a055876f3c3e14740517a7a91938b9a93204011288c94c035ae995eb2532d45ed6570615ed3fc6da7b3fc6478fbd0f6cbecf8c3a4aa9eb7c8d60f56b225b3bd7250c7d038cb9b99090728686f78be49f82d7d29bfb508816c1e60d95944d6cfe07b162cd1f725b24ca69311cef22d57a44d733073dbf3954dfd800f0525c7a45d041f2a58eef75f6eb1b95e18a99f39ffb4e5df33873f2c059233e812857df4afe0ba4cbd8b49b95e16441aac5998146982f5deec4ba8639c73162d78c05f202f0ad00d522df12ff158cb22f718de8ed7c347398b7a159c79c8a5e8af7cf5da40780ed91d9c2d5355a93c62ce5daa6ed6bb9cc1c289e8e7a1a466b3d0f6ab9a479809f20099881f47942f93d98f58b9bc36d2338000000000000000058197d030000000033cad6ed7e53c2a28e556862e180b262b5ef1347521407396b58d305ba37364a7f8c66b1f15032244234e0fc639beec33dfd659151dc483ec23b9124878c82c33a175b9d52a2832d3cb93fbc709f271b6abc96babf6fe8f4c89e2d7e814e815400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fd1b0a005d293c3ce1777a73ac026a82cc7713e2c7f7d16d685831c11fe3d763c3aa17a947f13502747447e39137a24ff6fb7ec146881ff49d940ac937ef18bbf3a5e073c3fce85d4dd830f596dfa6661df299e3e2aa9f3b14b80b621b56c3251bfae62cdab800aae9f5d0e535ab51a39691af0685d85e620c7e806c75c9c588032f0bab5dbc4469077f2979ac628997952e8ef6087dfc327e966dac282e7d93d003005d124d081d8f13d6d42153402288df5d73cb88cd244b9f06e1499b6cab39d80a08f62b7fbdbc81c4cc2a9ce677d8bebd55e15f91666518b508b686b64a4961e3162f2c695ff089b13f085045343d36dcf115f6a4178df8e5bc23d814518e06ff030c89efb1385df0521cd013f50986300b8d62145028013b44f39ed65d0db78a15021fbb3c70b0ed56d705c8016a25450b25e8461ecc4ba89bc73064f62db5e512f20309cb116899af5ee1ce0aeee7c954ae8d43aca75f7467a95c502297f1e1a43f9402084db3cdd65fe3072f15c263d08345e463ae4edf662ab56619e95adc3e6ebd4903258dae0a293248823260f0c44341d9258fa2a617de36c1bc8f57fa76f0d0267c2721f4021daff9aef2d48e0ba3e755f4d1662ba09aa04d78968f4f0634cd7938a7a457abe22f9bcd75da3ddf869c285401634135f4bfeee882951f6170536f354640c642c1e581deb310861e672c32b7eecaa159465d6ff264318f1658c010ee5cb5757deac68f7db565a1e476503a197faccd8ebb05f591adb81eec95acc56c4e0af8fb06b9ccd2a4bb359b29a128ac605e73933e8c5e9068e129a52321592b21200d0218ec0c8073cc5f35609ebcc04a454cf436b5da77a17e2c616a0d27a68939e721a5d18cc4c83fbd94c92128e9af72f4a45120c169e9d89373610fff1bf2cf1b2cee8516144a6b9013843ed3b082dd2e328eae46a522a02a00a67c372d79a78370e97b7de0b4c8bf37897c1f9c905de160ee02dedcf36c6a4e76819bd047764498600201fcb015caccb50a4f4baa62d0e6128ccaf3f481c8f19b5a50f4b3b1c67e10dbef570d4100d82ae60cea4944355d599492c01db7c0e8f36bf05afa092e2d09e26e1f39d9091b50cf6ad4faf62656bfedd52a1cca83db5611f774bb1795494ec4439c81b318855c2f6ab449c9be4b25bbc7ab6289cf1906dee90b1ce9033807796b1a38310ede38a7cddbad9d082c70d78736c610c90f5dae415d03efb8921af775368d10c57260ce4e92c64f6c8e755b2aa0bddd05df637f317afd551545f133aca77b53582290c06b60a69f192bfbe22e867b2aea04f7c03f086ec5181fe19d743225bc868180ca5712a48beb072ad19157f2157c59f04a226dacf85100f662986421a4466ef5e63a2efac086059ed82e6f4e3b2db5099d4a9359c207cfb9456a6c4a934190e365ed55df7a1522aa700a77ebf51c885c28c5748d6a226b3af939c41d444ef14c7b4f8d259df669fb9e642203a36b7b98478e2ea70a1353f83c73e07ee8257fcd63f2b88a4b18f8986477621617d6c313613b62b52d4761545de3fa5425de02b96e441e6a6a067552b115a5fc494b317d65f36e7dc8bac29e76286b1b633771a10d4c1d863a8ed4f21e77aab403dc0d087e1622a73b92c0f318f8f4892132d120e566584344f5be703c129f1452ccf004a91d213be29791be0bac8a8660048ffabdc33ef24c57ff59a585a79b31ee865f473f5e36c03b93986bd2ac462c946d8490e32f14ffdc190efc74ba69eae498ca84b3a9331316d5fb9f5b95a3893790c9a6648bbfe385ce90ab696e82f6db4c3be8890133d5c4a393dfe0900d00af7385b5129d5e0af385562e7f99c361b8f0203475b659d538fb9476e319756993f97fef9deb387ffcfd57336d303ed7d07bd8a25e8a37bf01c47efbf158505f9f0bba6c70f527497a49875f1f1260882038754e6c8f95e4e1b894171127a2070ebdf92cd3a5551bddbb3a1b1cefca28ec34205f4e861627cd0e6f5544a5fece33dbda3215b385c0087ed9c527494c39f5b2e84dfe491ecb4bdd12411243628695daf0602860d7c8bc559cb9c3311d87b83840daf9d32364be67592680b97da44fd42b5b46fb889f4c6466dda808c886ea3f54cd1b0bff7a20353d41b99fdebd30f183a4d9785f0096bacb85b39f086773335ac7ba1203b44140498167d9a25d90a11e0bb726b307a0ec0dd926096573827490e9816a44d3181c72b78d9fc10b46f0c3246cd60bb064135367d9f7eaedd1388996d23fa17f98e27f1af3a69af16a7d199078611e851abf003b95c0ccfc6ec1ab24cb972e5c64aa1b8d2a39e7811623d0b20a5a402f2a1dcb8f7aaadade3aa6303c5191f1b0a7fe9c160d89546c3843e01c804cbfda4167d086ee980714b0041d137f4d4ccfdacfa2d4115e634a30f3808d5fcddb0b", "65ac5251005300", 0, 581013106, 1537743641, "4776a0f8a5f89f8593d037301b0b7490c3240a64ec3fd852c6450788511e4a09"], - ["dedb2f2e0287b0eb0a4eee8efa45f5a0e46156986ffc015db4c781fc93c048ffe852a4be2c0000000002536355e02a5155ea291e95fe590452a7cf08464c787979663d8f9113009a2da1cac696c435e8000000000952655263516a6aac51ffffffff01a9ceee03000000000165deaf341101e14d830500000000000000000000000056e6e8eb91d41de39694a8ac18440cf6c2490e96ff1a295ad5049759652d815aec1d2b2d8a811d569217646d4f1aabfae5da71cf79b42c57bc781f569d2b06f1a637c2a5789a510d18afae9a83bd5b484527c92129e9c699c401b8388c1b24ac00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffa4e81181e89bc09a57458cda7e87f8d095d56ef7868acd6533a4e37a662c85778d96bd0429df4614baf943849b16a3a83c206b35e03a07b1051c0fdb3721fb80d078b93521d044e54d04819cb59caebb6d55a080fb9a7c5ef412d83ea1d1e1c6c80d85442c47c5d4d38b5fc715b7910ce06bf737a1673d4d71d6bb49142cb9031c99a81cdf2be179365c94b9256a45ac78a8d2cb9e6bb1a3c0acce37dc77c0da0219eec297bd07f6ee7528455e89a6be7281acff4bbca703946665d02edc84444e0b013aab5c43912babfb79fe631af3b19be4254449a618b7cb2c28cfaf477325448d2875fb1bbd88569090c84687c68f95919ec5714112ca39a80be65ab937c25d0303a6123f8ccae38b226f4862ed2bd913378d2f6bbcdf0d6a2794ecefe3debad2031a0ff7637fdf594758d959d9a162280fdb9d9e3b2686335072e72dbf5644e4dc032bf409e361171e8b0999aebd440d254d130db92cf73a96f86e604c202a3f74be02149a66be3e3f3fc80ae8760c7d82d92209276c10108cb84c4022535057ddcc600313aba39fc30f5019aca2f12123a676697d74bba81f69dd2734cb21854bd13a82935c02d967087c2aabdeac0392f7809e1c2a5b71fa2bfe9b6b5c66ee23fa484b2aa890fc46ee81a6c4e0932882c3fcdf8b1f03a3f5744cfe95a1f30cb40823778b9bc90adff4b58c288cc2a0391a5c9070da7a4163962ee78d1a7da174edf38d4dff25252b13eab461fd0fe7068ce16782d3fb36e379559d1bbb859315ce47d32dc93c3dfb2d66a08321646509f47d153f9fb69f99d8b4d8328d0b4f4b4c11ae7995fc169ef7f48c47dce3691d353951ab775f8a1871d75f006b05f4b339c7c966f4a942ac086b87639efa47dda3fde56e149f85699793a9fc3cb9d4a352c03e795d361e705c96bdea706c1587d65dbc64a46c20ccc7778fb87c86d49845816df43d87c456fa246e92dd56076db5156fe92a35de05d766306d7befbec0051dc8077b583e6ae8724f76370c6deb7eefbee5f61153cef95a2f68cb1c08fe2f934da24a89a2b24ba373df44299d8f84aa24fe05397e8f62d5e47ecf081cbf8320181f7faf39628dbb9880b4a733404b72566df29bf05e5dda05b3e6deb8243b7a21ed8fa56c213ea087ea5f7d7eefb19a48121732c6679d4a93b2011ee552984b1bbecd7950038b4de9abfa727b2afc460cdffdd7001e9db7d9fbdeea820734a520fc006dd4ea2237681fa48e8684f2992f882975c99e0fddd765758a4b9033b606c3434f25229d3665f4f2783838b87f8ad386639212776877f1f4eb2bb2ac5c7750ec566c8df1270594392513a7d541dd2d3a1bee009746b9b8e9bd1456785327b54eeb524adc91a82e7ab08559c6f330faa514b4ef59a32a56b95313b8bae0efc1ab665194339573bc92fea3f4588d3c86285b87b035b2e4561d80d10cebeb55ee1148117bc59d2737fe0e6965b4367d60a9b37657a384edaff4d4c21e7ed5b1f4873e1f337e6f9aec1ca7a106169259920ba2241f80a0da72626169b5eba1ae5acee9ec3fa94a5b29a20910dc167d863c42fa99062cc91e6ffba2d403795e3f32a1a986dbeefb15f4a62e8abcf3980daf9a233f83e48f908ca07331a642a885750968bfcac163f563f7bfde7d8da191d2e415eb8cadc5f9bce37cf74a03d8e4539bb261b425c046fb380ed9193382feec13994f139a1712b1873a9283f96156019f7a429ac2d3faf287a4984adae3de7b16c5aac20a4a502dc1b78d498a7516c16fc121de592b7aad4e727bbb90382bb040d1cfbd9b87847e95fab4330f5ce5c5a8433d3b3e8d96d422dfead7eaf888d1d63c031cf0d01a426190d93338dfcc2a12ac3f84abde3cd4c282465db81893f7630996675391e49a0dd7ee84bdb1e6e8e7a4a499431eb8112439ec0ad27a4c9dff7d1f282d28ba504d0f3c2a50d68bdeec4009782aea76b7d202f5f707f2dc440b83e110aa52efc8103ecd8623bab209c0e351ea479e142a0fa433b195c3d3c09993238489aceb49c666e5a2bb5185245d1d07928dbf50c5966f36e40ba993c58ac78056788bc177fa252d73bdebdb470bb863099ee483e1ad4db116f1c247bb6d299c9beaaf01995cf046a0b90a7975497c06aa6329e85bcc6f92d7f8e52e2d1f346dba91f8c473d8dc13dcb8b613616ef83cb53823a2646d03f66217a0e316f29bea27e1cd75f6cf36cd152a6a70b11f9fc889a1819e83281952041668bc567237461fdd6888951b05c9b710f5c064b904cf9762c8e4697c1a285534f180a7a9733dffe6bdd5cc9696f5946d40f1d70b19b711a96775539349ba8ef87fe68e65dba7e77615232d744b8e5eac1df688129e88a616a142e194b50b881a1f926fe02b55e4d120d1b435a8c6cda8b986e06f614184a6914e6786ab158c9d7c65e10d", "656a5363656a", 0, -1752231560, 0, "2e5699af54d1b26f65097db842813688746b5d03d505e6a3dd07941b2e049c49"], - ["07f1ae01032c0c3f6de6ab455a1aea24f5423601d12b1f9094de826d1901d53eb9374aa834010000000153ffffffff4e72885e886806494bf3bbb95f298c6c99e769eeee0ca0a705b426b56c71887702000000066aac6aac53acffffffff092fa073c6a58e0d074fc6b2bf102bdd449f5ecc86e31a39cd86cd1e38af5c12020000000353ac63ffffffff04ad22a003000000000600ac65ac00527e332000000000000363acac82264c02000000000029fa6c000000000001630000000000", "53ac006363630063", 0, -1378141161, 0, "0327ac78fb98f99d7e139ea96ed62421e90c313704c341464699b6d058d1a3f8"], - ["030000807082c4030477356b53e0eeb0b9301e6df55ff3c649e912ad23627590978e184876ff48fab802000000056352630063fffffffff5ae1461857d4634b798da3f6249e83f7d5fb880eed06837ec451b50df067d130200000007656a00ac525365ffffffffef22b70e919eccfd70843ae9f6dcb4873f9379e964141a7ad85c7b746a5d45eb0100000006525152530000fffffffff5a39a2b1a11be9fc5080dfcf47f5f7ecfa6bd3ce8d86eec16c85e21f75ba4fc03000000010055b372e50237b3530400000000066a516563ac63ae735f000000000001630000000000000000010000000000000000dd52920300000000f1a045897219ac6e0dcd9c2db310ba6c438a67e708b45f5fcf8b5dadca4310eedac9a323388ca84bcdb7834c31381cab57dae63a7d9f3ade5f2191a93607f1b4607b73da8283aa1c74aa9677a2de19f96eb0849d799256ba2f7350a79e159a3b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016738b5500814c1e7cb4d6b95d51004ce8afa732579db4f2eaa0444477a89ca219c49b51ff748b6ee727996d67963d6b0cbd66bc67e260e27abce0cc10cd35b1471f75f19052b143b9bc1a26c39f5be3f38171e81dfaba5a17cf7dfad3365bfefffe0aaaa33e9cf5724c60734794aa1219c1ea81cdf3e4a43fbd8be7c9fc91f020cf4b9783f1dd09b951190bab3cbd3eb7e03ef1ecfae2f7e80c005c54586439e022fb1971f86d9b362daa4735dd9ae6dd63a364ddadd6e691e241233d9424a5b930b001396e5abb9ed81ee6818e3a34af371eacd82c28711d4ca0a88cf61749941bd7cea69c07059be4c1adfd7f03b549d00a7634578f695544ce962a6577b8a2ffd03278a892caafdeb59e62009a3807378b2517d00a0b52c320c32aa3d590762aac4021664692b3b4c825a40a2166ba3aed0f3cc64830dd14b87d8e6497a107859de6e0304fbe1810d4f7dd89b9fef87506c4ea13202041edb6e967635254ead9e24e1e903125bcc46346210ec93d25fae86c4f3f0a4bb45dd5594a3c7da675e2d6ab18ea80308f7acbdf3b96628409c4c3dc13d2eebc8cd35373e8fe5efc2e4f8c630a1990540d86f2f65b7c44f043c3f73c5978cd23f133124847fae62af7b174f9d31ce55b9e27d696757174a951ecba8b5585fa3327d1b09f906c807b0637f4286a22d0fdb80a23d8a99067411a1a0e686834dbbd95479f0aa2b62d011d7821c2ecfd121d8864e554da462715604ea94d02116ad279e381b0817b18e628d7fefbdb6f3ecfdf9d36e578ecaf8082f86ca971b5e5109ed067b2a24121e9f76a2da50735cc7a544521490a9fe994e71d3d257e78efe0eb170880d36ddd59c93309a5a973aee1835dea0238a7aa6e3819c0153e5333a4283a5b290a634074b19c5f05b112e5d9ccfa4e3c09d1fe2cbcb908c242b99f885c97369337182cc6c4fed71b8376ef740e82b9406111dc2f576de5832f16794a3a8cf27c41df33cddd1b8871e8e69c2909f330b33045b04803d7ecad3c579db46532604a5ac288a2f22f68372d59d5c9d556428a8ec0f2c0fda26e9059e9307b26f9e66cfc9958dca94374a411f46a03614d6aee0c1c746b649e141c3ba0334eb313ced580da85bdbf629555823482ad23a5f702e2ab46aae1951c500d83335081c720a42eb6e38f6b9934c37b9059ead6a266b4ffa7599c1052f915e541c54f33be938f53621585dc7b0b991bc5babfaae70c39fe9617300403918ab99bccb358cb8e6fda482429cf3cc0324a616460f60e3b693346d9290cf710d7fa773fa93b6d4018ff14689c6ae6f45806d2878d9b1bd028d957764fb3c91d7c3d68b8ded40aa2ff6d3a46c2603e6a7346c93b366f3ddbbf36b0d79a7975de20269d9f083f3d7901b20ee8344075770b501e415bc509fd4b5a2dc217e5ec5c09bca2f17c5735305873930505aed3de77d1ff8a9ddaa5e8b44351b592e5c8838fea5f236c53a26c1a8db0fe2e5ccc552fc0246ec89e83ec943c3ce27445cc786158fa9751b9c1e2a2de8ef9c35e0f29706428022c3165a6a65e5b258e8a2b67937adec7f041c3aaf1eab52d5796cdaaf08808e466591cadda862de7c7991ce6c343c25208157eab5937517fe565648feef446b946805a75d0006bfadf05ca9327138d9d433207e9870887b39238b0118f7b4da626e2a059d1d741cf61d7f78eec5896bee2d822b00a0422099af8cd1560075d48448290fd1a7fe90e805dbcde4500df7cdf78b7eddf72b0b99de1807b546cabd9e9ea618c66cc8dbe263f3eeabfdf06c31d94aabf402dfb4d20087d7eb8e3a35a201159be074a4f14c090b412afa76b4840e14a8435b37d233bc436682175d744128f57a24f1e0c48218e4f198af216499f0cbd5a4a0489b42c04980811b509788edb4f0458fb6ff9acabb49139cf1c85350902f1b1ebf4709654eb3e10b4ca42b3474695a7075ecc3a8aed6264fd821e3027b5c8e5e34cef38da05e745c011cbfde4bd28ecf8f73d4a9873e85c75919925ef483812d0d990c402bb7682e74d8f4c212a6930c9592d167b30835915205c2d632c99b1cf41383aa1fbce29e313eb0f7c1abb892555a8cf4c2943aa38f9d75c7f86c79728249ed6cf639949251421718584a2d9b02331a7931e3aa9b48e7b8b914a33a545b045973ff0396ba87558d71b1ee9c7408b9973c3061b16d454703a40143a4644e9cd8f2f0486a340b168ae8e6cca6229740e5783774d2b1a66ce4203f542ec5503446695324731bdcc1f6fdcd83e0fd4be3ed7bb42cd29164d94476af58c20ab54ee299ceb0690063f528866f765ecd6fa7fb0cd6c1c42cf29cd0884f229b0d9f624a1fb37b14b702f511c188ba8712fdad807985e7bd9446bbf7e4ab137a54de93e7ca798917dda16a22ade8815f572c14b6b97b672a3139157dab04", "acacacac63005165", 0, 2136313647, 1537743641, "bc6f9c9ba1eed3b141737e381b0c5baa4c77851e2ef355f8516d4453a7e7d153"], - ["c51b356604d74dee547a06bb9beb762e86b8ffc8da3252eeea8e8a8d390a40f3ef4febf1f70300000003536552ffffffff9995a4e35879677aff93afcea51e2eee1bb87f9c2c519b21bca33e01c55dac0f000000000463516353fffffffffa4e19d1ee03ac09d89aee110a10e2cea9de91e2dd99d82f85c301cd74090d9f010000000852ac656a51516a52c624f1ff8e3a766b9e2797007f56cd4137c8d9c469c1abbee23009c813605aadc64a0072020000000165ffffffff03da29e3050000000002656a10a1ad02000000000851655163520000acbdae1d010000000002ac5100000000010000000000000000fb71230200000000fd48cfc26d38e6162e4be816b449c2c37883bc928f6fa72cf7a6ca4bf36d2e3759d55a02079aaef8e22475fe7c97857f7dd134460fd2c6a9279bc5eb1e1e5c3313cebac0b80c9982ba15733a8e5a34f5bbe4738335eb6ec9d87b271d4d64e8d6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001303274fb29e3db23db2dcacab85761ae37f41b2c4dc3d39827f9eb5e15105c12cbce287fcb73030db807edd298c53ca1b95aa738286c394c10553e524becfe10a842c62477b0203e26e6ca7aa37b689e09995bc577f00507fd9a466651191e949ff4e3a0e44c94c95a22e9e55614d79e728886738f08a654fdd82f9f6c171a6032de51cb86e465f8b5d8f0bec4d11fcbd9d5f0159957d26a37242d1a39cacb7070318c01fa84cc5b3a4d448b845b05603972dc4eed1e0e8f352a299b21cf9ae21630b01c6f9267b6676b8e11d8aa915a9bf857b93f5bd2100260aa229931c9aa8743198b68aa2960c4e76492c4b243c8479f76dbe3aef8c9d869675da28ac6a4132e4031c1db16aa15447fe848b61c11b99e70dd3966d5ef6e82f80e7b16695caee4d4d0215584d2db149f27a27d425285add89214f2e510363423ca01f62565cab0aacf6021315bb0d680aa8781b245bac90cd0c41870058fed6d366f2d6eba65ce4e44a5b0214955c6d17a5d93bee6d2ea0b11b918401fc111389adad5ee645374d69fd596403054747598913f364a332c70a29c45ceb00823e8234d0134e87e45a99ed5b997081a849d2487d3a2b33a2db10ab18a67f731db53ab23e57784c691598a117eabb1b629aa71a0dfe9704be8ff8dfb5b58227559cd017f32bea61d23f6a30c6cf73b3f8528173355d78a2e64f0596475fa39c80a09e666569d97559912c5217dcb45e7f27c86b79672344e21712bc9fc29ab8fbb53d065cf6c8514101bf737e526e072d25a0ae8eb29d328ca1cbfbebc174a6dbbb446936817806f35fb471aec986b52b0bbbafc685ab97493e3fcf27bd218a44fdb9556ab5cd3c20cdbe54f0b17c6c1fd88d8c605cf4b81a6285e805f6ac9023d6d49e6c3ffb237961c7dbc6ca223c86c13fcbab15122bc17cd4b908f4a435e9aec5e2f75efd54ed0353fb809cbe7c2880158f71f64fb3a613e35f7d3ecb9f4c691d5e5acdff43b4cfe090996d717a9c35a07d7c487bc2c6baa54f144c30892f18f1dc59a19d646ba78d32b3331757f179f67610a7baf0a8f54aaf85525f30ade4e288d01a01a5f90b326baa36d2e0ee11d81749f313bdaac899730826424804f0b4a2c49d4144db5c8a2e69837dfe4151185ee6931c04d4e23b3b9841cda9180faf168e5feca0b3a12f1009fb77fd8b26f338cd3103156bc97b537e0c81db11f58d47b152a644d3889cf0e85f8dacb2ab3db0e5e39dc76f739610e57c1e932b4c269a75757144aca4aebd8a14b97b1b145486235e94c342ef1a851f307ec7ff82603f4f969cfb8f6882f366f00b84127db509ad3e759bbf301944be3d11e7b0d07aceacbef35f33cd1ec85bcbd4c153b18f42b1eaadd89b6e4792ebb6fc580c2a4297153d10e6edb62b803a4e21a40be570f247eb59da7a682738ea421f2f7ea3d86ef591de55c278797520fed67b7a3871e08f2328d974328fa2100766a8618048a9469d1df9df7ba5aaca4e198861e510a75b9f5147fbca76e45a738814a4070343606a47aedefd2a084177a7e41a4b9b8271e46a03ed5a99a8888b836c7e0bb7f1df64b77f834487aaf7560b64882e34b0cbc08a7eb526d8fe44d7e73bb528c81f86bdd2497e052a64f354539a5ef5063bd1d1372336adbfb73b36d749fc4e4bbc43c91ab6168fafd4090b04372501d58bc44020dcd2305dbb1326790913e6d9e0f777c87d54abbbead43204a13e727e4c8860c068ead1b4f9ca3ddc755136247377be70f750d3b796bf018b6334d430629c7b7964a47d5d4ebc14f34032cd7c034859f342d2d7258208f53bcd3eca3b040769afc22890e44a99571b61267ceef6739410404b5a1db0e5468418021c9bfa403abfdb788fc8cf4b6117f0fc48d30bfd2c45249e851f2b805da6c9c341ca9840d97d99b74afb8b26cd64faa72e4ca7ea6c785a5d15ec7d61a65b0e534ee3192e61d066ec79d07298eb581556fd5c48afa914f1576b6ff71a6ea5fc731734f8e4211140f25c4224ab33e5a9c675ededfe2ac7bc0a28d714bb0c2699e82c1ca641230200cf468f6ce10f7197a3f769f7a09c603e663bea5a122b2f719b0e3c12e7a074d54b1fc5a2e2147e8c33232070b2a981156021d71505e97ff8f81d17ad2198d60b4f6a2c675c6efcb2cd7919c53784de726ee9a9dd634d4cca6875434be945261f25c570f9f099480c66e11f7853c47d361c1e119d032a1b48c3a6283b7944f07620187cc73143cdd9c3eb19b230ef3027aba44de63fb296e947de78c6da41e83582e50ffa30413ec40506762db8b8af5ae5e22accae9fe25316d277a0024fe5cd9668219bd540fe4bcd50a9fef80146985f055dcfd386f18760f997b051089385316b9fd0393cefb3c48e6c4b05a3bbd75adca7e96798b5e59cda92c0c6c4a85017a235c2373329850a", "6a5253526a", 1, 1406760434, 1537743641, "08b7482328d19e8b3b611acc93a65c3b7efc44d567716fde62a3d4ef28df2a23"], - ["030000807082c403036d72cd419dcc33849bd33c687028ae902e5eed30d2efd2359be43524f25ad7880300000002536aa5fe2ad59f0d79c11b99563df666b0a515413a0c815b83cdce8a888a3c3b6f7b5e2a30d3010000000852526500655163acb993de579657ccd6dcaac5d02c6c34a3fcba1ac2802430b734a5cac8e61ffbaca616ea1e0100000009ac6553656a006a5200ffffffff016b1c6f0100000000056351006a520000000000000000030000000000000000e7011302000000007026ded4566d759b139ae5155753da12228f9de915aed625ea5b4f3d1e77f0d472a12028ee24bed8a9da9b191f784183f8b6310703d4dcf50da0c5e38e24efa161431dbaeaea8bf43ebf948949092edbe48a2d74ab280f1edda6a13fb89bd48d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006d66299de4e392c2398daaa7bfb24fb236b910c241f9cf9e0de0fdd8b3daac14ca151ab5cc86e2ba632b4e4361e9b2fc87df0ed106155c5aebc49adf7138aad4ee222826a7133129a0765e520c110528617710dbc466e64fe8426fc87649adc24cab9ea4fa093d580403f46ae8ff505cb0271fdc2e31ffa70826b9aaeefbc9bc020783c38b1761d03737cbef5f7c11f17a04bb997f5f8920f223aea696e6dd810c020a5da73533c955e5a0f1fb9e481af04647f82c58794f17a127ffd4e0167c73ac0b08d512b2d2e6300924e93ae589507ba826a1e7cd6549fd339834a5e9b4c31536e8bb428d74d81f66a1358a15a89984efe0371b60428cdbe5ade00eac94f3fbde03119c94fb9ec78393153200e446db83fb7ab7851a978fb77b9e2a19decf67d6b6032b0a7b5691ded208bf1533ab34edffd6b05269ea645a95bbd2766964d35e69350222c3216f4c43816368c008bdcca5b1a1704e09656c753c89375c9beb81931d170204dfe7424e21747a352c389a1787108fa5445b6f83939616586d7ddaed643ce00327317b79c57b25e19ca0e8ee2325b2c83ec7b33d3caef185f829138c85ce5222b4dfeeb793d3784a7a4d80ec2544cbd07248d28b341a86d73a83d01160efd7f3922703305870ff657bed9993a096feb61c93bf41b81f2820a936d0ef1fd578c54f12a6de5ddbae89fc1d4037da43469eb805719605e390f53c8b129555863bdeb7b0f28119a187a59b33d09779de3137249bacf83852ab47e47c4474c730062d68536f0f75810e854530a5f0efc4ae0ecaf4013b3972ef8f1441e63c3ad38671435690481000e70cf548491b26db62b94cfca070327b444dfa30672eafecad1e8341a211b4848718afa5f38705c8f48adcc744bca81c7c77b767b98ad9c4d09142cd06e28b582e96b651b281565d29f869cf6126403d8ccd599cd88b3d22eb2cfbee19e1b5e7dceb8524458c28794d0128cec1029477b89d28c40d02cf3e3d27dadbfc19043c49af17635bbd1a969006db9ccd43b7d23bbf53085c1a3cb725bf2b91b7f666c69b52e4903899b313ea0c5ff7b5ecb518fc66a1e3845b5122206135b08462cf83fcc5a3db516cb63934d012c18005b26eec04a9abbf5d5c2f2796ea444b797b9d651166968a67b39fe5bf7bea315e08a188bd3d14605d4de1d91f76f8b1144cd955afc2ba3bd0206aa88a56ed407cfb51ef758ac09702e580588abbe3c27e2484de690802d6579ccefde7ee480557f299721f68d4dcff0e4dc9741e8a589f80cc94a445fda86c0e1c4dfb1006fe869f7cbb1eefcd9d9bbbd9d49835a9b209373eedf285f79e9af8c2d2eae7f3fab85097f1e39bf316f3efdd64e14b69a43e0378e2c8cc862c223ecb71557c3931efc2f99ec9db9e2dabaacd176d1c670ab406dff4ae26351449efad3bdffec5ef998205deca4366efc684d806eef9a8bb95e9bd412ac562ada510cdbccb68f6ea8c1a0ea92c07bc98c1e46aec25a0289fcf02039f214406760ad67b35efb3549eef81cc1e87b1aa7586c84e67674bec6e39b3bc0e13fd78c1f94d359d896412996b6de6cdcf2c6414093a994b2a74cb15e0b572dd7a987d80473590ad4ff64e0b04b115ac19f57677a7aa266bf50a33144efab0bf902da2c990a5dc6c4dd9fee26cf85095ea1ab32b7a7064bf34ca4f4c8e0bc363674375504b169e32c996b18937a7825b488301a8398d532d28856755792ceeb87a27ea681433e18fa488d0e33da4e3e57aa67457172a75b71fb6955469c293c47ae9569d262324688b83c64272296c0fcc6481f333f8cf1a3ed646334f4efd9953dd60ba0ac91481fbffc8422d3fd871ed0d5cc15ace416d972a88f6681a950b8b9d14ca86d1373b34d015cedfbc160bf3b873a7185de7e91ac8020e354192def0c2cf42573a96e793e73a008b52172cee70da939d770c91e08430848e862e5910630d79504c87696ca3c3383a641acca935b2fbceb34646e45f515a0faa5a6296b51ef306254b66f5ef5c0edfa3cf6d8b599a9cdb02e1ec5882fba9ed06856e6ae66a446d12eea53795411068c990e3824234540582277c71b6b272bd4bfb332c792a31fd7944b5e942794f2a013141e27ac50652e635afdfe1e5ab189c8de227502dd7ce17ec72d0cb3918129609fad0a493c9c717d4e877fcd476a26f36b06b67c0015cf2da17afe128fb1e7700ed4cd1280f06b600b312f011821b68f0e78d9f94dda27ec7999a8cd2b0e07d5aac7c3a27bf0e37ae4f70f121a17664505412494bf9ef31759eb079b073f63d010000000000000000000000009b5c2347c0ec7ccd220e1ed4e54cc39f60e1afa792128050f8f2e568c04a19ba3466bb040939d4256309af215f24c920349e11218a351a73a923ffea4c51dab912d8c1a55b99f17fcea9ddd03bf731209a61642b0e581ffa244257543f69037c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009edc9dbe7fc1a79f1bce912c409e1e8be58106853661640e35d57814fcbfe2823a53d9edb45846347132d112295cf28a72c69847600532e951030b530cc022989212a067b5ea6e65527f24a53ee68bd22978d7159767dcff8d168bfa28aa917df3513d0219be6bd39111f6115ab384130f5089afd1e1a878011ca62950e7cb73031570ed90e46c136e32118e641738904fb21568ec723fd46ef7419cd84fbd13900221b3c563ee79f8aafe24ae106d799146348e952dabaec001feb057ad4bf5a07e0a090c46eea0d2048e0ea8234fb8321514129251d013a6627ea5185483352d69b6d4c663e3e8b687238e2b6cfe531cdb367059a17c1b99860c43d9a9381fbce4fa0300a87245fa7bb8b54250af86cdddb1ba5f568e1bd1131a9d23050936ab86fac9021c5abb45f1261fb15063195323aeb4392afe89e9dd5815440c37b8aef84f4af80215a24aeba388ccbc639d7eeebc32c20234740b864e56103408f99fe4be1a90940316d76ca566f7997481ae9b35ea61701f993d430c154e22207541773b99e02cdc03255bc488d99a2aec5252608b82458463d99d251238dead00d9e17f6e289b859e0540181f381be6c5883ec599fb94e7c9984a5ea9736ff2d333a8f3a809e957d645ce49e3b434954f940d6be390dbd81859576ac442740259d6a041f9d0b73981da5d2a6f42bcb6471f8ab32aa517680284c0bf78f908b5e99fa819a2398b336f9271d4cc3d894fdae2201e39df7c4c29d1e059f8f0b5f87fdfa82dcdf6eb2280d2c05762b2618b53973351ca7392171fd72226c02727d8ec917f4ea8dd3e9876fc031c17cee43956c8187adea293e38d3d6d6ce68fc7e9a681637bcab98f3b67729fb916b51d2aa0a6a6eb75e636dc1fef16c991398040bca2e57400cfb342f84242854a6a8d83d6eea0120384017363166be1e1a6133d413a4f3d94897a62b4b5685ba1bb740f274a67fe105f305e590bbc00ea1b4d129a4bf2a30a046eeab2091d173d06c7e3a0cc1540258076303281a84e07273473d57d4ec34a4173dd0f2b77accf5bd1d6c5655671f92110019a5e7e7c8ae8094d9199a330428ef51b38a4e0f0d027f2743278b981c0fc8f0b715c430e18f4a2946cf5bad24d0b1f88e1ca6fd1632bf0129fdca068da3943e4c62a4ee8853bf5ce78ba9a8b41dd2d93eca2982ab0620ffe81cd14ed7edd9ca3ef3054fd9f66517810941797ad01a7f7f7426f906367192e50deaecf7a23f45cf0e4d0b761b6bcf5eacac5363107acf21098de6a408c78a6843fb9df40a1b2c07f34e3d50c6e1f21c69a1639e9dd01de8e66414ecb325d5a9697c4b804bccac57005119af56d9194bfcc3f2509782f2e28ae600995c5c5778ea546dde354128942a2bbbb2bcf61f6eed54dcc497bac0bf20536a197b7aa85dde16c01e3d06f985e5e38e83d6df7f4207627b9923ca56920ca2a0d5bc2cf73a5b3bfd153e768ad7832d16599f223aa41f9ce4964819ec440db354ead2fb56b3a348bd8018104e9307bd1f918ba49fa174607890b77e73f1fa40d7c5d554b7dce2f33fa475f9afdd3a089030ef300b23f497ae3c14a8b57395e6701d175a9c9a5706042d2238a7b339ae872c36f05e366353870ca3fd6be8d8bd323fff022e5733a9ac31e68ea566e8cc538e970cb35f9267516dd33378bce225961b7c246bdc9cebe9d6448d0b07703a49736758c4f23e51ff2803be121e725e78e2f2a697e28c51d342f2478c07d9f202f038b44dae7d7ad4101de3abbaa043d76ff7d80be9a0cecaf32d159af6b4a502b726cb8d1e8e4e8fa1cb6fec04469b43571976c1576219965c73318d8701b0ee34b676e4781f519f95e7e6f74c99cb275bf71e117a480558e1292d2fabb61bc319d21f48b567c4ad459ada2fcf873330bbf676dc20fa867de351665a142c96e3764a53370f52c90b72dbac6608700fa6de7f2ba7588f9e0d440dcc0a554fd5111304d83206c6e34bd8a82d6a05a9e9f5d377726e4b27e5c188aa3083a15d232dfd8dd91f2fcf781b266fb49a19ccc159dc11e8f82255db05bedb61b49d2e1d9ba28e8eac098ebcac5d06fc736874fa12b8c2fffc97130007008990bc2ed375fcb324a6edb185d2c451111683cdccee05359f8c5301b5a7d799d6544fcb6d7c56800efa2dc265e2f3e613f751e3160d3e95460f25009a5f4cf922da577321fec28c82ead85b3a5a513701755afe09cf13bab69e62344192957b3e37a9627dcd392db2f239583d2628cf5d9ed8e528f9a565c7ef014aa66694c46e1b10856fb4399c541020000000000000000000000006cd87e21cccc806c9fa381f91c670b6908f8c2aa7305cede60b1e67e259cfa0a454c0e718a6df7947e04db92f4d03516c046995e0bff77e62a1afda312babdc5adfa5ea45ee100822493469eedf304d741901024859bdc9dd8c200a248ca811d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8ae013a5d9f82ed1712c01758081a0dd45d96facea69f3383df6d8c52052c60af6b0075618fb4a1545259a22f8cc14f6254ea93b4eeb3c0875c436028f77660fe68387f69ea784b385479e5130bdd3ecb2523689fa932ad0979c6b88b5107122f6be3d247b78daa207130f886a508ef4d6892ce33449195bc2420a56d8dbb7603271fe658d240ec866b577b999c2dedfaf0b8b8e44c319dcb41c80ea7f7767f58030814f00b88d849636f2471de94cc1653482ace1c954a3ff901f3e45a3614f6820a0316d9c86a0041ebffe74537b98147fe8838c26c1a81cfdb28067c4a88aec9b765acb18358a7e42d9ef553a4ba7570837d796401340551e673fd6e78c42c714f020dc36a8897cd3bb079cba73ef051e84e8c4ce77d304fb9ec230ed75c63a8530f03147dbd6e98f8466c0bc002cc16e76cd9fd250dfe0289d2d7cf4e4e599aea24a80317f926061a28f8869ba297af82413041d14c4abc09d0d3e0536d49a77ea2a8560229b642c73671e13ad964a5e76e6bab2c5f6d6e6ddc7c5b0b1c6c18180d766d8f0320a108ffc1f9a5cd5e54d9ccd2dacb6236e061e17efb7b92e0ece7a07e4166a579becdeb441dcd963c1f6b7ff7f0f28433f1bf41dd14b49d0f9fc79574cfbcddc4de2643003d5ae78d539181e7aa26ded699feae6427065ded0b522b3ecd2d4e5bc39118b4f98c6084d24c428024ea1355e9fd46df959ec654047fc59b01f2aa5161d88db07a0e17921b6227595a6636e797ed64b5052760365ae8453a03e24eec3aad38df548a3e3febd8118bbe7069ad60cac023cb46d174cdbaf91b527778c2633507b1bbf871cadf8e2403151c29562e7f1a51e9f11e62467e75259450accdb4bc2166e1916c48f115fe46485b56fafe93a8c80b8e80b4c376c604ef30ae4d1ce46f065d84de40b7087140d3604dfea7913ef8b5b49dc9ab276c2449d9323ce7a3dd2fd3cebb90eb76661b02bd0f2b44ba1a918325c0cef8f57166b0a18216da85bba0913bf85f754f3f8cf61229f257a2720ccc7ce89328202f36ef744683748e10001c949d4cc9164a65d5b6bcc727edf1ce96ccbbf390503a529d65b92cd463a7f50c85e652822af18ef7b6b107c12d08485e2dc1eca62b71a5c4d71e1a2f5c64ea0bd91161fa262d50d7327c6a88e7947c906b87833c67e77e8bd170469695ad5b74e977f9378423ac9b5a9507a8dd135de12b4568055dd829780f5caaab4dac6a8b2689e54d93f15097ea91dd631437d419ce9a77cf5a401877992dc06917550c30997640ea68577ec22dd74fa48685faf1002085ac21291064559427d20a650d0e45acfef3d59b68f2d80fc1ac6c082464422c780f586159104d5a6784a0356734629b61b8448d742b915952a694ea6c5cef1be05c73036a250a42967c9b8cb007e375df06e85022046c09eed28d3e8633f34dd3a402deaec9993bbe6556ebbf45bf1a30a2b1f61da6a4d2f6b823757c5c19d8b1d82dbcdff04e3203ed644f0eab6b604e87719394cbecaa8682d1e44eaee634f2f891fe6783044fa8d76132a624130ff076366bb7e7c956c2e43493a5d4db1730d736a1ce85b4e6cfea75844f3d6e759f492446a2315a3eeca2324cd97315ee3f60e33f1c35e9ad6e9a998602076b9dfef9ee996e43be8b71b10a004dc932e1543f1ce9e2c17141bf1f2d5dfcf845c0e62873691cd79be16cf29ac85b394595eb10a93f0bdeb6c7e88780e87037b2360f08c5f4ab1fc6764a545d9fd8f2ee0c2848e005f80664e61d9224828b131811557db7527eba0a59455e3281af5c299dbd758ae4b78c1fd0d766fb1ba595f775f700c3389cb40cf142c3ccf500362caf5251e4342b9641429312e3b687532e77911ffeb185a12caa76c94a73c8fac4421ccee71820f61e99ff3ddb1028f05a99310417eb8d88be2d642da7deac5f9b1384eae2117b5a5cfe4722bdb7b5eee30cd5a18c1344665889df56e583d141b064d577cee88dba617fc05ea96f56abf9ec5c53d1c215235440a9aba664d07dba298e948c2c5f21f0a597bcdc76bf8cd2c2568995f787d87551055bd6fc9c82aa364159276196b5bd9673ebbbcdf64daabff0aa19dd7f5f8873f5c51aa9b5b5293c72d0be8dd84b0cad3277e0546f4695cd6991652fbf8030d1eb31b5df79ac9004cc89f42b837977bca2220f0b7666b28a881db90ae33738b04e6480968968852c40688bdca4f1f4be98aaa2b89d6cad9476ef01402614560d8234ca3edef0663b0583e76bfdde7e31ed75391390fa4389c2e202639db17a46df94a4369ee3a76209c1075a865422fc88a8eeb4a5dec5ae7319ed2eb6b581f5fb0a951148ac165d400c0affd29692cee1c6cd8a1d456a5a901841da0bbda070ef25e799d7448790f2fcf45e995c95896089173d1bc94d675871152bae027d7c1907", "536a52520065ac6351", 2, 334827800, 0, "958a6d651c87c224e86b0778ae29e80c4a65d161d17af38bd9f1ecd8a7ce9c2c"], - ["030000807082c40302292d18a5256ec9feada5b9da8e4606b2b995546c4cc7b80bb39dff2c249373d1000000000465006a51ffffffff84aaa061e777a5da56ec39e7dca6716b4b48ad1a703f5c21f83ec7cb857ea0e60000000009006a6a5153ac5363537c768db8041d59fe010000000001513c83ee03000000000077681405000000000763ac6a5152656384155704000000000163dea2f722d0ed924402e3faf40100000000000000000000000022c38dd18d435b20c4a0da89f913519e19b3a3de1712244a46a8da94b7d6488e9d25fd2d1476fd8bd1eba6da1915a8e66080e0338d330a6d6043adc94f63b05138ec6cf00b71b70aff240116aebba48ed590676207757de852081a14311ca06d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019f47c0eff313285b96921805654d8c02a77ce3855198f343cc6e4e86b4132fb567553379af554c59b7bce9f8375802f2cdccd7dcc23419ffc9b2317fd246d503987b612cdddccb87246f377525cb5434be147ca45da816dba1936232adc78c136f8f235413c570df10aed8873ea5955e166d381d91aea35324ff5ccfa265f9e0305fdf22a5e18d71151207a1978c991337d024ee0adde25a88013aa747f6fc6ec0321895b5ea10873ae8476c28ffecf98f4f1d07438638828eb84cf2ea91cb0d31e0b0296bc3d4b6c42046675ca8e730ddc0df061267e05c8502342e4eacb4be1399c9a50b0e739980676657bc6326a5e9124fe191ee31d0643a7f9b131c8e8a303e602001eb49cd50d0f35059016610e3cd57e5df83e694a6e21eed8ba9c2cd8c543b10323426e52955aa0b5bab361b1f6381f9d03c725e743f2e8fdca1b4e5101d82307032117c41451069aca31b4a3ec0cc09cfc5110247ebd87ee078b87b38f0602a70c0216f9ad4c9b6879cb5621ebb63ededf26c6e5e1c178c97eed82271f40ecfc6f52030fa135338a13a693483117fd25ad0dc44e973a9bd03841de474426d3e60d7d73492b74db48c69d73172d9f7a7f5efdfa96bbdafa9f32ca0fad20f254a0def141222722eec132abe504dfbc7eefbf8036fa9238d22acb8aeed3127518ca469c9807d9c211b29420f8f262d0542bdb5e5fd2f7cde94e42c7eb5841d66020305dc3668f81e75ce6b3cd4728f5742f2bb85e3ec45cc162e748faeafedd778af0fe086b936548b5811aade2f030ce733d0067d41a1831712532e72b294c8dd04e44082cd34d474e4e6c79886d161e138ee4d5d18d37eac95e81b01456ca94e622a2b3deafabd4167d8d6dd7b99f7dc3988b550a8e676f5dda3a73dea95f2c484f10221daabb2e9488919cd862d6caa33efeac792470241e81c8287a8c285ea53848abd54cc4bc940d71a4cba70f369a525ce776c9e88af8011519ab64341d7e621bd2bcfc9a9fdad8e6f1a3859c47adcfd0ef96937ce81bce78a1bfa3c2df11f4583ed7b1b13308266c288afa66f64bf9539f96d06aedb5445da55cd9e4db48baad278a04e0a95327f7f6243454c23f3b9b1029bd792a384a3552edcb5a54f76b7f4578070bfb4b68b8b907a4c36d0a218ee4d84809314415162488aed623039d83f0537abfb63fa9dfec075fe5db1e37c8814fbe65fd9030b11c18bcf04462c079dd57be5f358444a1d71162f6b1bca495ff5b97a60f9fc723d6db633e4bce2bafdad9b9e14e3c9314a312fb646d34e90081b549002bcdde8602469c7bcabf01e226f5e9b159630bbd939d9f957c355216d39e0d8b736da275293a0a5ee7522446a54855f8810842d173c6033d47db5951122bdea18dfcb6f51008e97b5e965f14fa3db317addd5b020f116ff8ecf72c5fc2880ead9e9288334eaf2aaa6992654e010fd45020d621b260e00d8623a29e82afca0d0d176723479c7697160843e5da3bbe754453d5dc7b7b24e43ae0a5c967bfe7c648a0b245ba86b0f38f742a8c562f9f69438fdc9a57e94a12e4dad969c2553d54ad37e5c2e491614652c692bf778f869ad553a8483bbc5b12904d6206018e9637b88298889f272f9428e2b539550606569b7b61abd3d7dc495f27f68af88a8d013fd262253c50b89ceadd8f36bb539e6f101f763cdbb3df4f571657404da9959bc49817189ffdcfeac3379024c0e703e6fdaa7643431eebe187041216008fec4ebfa2e9715a8de68088553b8cc8ad6c63f13817f9119ea55bff0248721e757d5b807b883ec33a75c460d90634c4bea97d62410237545522b322770f77388db66f9e83c109ce582467aa7d2d04bf892e8163e4a383345ff929239fdd2d6d9625ac6fda9c33eca6d5ca9b0744565a1947f460098757679fa14279834720f6b2b3eb81531d1d4c9469072f956af83f59ec091b3bbf10aba62f0acb20c50b9c7dd34843c2697024113a7a6f815510ef6ec5ff7ae65d94f957b1006679c31d9fad64ba58ac2e589689f6cd9a9da462b2e2313e643f688f8feedff5df86d3fcaeb8046b82fad4541e08d0b6eea550a12301ef7d27ef53cc2d0cf237856679908787bc6bc47eff13f57fb75afe5d7164397a01d94135f7c4f458519f80914aaa577fd663b06011dbd5ca984573831b94966971b1efda69d6f50c4171e8b2d8803ef4f7f9a488b90cc764d6b4e394904fba9d79f0d91d6de941c5482471ed834d65731550f337229e2370926112a30323772ba5c3ad5684427a86950542a5ecf0887e0eb6daf16b00000000000000000000000000481ae0db7492c5c42ecdcfeda9118f240d14e8f369252889ac6309e88c21b66c9368cd8941105378c34d4e111dcbf9af792702f1168bf265120eab43ae9418ef7523b257d94a10b2f54e4897a2d0793a5711eece3e49aa3c3d7e410065bcbd7300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f751d9663ff246d10ab7c21d7fb746a12938521af76a5b809c2b0f942e62aa173497f8a8e5b07494fc8b5d12da3397030774d0990e0eb1c239efe782dfdf5c127dfc5510a1dcdcf476b1a1152794abfc0b7ec93803133d50e7b53621c3656d6afea54937ea35add341a96b30a86e82ecfcd0db833b22364c38b10cd8cddc8c2b0207862db43282b3cd82e575e59f70295d59037d6be2c019302a078f0b7de4bf1e0320c18275e206859c2c62322546d62000d6106b0eccf27982455a0a25ac7589240b02f23f136dcceffa400aa5d234555c64b927a1750e1aa7591128376bbab0d0020ec427928a9133b17dc16f12c5ddbb02a69397a80fa3687f9c6ed6523f6bcbb502037fca9a330ad41e13400738e046f5d75a4315266cdc574714489734c52c82050219bc4eb516fad79ddea45fe4e06911687882b2dd557ab8d794f204660d59fc15020e45b6c5638eee9673bb17b5acd9388264e2f3c7b68603eb88054197e8cfa357032c61bb5521bd961af02b0809019b5120f21169dab152958367429b283a198920030b12d0d81004f29a2eb5ee12f7dbd44c7e7c16545c50c495bfaa4cc852fdc2c64bbbc366b6f8b6c2adf54a380ad80e700907a6af7600d837cf13a3507367bdbb893d6633fd971ac5ccb2f917619c6aee7011c6df0fffb814b80cdb3ea883a3d5f0bedfe7d90514fe81c14d97f361734f5e3727c277914b4fed5f85e5cd5f998e535517fa577e203322d490c3ea0da05be84953c315042232619c7b56961dea51bd7933792989ae4ad04ed9b6a6f4307fbc5f3bba78e0d668b3036224774860d32032ef23dba36ca91ac48106aee8c5069c5e12611b1376e9539d2077340be1cc9a01f22c896e623410135125cb28db0590b99fe0530b54b9d0440da1d035687cded65bc35b7e7e2e60cfda16f278a5b265937521fb8766d38f2b037aa154e67fbd3cd178a83a4874333bd597293c639b4a3fa6262d7588ec02ea49e9b7b7a979bff7d291f4d6e013adbd160d8896e741c4b25d5e6b1987c5fa264788d5f3355673dd8e0642e181f781660bdb7ed31d726242f3f2b220c85cfbaff1d52b5ac8781fec3d4d8bd277c0d85219c0e64925efc4901575eb8ab6757395355aa5e3b160d61e6911448938a13baa6821b9946bbfbab98228f0d2f5e4e8404267b11dc7b7bc1359e8174f8f7191eb40d7b42824136b1166c6e5ebe9e3f581557c98bd79793dd7edaf13d24dfe96a49423186f5de24aa1a5a9a30af4360ba835480649db6c1540fbf33a30407f019fa16fc3e94d4c479c65e03f658c68d0fc0d0ef02452ed6d701f7913129b73052dd8185044cc6d535fe68d9f7cf30a3683eca6b87cd9fdaa0502f94994bff830bdf0bba2c8ec4c80f0a0ff9b8cf4b928a53f3e199010d0859b35967ab35cec22cee737a6e72669615a30a10cabf6093f4d775e968737851a3944fd9ea4899e293827dcfe46fb4cab3639bb4b9f463d5fddf514c1e55affd0a1ab9b973b3eb6f80bc6ad7c3b4e7b235dd90ea1eec7f9cddd554991c47aedd1ef03a7508100457c1fd9c128c0cb3fc48028451576f3f68d5d948d495433adecd3f40535171e31048e1c4258ddca5de24a6438e75e5fadb647eca82c3a7e21e9172b6ff4e2cb61065dadeded63e52474cc7a5b09e2edc125d3ed6addbe88ef867b30a96b829a16fe3ba4a2549b021a72b6cd3e2602268452a512ffe33f3e1fd2fd06b96f8ae7493ad8e5642c82e6c15a3f88bcb1975decb4802b0eae51dd721fb6b100f745530c59f76824c9c934a89c467febd5288d9b10791e6605d26aea7ad75611481b7a85d6204a59661ac595a55554ec81896a14c5c85ddc70664dad4c90f2c84a561998ff705c7112c09d947311671d8bee53ad2b739fb922beec6a462f35537602cc0cd629f929bb72492bfba8c5a8cc4fd2bfff2203a28e0e26a353821007ab4e11750a313cb6cdcfc2a9684f2971293596eedb3a95796d84f24027c574cda0f24baff36efa4d660367e6b73884a4fe096475a58e3e395a216866fc1de78c1471bc8396cd6cdd28185027257e5667dc6ba548fb5929234e15483b2a5879e9b0f1b096c7df6cc52528e48a21e56ff95d2b92f064f99e3fb84746c8be946179fc2c3f69d1009583a034dc5fa00927e2399f8a5f1ddb1ae5625955f6c301a65fd96421b9a22b15239b88aaa042cd429d59d0dd9ae303b37905fe289aafb594d82e280dc75a0a1fae87b4f0b72bea886abd731beb8c8471e5ee0b724007e47a791acfb52fde68fdbbfeefddd92dd1a2f83fc1282cb37e7b99a16edbf0150ed4f2eb11b9e09ee726b63727122e249ba9603968ac75c033be47e0701429fa50608bf64048a91b6ac51784f9f7b97d4d00923f8ac615f289045e3e1a306cb334ca0a4b13a393b442158475936411b902", "6365", 1, -1149566874, 1537743641, "94924909196c859dae46880f3bef7018eb0e5fbc0cca77480c59b5f2117c175d"], - ["030000807082c403031b2d327258f6da4150af7f1baefd885fb00af3617c571cf26488ef8e6b6561770200000004536a6353d3c40f5f420e3934eb5a1b075192d46872af1aeab9ba0ef807f9b0df92aea4275d92dcf80100000004006500634c24fcec55ffe9e39567107370e4c4a59f054008d7f60579ee0c85144fadcb67ab3e888e000000000151ffffffff026da7c300000000000600655100ac527d32a605000000000000000000a4397a2102c01d7802000000000000000000000000d24b083077ba82f28e5cadbd61ca482dce65453e491710cde655fd28ef6bcb44ecdceb409b4d0f068a4cf1f79351b2a5be31264678445467090338ff86f2e8072095eb6c6354f1196f8b2c296c2f45a5f8de9194989cbb09827d16098a9c269500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000957a82320353feca0b41c003d1b7319e586552f69c19323734387ff9c4ae02098e86e86773f6063062f7c12bea170d6ac761cebc4964a1e76abecf62ac266c3fc55485468e9e5c965652a95f895e19c289ea02055184d2bb3e18fbacd51e1be2c89a0d43efd788c1923272a24ed226e8fd26c58f42df734b62eca8f936a501c803135d26386cd12f5f1447f8addb7759b4dde3fb8dd0a2280845818bc96b2f25a1020aea8d0c29bc6196b26ace8288ad222e7d1df9e948072ef3c191394b6629538c0a0431a08d555e5ed3f8b7ff0613d4ad5f90d1794e8d39e50548357f47d2e0e38420552e25d5a1a570ef86737194690feaa56dfd1824013badba9d382f19f44544022aa522b022d9c5534f9e8e72241c6b2911de39389c9b90656ffb2ad8137c916d0313ecc7bad606cde83e7b3f26275b4a2a8dd5159cf5b9325eeaaba0d9d3e7108d021a82a0ee063ca1a85e10d929f537c539c4d4c45a6457510f214ea96676f925010218c3f94a61875441211aaa171c0564fa4e03f8444d1b4b106ff9c0d2350ba660032951970775be34e40025ec78bc4c08319f600ad33e1806fa1a14d3b8c1fbd8a15d3fdfadd3e04f640d7fe2333e62032c46b4d51244ae3b1abb8a10a52cf6a028cca30b2f6ad9670910e424556396e319ecb7714b09b8e073b37df5df3d399fd74d81a20f19923d9b9b597bd232cd8ef81f048558ef59774ceddf6c4f8ea051a9eb27507909a1e094f217072ea72cac4cc7bcdf1b3951e6acbadbf7031aa7aee7109064a6dd70221c9392e2c1f6b611357dda51a263329fc697e098cac238533495d36716aa3f29a50fd6e33ea973c48867740fcda5fceb2ebd770470cf248215736f60f56b7d04160660e8dadb3e4eb067602f23a816c6bac1da9ac814a4215e4c94b31556c568149c464d9ccd1510305fd83eee040890afbdc93b41c0a6a1a3c5c531ad3656f98ab4350d8192a4e31dcf9a5466a7357c6bd19f54276f9447c10664bcfa9620d32ec609adf34214b677ef5d43b426271308b82aa2a056a7eda47d0c9289f857da267059a87942045330e3bf5ee7416e2a813d3e7b09d6bc80ec113a1f899ecede36c515d623590d4d4728115523749ca645228f857c54a0bff030dbb45c367c7a95a439d76800bb2ac1558aee33fc5839af0c7203df7a0bee2cadd272aecad1cd1f14105c40ea85ccddf8ce29b6967e28ab8d5fc94cea464096d5de4936f79b737a43a08d2bced0df4885c7bb83dfb7dce21482eb78d57216e1dedbbffadad2ee24892c10a49627ecbd30426feee2cebbdd558fe92bf911908dab2d21aa610d80dfd978c35b17b4145d69e61a4ca5652c3b22a032b511df3de0fbb6031257f13165a566ba1340bc6787846e3db6f1399ac953305a052a7029e881f27c36045930ea0aca40335f4ee26884d83ba438858507ff492e346b30794f997cfc07aacc56eca6d7a29c8dead2bd47bc372575ef2d566416dca8a93e7ef9ff46d4d34ab232a0979c9b4a811e131bb59674f56362b70b88c50823ea795172f8c8733b99e50824b058025b52b449bfcf46c2230077bb1de16e7ae43f6d06374489d085b3d66aebf2c4733ca66736c6265d05213b52894e2b632dca1b36c2d38ef3c28a6ca22bfdabc37cfe872f70719042d407ef7a813fccdf5b03d84704ae629eea4e2912916cd33ec773c35e6822494ff96daa0e5a8ebaf605adc3b8d2228b94764b387d2e1ce62cdebcb9580b56ff1284c9d0adac7c1ab40f2394ab68e62a3e409575d0dbe0cfe937031ebb5671cc3ee6a1c29e3d12830364b0c1a72c6dffe1c3beda736b6c7d019febd46a305825af876e931fc080b4f9086b361d2a04d8db75d2c5cceff150c4d7679a5c2063590124412a57fcd7d9d90fc51824bc3f1c19e24854cceb9f060b464400bc6b4d34f792ba22cbbc3a8ec8de3c82d4034bafa56093275df986964a2265df77b8f6fecf70728ee43921cb4d24fed6e9efe0bc693340df6fd42aafd35118d87d34c04a3ae8dc39015e538d109ac141a4957e631ea189e3c216e47e07df1a489fda647b1395625a2801414a6a91764857ee9fcd00d6ae0ce0f1419e5d81e0bbc3650c9617acef603737cbc83f80fa3fe1425ef84384ef211f4f2e60f77dcba08d80da30b5c0e995343901359448bb52c78e22a82729b0e96044f20642fbabcaa4f9b7ca11f84e397174801089fc9ea4182361faef141dc52fa9cb869fc48d4dca937ef00ff7463a3a85c20701d4d00084590d8e788f5f5b7997153b658e6c28f08529043d197f6404000000000000000000000000e2c0357475ab912e419f10bf8aaf778d9b28deb2f01254a50dca111b60a8da7b50be672124cad0a4692696f941485923167ca3a1842919f602319bedab0b43e7b036f93c3135d554561e88b137d7925675b513bd523ff8027cb1ca56a28bac4c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083a5a3d36bc68c260a82b05aa68f67b483d06ca1fc973a80ccc5eb82f98fb3617d781b796736d1840c22d8ecf7bb6864cb374e4e815215ac33793653cd0ffb809c80648ec5becfabe2442f47b7cd6b9444f19e4f2f67e8019c06b2b873ac9357f1d4f1bc012657f6f9db505551c332f6f6f65d2726c080eb0f6859810fa5a52203177feadd4d84fcfce75062b6f470c362027323acf427eaeed52706c71e2541b3022209f05b0c81e5ab3aa4dfa748175092fff8726378829b03c1e66518c29e9c060b05f282f29f666918856f760edd5ca2e58460f1037cb5a6c05c94eca899f3de96f4ab99feae684ee01285933173cf0abf314cd8a8431bfae8dff9ee492b6011940203dc0a3a1c82dc8a2b6d6b3d39263e19bca3291086daddf41a0057a32bb451400208265b0d36a559ac9597e5cb2d9ef04f01677271916dc7c06944fb28bbae1ed4032db4c225ae360517e630ae7e2949d7e7bfa3776fd4740d0f18bbebed6ef7084b0303e655e15ffb457fc85239df78dcaff785116b96df7c3febd66edd7eee25a5100307cf485927351f883e8db0bc01f8ef06b78191b25bcf189d3cd97ef5b1615ece1db10d247f94d9e81e39ec2930c96ace0c3797a42655c3cc3105477103ad3e899533a51eb3a39c2533532a05149eda5831b41df901d12a9c897c643295cf5725bd21557bb5924fcf4b6c2b9e75be520a45abe0d799525bc292bf851c52442e24220ccaf79d537a02fc24c9037021c49fd4d755b78130160568ebdbd39e7a4bf76266ccf672eb66944046faae28f0ec38563adbb051c1da31c5b767fd929e6cb14c79b9f1f95120b305c174b65004e31efcaef8ea77bf732fe4b55b842cd757def10332c070a7b04e450318daf0e4cffab404108b491a0439f0faf57cbb96d533922318af32937c7963b4b76205de73b0587c3aadf5738af3b805ee028be9fce13640399a4654863d4b2860ed72cd65807d16cf54761406fe90d83e4556e69cf269b2b537703b7e859c811fd8e4f5d04dcf49762abe4fa03d57ed32ded02f31b2f6eeb0657c6496bc7666a106259046e9ecf5b84773875c546d67289e38b4d22ce51b6249c9c4406d33d99a802bbfd046c0dde50f8cb8e9e75de8e1da2327100dfaffb8337a34361470d822743aa669475aa4ed239b668e492aad3c81df3061287ab411f17e681cbc7935441615cc519576bafc663e1dc35812de1e706c0ad1dc508c3968fd1881e455cd5c16a04cb6dd9ec287087d2bd6a3a8457a7df6b2624a083d731f6e6a7def809aac9a2d5b46f959891a4216544ef9d83e161a2f19dd88f1c02346d15d02b880bc22bb9ab33ef2d1d2e9528831c9804ac21b0942f26331449f90f5f5f1f18ab52494f4d702d02452e1e2ca36b235cf76f7211a7de9112a830f3ca4853385271ec1d9da86f2faa4094f090ee5e413c0ba5742226563410c3b92b5d50e4d9686b853d55f527cacfe00dfa4ea0d0a49f05408a25f3f75cabe0fc4d14074d070735d4a38196f176e36d7e2d46dcbe608a73df7778140b3ca11f55a059b59b4e3cab7fb1dc252852f6862323184bca819da7a0ed1e8748e04585a2841dfa6f7ff23a0bc39e3177e4ff5fa13438b1b03b31543272255c7ed3575c9d30025e4a4ce2c18c1409cbb4731e413a780e077ca7f048ea614c0521803e8547b7f1c65b406f6e5ca8c950a22a0a2dde5b90f0203fe1c2ec6837362808fdd7a846e068a88af4db255132e8c6f78e695c9ed21a6d47f70b7af9590b78264eb27b78aab5b49f3d71a5ab8a23889bcc9cecf0db9f1a3319f5ace55c6965d7c787642c11b71ae7cb7f05a6c5f5aef5d85800fabc68ecb4ae70d3f5546c29d52e0c7ed11eb308032ccf79577e9430574021521502bc52ea05df2f81eeaf761af7a53486f4225eb2fb58b576a4633845c9f9982615b005ab7686c1ff4f37d8e025277cfdc4887675d67a9fd408b2144ea1cc1c79c5c79e10ef559410b8c5ccaa74f4d269c393ca594333b23e901fbcf0d413e61edaece7188eadc0a8aaee20ad2eeceb270a484f760ec7956f1ce683d606bf85d8c15541c13c9545613f61c2f3c31df87d8200847163bbbaccc9cf23cb08bf459f48b2c3c282561b97f951fe315618f921022687ae181d38b044cd15999956bfa7b6f67732e9440cbf801e429a164f59d7be3ad882ce796ecd9bfda5707ec0b7223e74bfe9d0ecf534367e4ecdb9aa395fca1456b36bfdb861e689f474ad977b677fb56cdbd61c04eb84bc2c4513d07383ce178c7e70999c797d26f0780cb88add7e37cd0aaa453ca2464cbad62f13e11545e3c1c0b44d8fd495238b5ec0760f8f7e5f50dfdb01c3661743603ff712507668f57561cf45ea2a9d9128f2720f95c946f3fe8391926fe567a02a61128d825bdfb58536fce6904ef1d1cac3a3a710a", "51636a", 2, -208292302, 0, "ad6c2d33fb201b23ec2cee4ea7907f26b8ed816355be13d63a82f32ad224f519"], - ["78bbde1e01e0602cbbcd346b1fa4144e1f09e4e766041bd4d8ad47ee2c65f8aec54f608a5901000000096aac65005352655363c879593101ec224f04000000000653ac0052535200000000023308e10300000000000000000000000000a19a0eefd6a273bc14f87d1ff6bf94909253001d0476108bb8b1b6c09003d2c8a607f7f688898e15e47630a597d2a8cb492eb6d73e924a65aeb215a926761cfb72b72fc61ca2d0cf97b6efda33e51281f4950fffe26a4a4c8ddcfa87471472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f83bc9e9c220a5f04880292534bdf748b3468dcfd3263b9d3cecb79838682fe736daedfb76c5ecc4c31c816562c70d4ab4ad0d1ea8f8d0bf838dcdbd11b6efbba93e105adb1ccf42004e659fdfa88fb4951b6439e6fbaec3c70f2339b2881f2ab971b681bb21b750faead63e5651d701bd7848ed34015f3ce379c9b0b156184031b76b931879fccc3ab1bc905c856f84a06495e07aff5c70b962d74365983caf4021a3b624543bc802c0e61f98c9573654ab9e2be05bc661797e76d283723870c3c0b02eb399ac958190b82889e40a6663becabe8086a59c1b7826c13f47b9df0fb276669a18479fbb610966e49a731bcebd7fe9cefcf98dd180ae794cad7a1e4cf3403234bb2879d1df3f28ac1663a654ac4699347a423626c52a10edd319c164effe20209ea7869307fca39358500bc86af66ee175d9ca805ef794ca28565be445fd8da022892b2bc16fab9b67b48acf76bf80c6a23b1c4c62e67b7f12c7e42c8700b110c020bf6ed3812ce9cdf3fcc5e1700c1880aacce0bc79cb879cb50b4d347d41091d8022630c8d3dbce9f5e9fc9bae1c3126d13876580f86a52a414858b30a564d63872faf49e19815306d7e6f56bb2eb5805ef8fd445320a95ec04664cc635a11099d3206c3c53bc321ae4a5ddfd0270d10036257fac1fcaa694542bc427d5291c10b99d21f0b74749e1ea381eac75f3629bee23724d81fb119727ae693964645a0b96856f45f3db9111095157d2abedf3276f251604c0a55a638479177f1f9d765ed6e86e35d9bc30f27ebdafe79bc43d579f01fd5b97ecfb1aea77b5563afe669011762bacc30a4189d68ef7af062b217c23e29c0a8c435b82e46c0f7d40ebcb469028999473ff6550cd66611cb088f1ba50bbdafd358a6315ca2047908802e754aeb95040b8ac5d0ca0bc5528e9d7e676ed543277d0905568ae2698ec52218581e0c968e76c55ff79ee08e808384c3087488848637ad7ba6790d60682c9e9ca23938e02b0d5fa5105ed6bb5df771ad3986e59630118bd2e39c83ff25151559e92ba6e806662123660590b7ebcc15ab835d19317a941ad346658e5f267f95a34e6c80eb4253b5de559b19fe02d8da79d62d01f02e17dc24e1bc119dedffb6c05bec3e1bda638ff9ebb2049a0a481fbfdda16b9ba9db35fb95fdfe58fd2154f69dd32b8684badc9fda47e8621d27cf6a1bbc27f5c8482175704ceda917a231955b9391a21b27f598f6929bcb6d9d3c622b62d8b34e9b0a52274aabb661b5fcc1b38047d2d95ad3d9651bd1e13866b8ee454fc28ce77991411937e6e6f08c7cefdd289850e0a2a8966a031ba87ea856740583f3a3816632a35488565ddc1038dbe4067ea8ca1ba1c707c71535fb22e03d58f94d26e9cdae31d3697b49c9e58e1f96912bf800ffe4f1e66fc3f7b4cfba504a11f842719c67e69160f60cd9558dd2abc8c2f9901b77397c54792cfccc0b6e3a59cfd0b4f7af045179651683231b3b6f162f2d16ff09ffcf2f8df195f16db4d3f85ee2c19b906e799dcab8a1bb7692cc50c9102bbaf3bae8ea26c90031c6c0a4f1e33618783043d5990be7de012db02a635dee33e6680decb5d96b46576e58d96a5d7a60e09e3cf819004074d252f298be8c0a0791b9a3d87878eaa7db5fa8407b1b4d6b97d229fd0ab9b3366425d8b918259cbba49d61ebabd439066998a7bb1513b75d090cde0d6a308fc824f4b0a92281022cdc426dbf6081c5828f7bf7ced6c70162589bac4f7a22d7c8a48ae67a81a8efa9e79fc156c15bab6cf5dff2194eef693cfda2a6dd8fe5ea3cab588d2e6be83bfda28403189a9ff3e01b2083ce5bec2fa2c451cfaf9580dd963c40307ce96ad1c0551d5aada1637cc11f30ead5dd8ffd4606ad209ce8479520d18d2327f932f400b9b441fa34c1efe13be0dc60914a9c090144752f3e9b7b04aeca6db1fdbe16f06791097c46c4601995c417be2f74b4cf830684ed59ba76f0d3dcfc86ad15778fa1a40c4c4a259ea2d9832b9d254aec07422fd302b9e17443a90d58312d2683d96f8d9c529b8f814e17e7ac9bf7322667c86bc06fc678dc316c91978bc1e5c12512655e00f585e1d33984290bc88f8fc92ed6a3a83455f160755a9a2b61f0a62830f72f4803c95a6794157370b46e429665505b6b1e5a3e60d8e55e59f113f07dad5d379f72445dfc0dde7084a9f293549b2a2035fdbb7b83c585bcff58803a0a09b248941c12e451cd18171221024fc092e240beaf9327fad5a17a2f1bc180979e036a360b016117114265aecc67c40000000000000000034a8b805000000002df3c151085d72f1d0f3334b72a205c537e9de15272ed078d0e8f44f5db0b3f95adbe83c5942dae74fd3c053bc450ba4e661a606d73a1160a3ca9fba748f97eaec1407eda65eb447cfabae530b4402171bf373b9eccec7f6f1f85f5f4856278900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000856318d5394f74f01a994b423719203d7fe7c2f7752e5f8f1170475313719acd4492d4ac3529995e03ab8a2cfe84edbff841fdd63d205002204c31d1a6bb971c33f374b57ad28a768f061d9b7573b51cf9700315a17dce06a0ef034903d8d9a5003362858e15060d3aa25fc289d0ea1090df3dd18f7ee008653d944aa6b8eccb021e9dc7b8ce81d167b993fe43a39528634126fd6fc6dfb22d44f5ef1a3ead908d0322c0457d4602965899e2e9c05d6c6b172b8c91aecacfe30a43a26c330b28f3c90a02b34b87473d86f3494a25d906a3df4131eca67d4de72bd381c5387045988c3d951d4262e2b99485e4a41ef3c629e6a8de65961ce93fd693ba292220e2bd79cc0203763df0571925e51da7827ef4ef2d8fae8712f7499c8fd2540cda55f42ab7c0021c43a3dcc62d2c3e0f63031e5d7f4c218d6d4e1f5df7b13c53fde26f49e9ddb8030aded2d3b0ae076b74f271ac18d43d2dbe857c19e35e0224595dbf7b0afd1aca021fbaecbb79fdf9da847aab80817222782b8f3933e2d72655013d7fae12cf9c9402008cb50ae8eb10a78e976873fe804c08be4f8e6a90b074bce6c762e84e31ccd31af2dc6710072596eaffc8eede0a3825abd0184c1b836404e0adaeeb3c04a5931940e727699b36913df5c072d23d68aefa3485b21a33b7d6cd28cdc55da0a77c361ce6c46f7977041194b3e936afcbe21a4ee96b8fc39d396cccf247b85c40a5e3b71919f3aee568c6a21089a6b8e568e93b041041cbcf33ee29578c7c7f71dd69be7691ad6a418a1e11c398d4263b857519dea6745e7467a6c637202050d37e8105e184e21eef2c3d2eed525d962da930c6432fe2d148c35b09561cf419ca4d123ae959f56527677644310ea1de65d2a44a92422b70438fce2d06cb8fc2a641e10e404e0bd75b951d30c6910f164de5df782e267ba845edab503d398ea1418e1c3ff7356ba1f135a315c8413ec054331a8dbc54d4fbe97b0965b4346c3fab05716a3a55ee5f6508586b53f33ac48ecd45619fd2404da8996c405aefaaf32ec66d73df07d909698056a39469879afa04fb65d522530df886da71cf6b22bb81e0229b8af9ce4d99721547b10b398ebed1a4611c8338a76049ea0c6dd3cce8c82ac111fb15d9e23e28047c78414c44adf41d5dfab2c376e68d96474d3b325daae6f0b709f4eaf57403ba551d2cb551ccfac5a3822bed1214868356bf28b228a29d069c214bff5e73486c4f0ce5a08653998fe1e043ee34849f3c89e971b5b89ffe74c3d08e21f359406099b67dc184debdbf444e36d40a732290840763e3385262ec333811352c6da17ce1e4298f9ac8b4ae5dafbd3dd49a4164c6e427ce2e32db7ef54c117fd7f5010371e5b405675a16f180573deef4de486e9eb7462ff42c561fb51c7b961cbf7c29597ee92d9edf38750c5935ca9e62d2ce429ed8d106e635386560ad2c78cb47085c4b3d3076d3f058d911287a1c0baff92d60654f5e1116a2cda5da90a92d9e164939942ba1c1ea3fb3d65a4a18c63b1b7fce88adf89bc7e7878608c79a702218b828bc062e43fbec37fd4acebd83b0a7d2c97bfbf9ff3446aa5f46bdf20bf96a9525974fcb803ff7befd71931f84f4298c7b53f3dcd16553a3e11cb7b85ae57f51227209aee308d59efb66c3a41595dc9935c4561495583f0c3ba6765c753f444e3004265e9fd2f5a72795ae9386cf9bfd99fd5b689408f2e8df9649237f15d17a495daf08ab1033a0234870d09829ef1d3db6923385a80268efafc3f57bc3131b3a68e6cd1394b1f6456732cfcf4fc2f330ebac770943e808e11efc57e5eaf663ca42ebcbc725b6b41d7901121790ca031b750513b2dcdb50eb4f92fbc98d91b5a6d02db99810d17adca52ac4965fd10360a16de73e00aea621d466f631819cef210cf5ec9e393c6b5dc8690424dc4de54fee42c75c725414c139209ee390e409f82cbe4a1610f3c966d48b61586c5c1f6886641603ecf0b8361b223bb75a8d92ffb63b27ee5563eb39eef7e1b54804d9f3a90e74e1173a4b4e59577f94bcfe2572a11bf8993c17e4d74c4ed29a8997a78ac9b4b19f60bb827ce70d86830a83e3f1247c8b63bdc9dce4c78eb66d7b5f0a974b5261a1db348066943367b900c620bb7fc2e8b70bcb28f631a71c374fdb6baae2961dae8ce5e8c123e5a78956e976d5df11ae7963459b83bb924fae4e26f8326bc00cbc3ee05b224494dd2f9731ed96f130fba4c1cd4f7e102acddfce399504c8aafd7bad2019ca113c0a3cc7332689eba97ea792a195842505281dbedf62f16cb69bfc76717a6f546c4effd72a8d27e89a23de1c229ef864eb33a6ea2b341f4f1cd167da50cc5dac41c82bf8a88c751201224a957883fac0c6b29651953a13fe3c9aba754214fe79ea0d3c31bdff5e14e3d9fba11800", "5253005251526a00", 0, 708642561, 0, "39f8dff35ce9865092c41692a2f281e1f4cad05631b081ed3e75a49d9355bdad"], - ["030000807082c40304508bfe836af574906f03324e4d1a779eca1ac6706b280cc054aa79ec0cf7c40d0000000002ac65ffffffff6472a50deb9b33a197cef791e4217f7a002e5239ffe8ab4ce3ab1977bf9e0f040300000003530052ffffffffda92e98ed1c63825b4fc01ef5fb86e5943fb84ef9d79d609cd5023851b774b0500000000006112242d457fcd2c7bcfad23bfeaeeb93cbba220be418a79b8c270c8f9a91ca820946874030000000153ffffffff043b8065050000000003650065652a7f0000000000096a5351520065535351fd71e4050000000000efcd490100000000090051005263655100006e85e5d20000000003614cb102000000000000000000000000119de3ba84294dc843657df61f016a23cfc4e9845701994f238ee4c88966ef96f6d7c52e7eccc5bd9ecfa1b4119c9afb1233e1ed94c239458130a469a2a9e60b14c7f7b40c9507e475d153b2a368c3c49a21a2849117ea5b52a67a097965dcb5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e56ca13941ca22df2055df334c9363da2409dd8f204d72497c99ce2a054505e9940d8a84d14697f53ae006050cba59437790477932b618091d1447c16093c6d78fc4fd27b0615055522e4de4aca63fd8a2a272f79132129b611610431c59c1bf7c3aac8eaf855406dbd91c8dcb7f98934271b491589c5ab346e118fecff8b600308a3e25ecc6013519e58a1c43c12b466767ce60ad1516ab28f3b3b9b85095363021a002400d89e39fb019e64d715f7bce5072e96f800795b32e9b203e2791c336c0a07ee4a608c6012d29937a1d1b7458c2ef8391be6476afb56b6148698889585ece0b5cfd6c17238c4b71b5cbb07eabe4b2b892d8a9b023ef18ceaabe74b490e09021a479269f74431780ed8e69c7cf5c4e1faad47c658f259f376389f240d7a87fa030106727ce26e486b0b6cead26c91a3b69aeb1fae44b988b2adf7160bd2ab4f2e0209ee24791837d64b2af0aec86e8b66345ad4c6802887a1518f130b08f0c5c7f60325fe47152fdac15c32e51569e404f69435e93e2a1d3afd7e03c7a7f4c97fb7ea021f9f9c648953eec1d0132201ed41ac1034552d3db52109f9f167d06b656d93f9aa801d4a4e9f2b8fb1012a132811eec04fc68100bc043b346d801343ae94ea29402e0f1843a8a0ed6b22ffeb58b237e398908da742cf89e31e7fdf2e40b02ee9c803ab6ba1bafa08295760cb2f414290ba611fb10c7d6149d2cf7b40955f18e9f5be51cae734298f3241a20d8aaf4be7aaa67cf61e3e04ddb4bb2745a2370a8ce7e33f754e08eb3d1398aedd83931e2da6122050943c23ade64b5607a8fbbafd86037a423b446eb8daf1c6dcfdd609508bd718ccd35ce3594339a1b9dfe634abbb82744b04a740559ae86d9e2678c3c1123ed36c3dae81ab7fa7aadff933e6acb685832b5916d0df673dae6d2c3c1e08a8b3803f8a359ece81a06ea4ee96a0d86af9f8c3494d56bd62cdd6626f8ef5c2c1619a6d6546ff684c89ea8aee8bcfd057254320894dcc995093e05db093d938c2f16c6216d5eae4c7b44b95f560b03e5c34c05bb605e85265c0b227313d0f91467641bd095e3217d3d47f632a1eb3620b1012ebc428ebf4e8b4b645820c23241362668ade4bbe95f6c63b7932be7d7193217f7de34c9c561bd71f3621387d688310052bfe9d86ee0b0b0680babe95249d992631b45423aae91551f8c958b3d1e1f24b1f85ff754588995a10448ef9e7be5a74473ce61d71d13c8d4a1e0d3abdd15a9b3f75eef6247f64774f186520e2a7289fc36a07283391bbc39733c615a28526146e4c0f94f713933c4b00d39e89452cd7075c0b9d9e19c45821f34cb4f7e4a1d9e4b17719d9baf7d851ed959451773530792bd857ec44d2256ba8c47071805f8b1e26029fad20f976d2951e149d6824657e7ca933cccc20395bd06c84c6ca8049e21d1b8cda85425703929fff8795324b28685ac3b5805378a40873d22ff68e9508a89fa9b268c4e99accfb55a4058e87f3a0cde29399899a910e37fb509fed79d67cf5839094fdbbba4dc7ba784f91fb35f794b9190642318572317a962e45eb64e25897cd50915f1ef5a3c550f526ee7f0ea58a6f1b30435625d79e101eea21289e030e275d93e0baf57d3f7191f7f6b8b9e49a7da65caf4f027421344cc385deff17cffededc56fb485852a6b6cfc1b0f31adf8a88deb5060c3ac3b8cafcdb4e962cfa6ed95e9436c7a4e556e2a8fc0b9867a9696df36eb28a76e7778b9ef1fe3a74006088fc17a60e0a4452903ff8d05ec75f6232a118c65943b4d74559d3a520a844a0f4635cb01983b484faa14a1dbcd31f5ee221368a849f0c18156bb69255add33bf08750f98dd8c0ffdd4f25e4e4e5e6a0631bee348edf29d90124576c86e11311593316d22a5eab3e626482c86e6e1b0cb20bf307e4b4cedfb182beb1674725ed20757ad4322951aad2c76c4898509d9f13fc276b1779210431176f80505c55cafff1aef424f600d1a077b1e298158288d3e172e3b46115549ad38198cbba88307cd5c6b2ed7a6d1664b897fda9020f9b3c52dd567405a096b9f1ec3d5b29dd629221459420f87cbfbc04d6f018ef3ea292ce743db84a2c381a35a8346de0639292dec699f998cec8d7daed3c2b01233b71a3322d6442ebfddb56c8179eea83f3ae1d0b8bf8b65d8c55e9b8d7a48d607484b7d11585a83509c508480b5c6b339cbdc40c99a5c7a2193a276ab64c0a5579cbd08057ebde91afa1d915bcb2e36e2c4d8364d467e168fc3f9129542c428017af470e077205d5631582b2a37e010000000000000000000000003aee5f74e603809a7164d1125f7b7dea33cc99b940ef0e05b5951f3302e4983ca29c5d568de93ce143d73666c6ba06b2cb67d18e1131fba306fef0b3b8075329fe349cd308b72acfbafacf5ec9655e077e3943a93bd5aee721727a3e4f64ea8500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000563b0dd95674a26754bb395e95bc13db4cccca76a86147e9c830a846b899105e618f5d82156551fc60b4842abbee7338ee5b5fbfb0f379552e7162a727ee58c21118cb165be98d708fc62adc84dd3bb12cce8144974e062b43017f03e4b77d7b3b683134f8c305207d2b7d1e5a8cb73fa57d8906d6852f7cca9f4712a5a9ede6022bd76b90d0080d748c44025ac0c092bf7b5e4183dab0f2d954a7e440238a3c19032ffa99acf302b4b0419ecdf97db6231636b6da58bae9ff7fe57c7d25f018df410b0305b1a59b0b8a7dac6d51b62c72fffc0676d6aadb5bc0fcadb54be9d5297839d599b700917298b7d22f58d950f3eeaa73786fc0a4ac88101e6954ae3e8b7291021a699fcdfac227a219e64b9f256693d848dde3a9d270f2ac9413e81e098d3b6e031f03179506437862f185c2d82ac3d89fcd5011c1a2ddf3a50790491508243c6f030d2200db53c1f572f481bbb455c1e29fe345bcfcd22614a5b39a6db45c820d4b021f085a37b0e28da243acf9bc3583a83f5c57706373dd89bdd681aeabf60cf2e2032a776c1f08b9d84f79917cc88892ed4deaf577aa4f062db39a9c5370795742092dc6528b12fdb021c6ac4a353fbd8afa422403a754414214a11d576c24aae9337fd3883142f635b92c2f6e70d7f8035767ca5a1930014f3b776226b214581cc6e44964385cfc8699941bbf976898216593a41d586f4395cc74f7e0a3f98676b8ea7d85cb16e605ebc13196858ff187200446487ee8f336ef96307d97a708792235fbe173f8fd1ffbdc78aaac170481bf3934ec562e9411000c72eb21474d54c447e5a04ba58d22af8e8a6a5aeffe83c8f0e89888a3406effac293d1dca0fef51c355c61a8a0b8c2981de3723088f8de9da0b0cc9e9191dba698982c58578bbdb21ca19a41bd6458b36f52c268414c461fd296a04c61e45acb927f90c0cffdfd2ca346416140c79032b2eb0196795dd43ede7aa3585a8ae2294a85e50eca582a696d868eebcba520e3911d10305377c95700b2cf12dbe4567b7d8df3bbc56be4893ff5009d5c41f911520b95c88e74f23fd051644df1e7b74bf2c47ae3831864d5a2cec2d1c419e9cc03b510ebb6ea897efdefd3dfe02fe8b6164a2aad6ab64f762aa4c7b0132e4b38d1b34ab33a0059faeb97ac7a140906efe4edda179e7570e7c5fe88306129280e5b7b687b0f389f10320cb03dc08f00f800bc6258ab21368196a67941dec0dcd20d48515204bd79ab6c2754dfb54bddae69cb3c67b60d97af6a54c028f8356fb72a7fb4b7dfb7f9fad1787ef461123a5f1aab7c0600320b4a3ff8dbe13478d3a75cb757ad16257d1970712ff09c145dc10da8b4a065494ba06fccaf40d3fc22c85b43f2fe027c93add377fc5bb87c823cac8624214588a15679b37f2fc1e216671b54c8c939d9e6015790a1573990325e065247618351815ea5db4f2c8008329f7b02fb3571c156652e747dbe36816535c47209602a71b45e4cd630cb2f195ab7ea524fec11968938503282c3b29b3e8c76c6685b59f2b4a12dbb2cedb80772ec5c819c551813b6d58591785f31dd4cedafe8ea2acb55b68d313dce752cdcec1debf0c50f77b32b8c625cf7cf60c6ed73dd6cfd2d4bcf20c3d681f61e5bd7234d97a13167c7e56e0740b06b0d6e7c33dd42540a8c1d0812828a27b3acd62574ac4475c6c56cf3a8c24352e8110bf6ad5de0c6d29caaddf52941eec41d5f5ed39906b160b6263b20c2afd5cbfd252e797cde0393e21b5e2757b17df4938600b8173e0efda737e8c58045a7451f26e6e55e2da60953d7a661b83d901db0ac57e1ab37e8bff431d09df82d6424aeb8fd91fe56618d28fb0dc63eb8d3a5cd46df16a74802757aa11a5c2d58054e2bd9364195644de1ad19fbfe94e46a990f6d394f78c3a625adab358d6905a62b8b76e4e0abc0c52d99cee2c620d0acb7e707fdf1bb7ee02b9e2b5f0f2e0a740922e02ecca5ead2e7a8f0f459d6921b0afc604c0bfe530851d704721ef89fbcc1c48256084e96e96b3bee4aac3fd0ab7eeadf785436c51d531acaafccac8676318ad709fc248b1803498befd54a318067bce675c3c1392a3050e733a06a03de936ea76486f152bacc5c2c3398108aa56cddbdc701847e99d8745a6017e2751d8e820c2a8ad02ee4c9f4a7c6de96ab4e15c87e4b401c56ff05b4d97ca0b7c3fb609e47b1811be31899decabeda4c97ef0a32abe0b8ee642b8d48e7727c7fefcbc61ca08c6c9d477b243f363ca3c43969e383330ed6d97bf0d8499d92d19814e0000000000000000d8598404000000003e43c3cdd89b9ca9e2c889d0cea291ef9fba7e4c68e11f9ca171e9ad37bcd80d04b808e51e3558798ebfd5fe75b2fc4a8a15b78fe3d27d426f6a34afb4821a42fd275210fac7f7597725db99b0bdfa97c0e63fcf55bf72cd41588cc3af030418000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fc0162b5c5cc1b30561a1558672b91fed7545815a0625782bfcd95b5cde2c5cc9d26fb5572672b561f991ce18187e00564521928703ad0166133893426fcf570b0584ec10620c7fe69d684c140fee58b589ce749278c0a2bfe6fee257f4945158f33343788ffab62377a19176eb957e90b8e2f318180f324ad707cc69e644a2021cb894da546de738601df9940dc7339bc15c52131666dc6690e57450e1c9c9920328fdc87c8cbcd9a4b8a19f7ee2a497e5864cb78c40ca1eecdb954e740ebd7b990a08f153be8079e878a496fe329c714dcaea072ea37985797d82f8b666a7fc557f336061e8cbb6d0394a1f5aba4f2def86219efd22abfa603ece75da9a65805fd30221af2ebf9d48e35fcac503e285d8710dc6fc4da1a7f957ba9d666fab23dcbf7f0221acd0487d4b19c34d33aad9ea3b4d806e094a7396a35c2689530156f30c027402088bb0ba99416253eac0d941f124d8b8a60dcbf55d33e1176023e6716122cf3f0214a6ae0192862b45030327f1161066cd9a4fc735dff49da9c83b83566428e01c030a4b045645946e1430671000cda869d72bb32d9b85f646ba5dec0a945986ee164216f2d146aa35292809edb0abd1cb8bf9144987c92859a86c7931b250b20ad83c2ac2f2fd345ba9e981fe3bdaf57edd93bb41fbe0b1fcbc62a9d8299395b9e57a01098af36c4ff5aae9236b424a980f5e63f2097335f1bd5d7a3552cee11f5aa0e26e645632f2f1dd22b0ac08cd852b88a71a3063adeb1d4fd811f218d384ca5ead896801cacfc354c9596068346a09cbd3428774cc5225b13f74a2068787110d3bac39c888ca0d2af9d1e15194f58793f177af59ca0312b321eb8a64dffe19b039d5fef837533181cd97e89d57ba51136d16d40469f2590940fcb14c4b46bb3f5273a296e7c273fa3ecab1908c51a15c0aac4b6d24287290fd494e0f3dceed8d8af7da5dbe32c1f6a387ebee3aba322c3838143971e0b5021a6891f6b90437284490f759b4615f28ce1bc3e322f57c654c6a9de5116d05f9a4f24d49cdb79cd838467973402fb5374a192a5be5ed7fb5d75fff98268146f1da5a29062e0ba09b566d3fbceadee3f0dbbab92c8dbc1c2d894c375d399488bb18435d8618b41ab2cebed0ef395ff78e4c79c419298823636651201b5b411e890377b73ec440b652ee62fc6368cf2b5af9dabe3789ba57ac00306c070f4acbb0f750076c2a8213ba6ac957067998716159d695de4eb09750e7962d359f04ea6154348df794b231df8dbe15cc1953268e2da10041952a5e6ca006f1cfbadbd117d0c60fd6981c3920a77b7839ffd5c21ef277c05242dfe58a3962ae0adbeacf51bb0da6bb630351ef519918d47ba25959060d9f65d83300b729f068580f6be7e9abb51338db80e44160947f413bdaf4a2cecbb16bc8129faed12a3386c9af7af43795ebb9b89670aefcf29be7f7b40af6d6690a52c78afc49ba9b1f7cfb8d11a6a4e0315b0548b357c37b0077155af12fdd8b406d8134da0d06eac73795af7b019dea6b65878137e324529f4b00fb97ac9e89ba50c51d062052c92058e24fec60d1d252eb3f8d946317acd65629b2bac588b62e2a17dc625900d2ee211cde5b84e22e596b4918fbc49b4a734599f6c35786ff7894b8588165268989a68690f935a5e8b6074beb6f0bece861668376101c2ebe1983a3de082e0e820c2f6a1fe0b9e750f3d02b11afd3484cb6fee9db98cc1a00534fde1173df5b3afa200ef0a929720da76c0092473b19fe9d68aeaa4ea8392b8cbc5fac38a77518dbff0cc554ea0f043d55cac8f2f4cc70c22e5ee12407de0432ed6f9c59c3def4893b07a5fbffbef335de5607ae752b7c1b2dc834883d2a1d4fc898576ab66c7bd8cce54cf5f6ea47133b609f55d2a2476e44c17a1bd4ff9f3b3166195f4573caab7ee8373499d257bb6feaf3e04248e66d07d723bfb5699b5a25e0e4e7d78fd52603c806bbeac35883fb4e8b8d86a1b8235221e2e8ec8d051f89be4febb8c6441c4949aceaf07beb6a09f7483545efc912cc1ed3088c0c08381847dc285077c9b753d33ae08298ab2cd797fe164823b50baa4a2d593a032481a638e613a51f3f9533a3bf6f0641bf341e924b28eab3c34ac7e7489835ef97e543e217779f213a0eecffc32cb747f3875a4d939b86d3e90edf98a245b224db6431c95fafe008ff668a1473cbbe8efed1db6d89dd7a535a3560d06e18718a085014eab3e0de0dea0e52e41d9b9218a3029354a29d0d42a561e010ff6bab01ab2884cdd49fbaaf0a835dc28d856373f8dd71e4d32d49c054a54f34718cbbeb4d8d93b2303a88b75120c75b9953d886448e5613bbe024116f3218740794d843fa50605afb8e6980282bb6675bc45c6f74bb099e64c702a9fec7a9ff6eb3a9b4bb0c791234a4a604", "ac6a635363ac", 3, 1897918542, 0, "b55acdf25b3a5f792912856cd7f3e92e63a3c24520cc3ee128fc9402042341cf"], - ["030000807082c40302c62866102174fe6f9f7ab8597d8af9d8c3dc51211d9d8476105963dd8add26f20000000006656363526365ffffffffd03c4f72aa3d9689b7303327ff353de47c42c3f17956a1077fef0d2fc0d5fbc3030000000463535351ffffffff0363995e030000000003636565da4b7d030000000002005332ef8b0300000000036a655368453e890000000000", "6553", 1, 198442838, 1537743641, "2810460a276086474851fd1ff1be7f57b2d5862cdb113ee04fb8c34bbae5bbc9"], - ["030000807082c40302acf7a8bff6d08179b09ae21cfb3f9126363ca916bebd5293ab00e412ea045548000000000900656a650052636a52ffffffffa59d3e563ee94aed77d5300b82a4d6865e4ee7a0dfb3254bf34b36aba63785cc010000000800535165526aac51a700532f01d171900500000000016a0b78e8ca7eaf11c70205b646040000000000000000000000006e29a2752499f587e3e0c8a33c3027038b15f16a9a374192e560124d8f76be8f269b6bb515a720c2873fd8457ff08b6d6aabb291d6a9541254f39aa55351ef31b4d6cdf43b23c2de99464eea1f52554c0f4864d477cefa1077039ada12607797000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009fc888bf4e9e140af0fb6904fea6e8a01364ba71ef4db758361e22d14fcb440d03fb58e862784b4e8aeda11c9e83ad27e5d74f36eac5a8be7dbcb0f755af17e96cf01cd26d2640984c6255abedab58db9db6ad170a427c8380ad89c3fa4813d51d13b2f7de835cdcb5108d9d61c79fd1ccd3f0fe8c9f8aedadcb166e00e278ec03252f08a633b9924695a590fad2fb9148e19f1439d776cd42500f4ddaa489713a0225c0bd71f4b7ab24972cdceb8ebbcbcae5bd5acc876f4d6629557d9c9d5f78a90a04221c24f3c5e96606a996189e330c4c64c1ee432231b42ebdc981a488a6358315ef30362275cc6d81445f229d8142086b661ca1222621cb1339ab283ba3f0cf021868dec778ba61b46b349501c8c5af860c56549b7a7700f76f0d49263c0050c20318101b19ef051395489e1b735b04258c3b89ef25cc7ea5a52f28b470e31b8b2003295ddd93210a8189aa1c3a1b6fc32aea314dc5f951cf6ee9235b065c1641a1080208bd74418794e0174b3a2c8b28cb1e763a58cd516dc6dd6d626fc629e8b712dc021f72aefd31cc86abec9b1c8ed95869c2d0144e2b6504f33a626679fe983b2c213b8dd717375e7bceece43454f3e71dc2a1f3e8b11e838d15439d5a858670dd9be3f06681693ed8379e0fbebfec3bc2af143a409a50e4cfbb39867548ab35524a5406c02bbfce16d7145ad9b0927dc73c56a68fe2838c15e277fd865cabb1243f5ba1120b6ea3d170ab0dbbeef4b0e05a7eb020870f949c0481a47e1449579aa4d2d6f37a23060eb10b49f618ede5a6bdf877e63eec177ad129a731a146b63320f383a2650d25525d8166ddcb8b8c622ef40998a76aaa76968d1003db2593d9f1edccd5e70d20c0e2c2f7fc6de32f532e81e5fb6e466131e6de991c80937fc66daa9e20a4caa7a7f837bc5fbc7beac6b8e2d6e46573b75cef01bf3455cd9f0f296f08632595cf7868d567dace5aca8a4581c3a0e510119e29a0940d616b35c6a47cfec33da3d96b0b9f790793b4c62ab9f92af255dee91d996cbcefd2a319b70e9a0c0b2ec186e2deece4ea76653e514670344a8e3cade758d22227ab35f594a00fefc8126ba60363b9e5bf549b29364960a4d3461f843977ea08966aeec3bb7fcb310d42fe32ae913a7510a002b1e5cee0a36dd311c6ed457abe8bd30a742036bc05925a14ab7fe6027c5ede73f5a7dedd5e39f9e83a8b11df3d6900d5b4712c08e5d87a15c25667cc88d49724f112df962a6a80cd6cdd6afa0fbd70cc94f22b49057ade1294c2a96f01bcd040a34cdc8a420e9061e14bd5ac9980b303050ece922ebeb98b9c336f4b225f7b9df18f0f7d28eae658185d494904bb93ee056691fa19a3ee0f128b0c2165accb5fad27ba94eaac05929593100e938851cf7c7b791d9dc32216d9f4dca43e67c8decd73ed912eee0049f683efeef764af966ba34fa8bbe016f4d46a008a331eace8ed779fda031385a7bbf85d9902afadcb1261b2f548e505c40f01f6788f01c5b19591a248491bfec5faab9c4e8a0297dc11f164bfb9698a4acf3e28754e90780546054a183c5d5d5a4b18f6945a78e1195e36a43f899d67efb678e74c767834c5521eab2283d3199bc2e760bf3de088750b9bffb1d25d90c3e8e8a676f671bab7773e48c275000825b0f4378a102ef8e7616c66eb757a9aa65526fadd3ccba2d6a839f4f20312ece1a2260c24b6929531765bd7fc441b7e0ffe3f23e21f7ba78d5e8f047f2ab381baa84c71a8e6cc1c06fae07a7e3a072b46258eb0092e6b762da5a84d304074acd334d73ead55c8defdf9b4d0f9a4312ab2d8ee7fdcb9e714f65cc30ca9f0b01fe6b4c27c40d0a4dfe0a7ab8e7d9a50e8012a024e6030c4070a08f662d99e14e08a50741d0c55090e2806b16c757bc935bfd6c80104075fd532157f1e54e2c6a2a666eccaa077b3f0729a545bfe17b010107f2a2c6a5a8714915c7328b9a72384b16fbffcf2a2ea93e87e2c7141b6b75ba586887e4494b3a72fd144ec4dbdf89faeb275d38ac9ade4e8bb5652b4459ca2b4291353b75a5b0ea1bf749683d58bc24e9f6403d5d95b281e567c257406f4b3b76bcff8f589870fc985c2db5a4bb6004e7b40b468e12fdec4ed83c7d3cfa3bd71255f3bc0911525942b210e8c4776e8697742c4a300e9c41ffbac669c4bcdefeae0bfdb6c0e6bc79be987f8aa900c1896d35386e885f148dda9eb29423b7356fe742ed3b8be688cffd239d95bfa46c1f0a5482c2a7f244be626b86909c4f6fcab6c64b2d487fc2a3f80db9cffd300000000000000007942c20500000000da0619bbb88a4a7b5cc3875f27a75526584027eef8730a269240c1fee6bb57fa7c3c16928bb782a3ef849f0c55972c3c0ada8479abb6d461acfdec06399b90ed471f9c19634ef4f3db966dca83b3e6d643e98ca928a6f0fe92efc0d8fcc55c640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063012c79dd7e2b578d3dfec960f2420ece6aeb21baf3ef4b20a77768786cd847f3fcacba620b61837e617d3e022a41ba3849197e99210cea32941a2b68bd4cef37de31dfee0566fecb357a14ef58d1cacf1146fd7b01d0b1210208f7d0ff9569ad318de632a289876dc7045d76f94f0940f6048e403e6d8b76caea38601c4b6903295dae053618919060659fe946a00e348fec8f122dba0edf90502c410d3bf51902094e24091f38547c933b9b5631784afb959846e0b589e3260b123dde602562ed0a04936f0c8512d8a2eb048777e7bd4a5e5a3e0d006411ba5fa8c1e92a6ac38ce60863f79ade44deab9b8ae963978c69f04eb9aea52862a51da7869353ee035c25031a644101e921de4af1998d2f8906b603f8ac7a9390980b822a508b62f799253f030bb35b934204b1c27d08cf35fcfa3aef153ac515890664203f7471e36e47e587021fab69cda5ceb6dbbfb56ff3040682a93f9ec7920fd3791292b780efa3835ecc030f005d9b0fe434b3887caf1d7c486225cf5eee16fca9a119f5420e252b43c89603207a7f9c2a2b9c9af43695893a8e14b6799875173c10ef33ea04b3eb27d4974d2796b96d9c484d8a612833fd607d3e033751ed13b57ce960540871081c45d9cdb03b84b84590426dc30872897be072a9684f6d546086f3c3d3096dc7731417f6bfb6dccab5836650319fb1fe9cc17c619c61cd02aedceb665e75b332319406b5e5088e7cafd229993ce3dc8226c5cd16a40cc5dbdefac577a2fe89ee6420aecdf11ea3f2f02b7e062d35a063e0ac94aa4c65c66fce0f053467e3e082f2d3dba185b2675318c85fb7136fea280337d2505973fcd1c1656675aa89c2805564a508ab0eb0a464af2e607703fa57d7de7c78db1fd3d0e0e13090385a52d34a11dd0bb5b4dca8060f75d220177f0f12835314ca45ff87d08ab417f2ff250b88b5e5523344cb80c90d93b7fe313e1129259cd5bb9ba9882bfee5ded5cc7f5479c46faa7b6506691fd2a6cce9be1453c29a1df42c058d59a8aa18a2b3c4dbe28c6b316f11d0fc401ca0575d2b48e2c984c8031f13f4694e6e7acb72f01e56b2c3a1c5042a3e3fbef406dc601eb511bf8478239f5f217789c89228e1d852d8d702038039d7cc09084cb4497a67443cf701d4b526adf8fcf2d1294f68e9b4e0923019dd45200c48ed1617c69efdb54cd74e70b2a712fc08c97866eb0e2fbbcf1e53dbf35b9079c7198717b4bc1a4d753f5df009d3a2b20b5c45c3211679e7236009f01e024825c59d5e08607f256d2a861b6383d7a9ba173a5417bf009c9017119f51f0e9d9ce516bebb9c7f928f77cfb2a34d8e4c96fa12a6e8f252e669ce236e0e58b0f62df679c59e61e1be4e46d338686e8168e1e88cc809049d37e8f95066e75aefb45d8f5a6d9da537dea5e8ab2175934700931753e846224601579cc4c542e70fee473d6d3a9fc54da7558576a17e9d0a53efac24391a10c2397f88d3d8dc2182f5dec176d243bc0264bdb794fc7d5f590ba663210925cc7d58c675120872725dcae9ed16f283116473194c394bcf2bbe400c9b2692b0005b8eaa4adb195777753843a9e63d161a16977040a7f53a9dc3d1d09ea954f0989a1134e78c735845b41c4df6ba4a092a6499dbea985aac49d7d4ee8bcb33734d1a55a0cbcf9bc853f47613e94bae8777fef77654f9f23e1966239e9c3da27a3d0fc26d64daabec59ce784feaad2e1b9414f003109e4a38a3ff190995bf1db32e232834fea3e14fb1ad208bb73e845d5fd80d30c5ae775e39871f40a3729c5e650cc15c3b12be5a3f3704ecfe9d52dd62f0b647113a4c06619c07a3ea4c25c8516299e011f1361d6c50532f7476956b33253ddb40165fa70c9d272890d1afd92d364f7b7d613c6bdd3f640c7eb962708bff48a2e113e4f24650c466aa12d62d70cb36c64db2f028edd5335294737de3f649625d583932ba8da2f2b98b95a3065cdfdabe51ba0cf80353cf47dc62346d67636363f162414053e3ec737660e79b3958a7470c56d9d86817f6d0d7b2cef53d49f42ade7a286c5782f259d68248e436016d4442e157d9a6dc84e443584353012e69400f017a62e8eba7f5ef4a055d78db671695101001346b220b1416e99a93b4b2d032171b05a37620f17e91148436b1a0ed6369d00899a394d5e9e75fa612356fb7402de991d0a864e4f731d9e53446889b46f1df40588725633985b504d79884b52de98fb0e47d89306e9d5927eeaf104cd7f14adf1d5828d5e0ce9a759134401c50cc1e0f3594b980df3591b91cab3cb04aedcc5ed3ef24c81961a81858cb35be0d160dbbabee16b3e2648eeeb26ef81de33f445aa62da2fcd19633e65a3541e2f7917714318de9f3d515cc8ab85847ca91d7e8b0cf3ff541fa6b148b616d357cd97f2e10e81133209", "00636a6300ac525152", 0, 1891978756, 0, "a6bc05833acb55c44ccb1ed973882ba137f92b3bf27667aaf8d7834e578e0b20"], - ["030000807082c40301838c1be276efeeb2dfcab5a11e2931aa8f178ef14854f9d1c0978dc9d16469e8030000000765005252515351ffffffff04d52706000000000006516a51525300bd965b0200000000056a53530000abf80c02000000000452535253fc94f20500000000065353630000530000000000000000010000000000000000874773050000000098da6a97064f754654f01aea19e215f4aa51dd7b7b7557745d06eba7163090622fe43b42973df6edb939d7edc8da9710ac573ac3930e8d1076e345ac2cfe4631f00cdb2900acb47675a76cccb4cd16af4b335090d0b40571774936b362d10d0900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ed942796047b9adb342e8b17fd98d7a92a675d8a74e671663f666dde7f2b8be8a9c74af9068e2c76b57dcf7e61cd7b99688306eca86200585c7b3d0c2a506493632e9a0da91872bc84f04e9beb4eb7edbda76b2c4c6235cc84089093da59f29c0f094f8912e8bcb0ff7345b70444b7b8d698c50584e98227f5cd9316078a94c3022ca08fc8adb835cca3688935eb4f0ee8b3053afd4d6e1fc89391f403ade50b1c031695e441665fec2dc0c0b0bf85bda74104fd51ab413e31da8f14beec820857750b03eb30cd94a391639dbe7425716f856de186fa7b80709aed87d8ed592af7babfee0900e889eaa993a7d0c6b86b0d8f7ce9f825690e8b84b931ebdf25cc5a9cf40204bdd323527f0f515b43f9f3e64447cd046b785fff0374f6a7f1d7d1e2f7f0dd021efa6c64c1c002fe061b2fb53047a7a9e67b03096d3d5c25c1e2635dbabce9b103133185129a5a30e5986aada1971806af975cb4f265e11bea6965fe19394eeeea032ec14094714113753ad2c0584d518d3f47eb442b0775bf4d2f9c06e6af0a64aa03013c9830847fe0fb67afe6493645da4ae06e304fd3f3f6b9173197353a76faff4974ee1727069cc93aa1dd63493be9dc3e41cc8688d3dc7ab0aab494ba27c89ed7ab6b668982db39fc62d92785508f02463b90716a89e94eb958320d33f973496aeaee94eff78980d5e26bb06850fbda2ab213f6adc8928a8b6a2598590effbb4b31de0ebd16a3827a6c976fb286447d38f7e91064b012df14d2a87ba8039c1666063c66107b77e58c298123529a57b98de4526120961c01666fd09296f427fb05e757e640dea154fdd66a0369d9083ecba0334d10757aa7ced4ff1a21440cd96bcbb88a05243b0d978f648e22b99a2d3c6642c9d8320b8ef5c0130f450e05b20777380741bd3474570e145abb133fa447b573e13cb0dabbf8d7b62df301174b9e25ffb6f4acd9654acbd2270f7e6cff173391cbe218070aa8eb5a8d9d56d7576ebff28a1fc81a05b283d49d6fdd90cd10816e20bdea4dab9459f3a298d8e1c21f99f20f88b1938387f7ca7d565dc04da1afa874e6514c13c8f128128247d07d707db497f7a41d42dedf2cc47723e2fd1b8eab6e5f8a6f88fd371ed323917b8b89effb546c8e31c3ef300914209b4bf7ea040d13e6c89173d08e199b6f94a412d0c56c66cff70204e70251c012438965e1afb2dcf82f4c2dc2e321afaf3a078ed48eaa35a4ace8cd581aba3802896fc5d4a782f5842c49d53f42bdba4df178ace156eb11d24ebcee846a5a18f0352db798d2d3749b4cb9b506c55e45f10fc2c8fc30b6e78df314d3acb50a83418c7314bffee86c0295b9c903ae462b769a1f9629c098e6a1454998a244c5d388e71215f69d2e6fdca02e9a6838afabb536b3bc21d1d54997d888e042438f967ec480ac787cc42cf8cb80359f9493c6a7bd62d3451fa7a678327fdb63e9d2147a3f08bfc16c0293509f17ddd455cf0a9ad3e918221cc08be1d3431cafdc8fc721cb53f8df221f308edd624a9bb174bd4b9f068d436a897df491a855c76a46da8bb71c3f7dea0bd4e1eb9b0632084003b9e6715b4278a3ca9b783260c0f51733e524230b177916efffe3b9cd19e962f00c04cb73f1eecd3f46132925c2ca2682b0639ae354c40c5ee0f6ea398a1e6324e7e7176307b34bf0b40ac3758a5e82da14572672bf07611158dacb284d566ef2fae59bc701b101eade304e2ff08e2ff298cd89853cd7c4794af5cc0594150ea4aeccca0103d441f823cf3d27e9dd296550398c4468a61d09d8e012c71cf60a12e405118211b3862082b7f7bdc3d1ae47a133ae847803a858814f0b1fb493713505b8fb1112ab30ba680febdd68bc47e240e85244a98ce24d7636de71ab077bba48aa471bb67d2e14e24f9afde4a6c3000c1d7f52e31977239abfea733b3a02cffa744495fbda5cf644d655f05f290c9c9b48635a9330fcac1e960fbe652db96b38087b9785b6804fbb07458ffee557b04f55306718e88fb869a8dd65928aaaa02c35eea35c11cdc52e246ab5dcb0df8c0f1f12938f2a1ccc40bacc6b9012727ca4c12559860243167e9e30578e7f84cb54d3d40b0e3c066b08af794b963cdee5fb03393da94cfc002a57ed0c8731f69ac57371473368809187f29c2a768dc60203298e3b8e1eeff89a20b56cdb4d50816472313b9f94e3e8adad85d814e053a0c4866b5f65041d743c26a89c759d4acf5c8d250bec67b35826d48806f380851d082ed184d855de4ebd2baa7b271b2ac46754ab26115dc5dbb6c48746030ffc0c6e9c2caa5fbf6a83abebadc0d53eba3fb791f35b455a2798cd7dd43d188c31d545bcc2e78d97d5b388ad8ce2ecc67fb1c4eefe66dd3f0d67f5a456dbe75d9908f8291bbe0b95774a3444f0d0d79d2604eef60a62bd0f", "0051ac53ac5265", 0, -551379631, 0, "6e688e201a879768b0a5f6793595a248e6d6deedff5f4ffdff84841efb05280b"], - ["030000807082c4030133969e20689205af58f060bfa8813c5c89e048d7aa5478bd12eb21849d5182c803000000050065005151cb4fe1a204e0177d030000000009535265ac5363acac5377c68d01000000000765ac5351006aacf5d938000000000000cb0f5a0300000000065265ac6a530000000000000000000377b94d0200000000000000000000000080ac19c5fd3ee2b041df67b451dec4b32b735ce97f9bdfda43ccd5635ce73426d6c86abf98e2ae8ff306bda7409180ca88d72ce2d7dc59a9d6a490abf75c32a313a46b5e8e2ce95811086fee47d29efdb105e80a5ef6973cb2f0702cd224961f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000957f5e6df4e50b5b19260847e0049511a5fc3f731f5c7f1cb1d29691332164f84948ea808b6714231cb1efa354068fffec200412a53669bd22128a96d797539a7844a3a03b5635c0f0abe9c27f62399cbabc321ca8fd078c9719d54423600c67890a304915867238ff104177b1decaffb77d5da88c24eab7cc07914cc074ba15032dc58100a1f0cacef25d6a6759269a74f353994cddca0259dddea3887d6a22c00325d7c9ef3e0421e657490106d3480aaa891f6d54eb4cf4a1b1181d954dc4dc3a0b0891cf418663a8704142c099a03aad63e7cab926ce2f5003a024274cc9064c66f917a614caad8b7a8fc3dc2b397d41b085b869da0e2bf2685c58f6619f1c4612032f8729912378692b4c58f7b30d72a96bc4bae2846311310e841875c7736e73fb02181034628f7ae24f50fc211dc1d5104c364ef3aad84aeaea99968cc77ee1dade0207f6367f2331c897853d9fbfe4211bbc098d2c1eee9cd6ada340425ed4f2719c03287cfe56e9ea0753376040a978ec1e338588a533729a6266be8c8a38d3d465b30219b1b408afdf29e6fb2b90f1ad7f464886a7a0c150b7b9dd61a2c7deda9ef67c9edf6dc12991ffe28fe42fc0f0f8cbb4698b84f583174af96126afe03d894de10513730f3ca5dcd2d01f7c8b9a9f78d7f3d700e3a1d9bbbb790a6b7f57085388300df1c3584e8c701f44a1a4a39dbc73f013de3c0d7b27ed24cb369fc6f7b6974ed67b7b1ed41b4c6fe834f09dbf0a6dd10ad05d3fda4d8c9dccc2a8e6649781b2385bc2b81bc857e2b03ba1db18b82ff183fa4e29e39f18c47ac61b68cbf5098ba66b43deefdecfc8efcc25e8da1028649b0ae98c034dc1d1ab1c8095d92b8ffce57e21043e2e5a4ad514f53effc659bdb8ec30df8eb8d2285f0f645ade6197d6149f755797c1e5a1d91100a960d1a8089fb03e79135fb1240572d1aaf72c6ed934f0b7e90779d9a9a378985330bfe857ff5da74417bb20174fb6f40ff10e71b0a26b5e3e318b6e6cc20148143274b2f0d5dd3f56096a440698e1307efc5e52a745500de5e8bc354dd78e41318b8ddd74c2f34f8b26ef16cf36f28f28dcc6a8411babfe43084959028c0d18ef4d627462f34ac43003b65e0b5c3a0b36a00fdf26302638c5c73934df8f7faf94308c3a02cae31d66f8ecbeb82943c00cca884369b43f4181bce326dd2084fec6a0d3bd8e7f936159002e67c9dceb47217302f0c538896e53e70c60e71be03299b59bd6dbc59a67cf95adb67feedbdce1e0118893be8e666e3fa5465123a719cde671f0e1fb3e7cfe797ff960e591cc44e3ed7df1ee16aaf1210fe5af4b28950a8965a924707cb5620040dd38f166b798e079fa5d015af0027618906ba04df6962b783e70a3ea6b63e0bd1e4890a4a8e76c37572f6758a3531d0e0fcaeb1870d58bd19fb7bef5e44ade72a31a98c43c269bf5a8c9bfc0b9cd97b77cd381cd2c0bae7c45a3868c7977584f9bb2daaa891b2cb57c1e919d053acd8d8994e491a4608ce5e8326c15704bb3a50753fedde144be1e063addebbdf69d958e71ed77197e1294c67f74f831b84df343868ae00bcbee8f9d0093ec77ed683f49de267e149006ad8f94e2f58b220a983c0a02245a610007c686b5171958f3b58925470c471e48c62131e4c28536462922efe3be98cdca02a879fd321aae0d43946ed59b6f0c10cfdeb02eb8149fd19c74a59469499cdb69231a9347de8b62d3149963a2c7f59bacbd48a084230a437dfc8767d563c6ba24ba3dc20245906b8c59447acf0dd853eb44f0bd43fe69800b3d631ad12fe5ea6fe0c86c2be3db9e8f7092e89040fb0a9990a7049aec33e9d641588c063077c30347270a1a3c9fa98a7ac2c9301efed972415164258b3a8b90910fb45f55e30cf03b75272ff30a9eea7f39cf8a9964240cc10215da12a3b4a977c0202f647f38c6b504081fe3cdc3576657924e3e1dc908c6b63a136c43138253b69ca2bb9c61b5438acb5b775b752a22da91a6f658367de01cc22c6066b2de188e63df6cc864cb0a069dd25b45a0615083e209d025b4178f5c69843981ad379beba276f375a5d1053b362ea22d7443d8d5a7f75c44cf1fd76befe7c095de3cb79c5312f69991f796847b0eabc37fbe431491aefd3052fbf47669b1bd6dc928a5bf70168f4fa7b1b6b245a01a7177552d7f8421597f676a6dc722fbb6bb3fc5ccbb1c96f668467cf66840856c8d87b091463a18affe8dd81460cdb14dde2d644154adef0a2865377f43d97b9ef4e86555002779dc9e57b49d7b0376847c010000000000000000000000001be7e7bbbe09c2cf9e4417a1952695b7afc8cf2fb856729d593776417adca1b3814775ec7d7194b67c7470e20354bc95b176846b72ea82836d64d2dfeceb57d894cf7d3fb264a5ddc2786ee0ef541a924dd24664656758fdeff595aef2aaafbc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046fafa0c51ec9fb7a7b7aae359db36e41f1d22d644609af5f4ef16308433ca4a70ed97401ddaf442c73722240d34ee17889dfedc25e11367cb039958c4aa3fdaa8d430f6031f8ecdccaede0f70aaee33393131df8dce202310a10eaf8154d8624080749e1052190809e4201c8eb6b244a92b8c87f33d3dff0bea69cd741d72be0208b8c5126e90efbbb4e4f3483e6b66dc1f3bfa5ee5a6e392b2b76d7c6cb864d80227b6f36eeff9d4842514056357872f46fadf6add96c2c28d33d703182642b5790b090b7a7c26c2ff56697b9da5bc4b35267ec18f1edd6dfeae38d4a38c50b9950439fd6c34e32da6d87d74486aaf051f1c778e4322bff8742948c1090677e81fa8032aabf362dc688fa5e018e52b83ed103ad0669e746d20efdaedf1688383d8990a02089112f35c9d50d031c74fa41b1cdffd0d5f851a449b646b6f600b4a613f75c6030d459d9e7313a4c0acc35a34ce2e14bd5266702bcc9784cd31fd22762f7568bb03299993278901786f3ca91663277724605b13531f24af1c9038f440e4c2b52662022970c3477fa1a9e19f51b6d02a3472de47d9edafa5847187e40a3ca4ca40055ff7cfc3554e48b8fc4fd7b01f31f641c9ed06cdaf42f6b68caf9eb50c618aae8ac5f9537f397b7bbdfb999ba603273e21f4ec892fb3e18cc0477869cb32955c5f9312f04d79cb5205d1cdcabded59def23acc5983994a165927bd5273ee8c8adaa8619e0729b2922cd812e27dc6d2731ab3561300ea2cfa6bc24a232d3865eeaa0d46ea85be52f1a2ac4532e36c7fea24b47c390631912c434509ae378eb6fe1242b983d202df3a1e416cd38aa9ffc9298e84d0080f8a92068e345b31f688084baf8ecf852dd996e983e4ca10e36f7c49b2c162cf6b809eda3aaefbcd31f74ade9aeb86438c51ef14a36e2fb3dbaaf01157c43f083fe6a7ff9404574462701be2d955bf5e5d03089240c8f6788c555cf5370426983eb8b8140b48424f6b9fb5ccb66caec4dfd8dcde391e126484344a99154130587381d815f735e5e98aca65a694b61bec14ff5f53c1b73a98c04398cf8fef0e9bc760613afa33000ede2a77ca4f1e2a051bdd718fda8eb3107aecb3437b39f7f9f7f9a06a34234c9fe6cbcb6746a6a4c246bc932ed67b4d272e5ddbf533af55d6b715202d43fc649f2533fd3e081605e06048a0aaaa2f2a7943509400aaa80615b08d3c14836e61533225f3cca198fdb2dd443e28ecb53697517b0c4a263da2d5901e32916a67d57c2897473cd9d449f4220ab4a2f34b7fc3a5cd9eeaf477ceb3283d8ff8caa755bf1da5be2b785e02a2d197c9b3a95839a070725c5e5104d7dcfb9a436c87bb98da31d6e02547980ba21aea4e4cf14e74caaeecca8ef995253ea0136e6b5b5271d60db29e2df0a157d352a0881ddb6bb51eeaeb4b07589c72880fc0e637897ab9dbe0f23ef2d5b40a09a28c0065e569f7e758879b58a57b1e24c958f1c01716e3fe850de476fab62d641147dfa1dd9763e618bc417f8bd8289daa2388a25ef9f7f8e94bc319278a5822085bd4b1aaf8e3a48dbbf144556b622a7bfba3c46621f43735a9c964d5b6f793b60de9462980380865c9c3bc9f8af55c36d1a16ddd5e7952c8919d95a6d677a2f89beff1288e0c50fb68fa194d3c35b4aad5729473f0de9864f4f590233e45455a80e6b12d712bfdcd951d1791575d08385903c745a23f45e2ea0f72626751645fc4ed6d0cf40dfb79628c4bc9e55990eb63c3d213c7f3c213e6f0e08df2e0d028dd05260476cf3fbaab5637034c8f60c660015e3e071b7075abe8bb99b85f1b7ed91c20a7925ccc3a43ca84c016b917f1bce05eecad8f3644d773d503338a42ad7caf1bfdda7a5e9748cda14098a8bd3d791894db6c5520a8ac56b52854728e4ee1ec49665bfec3192ef3868d5b6b9e06fea9af08b07d40610b13952dac05e29f00fd9810b87c85c5b80915c1600e5d1c4965bc67b5d47c5e2ba39748fa31906af1de5f6e51d2f24bb2e60f38dc5f07d5d1ed1457813f0a70a124a4747875a35034d7565af74462c106094e2bf12e5bc8a077484af373f0cd5db755f8cc87c99f061303f5ae69110bc587f4362dd12590618c6631d59290fd373e74eeb6f016de6310149786e378b837f1d25514f8c2e7659417dbe6e668441624018dc19b4acd59fc8a6ddf9c7d3f2c20616d8039471fd9aea93307ffc57b14b4670490f69c79f886b7ca4c5207d90d1e8f792d049364deefa5f666402b1c7ca111a28aef8f8d5fbf306c1b45343175ca4aecb6239dab050000000000000000000000005b3a4473c278edabea1c124f764c5a4204d9ea4c3779b9f2f59efc3fe69ac9f0162de0a4548037b3e41161b6ef925e4ebe0d4918df02e339ff8cbf6a21b9c96c00de6838494d9c55ba19a40c2c6624991f090fb0c26755250ab30eba041f5d8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023964dcc5415f07b4ab741c73392f3bee43b5ef1117f331abc550e52f473f8a4dbcff9afd454c2e8ee9e66e4665e605b0828c5ebb7fffe6126cbe27c48a978b1713fb8301c9c0ea6dfaabefcfd95b7135567f5f03982e44febe1b64cf7017e58c437c70cfa0d27dd6d0c86f9aac71dee217069039bc841a487368f8539ff1ed0317b67b67f876eedeadbf1b6751bf2389092f0294cedb10a2be70181843ef5eb402285918b08a825915e8f215bd448279fc4d52cad5c3db350b631d53b43b2afdf80b0728eedeae958d1a6ea075ff537a8c3d9adfcd05907fe2483db296e66d9e2b93f613c585f90f4abfdb349d2c7bae3b331978efa5856a4d2f56fd5525dddd04d4032b23bc2c3a8a8beceb6399ffc582a446cdab6e0505f42b2d78676548e7ac386a020f1a94a5b80cb52bf64d2017dbcab52dac9f1aa47257432546f32c9f6c5670a50325a04441679ba256165d079efbcc97cd8d7ee17ba14f34c7eb6ec350d391a049021bccc50e2419178a8d75c60abac9bc04b1a4fa28f60cceb9852090b18e164c4c0223d6b43bbcc03d39376634cc9ae89913d04c80392dbd467f5310ac01714f3cf23d0395b446d5f5d6290d9d5368387b197ea95a16f964d90c8798a237a4940122d842b621c4c302c8e4fe5da12cd3553f4448f8f47357b708de0fd0ff6d1f043a30f2a071600932abf5bf0921f5be32cf8ba804096a4d054fc419048af75240eb9a571ca189a677f7e6759f57f4cd30e92a2064dac109f55965f86c723d63b9980f7bbd816d6eacb09d174a9a791679fd063882fc5bc2f2accff85c9e626e4bae51e6a250ec26b76b6532341f7d8bf28e4d3d1c75e7ad17fd492a6886d26de2e1aec67563658d1b6cc9de28b29a7f97a18678a07616189ffd219283fa41b416365ec927a5650126fb665612ca99888b826c819e202ec82f5676bb9e9d11c4dc66d40e1a7b520e5aa83a0639b7d65b0eb805b824cf2560e936b2f2194d13d340326c0bd37bd498836e49058d327f40e2bf5448764d0c53758f7839b7c4854685f87e929e2d337a8e544ea095a3675fbc1c69d10c64e9531b212fdb8b9b6932a0f9be1a9c3969208c03938855ef1d32e93ece1a88de4474dd3558b9e3b27b4b8eeb874617ded867cdb966957092b3f6ce5ea2b557a94bad846f466a8cc5149cbd7b422584cfdd211638cf359bfb53b8aa59d5e6cc8ea59aa07a4b6782bfda481e59db26a0e3c23333c9dcc89ff7bb687f92d87932ef69fbd05a370819d742e8e619543639bb1818caa4e7aba8a8c0591e41ef958b35be8900291e1556e43b634ae99cbfbf0e434f3f1e3b99dcbff8f2bdf4050308d897b227627d6fb845625210e5266c45cbf663f8e0bced56d8c2dacb6a16819b0be65c954d7937ebba61a9e544a4114cb96ff857a9315f850830cbbefc0277f66e9b2e522cd99cc5678611c88812a9ed907079ec6ab64d183a5fe19a979a43c851748c02f2b1e1e08f1338c907c14576497c6796a442a4aec4733713f43992682c8b52ee1150e8148c48155e04c11151366db6da52fe1eba08341a1d4dc03279986906f46a5b20eda43c6dfa01974c730a6fd9430beacf519f842ee1ecb13411c61979b6f390bba0331429b10191caa1c3d2403d47abe31637adba7c0ba2bcf8dc452d6616a19dc521ad8bf658145aa73ceece71757adb45e84753eab61a4e170da57f8f7c69042be4bdc4db300737e4a2f03f31d65284a1b83e5a61316cb13d2978d0fcd8ffa1588812c887c772ba80202f2b453eeff15c0aff7a854ccebd684065f6001b16eaade44168a61538f01bb8872c45ecbb5990558ec2486e824a816587d6daa46d1675f7057bad14eb5c11e87858787db556ab54c790e4a56a0d42b83f4558fd4d229d874ffd9b86ef643878a16249c5cb90ecf0154c05aa14a73b6ec41b8646c4df44274aa8ede72a5920a37811c34dde307289a353bb9820372b26ba36d30e9e566b495ccb1604da1c73fc32627d483213eabecf2f8b87ea5c5258b23735c2ead451ba6f478e0c2b6fa1255b9b02aab4da601788144c564a9f930093c102c4cd3aab8f40feac08443b168d2d96cf257ba4b90d034072380ce22454043d1c4a7f8c7914ae6d6c1482fcb0871aba12366cc1ad3662fd81a28218bfd5992a4615b124e50cf7664b983609d7af7d4ee9b1e152f9a70a3c668ea47c5f56204df25f498394a818bf3c02a3308cb43b520a14be639e6ba6f09490b57104c95aad2cddab5863af4c8911d253c95c4aacc5fccc76453680a5e2569ecc056c5420ce7fe17d9f5dfaf04ddcf3600a81ce03d12ee0ab3513a163439adfa1a968b634e8bf788db77334cb6b2b62a43e3cf9b18f0d7f4c07b8c6ff6d79c8c3c42bbf8c3d0dbfe04f5f64e168aaca626b1f4382ef6673bf8866a7bae0e6a48204", "63", 0, -1984510721, 0, "8b7fc29afd5292cca96162eaede359f2744b522c262e87eeb7a84e9854dd0771"], - ["f2f8700702f7b658c598ed06a6a763747a0ae89c54602d3f672c9a3ec2e3ce73a3e6f82bc30300000001acffffffffbb11045c21add22c2700a8ffdf02caa27ad25d0d177b21b19cd0aa27776f645500000000006ac8ef82025dbfa402000000000200536c09a4050000000000000000000200000000000000007d02e00400000000bfc0fb93d0d6dbf13f1486aa9573331decaaec0bdf1c627797e9f1457428ac5eb0bad3690d6c548dbcea267d71deb4e13dda7dea3e4e0585108d55b9c5b4081b4c8029f9bbde7387f680badf93516a0e00ef90b481f521fdcc7b319073185b8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a622b1ed8c46df1d68686e93711763b0051cd68a2434bd73ea53692f1f430f8ae090272247875adda04a1b55090953adce310683d996c6e9af8e56ca43378ed50b432a5720a1ea2c72b892a534842a002d77b4cadcdcbc7f537d2ce6dbc57865f912b8ad5829eefa0e3ecb2b81ff7f6c2c44f2e97ccf49ab68c4f0e2102ee359021d7bdfa0e83f687c0ecfa6fccbb226894ac04570ff3b625854fef85fc1d0bcd7030c0d301e90ae0d3c4f2949700b571a57ca1b8c4d61ce5c26a5291c4fd507ca140a05197710d04aa00893d910d312d195b218362261ad21261beaad44557f7f8efb53718f2506846087395399b46738ed8629b7078e9ec053fede3674da0073dc4f032ae959ac25ddffe61f95987882f9f820fdaeed19a9bdd5ffc19e1503f42d8097032e666ec17a5f8112a68516e184fee9756e6805f60e9d94914e8fe913eb891e3f0323436d9fc72fbf256770269d4b4bc6dae7c886c1a157322d8abc8e84adc8e81d022647b9560c48328fa0fd6a65c79f7701f0b3b4971e3e8459e259f7f8aa2a73bc0300c9ac6d3c6df709e14f0d8d1cc86a94ac62fec75a4114f8d94952bd6c61200ec3a57dc0e6f3130cf5d1be33d44c9651c5fae4a811d00d95ee446747c3c361ce2473286f094e76bf8c1a57daeda1b0eb8c990be4c4f7b34d07492de890bc1154943fa9bf566f4f12e02df971e9b76a6fef436ee09c2a0867b22bd797eabdb58c043a52190f036147192377f3cd71c91a032fd3e609b63082d944813385ebf919c80cf1ebdf064566a0695336380b958670bc87c35dccd9e83e71b064116650c9694b36acb234f73f508738c6e1cad0e8ce97a12e20c5c35dadad094cc656f845c7ebfd6b4ce48ab1bfdbe13ceb859ab5f5eb79d8fe5afaf7637751d63f89e676e003a4874eb051eedbef544fe45f6c25e3e5a71245e77408e2d2c2b8a8b2a3f5c451655a62c6aaefd18de248017529be615225acace714bb61e25d5648e1b06d3a731b38b67301df1eb018d072c64f1b28f5ddf5f667622c31c667337dfc6b930564b03e49f3cae25aa15e2bacd7bb17b4e1e73da328cf18b3ded633a088ce41a5b8f129bf21d414283d05c7b99b328f3b8f13e5b415000ee5442c045c04e657def39525dde8483bdd80dd38f04fcc29cf0636366ee42ace6f4904fee3e2cf43e4011d1bb48e9e9dd6b71cb81e284e5bc7aa21b4cade8558cacf05add380d03ed18c5fee1aa7edb82e395467bb111dca0fd3fc8b4f97f4753392e36613b39d3c8d6bdae68c9d4f568486bf8efa9fe43aa21a5028eaa233d46254f7330b7dd4a2c04488a7773c2714444c2a5f7b4fdd04d6f757837b26a3682a5e8cb4f9c0a5811311dea9f3b944bee264ce45b87593663cffcc69dca1c2ff2a5738393ba2fa4002c7334a20329f2e633d4b913cdd5e7b6a8d34d50172d331d0db159a92b32fa147649206a85bc63aa384c7a61a1007c8fc3fca735ea7a576325d33b92162ca0d28065a3edb153952828abefb241534c5877b256320a5228fa0c2268f36f29dac181a7b5e84a67a8e5cd475e5aecd5bbea54c10669d19ed49344d9eee2b58f39bf23724727bbfb38f311700e7d601f97660478ea6f50e88ed7f2aa76943348a2d38d2601a8a9351edd0aa8c30815777f0d84d51c452cb14f6a5fb8a9f8d05ea5e25ce649b8ad2b329165b7631d404af636cd3317369945fa5feddd844fad4d3c704349be57a93c1986bb2021c86f26b798b1c102fcb65b66b6ec913fde90f12ca4c459d85022f7f230a465f4ae9551b45afab0ef4bd0980857daadb700968c5a3a04142129a1b7664919832689b5459d86fc3b3bc14283ec175ccf68fea5c32d528334b43237d1054b113a422fcf9f2e4623973b07b517acf6b2dca1d57ad92f07cae17377dfc76096377f04a16a9bf60272094dcd20f2ee9e2e84946ae1addb55f5b1b75eaf538d35ad041d73a96152769ad5cc647f605b8f2a2420ac76b2a37b6147e869b24025251ab2062ec5739314bed6889eb22d8cc537ea9b39267c2ab5e931bbf4c0f3612bdd3ec6886ca8e958dfc0060b7cd0f5a0ec11b9b52316f1c7c8027b23f5ebc4704cf0daf53b25c2eef42de0d1f6e2b4890530d228a9f288b9727cf5d9cafbf79bf4ea055118cddf33179a18d675c903bfbc41189f0b1b6d18c0468b4a929bf642782daa69f196c99aedc30228c1af864674cdcafa2e4935f2fe17a90dae2b1695aebaf70094e71bbd13509e0247080e9c8f821ffd7d7c210461bf5f1d6454fb14888c123ba5a8861b6a70000000000000000155aea0500000000ea15d4265aab4b88b4d9371b050668a6813275b9c05b608bb643a28dbfa556987ec4bbb9b7f0a5c9da30b214ba41efaecb5b8981bea113a6419ffd2fcd9a0d1c7dffc1073ee63501cf45a0be4c97f4746cfeed2200ea1e8f4de407dcb5701ebc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009ea79739052fb1eb180485c0ffc86b10c02ba31336b531882021304ca7558e77684079baad516229ac09fb3be17f1db168468f5c492a0da384b127c4a71375765492fdccca24df3e4f79f12da9df4aee7d98e6de94a82f64efb1abdcb868a0bb6af7c70beb948d2d91603618e6396523c110390d2600cb117f95a48d8468bb4d021ebeef4034d1a3ad9e5b31970473b7a5fd7bd86ea0bfabf795194d67068cf22a03060a9be7ebf6e9182e85e9d5c64c5135b17d3bf1c3138d584edaadf91da9ffff0b04fe3a4605221381bd378384227f6794997fb118fb4e139660516100e59bd6cb12d021cb6333716c658e9b3f7795956657862ee39e12b408966e59ed2423dd70030cf285f348a77a8e7323645ea262231d65bbfe6ca997dd1de36f5968ef7c0efc032fb952e4aaaf85560dd144b901fa8b2a39d10f6c0f3e9a4e717f5dc2a0cc3715020abf92ab19a558af548c3f267158e15d05294cdf3d18497e4e71a40c08cd4cbb032798580d7773b5b4a6cbbe431cd02a4256835764b3ebbba9c6daaf4141dd4b87031afe0ac3b6a11e6b3a281e4daf7eb85d55a5928334897397706a128c1d263fb68432422c6534f718297f2d96b3197859c141481f00344554e9e20b007a02e3d5e89d414f49ea73807fa8765d9f36c2a376028184be8c8784907140e5c5323c9e02325fbcd9bf22bbe584eb5b95241a089651515c3361cab5be710910ff825a48a9612ce2335d2dc0dbb5107936c70c4670def58af3c7e74d018be54b1803604e5d630b8cd2da0e32d3dcd121f6f1ffeaf01fc0af6e3b75a46159c02e6fd5538f92426989297a7f839f3333c315498526c2235d7afcc29e9c9f782e87d106f148cf87636b4a2985f3fdbd67dcf1a0b6d0c1ea0cd34ee89be050542906acbf116c5dddd793eab677e3373928ceac5f872f46a01280e3fe9776293cc6738f7ad6c6e11c9c6f6b291a2a3f61816eb10f7e9a9b406234f6167715a18396d36379babdeda056856b349792aca2d108e6c39e9b0dbef6299fcc2690b7d766cdf3032f080f8ef5d647bb1cf2114210b2ab28aafdb5737f2b60551dea6b737f41a1b6e0508f8600babe2b21e895dad66a54ee2352fd1f965279d5bfa0874cf66845b9a05a4b56b7e70c21cedce9136513cefdd0bbec4454676a5f0b1214d3db9da533b4f1cf59704f4e29590e4a47312cab3c91dc0b1ebc93ed4cfbb00e38462c815c777902a4db5baa55b4a0b731bdf6d4cfc2878e1a63f47ca9aad242636d4ca6a444710f6a6f198908daf1d3519a285ce6a223569875a73e9253a91aef7aaf06a89b9dca34f424eb9ea2f035ebd6a8f0c18493f3fce210b79724bbe619a84cf13a6b7b4f5ad23f8d00d510a1f42e0a61d15dfa43a0b644f6a0d79e8f6655ae1ae58d238b892a1bfbce023dc0855828f8861a12c8b7ed747d72ed791feaf8cbd41b657a2a958461f10109e26cf377fd662f509a9b5296f763fa785f2b53088f0bb0fde1c4527511907d61ccbcc5962a27c1492fd38a88fd2cc2a88d2d97f1ae320ab802ff91e230cd86b1588149f29529884ef425b188ed02d5fc1bf13a96484c00ba087212722e92fd7dfa912b10e36bf12a7a62d277e8ec53e5fc8b36775c487f7854f6b77f0b6a2704b62327ddd48699064338f4ff8e181a93e11649f5aa6c5a3819e34d775806c87bc097e2bd318e4ef08cfd11f8904f5b31c17dfc6128d8fa404d49f8e64d388ea9caf148888d1c292398eb44a6c498622c761ff43731c38d4507d4cad18fec099736877800819d4d678484cd1689a91431ed7aae02c9da7753fb1815f40db3dc78a71bf0c18ac0a4903aa88ded803be3891a35b178850904c7c75253caecb8ea7693d99ef8cd2875a379c66c48efba76838bf29c99ff4b77a668f3c5a2f9c20de0409573cc9b5eb8ee3522ebba821fb766c88648534c7ddc8c10e21caf092c997444a90b0d2add18a6915a4575a6a62d9aae85bb48f4c7864708fa34f4e1257170db8766349d82ba6e451e41c141526f86bcfc1e0012e966b606147f5f1609712add826e2b3f9eacd87883ce5bf78f945bb89e6fe09724d562fe95cad44fb385c161d94ef1407d1bfccc2d429c5717e41353828a8ff3c4d0c995f1fdab3c03acf3053b1bb0068def9b088660f643c558c269af4875f5555c342d7957abfa178cfe6d97eae03085781733219efd399c6dc6e270ae3300a2ae4afddd527001236d7c365ab493e2c8760de4aa09eda3e3608e6e34fc20cbca9ac5982f79252dd0c019ecba1cd84cc1ae13a678205ff2704ff62279796505be815d916fa0ebf5101de3665ee48e3306f26904ed2d99f7aa623b815659eba25c6937d5b74cf9366927a0cd0a04ee8c59a87e7f923189eb0bf8256d6b3b955fe24dcb89af5053e0db92a15723023e5edf2c9fcb690d", "63635252ac53656a", 1, 447930529, 1537743641, "207f002ca5cbe11b3c432e791b0c3b1fd3f201879ff107d0af4a079a92f6596f"], - ["6cc3d11604361561d224564e3df01544647f52d0b4b8fea6741a7d8954e70b769073a48d9401000000015169e5700fbb42c355535f72bb5fb0537623a41348e249f1233ce41c1c473b8901bad63256030000000265513e09cbadf592b39d9adca6ed88b17c58c9e805e8a2f1e808e6e360b7a470d48f83818ba60100000006005200516a65ffffffff0efe76c1780f2fbc469e83f3325b8582955d9e5d4a54532190e6cbc597ef83980300000009ac52526300635351657cafc21d0225fb9800000000000100cd60fd000000000002ac630000000000", "6363", 1, -1090397391, 0, "c3a890eb79b2cd04828852cf5354817791575342567b2abd9eaeb0f7178eb87c"], - ["030000807082c40301154d450c73e4943c4f60aecdfee42d47dbe9abbd00846d7752d7ef2ee75276640200000006526aac000000ffffffff032984b204000000000263ac0769b40400000000056a6a52005252fe63030000000002655300000000377efc60030000000000000000f3ea9c03000000000afe272120a2f92d4e900d24219a738bf5bb46f8fdf2b635180df6124e3f36728f9158409aa953bf0ea5e7a06911856a540001abdc23ca66f8e8af3e98423a634719e9c9d3d611daaaaf5906f382682d044eb53c46d72dbae7e7809fe1e1256a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1b115fc13fc774b5ffdea12fcc9d9b1451a765c31ebbb01839b43b960663ba70274ef68b1af70c659ac5505d4f797871665d57395692b67fb68ca2a6f99708bc62b3a01a46e267ec4a45416dde75a66c6b86bd52de0eb5ea2b287c7dfdae09c8de87bdbb31c9fd4c17f2fd06a4c6d3b8de2f4edd90934fc0f40d7443d5f85b603014be1b2317231576c1c679692bcca2b92ab1b66b705296e243c65b89ccbcbfd031a567e378c407d98f463b823743e7f21d4b814be10cad4a2801c2be15e99cb410b044dd63b32e860c93b5c0f07d3ac88e469df9d7b4b17c7009349255717d0be92957722df46d2aee65d21bf798100e2584e675d47ed459b7bdd4edde398c47e56022647f5d81bd2e41fa753d703fc467c8b6db3f88a8870a55812ca63ca3bdaa6320229fd9e8b76fe11dd289296ee05dec0a721151dc7b1368bbc4b3b4f6446348891020106ffe6ae48bd8c6a113c6180805dc9bfdea684e08c6949793bdbee499e5c9a032b5c2c439944df81bd3060cb4e236cf04218be6aa548168896c43b96ea4e71cb0320d1c33d917cf2aa34715714a396eea29978be0c8ff4406cc87af999647de54702c951ca1c95b771a9aa343dda505d398433c0dc028afc1177b29899abfd977507243719644a14b605bc0ffe20cbe17fa191b3bd5eeec2439f18ba70b2fccf65ede913b9068ad4720df041dc56c2d9bef8c7b3091f2be647634b13f7dc9dde912555c4bf1f6f90ba7ea6dce63c8fb11d3ed6c5c1aee069ac66c534b94fae7135ec7465d9112fac838620c2f0b40f03d80f91a41497a83ad7ad4e446b5e9229ef80d187d8c9f37c8bdebd6c33fbc9c598734f031dc5205f03a71b8d3ddeef17d0fd7a2c803615fbb0ebc3fd0d3aac3e234fa99f8d20e2227932feea92e62d4b1ed568eaf65e2a6053fd80335abb09aa59082f3b085cc0ebc15ee6db34d96ce04f8c551951cad9c29a690aea4cf325a1ac91b4827945b1587ed4e75be47a0797fef9066771b9fe6f24387f5e2e582be5d8edaea55a41f8f301cbf90771fffe1a53771df92efa8514f2f4e16cc3101a1c7ee41f7b777b18ad927dc3d82e4afb715c3b73ce81e312cd5f1d19bcfad6afe5e79d167a7c0f6b74ecf3410b0b719922fb849cd5b90d94b1fb8df38dfae965fd2525f44d83cd1f23e80efcbfd022e9f31e9a1b6a4d0bea8b31160552a63ecabac2da035da734803954d689ba4623e171ce66bb878e12fb8948d5698f3632e86c9ff6c67da435df72f68a2d98fb568134b82a4b49581d3f256b1ed654acb383c5bd94b20f31c54d5b3d3950b96b2d253af7fff1348884a9c7ef5006c99d70464eaf6b23084aee7ad989f918650cead4254652efa6d08e1d119516b3303a773da8b680d079e25525d926e2f6e8034e16487f7ae717b8cc3e3d8426ad6f1cf208333badf9fa873bf8341c6dd4faabb011a9bb4223b4f6255d7edfe6c2dda134d47613788a7b538d28c18c4c0b6d00e3ae739d00e79ebf6a3c03850d088a0c56189751277f288b98325ecc908d9607611ff536e24c8a7b27a4dd266c47544c80b6a3c9f18f6dd4094cbb0c8767fd8cf0ecbd09e84bdbba664dca8c18023ceee23ff57a50888df93fe58e7ff54996d73fd6015b5ea151c754ca2cd5227463fcedd26629d86e4373efdf8219134ebae47336dc38b0010fb8622c839b32b5ab24ad065de9b255d1ad07253acbde03a3f9dacaeb5991cd1f809795cf5f036ecf09301fef0c889f91a94c053011994c1ad3cb7e75d7fcd6db96ab3705f678df54f0597c329803a714b2c32e04153681a06ce962b4b0ea3c7b3a577ddb5da6b21c0b2e7c7e42434835d6f1bb81ce5de932bee378d6ddac31c4d2de7777d1a3fc4416525e1a95c958bbd7bc15f8c48131e4e4b42d5cd374120c190a3273367d64b6e02ecb96e69ccd8aced302c0d4ecf08f55fac8e26feff663a977a074ccaf852a701ccf3009ed073dfd42a240146294dddadd5b31ee2978e64c27c2f3375d29931dcfd8867170324383f53e749592bbe55f0076a327cac5fb73e811422ba802de08699a93e63a4d26e5d7f0d8a4b5142df39aed7663e57e7bd510798d9b40a623be81c157ca973338c785d3056b00f250b819b24be9aabef4299456768d029f4f53ca89190658d320d75bc80b96364349d3643e2c70bc80c5469633bea82458b4c373a0f38491eab5fda6ccef14df046b40a01c220bd47a75a8e990ce0daddb65594a2ed5f904ec96042dd056567df7ec5c63328929db1e9162edcc699db75d6a97143895c24389000000000000000099a08e030000000081df9351d5567a88d2f5be84ea0adf0568c01ba7da536d67e1b6e057785e4325d4bd52de849ac64c5e727aaa394edfbbdc2167f5a2e4c8cf4e0d6726daf2ce542b4323c40344f96a1661dc77c117f914eef22c938830ea87c37bc91c831ef0c600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eceed5157f5123460a03e92273d839eaeca982b159677c5fb879f5a1403dc954b3e023a88aae19de4ce2dc88730bd9baaba88e50891d29fdf16f3be4e6e7a8d337425a76898fb50d103ae82fd9fec70df2ea79052221d37fcf741f9770e2c0765344d81a9977a0f3caf48da72ab3d01b046c4a1c68b92a3ad0b82ee3ca2932df020e3509bed2905a2a786654cba1d17cafb5a4760507131c8bb0e375059b0306f002279fb7c35c5929a48f192b131552be1382f812e2e880215f3fd746cdb110d5ab0b05f73bfb8e9d89792006da4e4b173cfc586cbca0c9b360cb21ff20a6740161c1a16ba900dec0e3f12db795854d16db5bdf50e1ccd7e6c92c2134235d76ea830d03062036b6982557fad064c951bae7706ccd9726f876bac4d5a809bb26e9aa93af021befe42a40ab56ed9eedb51424c955e2b898369d0bf97b7ae8c48afd8c37dd920202f18f9682c066f5d24ad6513a814984ed796b1df74ea8819e47dcd6f9f374a2022448cf478a519bfff0a785e72e8ccce2cac85f1826a0897131298b344987b1da0224dc999fefd46989ddb632c6cf1bfd2a8ea80c596921738f05caa5b0c5f30ec5ad1fef4f0a4dd6a89b42533960773b868cf1108cf4c4156cfc2f9cfa688a5ed8528db0edad1f45d483730682838ba71a56e70d941413581a126fc1ab1a6ba486ecaaae977b45c3b452cf1cfe8d319dc06344ac969c6e6ce93d46f500a3900f9199f9c6843989427aee8e31c2af3f010243a49762df5a206adb0f2bec55a8f53fd0cb85967a96090994564a6d2a87269116aca2a1847def602475be909c2151442367a051311fb95e22d9ead7e8e4836e9e4c23536482ee0136121a56fa943b2795f97cba60712e9bb1083fa78016cc696a91af32d8d766d75743043e4bdbbf3d797b160b405c4223b19d012028b93335f30938c3f6397f730f21c605c88a3e33fc2c515486757f86fbdff5d6916553ec606d1db007de01e2f7b692a056c84df8d1d411e93a2bf3ef4f4953c61c0bd9653cfd660b77ddecf23463a4bb5c5224d7e89478fdc2a94a198ebf5a17a87adafc88bc605e5b22dc5845702523d4e4125f29eb9e0eab2a5230ee783901aae233ed9c01ce0c88e389476b11df3b40da0f7f39d08d9960fa27ea162287c01e6de68bb0717982ba1119c81366dc4ee4dd8228c61c51d23a989ff7c59c9716737bdad9c4b125f80e84ca86b3d53c9351403ead29d1c311b418a9fe519baa3ceb7e1b94f8f3985f5311b24204cfc88dc3091c6b57c96f2ace5b39ebc404b564c5ac139fadb68d0e69ffbe2f827ba8d5b796a207c7a836559be6b615ee6178aee52e6625414eae5855d7ed1586ef60a77584b3e3a019b9d924bf8bc1656dbafeb10d94ef34929087e4edfc4e2469ed2951995cda733b938a0afff1a56d261716a6cbc5408ca8f37dd7005f97b8f48e3666ae0fe817160ac3caf2a394ce5cb8e9d598a765fe888cf61b78f2c4572d511ba1869849cfd02f97994e22888ccf5d062eb4b5a06238774f370042d70293033f8ecb039b07b45437ecac14a9d2cd42fd8f2077364a664c83fe7485507a894a92315ec6a1b60a6d2fef2ccfa43ce79964147acf958d5b9b7f83d0fafc68fded016d153f1da02c63bc190d31dbf20f4a11c696bb4aa1cce5a5274c8e588562cd160089646b397a9ad455146b4776714cfc728c178c434cb0478ec7e82420e8cea671bc36cee1abe4b1b79276227eec313a945e6a4833e93e4bcf346cb7fa4feae38fb4218f309c07c7a8a222b0e9a097bcf04e3dd7a831c65010c0470ddae77295aa96a12c4a81c69c298232296bf53aa269c24cd947e75e88693b81d9de6bde56a31fe4029f66c0c2c7a4a7eb384217f5335cc09b618be1f10a6d5020c1103f64c3713abb19f40dd92ccd56aba98f9fef5739ed97ee7ab884547762731dd413da6cdff0840d3808c694729ecba000274d8a0f0871d1629688c58908bd99f2742f4a26f6054ac5867a3b1980fb52200fe87d2af1eefb72526b5a3f543cfd3c8336036ac62e1e3709a0709f7e46db56ae8dc6980acac8a3fe126fe858b03ff3606ab9abd437652dc5173c6afed91bf47fc51be8ac9e9b4d718c27934ee3065215ca7be4df59ee1d7f730fd354b627523e6bbcef404b60510eca26be3dbe5d9a8924624dd3bbe2aa938a293940b728146e5e09a9ed3353850110a99f31f873330be312579fe3aa4d9fd4414a33f6cc4b45d62353497df385b53e5b21f214b702e70b55c4fda459ae33add800d602a8b32f11778d961ccc8500000000000000007b7f0500000000005b0af7208cb08815a426af0dad642a5c8456f90703c3ce8e083c0172107ebca35d7f8c4fe62f4732dc7afa241d4b36d640bd00a8fa7836c28fe69e2ff59a3dbcd1c7c156b04bd05bbf3bd1cf4451ad304be1163dbd2defe508a2c4274ce262ae00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000563f01b1fe6da502aa0b498fde7e3dfac56196b50ac6dad01d95939bcfcf6ff4c003ac3cf6be044f56d9d4a1f14c116ffb36ac61bf5b4116f23b540856f17b714e700f788884a6491d52efcb6c4f7cdb947e1bd4e92ae6fea20087b7613fa1fb31718045d338a46ea3292031c0a98c2bfc473aaec0edeba74eec270c1a3c1745030e99f413252fe095350f37938daa84527068d98f2d224ace2fd36d515086125f020325d37ab0849481d82d8d3732e73da58cd583974c086a682cb9ea45e26b6fe30b02def20c966cf15671634aad7100210a55ac0ef7da2cb78709a48ad5502f7c08937e10acfeb7a58c3371321585ed4ee1337b397c06d21d7675743d9d97d8761f031c1f81d108282904effafe1970570b8202e0ecb07d1d0391367848e7e3bafeea021481f1f3c33fd47975b38d418229d98911ffc8fa6611febde5039dc2cc27c64f0309098cc0e7b315e78fb28d8c8bad37e3762e06b523bcabddba40d7ee10692314030c3c802bce7c06df3ebd825f95c6c88558a496863d4069f5fe6238b8f9a09fd1020df19eb60336b80c4171e17de64bce429f52a13b9b07084de1d37ed3cb0c79095544de2c19ba7b9cdf2c52a5efc40a04d7a9f08f9a1f00ab01d2affc908600c1170b82543c2ab6ef62b04e5f3fb57989f650b1900c928c5cc5b25b4714e1925b44199981acc38fade344f297a103e6a2725852aadcd8aaaee0322017641f891f343f79a8ea9584e34e3e4e8583a4b9c16658804221c9833584a2e8a864690ab77a4fb22d2b915687e4e19d7d9f4190cae39aa07098139789a9c966a6d98cfa88f5447d835c82a715dfd9fa204a0dfce80124371a2650344de820f94b87ba3dfa04387f24cdbc0c5aa1e1cc457db3d3770d6f902eb72b77ca2a95906825255029cf81406b01001d68c399ad5afcb69de4ae4e5d9ecd540aaa81710c3d8d4bacd1ef11db6178b48013e9361a75f89b2d9e7ae8f4b61095eb890187abfe3b9084d56b130b56983a71aeab015a0c2df862c9f2b24f5382c6f4551574c9a42d659c6b24ade57e114453e3b1b57e793696c707a2464b5ccdbd97663d36f6e8500e18ee1a4755c70b617f006d4c01a76921959221d83a5187bc06eb35f8f34f3a8dcfb91e1670c72b5d7fbfd20d57c64e81cf0a4e023e7e2ae54e02ed82d090c0aa7bd34742f6025e3007498b8e7fdf5259de42a4e4bd95e3b69eed93aa88b5eab2668b68cbb9de92894c073e70a3f7db215dffb3664ea4cf0c590aaa709a8af123466e44f7a248d698ebe9168b465d9f39866b732048edb49a6f4e79a24aa62985965718f5b6121f50462b4c5c916a6dc46ff91351ccf6461611e0df16d8458e78e11f5dce97740f558a4d6febfbc6ba106ee520d70c53f84415c56a97d2067056b6faa0163baac77b5ed7f0c4d1dea5937e4326ad9d4b6c7be8bfe836aca97cddf4264c4692bb744cccdf6b297b137532eafd0736488c19c09c868b5d19e89bcc10de1a49d17630d1185064d3c3d58938fb99421bab60371222eeb2dae4f6be91e917d858bc00b11827cf86919fee5c9e3745f23810efa840bd088f81e13116826674db7f1a89832d6492ec9aeb4da3be88f27e8e2f68e7c89bffda489ea05f7a7aa0cffafe48755bc91718d274d5badfd21f67a12c63082ad1114a7f2f1444d4678d0ef74d3efba5959a0973e6550e23748c7d1953ac0b0828243b069dfd5a8857878a80127561e49c692c73605a939739170e568e1f86dcd622fb527b8a9287493b437244afb2a8f76a4ae95be28dab9194f51240ff58c00f3d1c295f4df9c9dbbc911a506e1ce63f7c389e1b3b7b97cf8b8ae25813e567a4d10d59643e2afe94fb82052765050ff77dba21a63a730758009d453d0b96540c10386b86bd91a202995ebd16dc39ed68042db0433c85c36ea4f9423745d8674dec09d566f54e9abb40e1adef8a00c690b153f2e22ae6ef89322e34a1f07f8e4df2400060145b43a0cbe83102ce955748ff550f5eb557cb945d321d19a6e961fbb557da2085e3db89869019b1b8b78fd9922d34ad8c38a90ea571cab46ecf5612ce9df94d12ccff0ae7e301f0c33a406652f834a53631fe16d7627ed0209197120e3c654e840f43cae4614fff5d768721fbcd3149f685ba8337a0532317fd693683cfd2358e1933b1853a6987e91f772d9dfc5d33eb11d790d6320a060da088481ca6230a73574637052f5e49e24e63128dfe514f81b5e7f777c7cc568b5a947bd99572804df00fb6f78a36f4e663bda8b199933e2e7280cccf822fcde493e4e8286d8ce8ccebaa5caaff1e5746e46a0cdb8c75bc5d551bc7569f45727ea53487716365429bad01d24ca0456b5daa638e322803ba7917a0fc57d34f31008284ac3e9eb5474f9f241c57313276cf6ec3ecde64e9bf1f78595e1b460f", "525151", 0, -1620502750, 1537743641, "8bc5e1ce6c555d760daeca464f201ca380d6e6082b562003b04562ca6a69b4c8"], - ["030000807082c4030206fa7824ac7a40c84f3fdd5563b657e91367c311c4b8749b3e3c4ff549b06a030200000000ffffffff6edc7b27dd4042a75b61aacef738965bb06bba010ec2566515d4cdd3aad14f1b0300000005535163ac0075280d990456c6f6020000000006636a515165ac1297d101000000000863ac5363525351513185c700000000000952ac6a6a53ac5263651487bb040000000002ac0000000000a0fc1b7e00", "6a5165530065655263", 0, 1296871893, 0, "6095a197ba2cb07a369d7d91db414a90f5f5f3ea996ab9f3ec49c5961f3f2d28"], - ["030000807082c40302dd522358edd038efeac90f54bc0890296392c7169118e049c0768814bce81b1903000000086a525363ac5351acffffffffabb0d599b4c9c696c412c4de3de54bbe4e49e6ba7222ba346be1a07d90485d7c00000000003a33bbf70278b0f3010000000009ac51525353006a636a8f8696000000000007535251ac6352534b49c8b8e1cfb6ba0196e97c050000000000000000000000003e5b1d967288d813484c02bfbb098c2dda0b3dd693ed047a18ba343a12c9b20eee169f520f711329ce9bb7ead695fdc94f450ecf38d4e4be18d8a20fafe89598fad751972e2a88462715c999d91abeaae8a918dba1d10f6afd934b57012e9b9c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000048d9ea7c741ccc5fef1f82ef9da1ceed3bf55004480b5a455c1a5eeb5a3851049da7bd6d396384d030e05007d4b6e5c992c7e7f4696f50906f176682c5ff6236615d4f244788e44f8ed4395ec8f737f8977e0260527f001091a113ff9bcae7d8f6919eb5e805db6a1c5eb0bbd9ec2dd70119e715be55af3c5d4d2c81c42e4c77031851047d41be62db79efd9e68671c17801c0ab47053fbb221900f4fafa3f64f8032dfc6fc468feeba25a193b1b7b19ddd3c27664838aead6b77d9841fe51ba9ddf0a027b2423caea93a73a6e7f978490027946a6d75409486eb61d8e2473c179d81e318a109fb558ca1e48859b222239ef3b2d247e35ca2313a165b767ec255d734d0317f75f6b92f9dd11eed14587d8091006d004a8e037b2ffc685015afd26194f9e0317d9239cd9de242b78c115bf87c67200e7e879a7c8909de81fe63a3d80beefe5031e4dca222f6eec3c09ec742bfec288951c01c52750006845fc24bd840a34439e02251f5bcb71be08c95df5bfdb54b40cb2517733d037c6d77537b2e2d834a77a58030d40ca29f431c806da21b8314c8b95c42b1f33d95b199dcc4951687c38c5d408c59ba0f4f4fd33382c7327c9a3d3f47cfbd9e0a2b84cb4fd8d6a53c4655a58b5c62975d1d97f85756470b836f2c68ed0145622709b38be2d16653fed02414434ccfeb3e7dff8f2e58ad19f7d42c659fd09beb70e0b4833c8567daeac96dd9c79de6887d2ada49a46dc262fa2e0baa54533d063afc10f698691c0398e1546c663936b39dd302bfc83abb6daa64c415420adc1c2716713a89e5e70066207571daa4e52e887d660291d5f62282d41a4749a35147531bfaa1d00c9ea8499bee0e13df86fd64e276ba440575070151dd9d59e5178a11ee6b1eb110eae6bde35a41e227c2eec5a95c91a931667d03a1b2ea437ef539cde0b90e2b57f341b4904ff101aa5a5768bdcb59a2740ec8b73e5f8bc5006bfb23c54f898e5b6d807f0988064ba58b8c74c5b779db261c45b59b650196eaae01a2974c29cfa09cdfe685c5917901c07a70794c62ba9c5be45903dc2f3b1401f2e5966b28f6e9d188dd53b1c96bad551418877d20648ffad2fa144c1fe6c548d5f894489e29a309d9d909c2098d8f4e7d16e63b6e6799a479b62101396957fc00ce273ae53116e24d602f6d36a13779d1ceffaf1a039b97dc8ded63934a82e30ba8ce86481ddb785e00a3d4e7030f1e957410148aaf8ecd17f8e5651ba4dbb272d0fa5437f61e117d5b4d7f6fa4522e4ba686a6815e2040e3889d8bd0b8279c6e7e0b5a3985d377d028652d2dbac885f2f83496efa1c822726b3f7b07422ed2a47f654523d18bc2c00eeb7cb2d2d505077842929005f010124689df94a10baea8b68547ee43afe35fffd43f0a634c2e8b41d22b29addd649bd08d5e64f7035872b056316e1c6921dbfead370e311077e8ccda19212817e7cca7cda6d54eff55db02760f3e79993fc773d3c401e89547de98082e2d015913a6e9fb0036234fe7296bf20a5a1684d371af5c76f057690cc03b84d99d4cd3095efbcb4dcc3c45016ac9df7fb53888adc62db301fd79f9cbec26079bcc1e84ef2f28b5772f89ad9840e16090c514f4c4a4b981bcee22725e632dd328a9b8a04a52cd1b1ae63ff66a0aea17bf340b524163fbb9fa02cfea0535c62703e8cfb74931a2b23080069e0f9d9b520e25cbd5e1443ea706d9ee8617ab568646eda7dffb92480e602dfb80718154831b46fa1e206503fba7ab2144e88957653a06edd264259c0bc611053fc43de00f5501069dc5c50c32dae450734f7db8da7fdf0f0aa6d300bf8a0ef5cd920d5d2123858d1a10debbdee69d177c99e43c6f9f5cfdb786f577386c531aea86c9c35776194732607e9a1912238a75f22e25c0f77cd953a05726bd5826274ace09a12d91ec32e5eb0d8fb09b30a9aabaedd4e0435e03be31cd52b9a1cebea7aad845edc7348aec10472aff059d2806a0eadc6ccc2167bd08aaa3bd9949889a137da9206d0c5e9689ec9e5e4e5dd8a808a1d7778351b08832b103755e864ce38ad01769b7c9c6434eeef3c49134345488a135432720381ae3f4debda284a3bf62278158114029cafa59af5f6e04ea8a9d119a6aa4c464918f23af441a0dd848a36099ea3b0ff2480cd411e7f173ef9a798bf258785872b296998ccacc229d6d590ef2989d8679414aaf4f7fb7f9d737ce57858001a2d973c2a0a97b337a47cbaece51e10b003b30a039fef1c1459388bf25655f17fd4d2dbe38d1ad4cf637a38bc753d8274e53ec0d6eca2d84112ec3bd79a54e5f9e378f47fd23c94a0e8d69f8e75191d9baaf9732cc44ca87519c4b17172c135427e2a5e5b0ee17bcd9ab420e4bbafca7cf34ef001816087b5341258a75b769e951848ba8903777b7820131e09", "", 0, -164932095, 0, "816d649e75206caf84fc3f87fb0742669759c4bac7d89594dffe9ef971d5d3cd"], - ["fa2fcf330496fe29f2384224a55d489c062aec450f84a453ac7d6817a831a9f0b294c7f8c00000000003ac6a5141ec288fc7c7f10c51a066612108b978a8fe6d156ef1fd8a8547cb14bb08f88c94cc943b02000000020052fffffffff0322fe781331d8615214f696f882ad44a06e62b053ba545aa7e3d7f7e904965000000000351acaca19b6b0a149d2c71b84aca012d6f7de456db7f2f52d0dd64e6dd57d7f244b0d038a7f3f501000000076a6aac53006553ffffffff0421461f0000000000075363515353ac53f53b450500000000015136356a00000000000265631812f80000000000036a655300000000020000000000000000c924eb0100000000e38a59c9e097e4374850d2a7088c08b19719b159955fad0880a8c2a48ce84ce5b897d6636ca8f170e4856c700b5cbfd487bf8d932ae87ec58231504cf892b6624d313865b23ea7694b66441dd49f0637f8cc0cc41dd1dc4a9439d4111bb630d3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c5aa21f707f65aa3268d4d44a52850b1d07b272b6199e24e9d52ac5049dad14fdb698698e93cf11257d7c0de5c545ce7280d571d0b5c3f5f34f95032ef8850bbe0d491624c2f58b94a8d1c7d788055821f53300a89dfdb64257c4c47195612c72b1f175764663ae9929502ac5c9c6e0bc3ab3b069ed6223318d26c46dc849290217f8c4f9040625651d740f2bd4fe05fce00f38a0f5d8244608c4a60905ed9283032a27dfe8ec48b9fee85364b7ddcef397b7ce8a8a681a9a6a109d73621e9647d80b06fa27e871b376ff9fa656960d6d16620fba5118eae8f26057ca2079d0258425f86007be778aa6c2c72889b6f83d46ebc5e7e30b7aa1f4a603afc20e161100270203f0ee6c08716ccce0d87c3c2eb92a44ac1610e3727dc30a02013aa4098890cc021d1468faf8791f2b9f8419023ca0571fa5708f89d831aeb8f0943d5d0cd8225302024369b2b812dd511407289dbae1a187eba889d6f9fabe90a06d1638f902bb810319afd7f1d314300c82d799c4183a288a4c084381f583c35eff60265f2ff987ff022b6ec40d9c729814733736e976498434352ed71966c39fb595c7627755b24954e7fd3a8c4a6da13839b76b597291db8f454079fff8655dcb7dc5901c70f461aaaee256b5a949ef6c5cc6d394a9fb1a3c1caed3e773d9d9331a9fdff1b47162b406704a3f6a5a818c65116756b138b3ca46433d009d2b7ff15734ba78c5024ee2c0015e830cda6871749983861c9866c6ee888be22f80bf61d3c47c341143cf347cac260481ca75132be856b99319a13f705e009de2f96f7a0900cc87c40abd728e41fa911789768d928ff6083e8bd124be93e6884e1f4b5d6264a785849493efaa495370335cdcc1d4f1cec4addb973f9e45c79b6483336ffe3ca123b943e4224683c8927bda657096c93cab3183fe66224bd2a56dd72f0001930509b94fb656685bf50255b4b7d8fe95df30c7e725ebc8a788913df2bb54fdf4e7e257875bacb2a67533302549c1a2aacd2faa220c3ed63377d6760180848b2f9ab3cfd899b41af995bbe2a6d7a6eebb7ce9d5ef0acf7f5915a259003d318099e6bd29fc038f894d82b5233cf4fa8175bebedeb0b6fffca5ac2dea977fd5534bca8411a7cca7ab5879bf1c54960beca9e9ba85b518ffa19008c986fd0c04f85c92007452a2b41df1b82edb3973c283a0cfbdc48a04092721bb2a462f0c59295b712f3d7aea1f7e74e0ab5ac0bd61f1dfb60e8d263c5db3cb86dd53b014028c96511e7318044501f24b7cd6370f6858c7e673d64ba49119e8e3d9555bdead02d133fa88c74b18eebd9898c3a8c0d0d51723fb5ecdbc92cfec3023df6848d8f9086b89ed4d7d9165ed3cd0ae0242f4a1ffc888fd99c5c675ff8787323d5ec180f856f3736656b2841961ee5b8e24eab973cf0748f62eab26a447c8ed2ce8f23b18e745a053bfb8856b5aaf920b7a9079b825d1b282d1f0cff0aa2842f10b3e25c4cdc78069430c6d301aa5bb585fae4545d49783a33e390e922c4c816905a4df0f0483dd4e456be16350ded4b23769bf701e0ab49257b8c45e723f5e7ee38050aae22d4a4f6d8f6666f0444a583071e575869bc2a0834b1f261703eed8a53d6f4991403d1af85029bbc8794d794dd32e9cc7ddec5a81aa53cfe148e6bce1f3c386a70f16babc22dc922a28916b20979df505ea6cfe102dd6b6924761f15795a610a95ed00053da9557f2eacea50add3dea3f73e724e8e745901fbe9e6eb7a5809785c7713c8a5a9b3dc120992f81bfd49795532011a69088137c9dec09549ef81b27cccfdd10e9a8249a40315aa3235bc86210207ede9297f30649f8c54b394ed4615740b8cfce809ec7de93fc882f84bbc03fa30c68bec777594b7bb117f5c81a0a6ae4d26f22c726025bc0818638715d862e70fb1c20d3b7623b0b266987d9020cf33d66de7d457fafc6b4bfa139efa13386e415bf07961a19f5064dd3ac980fbe607cb20935fb7c2042c81f39bb36fdaccc6ac92fec19a42dfcb5cd56119281307f586a90df61cd284e958ef74416feece3321dbb2bd867563d83dca2f335fee3e4f5449e5ff12446ae24dd1cdb035c6a1236b651361257646420eb1f21c8e4e0310b6b260c7fb8d6ac5617f560fa318109fdf0b4905b733670da17d760ee563c8cc37d216405e368a1876aec827f25a72058130770c81c57f90841b578fed45c86082b2e144fc8233f8faaa32ceead66f92aab00eea8bc0548895f4431eb991bafa8de480165228b7e4519639d8abce6a21f542a1eae4097254d010000000000000000000000005a22b5142a86159aa141ca1754f45cc960e993cf53f025d9ddf97fc414ced551bc58a62689399932cd85f2400cf3af2381df380a2d7a00703d151eeb5f74890115130430a4eb33fa9d33e2f555ff012169cf2807628087e48f65239e463543d300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000517d1012596f7b7454dc7e4dc419f058ad9aeed1a465da3ddaf144d958fbe523349b17afaf79d9bd512491626961dfe18e6f53cfa6fdf5494e874baba7891e10287adfbdf05d1922aa1466cdc68c95ef0f25dda99a65eb6b960a18808837f38be36e1a782a2f6aa9f2a799209ce81b70be740e5ea8944c0ad3ac8736354960dd020e855e6f892b7204c7c786726f36f729431a64c4ae9dcb48d2421d48bb21296a020150cc3792143d62420b456d900fce98fe3177e710b488e71d5de814a65e6ee10a0551ce9cdebd7b63fd7350e3b12e88f2a8ba7e6e747a9eb31f3ac20c464887c44f36db31e065d9571a8ee7936e07b903dad9f6baae0e81743e00e93ab6fe3346032aca2c886eb6f50f80b7c856e731aefffc400abdef707cc9eb6f6f024eb4bc310212a4a9783f439a02d7f7ae584725a5ccb56930cd26d23be1b3b34e734bd4a7fb0214a3edd60ad74166daa77cae27715e03e17a691a44cb2649c42ff69d5fa4615e02044ccbd45c728b21153c686aad86ed3084d2b58d67b880bd07310f24e0391203030af4bf6d11b485815e51a290a53bc8d7fa910915dc6b8d2180c19f48d1b92f8608e2177d66f0940211f5dc4d3ff727407a9ccf8ac87476a2d511562bdf16081887b09e83f5ee88ffcfc5c95a15ac585d400107237f08babbb539cd216b323c201617ea0b4edb65279a8c2bfe4b3dd1b7036dfbfceaf1d179253509886a47204e2a6885cbe31d2eba8a3eae302e06526528e32bb1e61f78af66d345846649241031409b42a381d585c8cc10638ec029ab22caaf701ff4e2a28744b83122dbdba9e92061afb302c34f4f39a31ef772b536d5a9321f2fe2e574a0e6f284faa6d3ad4b36f37c9f1f51bb5a4e06a9a9e4199f408c646fc890fc3a055ff01a3eb053d3d19c21d271cb1915bc208fcecbcb52d2e2d785b33bec9dda4af4ec23c60917be76b634e85fad9d4ae201c455b666eec533b48954fde9ffde44cb0a28eca15b2101f4f91caeb22e8c1968307f9d75f9f895453eca1b74c50cd1a969f5328a60364dfd95bc12ef954a948fd60ed8ee71ed518e9b4e4bce4bdfb8e41c1d4087828f5e3ab23a4cf34235ae7749b4aa1a517dced5be144eb5e85e12c2bc4fadaa00e2a1e3ed3e4629459308166e1b067f3d8b0bbd558e8c799f8caf3d93c5a6e982e66e37c19ed03fb3f73ebdc6d1f9ba3c8305d5ddc8ee14a8ceefb6948e5f6e4d8bbcac9e8ef66e9d028a0b0a3dbfc16a88f4fb7af72527513226c03848cbba5c265653b2543b9f391d12e1d049009c2adb2b718a156bf86bd26027e714fe22c808d75c9e6da8c0a1527b72b96d8ecab8d672c2accc91654a7a46d1f88143ddf2d20cba4c7a278e31dbc5be7d7b1424ea8dfa865ac65cc8b24e4ebf4bc0a9b908d4db6fa51b33a49458a465638a9b0db216f7dac3d3f0f08a38fe327faa18a770ca7fc425531e7f0d2337c6be76aec17207d81fb8c31167712bdd9a485acff9bc2c5f63f08eba2e9f4ee3ca73874dba3ffd6bdc2042278ba72efc4b118ab03aae2297040f26f7487eeace8a27307f13ad6f2b43ad018f353192995954aff50ce429430e56307063bfd534f51c7c2a245803b9578c9834937403594aac7bd6eb937d1ad4214f598463b482c112498551c9cfedeebd3c3a5aa3349b35d4598934ab945c2acf599928b17fccefc1c2fff40aae30bb24739336158a90117075ac12d44576590147267d98047d134dea808b777d6549c3528f31302dd2c3175edfe41acea7e690a00a97c95b9cafa1ba5a0c898e9c58f2dffc1b0e8a0c7219552edafae2d744e9a9ffe6b29e420a4804a521d353f7b42b7fb593af2c6bd520193c72c185e5cb25cac1182ae418347956425560c191de6b6c4550970269a19c8d8374123db57feafc5f0289217a8709b839aff535d730ebf499cec1291a639a02d861a9f7dce1bfb84dd782815aff2b3fb8f2c9ebda5b95a1bf2bc94b6f19004380a48b750459c50ac1fa9e678ca625bdde018c2c8be325757a096d340b2fe2cafd8c376677968d047d068b9cb967eff25f720f4d675675f8858e7334d2d8ba435f8ce3da9faae1d45520cfa60e99d6976525379236fe98cf30a0c833fe14fc11f4c472e9d4d4719988b11993daad1e925b59f724440cfabe4b9474493f0944e417e97b7af2f667a897331f121a5493fc032737a3b0f7951a7ac6b6fb14685dec897b52cde4afac75f8fc8d950ddb2490b9c2c81640c6e6a0735a8d49cc42b19fba5a0be7b849fbf3a0137b2030ac8cf2251143005f9cfbac2c3f2d9073bfaf8da5b6fa6855c510776ef984d8730e088f819d8be333b73607df68ba0b8e05a935cf5c19d4d87ea9066b49ab7e63b31d92937d664abe67bc4701c70fa4521c02957f7948e17b994cb54b67b1c7f969f204996701225609", "526500ac6363", 1, 1165745086, 0, "bf0a3e38f2b054d017ae6ace00745f6035b5159d052737e0c36e3b8e1a2a5e1b"], - ["e3ece552038d6efd5132f9a734aca10520d5f75582ccae5d1e402d30ec3eff10d52ff7bd2b0000000004ac00525357e9fb20019488fe4118bea9339f25be322d024e4ad008e87dc8bea73629698a7e13a9ab010000000153ffffffff7665fcf4d0ac9c966c3067b42205a5115adf51f6415e571904df6104969ef5b203000000056aac526a633781499e027d6ea6020000000005536a0052526773a3050000000008655165526a5365520000000000", "6a", 0, 1261280621, 1537743641, "c81a6b578f2f3f180b22dc2090e1a19f460046f74b9d064520aa64ba91f713aa"], - ["c886707b0352d41452f182b1a38f777c773244cb195c8ccaaf4c7fde8505d4016f03d99e6e02000000086a6a526a51655351ffffffff5a0c649ec6f1f78e66850a1c00ba4323b9347ef9d3927273924c5809467c67b302000000096363536a655265ac52ffffffff13fa150c5e55339db8dec4b8f76f6caf1a1539f3e4179e2f1362ccd0a67705420000000000ffffffff04ece40e02000000000452526351c987cb050000000006ac526a65516a4c0b3e050000000000978db60400000000025153000000000300000000000000007ac7480300000000b997edbc5bf880b9a6b6acec75d32f50b871f1938ab586becdbe220ab2cbf578d035e09c6376022c6befb39dd8b4fb6a671307eb769391638335a236deed2d7da282c5aa270893480226e663da56ef97fccd716814f5492331fa7fb44285ec8c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d55be1d043e7d0be2609bef332834b368308df25c30145fadc4accd728fd3cca595de97b73adcbe86abeca5e4fe71480db11c43aa92d46a0edb96f63e35c6a51c40d50c56c298c24fc1082446e551fbca82f9e5262c6e4b93690be6b264bc2401d4cec9ab8821cf013d7a3f2fca7ebfd3660c2b17ff88e51802723e865532afc031839f60019264de009cc7280dc7e872239a70a93ba27f0adf4f0bbda66d4e367021a594ec2572651d92deb80d4d5301b02cb5db5b9ea39c1920a329f97a6ca831e0a059f878ca1517f4a08d0e936cf788e6f81575c04e65073692c27ea179a49bed2c721e069ac27d7350f9dcadd308e323da544abdfb833f60b2bfd9afcf2b58e050220d092928532422dadab5e5846363d0916a5cd697313ffaa78594c182384791c030ad7b017cf5825509e10c718be62234fe0374255cd9e64dfcf93639ed3ba99470211bb735c76a653adce02b0b68d0a7c2eb1543981c58476fcbfa27f19c6028bf20210d7202f886a9b3a679deca7b69ee9ae2aae74f55f0b049a0d0b19905a230f600310bf722464f353d89bacc0bd9c2a0a86e245a3e14578355ddd686a1d0b77b7a5964d083a4907192546b4702e3ccde72a3d7d4e9019f46f860f926d768c6bf98bd0325297ac780f57963b6a4c81f50b5dbefe9bc26cd18c923425094fea6b332fc22994fd8892a7f5b12747e62263e23864f3fb51af00a3c54718886fc9a4fe61f35891ede0ddf825599d6b1b731e4aa4aa71513157e78531dee23d36bc84edbfc51a7f8fd62697173a4ebf28914b5d2a9d3650e590524f014597ef9a067aa9bfed5864e236156da72e092ce516657c4b73d986095e3176d4c06f6192fe092669e6801b2f927a5a884f70ee1f68d7fd69a7c9de827fb83e88c99ae9a935eda72fd6a187bb320e43630048814a023cbd1fa77d5989a3f03655aae8795773ee83d90af4b11985d90f6f2dd31b8d7f5b3ba6cb083a6d16982dd3d6c877a76dbdf6197b9168fe6deebd1093287e2d6a76a1747331e7962cbf561dc60728c0db94ad4cf69c1bea7a8ff6a5a5a5056e46149acc1e6500cc0b9b177183509044df36fc166553d4f0d4b4d124c43050a24404c9e119a163b8b42f25092bf3a2c82364040eead7e4db2cb3150ac9830c210e678b21052685abb1872b1bad6f5efc3abbc4ef7f042803e5490c045a8e1e6556114a2e06e65ebd617d220ba7e563b0e2708457f4a1acf0564088f4d7940f6c9f64e1804fded504b47abf04130367eae2d189befc62b394d941a2b5bd8d0efe53c61e9bd65e4e0ce2884b5dd5afeef8478570499eb5b98361033b665ef628c42ec6f9d577f21683ad6642634462026b748380fc5a9763d99543f784afe7aac5999060a9a8c31e1d59884f46b8dcefb7121eefe49d7641edbf2c84de025378e8b2c4b8a84a6542097e6893056e742e61a422d64e80ca75c351558a29831d7fc4eb28b43e01f70ed51d94201d36241cb3d6ba2e03e1bda35c34ffade9891260bbdc1888aafcaebe036048be38c54fc0556664efa83ec91e1a6e5aa4eb7902c465dde0e177bb931b09fcff27489697ac71fae578e13e7108115713068bccc6d7facc9ec995de59e52ba7b715282945a60640a93775d1905f9ea624edaf88acf5d02cb14bd87db706a494de0e2b01357fb8c4267e6a38bedf961c6496b87f85b4dac3e69cf3a549fa5cff7fe4bf6081da14cdd7ee97ed8c25cc105c87720a986df41c32902c1604dfaf12e1c2aa5330b4244f26e29cdeb1324b2257677bc4b50e186f9eb6ec5eb4a5fa8c96f703dbe814d19669c8d0900d4aeefb53ce3b45f65219d37e7cc8943cf4fb32609964454c0e7d44939c90e569902cfb54990b8c296ab0fe2f2c227199cc8f65b1d93cd942bd4579b8e1df7a12ddd37087dc2f4ab54bd9d69b06e8c8c657a538424a49b4d238c48764594496bf30f07bb8976c1178e6fa91066993a63c4240b443d7c46577d4d955b06b5feb5bc88731f91a66204a9d0d088fd5f00a65ac78504a5a5dfb11512f485e58f7e3765ca8ff4c88bde9ad7f52f5b15d91274d18060b685918fddbf356cb6a2b83f1bd54867338ae56f2f88bb3000469508be1d92ef6bb272ebe578629d6b53a2c1bc3808ae3be8da90f350505a49c72a22f65e74426e2cf87a605d77ae5bdc1fc19857fee3c45351f14ff4f1380f4408690a51ac3a22d4218e4b161bdcd54b2f27d0c19bdfe18be06df877dc57cda66206fc2649ea40c9c4f022b902c5010c755401cb03c208fea7b27d1a5a16bdd0691fc0a0000000000000000b2e37a040000000028b21d47de8cec84a1336c352491c170499926f666e5fd8a439994fe85cdfc365f62ecdb29b81aa8746b8ea60ce902dcbd4d9dfe73707d3b6224e05184880015a0361f9dc1552b8c5a4a0611b436251cada44921e699cb4142d21c15b6f011cb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a6d9e18c4f14db5e64390327628b7ced8dbcac363881359c590b763e667d8228e916865fea47725eae794cd2e74b8c5721c3f9964eb7c112ba226700d4c8d69ffcea656d9222b019825c67395863bcc31f0ff42fee53ddb85f8d52069bde4cc58d7cc6178acfb35374e562da9398c77ae475ef057d63f3afdbd0d49957971b50326f4b3b2c8fba1bab68bde8452e66f665ed987f208da15ebd4fe50e75ac15190022a4f1d6b5b3a270d44ed5070f984fe6215718f6b878f61c35e4e01a03646f9ae0b07a5a3510af726e9174b2342f32ae796247693e583dbf03dbc645bb22f9de7b716f2fde1d98c8fd5318ea6f2a6498d4d8d5516e40686b3efad308ffa7f9dffc5031f49072f51b97b29e2d544b02f4d27be616705ad9d13535a8b0d443e41703bf70210d3ec0717ab8cf0b866efe052589abf9d00416e8f33c60ba9c50ab45bf35581020d4292bb340d033be7ac6d0a221838c7e283bed1374bee1be2d6d99376bb9d2602224ffd83b155eb8cc0305c539e5686d525aba48fae103d0c59225c18750a81690223dd1a74494fc8b750140929daf9cd672a4bae27d0be83ddc5c84b24555928864b4058e1054127606217a3154e9d1b36c05be152331728645e955623224b5bc136b1d9dcc1918835b14d7025d28eaf970f56aa3f38a32a00d7aa26595dd1a909044c9f67fcbae8d77806704f945fe0497975a8bee41c6b30ba55b3e019e98ca3c83f3e0611e411fd7b3a116114b4690a8f57eece045070ac89dfa4185d73291f83787bbae2eae47d13c64733420231a778ffd93f563829a2da661bc41a4a5f676e0f4c654b7011c4a57b71eef9c997374d75a26b74e68766bc1b8090748231341ec0be90c56a4b8483a5701a71875fd03c6f612da102e685ab3bd46504696b3934e60bcf202cb8f7c6915d934e4183f10556563cdb3b457a60877049724864ac3edc94abeb4dca65e617438ce2b5d51bb6808dd02d026610f426d869baf4d3c81c55468871162b30bc9fdd1982a2772c5e374c8a2aef6504ebd155289463e0de3dbe7fed0403adad6691d20d40024bd80ae6bb6136c242df1725ae1a0a0349e689b5316a978fdbff2ee389bc5bc202667a331c0edaf0b74bea38f6ba90ea0dbd5529d4257cc93e2c3d42a62aafa7bf3c708bcca601114d8f58e06389d15e11d581a4c8c50617605332791f714f7b2651dfeb4e3e10b0de13367288a74085a1c9b5a100a5d6dfeca2dc426e8c0340436b43051cb8ecdf2f712e63aa255b2f4dbb8068cd273eb0c5e78e32fb8836d0047fe322f90facc7684d06ec87460ec03d18c8d0642ffc3a9b38dbe26577aaff4392c54780a98167e6b4d4adeae58cccd86ef38dc3020214569a0624316dd588c37d0c38e895ac68b1251968c107ab07230c100fb25e9258630c91dc1ef29018d8328253b449da6ba930aeac0ddb2514162e4bde6e61195ce59cead7b606ea654e26a40a8f1c5c601ddd819fa0fa2ac2ad0232c184df326f23a9cac5f26e669dacda451cf56299822933af2e924f1ae2a7f2ca503e9b97c634664821fe6eb26ac891612019d5845243935a566dd0987ac2e6f6b3a47c4af44e6e3c14a6c925036ba71a76ae71790a5aeb9ef7fff76f1ef7206203c9c8706bdc8229b51cd5396a4c69c7d907ffe7ab84d83d06e700f9d3b96760a5cba7ba911358eb11459c10a5f824b182172ced501f8201947613cbea2a552ca30dd8f8aee7b6caf49163a8e17f3a911e7f436d2688a6904cc2595fce5407853607cb0f4ba6bedce3f6b7aacfca1bfe9c11b0416d511bd4ac02c168fe558971d7af540ee6bda3e82ce65b634bb88124a29fefd953f1254f19587a2f0f951cdf120dcd672f3707a54ef0939cc1f0d225e3b116b39cf6426f771e4cccc0c3c6db7132e0a4cdf37f8ef82bd3d14e88a1fa6df6e677ea04249bc3d302f74ccd82228a57852ac06c4e65e41abd6c4de71562a399e9c482f55e5bcecdc9bfa6e0012bb0df1e0d3c5c5efbaee40dec267b21ec05ad8bffb22470062ab30467a5f7986fbc5d6e888923602bfcab00087aded0458d23fb0f9f16cccde224ee8b5b0c1859a791dd8ffb369e561f52bafa57027840fce9428e9741d4e7017a22fa5ea9950c97d19e46dbc911a17b40d45f77f3c567383e69b3c50e9833cf5e2177109581872e8e1b71c16805f07b16ad883c35024b04c9db2c8d633572b83a65bd13004f4d847e0f22e5f8ac3aa2fc33203f29d4736888204c83a59b45a5366ce8bafea234aba9ae3844390c07155e29a2a792d0b9e300000000000000005786050300000000872d05acb19844b868cd2e9abad2befff0bf063bb68b5ccba9d8d3ac1d5cc03937fbda273dec9c6b87abc83628e3a5cbaea749e5d5392a05d5e1477342c54af1d95145921c3101d01e42edef10eb91d70667b5331babb6242efb9aaa45fbfcd600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e9436926e6fe2add97646f4c37a27cc82afd69d61ef8be19bba4a721d1270cd23045c8c9716fd683cd5558730555004675a280918cf7b81193882a6cd084f5461dc4aa4d52b3080fbcbbdac308dcaf598c401fcda82e1aca16f33e290c1b2f93cb272b650ac2872841aff5293271e8a64cb20da0a582cb5d6a088111d78ee76603279384ef247bfee6ee1c29b86e2f17123ce3f683bb0c048a8ffadec808a4ea980304a6a21b15eb3e8e3cd7e80ee1bde00247d0a15e4e2c9cd04211668191f558540a086498580ab9778053c2bc6c9df8ac3c8fa2aa402b30d2ad743c2b9d450a2ebf8024e6f65c4cdf8f405b09c9fa57b7650cb045066568486f23ba40950330ddf10211f0e5e23b5873a6507f19a0cae51783c81396556cc973edda9cf72d822f70eb030597c22f1499acbddaea07707eb7ce0dbb55cf286007cb88a92816a3d644c5d9031ed2ba73b3dfbee0158f6c3041e159b204d2a71e1c98454b60bd1827fbe07bb3032ced7d23be1b69a537519ec5b0c43b80e3c699b8a298590c6175d54df0494dd70321e582395589900382d9c35eb23ed2366c7cd136e7b1bd6152d10d4322918644c409397629a8db9e52c2c55fa16eee513b39fc478581a39838260f6cbcd8a509b20c13e08bc64a02703add48951237a7d75379c5c1f4658a41f9e11d11db67977d6a69a8b3a2ec31b4efb5cccbaff90d98bcb15494203e9c685d24f74fd610672c21d9fa0fc6030d595ab69dd29b7813019d05a6b07671e5ad751e4cf24cd737ce5bf72d185bd1b7e991fcaf5f22146d9da5d266186d862639b4be13d952af9dd100d33f3ef0729f5b69ca2e42aa5f3c6066addeafed4716fb9ac1ea1179149f55963cb7bc69b85822bf9669e1753adb2c2894f9c4399bb8d471a2fa7aca0a18e712419a00b44da7b6a6ff733ec217feaae6097c0d1a425ae30d8b0f6e8517c19a0755c606f262a2d98e5714a225202f69d1fde03c17eb7d2c88cbf32df54e6aa8789704f75446b5ece221234a09b96db2563d3825c196e6a7a21cd359a8b9724d8cf07acb90a9f93e2d241963a52189ba95df525c865517f4fdc96fdf968c934b77338431f7cdcb5e706dc8d60a4e9c0417461c323d59c96abda42eeb4b180733d7d662c477e9fd75f08be0600a66478586a33e00e162a26ff5d89e57554595ce087a1207ac2469e9c19e18cdfb9994eb8201993c446fd1c12e4bdbd9e11fdafd7fbb4b9847d1759cfb226ac26e577cc35419a443d1a305489214ab8b504e9461a3a620844254adc1f0edfe4dd946747f662ffd5980fb704561e4bb14495a7246ba808825a1530d8a38556811ec99fc1d6c05fbdb7c09b6083c8f54ce9290b51366b0294f99d3764fd97afffb828482a5a4b961bf4d5f4329a16f5e140fd9a2fae7315bb1a419f443e79e3cea93e579a1222eec8576b448ef8a62b45c705debb4a9cc431dfa4879e585b5dede4ccc1ba29d7ba59e0f78910e61221237cee6df834493460cbc210340a0da2ee0ff5742ec9b44b86133c82db2af09d07181a007e52def410e9d470125dcc772c49fb043560d79331e0965609b048432467d68463bfb564695458e2d5bbc1a6f8a74b973dc31ddc36229945ab2e7a1b8f1dd8b555fe5710beb2876f68440b7d9c3fcedf59dffba462934fc0f12ccc1ff320a6d63dde52a38416c2da42c1e125fcc217040f1d53ac1b97ee3955c9df4a2d764ce6a914bc0d059b55f77a51f1a2680e9f816767d02e3be1c6f24bce2fe84136dcd118aa804cb7531b4d749f6dcfd82f66a1bbc95c3ac45368f63bffa52f5b37c5b2396c1afde78212d784794b91d3308e43216f3ea39123b9b926cca30a27c937e50bbfe524db701a8a0dfb4b41192dda2c4b62899ea41c3297efbebf24b8797896ad2e4a45d4cbe3b6a349dff701d270000d3657c9ebb94fe619708a4f1aa3a986050f49d4dedb96ab3d47435e6112b289cd7ddd636c24db9b63cff2e9de1b1dd25ba936ec4f96554b30542579a289621b4a0a9afbfc4b8f6b6a584613fd79b846c204d691f838a3529a54d0b3b1c49141bc39de39b3ae71079aa7133eb2f4fa3ce1c62a5076517040d4b2cb6f3f8069f67818a2d0df08a1fe87367b02a0467c67c2f073c24d137fe376e65e6b03ad92a6b5ae9f6eb55546cf180d84a3a972dcf905cfff31b9a7099a86d43a8ee62ede0db73aaa0c8f4f27ba1f25e7a75a59cca592b9245bcc692a54b7ec9cff8bf05dd09443408e63b0891d87e9315fc9c14f44a83b69622b9fe1f88453608e4ced026afafff53109f63f2b5dde88a99bd5a4937e5645ab70e52669d5b29d4517eab16f0ead1ba7801e4fdfc31f23bc5efdc1aeae74f786453f2b68230f595ab92868fe69e8505b2e1a3edfbda66574d267384c58ec0ab2f350c25d9dd4216839c0d6e357404", "63", 2, 541018740, 1537743641, "684bbcf0985e03ebd6182b51685842434565e8c827d8782a88c792a0f4f1e871"], - ["2de62542042470a12d111a087e2bfa99be5485a41fa66821b00aebc9355b06a3c771b064120000000006535300ac5200231a6a2c9cd9ae7d963fb5bf96961f41b71569da1380bc55d9287399df60689d7e3d155503000000096a005100ac51635265f198caeb9784bae92ef492fbb320d7589c15e5c8bd24d621a23ca5e8c115ba1ee0699ee50100000005ac53535253ffffffff366fbaf2ed8c24264b02388a50c5f2f0a60d3611ed953c8ca4cef272d6ef63530100000009ac656a6a6552656aacbe657d1d037d5b40020000000007536aac6353636513e1e505000000000151130f910200000000000000000002000000000000000056f1bf0400000000bc28ca829a8697f953cd2c0e91a31dd3ecf02a33da58043ae6e20dd8ec19902ed4ca84d20323b7624bc6e49efbda76fadd967467c4c9c381e4aa4c676137a7a54bc767a8f1c405b3e3859ed87469f0b3432afdbe11ab010e544445136761540a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c278c790e097db1f4b2c5c34a4fdb2f99887ded5bfffec0de646f16a250d0752a8270d4a0707b059024fb873788061cfb96197a6728f47fb41b9e4e84039563f29a144f14f3d128659e5bc7a857aaefad5e1d1780801a9dbfcbb78253e3a3659c1a64414d50eb7930fac1a31f8435633d233a016938647607e7fcac19d4e36903077026ec74e76fc08cde4b773078a22e67c977a49cb283ea278ecf448dedabe7030c728c46ff7e4e761dfd0588d4873deb4f534a1e2ab15995c23f143caa911bbc0b013732ae0b4974ce5dca03d2d31a5899727904766f69808c533d1c764b8b9a1a8085d752e92f5471353102cc31c370174da2d713bca6dcd726e9a77343fb7fe20228b4c674977b589149ee76d2f62146aea119104e88c606aa321be634760f6159030a4d1bc0e624ea50b4a139796afa6e8c9642f7b091054bc0c6b107a5389752f30203d97390cf2a73aed7b18c3099299f11077aada4543aaa25a87f60d6121ad1630309d81ed306d180baecebef40200e187fcc46092afe8cd621d99268b02454d3fa020043cd684ff1a636ffbc48cfed8a9bac73b8ac0bd49c9a2ed246a66f8d44a7af92379356ce9cd465a8da7805d6e87f2dbc2e40a7c81b9212e7b555327b0a2cee3622f97f0d0d9abebb3b1a73dae94daaff7ff057f9791923198b2b91fcdbd72dbff7975be1a251632418bf24e99e6fc9ec25ab4dec40b852f6d4ad7d5dc3b444021e2f8131e7440ae3ebaf98debc4b4e28607110122ad9bb6e0d065ba28fdf30148c4b7cf3935571a15b047d6292abd64e691063a2120c220fd00729290d7ecf4c4b6d1b0ca8df5eb5f0d27a73600451869d2c4b0cc451d2e96f272057dd1c77b19873027fb6bc91f5b7c4eca929730d19546248014cbc18c11b940a7ae2f846985daeb6bc0f9f3bcfdd1db5660986ccd8734644f5dc946104fce4508508c319c75b576fa1c21cc8eb44d7901ad8e08d2226a390f84f784b1815f9c71e885a9ae154cfc3c7fdd5ec8968a76bba3ba7cb7e13a9870fbb80a1c2168c38c371699d0c7f8f4fa8d11c16ec75c35fc1de5daa33c253c2ee28c5a2a46849e30a6b9e4dfe9f5d2cedad1a77a5435b224b3c81ff33ac2fb66e17981ef8a570f7f4f3d0c7e0aa530438fa9d1326c7687157b7f30e90a4c8f53d897947adcc3104ad99f03528e503758bc17fc5c412357e22886e1eb9b56aadd51446145046d0cdf161c43fa98351919124aa759bf8ef8956639a7b6fa4d794085b125573095b76c210dfd8c8fbd6821b330662a7c09c0131e67a3d5c323cda305eb3527937f9f44d93526bb0e8591b7040f69f357e586a30132f7cc6238cc9ab47ca8773f2cc865d10c77e824f6ee52082c90af3b37693e41418d4b4367256a1a070a99e01d72d9b982d0b9055fc9e26c8ff3b796f5ce63b4466623003711a550412d6691b340a7dfdba314a6bd622c05d4ac9c3e568c85aa07936c49c23e75b1e78d9dbb120d87cdababec1a34f9b34f3fae763f63d76a3ce086f32ceabdb1130db6842d72fe50fe619980c258b7b6861eb293272333368b5c477b42239112cad52795d6a25d61dfc7d00078859a07d4737ec0147114712ad24dc74aa4a0e836805938467c7067da819655ed8760dcb57e93c0ac3c955f2b1f491a57216afde18da6a600ae26e25b58c8efb0d0b077200c6439df2f07309ff29b05aa9f595e3897a9b82f0672381cab3b3ee3a5e268f1ac5eb0ecd630d09477c113aaa901844d95a36e96b9bb5143dce226071795363c40558ce38e7c8b747914a6e3c8adc21cbbb4841820d788cfea36bb4c1418ea22bec343a045d1e969ae19c0db4f5458018bbe78f84bde0d2f4f2377ee98f7c1497333869a34eb04838406f75b0af485a01fbc952806d4e9e9101580df4d2fb1cf8c10778b9f52a627b0b7173da1694e7fba49729de7708a4b37008232fd68ef4683c648d7991ae06caff263b8d333653832fe8cbc9c2079b1aa8eb8f97cd74ef5d3be16af39046dda9147ac418855f32b33ed5a50058d4a0a03b7764691807a03e6470f1520472d22f3076959dbfe518b0e380f44c2595771d53c25a22dd33665ff210e58189005e7583ab8d9cb097b76731def7cf11847d7e0d3afe925fd9f129c25a3ae042c5cbb7b2607f3f0ae47cc5b2e41dd18f3ce9ebc418b166c5d277e581e8da6d5298f182d429dd1b97ab408ca5d9265af373f13de8a6c13d565c40604d2390ccbbb02b6fad2ee94694dcbe0a50a3b2e430cf8d63df76cb2615646ce25f6fa852496dfe2cfc2b4cad00000000000000007e17400500000000805222bc610f25e77c0f281994b2afdc1078daf141d596e2b9569d6bc29a26893f6a8b2a85edc5c9f65f1a9104a47cc764ef6963c6e6f207d5d5161cc8191ade0fe07a859490177216a6c9673b39e45830809688bb9b4b1f2417384f8cca2eb90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000092dd658059daa0df0e99ce7a4bbec9a6824998227ce1c71687f17d0598dee2387dc9c7fcae9edddf5000f2785e88df8c7fd64dac750c8fc6052405626c727ceca4b0026363bc9d50eac1d07e41b366ce3e49db0e5cd509598bc9184796911beeb01a5fa538419cb801453330aba8db398589812810d02c3a5abfb068335a0cd4030fb6e562731d3e2495846a7cae5a4b3ab6ff151077beafaf53bed5b6cb0fea660310290df7a81837e609d93ff62ae461f628cda210708d64debf5ab8080e828be10a08823dcdd0fc94a0f555bfdcfca3d6c227f324e134a8735c4d1552974d6dfc53f9020f0731a52f2b36cfdd83d962e37e5b31f6721cf1d04215cf19fdf95cfa9a02274a66509a9a7485670843a0928352fdcfaa5d1b31e0a65311d202d9339f53b9022dcd76507496ac1fa3549924f2addd07b6febddc2ccee14207eca5f7381f5619030a7fa854042250e7d7464d4ff8bfe56fba473e9e186020c2b4506399932961d80218efdecc36410bbfb1ce536891f924c3d46ca75b0c7f46fe5e93c7972118f1ea021c6af99752bc593358cc543a0d144fe234ff89d67e939100f365e0d110cbe85e67d20904bca456bda8194f3cb309cf2777ec482ce50cf627bdd1b63937e4f9d33ab3a00f478988317d3e835255a21f64e33db9eb92a869edc6dc024c8efbfc6c921259457819b3a02f2f2b4f9676a18a29fdbb6522ee7115eafe55b7c99f546f89248a5b864496a47904f5eb8511c6662010248da9fa4111e7e2e25da028d1a882bfc18a145b81900914f52123a789ba0404e1c3811eda8274eee5eb4e636f5df6cfb5f88ce231daadac6aa3c1e9a7f2818ff5033489061f18952626c4747d80e70e3af1d78398c3c420dbb5617247a13f9f8db001043015e8f565abd3e3550df9ae7f26ea4160c94d102955eeec87cb74438320cb59ad8e1d994ec9d5596b457c46eb9cd75a7932ff7d16a1133acabeb0e539b6c665b8e52610a0b9236f6a545fe44af6dffa1a45aefe57e206d574259bb5e2dfc5cf0469081650d6f8d7b366b29d033e3b14a7280e0f2e77f77849c7cf34de59235f70448a5e61d61516ff83fc734aa4da6c4696bd5a30d8e18ca04e7da3cfcea78c7c8b8bef53c3217ea528470013394498fe797ea8f465e9d7df59f744514d136d5c078200cbc849c353ad7f5bdfa98bb1ebf7e0dda4e0cb3c707a500aabdc770a5b4e81dca56c08929ea8eb618c6f99dca0cc20ac16c66499a8ac80cc95a8b71c7e5d7d8053fbff4d164bd0a05b5aae8772c3af0c54ee635908ad8d1d33d74a6eaf4ff39f1d33e754a15a3d8c104385981f051c1b7f2a8aa9c1c53e3a58dedfdec307ff7516beba9b3006b73932c4d9bf2e4e11e2bf62010c5371e6fb4bb8c761ed35a21090eaf34941aac3d45369b9c679fe828acafdf2bd12fc558222c2f23dda82a6da7cf6df8a594bd9a88b61f0b69daee6aa2923fef9f660d2f503934673d055550809039026e9c9a9ce739bf656b3efe4221395aef4843331da2c50ae2ffe263df2f6e7a2fd4d00e00b8e0163f4c4aeee12113a5145c53f502328702d86820c0ccbea589cf54cf5ebf3ac49ef3f5be733061495261577c68f560d115a1e6de5152e6a49575b88c7813b8f7b1bd59ac41984ed720fd5c035064fee9dad5e27f0afaeb2cf589ebae7085639a24431083aff6d40d307cd26b87b1d912f8481961dfb5576504019b99045d18adf0c6b61edc6404d0f3bd89a2962a39e009158f7e2e62996ae7ae2b6a985a787a13153fa3c01f652b5e29ba890e0e7b40cb547ecd9d8438e12436fe67816f7e64432fa55889cf481073fd2ab3c45140cb65bb1880c587f154026e2d0959c187959550879e0a9012db9e46d9c7685921d5afc56b2e89270f816d520adca2ae8a94d0cf1ef33cb95ac0dc30a46ec7064869b359ccadc4694aa1a691aa9d3a9489f360d9c41ef3f003f588faf18480eaa532def35cc3904fd2d74fac0da8fd8e91c7463216f5d7d0fbcc87a16dc80cc2e12b002c3bfdc9f0b5a9fc82b6a1e095f8af7a88c1bffa1de9b4b1948e857b9cf5a25ba38cb884a6a0ccc95befbdbdfcf4eb7213fb57b4742aab66deff6c9b26d9d3e16e084059fc29ef04b6132975ecee849675f8072e3916167f5d23745f98f43137d9b1adcd9becb55657d3744eed8c0dcefcc18e8e6329d54565550adfbf7b4a7994ba799ed56e05e7d45bf4a9816dc4859799352938190299869fc51a0b4d2da93c5eeae5eb723f4033347248d2f045bb00587bb02be4d6d2bfc18a5f927a67fd68f9f0e2e3ca61d2862610af7851788d3fefe0f89ca197b570dabd4bb291161e3ef628b6f3942b6d9c0ba8d4e53c299f2c5bfa802da3b1798ccc0e49d0c39580999cda5c203326a04552a9cacb07cad5850179e71bd35868803c4983201", "006551006353516352", 1, 2060797066, 1537743641, "e0fef2d9efbcc5acde65653290b292ac6feaf852a2ec657b5cca17447ebf3fca"], - ["030000807082c40301899680fbbfc04a4495a718f263174e6cbac9a7660e83b70779cb108e9c31fbcb0200000002635109cedd66047df93d020000000002ac6a7a47170200000000076a5365ac52536a41f698020000000002636573611f000000000004516a526584b500170000000001b18b4200000000000000000000000000038d3dc515e3dd5aef0651824bffb2791a5984242d5afae43fef1a3e3a90c74d68a220ea19ec5a24f20f6fabd30a9ae562607d4d79da58b020d26de0931ea1a7ac78101cac4c7e204e0f7b29c2c8b1c68e9c681707efc898b03095a9453b40d900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d610d959d446fd5233bdd87d6323cf86917919bf27177c80187548d27aaec2831b2b5b4a18fd24bb42c156a78d3c44fbdd5382e146b95738e1c35b7fb7edba218cc8e8b661ef41389fe61bea3574b2a1cab256169ed63b289d8d931510b634659f3bbf6773cdd41fcef6f3e4a8c5572d7876f415e731a03d85ccd017bcd893110202c6cdd919cd6fcccf6c772e220ce697977d6b382be0c8b01c2ec48070c3ffbc0302269cfd58fcbf68f9cd12e2a22f77d4a1f6925c0ccf7baf337ad7927bc336ed0a02328e2abab354ac168006bd246e43da09b01db38ae8d9a6f803b7d528c1018a3cb8f47f1f64e59735063b8aa819d178460e489d3b35bb8d2ed19e33991f15b1022370373befe7104e029c7e1856804643cee9347850df6fddff0a1f60c3c9637c0213f117deef099f083d51e2741c1cbefe3a476e6d90a6729d36eeafb7a958b3c10213c9a960901c9bbd7c30728261f7b4c6f4d8c2fed50ded8be4afeb3e2e6f01410212cb1c0db2f4103276be5c048ead41103d8f18f5b4cb1fbd41057c911c3bd7c603061a2450ab3d49ee721d1afb89c1b56a0098dd42b6de176c70ee69abe69804765d3363e43e96b1b5a0ccf688f75a474f0a9aadbb520d95313c49e1da141c1e993a89008357db75ff7d6ba70da1fa54ee5629b21761e46c682659af4c40d18b1c5fd493107bc864fef27eda9a38ab561724531dbdd2ab37410d7eb018f51fdabcb5408de629b0988ebf27a64f820b904421ca77862ab177c651e84ad221dec499ca0082fc7e5f9e120965ba66d49780e470d309f5c64a56e0173aa659ef8e5941b1829020f6750c81cc071829745533a3e742cd9940aa62b8e321bfc8edc018d1d9b3004dfda08b221257b321eaa0ef31b8f915fcac4a29de92fe3a5ce904cf5f60d0661debcde45e25d12810b5dc7ad6e310c12ec86059b1ef174731f767ff2eccf217d7ef65f68da11aecdf52f67189c2e0439c8d64564cfe8430edf310d2f54675fa5e179e81900f58ef09de847bb06423a38b6081bd02fa29e4067ffc7a4e42e07582471bab626737c37af63db8895d68b655ad9ad7f17edc48052662d9a302bdca686e4e5b5f6edf9a215b8ae968035b5dcaad8b018f6db8f013afb585a11666b8e79ea19f7a7bfa39fe3e0d0e4ae8f8f44756f44542d31f44abde2ee8bfbbe2693d032554e2167dc353f68464f27e62ac3a13660734696fcb40efe676e90989ea6621eee5778e90e7dd4f0322e0b11483beb53bb7dd658130fb8e53277ffc5d38565124060a036c852110b05dd5aab2158538dc6bacaa4649bc6f5d754c4575c8b33a24cdf90d01cea907efa10b2c8c3b60ceb50461f1d76f59530136d3ca79712e9f4520a74365937b63336c46d4ed116ef799954049a79a6ae8364b685387a1241ff3a5b2b4f30c8abf52172f8dd04180b36c97e0553d4d7ae01d255cabe9c3d5f60c1027a6fe525f69c70f9b463a0f27936c2b0a6574d60f0900b29c2c2bf7c16df745c5a549751396bc0bce75d0fce558fd1a399d841b338d099c51e483c905e955ca131743940535e668991fe31cf4b38afceea0849db60295ba30f7f07c12e73d854379d4bbc7dcf041e997cabbdc5850e447c6abc54411f4a4c175065af856014fe3b28e276ff652e6bf6ba354d780813d19edeb9cfb718b35f0ba48fe59cefe6baad6a3e075d19316a13ce077960b409441a172dc0454c63de96a8937069a1a6128007c5fe2b207cfa5829ee2a9643b7b3514771095bd2096ce676f2c324fe127354ea5902646fc39ac96591d46afae759af9e2a2cdf79431bb5dd5aedde4c29d8fa12f9a0b3939c5529fe2b001afb982f6a9317f8a08f39d367883046837c8d1c2e37b486c611a246d6f0ea4f592f6c8ad8061988f196068c2fa31889c7b34ca23121bc238a88ae447b4f7be65349308d2836ea441e7ff84e3074220b4d2c811022a1dd03552359970613caeb4a7b65a89ba828cfc2f899cc030502b51eea4251cd3f7eacb61f94333848a306c3c8f9e875021ad8756e798b31ff960ff74b12d9c1bd5e244de5a74a7d1764d4fba6cd3c7f2c7f3416b1d8020ada59f639974f7aad7b5df155db85b621d14c458a0c591d60ccc23e2bd2a6b7a894b1b5cc9ab6ed211599c2ee435e64d1c6783155566349e4ffdf30927755cfb322e42545578b921d2d62c1fc55d63cc169b76256eb7db22fa99b722a7f7b292cc9d67976e5212aae2db77a0e4e047147947774a960047a8d611cee5cdf2ddb87517e309d3a52a6f8c9f23b69ca645eff3c536e9211fb9aa9b791ee1ea97b146676ada27ab69adbe94bc97685cb8363f49672db4314ae42f20ca26cd9b3861aff8aaf8994931196331f992e0019beff64249dc790753b888f808dfec4825b1e77bdd19d70d1227f6fc5b8b1856a30ddea905", "53", 0, -1440455819, 1537743641, "61c9e302f70df84ce12494965f85c7fcd58b39aedff54e69ce047de1e07af7a2"], - ["40ceb50d044cc0c4409ee80b06e741794039b226cafc575d18daa8cfaed17cf0f6cc399ea2000000000152ffffffff29941e17780f6997a4ebba09cb9b185f87aa14442258761d31c0f423e3abcad00100000008ac52516a65ac6563ffffffff27938d172b4235d3437e4d38bed7189da85b5cefa3e8f7196d951554ef90f08702000000095252005351005151acfe70da0aa0bbde6b879022bc169b1a8a0da054f5dc67fbde9d225e7b3027d1b1a0de05fc030000000263ac421db66702a474fd01000000000300ac52ccb2de0300000000035263630000000001000000000000000000539703000000008e5864c01234a8e6181a5314072ee7ca587a980991ae565ed4f497418e915b71bcab5947b33b8c7204f304edfc55038bbe40dfb9e3cc1867e88124a0ee3f09c2eeb45b4f0a7b522f14affe97c39133624f032da1b6718c52f12464826e9c908a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f98a972a5eff7f4e143e7eb636741249db6e5f399f3f7e3346cae626c8047357d668d7dd51a3ec468f17c7e38c4648bf53c4b54bc90ec120ca17f17258f7d94f49a7ac1feab4beedf971bc31871e4aca3f951196aa04dc634aca130291aa38986deef4565f6850a4e7dd613708c846ef3322a92ecd7653eeaa14b71f4c6fcbb0032becc16d18053e4833b91f8c7a9a9d00b486cf62898ac98d7234b14d4ab0d70402043019f93a72ae975d3edc4d9fac5c5055cb6b2943bbdced01657ccc1833680d0b06fd71a6b38bb663354aa980c651c26b53d454d91c4f1a90ef9b56d830b21bfee7022b34c4ac9161f383c548b1a7bbb394b43774d4a4762c320be9e9ccd5642f023018a6743db460caa5eb14e9ff063420e412dd1fea178e929e4e51a886b2261d03234ae248618a82c092b96b0272c0eabc13159dd392933cdb115491b395321a730202dde851f5c7b5f95d7b6103921a8ff9836f9030f4e1e7efee86d1725bf7c92b020a83da494060fe5cb8c52d982669b940c51d2fe1f268605f5c5d237c42c1a52f030da175c8eaa68341d0eae5cbc8b6bd8730c7d77eb775200ece966c29d72c1770fd2ff608ba054bdb1ddf6c2c1ccf8e5e4aaa01e71b2d73a37a8524f21a47ab6ad9118dec3f55ce5898f1c233495de3b8a5184ed4ba4f729b52885e43ee4dbfa75f7e7f082046e1c572d6acad1ed529f5c39442f5a3a1aa2d6a42bde2b1fdc96d2de462e19e6ba519a719908b88b50c34a0f86027532a95311d25d2e7e76b37a52cfc6440eb38545ea74e3551f17e7fb396f2a43a1bf0709d9073670d70a91aec1e1d133e0f2537382a6044f4914be58f017b3cc76e1a870e6760ba1cb5a3afd72a7706ff69f5df18c427becf07ec5b65a47324c63da7366d42ea62d00e6cb8d46509d905efafb9a5da7d31f98a2a90424137c73452fe68c19bb645a43cc26565f62f1f44069bd40d772baab63ad9cb9cd5d4632bda19ad0771ef7cd849513437d17b26686e17504dc9c9ddfd97b0d1649527104a889f905a388fbc570fce83d538b1cc9286120757aec24efd5b312663deb0fa4e4e0d927fd4292167c7885914d69bd768d8184a9a2b631d9327098f338fab39adaa0abc0d2a6405a250995705b02476d239c3de94ced281f7962a15fc3f6446a90c3a4e19e424b38bfbc9f5bba6b145f3ee4e89af1d00f75d9854af86fc8c884e5a20d913ad0f3875ceba85eedd97ac23157b6290fe1c3ef6a7b4dbfe411bf9f657054a81beb4f8d1f9a17bd80b1109f43ccb5995eabb06fa44d87d155aff2978560428d4af77e5d23ee45c2b92faa029d284f354de1c8afcff39b130440e15063b7641c681b8f4fb685e09a68273d9f66833d4fa00d71565fd6e747538a1d1f29c7b33426e3d157d2f19e59db91ac4595155c7870fbd7d517c69c36dd718e422e9893ad3682546153caf4c8eb81d15a660ffae53ae82b1bfe42d37d63f085a8176625be42d5169f7d9d66a910fd3530d7c0420e567772f021ae177938382a8a48260366a0a1b72f1f863e20a6e763c11a24313241dcbe27e15010bb35f31372ee66d2a86bb5fb1b2bedd54fc79a34ffae3b32e6abf942dd88a1e83d77189c68039612fdfbd92f7da7b2fad0d54619ec3b25d61d69ec88d3fa6b870d13a8e090bd3f81efe766b6c213bfe58616682bf9f8d384f09f56bab390fcfbbf1d486c1507b0b1435198c3c708caf406f326bed4f737601541316efe47e0afb547b8059ad9f50a81cf738426bf72e504ca19d36d1d1603131c30989f3a1d55c7a34c723bfe21a9f337ee2047c2af74b8daeffccd92bbe00d95ce4d5e0dd8c58f9ac12d79a71ae4009f80aa3aa34e31a968792b5ea401c065ee8a1b3605996799a29fae20bde06fd40b0a418d2b6deb0344d2747ddc2921b90197de14f2094d4dc66a36a3a11f87daca2b617366df6c53230180bd416fe73611f87102df07802e40ac0971d9949f9aadc8293683250d6b1b6d80207f2aa16832d4cb5a39800dd61a56c509414a266a89bce694ede0827bee421d489b000cf205622e8524430facfb4efa09ef14088ca5828d0dea945494d611b9d84668ec5d50d63861b8523b14f9b8a82e8c2cff5a74af61d06cf80cc6d5397de1e4b29f86bfe0487efc27eac65d228aee4f5158b66c6e5f76f1d0efb69c2d7d7fd225b2d5bdc21ccd10aee6afd6dcaed419ba267806deab6c7085bb88fcd89faaffa13de327979d4feb577ec796e61b98fbc2a793a2b22e9f659beec4879c6733982e84fc758af63052910315027fd206284a8dfa89711e36bfa3bdb4317b251dc7071d75d0b093298128da91d407b6f37e824a108e1c3e013638a7958393eaef10ef6198e9cef44af31c0a3cd01f12ce5c8c99875c173fe791bdb82c4d7a47569b2c9df44d68a286d5aa24f10430d", "", 3, -1677601200, 0, "49fe41faea03f5ab114598eeb3a8cd81d7c62f1f7cc3484026e07c16aa3d3a6e"], - ["311ba75704b6e2a73728acacf68cff8c9e6d9dff2187c218bfe068df146008915477aa264f03000000025351ffffffff218f5aba35310bf97ad8150d1a565f794983836e407b2af5d48b2d7273a6b90c010000000565510052533eae4f578bccc96a5ec604d55227d375cbba712bddef7690a0b4e0efa0f7fc2f7897f7a803000000075200636a000065bcca9c31ec1965c5f16e3205ed5bcc3ea134718512fdd0d4c1955cbf879e3b0c9991ca8602000000090053635163526363acffffffff04834ac1010000000002526301e4140000000000001c8a060200000000066353526500526704f0050000000009526a51535153ac525206841d2303781bb101000000000000000000000000bde32db07c4f3f221abd76850969d1f94870eb6bd6d19bff733b0bb4d37a0139becd3dd533f0c61dda1dee166dca881513b55682056d2ab9546f844ec6e2a5a271626f9d5e3da7646e4a8df64da7314bef4b123629042ad96af1458436f047f300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a9cabb9a9fd89f734432132aa974f47426c8fce192d497c5d4d85c9b7df2caa75d89d60021f7106f9ca17cff370bf3e9c96c624bc48d4d076c65208a366e7f5b187ed0ec970abcae484880d5d80cb637a42873d46532b68a3e470445fd256736fa83738d9967a6d4802ba8d3c290e5940c755be867a142ad788bf4759a19c1a303004d4ecdb38dd1a1b8a66a9711c6d03d14afb8382e562fba628866868f222fbb031b33e8c039b002adc92f0222b55d11e6fc2b6c60d10c12dc28b5b7841d1547db0b08476ee62e9695a1567b3f56869ea9a3445739585d527ca54c6000ff34c8c4c51424f2a77bfbfede5be89164d6fe8d91399510859e26fe5e603ce1ff52eed1ea031c789e39ffcf455f8ec4f7d8222b06d7355524168ea67d7825565fae0da7d4ee02245b3771ee352611ae6c345f7d176ff771d76ceaf1938c282e3c563c69fd587e02029910cc6b06becf0ec87823bd83df673f02f3c1cdfa119a74c71c065071288502297cdd934fad1a9a5ce699937e47dda3e15dd223b2a57f691c5349bb585472f2021e399ff4d2b59c40a2e760cd12125d93c86bab9b975aaf674f8b10663ca26b363fe81b20c595e2250bf56f66d4752c2925c1ffd5be8e1d56eebf33d70c7784a745ece2941f8a9dd1145621ba3385e8e8ce9ee5866fcd2d0b82e586722a957a07d5e11255db73f26502dce5d18073855133c71834c98942dae295d8f2caae57d7fdee8b736cfce45a1422eb91a3d8f1a37d293345d45c5e3e2c471d5be0003c07775890da0f89d79deadf1e3928945aa62b3546ceff5fad5c2fb6506777e09173332d007bffc6684906457365a4fa6832eac6c4c22c3974e0f2167a960d9539f283ebbdf55599532c228d037a53b863d88f3e6c1c4656fcc964d7c8d536fb98cec9a97914005050dc71eb83049689a6edcfc6d6dff2ae6ecca1eeff29b1a9588525b8d90def6a402feafa1d2d947cf29d691cbf57a546fa1cc2c0c358762a24117c4c1653040b172ed9fd2486c799ce87a25dffd76625616406b7c85dda0a9224469ab862e5101cd50508f1f3e50c92933827a00e9fccee0f75d32441fa88f1299e67a1f95d4a46e51de7d6e25720d784c454a1dd5c8aad4b1ef47f01fd6ab1a84027aed8f73c05bc9171afbdac801bcedd90363520c13a1b87f7b34854c44389e6cb3186438076e4c4ecabec561df7f83d58efe1f56004bd3763560a905c5256405b21ce01141690343948b696eb464ab831d88f389a8d4d359833a655f7986fce5225651c552e60771ae11214baaacf8b8b93288e94bd1a60023c735ec74f5d020e7b440cb7b2cbc6f1c1ad12ca111258c2c097f9c9f2c29b8305e8577775e8e6376d982610d6482fa7452f766d0887fa699ea3bf1be4aa90e1785f4bb4da34f448da5eaa1fcd483cb58828885e89640c63338cd8b5fce649c6aaf1e16e3ad41db90a679e293114e6be5565b2c793693f31e29a6efb8e8a73859d5bd6acb4e813d968ace2f805cc098554e12204384f1d07c693216f125113a801df02d50d5a8839132d2cb77808b69bf20433eedb35f26cc121bb1b20287da827b872991f16a8571aa74235cc6b03790b52f48e7f4ba331d9b3f84d9c8f951abe7fbe6d775279c35f904e25b0d2d2e56f3a3a5c9da03f8decdd45cf4c3be2c7bfed7c6759fd925cc0c1f4bc6107a3751acacc06b834da4c163d525b9916d9943de8960168fcd5f3a5f78705e05fccd8695769c80478d63d5f5e6042092637969231d7688ee617166552d81f8ced2600e52fc917297f0798c275780f528441769380321bec8edcc7d45ba90e408d22dd8691c4a78c4aa783354230d7f2a2ac1dc0a25ee62ede7978127ddd15c2e07f4d6ae18e66bbec49c1978aa27e65dace8d70fef14d9028dba0281ec666a0aeb34a8c6395eb31ed245e6ab0d18be85ba12ac94e4f289d8452b034a5018b5d9883f2145af92af79d5980a9dd05fc19324a52bffdef0a4c5a90942ce953b387b4f6b4a7b3cfcf85cd23475158dcabbaac9072a760f096f6aff03f147bc00847b06465d12f0f81c9658ba962c132b008a82c52f2a28982ce44d5486a39f9554e49b0b9ed527ec70095a269565a7408d653540f0051c916a81a9824be272895a991a4b4fa0583c8095b01e578b47f8532d0907185db81e42bdd3323f225f527b3e9ba5799f954a718e83b52c83e46ff6bbda16e1b95e92b57e556634f1b28723afa1f7838f5ef9174de926938890289167547d5834661a0f2a71388417259640a1d4400002f0091aec65b51e2310800000000000000000000000000e099a98390c3a5dab62ede479139c5a84392fbda2e48e4ec4a5c20f8e997cea8ae14d51062564808c8cf2e4b2fb81bfe936f51c5c265f9bf4b6068319361e5f42c61b4b627178e16f14772f7e2a5f030504a59d67f695750f70760de5474232400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f37fe34e6b6cb17b1690b8dcda49b7c3c78aaf3b8f103e08973e066472bfd7db12d1db8d718432535aace7980896adecf280b0cf4026d0fc6024f8a040062248f14640f01e16737e5f83b428c21574b54b921fb9ade8e4f11cdec5a39108044115ab1da12c4b47a3678357d48c7b012eef518bad4bc46abb6edc716a99e42f46032e368aa922a012b92843a1f09e2f87940930fe9a1a3ee34f877a6c6e665fc8e7021c9934603e10bfb55e133a014f7b197785ec4672becdc2ee10259f7ca6c570160a057f3dc8c37351d08535775b1a9f5985a50842a80d001a7e8f4ca6cb1bf7c8d17a1a7332246798736e948bc1207329ed9b235e7acf0c0508d3a4f3b33f1a0f7f022fe7050e9d8e47def0fd11a2c63fef9973b46cac038033adbb728b86ee76973f0211cdc26130f94f18be0dcbe49968fe73c853596260710248b62c790c92ab007e0229baa333bd25bbe2cd36ed889d004a424ce94d1864587465a2ba6dab54a1471e03034b5c056017453f7d81d093ba2712eb41e60b0269f98f149f683a55d7a0163c032cb45893a583ac070451533612d6a9e97b6c663d393163046a52ebe98c670528ac537401aec3a929fceacf513351d944c4fc4ae5321c30b8dd4c8d9089bf23dec268aa13717b2da4c4d7c2beae3682d481f9f89dcc7d822583bbe9b2ddfe84d8581ae15f9b6c31746f5b4f41cc1da87ab168df67980f72a9e67870777fd4f6db0d01c535eb7d495455303c9b0df9a6c7158590eb37dd0fa5a51dff359a5c64c939d44ccada60ffab14ec7d6c8c8fd34c9a17e932374fe65d08ed7bb5f5659fc101567b8e116453afd2c7bfe4a6fdcad9754f3515252dde061c0551cdba12255223038fb1eefa17e51dbac746a0fe4ffc8118850c661769e6adaa8f23d6416ec64c4ae10abbf0a90900db349e3c3a635ac4bdd959e861353da3ef82c7da9be37b55309587daccd77d9539eeebc526ce6dffdb30449b88d26cb1281c69354ee39ddbff03ef47a7aca745ecd6fd8365650f8fcf4c82159280a946b0fd825ded060810d19849bde55a36d1e27ad33e067803d88bcc4cf3ed5ad5047a2cac976b51aec2e42afbe9041067d50d9d34533f0f51c4fc6ef104a919ad808ec2c36449fe959e8d9f4cc3bd5bdefe7ad6a695a5553d24738540d9dbcc391b090d374e0923c043a3c81b21ffcd785b0dd87dab581fce61cce3da7184b2accfc05133651be8585220f9fca5ba7725f0c14150dcedcf5ee6400f54ccd0a6fff2c91f5209cbe59d0e201430fda56cb1a8ce579009c8e8c63cd7912b4bda282653b8e60c34292a3a72226d1bc96eae12cf234a45256e0e94d42ef0bf2a467776e47b0091ddad1fef83973192671bbfe8732e011837ff14a69388c650be9cf4ed1e280385432a5edc3684b831130e40dda7eb48516228c301994064a4e9b0b93a589bf9cdcc5a2c9d1b718a78d20a3b4c4ed734aafca5614232da8c156ef065caf752ee1c6e337df64f29d7a41d269fb56059fd909eabdc18d0fd3d9f1a9c29d3de2b20e31ae7756178a3641c546b6d8efca48ab72739617f22d499cfb8af5ccae668e2a275490ea8c570b7c0bf1030cebb2d735ee1067af967472ae876f2333351fd23d357cdc80b489fbf3c25f08f34aa5ec08f059a3ec79816444908ee8d1cd3f7f05fddedf0deef66e4eaa8dd171ebe92be49b161f09071529679e869f4b1429ad5174e4720ce8245a61c90aa5de54021ab57cdd99d051ab6036edc8fb249bee71ab16f95bf1c265475ee2937ab760a63cd31f446a6d667f4bd3bef171a8ee7cfe09418eb9be0e982f256a2f2ef45845ac0b1c74f72d433447b7446f1a9a518ccdd73756491ecfd7d3349b1e764ce51924c757cc782e2e7152db89a35551dea0f38683bf3d1224f50b2ec61800a23fb3e262c11feedaf3639576b08052efece948c716763e1477ab347e2522f7c071f5a61049ece4a380947c12acb1ed5ee10b5d49dc70ed18b52df7220c5143f727e0b16299b5fdd3808fe29af84599643fbc08a25115a53a703bdc97688650dda15ef4b357f81bf872d91dde8069037c6fe162cb9b3b14d928450881238529b5058f3f717af30196368b0216df37649e64381322967fa44ca676e6da44632010d2e7edc4692606f096ee6567f2b957d703cb4ddb618eeb700915c21aff10b453f6a52d59807c9546b2c6df5c752222f00d95ff48560ee05cef1023e4063be7fc95ce4fc44c3bc95bc21c75255ee1ca77a40fa1eb066418027b4899f6a3a5d06a169df73706b0b1bb23bf74e8a800300000000000000000000000027baa784dfa4d7ba7c644c0c915b21bf08f3e6422595c08d2b6f1c410439562ec1624c16709277a6f59b7767aad11ef5efb415a959de81390761eb10356d0584df3e7237d71d072e5164507517495fdeed6196690f6e621d8f330fb72f8bbb6e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082efc9873dd9e9b582f49a58d3b1a87571aeb97a7f2dc6023227a80dc8e61a88b661ff2503a9303630b7a4fdf0e1dfa2754a9b20239f7d5dfe1ae16dc561ea07c12c1e1c4f57aedcb18f329c6adcc4579c4b16bad4e62731af5775a4a13b87d0dd1f1da56940923e7a25840db37c86bec84ae4af0363123bbd2bd0634e43c9b0212bdfe1d3cee759cdf82b2310a539541982d12a85faaad7f5eba107382319f9f030423f742d2a37fd264ee908f8b21c4ef1478ed047b5b875a91b9908bce7691110a017e3312e72aee759defcad4e9f05187a939b2d3b087984c86f09b387ee3064d50e644bdb2e498e73da09cef5fe2e523b86248ebccfdb43e38f6c512625e54c9032f4ba30a163e35ae77955cf62780962d3833ce3542163193c9978146012e09f6021c7ea9bd4938f7fd9ca7caae19dcae4b24206d38e4401dbf82c298e585d08a7302036313dc839c4575824bda27dae899ab12fd4a069c81a97d1197e0a7a385884c03262014f2b344a746d0c74dab1fa8835d85b062dac298b68bcdf58662b746ab4803198de4f794a4dfa3360a596ca252c45e00cdaed128866323cdf38e1ca196118aaa070b5be9850c7f3ac7f8127bd6f2a4103470c1bdf283c5810e8a5bbffdf7039fae1268e9ac4780747f0fcdcbaec8871ad567b3f0beafa6020868652ddf7b4467089d57b40cb34ce099cd3124982dfb60135ba940d8910bdecce575a21a20b4960559fe5af649dc46dd6c4018a107cc9f718449ba9d9b3d7b5bd7513a030241056827bd19f72a4e8cd3ce1030efc1f12ef4ae36fecd203339a570c7b67e5e78d97923608f540c550bf02ebcb5a04791b725f4a52089c0e55f21e829ef9a9902e4043530e9ed7d8e9608f23f3a5a412e58e308644a903ba19df1c7338ee6b4ea9df25bc772d05f100eb35a27f6386b4f7343c04148d5c41764f9fc0aac6e7c70fb3d24b4a75fcdf830e6209431d6ca88bd0a4b29dbef1780200bcd63dba81823b2fcfbd974a72deba7e702cfb7a98251d3ffabb8aeb77355f982a4f8a7b172404c851280dba2815e3b7a1b5789f679011a681bfaa8ba0684e4b0619c36b4235ecb47c34807fe6d0b998209f53ffed72c66498864590ff757c27c1391eb1e97acee86dad45268b72e331cf6aa299f61028d4a9f8d34a8f8f084f70dbb10ee83f1804ae1f84aba33ac71bf679085f01091c955ab8f76edddde16c86d8efb2de4b59d27abb72a2db707df3208c11aa02cb579319a030525c1e97ac6396c6ee9d6ed2ab4960046c64c8e85529d79805b8156ed2ef25acbac44dbcdf9587261cd8ddd6c16232be92dc8a7bbcad8bbe1c17a0b6b57ec92ad488cbd364e2d636ec1f1e77838eefc90ef192253b9a1d984e06d7e3a0299856031ecf62c006a009469cefc6d1793bb4ec0f21988f5be82f2680fae4b22b1097b3f0ac5da321b2da7e9e252a1bd96803bc9686e89b4e961960b5d3056c8d9ee86b77a70c0db2bdb37038df33a87d4919f8a3167ffff3c66f1d0f892cc56752ea9515b5d94cc9292be65372b48ea77ff4038a117a00ef67483c923a7c4ef2d9bc541044e75a287223c233b4f617323011e1e27f62f01918c5da0634c75e5858b5d28f2bb3626ebcbbc78bc390bf9843d7402f5fc637f03ead0568039f8ec08890b63aef772182c2589437f54b7de55b9f24ba3165bc4b13e349c44f652cb27bcb3b7b73a5dfb2da0983cfc1e4cb26d3cb87b0a2fd63562e97e473285bcf7d905b34a3e78f353f4b2477c004157c4a9c2c8feae02a1ddbb0195c5d39060b5a2d58a83de3707e15298c481b7a17079196a03b392ea02ba498d3a157d20b49d7ab1c938421c72909698325573db34e2e63a8b6a4b9062f216c47ce5a484d10db34ec81e167eb078f86c659f04abf1643c92697ac86a2f61ab860ec9b5d69ae9e050b2b2ccd72fbca72aca11ff3178a166b2845dd43a83e6b31dea2b53c732184783551bb465af7421bae8d8be6617ece722add5c0975176ecf24ec303585741341393fa3373ff28109a8dbbaa3cb594357a67152bbc4d03257c69c5946b44e494b4ec208222efe2e1414d9c20dc163d614c3811327882635b2dd1cca614b4ebd5668dbbe03e4ee64e6a7644c0ca1f68a3db000bbe76f8ac4ae336e2911b9723d03ca479323fb8469277f39e4ace53077277a8af1ba2d86a68565642baae259cfb19e73b2bf7d7479a699e56ec9e67bc6b72d54289ae7eae1343c936c55ddfd1cfc6bcb4613693c3404132d5f9ac3911f4617fd1c19c2cc0e9f00ca6ed7c2194c92562dc5ba438a007959f65ca60dd8a86124f50fa844c5d81014e3de943aec7d9528150f11bb7912758fe7b906d0a861e60ab28d67ae3c7bb79e70977064d6b7e849a28efc350d1bd42b940bfe036d340d0fd71de91e5597e8db93c9f5c3f0f", "", 1, -45765946, 0, "66fad3918b8179beff60deb2f735003eb4c14738105023f5d1e10e9482f00263"], - ["030000807082c40301d89c16a0a4c65b41f2409a20bedf3ccfb5aadcbf0567bb1e5794add0741f191b010000000151dbf57197038ffdc803000000000753ac6a0000655377f4d4040000000008656a52ac53535252217e71000000000009535351ac63ac636aac00000000e08911d50300000000000000002249e4030000000018262d44c064b4b127782c09c3d737b9aa5a9553c611db30e4b9e14fea7a7882d40fcd9a49699b554e8e45a56b9c3baa3144b8d0c400648204833d2cf6d05ed0d416b3dac08140cc5d423ecd5ffbf4b72bd1c79e669b8377de179ea27c98b1d1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002421030a765bb9626d888bb125c24d52305acab1c6ace5973b836c8bf7cc9684d8e8536f2f21a2fc22bf9e7809b9f29092d5dfa8e7a9db4f49d59352d8a6a034161e485fa1c7783e3960b1d2b37021ab39845541985f2aee7edd37b431c6245270b956766ffbb3a56a01621d0d3203febfa0eb16a9f5f5fe74c77b644e2ee6a602116b18b714127ccc301bcd431bb98b7c785a8364de39feb58411e18144c53f180326110ad41a1fc59d79f88ebd7f2b511bcc29d64c61531c17ea4161efa774a71f0b07f210e684abd4d36caa252d232a7e223c9ff68bbf22c3956c58d43c14ce2508b445e17a077d02018224b2cc49ab00801bebccbc67696458411f5997df09c584030f43f479714b6c9fc609f3496aec403ca2d61f3c1f8a89c5f24698d8eeb89fbe021090ac0a65cf686b7f6b01339ead59244ef08375a46e0dad338b6ba238ea25d002076f2d8798782c31b915694d7e991b451b2ff6370b78d00c76c41356a6bf96680221d09a03361e5a29cc8fb05306123c39f7a9249ee80ac2d95032aa39fa9f7dae0309697669dda3acb893eb9e8d4f83bf917436fff0ed55b29178d01c0d4bd3d95ce861e4f533de852c8327d1d5a459795aeea0aaefbb5a894cc6f30f5c602e226bef1449e04f0fd169e223f6a49c39bee2ca3d83315812d760d85c55838bf39aedfe7b9f312bdae81133cfc6c5aa445d77b71de8ac6965c877241465e47bc591d3ee7456bad006c054e93263b5cc57db31cc82326a971f8946ab246a6848e2c1fb854f637fcab3329662104462c607b1611436ef4c9d92e5ed9937a6f8f529e32e1760af4bf08730819570686dca5ce8b91d75f2cabde30b9d0f8a0b213f0e12a3fc4ebb4723bbab39a97dda582e8538529acb5c8a70cc7365c9ddd177a486158c4b07ca8b4fdbc742c2d906afe7d90548bb125a8b3130b6abbfdcb09d85a2938fefbd4976750b48bf837e9b00f7d1204a1bb2e954645ef67a1a2ad271a5ac0863934b77d971524d11b4400d783a66b3f2a3f156a714244c7efb30975be2fd7098f73494ea43774fba7bc1e2ccb265c3b764a84f3a78c0f878bff72e082fabd9dd909d7c870381cc35e01f930abf771cf4a52c6d0b557a161142215add34d67bc676dadaa9120b3195a29ee087f50e1db5d019530ecc7d265f5dc790dae6f056b63fb32c895c5494ce4c5784f589dabb247b9680592162dd809d7152d04609aaaddb2b3fefa56691f256878c50a4a3b5cb27c30a59137f72907eb1dc3ed7381324d7241d792f9dfb75fa731da451f9a6f226d78794b5eddeb67667a9423de64e3b7738b2be63b5adacf3ace36976d5bec8833c90bf18ad17f93274b965252b23fbc9ac2a2cade1b2847584d6283fd5a08b073561ddb8ac525a294d83298c5b9641f44641422db498cfcd7a0aca9b0f0653255948a045fc1bcbf88583776d0f22579af7fb262fdb0a8951d21bd38fda6b5bf3e7d761c118552118badbc04a252bc21ab6d83e7e86096070b0ba006a2bd05338a25be09bafd0052fa2ec88e555dc527c87dd8c8f7182d4c3ae6761845ef65d4d6a03ae24c84518d42721ae09cac0280319db9acee3feb3d2104388244c4de29dfcf78b8f24497f6198e806cf2c3a001aeab7a2f5bd49a666c99ee53f6a57b8088294f2d28195a893e5975c08b976ee9ba2db92ba3804f3c061dd67be9c016fd988cd45226fe1263e6a1d88948046787003d58a50f77f489ada211ea178594940897f5f944102c296c90ccd0babd5ae2f0bd935dc167ce013320ca905654329e0b7afb36fbc4651c23817246ce5ec687547be38f597fb76a2c743b7db2c4cb361465244eb432223981bc100a392a1b8aac91e1d7aa105fde160529008e320b1231e82c8ffbd413fee9fd39dbde7c7b2eaa58607d5fde999c56fb91eb95b62940940508aaf03e01c37f41ea7be307f67a60b582355d3bc4bac5bcd2265a96cb021e52ead09f5f58221c3a5cec7c50d70e7179ea27fbfcf48352343e3277efa090d3cbb80b0cc98bf3ef237826b7a882364618f63b3a71412fab69b51eecf1e2353bde38f7ef974802c05d5567bd10c4a19aa98c56e9ac84321a406901297239f5a87d3172d6b5f9f3ee26bbd8e8456f73ee88a5971eaecda003140cdae02457a720ee387d9a7e4cde1a2cdfa1fe0b8cd7a215aef484f1a1ba7c0f765a4cb533c829a14e12775d8e9a951666aee2fc2e4fa9cc6e764ddf492a01a88546b8bf1eb9817b3d30f931a2a2d724501d419d2740aa444a26b2df01645b8169f146d79444a520000000000000000c2084a020000000011b08a215a30b579d4782aa361d1092c43e84faa8fa3eb3794002d54cb57997e9a2a03260eb4a7c9a3e2b5811f156a810e04bac96831f4b6c04c3d5531ced5a3a870c3af5fe94323d0c3c456f3f09f646ed768bf6cbd564dc68d34b4803a702a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e2a143ef8bac448562a4214176543754250fc19a10cff80ed9b923859aea2dbbba57261e628808913972d84ef93528d7ff0300ff5b35150dddb57e7ef792502a19c5f17763865ea1eadfc2298869c9edf234d84da242f4184c60dd87293f95eae1f4c3f5124f98649d9dc6447fa1466b66c21a119acd1331b52ba40e489e1154021efeecdf08efe108ac0eddc88c7d7f990ccde5ec906cee559c681685511725fe03014feb7b1a232eba277edb4d8c85c4fe28fbe01b06bdbfa8f6d9b9abe5f7edc50b015871c3dccfc8806a199bcc19276224f2274bd45b8583d49ba896823f43acab2fb2e70235c6304f14cd3a7abb235c00543fbad90e53b8326ee204b52ded8011020661e2d53427f70a15bc45bd4bfe3bfc90bce89b1309fd61802857d89b1e34ad022dbe15a4e9ac22ef0bd05d7033e02e8ef327a5d385e51d2244853ad323611ad103172a4555b6d6106b7c3af51ace9449289db9fa905908d548a5bd061758d7aec3031ae33715d17b6fe3882cc13e80fca69b41b2d9c323a4ca9faddbcefbd35c396b03113df52710264bd3e8d089bcff2e0803df08f9251e35512b0119cf03099f88951cbba23ccd9ca10bfa9942d0ba5eaf0bff6fdbfb1994eb0403c93395528f01b96f300c118fc37edd2098b047e07a0108e22d155a76d3627b565398f34a18ca0e61317c7c8281c591012792e30bfd420ad6aaa87816de4b229910c2818eb896f2c2fdf5ad5ebfd8b8be926fac2a1243b8a054186ee9b48fd8d068dc278604170fed1f335f1de1c1a964eab8d846065a304cf0e43fdbd052935bef87ab389a50157a444bc76d54ad53fff0c5d1ed1dfd4628205f444921e189eab498b036acccfbe1cdc6483aa054484f247175a99234e2fd5d0330e34717406bc75d0170eb4d2549164baf91f9e1da5931c536cc17a073b8c975a00c8f90114d54f9a6a9b0dfdc763bd2f952b6844a518a812e80228a00049c96cef16a93ed661bdf17311971ce640302a3c2b850d901d3e8002015eb4fff4ed990d75a7717f8cfe66d0de1d03944ce2171204b861c44d3bd091ba22132b0c795235b7e126ffb35d899d1f4977126988cd14bd014a00e4e4c088400a50f5fee25499db2b9c5b701cf44aa816c3a8413615553b1f5811e7116a578c057cb677269b5d0f60b2320b92309f8799da64f00bfac75bf91eff640a4369c0a43c6f648bc4c19711c1f28f0755d7ee187a58f24203d0bd07541f2cab819ada47cdd331a285473f758a3831b21e863a0f994cb890b80200363a6007583bc703fc1607c1ac49f3b2d18515991339da89233ee1bdf84c48021668171dd8a576f2db74ef1ac50d3ec2f1c0d6d1eb844b647aea5efc0801722a0021ba1c4f1975c88ec4ce0e3f05fabb91e454c52a3afc581b5b9cbe4945eec77196293c2fdf239706e818fc9750fe53ec6e8b29280c6f602462de4dd741913beeabe548abba7440d21225ae96e648a7654f907308d514c4aa9a06487f3dbb41d9e20e36861a85cc19a3d2c0cb8c1017248c465d7dd7f7bac840b59dfcb45054776504cc3c64fbd8ef6de12514b0c83610f64bec5ad61620203db89b5f0bab317b837caf85c7d5ad88a9c77395e318d9d966cdcbcba3c9217e177b9e6ffa194783932ead2db262ecb4b6005934de7e5984be140365503e904f8599e29df4c1876000b9d1627d342fc6479bc5597f9a094eb6e1ade1bb46220a30dec83f0bab1a824c1260147330cbb60f6dfacaa8be10e81c3f35696a3c33827f70050a3569702fd8cc237c124a881e0ca8f235125d2dceeeb06bf33700e1bd90883849cd1a6bd0b2fe294a192d97fb93c65b06c9647d4e3426c56a8b2caeacc7820c880da9ab7716a8be24d7a743a944f5334ba10f930e7341abfe5887502465de39dd02f1f0c061e77765c8db8176d6cca482be85e1f81a6b41598c13609f573cb54c59d2e54ed406f5459ff774419ad0c7c773a409a2b133bb6d085091a56259b769a3c4c3e18bf25c909b63af58290d16a29bca79900eee87957673c1b963ee6efb3552e3649e63ff7a882691d2c15119d96205e6fb7028e615d3388ef5d1aa828a5260ea1bb1d7cf913ab3fe33823311c37511fac95356a097b7ce7b5664ccf90292738175ec2c7db4141ec3c5c25f1096187452152e18abd6899f591c2aad05dce2266839b282491bf8d902ab056d3505388c8ebb017589f02c35d53982f0aa5161cc50b06dbee65803b7d1fc21a8c9f0705835a9135fe7430fb747ac2b3f5f9cc6a210eeaa4a4b93e5ba86387a009c184aa0c05000000000000000000000000cf21bac2c6471af3a3cab7bb90fe6576b07e2fd317cd6306cbf4c86c6947a8698c9b06b8d0ef244346de852484bac0e6ba7cb68159674ab5b1b425e7e47cbf4217e6f7117032ec9c4ebed587cb9497d446e09d4f01b470463940ee1c7937498500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab5368e37ae807ef873711d4be854f589b2722c66118b90645a97d7977cb7e09ede6ba658a6a0d41c00105386e4bf264b74f06b09acb270220eceb183e910bf40788c9707ced0359c23c68d7b8211bd0e29449a5e266000f77cba8db9333940fdfccd673c8d9058ed33f4198ca76f90401b80a299b3cd1735cdb8c2d0996fac002165a9fc6aafd40ccc974e343dd4fb4d6422f8773c9aba03a206a495ebe57324f030faf36765deedd47a9d998d19a4ab524baec92f889d40d1b2e710c9ac62487a90a08b34bda6b94e2d5f20ec0968a9b7831f867a1d11a7e1fd3e2b3aa78efad6570ee0808688206f54305eddb3144bd01c5574f4d270821e0a75c3b5362c2dc1fb70212828aefa3480fa3048649174ed2a27e5664dec62e6b7fadd256bdc928e0d98a021129c820dde1407c3884c18d7d3b21a20e43e426c2429338ed8c6d3e6927623e02210b9ba12e9be712fb0197228752c0b02d31e692dd40237e9c70d4cd59021432021ac55322ae2a8f2533a02210550eebd1579f6ae4c816736be8ec0e4e7230081a031cc6cac2d73b898c70878714901a5a675865926bbb0545f2d29cc9b595632c60fe25c617ade74f810c8184d3471dff70421b65b7d0f644a5907c1c41c7e12885acafd0895eefab6762143a5dc02a15cfdd3fa7dd04f8ed58bfc07ed8b5219ab2c5fd4cee74abaabefa1275a770d19b4f5967c1f625707d8e09063961eb42becf01d6e997b5188bb678da3078706c76cfe4e04d971626f0e5b54899b0fe25f86d78bc77ed37193ff263e3409ddf5ab1e7cfb8e223def17e74f48ed62301152ddbd77fef0b6bb0658d165bd4040f2ddb37f6454d1429cc587c039bb7a79a742003d496fa9bd769ea38518196ec3e844d4e699b19007e7e9cdb781bd33c1b25af0477878157e977dc0daf69b7feeb603aaa2e428aa57b63ae843afe3677ff328c2b1d806743e53a1e244d6b361ee033fddc41d25cfcee3ff9499c6da38a42503416e2a91c89752c1259c439f0ab56ef5b015b1627d7cf86076ae25f6764a920ea14587b835b3518a45e15b3b665da2b1b48baac95ed20ed7abddec0908d141c813604f4b8d28e7dd8f78156be1698d5bf9e537f7bf01fee719307bcaed94c606fd6b128a82f5d7d5dd5871cb94f6a03b44aa1a3d0714fbc48e29ee95e54e4cbbfe9de66f4bcf793b1c83f1c36f49fefd1453a23bc663f46d8d1443d1122e8ccd295a68a0e28e3d269a22970ccd0b1abb2de34a659dc665fe3fd2ae50ef8485ea448b01cdf8c9b529272d56ed0b7b2c45488b6384179a099d2ad72d6c0fb28c8ebd40cc112ba0c31f55aa653be195bbd6e4bca5d4bb949263573d6a2b01f004c79dd5eb6e781d2146b4a42933b0df54641e7b5244fa19aedb683bd027be76b7c515a60f44de22911cb6504c51991a04308bc525071784a9ec2e9e0aafc1b1e97f9457935c9c47ed6763b7c5cc7400cf012c7f34f571f0bbe96cab5a0b23d9d04b9424357f766c8fdd2c1e03effc02e969750d12a41a55c0869ed56b2be0db8bc3eb09d6cdb2ff1a74ac052698994beaa1c5c083c0a7a0dc21fd51938dc3f8e9ce68c3cffa2ce48bd283c2ab11e2b85a0ade4bf0630bab5a8a4e4c4401099710255464e3eae33fe68df32a11fcfb08ab08b29ee606e6ab47a6dc9d5f328ecfb662cea75a576f1d5a862d9d9f3a0c07fc80fa2d711b45ae6c676168f83fce1c61608b4b2aa5b2e8bf7e5c15683f06732abb00f41f8067c087351953c780d4da3c61d472f54fcd4f11e055080963e8d9e615754421406dee9f1f3bacb40f2082f1fef723e12bf129a791eeb2043fd5b621eef3b368d557f3d79da678439cfb7fd566f6a8cb7bf51086f7391ea0533f8756da3970c48562007cf23181af6b06e99de8f23fb411ffaa4c3c5ff10f5e70b8b60db55364bbef95ffe5af25959744d961b6c769b5d2d3f04898956074da2f868198f02329ae6bf77cfd82a977fb6260bbabf9c5fe44e46330831316363aeb8b5b7c172ca43cad20354e6c90763e45ef15bdbb1b2bc28d259a3e9d902689d2a260b13fdd16e0bf9dea74a9352670970fef8af59164aa4ccd2037dc0053709724d28f09bc187061b360b377ce110aed1598f24dfff37d94729e74817e609341d410ffe417cbaf6771b94af0ea823b2ba3be3d762f808f9f0dcc8203803573d95a82316c057074719821481b82750035e4b8655986e6f80185520e50d6e2b47be4f7deda14dce75ce72ae624c0c5087b1c6d0ab66b0965ba43b05fd863e1a5b81c1939a4999e67718cd76cf9428de54ffd268b9d8794d9706bcc965768cc891df8ea9d357485a8cdfce541e897235ab9e938bb9b5e922bff8ef2a693d2ebbeaece3a2dc78c50b9564ad023d22fbe8bb820f4246b713234660561785438632532788704747f406", "5265", 0, 826410859, 1537743641, "f19cccf4c0f7e292bbe36f224dc03544e02d10019d637a994f857ad869ad1a64"], - ["12238b0d029acd37a248faaaf2650ac8976a1fc7754bd706f1b078e8c9fef4e0db016545ad030000000551636351ac3cc1b33532377f05b8301bdc2b109f0d9f6b9b079221b4ec8e21a9cd66cfe533ee7208d603000000066a51526aac653190a8c8044171df0500000000056a65655153d64b34030000000007525163ac516a532bdad902000000000765ac5300ac0051bd904a0100000000025263035da56d02fe509604000000000000000000000000a3fcdef2cc8be1658ca3f137f5def26ab4e2a17b412ccd84eb8b1e119157e2c5d4d9c2762bbfe205deed827121e6ec843d8cbb2a10d23f526edff496b45ad4fabc026da5368972051d1f3ac2ee796b21445ab13d717b87eceb724279a65e698300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fb62f10b7b6a0f69ab43b0001cd67467aab5d1ec783e34fdf2cd7686a56a2b9fa2b66f0133ab822c3dc9a13518d00fa794b5cbfadb569c794127f44b7330104a56f59e33757792f344979f0053b89bc337fcd2f2ea4d23d2ddc1868a075dc07a087d2f9949a8b261e0c8122f6f1870f3403035ebdf89feac4f0815e941e1a2110307162b3f8c3df3856e41932e93c5d42df43e96d5fbc8927953d03b85b0250716031bc3bccdc7651d9ef451161483b4272a77bf7830d9920bd958e87cb88d5a9ecb0a0343710e11545cc1858d793cdd8213998d6c65a7539802c95bfa6e3d11f44c89839fa28c608afe97fa4fd2cc6efd98917e8f958a8aecb96a6ca387f182e82ad3030f3943477ca004224409fa267d1d92e005e78fc1d1fb8b92c68b178a48b43f0d02171a32becc2b36779470a3600b739024af1c7260b2a372cd1c88d9154adc587e032a840ffd38df38d54599277f5c6ed33da2849101d5b21bd69fbf4e683e3f9a78031127b1acf03e0b1325c2b14d6aff4fb10ac808a9695c982707575d37d0654813021d4784979a5360c18fa041ba254add83a109dec0a080bef2962a4f6281ca38e2fb8146fa653543540b4fb38253d7de86212627a7191c92c949911cb5e875be470999e5885a9b8de3afa9a2cb7c947eb10715864a36e9ce0484f19e3d55f58c9a49c16c1ed0184f730cffc3bd3cead8d9572f4de7caa918510569ddc98c3c5edc3cfdb5e0f9c63ff81d5e7ad994371c62e8918cf85936c47ee192b484edea4911ad7088bce9a69b8701dc6a3261790badcc3a1374004c5ba629dde823807ef51fad1a87bb2599ced8c608e490da32bab752791b30bbfaba5c8518ee028ebaa2c55b491def0293d41f5dfd518e3274e211cf08e0ea92d8626e7bdff898eb809d90a9e5bf36d3f836ec19dceae70282e9f3bc1838324ddf368fb18747a8ba57ea4300946ecedbe1bbdaf152398f9b0f029a212aad13a893413bde74ca475cec9afc346c62977da661e8146681c6b0c484c237acfaeedd63725cf790d31695ab0a95877abbfdcb893b7a34906e93510363a1c4667850a279cef45a20aedff535927236feae6913b7f94831de24b48c3f9fc8b67a530abf74f9201eef103e9d10f93963b8c6143b586698c1146141d664bf60c9b91942bd9c869eda1e5454d7983a842274dad6717bae82bbeffee8700542964dae486a2a843cc25467d3d72cd8669ef18f761cb0f78c67162e3761fbc584e172ad00032ad60db320b581a17ba31578c3a948cf5e2316b36b4ae8987a3a9d5c1dc7eec4cb60b12384d7844a2bc91f748d132a1792f59251defc817cb8a65e6e28ba5f11f4b672bfd54d107b62881203a00b96e9143657c7c912a45932c31733d090f024053497ff4702da59eedcb4f2ebf7305cc90b29296d20797c5d7fa5b57155c5c1fe7ba94b7af4082b12b59432de87d752b5cfd1f4df1693872386b6e698d0ef579627271598c38b02a859b4371d84b3fe8f6aa47854fc08335e2749df79f49dc5ed619301961e564d62aea9462ee105906203e2a9dc4fd94e999a803892f48d6cb62e1a4906504f0ea7c7e43f4a2c4197f017d8b19fd1b462a69daf764b1af713f43589a3bc256e61e1f86dc76a32d040dfbe74f0eae962f17ccdd954427b8dcc87b0d27fd26b23db54f19aa4a252b2e3a4d8e57d6de2bfda06bd0f5d11c4239b4eeda4a55dc9662e0d2152ff322c24530f3849465ea7e7f9cbfb5fb2d3a1337000e3da8495a77ea6f6dd1e78a53f3ba8ed7f4a09ba296093403aec10b95e227e6e5e319ead188ed8bf258acc61b05b55a27d6db9216eef0846553876cb0f0f04e4e2981c308ab989975f9f9b8345a17d0ddc676263eba02db5f1be65e26d3dbfdab63c61a424373b3eedbde461b80d33943f6befe53e7a7960efc10d8a7d5f81c81bb1fa8db8fa791334c6df6024aaba5b6c0857c25bf848f37f05a228e8da13ec04590b8e6cd3fe4f9c819315b29e7c65834d58a6d941ae6db4a92b51ca1a491d9e248e6b44e134e5a5021b1e2968683a716c88faf0a66b07f45d6283badfa218cc44356db003a74e71b5944eeb4e4483a75e93d7fffb95ae6b59b7f043fcc0aad8251ba79aee7fc3cd03af7bf301228b102f19860910f2f30fcc7ee2c3408882fbefdd6b3d6bcb4718e5111345a748a29bb5b0706dee717e4983bc626dcde2d7f11ead9fb75e2342792362927c7d584a6ce2837d085fd6dd9011b1b087bcaa3985575a7d8bb9d26a670679a870bb799a1e93bd70a5e91785176643539c0000000000000000fb357d0200000000156ca185135192c21a790adf96e91100a1b99cc7c74cc6d6e0e592df727c70b5d529c3b5af7a41ef01aff0cc7a1ecee3639506d6c0240b958033fc28569685a774f5322c9cd7786916653801ec24fabfa34a55281f97bd903010624d61367a750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063c17810618dfe86824be635b3b5625d9edf547d1137cf19c25267a748407681120fdf6b926a7d09d067bdd37192d0848e7f0e700714fe71081ec3d4c09275f23ef59187647f11caf141a358f693d94109ce6c74ccae202640d8f7089ddd811ca4954cdb3386d9a54cc12b29f3894a724918acfc9254f133297fd1d3c0e6008c03255121d9ed6fbe106179725b143b419d0dfb0f4bd56ebf30b426046e07e59fb3032f3cb1265ef0711667bcbd37661acbba7275c8957c6a0fd57a3fd5dc409e8d400a04cf7baaed00912c828ea5f4f66db6824f5b47f65061f2423045f395ce0da40884f902b1e8ec5d3ed09ba1e363a99f9875e4b7c728b3892a711bb007f2aae45503001795a72d9e4b16eec96464daa511bb220d04107e2aa23a6e45fe5725492d22020d488c5a4055c8fcb1c13ef3e571db57a5eb80bbd2579902ba0a5a6287f046900221650cc6f2148a970fe8fa27432f6053fa1ddf00c167f21c394c9c85e8f2f34f022bc26b419012542e7c493503ee205009e4804756710c96c40b7b9366070fc24a031604b431bd3742b93597aacb14403bca73e74445ac1534d4cd2c1fd9d605308b42c9b322f2f9d2df810fe292e87a9454dfcd92ec04c12d45aa60edb594dc444e7da4fe8d3829836809a5db466bcce7b1d17e68ab62193ce2d3d9bdc48533a135ff2eb1321e12dcc5feb75b4ec2bc469f096fa4c35d890b98d6444e5daa07524df91b0f29ff7c4f2ef7204dada41e77ce2b5ba6d15a52d873c48c155baa787909505efb539bfc9dd3dbc4ab452dd58fdd021ad7c67736ce0489a0faa022ef96212355ecb3946045b4af469d4af3686e3b2a4ae813d0b6f0e0ecd865bcf9db1a426be7c8232015638029c9037f4ec3fbcc6fd940134a2a85d203ac1e8942546119219684ba85cdfea4be025b848bda4a7050deff48e47d827529cc78ec24bfc49aa1327cf46a7c39eec8500cbfa8f528f7f01a8aa58380d5302e59e86c439b30ea4bb5fdc526852b639bc9f7caf02a9c384ce66aa31fe2b33803f8937e61dd3a15e02f3eab808820ddbbbf77030062738fa6fc18d7be53de0d06ee84ac32bbdee7cb46859c9e0f1d67604540e33e37ae2a074a9f97aa1f50a6a15d2f09a6dcc79b6fe241eb9bc94ac4e3c3e0c26e6ee70c49263a0947da1481cd184200416a1d827ff6ca580b345768f6d1082e12b20dbc53d12a729c8791d0c74ad194ce754dadaff084a513d7838c6b49489aad160a4f62713f5b3d8d16b8c1198458ada5ed46b2fdfddf8e2c65ffe2e7d924a42f2731d73aec5cd599ec0d996a599183d5fc6d90179fd2f2ac0f6213e6f5058772e2f23d7609af5cc4a3c66dceba412975c19b3ca91e8053234f1c1f4847cdcd070ecbbae4df192c6d64e5d1de29d1ebce0f399ee4b713151a2f362b6d4f2804b05683859e284c6766f7f69c31136115543512c5a025783d69bf09a75893bce461a98ddd460c396fa478d32d68dfe98e6c554195457dff262c38f2158544d68f4132dce0a1b7f8633bcba5243d572a5633d2767fe90586f583ef64662f6061a7f328a7928b9dcd7531805f9935f064cf5941415e3640f4c6d3e91c1f6634c36c47b1d25f7aca7186ea289b756ce6d90ba75019b80632f4af1c0b75ba78f0833e5cf24a8685621dc5143fe2a20202ef57c49209c8d0e83cce91a652a9f30fff1da5912433edd5539b844a359f2f5a464c972ca4b01bbc11060eaa434399e2eb84af9b91292c07e1d2850ae5872d3498d553c46f7a74fa7510d7a50605183d80d942cce5199a5ff3ee81912f0bfe97ea463fde45603aedca27b8065249f0568f332b365be10499766a144dbdbd720d126cf6f3d422de4361169b440d7fe720c9ff34082aa75be34c6654ed54d6681a9ec35b4c3e7759890fc685ee55d7275c929a573437e70e7d2c4101b10ef6be9131deb0496ec347962b96e16a7eaffe5a69ac6e41c312a2ee6c2f7e09a567e965740a42410af370e991e7d7447c9154639a44b65eae94b76eb9b875ca6a311d00b82b4563aa1d135a59658f86c412590a68311d2760025abce1e9e8c842a886e1b89718c739450b89c801329d8bded5aeaa22b4eb27a2e914dd58f8be73a570fa92cc9c9d7f032fcdbd397d86dcd5c40741991ff030a134d1d12c5525cd2a5b7ebc81ecd66e1df43fee8cfea4b974ae1021f15133eac00a25145f49d4c9fe46f3b2d33c01255361be0e3717c5acd218b8cb49f0e130111ed8d17d428d1742d47cbef4b0b9c86f162af9523c22ea00ba434110d23320f8df5154f75c5b702ede32d4ca310e5827d7772bd93e2706ee6b00ea17ef3df0ea27095f60bcca63834cdfc6a48b658c60210c2cb49622e829f147dc947f78d0d96b7d942ec65fdd375301068c3ba24cd8d72812e9b0feb9bff5a3a747b15015d500", "636a", 1, -778039372, 1537743641, "dd5e907246f9f7872cdb02c47d52a4052dadbfb01435ffd86d367469eb475943"], - ["69ac215703e9bc2ed6c81bb27b5ee31f773c09a0ce89c1766348344ee06247b7de420e20bb02000000026352d2f13f6c90abdcc48fb232e76ec7f8c206d273f593f61a991d119171e469554501d7bac00300000008636500acac6351acffffffffb2e89b1181811c421464e2ed70922757072d890ca36515702beda40bf322341e0000000000ffffffff0134ab1301000000000000000000020000000000000000115f0b0200000000c63e606cc937b8f26fc95c8a807eb5e5d141ae21951548e82569d6691c74996ab46cd2813fe724d813683d159b1318291c06b70822aa2d722cd0db0f6d1dbeaa274fe665cea7dfab60b2f056d2c8224573a039752247173d5d183c0547820cd800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7f1f05dade01cfd757375462840ae27fbaa860ba28a249336adeff0cc1f2d56ba718419726bf8c0079872d1757873727ff763bf99375349985b7e29cf1fd8ab32746df89d14dbb483c06a48017618ac871c1744c9831350d9ed17c1edb4b509faf6e27cd3c4a8be0a4260c2797377911aab96ed01a84f4e1b4e48d3c00449400304d87910df0ea4a653a753fd4c1c096651feaac08d1b4f10ed8d0a84ed5c2cba030e5fe10042b0860c3857766edc97e81bcfe9df87c96da8644029cc61557111c40b021152970af5717bc2c3c37e52f21fad36c69f2832003628a2437c40a71e9d3a10d11bbfd72e4f77cbd15e23bbb3f2a19c98da3358966ab7ea046db68df71f88031b94c475fab91ae3a04709805b1c84cc124d29dc191ebbd5d14d7429a1291b8d031dd121143cde1ebaa5a91cc9dd74db946f8466f8dfc2daaeb64152930cacdf370304633c8ffa8e8ea7f310217d62b470a4534c6aecf56e10f40136eef5a36248de020125187d91b6ed1359a34d45e57e30b275922406c401c5e29e2e3cb4461217aa0212e9f618fdf32e570efd2f31979c482dfa3b50f7c45990e027af1c47d3a4d113efd80f736035a2f551386f081cdc469c7ba547b315c3067d0f5b548fde92cc9fca05de849fa92f14273f221e66bca5dc2358f55d9eae14794da22260a03713eb76363c4175529814afbd23572aec9826ed17ee5edcfb3b291cc1d5b61c5b0cfe51aad33546ad90a6c79c882d229cbaa648337c54f6277300cc9e7a5166462802d772107949df083376dd8a0ae255b7a530c1bb2b4bc4d362befcdda6da66106d768936f8ed2f5ad09a4210fe4efbb60aeba41cd4946fbf855194a2db75208282700f0f0d8dbf60781c39d351376260813e8634e6775e128a279514c9d6fdb2107aecadf7c38eac9b8ba3adbb1b7e7e6e4e03d4a5fc1cc8399d9eb78280ae0b2955b4b38efb6dc69e0a121acfb97a23f0f7344984492d0f6900e4dc181c685e9874eea9d644bc4179d986c790a06283efcd3a785135c3640bc5dd101761702dcf6dd2d1292307017c57c37fed3856b46763488a2c38a54e4c9029dfad758590550d9b6e4524d0925f836b79c148a3a8226a7a825614922ec9193a25b8cf16ded5f7eec11567f24e373bafc7de54a18991b71c7be1c9335faf5e77002b283074b9ffbb3d3da8ab22e288ef2d9d00f3e72e3a9f91658a69fff6abc288bafd1091bc05498967d88e609dd8d6c94ef7a2489c6e5a83b388a684fc71ccda731000b714ef131d95f5cdfad0c1610eab05e9fc7c3409401a97db66ff05429316c09970f24049d4210265c139b20dab3e69ebaaa2e8975618a330a7d1c65c254e6aff1f521c4f81122575b0518c6a90090adba1d07d2e807d0a000de155ab52906e52a211d1e34fdec84525bcfed5dd6af83dea85761f41a7f07eaf53d44339666a625af041fed53df4cbce8712c8fc2f6a51acfa05fef52f592f34ac6b37eaebdffa729e99c5ec969fd31d29001e657783d22d169b4512322e66a78c1d2c6eddd4963e41fc7217bf28afedd818451f9d0581cfdc1a0fbbff7539f0f80efa9e9e161d3725e1f3b15dcfdfa073a8233d0be49f5acd34266cf7ff30f717cadb9a6ace740b422b4332eadeac676f5da67406c59cf85ab4ed1966ee012fac585550855a158f4e27fb0de3dc0c44d7b516e414547e06af55865bb38588fd8caa929adb61c1024dae27da5bee1539501db24b46f78ae43210494fe31b52e64a520cbfdc132317525c8c6a281eb534a5cf617218ef5d34b32e9d7ba6866c927384362f12afa455be95deb64a3075056f36fbf80eca7cccbd5e81afeb1304e5d81449522a7e350646fd38a132dcce90550540947cc3126f07b0ecd506f2488a788258b4170af4549a5f116d3d829905bb7427a7ad94087d9190a699b3b60e1fa1737671d913560dcf01b02f4a17dddfa00c13fe7c414c936325e6c5399ca64f5b22bc64808ae77bc660e0bed26164c2f96359eb6e651a9bd8e4ad3d469d1cd24366ad4b68de03589d4e8f8ff854e3d413e0b58c8c9d704d8b421501f4f5a52a67357b0aae04d402c9a77c9c33866c6edb1eab0d10cf01e4616ce959ad4645a04d045aa7e255b4732a6caa5cc23a69bb6796d95d6afc916d57c61af0fddf26bb876fd3a688647457c087ff3ef46a15fd17f4edf157fe52aedcaeefe78b638b555c3f7eccc4863ead78004cbb712b85d5346446ed6aa4c61cc618ec2a5d304a6bb09451bf332ff43550a898ef7987d3e0bedda3a8c6355cd558a17e0000000000000000e604cf040000000042405bdd13336f7d92235dc0a092fb5d7c694f892f28ee5192be8d54e1e859a838e2ac1fce61125880ab75941b53c423653b5ccfe9f9c02f5260ac14f028bbae880df6c2100e1be140ba54e1f627f4b3a1a4eb608acbabfb0f334cfe00e1582900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000291a794acf9a9cfbcb37026379ab36abbde700fcd0d5f6b103a73fc61715864ea06b66b3e6dd9d5b8ce98b6677acf65fd897f320697180d33e9cce53616611c359d18701952bfe7f06a12c59096506c979919610e0fb2e3a6d091938ef896ae927b4817cb78f4514bdfcb5ccf97cbfc53cfdbee920e2d2e0b747b70b5e9e6bc6030329b3929c8bd663611f51b2c4799e9d48d4e51a79aaa41c119399ffdfddb60f0308657f4af8e48d67d6fb335f4337d50d3888ec39c5bb44361eee86d976d01a620a0718b593ca3ccac8e88506ecbd8b5c1898e8741b272bf04f79c2f2ecacc7c515c061fa42abea833bc92940762fcf2cf88167f942071cc8b31b4f2c017214f3c403270c5f0dc4acf190a3a8ce561405d81882a502c7ce0822ff322a9bff7ec931f10312b6e87ce908e0135b4888fc3c42bb7e56300d9f877360cbdd6b1e204b5fdbb102123f6722b28621528537363df32d32f56650f20ae7fcbf40e2d566a737c1c9a80328974b05cb78d3b3348f58d6f512475f8580340a783f9dcb411f8d7bc4bf4841032dd9275ea2c770ebace5dbb7d1f92b8957e0e24bf2d4cf4779bec9cce94809f940cc23c080d08405375736ed199d2d3b797d751b9318d62f6553a8aa7284ef9a9b70177c87244e52ba41713f2f00e11adf11133a7613618509a35e0c886699187aa63ccf78243994b48f479675016041bead6691f0a38ff3379fe7e27151ee3ece576132aed21509de8e11bc0c7ddd2e424ead38344bb31439f17f23315c98de8bafbbe8057eebceef80fb3d491a8dc3c30cc3ed89db01b5b89a7ef0f6ae3b6856851abe8b843ae39a4948db2b31be9f3d273e0c9bbdb8b3028342bceb532d17482f6aa12e73f7779f3fe504e4c4f5633382eaaa065ccbea44407493fae569ef11a1023b51c70e63cd5d1db277a885dc0cdd602c40e796d1728da1c2af1fcb9678a04a2715d839e602f86f251e929b1068dd275added8bf52612987bf3433ccfaaf83394584058adcaf6508547fda94bcf7e47e0ea9a020b4ecead2fb5ebaa8830baf119aaa12a1a8be2a1d87ce4901c061e7ecd57d673a59cadbae51a79929c2f753c2164da4c83ce279914de7742f0e6684f4baf88205831eeb82c275cb8d97fcef30e1ae8f53109801b0445392698c16bf318df5063c6b01f1de16b8f3a410c57018ca65dacb6ac9a30cdf4e46eee2f01a7b11e27f94547a468893bb3c9a849795a9a25a6fa3102c23d6baf50e83a9832f39fb1a4583db0e18273e44f8a61877ff50bf7afff8dcdaff691978c38998b40306c8bfbe084100cebc6feb5902b7cf8f1c2252cc2d4f13f4fa4f65970e57885a16dc4f3a309e4c325ee4e64c1ead96a6fd4e3dc3b46221390c713fdf7ccebaf4412fbace70aef6d936b0558011c63e22ec901b7480977f87c0109b32d0bd22a95e52cc0f98796974c684d978398cfef32c89b2a30968fb6e85496b63fc1d42bacc6ee2ccd348d304789fa45d31a84171bd09fee6eec32ae026e05637de07ba29a30371a02754d1e3ae5a1ad3c919a39de682a8a68bc8e4beff17e139da45c3015812152ea1a275f8c66807bb84b1d4399d74992f97c3d19fcbdc7a681016fbf1046ab74402585fa8f002611160e47e06512ec5b4f2f89d05b3dc99f610064b58ed1361ef75c60547a989b187c2ecd7c8145530ba906a018aaea979b86d8cd282cb70fb8a8481de140ecba362644eb168e430b68cf6f1ff88b5324fcf64c90bb69ca2430a463a002db7858ca001978fd3ec993ba1743a64bbbbcad896834e8d7b0cbef4e17e7c93ae41d880938bd990a0daaefe83b5d1ca801f2780a7ce8af0e8280d82feef7ef743663df762a2c29f73e294ce486784fb5db701f149b661f8552bbceca0aaab1833ddc72055e334828ba3437a35c519b8c91bffbe2cbb8e1fcc9310cc344a8dc35a9ca211b2457b019d8a616f11ca3992af9e84dfd6f678c5582d9b8c7f6cb423ed433f3a5d77f70b89e4552e0e043ab49a651c96972360d8bf534f51ce6f58a0a4eb76e5f6f885420a2607a83a2f556fa2f02ee43c4b7ecef216833652f978fa422e1a18ae996353c930c9536d073f66aefe6e95c41335e91e7f50b8ef23ac0d03288bada7e67f5165fee43b55ea16ec9b6785674c46667394d484b6d9d70975c5d82654983a334c002a57747bf5fe37741e24cf21d428c9ea13af989ed5c7e391e1003b5885dc01a796ff4b3bb7b26dd1a0558458f1747818dd56dd4c3930fb0e36f3cffd1b6cf8f83db080a7d280c70a63adf9ee94f2906a543b3f75fa21db7825d6ce28d59af16b7c0d68739f3e80f9db729b2e25d7433ddbb28daf5025a8119bff1b2c553771d0a3af93981ef2ae6a43f1514015d27be3e6f00ac153afbee743ea2186462147feb337fe34321d4b0639c3ddedb510e0e", "6a6a6a5263", 1, -1931484003, 1537743641, "c598e648878acdb7d637c3a33aac02bad0c216b3f738ff2c7552b6336fb60c6a"], - ["030000807082c40302bcecaf7d3a399dac43bbe86a57fb4f60427084fb594eb24e771d6086a84f67ec0200000006526a53ac0052ffffffff361d16a1f6b56b531d2f4ba875e18ed1433a8fd4e1955ed3c1060b0c0b60ea6503000000035163acffffffff012c57490400000000076351ac52ac005393f83419724362c1020000000000000000aaefeb0100000000d7358cc60f0af79c282579891d00e89cdb88bbc44160319b5afd8fd5338377984f3d141fb6633875d0eb6491dc87c3662ebc68da5883e925a597b24c091cd687ea6f6970c32ed4b612b22797cf0417d577468b5273d209686bdf9b01c0d6e91d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001300947fce9c8b6926e32035c2d9b8e2410b5eb1a942a4a26fd33553b2c7e1222fa00803f6a302b3e1b442a9676299afe20d427375c0b7390da695e8a07a7e829fc3051794e5dfddd79a17de3edd9149c6f1d3175f8f129b7672db0bc8dbbda01598abb1db33ad0886a15eb489778582fade82aaa61bfc514d84d5b7141c028f0319cdd136fb99847aea87c0c6c1efd61124ceb0b5a8ad96d98086c379c2e22cbc030493c09315f36851f493de25949f970178e6af0807111accdee8f37a3ceb1a2c0a06bc1a61f1707a8d0b654aeb1fed3ddf2e3ac33913b0247421cf3bddee8f647c61d0074d1f6d2b2525d79054935a0a9bef307997f3f3124fa2ae9304a739f6aa0218641c46785b80d0c16353de7a5c5c5fc44d9605f3eb660cf16f2f2f6ae374ea020b286c36a2ee2b708617b9c0ede3d317cd94b6c7a8a065788510cd3b2a492e20022a271aac7c7ea819573a47691697390e2993272756ad9324e183b319890554dc020427ccbef723caff297f849b3868bee0824ad5be56388f3ca90f5faaee319eb2030859c4e55d50445d61f40ef727b8719778eddad5fa956a1c92d964cbb6d712e547fc9b405e8088cecfc5fb2829fac6598a5963e7836625d0d8b817312417ec8dd5930fc68eb972ccb86c99aad3c745e3b4bf44af73f09e4b2308c63a8d0fb597e2b8ff62c2f1b1e2c6d092f74a722834df887c346a8b2a1fbeb537ba1b115da8fd3809de4f9b8d15c6c614540b946843075ab3ff1e8a539f84b9a9abf345b0fbe85009c37a8abdbcbcd4678553e8333e0958f415e1f9985a43ba503b7dd010a05aaf7dba92adfc53b0cb8297ab1725834a08912bcb45a1cfb1c97d6749a57d6042f5dd16026865a6b4eff8910810b7fddadae54aa4804dab4407f843ed07103cf2484092becadac41caf2bd3256d31567f28b5f7bed22667439ce000727128b80f188211b75b7844fcdbcea256dc2a79b67054c21c5d96992ffb384f05308ac63250a79c205feadff2636b59b90f7123f7bac17aa62ceb909372e3da040beb0c5e2b0c9d80de8a2720edb9d4a8ea3bcb3023967919f1beaea6bff6b6519b3ff7e392364b2627aa29fe40015c0308e5181438dc87e0bbcf0bdf1afbc6f5a55efd8a6eaaf983790e13cb8a3da88dc303b6ef72de7a0a1adac781175f011e3432a5c0c076e492e24c1d856f91eaa4eae02970e74704e5603b0d7f449f90c8eaf1da516a7043874872ebe9f1525f293b2eaf172c2012be5946c8defc35e745a1176ffe87e730383f863357c4efcc91f417df9ba079d7b7675b884b7b62bff7a53ec882381554c5bcc5a62292c9dfa70b38beb5024d2eccfa0c154d3b733bd329f5988c8f1b1ae350f2805ea468fc3cfd391a60f8832c5dcba831b497e7f8d2a8a335778b41ede4e09afc59dee54b2bdd3c0d1101baa405480ddbd2ba7437eabd803b0d0a09343a48b10ac9399daac84d0cc4258e0c7b840604776f0696d504e5175a0da523ca9e7a8b1c3ad482546970e1b529cbefcfabf9df55e752686a0fd8e6686f832c479f881f3826bf4acf27ce1eb40794042cdc05c2572fe460691eb7c1ee1a6f6905587da59c12d8330d6d17296dd2b6c749fe602c51862cb094769b73df9bf42c4d948c8c8eafbb28ab66308d4a24f55c574c40976362bb38bf45dd075651f73e414e2c05a00adb8730e2305d86506125e506960136db09a938514c353634c3050b51f366ec4552dff5c001895ca210507471e8b849f6112fc573f3d982233885d940d3d16bcdbdfe423e7e6af0bdafc83ba820ff7cec8467a8b7c115925ab9601030afc39be733a56daae88cddce8ff99e20be77a8ef99799e5204ff2d356381073442ab23cecde0387e3aa098fadc0c729b60f5d749a9ee479a346e95780a615a4842f0c388497c039aec61f80cb28948d596de9666401806df760df925a982a94bbdb0d052d3df2d6ab9452d2c73766cc2de6edd0e4588be82a13bea0b667522f01fd8ad6883594ed8f8b1fdc9b30fe87f1e493f1097ed1e290b42fa6f7135bb5a6d7173a445531fabe202078482f62f201c9abbf15614dea18d1b556cc02e43c29a37eed5210dff707dbd0e7370f4266834f99a7be48bd77adb1ccb0d5fe5f5b23fb22edf323c329fa9542cec5489ebacb73746ab32ee4101674f09525b9432113abe5c6029a4b708bb0abc8d7797ed0ab5e73e7e621340b1b02c9e761292c546ce89887a35f9be1c9e706d1f6c350444b2ab21cbd51292a4ad77fad16e79d3e89cee622cb84caf5d74301b43f10000000000000000bbfa5a0100000000686c4e99e108a5380187bae5b28d0d4be4458ea661b95723b0c26d40347c04477b82348ca5d876e8bf8c14eb8cb71f8e6bc1c0e80af2b437c52ba7f34193a1fcaf64addb0aa141f71a9b9d332e448e5875bab43f3bade123856b7400d2b31f01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003284c46517b03f6870cda3c6b5a4a03d9cb2d9698085dd5e5da0422ccb53022086c4a64896bee95774b77752127f1ffc2263e751ffa26d36f99f107d70748812596795c5fe8f1317f554e16826c910e1d7125422c061072032afd4d2f5eb7600087b2c87decd4ad1a21e59a93bbb06eb87fb592e45677c00c18320fd95f54cb8021b82093279f6210e51435d4b25864a336452c4d4b6cb7d7e2d6bc8795e1ba41603283a15c7a545e1f78a941ce98a9cfc6a0694d65300efc822c2d383e750077e080b0441f9cd900b613099c7ac3ddb20acd06d66b275c10bf67adb9bebde1125a2336353e45ab598226ff489aadb4223b36eb1ed364d5d22f0d71c5da4f7d3aee4950221ce73a528d39b9adc72f165c694d3ef7f2bd00e14a72f0f27605d11f3cdb9f7031f8931c202965a67df2412173e0792a76471de8475240f5e5425ce319e5ab97403090e9c339a77cb2c8cc16da80ecd4b588a85728413dc93c6564950b6d96a02380329593ab3a3a30fb38568c1cd36b238a9c9d089fa55d5289c0d17c9eb5e3e5e900221e58e36534fa4d0f7a213cdb2e8f86f9922ae55d0cd73242fa0c28a9817227a45b158b4d144863755bce9a1784153a3ed30a8679754693d88c80ab159cfc1e57b6b17c133a40779c0a90621b1b1b791284db6dfbf088cfb5d0320a72a893728ad3ada1ac260d1bbd66b3c2b634a0bd55dff51c062dd48ddab16430bb40d085a583062d44e3d664564d5a7f8fa0f4661deb331bb0321c7c15419736a47c61755e203fab60f40ceed96ba261e8ad03cc843817be85a20432d7d627bb7edae3ccf9a15e475ea98b0ad2d7d55c6647f59615a10847b277afae54f3f0ee88ae891659a5efa6bb7811f92f621a9c9855c53b1df3c87327605d577bd67d40998ece3a81267605d2b80693932ae5da7a0a861d94ffc6d588a2c90b75c1e4cea2e607495f569077637e79664d96109b4d0fc7e5649648762a900d042314b3895c0bf0818c4ca139a9e0578f9f678fcbdec4f38a2e4354c983521d5c2697f64c7823df8cf68124a988478315a18d9b591ad40329105f874e584fee28db0178477c9395a3b84487bbf6711c3274d41b6d120911f0040bb3d0bf443a4ab4504f4ec52261b8d43b8e27a8262b6f43d0fe1a73b58a86850138d7a54abaedf0971da3ca3ce44aae2fbabc20a0380b822e90a34ebdb979f60607d93a3eaab0ff76fc17a4eedd9bf456c22a399fa9f2893fb5dc319c2d630f6acadc42aa5192caaf45e019fb6175fe9914ed9b7b77f6dfe11c46f9340989135ec7da5494d40abbe44d8ec7472c9b30564edf3b967bf48f5f375937d909ed64928b2a404ec2ef7a0022b762d56caaaded80869273bbf9d21e0e7b6c27fad02ac7eb4e4ff66db8814feaf8758a4d6f98fde6cd3db2aa84c9225237cc201e7ef3051d7b350a8a0f8a6174cf9d2e641f90babbee2b794cc9243621d6ee14a1bdfd9f9a26e2fbf1dd1f3466a067a736f1beeb1bb08a88ce3a1fdbb2e22819308be420fae78ba1f0251cf1cce6fd3037a207e61d397c53796e05af7e37291c7fae8eee5982bdf3da061314e77851ca5f280221889ab0fc9e3fcced255b8425364f77e5efccc610602038fb2e1d554c0e7c5523c8bfb42ae32637f62b46548693f6ffdf0b42f36eaf5aea2fa727f3871538b75946335733710091935c1276cd38a3208cb7e5d09f25e90708add9a6be2314912f7774dae55b5a1f89c0ac5b0ef45ef18daa0512dff9f75e32c7d905fa626b3d358f3b32f0064411eda7d5872f4f1c6119819dd14f42d8cd9f95f1353810e11c8b1e602d267acc0f8551619ed4cba4b7bee10d10fa728ad0080ef875b1314914c80e6ddb6c3d813273ee094bdf039cf8bf87d29569150e4b516c489afd80531298bcd73f67e7185f85f41678c290e0a15b35dd2a37269ff9199abe86a0b26fda79849a5308aafb6d91443d31f018cf3a25aef5b0f992901331cb7311e890ad7fca3e234703495b2422d604d6780e340d43752c53109d41902bdbe54225523205c53965d3c94aacc18e5c3ea906b708fc02ef60e5d939fa56f38137cc038d62338a6b1b1890571817138c8956c6def55e01581f482d805a550832ac79d0e4732c23c8b5e6924da5def160f9b7a0b96035f6de3b9815a31c2bf71f908131d62cdeae321a6f48cc39d8709ffd3dc0c0e91881f329782446680bc1f88d402262f024dc1ecd709dfca7ab0fc3dc84b308d9e1c42735d7be50ed0b2dc8a85548b589ed91347d09de880903c32bcb5343d9c688d691ce7acdd4ceef1ab72105dd5f584c399c2db30d6952b1422f7db85a92d7c00d9b6298e015df626f3213fd170314bb0e1d30eee8a8ace1a00b733d2cf4f135b243a8593dbeaf4a20547cafc1342837e225663fbd25970e288042c055e4c60ed05", "5363ac00636a6352", 1, -1136804632, 0, "db219502bf5cac41e9995c49f6ef4e1ce414b84c79d048133e5eeb89c5f576aa"], - ["42c60e7404121f888c8f21f525f4e67a8aff41cb251dbd3aff90045357bb57398d36690e4403000000045253656affffffff7194874818ded3a2db007b935a40d1e2ba36a1bc7e62f9d31ca2f822dab470ba03000000086a005353536a0063ab1454f7598499eff63efa361f92d87a9005258acbefbf3dcae25330d33eedd08d858f290100000006526a00ac6551ffffffff580fa2138a5e842ee48c6706df9ede26dc411bb4ad19097bc5f2ce2c3193ad2a0300000009520053515351655253ffffffff03b17ce3030000000009ac6a52526a6363ac6aa97e800500000000055153516365e9b8570500000000026a0000000000022d1b6705000000000000000000000000f34002af631e80226f9e7f60f0f476ea02d208711196d6a223a33563ebd94fe5a53329335cb03e56e42d82c3bac16dafec5ddfb002b98f19ecb4d6b1f9e38f437d88bffeed9d0eb2e03fe74a11068092d6d4750dd61f214573a69dc7afaddd62000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007c4c14e0bacd2ea8c49cfcf75717ee7ba016720a4762193ebebbac195cae2dfa2dceb992fd38000f320fad047e3a60981f34c6dd353caabcbd6278c012952cf97286e4931635fcafc8268f73b74338897bd4db42e0a3bebd176bb47d331e1eb89464b78d1b524b24c05e3ca4f81a605a59573c600e7c714d242a09c6f7583ef402049ebbb1bc24d27933d519ba90dd75010208afa2b54553709c4930967cb7198f021659774deaf6418e3f411d6eb04bd9730f78d250e45acadb2887868cc5af23cc0b048467712cd70136822597574c77ac2154a4bb45d51c1e8bcf82d37881f4a8645071a04ac46b97a1811953f152119a7edfb892ae453e91d1d33d92e1c392228e031b46045f360277a288e267e9b3cfe9d26cfde6eb74141b5551911520afc026c303043944218b1272730191291e2fcc27a1bec6b74c9ca9718c2ee8310b2492b249032d1b5a178d60d4c7897a5d2f5fa0539d8a896acc1875695eae4b118b37a6a6f8021f1a6eddbabb2b78159a924168a45694d4ae49597c12a4a24e2d5656c4af8e3a022b5189b85ca3923543ab5c077320f69d469c6c41d98ee6a0145bea4f0db93b1c9556dc8ac21dc7b0bab886b81011b112f6a9c6cd7dff144d0609c0538cda4a6ccccb8e212ef407ae6ba1cb785e83137dccd30115d1be0c72b7139e10415a300ec231a361492b4a543db9eb72f7adfd46e5292a267b6ee6ad34c99cb98460f145306c800e364b374ea636da2e01b8268cb357f2ebdb3cef7420c1c1096029c7347cde314cdc6e5cf048512e00885ce2c4b76b5e3b84b1b13b4c937f4dc80bfa3ff7446f609f66c30571090f736b4433a49d8ab2da6986a38ebf9e7bb7d2eab407890512ac1fa0acbc252157cc52b9ebba5f75c4ec76d6c53f1b3dab00c4f39a6d7d0a3bd5cd8f21196ed3cc6b0a2af7d23bdf7727d538adf33336073d5b36958a2eff8b27091405ff449ec2dc1f24bff12de51574aa91f349ae6185754a824ff9079ea2eb7204badc22a3b09eb3fac4da43271eafe1ca451d0c4e5051ca6b5e7cf9cdba238dd498b251ee8d695b0b3e206c510f487ec2b836eb3b8d088830ba3705313d145f90cb0340879020e07d58dc88ab7aa562852ddd49acb081f42a6cfdfc33f37627db7684f676990811bb6ec63fd42f7c67c0451f40b70f633bd2613c1e5e3a71a0dfa12e11b0de50698b2256758c703fa3655fbb840ddc1cd48ca9bdbc5098d955540220d957ea945f570705eb5a8121411edd094b516d2946604f1e9927088fee9a424fd9aa0e415e7e9dfb743a18f5092ce3f26af8cea85a060299fa99dc1756b90baaa68c5ad512006d65aa23f16e5d6886929bcb777b3aa85bb4402a8181467bff8cab30efd46b88ec58ab4132c5182165aaceba47924c67e2790a2f10ab3e1ce2db2fbb9c3ffe6e50cc2b68dd682f039004226458ad0a3dcda05b69e4d98713fa21890108437b1472ed676d679c0a58e138eae03c075cc70b536d4f1cdd7fd755dbed8daa7c6d7b5ffd8dbad549701fa1598c400b778696cb0d0e4f9e2aa7fff9bc47cf666e6f76981826266a4f69560b35d951608f7bdb8df575d1ec1f559e46284cf1e3e70e938f57174c0eac1b033950ea8736bd14ea10382f89119da2680625f1cf260293fd654fd1287f29533e5e16a77d4f898bf87822dbf908a660329bc0dd3c09a8fe8bed3dc03d4e026117bdd1378ca299f0dd06d63be210d89b2ddb6495e20c0538f035749393310ee87bf93776d4d93a61e03935551cebf9f50014de621bcd45c1aae72e7917c005c6a6c224a7a214bb2e1d234964d48dfdd47a97c44ea0b070f4067cfc50ce1813608b46f9bafb7dd084e9d95361cd30c001d8858532edb00914cc00144698b92a8e65169f46d1447c4efb939f39dc51230ad576cbbc25b05c8e2187b811e1248cc392fee1bc4d6b2ea6d3db61eaabefa384937b99fed0cdc9cffcf85961197c2953256bff4a3f3d808e67f23676109db8815eba8b307632ced9f0fa13c1fff17bde99e6648bd7f7ffe91ceffd6a5a400e1375848969640ef14ae5197f3d01c88756ab6be50f9e35a3aaff12b8375bab7db49c8cb0bd1e9fa39916bdf54e23d08d976b9e6053bb8ca8b60111e998735ad0620f23ebd10af1295da5d7ea47ac3bba810bd4f329f4d855f804dd988593d90f983a3d59332abbe7d8fc9c6511f84442b4ce6ecd60c226050dbb18cdc558363db0a3276a8f5f4af5fc1f5ccd49de11e8854b7961c33759247ab05f50e617932a05b618ecb01ffb0b4059d113e63b37b30104000000000000000000000000bd7a19a78e4d2bfb5b99c6bed1f8108e08eb1286ca08884bc26e54679b93f7763640f462aa49bca92cda3ce40c0670ebee3859576e66e910a8d2fedffd65ea9562ee032cd5e00af7e17ec489e02b3950dff68cb3c6fb64631975da061fe59d7800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d6ceca385d04b7ad7b020ddeae339f1d143209bdff97a3ea1df31ec8e67faf8d36b73649b836b6fdc49a999a85dc087eae4a198f0fec506ba93667ac3b342b25af6d422734db4f42a6c1e6d982465d165547ed62ec753b19ba0791073e16ad00936afd4f3c770bc065d51445ea00f62cc6c33655fb783d102e42720d9bd57900021afcdb3ffdf0758431a263a43da5cefce35a611275bc17ea32f48754771ce2a4022e4e06fc2ae0b061f189fc53db9b3b8f6b6686c7d84045f74aca66eb5b8176030b072f04ed3e5e8b9a171bc3511a9d830c01053758e634ac0b9a29a62366671d2934ce2a88e4c4e9b26b3b95b5691f5c7e444873cac074cd6f42008f1e95a186ad020ed9b5f79d5653fe75c9d39470a0671babef050f30c1a36bb360bd4f0973f706032b588dab0ee07e1e68ca53e8aa81d9b493646fb13ca33e58a1df8a919b2211e3021439eda39c17210ad4e15b943b81dbc6e6871358987bec55dc592308e322799003246b8b16437818aeb73ca650b21f8b92c03ff28ce95ff0f338a47bcc2be7829e021d075d28e23ba0aedc816967f6e1b6864845cf61efc7a7569fd2f208703915b3304fc9310b2dacac5bbbc5e4a6d42d2a7b99679dfbe669f426ff341b9ea740b20b36ef49b3d8fb792e978bb7d3439af2f3ae6204c44305e528e794f52f071406566e1109dad9bf2fc85e48f70bd8935b9db17ed25a6ec571379602f3da3ef28516d99b605d0833f902246a5632c4dbf57139f7107a67432c82f5ee4535c1d0e00430648634de4f2973096bff8cbf49cf9716bfeb905b09f197d916f342e4e70d115c162e7ef5d4faac19ce20ba778838d03992a9674cacf1fb2ae5d0b5363446b2f93b78f96f1a30670e87c5c1ec6993262229de6a265497d0c3655307c50bf001507ebad7404bb8156b6310d656cdc4dfc9ee28016f670b973a7fcaadc70aef8fd45a7c1021cfd7c88fabe52855ef8feb04d0c568821488fdb9bee69acaa3adb308927ae42ad44c4e1c7576d2f8ef614e955053c90a25db0bc96656d9f4b5dfd5ea4b263c6f931c5950eeed20be916c5bfdff41b247653254affd1b0580a2225814950b53c7ce909e4ceb0760984aed3cf5fd0370dfacbdac6bc552bdc9de2be49463c06b82875e8ffe9b54bc55a69a79f910c34fef5c2252874c90dab2409073dec4a24bcf9b39441f69a28b50b3d618d4cb26280527173b1869b5d767d7fbcc5fd566f72a88a1c915c5c9bebe908bd5e876efc7141a67f77f1773c34247c3233cdcbd161106a2f2b2d73c4634e63883eae5676fe3de82b33ae07f99198c52cacf65eea3576868b75afa5ca562bc31566075eedd9aabb069a2ef296926ecd61c4d0f6d7151d8f1e7f026c763725441202c98cee52e7870d65369883bbe90a94c8a9e5719b8010a3466163f9742250cf8f781fcf06e422d78ead53b238e73f4c8e9afdff6049cc426938ab52378e83ea957a3267a83b8de954206906771e166547f156ce2d5e895a3498b6e923c2c2156a3afd7def3db419837d17e0a7c416fbf6ee1607920423bac780c90926340ef83e10ce1d7b3141c69e54b796f9de0c1bf2b8c030da974d8403c00e32e398a374b2a4f804df8bf115156c1d01fabbd43b9036ec798d09cb677fa6d1dea47ae997e2bedd85350a3a49b621acba2fc2803945c3188a8cca53436a317c9e066112e20cd1378978472071fc1b5b41f6378376e2e90452aaad0663e02848e36a2d6e94a52877c3bc360b5909db1e8444c55dc2c4f22f891cedcbb18402fc41c06ee3db754ed54059e9ce40a68c165def3ca164e91318f359d69e25761d5c74d40313bfec41a2c8d979dca7bfa9245d7882188cd3038260a77e70cb9036b9d8a06e13849178404205fec3d9e6340ae08261a184c177e902b4a68dc4347fe8824778f9c288addfa72ced76dfe3a646d6001cb4c10c0ba284e8edc3d0fabd36903877ed0f9f49d638a06000c36be1d2685a8460474a96ca65285e9280bb181ed7a9d1f78286f78f5fd11aadd8d0487d016659d472e2ee33decd05938a2484b2aa8a2d7820d325d04643b43b4ce38e406dad653a06885be773cda9bca2cb387eac2db2f0be65758f552aa973801f1f7e676c8afc6e334cd30470419acfaa12658b50914d548c0fc22c16c2e6d853cef1939ba85d559aab8c8579e2e4755a0817dd0462c72fc96975a38fa4f72e4c0079a576899f9d804a1226870cbe3fcc7e125621bd067cec2f9666414218ff953039d3665701edcef834130e2e184bdc83d8a8af119cde677acc5ae3161dfdcf56ac936c9bc6f94dd8788c274eeb8e0ba1b4baf6640bf16da85035152a8256222ecd7dda2e258a2d1d0cc37021f43cf497f0d19990785277ef563fd24ac13096ff90e4d243a3ab95cb5a057610f4348f7db0bf5bb731a9a09", "5153", 0, 213544156, 1537743641, "f4c54d80c0db16842eadc7163640600e5ab39874333d0432ac0cccffd70e0e59"], - ["030000807082c40301a6eba9d56febe71c4d835259e454041c6f87f854eb5d285fb708793601e7a7aa020000000463520000bd42513604421da3030000000005ac51526a522095de020000000002656ae374ea030000000008ac006300535351632e1d670000000000015300000000c297f0cd00", "", 0, -1895044105, 1537743641, "23b3aa0356c86fc92fd86a84707d626f04c4cd2f65e53daad1f13fc83fe4a3cb"], - ["030000807082c4030374ae073ab97075bef1716f96417b57d7327afe266d3f3de8644cc619a2bc44ed0200000003526a00ffffffff8e4831527c0142710e663250ee8c533e62d4e937e0f41de4b38e6e66bcf64a10020000000563535352631aacc71aeb44cfb72e9fd8cbe983cf221edf270ad7cefc233e0d35960c3ca62a7d1c735702000000096365515263ac516a53050cd98c03013b420100000000055253ac52536a18c102000000000252516a84550400000000046a656a516a42677b0000000002afa5f8000000000000000000000000001534bc7d6ec6811989cb607eb0b30a1632f9232fb84e8fddaee4f4591063d4a5d8fc7986617a3a426218b28ecbc1fc7580b92fd09fe5e68ac224bbc4df7ee11d2f9700b5d9a1fa14fcd4d6bb76d8fb34ed173f58ce7231dae9b37c22178df8830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021989c9580e39f2e7167ef7c6c1d20728a97bd0e1594b054b5465f7f38e22047c85b4bcec5fb598b9f3fc1d90fa674f168f970dbd15fe5c5cc4582ff7f7b492ffa2675c58b5035e3d03d0d8b07ebb63a06d10ac073db6711680360a04fca3b69897d138b22e214138e502e26271fa07db14256d3353de302656ddd1ee88c462f03143cbaf2857269602c21059109c7d7588545550c05b4cc278a90409c0fe218c60328fb31130374c8f3cbbb0441ae2b7758606d7e5bfb6e8d23afb3935238a250430b0253a75b097b274edc70ef8edb6cdb9afb13f01ab6928a5042f39ee5fbcf048d00fea8a653e0362bb38eacec7ed33d1b6a5b1424823563f179b42b45fe9cc058030b6bc01f4195a429f769c1ae3e699ab4882013485c9deeaf753dc31d1e7653f4030f4de2d1f0522c39770dd87fc04eb822c459387cedb2be0bfd45cf4a762dfc5d032a4c8c3d31ad81e3686de5f2e4ebad9f78273af284db571609a261648a2323500226d9027f2d4ec025d4ce1bf25fee9b906ce6fcbcf2f12f64bf462a400052f03d0204e80c5f78e715c8df35b3050e2682329d2875aa984ab76edf69a44abb3d64e2d3c7cab5d209fd6519c80625f60934f4e0a0dcd63d8a3b2ccc3d861b1748f7924f8be88d0ca217f16c24b660c79dba94e48fb649aeb3eb3a4049d5c329d9a4b7e3c4ad08f5db1daa1904eb13cf1feff4c4be365ed94c041d5b93790be46724f317b6f8fb638fad17ce3838ffb517c1cee12bcb6c78b07a459eb576ee3360b74a7f2ab6547f6971c36525b6d563e534f272ba013bb95c8ec618d95c3f516a12396d3c4807ff1e150efab9ba90d0ca25d79c82174c72bfffd47c3714fdea6387e366fbb2cabd8eb3280413f629c2f5b11ed97718d439f09d107c3546b91b8c9d7f543442792b276af900a678f5f2e04f6f1df4ee0d127afa7f769dd983acda930844e7e1f30c8676053f0cd0092e122f27ef88fae980ff2c9a7691122c5f98838688dae9f7d4a6ae46d9186239d350aca19db714ef5ca9b6096733ef498de6ff01eac44fd8a069adcfd2912ed5f452a6e9edf5da9b3497c09d67cad1ef510e5a8101e4585abdb3427c1d6697ebf6d0c8a533ae52518fdc81a3164dab397de064e46d307da147004454450ca0a1a8da9134bd7c0a69151d382923d83dd88816660ca242ed00a8cb7687dfec5896e8ce71521b2eb499737c98926077984451ee18d61a886b976ad43ae959f5b604294fc83ac9fc2a546b9b57351cc4ae0ec757a09e4e6ffc2ef12246a5172b699ff082f45678db8681fe451fd41250b6ac59ec5703b2753a53765ba52ecb987598e7da67047bce4c8484029db91f06c91985e977fdcb6d38c1fa3b7fd7d0abecd3e0d602f7ea37b8dbbda4ec81ea5c18bc4b1382cde161ee09e4bdb6c49dd81f974616f862bcd0656078ca43a976eeb8e44b2945966ed5aa8f9d7fe6a01accf63ecf46b0ee9f854269967e18d3c3f42424990c6badb52ea9ce90007da42c12ea33535b89faadef7fb966ba19ab1dfa2cef523401eda0d346bb70845c5000012c0dfc4c249f5f59b96b767ecfe53650e70f77c5b54f6ea8d3fa8843b461e39facf084bcf7a9fb215462ac9a1c832ec490749cdc71e5930f06ad5db2c38019260670a74a4220563a69b2d10952c520079350716a4c5f7e73b7b379490e1b109e9c6da338a897b2f54854f2e5c6d83da1df13304e35832e92fc6257ff95ebbea4cb7a7c0873b08af4833b3d97abb1d871c538198034de4d0ba4b80e777055c0f7487ed1f05186e90dc68769744bdd00e9ba3425058c108aba3d23c74f3d7c8e23ea356e54ffb5d6d9e360e94e117db4123810e6b54b4ca8cc4a05a072fa654396826a3fefd7911d9eb3ab35334bdcddc0bc97e195a5a43335b16dc61f55113f258ef6c15581300de608a8859fc928502faba891d74c10d2a2d15ed352d152fd48fc5320e87d345f4d5588039bea0c8df33bfb2ce454c5c3e9b6e2ac720e101015119648bf08abf1233f313521cc3f98b7117437d1bfb3dfadc8a06398e9c633873987e2ec961bddfaed6cecd5c9c5ba0230ecf41c80987fc6bd502fa888de1c1c9392759d8dc74e60502dbef4a17ab1e8091853dce9603e1bde06241b384cc588604964eb6b5b1e106fbeaafaa3d079b7637acf35b0f66e688df451308a6cf940ac0e648d397824f23881ad5c57fef5d0c22c4c36cd316829ee7c1e469e48dc0d0bb358fd92d81f0d8f33eccff59ab2f58c5265ee1440e6e46195ac51467a98f030ba3199ea49ed890000000000000000ac42220500000000669c6cbb17eb16f20612e10963dbd2dfc3a5bbca873988bca767530d19deb8cb95bcf67220388fb47fc505e7e41df71e045425506e91ac06e65ff727cae3947afa0c4bc499e46ad532b5fd65592f9772247a1efeb868f2963e24663dca6c9078000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007821adcebaac1d93a4c4066c0397242e9abfec85ca5719ee8af32a295589a3abac4b8d483ba25f3d4662257d0192ceab10c29ad098c62a98df779632ef8c75d1185f75312afd9266782b858738287288903f9d6240885f1e2732aedfaacaf202cc63860e2e68edbb1537fa907bff0feda8b9337c9a0047562ef7cc1b8e64d3de0309d52d74e2b246d20b36253beae80122215137b400559990e26dbf44a48dd878022f0eebd3b937f7a420b8ad1991d0c4c5198f5561fac355e523244cb177f2ea400b0865b23495806e9bde3b4fe21deacfc844890763045d8edf9318a6223eaee02d967e0e8bb03037d8836398f5dd6570b30a2c262293b18cd4ba77c45c38936f420229d0f3edb9a2a3048f8d9b732978dc1f2016d3c31f0a13c33b9b231dffc0c367031d62332ca97e9abd026d183b874a7293d18679916736b9c6e2028adb019a6399021de7792c31c320d88bb7865619b6ac4a8822b2338a39ed60cb5e8c95ad8e6cc4030e3245abfa073ab7c310a58b2d38c8f4f90b344451323332fd98496b3819399d020e9d356582eb5fcef1bf8aefcb6411b13ff89719e9fdaf7add6f195088ec516e86cec215d6cc80ea270cf9c9a45de2b0c6be925e683887ebed770e2b7a850d4cae47796aebd1f5e70f235d9b71f2add13cb9b80142076493c7cb566bcf8c37f30473edf1a3c2d873995ba86ef9b088acd09347115b032ada1116e7580014e79f5f7d32ee9aba706a1a592c7211b1320f034791d9ddc32f00df1ca36ad83b82c5dfcd5fbefa494bd063ac1c890ba894a82a0366ed308507a5dd249c1466bb00824ae34629b49c4394e46f87e474df27d5a0994d3fd736941ac9b424f95bf5a39649ca4a8471ee6b66bb77a9903e868bacf9704f37b8ef81f950f0bbcfb125e292529ff0df79127f9bbdfb03449322b48a626cd370abb98e51ac239a974455037effa83172fc795625988044f76e884500b654e4bb7e0c09ff2e96eb7d9cc3693a67077b15b259f30380db3e4c977437712efcadb6f7d55cbacd89a2e004b17acdbb1c139281b047b7f268c00adc75325981e66c82d39c3d6d2d26efc870e9eb3e86fc89a61cf604e415ddc365ec6030742744396230fbd35eddc922660d646efba8acceb265a9e314ef0f81850fc0d9d7a32579b0af68d3d057125fd190808b73d3f8345799edb1ad12a9fc5e992d0beab665a1a4724c706ca3da61e7871ebcb1450b069ada27cfb0344c6cf16a7d99a9694d92d85902e8612943350c377158f0d50aac00a0655507aa5f21c531045a275e1c6b1feba37e1b644ced202813cdb88c86fef363c434e14f5da91b6433f362e4d7a255aa589bb7b37b67e2f687564c6acfd9628a667a4f2970560d6f2ffdf166a65650d6f6502ac1dc3ec06a3d6734e25b35184785629b2eb1386d91a4af25e9e93b353ceb25ff087c1801ba5de3dc7bfed8b9877c4719d2e104da843f46c36373ccb846e509dc82b7400aae684ec9ed1ff1c87e8e05ceca52f489239eb1ad702b9ca25a6b7d382ca9b1826d6aaa64cd8152c6e288e87f70a0201955430c465b681f1ffb7831eaec24da11351fefdc8f4d0db52aeb63416121369ab98e56bf642ec2cc7d09c1a842f59af9560d4577f02a00f7074d43767a03384a4384b797269bea5bdf29babcc41263887fd7c5d0546c8ab7f2a909c14b40f6acf7e5c361ca77210c838ca74175945182a82035612fe1b641a1602e2e923a4d7fba1c68a2ee402677eba999f3905dc3b94e5825cb7c09325a0ccc5d6486dc8a950a6851ae80c37fd4f16a219d17d8ca2a813a22bd8c064dfd23f8675a36aca1c8ffb0bc49094f63018a1e442d7c0d46bafbf004a78ab4074b408553763b61449c6d05d4ca7fbf08e63adfff2600ba22c5f0394deff28a84d0444115c7cf918acad5e5c65fa756f1079cd2cd7879a2d4c8df76a3a66cc4fe405c3080958477fca20b787585cd97e53f65a401ce13e219c82e3eea79a13436f74947128353ebfc300bcc04a17f05805bd0f3251d41bd28955f5204987df042bff1c89f1978e37d51b0ce85b8dffd8f998ede320e4696c0b48c82d181257784cd73efe26029b898829019c8bd6087e9feb50eb0333577302b24a4ae21a8913fbe1f8044a89a3b5bc4365702445219595907924f7a500ed708a9b0e0380e2224365b0cd9bcb5fa749a80dc5a55689abc14df0db37724e0279f77de8b0e6b433dc6cf3baaefe454f384db578f4a4be3fd08d574b51899df3f71e0fecfa13c205d45feb00184deafe218bbcd61c0222eabbed8b96d0912e24037e3deb2ffb3102d6009aeeccfe7e21237b2cfe076b34a0465290820b523b6e25dbffab89b8daf29b14e83edf70e2b40c7dbbb2d518a74535043f36c7c79af5f54e3d692bf7411cb170d93f684557c91abdc9f423cc60c", "", 2, 1007345841, 0, "3f60c106cdff4b07d977486448ffafeadc839a664abb0543ec22fdaf994f9753"], - ["5f81fb2b01954b6744856416c3aa50fbc650bd7c61d2ae6bfb3c13e13f728bf7f8a5b69d1c020000000663ac6a635251280414f804bf3a960400000000095200516a6551656a53c1ae260500000000095253526a5163ac6a5343bf610500000000075351536a636363c075440300000000036aac630000000001000000000000000097e5360400000000f5502a5aabaa845cf3975ba0b6862e4f884996f3295597b6231eac84727182b70e7280cff27d8cd9f88eb1673edb3754f2bebaf59118550d14a4b9d77002ca9cb6118158b4c6e2c10147326e33409466a137e3d98774c5395edbc85e247a450700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d08cef375741dd90caa64ec9736c249ed5cb6edc7d7e6b2f6b94dbdcf2dfb762a90ef7b6ed3356db323f62965f312b6a53d1ebe0eb54efebd689eb472ff68983e1da1bf21b348cda00225b6435c30fb3c7d2e07af94f471b7c6e31d4098901284deaceab8fd44416eeeb05be03c627d87ef25c495ff0d5de1de4cf4245cb98f8022553db35d641ba6964eec411b044f9b4359170b56f8baf40c7bcf6fb6dfb25790300369c39df0d95ce9ad9ebb7ef5ff545b12bd9838ee0d544454d86ffc76d6a820a07c20eabfdc7e1f87ec625acd9b3ff267fdedca04039ce2ae92e01fe76e346fc92a3dececa53249b869e463f3721052cab2b1abce0e3f259b728369479043b7002272678591cb6c25ce93f136ed986e4ec1ff2527275a5c861f2e082170c251c870312d18e5501c5078cc402c035d45508b86f31a1ca69bf6669eaf814a80567a5a903021a217ae203c5f22fd908fd03fabb504cf33c98965f9fafdc536f759b70eedd030145ca4ec22f4de6e9e54ed575f319882fa7a7712ae38f39ca17e1fb66df3a49021fffc1e0d9cd7ba02e704850376e673869c031e7fbd4b38440bdef1faa399a1c3fdebf698c2d71a1302cac89735363c3b7da82c364216c5097c7545a7e329412145470d07aa46ed93e4da377c9f263f573b016fa59ddd769d78b29a0bc25d7455d524dd1c6839fbeb1be2c7df6fe365ba147c581302c81d107939f578bcf7bd2d145c7d58760c8a68d37c1d630180e16857a8541201baeb53d08706de0bf4eeab1c68978ea3861949b2aae9481e36d409d3a0114626268f23d75515472077cc94d65e6dc934a17982a401bbca73df4413d6af07b2f98e65610b0037d4328d67f61ac4ad3cc5425f2b55fc947117b8209a43f6250b49f01e9e9d15f4d41d0f7951968c77b177bd0dc2bfc3ed5882f3da854ad64432764c0ddee432cac1ee883779b6bb3dd6eac344278f12959c29de076f7acefdfe0d42ed4052c12ff36cf10004bce5eed8891f094d6d1efd227142b1eb0a57aad58b4c76c0b11eb458b19072cf7a2a4d13d61d2e363edd0441221f51f2890419567d4e9bfc3a26d22df46796b46c5ff57c22c70b6c2328083cdb28acbace8c2e8606ba3075a070a52b80e23726f47477ba7d7d0033c09e6acd4e44eda66f47d39cb97f0d45285b8671f20ddb6633ef841369115bd7818fd15fe9c0271bdf77cc6dfce88a564204ad112bac9d30da12efa90ac0a0faea9df540b2644a630a4c265b15dab0ea6bd93a98aa6ed2aeeaa446896fc70d0f1efd643a9a5cc8764cf42b97d6163b9b4ca146a09361713b8d93a319569c9ca2ef21907d51dc5e6a1ff6e084f1c0d32a4eda9662c400ac19ed146636c6052a8cfd169513e8908810de5bbb67e87c0744a6048cf5324a0845c6438bd2c5ba3b9b55527918a1ab85385a672a76e501538bd5dba663b4c008d1b560d1668e70cd82d7ffcd7f707e323b6b2f268d3a668446d3396454c0b5aa2b8380efcbaa44e0e774c3ddfa97e52784f8152ac4dc7491350e69841a78bcab794422b7b6cd018e4ba577008330057354f2e33ae73d7a71f2e62ba4bdaee30b6d78426181fbabae2690a3722370adbc2c4ac13282a404a9c71953acf1c64d432049b0ac528cabde1e7cce0895a87372854dbc93230cb80647ec0854022d3b46966852d35b7311ff793440cbdbbb24f1ab3b1b6d32004e5fcfa3de0a35fc1d955c8019f4660658ae33e1ab4116c858958d70f97b3b4be6770a1da872e29d13c3d298b984ee36918bbc58921b6a8ba606998a26ec005d166ce94fae8f03d4c4a9ea420f64640773b145c4243c6f4001356f51e92b28aeea8298b0489a5c7e2be2e4365ce39759dbb864bcdc8fb5c94ace01324e79a5d871aba0f2b97e3ea6d86e656a6a77816d47abdb64756ff1ae682968f516a9d0b51212cc81055ae7189911a7b564755ff1eea545498b82a4731bf963e4970bbcae668cfda42efeb0372f9842179a264c8c5ae22f9364fed077abd3d961a5df6dda9645eaa934a7b3dd1819cfb8a76b37c21269759b92b3cf78733dc5f6268e3e985e8c2569a426f252d3d3e89166cc75120432235238ce95c6ad07660d292dc3f11b4009aa6eb745fbdedf999fd92797522df627d6fc9e53e019255197072b50b614e17201cd39175147242cc83c344de5301a95b127b833da3953d8ed100b6538151ef4b028db2ac79137664b9f8f927764ecbcf3048f2aa373af0e5cc50211b554facc139a7c2969d154ab12581a955d9579e51f44037f0a047f2b8bd58c56b624c59e57330132ce667366623a5a3afc78ba4a19f48b6ed9d5f87e300484c8f0295f23836c5913d3c5754b0191a0e1223575b152541eb342cdae9cb37232ccbf96acdc9225973e58a2b4975fae4228c79d392d36b76079172e35a6b02", "63ac", 0, -2109924774, 0, "6e5880f7412602698e3cdf0bf1c668dd251602ba537afc73a700ea13b5996e4b"], - ["f9229f25023770c6c79a7e653c90ff06fdd85e78a1ba23e20904f53d485805b115ca4bcc960000000007655200636553ac7382f4b3296bd5ad607a6945b052d4acca4bd77eeaa37d5bd4b8b78019c08e3e8557c61502000000060063acac6a51ffffffff02c84dcf050000000004ac6551acf274180500000000036a6a52db2f745702dc11a80100000000000000000000000002bc0730a69e541c6871951cd14d390e6fa04442dc41e4b1dd670223735a312f725c39018d4d452add56def5fe3218903f4ee26f89af3ab2dd0053bd33037227a27f25680f2e96ead2c6ad122949cc7e232562ef69e22a6d4e40e6ccb2842c7900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f088b90a4b133f409b215735bf880617d7bce5f5a1e3574b0daf8cc9cd9fe5cd4796ff77124c17eb1f0b7731797b90b74503fd3123fe64ed56860a43f5ee3812bebbf8b45f8f10bb30522231f7619d5161213aeb6e437f05860acac8e8f6e1c33eb639872ab6fd973479b1430a3d5a00f3e3fd9603f8147241e37afa76333a0c020ff8380ec5dcc34ad136c5d60f9c27cfd5f34e3cd32ac0f3e5fdbdd19b37e5bc032198ac1912620834dcc08f24283a80c98642c76d8f0200c9001288fffddeb43d0a055720d089948230b2af4ecd340776cb8be9712d57eb7407b05118fa2118515fd8a44cd554d99f4880c07edc0458f24126c6e46a0278040ebf6598a51441e8ed022ea00f0a12bba87573067241d4ffa0daac43010daf8e726da7560fd26867dcdf02099ad804a0d509f263adb652cff5479b331bcb48e198e6a50f49764277c923e4031c9d2a5461ef1d866336b99342f5229c3dd590f20565f0dc954a0f1b20736ff80220b0a11e9b6857c30c7932999bda28abf7c059a5e96689c9c98affed753987200311d0a7dc963c0c055efae69cc679d319946f8c5443cf4aded9bad323e79831a4b040a071db8f0ac93b1a182e2ecf0fe61ef1c0e6b98814c53ceba836c0bf3eb20b1e834ea20584c753bfec3e22afb78d232bcfd4e4abcee200db25ce6b65de7fc6419370c989395c97946fb9408b4f0dcda2082682a9e9ff8f7b3f58dad8e97f32c02252d0f59c1d58442542063b2adfcaf3723f187027555991324b055b10143969f5c262abe404760bb8db919f5355e428b5ceacdaa6532ac9fcff08843c29564e0a6c39b4abe2f660412e23d22c749d94b4b319e5937131979add7c41aa00d207cfe45fe69f77500ed6d51715ec880cd49e6864f7a1d54bc1d7380e78bd1f661ac1826a580f2542a0a00b290c340fa60fa157ac28ecbff1056dc3854d4da88f30fcfb287f5010385830ee2121160fe6ec1164e3684acbe1607a5b73b931f8b9eae9880a082ea8c3609d8743c2e880bc110ce2872132fa410cd20e1d07d53c119849f142dd684d2172eafceab6cf60f2a349b5162c3f17c23f19cd299082807f553299cb8c3c9f6e89a10df13cb7b5dfa767d4c7d19167832c1cbf57a209df4e401eb57f4b6206de0a5da260b5f1f3624229c08d8031f1883941ac6807d9dd7eaa2c44e875de0b9506d38af6ef1b5eefbbc97386f6bf3e51f6c6ac1c5dd0445f35fe135c80002034ee15d8437bc5a6c5faaa8878196060acdf1cf01a09a7363813e068498ade61f5ecb2e5a0a1dd4c9e7849b886383737d569a3fa61edafc30befeb3b21a9893615020d6c95cbbc708c552b2b11ce8bae1323afdac768819c11ac7eeb8586408dc4ff1132ebda7fee12bb05e401245699622ff5c5b28bfc619ce93fda423ec2c215e745111bede68bbaabf79b5e568f1aad2c4838d208dc08ecb0f3aa6e69e1679e920adf4636afe40f47648dfae81b05f9220213dff9984df0a12de21aae6bb82aea5044dc6a7174b716515671fab11204a1f0983dca9cda79437f57752fae21641d29b9c346a51678d372a1153198cf669e42a260be9a0c592a9237a85ffdf597bb00caa8003be993b095431eddfb78680bd7ed237c1e2b2bdddad62481e1b27e6ac6c2adb76999d1ca08a4e61ff6d8412d835e5bbb5087cb22a6b921e99c0a876df42e363142aa96b0cf8476d3a02a73bf252a49ff5204044168bbffa14f11c533718aa270216e7eca6d6f18c335ce7a22123cd1042ae94e045b918f6a9bbb3f380e48b29d8184344f774faf2fc69db5966b23425738ac3a1a667f45bf94052778d27ffbe208936993ff09af305e9190da05f395aa65b2fbd6df23a98b9846851c0eb96e259a6b349a48b901770fbb9ec14438e198c05d161d2673898879ef273057243a9ea320c37ca8c74e735e7fcab27ba2809dc6c767ac6febf363762a5223d7b3c32853a513da348945c3618d1bbffd3b28e8d87843015ed4ad8b456b5664b060078ec295d45555fec3cd799ffbe8fa9d8f5ab7b56d38e9056dbe113a3e2ea84ebbbb16d5ac21654aa36daf8696806d14b4b998e2ec2eb944274d83b645a3fe386c4ca307c3a00a1f8d6cfd6c33377ea0e02be9db7b11482a3090ccd491e33ac4293ec86b3302ecc0d6e9fe8a3b7513cc0e86d98712c3403d1a1514b89ac5c40e5a60131fd6dc6ae12ba0be6a5268051d117abcf1565c6996ca9d8cd1627e99f606a1435290b89356e884a3c62d4fff6f921aa904fe9f29bddfc51bcca1309758ca35177a534c0000000000000000dea8860500000000f858096e76a611797dfcad77d730ab1fd869a97a59c79ab4dead58574b75260d0580aaed8430fa1c960a0004cca1fd88ffb02e82f3d3c1afbae25c0ebcf77bb5832765096b7e4804769550df325059ff1e1b442488e79d37cb949585c4dc797f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c317ae26211915f253a55e80ab47ccf8163027775e6fb90eb38bdf7831bf02a59f41a909f96e08db4965631641cf90db8c255d779c53b00f19cad282f68bf363dd98da158c0d6e85de98f7aa285a2f78b5e423240515fca8ef383857005a040e46764999474df5e29cf6aba46fd61b7499123a5c47c0e66d6542c368a4ea28e703052d4191e5d3cfe84f17ac11b5ec9a4863b18c92eb65199265354bbd49b7bdb7032415723d5259f8f30fb1dc803d7c8afd5a9ce508dca1838e153f5611b8530a370b06ff2bb43c69094ce75782d400d29261f7e17b6c0377a459a3a523e886009c5f996d8f675514e74c34e9a46a3f4821a54bfba58df382ff2692e364d4d2f8d7860308501b8e8ab37a6f7393543e0da138d3a86bab09692ab295fe217f1a9731f316030257d341f79d4254e2e29fcaa703e6f1ddaaa969affb17048260f6d470b93c9f020de8ae068d5cc3c5ac203f8abaa8a6c95294c56c47c8dec5982381e6ffaa243d030cda823db1eaed9ab4be0ac5047a62c76b093dc0de6c0ba4f761f48955f76a6d02032e3f503030d3edc992afe758ae7d9d3979fcd8bdb9087c6e099992ea8fcb125854aa3dee29b5229c84833d50c851bf0001988d98f57e24f68902ea1dd283c4967c58ca7c7ab73dca2119904d7f830a60fa5ecce64bfe646e6d3d03c3ce403c4ae017e2bd4a875e6b71eb2039b2868157fc322b6f1d35646d18784097d50ccaa7396c25aaad6e35c187ba8263f241ee9a4e73e2c81f924713bbd53d3559f8ac61d59c64d3d0aca2790c2bb6cefe10d7d973c32d146a75335422cd960bb5f0b389e001611951c46742ad82025b7eade52d210a69283588d017198a552db711bbfbc3db91d3e9b584437bdfa35e9e916858bfb6b827669534d54a17b1ee0b0e56d3be09b8f9161fd9eb2f52e87155bf0a872d53f5316de6ace1a9e233839915a0f9a565e268123e5bad082278bc11dfd3e8cf028728f6ae2687b923f85ff5a4efdd507a6c712e4274d499455abc38b0a4864a64895deda556f7c04cd1e6315789f9cf057a64963b7981a3b2bc246e0a03a6f1a778204079eccdd3992bfca8249f2f346d02b0c65e00853db6656d1dc0fccdf229735416dde6a867b15191ebb04448db08bb7941b11093935ac9d00beb80123d176d7246fa1531f3121e6b3b0d241aa9246b6870f0f0f2b30466721a5682c4bab4ffeeff62320e8049a5a96ba454fe39adafa43f94fc5eefd4c1dba48228291ab0ef308d18b5ca1f063920d320b85e88a5e2e5dad661a641407a1032e8f473718966dafb139cc80a3007529d3e963b6de870f2bb73ed148b0203f5a978db6250817b42958452f2475520c892fe78ef3d526b0d9add112e9ee2cf07cd6bf381f6508b23c617fddf07b4b22c1e0c54b608a8d727c883137904cc3082385d5cfec9143a811b92f6af45ec072d41b7949b2aa6d8ea23f55c9f1d7999a895fd57e52a70c6e0a34827caed55b35d02fde04e208c5d069cfb77c0ab7db1811839b8a92d80b5647c9cf33c0cd544c4d6fa137f678e8ab811866442103d3fe5ee69fe79772ba7ab8a54f5010f9aa1e87202902dbc0e5ba8cb346e3796c7c7b4626775d48fb5859e799bb2c089ade9d3a1111836870aa93434f50f92553f3e4a958339b3ed1817274c2f628120ae69a1de814ccf16ba9ee5e8ac5921f13dd9e169ec6ddc9b913719219a2b6eb27b5c1345b9a9c5aa5a1c9c2bdedb4c38aa8159342f851a4935ecb1a80d3219f95ac7e7266ac1bc369bb1158f3f93eeb3f68f32a5d8c18ed4dfd13a6be65c2ec7d6ee2cf755b50fa27f492be680c7bcb68a4562ceb1b058b1cb4a725a88f69694891b5b3350576cf5b64ad12b31fece54a6ab861e4d67749aa0ad6b9b1b05f5318a65c3601f4cda1112af56a28c54376a065a3c6b2b7414dcf09a2ff7c633924e00db13a39aafc7d6b3a9d879ade03858c6937dc4ad1be73abc84f4183112596f75cd49eb0d9877508b29cd8dbbec0b6117c58b8ec25cec1f626ef1cba19e16437616cd49cf52cbf3e19f6ece19cdb32a79df062b30cf63176ec20f59f9a492cec79ac9ea7ef1083ff894bed336cafb37b9907559b30a015aa7c491c148c400f56e3971bb60c5302d3ee9694d60d886c2217f917ec11f95366df847135e62bae9f6466f2f500aa2824f3651acc0c6f68d2165f8becb0caba24dd0ba9e74bb47bb27e4e28689b407abd70bd49007b1c1914323258e710fde65f74a81ed7abbd3623d5268be2297cded78cf8dbb2a93d63697a69297a1c2c774e25465dc217917c61f18d401cc882a54fba7a11a1a0c376516c2f6ea447bf0c2d8006b1ca99dd28c4b0bdfbf8e943e70400620bba791f9c677d4d84447c54b0265a07a26523963ae03f1d9fc02ddb993264ef531b718eaefbc5ee99c9e579b02", "63656a53ac006a00", 1, 234825280, 0, "e764a010decb49cc8400e8616b23f253d556493d34d777f434e0ffc12daa4a47"], - ["c1ae255901701b6eac5525d4f4ed1acb6f56f2507f95b92fbe9209f777c9c05d12be11c03c0300000004ac655363dcb9d7fb039c8a8a04000000000025be78040000000007ac636a00525263e8b77a0500000000046500516579d42cca03000000000000000074428c0000000000ae1875e6d429506292e2899ac9d6213c943a6ec52db95966f20e3c07ca20b79d34fd6bc8cc1ae6d67a7af285a8fa7e6e1118c50dc68f52dd237c87f25659447a7b848560718ea59091fca7ad243dfa70a0846b16b9c07c2767ebdef4ee2a6fcc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000252051a01a336b980e5592be7d52064a74ac5e1e0a59e9b988379fd08748c9a9bd1fefc136f9a017a866c5db25d27ed29933b44c4a0e28d8bf05fc1ea87747e9a64b9c1b1d2626601f8cdf5c3ebb32053183a1e6bc24e4f28d8da91df06fa4bc728c23cdfd7b161396fb3edacb8aed42cd3e754d441a1459e3353af65a7395bf021c54e28351a6115d1d96fc7cc347edc469262a809600e00d0d319e4e702f11d4020a582b2d14248b362de6070a6bbd46334e7df78b601536749cf078750a00082c0a019ebcaed9ef813623d44bdabbd608dfd939dad3c3dcad0202033821a70fc085ddc3d9d26d56430b96d32d3bf1035821346d6998885aefff438ff881984621af0321bf08e12b5a32bf315739a31437cc81c9da305b869eeeb57bac1bd8ad90e576021440534c26c2047111baf93e4f45a3acbb45115828341f0416777d473c4c71b2030bd79a2dc0006872d5beae49ba3a6284d3f7da3522a3f34f305280bdc11d4761020efa1be22f4fbebd2f0ea9711fdcab8a7754ee261f501f748b3570785f5ea5380329d21c570c5c579b35c7a00b8a3ca10235b0a0f2a421ca3aa69b7f4837bdc6c89d7e77c1b8a029aa501cbaaf6fa6a65a55bea12adb43a8e2bf372848a910a2f57709a04c15d121cc1c0f20dd13fa34f8036968b17b70f3c532f19d7d5be0e6d7c88bb15e348d2fdd3a93254c52c3943db387f97cd1f97b92cc3aeb29cd925a4a8f240d3a2282bfaf1f43cd105092e44e1cdb626ac244bcc625c0bf72576f9bc007e62c69295b25684f3dfa17a23746c8f6cfcb4df467069793ca8e5a9d24cb5aa9df8466da9219de38a1a3a566c27047e9b8301c99bc36095c16bb2e3b78c38ad1e181583c8104d64cd5ab22858cb136fab5fea20d085668aeb3818980bd38546346aef3e830b7ed69deb71a26cdb77c5299c0f41e09bf1ccede62d197d60ffcd0c87fdae2661bc9f0b9e47e78ec8fdafa0e2b298c09d7cca526b977cca0fa316283926677df66590e59889776ae4008785afbac074167acf475b26aae89105d2b58bc72bd1c6744aa0a6218dfbd804d0f2ca42efdb16e01ad2137267d7254654c1381a23c7512cbd59b7346a0e361e232a9a4f864c3613e84dc15336f0159cfdcfba69cd010aa65598e7f32cb7a2a6470b3bad299f2f4cc71e7ab5b62cf463fdf5be35ce74a1292b7cd604636709803870fa7b8040a78213c4f94376a3e37b836a4c77fdae8e2e731aada7b9d93eebd35948b79f89671bdbf783670559dd4e0c716d12d498c0333ace81bee2fbe50578f67156701582a146fbe282843ad40f05ca53b0e3fa8c1bbbbfdb41fbaf2f8ae62d3b47fb57fabf82157527590a282c4be6d977e644533158c64ee915088a30a995ee3f53211f690f601fbc713e6f980b19fcc1bc743746d56b4a8d50318c197a479a11c9880ff8b28342f3e8af53e1b93818aebb012eb3cebeea25cd8b2054757b83dea08cf9deda46a10e070b15d31d97ee6c4b8af0388fb3cf879769b0f381e6668a1dcc838ef260f0d762d6387907d072e75dc029aa2942932f28676e0456a2760203968cd423240dababe138746f7fc88ea78850608cf63c0615f560c705537704df3fcdbfc781a252929cf394b30a3fecf5a956dd9c41dd3ec2e8e1df601c3c05fc107278ab5f6517e96fb6e570581738ea50767833e0cc3c474c6909821fcd9752458dea2d0f7ce22b3d1dc600179829a7b07d77fbee3923acfe14c837060e729defb016ffac5f8194c24852574c4e38688e065b2f153f482500658210b7a99dbd1fd8769ee3c6b7203f86b5fb8f999de41f4c89f09943e6b0843f73b6e5c140132c7c034fd6f5fc6b2eb19cf6c175734772caca96b8e59a058874177de904b0bc86aa60da4bd7b0fb1b8ec8762ba0ddd7459b1729c363dc033b0ad38a32e9e1b2bb17230b52c9987a5b0a61bf2c5fa93446a71e750297daaca0e1cf925fc37ab77b244552b6cebb8c4bf6e1eae2aeb0f41ee1ba4e24507b2aa78aa3f933d1f5a65a896be4f4a31122265784799962df07ad1f463c1426efcdd53074dcedb7eeb93b67dff2c76b38d69b502e465e9e4a6776ba1697ca06f6d4323606a41f3ff4342b49821b35ac3281f2c0a27858bab62a0276f732b09b2bffebbbe51791d6e124e95d9a430974f191a1a478b6af3089ec0b360e0e0aeba8d03f2c76531aa1eaf22060ee89091029da4eb2962f0155464afd07d406ab7cc5b7c3fa12c0254314f7155e626cd58d55534e8970f08920621d283fa2e49738ccc1710b793a7ba8940bf03000000000000000000000000e5fda64984e4f44fb63a2325e2918309a96d16b4c314a04665750b46efee61135cc885d317ce5d21e2886372599eb86adb93d6d17a31f5a2581d99ad85595ebdce34281a1a8e761ed84cdf44ce166cf16779d73524c5132a615597df16b024eb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008bd0461405dd11d4780505148ed640e0cf5d1c282e48eb16573c435e3563e978e1c0377c20b39d31993c49f25c240ce9f46573ed88c670010578e8042b5e5824dc0ca98c18e97c7983f11d351f2f868329603e3ddbb4acb90ef573e2677495028cb78ee877cbdba8e9d395550877a2c8efd5e2958028a6868c16fca2a7fd912a031d0a5ee0e2542774c93c37df2858bcae6eb8d5f289ce11052211076976d236d80219d03d06410a80ab70f22f4b7b143cc9d6c02a00addef16f2bf64b081336eae60b00675535f6fff41f3bf8ba7fb474c729e654419ca36137dede2d959a52fb9bc3bf3a1803d242c430813da4471531e99c5f618553ec30f815ff5cbedff9a1f9ad03138c8d19cea4e48effb4d15c25d180e5546e0953ddb95ed0fe297ce86c4b9755031707d24b09f5886117a341a738d1c933119d3d9d7458fd92d84bd889ee5b2d06021330e3411f5eb5c29f6277cc96de0b8adb734486484ea92be517e733d3be9ac002080d2d68d5f8ae7e1c98826f93d0fbe5d57b7340488d8e727485499bfda1ff1d020bf5969a94d7119f488651a895d6f437fc7a64dd42cd4619123651b884aca6f67aa14325b05f6d285c70bb9fd439c06301b938b0a0ef9531fb66cb194ad8ce182d3fd73e2e3896f0bc1ea266c0fc6154bd9ac0954c14036f955ddaf1470ee52cb773152638ef8ab1c622dbeda7e6134f4433763dcf80981c6bfa2cbb753cd1315f5bb5193acc5712456048943166e9786be9a677f550e010bb0a00417e4dcc666b53af4ca29aeb78803e3eba49c1afcb78dcd05c1aedb078c5b701866e954fd26987ed8cf5d5733b668de6e34841f519eb78224030755212e958d272e2ca22e454d4b23975ccf78b7a4b30253a306fc9ce935c849a96bb6366848c64cd3e1d4a136eda598b2391fb98ff5757c70b95a745dd425a0ad9037c373e95ecbd18af834946a487f57ec6900ea3aa333f47c2dc5215b9cae74fda97296f7520b3fd236c795c7e471fefac50d679c39cf03901b6c31b860eece427b3aaa79751646d905553ba876936c9068018598eea9b24c37e8e62d940aba01ca9166bd83f49969ac6458ea405728bd360a740c9f2f6d61de6d6006aef46ce0e9fba30e16de42c59339ccaeed2f67a3cb11d86ccb73f1c15e628666915ed7bb356ccd11886f061c207e87198065d46db46b3b70fcb03ec40aea84e403b352a8fcba1007e417d8881dfda1ba9f7e476d70997b813620ed8350cee9cb537c4cc8beaf38cd34e483cc7ddc2650f2fb40462ffbf7919f5fb679108f2408903f5b1cb996f03b4471e29b4b8dfc9232737bda791ddcaec57340732405c591627a89f559866c17ee85f050418b8b0d0cae8ae4f2f95902909f4a67382d7c06aa82c359043b108700c4462efdd13f56b89200cd34d20838984f4b08de0187ca2fead889d6a65986b47883548096ecdecb0b272ff5c6dbc05c402f996f4d5fe1e32fe2cfb4a6c63a6f324d96a855b7a53320773af22a6f3217d26daad66809746f7242b2944413107ae41045f925123b01febdadeb9f845a25ec1e5a1724b157e49b64b57cf01f96fb3a2d505b6a025357c082b333a9b7d88431331b1dffb41fc2be0c8413d94964ae4f9c58a8289020b4e2db6af8d2d8e9f1c571a931680b77e23eace02ca69594e014b3499fe14bd1b49792e64b31f088b2d9866d13d50c5e8238ec0e2b145772f5aeade7155020faf1394b80a6c73222a5f63c7b1f1d0a3e3f43684e2e4292aa5a26a6355bdac90ab5a1ae1b73e068885a0ec5563585dce5d7167ca057f4d561f67ba7073278e273fe883d34548f0517a5f6d63a0c730b1d1b9e708959fac6f1702a7589cc33c3c950191e1720f64c2bb47cf37f74eec4d6a3c6784eadef017fbbe00ac4120bbc5a8973578befa8137ba8ab3778a3ac04e678bf227100103d2d0f2f2150338ad602da1d5719f8de4142e1a3549dfde8c76cf0c44830a15efb7b07969209260c9852e8a1ea223f84d30c8a369bafa03ff814936b04247aaa7e07e397d44ae14eb2c376666240a14ffcdbd57d4902d49e906a6e806b9833cc855256c1fa2a7ab2e9e0204267102bfcd0cd963870cb2083eb47d1269c050eeb31563d13696374cde5a7be961ae8e98b4d37274be0c84e9ff0819866b687f6be9b0e56a423a5fc61460bb7fa21b025cf1ad10370c00a9688367dac01750ef9b5c70a15d858b7318796e92c10c3e1b5e19f68b1d89bd85f6f35a9514f934206532f04dd607909f75471d1ce8d60ef58ef3ab6eb935f7e96aff28000000000000000076ac270100000000270a621a71b12ce8a9a91ee6b1015c0edbc09a7315819ae9649882ef6dfb3fffcaaf2028f72d667c8187617f6b0105da16fda134caec9353e03a5be3d45cd0ea9cb681db9431c905e8534b1d5b0f8e6237afe3116f2ba266ff2b2f15344c5fc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000902d9061d7ba77e924eacbe451aabbd44e00e72911129bc7a25abcd627fd7a5509d2e43e5138a933ca370f8e486e1eefa572db08f078e43d7bcbc1ed7d738c857b5cb30d8b0bb74147e14721f47e0697102f36e073bf67fca4e28bf4ac21df959bf8f39218186eab122e7d31e0fa2db37676b6716e1ce442b74eca7ec94be0a803099502bc36d34fdbb89473bb9a8f44c374311cc110e89f3c57b86e361f5d7432020d25cc94a06fd1e86bf23d832c301c54168ce990f1a09ce2f8ea275d151550b50b02e10ae51f26af3a72d818a2dcc9877a14ed60b91a6d4945e0506e07d24cdf29d2db463eea7ea95089ec23e551141d909a00dd792b86bd26bdc170a5cc5698c3030241ae3cfcd5b82098919c0362cf5030b4979dcdc6366205e0e4cd583ef3ed8103151f194d84f8ee6385b9c340e35331267c6cab5bfefd736d28d1d3b755acc01d03070503bca918e7df4a00b5ec0519676260e1c469c9319cfd623aa19117a0b0a802287ae69c9e56914f0f1a9382170e7d7adf34f10e26b3cd1f166b4f3fef0793740212be3cbedae08df5a7160b6d703e3069b91af64de5dbd7dad00fa1610b44b6ff95fff756d68d842ffe723b5dc822547f9c7c8aa66e97879eaf8b226c20dec347a3c82f27b7b66b3d348814ab1cf9c09c23ec287ffa7fc2b671dbd1a0a08b27f6980ad3202b107f6073938d7bf980bbcea3207e2d6dbc3e5a76c8d60fe468831dae11093ec8a002895dda8ef4b8537d0cea868a0844dbc921ee4b025094ecc2cb1dd16c337fa51cbf510460b0daebba6e3b91b35ce4cabdbf69a6c13df6552a12fc0c115ce6f88f2285f1afe84912749a164926bef5c500b5cdd9167649fed13d107784a1fa34fc812b66d50c03d2b303d165e3ac9a2f5e4cabe5c496e8846f0b944a0d2309d121619dfd2f78b410cf49814693bdc2dabdd97ef1c746aa6401c3ca37ead3ee68568d1856977e4c63406636737f21d3bac675955652ee49091193e7d64b50b26177599a03c8e94aa6cc74c234bb19508a2be08194352ddf0b34195d0dcc3469ddfa1baa39d4275415cb6fd539225f35eb49e08e247f1e1ffc480411673d97f9cebdecf095ebb7066293f7ba6fc03a64daa4527463d0ccaaf32d2d7677a6ee6868f63a8365d5516537d5261ebd899ab43c89f5ae4ec1ae10bcaf0c3dc30807d6ff6723c81bd05a1fd3b0d355ff3f8d49b4ac562a93ab51114bf95714cb9134f7de752cc04827756536aca7d353f571cea7c158923f057d14471cc53ea5a53586d1c3fa39f307fb65098737f1e06c027af8a57b5ef1a8802400519fb91231c8466d46f05f6b39da5ca1c2c3d14dce42db231f9546560099f5338c50d5895449d737669e4613c3ec00eac8f2abd03571da97ba29fe32c6f6e0413ce645bccb9538901d42e32a8635239e943b0d6742900b5b03cf0cee28e59a035a60eb21a8e624eaf21bf259d7795bafece81c4a6abf6a617b9f721d2966875a45ac2cebee5fda6cb3d6196ee86c690cad3570cadc4a3b591dde4d79088f05fe20ff8b47f7d2c11bd0d7f02f0900b8834d68edd68d84936b9ddbbf8842b0fc8613abe18eda6002202397d0f00cfb621ac61d6b69f9f9a035aad2b9de41846d8a368a2790a994f416607e38f193b4028168bb8978cfebadd113e81f889b5a766d8c6d4ba9a3a11c8d2d0fdd8b27d8eb90996dcc11a7df97fd78dd2cc49d30f0d2806e6233179e5712d7435d0bb4cd087adad856545a78ff54a0ab81343437198f146ea10e8cb109f3106bb1801f60454510a01c3565b826df882e7edd683f9bae040c324e4514274591ec8ef03d244dafd12faeb9cbf214af516b2d9b8946df6253fed66945b8d9e187af8e78a1b2949bb00170dffd905268cbcbef522f655e6f97226815274ce507883907962a9af6382736610c41fd33ec13519dcee4110224c203492225a414e82f4957ef3d4e2b2bb0996e9a9a860fba93c5e9c43360446de99ecc8fb5b608b5007e70ee97525aa7073ea135041e293a1d194a7f987731f14f30cfde0f34a5d846be56da0ab47363180b0d5cca094280117c733c20608631023d55758e3acb2bdae9853fc3f69cb5e5bc7c927380e35ef89b1587d9dc4791fb0a8dd553e1803524f7a8c689529c0baefc9644dea2945c7f1c3ab069cb1e5a588d4b006795dfb9651f04fa75fc753be94de0c44b9fb44cd6769a934d79d6e223e3c07844beb7ab06403704836cb50f5101fbfc170f8b83611e6b9cf098395cbb5bd93ae89fbdd8e2ab99e02d48513b9edbe3aafc2d16e98a5f5b867d60dd04a9601c0c0a5808714b219d837cb57742b9b0718575ac1c13d719473ec88584b64a4029c2c2348b8a31558b2a4ed685fe72dabe7526220baf1b2ce05e255ffb74b9c3e6aa4ea3d116eb0da34d7c177ba13ecd0908", "635151515365ac51", 0, -1632530881, 0, "60c48790914c28fe6eac6e13113fb9556b50949945d234ae1b7f2f16170fd082"], - ["030000807082c403025ff87eaf69f6bee2b93a75bf3da106e6f96d7f845da210a5aa8c4e4c5c5fafe102000000035100510e2bc1b8227c95f961948fbd1f47e98933ceae4a10778e65120d6f1b9a3492857b77537c02000000016affffffff0237e183040000000003636a52065d64040000000008650053006300636a0000000000000000035f05ca010000000000000000000000003ed58891df503adaef2c1916b3b8404b35bbec32d92560468dec672cef26b9f9aee207ddac5f7a124dc58b8758e517e7cda820ffc249eca7a6f10394fd5def003e7321fd495521202bb843e85c73206a4da4288f2ab49b70d8d5bcada4ad210f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000958ffecc8621e793ee860ac023248d87653cb54712d0413c70b3f896778259b5f5f23d19c4b020fde8c94022cd455573c764bdc65448e8d28e9b545573291a385254521c5970d1f614c04c3804b301612899bdabfc66b96cec19e19f34d59a71431716bbe2825a49ede8350f83a252b6b926a9e58d28be62e92cbc204f4791ae031aaa820252352b4bf672e306ef53c283f1f6d32cc8f75b8763713ba5cd8e5b840310e1422a4b4cb28ddbfffdc010f16a750fc48ab6a17df124262e7839e2487ca50a02166b2b1e078b7478bed1997bae50483a7fd6f4cdcaa375d507faa79e92b235f65f91ee3a41c5fb2cd280468922997cbc62bce4c3668e425a4bb0e394a4d307032cb6833ca5a90e41dfdd4cc22c28fe6d77e850634ba80176d4659ef6464ef9f50316b2bfd977ee22a06fbdc7afec29d0b11892ddc6c72b0d59f158da497e4795a2030c98904850e29b7886952106453bd32a5209e659a1e4dedd5dfebc522c39877c020699f22610d16ef2aab795de588b716cf6ac30122338fac9749fd059fc8fde000300aa266a7e5fc9604276be903db94d4ec91e51b612d18b949eed898ae154abfb010b2c60361d916df243720fb0a779f6a61438cdcf33bd6a45df73668212e363394a498f5b23d101666d1c08643e20833688d2bfba1acb8410433d5df6acfc4a7dccd75e5325846f6bc0d03dcf8328901c0d3c231fb43d0b7efd7298b10e783baf00a67e8398c6915e5c44781eb450724c18a6346edc18702a7333b9db46835bf9c06f6e8edf4085bf70ca5d95bdf58784a2adf9a72d8cd619b2061759cbfaf63b67f15004c0d9072437177b47d60657bb4a86c7468a3fe1e57ab4f356bf2991eda200881735cfed57f95ba710909c09a962ebea8f2fbb3f1dc588a7b9742f0f82bb1aa0543bd1e796890635bcf7cc474063ab5b72c54a76d2e1616988ad4e2e66b6501b1b60266db245e0c7bd32f386e51cea962ca2f23b3188c358edef17af1702dc18a802ede81ac9db0c62b3fe6d64d8dcc8d0979ca2a081908679d241fbc5504fa3928a6e5f4cff9978e53cca76f11bfdb86b01816926e8f30b64f0a4599c70f661609162fb8573efcae238b373ad26fbd2a18e903a55eb595ea8e757e705c22f65990e38cb8608c36a583e31102ed5fea483719dc1e92137ec8f1927cf35ad210c063babc95c307a66fe6023133b88ccd533dd28a870b6c3a2660d16f6018c83fb1542fe652e8ab83ec88f4cafa6c66b0611de75b3be1bc4aeff0019e422c7140c708b9fbb7a92329c8eb48ea86abb8f682651758291d49c207222608780bf4544496cce884a31c3c26aed9bf551eca84486537969b2890ea5dc7b6655a18f55ba8c1e8be8d0263772485cae976040148cd3f1a89c14e0d3c8a2b703fbd17be173a46ff62d6d62f1f87a9d2748517b8d381fba94745380f12885883e9dddcbba343e55cf1535aa4051db37c9dfee2589799c15ea88704e48f5e5d0d57035d63fe7d8548eeaece9f059449a4979e41da9480e1e155ac833127900cbe47d1a861c478e99a1c932578d55fd439de774998e1450ee84c103c1f75681994e7951deb5776bbe4548e1aef8ab1079fdfbba7b2df1f2fd7e9cd64f33c59c873323dd701dd223fd2c68862b48899213b88b976af8a8c6385d4a00bd1b92f4fbb933b94559485b00e2d4145cc0c57c8e296220d33fed771ade3e217c4e1761ff954559d041829b37e9145a8793474cc4638e990fad396caaf10e00f8f0908d5c143eac61caa88e073f749c4742b68c4315f14e589e62aeea3ead3f2fc7a55e70c57871d9449d6f1175f134fa31b754d43aa439e27372f8301724833cf222551b9d9d13ae6355feb983f206ab7905ad60e950ba5131fbf77a8ae511471be13d67abc3f64fd37af5b895755149bbe8ba690b8ea58a9772f93f2fcbcc4f93d432010a90a0153c203e646de016de3003954df6ed10bc7630bc07235d1a3e7155d5bd5f5a1e1efe62619461a85b6b834dcae0d3451b7785a6851b357011323706140d5c49d9371447de8d92e29112aed909d01c94714294cff279a304adb1326a8cf9ddf5afb93b24244460bd0c57b79fb30582d5403761c2beacf4ac337b9cb0af88b110fe2949f55885c2f966eb8de1bc9919fe8d2676988d800e6946b3b37adfb31b0bb71f38c17b6c9271e156b50088d07403f75106900191d7487cc98a940d8339e027b7cd03b903757a494424d6b9cb0c6c0fbc4c39f18d4acedb2f176fe68c696bd6a7c8d3a0e4ed067fc6c86836088872182942bae903000000000000000000000000a8351b2d91fb64fd6314b165612d063a2e059e50847e0bb8415d8175478fec9d7d167a298d2d2a986467bbc9cf205826c77f5c4e6ae7ce94516a19833f9a7801c388966b6191d0c62a566b18bfe8be82de84f90fd92f8d106856c7a4a80cba8500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c8810be2f9a0ece76e4168d09238d6b56289c28e793ffc236b5ce0eea88f120f3cd2f5dd7cd47903b59aacd74dd4076a8a220acd829675e3d4d8e818d2e1609dfbf034e66eaef541c93bd1202b2c488a9b9e3b845bd8996c006e7034aa4c3c62e68720521de72e5ef49c4d38f61407d218adaa25d78f7cdad97498f6d0936f7b03038ba6efe4bd7ed3dbb9bbcbbcac6c4afefdf6da791b329512dce0a1350b5e0902090aa106033c1927a340a09d4f66ba86097d095e9d591d87e5d98ad4b9a768e80b0678745134293df1860acf6019b7c2e3d9944638d7f7fcbf036dfe84f55fa1d6f54a159e3eaef7c1ffdc0e0104de150d3c83002f065bb8c60eafacac202eda0b031b491041ec23f82a7e0f3e1d7c868912399bb368e3591e959ce5453fffabe6ba03133dbfd7abdbc03d8d056b07cb5b459c37f40346593c9ba9caec8a58c72c7eaa02052b4680cb3c2d6e59e5e7702eb32a69345de65d359698996936f2231380bbdd0317ef48d9c5eb778bf8cfcfaee48a8cb1c852d32a8ed9b875c04eb3b54a4b1670032aabe190d8678018652564dd7bef46f91973075180014867d993a0d635f8fe7b65a96c858cfc501940cb2d64d204af4f36e1fdb8a54f53c91afa524cb481a42068f27b7bc84e0320e655bd7dc9b9f18941d9148f1e22d01b05870bafb9eff3bea4576be20c3fd138217e42a894a11ece9c57c92bf2b355f18006cb082eb683ee6469921499897de1edcc09cda096a58a9edd3cb9292498044bdd33edf7aaf04d66ba63012af07beb20a4979c6263246bac2739be0c82c3152152df702d8238b3ead2b421d694b3b967ace45e8768959a49e591987ca6cda80df39f7f1f816a913623a0ef5d5363034474debaca6155f8ffab22c3c0f39debc4cb6367a427c22718859b2b89f5b31ad1040bdb4cf4d7cd59c6b2c12ad57e8ca8e111ba2e941b065efb72dbedd99a56e613e48f649e1443f76f78ba28125b58aca2ab4316dc503aaf52b2b5b5b362ecf8a990ca28090d76ff7c3085bb9b865f02a0874966f96acc2655800b016151b38987eece04d0613b7727bec0f500dd95f2c4e57dfc1b6ce98f9684b51476580541b82487151302cbdd92e95deb7fd6c608a7c942c3b1fc5e348f12f54eb0ac2cb2570e4dc9989d50ed9876b0eee195f82840a822b72b24d8cd94ec27aff10fde15dea7dc37a99e0c18726a37e277e28568ba0869fd43b846d99dd4926afc7630f8fcbb4be760ee6c67e6357839a616ee98f6c64878a28e5b27d893a936006cbe8e9faad3ed48b57c9c9b2a288a2f2a528d32fd20c978523ad2ffcf2d675795dd3a598314fa545f8526623af43a29f01d5ff876f87b86e6c0c059fbfc90924d0c94e68920e02d5ed0f3a8afa51946c61776a2304ad30d93f25968020d8270479e6e0e0c5ed66fb7d6b515ae5450a354ca1ef88ed4884ee74712163e84e8b85ecdd2f4e5cade2d0787b3876f00456d875a5c1d654a2c8e7cbdad20aab9ee5a219e33a22379a0cebb060c6f3ff338922e439238b460732e7d950b8ab196af8b00a2fc9ed3ce75b23437a3b7ff2af39b7b130f1a361d08045bf267927de5e454bca03235e464112d2bb86c2d60ebffb97549233b688093c203374124436b026bd069b5b3e912cd6c1b1436c02f100bb21d81df53c78dec42aaea7efab59ff4f627bad46a9b5ae1a72a816170d665704b18f8381d0528c54c4495cfede9d25bf80a817bb708db5ef3d4efc13930b2a1abc29af38dc8a3a4ac5cefd79919b536050a8724b1442e383c193a1fc0ddad48cd8c13c57d7f58168167fea551c9e35e2e4560328a4fdf226d48ad84ee5e7cc898e11e671fd8d1b17c408b342e92202778474bfb6697815d0faecea538744132db16c4d2ed17b448ebf1a58ea37095e06e9aae404fe1b9176e0861081c3d608bb6abc08146112e27aeaaccc73e6e297af71d9c25a39b8f9a27c24c6f82af27b84814caf363f8d7d910faf4fa096c7761156baed0c6720252524f499cb7b2cca8cacb7412a5ddfd3cb63f6e38640ef1bef7c636c8854bdf6e65efe7e63ee245bc0427df7521cca94069e1bdb949faf3260e455ac35bbe64439fd651a684947e7cbdb728f5c9ea9c0562eef29da82c6382663259695517f9cbbda19fedbdac73b661452bd951d22d8c20c31936c86d54d3ce673b3b750fa67e6e7835ecf6abc0b661191ce11e35ec021a6f7c747be5adb32257a30a8b5a3f007e6772bf47df5a06a880b8e83261c0177b9fd1819f5ce1f8b0ad5d1d8e7a455e95dccd6e52a90ad305000000000000000000000000cdd0cad4e458c66b561ce4bb428ee4991f00a3979f12660468fd96479f1d2aced348f777b62730eb15a6f0d83111adbff2984f855a83ce969a08a6cf51821d1400df91ad01c673d76ca2c3f87105d8f74cd935ee0097828743b32831f4cafa820000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050876fae12ff692c48033a6ea6c245840b7dabd90104d1aef27cc313528466e78fa46e6b175534b7bca68b98f29542eafbdbb7a4157c4c076cb75356b21211efd5f265848fa97cc6a9bd3a99bbc32accda4979cbd16c770ceaf6aa22a4cceadde9ac495fb55847009ea0e18517c0958214bfe3e6f6a97d8f29ca693bd1c687c302153b2fee75c7342bb170517fde4997d8dc0cb4bed36864996b26dbf67d62bff80209180e2b6abf32aa4109cd630e632dc3e0997c5c35932334d066e1a9cc6753e10b08b0e8355ca9c18a0fc7e3827407c95ef5b6753fe59cb3e6c0271271bfd5a62b4ccc0a5a608fac87f5d03d36ab62b9b57e17542bec7c3cd0531d36c94a7e41240214d8c93b1a12b7af8cd29465b4fdac13de4ea3bd47c022cc731650f2c4cb0110030fc1214cf1bccc952f81ba83c83236ea811e7f43e58847815124ed957aaf26b5030b1bad83df10ef987485f8906f3477d50e1e633b8a1fdb89d4aa5ec37f154fe20225be004e93ce35cfd399738535313178b654135e6b795db31484f0ba1bd9da1b02235eb6f5b8d6fb17ada2977155aea0c4d7a413442aac28ed93cb2e4705d12105014b95e41ecfefd1104796b59a4783d1ca842151c694665132ba48daef5679951edeb9f99a59ace77c017e685c4020188a1740a148e4cd03e453d842ec72d06ecf5828bfca91b47a05674c4a4704a144fb35dc3545e29073d5ecf3985467449c2b731e150072a8311c8b923ae8ae7a764e0b066137ee4bd7aa348de8b2765ee9a79c1e7c1975d930118c42318b43b3b36d39691a2592f4bb323c23c58b9baf118629bb84de517ca671a2a7aeb5b6b95d3c464eb454fe4a6a720b07f61d931d515e4baef67189eb7d7154aeb690cdedb85cc754b6d04adb7a62c1f637e23fdad77baaf680f8ddf3fe2c6a2dbefe14cb5183c0ca45d7603df745c3968e9635786ec2982631127823e7036f96e490b8a31847f33c3067899f0523436c65f8d5504a3c40913b04ed4800508a839fd6caa06f619d5f42932981468d684b88b91b003b09cac4d9e5db4c59c4c4c8492eb49f7073181ebd560e51e31b88d4d113a75b1a5c652e95ddfa4a6088bef9beb055cd8033e2729aac17f328f6602911d3f9358f305514fa8bbc9ebbd81fa3a6b073983efd4e74ac34050dddca5919cec055e9b8c2ac7d3a4f9865b2eb17f829defc5ed3cc65fb5d86afdc3a1b8ff25492f34783784752c815fbc4c0033f834118e5bf8785eaa8720250f95ae8c2930fc4e3a46a588484bc4d015e720b17e4dd397382e0e563cdf56c3b37e418ff17a289158551b3e5d20730f7d07588a231b80954f36a146c52bb16390b93ee55af62eae5316f680319874b44c36d3d700660763e0095a51592a1c1f9361a71f50da64d05fda9a4a5dc103bfe2bb044b7a9e0c63350531d62a8f46fea0a07b0026b07a77a35575b8fca383022ffaf8c77225cc579e374eddb3434ad88bff936a8f5f8df6c3ed6d478b08317b90a51cc44e81bc9a74cf441e3578ba6c1a81a0740ac7eff253782d25bccbf5fd3a1f18c1a8a98993d94eaa735ecacb3f48391853f2e003d72175b4c594671e52365eb88a52e7c283fd33675939875ca970d9df4620401a30694d923ae34c9af047e7c1e609a3934b1dd48984b1fefd138e6cbd8de125f02a87249c06bb2ec9d55b69c695543f405740488a03fbe4d5fce2266dcac8cba879d608a6910d23caafc0c82fc0c3c296c90149e5d2d82b1ee431c5ef070ac9201e92458b844a432d2d7f03353352bfd82f8e23809478bc03d7e0b4edc10115ee90064091501603620bd6cce25305db94bea5c869da2a0303040830ef8a64ac3430a928e06f062f6a8ee928837349cd4c40e049f146f75c314a5095485c21fcbce78bea5bdb21623dc7fa48bade511a1a9a1f102eeb1cedc2c8e589a2a5d9ae56194362ae9b53a30366c5a0b6af99a5bb81a0c988da66cef7a09da08047073a0661c2da4007919e0cc484cd333d0ac2cdbef70cfde10ec6c791342cdb50fc7021c906d358a6358e530995b7fc262a18637f9a8d2b40ae86aa745aee045f9e184d8e7e7d2e1ebe08c4db13a033451bb28027e59a0fae8d5ed66b92eb69ce8e48ecb15af261388d9566e7747357c866a46b92c752e234a9525251e11b945a8e2daca4642515812582fe57ab1167a68ae26c28650638ba420f69ebacd443b605bd2eeb804c5d9cf86b2d0c022879536f9d2b7246ca43b2b1e740bc63de66e00a8795d2cc85e12afa7129a3fe36544894fd42b326d93bc96300a2a4c175e48a1baf5fa97a7ae50939a4ea74aff1b4cfece126fc9a14d4f5dfed3f72de35d26ff03fd33f450695b998da66dee95d615b45d00939444b7e043a336c22e39ea2e5ab4f1c410421820ed3c07da547d38d6f142b3867725b7670d", "655252ac6352", 1, -1454997918, 1537743641, "3c64dd3c0242d63569ae869a64643419230e819e47a09e7788735988f8bb6491"], - ["030000807082c40304346d8f3b49ac630b1655ad3f1f974da1318baca5d7e24b1f041f2affb74f66cd020000000365515174562dfe0d1ac8cc8b4d3c4a0cb6147b5672f57381160d51512c8ce2b676247b2fd3694a0200000001acffffffff84e2243afdcf93771d7eb98acad917a66c204bbab9bc303a874423f4255db89d01000000096a6500516565535251ffffffffedbd40fe1ecb42d13ae9d2830605b523cfcf0ae7b9efa2e57e2804f1a2291e370000000006ac51ac63535338e7e0020213baef0000000000056a53655365effefd020000000000ed76e806c15aed77010000000000000000bc91d305000000000a0a01286f14dffe54c1710793b2811e8efe40d6e85e1f832b413d5619effc14ae90ab8a2e76cb5d41597259888af2a223ffb16ad9b9f2413162a04b6674045319bda121b7165e466475a3d373ff4247a4a7f25363f7705a81846299511d56190000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000037d36dfbd0a8f1dce68251b2510b74700b3c4f74f29bd465dc3707b8be6cfcc0e270ac4e355a65ecdf6e3b772c9610b49902330f54f20d739145c730e2ea5f679e191be46a6c3ad7a2b175ae1c88ea0e77d2f385780282360f12a5efc005beddcb3164ec6210655404e5207710f7a10b717dfab910bfdb5e8c00bd0d80bcb7710328238fc4b7c1ba9e5a79e562857de5cd43e42965a89237b0e4dabb3f2b1a4bde02151ea69d55845c58c9f4624604c98ed65abd73b415cb74026f915bf17abe02690b06e69e16aeded0754d790f65957fed321b106df4dab3cc7f947fb6c7e11e6ae77062c853eb2cce28cfac3240032eb27bcf0d0536951c3c18c1b50e5d93b07fab0227985dac9eec718ba87823072e3027f74d059fea66d2b98823a08adab1ea5cdc0222675a1bc62572539322de9f97a58b2a816a920b13a903dab24e28429077b5710218d4e3b10ed07e0df089911488ddfa4f412527f856bdfd6d7ae69d1500b15f81032310d1f9e7fabee524c63a872c47a83260a397efe43b52bc6639936628f3c1c0022bb9b456ba114753b6d098ed6bac67c6db5b5c4847a5f9e8fc56316bda5f912e3a87168a89060dec891ffc198797e7daadc81737b5c2df2e24dfd869b5fc3c1500347cc9c0b0f42e84119271bdf704be9fd5deaa02f68378fc45ba05d326000ad44374f895358c1490680051be88c23cee6007b99bc7203a6baa0c19bc3adc859b0cfcccaa54fb1349c5e20bd99695661c11536703dde011e2964b467accee956889e5248303aa1354d103a9fad05dbbddadb19445a7be7fd6487da119d3e854dc5a32822b6120b39b846b381dcbe9fa83d508b01696da9ce1746f318ab5dbf3e6db563369ae0e750b90b65ca27c503bd250274483d289a5aef1caffea97961119a91e9cc7b1b59e264f9f68b7e6bc11514bee15df72de5aea532f301411151a298e76f39246aa88c7a17ed412ee0739c5fdd04b5c360cf96bfe1b5b3ef6804301e15d636cfa2376f4bd4af27d5b90bdddd3a33e34b605b754e9e2ff6f5a07f9736b2d78d5a3e5995b608a64fd59d19a6221f878216b679a247a38f88c9ada81203447db0a243f8b7dc89f8b0743087fefe5daf870d81c72bd92b942469ad3dcdf7efd0ed3c90875e83cb7fc3742b110d310e0badfe2b40dded9d2829bcb7ac2e8f5c33e876ab529cce9bd5c84077aa67841d5c3d3621a27c93cdbc2b9636cb2e52f68424f47d66c61cc6b6dd5ef9bd380cfde0db7c9d890fac4d2fbb12eb11b5452c98757605216c330293bcd1106d905f99d5d5afc9cbed0dbb67fcec37162fbc82441ba3f0f53ab6f886eeb63bf6e681235ae542f1bd4148ac599012fc1adc47888e5ca33f197fb2b30b83d2aca6b139691ae9f52285c19924c8938cceaf78a72aec8d83b3c2408e59e782f7e8b2d732ba04e8434ef203b66fb877b9aca7909355d9202e3fa054a173a0be7927d93ffd2c99d6c551b01d0fae56ec9990352d3c211f5188fe8480784cb8822329690f419d94b59d672a358bd9888069060ff2dcc4c0ffe9d8dd6690e944a857395c866cb2592054bb025fc3f0b248ced3bf3d0ce1d292e7b944a157f32bc591301c7e990d3769d6379f938427e3200a39fc14e9e150acfb3d20e2c971b37e4e3f7192a6586aa841615600771c5bd01d389b23c1d7cbc4991818aa0c21e393318636188a2bede26a2f897656c5041a4e0bc9e46897ec7d62e7a9e6c754f4c39bcffd34600bc8d9942e79bece8eb2aeb0b4a5e98ca4a2a16f6b290a52a50af3c4442a80b44bc3d0135bae035c9f1b16977fedc1cf318672c5cbac2e1fa914a8bce26faf264ba6acff5de0ea8242ac260fdee8b603839e1ff79418ae92c5495abcd95312105b1ac614eaae00a3ffc99d2281453ffece2be97421124e7b3602eb1b92a0752823dd2eb2556f1b865d9a643296d8214a2bc4216275a7edda63a8858d19b1f6b1386f133411ff72f050d91cb810aa386fe8d2991596d6f97323c5d364de57b9629dee04df32bb55d2ceba1b0e54ed5340a69497487b484a04490b9264702a9d6d5add459e9f8879dc124616ab886378a51149275d23e5692e20f945fbea0862c558973dab75a7a192313de1d5fe91249216e915831778cbcb5282a29440f88a58737d5813736ef47bf4aa183a676ce95efd0646175f3a1a095b6a84ffcdc73e7e10724c46fc577da3677bdd9d78e07ba6d0e7ce09d3547ba32f54fe72cb3a25bdb6c5e56c601a08f1f7a5360a787c6acaaab620bc9e94cc789470f6a79dca05279147cc8dcb1466e4f57b5363bf1cb0e34d1f621157df97dbdb603ccc2abcf72a85c85adfb5e01b69b2f4e6ae5d6969c4ed049436852c6d5713e2de5b0dcd1fedb02e53ee1ec515e4917137b1f6dabe481fa13837f6f4d317c10d3633de2d2650f", "6aac6565", 1, 742316422, 0, "2e9824721e3efae939ebdb3b063ff2f23159465afd74315122dac4f9acb7830a"], - ["030000807082c40303e2ebe32d4c515e5bd1a1210c685f0bbb82b7b3b8137a6ae26db50b3fc7fd5cc3030000000165ffffffff879299f9684e11546b13542eee6ca1e181e4d3178097fc7dcd89a91f5160d70b0100000003526353183ab2cae4fbae5fef724b9afe07535fcf94faadc097c45dc87fc682bf18903e3ce70dc101000000086a00ac636a6a516a3b9c2f1d0389f07c000000000000dbc09e04000000000152224a530400000000046553656aad4ffbcb8108a6f2020000000000000000ddedcc0500000000cec60b822e21e7b18864f44e9a56a2b4207b41104f79e804fa63849e7f4f109667cba618715c8a3a5a156880605c5fb1fc49019de82a5152a22920755ba23920e4ee4a91d2a65da5e756de686b984023e977d16674c420bf3955fe1bc4bfc2860000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042ccd56cad48cc1840185b7bf8a435ff849192fb23756b2bab8a5358e75506f28dc501ccdbb89ba178b2b3132c187638ccc50d465746483932c74170fdaa6ba300ff264bb90f33df368269302044a1d7f730f04870556622a431714bb83d06ad4cbdad0f9150bfd3d9a674c67f0abd73b64054abb231f23d4491ea196c28e75f020a422dc273fd0732f760dda66b64f4808021ea3921d016734eeb183baa1c903f031a275f059424df1bbf1155b6ea72fa6802af005d29ee57f637c3cdba11fccade0b07e5038eea81ce5ad901f5b740ba173d8822dc9bd8209d9a7b2eb9b2dd6d1c61bcb7c45dd1f273735ac32e5f5f0bd7902aef8a466762f7a8979f5a99f4e6ce12032cb0d72563724bbab271076c56a782915671410139feebe70592645d8614e6b80324964d82414dda3eed00a9e795bb620c081996f59c53aac3ae41ea65bbc7c91b0208b12cae47f50a33d9921156668dc28bc401e8dd180f4d742aaa0bd3419daabe0314f9ccacb65415411b81f4d8d7ecca8ad4100d97df54f95f198a1e2e91e83cc7020783d0572b6ad3d6b652e76761e056f65fbca23c5800ccc5f44ab286e6e40a5f419b73ce527940207f833b39dca58ee9401f4bd8cfb8ddc6be482f3cf24ae4db71d7e354c6dbee23e45e86318d549a41944847226ebf9b177a9863164b655a807704cc89ea2c3549365994f9225514bbc363328e0cd9af3ed54dbb5e5cb22fd93c14e681e0a3b593a315fb30f09050c7b0b4414f67514e8d2367f4b32f326dcaf58602e61ee6884f1b84678977d0b8147a8eca5efacac51617a0123c5e43257396d8b63932db740fb2b3933ee630b580aa9437f44b9a0c436c25fa607a1c050cd8dec239ebec0e42551bc08468fb7f2ecfd80eea3eadc4fc942ca8ed2ef1f1728526fbdf7867af88088929f4027d1f305923143a14f57eda1fd7f25d991662a76abbc98ab70f1c0d80c4f49572270630108c91bcdbb4ce2a6e18bb82ab99e95da08e37c9572bce640c6ad294bdc16ab179862929f63450dbffc629181651dcfd6f895dfbb43a00f8160a93c7f80e0d648d5ad4dc217f8622c5aec66aa2876a274be4e59595e3e80a5993e15b24065aa6b163b0b3b69bb26bb09fba50731b59f6fdb120c2a7a8fcade14ae8e055bdb980f40f503821f841ecdccde543edaea8c5004d2fe3b1b5a7d847d8b0e0804a1c7edf38e1a504c69333f71d12391bc68c793fba3bb7414df5f9e878dcde6f5b647a2cd5706957448d4c4f640c51462fd927b075cbad0e46d8288d6b16d945b604784c1c50603c078494753067ca7b587a330fbe81ebcc07bfbfa4c7b62737f7ea2dbf0de06f4c133f21de705ea45d1d2d2c95b213a709e2a92eb5447424c4cd252b1e75e6a7e1b599b1b72924ad3609f0cf6fd5bf309461174bbac71cd09fe31a25a19f1c8d3660d709165a934cb5113f0af7e6b953c06c14217c395079e59f2bab2f34576abdae731900903a26217422d5d6d2988afbf97c0eab1fc621eeb6b3e010704661efc3a02e4084cfe54db1181147509f000e7d2dce084fd098fb73dc8534f27b277471ec468a4112ba8a44b617a4e755e60cc0836391af8c211efbbfb00ea7f6d9232627ef8e3fbc3e376bbcf980816e73c03c600824ab8fa8e7e6f726d870f20b781a17cd9135e270c1f515674e97b2583ffaec18f6a4a65a9b51364344843b94a8f62a6825dcf8f1636a6b71f6d07363f837f5d23caa327f92c0e8ac0094b90ae9c7fa2b30953ac1fb3dc095feb03fa58594e330a37d8a4f144953fea281e1c623e5df5f9aba0a6ddbcadfa6a813da8771fdf1869da856f7adfbfb40bbdfbd06e9a6dad84965864eaf5f0507626a02e96c368623dc9c05ce0ac22cebad6c7b1152bc7e2aff2376b9993a79a602c6e1f772d2a76bc709d99e56800a7d3b60a8f3139b0358476ab9a30adf27488e9d1ac927018932b7c8afdad9f95704b6a1a7cbe11b1e16b4e4b46ba161c923b173fea8c2b53d24ebaba921f904f08b75a3ccd3e44af661aaa34c42bbe0deb9bc0d929280c36f8910c2953aa404890e39b5f3a59ab55fe5e9eeaf15f55234761f7d66d63a88baea57bf49a128c09c6e72663acafdfb57b20b04618890f147899c610b113ff052433f7eda06afce64e21a59bbf2439e67105cd5d98a0bb38b6d7f3ea7acecab26c72c8f17c87d8c6dccfa399eb633f4f7df2696b5b144d8bf92b116af79c14c20e580304a276afedbcbf425d877302b78e49cbe2b3a6594439067df4f1fd5139cfb5926b43169a79cd5ff021300e300000000000000000000000000b98b618e7c676dbed0781bd2de6456f579b25e136f17d31dd752949ecd1f15f75213f8f5d81eeae344c61530341fa95ce563881da669abe10fa14c9ddd5351ae7cdf6f76eb99b802c46ea99051ee21fb7a59b0dc844be60162a60b9595545e530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050c0515a7eb2dc972eb5bd6b1151336117a81122e1baae8e9a6a292c22b7883bbb497168eea7a6439cca078cad92b5eb968e7f9f356c6293660c666c45c2a099b5dea5617f2e119e423a926d0fc7e86073d1251927426b4f0a6656adcbb20d83a77f82d32cf41c33d385097274b335f46a4b961a2f06edf0f4fc150d9980ae24031abb9c70f3acdf23d93f81460712dcdc25ed33d36210bb83ed4092a609184e3e03197c41a477db29a5d18e16a3abc205b325e2090b81b3dc50909da4d7f9f3b3cc0a053c10ed523c402d8d0d3705608d1a8bf91a14aa9302178a32b65d38ad87fcf0e30df0f8215904d93dc481db6120a2a2b65f02e6916e8953ce4fc333cf9fd6f2030f764887f0cb64266b232d9c3314f5dd358a24ad59dd35568021f3f9d668a67e0318107992bc577023db794bb65f04cdeb67b07a6a53e4c7a0bd58cd525b668832032877d7765ec35e5d595a8d6c259de76f37545a4c4af8aec8fc03889bad71fc7102146fe6aac595f4e7d249d61fb10473105db029cc75c7fce9c8efc9e4518bde9c0218d2866f6166c883cdfc9eaefa1738e1579f536793f74b68762121abc5c20e2e73a4b5fa5239e9729fabfd806c10b755a049017517bf9abf210b6c27980a7bdb146be32d7b50704108b9c01ee1df0400ae2812bd5894c360850b1d9efe24e10fd35b16d83373b7a6c281c5f03c163301a60186cda2fe4316dfad782cb9e45ac30ad1fbffe7a2a960d13abf84804756f29906b41d9bb4f6aee555f27a9e7d966b132393ae7b7ab4bcb335c1ef353f3e772c6998811e0bb6dd82951a075fa92b1bf4aadd10070adb6eb3114ffbf3c2afe9b8dc2175a98e464ea47ef1e2723c0fd7526a1abf9f8a3c39a3b70dd76076d97b681e972f8c209c12ee49b3c0b128516ecc327a5650925a31351fdf4ac22c52d524a3a7f23ce5df02cc6d74f1f2105510c5ecd76f7ad4be0d1244092943a487e66dba89df6ef8a4a2ba065db75def2b52adb919c4eac1679d8451977fc1336eabd3cdc18497101fce6b9258dbfe673d48ebde051217a9d94f10e7e6bd6ea4ff38560ca0a8e8b884e9925bbcacc45ac8d73b38b1c83595eebeb0c5a20298ac7e31f8ad0746fa05f71168ef07e16252b2930ae0d05ff069af4ce9679bf0c28846c17832378a8a959f0d07ce802c7ddee18b799638769c2ce5f59baa385d1f2d11afbdf7cf12878b1a84a2485a4374a36b7ae71ece8d6ba635371d40e946d2aa356b8a08d82186b11a64a2ad4d34689d27f745fbcf8824c1482fd77712240b9ab544f4100df496315db0618f869efcc68a35627f538bdb3159183b2a4c11e8bcdd6fdaba18e9edcaf307a90dcbe577b708e2553d3e40ea2f27a2544ee5eebb7c65a3d30f27e7c578db24effbba1964d86f7628542087eeae42be7bfb29fbd9710046fe7135f53971613d481e81e7eec694cbdc464d0b0bcaa31253d0d986eaf2015b4b65180ee2f71ce9deebc67ac903f9955eb0d30f75ca94203082eec579d4b4a022e37e1a61f175d19f76a5a0b966d91b48e2c2e63e397e161cc3ddb72101ef4eea0d7f20cc2e2199478a4af84d8b97f54b943a0930a69ee91286738901851ccddc64e372357196d0e96f41d5320234fb9bca8c9a6070cee63032381cbc11ab1374dc7174f28f1de88fe473a9b5f8a9de8ef4cfed340a2353f4bac96d591ba29f1516ba26b3a59e1b09a9434e0ca4ca0e3260baddb29db4f22e15bf6a5ba6f3d2085cc3281de9199dfbdfc2eac17680c4ff313bf6cb3dc9b765c5aae754351032f59887422bab82424579e0b7595d7f41b34e855fa1e95af2b3929d3cce3fae7e4dd46e816d327a00277b5497126ba60db38ea2657c067bf166c7f4bc5b2a920d1917f5b6fb3f2b89fa2ce69ce579f47b082783b62e3c9b136391d1c3e93e73b466e6581dca90dec3f3ec60d12752727b2c09a9277ca0f2c58326c504500b206d8c3227750388f3991b79550141a2e7aa156b12a25d49aeeec14219ed5f2b4a56e12b73b694fb992afa84f38c11d05214e4338fd1c690f2e10efc2bfd69216210fa3d0effe623a953ac9fcff9c38ae31015826c4cec3126282a76e2d89c65762888950c85dd8325a04db53eec5e8ea11dcde0415afa562a7cc8344ad8540af0e29f64289722fe49da1c00a6b05dc3263c4649807352ce2e8f9d9e4a4e022740a9a5086f7b0691e7438542047eb732ab18f6144d0204d30519c36c2a63fc27225ef019664df34090e761880ffab2e386950b04fc8ce67ebfd15a5d64dcff91abd231034a2e471ef9c98790e6d58d900d8e060622af34229ec95da73352dd341f56e9ffc99cec837b96f24850e241cd97167c3e2a5871a6d1663f3bec08a651b35e52f07f4942e4e0dc47a74fc21f6b95e8f1e6028682c46aa72ac117947bfbaa3adf02", "636363515251", 1, 1648455359, 1537743641, "cd0d2d8a63290b5e52ce5f069005e534e89f982cb515a1cf7dfdc57165e5d0da"], - ["2997702401770ad17f2a1a672f61c94b2a156b733f3e006c38aef6ae854f0d78e299aef475030000000152ffffffff02dc90d40200000000045251ac65d7ec73040000000006636552636565548736a103a7f51c000000000000000000000000003cda3116fdbfab2292cb8bc3bbdc27cdb5b362ca857deff4df83c496c75d3df4b1dd9de8019b2c7ff855c666b197ce73b4ea9e4bf40a5410b37809550d63659b44359a7943584a01b5786faeab67bc09f5afbb96edd05cecb8ecb22a02c40bfe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0bf722875a9c59be676598ed05df10aaee42a71dc777b8423935baab51db0f03410ead9248bb98627d12955ce890a1cb24fee9bcff0a167cd27eec534ef197abbc107a54cfb16a7ce90fac84eecea67737b4efde191e11b6647544154c64f1c0b6789c08258f83f139e4b5019232ed4b945251c696d3734f6ad20212e243d4f0200fbe809117991f379f6f350567ed608e4e887d5bbe090d605aa16f8c2669f3e022d3affa8e6c556f63d70576207b7a56792f6b8c84beccae14876da30a8a0ce2d0a029658e8bf779e681e91f763a4fcfc9b1f63ab368b580d03508eb17694f63f17e5968f85e351ef0951aa0759f6b5d56798cc9b0142f6bbc7806ad3fe2dcddd0a02177c7ab2cb02b3a57d3a8ab4dfa36041ca9e4b7d0bddd19cfc604f94a63a5953020543fcee59edc3443d8ab8c95df9275f364d33ef8718108b86eee40dd28d8a83031e241cb3cbd3d01b43655e2ad54cc6a52fff98808a9140d62dbe60a04b45737b022381fc041574ae3c69859929b78d2852a73a151691354c3e4077d17f1384643e03227d3a9d96b51918bfca6154e3fa48aefb5cf0f868c7152e8d2da8059ed92e7d3be11eaad7b34bed199e2500d16009ef3e6865bc558aaf67aa35eabd13770ace849d393df8461ddaa3be3885009a51168d02f00f36d784777631a843a8ba6bd928c877985703d0a1f7e0953a6fb312fdb3015bfd5f2c0bfcf009ef31674c23e58922c084d09dad2e843482a4fbcb20395718a5a276d33f26f59566cc0d9fe1e572fc03a17acc5a42a6cdc95c7f1bb324ba45bbba8e21a719bc350a0a1caa2821271d4cfb8b56c918da56dd873e54af5673004412ce8e09e835c203fe9d056e745ea3a8d793f883b0ec7cdeea0a771c9e92e8c1b04d80fa20133095469118275b7a4872d3b765ae59f1b566161312a27bdadd1deb8baa66610cf85f6e7d14349e3b55c63a6824977f4910477c23dcbf6f89a96cb6472fab89485f69e8017245a85ecea3ad1073adbcba0e616f5ffcbde2652736519b248cc9fdb5ed2aec3663fd860e040a30eae0f6afaa5a43db8a45b4d9fd4e70fc1bb1735fb0b8ce3df569645e0156c86559d27f6225f0059facd9349915f1d4352c1437245c8aa76170245668cb59e8cef76a85f87eff81c19a7cb2c004d9546204e007f0de7fefdd2af698e2aec2d0d9e5ac8e026c119b44c2c250493d77ec930b1b5e2422ecd71e98002574c0cd7e7a000ce239888aefca33cf74134e8f9f822c28b1cfbf4fe2db6b1b95d8c9b6cc0bc1ba066c8748f08cf972e6bc44e6906d335c29b1eb81daf35710334a3c5fd08465dedf326e8d368ea83edbe70178cec7b46f645c679a24334bd388770282fb14d7eb4a38a70bd4ed1b238401ce8a4034567489441f860508cb6855ade649a63bfe4eb4fa3568f2fb5a7d2e5e0e53dc46c901cd5708e4e975a860fa04e95c4c3bab2c973fc0cd340ba2382e0f81e0d2b9643d836f3dc30504acb04296d5277da0adb27f8e0c22534b3ed409e4a7afe13a21ae2ea558de96cde89b0242b9c7b05815d4ea556fd6495155f4c05d18c9b0d7da7074ca7464f0d9c35e9b1bf90009f4210501c4c21a28a16a04d619248fe7d8ce905e65520e08035f24e44b66d0b2792af239416e3b0ee0e2ecad0ec4d8cf3473ddeb9975a861260ba92312bb9590ef767f7f7b260dddf2be4ec8a1737def21994d348adb039822dd2fe47e081722d4dc4e19118c9a91bc16e2996c67e94bf44265f2175e40dc614c8440390daabe0af622dd0927f9d4a55a6c668b4ec3adfe3de34f69d9a05a65315b6ca2a789bdfab28caa4f2d44ca2450c25d57fc4623cda6500adcfe52d4ba9cd9d96ed0633c85b5b0afa84a00bd75fde0874a80b6f4271481fb26a78f0b642328dca3c5f6ca612c89a8e82ac2796047777e1fcc02a2a2997bf430dfdba94603cc33b3772132ceb26cc4290a156257883488cd230de902610f79c7aad8ec6a7a60bee0f92c8c13437e216efc8136c0124d91a4d55db1eb995796ee3f2ca884aa287871ce350b3a22d6cf29b2e9c3c4b824615e7c20767845c1b1b85f617001e2635f438e95dcf6b6376c06d59db3ef03494935df411a3519b7977c608a48f52720878dda2df58156653ae0d61fc1ac154b8602213efcc21d5bbb6af5b28487537e662da754fed1b56032011431e4e9a477c500cb8a4253339d5c06b56c368d52c90961870edf368488f1b4da4b28512f528f38ddfaf36823e7ec4f6ea2640f773c32e612ebcf84479b1ce458c5603a57d380a2748dcc6201000000000000000000000000c49984e5c2b7b39fe65acddc9375eb2f4ee37e46f768974420270c2d4b85d1f7344d53f9e5b1213ece4663073048bfe05570d0edb54623dc7f6aa2cc1e101e60ed22b6ee863bfc4bc6693f23c778632269eadb2e1eac09f8b777390067b1676b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000418e1eff9c5e0a4d48439b4da9c165a1d90d915cc2bece5e31021ac261ef8d4e15763846be1236a0b4b0e2671684d2c33fa476d26252da87ffe2fc9f316933cf8a699e00670c11160868543ad8a5a3b6add1321c4ad83004c4ddd0b15f43370ffe1248df7d5b7bed154a7ef6f619bd55ad9ac0643453b023254f6d1a3f0423ab021a5ca51218ca9cb5958a781701be85c70a150cb78fba7657de3e41106e01952402182bee3ec695c0fb5d63e7f7f8c1dbd6126607722948717642f620f4b3fbbbd30b05ac9409eb3d0e3867998a774fd2dfd5f0943b18a6691611452e711d2b4774c3419d025061c0d8784445a3af4c275640b253b0d3591d5598c5d27580eaa5cf9b0327b7cf69665bdb2abbf1048251cafe47a5dd8a79b870dd0dfa437ea7a44304ca022432e9c13f29b28b88a6c312402ea18ac7fff820d6302e1cd771757a84ceeda1022517e5b2f711aef2bf626ef36f24a7fd0539ea6adf616286b1d7f6dd48830360022724252dc4f1530bfc45ef3d5e51ba32dc9e50ff6164d2c99fdfe55d86b1dffb02227f13911cc52428bb2290516645c0eb828b94998b0986d8140c32bb45e35359e07241f890b387db4f5974d6ca14abd9101ea80401b762a0f8e3351403354e5087f58b23a500b7e1636a6b58a239bc92f74c28a2d9190f6a3153c90b3c0d181818d818e0a207d5c21977750733629b34d295fa09dc2274db8042ccd52c773cac1558fa1b792ada5e2204753b5628fca58353c432265af2bff36e6f0e9bf005a1f9298c549537c3f0985a16e5758e407e42ea212f736f35eba558b06b613355d60199726c09d018eb3964646c9ee13258fd9e28017d738a53de6356ac9a0ed3a25e4939c4033bc55be77081168783f214259d0fc07ea480aa33256722b434a1af7c90692474a1318e2c2839695b6c964c89cf5785d71271929180ba67776bdb262eb296afa1b5481ad7d607916390de18479f8cd20f11db22cb1b4259c5d05a4d3307c24003bea1153e68407bc5d686c5a9750d58435d353e21da6d953016e87eccdf636cbb361f734045ad2218cbe9bcbef82b83cb4907525c700dd2ba0cc596a45dce67765802eb3cbe38bff7120890dea80be5f027cee99c5cb08e60f24b9b82ad517bef17c2ead9c5442ce9a422294e08a1859e9112aa7aaee52f84817fc9dddab85e15807b2fe4f5e549d183c1578c414d9439ae8fe1bc07bf27743a2d14c8a061be6a11c1497319959ab76da0fd3472fc139cd087ebe6754eacb62740801b6f2d2db812aba92be9f5940b4a140dfcf66d76b2360badf8ddf36b6a2228ba8e7143b37b7d3eb7608fc4a72be7fb3df65f740ecf9a70b04090d69d76f45b2a3d5ea622e1c9b3efd632bb6421eabdf68f9ac171a391c519ff176932ea39640a79a3dcce1f13fc4501270b231a67e007778a03aa30aa2c109c35ecfd9b775e721e9e3bb1f13e58f69cc76051b7a83ab3ca5a51ef44ccd5220b195ac0cfae82121f39742d7e83c26ff8e25cd8b6a072366fc654c96e778dc774575ad1786806dbca3abda8b9b1b580f1554552dc9517d77fe28957162b4f752a52b1fe3e56477ae6b4001c8cdbe12a30a4c2fb5be05c63eebec36411a9d2626f2b0bceb8a0defc9d687da0966170f8ece34c657b5a43042a6c3165c1e52c0f20dac13822e0e06a5457e0a83c5e1bd34e8d4f9b9109a5c992e4ec83d40a04d63c301e26fe8321a20bc5a94398cd6ddb3e807a20a5c27d1fbff91809ed3a5d3b1e75854bc9c866df566c41f9589249c66be22b5150c41b642bb209d338ac72c6a4ca4e4f8d1a545aa0020259a7c89e8bbea5888f398beb892ff138f0e89a2ee6b2670536fac66c873d8f8f03df17bce23e666c5a72c7c539d43d70126e1b6d6c08298be3db01f2f8852098f58985a6f26f11e6b4554061da8eab4ae309b51a7ea570366ce049f20e10f549f51f560ad71cac238014f9225ba61ae891b8c31d50b5467695da3ff99935c6efc5295040d675f9bead0356f70c99a1878bfc5379d47d1483d543dd93fb8f68bdf12e37ce140e6a629856d316988081f78584629dbe2ede4bcf2193156b25485e03c80a0c7002b81f13f485e0ef19455bcd172c7730c32c19a4da8d776ed3859332e57362882ce47dcebe5c4358c0f22b681359eeacf6a1a31ef1e451ae8a9ebab6d0d68efb6bcd0c8e050960cb8d1b8f757d276214aa7f8f1143b9b1f47b25b63e7b3629118bc44a9e648b6deb02e6e34c4157266b0420ca0f4fb1474d8ce4d6eaefb6ee41c55cf824740f1f6511f5844b8201000000000000000000000000b6c44b6a3a92b61f6c4f82e224957e0af5979a45bff55920ad0dc86afaba94bcd48536a89275c4b3dc02f2549a2a2d144ac509be3d0fa8bdf46897f8d50e2bd88a699d8f6f9a3758187206ca6d63f14fa9fe7a59c6dba1d66c570687575cb619000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003563bcdd19aea64bab8d9e1bd52097b6845a2aa54a26af1a092c239e8aaf9c0ebd11259f617e2ef85c018496eee8675b76e9cdc20b7d89a86c2583344848148345f19ceb2fac5251150cba38cdfe121d5aefb7a21b633bf475663cfb2acae0154d6b4c9cbfc2f47c4f0629c37d3acce53f681f059f2d93cd4d4483df2507a8a202171266077b1d9bf288d0e69e0e15a356faf0e5b4a285d479efdd9ee13eae43af0325bb0f93623198c8a8596fa01af8f2c17ad0ac7ab0aff969c7f33d72e73cb6090b08d4630b76e7ab0c4b43c7d418e09cf1a9dec54f3196492684d35ab278b6b652feb60bab5484df6fb1f6723d1630a1fd3ced656b4acd720c766f7a519a85f9da02047d089b01b9823c62d7867ef073671b0d82bc44946b2986e7b5bdb856ae524f022a70faaca34c6fba54bd67ec640424f67107103b10512f287be067af5bf37888032204c2667f09f37386ddafb0d5e3825cec4c90833670f94c8957435a59deb565032dfb847942f275281064648245dfe255880f16aaac25bda6c6e35af3793f9694030a6f0d0f13177df0d49dc5608446d7a708137ed10da47b3e6092f686de864ecdc17a5fa7a0128f21479023bbf6fe6b0e12eeeacb741e3f07e39985b29f4806f01df3e7fa0cbb8063654e4711728dbea43ae17d803a0d6236b81b7cba1fb663998cbc677969650fad0a36e4992446e4579c4ad965f79c4cce5e38c1ce2c691f81682339e8a831435b6b8aab5ae43bc34ac28adc44b2dd76140a6a58fe991e3a6e819e3b172ef44002dba49d1bdf582f17017490be88d3fb4ba7524e432fa3d837b7c57f8260236c1daa781f3884a192679b985ccc973a92199178e38ff763925fd1614d172b7d88926d6b322f25426ad5748a47cf378145e824657025d950d2e4be06356f239e3133b5629888f27d64cf2dec627fbb71940757403898db756bbfe2f8f108333387ad92405e9b232bf2c731f1cae8d8333c9a9bffe17732a5e94c1a6c664d92ec373783ef2272333b64c99501837d075f0480d6bc5ba439143a25ec8e2a6ada32be4cac520a804d2541267d1d1b2823eee4aa9c03de816dd6de88495cebf0393dab2ca6f1d447c1dbb06525d3728abb22c8217043f44d7a75523b874b99c4ef957d50eb289fec387eee5e0b90e6f843798e99ca4665428dd986dc3f61ee0b84d17898effecc1bf45c51d379df2d814c550bb05eb37f44a5a7f63d9d91b4ff071e03652f324769122554b1c52ce832573c1cf278b70a2f793e2e4db68a6710b8004a8cfcd9dac1af6e24a6426fafe1d9747fe40bcdab6c955dad23577294e9c142a40baf3fe22d14478eccee9b16e1873ea0f17b1120df8ef67804a4574fa5c3ddadfef93e8e7264753afac13585fa26ef966e716886eaa48c16ff13687de030a71c5f6aed6a5e56cfd4819998c9877edd2c0fff1a1ed5ccc19eac94634096368165b0463063a34d7f22c3669230f37feb17d8cd34a475fb51b1104499ad61256482a63e378e6104af7194d2874b66518ef2e32b8c043f8822955d574c541f7fb294b49551b64f0d95cc63766b663e80e1a6e13b3bca0aaa63c20ca722a96c5db66c584d37a5f18a5bc59fff52bb7ca2746211d8b47a244dfca7ce4dd8dffda8aef6d6071870153e419cc71c272095a641e7efa05ece38e69fd662bea3e5d5112a62256c27f32c25883d61b7a1dceab7f7e85da4249800c8bddae2545eaf1c48f00d74470199c44b2ef285f9a044c3fac9315904cd445e3eb2ca04515dc1eba98a9fe5776412915bc0ec3e5e4e8cf1ab3813122ed71be90cebba61597676e7245a99eca347836767a3b02d29a959e4c10b546a4e2e0def2ba1cdaac15e5b09ba32ff0a133025066343676a6c9f608c23d7636b5fc74a9325b2b79fc2f067cddeaa4fc3631a82c4d128eb6a48cdb7d026e1276d3acc4c80501259a925203acb025e400da49bd59fd2e8c2bda0a54adcaaf64a3ea1e51e9751c59b322782168c7db353c0f8f5c87f8bc34c32e2e1ee0cc46dee82717ec5139506b6511b7ce05136fc79c660ac0dec9f75c27a7d338d5bd8f6cf4c18475f4c4098994d410be09d9c90499e25fe4470a35c64a8c3838799297529a646fe4a4eb98e6f83bb72a445c10079ae966cacadc5c538293c96835ecd3b492d6008c523fd4e116dda8de863875b0d6672679c56cf7bccc26d2c1c22afef77f6164713fd03ba32d9365a59117aaafd758efc7c0d8715ae2a8940b21a85ac5ab88b41f27aa11d84e4846ffc7535d7be8fcb5f4d127e1fd5427416f077110fdd1aeb50759f1870743ec732e747eafd2df4cdc8f3b992acef3923d472a282eee1f25fc75957b9882441dbb96096e38309c78f4d8b66ad0a0325c7a6264784cf219e3a6b060ddcafec7e08e0e7e37bec887056c6a4b90b25ceb5fc09", "6363", 0, -290804044, 0, "2de52fecbff312962562c68a4afd2f1cd88be2026e912f8d6594c8456b26fac6"], - ["030000807082c4030399bfdd841b280f85582632edfda5874c6ebd958d9f0e89e312fbe787482674c603000000004230192aade35ef7b4634db1cbdac5f5ba468c14b8ede3a44b0b61dc2f45a27e634cf2d60200000009636a000051636aac65ffffffff5a605cf167fe40fd4e90e9288ebe6d794bec6b45346142bf45fd500b7786529c020000000453656a65ffffffff02ff6d8403000000000800acac00005265659b378f000000000009526a6aac525200516a6452895300000000034380b3040000000000000000000000001ae58d681e7daeaa1fe94902c6dbf749cd87b4fe5856a4951aee76655f0e326f33d954cf36469a191e11a7016ad9f450377e04ba00c83ace3da67df6599770964128f60b6aabe032f0b34dd15bcd48e3a72a2130c9d180080d4726fe0055790d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038cad54fa2b88972312c31d9744ee41b5bb95db30ef1c59dbb9a5d510659123fa2f00c62b7dc0517802241997b6c1fe597c7fe8d71ed2c81f6f84ba1f7b7a16888b00529516b8ce5c9a64f9f0ddd3182a27dde2a70a84735163582fc546bf170f3168f2627e25b3f6d09f0d821e1a0e5d37a5a5a1708a4c12e2da43d6cda48230311556a1f8ca2ca8017acd045ad3d75b52e6287878203964f592016ddaee3fc1f021bce882970664cf32fe9959e9482164e193c2ee89c47ff56ba937e8065e1ffb20b03542f8f903f1f55d99803e3e14b6715d85912cd2a3e192c8cb15443b3010ff445db4a4881518ec1631155c336a4f79b18cd49bbe6bd5c3148bc01d47d7cb3be033009c459fa9780059722cac7d093b03f4749be69af931214887c0ce182371c140309fbca4ecbce46c32cc711699394b6cef26affcae514bf44abb813e51599f1190326d1afdb439cb24f6d621d96686e6879b7ac4777a02a2748bd1dc028ff1faff5020cf0eb1892e88cc8f7950b08cb7a8586a41ea07a8c79c09328467f0519500ba30208bd1dd0f4915d316e731d217528571395c3e0e418013df60bda25467feb83a2ba887164d7c1accbaeece979eaff841a8f54a9fbc5c851e23234b421405f77959c410c27e2a699ed3d92bbb3c6c075df0c98ab4874697ab881c16e0369cacf59dd012b6374c207737918f33d7813b7fa7d382854ecfbdd8760091f8d66b44e7ef749f12ceb421e6feaad681a427b50acf5c62a611d842202b9792838aafa2b8f08864a4675207aad878c85cc0d22fb7182e69e3ad6dbdd651f646e63d956dfac0b2355d512a9965020b414f1d1d1d7817016339d3d150f0f9e5062019e2d13c61e44834c2959ae860fb9a3d9c3a3e6fe4bc0ba7f21ff932ec99c7f161c99ad0a73e7cc6bd6a7472750b0280b121794c4d4f725930cc3d4138ebbb0004472c531e7897f71ce07e42a2e62e60b4f083dd82befed3139f3a13d810d04cf06580f1509133d934cc792c537f26bd26f1e0af4f48d9ca85b596ac2b175110cf40baf0e15f6d3880a112183545b01f9afdf4d22092e3af9564bf1b6c44010fdbc26daf8d2864e8d16cc5c81dde2d6278c1a475b0929e42d720c78be0ed56015473c9b137b18e9e01500bd5a0e75cf803f17b1b1d74f1587035c4063cc807495a99a46f66762591fd023988afd7f4ccc893c94ebae133a46f6d10e5bc6bdfb2e136cea29621536af61bdc5b64e104d3f35220119f10bc5aec8155db8c03ba34c921e0ae396493f66102dbf8cc2eed7d2c89e3f31ab2b3087c9393f736258aba9be194cc71486ba9f917dfb370cdce3cc2649e96bee34252e486139db7b095c282ef6df3a564d4d46a48faaac89ad425e47e9b67eee4cdd12d67a88a3f84d870335fe4bf6943bc1c2b06000824522f88f7a719bb2e33fd10a27508bbc0dfca081e5807a5db125ac96d23235beffffd3449a3ef98cad4f90b598bf50085cd8467bdd5900f5c1ad5fbeca889359915549d78eba41c95fd3249c97c8648e0f40f3b0589b8e19a3b248fccd2e7534e23610265cdb89fa525a2174e8a698e7d9d8cd24970d4386bc9b3a2fc9ce5afd69bdc6c8df08fcd6ab1ca986c2e90cb99bfcb1baa0cc7548b2445e1645a127da1bbdb06c841e42cd136c8f3a6b8463a0bf9b2bd5e8415a77ad9db69d917ca535ee44d4c0a85b90825d45cdad460cf6b7b608c6c93f3af8525e09bd05c7aeee0d0d7cd0d0696fa52421470e5e8c35433416132009f6f9f9222288caa9cb70158779da2fd7a0b7c3a8d45d323e8baa8e397361b7bb7c36b925c9654f571da067637584d107fcb605c917cb73891a4006016da377f0af0c37de8785f4e4dc9e3aa53078a7cbe863c3e2cdb5ff423d875fddf0e07d0e2005170f52a446ff94b2bf64c155090e3401e58ff0321f0219dc70b2cadae74e4aaa9d37daf90eeeab4cf32c3094ae336fe4b1b5e67ab2623162d872622a34ce9e9bc75d2facc146e35ad7dc4a85890d9b2ebb2e5324a31a04564fd5afab4c38eca42caced4f6b0d5b4e9c846366f8e1c9ec0028a5051b772b3d7563d63cb32b7325025eb99b46a31140f1c8fb5c7c61409f87340622522501b91984d553baa4160be9281a8cf073ca77b7139b0a193688dd638220bfbcd7124a9bd2f77fd1da8d34ad61fa94dd925b3ae7b0e70af18937904158a896eedf92d5886b0ae6be441f5972ea2c3622112c1c1f2dfb54d4a4bde7a1c15ea8a15aedc2c79314c9a259492ae7a68a89faed1f91fd460b121d05e69f68775f89a1bf3d05000000000000000000000000525e3926d9b13d363611520f9e73684f726230245848b85cb9f3e5136b7140d5305969befe321d95cb8d7f899169092cf179ba2e5623edb422ce63f6a6fdd2ec190d2877c685e8f8644a4c4706d373cda4587a96f4104e8dec5f29919c805a21000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f71120f532a57871f30a2d96dfc87811def36ca5d2edc899cfa709e19bc16058f36c60e3ca1d4c27a1bd3136a0526fb7bbf5380f67ad58dcffb9b35c07e97b625235872f94b3eff8f31f6f84fba75b45c29c1ae0371ae2c18fc7ba125797b3e564a8afd7efd7117b2ee5492209a93ba8870dc0259746a876a6f6f46dbb4f554021f042b111a84bd163baf1a06aa2159b50aa6426e91527fbe15ba2b76250fb4d80202daa9a80f37738a82a898a29a2324cf50db3d18cc3f70cded2e18bf8d8fa0e80b0907b39cc7b6faf61dc627c6b0d4bddd41a46e4ec8501b8edbd869a58927df2940367c19097da25c527302ce34c219e67772368336b3fc3922ab60525d8ed303020681bc7bcf5def7f109e3b034627577b9daf09b6b42f7d3c4e1674fe872d49a9020d70e53f5a56c17d933385ff0f655ea41768852964046ea64c91622f7fca9cc9032353df45749fcf9966c32e34d5db583bc1e7729b8b21fb2f4f5aac364637513c032da7a1ebe47e8e6ce4fdd6453e58b4e496691d74b4568146ce29f83dd67c8b97020bc472c8cf799f561bb3871d4b8945fac811875d4696b5863fbc29b6e668d58ea58e123ed914f37dbac7eaa06dae083c3e7238b674d535a239ec4834405125cd0dabf3b4b6e18023f1d3b937ba41fa61c729aa85b1578651c71d32f469e7c085210826575c406ddc9ed8d08a9ff1ac845674d23467d0b538d79b7ed35b34055cd4dcb68dd2978bc237f405d3c4061a632045a2ad952b6ad6f7480f95d868d7fe3cbaffd121d2c9d20a4ebef5468d7d6e28d5f56b16f4255df6b8a8ad1b6bb04588d8f65e62b7df5de5b24b878013605579507cbffb43361624487183369016f542eb62e83603ceff60146651b8aa7a4bc90b8de1f3bbd9ba5270218a501c09d0c436f6d71701be445221301d0ccb8a5419f2cb291e4e093eb24fdde9b3b383c12eecaeb8f328d19104d89926cae4f86ec96a4efa6e9c4855bb3c2fa4a4876139f95c5db846c231bd07c02dea39ec4bd8cb4f585c754c771498135d83d5c94831b389989b3670dd0980a5e853cce017fb3451f8076a862950eacdef0f590eec8d77d8ca8ee05b22f3461321dba27d773576909031d36d8b2ea416af8b7b4c29cf121ab77f5a6c4f2b8d57144abdbb9aaa899e2a636aa84e23dbb49267340b30ec140662ac4c36098ed6d6aa723bdc3cccf10c0f8ce8d9667f5a66a6350262d6b9dd36720aee7119cc9604307c71de478d428537cae44c95a05511c29ea48fdc7c2cf76e13abba755e3ced6bca76c0618d80d8ecac6d56871c2f6ee389bfa93da0fd077a3aaddf96a9a0cd8349abeb43883b052b8c0d06e0dd1734e0cab2944144b813bd3d0ac4bb0d61dc58882e003f0326a9c834814c1cf9b9765d5e0b5a8344d32d172ebb36e7f1f0f7fa1eeb72e0db42e9ddf7fcf8c6049700e2b514095c787a4495c4839874d5839894775800b014a7a7deedb7244cf7fb73e6cd00912fc0ee7db20f0d2a280b1bf9571186dd6eac0a4d154c777079791275d65a28fda0a236c8c3aef9b51f8fd49886efd8fb57752badbbbfe381d5bdd928511dc249e6eb924b32b50811f4c7509f47541139ed0032e04ceec378d78f3aa3869167bc714b755a4fa31eaa86e186a013657a3302c4d1449e1d12e0643f04f335a30399a2de7c2b71671cf08f88514fcd51792f2bec88c94466f9de7330d1940282745b83853489778f015cdb6bc9a0a85584f9f039e4db9f8727d0066573db095f60e8a15816d63375553f56c34512e4b59bd7df359961827f4841648b1b93a9c594f203079c8918745e042228d0bce0e1b00e69a068363f36b5ad5bf07f595ed1f4c7bcabf5e4fdde561ef5c6e7c0472d8708c2f0b9820d2d009f946ed1f1a19e213e75a8b8ce1b734d74a3e76f24819df3d1023ed144f8a790e519e6848f72de60eb3bc3f02afe0f4b73f4707665b43124986610fbefce45a567897c945e3d05cf47710160cf58f4e5cc3c20d39abe25da605784c59925f115899256ebe0ff55866735c20dea3a00698313e8ea2aa31ebef27bf0e67c67c8cffc2cad6647ef7c15475da4df2321e298162a927dcde29c9a2a03b4d96edb81e9406ce762bc9054af7368ea1e77f379f7e663606177c8dd517b4922453ba8471568dbfa4e42363a78ae40a76a7cba32ae3e6525a67162deb7384d8ecbd61140c4acf43c707ab6571c5d56ac15895f4cad2928e5ccbc2d5e3fd84f77a318f0f39054ddee704d548812ab93b8ad822c0fa405327b3e69df560e6bc4330b54bd1cf8020000000000000000000000000224bd7bc9723d83656ad1a0f6cc9e84d221f86a62fa3e7429cbfdc02d834c8764cb00e604601c440184bd7f81959fc9ade6ef6247a88a3fe81b0b9edf82d1f0784298671f047a0d79bd245e2348e526e96b0de33af2cc9e8876eb9dbccfc397000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000accdc8b4cef7a319ad13a61d9769629dfbfc01f9f8fd57d13e86c6e42db57ce55b1ded40673997c7308953d7830fee7d267a7b9f875fc175f3b35bcadb1195bebccc1d291c483e8cd687c99911bd5fd2dff1889fd46510940a8e09293a61952441fa6ce9afe253510b2f1b83b13a198c45baca2f31aac9508eb7058a0bfeaec020f51b48ff929174d00daa0438a4e5ee543e78b33dce6aba25e0721708bfc293a0202ba5a853887432817573884f1c491d9fcad281087175ddba7dc64131991c1610a02f77cd09ad1d6566e6c15057c38ac6d1cfd2a8121d3814e8144dc2c59eef4efc484ae9bc37d378f0b89d35a7eb8963a7e0a57f96b5197943b4cd72083b8099203190cd660e5e0b17ede5d935bc3ac4e1463f4e1121e74903dad53ef316a485b3b031b0250cf4b6c7a9b9d268f4e802abfb3050a2600fed34cdf8e9ab3a693676ebb031339bb6d41202a2394d534c0e53334debabb454b2cf878677e79a0123df3e3e302259a4f2e866e1beb72047a46dbe10c5eb7345d7ff5b96136f14ec4c418397b610326ae02719b5e50e3fbe586940cf5bbea640e174faaa8d7934bc26110b96cf8277aead9b80edcf4ba91885f4221371bb954584ecae70904fb3809fc745ed8bf102614d95d3815e72c558cb49dd71a980d163bb0011ed63709cd1fc7dcde971cf1a0e709ff008fcb2728afdf2c391e77f1dbfea1fee340e6f080ec9892436a3d55e236501f2f621405bded18c9c987f1ada216a9678157e2c06c1ed142019c3de2995c6cd2ff546a6b64463de3948905236d55ea0862437772646d2e7501c037f3df50ee198c537b7eefbe44dda6f21c90b46e080d843e609448984af1ee85c4ff943a3c1d2944ab45e2cd547c1e7f71cd01fa9ba8ce7825468c87380904a808a40384b988cfc68d502547d527822f4b8185d8e8c4b5807d7c49c2d19a6b378331da25794d3fb5c918ef87c938a542cf023f7ba8dc755e73b721fee126d91827afa36365ee4e7aa64e49f2822103498243bd0c5d74745b0ac0187e7825332ac6e6d125743cc6bf8a1fd54ce0fd358265b40f03219c898fc578f43207e5a96dcd7a280d2b63c7da5f22230199f73d0b92f51153bceb2c4f22e888926b5c955b424380adef1067ab23e4d506c0df03b6816a76f9a29eddf8d4beb8e41d72b0bd32d4490939591b08ff79065d83d29783cc58665f4f371120748f6cc6393b40dff69ecc683d36d3ca9456ef1d7e47974a79ae4b6a63d850478cd8e19f895f4c1a818eb5e1d2e80bd2e1b4718621ff297fda9ffbde3e3b322d6e5c67d72c3cb0c18ccfb682a157ce25a987c91696b1d0e7b12ed73620272a79431c7f7ae54dbcaa4d737e9e8dc34daa65dc22f61967bde1de4264100125b8b6f2547505ca9e46d78e6a14c079191a27807b5f3636f51c2e49dc0430057cf153be4b5971392eb8c1c5badb8204ad74722b8a6fb2811d8f089f662bbf09f80934056c5b932873a04c0b73f9f10b47674c14334ff5f48d2c8d80da93f20f5232f5d77102cb1090d6c6e9a838bfd266f2cc2272310adeea169d1203178c502144424a7298d6235820ff7dc0a0691475fb0cc928d0160b0b2d34973cbc1669bade55d3c40894713b59d7fc8b5c9af64d855bd863d4420c45cd27d05996726f3d88972bd858411907accd5e4dceaf52ac01ecc41d5a92c26bab17c1277a5cec1b5f3c286f24ef028839464e81b94909d7b612a0b1e858eed6e3f8c3ab7783636bfcc4619d99a7010bc925aa6b5aae5d3f99deea31803a0aeac8a281227ee4f67bf0d617adac5acc3a9616d5b0abaf37c097f565e33d6202ee2db7173807a757383f741fe239889cb2ceb2e525be426b69c6e639c47b139f80b27d004752c1759b65554cf2a5855dd523dbfb0648851ee5dd2f45df42fccf54607e238f7b95d8e83f88adbbf6b810ed22aa3b356a7a768234e73a53be508fb018ae5d763ae7cf6e692a90168baf4466330d733403ceea148c1ebee67f82ecf36aafa75f52c8e8e0eb1d8789a11a628c1ffc287457934c4280eb775e15c7b34c40b31dada12d4405d6fa8f9b3ce9c96c100b59f2246f0178c7a76a84c3c084c2f0c84d0ad0ac11f17bcbb16d53825a0321546602974ba1f1506d9dd5f80fbfcdfe512a46a8534fe24298c59c048c24aba316104b63368ecc30be2a0462c93d8a3f7928bab728f5b51e773f90e81159346542a00969b994f34320bf414b2fc3d29d84c2e39a8c6cb95f19d9aa6124f6f9bc167f83e1cbd4b23fafe19724fefcbf4d7a211d976a20e715b4e4e9fd6f1810f4e456d0c4612eb090dd0497f81006c1278ee4663d3f592d11d63dee11179b0fb90084690827c6c77bba41154bfd45772d5fcdb510a64f572321705610efaeaa07eeb6069897194aac96c743534acf0e67fe0f069a0c", "ac52635351", 1, 2105529909, 1537743641, "18232ac05c9e741656d77aa659dd5a22df0cfd5dfc4085f2ae52d0c5bf7de462"], - ["ae634e0c01ef9c5ef35feae51020e2ee697fe382f8df524aa8ce790c536bed68a2880567630200000001ac96940cb402c02e6b010000000009630063006a00516a006d38200300000000080000acac0000ac650000000002000000000000000036193600000000006ca0a51896e271aed96ec4f35b24056f9a63a79608136f3f0f87990fff44f1f503dac0071ab2ce625b38e94b7196badc846f36db2e18690b2033b62ea3858d8cc92cbe2def5249ce4471190ef1060907ffb49c9b1b79d8fa6ccc702cd96c9eaf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000771b87cd42e7a47e4bea968d56241fe1eeb158cdfccb62cc937e238eea58fda0b0cbbe632bb0a183d3df2ef942d0f0bcf6df9211183e6e3273cf7ecacfe34fba5c257192831d81b9b283d6b0bd656caf1ec94a9c1d02e5d14d6e53aa532b7f3497dc39f4316efd7de9ee231c492401336d9b806d8265a9c81987d9642259a00c032e2481246d35948ee1e3663171435afea5bba03cf40fcaac965cb0f96adac58a021e4f5e23a57e84e17c78c581763c9cda59dfe583453a3912ec0898007faad5ed0b08603e0f3afdb8e42b7626924a46da0f9a26630845a4d478e20e0f5b360edcaa934c4e510749866814dd71aa87c01f4bcd53c15c420a905fb9d071c48121e9930319b4b4243f846dbe5093287b08ec2b65be9604eaa6845aefd396d29fbc06fa3d031e042209523d2dc8a17e64397f9f61438605f7ba5c3fab2fade7fa5a64f4fddd0301de970c9861ff68d06393768ccba0c94b2d3ce474cb5343e9d31f0ae73b5f47020e29ad473c36c7ad20d461641c213df56ebf557171eef07d7377bb29f83b059303229a0bfd0bdcb1c4965fea1261dde55072d4a18994334d99e61156dc9fce9beb9ee1e97139e1417c3cdde8e8a1de44af7bb98227ed690899b05cea274016ed3b2120c36d919161b6bf4dfa654635bfaa01376de052d0938a70f490a4897af6e91ef0bd0794951109bb9a497a3c7b876045c6ebdc1f89d2f3e138b67a2b3a85831ee9c04a097852cb28c0e10ba87a8a5ba2d5a799c4acd23b1c6a837a0eac569ec72bc837335b88ba0d9e26776b5820d7120c052fd85a2a5e2ad3355fc09fc73dcaca67c8fde346c5443f270ed8b12c0eb37d36115d6de86594bb4279b19479576fe607a5a9821eab4d5f558d11cef54423526cd3951e557e0b6a6403c17186eded6c2ab90b37ccd8374d54d54cb8d24067779a3bab7885c8f6b80e2362bb785c694e33537f9bcdb555dea225251a17fce2b722832196a97b34339e24ec97b99327506a929d2de43126ababf6d50eeb78c81d440e36b2ad296201506b7c86c56bd8fbd991694b6a2754084f884c3b8ee397b509a1ed45eb744e4af3b23614ff333a1242c6ea678a5474a196c9830078c388418d4ef69d71217265341f533ad4cdb6476998c376bb072085a2f31a871682136882be37d0e8933108d7756c41b0cc8aed38663a9837eb6d372b754c667b65df57ad28cad8e222f5b3dc7fea3d26d3a41d77c983645d23bc04a1038d96c0425381ca1c7a51869a4dd83cc3127c6fac234532ba2a6672e2d9e5c5c99634ed7a87aa9448dbe5ed6e213e298ae475a8054dddbd322f6fcc8867b74e8d2a9ad87377e1a8795b0e2005b42148dbbd684cce2d654688eb3c5f408813502595af6c79ad4eaae8fecb3bac5b741e44eb905008971a71d2cf9ea0f9a096ce2cd9ae5ebfe3e5d1be9ff829112d0215d3adeddcd88d6c6f9bdc3b1a04ecd81263f6268b562e043217239c4a916b462511f5618868ec4f508e7bffb039b0d174e14e82e35f1db76bf431877c8aa57423af1af6f8f7efe1a94db6b0888ffac9d9ff26565f368c4f484ea2c7b1fff170ce86b287f8f0acbc55c7f6593025afa05ba8c2bc59eaf57fd6c05cd461e0e97372db51c04758c1ea4a1d95d9861f4aa009bd94db3b31fe396215c0ef674112980c115605b7135f99bcc87e386b086ccd816c7f1027cec7fe996befbdb9e4987d8f25a7d442f694cdf64977676cbf030230d841c0684702c9ffb826696fcf45db305fe354d26fb297a42a9449be67530a084c9cfae7b98ee6ce2e78c9eb3963e6daf797ed955d45d4987d4356882e84b09b8c7e8cf23828d29d943c9ab4776e4377d51079188d8085084eb1d86767a92dd6b5b58b9fe382d86e815f6a61cb02fbd6c13b1be28d9ed1aa6850e17ce43eb01fccb50011a395d2e16214fac40c3463bf45f762d7b5f3c64805c0f8bdbae0e418ddb0fb6e74c029824f28b0b9ede7b48026fa82823373c50b9bfade4ba3ca18e5db0e5eb3927cdec77d44a9e0cc25ede6b3bb1bfd043e9b9be9918bafe3b55b6e6a88d6249fb02b912e44ce349e025a20c5939822edde44cff31c39d1f63dd28e5478bcd766a53e9aa15e7de384c9863915a1ddbce7020345dd4b9f8a1d484168a1b123c9624ec4f2ba61bea3c3d4072fc897f974352e7b067d1578b77d1e42968c8cfb4925a45d30a2b53849cb9091ac11cab4cde5b6885b1d92250d6f9deac81702aca720d26e207039b8967003c9b2a1c75a0d7707334e91a9e3aa5b25a939669acf6409291700000000000000008f57920300000000eebfeaad645e734aceb25c38d974dbdadf742e92fae63bd16733e7f27f9d8309ee37a94cd27eef8d95a51dc2e4cdc0cf97bc4e019ad86e700ef3b02aefa3f8feccf41d8f48d3aad1e8ce59d58ffd8706387a4db1d2dae816d729772ea29fca1c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d8975a87d8a8fb4d22f12f5ff6eb01fca2790c565c8886f35478ef9b5c5a9d90dc31433f182d19fb302be08e086eda2a88559430621ab35e92b2ff11d43ad6f0bc20548dfb7a39a9b141688da56bcb598415ca41311d17750b075b1ee646bae659c6b5125bfa621eaa5591d917e4a9d4654df0e7546e7e94bc7e9889c0e61f8022824d1af5ddfcb5866be30a5b4c6d0ff1f746ea29e6c0ef9b5de093367f735b40219a36fed09ae43b81c5917a553cc4102cb18a5f603c321bb40b1498e4dc244c20b05b83cf3af1ed4d40f21f4f213ef4df19304ce4352f155c384441cceea81ca0b4edfdd920de1d2fbd06ac7fe7b027d93d926acc2f634b806cf647aeb144615b4021bf9bf20d41eadfb8d38c5bb5ff706d5da80846b2339ff4910406918d69c90cd031572588e2ca65c80cda15b4b6b669a4dc9f3082ddf219fe5bafd8a27ae37178c030316aa544a7061c4ba1a272e45339dde82afa27de1d0b18562918452253a736d0301201238ff95c55b04b5eb1613bd1232446768600f49553b7b7ee188f9cc251f0215e7ef4d966eccaa976682cb81520814df5793bec2caf65b47a9bf213aadecd9b807e1670d4aa8ac610e9a029ffe5bbfb7253f2eccaeb7781e41513134b0afa646e91761d75e9ebfd2adb58b242752a8688ec59031f5a1fc19904dc715fdc627f78d1e0841b7f7a61c7b074c30d27fb7ee206c7889099f64060eed7adae23ac3956af71ffa92f091deba5903db0db27c2f9c3ccd9ca18af089020a6002aca8efdb15e400b3ad339874c3791813158fd487c9049d35cee3803887a8bc4826d33e63ff644bcd431e605e504126469ab579e63a52e347c17d427459ac5badedae1396753f4bb28a6d4cd2bd47111be1a154286484a6b31116c7a6877c9736af19e1bb33e4791a901870bf94e75b6daa3573e79a3ee5963a79e3f6026b7297ac382355d19f0c1f705807e6607ea2e98a4d12918c78bb99c35916fdf5bca1a8ecf367ba6bece2cca75fee8e09b32e0698091737f47036c6c7b4ec99884baa3057f88e71fde58fdbbd521610d58b6f5312f785fb74414b5d515bfbe7dff8d63598af88bcf8758651d91cded9036560c93d551b070aa9cf8630bccb3d9ef88eb7c9c55ee56ea816ad75d5a4709d01d396e4d7e0ec8d9175b04938072364480e06ad583fc6db5f62b70d3814f349b574f050b227be9d13797e1f0f4f3d3efa3c0c93f865e60be2731f0043097c28abdd22830bfb58c6d62be4544fee3a0b8befe3811ab80b3ca27eabb2fead8fc39707f0f540d65b5734d1daed035e77249a9f2af179fb329741618c9c6f07bbc394ed75d3141573d52e6a81742584ccf79049d901d00385f4be129524657498f162da1215f9d2953550608555cd4bbdd7c0eef1803c625d84442576859fa0d356f27cb7fabc006ebeafd44e0cfb79fb041ed6aff00e109376bd7be92a847b5b9680b17b6c7fd54a9007ff726dc997479b02eba18187701df310bcf06c8b5f4303bdaddb88239c46509c66a7596f6611003b8b9e95116f4338cc0a6d48e1a4f0edd95d20372400bb51cea13ebf362804fe655546620dd8efddc23c603f0144cedf86b3dc2f97b2c13ea0c7a5e260fbb0d526c25d27c872ae7367ea7ddafe8f5c6d98e9120fcd46409eef7b185669f792697442589db8cee0edd0793ab822af2f900f9831033ca7ac582aa6d16a00a83bcbffcb5bcf35e7855cb141cdf0105b48a7d723c00f6de4246dabfbc752f439c43c366523e658aba0c288e71f92215e7c113469a15a5ebe948735e7856fe06b4edbd07a90cb20bdce18a8be6b7a0ce9a96fa52688ed57a5e77205479527c495c9631bebf573d6c7f4e4a44567c2489c9c7712ac1447aa8beb29c92ede111360ac6816b03f3cd159639d8183f94326431e86abf044a119a88930032f70c93528622118777d7c5a68d35bfa7c63cbc89970491a1f7fd15fb6be22eb6fb30fffa60397e233eee63845eee26dedfcd4e76544d1d5eeec2cd461def9903a5182a44b5ad006f9a4cbc9a3e2ea16687b34cf81abf4bfa87f33db416ef1c37f2359ba7afccc5afd6cd190fa12ffc0cfa174ab337c88b4c6ad0127f30d189d9af8e369b7bddcff037811f24d671d7c807865cbd7d07bdf29efaff348e695cdd93e87a71fe89b7ae81a916bbfc767410e3a003f98b70d311784dd112edc3ef1619424eda4fc07e94ebed76f09e611d0d523771c0a6a79bd5823a92b97416f5e5338f2d0f5e8fdac8bb92afe2f7c9f3547da00b4c2997eb41c12cbe88ac86d99419bc60083b1c24620aa8f0ef08b06c6e532d3ebe584eac3b933ca60df9aabad2586294d703aaeb8f3b4bdeaa65007db5e0ecee885870cdf483dc30b63b91f4b6a6d4a2ebafc5a599f24323547088a948362423f11f76fcf0e81e13c1ad908", "63", 0, 342522518, 1537743641, "5f92527829eded83043b5feae27e24f28638b1361a149726c64ecaa72aeb34bb"], - ["030000807082c40303992cca22132ae4a7341c4d153065f8e9cc660447782c1afafcaa8efcd5387ed10100000000f01397046793f47a5a2bfd83a864d1c452d7226b775abe7a118208588f15de4ace69cc8b0300000000a5c525b09cec47c10dac4339d0c614b4487b0d2d22ea84610b2c001c0d6a404d06cb6007020000000016833f7503fc175002000000000863acac006500515334aa6600000000000551000053008230ee030000000009525200536551535363000000000000000000", "526aac", 2, -1664400184, 1537743641, "9e66b81820c4b2f910a834430ea23d5ca1f8a11ab761855348a779922d0817bf"], - ["26b9851d014468158d86e5b69db7038591eec40e040c3b655b0e89d72f5786814dc504dba103000000010035a39ce70356dc20000000000000919dcf010000000007656a6a536a006ace16860100000000000000000000", "51ac006a5263", 0, 1240732957, 0, "f518a028ef5b42b79d89855335952f448a822d684934af91b04a4ba9e35ad2a2"], - ["030000807082c403040c39f1af36d76acacfeac6985dcd4864bbd337b602cb6ff589e0b452b796a8490200000005526351ac6a5d5da2997bf203413f1fcd235bef5f5176d3306e737cf4c06ff9d69a927950a07b46d8a0010000000100ffffffff7822904ee87e998ececa3ff74f2feb1eb4a876e2ee1d42b7d6b036de0f91821300000000016affffffff9f68b93c372a5c8d50dd0bbf2ebe4535bc931a2344b5dc1de7fd58bfd8eca683000000000963acacac6300ac5163ffffffff03c6409c0000000000066353acac6a65c47def000000000007006353636a6a52d0c6f90400000000016a00000000000000000348fe0305000000000000000000000000049ba80f774f67c4099b87775060b1d656a0971160340b8729ecab5053deab3dd674cda11c487ca4bf4fc7e0326d4c026c4e8791dbca20e31625da60643e81e96c19cd5e953172dbfafccb6b24dd828e0668e58bb12efb2b0e2e81432dc240c5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c8bb8800736afa34f9382b83290719889803d5b6f7435071586e07b48300dc938bdef6456679a6832d35e780649f5a07d741e81d445c907416c9d60ba6c3cc5444806d68f0dfd454041ca2eae931a70ecb75689d27296959867bef08028f31fb874819adae66e134fdc7187ac085b972968fac3fc759b227da30a3fa480161403169b3223727cce19148a94af981d5ecae4e97478e5a7d46f241a7d20e8f12cb20228e956335ee37d50639bbecdd78c28740f33bc136c189a0a499df328f295a1690a04057c3cecd32c05cd8d868ac2ab666aab96e5130d16e5ecb475c7085a652614cf5168364710b03f867445ae12968ad9e961fbb065b5bbfa8819186057516f5c022ba56f767b552135590061360472ac04ded6f6ef1810d7057b780234a36c9d0f031ece9ad84f2487531ad2034c6ac5c9190c526b22904f0032ce3ba93e1469b095022bf00c9bd4d05bfc3c6bc804717279406f996ec235a121367d424fcb923504500224547486248ec1e221a24fb8085c76189e11d5d88ebf66120fb974fc9760f874032013895cde4e7cfc5f95647d521beb9bcc53962a0f93715330550411867eec35e28d1685b073fc65cff1ffda8a9a49f4573d1a863942fcfbbe25178749b6838cf093a4588bc8bb2b08d39f26824779fe28df40a33bf92046262f05ae10201ba998dbd8d57395dec45d366ea638f09faf4f0b5909c3959d60b94c53e2a0ce2624bcf750c5c3ca0a85152da333e40342b8f907cc3881f364cab4d9289b481c946220b304b963641136cc10b12b286c9dd4c934328abe657cf356dfa93182485400d21d73db07af3aada1d6c78ee2237727e34590edce5c7d2a286216fc45ce46389e40c420a006926014419fee335f131b2fdf4420b9e2c576f15a2c1452bc78154ba2035d3c16ce7f21e71e267d38cc5e521a268c2c9f845b60787d98fcd15f83278e572c2f503baf8854df35c50ef0e1c1b255a1faabb63f571cb786c3bb158fe487c703ddd32dfb3fa3ee508afdf08571714c38b9ccf893dc093c2a51fe1b2e3e26a8ac201030008bc4c7ab1f806a0801478637cecc5e5cc192d020e1e50f8922c9d72f29e3f55ae601737f6dff490cd3a3c96dab183a6cfff2d579c8929394cd6cb0fd2cabedea316b7801b6ae74cb087554eb449e4ff55729bc9eb63e3931bcb672e1c5fb79f276d8880d3081e4edfbcf47ac3374ada2a49bc9690afc3fbd0d8a6f8a652ba52fed8600f58f0546a3cbb6553cbd9f12f578f533933ad787e8163512b80e890fd74279faf211a1f288123b0d1a05c6ea5fab93dab3da749ba51496717a971eec7b01a86a5879bf145890d19116e2abc8110ae9c4e618df55e03901275a24300319567bf87d02450692d14786c55828ec76b12de7502581180802996379b227d1b037dfc5d58b417bb40e4ff21df958a335ba1fff7cecad00500e928cfc06cef786dd56f487f973443e8e0f17df9de38412f1d1a771dd87ced087186fff1401ac6b068ce74f0813d5732bdab3a2f5537cd6dbeda453cb2f444cffcea18f1d337bdcbc2cd5179d064c172cdfd95b51494043498d94abef43131de3a47cec0cca20440e3a728dbf542b61bd90327fbb0376e1e6043ffa9a8827621793f50c653d3d58e28fd489068bac1be434746f76d478d32ae35042e301f8bf1632fae75456a41eec2d104e83a63bbf22f6589048ff886ebc64c6d305f996cc567d2e8aa038de655d54aef6151a1eb60f0baa15b407b7d4e4f5a04f42e9ecd29f7f5111aa33c430514e06a32b7da5af8bb8f98298358a507cd86d258051319bffd99f4e1db5c943981d47bc9247ae6334ab5a601ee36c0d5cb743a9ee0caca7037c74c73e113fac8c7f1acd23f217cd8136953f65c565f514428c85a337af344d9bb2cce056ab9e2ff27a363dc83bdb772399578e9ee1b94420c03645ec970ceb618faa5511695e0a287814b72e103a36159ede3886640e45dd3152d1f2f66c12d4e5540acdd91eea664527c75af4ef7c8a83710da8f650b42d6229821251b6893bcc299040626573ec425a90b80f8a5ac18f6be54982d10b87bd067629717ed5042d4f72a660cc07a3bfd2c67bb933f6d70e25b3e48ce0b0de639718ec196db164b01c0d823f0364eb32452e9751394122e1b36091f80206f5eb06d9fd9f50dd2900c41be6d485fff29b494206b2e73ee885f0b85a3b3f34cf27ab3a58823587259f84279f42e2bef4a3f1bcd5eee1d5b740808cbbb5d0218214c0ebebd2e24215e413c7b564e1436bc7e03173b4845a38000000000000000013c2600300000000c03a4720a41876028e890681e84c63d4ecaa7822160fe6b8afb15f59334e3f84d1d0443c2d0af1b83a1b31bb098f3d295235c519a3319a8a95c3e8adc0ef1561fab63536938f0b999e5d8e0f3181a1a8026da0e30400018dfb7323527f52348000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000effc9af94c9bd6c14c4d8b8e2040b2e84fe32403c7f05d6e91c59a16496c88645d9145efd811ef44afbef135cf0d118b1cd42cc77ee48b9f4e0ff8081ddca652367e3463d89b4ce6fa46c1b6ded116f7ea020724a238c7e06ad572e6af1118d3ada7bf978581ee1c9105efa0275feea0e7594b82e92a905cd4816782cf4248a80316be32ee157eee044a7fad465352a5d1da5e337191bd7596090b944f6cf6270d02124794f60319a9d594e4b05816ec85765be83bc4b0b470f0d80cc906581200740b03cef393045f95b31dc98f69138aec28a17ebdbe12c8dc951c1290a1ba0d567128b8b3b61f7bc5841f119c48a9cae5e01691aff6bf6ced229bcd8deb3b49c5850300f2da4994aabc841d2b5abdaaac07f536bb1bcc69cd011f736c9f1f267e08f003003b1cac9d8b8db3e070c09d7d7631f37570b983ea02dc79ae6363214aa1420703092be68554f2d3acd9e47fab9fa896491f4b9a6ecaaa13c49016da58382a6718022e744073fb750c5a1a1cc627644fad66215498d3371cd567a4fdcc1de7a04bb0022983c387158a629acc447ca55b42515d0eb7d0e036a5944c7dcab2045d787cba3c217e644fb46fbe97b5d3e244982ffb9921bfdd293bf6c25d4fb8abcc2cc6784b2de029fce7938170795e68aa6d9c3bbf6a0452a2cb9a701801c97b5e60b008112be5240ba213d4d90472efd68c34631ebcabd5f05773e3bc9ccf69614fe750c4a5ddd8771629723518869b85f2c3112d4f3ca2114ed52786981e271c8af2c496c5a41352ee0996df022777f1fe7d3f73122f9e2738ee62269b331cf94344cb22270eb2fbe286b85a34b61e052c6ff956b7e2ebbb67e4db7620e8d9a2ac8319b8efc14149d77af5cf5dec71b7116801cca28675372946490cccbb85f0126b627005aa63591940f06009c00820dfc908ff3f7ee7986fd0e737d2c7ca890c22f58332df956d83a144ad41dfdd6db3bc47428f0ba5661ec5060e52bc20e68991fc9319cc62fb121d7b46c34e94379c961ea7ea194827096676faf330d63700e027bf9eb15443830cc94dcb59340a2ec605773c2b57e1667e4f0bc67db4f1fc1fb2e0a623364b6b8b12f218ef3c7e50d77f01794d8718c01fbd22c776302353deb02299ab698425a438e7de390bdbf9e825a7d5fe085d98dfce5ce0a836b3c8c2313e9368b3947d1958273469e921ed56025f9b3c23df40e211fde744f5a936dcfa320edff923f15e976c0e7eea160f3417c094e97c65874ede063927c0e01b52905163a20a8a5c6873fd175418ff748606b3b486ead55402fa7499c2b7b25198a841d194deef2fa4e35078b4d904a2873a0de4af0f18bfc2734305883e918a5460c2ffb6204d674ce3f0eabfa2b0e2ed413330446105bed0ecf18e12ef214f94825de4846d54586ef7f8e5ca06d275f48d873919e01112b1d987e0ce2dafb59b10b8f7bde31573fc802dd11819f31047fa45a49a919feeeeb1f02bbaee581cfb99561e68686edb37b9adfe51ae0abe1d8395cd8390c6ffe2942ad359fcb14b8c7e16a3d29e15b8080b6d5bb951682bd90140ba4ca6eb1d297ab8baa9c8b565a56289f9d6eff4a109ac8dc4a38272ae50202488885a7c6288fa06c5dee926436eff428f9398396099be01c6cc6f096644b329915441fac83415241bdd6beda0018ae1969aeb76bd24b0166cc64bb832fdfa4f7015a0d7b69b82462f765ae4ce39023cb41ae1f63e4efddfe346caa98642958cc41bdad2c65b366ee67ff33de4b4f7e2498919e1d5b30903c6ff5852258166a2e3ae2e6db343e29d7d713b6cd19d98087c3ea6d3be01472bee2dcf60a2b1733a816ebb4717298813863a084c92540940dc902f0afea994a58c91906c355da30b49cd583ca31fb6d97ecf6a6990f5d0f21412cae42920d828430107031b5ac90541ef4f9717b2de6134139f07d8a33fc82ea4f6f39bfdd306aa39b8b7a679bfb831af1083de35b8e7c864abf8e821f62a0b769f7dd07f0b0821bd84faec5fd728974391194b82489f4a530e68c745847c45f79d7e7b8e26714958aeeb3d4ecd6cea8bfeecc21feef10a724dca38f34db631c934785c1059e4ed1e2c4c79f1dc7e2eac651b8db2b31b94e2ce41d0512114c5a35407731925b3d64d8d57c15d8739241cf1b6d4d9cb9fc1d8fd6231c39242a038f84027df2835cf463369ca5fafadee37718488b75f1b7d44df952469db4a067ac4936f3d5033c8398370a6ce9b8cd20da1bbdebe79ae211ddc9111c20253fa2d8dc7e55474f795d7409b20fc33034600000000000000002bc62004000000009a64996513137e67f257c0e9e86a521499fb98614095a60b35eaa09c2be12f894e22e8a559833c4f4b23fb355e09dd188b81cdc4bfa5178c2341cd494632a581f7ae8ce491da6c2e54c5b2c2802764b8cf468a50b604022ac4a3bd2054082ee5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c21c6156a5d1575d159df05fdedeca58b661fed0111e79484342944c82a00603cc6badf981ec75eb2f1a293bed1e6019e37a8325edc90ce7284bc01a4708b7dbe771eb60dbfa99037605434b4ea64812de75507d01ceda42cdedb46b1149416fe961dc25ef1f3d86f7336db2aa42457cff93c8df671ebc7e279ecb014012f5003083eddce59d62feb2c515ba303e279141ce8e951afa0567ca662a9be04857041030c0b5735654b2b1d84a2fef0fda2eb11aac37ca3cc5670d66e3cbe1c50a687d90a04e1ab3443a53cf486995256f65b5f4cc32fc296ff0de6878258e8fdc16d1eabb9e232f3a0eef5f9811707ede2070a641b87a22f73b7e619bc3f3ca19f0356470205533e46052507214b52e3f4a78cea119b695fd1a8e839f3a5a567e1e6d05e59021f1bbe56d369ff2d957c75b5fbb9e0f25dca49ecffe930c530619e090998512f031ac433bbe51f0751419d3e1f06f5735db2e335ad05ff12f4716741d1ea1461080218f13d63e190f1870335b042298a280845a3d6c91601252cb8952487d5cf59110218deec8ddc5d28b0df980d5e45b3529577cbbda36828c8442bde41f81c7bad43df0bea3632b32aeba908a79d1bfad601be13734c610cb77fbe7c497a2a7ef5b9ceb12aa0c18fa61acb153f7724ca61d10430ae221d20347721f09d9b670011c8706d2c25e70f921782e0c7924b6e19a4560199af999533be1fa882861c29b1f5210d08b3f0d0c5d6a6eb23ae34e568dc6228cbc7d88dd86aafae168db457b091d5afc4dc9aa7a93169a8ea1a12e40f46bb44a98500675d7f6006a055b331e893240d92914e270d9055d24a3222ad24ac06dd451625923e72bc0b87c850d1aa440226e03e325c4ded80d882c29af24dc1d67d0e54ed08e19bd6ba9fa5c770e47c8e23c587b5f340f2e348f4f07f5372fb76df34ee0512e2cc93812e3a90d78030fd92acca317dc17a9efd835f25708f50e5d06ad4d0eaa886b18ff1b6ef1de35319b5f80a5013f7acd37729cd49babf67e157c0880616495679bf7be5dae75f02e15d3a0e80b5bf0bb8c725f9202f83301a3912b8f1860ac9ca242da28dfd161d2b90125ba2ff9fa2a2c1790de5f1e7d8ac16ad7f0bb45e4fe01a12364344e866dc516b02821e051e23e2bf9ef1732add1d9563a0ada1fa2c033d7713538d5708a08e62c36b2f27a98098845557392797ca5bf4f2c5f688797d28a5906983bd056e760638fbfd0b67f59ce9ab4f9c9a5986e9d5aa18c5fd51d9a1bfb95c175b1a50502054ad28ad557bf30a11b2ae662c22c7fafe24e883b2c644d3fbff422dba6996d04640ca021b150b6388d962283f333713a2b6a0219eb83f6bc06fe83bf8882c4676b35982e81133bf0d1fdccdaa93f8bb182f88a2171a8b5f79b8e7d042544b619708eb99881c75d60d1e2aefe8d3ce2c4662a8ad18cf54c3c45b9ac125c940af28ce276fa115aabfcfae8ce0700834146a54107e2115623ccaf39302823d2df64c90366912099af7745eee57db1c708566234534c70ff89f595ec0c171def839a2dd74cc568b26d69beb051d84c38d537c2a27da2ebfe756f068069863e2dc3681db1264dc07b3bc3c33e8f8fc804b7197af76bb1adf3cfcc4c370280e5ae89e8de1f6afc4df3fffa7a43f1138b5efac4617b65e0ac887c759d055bd03a18214d7c51107c39ec38a9df86d6792a4c2cc8a9da975eb1ed8b69c7ea8ffefc71d3000a165adf72480cf4dbb7a99db792d2b4a10eca0374f464c117aab040fe4074d9e73dbb77069c1887b8b06dc7e5b8ff26c62a454f7af40c249d57498cf8a59a395ce3e91a868f67912aeebb722f85d9d942a84b1193dd8cd10274759078cf5526d8406e51a1084b1f401e7e33f10ab9cd24fc367c7056c763fa2c4b76432c3afd6e196b3617ebbfdc7da06070b1d5939101c8db04c4b9c1be354c51c45c112ac2c7ff173b8366b35ebf6178597f2aa1c3692426c61a1b7a46213010a86597ed71eccc33dfd2181daa3e04f19b3b8e46b07dea4fd27815f4ff255a0984d53f2a5d372fcb9d3a4b8ff85e7c2eebb6015a8c0f6fbd4177b32ea275f1cd85201f6a111234f0f2972826bc92ad555e5e2770fc4e1da6d625f818ce73273e7b2ad228925ca44199453471bd573b43cf4c1da96fbc5f90c5d3a7bb35b291d6659076ee3231af7e0f7c1902d5db39dd4af9e17fb1bc49a78a4d13eb868874ecc990385b049e84031d490b5734a9f0c10f8894f37b5174653ed86bcd3d4ad4f1cddce011344a01cbc2ffaa74a4ee7b415e6484c5ecc84dd3d0bc8a8a07c4e23b07e818a4d15f691e3064efe62aafe1548e53220542e109c0aa608e008a5aa0fb2614b4ec748132d42708a7419ad7c7647f6e8a2b738ca70d79ae8aaf386503710822d3fd0bf7fe2d49b3ea4db587483cc63990d", "0053006a", 0, -816215913, 1537743641, "09611c6cfb1a4be0795d450c342f856f0c0d2ac38dca3fc42c3fb18a7a089eb2"], - ["030000807082c403039b8e302a1ec41524a9bff5bbce1808fd8af45a30df5a360b0c1cdb38c8ec83af00000000085353656a006aacacadd5b4548395b7c639bf2121d5e620b76c06d689321e026633d23005ef947aa1fffab3f500000000075165526a5165ac3e863511f64f07bb70cd112b5fabe62fd4b21585ffed27564bda2b031a8681e7e05ff494020000000852ac536a636565654256943503073cca0500000000085152510065635153f81d9b0500000000036a0063c53e57000000000006515163ac5265000000000000000000", "", 2, -814157394, 1537743641, "26316b3be59f0021c89880644344f7ddf420121df315330c30d216193e8d6c18"], - ["d2694c6503004cf3b80ed2576e6c8669cc9cdcd44e5543a836302d48635f73664b498862a003000000035163ac0d3edf99866c45ab4f79066056437c220d83eb3ee74efddf69d0e2328298dc35b3c452fa0100000008ac006551536aac65ffffffff4d4f7e28c71b41bc51c320972179d3cbe4e1553b2e8ee2120e03e0199b484bda02000000025251670701370265e9da0000000000025353a6cd1103000000000165000000000200000000000000002d09fe010000000074702fee8342b32726223790bc06f7e84d871e6c07effc247a2439087a87e41e06411dfc2e7b8bea8096c4a4e8855d478dd78e0004f42864c2be0e3175aa426aa6fe9f56384ba7044254fb9ed24afcd39d77d92b44a70a9a199a9966d3f64ade0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057ae4fe36c7f837b03b5cbd4b313eb119bd91336b74f5d82a100b9f263a5302b98ae875fc17036366e39e64d82af5e82df0859a194a36cb574977fb607d928d901f35e3234f1b52e9d2a1ec31587dcf3a0014bb1e0ce8e580e26f62f69aaac9dfc9e720559e79590c9fadbca66041cfb817544a1189ea27edc4af084123d568b0312c0736a81de3bc6c0dca98004f2b0817186a1340d8058e94af11d96a364c95f0204f4fce2ad94969e9dde4b53157d0fe322c48d0a34bdf65da503bbea0b5d14b20b02d1f1038403d49b67046ea3362490254101627d946a2b2122578c333d5ae487269a3f02a93d63ffc626b80f31fd3cb24a3ee37e0d9ef3ec5622be1ea42b9913021df14314054feecdfe3c60a079c798f6ea9ee755a92c47ac8e49e1fb8acb2314021165f3113cc463fd64f72865ad8eb54501ef05f3c8fe71e7fdabc70f982f4fb70203abe3f79207c3360fed8a4a0c0c04f8658cc7afed35191fa850e7f6ff4438b3031dd1a4125d2f15151bc0fd0897d64e94db568549e1cc95e27fca75393d62dee103203d6459cda561ac2c390829622abf7af38604ac1fc449ac2193d9fc423d6639f2d21b69e1272e2fdf250a7e2e02047049a738bc9087df52c9aef6ff976e4f92fc62c916e437db0bdcabc26538ec0ece05fba3a7ec048a51a0fd5e77077bd722558eb76e83c8df52b25cdf544b27b25a4d8bdba981c1a5bafd116b169d0944c8b8981a33119e6321204405af7096dff2ed10fac694c4dfc37b97410032686815903a02e1b34ba9fd6893b5ce8f56af6d952160dc20874e4b922f9299f107d6e68c88cf73d58b4accadbdd6785f1ea850a348279cc999829f811539e1c77060deee68b5e4ef3f6f9a077f595057f017530e9d649436456aca7f47d8406c96960e5919433b7f0899d0218a1b9d71a2c903ed2aed857b0ec4bd4ea18d9a830304bc0260b258dfcbf58904a30639c4bac1dba34b72424ff401ec3675058881f7afb94d8d4abe0c3670ad11c4e0aaf4f072fa568f82df3a5eaa0bf7aa407675f5920dc80bc43cd5656af7b5ff4007f4f38ea7ff22fccc670740d1e6c16647620c344ce97938f58c127625e201e99ada6a6b16af7f8535e53db1c7704b9046e3b9a3d8600cc21a68e0ff8c7f19ff1f58dc3a77932c3f3cfd62aa7cb1c283bfd1e5916e6941bd955b9ddefd17343b0c89841e173ea333e7eb39a78f22234fb5a0d4804d03a1a0450874affbb2abc0c341d729103e752a775e7ae3b1934caffb45625cf4712ba563a54a6cef0a530fad9491dcce6bfe51267d53ee6e3be54646c156f6d60958d9fc4407cf53a5535e32a3af42d0402338bb470d7dc3d4c58197e912b268f0bee8514fff2d4b146f23696fbe767eea131b7d76e0fb17f90734d5326edd616789a2e7b1d5d724141b9eaea61dff0b36486dfd01e8b0fbe9a61ee85d40fa9211bf5f1b966e61a545f261ea0e25f6b39075760bad83b1cf8abc698ba43d7baf1cde1a6282520993c883341d66a4c9cb7e0f4fd8e3cb460c7cd4e9ee3b1d136a843718bcfb16325443f385255d0d541bbd5db1de299c6a828f4dd5018269f393e1b93c66cd46918b1610710fa917d27b39ba8428e966d8dd5c7c6c9882aad9ce34e6302ee0980ebf88b9f71685318d2225238eaeea1e3b2a66275dfa5183adc8c6a421ad024a8ed77617e01be7881a9d1860456e5cd42c29a71e4b4d1bf9e2dce5077545a93dabd743a3db048c2f572b81a492ab877047dbb56d1348054675ef8c51862173c5be920d57aa2e148d999688c59c0749296e2dad23b41c5622f5568de962e5d0b2b19bb7fccc0e10a6773c30e7b9634996bbbd7665c03488101ba576dec9f2ddf0a63307cc0c35d9108310d59784424befe1a6d84c9a38a093f932c49ccc725307ff30a2fd18f88b86c7e181d264ffb30abace461d9c14a38b61b181d865dfa440f78a6d11c9485070b52fa8867cc3ef3646110c58a69c9cf41cb48f9ec812f84b3eecad354ab3cfbead220bf03d830d7ff91897ba069860ef5a96005e6140e67f31c189f7c46129919d8f0f091e41761148c66fb7bd5c04d335e85355b8ac8eba989f664c588296893ab137a8cb7c1c9a204f0996cdfdd5faffbc3fc2b8589f166961e5ddeae3e978bf3b3f4b7d6d2c58a8a41b0580584b681c11e2d1cc8d06afca79d3a9cc59be49815b65d2b915d7568610b5bc3e5859aeacaa074e48f4a8fb3718b36807032107b250b327c570f9372e09d2eb2906a401d1ef266de032fa9594ed4c31c60955cdb5bcb90900000000000000006778c3030000000044700eb82ebb3f035ca63b34f6e77600ac6518c5e9c459c5f1f013bae934db8b3d59d0dbce7730363dd4c47c53015489c1471964889756d775c0b72d820a2d8ba193171b10cc42e5949d67b410be6b5b101ca62a6c8140496a91321e72206cf3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001959ac259be0a419c7800c35dc4f337628015ff0318849c446ef094bf6dee0b8964fd4f3c9451b2b550da6f5d1007c4388d8181b5e5cab9f22597f9d4459f1066f2531daea4670b3a72847b274761001bd64b32200b6c3452745623a67867b9b1d8a70513a75353db574980b343096d0c2f3d27d087f3f210ba70c41b9106fc30306f6b8d0dc2ac0ad12572384c965269d4d0373939e2b514f53976290d5baaeed030f9e7c58b75668b0b3c5eee4f135b03df0671927e726c41115e57c9d19a27f7e0b03075bb05fca6849bf42a251331c9dbdaa5911fb2723adeb7bd731208473d863530b8853f6b30dc5f081b48bb29fbef643180a317a8a8a1734172e50c39d8df602217b72096d176895183d4d64b86b5163636dff883a70745b0a8b454cb8f5613f020dab939408abbcd25f9385b2516336133bc20d00ad5aea3f819dc638830241330304924fb01af4ea72e54dd9a0315f9e2833e998fd505155a6c1c38266187e993a03025c311555a12e7a39cc1180eae9ff1442ba14431990314d1df01b63c29706f80313ddd64129ba3ba101c07462987f7334cfe7de230ea08e7d2f4cf21c3c025beabfe5f6f49427358e0a9fbfb2db1af9cc4cb0d0cb4379941d5594f28224e2dca40648251a30ab67d3ac62c66c6cba015249cbc82cad246a74dad6e4271344f077c1ed39cba200c516333410798507988b753392309cce02685a28da7cabb95534465dd14be4d60f3b39a04c4903f0929734994b585b93fd092b4c4c20cd7175f536ba3a72f75e5aabb634729ba617ce438c949c13b48099a8ea50fc5c73343c27a4b4e435ea8621bcdf1505ee4d77442ed6628e8a11870141b11b521fbf2f2aa514257246dbdb66a543fe786a45e5dddcde047ce4952237e8678a6e0bab5414df0e2080b9e3d4653c2fd21a9091a7efcff8114252b90a18561137af151b48ed808f46d7bdad2ff4b020a83a53b91203aa7ac1f189a2392a60c083bd1f16d2a22a3925a0a7dede1c33ff7eea7f4b4f56b316d8799458fcd6950c9235301a5a4b5dfbb34b4cd3867f2d96b3b1c30227d31b779cc051e0d9de65f1095c714527f9efb39f96103259be42ca00a4c910d80068a6e77073a4c944eb8f807810cee5acf94938c88f3963b70cd80a017ea8e8c63eec99db2c199a511112bfde09dc93659dbcb57f42c27f97e79dc7f7d78031e66b671541954e0e1a2fba17119a0d17aa7459c64564a7a7c1e375f3fb36b2f12639fa5d340a04ef95f4a60fe91b87a25d8e4f3c0724effac39a683e201ff0fd0b9d3552c7a5e2304624699217203d61d24d2b9e53c0d644a1d3e64e86f2c6816ad8b4a0465d03747ae76f827304d14ecb95c6aae65a8a5fdc5d0133fe4f8eca3a29230f78fdc960308c36d163219fc079d2b13b94981d2a78a5ad6337922c00906746031d479442944ef8548ecedff624da4c5dfc744df49e5c84db43503575a9e092e3c6fe568957ee71e7ef7ca92e1f69cb815ebab4035f73943a1cbf5f8ff231953f362659d17d977b7898656605c71eee56faa960c25babf57bf78e208683169e87d4f3df72d032ac377dfc1720cecf89fc40bcfa4250593fcb6a0408021b88f152b7d1328c5988a6f467a0f59da7580a7df9a571b7233533e746c4c220be73c127f798f6130f58710b93c5527b8e03bdb5bbb6c65088cb087cf386c5d9185ce7bc67985609da564d8e02a114ad58efe0c27e882f57bbaf5488d7e843160101109c0750e9a8c74fcd86566f5e3e34d30d2ff2e266838cfc655dec0775c766e7f6532c6631c2bee7703c2707a3a140a28e41a441512e7d2a4baed1fc37dac2ab687264b94c0b84ccc957fc5fcbd5f7adb89e65dec6f8c8071500fbc96bb05a392f6d780994daf9f52fcc18d93458eb63ca097b393f9d8318496bbde14512d2d30e8345a0ca173322e51e0cc80587e038d1c6018a7a23d3c7b1a1f8da9662caf68f4ce779e2fdce44e2a5d84a4777616e06bae14bd11031ee1f0533b6a4a72312f8143900300070296fd2e1404f76840f2025fa707a3efa556d0a40e54fc1a475dd0b317515019cdbf4c67083606ffced7f71fe48639221c32d1e65bdcacd3075082fabf654e0ae8f3563e7c5dcc010428bfecfe6ce0aea75c7c6a477e8250005ae5ead4cc96dde6aa642e9461e673c08aaa936b90d93098e45fc9b95d0f44d25edef29f1ba15abdf7b605aaf87544b98704ea08fb10f2d6bcc8f443910c09f4a297f3e3e60aae647871bff4e19da501c108b982534ee80149b6dd67c16314fc619a25bf17df8f21f4f887790a09df5c878c78b90c071255ef55ff643a505c496da572e61f6fb38390e3fb4b9a56de78c17ce8e388fcca54afb800f410823132d441795312b8147c258b88102824369392a8b1535bab6e3ef731c29c945c9b3aed103", "53", 0, -924172292, 1537743641, "755f72541f5674ff90c51fbfacea695c683244b84f2587bee4317365c9e3fbe1"], - ["a3c3903e03d35a2a29377152ef993d16daf9fb89bb1e229b8f2b68673986efc9106d71b5970200000005516a535200ffffffff59c6a4c75a6b50a7359114c5b2d6dd6be2409efe3e5c11b861970f89d6aed6950000000009ac5353535165656352ffffffffd4f108ea85cad09fafa2a6fcf817bc51164dbab89366c91f9a3b1e8448ef47f90000000000ffffffff04b47bec020000000006636a526a6500bc79e6000000000005510051516a4ca1cc01000000000653006a6551ac48a0dc020000000003ac52ac9a618aba0200000000000000004d67bd0000000000e3e814829487debd1e3c935133ee6c5592a4efd0a59d0da853d808f00cf9d561b9fdce3438713468213774f4944ed4a931320d5d3437de0c20c41d79392e93ebb6f3b61bed6d23699ea08d2c56ce42ca06c247da55c575083090134d2e413b270000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000068da7cf775886601d73b7268449bac300d125b0fb947dcc06336ca36e738de5cb99e849bcbb50ec035fd83a65d8dfcfbdc62a505a8dba0ffb5151c8c4cfdd30fda6db0836fd90b960909ae5ddd3021d49168735a904dddee61bbe43d290c9ddf3121b380ec16b347f269122f1916fc8e785f7cebdf521b52b41b96eff1e65017032ccd1675d9437006bc510fb45a934fb29e6d66ddf60071b99b64c315c397d07e0218eb4499729ea82e4cab79df771e137566f43bbcde940866a3b859532e5e3ff40a017b6911541d0907aaabeef3db2c18f489e97eba28cdedf392dcb33d103ae283bf6182f6004d975f7beebe45c0e8134a5dc4e6635094618bf6f55568372a5c15022d766046d347caaf3a24466c400e95607353972ee2d5806dcf080aa4038e93c6032947fda677fb6d28d04647aa9dbc0095f9427739f956f0ddb940115801c1db1f0305ec565fa55858ed8d7cb274ba6a958e3662adc552765a38f002077b7cb942990320b36628c5eff2ba499deda0e6c1ca6d853c96939321acf9838789110831c7030204eee7c55b543e98e33afdc4b2434d0b000e379ee5ecb79ffb52cbf840b7485f96cb171a3a43bff7f2de6a69381df2ffb7a801488a8b9bf302c8f086e02b830aba50780e62f41f7d0f2c3ef5b3d99ca1e24a2dbd1967ebfa4f2909fe2232df8ac726e299e1c60da646059f1dd11e321c412a5a97223b2075eca18618e29a1cbb56495ebd1f980ad60cfbaad36c72f0ef77cb6353af9294c53bb17465682129ba35a90c01428e088ddb4baa112e384c281b43a52de4a4ec9681b33cb325e6d299eb29f4150311a5fa9a4242501083883b2df2adbf1a4a076e81a58f6375f96c0009a1c862c41df4ccae922af849993a54b1067da42e970e245f2397b1910235b327ec729f98155d2a2ffca320fe14a54b66a104a3c95939b53e4199a121da7befb1d6497498e825ea2223bf86bb0d36a8b821edb17ee71afe7fbf8c9b67417f5f5012926bf32443939a05231e0a66b61fe62cbebf013b1099258740202781d82366d6f1bab4caefa45103e4109bd94048d1d580c64cea644ae226132a5d25695fb9b33b56cafad1d888b603896731c0c0177b6d09d2de7d963b86beec9d8bcddd4a8e21d553634fac67a12a2a013996f3020c5a82500bf49313fad0e4e5791a047495f7216ebdba88487d9638e7dbadc1ff825f0874610cedc6c9a83983724c08cf59ddc7732960017767f177d115a57c54a4321eadf4ae23b34b65ab46b9d6802a26c0d2fcc64921afe32dfa5ba11a78469a8973b7fe40e04b286ad4e1bb47d48c0ba91117212b72a372d185fc20988d01b839688bf7248bfcaa3fd88edf07e7ef5ba4343775308f22835c77d9c1f8d519940508a9dc1e343ed54036cba6ce92978175d2699a295f1444a746b9df84a8f4707dbd96d9add44b9122d70f3824736e72f1d219febbd49dd32266465541e8073f042d7d39928a9d5061e41d58c4cea2081d24ceb895bd40f9070454fc40f784c12b294d5f479edca85d908e875a0af1e25d4595b95aabfad53ac8ca8e543f8d9ead6e560fb296ae74f892b25eb86dbde86704209f0f274c824a3fd6eefe21397b700b3974e8ecf4f2a56e7c9c347cb92c6522b8e763417a9cff647b2b28794e2f6951fc6812c1b737f5f101474cad0b37e1e809761818dc116f25602b3c759b90a0f880d6073624a19e552af7e069fba4eb1772ccadcc65f1c57645aec9df8eebb5cc5391fd5f8f5346365266f45160d74396b6a116c06f5054af09c241f73d05deda0174d5389ddcd5621e617fdf9890c1e2b11d84e98241e060f957fa0c69f21eea16cd06d7433d8aab8e2ce67fb480860d883be158e590636815f0197bd44a4c679ee555f1aaf9018c8d889c4f9a8e4c5d11a7a62e46482e8becde936fea3a87c5169401e45949602d533f7056b904a557018337701d222648dc52e77eea19b9a2ac20ec1e5f57c12249e7a6737b511f0743dadf55955100eb7f1b2547ad4e5fd778d05efe17c488df7551571d0e9e31025b64cdcf3a8fe8669323c3a4bf6737e8109ae591fd08185b4c7191da39712a3a09764fe0232e5430b99330d8ee6213c60fb9f232d62c4768a290f143e91d7b8d0ffd6d98f7003b3b3a48bcfc28d967fba213f26e91f51147d6ef8c3821c5bb69e3490ed4ad2b5df8c4936036f7b30542f455dd4f1d0ba049bab39d5cd3165391b464901c453022747736079f92f49e2953efe17f756b86287f078e197f643ebbdf30525a5f75fe784840465b1978000000000000000056e1560400000000808dc5426b2c5b0b09028e384ea7837d1fc0219bf6ff88e189e3c861be6e4773da640f20cf5ba5dc82ad6d9ff68f0c50d6f26e0fc09d08c99ae9ca4db2ee485d5985e31d0d894f294be71f51dee120b12895df1b52adf30cdb8e2a7e57dabc5700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e4e069db8c06cc4357e568abbbc3eeb33d40e3d712cd75847352d1e5b72a0557f659b28b0e92329d106066f00dcefda0f74badccf9c97184283d138367de0ca730825aa81ea25a490ed115773ade1e0a884e10b603f33ecd5ba6dede4e2c8ed42a7ba83db1df38d7189717a2770b5b1abb8a5659b1bb79ff845c65290921d236020a5c306a136571f9321a2e47d8910e7f38a3b3db145a1deb4022a58460a505f9032f0576eedc29b6e12c019a2e36a52abade66ba0d1616af19cf5ce77d3479f64e0b01438cb4a8736fa6cb379ba4a6f6f7e6780e41f5d415666fd2be287b1b2e7c723cc59dba503f75f8a74db44f2d6fbfe1d01c68982b5d7fd7dfd7ce9c71dab2e10310efb2ef39330b556547f7a343577f62503c6fb8005e90b5bb9eb797f1b9c5f50210b86460d1a75df17f9440426e4248c616b8e421c4abb8782d36fbe1159670a603145726280d53169da1e1f3b8ab4f0051a158e8ac96659bef06ee5dc9cfea1e48020269af1c82af7101ede363a006ac6ba79399acb53de2e0b23292b4459cf87758021baa24b854349d28bfad6236b1c0fe95858d9b959a5d4f5e60941320bbb90f8d1cbdc1266d3e6a559ebfd53eaa83f458dbf65501720b967f8feae8ed37c2f93ffc537ae73cea9364d69c0dc242677587b780943814093408ea1c4c16cb62da301e5ee2003f7a6da90fc4931548b13cb8aa6e5b9ce8e80c083ef222621a3072c510ef9dc654ed5edcf9ea749ea49de4afed78e0f8e38ee66108d4a07f7a179eefd46ba6cb29f9880176bdeb61a9b1de018591083a7df588c9526d1f293a8d84ac49f21b14247d896593f22f26cc54cc179be22ebd9c7a97e6cb9f597495e4b1d1b884938bc88b7f42c20497c1ca4d5d874fc892526cb3d80562c21f64cc98ca708a3d3f0bc0b8b87aafef5e63c864c9dd57a281ec72495231894f58f2cfe072adb96b9ba62b74ac8ef171b4d0902eae72f3263cdd87cb46455f7e5ff36aea68ec7a7e7aa3347e3eedee1623c5e844e09ccd24ba13249f368ad03dcb428e7764b307f7872dcb0413c22773c89854bd9d4b7f6c8abd3eba2ff589fa6abfc332028399363eca271145389b24511de6f0c6d19483d895ba0563e1aa82fc5559245ef5382269798d075e4fccd1ed74f833446ea68436ef7f661ccf7f2e9ec703e747d88ba27d5065b8f121e7acfc13610a85d8aa8d8b4a512315faf4aceff6d6e9203c0a04006065aa02dcf4fe65cba71966357c324fe34bdd7ccc610b7c01f0b7b7ef5e9288eb9b3ece7890360d414c5b8c7487ef88cdc15f9cc5aa849ff5ed77100a532e589739462a1ed7f664849ab37b7511cae02ab8358178fd1909f3d0356e71a44f5bab6496bb4114592981e6af8b1db0a7b5acef82d1e3c9860e5a59d3088d04c114eadabdc24dd6725655f4e238608918b1c8c80c1c1f7a43244f422e182b082fce65e16490f193a2d0e7de948549a0624ec6b53134af310306f6c8b527c4ac00709d193cf2db25cfcf8e2f1ef3db0ee0168ab0d0eb36744ce4ce983d786558a851af1df1b097c222926ff44bad7863f66d27ff256f4ed83ac4fa8e35c75e4bb5c11e3b4fd226c12f13d4cfbd75e2bf93bfaaa7613987f413a4bf57d75f6a9a4f86b31d47727c923e666ecbc54b8280772b7e3574e68720bb448b3e2e4cfa1efe13c7bd1dc70fe50b61d766f248e8372b2e71ebdc9f2d40d7ba7638de6ad21eaa65738786df9ad9594a164555211e855deaab32c46bf410666a5b428c961f20795a2bf1f4c54003087e00b160c829225e77b86220aec181ff473ddccb7ec27bf9c7f23ac4067c0989d60839530ecf98d1b537c0905f3d59937b1769d0704edd95cd6730e4bf493b5f8ba2991a9ff8741f35c12180f29b154ccb0d33dd179b983b1dd5b62160cc20612c4fb44efb28670f38a9bed575ef1de345fd0aa44bc06e0e27b3f031b81109cf10914a3c82858d25423b64e0c1b747930739710eed585eab82895bb3e03bc594213eb93564d7aa9588459feae2814982f164f831bc90a2ee841517e35a29d4afdac3cf1501bd71935d8568f73b03e8d3bb087cf062979ef5fc617af127a1861f43c34a807b9f205ebbb195b025de45b6a52442463a335ac390890322ca404a0b206c409f971415848a17339f9256b6b0c427824f5454c035f7b6215d7056e49d981685dfa90c56f06b16be60f5f2e047f16eb59035c377d38a0e2e94f6adc4f81703b80f6c48fc27bda8f2e1de4a14d1d7ea5e96a170f679594af6b091380db9b9f91ae83abb8fcf42d299d67ad2902bed85605bc709e2afc1db148448e408b7d2c57a0d099374c96f46687dd0d7d0fd327905d6998821cd211d343d3abc552368b131273aa518f07c6710e5fe24439984ef83bdb68300a986f67c38fec0788a6791dc99245e0d0e", "5363536551", 2, -1065451667, 0, "2357f4dac781b0bae377fec55c0da6006408b2c01729379a78a99a897b3ffe1f"], - ["030000807082c40304a654d0adb99c89d6c1e5fd32fa537b90197da5fc1a63087d14f3377e86957c1b01000000085253515252636a6affffffffd8e7999563e52edc03b7e94ad70eff8b0e0b7f7b92a5c064f8826bf4f33ebb0302000000016340877710c8924915f8406af50ccfff1b04803604a911139f227a2d7fec2dbe0fed4ec9280000000003515153ffffffffc2457875a58e152ba6a88af4bcb8f0a32d3acba846996f9d26507bc2192fd3560300000000383a72f004f5ebf00300000000066aac53ac00008b1be3030000000009ac525353ac536aac53932fdd040000000008ac000065635200658c8dc300000000000800516a52005363654cb2a5ad000000000308aac700000000000000000000000000eeea17b04039300a6f64da4c64576097e579cb81f8f702ac6a23b18b07ab986f73770c0d98d49e57321076d0e91e51153430567a334bc4adbf61cc131a6082b0a8bf0f8c0fbd5b3cb25e994addf52208611b73e4201dd2621b182f5726d0614a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bcb4c214d9789a3afb38c2d4223f0f8cab48226de5c3664c0941e98468ff090a220148c7b6b0ecca8a7d8c49055f9dbf9b4def46f280e4292b54bac98fd0d98a773b7c575e212fccaa59717538a900b7132ac7a3d5e0b110445330cb911beec4f59ab68948ffe9633d3d9d780d8143145b055245d029b739afd63b92f1419e37031ed113788e56f7fd65020ef5cd7931fb6a049b57bb6ff9525f8b3352ded22cea0317eb5af1402b9a378f32bda18c3cfc8b26970ec8c7147c75f8970cf3cb0086370b04e9938725233f96eb13b451310855b23a35226e5756f350136f52b6d072b206601f4a0592496b2cbe0df28f64c2701024140751061a6be0d8df0acfc5d7f903032bea8b9a969cb81d1fba7dbf7d364aa3c45f9b0161a02698c551c075dbd634a2030d7304945dcbb8e2b8dd3224a5b194a3fddf64f49fa755e996536ef03eab1f81032a706cb955616e3769efda4d7e8f2eb2b99de2a35f2dc0f459974a01df75b93002113549785d5cb967f5d7429b026e1e5a1939a9bea304b59b2b04d55d16c2472d0318aee5ca9d0dfe2498623e7a123247cb55ae8ffcd154cbde5cd232f793c51d79214f9e61dd12fd9cec9bf0c9336ec7ee1a7708cb6f0115a6a1e99fadd471d5aaa9f12de37f183483b6ea2527a440e8665d2587a33b2058f500baf503ecd30fac3f6e72ed3dd79e46a7965158f7ad7b6932564c4ab5258b5e15958791f977cd1ae17e2799a2bd3015b69ed726eb41d0986dfd314c6cdf4a1ea13a0ffc0b615bd444ced947337a23a2e6bc922fdcacb6f4ea1b77bac10863ef22654aec52bac4ce7d95b7ca7d438f4b8b0164bbdb558a148df2045d72c7eb39e4cf43ef63a3d68cce9a403ce608559145d0cb1c958f0b94193d22573fb8d78ce5b7b347ba0ac3bf0c5d1de872952ba7fc71284b5b5204c6e2627390040a8693212acce6734ec19dbb7e10ad1e7598bfaf6c6b100324808d766f029123595aa39c440483b475755127244ef26a406ff1abcdbcb44de6e70a918c4f6b3f282772f9c9465cb6fcedae348efd5d5eb9962f7b2c70b1ce805a2539c8121a96afd27fc7b42f352bba899ac0520c37ef83bb05c679b94209d1ae6f059df6c2197d6e23e3d29d5f0e1e70126d71c4b108a75a8d21551c5ef9e8d1982bcfab04e69c849c11ffbf4453ce37476a35cc505d3c8dc668d43fbce894320e37ac344b9d9acc8feed48edc68d35b3cc080d7d4b26b083cbdff8adde8518b2073e37f86f49f9c2a39e3ee28e85cf2444a329d786328e1b06f14c2c8505734fd289b9063f8562633538a2f17c2a394566a62a9ec63fb762a60725398929d6b43bb71421357c7703653b04613dbfd6d28c9312bfae08dbe770b9cfb710452f2a89f4d91cfc44453dfcd13829cced57bc675918d262a8594a9493b9d6fed2011b27aa1bd8d5e3727c65675c2a22f03da935041884afbd44133f97b6eb62c5644c0be0b783d6a388e620ed4b1472e7dd23282e952688c7f1b1ba6d51786fa8bd64fdcea9860594b12af980bf45d2a2a07fde61c4b2261bd01ea37583309d391abea258130bd921b26af8002947434bc80d5b6e7f3d287eafc81794a29eb7678e79134b2f70fc4bcff5370d8197ac03f05dec11f00908691cf0e8ca4d08f5a269c82190c3d30ac1c663c3c68fd813458f72aebd2ec9d94ffb33834f8321e0602e0b74496cd5d0da878493b1c46a9eac0f9ed01315f7c0cafb84367e91c5582fffc587cf53b2e12445e96c2d130175c94bf498ecb332f2275575a59ace6e38663570f651b2e05c495e33e73a1a19cbc473bd7a77487a02d293c7c06fb0fbaf1c616a494d6663fd6b21055a1811bc8a9b15957aec06ec71ed22b928b702bc443a6109cc1179a7b2cd4a001e2dad9ffdf8bbb86db02c02cc90bd047aeea86b07ad13154d67e2da329385491c8f8ebac17fcd31409bbc5607a2bc6689d78c4c2fbf91ddeb78b610daeda275be8ba0509b712a0fa67d8f033b4a1257046891aa00aca510c4ae7a7a0629f945af6e09c171f1066a6a92da9ac885176a67be31254402694485afa5c1646ae0e2f4a69fd8c724a7b0182e26a68cbcb7a87320e5b05624dca2318143f7147b77cde708a03b0aaafd1eba2e42f871d001d9bef7f84c6ed993086779eb1908f55d7db0421e3dbd7f5fcb4bc12e418edb3c06d611fd9bc689c4d1cb4684924e5448fe6e0fd0d8d329abffa8794e1a0a18a1455e88e71b3e6a51c8c59a1d9ce2142d6086d8851068a4731ed051347601c813b267bf918d77273cfb75e7500000000000000009ca04b00000000008c82c46c8f2e598fd0b9f77fcc768cfaf4b38de5166a15523780d77836efd8da3cbb1f27e963b34bd9cfb591234365ab2f71219cafbd834954f76948263664e1fade6cb4a9d85d7e6cf51241a7ba2e186d12e818daaa074e3c048b1dc8a0ca3f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046d7ad9bd70a6d80af9e18136c26f654c16ee5c4b394515ee8e135e31c069990b5a8fbef2d4f39559d2e0954e136a8d12cc41aa1a8ba1f650524e55c4ad3431d1133ae86ab7f189a6330398b3c6217bd29900708620d21d9942f10992572264737e6e0f655c69805d11a3cafd20c62c8cf02e78f43e45cedf9c2bcae3698a2920312ef1244e88f383776831b04d261ccc6aaef92a36d98e54a4541bf653b47eab60216d7e99c9beeb1cd97322bc491fc7d070acde0970558360100a0adce8d75c3b80b00f6355639dffafdc4b45b82143b909d2a4393e0bd5704b9f6bdcf7581a691441cba54a1135965c65e5b90572e39093acdc2967a4527dbbb6d44c136745b4be103036acb29eda6dba25b67a782538bfc9f1b4a47dcc839e93339d5aa70a7b9917a032403c0cb97cb9bcc9d112e7e6c2fc63c23045eb5b950b051520f65c0e3cbf8a50305268cca886fb8fd46b6347df9e00c686efc7a6a3dcbe3adc7b7748e61f32f6e0213df7f071a22083c080356b7d060c666d1633d065129646a7e05c5038e992dde021d58baa447833a5a8247d7bff3d6e9666c87fcff38cf5528c9e60f1704fdfb670f1b5dcb7fc6399bb71892b697a21f3bc5d5f43e57f220ef5c88b1f3a4a6b04288affd4c5bb838f51611e1b4921c75368529b6e259d29e20b25fbbd3502ed9af1a05b48da9ec55a6fbcc8b06f143d1fa720c9f7f5fb91b30a2224911c1b4c1b3dc5ee436671fc1fa6966eeede5d4bb10d5003e890d23cbe3fea8c2694daa82859e9dc8a8fb313ecf225944f8815fa746c632ae3c09e015fa45197e1caf016cde2514699093d34c4799221ba2dd2107cdb987761a9b482ef947384cca0e4afcc0fb78d4133b25db6c1110fe99b897ac2493aa60fe3afcee3229ed95b98a11244d292124f098540a55423f08b18a746afcfd1a2cbfa6221b8a632eafb5c11a808138947839ffb706e51385ad9e0b331fe072c14b65c838a0768c28176528ddee808da273c73b7e23caaaef27200c79a89253ae67837fda943c26e908695c87d51d648ab8702174789da7888991ee4048c168eb65516c5c2f2dfc6820f8c2801dc719755f171b9e9c85f933f4e3a0ddaa9d365871e883eb6e04a1f1f5a96ce902a3b00df671dbe6e6eb909549a71111dce16b07504653940bcf654557e5c8ddf84a28edba724def22044e24967dc4e380902d244cf59f774756754af072818b4299fc376259e0cff5caabde86b40660ed83540088d06357251c82a29fa9db7d2569159ed3805bf7e1755a8743bf0c2c5f93c519d6d88c854937cceb6abee57ce421adddac7ad88e253dc144425df709d5a551d88d8907edd406642ff1ddbb76d4086f0d3f2fbf696b52fdc087f6d8f6f3df971eece88fc0f5edbce5fef6c11545d42c148e7f7e1b685471df473fc2e10f0f943eb5927d52401a085ac264d5420b6c7130c81d98cd66fcbf02a0a526e29c2e98033044371ab8ad95919d43db18b37f0a9ed9b1a9ff7568630e4870f9007335cfc4d2b2c2222c7bffcf330c25b2c1633dc15a7acda507b3138e736ec601bf2fdf5d21eb5c19a069dda2b8269917b3ceb9db608b13577e3de887fd6e3d532e954f8132e2ba9a8041b47dfa2920f2ee2c7f26c487bde2439b6a95e75b717dc16e765c2c83137fc116f9418b67fb73c6c93d5a1b14501f0716aa09652f6b4552a7abd9dce05cb4793faaed5b458f3a2efbc586c149a04727ba09ba89538aa96f844e97f10393734a90063820c8fe10cd418f636958ddceaa0d81ff20c653bb99afd3ff195dae42923a437fde03c8b07297c58b1224df9e3f8c9b3a14ff7edaa729c30506bd878a6f8717690e9cdec85531735940555227a581e96b943a47ece80bd95010cd060877a2826cce33427eeea5665f6fb864e235a2eb6480f96da7989b3aff3ae085a4ce00892461d1d87fd2cf372f44bf7d98d2774d955a1c232fcc759da642325c77070736b52fcae21e890fd7f873384fe7c124a11621e37021511a9d38a75f497480f43f60ce0c4fd913715ebf48cb45a7d7836b02dde6598783d849a509a2b4fca4efd74b623c7c4307b72d2c1d0b95cd0b4b87e7b37c39a732fcefd17ab55f403924b999139d50867f688f60f44740e816a3d3e589ee9dbe8b68259915bf3eb3425b4ae515cdcf2246f4842d71c6c1da72b16daeaeeda55a1408ef1eedbea01d273ea443978819548ed603dc0a873e2b3f70d55ce93224856adf808a57ba616b70a13ee2a40327b7a9e0282e2d08a5ec9ca16b52136a64d1897509802b8585010000000000000000000000008a175c37c94f29a2beb6d0b4a04662479d9addc46376a706442d23eb664eefbce516b827d049c8b98be520ad2d299ee2196e90cc1af43c68ee0be115ce93eed55b7bbb6f25358bfae6fb326c66c3bb1d1cabde3a4f8d98e0ca5f90f4e5c941a4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c7099d607fbf03ff1f89df4601075261cff7ba44a5f67ad8fa7247a4d060347dd7e50593990602446a9df2e2ff1d938347921d21bb22c0d3ceb8fe734921ef1a647d4e095724e3898dd46e64ff1a225756eeff0108a81b0cd5d56bcc260f9df352c74422ef505987d126c9b11bb2a9119a1bc3a2ed8f91298d4f64265bcb4ee03225c3115b9b00f743a4d1d535ffaf710b356a49adf1dd9044ecacbb24e5f02ca031ecd34be3bf52f772df4097c66e29c0413a08bd3e1a128343c7bb77c7335ca9a0a026413c8630428b1a9a1f7cd29d9a1c41754d8685aa779982423b858d87bb038315cfedbd1868ed9b50e4f32a2db497867cac9347711fe23ecd52c317ba11b70032117cde3ba7beebec198a4fb08767e544a11f82c1c551a4978e85989e0e1b64303291a505a83f6ab5200f6d905ca1fca84d2ce3965e9e6a536e83dcabf66a0cfd002030e8dbf9a31ac0e4cd07adfb61340b3427671024af485d7611253f8acfc6ea2020c1c669b088e69cc60ac160c993c4d67e2f43a28a2a0cdb6b220f59070f2397e031dc1dab28a7cef373b89583af8592503200194328f0fa1e95ae40a5ec9575599ccf8ef457b99deede97af06a4200280304e10fc166af707f3761509f4f768008073a5eaddd65cf4980c278f2702aae71a016f62f1af7b16a207af731e3aa596e8cce4d79ec3aa430c8d1d03cd81e846225fb9013f52d92d91b3d8cdc6f43e063421756081b5b9136deb7061f1ea3ad021606ab8b07aac36ee9eb7f3e9388ce2464accd281e341dc30d6cab229c1dceb580a8b8075cb29c70dde73b28d59259f919160abf8f7c2d0fe01352c1addda3ce8c5e99959ab9186cca178c7b861f36174d09f70362282000c42d21e6842af58211511a21d88404044d66659534f638b9f34e00ddbc978c543bb08ef5e614654e259983f527c3a66d0972a70d5e2ba5665d93aff3e50e0d401f8b5bfbbcfe174136a6ab7659e528703c2ce0cd0ac0ba5be23e566afce3a82306a66ae222d63131e4da1d25ee60cc736af05cdd13ee65de3f70f8b6be0cce9865903474e3b04c554d1e743852662024b884b1833b04e7b2ec3ed00aa0207f7cd1cb0bdb43cf48d9ada0f4946c06b26b022227254ee71d78d975926353cc5412af6323b6734ce467d478dccd0bf66e2a6846c000b4456a6c5c8a0987b8d3b6c5cc45bf94690d7f9cc7fae971cef13c658a037a3c1b3b3911677dfe0f75e7acf51879e19a128a0418b66e9a25aafb0f86ca53af26416b689ee3b327c70d75270ee73bb9f916c200d75b4bcedb4240828bd2c54d179b47c618a1ac2e68bf20204de98c7dacb7f46521a9ffec8271519732c9a971ab7e3a340ec7351bcb9a1992235149da5a3bdcc3cbcd1228b758fc9cb5e8d07aec6aff2c70a80069ae8d1c72dbcea7830ddcaf2c9acae62884dc0e5b15e86a5cd61f7f6da93541f02ad291916759312f08e5621c50c9a6c8a6b2b4a7e558649cdbc5fd55df30a8e01065e3a898bff273a35b5cadd7e7093b68708c9aadec5f3a00405487f2012fc18b5f43206209ae73b3e8a3e5dcba44a66aedb5d59f8a3a33f3fca3dbc2d9a52b3476cb08a57939dc90d42447207f4b24cfb10f38053d6efbc7d79553d969439086de5a92ec25a77b1b9577a00c3595493b66cb41a13b736e326e9878a35ab43536ea5ea0ef7b10558d8a8adac05349cc80d8f3aabdf6a24a22e36a85add9f9cc9a061e811e4fc36a86660c26489b02f493519f3e5eecfe2a14af61e5dd32bc8e11996146dd0f1f16c736f858dc9be3d370563ee9fb410b1a316a668fa90ae8ccd81e714ac51ec24bcbfefc5668848417b4068d5440954e9db4e9b669ff8177c55cd3a852a38783a26d3a32d6c73d463a90dafdf76883228cacc8d607cc9c0f6d76d5a503102d8cc0e9f18e7b739b29f69546e3026c189903f29c422d088b4b2ff67d1cf7e26d5d1404c9edca5fe873b47cbd4003427d4c9b1a48f237eaea05045a6e2ae07e8923188778eaf9c433581a6f54b6ddf17b571897104015e4d6a57a8c426f967f8e6b660b78b5918a32cca87afdc1540c02a0586585c999c156015652f9988820fab7ddc991fafa1ddd5168c2924679ca14d2e1c6228eaa2a1a4237861bfba48f7a1dca8263a8d8be99b6e461feae99645c35c764edb50bae6cab3b0e8e3ebc5463019cc5a38dbefa77980ac9b4c85befeadf873a1affde09e4925f9b2b733812965eb0fa67371f4b004f81054cdaef34c0c1d87593060eacf6740576c567bc8fb8e1e73f74df1c53435a0dc9ca7dd2801b75173b00291bb09843c01662fc74bf072acb9130d8c1d09e2c2a6825ab986054b33033d916e07e9285f6791d4fa29fdc32d09fbe8ec289e6b50e0575e77d004b369b72ca7af413a758dca00000bb2996046c105ec835618a01", "65acac6a", 0, 1669342720, 1537743641, "b4168a83146369bef756477c2eae0b92439d6c806d42a22ddd5cf3662fa45c66"], - ["030000807082c40302eb25372156379e371be77226273db64a4190b938576851043c19a57565ccf87503000000095100ac63525353005238ea76429537bf8f57624c6d617f4722f50f8b6fea165c5b5da6c2a9b262fb2495a73013020000000451516565ffffffff04131d5605000000000700516500005300e70f4e030000000004ac52ac521815120000000000025251c1e300020000000005525253005200000000000000000197c5dd0100000000000000000000000086633216a9f50789e820f3dc28a1e0c7a4e3bc61adb066e377637d6b200aa9c308c7b3c253c53a0fbfc5748bb23888344851afc1fa6f16836d5b250f4a171f6b6cf817f2c98aa9cee084e5a243d78a43ff2d607b1d51ee9fe20bf20550b5587a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000caec02e6f72434a0143d864a32321081e89b04e9b20222f939f1e6f9af6c66d73eb692a8d57273df5667ffab8760c2fa63c06b51421696755294eb37171500755e7976eaeeed77b63d4ecaee3808b6060b7a88e121eb53e963004de6bd657e9b7eec9854ebe59f7cc0657d66aa37de89f77d5e0ce10c527b12556e145281fecf031175bce46c0cd4dfcb608e5b42a0d4f15bcd1fe72b6ea81d66059f7573020f93032cee46c874a2145f1caec943ef2547937e91b5054fec240eadb8683384421e970a027f08293a41f51dafcb63d5476014230fce1b262920a7971d0c245b95f84a2ba788d233bf39e1e3771892357c99ccc46339b5119679618ec75746b1f4b28036030daf707fb213d7c1b7731ee0b9debf85d1593ce8ddf397af32a2473e30aa23be0329183b7625faf64b248894926957ceca557d9a4c043c8ef6c3f38d74d30863fb020de94c140788be7dee28621b840a5fc0c1c381113a26054bd9f6a31651e37a6402234a8ead250a98afd6c9a4616b6f11b0eb4710b82e2bda84829601c59915a2180213978cb14a2261388c821dbc7161bfdadfe23a1cb4908addd6e499c67b28934385281edae0797fcc239fce1c65190851a14dc449c1e77321192a02065616bb842e75dc37ec52caa135e2ff7d9682dacbb31171cd574f9d4d4c08f346bdc90d0a01399b1be90584f112d045e1c02e16ee7a2f215911d258bafb0bf7a56e3b82872e1b88022008276ca1d889fe212c6888260ed79254807335b0a00215318f9cc3e92efc94e4d2a135e00a30ed2708a3ed396e29bc2ab7019b46e07587264955194f1ae122888d72d4a662c9e26fe0cdea950b67ad8eb2b7617bd59f782c8be257bd7c307b13d7865a3cf389fccfca0c89a882b08a41b9235d17e78b88a7d34c90046f6e632e478801b53dbcc7338488519c585f390346abf70f3dbaa7e2dabae78765dd2082876140ee8aaacab6aa9e7a2d5a819d5c9b8b38de8abef759f7a0ba2e474c66a6f88c88fe4297c4a86199c006c03ce54b48c502418d923775b513c76ff623d620f8c6092ff6c4faa58421ecb4e138a170d1479933447a2ef0de68f6a39c092c0d7cee1297c16c40f0a4203a54bba947ae03a07921bf046d28ac6737587c9587c85c2696fbbaf55dbe10a6cc8c810b0fcaf823f09ed7ac2e56a73f146cb142b4e63ef631bff9511236391cdda86d319d40648b8fb3fefb47d8162ab3d43409b0e6aeb410f0440c55796bac22c718a13654ec96d108068c57c90a6b0afc8652fa92ebd033be8659466f438cce6230de276f712d8db8897f442de7078e473691b6e13fdc03a1717734306dbd7e99eff895b4eeda35cb4fbdb12feee0837414b269de632dfe5cea5480cfd0da3200f1b168923d9b4eafd9e72aba7695393a90d8f866d47d54d06f1bf19f2be563b9a51a400bfd9d3eebf637d199b8b178460512b759262c68c6a3da51bba1b3626758755fb2242b9d46a1640e2d4fe46466abbb55e828cd7a048531470d1c34fd896211a5b25248d19e1afe4f4b16209e1670003fd90084a6dcb0d5bb77e9f4df12b3f2cb0e7c4f1ebe1e3b685bd7a499941ae7f9e043a804c00d60ec7e50997ae6af455ffdbab88392edc6942d17869db2ddcd11caab485e7eb222d3b380146c5c9d5ac7ae2aa868b80b5294e0c11c7bd71f9b55afc6f8f407944070382ec443755e03e30cec609aadac3eb8188155b1688449c8f914351c93485ac01ae701e43074d079c85734e8b7baa373a294f15ffed3e2570dbca4520140f4082a9a70f8a59885ecd2a26fa4fa3b653e7f4b68b426522d7bdc6ef997e2a5d949a6e93800f6c0c2dff6a30cd8a3629fe29cae21fb1ea1ae8d861edf2965790b885789edb436d9bde71b4fc7b31c92af0e7c2ace798a7654dd9cdb65dc9e975981f3851fed963c5841c000d0d696f264816a42931db7636b2efa04dc7185a36f2266da1c034864e33956f4b6a4c01f000e9edf0c43779cf59ff49b1acd80d3cdd6420219f0550717e414dbee7f15bd872fd44355289d4ed02787aae41637a75f7ef1b251873897fed896d8c2237214ef6f100cfbf310f282e40c88fdc923c6f5c7dfa7a8c2d53ee4f2247e6efc04af7dc5e3ba9347f711435981cb751a51e078e4e44af2034ab238bb78a78fc6825625db7e5e5f34051b30c4b746ea2ba785bca88bb5ee4d73f340d5727c7a7622b8ccb6c3bac35561ff0fc4df0aecbf4f1440cf6f69d44f79942e4013cf88f4d10a9f582dc63877e26fb51886e064e1b17ac59c4b2db03725cd2986d1371fb3436651e1236389055f0c945c1921ea6d97e0f80426beb6387a335a04bc06c717a9b7783097a73a81fdc1c41379ac58e16709b181837be489fdd51bff805f563b061113b536c915da6e43adf2c38c4a7f9b143b7d1808abc77f0f", "", 0, 1941882496, 1537743641, "32b852ec003b13114fd8d887d99acf4bd19026d4b40a271dea954868a7dd9603"], - ["ae1afa1e031c551124baad9b3aca6006b012bee832a5a9ae31a69216a50923892c493b2fcd0200000004516a6353b5617648bf07b030ebc12469941a295c30ace440c009de64b3af215b8247b6230c60b021020000000952535200acacac65654847a8e34c784e9cacf78e9a06a1a05e644fa8050840c64c3805acb9eb7a5175561bb361010000000453656363ffffffff03c1104a020000000001526823d60100000000035353525cd70e05000000000552635152510000000000", "53ac5365636a6351", 2, -960467024, 0, "4d223970fce91663cb4ae2623fcf124a8baf7801650b064d5f950cb52d73ab0a"], - ["030000807082c4030100e8f01e71f907d724563e0327cbdda35d2b579951479935dd0198d91808b9df030000000600536a516a6affffffff04d39782030000000005516aac6aac51c68305000000000153fa1408010000000009510051005251ac005379172b0400000000055265acac53ee0664c6090400560186ad4a00000000000000000000000000ec59f0da4d27a2488b65eb279f7524c63bbac10b38bc898b41f0c1354f88c47020d9b42581782ffa600f6b62b53dbe9cf3fcf6f484b3a02cf571e29edaad93a9b965c04c3fe1d88823db0f4b59fe0791777108faa0db1574ee1e870d6692e7550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000071da5b145f247700567a39dc7a1ece1ec03cbceca5c5369af8e04aa9431e83d7a825412b201f199398155f0c5ca3be275f85a9754be6d524ba2b06eca70137713cdad26b50660453c06ec3742067e6549f885e6524a888c4cc11fb5f75bb1faccc14b4e7e8efc02e07b8625fef06ff71abd32d191b46e9ba78c49f4ceea47e4003072fa8fa47695f819cb2b9991e5c726c187e9bfffcea49515096687f4015e77602064523e9b8c626680edcf1caa3947eebe819c813c37a98aacd18f091c201db7b0a05b581f7b6a600e4b17db083625b4193ad53d2a28f103e87d4bbe48133b13055e2e8dd77f50a867dd0ed5376875be19abee322122e23b8ebacefdd9b9da6f24603048f723727786f2b7c74961734226039594e1c06d9797c65fcceceb2634f1e5002224488fca9b5b84356ea813393f807bacf8f31f96cef8cd304dac25640cd973b021c580b5c0f8c3248fcf25adfce0aeb458e87888d368a6bfe2c76d63dd03ffa4503047bab0d5ac502afde8304429117feb734a1ff4132dfef6e740a99d2655cdebd030c12aa88e91b004521412c0ab1299e19ae887f076404283446e151300d9250b3350d9f90dfe7bfdc53cb3e2351109a81f8e5a819399ff5cf6a96c662c9ad0a72acf8b2451b604fd6b4d69e80853465f2c4f5f19742f389de3fe0201aa6ed2615d92e523e620363a8b27c8f183f4ad7d37d690b9995f25dcb644ab4c86f44eed760067631e3182f0c53af4669b9e21966222ea61fe831602dc756952a2fbd0eaa6ecdecbd5c56855192dc94e30543bd29bbeb4d71e6b3b7d9d980840c4d1b0f1eea8d48507083cf1721aba0f018f4f272713f184d99c784ab7f3bc4a28f211d6e4499a15c026bf85e1ead40773690d82c64825e55955155b66330b128dd50fc55cddc167c034467d3f9bced9839947a0acc21f842460e679692f1cd1cfe8e01dc54a8afb42398a6d1aac5f0a4159adc1bf62210b3269e016996d9c69263e8e42f7f02868fd35c0065fda9d9460579444f82ec4e80c2caba97d89bef833731df5d8548e1550e3d7d46b9eb536d0d3dc5bf6b92c4dc9fe6249145cf2d24d33e03b19044fa8e36b1e7d069b2d070d75e0499a1b2c4871a3faf6573c164f65b1b330791ee85caca6811cc72e76c8535f9bc1c1f875d0976c336a6edab29357b518bfab9795bbc08e9085d0fc449784478b1a6580d9e90136cccf2ef9fb4441d21d3fa153b5cd5840537be1885a89da70e0184e5502e260746b18eec18bf6a7eda127ec6574235d2cdee4417348d6d1491c74c6f3ea12fc1b67f94669c13c6675977d605ba517e2e06dd35d98855b6e5de69bd739f976e89a623cedafd907b74ab7e2e703e55420e9877d3baa4f3659bce8be5722f87bcd739742d0648f93cf33668aeb904bca9666a8557a82e9f52b41e9e8e30f50f78f6c83e805f57cf608ba8df15407274e2a86690f94fdbde8b77c1ec3c355ce8301cd6de01603d63f97faaf08dcf5fe96256a151dde7388b98c0fae7b1aa95603ebe99642e342f0bf46b790c72b55104050b28942d5e7c7325b8d7d8bd8d7e6a02f54693a1403190b7fe32d45c4dd581906a2b079028ee5816b085795d7b025afb01fb7fe5d7bdc1730ed2dfc50c2450168c5d64c9b736e1b528a70de5b61e36c64b70e58fb9cbd492e8ea9971383cbbd802533652c3580b30426be48ab48d5c3af2ca26d99e41fd7c35a157e0a0c362ea3878e0b8135dbcb25d700b3e565c7874f468480820ee76bf462034603a328f235a6754476d91b111c10fc86134900c004ef39f98564c78da95c7c0e29886270b47157b54cc50c7252f8494a053f34856ebb36f7c4ab08d9c776479018af7f80402f6cf46601378f78a3890697e0ca483666b946e77027589c26dab8615094032cacb81af37d18dffa80583f9e086f6418f8611fb015ec1a258634cb18b61e2433d34372ac544ff4f94166d11c74cb63bb8a7cbc705dc84384f3d4601046b2615b9d7ea2a9bf677b19e1c29714da43ca2a346e4a540d5a6baa346331827023c271a361f32d16fd33ba3d939ca0b1f094f29a8ff9f964a783609c4a3a896f468056301d59bb96f2ccf5c85ece583325b0b0f4c61199f17035cd9d49cfbc7de6d0f99f7ca2a6042273f6efe4598ac02c54dbcff2774a28bc667dd8fe2c99a4b4f89c82f75c5b4d57fa57fbcfbb9527815c9ae6edc4d6012c18e3d7588154cef07b360bbb580bf5f0079b26751f8193c337371fda1f72dd5237cce26ce7e304d0e3d2b069087ea249cdfdf6d7be37d4713d949ce34ea5c2b3c58bc5b8d94f10b59f6f9cd4dfb90698f69f6357d255d32f5b9f6ceb0bc5c7d197d142b4bd791a995a5476c95010765cc568f2f76f5d1faebbed505806feedac5287fe1a15ede6fb3fa0994bc51fe861a37e7c30f1dce0d", "6a52ac005251ac6a", 0, -1414741100, 1537743641, "401d7b4510dee881cf64e30ad1b3b97596219a47fcb8d5661640b48ac9085cb3"], - ["030000807082c403048fb0a0d50fe743c6b0c86440b46e800a78f0239d8aa994ce81f56362f0b9c7870200000005ac635200001038bcb950c59af8c4eddf65d759cb51a5162f5f1cd87086bfdbe1f92ba43e6f16a272d40000000006515151525163f2918acf9ff12f1343eda9e400cb497744b798e880224aea9ee35ee56228cbaab651add90300000003535251ffffffff9408ab791c595c71e59b92d101212c6feece7994994c52385dfecadb193e23da0000000008006a515251ac65ac36bf745c04aa6dc200000000000963655265535353656afa5ee20500000000045352acaca770c304000000000463000065ba96550500000000000ccd69440000000000", "52516565", 2, 788718622, 0, "2d264618a19322b4cd3d63ba87e167bcbd9946bc9b65a89310feb28ed2a6068f"], - ["4486ae0202c2aa9bb718ee7e6012e8011d302ddf11614ce4199713af11571baa79073f1189000000000163ffffffffcfe41ffe7e200395490686744be1796e0091049b70506c11bc64bf6756cd5c3d0100000003535152336622f604fa07d20400000000085253ac006a51006a78280702000000000452005300ee622d0400000000030052516cee9a0000000000066a53535251acf2070ddd027de13d00000000000000000000000000cd4408e0650d71f126adc564c0dc9e4458bd8292d5cbd329850e242cf0aae89e704919eae5ace0c66643902004268d7e63c45074d6b78062073a094fcbead90996ed5ad2a120404dc5233dd667706112d46a40184130043d276a607c492f92910000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096d0a170a43d58146f400da3beae66f36d8306907fdd4a1872b33282bc46703cfb578e2a9718d108d89e3f17ffc7143a4a3f182568bccc78e1303d39f3194e0d6988f4b9a4978067a38ecc27d8bbe4536a29e6acadbdc5c87fcb28675b94bbf771fea6104b2598db449e7201d967da46956cd70d2cc99cae342a451cf249c2c702139649c1513bf98e61ce8f5295051f2acd9325f295bcdfcda7b39802ca6d5d74030460f202030dc1e36eaf5ac8530a1942bd0255ff4352ceac9d739e79d8b3766b0b06c63a010f6c25a693d64db7012db501923161d299e0661bc660adcd0d3ee6bb38c23a388d27043bcd71dd000a9afa35bce94b0c04cb373dce27ff91dde511c603096a2465ab88dccabf658872ea5845324b521af414ab6dc23d3f17b73ddc3c60030a6499f316fd3f6c7efec848a040ff4457acdcb4cd5ffdec5bea025972c6697d021a916f4db63c9e74e77540bddf7e2ccf674e8b9f93ea02e18ea334b6752fb1b0030634f38bf9ea1270265c0a84d6e7f4972aa291758f5fbda7af9c0b1a5a769d91020a51ad63c5975aa6df3fc81e7b416d7a32800c6e90ba84b50737110e1e24601dbe90f970592ab04dc45a54cee163e43baa8762b55f1b582f69b83099df7235d4ec72cc03302922e3f1dee72b48ca90bd4b0957eb66b3823cdb6d0c2ce5b9b968bd4059af5ce996f9926bf5023726fed1df69771606387ed709b121826892bce6dc9452a3abce03a750b9ed82af9b4976d404674bc6c07f3efb76e45f4249274cb7347fb54598f2b2ee7273d44d83563cb793423e7efeead66346d7fa707d14967f7b17402e9f724cb971fc245ea693cf6f734ff54b2089e862056dcf604faedef3365ed80a6c2fe25fe7167207769a196fc257f164924de248f102e8d4cdf736c852ce3c36a2b5a893e2d5fc767937a7bc042251f7747bacd7f858b59eb40078da171030a7a5f530e51b62e523bd2b5cb400aec852fc6bab682b3c3868d280c896ea3cca41a385fb780f4d2183bfc0bf71211684f7257870593bdd41c74962e0c27bde2e32c4ef31ec7b21fe412e95783a6edd821bc98671cd291ca422374de2115c667847d73635a8fa81bca006583eb6099aca0e15d8c07e36cdd417ef61ddfda40ef603375698d68a7a357bd7d598ce01b935b921221a70b6f9a04dd2f4205eae8ad3d007727734cdb5a3ee13a34bc65a817a5a30b8f4f3c56dc4fd13ee9c2b11ea427d073d61212932af4fc835b1c7921d818b9db81817c48887469c1967f67f4e00b6b18e5b2a7e930ba267ae581c1e9279116d57e1e5dff70bdcadc866c02884bb2d20913c712e5a9f7bdc4c6c6bbda0e42b405bac3a0907b2fe0e20fc838f909e4b455bda94c7b3914e5c385571877a6b763904d9acd21a9f6252756880ef935c621a0e82b2511a100ffca0a81353afb2fb3fef1222e0acd2ca39c2538081bd8cdeef3fc33a4fc0f6191a36338e3b59f6aee68cf807e85a9e2518166585dff16a139b8c2ae802ae5d23ef9cdaa043dded1e21d71be8924ae2bf7d23b79d08ee173d8622d763e91ec8fe87b4072e967cf109d8874f18965d1d4ba95e61717be08584184c930533bd51ca330c7cd75f8cffa533282ad1476bb0b309a92c073141cc07e3017919a628f3d14e6b2bbc1904b3119bd34e1d4cd792c64a03454ac8aa70927ad50d365c5c8c07c04072c22d851de2920b899acc79151d2a7fef596e67e40c2158bf1ce8d07e396dd035016403b4e67d66fe8f3ba09f017013ea87982fd1d8740489a170067fda3bf3c440adca8dfdc3dc9d8e4f8c2f2f728d28a822048f5bbee9b57a796ccba08c2cee6822e3c81987c22d244f7c3a203c27aace35c4f03ca360f846098ad3cf6789086c756386b01d538380623589338e1abeff65a2fbe28b40a38852a9733a324418da0ffa187ab29543510f3ccfc61c38d3adbbdc8fd7f54cf34bfb68ddaf7ab33e9a0e607893cc91bd3fd2918d813d109964ffbeac431948a01e01c4d95e428d31ad743b1ce5b4015a463531d48d07ff27e1c53d66a2b5faafeb76d6016a428323445f3a38ea8a982767cdddfa0ce10e78e2dbe7285f7aa68b987df6af5bec715d7aee09a3e40f69c1af6975d0f56cdf54e6aea4eecffa81303edf2dc647a0e151c1ea6389500a226de939cf2423231fe5b3d9c7cb7a2560a914ecbf59141cd27607d386e1511eea18d961b8aeed2bc0a26420a4195717fe08992d4088909ad4fd61c2a144eed135619bb0b72eb9f961b25a5813683eb5cc9f623f8fa56af93586b465b089b903000000000000000000000000d0a96c83bd314b054ecaf3a736c9ce90ba020d56a8e40d5a379df4b5e83e55c78f66d7b1b111bc5d3aaaa0c7d5bf606111f4fb4b5166e8ced6bfb76b3017484d2d43f475b78118bce9ddbf9d6badddbea784582bc97669a1657b17ff7d46173900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000384e1ced3ff7e0bb6999e7fdb13b87a10566c64529adc544527897ec7f1bb9ea547ac711a3f5aa88f36f6157c7522d5fe87dfd5ce8b37528968df5555defdeab7907d6f2e777b4ddff338e1318ed2f8dfad6cc226c9b0bd30125679acee4fe220f9d76b1fabe41b5127b7ccc7e8e27ba31bb1f86c712cdbddffa96d5b1cd886b020b3b3a6ba328cbedce2c410f4dc098761b94be778dca1b199a31bd9a0b082c55022fb185bb40af607987c549c55e2451a5d84961623bd75a9172bcffb1838eb6e90a04db9be35d394c57b47bb9346ea505fe47c91bb88618b08b382001eb6c9a7078198408f605287cfcdf5ac44e6b59bcf8fd4a2dcb3829d6a41d44a52b93e844e30309adf7927b792bfc57954bfb2aac5dd10d1f480906e3ef8b4478ef183722e53402274ddb3ee05247041ff575ecd504da0d92fe78befbd1f2fcdcf0a6b5bf5643ba0209735e33557b6bbfa56b6cc817e1bd2be95a9d9167c8081fbbbedfe2140a4745030de8383804df7839de9d684ed826f4748944c83d036cd251f3ebec9475d3a796022ecb9abeb00107bfd9cd29014481ba46c92aa6da9c965d498c6e66044f92f0e782f40ceb01d792979fd613b021b20128db91861ef70479f1cfcbd931db8b64027830f80d91331e8ba626673245da2d9e0edcf881d6363dd301a5873a2fe8a0d089d3693b9d6b4727bda994740e4886a1968911f836bbd70b1fd35f0b021cf93a70ef5d0799f6bbc81dd727342d5663400b4f46c8449ee219782cd188e3654c40e6d48477c04acd103ae44c9a4c3cbba9f74f0aac3caf6b43df31d375272f5a491a0fd7cbe285be79f4fb5395ff48fa34823fba5a94ef91b9bff0e82b6e7a8b8a660a66efb3abe31ba1f3b6d17118dffb7875b5fbb8eeeb1d8b05e16403a926228e5f58f4eb9af0b0cee8fb0896379c9f33886fae1bc7307bceaf2a455d8996d362b79847bcdf8c1ee69c13d950af4800c308dd94a6043dfbc8f3abddb2a8bf098a9c95ba1e911974a92b2fe3378fa61dfa372f79e766f5cfb702d533e30e0b934cf56919bda8a2811423aa92b521faa461e5f79ce1b14c0939be4bee00ccba9541635e7f3a76c781f8398ceb1787683cb7f8ecc568741551088bf387c24bf85c334733e7e13f270413bd31b6c0549a28c68524ff95ed0266c5141dee4e84c68a6913e0e8e3cb5fb0d82e52c8663d8ac48f2271ff7479609c37909b4619bbad92c5cddc8154120a4cb06d20a1f7bc0a6c37487daeb2b7ef611731e624fbdc21d3a51e72d77704ff33e34f6a62662765e2a64818d22583f03c28d71766c67f86592a66f0483841a12a599283f03b9f61eca93dc2e5cd00fcf5f542a7a8f4175dfdea59302bdb5c932bab2a37f58ba83fdc1ae5bbb7f169b601266d9ae1b28b7386a1bcf20f66fe1005077e7c4d24223d58f96f815445ead71ca060385640477a308a82a4b10473e45dcdcd32a9136a89b30d7c2b68f6e3d96e3de89845f83751a86a1bf656ccd6423a32e9e7a4e7efa0415f53bb27e20773c73862ad7dd85465ad5d316ab31e4f4c8c8b8721b49a0d453fa4ddda052bb890e19595f5d90e4e03257dfefae6a58b82da6260e04557ee43afa33f1c61e3e8a321f89a18f6283545febb97045d0cb458ae53de3284c62176dde98ca70da2675e5356548f9b5056f85941d2b84669b6c1daf9a70368c3ec489cf508b73f4ac9e4f4b18c20971c457a3ef29acba497fe9dcb6e0821cfe97ee5e0366c8ca5f35658f63f64dddcf2fddcd87d6e937bb8ccbb86eb5da1fe008f1da833a44e351fa738eee98f5651df91c6e380a69a594a562e311df08f1205746a211613401761d4f7f7589c4011470eb375d627478e6f6155596312bc7732bec39ed0a4c2ae14986c5132d03fad72d10d82ab8cc4fe2cbd05515ba022dcbfa3aaafdd4cc3cabd8b4143cdadfd17bde5cd9b1dee4cf4b5463e4515bf3ad381d79957aa33fea676d81c95610bc7b7c00bf8583134abd7b2a7cf9a7f7c7b8bd67d03a044748660ea5a311179e312caad16e9b9d728230264104c746b1c678f7462805d05b822dcb5d4c570ad40780f5ef881193e1dec35b317b024fdea63f5138d0cd23199c3e55b34766b93e88efe74c863b71b9e99c08791004c11b7b4663c83a9e68bac30193cd8ca5b9811f352a5adf90c7e0ca0abc6c2ef0b7bc1b3c72c91511f96f4de6bf88ea8554b0fe9a3f5d391082f2f03a255b8fe5b09ab65e1ab5dfee5aa4cdd2b589ddfe78602d29ac0003cc89c783e7973809b45b62fbc944d4cea6f497cb6a6610873d1ab6d04f2c57e5809048c2306e9fd50476d3e8cdccc9caf241f31322095fe5a6ec9fe8f82166a6fc16a247ff2268a46edfa645dfe8a8a56884f51e543154140b97c001f71eb535eb26664b299034fed674e5b43855e12ab183c0c", "00", 0, -1030878089, 1537743641, "d92b577d4892998278f6238074d1d5b7c3035d57a807989030a58177e5cdd5b2"], - ["030000807082c40304ab0e946c16e60d9d1606baface304a0e2acbccbd4f2317b44a5c69f36fd3663c02000000086a006a656a6a0065ffffffffe8e9af6d15f55b139c7555d73e825265a8dc6927ca8b8be860932a9a78a86be20100000003535363ffffffff680c193a21222d311b7a53062fc4bbf68ba0e4eaaa4ef6ec657f00a57b0aa4c801000000055153ac006a168ad28dbad9eda80af3d10f413b38b0c31224d91984d27224cf8667f51dc3bc46232ade0300000008526363536a656552763e95260399203e0400000000016a7332e4020000000009636a5300536a6a53ac548d760300000000035365acdc5fa1150000000000", "006a53ac5153", 3, -1298507762, 0, "c850a3ee052bf581d1538b0c2c06fb2c9b8131898ea39ab414e3fda6d0bfbf83"], - ["030000807082c4030251062b5596c1b0e335db0943ad134ae0cbc453090a97fb1dbb69d5e9bf91528d0200000001521abb996674f4b7c8ff11acd1c299a0664c517452f16fe330d911bc4af7cc7cd4d5150f2903000000026565ffffffff03aa7e98020000000000d9bca5020000000001519ae0a0000000000001ac1c81f1a4820028280105eafe02000000000000000000000000a6e357d25555b71305581da40cfcb8030c1ceb2bf34162fe3fe9cd2764af76697cfbdc45093ddd5d1a404e5ea07d6987d5ebe6a33ff385bec3b92d900eb3fe12858f8c6d40a4c2375d3b40f414b1927dd3dbff6360b3c55ddfcd1c02f84736b20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072568f3261ee5f61365bd5e213b3ce08016d257439f4e5ed7176f7fad9e87afeae25048cf37a8585ba23051ea6c5d804d606a4666f8bbf819208bc92287d23ea3316b70fb48cd33401e4644730f11f7eb2e185e4485f68ad88d06f4cc549724533f9d673f1cece75435c0d37c6c8e665931044fe1b75b7aa87b9e0d3bf9375af022374b691fe9e0ecb9abb72e6a4cf181663eed73a121094c0402835a8ba4472f7032f11403cb3f389f3bc07229d3e7ac8848c0521b5785e723abbf8a0904f04cd3b0a035300ba2b11ad686b7ded3bbc6d5344610a5351836e392561b7b57dc9c6bfbb75d06fcd9fadbc4685ad16530a7f81be1ca2435bd5dfd22102ce5760c3b14d56022bab6538af3fc1d3652658969f6d2c8040f4823fa0c348b1c4c388dbf5ac64d30227ea2ec0202462359a8a6ea7d295cb6723ca31bb1c8423a67bd816e79673801803086c43458a146dd1c10c8a1c891f7f079a1a29238776f7fbd76c8cdcc0ef4fff0324d5dc77691569043c97f8e90766c75234107f8eb804103a56f5d06e007a0248022e26bd8ffc79fd7303450d4fabf6cb94020e8bcf19a28fcccf143c716a2dc07d3042a778c16b1ab65b6b6ef85c9962afe780e34160ac0b04ab75d589b85796608817924b773e7d5599a492d3009f455d227fb1a45466333cafec65844122484dbf076efed55251a6530c8730214c6ea8901915beeeaa6b0b0d3d8438061f83ae75938911b376ebbffd64b5d9bff8eca41155e06d1c760d11244b90124007036249d1671d173077d6122282243800120b35e44c8f5b3928784d1d5791db522eda1303f6af557f7cc67dc3a6b66e11b8cde567aa003e68824ae931e8a2152969190b8f5e0f1ea22c05592f01bde0b85081c6c6058528787ab4b2547b5762ee5ade098b621e8aaa2ef93a964db0a4b9b7a1697dbcc16d862ccc677ecd32ffe0a4928afcd28933f8ee05792807464360f8a598f74de9a10a5304e66ada161d84dc40ddce6b64a9fb0abf99803ae81ef921c959cf6c6772b7df43f70461866e319ac0e1984b6b63e870f6abcbf06283db8e8bc336333da0238f46a6e88c6171d4a1831cae3eb7165f2173b3efab9abb433c462fdd00d7b8123e59a3f2ce146302f70e831ed2cad8e7a3e1088f7bc9044c100cc7355b50de8ed864929d006a1d3f93adb1c864df2a64037b7a008cf699df58cce9f1b02e1c7af81a131ac06f8ef6a34dea1fbea195de866c9595d1a836cafbeeb3ea7d972885413a7a574be1d4d8d963f9e2dbd6602057d2006336f06e9b1938dd9d14613e4d7924b25042edebfd10fcf80e69f17775efe493f0c521b37e892056331720b68c8456b3408ec88d87dccceac36dd4ce587f8f8c3c53f9d08fa53d8d282fa3df8b9e34ff1530cc9388dad388266398ddc7182a89d4c9b32ab60656327cc858d77ba3638bdd3daa8ee45da1dbcd49d7a310ac0b5864078e55be6bdfaa2f97741943fa6e498c97b76ede26f44250b140d42be84141408e8d5216573e94845d8e392dd74e3334bcdbad37b382fe9d226059bb92e9b9e07bee63e12edfb98df5f4635c5bfd555ba8aec0ebc206a630132dccd4d4423fedecff5822a4325b0618715e64dbdf52debf8db16799f619c0e642c4e48342a8cc69c04e1b7fcf1e2885924565e3295d05ff960fc87a9441e9d4da798c033ef8d8c45990dbd02d3381888469854a92c6d5c0a65b42fd87f5dd73701747c69cbee0995d06b658de8d24e82d89e167b659bb02086aeab2f958578e6543f3dfe5e17cadf790197b107212c8211b1df50983690320f26df7abc9f3775fd219dedfa6158920b2449c105735d464e927b567204768ed425a343a056f5ea9ba0102f6b1be87e9fb70d048b615e0b9c95bf33d368f23827c745da1496975c0b10fb3751292190be26937ddf69c20244630ebf0f6bb8c69640e3c1c7510dfe2aa96412b088f4e27fe50a45a25a4981cd5823ad91c48d7dcec101a0c015cb418e71713fd56b71de2943e2a4f6adf1e3928c706a375f4d280260b7e9adeb33ef3bc42dd612e4270f6d60f39dabc9aa5a5c18fa9645d36a4cee38461500cec2429cc49541f693a08a02acd8f884150bf8b16866a4d778c0c718a9c17a46f737219bb5be9e701cfa0632a6b736137fa94c477e4e1d54978e0aab9eb297b7a00acb49b2d9e0d6de2106f586375a92036c34220afca73262a828832a36c0941aad61fc19419f74b35fc1c4dffc72f7e67e09bd814e181783964d6de7518e9306f85f8c02020f2057a99e2b90ac63637e0f9346c1a8857699a13b06114d5b71a237b1a318af9a2c86dbc5bfcde31d4dfcbcd047a1975f44e69bf8d3a24707a9fe6b97b6440cb028b736512d54d321cfa41c97228819cfa331b47c55fe3581d5aa5f0e1756ec132cbb7c46c90d3da717e00", "ac535363", 1, 565047391, 0, "67e38ebcfbaa1b7ba4556e70d34487a447509684d0b006c48840e8fb6d821694"], - ["7e0f85120256c03171a958d26fd10c1ef6eba00f8405ad021d3301a9c5f80d7ada67e5b4f3020000000663ac520065ac7bd70cc98f3f5c6c3271518f55f58801a07ec47e07f4658555f60118032efaa4f0965b9b0200000009635365515265ac0052ffffffff049404e20200000000086aac52516563ac533be374030000000008516353ac516352acd29543000000000001514618720100000000036565000000000001f63f780200000000000000000000000031c554268f9b901d4bd3ba0d87f71140c6f1cc7747e2132ddc2003f2fc9c21749a44706c4fff01b3cd2e19b34329a75fb2e534e1633b2f046779222b82865d62cc590e256e1140756a40ddca9dbf59893c0aadd06d2140002c1d0eb9c9b2287c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000344b13378ec19c3a117c62957a4e081893f46174021d47b9b43f1e6cae8fd166c7b2dd0b5a07feb45a50e15a9ec53ecc41e15377e2d2b26a8e194d75a64283e950d6cc1aadd1ad309347de43d779bdb3e5ab661949a62d85563da02d29c1650e64910bfc78eca186026013494c2387dee3e8e927fd6d2ba9cb28c0f7f7824bd6030b9100f3cbc314597f704e89dd41eb8e8be3c24e29c360bc528ac88cd33b49780314d98fdd3e11cc4bce2fb820193ce135420995dac0dbc73f7863b477b75737290a002c0b3a32cc75e5cc9a9ba729fb04038eddd6231733d019687d9966432d8010cc76fbe9ed76d759a3a7d1f428c5d4f8808840dc66173178a0a88f582e14e176030c60a7e3cbce315dbaf149cb0cc9af9105ab37463c9bb47732779bf84a19e598021ba4347ee48d5bdead9c13c7efbc7bbe26872177e06a663860008150a1711dec03285f81b6dceed77cde85964c50d0ea6ade25d45cadcdf798804653f3cb8e855e032f18dff51827e031a3383999f4fbbf3915bab14c54feea1c5b41b8bcd7075dac0212017c8a414a27e186bd278480a39de5a444698b820e65a3fe091acf2cefc10661f5b8c7a2712fba2c4a6ead395fe5df6d7121615ec29a4b4ff2b5f7a0e7476083efbcbc708a30fc556c6581646840aa43c88bffacf6f88fce5df4faa0f078c4f220da1ea224a62ddb12fc6924428e9d6bd9368697f773c1b7d8462ea2a93f542759c35840a68f32eae8d40fd8f3eee6413701fc98a37454d04e4aec2498aeaee92b83b7f52462303b598d2378de46e5a0988e90f0f8c57891d22fdaccbbcda7a8fdf8af03c9f5236c23824ff3d526ae288bfe26ff87a48f855f4b10e3dc0c4729996e5dab181df40bd92d3ced3d4f8f1db6eb6f36f0a1b8e3b526bb9b3b70140190a996e13cf5fa33d05cb62e4de623317c046678668ffdb44b089e694dc621f151ede1c1ce5af999d3409be5eb842d677df7402acb61144ea525e39674405a64a1c6374723bb98c799f3b02f599bbf491574d56781f253396f7a9f0ac71f6ec6f8c29d7b86e14b5f2c144c6a7f6a7284454c77a3db4a4fd509bd056878f77cc85b6f3f587ee66dc70b7d4934dbc052e31968125719293ebeac527a8185a3782f7568c7209a8df2a86ebc17125f5ead4b3fb5d5ec5020edbf306a715c10d3f4ec9473f427d9663ee06752b22f3627b8ed37e37396e050033a6fb38275ed3c2d145eca826c85f32a13c8a42caaffc75d4936a89694408ab689e00eb62aade46ebff144f0764ed48fe245acd5800448fb8e4dadae79fe5cd57d40e49d3d94aafd807de7dfd5b34edbaf6e2ea90dd345f3b715948f3f5567ff9e817f2bb755261ff77ae17103cd877122c13530555d805c138fd83d5b8e7825b22ba32c1868f4565e7ac365ea601b8fcdee5a26ee13cf1d2368b236c5745fe902d9a690970d1b3e206d050cfa36a48bdb35e64b1840a0ceec773e1ff17cdd6ecbad7063ed521a64f06a9d31d37e402d7ca5698cab8e29c921fe19928600aceaafd952230abc50a4f8aee449feeb049e4df33d9e4af48bee075dad742919f58f1c2eaa915afaedb3cd08873b3e1cb2ff7dad188ce0310e05d6bbf62f3201bf09f3779fb2a6bf0592e8ee522ac1e63f4bd4f3d85937093c2b1acdeabcae072c9caf05952efc8f5475d6e710af8d2a34a1048a134bbefefe8570646899038ff367882e1b0b20e2923d96edb4609ca668aef4fdf340ea36a271ccefc3587f73d1c446bd0d845f2887c3b955815f44e75fff4c42ab6b806a6e06eba97bdff20a03cfa3f13c5a884f229cb0ce25635c49e50570acecfb799152b4c64a6300616ed60dfffc2426d447856b32c9831aac4de4008b8972791d965056f2fb630700a609337d8c836c8e5a78b7dca5f4eb6cd2a876ca05bd9273210d686fac951af2be3008246d0a256ebca16724eb1084e39564b9dcdffed09bf68a656d4044df2d8ba33a20206a3b982ad9d2eaeb7bd9e9909c0c2dc14536713459d39375230e4059bc05c622d8ae7375d191e45c880e5ad718c3fd6f0aeee01ab85055441838220b5625e05d486d743a0cf74f308bd8ccf18481d337890af6450ea8034964a262874da53b700d803fca77d55b5ee6e18948d177bd287a14ff50c2fb7b18c74bda42e8c35e303a57c8d48cf2de1e0d89abdbd1178fd8ab3482adecf8dcdc21b1b9cd9bf399ed188496c93191549058b9559aaa4b246cef1708940cfc1a74a16eddb201a32f40a06df9aca96c6cc341ad37c0679abfdab80e174ad2a8bcafa9c190db83749e2249f45749acaa33fb761f854367a083c81b2976b8286a85c1ab20037e8cd8522189943081ceca969ba4527661182ec6ef99970cf66d9eaed9795df8eb9f31a96788a935135f90535e1911b05588b6f365546863d52b984b02", "656aac00", 1, -1989271607, 1537743641, "349793a10e9dffe9e1990afd58cb46597ad7a4439ad15aad6567079ced7dae1e"], - ["d8941c710291b221b15db4680c765c85d736659095e7c57fc510f947a54c0cf4a1af660f900300000003510053ef10a8d782f829f6d41f3ed331497414a27004011a10d4d7c1094f9d8df3bccb1e948659000000000100ffffffff01370b7a0300000000026a6a000000000100000000000000006b960f00000000008b5215337d05034f0df07cafa723bb1b299afafb0e1301f06888ba7fe3960b5bdcf7c01d0ee2299dffe8e8b541f572dc736dd04ccb2e68d559ea0933f0a05aa2330a1d43ef1721afaba1e02ee20e48c93bd63f0ca860db9c88c618b8a927acea00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0f7bba3257c4dd784ecc6900b15c5d520dea301bf0d25b96b463635c62cf3d1e9d9fc60ca583a86146699797250e0e317e79e8a27d2e8520ae678a658e5985d7d571c16d3634d96c72e1e0473e8810029bff06cca88fd3cf2aa8b13373da02a292c1f253f858f0ad9a2d14bdad5ed6f816a201a0420f64a6e0d12aba73c0d830203d5ba6b950774dbfbc8534d03d45c938b680ae72f7912e392b8d0c712c2a65a021d846f56ee52fb8952582b61db52396beb12dc43c0c482b30ebeb74ff3c5854b0b084d685d6a3b38774c29c485eeedcbd90141ed1cbb0545ed4847b5666e2e22848cd4de0955559eca8b55a37a9b8d4f21c85bad6eb5e4bbe7151a37d6840ee680021d2c56d1418f8f64cee0650748312a1b3a13c002bf4cda007d23491da06c393d021235d110d714ad77e1e366e05b384dfe7b2a6df40be15c506b42e961aa92416d0328ed78791699c038c85ba34ff8d9f7425840b17d2d93bc808989c0621294b6d5022525676cca2aca06b16046d5e4af924ced37acfcc939d2f215f1ba27897a4b470323046c65124e42e9af269cd01095428dc51fea992ae3aefb17d6653f7cfb1a401ab64db05bae6fd5fa6d1089aa42278d421b991ab694fae2ed6dc4e744e10208e32dcd6a97631c2e450a932954055cac593f6c3feeef9c024bd806c209afa1513e45411de796e9b074621c077749fc9b992f88b4169b7c397ea213b5acea8c108b410c133e23890e06182dd3c843953ae583b86fd2600622dccf362fbbfc475d213bb45a7400d0a0ecd8360a78a5d555886432d3ae2c5d0a56e118865bbc651fa53e356f1460737fef0381ec487e6c40da1c88e62cae96fd15efabba14c9f40eafc96f47247474c8bf32313c3b2148ef06d8ebaf812bcc99380028297cc03469e68f51adf76c8321cd1dca4637e194acf60484b99a14781065e4702adb2e30f1f9fdeb69b8677455340c5d6f9b72f7fac24ead16a40918bf86eee425cec59b2eb62101ce713e23a725a40c54d36e72de5f1bc9603fde1f220d79ac304e2dca5fbacca0e798d8c889678c0eba0b1cf63344bd4a714eb3436b5656bd277e024b10288aecedcab50c697789ff16d5d80cc0284ce0b58e88570fed7352c8ef320c5d0a92de3f596d349ce3850ab154ac1a76b7fd68bde76af6a551ed6002c54209d3e298edb4230531327aad79b836f617e44a6afbccfefde982159d761c2767eb695c0d0a759adafcc49f8c9e157543fe62949e1cfe34305e365e26d4757c2cb2de40896b9b296c9cc2480bd39df2ee5fc25fe0e314fb9733661ecbbbaea5b6a060c64d5897428f24e0dd3f1348bfb8138029099dd69ae1a8f9e469ce052c2dd8ac5402cc1be7c9843a03de69446690c13c676f0bbe6bfb9511627d5f3067700e7b5ad4ca4001f5db6810a0d3afe2070bb23909e80c6f85b3442eb7cfbe9c527529ae40338d2b35afd60be09979baf3c65d2eedccdf2f57fda93e719f336d081d1b2b1f73f0e9140f54eba06f1f9006889d0f3a200e632c57103f0b9265e0b879c2f453db52541b11cb275d6413a40b6d484a58e376c91742b564bae29914d023dc5aa103b5907b3d5c233c52867970c235357e4f36a7f58f87fd6848776d858a86641f37f9ecc7c517a00d461877a2b340bc193ee21deba0a197cdf8cd2ec2fd82d9a5d6a1077cbfe8970eb1cc7a4758e99795780de263f628c548e6f1cccff4dea8437f496f7a96397453d1ab827f546212598c185a95c94a535ef005b5066c77eaabb00ab18bd15c4d4e6ca1e4020ac48c8d7325672cef3b8cc2fb41855ea0a113acc13b7f76f51d1685dd0d1a40e6182c7a0232059fc948df935576e8b1088e7fac495b9bd0509c5f932aa19ee789b709f091699da889664642f3c9ab037e318ea4ee9fa2c68a9943be5f71788dfb0217ce2e91caefe1035267a25eec5adf7c42da3dc2f57918de0b9e5d29d583f353a8bc5a98533fb150131d52b1be1df1d619d0eda2479494da0ce94002fb0a3b449e66de301fa79897af21acb25a74b48f0d8c00f1ac8db065ac94601f8700bee609feb83226b925315f23e88f2050f59dbef9284294963d960c71f47ba2a954dfb3e58b857b0973e001bde59dbea25f213d07613f4dd1118ef49c90d5f9118b8df19af22e972a8fec3b8a66d04cca85b45a7f0dc79ae86e6ba0e8d0ae57fe47cd34a2826d5e9a76003defd8c9b1413ab04712cc13a5eca896091114432191a03c0d75a01ab7725d147ecd5959b2b3b493d83f36c290e7cea1a3de5842efebe7d6e57cdd45a49355274c61adad3ec8bed5c5e2d9d51147d6f0e6689ef5688bf211a151cf665bb0c000c6f74c20e46c9a2f18ed6d4161a767c3bbc4414cc08049c10a1696aac60f4101210ac759044cdb591b4db86cc6c2dc1bcb4a687768bf9030f70b", "53", 0, -1258541668, 1537743641, "702dba54e0da781d52e643083584632e67c35d7f46fcc94928394bb51803357b"], - ["030000807082c403033eebf6e47a88e208b2a881293be05aff06dfdb3455e36db3bf37964c0220159e0000000009ac0065ac53536a6a537ba1554984fac5c1bf1909f8adbb6f5a078974bb515b6482698dfc9fbaf506dbcda044ee01000000080051516a65006353a0906aa45056ebb5391d867a474c8941499164af873792053da862ba1eb4cd785b915a39030000000453516a51b3feb1f403d7002600000000000251517609da010000000003516a5202f8f4040000000007655263635353630dad9ce2e714406500", "6365006a65535153", 2, 646854819, 0, "dc8962f29d91d37c4c24eb4e06a7cbdc2ca98ba3f52c7b81ae6eed9efa351f7a"], - ["b7c71605030eb64740c86557d4924ecab1c2439a285aa95e83382014b26fed78cf2a8010cd0300000004656a53acffffffff858e059fb3780d43232112a970b364e4f8c1f35ab651edda6e77c9d99c1bdccb0300000009536a6551ac6552526affffffff6dbe679d363e275e1e8401857c658bc4a452c9cdc17b77a1319dc8abd588d7c101000000046a53526a5b95431901879dbf020000000005635263acac1c27bbbf026a9efe020000000000000000000000008110e62b7364424d2d93f36354c2d7aa533d3db7d225c95a90a65d5e9b0be056294ba840ad6b6b008e5653d9140f1715645da234713bdec1d8012bd718beaefb1433c0080af4904f70ffadd39d6d5fd514fbffd84f8fe00a5bed37d380d4429d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2170d9c9fb6f4e895ca5c596877b9115c761d61a2aa2d46481da9c7c3d01fafc925df3c038dd865fa588da5e62809932a41742f27efb0a7c365495f4ca0dc21b43796fdb87e0a7d08aef38ee6a1ebb50b277d53b810d09d2468b71fd5234f021c71f74c44f604050609caceb2dcd6b67daa902b13fdf006f53b4a778e8b4e7022ff2070631559cf79131789cceb7225b74a44fa711e43d6bf827d93fb359ce7802214f72b54bca203c56e8fc259cf2d844efa2041494a7d6cf0cae5266ff17c1400b08a32b4bd0e89b7be0f1f07b7b5c62acb9c0ac9414877a5062cf663601963d7733c33e3d11ce71f7a125bc630a5cf1db0874c2316b18919a856a672c0d43632c0322167855eee142d29b1f138af242e88cb5a905c377e644990f292452a1634eb80308d6454941aa261d1e0784844e56c29103bb12a5b865043ddf580b96a91a479c030d2b9453bf13740d7782d1e82847fc27a5fc155af46541af4d5e400458d48b10022ccbff77a7ae0505cc69d323d345caf4cac6079a6d824c7b29b8cb08c0b4234f022ed7fd95db37e7b38d7d9eb5415c486d2028fc5f3413333a2695d1590c17f407e1c3afdf21642c14accc20e3af5c50114fc188d9fd165d96957974fd327f8bc7145473c04cadad4e4c914f6f3ee811378c9ec2dd4a12f079be3710c7063a1cfce01ae1ae9f6436e35d0cc694433eeb3da9c70a6586df99d2044eaf0d049edf1d9a1adb65e33d2ed405199e23579b2806c1694c340cd0d0dbcc95590b0b2135cd7b1e7c27f36241a84109d044d6bb25ffdb32eee33e18f25ec87afd821ee5c89e903145f226fd06b58662ceb067e3b839527c22f7d1aa130dea602c99a2661bce7d32de0a19dee5442a7865002fda5956d415542b311ada54d83e11ccec933e8b201482fa1540335639efaf055f9a474cca7388a187ceb88590f2ea9966a05b0ed89985422ff2a5dc13c16a79847a05225351be80b58080eb8a9213a9a1486e8ff41a1d0d8de32f8b57203666cb1885b9ee1563a014ce3ed19c81a1783786e3084a2392d01dea4a3776e6e62d8e188b7ba656790c3bbead34628df866bf3a20b93bbabd44e84662479746c576519ee3c454188de942ecafd29bec40579dc04a54adc9cdaff47d019129e7142b43febab98947b56d2b70e2195de0f1a31bbe469a977a04a878132ab888ba8df4224d67784cfffe166ed0633789848ce24349cb097b1a2cc4f8ea184856a0c108797ae2075641ea123cb438a55e1f951f0a563be09e9d52994ab9fb8d4519b969833294de326e71e211ec68c0f54a0a78e747e05c0019c68983fc9461bd405ec57ecf019f3e3ada1ba9a11a7ee4776c43cb5234c7409f82916c654605e61789727d3000271852cd651e9dbec5dcd940a9a005b7e29d1680025e801eee22cf445fbabf9e460ddbf1574fea2f4d0fa58013e58d79b86ec0bd46acac69a019d2c83d517512f8aff784de857154781d77fba4284682b2e989202f8ee04c11e960254bb9ed8d8ed8fa0d842c5a71902b1a5269fe993ea0d080ab06fb6252995dc4306534d21845dc5eec68afef1c76bf71a5f02f55d197b77ca4f3f90339da24a1d7b0449220c258947cd83e775e1ef226bfcef7cb1e6c9b0b9dd011f051e24bfebc9d7dcd0024279fb06133ff4c6443474a1a3ef38b58cd1695cc27b9774575bd966b1d0131a9b161891ef26b1daacc711e4e9da64e6ff816df23a31ceaf6ba72bc47c6e594e18f026cc467253db366a59dcdfdac369481cc1ddfd48161bfacd6e692a67fdab3d1fabadcdb59aaabf6a601e45ccecaa9f1dbaf43a7a8820236e2521191aea89425a62a87851503a95ddc2416cbaf6e74bc029e0e9ce42cb0fda2e2b6f2590220d53a5cb5dcb2fba0515cea7068f74c4c3a2fe83070413c2a6d9e9dd57ef1b7f8d1bed54fd7e6f54bc8df0cfd67c6ad89c82f08f077564adb112e57ae338d180342faaad768ef68fb24810df1c4ac62ed9eb5b89e31d02de2d9efcec799d19f4be9b043350825feb54fdf6aebb2c6cc0d716455812b1af073e5a82a12509dbe73f83c7ba51beea6c52f2912c96789128fb2a10e26c8ab372725b20ddc37b97e41094a12f26773d93f43a6ca8c6f3b7b758cbd647566827dc269ed9ef7d182416f891ef690e7e11929b4265ca89f699aa445e9f1ec01cad4391c69678de299aa64b23957b7e0f3d9afd4f8996ac43ae92eab243503ec67a10fb23d7d6fa79ce893d0ceed223276277c815bea03c903fb2d1e728298e96654bec55c16e20791b0989f5d0b11fb010000000000000000000000006579a81b836bfde08f98fc5b372904c8acb83a1518b13cdf104f12e3bb64e293a00d65ee7ca267a24e5f57432bef46c4e97015f34c358c2557d66a1d215cbc0a96ff6eaf035a29166aaba399fca554e20f8e60fa760f5ee5cd69526135a3e09c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e828388829bc94e298b2ba17eff55ad4637f98feb721f82dfc270d989eea234cddd965a09422555d06db57c4b611ca641893ae1e3c972b34604c38e937b1abc5d24c914e999efa547764e40963822643674a1a4dbeb739228e1e322364a812a7990027b658bf8bfaa8f4a6d00be7d5157d7e2d8792c4d3be0535c8ad0e9129a10225fc53965d3ce8aa96b9dd6fe3e8207385784808a735da3aa2afb713dcf7ddea032e5926be0298ff6d9caa9217e83bb9a479998954b502dff2399b7e4430f146170a0216b163b05b3dbb01a2573da6cdbfa8adb708d3858ef54fc08cab43c197bb3f7bfd726a3b079c44325b2c17e0fe39aba0711d37fe8b2798026654497e65f19d0203c460e81fdacb31048097e5f2f6cea42d6c01573153c160d88dcdebc42121b2022333fa71ccce0bce6ed64a43b062b066527c84306a2b8ac5743492d666b4175503122af3fa461b05c60e9ee5f2c61aa10e41728e5356527823f7eedd6c81b1b6130315f3663535077ef2640b09f121ba1b15654e3ea25095af97e2773b3d75233545032827cf2a1b4265d80123e06af7a11d6d5c8b86960e5eefcd0e93cfa4ecc053e0dce6f5ada7b1010905ad4af4e633bbc8cc63e8688f73648cd5f4a5d78e1d8865b6fb96ebb13fa55d86dc7a67e9ede4c57a5c1c08c216b8dc3c607725bb70ec6e6e8e9a18eee82df6751d7261ac06957c768978bace10107bc62291a06f172a08f0f26190665e07f10a85c619dfcb532cbd16a2684d003cbfcf38a47b644931e81c64d43e588385d9b6122c8d5890503fd89737ae2ba9a825d72f979f291459ee70332b77b915cf9e54aa34982720b77ecc18f1f55229776bb22a29bddacf87a68420bdfd4fbb392f5e655880d343a5d7f01ef97538b90dd55d81b21d03754522d391f164b70961a138cb6af151e51e9d983946451e49057e40011d3f46178c8e39fe1b3b6d7e9b6302efbf9bf5bd8f3fa5b8903f1b0931f01866d5ca09203094d535ce0868abead7a8349940a3c39c595e45aeb74b3de642e3896669acfdba0516300c7a73ab34ff9e8c1f515c37f2bd6abf5c7db326500bcbecd33a7bde0dc5c0b621b887c8711c2ad2aa5603bd3084e050e00fd0e0c7c2737b20bf0dff8f8e56873f240afe7dea2d58f730322e977bae8861fe45c1f35090d672fe54f40fd07dab7a1cfcef098e30301a36d48221471c39b59777838fc19f787dbe3ed5bf36f90614f8410a67c912159366dc764a0e437fd0725c2f51d2883f1b5c44ca37388d6a536d6fd214850eddd1281370f2c0e74fe7d175cbb2be81dc561f56a1871947f9592c65306568135af4a8462ad97d8450edfa77cb26dae695ac48c92ff9129f35770f59cefade284e9ed5592e6c7a63a99f78ea21d5b31431cceba9f5d9a146bbeb7209a285e885312fbed38aacdf021e6628a60729383bf98881c2289b16db29f6bcee6395401752f0d3c3ab67cdeeb6f6605a0d65bc0816b59e88e055c07f4ed0db79624cf098d059f8e323e6bda8cea66a957b91fe1ab2b05e42648274f12d029a0f9a194efaccefa7cf773ae2929d438273ff974b1cc1268b8149be3d2857feced0054717c093b00f9dbfffbd1082df52ad5f714986842485c22bc296b5b95c9b3d2da0abc11d4ce1e0a8b0da9776939f106f5962a639de41251f295fc64611206be59024a86f30451eb6ff8750ccbd89a50b0bcd68b598399d776d486765f26c2ea29028aa8fad015ea82d76c948f5e6f2d2ff14fce38872be9f5afd3ae979b6bc80e623b1c98e490ed4c7f7cad9190bc1066294f7813afbac607599db9b84e327501903f5f343d56d7d87221d236d29f3e69c59c6dc30af3ab07be294bcc39f4f52d76f7881594e1528f257566816ebbea818edef186c04741c8960c6b8ef80b2932e61597124e9fc7ebb2f87ff44d4d16efa7e0472f445d21bb313d3ef5092f001a3b3bec1b71474486392b13cdd4d3acb366d878ff98e29ccf14b78edd6c149e37b09b8d6ac99a6b71aa8e3416a05997163d3ff9b8c82d75d01ea91844ce0133d6de7cabe09dbdb603e45c08e2fde812ed596c8e0c1a31aa1d2b0c05bae931abbc1b85a992b4651ba96c3cee1ca76d617af9145a6464e73b61e0d54058b177caa06182a38f820bf499f7bf0236c0e599511d2f1e0bd766b8cdc4d9c3573e100b4ee6fce3c930310d5d32f5087367f9e932f33b3a46e5b8d27ab1ae65be7474aeefb10833e0f6b43397c0654af8ad8a00448bb8d7961c13e183b777edf096657beaa104c9d452a83253991d112f6b00a214dbb494ca61b1c558f466fc871b1bd48023acd99a08b9ecfda9ad0321610460b5d19a650ea4810a5a24a7a57f28d1af543ea613bb885c279e71896198235be93fb4b8dd841b9db4aeb1b203691d7b433b3c2b4982cfbb64aab8a120f", "516aac00", 0, 692351863, 1537743641, "2981018e10b6f6daa91215b62436cec1a1929e7b76e0678f14030a76b176f50e"], - ["b3f677080149d4137722672f5efc833991935364c86eebfaa3840c13dceda8840342fdfabb0100000007acacac52526aac3719555503ff9a89030000000006526a00005152315e83040000000007ac636a6500635231464f040000000009ac6a516353516a6552206b2c3102182a1001000000000000000000000000e27820d3c05136c47474b3cf0bd8ca7a48158de0342475204e57f18721271d3ccdccbbfa602eabe125dc4f743a93fe45e964eff8ea3290d0a6dec5cee2589b8f3b2cb0ae355cf84efeeb2905b22ffb17a5a141fb4ad8a8064317f1575c78fc8d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000067b722ad081cbcf1db5e94f364f12be9d2e07f8d7dd880a30132b8bd7d2e249b4b0a9caa8fc764ff0e25603215f6549ade577d71c1d4044b006f1697749c7b80a3d6677b3b1d4de3a7e1412350f84ffcf9b417f9a00520a5d8c8bd3d9a92df55009762ab9145c48c2af7c4b000224d8bee85c8a3c533fc987ebba0840f6da731030f441191556fa0cc61334640e98217a344c0e2841f4f74e921ce083565320157021b9ec2112708cb8c60d6ad78d534459d207e45360f694e7a94fba77ff7f38b900b053e0ebaf8536051716778a69680ed4a44c29c70b983a089ec9789882235964a9c4f53fae3e8214c30e216d41c61ba632f098a3879d32c926b998c0b39ff06d80309c32a76e894e58d8abe410b8a2e0ea599e1c84b9bc300b31e50dcf16665f150021866042c840c8b9739520c880a0d17ba3db3065a475a290b557ce45283f240bb0207c9d383dbb26cdd9bdb0edfbedcaa7a1a4eca2024947f96b9cdb79db45de77e0229468a9370bcfe034b29d1280d8b887e0332d04de8b4653bfb7b9e739fdb100b020141f2dc70f54cb58e037acd19430360b290c298a6d7a10465285f566b80334e1cacda512d673010f5ac843d0b4e5629b6e2d4fa63fe1f2ae78e45fcac2c88372ecdc8b5ee65b8e4886cb88ee4a3994e71dd6ee68bd9aca5bbd3fe32002bb2367ecd3215c4bdd195a0f0c1a14237b7837432898db27705b4dbabca79015731085129d3ca9ae9c2859e12e7c417b8e8c28fe2f4c66f4b20fd58bd6512f096e6869e61943c7c413616dfb3e71f1e12f11849bfc4a6e9dd723740de5383747b2e5708de55c31c75681c092faa2430ba9a9649877ed99bb409de0265f65721a73fc385c9d3274aec66fb4782586f6e5d4f7fc218fd2465cb1626fd49cdeb2cc7ba43a2ed3d4f33b4374103f8d1cdec7d98fe62fd3053c8c10b475b3dfbcc69a880249b0bede853994ee360986f33f1922d5c28df378109e4e0c9d99346429067b13925512991a6902f124c897d77b5dfbc0f22d93376698cc65ba4330a6b1116b695b5ff676c8e26632d60ebe54ed6fab7c743519265bc7961850bb3204e35d6f05524783b9ef545b70d00bd2dd9540bfc69dcfce8e183ab4bab9ce89e36dadd104a08360328b1ccaa91ba65fa8e6bef8e7229510663f556e7f0b7d4e2afdf0b13ccbd19632ee81275fa0a780750bf40f8d41e91788dc3d043bb89af0fa8809b63d8838342e58b4ed9391f2a4356a156207f8151cb017e622b86d955a6e0aa9009c07f4040af3555c34d5d16a73f88c3e18d01564936e95ae924b48fe76b8a592b38ea732b333844ee3a1d13ea4fcb6f4c08ef35e21b339032d9982dac1d3ddc38d4b9357c518a010eecc747dd5a9fa7c16d4fe148fd4a5a9b97c20026ecf9aef42d834879ad6843486b496f2fe743524ed8079aa0327fb480d07524ab249e9fbabb5721920d492632ca7e593bbafc977d710e5f655c76395ade01d675e6c76092341360c617e8ebf8797112c97b0b9b28d1c7b8002073bcdb543319b136f44a59582c9732484327db14a98d42e873e21859c4b712e366250f517a7839cb5048075085fa46b659322a3275c2735b1de78f014da1a4b4fcee150c4a3ea31fa72a2acfb6aaa0c88ec7b7d5a46fde680aa0edd05d9d740f151476a801ab69bbf3f6585268a17317193f71891ac8c92d2fe6db999a0a9855629ebf6d595a0823ae03786d0d1afdf4ceaea8f4005557d0ef499ac448c0298e7f78a62861181257c3d91213871d973bb17a7df08ed00a9d424404d21996ab5d59bbb9eef6324cda9a57c08a490730e77d7a27175abd7a17edde853fded0b4c55b41ba07fb6acd9d19575c45ae9762035511fb259072c28f67e11c38ab2bdf287b344fd3a25c3d84b0a675e2d0247286f7a9b86078ed3df6fbbcc1ad45655dacd61b396e76e2ff6ab5c9872249e5e18ebe83a692978fda9ab6fcf581a8d8f3816ec2ccce061c6419e6bff92439b2e2be0dd020fa1ab1d424d0bd7f60c37b33c82812b0b5c52bfe5a7d3279c6256d9c32d58951c1e0761d0ae579afb721bcb83e53eab750bb2fcf65e0b101d3e6cf8b30672a8bcbfa6b52b0d79dac5376390ac2b238c34091a8637d8da5ef567de26c82a92b0be9efa4b56e326cf3793df6b959cc21831acaa5db629874825c799bc8ca0e09fdef4516fda1f1097c857a8d48bf48852ce1d8c607318e1a2118c17d4b4ee89150a8793a004e67aeef1301d80a6f8b8166dc99a3b85a7e8352d81adbd02a394e1ddeda50d93082785285176d0000000000000000044f7e02000000008aecf55dbada948e3420a24aa018b2353becfba72bdc61fc4feab22a4f3a85c9e28b993311be420f1486f27c36ed71aba19db357c91638529f9a50c94cb09d6944399bbad74c4b083087ee747ba18815efed5a501168470fcd4c65c59a13f55200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f49dfebd14ed1c80e041443b0e8fbe32bb71a5d28b322cac1eec14bff1500a72feae2c5d221aa3a247ae9121ce8565cad81158a4cabcd50ccd91af3f9ac05728af5103a9c34d4192fc2cdf42c8d37e9fc076bc4b52a40aad5460063e970eb41b25d0927e824f410c9193fc544338cf8758ce10a88c7ff9aa09bc10a3f7c04da6021574e8ee9deb24d6c70ef13e2d94ca0e72bf1232a33b9e871b016fedb2b92d7c022063ab094a20e8aa4c37e481c8a5593a6cf909ca9191f42d00f1c69f4c19008e0a0650de2d17feb9e943de7a62e4aab1cfa04edd375e63298b8cef98c2bbee6c7fc3d700e709aad441e28f976bd102088327971eef8b9473daf261ba2a55058444022d4a2ebaf046995512404d9817933ba5191e475f0a5738650f2bdff353175a610312ae64c71675db91ba65d302a288aaf0d54941c449b3f489d882bab8555becb402245fabd468d86dd730ed7de0881277b91d2b90e1751915312f103c7a9fb71d8a0201b720bb4fac5416a83868332b2987f7b9884db411572f0604052f7bfa8f7c05021aff106e35d3d06eee4bee238c8f264261b972550b29f65349a62886a74bbb95959aef3434268f2595045f87dc6fa87aaa09508bfd406058b85bc53809542146d41905b0caa549ec60fe03174323d8dcd3fe89626c1d7c9cbb71d4931a8b2afdd8ed4ffab498bfc1be24e737061be182392f72e28190b2c68086bf815aba48cdf8762fefe8911f695691bc25867068511842cdec70458c8428c0105c30380299c82101d49613d1d257be1e889fb246056f3126536cae031d3c21bd7893a7d9a139d13cb54af7ad8338e316f0aa22de6a1090a02ccb8dccca5d72f813aa04c0a17b386bfa872ea5ab79b32f7ac8b0f6c29172ac6f635a69cede97a599de41d2a1c551c779e89b4c7be044361ff567ac2b23a8ca101bab022c8b0662f588f20c0fe87669e568e83653844a3ea0031d63eded3cc2369a15246ee1f8a41843f57df44aeb350287614cb7f20996c364f61bb19815b5e208314d3bc5a9cf4be345985c68b6a8fe0da931fcb273053b7135d67c6af316f65c59b20ae1ef1e25fc9976f190e455149d09901a28bf9c296753a21232bd7068471e00bd316eff3f0ebcded2d457329a08a1e9f5c3952ecef210c71597ac376da563159d8f94f24ecbf6e943446145d0c01286dc43562f1f11fb61e1f9408f0a7bfd44025561b491aa3216d3436ec7dd08a67dfa2f1dea8226a8385b75254929e615b7758e6d4aface68e4923ad69c0ec65abc1f9ae15d6b6004997eaece2544a33f1e94d475f3156e066ec60ba17a432dcd91c9c4b973c7f69a6b1a16575a876ad1b7cf72f62571a07bfe59d2c86ff8cfe90ee29d964a5dc06ebdc96e4f24e8eed25d93782874ed034e0cf60d74cf729c62a7d2a4d675cac405c040851bc7b09bf1ac2fe457c1bd143e3ed4f66418f6d7f3991a9ed87f5fa82322f8d598441df363d3773cc6bdc1fada98f1032c8f78d16b0774c592dfba42383399bcbfc6c9dffbf88d0db77de28a12aefd04539f54324abbc7e4369390135e74e7bcb789e469c88716118799503f5ed05a141b6278d9f96ec7e1a8b945e1fafb82f2941addca87af738d0c7631b4b85ee8a60ce7c2ee41ec585baaa4c5dfb011a5bbe2cca3af58ee8435348d7bb411352097ba6d81bc3708e98486a68e679a996ae88d98e8872526a8f7720f79acb24e2dde946ebc60d5ddf408c6f6bf7de689d44f20757bb65f5c1d134e29fd20bf621ee7f2ca2de18f69ce59dbaab54a5b1ffd04a74d5c0a11bbe9fc70ae7dc5c4f76e15ec7f6eaa90a31184afab6e9f128c8e6c79c845bec38d489ef70c7398f6b81cdaa07041af2a30fb6a91386ae864381418e0edd9c8911d6b50fc61537bc46e8e9d390fbc7a2a4457aecb295c4874621c2cac7b5d30b97faf559934b73b1ff67e42d892fbe8131cea22e3ea109802003c5f960a0dbdb99e3a9047fb1b33c34f7739702a6decd17bba76d121d30d161d16c597e4024754a7c81fabc94517ab97380773f391df41bc36153d73dbdb0fce46cc73a4ee043400b3113d1236171a3d5a3bf906ea151fa4e6dfbc80b7c37df133ecf935bc567007f3a63210d154af9aad7933902694fd8a0e4ca03bba772e531508dc558841c2aa6a746e032e31120af08fba06c29b40f00bd15df728e93f3685c003aa07815a7fd206df54002e75b7d7396cba30c9bffdc2bc37acaae8a38c4a58d38a1f57bcb0639bb8c329d83dff383e25f255307a3258ff584377c73aecf42f202a995788e875a890ec0f12552bf1e018557c6e1811f191892be3ffb9cb6768b4f6813f15378d0afb43a515a47e282cf5269d5deea9e375fb841502ad9fce78caf3ee216d1cd41888a1232d139483f88cedf67ecbcf7392ce9fb525f219234d0e", "ac0063636a", 0, 1456029997, 1537743641, "e7241475cf238186931b9c801709c79a973d9c0c097b4c5a986399ddf9d60f60"], - ["28a8ca2e040b5db05f0fd9e302a21d2de3420b7fd6fe6637da3997ba597ea6fb7a8b259366030000000765630053535365ffffffff9f805fc942205ad30e578cea21fce527c9230fd40c8aba8f18f9e32d1581c79103000000076a6a635353acac4a5d35d0651e97aa286e64a335c11015fda9f28990c279dc1cb2ca382465ccbc060a8bf00300000001acffffffff5ef4cc2e9fb7ffcfd6e49e1993bae9711841010769f79204ea10dc3b333290930000000004530000acffffffff01096887020000000006ac0053006563a86e01f6023853ed03000000000000000000000000e79a6b167a5e4ad619294fd637669865ca1b83a3f6748a03d42b779a0f667c0e4dae0cbce1124a83a71a0be7e3de84c4f67e9d1616bc8300ec69f0af741b1787b579a2e7af1d8707c0614bdb1bc777d36f24697b2cae45f37837683e497362e70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000048e37c9d2c0fde9bea2a08431557ff80f2fa402f9634bc5301f454e9b692270a6e3ccefc5c1008af6624510caaf89ee7726a2a738af77753615a74679bd0997d74b8ef49cb9dab8c8d42659755f046b80d346007b8ad108b852a61ba178619988ee518a9f504feec0b34ecfc21244baf54d18acd60d01dc109cfd806ca1801dc0213aca75c41a51ec70cd222eb921908337e1c7a12d2eb018c4f97e9ef8cbf3a8b0323b35e74c4ef3dbd949a2ede07a50049c7c1870be2aa93d7e451585fe474ed6f0a006f9d7358c7125afb3310956383a9d0ae81fd459ed2b6bc148b2f34a8ce91008a02d36193682c2a72673ce4694e402666d62f4222ddb50fef3e87380b80e20902109634eba0b1f37cb53537801a9fd1b0bff6ad346d99b277d71ffd5ba78383d202003557bb64d6779b7563ba9a20b97dc1c586a83caca4bfd540d723c92135d8fb032f72a8f96d84b279355ab16149783512289805d6d0a908ce7d74bdb59552c12702097b5e7c4e3cf7bef77a41f43d116d0bd4ba5a6d5436b13ef3b96aeba8faf728020dd924d2c6e102e9d6075d3670b115c3ca6d07f7485cb4b6fec43518751325f03eced6783b99323f5f51b3bd6073eee6a0612b6bf8cbf4aa51704571bc42167d7a00f3c0c3b092c46d4ff256b8079c050a9bf2db1386ec597787eb12199a1264c3f15ce6b41513627cd2895502941bb1b49dbc53af4a86b975fd6c68e726d4cfb8f227b41842ec8c1f3a683229f012171ca65bebf584cf2b8f3b2868391a39467d7ff1d8584e1f86387ac139280db7009e00ada9cc52723c612645dca8def416304d2c34f5231159dd1bc70b3f8ff925ed5e4bb20d38193dcc27a6aaa254c2f525dd4befeeed2d8bf808bce330f98c9ad707b2458e415ebe44b1eef25596683320cfa925c92d3c36b94e55e58868bb46f571f7e9b8a22311b6d2b49d95a64192fe50152739a813717646f45aaa4b0de64cf259e5b2ca699a77f5f8711113e9c2370b6e73d6cf4a245cbd0632ef1d568127e21c5f26dbac24bd842922080ce4e0a277106d0d3ffc6897784df2502cc14a431e6a5390195e0636a7593e26ed676ca4760e1c77c78da401ddaf96b8b06a0f1cac64e813042a2da2480b487e9b620c663e9705743eaac21fb11e616291c7cc3eaedad87dcd5f6dae34bac5aadda87a64e2df5c9c7435b9c3a86f5d32a5d11763460e82dccf5a175ff1dc149f01fc23c6f818c1a6ea902926519ccea43092ed25cd2a972890f6a61547838395677cc92fc5943c3a0a64c2cb4b702791e703ae196dd3f69b6f5acfb5cf162f3827762ce94efd4d495d824e061dc2e9a53cb29076651981b955257a0ae9facad8b34c73847c2f01ec71d1dd3905f36b3d18e3faf6175cc3414c7deb944b1625e42a81f5a9b2b25b9f3a32b6c994932c2f7efc39a8a9c73e61cd9415b13cc32a59192d1c8308f227c3b1809b4ffaaef0675be30d19bd12c101bbc6ab04cb4ad366d20aa8723d0102661628c334203e2dea16830d56f75ed612ef13c24386faceee9b017bf0c22291986aaf80a167dfe6dd602ab9dd7d27a0b48ded34d0c4f287fcb6313ad6fa3bb18cdbc59840960710a102bdfe6e7ab7d454c1d309b7d4bad11733baafdf856bd3c9dd5a41655cfc340576903069feea155d469be41121fca1a5dd084ae6ac07231a157af404d2f01dd8ed52ac086f20bc3fd25d31b6b594461b8e34cc125808b49d760c5be09df18518c100e47591b58072fe8a77c6d97102abd25236948ec051d97363e3c23e6e881cd53feaa5cb6d9cfdf1dea246cc01146555f8ec9a01972ac75d2099511ef97206b900b129b43aed585088ce63d7d2d6c075491b951c3d277432281c53f748e6c25aeea9787fcda69c84ebef7e31efe375962c69ba234ca0bfd5bc6868834555079ae20e97984faf30ce85a5d1381b98bfc40b21366ca1c30434e47b24d5a9c3d832d67c5f9dfe9da4ec5d753ae0dcc38d9645d8d91268a3f07311d12190622a8af9c333781ad6d9e6dc8cb0ea572d6a1ca66216e1d95717cc75a7aaf3e9fd14c3f6fa9282d9f136fa55b2f2bd032e0434497298dc09ba597e6de058cf7db6e80fcbb9f3fafc8543aede73bba9bb48015e30e08093d5570ced182f5fc1c28f64538bdb8298e09f26058a26fac4b62b76979eaaf2cd04e571ac29ba839579ddef0b5baf670c2727092856f45528289d067281cbc4f31b3c578b1bfccc76ebeefcb9f5c0b73b94b78d4b28eb2d58282b5218fcaf75cd5a60c200a722b0cf2fb4c10015d775db06000000000000000074776b030000000092023cb70f6d612c108408a252db34e27b85d77639b31f6da922fcf6b6255fe007b172cf1c5d846d405f47caca385d7070b46c5eb57d629036ac86dff04f69a8b1babf5246640332d3c5bce27331117eb960c62b66911e3d6b435df4578d2bed000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001648292f5bead32838396af1a22d4a20cede2d0fc552c0aa8993f5b60d699ec8b240ee2407d45f056a823bf54551e987f79013c91b8f1133ed4a555066edcde1176f3de0724cb9603822dbdbac20de808a17fd2629a7a98b97599a74b51e12252dd7e9514cae6cade243e2a5c837803a23c05e24f2e12740d5e187931df24def020214f6d99a778bf02ad4d9c03066435c73904450844c0d569a1b642285a04b950208ad14847e9061ac415a8f5ea2aae8edd5238f3205a6037fc70d078ce625423e0a0057c6203905b69662795453ebbb639662d19846a30a4cdda798201eba5afe1f2b07e7195ef53f28dc97124700eb8908a4a70b058620bd3d37538887ae24efda0217f1ee06295fe7768e38528c97b1e392d7f44e07389c701fa162128d3fc01f5e021eb317538b80e1761c70541ced325edbbc59a21d59ddd2600eede60a7027534a02283f4fe6b17126749cfb11a71ca9df94459a296316a8fc1894d9bc9ef28f47e603193c429bee2e16286abb3d5665b932841c92bb15f6ea4b629834d28f4bcbff81021c8c2e74028a4f8fb8b35d7f8aed8b7ee7494fa1ebd8c34c50341efeb8b1ce3956731e163ffea346752633d8bbbb13de6088724fb620f309523e37c4c5eb28b11c1980e5f05c42a243e944e9eaf2a959c6f5c009ce2dc4ea972f47414e4ee9fd873df23918dfbe69e6166112b7b6f71d1a23c08c015440f70c50f8b840d59cb1dee8892c6bb157fcf2c0a7a9fa61c694a00d260a4c4fb041006875a0ecff84792b17de9373e531b6b1b4cf73830cb9ab7dafdfdd7fae00a5115b18b60a8d2af692c99d38e9e8052efab278d6a3be77241edb5b863aa1b73749c68b9a6c931338b602f1ddd8de794f30e04116e127e6dd29fb5e9a4ca3a7c15dcac2c102f0946640ec5e4b8b4d6ef37bab16ca10d29d196d182aaf13e9a0344c06d76e1866575067d8b16f21e4af49ee878ba2acfa3c147d1f8ba72e8b1e5162eb9c4259a1ad9da3eb7e1ac7fc53891df73043795729109d9384cfa8b5191ae77157f62dc9fa7bb4029bf679f3251e0e32eb31b1cb1ed5b3bd8eb190e3753b29e0fe30beb102c9cf445275af0e110a2694fd6eb03666495b15dcb75fe9701bd79c26c24acb792534452124f26aae83d740ac688346407a6e2ad961e0204daa4bd2b730bb3008a44cc4aa33538c800db0f9fbb0f3917b5ede5db41f8769bdd33737f82177cad9c0bdb6d9b2180aee2f610a874178b85acd52bb5cedb00b07dc2a7440ce255215119ddd005bb0716ab92aed314c4f83d109fef9a639374f12cb0e9c12cbb151c64617219e5582bab61813779acebb33f5705f7e00cebf3a2ce60f83152fcdbfa2b299e1d8e615ce5d8b476037a1b1d4eb331aeb5a4f1e091299a0cf90a4f1835dae4290a902a393073eaeb9248397a0e68f1798d303b537cec329249c0f60b554c22691cc7f0bcf8b78794044b5c695737a9137d5e0645564ddd94d501824002442094bcb2315730276291bb66e8c3e5f3e3c09d087d05bd7cb260bd876ef1c0a3d1386112c7f307d94c4ccdeae253e9417a2c18715da7ccd0d735ef8eaf8cf30ef1b990d80a469bc8a4e294f4b7b0d0a399da93dbfad83388b65cc5cd222edefcf2212b7516e77a5caec326b2db7da4ffc280359f3dcf849e8b3d9aaa1b9e6d68e5889f73dc8553f2e4128d59acc84347f967e1b34f2cbfc536051666325eb2d3b8e83c35a721a9da897114a59b9a1a6c5d16432cfb83c575fd93935372ab000939a574278c69b05b7d121bf9304b2fde4b944d428f174a468ea048f40494aa7f7e667addabc6c456a0965ce437db21cd0c53dc53280facfb024aa2e661715f0e7f7c14799543c9332aaa3747307d6ebe610e5aec36579ac683a52e26950c9081d562ea822b98e612789d7183b814c87ef3e716bc8a5b8e0a0571d8a2a167a6f0790075f4f1d8653a749dc36282c76cd26baf899671c71109abfe916eb5d79a1888eb699a9941b3e437a2e667c1228dad6f7f4b68903232c9d17062475fe8ac40020ff3b2c65af68ab2fe8e239c30cd6ef7b8ab8e4a3ac24f96c557676a4e75319e0668252890febf76535c4cc50750fcf184e53daee985a30fd715d4931e8c28e3004a1fe804fa56f4fb37173ceb2bdc3cb10997f4b147a5f06dae10d86392d0ceb6025a77e6afc5996b3590a1e4babf4789379ff0b2beabf999b5a091cb4f734f26ba965fef84137809c3e5f712a42ca7ebaf8b8d83a14ab24f8f5a5f55be8608017884b0a9ab6d8e01a20bc64290f0442489560c0e22a039e076b05c5482b97d2f4786d98675d35e49ab143de0448d94e1717fcd58188c607e179365e4d698bd67b0b50e79fb70838b853cbcef7eb7538424fb4a7b70781da964a6061f716ce132dfe59695247b8e1888ea8cae101431807", "", 1, 1906397176, 1537743641, "5cebd57cb41d77cfd39f5f6f82309c9e07c2783c564940dda32e884e7fa1f055"], - ["6c9ea14402351c2e92f6202fa99d1c7c8b4f9c2e0ad42abbcfebffd23eedc5287acd6bd00b01000000020063ffffffff9cd6faeaec6f04aa0746aabba7b785b217fd2bd27289e0465b9a6b595ba9c2470200000008ac5365516a006500b6cece040185e6e503000000000852515253ac516552000000000206c9ad0200000000000000000000000034700266ea268fadabe4e0c2cf0e1f574e633935de71ba4af1dd4576f87336120d0bd30cf9693a6ba56ac54a6e4508b6918d4a2daaa6036809a34d16f0c28fa2148c413600ecdfc034f748ea2dbb10263159db883a300004386f38298b459018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008925b5822c335a9ebfe689ba6d1e2a7ba50732c0016542a4a6232d7d18f61a697ad2ba2798d34baea34a767716842e7ef518c1ed3864fc892a495afcebee88d860e85da15051a541ad8da22fe5bab89a768dae861da70ad466e6ddcae3b40f4a642b5d082e657e3a9bf40834e2aa7c881a65243783ae03f85217964e65eb525902226ea9a580b7d7512a8e553b2bee2bedc504cefc3524b1c009e951f3e1c2ccee030fe590b693bbb65c65d83be23dc2a60261fd3576b0c7f35a47f0e1ce45c190ac0a054a68f3885238c4d92231a95d0ce4269a359fccce9abc6ad5ec3c9bee651b7c5d2abb7dfe87a9d3ca1a20a6ec99f614a5566768c9aa3d743a8ded5158078caa022683a89ba4c63c9a42ce706a3cd772d0aae23220d5b082e58941f03739e5df87021f2d2fed5dc87fabb0427a460696e29c3f418fce796270113f8d039e9dcac21c022b6f1a545f1b18aa3dd90319eb7e1b6502a74218f51eeb54ec85ecf21bcbdeab02178ea12583460a042f8fb3d7aa4dde8944022feeae90309836e0b4129aadc8d70307809c821c72254be8d2db8f3887080b1fff220c30db30dc72c58148ba0ccdbb80f3244f93a8c6f063866a0508c6cc25be610ee4372ba5585c7eb39fbeade08f29e79290697d05305175b80906c9aaf9e0e0bacc513a9b8be12adeaf002be1047152c9f9e3521af726411d7e539bfa3add69682ffe5c9c28fb16bc9d714d35f8d38d2d914d20fa5c8029327476b94b9f9d2731c7730ffc185b80c189e3a698dc4d2fa30ba3aeaa3dd48cc2b96966fa84bfb8926919d408c6c443c4ceb8ca87de4a464eaf8f64f77b2fe1ee10f357c968861a8051840e8f2eb1719715bff2199ed1fe1228e2b5810e6efae60465062f61441ae0ed2187eadd72ff20b98e48803c755a33ca930e4099dbfc6f8c48d139f8522de6015a26d4b4fb027f108f2e5393a65afdd80ce0feecdc32a41e27c583ac9d2cba9f1bfeeab6d5d7e15bd9b171d140e803c5174a61a68289f3f5dd1be71ff1eb3fd0111e902c9e16c93d886451fbcb5aeae2c67555e0aa850c99c6dbcfc69bdbd14ed1426d8c78765ace06df551ce2a5eff49c19cc29ade67a94bdd9dfd77c27b1cdd51a780bb5929da9e91eae31a9885962f5420f6d6ec95043a5fac2ef57e362ba8ba6ede9cc17b423e5b6c1d7b879decebfdb2434c9e12e872b4828d2b7712b19e642305d647df00540d5ae19cb93f1bab6b3c6756b900657e3fb2c17ce7f2a67298a459fef1f80a204655c04128bcae05d2ca3597585dee0edaca1555c4315a447c43eabc5db9f85d7a74e293865444eb5b31f54a077c1cc2a8cf575cf928f05a47fd80b4b9ec4f36cb092b85116928a6a76fe9d2532cba3fb55d436705901e57fa2f82cdf08e063d2b0260348a570e7ee27469fa3b2609d1b3685aefcad73a0afe1d145f03bb39d654faf7e51f0fb353d0e29f0ea115696f1bb83e75f071b6ed9f8e80a73c4d8279d0363b90f36eb31df47eea3e41ae4d36ab85cd43437996adf8d2e4fa1c259579212410d3362c6e3ae262a2948ced0b3d7c19581132177c2a2e06a80ac81b88461fab71bfd771011c34372c97a9eb07ee15fdc4253055e08cf6050b09c443641d6a00637f01f19efab65ab0e10370e38a75d2b9aa2cf4d7f8f8f10ed8151d51ffc6fa5f59612ae1a9b569fe2e5a68e5e6cbc4990eb8dbad83df31c9afc54a555325d9dfa5f116f042a7dd7d65b14413c404328b8bceb3b4f9b30a8f7018fe9af471a003bd46d2a767d3a8eacc6425e343941fbfaf292b198b549bcc201abc5a719f5e521293d275ee1da8c4b282e445d6b223312f34b9bae661a0b3c537c4f3767aa77f48b99fda0c9ef6707e5dbc52bc1377ded2d8b62943447bb1dc56a095e31a743b82afdda67219e56ed4bb5f717f674c48125f53efa14b24849c52e04ce59d9a2370f93fd9eb9c70cee5071e9549569b700a278d876445f7e3d7a32bf31035751de876362f1d270e7a0443c69ce33772be2f2425015856d9f1a37bb05bc7b68d2b7568fd3b112fc484ee7a70b49c9e6442bf75cb22a8586118f56154d5711edd60532951bcf3c75aba1ca9b926e7f1358892aabb8ea88d071e89bfb7338c000c975dd85d0a4d123868711a38738db8d5ad74bc3e5c545dc5a1ead7bb4e03eb19887d8f7c1c1b7b75285cd8fe0d06693626b8d34703e156b9f9bfddf91739bbd179590ab924c2aafa6f8178f4803b8504cdc452fd042ac4fbfb685a2a79f7a10db6afeea967a54405506bf610ab53a3cb11c58968d318400000000000000000000000000be6449f3e5a6ac838fce0e2abf36b64698e58a3e48132d3c0d02a3ec4bf0648c343e247418c026cbc596dce0a8dd7bb24ce6ebede0744eed463a540deb180d996a6d01319a10cb7948aa41c4b303a207935087a08e4530f1989f89dc15a8dee7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f0d5eea65cb060b3e90c580abd929c3b3cae73a9afff6024555f79077f203ab2d15a8aed2b5cd49d69b5f7ecd4e0d030c7da63affae68d42bf163a4e6a84402fac53b75a44d873e1b14f913038064d439562b310bdf013e9fa4213a6305e6fef812b383079d2ba81ac03b80dd9a1ab9d1e6144d5d25d02af5b736f54f2f60db0304a58f4d9371398606fa0843bf605735361c34ba46967d6cd5c76c957f90f8500306be8a693869f967f1de5fc8f296e6fb63a1fa9b261c9c1d18323da0c62065900b055d77f4512bd7d746ed63f3c26ea6e59c8a4868661634792f69755bc1c39f4aeb0a17cd8f1e73c5655bbd551e8e5b73bc2d7fd3be5ad489db7377c580adf89203237e1542aa0e54ad0d908b8ee61845f6d85faedbb3008b758b9cf344fe1bdd19030d060c08d71a96c0445c361b739f3ca5533e9508ce65febc65896feb3bcee2db0204f9996a247456008824df5b3ea5a70495a99348dd13eb519a139922d9aa6d09032e9b3294bd2313af9bf449caa52e6637eb7e8b195c801781972b9b3bfa2f5d8e02118242fbf3632dfee3cf9057f2945d4f5f0cce2f6ebb0ba78fc64fabb1bd8fe47463c0bc6f8c82b899020e25d2ef320cc1293c266ec214efdcaf717ac9fae2b6762220404224a7556afdfc91a055113a40067b9bac963bc2b40924a24b6836c87c03ab907cc669440c3a6a6ebcab7e78bbfee1b56aeb66c3177e7cd0c79a9491abeea99a90240352c7affe0fa18d2a2e4752357ebed055947845680a1ee5286788fb1bc05f154d62d55e60ae17097d39304f928d01348cf472ea728095679cf84413c3653ac388c725a0768a6ce420fe2658e444877a88b5658e4e442ae540ad71aa127afd35c8ae14689587862e84ad7647a6ed11f4f4ed82d3eac692defefd862270b85316bac98c204bae0b9046e68913ca90df0ce04ae4e9355663f6404455eb64a801d079ce013393a399b02a99f7c98692b5883232193fbf80021e382dab2831eba5ca8a1135da04e3bb54e02e90f4352c327a29b5add781a904aa4fc3e0abc5ca60a097f8f2c4a9030c6748d729a59406febbd3557775ab71e40de4d7fd381b64a4ae21b57be624432ba8d0ef458641e612cdc6a63b32512e449c3b8b41edba27a8fa7ec80b38d9af5067a1cadb2c83e9bab0b2737fa4444a62de67df5fd0e91440e607ad65c4d5a82e2aea39a7433f6954817a57bb73092dc50b35698110192cfbc63eba2032c39c9ee3487848fef609d78e420b084be2c930dda962a5c067cad9c1577e7fac88d5bfe115ac6a2d3c55a36298f10b849cc7658889e581ac9c284496344f78ddc2c5173710c501f885575bdc7d23f53e46258f2cf70701c36e50230b5a56f077350f87ce1a5a1e2be062f30aa11b766aa124f1f46b2ead4385368aef85aef7b4707aac0fc8d8531684763baa055b46bf99807bf58a8d4c7bc3d296e3db03caced9419cbda9fdffe2a974bccd474066ff6708db29167210c5583487f6197ff82a6da4ad353ee2fd3b17e31cc4639b564efb17c524aa0e0dc3a810b54b6e5940ab1a263df6fdfbe6da9b684d2aebe4bcf274c48cbcb9f8d59c43aa846bbefd27f709f810668856de9d6ba075f998fe20e1d949417551964553f1cbafde35d6a8457df6c49029ddf0eb3376c7a906875d606ee4b7a98e58076e027c359d3fafb33ffbdd752e3edb08fea10765d4727016f3c92ff4cdb28e47d47803817c1f39b624486f854e8d087834e65777a08001253fe38009fa0a99ffa965029df2cc5198c28a11e3fd8dd832ba234e6ec958f2df91fec842fad8d789d1936f817e3876a6a9ca7998d7f778812fd303e4606197ef4853a59138b0ba91442fc89c9008e4d046427d5532eeb299d20a1e2d2cec1d3fb63d070188169d6d8c972c0305a30fa294f80e080d99c3864203b06771311c6a184fbeb7d4791c36fbcbaf4c52aa5f891e40dcc30ac0550266d59cd5decd92db0ac839ef8bef5196724408cb34baa06e487c349c31c92f1146e3070706cf3cdbecbf10880442f34c9e4e12c1418a141312a70ad93a2580ffba2b3bfd86e15b1fb34e82a3022b6a633722791244ae749d21faf592f7cc4b9b3556c30def099d561c60352a3740ad2eb2a601d09ec0640febd19783f1878723d6e8b8bf97f19439610b284b43544008914150d35ad11cb03402dae8bba10add9f8aa011c941f1c09b12840771cc590f3a47b47768bbd12cfb5220c6c3e525e321a02739b813810b02d6255e03ccc0080b82205a19f3b36eb94c9b3e0771b0e8eae5de4d4059a0cfa0d2696731b8fcc43218cc39a78ac437a774fb641da51e4227c4f094657d9fcda4dc98a1fdca7aba9ac2acbef6335a059e60936e309a42b52fe14a7b0da165dd46d9d19ea953dda85cedfeb28966275b9132bb7df31806cf08", "6a65", 0, -1804480395, 0, "86854b29035d29386e767d18e9308789fd9eab6a1450115d198f46e4cf828fb8"], - ["030000807082c40303d531c38a838ac9ee50606e9b1449664a3bebc8e9d8dbbd954991e34ca9e2274a03000000016ac2c6b815eac07b3dccbae2876c7eb6dc60e438651feb7cc6e6292e6bc4399b5b8418689603000000045163536a5beddd8c1659c1243d50c8171ac9daa74d7e2b12f79aefd210888cca69970fd327c0f90d00000000026500d36a2e4a02ed0a2705000000000100aa08fe0200000000095353535252516a0063cad7ab870000000000", "6500ac6353525153", 0, 57086117, 0, "603afd008a1ef05616c83457b3a6a6b9c8818ccb4a9f38f1e320dad739cba9cf"], - ["030000807082c403037c38c215ebe9262d44b24c60b5eabe72617561471b32f88ed3690aa995ec74c3000000000965535353ac52526363005f6384ecb7cb313ab81eeb28ca02d78b408eea162a0706909cd198ac11503017f7ce9c030000000151504d49c2efdc9353b0b0d96ac5ed48a5cc2c823c3abbdd5a1dee3a4a7383c11d9d815a760000000009ac5152635165635165ffffffff023c6455000000000000dc40c0040000000000f671a5159698319f020000000000000000f2abb4030000000012d9cff824122bff43921197decf914facb51a3359613aa71f79229c9933377bf9dde3483b01a724e56b4eb029d14626262a838080f8e49fa89c9a7c2469edd666ff4f4a3ce0b9ee6eca7d7a0be4f025099da475fdddd0b104995ac5ed74a06800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f065c740a7e04fefa91f23345d02c97db3b160fb7d2094cd01de69ce4473f35a5213ce8f92fe305de1b9b260a2c42a499dcd3ea59c7f44ff5b72a062d9014c2a67d4209021c06319b1954af8d1e8ae82f5fcce5b436f88505e0ab00e413f81e5076445a256877035ce12e5b5fbadda16bb0d0ddf3fa275a5dfb83dfcc0c05592021cd3c6e4a123462aabb49676fde27db5760f4624c35d1e329327da4296b740ef020418dabc3b2b50a3b2aeab68721a55a789ae25a99cec5753b53ed74abc7421180a00ea25473477d6678f98a64b1f18a4a63bf455ab4dcdcf047102981b91cc069e65824b6b0a4ff31bad4769976e146572344228bf695b46b7f686c8f0fa66a8250320718258585c59d23efba7de65234a15ccbb91dede71f313da5d1d4e5b361206020f34ca0e633cabd20fe89ed8a48825592fe69848e88def971a737362e3ed18ca03156ba123c6a55042256b4a9f18ee885dfb69bd61f14d6918f2a90cdfe954bdf30218ea06f68d0b751954c49234696891c3e10cde3ff391f2e53acbf9abe9197cf8022375678476dfb73e26753015d9e45fccdf01704795e142d0fe3dc2cc887ebbfaa9702730bc9917a7697a03a74d3afc5db493b34f80922cf55d986d0713abff2e72be180df59790f36c5751cf9fb70e90bbb94e416df32107140267f8cbcf3fdd4fcc003cde7e7d8f1ea26f82dbff4a9b7bf28a2f0f0d86d6b5054da06b54505154401674d046663d13562dc8d8e5502942bf4d323b64332104eea7e95dd073f3c2bce3747bc9795004be4d5181bbbe86e9a37cade3b236c2d05e7eb061b0dbca1f3febf8207f56d77eafea889a17b217e4a57a1d010a1c6b9eeea070bf5e3d4f7a1d4791321e7a5896b17ce117b30e1cc87eeedb5eb20bff2571d4cf7bb1046dc7f298ebbfdabc481676669139f8e0d0acdf78bd3044bde2290d30322c76762fb7546bcc638911fb0d05d608978d418add71ba9cb13dd400f513e9337f5d035fe6f1b98df2d9a610b3b1739a814d45c1a886f1c2baeacf927c3c90859b91787c4650819f6ac1ee93e4c90147be0b30ac006bafeeefb88acf76c2867685f787700abf3355d0099b253792c5bb596136121880c368ea3a38882b9e8fc61b7c629075d3d7f92c8257af80c896f02c4bf938ebf666863120d9679fa42bf1f6054cedca6d1eab890e5cabdc044b8b81b9d9069049945f394dcbf38e3eb5671bcae6557f6577d70e787c1ae4df62c69345b741d7921d63d133b6e66bee1b2e2eaee6b641b4cda4e3633195134d0ae0d3bedb0bae0fe974bfe7d2fdda84b062a7ae83f80d1bfa2737ec3751899884cefa1a4366306353e05d0b99ad677d5b3c2b63fe65734e854191d55cbdb5ac365eba4af62da6cbcdb01fdd4d3be0d3d2076c4ab66082bb517116f0a1a6b16015a339da720a19781e26b98e64cd8b94925c87d8be61120d6cd2545cb8b145301122dd80765f43e14c411338fcdd323111f030d1178907828bb97cd3e2356229f5104d02dc0c83bfb5c96e9135e922cc1af8294e48052338015174def527f18eec0fbf54c91cf9efa9aee4a40794636c7385f917acf18e6b8fbffebd92cfdcc1d3da4b3eae624f28d849ae148ae0e0e0838a263918919583e94dde3a4d281576fc51fb5dec94efffd95be3dca7c678e887e1c78cfaa5293b45a688ee48e5ff3d4430ab91651498dc6be389cb2f46fda1e79ba13b493113253d9674e9f414f88c5f09935b860b35adb666c2aebb1455de801adf1072d8ff6d8fead84ca1c80fd8ad4baf3a2555f1d55afe6aa291b782e7b5eaae9e2a330f13b3fa1a7f165010a18dc352898a1bdc6375a41f19dfe6a5ffb059a85b200d08a8de363bade37577cd199bc5c7f467c1aaa6f0f851f980726e4a7164cab89b04cac64ae1cca79aca794688fd8df922a89fd2effab51596c5962c081d86eca1397f3c6c1989012c42c7c62fcb2ba02c61eb557f30d49ab526841b0995cb8f5a7a76899bb09f2c57e449c75efba0781de393186c08add2a99432e910db25d1e656059afe459560cf28a4230bb3b3e4172e51dd23ef7b23a4413a1f5ca3aa99a088840e430c886a39941d6d9718212b0bacb78c55cc5e8503e06d330a607eeef3874bc564102825d2d07a59350c88732ff5b05fc03c110986fbbc85405ec94edd7a766b780712db7e46161f25f9cd4941475690f9f83a644e7d1f5ceabd14df1ec1492df1110dd5aa39d49826f034f0854398aa3fc1b072b2667e07c7475f2c5895f16303362a7ff6500437cd8d44533146bc0000000000000000296ae1020000000012592b7180c02b21e622c39cf92e33416af4ab0d49f7ccffe9e1ac9689805266861033e2c880ac8787bae9100a71fafcd16f571812be32c6c87973a4d490574aa647a0e38f8bfc6a33d16af91ea0a6980c871d7b5279a7657db292823fe298a200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c09d1d2afceebe4382b607ba2bfce63f856f58b55637a820bb0410567c0f5e708eb1ad1d0ee5b5d3651e37946e36a8fd92fe9e04f11c83f492ca6b0753f85ac454ea08df42646159f907dcb8bcb3f72b2023934786e2ab9b2e7c032e702be00ecc032bfd7365a45446cdd477fe08c45d6ac6e8bc79b11b9425a55387d549d177031f0b72d79e4742f783776b303bf519b62d3847b080852db4a1b3f94a6e3218c5020e41d112dfe4b7cb9f346aac01861b3e7ba19b508991b2dbdfce07f1d5830add0b002286a0ae6c8a67481ef5b2da2204dc4c2dd8fc9eb2679c895c123d5a7525da0d6fbfcb14b15645e391ebdca46fd8a5b39105b627b4f77775d187fd9555b02b030cbb19482f53f23d902e82978314901809439bac07e9441f8a765d076fea56f70330169931b357ad15f9d786d54b6874ba756c6995d281d02f37a2663d2d6a1ebd022a2bd365be81183c15199bae531a9fdb8cd661eb9dab488259c541ab4410c3bd0223ab35f9a382563e4c4eb5c1f56687973fc388a7685d3035d82a655fa6a762450207eb603772d6896a8dba3925bd9c1965a1635ca165683957a43012257a9d963e0d0699d03d8595ddd515187b2e304d2c6aff770b2ea7f56bb5dbca6c0fe30988131fd9a55e3a7cb6f32a23988510cb5972ed2552e4e8c707a6332c9b0c0869fe13598a97507de3eeeb2d6875c19cc32f0e5137bc886c32fc6fd4e3f861d1592205d00e5c13c974c1d49612e3e738c5ff0688aa24e682ccefeec195d77abb673aa76dd31b8a1b8f96764b3ef0fbfd1c001f47bf1814247ba7326d3c54e51b20db90261e4b8d051ac92e9cda1be30e5e116ebf7f2a14e5db2ca85b5ed78a9dfb40eebfe39ce720909d5c2adfe7aa04c261f72f12c113801c3a4fb54c849d276971b89b764af30a7adeea014ad60941ef8b7b4a252a5c5209fa10262457cf6c959088bedba40bea34efccf895dc2f8a0ca808323b77e62f42d05b39fca91bb79a5adf5357c827902cd188b06c4c996f5280aa46d3f2bf5948205ed477613e98c58a5e79834bfb1025e62cd6a6a6367de6ae25d67988e86e96eab680c35767d64c1e52c3626a1f21fc20a0944417999a27340b80d65a3b13f6ade78d51ab0a4d6b6e842d74c44892df5febbc5d826f9b236b01fd0a6d6ba112fb2b6d95941f0aa2fee6c9a5536d3561ce9421de8def963afc01708ee2daf37f6e9c55a17e24cdabf6ddbd0ada5a2b5ea0c668f65d238f07461bb270cd4b3284a0dfca913923061a6a1f3403721c73ecc07e7c888b60fbb6ecacd38bb5391cb468d91587f1b21a400e815b65291520c5fef66a20987a8698d22bd51ad202c4a7711d8637ba5621b10f0ce221688b8763da14c8bc2a89982e637a0536753a89d1058102854d4130fc92e51db64716487734d6a7bbf5aba140ee49025561b12b5205a4928df95168e541058dabf5b68ea62152f467e610c74700744897c1f6bd99ea30ddc9a1adfcf881565ef5650beb51348117dcca7d08ffffdb911c3cd2c619c4f43df49ebf1522932f83e393cc2e3443682c43d95efa1696e1d168cda4a229b1dd7867e9dd8445e74b52f102e28159426b6a4dfbe27d2da0cfe05ecee5e6a5014e193bbd8e8f6a14cc408aa5c4695460b98fc3eb692bd39fb179a3ad81e98080f1491e6cdb2628853156aab552e230cad9e3b5c5e99a98f1ea5845a5b6f55d4fa0d831cfba2e48157e663c35ca7a3615c4a7eebccc61adb2945a949adb3d62a18467cafb696cd248cb28756081914b45c74cfa16d6ab3ce31c05e4618a6b44848cb8b0127765a58866e1ea44fdb5a09d88f32904a664f856aa1c741019dc3545f03ee5a09ed3008ea6d9b9cc48dbda16899d84165d7ce263bb242215e53cf334783021778d04d70569dc5a193ab0817f3e5a10955bcd8565c8ce8e7712493f5bd3529b27af176e0fa9f83bd5810395d107a36a740491f892cf9a71524fcf2732de95b43cff41590b6dbad304d8d943d63de6e8e22905750623ab1bc86dda4c66bf97d0f6c021b3eea1bd10fc86e277ec284f2c262418faceb65c15a629452d8d648bc67a1d027cc3b0493457cbd471d1a606b52c49208e7b53d6214d6f040e7a2328cd988ffa9886a7c2b78e1a8f3c4b9b50e782c3a9ef9cc36c42c7ca793a769ca08c5be9343028448c811852e8730da0c8dfb72a7cb734664c5adfa21161202e3777c40a43051370f3b010f0c2a9d78c841e65424a9155c5e5bdf063e101c40734031bdbda03a7174919d11e87e5bb3907bd1a693e3e73f8e0931f45c35136f42fc5cc15ad6b21e4d3adff08b8c0fd9533dc64320ba078dbd5865c5151ace67869ed254d9d5b29e85821602d0e5daa1bc4daa51adf3e1a1dc8d40e37e5d65963d160e7a1a3edaa535b3bbf2f2140d2056384ff0acbbe6ed208", "0053", 1, 2124128859, 1537743641, "e3bfa3580432d48886f2f55e5bf054cb3e0da928ecbf5c72047574d1d3523528"], - ["d91e9f6704f20bcdcbd9d2c055de2b82ac69b0aef79836f5afa7145c987dd007eb3fe0c4ee0200000009636a00acac6a005265ffffffffc075aff239197d29c44f6f85d5e5f6b304c9c637c9a544751bdc4f293b6d0d4303000000076aac6500536a6351226d14fb8b56a55cf6831e1a9646d83f35f633020d4b419249373bd700e7bad355680c00000000075265ac526565637f11dd7610086778c796a7c208707357d5282bf6b990bcce0ab159ee580eb6112e5e860e0100000003515165ffffffff02dc26050200000000086aac5363ac530065cebc0900000000000351520000000000030000000000000000dce49e0300000000c2c863feea81698d573a67aa2fedd250136db837d49afe1493cc06fd852260de8b39f996b186b372cfe2bb7fa743cb019ece4813f628640082c425be03faa4493dd12cb4243b659b8472e8d7933172169572f466e0e3969035d81bc5360564ae000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a7234fd1d3b629292399b82f97e1e846d15bac9b4e16ba92e43546759c007df5d7ceedf146e4a10f7abfeba38fe58e6005d2b97c9b6f6d67ec079b621d9c5076a021b4f6daedbe8db782c870b2279fa13038398ca163ad49975a569866c613deac15985251c6d1929709eb42b6bb2406857bf3d4b7ea4af6af9c703073a1665021318ddb2040a9b136a68758d15d6b7566d7c3575e1ac13387731267fcb07d2e102081cd9a52b0f6dc8e9dbb5c41be5a4f22e6a9d6c72beb2eb56e0b6ba71a9b8540b06a9a0e5a8f77ddd48d55d6988a3fb6e6a7843aaffda8f195fe81e6cee7c84660bf0c6c1a140a1124651f61b82adc04ad790bdeea64509cdbaaa24117208e78f0203cce9204d3c27bbde72012324f954e3c13935242f488bf25500443f0198042b0229ae48f5d3e574d63ff102f7644f32e19a0f809eec3c5f43557cc59591c85d4202182016741031c42dd995c48fb585bb3e1940d69a30c171494759223cef3eb0d70303984035c19a2dd74d784c66e4f73643d4e9f1225b69d01315a6310426792e6a03149c5af18e7764eeefb84fa455faa087cc4644bf5aef8c7e0fcfbf9a91a0f0858b497ff71b4b87892075ba7ff0ba53b788d9bbe45b406a7aa85cf70572a2055e860f8019b2cf2a127830028aa213164bc8d153a6b57924202247c43dba14d6dc63d6dee3060c8b44dabbb81c24c93769a0cc6e55598a7c15259187c4a7c8063dacc966667a5f43a3282929d510f29d61350beda9ec99bf3c56299fb4e59845096ad8aa3be1537c8438f6361c70692fd9cae0dbb6990a3ed2e012d587c3bdd3d35c4f98086cdeb4082d13c7321916f9d16e750794b85a98178da7469b0a3cdef5eac87166046fec56236dac122f6761afea34a7ba676970ec09fa684e3d766eeeee0915460932a7c3404df895cde25d3f9bee1d198544e4a53d4ddd6a7ce629ba015ddbd31029d0f593ac4076930c9647b4e4bad3d3946af59bb67470b42c498d044cc7c815f8746ce563bfcf1bcc112ba8303e069e53a742b37b3bccacab0a984e4f3c6bbf1ded4ce1cddaa419d58b2fd109d6b57205187ab87c21b003ac91e1436c3c3aaa27314b543b3d6205cae7db8d9809d625924ed7979d991eb3859ec2c11fa47f1141305b0ddbbf5b20c3becc7d3c98a2f84de326aedd225fc48c7de13d29348bdf3b5c6977ccca7b32e88d220ae29ecc0fe3608a5c29aca9f65e9e56de7d5738f9f5a9d3a39d0209a87d31c81e99b6516d18e2dc102f77cee032388c216de6c623d39685520eb9ee0621bc49be8d3917d15dbfe9095f13875a392be1672ca9fd490b0150e352be0d911f110f0100c0c38c96bf35b2a22fa700f0e6e2702c8b168dabb2a30cd0a2fd142dc0d95baa5765000500e8ba5a14ff672436dd6cf6d34fa6dde7b6fa515c4b8a27c100b24aae3dc8def73ca71f1d17f3ef97c17104642db04d5ec3e2e91d85507793aa54e0d9425ee4d94a5e502dfdcbf5b72e3a7114f4f30f597f74396a50d3158e5bad8108c614d8a2246c05f6e73285007f44bf6310bc8aee592360c17670df24e5d7b93935952a7611ffa5e4edbc277567a9710f12e96ac00f94fa0d34f0f6e7982d38e97662b3272e9cc8c0f1c5483733a6dfb21c6b6e6d4ca1612fd163f8dca85a8b801989844f890ef05d330238a4aceb0d2ae225aca85eeddd26853ea455d4179dd9cc6b290f719a57ef0e5a1110f1773bfce8e2c0c823a898af9521af90f4a6238016f6457aed50d3d9f3250e9ca309dbbdde65a4b239125ffcec318c920fca27ce1c83aae03dd688c638c7ba1e17dfe1ac175575653df9c8ed146d8e46a2fd99940e6f5b1ef84a9ebec860579496ae381c982cb9189b6cf8ae21182c9f97d5c3487e4dbea0d0fb18aa8c36f96238f62438af581dac480dfa409f22dc539b1a8c9d59bca905c0366d8c0e128327237485a246727c606403a23a61ea559ffaccd1a34a166285e450b0bf8b4097e041abe42a08a58d446ecd11f0307cb530e80570743b262202ef223bb80efff89a988d5e5d09d88f824d94165e31595d45bda736e07cf635b1fe4df333479feb5d1c5c86f836afaf8fac64ca8ced6e9361ba02bdbf62cbe3c3bfe6c2a43fb8f7cd0e66f0694fde58b4e17b78870f6d5f3866f68153911c0916fcb68cd6890747bd86c0e1d798b5161b7e280e790952c54f801fa4b9ee3ef0c7cd627ff26b4c6fd165d156de4eb2cd79f4867bf1ed0d2a450947fe9f35c695f408556c1b44789ccfdd648cc13dadce7e9ccbf6e1e4401787378baa0000000000000000ba84b00100000000cb0a8f40fdad1b15574b48e0340ebd61d268d954e9e9a98a63639addcb6832e37c16b3b38b7dc394965863adb8e54116b2919e0d428dee9e3596c172b91d1ce3c6c0312361e4f4f6a0f3fa1dd2245d4c524566e209092ff9b609c645be1596a400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000746b83866b59a92a0b6b3d38b2574e6e4e4b255be80762b52d308033aca5a4816a8a763f99ea2a623970c4eb20236d8fec3c0980611afe8468cdde4b4ec25193defecbd4fd7bb108626506a7cf7c43af80a0955536886225eefb8cebb494704e847b3b9572754c78825ca9140e7f197393e43cff9b099fb2414722b523ec43e1032389ced6298fdc3d8e3f60fcebec6ff6b153b61ae5763832a5537c0ba21058f7020ecf96ff4f7663ccb4e66a35b2cfd6ec92b7a0eee3a79464dced43e9690d963b0b02a90d41bf8cb39f6d4a23945058ac5ef8f7f0ef6de0c09e6aa19b86a8d66a9be275a6f8a7015e014cc56a2653dc50f22b1d732d41ca0851abfa333ce443f0b9021c732910164cd4214b97bc1c8187489dbf8ca46825f728d76232cd372c833f8f020d66ef125bbcbcf8e89394490db3d5338c6f7962a96a6cea5da8f37782ae4a7b02288172b6e68e6fcdeff02075085d343594d0a47d25f8c034b686249dad4a627102273bb7d39fd74a14200eb6de96f28dc25bfa1d1ade95b076101eedb020e14aca0306a2864f84f674cce8b6c1668a9edba28028197b663ddc9f63ad6d09f88db377ad850881088c0a47018b2a5c82f527b6307929ba1dd9e3de8b560d037738a76e8d96c79a08ab56210cef3c3c2528121962eabe3b985cda8cc22928fc4fe69c09c72e788fa01dc798b1c7ffdd640e79b13ac5e687aab090c60cb5deaeeead445f37e7941c6612b90ae2c7f9c6205ec34008c09c6a28311b3b0259048e3406e819a1d92a890b326324c55c9ef662c274aa14596fbacfde444df896950c9ecc19e566ad854d12a5ad9d3abd50f3c74e7c161b0bcbfd2057dc74296897304bcc856e8d2a4d16711114fecebecadd33b21bca568aff87d66fdfbc039be350aab2694d886227be1ee9f3309c12fece9037aab13da107d094b31a31b4d3aa5ec25f10f18a86bc163f12f4783866ba4f3d748a8c7a17c10ab8b240244fa1eefd2480fc9197ce45f23676a0d556afb729088503bc018a193998ca0fe7de2529f864dde4c2098a7ea330a1bb61deb1664ac20139200d0db72e54ac2ce3eb41c09feaf0b0bb6d7cc2f902858ffbc6ea80d3cdf77fa95677c083fb25b52dd5f164457da3c3428efbef99200d56bf5336dc3e0150331c3a27976681be0d3e101e4f14b9afc783efd254f8f6111bbe572f13e2a60c09aecea633f658bf7cd196cd8803ec867620f397babde7146b315feb46e9d7e508a0f26bf6348c78e164e4dc751521890226bb3b2471c55cc3110515fe4a1c43a93379cad5d90ebe6ba918ddcbae11f30444adc3ea08f3c5e2dc9d68dc6a6546159e6fa6e844a73799f0404024f0220e904ab3df9c144e951c1000963ec5a9fd6c59957c6e335485aa88bdb9918ef4a2ecd406fcca0b30d9f1d27455f97dd8992e14b629b6c332a4dded7ef4d9b49c1f1d9941acc36578a49cc4c14eacd6729383cd976b98370da8e7a966b8212075b7340a02fff9b81a836b1bcba25fd737e2fdbe5d1e8413dd89a62d743b8f366dd49e6943fbed666831363c72bdc777d5defcb2bdd5ec7744fae39f4f446dfd33264eb328d00e47e6f43649bb2c0b34285acd3b1dcee04f25e83eef792531bf8495f0bea102ad5459a664ad3dd59abcb1ac8d529fdb3d23dff80b22a6bd3208103d864daf9c4e987f2c9ef171f1a98fa9906abadd55b369f15c57fc73639ee66dda9a91a38c2922133f79ef35f86b3798742928308e19eee55df28a5f7a7c760595554c2e4f000e7d0a9a62ec9a65356326e144f7e920f6ee8f53c790da797ea9ff1a5d4cbb6ce9c5155c3d3a57767ae6532b0055dc2ad310d0e42f3528274db00d89516ee3aae73076d05f1ebee48ff9638d61c3d4e6411e2e7c5de99b0d7505fdbb43b6ae9b852a6da24bda8c56aab6897032c6c3221110e0fb3ac11adf43b391979173fc821bcfc7d75b542e589a2fceb4861ab81cb13a0b78c95803b80a464c09fce1d0fd5e14cb3be71da9a7767f6b3e5c7fc155b0c965bcbc3c713a7bea9140c5e7409c7e0da564641a90f8f359493a66a55c66ce31e15cdd83c514ae30e8b169d61900ef8602b12c8cb046c6db439ef0920c26761f4f094cc61effa5d8a308221bf0eb9ace6b9b3322bff4ea655b4bb2596ddd80caf2aa34d3de18af6cdb197e912bd4ff53d8b4f0e4cad2a7e9b056763c0253925ddb75b93187de77ec7adfc84b8836b04710e0993f27594d6f4cb75f5cfbbf76ea15a4a7e1e32aa82fabadc556a65c40c0a3f1dbdde57b46102cdd6d90bf0000000000000000114d9801000000003abb67b68ead3135c5417b02b18968b0d429c27e939d77a020288ae5faab963dd5df3a7592c22312702b3e6ae51371cbaaf887f0ba21e8cb93a5d2fe9e920263060f2fd0b99db9e1e0e5c09253517463db1efae85f17dd4f028d2db7b7adbbd500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d9038f23a80d444a13b677aa55cd2b751a14727bf64bcf45e7799b5cb7f92f40a7e0f06e932b8d8ef52ad3dd92518fb23e32ba366143d559eeab6a329943ea30d29278ae213ec100016aa67b3052294c8213e4457647144d3f9ab435fcf150a28574ab20afc21bbfa4c90a15bbee7cec900d971e9d5c6cfc78b70e52bff01d0a030c6304381dcf0c6c671590044ecbf2322070f8e5a9da02e6bab0ef7efa56ac1a03137bf1f9fcf73074b8dee4513a6e019d3d1baf9c576e74f1952fb141ab4e0f640b02d19b6cba8b1af1ea84082e00f597d321d3ca78c7019310475222e91a9dd9c3f2bfcbbab7ba5ce94583b6fa60eef29e5c400943bd65c01340fb446f10db785b0229804d764034a2b3b245801c746efed9beb3d2ed13d7a88fc469d8460f6ebfdb021819e1fcbdd69e7f15742cd6e6df16f6ca7ac814f8ba50048ca0b339ce00e2f60202bcb3e45d919c79b72c79fff7477d2afd1e248568e08abf75f57bcfd6a624860222f21a7bef328d76026e6427e6b4b9174abea8d8a7be2b5c114525b099226e210309b2c7f50c678dab5b8e78853574620e226ecb52d04301d8090524d850a6f6d071c5d55228cc60c77aff780be96bc81949c5c071a84c393e187aa455a65ad1556b4116d0c506950bdf455e39b77ddfa242265bb2f395cc1b206a17a98db71192c6d99c182a1a73a33ed3692a63918b2083d36c34c28d9d5d1982e2f447e7a3933ea35f05c9ef24efc702361026bc70d9c9c0b34fb674283bca1d9cc407833de2d3e243e34c4f0dd6640a3bf909f166266ce87d1dee8c74a737cf9a5f7f0a5044004a2ba9360c2c07711eadede607325557c46800ba5bfac78d914532d7824c77828dc3e06e756503a4faf2484cf6e2585a24840ab458b5b323ef56da67c8c113afdd65796bd59a7523edc510e81d0ab8ed24c675924dbf470236b419ad609db342db06b23eaa6fab7e127790bc96baa22afcbc0e3ce2793e1bfbc012b1568feab440543dd8e205d5b144284bdfe2d3070934b252ae4d50c5d35ae5af3b6e6acabfcfae4297ff9c4d5ef0e03194a2538cb612f3ee461089dc010edb7707e377ac8354e01f6ecae01454b170b587468bf357c276509551986048c85008399b4b0c2eda6bc74fbbd98e17a52a1ef9712e2e00885789486f7d9e233a65891ee1ccedcf9268cb5d9b055a831368743821b7f807bd933cab98c02b404b97fd7e196d5d1009c6c7d08ff31c3ba6ec5a0152a2dfdc58aa0932eb4f1ba5614e693e70d5677bb11db66a393bd6746403d98c8401d1960f9141fb1cc7f136c43df0a82ee53d6ab503c8ebb6f5da70d05b5118afbfbaf80a0052a17b769823df1f4c439e702193a2457926967d6932d7e48ae2a97d37523e1c9193fa47ad19e6d206c99cd276ec21e613c9b7be4465c4d585d90ab75277293e820eb02b5680af253277986f49c1a03c2493a0d93a03d21124b27854e601849097d988f285eb658b98d080f52a9102ed5cdc5262999c0ceedbf65bcc2ffbf02069fd85ad66991c542a4e43925c99dbefed313eed7338e4694fb957bfc915099660d4066db307513f6dab623f784a7ce98a4de0012bf8de2104c48ed634ed97ff8cdbe76c78c72c57da88548d0ed945c2459fa4c5170eef8593a417fec626353647ee179ff1849c3a46b88da46e6dd8b9a840817a88f5b4ba9d61fd4a0b3836cb90a72e5e49646db9e1355b4003f85a5ea888f5c2c9ef9126c425a837b25b09e38b01d2edb955e92ea73decb25632281a256c6d33de3cacf247e061ee686088700ab0765ccc5354d1c7c79166906f4253839e0a77e8be833d71b3b737dcd6528e41de31762963079a372b46c83ff12d35f90ccb659b2ee5b5e0fc7e8354df8ecd10413d2e364113715bfbade54089c2def1be77b944469ac3630bc40571f1821af3baeb4104dd7d5792f77f4290a46afc33560d3c824fab56ed63475a38973e9ce4546f79a8e3d5632a0be1cfa6e1e43c858f8bd64e009059ee5d148447b3cc2ecd8bc07a0d286fbcf815f71e4420b1a7fdc37157ca7df4ce8e99b6fef40cb55550362757215e748560bca5d55e5eae293551b27c68ec07ca703dc06c1d4747ce248710b68ea124205365e87719ebafa4832641ef175ff7648b9475633fb72f191b9814fb3f4827382e36cf98706b2d02810083c026c0e749470faff416c488b56ebf7d00133778b7bc09782b8ad8a118ee04e35e348e76b7c1a574d1cef9f792e7fcd0d2adec25f95f26693fdbb53458c475b640b58213e4402224c611f69c2758b4c10cfe74661cd2ced21986d19034e37e02af527d2724293aa29651692a11029cc203748d7169823fe2e97daf71117505b06854a4ca19755b43b571de6ec01202518eefba146fcce0d494609887b41172c854fd0b432cdb7bfdde34610f", "63", 2, -827983237, 1537743641, "63d28fc19eca3942c36766fc85ddc94674168d8cfeae13ec327ef95249adaee4"], - ["d4f2b85f01fef93260abcbb1b2d94951161b2337b0585ef8a2dcbc35cf671394a73be61a9e0200000000c05d0c8302066ff40500000000025200618d80050000000007acacac535263ac0000000000", "006a53", 0, -834760043, 1537743641, "8e16d4f1f3c8b8c5c94d72a9e727bef8214ca225328aa293bea9e69ee488ea9a"], - ["030000807082c4030243b156825e3410a871d4be6e84d1acd2f9b5c7bc172ca3cf15eecaf46964473e02000000050051ac5365ffffffff7e0e16d55b4927e8da4f7d2b0e6c7cbdb27cb12bbe3852fed4cd32337b4a1f36020000000751ac6a00ac6a6aef3fc420010b88e10100000000046a650053fb74fda40000000001a2f7d601000000000000000000000000a4a9d84a22e139b061e4f93786a56177d885b963fa90f671950b16e356bc89ea88d1621f4fc93a895ae7efecc303c6bff6c7a3fb36d1a233a79c07bb20c428fb443923aecfcbde1c36498424fa03433963198933f01eb9ad26519924b567b24f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c84c6525a8d44ac5106f004425c1870527275e038c4474928dd0790d98257d18049b79e2ef35748361370fb75a39c4383c7dc7754c26facb2d3d058688eb7b2dcaf48cb7a48a875f0ff48b0110a59d7e0e96ca1a5373bac53535d816c176c931014819258c28d33b85bb4a99328a0349ad4a46aaa58e357094f4e08fda88726022d2767bc5b7f0e0421d99d9ce39b69a4a4ec8e242e309a2ad77d3d12875a1ee9020ac5ecbef02d62f8b413d154d9d0e2f4559c277c710c10addfd155396a8274910b0912b85e89418bc7a2ed8c9deaf10ecb0d74b601c58e7c9313fc3ac8eb10e9c4ae79696e98e9ee445d5cba2668f21c70f93a4243c7b36bf000501b634a2874cd033061f09f46c1fb2e96e4aacdb905cc172a83738fcda74df73ef88d50eda86af8020c8b3b365eb1fc3134eb589b0fd60f803a594a2c7fee286eddcd4b5d426a58f50305f421ce84dbf48a86c036bbccdd1e86eb45055218c07750cddd8b2ccec5235a022a9912e23251150551e3ecafa50a75fa82de332a7585a8e2c1b4b8cb14b437bc0214bf54ed34ad158888620f7b6de726155c2f7d869db6739e029004880a510143fa209a56fc347f3596243d79bbd0b2f1081fa35ad5ec99c33ccab7546b0304550c287df63840cb5438217d194da846bbe5f7e7dc4091c663f4da5fabbc1ae23139a15c687d6ccb0198acb7dbb31ebbaa0ebb52b675ed5e7201a916f3de79514679b81c990b2c95356ee5c76a6ab003f931b28fa3f9e11e15a1ef31e9e45388e489fe17e1605122a4d67c522a31dd1641fa26c01410a4f9602a94a9b3696838d4baca922cd40a9257760fa78ae2fb25610ac615b487ad2877b25c6d79163f64187ad3e423ec73818d5008fb20922841f4efd10fc6474afa6b6805586a18f95a689c3547d208a52d79ef4662b35b33db65be531020b5fc63da54ca1a696b484f10dd8a2d6808395859133ec9b994e23a00ee85a426f80f33425b6083c79c8d6578494808ef036a31dae263f925115f9b57dafa6e7751d2264fb5c48c0246609da4b97bbd87e0c085e0eb2cee1153e349faeea5480d3af2a3363e7ff631a6ba90d6bc08b87e7893a04d28fbabd845ca8dc89452f446e409af63044ec629bd2292ae2c67fd2cd2621d5498fc03c850418a0b810d3d0e978142f2ec9187306f82817534de435dc650a3d301d7bdd67bceba950c72935a2df2c02f0d099f2b3f15f07c80d1897fed305364767c49cf5dd0b3d739517018411a648374217419ebb1c6ae92f3ea0418e7cd061a7c8a014bf9fa9152d0ef52b6c90b48227c3ab98f27c33af7169178449e733afbff55b5fa07f9e221ed8e3627927de58638438ef04bce1b0d113f108e061d6f19735d857465d4dee0bf0cd7e68c4eebcb43c81efde9ce93a7e0fc37abd7c22e0eaa5bbd465d82153092b08b9ada89c35eb3cece5494bb18ce38b3eed3690ccb50bfc139a1f882a39f2a71f3212790a5a80825935c67693eb47fd53038aaf881d9d27217ff1818b01996a1680e23dd9fcd1bea2896ebbaf0e07668d54d7a0361373e1546a2d79508808771359400d3f61537d5fe7ba82d251a8bef4bd3e0362c70b03ed2c04e6a67daadda191d1d6a5038bf1cf60a337af8308c20c8a1cfd4f91b9ef6ca9cd986f3d70eeca16d99366de779d81c970348980be68698b0b9f5fbb564b87f782c38e87281ed78bcd5ce51253ce0e9b05943b76223d3eda66fad9e4d803206dfc5d2a63c8a8e673fec293a336ddaad8d0427ba2feb36c0f7947b0ae91b41f3f6e8ed877bfc9a6bab208a17ca34846929d3bd01a1cda2650f76fccf75192bd665ca94a4a4f717c0f88f14035b6af86d1535ce0dd18553a27112e6b5a5b713835f6b0b3820335126ed1c7858e9064738beb91d16a58a19eae9c632224ddaf42fe4496a060e94b5710511a2b431d3da3c9a1d3662601ea611c365a62ac69a3311add7a5837d9fcc8a06ef85157ce7794ac958921508625985ef1ec318cb9c29e7a79840d5348499db622aa17a1f58c886f51c3795a9ba5772f547efe6d45f15e2c7fbf70d59841e3fce6c91903f6c118e39990776eacf2d27caeeffd025eed65c1a84da9cb9ede82ebe0fd2a46fa265097be12f477c45cd1f16b439acc30d6c1b3b15959cb647b0bc1c712d5f3607a2b7ff6edabfb58c2134211f5d2dd5c582c2e15dfe5a4cf30042f79766e6e2bc00910dc47d133736cd539f8346553f4b380d659a73271e4b73b8e61e61cefb1b52b7282b384e937c0de764d421800d18e0766df177cb44579f8a15247efc5d6cbf042894f98ccc801da69eec0cf39ac137f18427f1ecb68fdd5d92f2a1689ab89f3613b0fff4a7faea65fd46aaa13a96facb986d0c7fdded631490f853e0c185e9970f2d70a585641b4062aa9d8764f868e2dea4c0a04808", "5100", 0, -1617542046, 1537743641, "ec71d1f54dbd68151335ff7309bbd8d7abfafd08c13e56c7b3d543c7befec757"], - ["030000807082c403030a0055c97ab8ea3578bc72d638ace8f6dc6f69e4a1bb808971117e7de74d6b120200000000ffffffffaeb63f1352645317dfc741d97b521f94c8e3b3d7f6d204984fdb09a074ae72b103000000096365656a6551656a53601518759741f1ff51a8bac8d5071e8618bf8efc77680f8a128210a4f8d520035eab3ae90100000003005353f3521d4203e0bacf010000000008006552510051ac51564eb5020000000001aca362760200000000046563656a0000000058de8c8300", "", 0, 38400951, 1537743641, "3e5f15409c7a6d800de9a356fa065f4471d66cbfea128752838c161702e8de5e"], - ["030000807082c403045acfc727ef2daa6e308e8b813375545db66db0c6d522f762476f5c519438bc3e0200000008ac00650052acac53ffffffffc4bf09a380d7c402c90542ef37d7b9ba71bc8b538cfede224a0ce5769e8f4f2b0100000006525153000052b210a2f70bbf5f7fe59ee75fda2f7fa627e6724142bf3255a4673ace283b4f24cdb5e43a030000000453516365ffffffff7503b0232a968b0e7841c51c0f49c37f9bd6af3241348716a54bf165475e0b180200000002536affffffff02259e170400000000086353ac00526a00652eda3a030000000001520000000039aa643c010000000000000000958d8702000000001b0736b2c28421d77362c56c3bda370e69437636dd1364d25fc45c402323d6213a96424279d596276284da69ceea23408dcfae76c12926d851d58365f4bfb95deeda3dfa04d8d46355f7cbd7edb4a69332faceb6f887d9e8f18a3ae6cd94feaf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005dc1b4ec3cfbf1026884a287f3ddb1066febabaa4c3cff1a108e39f8fe09a60065a0cb3c0d723c818a9fe642f98d3d7bdbfda06d5527c4e0bcd87b3e2518ef793230b1504d0bdba87a3313d590d42871b384e6185888640a277f34ed7248b84fd3b44ce29b416684dabfea9a03b81d8d535265dfac782010bd9d410c1bcbc4e802253a9b78b299311dcffaeb2208ee95125e04a4ed8e57a3ca1ec4138cf8984906022755529d6136d3c3eb7469d5ee14929e5236fd4acdc6b0cb742855bb1b54d3b50a045becea961dd2281095313f01bd681d2e4d89cceb9008e5227123e9fb715aaf206cb7aa12f75df08d9f343e54a0101ae44c9bfdad348c60dcb6f819e5f5c3fa031187a5bbc549a31a9d298331e743bf06ca8e1971b0ee0de9cf6676da8ef08070021dcef807420655798b922529faa28c2ff81e43ab5b725a55e0a2f1f0418b035303156c39e8f1ffb19c86c15aa6d6b2f9fc3efe8b030787eca8a9e74fe16783e5e603070282b9ab2699135b34c2f59aa0eed12d313ade5e30b7d0e8ef7c835df51829031ba6b84ef1dd925ea99b173c768492f14eb5956e6fe3d7c4dc0479891a7f9efefbd6d6fbdf9d2e84f961153fd13f1457079afe88c77fe5cc3ab550c1b0c52ed3eeab42590cff2f27955f045384b6830284a1fd011a263108d422fd80fa3b4fb3b13b02a4f483db866f2493468f553c058d192e5984aa4173836b02b5431d6e286e2a1682922745ad38875d31f235273036d9d3e2f615f373c7905f7b9471ffda9fbf4d39084273221e638758eb010d87a0cea1afb1a35d9c2c8b41759076a3aac1caffe8bdf426283dd701ac8ec0375ae24bd290b023be4a391a7ab48eaf9dc12fe6f40eca529e8ebb7c1164570f01a9ed98c46ccccbd9c3fd19962ec791556915424eff12c752979d6399a8cb934d967079f37cc409affe1689340747468652ebc99f950f9aeb81b4e6a25fe96a380990d5869994b8360468c177682cb8782077681c27d5c7e652e94005643d704a3d000d8558e0647d558aaee21bc70099a7e561b368d7564a8412af29ecac95bedc02adb9d4a401be8a4005020cac3cebce5db70651928c171e4e8c82a88082537a42f564abaf5275daafd7773b5933e52c957fdbc35f568c46fbb6a705d6cca8e129679e24163ee78a144cc18f90ebf28b49e845bbfc288dad431e2712d8caf43f47c05cf141fffa10d9862272e1ed7cec26887b15070e7a1c84bdd51f18cd6094a8284e6798532cbfb1f5854747acfd388bf7eb7295734c71b56b2b10ef1dfbd9a0017ea673f98fec875fee93331ab189aedf1425ec237ce2fa1a47f10acdf4faf921689526c3ed5bdf69cbf0043aa3b38eedf7cc061e56fad635e40728a12244403876d2af292e9903d82937feb67ec8a3abd4a498be4f2072bfdfc3b6a5d80c1df6877feaefb76db1678f92c8e4a0469f82144cf441b7704f2ec2e5a7bb582566051a955daeec09cb888d6998188b61969617fe9236c86e5f3a02cd8e02f607c683ca846a50bd73cf8f1154be89b565c1f11583bc7246a370981c05288d1a0e124791e4c891b47cfbf8fb10c6f5d868a5edd2399ecd41d666ad5b382da8ea2e7944c6f0971e53e7ce08fb1ff935d715454e5b1932f2c66f02e5404e353e8bf15d073f68332d9134486690dde3964541f976e021d68c7e6dc6d8f4ed644bbf7017aee53c4ad33ae64a57e8dcb0ed8d0aae600087315606973094f0fa06b9de055b4d317049a9baa6a40770843d05c6d39b783836f45cf903e1d363d332c14340c1be10c989d1fd82e022072a8ddc706a34eef6e808eb2dc499d1ec613dca9ea9a6a024f52306e0b01a6c3f4adf08760c158bb7f5338a379c3680f6e7bc81a02771face43f4d881e1955d265d0b74e5e921eac817f1c02fc5ab8bfe96bf2493f865839b55cb1f22a92554290b94d043f3606e4f4ad4f9021e6b177ffefca5abcd7dda18d3dd709c1a389a472be42071a11f16d6fe9b114b5e427f3ff23fa2aaec3833b2e50b0023031f314711156cba5e321baf8a376d6b784d8c2a28c5c752030d548cdd46992665e9192585ddb67255da8173bd0c509ec6802464dc08cb061a3b62c56036ae80b136b02f53d48b6217cf04f1e4740ee7fac52fa4e2c0bd3f953286d0c1f0340a85712b1aa26f360f4cce16db3536a9e482d12af7bc754b9e150e3222ba9209b3c8b292a04b7fb4c15ca79b5677c209b6df0c7b4d677f08ed5280b16e76119c08674e13bf0f04be0c9116d5118c67987d16704ca821780f8800ad700cf50b15c0892190fde15f58d50db978f14cae4d72ebb2c3b5c72d39d9c8c9e2e33e6103622d6020b693e74dab0205e17a6332b5097b332b9a575c1c3c0dc6fa131d1c8e541dbfa97d56c3f4c0280e94cccc138742d31e0e9c53cc632c3ce508", "0000", 1, 6228573, 0, "94fb9f085cac47142ed2c660d716f82d24ea4865b3a6609861c767dd7d454058"], - ["030000807082c403025a98e692390c9e4a7d6ab592eb57aa87fef077edb07c3f781f94d21f79661d490000000007535100acac6a53ffffffffc0cef569939f19de49e33a8214d9cf59ffb78355762fab9e69b9a6beec47c21d0200000003acac53ffffffff04d7875805000000000600526553535144ca3402000000000853636352526a5252e64b9a0000000000046a52005222ceae030000000002530050db5c2d18a7ceee00", "52", 0, 1579952190, 1537743641, "605ee1915d0ab50351cc959185510d445bcc93547d5f04a2a471491478e3a3f9"], - ["8e99f22c047df43925b375531ae3b10183c2640fad8df7fafc4733957a5050c1e786cbaa8b010000000363000082da05d21525de372e20825f253ec5c2240b06cdc106603609778ace6382479396ff62c00200000000ffffffff42f73d0c90928e383a26882dfe5e8e49455f8d7d3b1a330a4af3a63ffd6e33ba010000000765ac65ac635165ffffffffbf44ce2c20c54dd8d1386ec5d6fe7d1a8c55156bc841d29deaa10f26c2f42e9b000000000963ac635165ac00ac6affffffff0218469601000000000038275a02000000000000000000010000000000000000773f61040000000001c6081b50186abd649b9b2028a459f9efaccec0a9966e4564a0e31613816528d5e17e3bb4d79c1c5a5f8655d87192796370342754db12a369799d137a4267aa330d136b9a9ac427b6cd600f4e1af9be20b8001e638de199fafd14568405f38d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d952cce4d2da07de2aa2937521175ca9f893faf09d2059658302a4157f946dd63d847c2e5f0dbda49fdca6d10d5e287a2bd60ccbb9c2cf66251d8a85c7ce7f23ac0592499a3ff1dc2890d7a014988651af6e618c6b736f500b72ff458dbfbbc5af14990abeab53a12bba8594e97befa1103bec262049046f0c6f3df0a031f39031ca7873c056b421651107b8bbf9dcfc5d8a0e0c5e6bc3fa817284839a8ca47a40206c62b4c7a57f0cab0c3a1a786d84e5a172d3b7f002db4570bf286ac085b72ba0b0389731ac164febdf890b4a56eb87345d0c5f8521327772c480b75e9d1444c4bffdff4d26ea4fd6a5cbfd0f81163fbdf0ebda8507747cff115be1cc4f696e56f021ed3b85c3d01b9659617becc81202bee7f873e511950bc1d1dced06fc30eef20031b35c26c330a0d2090807ba621d2643ff7ecae4ba8087446fbf98ee693c375a3021cc83cec3157eaaf402c91dc37aa64bd5c173937551b2ce547b972e69cb3878a032f49b4c36c66b924a030965a51447c3d27b68ba638acf803e2cb52804f60f3ec02161df1a256c232c4b6f3941d427594bbb08a5fa7b043d093dd8d9af3b2c24f5dda9a69a501b354deb861382356c317c1379e7b3bd12eac158f4c397097a1ac72df6f645104be97d8cac21e66b139cb2b69fe6c20ddb6e1bcce0d31bd5c499b3f970b7b91ad3ab6f803cacce4bfc474e39b337e5a52d4c5d4641c6dd7664348c4bf4f19b01c17d862aaffe0119ec50b413d2c6f477f10d8bb59136bd7f54c1cf1ce9fe744c27f10757bc17087dfeb5cdf241acdb8069551ce9f8f4d9a3d8ea38337e381a2a8d807a6f3ebdf7230f095c2a0b02ba7194d383237c5dfb1fa91497d2d35431a59ccb18d5bac20b4328e10c2ebd12fb435ab13e9b4b4a46d222b0938aacc0a5bb76d2e26a0a3a0937b0dc4bf390f85893cdc8795fb51b8b6d926bdd3be20ead02cfe68a715c5f969dc078033fba244d8e098f83f7bca7de621ca43a8226ac48fd00515727940942ba723514c9463d189a42c5bd290ec828398b78f9666f8c6445b922f78cb5e9a82f12157f083d6e231321f6a1faf83721ce02577d4019b2da13e9734e1b51fcc33cfcad7cf27e162de6ff4f2e23cd595eca8206e9f5aeab4b9c80ce2461dbe611643a049ce1809866c84b6afd96ae5f5796b34f62fb2755e9b7353b50bb05b938247515c671f579a0cfd5491d377c720f880bcb39c6f7b96a16f1340e8e906b87463c992d52dcac14c84a66e385b6f55ddd10f6016f0c7b28293c0efd391ad9a36cbbc0bc903086919d38753abee2e79e99c04e4c54e70e96bda782fe2eebad55e4d6dbe53d44439866f988816736599570e526afd4d8105e429e866047d9f6d2baebe23c9622ea383423575346bad57ede134caf23cbfec8cee1118e9ad50b1dbf10a293310b27c8aeeaf6fc1b5b22a4645660c2741960a3e423417788979d53e0599027dbd12a1bd07e98e9f1457e944eda99b46a7d0b2bea78e7e423e87e51670ca9ec6cd5dd68eb21cd228ebc1ebf9585e1f33b71be5ce171347147d73b77522e251bdbbc8bb9b51b0095e452d479c1cad8a2b3e028a77e076b776a6a07a4d016572728fbd398b4dd0eaf5ef4b54ca774a5a495b5313c974d5a793b45459cd0040ecd26aee7ae7e99f84a273dd8119eda2c39ac6b826676218aa249fa682a2c99377fe29ec7f76e3253411cee96819109728f756644e9f4913174a140ea67bafab332ed9bb32c554a5eab2970afab1909901cdfa288f8edf0d1fe1e63922fa7dd3ca08a62f350f83ec1bc6797bac04a4e52c9fe6189533cff1fc05f1ef046aa9d23cb9867805d61b9460a23f82c058809c303d612f1099a804cb943cc6911c55103a05406bb7a29e5036df2559cbef5859394199d661f16e4d146c3c5984efe9657b64eba485566be70bb7b6bd2c3385ce68ae21d5b66542fbee75ce8208e41742520837da0819ca1d49814fe169040f3f310aa27bd9e13cc0333367d7930150e7beae8320ebc01548606206a75012fd44c2360ea8fea73ea4295ab95580195526668df2afbf777bcce71cb49cb517e77cbed60d6eb707a87cf548044b241acc6bd7eed80e2e28f16faf0b1fb49c6c8d67eb25cfabb34b5545c044fb0fcb562e8bb0d26c86d4b569a1359972f3987a1687b6aa58866371e269aeed3a380bbc527147132be113c167f74e5e8c00318a9fd791b69d4b382a598ffa8148ede7c5f15da353f0a630e95c370ab6a4134d328f014951b3f2b4c732336e1588545d62c62c9d4aa0f2f36aa07ed65780f131b66f207845af9eba195510e2b01f111218fd9fdf9d0b973d5328d9e5285d2078c5c8f18de7e3cea46b4a437725c7cf5aff7e57ee7e6bac37f4ad874ae0c105a4ff4a35de8d2a4fb8c13dfe7b0ecf3b4c838cb357838a00", "53", 0, 1790690590, 0, "e1525e95e0f6b16982a62094d96b579e65f5677e46adae7f99ea2e3b5e18010b"], - ["46540b0c01c7d760238e1c42669d2bc0d6b458cc32d45cb378421f3416e6c00863f9d13e7a020000000451510065740b4a790433749901000000000252654209cd010000000004000051acad36d104000000000265ac667cbb05000000000663525300630000000000010000000000000000534af50300000000198c1fd025bbe70ef10a869ec44262288839a1d0608a14a8564e06d20638fd51130e87f54175c91b32048f5f6d7bb549a738e2f50322b0f98df8f59cd2958768e7130030ee92fc0372f2137062289e0b774b3dcf502740db8b3b125b186e8577000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000df6489378058ed1150ff4e84663e56f32a3c3b6a51352ff9d82195e14131c467eac150644436bd9373ab4c7b102cd8baa57d5f50e3cbf08574851ffe8222d2905871ffaa8cffc8c28d7f3687c6f98bcedf983f4be6124c610fbe98ff62840dc2318f925d655f37537a5081c63c981ec59ebed67776379871f244a7966b6e5230325a346de03d511cd34f945d7f75aa8887fecc1e7fc10a59ea3c0dc7161c3c255021b9a7119ca24e445b743d34a1e27c5ad2db2e988e56899bb0f59c4988e93b91e0a02b7a07b0fd788475b410045e6111d629ffad46e05d67c2101819ac7cb8483d082db9e3cb4a098ad0e2b2e9b9b3c8d93d2ae393a456ead353fb31ff0e3b4dcbf030d7050fc88f5d7a84c5a5c839e3543f699e7c74f71981d368189258a3ddcd5310204ffd852588ca862670ce9cae71565eba36621af78d77c73339d7b3e29de8f8e032ed6608bd8e46605e1881551749c5e7390259a74dee9bfb643f0a8d5003c959f021b67a5561ca7f174aede1f6352512fbb9efdef4e23c956efcc13685a9163a3b50229b2965f44609d544e07897c74173416883b11643f912e69f0890c8597b9f3bd4ae36b8452e67278082fc0f9779cbde7ce59f579d82f19cdceb04ac1d100d7107bc8664dd29a50bcd2b43a6bc9ca1deb15148f91bc1bbd00fb43d06ea176cfc8db0109da3b265da60fd5424cf1bdf6776eac2b4273b70e7c48661012a32d200963a2f5487d330f8002b0aa60dfdacde5e26fcfb1395119fb7dd589d366ba8fc82f46cc57da43a9fb3500afe95958c8e7f7c8a55dbdd0b7e86d5a6d20e578d5d77720e5ae8138e1d15c841c3f5d0007961b1273774ff7c3aa14640a5c4e8c4c61d5782b8925dd90758e461ef375f779cc3156a9faee1d64a7b319e7e02984de7e80114cf2c9c74ed139c816a5c2ec8ec1e5636abc53013e70a7d76ac7c8b75d37a7dab6c1829d99a7c29d813b7d949da02843a7a666f295699612b61229b91899cbb8d551721fd5a80537c79238c62594812f6e100fe78fce561dc7964023023b86ad75141f0a9c6af5245801c61c26f32849789f0c72f7c7427724cc77ec927f316773c9ec2e61cc1875b7378c38cfa5faa459b0beec888b0c35b022520edbf464f8cccf0a8658c013b1f16214a33abb2460993709dcb9630477e4d667fe53e5400e136ca75ca29319231eb8dbacc1a044a5b30ff01965d844838a4aa0b53cdc24556f7c210eb71c7b8f0f7e83c354fec83da45240164e982f46f4b112778ea47bf22a8fd84ffda7b447203b965458479242bf883ab97a3e06d748d257c6d8cef7e207707055d84c67fe743a03b0a6b3cf78949274863f09f3c7338622aa32411064bc4a1baafe2bd291f5880ed10396315e0ff5b36ab5200cfa074a5b278237d1cfbbb91af4d5f8c8c7bae851b47a04a9f9791d7983d668b81a8761f96f0a50c6a6f786531e3423fcc18b448ba3832ce7df45ecb8b21a33c4fee8372fc96587ff3950460d3d885c893d363de29c2acf104b96b0186233c4b931ed0b6be527477948543a46556dcb28da9d67ae66a285d57ab526c50256d53f4b483a60df670b206ff89fce276aa4b3f24b1ea568d8ea9d2d74a065da7a4894ecde97b6ba2d0f1650ab844e65b2352edfa08849f90a439b85bd1df8af96c4290ae7d1f4d04b2ffefe5c55ab30b29605fdf4f8e073978c1f2d11b6331efc70f5fa03ea94c8f5e82b73042277c1eaa8f7a82f7179d4df20278b502e19882b20e652992b640d10142c81587b6a645945d95deb91ec3edfe86146c8d8d676ed3cca92f0e1de75e3f680a9d5234e8afa5322c0ae662f315bacf57e28f792abcbb37b688f421b148eebf0264cb94da270871c360f5cb933680edb62f74e0ba33b4bb7f22fca8d65d9c4751d67bca683b3f96fdf0bd12e1903bf0dfc8519b78b61eb5ae858b43c6766214ca5d775bdfb2d93c7ef4f3c89d5868e51ff20ec3ecb0c3ad2eae9d1f5527e26de56c693d4bf850711c6390ff4dce3ceb2fff8d545b79097b80e3ab0d14f9304cfb37ac03fc659c3a3e03b8cfb11bd53a9b12c5904c4ebf4bc063d321afbb4c93375507d70c2a141e0f78ea75d216d090fc49d7119e9bf7189dc759510df3c4977d6b458d5ad4b604d94b3afd41c22d518b222678711d8b5df5fd0f1b7bfa1633b8141b81f85fdd91b89ddaee9fba8d48ae02fd8346bb0b6449ca72ffbcdfa87549a20414089318abbd8f1ca3db3133e1ef0826e4b934b79757486c1246b74b5a8d37ed858ea9b4dfa896999e5a79ffd321206c1ad4d4cbd6170671120004b6157a2e242371b9fec2d5242886dbb6376d181f2883a93b2298505e4927e9d2afc655c81b10430cdd71e843f5b78cb4c8c36d8089d3c6d40f69b279164a02a5db2a0638e9c05279d79a6b2542ca421b76e880f", "52", 0, 1507425002, 1537743641, "a028c9509ba7bfb92f434fe4b7e9edb3b61608635bb0c0b48b8ee0e114ab480c"], - ["030000807082c40302792f960ce50577b2b4880a83e364a352629993da8fb5aedf5090478e0abb50b3020000000353ac52ffffffff84e2a2b1e90b33dbfc4b31259b7439691c1d787865df405d979a903835f0c9280200000000ff63c587032f66e70400000000015381884d0400000000015354cc3d000000000005ac51516351609a125d0ac2851d0100000000000000000c2bdf0200000000f6a6a60fd2ccff7447e4e4cb6aa096c856470442645e9f84f13a7d5696af9920e986e3ecae8d875dcaba21c1627d9894faf6f51a5bcecd2ca695a12c72d80a817e847e8d26343d99e6518cef68e65ee9505b335b7a15a3a155b2b21355893db300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8d5d4eaee7e41efed97df1df99b16e12fb10b25d65de85842e13aebc212a454c31541da3506eef433b19384560e7c59a97a6c1d0ff92d1c6543a4d86f9c988277919936ebb94212ab08cb58a9a1e22f23e5817c21e8811bf567f9e0d54ce51b80a53a14fbd6d2b65c15294e9b3d6fd2e4272b9b887bbcb71852bb4efb95fe40023053bb41532de5e0ea540d99a15ae4d1d16658d3ba57b53f5f36b11d3132fa47021600333a6bb6336943621dedaae74f7450e168a417b1466beb3a6bcdb27932ff0b0891cf31c8d3dadae4f76e9721282c3bb40e2e8d65c29bc8572b3bce588131736ab40083154313b5aa8ced5d1ff5d0a44e7416fb7c4a14a90b30d8dd5fcee13503157568cce2c950f7a30ef3bd193a77f8d701c9f00d14060b174f006500d2cb05030aa5b114771de0b514c97e9f94a65f0a69c13f9bfde508de98be98240f2c4466030e64b0983bf0e1fea9d86206dd3244a5ab0a7fd590c5d4561dad19baa671f0f20229b2966f42f9b0d4b3dc8fd10257c72120bbf82cea429d6b753c7bee58019e7d021049f0ac3a96c367643ca737d2de06bfb25c0db77a7803364bf35e9299967bf886cf40d832e0011127cd838498c35d58f051fb5e1cf80269475e2c5e3d5a61df9d19628891a7f89161053f7333fa3b0363f19769d1c29cf823987b0d8198f6cfe36290a0e86dcd598a511e6fe4e75ee7e5952d09ad85bfd5d4a295d3e937658c0a74149449f49c33500195a6a31bb5d2a99af0ca027a826a39112d9163bb3fe658a08e2dcfd72ce0a50fa73bb08ec794c754b9dd9a9e391166a94c75d3336087e97a5a88f401928ce63bf3ed94a65c38310b4ac8568906cad23c3e66c590dc742f26af33c74aaaedf89d1d8d68380d70296b61b2b060b30db8f166925ea8954cfc8c1b07d39ea6a9196b916153e31333d9b15489f777b807247e0b448f562ca0cf3e8a4fab116a940635b091709bf4763728765f338fca4e156fc09bb8504243daab3f5cf345a0d4dd410a3db021adf0393403cebaa3443d85d0eb48fadd42aa513fdb18076911a4877f0655c57c464d5c3497b86478f5c44b4b146d34733260a66b7efdc9a2f2751e8ecb2cc92dab1e03d6cef148b44970b92527b664ec3db560cfca7d70578939f0c2cf96f1620296c073d5826bfab7a66d9026b9b460673d2de5bfa5646d3eaed8743bcb37775a0fe2517aac0adb89eab0dee54d4d017bb8ebd01f311904225213c4734d18f0e73589ab386ee05c127ea7c098dd57166873ba0df55866e0fe86ada2f407bb9ea4a6d55dceeae503f36a7c885d20cfcfc6253c612d448f881873bd76fd46c87fb7a38b05d1ceef79c781944b0c4d3ff5323301f790f724e49cc5576df4129581a0c6a4a5d36bed869a1e614474c42b369adc4997817cb47c276475d44399e884b0a7d2a2293a0a574d247f6d99115b6fa0ca14dd3502125baa2c38462b1f9eb05a7bc6b8193dbeea3d0e40ce4ae7ff670182970123b38d919213fbf9fd9fc3bdd15884c1c267989d7e5819c415fc879b852366a38030ca5cd2994a24814f7b04e2fef2741b117d5ef36972a372787c7b84851ad60874c66c44ae4dc9c54c41878cbe3a9eece595fee7ffedc852a14f989567c3525f94354024765ba5cba98e30f84ac5d70a8371c22a1034df23ab7116a3759c1146c488a7e00ec1ea74b258b1a28f40ba435c20167fb59cc92e584534fdc5d71df0ba490fa64c76e53495fea5fa9f4564d928699d90c2920231fdce92877ab8585154af720b4cdeb72b5dbcdb5c4fb31d6a20dd0fda8b58b1c3a9ba83407d5513762eb85d297733ae7b314c0879bad5a071e8bbcc6a88c4e0eeb49b2ff924ffdb56bf6ecd1090b106f0c843a4e5dff4119bb7695de2c2ab66b71ff3e0bc9fd6abfd6cab40d06d456fe27a39902e91517940e52ac23d515e2f72a1a447d69172357cf2bb89a210e7f084f336a6548166a5761d09f4cbfa73475b04ba10f4bea4c0bce315a5f88c582c843a6416c6642c05805855ef47f8e247cc8969a8d0695366aae6d24fa71afe5255af5bf6f9581593dec0ecaf0af7f781469ef51deaf6990519e622b48f62ff5865dcb95fbbef129884ac2bf3c36caf93dc68fa2e72d1d8f255758e9917ad89e003e10efa4584f3b6d7638efa7cf38cbc4ea480fe7ea01439bd652118370097241c0d946ebc73b31343a62041264c8c5eaa26b57f1bce34bfbb0963e87c94d6ca92845c6668c6ce0fcb484e5c6adc6762d8b34c729eca7c9008aeeb914c0f28a124704e23c7c961956c0213a2b3e13d45a238d8909191b6389c9a7b7f7ac1b6177c83f51643b6bc0b5a85dfadcbc55815eb049b8ab75de21f51064d9b0d825150bff71f77549fc7192cb0923e7c6c8eda3d3b5953a3334533e1f8d891c896c33a49e8cec2bc63450a", "636553535165656553", 1, -1042677022, 0, "20776aba67c9ad68c014dcd473cf5d9782df23f938c2e19d063f63dfa85be0a6"], - ["030000807082c40301189e52b6e22bcf4384a23cbf46892abecd00d647d40de9aa1e880caa8e01477d020000000452656551ffffffff016bb810000000000005516500655200000000dd38a99500", "536a6552", 0, -1766489779, 0, "a5d6ef14881db0af538eb9c501fd610a7bc05eb732065fea2ba6930eb73dec24"], - ["030000807082c40303a0bf4bf0772494b6019c78f9850eba4842686cbd8804c96d60c3cadca9f5cfd30200000006ac5253635200bb661d621e0bdb140be68e661ee2f7fd85fbe35db18151b2bee1dd768d8de5324c49b9350300000008630065ac65516a522bfabedc457bc34c14a2f1a3dceb51be6a32391199b98cde5054ff5e835a3a6e2afd0c870300000000367e5de204f6a3c901000000000253acb9413a00000000000153d014a20100000000095351ac656a6a5351513b6746040000000009655152630052516a0000000000a9404e3e01e8f622030000000000000000000000006175de479a637dfddd29f3f4bb595776fd40b5491a27b9ab030bb8caee75793168100698304f20959f7fccb4b331c035e4f372d90518c02375ade8509ddac1d67eb4e40868ca4a57c6ca89b1a64b339e9d72ae94e32d2f3c82bde45336f600cb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f086d5926ea4b0f4ae0ffb657a5c1c816233ee6caf3db67237c1327d9268976fd06bc0ad6c65c8f0225c73e874230ae0bc015d2effc77639f538e1ddd238b5a4fac16c61be7d74d3756d3eac5830be2d887de767d4222c28dffd5979467525f4217ac436045a1fb7fdac66532d27ce78c5836e0605511a26ef2e29b42be1b46a020dfc1637336d97ad1946bc4d2cedcb5fc9f9b31df048f4b6367d02790147034b021841d536e564e5787a039c93bc2ec9bfb4e3f81d6a375d6cc41eb8f14857be110b069aab280b5ddfe7549c53279468595bd555dcebcb5af2dc1ba6a8c34e816d0ace8f8811859373e916997249e0eec7d2de2ee0daee1f60aac045a651ee330f9b0222ac536eb1466d5ad6a7bf2c89a1d4b0fd9f4096fe6343b5efc6ebaaa73722fb02212589910e227814083e66fea3b4f86b919809054981ea50b47a208085430eb9022e2b5af5f9bb646e70e9e9b98650edb8e5c748ba5d556325e23f544706636631021277d730619f7234b7631cc4def431da6ac8428aa3a86a3e57b62be721442fe30312189debb3a207539b57c2bbf6231cc834ee8c002198424c05f256c1eb18dcf952dda191c541cdb0316ea20970f81f2bf4c9905c0a417b7b8c632dc38de91fb979fb23be39e5444862e281a7d60a3cda7ec6a2a284070f945284a35f5b901e02c736cfa840e2c36325e215b443a0d9664378b878c00740962e2dccc29dc8a48945ff355814d2b5c87ff7a2b5a99d8872f5ad0a4d1373a537a180f953c7d5916a7f5f5f5ab1846eb6487fb2a7d95e40d37c727761c73c375bc60a10805926fa50e2dd4d6670a627e27100a4911fd6ac0ebd6612300b97b50c100f451a60f4b67086f93e853c823c976e8f998cb02bbf7c9aaf338b15c61931e3f5a845725689f9d435cc71d123e2ce4d3f18da9238bc675b2a0612136a7b1e0fbebaf48a2d11bd80c7d21d3b587263253a0a832dbffcb8eadc277232ea4cf658fe1e5dc6313e827d24bdd637b95e432a9c13e2221b34640c2aa5c67873d927c5d6ef4e1be320e619a9e51599c36ce11de25df2def5a8555fc4fea58e419f7cf26f405897c8685a7e74c94d2135789075e4efaf1da4203f0d7b89df69713399bab0dbc26918f3f7ac981fbe7f3231d37d7cb31808a04bc7c589b0694977e1f274b73282cd2024141622f7e9ff4757e031b90773b4947d9f1132433d643d890ea39afd1c99e537dcc3ea2634e584a7a2ebf58a79296696c3d6de8b5841005420ee5c54c09f260b2234693028943a099bbec174edcbe45ec12075b74e2b6d60e97e01fd60f5e9da7d94e575aeb3520e0424a0ede374468ade36358587be30f73f8524aa9a69cce8ecc6b8168a0d46fb25c502d0e73262becfcb0c7f66509cb48307643d604f84e4c2b25e429498d0f8473c0be28ccfe3d9c2e106d04661e6bf75dbc0b0569f8341086255d7a54ea30c96ff516a247bd1a280d32e58684ccbfbce7ca59854046249bd8c599e23b077b7678e7d7ec1f889d6104bb50d41fed447498953ebfb8b36df106d4010d64ca0ae4e3819ec46976528e85d86733ef240050a5103f307b763ab6eb0374193596b0deac5abfb3727f7991a8ab13659f13645770ccfae6b4ccf6ea8bf61b607459b9248422141792c23ad42095b40b05387b9d27415d281ba5c87c124bc1e579f583daab947ac842adef0eebe951cabb1981993c59b0b57b3ab48074729bc7712176aa1c9db539c16f77dd480d8de1ee6ef62c2d261c89930ffb091b5f2cf38cbecca68bed0ebf2bc7558c037a45dcd2078f71585bac2ead125249e3083599b8a28758b8277dd7786c8748ad6b4defd9049ba3cbbde82da3065f478d9c96b2bf8ef452858c13b300979395d8da98b2f7d4a55ce1e33bd658354ed197269035a81d6e9c6c2afff50ee0b0e2d4b89c2bff247c33101d5f6f9dee68073478a72a880b4b047d5e72b065a9f0d95334e8fdd46467ee94e6836a8d7e39bdd0ff71357005a7dc327710bdf9661f6405323c7a79ea3ab753b7f6f1fb62f0d17c0d71cfdeb6a79c01d32931fecb361c0d53f553a96734e85f5ae28105cb0d5c781bd501573c6a4c56a03e6f09afb1f9bbfc3a06d09da0b316f0a89ab304d427bbb6b7dfa162cc6fa0a65e59d8bd11b28b46c7e97607319c0af1e77ed88a127e8d22076aa52d2f508d206847e0bde7c4528387d8c1170a26dd0a51c54b07e087b6478e97dace6c4b430a80fe2cfa8a6fb93a1c2a19515f4f8b2638ebe8d1570bdba3ff0b54980cf235e4b990830262d1d9db22595f0d6047347403b5a34a6a1fafee87bb58aabbc84c8b1dca428dc7a8d270e9bcfa34e601caa43c4b794613ae70fd9d64f0c271b005962f68272350d60ac61d533a926847ede855b861dec315c2aa5abd2d88d9ed7be430ccf76bc3232df09", "635200", 2, 1557548552, 0, "4e75ab0de6931824722a9d03c56648aa2c2b5b0d1be95eac9416eefdb1fffdda"], - ["030000807082c4030154085a808030f541d346e44af478fae6b293b3a691a7dfc9de3375f486903dd4020000000965536553536565536affffffff0288f5e500000000000005c2dc0500000000055165ac5265000000000000000001e59ecf0200000000000000000000000081e650435a33ec0f7fbf34a7e9aad36c1c547f9750c7a1a14629737a8970b230cc619238027a399ac8dfab71b21b6a0a8d62dfafa1e6fbf600636dbce0217fd3ba7a7036186a0a5155da5efa7f96b9707552be88335dcd544f6ce1572074523d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a04ac6ce19d576cc51a7069057876843ab4a8aaa11d9342c5a17618f841f9725b63b4f04f87daae25ba9883e186bea59d1e3a9ef304217296a0320caa67d4a84e229bef689963a9cf3a0d888a59d8e8af260505397b2ff68ed971d28ac9996c56d4ecdf42d2dea125caedcaf4790ec3570363923847bb5167460bdbbfec199e020f10d21c1d1352937e9b63a0f764671761d6bc3b4cff05a8949af90128183f940302b9194093c515cff586532e11577991d8d0aa788376de08c7b7648e9db99fe60a03fbb90ac7cb6b676823eab6e58499442bdddfc6f880f05335e99c57c63f43165af9896cac259da15565fbd888718115786a395369aaac82de6463e16814fa38022a1927d9954a153e15746e962341fc984fcfb5d478d97ba0ad7bde74b5c84f470326ff094c504cb4480751d337925b177de1032ee3b10249949abf969e65a2897403234fd3d7d8b7b2765149365101fc3bd38d3b01bc17c8784335575e33a749e96f03264b3e92bdf8542b1e968d14f0b31cdab30b89040f87972ff36f0a7a8b12e175032c33964628fef191357d0bafbf969ba3e5abfe8c7c820f38bea8a318f740cff376195d9eb0c01ed81559c7ca07b43546c95f07a40db9f06484978cb4c1366cda0841a033ebf9c6d4ecf7245aae2a6c76dc51767db05503ad2bbdd4147458a3ea1406a33a2dd68b5bd42024d9214b759a6ae48dcaa459e7a24496b8ac059e7c8fbbe0740d96f2c79826d16f32eebe789eea7e62535bd3fcef11ba78f9655dd82601194469e1c8ba869e075401b9f547134984ebcaa7ca68d296452c5e0c6ec1a3bf2ee0da0989b8923e19026ec6eda82070bf3b76d99ca125ff97ae8b1f7f16524d7d39a3a0f4dac2a6b42700fa6680a0ceaa0b8d47ac60c3a58faa705b888ece84fc72e7e71558e9a4f79edde2406aad08dde4064cca504547d058abf57081b7baa5ac2ae52d4f8bea7cdc72b2fe99edf131248d22c396c7d53c6580722516295e117705aa15a1bf81fe0b2b9841af31304e77f73bba0b23752e34e333c66a579f43ce409ac2bece4fa4eb5743e7b0baacff99ee8d42dfcc487eb500cbc053fa89726e0ae6957e1a516358671e948334ad94ab0ffdf82729760145b4de0ecfdac64149ffa363987e263eb741ae408762581fa530ed1010a809f971ad254445ec21ed3bb882b778a379d7173fc50f5872e48a8445df3b4293ad2f8a45dd3f5a6865aec02f5096e178c71f85b49e1cd89a89c32ac8e7a7c31a37f8a1efc09030b4b81a858ca762b8fe747b495c46dce77d8b775ceca0e9438ef09e1ba4dbf4d68a7a12bcb3d3fa2cc46cd166aec1a9c7e22f96afae0b15194a8b65ca5a0237292986656f3d44127dabb2b95291b29f6436898b721cedd08bf2252726d36705f6fa14d10c2483637dc574f9c96226745a0f6ae71b63a8fb36f9bce8ae7e83ef80f22f6458d7f88a38e6a76c3be66589c2ec3ff27a32f23837e2a8724bf8f97e9ebd5e923f35a55ea42dd96007a1308a3921d28ba0150d538c5e6e59f329a93f4a5bde9786bfaf79e6ee7378fac3979bc283d7fbc0e7da72eaec94d3f4e8742583ae605b18ee1e1f5203438e96628b9ce48d0dca502f0df8fbffa616c9a0ef87e3ae68e68a4dc602aa590413cd6129201f0a9b3b6df946655427c091df521158bb6879a8119e7866453a3e524caaad5118e0c2c0390f9d5a95f589af03d8cda490c07185053ce513a7b1804030c049d0b9f32217456467a94d5d78bf37fe96bc2b8bb4cdcaa16cc8ee30edd205da07cfcbd42a6552bd5b61349e8fe7270ac97dec1d2c58cfc84e6ae140083b6555b5e6541dc326ab982b130bcae8dcd3127452ff72429f368e1acdf13df1c2f019f263bc1416be551235a21a3b2071435102dc35e8455575f040e12c776b644ae16541eeb5bc8c149e7db721e9c2f7051b9de3ef897899d28fc858809b8ff408c8c86dcd6fce2650c59f4af27cebb211041c1b0a0b144435fc858ab83b6634c4058cba4ebd0e0024ef0f2e22f85d73ecf88e1545181462ba52b5c6d6d64251c603433ecd28e0f7f655d661176c0dfe136a4c6828af8a80db811d6f06f19a0109059fdf13e995d5b618e031ae5138522f3305a673cd55a56cf21d12ec2cb3ba945eef2f4636d51447a8c8a415ffb4aaafbfc5b873af2e0c515656e43a69737a77566fac923a836e2ed2ae4b6f6121131c9f2b6120d8b314fed707302b5c040b4e0991b61f4fe4ac1af8041eb76009dd3e2a91cadf2d18ed6458f052fa9a953c3c0f5172fe2ea64bef02668f727f9bed42cb01a965b4e88fc744004bbb5f900bde2cdd511548c3d16d0f4aa2f1600cc08252ea6a92280ceea91968cf1db4a7e456aa0b668960b8bd7c1b1923767cd5183bd44a8f36e8c89a9af49afa0895cc0bc1d8cc09e7690300", "636553535151ac6300", 0, 1325790144, 0, "95e415634db50c3896db3382ced1040db0e053f6408caf4789f6547896e834bc"], - ["030000807082c403024f785a7d2f0337e0574a13b88062d26f5226b8fa25aa4cd5e760de522c47ae940200000000d674ccbdb92699089041f5d100731dd54c2bd8b9c42df18e1d07f3884d89fec047d4c356010000000352ac00e1bff32501bb277f020000000004516565531d9a613800000000020000000000000000c11c3400000000005cf146733ac689d4cbf17abeb1757e25745a6088c4388b94828c17cd61568d60556a4a9dbb6703a2a6d2314abe7c2e8539cdc66ef6bb9a4b0c883dbde94becaac1d5feb7b2778f9ad3f0126158049c74bc347d20fa95e9567a85ef67662bb63a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076fb660f8fb2ff0625aeae0b72c3c54cf5a6311450346615d4054cc6d837254aa1e0b0e51573f05384ba64279e05493c9163c38010296f78e9c617a72c0316cf3dbbda7bf86d620147feb9b58904480e83602e15a04ca5b7bba55a26ebd0f2bbdd3f3940d46b1d47164dcb31bbedc00a6f2da4266f2f577e6debac6700c5f898030474fe36d02bd811d66835c56ff7c41046f5c0629c654cd14d87302f38dd174b022ee95f64df66e9e725d651dab613a24b4d8d9c626de56c266de3b3c02c523a7f0b061a1453b3563cd7ed0c4b37d1e066e7535b6174855d577f6d4f52df948dc5fa0f1ecfa0958bfaf640074df22688ff8547a8c43c9b85fa240cecef59c46c618a0313c2c19b718391af298a181e1ccb16dc8e748dbc2a267e29f41c5524c1752082022165b5834dd923584117ac8441f58519b129ff4666520ee60da33057e59b3d8c031d4e9a9c209b4fbc1a4641b447fee829e93eb532b6302dde6febe70f949f1fa60213d19135ff3b8d4475ce9e83f6aa3fe285c3483c986b2a35ba721e2d7c5cb91102219844778e658794dc774c1ccb8b208b582beb3f016a898a7ee2d8da6bcd000f0dffbdf8bec6061864ad9fd26e29bf9acd17df29dc6d1c05893323aaea3612754ebccca5c9f413b5f4d87ca41552d147b6d99ea2ebba36d3f5e0bbaaf1e73ce6b58084087710b9f938fd1b74849ada3b41a2c0f1410cf5398ff1182d618440c0a643121b5d9babefc489c8396ce66cf9db5c357f21a33611e5b0af24f4e3f3ec9eab0939e82e21b7d1601bfd9ab924d3d023cd83ce4a13c0711001ff94e4d5fb578115682d3353a7e3bab6538340d683ec5bd1533418e6b6dc11a3eca840d90f1bc57a5574aec53bba8e5f63945662d8a8562d727cb604c9b51b59104c92629aec5b177d53b8023dbea2ac88fb13350275e3572dec0a14dca46c7e4f142406e0a3bcb8dfcce31cf59f999dd9068093293333cad732f9cca57120571a8bc983dd8bcaca1fc7eb381b3b138375babd511272b82372da18a3fe265bdea1f4fb160027b272407079d89d0a20d31b6a698b69c208e64d971943461e4a665b5e41782f9b75d93fc191b152ec71ab774c4ae71acd9a81e5f61e38457c931816a895bf18ccd7bf099ac8d1e1daca7ed7726d25fca1701b03273db803c2fb79883f2879a2f6f6440ef0bab29d440d8e34aeee0605fe0ef15b74bcbb75a9a572f3ad7e8de4edb371ef4cec3cde8ddba54b53124f0d695eeb6f35e6bc0436b9301b76ac4d484e965b00942621f9217afceb1f80872bfb9c6f3cb04e5459ab6c1c9b3c84d27e2e02b284516f71ef9c86be8ddb2659fdaf64584126120398ae21e5b5a82b97a6daf6cee620e69a09bb372aec2bcf677e6e447f2b41ad204264e3afc0cab7b1cdab712f1bf8c6a30327047f290a48f28be15c8c1d4e996148628b08f1c962cb9c59426119a728b94153fd55a9cf8e2f5adf2cf04476d001cbb31b8b57c6514294647c084738cee0f8126f123952d380065481af39b31c9b25bbc57ff8861bee2e73d0bf98956a95a92b5c08432c658610861af67584740c0b5e6a81d220604d485c895fe19694b45879c8f0e4c9a51c1d602c5cd73b06387539ca539770d371b09bbc3503a8eb835a461d1f5d4b2f1d791359f815132fd94c3cc4a7e2005be0e2e991afd81b2754c91fd6eeeaf76fa015342f53cc711ade5abe33557ecf9871713651b24ea7753e3a7c44dd023443354581c14e6e6b5c4f09d095f9249b4c85596f4ecc3d9ebdeec538a52c7354281782bb1d07ec52291564b816cd1443291e5da1405f6572a50a594b4ee36217cde798b81b93a8bd2903177b2b36d466d82e42213160fb6c035f57dd7717e6dde05ae9e66b0266f5a5ff2360dc4453f9dc66e9e97433ea955822b04fd6dcec84a17aeb07406b5e20ead8e72254f589ec15eab50cba73d04f5e668c9666fc24b7bcd96dad3966e64e7804bf54499dd5e6430ebb813d6acf41df664afc39d687c4ec63f7712081c02074a5becf6a1dc1e7ca93ff5ab3d98cfb626876bbfe5c9c628656cd430082f85bbd0e00a83f34d2f9bc9a3f17700ca3118db9a4d5040a3c2cb4d3ac0cca5c8c8966846352294e4adabe1c1d7dd64aa624207bd0a87a0a2fbbc2422cd90825f389a15eaf04be3a3a67e91926951728c32588986a865a633c04b03926074223cb2e790bce2c225fde8a933bc25bf5dd1457e3f16dd8f7b6b1bca4cf522f793dfffc99c4b44c8d9d4647b7f0e27d5c2e1eb3229edcf78714adda0ff4c62bda160028000000000000000000000000008c7b3018077a926e494745ddb927e8648a55c00cc939bfc52eec9bf20935c6020465c2bec1f7e89ce3f02f00fc9301c3522b5285010d8df34958c950f928774303f39b93ee170ea129d333806b6bf57864446855e5c672534e993d2fdbc23b27000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006543ba4972fc8e3cbf8869444c778b8e0896c5598add7691ae658f8b5bf0d471aa789747e36570ee5f8d213ea2b943e88330963a7e7483eb3389dd9323e3944864fe4d7318118a93a1d65910c950d948def213709b9b75d0af7823c52926f838dd9c1a0c9fab4d41e183ed98024f8d5edfb93b426c44ff0f869f461a78ab7e9f022948a54e1f3d325cb2d0b631492caa864c8333db8eb1b5ac4e0c0bae17fb8b02020f9244919d44958a48b30f0b5ce9abef1f72fbd52f684aee143634817e610fea0a0521107f0485016ea27dbf25e90edc7ceb2d26249f576ca805905c17017cd293dbfa32618879a70c9b2b748e4832842dfee85261886e75c0a11b761949afc8960207702048f83e40de5e79a58d8e7ec99db4643f5ced914d6d7f5a23b6ab79d79703076cbd51804047744ada7edebc876dbaabc561528655c5e22d630dcdd6a40d78022103c2680eafd1d56c2c19d5f5950a00bd06fc38665853d16ca02f1253ba86b5030149d235d82c265c23f16188ab7e6152d78286d454d62f945dbc2bee64f020700217ec469a5285ef6779c14aac295ac0cd78f7050ee0e756adcc185eb0bbc7bdc91a9e7f473fb1ddfb942b814a937884127e97c3246a85ecdf3d446bf480dcebeb396f742f682be7dfda67da1da023f8c3178e726cc1f90eb0cf81702d0c0f64e80bbb3590441e7603792983f7a48311d18b3643d934e6d78e0ae514eebe8be054af4e4a57e8db4e85771c29a65a03c47280e8c6ec22cba834516aec0015927cc2e9fcd8255de0bd61df87a91ba1ff7f7446e9c1c47580e7cdda29c3880e0dfbbb6005dfa847a0dcf1bf9a409074be098ba57a87bc5610ef03a7a6034797a2aecf738bbf463258eb0f30277b497bdc053720548f7345db1b4d4f24ba8955adbd020af4660cc0af71c658bc0a3f2684ed2ee306b61530b0a8d22d44e3ccc1297ff8d46f2f56ee3fe1d4d77e01ee6c110ffcee9292783a4cc9ec5057de567f7b65c217e2c0152f04ef7786169d4bc1b84d94e3de3fe7eb574348605febf8766fcf3675b8238db8ef8f5bb4d1b51775c707e73eb0bc1d14be52fc036b65d0cf64c4cce8888e757b40342d1957974a414b77fa4768531f5eed5d768205f94e10a120f733605f314ffde7b577394d1412d955eeb79effd79cb50fcd9dcc55a6cb412f76e62095b688cb4716f5428355ad115deb245423e944f3474705a15e6afd0c0f0d56e092b0aa99f15358fff75040de54d2e2e362d0e6a609d5f804dfa1062d873568c45f1c023a5a240d734a717ab94887f9cf21212fdcef82d0ca4c64014fe6f5de0d2dc84a93982b3f9fc34a11db258892c5c3a17d783038150408b4851613c20bca675b32e9b66946558a56b0477866b7175eef49c4e87da42e1d861cf5cefc4ad00b2cd55eed7a38637bb0ab441dab5c939ee1fec08dd3f4b359a17ff6e5051ac4bb0b2b6a355966462dbb0aef7fc208823ce4b2597095c6fda6eef3429f5c94ad3e46cb1dbe8640ec0c0c93d0feb8032f0393b53d3d570dfa547a2cecf84611c9440d2628fdc6f67761fdc0840d66792e5b9613801e601292d86c7851d8cc12d32d8b1004b799c0308ab5cab1628fd251ac83ac26f830a82d8e1b1e3fad707af6b1a5a96b071d291c04f18489f6c65388cc8dc02e76394256cdf5dc6566d8002cabe0017f7416df64be9f1ba9710e7136b495009bf9e3f3b97f73bebaa766c99738439770c5e9a902af9dfe54ac5e8bd17635632afd386ed3d6e5169d0e3b22811eea56575444f6b7bc878e409d648b89dda793344826396a9fbac9660e5942c7b7c1e59d98ff5e748a96eb1ebbb562c0e5b4490532736edb40a8f7225cf4dc73616772607cd03f74413e076d7c0d0ba4a46bcb6b014a970ae2b96d7935f5c3c01181891658b9e85acdf23986d15061394e68cb13cec16a3cc8ba9b69d3056364854d8c1ab0d43d70beb979edbf0d41c11994ee9e3a6de3ead0876ab0333d2cf7975a95ab933870669fa8585470a94f6303bd29a9706a378d110c166e85b7befc77e78437b0d3b107c53e1c98c2aa0c9e89d5e98023a33a40dd52ca810dbce648779ce405a27d998613459e1822449b8094a81548727ce87d540f1559e7ef601f75e05acf7013f53845f9e9c45f71c1aea51ffeddb8fc3a3c5da367ac04d702e34fc2d79cb339b4920dffb9baae9e0a69ede939d5c0d4477c9d31c5a7eac4eaa2499c1c81f85787349afe7d42eb9a12b08b75fd9c8bdcbd3db627c995d36bb6a2484971634674ff023cfa82488621c75813820a4312d98f251362b356ce8ef24faf29265644d9ddb11490f0e4ef0cc3f4947c6dbb451a6ebe5c99d4b7dbe27d793ad005c880d985e43623229ad488f6894d16a99e90aca0b642e6f4db5bcb5f06a7f44c85d42e1865ee1d5d2f6e24b70d", "52", 0, -1688408134, 0, "534b1681ce20cf207eac2b8dc945e014cb1cc850ce262dec250a7d9e0def9874"], - ["030000807082c4030139b57efc1eba8f9d5aafab8383d6ec589eb266b7bb33b718c70ab2837f3aedd90000000006ac51ac515163b8f7bdde04c7c1fc0100000000025263a386be050000000003516a63b786b4040000000001529e09e50100000000035152ac1e6523c529f478fc0100000000000000009aa8a504000000006cf9e2039b240760b486ffbf238e18a7aa22eef3054302285a0245db620ebebfc0842c1accd7f9c147fd2efd61876a679c82e26cfe10f4c6f3973058b7ec353b6f0432c8e702ef554875e99ff575d3e242abe294fb0f47246f99eb40cd511f3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000178bbbbd513a0ef52dc7d7f1818a3743e0bf3e56ea8745f5a57d4c066bdb24aed8e67f900d0bf2865875e3d6e885fcc5b0cca57f6ba4fde22e8cae2a98eaae80536936dd1117c5b0ed2cea53cd5af2fc2f6cc92d7ee0751010715e8f10897928778c4b652fb871b0690f133f32378d24c92c58bda4383dee716d5cf6639d6a4d031da25c8aff660e52aa3e10571869e7fc77cbc670d0005d1a5fb35676551870ca02031d5f9881ae28ccbed8f8418fff5e31e8e5d821a6ebee1d077ba018d69940f70b06195d81015d1441ce12f16a2d81502feebc031aead0d482dde1138a40ee6b0068ac2546e9457111e2b7e460ff3ffd57e802ef0f57c842343130ebb0ca062b2403206f2372e2bb10478364eda452973dc508e7e3025fb0d3cf265182daf142b3460208b01528f36eecfd21a7a855d9c6e93e78df942718c13c26353ae6393db24380031fb3b50e33dfda07ffe5ec3c11311c592f3c78768fa92586f745ea90b365261903191006b5b23e93b32bea68901ca4088dacc3bacef3da22bffcb2951c416bc1f9032f682636b7cbf619e39d69846637d71fe9d4ec9a0e5a82524b25f65e0cad0223b7b21eddf01dee70bf66db5da7a28c189f102ba9307d2985179798167bdab7529314bdf0bbcedf01f21f8d630aec8a3c74f3f7808255c130b3e8c7b79c73d6906c415958d5f9adb4106f7086a9a715da6a878870ca703d6d0e2170a7c3f9b86bd82cf1d2bcd5f879e85d973e0efdf98ed939c19f7b02c6d116e5b0f6cbfe6a0266512bd668961ba7007d952d5777121e644b6cc1cbb01fe0e8570061fd0bdfff4af126e18e779cbc49e8937524a32929f20949ff971c7daaf63e6441c3ed682043c6799897aee8beccadc8bf7cb92a68c66571965a27b4e46f20d34726e2e61626342123d56bbcf2eb93b5be63b87c5a7eba283d569baa930edad2f77033a512ab2f47e7b8de446604c5c3fb66daaed6bbb0d3e05432811b1c8c6646ba5f25f4987beba31a3490f0f77dd4fb64410c36d647868bc0239beb5670c1f5c6c3fef70d28dbc8acb147672e1d72df8cd9233274800135e1e76100e53d25f26ab04ae4d41d90fd3a6c00b4372b0211a0604cdabd4dba3e444f3208faef89d24cd6f66c4c5e81132bd07bd6c2c3a983f36af9670d24be93bbbe4f0f3fe1f4e091add655026db6ee8ffdbc038e0a8a5cdacad7fd9963c75019f05f36de00c510adaf0a951139324a7505ba93bc898c77eb0d318255fdd09420d5fa1c029f538bd63109334d7d4bed60b36ccb1af22ef13c2dc42385039a56086ecdc1e5db44f5a0e04dd273fe350e56319c0490fab1d5140294187b93b0b744a2bd8dc89233055db120cabfeaf0d98d2e803e544f393642a395b2fe398397e302379c17c9e1b798790e41bbf3eea0749a228ff4fb5faf18c8a341bc5ec169d36c8ada2a2276a2196408bfae3a8991e617c3ec1d9615fedc01455afdefd4f0acfd8b7a41b1c334274eef36f4890f84f65c3a6f057b89ad46e519c54a4b40cd1c49275b97444f59565ac103dad07970cf17db3e4f56c4807b2bde2da46dc70af13649891fe0964abc1b9bf31a6a860c917ba2037b045de52d0aefab54748bf350312eb75fec071dc5e13bcd871b4a8f23378b0c8bebe91c7a4c84c7a261df794654647aa3bff86153ba5b05a364175fddee686a1d70fb54b51f995a19fee1121acd5667583d6820123ce9d0ce4a1d05faeee92a1bd2f1a04cda541b69cf9c460316c18df2358add6b5415d813c3c9525654f528d73253da517a3cd2a1259558f50dae0fee2b7424feb55b945d02d3f04ea47c96c1f3ca995631012a9d45277ab8967c7e16a8ef9137a6e256cb704f38510f0f6807398c3a72e9688e2259e8f15fb70f77c51c8222376801f4ffce01fff187634ab6da90b3ebd72e857081d99bf34d38a5e8734b400d164cd685efa9516a0b7528576f78b5a673d9e706d0f8f1d1437789987dba8cbcb9fc656254bf6d4e8872777a1e4e27568b2ea88f9c512026fa060a65461e170843bafa6199712e59781c43a7ce2c0ffff131bd3ba402cd016de1d64eb14784b2123781f912a65f6b9035ea9303a581ad21ec33b1155ac95084edf44edcacd12985100534bd9fd8c0b3a400aec026a14d5522a0c949a02cd657f51018d7f870b85b82e332aaad78bbcd2a9c0c29c272c1ca75cecec0092c1bf73aa20e22bd2662a6f61cb49a399db726dbb74768e6a91c56f4b7e392933c911759c74e3789c4f81f42a7d5a6cb85efc68daad1d1c53c39c37bd82479a8f97fc14a62fdeb9d153fdaf5bf2d93a380773cb22d75fa8c465810cf8c32c7479e432d5583fde5358ab3b9d42bee62b1afc1ed7d9c1eb7dcea59134fb32c86405ed7fa2e1be5a84e30a216c12a3be352829c5a68b8c37830bd7977dacc6d0f", "51535163", 0, -1440258765, 0, "6eea2d333b0572d7e00e55f5a050cc2f8e9141b96ac228874c6b3b88cd9b1126"], - ["6179b65403cd9c683a3978abe35f1c970c48d737791aaa8b8ab30cde9a728a3318f5ccb25400000000016affffffff8274d6b51c2fb66ccb1019e2133b78dd3a2dd3bd5653f7ed035d407de27e4caa0200000000ffffffff4bef94c6af020f258672dae79ca7991e5621be6b08fda0ae1b42ec70d632c1ee010000000765656a52520052ffffffff02693ea7010000000006ac656351000051ade10200000000056a006a63536912dce5030000000000000000366d7202000000009ddea092d8676b888970b9bc22abac8387f2308176d753801a94df2ffbb7e4253030e85c7d04f85e8f93342d34e8785081616f0af69bd64d7d514fa34d95b577b2c039505e88bd98149f69475abb01c4a032076adff645f2fba032147a0d9b0c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd792e0a7c8843ce6fdba703b21f24ba7382539756f5022da27d6a4a224d54c9213316da406cdfa5850c617d8f6fa6e46bca59d60fb7245109968b11efbc1c4966e6cb7464ff8a8b4fbc493f53e871f99fa074680fcdd41407d866c7cac2da2a1c912afde91885fdc86930a6f35dd68f3cc21869e0bf587a46be995030f06ae50221f66d3adaf101c111157eb83bf83fb279172689e16c8ede2c42172ee543ce9f031969ebf69cd27780125f969ca7501d2236a93ad9711147ad8fc83114749022910b0839597261c7d5f6af7e5cf41196ae9b6e153cff369249d4296fd5a3173a1a7f5b92e31c657f9f7562caf22694dbc78c8dfeb5cfc0416c751590ef0f1e724d440318e08c06c93f28f334704f2396afbfd1bf1bf966fffde05ad6c695c23dc405560210ffe9641c495e9ea6b4de0dea0fda6cb15409a97df0c54f7e66018e237a2aaf020c7fa90382e62d2812fb184e32a208633a006afb507e7663b1ffbfd9fcdf8578021b99d298ffa3a5ca27883b3c06d98953fc609a730833c00f213bc7c9b629faf403237b2302aba895b949773db34c50e920ac68c7dd869d0540aa8668774822932a011d1d6638b4ed953d2297e9b7a09149d5d46dc2c1a2f83629bd5161ec5d6fe0ef1621f7ed8919a03b649f545d996992e956a7034108c48d3fc13058a188758f2a805b7da2d49988616e3808c3d55d20a6be2036e94f08a3520e27a707a34688abf095cc743ba216f08035b0eb6c714193b550a713fb302c0d1009d054b71d676f5148f904689ab98b4c2399b8f73316d4392b5af5cd15c99050e431c022cb6088825a6c473b99839742e9e6bf46c577eec81c1f99970840b26b25e9c762ae67758b17ecd8a24f00b3f069c45fa527271be29e8ae07fc5f53ff49f9e343edc83412937c833bb7c33a94b088bc0109c9770daa7e63861fee83a432a104b9def8176a4c492a7c09e0d979ac4ee538ba2630cdd95abd529e664800bfdbde04d184139e9dca420c482b2193da2c48922ca69f0b739f003fca28d2f15ba03de602926e0eacdd31d55cebd7a50ff6a023b7df0c699659623f2fb5365b7c75ed7d50833fa6d60bf494492b41845e98d9be823af7736a35ceea447aa093ca483bbebe0b7e2dfca2ce2a677033ccda421772c00c82c6310cc12781c6434d2cbc810cba240536a8a150568d6a13ab9d38cb498619756982276932c2f11ae21369ccdde278ca9287e8d760e5402d1cc27ffc6e325d6a7cd8979e70def59abc9ec91794c362b72fa00f40cacca73042d77310b800f38d5407826e88387697375d9b5edf9817773242ee510d42ec7bfb91a463cf31c9ecab8052c4166cee733c5dc64310ce065452ef2a498d6cb957f96f0b910fff0ee58939b9bb56eee23cc1b32efd0c946b455c02cbaf004711e502733ba39b3fa2b1c8c64ac61ccdf7e61bdbbbb875a2baffc56c7fdf54eb2c3e339654abf13bfb54532f92694913a98eac1193dc8edbd9935dead0f63332e15ac557f85211f760690861ab36a62227a53dec0ef90924860568d9f219ef1f739745558d430dfc6adda2262f4916e3ea36ad481a33296995776a7c77342b8109917998b1771eabb7dfff6ef01b457516270635a9d15bf9747246dd786d9208a18e28a3bdcf498302e33dcfb1f811cb5d68d7aaf2c91e2727ef896349a80192d5fb47305ff8bf74cb95e29efb19002d9b9bc11d1c2cea8fc84d59c18f369ce5a300af06a227a68780af1fa9e6f5ac88751526cd756fdb0a4ffe67e60458a3f208c7f451d92d01a059e5ff7d81f77b097b32694be7b3a337413d33797b7f0d5306f702eb096dc00bf66b9117d323cad11d211bb8700bfa567ec2994e6ff5df7045b147a5650bd51bb1f845431c1ce9f2732af29fa3381876bc62d616efb28aa75f5117732b2823340514316ef429dde865d78aecf9f2f3a2734ff2acbe759ed69fe5284786bf39105ac365d9e1465e979841e6a6f75b0cc3d7018e1949b8db73ea21d7d46eed9ac7cd07e0bdd2b1bdcb463481ad64c2fc8ed4b45f27c2dff2c01da192d6bd10509aba96fc11be0d7daedbc897ce87f41d59c9aebfea29a7005308baeec141e077198f3be5e2adf1c74722f70d5ae7b89d90a91a16fd11dc17f47f600f97496a57756eb38729bbccb4a3efd495bbde17ee8c16abf968bfe4c20a9ffa9aeab8e4116f4b01d118faf6413fb2c86172c223bb3f78df96377fb11edb585364fd69e8b6b95064a35e74168d3492341c00b62732ee7c8b68e67ae184a9d0a9305ed59591b53b038ab0000000000000000a4706f0200000000537f8bb18206d1b6060303bfca3160e3554160bdbb4d87fddbbf242bc440717befafc0c5b3f482712bca9fe86c252673d889a2c88d82c85f85a9b12b557ca37721f5b77f1f4cc28da3e1723b2b8fb2da78d821959dfa278798ad7bfb80f2b9d90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b44f6afd6532c953379554a817bf05dbae346e0f22ffba8a75255b8480b12157767472accd45d8d94ed34a09973c120de9e842a18f56537c8ea3b15455089feba4b922c13b713dbb948390b015504849773b6ff15b1b52fbd156a075367ab299b55a725a7188b025ceaee7472a2502ca307a9e3cf9dab839930e96c7e2222d020ab6ef15780cd673373787cf70cbe220e8eba871c746a7e6bfeef8fc97778eaf022d51926762f02fee944a2b1310beed65ac26586e475910b5f38c625fc33139420b02bfcf68752308e13c8ac1334f9925bab69007e4b39968967760ec286c7c79f8e724e4a5a2aabb7d72938cd36da661190b5b184c3a175991890a2a78d09bc800021da6fc664e4cf5b32cfef47da8264e03ac3d7c797b63873fec897d8af4312a8202124d754e27ec83b7920bdc77ebea2f3f9072e79cfe2cc175e98de6e0c4d41dc7031f8ef85580964951a53a228558801e2739ae0902934a65406e9bfddfe9975b4d0204f93a7c2a09a00566c96d3332ba5a3584ec09fbf387e238eee042ebc79619990212e8fc8d79c76f9c183f3f4851a80dd3c94f34038fc4e74e5e2e2e8d9ae183cc9a3c60753c7f2c6328ed4819b3d67e23814698239b486fa57c6c3e362e2a8ab2666815883d6758d66d1df4f989279b04e29be5ffc5cffdee5effbf13a2f6c52f36b26858dd022d60b15d7aa22b72a59dcbc65ba13b1ae8423c460617e0850469344e0e720caf9239e8eaa3d0132f885511415f22a18de97547d8e90005815d21f6631a8749d51f8159c07534d413e5b43b811c05081a38b947b09358cfae3e50866782b0e330c3a4dcb30fac1fc24161d302abba45819ec85c829544af450cbdbea614abc38d6d7cc8c27763728dae303826ef05378f4267d10c6ebc4a2aad64f6d8b13ec0a32c01179f37f0e500dd69a4fb5e86ea8155aeaadbf87fd2c764b3824029a8487f4fa60da9d872c47404bf661432f4de73bcbaeff708dceed55c22000ffb5ecb9e9d6783544f30fefd42b67262885fc047318a1f40187e150c817dca0a06f230f0913fd58574afd50036a7fa8209e974d65e9c138cbf44afb69cd21c54fe694bcf5170abcebc4ca2f6873832d13897d9858c49fdf97b0f49375b59395cb335f02ad6dc05ef695fc205ed546536be038abbeb3c1e3e6d1f1ab5f568d21b89a303a8671c80cc75b80dfa0c08ed4dec9294450a51760c3f2ef71ecfb4eb8cd49217867b57b81fa7f5604aae50204c43f54ad69660bd39f226f964f9ce99d7605d62e38e0979f91fdcab3dfe9bda23e3536919b56d601759a844036a0ab1d8da582effc9f620cec799f2a999e91faa1e9efb03a1e59bdfc4929148d837deef653fe7fcfea9f58a54a1ff5b39862eefee28141a3d318ac1548e1c894a01daf66c33493512ee0d27dbd55d16a980bcc4962a135777bea138241357d82a58ca27ea8ca638a87c30f9ecb387c0c7bb3d108cc78311d3b1f2bf01c86f47a479688c20929434d6d15f84ccee32fdfd5965f639c8e337c1db69ed5134e0b0773e586ee1984332f542447caac00b909291012c121982ce2126b4a6e0ab429b0e2929fde59a1769948ce9c59ee8e64a4c9bdbce0222b7b1bc989ad13ddc3d7c53338534b67493ecd29f6aefb3fe33d014406b30f0a8cef2d971bea21e9540b1e1e80ebb7c06332e8925ffad9ea4b8e43564c63ba55bfe51035c22eb0dc8fc8ec459f74c4f6eef5b879b52ee554a8040f458a7acf723747fd76a32b3faa53527668631e04784830cff2134f25834adb4c02b2105404b14fe29466501895b97444b017649f8731e818d369d55912554b03d1b7b9b42fab9478a21056d47c146358b38565085337af81340670f231fb9a2f261d7425a3a6e9958563be2a1c656f2b74bdfe172a528d37248ae522a0bf6829d6ab6996b53064865c85f5cf3bc40af08a3c40cdf048513deba2a8329a5fcb5be82c9a64e1972351a911c3e7e1812a7c39ea8b732e1c01fa578b7184944c07dce89b6cd3419700c60a12e07b8461c81967a1e8c3a388c6c3c4b3566e1596509affe82ebc446cbe4998b5b1794b6db550a085eeaf5002a2afb67d8aee27150a62d8fc042daa27158d7b190c4be343af58b7d87ee8a85818c05e7572dbf13721fe4f68195df3091d6cd976cece932520d654c6f74fb5808c7a376267e9470839daf48f9040a52582d2035f9b573fcd487604d9f4fc580de682b5e158a513f105145fe76669bb8ddf2b5e9fd2464139d40b45aee0ba4219f6c8a4071af96ae9330831856ae8bc0820500000000000000000000000042df05abdd05891f7b69126c8b4525863ad90c3537442c7927a88081ca84cb84ac3c4609516b21cc9ffdf78290c60a25bfed5d5b9834ba19c30479bf767f3ba63c1c3dde85f3a53b8bd2490e3ade871ca65bc093404b05f49d341ef120bfd01300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1d93e7300ae759378485da3c535eb975e238ac415a14d8512481f8fe7b1b4bb7e6a53a9cc7e7655d25f10b28173bbb44b49f84634d8196c8b8981ac35d56f32ccda9aa0c83a38453830bf3504182e22321324160cd33612ac81011f86dfb4b24af1df82782a5e24f9127c6e507900f98dc807f2f7a4d4e0dc4d574bcc5c6ae50322a5818463a5e3e6a63f2189276b7a280ec56a1ecfd0fb0179a8cb4d8e010d300302d7166fb01bbf00c82b51354ca8b6f8775d5a5213cbdd2379d8e8177e1439a10b04a69d7c0cc56206149820be295ae71f968622584f87e836c0e4990526c7dfee9b9ad86755f27691bbf5bd0b15b602d065cf1de02df0f2ce273bb990e593e9650215de82ad63354d72aad22b2e63419e23227efe9a4ac576595255297edf4659be0222e761d7b63631c5e0e3694b33ce93161495d4d58fa4099694409fe436e9e222031a113c8d4ed66d6ff034a7a414ab72c40ee88fb2cf992a627ee1949e7fbd36c0020d64d4521e072ef2cd199b2b6fac313bb9e1648464c382eeebb1d83650ec3342021cc4bd1cafc2766a35cd097d4152bcc99cbde034b83e0555376b3c48c93f818ecdd84b853ff119ff02c88d8d2834d5d89a7c8724ccca2492f181bb8738610572abfd8c492c14a89df8eeb8821841a81489d85bf3dc30fffef8232debff885278926726c70638362effee772c7542e0b51ed712538c038d4ebfbd8c0b411d4a005c5970c1ecc25b6244dc0916d80afdaadad4f9c6d60d0523b7b52334ae4dbf7feb46905ee006f7aa62f7e10e23e4855632def9bccbbc0f42388243c60e4ffa63aaa442d7dd2d9e95c94d727bb3fd3aafa3a4fa29b27006fc9edf71f9c0ac5eb22fd67c1b1c8862f49ed520405ac36d4c3863607c211d3b62bbc6b3546674e0f375b5ff571c31293e949a4df8588b17bf2b1227952b2269fcd92e547a2e6fe772b1bcda11fd48b9f555802c2ba835b8cdd543c300924412dcc11e126dd9bf5ef59c5aa6a86a4ad0098a1ebf05ed4e1d2fb60642560e2771047985802f99e96af338932e89b91c7fa437af130cd34d0e462d3410440d86627a6aaf2b2fc02e72e9118538809e551d378f7951b5b8cd981f2aee31ef31f98714d1f2d9c5878889cf7af62563aae81d0dbedc6f832aa8ce87bcd10f49cd41766a5ab10b5c969b2f7a200a7fb405858a2e74e2afc307766e2628f2964e9f8b17a9861f48316a05ba8c7483315affdfca36757aea0ce1cef90bb466247e0ec594a1e18d1c145c9de154e7e92b11fd2458eb349485fdba0a6b81b7cdba15434c748e015f213ac7950a09479ba832b28c58c48e3de7b42ec3063032aded8d720d52ceb0f8237707a82e811c1c9a10b48a688a8a31601cf216505f94b08954390d0e4effa0db1874b84693910e5b629bc750fef6191765e5a9be04bda304e9cf8f0bd954a892624d7241f19b5060950994d028045d2bf9d67273164e53db91164f7e86079a707d649ab2b76cf88d11da7503b2a6b3ec038fc328d0103350d539aa814bb4821c2f7144dd3a37cd8378edc8cf8f08691ff30f4cd323ef9acfa7a7ab600ecfdf911b3e14f7ae85a7b3ac4e83769f5d4719dc0da4cb3a6c1d00cf063f41c0cae75bf14cc30a9872b7687b23e28128b2e1adb8c67dafea74c0782a79fb331899ff1700c01f89f26a4c0e0cb4942d4c81114d38daf85d7c87eead9297caf4536dd06ed8df3eaa1f49ad5fda0bd0b3e94872e559f0f16b83854c2222d16f1757b911d21c1eeed3dfa43881acc5541f0d64fe0ecc9f40bcaf479ddad22500f9a1d05c1f21971c5bc5fc20cf16cc85862cd362bb91960a83b935dde527f8dedb90dc68a5c330d610231c37403f48d9dfc24a507d1f8925d8befdc2e970aff370fb3bda3e2a4d3d69d117a98ebd0b38cd670c8779ba500bd0b1f6633969a8c50c481e8c5def7c26a693e1594e06bf2ba02fe7428c827ab4ef6635125bc254e1238f49123d3664c8992bd47bdadc05a88d308063ac425d307e3d498e275cea3e9f052069266088a6810b7b0855ede9f8cc473f1664fab7090c8074a28a56fbe94022db9e57352b551566b9316f8473f02c29ac3f4029db1765752407213bcfbf42eeecdff00276187abfcd1c64eadc4a31599f4501e4e11cd0b9fd2a0056fb92d89ff99666bad6195b42ce0de9cfcc74adbf3b96e4b106562c365a7f285acbeff4961a457eda76d0a8387907311c79d2692121a92716c1f73d4a475978809710582fa48b57faff29a87736d28a12f8291f73161017af0b44b0f0ae690e5097b6b9e8764b14ece3fca336c867ac792ad0627147d9ba41d6d81c6f89c2e38ce031f37a6de4854a97f3abc6bc9ce23d4c87ed6fb91d2010cbbc482889eee921b5866353bc8dffc3530292d92e69914d9c5fd758d20db71d8ba4dfbd6a0b", "656a53", 2, 7587797, 0, "2818737b78709dc6dd4b85c7daf66fa24420fd5e0be2bd14c430641aa6222200"], - ["e869152003e8fbe483581c929613113019cfa11dfb4138b6eb47bfe10c0fdcf63ea14484da000000000953655165ac6aacac510453dfc61513e1c01cebf6084fda1e74a51a5796869d0818b8329ea2faea5285defac9430000000004ac6a0053ffffffff51ce7f930308a4dee0de6944100d037ef50d21277fbae2db133aae45dfa251b10000000006630051ac6a52ada4e8a1037f619d0100000000076a0000526a655305cf0d0300000000066a536a536a00e431c1030000000001519ee680d0021e1b080400000000000000000000000082fba21da46cc77ba598793c5c85abea7c8ec75021d8ef66cc1dffd7fccd4e2e6277a58478a509327e78a964ae14843a9595badc2a290f0c585b6e94adc67866cffb9c11f16cbb2396d7448d55455724eaa8273a565f6c73d9e00e47a4f2f4bf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b3c350d1d58dc5f5572141436f2e59eed6138d8843e8a00bc9457a66b31a6d572c2cdd02717bf3143b3c62abf32218e6a33191dfbc99706ce5ebb936bbb1cf4f4331297c60de8079e750c753a637bd6ded4ad79cf9b28c3c4b836117604ce916078f2c27f5e2bfbd5feefc7f2c6ab74c87c69bcb0748d67da88bbcb87ef1696a031813425b06f6f94177305d5d8b121bf30580ebe37c1a7aa5324b5f9ae148b47303150ddc21490051d9a2cfc6d421153cd7778989a5ec366d53db9b08f8334872000a08c74981bcfcedb65512deaf428c317fb4d4491ef5e3969e888c6e77b76711bebef270b7637230df561e72c4aa91833d4154e2f3e151514f568e476ba5989570022c12d7fee901e54284cd2917792d239fdb2fdbaeb1e76fc1957dc10747d27eb2020ce697094a7210f4a3dd047a5d4ad46cee0c9a683cdd1e3b762aaaea90fb5e8d031458bb0e84d3cd984882f43fe7b9e68521c52a962db620936b85b8aa98bfcaa6021c3f209d2ce24d90ad6978662189b3e626a537d4be6fc0d3e54c8c07be55177c020fcc33ac1e5514649bafcef26b0f8837733f1f6eac6c7aa9d49ad5573ddf7d91587b4bc574138a4663685289928f7f242b56595925c33937ba5ccf1dca37ad999ee797e5cd6c1cce7adac899a302340461182d9a950d6281a2795a324a428e87846f1e8742fbbc051d8f558ee65feb6e10f860d926483a077facd02c682d0b0991f5bcdf50dade9ae83415eee5a88f7a9da37b2242105ed76a39256003954ecba39f0998352a172806fb4728f2743868fe109b0ff1d2068d6e0c083c21dc225b6ab6e37e5ef726ada2ac26a05125158a37023fad62eabf0c330d6e130dadeb002a5980d9aa3428bebe7d97a6c55999661de39ff2156e3f12ec8aa40a3f792e22ef119a0e450edf5070b8364097f950b8f168ae7ae3d80a1b3c757557fb6d8ec8c9edd5d622819bdd78450eaf32a22c15e04c43b383c8f4b099814b823dae86ebfc5d9d06d82defd459f2752bf8e3b696c33429efd6f16c96b2b46ba61e665ce49ea36246e1e1ad76344c9b7bc522ebf390db3794ed5101120c5e30b623b7e40473ba009145076caad9c5c529a96c40e76f71dd03907453fdde27865fe7594e76f8cd9cb7b049d893d5b489e95f9e4448b95d2305da3b16c1f9980dba2462484a15f0c710844916686e30dea5d7ae820e3518dd5dbbe7a4f70fc5be1f4f2a4bc07e1218b5723ed7d94d10494c49d1da4fe33d99e9dd47922dc80fc128cea39432a3f43216262d0b3e411c82bb3da30ab07dfd5870dad95edff1940161cddc3e924737797efc8919db941fd9f3174b88d5edc25a9f731dad3551e020a89224ddc75f226d6518894ee5090bd36f861d83281b43996c4f72e7e3958ec4fee918656698ac48b54063df7886fe7aeb27202cebb95319ae64fb78d7afcb93214fa36547273957831bb6e5bbda76a9f9963c4cf79105630ae3b2f5102acea1b2fca5f4bc204be2f2f2bb69ebf8f8460bbfc2be928c2d8710508ea60af049ea799d9ad707c8385bfbd6febf2f01beac3541057281e1b93a7d9f9815f8ef9d69cdfabfb1d98e25647b96285224c7f87f4bec3d9cfe0bf9df4a1f5cb68eee025a33c9aa47122c13feddd64878594714c90dcd31681d3708490a972aa76301a7a70ac3b3a574a1f0e10fc21c84136ad20829d4aeec6c18df2b1cc4c43a6af9b47e75f83b3dfe52e4a00dabbe7fb19b3a3d1413d0ede35e7c28e742b3a6d15fb8caa1f1dc9e55ed77112cde42be0a06d69656e9c8c809984363c9591dd1ab17df36839ff4f2eeb1d9eb71fda5d37b26172235bf6da999c679f5b9c767ea9f44feb5e8beec31f0418d558a2ed4cda101b1a8f5a0fb8c921a884d39fefe9d4023d53493a65fdee5eee1a510473799d77be69ee93b88dff86fcf60a00c9c0d302d27165c7f9df0893f7f8979c7ffc8896bda8b4b0155d779b644effda17e97f04bc0c06e9d338e7b323770d65a43cb0dfb2b886620bdbff626864bdfdf17d42f27ed00a961de6991a905553772807c0075548cc6f18b6a50fb18109cdac9cb2c423e67beaed9c9f758f4a0c913303f8e6c7f017960e9a63953fe24a0e2c0b82b42dcce8fa363abf83cd9acda35fc29059b30dfe8cfb1a48cb5d5dc49800820b34a72ccf98755425e96817202c1e1905b51ec46b2d8681c4a9dfb1040bdefc494072496cc4fef44a19cc473cf1a28f5323f384268ce0b26c64012fc23652c9d5e93118e78468d0d856339eb5fc5aed9e1272c19371153fef00403eeb15201000000000000000000000000994e414cd5eee1f6bd512267fd5e8cb8109aadb8c95df7265753335636b6d01f9f936752e8931acd245859744229a4330a15d3dcebd5b26fab062d34a218b3b2c3e942d2cd02f31525bd9e899abc3c217a2c363bf4f97b597bc5a3927089b1760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074d0199da5147f8d11e9b81c9fb08fb39a68b8ca1d8a9853bb36cc55e737478a0eb289116ca99b51564adc73d0bf565c7922961cfea3bd269ee27f7ff8869e154b62a8bb1764d297c38ac5ee2178fcdce6dd3f7005311d934d072398f673da09a555b02f216a9f9c493e2c38bfc93e90ddc908014df394e6e8275f4b2ac1b9db022663edcd9372805922b925d926d877d9fd04c3889a059a79461b9fd642e0a82f0320263d7ecf645b05a93b23936adad4ae4aa11aa83a26e1c5de79f0d776d2779c0a06741ab5e8814d0b31ed5e5e1891d6fe89de0bb6c8ec3f95491db097f2990aee633ca8a1f1ed5a81b615c343039f40afdd9f3530c3fd2c1d5772884e9a68260f021013e00d05f2b792d4e913a3b48524379de461e9ff999c104665d0a0a5ecc5c40206aa04213c93d0107231724e062994f9be360f7f5ea7e0adcf2985d2baf9cb960311b04491cfe13211894fe3473b690b6e6dc84bd31eaf5e8c328c779b1d241c81031168402cd8c046d05eefd2e6f094e54ae67fe7338b416222f3b54c74df196c3e031a4ce02e97e89ad3d24f32f4517ed2595993b1fa11083ffbd3650f7e26ddbb0e03b4a012523ce673fdee550eb85975f999a07e33ca232fc9aabd2e323120d6c213f3d0a07368ee715efb5968f7df62653c7d41bb2bf11dbe5080ff55ed2f981cc85d812be0bc1c0e1aa3510547402a5bdf4a40bad8cf14269d6f1f3b8386e6365dd2d36d74d08349f93d082a433ac50d3711a8ac9cc168604f16bd1c12830c3b4b240cee5ec1ac65b4420850feb6279ebee8fd080d955cc2143fece1c9229ad4edb9cac82fab651347cf76c6887a0fee04fe1b06a62131ce3c594c08ee1946ff508d10c5a653b0e944dd4f56b0e523260132a6399ed03ba9573f8ece6ae2efdb82646f8ec30f25be3ecd995316c287a7cb98473a4e38d722c421c5d3d7b412cd3e90b601a046fe10cb9c850f4c1c6773d6d3fc4517fde5ec8b0ed4c563ad559ccd3c28b01e243285eff83a48d8af9cef55271545f23361caee437914b8eb4b4103d08c30fa20f6ef88b9b77f85b8ed62947609d804bec1ee20ed384e6124023ae378e222d6a1e1897b6541bf22e523f4ef502999de9c4e734b540ccebe577b59a046c8d2b8e733b0294814938dd1bf51a5882f7cd46c910365c152a74ef71f82041dade035d3f9e0d609d1c234ea95ecf1334a370ea344bf4f2cb9c718da84b6fb21cb35eefd5cd39c948d9f18ba4589b26d5d3b8169fbf58443a2d3f8d421d9f33877c0260204c186bbf416022e04dd1f9c0caa69995c405122fdc5ec8d4a4745379fc2112a3fa8311d1245bc294d7d4aa6bf0db7f421497efbaa1bef5895e3f32db71bd976114d44b1cc733e6d59ae67975380fc2c0bf990999bc41d255ff9f18724107fac3138470c79f42197abfe124d3ec9e77429e63850e82fa135ad3c2cdf1328aa8d230086fbbbfa38694343ea034db19600bf6a359c26d673f5248a5246b28247be2809ff93b70266d1b67f5d1d760401b4995a83524acc81099961d3195633a0e1be0783595af401670ad2210628a614e685f72456bfaf22dda268e63fba4dd7406e2cfdec09cb5220448141e7e60c722e54d8db21251b93cdb9d7b9d3db328fe71f56108f2bc7089101762e501b39fa50ab4319b51bb9205ede580355dbe68185fbd02c4ec34f61f6b56af911434a5a11fc8dce1daf2e55629aefe154aca079d1bc0d8ba0b06d43482bd448e38b6edea9ceae081f8b22592fed81a2d0a6dbceab42dcfda08db42acb8e60d127d569441a25604ec50a9d90dece4c0bc702ea72ce4d644a5d4dfbecf24bc2f19110b9093fd66461ef7c5a4f864f5ef8236f5b07b00a32ed0330419043536a755aefa9b0881af12aab87005dfb9624f69b8a2ae92df9bf65f956f71edc636ab831d1f5e9a3b131c3809e06c7b1cfb4ccae1a03210d912e9dba6f97b448b474e59e245891b66b51de8ab2a260858bc94f0e9ed40edc586307e12de553dfb80fb92e9c70cd1e277323c11485e457afe52fcb668d5f9b5b6355369bafd729336d5ce882701d24abe5f87e4af8e886f98428d604468118f02269ef5354794b1898a9b4347e3c7f7c4e920c32b7b05bdb6bafa56e06152f0054df5ad8a281100c9c93e26cde1d25d6ebe40474e138c794621b994276ffe7c8d6fac95ad10773cbb38a93ea17b1c7a01966d19982323c1aa888fe61074d84481b19f5ebc030d39b8fa8db77ac13f02071c29d8aeea035766fdff95d62b0b1e9cf81983224682da9e22c61d3f4e183e5a29fe1abc4213549a22aa47ff2dcbe7ed271fbc0b0f6a9fc810e838537de3e8c04b9b66756686f7809326999de5d9488355ee06e962b6840fff34478924ecd8461cec9e9624929b1d467f0e23ccdcf9808099282f855f197b3c70e", "63005153", 0, 1606342625, 0, "65baefac9efefa0a97ddd6d64d12aac1aef4ee47128aab60c0699e60dc07a051"], - ["821f9c720348655a28d74ee16727a0aa72cbb1cce46a08dfd6681f929073814b7fd9fae9bd0000000000d03a2983714241b757882dd7193100cf05cac79e32cfd81e58ef2eb72ae6df79bd2d31ae000000000763000000536a51ffffffff904f38ac97fe0e7796db6f33d42fae1da1ab2db16d7af671d0e77315dd925e760000000006ac006a516aac9c349b2c01067060000000000007526500516aac536d03c0300200000000000000000bf91e0200000000a2b5e5ee342d4d96e56cc779e90e21ecb0b330115d25febc2da9524760692cf3acf919d65a3fa0f42ca39f6f9861896cfb689483910881d3e6f6df458efc663deb2ac6c0331a5964372c456083907c67fe027dcc15a53c56df17359e28f7bc6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000969e7e218f46a18e33ef54362bd2354b51edf6c6a2976d92121efce3dd0b868f1a7eae8d2739f5bf4225f75d828597aa2f80105b13ad538120af24355b44fad8341c1d1a3eb7b3f2f49f71e5e35993f4686c5f5d20091c622bfb1433c482bbeed3a721ebe4b85752dba379b0efe16686d65e70cc018eb6d0f627ed2d0807d14a032b636de8063b083244d07094dd53f90f2457efa49e40c22d631ba06dff56a3b60210f44dcd43bbab61848e63ade2d2fc54a9146d5fc19c09097a342e1fafe63d8f0a0790442a954a4bce7e7ae2cd977796048c21f66e9c846e18633a416b2b2a280c4ca793f472944b164447da6deb80aba0c1bb34e74b40a60b371da7241bc6c532031f3d9a3aa9a575227acbcf27bf821e61a87bd976ef29786fe517db0a6a1847890203c84cb6b92fe60e29ba196f6014aaa605d486b5690a4e5abb4ac0f2e73c24200318cc609ec8f4b628f310fbf89f5632c33fe419d4c775330ef12435c2a4a27ace03003bb49081cae83f90f4f6ff67d2175a5b2c9e856e3de7a47279e40ebe89ae830218b6e9a156187a2d3807750df397e24397008aa66fd7dee68316101c03d9b5be2dbdd178b4bfd8f79a14863ccc43bf109ef4bf22dfe790c60ae837fb22cca9d118a59989515cd094683b54ef70db091d6d6edf7fe5c5d2c616fddceb91c8f641ee22cb9aa7e238e0870322fcacfbc2cddb4deabd8d02d51a70122cd4f0510c58d37a692670839a41c0eb78af79424d47e57b1dc8630eb50e1dbcc50014de355085c184d01ef40c3b02bcf68b2d307b80e61ea27baa6a068c8db9492a4883a592b44105529848a80b48119b994c339974308bb990440bbc44d51135ba3334123559a3b17f2685fe76e0fcff7b045eafaeedc9e48b945378f917d6b9e3b9ae2f46d122b8db21cf554a7a7fcdf5292d31b212116719e0705ab70ddd1b6a400e4298c9e759671b825fa89204a8628af35d2037c96ffd004ed2a33dfe69aef10d25c3053e699ede1b368186a1b7943c3198a061e548b098c1308fe19fd375a94e77f69d668c17b53ba885db5b8d218ae8ca3fc08fc147fd68e2a9286af0fe8c731e02558a5924003cfd6c76ba0d9451f57c350061044d748e21111ad6c20ee7dc1ad4a10f6e78f33bccfa0a33c5a58a74c66f0f504cb3352f80c694693942b9e2f03cbc3cd21138db215e242780996ed7c56bb1d41eb7a95a1cacdd8e2c93fdecd969dbc085aca9167df9d044496b915660c07482182b185769da2b6e81d0516819a4bbe9d263f071235be7601472dd36809d4bde20e81c93694fdf4f3f0688587dc7cc70a8a1c2e13b1110cff2db1a385ca8c87d6b18523256f88ab446cd082004f8780aa9fe57d187ccf5402db024ae92d6cae2d6308d3a9c4ed6f387089f0e817b8f97c1ea31912e6c3f2776ec4575dceb85105776d8038494ccb00c9de7d0b4669eaeab8cd5f1e5d9db75c8be0cb8a2fe9583ed759259914366781d280149cd08df856e0c7aecb3877d079467525aaae1af73ccd4e978b191569b1e61cd68656082370a42cb319433f4cb245d508cef6f05fc24fc4b3d81b9d8ca09e7c4bb11e8dce00d43730f4ee4f5ea1183144ecf069b5a807b4c500406b690f86b27a65ff9b12f6c9e232ea2ddd34e9db0afa389ff577bef5c7b24d894a07030b9a828f2cfb02f6de67e6d83b729343e5c46c2a9abbe427c206f3509ca29317a3b3acf85883b233f6244364ed474d0b503ea08bee4b548102f9ba9845da843a3d53f59d8d55788cb836e4cca23c0ca5c22e6d58917b747e8fae8e28217cf4ac6ce9ea7ebbb7a1b206837b81a28ae5358f67ff34ab129929dccbc92668beaef2ccf7e3d5702fc2ad9e0959ac117b7ba602131a7ea027fdfebc4dbe76238f85dc97042b93c7fe75db701661308a332d267e247eaab3f6129be94f71988c705d1b0109db27bd0f1e08689da82573aaf55472aba22e8b1eb6f7bc605c0a21a860ac20d814bd04fb8d93d5c6b499e8d558d1c933dc3094d5f891b63f2c47e6d50bd0c9fe650aeb691cf0cf34c18f7b5374f8aa9a3d80cc0e1615eb30aba200b4555b0eb957e6ededfac24920a2b19dfddca0016ab34c3fea985e81dd35a0ee6f226f0d648a23727d0bb5a071369c5b27dee1901f21c5467b87669ea263874ddc4f6b73b3cb20d9e6654aad1134173b360678342d6020724414295557ed4db21c28e819aa6b0046d05b72f417680fa3fb451dc59f3084a69bb7e872cb15f00c43b7cc4587c822e73acc1c89a5a1e3ed6b7b1d5805a9f53653b2d0000000000000000926cf305000000009b370df6736b664f59d7af3ec39829d0c65d7ff96ba1b19cbb6ddd965d859e4186ef667dbd7c92be74064db3f859e8bf68bde94cb3b390786d5fbe0ecfdbe2ae23097b944906b16ccd74f5035c69cb0a60b7ecab0889db3318e21239acb96c8c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d37cbee396f9d2db9d0728b60dd5d59bd0c8d8de76f7ba40c7a78405f852bf4d5ba5b9715e1106949891e90a0d206fc8a14b99cba1d6356343118ae2ccb9a8ca725c51dcd994e14cee75f951f93d0d75f70ebf6c8f2074cbd67ea20a29126687174042415024e6b28c33c786ccc98bec3411fe7021e9e0f59f6de11be503c61022057f903da3ec1e8021efcf3e27cf14d2f56fb0338f21a0379b6fb62e554cc4a021f38c501e85db5a244eb6793f5796836222f808b6e427638db434b8931d6d7be0a034f4846911d4a92e21af5829b88bb00fc2be6e404390579e27624dc5fdce052d54157a5e1253035532d74eb246c612c52954686f239c798d8de76baf248b6e3022c8b4a0023fdfb80d71fccc039b16e57c910623dfa21913258badcd8ad12d9860325804166df34d1d16468b2a59343420ee1158d823eff18743de287af00551d78031f64baf679235d7b50cfd8c5026b483f4015b0f7436c57d33ee4c509b1cccbe902079c001cd73a3b8c26fd838379e72545c16f7042cafb509a8f70bc1dea90dfe0020fdc8338146a6e63a2ce53b2493de8ae94bff1845db8c4e16e1fe5b5621958db8186405442cc166279670caefbd10219f5e5e26e2da1421b1f92b212ef975dbdcd4b9b7277b283c4ecada11a42f2d272e63785d4c3e87449c5dc506016648b0ad45db3748dc4a2b4fad9fe91e1ac2af7eb45bdabdec897231ffa70e40c21ed6529c5e152b08db2c64a258e7d4c1755af828aae079eb45c937eedabc1c395ff5b1fb0cdcd70a7350c4be555f22914b85934c8f5469dba124ef95afc54a00c5b5d336c48625f903166bfaf2808dfc6593dd13805a6106e750264c20fabededed0158a2e199c6196bb349fa0e410fc13abcce78b2ce805d94634b595bd1d768c96eff25de38fec5f6029d7463dc3d10e8973fe25b0a5a5c66c444ec77ced0139a17739dbfdbbae8eaefa9d18ae25acc981d18047193c57d1c7be472080a4984677ac7d315ef01a6e6fa978f51e96bb6a8fe88721dfad15e3e06e853e66e2367fb4f9da182ab01219cdbf304e8a68eb22030c0dece684b64e177224ea2d7364a4f9abe022308d2d199b8a23c1631abc3c1c584afc7fea09feb533669dd883f9d382d5a6132745b16de40cfde49cd7ee75df790e4f958232f4b0f972bee4cf9b563ee03c8342e6422b2b454cd4d81b4ecc12601143dcfe6f4b047a84bcd9422d42e4cd1f0f0e1541d19e200aecb62df514a41bae9fb09bfddecfc971d1dfd582ce7f93084734bf90209e7ae4fdd40280a98187534775dc3192ce331270cdc515883ac77c91564fd41b0c37d7012267b5828602c908e2686096b68af742bc38783c4e58df9074ce26a5f0b605c9a277048f57cc4caf893904f18bb8785085c4869028354e4652ccead15d07f20d8514fbffdd0cf45a5f0caaf03c2fd67ba4a65cebb7869e190a487653b79f13816386e6d018966ee3c101b39bf4b61ee1ee4bf3579a8faf5fe3abc7390473097d7c3588f353d1ae129ca2731b9bf7e45656734d9efd1f52b4aac8268e6d9019ef5d015057c259260b868a9d15caab788da2e18e520e11f58276d94a91358a61b1ca17b26872b007a0d8ab573a548c2dfeb5ede6dd99240ee0bf1fc3e0a8bb10b6c45f85c0c6ee300b3e2392e777c3a24100a905a67ddc73ab8d0b26bbfd9546de762af3108fc570731b1b30c1311aba9e034cca23355e9a7a979391893dd449acfde4621f28ce5ac2e2fa13571811555ab8199526151030a110376f85aed40bdbe6e2f6bed264eb310599adba09c31fe1f0c1ab1cf885e02c20be665ef0e7debbf4b9ce797a654cef8bf663c0ecbed5e6e0300ceaa6da1afdfe916794d0e676b3baf289e5d8e549ff988454f5be6b715b245ee47629270f14750daa3add434d5c92f20004cab4925075c221961070a62cf7c174ceddb381904216c9ec66551652ff5e872d043eca3be70e9d1a3d2b76c86661e3b73884dd9d8c2cee94b88781a7b49fc3845a8d6981009321444c437dff6cadfc70cb398d625ac1dd40e8a1ab1841c3ec1a85e5f7c19036a23533f0d411b40fafbb6bb9e2d45d0e2d933b5f98cdf55507c596dfb0fe93341bf345f238aba50692804a205b65d190b7c720ac1879162a8926555675327cd461ab8e486981f8139c6b2545538dd2e2fa8af31c5ba0de61f31240fcfdd3dcdc6ab352f1c1d752fb453cc3a61434a6b90d1e8de11b0373f6c07421a1ae949108f80063450b011b26f6becc13f00c45939c0a2047c40245245c21c1281a93ea4a3ff226ef6eaa4eab0b5da33c5b98787fadaf24f736c794b42e7f307f35ebbc8630ac11a04b2e557bfe59492484084bb32caea1b5be69cf79c539151805c95c69e722a3d39f0196b2457e1ceffe9d38647e79984b49b76c589e8e6c59b0d", "5300515100ac536aac", 1, -1559847601, 0, "9aca5e4a5ecdcbe64f97b8415e53c7dfe9fbb12ddb65dcb675a94752eb6ea012"], - ["030000807082c403041d7d510c65b35d1cbf0c8dab0814372eb910e69e85fa1e2c85d88809ca4c05ba0000000005006a52526369c213369e9193fef2af93b93127760f1d921c34354d583c29b0c50f1fc61ca292f877e4020000000151ffffffffcd54818b6df13a95b091b204e5b1e137b6f0144bfc89a0452e58eb29d430d8a70300000003ac51ac93b1175e2b89eca6c78b9a86213d08003820f17d0137247f6a84e04b912646bdaae955fc01000000046aac5352ffffffff016d77c80100000000000b8749d0a4cf91e2030800e9000000000000000000000000009dbde7a78b802793562d409de6743ea7851a0262bae6ea134906d510081bc5307ddac288c666e3b093385b7c2b5e09ad3ac912445e0ad5d6eeaad373c0e9438644f0d9eaa498bed2ed1cd7cd43267feeb5c5017cfd6094d984a39012ce353235000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006fac58268b4fd53ffd01a2166844a176da4c0d8f7aa8729de16777020d1cb277f586ddaf7eff58a8d236fe047c9832f1782c51d035cc42be3b4b5e6fad4f982577e1ce7457ed8ea3804022dcf0b863cb734ca5e37490ac5b50b3e9211a4b137765d164a82d7719884a2ba5330ad08ebbff81fa70d5cf3b67db81eb3a06530d810324a8acfd2ad65236e548b19e1ac92ec4ae125d460b11fdc3e1b382a3edfd91f502139b01cc3e94bd95279f2be8d6a901de8bc57925255d6f23cd3f5ed40d55f4fe0b0778bf2410d62a940601f2c08e6b327ad86bb0d5cd66d497db3fb2689de1e5956b651898213400f8115302f479bd28e9f10565f4dd177e3eb61d4fccc3caa154031cc1bfe611763abb170244dc0ab664022e187ffdbda95183196fb86110dc5a2f0210b4b20d43bcbd0a6fea71dc9d03355c55cb822220ceacedca5e8bc28f44bd3d03032d07da8ba6724507fb64338d054844fc8ded9d3040bd791a2281dae99076a1020a9d38b2fc9d862caf41649dff3158b5c51f014d11eb1c99e3e575e9ca4660af0320775f890c967e6cb6d20ab2ea6eee0e453dcb8d3b0f780d7c70d6cc766a07d565b63433e6d59a89bfe39ff4665c059cab1660d7bde077b96bc0851d291c16eb45d17e4b0da2476f4016174290674b50d082acadbc0760f2c06241cc1841b987987ac2bbb913655e556b06bc31f82bd35fe320cbed8bcf2f0dfbafde788a308710bef9482174b84e2b219b5f168bd173b2c62f440a8c06dae484c3a3e6d8391b1bcce6f4cc41d26d221ad31d26902ac6533ad653d0e701624c5eeaa7b48ea7f0e2f1639a1eb127dd477d46cef8274e7d6d7326285f7ddd755eddb1ec83a9a7aa37145ad92b95ca5aa8492a3848230348f5e19ad6e1ec5420b4d02437a068e6d6a90a6ba2e8b238faca7fda989b8ce2621d8e3e4082130fe6be49e7614d0da9b63b297d4288fc70be37b0d2183d0da7a49f8df21a0500becdc063a54bbc971dbd75801590d7085beb6f98d51a5670571542667d89e53354d7eb8f73e03d018263a58ffa082100a87739e2b4c87a564dbcee48f9f8fd6afbb54e9ca3bc2235c6102fa98e84c7a53f7c7b42416265d3e962d455fd75a5fe9525d9853cdc0125c007b66e8f00514f00b6183747c2a92bddf27a34ebd114c28b8ebf2bc3f2c93411e8b702e6e183fec4d1b145fbcba66dc1f9723c3e9f5f04efa2063fc77f4cd0e590830865e9a456c5ceb2a1659cc816340525c8306a35b099287bd5ef9ce3bb19ce913c19f9dda58ebc345e8ceacfdd80ef173dd88c7817321f879ad076fce824ce37038027e692909dcd9447c2d71972c4b92e4fec662b451dc84d48643f22ca6247a630e1b145ada22c9eb4fb626f8a0d5176da8b036a94ef090299c7cef332acb14630b981852f1eb063b2a7981502d41445a38b57b211760ad901c7070c029d4084ed226ccccb22c072df21980810d5f528c82961beb83c714b38f2cd2d7301e543b190db93756764fd0492a815e52441ce5610aeac6716f224d518ec9910fff843b1ecacfd10f5930b0d2d537c0d3f8c15b17991ec5c44df08dc6ce12131c33a62ba201cd9df1a5241521605895f162622675b6ba7dd564f131cfc414f60d3e719e4ef7e6bf593d0c7057d05966b84269777399a07ca91a23af142015d8809082cf80cbafaf6f906e30f9c3fb97ba9021b500d00e8b45caeadbd5814566292133b2c3a79f57bad17ac642a225f35416eab2f350cfcddbb3a92b70a8b32af1f8f57122b9dd2da9fee503560ba2a71a8ef73ce943a96e94da1aa700c067fd8e702b2508c0f23aa548459e55ea571eae671d0afd6c3251a54322613c88ddba9218245cfd6dc08da6f2885e1ed0fe3bb58ac147e29ca714e9edddfc5d25fb53860b47465a5583a0638fd13cd26d4e17d5d385a6e480ae4cc474703e73f4c9ce70ffdfc3b78cda74fa40042cfd84cd232209236569f37b65f838f3638810bd2a63f60eb7bf4457d3a5c83dc0e5fdfb7d142de3c7dfd1f114ecd3d4583db2cd38ad833e22abbbeb1e3c68aa95e2dbbb944105fd69265e46f75164d11b9563fff0ca0031ceab0cede2a107ee4f4112e36ba6e09dda7e708a9c943eed146ede391e521ae5f5f2ed4791b4ca9f94a1869a20f89b6fc26c0ea79ebe9d585c3285a6ff09e0a1ae3630a0bb555295b43f8d0da6e64bca25771341d313b9ecaf72702663ee6a41280b442fa67d427d5894bb96e276029548ee2cb73524cf8a564132fe14606e1a0f62c941a18e49d3f6add5068e3ab4c4f0000000000000000d0b42004000000001560effed12d079b8602bbefe452df493f793de7b6d941e5ba02e8db8e4e54217eac398339f601e53cf5a8b435fe913bb3828d8b96195cebaeaeaa047941432db22a837f0a0c144f8bc1b3b2044a6560e84d7d941d3a6c19643caf66d622f2e200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000624b2b1f94a4c030751f922c4ff8cd7571dabb79f1be2378f878c0a4b7c0557db4ad5393f9a424642611a55e8fb3cdd785071a2f86dd2b04e0d74cb2aba8fa8c203657cc75e59bc96d6b8889323dcf6ade1e85bca4bb28a60f0a50cc35e0098152dc27f2a19ba1f49b70ba0a8029dcaf01b55aa7bf3cbf988b3fd09f48829ac9022615fbdb8bd01be631835df9c9499ac4c67b01d686bf7ea10466effd81285ba9022d262a48facb3f7845338062dfd85e064abee4fa41d2f481658a8735d28dd5cf0a002d14e2b5373b4b8174590fdbb0390dabf857ead60acecc3cdc426bebe4749b9794c56e53693ea9c7df82b0cecc418b59223ab6509379cf1a09b512889dc85102190d32c8e480380dbd8dd5680d745c546b2d9c6b964ab7efe78db25a08396c3a020e0988f71dc1fe477aba18f04be8da0733fe944c17f57776ae320efc36b2b3d803248f8c6885122d71b29a726d471fe81cf73f826006d9a392aced198d153f4e2a02081c473987ee851e9badea91a0e73b82ad3f4d7f82b503526c5d72f2e24b5822030dd3f126e8678b4497224f2c8a23ec36a78665a4141acae167e1e78a37bdaa8b65aa4f2dfbfb8d1d8dabc68ce0fff265f3e83844422c07d3cc904e4057ac5efd3d108af5cf5736f5c553e8bc6dd40c2890237abcdf02063746d9f957dc465cb980e36341f0ba1e91fde7a6ccf2d1855723fe76494504ab016c98b8012d0ad54e5e5546bdcbb111ba7a8dd9c70b3b028068847a10a2e90aedcff309dc872e14448ddba2f5e3453bd231d966068a6c11e32c2a313354b7f9e957ac704c957529112dca418051be44f8158624e5aff9cb2ff88f0bf4e474445adb48054bc3477554aa17904c285a2acc486d7746d6b6c211c7592434c41b84cfcea8dbf1aa814b8fb37dcdf6012319826daf09f66735b5834f5ae898d92c6f866fc734ccb01983e86932d619234ce1b7071f7441d541d30997997dc96121c6aa31a5d437e0bb2ca8ddb6c00c155401b075a26f556cc5d9d30fdc7faef12ee5171c15402b3f9d1f6a8e4176bdada0488570a525931301cd197b7cc77ac2678871f78e4e8e07b11eacddc8804fd1f482d3c331624e6493b133ff292920fdd389d60a36f35ac065d6a29d95d859e94529a706cb65123b154e5520d22852dc10e1c7d7edfa7e8c44a24fbe73020b8e8cd4c18f8f338a62d28a7064fbc7fc4ecbacf8a6409d97e551dbc2c012a387e53fad7808f2324fda19dbfe67bf28af805667f632622c9995e6a879f79434cf7d08fbd1b26e52b1acfa8978e39f1dca3b8906a76f172746613fccf6019ff12e27a27a344ba4623e236e4394c26b3f7a25799278210950fae38758e7e575e88fd2df247d3d8846594aea08427c9caec44e5cd4bf1ecdc8d90ce0baca5e2a5cf9c5e9b45512b09ae9fea4255232143ac4e035cf2b48b8e52d305b8add60c18cf8718c34de7310967e7c0c1d9c9cdf13ccd084c4bc0a8b3ce755130781488e2285e321fee18c57beb180824b1c8eddbc277d2bbeafa9a221c9b4015af1a1d668f93db5fb4a9bdcc5cd9412c2957864f65a50716de1db92d5dc7914a3d11082e76a723c6e38b134e2722c2e26620b52ff9b05d1f310ea7aa06c40bd2112136c2ae9cb80dd102c466b33c73fc7d658b636dea7bd81e0fa6dbfb1185e4268686297971ebe8ebc1df6b2c16c4a5e36cfdfdcce857cec5760fe1f2fe004934b82d7e1d69a6cb1f5e311345e231b7c182e3bc1311e3e378546c822a36e5d8724044404420c607a3dca972ce830ddfd07fe70e046f5e8c6908b8a07a7cba4fc87e7a01679d890605c2b3f6a6f86b16b756088bbb9e6fcf942fdf5f5782257025588383e92d7d305c616a3af9fb257342c0c44eb238abbcd7aa9c55e6c2bb4d97524041a1c2d094801b24a44851d34ec0f1b136726d2106c8247d5759b33eb3773a0b7db0f6de878ff8b5876dccdc640fe500496e4032084556f324ea59d5afc97ec857d31d4a47a702f508628f974951824d6fa35a388d544f6df2c660cb46a487e616af13395b2ea3a7c5ce646a5586d2a4825c524742b1d9bbfc93fdaf48db0badcc909a770da086cc2e321eb2dd0c9dd4b7a15d9cfe7e46eb967b8050441f1803a8be73ef92992f8f01d6b5d9d5ab8d714b375d56116061c79a4df09064c5c697962f097448ef494935bc4cdf52011202fb72a9ab2838240c0080ad4a9f4ad76b40e387b40ca8c38c3b3b373d6c59c66e0bb17ea2ec6f5df6d09e692bd36fb0a62e4fb909a9ac05d9d3199f4141b529b6b94d43203000000000000000000000000c0838a623a013949692e2b690cb11c0d76a3a905a9d146869a839c030cb59e75e48cebed7638386c3b9bc09bb701d4c8cfcbf6fa0cd6395c4ecca6b4c2684a456ecaac5e82f32f68866c0063216d3dc42071ca76c47d863b0ea7438b464bbe0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003460dcb91988041a824fca59d5eec5f727564560d8dedfb2d02a2b7240c95cdb487d9fc301fa38dacb2a4f0e5791c2dbba0c87df6fadf88b3e5b4d4e3b7f821c6ae577d941b35bf905c7c6f78661119da5cb11c681bc3e76190890b0d7f65005f72cefaf9b6a82e922bbd2a10361fbbc41e090113642c2437b68a8774f037bd90300b3891dd9412ec9ca4ef0c3b21b5442925d8a6b964e115e78ae3af3f23ae274030ff1738eda6da08b6f953b027b2548fbc98d81bdc3af3a5611c8ee930da915670b05af0cb408b251f2ef21e0f9778760376624b9d4cd90a32c712a9c1484c3524fd96354f554b95bdf2e08b670785ae4e2a95db1b80ade010667f03d6234606c4f022d108a82132d28445e44e9363d6202118fd32cd038cf2cf4c487518ea4d1a37b03247ed48978d99134fbded47139c5e2de00d70e2e6933f0100e19a341588de5320203e59d609984f4ee618b2248889199bfe8fac3445e46ebc074367b4a36de618b0322d99b16e99a4900dc6f6119a8df95e3b9df01836ab65339f202d9ef1a1bc8f0030d0a2f05cd9894a0fe6405ad613586a90ab38e753c0d5c1956862930c3b2b4ae58ece64163c1420c39b8d815b4282603c35fe93b7060e3efdc9d189a0398f49be6f23a890603fddd9652245f5e7715a39e54909dbe61f0b8b7c21cc5bd293bafbb9e4e41410435c5966440d88b404dd80f3e115b7dfd4a22fcf26c26a8bad73b3c78c7bbf4a27b17fec291ddb3b83ace00fab54af3652471a2fc1357d6a0c698ee17e7201e13340384f84b74c493d099eabf25c65041fe57fa93000d9069432864d278f6c9d88060326790f5aaeb4ec5eac2442ead1810068f70ce5a1c1419fbea75c65466297ed12b45c838a184abcb4fc4a5371856552b6cd0a513659ed489dbadf14cd85d7818413d52b517c3615f581faa763dadb1745fd1b64d8cf628099315edb7543088126d7a3a4eea6f2880d56cb613be4362ca03d09e64fe5e378e41fb2e8ef86a594550c48ed94a28082e2522730718c8596bd22ea30fca5a0e9bb1d4634536f479a339608c9f307cfa62df64728ac931b3f0d208f543fc62edd6fc12eca151b2be6e1f9c2e188cad6579d386ffd38cf857369da7a5e58f01147cc6edd7954e641e8a9501116da246bdf8e624725e8b85f9e27b08f0b52712b5535ba898ecdfb35b7bd79068fd810c8b9a86611fd63f659e99f3463ec63abcef74fe069b37e3e0968d2f94098e63be231ada51e9c66430071cddc911dd21db2aa14b81d347034c9c59257d138fc3b1ce0c5056a852ccef64d77cdf9a82d4a46dada0761d41a1b9669baec4766f64b72656cac4443851aa8823b56179e61afaeb06887ff94da8eee8b40fec1bc86b6e2ae526e263d215309cc97f72934fbf48b91025a82bb63c97b83d886199884a0a68fb62923acb2d54eb0c78fd9880cd40614c086d4ace795878b787dd6325cee1a82a3dc3bce843b1f5b05d293889f1387e75b3e2e5ffe6bb34872fa80ded59e1c5e55104d18aacf212daee95fb9a254939fb53970ae82c9da5e7943b47c0aed9308e173e0caa194f0811ebb6b0f46c614b52fe86c542018518970478e97296d37e68769beff3a23b583fd54ec57ef04afcff4e6221effa86c993f7924224038a00610dcc2cb387053e3426e5285979929d968328effba6c3446986fcc0d114754ec8fb098bde8c63e3fd51b1078256be16d364dff34a449e8c9e850b8090f7c6f3e02a554236451b08f81128cdbc65cf3cce3161cba72ad859adc64ec94913b8071db44466183b889cc7b7b19390c3198dca1b585ec91fe3f9bdbab0814035ec8ec79b016344465d717c4f5136f52136ab1bcda426731c086a712af9b3b67252f9a1be4761177e4daa06170e2b310af6cd59c49e4ebd652b9d6857e34cb8e979699f99820097180e59ba24c8f0ac476b720784f7107271c86bccc65f58adc1c0c4ca3cde15e10275c9a23e280d4eac915cdb171fdcc8e0feb771096256456381c9688a7840810bac6d0fda2c4acab50c8df2bd9d320059f30b9c7ea1715de8fe269a5ff9d112b66b5bf85eb69c285a3b81556ef89ac36501c6aa66b93a64c4f6abc6273e59365327f22c835ff50133b8045d5c66e1a5bcb5d357d6648dccf78e9968958a364b2e3c7507744f5a1f649c9c3ad1b1c470a8692f89f7cbfc1f33f6d466098639b307964ad68ae50d69c5fbaec63c036e76662d0e4abcbe048f07e2f2d86c4d81e58ff78d40e65d96cc1e2662cbd23fc0a51c5c292bec3a357331eeec7250d542500b66d36e4e9001b0c3248eb14c1f97cfa3178b89fc4cf21aab8aeb7cf4069d17e1b30fe48e8941ce7a7d8c3c992c710a5b0099314f6688e259a9989f9702a03d76de22b83e79a7b2a67c46bb339e7316d3d8619243d615b38e1492302c03", "51", 3, 1270122587, 1537743641, "3b9fb1c119fddc641607dda436438674d9d6ed54524578af3c4ddd27ba1eb751"], - ["030000807082c40303b82475e953e966a940447dc7725c78953ebbf0d7e7003839fde3cb64ee5c857c0300000008515353515263526aba28634291543f9856d8f46cde99c9eb5ef9c8b247df64d78149eb4ac29ae13d2a438f730000000007ac006a53535151ffffffffb0402ff681c59c085ce7ef5de0fdfdc2019bfefbe1896b1252bdca2d00aab98402000000050065ac655148b3b4ea02a89d300400000000025163dfa1d00400000000076565516a656aac000000000000000001000000000000000014a0ea010000000063a3887299b7b52309569fb6b019752509d5d594fa00c5f5010acfa92bf447877b8a0ad2fac00239df45d0e991a73e62e0e074d50e37e0e1e33112ff7266a36fff6f5f4df8789a3750a2cc991ecace7c8b22f1c29ea8ee033e278d2fe8bd6af70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086913bb7b43cf695439a5619d1d5d7fc37f4f33a24a094da866d617b5fafcbdc2ae7fba677f98472239a53e59a19b9c224af2f4c2cb07863ed15722b72d94e07e40fa86f3a4e8fac655821e5fc60dec787cf89703c3be845d132cec2e776cf183d04bf27be3ac491da2e520fdb993498bc832b3e3528828111719e9870d61d69022e88e126031fb72e9342e689ed931ab721e28835b9943e8e53e23294a6535ce6030b1858636d280f650bfb1b94fe31a6e0a449c6bd1ab1b92257b2023336c8d95d0a053b8f5115c74c124b0b0368729ccdae77ab78de458a935d2b2b44f717685e108e48817d0f839657c9e8adab4f3e03541d13c2d9451acf16e4cb1c9ee2f01d31033020198991d5bdb64621e7e67f7cb57d5c4ee162501d98b29455600d002834d5030bbeea668c87d177cb11462890143eefc3745dbeabf1880b15f1495b9867239f022efd380136fd81c433ad3a2b78b9e683771a509730e5e668e3c8391da52d776002124d4dece4cfa3b829c9d33cb6877ec5ee8ca7c47ffd8503fb175e82ee73bee5020d189315b9f510ce7ff05a16f10aed5070a97993495569aa8fc4f4b74bdd9ba43e8b646809b6bd004d2ae1b9afd63248f4ca316c2df6776d6b0e2b0bad075e1ad288ff118ab211280fddd667ffa7ff5da9f2e1e3ca7d32aad519a9c519802f1c74986d6d49f9b12326b426b0fc847ac5f794b2c08cf4cafff211d5f5f2bfb9338feac78a40f21d07b513e093602f536ae67a0eda856bb215e7217aaa06d6bb8858d93bb37b376b24699e5fe24da669fd709ccb9b3eeb376b14f948964b523f9772b0970edb9eb8c46f1246fa9f9b88709a914ca5ae268a12dc8cbb9e20cdc3715e0a0acf594597cf4f0d702ccf286f5fe9d32626646e996cfbf7f1576d62fb38423fdb00a029bd06fd38523801b01e00fea1d51b45914256b0bf47aab6561111a610656cbb7275e4495eff56eae6ec192d9ed029f9ac8b8ada6709353ee3ab6cc5c03d88bad8bf15c08715df0a614fd5a2bfe27a9392f2816ce977951dedf8897f59a1ad1a26831d627619aa033169129bbeac4e57d63ef9aca6ac9423f295ee48dd6471bdedc2f2eb56d56e9053186e33c5485b63ae01850bfcf4007a66dfaceb18d814902e815c5e0ac6d37fd68cc37386cf57bdc2da9bb37b731f08459be2db355c690a7f08828fcb0e7f9f18e6b2998001baf2ee91d625e2ff6856e7d2cfbdd431b14f2527e80a326befae1536cb9740db47501e1243a0d48bc44c4c1eda0918b90b4c6afbaababb8860a14fad383d5d8d49fd46f632fb5e320ec846b9fa514d416bf959577c6641e4f480f0b00a87e6bc89543941f30dea272b4e43b67ae9157d7eb7fe576830f7ec0f0e8402ae5b0a9ff7b23c36832bdbfdf8f42b62963efb8356846a65feb532c10e70d155903be27fa01f5180beb8fa9266afd612920b8c6ef99dba4df79a374c8bec0c7ec253d635d5a1f79b7eba1f494e644c2bdadd12df17de3360899dbe38ad0d951a310cf46be360551f461b2bf7b4b817b12ba556a6ed5ed7c9177bfd7061ecfdda599b9ab570cc7bb79224e7cb61bb193366fe61470e2df4642d55cc3468305d1ebe0687ac6313037619322330e4d82214f7f693bc8a3abd9149cb61e72fd6bb3342ba2ba2fdca047597b56cb91daa9d713da5ecb915bf38d195421805549d10c2ba026d0f79d31e73082720a5c9006ac47aea8a58856405ee9873fb7048e92712f7603150330ef3cd080ee4e771beacefe9c8e8ff189fc4787e8c46c73e745b4278b6cba6b6ef41c15be0c9850994dd5b692250ae70432085563e23d58e4b848e3ff191687d1d433e38b6cefd737fe05c94c03220467a59d5a41bd0df94837b8c7ded724e79d2fdc40808b1b7b894b82bc29b29f51607234edcda50c1b3d1fde3e2a808373941e808f88e2b2feab2584f90ec34e17089f9562ced23c66ca1cadaffcf35b8969e04e46496b3da5317a4644d59db1d5b09380ed4a5a2fe6d06930027b37080d1597c0fb1010f83345f5de990ec2a4d81f2197ed994d874277d31c07f5ebf99abd47f11021812204953bc7271d5e1267d6781d4c32df9c18392c6b939bfc51688517a13b29e816ab6f7f800122f1f0f9a469f967d4a8c39a3d369c4ae69b73a1506db2db1e37eaedd75b63cb3c96c18907af44829f813ea2daa44f844a31a1850e7138b6417b01b667b010500120cd24b0b0c9c2555f67a20ec0f39fd0e18f42a113ba38f1fc1e03931c9f93ef5a0ac9616f3bce1b2f0c73d8d33e2a81a470bcd8ed82f2978769996e38576d98e3fa65a6cfee78a5658142bb66891570c4ecc6e37407caa928a9432ec8568140f6fcc859645b0a22d803f946af26d406dcd2f07418bc45dc7c1c2a37c60fb884b5b4973ef10a8c7e9648725341c982fce0c", "ac", 0, -1832328715, 0, "0972f3ef27d2faef2e7d445927840cfbb89375c605b767d4608b8d10fac9802c"], - ["030000807082c4030154a806449b43990e2fac3409995ae8770cce951ed863b1d6b103cf282ec50c1e03000000066a006365000059f07d9f01bea64e010000000006636300536365fb7641b30000000000", "ac516353", 0, -1549071453, 0, "33a3704273d5c0b77c25f749a21b1db2b7f1d9b2224fb2fe245f93016f298d0c"], - ["030000807082c40303271455267033e27f6532fa22ea25b0ee93d1dcc9f304141fa690e0c7cc8fa82b0200000008ac516a51ac65536544828eb70f81eeb1e03509893ac190c918ae59c5e7f801f2fd9209707debae23f974986803000000046a6351ac258324e782a5c1ddbf9824970cf605f99c6635084be1af85b43a2dd7ae24c53bef81eec2030000000951530051656553005227922239023d8a5c000000000000612ef403000000000153307cb7b200000000038ae23c0400000000000000000000000069eefe043792ce526e59f2d42330dd91815c49d21f5d9cf07bda51d5f31e8bcea3a9f6c6c1a3cc725cde4d0030f4715ab46ef107bb49b69e48431546e7b3cb65be613c90d3ed4ef59c32cd5c339ccc9f808a39371cf37fe9c8cd81486fe2a67f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b54fd84ce45acd5d8926233356bf4a40f3eb4a2e8c121ef232ab45e41e533a78d8de6c1cd2edf583a883217a722794f4383be41253b2e8766119268c09a63ff39fae3ffb710bac5b7f3b21668a88f203fd9fe1706ab0308322c8f42df16da49b1165c107e22adbd615268c1980c6e28df07dd4ec192fcdc7c28ab1542af6431002302309408616534aab797fdbc87ddedc3152760c8dd6f69218f7ad831e5b47550326ad5011179ba0d9efd35c7d8eec4eb661c359694956c75eddf634337603d4820b02bfe0590ced4b7acf61fc20c84e9ce59c645ec0a8ebad0be3592b0997326c30a855073fd34a5ddbca87fb80074274b0493c67f3783eb61add1de905f4ab6e070315a2c52c1bc0fca51a3f8c30e24a845c545e967cc193e0fce1fadb392bc099390325354832d028aa48f9b3e496ce1b4e353eabb1f50cd79a15b659afbc76812c6f021d61ddcb7f89b10d728fefb15d74746f40c2406ec851d713851f49f0e4534b9b0224710a29e902b2fc833cb5ced399c5d0e9afbb8bd9f19f9961f481364f1b144503255d16a5b52b16cb8b03d1457f35ed1b8624c564f7d6369145e02df219ded556b143dd02d14f1a72333f6cbe16c348276795eb094f1898818caba7bc7d2407131c197d9baf1986b921193cc8d823408cbe1b1be584e53ddaed04d37ddeedc893f07d73fab15eff1d1bb469840524100131584c1107281aa791da4759e0041e88d77488dab5a8a85d96ecce0efe632cb4868cd286ce12309a5077deac83ff397c3376b3d67d662b57fa1d47671a01a6b13dbd07f2a275c0fe01b528a61b0ccf9a3399eb2dbbcc5b27bbf20e071026d8f1305f47753357cf62a5d676a986fafd8f8d8e3fbfa102eb25a06d10156b3a4a75d9409a4e7cbf8a00501f622412fce8912b6da17ddf7ae4563dc6b08cb84bf988bc973f534eea6de4da6bb0bcd22b115406aa139fcc8396cc82141f7b8a8ad4f8689e8fbae75be9d010eb976d998536fab6898d5aabd52c6e5d620bafed6c43ac302c2269b1115305a87bdd4dfd10457f5aefefe120c0aa35cac2efd9f25fc7418c6e7032d492ac6584c5c8a61048197845c10ad6249f3b2ed73fb1ef7132a7c359e008a8d8f7034a5bd10d73468c4ff187acf1569acb3a5f97209eeccfa236cdaffa462b61b928a61e7e8275f26b255b7f7c6764b8693a911743ae390d0201fa4be4c5033a71a2882d50a318b35204d6a25d3b3e59f9cdc601a2a48369fd68a35a8677aec7028ebde9d4fab3e3154e1c678a78c87a5c9c0f6d03284f7f03d92c16219769b70c02deae4d3fddc46eddc94631f550b775f904949344a70bbec294feb424db15860a68423b8e3e2af7fd38d3cb3d3e36658157cdfd2ce5f1eafb0b20a9f502dd16566c26940d8588343a1a9517fae83b4a25bb9ab8b5787b17a878f2e2014b5698271e102588880e753b02011ca745ec992cb4ccae19295afd3358f83d910651af8946f16e5d0b45557db0a0ac5e714e72b77708fc3988a674b971eb69d4c0178c30c28118a98615fcb6d9b2671eaf3bb78436b358cf78d169f56e99df3ad6100576511146b4123a271bf04b112d101ab7991690f98059e6a20b61ed802d7f188cdc2180f55fdb4ae734764fb03466cccaf1067d9ed966581d5608baa6dfdeebc9316cd144a45d5454808e20e077c17f92069b5f11c86517a13beac688ee6858cb9114024a5826b0371a11f17eb6d3f9e8956e8361af3ddc935fdbc26f571bc6f3f2502c40f94ccf97f3b5dccd3ee0395a23c58ed45c3c88c0e693b00ef13f37b49b7f209e1a537137c3d87e79599a23d999665aa86be7cda4ef7ea9de6c4cf491f25cd95fcac50c5982402c92ae99933d3bb2ef3b23a8371013bd4e300694515fc4ab5ddb59e0048bed4a790dbac3b5a01e9d271a345546e7db46173248deac72aa27cc93e20ff04642ad00205168ec390443398a351f8ffb521392d4f0e3725623d42a157c4f323f4d3ff3c841fe0d6acbdf4c56aacd9774a21c42a535f391256646875bea67f8fb2202a79df72a33391b5e1b87e3fcf20eac718a24af7af4df16be94959fd27d0a7e19de82995acd1e367d72d9152bdeaacf5e9ecc94cffd171ca2bf79c57124b5ee75e3a130a4e9747d04ae8b46767937a45f1d17299d02e1d08107aedb04d14a93b6faa816e6a66fc7f77572b975f966a4c9d8424288933e9f33b45deb406e1569d6cb0046de59b52178334b82ff37ba9286472b842152246ad2bdba247a3728c44c767fe140ad2dd3b2f36d342aa907761f41a70000000000000000560eff0300000000bc9e1fb830c286485e6f0da37cd9a879453d507712d969da0cd9f58a3205d05378a0c049a201cbe44cc51a793fba900709aa8912d1e70fe31d1b0508051e962b50a103507b353a2857f74ce6f250925e2c7f121b64896d31986939bd09364ce8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b835a3d8aabb8dba4b69377229a48eff17632b625a953da032b11f3c14acdfef3991d9c95ff20cfdd122aeecbe3fc77ca5a24bfa6397212ebf96099f9cd48dc44b88a6d443ecf5d103cd937ff02e5d3d0d7f0ed222dc6cc5244599c1bb1c3d77a5843fc78d56d1c2ea09731715eaf9833b5ffdacb6ef88892c9574fb79624870313a17d608ff0279dc2a58b926b715d97c7f50f07443cca17ae32f95c609b52a603093e1e8c401573733110faae0eeece7e5c0f30c9db03555176397a5cd82164db0b068258a1f3b582b2332b560247e29368167aab42f2f6e31ac5e7997f9130b56d4aeb9157e0bdec1a251028878a575324d7dc0abbf2156ec2f9b5578756a5642a032c57f59c9fb012314b6cd8fb09b987bb01c494c1f6852df0b48e0b1278ca4f870317c5a5482c4aebcf58eff19184b13c610fab0adfbf13c73e7a7efc090be5530a0319023cbe1b35f51ac983775e41f5e5c2ccb50873e74f3e67e2c21e8624140b860207148da985d9ebf96858452bbdca77257f6491806014e188a601137fa51637a00200c6fff18dcb7a55efe9ed93bf7ffc820f1dc2834b15f345d5fab51c38c2540f1a9ec760d29a80e593ab8016181c90e157e765613dc6632ca5f0d15cb23631be38606d696683261cb991cf23f343556e31c3f007984935de6230d7abb014a27ceedc13542e0219fafb8c82566d73d30764b880986242d945bf47dfd2e4dbfbd203729ce0cfd48c50383f2e8402cba2ca4d05912330d882172d1ad95c61358f251176783572cc9c04251de43351827e51aeb4156ae4e655889313bf0c06434142834728e6097e3918158154c42194158c0ee9e2b7a5f7d5ccf6bdf6054439dafe7a02a41f407eb18f9e3daa811772a76a6dfbf5c81325fac617334f27df7db017c84c7f534c185d70e0f1ad50ed431f3ab01bdc537cf9b19c09f427365130245347bc6c87f492dd2bd088970f68c85f20a17800afd160bf13e5af4a9070d93574eb80ec104abd5c5879a1a7753fe0c74054641ae2227ce58ef34d40cc3415340bb72fcfec6d4a9dfbee5971845235774265c7166659ac18f90e99430ad60d94131ec43b4789949a434ee92207edbf2c9265dc1435cd312900f7327876dc90f42577e7e6198da19cd88bc4478155fc53968beb773b1702e28e338fa7273748416ef8d34873d9a6d7a0ec03236f1063717306807cad25bfdc0060c31e389f977bd8fac91826f27af94205a9de221270f5651a2eb1ecef5f3c6941865ddae0d81dcd003b0d3830166b438671b96f4bdb88510e9c3ca456ff80e50cae98e25fbe3c05d2f3799a9b5928da4d03b1e63e594f3e20612592d07c727b8de831622e8e5432bef8e9e3068bda2cd1d71f893cdf7002ff7320b25fbcd43bfe68361e86255d045ea556dc6c644ff3fe0ba9e6aed0f722417d5480c93502ed974940c7f0fe9e926b1ca7e58283beb83da24798c94ed83f072b362b89d3c4a284bed5140bfba57cb86fd93e29608832386e4b69f9d628d16abb887bd2dd55d5fa880a9a522d535e5a30ea5fce4c7d9007e04cde037e43074138cbd4ae0b2ff5f3a2363e6c4f9c090ac3dfd38da0f3c49f0c070bcbf63d5fa3de750240271fc6897fc36c10600af45a9ad5a2f8951902c92bb59fc63d79a76ed92ce24dd2bc8f52a8abbdaa9b1d9e0d772b9b8f39857692d9ecbe739ce583491ead7e1b5daf99b30ece0fbdd92f3cf06d028b128bb3fd701ce2e93ace74daba659dc2df497516006ac2a75cc657b4e1f1c7a4ed546f6cebdde96e3e0617435f8ecabfa7db0271e82dba08cb45cc54f959bfac648d10706d1cf65877160b70ba117d44ba8ae0e6ffadd4c07378152abd7bed29817c6eb040f4819cc96e8a515cabb61e34379edc88d8546676d99ef458988f53be5af2f4ba2ee02b19adc9765cd9ea25f5be5da2b1854d2725b3817627e513218a78860573f25b1297e9f3c4e2dad0cfc52cd2bfbfddcd2b088f4dc2655cba9d84e59be82e7c75f27f806e5e79298cbc7bb24b80b7527e50fc4630abc5eb1c617435311a300f6db541cddce53f7b46cf8a6db80b11594a7452ac0ca0d9658b726a39d42858170f60bbf54d27bb7b6944dafe67f2bc2162a7ad8d50a3a4b8644873ad8c9c913ca45458b376dbb02351434ff0cdb5626e78935d5569dae15ede52685a750559753796b3c7d6baa22e613f1ed796e941a61e10acb86db1c2049f12449a2b48ab331dccaf994937cb21dd419b00b171e73d10c1950978d68f2bd6ff6d5b429262be335b63226e5518e4278568050000000000000000000000009ec564065f4970e9f9ed6726a9048e02589fcffaffb68e95570c3cbab4419a2accb197a3762ca41074cb8286d78d9ea3a546a591477ae5ba9b0f8eed8a22368cb6a15141c0a769b841deeb081ebbfaebc5b62b5ee05b096c80201371037c1e9100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f0437bc470e7cb22151ca641fbcf01507a60cec3dace3c40340e5eab698530f6c5b3812e184ca6397973e05c2b2289f7b6caeb9f34cb3d626b8402036c81761938929b98da22b4d0c6a4a1591b630b3c54d6061355b14d40d70d811bd0844b35a586f0f58bdac72cc531e3a037afdbdee6054ae2c9a21c39cdc6460ec9f7d07b031e3cfc17a4405af6d64a0e8295279912d07733bb28d260bdff303fe4cac51d44021b2567e539dd5deec980f9ac0253a4d84f2ce1b646578068dd1289494957570b0a0644dda0c3debebd31ca83cc5bf43cfd25a59b266e0f9ccd68882c1608d4a8851f05c5a43bf56dc3464dc177abe2ba2dae0fea7e40ca9cefbfa19f513b5bbd290214e85da05cd509307375428aa9a30b087ac4bc25e1039cfdbb33f109cc58fb700214190fb20fa59feeafb1ec01f56c4c73c10f3a90e1321aa6bac82d1e8962e5ef032d674566d30f9c34d23df6b18f858f5b9e12c8553c01021c2daa4cf2b0c40b47030ca9db33437c8ec6c4a8198fd55c93fd98ba4f13333cdb9852d64648eacc0a4d03168b29fb77339148508e0af9a4afcb21b632e5255e5c4ef14a89c42739fa64d9c0f92604bc3a7f74da119d1c64c29ea72771151373f6403c6530c62740bd9cf38430ffb9c58088e0582fb77dee3145a0035a72e8d03ea790e78ee82281edd4b86a12eeb137e9e78f178de1103676f57b428c0e64d8a8f05d6600c4551ae5e3809c12f0ba6c4fd7662cb95f957c5ba20cd324c0af0d86d68a10e2638cb49a285feb3a41ecc003067cd58f1d8b2395ebf2af80ed08db52c5e565c7d9f5cef858183c358f425c41177939ad13a3b4df3d9a5a55293afab240340f614d941b4f84bb4cb8df697400061b1a87aef6fa84773c627e03bc52e090006ac89f7a6e9f9effb55be15d8f3d781ebc43d2052cb698beeeae9d45a4d5e867922350f5e06b3b071dff7f536952ae1ef0d8118d1e9c3609f2069999eee878bd862547e35e678251df1618559456a0e15ac6a290062ccf0b7c1c0069b2cc4b60e56388fb4f55afc0ef2046ca9b55da2efe33706ae75a9655d4bcd88e25dc5dea3696498e1650bc326945dccd5fbadd4b3288515603417d9707e8cb7d3b8bb739bfac6499c859204d6504e8ac915a070a75dd312d8c14ebc73a6b23f1a47e94439e2582df71740ae5e460bcd5d8c0fe8c7e89710e596947e18f98935a1b2458d322f14ca9cb7faa68622bb3a9cca5cbdf74fcabcfdb7fb8833208d6cd774a8f139f8f56e2aa87a07429f525fb90c361be12c2b5fc1d578b430ed1c6ac5e3a051be48b3adbbfd1b08d5a33105844d9c7d50f430b4d2be108f24fdd235315d20a7de79ec07b739fb3a8fedc06f24d186c45fd1d18323e21ce6415d3b5c47ea316bd0b74b93d20ddc1ee4e712b0b29f5ee1271fb2f0259f929a6e0cf48e0c3142368f05701f877ba8282776a9a3d9b7b6df7fc8a263f4c13290c092d8bd1ccb7e869a88441e351d30b139ed39951ca424818502c96a863cd06cec93a473bdd73d95daf86ec5f8e5ec72708b391768c6ddc63a6094a2d3b3ac93222713cb7f2fe9d12c2c3b0f80033b672d7a9615db4f9dffa04cab8c67b77a2fcaa39facfa1c8b809b947720e964d7553fca1cb4f70aba97d32f87e6cec28aac86d7cb0951f8702e269b9cd80d1502e9b41e0d7157689b53a29255344946371d279fd6cecc588e7d165f8a98602b1043d64e6ae41f176c36f67522e54340a84c5415662093ed1c7aa378a20870f355d2283e9f74f00a5c46b2588b8701194c7d9214f8d6fda0ed4a2b7954f42035e1ca62af82b9ba0397804e481b560ac6bf4339cb0124d7b89d7f6d29ff8d556177038950a7a813d0651cd383619ced7115954d441e622039cfcaaad13b795e94fcb396c492be1754366652418137bcaa08bb1b0c6945fe2014fe4e91b195eb327542e4eab81efec3b2ccdf6b51c9483be7efa215517834b69cc184b7fa62f9b6eab3923a3dee315af0b19077f5d8637bbdb8fb4c769adecd52f51c2c741ac9ff7bf4fd10cfef6acd1f73234b88492fe21d0f806db2b99f33ccdf39300da84f63466e933f2e890fd24ff23d5680137a14cfe2a3369f86ce4c5ab0d0f8656838bb01f520b51047ae0e04e60594279eb06c5a7d9841f0a09632f555f0775ac8e76b491e7b99ebfed0b1d5e14454595297cee0ce7add2c2d967e2efcfcfa97c1d9d25c13a4cc4e98a15e714ec19027309c669004920892c396a61bf87a9b5b61d2006c93f6da3c3a9a0cc5c56c9a0624d03e8ae6fc82640bdd1b8ae623baeede7231f1c3f7635bba9fabe085c1366d28d320c8a013d040f057b15724cabdecd58a57bb6368a599dfc4c9dabb6eab1ead33ed2b0e8dea42dfbf3e52dcb123b4ae14584fbe159762d262e96ba44831da15eb54e0b73e209", "525200526352ac52", 2, 1059728917, 1537743641, "f9a2c0e72d662caad34d81768ad44efb451a3df4bb49008bff61c63a4bc7f14f"], - ["030000807082c403033632b16f4918e0a6aa194c8c02722de6d278a9f325bce099e23487b620feb4290100000008006a635352530052ffffffffe6e97631d70ec07e528bc77aed72e32d054fbf402076f7b52c497094d20fc9a102000000030000000b1ece23cab3bddafb2d5cc15844b7bae0bcc6a75731f593782dac790e3eabab84268c0d0000000000ffffffff011f3a1d0500000000046a53006aa01e8b91a1a3df94010000000000000000efa6db000000000022e3a0bb74829f6c815e828163a48033f65224a42f569a48efc3a3f2cd947b1e13089410825669d7a86f96056d3090220f748bbc0044d44023822e2b8f01ffdbf91929d0ce14950cc816829b595837f7eed4401bbf7ca5caf43f34af2099c48e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010033f324587397797be506e885651efe6076c9b72e0f179aa69900a16f4e8c257f09647c50a3c1509c44292e8af0cdc477b763771138359b02c5e086f5b8ad2de163a9f2f551bbedc55dbc85b40d75726697804d82831ff83ec88c66b741b7c60efd750c2a4d845322d6224d359c4a25f7b72046cca2df2286ae785f7eb29c90228b640913c42a41fbb33d14248a1a5fb2d88d8044585e7b4e1f52f08dfc7c82c0310595cf6786f1f42f44f10bf2d5557aa7d467a6afba92c526af2ee4d290e6ec70a076309c7b587efc5dc6edca5862cb5c5e6dbf32c39b6d6644d574142f601062215cdd08a0153c3081811f100b36a6c902a5e35318f1506ff72fcdcac8fa240aa021b783ca690a81507d1d3136cd02bf85d0b395d01598f47cecae53b2990f52b60020b5bf425c55d21543047c08803c8d0d83f13b9d97c3786f3c3f35b219ae40054022d9528ab9571f9cb13e9ceff41fc9fcad9bc880c1debf7a48f47319989fbe9d103262012207b2041384261050fe59fe7d7aa527a5e2bd9d26133fc86d354f848270312f1e3643d8d80867522e759f07a9910fa3d4e13a7ff74e01abe9f01876095e0656075e3f40d25fcb2d8893bf640e85dc0a54ab7ba7b37cbce42a6b0e1c955def60f15589a55876d503c24dffafef54c50f629ed491afbbfde1dc39584b09016d670d4c800fd57109f68dcb3b996dc13467ea272cf767afb99a115ee8dad4d43990c556eb7295cf0a585d905978e7d0cf07282ce32221f1663751d08b396f72ba4bd2d5cb6776940cc9a254764b728bf46dcb2c36800aaa3cb3040bc098f9f728dfc607d139f4ee3bd56277aed97bbe8bf393d49ebf8b606cbace81cf002f799a848549aaeba99c0bd8273cb43cff80ee3af9aed9fb76e775f18e6f1beeccf2a10e65325c65e031dabefbff82dd06b9142f3cd8215787f12dd303901ec87ec7adf235316fe98aabc4c4d04b32267e42d596caa03a7aaeae9f26e0822fd125b478af1b190177b6d7222fbf85a8dca4c3532fc4588fe979dcbd77c204200f119d6ad2348bd94f898d72f8fd0ef5b611b71e7a7b9c3ea755611ba2b3d00cae8a6cb7541333d95a21cae8b343c9f01423fb3bf5f6f44c899225e5d19f9501802cdcd3a7b99907b93e88fa6f17872097f1758e5da39124a94dd17810176d373523c90462d738a26f6bfb71fbb6ff8d8d2803ff460e6960008fdb627f36434d698b06d90e98e12ff50b39f6804a4b92cd4e9d61f4a50f2bb8665dcb7ac2bb3762e3438581bb667d9e3eda90e2ac6e1c57e747edb3e054b9551cd24f6a73d3621af0d3b3eac898b16a7a38c7da07b7506a889e0aa977f96cf1d4658d39917e50d65a27b0fe38feb9770e192367f311af210257b090e04c83009dfb0ba8444edfe521e7e0de5eba530b111c434c4e6f9fbc2cfd82c9f624ab0cd6a3e2128444fd56d4aa6f9bf7dd305b3add8773841ba1d1c58c6790e6c56e268a9b15b1bfc52a23cf9d02c16a53e316741ee22bb9bac604922ba44a19a79b8f583fbb1969d78187d5ac3bb3ed62f755018f9058bd04f4b9ea6975cde7ccbd432aa11e44d103047705be5ae9af297b4551a4ac30e35e910b6873bb34668501257e6d5b8ce9351756c7e295735c6296d4c92d8fc660fb48861dbc670e8d8a3e0cc7bb52d7c543b90841dcc91e56a9e21b242531768b2ac6385f5827e3858fc5980c48adbc93bd9ae31391487810198ca96c74f7fc3edf32acbfa86ba5b4ec2790a5eafe25bbdc5fa53fc0d83c689c71648c74e8d7b3f5349da8c8eddfe7332d3e4bd0b30b39e054d57b0b29ccb75499e51bb371e33a50be6241d80ff6fb81ed2d605a9c4e571da265273efb1795e6d439b0c289c4ef37ce54d4a990cced767c1254e2cdda503751e4c157eeaa588aa61c7ec9bc916dfb086908cce5b90887bf9c356bd1946e66c25d925bd1eacc73691c51982d63f8b97016b67285ba1a946b6fb4a21a515f6471d8244bb1a51c89b49ded8937839e1c4260ef60a6b1b0096f847f1b635f6e30b447851346629e7926f7835742ca380ed73fbf9a8c41ff56be560c6da25d77278df99bffc84247cda03c8dc2c78ff0ce306fc0b9d2f27b24b6b2538b0683a416b3e19b9fa99f74700c7c61195a65016c20ca9eb430c302632a35bd9ac57a16d04902a74ceeb34d56838978cf143666018c5e589da4fe2857211c9462112bc30e5d38dfce755eeb9063f03f139acb3acbfa8a1cda967506849eb764d3ec6bdb18221344b0dcb5294a1e644e364ad8f9dcbf64bade0c20226ee01cea85e37059bf7534c1f9bb0ed63210487b32998f8b0a3e2799789abb73b663f4d89170d55659019eea803d0fe0f3bb3ea78801efd423e843f5a5ae65cdfd3b456c1ed628e9665396cdc4ec9a89251eb1983accd8f24aa619f07621e06", "53515353536a6352", 2, -382462871, 1537743641, "32b9c7bad907898bab60541b0f495eec1521219d8c4f9f94e68b5162a5c73369"], - ["030000807082c40301a553979bec0041932a37cee4688e9cd5c81a9ac1b1859a47bc6a0b8b06c9ee80030000000853ac530065000063ffffffff02984613010000000002ac53264a8a000000000003636353b43aaabbd42b1fc30173cd12020000000000000000000000004a9f23c95adf1b275b81beea616110f2da4ffe219a3261d0979ddeaf64eda2ce59b0d4cc233410b45a29881e0010d9d216fb5d3a6afe4f21d3578a83465b95473a09bb291318552c6f6d9f139791353cb640de3785fa7e5988934ce350de7b4900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f6ad0a7219c1ac21fda18630aca8fdcf10b5b16dd6b99112cdb287e5058d7ce113a5b847645f99f193027228a3771aaca6ea306fa1d7f65bddf434205e11a9279849e120cbf80ff4eae19d978da968436269a1ad4312d3c535c77b45aff8b79d346c01448d445fff7f35871fe2ed55ec44795ab379bb57cbeb62bec4abdd0333021810f3b9a0ed7e18d2dd9e6a5c7709904c49fef83d9619e673e5efa453a646b2022ec20653005e59feb0352244ec16e707e9749fc8e45c47522ee85e1996a5ecb30b039478b089fce95e2dc634069d7019e6472875670c0626eb6ce76bbca9c19da5a978043de3d2949833fb0d94ca3855b598ca49dff649d9bd84b3dad368d450b3030a43d9894bc2233e357e5ab288fd67402617ac94e481e50e6a44505eca1582290212b317028fb6b51be3df26aa3fc50a3f9a9cebdf3982d47efa43173693b08fe4032344a916ced76ddd662d4c799e7c4f8af957eae13a60d58b55e71a7d3387ac0e02030b60a07a0778cfba568357ec135939d3d4bb23d68f63432e904491b68db0e4020641924509d9de30369fbfba5a62d1dd3f98c1cb326cb890b264879b233cccdad995fb934dd58af65f1d0f82d9027fada39a7362c35307f671ba4f5b2bd79afed0b1dd53303444998240035e6aef1726f156f43cd0d124f9106cfa2c119e6045e00e46a00e58b724789e8c63bb8ff0c9dba021f5f483343d98d431640cd79109262134ccd80dd82361e46274836192768cedb9c1df80a047739827b6c7c2f79365b4c118d1d851fcab2512545b6a25a3d20da06f11eeffe0a6dfa0fa193993cac7b84f273344380246500641ed785693077d7ee622a9e7a6c9bfea124e8af1fe068ac51ba6830b2c1dd5c222a0fe7178ba074f1267f17eb054d5c18e72911dfc900e4d7a3aec42659934d14463f7310c02ac1c5786a8463f144e90ddc7bca0ee5ef88aa56df9ae1e27d992b9c5d7468a4263e57a521b1b9b693968bbb679f9e521812ccca3897baa7194109f66bae59122758518f2e43cb9ae5fce5d2dd4b320c419d6b02b4cd123d1d0c245def009badaee00cd2812903400ec6c098135053d4631152ba888c5e08ec7d9fabf9db7f72191f207e0e716c1ed72be6eeb3c451937f29b2c6b25cac9712db85fc79f7fefd04443a0189c58fc87e2bee6c63b9a4de5e993b65e85ea9492429cb4fde9644a7efc1a35dda5b0b8749d50b8b030cbf3d7378eae1e7e791fb857a8dfed7957c44b57407a70644ae506ace85fb46fac092b8b608cb33c455095404ad7abbd51c878edac97ae7d6a5c4820547081ba6fdc28b688d9977e2182ffa533ca0ea00c3bee662412daf4b2430f1ec7a44d3fdd1b51c3be935dc6ac78c6eab8c0383661e21cb7cab7bcd5196b6ddf032e11866a9d0238f4d4b76e7ce1ce6be02a0d5177f80098b90f3bae638a39e852de28eeefe814d7c8ce714abbb7244bbffd9eac006c64cf3899973c33a288650346cd12082f205cdbbe822f886a3b36d886112fc0ad8d88f9ea273548e28663d09552f71fefc880c2cbac0c2e0a297d267a30590a70deba6a075c08fce5028ed6592646a684dfd20c1473b739cff1670fee1fd0f665118b2626a8bd5b35a1496451f422b1cc83530d7cdd575e61231ed4e0d088cf707ca853e7799106fdc5c35d9bd2ef533fe5de22d6d827732033da110b69b6fcdf659eafa671dcb9194b0b1a3be336fd6ff8db85d522fc2b8aba2ba05a555b50079aa71e1de2a2e02552cd5ddef1e2a010594d14165d31db3fd3ede6f7b75b0c8d1555e42d7d743b9d0e447774762571a2b05c244a4a3d578df0dcf233822def7d19829db7d20b8de997196e7c1fc7e195c7c7f3baf12b0751443b4ec4a09338730706e7c2267336d8f39c9be3487c2658dfb4e9d43e2d8afe49637835b625a03a4e7824cf5cff4a55a137442558c1ad38efda1c5961f5fa2736824592e7a40ddf10afc29245fa8672eb49dd3cc47f687f0f78f508271efc383ca93251fcc451d34aefc4e0042f30d1d4be9f555d8d3b86dbb92c9c53b12420826fb2304450fa798e3dcfc75c0b5498b5ad73de9221f30b5eb99d8467492a2fca88d6b000b7a11a0e7d210d9eb0a0a781cdfa9cf6e120217b865cb7e9af01b3dbe01e52aa196106ea277a6d11c5b3d1c63631b29a60a47ca34a00105204a5cfdd4757496765d0bc7ee5bf8983d41c24993ab0627afc128ff529a3aea31fcce6f94102f5512cd09347e659117c8524c708444c99d34425c29938fc8e7907eaec8b1ce3e3c68c34d8fcb05f5b02f2d21fc53023503acd7170f21e591f8af3a3624705b2ac49cddd683426963f714064ba28aec134d2d61199f32f40bdf31f6b8ce1c045cd7cf7a07d8d4b4654b1bd3a41a47dcacb8ec80ca14bcb0fa5e71929cbab388a29ffd06c98be00", "6a5200006a51ac52ac", 0, 266469496, 1537743641, "4a22034ea2a90bd699356e990bab25e9a0d1394886bef649d32ca3dc48aa81e2"], - ["030000807082c40304275bd5d56998d35f38f2898fecc2ca6fb1215e6764a403a7afb63ae1b1e2b187030000000865656a636a006a52ad5db9208d18656992756d8b63bcf6501daab72662016037257a59177a665b66017388fa030000000451ac6300ffffffff64c4be9efc88c7e772112070f1e7b65db9c081eda2f6fba25eb46211d77d03ab0000000006525365006a53ffffffff19269e81d670fdb1ff404533a2499dd85b11cb40dc1cd15ebe44ba29d92a5c2a03000000046a63526affffffff0483a47203000000000163b0977e000000000007656a00ac52516390b36b0500000000036a53ac0362b403000000000353ac52b65e8edb00000000038e19b1030000000000000000000000002be8052b622ff38c8ce6af0dbe76a0c36524ae5fbdf3aaad37ba1fa7eacfb54a7ff995af16fe1e218b762a54f7c52e6ff0ce6cfe82acdf74b2eba4da04d308ffd62cc3554408090af1df7927ab3e26de76b5e7e95dab6b2e1d0f4315d0b87efb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006abcabedfa7a48c2ce77bf514c5903efe510d46f5ee80863ac1d9b17d24859a83de2e73ab0f486c40a6c12069df9c65ba190d6950af27bb2cf395de1d584a2d35e2b2dde0d98e55b2da7fd4ad079c361b222116842af81f2b9921de79f418008adb9433886cd197bfc201dddc7bbfe1f79467284cbb80e0a03c7ae68b4b9aeda0202c635097daab038b9fca63b412ede19ab2ae09e59ace64dfb1b75866cc0ac9f031f6da61e1c4ebf902b8d115a0ab676d180fb8f47351c8191aea5354e4dda23500a07b878c94cb2b7a30f6e741b119e56d2ce85b42c7d5414679607a0850b48ae67903b56b2e7b67aa256d22d8fcd463538c61694d2b0884ab57d3d271c78378da7021f62f3b041befc1e49814faf927d54d7ceed9be5abb86ddf5b56ba5da562850d02156ba7308fc2c5cd484cae03e1a608febf38ae024a9790c4a0bff2aa52d507e10317cf3bb3a04c19c8561699aa482097f84f035df3ad4453b3229eeae09b1de142021d21444c950f0acbe864bc1d6567c9612ce8a215d6bd732da5eeb62ddeaa61d5032c9ca0a6613ce143adc5120c2611163f2a11ec7a037b703130f8a8cc0100b14b9a0cfd2c7999f39e9021b055ea10f6f51cbad631203eaf925c7bcb6fa7c87ece2f3776a9ec96461cb9658ba2acb65ee0f5de6ca90de4389701f8052a0c9b4925a50e219dc6b65adedca5cfc45883b605788cc239799acc2ad026e781e9b09a0a34606c0a694daace20749e2cc410978503decbf3f8828e5b42dbbc991c95de8eb2b2b890ede5440a15486af34accdee007b02bb699097eeaae82f25696c1645fde0ecbf5a44e3c01846fe3d0d2b5d0d8fd0766c47f7bca3753e376960a9844822ec99ae9d9c751f1d5c7fdf7b8fbe9b73bc433145a00d032e767cb947e744afdca77fa31a9dfb951dc13123028cfcab7bff64b1cac2ef1b00ba6e2b6bb9df4e499db1bad7cd229ce28cb38e2dd386170d58da698ddfed618ddac11242cf9a99153a522a7b61bf70f96e04eb216ac5f684241477d9bd3673b5018f5783e40e675816989ff8255a52384c5749a7a5e38413485c526807f0d88fb92a08a4676d0c23bebb47a5492dc94a43344a6836faf732133eb6a51b88df58ac14df50c9cdf8eed65a0ffe456191ed8e7d6a944ec7c28ae5fe8e83ce8dbfc115ac6e1dea21455d6129fc13bcbbe69a2e20b6968ce66353db5de796a27d58cc439183a74d9284c3b14bf41f733309ea1b1c5fb8e29ed980b4716121e5e08a8a6d60cdc5c2b4043c56669788be936f8638c842eac8e1c27e7de3fef25c8048f5130f9188894246d6b2ba31a16ae85f590e056bbc4125e7f59f4021021913791d786206235d2be590cd910ede60bd994afb8f236b6ec1aa9a12461397e930fbdd7e640556c049fa82f4bf5062b08966dbfed51b678860463d53ea800019403793048289f957f378d38780afdceeb2588586b0b77a117b08864ecea3938b528ebad69d80a8a0348289bdb9ca74aee4abef4768dbb5cb5a5908f75a03254163618c948ff51670ae87886228ace55899f45e35782682f5aa2ba32af8dc27fa2a011cc6411f25210f5fbe5d3d49c932a8d78c3bff49f09fbee2d38b5aace3698cdc0ebaca99b21dfc15472121d65a480fa5cb6faf2d84a0180c829e7b4a665289e02e0c570c9c1e7c3d0bd63aac297c7d3576d1500063f690d910bbb8ac2ef819e85488bdda0729c01fced335a1ae1777387326bfddf7e6866805ed3042a2d685f5ec456fd26d2b5dbdbb45f498cf0f20be882606dd0add8788388c75ca33d604b5b5a6873a6eae51cddec73556bc3a34609ad12bca9c14f0bea54a52c026c5f69ac58c0468528e2771710376a79773b69917700ac005226f4fe2b8f3ed7fb4e35488c166ccde0c53c8cfd863962b352b5cf8f63f4b13cfd739a9578dc06f7991a830114019bd788cca1ea211c2ff32d91e75a8fbb4d32766057131e5ee44b05ca054aace018a1f1767dc244a0c8c164ea4572cb9d049e9b39e934010dee6c66ce4dca0711db593256c0faca200420aafb4269dd5c19a3ab2ba8d0f7843499d708308ac5addd21bc3253890ee1ea058b4f218cffa31714812012c87240b300be68953b3e56f75051b6848a55df723c652ae6805d240bfcf62d7199872722e1daada6c76efab262e1cf7131b5d858c55f1f66463aaf2f9e61a940573eda683124b34946e9aacd69db912d6622f794467450a8f9a769057d8423c1c5dccb984fe4a34d8c52c8fd20cbbeeab386ca710911521ba88880e2b9b6693f27c2d8ceea030000000000000000000000002f2a76da968cf4e92a84cb3e3758b56a2581e885cc73eeabb8f69ec7cacc3631d142a607bcfda94b80f465e365dd61b5c39be6e379c6e3d5fa5c0d23e8c3bd751a0481b6abb3e85aaf9a5786eae2c62c593cadbb861869b8431a871ab3be7a4100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000113069a338589d55e9e5895a366175de744d9a51926eb8288705cd2c90a9277971632d362767ebac70efa88400e72e1119c56044543d9d72b1d6af742eceea210a31231d021878b7fc7520d15631c4fccc3db889ed3159b36241ebd10d3baadfb4916f1635c605441b88bb9d1754c01c6a1908e093557784f7a868086c30cb47032ec3cc81e32a6a1afde909f101f0b66bc2cb286a38ada2e6ba1aadce2b87dc2f032dbd89b608c2f8186d6f694e4376e9011554e26c1b2420fe9f1ee0afa05d648a0b02af462f0544215a91f535074c153293bfe8b5a0be148bee96d211c4bd03bc04572ccfc67b26162cf2865d9da464704ef7cb59b661aea4280412aba6571c42fd0214ea5c8ba4ce89cc75dfe518ce44e6a1d6fad49400c4f36c5fcce10c18f80ee802146e44c2f9b548656329a36e6fbe12e7ff3ee770560ed55e27fa166bd92e6af903262a6bcbfcccb8b4e25b4dc5eacab4bcfa708194543624dac58fa0e7b10f11db021c72eee68f07ea5f8d11b78cdc191f4fdf042879943eaa87e35175ae3f88bf32030aa3b821057d13dabbe38f1e27542d5f22989240398c460ff5d46185f067eae0ba9320e557c74b41411fde54282f2a4f254a5a75935850d669cb59a5202a0f2fa0a50190f452f9ec85a901c829d352b7b36afe348b101835488c4111ad965d71d821abce2f133efd337c83c466b950aa5efd34530dc75aafa98c363f457d7b10c305f2dc1b847edf666b92161f681bb0e9e3d337b91dbe62965927c861618eb8b992bb8fa8aabd5cc6e439e684d80f61b9602d9dd968f41f66339a9aea22b3eea4fc62c6a884ce82c3084004c0d7cd834d2539e9c74d641ea54291e1e58d1d8d3abcde6b1da77b7146734fdde0c872a1520b0e213c43838afb892fb5ac7bf5c30dd3e079e7ebbd15f28b8487d1e3bf6c53deb056bec54c9a0d8e339f7e8354aed7ddee21726456420e9dd8bd5f2af2935a3c38525d9374764b139832d41d93262d71e10ec0aad5a54314bb931b79b09d3b0ab7a4041370effead1fde21924ac9e7505d330eb9d0ff1d4b2152e5c11f94bb14558aca659424154825cf4490b08feec4646aa821a9f3c9d17e3d282d13b69f7bfdad6106d4a851cfe2051771924391a21d4bdc36616ece9aa1adac9235c5b59ce99489277c44c2065289a043b5b9e02c932b1b29031f17b48befa10ee0a8e47c773de06dc3d5214a7bedd7d5f7b7ce48857ad249755d45947c76b30ce68dda0bd1c5bdaf2f71adb1f7aa5c8725ffa58882cd9c862a471068e7babb8d959e975a8fff170312f495b0e7744f3f9f104837a4a8cc8f33cef3d4467d66ac680ecdfc9306a027ca41ea34c79b06e88cb6d611718dacd0f1ceafc47c6bdec9ea233ab3edf3874cd89d8ef3405a194ea00ac8c6f4fe41dd255d3703ec36ab238f9cc8fdec5088bf5e5fd1f13c6efc492ab1f401bf1f3e74d01c5c2237411c2dba1dfd0d78826987e83e65af7f26a695e48dedbb44bb01d1c27b3deef07f2661028df301f005240f9a83f9bae6ec6bed67674c09ebafc07a3be62e0157e2bc8f95d53df42bdc1d93796941f14400b7e59c7324e9fbc190ffd18a0e0ff325cecfd137847002c727d808553f8a17a7e331dc3fafc215854b8ca58d326eaf8f9799b24e495221b60da708813df328c84e3bd88a53ba9074359d84c10210814e66096bd9459c27f6ab277be39d8442e2cff5fa077d40f211fad7ba1031440384b5c2dfb118f574af4621db570e102145f2e28219ea74aa1a21d18168c20f365c6f5cae0f030b737c86dd0f7df3dbeb33e5ed179c21b2982e0843e362959508778d97d4f8ba63d0e49a8b9a5f51c7cfdf2db2bd1e08e1e12594da961d1667c0de0ebebff36cb6cdc43e3f7fa04307cd1d00a50967d1464e4ecc997b24a5594a7ec01f21bf2cccd8ff64adf8a3eec1edcdbf313b2e1fa8496f51eae436724c983341573e16fa825fedf650ed4bc8d5147ca13a6bd36258872bda2dbf0eab42e44b1aa6a2661f9328426aba6ef1308f58289190648c0b80fd1995ab33bf135d860a25234059323430de734287060b9552bd992ffea87e40d3c1bdf7b034ac49575e5c1e4b37241e41dc84d3fe8e78d0b4565da6235da0d2d47d2c68946161d328ba6ae1c565c2107f83d8bdaac2a0e0d57c29a232cde23a15257600811694f920bc3a6f98f8c6c0a4d651e80c434b14cad04861514076093e6f30be1d0d281b9579c4a228736cd691e46dd013b4984c4342729d091bb48a42fe0e1730be23c85a6aac4d8bea811a0000000000000000547fcd04000000003afce7e4f1c4f65c5ca56080cc817ebf890b890e52039a5518b124a61f38ce4f6125698bc0f0ccb3f8083a2552a381db05b235467cca0080fce16547e5e591e66591aa7d24779a856d8a18be14ba054838ae737d7bd7a620f846bcc723ad517b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e5378d629e9cc63d75378fc9d9fce13f10deef5bcf11c06a25b56b366a2b593711e7efd1506d87fc6143900ea9a400f38719ab51eb7cb9e5371e991863fc2460c34714d2ce6cf45b92654c54b426745298ce0a0a6d423b7ec52e89aead6f56f64e67fa3c36735014a38f3aeca80ffd117b2e94e0d4909f69e98a11ec40268ad021f990a1befc2f4b8fc9dc6ce779a11383a4338351be764f143d40a56b2b05ab60228417d6380e9c3f17fcba54c3502c036aceb3a866fa8bd80fb1d461cb470695b0a062b0151f0797859b44a16adc8fcdd205bbab2626b14e387b1a2bb0032d471a8c45b29c23df84e7b29c779ae4b9cff00d40d7837e8c71f9e8da595f22e0af6340219c78732efab8a3742465ef1d36043a5aeeaed2cdda2d760dd46edc8dae6a2f80221a5f2bd36f7ea051d2d7df31d52ee83bb656caeec9e9c5858754df50c43b3b202174b6e5812fa6602793ef0f7e9c766c71c882f8d42c340e2c65e1c73618eb7a80320a9c0b18c842713c13f0d5124f8b7ec3d0aa5fe8b722e18c5cd60ba6a6edfb5021432efe32eb9e020dff99882b316356bac060ce87c37ed5ec9a67057af64ed6a75cb32aed7afafda4c3bf4d05f87b13c4cad5ed2e54e87949e6950f154cad1f949869dc793325e3f962ed0c0a68cff0e727ceed51309faec772ab5e28286edd8f268b05a66cb23ea8067840105d0ad5c32a0cddb7bbad26cc1ebe95a7c6b3f388b5c677325b75e6455faa7571186ad02240fc7f1fc0852f81054cbb75d00b0a2ff7b21b81e92569aca769bb217e484915af4743fb479ba52a23854d6e5bc6fbfbd603abcbcdd7b730501ed1ff11b0ab8990c108fcb1785c0b247282bdd5c7110684d0d90fb97dfdab9ffb5e9099d1be78b428be37c6688733e95e4200dc2b7daf37b3d0fc79694ae26513bdba2713bd33f5e8d427fb774357ac410300ed586365e31e82c199fec1ec9098fbe5ea248532e64b90bf2652d8e57b7abae8df2d9d48997f5edda179d5956c5f088c80068b4a6cec8d31902dec7e0fa188961ef8f402fdcf74705d42106d845267299fda1384bc6570352730d5762fc517d310498b9f338547360fcf19704d5a38731f050d58882f0e47e7e99912e22be7b121aba9258fc8833d6c3d7999e48c1c4c484da9914c44f5884f0ac8299282069c5d88684952a279d5fa8f81a0b75f32920a89a4dc6e9a081e0673cd782a4f27de12174a92cde131f5ae67b881e6fa15e373085bb7fcc3433454b464d62e96f53edfe7d2ec0f2e7bab022d48e7f0bfa11278c0e21c00c88564b98a3e8d9b840d3f2b6a43132d96f3c5ef6837c19405d9d049cb9b3969b8af8db7880ab6fda53c65e0b5796d156b59943a68287d8d3a65e2374c0d0e053134b0b19fe184d81037c72a0ae4206112c0c142443eaeacd8f5eadfffd287fb05705dcabde9a734ce26058edbf34bb4c9e28725d556c3703d3608c225b1ccff34911773f78c9f6696b51b80999543d21b8459efa4ca4191cf9894c3309c5b60695e322c9f04899daac8d24279a9d67153b784a43e0f11920170c1668570122d1850bf74a5095c8e369d7c1f40cc13560c810809954ca0930e10bd3c54a8ab66161f278aa698ca951304c0de447a144dc4d67407b5bb3e78eebf8ad1b6f0c22220de27a06f1feeb9ed8f14fbc24cdf9f21339fc5f710cadc1ae194a9758da47ab39aacc7118e263557f3cc953972feb5acc7dc9c47a0a68d3352c4f01753b5c8a579eb2aa058eda04f0a7aa8dcfa37d2029fd18449b3562be92072b95e58d51dd5170fe69431fa78c12f86f10e29821d91c4f38c033db3801593da4105d06d6bf586ec1d793aafb293a646e06ec4a41e66422c966d92cd1432ddd80eff04189d7c706a95c8edc6c1ea1541acb036b32f1be7e4dfb225bad2116a94f7995aa7c1cad977b4fb41687ed01be487374b068fdb438006848a7cf5a1b338eb00865a0f43130015076df8b7dd829119392f5e3197fd0a3f569529c3d443787cbd080df3c845742f3e17ae34fa29e986e1af1dcde76739e48818324b472265fc931d59ebf9fa9c40f4b2f046677d392877516cef1f2c347cdfcafad17ed6f52fb05f70f0d1ac894b702c5ed47958c507e0cb8cf8d583f5b01f0fedb3283aa70dc341c364d67a0ffd7aa034ddaa0c884bec0a57c12e329351d6d2fe32a980dba0c984d5fe77ecc9dde95bfccf794d1a9364d1acdfcfd0400d4b470ffd0ab75c5b7ad186442e6af22521a7410cd1a13c18fb45f6fb2295f06a0f10079bad1a7b02d9b1f2fd5ba79690834ef19d26f3affc28abb213363530f7468a6f6c63bbd0b7ec44c716cb2972f6653a4e28211986f5019903d169494b46e3ebbfec89299ba04fbf4f8e5733e8a624a8753a54acd330905d86a91110000e7de6aa3674b5b7be971ee9502", "52", 1, -1158903084, 0, "304ffa96fa7f6161a064bf521b4e7078cf6791c6dc4d3ab2cd1b8edeb1eb003f"], - ["030000807082c40304a346d5f0d2ef05c0a2c13685d807e110bb91493f7e7069841c6e4d735248aa9a03000000086a6aac0063526553ffffffffcba320d8913ebb9db65a5d39d7afa0e92ea7dc140c0208752b74de2fab255a9d01000000096351516565ac526a63eb84522304adf93b0b5d1ca9d3d2adcd41f97de4543e0612abe7fdd6cf1967463d7b86e4030000000565536a52521167da1466c3bb2d3258c87f81271b80deee03e5b896017974f5c2e61c5ddaaaf844e1b50300000005ac65655252e1082fe60207933701000000000151871b8a030000000002636500000000af755227030000000000000000e86ea70000000000b19dab7cd30a1d810767448c1a0cfdd5dd027b85dda77fecd6ed9c7b4654eabcee57deddcaaae43989577713cbd3eb196d17fce57a54da1fa582469b3efc77e30ce2b97732177ed6ba9866739ddcb7b3727817a9d663989f9c86e00a45ad6dc2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c81b91de9be03b6c49971293769956f27a475fcff2fe7941e882da43776837d98f10c06397320437df2ba3c72b58291136d75604d794764e104788757f1451efe6d0f48fe5880b926e1c16ffb9942de3b3b53d799b8ead1ec2e9d9c0b8edbe6f61045d16b6cf1cc3eb1d2a86525902499f98bb9d89c88f100fa7dcca2ff9f83031fe670de514692045c23fd9d58f19a1e479867fefd43b5be47c4a079b64d139f0223c0b6b1aec13d61e7b76fb3ef1ca9886d695176524d7e241fd95a23c2ffd70f0b08b2ffed754530c484466824d398c14e957a84842689bcce7cfae2380a1b051871202ab541229495e0c56c1a9ce12e7c823901ef6aa9e01d87f772487834c421031d3d0483ac17880e468bea3f15afdcdf1b7135c8a92d31c1af8b8ad25d8daf640216ccd37fcc82b542cca73f784b1eb661cb1992fe90f2be1e9ad98bfab5e29bc40203d88c68099183e2bfb34a1abba6e1e07a9f7a0a5326d65f6d63d1382b943e17032b4cecbee54438539459d651ac4aa74a116f60804bad8e4307ce133f19dd1fd803056ca5152c13f8e7d7e5b4aae0a5ef80dc214f177839520136f34923daec08af5f14ee4ba157bf295ef6c44a8c6897d36a92fc4b7bfb4b009e9535208e1e500b96ba984ee8cf59c032c0f113f89a67265e831bb5c5d02ae81ef3b2ab73f9fc23e6a35aa97602884c86c807620a3974775fa3e1d544ddd171c0bd5cdc4cb2c6edb5d25415a48949743a695e8b400f02e2d1f90152bebc30237460dd4a3b02d65a39e243f7e4752f0b97788b0c512cc8493e9418ce1cf950ae5a80444e1255a942d1f59eac422c6c5f083fe7c235e50faf87210375e9fd1a025c5c8e6b26d6d8ef2720b57e2349a6883cd7d887420713e0785906349328108e0fb110850dfe3f56bed9fea09796e2e1e3cc6061feeb2aafcba2cdd7c529f7782ae9e88ac205c1c27714fafb9ca424c21e17436633c67ac86541b4592cb5ff4b772ef061f6dcf73946bc74f189b260bb7d02d79a79df5d41e45e3056bb0347b5e82e7ec92d3022b6fb1ac43ec57eed113b3fd528db276015a2b9530b44a355a4b533950bc430306015da76163a010846dc8aa9b32d1d03698e99a144a2a6f78ba664581ec97775f3d1af45388ed1b0ccc8863f1afb79f3939c553e9bed6bb14e860f09c81fc2ac8d9f1ef8d1f2eef0dbaa54c619cc212cae154841d86a1931ae94f996202d84757fd6794ee0639ab8149384938db729612f6c23076e7fd99e26cfc9b4c36e0a5660015849afd9a5ca256145eb4e5cae71c6a6e6a4e871004d26d51191d236314f3181513aee760f26e1572d0b38eabf6f5391c2b8e5409364e047b91cd55391dfebfe3b38af45ec513b2c419fd96a3d33f45ffe1bdd243d4b00523890d0dfa2529b4abc3523e730daeaf67e59877704e0c181fbfb9bc909b9afcfb73b0a8f3c17199ecd80452e0850c528aa57d096475ed808b1431e706c44cfa6a1ccaad7ac5fd3ce43a60d7d771b0b9e4d556eae05eb81cc5e5a0419e18a5c7709c2ba792dddf47936ea88d118ec1e471f29bc7c4a7e4214b38599a75696dfe463b03df4a731b39f11d7ae0a8c2deed4cda76724847151be09325f6c92f6656fcffd9081e2295ab3fc6a5b7ec32fbebd7d6bf4bf076e22567d588c45877e05f59c8ef20e32dbc775ff2f5f9850566b0aad139dbc09938342668716ce4c77a311318816d499e6c448aac4c0b23465575098396becbf97932fd24fe73d21b4b54602e3023e914bdcdaefff5a8785ad5f4e808043e34d129cfa1e5fbe0b45f2c02ee850a0465fe9103474a67585c3598e317d647b83781d6439c4d2d4856207eb5cd9284406ef27c22801014a7dc6c76a3b63dfc0ba5c58caed27dd6e91275a3e8e26bffd37e14498ced51fa9aed10819f4e52acd46eefb1cf0126bf50a6c2981bc9b855f9398578cad5474d93fb2a3cf282876a918e3f272dca38e11b4f1f734b8f3129cb6cbf42cf2d51be6cc24792b3ffe5f173a4102c36a0fc792f3c6c4ec022cd5e0dffa813829a979dd211e95de5537f04d41b0a53d0139236828b6a906e69715ff434c7c15426124828eaec00fb9435a57a3efcc54ddec3bd9395078fa324dc046c47472a0a6bf4303731bf891402c013d06e305cf6505c889f22bb69e272fb23674c1a5bebf21a05999ec2a7da5cac32110f6eb6df821da28e647f377f9f0aa442929447f77eb3c64386672b3c8a6c31d7953b2fd5ff274a1736fca9f424daffba2ee0e3a8578786680281bcd0f2ad10dc4b7d44868d6cb4fec02000000000000000000000000ef7d4c662f9d0d25c32e4d207abe65973c93b29a3a4be63318aa18d1c292a23ff569c9e503e220b040b5a9495c40a2a3b1830b9402b22f17ec0774c3e2e64833c3a299a97204f0f7ed9310aa41dd2db7989f75789a2ee6d75a393d2cdb7df96f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b4aeafb0cdf35c3dc5ab2a094e958e3b7d73d09dc887b3a815ca008d66165744a29ff7515a431e5fb69e4f221ef88f17ee8f8b2f7a2b338aee20f64f74493ad4b6b70ddc56cab503accb6253f45ee0170ed1f27eed77c5fe08e9a1911f20f2d8201bb35e3880c62275023f2eae7b05d3384ca940e2f5197230bb54860ad24241032bae6252f01e5f3671c9211a259f6c1d1d3b690fb417b8bc4dd86daff65d8de30305265037ca0d3999ec222e2fc3a592d93c62ea8b50318fe5d8b134dfc96c23fa0a030793046a82d02e11a6dcfd0bc8419590a711ec8462e0f959dd989d7f5fa6c372c42e2fd06d0ab74d3571161615762d48519f83d27365632d8222d5623bdbe0030f4aead159cc930b13f40376c3e0bfa1dd126187f04bb50bdd9df709a3a92bc2031e6528922793ec64bbc52ea2d12d006dfb59a8cec8e9e8624c90b8280b7c54af031014bae2d6cb94b37400259d1b9b7ac20be3f73f921ff4f3765bcacd39cbf195020dad4cefbefb919c0d86769b2bb143945d9d701c1870b4646030a3f004e0ad0d0203711262201aaf369043b156560b0ea10307f85dceb40c792d75b9cee6f5e0392a6a5d77fb7226683a4fc3a71238759a1d3081151582d43f661b4d023549bf255cfa92950ece3ad00274622b7c7957d3e9664489ed72bea9a56bfebe667308980f740b6cf5e923519abdded64f0d93a88aaa6ec6d7204e27ab1c46323d72c493a27900acf0d1a73043898ac0d02f0f7f9a02da2439f99722fc3d0a71260b9ff4022d01fa737e8419865442c01c4af0a13ae63785504f642690b0de578500f1b621e7aa60e54b7c8ddb8c502f8ef768012d76bdd61922e841f3e3798518309c2d809ccaf9dad553af81cf80bbd88627f9cc12ffa2d340e55dafaaac70374ebf2d0b39b557b52bee897d13e89b5fc3c8d944e18cd37460f6308498a56383caf5cfd76dc016255f6b29384c4a316e51be0a03ba83724a7c362222c4a34ee1a012df6d734071c7ef3c5529f49d23c6db8eb1b9dfed492e9b9063ab98c32c37fc1061d8d2f48060a56411459a2894ddfccb71be794a907ca74946781aef58c27958b781a6b4c06ce5f7f0c364c126a8075fda9e363891e4ff4802d09fbb2bd9d21b701c12a36a17c74d4537bdacbe5c1d0d1e830ae20842a2ebd72a9248dbc5887c032997352e3eff08aa594bd6065756c30e41c9a643733030fcc1458838795570aa79fa7f241720b17223992dbb38fc7076a461b8cb2dc9c5d4aa485a9324808c56f3ae7025f6fa1e9d209e13c4c78efc936e72c552b321ad03508a57224a9e117d3e40f9a3d226ad08d3f83e77cdf478f0a7195ce3a4a2f2d3d2c64de77d613b32ea5813dc53dd044619ef718bee1f51a5bb0a3541e18e670fa258671a023b08a954401f3898100156a60b4ce996950bf1c1f8052d35e45d2b30bc8d157fc6dd6294edde227182429679819ca88e08a48a1e56d434d6f2acb4ad6c1fbf299f3c145f4d60928941f1bf590d3d5c5576c97ace63f9d52e29b00b06fd596e01a23a8aaac436a048df7973d03a818e4209ea46f9fb99fede537f83101976e2c2c4c987c7571e675395fa88c7114aa97f78b00067efc168d4af2717d9c4f4f4c4b38f719436beedce91e605768e657163a316b7faa389cd91face1d808b58f9c5043d97bf83922dd5e1a157f64b0218ab21782776702b9ee4d57a292dd7d549dd72239431f8c041b17d717f39bfc1521609e13944df4484c15be906da54addba51c7fe288dbeda4f1cfbedf36b69a459eda01e896aa7f8f16037f7d37230129120f0457ec762e580ada36ee710100213c9dc4f6921049582f84736ced351c0c14f2f417c828c4ed55d72f26ac8f6a3aa779d8f6a404114bd030fa8eeee9a690af4b9f22a095a2f50b4b3e16153de783c07ba8116cb4d152d657f87330e5a59fbdd431f6f2dc0d4be25410e84af7c2ba67c8780f6e1c33872b275a6f6031e7883f2b38b59d89cd22c656e046461facc34377cc077b2a8d689fcf55354a54ba3cfc76c4df2756aa9abc10cd1e11b60dfe54f0633d459925e55190d25b315c50f5393f629e4353c2f69f90bbe60b130fb281908baceedfcec0c82e630d87d811fd202bb9b7c0e6bef60b2bbaf91eaa36ae9d10972136380f0d59e053e88bcd0542b2182b8afb239595c2f987adc73b4e73e7fce05bcd93558c12ac047f3bdd16e4c55aac23198c86a571eefb3977f41e68fe5e7b6e65c87d48894c7230980c7cc3b07ea2cfe2e89969752bf469d0a0ccbeb19841362e984e20d804000000000000000000000000f516e4f63fd4ad93f0b75b18b555825726a6b251644d342e21dd73c09c051e500825185f007adf73b4f0fbf5f595d3da2e23033f2d5e6fac9b9a2e59988abcf28a987dde512e8ceb5b1a56261996a775e75d1cfea8a8a6d59683948f658dd55400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f37a3ea1df0c2cf81ec4c7659a290aa3ff6eb44ead8bdb739208010702333e191980df3db0051c13bc041c9a0322b22d4af59ae7e0085924807572a8d9fd1dac8f42835bccfc389ef794e3c322aa39bca30123fcd66fae368acd10e9ae15f5a8bcd975faa02c7588b084ea80e4ffb33840853d58597802e1d0a62f335c9d27580209a7a3ba9c165bbbd2d75616db4c71539c562462dbb48a18a00f0d805dfaad43021fec42ee2ebd948b1d59a05aed6c50b74a0bf75f3d413d012b5ab1707a5a93950a0494991999d22d1029d0f41d8913582e7daa66de801b771e518735264cd935efbece7c2803f70796efec4efa8d11a29a61c48f472e6c56eaa1de7de01f4b5a0f021180da0b76b5c47aa89f389a5c06b9f96ff355639c7aa9ea16c50bd18cb1e4ce03219a57cf43b280192e2eb972d6bb41f750a96bfaa4f940f2158f69ef7f257cb602067cc8ca9aefcb44af3447a980fec820719b01b63af1ec2f43335ba05e3d23870326019b959fc77f36fcf22b038a709ed0e17ae2ef0592cdd06e2d7bc67bfd734c022a28a6a42a9c961362b2863fdf03b734a0f2978f5e86338139d6331ebb473d346f87a48a3b6459fb8cc9ec1790893971aeebe70fb14dfad6cbe820c3f96b5e296052aa5a346ccec90fa91135877da37dd892ae28c077ddc154ee5e50cd337da3cdb94f61069d97a6613d3b9f07629443f8bf448a6274d81516df982e73b53eb645afacb736a7ad5d38f31a66bcf92cc9710b66268b9c75280a6f0289360f501490d19699ef1bb4e519afcc0b84c9d3cc4fbac3f812af319d8992b0bef16922a7a5a88ed106a820643c041cf51b5f21d4c90d7f8f636db5de0e253a4e30fd88aee88d1f94e95515f83ecac61ea03b9e516031ad725a301b433f30603b5c049cc0f22b23a05583dd13879d21ba636a242bed8cc78ecb8212ec8be0071476976829e3ddef6a44ff3e76195763ccddcdd8300305ed92fc663110742b3faa571e7429fa4aae317af0727329c4d29f8dec6fa0123fcc58530ee8d3ef5f94057f4906bda6793b00f07fb2d9c68ed504b8a2d623b3aa9aa2527a56906e486c40dc47f0a502a6b578b406c5accbe1373cc2baa3f49a2e1488de32882035df75af57dc4f6fa153620784885dab17e02f39ee2b7048f77a6cd2a3bb7b7a42af43440a7123c83fc4cf9c3836487acd9f1d8d13262523a4bb60b24206c4a7dda48050444c3450d7c607e3b60a296daa79195ace92eaea46ddce8ae6a48b3078298e88a2b6a2f21cd19bc13865e33cb3bd4a6c10466f83bf6f87bcf5751770a742e72d52a5bad522c9a06026cc30eafbf87f5798c71420fcf6746bc4836c35dfb67b0035c7f3d4a6269f93b8598a4475c13a42de93a2116dafc88963bd824d1dd197e70cefd6ce8e1d7bc78c8da65e700e8d657029a346fab9d13661110c79740baddf0a6a616ae7f64843287fe5f42cb5af3fe2fab7992164433d87fd8ea3554b9daf2f8558e13a7b6a8db4eb075b720d9299d688a7fa650799a409dbebc59da2ee74fda2efd2232f77b2c682c54a619181e27ba54796df2905e410e3d65c91fc0e5a777c913adedd4cd7c8a33adf155924abc7bec73bf41d2cddf894de89ca93d3bdb6a3194313b715ef4dd0b62eac71f70b84271b60f4632c4b117c49435469688366d8808cacfdea69e73ea476f6378958278fdc0e5643138e7d4663c7962e738164cb56a169361543906711e462aa54c8c402fe269f463bfd0c204a17efb8a8c3857dbb942237467e33a921ea390f82826f7354a9a51590b000f12bd1293a450b299f149057bfb05bd3f16d4dd2ddf3ce216ccccc023272ed759dbe30fb94a97f32ceaecf74418bf7a487610e05487e2ea276c0e3d27450a20a456a7f68508dcce9fe55b03a3a105994cc2d2bb9a6d82e86a857681049887fe77fe7d81f0a827846e6109101e34ef16042337fc6707be0b7d42d8dcd8b7c35dc8df59c6d04c4aad8bb1b8e2ad7c6899c21113d2006579307a9240b04d6b5f6df9245814bb175c320e0b7a0243f2e0ac78ecfeb2462d4d6e86c900f9f6140122d6c8f72c48e05b0e965b07be7246b3f343774a2b227ef2698c281b3abc09ae1a1cedcc5a8095975a6aaf1cf9ea41f582b6d7947822f4692772c197654a9992b361becf2fe47b3b8f2e8535e369c542367f46b18b755b60bf592f3a0fa9ecda5bc087a345841904a2a52ffc2e27769dacd437a460a110057d43f276f47325143d143c5b2a7d5f80cf08da54a7472934cada35b6a440a6cb82f84c9dfcbf8feabaf152a215b1458cb0e9bb9c3c576241f3dbe9a4645758a044bc171ad958d6905f3603cf1c52a04fafc3073861717ec2e8381147594b76bfd528536e0391ebc1dbdaaab129f6ec1110cd91f821a3e4f44fb0f6ce846ea98c69acaedcb400c", "6553006553", 0, -1056121628, 1537743641, "e8a1896e76a3f0ec21a38b38d09471b307d3399f5a54734bc8b400d396b5c49b"], - ["fd682d4b0329ed0227ca0020eef8c8f2679f6a7f36d50c8a1eaa5d092f6ee042929f66799f010000000663636aac6a53ffffffff4931399567bc887becf50c7e72a6492fc9e8586221f031ce2f4495cdbfdb101903000000035200acffffffff1ffb48a8896e0fc83361af52883d48a0314f9b77543fba7adfca35617381d9320000000004ac65635381a494f30462066e050000000006516a51acac51ca15ce02000000000652ac6a52536386740e010000000003ac5153671a550300000000036a65000000000000", "006300", 1, 244863857, 1537743641, "851ae83c0ab21df5bc01444b4c0ab3cba6d657311df6e9fd6749e090e1338c11"], - ["030000807082c40301158191ee260839eda74534667125e0e563bf3cc6ec0bc6c030ad4536981e52c700000000016affffffff0360f9dc0200000000076352526563526596e0b000000000000252654c55e50000000000046352ac657c1914480000000002000000000000000048038304000000007b45a6a967192aad11228093e00e7bc88bef6bd42b4bbb5ef12e1c047d9f31883a906f3e40c6d4eef197f741465263910de06f3435f2d8c01b5707b46e4050a343d90e880f55eaa836dfbbd1b842a23e051cd392c9cdd98e2061d66cfc76e46000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b473332a598d42929d1b7e279c67b782fe0c9e22905d158ce2e71df6cc16589267bda89b558d2d1fcd769272c7508f8828a7b9e2e2da1ae19e265e0d2802345da2ec37fca941fd102cf5eed07112c1c82e0e7c33a41c5c45b983f84336bdec95998ee70d75b5f89757b1f37a28c11244d0df0bbbc3d5473f74d17457e6b5bd790319ec8347034889f4fb2670c4cb5a5432909ca2f328ed911da2226c0d1bd31d2c0214cd5309416acfa2886e557147f0f56e56f7e2637be55f651891441870da2c3a0a08b8f4803eb29a2083574084231b0805c0e38fc326f8980fc392231ca46ba9d1a6d0841d164e7268aaa7ecc444cd6f8a13523c962629a92f5c784bb726e9054d03249bc7fdb5e89dca592972ac75c1b0fadc511c033728104edf2fde3a201197810309b882ae2a117f3d12389ae089393fb50d5364fe161fc40d0a695d76aa56b44f03108dcd361f8820b6ee767b461219a65893734ffa837a9933a72fb2a7485081e003149933dfbb092565971488e9a5bd5a823ec75a8e92f7b37b686c47be7eae2faf0306b3be29b87ecd3f8ba5bde438bd0cb2c150bc1dd58d151339d73450d5fc5c749d35368ea0883d3b8fc7bea2f3c77f0e0d0d2a6712b4aaf296dc1b989d6401567d3b83857eac4377aee732d0ebd7f95f38ab1eb59a45375e4b9a14e528b12c1776c8634bd201b5543644d268c230b696051a700ae36dab7500c2c600d7cc2c9865a13481946c0d77890aece0ec1e95bb2240b15b3c136dcbccee787632b82e0cc5a324d4d7606f992f9f800f7bbcb1764f0ccab3b9202845b377a5aec0656c648d8f56ecb0cad12472acb46dde7f932c93ce8392077480003fae79dbfab21d61543b6ed17b53ae736c89ff056e2129fc64e94cb73a7b15d31ae5c440b7a7d6ea7c8f00e1ff4d4f42c36a786d7c4eaa11c57fabe725df00203373be4b61fbef45fdd5f13368349dab5ecebb997d0716d322a13ff1b7ee95916c791f71b73b8b229d1dc2f97efb7ef88664dcc880457921757643e2bfd1a9acc2276a5ac9e5e274cb50ccdde7bff16812ce92624feb38795bbc4d480a69318b9be7f3a545a643ca7043c0efe9ce73c1750210e2e3ecddeb6028551e6b0f8eb676674dcc9874cd09df52dd17935dd4b36d7a125364dd04ee3d5d2fe5f8b8cd2d65bdfeff437e8c9617b04ff1159d2cdf0860ccd93781843b7504d065ec689a0557b69892a17518f1fc889536bec4097062beaa94a60cfea8a623030bbbc665f122da2e6c13f355816fea416ef609e5260d8909d8f1634f4bf928a414123fa8a4fdad5d94e73adcf6587b27c86322af2fc50f37482f8b513dd8cd97d3efed1c15db4aedb79f979a05c8af1cef46f615563752897a15a0c322cd8791e4581ed86fb98a4ad4ee48360737efe46f282c4e5555d6a76d53a736f35be585c3c522eae06cc64ac0f907855807e1ef9481da0dcb76a2b3c69c31616ce2a6a4fc3f640aa7c79ef2e08cd182fd58f54c09f5f0b0fcf0b74838813be59818b55c31f875f34a257c8b6af18abefbb2ab13812a71048ad590c7cf24df1c379ce143efb7f033c6c9d0e2302182fc6a62ca8bf6c0ce0c3898dee6a9de4da49752a3a28ef6ad1e2e81099f22a43a2a55eb0b0c208487cece493928bfaec7af5f887d0851367137e8c03682b6fb3128be3fa9f20da137528d6c033fbbd4f8361b50f6762b22d3ce43f0cdcae009855628d8e5de2178438d6a8b9fe3afacd2c941094b360e66f5fb4d9902e70d471debed1165fa566b12100b4bc32ac51066813f7a9add0178432e31de383d4725e69c0118179ace765e2f061529914fc541bc7930e6f1c594270963e934c1f504b674ec2bfabb1800beeb0cfff5d7632b4dcee7a3ca62652dca633889c8b1c1f363109533db2b3acd03c69b9ffb8578b0688fdcef860cdc5ecbd32633f548f15aa4e1d52feb3f81eb3b582cba3868cf56a812c03e68222e66e98b17ed545dbe1d974a02576269f9e0b09156774333bd77e8afd82f22da86ee620bb17db827a948791d85b01aa45cab5ebd9e259bcd5084b697f055eea318066137354e8c00338960f15bf37408aed273391b64a7a3c97e108da15f281cc92a2bfe909150f514f790a734109b31413053c4895ae1e1830b59d8e3d1d7172dd46d82de9c7a345972d05176aad720e7cf3f11cd5e60b7c3f5834d9e696c174a713c1bf7c8c32637f7b6ddf9927a468675b4fe1b00628973d0db5ca537b9cbf242a316a62917acefd37573dacd6f8b143b56d359709cefc556b0e3dee5ff34689101000000000000000000000000db571e9e9270c95cba50ca8a34f00158ff82d0a01669a3d19185610ec2bf233bbf63e3c13b04b4d83974f160a3d6a8d99250bb45a3b81e235411f996f88251dcd0a28fddff9af2268410862d81f2f48685f5951c60b970b271f58a48f1ac20a1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b615ca2d375374f1db74950856e19e074d8b310864fa0a196b89d7b233d0aa8b3aa1b6b3ab86883e28e9ab28d490ceb22cd40a32a698e75f37ef86663e92ca48117a9604cdc84c2736a9a0c4834e1371a596611ad241819bbcd0eab4ebc07c77332c9bda82f844c59b441592809849d8634c8dfc806fa30c08b39bc2feb51810303ee170077427baf7cd1fdfec9cc7e317bd354490e005a119fae56b0eb9bde280327751f8fc403914c7ab23441ee7b5878ddb2546a2b70b58c46c77507a4e814170b04e5bd9901bd7be6e0a5b78a92fd0ba7255a9ee08bc4b8db6b25590c1b982bf3a94915cd4b0b080b51bf12082fed38684b9781326db6f23aa1049a613e4483f1022973c645a5b4f192f745e6ff1a1db31d33336f0b558364dbc4566f492cea033c02208adfb17585af3e81417ad8c2d47aad06b22a66add0a973b988ef8b472e0e48032f101f1b700de41da87b07b0b1f6889a24b04006d1c6a30f965d6b0338b12499020667be3ecb8b482bab8944c9dce4a85f0d348219f5d7f60de8fb1beac51f74bb0322824a20a2adefe7eb0be8694652928863c8774a0c6861f01253b0af8e58057dbde7ea6003b0eb14785e72a06a041b004fbb98d85ee2e5eff82f3f6734d4e156527dc1fae8e7606fc7a5740b702d55c871088c214eec0898038afe4afd9d6687617f4846862a7f3590431d154434de8035cea23c102e114d44044e233dddb286fb620f37139d34f8a4437f7998b5cf134edd8edc5c8ddefaf3369e0e56d5154465d9d69bb3e4ff6faa0e0a158f4bac3ec99812c61d0479e40c1b10ab69a4bb8b41a0306897c70e6876c0a0195ce5517223bc88e95cc6e356b1380fb648140d14df2b375548e00d6ac6316629b92c7a6386425c58ce308f4c9445e6a38deb354ae70318c0adb1ca69160ac6a420199731c50d36053d6ed1413fc47477563a4ff53a18cf2996cb794b7d79c5c05052ac799ca93714bddcc3c4dd103e931572530b48471ecee3add4631c3331e0fcfd2b0920545b023895a8edc09d815bb62cb2fab41c0a5559a5e0d27df64bb03a36407988479071855004b79af95e560799e963dc1b173a3de51c0416cc71cc4a80a7788817418082acba224bbe68155eb5094ded288f36fad4d63a0556ed1005a7d2e9a9af9f1fee37afc561daf685af1c9f013640edb05e2f0b1a63358bd519824994455b67c23750e5f5eeb1f3f16fe0b08154255bcdc460e4d7ad9f8c115cb1a0a097d037420ca5bd2eb20af35a02170fe64f2e0f053594d78cfda58614404054b2d453914bc127794c59a13fa293850d423646577b008619dd87fa7bc430380926639772f958f4a5f28e92c9023d7163d5efae5322013b88c83c992449ba3779e983ae5ceb6694d280a6db6511702b9950e586ba6f3b43d021928b325c917978a736ba6e3b6095b64a47f730ac5197838dc887afdbe8cb78ea430cb4bf89dfd39dce8e3e6b886838c9273ede620b0974d87f6321e1ad508dcaa810a1afa2b624b60c67b0c6f9066d551dccbe352c1e05731c4c6a10b6384b5a45476747c57defa4982f14344267058b46d4e2ea657a941147c6ae70ee6390bdc910daf00441cf1621c45979cadb055d970c4b8e2659253ad1b606373d9a8bc99e4331cfde05a9b490c448edf063bfe5851fe6f8696cf6268e5b6136b8076ea2d312553cc9c72462a523f41c2645c36d336bfc701a31bbc45173bc2bac657781e8835e4822768e3cddba36da42f81faf336a2cd64abb0a98bb63f6bc770155cef1e852f11207d475ed1d540ece104d124766de6ee671958310a891b4b3124858c150b79d24eacdfc33f14ed07049e293110901ff86365f53f96b7b6786164cb9d8fb85b1036b7a518295ec310df8a45224c777becffd7d5e551d4c333a3279cca368ac9e8d71e9e911aa0a05c575c19edead2745e0b3b81b55fedde40baab2aa9b19a9ff07b421ccafa79a523e4228bc80b260fe346309a8f3c158b07663197984cc278e69e28a285be4a2940505a9ea55b8a47f970ea2cde1aa688a443a3b9b9e84f5440dd48acd1f1ca61d4ce2edf0904cbadbde4915cecb977498e2924d598061f51ad14787d841a170980c9e711dd4afc46e41d37656e15bb61cdff1dcca55fd5ba3debe80a581e9c8ba76df23c7ee48ac11e3fcc07846a14fc097542fba20b99f1bea7e6adabdcced2e10c558b077bcca717774e6db6098e0e6b3bb119b0c3f0b3918b078d8b5455dc3d3f08143bfbb1e5ec2942e95b74ef4dd66b95391259a4fdb65a30f5ed9eac170c0dc1ed55402b0619b0839ef54ca78f838ab35c0b59d40b5245759f7226a2ec5970056a81d042b9f43f837182fab0fe6a5949e842b1ce0faab72514234a02368e419ffaaf9ae6e1d87d6ccc38e857aaac1603e24c5d813afa66115846d08", "6552006a6aac6a00", 0, 1007148517, 0, "0997ff16c4af280f0f892c47be0ca038dbc9ab85824d6ad5e1d467ed787c7ae5"], - ["b05f5c210125235b860741305c50c26065fc736d29b34334f77d1dfe77cf6c04da620650b901000000065151acac5365ffffffff03d7486c04000000000097ded004000000000551636a6352880ad10400000000096363ac6a52525163ac000000000200000000000000002ef1f90400000000d31c6f9eb4b2c90c33dc611e91761f6e5468817311072d9b5ab190a79b82d4e9a231f5e6b34752e8d14951881f39d48469e5d9bd66221c78203756d8196d9d9e2b8c425ed054ec5b53eb1c11dde4edf13e34a19ce07cd1a52b4af1bd4ec9fdf20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041e92bfc1edadbc90384d90f1cee60a77680c126162e614018e7f0cd0dd64284faab2eb78186431ac78843ec13703ba9db9cdf31d5cd99b578da20eecd2eafa16a7f5a38b5cfbd17e94da24cbab7da127a7873607764b20e9d4e06e86cb8d343fff54192c9b1c12961e068f76f62a91369653cba779078662f2cc98f46475a400221486f7dc5267e9449ad91f6930a70ef2a0ca1e2ddd5f3b6e54710ba87e48f970208ac419622406adcb6db56ee01514e6805e4f4a578d6db20e9645bb23bd62a250b01f0c10fb7bd131c076aba64f4e391fa4455b38ffdc353cb227bc5a5453af535a5ca26f996c004bd0ea6a676b4d68fd65aa50bef2d60f54ffeeea8129c3d08c0020b64e63cfb0c213ea75f2b426db8a65bdb73ac0d0b7a4a1a046f3c7c2942c673032dc5ec23b1fa6bb6a883a44f823124e44d024036621bce9d721ace53ceee0c2503029bab8172b0d1ac1c000460896df31b5a69ad68651075eb864ba70acff5fc86022909754e7af18687c6bda6100d6955764ada498a351131a120b1d8a19b89c8ac02086d9e88d00392d1704578c7f2c7f269cbeb1cf2d35cfa0444e3dc67e343ead01752dbfdb1d35a79ae7929c67afd209e8b089b8427b7b9fe9dfb21855f28535751793becd9c6da4a1cc773ecdf93c20329118648933581b2862e814035c7f1f97b75519210da204416daeb1fdafe2c0da1f7630f3e3c24d2d946a117d2123ff6ecea3f5a0c6b41bc1030926d251b45a738f996058c188fb3a047b71e1c70a4f67478486a9bfbffc50663d14130f639db7c3bc18e20e79559d12117122f4433e07197f9449b8ab0a25a7f95119c26e719b2fce5f2373b684b680fe25ee0b70d3d77705f23567335523d6996df12440c64012bd6c84ca1d153818de94519ad5f923cbe5874d4a595f46a07520f726308c13b6f1ce162853a239b9610322e1f1f3d80f04ae80e8b8dd5cfbcbe21f81398d596580fa03e38f77f5e0118d965e6367b823085a618dc7a9ec3f1cb9ad5be902e8196b8f83f69222879661f3f15bdc19befa8d728534532831455ac8347dc2e706f071ea66db6cdad47c42c625de4a157a07eadb351da9a5b6b2c9a7ca007f87d040bf223d0a9d41baa80c55d61d2127fcab7a6aa5c3fa1ed38dd0cf1281679aaa51fc38303f9649a9bea512f42428ba2e13f28d4b7c9102505f9cc63ea01dcad9a6901f07bb8991e1d989a3a542227e83ab57dbe2a942049abc30a191fedb24493df3876abc62e0059f078e0f5d6b41019b00b848145032e3ac0bbd2688b8e5370719b08fe60eed72435f191cbcc4c3ee128ddaf850bbe5d07a380538a9785ebbd044b523de64a9121d927bca70290b455e110aa47eaf9066b51b005682235a177c3aef2a3a8b74cfb64d987159b0a203005b34720cc91db671fc218c0341bb69cf9a377fbc33fa6777b8a8560163eedaef7d4c1199bbc1cfa359edf0e7cf3098f4632358c378d6ee4441cb957d75f8dd50c7408753f632385193357e2b27ba77e0fbec55ada3e650fd7019f83c484a9fe0bb983e78aa75c7d2934b7d9a0f8e9fe138a698e2246a7432fb2b5a8a92ecce270b6013d9eeaa739947b81925ada80c1055dfea627725e73c150737bc9ad835e3d8ee1047791201e413f4b4f18cd3e9b98cda11cc529d7d11b639165c71019354ea19c959aeed890bc2bb2f3614488e0e71185bcaca5f3ed84b2020806a3383ffe690ec2d8b9d1827af192a6d2d5c6ef1cd4c3199f963696dc81f2b0c50bf39e320a3a5dcde53c4e512e1e5cf8c938ff66f429b8640f7b8e6b5a5fda0bf1d662b5d6eac4b30e038786872a62889d312e2411193c50454bb3e2cad86bdfbcc22dcfb7f9e08748b817cfc974d1a39e9d828d5d45aae0326d26cff6972c65f0d5d8f254ff5f493032eebe1f80da0994b2ed6ed8bf49d2cfebd84cb2734405025138d06e76093b9052c5a5b98aafb9bb43e6534d06b94d83bed5a2d22124e2b16f6679ac0a1487a7685fcb208ebc3b317f5931fd7a156ef00f4c23101c65ee348312f591fe86c8e4d4b56f62ca4f0da7347e1d1b935cf5dc2991a95fe207fbf600a3fdaa6c0719ccab00eb60019fb1bd0ca48e936352583c6bd26425da506705478eb1e67f7b96a4aeebb2f5f4eacc72a545714f6054628dd68dae14cb4daa7db4bca8728f4c94518a9895365d80bc2ad791a277e2b4218eb63661949b174e3ab42b0e752f6060e35daea86a45ac2a8355de12c4db5259de652797df992ec62819bcd3ede08802e7d01dd65881e11ad434fabd0000000000000000c8570405000000005b1f166474fcecb8cc03ba88d95f4ff0bbe5922cb458d7525c44f19afa82dac74b9add21cd1dacbabd98cc6fe895471e5d4d20bc423174332066cb8f7e2f4c669dcc5e325b2f063b0fa200cd7f2e95d5d4877c8ca7f44e22dd5ed0a92bf6108e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000adefae93d926962c28304cda16efc1adca179a3b4759f03d5be2017018982a916073f0e5d55e9b0a7b064059f4f8869fe7d52053eb814c6dd9ff88c7b488e144cb1f5e6f649e0fdb8462fb65e8389af9a3920a6f79d94c19e620ea4bf2378cc03ed42ada89657725d857e2c87ea43c406f803baf3b36b187d5c54684ff974e520324f3b2982c96244115679a9b446f516b3b817f4c744a1f1d08afd4fbdc0f1b7e031bb0fabda1a09a01fa790316ddbf60ae230e6cbc9bc922791036a5cc85b875300a012dc9d1f3fc890869ef01695855f735ee31f9c34a675109c6a11bd6140060fedc8f05dc819603a125dce0a30ad0007d7068b60c6badbfabceb028b73af0e0b70218c8e6a89abe5ffd0f29c69c179b64ca8b487111ed7f895d8136170481de80c4032487c1135ffa9d54e72b33a5b739c713cae401c6d74124fc2cb08cf408637ac8031e9f6676d2ce33c95b4f6447df227c05c36f585ca2bb3607e7b30d6e73d641c5022fe019979da658e4bf70a0da91c2878b7a7f718a9f2cce42b51c463c7c2b3470030988b3a09ec9cdd3244c6d38e75982f42f581da5681d200b18b9bacb32642d3c518f90a6ec319f00907d670c2f96d3045848ae67ef72aec19cc9f27eff718238efec7d6e64df0d4893dbe9088e7827d5777866edd66422361c436bce67a3e8e0ac3ff1bf1f4b1b2b04cd0f13db07ee3ec98aa988e99f385301e8aeb0b6049e0009f9f69f1457f42473e61f4c019798a3d9afc6b8eefbd8ff01b9799e71d526e790ecedae6503111077842ed185f8da233f19f1e7bc877d7fcf3dd72b657f5828b87da4deabfae80d65144691c42c30cfcafe962c2bbe7f42d346fe114a9ff6767f1f16c4a4259ab4198ebc789be28720441e70b9e6b9cccf5a0ba395949a18e384bcc1fe012a4d9b6bfff3af6f1d99513128dc7781948dcda656f4dcc32c05c188d6327e9ee955f7c59fde209304151ce3423082cdd536bb548eed954cf07e41caaacc70edadae34145ac624eaf155eb2de49895a4851bf011de49cadd7cf0d12820206db6569f1f8e86016008f0620014b80bb0980bce77baf07759b882298844041cb6ac64474f267304b0137839651fc53a74a3240a941c49eedbb8a8c1a9992c331c509f8d2d94c0413106ffcbc60d656980877818ddef44f18a6d5e4ba27435be1f0792c1e75092e179d7692199f8b75bbf0c68f5f4793d91b852d96fc1af4223bf267aa3832018aead15a1ccda1bff4575e992bcb0b8e7393f1bb6bcd69fe347973d36f074e155e4de871f03e7629149b1c43a55bf4ab6e9cb2d7409af0e7e5d7cfbc3279f9c644c2f40e75388088927b1b4d9ffa1ab49f4b167e4e8dca71edce9ea1038bfca03a2c01d722fa3709ed2b90c20772e61879a6f5624c8569fcbbd3d9fe308c8d449ba3b16c8574cd2048c416bf0387254744d2f0652b2bc38f21e16a045222f78d39cc3f02df4b39abde40e7011a6318f06f28dbd8b2eaa3daf80a52c8473c1fc948f348c803555e520146750b145205d38755a64076ceebb50fa8c6194a6ecd9f58669cf80d442382104b54b788253b57b204e7b214e54ed42c4d9bef02b46948ccc218821474034e6a9b7df96dec0cd0d59ea60908fb0a04b881b211eedc7d5623987c8c3eaa87efe0aa1515234307279b96e9010e431bde192746030ffdcc6dac997a2c3e4fd756f2f74d4b1e52e826d258923d217f5b09bd9276b78c2b153009f46bea00a9bb857c787972fa9d9e0a758f9adb8acfed3096208a5b211a2bae26032e6c613f4b9782d5021ba7649340c8f07585ea79dd5ed5874c0c6e5dc9a7b6585ad8dba5d2356793f5f5d994d89df07bfd5a4cf54f62cb7d488d92a5f2fbf46521a8b34ffb2f78322ca00ebb0001af43a4a5644845a88242c85ac2d4fce33119753fc7e3bc60fe5de1c1f7ae67744295487f994d7c932733ced01e01886422ab616bf4f1862b4a50d81542cc3c57f1f019907b05b1ae6968dddc423f8d5f4fc76fb02ecb2b2bfc0651499f20f12c3b442d4db460c83b119141648b01c734fe7f869d5043969286333e999e97923aa8c1d8b812b559813d2c9d95af6c73318443c0b70853d0b0ccea27a818679af99f4a8f8acb44541962aec1acdf3c51e8efb7a51635fd4ce48790612d8e4f31a852f9ce8e723867936ae05724670be1e5703c98c015559518426271cfcb627c0e49d7f630289c72785224650200840a44b5ca8efd45cf11a449a5fddcfcd81ae17e7a161710f910b9df62032cfc3d9a716c278a1c99877807ccabffa162b5ba39e911738338cdb9f5848fd33702914c304b1e78616c398f81f40a3450211b47406df0e4d43de0075b5a4d140b412b1ec77b13e038ad51a6fc1a4830741ab798962a16599bedb8673f3d4e1a314236f0403da413598717dd007", "63536aac63ac6a65ac", 0, 1177520479, 1537743641, "f89ca5756a0cf30f41238bbb561f03a459390c6cb9c8aaae08a40c8bb50d4348"], - ["030000807082c403043658c3f11f5690f43c9ea5be81ae600bb5a94dc5495e2f7e13cf610d4e04add703000000056363636a53ffffffffd1a5b78b20c24299a2a1204c1338123ca3f6bef7c068393a34e1c72e5f8c717400000000055251526363fffffffffca2306e889bd77f32696c465845d432c542cf1ea4eff879d6f0841b8201afcd000000000152ffffffffd0a5a2ceeccf12640610f219cac289fc9fc7bb5a5e549b36ca0fed79151e74190100000004536a6a63ffffffff029789f4010000000002526a527fef0200000000010064062179000000000290f3a405000000000000000000000000414a4ea9a43007e13f38970fa2a3643170949e0e63f146480d32dee216d1b8d9bcc4752568cfa4930fb972cf9d98feca4ffcc61d8d145ba56c0b82739bfd8808b730abf060e6eb0220532ade451108dbca8c94413ba574a73ab34f048d09098b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002eb4f737147403a571b9125d41f90afe04b7a1026c7b9630a9ce95051b9b5e8356d4c83779c63e5db451facb47375dc45b543000b2d9df5d7b119d611d6a40a6db9eb19a1ce570ba59204caf78eb4e9bef2778682cd0a31545ec3b3b818481dd2de0680cec6ce19dcc350cd3cb02a236954c2f0ed8b44938ce81cde350d111021a6b44c7afc8cbffe48148ad798109900f28f0ce473bb0345e27eb6444882645020fa3e9a479670619550cf38e95578f770a31dfc3d61430c198e904a7ffdfb66a0a04f829de4c72c7b47c8c5f3613107691234d4a7943a7672e235bda02f9ebe7fac190af2cc8b18dd87dcfa6ae888065665f357fb053d121ec656ce0c163c26bc20320e1948727ad8d55faa0aed33ff278319d8cf5adc4aae343108ba748a9997e5c031e31f330b21e7b57378f881f392bac3025cef8c9a7f0afc557b3ecb4ecefd78f03166d40ec46584b883ae0b2405211eff44afcc2c1ab3a4a2fdcdbdc3eac9127ee022d89b71a7d3c8c8ce22c4c287aa75c36c3782f7ecf05596f47676351a636eb3f0203e539500f0d3755424da8c2ff10fa6dba8588b954b32d1d15d8dc148533b4e86d58dae5d5fc52008266f2011cca069a4095917d9bb65d54a84406d4a0196c1eed1f0f6b8c82e10347be3427c4467f40e30b09587a054310e35a87d831ff83e7deff27439ff56e7d756b8151d18a22697bd0edf6d282f3ec61d6aa0f7f12ab8482fa4f2aed8e5e1881a5b181105b2d37fd3689a40f1a1ffa4a0634ef1504d9e9f37b1c39e61661b2d3ea9295c5c1ff0e3999918e007c0a2bb6ee498e58f97275fe598b6ff2db4cdcfa9a89719364a4c88b77f491da1f55751fe1f54fe447e1821263341c8a8fc6916398738b93207bed1c1b02b7245a90745dc2c7e8408793c1e69a386e40499709038b516361ccd62c80871238063ec9322f7f19a2530d49fafef0f96c838a2741d65a8af60f8cd9541c967d042f7803bc7879de8a7716aed59bddd78c2fb9887bba41104da2a8e576158b7c6f62da42376f3f94101e7298689ac7e80fb683a851d7a866be5a7376dccb0303daf9ad8e8c926a7e2ebc69afa808a7fc73e208d037d863ff9ffbb54ddb8bfa4d6093c168fb036ce7edd18be9602a6068d8642992ac53e4f48330e1ad2c6a96d550098e8674b07d612c306ba00b815d81be4d602dcd47bf06be62513336e93dc7a89dcfbaafd5fa3f681e59890cf627978ee2f7c8e135ffa27af77b0685bbc3b72c1288208b4b81ecc6d12e6323427ca1cf79304ec16d9526f252429fee1fb18818e5a4687d77e21d4b3e7027ce93b4171d2101ee4d41615d7e5fa6d41770d7b0f3e5a036e5499763d026f3769073c4d4e98f4af0648c4f2b91d41440d4841f5bd758c86945150e5412e181b5d99acdeddfd3065a090e0b12c93491b4e99fca4c43ac4b6b79b0cf80f409a8bfe12de40e5658a51ef1f9d6f645fd55088d254e8b99799d88fd3c791b52197d2c2b143e29691625170c9f1c3dae6c87b70e7121040727c28f8e72d3868964e91cb1594dcd7ea280a97b13775fbcca85ff807535f984cabf262c77c66d5f8c1d83c196922b0a4c1fbd96d359c446a147421a777529c459393edf399fe2bbcf444ece912d7c9723de81322caff2575887bdbe4051b65815e58222964ba8909f8edeb8ba73e8f85117ce6a6fd470322677a75a68e6c37e95ad4f372b1cf9d457f06f4fa5d1b81b539b44b1b49e524e657dfb1c24c1434321cfb9e63405ca6bf0686e5d58515da753bf109271704b9600d1c352ee569023f27d074962f60afa598a59c0b5a2facf6dcf201cec9e0a7e5bdd701d3bdc9538ffabf9d636183870e3bf84a3423a829de75b5de28421d3a3354942e2d2242abd699285213f6c7ed5fe66cd70bc8ecfed9e547dfdb43fc083715e17dd518d1b8b8456476b2576acf1b4c3aa65ffe3bb99e169e9762c52b547c60d01660de26a2653937136df80ada733542b3ab0784b8762c5ca00d9777e1ee36d54582fdca1a05df818c68f5c171844098ce66e2e1cc322b863daed442acfe39c8f1689dc40a1ae8b320c5be9c7f36a710a51129675bfacf174ad3e11f7d7144c8ba4e24e080b9ca85c9db1893768bda4fd8793b0d092d4201e6f35b51f24e2a9016eeddec491c3145f55cf52f56e21b834cb3945d05cea59599dda500a70e7980114483874f54e524c3e06b086ff0da0cfc9b4655a8bd27894274d18c0b7a74970454b301b82b93c333cf2059ea4699703659cfea13509c9084011eab01a8268d593597530c1ed040000000000000000000000006511ff705a07ff31a721647a3d444e47e7ee22e800ddd0e21963839f77b9ae6c522cb001b2f2c6c51ce1abf800577cbc3df2e30510026dd056c8bc45c18bed7b947d561b0a4daed70da0794bd262cdcfc84939cc64eb3791d12a207219fd545d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a3ac10668b5b8a95016496c46d97d56f7e9142bf34a44581b8a08dd4ab0178c853c6f1e607ae284a942a7d59c38e9d76e07557fd75f778bd0ff634be41f4282f52b75de4c84b7c588bf215184ed4a36a11c9a3e943a3089222f1910dd65a6bfc36edae82d2cd17628d49ae0dcb52994d7d8037e137e8b607136bdf5709d19f9503213bc0bea5cc41ec1bb676f8cc87f3ce9a720811000bfc3d4f4aaed41ffa9b7b023031e79d17423a4d93241d1161d5259f68f4b9af4ea4aee5246ad9c07d85f7ea0a026dc7437e0057e62af06d9c9bb6a79c1f0e887c3bc0c88d090d1e1a8d1511a84f17e74fcefc9df3e4ae9e26831803e1217b37ee76be8b257f687734ee9893cf0311875b11247c8d7f30fe1c18d8278186c768c72f8395c0a8d855bf2003785c1b0211bc0cfd24d5d04d4c8ffeb5288d0b1a8c725044329315a68866de2ba3dc56c40219982bda8cdc28faeacee97444c1bc8b3ba4baa8870952d78981397ec9c9d152020cfa7746c924204d83fd5082ca2f53c3ebb970b7b210c8daaeea043322da26d10317b041b1911c5de8fd93f5d6eca89b2b797acb592a4f2920444e425c68c89c22949034611a33173537cbb7318634749fa54b3be9f47a7081dd24abeca5ec92ad7cc553f5358c0da8a721a815811afb0e71273f3a7a2a501ae42aaaf62a8191d0a22b68fc4e585811516f30b5f66f3f0cf588c0c1b19ba348052b9b8e1ad44deb18781ffb7e6343349ebfcf8a5495928e7d125378a37ab26451198d75594a8cb42f6d93a6edbbfb99ddd6dfa5b367d433b15a97b5c78833f558fd345eb8ab3af5b0d4555bdc150103bdf4498e8baf6824e3184d9807b53d17c4594aaeb5af810592177f9452692d1a409cd610cb424933a743d65ae0535db955761b2bbfeb7ce790eec8d662c72fa2c7f73fa290c1dce47d14f9f63bf6d2aacf933ad4dce5f6e724310bffb93f3dc34d5a451578967a8c206e72cddda792dfe6fa9cb1a81575e2325df8d2348a9b20b7a70b7b67f138f07a34adf16e85042f7f83121d1d8603f05f82533b4bafdab30aa94020ca9fcee55e16f3e6c77c935b3bee3990579234850cb28c50223458dfbb60f530cf0208aa1f440d0ffa17994f7c42d6d66e9387e217123c53f7b187d2735ec7f63521b22226c3f2030c73d8052e6f0ef10ea3e6228a517ee115578906d6a7c76228912a0a6702037f81ec3da5a1959f149e9128fa2dd73350e9167164eaf03a40f940126bd5994f0fca6bd85716a2cefc26c70f1564f7fc0bb63d3fa44698b78015b1f82169632c1a60e9f3db63c08a0365d4d30e68f6a28a86c06fa4e8365d07c7cd6daeb8bea3db208229234b575fc3dbafd1991efd74f0418038d4f8356e10f1dd8c55ba3a87cf8f6f6f173d1118c6ec8c93593ecc72903b87cf3c47178d843d09e00104922ef0ffc877572ff883bb4aa2670669a22418606480ec6b558608613310c39979b2b968975ee6c2085ea1a852fc7246e43119d535268c9852d02be87ca9fef5da4d756c6c2c66cede2d80e4c83efa6bc379d41e922b0dea85390838e376465d428a4f33772342539632d747eb9ff79e08ce2be85ddd230793b9c43e5997e785690b3dc4f173131b35d69fd8686286415741ad90816d35bc5166c9c7a487c253c0659ee52119b23c9f764ea5edd4e069af6be1cad2dd22505035154f2564c033aab114545d6fe86093d30832bc40744e11088db51417b50ff0890800285d230ad68daf378778347eeabaf06e4c0ef661edce1ce84af68adfbd9070cfa013fe4a12748ce9ff85c59c45872c60726cbbc17089ae17bddd777d543a3f69bb4a54a4b763ff9e0947bf5616f9dfd4012630c3ba037c2543ad83e98b3a2a8c63d510f08c52ffc7803cb24d30fed32e22f12b9953e056eeebc8aef0058f5fd6553c5c1af6f8e67aeb8e443cc2cd614b601dd75755d4633554620c174f1cadfd5193e3ac273e612da2e88d85348a3b7c889a68f1f061be3f448793e7f4eb5b4b262456090f02105ed9a4010b3c3b3bf004742afa7bf041ee06e5d6bce93c0a345fedee17fce29fda1cceb4a40835046c01f03885d18a6ee00030c6a46f56457b2b571fdc8ecb403150c577b9c12d07cd07185d0d42814e286e0fec630baa1bc046d232869ca4d8de97102df547c42e4bb07a525b4ffd602cef73df3c382dd41a18eb3534ab56daa87db2917d22d9e84e0b47383cc0c4a18eae42e5d2a718afe8b23fdd733f225aad76fe46dabc69ca37c29727fb80ad295ff50ac5f178e68d0f0b7b35652b77a1e1d39b734069c64d1798e5f5496ccee409dc8f562e6b51a1a8b6928914e19908f465e725ac38b155daf5722c3e67c2a5871a6b5a6b815ab59c3038bab7b257ec60eb634f1dac80227fe8fe37a9e4ec3ac3dc28eec26298a07fdc52b95709", "5353", 1, -1192125732, 1537743641, "4a6ae0e2d3c081c85f222465d24a0420280e2d10a49c23dcbe3a800e303f32b8"] + ["dca3384204639716f2dd16258075981e85fcdcb404216090dfd490dff1803fb5e005f2274b010000000965515163ac526351536ecf8738fd6d32dfb19ca38c1493d00c4e85d3fa70828c3ff922f41e93cc6a61145267f9010000000200513149f7fa803e6e2d31eac862c2916a2650e3762d34bdd1480a00d0d54f69423689df54b50100000000ffffffffda59507626bee042ecd1b53bc1f94c8302b861d397c30bd3e50c6ded6ef077a30000000000ffffffff036a6334000000000008ac53536aac65656370e85105000000000100ab294b010000000007635352005353530000000000", "ac525265636a63", 0, 817108351, 1537743641, "dd12055e149394bda8b82386ac21cb1f786d5b6e9ee17b81521a3243718cbc1e"], + ["1859bb70037d5be6d9066d34ecd372791bb2eb3a828d0fa2c6bc538816d38824b55dae4c1f01000000056a0052516aff955429ca8ff9394bbd0e758ac6848c245b083a94de4641ae6e9c466c28d27cd8888a5002000000076aacacacac636a048924740ccc5932636f99ea4a9261fb747d1f41416f150aa6cf685810403ea76db2addf01000000050063656a52dc8ae957015e464f010000000003ac655300000000030000000000000000a869180300000000bc75ed964aa683b01738bdc42a63feaa96a292e46835b04bd6b3321cdc205947f6f65309097dc64c893d3314a94c87ef7df29063b36a3d7d1b5ef9252dfac8d3c0e4b89ca6baba25e598efcfbe5e09d5634b1324f220cdd7afcd1ab5b2e92da4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d7a0addca891a28c66cd327babe2320a8f438a4a96df47bbdef18b5b30aca4b8e11ec38473656b2c3f3ce1cd485be138bb2c4a2b363d9db43736811e5b4637278394d352981daf0b9320fe4834429167ec04ca8d1cbd3311ad387c94d7f9a35b1d59fa4199ab4a80c8019b4d4a412f24bdac0890863769b90a53333d86eaed9032e12c3ea4984b9a4de6d3aff2d429d386f14f73b564a3b90d3e53c4d6a0f15e3032262b1bd4e538b2dcf14a7d6b67e4126d52801fdc6cca92b49e056daf29eaacd0a02054ecc38c4013789424bcab28eb1e6a5f112ef48bd41ecfd0edc03dec94cd590c12f83acb663f9ac055f482041a37a4690bcca5d5c68d73abc1d1074aa4c7d020ddb814cee7a98e8a46304d64e2cd30cede08a30f143ecd2acdb9c19a101092f031dec114269139b85b1964773862608ea5e35d5e43b5d4622a65c03318cfc59060212212a236b93ef202c90417764a4315782b3ea6d5aad89eda1ead1895a572c16022fd660a2a04d2af4fe8570f916092389e3b4c5e73805a5b1a4fdb8a607d5ae68031d99e96bdd239655c6e3b7c5f30aeb2d5447733455a631c0d9ba1ce358d69dff77b958f933503c08af4f4baf88fb9ab16233ae533f24d331505c2e5c40c603615fcabcacbdca306cbd59c7f11d68b3e63b6a3c8dc091fd66625fdc55a80cb8a5a5d0998bfe5fae29d088af5e340e92d41744c73aeda4eade78c2caae8297c06f192ce4a5ee924d202e2b454b6e17cf56108c18da0f32ce141989b95eee9d63e1b67078f8a541cca6ff23c5ebae626cde0bc6a19a55ddff0f291aef0ec1cc34c1b45af11d29fbbe1f2be43c5c40f3bfd7eabee751287dcfa92d6af552d61074b901a758c3ec4fc291dc9dd64d78c12f1c9e406cae10c1dee2bb21c891ce9ec845aa1747d9d28b669fe44360028139cea1e77c159d99cfd21e68f82f41d53c98de4f9b9acfde1ab370e5fe4255a300545b506305b71269550799485968c7f91bf6164262679bda67ed2adaadd8ac7377d5f6a190f449e30bb28431bb5e9839560736821eab25d24d9127e95bb691afed4dd74aa1b07a90b41cb1751a6a3a1da402cd270e6d4621567a8595c58d597e14d0e4b86919457f028dc50f566ff7ed9b7a87abc8bb2a08e2a1332d8f6a055060c6bba6d7ffc334a6ad59860af54fddc1f6df7dabdaf63498d524d0762d90864bdc819bf90926d82fdd120a558cb51b1ba2ecd5dc273efc98cddc362a60de49e036a1ddea152e816433e551f45a13a517139d1eda2b524b27726049ec633975ab99f67b3b3282a8ce4d916691fe485acfa79ff8705bdd514f42a9f53002bd9ce462a274eba868a6ceda928a5dcb59753af9bb12c7fbcab61d0c08b67d320b238985b339af637d310f657d9094302b2f3f784e336549ecb764ddfafa8a5ca03bd3af3016f82aae32450830a4fa63c22c0ef7935b928f5aadec9e5c73b81adc43ab53568ee514b8eae8c443155f520218b621f46ca367a681e36f6fc7ea9ca89b83ad51be628c0c57adb1b76b8ede667776ad409c12d2802d04f26b3bdd0b175eed84f5fead7262a314907e0c9fd0522369004f79ce0f4afab40e5a8717fd09e849f519515845d8fffd219a2a191939b7cd891ca6efd3c7ebbac6c9aadfbc026174ce241d9a428f5bfd92533b1fe5d95d876ea940210bd6f81e563b1f9b3d602674024cc40ff459bb1c178a4c098481b4cf130e1946604bd875f1c976bdaf2d50c6a45b0d89e62753fead3ec2741fb2d8ee9f64d8a36a0d7a0bef4ad3e2e404e59208211a85cd48b2cbe6e08c7387ace7ccb9ac0926dc4fd4b1d4217f84977cbcbe9151e781afc8ad6e6693a26442a97f598815ae23ddbc7a734e0d94b8eaccfa49d7e5fd79df353451c51d4cf88041e2c3af543535ccd807a72f03e741646a06143e5353edbf74838279eec7295b9c2fe2789118d5a5c64569e67ea8f4e65e62fb15e2cbf5ff58424a7a518f062e6cd0886ee2a4cc62c18f28a4cec954fe9051764fadd766499802114f2e94047b912b181acb2ac433e7dad86867f57f42a203ecc1fc43f8d616cffeb8ef839e69093a458aa2786c6db389b965217984633b5cb3346df7fd0834351a02cfa682d9688713f4ecf9c93a4f6467d10771af4736af7e6aeee5875fccffad3eeeb5d31062f1b286feff7bc2e2afa384fb7d28fd2858466a56764e646b16c212e1737888b0dfe626b63ed7fa300888787ef766d9b2ee483e53139e3b4b93c0aaaca53a6f9d07aa88ecea30fa5bc27b48d3feceb2d3c32718d4fe64602f04000000000000000000000000778010feed260d8f1494cacd6db5eacd1ff3c452d2b016f69a20d074793ec0152b41c52b97045db5c6d587d008419824d25f7d1989a1931cc79bbb38fb02625741bd9536c851ad55a1f82e0c893fe145bb56f9b3f9515703fba2284e4471d5610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000068a17eb955b828e084430e226a8a39dcacad98690ef845ddec93b69183341a8b0a4256d3d88cd8d9327ba7f250b277bf36ece52c624cec56d4461a9a6968570d18a4c66fee3a0888aeadf36255e6c4d65c5775b4641a5568ec68006d77d503463cf202d48f67b5b8cb0692e3f42118efe080ba3f80d8f3cb1bb2722326f1d594022cff8ece8c377a455ffc05e9bbcaefc113bc2dc7a6f4d3c15ac3b2656ba596bc0300d8101954b7a7b4aacf3e9da13dffebebe54d60b6164cd401546571c662abb00a065fdc11af05d29ab71d3832f359f47becf46a4830d4ae9120b65502216541f1096e7ffc1a65c254995879aa5fd37e6860aa3a611df9992f6e74b74523d903dc02026d21cbf63c7318cad17ad40bcb90f60d34125bd45ad8d6c8462419cf03f8a003298d9ec50b7a2d8f456e72f7fbf5a350693b98fdc7fae7c690e1a7e687ecc339020d8964bd8526bed550c423a01c15b111e98c426e3be7ed04e5295662c778b6f302145b819cba89246d4b84e267d7d5a9e178a41075d37ec963595b93cfabde0228031a9bfb988fd70c4b50a0da69e4088db24780b4702a4dcbc298e454915b1ad2330460b9ad744b12b0abd7eb180aca3d6bd58409dc50c5898d27b982a9cc2b5ce228065f101c08b9a8da1b2579d0ec274f886c6a1144a50b300d5178cf67081c9589ab2c11a63028898c1760fb5196dd78d6538142efb3e8c180e8d0443e2b679e349677832b36a7688f23ddd5ccf0b330294bf76119207126d1b2db4f1ae4965a05d6cd9c3bf93ee2c5cfc12030849639b5ea3073f38dccdc1814393814852e7abb52d3d364f441a24aee1c31f43c36282c0a5de397666125bd68b727b46e7e82c898e00d23f45c0fa019ab2e3d0e96e7b975db6f5df602677c91a0b52bf52ff76dc1bdfd4c77c3e29bb273a6ac75cb4f35c3d5861cc2a155cd7f6cdaf4a30d2c959fce83d06dfa03006e3997c9f5b5758aa7165176eee96babfa96db207e84d277b66976204fad33141e646fb5d0e41ff165eee9cd663bdb93d025480ef2c483638fff8665a79873112187af8a653bc86e379f736d4f67a2b2371dc75bfb48d52a4bff0868265d8c46e0ed6a507f56c3506e769a7f3f9c019d0216c4e1773c749a3be84478f0041876a9829704d89c92afd96929abe0ec67cb882fd55209a4ef8673f9a077f9468f33d79ae33a99eb1151ea52a48711fc1735654fd8b25f74e6507b2feda57722ac17e574e4d4c286da7374acdca6cef5f79afb6164e8f4aee18db5c11a0d783df9304c13448c4abdeb5e54127372e9b289ed8ea3625f55b3afcf0f358dcc76943426dfd937733a0480cd62f88a0dcaca939ebf53bef7416b0048d6c292f5858b5a71ffa915802584c0595e8a29097759c77fdbeb6118e59f196be19d7e1ff04e42ef38d0b237ded5884be3ca3b91d980e0b9fa623b9b24289544b1d8ef1e9cd2a530b1621c2763d48638838728aea7bedb5f960051180355ab6118cefee312c130b4553870d81539054e54921c890835c7713c833ccb7a583067b5d135acc93e0843f76f72f20dc27b52efcc53b594b82a1c67c616e649982cd89b777efc38c07805f2afe8ecc09929e9087e913f6a7b27ada5c9b492e7ac7ade46d4d14c520f7a4962908a8991884cde3665e20ef9dab75d36804eb03bc3167810cc733305d1d6e758a43a99e186a7588a1b2110508e8122151beb2dc68edf46699d52e8d070133085c3214b4900e2eb84701aa19a4daaa288435bfcaedbc973a998a24fc15cb64e30c08e4ee96f96bad61d938ca2427ca27d7941821b959707b1212edc2db3d59432715751916eb8c12c511470d971b1e8d15817aa9852dc3b1a8b13cf35902955bf87b2152233cf9cf9ca75e3ff1da45dbbafb63ebd4deede79a07b069046072b914414ae4231bf6821b7a7913e4ca628ebdc8d1e687a4e6b04678293bddf426df027be35e4d027b4ac19cb9b637b0145c01af91850421f774decb5755763304cf9bc3f0b0827d9dcd11d864e350de39cfae008139451ad8619a9c2618483db77e3efe54d943e98655ce884a26c1295edd5b85f2b5101f4fd6740694f4ab151265bf19821c1dbabb4d307c38a6b487cc854c3e8b900375df4bff6cbca14e15b2ada6c4b1b48959d31d43d366a92d76300a4263c9fae1f32b613a26be1a88032b12addfbfe2431a1c1812171c4674255c8f84b3860b8c661a36ce8babb3d3f32b7c2a320917161c3267007602858b8fbeae1fd4328bf5ee049c6981dbe51f3a929a16e7186a3cd7365696682b90500000000000000000000000052ef3c03a00e45cc39473d105065421c659c27e4540817472a2dc9aa2afc75db67061a25cef45d92c65b2e786829f94cc36443c7ab52cd3bafd8ab4ae41f20b991769adb81e3f225e1127bc7ac625b92a27217efb98ef0ea7060e0d443e7e623000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a602c28fa48d410fa29a56cf653dd3589148cad41ec852ff76cf3c81600756742b486bc8fef08472bfb65cb9dd56f2d66b779672a27856cf1422312fd26f0e506ff5379317e22cf56946059207713c8b1b3768d80aa856b9760d43446b9571d3a70ba39ab4d32bfda4a2ee917aa36a02f1293c9abc658bd6bea2175cfbc6f9e03301ec6b9a49ea8d9861e72d4c5f285feef8458272a5952c63c80fed320cc39e4022f61cda6d211bf60377e9885499ac3304f8e9633209686fbe2bb145836e16f610a02e37171baeaa1962d2ce89e6c29b7d52e7eed9b4a1be7c14c790204ee895dd625e72e16d729f150b86fcbf91360c33f6f49ffbd530390952e795f510da1c68102061a5e7b3be7d6be960d8844116dd6fde3eb2b887ac9b1daec5ed2784edcf77f020fd6a88e3df9ac217cc612c7a1217303534f7f98e7f793727ebb22c6087aa8b1020739f727be16bbdb5f6fffafd94313d26e3a1596689f6e13817d7c0d142af425020180830ddb9ff6e766c964ea8296deb77ee95608fcabac4c2483f33fd2eff2e70313668414d3d133cc0fdeff8db3dfd088e0a689e1fe3e7f2d689660c0ebf9410d0dcbc68a16fea2db3cc91b79d9a5f79eae450d270016c3e830acedbb0415b4912c60e9ea125022221a6f76b2b8de281ce9f1d4579b8019dd8db06591a65818a3510d481806a6cf522d7e7b07906fd9e0150752bf99fed94201a001f662b26bb1d5c5e28c55bc30a5aa6e55be0d1341af6ee825424b31cc115ada73fd863dda1b5c9a9e8b568be846aff77cd39f59858528c67c9f0d071d7d1133905141c4e4ff80c3b8d2dacd7c324e78ea38d3d55db070cf8facfec23ec8b26e7fe963f08898bc181c6c4e8497770ad31dab96cb04f57db458c28c20a40fc134a279c8019db2fe27aa7678571557a52166ff2dd910c8edf0398f80bb0e7651f057ef3c378f672e6cf6c3d9924f7a72d4e052c0beebc27241f4271d41734cca074a46d53ef5f548ceff7d611870ecb14be93382969b8b9c135adb9a9e03a0b09141dff270ea6f9bc66f409c18ecc764f27ef35988fbcfe876506b75d66238e4737ea538008cdce2420ae2f9333749f73581f2c6385e9451bcb8edb7c369e0d2e7304b279e03bf4d6304bdf4e3c2cb4cf1e26c95a66c7e41091c13c329cf782af29320fd650a74cc1bbf583b4ab47c6bff64fa635b51d5ca8907425321c046a4a62336ff158ace90b965c21889f2458face0c8663b34c2b4c00c8f41e0a679c918052a05d39f84fd9b6de79e72019c6a6ce82961da6f5693bea88506800f7776124fae37cf0dfc354695db07164a23b7e6d4e69fcac9923dc248edf8a535a8a92401b49d9bd8eeb81f2df73abc7ef016e5605de815894cb7910963c5292c865e53d6730fc8f45f63592c7238b73c79779f1715176b2018c01dab4184ba4fda4a98c7670208f6c327ef3bdb9a982b39da43493064ebe92d4140c84b38dbdcf8d67072b395cc0b3dd63a8dde74275a50023e41240ab7219997912e5761e6ec796c6b3376c2f6a6e74bc46e04b06c136ce3c8e32396568405778e8fbc2aace1dc22a5dc393fdb2b7e58cdf392fe32225bbcef6ab0559ea8c038b86abd6903571a61d6ea871b5845fd2cc7fd9f809930add4ef802c4c83afafae7a11d607d68227dcc82d94c847c0d506062cad0bde6051034ff87637f450ac413a4a5ff3ec7b1c6c872a531828e35e302621923d8ecad3a15d23a3fed0cec1976cf0757737a6a7c465ba7a6e95f88f104a7981e1b69272011e6c92029b6fad850e7149676c20616f8cde9a4b59e927a23a59d600e4b9c998146472bcc275e10b8165e59f616255709a68471967b5673a994ff463f85213615100523353e85bf5e29166eac27004c8d92ed1142b44561d34d8008fa03ff9eeec0b44f3f304dc6f6f5c971df83b3e4e91760f1f1b44a60b10d02bb6dcfb3946eec602165af7162ec23f9c36b0bf3a0f22abf92ae8214798845aeef5e70c1945381ef30a5c191ec1cbc85ac4bb291709c97ece83456dafb958b050f65220accc7b08707d39c75ef04e936da5f2fbd491ec47fd30da4f825c3f6c6ee213b6034e1b90657929422fadd0b5fd8e97dc5551baa00ee00f5e1c6f3eb20bae18b10fcd582b6777be509dcac66ea133cb188edc4032b2012d3e634c7dcdc495439635dc9814140fd457e43a5634d1d0a028287a88e8fb8621964659670e996faa12d0a1425d4ac60cc2e851e3bda13849679b2eab73c8b0ef9b50f9ee30f2d2e23c8e16d87e51785809adb65b424dd278034c3eafe611340740382dff8350d0cc3bd1e979954c3701f0ca5e21bf3ca1ab7202a96a060033ec0e2f9a85adb3d2a1f17ad32bf31c83c4f96580fd1d085215c60333b6f26c757d5f2ac7172a98c30037d2aa85b98bc4c2e025c001", "53ac52", 1, -1333470626, 1537743641, "e35d4a3244951fae20589f51ef73d77f119cf8e4d9122606fa39db0692b9b96f"], + ["90c53b53041cb3fabbc7c88f2a2aa38d473444b37e6027e4b9e63596663603f146f0207baa0100000002006a275fb1455284162a4c361614b3038f649039a8b97dd49b9988f13c8aeb5b43f533d2a6ac000000000963526a5151656a6a52ffffffff4dee1ad730042440d831e0ad15f0b647d367ef80dc6e9817effc1b9476952eea020000000552005100ac1f0b79a3188123120eae4c050169cccd3414a766ef605ca3af2915a52c333e65acbe03e40100000003525363a065ee71027080bf0100000000076552526a0052ac161ddd03000000000951ac650063636353acc91f52e30100000000000000000aee520500000000a8d3ca3fbd4f54e5843caaee354c8d4f994897f65c1392c1c4b62eb2cbec411cd3fdd3bb0ac9fa526579e6b231a96ec81ce8a8779af54ef7fe3af07a52174acdc653103c592c464a337d53874113dcdb5c671297a4b15b801e6bac7c34bab12500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c103f48c4155a46c706b5f8a4c8a91c38734cdcc87d1fab9507f782569d6d0cba302c21bbcc27c28095614cdad8390953404daab750fbf6cc95c4cd6f64e0a26887ebfedd35e125e5eb8ecbd95037d285a4e130b0f17d42946dff13d4afe229109669b490415f9a31d665bbb13288069f0056625ba4ec2fcb57b56cf2d5a35550205445ee821990625e33935f930fa4c2d697b2baac299c9ce5472030151e9b561020cf9b690e544981d8836c3c83f8be354bcc5c82052cbfb7c65272bf1b929158c0b00140b2200f63827050fc5dad9866847522372e75c8be94716bf8596659ded8a576f47a1917e5dbd6564d00a9d672d6e1e6fb8ca8dc3db6f3e186f32b6bc94a8032398a954b10d6d715cbf44db9c7ddba0922b7e9e5cc1c017a62e1115bd0548ec0206fc9d04260d90e9841878a77fcb7328b7a754e7ef7ffd55409baa1b8e55c026021a2e1f97a8ca871c90667007bd6e71a0757fe759aa7b812e9bea7cfc9a49571a022c28d46f346aade2d9c98526283d98a90708f48060f7d4888716f6695e2801d6030c2557ad6e198e1762806fb8f211079ff89f1d468f0eab7f6ba2f1f2be9e82ef14125d2c5edc5434a6eed6c2789ed1a9573819b67c99f936058facadb9c2f46550710b627d19e7a5df91ec3dfd4e113c7d1399f73e10027721531f7283af25d54c11a48b55093a81a88358b4a12fe5893f3d11b36513483cfa9a24c0b20f4bb725a0e53c3d9a20ea4d387934b87501bf171019a252c84d66a62e43511ed96c33768a979de269a6d911f34c90489d2bf35035b15ac0b94a40fc84eb9514251230cb38b4043c2672e357d9d760fe6a761d83d41bec15012391d2c2b7623bb35a9e688a4d018348a21e04f81117123326801799a482685b0f9ea46b4881f8f7af3705d8c0be78a75ae09e2151185e18da8c12f34e7379722dbe51727864f576dcad041569c375fb976b514be32a5fa5aeb4da2f674742101622594ec2a797d8bd443dd062d676624df606d6d5a546059c85aa352658185b8a6eaef55a3d7e5a852af4701fc30404bfe2158fc9eb1117d92b4969c7a470351f80f1ca98f0f97fdc286e2812236e4a6d6b43c78054ba1b0fa8c60683bed51cb0cba8646b583b88ea041e2f6046460da9bb1d1708299dffca56ec3a032fce45b81e9450669fadad8ac04899afe9bf47f21b17f2edfae000e13f1d0aba317a4e9aeefbc62afd0a1adee76fea6a5336eee2925f3eba004b3dc6aa81896bde60616029343b73abcd227313d0e786a9d75b644591b1db2a3965b78742bcc6f90db45a3b8809350a4432383edd9aaa56075d35134b89486bbc753762d242cc97905d9af478fe2545811ec97f790a63cf60fb1cabd400d5c4f66b3a29d30678920e047637c898f40d00de61c3698f258cf6a8eb6ee8609554c6a3bd4ab15bd6d6a276bbe10e86f8c505748e5cdedce3eb10c8ee8f5aa58f1ba49f5451d232cf750c257ba9c1c6c585dcafc7e4adf0d0aee6ebe758bbd0274e5df308671558475033b0e14a0fe416aff196f882856a25d7b447d2a3cfe22846906b121e67152a4810918092a709f39bcacb579f84e85bcb79cc424fbc4f616ec9141a72945d589593b89ecf7dc970f5de83003ed7ab58a79e4b36a699e177ab49abb2d41126f7f66b20e2812b3264a2e99db15fff220d49d4404af007abfc9c9a5abc6040c83f50fef292354da0072ab427582b3ad0e2ae6374ffb775fae55e0c1832a67c5b7a9d467c823633a2207434e16dc03ac386fb7eb2dee11c5a65d272b151422f91ef580e963c185ad74793fa00a840ad9ec4a370bf7a63e5b8fb917296c8c782e820e081792105b256ef4793a93c8a3e104645c94966e337c31ce7b08f6a525b41604af1c7d88e959f5d7f703a1b1a24f52b539d4e3b4b5e6752e3b188de243154843d2d23f1496d056142754caa200647a700ef00fdf83abf2bc8589b8e653e3a4d4c51dd739cc46bf1448623b059f44b15faa7ead0da646cb0af67576c1461962910f2c6e2dba7415440b50a5a975e8f1da4e80b2978b6b26c286b37355173e23c16b007c8ce4f14b46eb8d9e6afd5c6738db553c46f28472968300735ae4771fc4f6e2cbe31920929a1cc99d1acdf6d3b88cc4fc75a765defa562de7e4315440575b101da3fde16601d122ca9061b1a18c96234e2b6cc8b51fc3b06b074cd45cb66d959c5fe4c3c137c579a564dd6a88c7e1b67973e9aac4a6706804cb905af84888a0e996ee57d47af3b938d044d506b62130725b6e4a5889ab1f9b330ac38e71c014361c1e321d9e40a4ba612ba3d1053244f1caf63b9ecc433a0c90b31fbe2abbbc0196f69fdd5dcdea4c7a3c9994f66151f2a21dc3f7ec50326e8f541fa6b5aeb8d62b929959ed745a3f77ea26bb671b941bb4640a6d7d6ec2b7d7a1e09", "5353516a", 2, 1546077898, 1537743641, "6af8ec836267323adc3df4ca66f58ecdaf5017e5f7f6477a9b17ac84a1f7693c"], + ["17072d580320cd8651c607848651fb05338e5e6ac88d6ce4011a9cc4872d1e3b1fe76accfd010000000165267bb2d6c475029eb01f1edbaa1d8aaac50bda5f8e97f90143b57b562e9df3ec3c53b4d503000000036351aca0dc343560abf9ef2d820d64c4a27179ad76287cf385106e7a4fdff56c64b52bb355e54203000000096300635100636a52519b786f8603c0dca80300000000026a6a0cffdd050000000004525163538dd5d30300000000046a515353c130466503e13dc2020000000000000000000000009a2db7a78b0ec4690c409871aeb90ed0050aacc5f472411b653ea9110e2dd14d91fbe85411ef33f96efe5a801a024c5a02c8bdedd95349ae08d83a87ec60c572770d449f5b374e28f3d755b3b163f941989c5d16c3babbd30510b9722b7b439300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000270ea6b2430630ca87bed9d38adc84c8275862e8f5e82da412fafe230e417b39fda0c00fb933765e19db4b8bc3b50c7daa28dba82f8ea3f3717bc5e473267cadc1f36c77cc75ce91c3950f617294a1d6d8bf935baeeaf2051334422faf1535cb771402cdbd07233dfcb389279e5abee20351124dd25f1e3b05b8ae1e9994a90c032af6bfe2e6cb991d29fb63c450aac6fd2300574206314fa6f2bebda37dda9e57020c48f245ba03cfdec5934eae31c5dedc41b63454cf0218d0773ed283730311a50a08247fb9c2f6e98b85c7f47759726fb216f1eb242c087fb505208b0948ead9026056bb54d16171f57f59c6982936f27de3782bc08104a0121e21f8e16cb84246031bc4c2ed68b7074f1b40d6839bf3a11c40346c67739bb0e27aaac132c5f8b0f1030881919956284a0aac482b9ed863d9b39169fef9774805cdea784248f5b0d0a20211a6a5177ef3878db7f6493d8a2ecf02ee35d290c971b8a31fa983013335fa65022e13e863735249cd5bb8edb3f2e9ecff5f24fa415fa8f3f89080eb9cc5659a65031a6a6e742ca418fd28a8fa6025a4fd9da39746a616457a7c1bff0a2174aca5a098be83dadb23f28ed1bd7fb4fed755b9a285ccc4d3b002215ce1b4629c95ce1c1a823dfeb8c6057fa2f97a8ec895debd1b53884820ef9e28cac6bde7dafc2789d252bacf8818344c7d5dcd442bcad89bb7b8a756967bdfd1a3e24b9625a09641ee11e19e5ebf93356a95ae02504343420dbc5a83e6372171f520e199d06bee03b448a5165621d0e1feaea4300cc712f6090b30c27b20dafd2e846f166d0a003ba15c0fcdf00c16dfbcdc4ff918fbc95c1ff946fb9b437cfbf82340c54a3341da8117aeea9d88122916c32a3c16881a84fb56e38081bff09605b08cf11d74dbd3a047a5d99bab8cb10fdc3644c5e282d6e0f34b4b7020305e33939c9ed67d1b7ced6f7d8f736ac3ebf40cae4b294afc89b1f9caa20433007d180630103a6a7b5c51b817f195f4cc59c52db91bdb69051c88882ad0c030b80e91109767dcea9fcf564eb0d4bc6aaad7615b32e52b182ca9b94bbb58b9991ef51f648a71646e7dac6d85abe53d688cf15f2c83095cb122bdc112e581240a391aecf9ee96ecbd20ecfb19b6c4974234cb395408da490769cdf899933cebb4a153e1103a1b6afe2bbde8ab1a43cf23ca2ee688de3a1edaebca0ecf36fcdc522e27b05250d24c8e92efbaae9b2174393a8948e0526434288a73deb20a70501335f4b8a9394a2caf6cb1aa679190599c11eed98916b3cb426ce3d0a90815a54ac2dc202978659927401533c7ba652f5034bcebe58b96e5078bbe713c33ff8db8f73b3134646dbbf9529ab1f4f5c7361cf62ed31cce225e660febfda6da10fe70fa0dd1c158fd481414deb3a2725248ee89636b9d3f11058ccdee70f5eae75b43fde9191942bfa15d9de7fb591c23325f36c908ead1bd9592d2886ea633cea9afe9f0c20e2c97046bcf640e50aad9bbd2c7372f1f7614884db794ab9d61cf379e475efc5b5680c7d3005e918dc0d61ff322266a90ac2a07bfdbc1b1bd65c3f2d6ca71280b577e8e22784a63d3e8e5f3253dbe98f1271045c903ddb9c3b58b6ba7730c6c08b6139d2e796431a1dcbd97876ea91a1f05e025ba38c5a93b7c4b6f9f77d27b9ad405147ddb97e0ab8a4443cf9ce2099bd774a11432c379c23015a30fb6593b192f9a52ecf26ec6aa90cd7abfe906974714c55e933f1d7bbde81d7bb7d6e128fcc1984ca66d110e3b15bea9a09417fa0c63701e0a157e0376e1837a119181d114608c6cb0525745cf357c45c21787f7e6db3ae2f7beaff44c5c549bb0577e3d6c4c92844e6ad4507ff81d6e37e1c9aa3fa10355827595cc86454fe6caac5a3374651ece45c4be24f51ad952590d4fb1a12dfc4499cab8cce74e8406589ad53ace6d784a5d3239dd07cd5985176090a806bff60333da772bf7aa91c08911eb67b19124e0bfd7c294dee95b050868977edf5fb806c90f7115b8191d961b8bef387c9985eeb2d421c9b8acad2dc4c66161428c7327b41cf3407b6b9092585c0e04d8a79e61c6f73f75ab9e409c362ab206f76cccb1c89526a0872e16ff1f5ba1ab30cf71463bc40e827703ff87074612fa97436a119605d597d1e8c7d57e4ff671fffb78d2d814a27d905ee63e40678e2215834b04efa677cfbbf33c34b12cee71b84b1a6f25dd7d804a1498b9a3c6b686690074dac6265d2c83c4b36a043ef41fa71168c9e0c8a8469ebf6f4d76158fd24982ea2b9d9bbe3e0a9f6717040000000000000000000000000106392021d690fdc6cfb1e2240b4d68f7f76247d8b0f1f5f12fd758f1a7c8a964b72e7663795a88990d51c2284f805a7e94b9ffd00ac7ff8540c9820d082c09cc7f2682dafa817d5577613be7eb9be73abbc277fb3e49c9734af4cf288f31f100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000524d3bfd7a0d5adf30223570a34a7b69af20f6a9694c108bd7ebb0033351245be3ab44fae8c332724789474196d83da0cfb700db2b7f023c96b65281b6abe0b7cabf8452d20a900935111ea95c482dfc80fc02989123db705002bee58e9d1d9f0168e531c8c28127d78cba2b52d8d6e015808724f912d164b6bb6deef293c6720308ef6f4ac93a13e0ed163d6e59cba84f5596faa99fbb9758993d59800bbda625032a4d688690dfe8aa62aa37f5c57ad6b038bc0c2c817ef0ecdd73788ebdf7a26d0b0326ffc51db8c7e10ffeceb1843e3ea58d667d4366223b308d29037836c64ff31e8629bcd877dfdbc82fd6db9233c7470bac6c29e2dbecb7c0156ee2da211b0e021c526c02c8bef517ea4c1f18935a7702fc7b2ad20f03ea7637162f370028f0b4030a4920c7173696a949119e897c2b3060df747540358ae6da97a3f72463710ec8030af5bab214c31c3ec71905c18aae1d5a0eb86546978519ff873921462d54d50e031d8d4dfec191ec9cd4643ce5f9c025048723dd3a4599ae86e59f46dd258a9dec02020f23d99938ab5c4cd70f134e01bcf538b17ea0be405b20e817e90f31609da89cc7dd3c95eb737bafeeec9146d6f78aa6201165957b23c3ba50e62f9dc3886d39232d07e5c0621d55b216a4cbd3f918fe5aecd6b82ed1963bb2c3a7c02a2634d42a88cfc98ac5c867386e6e559cba7fd89b58bfea945dd9679441c17954db96d81a2c83c84478a7b81499feacd066b761c7fc4d30735cb1347b1126455381cfdd08e48b09a1de33b220fd05433e4085bb001f9e2a21994193772223880b5fd2fcdfb125e84acba12ebff7ef28267773e579aa828e7d7be9a4e427ba6711bc5f4b4a7dc855566437577832fc7c240df897dc59a029d4ba15f21d57a71f2bc5b658d1d40ec7382852a6be1813b486a12589323b97e9da884b42f2d361dfd93c133f16bd7021d530796b86a273dfdf1d4da95c84208bb68702dd1ea1e741fd757cf543260e3aaf94f0a22be73492fe2f5a417f330d10cc09d2b403c73e893499c5a236e93f42169acfd0ac67fce29ea5a8327b4843ff1bc790a4d4959819751c2b0b13dc2cf0bcd82292365de3d776ead9b77edfadf324680d12d4bc3f539f64faa3dd9f5a18e7d4f1611ad3b1621f58923220b33684298811f7ca426383ed325afdf277a9a8a1764364ef174f53a08fc078bebfd321c2b9d81bc1e4cc4be628365804e2f8b3e09cbf344cd4b9407f6c5d442bb4242f0387f6cb99b76b2f1b64efe6c06e36bf4a66d22aa81d577421585b6f1bfa3990f027daf86dec17501332bbdd0e3b249202599263309b63d7e56dc5b2c505ad934994275a25fe6b0d5ccc770a53735b28de489b09270a5a1ec04098ce5b0afe13f0918c5897ce320d231e72ae7cbb405425a298bc0e07efe6c536429e1a4533fca0a4d3e0588f3577eea0d314679912a560b442edb36f6171f249c4491ed6235a293eaa0f536220fa2ada6ffbc95c84d5a5e1f79bf5b34bbeea8d630f84c2863c173813734e7a6778fea9a3bc3ccdce67eff88108fdfd4c8629921a79dfa6f763d9822c42d5bcaf927764e32769779c659965bdc6a5c3208bd753e05c6ebb494232e74cd4d09ab2ffe9dda1110477207bc96a9df9635b031ae11ddf2e51a4ed0092d4f425b83a966db2e966ce2daf23aedf14b6154a39e01b09200ec5ff6a3b4052e8eb8cda8947a63fab1278d2ee71073294d47e149e6199b6f641299dda690d179367b79b04cbae6683c8cbab1309d9045e57d7c0b4048a867cf5690b70d09c7672178a4de6e30efe5341c8a4c187fab9548510fb6e0600cf329e70b19b82ca966360bfe9599e0d1eb3b1cafb992f24fe6793c4de9c586755913cf3de4a66c66eed5f4d26696100218af709bb58c5fc7dd76759abc2a767b790f44ecf6be851e59395bb6f0f86e991ba831e676ca697dce487085e863e74175ffa00b36756a4b9f07e6f5970238a35d6022eab479267267d8806b30350488f767c2ad710f8b388704267f328b78ec7562acb23a7f010b76c03ec122246b2252458638001ca306194fbbdff0a17e5e49d0765e9d92f85e866a01dc4c5354328534865792d0ab289256c6da23024f9ab555fc3a8c542fc3a2dadd559835d23adffc9e775b65550a93928d9c05b653a8557f70b25196001c355c69c4e30ed93363deeb773e6be3f694dcc4605e8abcd6e869c0b9bd6b64d5a243af7f5014574dc9bb9c2e5f2cce19b6073631b3ca4f296db8cdef978a49dc03f1ea4f1d8093969b90b71db000000000000000062dcc705000000006456c0f624bde7618a677a4d9eded2cc605c208d925dd0b429501da946894dda9f4f59f808b7529196a9a0de646753138ba2c1523d65c2e61b924a116f3b93aa38316074eac1a82a469d8f40613994f9d4b16cebd9dab6a67c9d971512e73728000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a50da206fcec4f8c8a89a6e28c7e7e7c4395b5715c4c4de4c87f0c7cf9f62d2bf175dc05e1892867f0cfc0915d8738f9598810aaf45445cbcd12fee715eb638bb1c504835cd69cc8b8545b77dd285efb0797bc65233f8505f633a83483b1885182235ab6e1ec35f05f1932ffa6b962790add5505347f39c6e0141d4f0ab1b12030079955b062af44f51243234d895574fd584842039d2e7e2208ea2f61e344e0c032c63973b6df88e3723e5c2f4d7f2c626e66fa580597acc5667e4f80611e4b1c80b00b849e9538f4542ae2430ed5885410ffeff3324155dbfe04a2b04bbd93c26214c3ed8fe99935ad64e027e218834218bcd0c3c785f118b5988f9d76cd057a07d03044b5bfe6b03469adf1135662f41144b3e53df3d32ba420f03cbde18644d2651030095afeec6ee1d057650f28aaa1616d41bff61d424050ec9fcbd34009b16ebdf020ff24c585dd4980fefc0ff67a30b4a9b0a3c8c69119ba37c56b04c68c03993ac031d41fcd19bad18476419029887cff6afbfc66a090e4180243a5025b8044ea9ef0207e678bfdee2450575a611802b16d30884e2f152260f2fd65ac867100d659ed7c42d9243986757233405ba227e064561c6b4df740eddc93020499cf83400f4221b8d9f30cd2332466da7be3a439348901a218e9c8ce1fc54c6a74dc2f30b55b60cf84c11f9e4c132788da0bb86ff1135d206b6797d4f42a2ff67f65b7d0815196e1e5f9bcd920c48b0d577ac36d47d4c2ab1fe6faf16c7882b91b28972c63c64cba88328fc48ec029b3d0d69396f0ecbcf2bbc3c4c78329678787ff3f540a656003530a7516c8609cb6e12f0304c76b84b796df18363ce7069340e31a64588f789df6ca14a38057b82c3da6b20823e65df8aa33cf52e614a15bdb2cf713ee8a9e174d5940780fba2e7d619fe1edb0e06afaec362d61fe9d13734ce1c936cba2a30b1741981a7d2361a74667fee1ab06d7ae6f0ebbb37f482575b9aef66c2ac213b22b84ce2428441ab842d10cb5d47ac591ebc27d7cb2c8904a4e9491e24c3c916ca5717c4d435891d99ce1efa24dd9a83991971cb096a11f692690a236b7382c8e84aba32f7fd14c449ffaa21b951760796c28134d2b2870b32e31708ac7c6227a89c39ff6358f062e8cb87baa2ee8967baf7e8158f1893ad666dcd200f9f54f3e0d40bd97b0b020efa54e7b47b9298c03810b8e9f1bb0b48b10881e563649debc2abdb8ebd49310f6edd2c1e216dd9496a52161fb59f99c61a57aadab60001b349845649346bff38134ee3fe3364f185979d3eef073aec8e0290042cc8236ff46db5b21dd97fec5e8765b3370e694b846b03eccf9b139e6a32a45c2536526963f4f32cae41a952456befad2ab03aaa7669964bc4c3bde4cceab0b12780d5066de1cbaf0aa4c610bf3555faee2c6a72866b6d5c84c5432f807d2fde5b29c0c67817db5c6b821e97ce372bcb10127252fa029446e8b29bc13171a1fd0df5f8f0e948d2893edebaac8fc55e0d6b482a47fb145b6e64f6a5f79990e2ad4b93824ec13e1fdebba33b7e3198dceb0899e91b3f7ffafb6ba7308c9d2ef722a0bc19fc3a1b265077fea222af5fee996b3d47616ecefc7385c86700d24a663ef43c37407399694d72cd46e75453924812b7f560e03a2cdc54152181dd37116a8eab15735cf321ebf1447ce527d9fe3b3f2fb7ddbb740ffe7149d15eb2025e78b75a598337accd1cc41e670222e51d2b141b9bc5ffc4189cd5a03632c6fa929c04be1e7ca882de58ba7ff8c2a4da42c7bffd9b7d8c5cb17355a3e8603242c76c6d2fc43aba369cb2709b86df7239fcaee4b52d8fd242c1470a36918b81a62e951eb0deb098298ed05138a59a0288e1c6699b2928e3c6b37e75f5b7b356447bc7a7a5ed8a976970ec758b3cd72a0ec26344f8cb7f2fe92dfe6aaa2e5d1554cf88c602ee5f0ec7bba718233a602e9879b6c36a31023953906369d05d3a4217a899f758beeecf75947958f59c3932b19e1025e50b19b034ca03e4d4f01b2444d15349108bb42deea7e8972a02644ed42458bb1de656b7d6c839a5262daa5c4c5303302bad3e0cb6757d11146e74b9a7c237f6cd36342d8d4274f99fc73811d0e032cd522c2f7a0ab4b85c8c5d56e0d9289c28e8cc5c53ba4aab0d26a942b82b935e9f8570a0877e43dd5fff71175162340602a6e43b4505e2b65cbf06bcf866a2ccbac80380de5d303e1d0ab9abdb7cd4d2e34a50785a675f65fc6d5335a5f345d0c11607d7867a6d48c73bd54474169f6945f7f21796f852602c469321e4d4b49e29148895bd4517258db02fa44124f215dbfe3c9333facd1d871f09f6b36580ef4d5aa859cacd657d522e5c22005bb6ee8207fef61fa93ddfbcc26494d13e96eaaf24271bb453c852cd95f1bce1bf7f048d62dde54e00", "5100", 0, 970543965, 1537743641, "a6058f151aebe5b53b57287c02e74ee55cf464f19408d656668d4111c36619a9"], + ["83e2f965039b5f55bbbe32ed9f0333b922a0a23995d46f5fae602cbe1eed6fb75f9637afd400000000050051516aacffffffff09014a2d743eca497fada29ef727934fd68d50a9178af8779cf0829f77dc7bd201000000090051acacac6553ac52d2f0b4a88d446916fddf4c8bba1f80e2dbd8412110fb4cbe7f1cb3edbc34072fd429cd0c020000000800655351536a5100ffffffff01a25e8d03000000000452ac636373332ec800", "", 2, -2057996197, 1537743641, "3ab7df21a533ae3533479871924bc0916a1d6bbe9d23a07531927f363d31152e"], + ["29dbb6020252a291d26f565e3582f385faf7e1a853b9ef7911a9a184b54a3b00c67b2a043403000000066363635153006cf1ab756131268f80dcaf16268265f2a6a5cd504c57cc16dc40eefc38c5808949950e360100000004ac525151ffffffff03d550bf0100000000086a52ac656a65ac5375d29402000000000263632f962b030000000002656a38db086700", "", 0, -442102597, 1537743641, "4d600511cc4e68ed2c5174717803cdda42712089c1e6c99f37291772d18111a2"], + ["030000807082c40304e086bf8400dd6ac5fa6bc135c1c5c8d84152158cac8cb066d3e32b37204eb0d20300000009630052526551006300cf36ecffe92fcd2edf044f16a85dc525d86231b583629495833ef82697ab45d6fafae97b02000000056aac6a516a122a24c0981469bffd2c240fdd0c8f8ca5752ff15f6322c4baad867e0ab1c493586ebc8103000000045353006a2e40ed70ab8cc8cb95b2500e4f1e4056a390a36c46c1c785ab49592236dd17098da4dbd802000000065300520063522b18a83b048e2dd90200000000001cd392020000000007515163510053acaeb7df020000000005ac6365510048001b04000000000151cc5bd106966c9a6001be6a26020000000000000000000000005772b9b5a4ee5ddff75c5ed710d45325d7dc354a126c270540cbaf86bb36c7af77d873bb93e7240fa3f963e5c9d8ec955d3216054ebbbfefa0fbed4dcd75bbe5ce7bd80c08d11a81305bb19d21ebb325a52474083d81141a31ec332f58c02f9400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000120bed51946b9c476bf8e5cdff84980de93629f6ae9cfc43a72e2b5d74eab9101db023c5bea1543c0d70868bd282bb88c235f647cc26a832d61d4b1faee63041ae64c638479d7d2e71f90260dd7a3991c56dc7a61245cd3ad226168f65a5c36412eb0b571ac8f16963be4aa64038312017b7ca2e80950e8dedf84bdaf366fcc2031036ee603535ea325862defd163f7309d1b0ed6fe114ec0426d037d3986b80e60206f7ee4156b62bb13e677e25d391fe29a1c4fc86a632b453c2872fe0cac8a60b0b0467305c018943384a1eb9b2c914166e03355cee4c5de68022e600ff01de4836fd9ff197f37fad5eef4df9ffb06646e01f6534fc6385af604e458ff7f8c4c5d7030c1d004c3dc45408265276bfb4f063ccc3d511c3e1389ae1e10a3212d1c9176f0329993af8bec40f0c590f3fb319a72ee232f8d38057efd40e9996a48436e5303f022d013d68a3ec677769e07fe89eaf1d9790dbe6bacb4062a54eebb929c131d2e403087602812312e5ded235ffe6b1f4bb3d466414dc85c9956ca8bf592e3635bfef0316ab0757fb2e87941db44327ba327d346c13fb92250dc7f21dd488229672488409aa13350fe4b0726831ace84637800c51c313566388d53eae116c0a951b3761340b801572896cb3231241e63e790629f080f18c90d136e4d096f592ee288b7ff0a5a85b9b8a32a7d321aa012a8ba3a970f0661cd2643610fbfea4df5ededc7277cc441643c03331e27043fb6ac3482a6adc0fda0a8a48c716365415a1c5fe166563c809f911fd6db38510d5b4874cae7a45efe87533b006f4e760ded0cf028b8dbe60bebcd87e368cd8af63ea032310a7c4f46c171b111fec1ecea00ca687eb18bc13a23b5208514e73759220e1cf553139235d1d52b71a37ce863857f5c7a5d80a718d12ac0cbecff7c6be974630291056e2d17e0d8e593e02edce73af0e125f9f70adafd62cbfb28579880070510ae028462252885837a48a19f0b454e8f0e03944e2ad7286886d02e4a654f0dec1767cf021c84c70b1d0a08df12d78425f3c1ed3eff52f182053676b7370443d5b40b03452fb9cc30f778a67f4eb63cd68401aadb4ca1b983b2e4e2b59512ae09380448cabaee8cd6cf8a5f53994a70e91c1095b37ba9d4edcf5c28c556519cbae8ed3773a92ecc10c8c67c85a49ab5a65896ff0e864e10414db4515257bb102a89152cc12974cc41f489f528d72f65354f3248555b5cae5ba676959eb61dadefb926baabb7b84545fa7b60f395d7b3e33c9cf12fe4dd262502a21b23aedfb30c9ba8d6e980271cd6294baadfe8b6df27c081c1c756a959b707fb57ce2bfdb02a0ae354d5c315a711321a8320fa7690a1fcde8f1a3a68d31a84805d0cbd1121420f4a37b3d7dafa1e10d1cfc7b53e6154c0c5f692e722dcb84713a584810551d427d6aed66b61a041160b784e5751ca3dea8cc519f3cec8d435b75523d904c50c5ef04947321305f477c00c3c9c16614bd55b885b64e731e2dfe2d0a1dc727dfcf0d1bee0e097c4c2a85da99bf69dc2949f928087ac936b5e6f11eb354fa85ea792781327e03acf53b55d363ac9c7daac054575785dbeeee327c8b3f9c74e2ada82b78224bd29b06b26923a72b5aff1c9dac69be9ed715bb9d7c8b55707a8c3f42e960a562db72658724d4565cb0fcd7e65f17c6a450a4a49bd42780ec5e9dfca59b9b44a7e83d668a25f161dbe297ce1ef0ba15e96b6dd0227a3b30006c754834164c27771fbb857bb00a72b3fc39ba77925f5422fe8024a0d6425b993a3cfbf9a568186b4c54c44e31d82a84cd981f757f445be52935956e880b5a5dbea9410ebf57c8898972645c84cedc3c0f733b234ba975c5b1171b3607c7f2bbbe323b9bb4645ec5b044068ef66c85efa3c3546cb214bf1a6b329a475e8083ccf5a6d64a25c89219a2bd92a22376e32cd8c66edc8f76adcb9fdf569cc50d1837dc1fd76714e66cbd854317eb577fdd17b66c8cbecf4b8ba9c1998eaf666072f233f5d1b5fdc1cfe8752402bf7bc50d07038502abf0bdddba26a3b00eb8dcc380d027e1d53cb4d29d096bb69950906e8f6115e239002298065f38312be6329800f52a76706b5705bd09cb900f25671876d43f767319e96f96b89287cb4c46c41c77a380765482ac4e1aa15e54f4a789c98ccca37220a1ade4150095925de747c734192b1204c3fcbc611963b39ce605675afbcbe4fa46e7cbc64230fc7eccbd390fe012e96506c88cd6729deee306f1ea18022e94e1de4e78509822eb53dfdbc2a5ecbc6db3ffa7f35165d9c61d9d5e384f516f6916fa31f37f5e563055a65a3248c7332326e8a115c240a73297da816c345fc1a12e3fc979ee9e22f48eb64b52fe0987369f111a21097ecb1c7d01944a742579da4103fdbe9e2310851ce5e667f65a9a21bb0e", "65ac5152", 2, 257261756, 0, "5afb6c16590ae338a8d1ce24be89b8414532caf87ce3fe0cdf117de5039e1726"], + ["9b66f93a0218806da33bbc3b184f77821eadfabcc458ed5adab55c4a8287df23ae5bc52fae01000000066a000053536affffffffd2b3a1d7dc201dee5270bc7cc4b991d6c3d0d7c2159a16cea4e61c00f77b7771000000000163256cb973025b7ba60500000000066a6552536aac2b76400100000000095100636a5252515265000000000100000000000000004d4cef03000000000583210a6fa19db3139288b5a8bff1b4531d7d7624e9075b78bf6fe5674061ec31e9fdefb29099891c6f7cb63505a36f95ea4ff243830295af4430d9d85ff37f0b633b32e76e8a1e3259dcd71c3c1db19ee02225c52fd7d1d6c29127a44d6a2e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000051175fcf93fb2e7287392567269fae8e61f04a3932571ba7fc74c6f7bace0c376f4e283b8d4af1c577d60465e667da3b10e7352d12cc4350dc66ce84385eb06be0a61f6ddc977617733c6172ab3137a30e29f5f2cc21e3d746ff615078245515922adc63105e65c153b9358508173bbc81e482a6117626002f896aad2793990032e0e722b64ca38755477a172d01dce2887284cc60ab1d28157dbee901975c9b702271c30608e9d0ca559f9b76c1f4c8d413ca426d6650588371d383240a89f5efd0b03f332397a248f596aa6187ac10f3d0e0dfad6c9b571367fe804d67a480dded8aad21961e43e1c70df96be5d8901080298d9b8e473ecd3d90573750534a22962032e8b63499dacaefdac1208c82258b9d81b82fb6a8808403e0466073246ad9fd60200544461ee2a59a9cd8a30856d202da66dc4e2e68fa65ed22b9c65b4c94ce4d2020242d4614f1b996367c37914d46bc7dc51e7cb2644f26c630f847a6bed624f5b032a51f417dba790a6137406fc9290816b2701c5f4f272e3d1427f228132394267022dc71e9c608976013c8b0df3f5e64fcc2a8d0fb28bc3288686b4c1f1d5fb8e415e6123fec49232c47283b793ce4e8bcd6ba5614b2bd24ce0d6160ce2ca3f11304b9077d9e9a7c82c7fc6a2fe436da441d23e4ded8c24b12767a5a102a3bec8d9f2e9ce308926477baf5c18762b70687f5590b98fd72a8ee5398c6280dd557f75c4672c60c8f23dede4bae0ebae771cb1fd469d50831d4fe5c7a6ccdc2e643d86617f46e7fe807e0722c632dcf994b0235cf1ab768f44cd56892a38e455b09cf6c02683a3f5b954485783f14a3b71452f0d9d5b4c8a54ce0637a0e7c60f8ebefad7abc17a2533afb76281fe95d5217c8934dca8dbd711595074126393caeb3a5980033d6af333b4fc06bd1b2991be34c5b5181378581b6843ccb0bba815c46569c5935ada8fe6a176dbc8a1305c2c869a2b1dce7da8a715b5a3629c05384fda1793d98b568c94b6f65a9e2aa040571597b23b495d2ef445a9c5eedb14aa3e38b84234d055893a7e197eb4d02142b77495c0f662e4f37231b45119e95cde422844cf933589810d253452c42a84bd19a5084d6d4f844efee146fa09a8c588963bad111935c29b3393f9f868ea5e1af6d6f6ceec9ed3ee72a95d3fe1665a75ae3679143abd3dbf5a9b908f0a1849c9ee5266973bb25798255196fc72609e6058fcae35c4410fd399be39786f7f335ec84bbd251ec9014cd920c39740daa51ba6585920775c1e3cb023c5ba2df90316a753cde65d6f69329a7988742924934b847c86266f537fd76436a0e4db131cf7d70ae7196bebe7d7a9c011231ab743eb24656aac1a15ab5182e90a4ff4ed20ffeea733bd201e7721bfb45b409ee889ad131700fbb050f1fc23f56fb82d30b59e38454b0f431ddb5ec18a87a0fcd78880d8a5ce1582555982737058e6fdf1144b2aa3fdf9d2e4cac6341de6660f73b5f9742d94847bf41e90c3d3d04c057297ea6e2f050df4e0f5c18fb321a66ef350c9a577af0b22c923c8d67657a866237980c17abb0bf4cd23bc6c8fade5b83f922ced20852ccc0f6fa2fcbb74e1d4416ba09ce1f9993708692ea0256b3823abcd10a82b06589a3fe6442a6c5e34811b273e3bdbea734c33530af94941ade9daaa9d94dac07875759e8ba4385189bc1b598b0b494d0ae60b2abdad9e892f500a2100662918d7ead3dc3aa68dafee49ff490136b8063310b1a941eb5e8a5f234397370bd8cdf579879faca5c72d5c11cff7314b051e277197d1225c30e0d8da1564e7d5edb5ba4afecf1d8908184a08d8fe8a1580cd7ebb9c19ba696bd1298b9ef05e47559df2ada2a07de90d8ea90abdc76c4ccea1b393a35b8902830a926f4e0b42d363c77b3b5a02586c2ac7da55776b4b14600ae0f7d0d88153145a438bfe3f386593f0d7cd9e628318dc1c2ddeafe552b7a64a424571c828079cd1b8fe350fb22c75f148ad69c767aac1c59efe9636ecfd1b3fc0ddeef1c00177eed424e8cd52163d2f8d84492ffb1ad7fdb2461f80425f35305baab32cb02421be561514bebef85b2273b12a74dafe04c52bbe694110b5ed9fdb80df0678fdd09fe1f71041e0e3a18a1b5a499b0c6938809dd12ba6d39a0fb3a8a4668a60fb5f4ba5eaa504e8be525d9b205109776d59e50ac51e1efa72b27bfadb32b86479cbb21633534cd2d446d8c0ce0b7062ceff0ba7d3710260b80a6d8b0d828d8f690fe3a60c95ab6c13c8ba891def12660d4f55b68fcc765cfc754b19f4606e3e11074079fefd4e2489e5c9f51b45955d63e2633742a0a18c22ea262a03c88ced0e6c47f64930cd390d48466da477d55cef858e519babb18fb42f5e72776543ec1546b997a42483400c529aebb7e0539986925158e221ed10057e2b760e", "", 1, -515577429, 1537743641, "e8dac40a791db463d3937d323342a073ef3cf8709c8da9aa58ae709cd06d70b2"], + ["94ba7d3e04fccc8d447527d871d88ce9c3b4881eb085508b41c0d4140504b5c269b8f7d044010000000200518c4d895a2a5807dea1848a158be0d2210e2bc29cc3fa09c89b250f2d9e5a11cec7be00960100000009005363ac536a51516affffffff7d3736661367cc111e4cb8191669700fd1b281fb116db85fedd91fcb9337a347010000000863635152656a6365f38f95e2892b4edaca13c39a7b6bcc5d504eb0a1c05a9ff409a9f396d1d02958f652d24e000000000851636a006a006a65ffffffff02dec9630200000000005f4eed030000000003515365984f64c301463951020000000000000000000000007e76125e8fa2f4ab1529bd0b6de977d92771601cce89ac1fbc3c9415c68c7f76ba5c825828baabd862e682de7f5acbc50422f39e30a773cfcbea5f0f4a29fd00751b05535e21590da1d44ca6a42c18ffc606af8dbe0a829f0aadb3555e9c647c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cf074f6eac949d639a99bb1cc5d3ea59bb502f936080a44a189447672d6bd627d54e2795148916e2f9c1210a99b200642b0a8ef48b0876a323083eb444e01dbd949b5840a49ee32a80d66d395448cc072a5570ea36c7a76853940a9a7626492ed73fad93603925f3505c7d2c199d952c19f22e779f173bef8bc39a9a4a518ae6032b0781deeae1c61edfe232414af6955cad4cf0dfabeb9a0bf86f444f0c4ed745021fc3cf047d74c7d72bca0733cccab0accb1545ae3dbb9aeb84af5ffbf41eebd00a0389a8934ba8a046707513d8de3ac5d394d28c7646f81540ab2477b2731b1fd205bccd7b71f35fdfe222076cf8c1e93cb45ff20eec4fb2d7ba74141f95e9691c03257096368984d7d6d0cf3fb752b65df17484f5bb3403846150670bd20be737250307cc76bc14b192cb34d5cc42c6f7897ec7ca2c78cdec03d84fd0bd5a52265a180301151186df167b6e3df27026d96402b4712937ecaea3c05f887aefabbb298616022eaf9e661c2eeb3fae0c3ead42cb5cba2673e1a12fe30a3453c349ef9726683d031ddde49d859deb954be368266b88ea3dcbfad257b28204be6d388ff7dd1e67b278241fb1dbda0e7ea0e916667338497e654c57b7c529a163dfa032fa18d8cd66a30411534f03de906c52903e579a11f5653b00b93401d5ecfca96db830e67f83ca88c9e5ee9ebe43c98a5eca2476fc6e20f8750c1472bc8ad55e346d1645a14441fbf1084f7bfa723610ca0592ee260c272b3d309696fe86e6710aa2527cb74b2864f0daeefa96f6338d072e37278ac3070f98573a29991a797b275e821ae5b99368239f7f2387c20148056e5cc42d4046943112c05d61158a48283bf34c9edeafdff88f45712be946a5935283e6718fdf17448e8d62dfd771d35fc3ce2661ce04ac33cd9b6f299227d9fc97d8d7d0638e3cf67498118397de5a53d3640e54e14586c68fb87f0707f15f8b3618b5f85f6cf5d27a93c8712a4dcdbc5199372666af56ce3c09f917c54f210427cb01ebff775d9e2e3f2cd9132df44ecd5b621cb61624af68b07b04e9fa5d9f06ab716c48d14f6831c5cdf668996135929d27e7c52648463db30b0c9efd15f5542ac441e3c288103ddb991a0533c74bc31f65a71723ac4b33757adb4db6d9835f4dcd2d18dc58463b112abe6bdb0dde17b57db08dfd73a470371e0efe7a2aeed148639791fc903ae5f2933d2eadbb17926c8e6f9b8fbdcdc3dbdd5cc97157d622724ea414ecbc6932a2be8e15e41d56b06c4099bdc3d2396b571040351c3589c6fe4706c96937e211c8f7c704b9e7c7e7b412b708bfef648b0a54013caa53ed5dea54220dd3c37b61c55ee5e09e3724896dbc9b4fdd0fb6c037c3c0746af52c26195e947ddb16f6d2df21b12ac6e368edd380cdcb905fddc067a59f2d796a10bca89810daa6271812b7b2cc3e67aa2280d0bc00a2c1a1f3180fac954fa0461fefe153eda11cd68e23905c1328dc202eb74c13ea57d252244dae6deaaee8fbe884a62e28f5c71237b1dc0b23736b8d2969f1952a2030da700116e2845afbc44c064f71cd021e491941ece675df5161e98913dfbff1ab493afccde48218af312df2916fcae41fecc52348c81361dcf33c1bd54138c6f9a65621fc8b101100faa9b1bc77bd62ec6fcc4fc0193baa92fdd13aa9fd6b7d7d51f41a45c2bcb3109644f627d5771d31998a218577a52fa0935a90bad8939183ea722387afbca66f4d092d7ed1bbb578caf0fd5eceda9128497e6fc4d6583baf9d3cd389dc86764a546ddeb818270a1d5c865beca38192bd3c5d9b90a7422f93cd2715985e6867051088ba1f951dd57e9d99189f17a4c3f44de1d3c103c2c81f6d9f6f7e8d1765126b0f7fb95bfd2fe0eeda6b6f6b16165a221dfd03b6a794b8bed5b623d889f74192642ed6597f426d9938a1ff584a1ee1db7fb95b5891ffdefa4cb1dd14ffa9d8a8e06629c9be9df73b8dbb3b75b017f8285b0a9596888de8fb924661016c6c8758c244d999715d1fe3d991fae51a4b14a9db8ae06eb19165adef144b42493b432a7d772bf5a195e5b708b21251382d075fe6be38cdff6bc0dff40f2fcc2d0d8a4a686d1fb3e482f4a8534f5998343589ca233042aa73c885dbdaa02ea4315de4a5e3ebc15e156442653b1d2ab00104f697aff72c39341bc9e63179eb0bcaaecab5550c26da3bfbf2be6ce9f37b8de758648ae3990c4c0cce2202616ec426614edfac3bfbb0066b01c1441b098617446498832ec5ed15cd93b47487fa35e19e969426485d860b9be2ce0e5393ca136fdeab6f620956fa1f77879f5a203d376664787b0c066a78422c5764ff0f470c1b8c1dfe7755e60902d12d7d08ae4ec612e2191948fc5d33f8d18187b9b6008c355ed0571ea1a2345d22278ec7532adf07a747f17bf7d1fd6e9601", "525352", 0, 23847538, 0, "50a3e5653c1cceb744124a27b3b4fac9f88f96f1eae543033ec0888ffd80b8ba"], + ["030000807082c40301c049c55b9382d7d22eb2e8cd353918ea4cd32453c250c8564edee90eeb724a610100000009516aacac5152ac530093b14f3a04c8e03104000000000563516a006a1022340400000000066565ac635263c11a4001000000000251005dac150000000000026a6573b57f109e0c7d6d00", "63656352636aac6565", 0, 66388475, 0, "504f05b47a82f3e7aa6e81060a5bc54a101c2148b2bd6c75059bb8c09f0892ca"], + ["030000807082c40301503b9dd029ab29c99ba5fa74c1a3e22dad1810be3d208f8d2f5ea4c3d54c10a80300000003655200fb8f4510025d27ed0400000000055251515365100b9502000000000081c33dbe1ef791420238a96e000000000000000000000000004331e795dfe815d0e7afa230aa9e167abf86b7bf378d8b4b8a8b179951e92b462c9a4955538b05379c66ea6a31737bb7421f6d59b78af3b95260ee8e83c0d9e82cb2b24137b3f47f756392864988f90f52e2c4f70b6a4984ab3d68ec17ba88eb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c8798052ee906082ede514b4690f8608804ab7bd6bd899917a285f0a69668c60a9659354c693dc0d7a77127ea47e410385fb02faa20c783cc5075ac725797acf61731b7a998d759610bffa277f1b52d93a656498ddde651ddecb1a724274e0fca987f95b50b1329b33e10a02959ae08742bc415febdcff7d7d6ec7e463bece2e0329e3098b5f0a7fcc4604dec12dfb3390833ae01da1c3580055b7725cf189099d03111ba7989037a91df946d0d45024c183dc7b8e1f752d488c59231fe7a56651790a06b220157026b1afc6067ca11fdf1fb99cf2be71c948f5988fe9cba79667956599535fdc37a3411ac1f16d9cdbd7fb82d16e55fddb0e7f721d4a8137b7ecc514030c547d7d4144e24b7a22604c413974567380b31ec4d167e37d51dd5f30e4e8120222ee3ab88d82d1f8b8bb73d34803d8786134afb5fd6c536959037f7d39f27d020220e401022c222fb39380a5234ee2bd900f22d762ff068b6116b0a16c3b1c88a9020521bee3f22ad2c35e9c0910484e1c777e0aca54d1854cb74e9da1b05f5f05bb032ce10b1d8b5bba9c27d4540affe549c8b7d4819002072244a4ce1bac021a93d778707bdd70cae61988c22848c2b89eff38fd21f048163e163c29bc0fe4783d83066c13d97a1647d82bc0bce24a87fecf8be2a800b6dee085a5616eec1c678dbf95c097f204e276d16d485bf6e62b23b79f54beb17b0b2202f07c306872b8d8115c7cd18700beadd7f71cd7ab1d3a7f154d58a38448c4e175ddd10aba34e62cb7009b87466b1165c86a30deca06fb158457ff6efb0b10a073450e81bf3d720d354a9b752956470fd36a63d67f7b7a89ac7fab39cd9a80b18c3877d04d36d31b1795c9fe6030fb201530ca4c06e17fbef5ce7f68c07e5917e5d8f6615cfdcb8f01e73e3574831acc7879e81d36314a0fbb0a178c4500cbbf1274688cda428486939961b6adc52af7d490c50d5bf484d6e637f5ddb4cdc31739712ac08e4d8f3c5c25aca7927c1a4b4aadf48f6dc9c6f4fdec94fc82aced9fcae4794f403c2a84a029c20fd0a492a2d85d66ee6e78048087b7c700d75922ac199846faaf911c3f0d1de1b39c700ce61ea3d856cf5bbae3bfacc1da0668d0c7a0524d5a2c2c75f16f0d070cda32a296e15d2c22508aa61a3c30b69b423d2cfc052d63ca49f7d4f63ac1ce6c6a1286c1f80cc1318444172ed744a039066e6bbc971d1be0c84c7a1149ec44dbcd8f597815893331eee4b61e99d6752e6ef9e0d69df8f1f681089445e87313eb7d3ec4c4534440c21100c2ade3b058babf16f56881b45037d198aedd613b4835491e64ddfbe3c966e500cbd7b2c8149b265ce156637a5c47c7b919961a2564d2cc9602e5fb7148af75d4966d4bdaf7ab2f2299d26f4cd5566e1fd221692af9e99ed4a2a1ead554b12a8fb264601fa879e657ec49232b4a0c5ca6f28a9f7a4f5b333b388ec425e8269063c8bd85acd8caef655ad0388dbd0566cb2436fc59ad3cfbd450b8f0112a8e28207367f5627c564bae84a9e5017116ea4cce2755bf454fdbe7424f13c2a6b2b7703cd27c2c12db4a42def06047442d28c30c75d68728dd536c5619ba5488704c573aa24afe33430993f915fd7d3f56cf7c22cb92fa705e67460a8bf178cc77f0191435cf1463558bc318d8ef8079c5146d10a4c822689023cba135a8ff7b20d70ce2a37796bc410be2c5df17f0269c202d5ee1e5e5aca76834a5788955c0f034d570f75c4ccd8b91fa88729ef0eca3240ccec9a0267fa340d2853d8d2ce328f0af6b3ae74eb79b8f42b8b2abb1cd6be89072986b2ba37f3256f8636cc38bdf3a970e6d58f1d7b3c0271879d44c990004a3a423510c0d132839414fc71ec82e6d6731c291c048188211b9bda8f3481f199bcad9b0884d325ad9fcf052ebf25979949d1d0272dbd161f2fadf709e995b031869e5bfdf2dfcba54d3473ddba9c627c613533a455c579cafae1f23c46a5daec395aabdce80bf12fe7370efa02f71f2c3d4d679aaf5578e37d567f0fd613f42b6235ad2968a29c321048fd8dd4fcdb1a76735fcd62a0df950a404c66104d5028967e91de68b5521068f660b6b594cac916147c8ae45dca8d37cb733f0397bbea7916e35d55b430652e3494c9771b9b30ce21b323e98f2d2cc69fd05312e9516aee3652bc255ee6641e8cef940377f9b7572a0c11ae425e4d12cf0a23fb7161429259a17f539c95f9626d02e8f971da507f0a027ee483e7d3d8c3beeac12a859d0c84202a87025a7433dba18d4e0cd055f2d0e9011c200000000000000009ab7a101000000002ee0cbe81024386a6bd4feaa5170e8925c2e08345ee83cb88ae815aba131b7870336e0a521acb13077476a5b087df6a66a6cde994153da5205db29203f6ae9c3a53ee5cd9bd0f93dbc34a9130c409e958532c07ec6a140677218b8d52abc342600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000097cbe29a649959cb7d296e66bbba5375712b6532304212fef044c9957ac8488fa3ae95cd76f8609493fcb08aa615036e0fee8941b721662d085a082318e68e23180e0c338204d3525732789a1783f8b1fe34dcbe73eda96107c05a04713a0799bbf2ae4d9a39fb0ee994dbee89e55b623104665f1a7a14b41db0919e16dc1d5022eb31e69adf5b8f6bcda7bcfb182a2385bc9c7851a0694566ddd021ed0b88aea0311ae13ceb74f32f6c582884a87ad41e8ad9d79a281d2ffb3b13c4f03e26e1ef60a08792ace9c17a7fc5af0784e074835cd43ff225c76069e13e6cff9335b4e3372871145be37622c35554ccbc9717e68a646d05640b6bf44eba2d46d120e0fa3d3030ae1f3e3591106723ab5dfd382834128007d7df049a59006e907e8f9371bdc41020fb8845067f37e0e777e179564cb6004ff77c838e0bbad3730d2505b7ca18a1a0305b08b1f7f151ea32732ac92e69e39eef2a9d0923bc3c6d9856f271467699e910314e381bef95b03674427c214b0e83c172d9f37db5f56c119cff58eb3bdbd1b9e0329b981fd064d56ca045ee695f25d198c69f7ce5fdf604f5b165fd6e54a7ef941393588191065be6ec043b1032d0323bced5c65d4aed7a26d31013626f296cdd026b82c958350e9927ba5603be8ef6311b490c4aa755f0fc94b46b4235d051ce5651317f62e3a6831a5b3e820f241cc3168c69a3f5ba964afa9dbfd65e93bc269a53b6355f47fbbe48b003d80591cbab5fe1f8aaa5f895d85a0f9712ec3415a3f572aa1bf34381472dd8eb478afaac09b84829147f5b67e5602aa9c676dbe06775be5ecf97650c779b63ed1e18bf1a6506a87998820cd5b451b4f6c532a218c630c991d9643d4f91e64555263d97e702f68e0f136c54fde78211c5cdb5fa5007b1953a8dcf5f57d165b34eb651e24f67a987023b890356237b0464ab930e29faba350a49c8dea32eb895f534821bf42aa69b66dd12e076afcfbb9ab4734399f982fb827ad8e4fd1a7545b012f62ba6218330e6f6ff333b0ee232314c76473b14a601034464b0f87bc04335de00f6dc7cb89a975b2b552b02b4f9a01bc0a6157fc167592e4edd5099dceb695a604f35280c79e848a76b486a142ef4dc0f0c95ae78f6d3b4d4eb0c6f5270bbf738fc45f0bfb065574e66ca2a9955922b6944613699c146cd6adbd3737ab02d0a2c0dcae05af60edc10e417098bb6d72151d90dbf2a49b61babfce3c256a12bc4f7d9b7f4180ad886ce3c81d549ed7dbf33398494b56692611d116aa654b15d213ac049ac13e64f8736ee3890c1123b248a593119c3cabc0d2d0d91748a7475632367b20026411e98f8dae7e740c73e3bb51d6c3fbd1c4514baed6398a07c588d9b0024d005646e7313b99a1fe27717edf1e5bbec8f0d4af6c3d734156f2edb4a977ab7fb84ced94c72def3291df7a02ef2ea835488f2beb7e1e722fcd620b4408a499648d451c871a755383d712312e0bbfb07d6c062ee97ae7df9a824cab7e132e309f39d0b20aba5f357f264d06dff165218e22ba3f9d419ccba666649f5b2dff544ad80e660eb43f06b78c63820a05f270b7de7bbcc6c29d9255b2f5d84b8003b1f602b8f830f1c4f50c08b37e782712dd5e0b46335f0177339a1e3e3b1fbf8c21299319a42ffeb33de27bac087dedad6031a9bbcd7f9f08099867d65faaaad4d1f24651b15b526ac589a024b81d848ea6a988985d6791ba5f764acf1637eac749d84880c781095e5312012dfc988518b4910cc0489110d881fa79d877eb10467d97e199aecfa972de285e77a923d9eca02290ea21076fac4389513db183d915aa305c29e0d94825c0c7d6861b521d72b0cf1bd9f077085b39e49d5ac3e75bd96a46564d23332cb8c2d0703e9bea0364466234b5764b61efbfb668888a09e5a55db34b5294ba198f964d07fde9d4abe014b7c56df48842fcc5fb808fb6bf144e25e4b6da306a8c1bd2d7b9b464a2a3be0d48f413e381608ba21d4b8f23538d17cda975e124815bc1c1116b0f9e19d64e606ea25bacde46f68bc89cd403e381cd562d84583b0dea378138df43850dd7e4a11db48a445f132a9b742def8ba0a17606801a2282657c4cd8b8e2dfdb9ed07754d0cc64b2e94051c867b62e6b7871c621cafd4cbd283bd3681709dcb8771c76db42117c7bad43d18a7e63b3bbe4bfee514f5d3600aa4835a93a439b1431f16dd8b2c203ea9c0538bf278ac7ef7f037e7a41435a22ed6a9d05c9cbea39611a0a5c514df2593a3c337e8cea70e3b3b679722c33b3c0ffc42b04f4779afe1acfdab8f067036d7cf8699477623857d372035f28f32523e1964d6ed35d7c93e9874f61eebac3406c934b57777f75ca76a8fb6581ff21848e22b7bd32d0140da0114fd8a48e3af9b02285e8f74de79edd3b203a6d75c708", "0063525353006565", 0, 1157052904, 0, "d7917325a9908858e96bc5d374625c16da1038d81b7fb105cf35da5848e5aee0"], + ["8be71d300135e51740ceca5abd5dab38e1b68ef95971b9288ecf28230908d75d0606a17beb02000000086565636563635353ffffffff02cd4e010300000000085253ac6a00525363921a8f0300000000065265636a6563ee4cc3030252c5cf010000000000000000000000003bfeaee61790b4470a2a0c0a34a221c35c7827f72a4ca90a3af3ab545c030bd5bfe3e01415032e85b488667566bd1e15032c570b9c9ee4bf774e1cfd2fdb414030d60862212860b15ec4ef3ecbf83832cd6fe8a792edddf40bf9478d4743a73c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006dc4cb4499dd9532db6c67df2b3b8d4171ac9b842e94bb0280670c1b696c64d65d7ed7228c24eb876d0af70d12679d7fabc2ee67d0812670464661257a235050e7181f48d4abae590c959c1a0682b2bfb807b7c2a67a5e4249e145f5ceca54f677169e2a9e2a8b62fcf67d45d1906f81700f5da9ca6a96dae64fdfa0ceb85663032d0bac670e98c291fd18d4f01d2eeccac43599d3637dac1b0b8e71fa24a044df0212b79e577046c158bc099251ca887f51bf2aba2f7024824ae1acd4886b1a46270a054b23cb9758e6b64f296ce22425d96b6a02db684b9d1cda5d5718edd56428b2668873010ce60a65b28dd64cb97901742f4c4b94e6c39c68fd74bc99339525720208b395cd87f2e8239a602a8e0a357881ca7d64639d4d86916f3c696752fc3e8b032530577c8447cb5d0a431d0896b046fc1a5bbdd575eabdaf2143c3131dec477802286c40f4b288c767ba8d40e687088875ac03607202794aabddbe277539c875c50213ff658f2b85dede1a2c772b9d059c91925d6f19c740e54c9b8a0b947e3cd1f90203a7285035c3447a3e55af908b9abaa6378d6591fc374a2cb4bff2e67e61af2ad6b7b797b262af081765ddce06af275990824682a3d9c6d80cb7bfa13021d64faf99e219758b4700d040d4b1fd1fcad726dbba99b6b7419e014b83533f9353b9930a42b573472ecf1f1ab5ef0fca7804d44cdb8e0baf744b10f6d8f7a87349b137c9c30cf6b51ca9a7025d21bccc74477a0318ac221a308d7a6ae7204f232684df2b43ab3c22c517c616a45cd326b260678ff9597e4f93e4500060d687cc5f88bd259686ebe513d1433344b86315414e29bf781e66760ba41ce5ec45b53e2d16f563af8f21337660b5a59d85de7fb7f4fcafdf627dbf2b99b702ae1612cb53834a50e114a8410dab9891e9e9848ca29d143ec0039ef09f80290486f4bf2a457a00ee30ae82399b07829c5bbfd113051ecc237b07d75b55f47915ab5710c10c355bf02bf420999f1d7a3d28017a9e39e066f6dc653d868b6ba617d44bf31bf978c27cd9fcd5c777d8dff1ce5b8948dfa86e17b65cedb4d24e6a287938b3e0ff0332922df427aeae42d25711d5ca6a84367c10c97cc16a6057ea452d1bf411d868fdaa5cc1a55570611fa1a59f9b0f773e0ef4d66dea2ceed33955588335a7383991114a621e3e3c31a39544ad574467a7c0c1de7df20b893c8c28ea1938fdbe5f6ac3fb6dcd66f30bdafc9952ae9fc9d9b94c3c699f80ae9564349182d1657d3f730001a645b8b82bac262daa2afee3c54017afcc9d0886b38c055b93e9189401a358133de8a0e4d3039171c046dcf157c1edeaa0027e41a66b5a007091a579b81bf76eb3ed5e567f23549d0f6c12290236a6d872d9724a14724b3f681531271fb651a2ab12d33c3c4533e7085712868b67cdec682758f2dfdc4888b564dfe17ef76f748f24c44ae926477d877b531bf5194877f57fb265cf0298b0b564190d8f4c070d6c2a27d2c9426f0d717f8ac59ae4f7a69e7662b35054d190a786e703706ff3955bb857edbf8991b657bc6f1407af3cdc2652060a62f30877d75f838f529e2ad273aa17dafe9241794f9e7145a9633e9faad5f94689ebdbbc84c10dc70797b4983b821efb2023559fdef121cbfcc398dfdf8234dbc0c2c84a0aeeadf2925a2a99cbbeae6cd66c1e06d33abe7caacf52f3cd9b0dd2ddd21db1628b92e79dd8ac709f902f8493371ffdad344999a560ef4028a7e696dee3bee4b6a213d643c819a008ff7155bbd785f473d2fa9316019fbf435ba8c2c7c7d5aa43a3366345a8d14e183897f75feb347ea36946e1b203b84e64f981e1fd5ff4671b5ce18ef2412b58bf15f2b272ea59ae34cb4c3f74c634819fc539c6e91129e27bbaae11062139c4f20ec1c178f8a90a3a80e629b3603d600ec1c093cd5cf40d35a09fef0fd2307a0df39085ce10d7b9c5febe5bb830f2043fab1cea31b2f5e35e1977dbe9289001c3b24a64a9b0d23b6b6defb43c824dc389524d4b9a6408cd1b4bc66e23a578e9a93ce0113a41a3f7434f89f0ae74d42f657824c1321c8901dad104ffa890cb4c84476337863c289987ba6e8d7a1f2368c16b24d91ee924d97dc7f3ef46e2f38b9f9016f6e14ed8e88c58309fbc053320e366ad0ab2da19605319d4299ec53d761fefd609f0181be1f639a48580d1fa4e1f95aacd5a9d4a9a6864446fa8a6b28447b93c0c0830ee20b7e3da3cc853cd6fe49584321755be8c829d847170ab2e3fbbe537453465a3f9b936e14cd21ff1c8561e01000000000000000000000000f7cc88490d987817c46e88744fd75653c43b3cbd5f37e5079e9a55a1ad00d7dfa1dd8d57f97b0f54cea3e128aeef6cd3ccd711430f22387e6b51fe5a5886595e5e13e8b99bba7570076c725bea290ed0e7be011e32f23774a58544dc6a203f4600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a61389626b8b19e6d86bb099b6b802a856ba603efb29ae2e4c4b66e438c6151652e557eaa7c6cfda78fe7fd46e057483359c42c49b7cb67d95b233af26475e0d81ad87b99fe9114b4239818538af1d2a16afbbd3f2636ad28f8a9b4d91d8cd11d613ea5c54bf5f163fa0cfc7d6b7eea2527dbaa1c08ae4ae13d69ad5e80b6ebd0306b32940a32dd03043904b9ac0b3dc5d69a58e8ad06b73011f44ca5a4bc7c7040319cdd9a1a9b887c58313d3301f02b237057bf69f44531236823ea44df058c2390b01c01016464f8d9ae36dca21283bfd1a6a08bcae6ce25c9e730fb5a216a96cc827c4c903b3643ef0b63cce5b103e45cbeffc026249fdca06c735122bb38ad9ee03159c28b6976886e8778a2f18beb73b239ebf8bc824c1cb24e736336dabe4d162032fd9c3a772d8e35fc2f0db01ad6ef3d134e0f5f769e8bd9dee373e39b87423b40227fe865605512174220e258f82b7f3fd49853db26febf7af0ba82af7c013e3eb032944d4d1dfa91ac4fb6fb53ceab0ffc8d60d86819606bda45ed4e31542a305ad0319ce13cfffb48f88cf852e00fb0aea704ff6f3ad571072ae29fe7f45938bb91fe1f2d888e0d6363de53d840f5ac0e9d373bdfcfba91da9263f2ceaf66d556d071d4503c5131974cab98c30d8cbdd67466a59b8d4fb7fc2dab0ce5766ae1afaedd0dfaeb8c99ad97c3dda258959d707d160d77a7f201024c98112d8abf872c0c8ee59d926687527e22abf63ffbc20c9b0dfc3952e3edca83a4ea20644866217a716484eaa3e754c9df6d8e7331e7ee69d247ca4a877cd4dae857f35e52771a915d473b6e6a03c42e25e046939116012c92cd678e9081f112775dc231d0a9e9e597cb8727b337ea6d32af30448221d68c2ea2b8ea1fd2592ef28407203d32f4c20861a86efeba20b83a0550dfa667790fa8cbb2397930dfda79511d6e998c636002dc6940b22686fd4f209348ffbc57f1ee59d5d1a0f808ea4832749b3f350fd0a09f1e423e14a6f7a1d43e4c9273fdfb794a14f56bdcb963aa13777e31d8fabaa1f8e2d7c858b361cbe08a98320707e8674f68b5edec26b96339619c8d855aba9f7ee2d99440b42afdea5bdcbdab1dc75ffc8879e0195c7df07584524574be216d89d08faf4e75ff5e0225fd03d28ec2867742ab9bc4615a55aca0c6507958145850efb461cb7f90571c98b4f9ad954263cba88c5b71ca4f9390431ce617a2e5821742b8e53af0da27b7ffb5c47883ca6df44925a1f0a499486d06f13bd078074955fbb12e4076008ea9cdf78f8fce7245bc9f1e03f754f0fb9637e4a7ce3f4f7a07c5a8f2c985dba069d6dab5ecbf9d273f8bb52ae526a2208aa034aa35f10c779feaa46b4e507e25f1ca3c70b514d64d39edd5e8f215522ca1125f77cddefd2236715876c6a6959ab472afb8417262726384c03035953f296e500909502c08fc4c4d8f3dab94d55479d5888baa35a8c695fade4638d1f7e8b706d5bf5a83716c2afcfeaf2e3465741cfaf14c8113807cd7657c5287a30bdc7690cd229b6e9d980072e5f7272a8a73743b815b41b9de3d943b78deae8db5f0e0f53f16e643e7b2d09c6fcd4724ac2c41d85c2c9e7f3af8db9230e2dd6fe69766418a25cb49772d3348972b9fd19dd870c3b7714e991cdbf37ebd66d85d9407f8e448de158e63fab66da5a448ceb982e1d5475d8ece42fbbf819f2ceae5be343af398d58d3640da731eba0ebc05b4ee8b62c9cee41d800f3098123b5dac8438519cf4922e09f138511f3da560bc1751c62ebd21daea1b4b79ad651e4bdb96abbf84338b90784f6efbbd7410a22ebe5c2ee4367b35fef814fc7216c9506f6bd7d440c7580755a95af8931910d347005d5c407c03d9cad3b639a44c88c23ab996112f47ca605220e522f049aa6640065787aac6c537b6f6cf9e1e4d2d3ea7d926d08d5ffbb3ee75806fad33c949567535dbc0e741424e20aad8bf917201e3d57a638c596768f68693ce7c1978015673240efcad7fe49b9402a8ce06b71cff975fabfe4ae9ac84711fd4afb6d3f72cbf6425defb64ae47f5969f18857fa18798a18c8dec1b4b1005c771329df5369cc1807ef1f30d89fd8fb68f9f50f8c58b3a6637f2e1698f484c68d1e9a796417d69410e3ba7f88cdbae1900c37b4969e4ed62bf15a41408e447f67eb4f1e097843ea54ce73b36e727036179018883a8842bd6c8cf1e92fc86ae1dcfcd5fb8211c08b21d796486865f3ddb22d1c49a183587a3c7db2084b3d1319f8f2a6a6c83e1f0284c98f5a206897422640657a02acc4bbdc2f54b432f3aaddcdda6cb370954445df3c06ac2cb57c4c9c0fc9e4524e0084000acca4799bfbf20b910cde84830403cbe7fee84765aa015772f9fdd25fff03fed4bb4a1e58634c65becee01eb95c0c28625c54572602f81706", "515352520063", 0, 651253559, 1537743641, "8cf6439f29fd7546efe07bcb95b1d5450b93280efe8cba6d4ed90eb585d1f2d5"], + ["030000807082c403035b0ee7cbfa73b4a7221dc145d8d691b1b70c2b101f51706ec33259884b14659f030000000563ac520065a6102611af9401352b6a17c34e9259d53131b40c80d57824a566168edf487c0f8044a1e40200000000ffffffff34a106e8f24ad22ea45fbcea2109f377cc0022e983a9402d35c6466ea65cc14d01000000055353005153547871bb01f347f303000000000552635352539b699a3af22ca2c300", "6352", 2, -467320790, 0, "013d164ab23c56453f9b1dafa2e17dab82570b483f12cea8b6a338ac3f5f47c4"], + ["916d733701a0b971fabc2464c13fc261cb3b41c592b10f8e8292403133d1322ab33f05a28b0300000004ac53515230177917037f9e8b040000000003536aacb51a0e000000000005516a00005145abc8000000000006005352ac536a000000000100000000000000009607af0100000000fd84613ba7f705a5037368da6b04cf7f2fbb27aa0815ddbcdce883d99d90e24451b9d1767244abe36a6192154d1b7406c3de9617589d08abca78b9bb424aee06544f5e3fbd9c6b232f03a0950ae32af07bca66843973df261f40306cba13c8da000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000157bf345583551f1b7002d4edb8b3075d756417b6e6ec9b1aab384fd92848a0a53ce2174dc0814a6894e679ba5b395c9d598aec0121141e57d22b28b6aa622abd346a22492766e0de13549938d7baf5522f5c7f1179efa103a41dfe9aa0ce42acca31a725973a363a06317042efdf2eea4c72d2127f7b2912e1d8f4e9738f230207e175e2fc18f1aae1b930c40867ffc3f8971ec87248968b554abe254c0c07fd032a07a7cb2750573df30388b230e9332d961d845fc5aa07b63671f5e6e42c705b0b03ad0819a901b0abdc40ec4583a23fdb631af17e2e41b8e91585eea3197711f738e7cc0ec6bc8d8ee9ce9c7c319e966899c949e58917158efc2505c755a75e4002293a535d0e490dfb1be3eab7ddde00b6e023940133bba22e114057606a1a92240319f25215ea58c972b17adca8e011b5d39d38aeca753bfd3ac9dbb80b8146272e0322a5e70b6d3c91a1161c1e251a7a3ef294a5ba97e44307247ebc72145684c113020a6085d7533b3422bae9c2c07357858b2d67d5415dcedbd4cd628cf60536d069033038e4fde7148e35f01f808d62867041fcc4bacb138e01cea69e58d82a1a1d193e753ac5ac236400ec23baefbd00ab5371c8abcd85902af93cb408e7037f734e7aa9ec86e7d90fd5c3aca11c8dae714d6cc7c6a9f6651800ebce0e949aa139b1bd140d68a4872994bece3e78584f3d4fab4a3b82f68e27c6fca3300da6dbe667c9d7c958b3c4bab6c875a422ea2a20f3a861f15b67624bbf1cfb63faa359a88c5ab123b7477ec99a5c282f78e250f23e1ee6f7b37d9d7b9cb78127b391965731ff6f957b7c9f4b4f2a561ce52a3f54c39663a2e4d633111bef22c5d5f38e605cf556a0534f96e2e677c1183691a851b0c9bee3b1a3acdec0802211da8989207969d1d44dceccf06afcb074afd35ffdb0ff32701619dd0c81097fa90c0884dfc9e6477cfe0110ff2afa2062ce4f65a2912febb454e2bf890550f58275cd78d6272db7fa75b7eaad49766137b2a0f95975567443c5b822fa71ebed76a9037049954438ad5ddda327af284ca619132f9401169c8b6186c171a37fabf395d48dfa819caa47e7262695fbad16d7b4d0040cca1b7c98c3ae4062f5bce132cc1915ad45ab7bdf41b0587692cebd8edaf43f2e0b2de8277df79f7bdebf10f87172831e723fff04847099060d7653a11045b7611c17fae613114807405263be77bc6466864cb21f7afedd1366266a7ca47bd7b6f00eaa956a08fa10772242ed061abc0551fad26c367fc0a0fa38a2a2a9efd4aa9b36dec6061879ffee3afcee3c0cf4da212e9919a7d9d610a5b72290b2d68951eaccb7db572d069d4bcd927080bc0587d685ac5342cd29791f4dd142a4846632c42983e91656a9cf6f78362642e614adc1ad479728321884a195f552336da52c870bc94117e0bc135cddd31d36cb34511c6dc7dbc76da09f285b793c91f0aca017a6b50d9f887c5a97db1ca246e0d3a8357f78f6bb6862090afbf16fdd3757a41c7915e00f76d7373975d10eaa0e32fddd433f0abfed3ad84d5cb444c6bc8c6097249e2432d9a8d3c733b5f8cedcf8c678b9d9b7611f302ea7f55adaf02426c56e78acc848171da483040df4223cbc77fa0f288f19c95178e667358c4ce46839d03a29cd92c4e7f4c8a000680abc32d73941d969cc6618ee26da5185a9d688d77517fe4d199bf93ce087f931bac65ae44d998efbd0b5259d392682ba39e71d86f036872098fff5a3704a4e173f9d3bb9c12acca6ff2ffe21f1eaf0a897502e03c5ad010e9cb0da9722ee15ef87e1c17b0dd833bbfe9fe60fe18c3790dbada2d11a8bc0c38ef1e9e18d1451f7373d99ec52a5379dbd9becd5dbd60c2d303f40a83d83dda01717157eb6707e6ec1fde8ef6624a388851ee8b708512b1ae4b6b3383547f4d1c9d094e37a263e69faa216e8dbd740fbe5197ddba1612bdd1b34dacdb6e660e57b8454e9f9c1210829ded00c2c9aa43e18be17733937a86e4f184014d23fb8640fb8623585f5d74b544da76c7dfc3bec9201eba10d8dcb68badc82256aa87be050bb97238522ef5592742937d99b4ca8f6392f5b9a02788c51c2366bf555858cf24e34334c4ce6f4c627c517a65f322e4b7f113731f7f723701f85ed5386d2d3499cb4b50afccd5aea2b4d9fd2b82d69cacdc85c4628bdafd0d93685df0bfac66ae9a001bc1bef1fecada2467f9c53783d650cfa74ee7a7b7b0c4b4f5f5492277590f1de97600bdeaf2f0896882378b5bd210da8a46b5f216a114a5b6ba3aa3575cd769fe5cd02ff39f3b5f17087680e2c759e84aa18f77f2bb27db59e172a3f8263da24fec234f8ba0d32405c43d61fbe3f8d8506c72b619fa8efe8e85f2aa3c9d0cd8290d2e7dd20574b725a6348c4758770257a611e2856a9cdbe0e350b", "ac5352ac6a6551516a", 0, -83645321, 0, "2a2fc2b80f49fb0eade3e5c65150a114d967c3b11f53d347120487a72d57b427"], + ["030000807082c403027afb1649e7da510190abc55b553819c561eb68178c4319aa66615f1922560daf0300000009ac52635265ac63006affffffff528c78ebaba1bcf26207a4098b200c62fc9207b20b8da1a5fa18075fb0bc14fa0200000003536565f4c3a7f1027258210500000000076551ac65536552543e8705000000000653ac006a510000000000deb4a361010000000000000000a6183d0000000000e7ab3e106e3598a892591db109a0f41c22b9dab5aa76df3ea75c59ab8feb36009b2e834d861295321b99e77af91a3d44edb62326685ba5ceea7f03176031fddbe9a7d978674472c29f14c9c4aa7a417712ad3788d78402a5aed657854081b707000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009451601f70c9e3601525014aa3ea7c8e6d18b165c1c383c16796baf0dd36c39ed100a878f3f1ee9ea5d780c38995c8b392eeb14916e8f2fdbd5868132bb793fd132239999932dd16af9729b14399f58619f2b52643095707ff73d8a2d1804a6d56a08a3aa7203ec876dcfcd284584873dd0e9e04a4cb936d482e5d3f4f821d2a03147a473bb064a0ed93121c083aec70bf2b36e3e9975996085c5b2a7332345e5102062c1d87769890a918c2b782f78b5ee6849f9ea3806cae8a8f8b677c8787f3510b044e5bda129fab05abd1da5ea92515034171af20a5cb9f41e14affbf87f7cee52c036fcc9e234e40dc86b46afd88c46a5057a4f81f74d101fa880b24ae806265020f9d07ae18feb60dea33486b873507fc90f30f11d53ef381915d3eaf0f71afd2031b25a00daa7132d33ab74ccae753c8b2999fa1d55539ed471be405f32b041909021238063a391d5d592f292612b1398bbe54acf4fd1e5ea9bbecd9327a06cbf4700303ee627fe709f5dfb387e7271631d03d7ade614cc4b78a21a8a74e4cffcaf8750309f019dd2aa4d7819faf6db8e1eb42b698fa2c8b9b902274d82dcbbc5a21e5f5952debcdbe24ac027ac8aad93eb52b99ceabf7d7178118eb018be0bb3c638bec89ebc7ee739d29c599da0257ec196af4f4f70b3f800d4b1f80f384694d6a5eb6fcc7fbd4ac6d7a14360ce63c1890667eca613fce3e16c12935ea61fb66418bb994b1c9fbec50278ef19281efaa02802dd07e335e24c9ea6dbfca7bcb7dcc6b8ec524274de779691df33a51607db2175616e762fae79ee2672b64e3e084f6f3df3b7928f410125366c6e2a4527f9f7df5e38fab1f76897a3f23d961e110b0ca3ae91266af9f34028c01ce1a1a18623df195c7f3aa95ca08812ec906f459b3ca3a2569d56830ee380d52f4caad1b05e18f79b20727ddce2bd6057a961f57b1414ac6085ec02f6b66809628afa8b2b82075299d3c12db2494cc3dd6aa84cd63ba6e654da0e27ab7a35f32d59a2da0247cf011a19fe44101c79829567bbb31faf0a702a7e487f177d3186ffc265fbe9d067ceb44b311928d4afc66dc83a08d20e9e2f29f87b976fc42d092a6f6552103ffb11d6abd64f54f3781bf6b8b5e6916d9f98fd4e816c82ee9f92766350e05ce631c3727d1f68853a704443d724b2a279650ab7a400911ab8ad418652dbaf0e3fd857283b6531e99b3242fe7459982067eee484dde4891882e4ee0a680833ce8af9c287dae3026c2567fe549dd7832324aab3a9ce61ab089bc0f2c91f6cd894c708714916470d593c54de6d5476293c681cbeb21ee7b4e9241bf2161fb342f15d3f106ae0cb2917eb13275c6d5e583f8eb893130bdff3d756c733c0157bb558800adda7f2bb504871ec099e9c365788a4e6026d7b06ebc41ae989752aea68d3dffaac8eb7a32096e4ae38e528f6e3b152b26f04fa3ffc5b58ef17f78bc687e863fa15361a2e4e71420a1aa2509629fc81e178ef13417d774ce99d79a5d8bced1ef02005fc66c3f58883ddedda04743e78c28b6c3f4d49f51c3bbc8fa2137db5ace5b60903e1913b8e0ae2344983ec051dd1e2c2f57862844956246472044f09c921917ef6c3ce7442298b8dd36c736687dee6592c80148441f724bf83ba40989fa00bfd0633647a592cb8ad5a754d01a32337933ad2c7ca8fb4e468f8991c633ef1fab32e4abea798261d5cc6caff382b172ff041e7b382ec02490e438dfc279b3c8df6fd4792f383eb4aea32c5c8155e410c39885a18eb1e7da6a8de83aac21b7868c85efdf867def47980eaf17a2d2cdb6a6cd9d38ef89f87a9f4f347de41399b1a949fbb91970be9c211a294ce838ec8793ad477046ba8b809a69a8b77967692a44a9dd47093a2efeddcf5709129d3ce587a1d9ab9d5edb0d369154285b7eebf2ec04835e0ca3dd9fceba05781bb0c79a990bc83903e921f68d5ce250df955b54af70a58c9fb0365fa5dbf70bf8cf2fa0c9ef70363c7d4c8852af63fdb03ee1598e259fc40a814dec22fe24ceb46577b2f820f7df9552e63704f04ca512f374494ab4e983dbd7fc4e70ff2c679c2722fffbcb23f7333c632a1469d2ef379e9b38ffebbf8cf7d0490dc2ce02a8fd681735755240adf81c83c3c914b3b6c1fecc59040d6e0dc30e72767170cd9cefd3223afb1db21973d578bb4440984f53b283c9ce4cb5f9d58c0153f6410b736a321211da6e3bb112b4ffac1a5c6370c78d0617958497045a6f8cbbf4151ed5004caa93701b6d611d26e4eda82c39e9412d4ee8c2168fd18bac43bde409d084b54d822414cfffb4adf11e068643224688c3a5c93a5c42cf5ebc6ff8e967cc71c7d4f1b1f28390ee8312c24aad3b71109fcba1ff71a98a90bd4a3fdad938df7b2097ee867a31e46729c353868899275a3fb060258e00", "", 1, -2141711051, 0, "44e5013d0bf41a1f872777c78dbfcd51881b656996b148b4f6d704d7c08e3f02"], + ["c019f33004ee8b83bfb96870c2112f6a9633167abac3c3c930f6153a9e7d2605a43cc354050200000009536a536363535265536156f27ff2180ad35d9f3ba768224e60b6238e059791bceac6dae6e26e9ff946ea3cbbab030000000152ffffffffe5d6f63639e95b77d815c832e142a9fa40241df42c5397b43a7905483fc951d303000000025152ffffffff942ec8070e30e12cb114755cac080bba441e34e4c09e1f1d1857381cc35071e703000000009f30af6e041edc6f05000000000765536a65005151f8cd380000000000008fcc4d05000000000800006352635363ac6c547e040000000004acac52529365920703982dbd00000000000000000000000000c56d4ccbd64d4f43e16a6399fa81bd54d4f39b3b3e3c4711094b61ed7d393684b5dd80df4333faa87b65d4c9a545c90c44e2b9e2ae7943b409cafd1aa09c2481d4a1324083444d6929847d897044e8164ea4f243da07d66a866d8e7df15d68420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c2c3f333d4fa407a78906cc9fc8860a3c7734200c78521a9f05c7ea1ee083a9f68e759f2a7c865fec0c87204ea1505a6d4b266c1b626d73ead1cf77823fa1dd030a25087807f74649e4535ea896e97106e608929562af0178c87bb9cfa1168f305f1bfd483de808a9ad99c406dd4d4f7480cd061a85a511017a587a852b7270320230720744d86f6a04b10db011da288f6697ed46f81704fcde6ce0a3d0f5c3202216e0efb5880c740afe4f7a10d4f661793a3639f0921f35a5461c4a0b93bf23a0b00f0f218f0ee9094f348f55ee9d674be88888076671386d516bdc47edda234d9726700649600d7a4120da86e09cee022aaa9803e23423426df00b7913b87eaee020679ca2c8dade15d18089461c51c5dcb1042b4f71087d93ad037dfb6f1ea7e030216864a1328fd2c159edfe27cdaf03ed98d5a97111232e7dcfcd2dabcdf58f8fa02146e86abd3d18362a7d7e37f29757769a55f68a34fff7f15d7aa2da30a7c57c00229ff0e24b87261c4e495d95661450933c4494621deeb9595a6645f50152adc08022cda1645c327f9407567709b9b047ba9dbc0289552692ef57c500825ab0ba09d1b1200ad27d14ee8801387267ccc8501a2b657c301e2c982a6f0e53a20a94c66095cd5496a9b35a6677ebb054bf357fc91c6001e19d5c88652b9cea7d6cce557ca90d55e4d05871f3ad4061e1b8378791397fe428c67de2f4b1075bf55c08e3b3fd674f185779481b48e60bbe6947e2e017be0b126c98f232580d7640f1b0e1980be533dc17442217a602f86207c3a036f99cd7433d18fbca3df0036d9faa02ed80246d1e7e51ba1bf5909b160d08badd2a0a5eec96505c451923f16b4d74e898b757cec36f7b20cff068898f529cf3db828021a5094c0da387d953a74e2ebed784c902c1d3a91fa1c88adba72abccd0f8aea5c22be0ecef2dc30057bed34024765c229a1ecef49601d1101f859d92516ca1e4e634bf41a57cf8043a449318aaf59611458123e06abad14ce077a2bafd3bd54128f3fc13cfd6001c04be0ea371f0825e4805de4cef93a3328e10132f9901c388864ee52c59a53920cc51b105ba953eac77e6f4b73b3e106df5a53e36197e87777a848bdd2b49b70519d4cd79ffbba1c7c1e4c37ab79fb4edf108e2b7f7ec05243aabad3597239bc3c02246b43ed718ca3e44105a87903a0a7ed9885161e854f0da68af34d0eadcf5de126d16fd25dbe1c8b6fb4b6b233b315523753fd0d71f376c61a004c764217e2fcac1cc74c46e17840e854c507fec728e8747898434d3f9fc69084187a5d88606fb495afa817297498f5849f0185669a24095b7cfc11e2134c4928d4c0023f5111773a5f33261fbd43dfe865f784727822906ebaa8dc962b8d9d82cfcffb3812c9dcdfdbe47087ee31483fd005226f799bd0c4a57374dd17db5524417b27df671bb6c01cbe41516e4a3caa21fb892f64b334cf9c0467f60c7dd78527b7137ea8dfcd9024275683bb3c38fef90856eb8414322ff135a04bcf5491417de490c7a44872a696753819eac045b0e68d9dd780049afed4eb95d4e5705ad8f2918889c1f88a179e05c0921b2dfd52655fa34758d0d1b939616ca7233660409f5958fdbc18e2b97c424d88837f70adb40a2ad018294301d5f26b650bdc6a0dc9904c7d852acf1fbf8a4b5e23ffc155cec9255c1261e2fe66166828dea8f955c4d4970834ef63569bfb7c451dfede501a66af2dde4ab88c8fc9b7503df1f9aba3a492c7742ef37f74d705b7af2ac9478706f9a448084bcdab5217f58db3a16e191084b1e7741ea775820bb6d110c10380dbf738bd875c6290fd42e776c5237819f333eff90cfeb799da7705515bb792ce3a862a0408e1ba86f95bc120c39bfd41d6a63d579680980ebeb046a831ecfa25c9f4cccd6f76fc4c1450c04e655fa9524fff29a60b50b5a483c97b11dace933df6ad040b77a43514abf35e1c5de0d60bf61cbed115dca2e0213d58927f6bd2fc0c0c1752d158744b54a351f9da327fdef239c23a21f471218e6c432014d4f234221869cb2efe834a9fde2fb87d3c015863bb08e69d1858d3f8fcff69026b492c5076837d81decbe08e37044e988f9bc083268c59b261c42ec338ec54949a46ef8df97c975122194c4af620c147b84e525da8f7672c103f719b868d303b468dd9712f9e0228575beea97417eacc47771537d32bd7fff91ed0c1f78f698b3915e540c381dd113e4f1ee00ab88b87fc4216da339706dd63fd12b13c8771018300959e3cc3be7c564873c16740000000000000000bfe4c205000000006c5969ba6b0b90eee463cf247c29dc25d7ea476d2313a9518d6461bcaad4f24620713dbb1965fab753fdea279237733a947015cb2f88fdd17f835f4f0d2170f5539620f4372511413f88311753c86d3925ce96aef166e5407b8a04d80c8cd58900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000462f754f74832955e16b57bba7cfd84d89c1e9e988aa0fc9714713df58bb82b03cb6f3fb90180c8d4bb7388603de19a928bd6784c5a1c0728915fde821d73244974796bcecca5c860e51d982e082c5fb9e0d0e3b23b497040649bbac0fdd75e87ae07ef32c9f196b4182ef02ad8cad2f4cd9385dd0a6200478b35c89ba7012ff03184d9ced2a9643805d3e4dd8d2437975c67758490ed64b0e5c09c6691606db34020ac42a10abc2bc32d3e9b858f1d07c421c4a67d191f8813e3b7309a1343771f10a03efdf1dd37f9a2f59b36a73e5a41b00a1896a643983d14c587c4169e9cd4effdcc5831e41cf145c9a1d33a4b67e8e8b3d0632234482d5bbbffdd78678e4e771030a6ce42d5f9c1771b5213c8ee0cce59905f5b9f7ee290d8733ceabbb7d2aaeb00217aea5ce9b76fb324a30448357dd1fb2dc79bff8b1a0cda9af1d6ea96d1656400302af6552652a582b2bf1082c3521e2cbbb401ebd82359896e80e753387a605ae021f7510a81137f492b69f6da3371c5a67ce468f4f47c5b16861f4e04c4f6ec950032a95578ab7eb582187dbe142f7b522a6f5a4dba52a3591bd2d998a8e065ff8bf5cd530f6063f58c968bf5e58153d9659c896b93b054f0d59c6d16d90e46be7579a5751433fcd8da9411edf6d819f780627c8d504a273abf15651671a9ec1358070222fb11a86fdd709f51db59c29c991bafae8beca17e779d9240033e8c7e90652ad4be255d697d4236d1f9a3b32a640d7b024e2303d62e4583eb4beb996d9b8a39c01f1448821f8bbdda8b27dd8ea3cb6bfc0968defc1f7857d888e09057c92ac7fa93361e7d2cf8c0cae4f560a0e30be87574d12d912ae0385f1dcc6f0376f6dd7b0c88c19429b4dccee467ad79119bc1ed66980748fa50c3b7d92ca022e99c9a36e95c8ddd5d837c08a2f668a1822469ccdadc9c477f790b7b5cd950effa54db3156289494805f3dad6572cfd0dcc258ab02381be72c9e3802f331956c762cafd364314e8894f5e211a698dd25ffb44ee5f2c84a9f41d735ba05a6fad7c2dd5d3fc1f131cf1f7e29a3f7bf435e0200b3152545d7b8e0708c166c171391fe6b3c411a1cd0981c2883535abcb09d811bc2f842d6dccc9861051bad30c061922593aab1571c39e160faa2203089f97d43614ea572008a3bb2c560198f3c4a0bdc970922ec367b6ebbb84c8ec880090c2bb8cfe0edf898a240e40a6a6b3782c17ef0d01b5d563e01474e6168d216e9d66c2cd52a4d5b952045332010079f43b0c2327617a297408ac96247f5cdb0068e85e8b62963dd76f9fe92c747c2b565acd0a1cfeb31554dec2e30e96df947ad4bfa7e6baede6bac0d568d7df1c2c506d8d6f9737f81a2a2d6725f7375df9c25f698f9a71b18553546aeb0898d74b9077ed5d295e5217a95171c49ff787e423e6708694e01a650aa3f2b895542fcd09056128b309335b50925af6cca46be40a48f92947a26bf97b2264d7e06cb8e5b48d97985520690717d736c1c9257c1ca59a247612ff035d209de74814128e16f9078e50f1bf4c5230e66a61da9a832b64b6d3213367a8bee2b443c4bf30cd939fb3938c86886b09faa1a0fe67d7743c269b4a7715b82cdd39274813395cd0cb7f691b93cb404deb3d2c3cbd306ebc8cfbeb4284f3003f925efbde8601012bbf3f08c11378c2c45b46eb019b5a854f14849959ec39f087e619b84f4d2696f72e605090eba47be4ee5c9e21655048aeb099e36933bdf95f4c71d4d726bd5ea187e782bf3fdd261a30fcb11e77dcccd2ee29900b9e8018b29ef79763b1509f3011d04e87969860d550f65230aec326d776e500d764795284b5e371d627884c7ad26d9ad997b8f9dfa7c23dcdb3ce386ad290e4ded7ee5f415a9df016fdb598432722f84aee9054e31784d143e363ef9d2b55c1cd6daff78104e08ecf6d908395013266bf6cfecb233cfec05b0f109e6005d1ed7d7154f001533d3c4f3255b0547a6651787ab4e0b8b8009aec3869bafd86c231dfc7d14d5cc4b8e5aa1a4377d2fc74dc670b30735bc9fffa98d595ea49754c36b59a6e2756d8f858f3f85e8087c69f91820716db4a68ff8f2f2b7e23b1dac4ff68eff76199e938316b5db0b919f03d56b1177560fafdd3e8a553177b8defb82eeb0af3744d8299d0dc841aa05ca2253a1bc95b2d715eae88fa67cea04c586235b525a589450cd8b4aa26e4e45020dec46d47473fe2545a9dab0e3407d96414ab6a978acf399517561b7772b0ee5713d7b5f9a06b4e93efd8b331243099c079488519949d2f16050000000000000000000000003669cc45d60e1488ae94b2bc59eacfa1c8c7536e173420ea06b16e0222c8d1a888258a19445cdef3a9ad073e79525f653a98a049334f500c0edc09d71fdff64e069bc9cdbf5b4438d99975bb001a72f9a0463f8d714ab671f163af3554a73ac800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e16ba8fc883ce38d91d995dc0121d5aee910ebd577a6246ce6986820591b235a6c47fac0d652ff5c45ec03eb46078778a1cec82b712b4d305b1fe4a7b3cddac092d0debbb40d6ba901cc11fb55e16520b864af64c97d70dca988593d496fd0c47019e51d0b4438f448663ecb9bafe29ed0e9ca9d7d6135e9dba7402761b34cb10223ddc6a2f3371795db914d9340096f8f415b69887435959595afd038c44c37810302ba3556b2632a90e0bda8a3924c8a856acbbf64bae2a130a2e7449c59b14e6c0a05e57cff272427a097edb50d34ceab55f30af008db96435e62a4cc45b877200038212e694480a53e632cf01c78bbb750d19825bc2df308313f0d6a74659632e7030c521956effaccddfeda6c01e57e76381cfb9d91513d40e97d66353d884cb14a02092a7962d0564e7c561e4b706c04e7b0f606b0ee9f04ef4fd3ef67ceea33f2f0032497a7d90c18f36f8ccd623b913b0cef0077165af7a9608ee34b07a9532ece55022f880017d72111016b03e1cecb2c942064c7686b944cb669d9ae0da40c76a8e4022ba78b8b948a1cc51ebbf9021941c5ab27d6c113dc72b435ebeb3216cff4ffd73492ac7de7563c124282668cb264b1954574191adbab3b6f19a266dd64525d3a91da9994c699c1c05f16bf6ca68ebcdbd8cd53972f50b265299d5e693a9fea46dfd83c3772ffb63309629550d06958ee1bf61ffd29b738ebba58a0f561f90e669854615196484e870e6f67ce625bb26f29233b7ea23054963d31142ff11aab3bf7a5950aeb002b8c9b878b86f7b5f14916c5d5d43238683dcc8c44bf29570b3ba33e72d8bda66072796424a676f9125bd1c17f7585a627448aecdf4f78124f1b979b18a6ac29dc1dd876b10541005dc69fa46cf7f90c88e27b6a93111f0ef2234855c5602b28f5ac3c95d9863c8103648fdb78f718ac555b26bf5fd725ec8bf6e73881a0969c1e2a3854efdb99bf8095c85b5974f602b7048b4864658672e54577d4702691be3ed049e459c288f33abe27a9616e91ef2c79aa21338e240cc8653a76feeadf6ea1ebd6fbbd696b40105c7771b605aa78cfa66f1fe265133fdeb9e130544db586ba2e9ef21e43cecb962eb1eb6a24da7288cf1486407350dd7e43abb0d97eef5c5f7aae9e493e482be759dbe006ad8a2c8a75cd744a8da97b54818a0c926b658dc9fd20f0df2a91bc1c533b4acca3aaa0f280709d6530c67ae56630b9ee152e3b22886cf6ddb16ee72e7b1a0a3ff52bcdd9fcf3c85eeb93f02a59f80089c6c503679712ee673382ef37e62aafac57fa149f8748190fce722e3226477f4c5d8cbb6a23d23116b1cc5f58fe4eb78f3a5b3d2dd59516f3b112305ceedbfa80bbfab69dfb386d0a2ef9e03d9386effb08c75f2af3a33336bed4cb262b24ea56eb3970e940847d62ff1422d212ace06c41feaf9d1e9db73bea1af5c622af8028232b30dd15e75394e8ce03fef321c1f1e99b276ee42f1b2731d21aeeae1877afa1c7b407943ba2f6df243d14b211ae383e87b661ea4f630198609c5aff51953ec423547e380c8db22653659c63761402074018754001dc04623abf2a72edaa87589e1fcb41e8007e4caab89939aaa405845dc4117aa37b6d4a3f895dfc8bf91ccc4fdddaf1bcb3b0f6b3a94484ce02b755b933f0cf78df5d968395c577bbdc52becf86a21a8d45475e84f8caef9769427b5e730014af072ab430953d4097bcf0f29c7d91cf76aa37490c2033618c32ab7f4e33c238f2837f9d1672e9f68a14a86cfd8ac4f0bd32e4052b43db416f15f84234d6118f342e64d61fee54fdc479c0c06f86097b03ea62ae1eb65091c963d1b8350ec033f6682265469684b07ef1fa1af084e90848f3bc305169480d036c8a7cf2a8e5ce88f850a692e4cff300f845565ab3e3f8d86022c954b08cd2f5a7da9c898009e4a788f90eb86376a2fffab6ff714d6fe3556883555b8657b51d9a5e89864ed6790e53d86caf873effe60a573f517b1555472c031acaec6fa3e3d733736cc0d1ac69fea5464a33a52373f61a5020cc5804ed9ef0e85c21798dfc7f02f10e9b06894367fe33f7d21f83488fa851a0ae06710b6ed4b8055db1ac9e8aa15671dc956a3f83703d46e012ffa8977cbe35169429c04cc5a8f0d460dc273bec4e8084f289a37ac1a4e34e5dbff7f2fa36d809b89285a350d0bb18c459d4b1fd0c6d823aeac33dbdda057b54a41ce778fa8c368d1bd1a1c74c7222eb3fef16109e55ddca482b9e1734c2c9c25fd7e100adfee0cb74450489365e051e47887126754947e3c8b779cc95984e3c63c1810fd1d2c0f3feb29d78cd18a914000126a054260e03918c9e5a8a21c35ea7eb0247a466074173e5948593b65e45f025c14180f895c2f677e3643bf653dc225edbfc0cbfb4c858f8eb0e520ad4e7ec0f0d", "ac52acac6aac525200", 2, -718278866, 1537743641, "619c12ba2914099cc228aa7c5db51b91f81e114147a7666e36ab75c82f307085"], + ["a1b9a05f03e4ce71b428782acab93adc4c751cc1d3c85cb6d731b116e511fb449256af13d203000000056a6352006afffffffffe2f9f0d3505f6275c34b994fd418188b7350c718d1c87a606ec87b06be3aac803000000055365635165ffffffff2038bc3713c89dbeef6953902407d03ba6e3ad3821e293d054ec98834a85ddf8030000000070a0aff602de1b330400000000016599f6470300000000026551e97563e500", "ac636a65536a6565", 0, 1121641278, 1537743641, "4c25f637e1a128bd010c07c0fbb40420d12f606d3e7e891273efc83f7c47d985"], + ["2d63410304a3ece37d4f56152487b2963404e2091be0bfd9c7ea7d4c792a620b622d6c621701000000086300515153526351ffffffff8d1c7ee59ff25d19e7f51588bd80459024e120c0afc22593d5b137e45322663b010000000400515300ffffffff84e2c25ab25724221121b88cc967e31c8957a6f65a888c78a592c0c46c32aff103000000056353ac5353ffffffffe3b523f811dec65ce76e767de6c00fb469ad5b16c13a166a3ca3b1617142d6910200000000ffffffff016fd7070100000000090065acac006a0052acbd1b679800", "53656a5200", 3, 1908452564, 1537743641, "d015de78c2f562b7f39ef2f1915a58534c8a17e430d146cda06d7054c0d06f4a"], + ["b8a9224b04ba938e83147c2273d9e92d88d52119d3bb367b15f7d2419a1a7cd9a1074b874b00000000096a525151006365526abf5b5bbd485953e47085ca5e513557dc0755b57759dab5418dce31f875f9426a8fd6ae7a020000000352ac51d6058cb9474aa6697bf3710d612477d0e871a3bfb2ec8bf3c378a75c7cd096782a6c131a0100000000325aa67f2b73e381a91daa44341b5f4999c1105d3dd3b43e7846df317075bf4f7ea495510200000003ac656a65bea7c204cf876804000000000252acbc21f20300000000075252636a636365576ae3000000000005525165ac63baa2a803000000000163000000000200000000000000002d0bd90500000000e27d6a9f76900a5b737ebd949225e27d2d0487b87a86e1adaf2e7356bcf29537896b7082d4ee63c1322208f970e89db6149cd85f4431a0b1e6d87c8dc0e427c80e45f8b3c1e6ea30b53f310857018a2f54dd322728c9138d8f8d90e10fda9b430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000032c3ebdd9adc2299ae005fcc6c630f04ae6934b25f5f0a0be27c6d1cfa06f52de5017989e52761da5f1b70168490bee094f517a38223d8e0a2c7c26782614f54217ab16b99cd1e71b7b75ea9bccf054c0a734d3c9b45be42028f4b3b40926c78ab6a1b968b473b97320fcb927bb2a7427937e4d80115f8bfa87b96238d51131b0324addab649dcb401c1439ad03b2d97a1de0c94f8ece3712d42af26f44a05415c030e2e703b55a76be6e6647ed7883d4f91fcb9c0a9a7d5fffea95baea5751654c60b0146c8d2c4a6364302bfd6de263d49a14263bb0ff3ba38555b7b00b22832a7b2cfaf3921d12dfced2f8fbee123f9524dd355e5798f55b47ed00bfecef400443f0321dfe89460737d72d25f7d0a2cf6f7ecca78c06a0f4a67341c324a850012fdab0303e060cde9178ab87fca883a8f30d752f37f1e3706cc82390e11394de9ba4116031c47d0afc2c6e267ed16a7401bbc90785ad171bca62b693f2b15b4ab4010e9d403206ca6e59483be5c0e89a61a7addf549aeca7d887d7e650d95ffa89724fbdb0c0201d482e1d8380dc32cac78e489c2976fb6f2bc7b9370fa77caa40e0bc5d7376a07c6717fae391060962910a6cbfe7d1078c1b3db287615d74aecb4b226812637f42bd12d8dd24f2eae939f1078a564933cff6b11b85f65d672534b3e853629204c64a9310de680f0e3031e9903a162c9b2a23e686421566a33320f590104a1a7d4e482262d2d69039d6e0700eee95afb2463f135101c9670b86f815aa16dfd88ff2f389c3d57d42f3f827b29f6eb12327ed157b1a077cddbd7a4e95f150a41c3deaf6eaceefd769db2083d564a5c9418c7ad00c3cead8418454281de8c9b842944a6f18eb3cd9c3d6e54a24ff3a6ca75589d2c6b03664607e37f7220ebcfed860af6807bbe73d3c824cfecb09054f126c942a92b22d886b7dbc687add53f5d33d8ce98be65cda86cfcd8b706001fb35ee3cc07289a2e8561eb89bd4dac355ee95cea0a86bcaca9259180b9cd0f25ae1dd26c76a0eccaa5ad1971d56de758141e0ccbcee00148826e218eb54563824ee063000e23af07d6da45181c3348ae9ef535e8ef9915bc6258b3d56596c265a7e67b72b66f0ed30f0e90e6d873f1f566b7c9849cf3d38d709cd332960ccf33c3fa51eda315004844097e93856d01926664dbb98c0638bbc915dabac0f589341897998c9eeb09997576592c170a5ef671a77331bb1c53ca2d83480b27ae13793f564f4bd2be7dff0aa4fd6af4b5182f11afd092b225424d3c573c9f6cec48e8bfa64f4391ea3585f837a3474ac1b0dcffb69567e565a995f9914865da8f4419420ff92abdc6dcf2ba60dd3b6477d6a735e12d42abe979a437e6903b7c158286e070a8677a423a8089c37d6a186b1916c56f02b03390c474ba3d481828c121042dac38aba4c7480d5da8c3c87d2876e196623ebfea3262c452f964a3be50d67d324c567e62fa6d8b5ea66e807835a5b2199f76a9ced70cc96d34f5f513db56a517d610701891f896f46b867fde41e29d3a7c87557416648614ef948625323af375677f8a819d6326a418752b666ca2bf50fdd91e8b49df33dc56665b2576d4d5f955c9e6159680c1d7b2f4bca1bdf7ca78d8a10ff8fc7d5fd51705ed5187a052f96b841dd466720e3b5adfcc5dcb74f6a38f5495df125a13e2598d926298c5062ec69086d0848a19701a54bfdf46970e8b1ee6af4665d80936fece7f6d63ab0373910fc573fb34b609653d6aa66f10b879ce549d5dba9c442817139ab5085dc290532fc689002823445d352a903fa75b13d5cd70fd2739c42c784d9f21c802c71119a867f5487ae0729ce60f9ada1aa52fa12baa13dcd13a364f8b729a47b56ad06ffae86594232a52edb6e608c9496bb83d9801fc87a51410326e4f703b1acc34f1a6f004a347787cc1f3d663dabd682612e0139bf28beb0bcdb4ef10c02be935a3cdf88e3b333b2293bb8c49227b3834a918cc20fa4ba59ce9339753dd70b228e34e296b89157b465e6b4561cb584ef66d0365f7a61c2873bd5a487144a03eb63c0c406806a2dba8921d159f8623055aabdefea6ba87aab5a3d67255f259ba1d54c3ed65841013882b4e9cc991e333d0dc55d731890f02a3052fdc0efea4d16d26d2e5770e18d7b06f3b8395cdd4befa529ac0febbb2bcc29189a327a4249610f40aec9bcef235f849a22b10831c8a76fcb34e6077273aac90e84e2399d0fb56aeea9604eaf60d49c8bdf2f03b32af3d05a80842c1ced561c32387ce7d49e0a160ec59718fd0000000000000000000000000001c9fb9d0ca9ccbbca0a1a99b5e04765dd27c34a70693cc01b15118e22eccadc5358c2ad868b492ecd552431144079cbd595d7a8454c1428409d1e525ae19345c5267ed07c7db3491fb9266433165040faa6eee7243dfce796e495d05a825f651000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a77b67a15cf7f3262feb78d64487d79c6c99f1e5aef71a55ff0d864380f7589fb1694335e82d799a4ea1bb5c2049a3103d1183fbb38b1fac6ba365027a348a447887d8d4d64d6a3a67e31b5df6bf874b03bf251f8a3d24c325778e321fc56cade71dd3da6458e9da2206fb3dc981c6b478c174ed53c89522211d7fa86dbeb31022e956cc225acd85b38faad131050f8d8cc5cdfb54c913ccf2c99379ff33d46e9020c1ba6bd9ce747a15792051ca67b15356cba85e2e15d97768bde60879ef2fcad0b07d3e3538f958dd0d0135ddaf050a813c10ddf1b55f499eb30a793abba4b83e4ef8f8cba43c06ff0cc11581fe83eedf85d63c106bf21774c27a245d5a03a3f0603023731169142d26a22332b18e4533b64681591eea325f64b143e1aa184b4fd0103095b6f51704badce16706169b2cca1fd6caaa99b588bc57b1ac4df3750d4ea9c031ddece06dd33c45d8a749c587c314de8cde625afa1d8b5f04fc6bc7cf69cadba020b9ab24a5a6a422300764d5dcf553f276a507964b5c3a918c2dcf9596da3fff9022fee396e5441d9b13ef358d1fd635d5c371790de69dbc62e6a0c96fef54c8853b58f8617a08adb4db31ff2dbbc37f6fabea7c7b8aa403c8b74491b62e1abe5224faccb8fddd410424f823972b56cdc658869985d58045a0e17c36df516e8fc27250f5bb0f73af5db41d57d6051d25a3b774728be9fb1733a49bcd598209614fca62ba988e9c39e8ea8632e17e4a2a895a4b2f6e0002739e347cf0c9abf4d83c51e363fcf883b0377724039082fef2bb0b163f7b1b97430f3e97f7a96fdcc7b579cd5cf5a2b8bc68324449aff8c11ad766785f20bc55f6c0601e9db8af9b42b3010b226eb0607d1687f78541c906708166e27b507225ebd0ce8ef138fe18391e81b7909518f9cfc01636869102156d0172b7a9db08cf098463bcc704d3dc285b67b7b4cc4b0311d3559dfeab204ee57eff422d55930a512415eb15d2960ee02b2af18d5a715c901c2bae3c67bdd2e4939ceca1829108b79b812dbb7214af25575bcfdd59932c69d5cf70c7a1f7182e75ffc9fc98cbf5001d88c4f2aa6905fa28695e7aac4256c386eed1b1320d1246a7c625977d9d84c5b3d33f4b39f6992745e6fb79d3f602b31534cde23f6b22b3d581ae167426ed168836739bab83170f1d7519ead888ad83c9de19d35234cd87a440a993d6797603670c2b8a3ba652de7b97e2b36f57ab59395d92364fbb927d14f9732fdc90d616fdd7f1a876b7c8e85941f0108d499469cae6f2d4430c76f648942c12303c7efe77e9e8a991a2f2c9b455e5f063a149c40bbc9757cc75914b25a9358533548b5338c0eeda6069d5d614e62e86f2e4f4d2d760191aefd59d27eec55204075953b1d33d2b231dc77cc1ae9bebb6db846e3654b2fa81f8120a51f8e8805f7fb502ae25112ba02a1c3a439e2fd4fc2c1a1ac4b516bab18592f1c166cf00c68164c09cb611779285829124216bb418150e61d1acc08e72558e9adca899a00ebf7af01e160f50d431261f25d099ee88068dfc5d6feca3a8ccc0cceec4e28f69943ecd359eb46c1623a688f8e2756c4e59827033f2889d698d923ce23a92768274b5228ea640ee6f4e1fd6329b648af3c7030911bce9a0aa8fec59b6c98a2adb6037b7a755a6ff07e9a24b61178985dcce71122b798900e59cdedbc186faa205ebd4f5b7f379ce63a6d9780e9648731df0bfb2e8d43b7549531506a047deb649a90370b88c0f0c1abb4cc0cf861c85faad10983646520cbbfa15015e1f98eaf6a5891d93d268cceb51ab4e510a241c4fd9efcd016d5f03e2555ebb4dba179b033ef41583b8c4b89a5aa8dd6762034963f87d5070ac3fb0524aa087770b81ad4c816c7410c80d3185c1660a63282876ea6fb0168d3a70037bf61a4375470a879707bd49745b9b3102547e07d859fbe225ce7a8b6e8b76a31b136a9c4c9fb343f09abd430eab05cc5f789af5c93baf39a05ea6e5e26edf69c4293cbeb536d2d020c2c2e073ccaec849d2000228097d2431b9a787519dffe7509c6db23bd42bb77c25900aea430fb5cc91465bde14ba60fbc6cf3905cfcc270b8fb9b35775987894a7475c0701848287ff46fccc984fe68d29a8620f14b8753bb4323bb97bc3b5d9cc127ccf732e71df2452de3f92584c7ef00859fbe4ce0f08d3c0d14450afc6dc08e24d02453ddb738b8c2bbe76a36de895ed1520f67a8491b37978df0f8547fd725acd156e75df43608fb6295a2d4f12edd7b8451ef9cad908d94e4aac020d11bbbbf694631a920cc8ccc6b890f1afb6be453f93fa63e3ee1b415a131da263a8c66ba94da3c97d7ff1b787cd9baf3cebc7a32e11c2d080c70e51b6814738a72f7a06276e093899972bd6e588734642a29e9cf4c2f9fb4922d8a69bbab77a10b", "53516a5363", 0, -2079140540, 0, "03d7b925122aae2f32118ecf94da64dbe3d3b6bdc11094fab790c2c1f529df73"], + ["030000807082c40304113367e7682e7c3cbf20edfbe1f137827fdb7072f7bdda6ebbcd0a78d78723e2010000000463526a001223d576d163ed81a13bbb620cb64bc85eeb3a349c911a1140c38fa86418267c94a41ef102000000066563536563635312e0d925e2b3b6b882fabfd38e6fa4474b4ee196b05424588770653f332dcbb14a7f940100000005515252656a78db2c7a1e3a6fdc9a095b5479dac44f26f7dd3b6edd970b59c6b8c13a48e2bf8a9ba3e000000000055200520000ffffffff03f257fe040000000001533bc184000000000004526a6a51830ece04000000000863ac53005163536ad37f1167197655fe0300000000000000008c10770300000000c90ccd65d7e7f8032ecc311aaf5251e1dbdbecc142071f8977cfaf04ff06aea5cbb892bb6485c5af5c249b0b94aabe8fe453897dd3882b9a4d2cec27e61cc292562a1166f73cb5be503714c85e6c466937a14bfdbdd6cbffb0e5e9a5b466b28c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a67cca4e27824f5d7497fc1233f9dc19d948052374ceebe9b66b97a04fb3a42f70a18132568e01aad8dfaed9cf43cf5e7a43b237bebebc1094c5582241b8743d59278dc020c5832f6293c8bc85b6015bada2d84374b71626b837fd8597616de617ea48326750338d9636f0bdae894c27ea5707c822fe342e7d20be379286f62021189a452d9e76913d8e223222dc2154df5b6eecda76b28eaa8ae0cd075db1170031cc814266860efaab00af1542d43c1c218ec3c25f866510c90bebacc563b57ef0b0417c38f471314ee590d89ea902cb436328d3571f3e3610961b998116bcf11becf6a66260c0f8d57185032d0d47e8fe4626427a0cd1597074eae81fcf28184f9020552a1dcfc04906bed5e8a372c2b494d2bebd1146b5d1c1c7da8e8413a0280bc03198b434b7edd8c320c64a9558041d6f9706f2191092a97fdd98b3e2606f4c67b021babdc27359c5f0126c0ee5cda867478af3ba1e3dbfde2839d4ec3d505ba45f4021105ae219726bc392d2787fbdeb8bba7e49d9eff8ba498e284d7580cf79b6a01030173c47d778d528a79b690cabde1169c5ac611637989372e7ed703efd453661786e877874d163fed64efd3cf15cb5dbfde729eb1949f3447ba643116d0a7ce81bb96c338f01a9faad6f3316edbc4013aa67c2965a688dea87f3133177234fc43611358d87d44403a80c35b4932ec9712e92b1fdb2f5f2a81f4a6b0f38a3b241ac7b26ce1a10c28a3546f9b07d96c04e9a86c6674ab4bc491b0c8bd75c9a4b7dd7c33c9b65f995d7511ab5cf9a9224495e56a5f55b108df9ad466e182ea8062bbe2efce8154a8b1dcdc395b1159563466dbf1b0d52acdc95f163502b3946d28eb33e0d128523d2110bf70f3ecb6c178fca3ba5a8a3ac515cb5010f640123cd9321e38acbe80d8f9197c0dbaab02339d291628da9d8fbdd0b4746c161ff3bcc7e577fdcd3a0c67dac7cb142c9d92864d2b1c6e3ec31ebecc045e5f0efc633ac12f1c1bc5e45bfc41330e629cd27adde32795e2d33263069e191e536f179661ee5ba2bc47698f6bf5b63ff0d47a8bf79d8fc308a5ec6e9756d590a3fafb9c63a6e9ae1c372c8ec0b185a6cf5cec756134214b712658815fe8b16d0163b5301aebd0d68c0137c21bf3a81471f64ffbe2eb5753e3f7968df2bdc40a43663c0759d146cee661e276e20b7dbe9916f250615a3bcef10afae3704f988bf065aacd155c4f2b84ed32b1f7e61d896162664cbce94516c205e4873291f48e8d5366e423e76c15003d843adfc1cf50fd187ffff4c4837ce3f631afa3b3f92d635191326b5b1a3f3c473e9b7535de4fda8a20e67c6f5625a7841a8f11970825a8914741af0529cafdfe8edd7e41ee237ab79bbd0c37aef7a0233b3b690f23b9d3acd0b9f5432305e0674629db8b3a464b5d5ebf4432332ca66b1946e264bc4052ff6338feeb3897a98b77577321c20632008701f10a9d471184c1c92677ce7a1448d3b74a298a38b1fc8fc6ed3b3a7240d71a3c10850e13aab75f2dda69628072b0ecdb192e8318f24a88d34bc97a01f603dcc085bedafeffa34ff3d1ed1599e71d0e1020b98020d4f4fccd21fa3eb76315aaad5c0d319df0e605350891b63504a93d19f4333cd6217e7f7029a9f576469d799d3ba5546f9e2809790c9c76d60e68ec80483558dee798e90266ba9a9d6e98f86cf7c9f5d51501aa119900ccfe34e5a6503ad6be5f08c7fe7492c994f6910b967d9691029ddc2c2b44619810e86a57e149313cd9f12c6a5db661bf4c378e8783f93ac5d3ab535950dbeed76c4cf947652061bf08334a48bb4a2402ee7546dbb7a0cbf232347d293f2027d63dada139dbd733fe1d7ca967ace50e53c6aba9b5d4fd8d1c3ea0c8d8d1c62079d785be7ee2444b4f6f80a4bbfa7fcfd14d875538443abef986a2b298f668c5f2f444df545b1c6a3acd3db31f2a8977ecc9089a96226faafee261644f38721f9daee91fa0056d9eea8b33f6a120e9db9a23ed40695ee5ba65954d7efb8dd83e00202052f681a3e9cba2f59922611cb011597d616b646fe6cd4332e93659ea8b3194dc16259c20cc4aa1a9cb0c002107858ba04e468dbb62df4063620e3f128b422660b118ccfbcc1005be55e514dc81625549e520d114ec3c34d2513380253d7cc3fcbe11e4ce72e8585375d1cbdbf81b28d066648d726f4afa241358aa83ac9808b6c26dd895bf513a75b5a9cb401f83ac18e072aaca4dbcc446a09133da623685f96ba8e8f3834a8c3a89b3e001c755a698688475db8b805ac46200000000000000001356b1030000000016672b16cb7226897669c6d260b77c7c9f7d6232064e8654fda8774812f9b070dc81ebec958a619922efc1090d54364937ef1b6b27f2b3ea64ed81aeb679da7915dfeb59c535934bd7f1b583f6f55821c9808e1c467a60fba20b507aa608e0f8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b05bbcac4eccb94cf6bc15b312967fb205157e97299734bf74a39a851ba513bcad634e391f8ba521e6b3d16e5e35c6ad0c3ea663597f16d12aa4628fe26b7e841e329d137d722d4af8b382f055b335b1eb7d2154c9985a113d3da09e16d38c56c99e6053014ee42abe3b036c31bd1ecfbe6a479474b1d802a2e35895945b31a021bb111e63ff198f93fe4d672e54d1312cfc5e6feaf402feb61627743f54f8f6402012f9e6331311d3f0c83de8ca8eb5c2fc8890868c9e51de4d2932b7dc673ed8a0b0100d5d68dd47390e52240d0a64f647b21bc118dc008faa0ac1efc6721f7737af32a188e056128835b5ef1ef101746db335827347e91c92138e81ba2f18d4ce8022792e59c3d90b30e6493b28edab1aa53a1a8f60e7b15478b606da365f0801bb1030402033d5794e3353be274186bff151095f13d608453af0761521be5793dbd5b0323c210f8a4d10887a9046350ec86ac8c89e4d7541cc9d86b68a5b6b31cb6f4b1031117cca964c2b60ca6bf631ce26b594c84ae040540e33a397063918078e37de50315fbcf8e8c7b20b54e349835cf872e08b944c5ad857f7503377035f4d1dd3d0081d216ea9fc25f79a45e814ab3b8eb8b0b2fd0951bc66e113222723f8505bd57d751b99afaa65a328aa11d4af271421a4c6eb525e5dc4986f2b9ae6316f61363bdae1007874884fc2e56715d3a85256089b17489aa98f1e7c949b45065d6934f10c0f1ade87451d7f869ccfa93c43e971c1bdbb9ddec77f6ae0f5d7b0981a3c3c33d5e8d9bbcb86721d4898988ac31a54b432c20cd11039f29946fdeca9f348a2f7eabd04847f9705aace7adb9b9d3ffd5121abe2bc245952eb2385e98a4d32192b27ab42c59c55c61db4a7ef78f14116f50155c56adc92c05909c64af8d10211a54b785e03120e24eb4be48650b4d4e7fca8ef160cd3e8bdd1c0297989b9c0221313abad84b3b5750530883bcc11c79701c2888a0a630010c91ff9db499895ea41a70d39cbd8353405d7e070032d4eddcf0e1d69320e69e5e2d5e09d81380a4a732f8e39ddbad29ef9989b8dda20e24068e23fac2c0ed12547ebb5ef7521dd061ae6929890d1492131c5a9a32bcbe5a98cdb95204518a7b487e76c22d2d0daa13e7e985b6d74ee9412be87db69bc4ac70b4ba785464a9b4bad8054a21f5b757c638a7d48d05d755cd48a00cfd18d88c9486ce1d17eab6cbca72eb277c2e8c87fe35db5881cb113cb741a77c9f4a01e0196c55e13289c24bbfbcfa6102e543d5c65feb66bb83f94dfa4404ab2f4340db0de3b92f47b0ec52e249adb45be5c91c1ad8b2e21e9c5fe96163cc88e21f235ab1e96d9c8dce5a84ec174ca7e4e548de14c9b0867fc5a0e5f8ef7317a5077b9fb6eec8d6f533899c5c535a9ef2a921fc2f3321ce5a7e0455b638aa9c98eb622fbc111ec36724407da0221eca550168118e2318d4c9eba238a80e05d0da60be72ff605614f2228d8437ed8e0f30df79204e3feb30081ce9448056d3b9e8af572dd912ec7a7a4c4e73f323a84d95ba34ad2c9a65f334ffd1f18bde9e9659b7a7177fce15ac688ecf3c3ccb361869c7ed77e5d745cc1d8ea0efe84fe2f75665da596c0e0522ea44b3e6931f98eeeafba921b60ae983e33347465d24ff9bec4c86ef558a93a6d1809d17881383ac0fdd558051022d12b1b58d27b27ded5abcb86b1dc23741da7f7bf6bd2b6aac926350a579ca860bab4c469ec38f4e9f485d651036c208926f5ef71e87ced9e662a5348a42ddb3851768a95640e7eb05ef82b8ec7ce3f881ff9faa4fed1d76cba4b07d99c8903cd5c8a24932c70560e9efb1535e12b2316787d01f7fcedeb68c4a7a60a9fea1ea0d71c1c8acf58d2dcd0ed45bdb481eeb7b34d742e0f2add84f9a6d68d53d2a96c187026eb6a22246dfa77ed2b9e8544b2738cc1aa87a8e80cd34d634c78f5c36e8af6ceb3f595761024fb760f107c6dbe8cf8a6aaac9189f5e3867f85462879bc22404837f1ef3a01a5fd4831f4f14383635994a016fc53f5b08947f0449f111d872e78a9826a35cb98f459a55976e926ef64bdc8615ec9831530107f09f01c80323c1e8128eb6b5b5dc05da7ed234cfa971cc286112c21a49c98bc47f3e184953e8d8f236c2f63863b631d91451130eaca82b86ca51c520a88810b9fa643cb6621295c52bc9b5ff84ac32d8506ac867e2e584079852d060e4f8d4625db7e98a47b2c22fef6bc026c54d2c8d5b9fadc96641733ceaf8c0e82fae3cf14c0494961cb9dade540ccf01297e32f430c60d120000000000000000eae6150500000000045f06790a046c0d63cb8160972d1e1e70706970b5a9089970c9cac9f6dcc5e1cf9f49341c57559bff4878df169c4c25c15a3824696e91a87d49d877dd3227579f08b02d9b13bdea0cd233fb0295c94788f615d5cfb1c6f74345cb4ed9fba94e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a971809db8634dfdb0ed91988cb11d40bd0bd15a327d6fae6e3cdc1618234653ce1af95d9e8d88b555ea91429757f2f034eef6697dbd7a74c9f9727a955be860345a7b888a84b8b112ba13e2e3f47a3092b2b451d8008356362da3efb9e6247b70f6026e23ae5a220adf3908924ce6b0a7facb1fbcc04aa6d17c7b95974888bf03304322e770e60717efd9aa81654c0bf4e9218e3170510633b4cb31309485ee94020ee0240a6770a10f0980eec9d32fa120701e880275c8cb0fd6288f7cbe4e0b3d0a04142eded507ddfb8b2e7311288fcba32330d08d797468e6811eda57d45eb5de96b1b188496962e6c444c30d7b5f05375441d72f067390d620ab1171aa4fbfd0032d9724b823729bf5e4e52464acb085b2a550fd9f42865ed8c1e0439c403dee9002281f19d780c961abeb468eb0c6815f06254ff700c20a1d68563a5d8a837f86c7030aef528e42856d5712a12f40e331359a13863c685e8b72555accbe157ddcdcaf0218ad05caac42c00328d7001846186fa5b1b541c92fcd247aae908fc0256f4be6030492b1af935a51bf3fc62aef2d6e73da56243fb723637d5b8f18f723ba0a7196d53e86cf731a9671a42c44a96abb57e25b5fdf2f255f450763b641bc76114c84dc55d8db503695100af2646af29218865c9b4e686c079e492d7552831073b52df6b9b536eb675770d7735f96b999bc1de7ce8ab19aa5252f5e50b3857edd42e04126034ac741006188216aa2d8d486553b114bcbac7dd5ad8843fb76194d12d973b657d7d96af4d86116b163a9108dbc2f785c112cc485cc52b433c5a147d1ce1ddfdd924ab0b0e0e8e28c3c2080de3aef93dc54d9b08505e4125aa95eb09ef4610bd6ed8d3b8b052be368db225b0e0fdf53a90965c9a365ce2d4adbc848738dab213d6b4795ac4f567ab28ab51fa73c921f18b1db90bc87a27c9fec1c1b2d82fcf5c5077fafa9718efc7ae830ce5dc57edad6e9f0d875055c16dd8efa2db7a110e50d760a9e28279fa4c6276391459686f648674ad93e8a36fa0f184c1ffaf02d8e04932a69d83ae563c3180dc374ceb446b482c1a6b05bcc5c9278d5aaed70a8e8df8c5052d8b968dec819d6c959a61829a478ec367783aeb36a696d429d135e87133de5f7b84dee3fcb85febe3769d2b5f33d735082283a7a7d3b037cef5cd7cb5c85fcef7d7a3469e61c2ff6563d640a426f9af9a5c59964595a29e4f793ab0daa6cac57871bd2d5c3099a53a362eea417733775a68bd5844afa1d6e319e428749f7b80b41181806abd7aa38c7dc14f27d8404960a8cedefbe47dd8f6a01b74f965ba354135f9f95cd875935366828cf00ebcab1c7525e0b8bc6fd8c3b19f45ebbcdc9c1e84f516055529f7a8de2f0178c948adcf90d99b99a48c6abdf2b69d3edeb3208524076461c624846e7802f5d3b12b98ff28268a21f46d2313aff06e111cd009d4efb22f6e9c30fee4c48d48a5ac6215d968d3f1bc5b61ea17313d8bd498924e5865972286abe2717280d2ae3901437d0970f782e79d00dbd3c125e50bb99edcc9324837b0a17211ed002d8307b542066ba81da031a389164f04d1a95826855cd0b70374919bf519e68516014e54a94d8b756ea4c8f1bc295da11e04e469dae5ccfe0c1757f6f38326d47a0f49760ae2419d4d1fcbd2a6cb03cb990ae4e9ddfb389a714aa2df9d4ff983fd27640fe1867e0a12bdc2e0a1d984424ef82d725a3837c0fdc0475378d04b417a8ac147ece0f6a33543e1f769f19be418083f9320474bcc99ae1ecfb8b705a50fc71bde3695d45ffd5c82fc6b7a08ab3134db0bc5b07156c362831f8b2ef6fd82df680f855ccc98ca289f7a7f8c38a236a63457ccadc33b46913f4346846bfbc937c5e94cf428e23c0e0fcce5c90e952543a3ce7f507e8ab2bcfc8ad3f3158006f46ecf02bb3b4bb75e5f3a861878f7e8e81d2d75922fc6fba28dd30b2726b315fc102a55cacb639973411eefc0bd2a7422a7bb6f91e77e3bf42f955bb7a2c7b020a0bb24738f59edc72dd82b813419885848f06bcd8dd4ced5c2407491974de2faf0bc7ad0d31e1ae42245f4d6b96b6209544eb1c7c44bf9a660500a4041763a021491df575e673e76b14a8c6735d5a2935af5f7a560ae54674971e17f9fa1cd0e1fed532ca1797098f747146eef72308d6c4feefd76151dacfc9d9a0203b7b4d2ee1d40bfb73e353970d8c1f63a5cd0f1bd1721d400f11fabcea8cb6e3075fbe99871672b9ba9fddfddd24a71b286e7746ce5c6e198efc9c54be8f11175775d70e0b03eeb833eca83771cfa885c3fa72ea2a733da9b2213b258ca7a0e0d7749485df74f02327c8ee76c47f8094814ce03c36f7496f26a758908d4a92a61cf3896a001b48d53d9569941b48d33f774af53302a08e79b2b80321702912a9ffb6ca00", "6a00", 0, -1835469658, 0, "7cb5aed9c4a5143dfe582ea79ab19ab09744f291f165b413bb2b8d48c4d81f1e"], + ["b8052d2601191757e15d2d48831da44dd44c9a7d6aebf477322462cf3d49368e17e8fb01880100000003656aac250c10a10302dd7c030000000000ce0993020000000009510053ac6a525100528b692003000000000700ac6a52ac63650000000000", "6a65", 0, -1140675683, 0, "3cc23fac8bc5a958d606aa28990eb82d84cb2a761dfae7cd02135d6d2bdf0069"], + ["030000807082c4030128a3c3f781d9915b83eda823889f2c652368891fe1b0501426645f901513466c030000000153ffffffff04bf5b7e05000000000563006aac6a52a5f101000000000365ac52db4be1010000000001655c644c0500000000076a636a51ac51ac9098a6090000000003e5502800000000000000000000000000006c7b352c5a00440b1b78452d41307a21e6c9c1bb6e6b3e3a8a133be6038d9d709da0cdccea3c4974983f486f439e880a42d9dfcd5c3476fa41a2a201de9a4702cd5b457cea8172e0682ce9a8c5edf367f00fd4367a4b853576f3d3231cdd550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054dbb2a2aa898aa04c9eec3cff86e4164c721c34a4cdb5d82f40e411a08f8e837e6363b5f9c27406e553bac96703619ba5f686da518b9159a57038bb57f22fda49bd24dd2283419e5112ae9120f78cc35163ca9c2c28ee11cd81af9aa01fff2ff8515cb2e0b026afd9ce0a171ecc98977f3a8998f02c368c636141ccd1f5cd9a020dba7e9d88cc6f1434c3ce55ccf6c598086bd9bbe890934b75d76cf9735cc68d020a97f1ca7e56cfeb788851497c05d8a75a4276b1306eeceba5200be887ef34d70b0783766ff3a3fed27c570307414e8d2ab314b4bf1a7fe7a5f78668681344f20d267db3170e4b4bbc3422a70517c32a761bc1698437ad6ea014a3916fbfc216a2030f6ed3e1a8c63744ac14e01bbf6feaed4f0881d5138face4a5b3f17b1c178d1602279f9f6639870267fb2b4a405fa26c3016cf36cf0076437979316b846de948010215884d62cf80d0359b2145dbf16d934d6054fcd132111c3617f27394cacc9e2603018d601f08613bb6823f3dc0f6dd5564939e3584dc8af5ef486eeb115a46aad7031a8c723223c008e2661001596bb53ff367932c9fd058200f3424c1abefd713880d6ef3dfda9f124c7248dea1aa9483fea901446451c5e6e94accee7e9c51e875896ac526037649f9d852970c53dc5baf141603db5f0ff4d3d0a9d7b05bc21c9eb0ed74a349dec5e5e7cf249f134109719f1ebef7805ad76349717e988b67242e24503e2c61554f64204a44a807d872bd45170f68c5e2ddb9fae5ee373d0714cc57c761f5261c279411c4a5788ef4e774c1122dc9d8023e889de452476497719ecb808c0b2628061a7022fc96cd7728bf96c7f159cf6c858355db914245224440861afeef4fe0d5fe2c27aae79c79e06510c21894e97fd056de9a6a3db7092530414573ba40230f9b812fbe36dc681756586288d5274989a1a70725fe677bde10f0f4f0841a1ccd9c1dacc13e4e99b16cb30960f438eab648282628827763f1c6ac0ae44af4f9b1e12043f7731621d8fde37de0e8a5fe610ce8b3d793480bc37c7451283006150ecdcb400fcc52866c2ef1e63e1a1f63506d5251426ff607f49cc495c51a28fccbf74c0e339791142cd8cebecf8c377eb4afe37bae25d2363026b1347b0ed9e6251191ff338d0488b9f393902d6a50df856919077c01df51214f77700e39264f06cc1cbfc9ea50ddd996f603052d3bb75cf24637bc0d58040efb369d07b87e0941d0563447b036dc053e1c4381989a527960215bef8331adc600bdd5d4a2eb064faa0c73093575f52f69a505e60f108b128f0f725f80f9e4455956b5d890fe8f74f6ffc00ac240c9b96a02fbff6d710a45108578f1bfc8c599bdc0e20bcbde831b5fda3e9188ae78a76d56e482dc9a535215624bfccd7787cadd56780496e15f4deadb09433259ff117a2e6ee1a041c5f2f5f6f72cbf612337aebb2a2adef15e3cea8cdfec81d1278de4890d3538544106adc3d11b386876315e874228233e198789d974ea20da56feff4c855b97e66b440109163b60320ffb876ad7820d2b1d7c0c23efb7be7439e2fd45300e9a12f6eaa6833bf2c3bdf849f6eb3b75f272c7855bd40596ca4fd37a2425a38e4ebf50c6cb5ce7244bf2d8ae1778fdaa48d897a1b357edb803c10489c0a1f8632ff77ae576eba4941c77bcde0e20ea31e47cd1521db5a59c66e3f30ee5cb68eb34cb6e8519346e5de127081d1a18c32035abaa2a410e4e5b3ef416d84b97e2f76659da399eb5a828f6ea031e3b92a2a3bc364d2853c3cee3c50baf1d84bda0156120ea17f14a583eec10a04ad87a647e5d22446760eee8ac64fdfb24ab75d7bff140034b3ea2d50e9bce9e27ee81bea2c4e43be268fe95a7dc39457b47e5371fb4653c73c76b66526ccae33ea08c5d76046b9ba6f9287b186027e5634eb386991893ef9c93d78a86e4162a06c0b8629dc01fbee9f3b2fe74676ed58cda3fd7e45b7923ec3e67ccdd95fd3407254b3a4c559e47819863a2f7b50539dd06dcf307e8a1a8021dbdec13bfa8b5bdae61644626cea597202258c6fa8727c39bdf5806314f6bda884a027df9207c8471706b22a26c099ea889c97b430c338698bd6e04cf2d039d6b83ad227c2a94254b3747c2b160544fe52d691fd4a4ec24893b79f40386289e960820b26573d5cfcea320a96b0d609a48c7a00ea1359e76d06b6925329dbcc1097d1a300ea8ad1d5fbdb978ae01e130ddf1eb9dd14488e06b2c69e76680c840feefa902cd55fa746288beeeee197d167998c72b3eec9c2e58569344590002000000000000000000000000fd6ec2ca6b6bdddb3c3f6b4d507582d34d2a01c6844630ba7b27c07afc384e4ac85c01f7009ad6666c8e2fde15ad2b350fc1fffc8770ca610137fa4f3d31e42179f5e0f455b7b54f4ffcd966bf3f656004562113d079587b13658b0f3fdb1154000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001269ed6c67d4901db194bee77dc15134a971c8aef001b8ef5948bb433fa6dcaa18fdd4b24a9f95a433845b48bec38f33d0dde70759b709564021aa3061005d56e534404e2ca2f96921dec871b568757c885edbd498941b1a834e602b6fa742bef8bb1141415409f78f7d24af96157a5b8f5343a68527433576031c741ceeb077022ac601ef9fab471b34b8f225492e3cdec117c1d2ae831c77fd029c6e5ff7ac1703011783a80e7ddf2f18dc4ba91737c4c71bb529e2fbd950ccd92ef326dc6acbfe0b067f82ddec8f6e505dbbb1344b68889ed4b2333fe1a5e1ee911390431c15166695b22336a2e996a3f4dcd4f8046f312f9c05f3fcb49c48e2c5f6b6b8bdcbe616031026029556369c24fffe299f3fd0ac4cae2599e17ce252c1c3b4b171b427c2f5031cecc71975a70df121ef983d3f480873b3b61dea73fb29692417b13c42bd7841031c0a5fbbd46680ba183d2068f961c4d0d3e875af75a7f6b64593e969e7fd92b80304dcca7921256c9beddef6538f6d652a04ed5d4799a2c9d61d6d9ddd3cf8197a032b3e9170cacf9deb224431a7c150bf8d836fecfbef2d0b6612489efb0145819e2c03f6c02b2ea766743952739249a9418e0514ea3ebe847c20d7592c81fefcbf571bfb326d102fc1b730249ba9512bdd4310c1761dd42fa6b141c306b8ddee69c785439e598a9d9e917c6047fcea1bf69fe3c73d6bf27c524d018009223fc19ce789ef175bf3deb1cd21093593ca3b4fe9c559760efe5b6b4add002c65ed2846531dadcab129e3ce2d96cf2380169f9fa64680e6e582a10aa35ba4429fa6b17f4792e9b24e61b243963f390edd038cca65c0acbc80853a780f8d355aa587cefac25b55385a71cd5ba02b947c18ce5645cfd85ad63f309c6cea8219c13dabd8f25b7b66ff766898dd5d506a1cbf8c04c8d2708833fcb2f5f029f876404eaee4d74447839079f60b0f17a7994fd96726e5ad24229a1c4521d16d0d72c9d32fbbe98a8f7877aacf4a0e9bc32dc8fbde38fa31be98c12ab901b97a592dd0f828a40bed703f194cc615fbc94087a32e3095f14226a4c5aaa999cfbd0ba7af1d22fd99d94991c4b2dc0d07d0771701d2e0046e2246ce98411f8ee4268f30e29e295de37284de622d516696b64ecc623bfff68b9b1431aa805cb2438ed45053abed3335900f0510a17b8584b6ac68db771a9718ae9c08ca4bbce57466cf60ebd5096370d5095f63d859001b2f217ce0a2348e3e772b4c2d6a6660344fff49c3333fc948de3149571a40ba54394179beed4c889c95f5046a0f47c9a32c1e7f4fb5bcdac6091a89136169e9fc9aac469af7da5af5d4538bcc05f12805517f30865eedf6dfe5bee192221670bacad9299cc4236087fcfdcc9e45d3ccc6821026f1add3ad18af28016f75772541cb74b175bd7c1c959f35183328fd72339737d76dd041d245da4b7c3b1b6b8adeb2996e462422dec652b4f51134158fd2192dd2fa0df17db2a4c2690ab4a1c5bcb4e1f8cffe571c472b23de06ea3dbc855b66e2d6114f0a32727f2f6109f0f5c33c4061f84196f73ea2ad5105d7baeadd3d4526be3c269c7f18b16f206d48b470eb427fa57bc92691d6a9fe8467c3519aafe918f207bd286b6817dab74852c1fce5e51bcfee0b3f7614fa4fc095b22a954450641977bde3e36e3f5b22a469a0c532b18ea30b2d13db4f7b23856477222d1507f11c75467ffb06b3597022abbcdf8c695e2d2d517ba2178a3e3ef0644d91d06d8362cd4ca143e0ecd0f58d0971044448d475c42f398ebd7ff1a1979372bd8d81feb3650b5b251db9b17479ee936762bb0a85bf308f368cbd4132e37fde2593fda683cbac92c6c2db7a5004842787d03fbe8a3fcc3d15559fad76cd76749006572044d84f41970432644527e5123cfb657ccb573bf7071db3d8f091b805b25d81519c32b104d035aed2de91fcfc155fedfbb0dcc064630b4f7e962a1e4695b23160a749e64d657778f0ab3839f92353190b6b57879b96cc49f043989f01e3e0ed78527ff08cc3605b90b228fc1b06562ad9bac49da60b93fbea3e526498fe31692c38faea57d08c66edf29915162232c917d2d049360a0e54f992a190eff6b89a1e49b82e7f913dd5ba6fe8e4ab2e33f466ebeb4f53c35f61ba2414200b43a6ed6d8b256630bcc3ae43e8a281be87632fac6adbe463784b5ee5e47c05fd732e3031645b5f976e96df99d18834cd0f0901893b88c38fc6340d49906574164fa1f8afa45ffc0fe291d644ec076e9a5894861ca63f9d7c69cbdd7f7b55030000000000000000000000008071b81bf40c5aad1f88e98b3cd2e4f9e5f16df425c6b343153339b289fc7112f83cff6317564a7df841e19dc24802895ea37f089d4d1237a2457dda4dec2ea8cf471115d1f5fa43fef16a8de42424f8e61dfc395ce16bf3c4f0218f9b49ff630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006aabf91e55930afe425fb46d187d32ed24880e081141dc7e17b29afab234b69726a3f2b7e13c022a826cd33bba37cb3fb3dc1a3841d16528dd2d5b8f22924bce61b030b6e4725ea4e03f74c9fc95ec27fd38de3333a4da01acc2d647d2e62445721807fdfd9b65bc4714ff94a97da897c92e016066e4a5ad02704ea92e6369e0226d432436f9563e528bb1df666320e8f9e59377553b26aef79e13aa4d7687dac030c2a6720d5ea636dc8c09615bf75797019a0005ae4b4dda93f16f63af669b63d0b00a057a6046c21b92985c97d7201c4fc5e1b57586a39f5a079264085dd221618c9f5393117aa419984e53475c159c57810c9e20eff84b4413d9f1c71c467b48b02043c05ef06af537e3081f609a332611f8d48fe7552f5a93317eeaf04f7f8f6a50207fb63773d0927cce08943c786407dc0bff5b3003d9cea4c2aba21de8bad34210322e264c9756c62c2b9a8d83d8b593c07a557b3cfabc21ea7fa25fff58ad20463022fd565c60dae252244bf8f87a137bcaf74d4323f87e9efced84c3cb3654b9fdf020bb4339e014ae5a8966489fcedfd0970e67522577fe3209d86fffb0b1fc9a3e93bad1fd3ce3411275ff8e9c94fe00e54a006ce8ab5f6f8a21235ead2544e15b9b53667313f66571c7803a10fefc6c16fced786500f7e77b3d769f3d39c14ddb7aafa7b48749833aeb3de47e376122d0e2aa58ad10ef819fede38962dddabcd983d4e64cd766db17b8c16d965cb79122f6bd18332e7cf613ebf3ef39ca639ca2cc7f7f482c55407cadc05a2b268ae3592b5ba040ab015fc1b299cff5ba784243dd254b67e63269a8ab2a2dc3c9c824a5a05df5a0b03368a25e6bec29f2536781babb56c039e313aef4db9d84e37331ca7591bcacc6a3b65cd3e4150bc3cf3971e0f1bb2fdf2654792021597213d1ad7f05e1bc13a3347583d85cac87455d14eb0f0dec10967a7176a2b348e7f02f96d785926e9b5dcf8150c9ef3f6012639ef8825355684553eb699ba4cb51c0642444cf6135c5f37665ada07e66dec0da050d5d908cec0d5d9a9e4d46a3119d4fc43bf29beb8dedd3b3d862459aa6fcf0ac5c0cd47bf0790da0d72aca8375e1748942364e5122de3063bf0782afa3d7e5cd2c9cf36eb64873381eb9f2d2447aabac7bf3323a96ecafc708c86cb10b36a2bd4ed697cc48096a43a79c80fab1fed82c6bb50a364859a6f7dd51fd64a4132233c87055e378147bc983c4b993d90fd1798da113a3282a453208276ace388161b6e6a1ec374881f226b685045fd7759bdd5e023ccc9e23a47ae0aeb5f3cbf8c4d9c5b072448874bb10b3466c721373785e6470541882bd9694b21252fc360d96f759178acc534e1d462b4d5ebaa4afbc0ee9718c9d12d9dce525bed0f77ccf5e9bbc9fe097455db53c095349cc92cae3daced0f06f27d42bc89263673de10054b98d4a4cec7734e365123a6986ff74630b8d4dc81c9043faf82141fba04b1ec90f8563b156781ff0dd867e14a6c775f183621262d99b27a922c36f8e082159fe0598b2c12423772baa9e168404e6463e53f34eea497aad910b5b97b7966558ee481ab0d84f827f40f857cba038dad15492cf994a02809932d0761b67158fef208958fe16e1cbfd5fc8a78b57d1b0735f74f57528f1663411e0cbe497d393af917a14c283ea873eacc26e3edcf4f49273df59343a615269c52373333beabfc935b697929d202b5640c1f10454b2f77c53304644182f3fa3fecc4898cc3e3a965dbd55ddc3d928e796049f9a75eb51f078307ff4cb41a3c52633fd6b5ab9fb5947c886e7d8083bac708424f557c804666d6f86cc43c495106200012ac118751463523a7cb3a93d8fc62c7bf1276a477533e245db0d1697e678ced319614eb366f2aade2fd810f12076517916a13d17867bab2a85d2b6015a87daad8270d37b5c8ffd4a7fd4b537ad0bc2892d6e06d0ed40f63232ee8ca08719ec6321fe8a6480c75ea037ab2cfac6ce3ed339f77df8d24a17a9cbe0276961bf21e6a274c5f15d6368d70c8c34f805a4e07dd276c54c714a0f3ad40987e5cfef746e51dcb19967b4c2261e211df59584b69bf9e1bb48c87a4c3cbb4beb3cb8eb613c1a60082ea577bf5ff09a74370620462d48afa182a0481a5b25ea5cfdd6107c4892059bf298aca7e22de711fa05efc4d3484e3876774d0e527c298f6cff05409f330ea89a9f0a9d04cb97bc1bbb553a0bd237110ffd840d6aecbea02df4cb028f0d4851411b7c5f9b15324f2415b716bc19ee81299c9717ee5ae973d9105386201e7a583926c0565ade153251d74c57287ac44f990dc88623e20ed29d0de103577f8aa753bde5b7ba2dcfa61e8a4e263fb83615abbfc23340e19cc64e9458bc46a0f276d12b0441cc1104ca2da521e768d50148125b8207c32d802", "63636a", 0, 2071402406, 1537743641, "72f2cb02ef471988281185b6175de918e7c7c876cee818dbe1925dc45cd5860f"], + ["553d522b046cc2f75dedeb8cdfe8653e77e7a5a2c061cfb71eb51ee4be2f5d662903c0db1501000000055365006a51ffffffffab11751d4c3f70bc785f7f8c7223a560603f534afe60c63c8b293f17437a84f70000000000ffffffff9b61b322d7370c6049743b6770fb2d88d56fa41f97954ddd8379ce1642bc20ff000000000663ac5300516357422cda104ce580e1586b02600453043324bf13a1fe7941fea1266512f058e3155ea3ee03000000016aa8f696320296dd5c0400000000016a15e7fc01000000000465526aac000000000100000000000000000c1f9a050000000094d2b7dcb3cb25b55ed1933a82a7e75ee7302f1aebe90373ae294732483ecd9eeb7e0ba5d7e16033af34a364515b6875cfd4bac1c7fb30b4c75e80bab8850509f1c45c9f38a6f5f7a3505bcae9ea020aeb95c614cc6bdf3edaf4555d09c9882a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ecbdbc6e6fc11031a4a2008fa9be7d61d382e135eeb739ec0bec1cafd407ad1f2f74c19b09089d108b474d11161d952b55629e44c8c6ebde0cf4e05e5c19273474447ea5df8226805bee2fd3a18802cc3c5f41f68cc4c70fb625c61a26fa039278542688555c46affb1ec91d4a5334948593a57c6e3f7fc866308e23724244031beae445b05b297c2339aa66862bcf7781b23ad1b312a1c0da57173a50d8e332022cfbf275484d7a83f5457c2f7de79a1713d88cc7536acd7d5152dd93ef4d09e40b00e560a05f9212ecc8aff66be967eb2deb16c74bd944e1926364b2cbd5aab43e5756e2bcdb7dc6e160ff7b574d44a3eef300dd8cf5a07f28022bf07ff89e27070320111ee8d9c7eb1e761164cd1a5087e4b2a5d186e267db58bdb3c0bdaf46b381032c7939ff16261c2940fc64bec0fef123d1800398452c435f59a7b55afd6f3504020480515893bc113cbd201fca55cbe5244689b252c1339665a94fc841ff1c638803248afa7cdf9337ecf5ca65422ca0da3a359ea17d49030c4fedee719d33fe5d9e03274f5e95bb889a5f5db6fa64b066e9bfa93bd3ca76b8b0b93538392252e8ae120872f1ae502f9734b4747c6a5141b3bc07cdc83e07347fdda1237dfe28c86117053306f8b068c006568d15d424d54587152da2d3fa80e4711728e63340dfb785304d62b77837f930c3d2f5054fc6138560eff3477e2dc1e0c29ad40eca6e178010d8a7f0bed71ab6b0d8eb629aaa613c929080a42fbab43904b8b51333845e73f078ff1c318e76792560e361e67861feed9a1394f8702cba913d371f88619ba894d48849ca92aa24c5c647a53f6d9af80783dddad0969905815d7bef3e619ab0f3203edf8d576fce44181d76a3f3ab0706961b92a3bb508c020e4d4fc434448bd3600cfe0bc9c35c0b2e9165eb1d95b1acc18c50319cff6c88368d7c8114bdfca9247206e76973e0aaf506344b8983188463a45235e400f8efff1dfc05e9e80080be68777151281f559cf5f4dc033ab4290260ba5c2d6d13dff151e27bfd9d3453a9dde8b808193373b6e276378d76b9651a217d381a93cd280adf53f7cc9c02b83ed4d46b6cc8d4ef7c792e64326b5534f4b3e6c7551aeadfd571989844841b312ac427186c69cee9b6c515e075f8fb71fa8be9f9544f11ee6fc0ef7e5d062e4477cb1ff81b17e97b7f366d8934eb3565277cea36a9ce9c9849d03b1a92bebd6a10c09e26762498e55f964cb51a0a83fcd78a9e8b64a80ed6b702368df51d9f6c9a9ecf553594ba273b64bc7351c2621afb70f4a09579d45df6d1231c0459b97b979ac574c1d10f4d318b1fc1375a8d0e7afafd6c435c35c49f4fdfc12ca80e5540b26080e1cf31de79933f004e77d3c9ec84b7254164ea67bc3877cdc0d3e344de54617f8557996cacf0c2c0ffea17bbf82e01457a41a8d41b40e0326f9582970919fbc8d0a4e0fc68e4666ae61f564d758eff3f1d3f6e48a53d9f1ff2d25521141e6fad786d411d28bfaca3cde6469b93a2bd834133d63ea9bb8d1f39f230174233527e14deb799be62d602e12f7578ddcefdb9da588d39998c60453a6981a004f0f3412d18d5436591cd96514fdaef014e6bad4c853e9e39ba392c1e82bc5ffb79f0848e0ff0f3295f6e510af5cb9caa9cdf00059339ca8ec4f6fcbddded1ed246cd20c177e399fa1a272d62a6fc0c7af3d8075393ee5f15b3a84c5e657f37613ac86da040f191dd8f6d5bd4c70779371b5f8241fdca3091ec4cdbbe5ed3edd2fdc767a212949cbe64926adc78795ba43f7138eb3b4b6025937105f0d4d70f859287395f79bff6dfb680ade0f72bd4c45caa2f343f5ce5797a3fc7f3cc98f0c0385ffddd6caadada18cb4033307c722add8ed984dafca0367daa489973f81d50afe74744f67f8eb158ac52a2cca4b68c465225063825ffe324fe9c8bba14a4833793e44b2b35ace837ce06e4bdcae0cf85e2655c8ac703f4e44609d4d46919342ec0a233e923659db5f47e4b49c268a3ed818f6d7adac2ca000dfe595e08da98385e12bb7621ab1bc02ddd46b01a8821c53341f3dfae8e181269f67ee3482cd4b57cc3a2213d0456c5baa7e11a1f8db1c6e9d67057f8353dc4c014fcabd85cc56bfa3e7f32b422dc618ba95351ef1821415545281cfa8f9732c185c2252222760e01161129db59b0fd55bd38ede71e6ce3ebbfe50ca27adbc17359617d49d216eac32519c6b8a0c979fee73c85450f3c24acaf86c9c293a963fb74d28bdfc4b4971331fa6647ea1d2448453304a6cacb98c2aee3983f88c5af99381f3260840633549e6e58db6b365ecb9bcee7a81f449445e2e903412e2a176fcdc40ee2444c208cde996b4f59d54e09066f40d904e1ad996c15fd51ffe6236f561a889516574787a2977759e1cf1193d4ac87191109", "52", 0, 389627320, 1537743641, "9cf4f22e6829300703f006d20c4100504fbce151444240fa504565777233447d"], + ["555e006e03348e6465bd736f1cc04d7abd6c0bd9a9945dd17e1bc02a5fae0b48c7f9b8c8fb030000000965536a526351ac51acffffffff9552b35092ab3294f3ca07629ecf6a9dfa4dffd9a005dcd2ed682b5660f033b50000000006536565655300ffffffff483f4c0de123c4582b60d26494bb0d5c02713072891e0be0ddb469c868ad836303000000095263516563636a52639fd62ad30106e6aa01000000000751630051656a000000000002791b01000000000000000000000000001b82b1e8e19a5fcc1441dd9bf65808a7d24ddec9c53a2e53f5e9be4cbc24c07726c662e6b0d7b71b77ba39bbb333a53d25e2e8f93bfc1bbc70ed43798ef50730a33751b467044f8b0a6b728d52fbcb8470ed4f73d72f041b9e889e60c366b47000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c7d8752945dd6c301249a0a2a7068c0e0782fd44215e0f4138addff052032012c929f5be6f3289c3f52b94609e3c6d825bc11827e59a35246a784e5344dc712ea63fe328ec949a61e88c6e706ebe591f300d0129c7d20f16330ca116d3cf426bc05ec46998d329a1b20c9096d5ed4e11e4a2c385fc6bfc873eafcb05cd5174550208b54e2aa26ed1375bd0662eeb3f468790e67e5be7bd690d8ba008c20e9559b102208dbd9c6cb31b15e3f0957d2871d47b40e7151698787873ef834ad3ceae03310a083fca660f0344e6e696a1961cd859711de934b6f19b21faad145a506b93f4a3f6a9bd2c7be043b2418f89f2b36813accc4d571b646437250f283a27f5fc63a3030c1f23bd1ecf9c58ad7bd903c4dc2787e1f76430a63ec1d8da26cc0fd9f6de240222e2a00d03059ad65d7c35a4720c474793a8cc0ca53a645928c70f3df65a351e0314a00bbb4411d8a31c1b192a160532c1b9dc09f7adab40084e661f292e3a7705030d8e32a6a2d579beb74ea66be41ed4845567cc798eda64066192bafd5732aa5d03071e7ef36521558901b69d379e19323840e28eadddfb9e5485c588ba26cd1a32cafc1b91adbe8df95de5e16361be5a4a146f4d02f282811eab4a682ba9d2432a20b224e1ca03f7d1c24d544e0cd8a237173ad03fe8d38235605777a1ce9faeb68a9b1521b9d48d8fbdd3e73280b3b4fdc73f50b9a72a1100f161d96cfc34da24c29f65776b1c4aee48081a863d10545b1c63ba87b9524496744cd58bafc28f2bc1f772c75773b56c5d100e3b1c3ceb6ebf4d0337e9493a9f973b5fc74bf35e99152bfe7076220d0204970958e726cc80227571f5c8e45944ddd9de33bfb7119699c32395926ae4d303b0b9b2a53ea3473403558ad8320b34ce82d1d61bb4aee64ed71fb4af669bdce71939758c8a9ecd4c0cc4bc745cc01bea598c06d62abac982a4b146e442b686eb028d621532d1d50431b67bd7e1b12ba4636e7ac37111301de3afa4496d777c3c120d3d523619173c232de0b420a4990c3cb5b66c57281710ed160bb33c53758a550e38b809742cf8c76e060b8b7d66f7896eac4df0113554b18ad420e5a9c5f9b1d0a0387291febb25b863da46d612bfce7e419dcfe1143ac0b7bca99543bf016ba05ff0cd591c3606afe51268fa9eb38ccaf6b79d7d096db67bbb283d6b2f7da45c4d497b09300ebdd08c44070a09107992032e27e5ea0527438022c97c131f77d7abc41e6eb85396c260954b67bed60493a9a75276110335161887a117206cfd7c96e76fc115a0e27885311b538f3e354df772039d14058fcccdb1de8c1a38253ecb527370b9b0dd36b4669f1e3c1a517a821ce73b63342c0f529df7cca6bfd53bcfe16d3598775809eaf08dc2c632f4f2a3dda88f8d2343bf330c0032ae51c0aaea7099976cfdd040b4647547e53e021ffe6fcb5dd7c32263247642c3d1028f3339438205877ddc6816e29e6f780efeca868ad04de883869bdc07996e136a0695c029b75cd73a0d1e75d8c7caf4ab0995041cc46c95aaa6db7119f0da30b3c5eb2d527caf754120255d33708d344877f73ead498de4759cbf3cfb655de36869dc864cc901970e0b36c4b6fd8d7b6f643836e515839f3cb09b235de9001bdea57e1ee442b7f02d7ebf0dec891a945b2cd710ede483ee3e6484df49677b4641fefc3ca53a9be3cfab3d4c43e020c1d6cdf3a314178f6b6c5f279d6649b253ee0eae6e5f0593c2790307f6417a56b127bd2c207fc2443e0481e5ed15a6676b0e0bc26281032d64eb3ddcaee120e9094f38cc1368fc108b0aa7f8f8151da43b238261dfdcd560c0a9248bad461c0766b75eff8d8dd8e1852e25419fbb5405a4842e4f1f0eceb3d630593466c0a606930e540c9501d1184b0e2aeeffe4bc7abcf31281f140f88bf4869f299439e3e628fb77ce1a53bf397fa551fe9e7fa626946ff608e9c1a2227da5530a16420bf901ecfa51736d9b71860b45985e8830f333b8f937948a738088b3bd0e4f8e158588be71891a3b502cd095dbb79e2ad06fb0f0b57a7ed00855116bca259766a66e68a2255e56257ccba0a080ff000411ae0d6e8207e9b0807b6c37a905de4d626be4201be124e40e405438139a9a1f5083b2b359501fa3436f2335e5d7e0a77b47263b6aee5788e15ab2510df2e442b2c5b5eec93a707c5ba8e34503b596da236e4e632d8d0006e8b29441dc775118aeac5613961f3b78c944a09170b748af111e2362cf1e154fe3f3d980d8862f8543ba7a2965b941f2f47280844f168f7a010000000000000000000000008bea9da1e5eebc8eab56f6cb089beaea072d6089198fa63d18c3d10c5cca38e7d1b3b0aea00b7a261815f80d5002a88f2cd950a36143e95fda1aa7b36eb3d5186e3097cb40f13d7461cd400ae66cdb3ad50fa5442531b866c4afcfd398b56b6c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087d1753752845fab5810f37590162cbe81517af33f18c01776b033ca7fb4f1b801ca2135550636b347e76ac8e08d50ef5159a65e4551f8f941d49bf364214b802328dc019ff0c46b8c8805367d93c38906576950ccdee8ae7a457fe44a20dde1e8b41c712e0dc5ce94ffb44d804e159e75949121a9c31df4968c79cc0af3270c0227047c493d35a8526a8c04a76a3f420739104b4b53803fd63e07d474cedcec660220a604677a89008c469d860df4bd1acb639ff0224b18ba6965fc5e5230ddbf410a06d5e13d7d64b170d83ab7df3cafbc8c19b75528aa6b975b618a84eae377f9e67c804f5677f74206d2257fa1124e0270c69b9288545b8eeaee1d49c74dc06d2d032cd912a059d539eafa646b267dbe4ed9565ceeb1bafb7b697ffb1db3cfc0897903099c54d0bcb8e1ea2d83eccf4d2fb16cc286ec39a093cb0006a58e6de0526ff50317ba8cfa09c7d408df9ca14eef70678964c1b3d74a29dbb5715da73addf9cab3030627d8c6bacfa5b0b20fe7af5356daf3d7235f2d2af1ff5c4bb1f0a376873c1e020e3f478494cdf567d1665ed1588a8a607d7925fc3eea0504fb928e1f107560dd6be4a864b58246cd4f7b228d8eefc15b22df4bfa8e0a7141a1647e75681432cfc47e3e47c2aedce66b41d78ff2e97a38f46e9b71b60f16679ff6feb77707ca2cd1da75181a63db09f09d6eca5c96dd7a1aff9757c018dd39b6e04944b800dbfbd46d677c4ded1c0965ec071248a1b6c669f7bdab04ce575422088009c26a4dfb0fa861a9b87c19a78356c43230138e7d9ba28436a539fba66a33cd3236dc42c4d3218aa1588c8e1f04eee336c3f8157d6229cf271fed56fdd3405af9530bc8a825e28b8d8a0db06b160202c66b2d578e66144777f087ee0dbb2a95b4b861822f1fe9dc41a05c717ca16a1ad3e1a3e137934bc70a53102788863a3d371491ccf28aee1851bbb31baef89a785a2752b712418c1f995b42bbeb6fa9b1ba09ff4aa3729a0bb3995747a6d09c0f6cc300a143f1088761a81caf0772b921222c8d65f90f67d2430754a68ecbf527d011dd6770387f980dc3c7dacd28e3847fdbb35fbbf2106cca48fea63115a54aa64da4c5852ff859e9433ed177d4ad9b39a6008b02ec85979b122554d0449ba9da9ee9083e97990b20c19818fb64bdd62f01c072d7314d4f53bc232b1ba7131701985c9e759f13141a4863bfa3eb92201b9d40ca49b6c09862f0f7fd258dfd5047af517b76df4d7dda05a514f7490de5aab487f7de463eda1a971e3c2028db35ea9933175cebae6014838493d7d11f792b2acdfd899fbbd57a8eadf21d19cc6cda3aa90c12766024d818294366edd9e937407719352294ecab3d521b04c2098c14eb910019691a5df22e6b10bbd6dc471bd1d75debfbd673a12752fc212bb64fcd5c8a4a92e8f54f5c4cc5dc3ceec38ed007e77e9a528b7227f81756dd98babaafb625534e33f09c5084e77ffe961206d4d6bc415ade2d78b7b263ac0ce52927116aecc535beee79111adb37d4934f04a11dab07cad7b8492b9bef68089ea2c9da8360fa82837cba2b102d1dae3f44b726a7012b52679cecffef5ea22ca268a27305109a9d86baf4174da6d87bb4db5910eb07dcba00d606fa5165493d06af93725c5e1d4869a33ea22bc2b55c751353b8044566c16abc5e57137b2b2823e3d98ae4824069b03f5e5c71886f22f7440649874cc29aeae0526e71608bbabbe081d274144c8f25a29474791f7abc614af7e3b62c448e73e1b24a9e703010f2b27070885ac7fc1f8ad8feb2f4bce8ed015d06bdfd8072f553c47ac1de11d4f62d2c4fed8f2c570876c5145444b2f3240f285cbf342fb4a1fc2f2071d12ef1a7e8d9b3f356cf54be4339b7756afc54016aec6dcde7e472999a7f7ef35163ac9961bce128b83e9aa0e9b05b73bdb60adc4576e7a3282ed31fd5c3cebdc438164987afd327350d526cb1faab15bcea7571dc7bf7e6c6f7b222aa80ade021d6967f3147e3406dea7a734b265d13e070d0da0bb61fc42f1081da1174a2dfc088e29372bec587bc308d9fc7331be6d0226f398f6713aa9459ae56ec88c4955dfec06d42bf59ec219fb25c3af9747d563f56d257946d1950b51ed5043aa86523a70947b1ba0e0e0e3cfc9f0bcafc54382048e292688777dddd155fda5786a6c433a6a0117f6199e41afc190729a4722f0268f50399ef2642ae0da958b07dfdbf6db51c9710afaa30abd3bd59ebc85a915f79c52fc054ebcb498e0fd7ada6120a423d0338c90f96cb7565d7872529990ea035f513910e584d2a9825602471b674bab87e4fa8acb1aa0d14569fb0897fe20ed0a54e2434848807bfae161842f01e4743b3236d354f09f81bba947c7be740f937bd2699d0ff3e73161e3859bb6d1dcfdb0e353f1c3d2fbf663d05", "ac", 1, -1005560772, 1537743641, "0d5e0b02a9c23e1aa5cc09570ff5c0b8dcc8df80ac73660359e85bb334720842"], + ["030000807082c4030408402072a9d2ebf6ca8e704e795c435b70d1f79d51a7446fa7571b8c95eb038301000000040052005187267db2d3e487efa704640d84aa788f2019781276fc50b0c6a2bf41b28a617ade7c2dc8030000000165cca66f22ddc665d32a7c37309aa77ad47f40b189a521b33acc88977007c5f898efbe32a90000000005635253ac00e8563e42f16e76b700c1f5220e2603f64b7d0c46941db778420378dbc0c3f992301045a50000000000b07dafeb012d4d0d030000000004ac6a535200000000000000000228ae1700000000000000000000000000ae5917d4e76db29cd980495c34f7c311277b3e01be985dae56bf89f33b98de5c509e3a4dd386e56ba2f2aca95504b11cac3b2183beadc53ec688bb7860d7c561403fab5813c56341de020dcfd4a5ed9dd82a926ebe477d88e3e3bc1db553a3060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000037acb81ade6100bb29c389cc0be68673f191405374eb676f86212bc4384a053d69db6173ae4bd44484e1669d638089341778acb05eed0f79a08635acf17703b77d663ad9be017fe04a2865c9722d6e562384e564d90092499593d9a0200000216b9cedef3b0b49f66b0576b9920b2537d3a3546dd3b913764ac8ef1acdf6a6bb032bb09dbe4ae43921bcc74f872709f26ea43d862e61f2ed7f7718f4e5bfec31f5032e2118a1ec0db4c8453412d47efc3141e23db3102a3da672c289061ffca1f7720b0294ee9e1e854c418d94e36f182b729af30e566756a575206fd3d0f2f420cff30e2ba3c604169ee172ef8acbf53f37fd87cc84d745fe48aa3662820fd372bbe10228f8529bcf876d925a1bee24738b493d24b3943f6337e19497173e575385f92b03002ffef2e3464bff65f89534d91bc52ac4cb2ef535661faf66e02442af227438021bdd2df508f4979c84919bad90b465a6c56913913bcf2490f695ed041aef44a602119cb7feb2710e50ed12b3a3033e4507ecc3e757f692a83690f9a322849aebaf032002678947be4e322638e627832badea199502319a780ae7b043f5c7d92602201b70864571c04bb7d82698ed9e71d5b5559ece47d0367ebfff34a14b55dfd12e8c4ea51b6ab4cefbe5f7869e835d6651cad497c0a4cc7f0e9d10c8c1a71e6ef35a2da12645004dae32f0d059e3dad3951d9fea9ec22539afe4a44d08e700d17e3f13dc98af6fc32243a8a967a3d86fc23ca8e7cd5b240a6309efa72816c57e99412b470a33826280dbe18836cd3cf425d786835be1e3a877c88e5179c94d28675f8caa9656aa0e584dcb3ffd7e0cbeaade8c261371f36b7a2c34d4135d36905eeb9cd48da2306319e6d0c13715b08533b64021c89b1a5f0d49141aefd15a4867d04fcbba798844f0755ad9420bdf378eadfdd206c8824fd94f5081fcdc6664edf426f548da7c89e6ef0221e621b5c008486e47cd9db44df5d8d6975958e60cf3db0f898aee7a2b3d4656dcb0f16832fbdb2d789ab8e9ac9f577793c12c1ad64b9bd29cabe182a83440dab1923e40adf11dc636dba605489d50c1030b238b0d6315e56c7312515161f2eff86d76b86c5bd43ae8b991ef01ad9405c0cd135dcc0ea3fcb7ab011f8c82918b160e37d25ed8976e6c56f810d236153aba2d67b33937e4cc767524ef036405ae8814708af44c1f2b0a95e326342456aae18730fa4da64353e734ee12c3e127e9732665cff88abdef4d507d96373c35673837451de27c63fce82304b3633679f8b2a2bb4c7b894a0cf3bee38e8231b56fabafadbc8b750dd18b9c75fc1b7322c15c9b20519e8db606f601c0c08d0eff58f92a046534ee495e9607eeae1ae3a3423667d5c5138e0735c91e6054c87a63a224c9f86240dcb1b58c8e2b8e5da4184d94e1edbb5fb6b4900d914729cc58f974b9fa50c45f81d9ad3366f6702130144b4829436a71b1db1a81a41eb7e8b45296c7d0ddcf6aff65cb5729f28d49c60e07158366c472acdda457a024070bbe9bd23499d6b839bcfbbc59bb27a76a839691f130768295fec23d6dee106b122e97194e02a3ec2dd1fa74df62de8220fac6df39f494bb8c1b902d4437c6fc95b62611d66e33dcf1413ab4e85b73a65b36328f2580f971bac1f2af60a35a87378863549dd21925583a8a487b14c71f4288d56d8b5d384384b818dde26d36b3ec77bce32082403781f93116336b8fb0415cbef474711c927388a55acb3c693fd12b540314aabd485a1cba97370db4a8cedbfcca3a7fac99bf36019e2420fdd5399bb1e9b5012fb748256b3ad5b80c3cb1a7b169c29d0d0178a2dfe4726de4689f55feb89e0622d5d19239e8af25b0665171f6d97b3542be1509ad410615824fd244a988f68989d8f073094608b232e387f2674248652b5c650d24a8caca91131f27f2e0eba6658051533f71cd11870f3c84d863808cf4a6e631f73c6d1367a9119ba17e3fefc1bcfb2c31b10ff2dd431b0a780245d27e2fa650ef2bfe1673f0b88319cbbcd11f5f5b1c044b719de96e012ca5e590aac1b3c9111f242414176e9a0a38837047714668133f272eec12f42923c72753892ee28f54b89a5bce7019084218168efee298b37e25c587617e10d6a506c8d0bf5e18c587e26d7f716e2f087f98233abbb70bcb11fd60a773510d2837ad6b7c497e93f02ba2c2b599961a0c7d9c5241e197515467d67e73ba44923da43907ae600e538e7e8185fc94ac38ebcbd60991cd20c95743722f9f9d8b6bd6765c859e16bd83dc719f91e78b3d02000000000000000000000000cb0c85a8afaa9844b8f9b62db4dc8b971aeed12e03026afbe0a5c4801821ac502cdc95e7bed6a8f7e02e7eb744c3a800cdf4fcb2e63ab5e74941335d026b2d86bceceb77fce18d7c643fcb6039ae02654ff78cd8aabecae54426ea48cc032dd900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eba640e740704bd0bc8b1f3169262934e11253590055ae0ce796ea5b879b49bed8b0a52a006b3a829e39b60d0175007b49818c9b0be1aa748074747da296e7fc36b68667c8718ba7fb8100299f9b126b46c30a6861e59d3e820a95e423cbc52bab3346c15f171e2868aef8d0b1fcaf391e3ea8bd26976898a6781534fd5b8e2d031536e0431a94c018e79d891e510cbd35c1641dc16da57b02e088742ae8da84290206348ba6941ae9e4e3878c71129e441553ba0722dd60527df9abe1713639f6d70b08aef0f513deac16d436cccced8f44d58e6c9448508abb1a269230f25e997e74ec2090c9555ffd51697afcf5b83b2e691182945e9e4e00d481129114a137bcda0226f177d29421c583471da3b4fb93df0ef1821d543bbae6c3bad6e03b341677c8031c41e3979502a475ce79aacc2c858e2fbdfb3aebf67e2b838677004334a5a5050328892176a42a1c71f48a3fdf5492070be9beded8315a0df76c91ee067a915138021749461bb7e4f1019b61899dfa524b4dc0343a799381bb40342ed34486b0ad7c0308ef4423b7ea636a306e36ca31ddb167ff315121171bef2790b0c7f6767b8eaf24d7998e8220605fccec7acfb2ecb28b91fb1dad75c18e83b666c264b4ac0557f7e82a2a18412100fb11aa6868fe969a54d251b8b6d571126a64fafd8a0b5c78901f0827d0a3fc55fdc23136967f233c1d366939a1676c9a64d4c9c76e5283837e797d018da54f1b2f599f8b4be9b75cc134bc0e6ca22c596d324bfc3d7fa316e38980e712cac8859aefec82de471f29e28ef707266d2b5407e3507c8d5b1a982ee7ae000a8f90fedd4926fc2dce6e06100eec4304c192e124332eb89594e8306382eee4423d345b89e65b304daac21c224e777fa392809a8d86d8798b7e7a8baab63436c32a381ceef6ead6b978e3d412d134064e76f8a6b530d252514651dda077f1822f14f7d7a0deef27ea7a30ef819feaaf3e614e1ed7b6b67f9f5e70f16840028a9a235a61de82d669210b6685bdbe6fce056f25790bcdbe8ef9634bec73568653af778858f0e180798709fae241bf2a442b3181a52d0dde6ddd49bfe0bb40f99034f965d1a08b112b663295f8e38d8c3022012eeb3309dc52d278950e2ad967fc1237f045258d164ea576900d7ba3dec328fffb1e5f9d35acfd6a74504d63fd69e7aad5e72899c7b19066bfd4c1141b81bf9e6b50be4eb20d794480097d7c30664117e42f79520f7171ecaa80572b56287ae5f88f5a48ad9521056d3e63271eeb91246a2d3ede7dc5076f1c886cc3968c6da6f56ad86909eca239652ee6f06fe09b5a77cf9f1e50d67266121faef9160be213a949989185fb9cd0822a0312d45f9e95040f4aaa75ac90e6049d68117f4e3ed71e56e889de84aa16032db09607ba0c8099cffca2727f1e9455b95c176178310c8aea578c658514a2ce5e88cb54e528231b1593caae8f5ec5431ede25e7a290c98522f03aebaf37da4dd1e075c62248c128cf5c75ec56a5e4fefdc196d0a37609f9eaa6d628ac9b930e8131132f9e51ef33c6afd2a267554ba42ebf478c2ef66206017b4b3d93d2ccf17e628bc79f59721586113f3abbf2f28d3856235324014c71c347ac366cfc58c053bc5d1d4871310b452414b90fb24a24281c678142fb2214b9e0a06818ae98e88b7ae519ef7a06cd256e360bd2a406855013f561e4cc31aa313a6a41bff81920473d4a7145e946b1f26eb9849ff6dd835f985c9b9ce88c243c6eb5604707cb4d2b46e9e7c36f9552c87de54ba9c6eb8bc382f6c1da32d06f2a5819ee3bd1293fa294409099b10f305abffe9caf9d5d9436ed9c27a45fa4b6e5cd61c2978abc243a3e496f1c449ef54abeee420d57d101f897d794057687e1724025b92a5bf9949096a05913040d1d9d837a3541b89092b23e84a3618c297ad8c81f106de833671de9905037e8bb25c086e4f54824c88525e3160c7241692c8042047bf3e71265b341c74da14493cce0aa39a494e97b43d46c16247c56ee46bba52ef154f00de20a80023f12f5d58ef27a0288c9e0e2c47faf066e3684aea861306e87444e5a6838d35cbd50d246a35bd43fa90baf20f09a549efc56379d41050e048fde3b491adee61e28405b8b31cd1e35b7eead93552647521d94db2996e78679bdbed3dcfe33140320b980d9bc6c89d994e9558954d23fa763337f7d79556b62d13f738dffb3636a57e941a001491339c854e600e9bb42db9342e8b5dd8dd1d7f80f0d6b0858375f91cea06d3fc8dc49a61563356d9cab30b9620d611729c51bd5cb38038e43c91ae619854516f028c053a9050fed567eb1a8803b093c115838a1d5630d403fc90dde5b0136cfc1b21635d27294418e77106ba4e84f9c0cb4771bb4ace34d6ac53c1f95f72fc66f6a6db9815ede92cef60a", "ac0053", 0, -1903954703, 0, "8c2127b3ee43738181ef4c4cff3e2521427f60f176f8ac8255165dfa88f0f665"], + ["030000807082c40301c4991b102288778bdbdbedf423274f8d47203962842681fc87f5f1a181df64c50000000006ac65acac526affffffff02839779010000000005516a53ac51d71bf40100000000066a5365636365a23571beb53934f6010000000000000000756d5b0100000000f62938816000aa14a3e2d975b5640b5ddd47321b3de2bf83a9a4d6dd2243b0e852a116f1982acc41efbcb8a7552723f5c56be6ac22d3f026e6869212eda73f0ce4314fc9d14a91a346da81678b30c68b81964e79b7a0dd6265a974d713a3e9400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009800d48f83cc7d95b8f4f8757e7aa6f0a9059fc7314d5ed81f29bfb77e15c9929a572e1b5305fcf007fa76226c4c99febadfef244f336921294c2ab46869ef868a1a837b3078947e34746670abe6792ceea2021dc8ccca4b2f207d8daa45e70bd81341cd029a66cd84bf7a965039fc6d60015abc7b7ba5711104d20de51a090032a334fb532ca72eb4e35e769e757b1e0cdaff571d8ab7b9a06ae4ffbbf1cb97403274bbf79d5546ea1806396eb3c7c8d99757c5662fb2befd5fbe8a33d6d665a0f0a07ed55ca233641be19a5ab5de69f0033850c3ba7c2fa2c460e48af287e66245cbd335cab7f2d984aac5068d557e890554f4f98a57221dd919f85f445725e49c4020366deb89d3d5792b76c99bfac32c3e96f7436ab66ed31ec9105f9b4085a1bdf032d9f45ba9c65b8272c6687cc3d179de60d6619814c0931b5b3a91bda32c4b7d8032bff49a62f6427b2c3743bf04c6768ff1e25d27a16510c93503ff732dfda1e3a031c7844a542a688b049e006e8fd93e6faf025b0f34aaec76bb264a2afd4837291020ab13480c75ca27ed9b7e80e6389bf9478f70fb6c81ed014fb3e7114419f374c39bce8133b38b50c241300751f72faeb87826ce701fce5e214df9fc725922580f8f2701329f4d9e54bf86409ea6b65e1f8d71433c493b6c5fd4fb3a8e5e6cc4bb7fff9ad6e09d2080ff8b22d25faab774a35a7484535c87288d35e823d963b29e4502ccc3509c62af988604a9551ffb49ab5d1f9e9206635792ac41d275a790eac95c16d3126620ab66a7f85190dd3073a09488cebab30ae451d917462b138a2df1ef575da0dee4418ae6767e1de47d612e3c92b48be0514169f0e17b55d553bd35ef55f0ed8b70816f80d108b48622572978f438ab39d6a8ec7406a3b9ec25f870f56d9d488e7c335b5bcccd5477d1dd57163443dea611f8e330d592999f5ba184888f4d5291871790558354053410ee7ee43ed72fb44ee5c45a9decc6c67aa284eab5cb9924ac822baced87dcc20cd1d5d8f01931a529744b1ddac26683b05825b193750572833f46c178ad74cab6b72aef7dd46e7df4786ae8a409a0c34292cb177f4fde172b46fcb01dd174103367840c9c194d0635650f15c05c90085f5e016bd822c51b168403573371f25bee6495daee6aebe1f90b42b28302bccb081c3efa7cd815ae8fa42db63a0d24b3f2b1e441078dc916ca00141ae3795d975bcaa2e66ee9670d728f33aabe4587a918d94fe9dacad320f1d619c33e2dcf9369fa3ef6ad4edb25bc797d888d91339f9d5af1258045289030cdfe1e33b3708a3fb435ce115d909fd515701320529ccfd35610562fc521999046c7e3061870f815f968b53d071ea1d013d6ead7890179e658cebc26cbd056cd61c8ff51b38667362430c77bedc14f2381fde331243cb529c54c92a4aacd304e08a349ca5dce6b184793305e523210079bbf842df1588df66dfb6b3adf496da4ca6d8292978611ce8aa8915ecdceb78a58fbedc82e3540d042fb091e88a7be0d30ebcfdb54cdc3e869bac325de86238faee08185a2936d6e6620ad93203f4d8c855536ac0a8a343bb662233d24bf4defeb16bfe80ad0285610edf72bfd294d5dcd5814293e656eba7c5c52e0882b0ca59422021a5daa039d2017f303f04b80438923fe1bedfc1166dcf5491fe9b733aaf0311147a49da324e2c4bb6bc8c7f8258186400a835fd458ff690b34a2a953aba8f42f5c6aa2824983bd42398a13180a9a2ed508c8e43bfee6ecaad4077937ac5e18830a404efba66443e270e686b50625a0a978f8f594d1f8c89dbebcae8f6f2617e40755d9df0d1d17ef2bac7728fd5b8c1e8f93555591d9afb868fc8d586c667e6d4204eea3eed0b783277767d08c6df89f64a07fb78af7cb47c4eb4b877df5f92a1597ddd0188d2815b3c2c2a00bc8b8c8c17450901d52f2c3dbbf8ac09500d0535f7eb5d9479df1f60974b5e8ea9dde860646a43e0fa1f5e4080c159eaa1f9b702d6024342e79e39eeb9cf519e5f861ce651b35cb4be187a81d0147157f2a2562f6dadfa36aa775dfde5cece343807ecc591e8a6f25a1b17839b02c702f3f036e3e292c3ec5818e4655078044955ae9378f5b358c693dc25387bbe21c5bcef59c3b1dd4b2915817c820a7efc12d4804f4060dad5ca91460a6795377ed2c20fd216008755e5b96965190110080756812297582b27cee6f93d0baeb4447ff3bcad75df29b397f51717e625a196dd41b48c461dcfd18170274a020471ea9908a4d6c62f5547ccd97453b654fbf70628708ddb2e98371f5c853b299b7b7d504ac43853db8518dad6628cc333faaaef697d5b9786dba7b1f0c01ba39c8781b7051e1327a8d69ae1c1e810d32cca59f3e65c1497b15ae18577184066bbbca20ff02986a8805f92aa258107", "", 0, 709561226, 0, "fac2dec401fdcbaa67aea35f97bf575195e0445648537b935a226d941e9c766e"], + ["82dabd07048304632d14f3ed51557c59b4ef3f89a5178ba793b667ebd27fc189d301d73b2603000000056500ac6a51ffffffff3f2932ff5f3a296fabc21f7ded3f912be1cd5404c136a389001c45808e735e3f0200000005526aac5165fffffffffede4032921eebc8239eab11817cd0dc2e2318e8e6d466df19f488a940315cd90300000000ffffffff3b545f52b8b0cef665228ed23e8b9e926e75960710295750ef372d4ecd64aaba03000000002b01f3f30412f8630200000000015182ee760500000000056a525252aca5087900000000000353516a1b1b97000000000006ac5263536aac0000000003000000000000000007eca40100000000db488ed07c2a70d3cdc5462d9e5cd2a6750dd25ac5edff13078a961b97a241771a8f585422c843dc307806e7b844f68cb62bb867c92e2c6785539614080dd32d494244b6ed92ff5a17fa48d171b411135cd95014582ebb5da4d59c0ecce29ea3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001dd593806f0248201a3d301241f43497f8b1debfe6d08a1959ddd31082d1265f34df90b50af872ab26e3cc7f0eeefe4c98fb1cf15bdc46a8555aef533f3437dd6fcb4e6eb71dced25ece07eda51304a2584a2b97abe547f4545f0d955279fad85d5fdfd04608569b51792b71b92eb267ae5ed0ec4b582e3ba73e0769465d7340020a20ada02341b21ad7235b7acee3b25224ecfb80e751b1b08355b179330e7989022c0af29a310cf531736b2505254f7d7ba8c0c3433f811932324a6c0a283268460a02f8df21c2ce500b08ed247ea3b5349e6bf2d97d4733677e232846bd06b5c055b432a6ccb3d87bcd75375c62e00b92b3482b4abbbe395851d546264c2043841f0207aa16edbe0f000b86a18c308ad0b5c5b0d3310764f9f1f8845b2580d08314440229a8bcd67e780067649ba72515625bcded0190743142f427e1dc7bd81d9b24b9031aed4c18c01ee8376aa80afcb4337a33291a0e29ea22bcbe4f0d1d37a94be11a0210571fbd54d1cdaad5ead36fa9bc025a587f95980d3db6a12210a3563a088c9503285acd281adc97e3565ae6dcc557843f4312bc8740f201ccdeabc9b3a785bdbcedff4308da59f3428f6715842e08da5c3ac75d46cffb1886435e804270c4de26afaba93d5b8d76737db0fb29373c92b11e972e4a3ce6a38ec60da5da9ef45f523d04a788df4ea7beaad3ab6318bc1cc9ca39dbc8449d3747d3460ebc9d4e11df21ecf94039e6af28539e47e45e2c994e933efbc01b8ec214879c485cd3d679ad06f4d03964beb0ac1eed1105e8a0f4dbdfe5d9a09a589f585ddaa3bd4ee442bb81afbbf2625fd7d4adc38b7755f98e80abd8ce0ced62c124a8a6c5d9d22faeaed0839adf715bee06022193c9e87ac6a9772588097857a88528ec67bff36d3701d08e7013b0992d9e9abd33b8ada5140887ef2e154df63f174de41ecb87eb506f07d1d8dda76f1c5f0657c5bb4320112cb08ed88c170e92d66bef3ddac8f54df1e725c434f72db4f6ba958d130dfafc1f09b4873174e8f084ca94a9ec76c382aefa05b274e31c5ee09ebc593d01f7838b89a5632adb673fe52c59faf75043045dd12eeb80861c3f1895ba3c50e2d91416707708acb6e1c940005eb2e5e972f975c54528804f1cde02472a564e8392d9f2955cbf7394ea4d0136809e322df2caba928dd8f6cba0c956c7fb3cb46f507efd0b89c38248379b1d117345e3dde3b5c41198e794d60ad6fff2a51923ed52c77270f9418a9e2b7c5acee424047a4b3185a52049e354ed30110b1024f335fd4a6abbca648832afa43d52a9f9e45eccbca46c2644c8743345073ece35a32a5229c94dab069aa73226bcd3af72e149e23be23d720f7469f0d6ce21a97cf7378e0d019f1f30c14ac940e631682bfa6712f428cdacd80ca33af18bd791d02c0e29e0b7ba55e0522ec79217a7a48284dbc94284f271a917dda6e75faeae7d3873814a0a89734c5c842aee24f7619b87cda64ae3560abbf59c776bffa309a09492fc12cd197e992c13a1eb6cd5d14e6a4bd8b1581b8615d7df4227ece762fc1cdcb3fc96efc9552fefd6584d469e290c8184bc49d2d2e4e4ee13792af953720f0ae75702ecc77d937bdc50a7dd050f0072c30b611c69a7a8a2152dd74dfd1ea90afbc6df837461fef6f2f05d31dfee7f252fe46f403222bfacec56f9a66420f101d1b57d337e4f8f60b40454a93d664dbae9c213cbe1da5f23919e5e2f9082acda466392cb6fc1f4bfeba8bf988792e3902a0049abcea01435a083c6257899458875b2d0ce44932c7d59f0c7f23dbd21ec61c4225c3a7e7c3bfaf1a5a934dfb6853e077adae71bebfb37d25ed13db9e2a7fc0c25abe4c20775f68b1e30e7869f047bf54ff3abb19d330f7f775c8e2d1c93b60f4cdff178018f9c989278b15b0eca061a45ebb81075cca761cfc6abcb11c1aee63b3a449ccfc27c5bb99533d70b42d836a728dddf69cef9b27465d2c28d0b749999333d81de4b10dec597bcd3525239917a692e6ba8431a8796d64d1504b0172d0b71bf21ed50bb902b0abd4ab76364e1bb818c368553a62083ef18a2b170a681d69a64c4d3c9e54796b811306d932065a27eda3d14f80b4eadaa859c4178265781e26357fddab1f6ce3376f497b06c939395f1a40e18d291a380522a3c461a955ad462d30b0cc22a9d121e48fe1c83286eb1aa36ced9e55b00cb85f986a6b1f7192aa5920c51d4c2eb23d4a736a9fc14ce1de5412f25d7fabcda835f99720f48d8150841ee089c68c18c2f7427957c6cac10be00000000000000001f27470400000000113df2714b44c0f07bcc7ccda87638af7d7768f4e93d38b7d86d24f9c21e26da3916ce1f6d15ab75c34afdf51f832bfcde63cae7197970f70f1176ccc42070c342a2959c894a6ef89b028ebf450a93800aaab56642330e5b9e5c9e588f54764100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab2afabf5a0746a81cd446bdcbd7c0beaf8ceafd87448ea683569d5f239a7a6c07dd4f6318d4972b4b0e17cd2578159b0023adc0beab847fc393bf3fae53c0e4e3f20cbbef60712bd29ebf22fdc031334d4f3b58ac5bba17ef4319693ce8ddb6041073ea1b9cd63e1c96420b35bdb5a1dd88ab51b7308c4e724d6ac49fc0f6c9030c5ce87ea0cb7534bc8929da31904fce03d151349ad0edf65f85dfe060ec3a47031a635f58defd5fecd29d220238418a7c1605da76dc9a2064878599262058ae200a06d49215a82648c14b789572bc9b4430b3df3f06ac3b116246812f91d9628358532d4ed0e0d905415fec29b60216430169e6fa2a8bd9b654a4aca0d2b094a54f0207a09f96ed59abd7c5506e2540600ef16d562c8d9bcd91e5f919ffff84117f43021e2cacb817bd6f7415af49288aadaa076af9c547eabe6573e40520214fb4abdd0319c539674127239f46885cd10a7764eeb7b8dfd75d15946dbfc7a4c18a16e8aa031bf01fe1a1189c700032c31da11f30395e4bea6f52e59e8a5f3b120796430dfc0202f8c56e75d1cbacc8fca186c78e0f40a13ee061374b42a02666a34c858d40a9e59df991b8feef51fbaa1846ccacc0bab958e1aa03a1e63e7b8d4fdc6efd2a53f0078e4c39c9f81beff0bfe9b73af6edf1520981701c1b9e7b8911fb6ac78c96c22a0f041d846944dc39f4a2868dee175393a2613dc57abbe912beb8b22aa279c32f9e75dfb09670c12a84e97d4a9ba0c8e8a1d9ea5785bb31038350f44826a1441794b3d81afe8f8cc1c473327450aff1e930eceab8de2cbcdf4e6ad40516ced3401b7110d3f57534607c50fd6055a386b2a2e5e67429881d6540f3abcf783074ba678eb90983fff841c25e132a355c7d283da3c5e86ab0e6a5d43c43600c57f37a43f4bc7b70798a080a18075ad7ec9be80574d8540a3316767009bf39f73162044ce129324e2063abcf1dd9b05d3318071fad667aef5f8429c6e3fc5975b3513840f2d2811bb285e5916fc81809a7b93be5fbe7e7acbe4933cd7f09df627e25004a2b002c65b33329103ac898fa654be7f08ad9b35130c923648a4d16605c01e2e0965a9ff05cde9b01cf45412df85369571a1030f18bb7b3c495178f230b83d3dba0ad1d28f993bf6acd86542ddf88a9ce1e158d0f0cecea420a2fe823c856401fe906ff3abe805b7b12e4e247d5af679ac63b9dd519c398946944aba606821ba76e6d935286f979c56e66f8ce157f974edd843f3cc6d40f6fe9f9d93dceabda975a64665906f1a543a0be0c244825701c3527b6532dfe19911373b765f0faa835304bcd256eefd8a47afa7f1cb36fa4fbf163fe720e7da079a86996b6661c461ea3dbc4fceed45e91033cda4b9338b07291fa7534cc75fb75f7e955b43a562d860df1da4de9c0753005b467917a3d712c2f511b49a89993188a6f9f141237b4a9eaae5ef905845f83a1ed7452b902481d4ab614c132c29a93c73dfca9798e916069f0d3ac2978a97cdbf742394319f42bf9b873c8482bfbfc0c3a085e6796b4046e6615049fa453fd5b7cf17f33a92c3e894645f71fb970f7bbed648c94aa46bccb91405136b5597427942c8df318d0df2f36a1753f8942cd19cbd5c64457b85c216eb2219770a98c6ef45eacab5d2560a4be2f0b778329a2a66debe965a19e758c17c4713cfbbf8527ca26cd4ca71bcfab944d228928454a515cd06c7a7e07ea096696a8620c6756483755cda3a0cd028f37b73ade403a1a594f4af102aa718f2a84abf6df48e8c379abd66c17b5cf2fed257a797ccc67ba7e3278d7997afec71cd16a3788da72ae222688c54e50ec468b43d7f46125e7c99f3b836724f532cdc97ac87c75327b532bd01bab5c26728a909d6c62c77575baa5ff792b05a851357bda1abaf04ae2743b1b81bbc3ec6a44be4f4f6cbbc9b1d212e1941450fb83c4568b6bcafbb874502b15821a7bc262a99ae4fcf4b8036d525433aa3492fa898f0f9b540fbe438f9cafdb99a0ea040ae44bd37066a6d707c0a4eac5df94e1b04ebf24d26821dbeee6c8dcaf2a69441cfa95315dfcfdeffd88e3cfa0a882a7af0adca89320e856e039e456509c6e75205ecbcb2e7d00d983b7f10db85655c7df377d8e7960339ba2da39020233604670aa4d1665bf9484290ccc1519d480db07a8aced82bfe586ea859511356f65ef1f234f0cc0a74d0ae8f5371b7b30450726cd4661c69ac44eec577e21e5960150a051408171884739d8ec6b99f80ccc7167960c16fcab9447d529f2971e724d519095654f00000000000000000000000000f68be2218d48d1681711bb7e42841b973aff65895ceb3048ce161c929e042a1adfd1edc4da4b6a1e12f93f289058762e54914ae464e38755967f2ea5b9e9a38509fe8e4d71d357a21f3efd7e9ac8dcb3abc9b3ac0522def9b78cad05e2791dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087f6c2397292f6135b17bad2525cc61ac7144b368eba85ecea3cde8eccce73914175e33841cc305222ad1e57029454c5cfbab322ad7c4dec080598bd7a802b4badb8d07c18227e7ec6fc0ad4e583487079bdd0aacc31568dca1d15f8f1dac33c690f0047827d997491fd6f644c177105cfd1f263784461388ebbb69b21e3aabc0200e360dcab9937b1336e4bdf21d44bbc05c5220e85d26d03a3c6b6dbcc56f617020e442b4c9ab6232fed1a345954a8194d0273975e4db8259091c3ba7ddbecbad80a03fa4421ebac94beb8bbff071bfc5e3272f746cfdc8ebdb5196b0db0333faf2889842b95246443cd18215e0ea4760553e17d05f5a21da36d3d0368199f5f83ad022d9e838d695f4d6ef5e8f17cd57cb0d53ca2eaeadb171b09f499a704099b599b03298d9226d49ad675a6c05312c55f6ebaadaa27cf72768df9538bf3d596abf1030314309b3ebb8e12218aaa7af49e30d9079d8ea56c58e21a5eab5699102331b4c003154d3e2f707f7bd0df381593068c74b9d85ac90bb46b96055cc86d0c638bf1bf03243a90b9d4253532ec1e41e3b3a0a50eb6c34dc9f0f303310c3e99a72be88120dfb8325a5d0a369345bfc318e6a1e8294dd9b5b9b8e177347e39b6c9849b1471f737f0292385c6a2695dcd6ed165f189e064cbe99090c4a53942923588e48670edf813b69a34a2f3186a03641dccd4402b6f29436ccc172433784e7e67bf1a6b7c1b301d64c0f034802f44208f993309cc262d933737bdeaea4202a5634a2f87f570d981b3440bdcafabd3a14e126cfcbe6b2b3fd8c8fdd361f90c9f9d381949e4b320928932f20d7878ac355b97fcb5a326d7e36393f95b6efe7f98ba1569b6919daf6f3c644e16e44e327d14ee2756a0417b34f35d51843f55123088d4f5c9b50b9aa42a2b8b319dbcb3d803ca4ff10d4f094aa268b995e8808726dc64f86a30d61e2b886f14ca53482073a9359c555c82f188a3c0c30f198a6657f1165029679f83d4212dba8247bec87ee77341b819d59dd51f457d30d4f3637fb890aafa66bdb1d359ce7a9ca13ad5ff35058f899266bb7950dd903d648e96c4ab012a871f94407add72dfbaad9e1253d4044f44197cfda8780e36ced7a0466df3772594e511b16884f902c2ae9c0a6e384c81c6ffe8bb3dc3c62bd8a4b19f3db6a041dfb45abab611119021c8e27d0f2bc8c2008d8f75c2bc2ed5d28bd54acf84f8b2dde0be4276807cc6d61cce60fd51498c5f443836d7afe180bd19cffc4f2b852be017a3910cd37c59b58231f67c86f84a3f6dd87da5c515e1f41616badb595468468a29e31afb65a4b19fffc75f99177f0a4ef7abf069e095a122c7adf26dce1f5ae07d4425a49958f48c264a96052100842035338de217c870a31ad2e880ac22b24204f824c0ad99543f34b68a0774162d0a9d132d2b897aa6c0ceea87715c4733e71a8a8df79547ff3158a865e6f5ab5e0c9d893a0c603dba1a35788056e4877e4d5af22d442cfc9d3320332dae01d4bb5af459d530813781f5c3f57dc7681854942bf0986fdc2c9b584ae208abe990c0e2c08bee79a3d2dc125b93fc5a55e2f6a4d3c44d3be3c796919692a3b0907b0aefacafe9348cc90e46db0ff70d234c9a183a47fe1df509a3d91ae5b42e11b98e9efb151be7ba670252f4eebcdc8b341e16125094180263291e78d4b0974a0a6504d4303db9a31c52fa70e9631e10b3d182dedf03277591d26b14497e12f91c20da495035011ab50cf54d0dae365111ab7e2b5ccd2bda488f33db5a7607bb954087371bacf9e300c0a23c074358c86fd186fde37bc9b82b9523286e86a2dd89f90f396948becc375f0fcdaaea029929e782baf5acec61e5a8319d5c12506ac860d2dd57ac2325c8b92b1b5735814d45105dbcfb200b5899a804186b2dffc010632da16ebde4e067f6008d18d60e9cb659967e3166220a6bc447e224b86c8bad525c7bc77c07a4065faf7acc50ab208520dc1196d1b230897b2fcdaaa8dbc572b612502a374ed52ebb31e08f5591b65b9a77f7d8c248c56338f45d15daf9fc2186f1e7169e26a5d7d0b78248602c331e5c8280c7ef8c6819b465c155c96e8c8244416238f5b76573c3a898ba37857161f40a271ed89a0af25323ed7b01661f89f03119ff401bffb23f4a13d180c6872142ade903724450865925ab6c280103399678cfe9e53d034c2fe54e9c08023735d4200fd0455c42816d33f134564104b4120961330d07068d117292a61050f63f88e031009eae29a01df39e9d39238fcb84df4df23ae4d39aca3912d8b1eeee20eec49a8e4725bbd733425e78f53119784a6557bcc4c0af4843ed833853b01a093c74b2f3e76cde3dd83c2626fe8014bff4fa23b9fd962dc951b39b267696384494da045618182408bfeffd12b28719bddf5c0d", "ac5263ac", 2, 1903998239, 1537743641, "e1a1325329c16cd46ae975558246efebf2060ba29f27e4133d15258d67ffa71f"], + ["030000807082c40302f204a7b43084c2a4a905181f1199e583b88bfb0bf319c21a3b5a5887a813b5d7010000000963526a52535365ac655e210157a2774ae3310d237b3ac181b7e58a20427ad748560060d4be846a788ee2a75153000000000463526351ffffffff046bf26405000000000600acac516a0005934705000000000165bbdac0040000000002636ad0a8ee0200000000000000000000000000038796df01000000000000000000000000192a95a07c9cf9f737c1457cc762ba7ad36578a1cfc36f8538c9726ddbc589e921f471952bb44913ca105cb53b9957157366dd94948a2c939a572d869056aeac52a1e70f8074a634186cedd3218323bdbad6c1a79df1f31421ac1e0d597eb77300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000859e45933945f2973ab875c616cc4fe27dd0f10e6ecf6554e28a3fe1257548554a02e40649e46a12dd71b799ff603150f8b6dc74ece84ca9ac2e29848e9d9e090fea6e9c8b9102d09d8123b6120c7a30537a6c459b0cdf5b094cf4706871d00b92cf5f004333de995a60c877c015252a62a56c656baa92eeb741c6ff4d29bebb0317be14ae7b3dcce7775cdd39a5d33cfb4abfe7925f472d8b0c51057ef9736ba003136f7f37bd8d1cf15039f1b3c42d7dbb14bbdf3fdb899d12fbb710bad5e4fdbf0b019c17521f2884cd67c0c1bf57690bca154c6ddf7d6a50fb83e61cd1343757e89326a18632e0643fa1fc535ab263846dbf7433284c533047d930a299c397a8030207027db708fd7bfb6741dfce68181dabe08523c0efa9d4eba9d367629163700c02270d1533495fb4e7affca80fee38def77547f1d2400a59b4cbac490802458f5c030af54400ec390ebf760e296b3cb4d7977bc9bd3426378352864c27b18df446a403212f0ab2c7d2f867e120f6b77c83e3c2a7c3631a0242f1b166f13abb8ad0b7540326bc896690de9dd1c169b709d3b4649a1588d526610898d0f1833ffc3d4e877806ec5882fe9f6197ede1f2e64bbdfcf36f4bce05114a5ee483325c666bc668e24ef351a4ecfd32d7d879728b396968d620026f394167fab500feb75022af4254c09e45a70d1879521aa86a7824e56a41a4d0a76ea9f10e07d0dedfdf027a76cceca9b628863d171f4b9895f0aae0ea8b64e35bff8a435346d9162a76ca2cc63bb5ac43bc3e8aa73e00cc6d98f80451ed52828c0e771e4e46519f0a60d144a7c3d77ad5ff906b9253514fd869b8ae2fd06796b01843c699d402466c64261dd982a7a87ceaedee68cf92308f2e2a1fd4db21d937906870ec392dc302bc1527ed47904436c54e94578357fa6265730c02daf8d2f979c37606647baf0e58dab173a53d7ddd4460a8424c242a5229be55e3a37d372f88f10520d015bc0481741596a5a3864f9642603fe9f8782a9a3fba948c184603fea0e9615ed954dfa4143318388e508fe39cefaf2d9b63874b0040a05c1cb92265102cf7aa6d4d7f0760f9ad6647027963a1641bb1611b4b088adeeaced0634905385913a2ab33a846de715908047545cb3292f2ac826fe8107658d347683ccc131605358e501521fcad4ede87cabb2d8fb94fa199b0776a3a67de581d222d5bdc49cb62c0291d62e63393b570c5f2e474007bce5123a165691a05020e7c81183ce4d47d5d057a08660ee0afed91dddf19cfe733d8d21c609451e91af772fdab8bf72748d3d3819ec5b2ecfa604fce96564aee84d36b9e44745d7728f31456f9ff7de9a123ea95edd927b78acd191b8d23fd8b05253213c4cc0b8b9de95d76b6e31b873283b8c6eb56951bcbf9b6985cbd8e4a0d356b4864d469d573bd3eb24b0bd94b0cf044aedc42b6c4c4a194cb9350726ef7fc4c24fc40de1537823770ce2d05e793a7e33f67f79ef8322ed41cfaabefbf69df4f4fb2003b4d4be6aa9fa56f6f27bf564fe6c12c83c597cc41efd83f94086fcbafa026c099dbb1317c5523136797953728cb6ee6d9204b257531cf76e84369a115e83016c7d8c0585237b666880a3053a52e2e54a4819b1037574d6c180a966dcdd8adf5271e836e681887f9c297d8f61db972d5ec218c2a7c9b6f9f7adaaa3b78d44dfc4a9980926b4ef102c84a30e80023727a04feaaf99f3ce4670f1a47cbdc02eba3dd18ef71c8b48a425439b7b827b786e3acb392cdf0c3d67d871ecc3d431a56b97689ecc21c72228aa3f425e41867c1210d7ba9a90bc267be706f98ed6574552a0fc14cd1eeca8f42fbe20ddabee3d01e979a037f484fc1c0c2d537328733397585f926f8f214afc3b250a7f83b078147d67e66267876d703b934f33c1d4110740f0795628d0d75748b9ca2c37886575edb58713f409a1db0d196284525d71e5afba2513ec81ca929cb765445c7af3526fbb1697404d1117e4a07322c1f483180d06dd274a84cd19ad6e43762977e40e7961fbf8823b402be5a51cbb467ebb285b9542b6f20f89547662304f719e6932c3c06e2bbdf0159d9f8636eb58430e78069a39f8942bbeba2531ded5fc39d5e50c0342283dffcf5d750e656831cc76152ac9ef967e03b35bbaef0d46ff38d29803a84233ba75684b19bdbf2717b05b23d096d6454759fb1dc2baa29faf758f62cdbc1c544166de1efacc6c1b7202da5ac0f5646ec5ec21e69b9e746809d6e5ab64aae16459347c5235b37e91ea8cde02f8ae646badb2100000000000000001faf05030000000077409d1050aa834041bc92e5d1fa287921ec507b0470d9044a2a9c649106bced5be416faef72ec0d9ee7c5c72b6e0f825f5dca3e453dc25f00d4e28870803acac0b18afa1f31997439e79be85c09deb4127b07b29e441983dfdcfabdf4b9c38400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d33ec3c27a11af88fc71c55f040b02216ed3b54975d1c239dff3023a6ab6905c3ece9485edd6c4db0bbdedf309c7ca04e10ea82aef5c59690f6e653a71378ea115b1856dea065c624fc7fb48a662457824487c18ab06f121d35ee85924acd61a14d8db6e9baa0ac40f1484a9d6431c3458e13beebeff173e8f96f9a1c8d694d503094aea6d05784db6e1b8a6938805ab97cb51652db68a1de73ce543e7362a1a17020ce82d72d4028b79d2fdf1f0d2bd275ea4d10f48d5eb6cae28c0a2ec756c270b0b028b658c12361e7650b878bdccb8f5fbb072d60cf43db3cf56c0ceb2a52c499a55879917919da04da30af9d63c8a61f504e470aceec1e1501a5ee3615d6ed88b021e67197f097f416a976fc1c1d79b91d5653b6869c4df4832c0bcd217fd232dcd021aa0e3d5cdb7fdfe47693f7a29f07d32eae6217ad47a9e9e816a2306782d30b3030a76c99479d5130c0ebce88c850081bcc31364c7936b9b9cce2b9c402c36dde20203b3552372de857b6632e8efe0d0de6cf0efd2282ec14626238f8adb58a4f211032a033207b3e7a573d7096a93b8483872012f9e27038bb496f23e0af8e6a552e43d55bd1a9fa44701b665b5e4575f5b280a6ccbcc49bbf95a6bcbbbbcf8c7776a4c3e6a2cfb1b25bf47804492e85e0c4b9212f5ee598ffc0b4c00af5712cfadb1176e25ee008011ca9b4fdfedd773d5792a08529faad245a72da92b9adca63d64e6e1d7a331209da52b0e23a65133cff03d79f719fe7e54ad7f6b5aa295b4a99ed5928d1726c9f2af0a6f58229b6081dec3ddc69b8651b964fa217ca777c88dc51adc51ff8fb9f62c5876e81e8535cb2a892700a7f41fbad38c294488cf2ef1141f5582ef8b951cb1251481a5f2d4755df1ebe29ab38bb4ac117648d5fc812e812ec6abaf424f5be60cd4a398d3c74e1db80d5f6cc0837d1bb1a67c5c7962adf9e714dbdc08e7d29fbdf44ac49244575e01f7703017623007ea7d142e36d7c6d5353138b03389963fec964b1d7e33d64aa94cf7df3c15067b8191c2a4277bc7e6c3384ffc6ecde5246c09dac1f748ab7b15a581e64abd487010f96e22aa7a13d23681f71fdc1610e4905f3d235a4ac6146e4d35c015de26e484e53b081974772aba416634117d2775f795e51c5c539487aa5dd53c5e93bb94b9873beac81d29d82028c829750a9bc7e19b267a53c0d92dee9c540c9a6e2c92c12895eed43062cc98e7388d7d1bd700f88c9a39f89c2397b54c1ebe2ec5a82820fa03373df0ae1cb203892b108ccfc9df9f81e1ef8dbde5112caed80ef0c8295fc63c553f4995c1c6bdce5eff122397bedbc74e5cdf8341e17b14c1ab6af595283340deae4ff00ff1e6971d99939b6b667825506fd93ca5541ac45379eae50cfe898140c97e4daa1d930ca375f50694e8096dd3993d5424cf14166ba430e6989a4b8c37131374973852d89b6091c0a3a94bfcd019822657f00bb2f5b2fb9c9b23e9b724003e98f073c1a9c1decec8b4e3467ac1501bb2551d095795a09c03831639f6a610dd9ef3a76db3f49807189723d894c48643b98a8537c9f3910906b085d43352f4636655cd9decc4e776b5e3a4469401c625a90af6cb5098c54db3cc1cd30a340ad03f75472e3f83ba99ff05a9e9b4269f00953afd6feb073ce2f5b66905bc9736d27f2dd4a29ca6f7ba0784924b009f19b150b5ed5e4af964b7be4d4cb3189beaebabcc2811b3cf1d390985d815153d820ca29e1e66228333e45cbb2e3fdd5aae771b17dbebcdb5984e7c6e4b062f96194d934272f19a7059199fa39341063cfff76a23c17dd0e79694ab610a7fb7cc75f8b854ceea20333fa5200540c4af29afd15b2807532f9b37ca93fc5f5332303d88dee8c5ecee20bdb73eb23a9eeaa113c7098f59181572b9fb533ed3097bacd9fececaba0611be113172ec0f4b7596e8f3e0e97dbf9c185a53c057ba79739faf3ed11b08d352bf0dadfb56839a4eeb325f6912f4636317e4b001bd9be1fb69591efed9aa2257331ce00d85f3cbccff121a2bd7f2d8dbf6fca11abbcf8e6f756feb5913e69a916e5bffa754af948baaef11d8199091f688a29c150a841cff281d5286fbcad7a1bc36b1b906a823a10fb138b4ead42e73b44dbc0d28bbacabb29732f8a8c52eac508921fc84bc38dd7fa5a2275d6d987ea6c41847b0d7a4342d4187477270ce4c56d3aed82ea1621a9cb32f8630af876c837415a77a54396842e5fb0baeed315b5a50f211f096c4ab332ff56b25679fdc337c0dd7ff82e2014a9eb1f9ef924a00000000000000008a9eee02000000000a2ede6003d3f0b1dea5de85d9e8b600041da0683165439e2ab7c05f778d30f9a369bbd64f2478f88cb04f5c11289739d9432f50eda87256e96d0edaad1d4398b097cfd2af180b48672529a4c588dcb2f69507261cad61d80e42c6379de643b800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ee78ecadf8e3deda93e5ff8d3d0f61c90cc0ab7f091c3bead3dab456881e3ac0ab2d617cd536291724cdda4d51191b0cc51882bbca5bad7bded420257eb4727bab7d503f0ce3ebfed811d0beae61938368d574cd006dd29553f97e0a9d839348677e11b1f10ae82592f250826440411c70c0624bd6a9677fdd0c3edea2bfe39b0319c5fd73074eb924fa02105eeef35e8fcd7a29b1bb32a3ff883eada72240a91b020ea834e86501a13511b59bf960cdb1af0ab73125eea229e7c0d8c3b3d2508b530b079f595c356b3b3d51c30fd7bc226134bcf83cfddb064699a943809057d3939652479a9f5592c461b5e90150680115f64d940aed5a8a559ba1824b6fef886297030cc8928fdaf7b7017b46e2318f80979bafda51dce88f01c5105698199055c436030f324215808be96ac0f1f50791ecb36c52289917d11354a320a2069a76ed8856031f63eb2e7853f35eaeb65bb4d59304a8756bc1bd85a5b11ed1b496a525ac07dd0315a89e3c3915923c937d3ffe3aa12e2fdc59f4d55b46260ed5f82ddb743ec111032fd0ed1c0f46aeb69113f4dff45c528d47261e95376b9439efc5a85534384ac432c2131852cd9535956bdb27322bf1417da538987c7d7977b946ddcf636612a94b80bb5075dab661d84dd8c70d32a753ec1daccd88504d2d09986a858d0dad2c962738f3775d916ddaf99db26d8ab66de9be0ffa90409498e1a3cdc348c1f44a67c4640a915dbdc7aab593793b66344b4eadd515e9a64be2a3553c93e6b3074112eed923364ab9740a1de745d5019356be8eb0cb6146046e1aa9294e83ef0fa1d9b49fd9de871f88bac4cc7413192bd8c70443f83f1b57d8b3c5cd8f3a4a4fb04577b85e44cc69daddd60b4a110acfb3fea0822d3f2d73254982d61e37ed96c0677304ef20bcb969e26f3e53d6a9391db13d1f0aa76d1e042a2d4c448fa1ddf2448615467b658273823f65db363f74bb5415b83f550cef7f55e4cd3a16f96d10e0fce0bd87e8af4e1b78c0c097af2951da58a78e2b6d30be3488a8b6e08c915dc419d4f8c202cae63ad5cde5ce822d80fc061e6c97f3e5f60b92ffeea8b400d091e7fe2431e91df0badd8a7810ab39218d5343a8c5754a7adf42d859a1b20d956d85fc7bd0a2b2235442314019701569565a39478cf022d3611d36c04eb0b5fed0f5a842648dc1ab3771d87a5969581cc00171ab78bd166c7fe4fe1bc3cf00a938a0c4ea8e32b987db80f182098354c5c9542af58f57f91beac0c2476b7d8c12c92ba0bac4103753b22e73ccb99a5d30fb78677261f63493d8be69497d7b5fe8dbc3962ad9bc0172b63d838e018690f5c6914a9357466d2e6b4ffe4db3a5a92827442f5a26f8b9311592e356a49f6948f1c093d6b536eb143530f1b0868986a5ed86282d923d949903bc96759ac1066b016eca98485e3f66559de9f650d763d4be76304b6ba90953cf641f451a3332fb16afb1d96a9aadd0805d8838d2b774721b5688a1897cef08d2e79376b4c11fd6d665e24fa73c6f6c706fae6d48802bc3f3ae4f95324da1968d9742ca46a9f6fd2513c896e80c0ffaf91484526d9a74fed7944775173ae65df22246bc5b949df8de5fa9008575090193be77ba6b290bf5d9ffc913db5e6984065d3b5e8b35656b95da1dd97881a9635e29c15f60de66e8c3bc755658da163491a1e6b4309465cb73e12d38c04913c1a30b90a76caaed0902018fb26d03aa7711dfd141b7e3f24f4e9939f3d757b30448d929f8f23a0a17813c0595b02c967020e8b44e52244dcb2b10eb916902a673a93b262fbf1d456b1496af4635b4766c2d2fcb010ee9d9a4fdb3952043803235be91fe5570f34c372026a2a3789b7a8ebf43e10301e9b7fd14fd6f827a60fbd641e285c023192a9046232b61f6a5eadfb69fbf7800dafd98d766dc9b2e3f17c47af1b90cd38330bf1ceb833f0fdb0c4d8732a4916c9f496b5c63ee64975915c531b55ed1ef3c916dce1b882d4640ee8b71128eec3c83642ac2b654476c90ab7ca871270bc80336ca487c83f650bdbbd62d5a71197558f26e317d1e3f281cee878918ad1c839840cb0e2ee230082f9b5f77d9ae4cbf941ed95f3667b59d9243a737241323e63569419af5ef08e9e226a8fc84790a8fe01c6c1b5176fcca8283cddf2afb2195ae7fe68a81396a7bcb10fc1e130fa5b19a6c8e0903c467c2f66a3508e71e13e2e74dbbe8d2d7ac9c7729b691a77c06df414b87f5ec33132dbf47b45be2a27ec2804d4119b3f2be9e351969b051a00ac72ab4a6f01a9532b5e742a0d175346cb13b0c954a1ba0bffe7018eb395dae11858605de22f7e22e0002371a118f9f191e3555c771ab3c7868e1caf9f1f38c01ca03d975d10150644af2a857bbb3d25926bae680d7957587237615f96207326e2e9d0bf53b0d", "006552536a", 1, -1289411036, 0, "c9f083740eaac8444117d4f56919da4348bfdd3b5472fc6671f21383d357bc85"], + ["030000807082c4030465ded46609a8709980a645daec8d18c186abdb8e845ca6b63f8651b3f924b7af010000000951ac53ac63526aac53950a60539c70b4da7a3474b9dc78da7497d696f288e49799ea91b5f654cd9b6935dc5f9f0100000005ac6351516affffffff73232c414fb34e55ae08a8a67951f6991e8c7bc1efe481838c090b8e0bb77ff900000000076a6a656a65ac538e387c1957d3819748b32dbded1af9ff82afbac2af8bfb0ba9388bc9a0eb788296755cb5020000000551acacac65ffffffff0255e5c200000000000400ac0052b2e26700000000000551516aac5300000000c5d6bf58013b69fc0300000000000000000000000078a944c76ba3984ac9fc138960bb654b6f707772229603b977b051d67b73bde398565723edf88c47f43649eb5db7ec3cc51ced9591f7a84081e19a00bcd75c2dea506c8e8b8666c56a16925631f21f2316be37e93ac1d2542e6c83c1b5c7add200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000afdf7036dcaaebc1289621d94ed38ea280829561f5e7d36bddf2097d674e90956a49c7c306b27d0d9d9441413e82dde38cbfaa96b2071742553de6bd5df7b4a91c08c35ca3fbf8a889d87c8265f33f91d57042d7021f938b42bc0c43a5f9e7fcd4f3561f737fb48295c53ce4beca7ffdd0ed8af0072099145eb6c818f7d3db2e022a5e9257c706128c4310f4b9986cfa00cd71e195b063102f15f27f40fa57a1ad020644e5c39d8600bb6976205b4e04990cd64959499790a31aa63955b18b034d810b0918937d47be67ca929b067d0534a011d5fcf61641154f48d2fc90278e9d23458c4d5d451cf9278461939b6c0ef5eabeb10ab51595b6731d5aecb19057c6f204032cb1ea5c2b8dc402848f20c8fd98d8f84506ae3d7e2a30d013b4d693805ff9bc02108c3ec6ea9fa100fc4f8b711d82fa81217e19e59944182afd94c8ff1bd991aa0216ee84bc76193c364c5a086fff6489436c991e186744c73ca3c1ff2eb44c35490313a46c16c01286a767daf02207840d37e7500c153d8b1486671c5ef6586f180c021a05910ad5a84f16933018966f88054457481467203a97e6ae3c94070668212b3eba1eef44f44166481687ca75702ceca0cc626ea8fd7affb9fb958b4df09593ba82e21243b8b6d110777e375c5d29079f153d2daad0ff2ac5a34f5e24b65b0c9b7c5ee70cc6f58a036cf2fc22e7eb7c2df7dd73da0a0a02b6e3a1891a579ec501b62cf7aa858bae97533e7403ca756e2db8ce968986917aaff8978c4e6b9e05a453a225194a9610c9a1aeffbcfe8454c04135d2615aca485bfabe0480634045c50a1a019362e6af401a9f3f5ea7b9948065bbfdd77ed0aaf851629000947b4fd9cf8cb1f75db01cfb7dcd0797c09a5f97d2752fc39adff64a879d8b3326f4c9ca15bab482dfc182c483c914342cf1b6a72764f6e5a152c535e3a5f2cdb11cb65bc5fb530dfd799ddf554404a6a88d2a629fe7aaf4eb701cd3d868fe3e7f93ce4929c0147ddb0d019a0281b4f2bc4c276c7afd7eed51df761af152f4334947610d4986f6d0cf052f79da1b2997799e9a11f66c210d4ba7b160d4963747d75ab247bc3c1da2679dce017fd0c030bacf89b0479cd2c84dfe71516e8ef1b5bc0bd153bf6cd30e6809b920fd4a76669739df3a8d36515acc1dbfe79f3a244adf2027120b9314e1d828b4a828e3ca7139de80a2ed1a0582cdb2ed2320ff7d050c04a7972b735414b8cb933d16247a8298f0c93c4907b561db31470db7dc2871e4409640b93f8252a0e0ebfa8a818406fac1c2184f7d7e3c720698208cef7c262d944222a57be0b480cafc3cf6810a2a65ec88650acceb388310dd05619eb852cc1fb838d29416103cebd2bb99e12d4cb4de5d8b3705be8b3476feb082f81bdf1ef4ded18070f71a14d29d067955b58186eef7239fbd7cc208e60c829952991d550d03d17010924f646d0e7424d98621a14a03ef4bc8eb431663e4a2667556ad9121dd59206692f5176f0574789f2ad7c97ef2f372c709a2cdac773aa7287d9e62ed42c5814f009111fe6b80ef59cad14297e6ccf3a4b0f716e5e7da901c9f7dc26fd32242cd782cc74752dc076c19c6036054e13fac8c542d86e46b277ac87dcfb9ce431679caf97191697813b1517ba8e2968f1f90e280f563fdb488495aece7195c0163531dd5b6acab2b7b3a9b6ebfbad82f0073a5c072afd6fa396edae4587896e7ac4106b8c632e01da608e718ca922d844f38ce8a1b2b4c8b9a3d1abda16dd75b56ead37934bcaa5ec9e8b1e4bc71e69c36fdf34d0cd2fb3d078e941484772299489f4069ed7680048b989da3d8f9a105e74fe09a046612aaffa851ceb0c1bd9c6c6da8d62fa73cc32b8e327aa88a007d6183699eada939708f4809534f9221bfd0d8d0294df45eb766c327bb616391b27169cf668832d7bda22019bdef2c74c4e790c7a8f19a1ea0fb8aac8bd0f37a69e024abcdf566653955e212cfcf05c0377cc2b1e9bae4ea01cca3097d26dbdb8ba10b3b6b62c2d6ee4978ae8c71cea2f96b2594409ba1fc3730ae3841b3727dc53b9e201593c83d9c35554ca6d4c08e64f3b408e225418ffe7c6e49bc837074c9b4e4c26a77e76fdbd5509e9e7888f671abf6d3a6e2e69027341dc26170fa18c8dafe463a257e8b97ec95838bf83182cac644c1fe83000d259ba32b44969228b99ddc7ca04adf6294d1b43cf2b4840a442da6f3d66e82f53a7e68986e68bff1fef8fac18e4d2ea111f97bbaf7f720914580f70bd8c5fb48e1ade46a072da9fc54116487a258a09557ed54ef90c9da7858b29fd4681314c0fdd4ec21d9cfc40804dd01b6c7bec7d10186a3d0c8c7f0ce36bdfd5df9c762ac6c3adef377a9cabdde7a1079fd7baefc99c374761eef5de4bc36ed3813e97af4c990ed6d61e1c8ed730f", "63", 3, -298200912, 0, "19fc7275b14f8775fde4ad94d3d8a9259787378e91aa5402cc15288b5b4c4f0c"], + ["030000807082c4030395b9bb86810e95b2a21c2f7b95cc19b0e8cba3fa09c33712c7c0e9061bbf804a0200000001653baf9f24434dba1597374eb1103c3621814a344bc3f57d9e3bb3f9d68e8f5070b48959380300000002650015d1c34c7ea6989bbca9abbd10e7e00292707a0ddf3087a9139df51e720812051fdf05f50200000003656553809cd9ad029c3baa00000000000091f2f7040000000007656aac655353acdf81f6dc785aa311034916fb02000000000000000000000000bbbb26602590fe5708d258bbf95d20291b955c90202fe8877905c9cb0548c4fe3d04a39967d1353e3b12238cf4c896f9be7428a3ff0da87fb828a011f7852c253edbda331bb41c913d3c2839aa1cd6821a0fbf6fe46da99874fdccad0834217d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b90361b03ee29ec3f7c0081f5d6adac6228bb2fd689bb5267f1828361d13329b6a005b9f124d79a6d4ce759857b382919b3e97858309bcad4c6153c587dcf8417fb5bc0ca410fe52fbbc0d33188ce71d5f5ee40ae1a6baf8e11b3fc0df6dd490bbb018f6c8b3e7a3508e74d07d9826500c65b2526ffcbb21019ea469787f5b3032f5d28f44868898304876687ede8462a2f2cda970ab4bedbc2a63e35421ab78c0307f75ae0c695835898d383c254dc59e0f6c40315e96e072684439ca3ed9a37c50b04eb962f24bb4356a8bd19d80c647228ac5a6a3460bf038449deafe39088d2479114f26da96492659df0334b9793ed42cf2fe73c6e55c140244699b5bbc33f41030f2b1e18398965edac831e6b460be8d60e54de1ca755429471e0978848d9a268032638c39fbcf23b9e24fcd9e5d025d4acd8c94274123df87d8abc3a8096482b9b0313e96527d3f3d73149472af58d7c5b365efc90b7b675a0eb805cb1665a2818ae02118317ded582f7441c0aea09888df7dce4eeab9a299ecffb20d150df213036c80208c551878acf2ff110db0c9f1ddaa13821a0083897a827d9cb49bbc256d8af2aa889aff5da41e161b1e6aa864b95f334fd66a1285dc566d4dac729ee7784e407b618338b1def3a431d86f19fc2dccccfd44d0f19b355b97c22cc8deed66357a2d40b175aa6df02a945456398f8b9dd0d18712693eafd5020af63da25564fa807b6816c02c683760267d6205b96f7502015c85ba4f39d63e7f016ebf66f412d4b050517dd01fb26edc8b51902ef8b9f9a7c71a2065ba91b749e69c63408a3bf5acf3241bae02cebeda975283207ce2001ccbff24479d1980ca08918848cb42cfcf69eee86496e75d7702a7f6206bb26c7b65542042e8a7bb8cead8a604c9907838a42d96212772628cef4ebf2abc378994f87e1d8ced5494ae436d92e29d632e3e19e063dfdcd7a92985417f6785f957b7850fc21757472609f80005757c702ccc3e36530503d4aab25d87f59ca03703f091683bb1b315710e85176902dc837fce30486b29bf14e7faf30b2fa6900dffae5ce179dc486b5cc4ba3e5bdca1925b2d809eda336a1848398d03670564fb142176aff2fc187d1acd86759401529a8c0aee1e0e24e8aa5ad73ccda748dffe7661febee64e9416a732f53ed6a5db3263f203c8d9d86c6d33dc6ffce222aa1e138d25051ca0431aa9e4b98350eb053f2f901d0bcd9ffc60ddddd8a09ee3a86567b904d0617b8af6c1741efb18907abbf573581e92c55885265d97a6e5f9f70670972cd2ccc338404a20d8313cf9cd1ced4acaf0e9b50b0c63e690166fc393e52bb71419523839251a0416b67cdff78e847f3236d4186a28578f40054b38a803704855eba34ef3001dbb4055682e555f6734a1ed72b696ea1c1fdf5788291f0cf0e34e5c05c62630ebc3b3609a66172bba19d34dff4c195916a48596a547f60e80720973cadefc4f4206d97b32a824204db7eff53a31faac73de1c4e0793ea9c8503472c7100ff80efd3626cc50c8753a7966bcd09e6f2c59eae77a8fe1fa50e4f12c0fdf257cdc1106f1261a693630c9c7050ead7fc9ccc67745dae84e5c3b91a83ace14982ec3f60dd8c6b6bf5d42a1212cb893cbeac146fcbb34bb7d51f63481b62c3c7041ac2f2bb035366dae9ac0d2c16afebb132ec7ae799e3062099d4373fb699f1377b76350b23845c8cf26d4aa760ecc2dfe98d3e2e90437115700f27b8fe3666fef76b8cec3ade9d7efaf5d437c3dc453ce8adf4695e3a2e11c1b9447e8247ebf46f1cca2d43575e6a87952172ed09301a959af7c0621719aea399ee73a3018fc72c9513cb64f899d9cc881af2f717e32db266cac67644c1dd3040ed08677a8b9a8ff32a9c163984ee54389e02ee0776a2df9aacbacd49d9547734bee18210b1a5bce0266d81b78ff201d4a4c4e5fd01027d36b098cbb4a1d19efdda6ec7c94011d55ceff1ff9b440c3d48f6403b325a693333b9ab2d8d865471bacaeb08b385e2ae0836f99a4e7f5229d0e55f660564c96b75cbcef03168f04d2bc15833f1e7def1f5341fe1af75acf4258ceb49104954579fc651faee6fc75b0d48f9a8373cd7f3d16725bd2a4f17557c192bd48125fcac5107b0afedc47062e686ce2b5a19bc815e436a1fa28657d36a15edd5303ea27b2ae7d0daafe16c03eebe103982264a180b997eba701d070c52b0d0c956909ed14b71cfcf79d971810c84f8850a27036a849ecbfb569378caecf5b0a5577388fdc63c9aadae55d5e4b5086f7e955ea6d040000000000000000000000003e045b53d7c3c238deb67464ef80740e927e295946d36710b6bac299779d636e0dcd10350dd05e0232a09c39bb6017dcc26306c3da117ac09870bee1323ae9b0bcb310e4216250fb2f3e945fb69c00307625bc54aed49582acf5c74b79603ab10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083c728af444d83eac5a637b47fdb90738f5e9746c314018b0d0613ee9c12cf12b6bce0625ba22b1fb42d7f5f6ffb9fda87c2476f821a9774fa02ac1a29a1e211abecc45901444cabdf037189d30f662d8334b207290e4af5893cef386f0b145b5a42c4218fc834b47112a0b166a6dff98c08d5eaf7e83f60e590fcc2b23efcf10304e5fd4735150db68a409939b207b878bae5ec901da720ab8f9b651397e30a920326e266ca209d9ecdf132e5406fd64e5d1b87296380b4361cd9c795e2b6517e120b06ad529c803d01cb1e3c749a0fc5dc1203f9bebe3185469cb87aaa32b012f26480401b3d781409e1c3aef3bc173e27bec9700f642f7d5467aea340233bd89801030e52b806d6a5dd8ee461640139508d3cd3a6c94713cd6452af7f947ca734aa36021c7f644641a8c807677c3210163cbcdfb7e8fd97bd74cc9674150070237b2efb022b7905cef222ca63bac2ad6632605d3df6d2cb438d73a243889bbc30d5cb4a16022e4f617427c185cf9e82c9a0d4dba42561d5ee7b12bc4048216661ff4a2128650220d0a6b7dc0496f8bd2d0d3700551730ecd6fd1d2dd10478aaad941d9c26528066ad2628e329912e0162cc157f468ccdcf41032476ae5c06d5cfd00159493b2e5e7a2f018515b34b1618aa64f2730243106945965a715b7b3b3844dd702281282350309b73c6efe70812b9609402122525546721e30793ca5b6fbac9c7b6bd237971b363f70d1f4cf08c57c9e194001bc04019dc9e49256c41404ce8a110d057866da28354ff7c8a380f32ab0555566dbd89a11db52c03ee46e0ab445ba61f3ac322182e9eab5d71dfde338e43c1721ee1ca849345e80244d15fd0a57c13bdae2332c77704069f3078ba05def37717b4563d25434074465e6905aae7e5326ca1a4ee06f8c10b424914ba7569da952afb17145561527e209e8e3d30e15924a9cdf93e6fc39a0ac516bd724dc7ddd7fedccdf639e8acbf4d4eaee55e311c554c272ed14340b9b5eb6f8196edf597bc41134f879e5747df95a2b81775ff2a3757a299e925c4c4f23d0bfaef5b994e7eeef78dcf14908f4b1b53eab8aee06e46808c88d09a2a15d3d1330522e9c87bdc358b953c267dac08b2459438137db7046269e21b29ee096730e62b74a86d02286c1e9b076ee303e98dc8a2227bf7743177ecd04fe7eeeada2d858b221a8b83f8cae1ce683dd9dc5633f1360c392198dcebc9361f9eca9f9ef2ae2ae2f833d8ac80457515734883a00af829486f1a500bbc1ae28a355dca9347a5076a1706bf0b5bb86fad59c407e6be57d4d54aadfbddfcf2fd64a35038b6f209e68730c982b108cbecdfe5ce1aef21cf8d7e95ec7516464258fcea7c8aabb2e775194e2aff515fcd404c54b6a4a284142b4b32d1aa0ae2efead9339e8c5a98e28a64cc5e2192527f1787123c6ec9ffcfb080999a5ad47075e4696a26f86485aba1f18bdc97bbbfa8a85ef413e0bf6c19a4d3a692c49f6a6651b6b6ddf4225dab5acd2a78a602836928f7897a5e742a1d50ce73eb2c839024adbe0b76b4c320dc586ac43e001c738e0bbc53cd4419f2841a2211a5f9fcfa3f6a26a5849dc99439cf9c225c09e19f19f4f5614ecc4c42eeb5a207526287f6d942bd32b7e0166b5aa2beda37fdf016bac5b0cc2b8f02a66431a4a7817e60d873218784d36545ddd5dc88f16039d0724cb6134bb26789e3161d66e84b5f4dd0c5f4d4788f536e90b568d5ba5869e81c67ebfe975a1ed7753745af32c6467aae083b34e94d1506ebfc859f6b6e42b8e2e30f561d4158e23dbb79d7b181634922e11defcc56926d4d09680a86dbb5df20c5181a54be111498b1ede465c3c1adbd45dfc660a03fc789123cdff2419f16dcec78ceaf0a521b7a93eb201e196197fdc86d47025ef6204a18f4b6bbf32d875796135465b8e42d93153a3fbbbc89564b288faa894b4035ab7861e11b5272800fa7697e6cdc70a71c5c4dd1451ae8f28d47ba9f44ffc04694971c99f85766327a09d9b0d263bd39af7ae59bd585106859744aeee94384b09400cc9e63aa98394a0ea6ba82bf8cfabd2257424f5a01521aa911d6da3bfb64a321ae7d732ec0d881c4a721eb8353f18dec4dd8fa9e4f2465090a89c50e321b903148096fb9df66c288654bb1b89a9a0c0280508a4f0b439b3e14a73b962211e476aeeca9f79fd8fc82a54fed32e966904f6a963e4c1f79ff68109ebe2b17b51f6951e4b68aff16fca8afbc4f755db688b991312bde2d9b5189b170d3ab50d4f28f1d5482879b13f1a815fb0000000000000000b926a60200000000430d1baa3ec5f110cf0066e3f59c99893ae1dae6da3797c196e7eb1b2c1190e65149a7d75a362e6c0f24b4689adc5b3fc9cb9c004c592029ec22a2d0039d5b2f977570e07b9471e18528a08cefbff69338d0b6e4de04c10ec81b638ec48c107300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000411cd6cd1486323069d3db7a559dd99faeb3a2a23e9b24c4debcf1c343619a9a30f92d5807a5c356c6bcf11aca46405789cccd0f787af0967152d98006be760c5da9fbd0e2e4a9371e66870c5367071773e90b31c051b66c6d8aa88a6e9659b1012b47f7ab0e137b0a3a5d7f72bd07ecddd4bc9d0112f9926262d0ee82d5ed93031ae9ddd35e697871cad0d80c6fe219a68d0754d53e2035808e35738062d59a09021521b4aa1974422f306a67a5b65e8935d3ae72559369b92930fc1fd67039b1a50b0831e4f1c0e273965faf5767b3ca6c0c33ffaa46555033006237c65062d8841569f03004b1176460a18dc045270d4eb87456591f707dcde63458a038a7f4d0020222dafaa2358cf58d88c6859ee2c235e18231396c9e5f34ff61a6b360578f90be0203352648c6714dedc8e0080f122c6e0e9d161a78838e9b411f2d68d4e898074f0321a50d5ca8322e6843d4ba5ba6e12590214c25e0ca42f56a93508ab1e24874b3030f7bbc0b89f2be396ce528343123aadbd4a4705e9c9a7029dd9d38256bfd80d50225f7b3bd79ef583163257732dfedf33410972a73da27ee308866037b1efbfd81da84b1e886fa2d91536dab7dea51377ff929d5224c2d9daa081881c3cdbe3d0888bc7b22b64c48fa75c450a9de20f89f57ba02e7186aabfdfac4acdf9dc8647e0e7fbede67983368c0b23e43e3501deb75cf5ef9ca06e9559e2b8d0c09012b95687d5df5a161d22f61768a0b87c038aa3e482219eae44113bc879d40e8df20b4e781bfccde3716f206ba96b71947f31ed5f8dbfc631d05c26c7292da5d9025b85c49d33b818d04e4740b142a7e94b35f4747603e96efaa0d48b92c5dea6e692ef3bff3405ed2bcfd22814e6bac8f6c5f7d311ebff9e7d88ffd2ece9ba509572e561f003c88fb9df61f02fb8b99af8f42b909f794f9195265e09fca85dbb9afbc61c11e9a6eef2dd793a40c102b2d4bd87fbcb2201ec43b5e0f1aa47b8c1f976f5992447daa7ebfa63fd1567068eb169292ce82ff687ebc3f943c644f41798f5d1242296f2fc9e2fc47f8a713a907a10a922c4473a52ab09c54a173f2d05b99b6ecb6eafc9221deee3025bc9dc0220063596168bfc1a7fd890dd73300b1ef3df3eaf805d0b6084cef7191516a1dba8ade1c3878e622a9e314264aeb40bbb07be18d902078ab2bdc0d94e5c5fba96c2a19b5d47612e3ef8acfc677977dc6572c25300b58c4a9966bdf8c47f5dafe3201586e498a64046b6c37ec688108777b1191c0e384bf57b594bf9b14e739b3cc655b1b636a465d6d0b42d3974a9b5454e748b766f65ba13e09bf3ac2cdfa12cb797b852a2812774794224da158e4ba222ebfb4eaf7858a1973ffb72deb98bacbdafb336d360c09883cc8c268a21a8c35ae42cb37debc43875ccd6e3da73ee0a6bea61b30585b8cd4826463a7e36e23fa79f8dab5a7cda419cfdf1136e82417f9d2904db6badda614f56fbf7f5d1591962b20a11c64fa43c942b4c1dcb6c66989fccfb10b2e94d631c9d9df4853b2c724ae50f20fcaaf44b4cf417f1946906e370794a090cfe0aa68abb173721101fc71bd38914cbb278ab05aeb2d4c86df7b1378941749a3550dbe8e5c96660e15a5a98b66f04af9b906840caa8ec673d5525b86e0bb72072e8a8b6621007ea28043a72b5e32b980833c4a4492c08e39f3be8cba303d6bafc4e49374f2868216df8ea444f22ab2f6ac5872b01f9e997d14a3fceee0d62318d9ff3e35daa4e9a6323675409096fcf62c8d2c8d1b45492ecbcd134fd159a79caaa6d1b563200f796190b1f2e9ab846adb40d33d5ea31533990eef576d61aa39311f391883d583a5b939f2a1e64192c0fe5e7c953c26e6248ed92d5f3f9440158a1a98ec091247954105929db3373f69189d8eee9f55790762333d8076c1b1d69bb1c4dc2a428dfcdac1b59cc4595d7b543dba01adb519e30bb8dfaa1d019d0b04401c6bd269c96215529b642be34061c5a57273b3aeee580cce5d279533e945b03cbd43f955ef45cf56d04610bece4a188b8b1d416f65b085b58407e500cb2bda5df6824c16b50c04ed212cb2341f4a9180204b20783c2e01d597fc1b6c5c71d35e81c97690599d6cdc349b6ccf6bbce0c01e6b3964110c25b85f4168820c5b21ceb17fa22ee341821bc147785c9a577929acc757d53f5ae3f7dfe78ffe0b439d74b0ebf4928aae0e9c025cb70a887319b169ad545fb1ddd779e010692a78c10b2e172faca0a774d4efbb4b659173fdb671d42dc7b7788f9148de62a58e43814e0b8485788f7f1507bf11e58631786b647e719049e4bdf6c00a9b6a646b6edc86abf9e73b8b63fb90cf25c67cfe56a54a525b794dc46417c3e561b392fb9aa06d64554c90836d64964a5c812c647dad7d2ae3a24d7a9cff83965713424c0e", "6a52526a00", 1, -1462065816, 0, "8f88b1cf561f5bdeb05408f7b54e45ce91283b9525aba919d35c899d5f43d3b2"], + ["e40a517f0132334c42f3dbb977527ee0f2189e2236ee3550fe5e2b35ad39cd4c996cc8f0670000000007636551ac636300738819b304f28ebd0500000000076352516a5351008ddc7702000000000763ac63005153ac93d62f04000000000963006a00ac00535365f4fb1d000000000006536aac00ac6a0000000000", "6553636aacac6a", 0, -332937932, 1537743641, "772445e3be2b6e48648881b5739570031601c99f21362aff73699071e59d0228"], + ["030000807082c40302de406aecb97242cd75ae0d0408b13b351c83a5784b50f6e06c679668fd3c2b27010000000152ffffffff5b3a845603acba7f1db429079229b2ee2ac9f03fe3f1c826ead70da99c2e0285010000000653ac515351524bcd471904acdbb701000000000400005263f8955c05000000000365acac4803570300000000036a00ac5c6348030000000002005300000000a8403d78010000000000000000c88a5a040000000001fadbe2aa01c8a8597177136833d3c4df62ade77352104491bdea594195d238f4227a1630e87c39d07328dbe69ddc77d51d51e9cb2c04efac7cb425aa8a2a7495f62431fbb78a37c548ac7cb27a369060126e6f03cc25c04a7d54f0515f8d05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e4dd9207f76d3adc4113caf9c39d314332a63de9bbba625aca0a445b4dd2feeeafa7dbb6c6457c606cf20f31dc37612b0f08283d19646ed25fed4fa967a4a36302c79b90a84090671a808244884522b6ff2ba088945bbd2fa833170f15b47ee03d41ea2732febd65ed8a1161f3ba480cd5480e60499b094a5f6aa435c214e1f033014c6bc6c67c72b827b1bf437d8f8d50f9206425903a94574288d5bb3c722d4032118fc2f89848de615c03a41dd3cb70626fe8c7e1f5a375b178c0ba8927928040a077892221e2442d0403201aa6da53a8cafed1377d4db4f049ba6f7a5fae9404799f3eac3757bea064c3b4b3312a1bde7b8c24651e4280596a357e09a2b35620b0228d51947d4f402955c2223bb45c112e31f9bc4ccdf9d67eb0cb915cfa4b2c9ce032a26cae565b672b026df772375cae842f56850be63063505bb491e81d6d85a49032972e7f8ca18f58ff4230104e9b7eab82545324eb4ea3640775774789621f2f80323d41b95b484caf2efdacbbe3655cc49791e0d140cf3d7adc3adf2182ff9562d020917d4d1a20453010321b27383190f8316ea39f6480035df29ebb3a30484534fb579ceace1169ca6aac283c3a509d952d53db6d502c938455b8800a4fb8bb6976032c82243e259ca59774fa3c6f014ac6c6b9207d79dfb7bfc7fe0ced17ee65ba882580168590fa42662c52e0220bb9a519c7caa39765d2133015087e0964320f3e943d09b44a66e5b86002774d5a97d966a2a11301ca4e05b39c74c1897a3d49970a58a7e1d7bbf33d499a7f21709fa84615b8db9a4b916dad7d17e29613f4b0bebff5187655957761319575e39cadc91c95f4585d3135a627467f80949d50431e47ad887af139363ffe2ac384e44f28619e7c285655cf5d7cab044d308b05a37cec05e7fa264c0df1ad12fb084e4ecfac829a3689764cf363567b8ae3a7cd37ad19e6f715f9617a2b9778d817ceaaa1f80b77ac9ce1061f7c9d62d811f6887419a8aba6d253a1269c7ab489d8ab3a962e747cd219cb7b8ee7d3c56d631bfdb3b238eaae81f90d38d34befb7547e7e0992c4a40e9799188aa18d5c2959a26016dce75109140c0b6649d3e896d627e698b4821b677a6eb77107b508f009a9465667b03140d2fa35aa4d6ff50a2a9ce4949c82f3b5c67d698bd05a06166444f81342ceddeb32cb84fc040e97b8321d4d12faec6cc47c9bff12fdad264da7c908df172d166bc450d86204af3fdef8ae1c59b6988621170b1da2d2f863f5f4ed9e71934cb7d233afcaa3dd028b82c6aa9c8d5f0e471f9813a7a971ae1d2ac583f104d358afde48620314cd8c346e0f5863a13ccc766eb0e16435c13f466facfc2dd702db6b8edec6bc52f1a317c6aa7c4578c2cfa204c61ae0101ecf670cb2ccf052da660a5ddbc1b600961b5738c0c0d99ffd3d4f37fb0584c3f2c2e165d41ae077abd2262e19eaea4fbc45b1c4441fe63186f1b1616d5e73399b1699b7dd56061cdd59501116b20dbf62f5654e9246be8040bcbb8e5fa109c6090140b8d76fd2f0355104dae5406d8875e1e8833a2a0cd960c554867e72afb03f51a3a76fd35bb2759086223b8b74b1061cd310706da02605ba8dfb69e04a29e898a736769c6f41e9c6ca6daf2e7dd9603b520d0498c8a17a593495da897ef6eaa06514f588a484033681450e7da9d5e0ed7b2a0cca609776073272e72cbf9e19ba9b7495a3d313c23b81204faa7b41ccf31a9305768ff58acf5cbdecfda5a03518d5e804d9c3ac5087ee18c35dcd5eaae254e10cabc3ed1a5e901ba1ab82df97a7b3f6060ad3e8fa4ae849af597a7e482d14ada168ffea7a8344254acfc81b071863661ff5fc3d5fafdb0c9f25213484e85beebaea0cff6f2789f20e72f1ce944a68e869014367bf2d13b739cd9322cb85d245efd3a6a2121fc7e1963562fe32d0d86c9d9371be025ca424212c0ff565e7d24f5af45f0c2a706197fb9b7ef0b5a4b9df1ba74e956b4b61748bedfbb50547a0840a61801183eb81324cda3091a18e39e2c96f71b33451c23ecc14a471e5098d0ded298b51eca79709e974958d774dcada634a7196ee2d8eb4ed1167da02dab9b25697c322efb6af455e84f3df0ed161f700b4a99a8d1f9fef1f81c4092ea85971a288b100dd37a7e49cbb7eb95d20db23342488666841b3c6a4f0772ae6a7afea38e33aee6c7fa545deb34f0be46fc268818d481a2a4ddf5763bf1b2804479f8074954c54fb5ed63c4014ca995890110b23b93c9b706d6567cffd72b512713dc6940778a2773bf7704ce365f73274e81f8b03ddc2f53e0812f64ad82eeec7cfbe30a5bbd7349ef420dd0d89c5a28f181b7731d19336c7967c094df77dff58cd6b6b2a70147334e6fb9adc44fc9af40ae5ad21ad5887d98786ae5facf48033dd99c6b5599cf01", "53", 1, 764638258, 0, "69bb8f7dcbe3a0d5ea01b24a01254eb62557e8d706d52ee3bb7b17551959a0f0"], + ["f697f05d017fa612f56f7c8c0eead46e6db8e511d4e97cb69a174f55e3fd7df1feb253c7e000000000085200636563635351ffffffff017044d70100000000060000006a6a520000000000", "00520051510000", 0, 1837266794, 1537743641, "6d159f9a8942ff230207ed3718a60c554ddf96aa57e6e5e2b5cd4170f944169d"], + ["030000807082c4030250affbdab0ff6aa3c3b0264461e24af180891feb7a4fc4a2f167cba8493a3f68000000000752006a52516a63ffffffff3a9b1108be3d0eb0a1a9f0b3e1912b8af1d2d6855107953a77243e3a97ef834a010000000663535153ac00a178f841046a17fd02000000000038eb620300000000040052006309daaa05000000000651525353636af7cb900000000000050052ac650000000000000000000352244a0500000000000000000000000011ededac36134169d441d0ba40972e465ddb1961d9dd4e1c4d85446c3bba1f3f532120ff40409ab616be6327cd7927758db06f55e3449e54a3604f361be62821c44dee4370bdf479c6b6a397ce9fa8b37b7042b239fbebe9a0d7adfd8bd667840000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055057d602729421d781ac5bf5cdfae41b30c78012233c9f7c95f7a21405c2f227258de3608cae9cf3644740806b5d78b3bbedc589103f40c896d12cecf0d9a299e055e22ec7993ee7aef75b5a762bad287ba6789b8e5b663a2d3d9a5eace13fb1bbfbc70ddeb77c7ce3eca9fba989597aad6b33c217dbbc39a1b6697923747970207b442ee433bfd13cc484bffea80d771e906d7f04db45d18d217dde16fa228150220c05170707e5827c608e95bfb3d3afe93c4f58891dc82b999136d0ebbf2093e0a022fd07745881491bb29125b0550fccb8f740c6c87b2570f3099172c18134f4053d3f29d021d12e078986afd930712308b2d887fc9753d07f83fca88e9a0047e021b30f3041ccb4a36ed7cca652c5c9a0cf1748f49caae3b3b8d851e8200ac70da020336190b6247806d4a822b46a6ceb86d3ad672e043dc2f02f8a89acac0ed515b032b4b1d2b82a24f1ccac5118925e41862def539cb2bc78fe1016d2f0c1cecf6550222744d7c16bfa573345a06bfcad2bff3131d14293e6e24f92bf7dbf8b0bdbeac031a28c76bfc0b682db3cf865d034b47cab641b00814f99f8c31a8eebb9ef9485b03b1c47cc7f65491b97991b28dd1722d20a64c0a48f30cc3ab3362ee1158a0d19bfb3cfadf386bfbee94131b46f86cdd96130c86c1293cdd7c3a5e2cb7086a333c7b23bd50533b2ef654d4f4388a37b2dd8278f7a8694b3ff086a9070b0c019e84ecb67d8dcb2ca07c06e1f199656770a63023eed30de054f7a09b88176f5bc485b0ee9f141cfd476717fda41cf20e5bba3d7f80fe8741df4ee6dbae9c225ababe02f8f543dac6eb3e7a1708064120f01ac0dec4a0b74ce2fc5ce868c7796ca5fe60418ef170e8f755dda9f14391e7bdf1d37da0c00af94c9b3eab75dee0d5b45d080d2a02995bc4c14e2298a523175e573bb103b8461e1183f7003feea0cc154a243e43aecdaaa1a1623101f5d49fd2a91d2ccff031ecc625e687ae1c39d1d04145fb4987feb058ca3f92dc5f4811ddb86fc32f7c4dfd59935ad42b890dd9037aaf2aee1fa4c018af84877103ca106dc63d0ecba240edb291030dbfd1a7ecb4176b038e83ac9d194aebab8c34add0adc8fb0c780d697d9d286df701b7a13162222e0f36b83b0cbc6a100648092af63879ee95847cd8b35dab9869cb7b6bde244a07f567ae1437595b03344d2b6f1aa0592358a7d4a3d2e2d6a56465ed030291a7bbd27cb935c5c46490c1b2b4e728bfd9b9bf3949e3db269897960e5e62e50d1eaad1bcffe1dee5c6dbb9b7dad8adb1a79d16a8d7951b14fcab20b4f149f7e8bd5f21cabcd876f52777ede1ef1e4cafa3f5b911900117100fe8f342f9d5bd77050f2cd4d2a561c01aefb0f33c402ff329e9debb647877af1691ed27695a2dd3857321fb822a8019c6fa1de0cbe2c66b7677e06c01beaebcae5296cc35014d6de183f21c1979f358b7931ec9a229ae5617876e48af31c6bfcc8dac57e1783e2e3b36fdaad98b0341fad00c6e0a2772f095c155ef9c5d01e1e7696e2306511468f84de3a0745dec7bbb8597cd6ae898f98b383c46eaa2c4c561796212bd3a23e5ee761cbd19a6068051bf250f7049e7560e2ac98fb4b2d57ae0e8e77b08ddfb421c93845fe79652345c5e02b940dcdd6fc76139286370a334d36659834f44a3e26c7eff1b9aa95c496194731fbf17ae6cfe1fcb0d574eb5849da115ce7e543495b985c0b3b987e67f4242fa90a24ed666fea79e5404befa449fb79f301d0581afc15f44bec7359b832a87fffbcd74985e833d00e41adb3b379d87e9e8cbfdfd5742038b7a07403c45756ffe2dbb2347079c81a11e1e0e9a20672597f333e4f9ea91687a17012d27960d885e73904c7705b06e32d75fcb7c89290823d9a3a8adf1c5f08cb5eff789db222a5af0558cdc505a3e4711bc2f267724a2166367af7b8a7ef71a500e9bf5a22808adaf51a5a47e4b751f0d7d1f7ab5cee89e9eb455d46123675cfe036c16088fe36dc8393ef809998b5bed5d50a9c2848241bb6df49793a60c2fbae1e592cbe79bf847f47fd913f41bead3c9985580d932c23e0fe8965037f98a55b63c228f8bcd0df01ebfcfc61937b19dd6608c682ba0c81137268204427499c5ca607bbcf9e122a334284aed708a3c494aa9d856177cdb2b6c6e64467e9b88f39a2df84e2ee8804bca2038c4907ffa9f4c858e44ec119b38cf46f9c153d27484391d18774877213dc0dfbfc3ee4662984b6688239404973bf7140fc7faa493498fb9b446815706a4705117329e520000000000000000601a6a04000000008c7bbceedc88e4b5c0654f15d093c6c323cd77fd60b06daf08253051903bf37f139dbaea51f85c8d3626fc78773775e60a7d6b2875f914abded43d003183671528ec3f8fe2564a662260dda0641b43df44f81b5a834fced4e19d5e704f0de0820000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072cb6c8f0253efb0064c8c3c9d899c306f89df1e53523ab4851645a9da85fec1d5e9e98b8e8e50bd31ebfbccf0befb39983a007c335b912a383747b34b13b20b0e6f1d3d91c93533c9bac8775d9eee9fb5685308df7c2a8ddecafb98f9d295d7de0a9e23bcf27c47510962f27e094ea75cc07d9c2eac85c0da064586fc40a76703112ac74ef99cc958f5efa4a5a6ee7e2faba58d856b88dfcdbd8fb6dd6246ab5d020417ca46cacf89aa285d02c6eff7a21da4b4491878af5ee7a3a851643be06c530b04732588fbeeb15cce4b97a9886b7c6ae81bae302d557fbd4857eea374a53f371f46fa03f4ffeaf9c3489156505b513b19dfbb72a277990cbc3d58e49e67d49602274ee941701c61a31ae84f3804e549f076a1729e19abe50e85cf19173539e297021a8648b314393f13b2e64e2e6db459b11f63f1e03920725252339da851e53375030c18d588148254d423ea37a61792375e0b811fa00c47e53155439032efe909f4031381d22f0c27fe71c1abce82d400bb5f39b4812bdd82410c48f445a037f4c2c70210e32196bc2368cbf4ba5ec4abb0fccb276af1d13be67c417086cc4868d5157bfa0e9e1b06ab2fe5b0bb5108567b2fc91f407f2847814910d2a86a2ee23f2ccd9a49310d6481f1a977bbcb9e46394b836c1f6505aaab3b67535a4f2264467ff4bd99ea6a04452a34757b99a6de500be61a880099361fac1de25cc5a991329aab754e25a9165c956d1c2b76d2b7155ce50f42143f0380ab4dc9668a2428909a73d71770542fdbcbd9f094bfc18d259d41855cc45ce4498e4eef54873dce2de21bab8b54b4721197dcd97fdbee5f17e82fb9efcd5c32c24915fab80d2d908b57624ca05aea863ab0bc2b980884a40a427429b4aed5392b28147c1c1fa0c54c1e13a24a72e35cc5089711b3b1403923f24c80b1c832b6052c9058474dc22906bb24888fe461a1152150d1ca998cb9d3228c885e6e00bf57a740bf86d52abf68ab0e80ab9791c1b98da269d04ddb1ed127f24cc619235551f9a14c5515ac3073324cfd2152f615ef0501d45fcfd2fa3edb39787a83818fa5bbc5bd4938f2b23370ca73fd18079df5d2c8c0e96f1781c6bd53adc1632985fc98efa8457ac431ed696e7a568faf8795cd881da4f962198e53edbb60333cfc4a02462171e49c6df3da4df875f8b42e520034e8cf7aad8d385648b4b5a195988cab733efd76e6e3ba5f067e1f8e39185aea1ecd1b0f6a56b74469772b1023932125c983b84c8ce48c1003c75cf59594647947192a91c45ba951b7c0e66ce875629b02b8e1316c3f7369edf61f6b397f87e1a219d65d711df0b7047a2829fb257860ed2b4ffc9e3c00545f9a23d772efed2cfbf1810abfba1e4c3e3c896586ae5be095dff70b1ed9432ec5997c3da344d837bdc31e361bdbc7623f425435ba297fc86d000418aaecaca3cb73d30fec1504cd1029197ef122407cc508bab6105c302ead193b49c05bc9f6ace6b5debdfe1f25e5d2056230dbcc63f41450ad687e0470df023c6b0280b0ae7b6ad05cb39bec244a25b5ef70eb1d694ee95525208ed0dccc4b3287aa4596b06d650068bdd4108e1c3625ac3412d6d691dfcd16563fa4fa0359952ba10b0e709da037729d8fd53cf1b9ba8b166ac64da6ec8fef1c5e94b243fa55b8e23e5cca5bd618fc90022290bae5da3acfff06ceccbd8000dee28b09c83e9489796042231a38421a7964464ba7c77a47c078021d04c25f0ed737ca019230a7095c0e1dc94a9bf13f508631703d249064c3b181b614b76b136b9731384605bf1422dde58d77e4c3ad0bd1b3cff168d1995671b4effcb6f344c0fb467d052fe232b44c169875d3677d7fd1ae2195ef65c26d3d70e3475154307398966760909436a9443a61179e44ff6f37fbe421fe152d446a51e61ed4a10add50ddbd3262afbdceeef742291a1da48790dd9a882829b08dd6c7762fff7a72d38ad6095234ab7eb3c7f96ad95bdc0dda253cd922f86aded741818764df2674fd7d4c0908e505360d61238b17d081304d6acaf3ac14160328fa7dd24291473922d35b258ebe44ccc6c43448e59d099a49ba0642f7f7c2526b1542424b0f1b2fa8eb45a26ec8b83a30ddbdc62851ffb9b3415bc30fef276d10d7b381ba1284147d0afbda40f46b575c5def525586d27cf0df30a9c4e50f577ff6ab753cc929ac96ff4b84ea46f7caead6ce33e26618c7934aae33242768b757eca62136a3b86df8510d9cb0d22466ef44347898ae90a31fda12a721b55c93d7c7298045470a7fcf6603000000000000000000000000096c41e992b37ac44cb8b1cb34f3ef6e0ed7c6ab61082d1223e07a8dbc939df5cf81cac775fcce57996ea326e5b7ca0f00402cda14ae6816dd17c0e601ad0150ece14c57db685213615854954d8bc281c632523def7793e74cff54708cff912f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b06bc33ac33214896d8e018c1b4db3f4d64e7254c33f7e1cb757c979473f388b5a472017a2bcab904ceb297cd232baa7ae2b93710d07c87c9022842845f8f6dc3ba2ff054967d1e914395be79107ab1f95d4545a3650e249fb564f399dffd36ee236c9d54dd714945ddc5e7b61fe80c28c28ff442d4b6329e36793e6bfa3991032d90549a1e8d058929876ab059cb6c4f78f1d691481c84ca11798b44daacd1e80301b07a4f3c83c8db75a4bc435a0a79a0297c81a440ada3c3e1e748b518f485350b03f46cac43ac48c15a407c3827cd8460a37d1da29d7fad5fdd2a68ec800b3ce3a375ebecad18db81a913e02500dbeb41e99b5e3cac5ef45a1607ecb926dfc476030450ee643c93791b252acc87071f19244f287de724d2ff8fef21db88efa02e78021aa4c0d8d9de18c6728f0b6c06ba65230039efd890c6c74d7df4cabe3ed28769022ed50ef1ff06d662bfd1bba56925b716b4baa77a66593114645c0c0322d9170f022f77bc7ca3a31c38a827226dbc731db0aeb28d76ce1b9d4b0e1ae093481bfb54032aaa4f4d85cbadd1dfb166c67f6e2d1a59fa1ffdd4bd08a60fa0d27cd784c4f84cd486a076a0f0908eb86966f76f628b8c63fbe82aac86239a71fb870c40e53f8d8e632a351810832347e1c702347429ab36e3f9fd90ee237d0d7dd96f5ba0be2fbfe587655fb8700203be328c9833e07c1d437992d760ac6e8a89123f818b0db9cd28894f5b506f914a32153cfef90c5e3598e54006629de39386b4c8e3963b1516e44dbe405bd3790f00d1dd96d3b84f5571872925bcad59846f472b40522e6ff38287e15a4e5617dba37380f1727f2e251221b780c7d65ef30d38ed0ac5dc6d4860e7774d884106e8c33b957c8436b350c75008bb7a672fe021ea86481f290b07e3ec0213baa3fd36d8fcb7291de7e837d6bad5a79e9159eb89bc03c1a2eca04411b8eb794c123c63fd063c7bb48c7b9fcbf8ec13e7d20c47f270ca0f478040dbfb0160afd9d1bc01c1114fcf85f0a07438d002ecdbccc4d50afdc46fd91bc68b3b00535e81fc6dba6ab2af96927c424c5839e1975584c87962955fb1ac096dc7c59ec1b924578e8c25ceddcb59fa138447693cc8b21643630fef37751120e0caf920c689342df4a4e8071ab92bfe9fff4cd934dbc718cf66f21e4af68d6fd7af1ed5e513696301805de107111d87a0acfe2b6ab9b130a1b942bffaac7a2f7073d201ace379930d623c8560443ddb327c6af3e9f3741a10eba345019fe14ddbd9774bd58249eef57e6e42013b5b5eab92167b0d39062e33127e6464d733926d1c0538fd4061a6376e2433d8e8e705d2dcf9a00f77702e100dbda91dbab136b5eff542a6d41c457569923f164f60ab24bde4dcbba2155cce2d2b56af6a4ad8f9c59c4b451b319e5539859baa65c6d870d8acce0bc73358aaafdccbe27ba29dbe833abb840d33d87e344939a68c47137ee88a7b155a7a8bb8917e5005fef444a5c278768e39e3758e30a9c815ea1f26d0b67f662f004b199a31621b3ad25d4b1d1c77cd0fec9ac0bd47d992989da0b0c64690fda765f9dc7c64848dbc36fd091eb825c2480149e5c575c882704bede12ba40bd89984e47fb060c5440b863c6c3eae34ce07e3b464c3df8f4d9eb5c502b091b1fdafe0c6c1f15e5cfd6008bb0bdb7807882ea0cb3cf6b037c7597f6eef22f00bc2337dee366cdf1a6e56c44927279a3edf30429e389d27eff4a148ede963a421ee1707f522b56d003280ef3e5a11857fda140842679b53936ec7143533626c83a1cbd07e3953b7e62fbcffbe7ef66dc8d0c9ab8c75c559f9715da66c6df515fc0efb64c9b6c7d293bbe78f51e2c2b746116be43658fb4d5aa5ef03af1c978d8c0603479cf087bc1371fb013472b3993e157a9d80c807dfa4dbe0957bb7b33c04040a8e54014750be7883b2c054b271d2c12c2b6c3ad4919e051f182dafa84efd1c7f44345934d3295d627d516d3fc972c2f52b4fea11238a1c47a1ae6271fce47998ad178d87d327dbfa73f95aed92ba881328e4eb464dc4fadf6ea6726dd5e1c7a608c55e5b0bbcb6632c9a92bfbfd78f86d95a8d6cad249134ce7caeaccdfb7a4f722cd1e8bbc92bbe8e19b595ef3632f33d0dc99d969902f2b1792a5e45332f87a55d38865a2c9585a8f55321bbd07e098918df4e4152ff811595b7d5b0af0e736509936ecfe42e74494d205798ad7b76f2d09b79b3910b9681d584dbab1cbe88736a2511eff25ec2da97c7705bf9859babc5b93a7aa235cc5060ce29c8457abeee3028d10de5efca909ef3be0ed05dbd1e2c426f7006676fea06b2b0fd5e731db8097d22139e8cf3fb79b22380d94374034a223147fd999669cd5d6558451c3d9ea437f4d8e9ac70d0774792dc667b43c00663093f28523545670cfd08", "5363acac65006a", 0, 1134508940, 1537743641, "c86a565e4ec458487c8114a21c28ba00473ba7a7591d5b876e58c8b4fdbc55a6"], + ["585dbf0f02b374e1c5c41dd906f54007ec01d33db536475c46b98634a9080a3c1a13943545000000000953656563ac00006365ffffffff3d62446244e31f1e636b5f2ca9be27f3a5cc646ee17a014c9d369984a73033070300000008510051ac00516353ffffffff015ad95e0000000000090063635100ac00006a1ab9c26902000000000000000029c64e05000000005f2ae5ba47c1fb6df5ccba630f40c579d9613fd4e03878014dc89b5bbee621983d6d9e831fb05c00e5722d71f7eeed1b4520dfed3aa8836140fae812bc258302e4ac521ccf2b91fa7cb3a6c9b720cce682a1e708da0f167835dd373ef5f276a100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c678051ca646d7a19a8327666a5ef31ed76e08c54b4ac21622e4e35f4bd90b31328b925eb164b9007b0bc55be8325973d6ae836f7eeb90ac6fc4a0769750a73e88ca6e46ca13be18e20d46716507edcbbd10220772f18780686777f8de9d8b24e5d39b9d6ac416fae70bd44bcdf78e5b38436052b410d90b349e32a3773187dc03032adb222af0ac4d6986d46fcbdb25a1252cb0c090919fd2c64b88aad70292e5031002963e4c308497406eebe295b84be28a30208ac7dae548677bf733a0bd7e640b0082871815d13d5fa0863c6e3e27986334f4a156f2f3c29f216fe0151ae01d3bc414931170af6c4b284e7fbf5ba599dcbd11b9307993af9d82085d2f094726e303115e6c330eb983cd83d21e469db49752867bfcd2b2e49a9390d8f6d4bbc7ab58032460d4590e4d277a13bf8d4b28a5a969338ab1ab893b48e946c9f06517b82fda030d09a5f918b160d75924facfa37ffbcedede141dc41c1648e160687ff3c0658b02117bee42321cacfbb1df7d3f8902ca81bdf2f3651299302afc127ddf1c653e71021efcddef5c5ad1f1168912a65676211fc70cd0f2de0d542885f23a3cde5838310d5a78c5162f3d9579c7aec3b02146931f343cf1a51efbe5d7175bd4e878fccb7228ae8ef7debae995e6e39946efcd1698ab83194c61fa0dd26afc3a5cd21971c79dd8da92a3da7dea7ac601f60bd60136ab31645f2ecd9fcfaad5b60b1c83c13e3abbacf48a40d36474624d4d3140a3f976afa53e676e4bc839f2108a693f268193bf648d416634eb5e021d85dff2f3ba9d6f007abd9d6cb2239ee701aeefe0a1d7c509685bdff6c01a79e3a0a396c215949d6b7e01780170372f82cc4a46f5aec2c6480358a5512c18f4ad05f73938b877eaa03f02d389e9206a233e1a52480ab53eccd5f2fa1056fb1ebc711bdceb18ac58cddbae9f5e22a073339c2d2d334c8b5b027a28355f5c63080a0c938a1603e1bae50da03fcdeb15277e4343769694e6866e54bcbb6f43da10c1baee96d3cb8b084bf7a7c2d1163a72294595a1c86c541ea5df6808707ca8457ed9754fa3202d863736a2a8f13d43f95c97fc900725b47abc2db47e054853c4ede25d0455553e6325c7fc3f62a53a35289dba589a5abcbbf52e83cf60bb0d7ce4f6c4f1ad29e49f3bbe5c7d9bec90f5196030da0ae7d2f53012ee3da57a1e6211ba97ff628c99bdb970f4e4eef5e5d9876c7fc745eba80eaaa0ef0ebec9ad7d5843107d9010ce3b16ac6c4f7ec3bcfba69e837c1969684d11bf8a84e73f6daeebc04172a59774981e063a4d1f96c034f10e5a2530932e316dbabb094ef385d366adc6181af7796c968a5fa4219ad1973f85ce055a5ee61041a41cb6820df114a97376ddd674cddc2d16f58afc6180d297d57b1fa732b99e5a0287925417d1e0f5294a734aa18bc916a96bbbe546c9bbe396bc544df511f759199dd5eb35a6d142a9e6c020b5cc18742dc7de148a7e256b514187bcee7fda2b3f1f72a1f76bc781e8baa6c967a288fcd0dbfaf31b6cbdef85154d524f11a8f71f72d5324a03ee73a2e40addf8a1c2d0736b758892ebd85550c6c435c778683b8185d4b9679ca088feaede12cc420d333de5b496716d9757d39ec7766b32e075cae6c28d22a39775529dea89df549fdc4acb9024450bb0363568f886aeb0e0ada8d0bee4ec6778c09c11a41a37b4b7f679587b088ee60d9fcb3f6721f2101398f3a24642dce0d6eb644dcfacfd6acdf4b4649963a1b1c7d3305ea96f87f5d91a40492ab20306e8464eea669abaf954229cb9acd6a203ca1726a41ffd2006f64a8a6f82dbde57528e6213e4d367d9903e7d65832dcd5150d2e24d430dd4b03cf35f430309fddabef7223223825fce4d7070108cde61fb9cdb0fb03bdf5e5cd1194b668406a9a2042ac09f72215ebd7f534f350de1711e5a488c916e9587c8918e4402c7b6de7f877c6d5d328c73b9fbed972698118b15c8acd7a9ec126f09c4ea8c23929d415285cc61ebdf9f639777ec05e71de9b27f4e84e06f1cde546dacd142301508ebe4a72aa9efff4b6ee9992eb75b043855c37f2a6e636c4141572e8b00e71f26321a2d635f97ddcfe257f12020f9ebca4f0d61fe7f249c81c9c9e9b024344adffa6188d9e9499c94ade384a05c1644e0bc26f4840b5d599f7ed68211af6eb8852cd35c5be439925e2262b5f02df66bdfcf228c5707ef9d1d32bae49785b77379070a547887620f46551beb07219cc0adf1150ddc5d2f6c52559763906b6807ea7e34cdb62d1d2ae58aac37f11c03000000000000000000000000644769f7f3af64674efe9aa3f90d38b046179a06cb1b94a2e6c49b2fbb84712f1345687bff3a42b9505dc8565928fb47930bb5fed23b3f9cdf9b395f08777d739cf1940e57ed3e91b9ffa5d588336972fc7ad5765c7c7d88c61ba2695d8856c900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7866fe20718db6626767dcfd2677e797dd94b100b44b04d7338f52f90d21e6e40ec42d2618b89c75faa9fbce829da3c734003c4a59f21ddb749f64172ebeabf42a4e6e8e948315445114aa8c06b020154a1bc8cfd4921dd047036f56c409d6024c14aac6d1e17d0c5e7a49a3979529b42386e3c7b09238b8f9c88838c7a3a050306da82057474f31301cb61f3837751eb91988ec5998d48998bb1c9829d911e1c02159f03ad724602f6647dddc13db23d796402d9408804b61d5692d99268b6ff500b0890c98594d2fe6dfd03fbc0c036f23d639277d8ac59822db65692a3c30284b8cb54e9bd9b13e348a0b96d8f54e2c70e5b6b7649725c15cd8b868454d5a2dcc5022fc1c131e0265fafd765a7d9f52c5f7e5bdd2fd1a97da826c25d2c86f61da03a031920dcc33ca92b1a38084f5eea21c0355b7ab913fe649dc9f93998197012e16a022c28ec88250f4e6a0ffe3d7b0dd157177e04e6c3bd577d63c942bab4bc20c192022b007a8462eff8956021ec77bcda2f7e1d04dcacc55f30d28da72b2b0902700f021e8eb87b521da1c70a4e0941ac8860c85c80c99d02a96538d1d1b96ab076ecf070edcc288bd453d58fbc7954546452e30bc2604fd10e84c028639279f2f691dca5ce208c722f723b9fa3b9437597762888189dff10ba1ea2ec83544e4ca23502ada4bf4bff776e3d92ee529db9776cdc1fbe24f59ab11ad3193774dd72c30469825dcae5ca751059dd9f1480843c1c66d5c4159226d6eb559de8e0c92f17c1e65b1111bc72edfab48c9b24e3195a807f80d46336a1e895df7e2229ecfe213cb143a22d0b536414c7887ac5252d20f80389beb31490268b2f781b55433456fc15f3be908213a1852c82810dbf399e67da2857b25d29f715c41d85411e6855be5a47163882d0e13c4508abc8e5a92cde8e128dc6c1c4a056387b8a951f245970bb287a8dc55617be08c86f4c42ad42a10375f9ea68151d457b108e7bc548157d9934107ff9381c0f609d164cc4ba6c4cea99eb2cd6b7368daf377b743527e67f05321b14bfe4dbcad301f1eccc8d963402aa4829a5e4986d7a5d6f9a5149820c8119ce365c1f7129146c19001789d5bd83f58a51533ff7b7721b2a172c59796ad953b5a36d394b5a7bdb697b30b22527f14a22f25639d21e6b10987906778fb4dc59f441147abbf99574bab02b5c4ffe6c91610be127faa0d025f9b4fde4b1f20cb9fb51222eda38f318af5899c18240f0bc1cf1e4a33da5c705fbf3c224f70f8507b3cd5367718d05c9e019f465120e0e82a214fd43b7e3aa2340a2ec9b668462f97d6bf5007410bc56a52c122f3158120519d79a2ec0e5cbf70b71d480944e7365772ef839b9f834c7ca96d1a0fc3a1573d283cb078b8eefe042bf852b2d646d52e27667ee6df8d125e032752edf9cda8549266249e6473937a89295ec7fee41cdc940af2f8c395c362580ebe38f4c6d8c9ea0b5e5a1d6ab3a76e91ef55f5eef779473d18047c44a4c8f31b9cd3984be11d7b02f35e5c443d9f230134cc45a04a189aa4c415eb29593f9c43b81d0d990ccc11624ce3a12a897f2c071704ca1a9321e1e718ef22451be33cdb6446aba264c59504888f07db9a85e52780f9a35f932ca99c26f2e21f877f9e490a93e99f6e4404810b1660c0317abc54c3abfe8c3bdfa3cd68847aabae9dafdad395292fbf60bd67ee6e2e0b0b21930925f612bc18020d17bb6fcc88965eb1ed459622d1a692023c9426ff7d48131b1f30bb74fe42333f16a311c911e900c0de4a3ef681a667b0a592b0b96e9512ce028f12a322c6f2598c28da97cc3d1434f828077a616226a9ab71395597a94b37b967c51dc10faae95197f65d1d40bf41102cfc5a6c6b1039e23435bbe1afb8fb1c859e08dce57bf5aedcb01de99d873df07721d27777af19d11f8ee18c8e2a317d863c25d23e5e41b8a050ba7ed07d0fc1618a158df7899fb2cc4e0894a40f54e2d6abe8a24c3be25ec18020b108d97040ff8e45675e91c36d29961b2b36baf06181949b3c441e1e6036208deff50688de72e6656533a148ef94f5b3f6f66815f1c9bd532733553560da2dff5954b7557fac88afa217926c9215653697819a5c9e3b5101baf989ada1bed0b483ae4d00d9849675a72d99b15ecb9492b71d0bf9e52ab88aaebc57fbf2ee3c6bbbd1b16b8b3912fca00509aec8b5fbc343741e63528993052011cf587a3f3ad4c7ac264b569efc4068eb35dcb357773d5079b77f21d7859dc0005d210baadcc9c4f504cec51b202ce39ea5b2bc5e0a94fae6f018c4fa3bd52f788566f4b99e527d717bff7d412930612fd12738db8144268e96122330b67bd6cd8ac18264d1efcb03fda5c0280036cfed2c68648e62cd8490201d74fa6269525b2e622921d5f250ee61bac66026a0a5f3a0d", "ac5153", 0, -1139268744, 1537743641, "cad766ae30a5100ca056876bd4c5920709c4ffef8a2fb74a0338b03b07ec14a7"], + ["a8b4e7090216a3342a6083093513ca87d71a894f17df1475975f1de165c5e58f257a18bf6c0000000008526551636a635163ffffffff6fbfcc4c231d34b57ae621de6a87d5554ae9ead8be6d5543ad0db55abe065a6300000000065251ac6552ac1ddbc63301b1b2d001000000000563536aac65cd386b1d020000000000000000e8b05b0000000000d80926812c8acdc480494dcaefa9dea9767758b7f87100486f053d9e885875b55c7d4efc60f28c99aec626c2979ba1d22e77cb57cf12166a85f1c17fe25e67aac61930a9edac6690f6c71f516235af473ef77da32a236118fb20ed029243f0cf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063304edf84a36fe4d8d4c4a2b167b61b0ba08f16b633107559ebbc47c065e4035cf613be2f4bcbdafdbfe76dd913788eefb4b90f8a19fd835682a214e9c4914e56c79f6f79768e8e1c072cb1e6986199ec4b60dc98365cf19d3dc9f736262718e848e6544be6300ae1cd14a32064361a9b147c2132c486e766e21e4c35b9adef0300de851556ab453c928377a1f6bc97f426fe18b091d17500c12207e0eefb41cd032f79a8b224a135b70d603b2ffed2514f0839703a71bcec6ecf9d133ff17403b00b062d8988599b496cbce2311d75c0464d1047a551e51c84a54f090ef3b6f11d22dd28329100ec7a2c8c64774e57fae0bf49b79e0d2abfbd78dbffd237324fd7380313535bf1399f5aedfde9bb6421dff896ec5df603b90d8981b60a3da9222d340d03240fd7bf2a4d246b667517bce0078f7e474edef0ea9879154a20ccc97e28f290031e2a76d279f887b1bb1d9bd5b760edb00d5293ab51c0f89540d8a051e92ecf740326d1ce9f06e91ab0eceba92fe21d35daf1c4aef6cb559e69458d47db9e57c5150209415b54ad5cc81da3869503b63be7468ca7f0524a3d406aa545bda352280452836acfcc38bd7940f8400685823d216a8c2e8e6e51a1134e95dae09b781950f930e34a7c46b968511f8eedc755734c60d0802dd01203df54eaa8856444bc9617e774358c87ccf7e493dddb1475ab455bf68535e3fb870c74314e70b83d8d471e5d3759aa8b4622065b7f4586c5ccf37946891cf8dc2399d9c3de80eacef6346cfb1d5527a49061145a8ad5048c4d893a0e8868c51fb782371cac94a4b01b8eaeed356250e0de21a5633285b870e9e8a8320dcc05d65a5915ddee279a8dc6f5f7816640f2df69601713828126c980a0741dfd4b4089a75d59083b63f16c125b3bf1cf92d38c4e3a996511a281a7da5b63ec41b1013d8fcdc5b8dd567a05d730e5e51506e25eba9c3101e800907f222a42c691efe84820ae62dda9f59b9d442f2e17f02efbe78bf7025714036bf5f717e7630d6681fc6fb4db2c4fb091dec2fb1da424dbf9537254684d8c0519e1b29ba6b82e010213afea1d0ed55293e85fa5a55990d184d7e1ae7820827c1ac1a3b0da941a370f4a381e46ea28692577d561d4d42df3f9f0dc5d12dc0f8a316ce84608d1eaec9a146800fd7a0a650eb819f00785e29462cee087fb5eebf8bb2315681906c3d3a96e1e9ca554d67c85eaac9278149e39ebd503a1b8aa33a9507f4fd69083495140c23ef5e51a5c16488054044206d9b5008da73cedc32af0a4b8cc4638cdeeff2b0774b87244d0955188a45e9bde2b2bc05579a5441d5571cf2284b74883c27f366c96ac058d0c8537617be443d4d68adcfbb622bd1e64f2fa807895ccb4d4591ae42849b98c9e88154b9eb54180aacf5bf5abef46e870dec2e827f808d69343e69e1500c9d6b6119b72defd22f42c83b2a23b78e3c77c4c6271541669c8ecea5b0cbb64d914515b5bbc69a2a8f56a6aeae7c9337191a03cb1206c5f62db041effd50872bfd12da0841ca41273d3d7438b10bb479788f9316e2a34db48307594e96e5e71a5179eed52293460d2b1db085525abff0398865570c47fa62def6e011f1960a1e1738b5ef7b50c2ca2a874a12b2726773f8aca04c18e9f95f5204146326888316ea5cd2f4c5f05568aec7f8722e286ec585fda2a80f19d0368cb3c9eaa6c9f4712a62ae127969071b886f18911a1a17f4162cb6885c6fe08e4d8acb66dd20d346df62fc6435c1c12728ad0de287ff5307ba76fbfec6dd9e59005665fb9958647ee91becb3f8ff890c44fead96d8e36e9af7a348a652acd17786040a1a4f2d70293bf513eb15fdbaa24ab5bcc85aa2a4b8c20bd847b8b1474589a81e90de25cb2d8a543cf86b0dda0b60f7f9b55bb43e40221b086db2f472f67fb8860219134b62691a3e82b6233095f671354f346ef855fb3614315f68529970ccbed0b35096f18655ed4bf855d4f197cf498faadbd4ba313fe5cdfdae3350a48277d4d1c4261afa20179e8e0aa1d8bdd958384254465de5176ff49fe4092b1847227244d6cb9571b62091423440f8050fe0ac0acebe20e02c2ec4190d9c67ecf4fb9b170a3aa40cb77729c9467c86e382cc113bb85735cd6a6e42c9433aa423396f3fbd9d7c56207f471f94a71622a4942ff0f7efbe9fadc35f683a9ea3e836df5ff68e41947f622e851061a28d41103b57e2ba2c12af716864936f2ebfeb09e1b14456c86c658bfee05f3484788d831bbb06f89fcc1e4626b71d0da963a40895b0000000000000000ad2d5104000000005295c5b78251599c221178ba565c51c64e4391ab83fc72166755243737367e6d3fc5ee9a80865abe1106458db464beaf17435b889d306b8bcbc9228821209f0176bf9f00152f85148a1e1ce1d7eb1c83070d0c9246964b5d1a4fd5a61a5cbda200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b7c9053d4f79e46c23efb031a1781732241d0728178ea28815e1adae178e00c0a8d53efcdc5c7e6d89c159b93b91e77772d072046f848dac84b43a6d257a15e11041e886781550de7aebf9df3218c0e8155b040ab79b18d8e72cff15f1392e220d5b447937a911729f8cb93299fae5b714a92b365b42d5f4edcd8a2e45610c6c030cda499a83c126818c82ecfc0af93bb04da72334679a229d763fb463ceea410203066b05a7ede0fded6d29e3f157acfd508d350317f40bde7a32ba81f43abb142c0a0289d0227c89f45cc73d83a66df4b686f927330134194e45e860693ff2d7fc89e6ad8c6e69af3869b8b0171201e3beae799b659dbd806bd07aee1ca441c630bf020915d245f65ee64895dab13c92af2b5d6e58ec9c4cc420bc982b6429e7b1cb1a0312afa518d101164e7d900d3519b57ce96d8a97679e593e7d1743194d3ad44a22020fcf72c05e8187aaf39f6d0819b6687efd48ef65425d37a1a6be0225b3d5332f021081539814925a8816daa2c2be229dc746e35a5ac55205d60672462e66149d730318e44908b4313c935d86c608314c36ef9b78576055d9c0c9b2586ad8335d846362069769cf23018ef3008a0ad908140bee2009c535ccfd9a53d1735eb0defb796063f46fc0fb86704e54fa76a324c0f33b8c1eeaaacf116cf589e2f5dee23ef705cc75d2438ea7a137eac222289d7df99c291adbd370ec904619b75a07ac576268e9f21f2b25a4aeff7995be7fe3ede53c892a661558bbb2b44daf836fabe4bc61bf907c43eeda2556a2827382da73863f78be822215cdfc234a310d37d49515331c2283b8351713a5eca2e2f138d4745fde0c33d352b7c96943c3164b28377f78f46e303048514099116b09c385cd4e8b4f4d44927e491fb47503461496215359cbb742b6d06ca64ebdcc379e8d7227b361f141783698eedbc6589cd90bb60b151952c5d5b4658e03023b6c701042dc84ad836a3440f8b3b89b16812bac8c1f9f9cfcfffe709ef4b8a99a3cd065f37390bc4a63a0febc0fb5a0041a05b3ff64822a15f86396c5eff0d89b1c108604fd841a6bde1f027462beec88d4658dff9cdfbc61ce3e5b348592fc97536e5a1dddfe58905006525f648eff17fef3b24805163c21d7be58ac7c95d463675f5d02480ddefbe3f5df26af6076978149d12f614292e608ad8d9706a4e973dcb5e90fe0d026180f72fbc577f4a4ee6a39ebf3c9bbeb8f9f60b9464fcba99c7fe0991df3af66957559895b7ff42412fa0ecdebb3ade5659b3b303bcdbc7963a28e5d421e2538c13317277d0618c5a01c8d56b95299975a5c53934966f03838be6c80b4e86db65428e9ab90ea2099c65445322ca135443f6a06c8399584f716670a4e9dd980cfcab10629c2c0b6478ad36f3a2ce63dfb2cbbd229ae11e0cbe843bcb3ed0ecd5d39c47df9b48d056c5065abf0a13a05c934c3c5517b7780cfabf39521b6be25700915948646ec14d15b0eae44c7236f572591203019dda5b3bf572e0a08bf2fa262e7e08cd3fbab5da71a65f5da0c2083a5868e16183429d1ec078ed6644cfe075c7f9bea5b1ea0f25777a5d979db6047963dba1be6f0943605fb2addc95dab5169b58dd6dffcff8b4d4ac30deb0ba43ffbfd6bb5b21df174b5a185f994f46174ad378718d4ff07cf229b617544c3f24e1dd1a6a8bbcdb0ea54569d130c1318195005c63eb5ae02c33483e1ef7ac438cdabc0cc13eb9baa22db09f19c3951ec9f5d577be3719d7863a2ff121912654e042d00ad91dbc48d9188f4c704ca7a5dd6884660735a1d5d041d0b283a551ddacf0bcfcf1144c18c369204571e43e0b093adf24ef5b3e1f869acfe4e2d29fd7b2bffb0f75812d2ee7725da1ab63fd09eb52b1dcf9a39b0de25960ae49912725c3bff7efa854f31417fc225d7f93cebb87ce66b5049cf967948bbc64201548faa7854d79d67795380959021ed2bd0f43d59a7a43690e53deba4493065e71e61ab5055599dfc9498825f6607c18597c1fe1298b0426e6c402bde3a9868b30cec8f89a2c0507a08c0f4bc09cae0868947f1f7a8770d52afe4b6fa36f4e221863948f57ba32ee2e2f932f63cc50136b04f344f29ebd585aa609eabf1e1d2b6f292b257cea051ad14603de45e70b875b4e6c5b656214fe75c831d84dc7e7436abff27ecb6c124e3e10efad2c79eb9be3caf1440a1a4476e8064ca912aa2fc333dfaaaa748dac491b2361f8a101a0241e6e51abfb4809d839b302759621fb02116d6cb0e7dee93e51696636af76d10013a35aedefcbd45d02cf843081cfa335f74abec950f4af0d12e367a9a878cf7105f021624144e243fdc818be5e68ab52885adccb866c9788583f06d938972d1f7f26ec3ab4e5eb6646738c37381f4dd706139a314c7876219fc044ef999a3048a53d13c01", "ac000000ac5352", 1, 1854065456, 1537743641, "20677cf0ea37e1ebac9cd7e46e88a1c92e9340e9fbbecb89b5febf5de7704d01"], + ["030000807082c40304293d4f1826d4c0fcf647f50f9ed5b1b7a5c129b2db2e05dce12010daae3d28ec030000000163ffffffffdf3ddde0245569a885166a102171e7c97c9adaba0bdfef6ec7d1911619c0fb16020000000665ac5351630011739205120621faa7f0e925e9be0e5ff412133865cca7979e8a81c69d2e89bd2a1ad9b103000000065252516a6a51ffffffff1c1a21a09430c8e73ab26ad910d4c7bf84ada735a3cf47a5d05e0e936fb5c6ca00000000085151005265ac5251ffffffff0331e51b00000000000500ac535100e14ec5020000000007525251ac516a521e4b27010000000004ac65ac5100000000f2a7da490100000000000000000c4c79040000000000f09a583c940ccb899dedf34793607996fe06c393e9916c221e76a22c4dcb3ba538a60184e2ab2c0c308218f516a4221a43288725dccf1ce75145bce0628bd67a3b968ed339848a82cec728db80600423370f9629f84c1c145e34bea8f3c5b10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014321a3f0608e46cd812f5167732d778f819c362f7f51f45b200ca4d8cea6ce3b7528232d0476f09ac4e9a2d08c392252d35ce10562efadc4132bc841b0ded148a016ccbb0d2b31cc6c2663e7b41b07848114852111ea5edb39253112f23cfb724642f0ecb71fa9e6d4326e7a310c07a070a8d53480be259c2af15f43e27e0bf02087f3936adbf4202cbe862db9515180193e502f4a6750dd42f7ac625b31cdc04022d14a51985080b1ed2731f99c3edd24235326ca2f395abdb58cb9eb76ab9715c0b03fe01d404ea4574b4b51a063b70a93272e9746efed351cac75452fdf9aaab972bbe07e3c6de3cb38fbf63545c7b8712c0eb5e8a67e233e2e5ee0f99b2ff1b08020a52526ca8cf97b90b1f1a3e2c91bf9636f74ab3af223bb068df16eb394eeeba0210af534953e3713636a3a5e69ee92a10a9889a2fc8ed080522ed02b72a2d1fd3021c675b5fd8f504bc2637cbda9e7ec8e36d6d3c4690971f2128cbfd5fd86a1bf7022d44b5bcbf70753c3707060892247fe05e560f0662df1e7d45310b768f0704c3030df476ebb6733383c3c2d6162ce680f718ad0f0aac4ff7a20ce1fddb4f7dd1474b6396d99c839e8611e329c3856c2fb51648340aa61e6d6c02aa6faa9e1844b9a6d6a8b3d094b19b8d27bc7763a26ba541db7b50104b0c32c08a7e0b903d0a2e26a6dcb893a92dca61af9e480ac929e045e43c27a2b9d64dea43561a7dfe15f12d27d78400724ae3bc085bbf6b5ff054bcce0f673adea9494cea398afbaf38fa2676ffd433cc2af78318f763e4d136a224ce931d995e30d6ebaf690b9a7ccc1e0a7ae9c31b6b7b9384708191deedcd125d85de21122e2f09c4b23a8f10037a784910c4b92315a9ef4af46807ce2329937c5f6790fbf38431ae5b3dd3e73d09d2968674cc66c963995b2cbbdfee4409a46024a07080e63cc1d71866c15fdae4d18d620c2de40cc5cfc42905a1be7bec7b294a93b27e27adcfb4b66e557b524e013ae07a1f3969ac02b133c6bf90c3481540fa4d42b8b83bd88a138021689ebd8c2683f01af2c29d15b419e8ecdff230a3f9e6120e3e3e38b46d5a43e96433e02f8c20ce14e94b1a58ea69b0f3a7b2b71be77415f4868cffe89326c15b38611ae121b4153631945f4b1bf89b649b54ff258386fe085dd8d2c7e43a26d5894d7e175d00fc66bb259a2bcc0dfa26f81c39b07be96d391dee1590f19df52ec06333c6ee921237d5cd6e5f9fa705789420a33c139a7adac49d9e586b8f6cbf6c75229b09fb8ff7537e2bd74fd16a913caaeddf53ca357532ea3ba7426214984b394448f809acbd6298aaa934697fde7c9a9cfcdb6e4a6ccef3acfadcd750da8b7bdf324839e58622a2f2c0edf9796131f93f1e53d8413aa6568c1e6228a672a6a37dc8fe8eb39ae21eb25445ef21914ab27807fd1dc0d392ac2949e0e98602462771f387c1c47824d618d7d851bd798f0e18a758754a5e471713224317630754c2bc4ffbb10d93bde5b756e091ae1c45ca233b48fc1da98d9276a5fa04628d1bf38a56bddcdec1fdb9283ca75f398fbe789b387c7d6bb8ea8f4e99d58093cd4feba919ba4db43ae3a748cff1fa733b86bb297a15147f23c201bbad003393c3e48ff00c46d38c878f3083bbd7cc8a47de425697e6ce75c99bd168bc44076a5d21cf2af3a61ad193cf1c6873bbbf644f00f628f2048548a1150a28a5faee49e1963bbc54ee60ef41d808ffd79cfe57d28993159a1cb61b71780f011c8d149b3c21b548ca128324bee0a8ab8337f10993efcb7b177cf8527931718e29f01a9a62314a38f95c6c847fa703d935cdee5e2ec54f0b47fc15ac55c4d0a68ac4c0f2da65d465603e71d248a9f0eac9c5da0afe986f538778626ac869af8bff63cd641856e8e6e8f4560f19b60f92a9ce76e7a62b5e02a7fb307c8d162d26016037377121f9eb22e7aef27ce6706f6da63185fc02d95ee349e3fcceb4dab5ae7f3b14f9fbbbedf4f461e034f54e4f2f5fccb1ebb95b0c7412cf63172a82aa1ef4550fc0bc8bce2f0cf6b048e96f4b86572fb93d66de31bc347ded49d57c3aa7dc40c9dbb787cca7c17dfd10aaa633d5eeb3549719bca32436e1f285d480e42c5b28e7c28b9395272b4d742a86b92b81e4f066bd7edf76f27a5a8c83d99ff88b5acb4cfec0f2551ec220f26fd273858d607fa5ffdcaa50ed147a228be7171dbeb7a27d259d8143475b4fc867256b6cefe586a5b251b66cf65fede5b160c3f37dd1ba0726a0f1573184693f045c276ce18238c045dd71404d7e7078dac6525d533fbd9e82a7d92ac078872587973577d7e83370e1703c52e41b6877307a82865842ebcbb7dfd446e78243df14643225a98eaf554207670797c98adec683caa42ed6c84313c0ad6bfbcfd7773b203d3f6385a432152853acebdb05", "6a63", 0, 1286360618, 1537743641, "eaddbaa8e3eb8b047e124dab59982cde3aefaa11775fbcd86144b578670a8d42"], + ["030000807082c403031632d64a1a4a9b83ab8d0411692ce09513c51fa5ca9984222507549cd5be307b03000000096353535352006a6565ffffffffc021216fba5cea403bc8cca3b6734dc5a9273be1bb12fabe59aaf18bc00a01800200000003ac5163ffffffff232d349f157158eb27ab6db512577b7a62df71934ee1d16c4f090f94aa33ab2d020000000163ffffffff04b39f5a0200000000046a6a00537109d80100000000076a65526aacac53e2b69701000000000553000051ac2564a9050000000001003ae2777a0df4022f030000000000000000d5671501000000006f2b38eabaeda60038a28ba81bb8a09831cf0880bc83204459711003922686bca66e798b0d8b2a4a8592d359dfab729b7a823879735973ac0530eaefc3057284f6a1ea61a037e6c5740504edb1511e424441ae38c29506c325266e59892bec9d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000791e1aecf6ec3cb7a3dad8bb60827d4f5b17f5c95b0e50d52509c55357d06cd22dbfa359acdd11de9fe1af8a84305c563bf333ab6a2d167f53faa4e3e67cde6f605acbfbe21049edff393da3f1cf0d76185db402803086374f193f0eca5e43972312a9835c60e1fd21e55063d6ff3b261c654b2d4619ca34ff81e837e035cd8e0322aa6880cf4e64ff397e2305e8910d73258af16addb359ee791e0ce9c4c3aea30300b63027ea634ae826d82d852bd70ea64c23f61010a4b5aade8b2091da583a0e0a0043a32a01ce630cd4c719ea95ecdf7e566f60f2ece13dee5b0407203ba6bafd9800ff945d35a3841f4f3cee48e12ac397687ab6db920aa1d92228b0f88c34bd022881f9394184e8a94590356d02c0137ea6d26f8989a36cf067e5de33923c9f5703205224e27ac33c1875516191b0ee53f011a7f5f85f02746d5585fa707a8c7b03020f40489dcca6e3fcbe1923488435a402e306e9e70dc19b770891bb112736c8ff0204f001e2513c2db8b2c0e9e851623d196bb941ee778e98fd18cef94d8f90880d0213c86eb18ec65d8a18a057e37d5a886795bb32d57eb3317490cadd13968a3d4ed2bfc93884166f30b65497428ae54078742cf280e5726dddabda75aba9e45a3eb07498962b15628167010ef35f6f74ba13659f5a81507c36e5126b4c98e0b3890fd1860efe5f95a9f765d6bf4eb9f9bca03b7231b1870423ca5211fc0c63da3a4559ef209ce4df215626ba5c8b28d9d75599dd9026fa18988824aa4c3cfd54ca694eb383f01c867f7bf1330e61ed222ab3d6df39dbe91a38cb133fa9e47cb2cdc65251509bf14cc31ea2c17327f091e9f14c346023fb4b2eefd5d8c4251615c1643217042490bc31610232657ded1e858b45f075349fe071229ebd918ada28517a9df56095f08c75a9b83415c4ee44039128fce982c7cd3cd701a68a19569ff1bf59770046451f8fdd13231c8a481b5fd3c32ac9138d58afcf99542ceff959e57214a71858b57bbd47e59d32c4e70da1c2aa3efa8b881353e0a515e16cddb8ed1d2a4a3770fefefe727e96f95aab4632f32c7f0c8c055b2805b8d345e8d66d64af682df6ee769cbaff54999fd95845b2c340a1f76839bbbdd0dcf0ab793457175e0243c7695820eff7d36ef779f1a3a07378a8f6f8d32a7473b217586cfd7b934e31904384b3e1bc720b0865822c3ada77517f165435cac5e07e2ba27d955da56028e4ed9b5df2171e3e71d61b6619b8f921f5588a8857a35087fb522dfa56e9aed001b78ceac9813719edbac574e29dd1b26e3cd5abd7443307cf3e17923408780dcfb6646f7e3110fb0e10c6a2b3af9ca61623b3b5cccfa371656a0f444182f4cfc9c84ce34bd4d3156dc6939962d1e4c6cf2c3046beaf8af2b62144428527973591d0c0889733c0df4b946924cac8a3da7abe6aeec4942d5a49eb5f837af46a3abaf31ee47f02f849146a5ac185475213279b764aa0986c98e340fbf12372da982dd775748c23c893f5ac704ab3250418e04959997f0c96d2a6ebbe77434fab2f8aa5feb080cd995bc61e7914e5b5c222ab3202ef334598dbebe5010c7874cf9fff58af6dea498f5b8d1c680903aa84fe885c2112dcd1a4e7112abc4ce3be2404b5fced6a5ca48494fe332785056a831967b0f04c8203b099fa8683cd50a42d6d497fb0537e647e6b62e745e517f7cd575340eec46bccf6d40937f87eaebfdb2f71f85ffc60df986f62a6d0478adfefb57f0862a22a5caf1c70d5b08817e818a40740ac2b2d55bf6831532432765b7340eaf3ad8b5a1e9a2c47ac4c859c0f28627afadf47b7e40b21a9551f078019deb15e5f1f0388a05e88c65e2610f850f9494182c2b7a0ecfd55449b242d65425fe9cbea89e61a3e0999fdf08e1e399412ce6e4a2f7074b3a5a2e6291be96a33c11d49e2ce09c6a34df15fed9db657c256c51e0a949d9fcaf02fc4a24db31a795323c5e4c0fd53bb16110a3ebd85329845950849b5cc53c5f50a21d3b591b6f528175508582f42bd12dcb78d58d70ab01520487f218d2c3a9c25b48af9172736b0c4a62e6f9169f43dc9c39a312b9ffaf95a8b1237f2b0c13fa3beca126760ef411835dfc9dcfadeef6d5daeb46f2972956a52178f3f08481fdbf8aeffe3f05b8704c99c1d78b2abb3ad8cea4e84313b4a92bc5425d363a2315192a25cb9c98605089cce0df02882249406f068982298a249f51b9be1aee377fa1b7bb48a1f0bd140837b633d469f78825055116cc6b349f8e499ed7210d901bc96f80f3ed46dec4a0000000000000000980e740500000000375c1a08b2ec44c163567d9265d99f347c69302cddc2c55d6dd4c03a576881377c6c1a6bbda7d47f6cd86ce67eebd96bd1fc91bb38797cfd994485099c39044df86ac6231142e54639363b853a21bbb31be6139daad3f01342f760d1ed3b143200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d2f45aa5c70006186ba9ac82686683d11bb71c1bebab08a430c55a0c723a4759674c5cba6895dc8d01a8636a6a902f58957f9dd8e72e9c77832b8b85282da3382824f83c1acd6d3d7e66ef881a78d2b8d6b1f983d3c0554fb2b0ea4509f9cd2a803ffe7ecfd1660f8b2fc5e7557c875e5ea736dd7b297e24544d640df99131c5022f62ed6fb7d80fc81d6f90939f54b3659aea7892efe48d5dc229ecc4463c0d64021c149c1a87834cdfe14d2b8fd927e9548e829e754f64666df92abf4df97036390b01eaf0b85f85bfb2ebb023541aaa50f96018c6686550ed2b313158ba6676235fd495066928f624da6f3b97baead1f344c077294c67df69cd255002eb9c0227d30329a088b6fc40c72ff448e98994bec7a20b016f5e736c15674ab75a2c739c142903035873fe706dbe2b254a5b91965f75884c4bf28a8e464867ab66e3903bcb5dd903117c99e1368c27dc3ca9382d1432390ca778b38d7af72bcc4ebafadcaf3f7323030bf582008292b798413380de9f90d9faa59155203cfa19c5a2b0babb7545fd5303255b9a44488aec5119bee76f5bdecc8dcbbe42b1536fddee5f0fe391000f44ea455081ccc9df7f15015bfa14efb3aac74c5b15fa272e88e3109edd75b5ab4f9a8621638f9c14946267e9cfd2770bfbb451fea7e6ff85183c8d83c9f2a1b37eddccd2ceeaa808aa9a57c8651afbcd094e14bc9330683090f4b96c5a0cadd38b5c5ad9ef6297441c75547d58d545dda56d4c043a865188d3910984e2a82b79911c9f008bcd68c1169b68111397156a18c42eba5079a0a67d32271fd744177b5968c71246ac79d6a6c35cc25872e27d69b320e7161a0495774815fd4ae70698b5af863d0a2dcf197acce4b784fcee71a17e631acdc281496c065af2d4862bf8615a55f0438f4777d6a7cc3754dce443a4de1682fcae594bea333b5ba19e032cc8ef8e09c76fdd3167bdfbbba18702f402e183bddf53e0a41cf2dd2bed3d60c7d3234b4f277ed44e4e273b7ffec5be086881eedeca5acaf5e4605e7e03f72cda26ee648386fa21e2263d356a92bd7cc4d107aa3c5b906ce102af91e8f1488b21c382a01c8c78d97476fa953dcd081645769c0ffd0f9121f0b40045c10b34963846031e2a1f3af8f8307e032803a4e42f973399f7053f8094d97c7633815bca8978e787904a1debb9ec6760b5334cc5fdb6bd1f12a20f85c7e097abac8bc3e7aceee829f77764e03dddcfd2cd22bdfea22b94125f966a4ed162753558129b52991334c4e43ee9dca4f00744e9379a1d4e71dfc9736c13cef5be4ccb6f240f9fd8896ee1c92855cff87b4a0235b034a5f70345dd76c52255a43dc631ac33e7a82e27a919db5a4b35b6cd4e619ea77b8885db9d1f06954bb90320af6d6954788b4c1e5572f837a90b2816c0e3b267103c392765951effdc151ef81489f19a64fdf8648aff88f67c1b8e190abcb8d1719c55d07b1b4ee511abf0a2dcbc310468e5263f5f604b73694e129a88a7291e68d34a29b371819db8152dfee6b050e8956c5379148bdbcfd7823f9d981a91db82cb1f6369705b456dc6adcd34182ff32d21f13f97790a9bc9a7c89c47b8b3ba0cf51cd1a6e8525c8f577fa55cbcb1ed32496c88da153b4850f521e71be71eb2d6c025f6c676e93363ddf523b572f1d5f48a356175549d30bae932f71c10479390341df3283cde762b56c4784790be6677c04acb465dc864f275284fd82060f89f4c7c0c5dfde4b84ddc37fcc9c9738ece825306c22538c1ae31969ea34a965bb55c235b15a7dca16d37a6fc8a4db13944656dfb64f17defe5e8c67b52b6673bd6aaf21032887c893b5c6087c0194232b7aa1a97a2d5d897272362943510e6d529912f28297789c64c1ea3c258185b2e9d76774bf26c5d3abeb182ba622785c765b1c201ae8a7b7837f91d4656fb9f1a1b5f0b589caff8ff75838e16e93403fd5080a31e675f495b65d7aacc36ab2a43dd5dfe268d4554130ef9f5b78f668c4e94c787b5c5d7dea7608a6a0284de08f010f75ca2d70235fa03965718aa257c6cbfa0007f404201f29b2ef1c942fa8c52b74064d2bcb2848b6604f8c8d19e4ae89ede97b55f5a6f1dc75324a920ae696513f502d7b25401fc155b9c7e980b212dbc34fc306d851be51be144bf7267f2692bb32bf22f1d29af2a496a4da8aabcbd39c2f618ab38ede643b2ebd9e663ddb0827a009a096b0bcdd6f6c892690b113706ea6aaa394708fd0163477b86024c828efd2e6f34fc10ea536843be06c24e4b83ff5b112db32a82756301000000000000000000000000eeb221cbec58acf6b6e685a4c8475cb6be534bef4f5edd3c71681386104e7413a3b8dcce1333771520173fe00fe4029b0632c90c40f528c78fd5796cb0dc23b4b7713b3f195b6a00ddfb1af6cc3f19c915755c6d95b6f693d5f3f42d29b9c6420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016f5d65995809389d8556ae6d45bb196b2003bcee9bcf87efdbe014ecf2c24dbb712a025619b67eb8ca071ac1b29356ca1e2e800f2c1a5a4bd9a8c6bf9672988c2a57064aec9b0fa0cc863c18da24293ac4127cc426b5c5b5b66c9a80e4a55c4472c19f12d06685c0a41232dca5972aba1db67fe65f41501e2134a9bf80b6181020ef179894dcb5c9837b159a4dbef1bb882cc245917fd0a26043707c44a99847c0303733548607d9eedc9d2bb0bfeea688bb9d44f2904935c9ffe46d31d112b0eb30b008e13b40f943fde66c126abb040a9c0e2cdc115b5eb646876d21d64461c09f4227678d659a0e3dafa919fd4ad4416c7bb6209f2b13695ef348bda2c473d8961030f436c68a9c835bd626e73d89407ef1c6eae77c75e2e5811806f7daf39d3b148031de846bc8b4b27d81da6ac8c42cd668092f38584507ccfa3e189b4f64b2ee4c70228102c47c301f942412f4cd7427ab61e0423cf7630e3c70401c83b3a04df680a0306cebbc5fc37b0570983a8f0a6b7315793c39f5a8976aab3bb0438fe6f0cd60d020241a76e925c87069150a58a5bffa71333d577c38b2cfcd5d20543d12b5587cdf8ea44eb7e36b8ec27d8307c7db3b59f96a9eaa4d9edf3d561b92f3d07eca5bb0383da71c9b80d37f9f6aa823a603feb192dca8a2b0fc5867e6dace2320173f19ae91fd598c8854206563cfba8890a626fffbb892d2cdd5e77a026bdf8d7bf129d19a50bc9026c3bd9b9008cdfdcca8446a7fa4e322a5239de4d573f6330ed6e79b34b0627586f35f066afe9c32bb0b676dcef9aa09368e2dd5633c3fb65d616f8081fbaf402d4940d0b2c40398c6da5f4f575e18c167760fe6e0411259a859ecbe3a3e1305a1b2c2ca6e573320eaaf8155c3139488f5ccd132db435bda913c8d54130e9c20297c72ca42ede9d19871667e7c77b806a9df92138338d960759498c599e6d0476c3f6b5cbc671c2a883a44ca5b9490063864436a03e75e6995e051b18a0e8a52a4a1a3bb9471153a30f373ddaeab57a732a7e90e086f20289f29a56043e625ad4570cbd16b2854cb8230b8786c7cf74387fd10d68407737008ae662e448c95d09f510755c5eb5399f0aba321be4cd6f8ebba316af52369fc84d072a5cd41789d823becb0a1e8e4d0fc8e84e3c4244601b2a9cb2b2b4d8977ccc36599f17ca6022e312643339eb7068f527073ccb0230c1b94d5771949c74b4b0e28c4348775c4fec467e97e2d027d72f8829b7261089a872dbf5b61593bb7158c13d7f2baef406faa990a144249cf4ac35f2f8ed3da00d971acbed7186aadc2b77f76a5f10bbefefc07fb12f6f784a00cfd1ebd6ae5e03c6826dcf4679a08dd3b3a8be6be79af787fb63dd023d9ffcdda5def0ea312709909d6d9fbb447e5eb049e8cbd0de36fb1a4fb15ed082ec89c7df30854de6a579e35fafd881c4b35af14bf9a68b01948b1ea6fb5e6ee162d4a370ec06c3ba0ca42bb574d77670d81ff2af9c0aaf45bd1cd0e37ee5fc9623299c7f475363eff3f379eba90ee2dca5a8793979b8e35743d1c5bd486ebc3f173ac41b2793e719e58ffaab53b29b6445cc692f8838c9bf783e8a1b6eab5ef70b5149b06001df97c1956997d71c4fdc322bf6c386a10d9a4aa2d1ba34f7374acd8d707428cdc454487edd60695fd511ef7694d2470836edee4d0b2e31fba0d9568f79a1159102ab73099935d832f6b4a4555a55b71b7ac33575a738ecb50f53ccebc06d922de315b8373af2841c6849c63c4e3c8a671d94304cbf88d4017c44f485a133156fc366878073c5379ca19464ac57e21c4941a56a91a279cf4d28933729b15947024c6602db2bc2e2f6bed0a700541c11233034525e860075da9e79f06673159bce2e388b20ceeff0702cbc3ea2722131f150ce9322e811387ea66f1ef60f6b57bef12c7ba4aca9b8bcd61d00e89e8af250f105e3b9d10b397575a249dc571b88fe9d39f8d7da032d4e26b005a6eba5f738bed3aa037580838c45e21021837e88b0e9a6995e1918b3c9a0bc007fbf6f85215ba02b8654eb9d9132a52277211310c3e5e1e2841a191e03057f0bf86d09cc21cf2fb500f5695708c0c3f8c402575bbf79ba5541df1c52d8b68f6e826b716a963deb310dbbf979d55e4166c3ab6361442e9af7b52a5a486c710f17d4cce642c6d5388d7596ab8136eac45323655f90f4be5373b1b995df77c73b96b8218aeee26e258b7331e88e9106714394d70c27524f0fc232e629a966e89286fd4fa106ad04df515686924159523499177bd174ba3fc72eee193cde8d41ea357a17ecfab2c3ee89ab3fcbb3be3c03953d39eb3b0751fdb0e637e895108d35c3ded67d6863188fd9355b7eeac5dda1bd3b312e86cb8c7366534a2fd4ba3100626a7b5d7015c91417e1cb96ce5abb6f8694788c3f0d", "6a", 0, 429089975, 0, "194a7086fbb7b0a377ddfa403cfb20e502545089ea1e5a38a3f8f4c1beee076b"], + ["32580e17037a65622458d6a31e425a8a4d9709f87bcdcc65c7666904901f6b031491a1593801000000025163000d214d778cdbfab0ba415a6f686265e0c6b74111c92fb7a95fb1a39b2c2a8dc4195ba3000000000751650063006300d4330582d4bd655236690ff6ca3089e5d8acbdc8488704cce73495a11a8970d428d4e05f020000000200523f2e657a03a98c0c0100000000050065ac6351eda652020000000000dfc9ae0000000000030063650000000001a9b8b1020000000000000000000000007721e68b2ad6f5d0b0e558c2ccfd5201938e26df5cdeb45950d9e3909d53cae6e53ef60873b1aa63309557c9245a0370f43f483ee22fb6c186876f6468ef22c2c49145ddb33efa737257d1ed3faa6b21d6cf15762ffc075ffa3f755ddc786cf6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005964d979437c76fab906b2349a82b7511c7a6fbf38629b34ae9ab4be84aa808839783b07c1487362680ca160b5262f9d7db69a6c42414934721d3c69c497a48496c2894c96ae86f6cf3dab79be25704b78cf4edb1e618e40f08fa0e679bd6851ac48c766bc1491a8a191c08c2fa2774fc12315e846ad9b49bd4cc735a8699b2b02299b6c0179f8f503bbe0ede3bc0080435b31908a4d1a86cd004f924deda458d8030a153fc4db41874d67172b9a0245f93ad12843644ac27d47077c953bf803616f0b04d328e44acba87dea46b2f09de9e14afde9202cb9a9539efce78a1efdaa6e45de234f1f160d8697139abd7c81c10bcb8db07ef4af0e16d40087e6d5db0c67f7022f739643273e91ca52bb5b68a859436f34d279fca1c4aeb5354f18b59056a4d3030a53ed837d39e270b90ed92fa056ea28e7f4dbccf1437e7d35f29861b421c3610211b1b3d8294de90af5428d218b01558d3cd9892378e36a9fe09984c0b4c730a2030f9fef57345567b07520a90c08b00fd36a16ec7b6ff1f855db45f12e2d4ebf540219792bc7c1f48fd20c0f28ab3eeab417bb9293c6ed0a2c1c90c0bdaeb68cc69ae3a3da8f26328fa4324ebccd1a9adbe5804cd175d3dadac14be2cd3746328b33e114ccffe40091ebc8f4a81a484c5686af2428640b4dc8eeafec5fcf8418cf398bfa208efcc74ff3ab88e53537a5fd7048931415b6634f373cd13e430198bd3a1d0c1fbe2c4211aba4e6efed990f70ed313da3237d036bafa4b4095818d78d8af3ea6283b8aa9fd4a42b6b196333f0de66bae5857ad4306d376697cd54582480606e6be54972f2bfb6d220ca77ce0a89dac5a06fcd0039b78ec479586a6dbaa0a7f4335a932977f27112f3e931c9cbb61bc1a46e0c4fbf1ff1a67d346039582a836929b2369bab9c615dd43e4e4d1030e443e1dab6af0f53120c0622b97f54a89aff538f5af0c75c0de660e9d4e2cb8a666d54f60eff9a838cdd53d53552e1f31e745185a88e1cd149ff1be15d1eada86eee97b74a2a2ce99e85c919e515c0f4eb81606fe378e23d7f3fc2985418e879fbf9500dcc5c03d57b2787351d8fe07263ec54ae557a8bd057ab0f7a3934fd4c8ba164a43029c9cfbb295b77e27ec7643f6439cc1369eef35bdbe339908ab7ab15de964110805d35013ace3bdedb4b2cbc9d67ae1e13a5bc69622c88def254d7fee8d73d97a905181afbbc01b0d39de9c0b598dbccf302ef264fa74d4e901bd612cebab0c9f821998978f50eed23a32b0179593dbc8e3fb5aea3b3c5cfe9a5d630b699274d7b3121afa73d001d0ff3e48f2fc5612863cdcef5f5028e067d8ee72e77455fd7b78792187d5f5a9c41c52d86f96cadb7f468cfe8900aecece2bbf3db4a91d9920f18853765a33df0200a71dfe448beadebcdd1f7d6a9c726d0f93fece5dfd220a5b8f8e02c40d7193fe9ad4d41763848464d2d05741f0262c57b9d31abb26c596cc79b1bad3fa12484da1c85ceb654b8a1e1fd757398c056a3d7787394b45a99974f290672d7f5d86d8c91551c9274718d81f275da2e7dd6cd3065811b25a0b45d0c6aeee16b369aa52c0edffb1a6e53c50ebd58c195381675cefaaff8601017d4e9097b5b7b5a39d70cd75f529a219e52abd84889079f8d9756b3513f0cd8553d1edb597b14963b60db6080389f9a003497035545c44cc0e4cbb3f460862195c7081f68f580108494329ca18909dc2d00fd5076f12f071661b3f5f763291b47a4c7fa68ca60dbb9a1ed3fd03156844c536af471fdbb7fe407c0135d2798be602f0feea4f424f6081e315892bd12222d626dcec7c79fc82cfe9441615f4c3d77f38cbbc25571e1f58728fc67f13a07705aa8ce4886c82a00644ad3fd95c3739450d77d51d38843d2a5d9e354e80576a94f180b9a80490c5511d409b81c4ac442a2bcbcfd6e041df4612feed9248dbaa43e68998ddbf5564001aff573857c19947a45f31ddd84ed5a750abe5343efe6389c7f91b4f30a2522f8b304e2e95b7ee0e53d3ad1a52c9532da78d89731ca89d80a04de60ca91a2b1ef2a17cdbf61f035046f7fc414503e5b745d61b4e532e673d31d4f05d7e3cd5b829231abcb424f96ecdf85e4a2548d9156e816b41614ae39cca69036bff4592ec536fe42085ff6c0e23a8830a939ecb3c4236f6e4c3b58ccafec95a2012a345524d1ec11855f4f72d482eaf0ff54e9791316073880d488cc7a6a1c6ec0b365337811a4fbe31bc919e1128c1003c250f282ed8372b708c54e657260cf60d36ee606f9e1544e41f9b3776d82552856374f145fcd1916440a541afaedbdfb32e5960027e393b319c036c80cbbbe5d8e2ef2ddc5640626a83f2b55b3bd6778bfa17b318af668b11d80a3137de34bcac58be037bea68adbb37cbd3077c524a35ef4460897d6790a", "65656352", 0, 1061033422, 0, "ceae4b1823649e6718d4d38c245ca7ccc57b6cf3226f5444e4b94a6754782daa"], + ["030000807082c4030378fec15c8e75ec91cd861b49cdc83b25a0ed3c6f9138395a268541554d86f615020000000251acffffffff784e02658944a10d4a3608c1d598db3072f24f9d2a894cd0a3188abf2c8a41930100000007525363ac650063ffffffffff177ddefd0a15a93592206ad8f96a6951c4e57dd8e4cdeeaa14eef4d3fcdbda0100000007acac0065006500d5cd3d380146a308000000000008535263ac515165ac00000000b48ed1b300", "006a6aac", 1, 1254699060, 1537743641, "2bfecb8a24721cbce09085a6427585f8e758da64e8952e689471e7346f8859d0"], + ["c058414604bd2cde2cc35bb29f2f1ef59cfa4045b3505b5704b4d90886a1820391bcfdb9250000000000fffffffffbeb78716102a8a3c044b4394ee13eb97a2263f020352ccd75055b78d6c1d0bd000000000083c5db2464302abc4262ab5c02a59145439d3705a143378abfb0745ccc19a136ba2d7c530200000003516a65ffffffff24a947846c8ca82d92a1732d3525591f2116a2ad900e80f2348c88eefc7155a403000000096a52ac52005253ac51ffffffff023239890100000000001d1425050000000004acac656a0f056bb40100000000000000006df7d4040000000046a1900395ca086ad8fc2460fdc18dfdbc3def907e408cd5999d34addf42f4605be7fdc06a0fe898f370583430812a64e48ca4b67b468a283ea577df16ca0f20f3e2af08fee914b7cb2c6c67a2f245cd8ce1ee260e77b9dc0085f69da6c34ac300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e5a96655661413bd4a59ac30675f8b10c597060a5cedb09ba4da58561710e009ebf29825bf76a1598f7acb42787d8f5bc8fe2c4e027c7c7c6f932fc93cf3fbd0614ffe70f4a6eac00fc584b98302f467c5bf5c4ec19ac27c434a69feb38805486277f121bffb50b4a15a430464fb1bc3514aadb76eef6151976528d0e76524fd021267bf4b544dc4cf3165f5b3db1d0d87648b26335e27710f89c3a14a499afe400322e7c483c513e4070c3419b97c74da9bc74070fe7183003afb2d1bbcef296a070b0029d15d66bbeb8d47ae02b632f31583fb01e609acad89b236b96afcceda3f9f6cf365020014aa98c52dba1513c6f3bdf561336b6b01d039a2caac5c70de696b0306ccd31f1bd7c3b0ea00230e826aba16dfff46cff644a12c707543e3384ee0610304ccbb8d897e401aa65f4618e00548f9cc1e922758fec1e19ef3402036fecbe30224ca76485a58c018a77165341d4d3741d4eb4979b837e2e9cd1ae9f0e3f67856032d6c7cdb7d04409ff687b707729bc9b57e5419ef73365e378be3443ec1ed7f8203042739bbfce95117363d730d7cdf2818446d4b17cc32b7b88b2e0c3bdb02d6ed7faff6a82c3e675a0dcdee1cd22cea299688413fefe563d6ac370cbb9c7bc89471a1dcccd02e219b1384288867cce9d6bc5179fece5216bab7f9bc2d7313abb5fcf2caa30f8b52b682f179dd31b74d22a5cabe2dc024f52d4fe3b98b4a8cb84652e4c2d042e5214f757efc91c284098124e5478a7c8565b9ec951c20508df95f740cd7e4cdf8ac4268376468e240a00b0fdd2f01c3416e64f49e555b8ca645f66798497eb497b9fb785465a879fb92eb3d9fa24e598e6552306ffed4c197425b6c1da0117fa42df18570d3c2c61bfc2fdb5f994c697a6118683af07d6e94382a1215b0688fed0635c9ec64f26146fc097b4fd6129fb6c2b9cb1c7467f16eaef51c4e8b55b467186578f588ab0559155bb0a769954927506acc7e0dfdde573ab2d192b2a00b162a01a9b3cad080f97b1f0e435aff4b34b64303dc7d1f54f422e80c58839bcef9e50416f971e1fa0fef43085c8303a3a20967387320a8c268d8c8bc778bb90e2fd16c3d7847a70f47c9394f8bd5ee35a9f29f2172201876ffc6e6681edbf96c809baca4002d76b43056f17c9c97a3a454b8775bd50be7e545bd39a06f999b3bae3445e6667e0fb94fe98c873e4ea842dd22145f0e6eef75a058846f2619e1a7a7490813c92e6e20d0bb2c19ab870a731ef7592f781a7020d2826e639e99d05ef76cd10a23c8094bb08b344f47fba48b6756f8ddbc6b77b2afdaaa6e8841be665eb18bd270f007f047fe8a6011a66e4fd9c73e7a873455ba58ad85c2b6a9848b72b0543423c5b8d2c85e243a22375c50460e358ab8400e15f46dbe26ae69197a2ac2b81bfb3399059d9fa634c5eb46c8b1cdae4531e7fa2ea6c18f78cd557fef5e5b1e2d376b4867d7ec44d3fa18821d57c6119a44ae73c3878b58ff3fb9a10bf435e4b8d09d5d6ff8a822e88286ace6770c922e4c02263347ba1a7367edbf144cdc9cbacedaab6a582642cd23a0522f5c5a0952761c5c2cd85f8b2189dbe250a9146fb6c517484f4f1dcdf472534cae538474103bfaa7806652728c5200effbe4164bead0fed245e9e7d26d8ca43dd5906d9fa35d7d9c5104838349caee8c89be941b4b1a9e516dd7724c5043137646185a4da6b297006bd56f79666fb5d2f4e1156369b4f2d6e966dcbe0fc5508698a6abd4eafac1c9fe026e3f19605863698a5dd896fb140aa5ec91694b759a45492092ef7eb0cb09e4e102e106b6b21039b45c4cb296f5cf2e6d6b823a9967d41cb30c6fb3a32b854abba724002045ba602daf3b37716b36611fcbc47498e9ac10dfacd86a95d8b087c1868c45007e9cfd060708f96972a9b489ea9af43a21874429c9ee987351e7311d999f3b73a2cfde57ece920167a5e8ec2bde88b565f637f048085c9b7a3879d3479db9f07bd955affa3270630c2a4a7bd983fb8deef487bab855f1103519272fd6b3555c28c4132a23cd945aa4f9369b616a0224e4b32452343e3b0a1df02f46e6b353796c0e6d8499a54455bbb54646687ec7bc212916d8baa30aa0a403d31a362a17de9c464a648b2b1c5126c7524bcef17d9d8b59315d9f203ea3696d0c56da3846d505f5b985adcae75b2d668055995e4d7268b0a4c47ebf77fd8bc26a9700b41be3ac48295df93e1ff8733ff7fd091e882c26baee6eca3a5767ea3a68496bafa0aaddbb9e4cd4ccb1dce4acb17cb2939f89abdf23b0c738341ab0f0a1cd9ae66b9d8291ced3691f8dbd9106a44a8c3d56361079d4aa2f683f3d5615a98bc0c798a322c38d1d1c5a46b0412a99afb88acd1524a2ef2c00a55e758b1e6196eb5f6607d4153a6c9926a858f9cde2018fda47e0c", "65515200536a0051ac", 2, -1243808973, 1537743641, "dc1567e9659bfd002fadab9a5c950316b3ee1c4889e3282f5bd062b25d708fe0"], + ["1b71ae410168ac71f33785ab3b67842d368082cc0d3be7fb9ca4c6b4a50362b5f926e51270020000000351ac654c398b0e02f9a9ec00000000000900ac63656a51536a537b6d8d0000000000000000000003fd458b04000000000000000000000000e7c465ac97838f61aa86accb9fcbf4f1980c6950c00f73220118d07092000a0c72e55a42b840ded10a2f05558ddab57f4548c22ca451280bb46d0831354572e75a997a0e3787be217c5b2df5dc1344576b48cb8b8333fb06729bf0e28d2a7cf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036ef93e8836b43403f5f2ce383af4f04d82597971c67348d99a4bea564358cd0b06f98214287da510ce444d803fb4c00b2be379baf7a2f89aab8e4ac165ae002ae5a3b6f5c993fe7b4d1018cc2279bfd8daf58b4acd8a05b9422c2b0df1c4a0eba7028b6d050d0f019f3a4aea40e8881a8042f661a7d1d03d6c86bb8e5fed8d7031746b58887f4886fd64b25565c7c3aa1f3653c333784785f08e6c18cc3e1d206032315e1983c1de45cbc9f404e900e451d9fdd474f2b19853ce6772e5b147ab3ae0b076ecf20c5a44d124bb35f8a9d04978691ecd5d8917f47eadbbcba6db6b81037bcb4cf9450d2c5dad14bfff414120e58d7a3e799d5f7cc9c09ef9ddea267b1f5031bdd741d846eab5f47d7535a2649ae537e64ece3c4ac766f61bf8c81e6a62dde02017db405b0373dccfabb3da533763e4f784064cf8f40907845e70159359827bc030d1d9b5968e68800f3c990b0f3f7efab93135b341e77f0d1d87112e2f4ee65dd020aa9969ea39c2527ba9cf7e997236c67ab5aadbd282a854090824e66d1b689610207d4b44e7e1d3788ae5e0765682d898b175e19700ef3bbe85ed6d68205f4127687f5bf3d7d6292a13cab0d19eca9a03496665b9a892a88574f2638386d5220c6106fb3ab6a55e664d9d4630a48fcf2663ba38b3e391ae344176f611151da205a90fc1185335c5f60d5c81e00bccfff90bb9fe8c52a771ea575ba236d2db7f381e820474317cc45ed9a2488e1040b7c69261c8ea80ea4ab2a7a923001d135e07bdf55cec6c1323d5eb431609edfdd05f58381711b0a322bd578f2fc13c6de94c246460ac3117d4f913761e2b80133def481fe094f3499249239610451d56244c7990021b4f7aff4afec0150c9d1adb78e671d9f6dedd8e4f4033afc994c42cb8b2ac264d7c90eb118053083b45627f7a775ed185e676b6ca4c799ba9f38ccdfd20ad9d580f57fd5820d1e47630bdcd8e8be4a1ddb202ced7fb6e60380d9e92f2d7f95a18a4fa80d02fb9e97bd89dfa142d2664f88f0a569f8db40903ff5bd9ddcbca5f55ed2fc2ab7d5803951c879125fe5d84aa06d4c2b954faefbbce5a0777a5ab1614065d69f69bd2cd708a8ae2ff5f3a63ca9a92486c047cc0dc3f9c44c446f5784b3f090814c5ae7dbe005b7056a84f3deaec31e88ec3c4910a5fd58e13f16ab9eeb0607bb11001b6a16013fc7aa84328533cbde283ae360c0a16be16d41398b1d5bcfff43b69225461d598fff8c07f25d51853ac10a69db0f0482243e78d7817ea215742d3d8242f457993559923ec085b3c3a30fec7697d64bc28c48777112e93e41c2680aa3bf75a1ac9883dd81318622278ced67df2df0ed2b18c65309a2c9e664752cf65fd619665de472c74cc09168e54923f62ae3621a851abdd6682802653da1373ea26f4ac42a38600c00c016dcff85b10f9248c3ee5ef400ae64dd4336bb1e374e3df01d0814c4f2c7e144d595d671afeea7bc2dd7320859b82e8156ea024db4a33090799e30ab8b1c98fbf8f68fd09cc8a1c95365d20804edaae606a69b518559774b36e00578bebd9fac30bfd220e0120d0208d542c407e70c7f2955223b78ad6fc95f1652dea1c3ef3c33cc0c543b2641bf0798c88036b24494ebdddcd8a25a3de91a53ad62e78aedf02447f8fc77978ee206abb3224ab66a4d7355cca5841f9496c6359422d6e47b0eaca3f90bca18564e521e63c8db0b6c6060a55d04888147c95bd1d033d450242d989c84b27561d674670a73d19f2024bb3253586bc693d6821156e314efb666d60cea978dcb3c0b02ccc879f01a7eb7968f7b5a1ce0c94945fb729b77bed2f74efe20320812e7bdd9b576583fcf964b9a9a626b8960a392992d614276fa3110bfbf9945e0f636f3a4ddf2f41c0215c6755937690efc120b55688d4b903111c83af2d302b7ee5f6b83c7431db83151fdeb913476d20b339ff1bed54b7a8bfc9c52ff684d8ceb907eac915d5e6915ddc3911c3facbded1ea6e4b0fef138446108ca4ed5a888559e376b7f25457d95a538c281bd1f0ef1aa8cab6c8cd78b7555cd8287da80b9f8165957535af131d2ac579cce9e650635efbfe85101c35e8c48a47da15b376fa2a0cc3a0d2c4ce151729180fd7ac019e3bdce3b97190a07204307701bbf591ad106efdcc9b30ecba7de906eb56ed3668291988ad4a9c3a659b9a5736b1c6bc0395e5884a5fb35e1cd6e2f88cc5aefbd415448b87195cb2b341a2a291db07b44dcdb73b081a65873847950563b896aa46729fae4dd6a7ff228535389b469150300000000000000000000000008eabd0da69d26e0c898d9c0da14af0e60653329d9c1f7ea981ca7a32b8719a28e7290d441bb32573181da2c8143c5769b8e03934a4f7414f3b0bf7e307470191a62cb58856a676acf348a9f37ddc621f9718bf977de494aab8a7bd7f931128b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2021e3147611e279b6a1f88a88a3418d8e76fc3084994f6e694a5e70d1602b9af6343e8e80fd472c14726f31b4597f4d444480859a77badfa577d81da8c8fa580f78e56b072503dea39cbd24b7d90c50ff53c6b453cece8b956c805b1776fd9915faff0ddf1c9d83f03529c35851dfbf71a70cc84e371511954691460c3fce4020088b767c35352d13ae7db8a112b579407d5d54bb0a9d4a34ac5855429b53cd6032a1f05db82313c5a7d773b0c537f68a376a4075e9d2f7e2304311ef13d8341650a02d16cf182070377706a5d1846fe001ba14caeb3c18711d58a65cf8926b6cdc4a7b6e5104e8aa168d77dde20b31d3e5df6ad20e2e8531f6f5f595a55a914e5fb03140e6a708c4c1e3ade55aa14114c1cdd70d47f8cada726c2a85c0ce5a5ea945402148bd4c986b54d4414e5866252fdbca3965e883fc9d75a8c57b3f59e1760a6a20211c3313c25048da31759e0d09ad8361258fc82605441307f3b0418a2365cef930201d93497c00cdddcb8df6125bb98cb61acfcaec8bea988a173f9af0555bc385b03231392fe5cc800d0a4fe032dc833f850d30d8d6d5fedb2eaa245e52cd74c93271b63cd4ebe5590ee45f20198d623a5b77b829acd6789f79f376932a4c9347d3b1f5d875269a950518bd4783f0a1dd5df11e345ebf8095d038d6ec1546fad8489cdbf0d4dbfa8f5323b6baf83c9a35ac8eb70a2911b9242491964f5d5da52e364cc7df5057c0ac7778c3f14bcde1bae70a0e46a1200c47b609c9158c202f497fffc5cdff860c2ae2de42e6859d2dc782dfdbe7873287166c7c7b0e4f226bca13d83725996651d78195d4d3b0ce55bf5fbed2ba4c6bebe5399bca22fcf7a6767ce66038b563477086918194e8ee04bd7bc478bde43fdf915fff1dd6942bdca226b8d8777c71fdf14edcde63801e75a21121798fd26f44bb7514ec6fde2fc783979f58218d63c81e20df5e2f7f7095f3f01a19527081a99acd428ea167e13c3fd665076a8236d5e32df7c8aa0be21f225c812d3de67204379b1ded38206b963a89235dfd0e2ad24b6cc5255dbba6b1e5d08c9c7334711ae94f2b7dc0bd122e73b2011f9c1c52d83bec2751557aa2b92272ada981ebba4e9f2d080d2be252c1680f271b5b5132b4b60405c5b640fe1fca585837219e356b712bcfea39e740a8721b8dcab7fd2decd4081326b5a5cfee3f4072b595bca4d07f3c276ccc7bc8383f50e972e1d89d60250f2de9179bc6a1358301c2d48cbd76b01b9fe03e55f55a6b44c233bcb49980df04f61294fbd979ecf2636f958e1301cb19a69a49f6b6530c4483b5218a04a367db099887dea1e9b91b1642dc1781fe94e9f30c73396c481da61b8d979aee09c438d9edff5bc9ff8e185c34fae08e89857c6afe724ae06f28cecb9467c22668521db620840938e396158f478893046f06cf9bf3ae90344beaa5ca60cc438d683e64a6d7eae4ad27b0a76cd7c48353b3f3f8735dce997b3759769f700f218a7a6a55342f119699f71af10b9595eb50ed466f0321bea398139dc412450a47f5427ab3548a03e27d3a7c6e5648d6fa7f3d01e71a588b5329abc2a7391ff368cbea955be5b0d7c880d67d3f578f6725e61ff13c02d0ace2125568925c027a3aff207f2397fa78fbeeee0080fd51da4d6876a0dbd82d6e6362fc53aa5deaf817b28471153c900bfd5b48943b37e708fb7878ead98cd4d1f7258a246dd8a21d0dc5f289e61342db02ddbfefc43a07715d217b49314e7f1b20ec484aaa72db00702bca10f6bf29690d5061def6221713d5e4d3b23c2d295a1910e0abb100768d4f4db586915c015cca0f42ad83416bc81144e96e38336e035712199b87218620e046f9b51dd3206d021e2be8b85c42c64487fb0969ae5789099c34587a80337dab1fd3c7783a17471ff1f97b2fb0fe317b67408de889eb17ab2a70f29d7baa6f5255df07b85c221375e42571c61a77d0e42e571865f0deabcb88c55a508046cfbe7c91abe40edad757ea1eca483d9640cd2e8484325e0e8cbf014cc4d530cc396b063b160decd01825c499014037fb4201854ef1eb75c82b7c4ae791a85cd586cf7aca1f1cf96264d2a738e5762e9f39052c39d6c176a02beab22c4dcfe40d1f94155bed151f2b7f79f40543609166c6702862e4f2557ee912f5a5c2f50534644956e77d244b0e7b7c275223d23d9c9d85f527f1b941e255d71eeb931bc334d95690bc253ba2132625d94ecdd217738c6e3e3f0301af892d1dea294644b26c293a0c752934df8150998b96809aed11800000000000000005b048a01000000003e504dc0c84b698cd1be7cdb91e879e07d0cb6ae39f2170d9d640433e8b0ec5c4bb316278fe836e5116c96d4d82c9fa36dce611437660688c8f058ca9c49a61d5bf484f07057066473168645091986fbb4fec89a2eb7ce8e4d01b604017cca6800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ec21809f5193f748813f62e4dc4cff446a8f709088f20fb721635672bc8064570e0245ec05e2f3756efbac86846bffb282ba90ab2c78887eadfd792cb001cfcc53545f20b63de2af682eb389a7c230fc8469295301efce7b8d68ff9552ee5ca3cea3983ccabebbf495642f1287201b6d2f08f9efdfd026febc21ba23a07b5c83021292ee3b51723a3634e0c2f3760285f8841bcbfa741802adf22c0384e43fa64d0215517f8eebf001b770a61c4bb40609a5c168ba6d71f398a4ab2e9a6258f1f5920a04006505160c46433d0c0b64d687e1367176c900953a890609ac36f8ca2dffafd90e8abdee7ca8cc0ebeca35ed74834a31dc4d08b9ce5c2c3beab097c39cf3a3031b0001560e0da5d29fb91e1887618a4a4411e43260977332c64b6bd998d51d25022c354f8ddcde315a947f1901f830bde97313f2aa2a782e108811a2ebd2d5a79c032f267def8b7ecc539ed0e9a1846ceeb3f78ed99a40838c0678804ee4a1158cf4021f44172d9a038358874e43ebd7da8c38ce179a4c1c81d2990981d462240d46be0204218d27f75cdac577c68b72ab8f16460e4827ee137293772bf6d17e620a9f19787b4aaf68cb4d4e3bb10a64a186c360e1e2020e67d8c71077651ffcd3bb4e8e018ed8c7d12699cd46dffcaf88826fe73c36ac499a573dc437564525bebb4336dfd18dd6e7fe50b4b1f333f179685a21f5b43f105565eb180ea3eea30feb3e3dc8858347205da0c32d4706b28bd7d10425c727e1d75f748efc3e98c38aeab25ff41af5b8ba0f2d0ea14b2fe4a73dbb12fde6655868156db21cb5f7021f79de42938f2bff6bd09e3eb82c6a9bb5bf9ebdfa6346a93ee64b135cd9b810986f6fc61baac316fa0103bfb3886e41c411327fed02d2c3c28575c1f9c58fa40d286e9e4a220d2170b606c888a3ed5c0f64f1b79982e5f7fe55d728ecb0986ca298c167c3c365f83e7e7368bd62dc1e3cdbca03a82e248b19b84b2c46f06e0c9453e176210535b40933c52991ec529e71008ad186bdf9f96a8f13c78fdfff6849e67baeb86bcefff061522df27a6407158ec0581403b335e3fd5ad37757edd75fdb19543e31909186fd28e9044e2dde7222097c046129a4c5b08cc2fc26dcf311b3ade9a0ba0f6e4750bf181d5b830003933dbd94c7392cff1c967fd16540c21efbd0e445b2730d0ebaff8e31d10e82dc6979ae7d05bfe3f6cd188f6212cf926f3b1adbe039a3b77bc43af6ebce84720b51ec943641448f254e2fd99dd139d87cc3d1818602ff87aa4beaaa7dbef30007ef2020a54d2cfd4bc486cd9606108ec7b355ee626c4539c023d15e124017a124e945852d2bf79a3cc715610c92cb09c4386c96e5c5821dbad360d2a7d4890977107ec9296c378bb4ee25438ba6f37a2cac9b2779b074d67c6eb73067e93e25ed72b96229b19e94b552debd32d15a032bc89fe7d9b972305d41c88b83308fad5b6cb4fbf42d2265fa1cb36a02bfcd194b84b3e79c7c42f13b8eebb233a4fb1f12403ee1ed15cab65d6daf9c3cdee285b9c29d820af5d169031ba6b9b0b6d1714e1769b69d1d509d2a75c9b3532c92784102c0d32375468d6c6d82f9a6bca26e8cce6466d0932ab4c8ffe8d02efc7d35510b470424a1a855156c2ebd93137d03a1960087c12c14202df73ca112a6bd876850b170b3db6e348cc5113255bf2f5e5f4c352967d8af04d375a8140763ca7ea2f96f1936f547fde74bc1f39976912ae97566e6337af85f1ea20d7f03d7734b4de682878cfcc12fe445cb3342391d9dc14d9fc681ea81db3ab3a7f3afd0ef2f9888c783ac6595d81f264fdc1df577bda2e9fb52ac33f0f4a69731e8f741be1ad091704b2447e3b475ff6b6225f9e0df1070cb968b1a101680f6c765a07dc5720f8d9557d0e7b73d8072aeb3451c395ce4df029484b932da696f9f6d6ff029a7dab952b1cde3eecb43f531bcfdb2ab0011bdcdfc0f748e9fbf4674b1e036cac0bbdc13b1fb8164e693d34db40c15c09f628d90da2149bc9455c8e1928db5e0e2a03c7b829bce539655d37caee979f0a49e5097e98fd7e0716f02aa125b031609929c7b97c7db13148d5da1402f77b26a2152204e7fbd20848c5cb27f474f3e2afa64a0dd5f80aea6aa49b2688c3643ab9ff92c01420a2299d915c4bd9915ecb4cffe16aa2907afba977b7d09c0b5f81c72fd451cb06521588230f0f342f74f5ade4ca305ef61b74e31a15a022f487fcd35c000bbd617746c685264d6d9c735fc4f6e9e02cafea05af81df380b40a0b00e01ce6ee20cafca0a9898a1acc08bf74243e5df79e6158dea1cdaf5081c9a42dce4cc2debda0f54749ecde6b6602f9b94f376967c56081c1016eb3094ed27ae1ddb91b9822de46293eaeee3efc700a1fef3896d7622c417f7d8b2988eb6e83487b54b8045e0c", "005253", 0, -1359006412, 0, "e718a01910c2b7c019fbedc158c4316907cf7460152bcba78d794485b70a5b0e"], + ["030000807082c4030199397d9b6c72c1bec0171aff492a5d2a5c2e33914a62e0a928199cf9ad524743000000000039fe028901d48e7e0400000000065153526553630000000004b551aa0167a742040000000000000000000000009aea8b9230339b631644cdb3e413bafc400bf781bae83e5067548f48cc5e00b6d15d0a76b3bd726c70be9750cdfd3e24dce4cf4002b6a922051ed2e02e179449d3f5d08806a601389ab398d325b4be0deee126d65fa96a41cffdcf050634a8ca00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ce5b58875c2e8458d628d68655f3ba1fed1bde21c27a37b63d9aa9a7fabe3b7ea654495679bca48eddb00e458ca6e8881e89d78923d4db41322b75507919f84d111d814c4471ac69aa9b959a129b0e24068523c9255cf3b89f0e5a1c4504233fb4ccef51977eb2b1057ceb12574e04adf38256257eebfa23cea68a13ff51de19021117c4c569b35ae92ab3b8f4fc1a7cb0192116f3c1f628cc9b3aafda48b462a30200ed7688a1fe3280f75dfb522be9c5096e79449885cf040189b93cb0aa4a2fc00a087910a25d82490a8091ba57768931c8b64d33c807208b96f3918cd371685ca8740e3895bcf0b4655fcb31be25eb87bdc34ffbb9da52c7461b104e788ac45c59030dde433919fe49c8f185fd417f7a6d4f89c0da9eaf9b0de97d87aa1cbf876f3a0312ace8f5e02299620461a95f57c4efe2f5ab687e0c66b5551bc4f30d6821a7320204032049572cf65c9c09b999e9c1eb160622ba19848d5b9cfb928a4b925f76710219c676b64e0dba792eb2e1b42838ea99957d6386a672a1505986c794a13f4e6b030d08f7f02df2f2ef62677f758f1718a629114a29ac82ba01c35dc810f9722ab0180e46b33edf82994964e5178e358bbd660df2e5d26940266e37da172e961ff069134e9c15b67a2f31800a7bc913e384eb6016212a894ad43d0bf621b883af2afda43c26b68e196f3a10ec7352d285065c232797689f76f31a6f482628e5ceef5de055a569d29b4411f73773134c6f286dfe11f9fc1ae4255fb2fa6b5766c254a83e1b5e736d945d22a433dbd03064b2d6b417966a8e8d97d8cb5618b67c289102139bf7dc97056693155db5d8ab7e41940127f9f07dcec2cdd145b8ae757be3cf3430abe1d714b2b6ec3ad4d582dbee90a49de5586b4ff338e702483068b44801b47e324164d9aa342abe1d68f7c2069ae3c08a994cda4740e70fa23e27ad5ec1775e8cc0f6ae6d0a584f4e415ae7c7f2640bd03b38acebd91e0b30cd47044d1a80ebd575a9eb0b97247af2057805fc64a1450488c3dd739b34b42c55237ec4c8b8ec538d47f108f6ffc2638c8ba3ffe4950835a9ef4d4ebf4c5f9ebd398b28884959e0b5309df4151b32248f044c73508484d6d160347f0f4163cec4924492c6c9bfe4809cc5576d9b42bb18e222d8c3a47ef03c17c490f7266593514d0f1184b65511e30e882557f6f3af500824f2194ddae330249a35685fbc1437ad85687f608621ab2b6a50d6cf66692d0162443b5c74d6113b53f1050454fa7a1b5add53f702567a2b3842fb7383e2b93c05567f335c1d7a5dcf8b88c41b01ee648e88dcb64c127d6cbf32e0bc103b8abf8d23e15559d21d9d03ace23bcaf7d16f1b54f43306329eb27ca7c9d3849849778041f41e5e6747c365d1851bcc7e404b4f6e95370b7f4261e5ecf271a898129ef86fa04b1464d7e5bb9776758c0a566ce0081bae35644ea860063b46735d41e28ff210a05f912a2027e7aae23d1335c4be7db3e31fae720c3a28671d40b6f80938b86585fa58e7ef377e0fa4545ece1afbee9a0a4418006872c0504ab25203e944903d36e4ddd1df167ec31c1ed71789ac2d03be18b1410c705d647b69f7fecc112b06ad719e9b0acb8a3accd0bd87055230ca41620daf9052afc8b8f4f9d050cadec1ecd2505bb431a761b6792cb057cf6c1f834ee67e0fabc463e262e9e1e248cde04fa9bb481d6b86d5586f5c0551ea752ade038d4473aaa747cd505c4c080559b951ac5743131eeda08557d0712cc0ebb086b440bf5a3e8727c1870671a442bc9e4112e1494dd058fd8814ab28c45c20d7c1206c98cc593c4de082ba32d0655ba4a0799bf8f4b3e3e5ca0b59f27f63beacaf50ac4b697605b72cf5f189ef1f17ce33bf6933321051a3a6ff8e2a9fd155f22551d0d9063dfafa368dbb7c09cbba78f5dbd3a35c62cde7ad287c202545d6b867c745855791043f372c94291494e6e6ade60f9e28e6ce44af2c702f2457bbd9001ab2dcb2e5899ac359874f956e3620b8ccc8b3e42b49532a21e69b035980157d8566c383c2674519e2011b9fa7df5d7e69a8761556a002de4e6bc2f1c008c90414823c9599b719e1be9e56758d9965e0f5413579fe9fa736fe2218fbee42c93699c63e519642f83981c8d30bfb2bf48edbd6f844c870c0d43b08d3a87d5ea4d070785b7fcdacd119c7d97e6106c52359b4a51d1cfe1ac909bfa2f62e6625b80bae854909b02229d971bde2a0339982c45e6168913df79f2e7d208d127d0b6d06e934777c2fb76f6fa715166ae4117ff957c0b6c94ac6e8f8bb0943315cc301d22528af3754ccb4e04afc46a55d0dded5b9fd95c66288c013ccaa19e358d3375de9874cdd0505e9bbc08d86ffff1ce61ff9ed05308f3f937ca6af828cff1ab14871053a79d80797667db6420eb1db7002", "ac65", 0, 900788221, 1537743641, "5bc440fadb31f26b0b07e5cab8cf4ecfbf184b066b983f6a9855a2a61bfa087f"], + ["030000807082c4030204c1b65454948a280b6989dbb6c5fff6fb9d06f67cf6b8d32b110ff159868d64030000000365ac527d9f3f7ba560c6573d3b9524b60a7a2b72f30affd983287b25c889c53142d1b35753ed130000000001ac2760677e0216f3560100000000035353535071210400000000046a5252ac0000000056ff2bea00", "510063ac", 0, 885361454, 1537743641, "611779e165b9286d21b283a549d15193e3a7c3a75859a938723cc38432b9fc3d"], + ["0e68a01b04e6d91a97818e3140ef31e44061e75173776027cb6eeafb72b1cdeef4f01d45c20200000004535153009fcc422fe2ff3e4d32fdb5e8159d718737ffd04e5795d6520523c96756457b624c1ef92c03000000066351acac5253912d24184d5ea52d8ccd6a8dc3577c9a5e0295ff6494c9ac09326e4c0e1b0b72897c9c9400000000000f21345b84533d80c45ef19a57c9d235583617b955e07cec6c93afbb3faeb996770579120000000008526a65ac5251535300b27ff104919928000000000008536a536a6a51006a8082cb000000000005acac6553006ede8c0500000000085200520063535151f53ba80500000000016ac82619fc0300000000000000009790a4000000000058a7984b35ccb5a3e4f18e2f5c66938ba21961340fa8a95ec673fd6802050d1eca47e41e188a9fdf95d722b763baed2c5ab1fe491ee11af80f730552c6008dc36c23b4691f59bef51e4ce24fa81ffd26529e3e9425b1b0b998af02f9e641b3250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084d9ebe83cc462d29c3ddc9263935e51e18f9181e307466a0f2b0cc20de08627e6110e1c798f0e730551ba95554fd923f06a596165157c597028feda01b83a8b78427689385835346c3693949fabf03c9ab4e7c6cbf065d09ef4965a93f44ebc0dc5865b2ecbf550bb899adf78022da53b6de7fe23df0f503053a6ef147210b2031cd42071c89a34ed2de351876c9060ddece8b3708988d1f06cd62f29ad9f378c031ae69db41692c043af4908b9f488a7ea1879cbe7c6d03074584fc5ceb81c64ae0b03ef0b4087536e64e8cafe2d5e1f0b4e12348a61d9e8b079d925d3a01a729580ad813aa2e39e2a6ae3ba49c70274bc5bcd2f94decdeb569a94dbf11caebea5b7030be221cdae8a8fc623cf3cc2a3fde096cc44128ee6d468aa50dc914bd56949380322846a6025888e0ac97b16f3ab19c361e0115af25b2fbf5030aadc28a5db05e7030fc69477165a15abd8d83f2fe674737ac9f69f2bee33b3377d0f22228e5ba099032737654295a0643573b63dda545f2692516d5897e52d77d46cf4a62e8156566d032db67dd0e5be61f5ac73f78cbcf0a31ee6f943a496b5a3aa5c766719778fa453800ac8bdce05f61ef1e485f65d92236f7dfac979a17b09afe203bc11c7919f8ca593e38da2e74ca74c7d24a2f6defa16963bf20c180ba5068c59fe3eca8bf53a9adcc85c4247c59c3df0d95d398037985fa065cf4751847373d0255e171a5b13b808e29ddf0d9facb645eb245672a46bcc165657388d1e26f122b5e6b1d06e95f66dfa4dbac45793df9775341069e0e008ca143faa223d19f0030159c6148574b9cc49ec2e0c0c12f4d3f6971b9ed91e17d43174be2b3ec7ce8c3eff3db28b51ad2059d90c35d7799b56b942bff1538f03239270b89fc8cbcb4f8034f742b5ecb1625737664c73069d57558621e119672c52024c2c42c85760d4ed9226238d3f3d10ccad965a20d32317cc0977a2af8d5fab89fb2d15c0d03239cde33d8ca11339ca4acd0db2abcf2f26428cfdb9814020f88587df10ab5b1291ff263a589f60eb8e65ed0e4ac6b324ae162bd6eedd5606759b24f0e1e719cd1a042c0414bed9c62d01ada2e57f20006fbbaf7a7551934f079117519b11ed7602effc4d5d248ffcd01d9d1f7f08707d57bb300c5cb1f636251a2aedfda4974be07dda44d9b63d31565ff56feb6428fde26e99c54ac435f01aa22c7dc0ba9b5bc7479e2784cd598f4f9626ccfcb995a37a85b0aabc1f9b507d15832935815e51bfcdef2c924175d4430875ce00e283ca46808c003e87d342777f0a59b51ea0903482e8cba2fc782beda9912363a997b526d754fbb32efd4d385694d9d8c4383969ba77d749b1617c133dfc7b9108b05629294f6c3606ef6026b51e15d31cd6373238a72dd43e5a0ca46e68a4a4ba27499abe68ddc0d322761908c06dda01ad9f7f1269dd44947e34a4773b4ef0285c24c0b17bec5692b7fca04c3258f812ad8dc38a06df4efb41a6f44c92ffaea444f2a573db16ff68dd86c2812edae23964c3b7219d0f36a3e2afb5f426d6b8321103dd934395df11934ce40ff25bdc57ecc4d204fa18279eb70510c43d4eb61521f7bb166adb915f8afde1536a6654e291b0dc63cbbec99555ddc9a1facf8998b73f03832a73d940d7d6329e9757cb3abf0f80c209a573ce3d05c626b5a494368fcded1cf6a14d7146b72b3023e2733367f62b38d0d2fdfce5aba672382ad0f51b36e9e66153721a93c47055486bf06d394e9515cf6291650e10a24e1a224d9af829b94752bb467b6a11d86e6363e84c3628bafa6bd9743c52bed7fda69f27758c243f3a4abc7912d4ab384efbaf33f659cdeef80b6bc8477da7006e5737c09c62293a86c2a552ede86e01b1c7cd3669a3a229da3b28cdf15d99b4707d66ce71dc4abc1741e508d5ea1f8d59e545004fff5f183e967fce133e46d5e84029a61b66d70e6728a57463a10e2fa0829e610c7c52109de6d01db359b904ab5f0993247e1bf056690b3fc8733b9cdbf12e154005df64510a9499de2e9b251a6be414d28e0aa2545ebf46ea3ae0acef81c2f23338879ee272a139b5460f3f648d72c32dd9840155092f2f2c08be6c8ec08ac415ee27d787719e1e372589a3b8991c1a973ffb3892bb105096f0db96b2f29e19b41a878ae3108be056e3bc146bcfb8776bfd76a8f825b2c3302e6f1f482c5cc03947bc2ea80b86b2d58026afb1b922491e61b2213fe6548ad95dc2801aa624affc3943712f8b7116277e78400f147a884fae69ce57d98c094d20942ea69d8a02000000000000000000000000163ae9979e83e4d9779219979e8bbecbb8cf824c05ad5a9ea913c2a42cc37ba11c44bbb248bcd0058b235e67eeb2405219570f0b0ecb11b9950e9308f57dac8fe89d271c0de597da1924d4d329a3ec552337f111ca3a06a47d3bfd2591ef3719000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000645189f5c0fbe198edfb047b8f722998f756cc462dc623832c2af42c3902193a860ff0cf758c8b49d6430335ddc60df686faee56a124af77a7acc667eea03bb9b4e0e9cc0156313e0f62d9f034adf2357e8e2007a7c37257be90f8e7fa4262f1fde92cffd8f819a18839988a9a63a242db23f71586300d622eb26826eac86100303137f4c3c94300fbc7e6d3fe4c19a7056f3b1f051fab059d6492c92ab3da9a4022203a24b5e064608495531a5242e6f4d1fce0d559aaf5b81457ccd0edbf321280a0055a2db4d487413d58348f0986d3219e32eb453689fbd95f7c141522f19f9f9a75c58d9343dc8322624bfbcb3aea5168fb97cd0bf817cbda87c2f81f9200479031cba0802f3693055e129c48178187ab43a0f4889e9f01be3c08ad73ddb7d2938031579339445cf15cf0b1918fdf62116ca5ef7d044a0f9ed2e244c4d30dc35a99b0307f7d9c8a4d93adaffec7fe1afa4043a8dc9b4cf4d06ec9683dce4d816dcc6d6031d4dab83966684677d88853eafe6d1ca563a36296d9c15cf15042d1d062ffb82031eb2b54ab42a17331ee0daed28133d71c053979daf2e29ce2b00a5d9ae367caa51206a29bda790e55d6a1e77175c9b7baec4709e4bada7fe80b2705479c5c1e26bef389b803e402a882981c29188a1b024caa781c8a1fbc48e15ab2ddb9ae9d3cd6af739be2aee8363eda87c72d11650850a272102b67995337407457280205d27416cbdb4135dabe0a02536e4315649997d6681e2cbf71df388ca3fac3d0a3e587027c48eb6ceb8becb933377c9e9cc0cefeb837288010bec066810a7d1b544ed8998e1ef159a37e6996a083bd1011f10bcdcf30507979fecd2700cf25c0510e445161d33bf21030eb25cf168402c58de96c32aee903ed3b404092f438b58f8b7f2ead0ff13ba90f5983f5e518fd9ffe31fac29c5643e835f2d06077601ff9ba391b033fd148958de42d4892e8aa31b2b44ae92b48918a138fbb8d01ab261fb0d421d80fe002f0c76c89e5261c707153fc360a52b90f60f0dbb33d16d91b038f1d2901c872d07e6cacb96ea1a8dab67749e31f2cf3cc056b50ba894041ff8787c2c76792a95d781454899ecdb6cc69868d8d34d08017ddf168247363ca889b3ee6a60fab584dcc8da0e10ff449c3a4ec50ece9c970e07df600321970d70657406e37f72c6a71a1377b3b4cac7dd52617feb61180d9bc1bd22f53c7cec677312ea718888c9e72f215a2ee26e6f6cb9914f110f43859e93399d147c384685502d0a5a8c5f2019950f915659ee75b0ab9a73b2420e67e9ca8e5a3dcd4bfa5e3e40107358092aa0e6c10ebb2f986123374c055d83468a70f6a3beae2a33e9449d9e1c99b5356ad3dbe246bbce163e999357755c0c900dddf8f4cf7e2b4ec9ff1cf91b27889750db96842c5aa78c4c09a1cc40aa0cce9ec3be422783a25d8a37d4c43778ed1a3905e96734d08ecb805937d456945b6f5d374e33d1715bc902122c163926279ff55d054c7276b4dfafdb20d7519cb4f6bc5e19ede1a6fddf554f769dd30fb2a7569740b80eb31140cce1206bf046475c955c63167ff0e91ea751565ef1243489d7f5e6761469b68093f033fa508b4d17320c8fad2bb7e22855d4ff39abe797edab5dd2a2dd85445a75ebb2e07070cb70e5f9b5b0365a2ccc182c100330390fc209a1304be8ad68aebe1a0bf60a8b3ac382dcae74f338fb060f4a14d0bcb46258f7bc8b796ee6bb27f9ed4d5c35580c129441a3f96b5c7be8e9c533afcf1dd30795e2d6efaffc3b7d5a3dfb26d9e97c4dd78bcf8d9810a79b855d501ce22dc0512842ba58411ad8dd60ab5b9721e5b85dfe04869916953ba8cde5008f08932be1e7c755339f02270d49d196e7909f17567dec7baea4c59b3cfeb1805adf149afd3dee327c11785cfbc3ba156abf3cc53c3fb0e6294a46258ace64c3c3667d48266911663a2dc4fd99ce4b48c804914124144659c09f87077e08ebf5b6a8a341f3681889d3b154ed867d5c865b40ce29966885d39b8d4ebfd139a65691e11a1970212068ffad1f4e86a99e1549a41ab7c0cd0ca3ef74c2605d8977baf7b67a7a008c6ddea94124a22c917cd4e11a1a248648800a1d0b2a4414f21ece0ddc1e1becbadddd9d8abcd1f34f0e2979cfd5b70d3cc4b69bc111ef8ce2ad28014f2431ffcbac4a0c0824f2986807030f52d320ac3f2ff9dde907f57d2572b995fcb16d9e97bc91374adb62fef894da3de8d4cc54ff5c124f590ffc34c1d01dacb4d08608e53b72b15eb1bf4d04b49e7b5ba9d84662010000000000000000000000000a48490e2ab25988fe482316e16836ba1db25782c79ccf6f9dd70c8094e118cd7de9598ee5ca6de13bb3705220bdec4320168c0f0c1caac447afdb4a0e7eb2531b2a4d5e8ca7caa85dec9dff4ceab8e558a4f68bfc87048ce7a6530d7341be510000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074fca3bb82ce116a3defb42a9888a11cd9e9bac061c2adba2c908f399dfff98b25c8b95396da262de97f94a40169545cef5d3c843b27ed8468a2a9736e5556b3fab479a053965d7d322941f0430189b867f99bf5eafcfd41cc867838591a47968c59763dcc35cc71804886ce8c28799048335a65d813b08a04c88ea9946648df032e1aad8f80c4e0093af5df96df4035f7fbc33645ac23f4b7d8cc5d640959fc00020879b4588734f7b6d04f7896ed0a43ce122aa29119267df34d9039d4e8fc05520a0047efd0065b7f1acae831e6e6015bcee9998dd8754223c597d16f1c378defb2246820a234d507ef637227bebc463d349521234f192d46cd82e2d6efd67981cb0201095fd9ec3737fa52ab118406de89e851612cafa27f9e48e2b6931c453dcdf70325ac829706dff986ff18ff6e35dab2fcce5842bca358427c88399fbdf6a267370328f14de78835fcf9e0addd5b1513de77c94f659b15ade4e6d8cbe58d34266dda03052b9bec56dc5e1af7d6469e0277e7d65da862deb2a1d0f4cb275ba01c5021f5020210f951a07d329a3363e037965b24870f7d922812feda26ad5a376341a337dbc052d34828a06f9d1dbdc8907ea203ef3fcf189effd3d2b37c536421f2e20deb554e0687958cd8b7777876c09eb18d71e9a0db1bc72f258d7e01226a2cc42a2c2812805d37f32a4008bc5d605f8a004e82351f745e7679f46a18a281f4da1dfca1e0528136ad9ee4e1823cce8003769febd6d5055002842c0809ec65351352dcca755e1516df3898c5846f16d4d6c201a4760b93a45c5c67d77f8c11862d5b6eb56ca99dfbb342a1fa38735ce32f69e45c59673f0e5f2270eac65775a2bfe6617ad236861116a70724b2a7da3fda4610140a2f0a0fc6b229a32bb7b8dbf48561dd3ba42c4d50c0a837c686ea2a7f169ad3a3b6f2348c178d1804b6b5698c49daefe10fcc4641e8cfe3e46bd5a30cff6c18fb388cbeff8f0e261ddb3b92cc40fec219684f4f97429979cd703b1b201effd99e2d512db62dce2e767cc646b2942a72c8bb78ab446b708332d5a46eed59de97fbe48f7b788961d0d68bf46f11641dc9764e075db7bebd97cd565c5b417e1878349d66696fe9896c8817949731be7efdd7c972d5edf90c9f787fa72d1761bbfb18135f60b927a8162a9a7eecc788665ebc290437c8deee22d4dd98f8106f2b6070b5600475fbc055345e96e4b61f06c2c89a0b7a89e305200f213e8b8fc09c2f8a50d017b182c883c7d286c2c8b451230e01d984fafa0cb513f91351686700604448aa55c7d3d8e06413ef57418e3ccde262c57d8a2ab2bdfd98b5dfd4301c890741f89311e811a3a385569f32ec0917a29afa5fc48d643ae0d4659551022c82f6bf6ba3e5dc75b655afa4266564c0c5d25bea46e98da52c262da628680ecf15ca13c0a0f954662da498e56a94ac792c33de785a4e57260c68c69ab98c8c12bc2282d39e7449c0d6537e62b8a19552de7a778abe90b98a82a40deccebe36c2da5f78bf8d0da7358e8a2c6aa3690565f86fec332421ecc506e272ae02844408da847f0d6fcdc5e8bb595423a5d6556c825d8308b815933d990e8644ec3dd20ca29918afbf94814c420935db0efe6ec3677ee1381012464bc93259ec911f4cf6b2878f54a68c2e1c59e7b042d2a6540670ad962886f554f52707e050d9cd0e00721192693aa1f96a2caa5a2da9b63a57becb33cec8fc8dfae7e540e9ddd48bcb5610dcf76b63d4640cf6cf9a0dc493854bc54249d30e21c7024a4cf1442fed6dc4d446552e49ab1c551df91aa32389610c8906594b4dbba8b9fa6a1e47b258c616dcd5b565abbf838cff34c939f113f81597a855befb89109e282e2a87a89335e357e368131b86cc0e1375f07080efe7a5f124f848531a0331f4c5dd1b51f3147d628d6216ac3df943ab55481104839ed1773bd59155ae4e16919c3efe22afce443fba216d3744507ef958b9c6c655bc2d1423a737272d02cf6cd451c74b87250e560cb802ff263d2792502e5cda17c71e8db9fcedc0c7ce973ac28831a7e6bfa9a55018fd3249ad0274f3d745d718aa2e19b5dca47ef89ef0ed136439abd34e574a5eeb35f4b98c93ccf0087a2c44d7680601bb9e58049221da31a095e53e8816b5403ac4de747ae7758babe3367ce08f8859ff78e53181ca384f35642207470748fdacdf33101e746279ad28943b4e85f976df7487e967355dfade7d9c35e5cf424008aa3df179589ff19576567a3c3cff26728223a9374c243172015120c4711e4b49330939c9d90100e97f9e35f15becf5d08bec18523886cd0a5b958a6f024cff1b525d28d490b48f8383ae0e3a102b6183385ff7d345a9f2a5c46b82cf00164a74e4c125b12dcc8b367d371d41b1691c22c8ff9c001ec6d33b278e63b9070b", "6a65526a6365ac63", 2, -1493272850, 1537743641, "77a369865a7220fe5242db03bb7b6c539181943e0fae84df56cf54c6e28d1bcc"], + ["030000807082c40303f0c5b727572b954107b2a47e5d2b6fbfa8d8c9cbbc8dd37b5a1ceaea6c99cfe401000000026565ffffffff1f530bad7c338eab7e5274b74c8ec140f6d545df60d4bf0f35accf5a1a294a2d03000000070052515365acacffffffffe6ad17c58a9a9a308e245521ec4158f0384d36ba852d3c09ef1fc3dffdd6c7ff020000000765ac63656552ac576fdfe40381b4880400000000056553ac5351ed96a70500000000036a5153bbf2f4000000000001512f21c2fe000000000291b5f305000000000000000000000000879aca3bbafb25edb46688654abc9d9b1c497383acb95f3e75bcf4e8c319d6d88eda997028edc91692e452a11b81474235eaf2fc037a11c9249dc54af313527fee56a397f305a89b175069d165ce88c61c594aba04c013e777041ee3820d543d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7355b05de4799fa561fbde6fe7d7a3eeca7ad0952580d38cab916768b17b2cfab3fcba33bd9d8da2ba08b05b20e587825363a108d27312adbf8506962464ce4ed7f0bf8b3b0b36d32e3549f027e0d761070bb90cff1bae88bf11418bc918c1040bd2cdbe82c10474b3ab8f7ec5e6bef6910e46d3e62b4e80ec8d9191bef07bb022a3795023befd2e0756df4a072e6358eea6f485187bef8efd590fb17fdb2e93e030b1e6498fedd869841384186a212cacb4044932fb2b00c5d1e5868babb091d970b05cea399ef6fa79d68d244506f2c521a6c734c8c2d325f62e3580726186438dc71265b2f6e245bbd0b0654242fd7f40c2bc793a09503bd2c713dcd27c6226a890315951d2a54a65112b34fff8b0cfd71fa38cfab8bba18f1d62abb0daf7138250d032a1b88b22e8abbdb455ada2fe9cceeed7421cd63926254d2ebe8df4493715bad022ab61b88c6311d0b1230c274e565d7a3fd0263cbb5c14ebc116dce260209cd0703209f287359a220cb01d04dacafc3d81cdbea19313ccb1bc48ec9b3d64093fd0e03108b6d44f51ed58532c4d0cb08dcfc999f0f025312d0e1de9ba9a696e30919087638d2d2b2de7c90cd8acc475ebb8bcbfecf37eaa58b65255014f43c46b3aa85c20b4399baaa4f8f1251faf0db8691a04d8d1f6b55ca9c5f11a1b31bb02f7052f8bf2c1eb3608e19bef4c266eb1282e11eabbc331100ec19504658496498bfde93889c66f7e5562cfe736845552c1cc5919f64ba7eea2b233902599d67a0c1db201b0d59f8e7c341eab037f75d3ff580f57254b3a9a8c1528bb344e0cbda9e9590a73c8d7335b3ccd676be188ddb8f00c94fd0859ab2f9e3cffbcc4ab1fb65569345e376e3f0b1e13ef71c73c634b3852b0ed4eb99768fd2191e3675402a7b4f62d0b96051ce30df89bb7ac5310235270bfdd0ec514dea92685471623eb85ca1765596917461dbb48c06a1382bddccf0732da40236f0dc60f7015acb200b6aed4c877955426e33d69fb2e5ee44beb3002824b2748d6f9bfbca70816ee51a92618fe021774ea7ad6643bdb3d5f98fc15650833e6696ef9a63d4547e02fb24f48f4b66cef7cdb0b392a0ed1ed28a2a44865887602c5bc46ef0dc3e79ea706bc46eee83535cb842848056f892d387e85b89564fa54dd37b17ca36f522861ed92febaaf229bc61c3fc114c6da97dcd02fda15a2d2a84238e67d5c262d5f677c27d4b57fb8908aaa3b2ee5cc5294c24bd127cebaa9babc30b2f343cdca6db97a6cc2bac52d566c8c35942a147f193616e96af2266b6e182eae85b993f84cbcf82f8d559691549881a8a53f1bb73b97efe26e789b538870e362f89f53e3322bad099c39ece53c1bf9a9fb60cc619a25ee9696a812fb5725eadfefc6447124fa472424f1f16bddbf1dc5e4338fa849d69f8bcdb25eda32f03547191ac4e1411a8682823fba96ce82dc1f78bc257b253c62f962a4c89b3f36fbefcacd726110f4c63b8d6c3dd7d0c7dd9ba09bf8e05bfdef4b74d3a02e5504719a87d5eb58377cb27fb65124dc589ecaea0565e764923cf282e6c1babe17ad9d5d88e06debfcb7c82263ad9a1c608dbae635b292930bb9ce012e58899c138cabd952e89ddd166ea851077125faa14cb5e9bae6a9fa00e8c497c969d083cc31669f04a11b467c386108c4bdc29a38fc53f4fc9d23f8a14ffad6e0bcfe7df6e85d44a42fb25704044c2c8cb0f325c5540a08d6f4c3237f93a403b4e04e516a3dec5bfb05b74224326f6a4d07228a524aec8d5d7fea3024deb56a9d5fc6849f224c53d781f24f561974696111180e5078c25346de70e2ffc07f6b9623035313348b5a0ada264344099c696da92584da10ff4e63d55cdeb3d166b0f46e003b621afb9cb35efd1b45e08dc87df7e5a6f3c36c5bcfdce70af93501c183d01e68bd4ecffde506cedbe30c218774d5ac7e89aa20f8ca34d4c2f4ff3d8a9f9f534de88aeac2ec54a88615b8ef0ab6864ce77a3359239c6f262c8f2b9f00c4d3c05a03f6948cf2d54fdb3e7e7ca79681a12ec4c4446de0ac50b7624d9e3b6fda28825e60547229efb5e78de8ba712017d210b4bdfb6cbb5d75b863cf62240f683cd554278be27ccde65538e90132e590be3c368537023c5ecb3c5d4a6a60997c4ed7060715d2d0689ac89ee4e2bfb90d0d9a154df3d4c5fcb75357c66339ec391792f78f5df84b365941d835f42ed0160c90d3eee490b7548362e614adf98b5d65d7c920e210677e682664c88f163661cd0ff712a14bfca6276aa8ad45f5944b2040000000000000000140b01020000000056bc8110e084dbc7619fb769cf933bfcf09e37fe31d1cf4d625c1c501bf32f0e63f0acb2592c8c6fb6745f74db3f6e0c1432fd57077f1ebf97d98a26c124a30838609dd5ac27de061266456fdd0d5ccccdc2b10c7e8ea16deee6de4d4c5f7aae0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005590090b738cad52e2c0deb7062ff00af541c1ea492a3824ddc7c69ddc71ddf7751b873071b36946806c6c8beaf0cbaa6c47f71857edc9dcd52e7b253abe3b4153ad64a0be1a848fd3a67a06fc703e7f3c3658453037863a27f5a06eb2baeb329d13ef8987a3d0972e12a0531bd39c1b1ccd21a127c04c9ed064af7e00968e6031aec46acf74b4b4c3cd714e63f9779922052784f081cfd1486d9f3b6e12a57dc031c866297120e368a05c4b4e7fae0964e21cddc02aa2c71ca4b51a266a445aed00b06d0ab34d3325c65b555233130283657100c0519e613883bee669815722b3efefdaec7c061c0899e2a85112278575965980638d1b7cd9df514ce753ca599535d03026104f3781d5029d5af17568c196bd8af645489da9c6062347697db856fd18803161697a1f72d91aa4923ea8e534e6f24a3abbe043eefc81d4085d5503a9acaf9020f3fcc7a63dad16108a5706a8dae6791bbf9cdb125d6aa633d7695c34e7243bc03178db95b595f5fe22a0e2ab6badec02fd48b82e3f62198558aa344923d83460b03182dc634b8779a3e5c5d407e4e2f890be97c73b198e195fc12f9ea6fa029be72d5b788caef59ce95d3996f9a0ec4a3587e47803dd03bd59760daa3231fa41f12d92e772448061cd9e38594996ae6948380efdf26713934b19ba23182244ecba6cff671eabe4bba985d3ef5f5c69c65051218d97612fe42c6a0179f9c1b3d37ee8a0b36fe60d93110680c3cb681890a89b60c907cab813996fd5a833db48743539462c0fd9812af9d5ca1eef3bc2dc4f36bf8e583dfcb35487f8bea322bfdb879475afd3230f6c12e963095e4928aa2bcd599405a17a06e3aec2239680acf8000a6bf4f17689a7cac79dcce85f7d29a7009e4c93375a3706237ce40f18aef60b6a20bc50bb03f312fee5f60556fa7b94c47d5d41e272b32994fe7e08ee3bcabadd9cb721a8768674fb97d4f047ab9521ceedd5ec48f9f7a46862f6ff12fad6f424549ada8e605aa162860e18926beb22740e5c51e088a1350392b015bd993381a04be90e04e10ef243a1a1b492af10aa07e4764d722c593da62498745aad4ee93de156d5dadb29dd1ceab94fb0ee0852c5a252c45eb037647d9cbc515235f4cfd66f2371504493c325089bc166964fd2a98962330688df5200897d8efd1d6f56be1e74f0d753e393461b19d6087b5cdff497856373c115123dea12e2e044c78f343c7850359357654bb253298695cfe4fb21f7033036dbf83e25d99168dd813c57074be14579f907055051aea172285f9c1bcf7c6a3faaa5fa5d3baf89d49e13c4f28876e41e9b11687082e7e28df17cdb6815e2be75d9845ec3cc491e54f61efe6efbf679d9ba48441d1e20a10057ef21d9da9504c7ea13997ad8fcdf82fa1f8efa1de988b8d06a75cf6ff8c7b9aba109d964fb8ef7a5dcaf74905d2c7c8aa1c016afc6cdf5ae8cc638400e74b83fa8046ffb13607c1267e777c12a8c9dc1554570f350ac0c9ccf4d368dcc230ef668320cd81fe04f2610127c7f6a53517d7eb64f357b8d858bd9c90050080f38174b7dd82a6dc37907c456d5e6b29ad01847bdaddc0feda06db3ade1b3312b6e11696fdb3f9dcf6bf683ee2daeab53e451fbd610a47907c49bcaab5f3e4740ddd24e793a215a9e41855f1fd266c40f37d5fdeeff036cc81cb8a66c55332ce47022d3e52935dcf064db392fdef0ca05808e764a33345a7705be0ab4c196970a60c7ebe056cc4ae8d9b8fa9dfa9c38d239c4ec99583662cc4d67c4994126b040346a5a340d164a40f21e093b10db0689fb291cc0c737eaf19ad24e2a3b0260794bf0b170d51e0a389968f6e201223098f84334e9388f0264d502ba10a184ac250993892419ae9365af344cfaffb3b21da6e39a545d58746a67245ddb1f088a92817efd501e0e37a9d457900036a11033b57b53a8a1bd19d3b20b4022dd8e754701badc64f25ed267de7c700deb19b509cc5d4a72a4a02415d696aa90710f42f65fd0154c463f0dd900dc59647dc215cd6aaf48d00313ae7b35368eb2a88b2fa580698f72abf4b3b2080ea10a3d595b54c954d7c906df4f24fbf687037305dc0aa5159d622938e90ed20dff7a566a496b7d4634b10ed0f48bec4b1904c41f30e36e3874083b69539c8754a5bc487ab54a241be5a9c70212e29aa0bd0bdc5db9412f128a17b313b7afd432796170c4e8cc0e29f28469c5d7ee9c87754f19eec80450eb93e864cf3e30e4ae4ad8ccb8241c92a03ef9e659605a692dae500a11f854616ce0d582ed5d999313b4b35fcac0f4bfb22680a95f2cc55e68b05b61287fd8052a5f33e4bc6330c0fefd5a2975c95327a0cfd955e9c086a7db5a6f07d2a967b52f2cf54a6737560d1e9b40f61eebae29da53b56e24cc688f71f0ae483a1da832d739ece0e", "", 0, -1220965910, 0, "b81e17209896bce8269392e7b415042da0f86ea6f9cf08e1d8444118ab0efdb3"], + ["030000807082c40304ec0b0dfdf8561f67bce42e11568d27b34fe72b04ba9eb7cb64820e4b0dc3d9e5000000000951ac6a63525200655313ce5d3734e975855fa75f6231c5ed5ce96b6e0bc40d635cb002341d655800469b1853c000000000036a51ac3bc8cf03f718ea605160797e6faf9e33930c9493416bfff094ea5d9cbd3e85a8179983af0000000001acfffffffff95c7d91ea63893f77f13d1c81a3d70cb95bcccc4bdb1d76bf0b8ac3ee039aac01000000060065656a65002a6df8be04511a55030000000003636300089f7f010000000003006a651778eb000000000003006351753d4f050000000002ac6300000000691474e70300000000000000009ef46a0200000000317f0b68537a41f31f4ca1e4d86e74f3f92020410697080e9362a660f63be18f1a76ecbd0ad9652b93f81e16cdace9c5b7d02750739d55984df5bf6175061fedebceb9a5987213cec332bf9311ab8fca463ab85361129b7c181233f438ecd54500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000da87f8452366fca46ab3c971c82fc82d5020b9859e49598c38f286a9001881c0f24d5280d967b54ce105269f60c60c170bb8b3d7e1c5e5949797eb090f3601d82df0ff64214b9830578d890d378093d2674f05f4aa80ff93ef25e9b83788f6c294829ca74f97f9a82e3042acc16b2cabc299196983c2f628ce2a3fb864d38634021d1f753e38c32a651c754d87dae4ff4f4cfffb937cf3f1fda261bc9cbac947ae022e7cc98a65fd172d027225a149e1b904dfa089abb659e9715cf58d11840ecfbf0a000f801e45c61ecdfe302292137dce524cf9069cf0c10ad07dfad94d1fe3580b8cb30a358c6d0768c2ee1b78cbb4022f7b0a1df7cbd8d1a18a6ee12c15a175bc0224975ee67243fac5b8675c3b8263dc8bbb0c2af6dc3286d1d75c6da88438bacb031de10d068a870f66fbb9c1994a59c0619bd078cdeef53af43068159a6830419d031923142317da6334e174b2556c5affaf9ced816ec9561be526b95c7ae81dc508031286c32d3f54faa24a8dca95c195765cf64e0940013a821af8829ac089176d30020faaa9ae4073f7caf9ab53185b71aac6b9aae1171a57b4b5aa399983ea06474466a25123ea650b7baca13a361eea018e5c6dc5e4dd943f0520f336be28ce5606f80afa18f08df3a904c03447ed50ff81ffa85cc01fd4116355811fb4ad19f10db56cad17110fa170de742b1e7e85aa52f2a245b51610b5790d1d38f101e84f1a0bc05bcb81071c5587b44f8fc8f07ef6ef9c372a2313668d70a459b8e19f4ebb92c7c7144a48cec17051ed947cdab4f3684abe0037261eac3da8ec33ce24070fac599756eee3bbf93556fb3fceb39df9f2c986700fb680aaa40db21ea6e372aca19b0ad0b58e1803f1ac9f2c96504dc3872d03137889b9096f609bfa1a6a671ea6382da5d84a9a1fa36e8abd2546870e6d1f146053be18bf682e5db2a39f26bc9ef3f040a1a9d5e3fb5d99c466a08c64fe1f64f2cfc0dd39d13334f12d0770b814c73ee45e2d0f15ecc8d42c084002ec559f483595ceff89207deda43a345a2f1155f8ca147e7b6597400f5ccb3999d98bd2db8e576d01ca49b5f5a13eabe9b6e7bb520e204cd5057761825ddc44fb5c08e0b02b8d16984b7dac0db4a5fc4d077ee22d5ff8fc36594f4347faec4caf0b4390432480e92db8b670e044c8634fd8b0473560cb4cd58e3ce5fb58d106dbb2fe28de52bc3664f67c4870ed602a5f4b39ce8c715ae8025ecc9589f80d949a0e8a0452844dfe06ad3aaed28750fac2e6cec84617fce95714e500ff8975a91ac99f113f87506618c2535a3a086d1979b46b25c8f96f111ca0ebe090da613eb1786ab630414ca12511e738c1f3da20d4e332db8d60822ca39d0425f30aa04565788a17db3c6ab474a2c587e32782dd5cd309cd97d563d98332362c75eedce7e4f6cdea0986f95527445364e885f11f89dd5a71a586401d0dcc8d6b3466c5ce2d019e57384c037ef6ffd2bf8d6aa939d997b8febc1e817d0f0e61807240d27cabe46e3461caabb7509681479d1df1ae413d53c78dee290cd75254f19e70cff23172c8281e4244286f51f43717057240f5930bc5c306f6a7812b93f081ef65167fbdbddef91ea9d58c7e602027d25ba5b2be4e57761e82cbf8bc341ec0c3cb558fef045156adbf2fcc441529043a9e52580b4c50af80c54369a15b30bd04e5f7e782775326f86f1c571eb40dcfd48d2223463ee06afa2e8aa1d99d2804c2c6e11c5aa12e7abd4778f8a8164600ee883a383f0d0b3801752299f2fb7e361e2d09bbb0771d76ef28787927998b4dc8c781fa40d251ca5b4cd3130e2004ec6a11a0f1430526f76142f66f25342e521e5164194b3321306406e4f2be53bcaf2d004b06808c88752fccd13d7eca2d86365c64790f1f6dfe7e69407a7a08a38eafcb3850c0c72188a25d2163cb979e43526339a92076f5043207036b878abfa6cb4990b7488cb3ad8ce74aad433a15db42ddd5e423a6bdb3fcc45829e6807169a251e66c43c74ad379d817f5a78ac8cf7c6fe6e69b2b311d694e7eee80aaf1ef1df24d2ad5d62c26aea73446f4e40b160e31fed2b9e784c1644f3533fdd95c998deff28d0089e9d5ff95c25c3446fd8a75a8124b63f99f8ced06baa4bb14ab42e10f159cf63b9918039e5456d73ee8c7c0cb0ab6a746221c2b6fde36ba4265aae97c9733557817cf041730237b0e8911d3ddf4722bb61cb3301a365c61cd073377acb776153b86332d4f351abe350c43505bb619b3fc0ffa7df1f0922e0ba5958f995679abb3800000000000000000cbf6e30200000000211b3305cd3aeb9802702c7a31ca8599b7c433d8dd5d8da786ee456c8d162913713ff010e134f5197af65caeb23dc94470a2465fa59fb83e762e126f5a1ebe2134cba145e419d9ef37dd93e9b65ae5a883e42ba414c894213a8e5d6900c0e58800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000605124ec34ef74469c7d42a4c4307ee943c0ad67898b656d19028048dd8130c12c83bc61eeb9256c1372572e188808bfbd759a05abd4c8a42c245d415a11dd7ae8bcd886fabbdc748a67d15ba30834ceaedcdc4807410792214a0938f59b5736bee9024b6b91e3dffe2b56280fd9857f41f2de4a8140029deb779eba0f1e3aa6030716b62a831453b646b35d567ddef603f5288aea108d1fcbb658e046125cf1d1030f3b14d65bcf360fa15326d2735bd40673c2fb6fcd5091812bab6e3f7a5ff46a0a07f3cb97c452224e9639660a8caee0d11519563f4d8591433a437e6b5dc23d2ecdd3f8b5abcc157a71cc0ed8dcce58071dd678c0c45c7015961db6b3d759779d032d05ca4490f770c75d4b957532d5a456eea8eb60409ebeb807180bbca6af9511030a4041cf7c2e2464d8258bfd3771b08a30220eef372c6ad1536be6420408f2d102095c27c54e32169ed375e5ff8803c33892b2ecd6f486905d5045878178e09eef032d12ce3f9d4b0454ea896200a1879ecd153e69ffa5ffac44d24116eb456dcb5e020858c06027cf93236f6e083adea1a003b88c9827293620b784f255315a5b7d8a1d948057bd0f2994114eefd16a6a2bf0493c53f1b0cd2a7aedc05e8fb2d9e70f9dc2a265a527d1ae2bc2c189526199abe724d58048e70b82e8442cb7cd0bd9fb7e1323045df625df693481dcc30f709aa3ffe5322b018badb8aed3e8c07809d55aabeb1f52a0e1c526cef0e5751e67c97af590dbe589b10a6fc03859709119be2016bc3adf64c45cf092e547f967e55634365a2a9dc9de6310e8c4de170a5cba3ae14e6f7b727acb0ccd63a726b0f8e45650261a8ec1d74fe93c069f3502f822b9cc95414f418d47505add8a00fafa9fa2a0c492af253beb92b534c12b035ef525ba0e13e9f8f3b63c574d5b8190cd6d6bd607e1f0c3adf48e049afda9a020118e814d6736b498cfae41bd723c10b35b511ae3f4bbf7572ba01875584547c0f96145e94c9b3304e2a8a6af7ff30751983e0900e82ea248f19e481e2d18cab8a0427c6ec0f760675fe2a8f1cb3451d91d6404d4e0321c3b648ad73f05594160a9ff31015014d27f001c3b74b16b6c5c7471ba817272ed86a34120e6648f61522a47800cb6a2f5c211d2b408d866d189f69e4c6f7ab07bd76674d813e019b4c674be827f612cab1ff49a35f3e95235eb864951b7deffbfb71c16d4a4f5ac6e90b2a23c517a8484029942e70e37e00aefbd55febf8866b78dda500b842817922da6348603cd2da21019043a0cca8ca0e4293b276c6d59a3306924053b585839874434dc3ebce997814468df54738addb9630c2e1c09e8b2401294368b7b3e827c640813e5145f82cedfec241f68edc360e463e9becf5312e12c671232f946f59b5f6ccf5437652c26ee37bc9a18aabb13363ad68d4bd5b6a8a26aac048221bc61e65a686ca36df2c8ace01b8838ec3d55ce8bd67da374ba797cd7e1ef3cecfd45de36fc9b8ee0dff7c04193990d86d5c3f20297d0bfbe6d0ee688f42bf9c473a48b8ab1be0972eb6b63a5930d5b0f41d7dc2e7d6386923a3962871797f4b43e0cf50efda8509a243c278854ea87f6a4b8c2092a64648d721bce072fc6153ce2b3f75d9bb9b6d4753dbf8ee909a32d3b21f3a4b85cb5290d6dcb2db85a2faac2e98569fee5e3d992cfa1a1436feca5582477b5c0dae6c56aa11d36ae512d6e9a1f28ab047fca72d361abc3900b024d5a8b398295dbcc369c763e4ee061d8c554b1e28092d14c7fda7081104c957a40ab75b4de8616f658de921fa9c34fb84bab2c375fefb089329355ca67682e44a34db465b609346c16fd7fe3d73def56c28abe856d723a2328d4eceed643214a189ea632616e1d0b7aff30ddd0780c5fce514b9da97c909934bcd0b8a42fed7d726dc050fee5d53a4cf492f30b3536a9be028094576c2cc5fd2017d9ef25cbc711cf506ada0be9387b103b992d8362e3e4606dc0f18161d1e83fdc490101b1836e5be76aa1db00cc193cde698fd81a800fbd143d8493a7041aa717133ee0c142a472733cc86726e6e68f01086cc99bac57a1329ec35947ab67bb122d5339ed15eeb578de6466e99a3f2377c315be7ed09c23c8781797aa69fd7a3aaa307d1762e38758a68af7d67419679c9759b49c193aad38446c33195a46091cf896e9cfb31db1ecf18bbb4d753f7cd1539084533d24aa1bcd24ca71c4e8e1cbc2476839f758b7a16dd31a264bb0fd75d7d93db9b131c11c0490a10e87db26d481b4c8c196420eeb4bebdabc6fff01000000000000000000000000ed4603d80f9e9628045e9b4564e8fb2a3cb13e0d9e054f3732790beb5dad4a6798230155be0e27721fa033ccdefd6d4e7bfe996371fd3cdfcd46cebf635eee8c02ed46f9f063b227092afa88da8ae680c8a8dbf55adfb52330048b647965425c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000125ff4cf9f5a8534ba8f72c9995b016992c40fc411a1178c53c2b11fec3c1c429a0d64e7cd1d508543b0bb3e21d5a95a78d0e8f2b704e7055704c6dd6163720e06ebbd3d06e71b4e31c2725402729a42d0d00d250d31d2c62930aa2ac6d4a8dc169776a493d0b0439456feea36512d38058814fea2a421ab6c1fcae390fb565c022bf08d001ae41d41a68d45915a31c3db84d1f52e36f8051d4d134a89ec338f900308039f6048e656c13d5daad3988911ee68b2105f9ea76b208035b1ab6754db810b0704274a564d08370554d170549208e96fe4c41288b7c3d0c0b2d19a4dcb6869555e8d4e8335a43f89023dc6d3947b8ba93d3bf6f2dfbfed1e2b22312789776503209fc09e79051fce1de77658cd55c2761bc2e7d9bbff95b80c36c7bd7dc56447030b5d5d5dcbf9065a0d141b46d0f7ba91760cb029e43a0fcf58380ad6220be26d0219c94ad19f92fee099c58c3e2d9005981cb847089c9dee3f59ccf563d2548d48031d168a44f1783a10f1090d40f4d64175063d91378964b2ca96a3f8836c8f6380032151da995d33b38ba9f66f81eef40a9894d5fb63e9c0f81645439989f59c88326ea8c253c0c8a30e1e4262a6a6a19cd219648e4521e684b1b9a7663cc3e1f242f508ffe8c89816fd92459d396248f46572f98c5bda493868131efd58efb55b90927e54dba35cb75e7cd08ad08c6b87b4f08d2990cf081aa8adaec6cfc2e352b1de61937c7a330a9a8f184a615924ea84617ff359b4cbb73ba6d5d8b944a31d0c4cfcc358e9305d37dcd2c5ac6fd7a73bb7ab2ac2a72166def7a5ad8d7935cc152aa6f1eb63293e09aae3e6fde0baa57553c18aa1aeaaf936e42d5af7ba9d5199889b6983863a772859a3267dd2d8a268b1d2a5038e41768aeffa4dcf55a189eff8209ce4d80c3754d87eb26e888fe5e9c3f34559ee32fba4da4cbad62520b1305aedf16f81620dda5bf0f71df9018ba71f2a0aa07a1a48dc68ef208b98e45cb7c8b14cfe57cbfd6bba187f36baf0b5b6ca930f91bd7b79f648d12e41c8803aa1749a94a7df8ef305d0e3fa23f41eca39a8586968cf938b685343c0e79c244044d2fbafc44ae1e99f0d9b59112b69f43a1c0c29593060b0c63e043a730f3420a2b17eb6df4e045cde42b85c1ca1c9e8630d7f11a469067ce2d478c3c8a495b20ddbc9396bc2dce02bd0dc18ba183a259df5637633034c9caa13c021b612a55d57c73ac65580a8484a967aff1e5b3bc7a8c79ad53276801f3a538fdb7a390ce953d0040eea1e20ddcb977c3e4393fba2d6176f5b696f862c8d58505d696bf68d706313dbd7c0d99f2d0d613f5d5189f45747d40e94d11afa6bcd67d28f62c2f36c6f3053b68a8ef7bdff8ba5537a223716a201f05f58a026b09113cba1f1d3059af69aba6a732d2ee0d72f0c3dee58a3ea199648ec83afe65d25c785da5a2c911c165dd2fc690d5884d76671d48abf8de575b11203bf2c0eb518132169102fdd0c9b1d1c3cf56ffee314cea986d2a335be85a1b237790a7d7b62d05f8d8186c1aabd4b3bfa03e6decb326d78042d9b4344e10a25b0f60ac370bb179c6031fb45c873b1ba480dd5fe1cc7c6b4828805d00317b739f3a32a0a403671c73e0da58f1a07acdbb7b96b5d5c68551f4ae6b5fc2d7ffa07e47b40535432902d88f5e41180ee7b07c3e98d6c334ac997539ec15c84c95281b85efdd81bb6e4a89d78536088f6c1abdbaf77e235353fb7de45fb91273148c6b212330a31153535eb32040f4c11098c0c7aa08f2d5b8928e2bb3b759c847e0be816f4a2ccdac898a37facf8f1bb974223b3f4665c81d31a68bfee9ea3fc7e7c643a30ef00125638490ef314fdb3b13fc165e642c9dce1d5556c48ff20823af1bf6a15ce3eb1806bd3a92e4a16b75eed4729f2843e00b0d099a83857b4a2370745308e2d2026f07a2aab6bf7a5c4b834712d4a061e9965efd9fb9403e522789c92a53590f381a1d407a1598a0166d7e2b2e137cb1f9657cf2ef075af67d1ba528fb7b131840bd8e3dfe7c6b64052482b769bc3239b873852a777bfee8f559483f1fffce943acfff836bd4d6f71cf0942ad1cf788cb60867d5874601e222e4a661a271e8780c7080418afb4fb09dbbfd809657fd866ec87a46c8ef9c618dd60bd38c553626f293733f49dc937670d1924fd034aeeb353a29e0071bbe6202895090c3c31f043e42cac69c396e6e29cd516e76ee18501501932d8f539ee23407622a4efe4128c1fbcf1638db13511b60fc7bece2ade8baad64ff73daf95d4beda37c0d24f15b04a5029dc75a7ebb67a44e95c0392f98ff97bdaa2d726f025189918bb58b80efa0cc64e485c5a80cfd8ce060d219953d2c4666afe913d467f08c2c37d239aeeaa4731e2f0de6ea53a40bb2fb867a9ff189a0bc63e857dcaa05b0c", "5163ac00", 2, 1533195145, 0, "83f24879bc1b7b87f271eec21b233314b416f4b5f8308cace50352611717580a"], + ["66caf51402bc668a943b00b8cd0fc2eadd34c8799dbc532aedfb9c8ac098c5cfab3e51354901000000036a6353ffffffffe92116922fdf814202a638057b264fd025ccdc6f6bf569ece40ac0a4df862fd401000000046aac6363ffffffff01e8a377000000000000e1ff705003000000000000000052ff6e020000000003d7f3e152d7c9f64a02a41f4ccea972057b997bdb95676211d374401ae2cc48370ff9752ed04723285b757bc36f5cf5c0f0d7b6fd895ff6ab3fe63e77c5a0376168bb5d048cc7b932c3a0b8a26d390e418416c1fe3053df88671a07f5d6f80b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009383323cb1b69b76e45c09007d2d3fab8a209a856f7e19d2df38f880ff6ae77da47c78fd17ac11ee280b6afcda5b2c36075519f86402e208030ac91edaac38f3c46efb6ee7e911427f376bbfc7c5beb672197dd633d7c1afff15fbfe2659b1d23cd5047413048ebd480d0d01d8b085cb1e254c7e86f792ab4e746b486fc614ed032a69828afcfb502f2f2ac8d53b3b7a1b2e3b3ba5e3f34836eea12d28afbddb82021d4834f178b24a9b3638dadb947a49b9ed20e693a7d549b89bf5fa7c904657b70a0809a791c1869e85483f1826070db20bdace2706bfbaf3fd8565f367974984ae2c233764d9ed17bb09e369f597d51e91ee928efe31396a0bfa26d23e4441cb7d03025c6b91310a630438eba58d387cf4af0210fccede4dda97f57e91bffd91221202151598bdc703105cb442d89fc5f06f72cd9eebc23df9b0cedb82886f358420a3022125bf040b150fcfe43f120aebb22d923a438cdd820823c6aa14f9d7114247b60219b06d251646dbd3065403701928fd3350473a1420016cd180843dc64fd2a230032e3dc9ae25a51eeb9cd55e33f4f2dc0edffa6e7997aa690bb9967ca9c94f6a52687561a59c69569aef8dfc080a02f965a05233b203fd9bbbbae5ea1154e14f1f913528a53976d64e44e93f5c6883109cba6d4daf8d55a73ade88a2fe127738af6cce526d4aac8ed5a4d03b81a2ade37ef423d0018772134bd59120f34d367a0510d3b34320b65d41c76432687697ee251ec9b35c55992a48e472efc18b0a66b10dd974a2438d3ef2618cfce8680220edbd80ca43a15977e360200c080af5b1e923698d3420ed53bc3a4e71508fe84f811c12f498a4ec3bd8268851cfa93d33d1ba0ece32de6d4cd97214f95767f4a9447b97aa0b450c205581730e045ec86591497aa27495da978e8371141e6ec48bf3577521499d27e8520790c2107854b5b08302b39a800c7d35e48bf4d50c7b9807de7604724cabefe58200a983526d15e62fde36bd45b535b62ad14abb4d772cc401f327512ef027bed96d4782375a7426f65b52cd45dc46a67f1b6b401397a35e67bd6e6ec2e7120e3f622f19a6fbc610e1fc6db1351c54848fde7023601e4ff9d795702fb035813a605130c78572d869c9141245c8e3fa15ccf7a40ecd0219701f4bb4c7ccbe63fb1fd1a5bc4a63ebebdcb9b87604965a4c0458bdd152a7e76f7edce1c4981ac3f5626f53ae1fc90f6137595b7f06abc0e330bf623babf8b6c5291c1fd10d30b04643f2b2f7eb0dc99f724294aa4bd53ec6cd3c265b7f357c9754575d755556ce0bebb1bb455f46ccbca0878dcd393f52c3cdb2e520b16da53241bad8ac6b4fee0e42dabd388f9484fa98ac1141a033a3ddacba2d75f36ef1ba7c0a90ec32d9b3e6f9c2c4229a6a89766fe84130f55633d5fbc5f60fae84b5e2f92f1e4f502c9459e1b8b3cca58f1c920068320140fcb77663b9fcd4f3d7a7ef5d9b029192ea447b901157b9e433d2431b457bf807abd12451e6e72188116407aec692176e04f5db2e7d8af9e99accb52a58e0a3d6b4436af0940607e3928517dc125b947b19938c8feeeae1b01f794d0753bd85d949680ecd84bc653fe87914650d8fe4b98cfc5c874c40b24f6d5837340f8ee9934e599008f3ac293474f0a880dd4b07ddda47f5198a0e587f2a96b127ec675659408ec5e6a6350feb5c1ccfa816d8be842d17c8dd50fc1079a585fdfbe65796895da6335296ee87f5b17648052833b7a00fa28e74a1b39a66d10f8606d52705decf4b6c7966e49c9fe1d179cb6d3dc8f8083fb113e0437418c8166ddcf1413baf50e0e7647c75d9a900f00eb8f5dd2892b180cc75b04e6977e2c4515aa4a8446eb1034d248e9bac3dac7efa537c24658a2858bb4df4f453261bed4faca63dea8a8a62a4ae3b314e6dbc0523cc1ef033a9d3447ee262aca0b2b429005ef83abe9257f8780feb0665d7ce935dad17d3bf606d18588b5e0ace420e3e907077514b7e1c6218ccd4d9eaf7cbb7fdfa459e4f568ffbbb8e875f4a0ff82ab03519f4390cb6ba621a8e579cca48033afb5fc739b1519249c6e4def3453b6dcf929f84400e15b37d6c89cd8353274327ab4361d0806c536e5594e9105df197f1dcbfe079b6dc62331ffb9a80b2ab51e02b76ca789606f9963830af4663a9409cc6336799f39bd2d50e0dee181bbcfb9da1e82ae54f84ecc1c730cc920f2bca5aaaa392d3f17952650b4fe25adc7ce5882d5fd07187951845d7448c61f2b1a167e02c374f693ac937ab12c729124a0d379a28b148b6010000000000000000000000007a59f617d956c05c5178804f5ecc64cae54e5aee988976761df592bc98fa69f22c414f43c020cfc3a510f5694510bcbf902ea00ed1f98e0ffcb722cb61bc39a95abc9230de56e830cfe8fe832c312cc2b2a064a2ecea2924273b83bfd5693d85000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001277f24025ed92754600d7cf6171360bae2c0eeddab63c32e90cd8f4d8b80636ab876522cff30cff268fe26ec1a424808134ca62f1423d3d1b070b59425dfeb566512d20f0b4d215b39708b545be53e5e756132818399891f8d3a5ad81129ae8ff174743b8e60d71d18eb51d834a8d96e16b2a68f4f6f8ca7327a96e78a30f4a02154306cea74671cf390f6e0bd5877302832cc1bf534fd61243bb1a941279506b030d3108b49f6b337a84bfcada2d0cf143fa81d5f726c028769d2e02af784e5c600b076176b17c9c10854c5b63579cd9aa6d494b3a083e7c6893fa2f80cfcc1795abc221737c113855fad4b5e1750346c9cebf443fa42d841b837dcc1ac3d121b58e032295edff309fe502c61c14d720a9be8f22013648539478ca9304d92fe0f993d102253cb04a7d73b9001ce4f2f39a63a06ac2f8b5968aa2b59f20ef7f3d2046c4f20215b388d48cdbd107f58d5cfae67c43ea5713425d59e476b75c4303a865d2eb68021ba2146814d816fcf9b5b29e9035678f410213c522ab0a8148bbe55354631bb80214e0e371ed3deb76dcb9bdb41640950f9496ae4087808f05261f72a3b354536a03515a9d8d1417feaa6d182ea82076d3ad319976d31194e2ff94fe50628aced86dfa921fbbfb9675e19ad0a1372479d9f8890d203ca1a469fe6ac432c564c8fdc8c3607ae40c540f8c6202f27c6b0f527511bff5d4bcff1155dac04ddfb4da1bb786832992f54625e65633e956cf743f251679eb3f72122d3fcdc38df84ae2c372747de6d0f0a72c83bcef43af57097399a57eadc695cfec14c758cb903471cf5028dfa42c07bc10ef23952c1ca2a259f5485853d1c14e4687804361bee18e492581b8cdc5f1884769c76e1ae89d53ea3a7901a4f3805e55206ebb13d9022135ce24868f9c77d18a84136f17dda1b5537c93a9df7c82570c5388af463cdf634582669c4a77772a1e3997276b10db1cd1cd859e180d870722d0d776e81d67010afadd5b01a5a1fd036d75ef2cde498886d87a7bc5cb332efc78620cec0002c357d8460a7eb9f1c8962616f365b2bd53dc1d952fd28ad7b52839f56fec6a13b82b4aea69159d2882f2c7dd6c875aef4c4e6847bb597682db2908a748d0331b9102e968f096b13b013df04b29b6190f0f7b40bff3d3c49464da2b58a08465a1212a2e5e2a71e3339df128b97a6c9e39b984fe99dc07c99ba4c6623894d08b23fb85d2a353f6d3a88e129f7ebdd8fddcdb64d0821ea8824cc5281841ea53e0cbbe90656c590c15d0c46a4ae95569cfbf2fe941fc643d3de9ec2e16ae16730d00952723d58e38f8a7bfd89ebc2a4823052382f14c7c35489de99c6af43d33943582ee42062de97837d9b29ed59dc94241e5dcaf4a3487a52f8e4d4818ae789602cd1c4f2293214d930a65812c9aaece05dcf0cf6c83cd58c7818cbad9557e7fadda702b478452e46228b1170b50f59bcb82c00315b7067b0d81838203606ffbb18fd521c810afdfc9f3a3286829523c3f7b46bcfb5433a5e89b4d1708356f2fc8379ea665711ba53f1aeeb535ef354f7bdbff1be5bb5e42abd9ceabf1716392e918c4570f7d6f1844fb45af1111726b0c212a324e20d54148bb6eeb7af1c4801bb4dda9f8659ab2dd2d7ebe93160266107768d07429b89a37a08a31a885b166bea5d1772343bcee9b3bfaae2e73eecab3136c5f71c24539871b20319e704be25e4609ea3b00a068695e90e0df07934f1bccc86743da77a94676dc0e4a7793f75045487ef867f43d3b9d6d37b8b28b85616e429a362f8bfefcb7e2c21e00d820ba2b9e3b8a38f073376f84037c3bb8febcaa61e1c858968f346556d5f6b76cdced7708acca684dd22182a43133750a392c4b71c03898a88e342d75bd9c552e61e4bde119318a5a1ba97ddc6f67c0deefc6d5a7016048eef0a7977b96ab848b1261b636f3952a68516d02b866f0fde7557f23ad3b0218d82bcea9ec0a017ab9bfd88f8244686363483c8f28eef4273709dfb5c623d079ed57c54132cb19004d667552fb6ee3def4189a28901039759eda55d576578a6cbb029603e076c48feb2ff6eeac1760004aad54947ee9ecdecf550d6fa291e1f6d9d523e89d791984bb120b83d4965cf574938be4000d5f15aea8cbedc058a6b4c1404e5832e0324f972f77876f64f60190ff189face8c86b5084ff38f1f2ea51c62ea9064d2975912da6834d93f101ffa810d1208bc05b173aceb35a0d7fe37f339a1dd0bcf3fd95c61d273979de8d0b2957b2ea464b27be290f643bffcd2fd91e4505000000000000000000000000f97f387f73cf3c0316be5000a1d688321576d114db135229ecc513fd5f040dbd911b5b2ca9979ff6c30fccb113f10663b911f78382911cb2427a58ddbcf4d62b8c4225aa3a3b9a128e073048f355877c6ac57a377242f0cd64bcb4a0ab6c12280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023c1c121d1e5882b2d03302d45c84ce52d27ecfbf331014a7cdead9355b1473938a0b5e314a7eab19227f2e8cff1a2a5479243b6d4bd0de8bde094e1403679115afd042cac388d71c100095cfc74e33f887b304aacf7f60e80beaed94e23a828ad15997ff3e7150810b0498be76f524c6b8593752c0a00f2991bc4b68b1a740b0302cb7c61f56b86b63e6b2adbf2f617476115adbe713c1ebe1132d09333b604e8021a49e3586f92c71da70c581f3918a2ef01b95a6ed40b4021a904ac280edbdd9a0b06bba89ee11f0c73f3ea607696fc46ac2dabccc23fe720a5cfb510db739494cd477400a3497d7650118de9225d4bf8dfdf7336614dcdb16092706e66b5b71da103259b631cd56e298a7fac4864da73d76c8826fbb09c050f3888d776aaf86176160319e8aa7e085b4c7f1560a7aa5c4c0ed73aa6aae08cb675140c6b494d72eef3de0300c48c8d66f2cb4a2e6c12218e8b99cb43307cfab69449f166068f32a4076ada032ab8083f4f25a1712dbf906e8d33d33527200cfe1fee90c61e8150ee26c37ec203100c55386c8fac531e9c8241ffb9af49b0e6a93624cea0242da6cc49c9dd0914157c571004f153b7b7e9d0bb630ee2c8c3710be2d0a35886c01e553c036e69922bd181d0a814c4d50f9e7c99f91b63bfaee523853b282c755f6f78687e60973e23b823e439025bb26a05adc1b445010559c1d176fd4fa1e03ec1bd19b1c41cf286918961d1f231f1058ad9d3b79a7790d6bb0265d7e51280a68ba8c36ce98b2659638b10567941fbc3aa3e34af081ed071712f86ee7224c4c83c41d4cd985d3151d7aa847041d343968d28b7fd8bd2cf278544a70957bf89a47855e84e3bdb30fdb3aa5b4da67dd1fb6bf1c4d2abc3e65b585b3538123429d38712fbe5cb0a8802f0793edb24544b3c923d408743abb2113704705b177d0cfca4a653b04f56e87cfd7ff6c454bd379303a297657cad9641b0d0e9fb51da67ee76cf6e473cac75d8f2b6678be09b6147d5b7cc550708d1d82115c9f8b0d25f612abc8dc007a02578ad220c490af64e4a0b945ed84507c39e0f9f01cd0420d4e5c00ec92d2d7b9247170412bda3465e5d61e74c04aa25376f8a164f5309cfe3c27ede8a780ad8abeec31d2057e2a258cea754fc0a3352c0ce3f1ae28d0f3fd634cd3897cb4f97a75d6647d7d11395bd0c463bea2d3961d5c6732c78ff4786ebb0178e595d8a78cb4e8a1c48c7468cb258354ba90a14b2c82ca5f130976e7a7650364cbe54c789665d16334637ac03d6e2f7a9c2c606ee8d6e5469f7ace775eed53b904a50201db33d932430fb140d8ef9e767f61f4a11cb775db8fbbe1fb7fbd81b4cf1819741dce9ebcfb31977e7f1774df5ba8e1842add5a9c61e3a03749f1c0ffaf03c4c8d5c23b71eb584ba81a57176dcacbdda1c9f6837d99aa8569092c7e683991971a3fbd1a168c8309621d26068a77ed88f8fee61670b2eb076e7d38ecf2fc73d80591a9446d4651651d247a9a3c6de2b281000e2ca92d87e07ba74d7a6255369cacb87308318ffacbc20d8a0f080cbdf7cfc2f598a9b6c33c3f6d944eb3068dc07ffcd29ad4ead8302b6cde0ea9cbf2c6926422c0aa48a1e542d97ed17288cba1282a08fe9f016763754988f968b5250124a38cd58c668b79307ed991255f5319516e79baa77dfcb361d3187ad86d7ebb6057047387cee9322c9287399c8b745f9f36bb1a010ef11c4966899f63a5935d0a3da1ff61ea0efc817ce276997282237ed768e0695e4fb7fe6c4915ab376fda365b278cac9a9e1d1c854d7616926ac931bb8e6042b10b3c4b072b053d4219fce7e5e2bc1933264212eeb7b4a2ab8fb8e8672c21f43d249ed164176e8f2ca2ae47b42946e74ccd9d8ed206bddef567305baf525b4d811c84b8d2afdca042d6c0ce9eb856f2048e4f470b761215a7a2b59d7afe4a2be15155cef7619df22da8be898889025d632425f7774bb81a384f03373279d1cdc2e7d2a815e5a1584f6f993a5be01d6f0f4f5848ad0c6a77ef15772ea8f8471da5003f91759bd8dd131e8ca9f06335d2440fbb5c8ecb99f67ae8cc9a512d60a99cea9cfd4e0850b9be4db40daf7e8847e5c00b3ab001b9ad4a022aac6c55864acac669b7a45a658fbe21fc73a198192179cb3d423ee75be126ee875808a25faa3860631bfa5578c7d67599f9337d4efb5d0deca9c7575b8a039e42d598dee1568faaceb3db62158ca6a7fd01479eb498252baafb82f68dc213f50ae611587f50fa3acb33c1c85942aad5e19cb52e83a64f2964871704b25bd4c326d248f416b93078c6ed352bf484f1085dca22ace064ca414c04d03c758bfa72054dcb75bd682d521f725b928adf0def913575d57e20f90c341201e98623866a3fd039475c52139a55cfd8381759977099e54ec1307", "63ac53", 1, 390593626, 1537743641, "0bb17d5650a3c35aaa2e163ce508980879c681d70cfd41964002da4f4e881cd9"], + ["030000807082c40304b3ca7695683f07e6b5030f750d39e07cc12e9f63fb9a5e9d307a4d64cad430240000000002526affffffff66f882eed6fe190588a6355c12e227812b7a53f494f8e8f658cca7f12cb282450100000007515351ac655253ffffffff892d22220edf1e4a067a91d2088106ba0e1b058fb48d4142b6d4ba08a3d287ee0100000005536a0053005c951c097d09cd2a12e723c82d8250594b990b0aef27012c0fc84f994bf26b8c8183c3780100000000ba7a73db02502d3b050000000005525165ac009e654b050000000001ac00000000d802cca303000000000000000002e19503000000001ff3103206e72a5926d1bbbde6f8c8ae89360244bdd7834dfd07381f74956d9602496d93d462b09bca017a1d836d74a8ca4c9e37bf71e03dfbe857194015ee4a946cb4e040a4a6a1ce13b0920475fcdc8ffd522a4dd5a51e0d648b65487c484a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f6426671fbdc0cc7e7574024ccf2a0190304af8f0a0f07f28d51e2c76a05943f3085af78f9410bcdb0a6bf7a2a4d685fc59fbe705873c699824ff055b477fce367d4d1911bbcd753c60f2a69ac015ed5c63d371b8fa9a185b376df7e1c8e231870cc05ac244825516e7a2a152e006e7ebb0e8f1d701b8d43c1a5dc45fe487a5f020392c7547c08687acdba70dcfc345af383607727c94425abcb181ac08c41dcb903175c44ed7faa01508a5537ae2989eefdc328e98edb73c29675a1f3341888d7610b02ccd5db79d2cf505187ff1d2121ed619e267b887eca1ab2f98f90054b16453ca6fefc166990f0e48e7b6f877647bd2f4aa2fa573d310051a33476313d07d898020bc6a88b010a263fc954262e88f3cc4f339d14ad0b9eabae62e6142f139c426402053b0809a4089cb9cbbb0b25180406d0ac66ddf708988d36323d48dcdcad64d80214b0d8f9526c4f5cc720953857b4386793d4be6b6999ed19592ef2cf2d1014fd022bd9d1666d9869958c587c210d7425dd408c7b2f1e01fed06926dcb136bf35df032441cb61303184bc29909b87670114b59584bd9326991a6217c0b4fcd50039fe7df799942b05677b334280512134b8793f5a7b06029502f605866a05272da4140d82e35d8cda0f15318f8411bc03e9149db623ce3f3de24d57ea09368f78c04d032bd4e97b7ee48c5dac74d4b520513c5f4846cb972eaba50b347b045781cd260e3d8cab6641cbd97f36e77c07c624c6edc35d3ca7dda0ee644d74129a34e8ee6af8dd0952b523f16f22129a9b23e399a5f5abd10ec5fecaabf9cbc43b4f6bd9e4fb58b5be9f83b712c2c0b164376ec6b621d83e151c2f8aad1e41a838e7f0c300c003f04aec6f997a44fe25c7b09d40162e1801f52a1e39c39eb4398a1afd9e0408ef1043a637b4e93dfbb62cf04c3ecedc3ffae87cdfd0a51f4b9ff08580e083648b6bf8e5b5f87a83d3d42a2d182e761c840693009b69f365fe618838a8244c30bf879a48b70d74d562981b41732454875134165a42b1c9717416c0728b3a4023912b49e689ea15c99192e26a6c9a8190b58ce6b65da16956780685552a6e4de4377ea651dc2b15d8a94534b8a4ff104db85e8b9918c38dfe4bca2ee5d0fb27de2de393b6dd41b2c98419e260fe86a24ee645a6cae331e9c361ad15e650b06b77ede7ccb1bae3b26ae483cb9b73acbb7b5a8542d3fbbc49c85936ff655abc5aff1e571df1f4463feb066aad406d18cb4b8f3027418cd1f66d0ff86a8414bb1478ad0a932a43e6a79f2e626d049275b7f048503f831ac9c91dfc929304cbb0c42836e0d5f6b601cb03a16d2523e089d0c3bbf6c79564acf7e7c3879296f6a31ae14c7ac4ccb1f6dd4448587479c25c5e519df1ac0a7283502da032ec657920518e15c5ca74359d730c21acd05380325978ecf9be4763c0755e917a994f37206c321c7b5e7fd26dc5a2a299b338cc21cae30dbdf2f6fb63ec4c77bdc13eee091609d6ef1bd5452a56d219607b4b6cc791523124008a49f485f4f010ebe6d0eed8df7f64afac38e562bf4a43e56497e8d94875a4b75c85e0a17570f9b82fafd24e84800b9b1be41f9641b9de445a24be4f3d115c9f7ef951b89e055af9966b60b584b03415c8bd498ee2b8b6c0efca3f00d1dca764a5f4abd707cadcf088eac6890f00a72480038834164acc3311157b4dd593e17c9d3f899183d33fe3bf4693f41b31f2cbbebdce2446eb83aad31ee6d1425ef681f21b1d69b96bae61b2965d049996efe5dbda9f803053265a948f8d6619b802ef4609b9738af3153e641c55f095d209afc445f201daaf6c21d5623fd88b00800ef87e96ac60bacf8a98c08d25452e2b88d35e2e3fb8259ff72eccd1a26854f3df264f61261da3cb190888c8e2e29bf198bfed65c799167ff8f6f34a888cc62376a33b22641d93d0bfed5a91a219e47e22ddc1e77526f3d2d1db179436b60e85449619072220fc3a428ac4e6c5e63f371fe75f52eda574382adcb48a2d1443300dc77680e680ac74d497c86ba44f0ffb8a83de8b7a72a0aa785c45de8b14460ddb218bb1db40fd2fd59b62eaa3c27f767132aece33afffe00c4e80721530bdc3db7f3441eb11388e7a43c004e91ddf5898cfefdc3375afd943790aae86c6b9de7e16baf15772760a80ebc97ed71c7837333da10ef9d2a336f79ad2838ed1b9a3479ae0de214a3ea3ea05e43245589e3d947fd31c072a8c21e01bd2cf7dd0ac84151a9d48a2d1039ffcd90659f348424cf94ab50f902e933d4985e73cb9e800000000000000006a39fc01000000002dd906d212b4afc4a86773d5a7f08a37042bbea43c11cb6916bfe703692183a17341268dca74cd1254fb5b8fea7832dd26d68885a25f48cac04474782d7058fd637b12d963e80f7ca137a6c5a78d14d620dc583dc02e9e5d8a59aa05eb3f4498000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f5bfccb93a65bd348cef41740781f9f7c88593c3f9b252a4604446af913c8c12af99ba238b902cc764cf8d8bba40403f3260325646c900714503cfc668e99b059e454f8bd3421b29a23af7f3c57e205bff6417fb967d53ab154e637e8c2343ed856ca3e6e88f446b20b525597baa25cbbf50fffa00d620ae243a6de7716e5b502138c6e33ca5b093aa2c967d9e8092c827f80273f9a6d7b1dc612577fe17b238003171b8a842b5fdca1fce0a2cfdfed09d54f47945896f03db8c0df9e67bc5a925d0a0798f710a1b581dd884f3c66cd221f513d1d9688ae87d2310d7774301b55a292b89581a9a8e0411f20eb115ef4cf4e40e2c46d615cf49deb32c36b2c53fd431e0322c69441c78de594f1aaf4ce3c5ae20e863702867b8bd0da0ba33cb4fc4fac610206d175541dba7edf730db99cb6b1e9097e429d8748b2de53e89efb6d1e3f140d031e0392c076c5bb7508322028e8e2000e10ae0b855fb730fdf87e53168b2a85a5020a35cc2fbdac21df5f6485d4148666e7d1cdf74885e7d0a0af8c8d229e580ec703155ace6a9e0a36bb0e456c971c169c073d3dfaf8833a04aaba57507af64a25d519ee1cb72e4c0148088569b6cb91abf22d5beea3df961c7e5b792dede5201d25b0e01eaf1ddbfc8c5a6094b5e056d8bafed906a33369497fbdfcc4687c15ad9498b203f742fbe86edd07804b353f7c665076367e4416c8d7f2f91a77ef524925ce59cca151198b20adbd08e99a94eedaa617ec3cd39b1e6463a16fe078405b535b06034cc97f2c4a36f144d9e268249a9cf41028ccfc8a9e71ab207104923ea5411bcb51cb143ff3626da14a56fa053072cefd5fbd23962f205f13b353b0a2a1e02618b588ac0ee388df86d923b8a0cb405a3b6042952d0c92e43bb121a5b1e2d23a0feee97167ca5684e3d1066100308eaae217dbeb96be49f274543f3a4e80c11cdef64997c4554826266fbac3a241f007621733c004496251e670406261ad8ee2950bcc9471901c09dbf4212a0ca2196a66eec83cf348d168ca1853f6096d50d31f02b3fc17b5d86a81585bee5e5b6e5eef9b3d98e6c3914b0f4b7b4217d0d9539075dbaa12c69e70141a64b49650aa139ad73e85cb9074ab09cb5a72b4487e707cecc7362a956ca867664ef7937d2fa51f0dba204da6a40cf697e46cd7c93bc096e1f771ec188f75cccf81d8954bb9ae281245cab7a5055edfe258acc103f11c166fd2fe4d2e64022b7960a3c946475a6463b9b2f0a9d7eb64e6b0ff49366ca6f57d3d6a15bf1c86ae10598bd3ed680fce4a4ae025e3f0c3d8ebb69b7bbae3e7dc2fad2c60ba33db74200f162a3a59aec77b0d999ae5957a1c6e9e2ca812b7463040d9966ab6f1c673bcfd71c0536c32705cc6483543a3cc8bc84cc7fcdbbfbbcf17f0f8dc79634be7735609b1f4b2804c5444af57f46132f2ec1a2986aa2d8e440ae909941f883f9f6d97dae0db0fbed1c19d953d427f7c85a91c6e28d4f6a6bc65be4ae14cbe066df66aaf22a399b2823986532850ee1c5f90ff6144c79ce9476fef5a90e05ff57f2b24d94d5ac0bce3ebeed15295053ce0b2506f59e9bfea5e3020bde8a0c45c252e7676b5e28761d8c1a2037f24250f729727d261afdcc3531f49d3958d22af19dffcf76ecad9eef9edb0b3918622e8f0a28651bbb7fc493c0d932f7161df7ea9cb800ac7daa78f10cf046e1184ae39b4d6fab545d34b4950b5a73c52bf2317846c2252d755a36ad3c1eb7c4f31cdd40e0cc5600fa67c72467009bc8445250a49892e73f364f1fa3fe40470548b3930db788495ae615288ff5680ed7aae5e71f1a5528134ad026ce44b6d4e40d56c02fe56c83a7e5c5cc679b9d7561e19fead06dd16cc0ea5c780a58cb5ce0677a86f4fb8312f9a78160cb9d287bf55994dbd8a889ac10708345adf1e6219815a17ad5eac1681322ba8df92af323567212830a5e673170c8ff832880cb896b2867f11f5a32c56899c01f603fd1093b784f2f1234005fb71b41a09ea1530db0477d5fe1b6f2f6279b36e23543a4ceacf369ab8fa92381c66c379bd9d030dc9bd5255b6f1482fca2030b4d2b2131e66775014d4ad49625ab9e6cbe71f1df06e863361176faa9d4f438b224739537a97c949f61a609ed180855becb7e1595947e57d6b1cb259cc1ad2e06df00ab615217938d00a54f2ee34d0590f81f2cb823eacccc43fb20d5587ede7bf55f18be4ee9026d480028150a7c3aaccc333bcb8209832b719d939d907f95f00d6ac0e19865e0342cd25420de94e86ddc90000000000000000724378050000000022c6639c9e02435b2b88c5036d31f6fe61b3403be737bc7b98373e84d31bda38126f20b76986ab6f36a7a92de172f61e50e16ff7efaa87c252f5837c46ed7e8355d5422a21c6aefa826903059c8564e3ef4f65180ed49b85b0a699c4eeefd3d400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f156242ef060d01d40d397348d4cd7229ae0287f670aa38a648e264bacdf39b1eae11aa51e918bf061827b042763edf6394f9d6b862db8bafd98cc31011def0a40e7e0243d53a796022e8882698d6f3c28035551c844a5fe2cabf96c090d36de89395a3ef9357376014602915a7a52cd0288d05f0803741aad63fd84fb9b6b8d0217e8ba28b053210c6b586d015eb495fa9ad6ffd6f4adfc599b10b3e28547e89a02234368a2330d46c4df89ebdf340ca2c94e2bf9201375b17092e2c343cd53d2240b013f71edd8b502136c04de4b1106a6badd4ba561a8914d4ecc5091e4ed6aa9f0843d162c02ccd3cd57d0daf276e487439b433e51955fd9b0590366f09aaacfdd02294c980b55379fd5abec3b3615fd9b552643c16ae28c23a61017f77791526061031baa25eb7aa9b551e4be4adcdd16083920d2abd9a86226260a494a4e1dd4041d031ddea1888c08f31003bcd9aa174cfc0ba20a4a8abbd7b5d86b69070ee4d132b20300e44d7a99f2e5fa6f3989cac39cb365548f9a1ed653c9a525c7b29ee0623774022efe3960e8e791df35e46a2542c76a3f196e2154061151fb4dd19f759759275076be619aa304a89feb93c7bbf0004e1bd387820edfdd779f51ad399e039c63daef654e57db196a105d730b6028a264e1a7bff2c91d00e13fd57c94daaed94251acd0a169b4ade5ff89dd58bc2609d17d94be82d3299165a85cc23c82d5e5bcd285eff0bf3f5cf47a84c804b87df7fccf1dca280d48c5f29964bc6c7c3ed7a0c75adc545bf99af39f10eb68c1486e910a54e2a10a704ac0021d5925e6b8127bdd444e02dfacb77cd2ea24e1a8e8fd8ac4d845af1f3f88c1cefe8e800fcf0d5da7f07da3d241c36668b07aecdce4c6c6b3532f2216124fc6531251a656fcc8b7bd5f1edb93722e9ecc85c3c7fbcebdfda0f013e2a541863c173116e5cf70d81cd5463e448d41167f859bbfe1cbfa592fbff260e364f9180d48b4aaf02d77ed13447c89c89edc8432a63bf1b78877fac5ce4bcfc9db674bddefe3cb3a88f5ff3113bd4ad8f57f3002d406ec4d96512d747a3d9cda127b338aa4354ef7ab4090ce37b074208138d81f70f96acb3702132daa016eef96526bc01ef4d22349275e2b41bc6a4826aa3e4778aa5cf11291dbf8dc593514dd6a016d9c7571e43ef9faeee1eff6c5a516a003e8e72cf55320d93f784335735bfd5d13c2d23e440714169c684f86a1d40628301d40ffe7fd0936384c2bd23d80b59b880dcda3639ff29694ef480fc8559d8af735177f41eafa0836b92bd122a49363f45632c9d2dd8c809f263cb8eefadeb8a99c69fe22912b70205dd341092b81a17083dfab257d42963655172de0ca380e79aa5c1acc2ae9ab0eb4eb126efbd31da6fd01f4a0520ccadda09ff7802057870b0642d037a2888f60d98c2aa5cbd9d758f15ba2f96e72ad3e417edf8ad3f675ef06adaf2db90297c74ff7b33625dd3d3896b3ab8aebc77626fcef2a41874211596a795c21295bb8af2d2860f1145f27133edc86a1352ef53a0aa1ec0a9743a19ce9ea5a16540bb98ef9f466d19dfa00b07f17fd01664030f633103c294684c15681563f2c50cdd035df838aee80709740c1e81fe32846a50885aa88945c738b5886aefb1dbd6021cdcac6f6bcbdd8e3ece8286a9971e7f4f115f5288f086247e408470191c01d4aa14ab2d7658ff2651132572b06c19c7460bc5379db2b144ccae40d8d610e3aa32dbc30359d46465426e007b7214663ef8311e6fce64f38284e357b250c3253b72e6460879b836c01b6308ad88c0b28fc9517403f3520765a7ae202a388f07f69e7eb926fbb6c217069a04d1a8a80230de0efc8f39678e2a6bc578ebc40fc4fe17b1804757abccd75ba2c24668c5e7dc4379c6209e3d35cd3a171fbca87e50270857346ddc236cd65b50a2db0b2d458c2524e67521f97ed215f5efd8d41f5834ff709466d8b7a05e8be3f5e5a2c0c94a6e957b887e0cceda8e4b4ec1bd94a5c9fd806e6a1dde5c9e2db822b4a03cb1da8a080f23dd55ac72f1e76e414e7c4171797187ddd252640c430723a2654b2bfe1e82d529283fac038bb26c8002f089fc1ef52e6299f385023b6fd066a4645caafc9e46cf343619c434115d20759ad5885357a550279d72a191ca49a993c8f390ee1f7b74bb9f47ecd9532ebaba1320f6da12ffd1d2cbe5823f8e4db2d76cf5cea220e555758d75d49e2d73a73664f2cb359ef9c9731515224fbccbaed10f91e4ea57249482a0e09a99479a1f6e83887e525d6c9d0cd7bc9bf6a4e1e0aa4772196366b98c81f6affa2442935076a7a44def4706173c0ebc75d51fee0202c860afb25e51d7aa291fe8e374b19df9d4b41a3a62b03e079593746c79779cee8f86665c87c5c30c736a77a57daeeb02e641bfcb165f001", "6a5152", 1, -46403995, 0, "45fcd405fc2c872663e0b5c7d2ac5b5ef472d6fafb309f36650a01b7f565019e"], + ["e53ab34a03456d762d7225bcb529167e2dc8f76c4968146907364e7e7a8930abf9198257820200000003636a639c6d45139c4538811e4a40e46eeed756e59539c3fa3b662f135398026334c4d47d91d63b0000000008655353525365516ac9fb6986fa59a157096c988afa052624fcff585a2dcd3980635d9846b1e5797a791b17380300000007ac00ac5265ac6a48fce04802f0a9d605000000000452535363203b03040000000009000052ac65650000650000000000", "535351535152ac0000", 1, 1344936635, 1537743641, "58c4bf4148b33f1516604c625dedaff54eebb087e236bb8d3de05244a68d8119"], + ["030000807082c403037ccfedf0dd7f3fd5b346443ccde2d27fd51760f98f2e7f7b74e6bea7314dae620000000000ffffffff2e0a532e9870d210aac6026d34a340f70f2e59c4e663d1e5482f54b01519216f000000000042a9bee852e4b9650540c812d5ce3ec6678432c313f1f14991afcfd293bc1c9d81c0fca60200000009516363006363525253ffffffff014335fd030000000008656a63516a655251000000000000000003c75d26030000000000000000000000001179becba7097ff91cc2966df45b52b3bb73810c459fbc96a6f63741a3b92113549b9d685c6845656803897243afe9921e4e56fd795a6477d2c1338fd10f3d5b872ba20978770edff1d7adb26055b3d8e38e6cebab69bd8011f43180e2de17fa0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017cab231ddfef76bc1320cb9122abb7ee14aaa968b507503a2b07dbd5e04ce6895017530d8e8ede9aa8eb58939f21189678013f8713d7844eb8fb7c329565f00306bf0f9e3da3bcb484a040db7517e4fd96db322d06ac0956883f2faa532b87a4cacf5a759b5a8b8cbe5812b864adb23342895788b0c7115fe8552b280ceea81020713c5254c453343a147052457e44cdb2ee0cc9c5aaf9cf2f43bd6f7cb8ab7c30226d70c43a5479b899e580b59b34092782aeb6fa8976abbba93de4d998975c1a10a016403f3981ee50595b695cc8005383a26363baedd8dc06e7cf2eea8898e2d0c7588674f070b690cb89f3e21afe3eeb5f0113cb736767c28cf85f10ce9425c16031dc240021d72e54abaef8acb6a15cefd1539fdb281cd04c7d9a822e5baca0989032d2d3e74c1061de728d1794ee1e7c18dbdf3142edbbad18d0b15269a1a57df1c031479749b669785889aad0e01c1eb987cacd1cb8a346a7545b363f143d84ee84e021bc1b659e70e2799cd16399013ca7eb952ee422d431c104ee9dda258b39fc9180210bb13c449339bc95f72f6c18a527c97190b4aad38381774f73d425b9e469d7793cedc862ee15b7e67281d6ac9fdd8a7d25a0f21ff4e7e703ecf0d31bbfd0827c5efcddffe049f5c2d7c8049819687805448540214008eccf59ab653de30e9388712ba2f42f747b4791067b499a460424fe4c61518212313c642cd6c5e401b24e545a71d66fc14f058f0f2b4ad165cb7dd3c5209e42dba34a4a4e09e1be20b5cbd29be4b47e7759275c637e08b072bf3c58996e14770f515b3cbee3cab9677a7e1c7d233ff757203161bcb8b0a27a7628925bebfe6abb19514a56900908d32ebf966d74780409bda50342ed08bb9cc2a0dcbb53bcda1991a276d9ae472a7fa0b319efd7781d7b869d6f51fb996c42519ae6904411971189e2bc92f3436a7d915822f0bf85032442dc9fe96bc229d8017ba90419084c662cec99777a032bf097236126a28b6a77dbc629277eeba814946c6767c98d3080b02b3181efc3337ac38b9839393566720ca2ebd32a7f252f73f6301af65cdc19001922c6fc0192b61c598f6b867320f3b1abb8f36dd73d1264c9e2b0eaeed94533c7b2e243ca8dffa30d8632cc9cce88f45644f2c8f17e2719d2ea0299177857599fe57bcb0ef963ea1c0c6c2f4e138cf0a1bfab75d41d4c98b4411bf25de34013384880e1d19401fd64fb41b229c14fbb15125b0548dc611307e4794924b29f995aff765da09ab3dc43f0346a95eeaa4ca7f219fc48877c85c69f53739109daf2cb0c584ea1f8973bad2c1a73ee5b54dbe92495974b6a1514af367ffe1815d65894262912e090ce092e9a6bbe5b4e3356dd4298f04c01c99ca759b0d0755efa2bf9bd9a01c360f04b6b54863e7eefef3bddda6baad1cd9d28c097fe282c750e46c50602226cbc7c3d21a459d824ac4a8f0ce07af09abe03bd6f21da0e02a84626300d2da13792523209855e0248ad47d9f80c198c3bc74b26510c0b138f9fc3ae81212356a962b23d45c31aa064aea0986699ae038250500077d930e67917e480d2038be5d0da19fb57698d5f28b144a24342f2990d2be26d970caa51fa7a7df7ee15681bd8e9fce7889762e8eed338b178ea739c4b731ed7a9fd43f61626e8cd63cd0a02a29ac3c930a0355efc7c02e0170068556593b44fbfc80f1ae8dde80b155c73e65e5d601ffc61f95f2960c9aa1e4201b7305f6f4f951382ee4f302e21da647f4d0a7f531682917e39e9bc4ac1b194504660bc3ecdb57a03b19bf8e58287540a01f1cc954291fd7231b5b8b071e4ca7dbf124d2a7f52a0f0e9266780f9e45be5c28fc2e9b09bb6001cf9d498a4b3e739663f8741e1c5363dcb947a60527daa290f169479132467fd52169bf172656aa2d0737a1df5c6a78924bd8a662c37610b7b3cf299136fa782e27ba81da9b5a10aec4112cd7e492d8056fe76195cd39237bc424f25ccb7de8cb9085838fd51e73386e2439e1560cbd1d818f84c23375da504b314638bca55e59ef04e516ae9dc23e406836d80a1b63edb30c991f3f54378e4105dd88a458db6c35a4b0372dd8ad1715799acf807f8339c0835c18d476749b2bb1eb94ad8559a97ea82e029a09d33695c5272ae699c1957986a43b2d2aff69ebab4488bfe7c8dd67012ff7ef4f825309c9fe267697041f192b86de3ab2b7d52bcf4c2aef72c91a4100bfa1f7a57b67059edc2c7be17808aea10e3eee4bb536e199b1abe8725a5cf25a788793fe02543ddf959ab7c7530000000000000000ec5c6904000000008dc9ce6a7c7209476dc3660584b50416826c96ed54a6322babd4ae2f34bd3f141601b1735d6329ed6dc2d27abe5d1b3c587a7759c92d8bb2eb3d52eec88774a48094d4b999e1b6020994464b3f0e9d00481f7fa356759d3fec1a082fba8fb3ab00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000155c701a4f301735f4278a43028c1037d15ea391fb2fa6978dafe8c87e0660a5863616f000987cbf4614c72da25575a560e4aaaef195fd1c35dfb9ada85f5231b1a35914cff8e515a591c994dce883096b0ae225db3f00080555a534dd3b257d042105258d29f40cf9c86ead7a6f7559f4550dc4adb65d7857bbafd1debf46bb020a2ac1a2671f2987cb9ca4de927d6a8b03ee51229aa81df4ecceac1862fc6309032ec79325abba864e1cc95ee2931a93c962f03debde9942dcc64f66a5527be4f70a04da76ae073484e5175372d71b75ed99489ea64ff7244c2957de33f5a948935bcc6dac197fd10ae2d1fb2473b4768b7f62bb922ac0465b7dabb56ab727b37ab5022ba2b6c5686e52bdf79d562cd9449abae8dcb5790941205cc11cc41f2feb815d021447f662ca024da127bb41a175a8f14551cf881c3f84fa90888a079d923066ab021e1460ed4e3c619bd6676a2bfa1de078416c0572bf0ec53283c5c0afa02710e6022ec46d5aeeaf96b3233874801515244fcac47837d531daa9a2e146e9a7075ee80220ed17f0c0b828839169668740fc0a11dd057ff5e1c5b98b384eee0a5cf385b2edba4e59b19ec88e1b2b627fe79a4d7e08127881008aea1d84baf8b8b024a0fe51cbc91fc8a22b50f393f46a55b032e94975f9c2adb00fa45403a6807dd60f76e4b20f5303dc19d7254340ee7f27df19b953663b6aba901862572a23893f639e0df3a2b5309c39ef4f3d74cf5a6e43681214f1e2daf3b7cc99aad453b5a9bc3e351f3e05939f0e5c1b818f5d1522a1b4995c6e973243d545b83f046c8a98306200780ab55f2e5a096436cc1bac86bb247cdafba83f5c2cf715cab3eb6c75d827e015225bc9e3516e59b1f474591e29dd8f363b2a5110b61d61ac5fc8d0d8d0e0aa303ed6405bd7e87d649f58622fa2661ff8a12266d38d7ffb4ae86a6bc8c88fa19be09d82eb532008d9fbfe71e4ab6b4d13dee47c9cd66c1c530bb2ebcba0dbb5955cec08945a8b2cf2dd2ef6cdca563fad1f479b9c2ecfb0323bf8eba211302c96af8cc2b9132e08e45a36fafa0463cb75430303b2a12a046165af395c2bbce26e377867c8a8910c823ae085b166f1bcaa5054b9792b510e7fda995ca18739bdb6e2b273653abb1abf1114c9526f400287482fee8350865b6fdac1cce54d2da5fd2019af6d9734568ede1d06927083e1282f90c2abaa3d3047bd1cbec583da15ac40ae6552be6fd8ffee7062a95fe39913d62e1459979fbc41a253930950629e0598417dd8ae47cecccd4feae4cf4035c97656f6e52c9003d3ba8d612056e13cad0a87673683889601d4f5f8c90a1282d13b69252f48402ce0fa21cc16271c1f5a7de6a4cf3098de11a68b85a7327be93ba8591f8f02feb2bd8be9bdd3b3afe26798f57abf5d8521d9fa4d79b67d6f74c1af28d00ef28efa0d8cb39e0f6eb8e774d1a1b28284130e6c244f65946accfe60edf19b057ac4f0588465c2f3bd9eee4706a59bbfaba62a1eec0bb033a4b2099409fb5763c6d3b4e8038334413bed4453dd27f8cb59b603a95621bd14b319f1405e22514f36a1a46310ac7b71d3c227e243634748248c657469be8745d920ea8d3a9e527a51ac94c718216af02686360dbd5254f5b4f309069f3723e4b264dfabb548ecc14b865846f180950e09aae7e5c332965d3ccba65d7a060e8e1e782242a7554d0a443bedc746647cdbdc0cd4113dfa4d9d07da310e117097f4366eedb48694a7d128004c4cf643265c7625f6726c61aca65447577e5c261d6d04257d5edd42652dfcd1c642b69abdb16b338e69779b16f7872273ae2f4005807529ae819cc8486f68ebd05e8116ddbc385f5917c28cec34d2b024950b08189a290f8afecc33c9724c1bc845f6077252aa0d6208b5657a1b2a2e4f54aa41401aca67e126de307214d27837eac7d0e8db33279d7b8049b50e877d66462cc1022c1c65ab9e8efb700eabddbc2ff2c2d9429137972f4258195db4f1f01db4eeb871be4cdbb2f0333975f8c2172db3e5026904516dd65d1f4262493e35cd0a775a853cfbae085fa81b1445908753ea94a62b9e4d86ebe19edde9c82d9f82a2bb93d1e70ab88a1622ddd3dde66fc4306bae557e6c5a5356890ff823ea5d5c2a22b497daf941d66fe21a79b26a4d660708a0c66c6a1dcdcec3c6b1a8d17e408e53bbcf84a1b77ed8a6f021e074924fcb69ad4af7654cb77d2aa6b26f096e11c74c867bfc9638509c413f02c3d02288e9a5b5b2999bb539db5651f4265c6d7b994bdbafb7d34b910000000000000000392cb204000000006526d522dcc14e8e725178939efd6e65684a71f144b63c2dde1b12cfe8716dcccaea06d18939bdc123e822aa9a56f905f3011b7154f123e41a9271644b914574f78597045b2d6f5c521f8000abc2c153d68dddc8501cb684ef372951c16e778f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f6253d2fa882bdd23477f3040107ad029d0dab5f3009e9591876239bc83191e1cf72ddcd27826b3dc438b3478ce60d05e7551fdaec8e290d02d87f0611e2d5811f7deb7cf58e5e2981710af2d8fc8cf58dfa13ff1821783e2c0345900dc58c550978476209bdc3022cd3e45943d27c2af28d613efd4a6700653bb82f8023242c0314e9b6ce2940b732c1b0e6ae83d4db5207a14cb4d743e7ed10d19c92f909c175022ea3331ce17cbe8a7ffbf702c9672752fefbe24248b9cd44588e4997e713f9920a072fbc818fd3b8b290a8de7c65a23f9979023f3d7cb6f478540d54c9f709112d853f2d876a04a0931bb54d8c94b7a6d5367434c05ef0057ace5a77e39f3b63a80223e63ef35e8b81dc3cc1915d9ebae03bd16d84a559aaa91a33f30e370414ae2e031ecb084192c5128d527ac39831d895d5f336d07c34e1f0ba5243b94aa2cdea52020283a545daeeba9ac0acf612008604bd986183c2b04ebe87501354220a118b23032631d377d0e5bf229e654ebc8bca099d7209f9b87c98ab5895486f25144fd6a60303480e9f3cf71d9c02566e6f1634793ae6a1ff615089845192356d202a0b5bfa85b16550c54b42bcc56606e53e72bfbc763eea536120132402a649375c46869ec5cb849810afffcea3a457a5227b3082e9b4dbc6c933e89dede4c8833cff188f9f9690417670361a93172801f0289a11be6eab3b9454e1f7e73a290c0c111caaece8dd47e95dfb81a4699a895e737af0f72e466c1f4481c48e4ccf3d2e28ad454ee77193fa9ccfd3fd2260d00113316974af607f01072c6428e1255c1a8ded3a51e40eccbce7b28e10de8202cfa5c32fd4875df2e9bb56fe8ca39d4cf3a4e0ab64cda4a1c6b604256f38ed300e978f0e4889819b606b8925e3975a6278046d3720f93ee6e5762ea44ede50ead00931e64d5cc9922245cb082b827821406fe4f9cbad2c7fb1f2f30ea69907ff7748b990dee5ed0b23b8b40b0055c9122da1ee3d1aed1493d7ded08115a31dc4469b0ad1731547e4a92cc071535e07855f5f0fcad1430efde31f64aa7d30cb2e16846f6633ffdfc7266157bdaab56ef198f2138b4234c6cdc855646a4933b51a16f17555598b1122184ff59f3c190dcd2fcb870c314b632dd766ac40526037907bd1fb720b5b96bb1e6c91cd7543d22246f529cbdef72708ee80633111d858cacf83c2133f60602f290e9c3dd5530c3e4ab116e9281dbe98370af9b65f2af1b14011707c823179f6990b3a4f0b5a755d86c9d78c5ec8ddb31f7489872b4f234968fcc514d97d4cf4ec6cd917495d7869ce9fab98bcc6a831af66b1354869e83663a0bdfcb69a1a4a054cb2e7d86fd042ff54e33e53c806617f74bef4f201c01fdc2fd29afcf35cb7c7171fac742f41e3285403a59171e091f2d28f95b76bb90ccc1681c3cbe982e7ae90f5a3034cac082a59073927288efccff18be379b7fc8a711897e5b317f3883e80214075c2ebbcf755fd359a90a4e667ef03a7aa58a1533d3ac95444b747ef376cac42434940634c135d6eb390b54b5dfb0c70ebefd06396c43279aa775a412b974c236b56fcea7809be372f3c817b7587eb0e2c9e5f2af4e51548169916e418d24882904b2d3a71b12ad30eff89b2404269a3076693e3f8889357bbd7877b5619dd7d1027e9d4bbd9f643431d7a419322ed179f786a38af1afd755a220e4cd197fe9e91ca716f9061414c4cdef91620b8e48e7ddfeaefd3abbe27abefe41fe17e0464d7d35b9f219cd0ccab70fc26e4e60df95b8d2d16b09d4d7bbac812092b39343fc89c8707105631f12a6f48ef731d61062895329567a973a07606cc42b7b8ca4ef4038a33c3f43468734f7ed55980183b36cc9e8c4dec09e3ab32da497b661c7c2d6ea9cc860adb4e5c5b41cdb6dd11835766211e7d5fc06643c5a64668ca088bc4ca55eb25f87160ee8bc246d7593931a9e81d961de915a4cb5fcd7de1562fc7df26597a3b6028c101e522b190d6fa5af055f81d17900e634c7e268808fcc8ec7700fe6f87f6abdc99da0f193839e8a48b06f57940e314e5d8945d48122c188d446e61602e161843225a9ebf662af7a27357a8cc4b836d6cfddb35444b57f4aa739f07ac9e949e42f61b0d0d29ef20cfa2f9c5931b29cbd00d7ee3e3aa55fb8e6d8a979a1c87961bacdb83d7fde24a40e89f7f5a4aad8f5aeaa43a599718c5cd2047d0d96f1a781f9906d59fe2fc7363fc5607f89cc795c33cdf50da0dbbbad6e19346c1898825e86265b5d9c6e68f628c139932fa0f7fcab9e820e9ee297faa8d2eba204caa512d0f2d18e322e5273526bc8beed249dc539d4b70a0b9b72e5154848c5609025faa63c1529e13fd5bb6cdd6bfc227cc077bd3a762f9632dfaa4c12e6a856faeaff5027336b0be9669d9558d0479105362c03e0c", "00006351ac005363", 2, -823594623, 1537743641, "b846743c2666e949ae83e46706e87fa287de0f7d6ece56c2ebdf3e516e35ed70"], + ["030000807082c4030195db4efcac8258532c868926590224f6b8defbeee6a2ef60ebf751e4aa8789c902000000036563acf4b3754c042342750200000000006354820000000000036aac63e82d1f03000000000400ac5363dd7340050000000006ac51536351ac5e21c4dbce73ef300300000000000000008e25b90300000000166640231cb668153ff6e4285ca4fd045c1cc5edfb694a83a650e6dd734163a4fa163fdcf171daa0a9dc0af3ee4877ca20aa2de1563c799e318ff740847dca83b096f1d95f1b6274dfe1f0abf26d5cee063b220edce05c6f747a99a54612665f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000119cf472dac6ef911052dc7234e0e3b5aeeda4289aa458a61fde596caf7cfb644ec87ae2cd7434c511b23dc789dde6ff5b410a7ce58caee0e8bab5c5ff574a69da0e8570cab5dce749882a507528919807a1a62282b753500fadf7c7271e856421b66a8d2727c7c17389a4c9c41731deb7f005ebb1079d68b73e7562afc8a99603243baf8873ec44dee694bb21e6b9dc092b7e22ed077e483484bf4f7aae10d2c202265c309bc36e7f6fa462dc3dd11dec025f1c97ef445468b62edcf8f1d25e7f700a0205bd857b28e9fb8873ea053b9353da37991b2871d9b7adf798076a98e60f75639fbbad5ca9e4a9b843bd5776ad19d05ff32119d2dae63f5eff5181651b3ec50212db8301ef0673c652b44f92ccc299191f828fd8c64c4e6874db5feebc13bde303231dfd6aa6990791f7eeb8e0c5daa0160639d27945345ff1dec2b6f49a2bbe5f0323053576887dbc2e78e0fe472f9f8797a114920a644567546ab29f05e683153c031c49d8bbea3e436af5cbcaab3e864ad78568166e0384419aebcd6a0e3ac537540328ac9e23031cf729172bc104eb410fab665a6f36cb89c038c2ac9f42d47da9d5bef55a2461caec56027393c4f292c903c8dc902732e10253175fead36cc74a20e172a936c203955eff13028ebcbf55e78ce7122f6fa07f03c303983e576bd99dcc91aab5411219bb50d7547dd30e00b28d74dc51e9b6f3dcac70d01a80e36f5c231c84cfe45a121baa048163ada69c03cdead62e3d58cc3b571fb20c84e293e7bf2b0060b691eb4800752623ddcd4bdd54ace47b0a8727b458d4eab42bd61078fba9538e80338a0a33c189be13f3be47fbeb1d5e6cc7b56e4137e93d041b317a022fe8215eddfba11e2014f134490b5a1437b92c91d2f605890e356b5c3b50c4cdf5a43aacbf833fed008302cf5a025c3774c963244261edbc60d7c46c806a248904e218e3be00165596c71c29d73f47b84038cb9ec47cbbf8c7b30a5d45062ef15905b07d4535d0726bab4717c4036551d286960455650cbcfdded70d406c3d77007273e75f8dcb5961ba941885da851c911be95b3b1b34fb247bcb7ef5349c924bbf2e1e16eca7ec198ecfbbe7373bd71167b4b5c4010a2414cecd46e36c228af47b587e793b4a9e32749ff94cc36995d5eb4a34e2e64177ac7e39bbeb9ec9a5f4c2bf9572dd476996bc8a9fc050349881bbaf1dd1c16c8093f88fc30e2abe8e24a95302b69cfe2ef246b2e0029ff71f240611b6bce0ee91385bc29acbbce7d3b6556e6c200f97cd95ff87a6ee6c6c70f5191f9f4156d4559f7f32128d233eefb0e21088eb4a7b3ce1761e05af58287ad67e1753fe7f2222d77c040cb8167bf5abfc58e1d4f6858f9653a0193dcec4b30553cebc636fc90757e4d5d8853456bb494fcb7308aa0a535aaa2e2bf5ed8ee6cb380f2fb3211f979fd25f5ab62225f793219d3c0cccb0d72b821a66bb289fddd2028f2bfbb461966c2064cb1050116b46396cbca668b21288c5c3c8e02c3fa8b5455ebedcb884367e8a759f0cffbae4022fe7a5ea32f486fd94f5098b849952afcfbd0b72d86e0cc3add5a344bfc39f7ec0a551f9d2af8f4a3108fa6d6d00746a62b4dbf23930f376098f381dbb739d059033d34ee714ef6940cf8c2ad17052d80d37083c950d59d9480e59debb734d2314112bbcac64b6c88281ec82d7b706abf72dec4c64bc443566b19ecc65814d9153d10fb8e22d14b7b2c2d39d96ffc54a836c9d85d5783ea2a2d4bd8f9bf641f70905170533a06f865db065b4f565786d80b8410497c1e671e5325e7c6272cc1bc50656196b375f458669755d3b4221b49dbf943545f33566deb998691a9b3551cce845fb34c6a6a422c4b17fba273c9b5d0a79cf941dcf45928194d987d03cf64dd7f7c4e6ba79ad77329ff0cc89bf7cd29cd42b666b4106bb4de28b4a235f4fbc6f249f2a95b17f156accfe76f601e5dd72d63d288fb546f8cf9f65b6307c21e48b010ff70e3003e7ef6226fd3bb357c60c72bca1a03593f2828f5827af74cd656db01347b939217f58ebf4c2045470a1e7d07efcb0924996c359b7086262a33dabd43f7728fd1dffeb6ae2d504c91c4ba56cec1e7cb32b83df8d9a6d90619978456a4961af12c82648aee127542b5b22511906e9eeaee7dd38220ed31a9135569acf7fe8cca949c09bb0ef5cd1408e1a4010d73a959ed2ae757df531d17df6fe7c829be6cf63a236f2217f38e6d95d7be759538dcd4cf2a0e1cdeb996784fd6c0771cc2d08b596c09f20ab646d06009acd110300000000000000000000000080df0912779f830a655773c3db093073b6380cb045db9ada941399873dcc1a938011bf997bfff4e08600dd347bee60df377ed55fa8813a17fb57de0bfd1b021fb866a69e19213da85f1956d6c2e094bf4bcfc0faca5a94f5e8c774f3c7e39d5c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ed63398ed48dd2de12869ecbcd6533cadabeba66c06dc71ea4d0771b8242206ddf70d6ef9b3b44fdefe814a83f37578d2a92fe9c2b508ee77ded68ad132245d3b08665280be5577354fbf91cfe6201aa38c8f196924947ff79b97de273498bab6b0e65117f1f44636c5616baefdfc459176ef7f6c2a55547e304e450f4c71172032acc87e99612eba02f713f7d951a739d90b08168ce08c0153b4e78375da675a40326d990fb635a2eaad2ec9c1429df7c84d443909949cb9188699b86b92ecc65930a030d378bcd8daf871679211bff39cfc7d671f43809ca61b91ab08799d24b582a107f8ddc0b90753b2e23336be502c662579aab46f34df3b05f4933cab2439a490213002109fa84afaa4a5445cbaee9e05e093efff3c748968eee9bdd8c87b88725031d7653bc14ae09ee29c63c451cd23c6bd9583d487df5ad5c250d747515ea78b30312c736fe5319227c25533f45434d0206050ec18a2275939ebc06e518f7c8888102293ba4060ce7104273195cfcbdad0c32f08e9dccfc70f111440df0de9afaa3bc02170d708c7a9e0a96513ea38bcc8942acc7903523245c75d6f3db413cd6d8d35fe09cb47820f39e2c78f9dec91c18fc00a7195c81e8459fcca97efd7b4d51fe95236e0132410f7004ad5a865d27f21834839c5ef2d37704826ed3d7c14347b122be8df44a1898e763c693a8ea171a884229a22b0639fe0752f6faa553c2264ae2f63a914264ed6fda13404de0dd6b871ac9fc44411d90a536c01e04189ef44967c243b2954017faa3ad6a003d87c41475463977631eb9886996976302d2273e61d273414c9b0aa3aab1b176ad8e59bf2d1373deafba6c50ff3ba7043d8fcf9aedee395ce0c6c1e3b43467027de86605f140d692ce8b500d00edf9548c505d91593ebed199054977f2dc047490e07b4af56fe1fcf0e16c3abe56fd858902318380b61e63a6cc144270c8e0383c87d1c9e847ba4c8b00e169d25c18c6721b976bf5ea905521700b3fe454e4660908d4069dad07e1af1ba3ef3e74d0fc567bf3c808d96c4f0b8325b13f9b7a9faf2aff5c108f2755a6dd5bff28a9298f0098a17f824f536127cb8879ebc9ac7197c1767b24d5a4e10134664538d0f9d5da89cc895e4518f0f84526e33ed098b310f9a9d28383c1c7ec9b804a42bafae5163ca4e426debb10e7044933bf95680318bf5f87d77ddeb9b8b4a34455d738023e5e326b112b29b0b96e7684e21ffb7ee7941e276dfafcfdcfc5ea515cb1e814ca86bcda12f7d1b42b7285ef82ca761329e8d6ca3bd838fcfd01ec7be18a54ba98550e3a901235892791f85d5e146362e7b18c341d43374a035be283c670127d8e42b87713efbf0870a4030101aa8757c0fe03732e7a38c7125c7ad5d1ff780a946dec27119d4c7355714e8b493a21eb58d2155b5036e8e4de879caeff434219fb32cb69e6d64bb3534bd5a290de4f0ab5fc73231e56166725d44d301dbc61bbb066d708ae1075af74b3cd7f36a3f38b8a9a33cb5f487b6d8466ef60d9473924e4d280b0662ab0835684f2ede5e3be3bb7abd2b7c284db3b09d68e8d484b503c59705a0c5d2b7983dbcd51138016c5ad53b971c54f5b7092de4edcb483bbdf5dc974240c2474d8cb12e75fcbf3a85e237add37ec9230b5a56223581e41e6c4ff6c09d0d2b285edaafccb9bc28c76fbb3247872a86f60de2116af2c19291d851181f793971297f0a2217c8e8f93414c043fa85e34d6ebea6ba9d9e0c3f2682dd855643fff55ade89a2f58d43ecec06119c1ae5de0c1c8672c1f3db7d49a42a172bae9626f3cd1e07259cc92fd895d63951fa55aac6395fb5217192876ccabf84ce5d430c509fbcfd7308d653623a7e41ced0af262c5dd42cca2376d9e966503ae64191f09d26583fffefcb460a83e2fcfd384c2ad39a53bf0f37f6e95e00c97cc76f853251fa323972ffc4434cebdd2318407e65607470bd2d63040af5a6ab62a9ff5904a2523e9afe266f97ed7a7020cbf9560988882162a8c5ce5e1cb92c1bf286ff86142388845a5713697f6c86e97390ad53c57d684210468cdaa5fde842470f437f0ebf09c0436c460398d7ad17e330994562601d968ba41bbf413a49eabe43fb343694a5ccb05a999c39e529e4b6896d112e640eea0bb5673cd2ea95fcfca0c96b9621b50d4b8dbc334d815c4aac39434033f4d412c8e41ca1b70088c371c7185a1dec9d8500e1ac37d3d648a675b52b60bb73885117d109df53e943898d86b1c16f0426fb7de4f08c01de52ed0ba2ae6aeba19f900000000000000003887130400000000db48be28a5e70fe46067576c3ec777f377062ce036687ff8c5a43b7588b1a3d84ac9e294ad7a64aef1c7d9a0ea6ce0548de93f88651fa1233cb3894c0503155eb4d466a04134e653491c6c06dcd1cdbe8a433192525376986900b9c99179f81d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057db0e45503feb2d75c2c6c4cdf2e5759a5e32bb54f74fbdc0b98753394b4d5f49a6c3bfa0b53b0f2130d2f7c729383998ae4b90d1360a6cb66a77e4b7d614fd589fe99f79c9f2e5ebc4c222b069f3cb32be799998ebfa2f24753a16a869b679b9f253b71f25cc57a5e18c27c7e37586966dc0c54f7dee1075e66235a901eec032533cd5249e4f511621ed41e4cefc7b91ec9315449cc238c48c5756418b804a0032e445b643ed65614eda0a0822e1aa3fa453dc4531209ef5294e89974c845d1130b00a054eabb9a4079c0cbb56aca0061a92bd2f918b968893fbdea52263d5f638594b0e7e7de851ac7f13e412560593b1bcd737eb0b4053112959ad40ccdfcfd460223d5f2069f8b54b75cf73c6a162aabebaa0b3e02696bd4bdb751a96eec375ec00203eeb71f2d54cb4b73fd0056545adcaec904e1cb570adf31e7b3a20f1679edd4031d431b7a5ac11b8b53b74c50695459a7c7b0af17211c3a7f23c1a547f78169af03130009ca1c3d86b846496d00de3a688442038330b5ac30a19a9e6697c58e8c1c021ab8f83366cc4ba576afbdbdcfd339e669086e58e6d92b7d438a3514a876c1811e2ca7694f6fc07c0319ec9370aed1c926111a969bf1243efccf60c6a3c5a1f4ca5095f389c50054b56e096799926da771eefba8e56757a11335436dffa8261225340cac12e6082a1be2bf1ba6df0109ed77423e803e9d73a79e94eb3bec49e0583efbe46cee12103bbd7c01fbe21b601f02e5844c42f9bb7459c15f00b1e3ea9b7b612753e45657889029c852184a302f842039289f6e2b273bd14e45cd5547d3d342b5db3ce05555706484652f9bcebe3e26f7e6e0792701fb057b123fee49cefd384b09c2be68dd9b3d93b267479b544d6910bf02ed09199632bd5bb4035d60e8cbd3f9e8698f06dce380af0fa4dc3869d8a8c0bbcecde4cd6b6df2b49dceb147dd4209fcbf2719a6aa29256ac966d91f1e37f92b1647ff44aecc022a951c2363f26cb326c0c38b1b7ad78945908caa708571285cca908e57b5c4d3b640f479e0376a29032f55e6564235bc68040ee28f450a6545b9d1969a86ffc40bf615137e31fc9a8f9fde9c1224b24f044f404811fd521b7b7f7a6a886a205139ea03c46864b45583504e9e749c6e2d09a2749068e957bf8ec92417789a6bef16b98a571587d3ea442d28f3ee098eb39de46d21fd572acb30c69374bd272cab66279698f8ff69e6e7dbb3e268a995c34eead10f2ec3e72706a94c9f6d9ebff485c26370c16d16a31c8939f415dda9c8f7b25fabdf9f4a38fec9509b3960fa55276dc374b4a238e0f41e3c8965a002d5d28edb5abd99473d6b44019a2c2f4f6300708e7c2af9f72bddfc259e0f30bac6b50267eb0e4b82529ba2dbfeae90937040b71c65c6a835c5ea0e5b0cd0b2a522109f53036fcc4df00da151bde631c1cd44c4072b5d139c5523ab00361d9aab093956936668cb3032ad36cbf1531c1b6e20211d75709dc0058747a04e1cb1a9563dcc325df6f32b2a9f56999dda86548e8f7f4ccf5f22ed8b4372d6d8a553aef91700a580f34238094905dd853c235a3c5b9d92a9bf569f80b9ea5441b625845eb0da39a44b8283f7343e47dbee056ab318115c423d0a4e8a39c643653a0ca4a423339a6eaccb683c667e709be6d70761ec22ffadb525f92ebb121affc837d5bc004b83c3e820d032e3b7925e58c52c7fdd1d9ec87b9202c96d81d9810e5a1452335a70cb7d2bf10c8dcd14f9888b6b5439e4d97b16d9f93d7b19424bc732f7327cff05b55e46364a33628199a513f6c84f9134ffebd0bec1edfa173589cbdd5176c1bc775f31314f2e860efb853f0aede7f0d91f96ec5a34a22feac15a1be3f877d4e63dfcf951e2e7119438b38acb1b06036526c8774de7729bf66d44b206c4c2e6b84c6748b2ac742651fb793f67502eb95c6336a0d893563ee679727e4646b2c3d1ea269b3e877b5b53f1a3edee391f1cbb943cab0c94ea1c8bbac0cd26d3b2dd2257beb97a2206c664c20446ca91ba796cf3df31af52c096a6bc2f996fd040f149cbca1451018d6eb99ffd5c3d79a83fe77a47b296c57835212b1eecf3febd6cb06dddaa267fdfe74dce74a0b61597c4b55c6c18466810b23a7d26b44037a219ef758369213d71d20bd8af7848b6a290acc5c9d9aff05680ecff4e749e7afd4fe1638d61433549cefa7e45e09f454e8b6a2f3f46c56c927527ca712bcbc28ee61ff0f151e3084c97d1ebe3e03fc03f4818e62b141c7807ef5c48bf78f2eaebad844fbae688c48460bb50bfb9f8dfaef921bc1f981941bded180b2e9e1374bb5f28a7ee8c2f01fdd083cca9a254f8ee70c5bb3906154175aae78d21920a2c749ce1d53185798c2ad7f66da65db44d14f9b2e6a47d6c590d8b4bd0e1893af06dba4e770a", "52ac006352", 0, -416817208, 0, "8348e6ff714f148d8ee444a2f59a20c340e9f55efcf0f53bb557dd074aec32d8"], + ["017d3a0f02950dc516904ef21d59d27c6b0fadb0aa89db6917e6950294fd4086ee75a602c3020000000151f12201b41706808cd82eafa4fb0f1cc60309560b337e496f279fb0bbdf6f257732f5c834000000000263acffffffff0200eed60400000000036a6365610834040000000007005353ac51acac0000000000", "6563", 0, -1523851633, 0, "10043308829674390bee165d00a39f331f9d59576026fa5c6be719a4467c2248"], + ["b2e7365d021ea84c408fd30967cbf7563fe9210b5f51734c6b44c77b4314396977d219c9890300000008acac536a635200ac67043709b63660bb059929cec649c2f65f2c6fb096bf56dae7a7a3646d906794f6c90f6b010000000952656300525263636395e172fc0418ac4a03000000000253537b824c020000000000f8de950100000000055200ac51ac850c4c050000000003ac63002c2b7be700", "63516a", 0, 1871467588, 1537743641, "e527abb1d4e309b8521af0d8d9845e9844336f47f370e5a08172a27300006ce0"], + ["36c3a33903e80a2dcda5c81da86c6c212207ef5d1025a3df94f7286a9b9d10ba6ff50921de0100000003ac65004fe8288e6dcb9257e1cd2a9e71f6f40bdf3a7856128ff151bdd7c308461f8d63f9811904000000000352ac65ffffffffb0ca6f0a196faa9c8be2268876e410840ad45de2b7404ec4e434a3e2e14ad9c50200000002ac53ffffffff01720c760000000000076aac63516563650000000000", "", 0, 1507027457, 1537743641, "003461b1e66d65040039b7dbe9115e889cac5704a12e19e8daa013ec231b7d29"], + ["99000f1501cbcbada130c15afefec025f50a98ffb7801d9aae48f51cce7649e8ce84b6d2f4030000000365ac65ffffffff04905d80050000000000311f1c030000000009ac63525265ac53ac632278a80400000000056a63630000255b74010000000000d77a9f7b010000000000000000384db901000000002dfacb286219c724f70e1cc6db1daaaed15be68be6108fec3995a39cfcb904d678ff11113c4981590d959ed682a39fc5b8b57a2d8f9f940cc590c0ad984fababed4949d7ae2b44086059aeb069a1009edb9ba2d3e1f052f7f3febebcd3bda33300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d5abe50f59197c4f11262e3975d22af4819ccf2cee1ccee80d5ced1a23d69d1b9ab6dbbf3f427323ec785b4cea28f8fb16a7d2ae66308854126ab32d054601517a2a2f2606410891cdd994c084364785a6a618390955cf9927ebc7fc50143864e0234905581a60cdf52eda2476f88f19aba22ef8f25a8bcbb98b665991c9b3890215d78ca218b90d5339ce7944208f1670f4f873b17dfb11eb6add4a03956e39590321636802d824e0dfd072911593f651adce9f50286a66cd943b44a8cebab42ace0a0156f7de650e10a83508a7f22d5f65fc15013fbaee558c6e28708d935193f78170d03803ee9b0ff250b1c369fbc31f66134b01c779c0570e5bc146daaba4b00c02018a8d3acbb25e73e8c1e9aa5bbdf400972001ba25aba7657d471c57b89144320207713975a3d75253df9295dfd2b0b4144f80b431c2c7de80360ee719428b140e032a9e23d4eb5c3743d1f8d4587e6f5a1157f788a5b97eb986e71583582287489d03000d6992abdd8011799e86a6e71a2c23fe3af8b4646f23cf20942a4e835a486f0305668f797e63a6a52b21f402741c2bed1fc3d6ae6de9c93c06a8d4d10f771b46f0ff9f6fd164b620c2f6f7fc9261bf3bcb77672043ec960745c50c0bed888d24c7c4326e008f2405097a500d8263f78347a081086b95e6c4b91da48c8a24a74daf0f1c981961f3b94eae735121d3add17d389a456c6b2cc3369f5c4cd0aacb7bb0b377f7491147924c08211b30ff36488cbea84f308f30dbe1e60ee663439396a9ab1edbb2513b9e1b8051b46d7a76edc0186aee39710d05a40fdddd38e47103a95f941e79d6b3ae7458c8b4b4c621a74701ece0e386eb9cae67cbc40c8b2988fcedf987acc3142b1cee83d4bb24e9dc3020f9a5da8a9ff8783d1fa5d869ce8a3f3b9a23e08d33581e6119107078662c3a9943e6fc5e1973a6f5b86c75c2259a175e6e4d8394cc911f1e15e75984ad6e29c71d8a2ed5bb00d19fad93c1820aad67fec07451d250be470f651c4b57d680a250e70e3a5bfba28572c0e73a16be07941919af17601475c1b5e433f1c4c45cbb009aafbe317ba40d36c74715f972e104c20708e9f408289948fe20e4cfd9f654246cf4ff567a74c7ea0c71665b45ca1d6f8bad6129efe6678e6010f74171ea1483718f8ccb95ef51f65dea1f24ae1e7bcb9762e056a6e63e4735c7f9db5f0eca8539bd5077b9b4c75dc3bf93df91c19e33583fb0d4e170ebcd632cb803de1ae0ba62e73045f6f8c85150797a81fdfcce40be382bc09269f6f790de4a4557dc6e10f59f1e3e2283e7d0303b5e39e6719653f21fab4646d87f837f17d51fed54d5ac4c655b5ed365a34529c8e050a931863fee9f5615066f52f5d66d839150e020f427d7636df71ec120d17b2fb3122f510dc58c793bd68d1ae73f86abd8ae22070337602fcf46a2f06d3ffdb53ee355a00edcb6318b376d89739361274e1d89fc1f75a994ae5f5cc7a6d7dfc297e2ac098346f1c9b866dc3ccfc3d08309563792029264b7fb06139c9860d9a4e125952a717e7a56e428e8176685bad5aa458a2374cd3e5956c4b39975dcd1120842dbb3cc7ef2811d269902ebb527880a3fdd94a9defa17997647baf2366091ceaeb2d2b143dcbfd474b3fbdcbbfab7b0b170b2c9a197e0cecb9fe0cb9be071f20e798ff38b8f2527a7c62a1ebc889110d4d7096deec30518f9c33466730f7344a5495868e330b34957d8be81e402d44823b2fdea724139c91c03e6f8ea578fc1d720c99ef750e1faadd7f684dcf8e6644ba417a0e7c75724547922ac7f0e6fb60d4864ab1bfca8da169ec0d73d38a073f592bf4c232beb18ae56437408e95d867b6b6b25a5fd7a0d5dd634860655c4f14453f67b2de61976c66c45d7514f7735ec7a73cb2815efb18e858d9d78af0462ff8f2a2674da1b90830a191322845a4d9924936cb58f81964f3616642354a864d2760e8c91d2d75cf787ae59f7f34f1eb6846cffd0218ad79f003d6ec2ecbb7164615e2d7c52f5a6ad71ab8d9da47bd10ff239675ed4017efdbd73fb648269086096ff4133cf9c70d1cce006b6e60ca3c68192721ebdc3b6976d6c72774783b5e0931193f061aff5a38c3e74be63f0cf78cf496fd15feee4fc3e99e41ea2b1f30c1b8be7d14c037be2fd771b5700cc894c14ea6cff27da196bf22373ce350e46d512ec394821450f7f3151fe3b4d2f07585a0c97d28ccc69a96d0c9a1bd869817a17eb106d5fd0a8e715e2402a14b3d9720cce9c51ee4cb7c92bd3ac3beb51785eb79bfbf20d0347e16e841c51f79dbe0e18eecdbb94a8997acda8e1e5c06d53667e69ad3f885759a18dc44ba1f3aba817744535b516edb7c3787fcaf28fdcd1dd45574884375b649f24f264c2e522f77ea45d62ca6ef81b546290c923ff99162a9d8a0b", "ac6565005163", 0, -690841074, 0, "c31c8e70ae41f95054bd21fcbe4380a0385f765da437efae96e0fa3324ca3448"], + ["030000807082c40302b12611fa3f6441f2b8e2e55f6754507fae7b71a3dd331ff4de9eaf2b2b14c1b00100000000815fc6bf16a38358edea41b729ee3d56cb1f20cb34c0b7f3478976f2c783af33b9c96abd0100000008515252ac5351ac6a623a880c01e0677b0000000000076a0051ac51525200000000b0674de500", "5152", 0, -1069958644, 1537743641, "ef5904e0429421046449e37d92f7e43dc7793430c1dcb32a1630ec1c3c8348e7"], + ["82b9603c049ffa02dea415bee2f6c695c5a6138e31dcadf4c26fa48015d9f13e5445536e2e00000000026353b52fd7676d63fa5807757de64e03f8448ccde1189ee6743b66cebf5f626aab5d33567a43020000000965ac52656365535353695350973895a3be4bffd61daa4e9ea22ef3ef12029992b368c936211c5a55504963f82b01000000025351ffffffff21e0dc5908ec89a0cd93c845e9772ee0c13ac9167c9507f93fc3630ae50d4eb0000000000952ac5363ac53515165e5eb72a30381e7be000000000006005351525153d7df4201000000000700655163516a65ca17a30500000000016300000000030000000000000000d124970400000000f44cc7f723e1faec63b85c7b218406e4bd6240a959da7ffd38c085728159ed63fd475073bd569da6bba2a42016454f775d4fc19ed5b633c416f62635a1abf318a351c7c05dccff6fb2a604409b0308b9c61c3b40f2934ab4dfba09a0df49297900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f61458ecfcf8312f7934082d9acc48dd2b2b95d69d43b3e38cc836972e438afa116f2f5c19eea0644df892e8586a81fa12f3150b7cdef7d8d939fa9b118ec57f8cd0cf078388551c24d49ae193408848b17f2882b0a68bde6936880eaa9225728e3ab6e3df6010f0b15ca06e38e5f40230cd0168464894d6d93f3d5f4ba1c7af0212b69edcd7c34dba6956a0bb5e0f751ff4a126a26b65607b3f4a2c62d5cb1b81020d3c85b098246962bfb5324d43d9733d1c2ab2f7989ac78f7c40d6a53e2b38000a0199f043123e9bfd7550c854e2a09aa4a58bbe7122de210558e15d62812c5a09b9e852fb95cb272337da2a4548c04f1c3434e37a59af12993f531be323b41a5302253b09e3c7937c47165064c475ccf449980a52992718497061a066e2779d43c003015cde4fe0776873d90d7f0db3cc95daced053c604b9e8b8d135efd9a39833cb0311f01729ab1c8b3146bb14c5492f798e0183fb77ebbaaae9298e55f2ea91eb450228a3dd5c88e0746d8db750bf8e3d34f5f7c7dd8cbfa07dbc89bf8284897d3f340301f052a8e087b840b0e4981e076193d11cda7a54f3e8a455010393fe3ce42c6910ab3a48969b0bf76c7256396f6498375b1d9f2704ce1d911bcb15b71bf53998cc3f8c81825002372958b539019420872ba23285a4a6c6251bfd8dfdca41bff6e9fb0377373eedd2a7bc24fffa9260206ce9ee60a600ff0e87e4021843e086a6c10e70426ce22e3097b2cd921c498b6102dd13604541498355f504f911dcf35d16e0cce3be265842128bbf12927e94e375e5266d3f90281b1705decc52d3002e9415d8009790ffc7ee187530823bf020bed1a27d0e656001d5e259f8d005d082c15c4d097df2b76352f149cf6c88eb2c9e41491803865186f780bf14393ae804507970362ed6bc27de13e6d85c0b11e146f5e1af7b36e6eb37c756195df8464efba1feca8e889eacaa89dac7fe360c691b0aefaefed59d15365ad2eccfd48ba251631e01f39587524cb9a59b669481512e76198e372c34d0b6c9bfb5fb78be83cf14349db7de554775a26dcedf5f2b3694fad61159d61674627acf948113f14c5b900a2017d6d7f1317818d780e405c5fbab525a3a923dfd9d0f084675f7ca2ba3e66aeb87139900f97b79f0402a5548f96bfcfb249a24f4e33930189a8ff4c7c49178ce512d3523894ac7a7df2421a9fd46b37ceae47adce98c93c8e7988a0f78e9694851c2df1a95e25e70446ee7e74f0b2c7f4bd1aa144db90784cd3547b6437c88296439693ce514b2252397931d2773d18eb2cc70dce1591e2f589459e860dd9f72956927d421269e7d383be05e85a535499e5d6baf4ec6e7e4a9e7e08abe1adea6c9dff58bb23887cade29c3d11c950b349b917abb5e59c6dad7bdc9090451b7166063bfd3a7f4ad285c0151c7a204283f2fbd65e0b9452e74e5290c505576f16323c322691aad108cabe0c28cf38d074b5aa427f15b9838810a75e7950e0b95df7a426fe372d42cac0166e5860782c27ee523679e79980d2bb577075afc22b561f7f04f40e074d006c709b2fdc519135d93adabb331abdfd2912b21ac320b08f30abadd217976eaa8e60a3d6907c82bbeddb43ef56e8ed689ad432c428a894e96c0f1a4ab50e913960b3ec75d28ad9fbba6dec8895291435b98d94d80a4155155573b0d359fd0f0eeac82d661074689b9468c5ea00260a55f8384e0c04e1de441a991d7cab7a52c2e1029878de8f17ab00034de046cf2762875454f18a5c75b720b6615249312eb6d8014cae38f2a141646eb0fa7340b5a23173b11d7d3a2ea252e9dabd67cb175749e4eb483a4d6a42bbee74d9dd8ff75be2c2fdd7008019d4ec61a75e83a838cb1a487d388b901721c451034a2ce97c8cfe8565245a05548d614ee689d64cb32909a570199e7842f5c4e1c3d73bad89b0338bce8939bbf2833f58a23c297f5fca59afa500e767cb3ef050a18c441e3aa2418154f7097114c8245ecf13d645a67dfe5df26ad0edbf6293a02b6d000366a28f7d53aec14e12bdd674c9946cc51cbd12b55e4837c8d9751cc47339fcc3a97a081c6b084655d669b9703db6bd111f347b335eb53f9173e4d45bde26301306df82a9d9082640dc9ea14027c14bb6e6d57eb865f21cd2fc74959e4c0ad737cba2fb974975aed8d5a281477b62aefd330e45412013c45b03bf5140c296be934fb446e900963b806106d5875c8a89f9405ab37fb62a97336f826a0e7cfe2acef541e259919232faa734864bd2a1cfe34c7a88c61cd08e24a0000000000000000c1cd390000000000058f0c115f82ec83c6f7728b4a8d1f70dc7f58c680f1db57ead7e7ce3e9a15a69d2ecdb682ea2396030729fc590e1cd939d2b94515cc9e04891b95a7f21940ebd672228028555d9cd633c5287e03dca2de1ca29e156d94460702cb843787f23f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000685ed553242cb58caa77bbcccbd8eb61c18ddb55b5b30f2a56654f00fc7eef2b87e94e38b8ebf8052c149b2bb54a62021f319d3aba960dc45d0526f9eceb10fb413b5f0a4396f7ca497e0eb3d457d57874e5cc2d3bf0c778ad30316064281c1dc4758ba08522c097c82b7c616242afea1949c0dbc6d10ef7ed607ede632d01c302201972f8fa79161c47ea0f85b8e83e4672cda31bcf7d672a03f46e4fb1a3a3910325ffa41565385d16b22dec2ffdda0189ba9200ed9647ff52d51a27c98038a73f0b05bc00b386226892276b055a1d44ceeb642afe74271cc05cf1de617195422ff224129edd1680d018fb8749af95a8b703c3c92b12287c448440d88bbe8f0b2a78030557c441a2ecf0aaca224a2590ffa3dbf994ea5cf98180af4b02d12745b2ef86022951c805af428904bc39ceac98de705db5dfe0f37282e25f63251606f92063260318299356d54d813105698e419e10439b3bf35d1f10248b8876ebdfe752e36022022531b1ec9aa865a768ac7059a9493101ce15ccbcaa57c10fd0d43f89624f72ea021b9e19cfaa8f53022e45cb054e10e5ad4fa0b48295db52a506a2527adb40c5f7e5d997df5a99cdbdf1cb2440c685d81f7caa165526e209ac591ff2044d084692b8076439db36358cc200d408b9a705f3aab88a4233c29cbb04d6abfbc2411a345b6270886c6d4d2f72a752d541600fa16ef48b4161e461fe72dbb314542cac5299ca22331ab97eea0a2857aab6d466df08d2bda1b878ab94156a973fae7a0c253afdd72330e9d2b2348503fb19b61fbe6ef88da44f5651f10b8010358e2c39c9e44da7288ea1f4cb0bf8df74a4978edc5eaac059357e4b3892f745f9d212a5c7bcbc9a7f66b7a61221c5b381a9c49301654ade52244d0e7bd16c97095b1f5529668f428c4595ca57b08f554f1908f1ec0fd092ce950220030b08056c45e2275192919105b30bb4d670550840c735a747434c8f5bd3c236309195e2a548a0fd5681595ffda2c8da53a1a553ea5c2207e7857bcf12564fabc594e2ac44f0208baa51fb274d2c845f29d9af25a49da84b4c62a8b819628b89b44596b09ff3352f07cb4d22ed55cc1e9bfbd8cc74b5631428286bf3e346e1ba312e0fa5c892f992e4192e0d1658ce9f07436847f5ea8ba496056b0d5436a3d453cb7ba3d20f670c0d2cb70b7b3a0d1fae659ffc375807cb51c68a9959600dcce0cc3da49c36bbf23809e46d8698542a496316164596d8b8e32a9e2d47471548cd9fceed856840327d07d646972f5469a88414754a82f43e1e856d2459a4930209ce85e026294e2beaf18e2da4e42894df0d46f42d3587a25fba207b84e6df1c2bf894b128c6e4ff17142f9fe7e746dd2153fb199fa63b8d10d709b51edfa99073f2fe4af47d7a76022421e0d85fddd185c6edd54070f739377c4d5eb72eed23e7ae7fd305774cbb1f40bf465b8f51a729245abf20d809a47390fd0326c2217e389c072ab43647152928366834dcc71098c65e862e6db8f68b78a4750cbef10a53452118527dce3a38d3d339cb9a9ca0bbcae52fea76d0bc99ec0d174c8b8fbb083712ca31506aea46d51d0973bb87bb483dbb4d2471611640cacd2274d93653c86b8258950ea86559a5c9e5bad7242ce8ae40e1ab907ccf3fcc42d95aa5659235d067b7c9b5160ffaae7f63af2f39ffd82b3a349edc6858176e8e052778e5b0bd929cfe518df302a093caa9fb27853da9763dcb5a4a558c601b690bd0c82cb1964d738d3c2739e5e1e7f7728b6d6fbdf2a33b5f62800aaf29970c4dd17def5da1fa0b09c9edaff7039e9f601141624a135323092b3803cf9b90132aa5f996096928f1ed5af32e537d55dc4795c86ce5b13ea5a532ad1134a38d7a21a8a89427d565f133cac0623c6cc9d02a38a05655c42e60a0dada8c955cce7b3fe3025bde86a354d42b20dfc4c2a0655b8df79bcee8d1bc5b3c75899869224f80e4884891a08bc7da5681dec34a1811702d5dc83d08a1263e8a963ed20cdfd5b74b9e5093c0d39092310edfb8b4177ce3f377dae0f21a1c05def9c9fc9c9db69997a975e97c753cccc08308dbfc47b3ec4612a7cb906643b931a1f1fefc5b075748474cc3a877df94232ff25e0d076e77d082667ed614d7e29c3133ee742437a5b165fdc3234f79638dae2e602991f9371f00e46779af2d2d1f592c03244365d3263f1c6d78941a8b157b8d762c2519221e96c96716de1b7cc5a1f8727993ab0cc459a4491faa1aeb8af855c56db4ff0ff3735b9ee0f19b05bb0048fd12e14700000000000000000acd6704000000008bb3c16f983e8c33e58ccfee8953783bfb8e52f420031fdde77461611614be9117907371a1e06970057b0f5249acf9279b8f97c4fc2b9e92646d2efe580d74658de24d1394decbc3420c652573f3008815b8839f0b82a0302a47818446fc1026000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c1b5526e1a4c8032017cf269e634480fec4eca6e973835d970a0fbb4f6bc9febdd31397ff34dca77546f7c85d31c4590f02da199803b797b9a42c8dbcfc3be669637b2b3bc87a3b2bbccefde4b24451f7e4be377fa6c6c024119b7545135c25eb356581f91de69031aa4baa916ce2488031e3232ed25d1499a2c9ed75c8cf46022a32b6d5b896a5df308cc92099d3749dfe86e94f5abda1e4c6c6386d271d0ab2030ffb2e6b6b19abcbc97241ad0aec7f14699c62dcba012e151768746a823b79ce0b067d569c0d50445cc32c5558c21ea07cd99b387ba79b98f1c86fea57d6efc3d81dc659d370e37fbe858304ab038ea2bebb2c6154ceb521a5547c3f4372da2f7e0225646e850efcb1c6142326e25733ec59b89b930a9ca35e57290fa2887c49743f0230387a319aed4ec1a52a4c45143ab43f4daf1f845dff99a01f24cf0d6c49d0ba0303b339ce8bf2c6bbbe83facfb115b3ac46a0878bc07f81792f7151e2fbf276af021fb5f77f688f9fe7357182bcf9b924c9178ab9230ee403c3133911f5d678d048021df2a56ecb0d846470cbddb9d42ba0cf2c14082056d4d0b66ee6f436a336f09f64226160188e0b5d19cbf06a241d9fc42ef1bba619685cd0f961bf86a28c27e66261b1fca52f0dbf2e3aebfb364a828b1ccdc81c54edc867c58ad52ed8b13b77446d80deb1737b6585fd4748adb007e4998945f6973e79896080653f86d9d4e5a30a08dfe7deffbef1db5be0a4a84d6c65d2f5c8e4c46ce162f86bbcaa2a3ba97b083e1ab65deb88f3c1e30bfe68adbcb076fd7d8c591dc6bb1e9765e47d7f65925797664ecaf91af8a56ff2a1f6baadf9d34ea24b93581b8ef45809fadb6907d16a604d7df39874ab688f807993608fc91f95dda927236b047fc7443eb5808eb7d2cc4b444c312f05eb150e9ee351000166b15d56948eeafa1f6d9de8387c936d4f18f6a33e80ecf780c9b25ae0af2c9a89bafd37e8c6b930d6381f25e3a80551cc3211d21d3bf816c2611a7c55901bfed51a2f764ac7551c8cbfe4973cd65e86fcf4bc79ad8fd7adda6e55f4790a770a7b5fc74740a07dd342ed7c412cc98fb64ba6de4c0f7e66d840a8b75d1b023676aa06bf1c1108a5e4e192cf80c230b08363d569a5291d4cf6b52b87d2981a6bf9b2755cf7c90e04984bedc262be1db11469c6ddc28470f0db97d0d01ff933a404388ea5043f3187cd54e74e84b57d51a5f60e1c35ecaa79d7b4e98a2123415caaaec4fe359686e04197aba2b00e4105acd54406a580b69ffbad95f7760f53f36f65c1e31487640fa84e679664a316296acb372152950678ef941249b6a2e26a0b1ff58791eeb6f005b113b741887fb58b3b9e92c783cb8f5da2d50a537572ee20460f7961471b62583ca35544e499a3cb430542a7d68540a0a282581b202f84145d65f0816242a2fcdba5b6f2814d38a5bc009ec46bdbcf1b6b0ab0f6c5bd26b19a93f6ad45c17dc19329893c82084d18a06dcda812b8f19db4b8b01688a5672830c23775570ed2306413f1fe3c0d3e2d844e7d3a96c366ce98eadc5801b282ccf72743924730a9700dfad5a60ec12d21978162dd8b155be32cd7cf1f0e57c82a97b5ee8a8151914d81f02d8af23b83136daa29b0eb904b6424637b35813368de54d0151cf8ae92afd74b7991a8652762bb4b2bd4332b74c30ac6fce1d5c0ac6f96576b863d95cc06165a21164c08fae622918f1ccbfa3d570f305e5eabee9a55a9b6ec4c360d3e11c4256e1d28747d1e7b0088fac7109f4d8305c53ba82d18f3d4800f4e6189c01097e335ffa3e0f12ed7d823392e5f2cd548fc14a466a6d42a02e1bae1193b3710e2f4fe1de3cddd37ed8e6e5d6df8078333467da3aad9784d72b79e81523273fecf6dddc74bc24b406ef1ed83d342000fb06f99a03c96906213a79079b74f1cda993474eede678579a00fb3b6a7d5417acaa9320f3bebabfed3d18aac5d1997c6a5fd9d729fe93cb46e66b0c2caf779fdb481775fbe57cd4a5bfa19610f8ae3fc6cbbe5e6f04b37275a5b04db0a98e2dd0c730f4232f13bf9ed7341012ce8cdecd6dc27fd272431f77bf7b3a0bd613352a91d48fd4857f38a9d74f807db8c17de2b2482daa92383633796deeed2243b644fec1702e81d9693d8da39b4dad72f6aa3857f367af258e9ee2e2dfea59cf1056c15fbe366bf3df3e6f98b6402ea82710ee7626c7901a2e1097c3053d12d53cf9a9077fefaa0fe12a3e0565f879cbcd58705ae8b27e3f94628f6ca999837e97d0b99d213ab196aa812373c4cf706e097fd2004a786fb77f4525df1fedf7674adf51e2954cf81053bf538206a93d4d160cdc2051c91095c15ecd867ab0ae440d6d26ff21e791fc72d96553a0f6fb0aef1f05ce8c550dd0466dc183e8fd5473070eba9e87dc2e1a5c204", "52006a5163650000", 0, -1166786770, 0, "4e6d139c53ea6154d27e844b5d8d314ca6f55700781198ebc165385608e401df"], + ["ad96cf35021496c73457409ce5cf45fb16fc170e5f69d5d75748702c8ccf75e8105daed78a0300000000ffffffff0065051793bbe836d47d9cf15eda20da736cca8ec54428bc19fb3f37742b5a9f0200000006ac53536a636affffffff02836b4a020000000005655351ac65369f2e020000000009006352ac655200acac0000000000", "51ac635352", 1, 404611999, 1537743641, "5c9a0a45434f121b30def013e1bc3bd1a9a5094781d773dc10879b9a4dbca3b1"], + ["575b4f7002283e8ad486c6e0415646cd13355c7db3137bbd15ec1f3538e8da80a4eeb43fa503000000075252656563006afffffffffe128d774e38ebac0c0f8bd7a2b2e01a81b631dd0e570f26a2f52a7ae748391e01000000086a00650053635352ffffffff04cffe99030000000007ac5163ac516552c9a6680100000000015363209404000000000800005200636a53acf61b9f030000000002acac6155765e02554105020000000000000000000000009047b5a3602fb7c0ae0982a6e1bc7a6fc8d7efd69a7d078950c321ab6a414b0c01ee8461f8e1033afd561005f41705f1f8df8d07c9fddd49e4015d44a824e66eb1c280f640015c50563ced044bb4d314bcc147e4387b22e8071ad769f72e3ed200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000566d6b5b2941cf28846b0a02499b50e9f9338f90e8d4d3fa5354a689800618df26d0100c403978db3846741e3992c31fc603f764407a0c1f6ea38c0643274814dc11ddfffe51ca12fb91d8d84ed2b6930ffe46ef89a8686a103ea55b9e21543b093f109d0c23bfc6c0a5eb8eeebf7c329a23b4bc9cb6a0cdb97e43c5c3a69375022001fdeab032d4d8d7e27df5ee04cbd7ba883098c5caeff22329417455b58aa2020b93382cd85a49ab5f2b3d1b808d9a65c1d0c378abd03d851efe6c07b5cbaddb0a0782b23e729d04e861360a46634295ae19c344a7e730a2d58bc2dd56fd93c33dc6c85adc4bb76efcdefc83f1e90b68f83ffaf7575461e59ea0d3c45838d1bf0a0306924c87e4414108b87eb6f223d62d54ebdf90c256ca39962f2121ccc07aec530216ee1b2f234161173eb7a241a5d340594fc24607da84a0b0ac6117f2f9bececd0223b6b3858454d50d30fbd8fb122afa71d79d7ad4cedc36bca28f365074b7a56e030a3609aba875aa610f41b9e1636a7caaac4582a3f45e18d4589f4d9473863d4a022f06693e5ff27eef7d316dedd3e471bfd8ed2bb68a7cfb380fa3ec17c25da053f85dc8153a06dba636bbe92725ae88c603eb4b6573fda1d4c7ff73f77b6a2b652ae86eb96aebe1ae57383fd569db9f1ab09e396d6818b1e0edfdf5fe9f5d69755653822ea813dcbe56805ec1a8369f37a15289825748c92592859a8fc54cbcc1b665e65ea6c1c62179636e46f3b33527f210ca9e7ead4b43d845563bab637c99b518104fc5e9c9355cd6343c47f7b0e51095f31275ff54cb9f6a644fb396340fbc8d3e01292d48090f4724982d89160421518334fe6da730a13477dbd848c79eae433d9b19f94a51b66ecb87c3bfd4ccca759d909a3e2a49beca75a4059ce65922e8bc6da7e847fb2ee9442da73033b27cfbcb94b3009d98601e81ec77d5ec70487f59a2d7cd87f1ab7ad3d51086223a19f5b84d7941e226602ca2aee170eca034f1c2ca059ddaffb26f67902c04c3fa815d969ac5c1a9c6f3d8742b265d6b9d8b33ed71f4d96847aa7bc998ca4559b25404113dfe61bca86d15bfca7e8a9ccca755ceeb9e1336e471aad86914f7bb50ff83c2869fede378b3d218e8dcce4e125d1668b299e15163a7af966fd82097cda45efeb5534f14170859ebf65d03b04ab0e817697d72e4add2b2c0b9d9c3d6c5b816f6d6dd895456d81cf795d5ae56ee8fd5ed8775beeeaf47ac81fdd3b5b9c60523cbdf399ca2456a7410981073a7eab4d79baf17b0f0416ba5ca0487023e34e1851db156283cbed75c4a62271cb9e6121b527ad78bcd9307fd53686fd3bcbf933758edcb112c2b3b5fa09cefffecadae675176d98eafc7e022fca26b911bedf56cdf9580341e78b9d4e843228b3b28cc06046b2621a3bcad6452b2a9e91f7d26ac3677d99f5f7b886bff9755b10e31e7792a1e19fc33d2785053e4facfcb520622245c11ae7d33064f9a86b53c108c62927976a8dc5ade5f1153bb8c7af2da6a775335f6e08fe749e4ac7e8a80a2562bc96c1129cc113584bc98033e8d3628d3cf71ca63c2ee47579944c17212c35e11c39a15348e2389cd7f312fb9f6805210eaacd1bf6cdbb31e81fcedb0ca53da775f1e0b7b68044cd043850fa33272401b424973799b1407f83b7b5cca20e7e8fbae5b50805b867e640bb9089151a4826cdc2aa79a1378f146d779664fcf42d942dc3fa4c2509b31a11d97b26e3e7ccb36d0a16c48bef10636d6b5766ad47344b40df1997f7847a207bf2e75ddc6932c2aeea24ec2a6acdb31315143f987d6c008eef44188951ae88ca358ab91dfc6979f98b383cd950b3135f9b0b4e1fc2c2a1d81a48fec46a48fa1a7a903c30321e7304d4c97fcdee1a52471e49820e9b08be8d5023e24257bc5c72cd30aa6f8fccf25872c714b2801818bb65fe0f06c8a27a8c615162d284e5c7d4c29f0b50de25d3077be79fd0a1bd122790e85f8f7989b135320d108d5d8fe62f50fb4bbeeb90945c8d4f9ed99efb3efa996296eb7ffc4fbfb6896997d4982516bcb5f2ca3db35dfd478cda2e955647e39568e6fbf843f55b32dae1bdf0b6415b6e1468d8c6e131a88cfbe7fc6d5ddd8777140ea2333a57b628d93b1337bc574e4c7fb88c8e05ce679814c6b306863cc262de4498ecfa1c393082df65e56e83a5743587e37cea3b22cfb52f01cefabcb4de6cf135a08ebfc714a22c905e5b584a6f0db6c07fc7d11654c030c7cf4297ed5799418717872ac8667886b65f485de64f9990dc8ebe5af30166980000000000000000000000000006d2da2d0b224353f4a0435d6c3514c2674786e7725078c16767385b1b366f6f881ddf7c382d76c2a154608e0a8fccdd117898df94db440a372d2f5315df4a28bd4e43d74bd0bf90aebdff9d25e25dc44f3aa922c0696fee2dd9e33aea4c0b99f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060e00909b077b3cba15f1663e8cd5b87c629b824cdc2e1687e67afdcea8c80fd390d9386a3500d038f0a54fc20acc4e672468780ce61b2354417f1e55aa199b0c6636791a4b5e1f8f045c70fa7ac431486e55d8cdc229010347555b2a30ec5b3a14870f222a6efa5cb1eda7a4c6a440a63837599d938e356b5b6fc94d3b2ab0703004e7b7367378718175a41c0f60bea1d0d772c74c93b2435b11f2ad47d4d65ed0210df9c84d1a356dc5404d500d8eda502dfcf235e155554983b52a22ced867b650a08f2f3a92ab9e8d3849593c33c75042010d109864aa454e70816b9aea0ee1fadef948f9843cc1971fdb2dd625e3d579cee26646c985cceb629a4057bec08c3a903200410d82eb42c3c4a735bd62fc42290bc403326518e144e67d351061ec459c3031f73b073f3f8b34faedb439c94a2ae7cdb73376b348c58bcc1dc7362630c255103087ce5ba7a9dd9320c0dba496340b8fd378817224d05a40169893f9d48c3bbec021ad0049754fe85b74355074ff379005bbf2c13566c15a42f20e5229d86e735bf03045de1f4e516c5c5d55e4874b0fd9df70cf9524fd952edeab634152b60956234c152a23829a91c2781e5f50d567b343d4676d25f23a7a1374f42cf21b473f29df641af5a1d83f346c8b09e667aa0bd843884f54929892745ebeefcbd52c6381dd84bbbaaa588c9c94b4c41ec027c9a082a093857d9ce726f095982ae8fdd010c0a6f510f64c7dadf993a43be38736963e58c4e85be6c41351145c309360c29f6d48516145fb91a7800f12c9acef85d36f566a089939074706489f71e581d8dc11bd1d2dc8a4c20d756ff5e2b4bbda45ea3ebb3f104a259b69cda1b0bc6adccb2c0f27603b6227b1ac30cf5d21bccc7de6b9bbf2cd1c01190bd7201ab75f455731da42f574964f2ad5e6078d6bc00cfd1c3a1f17b93b055e8ec3fb891e9849ddddc80335687d97b7b4e2211899819ce618be43e4000bf487872ca6b950a319dfec1fe3847c74e23ebd5934417a904d9d74ebb7e5096a7d269b8f56ce1eea6745e87379c09a2bf56cbde8519f8a8827f218606634fd68beb66a48b8f5387084d734b4df2733e35c34a11ac2e083df5e0258ee02ad70465bb56c4d438dfac79be0c7413e0823bdc89fc30b9bd63b7c809ca8176d146c44fc3d0aee5dd53eb4fbbc222c61fc5e13e1c479cb69b33e168dfca7a2a08e8fd64fdc8922ed89cd0b607741cae8537d4edc9969f7089409bf6d84e0aa3f3bb91eba327ed5c60a0b1b2c9ab89c2610883d2a270c8fda168708eb7b97fa8d5acc463d6240f1ad7fb3a1f1c1ebd844408dd1221d6fd911e88d6d9969a749864727e460a43d80b8a8f5d1882975ac71265aa4a7013e10e025a0f1fb1893f58ea9b158bf9b02d2e70c594a641443c20fd93f465b907c762cd5f82e72cfe7928c7d7338909afec0aa59327ac73c75170b6601ce89954a939e34f1c406cae0b37bc11e0de50d5642a2c57db0cbef410487947cb2b3eb0c199c230ad42cae0f3792814c1911daf19e2ca9ba109c9d356dc827555b8c747a55a8912c94cc519659579c48b0818e126866dd3e039066446363565ddebf219aa1f36503469314a2b714478483bbc830bbdcbdd0ec10481e28c17811ea9087694f8bfdbe23e50ed43b7e98cc3d8af08d8d7a9d4ae7fe8945e198a5d284c619ac7ec98d5a942a05755f0fd8a84168b2e110c5f7801ed8e1b46d70fa0ff36ca75a266408d07aa74962ec9c85188f80998261846a92a8613f2ff9bf614fe2fdf674bb2931c17720b2878d60a0e9e718e8c58f022ef21e93bc0646f1a6ebffb939c1026250e3a62def65e1e2bc75bccf07a579f9d2e0fc8cac534257b64930f650ed986a2e8bbf05192f72e7a126ffbd1086959c3f335507df58572005d6efaeea2e861f98006d41b968198aada4378a13bf892645b1504f97c6bb96653cbd35e5210d7c3795b44dcfc12832809bd206637c8685bbde3eaea25465be4e10d943fa06802d65546dc37bc0b4694ddcdea91fc6b3a4110f9a52ac0d2a970f4d2d3691680d1bccb41d79316d9ce560f9d84762aafedcfd54434c6f8774885ccbaeb9c1820a96fa9d4e0be0582935b757eeb8708a0357b381cd1d06c1e342e380f68cc671aa43d253089480c3eadeac3bb211a6a5e283a24f15ea00b18e3916d2b2b3cde399141c9e37f36218670ef6128232ff83170a27abe7c7b20a00ef46dd37e91bec589b94dc1edf3de41010111a777449ceaaa2cbc356234a35bccec032b58f6f92517e49cbe883495b6ccb1bf1aa6125d1fd58c08a275492cbc81a36aaa65031107afb277b3deb6457287d417bcf693f17d5ae0b06fddfcd6b8a73c8eafdc51c69e164efcbc242313b149a5d7a07516d62e9fb0bf4d7fa8e0d291d8319dea280fb85bd074056c2352810d", "5152", 1, 306691663, 1537743641, "3d157217f4eb578051c61548f6bbe8e26dcedad993f68b4ab898ff812c77f111"], + ["040a3d610407e439c56ff8afe4328fed74e274de9c8a10e054e295eb0721cf273e30dde5b500000000026a6affffffffe45fcdfa5400fa873391de764f4c513adf5ff225e16640628fd17d1e5d3aeb660100000009526a6a53ac536a6a6a7594e9916ec68b6c971ca18d867136e0c45f1549b78248717b52ed698e87b692c2d6baa902000000025363fd28fe1d9e7231c33f5c11a93242f9931bfe9ea8dd6195a99159231f75e13b9fe5a2d6b001000000065251ac6553656a18c82c047ca1410000000000076a006a656300633553320300000000036a52525e132c03000000000851536aac526a6a0036e259030000000007ac51510052656501b93d1500", "6a63", 1, -770469476, 0, "d2e7ac79fffac6a8fe5adc3999ccc0ce83849fc8469223869d40e754545e8495"], + ["8bc5717502e3090d7af50f3c4afbf585225da07988ba035b903da797704d0ea561dcc7a16401000000046a526a6aa61b378d70132ed3bd88ed190b1f68ef5ef16371d7e8880caa82e37eccb9a5a5806fa4ae010000000751636a53656a65ffffffff03e481af040000000000f4341e0500000000076aacac52515200a59ad305000000000653005365ac5100000000010000000000000000c8958200000000004f161e077aa6eeea39eec383375aff5f782a0efb6a89769af2c617a05c2d1715eb66cf773dc5aba053bdb1c59a5f2d90a607a00bd4074b85916817076069fdc81ab7f6878dabb1ae46b2b0fbddb2f66001ee983fe481ad54ffecd15f8a65d4d8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e855dc33d6bbeb7734f1ed0ed9a6cab18e529c23ad6cf06961ec8c7a085d9357f44de0f1741fef7d1bcc19cbcb1f9544e0bd72d129126e2fd5d318c57fe95738faec54d3ea549c9521329b1f5f9e75289ee2dfb05c06fd44e8bf598a2a14ef08972951f3049569cf50215c7b673c16a1b542fa869991a5e3e9e262372b58f99022004f375ca25be218b5f484c68bd33aa4d9a327903723e3d58b4c61548c12b2f0329ff0a29ae2f2f302f30c4d043b7ebe4cd953a3ce58f86ae3f9f8f8da3ba0c240a0154d8d36e1a36d74cac8b47e1d236b57af7281ed06c38cc8f2e4e3dfc4661824c39d6bf846a36afed1f7888702c3a86e8931a90b7ca28f245fc0ba0f21aff720317d4e1a2de148fc75d6207c6871126790bd8739a14a65dacf8b04f557e8665f00224aac7ff496eb987f6fb711baec801c82ae64ef6402eee3a3bd2856d9310076602171d110cdf6b20847e9ab10f3f09dbb13c3f5d638d556d52d01d7d4a6d614f13021024f87dffe73619da1b96bc6834b2705542bfe459786d379e862c890f2d99340217c4f7d938f00beb0f2471e705a720ead64f93dcfb48199b017e3d014ce76052f8849e1b762642a641b4854a1fe0a5c3171ed0affdcc4709083a4a3b2c8edd18e4edabe9ca068017f4d1825b782f59fa0a32ca00dc26f3ac61406545de685d51c212c044da6151cfd079b95360aeed00d0e04385a8440d4adea759b71d245f08a05e70085710f6ed3c1a4b209d42c4dee6902f02fc0012e26abfa64246a0637fafceccc7f87a7f38f0bda7378284f745f3ed888ac3c305a8ab53950e9a0a5dfee583b61e38d2d902640a4b385eff94ba33ca2718d725b7993de2ad51dd5db1e0af360b1f46e45783e078607d36b099d7de1bb65605e2602f8d59634210c8629515ea2c50b9c5bebcb36bc3bb4d3939faa0396118357716e5d6e668d53d9808c4294dcb2ca8723fc7079d426165720a82c7bc72b340ae7625ece87c4bcfb242f7dd9d53266ea5718ac770502ddada9105ab36a77be64e471fe522ce01dc2d6e4723df18a05e2ef897898c33ff67e0919b6c2bc7a58a493db8c90a65f4b8662d2399cb9e2886b0d3133842887f9c63c2c9c37db706e8a13b2607d1c075e31db67aa7466dade541d018269b8aa69d91d4eee8bd50728e18b4616ac8652746e3194addd3535cc2204e9e2a9f246be62d318257e1d619168a772c565c49ba65b92a04a38f7acf467e755bd8dcd61aac6e8d71bc1365b31750c2872a13053722b1afc176b242a0b9d91092545b6c56d7af50e1c36c99391822fde4afe3b700b99ef19b6f8eae471e700905bc5c3e8d4de515a15107668525e60e950e4a3dc353fbc47bdc2fc83d2ecbc16c55a68ada476ad331188bc02b3490b4bc26671ee3444a89395c1871157dff6671fdf6f22b08f51b274a7dafe29ae8db0c0995f0af2763901ba2fcb5680a1be276e11ff146435fa1383b499b41d545a8e74496fb02f5edf3b7fbbcfabe91f91cf895c9b8470a01aecd305417f5f28f5c8ecc4c2db49ceb5e033ef363e36f775af9b35592d23ab1eb7adb4a65607773a6db2e5d07a9e8713848f4ee737aee5049cd7dd69a4006a9248c29aa1c93f7fc6a648547316a47a9edcf2da777519bc797a2517d3a62598bba9e881fd53190fda172bb823259dd47601a948b712450ed1d66a48190360030a9b2235286bcccfb684cd61a0799978da27277176785228bb855e9166e41bd9c6b22ef9fe07d669a9cd27868d69ed984cf24aa2c421a26bcd18ad6ee5c0b0f1484378071fd995c89b59efe37d0c6a19f6d88c67dcc555478831032dd8dcaee768cea016fed5cdb0709473c5897a6388fc22ebbd635431db29a700e112c2f8897643bf52345b9498f7d065636508b5d57b6a1b0758934ea53336e4692d4bec7ab66219b1a7c40a236b964595ad91589374906d8a0307e980c402f420be7b2a865a7a283e8fc1a8b5635a37915879ab345327bb106098175f674a8c8bb4e0e5ad86b84d88654d1861b175845a234f5dcb4f78e9af24fdda1e0f794cbaa5b51e60980f8e398b94e2e2bd9e9eb61d1e44e4f00b6b3e4c814b49072ae246a3e045fd77ed398e4bc1f079f660510fcf02f97936919a4347f8f126b376e2e06db65de1a9c350180dca886bb161d078c46e26ccb17714590fdf3142a67523a055f1e0b0580a4849bd661282e74b80b740667ad2d0514c61aaf3f2a177677c234b8c14c1e88f3f92115e439636765f7e153be71e2f2d16af3894b63d21c5c9d5b4bf57fac75c48bd7cf230ea87412c93165c42b248edbd8c540c77b6edcd358a6f56b00dae595c3a9c0f224004114c77e7fcce8b24cdfd1ad8e3c53516bfa63cd4d15f7cd510625c2716d26432e2151fb9a21aff73be6767f886a209faa9116fdc217b0545d8d2502", "", 1, -144406872, 0, "d7e7097a8396d488cdf8a37ddd02021a80a710ff9662fca37422299a00843837"], + ["9eaee13201c6b8c59dd059c98ee5cb1ad200330de6052c8e445bf32a51118df2770dd8df83000000000465636553ffffffff023055b302000000000853526a516a656300825b4c020000000007656a63acac00ac0000000000", "65", 0, 899587373, 1537743641, "7ec0231b0f240f9474e858d063498f2c84ae0f51ea7d0321afc55c99190fdeee"], + ["030000807082c40303c8b05b7dd8bcf5a632a2fe7955de06ea2911a19989f101dc550654982ad2be670100000009ac5163536aac655300ffffffffa42211b4aa46eed2ad9ee2210c4b390a86bcf0a52ec687b1475fe7f665a149ea01000000085251ac5265656a0064e9c3057692cf3d447b808416090748a50d34d563b2fa69defaa74fa7a475fc919672710000000006630053515251ffffffff011b0a6d000000000004535300ac3ecb70280000000000", "53", 2, -366120767, 1537743641, "388c6dfc57291cd4eee072f7ce4c291c7033e5aaaa89f8a7d68121d89d54b443"], + ["030000807082c403041e5a839f58657dd854841b917f0c691e6f8b5c4d098a184b4de94db75af58092020000000953ac006a6352536500aebc3ab7fe6631f2006f2ccf992f93ceea7267003298a182a7765087e599be25a557ac230300000000413eca586a0c036f480a80e4e0e421ae5f006d0497db648e3287d183bbd3b3ed2c8a5e9701000000016a9c38b0f631b5972d16f1c56f85a09fdbe51b75d5af2742d3f1de269114ec7f4b9d7b8c88020000000100ffffffff0340a8c9010000000002005278a3cf0500000000015326b0b600000000000500535153530000000072b2b0a500", "6551516552", 1, -337421895, 1537743641, "a09a52f8baddc3ce1660228552678d98ee546c7583c3fc1456d732f79714eab0"], + ["1e2b94600160e71a0ab14ccc3ff8ab2e8cb7224c0235378da40faa6a6d92e519adeff13a4e01000000056552005251d72cd4b501667bbf05000000000765520053635152000000000367332605000000000000000000000000b34b95093b31108d6191a2319453cbadd86beb2d544e24be291d2283037a9407f4b2d123b97598c42d8dfe2d834b086d852a70f508ca76a562b8a79aba3fc4cb68e198d0604014d9ade129072967c16214a216145d456b419eb8b665d1a9e8d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ca73a5141d878f62a9253034588d9985f9c9429aaad3833d071715c4e5d0c9b3e2cec440cae521c5681a3f623ec6372007c5b9bfc405af89fe6a9191ab6727ad6ec873e9a5f7be980d7587b5c972e3276dd995e3b59e02d0255997dc722ea7c74038297eefb3303f290844ec7b9160128ab3d7808be1280510acb65e0488a6080309d559ab65b80864100bc019bbae50be2a255a72143297f3a055e2240cd6aa04030f9b387844fb8c2d4402c6caa3411b19b63b48e766df08c0a156f96fe688854e0b009595bcce4a4bf66e4c5021571eb43b6973437f1688e7623a729086854e3025cd382a8868ea8a5a384c93bf488124a967e6cda4569469d7fc71571ac649c54e0228ba16a940650273b995b657651f85eda63bc8bfb594e5abacc1863eb3f6e09b020f1d43fc6ca29deeab51648ab9403f63c9978dc506c874ae914d536ae7a6dd9b03294ab01306aa0103dd28685d2ed08db86d0993d8aca8fe578a7fe4cb148ada8c020809434b6a964774d53f1af28bae2da490f26f7229da0fdbde9550a89f1df15c0227ede5ace93ce3a600465bdbba514f017f112e37c6dda852ff1e1fa365ed725070c52d44751e1f2a39e696491c4a17217b3ddc5b4adaf80e5c682f31e47376e938050b66040c1cf9249262c05b8a982a18efe08d29abc1c085063c587aea61c3ce2fd1748e2a637b7f11510f5e6e9be0f05b7285d34124c45b7939cb660ec91ae3dd5f32768850914d44eb097505745946b55dc433b06051ae6cb782dda42e215b76536f0e11b7c1bfda69f7993db41e71cc112642b89382166be2872ea914117b05110f37b1fefa1533041144437eb11fba93a2861117522363d343c02abd6307b489a0707a256e464f0d6d84fc30142f313ce58a5c4198084cf29b64f9862267f7779ed909683c80370aae01a2b3e4b0924d49c91ae92667c7c3aae147597345e0a941278d1f2cf3ddb57d44c33308c5b668bd058bd96ac0e7875f02ecf74744b8e216a759f5021b3ce71aead6f03091295c648b7db739f29e94796d9e45bbe25c2aa59ff0152bb53f976642b1b6b4c43f4d2d5aa56ada9e0ab30fbd117cfca9d8555c9dc7ad476f8becf80e3b3d9ff1a8b101c9ff1fb4a8eb96ef39a9cecdcdcbb62d06dd015526157e53841b84c6f344a04995c40ccf35689fbd3ffd572c3864243e16fa257ce491f3d1de08cde227f782a96e5e1a29278394b54f488c2852c48752cca149f5b9809ba86fb31fdcb340cb80018c9db855a90e967ee4a8c275891039a38e21bbfd9ab10f911cff3d0fb19c50b456b09d7ff33bde831f87296c5497a1cfb26a255b88f774a06de05cf32eee62bd0f7671a325a41e294a60e4c87d463b0d213991238df751f81634b961345f356615f8d841668acb50c6063a68c8dd509fd915a778f9a164a7189ca06a7ad5dbba31cbcf84355691fc7d2d8c5074a5f1edb2f9bb3119f235c0daead9e8dff1a4c96b4ca198441b95dd0414e1895304b8a33123349becc6dfc3aa7368fe633216bd83578a382bbcb5ce89e45f0681b341936cece49895c6b1e0942b5f885778880d62f2629261406c4f50e0d8cc4de5d3919f29120f727e33b966929f6bcc472e78b1f96387480a3363208d8d51b7ee0a0350237a56425e2888e9f73ddaf06d3f21579140e9eba47415388c24a51e58afcb0b82f1076ec69663394d1ddac646b9a73ca8cf98f0f1b1958d7e882232da8a8b1e859c8c1ac30d5cbcff86dc6c2bf2e933000c85f5dd2ab9553e04997c5b59e69e614c09c1192b6f8526b0fede4bf68b2312ac4cd4cea6baa229c5d7ac76e4f4040d084ff687b993348ace79307be36844bee131a64f7ec2709971ae528ccb43712fb82203ef86e76f5afd48133e137d3575b6b4a7d6273878d2eb9f21695837aa4c616ec68120f8dc404946c6b45941cfb54696e6ad0f8edef1e661661669d937489aea574050810ce3d2ba8a8998c7b55c04a9b12ef63d5c7569798d9913e97e50a46d06c25abcdd7b755fc0250b0005a378d9f2f8fa58b6d8716ebd939d46fc2683bf13b037d532fcd5904e64e75e99213bf5edafcff7c93cdbbe618ab588df43f9483bb420fd158fde7276a4c68650bcebc5c51b12d1cb00a1f42ad9511b32087f3b6d0130c8c498336c13f38a789958204d26a3dd5ae08d694d2ce02c4919beca140cea5d5498ea8d0812e0284962995fc4cf783b8875b528813c24ddde4e2b9a8cc73240cb1b82f6f67d1fcb29ca4f35eae494f2f52a72d3a813c4df398b1f05ad017908a7b5c217529ece3fd404000000000000000000000000ddd8aede857de69dff271a70ffb356700b534359bf3b927f14e6c48fc48a7695ec00a1aeef1d0023fd397eebfde0f4a9b186c116eab20231da729c9a7b466fb793163d51b53e0c3fcb7c4ead1dd56e7880a35ead458d4a82d0c68f954399273300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e936ae4b72164ddbf1efca88e762f1aad4a2277c351470c5ef1981aec62ed13743f3911aab835a89035534f8e32b88ae0da8a96a6bc36371fbd8d9945c7f2ab6613138e74689dc56cd78a529d4ae7a9d76bae32bc406f6b147dc9644f5bc74a566c3950a667213eaf63f11ae77109ba58172afdc5d71a7d177978a607f5c4fa70306a04a23fba4d86702e317a7719af5e981f0668206cc0740bcc18bcad7aa6df40227c42d68b2ccf41773c6e23c4653668d70c35ab92ca9f84ba7c15ca731895def0b05ee68ea3eec8a3083ccce1bcf631d750cf10385323d67ddf0b87619c96d2f7e8b15ac686523061d1b96281d132b70720e1895764a1ebad228af85756e7b2b0c03087fb9104e62b1729e269e18a263462d33a222827612d59ad47a4cae1636940703002e5c984051ccbe3892b6159c140e01f97a0fac4aec461081fae699ebb2b8c3031378ccb9e79a622093fbfb275abd07ef6eeb4df7795f9065c4969f185997891c03297e13454e2bd36b907cc82055a252b0a51313d65aab8238e2c2938be314af030316c30908fcb24c055428ba9cb0b068cab21ced68e0d4f8d6ad0c4c2f9a88e18376fa0e625758c9ceeae410939641626daa840be32102ce2b0b4b61618c9c833788d4d2c70e09884850ec46d0056595dd9ec6d1da8dc6a8f8ef0dd57715334df3014061b364edfd3966b2e5afe4b88ad78e61c5896ad46ab0fe927620f2b0331871a2c1cf38813c01e946432746d5bd76dcef2523cabfb16fe053c1ad351c82defa1782201bd4a874a399f0dd35bf8d691210c39020d9b2b86decb5809c0820d634035dd181e65601aa82b6c3c9f5c31176c74423d4cec5f9803a6cf02713fde3d83c0f17ea0984f0b68c8a62ee31cee983a30bba020851c3384cefc56ed387eaad1bb3975aacd7cbff8ab53661c01dd57cbf46c4b5fa14bbfc3d6ad2172ee056726a12f9c61cc7f6c3e0c4172e18649ad9bc0c03133a7f95850829726c57fc94d1bf5191ce2e04b757828482228af653f436814f3c1acc8b9bb5e7ebdaa284d2d287fede0376d8e93152512cb6ddf5e39299fc7b11c17355281579a3654df30c40ef0c21ea5f02ffd49b094758b5744ae6447ce81e76539db0ed9dff5369b7dde15a6bb99c7f0f6757d428115da3f837d09ed248e24de19ab4079838474b47fcdf3947eebd1af8c8ea005a97730eed63d70e6a24bedb84178d9f26acbf194b454c73416b4b6de846b3b4f0d695b418fe4fc8463b70728f8a6c3bcefdf804a7df7ea6ea6a9d3adc74b07613b71a2b7543382c2ac31d858f7991740422a575e5eb4c84e30a5ae6cce1267ba4e5e2f9e50a2019cf154abf741dd541b57ebe0b4c586dbcd2c730e8d7791ff606250af184d40af45d2ad134a1d6feffbccff5e951211a930b98e87b833cebb4e189576b85482079979827a7024aba435a6452140dd1bc0c8c5ccc8c34485d60cff44050d67bb91799177ee476d7b22ac4565e27c6d124a8c719f481414e59dfb536ffd1e3c8735c70a1f955a9b22545856d1309912c97dc7cc0048d19ef16b67d539dbb2dbbd607c8f4b743ca4ac795e8761bff64b4393f526a2947b6cad370dd36c641421a77fb02b6a05cee163e7413af871f17a44c6d090b4d180a923ce8fe7425f1594f75da318db9151eb85b5a5b775863e03c0d76ed5bddffb5b33c6ec2c99327641aa77de35bc4c51187ea89348b7d2557ae305c4b75621b8949cf2fa890b34695fd1c834c7c50f307829e5b767eb541925b760c5477a05d57a052d16c0a372901d01f4d9ac9c28a6e54ca37371f4b10407d2571f2cf306294aeffad54211bafc4aa2fdfbdb0fb8fbc5a5d47c81890eda85f71cf0149d9400bf807a37baaa11bd73e3ce8321cf6422573e967ce5c73b5dce91a652dac5fecb04025d1c39ec555c13bb8c645b719a301b39836df6be04d54241a9cee8101650a7692e4d8078de745731e3d9daf00515cfee731d4c1fb07a9947e2c48ca0d75e49730464c6872c27b16b34a8f05300c2c3c3454a4300348dccb0a7ea57b444ec1a75f57089544ce5bf3871839dc7bb859a6692bdaedfd994da91d14df4dfcb7d56d10267513d40b287d67d0f921edea511d3dd94dd76333ab0d732f8f6cd03328aec9410dfecc926fdf585817e5d4b7cafc6f0bf46cf5e7ce23bf1f3ec14b5c3607356288cf8e864380e034ac31f008d4c71f2ea5f3a44b7dd133f3b1f3b050dfe6f70267ee3197e2b7154707e043593b0d2c817d8b132293e588e136741b9999573c74ec50319da303574900000000000000006ba5670200000000fa23276100ee17e970847d30e9ef8a2af36b581b5ba0cd44899eacc1c861ca87e620c5b19dd6519f31213994e3598f14deca0ac7c0f4fff640801c698f5543ea7ae02956aedf0699aaa94672f4f2b108c65621476e7c8148e79955d5a9065ccb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e6ebe1b8fe5701520555f9534c2c6c1f4d1f92a835c974b0298175916f54fa716859c315078635f415d6138bc308cf6887bffc1e9473f959d91d8759fc439af02b7d3d1f8ee5ecfd22d7a06735f981ee8f815b7b02b67cf4494b12480db928b3160bd0a1a180d50d4f76ca78a5c4093a133c9a49fcf3e8ca5bfe535a4e160930325e98e09c61dcdb83e25c93651c7731fe73dd71a50e3cb440a65128a6884a0f40229521e875e600624287a80c2c363f4a5e00d3c0d64ae26e277515b1a1531086f0b059fd46a61d9ad2cbb08d63da04d1501739ff2b1c109a8d224e939513d552a703d4f11bea27aed45f502a01db244213b408f9b0324f1c0dd992b90729b4165f00320834bd1637cfc91a5b8dcf261f2eadfbeefe28df8ad5314b7a23cbcfecb7575030fa08e96bdec8c1d2903acb0f17ff63aadd8f260c01faa4f90d318ab30dbc2a102021714e7b8d5aeceb560661666567d2124931ae489be5dfc20a51ca5d63f7cc502205fb55d9691ec5e892c7e15cdf5b1520030061c107d3447425a4b25eb38f49f02149395bf4aabd9ee1c2df0add4e79db9966cafef2efe8b6726886710eef698fb6b5be5e0c7b5ee2c4672b7798d183713dd21a1dc03e035e9cf41d0e1806638d0c8444c02e749920f458f97b2abed507c8732895ddd24a1b35f7fd6d1ee0b4c9d3666369047956e08327048dd75bbf962356a5acc0c851101dfd8c279520441ad8f8fca0ba9faebfc6ac7931f269adb813c85138a89de6fbc9a17febdac2697bb3ff0b67c2530c0a373ba3022b439cb79321fd6e44cca29e3e0d1ae38eba05a676bf2252fdb53ff24ff28cff11198f2dac13c9cbb2cfc8c6d4951c5c7a617cc5d6294a1204b79af5be5cdd805d89bc0ec48384aa52d4bbf7e7a975a697c1f03aa2fb24dfff429ff40802677039e85932cb5a17f2ca38b65daf921032b9892914784bc42bd83ca5bbe71017c434ae232e04efbd6df827cde6f1dbac59edfd84727405c844c7d88911bd485628390561ebee4df8b3661f44df571b9a46e7b26399b288f73ebbb63cb5961b665c6a9329f28307de416858f953adb730fc05c92d3f7ea6da5e287fff3df8cf015a95a1c2410c8534db87267a4f96c9adcdbc1d8fd23582b8d2b8b0972deb06615c3fe328485007fc6320de9616f9ac9093a14524612a1088fe20ad9793d54944bde966dafe8c269c7f1cbb7f9d5c0fab767fba39dcfa7d9b6f77d1fad2d3f55456da3ec6103de5535997ed1206a1f31e3be00aba0bb6cc43e9e71bfaac2d387ac5ff37f8abbe55438ddcb5544b7082fb7f18b5121abe5ed9a6d5488b1efdb7afbae776d6213642a459498ee6c576c164582b28f12044e99fc9ce5aab8c482da1df7323469a64e2f6eb7301a197d652594d6e865632ddf29d5408a292cd9599f1975fa031525cccdae1affaf9b4610c6ebc7c55e27c598078db308ed55e4473bcd04e79f81ac7d1e291712c42ab71fc67366bbe51042e2741560315f8435fddb87fe478742099b928fdea0e54b1f447ab6429740b47515f8763367016e61bbc24d7028606537454e543d7fd22092be8190d03fa4d3e1a1fa95cd127ebabb199905dbfbde1044b7988c7b10ede629c8a6e7902c0ddcc3044d0c3b452bd1f3c777dace76d0c25853846d27affca244a88fdfb93339dede4ca563cf9697425abc9f620e17795cc9a38a9f7d002cae5b048caa055fca89ef4dec950c145c80059f893c3704aa30730208f3237cbc4de194c8182ecbf18d68347d148e6c5f697bfd0053711d61fb606dccfa4c873f20980ccac40a28bb21e26918dc1f21409dd29478edc6f6f7a4f01a1bca506b941fd79146aa9a6a9c66940dc8787de07153e94276a63f0c38aa5d973ff451d59adfcfac3eebf509ae777657281fe4abec2832affdfc951c331ff7b0cb1eca6d7df3587ba07bd74c273aae8308a132628c55a63fb1b1037f7f8d61f6544f86e0b1fa58eb8b34882d004af7c547a234a61382cc44974cebedc5e321b534f3ed205fdbec6ffbd117f08ae3222e9cc1382aea3ad30564867e7c35e7a60176be733ef3083ad7f8668dae63fd07f29ca8ee459a2e4724582726b27986bd50b33329e92a16a01847017f3e4a433355d2f9025511bd62be2ccafc02e83a8943c5ed16b90449fa027b9485450783732e60c7188a8abbdc6e064db91505df3cb02ac2f2849807d85c64cc7ea35037e7f76c8b74cbcf557e6bb3449ff9d810215ba8c02f126fc5da03ff4271e67b64a258fc8955e2b28d39ec6d54ad56cf7c739a7cb8cd1967d258d5cf4e5d99a2df8a28f2bb82dda8a0145ebf901f64587fb3c37e65cfd6831ca3fdb8dc1856bec90c335b079c6b13a2f1551b9695f8f3217017a8770279e173a00044818f9f99d832e3a63732995a8b145bd273c0905f0a197105", "516563530051525163", 0, 1989934335, 0, "165f611ecf21c9dbd4bc07fc526c7abf55893367982d3c1903ce4d5ee7d99c5d"], + ["b4dd23530332fe76dfe9ba0a6d90d104d38b035e3baa01dfa187e7d46fe5730c0e9c6bec9a030000000653ac6a525365ffffffff607f485fe6b8c898e2a91f0c0825c75f4c0c27f431ce577f20f8c94906c100190100000009526552656500516300bd241ea7fc3ac43b1e85360f222b189ee49dffea369aaf96b3492e216d0f17b2c5e7aa800100000002655311937d400222970304000000000265ac0380e503000000000765ac0053ac656a0000000000", "515353", 1, 423769690, 0, "997dabc362750faa48304d97cbd2975103cae785213f6f702f9317a59438688e"], + ["0bb1213304674222a1dcf78be33c7b7d00723abfd7660ab20b3667b1f4308cdf02ee671cdb01000000056a005163acffffffffc56d800b713a5cda35cb3261eb187be8bab3daa83c079d192498f88ca68114e8030000000400ac5352e0e2353f8eae579406edd13378539c9675058ca44c68881efb4dafe02da6d1907feec7de03000000000701247b75e90f5449c067311297547d3094eb5e954ad2774bf58adc9491c0b406311e620300000003005163ffffffff02e9a05f01000000000163074892020000000008acac53ac63656553000000000393fb0a000000000000000000000000006948bb6594ac0c03b693cdcb4f4335e1ae44c8113fa50de602ed69dbd13daef05d928034fa5da178afafc2d6e43737856a2a49a142d390cb4ca37b546f8283159c49ac223251877e268d1a178dcaa13e5f86cb8f0363174cb3429917db2494ad0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006779b029ae5474ab4eefadd082543aaa653f6c673764350e1411a8d844c37599ead2ee62747bf591c54823fadd61f512933d1c2cfd8d2ac44ded4d299dd6123752bb33763d53927550663e126163938d3a32721988bdc909dffb566bcb055d60adcecdd7db8716dc5d9048f44aa42fce4ee76661d64aeceb8d8fc5d2463e5db0313e9c33b5f8dc2b92d06024c4ca13e41fa7103ccfd1c0e72373364f1d74c24e30206ebcb1957123e0b8817b84c4bf81e5adc58e39dfa3bced6380b5b5a719c5a5a0a02d6b68c41f9e5001b395e7357a0d9980c4300d4b691cc9229e9ded2d83e3e7d011a8c472d7e167053b4b2c2458fda8ac58e6c7cb0d2a04315cc1060f44a95ab020e04d07f63f5afb8e02b945ac055696556e853cedaf13e758c447eab08e76a3903208f5e3fc2fec09681a79704d55551404c0f1c4060a11dfa4119c7f909c5e6eb030420b8cf59e3e3015e99d535b78e7c826b2204187278be7519dfda3bced5d9c302295b1061f96a9df93c954724dd1b385e2afea2adcc03f9f66c17af807fba0098032ced15d3e9ce2423c22b9d5e4bae1b0f5328e6af67ea452a7d4936b92f3b350e7f0797b9eae777e2ac7b24beeab1390c739e46fe0c0b3e8e6fc2f8c7f1b527c50ba1282df9723955f564d09e19f03772935823766178aa31a77e4af8e7e64b13fb4cb2a86761ecca16556d1a03610287eb79a2dc1cbc53a76837457542629cea69029a9af516b84e0f013ea22cf2ebfc40569ca1108816758c54ee17c4e3d9ccb560878b4b03132c43b382aa53c757f82fba2d1d67675cad73f5c8f85b63237e9e3af8772e739db6ea832818b1303167e8e58c93a0c1b82ce7a95591499b35bb8020cbd638494895f1eae229ac3c1c2939b625ced37b793e71084936db94ee779125caac330b3f72d5e50c24205ec365e10fd097447cd610075ec8d3340616ee5bedd6600a419c173f4cd4a7d89257f90d684c7deafba52b658b49a39637da6da0d92f6b0d636692245b24ca3f20d32018a09ffe3fa302fc65b384f97d24389807f88ac77de8f354a1a56379f667cd3dbcee11362a0e30ab219c5fb5a78f829d4a167751fd0d35a3e286c90a1e18f97809f1167794c67d73b9a189919a44854d43dd26f6b1aac13a2aaa5684619c9c75f3dd5264fd976062c8420c79f92b9a84b5f88480393bb567526a3a78f6e83cd74e6d9a5e95cc32d2693c56d9c47858efb7ff6053eff67ab8bcf0d8dc447a4e6e91e7bb82f290bace29a50343460ea44c27720daea92e74d4e946761b57dcd1068160faddb96dacae23eddedf4e41c8efbe7a1af68defee9947113890800f76d714fd6b57d4b2c2fa5ed054bc8d87baf2d077893e17d9543a28de0475901d5524b93078456710b84dcb7b39be3a17a117a4936ee0199e9421abd7e3dc7efe12ff7a6ca3bdd04c7272d3dee4932e83bb1051fa3b416e599d44dd422f0e2a9cd2170ca8c960ad719f68bec14da0eb574d1dc76c014996fc85c5bf6ff379ea034c6abfb4483b8a35808e68b33af50b41fe6b79a3e6d2e279eed46a06fda89c0a0e306eb5f2ea6b73e94ac6fbe1f4656d560f029a4e5e4a30c4d6af4a6a695dd91619b24c0f239b73122f44868d33bbacdfa748fb47aecbf1796f7dec38ba9089821c4df326ba4518fe955a82e2f2af8ae92f02f936736e96473f511b3fcc86dbc6a458c952c384269f3b7444cb96277726a204bb1e4e3e8052699488fc9500f4f257d3f43e95cc3bdb6efb5af689be200ddaf8357b80416cf5c66467a326bf3564face99492174e06dd4a53510a7cfd3e9d0ca10dd0975806b2e6b2240081d63303654075bc84ff70dec00cb4fe0a5f7141853189316c042206cb3523f93dd7683747bd5be42fabf922f4b4949443e2de77e4268f7d1b75015dae58401ea20638f701ee52e42a7ee06d0b1516d0244a9add4f6d581643e9de4b58375d13835063574003d3908b82dd61b98dccf0dc5f9b683da5356a83c99225925de16bd04e94a88408402a6f030e29df399d0515f69efafdf8db5c66b261b5f31cc4d7736e31a097dfacfead19f9ecbf53d522ab75c65eeadfb5f9741b6e200b6052cb006cb12ca3f6beaaf43f9353a399c6c4d90227350693873f190afde040ed2bc8e9be7fe8992b344452612be6b4b816ce44393866d89e6520796262efd45b1915c0070755bda8176c36d0282e518cb5f2a3f69fb9444c15e53b0e773451d0f6d9197b518e17d27fa7a5e1a68d5a3fa29e92048269d5f84dcb52c91be6e87392151b2b0ae5342a1000000000000000063f6a10300000000c9062bd623acdb0e821651aaa9714cf6afaed8d8b5a16cd67f209059d6e27592543d22b7809c680fe7c2d201b4d94770bfda7f3af6e289236cf383500b3472742216d940900d09263c1229d8f65fe1de656edadbc7e7f289f38899cd3039e07f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af42b0586b435cded5b945072f667be1f75cea6e6c7989c348441420e48d1f3c8e1909c55fc6c31a9435f547aefafe9495bb2b04fa665f8e39784867e03193dd3ec3b77548b29024d73d2dd63deb1239196d30e94335ba286970132a422e544b29cccabe162f1d57013288096c1d38f71ac7cc4c7fab271878cc4b4f91a0b2fb03030f4801308e627476761530da86339bdf9708ef1572fe6017dc42d573f8df3c020af071a0786b673334bc04268730fb76a2581c3a257761c36b78c32bb776e5d40b05e3093f7124cf37dff11d9083609c44e075f4af1dcac95e3d5b5ef67a42e375f76b0722d40422d7ff82eaffb0f2fdcc8cd4b59e09389232bfe0f286e02e216a0208744ae1a602c6287ad11dc5e307b5eb90df277df5115a40fd5e9e9cda7618350214c5acb50df817266634ef4b8047fe3b1f940501c12613aa70d9f8a2f6331b8a03113e443245324c8205fa4285093da6ff071798ee2888c5a545e5d719e4b8f5e3030261aea7d7ed39cf0cc06320ed78f86cfd037674a7216971d0998dc8e1c1afad0304a027503e3ba0e2a7c43913807c12de435052985ce7b8a9b4e78d0962fcd1107f4a6b70d76a4ca8944ff98e3dc2aa3211ea7788a3a85c7f9eead0bbdb864bc895c4ac7e93ff9fbc7c520854e09a2faa8324e556724c1d2f6425313f0785a069fd7d17b1ff976cae26411ccac48c286917e7d7ab4744145386b2c8a04e649c81dac40b2d8b5a7d4dcfd3811fae9fc4efb6c9e85dd0d615ba5b91b1b221f397e3001e2917ec3a1f92de743a49c4bc561efd1fef9fa71669d8f60aef28f425fe908f4818e0d1ae2f890025c879acb4fd65405b4356be438e3627d897d5937bb2f2aca61184418a2f8ec9a26228fb84a659ced8bd8d82b75139852196e58af2679ee82a567b9993fd9df26b7833e40a7acfe390c6336f433b939c1d7aa3a397309f85f1717fa070f4a7985dae31a6ae08a4979b675b09f1083ffae8d61e838f4a7caeb51c5b5ae659fa07443eb05b3452182579c5a8990b9091f0abaec7ac06bccdfa6e2892d4200b5582c069f287ea126ea1e10f3316a8a9e4e05f119db85ad110e161b152a3bcb656718f4fd0a641b8953f8e5403bfe333c2b1ba7f5a4a762f0551cce3262026734cfaa7087e39766e4fd3a2b25979f02d48e46c8465f624e563fc28d959dc7c74738cc41e397950e3db8b7acdf13485052fc41baf11137377a20758a67ea1b9da7bbe09f365c9c470b7bdb33460b4d100d1e805d0bb70402270eeb4ea9fd655b8e038fafd995017a504a5882ea5b0f85c195189f10962cc1f5fa5462c2486bcbd445ba2acf381f106a431eb2051a397253174cb0adf0e0147be1a3eeacee59c9443efdccfe311636da9df25d193e4637380cb284fb6716efc1eba2d66b4d54af1006569bf31caf97da67c8e029807e1ab5edf058d5d10b8c495734bd94ef581d4864a7d436613067dfcfacb9712a3485006bf3aa1aece95cf93a898758b71d5e1a5947c08ce8f388d3df487225ad7037bc89cdf176af9f8e283efac7c3ec2074a028ffa1419fc496a12f7cb3638ccee18c50bf1065dade437e79c5d57de787795d14ed65bc43ad9e03515712fe93f89c7584127bd09d022da1f865a83659de30a45f2e7e5a6ea57fe7d4be20fa0731aadd5ae1c12dbc34cec25730f6f7036f6947c42b4142a7b5c87257c3878650db5efee096e7c95522d07ba2fe270a86d31c867e77aea6b845e5e8a1987eba0018f513a773d702317883644553fc6c09a52b55a6124cb852e6921ef54a799d8deae64be104794e59c224eb1b50568daa4d910697a86bc1ad34bfc6efa11a587d6b377100117acc6b5ff99815bfef97c1029eef52a8e3638940dfe64b09c6d55db64e7aa700ea784fe7b8e8e4338a9ace574c3fb29db97e6362ef86b44d60a29cc98ad5e6a16b0e8efdaa48b5c8b14451140a47952fc74e9a21149487fa27e62e324a715f25e0cca5753b115327615d3cb6d2b88ebb1a274d7d6a8d037e5469573ba038447fecb6a69e2969ef4e16358fc14cd9309902eb8c7ef48bfc7b583606f375bf0ef520ebdaf18443d1c15af88386a5007d727be106d96ba98e886f74109624b4ae58628973ead3813af24480b07719887b543115e75d92f1028bdb7eeedfd218b79a311a1a4dbda55f60b38f42d673bc2f73bba96862c1ddd20aaa5d6a67ca7a010a5ff417e58b9d597137a86a6ec08dfa37465a68abba8b4daf74c5b5b267287f4c1acd591e3d17abb4efc7cb5e933399539d96084da696ddf9b0000000000000000c2328e02000000009f7829c226e829379977237df58d98d89cefcb7b6eeacc6861e3c3aa99c6bd00ca33da0051956994301a22ca056ba4bf4a656070b590cca2f408ec68f3294a91b18cca05b49f7a49092cd6991bc7be664ad4eb42c64ae3535147d995d59403c900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ec825b5dbba8b32a8fc3689fdb8ea3f2445b752ba7e4997a89c810b4cf8cc2d908e34805717b2fe12fb58d9180b64a1441bbfa0023c8d8af70615d197a85e9b39c05c0ebaf60887e7940f0ec6a7c571cc45020dc700fcf8bc4d413620c81b75edfb4a002cdf157323951910aa21f4483f2c9b46738658b93885cdad76c97945702143954d90dc853f53b7e536caee0ba1f7232700a05277d26ce962f117d022fda021952e4a55ff7e4441ef6399f03b947e5107c53402d8e8e31a50cd4082182bce10a02aa028d0c45b69989acb77544b8c041faca3154286568a57dc4c1a18844f5c3075d5da740097303ff4b9d9f53ab616c1deeaa1218fa446cd95cb9c2e37b96dd022cc0e2426a2f624211aeb385748876a6dbf6b1dce2c4767117e0e1b461ad45e50308db31c2d44799ce6a0d78e5b72c3600e44123da6ed17e99508ff64cfa77c7890226b936ff1018a3eb545e65e3ac22c555beb4e984784ad585556f2afca3119511031130c84b2cbe686de21f68fc3d6eed85f4d90fb1eafd7dad942ea16cfc2f44fb032ab8a627b477952a3c473e71e593911828c45a48f26aa80403fdd48da182ef1d98e7d080d81453a60ee1de05e4739e457a308e8321c83db7d2092434b8d398a02bbde0d94bed578790a2741b7bf97f531b4294890a20db4661ecaf99e7aac7ed2cd52474de4457d99aa057a6ba3bcdb4fd2fc553d1398f336227a4e9aa3620943c644f21570f259cf91dc26b95f820aa2528d37e58613a22ffa2ed665dde97929ea97d143690f2c3a5562aad4bb765770f635305720830e68b31df6f4b1ae8b14a30e191ae7ff5f23cd0ac0eb394c993882e0391e1a934dea878f5cf93cf02fa14ad0cf01015262e2143d39da34d7612dc0066dac459e0cca1c9d6ca757af19088d3b33e32f9fb75164c11b18919a6783ac50786212cea717681cbde88f0c38e2f0aa367bec21e5d96d48a60eadf9acec0939f35d7965cfbebcb95aec3521e67cda731d13e0bf5a2aacbb1975876f038e2dd70970d9ea7de565d80b3b7e3e74fb866f0c838f901d17ddd64be0f112e951905ba1bb22b4140756572ae2ffb6ed32f33f865058e640b52060661ace03bbc9177874531e87addaff1aaba6aa47b69d0a2034c425ba9ed125fc223b42438af37fdba3ee5fc871cf06b3f2fdd55651813651ab3d5eab8ff310322292defe7daf01b0f3f6369127ac9b0c22b0f9f793ca3137c7b319d450792dfa4275a03ad74269821d4c3b24c5aa4697c3ff49393fd52fbfb651aa77782e79c5608af9d69aa8d9c84ae03aa90403185cf221ef3ee0f1b8a04682186a09e260a7c9cb402ceab0004c0a6cba544b106309f86531c90db9d1cf5b319a39a36f068f9f0059ce225af2eebb743dc1bc33f884e05b3b633297394572619c13a17da1a3c72952da891c56a9d78db5855ef06521d5a0a6af9619c27afa4054538f9c31cda00886f3e10bd642df628f2857a4bb581a96ce5a4b1d0a4593423638b7637ac88bf948e711364e0bae32ff11f13c20db1904a240766b0900fd470df9244ddff9eb781c328d36828af66912961faeb3c9be1dc91ca09d4924a50d6d6c1edb75c2a617759b83ffd706c2b0cb35d81861e2416aea48e61714415dacabb8282290848e998dc9ceedd1e0d08308d2badbe44ad287bb16df460826a8c7ae83c6fe99f8a5ef521f81d30625877698a93edc01476b41008e3cc59c37b5dbcfed19f52260e5a979ed6e95b35449a14dfc7086ff2df6aeb3758749ae0e377d87ce977ddc93544055ff499541d268618abb7b8994326bdee934c9046b56a8ff16acfb3122cecbb31df9f27a72ec016f63f7dcfaf46a42245052780687b668a0ca90915c07b78cba345a91351ff3e6ab6d5cd20274f2cd062c0a641bc894d6c6980f18f6daa302f5860e12a4edec5bb0f9c8185b5884a7b64f83b60e4171f36a121d85444ec2f6be4d7f0f2ebe7b0d765a703653d7fe82819b562cc4f344cd3ed3a33a2d7d6df624afe22928156152824920e3dbc3db6d6d5e734dbc7abdc729c51745b1f19056f06dccfe5dabfaa45f6a581237f2fa8cd9c4762c9f3028e597c586e0f5f44607b269611f4b21c570850be61eadd76a1e43bbeb8a4c031d9688fedbfb160f5b33b0f81209bc6de188dc7b2d5991bda2005c1f52b223ee650d6e18b77d0e9025000afcfdad9502c8055afc690113d2d049302f5c87f587882076bbdb22d138f0359995c91a0dfbc73a93983520fb50c8f4f598f56f91465162ee89e6a30185da931206cb3a8bc0f7eb6446e58fce5e04316f5eb77a4dc4b4a7906eeaa2b3ba948c3883dab4220127ce018b08e4b341f6132e305427552d97362b7b9ac331f14ebec61c65cb980dfc36f5fb2e9ab18cab00c43edcdf76f61b3e6e03b0784578bb22698e04253b80d", "", 3, -1282780702, 0, "29534f6e4cfd75e2ac1cfc5236336fdd3efce9f621a651a3c4e22feb350bef98"], + ["030000807082c40303cb7f7f0424bb532696a9e08b08db91f83e94d6aa801b8ba43e3d83daaff8d3e0010000000465ac51ac63df1c170d501fc8715ee5aadaff334b972d049af826733c07f7db20a9e6b2f25d2c267b0000000007acac6a65ac516affffffff294ec8b48e77507be6a762f7bc51c3bd9015fed36bcc14f8ccd159155a7ea8110200000009636aac536a63536a53ffffffff03faeb32010000000003636aac1f505c01000000000552005253655ef5db0100000000056551515352000000001ab9e645027f3603050000000000000000000000003476bce1006fc53fe8b757e2f3fcf06793cb28ef4e08e0f011d66ac981694db7abd515e2a2f00642f8c25bc9024bcb46eb6fe751e97935428d5c610f4de52a97f045923635223b1345ff5faec43e588839bcf702c67ebcb8826aad4dfc59b9a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034ee4d0d34b4d79e3e777321a5159eb13c1eb93e7f87a821998dd4644ad1f64fd51a1f27f937613a36474816074e77ecd45667b2e0c8518602efb2eacd3543698754b4fc542c7149e070603f4081b8a9b3286258f7b183e1d391beb877b76179dabc45fa7594e9f87f62fbfcdcbc61116cc004f280936bd2947475f259d1bfe903088810463ab0152b7defe7fb25cbe10b38645225670c585610750529704eef9b030ede89175b4ac1af5f61ace40e25181399ad5ec20e960d1de0b6ea51d99e09b50b06ed38b452f07c3dcf88cb91bf300be4219dde4bb8e3ee7513270fed8b56c366c1c287bacc94929873e8aa1bba818cd20c9c4c107cb13fcf7f83d36b277a3c4c02060c317d4bfe7acf899932f0608fcf413bc551b38689d199e1376fb9cefe827b021c3414450a93f07865d99229cbbb81a22ab627ee7e4386f35789265a50be5e86030da9ed6fb8aa7e8cb28b9fde8dfd2da9780b3904e58be0a67b5c72b7aaee58d50219899a553abca9bcba2cb41635d4c9c61f97e4231bdc02f4fd19515675306405020eb6a6fc423b32576876a34bde39534cbc30d4a280cb84b933ea98f598574f0dae36ca1043b0c46b483594f779b87864dafd09783a7eadd57a7ea86d7ab068734fd66b0a175351df6dfb9382d67412584e3fdf99f4b4fdca2428d502613e33c1afabd1de92ffb4329e70c26370d382241253858abfc41a5c4b3de9512734501cbd13ef6ae25b7effa8b7c7222b9ed4d39672bbe79ed44722543139a8875c2a340b7ec700d29eb8130e1db44809e31b914031c97457dcc70976c488f8de82b840e3f25c1fb02380ad12b23f8c878e1d88ed04b58d68cc4e370ad80f7a7db2d6de48cbad80ca552725c7917bcf36aeb9630b15cb030b1cf3edb58977d3826ff734350aee9dc3fc4a066d13ae123454c6599702f2ee12e3f8d4ff3768cfa62b619f7a232e8e84257351bdc38887f64a763a73e5f1330ca38abc0e875c31bb4f9ad678befbf0ff639633d5e1e4eed6bf770be952bb7a8ccb48db9f26d98aaac05d6392e293d29fcd6f61bf8403cb1ec75553f7b6106756d5501fa3e6c2a19d347a0beacc782073da141d3dd1adba19baf38a8601be9b7289b2b057a729a4726728f221c8eafd27ae368956e09a4ac7ffd0fd21fda87454002d6efd6e81a0de81375048ac9544944494f4da0320acc0445d6a8f2c2a30cef4794f1a85f47e0ed05f03bb311839745af065406229a830883a1a9f6151cfad3908eed75bf8c6d147a6cfc057d8da56a114be147f494c68d2506bd283d468014a877d1c4f8f0ef1e85b72866bb1df58376724b3b3a303fcbc8bbc8a4bd2096056fd8faf5c33f4c1b7bc378c860d22407c6a006579618b72ea06c808202ef47930f415b90be86f26b9cbb8b7d755cd590bf78cf491baacab39f5e45abae9e6aebb354f8b16253d7ef14ab310a8c5f231fc61d906b9f6abc752f947a9fef803a13af4388a25ce7472cc064f7882211294103bfa907a967bc1403ac4005b1c393e00d733a9d017d999e23a246301d750ebce3a0f7d6506799d52384a8729a50fb788a0ffd5db224ad92f6f128267082574d9fa61590f2ff233ffc4bcb8554dbf126f810735cee520b5ea94e2cf7fbe39a1ad28ae879b11c233c34effc5efb085272691dce730ab116005f90df34582adc7313d04e3e737cb1366fdc4a88740b3927f795db604836824297a02dce55102ba8366d3223cbf18b82152a718268892faaa20fe6ea4c74e65b91150e01003fb377955ef5425997e266f4a271bfcbe76624a5a0ab650cff5f7c098a474f4727429d75de6d134f0f2186baba75be0f0f1f9745920e73bbffb03b554490903039c64303113f2f59e619dad6a6a5dd8ccf60d8e2effcfa350cb01b93e05b5bbd17c1301e7602c187468ed81967f3889f09536141cd0554e67bdc5ede667ecc60b30675d02f8eb873f7eae06394369b7325a5ebc618b360ee35193fca317f9be66a3f0668141dac9774dfcf1b798d50706d223a758fe12d54e838c1546e950e5c4b7ca1beb7f26741a2884660f9b4f6bca2198945f0343e8f65247542a6438869e54c9ff907d8976f5d5c0b0b9848ee62990b4600fffae72e69ad98f67309a62186591a3aeb8595056c8f855505b5d7d90a1e560f4abe37692d4f601726d5ea58fcdc513eda2f7d6189c08ead9c15f7531c67fbb8b14e9ce5dfeb411aef14444158f579bb2668b8ad1de519d65e0e813aaf8c4b05d763bcc1bd00d4a9100a06544171a82a7496e4eb60a6ab6ff5f74d8420483030000000000000000000000000b4284f3e624a3eb35034ad24828f92b65025c7b43dcca8c76ad779299e2639e54c69dd12addf41c2e5d44c1cd6bf358df8c9927d465465a63ba00d1c008c539f98193e56eb94f5afb80e1632da73f097cd6557d127b87f4bd1e50f207f19a4e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bdfab69aa3b3f967f68421584195cbd388c0eea53b344a97f346707ea3755c4c7c5a49c3bc87df0114d376c3da6ddb375b8b4c211a97fbe19ff7e694304b9d07dc97c06e8810ad47c79d54d94cd05beacf7e10b9ca10bad260955151324f49df1daae261954febac55772fcec483f648283234f786e1c1238b93922487be8c110316f2e01697a6d63d8c5d39516ee461496b7fea072da5281ede34b9c4d17f63210326ed426db6413753d66631d4e8b762d929c8ae0034e637199d6a1c1715b658970a012d7c7a64a9908b7fba3359eacc6eb878645901eb2e56e7c01e28a91827712f3b15c80fe94cea8a2db9b7e504f59cf1f9f94a45c6e4ba09682cbe166cfdb724022c2fc650501d3537dcc9435bd4aca73079111bfc02986e3e935aef51316bd263031c23416faaf4482c4078b772d474bf6705a20e69a072aab0b4ee30d0489ef9f3021c5e8d9944cd5c284302b9f85b32557520ef8f1a88c90b20e2f5915a58efc1e8022a86ac7e942935eefcd54e50995a26a98012673a74cb9fdde899450e55149fe60313b2f588a00d75990c18c92506444ef52d9db52094fc313e8a7a0b04b9c980f0cc39a5c13e126185661f8114fb8a906e748528ac37da897d31943a794f527716667eb25399f12ee1e6611414d50d6750c494c8f804cc228010be5cb8ae8f7bbca1c9b9e78335c987e5fe17f3040ee82e3b8cf0994d7ce778c0cd2ed9d941563df5cbe1fc765d4ad3be58b39bcca2f46b2f6e9508a0d9d26cc1f394d5490d7aa967870af100af7b158f58c0c73bfc3d380cb83d928642af28eb03ff6620fd0b5a8cd2841b33a4be03e1dab52cd5cbb01bb01528dda9c279d1e4c00d0d8ceef7b9203daff9862cc9cb5cafdac988c1a9b4490e928b6a25f575d0950e9ac75407b106c4e1fd7b8b257581e301c422407e612c43be1794872cc82f02bbbd1ae839520f2116a3b85ca09a8b2774a7483f767048ead89263b51fd4455b538db02e2d2c36ce61adce8d33ed54d259968911c2a6e0ab53606eb18b768fd9b752b77929c5fb7b3e11f2821d24d39d944213e8afa3e9b0ae1a2cc97156da2bd1a526801e15637ca583cf6b4c597abaa7ab9805b7dab30274524a95d491c6a780761587dfc57a6b248ab0dfc6c0194fa2c7ffb526ce1138dad609ce19d8e5574bb0e37b6c78ae4ec3d856d88f706a84dea479d10883dd6ffa76b040c7d9d21c59ab0651314fe6755bd32a8fd597b74d91046b7e930a02b63259177ba633634b7fe0588471a5eea2458ef1494efd74d145598299b366bfb29f67bc9ac77753ed6ba54e7b1d300d3c6e084064caec4a8c241fa6d318c28b4838a98586688407b5dcf69eb1ad8ef055c46312b28bb59826aaf3020c0728ec737171643c82e29953ac6f5d0209fb7ade56b0206106b73eaa282543e398242bd62ebe9416de3071258bbfc76652abb9f22e6e92cc5800aba539b0d6a474563956ab9a1924bfe19bc15df4ab050273ba75668a93bfa30c725949ffad84f42c201eda5f1ad2b7a8bd0e7cf7fc1793dedbdf2bf0eabe03775e5214a1917ed8a20339cb70134e81b93cc6ab14f6c55783ff26d0f66aa0045030c547e55cdcd7df4ac70b1a1fd7d30aa39e0788fd6c6841adb85ab504e1442cc995365283034c97c856ffe64009700087f0a3f40298e83c6181c3c6af59d91e949a026cdb2de0f095a7410f8fc5891983c9fe9916393e3891e0ee2ed1d06bf0ecb5918ec6702e7d63242acbca7861b0e45eb9cdd1fdaca016a8ca3c96f4754501f14e752f37fe14c2cc749dbc0a25b4ff9b5a0630adfeb354d28f5d8a6324256f78724acf0d4004e5e6da20f45b8f6ddce00ae3504ddbde17a47270a7a613b4facafee221737f4323c7343d2757441f1ba1af440a697a361c5391bfc3bfad415bbc1deb095451d93aca4c33995900ea362e116ca40fa5836720d56bf91d63b633a40de2eb64a4507ba12274a81b1346ddc2b7a7a643f91b43f4f2bf10002434df4e906d5b539393c587644b186bfee5cd05b7d3aba6165c49f4b194f0bfbe8db9a52fce3a19cc50de40337591ee5707518dadbe4ac5301e270f400e1ee6a9e153194f28f934ffba236bccbe57927cf49d1312462b27c403f538bdccc77fe910d0ebd4ce795ea1182d6a0a4baf8da8e7ed57649d2335578921bd7b2897d37d9dbcaa22693bf5a222b86e97bb3adbef524e337b49a046e33b826256940d13a0fba69469940329516aa3a5af4c592e7db685bb38a4c38b55130b5ed58c06a70c19f05d1e00dceca0f9029fdeb9830a68ad5c45ecdf1d7f0fced594942b033dd28b8c626412f86c070239a19ebb85c91981053ff58f155ee265d766e16f61f720fde61c2c852a9c4e675752bc91a8d64241afdf440b19589aa36bb5bf8ba884b56a73659c4e0208cd22600b", "00ac63ac52", 0, 1260068403, 1537743641, "4e227597f48b170274c41a1a20f4195bfafd24531fb400eedf4ce09cdaed9f4f"], + ["030000807082c40304eb11fce7088f604ed9851fb6c9d519e130fdd647c8849fa8b619d1088d8e412401000000026500ffffffff893cd3b1270063f0aaab44d3545a304ca208b78d2b35deedcfa0cf6d4aa87eec0200000002ac652cfda3b1c76c08255cbc4f89796c58cfa6398cd34830c4b9e324b84e2f007b42b14865980000000002636ab3868e1dab477a69d8b0d09737beeb0a293a6621161dc34956ca4e9e535487908d361ebe0000000008ac52525151acac52ffffffff038aebf8040000000004530065005932910500000000095300636a51636352ac8269a203000000000353520000000000c97ed666010000000000000000b880ca01000000002048f2e88d7071d211045beb4f9851927373c9762534e6ccaa627605aa6d5cf03adad49cc6026722c4d93cb6fcc4f18ac5f29092037d028a366341cb734adfa03fa043982edd846217f46c9e72471c1cd7bd8f7abe81c716102d40bc0e4e61b100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000430d9438239318cca110cbd5d91142b8cd4b5bb4141670c9a303ca9320e38305a382bb8cfb25cf5579a8952dbc222d8408514d2ca989f7a92c81e8b6e88d585e841b0d7a544172190c3ea681452ad96dd437fe396f1b7e9097d577376ddd60aa268c9a4193b4098c4ce10bb3c973048505143aa224f01ca983e4ee5b190a3af4030145702a5d36a081eabaa24d09e2a8d1b38151faeaf448ae47e9d47f20468cd202275fb5eafc6226a9ff7f89ae75ff8a3889b6ad6332b11c3e8aa70dffc914186d0b07f1c1fe057fec1d401b25264400521f3cafab7973124d2f37ffa51a10d4cb630db057dfc4be46b9661bd46b58ba73e06b08b4301ad45d54044284d43f0c30750203ab89eed50f7ff137d1dd6edef9cab545463f672a024a5694eca610235be8d202264208ab38eed22f8c6e720c3d81184eb059d9eb2a51c5f445a7108814411f510228f90e14729f28fd7c6dfae647eb6e7ba39cf41c8cc1df69c9740159ebf3b354030e25bd7b4dc4f2f789fd8bfe30c5f988fc3ab9b29e34cdb148872533edfdf2580225378f04ad4130b64605c647f1eda41467c4cae51a94989c861a82b21f8b334bf1735bfa383bc46b7db6552be261b4d16449ea9d4c37952f96e56faa77fa66612fd0f96bb9523b8a7dee197fb6a35cb228ed79cce0d0e5fcc36a3184644887bc75d33f76dcfb77805b51c77edafba5996b4e98ff43f5fd2924253eca3b4ba111f714e3012f20ed3e2e33ffea98a2f6aadf3d5edf3c637569e4645166f2344b6ec5f104d379a738683ff9b9b9b60ed899e57f503979dc6a5cae863f2ac59ab5a806f03d17c242bd8201b1abc8d688ed1240be08c91fd50b7a286ca44b97992b82f15636db85bfb9c84c43c9f5f7a6f95970ecfae7755b07115955b2fcd1479425c9e109d7de525b071dcdd5b30c706ff3b494b9105c4d7a062e770e670b2278a12d3024d5592016ad7fb76197a9227b131bbdcb2dc8d25422283f975e7e465ec950f828d52b8f52815364fbc531daca42268b61b84d656fc76856805fa3cdb5ad339f8a45f03a3cc07885f4bef7ca9a6a76ce6fbba01de6789c2c45f27f9908bf2def0a8476f359944f3e109b30569f29d87f12de4cc6337a580b64ff4720e58785f06586cd75a08ba6419c6588ebdf7696a099a94c2fb9bb27481c3e15e7b57579444dce9027fdaecc3ae12b5615b03c9c3e9e9ac04d0c09fa812cb523996c7cc991df0c5907d932ce410f5ab1331986661cb413867b398d3aad720296c970b96b983759cad28025275ae1641ad158c486aee4c50f3873c2a72e46cba3a95035522b4acc877860c185985258c4cc003256c6681379f792a2d603b84ce12df85a89541c80de9805c9d43fc05b11c4edfe41fce314bd2406686d4ae6b305cbd83f96120f6ddeb3f367ea3a8c0e337a250a59248d23bb565dadb8f736277afb060a459b6215e48c1b75cdfc5a8c7a16aeaa6841b10f326b0b9015aa6aed851494f3b0733a5bec4ecb39b69e7a34c5955b2e90966a8925e5c9c6585a7f475f2eb11b6b8128808c7ad8304b93e7bc7a51a337a0c0a1c518dbfacd2cf3811e807b1fe041af54af2a4fa2d2e61515411456e4d3399c9b246ddaf8db590b58efb24bf9ca443573c41e1b9770bc877b381fa00052221c78ff525ca53082fce737b1e1b42678e1a78ba58e41631f44b69e8b878f3068da10ff4024fa8471337b0c0131a6392d10fa1ab562008cb190c00c5da7d327beeb3a6e778c348f66dd9a5e6932630149b5da6dce78905b7efde5191b8e2984efd54fa6485a8995b47cf98a11fc08b89901333fd5ef3b4ef4f10f8af619d71c54394be9c459763db32f1b9e145e4b94032e0f68ce8ab3c2bd8b8b66c8f6484059afad0559aa2e0c3dab99331b011816eaf6c4e78cd8618812497bd0b87fd9f85c2ad6371bae7a5cf3d352e2f4e53100104f99651c3c539b93ee1675edaba1be432598545b6503316a245c751d3398448fd2c25f0c64263d81b0457561979e3e76788f7a49d0a9375db8955a71c642ddb2a4960b6eadf9cdc35dab9955bbdf08409ab29e2301efe091e59b7d81d98b56ce0d5eec9e2dc468ced2225a88de6ca753b57c257a1ed04df5d77b8feb19d4b54ae6146703ad3f30f3d876f0eee82b298f6ea260fcabd231d035d086cc7679a69679d9b0e6f0b3f362e6e05e78f59d2e4c3009ddf5e78cf4b7a736eec2ef3bb456026cb669eef97c7b6bbe8298235a262c412aa0a85e414f4a3875239e92873cf408a3083a4f4fea13a5d2cc1e670d374d963c85270397646570d966ff8ce64249908d7097d126687cf8bc6e2c188e09397ab2322be0ebd83cb729e6a362c75242537834748ef04fbd4c2936a3b837a408579f5fcae5596f038b56b609a911ab42d89f8f77b66dc75c5ee36ce7f14370d600", "5200535253", 3, 53398968, 0, "4185196f4086ebfb114b56ee364570361438af19baa7b6cbafb886bb41d979d6"], + ["030000807082c403049e5588c7ecc09d34bf0562cb4542cf2a9e196498a6e6fcde94de7aeaa515254a020000000865516563535300acffffffff8e8f39171b5ffa2b4116bb87683ad34bc8c40a5d9fe709ff2b81e2480d7861e1010000000300acac32df8622ae8948d79a3c5d12a3b129185d451759370ab03ea188760ed296c9a089c0a1780000000006655252ac0052ffffffff487587f92787b5661bba83339a48ea93a5c1d1c77c8bae388ac157146eabb62d01000000056565656aacea09609f01f251a8050000000003ac51533753cfb8a556886e03c70c8f05000000000000000000000000cb3590f7f10d77db2566921c6631471bb63a47e65a23d2fb44b3e3cbdbdc8b5a441677685b645b76073f5f2af5ae4e2834c175c0c6cc038f43c4e4c33251e5d7b43c2f5c1c8c0211e246f89df694129243bef733f33e39c2cd95011a6b0b7cf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c855a474c1b46f50ec509c8d065071d228c7d73ae1f48fd30af60ed542d4ab608987ec60f3462d37e4b9a0cd1f420279b0754164f0462ef90f3386a388463677b08396c5415fe27b14707704f860625cc25c274c669304a0726da9a7da1a7f5947ae6b5713c8e474a34e725b915c67fcf84aa9f0958063f988dae8dbdb73d34c031e4f97073ba052961d695b3ce5985065ec6166356d4d56b5b1d367a7eda144f90216d78c4b10984c74bd46dc5ca0dd571ade381e508fa46427981d5f4a4263ea340a01e0e72dbeb3b51284d6f4a911ea53b7ee0cc6a72d72653ff1203f862e12f17b1c369cc3705671099a7a3625de4ab22d2e60e5baee763dc058fee359f143c03102156b2aafb779e6f59191b9f04552d427531e46a8419e931a1bb4c67817b3334e022111e01e1245fa621272c8c72ee73b29daa3d2dc32f3837f41ca2a52a0a0cbe30226ccb6777e743dcc2f681b8e1570daf0629ce67e6b0df642a2558ae890620534031d6c86b806bbaabb51914f87a54b0a8b5d94f124609065298890351ff0751fa2032abb5d9bf4ae139de11648b3a1e5fa7f14380180da87cbb0c6d715e9fb526998d7e4adaa3b1692ba2a7b866edc16ad8ecf62c449bfc62285c8c83893e102f8ec869a49c623373d379f61f3ce53ad6f9fc92987d93aa6422da9bf803b675cfa64e7c7bf87d661d07163a417cd597ab206d3410d42ebc82b3d019d676db318d3e1eabd7c21adbd89c62c69eb19fc6b21fccf1a326af175546cea6942231fc469c6b11b3e47ec58bf44f20d8efb69e6c18b177a633e0dae0c4d9b4e568100705c76a1e05b17e415f16494fbc3a8505bd64a0a5c1ebe98d7882d2f53347e8e0598e79fcdb0e8dec2f1b15f36243208c4d2a3d8fee01e73dfe7d6394109663b40c58e1e387621b5ffc48fee473eac6e6b86a01631714347c0d4fea535744104a6a45be26f4efb4d09cb3931fba2d3b3af5ae87c53470b0f4972cfcce75af3b1df785a3037ed8fa83737dff4923a51b955b811ab6cc2670fba929fcb3378b89b3d66f2d82169dbac7bb0b1ae52e72b8d89e31df552ce98ddf52bf748ed0ce6b52ae201ab7923ce6f51de69b961e4c6a1d0c24b732d8e958d674486b969703ab9d25e2233b78ba46811e733510d38fbe6997da27467b44565813530b2522f91a384bfff9adb686ed8ecdc6a1e35f714996a0a143f991b4e2e5a542156dbe4a50df3875d5f86724efceaef3e027f35f02530683d020d653e88bb26c2210df0634c648ad11657f99677475901bb4e2dde211a7dfa93525d189ac14e8817e27d5b4de966a0292168773b2a84f9d3b43f034303482594a58483e4e7ebbe2827cd981d693b60f222ffc53f2193656f784c65f0255783bc664bcae82c50241c091c24efd97de09160c8662972330bcdb6d2b202e0d31a50b4ced953eeec1e6af16d7e804afa91637db33de76359ea23624ef1628e0f57930a49c9b8f83bbf039ba8e84ecf1f6a4b4087258aaf1196e8041fb8abd7768c474e3ee9d8ad542fe411a671ddbd7971c745b99880839598273ad9f1116e058b0e06557901db41667d60b9e016716122fe5cd2705a3751b050bc125e0c444395d47ea682b88a7389cae9d94350e4e5d7404c1119ae346ef5c6055c1ccaa1f84c08765652a347096d8a5210c9be9f5816261a3e1b1b2b873e8b7eca013cc8c8174441709517ceef2b674ea1ee2ba1b1923903926a14bb2377bf28fae936962a5289fe3cf5942f7df828f9987d89b32e72f1fbc03c908a4b284a3b2e3e50c9ea2c0599e175150c607df1ff80c99c7e5a5e9f7bfd3ae9d803a13c48bc8eca22fd9d6798697c3fa3ce6b4d9d82c5026e810a100bd80ae3979d34f31408e2f4a9b28196aa3bd800c221bef798fe4f593d3e6b5dbefde230e3247647623596b5aafaa4108115ab5af892872f49af5eecf5acdfe8f5e8b6ab8f0beb318b07ab64b297ff2ad642862283af81bb07a54263e49e01dab42947eb4e5666f138d6ef4dc1b63ba413b5d85dc6b1ae73c2e684718f1d61e7a65002eba3b5d446753934124e117dcb08560d60cbe7cb2cba0503a7875723c13ffff6458655df110a2963254811b32029580225868805f63b93aaf9383827225053ea786965687321f472543ee6066e41152265ba92924402fabe46adf428d618f28609dba3ac4f7abd6240ba467c4c7a60c37854c1031545b85e34c8e6aa19e410b7df054932c346e777f37cfd87ef8ff90e45db38fab4399185ba8e303fa16fa8abed24cb004221b996fa925759e99326fb3b00000000000000000000000000e414dbbf62a0461b8467768a169e8ee35b2dc1876d87e43b49bac187abf0c0eff23671337b787cdea6ca360f68839947fa69cd925b320cd129074536bf857f63b4c942dab8ee3c7b6e3399ec96134e452c91998a33b5fd58926381d2bde1cb210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000059c72892797e28e1948a9076d49718b4c17e0ed99d550b3d7f8289e4e6efe67c8b0693b8f20db16fe28a50a57275686c234a8d1f55dcee5f78e836f6ee4521ac9fbaf82776bb98df9814f5bdd9d9cbaefb3a189491d15cac70a75bfc0bb1a9d55815688f404b62660c4f86b489429eee990f22f1845da4f7c88abdb8b92b0bfd021460deeeafbf7547bb9dd260a5822bdbdbfebeed40d0cc3309a924b4671fe0ee031e78becaa180c233d91d04efe33029f28290b54cfd23cdc0b56cb830c453c5b40a0652fb167a26a5a06d082674126512244df0aee5d2a42c3dc893136520af0469a1acff89f208033d68546dcc29124945e627a34dbafef3abe98bf2f26075a3a8020db71b99d4f3479a8f1f46338cbfc268e341e740bc24c99eaa643431898354270205992995ee6f7815671753324dfe5c6142ca8dee8d28459d20928ddf1d25a413031fdae646103b6bc61c75dfaccf47d73a057b5fab965248ca5c8093fbaf6d18de032eee89ba74add508bbffe3ed6f76f1022f8affd33f2d90f89943cee420f9871c030cab86878c6f6fd9b0f5526af9938702bd3f776dc07f084ffc3d7eda8125170828e0428d50277323c7529d740a92e76cfbb3da1bd88503d5259f58bd14a160cc1ed2406617ba23cb0f9c0185344360ca280ee2e29ceb9aa025091cfa704b44a49b7a1bb3ab4067eb58761b99ba915dc9f23084ea760b63a6b677f5148985c10d6ac120124d423b06537f7c5495122c6904ca5d71006b9e0ee831f639d11c13befce0fa3713cf63a42afa8d8e5e4ee70a63321344572e0d4f38969ef40b22dbcb005ec55f15ba77aa9885be699f658a781a559f4ea4d610c4af05a4686b0d3c4603f62b8a4f8b68a56818314cae3bcf4cbc3a3cf0750fa77ca714d897039e5340545f6eda826a8d9e5c825817568aa65158003eb4583a63db46e7ec566e2a62955c073d5061e7c44ab8e12e04c47860d906e49f0faa62dbafe8ffa151a166a93bf6ad3f53eefc13d0c429bbd11895c80f2ddfded62d5a3460914ea9569b796498cad3daeb67af1e3f6e6764ffbc03f9a3a20acecbffcdf3ac2553a8a51d1d7536ea3e9c2b6ff9a01cdef17ce06bb57414b08506b1c68c30e0e9e412df564f299df9dc37cc6b0d6470ab08d329a4b24342bb4f9f2371605039145407fa057bf541c2e06a0f76ca52dcd20ec127f06355e1e9a15a406ba618a9c09f9ad0c2efc20582840723ecf6f7636034f768bb747e8007fabf1f117de91079541d10fcd0a0cea93b41244122298e064c09f13d5cec4fcadb503f94d0b7f69ebc585ee9627a755c1fc6bcc5fa986a05f298a62764a6d881158b30ef59150db2d5a674bf923701bd5055ca60fa138388e256d5432d275e97f906e91789d708fd8d58acb3e9c1eddda081979e8d321ace095d0a49f58d10b1fa61a74452dc3a96024d37b5db5012101617f15bc1c664f1ca9d2854fe9fafdd27a1d7159fbea558ffc9b01a6640783af54cb23c0a022ca8b8d56caa73aede85445bc620474a7a00fac7179a08ed6ea16112ca1d925c3b4000e33b5873d9b25edc352245bba99cc799a38fd1f0b510219605aa3740f70dd088eb0386548429f2005bf7c74bd4c51ed3b512eb459e54735557662bad28c7c5234fd85c98da2b51282686b68a999f33e96a9fc6f94ffa0c19e544e111d01efb44c89061a5184d8e0132e1810c70f73f86e00021e6f7ac09daeecb1b7e73aec848e0e88db80724007e6e422d58e08e0bd0a4f7f323e4be48c27304d1404534b2c135b4962028d2ad783c30765e3ee464ef611780384b497f61a281c176681149c738df5c376333f016ce6b6df84655a8deab788d92ab8cbb5f090e3d591286e21f4ff93c374ee9f76d384e4c7d8b4f432c92a4ee77c88fe0e1752dc790dfda3cd84b6bddeb7fa96e363bd856446612ad64c743df8e9f046cbcb874323ec8e184495ca59086718d00bf4ef5fe78e60a2927b53dda80a0b4f641a1b8aeab6df02fe79c99d23a8557308be02910ddeb2f5abf35cdf57d0f230eb15d0f91af2b1fed10e00acfc604ffb069fa7b1f88b0dd8851e8c992430867ac7d63ae639cc599aa5891e7144e4da7bcd307ee907560b251eb2bf8f5a949cae961e6d0ad656739b67af9890e410cc5f523c4f40461430671d40916263bee990bd863db9b5929d367c8a902a12e90adf5fbff44ef022331c4b79e5b3077bd7f6e33d505928bdf8840992045f879597907fbad62acf9f03272dd5b3f95033430dc565a8343c5336ebee77d491ac44896fe378112bb02000000000000000000000000db7980ab21d73019cefd4c7e43461e2fae9a356b3fd9d4042b715002046388c751203170354722ff271f315ebc5626f6e30dcc390ca9a863ec9d99e75b0de89535fce20c80ff463b64617da568612ff993fbfe0f2581499a0c6bccaf4a6e4e8a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006c937a52b66913e7a66a0519fb02650aa45ed5ce5c6a3aab3722ca7e0b5658c7ddb4633172dc40289b4845233262a14d686e67fc0a7805278723c8a22ef6c803920da18e1e3c1016c78dc4a7c7f62917c3d26aa483287e8f3d5bbb339de04fdcb4eebe9246ecb92f1dcffe6977e476f2797e635acb0659c6d45a9f41902bb6730307f383079729d7c5ce9838bcc65f397ce509a77885753d0d45b6a260cb152c47021fc46f3adefa4eba24b814da8f5af6fc1e2735aa50f42e3169806a94472310cb0b078605aa88cbd5b2818b8fc9caef0d9a4e09bace648802b689c15643deccba8325a50bf29e8688d69f68513ad982365ce14e7893f1d8cdf970f9dbd65ee5ea13021ff7cdddc8e954d022260f73b9a6ed41b987adcf177d9b9b3d11683f370a163b03082e342dc23d8df77e5b7a03f5792b68e39dc4c6ff5529de5e05ca8c3f4402de0301be2029b0d0a223c931fa5bb17d2ec9cd2f8fdb4ba74d4f62e0559385373091022a1757f74900b0793d80b2e22d92f1245cb4784a78f89f3c51a85bf514467a9b030b4169460b1a3491280bb568e775e67c1bc37bd7bde8e62c60a174abbb57bf07a819e5a3f57931ed97256b5f84881ea3453dfe5b00596d4e16a72adc394393370fbb9c663363a096eccba7dd3989f149cc154633f248e7eb6b561d0fdad6cd732e3ce4e9eb57d8265b7782472ca83e8651d06a616a569067b5326765cd8c8cb184e4ab202d8b2cfe1b0fcb80f493b8ba0b08fc488eaf5e5245d1d858be0d80138eb3a524733725fb234b15fce5177a616c63defae5d5717bc6213079dff4cbaa4ae03f5e55e4f5aa4072fb045951977dc28555f70f5a4916444100c2d5286a62946e0e6324b59f6f3b3943258310141c1bab9acdf4137428266e4ba5eb5b89301b01ef50e05f8fcbc2f7858a4475232d81777e5c242ea44a46f4eb864ba425d655d4fde2257ee93784c07cba203b670d51b2d72dca72af0bf372be3d4e8c56bddf0233c783fe773287744781750b17c600bfc601eea9f3155b63b0d838fb32d4b963f00405cfa6ef7b48450257bea8fa0d560f9e79a5d535b333f0e0ed9096ef9d3e6ad95c73154c4c1c41f457f7e22e03219c9ce7e98b2bf2660935f7b11ef1a35b286251aec580d492da5899db1370a224f450d9127022f415f19d17c78a4bfef1ebab11ede436a30fbd7db0580e62c716deb156b32c3fa3303e04c37bfa747ec7098638aaf11add5dea835ef416d5160c4546760ce959c8f7a1057915a3248efd49589898bf0f45a4013c31981130554e013d69181e046e47be56d800ebdc553ab51d9141150907eb59514bbf4e94b1b0521ecf9b0d641c57de0016844dceff13f137c980f6084262cae2779311f107b830734de3dbc08386af1a3dcec5e42443cfddddf55e466fbce6b60ea5e85b72f68f79c49d1d3d1bcbabaf2226ec7a9a575bb182de97b5af9c94767759cb8fa40a9878e4cdb43bb26b769e2df13a4e78e5e6fd3b6448fae32ee8c339c6e53f92763740f39b6077238733d78c0af97dd5419232a98a89fe1a6ca3b47b7c8917751cab16763797d498eec0def42bdb4c14d0e6c4f53ba237da34ee8dad9913197463295d68a1728f46edaee1fd4ddab99eb389079f038ccb55af97ce0ec176fb3be58246f9926b4732f9b703fca26f7d44a9fa8b98cda902302dfb2dfbef0b773198a2b08a26aaee13cac42ec3322d029d018e39f3516d2e4a2100aef4f9e01308704896dffae8f9c98a0c6cac8be7cc9db33acc1e145f8de17af39970923f27d9fbafe7e719a0f4b59d12507f76b324f58f341f38c9e73af528e6ed7f40666f1986978aed26bc56d64974870f26213e93ca4d54492ca25946fbb0c284ede8c4e6f86a32536fd833d3a7b117ae708971960a32a7deb8dbab024c0e1f8bed43698cebc6706ac3175e2d5344e8f33f30ee2c9bb1d3d90874762c6f037a383cf240a7faa293235cdf41dcb072184fb6bd786d8e81a209a81421d7aad6fc70c4d1d98df8864ca485689e4455b0c80a74f3ad312ece23149bb7d4676cfaafa4fcce3330bc3218a29b4ec022e0e02a37b4aef26a519a72a82c9753a546e17d306acb1d8e77e8d9883150b884474a8e4b68c5e29697a86846b9fd3c1fa685344c60b98a40048153274a326a0169bbf28edabf049c17a2fb5a9441865ff79c6eed2fd5d1c766b61918580ced537c2c6dc2d30dbd068876a3f0222e066ad1d43e2e1e35868ff6a7537aabc2b6c165a0ad2eaaee983d182c429c2adf5a270b1525195f8aae6ee9a40ee86d40f1a1ca89932ea6b829d9055409c75e62b519cddadd30a6fa976228b1bbb30585489998b258ba0b1341648b8638114e26d0904444d62f5da9afd0d666628bf556cd326f6e2e5e7291e0293cb6a2b31f01582dec4a624d743ccc1f02", "ac52535153ac51", 3, 7037365, 1537743641, "13c623ea1771d30176d20f4c18ed449ac6fb3600b777228fc80c7962f63fd480"], + ["12d6ae63012449c2bebb6bb3bf82502a0eb6ccc9225bbb25ca744cafce4f403e8a585c728301000000070052525300ac63ffffffff030e79c60300000000096a6a6a6a6a5300516a7a8221030000000009516aac516351525253974b8100000000000553636353ace5b208f002c8d7a401000000000000000000000000c44bf5a1cf240428bc6a9a3a91d01669e3d28495a7b61ff26db6f95722f403942ae1c0512c110abf1c5032fd0ad36fe16c69cf152f94e6a440f03fdab2d3565af66d7185d016cb0d8e4a174381c0fa998f0048eb72f2717b57e7030a3ec6aeef0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013eed741f5745d6cf35ecbf3bc6114108cd4cfd95e022dd0011c6d02d32ebf556174398d1174b981563f60222d74869d0fcfed128e87910ceaccbf33fd4566c28b380e7fb78047b0bbb0986ff3a9b4a965698ac12c12efa5425665a73d658d1fdf580d20d95084c199328a8d0dfd0610f7c75c68fc8b0bf706dcb964a9eb80a4031bc68964476e1388aeecb9000f9a3ed0d586aaf970e5ad1cebce33b2fae3b53602262e228cdc5af9c23c976e65e1e22f44214d5aa1cef71af34418a968646dac1b0a07cf4185dc4d07c4f01e20f944c6d9b2154fe89b982301bcb1453a1ad173ef394739cb9ef6da4dae15ca9a55b40f75991e35970c4f0bf358e31de7ea5e9b179303290a01e3acae9f8e56f644b83d0479ddc5b44f6c194df382b8917b82eabd0724022feb9a3c8396539cc8fa5581d3d2ac03b8bc107a5b04fb9c24ee545d8d63a38d0312cf5edead3ad3b0ae2d10c814b21d38d2d18951d288a42424df892237efbb320201cd5924a7d478738af4eb788f9cad11e829c940f1f8d879730b713eab0ec1d9031623c35b6ad752eb10054967ffb86df9e7dd20917874d6804e5384a480fad33d01cdcbbc7cff3db3111e8af3645c5bac7d8c296c612a0ba4eaac9517a61753d4170f49e002d773b712e93f6c56db2c708f72124d5f789edfef501de296455033a4dfc7e7073690ac146c563c6c8c16690c0ccf14e3a28476665f44b8230d82579f9a7d85ff64c3a8af3d2e9ec78c139adb27e5ea4b0e347d679ecf31c9644d3f42613aae261fc080b87326bf15649032251f4b2875530053ead60e393a3050b1a69375cb73b608357ec46301e59ab8a34c0710bb0d989733b96a74446a3f5021bab8c00f57f2f768cdd940d6e685eee8f134f42534b63c02d59b213d92ea38ce47d327e268b29cfe52484ef1a07c7bd69187356c100bdc01404b40f92eb6e42e05f87be2e383de2087f33ff8d4a351abd195cae7e9924811c02540622ea08835220a4739d1468f32ec0064c8e232b79b38151bbcfb12c355beab7a4dfe98ce3cd38f5a159bf3bd2dd104b5c9c7251fa4afcad85edf25c99f26c11e4f762c7d3b8f4761ebe3dd498dda7a0328894f77d7fc81330579469b5eea9dd303f0ee711e96b7b8fd7b620590707a2759d354a00ed38d8c30d8159bc7b529129781c9bf9dffeaa092889b1dde2b0ad9d47d96b560a779465cbd4ba7fedfb0d9164844ad6c6a442acb3516a83d3aee9c197abebdf6be3c6a33621fee8d6dccaa0a9119fdffd7b3791fb1dc457955f51b5fd80024711afc5e0d97af8277938d00e6b5049a90e3ebac241136cbef0871ec87f6f0c26f1a4b51c549ebe9f4903ac3f6c4d108098f85ede90e19f47c1969294c0314326c61708cd446b827efdb22a6421ee6d9c72be1e6bbad57b9d75ec056e64c8b0781b0b39087c6f6d68c88b0e148c40c9030966fe48311dbef81e0bb1eec2e59be68ea37b1381b9d810efedb029bc5dc5df80165465c249252a8531a9ad9bd33342bb7822457ec9e62f985020f355ac4b8911d761b68484b51f5d0ff2cbb59723f112634684a471bc9e72b2ef50ddd8a4e2e0283336093e1e14378e44de6bf6c9ff25be35abc46bef789e057ba89dc5cc134b26a99805c0a79b6d0f6d0c07d3b025087d8e8ac60f4055fbbd7d9832d493ac0e3340986ec07aee807cd0175a7ba0f0d5d5d0115a9a25b5814021100fad1ac2db11f71a751ec979163c45a8368483377aa6331f8283c229ee036911a4e1ec8af5ed0090ab6c5d8a5b694e860460d480e1d1091f117d3e566401cd445341cb262eb77969b4d15a7b8fdafc87beb43750d1140a863fd5414fe101eb97af20a78e9e66598a4740bcebe5c42049fa9f929294dcad4bcc3f0d68880daa3c14ab916b070452425d7d12e77ca1906d27dc6a8c7aaaa90e22ea743ac2fc19a9154b033420deadc68efbc685d70a61a1fe51881f7e4382e34cb8248117f74445669195a58e0bee83874568a4cbfbccc5f268f15c41a89b98ef68ef75fd2ae913ae605ab338b9df864bb5309f0dc1121d43fb994a5431ad4844e7dc989b7b6f876d533bae63ef5ce096929e52bf3d70e6b839e3b87db0cea7fcaccf5b63a6b36282277746112585c9c9decdb3e6f647cf839ed1a121181ebcaa8025c26513b86daa16c6ded49f3f64bef9345bf3a5df42e0c7028ca033bbd68c97930559508cba589c95dd8b56d856b7bdafcba351d5a2c0417af60c9fc8744539e38b47a07f32591c180bd8f7270577fd86c04084847a38a306a5579c471b5010000000000000000000000000052c5fef9f9f557dad6e8b102e3542b6fe700e9e5ce1f3d9665babaaf3ab34a1b858b25cff06698b4f496c17439cd2aeb34c4ca96cff0878ee6a0ed61613b3f06285823282b77621deea7c9797dac0c49496408f793a57aad8f912e7be9ebd61e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b5ce2d0b5ee13f8542c21d47ed6b5f12e3afb91794a83e306f9d16df0edce92626ece9903816dd5b4314e0c42589d7ca4256c19743ad98eb72e644b06c21e247a9b0f30ad9cbd2eefc7ffd7532fc30a644d127847707ddb21a7b4f0780460a8470d132a4d93f931d3b3d6566ed44ce84693e17c43bdfe8b786f84cb6bbbf450a0316c6ebd2e793ee3ee3317b3058631730495c10e767085d74e3c02c6ce400b9e60218ecb269cb835d02cb392e8351db87d733a529c92bc0d6cc12a470b49e407a520b077b9c181f7974f1f918d72aebd424101a9854d6c643b0fe7ab5dbec80a9ec0cc94bec0378d8d3e593ac3e1c159c7f4700c1beeb7ec3bc6e54b3482be1796b9e032a558122fa35cb2c6e94214f6ae66a90e75365c7c56c7d90daa4f3c2c43ac352032a5f33a86171e5010234db267a5ad32dc58690135166a66496165a9a2ff45fce022b75e5add021a810b2c8d78eef58b26726453c2445af62acf77850b85fb4f4b3022399976e458e5268295f506994bb829b3c1c73646224a5d313f756d442020740030e293c07c1d55d4fe4fd972a2b7dc3e4f323df0ca6a73a660385cb149d43ae385840cde8e2f93f9dd57c59222ba4032464779e00fc8ac9f0ac1e825b7ed87b3c7f6cfd18e13d18297768595f671ee46780ddfff4f73405c8cd751e938d3f6d3c227f34c1d02ba486ea77f112b44d0858c3c72c59aee5a1db5c9fd16414d0d9f505c6a0b816301169585d2e4b0ff0c56ef6dcc882748b9881d42d67d6a12da73c9fd408602ca7ee4b3fbf64cc1912290d2b6dbafc91aa920150a1b6d6128f60d1dd2a2346fe171f81da397d61d6358fb2d3f373d1f6443d0f201ef2c1e75d63839134b0a26ce52a34cc26d72b8d59ba3ddf12f75c01125e16a4bdf848e89f7d5d5c000ad3238ef7e14f17167c6f22cad62d3289c06babb696276f992fbbda775ce4d78c1c011275cc263d52ab76c2b57b1f0dc6fc75e165778a3ee79ac1bf8b30db6feec5cc44b005b669175497a80e213fc7c19f7a1be1c59e962bac888f4912c0918d06c24cd9e3b2582177bb944df440e1b8f188a8bc742b50045d5556cea70e4ebdb26123e6b04403cc5d4964f1cfdb9e9b72b6bb04ead82efe16e07be8a454c7b0b375e0840debc5292355a4fb94da0b12e0873a4f319ad5656de6b7528192e45f7fe904f1010c9c6e49fec62f502bacceb64dfebff46151548378dabc20bb82558c48e0ea0a4756049b4f94db703d193e08ef358b8ce805b13ea9b6f0c18f587fd12af59fcfbf725619f3ba45129b135e20a1ca9035e7fa1ff7e61b2cb02124ba73d961ba19af652d32ecaafbf5c4f4686176cffbc6b8ff8bce07aa0bd5d9ace0ffc5fce06624542920d5d1d7f178f11dd8cc3d5756b6ffb10d2668a892deb25a48c6d455489edc3af6cb6fab3c3b87414e391e2fc2a799e621fa9b8b6e45a329169967ed5407348eba46754bb53daf51fc8ed841246c2417d53c7386c533c8be85cbc9ac00935c63b3cb821c382eda3d7269f22f02d7f952ca6ce24a1169f876b115c6367b0fbae4f08bd27ee9fcc75b939c4d3c758f119ae19768936e44075c274513518c6721c158d8581cdf5dff534d39c72a6c707c439bfcafd3d3e0fd46911f0e2168af4159c922b7cd8bc53030b3aa1221f9318462ab92ee8530d2617026d22027de476138ed5c82c3332e5356ec36f20847b38dca90dad34bdf22d5bc12e7b6d1bcef25436f349f3281c9408161295710dcf03e8dfd76018fdbbe14d2a62301f25fb79635f547bd315e191cccaa65f34c28f40bbe4726fd9429f92f6277ae93710d0c31f6414ff1ccb331e76bac53badeae7e62bae648f5362fcd47b0733cfb8e776d4a965a64973b2288e34b2446f46ace967e857b53e7f1602636bea3db77568fb7102634d188806b4a35dd3db71d05bd4a99f78ec19f3a9092a3b16b58facd0f71b706e5466cba8e04848558e1594401da1193b2635b682404bd2d2efb1a555a3e086ff1327c46d4901ff69ef4b5d138a5526cc840ac4db61b80d9b0c7dfeffda718f761a1ea5b1691a746145b5c97f65af49e4eb90c8fb2f7409b1766f897b43509ee4a6ae7409bf540a5bd278efa9ff14289e4243de1856efb699823abfc67042847a31b70bfe342b0810dd28122fcfc857212906c2559302bebc05e78b1f91bfb2a2c66a065d6db85757013f7399966174d11963a0e1bc3fab856955d608006117256b1b2801690ec6af2c222831d241aa8e1bea0e9f620530761a067fbb2c7ff620f6ffc8097be661e3d43b581ec52010629456522ebf19dbea55d6750ba88b7d77be8b3ba297147719bb19e88c1d95c805e622ec615c492922b01b6955460974c346f7d15d363209cede1a69c61fd0294e255a24fe9eeba0920f2159b169c8fa5a0fde8976fc908", "53", 0, -392275141, 1537743641, "93d61de9f2370403b88565fb1c691b8c3b481b210f89654301a2259bbddebd8d"], + ["030000807082c40304d7c8b42d1177cf2cd95b2418a0998814e111dc760cadcf7d821d614a8d3055a00200000000f7c69212e9a8a99733bf464caf228ffaa0987873bf7a895cb7bf05ef585aaa531ec2c7f70100000001acffffffff639e49d1831c27d6a88a95b861ff1b8c41f00584adfa189a257ccbeb26d40a440300000000ffffffff42885f5f08cc96a90766c915ec4181d8856953602e40e814ce9a7cc52282a60401000000086a6a6a0063655353d8838d880188590a02000000000900526553ac51636a52000000006efd20c6025b15d40500000000000000000000000006acf58fc4ccdfe6af0adedb7abb30984d1de291a945540508a35d410c11601ebf43f49533758156e6c1417023d8e14d064bf22166d9d0481e17e7d0d9b7025688427a3d5d2ac82530daa66db203058f02d7f67f5050982708384495d0550b4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a5b72048d64ce5db8ef86c2fc901101a0dc7f3a7a0cee4295d1ef808b02e31c0f27ea72fde68b7c30eb5fd1c12bd2d98bceaf02f71b00f725dc0ca7e414273b608902a5ff10191a195cb255d0c9e535110a22b4deaa97c3c40ff16d5ec4cf52f823d6698e6f2e4500865a624c5bd6198780a57b73cb96059d89075ab623d46bc030e707cb56788cc214bed666d956e242a08e51f20bc91eeb85493a4f2ba54d98c0320754552cf7911016a5b3c912f0126098094e62dd941c198ddc4efbb78f39a370a08496b437bdbbcc6129696721fb1ac65c2fae0608cd5138de4a50c1d1fe062bbfbdb0d99fe5e0e4581b29b04a9cb897d585294e059c2d42860c6d6b6c3a0a223032a307d65d196a8622fb37a01b4e1577c30670d1b4f3b3b2f84e13d5bd0d0cab803285f9bc8ea5267ab517393cdd21c12a503391b60f4eef6cdecbb1577c16aad180317a45b6c2d9986b19c2b1c3392a69f7e4161a6111b5163891d864de09ffea3ee030893bfe532788abde465bc2d3f80cdd6b76398a84a9874ea1f03f3ce3eb4bfc9022d500d28a58dbb3fa8ae463687899cca4746576803e9b937b1e889c2ca20194442bb009744c46173c38882d2355be44f5012a2fe0b370f50142a618599ddb2bf74b3f44d85b782fc724596f88835c78185cb1838d46330e746794bf7d0049a17bc9dafe546e0900be1815842672fc862a3cde03d41fd82f2faf10bc65d5bbbe757dba8c1763f23b16298eb6436941130d23e61fa5647988bc4ef94c0366ff5dbaee1820e999ba62ae605c7cebee21d94de143ffb80bfcf5a2a9d45fa1762b6bbac014e6797a5451a863309545cadb7077b334a7a7ad1c80506aa297505cf97e031acd08c82b29a919b82efb662d7f53bada9352b5a2855d62efe1eee77fc55780df017579ef2d9abece5eda96782f63e3fdbb22670714179437585b1b871be5048f18a2f225587014ce1a0f61832a0acc18122c677de592e01c6ef692297ca3d0ec8353e3350b970c82618c20425833bb9a641f8e9082340135238e1a5504615ea223d88d894a70ce0b9ee763298b19ae120335401760e651b7bc0dc5d1072b0d75bb4f22620ff862e87c38060b790db969bd60f735585c07a288e73e6674e40708e6f13555e7d7c96cec1acb3280d8424d5b48627fb3205c733cfca3828f0ffb6a27844afa0ca614aa318a90fec171a0fa4e8f80a041f3c60147950665efc02bd90719ca6ce4382223a2b21fd69f1e8087f26b4329938ea01918ff75cebf6e7393fe4753259ca286dd503bb806edd6eacc00a30fb8b18919af73e81d54561f8af0f38bf21e342f530813316f0838f96c4938bf8d0dd30d0dd032c0f1be317cbab495df12f164e24e178949f607d80002169dc36e0aaf3ad0db685f60850d7c1444791848a95c8f64bd693a4afcf149216b0ba0cf2b490c61caf3d14f5a71b468ef58e171b9d9eac2214c51cf75c897b99560cb38d879af3453101092a1c361c30a50c60974d3b6ed7676cb1160337578353b2f1c144f45e41ea11c98ea441d4c27374e4f3ba0039a2776bab45f07b32029d225d24022702fb9f9ef4be43da5626fa8b4200c6881b472811127be7ff2f2f5dbf93ed6e7c042779c59606a47751c73c5a313727913d19f20b7c4d9431c37ed9a0873bd7cfdfdd90442d0a5e8bfbe709c96a7ddf0e08d9cbda530295d43858028e13a70134cb7c828c7db7bb36e6600d51d8f938ff7dfeb2571beaa891412f89471d070f7b66868e4e90ccccf8552ec1f1060d5542d55f0db0b8b9a8e3110a73ee5690269f0267bbeca76f729a07c49e5efdbde9224f6761d3b7044b7e7d3c78cccef1061fdb6447e50d78e7b3f49585cce9568438a963cbed182e2801e7cea366fb0084a2cc0b7f49c84d25afc621abaaaa271a432e08ba2ca4aa5f4b416f89efcdeca65d53ea7ec5568e4a0a88fee5a7a8679d1379267d4e94da127307e191934f76d276cd999edbf47180316ba1600ec0df27bde160b21b2712957c01c6ef53442a181817b8ad4973bc69498970474c579f50bc1858408344a85254499af11b548e920bd02e1234584bdab472d93160f329e6acef203cd2ea0c27da73ec47f024e0edb5054285893dd8abe80f5a7b844e1061a164ba2f2920d653374e9d86e038a8d107e7eaf1d89b449cb1a7b43dfca4176ee02d0280038e366e35542b50bcab7586e3f07b17f5732865d00e5be4c38b5119bbd069e89be21ced9e87bd731cafd9c8240e9fcd99019249cfdab8c9c6f843ebb6558957a80f69146b6a108d00000000000000004b690503000000009d9b2df488d8bf20fa846aead1c8f18839b36b87d59973455d290d8d821898799f9560cd72fe98b2680ca04d94ea9383b270175b28210453957b792ef27036167d44a1ec53c2b4a52273b5c959a6f8941ef01b0a2aa526ad88c42df4efb705c5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009adc52cb07726ed5d80ce636377bbded2e70480f4f8548ab2024abe6f2340fddec0f4cda9b5d82d3419243fc74f58b3415f53a5e3dc0329691e7c61f0c74bfa302c9b6ac1fce9bbe8b51cf9b747eb5002f74695c9186a8c52727dd9160b7ccc56ab05fcdfd00aaa49889919d1c872f0a1d941718ab33cc2a8c3a6607cb0932190204930355349106b3220a54b7791779d93f07f15d6ac08de877ef8853acdefedd020dea58138080de24c85301a104e29ba2c6278f9fd5130ef1b1882f36549aa1060b0388d333c50a8d8b70b84ca30c160ba4ae04aa7b759ada61a6575e781bf57d113e1ad5df82a98a63c01917b15013f9780dbba7409946cd84fcaa26d44e5192bd03281be7df1661e6039de716c13bcf52d5d2bee7560c7e4258ddd6bfc865a36b6b022cc542a562cf93051c2e6ef0a5b084f80002fbc8f690907142a3153b866bbe43021817b85cd15f34096b95d49301b431ba6c11507768d52c21034bd8ea511f67f002275af86a765c20141a8e2714a563201a40e9336dd635231ffcf60a8f687ce9cb020816d5ba852e5b960d2dfc220d38bc0bf6c4a81b70ec9809df93248d4bc521bc434a823a792184a284fd7507ab302966b581a6204ff6e52b0b9b6ea54a771714a35a1239be49e869d49346ce8d66eb5752215ccadaf151cc9f7371d7d5c2b2d494d974f18022ba96e123e15f6fb7591415520fff40922afbab5452390b4d8e1a877426904856afb9d3eecce1186c378a65b36dee58729d0418e4aae08dfc6401ff72b02492c4ca061f3511e31575641225582e4c6bcbd9e34e4a1185ec06aae0930a198965cc7dd868cf8bb00c98916b6c1e7a2c7d625531acde061908b88da6c4619efba41b03878ec3b86541bc7eac2a85166acfe8d91ed9f09469ba7bf2b655629724b339d59fe816a125e379f43d78745b24b907b9b039c8f81b0150c77a34e6ce05e6f88f7a122fe7ff579c4d3b5a9e6f08c51a63237b11044429e47bf631eb755eb5055cbd81b5466afae284cd12ec4486627454a09e3a7f1dea51543e90f9ce269768662d6a1eceb80fcc31351b47968fffa30a2e6343fe62241f939ab0024d3290a36c6160ba8b2d9133738bd88e965d90dddde576a3f598c03a97dd9b95fdbce4c5b6e487cdf418d396893784a1e0f7a81060c7df5a694ba54edf7de0cd4ad50372f9ec3715af28a37bf3b5974b6b8d08fe1a292d2a53dcd6b25dd6438a209131587a36067acd5756ee5785d9cd966b0ab363773f2791c174abab0875694bcd69f9ea362d3369d3c547049fc363f90fcaaf6abcc45767b29d9e884e5cceefe4c6f62a431bbe527ac1ffaf237cc111ca8758ac2ada0ea62f6616c7c044d6d3cb417c8724cda8d23719d2f0865c846a41c94d9240532f647af286ef68386231803a1176df654fa980c15c033be00602aae72f9f48e95a408d996b1a4977034f0d4147844d8d268fc07f948cf43c3ae5a33a941652dcc67f4ff6e90700796726d792aba1974e7a342376e95f5e11f6b0d003c224c007682176c32eb0cbdc0be06efb91d9b9722c3e3c88a271a5df97154b3ae098d80a292386aa0354a07dd9eeaafbde374f3e2b2fafcc8128df337f000a868da53ac2c53f78f3c7ccc545f2cb3aea9b30e3c7bde18d0720885423476085be7718c19a67b24e104c7ba8a7b502ae54083dad51867d7b258a35e8c83048933d7aa663604cb7b2b95bdd97d52aacd250707f27248e36b5e3b81244a02fed0f2e53fa8041df8a10ab29da7cff0d56beac59d42910003d9c827ecf794126069ccffddc2f95c8437af666822c667bee68bd45d97e858293174de3d5dcf597365d1e0d046910c3a1742c0caefcb31be7e37d7c6fe0512b9b51fb7de71db8834e8da24dbe6be2aab05dc510b081cecdb9fec17980e4330e43af54554523c3c4bd4ccdd1f9faff47d79d330c8501fce5bb69ed5c7a8a9578389b586a814f610c8ffd1963f4652ba8c3ad722f63738ee7c9e47cd7d63415bf3f4680fee8df627de813bdbc4f99f5eda93ef0c8e1155f580f77db85e02c4a2b4d77180ad321d557f1681533f6e6480ac1af12a68d070a62d3ae9026d4c730da9768019940c8b59373699153803bd31e93a6f73f54b5f2bd51dc00c758278ffc33a9432c0a5c5be9c52425a354cd92a7b55842f66b40e27c8b46b0398514dda12556015c6eff2cff5c34a27092204ddeef8649682f2d865bf792d97e174211ca26c32d960e4b81fb75e20df08502a2ca0bed5fd5c1ce84b4d9373b8eab354371fc5a1d718dcd1b4ffa7bf94f43cfe07756c3754d284f4aedb5c7e0597418b23115efd51effb6afec13794b477c27237bf21153bcdc19f7cbcd1f6c089c1d7a8e468ef5a82cfbac2dd2bf3326b46286a572eb02f92caa0af67ddc52cc3b6134ed6da741eca4681906", "51ac526565", 3, 849022614, 0, "fc7f06c81adeab84768b418c005fb1a4320a61a9e116a5afcee70d5e21309b4e"], + ["0b750f4d0161b66a98e90509cdde9b9becfdc76de4b1d7fa1ead0f3482db4f66a6b15e60c503000000045265536adf7837cf04825393050000000009635363006a63ac0063195c8d0200000000056553525352c474a80200000000096a5163ac6a526a6a5318618c040000000008ac000051525163655bd5d0d5013051c102000000000000000000000000529d16cc97952076ad96f709592fce340ebf5f27564285a3b279bf26312f859a49cb7cbb48cd1e9a2234e336b4c1419afae5cf08ede5e9943f132d172cd35cef5a0b8509c694002624549fb22bdc6f34bf55dec8206aaf32b670b3222eda839d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041f695866daa5ce58f375f0e42ac35ba8c3cfcfa4a64dfedbd6835ea11e80e9d841762889ef2616c83c136623e28673ca78eac7e4900056bf767fbc58586305d08aa3e11fc2b33556e72b21870e1803a115eb9da1998c262192d24fafa10ef57691bfbdbadbec70251c75d244256222fc22fd8951e783e079df45153610e2c64031e4c34230bf0f931eef7f57e00d0c2323e3ff9cc43ee6aa92fba5ce818a1a1fc02010635a77e5888d0c9ab396512ac3ac428407ed4aff42900c4240469a371927a0a04bfabd45117daf4037537519616f2a6996afad37174774b4f1718f985d05d35fc18e305332168f3dee5b118a6382f1a43bebd55d7d71bb2300e0c549014d4be030d42cb88a1f0597b3b9c2c7cb61d42d4720b61ef915ba32adcddcc7bca1d494c0226df7b9cc33aeb1e41fbc6f2d7f510f6c4d69cdb35de5fdb9223018b426d0250030dc24845087ff32ef44c73c2bd96582305144bd892107f21aa2018295a0ec68a032c6bceb096a57451aec28fd846c40b42bfbd6b2acef7d6477caab1bb77283077032823680024f4289e827ba5f4c9af050a15c6ef977c052469fe287cc828a3959dd7d9e1f6b654a1694c95bc1fd283393f886098abb8c121e2ad81b40de7af47d1fb8fdc2266dad70c9f1b68b78465d7940cd13d0d3b5b1efa901bdef612692a49240187013391d2dc178c741bf2128985b5ab3dca924a6859fc1e62a5698b8f23afe05ba95f69830fc317d66822ec493252346eca0643d0e0303ac05ff7cc56a422d0e4003265990c3497b5e12a690a91598327203c617b9c34268cb5291c5bc2beb1da26c4eed383bbee10626116ec57482e7ad61ca220527b99a2012d078ca6262dea743bdaf2eb1106bb514b94699dd5829264d7590b056d4e0c1f001cfedeca6aae76a519adc3e9bb21ea13e42abc51aa580af74f6b07f9e963a48529687917e0045035bfd45d6821421e0c4dfaca97564b957f750de2608e44733927c6937c06241f77efc40dd89eff4e9336bfdb8f13580ea9f340c1ec3be4e0ad3405e44ea4e3be933e6aa967dd6205466ea1f402b48ad6fc3b1706349b9927572caa20e6338de8df78c3e989bafb310334dd3990212ab9f85d2c9b6823ba826f45931a3ff84180b1ff59e408abb7ebbf063181e8367ea59750adeabaec62e829c20768b9fcf0b24fdbc1fc6487d43c6c7b888acb61cac4679f50190e5b692809fbf82a646f67660ce1fceed6b46a9330819aa7ccb8eb3ed85e2bfea18b0405085855759d0a722e9436c27d2295dba0089fbe5acb11bec85c2e23f97fba05bfee8188789858244b9689f9cd0ee8f767150251ab1de8d27c027a15bffedcb2cc476f8ba076b67851f7388b48233508ed7b14be70582339d7630b04b22dfbc99e0b2e69db516f145c59ab03bb55c2c6e12331537de527e1ce66ea04f92b07220ab1cf422f7bca78356f3f1d6b375d3363b781e0886a490a617fbeb1b6cfc242f112f805602f8ad2bc61084fa75c4e31499980b5a49853a2d7ff9f0f02afb8e1791eee3f37f70145a37482d4d3133ccbe88d29de5acb312287780170b37fa35051edc803b7c36f11fdf855b2f81cefc428758399ec1ee442c572ba34dabc819b14eeda33b0e470117fa0e4b463e6139237003cb175d23a67b662ddcffb2cf2e5fcd94c711b2f82e07b183b2877549f0eb7afefcf1ed66eae16ea9ff7eef7dec4c27a1dafdd33e1455b00a6720bfbd28bcbd32e0c2c5f5340e5736635d6363795d19a7d1ae04c06933a4e6e8c91d32133b98517862e4bf85ed4fdaceab9b8e13db98f67903eebb31ecfa56a7537e573e362400f26dfaea7131cb047e4663748caecd709fb0961ec743d65bcdc0886f191f166e687a36292253a1c75807da91cede779124b8615947ce1b8db009607004f982a68ddfaa752b2c596d100c3857c41e4970b0429c5e48e60be5ca3ffe3fde03a363dd8fc7d47339221aaa311da4c39df8f57ebf56f29a2128e666cdc2dbe448ac788b11b3a5a6147e0612eebc7d08b624aa809bc8bd7c981447ccca767c10589f9e23fc81ee1fea7d41b71c82774536e4bdc172b51bae52c0447813329d9796482147cdadd3f943bbf6988a15c8fe264c71a3a2401fd3d46b1db889d9891a2caec54a40ff028e828a3339b31af97bbad040055315a1ffda3282697f57dd28d381cd513f5889cb64b49a4d8baefcff8bfe40451ee8daf47cc2393a4b8c941b4c593c6fc2eab6d9504ae68d3add49f2537a1a81bb7510efc26f93a311627042973855af13a7a0f3270138b09f2ccc60729fbef75c49b9015d6a94aaa3dbc92dc9e96d6e8370db55cc03f07857083949ac9b782beac9c0937beffc2678803a6769d0ffbf96e9e86a3856bcca2a918b4ea5d6f75ee3437cae0372fdeacf960c12914cb0b08a39509", "ac6352510051", 0, 1271430395, 1537743641, "ed1c370150f46c27f1d1f7f2afb77452ea4d134a84f8ad7f59f66a7c4aa91947"], + ["bad8031e013a06aa8aef741ff8dd0a98c573f49b8c9b4c429a06620eca23c641fa057deab20000000005536a51516affffffff04422ba7050000000002635308b126000000000004526a5353ccead80200000000095263635352acac5300a2d12202000000000452ac5263000000000200000000000000003ec4b2000000000001d3f6d27570dca7005f312f0aacafb3c08bea5abc97452a4f37ee41fefda31a9b1dd7086eb0a10cf86fe77198a7c61c8634ab1274a6fa217b54ff924afbdf28bff40850128f4c5ed953b92ee8031a72e981287d1ada5ee6a3109d8ccff2b2f800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000330db90af3f6809e44a6baaefcfa05fde81fe32300fbdc1284a415dfe77abbc0b0722b3d2c32d262d81c64378e8bc685f13e20691312d4ef76eec0415db4c390d4f9ccf95ce82e2f43459053fc8520b3adaba6bb0a1fddaafb2e8607ec000b4e39f10600978ac8e2155f7a109af9a9da51adeaf35a51fb8f3e060260dd1ca06e032a38fb58b0a7bae01a2564f2ea5d3621ee8f7b37c606a47c5b780665ca641dbc021fed5744032a9c2c098de9444096dbcc5d8546028275d1244a653998d2aa0b370b03bd71a7a150dea22247973f00cf1b1cebf4c7790a8bbfefb71fd9c00ddd6f1dc97d6583980fceb25f037760ebc6d57fa26c09f655683aa36da55c593eebd41c031bf2dd329592d570428c3fce448fe29cb37ade519a132f744643e994f91dc705030e3fddc702eadca33768aeb760fed3c17aacf69605645afc6cc013924c8084230319bc899cfc6042aed784b42850aa739f239ebe53719f19adfed3d4b8c16a3bb902005af9ffbc8833bac5d70543ab2064a427f3d4388ef7a0452f86ad8a8c8cae8e030a1983e5142189ea434003db4823b9a63ce5f56ca72e45db4b4cf177cd04823d5fb1aae8194cec8edae3cd837313b94f69132e5114c55d88488229bba5cd52cb2bc24bb385685abd67c95262f2c95aa4b02f353f50fcbc5678cbbd7be7e4873c3664313271920befa38d02cea7d87ef554316c65f6a93e5411495e7a824beb671a3f1553250cff46f5e57b2bf5f5ba4f537b03878b4b2edd068c18a3a57401d58db51009a5b64bafc8565d2b3b176dfb3e25483ddd8c76d30df32f5881c25fa08e31b698f11b36ba808788a9ffcd66e99d1c3f448f889cd9ea3f8579698af95c916d27362787aae65efaaa9fb584eb7bb257daf474c2422eb22ea2bd21e7d5e666904d91325c46102921422dcdedd42992aef315bf24e18e2d0f92a299a7b0dad317054671431a811cf83073e44f3d4bb0252e47d17424d34d10de9c35b92722e9fcb1fb52acb84b9abe4f7127c319a232afa8bdc9f07dcd5a23a163c7a950764a2145bb564face6ae8d36b8ba5f56aa5d6a2ba02c4372f1470831c2305fa867b44cf94a3bd773c140b5eb74654f899bd0282ad4708d08891f0bc42229febeeea2bbfddac335b7d47c36103493da529e81576a57a54abfa37fa1f99f8e5c947d420706b42801b9d290a1ed2eec7f7dd28ff4149216cd45821e34b82382044b3133fd3532f4ee22f58abdf8c80eb1f1ddbf9ef1c716c9c2f23d79a6c548f2f194af5bb5c29330ef02a1bbcd296e9bfb7bb5e8c3d50395f5b280ddeb1a78dcc4217a1f4454ff3f1740d051b47e4252965e354947d435ff21c29373cba567bcdf431a3601d310259fd9837733dd08a4259965a566aa6626228506d18182824beace94f87e4a9dfcd3a7cc926501d534beefb3154df941c823d55f48df1f224f39a31ef2e1ef1f5e9cacef5da5f34a4ba25d0d46ca210444e2b60ffd1be845d27ddadddadfb9d6e8fb5042fdb677eb9c9b8fdb9f9e108fc51e074d4fa5991186132a271d946cda2044dc629c2f07ec6abf6d4db15e85353bda23b9598dad0819a81351f2715c350da8d4a9681eb70b6bdc72959c4d4e129838bd392a4c5f3aca1d7513d0e29cb4db2138c6846bd374bd8e53e8857eb9634f192db8c5fa1a9e031f872b294a2234df14756245251fd647692d4e613b7f220b5ab747ccc3eac9ab3c8c920f01353f147b9c239a0fe969a113b6b9e4afc35fe99f08108603d380632f1f538e703bcdce6758718137d40a5b7a2d2035fb7e4666082e9b5c63f3f2fbe0fbba496bd96bffd2126d10a7efced2184a99949d45ffbb347245aeddda080d6c66010e8935db2fdc014add583d60cf2a3ede28e0ae9c00d8311577ebf33c07b40ccc4462593cd6ebc1b3969f35059ae13bd3cb14ac99c70db455798e92e843a36ad3bd6edced494d4ed7990091d881e497e7cf70ddd499e4d0713d4e3889534d3056762d1f9da6718979b88ecdb420491fdb46c460dc0f790ad4689cd64f12efdb12b4843d36b20d6069d4b8ca6dcd27618ad173ac0831ae36931ce4ad2c3aeccc4e48da4c3a05bb0ae30a56b545f17f9199f0443262dbfc4c3cc542f7d3db1d72b26dd1675fc6d287d4ccf3b09bfbcbf11ea0610d15a7ca80de13cd6aadf762b80c1891a0cb5621e573578e113a29cdef32e4981818519e4cbbccbc5e336694a05669c8ec9d569c242ec315843b5241f835e4d83fcbd5adb13dfe2a4fe0cfebc68dfc2ca3483256519242ad3aeb5d8a76a40d00000000000000006c2c7d02000000002c576033f690ea1522656ee762d05c8d14a04dcb85b958258e1e819364de9998d358bb3cb3475ad8cc8b345640ee7065b4333c33648a0cbc0d4216685bb75e3d4876cf2c0aebfb95dca508884239a79413856139fe34eb3fbba0e0f77321761100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a6f23163c139a7999180a53e91db67ebbbe030b85913fddb2152fe45d8daae84bd75c98b443e4362a8914690fa7e8a08c3f441757a8e52593cadcae21fe5ed48c3b061004a00c1a3d9c2d0ad48e088c1ee3f5d17df5d2612c7bf6da5d8a9a8ee6986fc72d64084db4806f849410c71588d6073aed0f15d23f48fcee6ac61ae49032d11108f48202d0b0b89c5ababd61d97fa4922294edaf59d9fa4bb080d6598130325a2b514fef83447f4e3943d4d3b503b4e3bd4c256e55a7d5745a6b4e4222ba00b01ae0d7a05b2994223e5cef22329e54336e16fd256c299f775560177c93cb8296401c599ff5e6a79dfc6e452158bbb5aeda3d624566bfa9bc99bd0dbd8a4d363032ffd523f4a2b049a0b0faa7fbe133c8a7c35d6911f2751bfb5bce0ac3cdbc7d00222a84520828d01d6ed2df7a42363770b179665e650cee5afc69c35137af7b14502234bc47844206e603193aba8a0cfad3b7c7124f862ec7899119cb9a2aeacb634031ccb143b3c7b74ef394c372bef938a06e883fa9a0595d4699e706b191fc6cc0c02301102fb46bb15b7d09ed2948b7ab66c62f12bc23694730cf20e68795f187d9b1bde503b95074082946360a281592d5f05a9c9c5044df6cc76ff73baf6edb1bab696c3f23c92e21995eb4aa7d965dfc761ade7ebdfad47044a03259f8a936689eef8d9bced3910c236cb6e1e9cb43130c57e89f8eec05fa88e37964af058e927f5f556b6ce587558f7ad0924e85ee74018c83c459c6d554ab345cf93719eaac75b89175b65047e77abde7bc47e779411ba23beb38dffcaf5f3d94595aad358cbee18e7d0c3c7f0096c9f399707c5cf10d1493e97aad3551e5444b989d70268fc3850ed5b3d1b00ce273237e42a84e59666528e4b865262371590ca25f98b0c7a94f2a35f04f63ac79b210c73ae0f8ec6bfe21098aad8b90e7f880f20eee17d6010a3035ca216ca8e99166bce77657d5a114ac1a6a794d38a55e0fd1c8018bd2b49b31dc683287473ffb9987ed31fdd86ca304eead7cebaf8cb42a5a9dd20dd9ad6ac4301adc660599933a854e68813fe46ee7dc091666c8576e199852e0b2a9d506e080495abcdc153315dd5c2c6c40e40c5bc200de9e810cb2fb038f37ce9fdf20f98abf7676ca584b7a50f08152982d8dfe451d6140364ef7729f6610d55348210dc75eca3f8a28169cbda74f86bac9e6933c549e69d403b71ea96a2768e34969877c780687b11ce3cc31450483e0d28b7dd5e54620004466acc99e0644ca2e5e9ac24a7d5df90245f940686cf7bfb82a0b5d4ccb4124a27c43068674bcc770b9eebd447543c8b5f807c902019179f911f73e1f0223a37ae42e1a2fcc1b56c90850d2b48fc8fdabde05c5380a89d78e8f2bb4a8af6b59ac30ef53cd5a654bbf5a9fe49069d51ab5d3f7fad898cd2586b16d815f2e3efe4726386db8bcf89656085c0bbc722e3414201c457b0d5e8e823328d1b7e358b394bc984b2491f57db9f82c96dd9fb540cbc9fa63e528c7fc52fd0bfb7cddaf296035e041334bea306cdcf6b9b276ccf504b63bd876e5d6e9098acd7a5766b1baa7e7fc586638d7e35be197c500df8c1c386fd30efa4ba37ac3dcfbd77642903254ec2c6179399622dd97ef4de2a5a9744a861952ae647fd301254bccad54a597923204b0cbf6c064fd1278938246ab5278d8714a72313d02b7a4277c8f48ad0a069e711d37342aa4d19ec0721875f923b464086763c09fed6552f6491e5d4c00d640bdba020eb42c12dce53ac92dce5a345fb6d0f371ba6582dbad66e024febf0d320e30321bf7e73889e0e5f106e0a7997ac271154f97e1911a961502233c3c6502b586a46184723676f255ffeb266cc0b798bfbbb782cba4d327cd6ee0ac4bdba733075c14e138a0a46b6fe2edb8acb0cb38ef2e92fa3586ad3c6348480d86d263b8208f12ce3736349b3ae08d9f091516eb46a7fde98d8bd74afd77399558d478ec6afd787d3c6a2e93249579dc62cca347434aebdbf4a426cbcb196094028e0f9265a77ec8c4d06836ee3e5abc82c700de58d976f5d2c6aee0d7db57c8002988672da38272bf204200977f49311cfe9f5ec4064a09805275e21e763392636d219e0221d0959bfc006372bb8738fdbad57c378ca3971be7060007a55de15e8dbabd69dd3f3d5fcdacc9b13676c5205adfa78a1f4428d9f9d48ac21ffef3682d252ae2ca53cdf3a0eb3dff4ce0922740f78774aa8f71a3ce54e754bd319e97fd64d61e6e597128bf2e567b9591a26970b3bed19801fc0ab96d1e7fa6af882945c5894af64fe13a7f8a48771240b3f2b5a5ab3ad2e423611cd7415c6769eebf3cab0f63fcc49f9ef771e281783f22ec025170dfaf2c098ea5721b49517230ed8cfa7f14fce5fa5de6d9676b60e3fc1fff0197804df96586dca0d", "63ac656551510063", 0, -423159274, 0, "9187470b8dc2fae865a4b8c376bd89ff7a605624717530b4489ceade401bdd09"], + ["fd61516401bd94b3cfef12744c05147526df75345334b048dd2231ab950b50d75f3a05ffeb010000000451535300ffffffff031dd485050000000006656565ac63526ff6ac0400000000055353525151b8c309050000000004ac5263530000000002910d2e0100000000000000000000000036aeec530ff4708cdf8096a04a87fd0c8d03687d7eb15d444e2177319b61a4bf66422eadcb2a016906a9f2e5b6ff9beb6176bd8da6ab861bf230d3152d40b2147a1308afc4650d6511161e50b532e09af057bdffc723b8f675edec44466e35960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000039afa1289e36654268ece429afe31ecfcf88309011e223673dd48d98394fb7b77ead572e4549e67d05a7769a5029e40d4ff1cc914f42adb76f322d44e57683cf6510e9cefb5d3cf98e3a1272a2a6a54cd91f102f84660479b14a0839599da954cebcb938fb6907a48041575d824e9de124d6c31fa937b6b1761e194a797fc2a7020e5d451a65b3b10bbc28278a57f837a865796d022a0443e894d2ed2fb986b10102200e9f88778241d4d2261a9e250381c38aab6d9443b140aebee72ae63e61d8e90a053ade69ff9ad010cf4d93f1a0133457803173b2f830e0d50a03e372edd56c8e2f679cace3b642110406395b42391784632fef09816060852963110a1b881c8f022d97d41cca57dfd9e52555eef5f3698d3717655c074ea13b54e7e74e7229c972022487c75bddfd1a0c13a956c05ed82390563de1fee8e50d3997046bfacf2e4b20032719d30826f6cd5a403cc6ff665688387873a53e3074daf493909ef10a740fec0304354d301edd9081c1fdfa603f69d2e1323bd510798a3be41771ac8975d4d72903258c2e5bb88ae1a4dacac268fc5023508e393294bcf4951c86db24ac765a72e5962e9d3cf22fecdaa032f2a01c951cb32751e13e7aec8c52382ed5de7febb1f62ccf8bc0f7218923700c71605761d0af89c676375b31b13d12ac96d33c588ce853e1556305c5203a8923ce662f2ec91207c221df36d4752c7852f0eaf98aa07e4bf94ff139c48d921b12b0a5c59ab17a526409826a99081698d7ec518526d03a72c1271b14a374c07e7b22ee75ebc184b1e9aa2a82b3859f600e854f7cc80868905f005bab0d47593d412231a5db8900576eaf8a600cfaf6749bbbb70ce5d2c6c7f34e33d3321468c34b0ba0d35e017edb7320f334007850f1245b864d1ac5185f0a1cfdef42c18817c1a60eaa9e29fd2f9d0ec73ea74834efe22c3853744300bbd559cc6cc669fa5bbccf91b3ecf6d10de2f35184c31af9326711e862dd02f897a1c927caf1ca19c74c590b28b8052556b9e3e506e3f9c86088fa60e190b1244d27d71e6d5f1b116f9dbfc9d588ae5723ffb06bb7e1de033bd3838c09e185a158e93e1060b3526b14d1b5047ef4de11d6dfbea29a5a58b6400e844da8de2e88986945f64b3d449f828293d59068fdab961afd83bae6f4c01b65ed8393808d84df7c77c61b02226e98ecd409da3439fd72b4ab7c317e9c6147af6ae07ac0611e0b18651bf620444784830d004812fa389f7c2f56b0321d430bce865725b7d36a45a8676cbd81ca07b1bf5c4090c375418aa90066d3a010867ade9b5261a354e257ac5dae53010ef443dc72458bd5fa46753e5a29c34125f9a9319fd3459ba01264b0eeef069f4a534160618f39db1c0288380b7a5953d7c39978ec3924eccc24632cd7fa76b1454961956d34b7ac529baec260f688742f13a93934d879ddc3d98f97aa071817d2b4ac6aef430711c28a7540b03ec66e866a6e73208a59a54271d4fa7989d896b6c011b44121c66b0df4e769b23e9d6a0d5df6721f7b62068e2b3f48c198f5d42e8b19843b77e1516889d9fb90f81f1ad3e4170617dff9116a364a4a0049a31f1bdab07970eec8e6a5fcd6fc04ee50e4af0858be388b79e04d1d789c33163216e755b13ed848576407a12ade28852bd7947daf5483531a2a42edf94d02aa46eb6f76e9ca8423a3723bef360fea29bccd0d9f80e3c141da81245336d0bc81d2bee182e46d73822ade1f56573887e3fa37b90aa8692599c5e32b9e38bcfe87cd44f9485cceba500a2417393b00cde9fcdc0d53a6a27917191b484f6809b0983e490bc81800537739f4037261d10673809a4286aca51314e6062504ac72318a896b384c2f050515cac415d820646e588d44a2901596b1af6124ba98ccf0185c6679f835823c7688db1fb9f5fd8c2dd213f5054c6f23243e0b0d50198318c9d213f4de84794e911f4d86e4c12d735e2f3e8679e6e3d1f3c7217e75688a7a4e160db3a3e3d131a4a57e5682cfe53ba10c76a5b76ab9d8b49da14dc45611a68d5f1218d2e9c1bc7fd14c023ce979d4452b21d191bef5a9229d8d9233c1be0758b8de60e0e689a3fbb61de91c691f68d4b37abb012747b9c0ae14aa590f3faf1985cb7b4fb1e502f2414714f490b87ea00cca7afe3682af845f47f4df687d1c3d6a9cb4bb324f37605e9babbc25e73ae35a88e3f51957c4b93f7c2fee7df0244659cba92bc741110945ac617f91b69a0dd5fe8416293fe852154ad4e691e3132979217bcb15b7fb3bbd166c9d9a420d0000000000000000c978c503000000003febcdadb52ae74ba0b564528523b9e8a3b43ec5d03124b3e478e64270123c62b4853f3f274e466e400c7ff22c5abf1b32060a1dfb63e4cb1d7f6fe629b6cd1927528f7b35fa4ced26d7f1df03a974ff73328c4b256040af5930764f33ca8a5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000845da597e305ac9f0cd6a894179b4737ed32d6a5121533382c639dec5a5a308261ddb3b4e11531051d0e6c307e3132a77c32915530c01b8a397c5ae801eadf039c432184519ca20e3917f3b841c8e90cf5ddd11f08f9d619ebb09ea2387973d10a8bc9ede727913133224ace1c5077dfb32962487fd6aec3164dffdd264dedaa0205c098b61f3011398f0496da56e08c18e5b00c236d662728d58a1e7a4830f4dd0306f6c52d35b5e3761f5f7e9d4d7c2fe204dc66180faf92fb6d03b86bf32481640a05e3c931792a0951998d33125d341e70d444f2e0b92f276eaf6605c312b380605b4b9cd999eeea208e4e0fe0a3850a8de5bee079b41a9d7d7ba386005d8e377303270945fd8fda1cd1d93213c5e475a9ff2341bacf045427e7367c74c0bb41e877022b4c4ab86f1be3cdcb0a4a7b5d334db2bd48e8b5995eecfe6f7a38c9bc51af5d021f959e36fa1d9446e719b523356143c59c39370a29337234f6f7d857e2655e69032f5922ad5a94a55198359120521cc88b27de8306c0c63a1104a65e639f3a37f3021bf248d41ebf9072cc44ac2c05cd3769ce4659ce1748f79b3581d4c80b4c7cb5bd35ec7c30237387d8eb91b1186c2e634547e3bb53e56189e8b505f51993861e46f010184163fc6ae9ca0be5f70bf1da57e29992b1d7d81f42f153060553a0bb812288be43f560ca3ecb20973486755ff45454d22686dbea8495d5aeec78d695e291f75b99865cb3923546d4deb52187b1002d118881513daa8bb25ca0cb36e3da1c401add0fa381f0ad987f86479f7b2a744794379361581ad0b8926102956fcd9d007ff3c7206f63af5e74984bda7a9b394736a400c58eee001921e3a595b5448bf1844143aae70abd3527a7577a5bb8a8789c95812630b636f9a1df8825eca8140e13bcec3e29ba0829c95e22179652f4ddd0d23d3bd03ba78ae52516282d38e2d1e4682732b9b844af92d065d2d5b259cb41bd877f98399f991153d35dd6fd9a8cd89d647f1c48f10ca42b69bb164ffe69e21131229a435f1c6b656a8379090d1f1a5cd2a9c174ba7903f130976aa0ea31cc225222d454f8e1727b4f4dac7987f488afec851115d060a27046585c4fc9ebd9fb4376579cc1bcb937034752563063d74d0463882dda0a3bfa319169327dc3baea5f64e55d300d05281e1b79c2511b81053e8aaf602ff50306b33cc91e46d7442af2683ad6bcd7c9499124d103c8e469121a40a8c2e99987d3697b89b5e1c9cd4a45729e79feac294d32cedb07e170c5d2fe7e4d563b2d19010246a82c38618610ff3737ed1e089ce633a1d19f43abcd591db46f20008e8633508700776932f422e744d0c96af3cafdab4ea3470408dc392d423144162326b08b3d3d23e0a116c0eca7a9b4a9085fafe86f0b0a3424cda51baafe18276c1b307d0c60618ec5013a16b8a69b26e990e986606b7997b92345a7696e52db7c33d21e90eeda8a18c05ebe1a6a4db82704a0d246a72513fefbcb699452f1c98c539321e5f4b865ceb4667c4481f928fadea299a4fb4ade66128144c2dab526a7419a90bd4d48af723a6db0e6ad1f6e137e22961cab6a12803992ea34db492500eb2d2bce464a06a72f41f7cdd2d66df03ba52fd4fd1754c5370a5e13b04cb1203a5f773efee5a0ecdb4a158c8fc4c6697e35c0d34b9761cd447285d7178c92cda202845485d632f0d517821d4a83c4152f22ab4d8ddcec42bac4f5ea5ed251fe47f17c28f412cda80f13ec1de08be70f4331fc528a835a82be061681343488f3ad59362a97f04a2af0cf32ed638aa5374f83173947fde11c0e46a888953c22f4adadd3876c24a84fa269eda3599cbf04ae317f0cd39e88dc622c200c065ec05aaac039715abaf1367df8e5c10473516d5c8f1f6a88846f6d08f13b249cd927e285570a66fe35a40ed8c1d718ce080fe9281b2fb0be2a8635ee87d056a320bbec5b8099f6d57284501e73c500856e34f385ed31e3a53a941fda9281b7c82e9dc511c7a4e1fdddb29e6ad6f91c0676b52a456e5adaea473abdd1a06b2c2bbf916e4c4fab9889fb5a5d5e2c8c8094b84fe30777279b9672498005207d057314c616e4bba808c2291f84a49bffaca23d8669db51a6362c5707d406a3b3c80bcd8e08379651c4a52eda717967203a56024779f501ec7e8e9db221e6468638fb5187929dba4a50edc051141c743775a8bb3dc886199c2bd2e3b0b06bb40b9dd4f971cb45682d57ef6f72d278c812001382578b1dbca4d06f7ceb27b4ac87600c384228bc21d835eacaf7fe05486134de0777c925d45c5684b5816bbde60c60ad06fd941a4e93d7ae158b01c49223c14bcbe0d1a7ca7a0e58a06786d23af93f09518ab671bbcedf7161ad019789e13597ea0ecc19188d9455ef126560d03a7971403b217f891c02048804", "636363ac", 0, -397200488, 1537743641, "dbeb9f92d9318eb5c7e3af6b0cce138fcfa43cf7f3ffef3c4a2e7ba5ae943f0a"], + ["2c08f256010dbcb68cb8daeb1a9678d23df67e7cd695976107604d30d49235fc9525b2aae901000000076351636a52ac63ffffffff01cdab58050000000008516a656552630051917022a60155d9fa03000000000000000000000000fd37b62a6d6fa4a3387c7b4679bd0f1ce364e029be858566bd57109c971811bc65a89bf33f01c21af480beb94f4c81bc360e7093228aebefcbd8a192497cb3c15ef06656ad4975250a1158015bac7e6a7f15c82d0a94dbb5361a33dab8c7d34f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004816b8f6f599ee7946ae5688cc70179716df457c0ccb81ce97cc60fdbdb7f829b1711c51a99d225630bd8b02dfcf34c3fc3757b50da46bce660641fbb4153b6917462c940d68330f95570386d4f038725662e7c9444a90f06632683ad7c184e6c4217a95c773994de565e0dd77d28b623b58a88a587be69f7c382e662646ac73021f552e1b93420c0368ac58af5a51893c68a0d4a430e0dc65fb6b2027b69f34b903163ca5417dd836d2b2fd6b11bf2233f4b4198a132727ce74b0527ef829e7d2e80b0166afdfc9027b80a5f60ef8812634d76bc58e0bfb362b662847c1315068ffe110163e8d9b22e2ae52694030b027494c265ef62f34d5190d851befd468773821022634d12c6900972a535768be192395d51350ec3ba75db072326a8ce124413bf10225c38ffa8a245c7e5b075ac5346eec7da0f7f38d42a47fcedb7ef29f8ddabc4e0201efda6dda9a47be254d4284d9dfd230fa4041f5dbe925f67824df37ef2adb13032b3317f5110a5f22870b72f6d65aae374514e3f0672b453c826bb4c73933403c03240baeb9d16ae70a9a63e6f43c006491b24d291cd84dfdac6815f7218b0cc80357616b6905bccb8f03bd72d0e84e5482fd0a0016a21a779f37d7de65cadc243b30ccd0534ce0a31f48f6e50a4813bf3ed696d72df2359bcc872909362eb6a3d3f6064bc6cdb5fbdcce701d25be0c524d92e15f365ebcc0a28217236fb33faa24dd24e9db4c58ac9d0f654ce987d3d76aac390ee37373c04f69bd0c7901ae4e82f860f349b17e5ecc4070b5770b1bfcb03f6b387f2f1e623f81785e0675feaba2eca7865d7f994f77522f1286762ea82038c019901ec245d53e1a8c759462af2858ce0be9ccd5b689dc323b6967b9728cabcb660b135e8d17e4f3761966a75026a25c6548993e63a0ea6bb1119a6cf478cec704593815fbccd7065d83b1d1eadb5505419237c82da1201dcccf6d0bf1a2271f32db8925bcfd8476e4505d1c74da4dc700290a116b771d77189bfe45f55d56d39c039c59795f5007f17a4e60b5f0e00dec6124a23039764b60f7d0fedf7a70e48769ee127378eb3b5dfbc1ecb70b13e39650c22ffc4f44d2f51c08872e7e75fe62d0b3b428c6d9e99ee68f242c1ac794fa6df6a9399a721b62e35772f2f92a52542485a884b42759d27aa88162c19eed72bc8b2e7007d7429e4e831eadb96faf85336564b33ad5e04e07d9a4e7453116f0fbcc1a780901903475a3abc6c59ef33d7f7f966c3b39e6a3bd729a4255e315a424199f80713daa684df0ec97fa9f28c5275d90e981626a4af49b2f1e6bda731ca924d28ce98eb8548140279873ac75848f0ece6251f12656d74b20a1ccc4fc9d832f58c6b88958024cb0b31a4f259e2e40b3373706d3c45a8ad7f3f3d81873293956536c7f59a9883d2bb7575a48d690ac99ebc295c8316c7aa507d316dd1719230d1554f38ee1a6a90b3df95246b6652b7c6aa12e58e266cbbbf61308cdc09b5103fea416389e8f855eecf3ca1d054a268f8e8b37ef27999acd3619972d5ab1168f65bdeae7009f7851a958212c315a58785acd1f45177fcf65828e4d09a32bd911690da069a33481429927daa2105111d753fa245ccc1a99771c51a6cc8b23103d4887a6951169bdd0ce946a9dab256cfe3a1b727bd3b7a6e04352248b685ba2a6436b981305e2970c9184cbc36298772cc40a9a75f4440dc5de5d5d2a686c0702aeb205237b401b48d00475bc977fb16824448f654fa336e45b38d5dcd7c5b6e6a9b8f2871b42995efde1dd2103e1068f3519fffed441c07ae8b16ed8a0e1af6ed58cf08a766d64c71ac57d1b637a7d7226b482f3148e2889d920c7090e4d1d8efbd7c69ca97189f0cf7d89f9ca68f82dab05b6454cf7d1f797e3ebd99221c98a7fea046eb1a5152e1ae7ae0797b2522c5ebbb1b02a6b32533fab678d682094101eb67051758f5098de54a236d8402e85bc6039ae3fffff3b18ee21662aa58754b6b6e36b0639316eb2043de720f32dfb5537a8cb11b45c45ea7dfa64ad62faa57989bb62c10d4fb6b68f7de67552b23665c60f78229a81a0310149168a9943737c52e39b300837980a450c9106c819e31e7d827d046f8d4ebd63fbd56a5eea53e4c9b567e7dfc7a5724c8efc552b041eb7035b6fd3f74825f2952e04d457c668e31935d5483fa185c8b06f5d8eca4d74222eed74058c3a4cd7f694a4239396b5aa1949217b37f13cd60a60b6ad91cf17abfaa7c25eb984b9ea45d8ca1a8b16efa7376cc6bc19c0b3bb4e26f295303c0ed21776d88d0ecef0dbb9634d7a7b0eba0e7aca9114df55bf317d5538ef67a1375e57ebbe71325ddb70d9c7ecd2e405477d21bf089f63c3c7e4b09e67f8df361cd8196f72d80738149f723bcd86ccd0aecbddea713973686d07c543fd01", "6a53005252", 0, 1890921588, 0, "7e44b3c01f6087b30efb179bb3bd2464820c885cd33dd53fa6916d599e6f6fe8"], + ["e355081701eefb986e9c5f371b74380809d69a64f097a3eb02773fbb3809ee0894ce6ee0d201000000085252006aac520000ffffffff0243af27010000000002006529e4c8000000000004520063519ecd5eef00", "6a5365516300", 0, 1535195325, 1537743641, "a751134010fab2d732cea859817145e4c05b3447681302fd8abcf853a8f51ef3"], + ["5f553349037a9220911b90d97daa797b3787a9d411db0c1be552b40d4997f51b38ca82a3070200000005636a5252514c45d1d3728f027422b94814fedf55bea646c203bc48ca851de1247b4321e5604152a9e0020000000552650000acffffffffddcfc84651747f37b53285685ae5ec972e77dd38194afd3bdf5adb34676b41a5020000000852acac006a535251ffffffff01cc338f0300000000080063510053ac655100000000020000000000000000cef3ac0000000000a4e975ed1a2667538d3a5aefe6e8a7a05dd69df79ffb519bb777e1e66fd234c15a1f77a5a98becdf0ac40fcf3ef9cffba284298b10b7b1e50872c2578f5c725e4acd80242acf84c3dbbbeb05ee0def65d2f65b1a822a5575b1bccd27b0ee4e8d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000896a282a0fc98caca92c1a3aafb0cf6d43428d65376282e2b615cf05fb0bfb242ea9a40c6a525135b81ead5226729f6f7de4fa90efbdc1a1f10ebdd98ccf5de124a9266c6324c13de10770ca7041732cc609985bacb933d373b60c4dcca69e8bea3860cea8ebf80138622f473120cd4bc367acbebb193dd21f21421d3e587c86030fee404e9bbee2227fb7224fb9526e9d39b9aa1cdadd9666d0a781c99ecddb670219427fd173805ae905063c633378200c524752140e30515bb33c1f1f415cfea50a02c7524d20bae3ddff3fc38e3fce5bc8232fc2d114858588641cb35ac58da851404e85a5cae90d6ac78290031cb83133c141557c00031f543f69b7e3e735d754031b5fa80d7d5c1d42ac13181c688b0e784d0754abbd39d1173e2b007c7c749dec032c25b0687eada83b831f89d937ebc5fa0d3d7636bb1e519966022fd03d4c399002019b4105d87d6697ce224fe74721ae737576c7fcdbcd55a71d65775d17bff87b022d9cc4a923949bab631209a5303085f432468419ff57f002f01393e5f9ced335032e03866b25e27460c77e326590133e89beb3a12f29b921f3f2267591c2902d8df6b7acedf51fcfa1b6731dae6176fa928f982d9b55f83a80d30a2c92c2bdb889515e188b72cb5b9834b2b4564bfee515c9012d29af16443d562720ed355ef024e80984e7869afbf3c9a190ee5761ea66c706e087ff7dda7d1b3b426a46731f26c0a4eaac1d74f7ddf31eae55ff587572340c64a0be415a5db6566fc4ca9a9f53d6f732b7dd633a949fcaab5fb14f976ac874ee89837a0ec9eb66652aa65b0906b01d5f220ede79eea37e13079f8f586fedd0c33630c25eee5b1770d02803b04834490e9b7b4a4de50ae4f04feb71205b5432fb32ec95d9a4b47a9e6b0ca10257751d244100e925104f849d24ae4846823ee3f572e8aabb912aae0bd64fccf73b8802d4d98eb33cd4b7b4228b64807ca0d57da41d03adf38470fe5d47a2c694e1479e9d77c0a2f55aceefc37a6c04a70125c57896e9b544ee4d94dea655e3f7ce1f473b89fa3595e15a26613f2bdc3981367deff59ff36a17b92b9f13ae9d07b352d463336c8023c0536b0e2fb11157c81d798f216d5fd750a6301646c7f39f282ce2f14902ad0b7df259f261666085cb9519dc5f2c8f826daf268d009bcb460fdfac8f969eee01491d5786022f73d05213b4aeba4a912afb99d467d8be631e5d4d28d25357358d3360a39818f8b153a33b464ff50ac8874e0b8bd8882893811862b1dd1ebeae0ff7b5b75292b66bbf65d528c9b122c5289395c1cbe10d16d2c4316543df3be8e886505718aef206e6e836dd658ce4d16b89dc190db699d12ea6da2d045f4866af33937377abd60cf1b1b3add394f011ee775b568d6f16ca9d18b3e6cda5caa594318335ee7bc3107aa337ad5a0aaf22d5320a607c66f7af2ee332bb916dc465f2e49d9f9a06ba50fc72572652f385d9c7b61f4ae6faa364cb34359275516765d791fbdcd952599cdad4784078fa9da616e108b90429dde3e11c331899db319fcf75f9417420d78e7b3e8dddabec29efa9b6343d2a8649dfdc26f1658803b28e254a5482f4ecfc813f0f281b92dc97a60694ea48b35ccb98c5e4122e86e2caf775dbf616bb9ab1fb417936d8898b71d468a2e64947c096114828886591206bec92b4840f6e62bfae44b7aa11311b6f50619a39c7aad05658d0bd22e7f04e3d36521e7f5ec42b618566288e4436ba5c3936136b876b107deb4593dbf4992eac731e385416d33a70f49851f28fb6908b904a37930a9296f55d192b2dbdc5780f782f73e731f14842a226c549d14bcd9333a32c2c6ac044b58ef771fe04d5a79c220b93350980a1e00051751d1b1b2101e6e4543450b124666c83fd5ebf641a6396a43a5507a7435a15be78122f69e44813a9fd307b954027c51ae1cf1c3bf4746d7ec7405bb7e0e0ffeac1a8652d0771c22f07700b190b3485828cea64bb2fea8969029fbca12549831485466c821e5c2d11a30fcd98890496b14400559777c2594220bc73531122cace4c9a1108fdc0b3abf79bdb700b29136da923e959ec4908264cbdc83c5bbfcc29a3526665eb8585919718d7e2c576659c33f7c041cc94d5038c696f428736c62a5a43064531ea5b7d1859a29989e352c2deaec9412973eb3c38c53097a0fbb79511bf7e5535b067592c1dc36493f4c933c374eb8574931569d8939ad490601c9a3297ec556e1606759278690b95ca3560e44088d69458081693d6ee8a782075d662ae950000000000000000e0e28e03000000004ed1f9d90ec1aea9691d06d8a150e78fcf4966d4f1676914f1c1e912a9f94ff27c4d63385372e12b9388f63a1ac3106b79bb81ad050f08e9a7e0051ea84df826d837ab16b210bff7e6585c798949bc163199976d254c00df3c2511e763cbd54100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b6e6a04ebea5e2f93f659d03d8a82d709736e1027c9fcc650e815da43ab88c71e8cc511d641e10ef77175fee4c3c7733c81805c876f75ba9f3bc190b6a2901348eb7f7594e4301e12d77502ca7889eb3426f027dd4c56e71a9ed05c071f7d1637f8f89d9e5e46a602de0614632971d3d0748133dc5f1a50e514260f94f2732e20212058cd1da6b8c27bc06f48354bc5ded0dc3a51755db916bb07d1adc7b213e9b032a3d510665be7550e7781b3c29775dcb3976d77d4dc20ee0a8d7dc3ec55d5cf00b0833c6a2ec070eb2db3a566092bfe4791c47cd7606b16a986d82f5038438fd3208ae32e871dd259b9195560f7c5aa09c6de668ba78283dd55c83fe2650cdf7dc031b55577c7eabb3e09a8d472e1891d1c10c6ee4349593297bbfe09164cefe90800218a4ef583f08f274565026e134d70a1a08fc6262eb17e8b3490c3bec1b43ea86030ab38b76cd57461ca63c5f88b2c961dfc4f636c1b69f83fbab2a5df03440e906031c2b454fa80bc10a15d94bca585dce14ac260ee0c05d16e7556c5ee9d0d06ec702129c77867d51d7d866bba69b8ff113abd873fc2eae0f547bddc5852f4bc9cd22a7af2baff325bedce2a49628ddc76a7488d2e1d43669c5eba452f6b0a9d5a6f8f0698bb2c77f6fae1f9a48266fbb0e0ccb5df62b7357926cad4250c71869d29d504358bd3ebbc5439793268337ef61e4d66892d6b4accb987b690dc09ebb9053a9bffc1c238fb45df4ca4a97c12ec3dc302d87fe8b02ea17bf0e6063756ce0b422965f8db7765acdff62a788313179025cd74a8e29787309f7f5b8976b9e26f23660a2a78fe89546d5bbdcc2ed03c526e23d460d6d52cec96ee02f33f61a942262143b6bec63faf137c346ce4941620637ab5a4177f9523aea33768f475c18fa1f306b3b924cec6ec339f399f0c5f1a962bb395db6a54058e59ff115f5ce1c38b3b31a41fae98ebfb0c742ca78f958e9190002a105fde37c7026b6f35f57f6b5c4ad2e650e6085a0ddb8fa551231c4d66aac235331e0b0a0f686b2f0ff3a841e9b7351871fe48275b901bea31294334d4753ac66510265a42e44cedd5fc941299483e0d77b874c23ed6c802f4e15a88ae1b56f3f2b6901e3ed1a7f4809ca526db3fd93a19bb51c7d7533a187cb3c1c2fb94744f2e56569e6b79634c48880da50e8718209af856403efa6a74696ac0dfd3030386257a30eb9ce67ae7a702f896fea4613dc4fbd34983ed17c918bf12c8f3389ec0e7baa36d40f631aa127ff2f34c1a17174a964125907ed4e6f58f43b8e24979ac50a052af67b5c5701156365f7e14a25351c90496f87c886d0646d67791de47f6a3ab9a4af72f74a45572348bbc34cefeba96904c6b7e8b03780222e4f4cf4898ac7d6a053ff84906c50071f1c0dfb6ca5641f0815c20d35afc22505836b6b02d6bc188c587c7755e3b31183bbabf707d1f68f968bf1c311c51b59381be485eaf81fe0bd2c9ef6e015bb4e76ead089d73b55968cef3ccaf939c75cb3a983452333332bf90d18cdc885b9196d94cef6d06252d9459a2cffab4818433a67fbfa740eeac21f15212c5b2adbd041f96711aee8a01f6ee894808443c43cf368d10d70e8cf4121bc11be13ffaf381c254157f358bbbac5243512287dd5bbdf8ef053caf9f69d4d99db8839a57883cd3b5265499b05d1f0198479d2fd5d8245c3033c44e0127c88ba8722e28423be63e07244acd3c5421a58684d57a8883e089228abf5e70e8a2183fed9b75c4b54eedb40517d479661db15ae361b617ee2df097f55b8ce0e2e7a5b9e5ee5c218f7e17a24bfff38ad8d575798162d906bc0ada32e56ed22b99bbbf446ddf4bfb3c83e865c6604b0614fecb00f97307f9a0ac0881e37cbfecd396e1dc186d65cfb15f520188aa401033e23cf4c86bcd21afc0455c324f690aa0fcbd9f844304f663cf019775b5b05de68f2543f91b313f6475faee888b3c97858ec9c338422f51e9ca7a3d18268f377a01072077c0fcf6dc70953f09135dc1dba0e210989e9c89a5a3e94d0cf8e74bab1a71ae25add885b377e90cf3543f1b612f3881ed32fca5b2d99a6b6dfbb46276d1ee857a0a83a9700b23882061146a5958c4a8aa29eeb237691ef185479bed6013252aacdb32591d312189a57b9df5555d0252101c208145198e24f5dc9416baced220ccd10c0036e0964cbdf9a2b2d4cf9869130e470193acc0049e58aa957233553a8d0e84eb70334b654e078a9773668a95ed3b6fc4d31bb5af2b7192f9fdab770c7e15c1dedfe838579df8d568edebbc4261f7671d170e78470394aea40196d51d5efd5043aa3b5e1cf9ed4e61588f267514b58748936b2195aabaa7544d7d0ae63a6d7aaa88f35f0ca8c8f71018dce93af6c6474069ba6d6488d7b629a1f33a0c86267f7f68d2e90e409", "65ac53656a005351", 2, 1504723169, 0, "9df43f7e8e22f3d969f7237a8055b29018e42a8a0a9cf8c9d443a9a9d4360b8a"], + ["030000807082c403049a69a1eaac22bc1a94c392d0af9533612015d81663efd277e53a4f8ad10cd21c03000000090065635200530053acffffffffa5b072bebea55984e573d85494b60923ec07eb8b14bcfb1a9ba2559e1e4e29a9010000000400536551f789f8c620942bb006af5ab29200698047937928adb08b3a76adc12bc25d504c306f179400000000016380620b643a3383c6a747e78b9d7aa5a4d9b058cc7cd59d625f3ab1cdc501efc732ae57e20100000007525263530051639671d8a902371b8a030000000000cca805020000000007635251636a63650000000005b6534500", "5165005153006353", 0, 447425695, 0, "0cce7c743238c2c9d98db252b1f1c4259839d04428ed01d15448d37986898a56"], + ["030000807082c403049c0037174806b92cfd2dfea8ca7b117413eac6d48e6c8f79e25dde592f3feb5d02000000046a51ac00db39331c7443fbb76418fe33b8530e8ad80a375bdab8f0a73ace73a210efa47a7ded17f7030000000453acac65ffffffff3fc4d78a47e4e4e23e9e49a1fee6fa6bba3ec110550dec4061972a485d8dbb89030000000465ac0000ffffffffa097422d0895b9bf2d217e484aa2960f28aeb9c468cd7ced9ff2fbfa7e29d5e60300000000ffffffff0101450d0300000000000000000013495c010316ecb9000000000000000000000000002adf1ed6187f6453b43c7c0c70a85a4ebd935a582c89f63a11ceb14dd89eaa9f87332cf539cde006f1d16ff53e3912f7424f7422d947c9af90ebe03759dd33dfdc992c7eb3d780421b4ba27a5d7116adebb3ee2f305327036e58e93ffcee215400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000187c97fffe101db629ac06ee105e0508a656e29a1bbd479e6b87cf7eae81bc78089668b748845e77715668b98d549f2d6a200193aa24f10895edc02dc46006172c0dfe64f569311a80fe2dc5a4cd779b7cd1309446686af59ba009b07f2982d638438702bd84476c9889893a914da00a0b5bc775d886e3b540ce668b2b3ecc560213f3b5455ee3b11ad4c2fdacd97c7b7de934c189eae24ef9f56a46069a96242e021ce5ef2835495b62e25ce3ff9ebf8903c4bf1c806699239ba131c873b482df560b00c9b3334efc9ce5b8ca80d282154d36884024cf63840284709b7e1e9108d32e84e8b09de1934e2070234b6f21912ca1d7a9d11119ee8176f84edbe5732edffe0205e76f22c336b12d42ad25fec1a8404a3f1e8d56c3e4b65ec640a948f6189a4802157282e31578eda44c86bc9dd11721e084bd4841a4d99d82ccd5536f07f0dd9f0313d9c207c39386604c30f2235437cd567242d5c76409e235f93b3cdc3d5eea06032b5391c103f0657224ac3760836790bec6de9a38aaa268e518f6f6b1e1aafe2a0307898c9b865f25728a754caef3ef73fd8bd10747c36974a15048158f3550ac6ffd89edc4893a52586e43cf564d148d258cbf00901b0420e2a5bb64db0ccdfb8afa4faa0d7748800c0a7a262bc36b5fcf9a6a97e237112ec0dc58269423686d2ba1b372711eeac4097dcc5968af7f5b37e07adfec77eb289b5fd440ec0e7c226d3b9237760dcc9865a7a70f2913ac9d2e411fa2b21bc4490405184896c477b3d5bfdcd8c78a3e221397d0752672df64854061ed98a44032aab22bf6bf5744668641329683508445635c18da22d1d824b6682ddd9c206633b16bcb3f3c2c44951226b43ae1bb9307e465851519688e0218ed78c5e390cc49dba7ef88c33d89f5b8b65636b07137a2a7c3dc0dcc990ab1c956d58c9375176433ce581a9b20992b782e7f8f157ca0e62b12b6ce95f14c4e0be3149b9a47a7c11a2b4b66f8f97c9ce2fe5d670f2b087b676d43c3c1e7d0113d745d177038a4a3262bbe9df110939d662f169467e894fc18a364bce66d84d81b0e6301ea1f20cd5f787c275158ff41c89147893ded8be240f999e74493fd5dc3b2759183e57b749bf9cb42232b8be9b8323c62d47f8b99ef88770c4323ec1b3de57d16679ec73eb364d50a8919b4ebb72c2b1c0318b8401366943ce4a8ba9cb302590820b67941741bc4781c05113b5235c49b2fa7aefc8b21b0ca30224e25724fe59d1de51e6905b1fa0943c176b5285dc8fbd36db616cac659afa88d505a524c44808b69ab04e2f38fd761e95ddf58318d3dbce1186bbda9eb87c7317c7ea7e00a22d86a9944657fe3322ecdb6dc048958bdb4bf36f612c5fdc25c65c451ef576b62ba9857af16c58ced6f9b391cb1a3d95322b5bf72c5c68dd13e770f2866bcac747453ab0c33bfe304946b146c26f6c1b0d20f00db8e5af0e6ef2212982d188685a4e346abcdc66ceed109a58f9e5f40696286fe529ae09fd05b2df832789476c6b5fbcf8890b9f8d7caa00c626d3d3dbd4064788b1670caff9d31068384d7efdf3fd4fd7197ae4781a6ade4c8965fac11b8528f2213aab72e2d596572017c42c14af83a55fac85806c8f3fe9990ab55700c88e003daecc772c3a76859147c6d25aea84b1dd6d5366f044c95b9db1946d270b5605ad8d89c9ab190e187290adcb4d0fe200a1fa3a9bf8f2c0f40e1a29ab359a0d8c7eab300761ce64e2df051411ed7e19beb6e60d05f7919f6bc5d876c073b8fa3944fff2f86771527d18c09068d8acb281769ded8121858b79fafafe5b3e47df1214b8fa442e5b12da6b97e0c59c84c7a9d7932cdd85e0fab63aec9627664119a68d6259c304a6abaa81dd5bf882e890ac01ce9dee8cdd3ef946b0fde7dbcada7cf63cf0a50fdb409393d3ddc652b5575b8ce71826cd916327d5be7208d1c7f8aaff8540b7e6687a37ef4891843c55d4b12db669ee548105125b24815071a246a48624c2cf4eb32c48647861cf5cbfc92fd07942cba48974c1ea8235045469d39adb9cf970620c0fe76fbe5e0253a72975f0187d2e001b6b92632a342749d51bed85e02291f710560ef05b30eefbb5e084e2464d4fe292147471a1d25c11c5c0df1e544c10db4d944002a6afbba7576ac4bff75b9dc6038dc5b88c6d20f55ed8754b22c47078d307cd417ffa32f080db43131de18b75d5231dd48a117d0a0de3d7840cc5bd13fa2c23e9aa88911c1c367e53011a281074a899e85cdd87575590e8a50afc4173a594304e32c1257a6a504000000000000000000000000b1a12e3d8e210f41a24f3ca11976d57e9a904a4118c45e937d82ee7181e4840fdbfffb0a75dc9a7f8858e0a95fb2517de17496542e4478c2ba67f006a76d5aca83c1f14fdf7beefa49968b61070a67286aaa24974679d250972fda878eca725a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c95d442760828e54c6e7fdb96677e584e1e119c6fa9468e4684e6492c7bb9a9b590d7ca38d543ac28220e66be6bd655b70ca6625dbb95cb707c5f1fff488faf7a62cdf62de3447bc89cb4fa1980649c82fbc4bc1dbdf15e2c8a87849fae98c6075925b7fc87fa300de6f9d8e14a9f8c72122c8661c30f76e8ef19b7206b538a0327f6576785edf08c451ac78ec311e206978ac6aca0ae0e1abbae8e9cf61cdc6d031debe0eb1379573989460c741b119e88af7cf059a5b03baa6170ba716ea9e8ed0a089b47410e62a8f36ba7fe47d2f1274cf96ea11ee3a551ac94eb5b061b69c7a3f3b3be14426025e1da6daecc162e6e3431eee55a1aec0312842c2e24a8e3f723031d8d64760e3a94ab9e121d369cbd6a7bd1314e2bf0a5edad7ea570c85fb6aaac0314853e1e4b74ad301ab79c5f6fadee61b01e625244d442e0bd50e5b6c577df04030b8098d0af83b166797b26e3a02733b8137785fe34536c16d0742a7da9026e0c0224a0b38e4e05a672349a1689a888e878eba3b5e04fbe8bd0223de8b68fd1213b021d8a8f7f90fa9e4e13f038d2dc34d8892c33d97cce858811d2db8428dc29d9bff532e56b139e104033db66c5bf4e4fe8e980cacf9c70463edee4dfd0aa19cf9b9fb0f1ee1497a8b1a9cd49759f093d20dbbdd8cee7c964a1cb5050b69dbcce9d258d3948f42ae785c91be7ae5392ff10257dea34b9d49f101179d6ce90a27dc7138da419400faa07b4dd8caf43de715c8b9f60672e9ef8617e23c8522af96fd241c1ed824b4268b61076996d872706498a8abde90f211341ab21728d53ec805534cec88c2d8fb50d9e07f7b495d33ee3a3fd8ca676cd49acba6d327c86365e779f7e342ae19c1d50320a828b2963bfc982a988b533923187b7675bca0c3f3a5156906635aa74d593d4c15c25424981db85616e7599d90756062e9a3edae33095a1d0c99f30c439cadc70d2ebe3cccfd97bed51f304c5e6304af2e8fa4a8e448654e1174960115094d15bbf0acc5274427e763b5362b66af2b13e992c52b2c78fdd3573a0d4efdd9d0b91885cc3fca3809b4b6e40865f2d2494734924f38ff0e5cd3a3201c1257ecb8b39fab2647335df2bef13f619d9e9931d4a99dd692ace21216763acbf0774358c871647ca598588b37b469669be353a4afa9b78c86e697f3b68fbd9ec443ea0a6babb13e23f43d0016de577329c1726caaa2657023c502913e421aad5c39f19065a6cc8f5a32425ed099357ee125dd87b70ab65d3b6a858ff0fa015f968486e49b9ae5ea22949fea8f8d65226e633f5a71c312b1b8d364daeb806071f2af345b82787b1dc7fae53c7553870b72cf18e24b90ea3f77415819732c41ef66472997477a44fc89c74ee54bc8b03b17362e7eacf77ad22f71e8984631c1b8cfd7168e56465c5099e5a7f43f6738fe9e2fa15c4b93f435072c53528ab255c44b29be1c40317173d027b0a2323f640f7b63247f9c4494d474531d7769b74811212a21c6d211cda2060b744741f45294aceb32d2bd563f5fd8a78ae5fbb3a543fda3c7dc86f622943751d9c4e30b83640f25f6c53a83a1ddedd228658c30b7c149dd059b5008b441967156a342255b699e46a73a9ac02e77dbdc951609b43e83f2c0ef5e11d84c2c982a977fd342bc07d2b7b14ed193bb5a13745c21a933dcb4a34d4e77adfd4833b6f2a111a3e201296d79d0aba2a5f9528661814fb0f6de7fed12494fca36315104b7dc5f0de2be0645cf71a84b958c3300cc26b4a5b76ba63d5a863b139525354d0fb5640c976c6b49a9c75ec93081aaf63d4da2a5e62c1698df6a6605592831cb6735c47411d33c3e7c6db13bbe21dc39d0882e7124f1bea9d6c2535d0011d42aba16e0415cb5c452880d58ae5791a61d52928ded062a84aab9b1ad2cc62307ccf866ba76d09536bc8804dc043478e860f920ac300cd844b6dae576f4b56ef2ae59527013d0648b9325ef6c7cd497043f0a5eab6ad07bcf2746086cb4cfe01d53478b58c716ddd9afb0a9b4401f3bcf65e387c47bc5e12189d754ca226860680f278ec1176f61495a6e37cf7820e8595d0876f9fa957f16b158345ef8ab5e0a64ad2982bfff3733848a6b31fbb830f9b55bc8cd2c66f0745f0c77b5c905e9d5984d938d5f300abad59c265654d2ed30a84e3bf15ff102bd1b979207ac6d85c45ce8e05a1cf170531175288842b46d01cba853a701d3425e0cb4933dac9b8ddced61c5b1f7aa89acd3a822951e66f6bc9e268dabcd2984fe30d51f69fc9b8e584ed2a38eba30000000000000000b7544104000000004daf62f4e875c34c76761ae013ec727b84d0737445f5ba02de460fb61b539036cfae2253b44f9c8df09dcbaca65c76b3c89e8f0aef17863a4ec4b6c567bef5ecc429846bde72de3d65d6b88e8b6c8948dd47de49916bdddf23cadae74cae32e300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000141294a1697a0ea79bc806500f9a352c6f791992c5706a9987f9fad468dcf08d9739c1bf750c6af86bfc0cc38839297b8266c7d551fe6ba3a9c1493c2a8be721f73ea5b94e3602782c9e202bf4062ec4376cd75a6e91cdbd6fbbb43d030998530434d422d76a7e672ef3f2aa020c054d113fe78a36a264ccc1e6754a0207dcda0311ac1d0a2cc685ae8950b91025896756e391a3dcba21aba1fcee4092baeb1c5a0303e82065f7d8c63f4598b2d9ce44967ecfbc206e777a7677c49daaa8567f3a7b0a0910766f418147562d5c241382c23abf8a8a046e165d012d88feee80073dc3aeb9ad9920315636152f3be418901eb624fbaef0f83215ea83f0cf1ea6703bac0c020d7a3e373873e29fdf0020e3bd4716977a487c4ed40b1ecc3d115bcb402292ef022388ec547caa786a164664329eeecafb467a5b39857c143ea947b4f1fa0e49d2030ed41488736e798e35b8984862cd7a494ee260da60a4c2631fe0e8282e09ccb00214304252256bc88cf09271f87f8d2dffc87238514907165fab307d6efa51d4940225cab71e9659feb4623d32e7484bec20d070bbae6f64276a43b5c40b31051838f292add8546514977fc70be5bb3d15441dd7e466f9258b746b0b460abe3e9bf5fb96911ad03d4ec733daa654a847c6840167bdb9ba3a59b3f5ac1edfbfe23f93b712486454c904ed4d858437b1eff2e5412533cbdd3d521753ef4ec15b2e60cd62436ee6c55d420481f4f51f715ccb0f350b41b24af3e01b2639cba84e3d6925ffc61616ac3cfc4e034b02e3ef17fc5d74baadfb971365cd6893580b2c2cf306e2229084ea4b6923b7e35e2bff021f4411f1251820e90823ed7f05f93772d2c24d3649259245227126a8a72aa411fff3c6dc66dc8613609e1421dbd6e068746509a58e48221a34dc852b090f854ed4ba3edd2d50641f41be4ad8e2bbd29e93a9dc3e17375bd8e8bf77a5b2a58037cd8250cd4a6ce73a12ee6fd98a85fec232c50f23a8e2abeb4be71f77b173da871fc921fce59649fc89ab3e3181d6898bc69de2b1960d0810cd0043cf610a9f3bb0b724ebcc57c7645341aee8fb2b77202b119fc5555bbccba06ac6d20d15edb7cbf90de6993ee5c2b51f1541fdad5299e1ecb1b4628822df08e16b5c8aefdeb13ca5c3b284ceca10ba8591b6c0c759efcbba3c149fdb32043b5ccdaecb0b44f0a976b0db56813c54f9094e21bf0186993523706facd70efb8b848a2f70cfc33ca29bb54575e3d7dca16a436115b86b6264af78418ea698183db96eb343670a460eb8e6708c41787872b4bf662e643e467ebb15f12ce04b95b29805fe413ad3c80b307219b0a5838d0ebbd3044fec6932836505a7fc39dbbe990e363417f528751cd824523389bce6bb7019c76c3ea20da3aa0ce43086361226da772828b96033a90d70710136929d9c9442fc4c9baaf16b7af2988111abb3b42bab5be66d7045f5c962ce6072a7890b99cc40ac0e665f687eb5ab8da15b45d4eeda6003412efe13ec8691ff3885d7bf44a5bafb8409a8d0f71364b67fe10a1f2fd9a174df773761b2420673399f2d8f69757583d23b31d64fc2ed927a5611afe9e7a5afbb5722fd99fbed18024625008558f41d5b3666e9d3b26ec86f5a8cd9cfbeda2e2a1133c63db9e69a6e5bccbf964b40f6c12384f66aa264428ee355b3928b7d69beacca96bd361449612a4e9bd85e69049d2655477118e11756830182318ab98f598fb930031815756c5037f73d37656c9323b97c584ead1e6d3bbfcb8903e64dc411f2e3eb7eb7293989ddcc2e2723268d62c32fc8c97527912fe8a410aae9149914e3f48b745333a07808d108f8a1a7581e7ffa498a29c77d7c75bdbd393e6c79c8edfb183033afdbcfd1864f16b42385f6457fd8ecb9c5c86a8fd138809800e1cb185c451e99ef0d4068920541225ea85d518bcc477f113f7b06aa6bb82c813cd518fd889e300473d7d5eaa800786c92909fae16d4ad832af022602b3e9c6200da889c6d4ddd27fabe5d9a3bc056ef008fdf7b919f5312f72f8d8906dd2ce30cf55ea01091ecfb919ec1ac6a636fc75e754813a4db05f90e70939b2b85d474faf99020747fd76f8c7089a5ec89b79a4c103c1d6aa7d22eb60a38cee9b22a6b76091c8ad0b51f517407865f78f9a26d81bfb6f000785248dca8f388846336fa9bdc92fc5208fb449d71633b9f7b796cd5e42f7e12fb444a7083a9650d0dc80aece36f426f99b366bd59d2f71144ef5ff90983465460cb055cfc9e93edfe86c9235fdc1fda901690fda733473e982a260573fb3551b00bb64e883cdb255b29ef5730301c918daae8fe6d7c2aa6bb8f65d62503b7bc63181957bffad54520bbda3543749956b5159f6f701695b0cf89a92d993936352056864577135ef7d3beb976296da22c8a0f", "525252", 3, 1327450234, 0, "aae29618ab79cced8ef5ea1d3cece2d9929fc785ae40b6a180718da9f8e6910d"], + ["030000807082c4030313563d567dc428474cc4573d5bdc469f471fc852041ed26431708266764fad1e01000000015190d3938115e8b929bfed012cb9a0f12e736a19798c7c2e3d094701f94bfb26b48117f84e0200000000ffffffff2edfd5d9a6ed5a3b342bbabdb97afe591d631d83fba1a1b5c4fdec81fa8f7c8c030000000100da7e70d202c75e1200000000000600ac00005300c509e70400000000090051005263ac5363ac000000006c73c09f010000000000000000dfb8d20000000000aa3109a2ae0e9990db0ebc9372a8bc00675cc5b5ab8bb980cdc12caba58b55f30d0f92c8c7efb57080af134df7ddfe9e0ee76317c54c749587fa0ea287dca090314676757d0bca5bcff25fe2c954ad02d3d2b835cd7c9fa2c363127ec99a624e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008712b37312f94c93871c1cda196490e9f82d642bc639766a7b965b8560c287eeaf9020b80790a23762f1cbf0c05610349884f1da8171aea7c696e80bce35ea9f56c53ba8a3f79fa462dce8b70bebfe31ec29818e7cff42f7e057a6227eee8f485df4d29b81e115e118cd4ba63b3e9be2d30338bd59663cef6a146de6d8f642fe030bb4d8bd4db5c69ad96235d45073cd026bbae40b0300e0b59c3608a83dfafa6a030e72dc28a231eb1846e83a1db554777032cad758516f604c6e7ea7579d6bf26e0a0214e559c96b2bddcd8aca1e028b36ef0e7647dded52067cc6b25ae4cf83c41550ed71a9b09605fce6f6c270b9dd603c6171ca708ca814357e6d098766b9bb28030a9408efee7630b0f439821ca5611e90a41c1aef2bbac4371a080656de8e18fd0304511a817322aec59ce28426258c21c28677561c563a7e8e11ae97f00c39093c0227bae9a774fa5c82edbe22b8d000b516d0fad26030a19b237f81e6487a07b54d0202e765038655a080338bdd946ac0dde64097e69bce645d2d15522062772fcde10216505b847db39795bced52ee21ea803ccf6fa60d7fb2e749b6c99f66ca45f660a501fb5c6d99d0d71dc5493d8096cce71ecf3d86e0edc83f53da977e1d8712a68fde0cb79e0aef8106f30d83a9cfe313e23dfd072ccbc4f55c92ceb4721e7a62266cb55783cf4ca50d2913808700bb74eac7e4a9dd58324693cc0d54011854223341c20b6d85e64bc724629b16dd0d19e96cb67527a684e036a5f7fd65c96b0df1dcf5676c9f2010e5bc260de045fdd804084e4810e1f5b1bf5273fe33f132528f27355ef41d5c88f512b546f9e2c77da879b371636a41e0d211b9fa5c22a99c81c8a99567bb221c645b447f2a93efb987732bb626b0cc43ce0c85cc1ba779d91ed0eb67769d4278bcc9984150e74d854ebcbe461386a66da7138548114260c6a24b0db26bb1a650dd2b53b1a912dcbb30b18f18a1b02984c90dd314e10bed7411d6e2dc38070ecff44048fe0f3b2766edfeb65dd609e62fcad9a900d3547f0a956ccaa098947b08142c452b9e72b100906425e32bad478c3c50ba5d9ac555cf6a003e01b105003023fac70fc02cbe484647ef31590216bd6ec7ef28c309fceceee5c3963977323146149f3234eecde361c79d14d8b2739d155ad5eb0c17263631b011c6b942ef048876d3e7ad8b9432bd1a0c6d90f80a0354f57aa78fa15f8249d1b0132d8af8b2c931e518899025747f6e53f56ce8a6a7fbc814c8924a7b38841f6bef1247030280535e6a6826961f76b2a9e49fd05c257b04b5549b7c1c4519b2e1b76856b37b195ba417a988d22a021b18456be1cfad221031368af11ad6c1ebba6c2f7611455117c571f094bb8d6ae9f7b9b7501f673dfdf2763a3cb006946766bdb86767d5bbf02c0ea859bbf543425977fe35bcda7ff9d45d13608ab341e139d43b9038440ae249e677640ea5ebda8fa660474931ec07b480bc0219565081d6a91b41880b130923d9b0c48d668d613d8c38d62a5b4c28e2d49a03761fe0d8841ae7f5949030df338338d75e48c3d8f9d7ccc42642f66076b5a741122b61aa1b20fd8d1b696590ea40421adb631843892a443d8fc432fad00b9e65302c47caf69c096b9d81f93658db016f6daa0e2a74f01bacbd944eb2ff67ae1f198556ea09bde5f6af04d104e8622c97dd7c0173408f7d94e63e060311eca6537135d2d456c98fec0ac90bb0ecbcac2b7bb0a80734fb82d362b7713fe8b743e5cf550ca3d3712ca28e5fb5f273073dc67d55291d729ff62558bef65c932fb58db686f02485b443200d6d6e2b0c3eceda6009bf92a774290e6f70e7244cec48c78a3c9a0ba69fcb21060e37648f60591782a3a452b77096183dfe9b202cb547eab885b2b31d5a739d0cf6e54fe71b0de3c9054fde1104f8bb1223df57644dc85c767671963729b579fc9e6d591298c26df758f8c009368ee9b16fec4ab71d6368c109d19b2efefb0121ea4eea97be39dfae5914a9429f7c6dfa188523a737583a33c85d91c42040dd1dc0e3cae775a3b9b85e13ed65747666523aaf78ecfe7d69f5a7556ed11ba23be6982d5d1bc58a5aadf1095ae2cff2d3573ddd0ffb0cb043bd58fab87ff0e112936d3f710dd769a0fdebe74fa8e3c7c6d31376655bc72a2daba17ca94ddcea6babf4c4b1e3c2138d4535cc1a45f174870a01b253495ab86ff82eea6578f6a3fce36517a39e68e03acc263c8bced20e4501b8cbb4343e0b996ca01d6720a9db655e424a2539ee521749a04e6d35893fe769dec10f19c91c02406b5c40e78a69da5e402e0b009485f89c59b092cad27dd036b264d48eab47828ed2e9532f1baf6f1802ed550cf4056bc304b5c9e2cf80293e9bdd36c6b0cae5695bb724ab28ec6b8734c1c9a2c189cb6e25da0b", "ac656551", 1, -1180502046, 0, "5db3f2065b522ce97ac4f83b4ce825034d77a3f0587a742f98dc3401b610d237"], + ["030000807082c40302e7298875be1a830d27656070e045ce9ef526c838ff456de8944fe6b88d00b144030000000953530052656363536affffffffae6141e030915b95b03113dda7f4bc904bf63d0df8eb11526fc85488ded01d93000000000165ffffffff0383614f000000000003635152707e720400000000026300d195540100000000026a0000a0fc65000000000100000000000000007e88d203000000008967469374b61751dc159afb25dc81218566818a2b78becf3fcd43849587c9772d5fa09f36f83d4e761e17bb49f52a6a7f1f9847f18307ce384e7ad64172ae9c6035448c1adb21b096d78b655ae1ab35f2f01d177986b07704bc345b9b8030e800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e78e71512c2b59f450c710a19b7d543e70ccf6e5a16347dd9baf30ee740c26803a60578fa03b753c4faf232aefb87fbb2cf178ccdd7af2644bd5ad9f372047394bcfd2950d1397a1bf4722832d46880ce227e457041c6cb8b5c0267573d8812d7130dd1ad0c3bde03e0b2ac924f831c020e2dc1ef5147fd921e50459c67f6094030d1367f373ec94e2bfe4d63d257cf9e309afa9ca78a8813cb333a5e487e3a10403148ec8e37b6e4dd28051fbfd80bbc10f63a5c18157843bcc4087153ff20813e40a01b63f8a2e8531807d2eb57ffa7a54d7d71632870325d149a3c89068571549801905c74f75567f73f4c276caee0612e1d43e570be60fd08afce6d6f35dc9beb20217ae1b797f71ab8fdb069085e22198ab402a636dba289dd496568e3275a1009e03057908a31d14cc13d9b49679a638fb70f1328b15a9e78af46650f49995f2ffc1020e198717e795ab018f0a1b477a4b94675fecbdb80a6ad700d6214817dd8189fa032f4bda07da8ec7c36fc627ed9aafb1404f22945f74cc460606914659c79358a6021219f92eda9711910533de25834cb15c4d026499b31ecaba3d77ef3da654aec0a3e332847bbc28161a47f81d48cd2f10a0edc6ae6b7fbe197b532304ef2a03ac7ee86eeeca51b2e38906d3e5d3e0af188f02e83cec3f5d8cf585b404eb1abb696d4c3d2bbd17449388b7f568be10eb8ef632e5a66999b62a7650c6115dcc1c747966a86e332b887886bca4c9f9681029c3ca22b31c39afa083b2f586e55399bd0a10814cc7707bdd1f5da2b214b7486efe4602e0c0a5924beeba0e28b578f195539e7da27cf8a370544c7c1d5f6cda6724984cffa32c0f12d8dcf566316e61fdb28d324cc23a7669edbaa857b1bb319af06700f30b1a80de8889d15f9e2d47e21791075db8b58514782e5acf1008d52d8c0d0e5f02687590b1d27e23487a4e9fa4d581c0a4977efc17ac01e5265f934599b3f1c5ceec12ae23e8b6bc48e5a2a1764fc79f51fe87dc3dd0c89f705bbf59402a04b65bb506536f747a8669d44e60ed35b0698c0f3f96e618bf9703ae07e04d09e0f844979810a44978253107fae3b9b971563b15fc2af1947ebc10dd3742188f977a1a36cfee4f720aaa113fbbbc5fd08c8cc079b72a3b32b4ff273d1fc2ad24caf49b83115385f8698b7d69bca2e69230a617b4a17b9193afbe87b3fe233942caea25e9dddebaf701b8fcb3a5e92571ebd874899f4493484d07db0769815d30b62db8d61a8291f65db74ad89d6cea7a744a2140f236c36589ba4155120951ae5ca71f0ec55183f04e89f06a9ba09925794b75021f12a1245df54b3fe5bd6aa7d9b5972da44065c4f4c6aafc2751266018f9356d3d5a6fa48bf0dd40ab70b177aa6325e6234850b347795b1f9efd5b1e59722dc75d3ead50fce5b5cefb04e423d083bac168204e6f8d128d765a53c89e18a082b0e792e044a9dec72d4b4577fd94346e91892a8ef10fa48f0ade8f7057146be39ad1eb0213fe052b473a199b76e840c312837b197b142eebd6b6d4eda7841098fe54637cf4a871a3cc7b93dd27e1cb22833fe11bc9c4d7bccfd4b66faae1b043a7cfe79bbd350c6dfd5d67352dc086cf6a1a97dec9e84f81b1481b59367a17c25ccfe29a25d0f0b00d0ef23358f2001d37e151797143eacb5b375b93d8cde1b5c874085184cee5b29a6b5a5b987aea6a365ab43c171ae7cda89179221d38bff5ac18bacad1bf69ac05f5c3f7d93bcb6fabb254e436fcae7d4062a839c8378ded1d2e6c961cfdee003ac0798d8970d6203ecb38cca3328d140d54a4e6ba8f2b4d22e5f2bcf6f4072cf85d8636beca94fe4452bf8e87924a5d9276cea266c4739f72836a14b5b6e31a3e7eb9491e80547ba990107041a5307068a58304ff3e13379ad5f10df9440180dd5de4711a290ffe1c81124b44f8aa3fb24cab216f1fa506ee7d46bae17aad459a9a88e747f9acd324553d3e878804e94af1680d28c90f5bf42b8a63ffd615b427c9c131c195d7a965eb3a19d09bd16174f01b50d7764db283919bdc51ab5b6200cf95036bbc3a32d80a17bdab06d11391675be87b4322bda1ca530c7a559df985e60be841d03e6c71fa9c3665e42e332d1dfb9d717dda3bbc0f0d4eb653e667a827a2dfc4e870af7eaf7cd3e28e1f7afb2c2879445affa90f2839c0aadb3bfa3608e5c94a8ea70cbf43da40b98bbfeefc7dd90388ec69e81cf7d99bfbf25befae5fe2a1e4e640b567eff9b6f4a7992a4b6b733f73e27edcef57d4d94c38171ef842c9d52026418f7f52c69669c82f97d6d55499044906c92fcd806b1952de09a4b51606d10ee0041a3c175c5ea4f31c1d95bcfa247426d0f8a9a225decd5d5d10dd823304572989a4b1f1137c07dbfb61251751746d387451a82031623601a9430050a404", "536551635253535365", 1, 1364084365, 0, "8fd0dc44840b2b4c50f886ec9a25b1c334845a0eda85908b896124dea9d6a097"], + ["58fd6b1602a5dd117a872a24dad344d7473a348b03f67e51eafaf4d944e669e4e986a805f90000000005516a6a6a63ffffffffb0a5357f718ffcea3919dd4aa8a7b9af22eb45d86971cfaa40b3ffd72866c03c000000000752525300536a528abb575104d09e6704000000000452526a6a0f667e040000000006ac535253525321788702000000000953ac635153656a5100ad28be040000000000fede8ce600", "6a6553516aac5363ac", 1, -819439571, 0, "241b86ad733fe63511e956e4f2f515f3351d4b81b3e9e87bc59c7305cc662d67"], + ["40758331015c6866d80311d7a3691ed26f37910dc92d3157cec923e6247d85f53e785c447101000000016a96b0d4d90376cced050000000000289ac7030000000000ada7560000000000075252535151655127d72b7d00", "", 0, -93875733, 1537743641, "9caf02f36c0eac4e95dbff0f9def401fdc4f7fb663e73f5ee21e3103ea5c7799"], + ["4f40cc5d0329e0cfe4ab44bb51bb68736da005cdccb3fbe87d62286a09ba5a5015851653e50200000005656563ac63ffffffff11c8cf2d8202601d8105a47d95433bb376f0863b0828c2ec4032221a3a583b2402000000086553ac5263656365ffffffff92ac7ae4849bc2cf7c1fb621ead48dd8005f8545b13ab0ff17d3aedce19cc5b50200000002acacffffffff04b6a2d10400000000076a5151ac5163ac4d355b050000000007536a65ac53ac5270ab52050000000001acfc02e703000000000200650000000002000000000000000001835d020000000082e5ccf352ac15385bbe97f1efca7fe3a7a15e289d9eae7e04c2805afc30d82afed44a925bfa2f42dbcd7ba7df6f04c4684910be53edcbe116a4769b5f1caac3d70e30384ca481d228ca2bb55a13de8bec5c3539c95d83d3cecae83b7fc0d52c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000363067eb424d0b3669317c9189180d360520fe5d17fe0ad64d1a7c2f685e23f70cc209eb4fbaaac68b40256490d0ce3459f98678f2792185981eafb05ac257cd039ba7b4460400eab97875ddf0694f7bd1258062de12b0bb64a0a1b6f0da4ee27faeceae3b7e326789b368cf3bd6f2d6014cc44438de75a4d0ec49d85bf610b50315268610bebc7a1c9e122b83e6cf07def15d771fcfd783ac9d2b4deb8ba6f022031ae4f87acd8500e3780d11b9d47d65521e6840c3a9484e9dead618d330d35eef0b052248b4aafb96d2b5adc2c4834b7fa580c55ac31cbb97de1152fc5edb3a8ad7eb2a1e38d85e1f1479ef965c7a34803bb0cfe03e16ae6785c9eb28ffba7d76a4022caa3a5e2ce3469e6cbe7051bf84cc6e1da6b10ce7efe7adfc519f3a89a3c9af0203083b6aca32d44a691b66f154c81f278f57eefc3a6b9f7052532f09c0840b930324edd26a97c6d71d59a3f333054ec970f0de499d9ea69a27213554a3e981385d03212241f1ebe4c5e4b05779b56cc948d3140f1af4afbda6556c80b7d504dd3ee5032a26f3bb38286c62065c4579a4adac38a17b312630e9f5201051c75f031092e167b5adfece8132dd574cb4ca2ffa4088876f7070a25c4013795a57a1a2a2642a9343dcb5437820b9d1094fd71b33803e73691bb5bc7fdab7e38f18681c691b1ba0f0b1e1880f793305c28c1e9e79969b9f2057007bdb96d26583d0fe94c60fec5b21b95d8b58fd42192bd49d9423c3b69a530a8409844f26ad6db2cd638964b93ed387c618fed709ed46ad05fa2e87ce05dd73cf473203e131761dc5e177ad23b002c6bcf0e61894c85c174e8bcd1964f65b99a9c68dad4df8a79e0a754075e544c4bb4e23c7336d168c091896e1e0eb077d0495284adc118ae5aaf55a17e8e835c977cab3225802d7216ea4db74b5d6655403032f0daf83c62c96e05dcb6c2db0bb01c8d4f3817787d94ecb6156e45556a3e322c2799efa92a5901f448cf3db2335649ce88f9545993c17e77a932b47b393826ccc82cf5eceea64ab426f22bc8c1cbb4c414bd70db19728c2994fe42b442e846bd58a4ceca586d010f948a96319705811b56df8dd61db7ab4fc6004cd3c73557d3e290a7d6592f649fa46d9504a1183b7d034ff8c28649f0aa36431cdfadf18fd3f133af7a3dbe228c87376188bb1f6f095feda1ac7a8142739e0891f98c3b0cf90df6daaebffd7f8c248453bfcc19417320e08141ff2b197a40fb99ab5ff23fdae8608567d2b2b9eed6397360e1ae23fb2549c7778a996b9abc44fcc7c79ab888d9ae8b70d3a0b2c095d7661a8fa3727d0e4992cac3604873a4bb782b130c6e18460dbb3d404b8b746e571477b7833b424ae7c2263e678d2feae6f409a2ba679fbaf441e745a2fda7c0381213922012acfd9186ddc3d428908b25548e87b7d9f5544738fb5e6e6167169b5af3d78135de6da25a7454b89486f21cca1adcbff14175724366151f63e6f11bb9b61a701666f69ffa0bbfd93783aec394533e2cfda3ae89af6abf3ef05d4955eb0d95be0263420a98987c5d188f23460518c272622c52e1e9878bf9276c4ca9948c37bb19574e96ee8381825f8bab9738d5840022a6bd3cc9b5bbfc2a86d74380ebca2d6be714b18999f951ea7e525a1c31e88e744efe7516456b6ca4b161a97639a7537c1dc82ee1033e4a9ecc4f7323f4456091c61a916694b772b8eb513abc24858bb5c9df29a58fafc1f8f384752733875040b074cb515d9f611f0a2595b1e614c0535dc38f8f6ec7d984c4f6c071e7b86c47bb88d13c292bc6bc66986f40f45f2b0f79bc319ab64d18fd032c14c31e832ace7b110e5e74095d681012ea17fb263b77679bfae06a8b412373f4820a94561ffd5ac66b7547da29a0b48b95fa2c0b44cadae134ce441173a1108ea21bf6e5b4a3f11bc1d883e3e7dc4b6d643688c39f2d1a6ed1fdf481dc120ff51dde19249e2910520a19a2a7d12b6c735d245763a65b8285ab069ff5dc160f6908b06535b1c1953d43a4058316890a945da3341b20dace153fbac41d5b67429dc95c070b15f4aa0c7e4aac18882b3ff56362df36338f6575ebe1fa1c6ec9703056ee04fa1f78ab0c23f90a793ffacb74e86d8fd0bf61fe0d8eca7ff4ec76a65057a81017e3c343bb878e732fe1b09d69727773b27f1b0d2017c49fa5884743c58aeb5034ae4b7b7ff4c2f87a39daff06260c419921e7e42bc3c2f8ed583ebb06ad3046cb9e12ca73d47a7cc6f9dbbec337e61692b37a3407f98dfe4cf266de8f30217b438000000000000000050d19b03000000005d7593425ee04864eba8626ca3716d7463328e32632efddc5fd583f5042750869b7b1042e56a06c0376033fa497daf88a74fa0b306ee28ceb588219cf8337e2da33f9b702c2970ec4eee3810cfa3334965e820214a6c0effc05e6faf5e012bd2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a63698e09e26507838ebea0459745f09f42fbcca96778d02bee7292aaf2dffc00a626be92531c59a99c4824b71669edf2eb6007f2eab802463cd1353df0f1fdad4955c515768085dd0d2897f1f21f52ea4745f7269ea26c8e2543d4eed8b4cbcdb8b12f14b88bd15f8e5b3b92876af3e3c0c9ae0d51c30d6a3c56e139bd23a3032204ccc9882c1b4d8134bdf41677733e496932f6b66641f9704579f3e0ea2816021bd53720c05e8a7c97766b5fa043614c76a5c79ec63acb7040239c493bc117fd0a07e0cd7ed4501f1b705aade9c1f43bda6e8b789a2615eb68cf1694ada0c8122d97604c7ebfdcd27938ac473215fd6ea0286c9150084ada92c6ad56f6098942c80215078eab432182bb6c4d5097e6114add4383c7676a047c92adce008b47f2286e020ad5cb62dae867477b7357f3b5e392683f92e7706bc983c885a6ac01edb353c0032a647f4ce44bfd8cc57755813409fb1a76cc310f616b6d37b17823e5826b7c6703303afd347b3753a7360307cc1a5a40f16595eaeb588800a17436602dbd432eef032818de664f7b987c807efe2f17ff3b63828edd8e2ad83012bf14d1bb0f670480482bee432f2e7338ccc09dc182df3a6f0c7e6e19744e51f8aa9093ecf033adc2434aee56465ae7c0d483a7a6160c11925114a2602ab849130a9aa3a9ea782534d9631f8a991fe7b8695f09ef6fef30152fabcbeb88503c38285395771fb949bbf3ce798b09d32f870659a7621dfab9d80faa7bda447fb86500352a366b58ff06464d42473fb0c0d27f2a57a37903aadaab5b62738f6974ed716d221dbc2e7a2af7595030f916a3763584d585bda7b5345118aae3af92b06737266085c50bb68bd8a587205d50cddf12c263d44bc9dad603c292d53252b8d20ac27de131fda70bd6c9e138cf19aee28c11b8a1e1d653b624277111473b36ebabee404ffa5ca5fd89a04d9177ae443ecaba6f7153c7e722131a75a7fb31bcfc4726f31ba1f03a13fa1e47d7af9de1e553657f393c58ad3652e93a2ba641fd8115231f02d9444f19c6387726ced89caaa0b1ca31311311057d050248d9e433f59bf6f859b56a18672ecda718c4bf6eccf2bb31982edb65812be1ad6329ee9159f65ab7d93945f490e696745e16991efd11b61dc25403516e7e39a4c63457a11e291fbc58c90f7d6b26b92e4f2eb50f67af53f89023d3556788f7bd5b844fb037d12f19e26445bcee47dace863da143ba4e2f1e51200b7d680fcbcf62216aec3817aa4782df2428785b89658aaf28fd0ca9b8676e0889c6556354bde7714ae9e57208af7e14dcb329f91788814014a01a3be6531cea888b9bd4476a4c8673dc83549f574cae5e397438fad7b9114f1e2cd1c40c5c624917ae4d777d6d3318550b7b92ce849acf9d67a9ced843f807da7b8b68907e35cab7db0330c043dbe084e58468b29aaa2f9a0a777b4cb23ae0c9d0c5708885b255ea80edf8a789f8376f83da23786c9673ff9f3027e77449bc8509755de38c36e88b4eacae748145ed07b6ca3c96b9aa59878b46fc15e32dd1d7a986c3671b9e788a0103fd35d74cff92cd111bec33a0c988269fd9fe5406dfe6fbb24395366fa03eb6fdd38d0c53c6552817b226eb3f739468cb78a8782e83fbc602583cf1eab509a4263503d2291735131c92798e578aee55b362f0308d221095c3d2f251e166a5d24237133a3e14cc3bea168c5893e1d874e6c417ed9245d48ecf23810414d846553c4407b308c0fca487f7d87aeab2412dbbd4e2cc9f5e40b4382401052845efa1681bc1d08efd97a557c09fdeb6b83e0b42185131bf6c3c008bd724f77a5677847719f217ca11cabb4914fc09e563b64c9a598ef36fcf48e8881f11e5819c23688355146629827f64fd1fca93bb34106eea9101c92526927f32d986c834e0ac1fbb324fe3fb21b7334dfa804d193eaa807b92cbb2fd5e4ccb14a5cf36aa02677ca9fd05e4f661e702f15bf80d22568f60ad784303c24d9a1f1aa4dc3cb9af203deacf393400fc953b945e7fd5ec45853b90322e8de8e3066a7a905c193e368c92ca3c08eb844ce85b89aeb5d873a508eb37ac13161e67f6b40910ea7d7f3f81367df9c31a8fe090ab6877a1e163cae3660e63d8f749f3766aafed9dba90b42a611554a809b34ddccd9be84ec6ff84f8c0103033f7fd6aabb8012b5080611332a5472317f701553f29b6422e7d357fee4c4c1f718d563830ee0c1fc0a177e6bdc7e500364ee15484ec7471a4a083db143bc232984d51908be51f40bdcecf855112176c6983c3cfd0d881dcecfff0d2281545c99db89161bdb1e97450d07721475595e388e2782a44acfeb2fc5221600abe26a2135ddaae3f1c2bbb91bb75964cbd2af6acd16ca21148f93e703f7d5d2deaf1e65088dc61bf6c5bc90b3869def2ab3103", "6a65536353", 2, 454520553, 0, "1c7bef69bb7beae814ca0ce56d531ed715bce5c50c685bd3cd692aa08faace6c"], + ["030000807082c40302a3c06a7459aa3717febf09a5de19e61ab99dd29ddaa2d0c0c135941a5be7531b02000000096300006551000063653517205bf0d32f29f433650d5d414df7173976fd39f71910e70f422daef073b6ea7b4cae0300000000ffffffff01f6dba10400000000056a52656a530000000000000000030000000000000000716a3c0000000000eeaac65cfacbac1ea8b63b3aecce84488caff719003fbb8201ab0291182feb9781710b2f172bdc59edb8150f25e2fc56b4dea01ecf766d7c303cba13c7f050c201c735723a2ab56e9850f18dc7f4a95aab5abc07a0174dfe8fc4f02e783d2ae900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000643109701f53593cfbff8f497cf881a5662cbe43564e9066346159637b1c5b142c20dd9385fc7840072b326860f9288a0b8fea26f703974234fd777189dca89a0bec8b691f2c7c2b379359b1c67f0e06cbac14ad1a5bacc4fd2e5d7e2943a093ad0cc67f3e0321c39028e29c50bf2183a4badf21ed5693aeb29e2070dd8dc1db0317896564c650f9b78b17a85cc67e8056b4bae08cb0a7030b1aeea8dbc69277cc030751a6117ff9fe324916152406f20a5690d1e584d24084edfd6c2edef7b16f9e0a0245b5e20335e68a47c54a07004ea5d2de7d66b4cf1179750c089b24aa718ea0e7bf23d77bb8768216f89b5064a6f000e91b9954de2bc3468a6eb91010642bb0032496a9e088a8f2c5422044c765a4e2ddc7b7bd3984434475c24426bedf6977e3022606d54bad80bdd44cab03776134ff546c53a097011fed79e744a3c9d0910b06021f99d90de96d0c6f3fb697d3bbee49dd2991f354495c917c7d107e1c51cb69220309cbada843f5ff7b7a0fbaded17356aa6f8493763ae6fcb5dee84908836885030200b4fe943cd9954b3f4417564da69fc519449d50b9d931df11abe6027722ef262ee892318c925c73a6c4eb3ca572e3d0a607f9a33d010cdb9a0e2e28fea0d11e3baecc7ae6129128adbcefcc742cc515db855f66e9d8399e324d4ac2fda282e8c9f96d4d98f94352d13e546c4b622ba8f34b8f611fb095a344ab87f2f7121b74d97886e0f80311f7b422cd9a1421a2559749695a289bd9353150e89410bb38250a42bac265230d7ab12aa6ba213dc3f8dee3f2485062d6280bee5869065400ebad466c607abe5b535847551d43bf95a5f0a35454f1759dbfb056f34c87b73e0744ff50b32d035757aab5f78b8721ff0eb627d1dfeb1253e4aa09c91c0ef0fd45d16a7727b9ee901224a72213967ca349162537ea810e487ef43f135a04cba1be7bcaa09899605007d0f51b9fa05e5b43bfdda92cd9c43ffea8caa470143b6804b25f0213f603061cb17eefb955fb50784288d7d5e3cf7830b8bb452bb3d23efa592f2a04ecc77444defad0cfcb281dbd33b2db8226027709a1f4c5a743052f7c9406f3b15a0e85aceacf83de01ca009d86f2b18b8f5f7b8f3a7e1cb11b2d87e3f157ccdb24fd25ead46b5e40195277c02d6078fd745c7ed084472f78eb2dbae0993f5dd9bb208750eae4a1d339395bb0bb29693cdf3f5f41e053132e7addf3e82b726e1606994998b20f0220305e76d7ee29e6d5c74164030d219899bd8833aabe18250a277c35aaf1c98f436ce25ecd08255b3117d3391d67d86e3db935c5f0f2c76720264b51ee77fb203d688da36e06aafbf9006c745b61a5179268a4e53122b20a73afe5be244e7d6f5b6d8ee605160c739826d3a6cced49598e91322d2e42dfb5dbdc5dd8f2bc4107395c26b0e698a74339f698b2d8090bd9e048b27a7f647c67228f94fb0aef939c2aed5a0a7c89bd0331b9d6a017be56076f5c17c2a070c2e99db4466ab21d3b1c7f13da3852a52d1f59c3d9195b820f17080d97d24160188a55ff8693600b2ecf751ead8f994a61fa3bd41b9b0a3edb3371203b93f14700ca25b202dd985d18b1844c76fee71392938016bb2724bae89f29137b7caa4066a07f9548db00fafb4dcd9207c8f8b7bdb38a804ca84c5024253385976c4e938210aa5fd540fd81812c1c5aee269ee8526e041390933ad3641990a6b7533284519a34f5069e4e1f4f34546a9a6b237da0dabf1761fa4604a7b05806b2fea7cf743be00ba1b0abbd5e0f7f31c3edc6052db409635fd30abbc20c9369a7ec7f8fbad4bee3b8648fefb15a4107fb1498738e40324cdaad8a1996dccf26c2357179c243a2998bd37cbc316c35da20870511c18fc43be1fd51cce94b534ae8a97225eb2890189d16cd33b557dd00ecb4b2b3acf8b953ee5139dd490d69eb98fa74e94d567f52127085adef4373b4335808ebfb7b637a1c825f228f2ab21240fc39a23fb26b1f4b5e07ed22cef18999e6a9a52e7bfd5caa6e7e525d9edaaf8235e3492c47965623c9df386649ade415fd2565145661d55138f651d2b62545d41efe8f2fb910881a0027f735ee5707de2edd7d2622940a34773022a8b1a5f155c2a717d8b8a5487aa999c2ed9d8ee6919ec8fef95aaba2b5d2a315728c90430539013b3f534115e42a54be001321c2d846ab09b001e2f3f7d35efbae5164d275429a3359562724429c456d421afc5c34bc29c380df1ffc730a7d8ed34d277b021bae54f772582c1bc664a47a9b183c7618b568fd63e171020000000000000000000000005ca9cb8b44eae2b5e29f050000d2e8b8948edbcbfc6edf52b85059996956ae513535913dbf01168f945674e270b7a52155ebe23c928088d9802dde7c3fc4a56790ce2112afd4a0e07e00a4f42b9b7b1b75972e8d2d65bb6733fa375cfff38abd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000abb897459574b344db21f1137a2b180272fe826dd260919b7c872c2aafc007028ececa5e60a03079952abd745284e8f18531454e662120f6e962ccdf6ef64072478b86d80c300b1df6dcfb90b28bccc73b5702e77cb1841ccd833184f540fd75504a81b344dd7a7ca6e111ff7f3410511c70c838703056e213b6e9661647720022aa4d7f71bf483ff46e37570b9bcafc3e62645141a9859579fe2b7b90287fb0303283b2f54e736235b3ad6940faeab153aee11cb8d3e1ed7a9a998fb831260e7a70a01a8c80fb23a0682e5f452238107ea87affabcaec7e20778c267668ffbdd3404d30e8ff512320b6911ba43de5711af24defe24ac9708de62a532c7cc961e6806020749c499bdea63f30444d57d411326671c29d405d4dd7263208b0401654c8a6e021812a63e0a208a64f5a8f331d74df9cc40f6b2b1fd3c2c565855d4657927c99c0308819ccbbac57cfbb161b2ce7fb3f17b4df80a147e1488e185898fe3fa55105b031083d268f0adc13f2f8b6dbc03efcbc8ea57b89dbf33e4619d0611bc01325fd603184d07ac1a329e7d941b3a7198f4ca272ba10b322cc1c26eed9148ebfb8e8218c321067a1e436df304366f91156249e0e5f0fad0d9dfd5716070def6c89012bf40478c2ed318e976e4d20880074302ab6e75f4e62200859c49b4707697bd0e3a7674170e3400d30f8a9f33a9cd3d932520ad6afa6eb873a8f18906a848462a56df2609c5de14641457a51c1ea0a58c758198312e62ffa0c1b4d9cfdc2f4ea5a3d6fe812a91b1242944863816cce8f781b50e96154a17678469c268c2026bef04becaa142139e20ec3338731415d22344b04486b7428dde9ce498bdca0f8f6743af94569ccc2e3a1b2d1af6e817a67829667515ca82529075f493f834515528d0f7f55240fa69ad97551f7f3e1e880d38f7d05c7fe1f2ec710c7f5653dbc7ba4d02f4580472664b52cb23510f2ee0c026c8ebcb171e141dc0bde79f06455949215d45a344d11279970d9922aaa3385f854916ad96d140b737a99c44e84df56fa4b8c69cc3964a6cf709316a9a7b10b5031562e473b78130be5adeb30f483ab9f15f2cda2bfa58238e813e4c95dec20011e0bd5aaed63a61ccb4bee1ceb0c487f6b3e44af536b3ca18edaeb1f5a7ed943d2c0173935eb965797886122f7c1cf094a107d68fb9391e7314881ee29e4ea74b01e9e944a9cd07822dec6068280ccfab88de6320c848ecc818e7df24dc413f3cfebd276033a70e8b45d6b4cc89b0b3bd9799efec46af4177bbab5779e108fb49e4d9ba3c1f9b940079d426e0d6f9c96cc4285ad7c311876edf8ab1eb52412337308375f94516102c210b6e92f8b45a81e08acd7f763e77474049ff9d13ed3dd453dd4651d89c4e55c11bfcc9ca8bc79988b402d83c793431344975114f937bb42eae7e6e468a00ee399fe3509fc3e140070f0cf38dfc89388ff5bde540b4d9fd896f124f2ef0c9f2446e343468224287848ea78fb23ee2e8164faef2d67a7f82c1ea18d8d3ca9aae9c5b9794166aa333ca2ad39e868909b2ca406663197ad9dc4e42604c2c86ed6b9ff36f4ee8909b3fc0bfdc9a61539b719482dea07bdf8f078fe5d00b7cb814b843969ecfba1147c68cb09c7e111314db1b761c345a30aad2585f05f03762b930bd09b0140ec7c209f61794f0bfb1ed7f23c886dd26b27cd424e7ddffadc9c57985005452547bc2a9df6ae09636100d4f0cfdda2d19a4cf44f142a30325b4f5e304a52ab35cc181fb580aedea16a12e4c2d2de8ae368adaddbb06c8b91727cebaa3daf5fb881ea169999dae417d37f58f906e72b673e75eb55633ce5fa5c42319b93fa4e5d0344a746feda2df891222a073674509633a22007a555e57b3d007f0b682b1bc39b5e0d61937d0de89f4dc3c4d9340da650ce9da8e098673f7770547e5c67ffe53f900ba82397d27414eb0b0014495f3942579f512aaefb4ae6b503cea36dba31fcc4f21b418cbfb6b62e467619c95519e58d7575ad7e7dc73edafdce7043ed86d35a52ae448017b67494838dfb9c9bcabf79b38a98174e3c1ff7c628dfc912e91036224bde034da892200b174ccc6d7b09d5e83963f3d5f8e8d6ff46cb0db98f7f46835de0dc27383b4296fa8f4b1db3bfa218078c64790a333c5dd5fc49fb92928b9c60a1f3dc822b069d2cefd26fc7972d83a5b73f53bdf737e9ed03cbbcbc73243b441aa0313dca7908abd152a80578f81ca1920a05b3ef54f16cfb48566768be4961e4cf76d122177db97679808fcb6b7447a55db45ab030000000000000000000000004b143e7e83c36ceb4dd05557dda837587742e83e4c2c29daa92161bd2d465604447aa656271b72878eaddeb45f48ad0935e3015eaad62533922467c0e7c241e09bd804c1fa63dfdcc1922a88198e71911fcbaaeb3f75a180f4922ffee380c25000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000baaddf5ef2ba42e80d59b7bbf63f675d665da8ec92805a3f89fa25237f439554552309f32f725bf02356520410c833d5b653d27c5082f762c97297a391106a8d03fb2b1296e944e88246c6cd7278f74e7b638bb54acd6dee9663fe7b33a4b295a1a45258ba2fa18059a9d575c76ea57dcc175b73346fcf1cfbea68f75660b03a0213935186fd960e15197bf9f3f4a19801ce1d52d16756a06912ecdb0f99289d76022c502e6784d1231271c693f0950e5e9c5c742180596f4d56075f726e1cff31360b03a6268f525cd1d5eb4f97d9efc619d8b8eed6f0572ce6480376f47a1dbfeb3d92f87c6eb2342e91447e0e7fa224d85d1e1ba2bce61a3c862daa877e2874cb3f030f9b3143af7bbeafb9e78410077e72037312d347f1f3418b80b289db6c9dc212021e85200eb94e1e75161ca77519f33d9904e0bb566263d657288ab50b1068ec1b0201d067576067b6290175150f9346639be6e9bf131e6e8da1c3d12abea2af85fa020d7a6d1bf95afb83bb0b042194c08142fbe96a1eb071fac71528a49580bb8fd70200326ff21560fd6afa1708598bb1c1f30c40ca69ea77a36c3b7385e29ac6364b5aad66c66f2b22bb906dd3f379b55461eb7ac4bec83175312283bc0e0f464b281b25a145d84e1ca6ee23ae64d7042d2148dcbd7c0da89024b2d9274560e1569ce90b64ff29c205ed9951b575b50fd17a9ed42f42c069f8b3eb8e64e033bbc83b6f22b44d6472c2797421f5bcc8e5f457552f649fb4eb03d0cb6d5894e388a2211a465a24a2bc685908e00036b4b912aa74bb8a14a9f3a25946a73edb7d4e10f6f18f0d3bfedfe4a80bb72e9718e93fccde1f3df30d5f7efeeb2add242016ce4a388aded775f504f82aa93911b1e7b966c7540360aa53a14a268b7e2961928aafb5580370217d4ce8dfa8df81c1eb29007aa2531fbd4332092573366e6a93cf4c43d5efd12121ae791a514c3291904baea8560d868f3b28a2c2411e5baf699da52e93b31ffe46c3c22a7778307ed94364ca1be2e003fb1d29d8cc0ba7d55c05eeb917652f66364e385c7cc2033ea2dbdc311ca59845bcf2c0a197568f764b9560fa9368c3e1363a61f2c37e47ff6e9d3ac55548c880594876257695d06d16330e43049f536eda02b449e907ef381cf8b3c302c5cf0697dcedadf7b29c5b998a1db62bf8287274b88ce60a6f23bf348991460b3201fef8bca2ac3e80b9205f84b8845fe26d4370424b2d73d3bed16640b3f1d50dcbd8b485021e213342b07a6d77c030b8a8815c7b0755096e313ff8c24ec99e4cd45357f7d588f9544dac8c686490203b644f61b737651712db17d00b2fff53a5991038e70d6f0d34d3735595648aa8f230390fb98441724363645dbe251123ff7f0c4e2140f7610c9201c2cab7cc9e9e38eb543c8818747612c46541649e0c26127c5f8014413fb422fd120ebcf5b0d42ac3836f4a948288e1aaff74f1d4464063c385e0c3808196e5d6ea6249fc194dcb821ccbadf9dda53791476b77ddf527dcf523648c452a605d2f5acba49d4421f32c0853216c190d7ffc54f46031278155eee586f863ecd74cc05e8772cc3850a5b3f7b7190c897b67d8272e39b015e8b04b471666e99f4e5dd1ebb088fe071a7f92519c3fb91151fbec59e7854c53362c5bf612c37599f751d816a1363b1cd33f533ce16012a97c78b567de16991a414e9d23bb718463940fb12f8c9e5ef08f8e2ec758ac2c9bccdf1ad3f17bc00f647e7db6350f3b580fe0eb5fe33633bafec6afe7bf35f9ba4fe528f23df014702e3ded233c3d93f80e6aca5f4d8790b24790003926854954d0fe26d2bb40442dda5be9ff4c7152943e4cd1561c163c2f4b0ae99748a4f9cbbbf794cb7b0988b8c1e257e749505e54585748444a5565e35abaee4ee723e4ad1eb5b07b06d6f19f09da93978417ec37a7beec0c786527ab255079f1ecdfc045a9ca18bd315d321df8eb07b6cc8c3a1be7e381102c83b2882562a196ae98f7799a60228bead6e0d4c089db2b6ba8f694ba9e468200e4582485d35953b766f15b6e542c66905e94b6bc39795b90aa591759cf3e3323f20d70351bcc84a1853146f894879193ef6c76dc54f60a67718c2df50f8a2aa7cdaaaefb47e05bb9764b4d9f6aeb8ac1dbb69e89a823cdfe538123ed82632f6bffbaba80ef056d624d15fcb6dc7e82d85ffeaa43189fdebf0950725f51564a1d332c0bab122299ea335d625a344a4579c8da3626d6e6a0ea9b26ef88b464f3840b2a1cf069e90a892c7052d8b63ae296fb56321fb7a0138f1ad3ececa81be26cd0f6b72fe18654c9bdc2fd5faa790f9fe69e99a78f95cf8b24fb9bb7e09159e537f870c58d26e56cee27e63bbb49f65abf5a9c540cd857ff35fc80067bc6c4c918a6992c46252c05b9a7b6e235b6c8484d5d0f", "656a5265006a6a5352", 1, 163497046, 1537743641, "6b7c8aa1a2240867e404c60191eaeb1b0eb9aadb0202fb58152ff8c9e768441f"], + ["ddb7a80d01b0af6bbf9879ff248f6bb203da4d406979e6b1a1024141aee90af0d922b91417010000000465630051be75a3d7014e70be010000000009535253526553635252000000000100000000000000003ab1680200000000d447a55412e915b403bce456581550e32a110178e29c564cac9c8b9de87bb4a6328113fb8146167485f82d06e83905350348578c871206f662cf4926c0686c4c1ed1fd8a15ec74d2d6c260edcb7d7be132535c1995d055bd1b752baf5025f05300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d92e281822a9293628ef0c7004da309976a26673072a3180fcd47992f4a492a984005846828b2264f732a440c6d7ccd70fce9a66d3e33a8030630c861707581176119e8a6853e3c2e0af41927e7b0f63aa4ea3e806eec13d07fbc751fce726fa27ee33aeb4c292f3bfe2346eb3d8807d1e106b684db8f5f89be6bfdb0430880c03209f67c7bafa5aa00e2d40870e81f1c0ec641caed66330e7a1b37aa8abe697fb02253f38ee75be92fcd301220da770d2e4f2d17bf0dfd8ffe09b2408a07310149b0b0300ec77563b14c54270b7bc18667e0789b692bbe3bc86016a31c0af09643163b7787c69b1bb6fed04e6e0f30e34dc53938b3bade3ba1afe4dd7ef2e25281df2022a9066c9422b03af44dd4efa22946f9a36ae126ed82654ad6e5f383e8c947a5002023f61f1bb485b440e18a466877b19aacb225bbc4a864e3cd2cc1aa35090402c030c97a1013bbebe90470527b9a207585f1832a7a70fb02b07a53df154e4a49f4d0301eab468980da8f4951e342ef4ca3a6cabb6ac4645342fa96d7b74472df13ccb0221474251f886415781c39a59514a84add1467336cc4717dde828f5b181e1cd642fbf5d9842795e5a4a71b71ddb69f130737b841545e525f3c8941c053e0a7b5ad5c00a80c2f44191fcc73e57c8b6492b4336e1d870008fb00507d3e4dfbd6d81c23b40929a982cbb4499860332f4435322b0197ab0ba6a863baa02cd68be20875f18a9bdea384f47b848668c2f4ab32ed0853afea74eaaa0dd860ddcc60060ba3f3ce4be3f24e865bd80251860601522e35f41f5e7a28696112db53306ceaedd739de019df47a147f9ff3e045bbf87510715279b38827347696e589c357e374217698412a676e9779078f8dabddaab2b903bbeeb7181cbe36d7f20369ac1913b1ceecfba004b9919437e65ab8bb4dd6f3d3d9b1929b072723a658729718725eeb7aaab8011f989ddf5ee2267169bcbd279985b42c29cfab53941fd5e1b317d1f1b1c8e6bfc4bd55ded6a566be8b277abe001faaad35b37d1ac9e3c7a342f26eb81eea7008a28773150e081e0f1440141cfe97b94f4f2f56bf57ceea30bd29806fc51839f1b55e3000590978bfcd4fc076f403bb0e3761de54b9e731329dedb711c4af5852f22d338f2e6d170b4a2d008a51e411aad1fe1e93da12c9abf02faff2798bcb0b8827b2cd191876b557a90c65b5a27e31cc754f791605ac9ee278a7cdcb27d928a1e4cea3bef83e4f81cbe38d46c787c3f29c93f39e5085056f6a475bca2c43539497c4705bd6d63cf54c766ff568775703f5db52173866d34ca2e2a124e78b591cf8817af2cb949c5e501264d13d2fbe8b3ea30a3aa7cf01f94af0cce840b7c226c1b7b635936dd2473f7afa4b41661e34d90a5b5603e5bff8d265e41b8fff8f82aad4762603fa092b042d5cc205696eca7465c5c7e10ca5ffc669885ef295fcaf3a6acb90d9a1fda9ce78f8eb0877c127761619615e6f325cad160353d84ac77ec815165654be6773991b7e6395d5ce87af03ea02ed0038f190d09acfb467f4e2febc58888595170df3e710507071b2fea7c44780732668e1744b9da45c9d2d36584a2fa7cdfaaa3126a497311a451f65cae4a6833f5a5dbda8dddd28946e75e7bc387ec1e184db8b1c57146efc292f4826a7fc875a6b64d4327b9da4749582408fb73e70bc6ac07f7431db1f6253d5c826ce0f868b9412829ea218d5c5d63c8c8c18d948d336f8c26a4b3b5020c85d0afa799195fb94d94e7780b6fc2a7bd5e39757cdf38bbed630474276bb657acdc435560d813b5fd6146b02329fc0a85f70e6fbb2e80a21fbae1baba07bba558376ca5866b8c4af7bd34caa186e6379c781036a085707a287f7030b3d45f5ace7d4362cd30e91e70ab3401326413e8e437b94df674c6562067eb6d2eb93d618239d16b08d6a52c40f9df8874c7ad2ae179179ac91ee524d75e5832a35182109ec156d8b115f49bc5e83a0776d4dc8b774f6e1c3c56091fc96df6454e4bc6b217e3e75364de42af7f50c0b825c1bfabbcb96c196cdc9ee5ab869052d29c083d09bbe3c99aa2eff618a901eddc7eeb4845ab29015b72d6707e8c0b40b5529195a6e401fadcd324e6fcc48cdb9926e60e698136b2c0294824dd8db55242e6de40c36758d8c2ee44aa9d75368a84f85f4cb612a8479907720fcb031b94da6bdfd18c468cedccb8251f6381af143bfa1310163f0db046b0f0b5e3a7879f6703b8312f2d1dfd1f1794b97d5210d296125564baa33844f6377583be690abcb36dd78551e6733381c1c0b488da6fde368714a6eb913aaacf326a121f682423be49eeb6581d31eea41db6ad34faffce83a3d03abfe788dedba6aa952c442f2add5aecc0d674e79a062f1cd969ac5b4f3960f8ae46a1915a210be4079719dba048ac06", "536351", 0, -158921530, 1537743641, "3620c8ded84de25d229172ab9f56331a0ac9e6fea65bd8a42abd8c1ab0489c9e"], + ["4d54744503251645f026dd4a2ab6b80fe4d0f38fc4a535ff0dd67971ff8a6854d0f4bea2a600000000050063006a53ffffffffc75befd492f359191ee380cac3e3a7067d3ed523ed56a06a1910e83ecfaaa00f0200000008510051656351526ac25d92294f556b4482de21f8eb8471acc05e5db39cc1265a25b2e8eb34cb306e998a1869020000000163ffffffff04cdfa270300000000016a50fb8d01000000000365ac008f0a95030000000008536a6a65516a6a008c0f630500000000096563acac6363535253000000000100000000000000000a48e201000000009da54701bbbf8f51eef7a6a078b0154bbbe175a93b109c3cec7544d6080da499ad35ed45b2ab6c5428ec485e4081619c6a34c70f4781bd946d67d75538676152edc7cb69ae7981211de405605c395d7ca0b6e5d74c4cfea74f85f6f1cb2b51cb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c81b40e0b8d9162651317fda2102e4fde2b6d983eedc83609baeaedee56e768650f6133dcd2ba62bdbdc9a150af343e4e03dfebf6a0c0ef1211dd0a9b89d27542ae7c6e68f6a1f66e4b345a14405afb64b3da93f6a1e2c5d89d036edf91428b0069e4d2c2b6fe2662d68d15ba0d9c136db91ca6799765f006c77ccfb224d9c0031108965bb07a085a5472af2fe982b8cb956da1e62b9f53bfd5fd567c152c9753030274faec23ed40e895b02a2bdba9bd4996718a379f106147f5c609896d1cc2000a05797040ebf481d228c123385808451a71e7ab515faaa0d45db906c23b1174a2df7b2da8c02d2b84e891b41a4e34cd97cc5ba0d3c3b8e306a2133c326b5f802a020a62b4ac86e6bf664b8d9cd74e9d6f4f9b705a3705a757fd90f8892136799a36020e81ad92d2ba60739e9917ca119a68cee1020cafbd4ff199ce25bd528cb7ea3e0227531092f825f864e9f4a6c51b5d8567145b05d254b52c2ccec4c831b445dc54032b9ac56ab151768286301589329a49ea3c1626b41ed01c887fe8f193c3b6eee9022275542212ae69049186c1d594baa511b36feae3ff5254da1c55dc10300eaf5805b2e0c85ae8e840a71cae5a973335d26b77b95648c73fa1987fbeadefff49fb75c733fc2b529ff9068ffadd91d858c42df583a9a504f0f4506f8efaa7bcb6414a753b3fce0db43766ca40b93a14dc81412ba3b4df24bcae4245a6538e81a4ce8b01e20b07a1daa7e1e7fdce139058fc38d69f10902779ae9cf8250dee4bdc44be4f1f03c42a31a2b98e6951aea158dee11ac15ce7b8a5a251b80129cbe92796426e6f8a75ec29456b6bbc7658241acacb296f0c0bfd48e1870f16dfe73323c9bed35725d2a4377420d4ee80cdfcddf1e2d708e0231d811c09829ef1049755dd31419aa0aa23229d620ac7553dc5783387c682a486e70799d47c4a816f340cf4fd303433d06816c7b56ec333cfd1ac030dcfc93cf354782591570c20c4211b200b8eb078fc4235e16e7802b02da0fbab0ea33d51da8651f9c243fcb4639372882b4a736ca35d3727f968ac8c8c841fcd4a4b4d402a830044f71d2e34d834ce73b157a52cd5c5ad94cfb11fa91d343387ad43816ecd3e8100b1083b01ec5e3963dc665799ce2b82804d17c74b38f4ee79e23ffc55bde11643970900a2bebf0263ef2b1a131552908fa88ba0dcc65fb978660100dd03b6901b239200e96e39e73c14d98da9d128272f8c8c0838be0c1977b202a316162c1f1cfa6cab3964732bda1b8c9299f93ad5f10755fd220feaf9821218a77e4915afdfec541c0cc74689bad07ab6034ea1b3f5decd3ad4aaab03ed47a3ab12707eefdfb05b7791d7ed1aa676cdb16780adc9b0eeaac56e91fbaa24ff4fd229010292ad5ae65cf23472ab8ff58f1f76e320727235b0b5b5af37c71888ab45bd24c176528734cc901269341a1700963285e7ffdf6bcc991fc28cb51b249737a75d30fdc7a5a59c7db885c77cb1a64c6a351123b67ddc8840cdd7a3a1d5aa62265e91fbf65322832d8532ac7a60fb45c07461c2062e2953782adb8520495e970858f055dd181b2aaa2cac3a436c0f35007c34851c4cfe0476f9a267c69d936acceb7aab138a0ef12e0fbb34c9c0f7fe1eff67da230700863c0f27a9c9740cef45a55e2eabfbcf055856f9afb5360e8d22fe4f099fc06a058d0b307228a40b85754dedfc1fa54fbf55d3c0b2c45b03e6b14a2a55533624af1e0437706a7066a1e8d9480826a2f1c0bf80ed0531d2665fdd74e662c5cf3ea499404b3b0f011e665d76ff029edca7e390c0edac6d2897fad365e70008c4a07dcdc1414c4335d9c532a92edc75f96d8b61473a4f4c24695ff2ef5dda0d7f4ea7fa3e4503df5c7d27b121750839e54abfea21ea9288994ac7fdb6cc0d713ffd0d86375ae93cf4de6ab6a82029a56e959f6ba5828c698f2c3161b97ebf7cc19341c62b962ecd6d87ebb065461112a8f5698965396b1afe4b4c2ff5c5cb9fab0b27f75b2c73ee76adc01adaf455e2b6d2a9c1d1b1a56bcd6cd23ea69c73c23c682011b4d3c46007e68d16de892c0843d2cc9c98e5b35a86ec1eb3ecc0cec678c50149c892fcfbc984d093a3c9535ce27dc3b0ed24d9076e0aeaed5803f3e4e9ebd58f79c94b84661e4893bc6f5dc8c50c813c90612abc98cfee558fd8dea2b18618a9c85d1a8aded1b0c83fb0cc344efa83525753c99ec5ff3e07958a66ccca8b601a7a08917b6273a5a1c34df40ccba27d159d1c4a01a8af82ba766967c7a401b3f43262f62f10c8391c383ebb7d46ac6811b46b313e53a3eb40e9167e064ee835738b98b1fb679738b327b4149252f733ce46acef219569db070f137d4d12ec4e63b3ff7e3a2ce9272f5bd250480c94bd90ee6554c96f92ec0a465dce8e8b8e6b02c2ed8de3d80b", "536351", 1, -671021817, 1537743641, "963540cfcb0d91bf34f5107cb6d476627bd182bf6ec5012dd0687d489faaa224"], + ["2e6b696f03df66e8cc85e37c7589774955bc77f3ddd3916890bdf1d77ab2bbac69b0648f600100000004516a636a3d2e795602c2c534a19b9537d76897027339fc538aea9687f886168058df1946b211759d01000000025165fffffffff97909b06a0536357af6772040eca4513c22dd6f0f7ef5cc6977b7a02fb64cc30300000002006a7369ac8e037f08490100000000076a526a6a6aac00ed5c30010000000009ac63656a515263ac51d34ee302000000000251650000000000", "53636500525251", 2, -1560523293, 1537743641, "5eb40539467fb8b917bf8dcc84eedd75f5b861ce8a9dd4556048d0043a6ea2d3"], + ["724f167302b11544fa822156dbf879491f786670ec9570ae95b63f93c70c0e154c472e310c00000000060000536553516504d63a38b6b350e46e083c95015bf13da719db12771473f9a266287a37e34362aa0a9c0200000002ac53be41f51e043e51f90100000000086a5352ac53acac6a1894750000000000090063ac51ac65635252c6cda2030000000001533989b80500000000066a5163ac656a00000000017310f505000000000000000000000000f4073840fbae733578f5c5f02c33764dea19aad4c53549533b96f2e81a88357585a99a5d82a8545c18b504fc5ec308cbf8af257a6a8ccd1ba4ef1cc2f2927880f04554fb62acdaf6c6ea1156f7ccc0de8fe5bcdef65f44488bc978157c2c8a2b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ba29392c9afca96582f84c96b58e90a31f7428849bcadac55073c4b02d7d154e238d36287a7f9507c4ef93833e6fe2f55eea5e1c23b9f6a782b882b9122cac398a00f8718f0e6f080270bdb2b05f5e0b64b5f860b3ac28eea5569ecaa605c26ca112dcc42820ffc47741a76e9fb8aa08e74546fcdddc1df9b884cfa6a0dbb15f021f2cac4cace83dc5b3ea347f03e09c5f90d42fd8a47f58fa3e7c697cdf0e0d49020bc130a9fdf6a3597aee7f321d88869e242a875ef48a9a64cadce94aece512d30b00293e8b43a1ae150de7e373097b7654fb46d36c3a0054dbf518d2c8afd992cfef24e2b8bbd31b7f2f5344c147ed46a8943175603eeefd7fbf2c18ea3ed796200312801eb5ff785220af955db44eb8f67aadfe704b42992187140b7e9fc2bcace9021a15ae89ea02a833fb92b109bf6975ac56bab793e5962a97c41bcf41bca12209020cbf8e502fdfe5486f7471456e5922f6039df8b64a7732891649b8fa0e11ba1602032df895dd38fd6ac567b20c9047d45542968b2906a48a559f86801ac50d34d20229b06b18ea35db8c8ac5117136430830cb3710a8b2a335bfd2cae360d8990da1c13cb887e9758127c39b0e68e895261dbae10a10d10008d71076ca1622cd301a1cce6f3cacec9283b413b79d00f379c68c6765507806d380fee3a0dadead4f67e409b6c1290a70bd356396f97f718356826c82d8268a82855fb09162816c3b76ee5bffca2ff169e9671b8ee07abee6292ae0599941280725278ea0d4a1d0a7eb265e36e1009ba9e2fc4006b362db8d95a4589619459bb40e744dc5c48bb17616c3c6cf24b8bb6ae0146c6f99f5605c57b0f23738f17f4861dcb846ee14f255e47dfd1cf3de213ce0c2a5f2b68993bd4788c3bd499261b9fc3b203c95dba37a4e5ec32922593acd791aed9d03abe008a8f9cc6cbe95d05fc0996eccd9643ff8df7da9b9f249dc7d690dba98ee85bdcc52675d7f1f3b15580e02b084e6da2694e766150fea4961519bbe0bd02c90af12544b6e59abc6281b895336c4095f2679028aafcd198adcf2b652a1a1cbf951b1af6b9c4040426c04c91b53eb033303e7d6955f74a1e562a6335f5dab0defa8922f7e657a8737298d433c09a4b8c8fe7f89c4aaca310291436dcae7bc4e01a631015001e589742c3ee1fab397256ace24e64ef68d9478706e9bafa2e46349671d4762cd4a11fbcdbb433cebdf29d61af86bd82cfb2e6cde9eeb8c0977b6b40d2804f142f86578fe3605a6a4a2a13427e10539e8306f2d3e8ac08f8b129dcba6a58537975f7eb46c2c62821760e104fec47b5d4f43fb98ffb68c5e2e223d4a3ccd99f2761682e5cea46a0b4b472278083ecf8cde23de70aca88b505cd8e1572b66b89880523e15d9b5119161211a5e9e9eeb4c1590d8c86e8281d2b05117579381c24f3cc613c1e38a3d26a3282a4901ef38acaaeefcb4241f8173b2ed7a312282e8f4a448168b08a69797fd670bbc44bad7eb15378fa8c36d0d613669d0c9ab950f5d8e5d5ea56f00ed2bc8a229cdab2e5d50e842308c972284b8aa7c682241550c8841a41470abe6be00489fe487658534989d64869378bb1b8d0ad3cc89545b2409e881a69e2e8cec6350515cf02178a1ffcf6a5b76e177b33fe8b01831b27cb68d3edc4b6cb8dd979084bbb1c17e68a51d81656e31d92cae0b63d2b9ff1a48a14e90b6234803aaea084d3b1518c3bdf05a952e12566570120812ed8b533efcc34668e2e561a5d6d6b87ab59fa058eac8576b9c571c11c38ecf469273ae6bdff72e1dac3d1da04982aa31d91100ad28d9fd8870042df3b15aaf3929df4c24ddfb52edc63d3128f977604c88948e8ebefc3f3c4f9e8529f274cc238862dce7154cc2a9c742d5a13b3c58c39e22d939d13a8e3b55ab6a8cda1de20a9f683c10df6c36ebdffdd5a3504cef7ce8e30422d0dadade60ec8e645df1e88a5826cc0f90e0e31477b2388baa78fcb64e795f99c212cd5635470b87fe7e75196ec578f05074fcb3ff16f3a17be54dde526da6819895633dfb5b832b7ba106e7a90182640bab7fdd325ef2612dbe1e9626671a063db96449a7bb7314ce9ae4930797408477d4f483f0d843dde6700af1862ef037e8db1e754d4dee946eb58222efe1b4dcc2a7e6add065c429211dde38d83bcf7ca54e50618cae0a19fc4cdaedca06640c1fa1cd3c4a5996e3bac620ffba6191bbad1c06bc054b7d7eb62aab8dc436bdec585f7d671365d3b186da7741a6466708c0e5e4f67b1b8aa942142e852920593db677b06ebc97952935206eeb8d35e2a2f031e8dc7fec28cc66df203dba9793eac63d6bde5a91a8700f74cdbe2edbe62b5e7e512aec3f69892c034b594e70f618ac6dd7103cad45a2de74fb85dc65f8f47615658b90675baf1a3be72fe17cc49d8c21450c", "00535251635251", 1, 2039130554, 1537743641, "ab3e859b67f65f7615dc8ddab9be3f13fe262c6314e88458b164161808c226ec"], + ["030000807082c40302a8b52e5143881e37f6b1fbda6792701bddf013e4e1a8f7f2f50b5810ca490c490300000002acacffffffff0bf45e0df179afd04ff6c08bd38c3ef35a96be18be0863e01db3487fc4008102030000000763ac636365acacd23d35dd03a6fa85050000000007630051636a6a003480a80400000000016a46e03d03000000000453516500000000000000000001f4c18605000000000000000000000000159f35b0a09f29de1838d09ab6463eeb2777251b49033899bbf851d863d91debe6c03a442849c9f2398ab8f82eb0f5617f6bed867a0de5cadac66534832a08757705e511817c9fd5c5bc436ba13aa55ee008202f688f57033968b80ea1575fcd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d777caac514e6041a1643cc795a1c59a3551f64c1edd557f192a7a11d102a8aaf10027f6871d441be126c380ed71e635f29cd15280bf89ee92d84e9eea1bf06d78ef5c50f72a433c42fd5ef4a3d2299cd72fe54ff59cd22aae20f22ecd374e6ac6f10efa33c29bb2bdca1a8fee236e9a773a48b6416621dc95e4c7646438a95031f41a6181a95f29934e5bd94cb43a31dab65d96b11e730d53e58bc1ffebcffbf020c953a10f374a283d0852bde39d687c24cc81fe57994a08a01c66f696108ee1b0a010f765283a9387cdb28e5cceeed21482cab15f4070420859447b20398918e8faf9de1a4b97fec5d31c8d994533c1c31b8026ad1115ac202eebead031f7d8d95020585191f80455ca57f7b276539ebe955f8b23ab0742e772d514888fcc027b7ac03078bfe941bb277d3d6a2776736d0bd816313cf2c2eb9a9420327ff36144221c103028a2d16ab6fe92c9862730fd38baa78327613122143b67e00ef7fb73b7f0f1e0213b975aaeec9b25adaea4c1a13cb0b3d05f2485f7add4f438d3c29f898d3881b02109e71784899fa2c7a839244e4c0585795155e85f61d28c8b4b314bb28ac7c37e67ac3b581db95d4f840b5023ca1938af72a13c2ac5274cbd9afd384c59f9bde131395258ac90325794f1a8d44af52a281c3d1d564cc10465dff5d1d1d4778a15e5519df465a4135acd38055234296f3428e9ab12cd0e8140ff7d6e85831c185af0e748dd3313c6d246669afc1f33f457fd30472a471b0185f462a2ea5a2bca920bc529249f52e950187e9aec3fe9d3cbec4ce602f72bc511cad05765b7022181497520e9a563173260a4c2d44f5d2bcfe2da105cf3669c0680aad23ca17ee99311b2cffcfae67e594af57793d0574f40d02bb39164a6861eddb70ae52af21062a8a22e1cb8331fcfba185eb1691cf49f7b930024f445a6739a3d7925ec742f7b718aaba529e2468a78ff0c6da0bb817320f756cc89bc1dbd9ab0bdaccf6ca136e09e9953e65212c2c1a5691438d26e1d5ac662e74ca7795f69d6c69b1664a3bead40b5a1d3722d6ed4a65d1d90f0a126adc1929704120bd43cd2ae8c6bad51394f69212ff9f3e4e9847be1cedbc8eab716f00577056c23da364d6bdbfe1ef0cd134e69f8a35083a9f4e3f8fb851182b1c28d025f902e36067984e4f9fbe780eb0629164e822a60fc44528dbca6374f1dfc1e4b9a2561dd1bc7576068736ed0bed415a0c35d7d96e2efbf6f10927f38079ff37736a3c74674b39408acb5496697088e70596b0e734f010f9855dd012b31c2d46d9eec6e1963a0f58e8bb36ce525658b891cea0f15708099869fbe6f605cd6d18bfd96e2e78b94f4c7cccb513dbb50f78078e0cb6466231b51ba1676413ff48622bdb5bf82b82c8885dd7098439c1b70d55238c844f7c0ff2a23a58cff827141df13add7a277e160414a594a3dbc332b5aeda5837c2130f3d2be088350d9fb7b8cb04ef93a85ebfd8cf3cadf2a78345e75c6bc7a7ae6834ea76da304d3ac110a9e0f1bdccf087a8d531dba568e8b8fa9c720195b96a35df695abb5c39a45fe70279ccc19529c50afc26a77a430b8bb488f43dd3c1d6f95b0df91031edeabbde319fd48494a52bd50f42e3c4be0bf6094893406111bb812bcb36bb709600ce62c1515b842edcbb46ee1f0bc960382a4e48b19d9a87071078d157a7e0872f1edcd8c9aeeb46e555cddc2014c8081b511bd87c3db815680891f72c7f7a2fc9f0892aa4c908f6c7c45475409360ce0ad91ff7433be7d9c65866898418502be43c65906bc978bb7b94dbafb0e96e61220cb384f7f02785a3ea0c6bc9ccdeba888337a1f320cf33fa30858ce7884fa58d1d3ab47df4242eeeea2ed90dc8e4dd47d2ecf8d83e1b40fdfea24881a658fd14e2df64ba8f1a3a93c5db2b75bcfe171b233e6358d732402b90c49fa2ba23d4fb585c20ed7e3ace680c79db90cd2cd34dddafdfc918476e803bcd75552a43a4e89702f1cfacd679c9d457e3437a00d1f268f0808d62bb803f8904bec59f2d507073f4aedb81d2705aaf69d4290f571acac862d5a942d3446b6eed08bc4b044fbc60137e6cd7a7bedac09ddbe9c9fb4d6b35180f75d088906204a32453b2666a90272f767588d29c365e802ed388eebc301c09dbc3d41f8cbd12c3f68c014f93e240cf08166612ebf33d247213ebf6a6981901b3a960c97a5a1798edb1da33b856ef4cc876c4d8b5b71ff75d631d1b4c46d7723572b82056b3fb9e3f915134da3f6cb69c3a27f0a1d9de1aa8a7d4ed63f1fb651dfc8c95c39686bb44b160d4bf8fd41ac5ff306a865ffdc4e2388862c0f26bdb0ba40d3ef41e147de947c4ec7a223c1003043767cda4c86572685be88ec33e4a24a115b5cb43d5cd2594e2699223fd5e56d265439f34c533d9c7584e6a11cd02", "5365525300ac", 1, -886154570, 1537743641, "bfaab46a5dac8d8d64e4de897be74e6547604dd713a7d1168aa6c535c967e30b"], + ["05690b1d03c0312cb53c2a3d5ff7366ec3e84e02ce607577cc267bb3f648963d92b42d64ca03000000025353aafe420dd112a2c947ef700dfc236fac680947a813e8b4e8c0f6a989c24a4a3a17e571f7030000000100c96a05730150768fa818dc53e1b69ef441f94310a928367233b331256dc3d6eef3629f8701000000026a002d2939ab02527a480200000000085152536a51ac5353e4dd5f0100000000016a00000000014fbe6c0500000000000000000000000031d3caacf9325bbb576034b8787a15bfcad99e433651aebbca47d70c63eb27c8dcde5c7516c3acc1007b65266c97d0f44d224da447abf34ef361edd3662557bc375a30cc7d109590afd8d988beb33a7303c960fdbd17f0bf58fab06babb0b008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a31e081259cbea16fe5f670774d79bd76c932bed961efda23598968d5faa68ea93f5f52f63fd8de216431dc73769b73d30b2800104e5467f137f445a541ee177f8d5e58a0df0150c5199b488456686e044549161a482149621289cdb5ec96556b7dbfb8f604ba90dcd8697aa89a029c4cced26ffe005d655742186a276eae5103255e8f54927e87099a5e6b0e811d3d06bbeac2f55810dba125314aa31ed496d5022b00a2fac567c0570f666a6efdcc03ce59310d027da5746722f24a4928e38f6f0a037f8acf99d1ea002b4a1f6dd486d26798efc5d349b66a579c95d629370a20a1df2192d7c1f553ac486477ce4fcd336f8a7c2b6da8b6d56bab5ef889b0ea123f032af1dd5c155ec2a6158107003db1f2239c40319d70d2a7a0126ebca429ecca2e0300c708dea67fd74c58b359869e49e30fb126648086f76f40d88b0ccc3f4d6566032a0176dfe7b907e9c67e3b5cb1b9b5a17fc827805641b6db8bcd0070e617b02703271b5ffba20ed313f92dae47dac3c94a693f50b0fc6a15080e0fd0403819984e022612acbd93d39d94c994a602de6334903af2ef8d05bdd19cd42facf566d05a4f0d9cd6c7bb6161b5060f27c5694d030c2245d58770f4a5168ac5b1754884f3836bdb96089b38efa56c2036e004a6c55ab26eae95f61be493708fe3fb6de7997abf70aa779849f201130d4faf241e1937cc2d03b909c72b30744b1dc997fba26abcb4b61e2e3353ca6a8a60af1b028597374e109f950b161fe6f665f3823d2cdc9c440ae5776fe21f4e400afa3c7a1f58a7bd3723b48fdde44334a27e9fc7ee1db5c533597c26bfc94473d3066968d0d8c49f5dcac6489ee61bb447898bc1d7db8955c2d342dc7c361f388692cf9060afe5e745fcf89e859e5fb4a9434c35751d544472d30d9f47ca4054697bd42c1ae5b320b7146d55df32f2dbe2698a5edb34e416e89910c7ade913ca7a0b049a8d55134f40d18c0c73f82ad8745f0b9765b68741d9d4cb03de377e9bafb14a901b8279ac29affa2b0bf260caa1f48ba6ae154e714921957a345e387989c300828415c305f998e4c93269934fb830d23335bebe30808df6c6e464d48e5a702bdd664de99f88dcbbb7cb4ed269611539963d450209cd9da684825f2541bb09675f6d18b9daa8888b51f9cc1931e77c3b2699afef8d2e2fcad23f2dab432b6b9e32fa8e313a7a0cb20fd556ab7edf4b5ba69bb8aaeca65099c6b2cb658592d66d44122fc903a013e8c48a268f8bd012b854cfd5dba69e0e1bc993ffafc2bfc097ece81993fe712c705a958f7f7dec5f26ede6ac812f5e89179eff23494c3a1618797f4cb6571b8fc31d7c3e0a88fddccf07144e21ab6289856f0d3c89d1c7b949b2981457bb3b70663147fa992518422c0a0c86d3db017a07406456e83153084738475cf7c27e984592a6a59ed163e5d526a3615d734cbcaa5936fec76494987af50519058035a3c0356a2f3be6d487e19e4e96c7760e26ee5deb0d8fd0d7815ea229ac7321e20b485f01562c2ef026d3d690413f649103f554723cfb132e067747c4f190a53f93d6287784a3011cc5ef6199ad14c5287e94eadd293953d26f600a6a003dbbf4f09780d0e9534f16ddde35dd66fcd49ad8ae097a5f0ab2457f14323cc4b901926bf987e67fe057195ef147ca1087e4821193bb4130cf3f98f89f679a2a037e5565f269b5035388be8cb3445501ac0f0579d5ce1993d94d5ce3eaa7149a15bbad441c58633805b25c3f839f942bdbfc2f4c7fd367a111b48ae9c13f80ed3f21294d1b859eaa9e9ed065d40665f39a15fb32952d9f3fb690e69bdc4500a30a671b0c75a74b9dbbdba1b954dcdca12677b6ed540ddbb32bb4c1db07e0d80ad0d9afffbfb96b74ba6811270100a7f093b027886b0a61e9fe091175a35186dd1b822be341385a000d651567f5f1eb92d9cdc74b6ded19213b44998c8f0bc05a083529adda83cb1ef68dc7d3d1d778e33f0fd7a13db7b7d5f2ca59fc310003fc977eb0353d0fff81193a10f13a8b6489cdf5c146a2d5397cff49317c6fcb29eb3f327a82244f0e6c4c5f0ba33a9e16eaf6f462173496ddc00bd0bc7a3fcace9f070ae6f1bf4f2b6baef282ac5f5fca0810ae22c08ff90d0630a3b32d0c89b0992a8cd451b2090b6a3be56264e49b0d9e728c3219ae8b7b8e411cb402581a5284ac05deea700bb54468f5949e73a076bc855543f8f8e62f26f2558ebd265f337fdf3ec001ff898662925861464b4d9903d86c3e4b7658cb91668558509f980908469b2f6a01d952f7c57407b777df8e9840ae0ebe711b4a50d09bf98a9329a590a13545c1cfc9da7790448aa5394f765cb3054b8cb1ea51187bb941b17774319e01501c48f806af64068fd6266c548a6a0ad6bb7c1f6a357a72ec280e8152a8c58f0d", "525263635352ac65", 1, 566654117, 1537743641, "37b459ff427884cefce0e4bdc084c53773dbf1bcec78ebe69606fdfd24b3ea02"], + ["4a3fa20e04eb9a5790b97bb7edd9ce1224dcda7a48a4ade7175e365b53586113bc4cebf13e01000000096552536a006a656a007254b67499a5e2a03b6aab39f7792fb175b1db5c1312914ae927579d7ff818d839195b290300000000ffffffff25a33ef5ca3c68da40fba3c3b47db2307a8aaf0e8693a59a632d585dd4d5a4ff020000000552516a53ac39a7b8014d26f5a7ce68668ebae14d30b127ab06c8ca2ff9ca71a15ab7657458f3e553c500000000066a6352006300cd99f42803add254030000000005515252006524bd58050000000005525100635210e6e0040000000005526a6300650000000002c301980100000000000000000000000051ca70eddcfd9ff945df8dff4403aaa49a6df4045d31820a5085432dd10472bf3d558d272d3e85d5810dc3938e4f152d1cf30a5d38b281d450c4fb64020a5a43544ef63bdbc10825e1a6b71dd87abaa6ad8d804f6fa553539b37b8890b84095900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000599749e97bae7997d00d4042fb8f7f98c160d9839695a5c4b0cf139eb43074b31eac7a02b7be4fb3e6a4acd8afe6379aeb26691eafce9352966110c380c90e9dbe120a8ff355a5ac9d8dbe7b66868e6f99079676ae442ebb3867e87222bab1bc4c069245f4e5314df1d372a9883bacf4ee375b58d0159e78c1da6b4eb50b0432032b0133db8313492d32152049be84d2d3b36933e5c2a746da21cb34d66340959b032f17dd12d1ffbb1d87679c1deeab7241e73d23ac22752758a9ac040cf107a0910a0753668f5797539d4a9c214f170b34f9f252ea6630d7af933a98229367edf35cb7384402b9b5dacef2c4c1b8556eb8a9dc21a2b6d98859e1c7d8c9ff95273fd8021c668371067010a449ab6f3494706017ed80ef7b79612d4a946fe796d6acfcb8020badae97c3b167953bc154e94de9ccee67921e667d89d59720031810f7772a4c0308abd1763c5e62098ae0da3e20ef7bd58958e6e82ba9d69175bb2e0dbaa70d220309c667eba8dbc6202afc22f0baa47d14b5b7aebc297d4a5151bc9b592c191659022fe5de79dffefee22f9c714ae50e9debae06ab02c81f3203592b684df9693b37e476a2cfc9d91daeda5e42a034697ba8b74840bad34135bd93618cff2d1380943797d5351b37ff4d94937e25f2794a1634e3c6b0e14c2d0027d51dc4d35f9df95efc2fd7bfdd6c085ab83dca5ee4d808a08ce63a0d6391dbf74bb2ea154cc2e3a0f518855e7386c9d6d390bc77d47d16cb375231569c452c8f942f690c868e678366646c2ea64ece6d3436c9f8cd3e71dc505643ed896b6518efb0bdb7e41c79ebb845c54a4ccf8067828cea16bef4b29ea57bf08674a92071cbd40bd77ae1b7d654a6cdecdabdcba77abddc6aa479a580c70c2dd11f7632063259f5212047623afafdce0abe31353a846e0d0521a98df7f01339008ae6fb16639a6a1902db8e9eff0af692e20418277730e01331ac22d3109dd7220991cdf50fee52dcb82c50fc5c9d2d7125761c23e61e006ad38c15078dd82fac776b4c1cd9ef9110094cb7ae71baf0cffa205ddb6a2a44a617dea7a27cf2af400c604cb21dc40f1de0267bfb2a7045ba8c5f2bb5cd66184209aa0dfb4efc4a52a128925fdda6ec5b501649ce16a83d9f1a1cf7a2918d6b1b21e9cd1baa7284c273598af84994b273ebde68d470c78c31f73f17717bf2ca480c9992e0d01c004d3ec1b803e7261f3baaa1618d7621eb07a38ad7b3212626b0fbd14278c2e2500e5217f9592e2bcefc4691db207db9e9ef43fa13841d8a9a647c2987433eec62cabe40bdd1bbae65545c398c330151de891949268ef486fa122c4c6a6ee8c02b1596f2c431665cd1f509b4bf691cb80e8d26e0575553a809385323fd142117a1fa6496c817f65dc903a23302d96d04ba16b03340d8c2b9178f28de258e9195ab68ea980508114f6e0640fb6d199ddea9fc435695ea5f61af9c850302ce5eb401747f42a2170058231d87da960afcdd678606e72962eb7d6fe5ed1445d37cf05fa76e26818a8cf0a9ec0151f6c67794c3150d6fdc61b113952b79d3062e648e755587e738cef0d838f779a6c55e7f9b971431f1ce533112893e533d6342754b01c64e2224c1a805114ef8f36debce30536e0331bfbe9ff77f8f149694e86a3f5e7d3fdf1627b12cdab42f41f4bd853b02615163e042af2cb5fd9f7ce29946e6d526de4fc02198935ad9016d5086642ef0c1b6deb59a1a1d1c131e55e48351d9024bfa723114b8a4c97ee106c991f406206d19d898bbc75ef63affe43b06e4df625781ab9bf7d15c8b0b4d0beaf746bab46c9babdd7cab4a26e7894e46f2bfa84a2af4d0feed367dccc7d3b6937974655bf6b8d5d87782f2fe64a03f5448bc971c0dacf0a8031230bec13296eb857f43c51d39b094fc9c0917388392633ef6ec3aa323fe63afaddecb5241b103ce2ac94db87c3e70886e12370a48a6eb06074d5d507ade5965c9b615000d9f760f415f4b9ac51b45430366884a2febb16a099267e92dad5fbcf767ec798a2d4d124405d0bce8b3e8176b798749e315218bffe61b4d901e5e6610ad90777e229b46737354765e34aafdca869f7a68627562a59f4c8c704aef56285e239de6bccd64105bbad930080e7781e53eac434bda050b7d637b4b20c5c26ca7f4da36d0f7f768a4f3acec572066aa3111397cb0dd9660b7f31a37fd3dd2f3e546a064b1df5b44324aa3f313d86b9348831dd28eefbd970ecb2fcc3ab2dbfa5104a6513a3fe21d6bd0b3576da611d8790285af05fbf726000000000000000098a6b90200000000b6e725ef7e856c6958b486162716967cba860a01479833abeaad6daf147e2669215c77a01022104effcf4a8375a121a27b1db288c40bf0f7bf3873b84e088d618484c66ca86e213f90d5715c32e8729b6111b5a2594f11c08e38c2689369bd2a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa7a243061019724a92b2dcc7f9adcbcb0bb2ea8e0cdf03056b6dda2e3be7d5cf1e6abf030048ff4fcae6e294c41f557539486180786a652659d475d2ab679ce3ffb0747f611342aa00ccafb0f64737856adea302d33d0eb312dc10826f58a9b2999d9b2b69745073ef039803e1be0210f8c061d39603c79f30e8786e1829f53022247873c840dfab6f9f8bade3130f151dcba4d57efc68a041621ae7d28be15b0022bdb41b24724defef3726e6893f3a4c0e5684bd755d8726f9fba5833ac0542820a02c16e3a42af8e8ff2d7c69f08b92553740dec860273a5879edffd2ceaf156a2dcd4f95dc8953f137b6e7e71c73f716e0b0437cafe1acd5403d798b488eb57a3032451b70b387cf3a0481cfed35eb31f79f0da068cd092c9851db943155cb0b17b0225802ad3d19bb74c446fb86c388d42470ee3f3022d4a4d7c8ccbb33c7cec6d770211780e9e80815a4e0e37464dd03a313659f6287f0c7aa746fd50f649bbe09fd502181c1e80b18332ddd4ee99b389cf0b3100d4340acf597f3f1d9e5bf07362be8703186e5128631c040fbd7218a3d2f7221e4d0fdf2744d74c386e58a7fc0b90bfeb08a3e743b7592c38a347a2b9374d5c987cdf4252bf3efe1718962d25fba8dc3b966dfef089d2ff78423e42c7d7825f3ad1f66258c7076730ddd0b3c0814dd4af1b33c625b38c42b2679eea477105784ff3f5837cb268f54f0a2949bd6e56d1ef3bf7f4d82cf63bb424f75494b757a658de30836fc7db0b23c52c7ccf6022fd6a65ad254964e5fd412de9636bd574c67f5b12e2e3604f9e3f74e6c889508c5b345a92207345715481847507cc618965e0aecc032d2616e0060f3a607dd883350b65901576efbdba3776b7d668ff5c79e0f1c1ae6bb451e803de13bc451e1bdcd00cdb94162a84622811d8258b162b05b9173eb3838da36fc3e26e1e6d05b5e90a170a99fe966b5928f56e5124bbadfa1b01ff33d134783fd173e50f149a06edf51efad298cc718c622869dfab919a048e5b0be479107bbd82ba7179fb0dc8f9a79c28afacb0fe86ffc11fcdede7bff8ee40fa488dc6064deb4184cb0cfa7424380d6c04b1c12b13bd0c456facaa0dda8b8bd3870efe45d4950a4d69041d31cda257eff84221872b9ed2f25f3f1666722b68e5a270c9f939ac3753cb36cfbbd91a5a5c42e8fe172bbb5ce528ba3af8035d70dd003bbd7868407ae2aa883664ff9e147b0c6989ab1ed164cbaf320ae5890bca14006eabc39e8d37563c245e33b283539690fea44f894be2ae7762a109aafa5330011191fd722961a85ca1063b9c440eb8e21941e932f8bb94fa7c93e3c2475a11d8edfd4dee1a6e83ef2060a43ca5adb7187f2065080f5fde07d14c3f12c3f07749fc6ea7e14d6a8dc72cf97aba24db97e9d77b1bd290d6bb8856ff4e5e8703f7fbde2f802ae84348d2321e9c600eb9006adb6e0bd41d4a94ee458c60d3dae2f7382cbabf69d7a84ef0c5e4b9e932bd4c1ac18b0d60153dfc0ff40845ff2064d9c0addc0e67a7297641ceea49c76da7ab5326db78c9b98c5572f8ed6c97c29d791c23e4217f49a192dbb3cd3b8e9aade3a1c99ecdebd7f0648298a1877d32aea17e0a9c85ee1d891dbe2116b2995d764c2524e7be5fdc6fc96da305c14aa025cc5af2192e3a24f0c0696739173ee0e306a0912e38109f4ae220736567a454f4a3a2bfa0ca45c1b18b3f0e8ff263afabcadefe21ea79e6d8d9c689177362a45f9ac91bb054b8cb15071daefeea9e382a9ef58a52d454e0c2138feba14f681065d59d042379bc8112b19321b1125979a4c8c7fac80668acbbcb726688f4ff0fa9338c4d8195d78f3a3760a37c6145bdeef5a2cd9cab6717e884e72291b9ecd350a97999fcdb21907b68b171aa8aeee11755645e14c6167abd530b1fea9354f4a8523f4b6130a79a9e09ffeade00121b75839f348f82e384367da85f2b0bba47807132a9c4e21a13d98010baf01ff6cdca1225a573f7947c273c27e6421f0a333f4f5ccbc596d909bcf9931b78080927e5cade380614912870a254640de54b16c2cd2e8dd084658509e92de70f77c02d748c257a6ce79bda6f4335b247c01863f980ac904bbee3a915007efb942b2559b0ddcff9915bb969933001b12d03e9a0f83e27a5fde20157484f25794b1143053e3465e6779109cb08bb0eb1319a56065a0e29042b1eb48422e17e9e1ca34c8a16875517bc097f603910799fd65e96ddbd1a8a5201351b60e2581e1a89d49ee02f00109bdecc00bc500daadea8a4168682c175009d6c206b82ecbc3c63abbf00c752760ce75e6829a45ffdc720b01cb41c82ff20e5b12841bffb141a96f4287822784796d979bd1ea4d523ce3e2d5925020e334249756c1909a52f0463b19fd7870eca1d1061d57125d369cd5e989f7a0807", "535300656a5200", 3, -881347552, 0, "e5305ccf2365cf6bf9bdcf0ed944763dc8a3de5ae6eeb03bd54bea51a92c5d82"], + ["0e05400801e255e9a0d1f8f499c6510f1392e7919c4e3a0c9049741e4c6300460013c2cd9e010000000965516aac6a52ac6551e154397d033e27c1000000000003635352064dca030000000002530053a9040400000000045352ac520000000001da5d78040000000000000000000000004ffaea1b4578c918d6b5fa106505959fc7f31a323e396e18e072acb127999bbf7db000f411a2f34bb35a0a596064e0c7649ec786b8e734fec144bd1c45f01ce81cb1471231fd2f3e2e3771b15f7b2ac1afa6a1d3dc29dc07b81cb3812f92aa84000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006bb0e0be89c11191d38467fb5c2101968915ddae8e525f9376619ba7aad21a2d077a4f03c62e69da9202a67a18c205b75f303af53fa98be4c3b58722e427adddae5b973c36993d35e814de8680f69222313dd55ad1885d1abdaf5b48649a970eaae1e271d949bb6bf9cf7a3ad8a7b3ce16f8a19656962dada5d73508318881a5030b576e9eab2d4b9c3cb89fdb1df5f6ad46163aed3b6720cfea524aaf585ef0d00312a3d45dea26466c46514967382afd77a4fabcf2bd899d25f0b1fc96a1fca6230b046d4c309f8077a7b3305f654b88704df2925662324963dbd15f6f777aaad08801bda7907e4ed63efb2a9d3e3fbd739e62724cdf04bbd417c9f346147c5cb84f022d5fcdca72187009fa58221b29a8c4d1dcdfc91c015228358d892566b7665e07032b00bf42ee92fa5bdf6c848977a4b95707b35c559a071da515605267c75397fb0203095761edfc4bd9402ee1e173b283b23cbc6b9cb49d262dbbae69b6382c39ff02152e6809d1aff00f65efb90dc7c5b93976f641a04302a37d2b9f9a1cd944956803091c08caad3c141a03196427278cfc3a45e22f419acacd731f17e4bf4eef15e0f2e45fc6f8f04ae79374d690c81d507eb9b8facae99bc66af925697ad0cb5e3ac2c63077a598f1004a5d4a454c0dbc4271a89f8000e9fda75f5ec8440b7aa330f99fc1b2619006dbbe027299bc37f41e76c82abcd29080d86ed7b1ed9e3c40c80fab6f4d22bd172b50e72089cacc3bce787ba032a78fd3370e5d8f35bfdcbe296c266f0935d3ca4b7b0477e9506879437074a06d7a0d39844e693edaa89037ba1a4f2a507dc00784565468e33121652175e0ed0a2443a216c80c5d011581e64172d914fa3fcbf1df2dab36f3943f4e5e8cbf5e02dcffb5148da255ea2b200cb8c6b362ab774aea4329ae33029c7978f584f9cd54f44305599fc5d6121a15bddf19865f7f0e48fd7139378359b581cbc14b9fe123e3d7148ca06a3d14cf386720f2d401ae8615e1b6b97c3ab763f8d2b04ffdc2680312d934ded4f4502e9d5ca394c9bdc55247dfcc819926cd37575cee4868c86f03d1ea2d8c26cf8a469956d0e4ddc31f64055d7669d91818b5ec8ee675dc93da9e85a1eec9a7a7e3e3a270b84744ef932b4c7ac4265253f091224d0880a21fc95c815c93f3936e48bc8557372d02fd59885dcd1c2330f751b51c58f21ea5b6060d229478a7d0297b2ae645e83e8e347f919ade1383e95b55b92433c8013cc095fa9629526e37ea2045d3914e3ea2b8acf4a9a58c77a8e93689ea1c46329984c143deb7fe9d0a4c81aa9e23f4b0bc36dddfdd84884f499470c48cd23aa46fdea7995224bad7fd0366d3dd958cb3c221918af0735e69c740df164dd56a439bc30d5b48b57e857d0ccb9e5892b55e8dd73290df9c255f761d2a94124290b53c32ce9cff3aadf8c41ec1a4331e5b4933b8a65ff6b6db39c6c0d61fcbb09dcc84e537590537eba0255b5c18a9398daa74fcf9c324b3299ae7b6a5124e688b632e7fc28bf51a5cde3f59af81c335429ce3b2b362f5b2fbf2ff5b1817327b896207bda926b3541feb7f70e81e6787a3b7c39afb91a47fcf194fb4aacec1d40a7326efa222de9423a32e0b9a40f544c32e82bb247b0482de2dcf7eccc1eeeba111b380e055fe691974057703b3b475bbe426cdb0214b0f18ee079462a252df53020d6cf1f44ab17f03b2077bee18cbd2a6d6a0b3142a961ef1450f16effd8f8b0ce90b9d4be3620ca757bc950d096728472183b207550d6cfc99afc5dbbd0314c13e3980618def545fbde5cd5382d4c2a26c3d076e2b4ba2536ef665956bbe9ad36e63b678ae2b017b0c74782cefc1d199a9857a567c57e836088b9e534a8db17730e0ec7685111b958a75a397e0731830bd7b67a85df28fbc715dc6a0532b602a30ca69b3e645083e18b5c4a4dd4ad4221fae71055de24348e39c8cf14d8eaceb483f5316d4b6e84afd19ca6fc6e6275a4a5643c7f0ee7ea75588b934375f8f7620f0c74131e6cbfadd67296a7ede83848d6f7533c58940b6c3d61ce0fbb65d223d49318fa7d81959677f5d85cc2820bc26237a3f0d8b0d2778f4a3b0237f82722bb655576c49c2eb6178819e3bc301898dc977f7de8b96bd43f502793aa31d0dabb37cb10a64497a25c144947dd24e4aad989eb7216936210989f59d5d06ff579602b173b35edebf8c766c0dc620c96db179a03df62055a16ca13b3b0b4e3b094a33da84f61d5f2e376cb10e3cca008748fb258b32a3e713810cb1800b1a9c7ea6b1c3c634b59eefc612c018ed0d0b42d2fdddf1ae460c3dcc7cae10563ab2c071f73ff94fe446ec3b6138fbc8d8cfb0d3cba5ce901b65c712bc257b17644ab8f4b513c8b233cd2c9e0d2c96c51ced77eabf00fd39de29fe801fda7095c19fee0e", "51630063656aac65", 0, -246848956, 1537743641, "6b304a56710eb78c13b8656f3902862cbca27efcc14aee61a12f8d43f6fc62c5"], + ["030000807082c403034ca865b3501945ce0d53c7aa53940a944a94fb5ef440a42cd4e44e61e277cb530300000003005152ffffffff43a60ee0d50aa3ce074005f54bae981e9996c5fa1f4f4d3fd515675e4478900703000000026a65ffffffff10cfcb3e2dc29776f58dd01993d4a355ebf1b000ae297d924ae21faf63a801c603000000055165005300ffffffff0135e865000000000009005353655153526a52767e221e00000000030000000000000000c13fa701000000004fd98763a0d6b6cdb304011e2a5e693b63d81ddc05478fbed670eb86dec868910069e309176713e914a806916a81d596f8f7e9be98921c510f095db4674810146aa55bbb05ad6a112dc82c1cbe60a836ddd341f883c452ced12d7a731829dd9800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000939c909707ebc266c8624dab2af3dc245319ed3cc62260490adfe6758a49e7e77d874f0ad8743f647029387ded100b14e5cc3c210c0ffb121ae242e1930b2877f9481e3cae0b5b76b864a4c55eb68bc5fa4767180f32f59701c5249eaa51682a00f68858aff3e380ad060cfb503a694c8e06fbafb90fbe41dc07d50fb579cec1021efe85c8b41607fc0518e811575a2055977131b8eb7cbb0ae270adec91d8136003023e91e99b64bf7036ec55afbd589b95aedd3ece499b66e9409b4f9043ddf0940b07143ed981d2f0f616aa79e2642d583dc4eae2879b49c3ce3374e68a6add286c3ce4fa3e5caa0fb1387816458018fc4106b23b08dd55e1f9e554efdaf73df3e8031a1559c067327241220c6d67b6a94176eb9586abd99ee3cacb43caca8c0bfe34021dba2371f7517145090167fc3f277320f642530790d8e638fe4da61735e337cf0229ee33a4d56e79018738b1c514e91b54e72d2d838b3a6aa33552b93acac570c1031ca27c110e6717c9f7481e9fe40ca0744b74e5af3638eecc77317377d88b7b0502172bbadb4dda03d4eb0e308260d152f5df3dfe291fde0f2f52ed04bea7597b653f34bbe89815170fb1e8540b12d7efa7b4a840adfd2ecfea5d9f945b62532f37be67e3a1e7e8abb7d137308eb374a99ee10993a3fbe71e78d7fd5928d174f345737312aaa1761e80299d5f031d14b5946bb0edac5b61cebfddc185ec28dce44cd67d4a414b3a0db4cfbf9ae3d7ea164e2b0508662a9252334a944e8e15ec03d0ad91a2f8bdacfc93bff76ee0de8d504c0241818ad0371796f72766bbb283674234d4f5f831f06cf6e199473a86a9421218333547a164bb32902a08595ce1205e709a4c981d2e8bbaeaebfce505373daf494dfb559c4c7af09f0663ca527c3d31e4e0aa68eff130f94138576b7239b3c9a7c5ebeb9c554d0eb12f9a356f2f13e0eb89bad7209e157849ad53e118f8158bd23aa2eefa7fe8581712c85cb4a2e2609130df8476a5b4749a30f16500a6f55381510d0226d4d41b5300fec7b49c1e845b8db9f54f192055514d14f521b90106d7506d84d00c2930c9c3e6a3838a680f2ad1a1a78ba7053dc9aa6cb8e422bc558cb6162cc6417430a25bbb53ca5782c78bf6ad6f26954d6301dc002acd993037f4f6ab461a0b3a2457178c778850667652172b30226d147d700197deab4668e388ab0c8d444e07af2010eabad680631536a99283463dafdede21e904b2a9535c67df827a2b8f1ef82c8c9db95dc0bd30c2102c323edc3b8a436c1a29ac66b7fbc0116b9941f5579424ef90387daff402bd96aceb8ec8b435689d9726e226aee063053bbef37ca2af886575922ac499284f1b2266c0e3f160771332936f3d5954efd69b49e3a4bc01f4e82c465365a0de8495bf2f6846036620a02ffcb286df82bc153c5c5bb76e232e88f45936493149945bc00c508cb58db86c3ff26d39e5330f42b7a40d3fddb75df95883a7f976c6cf068749228f58260e474fa014e3a81ab75fbce9dedf827052b76bb6e98f2ce02a875b9827c0060b4bc46a5ac9fc11652dde450a642d5ed151727613b62e9db9e389c640501842182f6941cb3fecdff464fbf4880a1daa6d7adbc63090be3e1539636b332dcb7e495e9fc81d76179e35092a4dee0581417ecd351599e2cc05a36ab4c99e5bb85fb4884fb3c411d1b04b4f523b798b886a8d55e7a99f6f37f8d5533adcdb720d8d815e3ca7ce35a1ad381e4fd4816d41c1155f22c3b602d69e52204965b440778dcf0de8c81fff9501fcddd1a4b7349680d0980bbdb107b3464aa46a306f94197a5ec3d65ee3121b7c0c56722e50fe25e6e3a551e14c23305cda750e1cd41171184b0e5952b380f5a4df706c5a8fb8c83d83463417e1ac44c7f1fe499188d007db914e20cfd0b4bb06e158703837c572001da6a65d61fdd17efacbf331e7e10b8691ea11f977b32504b3f5d94bdb80e586db98fb463fc10e3dba7a1653ad818867a7fa8e02c3b34567394b4dabb41bd983db3ca3c02cd3b500499e92404a3850313b4daeaf3ff458e972a313b94cdb4258b0ec590af414f53ec5f2573d0ced91b150bd90199b79bf4dfb79d94a8cfedc02a16bfed3bde11bccbdb401bbb1f07fd6d2da99be02629e129023311d1e0f023ff1ff03016482a3515288ea5125a1ea8b79858d977ae025d003589d6149668a804d853e6f8cad0d7d880829a78e5e070b18ffe8e3e4daca779d889165e59c5b0b03a30de393d8acdd3af753207eef60f433a7912b31e2d9e75ad34304cc56010000000000000000000000008c7cbae74e85123fcb5ec59691fbc78a6876dc00a548f14af8f27c5b6be85fc2f5ecbab9a32cc49d19b05ece11e0d2becea09d6554842e9b83edf764a2c1eef1f9e97a9c137ae380dcf6b6d20bc5cf863486138539af290b32dc86cbeaafc758000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b2092aa0060051d17a82c8e2f5fb65f95b03b94837557f692bc918f767d96651224da972ce08b23bb22c86585f18b23edcd2001908ae2d4997b9c21df4a6203e463008a28603b35aae1f7e437289cf7b0b6579de87b1742595cad9edf72ad660cd42bfa142eb738ff72cccf3af85a865a090984ecb9791bfc5ff9b25623a95f0306140203b0d100548d2a97934ad69c93b03a88b84089d8532466af86e6526329020157c9b91d357f9727fae89e952ad007f6c93f5a4ef86e66d28b7cdfa035a43f0a0451afd0511a5dfd17be5f75a9bc2fc49fd3eab752188f856d51eb26d23eebf23ea12064412a2255466d2205dbd51b09f5d7d04308d6503c92c851a9e9b6defd031a08b27d1b3940af684fe445f43c7acfe8f2802ec5f097a73638a3ed5a2d4745022b1a0d00a6ad99c41f92fc43638cc54a78aa2f8cd42f66598b7f26fd72b4026303174d57b3ff2dcdee06a39f7bf6fbb7b6c973bb88e7ddb4fc5db71c32f854418a021e7bd813496ed628b6792d75b3c52374840dd9104818cb768c8b7e6cbd7fcdd20203b2a9ce184d292654eba4e66f88e9b7a7d4958bbc1094b0dad2d274784bd7f049fb09877db1b51b83ce6ffc9b7a2bf48249f26d4c053d319c224752c50e422f6c3ed659ed57e4831f7aa9b1465f7369475f81651f59f79290098fb458050dfc96297ad3634832a8b3e60806a76ac0c4e4d9933671a09a8aeb8bcbf13b0197ff4b379f89841ea77581ffd8ee7b9adb3ba63cb1ab6ecfd2317abe42a30f3bc2e28c92ea7b6005f6a05b5ae457302f492529593db41926e9c5375feb78bdf1ea03f45b69e3ad876f4d7f6ab2a10ccffe61c91ab2de221a087e7945fe29b4498eed048fcdb9d2179c17f7aab22d526a23a0871f5140732cbe2f357afa51a13dd0d06652d2114bdc1239f9eecbd61d47dfe78a33bd45c6737e1b354971fc655baacc3742cf72dc731084ef4b813a8840f611d28ae73e59ec51d9fa66dc19596e2829ee554599fced207f01921cff69b9ad65d26e8b423362d8aa62be97f613fbd0b4d2fd9b08a486dc2d5752c4c1c4a89463edc590210de9bc895a32c8a288836b4cb2d22832d78eb9f1e35f699169ae9fa72776aa2630b5dc334d081aaf4c921f6a5aedbbd24cea52af215ae256583e4db7f9d580ef8ac3cc786664f2fd7712e9725b9e02d8a8c0aa592de2cbb7e82cdccf45017a79a512e97a8f750a76df77958294b77e3af4185d5818825062e4b0964a247035e72913eceb73f89dedb5fa097e8851162a9ef3a1e8ad34652c11ed7a52b997bbfd13ab68a518023fd3fa296cf806b848485d9efd55a6f2ee818225f54f1fe87e9e9415f9091ef66c0b48558dbc8d413bf198844d2fb205f94e177e6be3c65e23f9eac6d92c9e3b8dc90404258c1c5424b4de2d35c2c9384d59f1bdf8e1540a70fa95ea06bf16582c0a1b068042545a34863e7c5de7f16ff5ff831b2dc6f339254ce9b32c70004c1f6e7163a41adadb9a38235966d18cabe7bcce48711ed747f35eca36eeea775bf9e73f4322dcde4b9840890ece9f183f3fd4ea4d06372ee43cdf25e757467679c2a5b4dbf0e44044097e5331b9d03199d75c93db86f8115fe540f3bc05a62494037990c46ffaa37c6162116144cd5ebc972594df5bca9700c0d073b1c9fcdd3eb642d8c31e7ff6b975bd364c5cdede4e79b64159dc21b7c3ad008c7e0e9d4f8b22072d6faa65396b2cafb7f3abd17086a39299ecbe0eea43c1e3163ea21e6a62cf99b817a485a7c53205ec3d861c0f9b6e4d69e04525714fedb1e5b68fe93a15a7cdd9d5bd4b6575aae3ac26c2214c55e626b4732a26b8a4b24a83a27d155cc0a4a456e12b328f322a85c06fae087bfb773043814f33cfc699a8d35cd40f9e85f0a9a830c72b76e29f0aba1e282c47d85906436dbff4edfca3dd9e5fdcd33d057daf761ee407e7fca390b436ab9ace8e3b5fbbb04e6da50eab153f022c984a8be7d26ea8a863ffafc46de9f984f186707ba80362fa645b24d94febd3157d0a69e2430f16ae5bd49860a1ecac9bc8ec2208f557065ba866718a72e3e2f09f8c09d90b763b595f1627aba32e92ab1e601633f8e983dfc55d70d6774bb2113b84cc5c411b487a654165f4952ae0dc9c65d5f2b0addc9af0440b25804ca0664578f51cc858c296a994cdf7c7f04f5f3ef7a3e664d49a1e8e265567149f3f8fb9db511f007c9e40f531f9825b58ae5a163beff524b3e6a45f7a10cee2c656490e98f616793cc1127031ef1900b0caa61c6cae5a55ff21dbd79ec1dededf020000000000000000000000000485316fdbdfbef38179e14ed235387e5e5562f38f08fd205c2aaa135f2c2f7ccde5a0dac877ed76553ff850d260391a0e8ab541e69760ea3b151901d6869097c7a0bcfff040fecb7926c364fffd4d906cb384ff135bbad9cfa88a63edfac2a2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007044972f383f08ad8a449df1bdb6b0f1ebd472fd3b5f0e3bbb886896747983622b3382a5a9a384acd546a0872ca9e6054ec405c4b4e2a74aab3f47ca1315007f711dff4c72eeedad03b25b9bdd89bcef4c9ab2ff82a6b2987d97da93a70b3db25f92ed9ce033ff8bd08a018264fdd4df03a9d40f12246dd907d421baac838952020305ca35183e6c3f6055b146a4a6ed8f7be977852b6d70d276ed64348db2ecdf020cba3bbaea73d9095fba8bcb0979419e209756c80a23530307322c40247aa55a0a0552ace7d23da034a435a25bf36c437fed992f7866c058ff1d79af09fecb89ecd1926deab61889fe9ee19bbf929d4d54881f58810db87a91ed536a8baae9abb4022b19e0156e617bbddf1c17468edf1b8a1449f59a88dd4becb24fa990c55b734e020139f06248c2c16c98f46e5b52b1ee655c5abe6c7b88eeb990867a0fa7978c5e0205657e7bf8d790c9f8d56cd58d061e1dc4b7016d82d0454eed89eb507183cc3b032ad70e80ad48d95d30cf64d79d05139cf1850e10a9dca26f7f97d88b9168e80a0218a918cb398b53ba3df932b0042201370febc61ff12fbd2d692e6339e3a2228eefc2eaaf9e94df53aa839c80a091338157081d357f28f6ea6e597c4db697d56f0eae228702c82ecdb800ed86c184a32f8f4068692d43d940bcf7885eb5169ea3260f9a0a8c521c3489d72427d6b83a527ae496763daa8a314d2a91d30d3832e375751ededf144c7f646bac07f9bb9e16075d8261b17086384386092a14a8f587cea75f175d9b22a9127b2f86ffc9d1a7cf9a6b6442c29540ab6ca646dfc90d174542fe94355d64534d0a0534296de7a5e146c4d1485dd8b19ee7a91dfe1517a69e824338cc965d9e999d86fc5e33d7a2fb28789e4fed46c397a285b1f598156ccac4fe5dcda5ed7bf29a27fced7890098097bca2ea45085534a79383869c30a25d1654a360a159a06bcc4d217bddb00b61959b14c01d8f619572f6e50fec68aa3243ce7f057b0d42965721803ce5042e6d8872ac0de4c4ce96e3babeaa67e41b1d77071107ea0488bd40409cd8d43f802452e64f92e4d05ded375c5a26e41f8f2e0037d26615d30124ce664967a86901b19aaec7d947b74dcc000b49258e7a6b3a4469097a2b3068af38896208fa44c97c6132b1c43d4fa46704d0a6d53a7aa555d7d04ffe45f660f159f9cc0e82a5c134aeb8dbf62d60ab2ed80a6b0125685205b2955e5c500f83db5085252211cda34920f970c5eb2da8919e66a30bf2cb79b9db349703693afa4305f8e06a2cf3309f1f130705324e1544b846c91a575185dc6a5db0267e8fc9eaac245f202e6a3e8417c64fbf56f54e1629c716cc2698e850a4bc1a5c1771defd532ef3ff633a9b5dae8ac2bf199f19c9f6f4f09f1b3861a9402322f0d725aedf090ee9c5079cd42e87c27ce5aa0a2af2cd0ec4515a0ce58aef26bdafa224c54bed1dc103aca91946e77b51190b4446c390d0312112c280de6b6d9f723edb2fcc1fa95b35f02292f87d6154a7eefb55046f636de5c9e08edbbb17a451fe33e6413464bd512ea8cad96b13cd5f9a66a4c5bf37d9e5d86ba2ea2d1d958f243b655736cd5857e2e552076d3db374a457278bb8240d240f37411d40b558fdfac7caff9b1149a6375b3663d7b721f85935f54fc3607e0472ea547bce98c9b1552386fa7e7cac860507c7cee40b1643a770a3a1695d79da58f2638115862eb63d29229e7e41a86b0f858d55085c486c4a70ba8970728e3ec22c81d9c063b56e58db84352e4479f5e4f1963a7c3562e27b4905b433c9495537be42565f670cbc9528844c40e75043e543889a30d6d30c0c24a127eb08f06c2287de8b9996532c273b9d375e92ca9155030be0bfa7c0151540233454eb04a62d6ebf38877c8530428f5d6730aa47c29d99b9c7541138578a0fc3cf7cd8fd6fa82ebe823dc497967e3682b41173987d63f47732e0161656c9d5977c4059c5389a959e22a7ad39dad183ad6941661e7462dcd868b306e8da4901bf7bc8255130b071f2168ebd3565821ce4bcdb1a24f98f346701ae89bda0b4b58f76ce63f63ddeb1384cf79164b32cc7184385f49b717e02b28ab2373e9cdfaaedddf5c178b4e000dc154dce428f04d97783e5e8fee232a735f9fd91415103cd026381624ffdc25dd15d6348a6f77da861a1b3a05c94e51aa3fad612e1ff7d21a335245bf98974932ee106f42bc9105191cba8e7c08325c04fe9395b767f311a1a010ff407a9e61093fec9e243d4c8aebb9abd047af50c30adbf3e29d58748f1cffaea05fed285bd19d98f4ca8b03225b4c8cc13ca42b09a2041687d609fe11ac533e01e7611a535d55eae4ce8c6b06ccbbeb2b067c605edaf87111f70e02d576fc823f7bede0877d716a7a6c3985fd7957d763754951c9b055d09", "", 0, 2118459688, 0, "3b0706ab7d70416047ad839bed798295f2a3a39405005ec5a4bda32b9ec1bd04"], + ["d7d3ba3101c64c4944fa0a1087756a1a796831f6d47357ac10caa7cddb91ee5dd8695d3000000000000553ac63516a0b52c0ea01d8b473010000000000117d340700", "516351ac", 0, 77313838, 0, "098e7657a2bb07ffc05849bfc7a59f02b3f4024cbf853588ea48eabb3e5789fa"], + ["030000807082c403025d6c6637acdcf641e82d3b9d6fe507776e75a8ab4ab959a6be5e9c057c56695401000000085165535152ac63acf199203a491f76a78d2c76d09befc994413e1a8d03144d687e660024b36c302dd6c4e94b010000000652520052516affffffff022eb1ae040000000001ac869b000300000000060053ac65635356924ecb0000000000", "65530065", 1, -562238084, 1537743641, "f94476822df5e209cb08a6791e6d0260041219cc0d62ba20fc9602017a1a880f"], + ["030000807082c4030389f0625f94d65b62a03f664bfbebf5dbd80c7c3c5b99b4a5d5d641bbfa1abd8f0000000006635153655265ffffffff9bf5d723fa799a599e2ab500fe0368e1cf0f0b0121e7d066e330b76ea9f0d13302000000096a0065acacac63acacffffffff0470f81403c90aeb342bb91c17d4e83b3ec35af1fca63bc377a04e35a760322002000000003dd6657f036d7cc2030000000003535163c51b7c0500000000046aac52ac1e46aa01000000000553526363656631c618f31af8a500", "6a51655265655152", 2, 594957091, 0, "c01132901397b50209aada1dba4f2f398383a2d039c446681566a6c95d548f1d"], + ["d8c6484504ac1d91be3242e30d7f60179dbc2ae35d0f9bfe4c83a6c98aea568412f619e6670000000007ac51515200516a9813dd76c50be0ae170ce155cc84935a92c1d7eb606930f6dd80dd6ef87e1b25e08dccdc0000000007006500516aacacffffffff240400aef0bbbce38f80596ab22402b8cf919dfcf2172656ff2db01af7bbd3d70100000009ac6a52526a656300acffffffffeee1d46431624459ef5fba8afeff7ecc030ef394931d104c75ab4cdb1ba19c33000000000552ac006365ffffffff04a7649a0500000000075265006a65ac63985b9f050000000007ac655365535352678e73030000000005526a00ac6a6103a5030000000001633a67d7de025dece804000000000000000000000000c03f61eb17e859bf6cad227f2b9c17050fd90ba57d173a8557bc08539f97111a6ced2f0f18e6e82d15c20a7d229307ec7bee78b24af83b5b6781ead029ee8dfe57aa82600cb1c58e08884911c005f2689b31178b6895be6d42609a7a89d8a3af00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2780ebba592d930cf791443f7990618983ecbbda04202fae95d6ccb1f27e540bbf5b883e10fb3624ab1ef369cd3d3afe3cae5d5c52d54ce66262e2afb16017acae4b7d5917f093b257954cc0c1218c5697796e2711baa45a504e5c5a1d7478893ec716e9da24d0c8a07e7db82147daf1f717d59394005e90ced3b1168d4c6e80303844219d0ad4cb8c87f482b07eea1ccfaf3c4129aabf689db5b2dd159e1d47c0305be1bc2a07b5af851c1b88e071d0eb55103ffc7483c552359853381a1d484f20a08f0794ef3abf358752c6a933e3f7bd56fe979b462d09aaf8aadf9f7c5260d33cb2c983d8ab82693d2596a5a9f3c5962c3c4692e7f63660f7b3e9f13744d81720223ef1c98325c9d4462b561f6e82af8abc1c84ea9a753cf8895a6ce6e8059a3cf0223ba1dc5af61e6848b0435e65152136161ad3ef0c538b28b9b0c26912f57cfb1032ce7dc3b9b3e9822e689b3119135864c7d6b97ddd920323af862685e1cb9abbb030b025b7188b9a44c5573744a3ac88d3310e09472fe4031c27ee9e034038c354c032babfddad6c32aa487a421ce592e3590511ec95872ea7924ecfa3bfa347613309a97f364eb6d91e25b51db8f325ac6c660fdc53aa05e65de18f8701ba9bf7540e25cfc6b73d809ef1114485390fb9fb032c1c3f6a34069fd75267b16555093233605a55f8fa91bea4b75b23941c301aecf4a4eddad55e251ab1cca1f11877057c6b7655141c1234868464bc405131d81dd96c9292d166120a8798c7a0217d3dc65837a181eef90608f053826701a5ca09f73f7eaf66c1714f3cad1bd87f0121997872ebe2a3a9c5ceb750e4930c983154d3bdeda1155143bab5c02fc6c3a4c20bfe9d7a771357007f404c3a4eb4efa9f926d1aa6d9bcf4b26a88dbc4a48c3f2932998763fca82c08bbcdd41644b421d81845db4c1515468806f4abf436efd4e9ce15fbcaf0be899f95b6bb23dc5ed2767784d5dcb3645ec411c61efa0d47723d3952d3d5cd072fb8cf449fc71f39a2166b833024bb60fb58a13bee90139c51cf97506094ab960accacb92186590b71cb19ab88e2bcb0200e79c86a6fd2324787d27f5e01ecac1a490d5e265fa4f9ed8a48f34c2104ba84fe46207822b912c7e65a20fe57c02f991aacf947f80beea10010ca4f9e9b11cc050d0c3b5c616db22b948525a52eff4750021e2b5d0601eb0ede3ec4c8ff3bedc4ee2fb76fad1bb82a7969380841192de76e393c810361b002fb70f2a8534a27a5612b4a1d8c1193feeb5b87623373997e5ff0e50e54c9999bbfd6cb4061ac74d4fbcb7e49df7ab190ab566d9d93b84305e5b267c26b139108a4ff852151e4bb2a9891030692cae64bc320ecb0c3044a71f0eb738c5237969185148a70cdd1c51f6cd5a80c4e12a7d19eab24db3e4d9442ec52fd5124a536d9e64b2ba6e8506a97525747d467f2525d403980e5a280f8c9f6f3083b4640564253ab5bcf8926a7d711ddb9bc106f0d86061ee58c075cf5388bae4f6b4fd2da43c9f3fe5ff92d53b2edea729a5efdc64378a0205d690d6662ad1b7c579551897bc2d58f9e8f1cd20e4828a7908d12f2d66b7925011bd6f577387a9f8c6a061d81e1b935482de0e0ad042acd206df8c3cc3d9cbcefd78b6513d3945ecf9958df5ecf69e2eb2de9c75e511548a98bc9329f995fe663dce2c5d753c69428a0fed38f0d6aab06e11815fb0cfa622bc6832f83483151b74e2dcc8b397e785a32e1ea09e6554806ae22b86849dbe300df0ddcc001f4d419f518590f72ff38de6764283ccac68cd2b3a8da4ce193f8ce61ccca376828fc294797ee553f037039b93e172ebfcb50c9a67ae84639ff6f45389afc2acaba69fa0ba03e94e1dece0d508efae0fc73cf2919346783f0c2a922d511d5023b93a4bab1ac11b4d253e3185d01c852d048b0dbe8e9a03e46ab9dcd5e84c36ff9bca884ccb296e11e3a6d86bc935ed8c915f0366de72a301b68f02c924d14e73cc2632212df2b7c175f8b0e00ff6fb0b37f8a7148d95931e78ae136d84b104b05b9f419ca289104101ca0306622f5fab3c5d230906acca1359180cfddb0bec4c482866c7068e711b2272e56aa153a67be80b4e29fbdf9346e3d9fdc9ffe030b60242e9fcd3cfd1357aa8dff5c92131c1c4e24c91b58d4933d1d2f2f015b40f3561118134bf8d1593682f080e77badf4b0baf97effbc7259c39abab0b0d47b9939c500a62ca0c6d2693523cc2cc2adf5ed825e390db6620cebab02e39e3c7287ce30edb63cbb2e642e7ba876f96acc2394603fa103000000000000000000000000003d453d88549b0f794d5b9becd1877ed3ee97d196bfd61dc4e13f739ab22bc2328cf1b97b29027faba41af2b0ef4833064bbb7c79f0482d7fb45be886417b341435e081397201b1fba867b25efd97e28112676bb81ac8b55a4abe132d779588d400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a55e747eb67ed2ce0065113fc35ce10e72215eadc7e59bc716971d16b1062943d6d8fcc5ae724377cb07565cd66fbfe34934f51ce6093d69c948b59840abf512edd14d70af1a774b09dfdb25182969a692b4efc4ca376a9c253e9557acecb05f1bc1c2ea41c89b20e307bc0fc58df62b0fcd93c035d12f77993fc23eb295e6c503246542b3e8332cda22ddd228d3894b524936cca6afb33169c2153c2882d59d4502271f08159fa1d3721e0379c716ca9d7a4facb8ff37649cfdc1ad113d12490cea0a031fb3b561da875ce25a0a7f89279d809ddfef5ce838b2814b4f89cc27f5ddce2203d35e5a495bbecddc595e1f14f29f7e66cfabc454dd42051baf4d007f4ba00214d0d0f2f9033e4964a07cea6ef6ff9872c2ef3c30b9dd25dd0a0e95752561bc032acadc67bf1b1927609b9730e28b1962156ad9a17a34b272d6b1c1f836d349b80200b4c60abbb47e7edb25e15310ff7bf0a344603e79f07cc269a3ead1a879b5ad032eca24e26e306b1b239dcd865d7ca6ea0e2e056c0d3fda158d4559154f013e6203105ee94a59eaa1ec48da051d53d5e9798a0ff76eff6e739e88fc21f2ce0586ea014333bbfd45e0361b74daea9f3be1b7cb57be9ad22b78322ec6f23868829e139b55ba04ec4f809512509b9fa29875879ea3d083fa4c5c8d66673ea58feecc26fd57f9d213a4a35c24533c16a6de88fc812624e2950dd2d56c2296513a4d326eca4546e158971d267795cbfdc3056258494e85264c1d5aef37da4cf2ae0e3be3f719960b200f2a7a9a8ead1e594118df34d07838771a92160ce037de7f9effc87ec0ae6c0bc101bf7cac524b11c81164b443a2334c4488821b9a8868e6497bf8256c33d0fa59421b1e5a507cc9e5b330269c0582b3ddac14dde8479550a3ad2606240fb8f0f6d6a88131fc981f64ba29503d9f307bb8fc5beaf3be40cc772a722c4000364f3de5378da81e60ab3ae5dbc28a52056c009e384f20cbe3f024c3475521ad443038d1c85ec8d3acad930e0d1554aaa29a50574c0541bbf311f5004097dcd53885d6b7c8fd27f589e9fc1e86367c74750e75f1b48508debdf273c31b49832de7dcc87744c442f44de1bd099c86c48041ebcae8cb2be7bfd91d753ee7783546aebc1a7b097c025bfa02c12d90427777a0704570ddffea27072da526c27e10d7ccba05a91b8310fe2c3f9643008f561db3d3d9fbde728dde4c39673d33826f516bb671e2172576d0f010fc858de1b6ec299a0153a483e1fe62b14f518671519b4d9d9fc40ae6b668a00cd907cb0ee3a05795df662a52782c5a2b96e2038e753c15aec81b6c2dd303cec79f45662088c1094408b5808556409abc53f51819d4eafb0dc4a9dc477da89a0916f29bb7c705282e9770f7ec41c5a71e7cd6aa800a1131a0c13f0c3538a1db7b65f8b27242e17f8fcbd7b4508d72785bddddda2abc52814f305cd3305d4b49c3622fae088edeb683961a2f150290346805211c03a549e0b3591bd6a31e463830d5544fe2e57f0d71f2476ab1a501033b28bd97451797f5e8a71b7d1f64bb150680e31d06d994ec18189a4ead572f35aabb630a4c9b0741c6b38b97a40cf94f86c251ef0bbf0d32df28bbfcebc047cc7de7277ee179ecab65dae472b73f9ee1a2b37408912104231b782381ebeb0fbbedca1b4c842a546197c5dd52f502c6e7c638b4df8577b8c671d40166817aa66fcc0cca6485b30ac3b8be14b8e7bf456baa0462ebf5fa40ec09a4a85d04c25e7a0da627cb6817f5a1259cf4239fa3cf1f714461f4e78d322e2c7fe0993c0052bbca7b332f0bb7ac73d2881910c8c55b98c021aa5570703ad10ef19a2c96590a15c78933f519a47f679c9917bfbe3c561c510f4f6b2e2af09ab855bc1430c967cf5e86aa51f6737c1121e7cd73e717363de5404a5c76f69a03f2504c0391d47819d32bf5acc9da00e2c536965f8ae07ef3d7dd05282ce511d0c59966fd21ce0c86cfeb8202bb977d7bddef3869aeb959b0c1e6989541ec7ebb569d5c0290f56f158a3188c329f20152c1b50a7e9afffa77a00044a46ff0e8834b82bc5ccdc36122d05ef3760d914ea5baf881630c47944e6840cb0abe663bf4b20374117d886a353b61a0613b708b04da1f4bca8ad8b9fce8e7a0585d343c83755add8ce306b1992bd9c3224a50954adba0e68bc2f55b38967b31da5181d485ad99311b45820ea85d018e2802fda76416aa1261e6125abbf9916af4020bad3176e03653c8336c9fd92cc7bc23100c1600dd7a1700a00ff1b4e54df00bbdfdbbd4bf774ce346d19cbaad456277403d1861e0f5c655dcaf1fb0ec5b572c031d5369a06d905dfe81d427e2ef428c88aee0c2aee635c95368658aa338479c8076eac86eda941cafcda39646dc27d0d6ad34c9bc949fa35893306aedc5489a0e", "63ac005263", 1, -1316560829, 1537743641, "fdebc6b24f11d32798f34f3dee8494a3183cdeaeb37af0f4ac923427256eca42"], + ["030000807082c40303ae87d28d87bd798d3c4b995fc73d0da92973d1b264859a86a1bc6140aeb14b8f0300000001acffffffff23ebf4247a01429173d15284961825c8a5d2670d8710d3db0538e0dfab5d633103000000096aac52000000006a5294460cc2975b2b8c32c51b3ccc309c8d8739bb6996198ba173536a9e99a5109f0b1435b903000000096365acac5363635251ffffffff030aad330200000000096a65530000630065acf7b166010000000001006791420500000000016a0000000049292e5f0228b05f0000000000000000000000000056929e595a1b5e81ac6569bc16adf853ecefa11f646bac4c928289e0e426734dc74056fc0f5d9b7c0e85b3570330d4e0d29dac8fabbc8826e0a8d013d3057026c5bead8032e31ef31d388e83138d00dc63dc8541cb7d9d88d43869c9ca9f432400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0419c7bb0e86cd7b441ac6a2177c27b50cfee1873f23aa85e2451a17a511cf865d76d3fb9ffd3cd8a3ffdbc9442055411e19a0cb25c51505623700babe4f41db8dcd4955edf958046ddfac9939babad6b357f51128c0cf942254e1b9ef2dccefe737e6f52462f652af5b30fbe5a857ea8e8b4ebde753f87278c860c6d8c6399021de7d040101a5e52b9c596d45e3e3c94557b2c8c006b4242ddf0199a7d458c9d020a3ff06bf6541b11b7104245fd3d12fb135252381e79154291d4764f716c0db20a0743fa518c8746f65e25adb738680728e98d9e753029a5c1d858a3a57d8ec0e1a61fec43d48c2649935143c83c188b53aca02e3d1ebb8654cff587b6bb5474ed020dae634b6340a577a88c25e7dc79c9b8b69fdd17b7b87aa870dffc9adf5d7e310219e1a67d8d4df97a9f54a4f7764e6ae3caa4d86b4eb56100a901ce5dfda415d303295363bfc2473b9f409fdb39bec09d940886a7948e8ed049cd7d53425c28866f030216ba779083d4d752cdc202540e252ea19511c07ccbe4fde5f6481d2cd9d5bd0310a22878e4e5fed3762c847fdde57ccf8ad882006aee96525678149f022a27afce3532907828e2900f0ba912d6909ded4a639e78f8f54a0c7277fcf2ffafcfb1074d57d9d847ae7090afb5e6fc2bc474e7b084a4da9d8bcbf57c14fc7ac8e284a9f4fe916a1ff74281c80bf8fe0001fb1c976463bf8c71d303b564fc48c22521afb4bfe5eb45200bc304630573c8b6f52f50bd0f550826e807d25e04e2a42c657ab656d4176c08ae2aaadea3cc3b4b1c73d45ba1acd010c34d0809337dd3223fbf9a2f43873aa4381da19f4e743add5163022263c19d290603da7b05068565737977a14d2cff3939e459c39b60ec89ed578bc49c72608ce74d8c42999475ea9e1bfe4675ea6c52499bc4a744d554ef7dc80729bdffda66035f16f6849e4d2a29eef50fa90a07daeaa3b2dfefd3561d8dd5a8a2e81bd49f0774217745e865c7707993edc406b2ce8aaeeaddb820ca74d9b4492b0d222cc6219f86efdb33f86fef2aada18ce297e59f9ce9e9c81e709727adf38b71bcffdc29f2bff483623a871205c5bd54e5999c060cdaa31a86e4c0481a633ab396a57ba3f4d1d893c3c2f7c3e73352c52815141c165d15911c5ae2b8f5a7cbbff08a44c0e9d7d08555a728ee5827ec711a5d60979b251b8cc314487c767bd28d4bbeecd75793573bbd02a5b1faf8ac86a6c2b68c8e70017be1bfbd47fb482d588e61be29a4f6147602d551df02ba7690a70fda966dd787908a74c15029a76c8ebf2cf5d4d9349f26c36568a8a5e1b8877faf0f24afff5e885539d126ac9365fed1d0ceb09965f6370a40f93ebc3dc0f7f8b59e80d862f3291f323e661946200971c7af77dbad492f39989348f9896055fe40d77004919d6bc8ad33c27a10ee6536b808c71c1c50fa68450d060e6ba369003fff2d8d78404d342b67e0b5aeba679ea4633fe7344b6030e0e7471b4d6a27e0377462b7622bffd52616f660d1e52b7a4ff2b6dc48afee9e7af4a9282db352c661993d1c5970a9f182f40fe05075aea599e008c46e481a47a19a36b7d87046342420524c36743868825a1c90b62e2320d0cfb1686b12ca46badfd5a0f007b8b3e6d1ef980afb295579b6aec7c3f3160904f21e9eaf19fc671eb3f6c919695405bb3ce7d772a50c992db27eaa90371121445e1e3c61d3ba510a9b1161c185d4ba35600b152f0aa3425feaf18574313b53111d4b682836291d36870e39b638e814757365338717f81ae30909fbbf0ebbb8e4278f20b7dbc59f4f25adcd064795712f58a3774c6c5bbb8706b6be91afcf8a731d3271c1302335a2e6b11f0c3be4f76fed641533e13c2bc3c65d0e940e25e013de7035fbfcaff61f94ccc416e37997588920d7693c610a2c083a9e84609291d953223b7f6d87d24debed75f0acd1e532e3c36e4c6840553bbb04295a189d31822c70144ce70bf0cfaab75c9bd02f501d34daf5e4983923b50b227fef856e14d89914a8fd2ea83f8378776f87e8fe68e50446b6c6c968a4fda7fdb463d04abb7501a3628d94e0bae3bd2cdb9bfa786b307d4cf34addd083c2c50de45a6283ca09361444cb0606dec2e35ceec6f5885112817811429081f78ad06102599e8b3458ce9dda75035a4483559481246114339a052a454af971ea90e07f53bcdf6eb3b9c2843582db24f18e499bbb08fa473c01097ee733f7eaf4d67d8e0ca5c0b83d8194a1188f06b6efbb12f155f3f040d539996051d5c2475a816e94b8be1ce14a010000000000000000000000009a4fef09e4870386bf84e38da9d9cd820b982d6f62f07f5d38c7b33441ea68cca7382029aaf31ef254ab9ebf8952376ebe3a747d532342b61d6962762dc93b03e8b641b25c96675c6aa978923496501b5eda1d8ef7bfff76890f777c358c3fdc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000baa97cff807a1f8526775870d0c118b7995f37456f1bd66ed4365e334fab57a08bc3c9f9d6d5366463ea676496f8927297b12d49f23ae4493d4b67bef93783a555967c0d5b8d6fa197ff48631c7c4be57674e078a9f14ccee8e440940cad1533c902514f537badbc1a660bcbcff5ed0784cace2373475544e36896981fd94a4a031c347915789c2dc872c629adea110d24771f6a878bace84b1f75993db3fbe656032a06ddfb3732ebcabc68dfdd337330ac92e72b93e55b8c4168c6892c1cafb3630a0157a745164ab365166c34791551038bebe0900d186d099a0e7821b45ec32212fbdda2717d7674397a12313cc7789e317d8d9cc7879c0a6d8e59f1d375fcf850031d8f9fac930bd84a61b125ea54a99e47a4788db6b26b257da1c1c2fee453c01f030621a5a5af6362f8a9381f4781919138be214b9c3490f36e871802167f6616d60329e38197f61f8952467610bbc72ef94a2da03b9a0190d89abd2d9afaf15c1f3a0327d776405fdb9f549b3bd63bab545f4ade0e52dfff13e40471beda3cd8eaadcf032159bb40d66b16f267a64b87aec8041ecbf565aa28af5cedc02d8e32b7f86ab9030baa6fe6e2a0f9270c42fca4477f554019aa6e7e4fd75a33f6eb2be3b3d680fd6d2fdf7e121a2015a1c51b8f93dc4915b370c84e07e3ed3aef7f279bbc66def9a0562838ba5e44ec05513853e6c68a165853c0719ac7d8756aa7382b63d1aa7fe61ac90e245b3d1a225cb96125c36ec6ac85137f5246b4752616ca05f5d3db8aabe0578601560e448c8d8d492de2ad165eb091f4e2db48ee333424c1be8ab456d23b7a798e16ebed6216c28b76f63865cb51d059f82ac436301636c189e20eb19bf65ff4bd9f4d0ff536a47dc30529b41e2247849de7ef75ef4cf972c23a85e5777171b143be5fa879ebcf6d2457cb1ae5d8e5914daf3fea458dbc354a18cec7afb29aef8447210b9ba40b66ec7be3071b8c3e162feff556c3a0155e86acc07dcd4c53d0476fc2e309f6761609ecd1c8dd8b4d6d4e93fafd9b10cf0ac1559dcfa3a26d25592286459c0dcb08766197ef67fd3e7288844fc2719116cf57fdc407f7cab16ca095c05ee208840a18d9f2da3598376ee83041359ce3d9394dff409bd20b8b85b77406cb85408a4d77c8914f025c917fd40467003000e5b507ffb91f3f06cdf54bcb9be2daa597f26a4205a8f0a010cd2e19fd4439ec6e07a7f55f04414ea4cacfe27acc2191d2c730619c1d11729a1d0679ed56c137f7b87777394559dc7bcae9869d36222da768f6e7303867b90646dbdc861d0023e1921bd02fa35ba02279f0c0c975634e85ef65e4c601e2af42bbe8dd0ae85a7779b126b118ff96c4de3f54ebb4097419b0c9dde2673c949e73d87e0811aa2597a03af93e05c5fb06bfaa39dd5fc1c799db09b4ea25cd90394655ba43ef0e7ceb491a998b4fc0069f35912777d017e322c210f8d515bb238fcc402de15e9110a2511e6a1665604a23f4083daadcfcaa1602c8b41b50d9da0b8fb3c6c1d02111762ac12166753edc07cc7e43c360b6df9de6bc2e6d89681345192be9de5488e2ba556706f527cde41984f3f60837714e6d75f1f7ca5b0a2ae5cfa08aefdfb27b145744f8187c4eb918b29924c58fbadea874bf41664a5040fa0f299b89e5ee5a0186a50937a71c382e40b6516ae9ef4a9a5c6a8c384d1504a886c3e7c5aa68326e5d760e08d6c5233023a896a18ebee48218e5f0369e1b2a8236825f0ecaca47478c7f0091345d09ad38471f5799b4dcff0d1d19b5d337554fd4caa4a74a1baa9eb5862c9870fc0804da9eaa4f4426deac8c4c15be489e6e106f77a6abda759181486f2e51184881b07cfe0a69cafcf1bf2873011a4093c89c4b55408613150dfa756b0c00971a5df62b0e5f98d5ce868f01389792af40d33f400021e1365aa88103ae1a86f34ca7f79316a8fe4f8ba04317c2170adc9f80f2dd3fe352c85df077949301bab88adfb7a771755c09064fd527651a7144b8e11aec272070cd80a9f54a1c3b14ddcf6beeb5a8b81c3e29967ddb8969de4c8fd2a477e8dd29417e9949a134fafae8d7d83c9eaebb5d7b0568ba7fb6fb31b98ffae248375ca54f62cf085e71e43179429f6a0873d0faf23457456c8979dd04d07229631559f91566c661796e49fb04776a7f2bba859a98b4b3771e3ff27c7ee3bb73352605dca5eced1e44b9fefa51ba718c1cc4ac38e17b10afa8b2cd8d7ce67b00f91a9e8c345b95104ba0ea3ab5e36726bc2aaaf4492a7edf771d72d18ad0cb813be2a129fa81889088d9825515b56a8ff5d6c53e514a1d981933e2e9c9783d36b0fcb6f6331bc93d826c4f64e134e0491f902f534efb6bb092609d5198dbc818baf3d28a7aaf0e64dd72c430597c45ad07352e80923a3906d02dbe7266c303", "525365526a", 2, -1437686251, 0, "5e8b40e4a78ca6b071a19eea9a75c73c94dc881d4f79885a2e21932ecec3be39"], + ["7a2a4d60015c20644dc228e31fab4b4506e0a0aecb45c1b0a0d3cdbe7ecda5723774b4658d0000000001631c49b96e03e4d964040000000002ac515fd7d6040000000004536551658bfa2003000000000463acac657db894ee010000000000000000550eb700000000000d66870f4ff17af083cb8bd3bc4c7117e6887704a86847588ff145a2a7c4c4d206b1c75b7d644ac43458ce9cc7c6f6e14c647ff4774b86fe1b59c8c9db2ba88a3bb62a74fb1c486eeb2fc077aacf17ad0e1461ad8ace4b20ea8933066010fccd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002be84616d125721edc0ef8d300e2441c91e372dc45f699bd2177baae044f6128dd9f9a5ed3ad9004e9f818329626dc9b9df6a2e4ab2c183d567db1c3fa0ba1cffd1c21ebdb62eb49d142938ab42187ce190f6806d58c6805ef34870216806c9b8a1931f827ad5a63e2a2be6c1fe1d6403cdeac82276ba61c0e93d7c531888798022e28a19eea147a5c9e1ef4532354f81aeb4ce4aaa20174f3ab0e57e6c35ace9d03094e3f5fbbe28b48cf299947367b4f1e7269714c8f729be2a535091388b8134b0a00799e6a02557aca81303301a865945b131035c34a947ccc128a1181959947c6e044cf5f6783a6ca902b6213f5e4f0d017e68d08b49db3b0b91a3d4e09b300fc032f7e59d7ac4f9f6deb532e3c311f40c6b302f125306bff25175051360c67bc4f02010ded6765807334a55dd159f0da28e4dd6f6e99431be08abc6e555c29ee68690221ca87eae0a5cac0b80aa353ee1a4aba1b3e4c211ff4467366b8a4fe0b40f69e0202190a3043c67a7d41f4bd7e7f2d1c4dc4c8c7e785f8e081541ca49172a9ae63021469ac58e53143e38682d130f49e47d80a7d1a38bfa0bf3de83f21fd1f82c75f1f3a5157a49d6403f856e5d06bea04fea067a547a7d9077f6fce3543c950e4e9a08833eecd2903c3005f99f4d64bb9a7d42c4adeb48138de727d3e84ef6163ccf05f2150e3a1b7b325c0b0d19e8e05e6c76bc1a18a2755d78f7cc2ed2002567a8045d445432ed10e799be1f56c87c447a61185ced3c8a42177dc6e9d0f2dd6d3b9222f2ab454d2790b6e16ec4a0faba45f71968d13d555566c0dbcac1870bf631a1d1dcab9b890bc4db236e6d3e76775e20391cfa34bba031fd16aa952bd2b1f525241d15f1a0266029b047b86d8b06db48d17665717a088736a5e0aac0207e6a4e56a51e300153afb2a7bd4b3e5d8e13143f48c1312efc86745f11bb45038f7e2d26dfff3f380761f97919d6ac38c3ddc033a8c00c0948c6000ab829c5d7633e9c8131241a0ca7ffd6aa55e4ce8ec8b5c71a8c0bc919b7fc6b02931bc80726b22669a1b9527c43695dfba4d270266a301bdd3a6ebae09e191185a077cb3435391102c11acafb3ff117654a70506b07f567c0c25d99c22a7aa677ffe09a00661bd6c7539fa14c67ce398151d711cb65e44b2064fd86beba9fdc6a9cddd3249abd7a249bb2ac4a6e64f8915cf728f190b0f591795b33dd5554b3fe6b35905f9af3f94cc71ab7001f848d88190617c27944c4031550558d2603b847dbe61d720515ab73e9df75ae7ca98fe5d4f8da4362abac6850fc65951ce88634972ea28481888cb8e3b6f939352871683f03e920eb865c043d79e603019d0604fda43e71cbbe503a84ede22d0419c061749086f412ba45cea01af20c91ef77fc82063c6652679fa1a8fa6c42498b1049d58dae0ad07ced2cbece6cc93c854198724d368af97249ecad20fc2dcf66e3767d73ba7cbd84f1fa886858ff94bb0c05defd5291ab285906c9c6f9e6f53c7e9bd01eb372db1064757c35dc3db90c9371033d5ad5e2efc1e3eedeccc7195b48ea6a826489890f79aa1fd0e1df1f32d4763620d35349064a4e547bbd15307ddc97c2b6940ab3e4b06ac62ccbd4718c77dd41589f2adc5129c736f1f3cab319306ad311e5a2e6bed0ae926d461fa11a64cd1e16a58a0e804d73f94f4dd1deb14cada8124727640ddc2f1f54b62be1642e95a63c7834ab488224514f22304cfb8d71816f9afbb472b6e798e9720d4da7b4c963718e49e54f570ec9ef146ba4ad49b8bd8767f107edfe59ea657a210a9e722eae2d416461e5311962fd0380724895b34733b5f18de9984bc8fde02f1bfacdb5728c39f3b97c9274e16411010304a66cd1911c7c7553b014cce6b173808065f7cc22d2e8de3a5ff1a88edf93fcbfa73507a9499c4a64d589327e0cbbe8e8c5927a2597f4d033582b759277ef43b012de1b7505ed9b2c943f6053504f5e1cb518abac4b2e15b78b96cd6369ba97aab8387c9560081e9cdbc02ef56da579ffee9ad6f749ce4a41091488f4d3f1e5cad5902c0f78dfe85df778b0ddd7656aa3623296c5571ec89105a82c5ba161b9ad9cd0ac9bfb4de167ced10b811fc7b3bbaa4ce36c2d957bdcb94930d6ebe4975a2ddf6c602806c04afe4600c70e99822a7939880b4305b859b10d3b9534745574a15a23ea85fd0adf5c8f4a631ca488a5ab67df8d06d7ea1ec5ff4f86e548c5228ec9b0e80d66277e9d5414b882919bcd39a184d448f66b62f18d6a33fa1982fbdaa72a9dcf7f078207f8dfb6fee4915ebfce496185f1562ed1f185bf13e18442872c1912b08352578d89b710cbc439d83f89f88c72c071a0aa8ba94d18c3cb443770bfd672d314d704f82c381a6d3cc8d9bbf3755f2a059e65fb9fc75acf04075d7f64c1641bb9d7703", "51acac", 0, -1552337250, 0, "ff37ebcbb4ab9db4d00fd8e571bc2771ac064a185eb9e9ebef1ff86730e5a57a"], + ["030000807082c4030153306eac9efa5977214abaa5267851f2ac1adc336937121fa481cb01ba2cb18803000000035251634f47747b03624ed80500000000096a52ac6aac51006a65e4995b02000000000700536a51ac5200da081a050000000004ac51526a000000000000000002a36209050000000000000000000000007622b125023373c93daf719d15aa8e78b79d5812036a10ed11eda032a693ec6e3b66fa22018371fefa807c2db3fe2140d594a28cb5211b61de6f8f496daf64670ca4d4d2ad856700788f970b63ceb5daba1c92b71ba4ef71147f2b78bebf01a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036e3e3ba257a974cf871d9920965500d1306665ffcb58c88284e68c85f422d6a6d4c0e2734dd20a1a68a9eda07c950b3a794d2f44566e02187de1ca16dd8e6eb3c617a7099bc8470fc358f4b0eeaf87599c603a3debbebc893704d2402e4f83a1022b08cd1016869820f101891e15547d6638476cfa8847393fc683fb8e93c0a031324981dd61c6db3dd15c3428e67f615762a04a52eaf57abac72c933555e6b85032f930d988617c44e10fd51b5a07a79d1ea554e48cc51dde5fb5990d94abbecb90a03ae22cbd8ab4132f49b089d0648da65af55b1b011acc6faf1e47c15bf4942d6ca64a807152db93b99ce1b263f5d95c2bd099280a174e670e699455aaaeb541403208935aa66c296fb3fd97c8ebffa9ae9e0f108ac70b31079df93d962c9ee7b03020e5d6a24e99e57a73a55bc49f1505713f4b7d5ff4044f88b9511ae7900914eff0226290136111b9e5ccb6d6376cbffdf3f815c5c6a477dd1e1bba7d750032039230304b0f317f822ccd0fb68a378f4a59150c218b2b371d52aeeb2171f6847396ba4031658e2f12eeeb1715180378b12207fab528b2325aa132632e5499500b16e0462739b348bf4faa65ce0527717def1fa9f2f84bc9acec7e942c12abde345e0668e5bebafd37ae66c8c10a766f9092e8d7f08209639c7cb20634e8ef14689dd13e31b444db5def1a88ff9ffdf4b6ccc981490b7a97497158a90f9b18f3f4d30ae16459846b49ec55ee0af06436ce438aa78f7f0e47bad079143fb24ea5a86a2c47ac6893b03cd0b2315c32f553d956b6c8580b30b7e14cb25f148d1bd07481958ffddbcd6946bf2209a48d156526c4ea22f25b6f962b70b206e6921bb7e8bcfa29d4880931775ce09fc850c9711b2ff9cd5881fcae453a35b060fbb86650650f971b2e058387b74a59740f3738eb8499e168ad11ce61267e97f580a522fabeba68e2c97eca95bcb806acb7316404f085c29d3edbfea2eb9f74e0c892a20d9f6f24af9882cffd45b5cb67319e7491d397bf41a64877e60e23d2ab011ec85399e98a8c96d10d095002a466e69ea7a6f8155f0cd89b5b1c853318de181df95840f65f163d6971b79ff02e060e4437148d066520f213145abb369e438f2681c642bbb81ffe3829c8b1c12f443349a8d2214cedf75d14fa4796618b623510a67d314b5e8c6d3069199b2ca0b8198da01a1d502cbe5349be7bcee31b4917fb29098d22e7e1fec1643a008ebca922c692fe81a12d70786da1ae19181d6c5f49a1277ffc748f523a3508d59274473e4502e14a02293f743792c916919c825084ca9508711a32ec99243b187ebbcd4d028a242180fd05118675e038d2eb0b19b1dd76c68db8c30f15309383cd7f2a88c28cb30473014f6c2f181f13871b688fdd7422352ce33e56b6bc2f6ab206dedfa63989ad0f75e24899937cfca392c0a0011b128730f9388f866a76d562dff45b9b94cad22ea49a1ee5927f28692d715d24299028607a51e080956f3ff73eca7a343bfb35cf0da29b64100b7dfca5a9003353dcbbb4837064171b0d91d697422fecfb675f49da66743ff3b2e30a35dfa2b5098a7a9738383d965e5d3542419ad56f7e3728e30fd7bc32d799679edfd0ec0702ec9923373cfd94e9fac40cf1b604851864505b52e595d96e99d87ec93003b0b62a203b256d13aa94336cda1a001bf9645ed3e9dab12668d2632b6887b2c8942f7d84c0ea1c59f216374b42206c9af616a5b2a8064fad8e69e99f7755b18f3758d363a2b87998a2e82f7d87ce68ce7b3eb5cc36b96517d79d761b2fb60a15f3ee23bb645611cec251e578497265eddeb8295398f135d92089b79d8dbf1409070cd386f8248b534919fb5091913c144ab46d6015f5b092efd872224acce4860cc43b722c4636cc899ca66174c9d9f3f37f0cb1d7cb9ef3bf9713da27e02376fbd19276351caecd12d98dd08b8b5368b94c350757d4c41c712deaafd7e56c68ee5c53304472096904b2884e9a9eabac29b431a795e3d1baae201d41623d6b44c1ee914212059c0c93384c460629274aff5f45d373e79ecf420f1abb173432672b6766dbc52d4863a518c15dfa5788c623f187fb30907252418707af6a9b1b50b07e5f100bf8873e558a9448c5907a148b9c5531217bc8d6e8d5294ce5868d25734155f088d8aeb5d58735a34fc1cf28dc4aeb6a58ac31d4a54877101b7f8521d5371e985f8dfc18ec3f7142146f44103e4095ad30fe6f556a712c89de1ffc22caab231c976132e2ff19cc129eac5b3feddef7aae936dd2b33637d4040000000000000000000000003153260fdf06bd816c30856afdecc0be98fa194afe985d724315dd5bcc262e350eddbe735c402ca81f225fcd63532e94bbf74f64c286284301953027a9a04d6b85deb61090d39dbc689703683a380c25333b4915d9e0213966982d5cb2f151a500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000685fc13d559845f61c6824b3d61b08a8d911dc176c143ab857b05710a3416c7704bd4b33b2d5765bc51dbf73a9532fd96b5e34bcd9c7ed5b550b626758e1ccb6a1dcfc0bf271b637f62ff895924da2e96c5603981644aff58af47f27e6998ba4a3f34e5b3dd7a9e327aed70b02e5a956f88d76d5d17f6a176943dad5f6b0f48e0329d9282f09065a3b9ca1594023576de2cdb6e6acff84d43b9d1827f63e8e40df0217a44c79bbb0f4ceda587b48e8e27474439bf34ada853a8c3ba87ef60c0febe20a0549f2af1ac0bb7bf1b6a4b7bc8a131e4bd42ccf22805357b04c117b0527a75b23fef93e9d225653919e9eb6cd1cdb3aa9886bb73fcb02b1f05c83b3331688c9031682c8f23b3448e16590bf4b316a6a99b18e34108dc97cd38073d70a5ae597d5031730131b63dae7c0802e04902852f44e239c410b94cbc77d3408974fbd3f99230207b1b680427a40a50351a974433f62d6adddee5e2b3c281ae07d92e20b5ee277030975e24828bcb3bbeec4fc746b1c55b7422bb5a6feb6424c48ff6f72726ecc21031588f25aa155f753e209e109c4de0130e4a4f0d1779a8fbd2f32754018cdd7e87d2b665c5fdbcbe9a6f9886ddad9b064fe2e305f4c0d7777d0febca1df67ae2841bed999df874fdf70e331c7adf33f756c02f0501b35e4cc33d55718182587c1b6abfb9fef39833635eceb024514dfe7536669ede03f0d654e0000ad33f52345f9d9dfe7d2b8d5d142421aa83d75d07779e372140635b527f4a98c3fa8214a17b3365be5cf7c4662e7d752f2f1468ac93d25957536ce7be4f41abb59d25c50f92880c23194d1c588a69049784bdb53cb320d0466c0f01f8751458afcfebf1e99f2fa8a3d5e2cf465bfb3c2f5044ccff094a383fb8df91666582814de4e528d98e1b95e491df6455ccefb32aa1b14c562836979e340bfeddbd2e7f08d8643de9cd896ee83816ebb0931aa06adfb9e352c454a18e935ce0d02f2c3a540513fa3fac82f5a3d93b43024625d5fd3426b0e223bdf44f7d9b2bcbbab3e2e3c2b5c8d74bec90df2a408b455d389365d2793914e61f63cb5c207eea1099bbd08464e938ca98a029618a1f0c621f2dceac7ee6dec4ad54fe9b2128c79846d32dbbc3adc713af8f3a93b60ed2ca13c02064ad456c8724125e9a3de5c1d6b7e5d92db31f6e8db4dba34868b2267e8ca3a0c19409875e2473a918ffc9ee571c8a5f0fa7dedca3a0c084fa49303253380ae8381d869eed9534e61cc69eb91a8fa5877f687a9a24a7c9fd51b78b9ea287ce2079fe22f7cb24adbeea03bc4808ba516c47b62e08813bf8b0487307ddd5425370e9f91a8f49bb411eceae5cc52710e9ceddd73add4cb24a505b4553a7ff2090a89181e3e200718bdfa35215538130eb7c475f125645f6d3ca96f1b4a127400e7f9cee00654bd93a19c39bd8f58e542528be439bd4b0dfd4100fe072fc78da9999381be3ab82d9592ed98c755858a23d969c635598f279217606de5a63dbd2f32dd7e33903560016ec6c10368139b54037b39a49595c2b47f0e0748aaa5347db89a2410fa89e3fc4100eba796068a13949ddc9cecc2c9ed4bc4db9370ec48124390e6bbfb1388e8c7b28d4b1dad520968f3b71c5e531943f0d9653ec488320500c9c1f2b6fca1321179f131c1bbbe522ec11fcb239b255b9a0d76b4cd4700356ab903c633096d73e0ae66cf93643c3a28ccf5de3996171737077f6895606e9280658e5a66767532e9554c3e9161b5d4066b5ca434b3ae648a0012705ac426a92f464fde558205ae46fc02abfb62fa3b6ea50cc4ef01af1f127680c62732f2aa3d4fc8163ee4d80c028e74478a237434d8787233dd150eb4f49c2b6568fe3d99383dfc5663c6e18e1171f0c70fcee01d041a3453410e827c31ee88d990e4777e2ef3ad4b272e3ab4ce4e1d435e56585360ed20e363feac505ca249018d8668879208c1ad47684fb18a7edb67ea3e12f583ba4211b18c7848d392af9410ccf6aa895a5dfeadd66882cc866e05802b74fc4fc953f86e7f68bafb67d782552ecaab8ecd825a27d5bcb418b5953331226d0b61aa203c52092cf2341837b7ac84aa8f29d3d0f6855872d46f7c30518967b9dae053361f43b1f0b25da68b71c82cf44d2a29180cffbd9fc922a6e261f8554b0db52e3d1a95ad9e9e8a41eff98335e071df7dee27cc75485f3d065f1b2e7cf1d4662db4c642987f387908a071a5c723b6ec172f9d5383e83b747db1c5c43b66067ce85cced6d2c41b7d2b567afd27289e35744070b71e5ecfaf4da45d6bb344ede4ef9b0ffd6da5d4b405e1d7a332595a951da1c3a161d253ff6b09ee041f0ff554a133a0fd1d53db6f80c30831b28947aea2f66b9d92493855f87d429db3b888eca92e30cf0b9a753211bcfdfc1e299440e7ece142d87501", "53525163", 0, 182308742, 0, "2064f5a29e47adcfa9d12f6afe91414508b1937781723ac21cd7662268449a28"], + ["030000807082c40301560cf8270314fbb298d506d603b0816ed4c5fffc5121b2a8b74e0e8054d0fdd003000000095100006363536a515230ec62ab014609ba020000000006655100536a5200000000491663be010000000000000000939d1b01000000009e5cb9ef3d4adeaaded3a1a48418735968a9f8568a9345cfe4c952f9ccf4da041359c9749efab5a3b10c4113a8af1a0f2654a81fc5fe4da295615d1cfb0d53d31ffd64e9840863b7806862702e245b9f5260bcfccdafcbc2e21f8d1ad4b38f7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c70558f2659a25500fe4a42fec1e72b8aeaa3995b01dc1c74b1f4233a79a4436611df037d8c4e35be79e81aa3ef650e67898011a64f4e4e649edc49eef476b4cd3da15c4367db47fad008ed5be7dafc5b132700f1ac545d33583348282b429c4c5e40b922f1e922856c3cfcc061a7aecf72652ed4e456f0a29fe2ad3f190eb4c0212b6a0b2273b15de2a59895cd56cbf329468b6e373d30a812e717ad51079bfa50325da8ac25e4411078c4fc4a72fbdadab556f46d5e6a18735d83135b465e15bac0a000f6aee396062e38e0358459ba111ae3d1bc4ac3327811efbc223ef035a1cdb30e8ee10b88e7ca1fc2e89a288589b65841d61269bb5c31a7223a1dbfc9d34ba031b3abe400d4ba757f4086c1c46da22e4fd1011bb35362e41ba6a7afb98053d4602141a05f8013a5179401f36fc85d7bec57b707e6d41934e77c7b20d50032208d903004aeb48435fd801867b034bdfddfd1d94c09743b28e5f2191f240f839e274d402240fd6d223b88c6df088bbea02ea9129e2c7abce548fcb4b9f5ffc7719bb456e021292f9ca3005c99a96f665a3868f45c683ec214b085dd1c211310042665293a7c6ede646ac3ccbb16bb6af003d6cb8e6b5c3ff95c0ad7796aa11fe4c8057b40874d4d404a3829bdafc305fccc3a94c964d1fb5b7518e4bc92cd76215f95539e707ff25e76a2bf14b67dab10469775877f7f95e577aa66c6ee05ad9df4b885bb244daa5b619f86cca5354c0a52a9ba821e3628f0d5c61c2ca855216bd03dc66fef5c3cd743d8fe36f0471741be4b20e2b2d3dd4b941e5ae9cbd9aff715b4d6e64a46d1480a5efef60726ac7cbb8808d9b7f7003461edc629ee536a974a0618f7ee9fba13e57e129944f47cd0a76e11fe88e14f601d450dd59bf62915c088d156b2109446c75b4d4b3896e763cbb7d4b8137f19789188d555ec6baecd99010f004bb1ac7fa1ac35dfb8104966fc54600e04ae9d427940eea48b3d952c9f06b2b39a8c78553d9e4ed37144f25484cefaccf1c3ee6dce7a352b5e9857a3686dbd7e01bf6ee3389ce9c62d3a65698d69770f8459689afa9e42922f9ffd8aa42d1bd7c4d185faab20ec344a2c63b9474a639607151390257c35443a9d824be42f15df158eed97507911362a3cccf68aeb4a308f40306586fd770642d06b6098e9e0aef35ce1afdbd67231a413f95280054be2469dd6db430af3f63ab68c2d1a5c4cbc2bb564e30d84294699dddd2de956ba88888deaa7ddd0f3759e879c12dcaac5700c35b6d72cadab34675ae78c7194a673a353f88a30dab9c1d2eeba7a144b41c9fc112b7b763d8fd86dd8e6764d859d92d5db3dcc081e500f9246bf1d034bb433f4a89aff128d70a7c26b078e5110d76d65a7bfacab7fe607dac0e392c5caf91655f159b7307e162c165a056d87c56596f782f0f7787799fa91dc8c7282c0cbf882aa3917402d879368d4c10c3e9dcaadbba2ddce675bf5e7ff001e943d761940a8e7ede1380b82d7c9b43f8fa261169f53224c534a306285074fa7bb059d0d25861b7c64960c3f6632a20448c415e020a87911a3ded54308102b82822a45b0694a7d3b42aab6f35d07b27ceb4bab39283182cf17d28be5fac55faa53e409c67869c25de70f22d7522e7d74875622a91352ca4ef4029be184272c0948167d6ae64b09b80ad4cf652d85cfa31f148bae5e62b243a874b7cd9c0957d91ad0467c1d79839c971a12f0d4c3ef34116d29363e962c4f91920608301b2a26739a86c7d32077fdb0b21c974bba98fac995ad48692d72cd0bbeb3797674d581e7c7355d8d6fc77ab7d4c04655eee37891af6fb8fae672c3d5b5173a0a46449ec8e1305539a50cba1ed34ea4e568e96fd1846bab4ba470136958583f96ebd6b40613258cd60127653838f63676f5075feb59af5a28739ffe1d11fed008a0a2e63b19d44ef21611bc4e5fde7e917ed7cf96e349d2a9db35433c90afb5237326f2875fa39b4cdec9cb4d2c5835eb2f54a6100570fe76116698617c380c905633929c93debb2dfd9c36ab0b524f75eeff15d5293f2d84f5379a117d518919061f06a8543e64d96cd6bce77d5169c2a4ed446df2d2d7aa0158aca48ace0ef6308cfc2d4c22b2be576c633c298509d06efbc7e2b00ac9ea45b35a77932aa3ad0f88785dd85662f784a8ffe443058c47566e7cdda17a6f8c80b34b061c0adb46269be2e3e63085b81d92bada4597ff1f845957f1401e420dbadf15e6393b8051b0ecec066bc774010b8e508aa38db1eb17f6d5649fbc660362e2302f204ef01d97cc78049f9380a223c788190e6b22b3be9175241c88c2acc90ee0b5ac6ee0f5254f532ec65274054e52ba301fe513236a3db23d2d240ffec176f1aec0e4ab5b0a2417df8a6743c76f779da947a8b1c209e0781e8d2a69850ad0e", "63", 0, 2145458821, 1537743641, "acbf3d2002709797ac22c6c4fef2ef9ee98f30f1c5b4c8ad49944c9a2217f7f2"], + ["f124d0560356a500ba8633610d2e48e4b7de0e41c0801b4f021fecd816179136a31d4c927b020000000265acffffffff19b7ff3d853287e877130b3ee3fb46c34988c5d03f7090fc53c61792fe3716880000000000ffffffff0c1b5a05262b7d3ce6094ea6439662bf0402681839728ab2da7fba2e17c50e3a0100000006635300ac6a652d2798b50382831700000000000165045b99050000000003526aac572b7d0300000000075300655251656a33e723e1025bd273050000000000000000000000000bb268bfc72c8cd4b0309846716453397c484be4d928e2c756ef6003a70b6986d01a6c2d8977ec699b9bf8a38d1333f4921528b4a742276758c319d3c99d062cfcf05c8bb288db6b1279ff115067b013f96b90d733b0b72af309306fb97f8ffd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081994af0f4816a4f7232840d0d6782a4a5c05703c4550319524e2108d69482614e77d2360066a7b46155b8ecc7c5b23ef8808df9034dd1cec062ad85db2985e99da5a4b208349519ded3981772be1c2f5cb3f3b37bdab6a283a95f50d42779ef1e9800445f971a15b6a850b863279369f8f976d93d87236310f23cb477d93aff02204d876f213fc2c27f72123232c9380f3c71fc7be80b3f7bcd604be0c375ec210201d986c23d28451c615bf20826c74f905b86b635f00154b392bd548d2bb41b2d0a02158c1f4d769c5886f2425e908e381ded8b303e7ed354db388bbad36a594a124e4cc7abc45b71f2938e7b9eac7d7e4f98a7ad74ddee4b77b097105886db9b3b021e49e58a608e0e305a23ccf655870e0dde4bec450c47e14a3301fb5dcf0364de0318cd04a232feb840d180246d450e308ef533eeb7cb15282d4d463be5708dbb3d0207f60f0019119c45aaa940adb782ea425edecbed4c4de990baa2be795394756702061a2b4b9e86d5865327268e5aaba95e3e530cbb06889ea728dd4f7c2f31edac03058f9a3edce0957c1505fa1c85ef9532b4e25311437e30e51b9802a6168d78a46d944b77218b4f7cf9e7cb68ed0c409bbc31f7152071b1805d3e65781a710fbc52e9b2fc7c0f67ba2c47a4c569a95f95c6b8b2901d15728f76d5ed678e78fef6bebdd9819b4f104ff72f42e6787565aff180dfef42e5e9a113e65864054fbb82cc67c3582749f93f99d951f50cf6b424849fe5c4dbf67a485e6965a93e81d1add8f366d2edd77fc8a63a138fca16886b2e7d971b2b2d83d269c66935a1a6fe0ca5f65b72b1f6a452e93950f584e64d6d094f44dc08307cb57d1159a0d2df1f01f6d2e012e21ddcceaa08d4832df99f17d6d1681b9d0fb7f46ac28e8ee8e9170234d363bf7c074574e837b654b74c5200879ac9a81c543d67b96c6f5e4b2cc76cd1c38a379a3f68f84dc737d2d7706b29f89a0711261c9dfd28d83da5c98ecea3d53e8ad1f777c716e9700cf61c91256ae103daeaaae6470fb63ae6400c9fe963624d0235320cc4411d73a8aa755dc01663f7be166f732f2f94fbbb5ec6d84cfd9711723416bb3c80791dbff009d5b5f7bd3ec0b307c72e11defeebbe6bdb23a05342128c8c5ad9f6e06036f9a01a14a28c6b26a75396fc31aed9a2be7902a30a631c50b6578d2ba379afddc01b14a9e7bd0056ed6edf5437db7c5f2cbda61dab4124219790ed13c2c7d4d8b76be34250b4f3611d0d522876b793214ad4aaf71857349d0def15e344b7cc26f8703050a9bac9920e00508aafe369209b922c05b081f27852e56ce1937428bb38da685c4679a5c6a12aa3454ec1f0503b34f1617b765c50288ac144d4e994db4466b230eb098bc56710efbcc19b95a80660617e9c3e1ed490d111bf171dcfce1dc89d271a35799e3df9aa21f5f9e266a2dae36928d4e13d2b554daa4ce3b61c4aa45542fcfe8822f32c0ec0ee50f1084d4ed9f71ee6d5468252214c8ee6dcf3d511df911eb89bb048ee1a433e3556a71398be57a64d142892f720e1f10a9d468d1bf8fab201c18dad72c927da19c506bd8ed91d9c689db149a89300d12dc2d2cf3451befad4deefd12972c49b36f35accbd390e180e7f849f8254a97eaa6d74c18867971007fd8b8f0d3551f7854168b34fd367de54507eb3ac31f10310738f29e608a7c8f622196922e94fc85ee5e1afca7819ecd5a14188c85b1dbce94df6a3bb5b0ac1e26dc71894174159d4b8e92f4e4b3927351b5186863ecd5c1c054cd6a3e7e1c5548163bc6b5d642d2142805c60797f5c64f45d99847416329d734b349756cbf029b6ed7a55d320a373776cca2da65e64a5b6312104aa72840729f31a5f5cae9a88e46c6744c763be1eb2c58df5c8c40369450c0643f7d1faa2e88935eeac3abfcc16a51d0995693d0f80c7d5418423102e09617f9f44049cac106767fd4a214531d1f6e5292734477436cabae98cbf2ba2b222e4207d6ece0649e72dd6beef99e99bc2f58b1d5211b0eb26855437080d551e61dca4e8cb808015f967b73aa3ec083e31ebe931c5b75bb60793718622f90bb0e0dd0f7230cfe53f1ddaaf676d1f70c9ca9c648f87747943b788999db0c247e58ebb8b8cf95c77e3839850f6940cd1b3a1991cc4bd25a578d58933f179992f4992b0af00cdf78b71497dcc6ce6ebda464b1712f44e214dda7d97b4b97818eebb2a43e451cb87d20aa3b7a5b376e6d1d133066fcaa27c602def2904ef4611ac67029422e5b3f3687c8d12cc22296512520000000000000000520cda0300000000f87e9ee26a2318d7da1a943b61139a3f6349008fc2d82cdc4d70fef5f6e768a7f34143ab8ee01ed31577b2662740ab922aa0b47ecfcbe6be3dad9475ed7477593e0b0064cd54eb0ca6eef01ddf62f17999abff5e706355405f8389f13850c818000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ebdeeaf5ec8afeabc4098020511fd46c48fbaafd64716760159329cd083d7516c58e18a2fc6fcbd39146ebdbde2526f7f317a79075590f8ac6c07ffeefd9c5d076494cc47f6f90e7edd430354cbe45efa9324cb0068737f5ffcef3d242e1a156ccfdc69bda84fb4fae251ffa26e90121c03df0bfa2dcd31b05728121aa97aaa0225e531c3513e36e00816fcc838aacee339fd621e4d2662a548951ca01ab9605b0322454fec6d410e1a11c9893b5bd719dc6417e1c56ba9021928cc095812d643700a07cfc1f0cc4b97f7a1ffa372355b235e8ab146373d5ba15e49f550dfa569dd4c0c761343ba2455bf0587d57395fa8e9510224cf39efeab2bd6fe204ae9e47ac70223562df4319f1610ce8862aa0810e5315ec9cf37d5e0cb75b03b6ce5f1708518021aec55d05523babd0140b620d6bcbc46452b2698fdbf62dcfb7c30d9c83f98b80215baef080cf91573f27bad6887c4a1e2ae09f24f1d6006a9f19c359b9189c364020a349fe14704811c0bd1c6189b586d9ed14560f104b21abdcd3761faf224c512031d79f29ae951d777bfe3a9328f113e0b9811d5488bd03025d756faeb567d4b80e1af90e4e7035f4dabed67299eb313ae5ec3297555743ff433c1e08bbcfe0d81f6d527232a2ed33997117863149210f19238b5b210f2fe1a26486275fa914ba0a1c56de9874ab504d5e038d7ea84a69bfd4da5b9ad56b7013b5862d3a8b0a4d6a6182463b37ed037074b379d76d58faa39cc0d104b6b8b3d698853352e38e18cdd963919c5a810f5afef99773d0f4ce6618067bf5bcffd262485c1ad5784f63b09a637beda153b8457a0f5e120ed0a43a60cf1529663b9573f4ee00c7a0d05ea664d8034343c55b872a72f49d1dd795aac01082bd4ae9024c929102d4fb0f687457d64a0139bbfefe04788ae1166c2ab7cca93d5687b91d276315f000d886b0bb408808427bbb59c123782039cc4c166ac785190135bd5d3edb0016074696b1fd1e224a456a9c9fa4aa51f3f13abe8a94f710c4762deb074cc6221a381bba1b87e52da570df2d8f9d48221f19aa0bd089643cd170742c01107fff43c06ff82dbf44c6971b11b663aaf15858ab27ba3c4ef540f9bbd8077289fb616c699df02ffddf8615ffecd7da1ca8d983733dc5f296d041ca619e6510d2eca1a54242875d9a06f306456b24be2a579d3138e087f95d57dd962324ce8d72922f9252207d20ff2946c1fe34940e7b6e3899b3197023fc8188ee470ce2eedb94387b06b3b016c75d7bf8bccb985db059e155246a1d346823b03f902ad621275662c14181da1ed462f0574d97e35dccfe16a369c3ae7d3a9f6e0de87317b2f11dde42c6b2849f2e898b60b09f2ee912d32eba3240eb66a90d8914be12075e9e744e5fe3e667b0381711cc769ffa6dd375cf2ac840d02541832f851e05a03a136f625b3747301679b5e34dd2bc07224bc01a7f6c185ecdb8b0621c52c12aceb81fce67a9c7c6a657b27f1bb2785dbe4d7c553ef5f1567780a21d91d826536a66c32c2162b749a1dc19ce982e9cbd61abc2806ede645d33f432bc71a23ee09ad0e2484396a2b83e3eaf460627c424679df026c112456ecb3c1dce0aa9178c607ef7a534849a4f5ed1fa38902f3ff35bbb4c8e4ac7afc90f71294dda36bc44880bf5921e9df4c181885a15457222e3e224e1127d11e49fe82ad22c67ef4ad65b572ceb69a2d9aa7b964cccfb3903d2a2b698044bf29f69716ebbc807ba36a0c1110de66e6bb5f0efb16d06e9704c2f19084d07d5e949dbd84be33e9a0ba160f208e08f671c5bb49187e905dbb333164d27c20b2ec50525b560601a9d87b2d9b6a5432216ed8eef4bd9e5925233874bb83f7a8804bfcf4f82411f1be764ee94b1343ea07dd9d1da4c9c73410158f0e0b795dfdf71f7129993c97f729b52f8daa831c81d8d98deab3523a7db2ddc7d8a18c3a7a7fca94eac4b85e66db4c2f43e809b569190c5ca6a7409fbfbc0ffe59556e7d66cb74623a09ded8191fa98a1bdb54414d2be0f05293730abeb4f13cb34a76b4dd7f8f8a0072543bcc84477fc94a99e02ef76de0834786587d88ecc1e10949cc1b6e20486c4e9857e87e1cbfcb951985857596a124e63223658ca0203194a08b59e5c2fa03c4a8f297e88571b2128baa8e4b5466693a141b42e4ab7424fb6d41910fafc98e6ec568682ba3d7a0e15017e57718c4f24af85f2b4c018388228a15adf0485bf6b21b2fab7b7ab16994db5d401b2d73d472af503be946c1fda3bb6fea253d1f757ef8578f741548e1e5b9d6637e614e0987936fcd45d34fa108a8d472681a8f053332359f47a9293d29cd65bbe7eaa8b4442dfea3979503b46014a3111ae17bcae4728052269e8211ba935717c9efca0f9214ddc9f09159f7afebae8dd14f48370e99b10f", "65", 2, 1881656414, 0, "a1c13e151639c6b1871780b62f5d951f9480d785cca855f81c97536409210a5b"], + ["030000807082c403049add25b41d0769ae70e8b500fc4c0719fc6060c5ee85df8b8ce56e990bbbb43003000000086363536563535200ffffffff05791ddeb372c9e0eb0f86337d3e77ecbac88a45b50eebdaba633957b8cc122a01000000035200acffffffff6341d6adc609f1c9e2105320ae077d1fc224b4bfe326c81fe1e917ea23bdac7900000000005a2f44292025411691000874d3b2222bca6a5905c2f6c73cdae147dc1c61fa40de3230a6030000000563ac6a6a52ffffffff0189d3cb0100000000025365687df5662b19e4d800", "6a51006565", 3, -1823706795, 0, "ab1e14fde2fbc95af20358b6c0bb769a37e8f74edb0c2cba21b7f7485e893aac"], + ["56a913730161de8f060898900955a54b4932789a8a734f02b6734d6d87a3d62fc54618b00b010000000465ac6353ffffffff03fe3e3e04000000000565526a6a526f4fa003000000000300ac63ea66d10400000000025365adce68cf021758ca0000000000000000000000000051a91780b999ea9e881465853c95a5d24e1cf0312562730cfc696c50ae224310e28dafc6c11be449d0847232a582c119d935fd4e127e6e0bb54dba7e47c97cea2b5b1bd682b45b409e3d6453753c531110e09a5814f74b9360419f8855e69ecf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000067bd35a1c1a8302831eb466a4fb6969c25cf55e246f7de897958d9bcc248e2ac71377969caac9f7ce1d22378dd62a0169ed590b0b110550c8cc454b4f45533a8ccebb2c30918573044a7e1fd82463c75e2ea3211ddfcd88fd5579347cbc515e67d0219e2c466b1f25935768793df269c898b58d37900b0cf29ad41eda89245b3020723335f0d565efdb7eb2d129f34824471817da66cb85ba780e51b318a42840602269e35b867bc8aaa8a2b7ca1c5a1154876433c1ce2d23414e91f41e0ad691aa70a009556a5cc9a7a3c3818d61df2cba1d7a742f10525e597e2c6c3c4456e46f93bc7d0d2182f03d28b6c4a8a117a28a0782d868119362e4be4a7ac90ed2ca2bb74020dc53f11692aaadfcdb08d58018b71c9f89f6f5a0f7ffe012152d094fb7aba20030237f92c03d7e498b47378341cd0617b1ee7ca730669379b850ee18cf64b880b0218bc0805e975ee49a82c15d681c3467fc092213acdb41c5dcc3bdc76ab046f2b020dacaf254356e6fb1118cac893776581ea22cd37dec33479efb230dd654c849c022859253bcb25da7964cf7d328e54b42b4505bd15fb96b6e5685080f30e6c821a5849467a880de181d8ab8429b59967b4a377b8b7da4c27c5a82181664416e30645ce6c15914f6f80d8853fd5b229710e0d267c8e2786d0600ed80e0171d867b1c16b54489aa35b9c5527cb20d4b42d34415887c2281af8da76f9c8a8463ce2ccbdaf4a719b10d56a35eb670a0a3ab15215dc78bfdcc78479530b24f23f71e83ac697a9e8f5a192fb62f60854332095b276ed3ee346d2c4d5971512411f851a013d08d9c9c749c557c5bb4c785a32c62088979b3bcde2648a076646adb9ee19b14910d334dfde7240128e0167eda2df36e937e0b73148063392909c26051448465c8620edda4c19260aeb8977c7a2828e7f31789b1be8a0329a4149754050ad0c3a4e80f6b5b28e253ff072183f89c651d202d349583f5dc96ace8cd4adf81f68d44e375c258652b7695d538e3cdcbebcfb988d78301e5ed540c4c1c670977b8a29433d87afa97d6b64a9f6f374a040ad904245324cacfae1322039573e41c6af5382ed8bf942cdda4cf2a3f113cf3ed72c222daf2674be969725a2030ee21196b97e91542a43bb4122109d0b62c4df18cabc844424b224c077e88b17a243bb5c726c15a2f2401fe4d28c2b0173fc5a9c4acc439ba00286ed875cb5f55e917dc9a5564e6b6b1af05a88fa79e02f9210bf3eba7ebcbe4ab80d660936965ef8a473bd96e4ab5385ddd0dd560399928427cc1951ed30c8af1a824d3feddfd2d70d910677edd411411e1a5d006b4f6daf701ff3410de116238741c862e9a112e46c55fd4f2085d0601ab76f04a188e67c92febf6e00f66b231c890f0eadc4d6cbf9f5ae1f635d0352d204212fb436a140fda358c83f586aab6eb7c48c15ef0817248b8104c91a8b4396aae5e42109bcda24179ad66f85611aca9c1fb86877f0f296e0556162d4b4be423298878cb38b2610535636d005065e78591ea8aa0f07b19bc79e91352034c7c5237dbb66a057ba45e88b84708cafb385e5116e2ba676f2c2cccb47c1cb5efae7a0c703058814e0b9b02d41e8d65c086999d1d3e7df108cfaa81a87bf674b743ffbd65adbda442ed7d42cf5222bef71ced5def6164f468fa2444978eca122dfd8cb6d6bd69ec2c3bbfdaeec436999e2424f317f158140de8f78393bfb61d6ab95f6373bbf548a718bbe4eb8f8becee71de470e500867d2b285c257266307a6e752794c3c7f5ff14559d7b127726ed01152ac1fc6681bb6299dc2cb51e22685b9ff31545ed1f374dc11f4556963b743ec67aa69094c67a2a839182c107faaf22743ff0a54fdfe6981c887ad844071c278b112d1aec575595ae856b4c3537a5fd62ad5106d42190cdd0df471fd71bb24b3846780896b4d268d94b6bfca78e2ca6e46eb68a872c85c68d24ca60e2af56ae74baf1efafdbc7892def6ca8d19de7708ff8c5e0ed5866c2ce2d1994432fb98f39276c1d06af57b8193ba5414040ef601e0b71820aa54f337ebba2de2b52e4ae6383b3fd44c7899fb64ce331a689251b12623975070e4ad78087991f704cf4075f9a16822083591ee671c234f648aebd17cb781417b640f7b05abaf26fceed9df9194a13dd054f7798fa1e388a33e47e0624cbdd1daa887fedd261bf4863c8c7c82ac164aef7557330f7fa13b8b9e256a9626ffb97bb8a09c9fb56de0052c018858bc86cfa2e484ed4943bee5b2157bd8ffa5f77c67f2e8cbeeb4804000000000000000062dfb8000000000074ec66939bc2b63c58b4b2fd6bb9e234d58f3321867f6eeeed315cce5f68b22ef8e09ec5fec3c71087d207d54c928118314e1af17ef4edef58cd7b7a58bbf1ddfdf4f1cca7767d46cc9d55a9cf7e2ea1b12095859e9577a8d536ff7416299776000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008fd387249db5d6697c5cd0195ecd370424fc50ddf4b831b3a8dc68de86f5576852920b6f41cadcae265c5da7978947883a21db36cf1cfa00057148ae6a5548dc4a6b5c51fa6a9edf4311b95a1e74035b692e330b2a4005003c8fb9e3809baf3a550f002f3f25ef28165243a0b48d31f30a832fbb0ba30dd631d85ef648b983c8022132d020713d1efc9ff442c40f1bf4eff1edbefffbfccfd15c57e183b007468502272aada235cf4c299fe961ecdd5259eb93d777a39d9f23a624516503f0c31fb80b01560f523ed0cd7ff552e4dcba12deffbbebf18a5010367a8dde62a02f0b818864194a634030ff4ed3326dfcbdc04a21e3c3b70d00f095f7aef6b811f2f5169e031a9e7bb731d0432963726f0a44f8b5f6f9bd869ffc28641d62573e06276f85c0032bd8db51f6937b83e4912a9cb097a887eafe7acd537c2af41e2707b831244ac5021714643437fd33363dfa90a38f6b11257d161ef5d649db238bf0a7fac0030f4d03280bbfc84b62447390d8539728e007092ff5a39abdb01e409fe80c9bdfbcbcda032ad87b0934ed2fb2b40933dc31e03ba88825a4d52ba24349979a253cb5a7e3f09ab130d046c5987301903440ef655fc24cf30e5091dfb56e351b778a501244a4d4d5b8b865e88326d5d68d15a98b211639cd7953cd5b3e8d03b795da1a874dee8f5f4b694fb248b6de75d02169ba5e04de5cf6c9fa6d2adb5d13ace1b84c6297a57a724acd787ca30ec10980b2e1dee0979eb2d5dbf34d67894781d11753c7ae6a909f831bf48efae27dc5adee9680959b561c75b4c733c74aa716c34507447635063cbf123ad445b47e9795a1847ffcdc0c922f4388168fdb74c091f14ecc6bbadd938fdaa6097157c0ba9477491040321de2d8df1538d8ecf6c590bfcb5f047ec05ae8080e0ab19267109fd21e21f000632722131392720f6cb2356c6b59879653af5f1db5d127f3f5369c900e792112b6b2cab9a27feeb049b585af43497e54cb22def39475eed38b9f2d6d14e372a3b41b661851812e63c1dd6b0684a9e54f6b07c0210dca7334e1cd6adc864a0d71a796f2fcbf218d6448c3af39f1fb97be3afe59086b52589ae365a1f5aae95abcc9ef4998c79c7d0a4e2857a7d150c5a5ea4bd430fd73f9ee4d18977a49eff427f73cc1e368eec6b2bedd9794872fac1532bec118ae9e4adef95b54331a80da4e8dcc83a2c90c31cc25485e6250bc7164dcc0dd73709ff63e6edda38d61e1a95362420225489726ba69b8ef59959dec5f2143e058ac8a6aff1fa63ecf3cf349886eefcc5ac90228b82034d3fe0dbd38c0a643f83f859fa0695418684845478d111e8d8bc1273c750f0e5c96863dea07b5f4b4ab9218a79f1b90cab3f83178d89f9a30dea553a490540e9362b89c5b2b3a6e03c67b52874ea8dbb972ed96d432ae80135421446ca6dea73ec19009bce8f5c225b48a1ce65da6dbcc216a1b126ad620f946c692dd280d859b92dd2bc173f362cb367ea662b3e4212a629584ec8963528ffe6120fcf3db5447fff1a282192cf9e65bace5e935939fb599e52d9c80aa834a8bff59989aea78aaeeb915d5f1a0bb371460d60e96210d3507d5412648f163ffe42406ee3d36fa088508a6053fd96e57b90d2f1c9c3c7e970f1395a7f0a5c9114403ad1fb9fe84eee8e46ea957290747ac509b348e952035490489cf02d8f16b9b717808a028dd5f611b7e7fd6ad0d18f0b2f2085089503517d4eb592491f5f41773fe45e1252b79eb472d9d4e261a10d5920314919de4f460252abfa612cecccd52afcbe7e029b4e70c1fe89e3eb8c875696d39002a0a8f25a5d9b98e7063b7ed445b67bbe5812c5b8111bb139ef43076ded10c201b126e642241b33036e9614baa38049ae3f7abfed2879affcb8931b3b9132708ad7d25f46d7d0a9a115085b1092134ce84ec208ce05d9822f3aa87edf2810ac56b188f558f97065191afe533bf331c66d802bd8f97ad26163c45225c2c06a75bcbd8e54020c402c2827255b9a335d1f0bdd2776f8e732b87eab85caf9e8d0681f81ff0b37408284ef898f2a0f22751dd998e8e60c14f62655de74dc6077b8e97e4970e11734d3db8261bc07cc23856b717fa99dd3f18f6d05c30caa395078db6cfeae8ff2d79600102c09a127b5fdc128cde6d0b979eb48fd7102dc538be64ce28d33863339b6f1ed97acc876c9e4d5083412ca68843082b3ff5821085f14c8ee297c24244db23a29892bdc80a72ce0710c5dd1d77ad42840341f65c105e744ba39ab86eed6f84f3edc3cfc4ca4b4b41f63407f5d8160724aba9dbde4f718c164da404d4a6c82d12c3a1f289836f16f66e2c4ebb76dc312de8d6a92e949e675cde2a8b0e2e4c3efebf691d873446df6433afb3060bea5bc58cac9a53d39057cdcca341395ebb711e1500", "6a00526363", 0, -19753095, 1537743641, "e9345b013c00465362a8395223779212b2e2688869c43e80af20c9cfac156d10"], + ["fc9a062f023ce41e360a245308db283bc49b381bfa73c8cb26f9bedf26dba01a80591e177803000000085151525265656552fffffffffe1985637bb5d9c4150754f496c0f327a3498ade44d54ecaf0e13148d38b46b501000000055165535351ffffffff02e9cd6d0400000000076500ac52656300af1d230300000000016300000000030000000000000000ab082401000000001d6e1f578e911d972f70b8c1a787ac5ca6e85e4a81e279772d387ce2b185bf02a82c2005f08e07a547e5afc77339fc1513ebeb3e67d396826091d19bc9b6cd4d796311351ea41b71738666079544893d29cbd1e2486e02a2d4d421baeb033c0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076ac90d3e4927e69cf3711dc8226f62b2f68515b62daa08b97b4c3de9c287be239f15da0b3b9e6d07d5fe8b741435177e9a6656754b569a33f3b35d4ab5d292706920ef4e51526d0d7d785da417a1a01b1fc08fe77dbb5e702d3b2f0f1ee356526c62257993ce8717c35cda6d9f1b53e9c5c433c12f1e726f5e5c7f0ea0cd20e0203bf18289c312f986c66217eb143c60e43bbf54c98c21406ef273f85b801d9b7031928855e53c6a65dd2427c98f29c9ba931375338f43f535fe16c91114a7812b90a00eb311341135cf70417d99b10f6bcc10f58c3147fc8f0f4c708905bfd69a5166e9cb8ea54ca745cf1852e64477d221d47736d3a206c3983d435626c7c1fa055030c0abf3e4219fcd72de754ed4f2297aa27936e89f69fd2c38dce99a2fd62e974020b70ab2be37bbfc9905caab927a51c4d7f12a1a7843fedb9c8fd35259afd1dd00324c210f10107e5e99875e0337c2f15c1111f1c980b656dcc2d7c3a5a3c477b5c021ec7c9dc9f7da6857cf228a3f47fc8114f75a4956c34818daa5c9311e91c870d030dfe16ded4c85f0fad81a243780b6c5bc46c89852df7df3b614d1a749fa44880069652750a75aacd0a1eaf52ef2e4d83ec69416886c1e120d92df904677c1cebc05450ac50c4b72c7e6c86e6b2663e14d1a255758c3487ef7dfc22791add3e3c9593c86646e07f7dcfc035f7850a9e53eb76e9f9b14e5299ae5acded5750a40bbeaf5aced7f27e9a4b9de3bf3aa6e49adff9163f8c5dda23bac0e39709fbabd757e4b85feb7d6709eb3214be98cb07cbfa5f0881d6509ac740fc38c98a5df46f14353b205fbd449f13b00892083087be073bc589ed5d47ca2056793c13fa1b96d9d607c3d5fab2f4742870431568363f36a5c19a3cfcc3998543250cc37c284e8111928fbc7a6be359534298fdc99957d8774e306efa019ba0c07ac34df1aeea46e8b38eedbd2849b68badd55beba57aebbf64958b12b1241fbfe4bee090a44687a75f4f81b7156e16f33805c25003769066b87e05078af49e1863e773cab22a596436c822f92d631dc082157988d3efa308a1730b673912354a8e63df6bafec1e459ac773fe293fa40a70ad392790230ed96ffe25ae68205eb5f691c40d56cffeee18e8ddf3a668920933a44af73776568eb954dfa6142bdff9f63e6eb9b8ed2ff4427fced22fa8537dc370e840d10734a0a6f6a47e6607f3f272f6d6f714227ef3ff2d76d679ae96a83ecdce90b6819fa21cc1c203bec2a01118f82673d0f14bcc15c8516264ef1270aa8c72988483aecdb1aec388e29dce6fbf4e93c588a782f3c1a64b49ed326c9b1c548049124212185f865212540a7e4c867885bf1e95147d3585f57644e8e94844f597d349ecf217542ad45b8045434b2c11d1e3eeb965427abac6efd756a2eb58cc45b8e4de557de383d41ca1c0c01d82f400e36d29e17bb7019b3ceb4863003eb9948d85513f634abbeb735d60c757d15105ab6d8785efea2a56015eeee5df8b63c0b3d9dccfa895f5e7464632daafa6addb44874c968f4c26e705f22bb98ac6038770e324b72ee644e34341729b871e76b38d86b1c6642c44a95a44d907e15c7df1743efed81d8858dbbd717c546d07c4bcc825b32906e5cd3cb690bc38d3399df163fe6cdf8ce2ae6200afe614b6dc00856d817f843899d987f592100b65d18640e993b714d3a462b571437810daaf3c89713f4046718ceb86aaacc487d3791548b91e9e44d84c59eadbb289b3894e8badcc976884ac756c8fbf146d45e8162edeac0ed37476035ef611a237cd256a2c2bb8750b90c04ec3971750b09caaf62384c823fdf2e267039222de16be87a6b77076ee653db432b27a70b1f97851d58cb97549b735f67d38750948e9ffe9c2b5dbfb9dac20877756ddcde91bcbe86f6085ac2e80b92da05bc917f3d47f80756f84787f707ae8870efbfdea0e194f02593e1f11120d7132df76d67487b533361f898251bfdec92b9f7c514ef7bed7b92e6ca755d573b10c60fd4e3929375cc3e64cc7ec5cceb092d5e9208a0355cf895bd2fe70f24a82864ee5ec1cab816744edcc4ab1bc1baecd3bbd66d00094c2c578e8d666f1bf76ddbc89da9a137d1c6ec52c956a36281954dd40a6da783ff2489e6b2e933d1fde844427ed850e663cd8669e8ff0e097571c32a1edf7804b0fb483a5a0cd1575665a5369d5d06dcfc7ee3836056e1221c53620c228748eb49b8183516f34f735b8d20d4ffde3037d1e5eece5b56b2f736118753cac3402bc2028e14ac3ebe3dfa90000000000000000d8de8c04000000007437519bf188dffb94f47ef16d2d0a12921ca6a427422d51654f9417c179fedd1395dbd1f2cc3b2cef9521cf855e826ef2a260fd47d4b4b7224153fcbceea57e9b2008d612d21dcdb07dc348e4c3997d3a4bd0eb63619aa93bbe38b7a391d25600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000340ec0633466241331a1bc6e83e175f6e0c7d4e8e09433a3100c31f264983f937436d578ffc651375198acd0d0089a81e6369ddf892693e44c0bcbac95ae739be712c764f5ba67ee4ddaee7fac5f952d5f015aedbf2a103f43f95f833470d1bcedd1ea1cb0a56480fe6b87772d1a6f9dd56f3eecceda9fffde32ec07aed798f4021f29752a25958f0eb4bff3b48daa3dfb4f6c803c43b6bc222d842f793985262b0306bc988fa77825108cf91e482f93ae34ca1931f5a0c2af661580ef6a421de5ae0b05d1c25ed87dd1466499f5969696bc2648ab2395227aa1fd5a6e97f1c0b24cfeecc8ca629b6c76425ddd42c03584d27ce4ca0d6abad995d366e6650d54ddefcf020f4ce51ef992d15f78d1d97ac0096b28bfac60edee075de3121d67fdb8adc9d9031dab93ef2c9dd38dd2a347587e9490c5f53d3154e746a82c1128b43a054333a3031cf7f02de38eafe8fcddbbd6b61f65b8d1c82ca8318fa0564795ad4290c46833031c567ea21e8042658897a6f07a3f0271d77351e5e1d6be0a02db1684ddf1c8e0020e17a5d78a4153f5d0d2f5df4281850f538a580d687dad5666ddbd02ac139268bf801fbb194247d13f43337bd69eb89f04d9e5551cc92e8fb0fd04636af0358534a4f5f6605bbcb6c9925b4fd3387f0fbacd071d258b41db4133d876452356553768125e42f0751e56f2774a9a37b7931c03b289d678551f6226fceac8c22e09973ccdf9b21dea6a19613a89f7f63377dab9bbb9f0c9e0719206daf2d9285d6d9a0f272c59ad5f123a8c4361911d670301c64d0b96f3f01d753bd2ee70dc359bd4bf34f85dbe3e9eaf1c6c7b5e0bb88adf6b8d13802d3307ba0d5015c9f1ab6158aa70d77d214dd959356762dafdf8bca3878100d0b9308759dbc1ad1894f23400cd48d3de4c7d68ff9360deca2d01a6712f22c2f7a963526b8a2e5f2bc004615ac474abe0568363247c35c6cdefe2775124565276c1ce748ffd819c1c3d5a3cc839eab3fe5d517cd39199604a4fd3b0a35c6c6023000a8c50d0af4c57aee282ef8368d711437a0989ab3ccbb607625494b0951ab14420fa5c31a7629077fea89349bf589b10b068d6ac72e3cd6e0110eb70463b4a3da6194de6d803fcb1f7f74d13c4660c0e77f3136140b8358ebd586f9c159b590c776594ddc03be0a819a46874d229f8dcf8346ceff3560f5697c8d92cebc974aaa45d6c1c51b14a5d723b82a3ff35322c29d32220cb549fb0efba2f821dee36973c5a2d0119afbc934004b943dd1b265fb9676f279e4b28b1875a71efe9da7695fd343ba06d4a5e6ef088721c72d3312920da4d6b77e340a833d957c5143afa92949f317b399b8eee260de59e83fd4b1c53c79a28a23c10557fa84693c95a2d3ce4c1ca69c5652e32104b696a843c9a7b4b9cbabd1498dd6fcc16b9cc18c3e23d6ce398e8e87afb6a8dc3efa1a60f5e7dffd1bd289419ea2fe66229e0ac41b7d77278ebcbe193c0d763be93bddd5928c23e3292c172d595edb8bdd4a2fcd13dc887f19d18b3b6177c6c9d82d3d5a4214e393f6085a7f3bf808c144973c1388881951b982dcbf9c7c043bb7d3cb04c701bf5bc3761a1cfb32fedf99b17f851d03d77ccf1bb9f5e66ce25e435f3532f86c241cb0c363330213acbd132b9312a340bccb0351fd1edca5ac5cdd6851548802c287a421189eb482da16edce94e812227dd81cf6632c39a0b2fbc8380bc39a9cccae1e4b9199543761490b02d7850cd08ef72c56127000b34628f02616ad95cca771355d9c733c7c9c98d2bf2b96278ac6aca19fdde8ce0832f9437f1e3cc0185626488607ce150776e2a9354b82633fceefa211dedcf2d668632a025bd739525baa4506b24330a864f196e99724076507587e5a35f2b8103dcbc958fa69fd4da0781db63d245483feb7353e31b85918e548f41c6610d1edf3ff136629f1a6a0abb243b2e2de926a43267e8a7f3b0ebf41fa08cce5613d8ed168783f00b1614f40f7a6647c2ab7537a4b95ac1c65163ceda2e9c7e847df628758e8a1a270280806d81c60dcfbb78556ea2b583f9c1569df77a91298d30620c48b1f83fd87c5e7480e47c0a691d427dc8f9126d5388ab135128330ba4807d64716e98dca0b661681b3aca1ec069cdebbde58f09d6f77c5d21095240018063425d053347f10b0de0ae1fc6b053f0ad6a14dc2550386d65f66bf83cf396c2424bb723d42c1fb74307d63114d44a81f576a31a7e0e3fdd97cebf7f388c346181d3e0b61d71759ba544829229a3b3610ed5788317210000000000000000eedda40000000000b64af53cd3cbea06dbd30034c1a45d06fc4ddd1855bc253f39b5119e8e6a4a7d55cd80bbfccfadc53754b65573366b986c3e0d02fcf82c241372cffe29dba36c665d2560b86b2b73fd872afbfd9365db8bb152b5cf4e1aa802fcf18aa549984b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008945b32867f86fdba8ad457cd0c1f061c1eed1dd52d6cce440024fa70220ab87c2dd97e9ac79e8ababa1fabeaaf74c6d3868747a1d3279c3b656832f31da2666b117807378d66ba830f398924a47531f4bdc7815685b597065d0344d41eb1b9b87ec06da982854ba2797a6e79d47b910e2e8679eaccf83d79af35ea42af075b6032f9a408f882cc11f39803e8b9426c3074819c7f61f906a6b9f517ceffb9a004203248c0a3e1f1ae3fd4b4a522394e2136df2b73b14b1ff56e92960e9cb6cf89db80b06a018d4e7f46c77e5d0576a5418b1db9ef815e9b13c304514423bc0d7e0574adef50c44fe8a3d36c352f4010a346979688f10c31ad5cc1917364c53aab4374c030cbcfefbbd59269619fcd0465a19d1297f4dbfd5f4f8d4d0fe0b72b3c1db3a650211512e4883767432b2152b6fa524a4057e2b569d40f3a51508b5be4d8f6f265f0228882e255b2f72e1d0f012c654778a97cb8c513b48f21cfee15c41ebf1bab1010205b1e68f907ea67662cc17f5408a46dd2c23c1f76b3533e715e72acbf574ea850313b18c5dce2f332fac022a9ee7b4bf57e4913f424e3d9f02fb6bae4d56af3fe56f57f0a461b1b51aa7363861765cfa1bc8415e4f9ecc6bc9bce0ccac3c41fa4d5490138aa2450095dfe0ff05d80a5c2a03a232bd4682e5132700d9a0aed6b15bfd15485dcebf077ad69941872a39c107520dedfe64a66a12fe08aeae44a1d9538a930496df9078fbd8788f82337026cf6c48aaa6c1321dafff73702022bb10ce2fe3670ea989a148f22d9dddfbea0faa6768e113988da527ca1608359bd09e957ff346dc9d0a97945b2a1b280db2b69f28e91b6dbf92d919bf08a3095014853a6e451ddc4340bb5b79c78759b9e74289192890efcfb08eef8eea1af4c2752fc3e6a3d3ba7e587d64a79bc643d33ff8e2a192aced2465800cee6b84ef92364f0a303261d059b9bc0de0c9b7a7bbdc0dbadbb395e7b5adac447c88a01844cfdf9a52b98cb3755493faaca012948a940ac581569a2aaf24899c88f2ce9faf375155c77e72c26badfe3d2a07820a670e3402450404586312f0866bba5e1c87dd33a4cb16125d0ed60aa105cc1f97277d31d98c839bf55e4fb412c055d9829be112679274507b83aca6eb7bf5967afbd5ae935c2196775050440c7d1c93873e31c4dc3f2a961cc2335cf23047163dfa2118b7e1d0b436e0353bc62bd70092536c6fc70ae9e4ff4f254b712109127d1fc7be78231913070ea8c1eaac8eb8bd6710f6f0aad32913f2b80a526a1b0054668356ea439f920287755fa3fe1e9481383cecdfb8a1b5040937b5cca65577b4a3722fe6dc96e74e9990d07f1ff60b4a097487436e730ad710794d38551a630ffa0b8369b21530b39e7e95fc3b1becf99f15ce10c43476fb12286fac0ba27721a4ded4c47d8c81eee4a4a50ff3bb7562067d0024dd8f59c942d328bb5dcb2a9e0251542ddadaa5c647aac0f212403a17264c8c5d5551f27222e232c1972be4a057ce583601cc506ee00d32899ba6b3dc147ebb34b4417857934fddf472544d2283e2924e574f04b46957175c7fd54771067b7c7b1e5cbb363ac3841dbf83a9d79a5b9d566b7143c6dae495bdd821cfc27bd357730e7b020fe095fed52281ec84d12b5e058ec16824e2c8e397667868f1a49384ffae8cae75596c687dc80a9617c974b88f1953234b2530cec459bcef8b1aae31ab8fc9c25ff6bd7645dfd19444a7ea4c8fc385d1f04d28d90b86be86e466e69304aee36c4a30e9161e1175fb771772c2fb864c847771a7d6948a08edadcae6751662eeb92b863ea11036122bea3e81160ff54d96323d92e47d63e88c2263ec26e9ca9774df845ed1913868a94991034c83bcc35ac2231855ecc4bfd23e77d1216ccaae6294e3b8c490decbd9ac1279fe0b4f9729a2a08e8de017ddf9bec5469849a21abe4e031d6f22cb69ea26b14e97a1c2b370e93dc9e7fbb0bfaaf7c619efa41cfc25189ff40dcf3dfde04f80b57ceeeae2f2b3ba6c71c7e636301033fb49e86ba4cf92da2f1f33d6522d26bc9fb7a159ecebc135e1c3826f4586208bbf83408a3b2f28bfad37f4dc04505e7990f3b4382d773610232bae73a694bcf9a257b70b99cfa91fb5e3569cfca1041c3762275404a72bd8c80ebc19fd8cf8c8c38b207bb53611da1e68a5e59bee953b4a2aaedde41de89a0b1314ed8e14de31ea735d9cdd754f6a9307742ce284ca3cff616f7223c0a6dc8b1a8bba68202fba2a6db5f2bd5780fd96818095996cbd9268a7e213efc2b4e6c950e6e8ec972f3570db227995f2ce65db57574ba35b7f273e45f5b6103b11fd1b8bb3ca427bbe75931064d79b92312060a29823dd45523134f50cb1c6df2b507e302ed9ea48115e36f8ef6b61989fac147ac5626de90c5d25d0d93803", "635251535253", 1, 79634240, 1537743641, "64e805ee7db6678ff53d0ec444e1cc1555cc2ee5f4ac5bc753edebc014078bf4"], + ["3379ec270157cc12778d39967f82698e53a65af9481a1e28bd29b15af8a7da81b2ed79dfca030000000163ffffffff0201bca2020000000003536a00b17ecb0200000000075352656a65520061c9d76402fa59de000000000000000000000000009c516710862f930ffebc267542a9b159358f2e46f392bb65ea6d7978ecd5dd150acb09d37f0b6960f64dde216cc548912f2a1e769d22850b2410fc8f12b50f622fd913495e618d77fd4025b99da1cb919fb819d4c6618d6d00d79c8d2d896a9500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c992cc2b235e32e4c89e4de42c4665c65bf8f9e46d837d1ebc1a65b93a507dbeaa3111e0984170c99943328cf772b8a23b2ea1e1daae746704702e7e674441280be9f188710be0c408fd94ef2a26d8f3f5c223b0265bbe7507e1f8c5f1c9226fa41121828d8506b1242f25a50832318b3bf98fbdd4d200e70adf1c5202d7c12302219616aabfee9c5ec8d0522b5db87d07fd1f59b83e6741d579c5f0573a417a9f0206035e9ea0848d8d26320bb19eae9a347d71bebbcd2902a28ded5f38ad265f170a063b95003dba0f8d7fe526bb6d64ac45717ddf0453f9898bfcc99eccefd6f362b5719a1c4aee111ecced26df8d2430d28fa85fa02be3f6c34d990c3c87243496021eb6b7d94127347df2991c3fa58c3526e961f06c97f9d778eec10f238008c3f60322103a2426ab147684870472ce9e385176cb0955332d71556a74948244001412020690d500231219dc98ebc020f248001a463decdda420aad66b1b9a861f84adee021d4e2f49f4c3ab5ed2abab9234a75e3e067d7dfaaeeabade38da6bc635cb38e60209d3c1bdc1ca101a68f322bf08f634d428f8cb582395bbe5e9077ef542e015b1e82b20048415f4aed89dc1e9a3b330b3c1acb1e13f078a137fbd8261c6fec434a050001d7fc906c6af880ee8ed551c1d2f8290cf849407ee7c44f3e5cc09a92c2bc1f4dacaa7a5969133529cbf716da49a7755c8636116a36b7343b1cde239b099f48afd8308649ca45fadf155e6dff1cd4d792fdfea888b4ea981f229fc95cab23fb286d276ae1940322e67bac6d5f4e147df2228c532290024b7970dd077dd7af87f4bd41982cde99941e18c57e08227053c9b4ad8db7d0e9ad382903b8bad3b68c642de6b0e19e02d0507ccf5649c7892cf3d59991530017e8196f49524d9e61cce4efe698eb17508689f4b807d093f72fd2ea29cb58a9136a592f6b78a8e4f8c3fe96269b5db31abaa4c574c84925a53eee7d2b44e0ae978542f3af1c39408dc2cfd8c6ea2d392f847f0aae1b5d848b5e62701f55a0135150ebf9ba106a608436e7ffb4fab981a9f4e384628fa782f939d69ca0a821ad985ffb11fa5b8ec0e7c9f5feb8cfae3dc8c6d661d5e9978155d9e6871fb0e834e57294fe702e7edc5e72af05f7d05e7b4fd1ee5b1862963a0474cef93d6d8f549b0f2fa185de716f26e9fab13faf4be6ef9538c02b7c84ca9fa96b63364079e98249a911c5d59803a64e1ed2ac592aec9ded3f7d3e899d95bd09b7a2b09c5bdce44d56f68d12ddf1debb39f8b0be07550cc29c55b1334d51538a5099491817293a36196de92574d8dc472b0cd517ed7cab52eef2301ec173e601bc5f292b2d4839a43e1c8dacc264c9eab5c0eeae7df491bfda904213747ae823640a4622d8c9cd70a9ecb8b29426b96c8222ceb6a0943afc3436e61c3d63d75b85c325b6f05809f7c06542d782affa3fd0ea6ba7e90ef0d9cc5a54362ca6fcdc651600b6f9f2b53c02a2ea98a94492033d0cff8e3bba8cd3adf0df8621f2b3f45ac18441b00a7e43648ad3a3dbc2d6ef3fb39e81409e8b77019cb5ad24b270d9d60195df6c184c909956e027889dd8947472a820b1ab7c79accdc1682ef6d647e9839d51c989c5180308cc38ee1f4c45b17212c599e8b11f9b2eb926975bc5444aff364d514a867b2aaaf42cee57151d14e0f4227763ee3d250ad9de690dfd2bb66e40d3a87bf896779db9661cb727cd044108c7536d8632c15ed106b7bc8ccceac5155bba64e1085e1c4584786fed5124450bd390e4e49d55a5ac3ba047f8be03b933e6cae632841ba095115ee14a51d1e7ca698655d09e40d6ed6ccfa3f35eb7411db46e214bde351565fd883896ff4ba096c8cba25dc8ff5925021046069dcb513e6628704eaf203966184793acfa81ea9659a8b0d82a4ad64196770ad79cb6cd88b338e800c951de33348eded31d9a090b71834e29c098112895ad24445e4f6ac174833ce690e38ef931b9600b1f89fbdbebaffeeed72b88c72662bc6adf1f85f2f0599064000a8164d7ad85f64733c530b923d3342fa13555207843902a977b55bd0e3181e2757942f1e6cca23d97c05b43e056e0e4538a75e650f5e0625463b803f1cd8da18c27b1e4e7629c6ab5b3631dc9ef3d8514ecfeb99f534e4f4b1e8dcc1506a3d81906f90bdfeb5caacf39f929025360545a68844dd700a7e0df6b210e95a59e5e17dae80927670ede3edccd6f152acad9d46dfb56a079f7fb08677cfcca6e879ddaf1900f272b923955586d11a6e6922c623e2bcc2d2a07c0000000000000000fd22800300000000c0039416b34adf2b514329c66a8095debe583f1cbccd1fc20c849791f3359f6724aef36bb0f5283c558c3fe961e461d89d5e9df6479aee3c19cd26eb73fdd2e040e65cbf9bde5be859c97fcd1e7a3f26fcaf4282dd5471b1c9a1f1ee98463c8e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098ee27df6a54e4591f440b3b95c06e8a87efa7d095d930a8a2d96ecf42f2dae03f6675f04f247fb76414461ece5638ac897ce74354722e50e2bf845d860bb902af600d3f4063be4b163409319bf7faf0eb733e9bb9bc9900b404e694668517a369ce0e321007452efcb30f5dc926af959625db41b1176804c3d35f34dbcd708003290b71f4c6eeec67147c001b63546edac5d8e40b21c0d3101de97f72a4d6b7da03278661673a867a00b66c661c3d0b8770ec9afb93973870fb16a25d86aef332ed0b00505de9491440ccc6bf8ea77eaf69fe21dd0f237502be6d2ee0f40866e9fc9dd7237d1925898bb7c7b8389c263b9ed56bf828f7c07d1017a60ea0676dc4f61e032a2889eaacbbe20a8cc17a14cdbd4e980d7c87b9e1a39f43f69fb546eb45ca410220de0493a2f57aa7891a04ad3ce7657917862203ac0ec02aaf291b71a063f20403165a6b688762c6b42d9aad0d93030cd8564b4ad24f39f2a835730006301be82c0210aaab6fb99f0e0ae7a8f469fa0630d09845b09a6607f6a15347406df1694893022d6a7a69e0f3987b7568eab424f431484508bcb427de1d08d3998614380a7c14c44db67384fe74431a1e39c50f89dd7427ae022e783166fd1efce5778250e6952b06a30b6285cc0730299adaa4933d12e6d0ab589c3ea80e7ecaaaeda82a98843e9aac3ed45598979aab1e7b6627540482010d2378dd6856bd34969344faeda375782d6660651121c64c9c0587aa1dfafef00b600b2acdc4ddaea336a1998a79af12db928ad1741fe7738b00de56cf687013b179d4ede82591f1e52bb5e35d1965c21e78c75fb584101e2eee3a20f34816014b0437da009858b808a798fe77ed904ef0536dc2eb21a56090b882aca1cfcf7e89716baee463396653ddccd1bd28e96c720072c81ae7ea2b6ea6868c739aa6059541683d28d178a575fb08bf8bf1a8f638017f64baf0a1557d3356369037106ddde92bdb9374094cd9f15e4d5d6d2079fa12644b55bac1f67ea0b097664894c486ddf7965462d0b03cc9a6cbd49ad2881c4fa438f7867f347e11c81bdcf22efa4e41171c3106c28aec0e53c66ea6c21f7cb2373b8b06d2706f51e4c11b5256a9d6a80baa924c655cc6c8ecbc39f01ef9976802f5d9b7bdf5d4e1230df58f7cf5ba14e2f15a744ffb39441b6a2a8bc25c57caf9506866b66a2e0a061addd12b6a696ba50cc6c1a4d9e3fa4f05317508717c796a2857892f0738ab88afdef4dff1705ca87121c309aa340a10aa6052d728b738486cbffc89ce962093363e1fcf2fa912777a1c63d34049a18615517e0aa23fcbc0560d0971641b9e5514f81933a7443e44e6dbb2034803ec62d43a840a7b9ec4df1ee3a94102664d970deac2fdf16402a4327d2c63cc2cb3547cfb60d3e4f145ab3b6981e25b024eaf95697d6aca23ad53e4fc07f3c4708259cd39cd110997bb60fe17e72aebeaa16fbb8d41cf9758bf4ad7da98a9ebc8ec26fada19180452134d3a02e928fb9c535cbf94df606422773eef01f96af7b39ada6e8f446db73325c3b9831df2c442c17b656243a85972af6af9b1bd61621049c00af3984a3ccdd858c92e6f49e6e6a40932c83457f95850e6c5d3ffc6f33e6796ce7a05181f88bf196b5dc34e064fb3dad2969c5a94e047a6981284f48879dad1d4e0888573a2631cf79528a1658ffb52fc87c8aeb90d73557440ae9dcd05f36376448a6ceb36fe64f4e5fee7271e07fd99a0f23ca5b52fb7b47c7155ae3756f6088a2851b40f263b531a413f5ba8456f0017faba2a4363108e754c956efc314c6c61d231164879cce469fa3728df935c364c2ff0c0fd77a4c0e21d4d000af31e88a0c50cd46ea67ed716609bdc8d060866a0673c6362ce46c6596a655c681b3d3adf5236ab2a58b3df8ec52a1cf291372c8fcc65ac003fd0a667376936d541290abae24ab996db0ae07dcf63f105713a02c6ae926284be2907f669e4e299bc0d006ecb69db2df3301135fa60c6c8d0615ce72605287542a81d6a24fd58463712d9d2930e237059b7e95c896425f7b70efa059f0046e0e3502727de63d3766007e06545ad7727026e77d0bc2385bb229ffb15b5ae264d406fb3971e32d7e73792d4eb5653f2f2949d3229976ff39cead98702b16dda27d3fde13452fd78e31dbdd9f47645c140819aa5912fe42d15196e54cb7b5a0a6180dc778a384fc19a58b088c2a9407d291431597766ef9d5e8d99c47b926d90545591b4fca3a50b9f7711934133653597e764e158ae2a4dc50aaf735e6cd14e2e29db932314becda4805796cfea1bcdaaa1f0a0d130a8b121f5e967f4ba61ffc334463db3f5e1000424793e033422f6f3f620404495c3fcd3a8ee896f9bfa3c8b4cda4c19f4ca4a6ab0a49f64cbc46a981b3acdebb678788b9eacf337277803", "515253520052ac", 0, -333550652, 1537743641, "928b94c4edb9482569c911012e307554755e398b0bc5d772b0f8a21f13c696d9"], + ["139dc5020260caf5d8ea2ec7a469de3da44455c03fd9cd21d730ba8038a22b8063419e52de0200000000ffffffff5ed76cabe76d825d11e48288ae33d2049686bcd6fd8d35eb533fbf00c136280302000000076a656a0051656aa4bddc150312c1cb03000000000251524c91b7000000000004ac5300526a0ff7020000000003635352000000000100000000000000005ff14401000000003ce1e7bf175ee60c8add5796d1849833343452e9da1b7909d6071a0b1bb06c1b7b33e2de2a6aa1b40fc542aca7edec4b8ab6f30fe7aca91db87fc1889643c3c65ad60ce06479359740e8c7b1a1afc8b6fea097a746d4272afc504c58834e6b9900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004b1ac537f54d1d1219dfff89308b0a50c501a53ab88610fe3b522f12a614716dbd4b01cfd621dd5756b5b81c3fa6cdb1db817ff49903277002c9f4e2e5f0e7e54b65734df110db5dc2e6df0be47f9b9129994458e6915c80d704853e203bffff3133975efbb49ab5709de7f19625f7343cc0ca6e36b1049477bc8ef6347227031517b75c28fb09d02f5cf81a30f7a16dd44aa81b63071495bae6c326b52bd4a203084e5362d09811f5e97baca2808df414c28589eff7c54169f683860cd74bf7130b082ecf71d5ff9a7a6489522e1d51ff0a9851875648b67dfc5f7a611f5732489410335778be86b568c7306cb453d284c6c50c3effebed5f0954567246c0f0b093032c2476f18df17c71a5b8f479da59d6ad8c1297f87f169f75e497524be769181b032af5e9cdceaad203a77a61da84e7142649251c9825bdec6a7eb379f4babbf663031f737a2d2240aae08f36097f1aad09103b7ac76d1e6278a2561210fb8377c2dd032468e1a1ae1c9f0f7688f065dc7492beb385c326cdd21b91e841037a370968e1031f10f158801a527b7ac0e8e69e6a40cc7fe6054799239595fe1bc4c73e36c172cec0d1003ac9f4d93f81349639e36f5df808f4f12a0d5d00f98b698ac2b2b4c5791e6db4e4f18be656fbc13c7f28759697f747668b1628bacbf15ca4bbe84af34bdeba0c6c48327742c49f67adcee3d5107914a48d86bf392f7b32c8073f60557daa872d9b6a170b3c5457425e5719b2cc78586f6a012dd043b07f7232732fef84e8de907901ad17d226ae709ecfa2f81b34ed1aa481697b5459df4c4a6a3616290c35ca73ca2811e55e1726e62c273f954a9b3ad71114d7943a80230bfcfc739512c51082b99d03e50e8e7d80b4d06cf1d185ebd4212850debaf77a6c967665d09f6ada20c43a4569b86c5ad6c23cbdcb6886fb113e9d7093f13d7b23e13edde1e15928bc5086ad3e5dd2413a721a989dcde97d41b4e801ddb867af46a6a46075ba14002a9e22dc77701712ff69e17da831577f539bf9e209ae6acf0986c845e6085459f0c187dc7dcb9d670f6a5c5a9347840e6f9ee87cd0be64ef749cf1bd2c181f25a27361f56e20928371f319c344d006f27e4f7b2be0b48c7d3a1b578579668d7252380866587cbf5548dc2d2c5a284f90cd48511cf18acf4519627e3a4a04ef612cb18181d4018eae847f6bd5398b1debaa1ec300e20d4370e1075d3f43b8b608fb7e9c09b4316fcc4374b2ecaa05f5eea3b1b02db2042f28cb239729422a1998e9fe4e064930259a5bdc785d9170f554a73a056b34e2f920fead872b0d16349ceeaafa486ec443377e6c0966e24e47f5527dcb771d86b1abdc6facffad4e189c43d5ff891421e0e07ccd58e37899a12de818cc0b4a9a73cfa81a88b57b0b16c5c3c71fb79afcbfa8afa36b5b3947d98973dadfa99ef2b93cfafc456aa06ecce88766bd2e293e24b9c2741299bc36bcf60e8df362ddc235359ce978937ad2ced5629cff9de4d07c4973db06a19fa17264b72a0c54f132ff30c7b96476119ad25cdf5863a5a6728971dd9c8569e6c09db280a7345bc219c2e6dce2da1748994a4486507e88fe348aa1d09552605030ed496f82ac6523127381294a77a70b740d14f37d33a65b7aed253322426328f432c16977080f63d60b71c809d03aa8516dc1cf03f6d3bd2e004882f1cc9cc4baa6342ea07bf86c1923862e054fe792be45c74872049ed1e61821b7046ad5bc12ef6238097972df4bfeea5949be5cc8bd4a80ee5276ab376e7ff3bae32a95dc19b3d81eb83ee327d5f3cad1c0a369831e2224542fdc3caf12c6bafaf970fb8e8a5161ad23155c4655d62e154f8636e480bf9f3b6c355d1b2137825739c365aee2c7767c03a666b189fad3c98fc155481877c02117fdd46e790ece9cdb950cbb8fb82de93b52be005de35feb4a898ee46b096c684541cd122bb74599761143de3ba84e806cf132cbb397402d0a87fbcdcedd714af058c9d7363b35214831349a72e85045e4195859c77448c5acd01414f444c31507262edd09d1981a3755b7d2a029760443d74a9b0a3e42b790633b195e7b5badcc4b7720743de30b58e26cd496bceb85dcc52872c43dd1725337e34e99b8079654365238fc35dc4104c55cebef30ee9977ae75174131c51dc6482c3bba9142ffb989d3898a68b9bcefda72b67ff100cacf2223c5df784cf41a6ae24fa739b524bced27da6d645f271256f45562c028c54c405ca4d0192473b814e031d6fe8c7429b9aac46c2e8711548a18d2c5a6f168150f9cece6b7b2b7a7fbe88aa4d6a82fbd31e1133be292a04c58c264d75de505e35ff6aacf4d7f0bd1d69fe14adb46a3d780a12858559bfd430d13d78c345609cecdd1e939dd7c0941102d68b240d1366196011397b71aaa749020af0c", "", 1, 1951606850, 0, "fe29a02c4fec29ddffadee7a78920f0c90ac573c78112f4fc1b1f59d15d5a95f"], + ["030000807082c4030109e00f361f49ec2e61b77ed6226155d97dcdbda912c001b1d04d3247a21629840000000006000053ac5100ffffffff04f41f81040000000004536a5151996a650200000000076a53526a530052e2c1d105000000000600655100ac00b73ec20500000000076a00006a6aac650000000077d4610f0300000000000000007ab08b020000000011bb0b1aeba6d30e9f085f3046180ebf68291b243e0c94ca5605e53b72a2d541438e43374d0052b2e1a215efa80e802ee712314057ad383abceff77fec998b894f99e242b1e718f030ea42bb7c58bd062d6c57eb45c0f96f7ef0bcd62e3308e5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c04345ed9442cfafef8d63cc060510c9c43541c8fa929140e926b66673f471d9f7421e88f0b18cc5f7b7d8cd4fda3bd6503b68a2ab075309359d5775efe30d9e49df128e3c3851ddbfc1f0960cf52bc3feb52c3fa452cfd8055dcfc846b52ef649aa2082096f4871b7d095d60a0d314ac737a83d5b8cec223102db3ccdf6148030f8f861a0b1c34d8eefd6b94903f4908dae15d583619519cce84f9c421030f8303070e79433ecd1a2672658eafe2dbdc7f3663f3581ff2f4259d119a36f42147400b0441b1ea9db26b52e59321899471783480a55f80111c2cd5af59da7c0e21566cc878064ff25c556fa6ac03581ac76e8436af0acd6385a291f1c97e5025c0eb790310fee3f16a51cf6753c9b0beb9f716dd78cb24e7fab6b81337a2aea4dca9afe8032a635e6e593f5c1f0d90fd69319937ea2436c604c03e0f202b05a347fbb8d2e202211496e0a9a08ca2e5c31ee9ec7230d28255fa85a3f40decbc2b2d9bd48807780209c87cbea4d8cf2db13c045d78207eb50875cc65b2e87fe27a239f107a4ee77803051a27c07427f531d18c92f54d1c55e1bc2c417406d9b2953e8653b48f90c50cf1877e304bfb2e14b7cece58d63dc0ca967b2fbc3f4a604ffd6aeacae08fdb5f3cd0c9e30f874034b039ed775e54bdb68065519011372034d085a5258ec572e7a4452670c8275c04b715968f28a8d0941c99c89b7d64c536532dc474257a88aeb670efb8eb228b9bdfbd830a2c61e188378811a5802c920c221a7a6b4762250e564fb766166759f7205dd08c843cca33e687e7f5c623d2f123479ca96454de3beb977fb0e631a38c81219dbf03d53177c5bd9de18ef0552be538216aef86052adcdcf75111fe1353835a746d3cdbcb0e65271dacc5023fa526da948f78b2cbe2e00f758e2df76a5bc589e69f1a0373c98bbdcfe1437d24cd1de665a25b4580806745436ad4b403c8d991694725392cb4d6e54f11e1f527015194fc05fbb169860959ea6f238915c044d822fe9fc7a199bd8564cc443c9d66416f08d7a87473ba07ea663c46b91dabee295cf22ad20e360855b5b576757fd68caa63b5e11126c56d35696a845d2f5aa9b3e368553c26b0e70b98490dec7d9632b31c773a408580faf6fad6b97283f6e171f16b0d4b20ac88a15fc041df732261aeb0672c90acd306bc42241dd19a3bcd995d3406679cb16b8c28ce0a88fef182e713ca32adeaf63cb186b46e6b6c1a7d533a724383167583ab94a756bcd7f73c3e1f7617898bf873ce8269f45edd5f5051d2f95f2eabd5130eccfa71d804b8b979cf9ce363521b8d950f4a13d98239a32d67d2660b0cf83a1cbed9f49641aa07de1aa121ddd0f7f81eb3cfe38a8414c6a7759a50c8651d83a09a8f4a997e30811e499aac67276dfa3445704122a1db113ef0f0a3c70a318995631fdafeb2869629af6784855a19e330f76fe2bbdd4a8f309550a1d373e3e92a4fd80063d1b007789d582ee4b763e03db85e387cc15a91fbcd9631a61ffacd893e778d0d9744bdfaa35ecafe1d8ca8460badb5693329adc0000bff226f737d4c98a3cd5da1268b91e1f11e7600610e847d937877553e6aee5570914e08a711f8fd0608b62cbe5bf851cb96e05d701d9a008369afc4c88e3b6d095690696462166566af2a6ac0da9188bc511c13de618397a57d3bc574d1cde7c550499c6b3b04bc7e52ce7131b5e9b9be3309a6e33c804417bc1947431243af0f2e9465f9e7f8dcb5f88f1c5a12ba24ba95af169570e568133da994800846509df90241f160603f273192c9e2d058a736432b7c3011fcdb9d989b7f495012db299a54bde8377448cd06f2f890265f4b7cdb2294efe11165c9fe1451e0d6488f490f81da93c07005dfac6ffca8fd2ee3e228eb038d02935f0de79506e9f17ba220e21e2d8ae1cac98bead1dfd6931d27cb06f59f889439302d06ebd6f909989b45768d0fc57eb0146a634e44230ff39ca85df6b22af0a2fab726bb6d4ff37c008b04be8dd740ec4e0da2c35f711cebba2cad1c8b2fa9e62d9fff8ee41f54032b96705274002a846c10e60ad75fc07b2340f7b51542c37dbf83d0b022bd8afc4791675e1bbd6af675e7ec02075488779029c52c55750c13536f9715d975fe85516c0719530ee8c2591f6fd5badd38eb61cb1a130be05e0e213ab55741ea08e0cae9c059d8be759ef5fd4d82aa68b23afb583e1285cf3a56b1169761b917987c5113f2703b0b8a0c777d0a619864c80e5504a79cdd26df7d4cfdd5e2c517d02ccdabf82e3313ae230000000000000000b3e62d020000000056a0e208f064b16729561fdb85ce36122f46a1a7adc3c8853cf713b84f8fe94cbef9cc43d00ddaca32ee9ffcf7b7ee05533a3ebcbf96c7664f1cdc2e06ff4c0f1beb1661ce3b211e2ffa07372fd803b1790cd4c405c4fd9332c1ba3434e4d98300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000823c97d24db76572ae4849cec1f92bd4ee1ad9644419b42b06d178a1ca55124d7090d2c500972186237048a5394a828f0ee45fe42f71b05cbefdb37daf603b95e9062b934697ef8888f1a2affc4e09a1b8fb76f25bff215cab4cc4c266fd096444725ce06927b9ff950656b200fb1dadcd2efb41f653a23ff1264c34c6001c8c03280589e3f6ea22f6f6172bd2e88335cea2b5268815ede9b0de48315658ed360d0316e2572f450b7f124944b7546c31ed6392ea7fc20a96025ad311c015ebf612440b08149e4808eadcb4ee55995e390b39e8e6fd4edfc0923fe6f32f8559fb241e28baf780317f9729861d4c53060558499cc88b614a306845b20588117045aaf9ab0311a3f70f7fa5626818dc8356e66566c446aea5106c7285bbf2355b94bf49252a02117d28a73662cde57f5547b7610cd11a6fa365a06ca5597fc6d5758e2a54bb850223589d62d4516c7ff69542b1e7d07daef07dc205157805fb86989bdcf122ced0030773f3258abf53f7638233b3d9a1cc1c57d97875c46999530a4e91fd1a89b3e00229de41c804a072dee4002388d238c0873b0f90a948569d4c14294cffd462bda5f7ae6bd08d88b14097c8cd0003f5d08cc35fab73102011c559828207f3a65b39c38ce776565bbf543c6635073553aaed8d95b557e645693e028fc61c790a8cc50168b133367e589a8df3b9a3ac9975cece5f2ff16266ac314d9dd30df727702b321fbb7071ec0bbc1063004cabb0480abfd88119a9fd1b075ec0157bf4d406ca71587c68ff257054dd4e6b0ff14b21789defddc9f34ea03460e08b6045569a44b8d884e1d53882dd98fa43fcdd28149322294a887207e975aea380c283249837299f864089b1669ee12228ed1fa44daa1f67acf8828fd9064e366176ccdbe7a9e5f30eb1f08e65e18886818e7670345ed77676738f334789b8da352d783171ea404209cc88b4670f60274df6c89968f0be4fa3c09dfb8c1dfb2bc12d5eb7b04c6e0bc87713dcba530d42ff4be6c9e6c9d9a079473cc9a0f945bf41836fc182749c510f9d228d0219def6d2c9de3b12d33986f32b159e632db19eb160d3a62592255156adc7609dd5e53e43f56c6e3735351eb0296dee865b6ac51328c4ee6198582bee857718633c44eecd64933281213307b1f064b6435c0492270b4fea729376ff4fc30e2e33c48d62018d4b067ce1bf22a205c8aef031a5936ddccc6f1e26ecdfdb5c4b52dce662ecedd874e4ce0ddd532029a71da11ba00c8ce3b41b6fdf85e76f471d2225c92313f7ea804c6e9d3992f309ea3bc64c3c0046658cf702f5882322f5f465ffaec078c0e9f05dcb3d8c275a4e707e617bb5720b3b12cab8fa45d26261d44e39aad2f4a0a4930c218d43db7422b74376ac0bc729b9f18e22c417c525b66a543bc97fe84adf881a0970e6d3449604ae5b9566eda66465a4e100bccf3bba89e70e487df1d55d8229f52e2b4c867ed6458ee1f1dbc42a51145f8f1fdcd5b3828899c55c528a09653584ab9074f1160eefe0f5f90f89454bfa55c4f068e65e142f62722e5d13680421f5704b21d3bfdf8bb56e3ab074095bd7c3f1710ae38bd3313eee6f89dc1a61b5154a11abce90da880d6dcb2631e78c47bc15bd9ac9b7f93b141507a6636f99f1a52557cf9ebc25b507191a2a0440cdc6fd94ff0bb113187cd256574b3d47ddeef899d0563a8f45942f17424499f52efaa17bacd7315c360bab191a67107eb1cf417945e3ce56b7a142ad3fcd9ab6f0fb89f14337c5580106981e687bb02bd2fb6c6b68aa60853485757acc300b5e1607be94992b5f1f5721b30cbc2b072d23810edc3649f0f054adc8477e96bbcd3a4a488c0aa99cb9708f201bed48fed88998f33906498a4441fa339e10f6f229c42be5910e0d09b80d15ba31c182b3b3b0710f5eef120e2259f8e7ddd2eb73cfafd15415be59e8ac8cd26e9f981329aead2319a77951177c6164bcb6c0989a0bff7f2c53e9cd502c24a90cedabae574ddb346c274b0d27d3e66cce57effad8f4df23dcc9588f460ac942713f49477efb61a92e34a29327e3b0c25ce733a47fe0a1f2f7659d2286df3a5145f05e2d74d912f91c1e0caa78fa3b69b1161cf6a4d1498500cce798a36a535cf06c709319cc27c334330530cfa538446e2ba6666015c4d8766732f224a6f21bdd254f9f771bb4c642f2d9bc8b554a6f5c48d50d7550a32ccb3eae86665ef7156bcb5c053b17f66f4cc032de54e4d99043ca29854bdc44bd79e24c2259ecfed916b3e97c29ce0a97f483404699ea0b04000000000000000000000000dceed4e1f8ae53f427f71fe0057b8801c9d643287616b7f2bf0e3bcb98591726cf0d35a1cb1973a0ae3f363a5b31e3f0baaa657364e784e1a087fddff82cb5b73244b18da28d0f66734ddce700710ed4f03a425f8c7344da6df185db3133c93600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65accb1f5ce4e4ffd2025a6a7f2e248ff9fe304ce3306b5aab66e7bfbd2317700ca18d2b3409c5744acc1448aa14f871d932b4a58ce6a4f45d5594a6455b6196dc2323db7fc6fb8a7c7a032a1a252a0c1a0623c4eea50f3694f1f81f8921ea6120900cf1d9dfd3d431a097b28175df6cc5153c5691618680815c8350a7565810215b71e92292735944ef6aef9573600384dc2ec9edcb6311004ea98320484753f030a3ac47430dd812663e09d64cbaac6a7a37df0fa2c3ace51e81dc3e0b9f036000b08dc5cc80956b670013122329b8929fff41a10bc8d35a43003ff9e18bf09f2148d3f53ac2ad8ac633436b9acaca6bea25068f6ef151ba53f8e8eb641946f951e020d444e14cf945c1e601d7be3106c41122f82f3ade594f6997df0a138eac394940204493d57c6ceeaa1a4fc55965d1af83eeed7d6099c3dd6d8267ebc1aaa9e334f03140a1a0859749fb182c5f0458b9f88fa248e0d85c4f77cb5b98c3e58de969a9a0220e6201431ec75054557be48e6b08f3a4656d54fb35458f9375a3ecc8e8c58e7032149c2165bba160704e1e767b6c11def2ab2d7916d58a20d25870e97069eef5eb33240cedf722cd4b5c4625c5bf48241f03942ad0f7a413e567e627d81fa811b0f460070e54e167fec1439d7f89213278d5fbc24712cae965648076331d0ee8d43d2e0bbf709953ab0c14595f65dac997948045f724636d0cf373495fc1dff31ed969ab5817a7741fc3fea630e6e5215ad5200012daf86cf6fefcac63db0f6bef4771dec20d2df85c4a7696b6c0dde34990eec3236aa3bff794e244764ffdf31c007a67c02d6e11c48ce4e0e1a56b1a580bf50631373536ac38e863f87aa8d9be274e7aaeb58cf304356ac44b672ae5aeaf545f0555b34eaf9818ceae868d47bdb34b9bd881a01436b752ab53ff8af10566fb507f33c898d655a4377edffe28570e1de2cdc6a0cfc5f4b4a9cd9cc83f7fe6f04b530cf79d793d74e552ddf7a4262552e070ce413395eba34458af648d5b19dfbfdc20dea8ede9cfa8562b505fe16e5bf478fe3396a6ca468ba1412dbb04eef164acee29433542c48a5c9c1596f509d2b407df82f2cfc62c397f5bd35e3b309e0b596cfd4845575417111143cb94cbbbb97000e5d7c9eff4b4cdeaf4bde0137e20672ddb192fc4b8c3e4a9710b803a377368e08b5582dbe3528c1c8ab7fb7f1755ee6eafa1a026419407e6029bf874be8d6d508f5e16c52698b8909b070fa60f2b1edcfcc0a4ac3129b221d99fc52748948ed273980c424730b5e5b2eb20cd850cd79b0f77c996477e27781ae7353d3c0e5981cc23101d4ef7ce975b6f85b31c83cc62ec49602bba54c45e02781d6f7d12350b1509773ffcb838ae155a1c35925f2bd03b2df9ce16930e9f4193f1a0275e01c1465d84dc0715a8ba1b221f353a34a82c0d6723fc1e8909c8c702f18b6488eb5ad4c1d562a11082bfa37c30b958f9f6b5f720a5b74385f09d59b71e2edf133c3a3813ce58e0450ca044d978ec18fa2f2c76ad15b9080bf01e516d7cac595fff98f8f3fe2e897c9ad871de1d81082107cce7f8612ca5cd05896418020f44e33d6101c9de9e4ef04517ba2695d22cb3e16ab5b468e556360d8308236ac4bfd5d70532054757f17b648db6fb08033c60fa60f1e638d7a50e0e3b9599ec276d0c3dea3c80344f411b07eb03df14b72d231bda5ae063d1aef7be2d571bdab370d4a0e3db80a3c96874143b6836afd3432ea0de4815273b2bd97b4170d6f03f596f61b5cc6196f913b4c08c45fa1f56080abcbe7e34086f9bf2be66116c7abc9e2f14309ac693747c8ba35bb92a98dadb76b54d82eeaa23fc89c21856eddc680837062a62555d792869e17ad69d5fe724e0f78870d6cca11ec9f7390931dfc3c7e1eb3b5b56f81700a4b2f1343052e7d3a4fb4077a057dfffb3d0eb640e857a3b6a10061c39264cdaad54fe1a4215337516aaaea05d27ced7569ae4ba36090a223fc1867d28b749588c84e07254fdf59a58d5b86ae1f310172845a396db5c66e77b08b457cccdfd9b8356d5c03a7faf9f288f8787c948e9a723caef124df9178723a3f867adb44c740847ed1a9a88536c95ecf7cfb3f0d88339d231c34d9d040815fea6a39202d115d6ac6e3485e772b2af5dce985394107eae2f6913f7bdc6e7c2233a2f21af09220c04f2fcd9eb78c71af8cd9694217b7091c93f68df3ed6283e23fbfd5224787f3670de09c6c85989b402202d625d66d3805810d0664b8e3a51e0a7573d988fd51147a56aa4dc1080e11c7ba3f077e2454c1488f6f4ecb2bf7dd716b8349ab47eb3fda4519e20f114191d32e635fd0d17a67d9165279ca31d179595e6c1c67fc258c29dd166bb8a344eaeb173100fd6014d4eb3b49cc1f476ea95ea0b205b40a2f2b92c65fb9d90d", "006a52ac6365515252", 0, 580907261, 1537743641, "94230f15cf0ecb445c9cf68d0a765fbeb35370b8b1095255ae03f77f80e755fc"], + ["f79ecb7403132376d5d70aa8abc678307477ff301dea58110d326c33ce13c55157600643b20100000008536500acac0065ac0d8961694e83abbc03e2a99eb54ef505326fa46b7ffec68678f65fdd3615bdcd95fc747000000000055251636353e82e0d439ea6e6c37e3f6c2f6d915bc50e1fbb636cbc953d12fbf6d172a6a6e92dd0556a02000000086a5363530053655178419a8b031dec6f04000000000952ac525265636a6a651ede0e040000000005516a535263857af003000000000000000000010000000000000000c9086d0100000000409e3fd3b013b6fb50410665269e1ad8cb3421a87a0db67181c75e7b9603e8ae6c30f1a18320f95f59f799f0c3509da85a62401fba352041d7f29ef2d83198808485608de0d878b0adbe5954639cd873c9962d7ddd807a76f985090504ae9119000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008ef28ef0582f62153b64b62515027971722583d27efd5a0fca56c50cb242c99291712031af7466db618353420f8b5b7d46111a81953f4f8dbe328bca954f09414f322caf195cdd6a87704a8fb8c5c58397118b8c478318b2988b5fa2fd2141b480445ba782a13414f96bdbfa991db87b25a58075cd5735a4b38834a48cfafdb4021809c572e8fa75d3060508e402f6d285d851dc0aa2eebb196c682d1593a57d81031924a8e028521f681853fb73ee33debbabbb3e0c5a1c4e9babbc57dbd1f1cbd10b079c2351a0ca2e339e3ca7f5b6857595810d4d44a0e76a853638e4cc5bec46607644643c0ee3fab195db5699bd6797fe507a62ed290b898adca23c4a8e76c8f10322bcf5f6fb351c9100f2eaf403ff69e0e112e27f6a3630fb8bc96f72abd708ba0220e554d2354b98863e68a21234bbdff1046f11ae572fdce6688dbd3e0dc344e5030ee54ac45a079d22cbfe46bded8c53e2d2ef4d1d7b8407e2200833da18a5d9780309f327e48df85ffcc26858c0244e019cbe3d23ee00644cc661283af5d427c2240213483ea903946b66aed267c28663344f69b47055118c7c8602eb6a5bf7645ed6220bd3f3cee7906586ad445c5498d3bde9e50573f9d42a1ec0b25677e3b0e910b10eea1e64ce957d4f220969aa7325277da9dfdb0609a3b4b98c65e332c357f72e7ecc1b754a0e75fe877c06a23a6c845760fcaa82b8676cf309ce05bc6b3e96cbe3f99a86c1fe835e0b592319e829a6bf64f72cc331d5718306e4353523a82940356abf81d2fba427bf09edec9f44548b6abdb2749368b892c51300924258071366c7bfee1c99fd03fe8828f3877a3bca22ec7e6123c072d54557afde0375a429a049c5990e4f3311647975f1c74c255faa2ffa02f5c3d1560b7825d350934b6545e7aed971b9c7cf4c8ff22ab07d63a7ef41b012e848f2da55fd3e95a87d84b8618fe812fc657fd68eb68bcce6fd8fa677d4b36c5ffa113470f0bad78801a9d0f808dcea511d2f0210d4d6ad0efec3fdc8e711fa8ffb8f13ba7ce19f5cd52efcd5218f886c6f645afee5eba6f1b1155beb2b35afaccb1630af6e333038a36f41cdc0c52db43f8cd48266edad6af243be59848fc61c836bd460d1c713c9bb69269111eeccf79ece5a0a340507d4f6c015e29c834d46d9445d0b6f7f9b05ef451030f4f23f416c6466ddb2eba587cd3d7a6249852a0229dea83a8476e060cca5ed976fc45dadc77bbcff42c73eca40ba6a3c7e46e664dcd637e4118e6aa09f77acc646f98c708c102550e0764587fc21825b9913dbbc4d13b292a9ba698b1c46637831ab296e47bf97bff6e269be83735e112d021bd3120bd4310a29ad2ed0caf0e7630ce86650ec2e6a0edc557c76abe4a7b881ec886f09645cb2dbcd651c31ec3ea88a21b58a57d598c534b0550c9ba7895f4974835afeec3cefee0bc8b6966dc2fde08667f1b5b3b696cac8a318fa3143d5a918f0ef3f29398d87172dfab95192e70bb342b636b807f4887ec43e74b9db2d7efce6a596be409413750fe108368926960a21f475a213cfecc09287d6b866b11458c608b5d35855454aa5bdd61b114d2eaa17a086d0ac4f9683d2d39e0be79ad20d331948ebe6dfeffdd2124196b1af6cefcb097cc3d171c82a999d6849c06186aaafbe03084d9ac2597f92f86712667d7db84eb676b53565385c2a99f15967678fc213c0b3ad19a5bb2009fe3cbbcf7f8823f94dab3803132d2b8abb64c9bfb2a873130c594c6443dce9d06b5338c27f09c16e0d37729353d5adc1ac488960ece0d8d6a3285514e6f1fc137c5db8e204dd0aebd6c183bca475426fe167c4157e4ad02f3d74e96abc34372be965da57d58f91acd244357e005e7c9487b38edf901741c2a63325bd5a4fee26ce7c75831b3fbaae15af62563050123747f86a3903f002c628bfceab922714da4a6dca84df32bd96de54eb76c29aae585993af35278e2797f403a75e56483f19c8c8503103b182d8b19ed9947d71c4f94e281a90d2078417b280aee865764237c1264ea12e63ab317de52acdee13235691d803acd446ce3eb67db7fa1062e6a8225eeb2a242b505b34b42609291b378a9f1d569ae517913dac76eff075ac82cb8210a2795b414f5b8f516e04d4749ad158b6dae868c29734471265e092bb529f747cb9f14a7211588a08456d2e506d28e3eb3ceda5fff6c50406a76b6751db4472bb8ef51dcfb6a8dc851d46d139d293ba83207d022f1655d8bae5c79ea921717d56c3aab4f03534b335f5a0db02e2819c73b58965a126eefce9dd94f5e02674e8abd494365b7592fd2cae3fc47b187ee6d40a1946619a986e180ee622e3e238ceec07dc26a57f12e1e653ad0a75e9108db03abde2aa56cfb614d4cda73b1f4f73d82208fedfa855dd10f037b59d645b78bf0c", "6363", 1, -1165762510, 1537743641, "ef66437f30b4eaff53db531155babd7aee6c5f2fe8c48141a5f6f2f7f35d0d62"], + ["030000807082c40302b871b03dde4d889378a1614aacca208d92ecb19a2dc7e29c7ba316105cce21a3030000000963006a5351006a5263ffffffff8d7095fc1c21a17f2b46c2f1749909264afa5d71e92330f62d79ec014434186800000000085152006a516353acffffffff03f8de4102000000000252528fb8dd010000000005526a65ac6a96c14d05000000000353516a5d0bc9a00f05adf70200000000000000008bf63005000000008d6a57249ec322e5170847a8240392214e8ff0f3adeb8b8d1020c031cbed8103eeb52757f76b7ba26b5c7eca9fb2a149aaacb673169d024f3a60b1912aa5a2c1fb7ae1c2b32b76114a652df1d80062305f56eb6f3fee9c41438f7e182988d2860000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015cc218c5a2db4f440182ad4f2a47063caf58c18f315c860a8dafefdfab397e7c62011308bc402aa3a476b2762b0a5b9666b0b48b0078fbc8968526dd73ffe1f3aa92fb5cfe2b754a8f3b3bd886b8e8246e9a8fd29145d5f36ad82053c41b7736a879da833c59c843ac4b0f80b18a2dd5e5473ac4f025487e2c68979d214a37203152c5671617e779d4305a8f4aef983a8348523c65025e12c7c581b5663e6bf81030e36a55f47e9b1cb27c1990349701b92a9cb3cc5cd78a054c9cc9d3262eec2140a06c005e080d804ecf21099457090db3908077c5a028f0495b9a0716c758b569db5dbb6f603a00bc99daf0a942f3cbc05c0b2cedd9741e2469f913656606da9380315223801ce7860c5b450df89bb9150439083016f77b90243cad7c72c4e2ce6010321eabe578a7fb72886aef8350918ef85e9308f2a28006f8ed389a80e7c55d4fb030272c1ce359d73f5b44dc87f914856edf6b77d28fd8cc1e10c5399003cd63cb30316f0d17a6cdd519df47f831a38e02eec571475ae36a2ecc645046347780213bb021a8a4c1c4457b1d04f51a1b9f8ba5e926e11009af396699ed41123ae90fb528497427c791a14e109d7587df985e99fefeec6c7b874e366bc105a06a14debd24998526b5876f13dc78f6a8cd65f821c07b8a7f5734076df51aee58e8701772247b6e4e2835bafe100d374ef664f4af991ef55c7d7385e454d8a34b1d484433c51185c720b70064b61fcc92fdd76823381679d2012d4811738d27b22d85f747519afa246c6a21338a6314972c4af561995cae8858ea3b2dc456848cfd897262d83156e08f8cafbf3cb60cd1e2c0f7f7a03bc4fa8f6b446bd3182f63129815417f5eb5bd817bbf767ab542e69de931e1826f93bc75550049969ddf7da631802bebea82a72e355b6a010b9036a36401862b03764551a36a48a8794b271d33c1aa6580f862a74908ec51a13448de1bc812ee40946c8f85ce49b0387dc213a4ccae71cf1b50105f095bf0ce3bb3fed0373b8602cac6f23af892b71833b74bc907e40eb23e5190c886ce0b132e1c6b102bf36e910b8b83ed365030f3cd584e9d2ab65427cf3d2cdd9a0c5f7441001ad8c6f38c7f815d2460281950f28c5a751da9c20448a4345ff326d8e0535d5f963d1fdbb4d2d040e3c7bf1214ec9799668f787f6c5e5e675c2cca231ddde2332ab34b358bf00020b46f48e8cfd7a409522dea34cd85300f3dffab9d4940e615d8cdd55514a8e7557467a5f798856535bf487ca2893fa54afca01e0be369a5ab8109e5cc0efa190eb08254285fb30ff83b3bf3f0238fdbbc7cf0dce8577ccb79cb05e3b5e3d47ebba8547d9708373d3418b7ab1bbc52ecafca542deee1bcc9cf723b08771378bfce389edfe51d453197baa90193c12814da995434da7b6471ce87f224173a0df1ffef204e87d83345d9ffd9883a30a42163c542bd56cfb571200a622fdbaf104135983e8751c3b8b429a42f1a431901b817a2f9e58d28b541b241422a6aae18965103fbf7ecf0d38990d17c30fc25eb9eb7e604f49784d606786e0c4f5c3d2542e27ce829f60e948acf67d272ecf1c08535888d74218d882d6ccaf3b13026214bfc6f443a86647cd81a106f81a501168bdfaca52068bb1ef9127a362b3da8b38af5e9a246c536624306208dc86ab89049e9d5cbbce5720053c9a94d0b51a39e31bca1c84208a1829480bdb4bdf99796a781a9489d26ed142c560109139dbe9da8fd6dab03d06da9a4672ddb1aa79cf7cd1dad671145433c44101f9935d57a785a19ba0992ea1b21f99d0f399491ab56b22c980d653382d599d8e0fb916a83cb9db4dac50ce389e9a8b2a3c6aa88cc206920328ba3215950420f014262e5ede3d6c0f1a4d873c5fe7c08c75ed38ee118f3bfc68ce243c1156092c895791a43dcc22ec3fbc4061b18b2bbde87f7419e26873d9dab6b92e5f17607d5f20222cae55f3b8143fe96d194b66445ca5988763c5d0f79aef28e164ea3f2d1c8df49662681276a3e5ed24a9aec9d9b64a5689770d5afdf216e6eff280fe0c80e1d28d7152704e4df9c06040645bdcde54847533e7acfb738ce2e7f1341f06acd451cf7b2e6b910c2382c6501d8ee46fe57e359d76ef5a2a94d4268a73563acd2feaaab22e6677434de8bc77fd49408ea4cfce47d45569a7a79a00e62adddd2d37285026f0dfd41fc81cfe6fac9326a531f5baf6deb4b05181d75fd1629f53d8358925a23c0d94b50d2e2b67af0b6e843172f1d602115b7f5d7f1101e9339a20e6a11e640a160000000000000000199bb3050000000098d17014e561ba1694d1988c5dfa619bed5b4e2a88b4cb4dbc289f37b979139070afb5190b12450079abbf0a33b8df46504bd4f2747920f00c56d27a74d0442c790e189e5af6945299c939e478c28772108f3939b88676241a3fc8a08e40895a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009254858330484f6f45083f241b8e616c3f60cd8c323869f7767812d555096437fe2dc6aad326d0dc2e0c0dcfd1ee449222c4fb4a794904260a64a6fc8e2d900f1373a4ced9bfdd7699bd30c627f827aca7d962b14aef4a23b5512f3af247679083c9bfe3031a00c4d2af2cccf4cf2d7b9ff1409bdc3f5123338fa96347a885e6030623168067eb38976a0ed843594ed36b24bfb7b8e91fe989965b9c21a629b2e6032627699a3fe85873316476389f18c683edd1172d45b0ac95f4af502455bcb5270a0411590e877e77346fcf0fa7feb4dce4c057ab97e0cca619dbbf1b10715052c7cebdf3499de109013ca5b3af620a2b90b4e1aa9ccb41a3d87e23794ba12ad618021329ad7d3f84a98f5eca79053373aec327b2e394722da1ca2c261872dfade1a70213f8c0f4c916b49783e5c772ae7370e23614dd48e3187a9c68a9919ed053f2b9032a8b5d5550a0242a64afaec594355e504b5529c1761fb4ad45dfedadd055cafc0204775eacb4959454327b4549a337a286aa8dc59ccf7c89f16940c6a1cca7be9a0217ac999e7586dd4145d4dad98724a53b71bb5978f51789f629dabfbe8eb17a7a9865ee90a2162062472ddb7f7c38559be4f39ec38c04c712ae4209f58e6b4c1791f9d6145cf269225f60d24725dbf7e15e5993c46a845feb5f29f87d52d09b352d6574c4df90beebf6470e777849bd1bee190c5b3a5591a2d53cd836558a0ff05a585cec7f3ef7cb025e09c7c0dfa5b0217a5c0cda7e31230cf780c3678d3dcbfd29ec3b941741f251a402a078db6c144f6beb75a5272fa67cf3cf83dfce7ea1f69aef046c55f96471f949e6b7186bf45e479d3cd6a135f9a8ad85415acdbe107fe36c52c3a69d5b5bdc1eb2120aaed9e2b778fcdc0622d7c312b85b22a1cd20ed5047b4ddb389669e6f4c888baa0cdc51fd09cd5a6d764ad9de33aaf735b9b04858b0427c91a2291a5d69fd19f27bda3ba60e22e3f30afb68b578f0274c172ef200b998888f9ea2f951ae08d7b147113940ca676c903f29292efe7105c3404c12313b0b8a1e4973e71cff46ab2275f14b277e7c840437f29e0f93c31a8ffb158d23347086aa53e2b39a8d4a4fdd997f7f3e9790d37caeab13abe783eb8677fe42b634c4ce7ac9ee293a35cc83bb838de3f8998a6921348268727bb215b5f4955ffd2a15f7a52d4ebffdeeeca17b62991b7231a9edabe8bdeb5b0d2dec1717066717b3e0ad9a4e52b2c88e5812659150c70a1dd2e9fd325538d1826f99d0ddeeb1269ee848c5bf224f322aab0de200998cf1ab307913a8366e2f89b4dce33cc4762c0dee08146c2e0f5965deb6d33a845188888e20c6e04d215be6825eeefd1f02fc8c5bce8b63592490c2e6100d3948fa220bd8be7ea1cc8a8502d1508a4fcfaac68328a81c8fdfa2e7d42d8be579aab55e7cc5c58dd23b37ce14eb4ef6526ea194defc967f670db60117a783e7f139162602fc43b2d89f18528842d6f18a98af893d6692c7cd2538b562ae94b77444ad344fe74a7fc8dca0f3e487c617b11a8b677f2d68cf6f3e55110b77d95a18e3e34192eeadba38639289d4ee29a8b047582d59ecb8780de0484d11339c002607f1b39b538bf5b37e5d06beefe0b0a3eecce9c3cd5aef5819cd85ba7b22f596dac7514dbdb744277f443ef3b0623a62f1e3f13fa6752a0de1600441ee234a250d16ad9db33ae1863e1c55c7076fde7a5cf73f23f909145d9618fba8c9a4bb8dbdced427fe9927d4898cadd46feb15c12c23578926aba368736155313ed26554c54a7631a6a0b7cfb25c9387db4ada090b44a740cfbbfb59671ba0e480de51ca727a20202718e3fe00bdfca9dc10cf207ccb2dc4339f6724fd036905150053b5f9e2c6fbf5ab35cef0ae0f9fc491eec2d130f3a5ec01ae4fff71bffae0ba9eea5a899d6b0682223720c5827c88920b1bb70d40ecdc29b0c6f84d54fac30c2603a0a07f4cee100f5799a4fd6810133b91512c3f240116f7196d8087a3eabb036ae0a78fcbe8d580cbcb8384863e8b0681b1fd6f987dacb1e25fa1dd9964f4bcf7a09dd9003b8b50df46e8db025f896eb7fc2cd8e0136d897d4025e4b0d5d03e2adef94bd76bb09a5f6b47ff4b310cab73ceef8a115fb046011c2c5172748a04d585ab6fd2c29a700bbbeee88f0337e318fe0e9e9e510bc2cc96515f33bb1895a566faa2a92b5c39bb15b4b2205f8ae12f248eb64691146ac19a7e0b49300b175c7d89d900de62a368aba7449aae9ad95ed0092f47ed5fe160f0eaba1998fc778842a75fd4bdb4c3761326f38d2d0f89c82ead2b768eb61f05c874c36f808b2d77e74e575883be91ca05cfb6ce92ff3ca9a05cd80f81bcfc0dfcb41aa5e38f0762d4203cb68e9c417c6e56b8a1ae63ac2e62adc5c595d06c1f66e5611759232b358b5601", "63", 0, -243327454, 1537743641, "54073895d4b34713104970080fb259bb291e531b56e810ae9d4ff15e50b6cb2f"], + ["030000807082c40302df7ca526bbcdacf36bc4d8bf77f235fa11eb6d9e96322d3d78f26aea9c17188700000000005145f80f873f3f5cb4e2fd854090c86ff55f7c8e171ccde0fae4be61ed19d4fdf210254700000000004067d1e50460ee260400000000026a51f050690500000000036565652b31c402000000000700ac636a00ac6a9176bd0000000000096351515100ac005353e30e1c2b0000000000", "52", 0, 1575417702, 1537743641, "f5bbf119ee1b62e12f8713d1edd786507e1c4ce0f5dcb19625ed4fd79bc71b75"], + ["ce57a95a0391c9df0c6657060e73d5bad973cea76ac07cf9d4207b1289b2f6504c636e696c01000000035265520c59a2990752383f04d3e407ea8d0468b5cfd584be20d2c5c9d30bafedccb56d70796f7d010000000653acacac5251ffffffff112b25f372441f96001724ee70351fe304c719c1897ed12f76587557bd6fc49e020000000365526afc356649013bc62a0500000000016a9d5d646d0100fde5040000000000000000000000006686d74c6246b50d7ff3d06d1f3f7e38ea63d39617aa60503414bc924acafe55f14e2d0c78cb13bcffab75de9ea9cff4e2010fc195c3d055a1bcc2d8072c5a08c371525d715f5d9a3081eb355a4baee7646d219032637ae0358edec2de5b173200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d37f0f9b76930d59fb637886048b06a6ef0c12fbb480e1c5a7315fc9b034b4b7a46a812bd779de2434f31a3e2ac875da36c0e8d447d356d966b9d79946736e7267f42ca3a7fa4541575ade9b81889ca18fcc7ddb5c2591fe24bae146abb793892747847bcb370fe8eeb3cd9e7316b4763cad68a2844122564065be728ff5db9b03118bc12c353af96b23581cb1b12674129eae3b1dcc7ea2dcc880e09f08c6a77d0227f5cf4deb88492a3aa57034c52224cf9f54d579e3f114a58ef9e20329d619030b076a0e819137939b026911a9969fcbf1a84ce09c7f137768a0bd878732984a25f226c6bce4e9d3149a9c3189a45cbec98576dceb284b2e1ac54a437f5845db08031e5ab20a487b970b770fc4fc39eb908dffa1351640f075900812328df308f56b021cf34088c3c675eeeed4727ad34c4e1d4e693af1437eaa8e75174cc0d8800f8203011aa504994bcf5dc036152321514f542051d09b1422b1aec323e6c52aba01b3022d1663a0c5c28358205099f7b4835602267d7bfb89eeca74c39067c7d8696a6a0222a20d24e80bee1ba4871cdd3e1dd1f9e1e7e88d5c4f13e5f003401a901f97ceb26f6a643d63921d62bb0e4778ee62261edcc7c9c0bf491f62bc9d906dad13df319a044ac7bab8084fd23c99e3611cdbd4fd7ed6a97d844db2ddcdf09aff82075af3bfe6f12e06696d5ae6e4c026e0b4cce68d0f6a1b36e7e11d2f253681eeea8a405854e89a42d50010f732b98862bad341ab6271975f1d667950f6c00b0fde8dac0cc08f16da39c3b84529ae8bbf8eeddaf42aecbf0bea6a951e2ee495d2fcefa22b1cf8f53ceb616d3cd0a5bcdd069f8fe45abe295c9e9d1861addd4e9362c876d1f0f3edef9bf3df40bc5c2f4a5bdf4205db8bcb6cd78383ecec4aa48623de4ba996abc4dbef19d69c7853dcd3667bda45816dbd94858626107b8dcd86265fa35e35e00c9348bf3f660f47b09ddd2991e2dfe2ba4e2673bb5fff5fc3224c1a5e68bf44deb5de80ed0de9c0c265d9fd552e6fb98aca15583c91d07ad7ba4e813b67bb6671da18d9143231058405470e894fec35d7c54bdfd7f6ece510c787ce06bce2a2f375de2c3dc77a3015005047016c46d93c8531bb1652bbf195d488e091db6f9957fc2ed640b42db0a08be2dcba07bacbcfae12593412d08b0a0bbab1f62d7886d80e39780367c762fba27df37d9252679593ff5c0ca7ccf65a880d0d640fbc7b9f4aa7b459a7dc47cdc6f998f58b664c21835da54879500b83fdb1812d02522043a355b94610695c8f6601b56b104e2fc9f4c06f6e29157136e9dbdb7983dd06330fb7a00607e15691e4979b0eaa04fd6b928a7c25975ff8ac643e02cffb93bf001b9b547135e6ea11548c92cc6adbc8dcf367b52b9a99faa1faab3d358db80c50af521d52ef4c3b9af42cf1734f1345e7326601cfd6e4830c5578558e2ac580c6fc22b098c7cc94cd4012b06853cc38b30be872f8a57935959dc006516731043867940ffb8f40a0baabd3e6931cc1b8156b4386b1d073a55242bbb421dd1e30277c8d0d585bcb22208fa07ccf9894a012888e7c12cc0bf80d977f49cd5b9567238e54fdd15a1499da4a2916d7df73c93b98d881c21791867c13e9e4eace818f9b0d6fcc959fb2da3e18d623bbf52aaba71c15d9ea9f13df667f4056bd8227da7d5d353e6afcaf58a5547dda0b4759971dd0879c07e570fa2d9710cb6faa9cece7979afb767db43d7b1e873b2c1b6ea5d3031b51b302140990d19f0a31eb8caa28f51a29b33dc0c0321447c69f37d5396b5f40bcb8a0ed598eaffc26b6419aee39fc13cecb6e9f4b08011a21c503b020bf439f469a315fb79326f71b460ec2c0cf633c3ac444d590018fbbb98fb66fc48e320e4092a09a51a42da4927da7a91e036d2cb1865391917d0e43fb19fa9b2530fa5dc4ea831e0411e0ed6c9c1712ba88fcb32524791fbc81a0c92e1d9bb05c432c607e5f2686764f539e0bb9dd55721c9e8c65553536fab9120df9dcd28a452cc713ff9b5f3319e84dab5bceb1f8e7e5c4ccccfb018de0645215ac15aab0cf0ae5efbc7340978c8d84f5753d29a7da28f66601bf775ca3fe81524d54dd70e433a99abcb713102c4419655baf1da2b157ec1d6a506d1b6b70e62f7606114fc115c44269f4be390a37f40578cf2bc1693038a7ec82e3db942ee67d93be8efdd17f16ace7ba2f61b2172ee19fa5a1d8c5bc96a8b5085c1b465cb52bbf893295b0a1779c0f9a72cca1daba61e70e8b7023e3263f79c232524e57da77f254995c83f6e4d3383bcf539a42a47d6e410041cc377eedbff85a24bc12ad6a5c8f264368aa4d5848aa314ab716e2ea450e9378d628570d6000165f253e7b2ad97e82336df06969453cb69a8ae1a4853ccc73f8af5921051b03f7fbceae17befb03", "6aac006565", 2, 1508316050, 1537743641, "ee694798863654a15dfe1e91b38ee7a15e4815725a3ba83a8aa6dfe8c78b9d11"], + ["030000807082c4030109a8e5aa8a755abeea81f38273d72c383055c202ddbdaae373eb4fdc304fcc7b0300000008ac52516300636551ffffffff015f6f2e040000000000fb4bef1e4938106700", "53ac51536565535352", 0, 2145876141, 0, "10b287949f2f42275bb8bfa6c08da04cd06fd29edffcd5f52e0945dc6119a7a1"], + ["c53f5241049d207bc2188fed33f4652344052ae04183735bfe9894b1ccd1179c6a7f0da7a600000000025100ffffffff8e0df3986056f1aab7091aaca7e235ca11415a3343872af15d17dd553c4fb8a302000000095151000051536aac00ffffffff320b6f784ca74a4272ffae7fd4bd2140a42726284d869facd6027bf36985b0ae0100000007ac53ac65635300a3a2aba7bc4151410d90dac57aad0350fede1923b2cf457551ac29c61f04184d0b155dc10000000008536a535252000065ffffffff0200572f05000000000452530051509d62030000000000d200e3dc00", "ac51", 3, 2129491232, 1537743641, "25059bc63d1540213c9387dfa4a6eebf5cd64cdc270494347efb4c99f93162a6"], + ["030000807082c40303ab8c4d535eb21ab7810de9847c7fe97f95ee72969fb35948cf76f8404b07535800000000026a65e6ee9917f9276cd6f1e2b886061dcfb3afb2d91506ea32f5aa9eecfacdf7248f724136f3030000000265ac26a996557d175a2e146fa4ca296fe48b54e90d0a8546e0b165cfd3f308d91d0780649d6f0100000006516565520065ffffffff0145cd000400000000046365006a000000000000000002d0555d030000000000000000000000003a0b8126fe42f7690fbb39a63f528340fe473c9fc129b85478812e72ec9b48fb45a027f134c6c6a2e2ff5c8cda88621a5ecbc1c9938006037e1fbc5b926abc6781af7ef37c0372da2280ec1f1d3f0ba1d01c84d7581ddabef4ffe4a248562b71000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c35945384ec2134f1603488722eab532c0a9da97a4409f5ec3c43fbd3f61be2e9f0d2f0b7a0a88e85c40b4f5a015a5da6503b44a7d21d3b235e851eb503c03daa226f3ae3efb49dee7f81fce1439d2e1532b02a6e501193f73578c134aea9a67e407a649b434fca2d7c453e82d70bc3f4c49289cbefbef0909110a39b74be220203285869ec3a1e19bb5a041cd6ae62815b6f68db0af80ded905054cfde276544021d2f7a3074df50b2d94eafe4e72de801f604bed672eeb2e5c6d4c25b56a5dab70b076213c07530fedcc8847c3331479473b03a2d98752289c4b2adcbc681765b7bdab8889a2580abf489d03dabc4c647c4fb7abe007f46502348ad43fbab1d06d0030ee49cf42fdff8c930ebefbef4f7dbc51d880fc9ff3e60cbf24751fe2d07aef603176e2cd71b1e8e59fe551f8daec64adaa3e12dba7ac8517739e482be3160d9bf030b77852acdf7bf24b13e6cc7a430cde236125d001bc28f884082dc9f1874d43b021b0b1869089557578fd8600f8be39d0c1621bb076e5eab7d37c464fdf6345bd70215867d053863be47d010cafb13d177291286308cf84437568d62427c67a1a81958b5ebee51f25fcbd8606f1c3c4f22ca041e931f920a2704f32ecd75cb1414d6efd8211ff899159736b437a021003fcb69136073fc2d9a54753d1c41b830a20759e3953e29631d9cdd194f29fab3a841dd7e3ff5acbb4cba644c118cacc8e8c277164d9a1cef37abdab007bedbfebe744728e0cd738431889c44000e93567673c686ff9855c0864063dfbce9dec34ac7cfc8a8ec3c556b4e75a53d0f7d873010b44b680330a8eed7dae98487ca9451cd879dc59239dee513df0e0ba8edc5250626a1b34fe933537b602ed8fb0b9c61b999635931fc1120a874e8f035ab2ad8ef83e3e1dd35288badc117c8a578b9a1094bce6583d25f59fb32f37b09e8b890ce4585dd0f091762ff8395a826bd0984b4deba26212abde9f9030bdb6d48c660414279991e085374cdf6afe06b60df21d2a22b747ed6ed330c9b082c496bb51af9539389b810156e5429d51d42108703df862abf86e9e396186667f282b33a8c0cd9d9395e4598a0bab539a3f7cb83a979db618e24e4cc1a2f71a1ee97fd2642c6ff85b17b307380c93cdf7acda30a77ded6782fc7aa819960d9fb6abe138f400949a36ac273f1d5f4f1ab598faa1d9ff12e5a882bbb339828fcbc27bbaaf0d5893b02117c23361c42556c6b55faaafac2b73b8e2a7a74eed02204f03bde1feb94941254ccc5368744078a0545d94cf6d907df5614ba68c30aa2299ffc9d00a5ba8eaf4653c98af677dbba71567fc0d812e8115283b10a487e0c22441b17c7b68cbc7c2ad5d0b34b6c15417f49977ba2be9c91febed47199d6269d630e93d2aa9adfb59e6524aaf8acbaf7c4ad29b2dcd3caafab56b517b012a7e21adca298c8fd830e75eca3415673d5b76bcd7436d1614e0b495a3423ba90a82136ce4534e0b015ac4973663eb6a73b5ba387903bcb3cc8f76a218181ee936b512d648aabb2a0d23af2f45c6a2e4e4643ebfa07ca6aa17415360d85440476f64dc33ce07fc1c1ca5ef1d3e7ea4bc48414204337642a0ebecbe90d7cce2adea52a8fde387df0937b8fb58048855fb9228e4e7ec88e4d4e8a9618cb6f1ce4691a4b108aee2b3b6a2b97cc308fa3d49750777a094acc7604ffb87fbf5c90c8370d5a01cfb221693a565ed6f9f585125a8a024ca2323f7eeb4729f0975dccf8d3af5bdc622bbad9f59ca6bad82b4be6e5c79b90f49895618f0eeebabdcc6c743da7c976b7c31535c5b4b3dd9ebbf8dfe54af95efc3d1561899cba43a2ae3049ade19954e33847f13d0d2c9a891dbfaf82ecda64e152cb6778221f0da1d846c39075d8ec2e2d64d517c5456656362e9267e7e58f8b9ee4eefcd9003e3ed6e5f39ea4c60b6afc1c835f474bda407696759bc91a4f0c0019e28f4dddf7d14a2f83848afbf2f342b3cdd5874a534dc2b87f9fcc09a3081bb0a071493225e8f492a5c1da8499ae6e401888451ddc8353f89050aa12b367986ed49f34e73872e566d23cfd1a5c2cd4b26bf24578c404e723894bc4ad85056a66dd006725929a596e39315cbac19da3fc73a8be29d4800845ddcf37df9684fc50091c0c079c6dfc3ddbc5359af9727ee59cf7fa6e3d19c2e7d35243da009f4369d65032bf08542c530463e1e6f7acacdee4a84ee86e508c4591962122cafaff8ab0dea0bb20d6758153905dccbe7a62270654a24f6c4fe09868388a64bd0f0a4d8df42a22232ba402000000000000000000000000da719927db953dff47392464724e31c7ce34ed57d069b0ad228767720dee4294133b92ac12f90cd8ce35638afe2e7d2b8d98c0a62b85524752f0b3502ab5a817d69db11f18aa6937ed37a53755e8ec243877b5e3e1f37431acf16a3c37af0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006d6d7fb93027476c2ed5b1cc2282d3ff494b5bd4b3822d5b1c1ec57f75836d0d0c88365fff388b523eb9e4875d15b77b3e5a16c47c3c7b7a59c6f354aab5c669f35aadfbc39fac9722fd2c02a1304f359b2cf0e1740ce184db42f40b13fb15ad70e1594c64804472b800b29e1b20a26d4f218706ee83b110ff87e1bdef3f4064021c3392129bf70de3a696c845f36ea39e45503b97de937acc32a085039cdbb0bb030846ec59b933ce92af2548773170dbbe68b4b5f76b771d3b113507886a6fb9ef0a0234e49acd9fac3255866d3cd4a2384439c817a4f9483e4ceb9ee435e47a52ac35de575e2d25cfedb5cd0107aa4c0a52b66d339b6b84730a3f3ceb9eea969a4f03023ba6d4ee56471802d4d13fd5e62886b6287635f0e8f9e0891026ed78adce9b02183b6b60fa7dcc69462c36f3b3fbdedf897fa99c9f53cb5564c81a6336176f660324a90dc8e8bd56ab51f86fc58a12d6e2ba74fbd530e7903795416edaa758e8c50310c8cbcd51f9bb781c2409e405f899a6628148feafa4a0aec88341a275ddd6e6031cbc4613450894e240c87de4ff102ee77127545980365eec75cfa65c0223a0fd84e27611ba23d2f17c6ed4cf73f8c8b45e5fc37ab565be9e354ad394fbc2d72c45cf659ad3ab06b6482820cb6935bbbb80ee4108b050405c666b0dcb8df569889d23067d441c9786c71aefbe485c89c0ac1e75228b09e1ab0722acaa751d1b6fee9422e82322c81fbfe443911f42511f6dfca0ae86c5fd6bc3b8a9dc055ef0c370c238712ee6aac6f33598074612eddc80f8c46334a54945e147a2a23eee448da3f5326c2e62a7dd6e3792120621e4e8c47213e83df1230f7030da0f74291d384ecb390eaa0eb9c06fc64e91de971f0736d91ce8e7835d19f6840a4a222288e162bd411523f90b2e3884e2211ac9794baf3ba91b032ab0070d1ae2291705bda9f5faf87d47a64289bd6af908c4fe9dfb74bcdd21eb5d3963882db285178a28bb4c1112a63dbeedbf862bca871831812e727f0e0fe588e7a3ff605061c3033ac73fa9a20bc1e9669faf1678a43cd5dc2e18da0d3c2482b62501c394baa89bbd2027ab25a56c855f4791d56c541221ae7a8ff7eddcdf239caeb004190cedff8d62407e1f46a5567dd029b4943320961647c8b0e11ba9cc7b7e02c912ad6e25161d516067bfba196baa50248ef85738b4a5ac5bfa027fde72cfbad965de69851efec5d4c9b4cb0b0e0dc516568c1a81ac45b242ed447da3b93d7a856615a05644d11f128d7bdde63d1f1ff129496539d2fdb2fd221202502c65c160b125c069d06731b00a4283f11cdb0a47adecd6bcffd8172d7cc6d5cbce3eee087810ecb7b0bc214c87b33ffb79a657da042350a2013531ac883c0af5c3b2a930089168eda3190ba6d75456d8a0edbf4ef5ef1b3c33e422b7b7807db61f5fcf3d51d26fc735e6a1ad8a20998a87b459375f7a1ee9a5c1667be66bbbae80a58a51422c2d6a66487e65c51e8740e23b4eae042bb84677a615051ee98699e13f0a0a9abca64d58409d460ee1b15236ce3b956dc0f730ade30815e90765ff4bc42aff7c02529435e7b335fbdb330418a2d0f031f0b3554b921d6cb552c5281d1ca3a881b7e3ec68a56b142914c4d643419b105836513744d7f78bf809e96586f2eefaa0c3a923229d8e3c3904389ff61d320e3ced1f146e4b687fa29a320595816c74bd5981bb1b2797720420596cf9abd67d907361ef6a6d67f3e0212a149755a7e8dcd964f960fcf4c2b43d26d232ea3ec2e1478d19715d0e2793170aa9cd7a7cb39a76dd8ed340cbd3da7922ab6054795aad3d5513e18691a591c35284213d29bc7bac78e71d7b5d4b1effc096f4115d325e46900ef80c3a30f30d71100a2f5c3e2d3eed71667eb50fc2e3286880f2429012039b4f3f8acfb2d9f7e038a333569bc4af34b838a28972e6e0711800d68071eeec86cfc216f2fc794fe93b3ba4a6db8a7c5c57461ca7f69d3289c35ee3beaff5f8a59c2b2c383682bc33063f21a6de970fff9ce56299a207e623221f6cba341f17427105cd3c5746ad2cad29ea96b62a4c90edd0b8dd91ace4be17f4ed00fa024183e42aa3e2c083538ab77abaed1abe266777dfd352517c64958dff2194cc201ebc5542caa3a24b23b91b0334708866f5c110ff8905aa2e5aa55d2247146ab3c14951e25005a314de8f1a928aa92a97ad64c1c65d4038c88c69a04b70ea55a1817dbef7fc2be0c26ad5d023a90e36d34acd4ea1d1990b9689ebee672f973417c709291d95e901a57a664ed5753620f89d0d5a00632325163a51c0ec70ef504750a33066cc5803464221df3e8f62a5e519faeb34882ffd16d192433133d787a970adad5a3c9e39a98a3d2a66fd1009f28ffc4db49ddc524be875225ae84649218c2ccb97697401", "6300526a6a63ac52ac", 0, -358475696, 1537743641, "af4e3bcd8eccbd4a101021782f9e1f1613a39f005294ebfccdd279dab7df2930"], + ["030000807082c40302c69fb5cf9bdfe5b50afb453b3e765fc194232ebf31ced7c0515960802b76e56301000000095165526aac0065006a23e7cba906cdd9346d9ace4cd264e4550b4865a2d2a69a0b40518666b9b34a6ef27da04603000000076a006a6a535252ffffffff02d775be0500000000036353514068c70000000000065251516aac51000000007092ab2300", "", 1, 1739178220, 0, "99102056daf1a690451520a238d7cc9ad24431c6dc7eaa5739e53cf951b6625a"], + ["030000807082c403049718a1173d63149aa99c0feac271784fb4aaecbf3535be5ad06683271570eea3020000000151ffffffff0e2cf5ad5168cccb4964d1ff9fa59bf90a4e645a669357d90ae3124d3e7e4fd00200000008acac5365650051ac7f31b137122c8739d01ad8a34200cf7258a8f48d91c9d105393d8b71f3b13328a99b9c410200000004635252ac01ae21cd30d8094d8527cefa6193944dcc9e10c35d01cbadd4de8026ecc82306070c6d23010000000563656a656a1385f6d903a8af460200000000056500006353d60efc03000000000151db4ca10500000000056352000063000000008fdd4ad200", "6300ac51", 0, -83611747, 0, "46f80b51efc033f88a236307b497a4ea28ffa20ece936e0d3c223120e91e556d"], + ["f8de3657026e42afad213d84fa90a041bf6c9194afa72100e5b80b71d0c4e3bf17ce8841f103000000090063ac0052516a51ac68d2557d57230a46336781b13de1f425dc609ac17667dc34b245958a8c0e33b1056e38710200000003655200ffffffff0499f1b50500000000002d8b2903000000000084442305000000000165749aaa050000000002526300000000030b37fd02000000000000000000000000d91d56afcf6d9270295a25421eda2126af36bd6c19ce6a7b245a517e63a5d9b02a5b21b41c9d0595fb35eaf7e3df3d3424d396fa9b1d85506f5a218ed0c8129716748c6cc33313dcb1aac89332d738dc70044b620279f15704431988c86c765b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fcbf1d91f34bbd9019c2023095ad191ec63e2ebc81d835ee410961a2eaf03035dde33e173078c287d1e8a04831c7da3b1bcd3be7ca860571088223af156ffdc8cf60e70c441b38edc59b852131ff5a95105fafe85ec084796f530d2dbcb92b3cdaf6adc85579999105c4e94b34326b819541bd7d4af021a0ec0611af63d3f55031c8819971be6de083b6ade4575ef5a9884734c080d0d7c8388ee02c946172cbe030855f5ddda17d5b00da6a10bb6e9269817da7eac91087faae964db69d3fc34480b044baa84d80f842afca858a79131242e09b6f4868935e58f7135ebaa42562981e9562104d292e4ee6d10a383bf96bfccd62a32c24afc33be2af9aa48a08d4292031cd70f85c8f73effb9527a5549e4adf200ee5c7aebbb2d5f34f09ece75219bbf02163d13003a96ff52c53222b5fd64fc7e52c2108bc995a23f539ca857626f25c5030deafbc2b2ec0b456d12b1b2a61c6fde90758ca7e25735335d50980f827c9fcc0327f1304bdc5bf458473e3bc0b983c98b762668a36edffd7fe12623e4cf597785030b20429295522587a518c69a3886788d0dc80005cf099f8ff774d7c3b9ad5dece12011794cae31c1496bac9926e95b7e90a4ec7b88ae75970465e427881baa8286e24122f0a440afbe51b72fffc342a05b461062f980b7853040e7846a47e8f3eb8bd753a1319779964c338239c2a26fceb38938ed3266013363c5dfb737110e02fbae76da4574b313d91a8663a00db5988446305fdca3cb634e49b02d45252be73e3ce04746576dc97ba846a99110ad2628ff0cf16dd174d8caae7163baee9e8df2d4ab86a94127d4a6c944f8f1dba2856d844e6e0b1172fe54f448cdadbe4c6bf5249885add180f77f4098ebe154c77faf3f776ff031e7af463376dccd3d2ed2deeb68fae79ee3bceaf4cf9bccc0834b460d8bc7b147a3ea97852d17680c1b34710246078682ba4ba9e7b9bfb7c7ea21d5341eb3f9cafbfa8c14d11dbb9df932735875d415f954c4cff523191e4d961280c1e8304c06e45164d38d460b70c1c7aed1ba72b4a33a37c6e5e2742901add3bf6678376af3ba692bf8fb90441fc3ecb76a5e1d380bec99e419cfaafc035efe704d97d5147677cbab82f9cb5f989c244bff9445b0879bbcb4a03539a3d76095c924cbade2d9e0553ba696d3d3921d81e658914eb89abddfa39263a23e4dad42290ead4d75090943eb3aca8c1c5e0c08ebccd44dda2143cd39bb92192d2f1e70f6f945ddc3301d3f09251c283af7b09a165830011226bd4f326ad03648353cde0a9f5228baa29c2b0df0bd7413bc07e2bbd739eab54a45ad81901a9f231deee4332f6f0d4d46e5433f8e709ec6fe7b4130a051c804e1a6ad7e3b534dda024c7fd9dd758362025050575efa64f6c925c33979a04f9b2a8acab7351984de4a1df837df738026f2237da5ec59cf74b490bd3c5ef10507e5484a0b2fcc97dd58a1f9af32d9b0c4d6682cf3cd332326d1f8e2b4dd7fae145f2659cdc7bc8c5e19aaaf718a34e15830c7fd3a268a1445a90be34f9b3d686836a8f9067fb832ec54875908ee6657725a024f2add9e9abb2b62b75d42bcc38678ef064547a5029ae28207b043673185f4d62a8e5e9c23d471ef3d6f950cf7332f8aba15a0b02da2cc28d3350c07c3fced466de5b86be612c2662b0e1305a2dd3bd5ad933bebc4d248cb9c2af3c20fbb1b729b28e8742ac627e764edc22bd29b26ec594b88c5b66e2f46cc3857abbd7c1b66d3183890df1f5e0598f99cb9098781b52e53141338df619a305f039b9fd7eb361e01246ae38f39247ed6d49db677b9365b2d2473d0c232d1192f22d645423bd24acce12b266782f05010eb5f7a096da96f72542228a2126655d4f0e7b856089ad934286dd27d4b316cabc38685170c64cffbb5c643fbd5f4ca48d4e27534deeef326cc26f56a13bc04327139dc84f3ceeb1b0a1f503edaa5aaa08e3e3f5f75e10070d1b979d8f3f6f5882dca0161ca5e83c5eea93e1b9cf8b59bca8502fab4f92b36cf9847fe43a672a137ad228ade40127f0cfb1eea60bb6846bb2232a8d757c605939711b04107f631c940eeba68fc36e3c682284e26cb35fa5dfb5aae1c07cb8663cc176b994c755272dd42b1a533438d9287422cbf0d3258902e3286553bb0c38c6b1e0c3c8c9719730cc545d10f430864b85d8f007c138b5c873c84023ac52542696f7472e7a7a35a353710b70a1ceb9434accbff98b393b38cf835b0f779f924acfdded8129de7fe8e26c49503629f0f759ef449bef3fbd66aab01000000000000000000000000e203b135204122f249806eadb8229864b926b7e3e8babda2eeb5327d8f00e3122822c90cf262a2b76e83c312fd2953d85e19ae282fcdb6f89098b63205410ab097e94873624fc2db7a4d161afd4e86f25a896584cf2fd15021ec9c6a260e363f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002163b670a099e1b2138bfa34d5248e4c859169fb9a43f54cfe8320b258d79a20c9b6c10bae386823feacea371dbe00df5a8cad332e3d36ade9aeb2bbb217acc6255fc2921315544b5f2c3c2e8663d22beeb0d4bb430c1110be9f3f002e71220ce62a1b6df7cf4f999449d64aa95ddd92a1bbca39d306616f44bdd394e29eb9c40210046610b0c48a29e5baa3330fb0b9da9f8848f87e3e90ad48bc78b4b83a2d530318d5170ac5e9ba4c430debc6155a78ab00805fd53faef7816b2999034aaba66d0a00fa099019f2dfc10329e3a82b76b5ec745b07ef9a145b54425f99e94c7a042c079eadd47fce96c707678c065b53599ac58eaf16710eee51d17eee2a6c7a4726031026d14029baeff01f20458dee16a86c04da823d81eca3fb39a1fbab49af78ac0315687ceb31913975290a696a834bd13810365cf6281ccbcd3e310665369ee6d70212e3565c6188e5d5be641462364f3293c95b6f6b78ea189342e6e03f8e74cb1103103372340eef50623d525661b5ea723532fbecf027b8dba0f4660df61f167d910317785a27bd5e6db8cb0dcb04429859f68757d97cbc5d7ccccfed80b2e9f0619fcf69938d339c7f3e1ed53d889efb5e79d3c4a7e0a9167a187097485969e12d8b328424e71f4aca62ea2bc04b53a71a60ea59ae2538de4b22ef7c1107f01d40c08fbaac75b1cc023f3f8538a72624aaca7f44b5ec9c7186497d2c3b818695265f3ec5db59dfd9bffed2964e5d805f92ebdd42c2d8f552a42eefa63848a6167c24be738679c5c1f2055a6e4acc5dd51d8b85d19d14a6102a80f4f54305ae9976bd2a46dfe9490257e726d20b9970e260739f018b330c05fc39c4c4c85e0ec306ed914d1e324f16386407b340fb6e25a76f037c49b7bcf4745855545cfd02e0f2ddd56427e8890308050040ac505017a534aba0af6711b2d25e0781f260a9d6ea1bb50f7da0eccda959a609ffb40002047ba8e584fa4e47857928825ab9bac89c1216b6beefa527243cd3b735b69cc2481fceed9cb43e772656cd5459c37dd68eb355385ee455d4c34ebe09d322c0bd6564c63eee5431438ea10eb188164ab47a21bd3a8491a813a44c91bc43c86b366983e5ea7eb544ade8b169e932246fbd4d3b8ec162ea5709454b27625521f5100ff4110473e8fc60fa9210e6f3c54ac579c95c82aafc446396eac4dd7f9fdc95ca224477be270984d3ab15806777c56d483d840c883d1a2ee61bec47f340464dbc8c4ae571d1b268b1dabd17421617d8d980f258e8b375428cb12c6ef4e864556c3a7c7823d454ba4cdfb138b51cde14cef00330ca07a64ece912ead94e3c9e3e15a93e4f90010ad8ad12c335bd66e1d0fd86dfaa65bcbf3c1591505b777e250e9543ffa9288f3366d0287573adcca5815ee1f636a5b0fa448261914729cbb55f0b45772cae652e691fff024d3a37d898f8ae1c5a6b1fca1b27664eec1586b40c60cdc80b7c4b10fd626857116e4e533e56bc0b4af891ee3d8c6827c985cc446bed92aff80e9ad9b56e002cf14be6074c3944e7d59394895f09b01c7d995e17feb5fe05834d76b07036f06e8f773ff07b1ae227500c50a1ef8458966db0eb10b1eb69b4d83d97eeb970579ba6778dfb0081cda6b389e1cea841996239ed00326a8869dd1899fd5aac56c7fbb48ccfc8858916c5cb4b6854ac1733ab2a3b973bab630502c23b0ab6472b6d2394203f330507d32f3f82bd66197ea0c3f3f675578f59fa6739e9654a34647222659a75cdc282fb2c869bddf50a35e6796c478f7ee87855379a374d0c9febb8d6fb15880100664fcdd6412bfad2908690711db4c8e3dd317d2da4837b48cd31ede39087749b0427fbb6a1b6ad5a36b9b01f06fefadb01c7580d17a42ca87f561d17eab8845a4a90e2d85aed9e6055124a2f348486b418ce3541c073c89b40c140f51f06ef27ffc2966d2620652115b068fc4c0bb41167ef698a5f8da720e0f661a284c1365db7535f46899d74551138a9b8b6424920134e18a401d7d69f739ce898405c10e43b6c84d4565580695e6af3e2d2262fc09f2c870b3bdad621a79f6b4c6b62539bb5efe0f59454d6061c37bc282183b962642306ba5df1a6d50f1c9118fab286538b199c137b38e247de4db11979dcf6e7126255a4b5cfa2c1ee08eb70a3f6a18da80f52be530d91291dd2d22efa6f2c7a6cd5cc1e250e0fde674039c9a2bf88bcfa1b5b2888612246bd96e813a8ea6977a14fc16df88a554b9c66ae0fa6763b8e6084ee4a59f7bf102e6098b7c2569919264692a0000000000000000125f4101000000004de3e5963a70786b3cc58f9d7b1441b1b24d33b36c6fd533f4246533692b251bcb448b446ddb6f4c3e2da4f127b3fcf559781f94d413a308092219adafc917c7bbd0c88b55cd64c679940ff3dd165c70e486185c93947822f12ef6d8ee1ba85d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f333e9622be256b57756a1596f397cd3bc67774202e3b98bb098b541fc6c7486e74c2f98f5e7e13819d4afb5d8cd5d813090dfcbb51a15fb649aa6d125115ddf5d64e56200b9407f2ce8f7e18f05ca5c9257ca1e7384b8b43392789cb63c2a849578ab4d3188ab5626f08638e806dc16e8cf5b3687ca6de491e6ded40b2dba8e031136a0370ff786764e49f6e4a1ef8e40b0dc24e98deee74761ac86fede14096b0223b1f62e78e852141b5dbf8ab6fd2f6e9ed06bdb104d049343229fb4b2a01b7e0b02742954c9902266f954e2802354811a7d1b9bef7f8873957f1bb2b7d42d1118e17607b1bbdfa4763afd637e82a00dcc102cf2196c2a21f947d5b00309a23db00200ca295a0264939306c7f5b7aa62ae864d6811f19ba4330ee99ddecea221e4ef020d625efcedab0d938072222d8b28e48e8bb42629f8079cd635e3866fe9caf1bb03075cdfa3fd1e20c2c7ab23cece80d0ec743af405162bc149dc3e8a483c0fe19d031add98eada81849727435faa1326688536432ec7095a7c913dddba16f63e84f903167e79123cabcdd16f21cf4be6e5e47a67f0be0ab58c1f76bfde7868931364285ee6919c2c7c1dcdc91ec0e78f204e2df8cf09ae1418438b731a1cdbe0bc4176a31531598f16abbbba12ec2b6b6f92f5ed772b72d3a26835b0d84f4e941920635151cd88c24044c00e777ec756e24ee2e5bc5d3559bb9b9cd3280ba2d04e7655b36add1f277f108c799e201be0c1949fa424d52526b200d65a591eab969f1a4f66f90082f37a0bf8f93ba53d43e1958ac70a908e531a0d975592df8bda03a336908629b465eab149c229e357493867a887e0b3214cf3516eb1979f407ae29fc2ca7c27f6d8e5d39fa0d49752f5c475945b44818913ab2b44644d0714fb7845530de27c0fca8e46d95c950a1138c8a2f1f3e1d344919f4640397104f9cd7f73c445fc8ffbfbb93f1d24b4faf3286ad7d972230d725ae1bc36e450ae634d1d660951e3e198b3c9f19e11692a69741887eda6c0415eb25c750fb29473a1aeb2b8f704051e1a9540c9d46d0f80d7832228cf08346b083e0dcd5931785d13442c8cd9f3cbca61bd7289331de6caf4101103943a77cddd5983acbd6ad8231df51a37e8e0d3113116516db8ccf5d9626c96305da6740bcadebd463b8f03ca1fb61f43a514e7453872384e35aba599155d68e51c60aa7d9eb11679b38033dfea2b65c853ace5e9cc0b5507abc9ae59273dabb0dccedea8be539ca5b3eb57970ed921c541711268d170ab345318ee9cb5c4ba2c2df207fab367e7e5afe6bd982fc34b5f415b4b9eeb9190c666ef2f2cf72c30a56c1113979ed499cc32ad60b8a843f85649eac23dc7e4582d18a529303f532470ad833731f2fc958d1bf9b31244270f84d058f358fc2aa77a93211b66b347419178908ba411b313fe3984559713c51a1a618cff134c6d3334775bd5a20f0f1bdd63f31574dc5325c50db0ec61d1a8d6f76930d01709729d10171699096a926447b41b8b31669407cfb679a6bda47854eded6759853f39fbe9fe8704cf4c803862a6c475198d9f49512c7e3134e0a1880752754d59019b79406c42baf50ddda07a403148646cef526f14fc26adc195e0e2772bfddf4dd4a751fbc4bfe4eeb7017343e0ef1fbceefc5f5d9bb171dbb8220a38309c4b977b68e1231b9aca9dde6709c87416ae2bd93f1a9ee5c33bbc85c5106818b54179fe67f6609c915728a511da634ce0a113dc84aeec5690effc08beaef8cf8500eda3967fac400b27a33830fabde35a12f1c43f441cccbef245a7a33cceca9874bcc5e0cff2ca5a4595fe0b5aac80b7f10dfac7cfe048a4f04359bb376ab8b44621490f6aa15c4773177e54f5c8a79ada2fe1b882ce4359ef0744f332aabe68de8a0cd706931744504c64b4dc5c6e6e62149a42d06bdc941a3d72b5f86f8dd23034efee81cabd253b2e2ad70f080d1a01f13a89a58f7a349ccdcaedcfa0738f3847b6513adf42c36eabeab92ee9059f12bd4f261a18c221cc0cb0e79822bc60fa80f0e0f03f683762247a69b7e0d8839634fa9046730d38d3adcac7353ed5214daa5e8f28461bacbb507535afbcbdfb4d948ca9e11c6e3e71ff2cc319dda1ae96579223b4c22d9924713e0f860b1980ae9084708f7500d5c28dff2a862e4ac083dc0722125513addc136bb593b9396303ad92d83d0fe2da462d82af37cf97e28e4254f0806d77abeae2b921f96299ec19f99b5f8624f5b5a55a9ba27633b4cfcb06147d96c075172c8e324e517caeda87ebb9f036a74dec00abbb111d965599e929c3c24c0b1400e31300eb6695d0a428c08a251fd260eff0db11ac1bbc7b6f6cc882e8da0da701925e9130f3a533813886230a943179b33c10b07b4e28534c6da774e8a653e30aefe5f79ef935930f", "63", 0, -1652976456, 1537743641, "471fa18ffb2ffa9378ad8d29fce897b96506ffd1f680ee46c3ee49ce71c2aa43"], + ["030000807082c403033a1c1e29e320a88bab4ed7d1cd852628f37c5aa31a71b38c5fb0c6516cc1526e0200000000aa0734030595c8332c3ed0f1d999a7cfddaddef59b16ffae8443cfcf4b56b3f654149e6e0100000005536a6a6a53fffffffff5f9e0695f70e3a42c8db46cf682efc08b80d93ee6d216b9544b61eb6e98e136010000000153ffffffff036259350300000000009b634d000000000007ac5163006a006370645104000000000551515252ac3b869186a1303eae02417a8f04000000000000000000000000487d8d0a803cc27b3f5c8842c164d57aaa4d3eb9ef64cc618ffd26e0a5ca58ebab166b05f9a4e4c4d9bdf075d8b2c8bd5e5429ee847e112e6d1ec5e920616e65201384aef6fe018cae3965ab7b8a5a53022ca31f217249a9f87bb4f9aac57e4b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c33764136aa5f90a85ed50a61169931ebdf0bc527b8c6c1983357051b4e3711ed2759bd0e5655abf8bcfdcaf1c1343f5d263d1ec16c525c70247f91d0ff924de034b35319d08af1fa21384eb6de0396000aed27d3e11830aba1e349852df3f4ae0fb73cc4f47d3fbe84af3115cf90b88b6142c93edbd680973cd5bc0f290c72c032bac399a918ceeb2e7023b91aa85595c7a2b2d34acc942025776051e5c04dfe00304ab444e23bffd8e8cd64715500e848dabf98597910cb8acfdd9a0405775876e0a000680f158694ce9f700374e50c4c6cdef7fe5701c8db1f3fc78a7c83664e5cac7cdf900879f443b624f4e3ff960a89e22c29e2d0cf7e479f2aed6616f8039890203184835c515fef98115c9926d6ee547f904101ce137bbc04ca3fb20aeb75998030050c85b06984623daefa2288897fe10a2deabf1f2e63c07c73d429d0c7ef8ab0323e36774ae58b72886b56828da872a3d5916109c63961a80b088138a528710ec03272035c33b229e6a9fc7611492390b5c7bb6fb10df426499a83c45637b4d2ef202218233ab37ecdfeb4de394e151481e9052fe49fa3e52888e849ead02e14c1dd9e004bd1d4d62cb8515438a387010aca469d349bb994b1f3c651c51140b265d5bbebf49e30a3bd34ebac0db57509909b824a177c8ec04ac52cd85d127c26ffba82587a19f5f250e511b5093ec5a9de171c037149459d74a4424de260bc1b3ccf4465a4f40446290dba88a922e25a7ab838d28c3c49e6bbb8b80f479853e8617fd12a7622d6214886fde03205d4df8517c9af8c7de7b126d73ac65cc0775e3a9741880be8fb6943097907c3ca4ffab4784972ac52afc6734d0699ff652c13621130296ad7af4baaf97e693e2720f65912a704889e5ceb34432027c5a6065e8be9cb96846df07db10a318c3443e69fb784e02f22c1b498b094c03bc9b950604826860407e54fc805f78783e4666aaec10abf3340e740657d47e848d5893bda9a78e0ae461ea789d0f4a56d884b8b7e8cf4c7458fede3d9e7feb5844762ae0b738ea67909d2314fd5d9063874ee0fd2991c51f640580bdc6ed1c57b29333755022ca493d65819c44e5ccc970a64ffdc8da208082e90f76ea7e6fbec4edd101e4f139245d5f20510d50789900db9be15193aea10dcc8a51db249066a0f1fa10b82e42538b960d5213193c0afe3ee4050fe2f3fb382410b929648aa6581d81e2570eeee088f186e1baa69ad2c296d3adbfdcd295dcc94ad3f52f9441f7bcc173dd4f0074cbb2715dc5ea25f2def03dc1a9c133ed49df4669255a3a104020b0834c473a393bdf9c3a95ce1442ccadbefdfc49db0c44c711c7e1b4f59cb7d1c1703f5a42364ed242b7ef73b144dbf160374970360a922e7dabf891b211ad222a489e33ee648fd02432da9b24b66541b452f4fd32cdb25cac70745838c3bead95f4ef7d43dd3451f5c10fa9b1e3cddef4d289ebbc1232add8624c97e8acc3a87a5c15cf23aaed474ce97cc07fda8d88f99b6353d1158afba9b36ac3cea470787d6d8ae39a21914336ccadf958494f28dd92253fa7c42780d90faaad846adbbbb9c96f872f404edc2954f437d134051c492d2ca61250365a1ec16c279c3b90dc5e4cd47d16ce1e65f16eca07b0998d780dc5dbce80992e7178da120358eb272baa57120c9ed53aac3688ebb1dca7e8e594a427a0e582bbf8506fefcb162cbd537d095ea1c80c678db194df0756c535049c64154602032241e7297bf52988e264b747bc7dffa04c36be348c350ccd3e5877214283b703052517cc22178d2f52c5d99a83801a2698244b284fd8797ce19363c666dac1bd091cc276dfad7f775e7b8da636751eaa043d18b4f9a7adfee66bf5a53ea9acd217e1ef3c1f259edde206ad52e4fe1e83bb1a2643fc196188277fae3c3b813b1938c6abcb3b0655720c3bf7f2ee2bf171aafb0ceb105e0f3b434f77ad911977a819fd62f31a6f867f2d76c53d9dfabb1b546a8fd53eec6c5b71f1642ce38a8a780c495985961a09541483dd00a81277aa665b7b1531c3e7868718db491b95f5d923c3219bdfcf4b1b32bf64aa70d4d99f5e30530c694b1a484583d54a4658592ee86f3944cb1e75e24aa1ebffa11484930f01b2b2962dbf421804152199a82d566d6355079298f3ddb31d42247869d28dfd028eeae6d3eaab2aa9fc97a81976e8aa7f505e1c87a7638be6e3a83541342e6bd16d7c9823fc38ad13e25432ec47eddf3c1d4452baf622aca7539868b35efde93a7c829f9168f78e3466637d5f9ac2700000000000000000f8f90405000000001e88bbc7dcf0cc85e4084bafc5fe8096cdbf7b84450cb8e9d35861710cd150fe0087d1ecd7ecf67d45abd3592f27f7203332db44c3173e3f909aedf2df7c4351e2c5fcebaaea31fffc26a303d29b5ec198ffd29947bee9a6163aedff5b34a29600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000515c2c402d39cc553bb5746114352bbe0a3134d8b99565e3f086499d76756c8770ac9f0c756dec7bebb93e7501ab7f768a8c40dddae982f4f62114802a1f914b01f79912a3e7093a40594dbae53e72a2f687e89e5a281b909e2a04ad2b4d4e897086805c81cb1d4d95c6489049802c8f8d115dc87d5726a1ebc94baa96ae6f2f022c132c0f497ac9221ad1e99909dcad87d113882084fc0e4297a57fa4542d6836022884af159dd432917ce207ba5ad824dd2155292fd5aa31943aceb97d444986220b0061b37731e01cd7e97e279415cecc09861adb9025d4c665bbb6f4a181e0828411bfc13c495b42179f4b22893aba9eb8d3d94d0e1a86dd8e512d7b2ca47fdf8f0323a26690204856571cef35e02c683f9155be306e60d8abde09a3c65cfb81623403182ce631d0b813458503365e008bf2b68840eb471b181ac7da21572622a840cc030f90525c2451a5af084a11a54b477f787adebd0bf5c0226a2be834eb0b55501802113fae9de14a283f1a6d5529a49238da9fe29d087c51af1cb18e5649e237648c0328634c56b57fdf34b13b52d8f9fcfd9535824ddb1ccb3309f895c573a73873941b66451f35944be5b370f2d01c5981b1f64c5a2ea88981dfa79ad2d3633233f098569157202976ac197b49bdd366501d7fbc947bd231ee9784888d74fc0937cf8597a228b16033270439a272e9b6a596c614e7194382c5ba23db01544d4232f1baa538d7b506775752668d17ae1fcaa34052b4a5b6184fa66c01ccf6b94bd09a3bfe7d71038c9c0c9df2b4fffaeb779b7e7c54ebcb5b3ce0c66d4637c29d66e9790862c0215800c587354c88065b42fe8b56fca7ae3fbe0396fb64b3d8780188a5a6fbccb26106deb6fbd132cf1a8801f74b01d8fff9fe8aed315ddc7defa64fc7f5ce9f1c42b096ec96c4de8cfd3f560436f66006de09ffc7f8176b0f4fa102b3a0a128e93c3e0581e58c5019a0e9eb02cb06d5a3aad36ac68ed5da1196f5e0902cbec753fafdb51ea88affa7e02229285c3d41c30f0b727c19c28b84dd50327e76b810d78b46c8337ef3c96dce57091a87ac7549fb5de223acb07d0e347baee519c28d66e77a88f34c4afac82be83cec1d5b6df646829775a824dc8894a92c9854d702d467c408a2e1ca59b34ab49395408e70f40b01b0e493ec9b8e8ef1355845ac9f08a0842992aa269fadb35251bb9066dcc67006bafbb4028cf600b3f6e084bb67aac98e42f4fc631f33b08c40b42afa15101aec69eaadf02c0e8c78df8baeddde1f8058a04798cdd938efc0d5f887bc48dc7902445b16bcfdbbb4fe3d9771f9ce31accf2244fc6908602da416bb10c0a7c9a2f5de00911e58a0fef771935cfdfbc5a814833d771455a52b78f2c8bccaa0ec57ebe74145beefa6b0fe32c40c9c0386843043fa49ab9b40fc56421c4684631d682d3cd301eeffd05dcc23fc8764cb277ccec21df4e86b015df35fe83a9a3555f44368fb8da3ff2e2cf8d1f400fd05dce69cc7ffcd7e76a66a50c3c366bf10406cd49c30d995c152ad4f268f1cad090bfe08b5ed55086c44414dfe957f039a0120deb659e8b83caeb0378b062677d89e8c6a0b03d61b13757d906fd674e8448c901cd4a0db1c5731b29c11712032dfb80ee62ebf5a990d4097053f2b9d1ec47f94b697426c155b2ab6fde1123f40285a605f3222862e6e6d963cf461c151e447c057a6d26443e7efe23510dd82fae63ea72d966093db9d95f055a47bec75aa177e1a0b415339764b834146c17411b6a3d3705592a935e619a692f7254fe703ef174f980a5909df90ab6fdc253e9d1a7eb9d528fce80c189c816727e3e24b3670801c1bfd9784108408e0c8581e61bfecd2e2aab0d66b5c26edf202bb68eb23dd1c34b3b47c464eadaebd85f261fa25f1e547174368e6998e4471cc6eb6054e222cf33b8fc255a144cb067f7b52d4dc09a19c440273b4aa60c9dba34e70ee3234319a2d8d6612c864076b44a11a42aa9f96f4ad8ed930167da8d047827b4053d3f91973aff04eb9743fba4ef3c8094f6479f4f84a9179a643a7a3e761b24c58ddda50324406c289df67081ef6710165be7ad6dcf9e11b1545ec449892a2c9a5df96a2472f6d64cedc98701201e7ce941b313720b6f9b814ac0e6b1fbf2b23196b63f4fb8d241daf9eac48a531978e245fe4930fac7e665f50982cb23337bbf5e8d37e1bc0fb42c761ae69bca5266b3a3d860ab7ee2dfab3d318095f9ddfbdf8bd17bb5493f80f8764fedb95fefa985ede1e7d402a9208c03986817463e666e5c7aea9dc29f90869aa5c56140895e0dc418bc3cfe6fd1aa194db7e599602bdc0b4c2094151029e97b1e248c88f78e46d074ff196aaef599a6eeaecbae363200fc9efe8ee0cc0b06c7b2cb77ec33b33676e0e5ed589c58010492ebab79f04", "00", 2, 1911798050, 1537743641, "7557868315272bbfe5b895285d771b1e12c60923d27b1bed7a4c90e9615d3521"], + ["a68aa32501c0bf5d6bfb4b106bd041cc10eae4306c93c1daacd5040b3bc0dad3bde00aa36801000000086a530063516aac5231342fe00291c164010000000004005165ac0e4d510500000000025153000000000117929301000000000000000000000000341b2ecb21c14f42cd14ba351ee1bb79f1cfdd4c346dc04216c5739da4706b1d90d9298fdd948ac5b7477653e1253a019405616eb4d4b16d62f6b7d8865c74764eed2f8f85fcfe672a019fcfcd9f9294fe4e519e79532cfec1ae66cdc6b7e73600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000efa71e6dfb73903970c00cf3044c098d1449e39b92b5acd6e27cec406a6c3474dc9a99ae18891d8b224e7c6946d9e4d169e7a1f2cb2ce322a3547ad9c0d021144ba8ad4be65b199a84e68b92ad2f214cda8edcb37bbaefb8493da6b16dd9ec3bc3e16e38fbe8179d7591906b17e0b66449c65e18793783c41f0078412d8ef160032e01cbe82116b72fedac1fc98a06c44f812043c7b8834960b3e19f88953f959f02284532a6f62cfc55b362b133559475b87f1254fc4c3dba5de3ef3391310689a90a07162f699fbcf169d1d1964c868ce887feec9408eae609cbdcecffc781330e1474a4fef37280f56ceeacf25db6ce7ac4101cd6d5a07d7d491bc6d0dbec3751090228a46efb69346e6ff4c332cf3cb38518648951a14561c4e05f978fa46cb2f5860315551aab847623fd4007046a16a434278582fa3b7c1b3ba2e0b8b05b211bef090309fd3106f84941b6830bfb5d0a4f761fbe30ff4b2171329f941975d8269fb015032ce5429a3d1dcefc81feba75f8fdd95e1b8814fadb733145bd9e7acbda2073aa030afb45d4887ea4c377833e39b2b6b55db909c2b381ecf1078a26001208d76678f335ea3b14ad99b42935f43f5ce5b23af525f597249f8f345cbd643a6c9a4ccc5f4b48f635765b6e9f74d0c2434bf25a6e1bff0f21a74344878fc610d5d5aabf4472565a117925e61dc6e2ae5b3e397576201a203a3b6001094c80adbbafe93bd00d0029e8f445cdb51f1e156e8586326bf5cfaca59bcdb6a8bce04d0d118236f78d5628daec0479220e6cb1ad8795bb102a2a6571c1ea034dca7a388d16a401b1c3ba6992ae14fee57f7387621fbfb59cec628d325324ee37a6218bc037efdfb2140d70d92dd18dafcf126892921c4558b336228bfe28b7a11acee3cc1b971d16e80af5620b59fb49582e982a453b86e788183ac0a4d72e19b82c386a42f7ec988ebb15d1555c86bc880c25b17a32b4b7c1a643220602056703068843f7bc8b561649853494e19bca7bc65250b294404233c0217e45afe4b7d32ba38a057df6502f5ffd2a63666ead64bc090d8d1f93e3df41a3760e5c8ae17948d810cdab3ceaa19b9624560751e323d648632d1e5268159de5ec015b73a450ce343651bc9529959f7f6c5593dbba2e59369550d808151ba18400db53dc658c73faa5ba3feb2da8b770db9598850a40e76c77c655a3ccdfbf149edcdc00924e2e87ab4992924ed9dbde5f3e3d533b3993b14d2b94924f84ceee52e355247c4b7502cf12b8bff64e9c2741b0913bcf748a06135a461c4a24c8cdbb67c496b99101e834c9154938afb82dd6e35e58cc8e3b74f09ec14f5458c5602072bb73fa8a50d1b4f364f9d1a831ea68f726685278a7bb265204c28614f86e25cf17e61ed1a856e8aa6476b67b89c175ac7c43f4d680c7ad89cad1ad83efa2d702a629f8389e7992af8b4cc9235314ff911f32cfd3d1d5a069f01e7052a8e66e99343d5774ff5c98ea887451bccf4ceec26ea97cb57675480504c4a7cdf7771f306a5edb2de25143b07e1daf0b88bc599a3632826b39cb714f0e8ceeed9fd99b1171a7524b904f795d7cc1cbcb5482ccb4cc171d559e28c101ace3cccbea0c21aa0122b356db1c183caeb17e3ab3b696609edf3f16e7da3dc33b5864cd8c1e91e0b969bdd5c0a9c2c79f0b2fcbe89121af8d4226232b2a9ebe043f15b8b646459586a8feb8ae51097fe8b1a69c2f9b496b7103da7aff98889fdfb2a811cab77aaeedf010c8cca09b0daf0faefea96ea1fac0d28319924336fabac38c8d59f77d633690f4f9c1096a2bfde8ef087b8f9bf525c8a9bc615093394ad0b6cee4c700de5f9fa218b7e81b96c6870770a81bf5a720f805d32512c096f67394ce4ede900293fbc2f24db7cf6651c6a613e8c3c7554126643c907c59b6e51a3bfc42ad008332e57ec005ecb7bd297eb008c26fb4b335a743a46b32f402a6c028d79bbb2c22b4fccb88cf1d526d044821f8f5e3909f48a8d1c63dc7d8e4fb412c671d7382df5136fe4bdf34638df6ed215b37f746204ef05aaf38230e0c00fd4549d48d284483d25de25c9c759edaed7900c5d6696b293c7b715fc75112f84e8d7b9f517b87fdff9e5c2e3deb6b22d2b2fe8cd398e44c8f262155c528a807840c1f5ed96804faa53d2e2227cd2286471e72759cc7862e274a364b4e2cc79e1a1bb269f5d5c4a1347c7559d511280b058a75d18f5110d8cf7db68c80b75f83d540bc050adc1ef9c903a795fcf0c125d83a209f37d8521b140952978aa11d8df3d5ef205cadd3ad6f0a8b23cfee7a407a87c70d67bb52b4d4e07caf93bf97da77716f268f66a87aeaeb3c1da2db44654959d2be72cfa38a629f2f81b7a66ed7a23d004ad7c2564b0ae4dcb646fafb072d8f263e4089d5fdc7a6e70b927d285fe65909", "63", 0, 1410329287, 1537743641, "66eee6a7bf6dd65e8941f840537fa1e203c53f148d150724cec273c6f96f0e52"], + ["030000807082c40302635927d1259c4430639078341f620b9a723e8a76b9b04be66e58ab3d35793e0f02000000096a6a65005200525353593b86a340a794b79016edabdf6167c5361c5ef2e10ef723489fec0163e020c857e4c3a9010000000151ffffffff04dfdb590200000000045251ac521e11bc0300000000025351fee387020000000006ac00656aacac0b7757030000000004516a526a000000000000000001c4435605000000000000000000000000f5d3b729e3c5d92c30b22f4222025d5db5741b6e6ed106b7d595c0c450b156c0a5c84c36a3f352299eb1d16c2d1fe7c216982aac67f768353ea3bade4b91b91537b0d5fc1e302cfa85a59f9588b9e79ca3c2b795db765574c96f4cde2b391ced00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000db7465e8ca59957d7cbf64a0a2474ada1e12dc4737ca1554e551c6ab1486fda818d12c4a0a255f4f1406d088eba105e27c040dfd6026a668c81f969551838ea3d7d57258bb604801573c20b13f3ecd2e302ee0b2180ea5c0d66343c15d8acd456e2c906911ddb21c43a1f1ff3ed8e41472445c510df8b2b9505e83146fad114e03180852dde921e49d2a6382e7281419b664fb866c6799b48f977496cd8ded6c5f0319e2438afbfeaae214283c4b4148c383d86bdf1eeafc624c53e59b4557e3c33b0a0290822299817f70e998605c83b87ef45bc4eb6f960d41f7b177a1d29e748925f30cb1ed38e1bf6d525c604a688ed03fb65b0aae474d6e2ff151bea7b73c284c030104d33a85e92d57337eb3aa811dcc526058374bd9ddfb822e8c57b014fb8f8a032fecbaac50eed6a7c0f9d4df4d3951ef85dbc9f7f37bde89d56edbdbbaa67bc7021eacc608b039f8f99760f8e7a4b5b3662a687f0a13000a64fcbdb3a15fdbd93e031065acb2686137cb9bb4bc82ae9dd6afbcee69bc5be25dab597d4b66935c1a3e022f36349940e87b4de6af61eeb8a28f5ef32ce297194d79a05a6f8ca11cc4716ef206005786b82be3cf5635c439da911952c67efc1528b3e97775660bd3fb012250055f36d8ac6bb4a20b6ce1d3d49db5d3394265d3ef7fa66114bfd7f869de60849ffe6d5879d1bd33616a1f2e3eb2773a3cb52d3e215dfb5c89454ff9e9ebcee469fea047ec84ece279934b53c99bc69927a80d1bc2f00b7002fc391b4cc5069ccca46eeb4507314b6de82960bcfe0350a3127073eb10e2251052222d156a2f5013465052a7ec5d1b766257b703551a35f127b12f045b45f96c91f12f658baf92dc514364c9715a071d6aa5ef98aa006aa2b432fd4b63e001ca784c6633eb6455df0e0a017c60d53954ceaf609534b498cc21dd05b74cd3bd5a51c1e14705a7b11bee8405dd0fd93a29f8d54aedd629bca42b33442e438fb184f0b89c76940fb8c57fa7310daf3299f3378a5236e5c1611d93a9545272c479e69ca37943bb39bdfc15995ccaa21ef11fc772c3b841cd6d53d7b5ef3dd1ff3949c8a7f4d5427db9a58446f18b7f27eda2bc661806f9c742506f549056b5f46d3514b94c78795096ab7ea1bc7f362d42b4721ae6901fbb4237f75cd50d0a25effc1782f40759ec4557eb13af7e61fc543e5739dc384ad8542908859b19bdd8282807635c20e3cde3d3cb9a807aa82dfa6f1b7541e3d5ff9c31e019cb047b7642d3d92f69a702ba449e87cfdca76c8a3ecaba9dc563927f96f7257457043cd24abe39a3578bb064f2bb17ed25cfcfd4b394610c23284de21a70e901088e22230347dac0c69dc65d4250bb80b46699e17cdea435118895a0169e854fe4aceb66985bd3fddc76d4758138e0bd190568ce35ab96da84fec244dcc51ad648c64ce2d3b0312869e12b25ea2cd76c92da8d47d6bfba517ed9eb623344774e82f3c2db14f392d460d2c6787a58f6e9156a658540da86fbd08782306742b5545f1c96609081546bb02531d6aa5b06e1430b4b7eb98bebf85700344f11604060dc4912bb28d43b6ca1c6af71d76c4585558636a883487617411ed3b0c31c803d433e079e3c743cd4ffe64e0683ff9a18a2026fd1d555e569bf313919d2f6b5b89d1651d16d34fa1d4f98aa5e1d57522bc23e6af0534f63657b77723fd63570866a9cab44fa034ff52a0cea8ecda51e64e1bfa775526b44d93d132b10f5ff88267fe8f0da9a56c3900ae70f65eabab2669a77f53fdd4f8c1b67ecfe5dc7a46bb436882eb868f4bbd56a7cca3b146837a675dbcf6f38e9419a2a7fdb020ef3cbad5ee245e0c7e5581ea72ed12ded067c13c00af7b2336865ca92361ef0c4c924d6c9e306eeac09e0c12c4fff582661eab8c24ccf571480dbcb15892bce4a230283b9a05e1321e807c5bdf374f9de7cd0ed2ae94619d1f6e0d40bf685f0f64d37c4504ca683fe94cc8ffda355532349b3a9ff6a9bad189842a7f53662fd2bf776f172ff8db8e7fb17b0ca59bb93b2ccb0c7c0e6217463fcf6d241a23d529a49ac991187474cccc87719dec54586818b1e373e2bc2ff33c990ac6a0d629a83bf5fa51226f513dfb2e16b2b014e3998dd0f54f2c02d069c6aa8cdf19bd3758ca3830fc02e501d7461e2991fe09225b137f275ff975ae5bdd239cb07bd2db6ca68beb1e4b26bd7aea57c417d488ac9355af12b1187e18490951d350b97800f99b85376d88d22fd81b71d7ff811037bc6f5ee2ab497df5abd4b9e69f8242d6a1bb3d91fede585507a8ac399a83678a9f20af894ffb04a146262b2908596151cc51192ee71ffac6be04a7274f6cff0c74735931d5ff4c5865e0279ab05b7c4631de46c00ba147f61561dae651f7e4813a2950ccfa206e6e070e4f0e76da590c1b808", "00", 0, 1761313659, 1537743641, "18c911f9af55f4ab9bc9494bbeb9136e97f0cf3bf237277cc241d19cfb666a79"], + ["d5406b4901da41cf539403460aec01553c086a02e92519fa871c9e75eaa441467cf4ba3d4b0300000003520053ffffffff03202e2204000000000463516a51554cd200000000000665006552acac4b23490300000000016a000000000300000000000000000118dc04000000001a32c546ea7af7ed28083bafebf53160bd4a28e86be79a0dbcdbbe3102b02b5047ac8d2f4dc874ad35c748e94195ee773b833300e79dd808670494a1cf21fd128f7b81550cfe82fe8b14a96038a9e5e7e8263f51b194c036e5708afba291208e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002630b1f98fe73909be3a210ed69ab293f5f19a85fa692d3690b5b02ca24ad20846e13c1d1702736116c92fd456082a9ddb13fb2f2e9555a84101e037c1ddfaebf02acf28c385c2a7b30d4bfdc44ebc988aea04abacebd63aa5dde619301b858ac56cb3004fcda0fb527078c5c50144545913ddc34feaf3dc62d46d127d58b7c1032ae964af60d7f872a91d75bc2b714edaaf29a54b9693ad25885f55dfb34dc00c02201a9eaaa589077df5a6a592a08985c237a7929ce57854bd33d4f928704295280a0283254cacdcdcd13aef8dfa1d741f0d73b7e5d467fd14e1fed39216cf24c7df995bf266fae9322f162b413a0bcfb846701d84f8f83c859878c52a75a61eb0090216cc6f2ecfab4e353baa7344db1cf92778cd251240b0dcef5b7d062977e2643f020cbdf54e28d249e196ba2f35ca410d7547dcc5cb12991667a69681c52f7f793003117bc5adbb6a1ae95ee98dfd0fc964de9be577390026d3e5c353d4b4333e1837031ad0e665774c813f601ed6807e09db19020a5687c0c485db3247f1abd59ea9a1021b98aed4872d0c7c4b14cd5c26ddcf0628216f82a757347fbb03c47b9831d9d21891bbee9002d6b869e9fc211067a762df9db1907ebb3654a155f73b3ac09608eb3a3f819a2caab0b351cbc66bebf62ba607327f28e7425443b272d9056953180a83acf43cde159ae975b9c6ca1c2316fa178674ddfad24c66f08f87cc5de613fd251c2d01e7eaf7065f06c10c44b041433949f6f58652e356fff109ed125d3fc34558eeb4b9e7d16f544652a62329147ca8f2f8b1e5ab3b1ef33ef238c85b9e40b2fcc1b8c65981544272aafca6ab5b454f43ae9848babed7bcf5acfecce3969c87200755211f67242803d1265fd79c2432739c36dadb0a3aeb38a5e9fe65a367eabe833c8c53edf9b6b1ed5c5d48d5b46ec3a6a49985561e01372b84668f53e7a72f0c6aa791b7ed0008d04ba0e34fdd4bb7238919b0388186d449ab53ea11982c54f6a4648b32e609fd8b39bf974c639053ac035f0d69570757d59519cb4a9cc39df7c4a2fffba3b66e443a911642b1c156c3ca04412e27907a47609300d9f92316472a888e51691342b565011093f63bfd107f030368aa062973738c48c2473d0fa7c885aad4548193a8794a54a6e0d1fd437a393657a19d10dd436a56bbdc2083664e73afbfd5311cfab807c8c99ebf8b487754d5ed1d9f0cb883610784d020e4800cc1892b75c867a14b970872f268757730c3073ca73e11bb0a23822e8ced725f21d932f3633ef6f0c839f6c53f865f26a31f279d7a3be5a6cb22829493b88b1401f2bae033b24440caf58e18b4cca03024bb0d12049db7cf7016cbeb14980440156c65f8502e222caf4770904caea4d79abc5d42ce075a19b22397cb080118b27a7b7a2f2f39badd6132421cc95db38f113f70aabd03f984fdb583e6d7f3d301c5300d3e87b207e621081af69c4298f2adfee2177f8fe141ca5a270614eb95f72f747d6ce3f0c5737b20668fdb1fecaf8e7e69817106195bb80bc47fc29cef7aba783cf921716ad68201758372c533cdc9c7072e5572af6013f0ba445c13e4778eafc44d9fe149daa770831d9e282dc94c8c0be8648d5b4b921f6d24ff78a281585fc5fee57ae07cf5de6e390e686ab82e6a7fbc1933456809d3bc7660cbf491dea7c0f1ec76dc9a0e5294bd33af8d68a2d01808f7772bca3fcd9e57b1ca7c56f6bddf318e638026958e498b23fcb148d0db4f53ad86fa49dbfe2d6eb9d62c57675b21d65a3c346b820bf71759962eb5d2039067e0a019619fddbcfbdd88168d3637afaf6f102fcf496ca14681f22885a12aa1a331f66add75fb992f35239583eef7add1bbf1b540e6bbfd4d463bf7b3ab1423d690e01cb0b451204e33d7b12e3e496418337a4f66220ecd0c1763158d69088477ea59d617a4be920dd127685ae4e5eb822ff12c561975d4f17e7d861a65b847b70bd9c249ca5d0ca956cb7313fc9f3a32858a947868fe89a56641657d0a9e67ec1ebe1109f1b260c2c9c183279adfb97c477feea88de23e3b50d5ce49acb9599b917a75c6e94afa96aa4cebda9b4a10b7640dd19b5e3113ab480f33ae30f5b4d3ac0097bd15f8436c7ac42faac4021f4deaca3739fc90942abb319861da0e20ec7163a12ec05f8c8bdf35d1fb253cf428b2d2ca56c955b4a740a0aa7f37cb60166edd138a7bbeb038101471a21077ef3fa26d67039c7caf4b7deede53950e9506bea9e8188f94ebaa9a9ba85c8846c79908df91eddae11960adacb7147f020000000000000000000000003ee7b8d9fbca4e23176b5d6d71e2867a1da7552860f1ee11e77840f6704d224a04fcbb505d2bb9c249ae08b3e665e2f5a688e4b09bc4f105c7222636c5543f11e02513df439dd3d915640e529e972b582ca98a873e6daf06061931a5b1caf37500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d431dee32a6ce46085a87d338b2066cbed93d5a5f952ada82c5226d2a5afec47b0fd09bbd7148443613b55785561517a1cb15581aca2f455860349ddd7eae8fec710b4a9ab812dfb10b9911f0637369e2f7faf60732e0e8c38a0209af8a6437a6a895022366d53d84b9707dc7035834077d44f94b3666b9ce70ef417cbab55cc021aa841e2ebca89a1b6a1607c8a65d86bd2161eb550cdf07103ab8dff2a4eeaca0225f1ddc9fe9e2046d021fa4c51ee4d6eb816de8c2fb84b452adf738f302e0fc50b02c2c9ee9f658430bab196a63f38a174ccbf0b30e28a51ff02ab4a8fc5e40d352bda61106118d7c8ce01323db544fa55b9e4023cb5f9371eacfabf8b1760bc0d022b21accb5a8491b0f608d54a717ff05741294e4ed3f0dfe097b152c7fd58e6b0020d5aef03e4ec45bccd9166bb12c92683d26d729e5c94dec38f657ece7619d558030c715e346be63f696aa00982c66510d5b0970bcd911cb2ba06561782eafd4735030138378fb267b2f9d18b33592ea3a24cec62d5b58ed9ce18aa89bf974c84c414021abd38e6caf8d1050c6844c3b1ee60f3b27144a5e406bf44455f88037cfd4da43294bfb0e09e0e4b441688642d70fe3bbac53ee77b9b53ef6097c2f7ece50eecd3c0a598fb067540c2aade8b48879892b29ebbd89259b8b94c577d0b3750b0e2d07ceb9a3f96b0742867d7aa8cae4c6ca868b69433fd085b34cf5d7527738a7a02d27509c4dd4a72f98350aec863f5ad52754f8e0a8c6b1ff6c7a65fe9980397ebf27994d70ae9ece2ab3d717cf9f598e2e724ac340547286ce78b7732a3d9070a22112f5c96e095479d536bdb09b0039f6609a177416c612660ba858cb7000452664c6fc8ca2e3b900740da3b52a72c43213f5708c05dea084b6823222ec42a4d132bdbb604ea7ac5350d6b524a9d10bb6094b9d4d4bef8c6a98317bb14f7678315f21a8e030a90fa721a23fc9c73908dda934b92ccdcd2accb398fd360bc66fb125075170d38e54432ec9b01444224e5075c4bc8faa8d637e51ac8dfc6732e3ca0a20ee98039dc171a8d91fac968e795658b1423295426ede1fb21d4ba8357036aa5f73a380553fdc4793e4da04e5b5365e6359c4aef50ca22335651541a19f2038d2518c780cd18ef004881792ab3d2fca3d4c79a7e769afb83033f906f182083046b2b27c1e5f6b599f3b1975935b6fe35756b49c7a4a3258430a4ae89041af62ca838a22e1e6b0a19f75529c41672f6c5a5e06d051a8c944b583a7af61cebaa7f1c68427ec9dae4331d5d4a6be70d06b065353358c6894bd85a432c90e9e59c136b036ece01e4088b7b75b41e2e27a3d895e6204addbacd471e53312bf0bbe3b3b4bdf56a4bf390aca23e69980aa905f01d7ae74af54e39cabd15648e602674511fa3e771441664c48a0419478f57e0f5b0c0f5713dc260b3340f83873ba5a0d2d6d695b910c69f049b2a82e1ea2ab2fcc1b5b7e120c01693629bac77864d3560f5a62163e0ac539944b74890a2d60857739a60e251ea23a70e6d79b45d7eef26782f4e03b69222d13d0641d83daec9fc6b64a0151be8f0168ce24fbd10089e0621f7c6698f05c7e992da0a9729079034be8d63d75a3f041aca3e9e2ff27dd7cdb9d1fac6eadd8bd12750cff31c566567d9f62554de13fa6a97958b03ffebc7011b31184d7b1df1e32e9aad0ebea43541ddaddac340e0ee6c8fb7e3ee3995de1c4e3bdad373039f45a2b1f0b2ceef1e5f00431073771edaa6a7040549c1af19f86c70c3b89bdbac1aeef9efb7b942ccd072e1fad3161764f99e4ec763be04b9b9cf76ffbf679e1755cce3679a3f72d60f513de64e565bc68bb3a0c4f5875fb118060cb0e4925bd810e79184e9b7004eff9d6cbc7f8b6499b55c0a34108492fa42022c8373d5745d88ef0e343101d0aadfdd33096c491aaf5f8cae84aca4ba587101e1478b2aa79663ac9077a6ec0826b925b2f5e2e53c51a377aa4024d2284ce00e166c44306feb160cdbcfd61d5656828a6be2fee8888c3ef95e2efcdd554dabb4c3230f3d6272eda33a7db943ed94554ca7dd65a5d0a0c7a21834fcb6749d151be2f2d372ba617a056f6444789539c9069260a83111146fc0aff3cfec648007b378c019aa5fe170b97b6df5f3ff84595986574ff88efdf7b14220c54fa8eec161e644cce744c9a9d3d9913445de21c1f8bf0eb96a9168dff0d9f0da3d8711a76415af4b76b4edf6f151f1e995d0f98dec2d0b6f4529d6922f43cdbcd9b573b5bf45abc6b5ad54f892925a44f21559f966a001000000000000000000000000350623a9218ab5969108188f01c7c4c2668e49bf9a86d80b1de519a7928fd8caadf7cf5c914bc8b598aed0c320f91bba52abc18e106ddfa18452580071d67045a58bb855b2c496bea31a9b09a4948c2017c1b13484dfc480f79e0fc01ae64e3f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000125d2a7663c369b7ebfb78bae9fcdbf89631d718a10dea16284ede564e7cff47a8de64df79d287bc450fef9bf098cf2d9e42332dc8d2154607de7f0bcac6e0b5e1625a2827c9ca196d296654e56f45050158f773d95d02221814236bd4960ed013106ee466226a988aa89a2e491677170810b453e28ad423567fb38c19595134032b610026f04b536e88b015f35a96e4921615a5c59762b8b81793d31fb200e5d50212da5c887ff81895574505c1b34d148eba7d6e0f1f16c95f440e4ebdd154a19b0b01500eecc46d26e621b5016d396b62e9e3d7375255105f614139117555b1063301b918ab6b63f62d1f06dc00fa610f56f9f2ae18ac94f83e228ea03faa70d2f6032af583e8b42d0dccf1871b4e393a9e766efa10cbf0f77555ffe912339c8c9644022ec78fa9d86aebafc8b6f9421c431c7aa50c67efc7e6f9cd4bffb1470bbf527203032a59a735b6723d17585f1efc159a5edc3c6717ef53a52035b872622c1fc6f8032750d205d1785354dfb2a4d017b076530548b555c754640235264fa795512d81022b0a1c8947e5352c2c47866413fdc2c6da9df68da8a560bbdfd91775d490fcdbb483dffbedfb5d28a4c789836f5172ced89190637e1bb7c8a6ff677f8e7a304d32d930a10e1d80a6df13bb4a9f65cd6c409943161f1b6461a174208356f418b78bb9ead7d549cd21ca3e7e413d9e73726173e24887dcfd69936ea8b3b891f5bc3f445bee037eb2adf9481e829641e7e4d8e188b006db9376d00f1df99ae470110f9a9918b4df05a77a1ddf085d3c66ce8414403ae2ff8633c750cc259430fa74a912ecc4396f58f02b3b7a0b1925038577f29ef923f299313044bd45f8bd53992c597e678cb274ce8d1eabeea3431039e299342ad5a990f9eac5f511a5fffb67488a66378e60075e64631cf6a08fa68f9f34b2a2ba84825dda32d6cd6a3fe92779aa7674b15555533b33b415559d9efca55be92b44d08b559b41cb9fc2a085e03bbf12daaadcb285603a1cac94169a846fb71cb2b40ea6c8d998bd9949e03aa19cf584edca475dc07d3a6a5db79173bd7c7d52d8b3415cdc61ddcf2e5728b11fc6e294c04bc16e2c72ccb689140374a7fec69436db9da997b6830fda8d43bc5023bc323b7ae2819c5fb4f4bacfed9b7b758ca134280889ad3beee7bfa651b1a8dd3dc9cd34b4b73eaf03a9478ced9b348d2b99dd1e8ce1d7fa1538cbad9aa8c61de487b46386661b310074f080dd107bed9b4c677b7bef303e964811531b9289c77954f4bd07ecf3d309e2571667b3816a940cdbe1878a1901dde939bd8a8c0e6f1fb252a9230235bcbd91589349b376de24f3809fdab11123aeddf3b2ecf9859da3d7cc5db59f4fa68f6be59a3546b7a8fb90d249a9853a9e67c59e4465da2b3e3883cd9a951b6a244258ef5a1205327299106f7996c1d268d8d5916ceff33f5b8aee2b3b41953554df4267396e5c91c68ea9900d8e2c701be05e2434c8c66d20ece95e03713834c2a1d6d2223bbeaca0ab926403ab2c3336786d973d3e18a115be2c2de321be7d2a4b293459e6ac336ca3304cfcd11e53e401912fb747c52e145bf053e055e2e0be50860ff6f5c37e052d1100ec05d6cbaa111dd528838e3b50af86ae5c195f2c997c8cfa00a46e6eb8ee1c0097b44002ce6e309a10038ca29d24badfd94ada15433b447ce8c5ff11110e08fadb156329cf61a1470fd920ecafd65dccc2646431c9c12cd6c3be755deb669d66eb55ea5beac19b74ee9bce51203a84f630632316d2feb52875a04cc975c5db5a969cc64cbae9e621a89f44d004397736169a0b9fafe5dc72057dd0ea69ba4ded9e1bc209b970fb43c2f1741aedfcf0bf21f0ea7d249744c6d974374080ba1b4c9095815c453821edaf4b77ba75e37dcbb939cb1988b581c49f433185b5231ebc7c1ac83b5a768cb06106d84d8a8e99ecca4296676d3823123746c6021d81a9077246fa566aa488345f7b2c3c382dca435354178292fd6b2e2aa0faaa5d7373ab41f338bd8f18a8cfcbb7bd108a339099e1b592deae075c18e4d4619eecaec3d16f53a6e6668b9e54a5c3e071ceea3273fe8f6f55c82a2bcf275a420cf2b8530dd69358ea32059deb451a8b3a2b617954e77dc05de3099ed2d7d11eb2ce757f19307885abd9ead2b6174723b788437074aaddec0f5ec1e342dda78678addb1c193d4608553e19d2e366ba6bab6f314a70cda22d450e025faf09a0933b772091a9f0c7f756dd6c86153398423029946f9eb1703f91636d6cf85cab0a55b105ac449cec0cc23214ac87844122296b44012dcd96550276f39939b139b24b3301dd99e4d855be3e6e903ae61109248df6a7790ea27620f06755b3cfbbc0feb54e9e3afe16f7d011126c07e11ab88ffb73d2f68197d8aacb477b1f8e625a588a07", "5251635363", 0, 2118051687, 0, "a30ba7de7b669a3ec76575d3b1ffc2f21c9468a64ee1750e3fcaef2ebde44f84"], + ["030000807082c40301207ccfdc44517eb59f67da923ce209ec570f7e4ef08b7bc9ddcd53cd394a2f3d01000000086a6a65acac6352acc8ee4383028847a203000000000463636aacbcb618020000000000000000000000000000", "acac", 0, 242773124, 1537743641, "bb20450698879e86147a37155bda8c90fba5438d9964f0db306b156e9f06baca"], + ["030000807082c4030380c561b076f927c99b0d5d8614e0ef3303a5b45d6a099b56b52ff7b0b1a0239d02000000055100636a650235873eb9742246322efb7470315de96e2e2e8c63b00bfb0b1690452ed8016cac81247c020000000651ac51656552ffffffff7497451167af1c35b68c17fe1a7ccfd663e077c8076b9424670b10fe9b6da19e0300000003ac636affffffff045ad0dc00000000000265523680ac000000000004536a635318cb000400000000060000ac006a5342b22f020000000006535363520053481ee18d0000000002c0e2ee030000000000000000000000001d2a4acf7e5eb93cfbd9dca60578269365b4eb99d1330fcc1aad169ca8764404539418a20c1a6e1ebcb9cea85dff8a538308ec6f4a6ba5e2317d884b74aa07b0400a14b5b73aa9f7ffa04560474cf8d0f17fcfea5f48a33a45ec68642ed99e9100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb88505215b67e07d4d1f35c025db507632c7d8e0be22229701d0584953d2b540e170fa1646e1ed4ac81a384b15cc609be1e0be7b76d82e5f6e74b87d8ebb37b4975b4bcf5937a623517117224d6c0c801def1d121a1b9dd070ea1ae1d54548e747343c8805c3d959429949df1051ce4b8c1ad880cbce2b169ca8a3b729d0ed8032c67d89271015b7663b2f5f389f57d507257667a07454cd99c59be591f1666a5022871bb6e5987929ee58fd88cfd5d1cee99d823d91eaddc5f62354ab18230c7a90a03929e5d1002ce8308cda70c5cebab14b9494c759465417dd989697a6c5fb3a3d19a55fbdafee55ccddb8578b4f41a746a7de9b6b8862cc000c0c6db608145280227ea04edab0350863dbe8c1fc7f8018b34ca93cd30c7dab3ebb0a954cfc55c0c031e2c75bd8028799f7d7b98d09c871cecc06946889c4a1f2f4776f0d503d9a1c8032b62d51beb9143e239df4b7191a89c26a2500a90ad75119df7de98b74af891d203195988b8349335f4a9927dc05659d7971bd4f5bba5dad294cf926e10c255796b03096352a2f4ded1959fc4ec83c461e59513deda8f1b0e87ba22bf64093330e7df8947abeeb5a769cf256c23c07e7aa99217238a6b35ec6ad56943fb32d5fe2ed998c2c8dc89f54d170e97d915d7e2547988bb97b52aee47f627778c432d978e1cdb2a2bf0115f970bd7a67d0300b291a96e50b8bbb42fd9ab368cea3c04e0124ff874900ca66f88823570f5ebeda9f728b50c7c6765942ef78e229d25f462ba299d2830918c45922a817def26f1f3c67268c98058aff72f8714a2978c720d2386ed1386e7c74cd02c009e1079d5f97e23c3ad76d1b279ddec9de44e6c672e99101114db9d2d7862e3f5cd55d3af7fa9ed5cf2edfedfe74798d4922142ea1a60e0d6a8557d5fa458f57cdd65d6b108a1e7bf628602020c9ce9bc0a345b98ed5fc7c63247a057b8d705d1be8290beebc10fef63462a5d0b08d7c46d3367db3ed78e81c38b3951dc8fc9d61c8b6948e5db8af9ad9c4fb4388926fcdcb0e0d5f87ee8b3a2330b1e812a9ba8515635efc7764079cdaba1e3b61708cdde61b99ce8df7c7ddd89d743e4e8aa1c2530b5835aca6bb07f98412437ae53803d0a6bdeef7d4616020c180a5062dae4c3e026de49a409c414295c380f5d7de6d233c66864075352a95752267281e7f7c570fdc3e67e86e281ccf4dc316123210493ea75e726e11e327630f9dc62b47367c7fc5a0b5b0601bd70dea6fff61fe49535704ba2debc1671ff3ffff9fa9369b24fd12db38d39123ef6576cd246dd23d587377d0693a65b31eb6f53b95b909b32546d45a7f4971ba44d91c6298297c1ac953d8fc336ba7241b9249219139793cc49f79dbc579b5624d4c44cd9ef4d96a6c62553ef191c5257732741974ea3d02b34196a13a28e6b27cc851f959cfddda304e15b0a428c721078f484821bfd86a30ff5eac1af4e597b099720e3aa1d328876ec23519643798cf600c6d1e0e93f945743bcbc63158d339e27118726f592f3b72e39fbb1e3d49584949ef795a323945255ed1cb69fb66914724f66a51b3cd9012a6a6df436316fdc4cccf415eb64769cadaaf54d905b58a069f40300a9301d9b5c4e9e14af0632e0f6c00f49c70ecb92ca2b87b1cffeb91d572083180c699166dc5003efc4684dd01705e175140b4e69d6873b0aefcee732268474f59e04192218ad24a45830cca8f7d2260a03ce51a274426229f8fab454a10998a5ead3a0be583ca8f2b49401c9c2df4378997dbf1eab94e25d4d0c31984cca5e56edee363b1a0a29be08de240747d6a2ce83da9a31fd1731bd9950f050e6f46b93ec23d8dc8c7e5559b616f78104f2ac941c8a29cba2d9f299fa90603294ab7165920f85fd3ba398ca1410e517991a19878b4af4c11736fe6e2b3d960074428a0fd422ec47d230217f6c090a7f5fe84f742225168bacc2dd3688bc70f596f745068264dd040daeabc01e9ab7fcbdb552be5784c8ac86d56eb6d3510f838028aa06ecfefa23c729968a3514b10718a4ea4be26c01a534d7f0e67c0d96949e4fe1aca698de351cda0a3d707475cbba7266cb6b28e159171ec99f2bbf86a5ccd2e882a727340df93aa4f84a2169f15a4c7bbc49d87c571b4029a6fa404c1e7f0048b4c0eddac99ac7068192a559b6700fb121b1faf0f06d4a48f90f6e4b900d2322f3653bb9db7385956c6df9597728ce8f210c05229371cb229e4c0ec61aa14f92b74802a052220e7c023146748f2831851a8f292118ab2301af0482e100000000000000004e213603000000007964de940611fc75642454204ab1c75e2af9846c80991ab6da07fecffaf3155d88e08c096dce73bbe19363b3ebadbc4c3f8adeb3590bac20f173f7eff772d19abb8b1df8bb33fe56042b5a4fc15281801d07a47696fbfda06e4895e68df11ead00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7a44af55481a0cff19e57f2282739552fed296521b4ccc340e822c19f6502d2971f9bd1e16857d6c304cf331903caf080760b166579d4bbc48246436bd8d5352aa5c340a45726b79b3cd11043b3d53d09390244999b782289e3d7dcfe6a6967d1d7cde3e6023a520dfe7fe6e256f6fac5c614cdccbfe98ebfcb755c8161db1602025c586fd36f435c2bfd144bfc7051a92d7df5e9b792fa2c1e98424fb07e872c021b09e6531c65bf5d8c0d25740cb6b051ee3c3ca3d04521229cb0dcc0e034ab520b0897deebe790616976dec61d445469b619906ce7effcfac6fc0ff13dca07d49e541a22be0f07655ff642d99694acbbea7702f1c30f6c969bbd876c20b086cd290311f858ef12d626fead052013094323c1ea2cecd821dd4e907e1aa314586986e802297e027527ddcdb5c044cb61bc5cf9e4dd10c2b2e2984620316c3a04f5f782d00328c1ee4503541da4a568a93dfbe4721a838b14e7710b2e6c145d1a7782f4d12c032a50ef88f3a2c293ca7bc7af4b2e8043f7805ba57de3b9d03db8d38a919ee69802282874db021c1b7444a2da96c6cee38b029b9f02699cf23c9666f5f692b4ee1010d55524ef379c7a65530c748d4bc505ff4fda693a574e788227dd326ae4f99af7d10430d60ac6738f79349517bb69fb1469fa681e7f438188a8fd9b6f2587bfc644afbe74145c36801b503b14c0d1d7cf636aa09bd38f9857ecf3460e3179151a2a5aa2470b740246e2d712857bde6c83cc32d80543a178b06474ae0369a7ea0a852547ee9d145e373ee4fd21b7dfa6e50632954687c04cfdac4efd91045bc0d344a857a9ecd5d6898673d6dc97d3b0cb40d2fdf20497d9f6bbc31ff5a6b85e1a09684e6818de533fbb9037015abd3cc713b3b0ffcad00a0795d530f1c413ee635d94ddd7a184721c2827aab3fb70631bc0f670cf48d1f1393a902df4d2708b004d465f9ada6401c836261deb8df4384e08738fac81493ed6513430427038bbbe309b36c3d41c30447dd59796e0b45066fc60936602346699c9bdae4d30ebfbcfd9f8c594c41bb9d6a001e7955f52f4b6750b73fd6652e756edd594a75efa253d63ffa8ec68505e224a5c8d04adb7403b8dae0439c40ea75af7cc2e66ffaec6aeea064993b0a9f7ffe984084c8e7092ef9b9f06e97ab07ac3f4a77b86fa41372eb1f78a67a27c87f97db75597eca6a6901b2ae9374f9ab49b608c3aec94072e99e7ca34268b9adfb345f98914de2d0762b67918fd5a6dc3d79b464c12c144fcaa63c9d5d4515a825af36124c669e3a5e9b5d350544e3232d9ac6cd523e87285c702ab50fc37ccc64e5654e2d2efac9315e3d051c34f66d3667481ac800c09b475d06e8ed4bb644645c58ba5706732fd0c94d59926af4be0f68be2d401f4d6e094cd7af29c5a3581608874733883e3fd96a788c6ad7adc8d6f071ffcbce1c1ccf81ccd820f0557da956d87aba693b6c5ba37dea9a779463b20fc54392c96b2541f122e518a40005e848f155f95780a1904aa9b917774bbb96ca090cb8603109aba1603282a8696bda4d3296fc51ae8fe9fa4a027d4bf9bc5d359320b4780c72e4a656cf23d6ff47530529f127afee6cc67753ef7a62baefcd37fec6322dd5d22ff945f7a9cbbd38e1eec5c1adaf42d07026e484b2d9cd49cd911bb83d3005440af7b9e1a1c87734dfac29e1538fe3e9aee377dbff8485aef1fc7c88cbbb7da821c5c3cc2b535b3c558bbe81ea19cf27fc0076c9130ead5fd8106ee5be00365c96ff8b881b4538ae0258c21cbe4eb084b3e7b9739e1a2894e0a3884bab1eedd5d3fb954da6588c54a59c4a2f92ade0c6d8a64c1d4077fb93ddbf16de30795603c77b0fc608627ab0d0cd477f251936feefbc8d9aa62fbe7c65858fff109d69f4f910fbf97b9f242a23f57295e78928b8664c2c23cac0f976345f5c834fbe60be705a1fff7aba4193c62fd7023d6bc4bc5f036c8a0be7614b044d9b5a767b5a07e3aad88cf833a6466986705efa6ef890b2fbb79d4896a5abd29a0b70637ac5fcc6050c5953044018b623de9b00c55dd36bce8f5d178c4e54be4096d721862ff4dd4678e624dc36e6be5fae491d6ec1f77da47eb6b50f3c327314a6a55395e7949cf7631ac45b2cb9836e4c540d134a9f3ed6a0179e2e7318458ca863447a2514665d649af84727e2a4aa9367a6ad34068d176aa11636e0025aa9390891dec9a4a31b2eedc8ab99a9d468f3a50295986cc41e32d879c21468a275465b1cc8093f5a8b1af2c157c61420b8132a8ede9fdcb7b9e70b8377872ad1b625da24495988975786dacd7e4b6385df89b7d071f4537ec31da746dc2ab3038c76c39a07142a90743cb49ccb79fbba82df05e263d98eb737d1bbf623ac0f3e035e7f94cdbe4cc33afbf92b51120895cad521ff298a900c703", "5351", 1, -845608365, 1537743641, "c9931c176ef77b9ad2c709533b4c2b187a65bb6e6a1592d9378d3e7c53f6463f"], + ["030000807082c403043ffbf61c7f046d55a0ef44ff294f71499f14403b530a9ca0a622ee49759cdd3e0100000004005252652fdb2f7a891207a2f79ef243c5cd312208737d541a81e548d97198940ea3c9debb289f3c020000000600656a5253528c381d1c0c0a74a992dcef5d915fabc5039e1a1d29d623b58f190f59ab9ce7d6cf68f2bc000000000663ac51636a5148bea6a47dd61e35fe5d873243681e9dadd5dc91ac78b53be71ce2a3bf403399fafc83000300000003636351ffffffff03eb70c70400000000056552536a5289f7cf050000000001527ccd79050000000003536365000000000000000002d299e102000000000000000000000000cc259c128e83ab2e624023d64f85be68c460c03a93f67efcd49ff83d114fc9a506f4ff4b851ab9093af8ca9c1202af3e13406eadb23d131ed6544d98a276ad1cfe929ad28aefe697923ba01e13dbf08e8fe334a70c4d176271a24f511512e284000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009ae11fbb6952f576a62b26b05736e58910fa7716c05325499afe3d62d35996630c95b7435886b0583c06b4c22aa135db1d913e334f15680e294d0d6e503ca52bcb8052e48b0b22a86040dd9e98475f314653422989204c312fdffd3aa0a7273b4bb37074b23a9b3a93c421fa3cf2d637e72d71d3a903a11c50edfbbe603b5129021052c166c55a106a45fc5353c839e4d395dc6ffd4e8ad865b711df0c18060393020345c3f5217598013de69ea581c91fed0a5392cc34064b38eac28268327590070b07a759714543e17bea895c06888e5a76cb7b5093066586cfe0f8f23f7573e4e6140658b6a9e844a72cb75da494c1b98ee4e842a9af529ea81365ab6eb8710b3e0211544fce9b3076d68417c172a2bac7b3af0faa11538a269bf6eff5aae0eb0253032ffb9b38b58b6bb23855d1057f337c7f32ec2ed3dd360c95fdf828900d0e240b030c01d3c91e2e8eacdbabc3a94b555eb7553ffb52b45b873ff61b0a12322f1a04030332e3fedba358b2022ef4618df63e862f8a0e2ca7e597afdda6e07bb07e833a03182793634d26044ac69de1be5a74e86984fb20f7a120429032d438cc853be5b0708b1ae79d852b40472fc72d13d70eb4d3658e601b1956fbd44afbcff773256ae61c812cc3b9e05ba2d25f5db0ef62bd019944da87909987b9924b3a5ca44a1412b30495d6bdd106ac63361293e1005953f75c5d094b9f907ce6a94535a9b5a895ae0f0768031f5cfca6b9d7837d05073f6b474912ce7584f9593f2874154d9e1454e4b654f9d2f565f5dd6fca63aeac9f904608294e55175ca2c75ac2859a42b1d84a29dde727325907a9faf8f69ca7970e19a9ac062611b0974cb8c291d184bad7e7ab981e19e4abf8598f6a19b36cc602102f951596ac39b34be0018b6cfb0a31fda38634e6ea31557b096662e0d7d170e843acd48db1503fcd6fcc64a8f48ae3a2bc7b509ea1d3cacb2e217b527c96af9421d5e3491497481144f196307b6fc2061d6364b641e8a09a878cb52b953736078883718751f06b2a8493e119f75e720230821dda70b19c9d8208cc298cf736ed5c98760064ca6b64eb2453901f8581169023a1ff396e8a6a049d36e0467505a3e2134f1d9507b8991ece65a7014c3482f83ad1214efcdf37d7040357bfe6c5883aa4ab7760e6dec827e54ef91471826cf78ae594a2da52c3049a6d1dfa53cf5106463f41ebd651449eb8e3df359ad87f9265b3009e6a354320108e4e86150678961be45388ee47bf0ad5ecee63a498fba1a1b0e9f2ca7c1cd5593d85a14576dec13df9f705b3b88158cfac56762ff82434dfc041e6f2920da766f54e6833daab56ea13880f534b418c13b97b62056f3ea94f1fb8cd902cfd6bc77cf1937e96da3d9890ef62a2879d42c606e7a092eb57712d27fa9d0b192226651049d2be1c1368a70acbcb61a41a1f93e0d6e9f644c1e27984ffb1f6f0b42e656d428a5adfef0146819d14abfde0ae89f03e9b649e170c462199e6898cb118d7e56620d1dfc3235ddb6c01f0008e6b875678f68d82913763e3090d4d92d92bcefb4d001aabab80e047677bee45332b7a3eaa68f1551e0ca022b95b059cef07b9d4d462b5767444d00c096d096f4b947ca2be60562483fcf5846bde864ffce009339815a4eef07310b0f9666e232fe2dc4d0fefd85a34ebed00bf51f6260b3984709c7ba1f8fefe5706deb87b846ad56095e7f86544ce4dc57682bdc7b8277352dfafdde27b277708e82d44b452a96e8dc60650ad71a1c59b5aa664a02d9affd8b99cb082d404c6637b45a13dc16b9800726ae2bb424517dd849d5cb49086c8c6c56149d2c0e5e2ef11279fd7cf030a67ba087240a9ecbfb3e375ac3df682e18db70e4783658a70d27775443b7ec15ec8e4c19a1ac7407251132b002578d6c1d37729935e2101a0522b5effe49cc96bde875b64c0b9bd16fefc91095e03569ead4f089799e930db503a37997b44a5087f446448b2cd9304293650ec78a301154d6d2bfd222136dcb3d9e2936cf1612a114550ca333d3baeb5680d3b9be5d119ed4912cb9f1e2b85eeaba646c076076865a705e1d10f5cb782fa3caa9085d8c6654d2bc731a4dbabf5822249972a32cb009b8419cd21930b17fb0a461e79e9e28992598f637bdc5c36d7836b40539587416d1b9bfa22b7bfb7060c2d2ae1d607e45f2a2bf3608273fd6946b16b9af3fc93a3c79237c540852bafe6d6f0ff07c88e3849d2c01d0c78208ae7eab46eacdbd1eabf55c4b51eb69d242a79db1ce12f4d6eb929f659ba5c03010000000000000000000000000c41c2a3e88890078613bedbab34b4c35d389d48828b8fbf962ac0329c4466bc1117b257b7835f46b8d74bbc6ce5a663036a22041a0e99abb84a6aaf213c5367b1a553f0f9fd07cfea62d43b02a96a8cb45baabf6fb8a175370e8f61c1923f0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e071edafc72b583b3e3c13ab412992df59b1cae1863b0120edf6a1d5c11260b8153dc790721463b6a6dbbf64a4f81ee3d42d3cf9748034f837f0d5de23a089420cde7795fe06fab96124f8ed81ed18c01391d1a793884989522b18fdae0e005015c6fc01e2a05f70c6a3f6668ca7f1f542ef653a6667b79bb2c3de09744b90a2032075387f02b409f43911695d6407c2fd02599ea3356f33db2a1452a218cc38410301652874e846c20b4c923b73bf589c5943bfd7ba2564069b9c16696f343ffa020a055fef7d2a387ffceae278820fef5a97a7fa8138349f03f87182a49a59899388f497629a1add9555f5e20cb8463f1b87efde100670283f13fdb6f74abbc93317022331917b5ac6b6983dbd6a881aefb11e596983f504ebc159d8e0ae2bf7ef5adf030a04b3f764a5cbbff3da1f52304074050104fb3d7a0ffc3d1024d346ad97d80602135d46593ab0ad13fb0bf9f30d910069a5bcf0863bc4b5213743f715ff1ee762022ca93f5e7a7b0a560f5592980b67599037be723503fb32220aa9ee32105f25050313c0ad39a6efd5da68b5eca945eee2430de1c753cc3020b1fdfecc652a32be3c2264dd9e78d4675ec7b80019e91e52c5022bd743f09cb086fb68a27d2f7b394d5c3bd600f0f6d90a91cff565f2b31d66141eadba69544bc04e1e841a9eeb7a4fc01683dc7cb230047f218d7e70db90718f0ea76ca35a483d295f84cea70c937436286711abbbc8178698f36b361c9ea988cae88e3492f456c66da62210355857e7bd78fe7bf74d2c3e575ff6c639975e2042bb6e24cb38a104528039c7ddf69ffa48839545a69f9e02737d6557b659f0949ed3a99b3a88f88f52b9e20e8ae7b1509aee44b189ce0d3866c3718a89f71ea6f43e19f8d06782ee4c05dddadaf82d6972e8b29b892c808aa374d016253bd3edf1a93740ea3aa9b955b9d072c3f5f53551988e31eb0a9275f4cc8b31b3cdff713fe01a3d6baf355a8970e945459ced5248ff1da2d0340ae6f694399fd6f358cba713e74ba5401e7820165bf67037f54a66e6768d0ce8dba2189421ea04dc9b1d1b2246d45b0e8465d73bff0777fa851bdcbef536e42dc644e3f141b0cf6201ccdd39681e4c3a1fca9ab6dbddd95b58cc4b04dcebdeaa342717ef677e422de92619a163cfaa8bb332e28ce4b746f58d4046d2b94023073c48c2bc7e5481c9a83bf68464200d6c1d3b8adc403a49183d35bff351461febde6f844cbbecfe225a56c864e6275c63f0b7b15e4b33aeb08c03302d465fb86ebb674789624210eecf606a24ae50a4d037c1a73860a048d7ffb352dd00f3b3c459c70fefe347413830a3e028b9e7d9eadbd89e26edda1c78a004f0df6fc56317933316e3343a77a02b2524bac21acd57a4fb731e20baab5ee3663460af57f626071ffcc12a66bdfe70b9004a490a80bd8c93308dfbc2fc1a2a48c05c470c21d8569ec0380a9cae043bbb3f2d6a43fd3b8c8695c35b003cd3f75ac25c62bef6574435c0180a47870a1b1823c8525942f5192221d9118b8b837fc7013bd099dd9cd91e258753cc2086a373b745537427b00115fbb51fcab09a2d97e46259a3deaf09447cf19f7c840386f40c559e82b57e8ddf217d92b6a27b7b083b635464f0f69b87643561b83082de8cfcb9f82d6f2da7d551bb01af03b1d3bd33bce0cc20de7229d9dfe327f3923b127baab2a6a8acb2a213442ef48f4042f16904457910b54e227100000d46738ac06694491edd0549dc7939a116f97d861b0b7b7190a2b5ed039bd253ed3921d93f242047584fccbad54c07c2005bfab6b85ee33841a2e4d840caec72450f3121b0814fc9930ab48a0714f86471e0b4fa1b18f9c4254551f515812d4d60ff9da90c5aad123df7b7aaa6d81268394bd15d37ed718131f7f68af2895227c64422e3807653f7368f060cf02904e33d2c1ec0c335bdb3874bc5fd8b56a0b63963a11de5a54a108ad2516030325a6a68e025314c37385feedd17b424d4f489281b0614a58f0ffd95a3dc656905db1b6aea9018151478ef75a04a44ce77b13af9a0640a07b27e33b38a4ce227cd82b6d31febcaa166711bb38d76ce81ca59e0012933cbe72c3bf477be0e36d783fa41d3614a94ae070cf9f2a009395f1dcbd2385706e0f9f49993eecc0596b52f70a76f2e9f412a1f929417e50a63197e9b7b43f72546eb5c47e040cd969b98dcd0c5b8aca0e38270185883390478bd3a9ffa5496691b6ea73c1367245cb0f3c946caabc5f3f519c17048829aaa10249e6f8974fca56805365442dcabe75315a7275f7180c70032f94a90536279739186b36333c839e87bd36a36d27be38a35af65992a0aaefc336d4a14a5fd0f74373fe7682d342b63d8a42d30f07913117b545273a4f11398e0bdffdd768111cdd8b6bcb63c0dc8754407", "63", 1, -537474924, 0, "4d9cbeccbe61f6cd29609d37327f7855a4f7d0afe48db438bc5e8c7e97b6ef1f"], + ["5604b67f01963e10e1aa94d4f83afedc9bc19e49b591f387cfebb25dbdab42c076d3179665030000000353acac0c5203be03aa2fb301000000000663526a6a6351ff90ef000000000005515265006a27089a0100000000066a0065ac53000000000000", "5252006a65", 0, 1630946853, 1537743641, "438cc62a94d6df1a707d25d2b925bc37aee5a8ea2e97dd6a836b8c5bfe4b7fb0"], + ["110eb45b0214e1632a8526b3e71905c5174225e94edd0e11b555ef39d4a7683dd6e85908ff0100000001524c310f209acdb29aa49c04c6160984757c900a752b4618bb4931164c8ab900b2ffb6e3d100000000015306d7385e04a8bced03000000000663516a5365516b804904000000000652636a53ac6321bba001000000000553536a526a388be103000000000068305fe300", "53", 0, -46500627, 0, "b64b4cace09576e00cf0a271388c076e77c22320b44d933484ffe5a32ca6a39e"], + ["030000807082c4030216d394586799fe53412f565ba2d669779cd901e38313f4d77559ee70e5bdb4450000000006ac6a52526a5107ccd4ba666a1a777d47e8fecffb904760b63f350d04a3ee73bee3e419fe9b7c7cb8d4940100000001ac35fb0d7902d2186f00000000000451acac002242e202000000000963515200636565516500000000a015ff32010000000000000000e9aaf30500000000ef7f3602d0510e09be29b32afcac981b8336bc2bcc6a7dda89ab8142b28de2637a1b5f7bae7bb36a3821e6694506cfd0f0d027b93e62995a91e7506c4eca50be2caa647581683d17373dff173619063655b65d741ffb44a4ee6ba83bef3a645d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b59889b130c30173b2c26f999f868ed1abfed77ea8c6f5372d7e880edf1dcf25cc610456e6a979b805ebe2857c74c63d9612dc92c64ad503e773c44f2dd92530da046648797a947f6ea94042fbdefe7a070530b7c2fa4e43d5f06b54338e12695802d239f856e44f36cdd908404cccd7aea293b19791d31e11990055aba232f021f0ed27637193eb4535e39e64d4875b3fedec7882e2a6d54d8c30aa0477c9bfe02107f6f84506f42d0f9acef5e5f375078128589ae1ae839dac8c39762d27059890a00ca7424f97a2b347bc4b2b156856a102be439f917ff6b5fa6fb2f8219f035ea39ab61188a9ab6268ab5fdb4a08cebbe525cb953e2d039367df3f61c955a2c1a032a4ad98e52805d25e11d285fa80a492a11bb95320fab092df2936976d13350250215766318c0ebf040b6402772360ce1034f61af259c82f85d9dba579f3eb8bd9f0229a7597b90f6141e80a977df4cc9f708018e4a93ad04643fc6b9bf38d043e9b003286229bbdc2dee7815dc57d5f77a408255482de05bf617199af25261bb9260b8022c0004448b36b5d9b794304d1a71e1480fe02f43b54357f21baa704fb8769ecc40282653e702e55d4167cb64b56dcca9f046b6b73f33449567ef0e56bafd76dc7d5e874a141158ed25e847c54b1937f1fe78acb3e9a15164ac46615080aa93c1bc938835b98fb1b842c34be1fdb9564c17a12d0635356de221aea0e12334128a2ee8bb24412ce94be144229be0fc3c2c03823b1d84dc3279dacd2e5db725fafb7eeb1399bf19b550a49fad6a49b105f58577a18fe3eb5c7973d6a0c87e6048d13680e9b51fa85715b36d6bdd0b845038d9fdd689dcf05c263350b3a468497f7fd3fb2bf890ea35f56bb5ce6a1d9d95a24852b4a2aa15b623aa5b166a643cf5256e6eb744c6d7e19b0e4e5a9477694243139056518f4b337c76a20bd5ea62c4450ef38d5820664bed0b601429cfc56815df97e71158c3ca8e51f163df33f988781e5afac0b44130c894ab255b6d5a223fa28c05efc463336a9cfdba1b6b4c16130ae5d26c9bac78aa0dd1287677005c3162ae1c92f1344aac419409a8f280915dc720a805ee5962425886a6b89cd4ef400bace6efd0bdbc5e910e068d0e8ad8363fc48f15fc0e68c47ef261d6a90c8bc8d30adee61712c362e92cec0175212fdf8bc7e8f210ae527a750ea665251425b57f04e6fbe693abc8d709d283505eba707ae7661265b418a06d7dd91f069ee5d2827d7165f9ad158472aa47b5664ff3d238ca6b16dd519df7460a640af892aea0a5f5d1928cf30f7de445559238fb6728059a94b109a1e38f8ec026373c515d8e7fe92fcc5bb51fa3aae7adf361f3b97b48859fadfc0d9197d17a99308d1128161a7247540c8a80fd49e3b587355cfc7ee5a87756468e0590a2d181bc704d76e7b913457b3a46067db75497f3964e368fb24cc4fad7bc422519f7181f43c1b93104e4010dc2ddc2367fe19c2b4a480ad3ce79834cd2b4e456b49fa56fe4610755830b35db04fb90c22480e66908f791bd44fc5c89e3adbad51e6a527074a87ab50ba0653eede9b01c92bf8be30ee3970db714763f4f7bd54250f284796069824db51b21330122636429b17693e917deb0097a683889986a274915e75b16c395e55fe0d5161e64420a1cbb11bdb4b80fd72c5354b4a72c3b960acacd6635ebf557f3c85d37ed88216391dc6c8db6c038a27c223ed92518d6c1b9d7db944af989050e3305b7c12e4e0285d0bf5fba2b35f782c2e2958cbd0c6ced57b3142941aa965c9bc4ab402c41b5ca2dceb144d5c7b007355e19d5fad606086a461232f94a112471c9ff1b0e72519160dc3ff5c4524e40b5a41e633fed9a4db945b1b56895d28dc4380385e128db170f2e27afe4c4e8ec319b9752c84eae1520c1ac34ffa196425d40d69b7dd519c7945120ec12fac7d2d014bd7d45f1c64813b40f254038b27b655f49f39fa3721910c630e9be40c7858f3cdb1a204ad9475d0e560f5f60a2d8a9b9245c31a8bb61527765ed294cc643a01e4f0fe66271411cde1461683cae2f11ef2bd178726871f5ec841c38d87d95a0b32081107d6c6a989d3bf01641f9f650834f41f6e4d1fe29e846e897094d3bcd2f8b053501af8ea886b46e6dfd5a10c0f83b3e3c88a7e2383d95dca6eff11e811ad5a32488e5555c1706e9a86d5bb77f9e1c45da465d529d4562160f9ba246672c3e1f17a13d6a17129f165e2b16b7d5b82f7f4a0bc3703bcf4fe961ab638086949d35f75621050f8c2a06274c070c12c6c428e1232c5d8f00a9925f390f76829f0a473ed6760c52a933842a21608b82e4688c62544424e3503b3ad1f0708b83049e2f26c490924a1d123f412a333e2c1c64a09d045e654400a69479a1266741be5c58f9017015a8d6a098fc7e01f008", "65636a5253ac655251", 0, 1869852744, 1537743641, "3e62909079e494eb875c3e99804abf4427aef6bacbd5fe9b46cea5774affd3a9"], + ["030000807082c403026003076c9166e07cda969dcdefdb683448b4a2a6addadc012bc01fd746a58af0000000000952ac63ac636a51526affffffff24825a1a5e2a9ad86e545a09ac6925a47515ed4e9a566923c798babb103d9329030000000152c04572860161067001000000000363536300000000bfd9378b03a392e201000000000000000000000000973fac2a0ddced06115d04dc4766ad4f14de5b8e1f7dba522ced81b0bec94c20fc74f1ee0044ecd0562d5ab2066791981666bc7abad7d4e21ef24e9bca26bd14562a7bff2586d21542375a7a325e3692947ab5b0f47e8e0436d62fa04724eb0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000479536e59e6023f53f6a4c0e23becbc0273d3dafd6a13b67c05782bad08ebaee2272cd33b08a616bd3f22acc1f8be6060883b58825166cc92cd8176a26f397bb17dc8d23e32db6903c3bc06d9513df339bcf6243a84322af2ca215df39ef2d5a5fddf9d7dc292322da0c8754a94d38687040e0e551df7e75a3628e798535873002087d000f03d9e0a13ddc01f5821cffc013dfbdb9a69ad49aaf49b2b00328978803222fa22d0f2908184342644602dbb2d062fdd1e0c736373407987a2f8517ceb70a041cac230f4f6a330c4af3b576b32ebbf072a6b533e3bf42223d3e4050f6beacfd3ed96aaa4469a9a571e85b8c5430ee63318a02e638da40abce1157a966ff0a031f0154f694d9cb750feedf8aa37ef7b98f397dc471348126ac75b5e4d60ac3b60210451599142db3eab9410ffc6aa486cd510f74821b3be7d5c45b70b89abda2bb0223b319d71c28f98e3374eb4d8297199b049a10ad223eedbcbe8d0c86e17cb5fc021beac4b14b5fdf4a5d5cca29bdcf21fb4dd9b47dab2bb55d7129a76de264fc4702029168d24c54fde9670f4b76d9fae00423aa64ad87d38bffc00b7c90abdc98c1c71d0d1270d336f177bb4afcfe03f2ab71983ba7c8416b19af5a4cb0a497d8003888406149433cc9940873135dd4153b6a9560e3523593bcb8c0b698a9a88664db1aab844b022bd307cc0d33c1c6f1c3fbb63136cd5efc7cc799cb1bd552a21a0cd401f8ff562f73b7821a517789f11af6b66197415054e525feff5e46b554514c46073461df7e192fb48f416d61afade1cdc97dddb74f4a7ce73d457a2398faddec68e957766845b78028bb5d329336ace1ac4d07b5b22e9d1a506cfe424c80eb5accd18bc1c4172cb203fb456a9f46c857feda272e2377867174b8fcd1429852d26f4822859e7601d45cf966e9e98b5ab93a7e87897e04816184c44fbab97d4d8bd283eae39f03fbc862ff4593e8da5b97dece87ccbc3c247c73bbea74c5e6fe19dc5a65191c61036c4aff9b4f6cd99f76554d4542f8d6c38a154cc0e8ece1fe309b5f8451e820d14a845de0d0644fa425212be4012d70bdb1117019f03ad7974afa71e872d7be36bb81c39ef0763e773a70ae3df0a9b1a74dce97a92594173fb07e79848a930a5bffa333c8a7100313353c71a3e2023b6e3569090710decdbaa5b7508985790f1e70357566ead6379ac270c003609c057a00892320f24cee38d90db246e4d9461289b1d0e58dbccc87c1be70ba70158de8769d8539dea00ba26b3692f1717ff2dc99f65955288d7e01570586533f6a915686af74e6c730df8fc98ba27b257654bed1c9fda660349e4eda1cb6d11800b793ea5a898220a5c4c02e5ae78d154363e1afd357c5991ad3a4dd665eae5d9cb223613b7c9ebfbf640f249ec7f78b0f1348f1c931c50d820aa4ba04960ae076d7926071985e447b67e9c6d29c95dc39df4df1acb23e56f59cc4eeea26d7449e802a36ec5d0f9fcfdf2e49754e110ab84f6cc0f292c11f38d4594dd63f6356e84ca0397fba74c4af1464ad6ef26dc1467e869e9f5d42a016f420d5219cc840a692985bb04e472bad65bdaceeffdccb453f6022a354fa3c5c1a0922f321f7cc0fbf9a7eff1d2ec566ad9393c7f144141b90b6208b1dd214a677a222cc2b3a3624f4abddee1df256f619e5083d282dd84ab41cbd0998d84b1d4b3e561a100b1cb32b054f3aa702ee50be5401e98392bb3b7114b195a04cbadacc123aa8b5295c59b7bc886531410d6853f10827192d07ab1d672611b56fb9353ff3803491d3eec166db5df1deb4f245526de9967379f3d856eaba556924f4b0ba9fb6d0b86097828f166d8a7448bd260a9aca706af00e5ecbf449a09763048fcf0be0a114e646d92a2632fc7a5bfa3c6714a274657cf4e1f34b108bf56083a0cfec188462f26ffbeffad6110ef56dc82cd963a6cfce1f4637ef621357257036b0b802f8859cb56ad53a8cc5643e7d58b3dfd05a80540db61700d5941d2658f754e61966644b3a85a64b7c8a937ff1018ec6e8433226cea62075d73a3b22224734a51c6356806f081358511da3e2edcae00b960a85ac02cd7adf2b94fed588cf342a787f9b8b488620293315542b3c628981eef749ebd9a301deb52b4e34beb35b878aa1748fa7fd186a33829475bfceda2a94c5435e0971b69e68035c01a68d3cbccb367fad7cd757cade529dfbc3aa7976f26ddbe84e6ebaf46a9bfa55cb1de082792720b063f00e038fba534e0fecf87cc841a0919335f6a19d41bd71af331934d70000000000000000ce12b30200000000478cdec4f39dcc18c296aba2626232c95db672e2498942333589b606ef3f3caf6147364cd5c60f18b48405366e23287eb8e4c4456dc248b00e6837196ad504fc7fe1f747278fd3df2c3ad631495b3ee5889b062954a7b11317f9b3aa5568dc030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d9b7a077a931390d4c48b1c19d30d28637c0a5e749d6edbbfcb433ff406f54a8bc79ba747212d3df68456a3347d6af12f41eca521a54e2506e170046f745de724ee3681a735d8820944d0a6a9e46ee9d0b3fb0b9e8c3356f9857196597bde95b3db518360b9645ea0d7eb1a254bec164d7a531ba362a3617af30721822b2280220acf2e3f360beffbedd966d6acfeb04a845d7f0c07da5c4125528fb119113e6032b30c2e36fbc6ddec0970bf2f0de00cfb71beed548695d47f0c652ce647ea4d70a01fa4371e332c3ffad4db86fbe3caad9792b17740cc5f915b4bb38a579b472a9f3a8b8adc7bb46d33ecdf23f6c9f6c82a46fddd7cc2437138717508bfb716441020d3e1420ee22d421e8cf1063aea7e911b20c6fe33b2c54673496144c0ed43299020cd3d197419ac501e94fa26735e467b301b1ef0c5aba360c5dc5e2abdc6c0952032378abb2540369c7e190264d94c32574075177f4563e5fc3b9c31d77a5d4ad35020c5f70f121883854754f5e6220cc90cf35fc6c99d822e840ba6fdf9fc9663f3d022d16581fc6d683f2ef33d873eaa830e2a5007bdbbdc78cf108293d4728f08f0b1f9c79c35074040e4fca01502cd8a8b63c4a2f5d02057551cdcbf2504caeb4fe790a8b28016b688fef028d62e4150e729fb33cd6a854cbac4d8d7cec8cf12d42b62cc3de0a6b17be5285c2737c804936a862f2fa114b2f568f22be88016ffa526efa3ccc271098bc736616bababca52146d385bbb8ae2113291803dc793a84147bfed73a3cdaca94ef77e935cd0a5bbbcb2ffb8dc822f1fcb8e2bb1ff7c1d2dda5776a89246cb204a4020c29a78268ce2e7ce7468d55c4d2398df99c7cc8ebe84d54ade88f4ea7009ad4c4e7c421185a5f84a1210146f1d0fc056aab88e1303717702e2fdf1135ff8c683563dcdd552471de1ae06a28456caf0acfb8721e59f3678282d5ca39d561914b1e078656464828f040b046dbdbb550f67a03a975e2034e455f47609083889fd0e7b144cbdd0431479566aba7fa7533a8b48ff610827f98199071b3223a2d176b44d4ef38b7451362bda80817abcf53535142b935d7d3b541f7668a64360de4dac66109e7ae510fdb1abbf2d8c57bcd729f8d33e4d947a8ff35a8108c9e0d74da806b842cdf00369c5f038ccadcebe5269c77b962d8f5a4797f20537eee2fcae397eb38e4a7fd964adb80d31faa151e074778b0ad29826c1cc5769346d1191b8bda02403d4a1bd4ae950a0c638d80ea88f5bf0ae239ba35bc29b431456790450b29031adb5460d7183d1e5f5af9cf1da4040e31c1144482180e411b84fa1061a3a31253f64717bd391ef542478ce7c1c6f69cd13b11611ba37f984a7a04c7b2f1f8a961f1c94b72161671376d7a3446f9de3b4a3b1e3c9b615601fd4d95b502a3c37bafa4ccae1b01f46c688464f644d074832f03f5b20d853e8357e68a707f8b8119db316d458c37ed3cdbff6e974d643f20fe5c04b9941f1fb16af48964f32edab83c1b2c4e6f0cd5335db7f2ed052b7ae6e864b2b9ecb69a2b5257ad388fdf50b338baa84fe0737bac9c637f1cde4c4994d3ac73f44190ae98637a3f1324e4114b164a7f5696c2fbe804622efbb84819d16f88c936a62ca85818afaddd7b465a316914425e40cb130895900bd7f025fc448becac2c7d15ead3606d08e3c9ab2956426d505265f1b11e04ce5ffe70a850576e06d54a65ff0dc9943f3b6ae93e10f7d349aa177c7b7480b0a8668f6678f07507e7ad61b2342e94f348622b645a43d4552d8272f910965fcffc9fbb820ef5b68464c1cb3c055b46a0430883d3263b02264409f154ad594198ed8c730077a63ab7f3a4135ca50bca6d2dd8fcab893f0055856c0a54333ac924d959b0ac97b5a954bfc39b91757199676be83f650e5210f88137e6552e937b7bed90e734b43a69a0cffc4d1675f379ae4828dccc5951853d059ea170c0f9aae24da73d57c8ce2e9159e553e69345b71c4e6a7113e1e640dca43cbf850c6ad079f2fff7362630ec294de0357547728b195b09fb7f482e8a6a6789510afe2dcaacc44f5476cf06f6242d7ce32283b9728ba5074815aa67ae11b85cb645dfb28bb58f479a083794786880a18e0041d070947a65cc0b523ac7564d7954fda9c0237f903e51e92b7a2d7f8e8c7c0c152aab49c970a65b1afeadf64992e84f16cdf979055d4bb64b5ca2f43f1da3c3130fbef4d8b072901fcc9524f6e7eb294116b74fd0e7fbcb307c97643c5b5d4b8400b5d6beb09fcdb3dd08faae0fd5f3be000000000000000028324e0100000000a024fc0b36713ab82554bcbf1c84d9607a951c4bd542d24226e2e07f720db34b3a0307e778847cfbb8f0d1119695a14553ead5f8a8d9a6c8c6397f1860652cea29254e9044cd20bd9b0b4bf24571603d2c416cbfe1005f38170ec6eef74b5fd1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003abae0f7736200f36b576c70890c329d687a8e78df451690db9319b58c844ebe6022e1b05bd89b909da0c43d00f6a87647420a4b84049290508b005d8348e24cac9ad91e6fe9e3ff8c63d65515895c038e758552bfcf7ec1aa1aa3b62f10e577fbac8d6c1d0c18c198d93bda5b6ede248b68fad32ef398ba2dba867e805cdf07030a3e95ee372bcd1ae86477a35a80ea62d0a73b2d062aa3d1780976c4c674b83402041b3bd2287416336eeefbdec979c82799b824f19efdd77793a2727822c905300b0423164b0b685d00ec779ef4d4cd3744a5c6afe57f5fb75f0abe6f8d0279ee7519a862bbc2cd751eebcefc4878280f10b241fbddddabf956745f9c4d9f44fdb002280a94e18020ee3e243707e6856e9417a56287c9858bea90a825f6c0fd2c6ff7020f8f85387291b7864879e6094ac64bf4df282975b81a61f16cd6e837813194230224ffbb45a8d3356528df66510ff96341212afdc1f26df445f79ced06276a602403075b085dc77d99a5fd1feeb17668e4d2c67cdfa87206fd6bc2de1c22a8670ac6020f546759363da912cf585964b4a1079aee23c4a58d2db35154cf3cb779ed667a617b6484a58113127cb5cc625f2fb163799a7ab40765ef8440fa689bd19b4a606d2047cd5705b922b77a26aa32e4fd10b381b5d36bd11d9545bd991bd6635c3a3678f80c9154a5e9082748aa0f54b83185dc5ff3aa8176ce3c8f30f5ad691397d48777162cd9847ab62e7ff2085dac59082f9271f8374246aebd2ba8ac2349a0e12258aa8e9e7cdf8a03174d60a1ce4869af385f7f6321580747dc6d8ec7be4cde3f77e15d62ecf94e365b2e7b910deae5b5a9d6eb07d7d856324bd20c5b9ae27d2d783534a04765688546b9b4ba05ab3342f0007f9e88cdaa23cc1b7ecbdb88c471c4106cb05bef2f48e47329a82d728133a51599f4c306edf15291ba17710b908116eb033cd7655a9511a3f1b529dd01776321496d00f25b6e6d8e76ddfa2eb2c50f8525984683c3b6cc7b9d4d07c46d6882d25ce60607264a490d33027a3a8739531dc0af36601c13fcbe56ca246ef1dbf086dd4bb17ea87aa6fe1c6237a0642cea422393ccc4792f19d70ffada1b380a9bbf42c56461f7902a502e577caf1a8ecca1f2eecce1fff1e48c3e4e9958606e39a5448ad1124f210af3dabadb0b260830e5962857ae0c05cf67f0d6c0b972fd69e28cd79014032c50454fa4320153a2486c8360c15ebba67687f7220ce73b640fa9d3aa9d2ed40a04ebe5bcaf55a64a7be103c50a7bf6b638a027d446a0b9e7f9a96ebefcf2f4d33a2e8e3783d417ea4a95ff79eafc78cafc5776126803eb8c3d2d158d37f768100db7e8712707cf12ecd2a8808bb1dc857e3991c9961126cae9056493b3bc246306399e7b36a56e6f9eab30a5c93ffdf88d0b0002e2cef6d35c17a85b8f9c0209f8c0f2d25e7d07262228feeae99e193a9c27eb012889fd81f9b3ef36110cfb121fe8bd6e6ff69c5e3a348c2e44b03d1d97b14f2ed7cd5559ce9289e68d90b118748eeb4a43e2dbc1976f0110c3fc2f16b600017d708ba8f53cb6274112fc1d5b91034e4934c6d90e028e6d2f56f79886e83bde14a63a83cae7d3aed98e9fa5453963f441b19ebc280095b0cb7c9620a15f74f6ee75e0dc19449ada25b273212d87f80a7432a07adb659d99ea6927bc0c112f93a831d7c9a17cb4eb02c5fdbaa700d7fbb18c28edd5f571895efa07da151f875d4d696f53776ed9e7635990a6256024c6c26b4bbf039e850aadf2e957996aff04b9235e5ea331ae01357dfa4c2728ee3a3560d64643bac2697fa468c5053b864378ff75ae3169ad35e90f6ff1489aba2cd15de2908380f583b96f522a4ca9ff84b97451be5654ebb245c2bf2c50d9726fe62f35d1ce36860aec2d125db20cec676055a1948b0b8888af9579f480c3858b4453eec1719113a7238621487d4f0c4dfe4025be9e370be79789e7c492613ff22f53eba2678d6483b404ee98a48c6ff7d88df44ece9044e377faa7ce1109113235fcc71b4b7d1a72ef5860eb5178b8efb637c1f7fe38d781681811acbfb3a9fb300b60b5412c0d965f550fb809d59c4e9c8121d78727d6cb08d5b6f0ea43f25b15d5056464e0fdd41524efb6448c8b95b6241642329e6c9c70fb8f5804cff1348c7949e83b0a3057b01bd6c9de4b86067e916d4019388aed6c60817cd795ee16124c0de9939e66b86d750aa4f4fd074c471a2c8f08a7451ae5ea3311b567a3a609525ebce409621242175d1b05564f47254d60a02f998154c8411a57904ac687863b50530e82173211b407fe0753b7db1768b462f90ef5d827ec68ebc800c97ee1637361fd3921b19cbf01386fedb2978caed9fcc4e116c2d37282bc297e0ff115ef94bda76a48e9b346c9302f80a7cd6a3274120e", "6a00ac6a", 1, -1411250569, 0, "9538506af9d91b067afb99da7f8823da1c579575b0ad97341b62067a724a1251"], + ["030000807082c4030136985f956a3c7df012c58d703fcd7e94c29bba802df5aac5043cad93f4e37941020000000165ffffffff016732e201000000000000000000e4bc5e56030000000000000000fc75fd000000000079d407e6cbcd16148fa4743281a27314f9cf9f99e2ad74a579aa931cad7c112042a91ed55fd170bef3a83409ea6e513c84298285cefd202d5c3b9cfc1a9b1c2d3976e0372bb472f8f784e990bec574d7c2fa03995c848a78da7267e2ca0937e500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d34e5e196cf531e5db97ba72292555216879aae08c57245ab4cdff8072d168d01839c0b4c229920d44a68e5958759d1cf8ed7d67244f8c0f69dd18a1fe79c65f4424f6df67cf162f1802d3911577f6ce85f7cf752d1141da9cf43e087c4dc988c0a269b6c11732ca656b3407b82c0de0eed72bf33f5dc80024524af519e0afaa023056c0e252d6c8e3856dce442e4b458063647fe5c9682b4cbd4f4439fabf310e021d45d03530f8ecaf34d1d9401ef516a0c53a6f477c1b611b8cd678a37de54acc0b001d95339917870b4e4199c3238aa80bd0803346894cc1e41a84ed58d6f18343e8105e445b3e22154dd66f2ee8e3136c5e745c6872c280007c020f1d97ba998c0226f2e1c7db19b330ba94a6c975ef54418a0b3e5b0a58d2eab4b0b0a3a57e6d2e021af22d0ad44fc11b222a33f78cc153052a1ac2aaf0e2bac5a05dd327e9c04ce50304ad0ed8e2056afc24287a7a5bef806e6cb50f27e4f4405da6e0d1548a4763ce02222b88cf670b44bd073da6d0cddab7b16cefb2a2425b10ecd7d140361143fed0020816d2afd7875bdf1492bf8a41e18f8bf3c4a993ebc5223c66f067c197e04a71d9fb958c40a4fc704357465c7cb0a03cbf4ca2681fa0c127b1154b630d2e9ba13568aee789182899acc82f1363aa1a995e55e8b50ea1ff5b50f0081a750b410055899e2dd7a188f3b535e47aed4b5e1e964c4807c1bf9ab545aff6785a7d7758159db6781b3995a9e940193538e1b6734d276799bd752dda37a748548d9072aea50e8c8e948d65e2a41dc8a2761bfb54a37b5f2b25b8044177ac462764ebed1056b757866ed6903cb4389ad6d4a0193275b96c63d042d9880e835ac7c269975e550ce540c98c3ab95ac91c479d2ad9d27582ab56d3e973fcad6d785c1edd0c6480a98e6f1f40f03f2edfaabe83c51a03e073a301e6e5d7730e3aff4e88c7aa7128a1d6b0aaef82b80867c9a7a293a7c9b9513960db730123a782aa916dee1ecb31ab7456f9640c4d75fa5636fdab5a53a1551f1d5d7e1af43c0473bd6ccf5fed6b7db8338ff3d6462f5d1812cade7efb7e02cb3bc17085392f47e7ea1f9031d12dbdf464ebf860b71a348feb1642cd5107174988016ead7edb8f0c6bd974c89a662cb0240bda7ba71a9b78e8f15390f31ff357916e03d5109d1b14f16aec8da14012d10dd3f31518fc26d755c447385ecf125d061bbdbba7669d7ecdee083daa03f4842c91d95ede53aee9a1a86036bc717d1fdcff6cba893641aa141c8b3090823faf9268c4af076abea7e83f235505daf31376986b37d2f54a04edbc0fad1569841b68a7c62d12f32978f88cebe52522bfff2b9a651a6b340355a745ecc37ce89acec089a8b7b87145edd495984bc3cc38747c8e029180705f5c7761f75bdcfc602443e99dfcc3c64532e655bae8bc04f3e199d91a9d067cbe21c4ca36f0c324087026aced085fbb9afd662375239a42d75c3a80b68a31d4b4555fad58cbe9c5573796d424e09dc0b00010cc49701476cfdb4bef86877cca6576573115a883bc11a592e8c246e5ac51c289b5592e0938ba4ec72494d841b42f09b02ff62c4c17c8f5e1307a3040fcae4549fe796ca3f8f0bb1db5554a8810755e397abd3da1d0fa7ff8bfa8e127eaa019c2ab7a8ea678688bef3f0775d1014203de9fbc3f3d82b695f5cd26cf427d8467e62f9a4af332c1f5d3a35d0382ac0c180f2d221a5d6757a8a88f425e1c046bdd5ff402087576ba36bfe9f9ce7c78ac514883f88b5cf571289ae536ff33227fed342573c2e0fbf124764e2092bae9e0fc8651cdbc7ff99bb6400573f8775b26785a4985e0ca847e9f9d31dde4c2ea2caa4a65b8963a5defe5d147bd929408fbfd571dd687977975d706a99f2b63ca7a37a5c04fb9024de2d385aa61f414e95a28bdfa4ca993a1274fd12db6a7eadf9cc7e971be8febc0940f137dfc67bc8c94a016690d91b25a4b6c91483074e9a11cfa37fcb409bc59e61e04c360704e0767cd67247c9f59e052dfae796cda01d80595c626435172105eeae6d856842ab9a0f6f2de6e79a192ed339be290b0ac6e41de366d7ebbf0899435b0f0a216cfe5dda8b7569b3c42dec3ddb6b0294def713ad6a4967c08f4a243c8d80a689a149f67e42f8341b037cdd2ea48b1b77f8705ea51a5e034ab71261d02c47353ad8bdd3f9fb6fafaf746aaad674b1bf87f805902872b8f3bba474064ee9dd95b93e86c4e587b05d762bc2385a473917a5c0e70b750d94ea9a438ad3cbc7077a1a2796106061f59eca140794940744d040000000000000000000000009953e7aa2a7c038528fe023c5dec7a28e2bd3c70c151dd29aa1bfa7a9db9142dcb8c44cae5d8e4217459eecf42eab75b68eb407353ad69bd74686f2899c5515c826a18b16d4dc376e5e6df21692b0421cc2315b0a2869cc76f2dfe71073655b500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f150a6de09372439b9f4d0e3686200b584669deac1462d97c12c12576bc726e4bb655c56ad294293288782ce8571a8ceb69edbf5b895aa9dca164c42c9431a1325a2fb1011f5bd99020fac4a3783a259c294077eb2ce2d6fcf401a20552d32b4fffe6d0e99e3463831014ab332345914b81928bf39ad07f32d90ae280c10be440225a2f8f1463ca251f37509d22f496c3f4c7be717ce343433fc9dc00223026abe020b14d9a77708774f21db51882857dbe0035f0b9cf38a8ca8878ac82d36a35da70a026df115e31c9bec24e87ce114315d2b7ce9e90c507075c300a0e1da16e350d27120d0f430e676a2be45c4b0a4f8e10116c272f13f270b0657d0841aeb2f42bb0304c805a4566068a9c8bb9b0f89c43df54f41a2a6a1cc5c94d9bf5297cb6f8df70201bc5be1b483fc791943693782ecb6704b611a7e9e2dec0da25ff87b86148eb502263dbd567ffa01d4156cf1b642371e11234f6b17a958c67d1ada63c23537c2e10325113d7afe6a1d67c09805f9ae43ff36ff798704c32f33e1216868b2d0bd43670318b65878d9268dd10a6204d29ba25d20823b7e030dd6d495b9b7c1bef9f5dd17c38bfd227b8bb4ad46e302ee054f4b81e0b13349efb6131e93e0c37fadf048cedac0e0d7a7ff504ae307d69fb9510eb47dfdbbe65f0e0359044be83e8d56f4f9243284e5c158b9e5b945ee69b4612cccc133c316918a7094fd4b87516ca57f1d83852b64ad0f04eb0d69624667a1fb4796bffbf2d1b81379d69d76dc0ab82482bb3d20a60866b064872ea4b908306109296b9555421e8e9643f59ede6c5fc8ecda39d94831e59a33132e0eb9c4a7664bb0a77605d311d93ccfeacd0b6de4a9e5d3943b4ed0f85651a182630aebbc8ce72fbe53f643476939b934429f496fc897e3ca9644de2f0733f9eab383bd625a988a0cd2c8ad571a2a03422a392954fc560cbc1122a84c5db3dc6a03d9a4233c5ca0c7146a4b9a5baf7830c34745685564dcc40307fb8d24e27b641b12f02c44ca9a60b9df7a8485271fdfb8b95f54adb2dc4d35d82d7ed5f6a63434773235529b3530950b6e0493441281c4e56fcb009229dae0bba966b465a1eb3345174a7946f2e290df93cdbdde940d014af99c77cfb0c6fbf215eff76c39b2007f183bb02ec909c970e7ad966b06f7954e4e273664e8e7b711386c93ccf243c41c3e3495cab2e4438b78eb44f05e5a657f6436184f08819e89a26b9fbe2fa221607b13999c7c18f902317de385bdc5a1035eeca546f8fb3272e55411a7ed30651332252b9d4d324df220e058983f225b556e5dc543c3f0e7ea0cac9069b0aaf11b2b35a45ef641e54a7e5fb1a2ade08a2194b7de4588c82834ee83422ed1bf0d869071ee47fc2912dba534ffac688785f12041d308d1006192da434b96b99aa4caa46940803863c2fef9963f61b90dcc59d8ee5f5436dbc6e1ed98007dec7b42343f37267322ed8b5d69cb43aaca5aa470d7c81089623bd2b043523aa46abbc24d84e3e17fd5504fcd10cda1a7088a57e7bd2e08d65d0453e467ee29a9471941a08fb17a9ff747288ff25698b1740499d653903655dc763b152e22d11302f15d615377d77ac795c46184097334586a429da2afc4dbea328f3477768a97c1a64cb62c0da3d07c0ac9e5a2a0773a8a0e0d14529c2554fa9eb172c3133bf7be321c820ab1441ed5ab1d0ea71c58391ab1ae3a8aab5d5e7acc018531039c78654ef50313bf17931374b58f0f3860fd57161375c15e95f55a8352f9f7e60efbfab5b9f57f37fbb8da19519f25ce627b92c63d72872a3b8bf43fc4a11cddfed17a2b67b77334ca9dc84bdef7c54fabdcd8aea28be78b981f73c08290b265d65fce6c85dbdc363397d88007c93d984a6bab86460c706b8fe50422456f9282b88f3117d335bda6b7e9c214d85d2926736cb01e72062586e8cd099057bf57feaa40d017ea707b1a73e0e427b03bdef2582924ad0b51690f7fdb9d4fff0ec4aa4b501a3ac4702bf03c3e9afc2568c43a2934ad2b5cffbe3a77b33494cbfd7837313664ebe40b904402e203a344300e9a252154910cd7018f07302d01a3e2488b3fe4c23750b5792106b1b814b1bce1e27012fac32756fb83f9b89fb8acc37572bef70c0c9f61e78d50159a9369b43ae2991d1fc1c49f457e2429e2709444e5e869a9f3cff7d6254a6a7dc749d9a0b1a137760d4b1705a233300a0c3b931634c41b685b4b6cd2fedff59fef1145e33d00d78b9a908713919a2335773d7c02bf2c1469240e725683fb8c7da6d300000000000000003428b603000000002d4d4ae6e079f27ca70eb3b6e706ca4967716b3d3b1ebda305930fd6af4574d30972205fed172b2069084698e36432187df084e3ad02b04f4855b8a54075b5c9003e10255aec31f46acff7847dcd2b14d39e2026e1c84f229c2863e6b4d5778a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014afd7b6b082a0e291f8dc490b2ce26baced924b486f3766a0b77683847f000e202712505dc794fcf36602385f28a9d57dacc620199ad408dc59501016e75c9c1c238061451986fe3231e0adc214e25e8767ecbebd79356f10670b2a35fb14bf0507b0e7f5734a81555dd02f2bcac8d89ae49b10be4b633cccf7aee924578378020cbb4f097efc6c6b3d938f50b875dcacd6440f2577ac166ceee26e17fcabfa8203108a90041fc14605e0f3f2667b6be06e830836f2bd6f8ff0472ad2681e8a22a80b02c0fddcc183ea2e54783fb83dd7ccf7eef8445ec5581bfa0562f5e29142a3b6177983aefd2c6f130ad7728b021bd68d9f1395a8cddcc921bc0c570d45d49c6a0212920c80728a5dfeb5bce19b3b0101cf22e0380cca509d275eabc27c78549d46020318b9e4a47fc605fc934b0b214d9a98a8d993b130fabd8f4fb1401059fba3e9021c7dc59dbfcd046326bcdb549ec69f0c4ecc9587242271c7a46d764199f0c0be032074e85b80b778620ba346a359d15c45e66d02ccf68d1c368932abfad4e38412031ff281dbb560468fc61546f8408374ab564d7548424da7c256e4716ec654e5e0ae78dd40eea73e86d1240346c600425401de71f72a4904a8191ff06a3a387a7cb07096e00c7e85e86690804a4ce304caaabf2f81a446ef33556b6c730cc6a3cb58686759b10f31392424721a40153ca9a98770326baaa1d37c63472940b4621ee3b817eae7642e0a79ac47a1337c393456bdb36b83a3fdf29248f26fab95eb04e20d69f8113c70cec3853086fd47c0d1e88908c6799f53a7ca86b2867a9253ff5d6931c5a6954527ee93fd2aee15a9748fb87a17a44c8e8c941f45be87971482b3ba05a6e4d61d1d754517603d4a6a5f01a60d49b6f26d70e17f0602aa2dec5d3975db10d1665bd61853a7a368dcbb4b6392c77e1aa23b06bbc38ce7a09101849a368aeefa3cd4aab101f67bf6e9144d103e5ccf8f4453c3086badfba7b27d0e8518330fbf3f0a28c2b0d9f50459808055f55c3f93329edc2760b5e8fbc778133c6d39afeda955ea894dc31ea64472fd08f826b040d9adb452e47ee60d0e67908bb8bba569f2254e4ec43d17e2329d265702f825b251ca464357dce64b6714fec1db3937150727eb9ed8a335226a8a3b49bd01557926c756a39cb3c274d18971e8e49300bdb8f69f4f497294ae7c4a4abac85ec2ed59e243b11b63eb022f8e89732697a063e78715aa97b5532bb1572f648ee7f683fc0e3d6c97a5edca0c3539b2d7bbc8325660c0fc1bf39fbe2f97101a7e46c05e7f4aca5a8f826881d59bd1cbafd58249db73add4cfbeb10a92ddfe0391134c837301b8bc143b7d4e3a8e0f69eb6c1db1b31c406f39376f47d505e9236452eb1d5f7713a330395b7e36a45962ba0a7fd412545cee9e7e4831ef09447936e03b0f54e182eeee21b0975cb41c25387ba77483d860b7953f4d8fe194dab3fcc069a77a09f9288cb52adc917bdc1ba092f045ed976db1be70b350495df4278395cca0fcbb9449c286a5f58b104e450549180c2cc70b058a56fa0f9e2ca556677bae23738eff22e3b755e64545c08013a93e1efca77831dad713a8224264a6d4da4d7faf1db5c8ca4143911ca76f6d519554ecfb802b3a5343335cc45fcc7d9056d21330446e7b31cf0d674c4def8d887b650fe77c67666d7205fe0014087f25660626e08876d09ca0f855ab0923d02e3652affcc9b36f99f3ddfe3145e239ad5ceb3b7e31fa0644bde59c86db8c7234bfc8abb8c5c4b8bbec554c7c9795e6ba7889e3592a2957c047b65c3180e3dadb2614759b791148e6fc8db5e3a44445c33614b5b1cf49dc93fe204f32cf19fe15db0930d45d14bacaf85a3a6b035f66df97c1ddbfe8fde9cad5ddde2182218335f0ab041c0c2708d4a608f6742e2e6f1d104030d7b6f2651ec27efc6017695c8c7fac04fb59eb721cdc58ad114b29556cf85a6b10c54a925b1af2453e0ff50d14978e6265c8f1e1ef79ad54977c6791504f87b03ffe0e79c9744ddf53aeaec7bbb81cf20b098f0929a86c06ecec49089b2e0ae0be363477ae9f5a0adbcb6f625f1ae9072b7bc43fa44a019fcb2cbfcc4596ca39b3632ade9570f309937b69c052178ae7f984a96a99e3b51b82876a897dc0ed1a47b540e248a992fa1b0aacf54399c87b19583b28a3fba3f578ebd041e8c87793804cadcd4be0e13262285c6cf6c9770a65462a61344268cb031e1179a67ad6fa6d35d5f5b2a06763f75e811a44d68d037c99595f773d54f90e03b180fea90679670f5b14f9ea3c506a711da5ba44bf161aecb06b8e7f11c7b9ab15db7708fe2a04c716dcf7164ce30ff9fc45f6269ccfd0731a41d521717711fc4b847e1c20cc299d1b8677dda2ecab835f7b24260cf195d6c1a24272e19a34b9e06904", "526a", 0, -1598401905, 0, "47e2e9d7aab4e65db4301ca078948d41cbfbf8e6e1d66293649e81c245192d0b"], + ["1c10441c01c260bfc49f41cf0929a714c85ed756b12905de777c003b63907dc74b356f6834010000000452526565a8a48674023654390000000000026a537e535a00000000000000000000020000000000000000aa389605000000008a701c8c19cd76ca74b0f4608828bc7023dfacee8542351ef6ed827e7d9c8fab159d3458b198794a9dee6b948eff984c69099e1da6613fc7905037fadf2226d70c5621b1c672340c308720c15591d64dbb30df093713b4adb8edd7af2eadbae400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c8a66894742d700bf16f855346f7fa1c7c3b126dd2e1418e64d09be565f54fed45f7133733b6a2ff913357164802405b981e8a2e7f35a23c8ddf48cef3d9fc8e5c090f60232f8799e5bc32f93f85784fd842c7ba776af900932d602a0154e8bf415790cd197de03ae1f642548fd200fe6136a962a80b9a47b7830f114e597b610325bc04ae1a82a6df1c67647ea5f4377f966af3a9e915c1c7b33e01c6c63ca4bd0303c0183f3d9746d2434d33dd2f735f98c1a3358d2143bb1edd4cba5c3e5ccc620b00ee3b5a82404a08b9f91e296de3f2fa607dcd7eb0fd4661232abcf282e175ea17c946cfe3f4d9d152262218f044d1405900cb8cc0049d4c2d2be4dd178a046a0222d98a0f862fb3274c179dca6b2bc53f7ae7a6472308545b08d45c03ec1b3b1002043850c755d7bb4391dcc11f8ec2040fe963421f7401596f8491d71cc4f6d445032dfc6a24931705787946af47d97b3506c29621ecb136af24847ad71ed54f306002231f38709a78df6df05e23e7050f201f62c4cbbbe5b2521f83b7b20dc505d3f8020f60d29fa08cfcf43c879eb50aab6aacb5863fcc26afeb3c56c0d89d1a39dd556b85f09532c22b1f26d25989e4345d8977fa0e9625fd4bf515f668cdc3e1a3d0686b303f9d07ab33310981769e1e93186cacffc3b0ec492bafb14573127894a4cbd9a5273e48f2598c4e5d8a3e2edcc360f84e6f2e2bc1ed99c03f7ef2114228d98e1bd7bee10505b5388f38d04a0cd102f1584d81938d7cf578bd2d938e90f69553cfe316d73a823c6022f2f8421a162243ba7baac8c893041c73020dbbee4b58ce0cc8388e220661b077967aa67fde2bae6fbb5857fe2ff777086996c8a5cadc6e944d5e071dcd8beb51455c7aaa88c7cda1ada97269e439872a955b3c80b1c408925e2f421820c334600f9420c00bcf0c7aee6ebf8b15c09a73f2f755ef99f838cc80a1c1e5f2f7a001503e09f59bf929d30af53f20c0a34b8b542bfcc7f26712200689372c1ba2f1d2648b04be31ca5af5a8382ea772c6bf108a8d728a15a280b6457795a5b4d7884aa2c3ecb23abe6122587a091b173f19c4ccd32e940e52c21bd0d15c36b88e1d6a12cc0d0b20494f737af0cf8e7afa7fe34feeb2abd0f8106635c41d4c07d3f821222be15e86d2ee0c9bd4ade583d60d12c99a222383fe16f3db1941e7fd222ebb496c11009d0a7cdfb14b20393e31ae4199590c4e057c62c8bbd472701657e871d7556ed789fee90cbebd60294729a7041483cc887b639bcf9a9fe868f81a2df242f3814aa3fc94f3dd0988e90f908b158fb92659fdc59499f4c15b12c3fbd3e4da18adff1a63c1e2906a52a5e1022202ff734c38e21a52ad03badc4d8515f09e4d9fbc6ec24433afab979b08a8d5d9e17db1d737fec71b39bc5c565960715f1402f9b0b90ccc7cec0cd74623af4f9a838f317cc1a3a0700d3f22c0e9d635149e69f80d5f1144d181fa7d2191d7a12d7d1af69b904d3801f87aaa9cf8d9a88d76476141bb7fe7c1c838fca9fa7a7fb349dd7a7067f7328610215b9695655c5d4214cdadc34c66198b9ba9dd29fdb795bbbc593f7e6bda0bff9a1c616b9e6787e7417c7fa7c0471afcf3f239fa42e8c236a19eb2f52c2881a555d3ca0f28c218b1502d4042c56c83fbd514834632824e07d5dff201fdb4f966d6660badb86d8cfc4d5b6259159bb32bc7553d40493a2f9a741303a8d4c1edfc73b8d08d1c5163d4841a261dc200b9f38cacf4c3cc594efd418558ba12cbf818f6e5891702d7558497019ef10cd87be27372f9cb92aac294830251876d058a01d55c735c3f28cf46d6e442aa31c8b29aa6a385d46ba2b16a3c0abc19832a682149f56e084791d51803c1ba6f642c35f71da6320c703ceb08dc50e1885a88af4bfd06e503b332eb038b93d2efc554e8191d2b0a36eed06bc45c5ac2f5b6d7d1e6806d4306fa835bb753ebcc19486dafcfaaf26ade1d0cc1f1c7c8bff53d77d36a79a0e194ba897c459e8df876a986e0968c9082b33a43e144c856b8f30734ab1bfc52547111ae20d647f49151ad672a6446ec2a10a0f170e6644f50cf8a6e3feac1e43f43d73aaa86c809144e1b588393786ae75926e79dd564743a1deb9a879ccdd3df65cf3a5b1098e876aec3e74bde35b5a892d4fd099fc297c788d89db212615821899c35cf127baa607283b3bcd8a82a8186e110aca38ed9e891f21dc6bc8207a0b82e4a764722bc80bcc6925b79fd07bf07a1e779a2038a7e8d8b4c1297d2d2f9bd69dd443b01601eb23cf64300000000000000009d55e00400000000099165f1e28d01c39ef9635abd036078d77c66c432a275133d9fc6ddac2c1adabd861cb2bb2196ac128a4550d3b4e54b561d82e88f63d6d139d1d3e161920735943f182fd9ee22b68035c4909139c4e97bce7b54f84f72d8040b16609cf687fb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000047b0b57b87d14a782a398f14469658153a05ba40133e43dde16200865b4beb66bcdfa8c8f1616edaba196faa67a71e58bb0538ffd715364ff4ec7b3ed19df4f6fea69782b671a296d8c094f4048741e291094c0b4a0022b01f9b583279e65ee20e2b1a47381a2cd63c0d65d937ae65f9c30d1ebeea3231692d9fa91c434e556b0328135bfbb468a8b9bdd8fb634b38f5f9b4d345d085003d431f49baffb2ffac72030f6d960538c2fe0bc529baf09b414c3026b0aa9ce35e50d6aeb008646a7760c00b022a87eb16a9b24f377169c99feacbc2f6672cd802107a5e60e8410f14f66d0afb1c13049bb73a3f293b7be8be540ad074e01580bbec660d8219de7ee33add860215e88a806de0851f5c2a78a8768bc54c85d724253a9f40d30bde3b0cd99bdb4002043210836ec617fc90fe9920455956f1f92a5f3b5688d671fadee7a528f1ce7d02107a2949de46e18fbb229fd331a33653bf67f36302f9f8029c46ced4edd7508a02070721394669267c915c46f129be0115fc7afd9cc2385e5765560e8c82fe6e24022c4a03b67b85a5e2024f2465c3ccdb85249ba380303ee340cf99bdd66211cf1dcb33f5809046274c08a0ac73ecdbee029544834ecbd6c4a933bd77ea37d69a1439c610352f46ed90702a03e3ad823064f59406fcb2f902dd278c2c329c745ced815ab3f3ee0313372402098f84b5b37706aa5e3c22eeeaabd90ae0720a2b4833be96c411af22f1b409dc932a64eb00c2123af86153faa4f8fcdab525157dc8a634700baadeb5b26a5a44e2ca300c624ddb3eb3d04b001ec8da32522b580833da7199429451a996bb61ba3f8e405fa1166b51791681e856c1b70fa97ba23817cd5a3576532ec6b5282cf02fbcf368959be9e553bb0f6b6cb13e6edcb8f7927179e1c25aee01023f81c1deb13f72d337a326cc2399205b3f8e71c379e43041487fe9f70561f1c5af6aae7bd4002b561f1aae7968e02a6c0f44f8ce9870c038f52a6b9dbf7f1a50a16d94581c842b29d115858b3ce4b628d900024f603cb44d67d6eb731ec49955ea69d1312f6f9da81edd74d52ff4aa3b744155ffd04eb6478ef492f62d9a99441fc8e13481f1a0085d708ad105dee1f96f1e03c777ce19f86dc0b8bc4c7fc2514f62c4c89ad2c31f1572e8b5d510251cef820ab8211f66b965fa6a1243033bf9a7c137c586710f55ad93af20f2037c4ec3e056cf10d6b6a2a84179fef6395b03f444658d4a4ad75ffafcfec855fd0ca7f25ee59c44208cabbc072fd3afa6fd0e034e3d87c485e99a89b5c111de0f3849183dc69d843cec81aa6bec4577db5b9d2183d78572aa0227a3ffb39caed3b044f7dffad5713911dd2a85815a882082e4f117d82fd9a894ac7bad8a6776260e5ea466ce523ba04ded9a1e9a1b4a8d49ad04dca874ab1a684616be39f022fe453b824e54af08d733ef528d1a3dd6e3f0b54253dbbf6d774d4a2958623093444fc4467c9f9721dc4324cc6909b6147963607b53a9dcdc88546435c9684d4b91d52f2ace61674acb72ff2caf6fc8aa673a6336a752acbd989f67270668627d256282780d4773735fe0d8e095ff5bad30071a382e1514fe576167d6e547adef028693b8fa921aecb499b460e5f9e2ebbcbb3f26ff1481d81ae45cd23c0ef5f27dbe4aa04a303cefbd37ab1c1527986720bb875ee9b37d1fbb374480b87d584609a89dd8a7193325eebc603cb516d7325bd007f235869c0af7dcbd0e991f5fd00217cf9fa04e685e47ac546370110042bd5a14db9867e37611682b5fbe81432daa378d165e5a31711557cfa24177e3efdfe3a8a903d95c56154b835fd348fd2f6affd1bb2cdafd1ed261629c40e988f182faf714c6202215ecdd86e1175651439ea607df627f334eb6d8d36100a4c3bf1a0b02f20903a6c200cf11990de1355c696377cda2f2be3c0184ead222f3e5f0e015c45737d20ad429739b96755a1314db07e32c23778bd383461b99ea2f4f79ff7ac7b15c350abb23a9beeb14f394307abdb435b4648f81c7db743a03d7d1da73353dda45dc915b3889d18646f36fec84a45e2cb430b34a238982c3fa866b7545c11515346e4df183508ef7e8ff193a62b882e46a80c6dd29856d80f0161e7ca8873e0b01f4e983d27749f30c11a46ba83a6c9a09ccf6162681a4e883e0927f2b37f343e3899f2738fad90d5d58d9959d755df0611b363c0b6fb64bba0306134b68c13a5fff96320b0bea00a38eca733c96e56e3f5f8ec914dd57349fefccdd6efbff8d4c4a627f68fe6577e97dc831071b12d6e606f1f79ebc1429a1e1638bc396c6de549785c4af5e24bdfb2bdee34d1bbb3a93074c1eb5acac86d7a094e75629e57526fb2669c49049561f7c8c15803de4876034353a94a7e571204f9a3e83f4df5793d3176379c237fd72fe00", "63", 0, -1581468389, 0, "4058dee5938982e299c457238effd57f96c472c86b1ec48702a2128830902046"], + ["030000807082c40302e0e26a213ffb0cd23b2ad34ed7da5bd4c642bc05be23454a75071b7713c2bc4f030000000100cfb67e1a878e203e9922a54df6a4675f37b10187cbbffc80fa4d7bf65f825f4e0e2ae44a0100000000ffffffff03f402ed0100000000096a5263ac6a535365651bcd910000000000035365515a8e6b05000000000300ac520000000000000000030000000000000000ad019d030000000061bc32b4f67ebf917718188043b2a3c285f4e861e8ebc8653d1097514333f306f79eb32657129f2a4551819c5a9646e1e824ffb5d5e3c8db312916f81335ed10da8297462d73fcc2d31cb685e90280d828087ca7cc80fdde914f3d3114ddb2eb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008f1982dcb8d26dee453cd7a9c4214d2e0ff41cd9f24ba6599d33d5df91b1f62041cb7b708af9c41e86ce99ffb0fbe78f94c2c8aac49589e74afdd98a9a78de0ef19ba997a8d45bc9c793b91ee55ac3a7d4c55e872c4ef2a78d926251b75bf329a35c6d4f55dfa5cc17b6962703f99d3b164d51bb5ebf3eefb350d0a663975e4a020166b41371d608bcdb2305d395e919e18db715d0e0b76e4dc1e946ba0035fd7b022b0588ee3493cde583c15b04f14c068d54783cfe828d0872b68cfcec259782690b07c6b708286fe28892afe5091706ce9081465a387652927a9e6dcad24726eaf2241dc99c8672fc231950ba33eee86486330e2e063c6aa71295a082d808adccab0324e15e268b8359d3799adf605ffe83932eca7346566e6db5e569c1bc0fc973d602298dbc1fe70efc8c971f019b7f5f738aedd2d85e1beee6db95d6ee625e2d7a4b031e0c5e78e3429998758ad564e16e4591cb7b7799f9e54a8e9c06dab3f3b39e030230574a8d70d19903221e085ac3d8baa019a72f915103666d00b91572304b1317020969989c10d587399606b6c589e3b84c4f491d009b7f84b8f906600b531553555ae6d897d42d60ac01d8bcbdba241c58a6b1568131becaa1ccf4d3778901b9a4ab19c8d7ca7aa07908128ee5dccdf9484fee52214b8a6bd2467e21c82d8969606aa3a84e8b0ef62e5772147440f7f4b2d62c631d46f2fc810026453fbae3591f819be27c0d82a93b5a578689f764fcbf5b5ff71baa53e97ac5cb09e1de35910962f36b947137d20a84c67d720a91f89d182d661a22dc6f33cce96e9136c4416725961d69a8abda1b286dbe9ee9bb4d207d8e2edd4f73551bf06da6e28ec0db090ac97707d23eb1738397a6dc45ebd2591d0acfc8e33a2958b66cf5a64fc4046a145b3dc5b949837a572a052ecb1098334a074ac0b4c960bea22ba1f995078d7038c4d610b0d4084a3960522ac0b772c4202a3e38f6c830543208c4cd1a4a8bbcc62492c0ef6b6af2e6b18228a574337d7847b3afe507d13fbd2cb9b66637b396ea04224cd38a12b9041f44c28bcf2af01dc4729bda771cdd820b0ee664acf760d5a7f9aab9d39a671ed03e7dd0ca8991786d6e80b669a4977b90f1f7ded029fc26261613144885a2022bdd9011eb653bbc2189cfeedabad20c910d1badd80fa928d7a44838ccb6d8a309d84ad8f66f7d667712613ba90ae47a785608f8a571cce09d0ddeaaaa17f835246501cdcc0b651885ff01325e1d96ec6ee39ffa9479b71df443546aff066508acd9933dd6fb2e0f5e82aaa46f5b6e6fb8283e8f20394b8136eed07cf545453a48e26826fd5b24e600707552e064523c19f2c6f4cf4ef47aca9a8335f2b5f0d20a66049a6b1d125651532dc357fb90886e73588352575d326444d69d5a2a9f0246494665840212e22944a19d2918a27cba9ae29d1e5970211cb0342092d9b47e1b3823f0f04aadbfe7746deab245f906fa9a6e15cdb772d84843c84a0f23274b080216c0e197a51d42c4308096fd409394f72f01f140789fe9b37a56b2ea7a4714f78e0124bd68c480c3d93a781254aeb5f5298694c3082d886f854c460e61c13b45a587ff058ba309edb801777ae577ba0ed5fd2ea88311e45417a651dfacbc1be29778dd23272a02c3c38fe7f078523baad27d8c17e05c1c07c065c9ff7221b620de442646a0930b124634ce9333748b268c4db6e5da45bac2faf041086e0873d0f10355aa0a9dd3b7106a35f874b03fb45e78fec3329bdf68819c7b4abeabb112ed673aecf0a80d64677c4a4098eb9af8b28146174f5654297726deae94d3ba31ef507ef447f12e7462be7cffe156fdf8fec6535eead59d4f9d1d8b27e5c7f86d7e94bddd50e1f34c48359ac53356c5835c58959912416f03ab0d1517a3e5cc73b1f14805c7dd842421cf3810e5eb8f5f477992c940dea508d0a439d9d60899c08280ca7272b9cbb2f215ed908a6ddbfecec4b38eb2c738f71cb0721498f7532d562c23f07fa1d20f6720c8c3619be3f1fb8c5c23db16829a4a415704326b9deef940163a2af85cf3ec5f9f3c6e3d8c54eb1e4f436c2565ddd98580960d75ff65591ea55b079603a820d8d857ae3cc3f2c0a29eccf0fa35b9183b4c89c1fa36abba170edb15188161ea39253bd7687a48021501db61bb192787e847f9e62498050a0db225f7c34688ae504c7c2cc0ff3cf7c0a4d50525ef642654d6dfb9073e2cb7300e3484c7fd7a72dcf62a2d463fa7ab524f6a3436fb9ea13233e3df44f204a478250f0565395af58d01000000000000000000000000aaf62a26f153009657a025ae9fbe972c0ac6365c960d27e7a3ba331d54d1995d1660da6f0e7c824d4ca589d01b69dbb8af3ad2e3eb3d813b9a4a1d01e0607cb293c7bc288faf3e35e43e486aab9acfd8b2a1379921ee0201add0ed4c25ba39610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084a4d0dd822870d41f1c5f6b68e96eca35d8d689f6bda531a3fba058a5f28d1bfd031414cddcb95c04299c25e4fa6088309d591bd89dc6a04fe71e9cc72d27f3578672bcdd6517e244d4902c4a426cc2fca980efb853090f7c4668182338099270daa41ca087b0e0673b7570f9ae13ae0ff3a867b0396d7590e612278e1359270215bbc32eba139d65e397decf6082b9f307b4f16c5b75c155f3bdc8f3445140ad03008da7b75b40f01d73861c8ea713db633701a87a979660ae010570cbcf35df320b00f161ee653a0191d4bf961d7783a8f84257e910aed41354eb2f6088144dfb2921d72d99c012861c6369ab8d532d99218ff5fd57cd2a3f2629b3039dde233cdb02210df005d3c83c9b4d1869dc886517491f5660dcc0d0497955bad60e760b25f7031f50f72f550c03d137bc4974dfd5629c8994cde1164d6a178f03b5d8705042f10200a06693e004209a91919c63c9a246034a6daebd7d7f1826f9de9388effd4c6f021607ddc9c8a0ec33b7348c6133a9c55e8190bb141cfa29dc8d0cf7b54fc3f378022eeec72659a80d6e7ee49512e4a8003396b8f855334974345d3c72cf5eeca5f6765350bbe6194c14587239e5467e0910db4e8f9d21b0c2ab101d06e77202ea8cc28b8bee420687c97995393c925fa87d0b8afd7ed28ebf518ab5c2a751a0ee2d0f85cc972991b3686fcf4a7e6c209669f25fede74ac8f2f0774d1e568c4cea5bcd69e83456fabec87ea861d4727e0635ea34118d61194ed2709ad37b071f3903a5a435fe882dd6264f74f595aa8d0ca34b2497b3c451a0e5bbc04ef1798f9c20075f96d5bceab4c0740475f3523e81b0883b5777be43ccdad3a9e956c23438d59b41970a542f94804067978365b389074706729b61204dd22ff7525fbfd31336342468074fb169a417f8a8e3a3926a3693ea70224c2b3a75349921e50cd15836d94a3ec40c10a3ce86c7c0927b63faa3786aa4d29b7c1dcced3054d6c62ec8d055638ecabc136d3f24197ede81c279832c2b1b8110e601ee751a3dc25f909a2e003fd86710e90f0a6d3160e0341455ac7299cd4566f5d7f0ef0a3733e1184aaf5040b015efb41863ba178a42e05bff8775c611f2607a8407d6457c8b2849cdb5d43d0c1e2af303e356165de9f6ae4aedefe0ad078631de2042f140c2a4bc3a90bc5188f89a93b7f566682a8a1ae61d067777290ece2979104683c1fd7ed585d9efa8c3c6ff25b22975bc704470007e323602a091bcb2e5f4dc68c5f20f92ba18435eb046acbebd9508a36ba7e4facb4379d5283479aad0140d69f5dd0cfba017ae2ab21268e8924b185ffea66666eabaae7ecde70ae3de85a956914ffe4e7a3538fc992126d6822170049f22539f009b020eeb7438070db0d100c3b8071caf0acfd3e2175695af945d25dd4a625b1a2b21cb401e24b25d8936d20b84daedf28a49f68858a97a1f3bbd6a2848af886d6f0c6f38d4bfa5f69fd2f8a07ef7a4dff299b3dbba84115c779a9ad37f6f3d69fff6a53858dea3e936347c1a1df0d045274e3451d9476eaff6f1c38f625c49ac67235378dcfef7d40a826be5524ed52edf0143c16b45ac70d2826f1466cfac9b71b848238f49276e03fe35f9acb2fbcd63b582aa20d5b3c50db677265ad8acf0162edadd2609b47ab1cd903479a4bdbe767e622f5479b548854cf07ce0b0af54097f3a5ef03e3e6ed074a833ea5f1a636c4de62510d7c987ece78aa88457e010c7e3461300cfd98c241b60eeffeaa937a08601f8224a0c5602aeff4fab63ce4ecea65735ad7871f599c4da63e8a2b3250c1550546a886bf94c0637d1f0b7818a9faf6062fa71b95a2f655ba3db2c6571db10bb8105d37f33a7b66ad0da6c0d13b68d3853f9bcb011e14e881528a3086cceeac70fff79baa2b09ba72368b6fc284a0b63bed2fa005f5023927def6d9aeb46bb91c20b3380d178e0fa6cd95e791394a2e24409a197ff2c74cee4f97a1c87b2cb6b4189b21e9aa8b24b147c0d38e696a2b71b909930cb471f2e63aed127a06ee81233db4679b917f48122f8d0d063e196676aa9fee634ee6fd28eed644cc73081c9363b7b8fa214a03a0425133ea038820358a8041d9b1111c6d898d76ed548a3d950df70f3252af3f800607d7fe05a63048338d74aad8ce85ed2e3d178dc883d33e17f654a6b9223612c44efdfef242f6004b66aabc7e392b330623b2023929441c61ed334a9d086216848aa3fb9d3dd887ba483bc116e130a0a0917077ec7896b5b7c3f58b35341191b69cf0f3f380ef49d8d22050000000000000000000000007a6f327ce4f7f519698ac5889eee9aedd2417db12ed8e8dacbe4070ea7bf31827c803ee90a43a901eb0e5141afa53106a1f7812675af21f31a7c3db0d2124b04d7d65f636064ca6c574f135eda2e1e11dd66427cba1c4aa08de1619e446992e900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ca2bc8ebe7d844edf4027bc35efddbbe7371c2351ba5b99b6731edc204e64e9eb17501c63957246c63393dce8c802858d2eb76dc91377b0ed72cb31fba4009a40393d96eabd02ca2e15f5b93d6cb01f79a6ab3d2c6328a4cbc65a0b2fbde29b66402ee78439ce8128bf3534203b2d9898697505735a8b6f6b8110134e710b1a8032b2cf4e8a381991b0f9cac30d212912a5ddb26097c96d2a88cb1fd14b659f80803236a0bb7ad01d1fd823b5cda3efe547372fca712927263c4b6ff3d44f246195b0b0028ad8e33950cc750be2d0a7889da28935184e587caea996bf4d1baa14b58360db2f6bcaa06c254b6898c41d722646c915339ca1041d4b9fce7a56a75ddb4d703119da5d63a688e6652f741b798ed01b6458a7049e84d59723cbd7d3548d48818030209312387061ce698769544b9e815a971926721a38e25c7c31def8a3a8052d9031cce70797112b8f17b5ec08ac73ac44c466f2a49ee24e1e9d442638d4d0cddd0030a62a1ef997a06f218361b1af398833f4fa4820afd0bdc8b1a4c75d28d09e7b803146249480c15391b78160127c1d75c1a7ca21f690980fab2e866f8f0af6ae12e664d1cf43bd59531586128a630aeb59cc3f74c3e8ff1a35697e725dbebfb1f957f4ca1cfc1bfa4d82799d528495c5f2523b719869241d4184f530da51c3c9dd00f6958d74dbf1b00f13c11a136d63dc42ebd0b0151111540e8cb3af7284d702eefcbd6a0b019eb066bcd513f017447db11d8d423cee7507df2f950dfc3cffa59d944b3ec74140a38782b3ee99843b3ce1f352ddc6628f2af5165fa534c116855f7ab121b61f0723ab1198da782b1fbbb15c1111b3511ed6042879313afd1f38a317cc05893ec21796f44120350ae9cbbd73db2b3928732d97dd68b236f030719db7fdd3711ddaa3eb34c84e43daa44f9fb4aa375b96561fb010df297420f5b22e302c4b6d286eaffbf012cdf63a2f3768d4db4e0908d9b17aa18457a760798c7cd3e94cb550375b1fe72b1f9763be97c0dc4dd41c4ffc9d3bd36450db13dbd7ba64ec95e86118ad5a81cb403eeedbb72aff90f0fb8a0aa709844b1fdd4138b7d3f76753f09288ab0ec3124cd78ce4243e47f129d5e689b26d68f7e026960c9711e1a0490dd0c66a6549c94d1cdc27634977ecec270307eee9e07b1032834b9e76e951a1bf30bb83e193dfe64550c53b6af2ec2f381ab37416ab7ce8c8634bb7735144f27019fb030b915583418c21cb77572cede35565d4ed925a491f743cef7f14e765cb57da6ad85b7f3e51a203e837d32dcae20717dc8eedf8b8a2b784d89fbcad1b25d147a0fecd3ae18a5f3a56e4873844c97b1edcbc44b28ec7c84e8b95afd28445f80f5718d4d97c4d6ae89d42abf3198e1238f04e81ad4ccf4954a698ae2f06d4ce767bceac51d7a985d4b27b548576f567eed04e79690f4f5d1d3052904574ca38f34e47442bd8f5616b5245baf6a4bc07036b396e020f668f81e543f1616a462505cdc0fd3c362bbb912b93934f5e75d9fc6df7805c4c62ecf029253cf9ce837719bd6d0d336ac56a654a1196da3ad0ed0e041d42f0954a34c567a63a023c7b62ccdb82d7ffa3481dccfb251c77299d957f7328b1f365a2930a656607a539f8ca2a6112a4d80f1f260f88843cf2e79823a1a9ae5d9c9396ad054805c9f98d8160031f0963b16857e6de5d3476415dddb66bb2bd496b615f4a949f1c350576fae04c663981336958052eea35154461e0fbabfe468bfe3c3d64244171d55998ad1fdf98d59696d44d142432679a9ab771428d1fe1ff0fb5e934e9d99b0ad46003511781ca1041aa30fae42e36a817079f30eabdfb77393e630f86a812a468fe0aaaa66d1de979192138cacdfbd86f189f3e630ddd1381f259ebe0a08e0dd6142e33d282a0a5b346e2b421b44da31b647d7ae910e5ac841c52069414cd9a4950348fe45eaa662d7adddb6106774fe20c7f65bffafc4a788da4925abc4d336719935d4e01972b836d3629220a9b8dea25eb97211ba13600e84819358242bf37fcec1488a149cf385931d530d6b2ee11096a803ab0694fa52532342d59e3973907fc68c1bfea9235722efa325ea589b0324abfbcc29394d99626baa832e6cdffc7f3721d2a4c03eb3f125bf3f6150ef9911c83922bbc450037ebbd2a3ac21838cf75ef4bb8ac90a862a1478f6f74380f66065591b1cfc98ab2189badcd85fc8f2148d1034c56dc8360b02ac6685e828333bcc5d9d07e73aca58e272fcebcd845f8103c3827ba3235cc5b4934277b788cf4d8927c20e62ac3d6e8e0e046a0a9c69d3bb3590b4ad66efe33e424533f6cd93a6afa2f6100b6f50ec2ffef5a67426a1d4057d1d54f6a52f4d58b38713c6aac779155c30e225e7748d80d1d9b3ed4b3dc119ab69c6d320bbb39aea287aa50a", "5151526553535153", 0, 1919079238, 0, "913964915651ff7c48d5f03017431af8c54ef932d9454c870b183ee3d289e333"], + ["030000807082c4030195dcddfa5d27f1f8c219b10bab3dcc32ea93092fdcf7f99f118ad92c6fb97290020000000163ffffffff030a3558010000000000cf44dc0400000000003b74200500000000025165cbba46c0446e74160300000000000000009002590500000000163c564f89f2b65fc37626f2c00f382c631f8af4d279af29edc0932422191db8a0bb6df940e4cd20c45ee91fbf4edfc4061a8f60297e45d77b7e808cf5e27c413dda4cc46503cc8039b6c14c0c23c8fff512e8422971a11b71198eb1d25695fa000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f697f39a47de45fc1225a3aee64ed2d422b03f512dd6a2b4f74addffa1f4db0661350b62010825cab08cfb296e6b35b24df5f1577bea258397405bb67f582a7760e2824f19fc319b676d7eaca1ddf6b963e580a99115ab03bb536b60aa96489ae8cdbecaf70d8b004f3da938b446ea994e48b507b9b7a1a471ae22e682bc35f030c28859de1535be46ba62e455477a4636d1929c10f28d40a43daa9c024ccf3320300ba0773afe160ac6661bc09772608dcf1871e07c11ef212bc55d9b5cba10dd00b0657cfb5290535109731af26377969d32d6b7615719cf8d0022e966f7d4db1a8b840ebeeb35706880ec7c8dfea7d8695f0b438aac25be857365dc47129bed0fc021561dfe9c233444158b0e3474483d873e5b4c325d8bbc9151087cc8fdcc229000218741de04d88a46e0c69d2f340d0d1f6425c82ca09f137aa47a5ab8f8e887985030609d31ef3a60face7ca57be255db042ff12d1f1eafe6ee0b9016f4a94497208021c21406e9b9ac064f1d031bb4df321d47f96fc582753a39ffeb3bd032c0f2e0f020453a61efab2a718da92f5b7d1f8cc89a7992897e776a9630a5aa80e8bef8233fa335893b3fd6912507cb5a0d240c3baedbd44ba0759c39f396f20ff28031c87b83321aedf244a66f8eebee7025d218c06b52328bbbdeee297da592529c50ca1ad19b7dc5a94c98c551a3483d9db39ac04ad6fd8b1fe544f5b0757127ceb478ec415ee08ab9b88f0466d478a310a6e2644ba2afca672e8d8eae9d83de9ffd77dffb23cd9ccc554500cb0832571d4cd25df85fa49808149f07606d0a399adc7ff723067d7ae42c5841389c18c8c36f37743c3ffdbd8ec0c5062add31612a69ac2122d097e3a19f7e431fa97048348c2da652de53de83fc8dadcfe5003993938c1ca7aec3a812d79c4b79910cca2a4a12712496a5d65ce48abac878d25fed58a09899f3e9f60f0490dcfdc880c2bf4f2a1a550abd8cf8d8064503b8ebfd0a41a9a77b897b336722ae064d23255bf5762d6bdd183edb091621c5be60821ba00af1cda9e0f9226f8fefe00135e643f2c7a9b824cf98af0de406c9bca87e9b6d004cac60c2f6a6e38df3c790115b7e9d3753a09d549a9858b01b8d81c556110604753c66c21808b6cfc3928538ec5bfe276e3e2ae9585932cf0288ba5f8916261f705a8db853091be65ba77479973556d04c42416f03c136c8937673c43bd28ec038776741024f63fbb83c89d46d00dca3c2eb1bc7f5c5b91136d550e541fb8210044f2304d3c05de5e5572f8a66f489d58f9913cf623d296c9048abeacd5bf3b9e1870bec7ec93b8f8ae09ec3c34a5c26d74397bdc03039ca36e882b9d55227003a4cdcdf504fa95751f3ccb0f57819ed27c5af02786fb793c0395dffee7397cef5c90abacb6b0c6ae64f5e6495f53cdbefbaee346be0197d06d68d4c9f59cef60d1fe1da8943ca99167ea9bebb3d3dda9f3000c2e19316b6ca127976aea20666ae6e668f565ba7324a79038d3f8f969910b487731cb3b4d119f4f0c74af26d4bcde06b3352ab05ad9818087bf4197b1d36dbdb9972bc644133330925449a115dded7cd1e663c5062c0b99a43fe499bbc265aefa6cf55696403586bc3c58746046eda7183bef2ee684ab20c8b2e8567ee3ffdfd25225263fc280822161f16647f012fa418f4ddb5bd467bb6dc3ea5194869d2da04a6a02b509c83a4f325bc198207c3f9d9f1304373825a337e885637c80c871bf597f145cd373c11a0b8c9b6decb30cc9255fd54d2979b546660f61cd5463c73c32840fd18d483a3a3615a6a233c1026eeece4fbf5c6388184c73a9dde937126142db42bdec733d42ee721807263cbcab9961d633e070f7f6732fa3595a06437d162dc8238749318e34fdb1232f4ff90d41cf040c6339e7485e727c3d84c9891b88e860bcdcac2298160edf0c8589d1f5d3903e584e799cad0d220661f4ca77ca233a59044d3dd0308c6eb50667cbb0ad5e99a45dbaaa386b4f64c23dfe9306a9cf4fab3589f52e67761880263731928986af39eff920f8bd786d714bc8b3d048dd96c1bf4768db24d16c13f68b43c5db2fd57625866b5244fb0f3755525b348282545895d5403d090139c90d1e2b27c063f02c2e4f84692d8a85cc70c8185a284b6fbf3bc029422d1fd045ab729b9a424bfcc438873c94d717990066f267def5bb8f33e7a720379e4a0e93c7045975e2f1afe6d5fb27b20da776dbde9e1cb926a18e6dc230adfc7ac5332a6577313e07cd8fb80baa99333c238349c4972eaac2402dc4010000000000000000000000004eee78a6b0cace20564dc3edb4c69ff9ad2d2b128074e4ae68b909808f394dc5f43c8aa1d8c8c1835e0e97a963b5416de907aaa8ee7cac121b02d11fb2c33bdd2588d9bcf74c6cc51b2e5613aa41a42458be37269301613a5066775bbefae3f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a726be2fe05362ad73f5281c34d98d7487c4b1bd9c7891c6c564bf57e32cfb754c85701629ff1562125c7c8bd7e8247990162c16b116002b8b69f64dbb2181ded38a483741fad64e77c481fabc1ca3f855e2e480f56f4934bdeb98a6438eb96c40df571097437e01dce5da4b5b5a255ecfecdc1f0c0084f03b55ed7b527726480222f0bb2308bf927e72d6662553e6394a3a31f64f34496b23cb9f203c27fcbf3d0203f6d572157beee9a85b5e5d07d91da1ec3db737c3a1f8f148e3773cd6d3e20c0a062806855eb3ce4eee64b2b08d70e614472db024e271639da70eab6e11f766e98e5584d040ed7598eb5afb49be3f506e706bf93c6b9c33189bd0097111f737ed032f3b3f69b6eec686e2a550ac8e823007178d4fad131adbc7a3354719ba82afc903225101a47aa2ddb5d0ad54b97e4a04393bffd6515098c619a6afbd76be38f2cd030ecfa2987e29d95fb88049f55daf24f0f2fe6b6a97107cbb90a9356c95000252031c22c563083cd4b39dd3a6f04c52b819a51aed7ac9c5bd27c54be40be4671118020d9f80f0383f0d18ae927047c4f43dc36b5cbcb5ac9c2434787fbd7ce84a957cc7d44da19ab1ef3ad1107bdde113b168aa74beb42e73b598bda9bdc62f8565d5015d4dc8ad1a8cdf65119c6204edb2f31c6f195f1da418bf9bd2d365dc158c5dd6a9f7617802a31d42597b8e7ffec0e94f0af90d460b1f369e718c1a2b60dbbbaa96256bbbe0bb7ecd33e7c0caf769b85d3de622ad6d6e239c878e98aa894b2be961f5a29460c5b6a3e3adacb0c4a8eaf12e661177393d4e86306fa6c0314d2965411e6b391211995d6d1070622e9f6039acc8c396e17676978ff0812c2e5db0e5cfa30883911c5281e964c7354859325bded4e234e7352e9ebc8eaa14a6cfe6d47cf44be55fe71007e197bb1a709d8d69270c1a3a8813beb47bd1366d1f97845b7736ad8126eb25c7f52dbacdef1ffff9c73ac948b722901bb24ca5004cdaa9cd4377a723a92004c8cba9e441004573c92cbd1462dd5f9f8e306c897d783a1e2997e462b5c817558c82b4a4964fc589a383160eaf2fe70de958e74c72283b41607d67f9405a65d7eae95a6411195d7fd2cc98196dc3c8738b970f14e194bb9f9f70fe0d602ac70db4d54d6a75239c561f1f5132cab3e24165dde4fd995347baafc7989daf891fe9717eabd73a4b4d36a3864a99bccc1e0ee4251a2420559129d487e31db62d91536eda37d8a3804c24648c2b87b26364a4d96ddf8cb92adf9499433e4903c237a4be5713534ee388cc05254c18299f68edf9803d1a69ded06bdc60a23a7f943cecd87d64c61f15a1c0a4dd016afc76a78a0ff3d2832d5348bab169ac0635b7aef1451cf641ee5c6cbc38f1f9f8840d939e4f6a28bd69b7ea05d5d2b9c4029a464331a1172e666d09d21e046cbaca3f7ea9ecd86412db24fbbdcc6305462e5090c77d3b53fc11ddad38f74954904bee2bb694e19a00a127c7e0688d6d017882c964e896c80e909cdcd125d4c5769415aea4a40a15ecd1647369fc443f01ff32db069a9e248a41eb4cf680f6c6fa7335aa031673e0d4f55581ad41413c8d7fb50738cc9719051c9896328f7dd7d4f5acacf2f499a05df1bec9bf05497dcadb186ba3f0e70ade9e4a22b246d051e6678ee7252c9226af5cf2704fe794c3f9e7edc41270ef4c116b7c1f0d78426ec186ea909e221cfd511bcdae8c9432f5e6b6fd2a6277cc287d537e110eae0686b82921e937d612fa3570de22b23034e67b442c29fa9bd3e3c8159fa8c56019f0209e879f93bc8d793c2c0b6126e6b0d3db4902d631b042a99039145c3e0009c92219a8001f65f5d8fec1b7bf920700e759f25d4870432ff486fbcae055865b7da95c71375a45106782c6146309467b77efa9cc74eef4918f1224968e054f7503be8998e66d8fd1432a48c5f3fc10de8d54807be2aa01107bf4df1e6a50140e0c6c6a2f2b803f332b0891573b9f587745d198bae4a4ef476ec17181b53168f99dda3ad95c522746f7759ad5fe7871e03e1cf804013ee9187ed8a833f0a5c6d568c43db130e5d1c5c01961830d30f1a4cccd751240e71a314e176f9cc7f2d5b836e788384e39b0f2d8d8930435d03a239cb2637aa2f01eac34b4409e6402d6c01a7ec32fc02df4219a11a3a3d045ea679073f7ac1c6f3ddcb6637bd5c5921cd5d32f646bdbe17ddb90cf19fb091b211179c451275bdcff319062c491c0141ed3d5f95ed49101a8cdb94294a4a5a3a5d05001245788bea25872d87fea81464b6d327e7e03000000000000000000000000ceb8c70edda1cf151797be4dc8d4ff480d510b614ad058f0eb58d1c773135d5dba3c2526a206b98be1b3bfeb7c04b99a5b048bdd44e4983ca09d870fabe002bf84af03cf31c2c0b8bdf592dcb21439a9ba9e140cfe7a326eca299589fcd8a89b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cb2eb7b387ad1d2fa1f9157340c2bba41e9510c6788fe9b31eaa4f688062448c45a62ddaf3a5747bb1c46a9052ea7fdcfbb7b6f1c52b828e6b42cc33a2db5d209b49310d9f4b55f1c02cc824e1eafe300e2afae94b5572af8d35e34a5deeda9b19a404838f4ba8d915500426b8bb6f97bf67cbc4be7a682d959e89175429f833021e17c158debce01c9cd54f41f6372d75702a76bd18debf67b73a983c9dab3935021d934550bcb13d9beef7da826e3a70b348dcc1346276ebab9a08aa0eb34976260a069e19044480104d1c94b2f328f802c7ec620f71b9246c1013d899e3e40aa5bb7df961de86994a40666137f4822a67619690c30b054e12d4adacbe01812059ad03117cfb541d8a02f2de25b09ae74d062cd0bf54c738e1ccf83988e36a174925c10328685ef56516265f1a462376055500cf8aa481a92cde1f219ce59d3180017a1a030ccb1585ac9e30d4c387d077b9f88a5b919dfd8790b68b6aa3deb3d6688dbd3a0312ae3f3536f74118c6c9488504a50b43d52eedbf7c8df71d453fc16f653da29a020881bc530f8ea198307ef98d1cb875eff7b9f335ebde2575eebfa83872263f6ee862ef934a2ffb2020faf22df7b00f7cb8e475b92e9fd82574eb963f4609c364d803c58648a2ec73cb6edfa1b52aca6df4975008d33f7a565267f7686e27d86e6e5d4c44778ca98c11fc24a1c8621f1b298d3b70072506cd08da4dd9c252fbcdd0ff3d499ea9763aa510ea098757ff3de046d3fefb0a3e52ebef06de943e135705ccef0bc6aec7f332cebd72a04fa298895b94c5b68401454c9e9d15c199d0e5a468f0b47903221f223ee7d9b8cbdd4e1ce37c860bfb12ae1e2377baf054225d52ba7ceae7ce95dcba99e4e029a56dc2fe2bb81477c700afbaa43acdfeb4457851c16fb6238083a016635598c5017e38b118d494011bb3751c3298a9e6a7a3556a6303a2f4ade37f56d4f573f217b6b0a58257ae3ecbb37a36eeaa764fa672d59c8ebd0a9764488d346b439e56b083c4bbabbea230d226351508a9e7e68084e985ca4d180147973e519d72553443e14ff4d36ec89ba61bc9505a0682d56caca5877c58c33e8f93a75827b316dfc484f30500e8eaf6eaaf2645571462750bc6028e4b1eedee114f91a60a193675c456ded24adb6fea2fd522f790380516c0fdae6cab073b4b1a82ff3fce7dc8d8ba98fad2db2d91cf69a7c4eabc378981be85374c493b4b34d402ef1295e1e236d98a6caa5d62c8d41f4ac5f1cdf45f02f9ef0320b7e9693bcbd6f04fa35d4da76bf8953da23685570c427f1138f71b30c1257d3e86770a500d11e5f4ede39fd34a02a9cc7ee57c2e55445d8255218fe2fe0be4e4c9d929670d2b121cf5f0aba50f9d2fd3ed09263e371a958d0034016963bdf396d768e92c4797517f569ff3162263b53617b750fa2744925ea77f114b5ba551c3bceb4c0aa1d5c0317f1a9057d132f30efaec6cedca7b7df3d3cd999cae446320c1f5676078bd7ef71c8a723dd6e887f4f096b12da4d7fb025810ff3a43f19afc81bf90943a1b2c5ae2273e63674a2714eef7a75f7ab5bbd61221dedeb2bdc559e63e0ca70dfc64ffd3a96fc510f179c836254b3837beca1e52536fc592a6ca3d114a34157f1221ce9b1e4f652d698a874103164fca580575d246b6664f80250abe9de98e913a366333bb37169acc2e730da0d16b9cfba777ffcc912d1bc7ca06fa4e8984096152ef838bb999b59ca13712ec903fb7b9a5162f553461ae15f87e8f7b673fa57c760ce8b95c869d9165db2732a74967d3af855b2a90f94c3880c68ff71258660d6ed678ed00af0a240a088d8cf85d122e47957ecab89a5c9891583a0073760b558fc4a483a3a4d9ec529339d3aed2c64cfd7dabf0228e7bda08dacb98176f2ddcf76e6d46ca6e640d06f2fd00347c2916cadd690aea33f17b4e7d87f233f7cb3bc854e56805f9f34219988e0697210d394f8b78f571332cff709da60ca6ee55485b057d3f4df8fafd71bcf855e1951def13d98bebb5b3f165ddcc4aa8c6c4c9a2e828433d80fa6e073ca36746878de89c10e3cdcd5096b571cb39ba17ecd7723660b31ff697915de4749af587b7e890e9bff1e049d91734fe1819c78dc2414cd6af3e5140ae57022697a93171be164a94da95fc7d2f24d4ffc7e44e28de5e20149dc6dfb1140c6e10d0feba5e87a827723319dbb22fbd38f394adeb064cbe0759cf3818131deb3d97d75130938a7cadedaa8ebb36e22417b023269508c63a49f663821a336326c433d0463160069468f44255f7ce2c688f764854421fe00d998d3813603d5863445a0aace85b738efb62b912e4651692ee584ff176afe6908c93b084ae3a404117acfa3c6c45b2f895c5dde7d1852fd08aabc02c6698da9f5775e3f0d40890d11187f96a04", "63656553ac", 0, -874386906, 1537743641, "de3a02d0be1467862168d8e0d5fb5a6bca9d7f68ed326f699f362f17c357a28a"], + ["030000807082c403029fff46d7af8fbbe250c1196bd9353d9f88cb714194b9e57509b0eddaaf45e8eb00000000066a6553ac65632e7d3e836630c41827647b04196a69abcb11b8e4d3801f04eae89b7d17672fcc7ae14bf00100000000ffffffff043d67d105000000000852ac6365516a6a5178ce7504000000000452655152aa1e6d0300000000080000ac0065520051c884000200000000026363000000002a6e110b00", "52", 0, -1183916109, 0, "57b50eac61a80809f8a06d855fdc9581633e4cf86ea6a3589e45999a98bc8a1f"], + ["030000807082c403027608d7e0cfe502aeac644b07eae2c5d90885195967c419f6bd59f6af076d742d02000000026352ffffffff44192d67b4a06d7aa66d7c07ed266f9eb6228235cf6b839cb4e69f9e2e9a119d0300000000ffffffff0464459c03000000000852acac6565ac51652bfd400200000000070051536a510000daf4f50000000000055200516a51d56e4b0000000000056a6a52ac52000000000000000002ecd99c05000000000000000000000000547f3129690e9db4e3f62001b238d1f9a04bc14c7aa70dd3de31e45ba7ba78ef46f60d3d9f279c18f111817a85da5a952d20158151c0d32b581c0c15b1386393bf74f4ec4c51a87913e6e99a7f94e00b9e75c7636179b0caf3274d791ecfec5c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a677172bc81bf498c4d916c9bcaa6ec3a57864d2bf8ad6c351c6a81318aa40881ce8159be35bdae6a372867ea34b312e461876c5940e0c9518e7c89529a1a4dcc422c68815534547fcc0e5c0b244bd9d00cfed2c5f28c5439d07ea682858942379b1d307a854bbe20a7f4a0214755efbf02501e2c4c9a17548de0b1c05d7be360316c462c0c088028bc5a6c972d7dade1632b66f61efff9a7413ccf6604868616f031d5b9b133a1c861252e1454e370a17a6226c1fe64842acb785c9d9eb59a4897d0a051b16ed3e34838759b8408a8c66584ed736daf4601b16ae1f1eee1c387c47a526d24516f41c0d98f70cad434a01f1c181f10571a66968aaf55dc40aa7c6170b02020e493aadb178b96896d0012474b1d49a2ab9b4697884098ffe2b156db8a503021c0644fb9b93f6d2731b772c58a347d63c383253196a24222abf0189620ad22f0313152c5cbccee68d4d282247ac07edb868b985b4771119cf702ee31d9964a2e40201e0545ec644bb708800649a4d9a6311b7ad0950cf00ccd58b5431c6cf4c8e4a021795270e097d4789b7a3d132991759263092f5b2848dec63ccdfd481773770c349460704eda4bf29869c22110afa5bafd434642eebf707fbea8d2dbe57c9377df0682bc72d8e43c9353c498fdf2410c1e01c53675340dc8a461adddf66d16f1b7a0c9df4658a0f9fb66769b896009582f0d1b99784735f5e6176646fe144154b87a05e6d8fd53ab773e794af10e347c3e7f48710be17227505b8b38b5abf154ba60ea588522107584dc371c6e1aa0b7ee0ab3ae43f01eb63d350063870648ef99d8ba3e5e1d008c77ea93dcebdadcc740ce72339ebfe313e8a587a28eb0fe35ef7120f2c73c98ac5bbb16b44fe813c4eaac0a16910ceb806fb7da3772e95dba2fdda168538258cd00c5bfca742695bbb310fd74918fff7920cc116dd91b01edda50e619300c99d63db66f791d800bdb4dad0eb7bd7348f9baffea3386d132e158e24354ddabba685c808dc7716b11f79a0c00836280450d7d4c838b50e296a309cf79123885d2b91865f5d40325e0341402245c0a577346c5d8f51e6b54c6f0eef67ca026ef35952e5c07038e1705462bb230bc124e19d6bfa75630361355b9f088111cc2df309a53dbc8958e8ee1b3cc4d662061b552d7e1d4525dd39c3595c92d5a9e923a6d919463d7fa018ef8062a1d0e9341019796a3efec36e4fefc7cb0c1dca5632d887a81136c6d24d2c0ca0e2a1df61798a3428ebf2976c0a30c16c1bbe9b048432061743c1271eb4935ee73c5c0d21d358b096d9cc05516ae865b20c8cf66adebe9627121dd74c3d5c9af6d046d83708458d580077371710ae406d4f790af7aaf853133f205317266affa92f403c6ab35af50a4330499ffa784d62ef46b35912261bfe5e9b6e56a390c6317e5e5df2d388eefefc2d89e7ea31e70f6f3e1baac68a4bf72c8a7e64d88c2ac36881108155127fced50790816a2ff3fe41a26ca6fddabba991bbb426b8b67e17a6c7660f91569b126acfbf61ccb24647a5a1e0fe1442774f90a9069aef1e3fc647ccf1a86619da9b3dd27a052b8053f5dd8e297878008a301c6fe9088557413181de18574d8fe159f9be4a3fbbcfee638243ca57784f5b16a9e4874afd582ea10379e202eccd73ae168cf87a640b70c3d94ddd2d3f648369010dcb7ba0e1a81d5dc0652dcda05b8f3b52114775f3ecaed7f5d5139cc5431b41a3205400e875c8315b10ceba7193f86ac4cdcd3531a59fbc1f48dfafa4b0f0d1d6c1244ccb48f48d9a9af9bd3d3433d2758165d68353ac76c090a757888ab3a61af37a295664070c34a01a1121ffda3685e581b3a8693ab754bfd165d20bab2f4e4007bc4215dba8dfbcc6d4e75a828c3c724172d655facd9bc6401ce603262c8631defaa06e44cf9e61d072c9ae3eb81f1ab637198c8ba20da5dc4ceffc925d200fc57ec1aa3036b31b7047c58091c5f58ec60f86795b951b840fca294908cd954df049c6c295ef476fe8d9a71bc8825b92bb23d1d7090b2453d3354928dfb8d9c007b20cf07fdaad79ee7e22bd0822348f4956db6c7ad872a6bfa6008a7814a99f5606709556cde879ef57f1e5badd5925c44dcda879f177f310381fd0e19a91c620aed6f15015924162f742691bbe48648c7da014acf2eae548599987435858ee50dd04834412724d5a7a5473d812dde4fc380c9722d1ab4f9b8e729b668213efd9feb5812077954ca98f0082d7d5f180bcd2879e02ce9053331e863462d738c305b65bb8b7464a0000000000000000484c61000000000064e62aa5d9915ec031271c92770216c3cb9d8e91f0b0389d3c015d88800023f3bbc6a3d6ab36c5c51f27e5dc5cf19127bc9ecd32e4bfca4492c0c5c98044822e96db2cd749990c452b47f768a404c11874450f5f1a57eb6d6bb05d9d39a825b3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a899cfaf63edc1cb7eec126aa9aab2cd57ab86dee06ed31f67b059e076e10925486173913a488d8c076061a11031feffd89016938f8268a09869bc24671aecab2264c4e8d5c1663717b250737965fcb7ed2cfd0547f6595d054fd66119cd88fa0f81cfccd216abf11f0a528784ba14ebe9085f512d1a91632737c27745c8247031ebfe8d2495ae1815357a887ade78d80c64e84395b55597f6fa05fed1e1f32f4020042f53d3d3a52770ae1861ffa06c8f6f2e22407ce5d954969a6c8c6b5b825b90b06ea395a444ff7b6984ae4a396e33ee86b63761d67eda0e43f945c5c65cd8371778d84ac0a91517e38cab043155043f0c27d3a3a8b6a666bd8a8881cf7dcb06b021ef7b03fa1b83af17d94688df8bf8c42ce611c0fc62f0b214541c9c6bc4540290315ae9a91c5087680e56051e43928a2ab7a0dbb62ea5a0349725ba1f170fafef5031776a5fe344ee52622902c4969daf12c89316412f1254dac88c99c8315bbb8b10214a721b5fe93615ae6e1126fa108a28bc77edf065414abb5e3a3fc00ad7fd32a032a11819f35a39afc853ada688c76acd091514720361e10a79244064b1ce8af20691d3ea21fa58a82b75503d9f2d6d639bf94a932d13ce7c548bb34e330aa714d6199aaf9d7cfd81767366e16693f46ad09aa60b2c3692cf3b361a119a55e41b075f5e64aa888a729d72bf47cead33fdf802ec75bf59ea986bd81118ad5409f6d4023b3526ece30ce5cc97ea128c2ab7819aef5c548439c9a3e1e7dd7fe4ba116cdeb44b2d1e0500289117f30c40be6eb9e3443e4fd3e201ace0a7be9a2345ccf6494782374fb374b52f78172bb927bcc152a19e6377964de13ad876e12f5eb64071bf059dbadca56315b32755622b701843889bece6611252d179c401c6fbbd9d1110a2e582ea3e5af2f34a35f8373e3645ac80cc736fa06171ef2e3e5f2afbbf1e565aeaf66e72816ca529fe0ecaaecff53b20e806e9cc3e6f265ba2814fbe5a4b9c14d3afbaa886c3387c35e77a2cff5263eee087b547a5ea6610cc6e7cb346be3b30f8fee7e63de8b7d7e49fb32c5b9df7eeec57e215116101110e0c6b522bfb38ca699b25b310728419edff9a475c226f595933b5cf1a17ec21957a9c6b99d538da2f65dba24a98c0436b4b687802211a8cfc3c4525727637a5f590bc65e3909c80f0135b00d0f4ab4c7fb9d66f35e18af91637568b0956bdf511dc4104920489cf4fc425998f5dec1eda0ecb533a042f524976661adb4def84cc0b5b84f5d732886b3342f230bb8cb6074c56002691c0aec3d992f331b4ce193ebdc799437bdd6ddf033579f01a10aa9015ee9d14dc84a1e15b76feb040c980eb27a0e7a8385719c65fc591493cf03064c3a6e188649daf9890497fb7d3d620e601441b7ad8cc25ed8cd3ec1fa466e08421fdc86af6312f9ca1626489ee99ca3d120a1eaaa864d94eb2c7f5c2c22b46aa8497d552ee73356ad2a663576606f01ee0002a979a5132a266058e95f961f8a0bfbfbf718dc9db7b9823ade5d97b6a55f9f79499c40ce0e75121e8c22f2899623079aa8febbf346b35dde3112ce15a2ec2aaeae04bd39ca6e2c685932494d91d694bf4104810183ba3b8ecb706aa12f8bee109f8d7a48111ba8f3d86bc289d4b5dd5e7ed69a1216ad48ce759ddfc538c12ceeae8d5e7c13676ed012f233636e532570879f0b5645cb415eb0716bf450e08ffec856bb3e0c41b7a57b2f6fc995e54fe8375ad6399fa7677e31611af27c090e987fd6a58eefb250ae17c4bff9187131f8cd19abd6699f7d57fc3d105248ec30c59ccb89a08d7db15f95abb2a7cd4ecff51d7ff71478e3c377311e500d529d58f81633b3c6251e943b21c6cbda463019ca6e467581cda08c6b7a219969067010b1cd826ccc5120560ac405c3a85b92a5dab1d27383e2cd9ff858e58c8b11d45b19fde20115c0359e33df1b1018e6bd332e810e7bfffdd2fb73d3a7f500505de9828dec26efeed41d1c771bd142c105a514faa5424f6e7dee0987d0dfe7d2e85cd8d0ccca608c7dfbc5fd55e3b2e6179f2e0f7bfe97609b803e8cb3d10a0c85d28eb9149502aa7411d7a9af3c6818452f303f3e2c686c3e51ed3adafdcf0662d73a9181a6966a724fb5693851c0c4e50538a5db57cd4ecf61dc147fe6939f17356b2426b56ea2840018a48b6390cff4616cb07306c398422415181644c129b09ea5c6c892387e5f55528ff46c062a8f6cf7b6c735385239545b2075c90e34205a7cb2ca2641a0fc91199ea686b81a0a6465a8014512b1c432761e68fbd83a561218d3adede892cad82ab5834a3c6d6cdb34d5f4fb6a572be9c655047e4966b544b38fa53bc3a3eaa280df7f99fb1a8193a8fa369189589b1b643990c1fe896ec167961ae2155b2db58541f913905ddeb10d06a406", "526a52ac656a516363", 1, 672853410, 0, "1174411d4ae04d2632fa36a43a98429a761661bdf4b8e3553327f40285aa0aaa"], + ["02f505480318db37bbb1be98996af503917b3c9a3ba6c956d967bb12efe6e8c531fa45f4ce0000000000b8467d5482bb87e07a9f02e536fe594456ad74009b4828e4c620d81f4433713e571c394601000000055352acac63ffffffff2ee04143042fafe9aeb6cc20b2c221065382597a833d1f1a3dcc900cdbb001440300000003acac51ffffffff04a039e90300000000025151b619480200000000045200520053df990400000000035100ac1d11ed0100000000045300005200000000030000000000000000d6ab670400000000016969c0982d40594086a02774e58508714b797e56ce736a1196b3a4c44f9135899289dcef696c7eb1553bf2cd4f5d0a67e02ae5b74bc07d88438f570990c516042d4859f4acdd65c72892c3710fee4df5262f243de7da045b57dd1dd484d08c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000304f03894ef352d27c499bcff74fd0042c32aeba94e996c5d53aad697f8f86f3c5d6a78e0b978375872259a365ccb6af701ca8cbdaea120da9a16db8619363784a778dca9fa74164ccb9300dcb653b1b32bfc92a6f29db9731429db0ef4cd16932c7190db71c81986338f98060ab54c64fef88c99c4b4c677dc6818386f5dcb902144ffa56014ce120dd5c876d31d184cb62d08c5123b86c24ee9748300667881603295b5ea1afcd6c241176e17d2c96d8e29e00df645cf802a96e19140b739d25410b014c420f2ef4f73cfc5c89737ee9c224e8336b512382841ac0a6a98c5503b97db1232a27de9c94f0c89671c60c455b4c027a196f564d418dc92f037acf71922c0216548cb539be50bc3f07ed86133d1aabc1daab3a69fd37227986ea841c36bd11020360ff241a33e97871e7685815e21feb194a631e266b0d391fb645710062e303030bd393c567ca7d57c1932d3802fa199c81f65351bf16bd16c4fd194b095a3efa022c7a64a78500cdac7c88cb459f12cd26f4edb2afae750894aa7938a5e3ff55c103142552b4053c123ae9f3531c694693a7a3128af125ec91b4bcf4c5130f342a7264425708a29e8cd0db0e35234377b7a588783797ac4178c9ff6210b3bde2e7f5c0570387214920402a5e58624108c3358ea0ae14b97b016d450e217e1fc3ab817f460ef9a15c2a1b84618983aa61d3933b8bf3f65828901a83e4c0ee311284ef57ed4ca56418883188ab0b144a439ff0d1de763228bc5538276765c567f33227600fbbd988a9d433c4fe6576cb874b6701755926e122fac17fb01bf36068acb13a8e4c3c2b81c8cae591892338100f4f82384d905c3796c42ef96a708afab2566683816b3f1cdbafe5fec71002457501e03bd59886f9f222eb6b1c2b158952668ff3973eca598169544952db129d651852946eaf0c94aba0874c682145848ea6932deefd38cd46a9db7202cd97c25eb4d19205225cce7d6acc0288c74597238e079e366b771a90a0c0d7944eddef2da0176747ac7f7f542f600ab59a9ba02b5c9917c7abe96534b5fa6e159ede5630eb539293296520bae6aaff2e76f532549e9b74865590e82819dd1782bf8b910a26495382a4d8292a985bf947364069cc2ddeab023452288c22aee0688c641f00357643c3bf4c61304072ec42bd8c69a9d977015e6116723bd0ac8a9154cd16580bf072a32b3b022cc9e87b122389975e22202977baf9cf3e0632e0e614e992e04f6b7458f6cef1c7c72e2a55c7e42b5a76d29a38794cda2737a6bf23f2d4b5eefb767b5e06b65c3c2fb62bb7ff43b573129e6ddfa7bc9b8042d76f738891f835b6f8bd48b2fda5809844d0f323889cb81c8d64b0535945253651efcbd98e63a6cb3433cef803f80ea7ac2f23a8bf80008cab08ca2b665f88352840005e48c46d380603c0c14fd76a3ba70430fe33f9b77da9d443b17ef4c98fdfc5b63474e06267adbf8fffb638ae150224873ecc2f79074dc0747ce31e8a21aa0908ec4d90286a0a2f29eec0eeff135e11079302ffde254b1d4924e8cc04f5c4911d529dd8d7d17e7edbe15baa901f48e83308f9b1ca3a81e724f70d8bd173f8943820b189d8e178f7949e447d9b7ab8547399caef42f824746ef07e0f9d760f4bd632fc014df035cc607857842cd49dd0b9b0f5ef89b931f4ff3d6c0793e967c63d6614248d2003b73ed5ff0099eb269dbd606c3c2bf2bd24652db7067414e81539bf984facc02a34017ab9b5f583afe8e8663707e047dbfc05fc5e48606f6f1413d24dc197bbcec9582e4209105436eb4a87da466974dd7f5458b5c882eca29aff2115f977fc084ec4658c4fa69cc83b4169e704951c09e75cc8aa78a68532c6512365877fbcdebdcba56d2df4b558c796acb15dc6de8ad4db50e7bc1e6a2ae2f7b15c9a6d8359bed6e30ea705bf514504c83cc4b4aeeabc7aa8dc1e837d681a2fe32c00ac4b994e6ad8f823c47840d5c98cc561ba7d18d9e40621475db8243153269cfcafa03ec083a6ce6adf492133a3360f92c89de0d5166d152bd2df9392bcd16b67c360e5fec716189a8f4c71a644e0432b26be3798338f00aec35e6117769e2f240a27da6e8da8f43b90d75cd6bd14ca6720afc285a2fe4b4ad39336a13fa0483ad59f79501c18d34fe9b58c4d35989d3fc6d1ec941c2c772c4a66587c26326d65e27a75e640f274e28443ee0e51e244d71b3ffdf119004495e158503026be5289534e6567320fec980a817d8c5d2b9832f14eb652c7d9fc6fe5260df5090ecf74c0e0306d1ed13b040000000000000000000000005c4dc5172a739a3d2c35e6a063f624202ffdc161cd07922477b4e15d17c868f30955086ded36f46f6635332c2622f41199ea830aa43eda8d0b37567e0bde88cfb7150edacc51244963118142e682f1e23d56bddc1ae1fb0c041e61c853e0be6800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000abeda43e3d36977437be6057a862695f8abfba0033456fa9ad5e8db033db363d7972c3442161631f9129c3f9d611890710d0e05caeedcbdef387f1c92d55b0c375335d4b8219c0a98134927441a808688cf337a466cfd189ed52846a868cbc7dac53635a0d9e3b0c9d9a174362a86b62f86ec2b37548d862db1a6bb14b43255203172d7d343a7fea9b7b3671b3341e515e1674b259e71b6c09a4fce259c77405cd031c328ccc0419bc04cf5dc845bc57e8bd511365a1b009393a741bfb29d5bd493b0b02554222e45384040b842f2cdd3dc3dcfa1e1c7c609698489b1628a725b70e01d0ea679199414a8ba4ad2aa71797479089805f6aba65db72d0490da672435490030c66cebb6e4e0c31caed288af8313c5a0ca783dafac9a817c4b2383bfb97eded032be6c82137c33a984983f5d85e4d2e0a9d60e40083d43512b0fe5f087f92482f0322efa9de1e3069dc927cb69d582c9d291da913f6fc4911e03bbbbf0c2ddabfa202237c55a86dc6d39e4e648c9b1f0bee51580755bdfb48fee4b5e51c03e13a4d450213dc1f9667935bcce6cfabb0e3f3e67955c62fb85e9b6f6cb5bdb34883ebfe2c02e36523fee1840472c50e7f984a770766f91b3c0d1fc76f161e312e7fe56f573bd266fb33c8c1a157eba9403f07f262c31a5e3a4e92764770ea33009cabe981f589407e722084ac70505eabe0f08a7ab2c17d2e47189f7f8775c015471a58d74b775f0dd79f70c05a27932685e29cb8293f0042ce19834882be18111a9c0390b378c533a28ad169552dfcf85464e1431996ed9000ead87997d5469e584f7d24f7f2dd962691e8a7f088710effed2f958ae8373526698879087ed12db11f2cf86e43c35fff2553c6fb49f05f567f97f9a76b4f50cd9704bf9a2e6da3b15a389d093b91722c12bd35b0620150df064c1e81fe9d4d50215f76303631c62f9db429a65c2dcdbdc01fb646796be00e2576e1d867c6c0f49ee4d2085b45990dc17716848e5135a27900f6af09130cdb7149352f5a0a05076599c9cdf3ed5399a2b8e814e15a014007babb638497c21805d2ddc34ba28cb29ddf12b51fec5ee09622ed055f03c147249ebe2c5c19e064cb1102b35e6fc5c52dd778ab85dc42abc416eae33fafc43b01a992ddae2fcbd6cf3f3b1b66b0f6893c85f1a397d946a572a9ad2d2442db9dbc806d02502f255a43be7895f77cb08e894af5fa81573423585bda3d648459074d12908eaea9a73229b55e53b1603f6adfdccee5e9b1b7afef549d5fed83bc7f553fb4258581f15b483f2a944d8a891635c02ec604c0aea33d002aca6d8d57e52211f4e070f1653a8e3960573d4f5d92be65637dd9a44dba5615b78203d2351c005d04d3dcebd5459e91226af24d28b526120a24f78a492174eb98e1fa66131a5f6d3225c8d4f0e071badd1e2f6b9c17c74445c3ae9799a8d60d0a17ef05de4c7d4ee7525ca93421d249d6913086427ed2cf70deeeedba1937ef4a88a32339923ab0b120734dbf5c70638b41023250df870e333e129f57c57a243c86bc8b8b5d62727ce7e4f802e1a3ebb5482d6c5c14f2cffd919b47e352322b189ba6b73f2bde9ec5db7abb8b0fb129100ae12fa3e65e3a49a1123a83954297e2ff6df5db874d8fbc1ffe9d9c7a1e78995f2ac5e2d89a87dce7533c935fc9e9294760a84cb586217474ab1f02fc62040854743670eece6332d6f87c83a35036ba35f0fabb6afc7c6f91a3a2e69c4ccf0735eba3e7ed4de2b76e3f9bb0ae17782c3afc1e48b47252387ad1a6edb7160f643cf6e76732dcdffdb3c5d36f6a4f02169c81df14fd23f35b9a778e5e81b5b85894d67bbf30f942736f437d4e9162b07764ce4b2775b5d74be1135bd91b93de1781c521a45b16f5de2de84e44de3d2f4b55f23ee96727a341ba641aaa409fd45b4a5a531ee4af1af8ca1539be29231e32cb6d5b0dc4d52c0b648bd61a58c41e35a6650a8efcb85c2c8ee5c2838d68462caf1532f64be3adfe186fc5bd6beb906652a3eb9e4b00fc6270e9cd337355f1682ea9676b4b521b754fba571f5912b849c4970e1bef766d1ef7b40ae48c220d1653088dc2977c973a98d8ad8b71c1b8503e4e09c6cf6b31b9d4ff56a19e349828cb1d1a97710c8e299d692df0de15220b042f244412dd25412b8b3277beeba04709fceb577c616a397c9efa367ac2f38427964c670a2835c16f6309028d968fbaa3c336802e571acd101d3064a5e2247adc0e434d80e84133f7fe18ccc210accba6d0d20b0e6bf77c4d152d47070f08c72271e56252050000000000000000000000005a2d4eaf11e51783d9d6a1479f6536c0f2773e0405f8eb49f9f72888149f357a49821942748fa0c863d03d10d08abe7e99ac66d7208ed3a8861b3cd1856cfed216a04d14fc61c44b3d01f13479ea5085ea46778be3ca06a8db118fc15b10716b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000217c348823b999be8fa94457dc6cf31a1344318f4e77dffc3bbce2f7e859b46ad99c07d0eda58138c348ede6a60be407ee32d72fd3269214724a036440d010d07c4b7929e5b0d011696fb8a3ff88aa725d51a532d3e9ec116c709186e361e605043f87fc909682095c088bf149c2781dce5d901bd97ef68f4574024156f4d67d021772194674ba9157f2150b51136217603707ffbacb7d4f2bac3778e3ede24aca0307b45847b9c804b5b70a67a50867096b517a36263009739c005bb7bf180cf2990a03d3b3a988d42f932e760284b94ef4f38eeb186fb391e711fb5279546fa8331e256dec68a937e879c7cbcafff51dbfd37adfc266a5e922b94b06747fcbe073ff032583d9b0fe3a1f53fab39a2d462aebd388aadb41ddb88d100dc088d03a5c6c990201bd77a34e0eb639c35a6da4733aa4f5a05edf2c03d874825edce2f0f7388716020135f370c19a48603a8a43107d95ce59441b65b3e7cb1a07676ced3c95c7bb5e0328cbdb753f3685527154a806156e358dc60f26d77015f192443c96e0863079c20316adde491dde3eb49592814d33ba10a9c7229ee0c2c2773f030e342a8c22069d3adfbd02fc8c207c7aa7dc2f65dbacdf72e0df41f38a621deceb4539cedfa8868ecc4126e9179e377ca8552c7bb1cb62c2deb55ef72240161e2e7a6b95b1a581cee11a8f77574d45a4ecc8b4fb1ce5c1c0386ee8a61e916dd357cbe98e018b688c1bb028a5e5cff3f4d50dc78fc1ffb2b245b1633291b349791e628e5fb1d5d276434e5447e85e6cbf92735e06b9abc28041330d6c9352eb76b07bb3ade60e8ecc71bc08c80d1ca2419e723d0e273c9f84a89a92041ec083d9bc34b56d65264acdcab6239b94144900c6dbf35e9871de3e5fbe4e9d4b7a4213687c0933b62eb8fd6d728f604580ff3bb02de36aa31e98fca8ef8e7efbf1883ac2f28dfd305fb2d3d21118809b1bdb6b7350019ebd3d52b0782c212e84a7e4a640ac53031e057b01ae871b06f788ec15ebf049ab18d4d19b60c603d06fc50326bf325f08d48b32d74449204f8fcbaa1736040841133f04c04f0eb1b8cbc294b99d6d2af09476b92e1320a1b22031fe09bca70b4253de5057dcf84505ae4354400d0f72090f546405e6290ceb5b0e793554a41e2fd551dc6c5400ce3afd8e30cf9592d016ba1b8d96d88853f3bd42c3f768cd40a261d1b077d9e65cca09369305357eeacda429bbc0b0a530ed2c13a99a51049d95ad832d03c509d5e921a17cbe0ebaab4d2a593d8403a456806357560033c47fe11ebe2632b2e263782ceb38b83e47ebbe04a0d08f00910bd874c372dc654d4417c2c9acb9e90479d484173a29d6d472e69390bb4e93ca9733ca6ab891840f511e0a9cc38a467962faad77069e616480807674b5d8c486d1bc4c18a42e74eac86920c960b17f26766bb2356f063575c99fe3a0a900525c0b3ac3916ddf22c8f7dcc4075cb36e55f862557f0ba2012b701cafc5a3b075e96190be1be23c48651a03c651609875020ecc82c3b5fbecbcd544a2e1dbd98b79727c64ac0047676369e936faa8489a35d5e4c4b45e45b36e508aa041f0b57c1d10a4b3e0eea0d70e3f7103bdc6063af5a6e7aff6d50d5999029dbff5be23e3f55e1437e8654a818fdcc6f91e6ff3e0ba5638c60383aa4946e2ebbe4e52f90a487cf01c8a18d137c3e5b3b9653572e25fb723aba435ea5b03190a9993816678b03a5aec28528fc341e52ab5a4aaf6ccb998a1586d74bca8841accbd160da0be94f23ebe21fb15dce0011b8ad64f37139c26f8504409cbbf1a417e7c409033f95741ddacb1f5f11606395ff8abe72036f55167938cd9e26aaf19355a802112a09247ffa873b6252c69bda5ef57823d2baac530389edbdf03098cbbd1b33ead46efe24503eca198d0d8a8b7ec9f25d100755dc68c58a5478d5c3e43b981a88c33b566d2c8abc6019afa7ffb10424e41caaab8ecab7030bf4798555fcc6014e07804902525922363c4749942d45df6ebc3b8411e0c67e742afc1af6616bf5ce9139a21633c57b5159130bf798081ba88b84d73b390c90d8150c9c869f930d7035a7c1945651a2ebe86c3a18d78a5c2385eaf5c475267a06c6d9365529fb266cb2a63dbec2f47bd80ee3ae7ab797839be596b28680303420ae189a44ad711c484c9abaa4211c852d5aa0a126274a8c092d5f505cebd822094a2d2b15e9af6fe3b1aedce2578cb82a8b50a1fce601788f34e4c320708579fe9690704b4a2aac08ba7e85f98994583672a9069f5d2b68ea9ba41c8c4293be45076ec4026f8feafe3ab61708da420b696b196a03a5a6d7dd99d2b0b9e7c45db139f2e277f26dde1597f79e41481aaa2b4bb9b5b298afb58237fd298a2eb0db0149d28d3b040b7a3d01224dea4742676a0ba436530c8ceff5c05", "6363006565ac53ac52", 1, 2002522136, 1537743641, "792d2706d74c9007236a7bb472e9af632e9a7d587515c97d7c1dcdd7c35b5315"], + ["e2e50e730288517bc8989cbea5e67021233952efcd8e65f532aef0cb8f8dbc495433c24d5a010000000452515265ffffffffb1f62fd41113d825e96e02d80845fa3ffda2e9daa0c3fc93d1730c3e653bd9050100000002656afcf2652003c9f6140200000000046aac536a68e141050000000003acac5171383f030000000009526a6500656a536300b201668a01510fcd04000000000000000000000000bbe4a4cbca92bf76dad10a1ec611366150b327e931c3f232fcb526b743c224be0c0230d81b4e35c48ebc3ba571714e03d5fa42bca8338eecc158e1a0f5d620ca47863287475a75c931ff46d47d70cd218bb41ed00e7ad4a130328525bd6a4a10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006ee3793c6114e2b10b9a328002f8ef0d7db58a7e40b37123f1c7ba5348c717ad4c31706bdb66f053e2451cd55aa592242105582a3692a4df027a0fc5075ebcf5ff252d972805f5b15821a55498f8a67b8fca5dbca5d36f1b877d7bad613445badacfad7060846b715c6272a38f7edcfed0c96ff01161f65b00cdb17aae32ff2402006615abc08b284ccd85347958b807ba9f386be745e3028ab9cf7d227db224080327b4f3747d20a7ac811aecdf7d8cb7091b9a4f67f72f64eab4e41348238f585b0a06eb7c8c552cdcb6bb9ae64e30f8ba3c7da6a5f0aee38c18bd2c374590b6141d8c1dc86f8a09d3ff8dec7b2e923ff62767ce00a80e2331c0536315c431738a0d0316796e3f1b4e80bc7d5c4f33592f3d918924e14394aab292456659974d52e5c8022e0aaebcc11ffa9a1a62c0631e77000cd717b234a9820cf782275049ad9783eb031891689f18850ecf320aa423f4a22bfc5e19d449eda2363f95efd16f41529bc80316638c3333f081ac1d48b1ba79185e3871e5b268783a95855481ae0b7d8c4b6a022fa44d7bf60bed73f01b144e057643603c4e347c27db0558be01d4716025d5809b1903c275a8899bb1329aab4a914c3ed634899222c153f3ccc9094315e39813785860998d60bd4a689a2a2e8487a5e7d82f9c382c8712496cf29f4dbd640b6288c6eeae806dd7f6b5229d3dccf265a5c338ffbe6d9858d3f8d2587a4c7cc78d47ecb919a37f30d51c19568460f50adf24a6316906d147765d1a11a84da234890f37a989a1697cc59f97a334cd1313cdcb443f71cd8824a3df607d56ff2a7262c321418060d5b99e19e6859150531d8f8549d364c6e86b60e6e8b7e6bde0c3ce54ce4012f26a8567d7168fb9811ab23fee14b9a13e47f57e7bab107ec4c2f62ac96e57f7ec5e9f3ee32c05090fd1b641995c422625abdbf562558f3cf934d7a9381817ddf25492e01e7e05fd99ea6700165f63edb0ce6c94badf9a4bcacd888ae6e887342e4c54a3de521fe9a80ae04abfb7a1cbd7b2812086231972fb3978a8989add3e772bf936f6d1d10bb8b834f4be0dd4416598e6b0e40019c0a759d37d4d7b30924fa4606c7a5c74a594007a0f71cdf2e8b2a282b60206aceee313994eba4892031677f598b4481490d930205fd7cfa8c7189bec1dd2f4e13ddf33bb78d4b332ef85ad0dad02c3f691b406192754a95c50c7be752a1d54a0d9833585f50126f72fa3d47ca4d471f7f267f381fa144a10ecdd51a3fc222318619f587e8c48b383061157b4a0040c9fe6b2f865a567dca3cb99dd3d2360cfe10c72f1f3f0667161d3e0f8c1f9a22c87c2dce3163ae18eb5679fe49b4e812af88871675c1b47f09d451210574b250b64720d37b09d86504d1350e42f72b3e02679a01e6562f990dac81afeb1fdcc91ab3b5965f7d2545c85e7d1932045ac576001877f830e63725862128f47619065edc13c86a395ff9079115d9f1c4126628801ae9f37b451785da16d2009ccb20fbee49c6d2fd58a9a5425c8323314c72838b9989d56164aca1f1b5201ce71cb70719d89e11e7061276d46bae83aa913c6fd2b3958b7093e6a409875dfacf3246263f6a1f94db0edeb8c4613adfcc14d26ff7ffde128f7a10d8c5cea729e4affe5bc48a55fe0c79ee91db60d2421b07cbebde00894e3b05229a835003dfbbe5c619d369ab250d0f8568626f869a77fc708ed7486aeccf93a8aad0e48cb0deb893e08464e33fa8315ee9c09cbf2dccfd88ce7430a795054a70785a3f8d9d96c80fc8a5d04721c039a982f12fa07c42c873ba0299d74f6600dc1a47b9703a66616bf190a10a6ddbd2dacc82c1822ba9ee71fad5b856627a8affd828a06795ecd7b2dfd8101d3c8145a4e2e047bc096c0a612345573e32cca3a83c676e2c32aee7aded4b3d193fa6e6d3dea74d3a6b168cf91eda32eae07871d66efd1afb27dca7317c5f62fd4d200936e5dafb58eba86852e443d02989746be3120ff981db89bbfcb1ea205a1978b7d2e9e85b554334c8c1ba28b279f83fecd291da2af49900fbd82326c40ea6116d1b8c441dab1f19ada290f5d4957605939073d5a4bf5a138341e32d6971ba3bb0526133c362e50e4061e6ba61cc10faec7dac73115581c9619a96264f35f40db0b4ef05f43a33238683677f55d6bd375e9d1276a61cb77e4304176f8917e688c85868292c09f2c3bc3912284fd4e39c1f364b4cdad084989002b2d587314c8a520ab8b2898bae1055fa822be98068437e046d5f6c84ab31a1bd032a2fe0f010f51b23bd14cc49496f7f3f8682b3e32629ede21bebadb3b0597a613096426a71217b7632e4f7e3396f5a2b6c43b94b7b3f730a0fa4e9570eef4f85eb00d96e2eb7762ec540c1ed142cd6049dd46e104dfc64a2e6689de2548738824a13b23bbafa90d", "65656a53ac00", 1, 71011260, 0, "465a4d075a407914749c32e50ff9b13dc7c3720f17f7166ef1655ae1d04b67c1"], + ["030000807082c40301bfb3e19411ed89422fae3aa19f4bcde3e6e66a65fe6bba2c250768bfb6dcf90602000000026563ffffffff028e050701000000000751516a536a65658597e5050000000008535300ac65655200a53c223600000000030000000000000000847c69040000000045d4e58594a9e17af1d93f5155de89121a6ebf55980feb33a0a4e340bfbcbb3a46f35bb37852a32c4453bb9f3bf3d160fac3292eb0f1ec5d8f3c4ce7d20c136ed951825799c146b1301035461a38a29d64cbf37236863831808901b6b6cb4d7e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dfbe315d4e822ac2d78667d73d9cb2d71b49f3aaf9833d580543bdef0e4305027884a5179bce1868a13f3bcb0f4c389a9f8c87badc650def6c70fc3e515dcc813aa040e33923a2243426b630b3c88ad78218419d3b97c3b9bc7be05ed3dd4c192ebf5f1b58bf866e72c6db6416dc2329cbb82c0f877de9695fbe24470fa2dcd0022e4da3780e37b1db6ce679b6a7283663f8b835ee7925ad6a437c5eec85c01879022b20a19f3d7614af878d616accd0c65f61308cfb2dd381fe51439d25dec000890a07652215cd22079466fdb231a2c64453b5e63b8defe617787b39f8b3df6f65f5a30536416b21b66510a003d36dbdb6c49a41889a16e969c02a1c76b2e7af4922021e9885bc5ee054b3851cf704340ccf1de8ecbca601bde0f88606b8a324df6f120204bbfdb7432692845e8afe43a1c21f5c6ee5434aef69e0f204b0b3bf50cdbbba031559398ee6852bf9540e7de9052dfd1965c0b60b48cadaef7a3f3cbbdb24b015020c84fae2f898346b252866ffd825954f8be7bccd6c6846d72143f1ad90971382030adf3dab321d586ae556d30d6e44de188a88d5a3c6f456f449e0c9e8f7daa4817dbe2b348ed7091d0f4d6585c9b97ebda36156f3ff801c96c316c1b5706cf967acc64aeae8f297785217995e76daa0ba1a1af90b38f5b68964b2149c6cbd668bb57daabed20775da5b11cdfe7060e72778e1a86ed94d8a4c1261eea974922baacdd67bdae946b5b78652e68427a7f8b0217dac0252ef2d868f4baabc97d7b49dcf4258bb6fde017a79f1f4c9d2dc972f1fc5dcbe77bf803f8cedddc5ed23e8f595c5ed226dd55405433ef6975d7e67f74c24decbc7adb58c43fe6031000e0f413dccb6138673653c0e1e26fd80a18beb2987c2e4956d02fea945da11928f12adef9ecc53ade3cb2b8367320e94aebdab46c65d3b359e9aa308a6976e26d8527ebb7516c8318566bee8bf9e4e1f420305d6988cb1556dd907d28b524304f1896472c403cd2f3b9b1ad423e054bc87e6e1da0756ecdcb6e527b2ed0f12884b1f269109a0d736eee1d1c65419454bc7e68afbf5333ee65cd2839cc3923b4728fba08c1bc764f19009cce234fdcdc3fe7cb2af4a80e46a7bba3a0c69ce407c778347e87437a7b0c63d0903b08cb2f2d1faa0430d49a76983ea7176a8d27f2de809d67ec1efa8db52356a962d41220c38fecb702026ea7f5779eedd0502a828a3784dc519fccc555b98319097894c8e76e5cf51fc99277eeb1fb2c66af709c082d0b5737652ec6582c272f1f817d3afb9fc66fb29414f21383c72ee46ac5a489430f01cd000321e328da14433afb69a2a87ceb9b4c63a74fdd6379dcb874518abfc29ee025a1edf8b59462e9a378c9c7cb315aa7ee1298429f3a237cef169059490202e83045f827ea64293388b81c619019441cc5dd6468302cf246a2af0875e15c79e1cea57f612867fe0997c7aed135e449046ee0325719f11a3311dd3802fa87b48066dde4e365daa54dba641b85d0e60a1c8be29dbb46cdc1835ef555ff169c4a3390e30c68ac73cb2543bb459d26ef2934b58326e5cb147d41cde5e69041bca3c7f5d8e7963e201bddf89112a3266b0f380cf1b6d6e1e65a9be3061efe3f2b6101b78b0eaeefaaaa088dcbffb3618c980382bc85c25fd1472804bb4e6b4ef485956b0f4e5e8fd8b44365b81ac0d97d23a96b7b529ba74b8b29c3082cfebd753b113cc73a5f8d7f87b48eda645df562d967a91aa889d88f87b012589d05d5d7a39bcd73abb5ade2da4238f2a79f193962cdccf4fe711b8b0505f3e7cda86b1c4531ff5099011fcc514dd05b63f4a26955f736a99dc8eb8c1aa08c645cea1ce6ad406e8862ec02868b5df2826b5929e1cb0c75e93efcc69511ae711d00ca929e446c276b18f67319a2533408ec273f7f10b21e2a6623ef9a6b3d252e8adafb490b49f59bc053e02ab6893002fecc10eb65e7c43b23fa7275351deec060a0dbd6e423c261f6d850852ac3b7dbdbdb5da142092828ba03b6faacbffdcf2d92471eaf5ba67ccf4c6096101157fee88db9cc921170dce877e5ceb14318b34bcfcee54663d2efba0b0807925dd69e076ebeca1aa4632ed8b6e8ed1d975a7ee8b396054c0e7bbbe5aca85a62c00858e131de6a3f288b05ca6227c920bc98c920a02ef0a852e4578cc7ee6143148a843ca66f78dc8332e91843bbb869975afab8fb7920a8a849d553d33fcefcd24b4cb636bcfb8e06a0256d556773ec5efc810b2cb3ed90e4ddf691bb2911e46577ce602243bbf572300000000000000003c0fd40500000000f01de062ea7054f03553cf9123d085569a71298ce0c0b9efecc93c4060dd69211c5ed21e20c8e4fda6f1b53dfc313af978954023440336689b612f4935c64f0791eb4f47557a413768cfa5eeb9bf9bcb3c8321b5f7b23b4108e809ae2b083a960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000068af5f5aab5cf36da90d6837499f81bf61e8fe6a41e6e4f7cb862f830d34b6c3a1225553814a783d04e6b1329ca0fefdb51a0a9de37b4f24d79d486bf5f1f2ac3e16dd9f5b6b589b87dd6363bc6485e55691ca8bc6e48912dcdfe96d42dd29cc6c88c3ffa2b3758286ee4122eef405881f3054860751aa93936d1c579bed9a1e02153a03f7a21608af819b713c8ced0bd62d39c05445bd1470f12698d46570a07c031bf4a1d60ec5027bc0a207de8267a5fa6798e23619971eb6d06ba9a7afbcbe6f0b068b6f4e2f3c67aec605f9e1a4faaa536f119eb67f494cffe8bf48dfa9edb6f02bccecf3b9d3e036c0009d977136e7553b2ed9ede1fdf315e4e9cd65559f2fa6021734a616d21dca5c260f4327b745e5bda069d14db3f3dfc4c074e824a9bd91c8022dda58387aacc27af4413140597c48fb5a286f7296cb4a19f0a0115da1510d57021e0d1b17cbf8c985e0661313dea30ae2ac58a7aa0f4345d711de52303cf6ef9a022dfe2f3dead1b02542b6992c11c01c5ba953369904c6908f1b66198d9802042b021c65cba788177b8c96f8d9b676f0bae0d2d05094edbe28f8d42d49ab5d8d1da409f7baea9230002ba53ebdadd90a304c01eb6aafc48c3f6df2abcb1c34ba915bd1de5861f2afeda34fe92e20c05d76084e4ed84e6dd167a71f77bfc7c4d1f4155c8195c4967f8e619a29c9d42ec87ac2408ad42e244e33efc4e639bde139c73ba109284b79d8a7f9379056e24ad681e5f7ed8fd040707f0ea874afbf100ce6b37faf2c2c8289b6b2ba614d3f8cbed7e54d68d4df10b24ef8424d01f8a0cee12a6446b0882ba12d8f81b03b6bb04768d7512110996da174321d1a7d79a5b00761e842712bed67f8ba405d57a64782c090004da3d04753214a87bccd6172e2126efe644956bf09e1aeaa8117212d4725e16cac480695db988ad9d07cf107721fc5977f8ff772514e6dc9fbbcf850b11928d4982046cc55d7c0cbef91736e93ffe9e5ef475c488d6409be331981ca4668abb106cd934399b3be7d3755a524145d7ca3a74c99c2bacc7cabafec17f05e743ef431cc3be66c06d91b9155175059d0f2dba5a9624205ef5ac6b202f626112f21cf853c47c41ef15e2fb77c484618a9881d605458d1305f062eb188abb0cb3bef63197144af2f1dd93b978b1cdec1d82581e98c62104466f7f88e41055c01a5d8a726ded154e88401a5ac7a784e32a7560feacef2efd5edac916554578682d1491bfa82fabf46e9ca1eed381004872e18429129a91b22d39f5dc142445f5cb86f04b6eb7af32e2f46b625435fa4ee8293bc9c6f5afad3c90470a8410c8dcf6fa505dc65e0e606decb7d2ace10145fae8d2a55c1e9ad8516f133aac3279673905a75a94ae76104a37cded5088426b0218f44363789a1a419f50f2d101d118bdf606ee3b801fb09d5b636986050c85ed94532a93da00726a96080b9362c83834a88741be022676d5c18cd2722106775d664da0497be954cbadcdd2aca7df745e668c425f0516607ae3415034af76185142e4ed6737c4e5d345e9ba6a6bd1637709123017b71597054fffe9c67153d44f9109183607c258b02601add87dccf316fd013b4072ed70aca8a5546d0a5f4918934b1a6a9252e21e272f43a23ec6faa8d025e04e5c91fd5cd90988b631119f3b375981103f53a8b15ab491a6f1d9cbf9d4c8af1d1532a0ce49f436f6a9298703ad5c692a1e4f8bd165774ac93c5fd6983338ad68cd16b0cd64d7e99bef10093bde29b74d127f106eb1acd443dd74e483a00b40b84ab467107cb24ff315bae6a67f7c1202cdefd2a4aab9fa52b80dc8b8354f2382cdb5f0c5ca95462418fc8abcf3c721eac151654f63714b45e98fae817fa940a864373bb4bfcd3f8d9ec65ae7d10e3a3e445347e9bc590748c03e1e476896d415c2886197ef1105e821b89d442760bf4967a908f96cf7be94b51de79216ba15cf6e0bcc8dde73d0544246a271aa720c78445d73b3baf31f38eee645c8317c4ad5ea0c36776f7c24bba35218a9345dc47a0daedbade938038482cd5c04f01ee6a03966c826cb5017680f24a2a644c2a4cf44a5a87e575445997c7dc0bb770c8e95beb2f49146604a968dd062e53269939446e5a4236a401dd4eb618e199d0b1beffb49810af41bcc262462bc063df2bec0a0a5b378d6e389099b84e049e87ce8ae5c0a197b99889b4324c946d2e3c5879aee8466fc0b13014aac53c927f4dc519877c82f67aeb99dfeebf0e816e289bcddbdcecf0638f2b50626013b0b2ec6c3b2fe66203000000000000000000000000988d1e16ccbd95ce114d0600703215f5201107d5f8633e20e72f5e47cbaa6b484147daa0d2fcc7adff1504d9c413c0add809f78be6950959498a2fcd921b08413bb488595fb88b156aea86172d40514c95adc6ba43acff43214e831ba52385b400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd1a1b5a537442963928217a6493706ebeaca1c0d63eb68ffeed54914ae8f344f40bd87bf9aebf2d6e221fa503c57bd46a09b2024443c984d7b7515a0e50c79d20c087bddfdf6c08aca53ccd755d18d70cd005f1f8cab84c37da97047112bcc4a4e7513aa15410790eed26165dcae54e3732e132a6bec4625bbea0d9cd9ff83403291138c8238711b5fe171756302639c15327c6830efce3664b010e4a3a95e00b032e6ee10b0872a38ad6ddc541d5f430fc0417a7b7108c6d5c7ba74263557f96a60a061a45519928797af13f4ce8f17025bd1436a467647c869ef691dc5c91e974806d5226d974539c7015e32969f0cac0d3ba3b435ef2250620666b5533101d691f03060d5904d5db2634e7756edf1a16a59da2dcb8d0db0bc2c1bcb63c575a2eacc4032b7f6ec91eea2661fe83c96900a7c2c558c3232ecd80fd41a05e8242d59c11f60327235a663c022f4455f95407c9d5199839e2ab94669e6923ee90eb1d2616169f0226eaa0c8e71da2bf43ebe8dda0f580151db75ed0b0163606b8ba52bdd6df8bbd030a2aeb021e8b4c586e1db135958b6b21b448949eb39c89c0e3b03b98ca34abe90f4a6fbf9709326d84d83be114ad6a022d9de239f9bb136128c8e4b6be9473468904b7244822af94a323554e722e11285b8750f4ca81ae64925b911a47b8b5913b7dacd105d718f600a334de3a34cf73b98b198fdfbd72a917db49c914e17617991fa08e2be6b1ce64a87c940f9e6ed5de9994cffca79508da462f0be1c55f19982aef4367f6e06f378cc0c19e52271eb518399ec5e9af6c0b2cb94c572b80642acfaead32e07275a7e003c3d46f9baa6de1de6f3115e86cf266ce1686c0424aedb0d5993e54580696daa52bb181e6af74af3a1e4fcf762022055efc8ac243ec08915fb29a142938596357e3ab0c6480dea98deb181728a203cc2544b13f2fd8b8d7ffe02f43db29f61ade021524ad978b1f419b53be4ed2b2d0dbd5b852f4d2fbf0645c83970fb97272acc0da9bc9113cbf8e346978b8c1b768266d661b9ec860f2f1c902a709a88962b7fa53ecc50d0d5c468ff200f22306d670a27047cbea1a307b3e88cd099f0a36b60517f526b21f6b7cadf906bdc6e639791c04af6ba1c327c31ff317a628b3c6a77f9913b2d39d7bc93e3d758bc35e24ff1a7e8e33d5ac2f005b1a5b7e9bdd5cb4c913fb8c00b3c5138de516c4e5643f3c980b8cab8e8b7e02bf9bd56fa3a444546c3fd3ec6287d64b57981684d7337517b7aea137b2b02aa87ee68ced6cd8be6195a63cebfde04b1d806dcf2a88225fbcf9b09e853b06ee43cb6ae627ede6696863280612494d8a1b0b8116b4e970f622d8b923c261631fae06050360a56e9b9dc7255ab8e25a4c6cc844bf02f2feae5712439410c72bf03dba89d9d07da675870b78b01533c27ffc8fa2228fc5bbdc4a81928847a670f0d74659937422b925594f75a42c57b4b6e31fe1da7017a4926d6a3e5610e95a9df7581f1f3cc1bf41813866f953db6dcc4b7e25df33a223278bc98208279c815e4c535e7317c2f2c0898f9085ad54b965ef5fa16cc7acfb397d1f38c80ec8eec9c240a1aaf729c42b8bb0321255c7fef4026d3d2a4b84dd83d35617bcc62740477f2fc3876f0eb9bd02003e8c437c912e2b9d626609cdf58541bfe4652cc843c92817df1cfa0f4aa97a51dc308b6c901d5174c3eaa4e66d54424cc4f98ea7fb60eb6b75ed1752188f8b5dcfc62859367ffe5504a15717e8d31e2c962ed7d3b4faab912b017641a8a2683fe90a293b895ece870cf187bd32109d0c871061f5579592a1550f367c77810c0f8c40912570148db6d0f0c3499bd1482234c80eef569eccac3cf66bffd8a471a0b143f9f9b450760f7d801c496c296c99e964e94994c9e75d1a2bdcb8ba00131b6294f06a5a6b02a0148f1d722a10be762b824196a770307438be1b74e7d126e7df324a347137830c372d153f98f2507659353eb7851f0e29b8b7e697a1a3a6455fefffc000c36b8c511b4d2f649f089e8877d958c830dbc154ab58617a1d44c0c545a636cdcc1bc4b4ff8290e455241140f2946895ded188e71e1352ae8ec3163e049b8097a097ced031ec4cd9f8ae57e059a0db5ce3957a82ee731d325a0b1cce29d978eb8ac33d2f8aec9af58e1ae9e69e0f1e9b254c7c04a7df363d7c45e47b679395742880e80dfe4e3071bfa12cbcc88b62ca3b66624f648e49f1d9496c42277de568033414ae71eab8d372f0bae9f3ed475eff3752f62e27c31647e66beb24db61c07193a35377a13c6953246f098b0b7aa2637b4876ea3e93304c235bf76004b5ce6220514c324bd752a399143b3d12706e76b0e08aa21b8a1d591d81e042a06ebb9d3f4cf2a6ffa4a382ad93f6def248691994c6bfbfc6ff6ed8aafc6ccf4089af0f", "6351ac6353ac536a", 0, 1619596157, 0, "5816be60acd5e37dc1464621b2237d493ae0ce17d5897c3c39b319a2e3d9dbbf"], + ["030000807082c40304947a6aa557e8c85d852aefff26d615ff650dfa2cdc411cab53c26d56812a455b0100000002ac00ffffffff440735e53772cac823395908243adce21fe99f71f2e8bae60e6334177c6b4fa802000000076a63515253ac6575638a041b64862aef35d435911a78bdf5178534a62a76efe44030096296042291782f2c03000000045152636a2b77d481c44fecd5155b1e9eae78e1e9b581023dc5f0f4e7fb8a4271acf41965c5fab71c03000000025100536dff3c036eb10a0400000000055351ac656aa297eb040000000006005200655265cb813c0500000000095152656365520000528e2f69360000000002000000000000000057a9920500000000c4800ccc94c031fc93428a1fc353a2e92cca8745b223279d0b3ee62c91452e2297cd887e5b61fcab1d0e4d4f2c0b58712e6464640a21bbd517c1a7b1c0d2db60787fe984346b0eca48823052303033b54545362c065569dfe3048a1b90e7ae0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a47c88f1ca26cf97f637cf432c4e05cd09e115e1efea7aafad28106c95f94075da594853c3e6336381b017a069e8d97be9da4a3a471f0c09ba401d5a8cc2b6ef6feb0b843e48eb8c1269bb1071a975e935bc1f4255c96e2d9a31d5a2f23f90c588bb733c750992565b2a9e0f9492a049d7cc3c562f37647f4dc78e8d57c8d64e02254b7ce143405191a4c6165519c649c53cc8f4221b699c130a8df1e271582edb021574279c5c3afde2ea08733faf6d368d588ed0bede00d02c71316b20013c18aa0a07a33b60e5a22ed33b22beccbdd6e3c52c1721513d325a2095edfd409bd6ee4a2bf6203bc36be459a48fa4920d7a4be0b7ee2e0ee08484d6ebc7f93273ea9c62032acc8de2bb07aaf891b2c37aeb225433f2d451d12dfb42b4b303b97557d0e0d7032465a732569570ff24d52e314548603d788bdb3b9cdbcdd44a0b6913407bbeae031e5e09243cf6a64d2a46e01cdc9b8a094f9828ef01874f5b14f48a52af895e9c0308f6374fa3652d8138a2ef9d44f3e05e40f8fca0efcb13a0eb20161b70c7c10903285f2a705a709cc86716cfd09a7375b8781f466aa4a8b743706633c4b55943b66c5f70cc4839e074fdbe1c946ff065a3d1dfec05b01398d05d40b758f2818fcf6495d811e7bfb4419feee9229559abf3201c16bc7529813cc6ff147c2abaef9f8d6491c17a78be7c79873a3fc6c1acfa01676096075efc6dc7789866277fe67696bfc8efa7b415e60763d06dfde547849a585ab4c77cd5c3a109979c03b1b58975f7f85639b473b0ed465aed89da78e8e8e4bc724ad36b02bbd7b0ef7262a580a47fefe0da7830c09f1b85a9ea392282ee973663ce210a525b164af7dc5adf246308473db5f72b3e040386a2c640361c9ee0b0410794e2ca7ad03610b8dde3206c61bc0f0c927b21df62a5a28366f4c7200a5384965ad960b6a42b025f7754fd99086be6db873d52210825beb702d5947638dcc4554d31c851bb680047be864811ee15a408f31396c37c4ff9172957d589d12d9ec4ab20dcf230cad39e3d4dbafdc2700300a5084ee3f4a662380548843919854fc988dbe61dbc091c5f24b98a751284c491eb55acb65422dff1e13737923da85c79fdde55bb81b8e2cbdd7191ea20b9c0ea43d75003e6c2a0acac4559e77ffa9165bac882c3972448ae612c4e7133b38057cc04602c26b29afb12430a0528b17c4ca37db40e379f4892ca8c17120efe68779ad9a8c509384f235df5a648c8791dbbe461b0c031acf58bfa85f4357aae63d5af2ff7b843f593343ce736b353a227532a8b1351d5dab0248b1aa0656b8c6c0239ede80d4ac188944b688c8111167663a82f8353744a09504b211ff81f282c69e2b63d92e6d6be103fe5520849ed8f61d4597397a6c3265be03408b41cc4c6b611f820be4b18952e4551b869411e3347804a561577d4c85c385e5b3de89b800552af08f2af18620638cc1aed3f775dc6325a5817a729f06729c1f33b46522cdbc4f28846538164b2497c072990964a38e51a04304e6d70af9dcff0c3e9ecfbd3106c6fb16ed364546ff509a650a75fe417878bfc2d0e89e77f59f657b0c74e6b6503503544dfe947de3bce884554f35a78e4d5c5cf4b051677bc38a9103bacb1626a800dec8ab252261bf25492f99c309d859d320df885790dcd4fdcd0b706bd84f5b668cd1b28d7db7930603fccdeac0b37af09a083c34917af0a03df262a5511e246668ddf0b5757d196968723d9b4842dfc261859cdb073862f2952fe777c42c879c5d30a97e5dce512af03bbd9fd0c6df95c7c7e3f98a73ac887ee5464844a4185f1d6acccbce28943d391932f09d86196a99f6dd7cac16e01b23a2cb01e71d383df1d6b5c853b7927419d062581c73343da47f3abcc0928d1d7741abcf8759b7d01743294a3f5b7d9c13e3d19f36975c783a8bacd6b17033ea97eff6b4c0ffe727492d68805b9a56daefe10a2d676da6da81e4a471efcea9cb2d312f5b6fcd6c2b00aa1b1c87d34b28b52e965712d69a5f7ceddc8f1515de3fb6514201643db7ad302e046a7d96305d866baab5f42fa54fb322d5362736e6c0a918132efe6c14a8d782dfdecdf984110d5ae887f360d3b673977b624920a3ad78e5455d5417a52e5386cb07d3bf222171b7c34a40e13982b59493a10b80623f2ed9b308c8ad94a1e7ba86f8b6c9081d1d695b19c2a360bcdb835e1fa184429676653ed9b0feb6f335b6173d4770c7d7d09dec530e9d1c2acea9306203e8b81fb29c218f91ba6cde365fa29efe8f1e55f7600000000000000005a44a00100000000ece5fb5fc145ba43655a4bcf60fecc764925202165ee5ab96fde33830190308d133e49d167aa6f40c5d15f14002338026f4e1dfc400d602c4021fcfb71fedd74ab2d871dd65a565229952739368588f45064d968968c6c2597b33ccd76609d7d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000158452f051a6d16c1e2ce8b151ee8a9eb3f70777e18b660e53eb3a65ac258c53d367ead0176f9ecb6480b5e0b1939036fc08dc91f6a964a794d06a51d8bfd2756b25ff4aeff15009b28a9aa6c47cc7753738941c051c0eed6c98c2c102a82a4c4b42a16973394ad3c97a9f2c99390a3c8f3fca4290cb3a4dedadbc2172eb30c4030e02898d67f884884a673c5d106fa9b3481cc0c6d5563329135f1b3a7a6b5449031d9eed3e5c082e0c401666aacfb0f8101d12b73b75a1cdba0acda0d9132010570a016e709d1811bfe6901749a13e578f12ef9c32768df3e0c223f916d163675ef4746e7c6c6face87170583ddc57617a1261ac77193f610142fa9952f9e399979f022aa5ff46dacfd28e59ce5ac31483995b0c3b6cf0791429f8fe066bcbe18b8567022de2abbc41637f8d4712fbad7b5163cb8c1cb0dac7ac3312772492178a743a63032a9febbdd556326f52655fc8ce72138e90f5479bb9c8ffc670b424c4d51f0925030c336dbed14f99208870db4c8ee770f137616877254f4c45d21a94ebbb9c04860305c2ff736c2189504096c36f3963485d2e07115c86df8febd6f83e1268625408801a02fa495df1d9e6c3a20b27d651ad6885ff882f0b9eab3dc8d61940ff896d82ee799f27221d684b15f8860acd47f510ff185393b38614a91faa71968d5d445726f73d0aa01ed22203449da9eec3a98b6f982df3c40e0c6f3db5b6d03cb745181ecb3d797091dd31a40b3a97a923fa98cae6236e56fc588a38a21230a8cbb283755b9de91f1c0c2b16514fdd8931430247800389f655c170c79872183602fa801e1762cb0c67ba75375d3f53ca2bbe561688b17a6a2059d9c453aff4495c641779709dcd6450cec80dd64702668b606555cda5481b1602fb7e59167443b5dbffc0a10abeeb7b3c94cf750fe0bc1b22a5b658d04fa17688f867630a9e8d6c9255c46766505d054e66fed460971fb65d5c44d01cefe774fe5cd92b976cbf3dfb7178ab6c88c7191da423be3a1a606818fdbf1551abeb85243986b901e29bd72c850cfe70abda4f8a925872360ed1bae23e58b36f4dbeb468792559f4b2cd41921336bec4b9ede066ff9bb6e10a8423c830659d57fd19b7eb51ef7b1882caa127ef75b56d93cad261e8029cba7c7fa36ca3797a8eb1abbef2198db312920a976811af64501f032e38eadb78acf576c1b3f28c8ce1e02658f2c992118528a360dfc9d715dc677eb285c01aeea0a74c5d7ddc4cf2c099aff0feda509d76e8a928ba048fbfd85bf0290fbefa73a434166105950b9c9a58117e37f25e79a22c74efe0c6041617a41a84bfe0ec94088b07d6c28b80376d6f6c11629036c5511b487a1c9a37f94ccee9abaafdf6bbc9c8ef048e78ec54e2e117ecdfef2e9fc06bcf444b99a6225c742080dcee44f4af729914ad5fc3d8e1d40de20a1542b9679d52b622d2e153e4ddb3fb6e267cb4bf5f170d7a88149e9e2461e3941eeaa5647a4195a22de4d27141115507ec55c916607201aa52a57e095d2ccdb6ecd41254bf6ce168630f851c8c058bec854bbfa5c304c9d3346f78e105892adf79a2812d0be7b5d04092559475b53443829a84435fd513cf56ee8bb801b7c3c25bc30cb63ad0ea1783164312bc5dc7099eeb2d54826534fc3cd6e46eb4f993fcd350c7e739e72db99784f46040e84471cba81cd8c2cf113ad0d132d6b8843ab7d587250190f37b1ca63e51d9f4c606c2f20bf22419574e0ffd8f5f9bc36b9d883d5db7adf7c53f47936bfb7ac946e23b52fe6750d679cb42386e4402a3ef7979bdae2112f44e0ac35a34f0c78b9085c0e20fb6477176baca581c5d53a8b03c0c9963a76f375cd31dd167c6f0c23dc30a6938d2b59d0fe41a9dbcc5f535141e6ff545469379bd79637494a181bfd08c1e1ce14f5c81a0cf2675c68dbc7aec0eec5afa3aa2965585161cad889764e866ef37a53f0818142e883da652acac4718aae1316d4e763fae90e8bc4115cc731f4acbdfc9743e7eb1e128cd528267a4a653f1f3beacdb9a5bb300da030e404dbd9fc248e871159a038e902965bd32173ee63474d016302837f667348128dce3f558dbdc3998a9aa35104adbea60db6d0c48b6ac57606e63f4e2f5687aeba6784761bc4e94aca2de06cda5bb6435b9ce963e1453efb28704da056ea839a8be648ad971840bf4b91760bfd0f6eef72b079bf68d8b32b209b4710fbd581005b6a87a1587fdce690765f8e2d1e049376ee91d4cb3e0dd86adfdf7dd18705402ed7cf302f582098f42f5dc74894305b2f51147a9dbd90c301900d97eacfea3ca3be3f9c3227381c3a1d1700fc1041aa1385075318236baf7e80648d3054ed683a7a365af6184b542d8fe3897456a3aac20206587d6da377d75c7f7967e75c1450e9ac948d1803ffd8b72d2614207", "6aac5353656563", 1, -940298160, 0, "28649cc69b357012f7e3e121f68f9b8112180a1c952bba7560675dc7f958fb58"], + ["eed4d36f044b9067ff1bb114fa5cfe43929876bbd0c0c4f33e5da0aa4df898eb9b6b23d60d0300000004ac63ac65bbdc606ee75a721784fecd13e2ff62cd60a1dde68bf795be4dd1636901524e9d7fcfd5970000000000ffffffff3474997df409466908b2f988a9b86f2ba84b3b35f515fe4aec85ebf5a5af95660300000009ac00636a516a65005350dc953b00f500326c6b6dffa6a7fc3d93ec3e0498528cd366e6f07633cf09429c8684df02000000075151536a6a5252ffffffff01754e4f01000000000551515351523ea108b703600d3c04000000000000000000000000762178fddcbcabe3a9d274c87a1fc0a06ab84d6da9c13e11733bb6685ed7c6764a0cc8c5c67836268c1a5f6e7191e663c38794ef123f23a0ad6be5962c13736dc18fb951924cdbdbe0a47965d947e8e9623721979d94042bfcfcbe8c8e2cb9b100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b7371ca50825f360e6bef602cf8157ebce72b2ce5c84567d3e7dc982f5fa701250d1e1ca29b254cb7eafc584cf063c9a59290276acc0a35d9b3735dae66ea97896efb96e6370dc147c905a8f1340de0c403548f04c668e4304aa35dff8aeca6a89471d05b5353c309b5498c05cb8525324409072609ecb91f826e06a2b7393a303110efe21ed184b6a07d94c129cdbe03e03b20cb8c3cce3e143db19f2d6e984480324c74687c976448e029105916d681501f058cec7c3971c8b5508594da55234cf0a07cdac59dd9312adb58ae0d81078033abde8cb81e82cca789f7562650570b63472f3fce5e509759a3f722137d82f3021d66f5d5dc6ca33c2ada5e9289d24a820031398c107a88c7331767b0c62486db25386206d10e435f91f8bc4091d00063aff031bfd45bbf8b2e5a8ebaeb9ad91043205ec54c86457986fd0756a9950f6639335032cd9bf226ad3a9f3fd94f1ce76dd973a814371ce083c49ecc29d23de99a070d40311052c0cce7bcd251b16e7bd5c97803e9c818b43870a24edca29e1d53a2d118e0323f146abfeaefbf669c82965c05ad91ea94d229a785c045aa89cf5a6ce39c7139a117b7c09538137dca49c18f0db89a14c3bd2f030905f0dff01bf65a3ab9feab01578caabf3d37a391e289b9d14f9d71ba5d2e70ccf8f40984240758e4c5ea47fb25b71722606c17ef386d14ce8df50c52cfe9bef7c5ee3eba1f27c075dbcfe612ed84d59e7f5758f5bf76cafb9c90b20588cbb9837c5edf717a47f2c61eef0f1116bfff0b5bd611c299a6b1fd332025a31e8153862be1343baf45f7058cfc004287a41a1c02776fc6545478dbcf092b77538065605613a18e17b8ff128140d8f46c1918955fbe1d0c3e5bd8105a61a905e460ee7b86e74744deec3ba5c9c2f5e10cbabd69b7d8286320b94786fb2d9db374e709ca285053654a291e35ef1b9e1030c1f1786921b49c4a2a9cb8f317fc62dd4d2c9323ba30c324ed7fc66cb559692654608e6f7c7aec23c1792a221956392595ee59c5e76d82610009cf84f77d1b631676b6990884dc95d912a8e433c1fbcd8479725b75f233f0b6d12a2fb1676f5c5028682afb8cc6015909f722f3077d3b608bd5d6c5f9e2092288c6671fcb9134c09b2fedadc19484c4f9070825dd72cdd8fa4558006765bf9effe152d573482c0300b66028e34afe9e0b696e6afc3a8e96508c7fa354bc0955dcf3fd6fcdeddcd9c4f114c617897f395acdeab52589b76b0b7eda832c015744ee761a9b86f2f31a060c3952ab7c49e94eba6b78f4cacef81cf258d724ddd42f068d3e5bb8f891f4ce1f4b0fc13e571a05ba7e79521cbcf843d94d1ec978b0464c2f013aad279031cf3cf7ff6bc384fb46903addc34a4f0d3f4a41b26be77589bf750f78440bc73d267f96e18667bd50365321e4b6aa68c204aea96fa18cfb1679326d5b4147888ee5e36edaf117571a0e6de8ed3cf30855b480abd7e0d5f75e7b1be1adf6c01605afd4ae4cb8e662a9649b63ecbe92de13572f1c137d9a998a564526f16eae2c027d9d2f059c05a71773be78322832100d4b3973ed62220508f1129f04bcedcfa4fdcdba4db1a1ec1456fe374c4d601b6a4afb5bf259c16dd9467c1d4ba1ed87eeade1335bdbfc2ab8aa4d1742de185a8f5b95e513e2f2f441809327542437501bf18c28c3677a27a17d844a8cea95c405a5202b9a017c7fc836fc8c54fdd7e05b7f72f1836723c19b58beebb2a03fa6297e7d6ffddce2ec18f22a8a7694e811eb78812c8f35d7051add4468c7068ae236a58ac4e0f954e78bc12cde3daab16aed2ed621919fce3f668f3ccdddad12d72c31b78a596280460fafe80182ece8cdebafb6ad0f29dc5538d51756965f8c5fe2bd7c856e146c5b855f75fcd1e8942e2a02fadbb46191d56f0bcda465d489cfabca668da074d4248468102b791a70708384363ef23a61364c89ef4109a27ef5c42452d5e5aec03db1c25894604f5f6001c94c55afb9bf1b10a7e85a6c9470ea17ec4cd54dc06bd680d1c1193457fa3ad6d62207555af6ba63d676ec740d0a6a78806948221c70d4a9617289ce75e4bc84bd4d615475def002d1b967daef2bd4cdcba71af6b8fac4faa7d0dc847681ad50ee406fb6a6d18d4603bb65136080cafd5fd1dfe1c6132fe6d98af8c4dc56d42d5e37efafb1f9b3de346b46ca0b102a3be903ba76b297bdce1baab8d04737fc9e66fa5f61759944d43ca7fe6488581b538ede7ab1de289b313a0490302c1d5595e3af586acb6f4005b6eaa49acf2b94b129702000000000000000000000000eae543635e80bfc39ae6cfce175bb84ad69b017897a00b9ad587940c854a16cce28dffc47caa0832042e1205ddad1854e89cee9c4f2bc3a8d6edf0d477b516d2ed97d15fa7b0d94ea83449416ed89d0cefdf83b7ec7bb128f6131ff4b7e0ef940000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000031b3e67525ad0c4abc5bab0c06450c5c80e4cce3b30e38db7178c2bb3ac98ada1fcc8cd3811bc2a2026fb8434be5f1cb4c58ff8307912c42a65ab8ed028da227a02bb34753bb497d5b615a7783b2cef3da87754f61aacbffbbf7516e91288de0dfb2fa5f5564f712a0034ba5c2d6037f2170642e90bf01198293eca36002958d02255d485f060b97f86bcb132a1a05a2f0ebd79f28cbf0dac57cac703736bdccdd021c549d28116cebc84d968e3c912e0cf096e464d422e30b8be6850af272107d240b005e20d4f467b05a4a797511146620947db780edb4f18c1ae8ebcc1f6759fe545427151de1453003af6f68e9eae846b62aec4b74926782cb279aa6512cd174e80302d2f88b33e80bf701e384acd969a477de4fe521da83de70b6a903af5a0c4d790228b8026814380626e2a80abe9439b72bc99832f8567021190741c4f86fab69be0329046894c930cc1e7fe112b3bba31999837029bde91ab20943e25f404e0a10be0227513ec16d8d8b1437bc874bed832b30c30362e940ef1e01b96b5e013b0f88d9022cca7e4b82400d89877205bb75eabd5e8a8930cb201052107db367c36ed635f37d3ec56e78401e7a3f248e64ee1996ab5788457d81e4a63292f5e16264ae89ddd8cbbc95648d28e471aee86ae5110b451dea77aec94d87d6cfb36655e995d9f3d02114704093e42e1e55399d6e08ff25eababab44bc855344c883902c0837449632e7f9a9832eaca50540c82f691121350faa9fae1cc6f495686fdbc7eed449d245d51ae51f454f8a50674fded8eb5713257fa9e88bba41836f49b7820b6ccf93a5181221ad08da206b6b0270a6199171ba628b70bff8eb2345a36fc80ea1eec43f2ae1b3a0c7c47e4c1c0003ac077224b59f0e73d944c6188bd5a7dbb41e9a0d03679a480fc018abe00b3e995df16b55e815ab2395f6b04b601845cdfead3de3721e856f577d55a8915d3c07cb07e9a396ce7e7b26a567c562f9897d5d210a3e2d204df5e6d6782863dfecddfb807c5d525e8bbda33959ae89b7914ed660456cf271ba239314152027eab5177ffb29cec68cb7873a223d00a222fd1e429a62f03990aba159b88c4161467fc1a84bc67976d1b55a8b44127c346d1ed8e2924cbef454e5ba25013a5af8c2369c7760ec426b6352b03506e3e0a4929651584142486349a2fb5039ea391b992172df2d19494e684d71ea72ffb79d56fdab1f80544d47458b42fddc6239dc1a015b4dc750d6236e62a6a5cbbb16ccf7562e0cab4459c974fee35c3b6bdf6e1c5c87c668b80daedfb61cc40c287d4bafc6d81d48e43f9a70116ec427b49c960dba332b6cac84ac53bbeaf84ec75223741a2f0d5b5e9f9a75f3e35de90384557c50455e412ee18ed05a408b3f055876fb3e5ea825dcba0da72a705f78143e0159c9bab0e2081b56732ba546862e9eb7bd90e05b4021474064bdd6df5edf3ccef54051fe282aea684dad21e813fd033ab940f69707c866471811f45bb211c8e3fab683e11ab46183b9c65a0e51d4c05a4bf698a35a9e850a6e7cb42d39df7792ff0f3ecfc46a3731d5509f72e4fd9047c2a137a778ab64abba432d967f7a041581016b15fc55a22bd834b05632ec57be52dd72f3273bffcbd8f654f0fe1c3ec9c04abe7905668742db81b8da5aed3b4d90efcef770efd84166e613955801df1f5371fbed7f68b45b10c743d3e213cedd53e5b0fda7d7e8ace1bc3eba3dbf40ad4f6f57db58c1848957a9adad80daf2c891b98695cb994020c13f6b0fd06a8e6b33ea46d32fec0f62f8124ba0977b5d9fc035d8fe48094aef0ca113b85582b3a1c9212eb994301aa541708bd916c4b08e8b55195fc8a0dd1c9b1b9805a6388473b742d7afa0b1585897bd05e60feace5ba53ccee36e36243ca9add69ac1e39f85693850b63ece17336609cc7c86769831d5236a7c75325a9bf3b23ae02b1b2fd31c0a1184f6b862b9f82af7f35471bfc434621943f05f6b160f183612246d01b1e3e617bc4f37316a189feed3f3dd7cb1a9c55d88418aac6a23e3b855507775e099806896ba772e70c05d28869d7ad1501b474c9a7d380d633a537baff376f2dbcbcd44121e4b34663ebf42318c1fa9082a4d35cc01843dbf215bf3535cb896f6f678559eb9f9ee04ba7040d71b17e5423f636db0f08a69d0314ce2523a7c1f90c1f9a77d58105c5efd24f5f1f30004c17efec3dd6a20defca72aed3fa35888cb4d010006382cef18647cf3b4783b6afa305d7f19e1cf8a0d2744f55c6be4feca1fb45f810a8f4503f0000000000000000e58e580300000000200b1866a20bdb1cff1e584a00b400f111b4d154a990f6c95fac95c422ec71f2809350e4668352ef1460bb8263604f2e764b1910199d551fa2ee4539a77106633b301874055bb988cd38af26d4676ae6b27037baac18d5f61da11e7d23a56946000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009ddd281ff65fc587b80c63fd7e20ba7484174539df7a127fa3b99739745aa144c78eceac5f632cd22ef36871091f6a1694d886d56a241c6aba33b85c77c5bf5b4ea83aa1269350e1136844f7440df3f55e5b7ef7ba9ab9adddf401c7e5bd38a55f87d03d748303f445752f228714e6adc5aab836bbb085b33f39ad34d04be33c030637339da816daf1d88f113c1339ccdfdc22e4bac8cc3cda6d72c08609f174660323a0870abce15a7008abab929aaf9490fe9883f53d84589f6c095c89d5d77da80b01099fccb9401fc546f60ef280da500401a0097ae0495f371b09d1b3356edbbf4a35e74f023200520c77798d56eb4e709eb5cdb863cad202e02db04d13125ea3022643fb2ca339b47a7c938f7d8c0dad05c3cfbbcf0fbd81440df396232a76134f030b80114ecf4d9f82d46f44a88e632d4bd6eac3ad72d42814ff40737b85e68f1d02099b8ec4ead014dd4c6936cd134a0cb0466afa06ef9f511440f5704b886552260229e008ed1b655ed4b7b92556b8d60606a0b74cb56a6a3cb0ce5bf02ebfe293ca02221277eea4303aa42eedf75209c2007e79c83ffd87826c7206a68ba1ee669acce853b550fd5a679ba0f022c881c3b861b61f7a80732d708613c67feb2e57fcc8818a3f80a0db3f00ab06645532b1730648bafb12a562ae16d224efb5498f5fdf408677e0e9e41bd69f3b32972bb025f477f36fb3ca13973168a3f58732952c067b3d1f7485a2acc1759f9c351fbc5ec8ae82adcf3e2e460eb2c5eabc9888756027700617baa80a48f84f7fb86b12b79b84591244bebe088e3f299bc5cf6eae410111fb750b70d0eb06e1d7590ec1b9d4215e23fee09fe8bdfc1fb5d65dee119fd2718869e28a9eec8f31f3cc532272b24d7e34676336547bc0b01ec0cad119cd37ddb188a97cfe9a15b6152f5eecd5406870ed137f36024a4bf496b9ae07dc4f24111d9026bc154fa15031c75da71181240d717b1c2861acdf2d50745651ebe374e7f523fdfc895233cf3d305959408b403f6198d1cbee04766bf549238cfcada8715683e847b7f8d3fc16b35760d3f1d8b4b88bcc0854bc3b9fc6f6184f8257be49da61b228d48c6f491c9395b73b949e2da8fe79e96198969e0e04ef180874e9ba16f3e0c1ceb53fb80c4f575b5e3399a732081690840ee1112591f0bea02529dca4e815d6032fe90d80295361f4424e1446f3dc4a6fe58f1fdc852b783c55fe80ccae5b9f4e3ac3a35782f8bdd4c0deb88f18b8e93d79b08ffb57172f683b618e2caa5f017209e3a668e57dd56d398e38d48e32c202d66baf5c565a9ef64d1b662d83ca7c080dc657d5124fd06d8105005ee7c9a4338cd60f84cdff735fef32e41331af09bcc38447acbd915c9fa4fe91d1eb4341c310cc58cdbb14e44669830b16650d722b1281a3899b8f0abe85dab95a768253111474b25eeb1656067f40b5f65d51d1f35d7325aefbd81d8c3c190aa43015a752c3ad241130384d64ec3e69caeec61cdd4becd88d9710768c6ad3e9c5a5bfec39f68456a2392620cb12212c08a9e7f230337db7964242339abd33d5795c8136f01aba4af23e9da2db39764a2b033be3437ad258f1a9a320824f3edc3e34ba5eea3c85f4ea865fd4908253e9e4d008b4d0361b6d904f39211c467ac431a580f4a08f3faadbd1e1f1dcf1819a6caa04c6497bf904a83bdcc1f077cfb8ffb82dc9ca7532e0ffba08496e0ded220f012a5c43f86eb7033b2761acc3b66bfe645d2b0f5265ca5e4a770a2c800c0bc61da5657ecd8550299ffa842eea2d974c41c3181f664c971a4c9da896c2075ece11107697898c0dbd275f251faa3dedcc2e08f006453f3bb2b58cc7e2e0016240e1f238b30dfe37d32a9c3be92f8572aebed315ec950c925abe914f9790a00e81441fe63db302984332a75c62ca9e4da83b9b9bbe909c7d6c517d445dcfafcdf897c0015f82a2395f3f1c8efcd6743d71911459f15faed6aea77f890d22e5fa1819b8eeebfdcbfd06691f4dddfb8487536482b3efcb6be4a0e1821f535b61948f833876f1a81c4c107c125a094b1785e3d9676d1037e150098eb569f1b41ee7c48996fbdbec406cf5e30be13ad6f7233e55e979ed30a642306f8097546fd8e74d826452ec6c1672c4c4522b5fc347ad105ec9986513e27fab76d686b0df88a5fabb62d04961850f02b04e1a5e84d72f5482f5b0fe0b1872d50e1ae517ec6fb85b5b9c17c4c0f891c5c31f17235fcc2bcaeacf43f0a7b32d9e27d59f071da50482cf35490ee46536ea4f3417c4cb5bc764f2bf946e96060a1ec2215fca73380703289518b1ce55a0c095ade61de07d93cb6b6285845e260a8fedf0d40ccc18b4999dcb2d859c30f1a838a7dcbd994f3c0687d2b5c9229559bef5e4cad6e1e58a171f21f977c49c44bf4e19314ed45c01", "", 2, -1742820425, 0, "4e70801bbb60b699f8f2e28434393966bfefe88593feee509c4749ec527398a9"], + ["030000807082c403023dc86c7e88f7350b6e05f50b79bb53c82c5ed548e8b2df04867fbf65c3b253cb0100000009636a6a5353acac0065c88e03ea8fc550f2abc326c5acb9cba781c0539df33651b9d96e55f46d96e2594563ac8401000000026300993985d2039da7f600000000000300006575d8f103000000000263634081cb02000000000665536353636a51ae475e00000000020000000000000000a8df0d01000000005c65ecdae516b8e0048841834f950b83c1e957abc3b9d6a36407e9916e3bdb97d382907651c9cbba297f96d09ca0b3df4ccc15895e143bfa23cda368f014c35f2d8ec5de48b8aacce2afb26d8b5f2d316bd87e64dd9eb62ab958be84f3d986bb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029feb207ce5c781fe622bacd39d38cef90f354f8eec027e7b0e009107faa3d7650ce6e0678790ddf5006a1f2c6a94d86a75e5533bcb2e808208d007f363d80db870af0ae03c75af230d79319b93342fafef033f8b10cfbad995728b2e222a881e0fe6bb1a41b45637b3b3ee79162fbd41219ff4e31147bded97820d2d7305e440325e655ba19e8f50c53e63e924ac30c07e6c37ac04dfa3108f407226a82f9f5580227ff49f8aecb927d7589fd2b8c4e3281ae045459a84e525192a6dc7d1280668c0a08b73927d97e067c9913601c389d97016db529cabd6714f9ce25827adfb94d84bb1174bedcc962997ff8e557834582c02667355f822f7fb3d7b04cd2bad66950031099c8e058c0de09025b03043fe6c03f9eed93bd3d228a7017f07c95ca72712b031e9587267034e0133b8ab93b02d158df8b70814f59b6fdd31a3223b4a7656ba4021c984fd8fadcfce684c66c4725ee1ccdff155a3a65ce89a15975c59219a8358e0208e9a6bea387fd7901bfe0355892a2f7ace8c3f786c353beac2c3e9281a2337c0325befaaa2e1a2c341858dc4e4c32579477482b67dece5edba55ac4334f190d6b37871a31d9c40694b44edd4834710f302a8a65b9e48cd547592ecb904a6e51e8dbb0570e67d93bea5d25403589105e6b60666e8d81bbb7ac6c6831821a73dd8e20cf1bf9b791170bcfc9b3cff774cd7f95a7ef6b27d38e1527dc164634fddad316acca2ded1f37bf18a2a018d99e556d19030c396df0e4246c5c742efdddc51d30a9ce55589e452c41afab21d6edbd9fcc78e0f86a1b68109d85c4c85573f3cab80b43f7903a347304554d51792af8fa910219d58d7a94635f1cc29978a2ada3334cfe92635a49dfa4526c5f955a6f8fba97ece0fca7f93f5568658b224f8edb79759d3bc2f61a0e8f523766d90dbaf22961966d3b2404a9967cee8faa10987af9692a5258f7915d601f8a30f44d8c39e030282bb0e95f7a0e277605c9897eafa8cd7670c5d55a88779c59d507b17719881557ae3885356495472f376e092b078357952bd747046158852fa151ad6dea970984b6ac46e474461b1c2d74ef3a6550b952c655404031d886672f324d71a298bd6f2964d08e2d8fad32e37e28b704021c9ce37d51d05ca9c9c8e55b9515eeb4e0543b57e18f8de6cbb6f864e9d7e82e937761ee6630d4e56dd9b46104ab3ff408302ee2e1e4329b61a1ffad8d2f30eab2c01274471a75f9427f3850760002ddb1d865ed66deb553e4d71bd963ded857c4b429d18bfc838ed2d9be0075db796580cabbc1a79a01b7d6e8d2c588d9b20033038a6aeabc801578de40aa3feff6e4f029629a4c55c822a80a633dd60bdcccfec118a62fc738a87fd0cac7db1a5e46c109ad2f5971f0d97e63afa24301c6328f6abd0f41a02d2a8acda7582c9c70abc1d748f8eabd7cce52462b29ca17f84fbfd8d407e6715ad44554b9e55b3a5ff2ed1b9b871706ce92d7c6c229bf735419ce045d98df002743bad56b3f532ea315aa26cfc717b69d560c482a6bc3b0c0fc06635a77ba547612e44767f7347c2f1a942598d1c61f8dc897fe4f20b85dfe6926550b91c605fd64321b0b9399fe79746f775880572d9881a03f66e2bcc0141cf0c84d8adc8549cf7c7011ff9d70cae003cfac6a802d13fba156188f43af263192758e8e1abd6b57b6e7a3d2e45565b5d72cc96d0949ac39b16425b6599d8bea316bf71bad6828c4f99f9953402b66f14d3e4de96f4387a227a7bb1bf672b9086b4b25f836a9a197c56019bddd3b1de1a0d2607c796c01baa35def00dcbbc900f18b052f3bf2f3a4f585762446eea072ea915a6e7d80501ba070bd0cc57b534168a01be637131e11aa42c7c79d09be51b914a67e4efd99978c7a22c3b5c5d9eb085313f21eff23ae5c490bb02af90b64f7292c8d42c175ce2ddb3a43bc15b88ed492302f230748dfb9f47a10b74f503a95385774e5e25454744633e09b7f9a764048afb37e3e77c0b7150f3f0da885360587901263b177cebd9831f56d0320a8cd8272098de7540f573ca85c49fad1e8824cb24d9ca7781499836d02760fd21fede3a955bd3ca2726e40dc12407c85e899f12319642459059f969cce3a5bbcdb1ea13871f33e0c8058e8618677e1ac3f5a99ff408f74d83425a343c354f9ae10c0858d75accb3599e3ccbf309ae2a365caf8f8242ac11260716c6e8b491ce02b45b6ea6edcd974680d0bee70dd3920d6f082786e7999431c6d72e4b41b8927680d18c5e244f06916acec862e22adaa043c9ceff001000000000000000000000000128a68a34441bd33725e6500a0d2b5f3df4074c71749cbfdd0c37247507fc6bf19705b125bf2a400d92bff09a2a160f42cc894c27fe44390daef7bbb183df95896e07e9678bb8d6f0e9ea8019a4116f621bc1a437a0a01e075f32ea7f126670100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f1dfb773926832247ec6d44d2ddabcf8e062e1e4ee79cb548cc7349bbc184936783101eab7adf7389ef3f99c9d1a12babe1e516dc410cfae5be79325f5182e82e1cc7a3d2d99d9513ba5a12e378e0e9ee8276e44ccb22605ed65c5ed2ad5a088d938eec27154106eebd868628e70bfc4df11d13cab72a18b7188c4bb49c4cea60202e6a02c13282f7bb1fb13726c6e17905a9809a406ffafe37956fd69e6bdac2203207fb5a10e42f6c8ee6857d1ed0db34ac8d08bf95af185dc6704d273d5d370c30b03f755f548056755eb9fe1d9d7399cc3c75e564538e463cfa307432cefcb14a47958e89f5c4ad5b8db9bcae6e0de32cf1d6bcf5d87fac96c8c3d64c7c5b9a7c7032046855ae5fe7b2d91e2f862248ce146f70f2b1f197e0a17d80b92ad48ace2d803225f26862ce3272f909731942f8efd785c68225dcaf967f50e4a782356ee823503197e6d31818b6d9524ac5f8a4edb73ed628f895de77468c7fb0d8d7acf645b32021d9e19a0d1e69b831c80ec1fdd677cf1f326430ca262e84879142dd20268fd02032bf31a1a00f20f5b2ea36fb38dc2a4dd221d6f7bc119812c6bd5cac7d0a52a9c44e1044799c534f8f090a40b9b657b24aa1c7c1efd0d7e2609bcab3763eb770aca3490a8b2a76d51c1ab97927bbda48cc4c10167f70108ab30d58958b1cc18ca4eac3051a74a1e3feafe16d3dad4b6d081e9344819dd1b2660d211d9363cff9df287c05dec97d3c2f206142b09fc60b19d7e8198899e2193b9033a75a6dae7fc6dd30a0fb73c9ebc1026b57279e4d8a16016291da9826a9e5824ef960acf64d2fea69baafe6dd3cfb5c549ba78b5e0d632db8eac78ede54db492c2e87240b61109ddb67637bf90af4f127bff06be8bf9a5f4d65ff4c7b0c3cebc9cb26e90d1c65fae66b9ca50e73c19e9e9b297b06bb7b08562a3dfe9896c7bab4322b582507220e2af5b4e53b5ce2465a46f74fe6179b70e1cf54d3f7897705ee665aac4f503e58064c80fb7944b69d73daadeebbc0af21c75441b91c0740c8cffc90e2c1a2ce16a6ea06e18702cf6b28f5adc0ea273abfda7d8cb02b1637777173f11615b41bdf6027a9a73f05d2b57f656358ec777258711b9f8b1c1cc1f2575cc24f87541ff884df236bd3ac4feade4e656d7ed5a5f7438bf1fd0e2eba4f2ebdf11be85c2d953da4d219676c3c9bba04c12f29948fe8878bccd02bf8617bd148d409c65f1a53c4324e41e940ccc5f89f7214b1c3cf95205e00ccda28d82c51a471c8e6f4d76e218eea16e2e78f7b0825ea9391400f0d171fefbdaf46033d016b4d89358b2ebd31ab2615111dcd1610046d5ceac1cd9f25cd135a05c98cb08d6ef98b76594971ad93555c3e26b2ffcb88a1d562a87c3dfa52672d8af0ed4e34025a0e987146550ec89d5465ea57c5987e1b4d702138274bfd2a7627b824ac6306a62574f70bd8d108986011861537ef5a06ac44d14b17194ee40525c2a765f3c0ef6430680346d46c9e5566e8ea8838de539a9d8517d66e84f2f5be2c3e4743f0b98b66f10041a9756c41de879a2c5238191ebd6fae5b63d30d6762fd90e6292183e9ac8da5a1fe88bff1d064568edda9527be223de3d646228d8decfe8e01cadc084a68280f1304fbae8b31ddd0cac09eceb59e0f5328f3b9c4bf429250b6e8fade496a432e059faae16e8c109ed0d9c7c92b664bb5cb60f346cf08da06c756bb91cec31d2976606cf14c0476c34aaa4e777e9acb377c295fd1bd0f4d16f907b45ee94ab46aa5cf6846093705952ad9b26c9ca083d2f8c934149df68707eb048fabdb6b15cd5d349f1af2ab5d8bdbe79f9af43d8036d6b552e44cc78b750712c9b722559a577be868a96e7c3479fa04c812fbba1ded01f24c14a4edfdc53cc71ee791e7073016ff7a141da55fa72b454bb3279f383b97e24593f3721d680ce07c86c432c08c2643360438b47693b684c54168dec664acec96045a200072178cdbfa0aef08ac5825b4033af4a582c3043d09cdfb3f25b1bb4e4acf896f51ffb8698476dc793127801fb24665a94f5dd6e0387d9954acf3f8b51ba30b252a22125d6820a7ab68766d2f40b079f65a8f67dff6bde80cd99df477d64475ee7d3be869c5a12c48cceec27fafc262c4ee180e1962ff8d54365b7d5ab651d21223b792ac676de0fc07bf8d6cb892ffac9a2ee9e515487ae9f2089a32a330e50f3f20274b31658eca836c9eccd5f166c9406ee41aceb0dfc82571b3225949f85c4590283f5a1dac4cec69f28b0a719bfdc363665910e5275030caec7879af71a074045c04ac4946ae4e219a21b8dc723889fe0912fea7aed1dcef4eba391d50e6bbbfc2e51c7b6aff11ebe5ccb1c0927ae23c8614fada4ee2db8eeb27c28d3ebd9fdd14ced942bd48a97ac964250f54f5a4188ed5cbcaabe4ec05", "ac6a6551ac", 1, 714134217, 1537743641, "17f6a8f062d7b78cb529d9d59f4ed1dcb51b2c68a0de6db91b7fa55dbf7b6b24"], + ["030000807082c40301323454a81c892c4be2adba2e842831b7d6521de3a408100bfd6f33d9e3d9112803000000035163acb040581002a1ff7f01000000000453ac0063a09d5b030000000007635151535265630000000000000000010000000000000000df53f40200000000eba195044417bd13060799d380575181741be826860b02d8d79c8b41026c98cfbadfdcd5eade947146fcaad1820fa364fdbadf458edd0fe730f635e1ea1fb88885e1db7a1cc8ee13a233c87bab64a44da52c3d4da88dc3ad2da76fda1d0664ff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000674743d8f8da8e9f6cd6fac3efe65f1232190fd8e18a86ccbbf24e505ed95ab4b3951453c7778176b451861b5aa1af004c060d1527df5761593e91ed8cd5dd9526a85c7b2e9dff6783dd17c7090ef815c50290dc3d24dd0b1ff14701936711474fcbf61102506a4f617cc785fd330676e1830ce6010049bc259c5d199fcf10f0021a2245991615a5bc5fe80c69a15720d2a7dab83423cb011f3029b1016a1e8e9c021f13bab0e6e5ee51276df2412627f903e3edbf00332650c966d1010225db51d70b0689ccdd9307b59c67cd362b71071a38c83a8ee0a1f516f6c3d88d3eb1d511a1c22d6e29bbe239cc998fb0ff2e8bcf9ff394edbd4396c2167479e249a0307831020fa3d1a65765fcab35724051f0a9fa41d91b93f24d2889f6f9872eddf77f0648031aba14195a13ff4804ba4c0f015f18a7aa50a3d3d6820ec6df5252d4a4091c71022d0d91ccf570012bf04d7f8ac1fa039a835809b819c2dc18af8f99a38038b90503111983352dd11e5cb30f79e87c3fe3e117ec43b121beafa6f2e79d39d2688c2102189cd5f477ea923ea4efcd460f6bb9e0f4f920260606553ab3fa593b3d8ffedcebac457d9200e10935b43002571ad3649de4ace83bb22d4126dd3f2b54a75d6aa9f994b52c07c448ee14375debedf6c1a6b86524cdc493c1863be97e59e281e033fe0984b5714ca1ff049c3d6a827d6d164b91dc467e3ff87fec13a08ae16de693e2cf7482870a64b62c5fa617a56cedd1de075b140182e02e68496d78fa942f213cf1b078b5971cce282c67effb194d30b714529ea89c8d60f4cee87dd399bb0c4e2ff96488bb25240e62d1c2a8f9f0c0f049d42bed33a37f8d5e55156e94ac5c9194b93bdcf06a439552cebab0e7bb7db7712162c131273cd5ed294a1760a130573233d912681a901bcdbdbb421512b457cf2eea60c0d95e11f6661a5c8187c97b0814f0dd1b810e946c2823d454585a30a7279bd6266d1dce30398e8ca4e4f0f17c8ea29fc5c724da548866ad5ae7c070b46b0ea3eee4f1bf420573fbc1c9db5b20d855f5bbf4ba92b25e40084fe9012f4c1d6691f2fd017928f62facbe8abf39967a6c1903b035ee70be88dfc048c2a3f036a2b9fe6c956e3614db350a9841183f24242022691fa2e6eeea356fec0a7e5001bee7b365b98cafa3141ebe5f12fe42500fe5d17944d215ffccffed8d19fe4073374642e958b273f2c05aa9818c2fd325f474d3a5af698d8b7123c66f068078f08d1afe48999043df014e0efffa7c3ee2c2403d674c39fc59649c6689311841abb3f3a9720d8f5dc0c7d5a3a3a58a709fcdfea35c0e7426fc690458a1b0fe21f54e1877c5ab6ad5afdd0a3746e81f5e0e115c0956eb7c0584fa218939da728c07ce89fa266515bac55cab0dd0b4c38975b5ba0ebd6b87b75a77a8a0b4d2b88815c82212d9df8d64266d6ce4898cbd4962dd40708138afc9f2a4eddc912f0782cc8ffc12424fa8ad0b02404150b048115342756dc240176567b88f453b2e9dd6b16ef1561c8278bc6a16031a1bc1193b15d7ef5c5dcb26d5116ad857e8cbd467cffa11fcba86aeb6b38b02abcafb7c98c021b894caf7bf27bff372d3d247249c5e2269a8c96deae37ea13c16ecf668ee249b424231db40a403a897ce13a7725c02384435633081ab3f711bb61a321004c272977ac1cba5138eccea1cd6b2f8d493191ad61c19b242c8b379827d62705300635c685caf9c1fe97899f3b77fb67a9d8ff779a247f1408e9d530ddf87c336d033d678736564785b2cbeeaf164c91de1f19d13e98b95e422b50590cd0359844e2417735b6c89fe0455506cf3bd2948c857d2d5ffb7318507c22e6ee9f81fe1ba3d651042d9fa888445a63aebd4073ab94925e3d9e4984b9314f08bb9ccf7d2877495bb8adfec98761749398d6d56ff65874b51140193eab259fa74ab0e7078391a88170c6986f811ef56d20c3e5134e2b2e76d8bfcb1a898b86ad8558cd544c2d0092eb2aa736466d5059b3188d914b150ed7652c1c52c71848d63f79e39993ea6a1042abd7bd44840bafb3b6f173d9888e2b4cda5500b859723828643b1f3516a8f2994c6c986ceda244114b5250cd28d71af8d56116e3f177f9eefb7aca44fc4fc0ad721b8deb35d6ff9eff9329910b5f27baef2e5dd873d5c216e8399ba4cdbf8eb7de09750ab93a589e416a1d31048d5d7e507872e0b81e707e105544ec5d04ebd11323ec6cf46cd61338622a2f9e479c133ee8ae027e0cfad134b95036c0627affccd4c605fe199e2a8e2c50d26884ee677629d8eccaaaf8cbac5d125e4f0ed3499fa860e324b790b38d8dd3488b81d0d95282ee0a672a1574f6a4cd1c12e76d91379e41430ccfec66e442bf2ca063c2b0e89f446896b2d156e3318d1e6bd5b0b7c87bf6ce93e8e0587b504", "ac63006a63515263ac", 0, -323886620, 1537743641, "c1bed08e135e72cb08899c11849fc5d743a293cd911f25e55fa17d7d941dd768"], + ["38a78b2e038676c3d807709c824052bb1a966b32dd0cbe9a06971ba5a489ef47ccaedc7aa70000000007635363535100000d3aef04b1d04bb67ab5200bc97454bb8c6b5088e77be3fd1ec501c8317a3c355c96ba01000000000563536a6a6ad8531d772e4f92cacf5f5d0bbf2ba455a69d8afe7c49287703ae167715187fcc835b7a4602000000006b0c905202cfe6430000000000025200a21d7d030000000002510000000000030000000000000000517a0f0400000000b04d90b069cb96569f5032b07f733e12865d998af1a47213d79d2b9ed19df75b2dc7e352304f7aa8a93f6822d3ce6cf9dd4cb7f3b8e256af6fe1e9ebf230e86567d23a2e4caec7c3ec0d54878d6707a797d4a7604d55c06aec8da85d82feb76c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c47ddea858cb841e150bca736f08c8505e45e532153a3c336a38636470cd2fa19faba1bdea39e45e4feb02f2ca134773c92a314e499148048498784371af860569cd239332230a72fc798f0d160d0329cab8e7662eb5890ea274d08ed0be7989b9d75f9060e36fbaf68b5da5ec12c9fc5e6bafec4aa0334e96456ec004b52b1031a470107cff1c43440475c2e258fcbd1df7c6ad012fe26b99429eebc0d2fc4d10304e496d9569b63954fe4bd9475936a2ce5d2356d3a3c18573bc723d2a98f459d0a068c97c387680cba1861ea69419b5488f618e25e68e08528aeff25bfa0a46d0db2a79e26df614a2456829dddad1507451e60ed36d9156640507979a9081e61d102239d9f266e13547070b7dbdaebb80eab93278091936a7566e555c7e8f3b36adb0217cf4b266b08c2267fc8e25ccc256455f92c94f3d71b81e0fdcd0f8e55f798ac031190d9a4af33798dbb91f0064910c74cf581508eb5720d490449deb6ebdcc7fa0229dc2d515c4447dd44aa63ec98c80cac01ee2b51243139b6cffddb8cf7710afe02060482b34304325cb4fc39d14d7997d163d034b4d6711c1c0522752b985d2cf7e00c0b61f4dc0f7602def2dca1e77febee12a9cec44e1f9ef280fb95d0b00261ae3b25e03d50a26a0cb3ddc32a0c71cc5fefe5d8aac95c7d8beeb4770d50c3216bdc75cb69526814cb9f46a1df695d2c5cae5c793c63ca0bd5508cd86d947024cd9a1ca6ce66612c08e435e2b455fff198b7e92259b7f503bd421564ceb7441fe2060ed8703d36869a65aab297ac93d19324b97b353ecc8f5cda1685c3cb51c642850db0a6f130ac6f9001ddfab9a4931aceff8bfd0a36d553e0e4029c091d0b11a03eda8f9610dedc283fd31fe46b7b6c9e71c0b73e3f5c74691f2b5c480bb198128d41b28105cfe2eb9f2592735b50b5694d00070a37d5c194e95ed35814c49c52cb008627a967162fb4ca846530ecd5c9aea640082c941ef66f2fea22e241fe90c7fcf2e94901173762d166fd4e39ec4c92cb2d28f9933028ff12247d86e7f5d7833698a6857ed2da06343ccf4e99cbd173315fe361e46818fb6e6aa966d3863273c3af2f8d3c61bfc811bdcd425d552da00d846e9b54b4123305d63eedec55c415bd46167cb9fbe08c995b4878ff8d818bc0ccfae0042582fbe03fedbc384e126bacd9a6317041593dd505930821e1cd4bb011f708adfd63ecd8b01ac9827e3a1034de3cff5869b78bf40d0d883bfec22cd1b37e94b2b48a4f95643fe55f007f9e822f73fdf64561ec56c1a7312718087f7d7a05c5392144b33d0afdcf650b58efd118678e299867fdf1e87daef2b3ce2b6033fff75326fb30400412bd92800ace7df02495a1cf092473e77e6917a81df9037b5d33e00fcc7903c49d2262385dc9cdd23b89b2c894f75aab0ea0e796ab8a99f8cd2f1bde64bcb940e5b2f01c47807a581fe2806abace6df1ebdc4cec938981ad212445906ae71ea5b5ee98f35337fb9585c10726e957134c8380b885c5ecdd4fad2bfc19d59fe06592a1c0d3b6df9ffb3b305c80828a95adadc15f880ce19b91a5caca1d8fb0ba37e96bfd6be6cfb5f09c3ec2f08a6d41e0f550075a7bfb741f9f44d7ab1138d50e31c91f09b14d6f2af439015e9c5eaf12b640e5ea381a11300bf395c279cb5d1bdb1d3172ca2a652893c9d0b6c32adf343b6386eb132a4eaac258616a58d52b9e9f3e49725a5bed985fc962a55a3bb7ce73af0b4c523c05c0449cf2add5322a29c01bc45fa3700e9e0fc51e9ddacb24235165c7a87e09226a64ff6c54cf9779d5e835171e362e929e5b33182a67b21fecf67618d4d029b3f52568fc77532e44b090843cc1122b2cb3775786fdfe8f0a4f6cebb9317e55bc35e576ea9b3575efb3803488e27697e91cc51d5edf6911014e57eb3bbd615086813b244eac96ed8c7076856fc464e7ed58e6cd67770ce2bff78c3eb62468d70a29aa200d88957e2e08d6615115d6e119ec2723c703a08f2db78e6e322a6174df6b5fb320b3a24d25341e6d692cc1a328aecdc757b0588748e11dfae4e124e8650fee909c377dabccf246f87da01db1ab7e4e89947662e1d01fceffc38f8644f36bdf3f251c530f67214e3be6e52dbf8b8ee3acb51391ed56d97dfc245ba2dbe85b2b26de0e753ddb9b31e664393b6e8d90dc620df75db7f484cb575f831eccc7c6802c47160480693ad53df43bab729cdf9a811c70a2a4624e91c9dc143cf136f117fc7ce719ae99a9f30af825e97bb6ba765ad023be2b2384e48a8010140000000000000000f8e638020000000072a04fc7c437503405c6aeb7a896241f426f8b9815a8763c48834415efc933251b57aeb05a65fe81c7fd91175ee57f0be0927ab584a7ffee86133feca4fb5f0cac691f11fbad123d3e7b3f1eb662fa1dce49bc5af8b7c2e0e32ed4cfcefb6dd6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e43687bd6e54c1f83e3c0e710dac9ac0ccc186f228e35558d0dd7e70c33b656810950151f2c09e5ca08cfc0a4f19d8ea2d672f5d3c868571e49ee7d870447948b794c1c76620459394ce4bc3723d10c08b075f4356a11d2d4e3f935af477ab3ce4c707adfa2504aa74b624ce303d1bf2d0c681dfac0b8988fe9511b4fce2c44030eb264682aaae26e6167faa74445f0aeb42ff15c1100533bf7f625e6f73ea179031ebb8eb6cc0579e6b4637d5acf0ae21fb017d0d18b843baf3ee2e1a591096f920b08686219884fffd7034dbc65c165a7df3de5c24f89c02baefceadd02ac976b38e73add3bf0e999760039662b29b326a1c2ce92ee174eb39fd8260096719e4f50032b02adf7b6932f59aa4fa01e0768d579cbf7a99ee065c6ca4e0a84433bc678d3022e75869e03df19c7ee98d1e71b8e44a3be198c647d0c5661c90b1e68292d9e820216404adc943da876c846b8725e3922343b941ec03a73486f90bc11a9c525c1d002205fb0688c50b1e52f8330a4076988858063aee40891d73fb289d7e470df0ee603293e11cb5518869ad8f2d8c19f90a8e9f1ed41eaf09ab4cab4e21d53ea4c44691b3091d2bb98fe8ade0e9d4f699108ec32517075655ec89bb3cd4740487c445da10e26dd5f6b56ce186df49c24d11c8706e6ef573d24613e28110b2be9cd9b0325274ce7b18498d11286bcf32288f3c729d84f70d82ec20ab13bbe9cb0835d84771f32b256cbb3e96d76c6faf6dd1932d4feb4ffc76497a5a79b2595099fac3c7d271d9a50b54ddd740bd54a729944cb7c248de5c7b10f7c9665cce2aee7e142582fbc3f96643f5d5b4e1f65d0c9130ca85936ec750b24e963975215b32ad509a96afda4440fa93cde0e4019e98611beecb12f5bb26f1781f6445d8723507db476ca7deb51dde479dba49e80b271edfe4ba52f6d957a9e4d8eb3785f9f8bb1468ac4443bc0790664324841407c69d6231fc69fc772d7e04eb6981b1d194fc0d729a0c74efae8b9af41d747aea7fe3df0a6b6c918bd455dde72920ce31991fcbb08dc9a9357b3b06fd9ffcf93202a6108ca740e3b6b68c07e43737ab471974f66d8c8c7a615d87f5b2371dcd90174c9f36ec9139db3b319a252380391e4bf34e04e44500d74199d510800a8bc8e8b23c143a8bac86eafb47680823a03ef87119712e6c7b8246a58e64ccb55742e0034b0b6c1347d83cbb9c62d910490c9b9f7913c6a2f902dae2f02bd74cc8c20fe258d25401a775f0447b222f82b3f0540da07f33a5d7a9187c920bf654348865119a2f71f7d747717635e7038a9475af56460dc367d9d2088f224a5dbd5d90ab7ddc2b7afdf8460c49a1bb04df326bdad6692e1dd2e85272ac6989514dad7c6ca2ed18d586d579e741fc95dd613f720c3676616c9c9fcdbfa528e03aa34ec6c38697a4090110c3a2b8f1d47caa2d25b6a2001e862e29ba483952f06cfdbb6759bf0fd97b2f0206a0fb98719c40d80ace7544f319f7935a4b39cc82550f50921a041a8ee761bef264805f0a22fb8b5bc3beced39b9899685e8bb9d8565b588c515bda698997e62dc9e71fb71a503db0eee12e0bcc60b9fa16247a32ad5387f2fb5d53b6c44ab7d8e509d98542635be08ff8ffcf5b482c9e79312b3e44e1ad773eba3f3fe5ad30d6f15a49c211fc4682932aad060e4281f89eb867935c19a930d8242999fd077da0fcdffd572c874d4f134ee745b5127133fe66f54676056e6f65b7dbc92b2ab46d1178608d791b5285427726922b9e721ed98937048175171d704e4619e7041fc7a1f0839425948ee78c96f3312fba6b747f0ca7ed99a3999b819b4d5beb55e27894c65d8c01689741a221ed6bab4d165d7180523f0d4f3015363dacf53610cf8367f1b78671a627c31cb4a6e5879c0181b49a0f59919aac6e8aa34eee90043df65bd26dda3891e4b37b4560d9b8f070bf1c033d6e5785933aaf1ebcd55a1ce76cbd3461c1c7a94666243fd3c368e5555652b1945a537e2a51a470b681d2ec1bfb02fb06024d7ab8d1532d13e7026ec94eec266c061a329580bd60ed4eeb4054461c5793cc2897e8fa5075b774895187926573c6ac0bf5994c922653ba1aa56a7f165d85ce2acd62740d0c7b6afdf8bedeebc38f303e1002f15e471e6f17126c2e19fbd2f81216e16d0fbc9d8ebeb811a29f3808b88c9eeeffbeb7cc4f0e3066aeb890228c39f05f694e12fbda3516ccaab82ce871720a82244dda822a089b876174e71b46a501bfd6333473a24f7c9bfd939d9a828a7683287c22bad1e81215ae30500000000000000000000000051cfd4205460e48b5ce21d8ba2d5abd1deb1ebf1a2d316af1c46314526a2c8e3dace4fc0d22d594b25aaef75a3e5ad459014c10fcfa07056579ca548349d6235b2bb22ea53b8a52df349d61e05c10c5f48501cf49932efbdc385a1b80b5c2280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a2e2d8244c864b07dc634f679fbff146aa1ccec029434229af4253cc233798bb8309fc03ce8ec54c52190189f96d821c0cdaadada4e2ac12a2c3bc7b11a58bdd69cdc1e4169ccf50930553865a385d882494e3899f77539c0bef58d9cb5e326c532cb9452dc3e5bdaf6285a5b1e1865b318e8173ba7e2e88251ad2a10ea54d70200658ed2c57e548178128c00087a7534e163be7b578f8a58b95afc122640454b02026712f162ce735186f8c72932133bd6a3e8885b76b6d5b45d51cd9758690bbf0b004cc5736b8f5cd464cf361a20893a4af45dd1a9370a95c8324d0fe68efd3b15e88e7898bcdb173eab7a95a5517947de66ee5beae086bdae0af83e674000337d0226b31ecdd0c1a6dc9fbab54fbeaee72aae39a31f40caef6edade4dc998906e0d0310fba542a6e44640aae278692948f5e78065104282cfa8d3587350db1fc1dab20322aa257dafde9f56a149669cf41cefe3bde677f910d8b4a4e4ce270071dd882b030643a178c35a885b80386b26090ec27622808fe7eed0efecdbdae5ca7733e7300208de90697b27e621602d7f489500643c4a198accc0f8078b894834bc1553634285ef91f38a7298a6230a111e64c42e97f11c3cb9455861b71075927f1ffb0ce74eecfdc8a372bd89d88705907c656e38ef42e333430fc0e81ff86d9ec3ef043276fadb3c17f7c77a0a4e3bd70ebc5a26651ea43804c8c45384a6b6082ac493522273b43168dc905572cb90a98dbde88f3892445a8fafa366d6821721d019347a0001fb580f07bb3d8e73304472eb909bc75d845e37aea8a03690ff6bd213689543cc5c7bce88e6dfcf5900c25499a680afbc293b205ee6e2ad37f8e1e02f8242b03e15fd7c3ac0cc07af3f15cf9487c6e6fb65fc3808d6ae8b86a87360f2dde60a54f17914c6ffbf13e18e6d3a0b5e35a3613d2e58722f35478e9af03b59eb2128c48743ad2829e34fbe27a5b2e3034f5ab83dcde2eeae02c0140b113e6c829b43b2b9c212a2fffacbd4d69872c0a896245a51be299dbe2fb07a1cb0c9361578f266a8f092fa143e0ae1c3409456afe9aae95b21fcdd5adbfd921dbc5e2e08e600a05aacc3954ab14ba8736364c14f39b91c0710e96b7c1a5157face0233d639cfdab6802b25f4fabc6cdf924738b6cb0dd750ed104d0ca3f48a8db50b2eff6bef7661bee53e0ff2f4d7f114e245f865f286289d6f1e98ecfd179861c0c7a95a6b98f07b1dbde89519d6806d6963a5af8e489705b45503df1db903b37294d0baef1885c0ffb4a14c7c38e0fc57b50d329b6d5f1593f0ef877e43f9d1be657b7427a88a6a6b7e7c0f224ba0db85f8da126e5850a5c54e95c674fb9baeda86bc7829bed8d5114cfaf0db9823e64fdb904a3ebaf286eb5966b08628b39e21d02fc9aba3678e9330fe452684d2eed28bfbb98fed70428fbb59386c140f030b9c4a1d1387439a4733545acd931bb438804c6f387fb39b2d874b10c0dc88155b80ab8b973f3b1c0378cdfe1dd3cc4d3528443371cbdf5162d5d1f11a16ea6fda4e812f99156f45a78e216e15e1b6f484a341f7cac4f4c522c46cc362d178977f2651e6872c14f2744dae0be784a850ce72cf241e5942d19cb1edea781aaa22d289a1d905cea38e916300045825fd161747b661aef4c00747d20e6144c77ca5a0d17c22810273736fc5b66d93cb04763298bd7f591124588cc4e04c7eb2bf9668fa338c9ebfc4b0cdbd2e9f6b4cfe9bcb563306ca9484e0a3313c040cf095de18f38a2924bc69e63730fdfc4efbc7e9d810c0cf607b0cd517cfe81519fdfbd90b1fa6272cc0e283f167fe5c8588605597f9f6302839d533817bdf02b17e24c9a238194aec4c7ca5dd3747a6a4d1e4ff77bb693e76253c1313cb1059178066f0b4c19936b3af395eb72973a8e755b0bf1ad6e786e09e79259544549bbd2367532e64433de19d2a7d4c2f74bc9e8c4e1785e776ecae19ebaca8103dff2acd4fc3f44da8a7b7db1eee4d2a9e65d0bd46df3416b3ae085bb7c13fc77bb0224181c19f43613a8b64a837be636536167f40bc4a7e9867013070f13c86f443ceb11bae3edc589042bb9d1632d66bda68d84757135680825da99e9c7209948841f8d72a5ca2d8813f086533237f4d182cb2fac35fd71e82109be76cb4723f43e89b35af60cefb8b57688679a8ce3a4222371223dd8df69760286bfd290f46ff753948c705c7028cca248ead3d72e45a8d166864049a46995386ddd98d91ccca48350001a52c9906a9ff2696c09d97f06299cb771b7de0cf8df7c3a78deaa921bf55a4be8c4fcbe9b9e860d22c9b37a5e75a5400e283cbe3837468a0d7cd9b8652faaa83b736f5310b3114664fd62261a976c09b608da95ffbd32d5ed0dc9f1c1fc33fd210347defdcfecece679208e9c651aa0b7b996b5a8a03", "ac515300ac005352", 1, -508906326, 1537743641, "a53f087692eea3847fa20ce6aa3eea8d57226ffaa4f1f54b006ab96ae8ec6bd4"], + ["9047211e01d20367034d47dad57f7070311d96cfbbe1ff78f3249e6551038b77f65c0a5424030000000951ac6500516352ac00ffffffff014dba15000000000009530065650052656363b944bae8024ace2f030000000000000000000000005922df4cb6ccd1416df4d4217bd1c24fd2101603a5d06f0d8fd75af0a75b40441b44973d974fae65a92069023c48cf616e693317886bbd5e611538d3231e9f14588ae6d5ebd0a43957732dbb8250979d5c01af4fbb9d1e15b7150e167bc7b151000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b23fea1f1bb9b01bf5db753abf818319c0cab6a9235eb86df9c4b2f309135c0cf59b633949d195b14394a0f2b538ca101faf8b7c90122876dba9ad37a9338fbf353c7514e0d67389f5467f3615e9b124de24529b4855fb66504012e32cf6ca2fd7a9693af45d8e3830770a4913f5341298df63bde447bee5f1beb29c4da365202055bd64afd80571732ac4da4d99c834c0fb60032de7ac762c1e388a74b868b3c02219896d1f5ceef3ea08574736f218ad91eac19ff564c2d1d88d0782ac0f6b03b0a0263d24d1dd786d8f82b216aa2342ab64856b3243ebbf18aeac2ad5186be833a91b6af3ad9e601e75961dd7b76df20dadc6d5a2d2158ece764d867c57edf5a48031c67836837b03948c3c50c6d7e3c6114944720f12fa3bf12f78e62d8fe41b7520213cbde5fcefde6b14dbe3f2ce2383727c06bde604a1d7c360dc6927bd2fa74020301cd6de9e859b2f25dab30462307930298cd0a9c6c0a386b6bcea3749569073e0202f04e826db8b42619cd4283315b161c8d1b811ca992f131676072410cc47e01030288ab09b5144c52e7abb3476f906c81e16c055cd9a345db6a963ea830b5daf7d676848001bb99785f4e58c9006c287f36cd09e3d9d7e850f1f3ce4d2e18dea3103a8b20aa5ed6001280e5f2caae2c53695050d444ea2a0e9c8ae683a7155084303706e66325c563c75a4885f2848eadfb96cbbfdd22c91c0aa84d2837370bfe476f18ccdcc2e0ae9baeae1dc4f87ebdb94e61431df1fea079cd934d7ccf609c710fcce6537cdbf5feec3c405aa44fe579bcc2e6dd17ee52a6acaba644f509873eb71f5dc333773118c92d8a6c99c9eb42fdd95e3b5ccbc77015ed3cfb56a152f2eeb2fc59ee65dbcb3eeb2ae7abc96fa820f59bab0201dffa94651031c51a9741bca85e255722d5c3ec45e7598decf981bc709a6aa8077db609e3e17f97b263e374f462571325aab37a127d428b24b8101b06941da4260fd30b6c3ca20d91876318bd248a8d01b6376d706a8569e7e3d995d444ade62cd3827a6ccf1ba358dfc3570f48126504d82eab74b1be5fe1d16ef234779f3fc78bbb26a609880caf9e47dcd0adc126da71270fee202fbc037a92b22f704454a04053fc3d915f4d5534fb60708e687344f5d9878ef7e6f3c96df058d484086d8447aa43b4dcfa9dc08b5af4c4fe2181be5d8c1cbac31bee0e00f65bf7e756536e5d67153970730211801b03e2d4f5966798226d1e408d2bf0124ea34131f7f8446657181bdc3280103977844f874baeb101761814a5530343dfef66c20242dd2e1f5d20ad03b95ff88efbd68a9db1efb487848b451dad280c29e668850031e324d5efc277f03ea2c2e4b56b70c5c1f9845e9ed1ce05204636015e19a9dcc9206ad31c5e5f7734dffa657e155e95619c70f4ed42dbc8094799967c4ea01ecf23a503ce54d623582c062b393b7e54791644992a0928e33b7714e5cb5f0d57fbf335009ce16d26a1ac021ac7222c54f5e24223576e3defadced9bbd5261e52a56a8804b3272c2ee26822930b6d88a2d22c960094d21aafddb1cf562d477589e2739c21c82692a108729c106055b2245e9ea4c76f5792c7156bbfe1410ccf9037d500bf7650e9b9648d7f88e326932365743b06a4d3f6d70f552660cdb45e3a3de575bd2a26d2b4daa7b4d35c5881e677e758ad442aef97b931f8650d8605ce2193360a7c28cf6eaa2c694801c03457c3fc17e31c2c06e890ece40c3c6e2d5f199f9b11d0619c34504e0a74f19953c99709490c476daf1b95db1a120deb2fb5ddd0fe515c17f0a4ad5420f5466f34b004c0f5a170b4bfcc420d980cec733236d42e9e617b22c981975d2d7b1236cc42f7348b6f80d64d0347d7c9a5dff185bbfb5925a4e57d9cb92482afe5e1dd7b393050c723abac0ace48510542f1e54212a7b42507b1acea1389bae5b1b4af95676c8127e95ee4a7408a3be4a8492d0892fdc4fdb14d88f7738f2ec01d6a70774e1690f402a752ad69f58b866b48515a483b88e72d76d1c3efb41de6545236d337be4ff0b0002e49e2f139578a6df329db638be957da86122196a79046981b790d655ecd4ceee4268682cf4d807208c779d3b4586deb754a98266cae9bc2885c47bf6ace5edae1575416dfa9946a45393fd2333ae0cb289b56d96a8f69807b7b1619f070634890056cabd9ef1152182818bca10d84eec730fa5bdce47b4ccd662f6adf371e496f0898a9ac762fda01c8e587a1e354a4739f9652e97287d08b0d6068e35d86643bce520de1e1d65a70addfc2020000000000000000000000005722d2c8fe62079ee0ff8ad21857f8890251e2907d1bce95c6b908970b5cde3b08955e2d1998caeefe724a8bb7d2aca3de632faa9f946f193be2a1cf2fee63f27ccd7a78ec02238c7d5f2b267390103a955cf78ca0d2512436a7360ac7f4fcb90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049f9d8ca461023e09ee3cb4a9b4403ba75e37ab906aed894941d9026e1bd39e2c4a6cb181ce55128589dfe5f7d0a2745220ac5c734d4867202803df09756a7cd7315e7d7b23f9dd9d297c0b5220b1475e18aaf9accf3f7ae888b3c532e4d1cf5a099cf40d6e705ec1e84057083416a3bd29676e2a0a19302782887bd6b312c4f021e71345372f712bc29136de1d8a83d5474fabad84f0d10b94b80b67971a98f4202015e09d9b9b63c0837eabc9f204ff75e97340a1da8f2660d960ec83e1589c9190b0278e11c6ba883f2b89db31656ff8ee0d87046314cb351a81d479f36391ada5caa90c7f32c00f9eda80da8bcfcc56e1b6c23142d78337d42f071057c51781f950224803b8f9ba1dba74a727f48b0d0435af2ef73b887d35011a768cc19c40ee4bc020019cdd2eabb471dcf0eb225e95636a2f23d3d58d400a036526a9e291e8facf4022825cb2cb2b2a543a6015c8520e27d88e21afa96a3e6e4c34667c7cd17e21cfe030c534aa0ee6074a207eb4d98a1ba245c1da049442b94bb9c7df325eba6edc2b00307fac3e2b8c32b5b981ce2c5f1ebc902ce1ccd6a267580d24605ccd1c5bed200cbfc168ae991412dd52c0e6645b954977a5f3b34aaa158bcde146ae2dde754acc6a23d3e95fb9f214260fd1b9ddd3018568ad0cb66378bd845b15d98de9d79ec8cfbd6b068569589c3ca1eb2a45b52b7c7488aec9576e0a67625bdc22c33e89d7494df4c28835aa3bda4be6447a232bd9d48c88ce0c5e7a31db785a29d1a259f84fbdbf69fd08fdde336b0e8d488b244da0d3d3379d69d8b6cf8b962fb049a3691719ae89a3d36bae709297b2afc21c25ca2d9a9b0cd84566ca091b4ed54ea27c6d68a29ef1190502f5f6523d40f35f09614f1d0e574aa13a81c07e2bd11d1e93e08b79c5dabd3724221c51967f452d48b551a32382a3566bb186c12b067df5ea152ef4945653ccfb6c90fc105d857160741a921bff680bfa7b92b2f4ec45b81a8e3deef3f4dc2077d2ca28fc716b2e9c377917b6931942548454e3687fd9cb74387f5ed17d479e1d4ca19d705e806a495e612a604bb42f57cdcc6d802025c1df335f1bd8825726f32014204a46a47db4a2dc9cadaefb61aa88c89eaf8c9ef7fbab15662c71ea396def6679ac1f193d7b3cd7a862538f8895f779b79863b1a4ce170669659c66c4f62d892e75bb73e0444dfd4cb89c3880f4b95234adfa024ea2b6445fb30f8d419ca20d1979c48e83fc5364789c87b250daab9c2255a1ddd53411e41ef792b493378374c6d3474990b2e3f30f0c592202fc47d93d9b5ba5052f8b632a33628de71891135ea71a9e1d2df60aee0e3540d5fe103c09da0693276e6b55796f26acdefffb005dac9cb128fb30f8e390e3194f2b89d720e2d21b07a896e20881147e15cb3f32f7dd0cf92c9a2ee7769d9aec3b573f9faf7886722b926d825bb9abfb655f7518d5c6a28ca53033f32a95aaafa2139e7e2ae1120737c57c23bc0deba96770f8323d1cd8fd7526a6925dad8f139bf6ae7cf5299937a017071fd3d490890c71b67862239b4e94158c83c6b1d7798987b3a4be3a335489267c83eacc9ce2efd5a7188a76e211b8ecefd906d955eaa2233b681f8f8a97ff2c29b28a74e7fd4655a6456df6c6312a8b8b486a77a47edb4351278b474bee76369339173aa9bf1fd9cafae1ec5dfae77e4480f030d042c3187ee2963d5af896d83b8c5417bee0a31925fefe4f669855f3b4b1992dbdfe6bcc5732e28b7f1d00dbc66f9e30302f9acad7b9f0b1af638c73ea00e1ee4aa08700ed356a550ff43e5393653c6dbc8fb16258263a2c39c2edbf9030d0c81c8d65638a0ee3f3e82f42d53fa8bd6dcb49feed818621fe6c14dbfe5a75915e7d0cb609c02123506398f8a02c28aecebb046ad1205a50d2baae4d40f0871c08360910fb4c72ceb848e2efad2b1bd5811f1824864bfc889a2b8e9fd8d55d2f0d8df6447b6445b4193a84396049016a92b12e6f2e875e9ef6b418cd1e4e8eb5525d7463280d05ca8fd070d8a93ed91d63c1eacab786940292d039be82575c00985def482d4dbab019cb02baeb625e08e403582150b001b71a09cff42388cddcf23a931f393feb4726226dcc67e7122beb5ca1dfdc5d63a2d3fa27163921670c1f50ad73d33600643e03b42e0cd63e1591d4dd91a8b1a1e1294286c16dff783bdcd3a71588a2f62cdf256adc624f3819b5451e0e98198c5fa01accd8fc0cfbd5116683c78bb8aca4d8638a1d4de4107a8ce9f75d08ae982f69d1691d8c6efa2811daf43f6825520bb3e575bc96c1d71c993f02dc21f903fc28de0860f2e493da33eae990bb3b81c1b319787c090cd71a07e858ddaf479131acf5aa8bd6aa42611eedb74dec22be4512b2e93fd946fdd438ca33e02020f05c5822f6eac300d", "65ac52526a6aac", 0, 1579082880, 0, "d4e832811adb075b817033569e6ef1b3ab1c56666378f3977c7801094f0288b7"], + ["a3f49930022232123f07ddccc9e3f2c3cf9bb97af1d474bb428c0258457fe67c197e64faa50300000006536500536553f7179350ff2239485d3aa94f5995493d2b6a0040e07e9e2018d61136a82981c73d1f6e5601000000026a6adbacb76c01e5166a030000000003acac6321b16e0600", "6351635300", 0, 85048373, 0, "fb9939d7ac7e2cd4b073d1d79211e4b1ede102a3ede070cc2e84855fcd7c6ebb"], + ["3c4df75702f5bcec7e3c0af5eb1d55e7170aac0c3eadb2cd2acfca9401443840d6c490441e0100000007516563526551652eb00c6c1c7e318ff4c7b9ff97d451512b86b2668fd55519eb77f443d209657a23ebe39200000000026553ffffffff04e643a500000000000952535151ac6a536500950a9901000000000500525100ac15d09d020000000003ac0065d3b83005000000000451630051000000000200000000000000005ac9610000000000a3d5844bd251c74850d36670a4d704d7f6f9720609117f4a3dac53282fe386a70ca393747c88b3c160b672d80749b92d0534ed735f8b4fd50620758bd78f5afb2268c8b8bd80d9c8bf70bd1d5755e89c9e536a5303d3a48062ceea87d2783fb100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c6703c66929f9697e2d5eeab9ab9e51336e01f343e9a17451e031c4e88d664b691671ce55274beddf2e9a4d16a15178e175161f40d63cbc8fba4fb1f0944b3700ae79c771c1e7610d751fb77352b090353e9189ef8066ab96cc713531a3ee2a46ac5f8a1d723886ee4c95fadb174cd22d4b326b82caf3e43b34cd4aadc70b38f02100a4b4078eaaf51b5dfaa6cbc2e98018c250ca10c72ca29e0f70a230b5c0d18020473275fbe4ca2bcb5598a4373d980f49993f917fce74ec36969e91f6fe332470b0439c4efd5447089e816247588c4e861fb1a34e49d2e60bd0024b2e78934947e02550f7d35b6888caffdff9bf07df769ae2c48cae07dc7adb7b639b0ed01924c02098ab7080d7e5dea5a7245a0e73ba65785587ce492e8117076e4118f4cffd91103140dd7e97bf143885e2db6cdfdd9cc0e57a5f99fd8767a9baa62cafe1b23f579031e9e828e053e4012a0cfa17acfef3edf48542d765bdfb11b8ee892350fd6f0e2031038890fe337fc9806ded284a2866b936890fcda6c27a7a28c2492083898c4bc03067450c849085cb67eb232b9755d13bb77634e46e3ab3ed4106bbafc02f538a75b7c6da2479863826af256649760cac7711feb390cc56c760e9d64a59278d76cb180c2d52414945c44b846c1cec48432d86ec6c6cee2f58f3eab88a55f59fc86f1771d30e66d5beef64c3ec368fb09997f572a1e451ba1695ce74452a313015f99100ba144f74fe1d953dbfb4c15c3165c441cd9fd20169121f106ba9218efd649898d81b53da821ac76a41af74072c5d4aa83ad3b29815a4ade35a47cbfa140c9487011ed5a133ab1e2905abb9783bedf98773888ba6270c24513f9de44050bbb4632c614b1d146cf0a6fb96697b1b729618b916a1b6c2a05ff919cb646267e9800866c542f4bccd7876e7cb916c3db7c3f50cd1878a73cf09932b2666261e5b21d899c30f6099d967000425796fdd7a3baf6e0401813be06a22be6e368804d855a03bc048df3181179d59d3f3c9e70ffb1f2d9a60cf2c246fa902da531df63ab7d2d9173ee150c5f1af7044cf05ce7088cbd74c72b791bdf3899b3342edd8f0334600e9b3f46ce4ac84cb443853f7d647bff6a5933f0f4a2be62a835742b88a8bdc405a6a79b600253cab902309c4a81411eb40e227ffa6f969bc24fedd2232b7339a3c5cbae75d1b78a8bc1f0f3de6fe65b08bdcccc135d63f40bb059e2cc6570a89d98b3e1a35174fca15a94ce5a2674573772d1053d8e401ec66bd09fa6afc78beda46cbb377c8fb3bfa1ea7282a81f087ce2b77f9a574d4237f0687f6821b946fe2eb71614a47fa91bec38c943217a8cc3f765a2de114813727180bc97a5b777c618e8ae55cf44daa3aa0b9173136ec48719d5082a5741d5fa641d82f69c816c61a28962d4586261c748a9c740b07463d2d822b71f360ddd1e8f1c6e8fc1fbb4dcffb7e8d7aeaf7741bd172de8d3d0b499162d0f216dc0a64863f784658b228a96c12362bcacab3f2e2935796327b2e50dd2fc6356644c6faed61fc8300a1bc59119e55ad559e5e49a55377ed41fefb38782ca9b16b0269e8b2463a98261d1262123815e83b02cd0f23e469f2544d8320143f3ddac89c96e67003ecbb130cdab2a36707f741c2b24c9d330fcc2f0e4ae8624c77a05ebe7822c20dbdd871e28646b5d9bb40939d11b010538b2c24ec1647bbb9f1cd97c72aaba602efd77b68337bb8a233d75ac783536de43d634505ad7cefaa4fdb68ef209a0988e094f11b03078706d7ddfc252d5db3d8b180c6432632fbb6a461187e8c6cd7d55e0ad22e65e0f3bc6cf1f7830091c595c678caa8ee8ade51bac7310b1c39f59c0c0c31e5b799ca3504ed171e8ce0a4eb858a98950a929882d89919cc5843ef1263ca81964b4552a801881d869133b30cd56cea98973fdd70947deb16c51abbec0d18b4a28809c4aeefa6c17c06fea980dba94f858aefebf2d0ebb8e82747d1de64a0429635394307b42dd96c1905f0c34f809aa048767b0dde494754ee05a0588966cce3e4654229445710134992790d835fb05a3dd202b70ed747a5d5c71ad42858bcb5af772c9271dd2b51fdbaccc27de5e307e41305057ed9cb2eaeac0bd01dbc049d0372c94a5ba695ebb353c4468c94767179117809ff556119c90f6c3a3caf2cbdcc97a795ae023671877d6ccd891d908ea97e6c760bececde1490cf3ed831b7c0ec19015390b5d136f4fc9461e4464b09e284f30b7ecd36085c8bf5375f538712f5831758960eed472a82145587bd3bf720000000000000000c97ee40200000000a4df1bb92312adb6e56c31a5ca26e91a86e5940f88c8fc71526384fcfe1b04dc35855061c25fcb706e70d941421c1740c5ec68048b0c934f769b3289452d1d01ec153dca0992f807ab2e03e018d37298a9690c531d207be763b7c94d5773d1840000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014b0375864fc637700b6af8c8eb7a326af36da3eb07e919b1cc5ba82e5df4e45de7c77422821ca7ebec66e9a78a0eabc2f39e872495b84964fd5887db2a9320d1923e4aac867a086f6ea0e0ec7e36e9fbed330142d0b2fb123a3e4f5f86748e30097268e2a30eb1369346310ec5eaeef0537dff70063d9341bd4d11094dad3d7031878dbe6b12cb3d4efba6a8a63977a4dc660b5b73c4aee94fbedbe0df39ded3302204627b0b028560729e467df592ba838fedac53105fcc31d369d8a2dacd7536e0a032cb068361e9f4e04f8e101efd2a6a1d6e25a0b584905c954746a0bc3b52055989f1824628a621e4cc9ba79aa0fd6107a9aeaa987508ebdae533b0b72c7d7440311aff2928eccf5b9bcaf326b86035f84a05746697ccd96916712e7112b0f72ad030349a79736bfe472af0df9992e5b9037ddb5df5ea04b1d2ad9f4826fd12c292302123c6c9fc6c4514c2e9aa6df55ac26bf5e8fa5d784b68b5d6af3947068a16378022df91d6495d8304a1f641696b770cc3a58cb4354aa7c88b22f376421991b6d69030e5c3c56e72073b7bd7bcf02e1651f03626e67cff0b0643e5fda53e8f57c2425e4f7d52f07f43603c780fa088a41aec2a4bf541012f3c42aac759a2b58a998ff32739f1bf7ca4305826fea77ae9516ef71596291ae59db67365d444dba5de08d1e24c3adc0c7b95337c4ecdd2d89bd2e0fa84bff981f5d3d060deb8c020f0c90ab86bc913212e1eb61a5a897b7af90cd7188e303cfc2cc51b7b86f2821b864a992d2d01df6038729c5b2e427bf21aa7e76b6dd7428fe84ae14c553e6e24f38452bb20461a5d0babe67794d9b6a684221338a85b20b52300c074b0a0cbdbcaf40d1cd65f9500fcb42df2ff62fd53f05d07cf05654fae6b6740cb67ae06d9ebe9655bbaf3fe8248af28e95f71743423eee5c833254166ee83514cb86e49524857d5a1605818b200a03073e782bf62f252a74b290efee94762b9aab8ab38c390a4cfd4e1cd56fe5e8c241e306a27e8a32cfc5ed920b608017dae205ea5b4970ab9b7916c1cf98f3fd602917c8f68dee5511bbd5c3db0f5b2a96c07c107f641971c667cea625d2f5dc2a9b6bfc9f8b7211c3d9133980bc230841067eacbde0ce164c4c516a3830dd65b422b38c2449f6dce6c0d51fab583fab406ad6077a59698d1ecb43b6f054cf0f0636eb50228d6975771a23a459e26f1c8889cd0c6c9f2019a9a031abfcee859a2b8fe7eecb31c90d42c17592877e95b7f52649bdc8015aa02e5a6e07e459acd4c01536bfd812ce8089fb92e9acdc1e65b61ae8b4b803673363a90ebdd5897a6decbdd2595f18f1e66be3819db8306dd64d164867b6fc245cc585b0ff20630171736832aa14f1c0f3438deda9e49eb91a0dcfa09a23cc1241e2a6d38cface47a9b7ee13f7d14e26ca54f22f907e112e167d17f0871912f0f1d7401b035b740461ab6282fd95c51a5fceadc62b5aac447aa3193d3a6c70fe150552ad382031f749d899200c2e07c7cbe88eea6f731eeed7479f4ccaf6e8236f7398c96475bdace06772260675e1efecff54351b24e44d1eec0436ddc5754fb731b544542c189cb10c58f091f4a8732c3feb791af5fbd7dad6d185a3297c44a52d7f8e7605410923ee9510cad72ea8675f31e84ea1421b21b39d73c8c52cf7bc67aefce9238fd5b0d9ba9e432fd20a69e4b156afe27d6fad04ee90997eebcef182ce3967de9825731a7bd85c63a3f27e83f894dfa4be0f0f4a9b8db2e6d30e2b9754ce3983f02bd6b7d0deeeefc9131db5ab9466009cc703926c56ce2b9ec50371ddbe0c8671e703a18a26c75279747b0e59f619f39157fa04a650838deb7795ea1ad472eaa14f117e94f394ae73470e765691f05019f7a0c309fe8d636d1097952ab13289730ff35e6dc8797bb6f486817c91db3119106a7db934be035451f5cfbb081a57ec625bad191b178a9c5ac9345e81db59e87debd2ed82b5968ec24f8b3d08a6cc8eaba4609fa2ca366d6827fdac447797029cfa30e0963c79a01aff5f2973da287d1941b3259c7e5b6714527c8e21786f36cd99a531e16dcd17dc0477ec3fbcfddc3fc0f1141999196959fb3d5444424b271e9d8727ad45705d65034a640ad65aedfc3c2c0dc97f74c5173ba188a6c2992a5ce5b350d24918ce99228bd8e422d53bae70410f3a2193c0c6366650fcfbece2a1802ef49e001b77087c506202a623ad3505075f3598e1f8e19ea60ca8d4fdd12de0319e95c57d20c59b80428077d6e695c7f76bb5132a396fefa0b3694a79c2ee8a698771eddee3143f2d569e349c482f175f54d0996fdbe1e18cde1b61f0e79e0f226ab7ea95563e9edf8403cfd2d130ce994d779d70cad27c0dda4ce28b80a26f7a1a32e26e1d69e5b662914e5a94fd508dda71bb54e492f685bf04", "636a53635200", 0, -499873455, 1537743641, "b27b028f89ce8bfceae30111c2766965494d8b96cf369195df28ce64def7c95e"], + ["75639a420312e9b901e4ff27ba83d059559084bf32552be8672e457a07781bed68f5b638080100000003ac6352ffffffff388583892645a1efeb3fc485111d9ad421e7f69017a7fcb552f9749e3236147f000000000100ffffffffab1d6cbc0d87ccd6e981f0f176418ab65d690cc888058ee1570b52e9c4b1c67a0300000008006351ac52ac6300ffffffff03dd8b260100000000056351516a65bcceba0100000000085365ac6351525252762974040000000008ac52516a63530051512d9a8300", "65", 1, 390016172, 0, "2a76800a0ce6dbb360a3919a255f50870482aa5265868e606d8b42e7e5067270"], + ["0b07915204c73a57fe9da0d2be2efa1bcef1810c1a94c82e63a7a73a5c0d35cdfd78a1573903000000046a005253957f67fd0b0c0d6099925c976e15c8c4587301b2b8b134158ee89570738d725b612d522d03000000096aac6563ac526aacacffffffffd2a392f4da6f2118dbf01fd26ed32c08871fdb776b2a46333a7f626fa98e3ecf020000000753656a006500ac6352b6a4c0aa0d66ef659fcc4439949e08e7fffef7d5408eb810b98e7dc468a8435647d000000000056a6a536a00ffffffff04f7692e030000000004535200004dc60d0400000000086aac53ac63656500abae3f030000000007ac5252526a0052cfb2bb010000000001ac9c8a431c00", "63", 2, -843804767, 0, "96cd37aac21408ea03c4103241cf01970af79fc807e8412f23c34ed09f6364aa"], + ["030000807082c40301d03d0f5620ad22c0d571b1ebaad91a9a45ffd9e17d9d8330adc2cef9bbdc2f75010000000165ffffffff029c2fc5010000000008ac6a53ac51516a6a6b29e00300000000096a6a516552ac656a51a172493ea594d43e020000000000000000a328300300000000658fccfcba5e38e2efb45a17bb5ecf58cea3404392a362bdf6dc0db9429df09e96b7e0921cdcbfc3e8a7563c33b4166fb957687279bcf65fe7c180bbdbf59dc120c4273816a6c2acbb03460e220e0e7f28aefa03c10bb26fe22ba88ec8ba604500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d998ba29da849c3c2e576a04905d010a112937c4fc8f7a3113cb97f24e475f2e1685ccf83ffcfd5717749f1d5ae5aa95d156e7dc11582dc17a0e51a374fb743ed2ea48e43c3bbe6eaba1877a153989fffa7069a3b5e5d9569ce4a1cd3995aa56aa31a4faae106e98205b3f8649b321545926840f7fb57882d27c632d453757e1030f771e9cd375d30c3bc395854c9906d18ad4527faead5f59766f68072ff6f3da0323ea73a72475d01544fed4f014c9860d7d3672843dd25db8cee2f48901e5c0d30b04fddfaa085f32630d50044dca60d47f514a2d9187f8f5ebfbf03e067897a7cf84ffd10fb836f573a1fa312a8fd060e092a856c0a68f8b27d32a718301cbbf1d0314dab4154e48cacb84a3a062ba0fa5ff823821edc27d4010b5d137c386fcf4450230347d518a9fea09100d67d0d822dbf2b03c5b9dd670ae9ade7f4dbfbf3f60dc031b51dc330ccc4663b0927fa9cd61d7a77db5f4735f94e0b2bca2ad03af13f2a3032c9036d36e0c69d636764769794a661ae7dc22b7bd737641c4a39f1f35eb62280210a93d321f6299fe9ff4c29f78106a38b9b78ec89e918926d11cc77f285ea4f827c480d600c40a42dead3ab65ebb4e790221e8aea99e243d8b1a750f359cbd3577a9dea4bc3072657ab15888df637b6b6ca491e4765fdd91b803e9e08a363873a47d1e117a97b1c57f22487b2b2f404e9b8d70595d506ae7b4f9bd6256f672bc664e86ccb2afcbea5814c7d3d01fa912945cdce14e1eee9a961e003cb9c4227c59d0c6f0741bb296706d81afc748d73467f737c2ea5d04b1a8289782d143f07070b56c972b5866412b018384d44e6cd1cb9940de396e3897204fa06f189e50a88d07234825e95d9de86d0f4e28fc2a788e3775f7a186ad677ee74fe0c3de1615dc69601986acdb6aebb707afb5ddd9ca00fc35da3aa75fe1330189f3677f73a49d3eeacf2a30474451c87b92dbc2fefa8e35b6bdc071910c75454daf4c2fe693be4c6c878d62ff1ca158abda67e677c8ec87785452e3113cdc20510510286ab5a37afdd7e1dacce93119569f6f7e4947ddd1aa67e7cbef13b8d8aa66a57ef80205aff412137b0d498598e5677834705ab8a3baf1f429d23621ea23d044d881eb872b1757fe83a787d18ca3d6d5945a01eebcd7086fc7a1db4ac354d33d43f1018d0d7c57073c25579a5e779e6292fb05cad3e905f561be78c3c472aad78015fd4b8bb40e823d9cd2f1c4e741a3123aa97cc107f1066c450e47568281b72718976409d5d7c6ef58fda815bbcf2deedaa16100ce1299ac53a920f0e09e9dacfcaf052f9990241ec6926a47be7586336ee38b7badcdbb0187fd773a02896f485dce9b0cc4c04b020d465fc822b08d82cf4c54bf44e197f062634b87b05abc4992acff211362c04d1c0723d82c0310ff2fbd08eb69abfc2d2173658c646644815e879f142f5f81c04321bcd15c8d942cdb1cfb7a3851e31b2105c89e9c187c794ed91af2dc7ebc23fe05564bdce54cc8b5ba4611363985fc576878e356ad77912712ae9b2e8c0074f0c031d3e42de1b8c9e9f73f62160cca1736e96c568535ba484cf378345ed31eaf76fccbb4ab95010b903fcd70db23e8b578ac0dae1419298da7b8872953a22a533a3fc0f37fd2b53f922eaa5be84115c0d4c010fe7edf44af62fd8f9f19b67f30f06bd9f13684eb9a7539c0bd02fa99d3ef62e3d7ff0716208caf08de944002e1a5ed4422cab5eb5ed25874aa1877fc1c1586c4d81f00eaba3598734a94a166c613819ea18ad537281cb69e962c5d1faecca61f32f7b3b1645e2928fa987ef77565183aa11829381e3166b167d975523502c8a86a5032bbc69ab431ac3c166a2d7323af5658969832c0a49e7a544da13d367fdeb57e22942b32cf3f8fcc5c6bed4d93b5d33ea95d2084bcc8800c5bb68858cc83234e5963db37b8d163c4edfe080da2e2c51454fd80e92c85f03106c5bccc661978e99a718149291481c3e65b824b0ad531ded53a0074b3cebf985fc4e3ff161ecd8742fb634731710cfc54e09d9b948688638692656e4d504de60c90c68b67bd6288eab1bd7db1b469a286b024da9e22cd53394795fc3b0311f5d48000dc615f1b8b0e9020a080451b8a478a2a2ab5b7794e0f1bb98484ef9d724fc30d45ec3138e0a496098545488d01178ba5b53166f70fad7af8fde84c720610850518b8b87672f6eeed9df8acd49a6735474aa33774c70ba5e4c288e77dafe6ffd423f5b8f4503febf2a99c92fbc06830a7addc362a2351d92c04379eb7271104000000000000000000000000fdf4f2b093b91d5a548a85749ddd71eb27d416b938294dab8760c1fef76a228d61161e82e681aabb471fdaf26ef06e9997ca204811d0b7e128196f99693a133d1ba51c86904efd68d61a357547d4ea7b7aa681188eb6fbe26ef98674992f3ff30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043ac7e6db40eeb50b9038f4264adeb4c9a5b79bb03a538b33f9d8a7b0be442c634b660da028322606fe18126ac9aa5bf5fff629f1b573ed2387d4b26791783dc921bddc470c7f92ee3f2295fe70ed8edccae8731524f9070fa631adff3401a84230b8df1afdde08a924e5c7657e49ef7fc1a03137bf73b2c27def21b983d4a63030372e44509fd3b3193ed9f1ccbd60d675d506318e7f59ab41d5f36b524a84fca03255ff3564f28b18789c507777c308c02403d178e86a01cde04bef698859ebdc20b01646bbfb147085cedbdc7d4851c5feb1a69080bf82308df5388db2df76abbf45affc808dceb993fb099c646564ab8f7d753f8a80fd0b3d2b4032880bc023b4c03168a2c6599e1eb5c4e47d6d127fbcd69346e64f69fc0a69e40779518aa5ad3f20301bc395748d37968f02410a94730346d205a7b95b683d9a0493b8ff9cb326de0032fcbf98a19979181e25882eb83e543fa7af5789c3f3ae962774d5bd505013bca0227964cbbbe45f6006447489e80cc3fae70a7b720a2c3961d36fa8c64bd8c3ef102089dfc8fa4389d344331f0db6cdd8d9ec0347eaae355c69b83178facc1e293929d215695ada9dbfd4ba35b4606a177ff847c57c2ddc316d48f8356e5afc67d9f520cdd9df5b6b396389cc929888c2924d7e255c5df33b946deadbd4d90ed5a2871ef721b1443cf8e10888d3cb2a33d6875f5dda485d8719a7d2829d803a973d5e9739374fb0f5b9ffa7b9f775ab5e38d25e1eb65508e2fc2baed4a47e7249f69479a2692771dbccb6ef645133c479b2d9a2b0f830a75db3a21670ab48ddd7f4af2cccd4f593c4e7cc181482b54e96ad12b525810fe8c8938829a5fa470d09084c3b165adef6d8368efc72bcb8c78e8630e0a4dd6d3ab27104623458f67074dcdc68aabaa432c1e66ef349a4e5e8896cd9e6cfc015ffd476cffd7c60e079b011c46bbd706fc215451ed7921be07a8ddfc12e289c59a8249e178cd4cc85ac115cd1976dc28dcb78fa1071f36a4630e31e666b1e28b31c3cc45ed94e030dfa9a184bed43a2f09ad50929fe45e00fb0edc721dc4b69949c8696f174bd705af9bdcfb5bd5fea0636a9ca26369c1cb24cf7b0312bbacbcec963dff476ef71e5f7ce762c887cb5321e3d9581caab677692115f662a19728fbefdd15204b86d820a199471a10e3e2fa6cab5b77557ededb8a4ec0a5f0c1859e0909d27bc4ac38d11c60771c863087f85732413c321a350d2f97f80b49bb31ef635aacb3c03561f4ba8cdb6c7c8c6f56a59084ee308300e62ef9d9ae45274a7cc4140ca018cd048d785d60972c84bb462b2b0887871f23f0888b7288f0cd477a3a7acfd0f0d111bc88d10006f198f3a585bfab3abe5506d7b022362dfd3259ebfd59b1b5306d252f895b390030401539bd64c6d1dc060ccaa5a89739ad439cf433f601402bd1f0872e9e220bad517e5188548b3a52f56ed6a9f0c2669a78970fb8fe5f7e861225a2c5f58fca860efc96a1829b03c1ea28671f32efcc1211dd28088219ed4be33bcf6c5a5a724b2a0748c3323e2b5148d7a18d7ca1bd4f026622e6169e1e9e1820379ff7ddd1a071cf680bd7ebb9107b6a4855dd75a1e8092573601f8532d29980ed39570d9c235a53c61fb9f20ccc9f1c516e0b710dc9ce3267347e45d415ad6ce448bf1c21880150f0cb17af0e803f2780456cff926bc71c0ea681147f9f63412ee6eab8104e69a113d0b6e80efc9e6010b27e0107ec98a62a4577d5a46533a5c4c354ac57cc83a1147189f6241f858dbdccfed0a8b7a2d010befe4f2c49f7b5d0685a61161ab41b5550a9c9e1e5e4474bf1a9c5a7ee16e4bef82bad6a3e8819fcc17acd7d325eebc1bda32c518beb10c607fb951484543d97d63cac6e8e0c8cecc064738343cb4dc8cd9d4f0dfa6a25f65a997081beea439d721945eba3aef5dc3642bfe281adfc1af8546cec1704a482740ddfe992a335f07bfb3e44d808a9cc94f1d5fe52fda6d21ab9d0d40bffda7278c681f313f5353144a1302bac5698d8e15201c70b43991760be07e0977a328cdff906d44337cecb5e0fd80dfc7f9ff256eda72b4f139b010707c70fcfca835eb1a0319df57860add175b9a9794842cc84df055aad0e09c855bc63ab80f2cdf1f9c2e67b348fee85e9d267f6bc60c634fc5c3b2bbe09c8d6778cab8df945766ff6d58c2f020444fd514187b014bbf892d3aed16226fcc3f895a47a927e3ba91ec3749107c3cdf5796f51c3b5d1c059f74427968114e4cae7577aa82d9072c3120cea77b257bbda929e76f81b22bf7be790dacf568546a64dfef2c84673f054a3820f3f0a781ff3eceafe784dbca32141f9c2b9d04720b3369b407ddf76d6a0cf614b8ff2e0bc779f1603880ba7a00da6d832b845d083e9c374481443a7f9e7ee3e68539e0e", "520052536353", 0, 1088406930, 1537743641, "31739c6edd5b11b66b7defecbb7ba0a5d85822f8705e18b7e8bcfd769bd3fe3a"], + ["f515592204fb960bef2e0f66e515d3e47e486d52b603e9567042c6aee4cc44c80945379558020000000451516a00f1f27cc399bd14aa62e365a95abdf44051a7b8a87252ccf28b3d814434c9a496eb24329c0300000000447245735130f7394cdab8d1be31ecd384a683772d77839aed9bc704385f238d23679b9b0300000000ffffffffb1da7ca943c7c84b5eb376149ed62457328c91ffdaae3afc25244be5cc1bd53502000000096a526a515152535252a2d9234f035f9c02030000000001ac39b6dc050000000001637f7e810000000000036500520000000001000000000000000020a0d40000000000a91f3ef37c20af62f1f7d7a83334fe46130059a5574f63dd9d1d203d88141e734ae6857c04abb1a18a4616c63f62cf8177ed4df8688fb4e7376ef2cb7705bb6650313008e3480def99107acbd3d9a80046fa20d3d4d23c6c37c753c8c0d9b0e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008f854b313c3ef84565671c29e5ab336677cb078214839bf39b11d3cd69964840799934384a7f7b1bf6d1510065043f4953380c4a32cc8dd48cb43e2b6f2a799d37b7346ae81708cbe829d265a8bc75cfe1ab960f5d81d972d4853c84f6cbb57250efbde74af3962b356f46dbc1fa8f72c9c70c1e2a66fa8bf8bc40c57296884030b7c884d2481260bdfbe10cee294ebe441ccbc530c3006888a8f82e3b95393f7022b2d6d5a5786b11a82de8c9f89b927081a0353782732980b0dc3f91d0417469e0b0466ecc7a3312cf30dcc9941afb072c628d88891635cb9319ac8121397fd5bc7b19530a04e67e1caf55d93f1eb39e377c5b82659854b6f28359b768cdb53a016022c0177d840e8ffa3ec87c020144deb0e20cbb3a5c5e4e897da9b00bf471097ce02210ea55034c32e66760b18ea7c5bbed6da6b5bcf3ff329192608a3adb0b6e9ef030d49b32b8a3134077d7963aa4d80a7750a27e7a53bbf5cef0f122393b22ed81b0205c00f21a116c69c6413aa9d51364b0f2fad341a9fca5e4701c00856e34707bb0206d7446200174959ed1381407799156bbb11b36d46061f208dbc92c5fe03e8428ca84152e702f9d9e00ac926999f6621f6a63af6102f3d2010dda80eee12af4c17f5bfc26e4f55cc5e0669b5488d81bff2f1ae990b0bd7132a10f0b0ffe27a354b4b543c3ef943bce17cf27650f25384142857cb438484152fb477190ca935574f0e25e7e1e6ff8f794aa05cfcf07991034b951654c7014b4a56092a0ac1da250a7ed251dbd16f83f2fabefe9864b2dc22808f948592ebc45a601188864e175619fb322227c9f7708489ade8a53764d293ec5bfae29746d90857d5840848314d36129d6ecaf4bd0f2666fc452e1afeea4b09ae41fe2e7ad1792005dbc9dd540acc67e020e3355d3d548278f7c25966b42648f38c2c1ceaebcccfe04f2874f5a06ca98abab13597f7afcbb31e72c9a53f4d32185eaef8c3241d51d34715620605556258a8fb2284e587834b8eb7db20581d721bb78c72988cdadcd331b58a259ae7da54b1f00f5747daa9892d38c0494b2b182e38803ef20abd3951e38999b493b8d75d3b7acd1d3aa406e7abc98f468d7b1186657543b93460fe2a96a7ffaf1e8121d65125b359f9de0146da4ba3a3611a6bb55637690e8dae0a441bb1d6ea500019a77963cb88b074496c96b81b03e0595976cc9f0f8901cfdb4bba0ce0c4035d6307922f175aa479fa81d2a81687dbdd211464bcd3ba0895dc85142c874f0a1e502caa175b4f33a9083f59c6009717366257964ed67d2d2620f71311610b15cbc83ef69d5b7f38512fac23c2f692e693061707123edd58c864d02f6a5a9aac4179900a3154656bece08f27747d20b309f6b236b60f3189a7813a4c685cdd77ea05b08cb26ebf0e6c9be8f39e1386b792e49ce618c1198c0d92ebad4747a7df376243aaf457e95b927794b8af3cb801db959b2c2cf545f86556478166931e7722ffc28a3c6ffdf680846ff00d066e31a1f593cd08d925165ca94b632534323a90102f28947801e610c9298297701e286b56063f4a7ce3518e8f9af2f08bc5a696861dd087580b1d7ed48c1d31729f5b8014ed2bbd945c63e47f1db13269f408d9c3c837469386b937cf10b7954b2bff8cc0299727ab1aa0bff11d44bd27df29289928b8a36ab36d1f88679806ffdb6542afd59d8bd53333870553c354fb01cac98e1095fd0b5af0f6a6e3a9f2fae645c8714682dc7940b285bb52ac9be146adeaa4cae3f0af6653014cd423fff79811df4a4ef55f7d7e167b223ed4cd1402e15f51423bb05be4524b7e6de50688f1fdd0b4de43e8a2a2e08c1795764a9e7ada3e543a16d4c9719747a5748113112bbbc2ba86e2e2b68c9252a0850029b01235ea367434ef6d4bbf7ffcbc3ecbaf4206719fd7d6b245aeb7e38d32d759bc452a76b1c540ea40cfaa02f59e7f502f24b5e4442b7f4f849d9a1ba81b334fee9e588f7fac63eff63a60e4125f5aaa53b670fd87ea1536be0ecc075db2fb17a20f555e99ea0f62f482630836242684494a40d52f3547935e9cc1f8c0b08baf766f74896f758ba4bf7ba51b273f9cdc13303e02f828946890fea96cfdbfe085c73f8f909132f8315a9956d5ea3f8cd83b6b6c642e2d480dce4f359c42c4006bc2854c9318bb90543e6dabdb5c9c02b9013d5f13d265ba98f7f48a2dfc6927b74a5eb83189fc12a409d898cb8b3350bb4551c2acdfb91c4d8cabc770b23ca1d02dceaca51c623f9dd0f1bebb25f68cc658cdd4dceca977b17877a4b7482e0e0c92466098329f6bf0abc5b957395be6717a90d041a884c980cbdbedd5eb348e1f2bbfe2b30c7cedf3b199053b1aa9d11fec83c17c838ec63d0e735bdd1f7a220a87679326ede58062f6493fd32b7b27c39a2fcc5c06", "000063", 3, 1558932383, 1537743641, "3142be52c7c29110c9db7f803178208f206c6b0f9825c06aebd473c9c701bc7e"], + ["030000807082c403025693df0520e4051660a68c72c9aece09973a1eccb3bd39d403db999fbfd1fd3b01000000020000c41d53644c9582baffe09e83e4eedf8c7ea368235599d78f3e6578bdc146240bc3ec5fd80200000006005163525152ffffffff02aeffe702000000000300ac51e4a81b0000000000035253ac0000000000000000036266a404000000000000000000000000a273fddc5f823e668b336abf917b433f033930a91c4fcf0333f5a08db18779060bdf6a50d7d66a50a21826b52b3d4c83f34e3bff4b1004e5186d9e6be8f0047a59999b772f9dd10482223a871dc44e83beec055c42f5cc6dabaf4ee476e4afd1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003a232dca8e83e6ef79ad8f0f8bc1b8d1e11cc9df7ae80e98dbcba1163d86db5207b664958225edd6886d2af3d2072a4f5eaa853fd0462aad9de7074cc320b60310b7954af21f396387af28c5bf6a9a0220a6aa9e7a82f14e6b3b5273096b846f1513fcb5009dc81a1acb8a01b74fdeda8e45efc4f601e223370bd777a5285f88022889dd3f7d61aee1a599356ad2d97127623b098b142546b787e87618c17279270313ac9f71f54c156b4bb4f33606bc7df7e4f7d7470baee47cc3c0d2d9106ea4b70b03a638aa73c056e649687f18daaeb713ce80d86f6205a483afc8794f8f7b9f7c1cbb5e262aad2ce45b0868d3ca88461b16ded2811270b508a247fba4123ddac1031805b51f378025e8299065dc6f4f4914679f9ddb33a3b1524e41fc6ef407546203054bf685839718e21b6572b58242944f648e1ddc554c707c72a8c3b7065f49bc0313516cd852c638f9bee7a6d1a7ca3b593f32fa530635952a37bb39c1f839c0560218ad514002019b2f538feff8506cce3f440d559488e2b84b6f68f0816d7539dd03093567cb0d880ed99420dca8c49da9530f4c36958fd8264a2d6ac4bbd129a8f70d4de13a4fdc3c8d2f4e1c7b8d95dc1fb9c4c6e632b3bb39aa371788243d477bceac58efb17dde025cd6df83fed60bfcb9d05e51be002d79f97911bc621fe0378e79bd8e2045bc2340af832df5d0fdfec2493851abb27ba556e0dbc44f48e06b4b78078ed6cf5d8902ad54eb7ea1277791ccf7c4bc6b7fac0f3871b3561de9acd3744563cf6de945d3ffe7cc5e504fbe1e45a6911ab8cfeb559734e1fe17e54f79dcdcabf0251380a0222711e0347e415b44ce8d28a2b963cecfb7d54b7b8426cef3f71755f58978607f5f176311b5b435ab67261e22c16f7355ad44b77ae981e872a3aeecdf71bfe612c95c9b86b2d3ce4231e56fd640f0c74c572494673b4244dc31e42cc27811c730c12fad2db630d4f66a0a908d03973c121a91abe02456b6536bbcbd0519648352452cf2573f8fea5c9ff2e8cc7c827195aa46915076a680cbfb852fcdb08302c1fb3518fe85c7ca35ad6fee364afe821da8fc2f70393db3d0f83e8504fde519ff2c1a216eab0ac04806f34bff0288b8541840f7600a716e7a29f8ce25ae7f9b18467badda7e7f08775a44ebfb73c2beaac0461f043e797bb1203722ccc84e1e685754f3b23dcb184b87f7d2c62f679de929f7472a4a796f32233a8818be1957471d2c0d7a1f74056e33b75d865d58b729e500bc44b521589777e9a70bcce4596a56ec4b771148cb2b54958925b0e89ef42b394e1cae736ef433d43540fb16fc32b02f3acf9fb7fc1d16a8ed11b83d5b15791a73dc8d3f27e34c067ffce8335579cadb7e04e44e6c09c9f908608bb682d8d3b4e07789becab758df8bd715501ac92960b02aba830a0548d40e3e2b4a6895b67bdb8bceb6d528e74b9e7f2caeee7c9ccacf20bdbb1e5f895590dfd25c8fec0030b17cc9ea22cefd3231a785f24fbc78a3c1f77777b9e5415f4644b6e6da4af1114aa9d2ef842eda7c427c13fe3ea735bad6f6a3bd0b1156d40949fa16639aacdfd5d3499e9ee58d59e21d8e0595f0f5080aa69dd5c5d3baaa5d19ec032ed6891ecb677427f49cb6e717ade6a8da66ce417510113fc651bdb8ed652a9bb4fd0d55524fcf88a8a33c6016b1605f8e5c98a8a3e9e3f92d99003cd9e1087b68254586e8e965ba5c626d21a167c34ecb4da681a032ad3b933f758dd3cf99247c7ccdf0429970160bcf69015f3842d8be9f20614dfb43602f11f91a674aa915b30d96cf1546f024f67a507a0ba948783d4805984b631a4b20fcd6710d2a92f14d2160794bb769e94cd473713d64c03ccd8db3b2347c01d29ef8f384c52484830a63781ddc16ed3141df3aeb07c867499d751d6b30b2221940204c990c90a174f8346463c6b132e92ad13e8a565fe3e1340674f66bc30a6ef0aa1b80b3a57a96178277c562f6802203c0e086f7ad98d8e9aa07ab19401729fb26e2e16b9162f6d07cc76221bb3c05d2210fb977ddedf90e284a5bc7275603e256293e8681e660a8bf94dc7202b0a8992225e73123c7b117c4369130cf682fff1fe53d732b1d4e7de5ccb190341f15c829aa774ddffad886e46075f40e0d69e7b49056ba8f5fd48ed6d4997af822e3b3280a2d58a366d6c0e86bcc6a663541c83a195e645243b6c620250fc2d60624cafe5aa5e934e7aa562c9563e76e407a578f764dc5f644c7c6faad952325201763acd25c3fd22b7cc275236922014594b59a00000000000000006216ea04000000008e49ef9dd27759255eba59c5dd6de3bde7c3eea048e54fbf60a9275589a9c4b9079f89776c10c7b985653b5da26bc3a87324180bd3ad0d9eef5a71499f466772e4c5745e12212a350b0708b6eda20265e7d97847b71dca8e275deff32d5e828400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fe065f4a97f061d8dbfb5b33285da9fba7cac35556f35d01868e5593de1941320f7165fe016c226986d6d2ae0ad1c7651dfdcd67f5c7a1829741ef83fde9c25e7ca955a1992e7dea57c1eca6bac63cd69c5e7be830f38ba551e828c48108ee3f0ebd1249439b0b7962c5a0e2194ae8d4a4ae7be89984040e33e42091f854f3a402240168568de0b2671c1eec6aa70c821f9d841e65dc1a999f894a8d34bb19603d030eabed1733a02a8d83e2f5bb05b37c093cf7d96a34ebe8119d23193a70d21f1d0a0351fcc4cebd577706b40e3d8f188179e1a40d154a15aeb77005ff9ee2d626084ed5aa98eba5168d5ad56f6977cc0be573b6c6896254f2391c0e22524a18e8cc032621f1bd87da0e5e3da62ef80acc2397ac1254eeae6f52c4b6b9cc8b4633c5f9030ea5b0f904e22a58be51a156c6ef59304a013173b4c9ded07d1ac7d26405cd8c032131221a3c15487bd76d6d347d82d977448d2dd4be2b3fb9150f1007a7fcd0e9021265beeadfabdbfa1dc0477f9e3f3a4de7b618fc0a9817ac4e99b0453dedce2c0303faa48830d82570e6b13fc291b534481761d69bdb035b4d50c7e2734211bdd72d8cd7014a81055308dd17e391fbd102cc1012f7dff6c6d395fc230570b4d4dbaedbe9810b2aacc93579daca029a9ed39301e6574220a1ea60aae647d25f9d34aadf719446d1df7c5ef282ef5ba15ab84cf23deb556bacaf9a2ea072617a027926ad494673998a5299bd584f327c29443901785cb43653eb822bc7e202e6c5bdc2b9f0bd8b33fb84e2c166cf4a3ec8fd85f0784a343178e1f72234a9490b1039a762eb706635e1869761524e6ebe6d6bbacecad2cefdc83703caecabef8b462593cd0d016dc452012cf7de643e5fb659a52fac541bb075bee3d97650d7fda75d112961d4fa80cdee7d6b5ab73aaa19721f44bb3e885deafcd2361c22dbf56fdd5f413650675aa32ecc6052b4f24cd0a6848938108c3508040345375049d01d93e76aa32b6ec6c8a65eaed7d9ce9d95d42998c3f0c8afe1ec550a067aa11b443a290e052ad157e4a60289a8f804d212a0d3916dcf2c2e08b323192b41c85ee48bd88b20e6ad01bd7a5e8ebddafa9d9a66563285c1433385c9b6cd924d8be632d1f00f079921778a798b34698ead6bdd4b4f67c368129f5dbd64543d6a1c8096b3e26de041d934a4e27310b1893f518d2bb5d40b80a06db88d0210f64f5c5f3a666d67fea40c798c71418c14cd9a80567815b8160c4a5a47fc3bb2ff41da9ccda38b9b9245548930c31db59035d94f12dd61e62e83bf6cd09b61550379273cf58d2f0ca965dd3b62c5a6b9d153ed3ee560d9780aaa7c6fb3f2f3bdacf376a58019ef7f150160cb3a467f20e6db6ea0abf4974209f9bfc4ba62295a23b0718e0561ceadf2e797be2072e2758d68cf6f2e9cd704c13e08ee5731b0fa90a4b9183a25154e2c43b09f0be3b1fa48190f891d4778ee540a2c02d635b897fac6d39631bd29ac8c48a6e113e0dd518567aefe8c2d13025faf287a357d187e60a24e6f93912d6fd72da869989a38f5df8e510107bc6adfc92aaa0f31231c0a3433849849ba526f0005b8571a9667a087df394425977cc8b5bcea379a9e7a4e70f075b74116426e2bd60c824015c0d99953874114a484c3369eb85e320fe6d9f81ceb4b995abd60d154e92e3a40693c9d9b06e814f416fff1bfc952cdbc7d0e99537e1636f31aea6b97cb53b89af7d5c77fd411836a1dffbeb5a149fa45abbe768f7f5abcf6f7aebe975b576e8ac18a2a3586a8d41b4bb8820286c9bc1f643fdd31da84246d440b0820d2d252173bd674cbb3a26626117ef27559002a22620bde9c58cabd6533e45dc9802d0809c403b6ae9dc8ddfb3a5ec447fb3e6714d949cec9bea86058e0b3e44b706b474b956f592ac8cc407a3a7a7c7a911e82694fce7f60d2aa153fa3bfb134c8d5b3929dc78958e9ec0a2706b70f8fd15036862e984f275bb30fd77fcd45f953b36932b8de5e3480f87ddb7cf4aedc0633d6be39dc576a5cab09f0a3db2199c0b9d6d9026a8df0b243953bbb183479ae3f8f0df32c3973b16a0b9497f6daa4b090be6b792f4c1c6ee491b07bcae3d036803a23796f7b0af3541544c26847902529c09a4dfcfec029682b682a37e46d393fb00f75847902d75effb8b4548020af7c5ba62cf668de10047301aef727af63c392bdc328bb132ca74db0537eb3f2c68a645b3bdd043c697f3a87e38a90301204928cd18aed7ca586e19ac8239a21e351e060b6adc26c72e0e0d4f38aeced9304000000000000000000000000ea1440970666760d24c01282c380e5e4339c2c2df87590d56cfbdbd68e6ba76aad24962715c9045675337eb8c6c8c93e70f8591462d1d957ddb8d504792a16514eb5c459010a2cbbe6b6bb3ea8c189515ce8a36d4dd3a97e4526519b3effb82c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c38aaebf541cd20d6ab1f3c8ea55695ef65b779616cffd8110e4ec65992d32e1a3456ff106cafd376deb5d95daab5388577b6fd36b7ba3809bd17ec59d847f9c8bb9d06b09f7cc25b20ee2c7cb7407374778315a0d3243d4a459113daa77927c0c757e4def05711e73f7824c19ddee24ce17c3aad99a9f622d51564bfd37c96c0309b96b5acbbf0dc313977b1378e395b9c442f5c21c1a4a06270d359a2c127046030960a98fbc4f0c192e4a5dd1b92b1737801eeeb6d5d3fec160c512f23f1c025f0b02144c9e29be0f750a134c9f7c7c3ef9777d0ec9e217de280dcf7eb8fdedf92c0a3c32f90e38d84725c96010d86542f80940d2406e2be47ffaa821abd5960fcf020e76a51212d8cda35482104685fc6cf495d0b3d54edc121e9a0c0b427b135f52032594a6125e62bb19d32fa8f5875327c59e3262d3acaa586f1da3964e5bbfae0f03014bb8f047df8a9b667149e8f6d28c1d0f4c47b8c76d28c6dc113ab9e358e6a60227b92c4f5d83d086e8da6a2dc1ae9f326ec5f397af5f1e506e737386b5b94d9d031614249d3510e63bdb93e33e887815dcea886823937be7e7220f4ab553e88d8bf8c48e74e696f69540523a89f4f72cd6070abb4fe65225356caf3d516c7318735ac4dcbd0de5b7b7bab8dc0084d7e467b95c642ba392d5128848207ae679485f051a8d3fa71e3af34806a89cf91477760593f533236ee10124f5669d929a4f601d248b8ff136cc1a852fa406bf44c12e0808be922aba4b85b436d0400499c9670588ad3462dd793ecfd0ea8c9049bb5c85a10a6740343a8f06cd810f1ff193a7c4c8b3df79cab38625797a2a253d506be0c7eb9b9c91c58de4983cf97f2217ffc46fae830602176af01907448d4e4ea82a72cb004e20f656cb735dc9c0d7ca9b8feefcfb16c5e3464f18717678ee7d645c24845bbc7b9a907afdbd21203237e30efb5d40620d873b9f923df24ee927d3d83d53eac163d2fdb0f930c1452e6ac3b18319878a9e4787964791257175f629ff315a906050b22914c9a727a7a5788cc87b49fca75637411cd70fdc471f90188717f7544fb9e5f753e975ca835d69be97d8b03a18a0ca51482f02afa64a0a4ef83a725555f70d1ef9f9871ac29be52d545381fdacebbb7bc9846cdd42734208173b4f5fde48f9806a8772712cc50b2f27d08b05abbe2584e870b2fc0017cd1cd813d7dacff797fb82895a434102eeb5ef3813d527b9392a021c244f7ac92544923611345598d20028dd65a45386273f5c0c798f92f52df72db7714314213b415044ae948f223f2b60da62a19dec3a3f9c64e3888e646348d5b932ff5e61f509013cc8108b36a6b30f4e578ae60e3a994b2084707f9a6564544258730cdcc047615aa04618abb8379ce4d7a9ded902ddd5f495207d818bfcc4f7eb71ff61b4631b6cdec957b2d884851b2e8550ee909b56ed1f74547a4432c56ac6d62a6e3c40a7043debda85d428c4935182fe30b876e63d8b0416cd6dee14591e8b51f47a608084f959622fcb53185332e86415574c18f85a79768f6becdb9665e9d8781743d607c6e4c35baf7adcdf76dce54f65b19bfdb092eacffa94cd7b760c8e3e18a2996db243647b0ccab7b27fb2edc062b8522404b0d40b54c5671b0d699b49d77284fa639b2d02341e7edbf255fc234b22bfb031983ca3abb32620c74d6dec97c247af789a88f44ec663c36a3760b7774a53eeb9499ee491095fc730143e7552b5f2e168815d4a8681fd4bfbefd718bda83d2ebfa25ad9a408c51e16841e50a04c333c2ed2c5b35af13d5a008d5bc104a5d9918549ad0a55459cb90d836d4cbdd665c2de7db43d6c8864da6764943803af9b23075ea6384229f187b8e9d6bdde66ca73b5d6d65d818b5d553ca857415acf4fc76e8728eea09da3c8a8677de237498d230e2cfa1ca03c462ccbc42539ca92be5b2618a44501ebc50349012ce9dd26ca5af2357d7c9f92da9f9e5d6ea815eb68f135a3484cf1a6a54a9b05db48eab08bcf610a4a40ab9c00f784d3a7d849b2f4dc6538824671d8ec67d464c88922fcf49ccc8ec6cb7b06af25d5dece6e02c9065cdbff7a39349d312c9192f0eadb6a8b93f2214f33d29f193e73e74a811b41002f0c9565dc8703bfd5b9f1a9ac27dbf2122920df30d6cea0e97ac3f6587dbece59306ab61fd868bc8af71587acc5461bc37bcd05b4698dfbe46d93dc964cc8bdba571a416808997c6a0fb55acece45142555858b415ca13fe35831b76976a0b17669a6e23b8dae175fe01c705c9b8ea9ca54a27673140c47c93d8d26f0d2fbe638d123df8e2007d6e6d41ca4cd550ec33c7669f8620c13b6018df36075629da7054b3047d80e3d5911c8e3ae7374e59b538d72881debca7f20184cb078eb8c6116b53047d9f52f3ad2ac0fda23b815fe0c", "6351006a536a6a6a52", 0, -1988452841, 0, "40d84eb7f29f084cd3c8abfc1c4fe2e3e019ea0244510d203e5a87117e864e7e"], + ["030000807082c403027e0d13da5cb6c012aa5c5073de53cea35a2ac24237e985a23be1a6d32ce1af0d0200000000ffffffffe7658d959e7818a6126b0e45c27abeed23428162a584c49b54ed9f9877bd46d5030000000152ea591a1103d4920a0200000000066a635251526397f7c90400000000060052000063ac511a260500000000050051636565000000000000000000", "63516a63510053ac65", 1, 169255014, 1537743641, "94f73cbdfbacb27eb9e52c5795a42004711b543fe966bb0da298b6e02e37b6dd"], + ["030000807082c4030207492ed69c2c0d73bea521f51754678912e1d79327e4fc98b1226af5788b57c902000000096a6a5253526a526365ffffffffbc02fcf56cb7a36a9cdeb82c4e8e121a9f1f58af7de4c8fef418daf855fff7050100000005ac635100512b7a1b27029c64920000000000046a515251ca237b010000000003006500cc16684200000000010000000000000000fb55100300000000db90d3e9b05e2343efbb70b41a94b58cb52add27d94d198309830d1c7670977e3839ac736328db242fb052deed65831c8773c7fc4d4840b4c5abe03acb26ddfc0a071e151458613a7eded35d8dcf57e7482aa9b38b0dd30d7e91b2a7800309f2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a8530e940e7a5ee48208999291fc4759de86b206c29f5d6bca1a584dd09f6e26ae91e06ca7bbdeec69ca2cda03c5d950478f47ba2bc59f12a9ef9a2170f935f36dfe4498c3a354917642e1bc4e0312c09a7e2da8e848b48b5f9e6c70c7b99d58f8e183b7928e0c4cbad6abf3b9643fc12cb2b6c7458f7d57fc1549e51a901f80315ca6160b066cd52ff64aa3592cf9b19c9e210ae311723424c47f4d9ac3d4437021817a55f6e7eb5a474297fc730d5ea748aa7b0659ee745d75969eb2663f994080b02b99c837acbb64ec585ab22ab1e8dff6b2fa81bb5e6049276024f6b261455307765f022f070137f9063d64bcff18427897e6ce680cbbec33de646c6722a7f5a0304665774a1606955a1063ba3784f86b1c1b49c61dfa5fe075009a56cc12482800222b3d2b2c22ee10ed9caabe2f81b9bf5620fd2f76c18fcffc6afd3fcdafa7078032af18676adb3d3326f413fc5ea4ba9125b729dcf90ddedb128fe2333abbb6f0a021327225be2be470cb697a9057e888858913f6b5d97d630cd054b936f01d2a3e00313786fc5ea45e46ac8878857dea3b836b5463d99f2dd294dd8a27b84434cb71862f718a57bf38339ffb74cfbe79781a1f11dc278d71f459ad09ab8f4589672f8f684180a9bef6610a63254fe0516b85b0071071f296ee2375cc9108c9d2c337c07ca5f82c3cb75ec1e3418e3bd6a3bf204c2f32a693eb820f19dbe325fedbe961278bef67f1cf4ffa0ec4e20b9e7cc20cb6b716bd37db3d7d312c21bb1da975af6738d225b8f32e28d62e19e72473d99bde8f3e3757e32cff736d8f7b9aeede25e10145f6a53c2ad5775789f3500e39e09f420e056e6de743d9073321cea8d18f70891edb5061ad4c3a33acc4f235ff5463a311cb9a04ec3c59e5651d44368a161f059abf9b5e4a8a0be83f22fe6bd21b01d81290f1b20834bf04371579f3ed772b2f2db2d6ba52b328ea8bfd32146f1948af1df830424ca6073efbe18c4c3a113ad88451d6e0c160978e2d694d440b77ca27fc34959f74106f06b998288dd5af64fe92c0cb3f79786c8f91d0baf03fd5cf60bd6844fd8917ae74ec847bcbb078b5ab1f032609d7e178b1e6e297370c58c90ba308e1aa3027ae03b4ccaa5ca5df4d3837b1a588fbc2db32b0aa56bd288e82e0af994fe1ee8f6d4e522aa82375d8d7f1ead1b9c9583bd688ecf04fe77c8b8cee3bd250e5473650e4f5b93fab04ae4937e49bac61d7b0aaac261fcae8296dbe3ad8fc74b6910bcda1ab61fd3517645e014c0d97bccbfb274aff20fb5a8ea540557c207b9d233ab5cab2e9309ad71d4180885e42b82afe6d7071e9f4b3c813edf27d4d3006d0d238e0953c3807d6b6884d5ba77270866cda6661e4671facaf922bd9e9a9a338c5435fbdb4b7907c2e9229f96f678060fefa4d23ed7b1290744701f35cb57642875b68ca036d04c495b9cb7fcd8a15b9cbdb3a2afbe034c1c6263b8edd345b5b78d6f1947e3d0345d8d9dbbd8aad95041511e14e2e8f95965147c9b8c306f2e920b4b3e62b5be99194f439a072e5a61da4a50ab3b39b1371ce8eb9f29299c338ed1442e5cca401a4cbae64fdaaebac5d687b7234cc8d5f15d071165c0cbf4657e9d957a7c6d509e1496c3ba42ee2330f9e7dc3450b87e541ac182b0be6e498cfa88a688c0bff270b525133ea858dac6cbbffbcd0ecf7e99a26c0778a21b5ea116cf7df9b7ead42f58d0ebadeadd75cee96b22978914fd587388decaab5620078bd9f032a060afe7ab1c7252d8acfce6cdf0d9df7336be1f92a660786e537df17925a2452ab9522904c517791f377ed1a5352e86e1580cb1ed877d935888943243a7bd68e49385eb9158dec322ff560272f0f0d573bb7cc4f5d8b23cb8c4aa2a2fc15c741aa2f5b2d301727884f1306c3f916644d53bf19031033462c21e098856153f90189d085a95cf9ef7b5ddac52f5ea69137e5c00b48eb98cd2dbfc6524ba6e16e2af14ba0d0af2fb23bd8182919c19296d53b42498aa39c6e60f263466e3100743cc975cff3fc33b6bea19eb106d92b46afe5f9580af427a18504de78122555c39fde49beba58fc2b12b05587a2fcd6ac06b5028d0227d0dab227fd1ce4efc007859d1bfef38ffc47aecca8ddaa35916b0722429b642ba75f8cd993185266ec413a54c7b3aecbb7a6a68ae13d21ecdbd4f6557b7d9548fbd42f05c72cf53e161643fac6d8318c7c8432f3f28e6cef9a1ee9c4c37bf4ff8e65c597dabcb6dcf5d2691363bf85ccb9dd18ef181b7c6675a307475f9b4060c7f91a530b815dffaff2f1b88bd3f00aacac013466eece8860de48d8b611447944d4d9eab0b4ee7b2ad3ea0147425489a947083d8b3712daad4e02b4176d90d137b96511d08f2ebfc0a46ec4fe72273ec49d7ae2169968374634e6048fde297c307", "ac006a6553", 0, -473169853, 1537743641, "0aaaf4c4326b705e78936a2100cc9eb0a4a2e0bdb87313224f1144adb33d165a"], + ["030000807082c403013c480d691b79f265991b30ed3154c72163023d7bb68f24d60af0811987b103210100000006520052526aac414093d701f184f00500000000002a4787d6000000000318b6c3050000000000000000000000003c645d29b2d5fc4ef4d62a2c74eb8854a40cb345569a43c1e957b579adb53a08cd547f94be0a9e29ed3e4ea9ee686b4742ac1990b1e685699c09b9e256a6811e0608d0c31961d4d69ee3adc9f465c573bcd716dce359b07a3bfb92aa7262ab7c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002723248e5a6cd2f8576e2a336f2409fba20b858a3a976f204014bf6854bc1b2dfdcd62194867ee2af08c7c2d317803998c986878846bfbdd383584e224fd2961e37de7ae13fab0f1312717b0a6256224a69cc00b067911f6150c5e46c5d701b770525e5917f462af0f906e4db9a721be9ffc76278b3fb238deeaa97db86fa743030123e8f1b7ec3a17afd25686af3009785ea4edcb78587490756d38fc2fbe957f032752f03dcd306c0302c33925e9e1ff084cdbdfeebc5de3674c0c8b2c3857e7f90a0074a9c0b568a34321d10003f71e7b94df5874061d2eb751dae101a65527054975a06add6bee0e3dfe6db840a631fd52a61610f71cdde842436515643918439c02293753f2b24478c5d9b53f898cf7e6c06a0c47c2409dea8d73a9d14f8591543a0214235ccc9e3cda94dc702b3774cbff624914a9b087882fd8bae104a9a62291500222be6257be87457ed58cc7be7ed2cad43fdd7edb2df006bfa251dcd1cb0e9f580220122229ec67d283f6676b55392af9306a516b425a4cc037fc9e2b85fde2b34d030a246a9605b374c55a0c249bc0522d75f5c19afa25c673b742e5798c988e2bb37485ecc583a8c489a02607e5737374677662fa9185a46987910f3e0838f8beb2a002062630d537b1052420e0fcf808af910b81c2ca90b725b6c8c293346a1f1004717557ab796272ff01f7bd1d3ee99722c0dd12ca7b4c66925144a9e7ba3b301304aa9bee2ae17a013d47a8a8a85f3441ff2d360c3795495013e98894964a2eec0331a86e999fc752c5e8ec35fee7aa84595302848a8cf5e2fd4fd0173609f77b0265752d39f3c05f51e8cca41ca968ace5ec0c7f30293f2157b5f556ff3f720965c2b47507846a0c8baff4579d14eefb78e3913fe2e6e1d779fe9cd105ce7de526511b804f19500a92efcd6b319df1f27803aa91a66acfa944d9ada134ac5ef50751409c4a780e94b188f5c7e321fca11cdc16bde8930a614952b2921c46bc2aa56c0a37150a7b1b10d280d8f117dd3fb55a24a2e5c52429e77e781159f9a83268693d46b2ae121e9c624a4185d1c9756f2dcd610ed7fae0ab1fbe3e242926416bfe949731a80dfcaf1866132f5c5188aaf989fcd38c9e0348fc675308262d77d8342c81f62c65a083142b1bf4114642728dccfcefada9a06d4074b8d768eeea5cd86f92af5d211c54c7d1af23af3de99bfcfc518599e58a483b2d4bbb614ca0ccc8c8ef924edecd0b0cd8b8c13e45a3c4efab1273d65a5528e94958d05a5e620aaac483fb55e4a5fcd0d81c1e7eb852c23c8a1491710bf3c2e85633c87bcafaac1e978a9cb19dd7aba321e7411a1b78a680904b7413a87a6d7cf4f7c3b11e9dae808517d3bccaf901523598b7f473d4da641ddeec4147f88768f0a050d907f96a36c49f2032443cf47f62c0115044b47cac34f1d4ed901a61466a5c3cf7c7adfac80804a4ba9fe8bca4e508cf5e7070a64c6734b4eb7e451ab4045e8287463cb8d93b01471e5792dfd7a2ae050dee423b54e4dba27df2c93c1b7e8c00bcf3880b528241cd28472e00c10361eabf45baf7642183bd61709e7d60081d4f0625acc9323cc0558f52de9d8f3c224ea15de9c2b01516e49fff9896bce377d0e881915db0aa8e0fc6de8074865b02a686577a8e86d71a8e857944378931f2d7079c7e13a05ccba4fc906bf215d2e9f61e2a7991ae728598c5c36f3be8c78aeb11b59798562e35d0372ad578aa64aed4ff2411e047df05322813355c0e3f26bcef01c66dab1df009917722e8c291adb244d55b0f636160e85c5ece6ca286262bb2a887f7f84147c71f507234d529cd86fcea01cc250f7677be3b0c9998985e65df96f87c880ee1d88ddee3dca9fd684e26c0ed56a8cf4264d0e0a3e98d60eceb6dd0ae7646bcdcdfc5662ad65f7dcff229a438da7ab66f08bd38470442844e535395303bff3a2602d76f6785b9b57aa28bbd4020fd12b83bb5787811e3c6d46dbdb66ef4e934386ba204a61d2c2aeaecd066d19d20eca761e5913314761981bf5ec415ae8f1df66da18859fd8942c37e6dd37cd0afec03b3e60f941c61ef0f0ff3bb2ae8391aee1e679c04457b4ba24ca38e20242c71937c695828155b38ee4028564f053776e752f8d8fb2444356e7cf89258d63aa113c24a5cc529454628f2e0f0675ba899f16c62129c1b0316790e01f80d584512d2ae41fc962b03049b58af31ce8f3c3d6bd7bae2b54eccc4032895a40f4598f4e53adb76052696ddf494275a207a0591c2a0400659eba90b4ff08af4e8c700000000000000002c5b850000000000293b561e239c9cf56f8035cd66c6babb057fefebb10c6ab48c379ec329fc5dd273631f7e611e874e66208e3b3f60c276e9a2cad1e11e00946c8f40d931eac0a53f65335c55ce311d243ff172e7c8e67ad8820cf677afc55dd6979304dc865d2c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c8f657ca7bdfebf8a7032dae85a15fc9e91052e39542d1d2bf4eedf56ea4893e46b7c6693b25732e2127668abc922c5c040069427bad86c388c73ac317d3f0282edcdd9ae670f642a0b7fb62488e9fe4fee6d74422b84045410d732b288a4da846ecbafd22f684de83982590888053130dc1541b733622a6d1af402c0b1a0d4030b3568fc2ecc8280d4021337d30b0522586670bbe41c511a941ed658f9e2100d032d684d78ed1b6ceaa07c1844a82f7c05af44def8b477974b6370f175aba3978b0b0924ceace270d3cd58ed886dcf2756b95e29ca6c3e86ace32437156e7b5a4203631d1bb9b360e6a7d9484d534df64fadeecc47c35dd509b34f5fadb9339b6c780228b340aa8d080363f886c8b2f8a35ed147dec1064f813174074da563c8cd341b022d92d201bfb0c72f2287e434d47c2ab0660ea4b0f8b88ec628ebe61c88c3365c03094d5be34c8287b2a1a06967ddd1da3a2b07f32aa8eba03436f078ae90833b9b031ab3dea0d55b58d6801b7d1f82f98dfc1b58fc485dc1c976207723c7911446380221bdf512bc49f1d89c8382035ef6e294882856c8d0481235627643e0b2e5196a36fa324c1cd2bd04b3da79d6296fa1147ab9df96b63f7c27bdf8b5e76b5c7ccf4313d6c91262ec7bb8457a3474dc3291e2d729a8a61724b2e1dd431ee8e24dfe3391d57b847467e8ec0115312b9d82bfd2f00385d8f6655b1dfdec33a799dd3064a4da578f5cce001f1b747a0f08af98e746a0d4631bc10cd623507dd495a073c36d308e43e260545960d39ba4962e380e8a3ffd8230cb72b362deb2f364d60e6b616d20c015c9d1922a17b407bb18f4571e2aa3cfc7fe6602b602c699cb7792fc223ea236d8dc71d335ac1c65b6ff45a570c644f7a0ba3ffdc4798fd6f05900d3ae0c7c8c2855d8d5457a1adf1eab819d8a93f6b155efa5438e61dd99547163aa8d112409938f185d4cfbd53be4b5d3fb2309005037cb339fc61f26d7aef3512fcd86eb0ccead1ea2e5f533dcf3e65bb262ccf89603cee4ba33ae868cd6e7dcd99e302334a3c9e4a42d677f7183d63014fab1733b59b5ef4e569290b18ad54ae26c0db941863f2aaba0b13a0be38f7e31a5e01a51e3d804acf6846e3d1e04c7ead9e8a939078e747799b30d2881411cf268547510c474fcc5bb6c2400a70225c9273e452648d2cc72bbbd12a94589ecabbfe242f53679f818395db258746b181295690d49b8e8b831638bdda2f0d6fc4d09274883975d6cc2922c44842c7609ad117cbbe0a37d75829d23b0dbe700d3c5707f1de5f64973291c197ebe8623ca0b16f884228f4b6b131870822d11ad22570e30cb5d573a186de77f9c8eb5c350b5ef9b880206234091e2eaa3c9678a0f1051d55db0472342ac9e3500f07d80b0a536542329359399b346570a0c1ac154874dbfe4bdaaf5f82ddb0a7e06c83ffb633ef5fe7ed77926410b97ee697670db797d2b65a5b4c264bf11429ebf6714d22a923610e62c85913bd22e5842186bda65f2c6b63468af84644f32935ecf45600c295c2a8e81c3eadb5b2aadda8cb0a56af0085f8dd782a622d8c066d275964f30bb207726d517ec36abb1206865f123c6870b01fdb18f3de9dcb0329eebc8ac692f2fcbc1951f124a76fb84ed9b2cca7ff2eb776eae0ae993a2df5d6178a10142d310329070ca725670311ce5fc603f245d477962bdd89d2c3e573e98322fe4c981565d8e4acf273fab459d771c6c11d9f651dbceb12ede3dfba3a901df843763b685bf93c1b3f0f1a489cc02386af50659395dbf5b8ca19543568898b49e1f9500807b4d4c3fe1d5dd29c5df7d9fe27dd90cdf1dd75dc7e41bd494e9bec429475b8641cf8e9c470422ccbca4bb309b962563123b2ff34b8c44e1bd0372317f1a1c36ca72d72ad2396c788285a1c3ab3d8ed454d5af65d0b5d5fccf47b5e705ccdbf1efa5a5b821c69384fff0846623c394266256c69edff8f18844e95887be4431a5c45c17c029f6fa0856eda8090449756f25a26a28d7a3a0b54aaaff9c2d23669600ce3df96ebc8e8baf797d55d9844b71857ec7a622e296734726220abc61b3584ffd6595a865afaf3b04962c499a88c2f9956047a59faf810ee4ad7d10842f48ac147aa349c7234d9f90eb3893ec61c39c1aaf90a4cc0a81409004eb6283aba1bf1c25a0ce604beceee9180db20343d49d092465bf65023521a5d3deed3f811340c0e10bc74918b2d18b979e9447becf914f9c5aa78ea7a56c2e726f5965c2372f577e9255024128b543f285d2487e0000000000000000a0102702000000003594550a6aa31ca0781dacaa05f1c8a4b6e85160a53d6df1b883650ad88f889e2f8aa6db46bc8a0020db7e92261c542d4c14ed7d9eb055c58a287c58306e7778a86051371676d7a72d7b7174686a5a3066504ce64f959b008e8c282c8213b9c200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b35b37b30cce8ebf72f90dea9b3164b6196c458cd14feb70ec14a195f83ffddb9965bfbdc4647b60d3805f1d97be70eefe9edc5619824cd81e80d4803826b8e3553bd63b21f8a5fa06e66151c5106a7c1dab0cba57b4ede802176bbd3d1efef0cdc69835ad68e1f5e116315a09a3e9b646efa5c3a6beb697a4e03a6bf807a6e6022f4d701088f6fde382a77f9c0ef2b2f7deed5e41d1b2b6ea2cf5603e9851ee8402190540313ce4a57767dab896ad444ba1cd46531622d93416e0042572b0c7d8be0b079923359fb616389b589983c7f1ddbdbebce361f4516e76c3a63f463eea6da33cc02318731b07ec12eed077db1c908ea0c4c7505c428cfbc5c7389fd17dd97d032b09551acabc2b7f98f084d191135a069e0dd5a491d1a5edf6822d9eabf7191f032d546d31994ea70f1f6c21ccd485c0f9da191d3561b2553de1da26f2539f08a9022d91ac5416bd73bc5f129dd9aa43148a8fc9d3868250d0339e8a335186d4f17f0205969501a7a1058ea2c67ad849f56c74a7c9229985eccf39e0adf35310ea23540313373ca936eb9b753c0f2e8abefe5c0686d796a388a3daa123573d88517838771e52184b3f1c922e92d161e87fa1f20c3937b47e425d628e55ea9c0d429b51ea4b925fffb33e2b9c55c9e760565ae118c36acd8723ad1d5ef3643313bc0c84252f21833bbebb654225c93dd12b56c66e89a317c2c10a90c2f0d5352eb25432d3e2245604846944ffa83df417ccd4a1d5c51028b1768acf7b198594e5e06545860977715d8b0b4605d9fa68ec0c691218f61f1c236b5be35bbf61d766ee7775654f9de89a18228353c00042e6268ae796df05cb167fdd996eb4533050e3d091436e72264d0ef19867ee06931cd3e3b1bb79efc92a8ec757670723ad232de3b2ecf0ba0128e3eeef08ef5f9c4f8125907fdf77cc1527f8413248a939fa39e82ec37783d61d9feae02b2f185f7e4d4974185e777f2826a8ca29102bc6fd6c1cd71719748f9b75d198b73051c2047f0778d5c818e8b4e3f0099f205a6af071f698e75aef9a085caeba80283d8a62705068a4dba8f70985b7cd495665057076858ac1c4a38ffa792dc36e506bbaf741bf8f19857bccc3e0f7112f0abc476f32585aad1416c834a98b24a45056c52a756fa4aabec85bacd38971b2b5354db05c41359c1bd58461ecb8e6f4e4a2e86d2d22e30aa54ec5549e3ceab879ae526ea42b888bc68627924ae0fd75f26d1ae6361fa8d0a2dcecdb1731cc699d27e0e1e6c8c7b9eaa932dd10bc20aa942b0541cf9b60a6f54f3c490e21196779aa9b9e5f8037d8bc8f2a650f644c7cff28da45b7432113dcf7a5d997b637e0c8b5c7f8b0cd6729e5b7c967835bc70064f65c55a27a384a6aab76612ab6c8c89be7594f429557e10f4492c7d26804dac870fe59837d32ecfaa32a814f34bdaae50e0d344a90d8dee87587ccc60a7019fc579f46024afeb3c29ff4c32db70d73d3044e0c0f24a78369b587a46b8d6cdde0af4efd98843fc0dc0694bd51589bdc540e4debc00df1afc5aa5bbfc398187b5ab0e7f6ff262781dbb79a69b9b87a3e7a8c46d57c3447ac3fd787c90f255ef46f3723983cf963e1b30f29dac60097d48c174cc2789eb7804e903de375f40f024950166a056425ac4bcb5496ca63315172c25ab49acc31c1fdffcb5b6d6b2b02e2c09b39e84d3a23ae9749b6da3ed28e7facb387cfd1005e7408f2fec7d04426ca7c5567a33e734e2adb3c0023e8c0ddd5d206f2d7dad29bf117f6061f0353a9f6901aae2173f670fe61f721a6f7999d84fe02a0a6fbca32390ccccfbfa7b9b0e000e4481340057da2d3fb15b2a4a4b859cd64aca8d179065c4fc2c063862692e354a12ddfa22cabc99500132e67f736784c8ae2faaef56a40ea55ee5921c679c16539aa9440e07614ce6e3efed4f92533b18e5edbda0ba6aaf00b66ae675ceb8c1ac5011c39e42638a007215bc606e3e4600c943fd3e5eb0d8cd0a6d167b0a5fb73248008e22022da405eaf31a4b1f15d7b2212cda1298463103713d9a90b7be6bb96288122ef37f184adccacec9d2b0332b0cc02bff1208572554101be76f28f640682d9916ce60a2d06f95ea87190277d2497759e44abed689cc9a74622dce6a5594772035dfd5e8d57d0cf11b41511b36c4f6fa09627db7ba0b336fb536dc815e6ea85c7519969e5941b44db5bba0964d822392e50a9a23df3760ec1746746dc0dbaa6e2568881db699b3c4ed9cfaa42fe4b522fa9aef8bcc868bb134a0279f02fb9cf0d9c4ac6194d8e47d0792d5691e7558ada10fd3e4642aa95fc3560a959ca78fa2a9066282486766f39dcaecdd903a488fc605df1fc5689a5d9b2f6e017dcf15734a2dd3ca7dc48ef5f32400f91741478971d6478ffe80e241f3812dc3432c174c9d45f1701", "636a525163ac6a6a", 0, -333825940, 0, "986d38340a4e5eca99e8627a5b30a52d36366e1ba1487e4409c558cda2c7ca46"], + ["030000807082c40302273712cca9ac6533c494de7fb7a2fcee0a80bad9cd8d6a6bf81e4d1ac3b9943b0100000003ac51aceb4e914b4861d992e680dfc6fbb6366d0f5a4acef71f8ee4777d5bc7ad1089b9565f044601000000045100ac65ffffffff03aa49870300000000095152516a00ac53006a9b51f202000000000900ac6552650053000073b8c70500000000065252ac6a5163000000001e6191ec0200000000000000003bf484010000000036d9acea80b5c3e0c76db0634861d114de3084b353261905fc0f40f4f2d61ddf07fc9d6f069fbc4b1ec9ef7d75c53e1a1af9740fcb1c73a2b3142c8508df5d6de124df335109e20b879c3a839bdc0c5ac7d1e0f931e4d923b9c552dc65151b67000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e40f8b829d875d26335402b0685047e5cf3a0ece29719137f3d39fe3155bd74188ef0b756e9e129cf521750e0453c41d196f14c9a099f5f77890870c6c83942419d6309bc4e7ed73b41ea8502796c124205015f6543f5ab30722e86ee992102db1290ee75b71221eccdfc1127ec9510fa27d37cbc6542ac8ebb5aa139886f140301f25c690db9d3de063aeb2278f85db3d53a625cec144e46d7e294b01fcab26603185c073868f5410b5342cc6f7ddbcc2f6defd194d10e0c82e860a8a161a7cd5c0a073c46b9fd7192e02278adb1cdb9dc00bc0b3d4b7b8ce3ca2ae8e2a70d96c27ec1ad3ffafe0f48cba18feb33ef82ffd74b8338e4486596548607f7bb11e2538f032a78618537de84dc6047e7d20677664674b0981e96e97c65b5db306a4c5dc20c03154efe3e71e4f4b33cf811d41aaf06fbb66bf55f84f3fd4ff921b20c3e859189031fa1f2b86f4ff57e0afba246d33c514410603eab0df72ec4ece2ae7752930c7702033622d4daafc54b2bd8380f789ba9e950882166da0af8ad2f9a3b383744ca6702147763f1012bd250f1cb63d4d3be1bfe31bbc050bde2d7b40572555c787f2439d4e020768706c8211a1793d705419e9fe5beab3eb5f9c572b315b67eda6ffd043f6dfc9e4ac6b8b9292b198fcab6b339458354fa8fd015fc921704c52cc0d7932c2cdec09fd94e11d80ede08e5bdeedd826da9f3f643e671498b0b022f39e6402194867d833223b9c698bc255d4cfd8b322a36f3d50b913704b839ac3bd746b7ff281f4ab500be36e696fe8c4c9dc73a04ed5f51b1a6a5fefde6b82b223264fbe7236fdf62a316cf1925e3c59a9e5c5af7e13d9cc44beb4734874f581c969398d48af90d7e146eb4b16ee16414fa95c942ae7687ffe9d0f7ed7fd7a66af673e56a65882253662fc5edb54703c97af4b58d3ef1685ec6e1b8c14a10dbf8471ad8f55c801a78018167a41cdb36b49d8cf17a29a51646d7c301b81edb366483c0a56afc6691fbb65228f7e84702e474021649b6627d16177a31ab444fe55f5cef6bca5165be26cc46d147bd30cab60d5db907f8271675afc388def6d146980b601e0cd337c4e80cb897b53919e2c776554d7cab453d91b7b3c66846fc7cdf0a72a7ed58b724b524272d01b02b71d622437f7350e702314d3d49a02120476727953315c48b4fc182ddc810f61efb9d198cd6a71db20f1436e499cb0c1d431afc8be6fca94c5989e4d93b92aa6154fec7853b91e72834497a5a2324578446d4c04265489a2213aa6eab99a93fbcf68fa0e3fc037d2de2e5d6057399c3eba7e5dbc63b24f4b0841e34a5b2e0c08a2f5f96e741100f7772f61d1686cffa13240e18c2af2f3357635f8cebb9bae9b5a78032abd122c99ff5aeea0a02675daf7d78eea7cd7854e9f1968107dfeb78c319796ec583cdb50a468c06011f273fdf340ba2f7be587adc4b6fc221652db89b1c9f247790446ce0eb2cedaabb88b56f629954f1fca8cfccf4b2b064b6effe7fb84ebc4bfe1f976f5e432482370ae735a25a68c4121222bdd800a3418561badf2f66854196d4c1f2432ebeed07731e600847b2a7214359761bfca00792d8c33cc3cc31a024f74b2542e4034dbea4b95d582289ae1367d6dcd9ea9b24c0f91085eb673160f4ddbb340f496dd43ac9f2efcc78857d29278e81cd4e395934da4c86b32050fd98531985bbe8de1fe7ef189868e5593130d646ad93783addd2eb86b0b456e38cb497ad9be448f4b9d5fce67cdcd498180a03af7617af243455e9560f904e3fdbdd1809f936b679c028e5ea818a7a9c2f5191e37b882002af7c4337a06ce883aa1b0b4738c942dcc46f89e34f7ac53ef7f79f616ffe341786c41cbb2f13ee7d62fd51bf525fa82b16640d720970a50add2a30135459171146a1657f4346cad5e0dcc6d4e58978c6ceb621f200cf41081ca266ac418e7a5821f6465bf6b7d9801b1de317b0ded07e6837d84a543437100d6aae5a80f2a84cae00b4c7cee5a21b6d8f381310b3c2e65880a36b25550f8d46f992f0967c27d3a3594c2edf1053b204fc9c4fe6614773527ccb06723eb0a2055c1b52ee414069894a584d242b5d9561a7fb1aa0ba0dce715806a339e544b61cc6e7515110975e75547cb2d1ba8c93fbcf991e38030d58be49715bbca733433d825c45194e7ad21778316e3e3b259efbad35fcde404494f6d4e1a7d1757f5458997d1185dff089a892191af698743c6233ce5fb5f202cf9a82739a6b25f786cf2c951f5fbc978ba7a6d3f2f5ddbce3599a70560000000000000000193f4e04000000007f0e18f52c343443f479f8baf22440733f9da39612f0a9e70923d31163027fa4edc71b7baa2b937f3817af19c276993b93cdbb9f2eb002ff4b80de77faa64c9428f0c617d55bc55df32e9a799aa37006a6796331c8f4e2a1f4d53e98e81bdd69000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c52b5461d9fd4608a4124bec04ff18e1248223e78357c15ed140a3435d30735c0ed040bc6b7924ac16958b1868dd9f1c5101470c14d9c6436a5fbc9d0f0f1e64782cde3b3c7f228a0593ae9ac4dc63f93d8ad517fe8e17da87da78986bfbeb672e2bdc8296f8d22ced1aa4f887171038cc96e9e9b400725daee9089d520f3560311506185507e1034ec949b09717a7cd1a2fcda7bb386fc87a3746487ab6ef8b00214ee939659d12ee95bde924ff3ec6d9de3b4d7d39595c17708f8b889e8ebdfc80b07ca415b8f7e4bc7d633dd983270318084d0cb0c46c08b9932a67774b029017e27c3330d9949ad80a49c97be5fd934dd7b1d21283326061dd0369c719573da5703094add6b321f17d93fed1e713955ec7a37ec46189fd9119ab09d9d5c47a19cfb031a730f1e96ebcfca130b6efe79626e1ab76f208d68703fdf8aa77650eb69a119031d393edff11114b31514be679a2e993a2d2ec7f4ff9b6f251eaa2ed2fd85c3f7030799c0a5d9e43f196d2dd4fa39ac36569927fc6b2cf2d453942ab1c373ef430c020e9497cdd5dc069fa2ea97bcdc631ce7f5be51fb0e6dd1075a3798ca32a0e83651ff45d0def36a8d97c80100e029fece71afe6dd088d1dfa35ec5acec205094e1d125e816c2e9c3aaf3e4fe6948362a3957a50295610fe9e84f0890c43b56a4a6bd36148d1733cc98ff73d83a2278992f22ea8b68ad24034de003c76c2f0a2c18ec0747c0580e19df2cb6518b8f4d7626088310c602c477e29a91d4cfc5bd0a12bdc56dd9c4b00072b7e9cb73b500127281ac75debef631954da19e48d3996b305d0acdf1bb09f662d8a9584e759353769c7c80322c0f19083e5f6774774e01eff6b7d6d3f40fe05a6dc97dbb2e11c239a5122172a0b3d66713cd80bced56d9a44016a0e44552a52452dc69627060176541f2e3bada2f37bc926e2642cc73611e3aa7baf603b6c7ddb67a63e2531e515ea852cd0b1cf5db57d1e212fa38445104fa3ebfc48f3a6c2177f7118dab2298987cdb90ec68e98766244e2b588d1ed7521e54c78bcf9eec23f67c31f686e5bb83feba2af745cb09144398277547bbdc9e68c243c63c1f176aa5131073019949d6100c80298c543284d71ebe85f3480187563d5f39820ec1987cb59de8c798be843fc8a572bd4f535dea9050aef45564f6820a30cdb5f8cb5dee2d50298126ecddcb4ddc3798477a52b83da9f4382567998a802ce0608b3b1d5b2a120262f80fac8fca047abdbd494ee0de3581b661fc4521a2443162195cbcd4b02ce8c8beff437cb4c5d87129645d40fc1d93d7c8e23f25ff53eb0c32b865072557c6967729cd1246a63294372a93fd032769022fa732b8c2349a6349458b1d21db6da9ed09c0458108cc7f42c3d88ae1188deccff4bc66b5c5fc93fef60287aaf502077c5461df5884f838a1d09fee2d4c2a2ca59e5e50af162c849419fd5b998b1fad19e0fe39a5b806d9bb40904785ce7d3827e518c36589316317fb6e8c51674f2095686d6e0b40ebffa018c952de7352838d6654c22c1520289517c67d55907182ec8bffa43e6b7a39bb2adb66658738b4f7b7f25a0c68396dd4379431f023f5e8a42a0ba835a50f95bf7afd94ac8219b1f4ef89eda570cd4756b09a88479adb46d4e7dedfdc3c47ad77b5e03f2c51ec430f3a4a7af1a432bfb4f905656d245f22a4080a711c6ae786964341b082117be057bf0cc2779ee7b7b885e91f3341969fed556ea025ec4dd6c3e73fb83b708140909a0c546b5090f85bc8f5ab4652c8837b60900eed598030bc7aae5c3d54c9c094cd05556b8a36158d52ab0dd2121ff1e9fe73a4fa3248b7c9a7525349277a445c8fcb6a6fb86b00591d495b3d022ad08e3f8b49c85d51f0af6b2ada644f87dab0e55ac0b385f11de5632cd725f3b2e59c0263924e051ef62422efb4b884da9c685fb83a538cbc04cf4b7b26cfdbb4311f87d98777e19f77a91f078b44094a3fc2fe136826dfe2255d598b7d5f040dbe60cd66e4420033531bbe767c24a08d2a191468d8aacc6a659c849133f63c0d1842542c20df7de0239b62b50d501b172b448bb8217d00ebf051d14147e160413a8fdc8cb2dafaf36fe6e15e3b4e11dae23417810ab9820f1b80a312476e128b4d3364dcf277f8f578633231aa47cb574277d195efcaa79688241ea2c4de7f4b59f8dfb9169d3ecfa1d55a51af3a3d714783e0fdf65cdd69029c0b7eaa230dfcbdeee5428ab0217d845c43a4bd928ce3192b3925080289321993814002d0d746d03e8b38cbcb955139f9a091cd5cf1cf7397e99f65bfa37d42d0cf84ac1fb8d9a567bd786b33317859a325a16ac2c54bf65e80aaebc8e23b44cb4c088f582a7183af9057ee25ca17f82c972eb7a2d5ac8425f05a6ef5bdece45ea5ed5797bbefd12d94a1b0d", "6a0063636aac6353", 0, 499041583, 1537743641, "815c1021f7332572f6de105ed414892e37c88395e118321abb1384478370f505"], + ["030000807082c40304844a25d3732ad254fd95fd210f4ca1a04c05747307265072c20a00089888d95a01000000036a5153ffffffff0cfeb90ad6e3fc9ff3e30e9d13eaa0af2a8de808b33eca064262ec9476a345f2020000000553ac515300d207bbdf7b27685d5dcbfc889eec262692b608df601759671c9fb193c7363afdbd5ccd57020000000153ffffffffc1438abae9a75f41aa2cf30bf8c7703fca0933f1fa19193fb53ba3ce9e93a9bd0100000004ac6a5165ffffffff028b905300000000000200acff61d0020000000008ac5352006a65525392c231ce4087c95002bfd9e20100000000000000000000000099fc0c1f16b671a5bf494c30d4c835792a2eef01ef998d329f05a0fe2ded90f0d1e53fb2ffacc86cc81d530f81ea65665cb6bd496a06908b755a8538b2897c6a98975f7ac7a0a44e14ceea7e887867d7a9506521829a2946b50ae9682061d96e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072062255a0c46846b345fbda53f320b7aea51553b40d85a35a629fee01ad74a6a09ba99011fc3f8474cc530e4c5c8c3815aaf8e73d408682c82bc3894136ea90827337e416b83ad25024262ce0fac14b6a19277a39a2fa4907a1700cc3840977f08b37a690bdd2844b46b48bab8ea596f6684d5f6cb4bac91f0d55c416376ca9021777b781f1ee46e4ecf6c2722d97d49d53ad77fa262ea01af972ce3c7484f0330207acfa862d9fde64a5bf30d037ccb21799dd116de02788ccbdef94269b3fb95a0b05b60fe4f1cb6d8d09262c6da2094af299bb81d29e164728cf6eb94ead5235a5d02b19ab18ff8b37b8ad898b4e5b8b40af6bfe7ed669b0f9119e39bbe4aec0470302c1159673325701b1ca86eb31d240d9c9dc611990b9066110fedaae9f697bdf0227db89069415cd5e8c720572bfc14f059c1ca32cb804d08808e319310f51ebbc021f1e0352c59bc85ce191583f90539ccd5e3b875c03e5b22cbfd74ccce86da5e8021fd4545a5f0ed44b8fee61e8926b822bff8b30b26e78f1aaac3de5effedc39b10329710af0b66e68cfe041c1836b6ff9cd23e5805f4823ac989da677a41b1e469f20859ae9fca118dfff7b78e619b827a34e8f620ab58b91c82818cffef843918d08c93ff5a258fec0465649a58e57647fb0c434334274b03e869d8990c55d5862ae69922dad665f794e4e67d21c4f835cac686d6ccf67748e61d71a1a26353a586d51f4b3284c5caf2a5e3a6c93a1670aa1b3102829709b0dd9d7e10a3a6da8dceeb572119b460f8076b53ee16889f62387ba8991643aefef59439f493703d929fe2eeb316e34125cd32c2191c0ca58e41a04c3b95861ba1d079414791383092eb9fab8ef7900dbca92365298ee7871015bf100005f1870bfff0d5e76c2888845d5419d73352b8530c38f804d734f0aa5317cf658c892e9f708805572d43206a0248e6d1c2f31b0f09e3bd9e504b1f60f2df5f0aa28f71053a04397b50e8ce3d99afbd87ed3652dffa36cf8a5bfd9d21d419d4e68da5c297e1db6f27af2592270944670606fe42e7611bee95c7df634355df0d6216fbd6b3a79c0bd701a14070122f0311027f15cf1e517a7a45ab224b92f5af3b38a7ee1cfdff0716353c4c4ebf90481bcda67ad4c61785884a4f87bfe570832726925587116b4db55233e13593eac8a99fae1a02d8e6179654afa893d60f3a61709469b0c5b18c729c0989e6dd4aa5a79b7ddf178e54961c7c9816bed8b0501d26023d74f9a8e3d301ff48e494a3ce9da6d20b2b4480664b3a9b3ebcf559f2a018c48bd4eb78fa1374c7717c0dbffb9009c0b2f31a5e9470fc0afa8a0e3516f57ce4f3137c8d39a7722fb092c3799abddf32f64d9c0f8f4448f9bb9951d85ded974e06caf262b4fee552c24e17be74ac86ecde81b1f71bc9f2f5f212fc4b7fe0dcc528ee55aef40ba5034955c9b931057a5c35c2e26f769790d082378ce52371f40641117b9b8b91cba1d09ec62df809883a1cc99b84eec0e1e3a7806ab76676f7323b59761974c5f1f95789e13d3089d9376b64b7c5335288dbf75d3b143ae52568d7249ca344843e9560a08240a1ce816376a8e26ce95fc9fa31494d6b1293634cdff7da9cd0d60a804a629c26b6e162c503a8dffa2518f998840e4cbfec618039e234856731e23984fa1af2c1e2fa4562ff7193b9f5dc285effe9a805c15d3e80ccd738bc549e6ff92bf0f65d7257cc0d905ab72f3cf0ad8b02eb867a1efc7f5d6b86007f0e5f1c2aba970f3fa195a8443b0c67be98a6a985de1965e1e9dbed6802bfde5f277be70cb20b8ec9de5da2c89106c184508953f2086000de18e8783d84bf39c261a3c3576fbda7b9d9ef423b84bd0671587b98aec798c51c67204c2440de3b90b9326c21af7ef54ac52e37d66a69a66bc2d349739589634d4848ca87b4a14ec05321292df3d968e870f86b3f948fceedf46409ace3809485fd312a4137c154c8b125b3e9892b29c41c43dde10e0c9fe44f3c3e206e882a64dd621915338a98df2c6dd1ed15bcc6e1f07f94ffad282e2c41630b432eb8e09e8b5bccc337ae122e17dfd4d14799b4feab79748ccb71f6269cb608a054024628200a1e80bb7aee87c5180f33822ace278fd5987ad631e49db5015ae9fa67fb83b88b2c6b4cb5019721b3ead386e5473ccf4624ed410e06275edf69598e26cbdaee7c6092c5edb8177e44eb3645f7a56daada1ddfcf80b9f0be4eecd1f72185f3ff170849210396dc13e8eb870c0ef33fe91ff4564f4a1bc910b54fa1231c05ed4a46c9f010000000000000000000000007b8690c7a169e9f927768b4f5f3b47c3cc7b52ee87ed4a5f248d4bea43d9d84544a846b16e17890d57fbb4fac33df46eabdbe6c7424eec514a11f02de80f9594aa8c999c3a50befe76bfbe0b9e4b0c5b90b8f85903f579b199a8a74938dd1c6500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e450dda5dab2b919ac52312eb1a56004db4aed420ae06b13e553ee65585bf59ed32b6ad8c7c8107d24fb800bf280d70c29b8e22e53918b3c0f6ddc0ad192a3db30bb944470be0190e15e3f1eb6549cc03a2808c9cdb5c036bec6f3290dab3b1089e63ca8d8f2fa90a09093edaae70242143a516006933a3353ff0f90c27fbed90208a1650356a347e739abd9c61801c1d65666fe81e1f22ade595c206051a8ac2d030ca849f41d5e4117d87a6f83a8ec9bcec2a406733e9de1ec6b7be2be85c733d70a05a68f23c40e6af5e653ad54f388a415c60f7ad76431b2ee73498e4b571f93cc6313d27c0ffd94af288d09b93edc8022fed861f35dc2d39bfac3e04e436894630225e5a6b0833e602f5daf6249877c8d03205f97742e64e4523b40a0f8b3228ab9020913265a6e28fa706684f058ff9a8dd24d71bcc264aaa05b4c57b3b08c122093030f204010058e803c02890abf953851b43f7fcbb71ef833db38d1ae7f2469dab6031b215e700f7f6118fd30ea4183cf07ee0134c175df1b3113714839ff69e8f059020e51947cb44bcbea7775071e63da377d149885584752c5bd6e17f7eafb7b4c18b08d7e8d9e02f695ce7789ebf08289b8345960538da3f47d5e060164cbcf38f6bcbe7f4ff737c78c09247ad643c625b2a447eaa7efe96ec9ea2c998fb93001c371641421551ada646273567d54014719924a3d0006fcc9b6a83447756b5de2ffb241cb24c7b65a81348a986f2b64a8ca31d72798c40fc8296bfbe336bef9d7793b7abf3e50e0b331631caa2f6ce2ff27306e572fee1e19fe7552331af664f36e88794d0dcf65fcf04e9a308c6e4e29d87fc03f6aeda05956b25ad1872d5f66a047c946e63508a56991ab5613dfc70edef4bd1b9ed6f424a3dc31c8618f2d150e2d08d049f2956356eff4054ae37ee6269f680fc62899f03ef678d9ec82f3f483cb5194d11ef3c59039d83367c599cc16d8cd9484f53418170bb993406b2b68bc5e9d8fc5898461c5c6fdd816bbf9743b0968459e77df5782c6c97e20421c4932b8aec0599fd082c38c442202b283abd8db989a77fa6ea97029d8beb98365a23a90cb1f646794b169be8e6ac33400c2ecadc7f78a875d91150e3c0aebf7e5745597ea2e33ff211e54726a5a3f5ddee3cab9682a03e646718769498290fc234fa8c6a67d6f1cea97b12d2703fcbe6e4acf64fe8096c2fb078e1b34b841ef0676eb675f85280eaaef3a1ed6a8cc2923d450242e2eb319e2d4ec20d6e6a3995fa768c5c2bcdac27510e5759b316a1ff86b6c905b06522b9226df12d174cdd0305fcee8c06e804e8373238187f5c8ac6e966601a53876b0d04bfdfb6723f904fb7a792590fcf89931753c13971d80d209c3f728ef080482674e491dc0943a832380f8eeeffc54ef17964516a2e49ae31b5063c36db0d0854bd187a0418ba6bc08db32e973aa4a2beda33f845f050826566bc9e25275fc33ace34fac10aadf0058f8601595c11b8d87472a51c843b8309ad0dcececeff95b1806c1afb6286bb8f77ea85b49da4b5d958a1152bb473b042ae2648412f2409f81e4b93cf2dc38c3b5e426037168289a9cb6df84d52e87911538a4a03d4b90ecf3156f117dbf51f75c8cd4e3930733d5ba2d5ea041efddca950b447dbee215f45d7c800f12c50126bf568494592fd447e1fc1e1f482aa8bd1af5582965b39de13739e56333e8e3c30a67c865acadea32f3d315dd9de0c6d2f4af41c711f453ad419fa66bfed70c204abc13a54f699c1c9333ff7bbd4a3885b315e2edd7e80dfa7f3ae4bb96cf49aa576c6c8fdc08c3b6cb19033abf8f1afbd842c248be7aedb1ccbea4b131d8a3544bc2ec4703b16865d41a4d9173df769cb8316ea60da42658e9fc652d4a54997c5ca7fbb58251a597b13747d21ca83274aef5f63124aecaabb344021ecd50c6ccae0703d428958ac06dd9dba18a38ef8ee13288fed64d04a3dba97783f19974b520fe01206f93d7ad815b35f4972420c37d589735b4aef25254eda3cb72d0e2d292477f26d6eef80ff8655928eb72cd9980d28c1538a379ed8250eca9131cf709a59465286b0a194ca9648df3f763db1f4b1b18ee43b15f8301cd4262172c83641ffa94bbc96c6d9cb8715da0354319d4768cdcc7924f3c51d0de2e660970cf16dbc1398121e35cf8b00ecddb640f701d133ea3e45dfe4422b6d0bf2e79aa1a2f4187964ea247d0b60cbb9226ba7f65754d8e0caafd3144b7ab8bc8ac5563d7e8633951447451cfdd770885dafb344a8a7ee7c7e98db8a37e01b16d07119984f0e2b6ef4a1d3e9a1a449c83cced9924b80ce6b385ee0efed804143253aa64cc0a07b73ff4331dac3de1296ce9f0b6cc0190cd9e9e1ad08950a05e8a5669e9fc2aba1eed2da75777b7eafb249427ce79915ad19c2b03", "00ac6563", 1, -1259523388, 1537743641, "98f17fb78b2f5a34a54b6a9710476bf829ab7f5462f2ceb4298183d52a38c13b"], + ["8f822e45013cb6fa0744d034a0487b6ebb38af208b4ce0958bc5bceccc5b721daba95781450100000008630065ac655263acdd810b3f01265e0e0100000000075300ac00516a530000000001000000000000000006d1b702000000001dbd2f5c5c8c7e2bb8dea687d7503f975c95e64fdf46a9b8bbcdca335449118946c0f7284cd47fe15481a192290f7cdbce8fca59c3b431a36552465daddd8a882e507d4b9448f24fab3325cc35dee46cfc96d002c983d7ad646ad5d964d685cb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c8564e7b5542a381b574dc645ef8ce3c58dd0966b24948589738712c9bb4ddba48979ff1156def8db470413bc9cae2a8dad8a0a6d45e65e0824eb6d7732e813659dd742ef970e7c7c0e155368e131d1ae76ee4273b57f69c36559ae8b5272e25948b8b19b33ee424dc2c053b1e08b7e480e5a5ee2b45d373045c375a1326b56b0300f705d2a9ae6066d45aafb8fbfd5b2a2955f322742f4e58f67ffa02d7b9576a032d05e243a11fee87787a25a5322a121810f5ba34387a2fea4615f33eaa3deba00a03a94c285a3b637fccc6b5e2a1f92ea2b0f4f725e2b5f9ba3d4d54ff50511a313c7c59393c5d78905ae949fc1585aa3a4f4febda49857a3f014d3a9c8ca89b3b0220846a20932170390f6b038055211df643368d9cb32e3cdeaaa33853d9237cb103056d3d9e94bae1ee242e0dfa63f47fecde556ec032c8b3fa672c4744b8cc7491021ed9ebd9a84ba5aef36965fc95b84449ea30ad3de1f531269fae36d3528e77fb0213e8fcfc68533d49f805fb30ed91513cfc39457e95451629505169d3102a20a20223a3291d5c81f25e8726fdb0f8eb59998b3e104ca7ebf3e652676a3df45022fb298ced0786722165df5c9566189ea5306f00b61c3e0ea149f17c6aade38b2d853c41c72ea5fc53d30fd9d268e79652195269fe235b723b44af0d9a380759f1954eaba5be1b1fe6eaaa1e15eed1c47676f13ebd620020b2f96f51f8a67897c50ab22b66fb2ceb78006cbfdd3a12754ea06ae8b28f7af9e5ab19a6718f664cab50369e3fd1caab56a3fb4175574bb049d1736722c2b25ce9dd38b06e26c44316bb11c3f16940b4d75df274131054236c53ceb9473c79f8493afabf49a1d883d4c2d697d54bb577569d571f74e10abb4cda3b2b8452fc03f7cf8247f3bcfe79d71d59bbdeba2649cc77fc596b0e05b8c79365124df1acd36c203e69541f29a6c7d245000c86bbfa4ee7a12ae32646f9e0a0f3a3a193fec3c26401c3008204b3f3d25415cdeb85369210c35afecff3f965d3cacf682565a2707d32f471f78d7d5e8cbca95af9bd4a11e766569224ad17b5046617264ce0cad7225bf5b52187bfe185f097b8c075a8a20eabed343770c63d0c394cae92d9bcf0e22d3407bc7bb356fe6226648f058af2009bbd5b176f3e1ab8c16ccdad42328dbe59d446ac43efa7e4717b5d40d6222069f128a7c39bcd636d1fd622f40be9b5c0bfd5352d405e286086a8f8bb1ef4ff8fefd92b2537ca8924d915d250f9278133ea04186da4bb38581ecb87938526f1a6f9c0760423444d319c6472df6970c74f26f0de785a9aaf12b6b4f3602992572b2ad24a0bc0f506e759f06a6d212aa0bc937696004c17ef96730dfff5517bde51b1a47812f54b95bc27828bef833f6872f25b806644979b7ad80a9de0812a42fdb5b26c65d9cf4c3610946d65cc191ffdaac961cbf6a4ce5dbde9af85527f89b9e2fb3a1563efd72a0d5a89bd5971b17f38665e145872f73a4e4e7faab3c284b0d1d0ec46854652e085698b23d7379716216bf09a1cf42bb73b5e6d1efb873ccf627aa4b8913b3da13944164d471859cf0a2400250757e46220da87fb31a78fd3b96ee8bd806ca5b4dd8ab8f2d968450bd11088c4c67f4b1a42f24da7869079f7de502bf2c1f74fb7ccbc08cbd2a0524f1081a56495f6d6d7c93d1781acffa0fa4696ea75ddee18c14554ef0fc2b52925781cfe3523d2d6d114f75e4f532e44d204672bf9112c71a5c73f82c30b775311539ff6d8f6348676be0d7c1fd2507511294f9643b64c457bc291562cdf30fb4cae7191b8fed5ab1326bc8d81db4ead56ca9522175952e548e27227d546cf211de7110b1aec29de2ee690627fe07af68366a31aea6512f082a02a6610053fb7b04dec602c7fcd53f9de3c3440e59b89e13e3bb3aab345c5e5cbd5744e1244e2bc04dbc13e074344ed93cc74a495971b9d2dc1f6c50c783aef31ab88dfeebbb4c6bcb9577db74d5878f6a41aae7c99e485b39e54f74d261dc0058e93cbf49902481831f20da9122cde8e37bf874c7064204b7d87b4cbde9871c064e13d4f10e66576aea9ccffdabde0911d07bd9f03c2897caa6e94c950b8712e637e8eb891add43590aa80b441be0e2bd6db746240056e2e70de806f3c0e7623066d9ea7b55e674a44f76e4f816e4a72ef0c75028289bc6d8ebfdf3da468b68ae6895bd013327314a2ea08a588de82af2ae1b9f570baf77b4978969717479747cc1fbafe3b59dca8841dc4854c724168223ccec51a89734ff8774253eb9ea40439941440680cd13b714d708af5aad638efe1c1118f9b79350912e806e700562288626f914899687790fb78fd95f40ce5dec29591fc946f3247361e1646b7bb752c9b4ec03bbf59d264f5a92fa88af10e06d91a28e41f5cf2a89e0a1712b47a1d08", "005363", 0, 1102593987, 1537743641, "e899c4ef600dc3606cccfde3b515cfb8beada1e540ed1392a003c773be4e0442"], + ["030000807082c40304bbf7d08b9f1f37513ad2bb4f9bc8e3402752618ebee85d1c7e64c159318dbec6010000000752520065516500ffffffff797e3cc1b6bb9addeca1b04655024af32b1898e4569f2577c3592296038ea30c02000000066aac5200656a646500506dc84b0dfac5af6040d4b418b0e931afa60bfdc53dd72a686bfaa2a3085dbf9201000000076a52ac536351001164f03a438b834a28c7af0f7fd672bd6bcb4087d54ea1b097cca91fbad850217fc6f0ec0200000000ffffffff01d04ba6040000000004006552ac643459f00000000003dff23e03000000000000000000000000566d9ab6ad2ffbba2acb015336a6c3dd43c7f871ea157f6f13a7d355f3f85fe14908df4de7bbb1a6445d0991ba71ca09967163afcdabfdb5e1c4fd8371c5d7bc62c62373683f72fff347ba4800c701adbb206a284bb3a258396f9ed8b0da441900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c884b148f17f541f5907ab3fbdc215d7976c0b941566050da6c28bf10d7ad5aad7efc0fefb93d0068ac1c245b8e833f800246ed32cd221c9bd4cd2f8bb53d9029815d01a33fc8f800a0977239f56355eef519160aff3647e60a45d67e1c5eba001f2877cc95642cbd2ac514ccd118afd88e0fc92262c90b32efbb38f3884d547020dffa581fa5babe53a4215a4a611ffeb5937ed42d8f8a0ade4b653dea51853a70223db4116783cbdd72f21d53740677748f5d3c47be889dcadb8d3a340e6d969960a075c4c629739482622da111684aaecf75cfbd40e5cf897a700942f691bda6aff16f6d5718f612fd55b7c9fb6acffe803f31a1fdd72532dd0e4d3bb9945bf908503020ef482aed0b2dcef561927f9dcd97e88deea629e12f3b0b73af0623597b70403197d37a9da4ddaba73ab95b7222413ff1cacff47dc7e7f82629976e60b887562032f166427c09c838c8fb88affbed59406ab9b206c4d2238f5589b5f1ded4fc142022d833f821a9ffa3894609175cede536d132a623c46266ee77318ccdcbc064e5302217bb82e45a15781529913cd297b2a25967f4c574106c89ffe93ab944fd2c2ca8142247e04ea11836fa9dd1baafccf831b730a6481d5a64e2c2d382711f664c5d10591efc6762f5da4ca8d72d8e40872b8306e2bd1458951f3477eff0831f598c57db5646b9e578b554d954215f4866cbbf48a68ba37b80f33280377a78041ccd1cdf6c96beed1927894966ab63809646ea2514d52e4799a5188b420f62697311f6ddc301739f53b1035547cc15a74a4f736420ba298e073a88a855755c88433114e40593cbe8d8e4668fb5cb75e8d6016014f2e4f28f769f80ea4c045d9ae84f2b3ba5fb4866cda5a9df6d444b457765e3b988a80d14554aedaaef4795bd6bce25a27e702cc570a441fe090ffa396a99afb4d33ec99cb299a98cae869924525dd67a893c76f2edda8d5977bce6bbf4c1fc1451976311b8a6b7bcc2f7650aac8b8ab187672f48d0e517459a1b40c6205a4dbf199d99d25954c85346854c17f93221d92583576310837aa1ca5370ad9bc3069d142ffce7c565aacb9bdb9231074d85c4f88a08d753ce52e1925ceef63aa1be9189c27742a0b67c461bd87af1f4d42905b5c293ec535d5ebd65e66e0a809d0a013950e1b06d398aec8492541c044672b7f64fedb8f8cf48508ce94eb6edf3ca4d883967439f7898caf668cee3a5ad0ddb8322024577027c3d7a5a354d8794e6d87f6362ac55166b97dcee5db6981c7622f67e96bf34a1c0d42f11d9df756ac0d48a02ba1b57261f28a9e91c09ac489bbd4b32d947fb08afc415a55801eea5cf0d2f93c23e1fd1ecae09a904af6e7d04c882998415b518c3cf9f148dba6d3a21f457a81d93d01ef6b716c998b1423e39991a330582c61686fcb83326fe61ef00de4ff41bf0846915a3aeefa7b1135f8294685567509ea5892316bb1ccde5796d1366c8d823f559ac8c96f0f1b7de9390f6a3f07ac8b6037becb672fc228effefc3df5193a477b00759491ced1361065c6032ee86f54a931d6e1f99088fd69219f86afe4a93e841896d919f1211eab4a272b4cdcb8a8a22114a4536d4df112a321aba58ee83b9483f15d65c6452fee7cea96501df70aade5312d3d275adf50e86fe5699505e456810035cf2f81be7acc181893c51cd64c677f19a29f7fe4a1da352e518d00dfaa49bdf7a0eaf3170c51ee1173e43ef9d221dbc70fd8e154a23e6ff605cbbd7f977a9a8d232d0073c37afd0f857df838960786b219b65838924e47f1bd7b8e0bc687e2d06690eeb90e82be6a4245e4395ae46de5204a0f49f51cbe4fd056ccff4a703f12bada0208add2f7977360695cecb03f684c33b2822e830edb68d43107b22aca33cad2bd78c5510a1d11bd73f87a979395b42fa6691ccbd0f83b886706c2b4783dcdbdf4df33d6b40844e90002f3921b5241ad8a594324aa7ab008ef0b11b0ec6b0b345536a74ffdb1b25bc6add0236413e28366c12338c4cfa4d8589c479b718629342c5115870328d752dcb8144c1eafb5c7e1291399c138edef27441f9b5d1c4bc11c1992b7f532242015806f6fa029524302060efd5e28861b52a95b099f7f074a6a985dbbd4bd7b965a63af0db10dab10e63377f65e787aeac991434da3676ddfddbfba3b4b95575225f20c40e0955ba1481db5f789f0efe45fb67b944e23187f77e52bf57589f7de0c0f61cd214927cf69a44d503020673fcb7194d2f69c88916ae29cccb19de8d923cb333f3045d0aa445c5fb46a0000000000000000a294a705000000005f11cd3a3df733f018c5bfcbba192fc4fa8db1c9af87bc47eb644506a3225de1d85f7470a2c30ca4501eacd75b41e1374225c7d85557a93a77ed684e9b66e5b3ade473146225172e0feb1abf0da1d3846b58583d532c668065bcf61479d4686000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000247758bfab2880973336ecc4e71ea7844bb2739808a1ef094fa049d3781cb232c11f31df645a3a0a3aed18a8770f44a7c02bad2f9004c7202815dc8c8424ba9f09020f4c3333ef0d92f6ff045278126b4076d746c20f7564b3f0587625733d29f3bf5c6a2d26f49beede3dbab33d535ef4a20703851d77287850c5f800d66fec03043c88e95710f974f996b7836f268d62e8a8793c7a138409851439481582d68d0224718b2c994cc47fbfebf41c2355a285e92e76429c2fa5ff4bd7912194b051870a065edd242bbe2076a43556a960b193baa73b07c9d02fc30413e543a55a62671fb36e6f22aa7c61b25c29a54a9b0e5bf6f1267cf82d8ac61fd253aea947b35822020d83574b5181fbd9bb17bdfd3e07918f041062cb14268f9f7bb40d48204865a402024891737dd2984c9b995f758efc2ac2d6e8f24b12a349ff9625c9d97b25005f02195bc195519d0fb61d005bffd04bce88771850bb30b9f4d05b82ff1591ac02b0020f25684deb2952298fe77b053dfc0bc184221e225110a30268723298f14c6167022dc3351c44d8aabb470e2d8f5e84170a255cf97bfb588c654212a2445db6f8f93d18e1d95159ceb9c525be41e0cc08a26a549f7fbff01867ee5ec35d8ae82df9add5fc54a32472bcb1e630c6c80e9fb314d503ec0ffa8432485b79c2590f619bb37aeae99fdf3f9fc21824398672bfe23949708ba6dfc9edcf91f8ee0acfc9ba242a17092c9a2eb4a593a2a21e82a8cfb71b70284403b10dfc7971ef60137dddafc8bc001d12309f6c17cd909102df038a90e87bfffc43b736f08bac57d413c4e3c57c0f78c80f624ffa2426c8fdaa59ddda50ea7e0ad8196fca7e0e4700d3abf306f8bc70b421b094ed06129cf080a736a7e1b4fc925f5acdd5b48a0fcf2deb0ec23c689684f6be427a5200317ba1d87a1ba205f87c132285a983d862f82ea2769b486d22b571bad459ff9596730112567a454be2511e63f248ab505f845c5d54d6668d0be384ac1cce190813ab61bec13822fe622c800a87c755bcb8522a0f9770bd58f52c83b59c0caebfded68eb83f63e231a4e5a234ff36e51594c605d8b995f34156aa6a7f210af54cbde7d06b9d32a5a6aa8ba74b1f0b28ce4d6ccbaadf29f3387bac70991cd8ec626b2c89e2f5e0de834185875361ce6f7e89b7e35b4d8af710d4cec00049ad3a5d1a8ff34953f38337707ba586c6277ec338122c586d3fa3cc03171a4333c4d1931b59028497fd600fa982e678583c871ebf5cfc0188e6d2c683f0bc887ff42eb96353a08ba71ee6f25e55bdb4aa7130b87a4ae1e3f3beb9066889e3d11432b5a3c5c3399d14148fca12648392c9d03015adfe547ff146fe5a36bf8d94aa43ddf99327192bcf256135b28270d309caf4d9f3feb583f019dda76b76dce925be2d9c91e86e479b30b089d23a26d7b1e78c17c51f5eddb62cd2df3b4dfc61b968f458fed755b1127d647a0f4500be7c07e56283557e50d3d42205ed0c72bc66b5082e396edf4796ce583b8a0e1187c8cacbf247f60d97f47757a24c889c64e39c75229d0ebac992e859edeacc87b66db30f4962647255698a997ff9ab0b0ca8f18425501227f2084a4bfa9c350264df84665b2e1f75d763bc2c9f5f59f038e90db611eb045d3b2350a421879b97a37b53509febceb241357e3762eedc803db13661a865a25644adb3643de42533988ccc5ea1aa1f5db341b49c3587895fd81817ad64c795e42405c2aadcb30c4b0ea28c6d3e4644c566f45c7a1262a3a1ade8f71dd56ed850dba1b9cb5c2811d398506fc510f6d078d7ecdd861e3e272ed97387e60147bded0910a2284f3563d8cf0e769abc57ed71ff872820f6b014ca2c6b9d682487fcb0afd8f5a702081cc0a5d09b2d30a20b08310d5232ae0b969420abb4cde2e5df2eea880f7a46bd4db7a36c7f628c6560c1dd967a81dbb5d944cf805113a52cf3028e4026bc66372d4b00e81a5e4da7e5afa13ed62728461102a387b8b1dfe1ac56512681c2b6ce881d917388e7a21c66c621d6f416004aa5beb8e01871aa7b8a3ce41e66d552612cfe3d3d7be905b652389c598f5db19e7e2d6d58902f48a210f0e45b744f56850c4b6112d5770444a23cc034fa845430f98a17ce8aec59505fc41bedcef1060551ef7ffdf06ebb75cc034e534ae4022a4ec3e3123a37a67647155e85797d3ddc3d8d91d05124e58a69ccfb7e98189a3e7861ea0e3b51276e58f3acb2cd615ddb6dc105bbaf6a8522fc839f7b09d1e035095b5d8aea712d0796c01b8a3f86cc2d020000000000000000000000007f1afc1751ac4597be004daeb51165ab0172c9b514645af78924cdaa895f6babbd4f990b68cf516febb1e5b1174c93545290ee9eeac0fffd25fc2d24f69f732b7f339fb930ad3d33137048f93e0abc7b833b1036837f39913a2f4ba7a777eee700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fc171c87651861dbc79f60b0592d66e24b8bfbe1ee290d82f5c215921c7f4d52700b362722313712240e26585f3ae4f7162d7940467e8ee32d0e529766d6f9f7296458840101064435cda8bdd477be74447720d87d8a0ba8dbce32a366f34c9886ce758f6abc5d9608a60710d2baa049f9306ca41f0a3307be011ffb8acd002f021e6179f2a377bce54c1731aae1e04f1cad70acc4cbc91f6421d69d9e4c7e7001020cb56a7f3c6d952688e53f70259d39f0dff420c6e59dd1c5fef74b0aa09e309a0b06f000c7ab3bec8a74a1988f113da7ce6989b8db9232856ae80ab3fb442d4fbdba3e5f7e9a43a77c66238a781a3a20fb12a62e51fc81cca0be24e5d7d5673b9d021e10f70727d404fe71753cd8ee096367ee2ef3542c5ec81b126d33baa775630603189eddd6f618d1bec04139539c3c887e9bbfd29cfaaa3c78b3948b4740426636021b5ff02c9ecf59a4186c81edb26e1f5c1431765c9a018e99efbea9178222f7d3032222fb545d826dfcedd5512b83956686a16a18c3846f373c6563880023ea6d2402103f5c7718ecf401255ba0377f1e70620bedbe48c197fd78549bd27b4b059429ef6a9de0c4ef42b4f94096fd7eaef04c12ea1793fb4d52267639db9a5445dccf0761b38ec7a716ec60c4b9f6b8e058b57ff7a610a77c72c7271f982fd387c4f4dc290152a4c3a3b916fde09b00e09cd394bc63a4dd866e6da11c62dc584b5867302cbb17782f057e584b777b72e5a395c6dbd04586996386ea6d3e7f5f4fbeba4ba7193cfe62902525fa0e34be693c002bbc21262985cbae8858a2b856ec2530b23e2776334e16ef20f1341c1a7e48b725d9f7f697dcbe32ef395730ae30dfbfd45fbe5dea81f8e197967ba6211266201736c66ba7b8e5721961395b1d8958e229834b1b57014107c5b85008fb1c80dc75347ea8eb22039e4f850d1fc48ce4f64f0e2d256bfc5b3935476a559f4762da5aa8da48806d1ce20d3e6ae5a6b08290774c9346461b8ef2242a009177b453901f469076b6a2f1ee09edd042a3b614d108e91146a60b2ec58741006a3abe80902b0b88466ceb0481d0e82af21a6ab287f32a15549d1ba7f00c35cffc58f91f12274038e91570ab2a95af341209980f6373d0294456de054c270124af521ff5f1b7217f3a699d1829c54c7c26d17478280d20c2ef789ba520f05660e12b927964d695004aa311403f91a08666839f369288014e05e7b2366afc1df0bb213a933c7aac2c947290ddbbd0e25c60a802507d0488a4009ff319a14ec83c84f68c7666e1d8109a5c0917fdf18b492180b4bbcf217198c0a81a56eccc00467f4adf8a255b1057ab79241a5f55c539fb117455122f070442a958f1505f946b7335d97294ea602fd4600ac164a90e88ae4fbc1f9955da451ae1f58c48de57f1a49f79b67406f3e1a2e0d3e6c7dfab358adbedee5e8b47e3d45bfe0357c30b61eef4e1f62ed3046d27c321012325e3a1b67b78ec5400730f814568ce2b262741dbaacff80bca3a15f6e9081031d3aaa769ed856a05ace0e77ea8814da41c92db85827d5beef55734f4543e62d9f6596d739da89a4312d956c4e746f5ab790ac797618317ffcb60c89f4b55abfdc740ed5d0f374cacbd38934d11594a0c133276e1b759168780fb597b296c0af8a032e93a4967c790e33e3c2928fc1711843a88bef2d420327c651c3df9e6d7164421d6986506cb1dc40451009304d67ee59f3d7d7a91f9c18111bbdf7e5561469b9bcb34d4bff63a83c1a2e5cae5167ed45fff33d106c664eafc1a57d9cfca7176a82f9f3c47f476548f483c944ad1a530e7de88ac864d6bfa4f19caa5335993548c2f031b9058d253ae0d83e617c82dbe9d8873b11871e0d697097e519f80c3952d56695048109aa53f21c9807337136666d64f84e71b2ad51cce508edc8d50b764b1c6411d748d414fdeb375076911c1fd5efe900fa9e3a5819375054a0b823ebba026fba993abbd2fb43096fd312b9c4e3cdc99f32a8a1574d76b4d785bcbfe8511578e49b435491d2f8d5510ead734427d443c09da0040f40084c77202e33a9404f9a585a5b021a082e665275a09e9b6598cf339914733fe171127276283726c663adf896ebeeb0a90097fe813ba1f49ef09309ce3969ee76570bb1c7d63dd0401280781d769e0abb28bd324295a8ed81f0fa630f7d637482e4f975806908cb0099cea6de9332c3b57aee54e4627bc5dec457de02fd3c48d123ed47476fa32dba17ae3d0ac88724a78c896bd40ef1f5865e4adc7b78eb18b29593cc54f0fc926a369d9d5115c2f94df31b33b96f26673059ee971e4e8ed43873fcdbc0dab9106ad3f1ef2892618adb66024c73e8be46ba384536240f5d2b8e1dbd14eec1bd74923b6fee23ca9ceae70c33135c33f2e7ddad1ac07dfe79f06", "656351526363", 2, 1770261637, 1537743641, "2d051b41d267955a253b92f06a67adda341aeec674035ac6f6e88ecd45053260"], + ["030000807082c4030419586f769d0b269781b5eb9c10a7148751d721242448a270569eea5fa9a89826000000000463525265aac29ff93b536a30a17d0eae18e4fb57ae85f0150fa95665e48e282aaed3b19a1d59cab101000000026552ffffffff5b9cf02c35859e1fdc801c7b6d74e58bfe6e1fe8bbcbed5aaedb47607637cbd0010000000853ac5363ac6563524fdf0b4754c5433a77ac14c1b501d8bf03d51bb86e9efc37fef46629813b8e2ef6e0ada802000000026a5318cee32b02ce11b90300000000025351131de300000000000863650063ac51650000000000a549bcea030000000000000000ddb8b900000000003408ce630135b305337f08f4a56a30675e00903b3dfc7c1a7178c2a52ab92d890fe109ef12a5d19d3f0afe7037965d67e8d60a2533b883ddcee9a02e5d1ba7ef789563aba9c9c00af0d85037193d39fae70a2531969db81b5fcb48e0bd77acbf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000862c7a70f5910301468d1e257f134c5e186b283140ccc1ccc1532b1f9a5cf5ea7232e2b151737d59950129d99276cf85b71e7720867c5b4bc1388000fe3a039431541a400656a683fa0b1e03562adf15f16e7f2030970406763321a139a69b1d58d0a33a38cea74799981c1966f4df51e97e4f65565acd55536ad512dbfe702e020446b09ebf0d8bce20ee359d3480a2e84a1a6c7b989c1242a68e26290eecd2390313c56e681ce586f4f738f0113f67460fa1fffc6d44b3db7a6277f1dce1e5fd460a076bde26fd592f86d825bbdd62af94e0e82cf3574035df80de0ac9d7b69a076c070a0d19fced5a3b9c273968c22e0087443a3caf89649b7d3d24c0f1d7df1f8e020147f35b84934c0cf76c2c9f877572c67cd9582f65b52d27e30fc09671e5c635022b953b0b4deed2c5229d8602675c583ef6544229eedad1d7f1e03d045f7b0094020f5a620a8d2c56750ba5810da653559eed5c98719205607dd6c9f0f458a27fc1021d38b742f97a6e4da8e80eb72c0ade64c14013dee3b9837625539918ded6225c020bb7732d42437322f889ed8e1f45cb3f1a75c6c24e5a4483de0aab4199ef61795fef1dc14ab4a29216c0f31502155e16d4008b2dd21d3b5953bb9e14b61fe2f193b958f44f97e18b961a6dbf9f3491ac8bc7d168d5ebec22a4b73c83e2406adb66a099f44554c0ec0c0812b47e39ff974240c293b922183c7230e7fcbb0c8e5414e1f8ec61c88ad3e1df2709c12880196996529cd94819c74b24cc1a7cd479f1f3482a46668ddee7d8ddc8f6867f8dbc3a56431f45e0a6634d46a04a72a5bba04303babe2b0755363846d7de124e91f697feec7e9c172cdea9d44689b19ee0a1be78e2c0ef246135ce04298d93bb20121d66e732bbd1ba759d788033123a90cb43c0d75a6d5e4d9f8b557549b4daceba6e096764fe3ed911e8a79f94b3bdaa7f591b24e7f5d0bbf635583d7e7351ed369bfd400899396ad5156c1e6bf75d38857bce71720195131a9ba490474dce35375327948198d4b4d506c63222e378c844f1fee5438b07dbf010ad219e658c662c4b3e35e490d75b38821dad5dcd50a710a4b228a8f880bb3adc3b0fc57505f0f613f1f83f9147a212b6bdcd334f46e87602a7c1193af9dbff8c7b8b2c435a722cb5df73d798b0ec84206126e22ce39a22964f785ce6d2fef5f5f75661e9a87416e4fdefffc450df1e7b648cf8df1ffc5d1ad985ade105dbc221678bc9887172f6e3c730b2a948e9038da4f9e3bfcdd07a85621604e617c7b1ee796c91a945311ad5f86ea1c4bc1054219c708a97e1687cf1ff15747ec123657a24598c83f8aaaec824e38aef19c6fdfadea171e7cf65c2921e692c361d8f73fee12b8a2d0ba2eb733f64beac27c96f577680ce474e24a8af63ec22a8b0894f983072139ac0aa3fda18a643e6b0177214489552129169401aa2680955970ffc6a4bfeaf39164183994eb648995039f77ea49a3cc700935cc01a7842525526e44f4be91ffbef72ea8db666ec294359005c85ff36720815028f91867f417fb1c5a08876b6e0c3172fa1aece189928d1a6657dd9623cf0eefec452e0118e6c7b6f0ceb550edf4f9b63892ddb57b5ae334ed39d4b6b87c7bbefc0918c3842426db5971002e5fe33f7ba9b654f87c79e9c28f4747046b7a208b23dc12a3bba0d5015695d0b1bf344eed1df724daa129784923ac205063db4c8cdd29e14b64e774cd05bf43cd3774400cd400c6de6e00c414abc8bbb94f6c55307e5d3abea25ffd2cee77249c13a008ecf7bac73ab1486aed5b53ee2fab1895b1f49264a78ac7b1e7cc413813ba47d423f07c09bb4456031159bea09c8307964d7826cfb660071e83dc4f4661a9c8d17b4fb95df4948720ef2078d2fa054842235dbc46c0034ee41f8046aa6df2e2ac9a5314974a918177bcee53b50f95b22a0bdb2306ff3358655451999fc2cb24d70e8ce0aeb95acac6b9cf2f6b1d53216850b78c000c304944926bd7e1c5007dd9001c15973d0ba815026b34590e3984e6549475e08479ff0f67e575a1954cbbb786e09ae83c53ae4dc9c1151e45a620d528f20803b305721aebf540f9b9e8382d800722b0d9be56bce690fa24ab01a3eb82b7213103cdaad72cc9bf87a017e6d51133843729c74ae0883353b7e916f734bec6f6e303ca26dbcc9e43d889b13d2e3eed2a0336bc61b712fa383a4b7a7d28691b712341db536da064680d6b994af1f6014053d7e5752a421f11efbd7a4c43d122418ea46c90b1b65617958b3557589277b14999cce04000000000000000000000000379ecc0631202afacaf87d08e7fe1d1ee691586177e1694049484f109c835cd528819f4727f5094b1933313be3a49224455c46363cb8ea1008f21d22c2e6763ad471175dd19399fb5fb6392cde087c6f5e143ba530f8509c6687ed70632ff9690000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045bfc2594b1251d3ce06b00e85bcbe4ef22526a8e0fc9f6bae6fb193f3084cc5b26092404a9b6b6b20fee39cac24e213f483b167e5b88982eea29863758a5b8a7a8e9c247e044933c9484437cff84f66a28c8e0849a74b788c4660e2f3f8ab163b440e242ae3906446f631b86998f5c72627945ccae4434e95314c23b084f866032a45b8fd2cc11873465e3219f1c139c2abd19658514358fade6dea962f0919c8031255adab5668faebd120340fd2efee7d74084dcb4186f643d046f9e92a8aee1d0a00bcd6ac77b1382885fe5cd60a6223ecdf98e11cccf8a6a64f732abe17f91dbfb82cbd6758e90ea1f03301bf1caa1370fc06c3e751cfa1a214e9a8841741450e0224d1c7ac01f818c571c597fd4e0eb938ff49e78424b8b10f05c9d50a938e66e20310ee7564e26c8acbdc4b4d678ec1633d254e40ece9de5f1a1f8119c38d40327503232dbe5f380198d3906f0b7577836aa2124b09c06cb556cfe13135ffcdf07065032afac314a8ac5b77318d0c4b1ae0bdf2432df231c5712f1fed273930b5e9a4350226a570c99ce10ae0d72cbe9decaaa65e5f843c253c8ebdf9e51515243fdad58539cf983f9e644ceed21d87b9f5d34380b69f2d7db797d7536b00d0986f5048f29ccd76aa2a4820dce993f086bfdb7ff218acaf67e4da5901d035cf7321671851f63a404054b88a5d56b5f27d36916f7b75fba3128474911ba830f41d0881ea7ca06c7a07ea29e0b7eb78927b3fc79cbb701234b1df979da993407577f617c96f049e09470c911c540f313eb645ecb5da4e55a75f69564e3471bfdd3bfb6ee49897b7b699ae787a55f86bac5b4a17c849aff33efd8069f9ca9d039dea8b9b8fb57a8ee40a656bb152aa930623c8c713cc977f71745b4c2cd5c581e5632e4ffb6f69db9cdcaf7de5156fd557f00ec5fdf25e4d265173284943618acba7022dc355aedd48af56ee596257346b26551af1477caaf6d96c5ed3b43ac5a0e0840a21934bf82859a6a420cffac49d7f6028a51815065a53c34f33a810fa148bd2aa8f4936f14be0cb883e3f9cd41e0a32999af0a1c53cff93e1108b491e1590ee6b863cdcb3007b2a3eaeb0a7bbff1d3e8e9eff79abcce1b79556af91ee8d0dca634137c7e9eee11e0ec1d8907eb64c90b92017c52e8d27a35be09f99e8591f07e701fff93e81a5aff4125b557abfd758ad4f0ed2e1f84556320c554179a404feda43e8104b55468222a1d3e80c6afa7b00a9d20481dbd76d702cd4d5106a0b9b1e080b2037f223254fe12a9c413b4147b7d9051c32c46d98e83b51b871f2149417c689ec9c3005fd8da886d52362236aee7f07ca9e00a973538ee5c1e7d071aaf40b97bd98dd25b82e597d2c460d6069728425240507c0f6359a3e240af9153b5d6f362125639f8baacfa48ba16b347aca0be58f44557d6d909d61cddd890499ccdecb35cd52378209bcdc50692569681acf10d95f34bcecfc7cf364f079a94a5c98cec27982f340c9259295721db68325c9e761212b38ad3109d7a09046bc5838ab89498f85b4723ab6b15c11ce2cc42f2aff397a62b106cb20e29d56b7c6bfa78044aeb98302f5aa632c54c144565e70a3aaf965c4a83f1b161c249ad2a0a0b35d6dcd039ec3b7bbdd3c6e20850b88d3a7ccc0d8a0478e2d2aa732e47647403f3ca237fe995a7e24de0e5168d93ba2a60140c93c3b28874aeea2e375bab493fa0f0e8b27a5a29468d7d77c22f4f6c4c660c44424777ec0e24200bfc8c0daaa72283807148749cc60b2f0ef28ce6abe8c2ea5442597dfab66d06c6621bfc2f8dd995d225cacb45e4ce7651e6e90b5ef1e9d9e8cf8c776ca9ecc7cfdacabbd8b50b8d78cb1a1e34f98fbca230a9c4bb6226a9655a060d39a976422ae0c9ce0a7821aa519988088d3d210230915cadd6e468d8f0ea02bc4c42a4ecde09277aa84878e63a01f94758cfa2cdd3b08235adc70421e82658cf5861aaea7e2d7da7796b6a9b244fdbd95b3ec463c831ed3682e6c610e19ad9e8f79190da4671567d27a6717707963ab5fcd7f5dce4cb82f7981ac7bf01348170dd98a71d653df364efb5841bf45a9b72980c4f1bc5ac5abaafca9c4c4b53c3c8ea2e2b39361b5e2001ff81e76ce0da4de9ccecc6f61e8856131845a5ab163d09bfe1f37cd1a733dbfe6a13eec840f9c5a93695f4caceef191f0b4323c24b172768708ad07716f81a15df0c2e6ae6c2ba7862d19fd62b5ceb60bac2d975b6753558e03c8e6a5e437424f325c0975e9b3873c14f56a0ef5e7b002d44056be1b0000000000000000c2b54f01000000006ea31b67e662af4f05d0886ff11bdbd6daddaa56193df904a848097c42149a46c27117b1c4ec701ee555523f457c4b2789e773195c54767ff8f3f8509c8925c5275fced06f49dbc8915be2b022e9a6ff1ebf31162cca220052603c3027cb8d5a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066f53bdd0211fdba2514aa4da4f105233bf2c0761b0bd7e4713c077583f9507e7c8f8d4cb7160b9dfe45bf28bdc00145b0eca46f2b835ec3eef6bee0ffd0247ef4adaacd8b3dee2e24159ba3ee57e6dec27672b6323917368a6380c543c700c13a0eb1cde78d27df6841fd3f9dd1686b75d5a7a5730d633396e1ce750056045e03067be382de2558dbf6d5b27b8a406848599ed85ce56b1215cdd0bc12ec89edc8032e5c29abfbfccbd97777526da65738e22b3292e9e77d7994a32d7a11e82f410c0b012e2a82040409c635941d10754fb475b52ebd92c7ee852fa87d53de3c80c9eb880a5a5d9a3147b154f25997d17bf75d8e73e6ebefec6dbffb4d6b1bf5425994032fa5b3e4da2a85d849c1c47e99edd280c7748246cf816a74f2ed2fa22c84ed01022204dca1774ed025bca78c154328d61dc78ecbcedbffaff3f55c5f3aa91d66c2020774f0734367f4443a86c25867c03235e2096e805572365d0aed7604f2756ad4030518d934a6fe596043f47aebb932f972e36f72dec134a06ca222ccc840568b70021dc7b58913a5a431b5c05f2b3de64e0d0cac546a8b2230219b8d4594063b6c68b08f21569e77707f3bdc9673ed2783620f886dd38b5520ffe2027bbaa6e4e7937ae466a40f55c29d17fe53b47848910a816dd74989b85eff80e2eb588802f8d79a689ef512fc94d8dc7c614d1f87fd3db1a2f6505f2403f7440d0d41a8a3855c9415953fc49341b2b4a7f9c518b3aa812fed4b2af01e4dccb30826ad07dfa58cb9cd889c354d1176fac6af6d10467f0e1a37a897833e17888619c33c3bd772154f8612715479ddd35aceccfe57e1cf7f4fa166ecb57d41db06eb48404534ba4d3575f3259239cf7d15791233a2e84a59a7c0a5e59ea7005cd3e1b1edf7ffb65f44185211cbcc0924b5e406f9e3fb5d4ab302b72af07ae9a270c2e491948390aedbdef640bf51d1452d2dddd51f940a4c6b3c29ad670f6d115702133f87a28fad7fed7bee9c305c9ce86e510b46bf9e40b619c0f287b407d1de3a27936cdb20c7bb2bd6f3ba97ae8b63e818951fd1b5862767f2a794fc7d84555a1edd282f0eba6f9b48e03cf5731a9be657adefea0ba3a114e9010ca574325f3f2100796d16da745d765f68ee878a7d9dbef68b493e89babfc8efb2fafce6741df0803edc881a623a3db0754af615a4aeac1ceba02b55d6d522ae3b5d417c0a92e3d77584d50e474815b0731f7a26887afb38f7531964cb11c960587cda7d6679040f7cb92300c1a29a935be8ab4a7f143f82783d9b1561de7440ea9c0b6f5cdd76a42c9aff6e2f664ffa30ff4313e6673564169484850e0048ff33467770f215f853952c1c917d5876debb0a0092344a929023b806fdae7606fb971c69a1ca41ddcdc66473fefacb4981051629588afc89ec591ceb78683a5b3129b296fb8cecf6882da0ba0a64f0c20b6a93b3d3c293e686c781b38344c4cc53d93ce0306204980a8b2fca97df58313ff182724d0f21b7c8ce1b7574d1e71f7baf81be208fc9eb0eee84d2080cfa55cc5fd25deeaad28a47067314650fbd085a70761f4d26a842df33172d69c8ca5aa547fee70df441ace74aa56b0e748e8b44898075ac0bc843df0bf6508fa77ce96c290509107292b2efe30305a29ffa58258a38d6c214a06aa5dc11e4d7cf3dda48d99444fefb86426159ee33181547f0fb65eb9e4a077fb6a14f69ae0f6bf59a59fda5df402c3fdaa90e3851ab95e573826579d441e351b8ef92a92eefa62830dd412522f76084070daed783da6825634d64c5518656c5a3f9385e24bac199f580a5b4ce3517204fd1c704e6ac9c029e251b964691d45266cf5750822ffdd91a133660abd496a5c783c9ae866ae9bc1962d4a597b6421d4b1f54bdb700a4ab68eec4194e3fe51a73a22000e1d920ea3a05d4dea2a30d1c51974f699cacbb73a9ef7b193d404b1aa9a0119c53078c6d3bac576a2041ab1678975b3c5d8825a82f86f65e7935daebf622e81ed40ba0eab851f8fe4fd38bacf529c498a00cb999f98af98dab8c2bd401449701cc6484b4759b462eaa9800fc464c214f32ce266c31b83fa789e53166ef8834d47a7c7e0f82b0b8bdc0c3ad9b409567c1a359559b29bf0632f99d1995be721de150cd5e66b55aa8749b049c611911ab3470efc0373e88549a84dd250a5b5bb73450c19ee75f8936322bfe803714b2710bb110a84583eee6c248bb2cf2b9df092d49c3b50aa041f709943b25c20b26b1e7b819cc5d28988e5668f0540d001215a2abbc25ec51912e8476006661771b62ec91ce2b7302f2717bda99e1aa704cc51a1c4e94edd2ec0d1a0ff0d3b680ff54f888210186f3116002924fb88f1a212d16c13729011e7ff0f2ff4eaff514f219f94abc0b14c667cb18f3bda0488a35b0d63c466506", "006a525253516a52", 1, -1642059239, 1537743641, "f31fbc4612090c302d47c3d20e0924c4e432e7e3e6bdf873ea35465c7b4a5934"], + ["318d451c032d02f58585bd87fdfe7d34a3a132625e5483e191c011e7df858c1c40165530e3020000000400635152ffffffffd6c7e875f2b53f1553f83b5bf191a2743048141fa96d8b119ebfd44af0f785730100000004ac006a53ffffffff0843762cc311177530ca4964339a8deafae245c82bd5af1aa1a47f964968468a030000000665ac5151515139cfdc9e01176fe50000000000066aac5165ac5188b3f0840128e59304000000000000000000000000b6695e2c64f37b422f7ae4ed18b639f8092aa14c5469a8f010f13c634438d9c6527dcd43614cb8b5eff669bce275b9192f9ec3af1705f3c5ab031de8cb818cafe998780efc605f9d52ed4c23f6a612afdd308c7748ad8456a38bba4eea7d5a940000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027b1964ed9fe7d1864596ac80920207ef566ef8231aa5028db8f9bffe54189f0ff111b7c2be0871a814d97e8f037f15cbbebb39bf3726733913eace33fa2d8747902cd85d2e00dfb601e04d3d5c6b912ac0c7343cd3c11edd4e0450e5893a0ce3ede1eb7c9917ddcde9e0edece6bed000ba17a050ee42801b29b4d746ef834c303302e25f92dc69c4eccedab8715907b2627703e5ef50e03d738538abe1b485e480207f6dc4cd8eb95863a4376b0f17666294bcd45f5801ac31d02cb2203dc9f25550b04539cde62d0be14218356fcb2fbeb387d5d8b0d29959b1c82771f975628967295dbceb35003b202a89839c78508a624f6966587c45e8f4dc2e2ff686dc44eea030459498356e9e228a4daf2afe1d81ae102a11f979f44b8cfd957926742475511021edae7e64139f5d4f7728a705795597316b522fbceb040ed3fba3c06226472e30204bb2c9b82b1429c6638e0aecabc80405810d00eccfb838c8d8664654a5dca82022899565553a7d9658c70ad684e1868b0cfe42fe31961fc7b43ce620d954d19a00215df43cb50266430198fe038037ab3f6cb9cbb6b9cf581d8e0d2af2fbd9b28b9f3a23357b727aa8c772c027be5f39d07c08a0562ca1c4074f54b5d060c3b77d0bda511e4cd2ce5a4df87bb53dea1e325c60296953c4f508ce920833c5f273612cfab727e61504c29fc667e245bf6125fa6a665b8fcd6809a0ddde926970956b19f8e2b08fe74fbe04a25defefd38ac9b6f50460d7e00cfbfbe6687c3447547fc1b33fc3cff070766e428cdbc0e9c61a24b78acbb9c845702dbdc6717c77486210de49c14f302b915509a32bb9a0158402f3fda2a45865969554ea20de82013b09b0cbed364ca0c0eec9a4ff2a6127cd9fa71331c259d4ceff91b92f1b6c5dc9f52860e06dc16873f0815317c6540ba9748c7f277aaa626ca0dc1e01aab18e18e64fc87ac5a6af810413aac73af3511e9bf22614fdfc7c31df445e6cee581e375d0235d7b5c378e183984a37e2a8c4177d77f61c1e2e14a6c0b54d009209f643755964352c5b5936c2083e9be252f8989d93d4741ad5c8d6bb464d5606962abc8a4ac557ca7f4bc9c39249c4056711fffa4e111c5482fc6e5f582e917561269220b99a5264b50c95e0b4638a08b978abfa0cc2bacb701193bf97b70f065aad177f3f50cae2e9ece9d2e0e39cd2fb1d1b08e1ccfc880edf744d63f9876a89d4e2431822d2a7a543b84dd5ee080a09b64a432e7ad9ab5b7ffe9c68698c31f05c20bc95904c2d94b7360e381a37167f820284dd2447ba660f108be8e77e93b2968ddc4ea11f4d9ae148292dbb9d75f232f98755f6b6b9fb94645d0bb37b783f8d08964884ebbdc9f15db5e458bd7ca3633e3ee790c744ba6e7bb8528eec5275e7c58fbc9680c2a105011e5e22b8dc14f2c626a2e4de3b41efb811a56fd30a68691a6d21ced269a2c90c146f7bc76fc3c60bf4886c5908333b4035b114ee9a923d41b71f93d48f8e304f5a605be28d2f093a6aa1467d156bcd148087fac7a07423c318073dbca227d45af0b8322028fe71782c1da074012606fd5f55ae538fb541a8cf157670d7196e2a1dbbc4210512e54f6d238638d25160ffd5c8df3a2051f1dbf065419a91b38802206b1ff5ee621fcc321cb98bd215d76677d26bf301d4dbd6931b7228ecea1651ba2cf19abb9f172b1f111c2ea9728ee518d98e0db6b4367c4dcd320838b10dfd41f6c4e50ee8fecdb8713f494c91a93327c3e0635808c044a821efcd5820ff951c3ff7f3b1ac4182f8feb243df163832d83677d97f2d0d85621c054f491af8cb84824b226b27f3d739f654298f91db20830f46ca46c3af8516efe4d8af070e2b5046dacb878fe392737d88202f2b6ee6fad1cb3a403e86f3772b09d2bff25d4e04149d2a47475192bab657c123741fb07a53ad2fe39e7ed972c629dd2a69bf514405c23fa8a023c40322cebb85254a35b935d0f6e47d079ea220c2dd466a17372137f14a4a2caabe81d7791dd181dd6522070ecb4cf1d9025585584c1bdf0a3b14cb338a779990a1c0c22d5c61543f2205eff575ba25a2c8914f1459311df0d769b6314db916a96b7d9c69516d6a292ccda8ad3445e30de8a5424703a64dc61bf488c5ab4ae7dad24c7020b46d26446bf17f2f9407f80accae9062321937924522ab85187b86a1fc142550a9d866122ac5d8d0e8aa442ebfaec962a38034fe47df96d3944dfa8895442227e818f56c167df5e602a11a5cc86c1fdf13f7e004b820bcf24181332110cd3f5920949d5a49063fda52ff4b1aee63081ce5b6185e7ecab64f98f7566dc6a42e3ccbb7affd7a9a2c259032b60edc3c358cb89abfb9123b7b64749d933b1813e88ea55da23116cce8026e19c54d7f8482d4f73c4a3a262a198ea7010db1c2c3b0b", "6a6a63515100", 1, 923629902, 1537743641, "71eee6f1a293bd9435a86b8a353ac9f09c2a84d7e73ad206a10936255072939e"], + ["030000807082c403029fe906fefa4f73f6dd8f3cf7a1da1a66c7a712424f452d2b9e5c25817defa76202000000080065ac51006aacacfa2138ff9bcdcab67164ef0d14b1bbd12596d3680b80a194c46a7653686e33b2bb1768aa02000000076300006551ac63ffffffff04ef7b3502000000000165154a1e05000000000752535365ac65ac5372d3040000000009535151536a00ac635231a202020000000002636300000000000000000200000000000000002c8b910100000000b43f125633d5508153a3c2c5595ffcffe2f98602673c6919677a16f0ef3a114d347b905fe7dbea6909bc4a9c29904a150a9c059a085cf1d83c638b6eb011adc8327f01f8e275bab6236a82d1af3ab74e4a43beed634e5f160acd056bdec196bd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004efc346aef9c3979ca803ca86a2fbe1f8d1760ab2a4941cdf78306344325f9c7bd318a497e843142b739818157c63e3a8b1703381fef955cab1af2a8f73390f35b26b23a6584606a6491c80098c08c0f530b31178b6dcc651f690045437c71e33d482a63a5a7710434123ac592981633172d9d7def02e46a45f578e00bcaf1c021394f0a2341a31526bf8571a25bb93e80282097a991978d9e5e457aa43b5688b0327d61fbfb46c14c1e03c4623a8b0054b9da00c6031e39e5b2443c9212249b86e0b049348bff216f972e048dd0f26c308a6260381453748acfb45efa612f7af5eb5f901c69469c08ac4760b87aba15aaa222f83002c090b75ab56bce95d2ffd7a99031c138a983b9ec435e40b2593bdfa975c30da036024100e4052941228777bb9a40214216fd7866ab5840cde5d029cf6a29eddf3ade5aebf8fb4558ad06f49a7c39d0300006024df3430ffa5b45b2e0e1e0e965bb7e26dc866b26495c15a0f7617e2a9031bd80d405fde3f4236e0e89282dd40ce2123a87898c7d261dd77236cd48da390032162535857f866c2f884f898f749cefb718f3960cf9cb22946317f477819be1e3e0e4bee0b9ee94fbcd8cb2382cd85f762343353aabc4650835002c77f6edc7ec62fc84c747724d9be6e62517bad65bc348d1ba6a0ef9dc0ba78ead1d082276f1a88255daea9cab0666c756ee1879f93808e7274c72614ff79923b68a15ed88dd63c65d53c0aaf4486992df31c3f49b4c6edbb904c77cc06ed6b2a9873a1ff5b6915ed3dd08c584c465f4196635ce7c45cccecdabab331345e5f0ec4681fd17bdd26bb59bd15db190c1028ca3099fd04d8ce3adf1cd255b329f78ea79429011cd774a6c9391d9f52c54f369bf5c9f1565de8040192a9967b8f71d3d44f37a61b8eceab495cb2ac6537e90caebbb90af9fac7f209ba2b780056eaf1a14ff2322a0eed5728a9b4b39809382492b9898a547fcbfb2fcf40de21fb0b23661d2216ce9ce00aef722785d20dcd6c58a1d9a2be880eabe8af42f90f2d3cb6cb254abc03d45f25a5afe94ffbba722a20ead12fae12ecd6ad414b3b9c76783a47ecb097d8c9e6840d869d9505a75d7ddede67afe6bd089cd33c4fee4ea4e5839d32301f77a3c7cf9f973c6b3fd056ab8f7beaa5437e0255dca2638bcc92b1fc84f30e8de7c4814327f9ef7b4f420e133d376b9ace4370dbbc52cd8b6add99a60200af7429768a9071f36c3ad1c1fbe4c1e1431cb4de68966f908ecfb9d9ae1d3c5ad7ac2cecd6c02349e2fdc85a3bce5cfd45dd59ca572c761322205642adbe5b88ff1c5b078c7f5e5556ad68c0e1a38432e934dd290e2bf42f0f086b31aca929a5e302028f80ea5a57c4ffc3618716f0f0522da99653a66653a455fcf59beec3c5b68e3435219fc25e7633132d7a37114d9fd4eec77389ab1ed265b37c65f36575cd3cef9c3667af3609569b12d0463ff65ce86f692fc32bf42c250b45d1ba1bbd7a9a7ee0c5c6674f7dffe1384c7768ed7c27de43cd6d70a1aff4becd67e0a429914c2128fb7b1d8dfc5b04956fc0898553e71a98b0b96a24e1b89baba9cfe979ec6542982b5fa2f549f1fa2a84dbeb0399e4efc04e6649c65c442ebe60b4690402e4032b19d6cb774e8f8715c0bf28b7e073601766d33832288019df1261ef31bff3fc5d9262cfb92846bc5768f04e82f8e32d2db454c8003ef39187a96c3847711bfe69ed6e9fab016865045413de6ce67687dc379e97754cadb34860519e649be171aa1adf993fbf16019fba5bfb22fff4d25b2052438ef00ae89debaf3a40a7cd576081fd899fa32773fd863f28d5f4e31b8aed349ceab60cf6dbd950511577802320c4b1077d32e6ea7164d89218c9df2e21c3405983dff795a5f797d726f9afc19df599d2a2029c78d75e7cd3a89d59da63dc05245096ab4a568a17a586e3feb67c123f6d0d73dd5123122e113d749852565ed73d99f910758088eeee1ae0943fc5362c64f497f120bb978635a26e426a1462c5ba8b0fe8bf266798a2ae2f7a781de666b84986f056a9c791ed082fa64b047b9f4d2ffb38a60d86cceb558bdcab22681250a448846236a393ff353bb381b1df108ca18f1734a368eab609d4d02d1f6f636fbd802b8e3c83a217efd27c01addd8da68c48b0748609432f4f78ee9b191f0dad0479d170d2a85262ddfa5fb15661b0ae92af4e2c2cf73c87e184141dc1f35134dd047b5a90ebc013c9bc22f3b070b9082de1d7093a027ba148d9a787d17cce08a46832b5df5c8618933bc7da24fb37edac020000000000000000000000000c34eeec8016a89781008a3e90ed594cc4f7f56569698e3a2b88794cae1724b4d720240441e8418d42865df49e3b4f4b06824b93347210062d459697e4bca531d457199df56c11ad93580572522217253eab437bdda0bbb9dfa09d021fcd4def00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e05b25ad910467f6c40e6622e6ba688b10dcde4e4d431ffed7a0632fb5d550422e9917a83b44d45d75ebfaed2fb8622585cab9045dd0c6801dcb6fff703f47111efcdb2cbd94759a09367fafbafcbf7b909315706c3bb3976ac6a6212a67b6308f419d44fae1a636fb278528faceb29695abd579221592edaafa62ca3c1408a00219db418fb85acfd30d72e69b646c419402d6854a036c43a0226d646f58b4c492032773c3809c7bd18b8d74d5c1b5ae1c208ef15869d7593d8f24e13bb39c7527500a056c8cd33c73cfdbdf70e72787f55c6325c043321a683805da6937ca4af48a0058d980eaac96dbc54b9c8ecc7c1b4ecb0b16741e8402d87e7eada738c00f54550311ae14dcf7742d4773f5a4c00411b93323acdea1e3fc3c5d40cf319788195b6c03070c20baae942a2f361071d9fa7619ebc78f9a21dc7f29110ad5ccfc6ea474e70201dda5b627a9a1213510879cf74066f32da5dc14d904dc956faf99c0aa5bfff2022a6276d25d36cfc007944dd286d2c69bb822426b176b57e79064bb700ab7c4f1021d4e082fa6b0398d9bf06bd58b676402e93fafd8f950309284ed8f452d5722850ae281c9958fc72b688ebd713a77578592d83d8783912d5790ec9a22c6b94dc24274375a27c448c16bc3d278d72a692cea3730300a44fa0ac75a12da2f2589593052417ba0745eb25a6561f9ebd37cff432105ea5fec8fe75539db04ed36606a0a2540158764515d5d50964b13a3ecd6b6934c80a28fb164f726b0d3757eeb9f8f5222d7968b7258e50a475bcc191f5c577b03bfd7883561f23e00d7c024d01a8ca2df60cced35b3c4eb9b50cd5d7d99c4dde4e803eaba7b4964edca1071a16de54f92ac80290803ffac81d2733d622675d8f7907f81848cd131274daef896f183db115a6cd0f644b5cee70cbdaad43f0eff9b2d195506af1ef8f5b93e17274ea0d08a209b3a054d354f044e19895f0825ed73ddd16e7083c65e80751e5abc12702b9f3653eb73f1749fe94361ffb3a77d16fbb6130223beeed393d0937660231846d6a6cb9065d09acf8e2e51b7c2fbf26e5eba498a0b6ba8096b4b8e1b4ddd2060001063192a0e72e6cf5755570450b611530dfef668d298d26ab4d14f4076d0e2726739dcf70517f2e88867ce4ea2e6894d3938127135fabc6d31a9f54f1ecdf02bce443ed2632bdfe8fd8f65696594f85c039a5d84d89d334099773ea184731dbc9f3bc9c3247e27cc739300eca0e0e262d9e2ce92b879e38098a6a113b36a906e9c4af71a05ac83c7c6e7a4d9aed9597e069f40ac4d941451c2f2cb8bd38f28c9a0dffc0ed70b34981fe4556a3e4bad20b91695d04b8ae0d9ad10c794f37620ba56585924b49a31ee78c5299782fc77aa27de9076cdc8989773ea9b3c1fa7a40ac741def8fec27c4e09b385976d900b94f10b2e1cfa24c56f421fe9f7603189cb2989c484e3d8b97d5a2201003ddabbf7bb55facd7d820258cbe2d42e925606cb0812672a6f187c155a5fd6e7a7675b618cd5bf59cf2fdaea3edc03e36dc3f820ed8fdb195d9fe3e783b3fe719231cce5c19c8793090f7d43f26e7cf540d7f2a16659a2c9819d27e42daf59ea751ef0ede3fb4b4febeffa56e90f5d8a1b6810d81ecc9a41e34f8f1ad17479c2ef22b42b419b2a81fa7e5d8e8c5ac0f9d22dbc891ea53c03849f56b8e724361fd96cea8bb37b6d8de6a193d5640382ae8b35a4ca61a6b459440a1de34f831984e8a2e2bb69755792c934f7dc2d3bff8629d9b0ac0a5e983cda7066d8f03d48e510c4068728eb25c25a6ba58ad794078c9f1e541dbef9e9cf0372608a9cfeedcdee4240d13e290f0339b7cf73800e227ea2d61899d5b2260fdf3675347377eee9828aeafd4fcbf84b8dbf887bb0f4396b5e84e5f3305bb29e650f5c35538692edaba2133ddcb276144401888715ef0d02f19b0de2f494c1c10d361c618ae04dc5f73dbf3191a3c5dea6b2877c7b8ac6048889304ed24bb574d9f26ce5f71f9f5a834d6eaf87775abbcb235dd491ccdfa1648b899aefa091416b0ff2a37731d5fbb67f839756b090ac452b3ec33061ef62a052559c1952663ca0e62fa6f953351aaa75a6708d5249ad445e821df992e2521092d06c2d5c584ae8a09c80c25d43768cb8610bda6fc385e1409ceaaaa46ee41618af50f1e33128393b67c6fcbd0cbb5894d93ad70ee539c9f1071bedeb5fd42b86df2b49267a16641a5204b8cde63324494be571728812c02c132e0e2de63dd4f28663c9d1d6c72a20ec236aadc3e09a8ef3f8798862d4b31aa46dc39faf1034d3ea1b6f41f0eb8f83ffe2388369b5e7851483c7d1128c56bc11f690bca433ff0a80bf48aabbaee55c18207442bf8e230c1452feb4b65813f485e2538710f7511950ec2555b400eef5c6434763e82cb2d20c", "536a65", 0, -712243267, 1537743641, "1935fdcfba6dc80c8c6c58f31081e27be38e26f29adfb7435e163d3ebada414d"], + ["c73534020173cb4c8787255cf5633c40d15cd24ae9d8e05e62b4d949adb766e5736a1b2be801000000046551ac53ffffffff04918153020000000004006aacac644110020000000007525353655252527ff63f05000000000952526a63535151516a0e8c070400000000036aac000000000001000000000000000089f8e1020000000081932c3d591c2e08a1ce45865d8948864974bf7d7252dfa6ae85e8391cb0f8a9e93efc169f3a5b7314083ca72df4773f80e762aa588398d343da755ea0369c27eb5374e50f934e5078838f2c782304e0230b47b67de3b70daadf88fadf8c25ef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000541b544824530891b4c6f05b8a3a1501b468ce0f2b75eb089459e073a60080d8e7fbe651f12940e36c48304904139577910a81c5ce2fbb9cc63519c82f2438ba6f55d5763f0bcf47fa37fde4c4e6d8369e9a410e7abc882143a7b7acf8d1fc88e4eb523842698c747df27bd371ca6cc43104cde932f8942842c5ef5f270e5fea03154d6016136fa2fdd6e32c33a92b9417a9fe813011b9b35ddc49607197682ac5032f3a8746f51f478455da8fa8f6574a3458c492753951606d19f73c537fd773430a072adabb0429369ee533de8cbba5c38fabcd719c5fe422526dccc023b2c0b7af70c892226bcdb3e8015547e5d301872be8871c0e24eef6d997634874a8b91d34030d9ea3c35f45d509b70a9b9e4d0bd83ef32d888fcd7c8bc9091a6e1c15cf5e27020bd4ec6f51189a11bbcc211a131b99b1d50fcb4fbb3bb72fb7bd5a22d2ca454f030586804f555d8d6373e64fb2c5754cf2e8eafb162e24931759d87f4ed9a9b7b4021a417a4f867193078ffc9f56341824bda48ecac2f90651f41619c1336855407e03235cf4533d49933c80c0633d7d692e67b49f6db58015f1414f18c05f262e96a5db665162ed0c2eff400f7d72f531269f786ad55594e55415b7c8461f5346103abaee30f04871274c4ec05e4344f80c2556b16834d1a90884116c9048119bd067f8d1e1ed7ea48826ee6b77291fa023c4253ae338bb1119a1a8b5057080beebd31f53f8b63a64186d5b8740fd6eaf8e8bb5ddf2d4ce0d9b4b0d3513cc42c42116e93487898815c2b2b227f654a1e7b1ea0483691481f75540fa074a3cac82254d10e576f1370193f3e4a444d549c4b687b3bd2f6ac625ea5af1e2bfeb60823351787a71d5f93744c552d094c5caecff69204376ceada599921ee8e84bfd79cc94f5a166e31d4b2017e96f8c9443765cef86e665da2ec50036a00d774201bc4a1c94a188f438c5f885e3cbed28b343a17e8bdbb16b116dfe6b06749d55f7b38b251fc64423f3f3d2dcbae4f194fd9b631152fa77f7b7b9050bc29fd621c0ff13d68c5ae3e056fd1e2baf2a9c4c6156c2747f5ac2924bb9cf3c21ec6bae17934231dbcbb3ee268fd79e56a74c8e030c451bef32354d97c3d4525d10423c7e2a84ac2a386189e7b2b5a8a7bb7259d429af52119358b63310d00579de60e0fd397c819399c7673f3a033d46968e1ec78638ae36e9d9eae5d2506ec9905c47522d19121b619bc4ca605862ce07bcb88d59ee2ef451ff59a361fc98444b10f65cd8875f3aaea6c5f0a9e211ebc77169b0310a5928ec93e94250a7827173870d69b48c0204a48b2f0e0c818e5a742e134c08908001bd2b72e3f73578a2f0bff1920ba8f9038847da9072753dcaf3b1997408989e494a0f9b0c3847ba634f5b3bd33f9072a37a781e16e7b7fa31b6ed09e08d7c4440304f01963c08a5984f57c10fc5e2a52aa58ccce85353a9b99965484f21fc9a8c35e66c3d0cc454ab0bac346766e3a18266956fe853a885dab341ecaadddc5febb8a2127c0f56d6048e757fb348384cfc3a07a22ab03be5e02f3384902102375b72d64cb2e865f221a459bd20fdde303dfeeb386dc0039da0894f56cacfb26094ba8f319ff057498cf4a3e5b5dd204d5a453f3522aaef90d053d3eb7497fda9090303d37fce7f704e06ee85ead6e8cbb2f9c684974b56b6e376a148b5afdf3fe18f37d99979cacf75ee6f753338d92983360bfe112d3422f15523a2be4df5fc8b61bd0e21ebff094130023078945deb0f3015a1e01f1360ef2bfeb1068cb987b9841b6b83aa6173578e22fbd46aa6788d1c92e5118da8c6b92610fb244de2d9099992a2e01de0c37e461d601e1bc9834715dc1c4470407b872e7d5b1d8edb8a486fed2d9db6c62f9e44a257ee71b1017c14505b8fc75698b47e164f60a6e97080e03ad83d10e4a256539c3e9c0ee2f70f098cda65c5003db0c61c1715f0f52e5fe7b9cf81f9be383e73e410f2a8879062125e84bd958f00d029191b2be99df99b0990a9ff8bc1718790d1c079f56ef6b45227849346c5f208c6c2e963c63ace11d6b22298a31e87e9562c9ef00b072bd2c99b8a59820b3df81d397f2efb0179227ff8144d157a44f6bc4f55643ad8dd92d01c98370df06a0b7131fb902f793c438cbe63dd1f9d42492d5c3ac28a4a0b879bfa40ee649d0cf4144a270c94b254dc01ab6ba4d0a8c7e48d5992ea42eea7baee8bb46bd7a0c35c4a0daefd27c964feda50b56ac9f9b45fee7b0caa7c5112f4dd84c5b2877ae346d647d7c29b85cfe01a10885c624fe19046747af6be65c70e7fa451b1192494d3106c62a36ca0c9e0794a607d7e66097d34bbb319c602b848267e7d5a67836e2566360f3af4be65fa9e0169d8af37c77fb06c4110b2e05100d27892d64646ba0d63a2cf362b21025207", "", 0, -1688897625, 0, "4aab73ad22fd39cb77ccd6629f32ec29bbf211877a43b607798ecc8f40dafdd2"], + ["030000807082c40304f33fc0efdb9d008851d0443456d286a6cbb0f679d6bac02853f0c407ce13fb1c02000000096a5200655352005252089149568a972b1d2a40c938a2402e42fa7f59713becd55d623781adb46ecd057b0f6c250100000009520063ac52ac516a521aa8074534c48adc8e83d9dd4782ede9efe4ff3692bfed02a57b02ffa2aa2ee4d127ca3e00000000025163d4684ba8daceba1813e62f8dccaa68f39c23a2a462941aa135bbd468f1a2f8ed0c6c384301000000096a6500516a63536551ffffffff01c639010200000000056aac6a00000000000081c44acd0300000000000000001a97cb040000000024d4a35c7cba7ea431ce32c4e6627511fb9209a8d7d42dd172f024d4d0d8f94613da5ca7f5fbe4d53383fe457750571fd91a0b7233ba9768a4751c6ce31302c5515084a5906b7b4a9e93fa4bee97f201e95dd085d666134842bdd92eb5560d6e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006c4d162047d3224d8a0f00ccf9400171d789a5a7826013ee503309f2ecbde818c55676a0e0d5b7d11a97f31d29fa7a1619c44729cfa4a44d102a9f511f48372adc99ab9a3d62bd57a66784bbf114eb66ab0be43c4f97b4516104efbf6473e0a4b0b6dde2feae3685f5b1a89cdd3cec54a38241a616d49ba8c85ea78b13af3e6a031baafa53cb749272e0ce597ac46a56fdbddbcc507d90d91e631f54ed81ff47a60213fb3e8197e74687c140bbbc1e4ce284b72b110b35c4932f414f3ab591698f650a07533c3b144e100a90419079895a59b2280c874daaf09b49cd9a1b464548fc80bfc482b39f84e782ef3829c5aeaa3ad1a9bba4562f9588c1b628c36e8130ae4f020a36a75ca6906020869bc8fbcea803c7ebe2d4b7b46f745486edb9f7b30edcdf032aa18aa37f338be6cebe41b9b7a863c300a41f210f53a76ccbc00e1183188203021e0097fb7519107dd85af9077f3788039389c6cc7b4aec6538c3a2204ab31889033006facb32447fecb680f48a4c354aab87e3fec121d294370e3c2d8c4450359002083598c65e7e4ced6eb3cc0edbc9eda6e2f78e19c49e26257f80a695fba035e0c83a409a17b3047fc83f13c94be0c77c5c05f69503224e31a83ea765024a95bc555326601ff620434b4d2aee2323cba8d8628287065f903424ca9c1327675b3c9893f01301c6d19eb5225da4efaae3399e5350d757c241dd7149daaae35bb1da6f06f956d38dc2083680c47cde541c9e625a3684c8af2b32e5134ba8552626ec8f5c51eacf117989cffa45839cedea17078e2e0af2673c3e00e6e1a15d8bb9d5d4587a4c7a87a5c833ff7f20061dd33bbe5861bb67e28a4b71d5b13a5ba58b9129b1b9659dbb27f5fd52a14a359ec5ae38ac2540cad91d854919689f51cce3a5ff3090b220e6e560132230bdbf51a98c33951a3fb35b20ce3704fae848327a15521a2abde0defc03521a351cfcce8886a6d5198e3907f6283032584280ef14be27f1616d79a694b3408cbd43f1a590792ee7d8813f9cbbe2ec2bfc1df1e0dba7be9f491f712e2b3c229bd4090c90726e2eb0d52bef736237bc07101893c2457055c8c93c1e35e3b6f27f52b1722775dd6729f2cbb4f84f9bc8b34ade0663cac0e2d3b1503cff9432c5625b84bce917549baa2f41dc7815bd5a2c77f056441293aafd03dc4e0247a543f6278fd5494457569eb3b0cbf692cf03e8e224ddf1c2810f4cd2709d99b112467827522a3c158923ab9193e25e43171cdc45963c7cb1c38de4bc3502c158d1d0eb0e5f2f27112901cb814a642757950af311d3f08eee27b0a6e8b6bd42c6dfcdcdcb15dfa3a914f998e0374b934034227a1f8351a024a26271950e9e97570e48a2c3a5fefd6933d87bc707df965be3d52a4730567c0062270ad5ccb5e1b6732e3f9d885011137fbfdd08b48fc851c66acca797f4ce7ba731fa5c01e1a41c011d6c1038eaf7b22f4111201a5c8e07cd535a29e4c18f45e65ee1f62e6a5977cbf159392950b0355b5c5ea8cd7901a7a0255593540e32a20e4209e7f74eab6c62d2634eb32bbc70aceb731827fe2734111c9e3942df7b5a34aafa30fff7294610f76fbfa75c386feec7e648900f01122e6188ea456e6d1531f64604e698ca8ca02fbd8c5687d5c1345c63cbc7787a28ff96ca07d36d5050494f14fbef535830fca223af40c8ab2b81dab21c9b6d97ee7701204e92d66d3ab633ace557cb8ce569a373d24ec7ea9cea65bf809c8527bc44b37492bf8e95e232354fb83d6ae7813bcf442c6e461fa7ef64c176e16d9cadb1fd87422da8765879d572a4b776e90f438c5a6061f26e34df605cc7419aebaed6c15fbf0ab91dfc3bdecdb145783bb69ed9a878daa0de3d4dd410521a3948b47a2d0a5a593624698b86e832a9e16283852c0f201785833370edc5ddc22336f831d4d671a67aa4cd03ba89be11bca7139822af4a7a399d14341f8701d3dfa61766e1fbd577d2e39a1833b7b3b7d4793eb1a5397a08a43bf631acee1ea6e623077dafe122df69018174b11721039ab1747bf32f0d47e0d05ac0ad35565caf548ef22c4c2def3945d960b9edd63ceb6239c6e35bf50de88277e264f3f8bf1b46971fe79c95450bd951a5c18a15a9d5017bb665bb8d6ad230e58d27136b757e68b98b3bf1ca96b4b683c5c62ff22fb66bdaae5735e03580b76733834ddfc230b8468703e6bccee7659760975968f43a7f1b12dc59ac87790e3a1ab25616ec3a31b3a64a6a4a8b8f99778d3dcf7387f2508a908f8c8bf60122670399af0000000000000000402e7d0100000000dc859508e1ffea21fff911bc203faca4437dc8277acc898829b61bee82bc88beb8e0ff2eb165770767fd22ce258388e69c36a37510313a75d165cacd17cc5d7fad1a96497edf76c70ef9c1c5772883c2e13ec2a04d8bb0976021e5ec20e802e4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009aef70de460ea87553bb5392ec3e185606edaf5eb99af50f95c6e5e211d923f22136498b7b46cb678e7b0b34ae3662cddcf14e065afe07494035c79503e3b77dc20407831be261fc2bf13054495c5c2a85bb84522e7ce32585eb98c4dfbd10163ff57fa290efb61c9411d159d74d29bd8ac745aba8b87c44ef72e19ac4abe8720229ea2a1b47d4b1ff80c69b0f473f3cab134b6bf0c03b8df5f09d3cc2bda670310313e2164d096dba342597b95a7301aab07756ffc5f2da8502cdf947180505dbfa0a09225dcab918272f9413ebd17a84da8b430b62b2e7e6489df870a299c58e219edc39f8980f61281492db4a5c72628efda2d6cfdbb03c8cdb93f780e4373a8c8e0209801ac3a0174b16d7756e273348eb51f79a4f812c370ff4bb81c15c612228b6020426cb95bcdb45cfb0e19c2455e3fd3cddd8306de5001e3254ac546af192600a031704f4b70cb573dd210fd70da1e1d271abb34577533b96894c74c770c15649be032d527c0632618b73a1efd1240be3cea8cc425d7a63944be9df51884b32526ad40227b4c06aeef908b5f764cad49e74e6757c6ae9241aa655c5c4f67cd90586d20c3f8bc6771a4a0e7f330f2c8055fcfee441af26f21dc11f1e05006632cea0d1dd31c3b08217c166430cec80a2958270c7ea5a73e00de35ac8f0ef7ab6e9cfda264bb601ad61f65a4eef6a48e43659a381b4c8148239e1c5b58a4473bce3ac8e06a80b6835cbc8fecfaf3241e4f3c81f204bf2684ed8a06fb7ac5d93150b275be3639b3e5a530af5c08d50374179cde0c8d421eb86345168f62b948116837ab6d69766216edfe992bae48e4c198be14510e152d7c96f4bb927a9d9edf7401afc5eb6c2d1a2dcc484cfcd0128eeb576e5ce1c93eb4421e843ecee3f5880e901f60174e4a2d215949d6d6b03f3a392e9e35f53ea8092f8c914fc359c3749d9a318fb16186696a14d1d409bab9233e0544d3e2f90adc798b888be45cc3b3c5b4f05a978577ba9c89bf464481fdfa3614d643a8d5f27a26c7c6abf35242f225ae5b5d7a14377ff1adbdb18377e943c24d6e56f71c3eef2a0521c2f20ef35b039e7943b786c1106d81aacc3dbd3a3f70dc2f9bf11e0badbe92b09834c66e93fc47ca84dda642d144665762f7afa5028a89b8b7f9f5a6a7ceeb4fa0ccf221153751263765f5f945e3b691db3d09b5550f7d1264518c3a44d62947abd16e2554f4b840415e0cbe6ffd8fb052d021d839f3859ff0c71217f552695ce151f6bdce28a3359f5de64a2b8fbca1df540ed2b24d4f4bb46efaca749bff3daf1cea0f069745fd9bf24e8dd55956985f11e91ec32b51fa6e58f0d60bc2b1c7c0c51529c2f532d0555e7688520494d3dcdb394931302798eaddc9b412fbbc1c50d39295a7c421232478e0ff8fec1b66813bee5c0b873075d1f98eb9e99609953e445ce2a6a48e4e7e57bfcaaf2e2c2decde8f8c637264e4a8c7feb3df87c2211ffcbcb044e2d01af5fbb02cac4e1eb6dfa31300786d8bc18a91c91877a6cbd225716723f0592d3b54b5e5c4d6c3e398928774364744e490e12ec6dd24fef9ff48325e0e338b00903e7f24f5f0051eec3f257a563a0638bd6bf5d352674d49008fd148cb57d5b9d7256a87236792ae153246c2a3a80897a8a100d57440e2b1fee643eefc4255ec242a080f688775e819cab1a2aa90314e943260c48743e066a89e8fcce3ca3d53293b25cb07cc70981249f5671c644594633391fa7b6ae862e1d84be39f286ead9b17fcdac1880c3c6bd8363772ee1d666b12205e69a5b506182dff09a125f1de2bd944e3f07f669cbd7d046a34c58a4232c6793ab0cf9bc74c37616a96d71467fa378803c3f1948ded325f2a435dc42d05266e8b271287e2d34837743bbec5849c8b7e9f6ae585f2ff0a2ad1db267eeb2e54d3ec2372ca63ddaa863b6f1113b9c25330298bd17ff334baa32d9d645767de755648fcb6b2ffe8cf9e2568da1cdd97db48990b691ad84314dd4884705b3f2188021e82bc69b9fc66fee15df40d0e8ded58bdd1490bcd48c537e39f0da738e9fa9e38db146fa4878d8847a0681104c0d76504f82c5b7d3bb2d4caa833947c0ccdbc9dc81bedf63fb941724e405c94a7af29f96885687cd8898efcd489f967e84578e451aa30739b7b7467285c554e6946db266a1b2ef343134fd2ec88dc8566d276778bdb788fc0ea405d8a4def86591c3f130944e5a6384da5b21bdf742fc0956481cb14930bbd587a2d099a549149d380491c18910909835e793aafb85760a49c3a90000000000000000cb50430300000000cdc7684fe800e86b09fb49f62b5fdce57cd4911f68dfedbefee830e0a77a2934469f6ecc4a3a88ef9dee3a7ddd45b9300e79d4184b8e6e4103e4867ca118fe10002fdd7d50cae6caf86bb9b2945a4d4c4a91a4ff2e50218c60f8848089a1d90800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bc9b540bc241ad2659dc334d30911326fcff8c84343adee4f9b8255ad6cf6fbd5e5850296f7e446bd2615b21d08e91ce2498c8a9f7599ddf21d4cbf13000593bb902a55ba110749a96f64d5f1644d2a6e9c248da8f55f8c18c85ea9d64c7eec35bf38702ba6a8f3e5154d54ec47998dc48738fc66c27e5f26907cfa4bd0a1fb703062537af42ec143e9421bc7b43aa736cdd791aacdd52d9d630ce90154fb1d4810211050b1e0f345d0ecddc1dc7b03be6f8e7087415ccc9ec56c9f335216cc22da90b073edd443ef352ff75a9fb24c4e6bb781c7fe2dddb79a05c819fb648f8b3214990f2672c512dd49a1e69602e8e5cbe52b9c9dfdb3efb4ef808bc5ed5c9131e49031c92aa4829212b7a15a6e9e6bf56251dec8afd0669f8dab0a0abb64de141d908031f758afdacf5398ba07dea9715e6ac39b0ed5558be44398ca8577d492fd8623203151a06e98fbbafcc05111630dc553b8a0001c6a7e1ab6e3fe9d402f61403023d0315dcdaec637c2dcab43c43d7c04f12f1b147545da3a911fcf0750eee0eb6041f021fa8fc933de4dcc53021b38777112f8daa86581b1cc519b5842c37ad69b6438251eddb39f1d2b9597202524f5a36b3505a9708c8c258f973fd2e4436234f551b5e9ccfa008308892333525fe58045f7c577c01d70d184eea484fc451b1fc95bcffc614dbce0050f051176acce116e162dd69b5952538694c1ec28a32b4a463b5dd54b5eeafc149e38507712625c0746d66546012164c5e6f2fbb98edec8cacd68b7b21b5d54a80ac0755c9a06d8fad4066632c007a0dd5f708cbc00092b0b105d0f70546b87b8a703084b1a0b73ad6f8538a02c85525f09ee3dc6741ca562a74f4fac6060fa83ec791daf0e0fc2b5a2c64b79e637a71650712e0dbfcb55a35f67680d5ad45fe89911a17d650cea61cfe373036b41165629a053b22a70860d71d10dc3c6eebce827918c50c7a9eaec255c0efef071b5952db22272b94200ca781622d16598e74982d4898e6936df4183474524c0c56110169b0581be42efd4e4b0e7ba971a31223d526a76290259587770890561f7fe207287b6ba2c05b29c22ef49bf4198c66c0320270bfbab718983bb0b8af5b3c593fec228caef42c1358f0c44e22eb683991d0c7cc7e463ef45859c0538f616df1f50314a543f825e41044f7015b381ca0aab0972228393b9fc9ad387717c90b42152b25cd4ac9d1e6bf4ea5be1bff124dba17566a5b7ef0437efbba19a977f625bf515bf9d378b5fa2df4614c2a3629b3815b93a1f91aa4d3bd8fba9ddccb1e2391169269e9ac7c49470d58591a4d13b932c0925139c409b71b2fee3e6d93f2517eee4055e8ed608a2158d6cd9696ebfaf505e41250cda1b919a07b2e694b725a873615e208d4a9d79c922992c5143b3d8290c3f72dfa425ea10b60abd2d3432d006fb0fe20397ed259c700c81e0424cb0afe2b1e951f5923e422708d341c75e9dbbd469593ea3cba5e16f613918c127aaaec2f857284c776586710f1d1ac7de2278405558472aadd1cc5dabdc5bd658f3668caf995390dab0b25fe0659e6647669b03e397a80444c7f491248842d5e6ec0698dc3cdac9d2a4e393858d31946f1ad69cc493f9a61d291589c0250e090481678e1808204f40e146b03f2820f0d40df89f5e4bd7211a3202267b54557fee7db7d2b1b245d339feca9a28232ea9ed01dbe0581c87a6a88563c62d38c717bcfb152a83796db91b6c7aa633fceda0a222279cffb479c940aa5e8d515aa680fc698a50f04abeb93474376a6eb7cc9121593bba1ec8ea28ef5a988838e340afc76940297c84bddc337f79b401fddf6912704a0745590486856e2f1a22d35da28b969ae54314ee6e7fa07df67cb12f800e1bf8cc8e6c96e9893749a97c9480945c79db93ed08d1aea3afebf1643c1705cf70f9ee8684a625817c0cac0d7a27e901b72eec5e959cc38cd02d084f06b745c57c53f38446a6ab9222137ba219f680d6016906c96a506bf607c9ca5d4ba927d0c3f8a8c78bdb3e31959d51442aa960b52e208c0a4187bce238ee35623a77f917f4b7f908ccd518655661fa613e8033e91e9f5ae46636d41fe3dbe0d324ab6126b9d1c4c25cfb368d63572461570b90db7b0844e7eb7c1902217f5300df2a2fc1f2991fb8292f097426827821eb935b88f6f9f1dd7d636c566f15abd6050600a60bef8b1642cbbdf6387c8f7e768b10ab8dbc410c287d48e65e286583703c0cb2719347184c8999fe10b95e937f146894eb9c3c921c236ca9b6aa8ac4ccee213d5000f522918e8bccddcb4f32aaf52f90305ebe8170280e87b0af4316d94a4de0f94063500a4b748793d351efa8fd92b271c1a9d6e752a20c260705c9fdb08aaa700a7b21da3e90b533b42cc361ba6ff5ce9e090e04e8ccbd71f287a01", "ac5352ac", 2, -1598984668, 1537743641, "7aebf228f8607965b61f661229ec01a68377cbc7ea698998e8489f376f3b191f"], + ["030000807082c40303cea79b40ba32cdd967437a5398c4f4a47f0e7cf74a525c1f1ee2e27e209fa5900300000007ac5352006a6a6affffffff12c64c53214867aa693404e801cf14b9e72c0296969fa8ea56760a28f5b7f75c0200000007005300ac0052acb2bb78421bb4b2ea23e3ad695c7d270d940a5cae4d9243c679fcabf0d65bb28f56ef292d030000000600006aac0000ffffffff015d3ff70400000000066a5200ac6552000000000000000000", "00acac53536a53", 1, -1148597380, 1537743641, "bddde3d0e6cfbb2fac078a9a12082387d7a45c77e1d5a529b233aebe1f8f9265"], + ["030000807082c40302cdebd9ed8036faf39656adfc772b82b425fb1d16235c1c2b9c011791706b92fd030000000300ac51b2732acc2681ff382bb74a085f2b675ac78fa2542375002605a55160a5fe87829d329d7b01000000036a00acffffffff01197c5d020000000008ac51005252656a00000000001da38d6e00", "51", 0, 2022922069, 1537743641, "7f7b8550d600bcd23ece3776e840a5717c2c65aa818c0b684cd7bd8a2aeab080"], + ["030000807082c4030173ac7c1b3d0bc7e21cbff9b8c503416ede9342273e90782c1d23411639372d480300000001538206abe601a28caa030000000009516a6a65526a516353e671de4e00000000010000000000000000161ba70400000000d2304dd426d45ab894119d19c405dc1bcb60f093cdf8fffb0686e7d96422feda8952b99c3c80f54b1b73542c913dfce1df6dbf3cae2c5367eb68ad8fb07f4d93408e9d5c1b1950b6b0b15c51457dc49593ec75b96462ee6ba30dc63dbd5dda40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006d1f7e39e799533e56d2cb5edf1e3903cb061d2675d5b8a574c372d9d5fcb1b4d2e7d604fb20fd8bdecf5c6b8de281f965d4a902ee336c646282efadf533e526c64e5e8e831264631af4c08db1402eafbd7f3d905cd95aa6161ea8db5f0e13b8502b53ae1461aa9d6c97bd0215bd765ef87dfcddd6cd6b403632e35ebaa2a2d4020158be32a2ee08d826431f992a8e027bb963664c99dec2de10bb7f9c8261823e030e14471f4e95dee47a0a6c4705a2cfc047f8124ef939292cc047d5e5ad22231a0a0921a2e568f6aafc6c4f568c15696998959cc30c798ee420418e6659e8b286123633a74d6230a7ef954ee922d714df51ff18c5f4cb946479feaafb706cdf722c022c0be9a5d791bc6a0ee06e5f5aca29c009a083226f603e455f399f520742287c0220536fb09b1ef0217536daf974a1c04abb206db7645e4ef3a602bfcd282621e3031b678339eb92602945903186c5bcd9cb01d7007e4b8c5407c413522caf2b7148030635906c28c4633b186b6602660bef74a1fbb30a167101deed9056e19199f87b030c83f235b53d3bbd5560e206cf3d13cc079e700ea0e8e4e8b2a2dc1a73bb4c2c48fd17e52fcc821ae8716b953646bbcf595636ad58a83e1d6ab4f85e9ccdd17fecf837e03715d2b5e66ee9983e574bdfb34ee4ff37b2471526a7fdcbe9963bceee480291788af98275cea780c21ab9c9cc74daaae0619b30c3db1b68e41a0182874945da202e596526c0a9dde4ece116b55f8402a52bc987413ed2f4aa500d2c1c3936726e6a3831260620c48c5b5fe26a9d2318ca16865b2c90b577d1e8e127a618c7c1d1034595a392b66c995aace15a47b25712c8623c9cc6d5419a742bcc5cbdc8013f0f448d29eeddecf9647242340e1f566c08bd49b3ebad56867dce8393e70c06eaa7ba1897037ee09c39dc3e0e097acbf63e653d4a383233e3c6a882789ae4813372af0226d7847f8cc98c905a3ff89447348bfc3674b6d9e64591556eca9725d6f261fe7e575fc41aa52c2aec77d6ddb31845ca974efed48aad181c8545a3f558c5d758b164539850fdd7d00716a05ad8a6f3eeff1197cc95373d4fd7090e98d9646d30ee9d192137a0532232103d6e9bc199b39bd7b366b1f94a7edefaf77b753c5d85a7426b0b0de131758d526f71cdca9aaca182b1c8c9d4ffbf2dfbf170c36c97017de8a78b596bb31e6709c9f0fc6a2cde6f91cb0eabc59be69d2ee6f01f9d56bb455e5ffb0989400873fc12804f35413110301959dcc3ff73f90ff713c9dcdbbf117805c4e59dda7b095c6b251452ce6d7ed0c4b8b8b8196c5060a0eda7a47e45d88bb9466005e0b4259509a9d51c38d78d347f8b43c02f6f108ac884077c02f97e0b609fd8634f224c9c168e559ab7e370e50385bf393337372673b10bb466da889c3b607501afc77ac0cdc96376f5ec9c229d88ae35baf598d5df6395e6e02d36f593251dabce039ece3f3bfa2c4d1c0d92cd5a29cb7f37de1237912068b3f16512cc1f6f1a56f78043f1507b47d9b66a278d08caa09436c2fbfef75c413a9c9872895788b79da6826754066243d6f515b225d2e9f0706f1f3e560d0e2d1d1735e761e513ee7a6de0561e87f989ae9732c5b70121fc5d13f26e6b18d25502f33b4116678a9b28a07bff1ff55e1192d5b4950fcb828666e33a0008806baebf439a36e7205eaba9c06071e89a8410422f7516ffb92cde1e223261bbeb8a685b4799fd58669ddfc42b918716284f72f0dd1dba8531367575b81e994b84a68c1111de4c9bb0e11c639a3aaeeed62b83360d59f617a3e248e4891ed0bc2c462d9c0bfa96c30364e1638a1a1b2b9f7c046309eff942373738fe1c10dae8a41a8da35924d20084a5eba9b28627b1976a649582317d4bdab1df7313e64172e3ed70036b95c013518d51443676e41a5ce7a5f49a95163f08c7bba7b74b3d62b68fabd1198c0ec7440d5d8a6867f725514de5f15f046d2b2f23d41d74957c8d0499d67bf00f709fea5781830688bdda84e37d45ac2c42b37d6d6f441827fc2fb4eb058e22366269bd58c009a4b7a2b7625c4c5de83d946fdaa64048640e6f78c7af2f4d71f5b0a3d440cf1289415609ef2d1bda0a124da76d001f5e33d2e9035280cf9347f9e6ad264919d3af6a0c6780a0e33880f2cfc975f2d3f33bc26539af83293f1e2b19d5a98cf1d4b5944aec2986c3dbb25d829e623fd269e9a298ab27afde94d4d0744e4aab674abca42df9dba74e4c5a99be8b27da75ec08b93f39edf4df4263cd4b1a59d4a4b8846b8f248a7df4511ff644c6aa72f6e5c284bb3a9a605859a997d6936c5022d52d321d5ac45e8f7146a93d7296d40da666e94d6465ded0202a1c74d0187cbeb1b24cf912de508994ff6e82d91904f054e7d010bf4984c88ea0362d5c4dc21d9218b308", "006a63ac6363636a", 0, 1231309953, 0, "fad09a2944ffac6caf2660f635987ac70dcfc443f5e22f1b3ecfeaefd6c3115e"], + ["030000807082c40302ff0533e0bcef4dc0dbc4b74defdaa8e6163e2be1e06be0dd151a694b46a92e4a030000000165ffffffff256be1950c1618d7cc2c64849efc6630eb91731b1fa29270529cd03723df2535000000000153ffffffff0426807b0000000000016a20fbe9030000000006006a6a516563f8081f0300000000008f62e6000000000004acac5165f787d11c000000000307b96c01000000000000000000000000bab1801bea583314650c7e6992cc52368507c700244f4dfa9b066df8bb787eb438ab807f363ba1ce806e991f9f83eb53a3acf38430091319ce12ef9cf41d7e9e18cbaa530276288882443c8ee1c268050298dfd892a4c7f7350faaaf92fe254c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000321fec77fba7411666ae03b40d389d18749d917d0d734cecf8cef997d901b695801edcbb091c0a263fa1bb5cb9a84ee4bfa0f245dda2fdc188fb3683f2de348f4f42fdbc2f7dec432ddec176a8d98e16b57cd3fd59526c1df04bed9e9717896f7c8437d4bd77c7e4f6ac23fe234a4c130f092b646648cc30f5c5e9b0a4f482f1030acdcf9d41ea398d548386a33c11898c93507fa3893db8c5dc2b1381a409f01402293bb047fd276ac6cd9c2a041d3b8221d7a68e38e0e5b52e9bc07b971f12067c0a028e73d255b22a81fa4d2584592f87d28830c20409dc66121bc090c0c07893427abb6fc7dc46dd6d622ffec31ee77fbfc57c9a1c505cff28919bd25d6ee97f62020d6c112b29b520b6a7773b449d4b1f295a1a3ac4609ce19366dcf007dd9c7f920205806d11f0cb7259a1190b75cd6cec5b561d2a9d73c1152f01c219e5d95ee7f40300d57b842c538ca60679eaaf5bfee5539a09afdd88c95ff5e70de541999128e10312a72c9471d176370790af97faf8a83d4c78e29e09123cb5a335df2013c126710326bdcec86c4957a309c3164e63a42c44a4e7d08038b1b5020f556d5adff20aa2ff27b95205cf43ff48e43887a6620dc70b9b1a0c1c6bd158043c80f0defad7a8e37617615afe6771c017eebf8953024ab6384a4023663b8d40f3e2a0e15a87ad52aca48c2a47dce9fef2e3eab50fcb64feff938d8af1e612d1a425753336c65ac2e1cedaf6f603cbc7efb3c3b7ab8aafd21a6706bc85ab7fe8a842e4a62100ca541bdb82657e840cc0081a0c6334ef851047714e93bef390369c0ee434d54d95ba867c5429f927fd481957955d4ac88945a148e194751157c017b72d21f54126a4f2acb99503613b000dbb9c5f33fb71984c1e4a206f5fe75841664e2736892da67f5cdc603c994b1b586b63cfb06a16bf77bd8f7ab625cdb9e09b6d5466ce64ccb946b3cc1dd7ad0f136d586869adc34e535cc2d541ad257c443d032336abf55a1efd6eee62af4eea67019953ae650613acac1be40c0591e19f2c4c5a7c524549947ef0ba77c6d58e050642b53d8b076ea35eef4e105e60d6df259e7ef84abf96f99a43f169a7a67b944be006a51911bd1a07a6482904d36db15d3913489db88bb87ad14a732f194844f5f499055ac07d76ee8d0e1b2c27b48ff247e1ec67dce706452b6ba3a8292a55a5d2ddc80c55dbe83ed7c049db1023bcfda2f85d9c695498b7e78ffd718144a792808088312499f4fd8958315f3540fca486631f4c94ebb629d1d4405bebadf48506f2d12b47b6340afbe95398aea3434468245d176f9c831cf859f5e17b4c5163017b8b848fd2db44200a57b7994824e43cb50d9b0699642252b6a608f55b83db317550f13ea460562175085ddae63ff1b41dcc19da593d741edf96490752a2d91ae902d1365ef5dfd8e2e8f90a650d3bd3ae50a7cf40b4a4725f06e4294851568aaf4ddcd3480f5d0e4ce6d14a9be67a10f075967921abef83b329b8febac7589bc7915f60a3e615eeafaabe340156b01f510e5d1b0bf103b9b81bedb4871622c96d6640c2004e7e272df8f28fcf5b1d760cc2114a80a2e46a906c0ae2feb48fa411ca5fecd53b2cceb37ea18848b6e62fd3a7f35aa9f2497734243e2dc42a5479306dc2d9fa0c922b0872496558960c750cca12c7c8e9db3e3d937e1783cb53e4a9e377f785060c5766eafd12f03bd194edec3d78ae76b107b9b9fd2db135e91d3eb3b03c7d7bf7375a9ffd7d166cbdcbd9c026e827c682efeab4d6dd2b063a54b45cd72f72e64b276efd37a0113f445df7863debc0ec676a8af0442a73f8a8c01819d5ea93c7d4f9e2e27117ab0789c8f3621c80d27df8270d3636ed187f36d60704bab30c5adf4ee4254ecd221701bba09d83d33d34e4e31948c9625217e07d87bcc240beb3079f7445aa3a41f0ce7ed411b984baa083e0e361ce7edd9fdfe649bfdfe4eac51d006593c298a33d9dfbadcbf0d4524550596f942b7409b303f7b5613580e009abc0fb722811ba24774730e326aa06282e0ab3ce9683161d8fe29b767b3324d612f5c03fa27f85168e9374466cb54b5283d2a65584adbe7131ab80472eaa7b0fc439b9cf5857e28535f61e0d52bff7aeff05061c890d5914a08f94a11825e149bab892e719e3704c9a0745074c3e4a6e813a2203ee31b400ef7368154b197d37c24d2bbdf7f0711a930bdbd7c75ef8f64ebe367c0ae825bdd043d6e2472d5170be218910caa6e224605e4a12a626ed25e36bf04cf68aef6b5963458e102b54eff4859202000000000000000000000000695b0f5130ce6d8482ddfc87ff2aef14b6acbe40a59b2585ffa78bf7b8e724a77920d6b836c489f25738be56692c704ae67a4d553ca06620cee088a90fc99580e75f21676c3ec2595d7d5ea3949989c79c441f4e9fcf882c3afea51e56933092000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006c8e738811ccf021d9d2d1c0a01239452623540f9b8f1b04bb248e839a9a4ac927f569c444e9f33a1e39c7c4f72c451a5c39e29173165d389387c58a6250c85c442bf75ba00c93c247ba08d515099195f515a802a49de0d2b6b2d94be63889f7e54b7977657b5a91f1fca9857e31bd80710f3b2420d4eb20515a29fe316ad3120209c7a2e29c494b2dfcf3269a8482b1104054a5b48505971b458aba0907b1ac5a032a61e834d7a95f1c442c57b001d4fad373caa606309b08e5c11ce147a1b6ce560a002b58f65d9dffa013e032a4f47c018c5c91fdb45134d0a30a527f5402d05c1d46256a46b2cdb4c81b312ed70b6bc6503592375f28244f60db10b749107f0122022b8122a25359f6ea0032d6e862f5bb7482c67a690e6e21e9f9935ad2f4ef910703205ebb330d6daad7f101b0f7341507f4f27744f6d4055318f61ea6a716fb58eb03211949f06d5c717718465c9f3b49f3021df0420be9364377d61450db5f5809570223d9e619fad2ad938c2449a501da0465b85eecf90352a9b3225d815066331b0d0208de3b97cf4edabeb3be87b1afa3b2a7a76fd3f25c5523cf48e4e06c40098e3f4b090d9c5d513af869ef8a8d109343494dde474972f4c958b19e2bf114fe2422f0ec8230630f9b16dc4bde55dc3f46fac6d2cbc7278c9ae08d86f9aa55675f7778310734a01ec97c534428988ba91ff7db0b53c181cc0f3695d6ff420b0cf97358070ef3d39ca9cb3568ed757dab7e1e61b0ea0ddca45b19e205abfdac974fac2a2c3e64c8c0a6bf23d95b6a0bc1eefd8c14a34c9342b21eef590d27938e6dca77be95509cc07f8d6d3cebb9a73310ba037879545dbe4aed1f18e27727eca8a0768e378d9ab11cb066ecc73b5532bd4fd07aa33ccf5331db01f392dc59021ad7be5e66b903bf4e201382949e0b4870e003b25f3b4db7dd54fa914ee5e9cd277276874b0981a13b4f4065f265338207a7a2f0578e6aa82f5b1aee75df18bb537a01446d6c187e4b815f0856163b36dea7264903e22f4210c1fb9ff5ed48ec00ae595c5bddc9c2ca177558f8a24ac3a0005d3a0dafd4fdec7283fb1ab8d6100563e7598266e8cb6bf52f1836ea5628246791f95bc4ad09070d2f565c7ac604af4a87b7068d456d6d64fb1eb0cab91e79e4f26b21abeefc7e9648bdf59697712c04a3e4f4549f008903fefefef3ddb2d3b317f78a6c7e05a28e333236826dbd64ef93165bb8d2f20ecbf4513302583aeb852b4a810d354b13486d1798b3a5895fa2ccc8124f6c389caa61869df946d3f88778276474ffc41bef50c13dc5c6f9aa19eeaee6199ca46ce6fcbdac49ea397c861b3b54121020d60eb8fde7d7d55164d93f4d014634b99481283e098db1b0ce505e62ef24560b1fa1d79330d9482c4ac98882d7776449ea5c75dc3e6203112a0f11ab6a7ab1cf10b9f13e3f974a1c3e790b455d9243cf541348873cea22983313f3538b0350bc59d5997a727e11cefadeb41503b3fb16bdd116cb77c5e3d27fcecb96cfe01d3bc055e72e70e3ca0addb92a38f355813e818cf0a4c66d626c16c5ff0d3d8722058e167cde4ca5a69f1237e17dcbba29bd8258f1ecb0b2e3958f43aa1ca7b2375354b3c523d79f2051a6e660ae035c439ea5b9081397ec0e871de964ca302510e8098d3b4ad0a284f7857ea81a29db3cacf4f98929e32ae09dc6e4caf542f563a5c3e12db2094283bc4db2e485a341880988ccaf924b55044d1f96b5663204a50398b1f1d724869212d2bc7e5834a6e4019f10788b1ddc4e52f5342b7b2aff5bb1fbc34617f31bd6409c3783b6f891f77ad899476129536faa2327415d7fe137884f57c5a21b05d592660bc6c4cc49e783118bccd4df7665e44c790f1f7d6f563220f63836d4c3c16c5b39c1ccc45095386d91a5ca010d9297a371ae2b17fed4e2429205c3a60148ef1733e0f6a4f109f58b56c4e3650e7a9c16de7ad2b31d5d9db5a6d8b1844ba63370cce2f28e0fb3a958ee76967539d08e2ed06abe1da1f23426bcf7c24fd5cef29db935a17e4a68dedb02db38803635ffdd845763beaa410993e92b67607babe19202f92019c00115bf987663ebec90c4613049040c5a7135835fa6f85856881f85cda9541a3708e8228efb9466a21c89e25c5453a56d02fbdff46ff40168f474df36aa678855a3e15e5dedfb8fcb631f0085446873e7dac14a0d017e2231387f3f98c34f73f1cca39ddfba929a63f1d0ddaf26bf1e8ae1188302f9d35413ae3e6c406c8015f498120cddb4f5cc28408afae6ce190000000000000000f106bd03000000005588b780999bdcabb63379ee239466cbb0f51ce58cfca4d6a47013b5d08ab4f990de0def1091dd78953df5d7942a0286ebbe7eb232814e7ae32ae309ead30358051d72b9545453ebee8490dec885536cd423dac4b529b1c7d7738e7b4cd58ace0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045222b95dda27b849b51386fd4fc4b8cfd5f0e2773b3da8eaf702d9245d8e6404c0350957d8426ea0258bc1ecf2d0e142fac7e72b1233c70b81b0b85800eaa0a1f8d7da3aed6278d30b08505a20355b524dd168e31ed10ea87356a366f7ccce078547c5478a7f3143b13265449edec61f1fdacd20542efe93bdf7ce384a799f3021c5aafe6d2a8263252d86eb870ddc53620b967632d897448e719f889bacb07ef021b824fc1c447e471b2711520ad402b439980813aa3a1bd9e470987c1d4be33930b03d0e992a478eef2ac9433fa89665911bc00007748641bc1a3fabd956aca84bac1770d65eb09f7c024f4e19dd40220a83a387cf90b56ad0b808f0143943ecca1032d975db594fca234b2a48c9a769920e22ff8e16e954d3d63375bad736578d4d2020661259e702e712036246cdc6c6550fa6f08ef15b1e2c8b06bd10475adca97b0032f67a60de36617eb38de2d67d002ae5a149e0a9f6c7c05a5c956600a95da2aee032f547f4b9ec09b2b13def3aaa0964df0c8337c68ab2325f91922c912bcc6d271030d57af59aaf2f3cb1bcc0823e5381c16dd2c5a0e17f41b2caafb33183c3166e7e3be7b09877916d0d7a46b2636d10c79b1eab68a771aa53cef3b8133d8e6f24e1ec325168e89b2126a9aeaec8ca15d6c51478d4abfbf2c495d00e9560c7fd518c114726d99f478444f2706d92d17c343991cb0980278336283daa26c001f8d95ae32af734709643c379e73f4a265e82aaa34dffc424a162a4c43cf7211ae4bae99e0d6eec85c078c9d7aad7facd880e71819249b83d552d2046206003b7658a2059b2dde35d9b0320f130cc17f9a7e6a9ad208753e44cb6eeeae29a31e1b5e97ba34818daea2a31f455ddff13a334bbdd10896242411dddc666e6980486b89f63d576d9be22dbe91864531bdca4eb75837fc7087911253d5fdd5a59fd253b50ed61a732bde97641e02f9418033e8cc35922119bea8977d4640420bf9d13a2d6f8f7f92dbe4c4fe13a67ced22052ee11665ee3bbaa24afe463a1befae403279fd927cb2afb7c833a3d724aaeab784cc43549a5716e29cc128a1a4767f9a4d65029640449053cc71edbf3134d4c8a5ccd3d86efb1ba6cb6f12c3c55d16f2a48159a674d1c699d396d1e712936f19884f61f85bd63ccaa5c1fd3d7174aba4de931e8de310f092c1c9b858ce3a15e6dd9688569d1619840572df29ad8c1714e7b6028374371d8077aabd3b894f320c5e5f540a9b6a22f1c3329f53c347902c9620a4417542ece2c43dde0674846c46ce14c6893c0f290d658e0803d4f0852921dffe1d7aaf6d947234bdfc91c3ed7b964b4748be8c0727d31e8e67fe16d86c39c69b0ca32bcb29e9993394db1ec734cc0badbccc2f6fb8d45e859f885e6d68488c1cb7c4680b81c447252969affb5f47c0f762121f77035975933846802c04515e93d7cd86b3d88e4be3ba3264734cf2d2289b01f9e7af3cc902f46a67457158d9ec9f349133ed748eb4791607bf91f41fb2787f8dc6f1b26623bf53b371d00a3007f37179b67ab15cd4df9ab14e2c711c1fc8ecc43b01d20df18c9d313903f1b7e4ac7165549ca6fa75907a0b328e8ad39f7c2ba70502b05e8675ba5edeca61f12ce4d1778f38df6000ab603770128faf5a9a76d4e2ae0754ba5725cc758671e9a111878d282a159ece622fe553389aa4c7b3b9cf652ee473aa10202828de8268a485f40c2630fa07488fc7b90bb2b51b9647bd932e6862ac62a77d26b48bec274cea6e3b6a02626bd5607acbc0d1ec3ee06f2b70f7b39b4d9154782cea2e2168da6dcc011fa612d3aa273b9957d596931c08babaf556943e9d0764e15d4f37e28e2b509c1709171e6b50392d8a34d38dec14d1a8cade6c7c0784edbc49bf851a9a2dac3acf8c7f620361ed34b71e4383c8c400abe8d15bbcd9cb90108725a719d88b81b0a7321e4e8005292914ebb2def737fc9fb2456d08fe1baa5c144876a99a4e4f272f546e4f8c5b6f5069ff5886298086fe2fe29f798c9217a39095ff70c0f5cc4e3fe2d6ecbecad21f17db19c5e8f3475cfc0c13adfe14b2ce87c866b5ae07222a92e54599f1e2ef31b679f02df76f493ce01cb96550bc40a8d5eb7eafd2f55e35d9a69167df8098a19ac51d9b1ed7c27d2a95057bd5928ecd71bbd31a5284881876785e306623c4d51e830a967cf6c28adee057020457b1e16197c59f4d2220f1861f103db401d0c2f23e5bd34053439177fa9a63e358e0a92ef2955d4191064740116cce3bb12f1de99439a143a6c8b28b1b54d6f8fef24c48b2559f8b8e72f89a380195378443f21ab6037993f335940785268a3c7ccf7d31cce49ddb1f6f4740134b8c9f7d977f8471f9819bcf95342892a5600e7080c885a43cfddae2a446da716673218ea881fbaf4b200bda09", "63", 1, -999075092, 0, "ef8a33fb595d13ec923c3afbc9f0e093709e8b1adf4ab435e53bbd4977d6a665"], + ["030000807082c403035b5155f6c169604d7860eae0047d7cab4c2a56f30766fd11a2614141c82d4e350200000006006a65ac6363ffffffff83999df98cd14497413ded4580d271a19d0c4f1233799d99d2a011c193011d8f030000000851ac515153ac006542b58f4738548d90c3c53d4167fa8cec63f9c863f3fa354581e074575728b3b55769fae80000000003526a53ffffffff026ca374000000000005525163516a1ca3350000000000008d891ed12e49e37901cead300000000000000000000000000086b2a7bbfdfe921a0a2224c16ee848144f9a45510c9fb18aaf40cc5671103642ddf7a92c9142d1bfd10fdaed0e1c2249bac4735f1d1aca0f6abc0747ff846fff39b8b0077dff04ab4cc72a0ee993bdcbb31e571737ddbcd22f75b8e4bbe1711100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000be18178471cf47075b3a53dba146117f50be049271c555020dff4a21a2fa20290800b139da2117f0a0901b0279408f794cf550bcc283d1cd62eb5a6b115122e5b0fc12d21d18e72c406e7905c69867d29f20299da5991635603dc6f4b2709cf9ce2cf5a2849bb928bfb6d3ed1ea2270ad5d511ab1680cf55ef5c2e4c78f1ac930304d90fce5a6dd3eb5fad835b889ab10a12168ab9013de183b52908874a49294e0315aaf2c1494a613ecafaff1eecb168d9f4770c9ed9ab3a6151da4ddee256d8af0a01774b719739a5c40b70199d8d9cdffb45c19bc0edf5c5f87bcce73c0c118e1fe88f5b7dd470c42783f47df26cfeeb016c7b855f3b761c1a31c2a96aee05f126022103079ba1b0ea42f1718146ee429be80f256c8f50ab7f3a46c55f550a0039910320f53d0bd016e21b6423f1911ffcd62d21038b1d604880df380651475a03efd30317c257e93a78599b953530021cb2740915064901d49f38b105d3740f715f6871031164264ca0d1713fbdc8a84dbb68690c1d5f45b9267ab3d4e5e203e48bd3bb39021b1dcea0671c009724ece82d695f7c2085add350241cd02bf3ad390319ed75aaf69ca06f148b1f3267890548abaaeb00051c11f07b8c3f0ba643eabe4268e7d866a3ed75e3259f5628bc873777088f4767b3a2d98781060c5b776a3105de51e1b97027b6e4e8dafc9e8727b63ed038a36eae207c4668e53d30e51cb6feb4ae0433ec91420a8d51161b620d9abfdd8a370e0ec1e0dd26a1bdf2fb4a85e804281c898915154c70c3b92dfa34808dec752e713530a7aff6edc1d8691d47954e9515617061ff3aaef80ed00b9a576dd211973a1e3139eb59b828d908099602f30ca364a44f8090e5bf02f87fc51fa68e4face16757615c9b9a9bda95d28ac0b010f097537c575d631104046a5b45d40e26a00babd33f4b13170c1d3e899ca736dd5b25153cee3a51628d7d88c625d69229c19020b3df126f69cfd9fde1e9f99a859ffae012e0083d5286fa13e2ceaac298b30efb84e3aee1c771f89772b0bb135ce53a99c9cc684dc7a35add6f6d593deaf52941167218ea2b564695df5ef8888330e317416cf91db80b7e4a5e208087950ebe3eb2df2a2edc54364ce0e4db1fced26ba650ea97a8c2dea894545e3864566fcc6c0707f0dc8f759d78c367272b7a28b953467c5cb408b9b077637c5f998c3dd98c3b82213b1c4f0d2d1b7690a12f04e1934f7c5e7b4892bf776f9f2a98425c6e607c62aad5bbbc6d4c02b3eb62715c3962fc9fd24e5b471d95de0b484e652dc6ca4207a1d39735ca54585e42e8497014f67564712112d7d6d5f54ed45a0b9a5c12f4e032e0ed4ae7fd3a3a2d0e2a2d60b9285ba531d63abb5119b89a1a4eade9f748a780c58c3f0e888c8ca7b5cf0e9914276fe0c69e52be4d7252f627148e55614a27db09662cf49d2e7634ba9c799c7ab9c29d448fc54bcc5411f17cc8fc66808ec4f711a2ed581d88e25e93c1b0ea9e623ad7ed4f73902b488560a9d0bb9420153bb6b12e1e7bb988708bf59d6951f2e6fd25708d0bd478edf785c4d95256f0f47ba2a7f026110d9bc4c3bc11938562e938981df8a2536485c06e6398184e170889021720a9cec3a5656a84cf16db458771fb66dac454fcfcd2f7af812e25aad4062d450e3d8861ade315e39e0ccbbbd3754f700244d8b7a9fa47b4674e16dd643a35870263dd02f10fdf4bd809166182f74b0bee160e0275f0fa4257221e9579b1d9394478f4fe70d3837cf6f749acf42f2227f4d4303037f1df97a44e152a563608e305d6f454669ba17287c58f734c8e76887b86c8c7aabd6042c06be74cc67c0e67274b0a63a36d6b5a69df8fcba93035c780166930eb29f1872e3e701538f9496c64d37e14ef2f34bab061c2d27282d1e9fee7b2b86eb989d1394eccacaa2e4092923ccc2ed4cdd15487cd450a3bd5ca1a32cce0defd86734f67361605c9a433c277386f6d6d0cfa1f5130847c7b8fa62203d2eff32a9332ba833b2bb4503228d65afd4b423a09ee9c371577b3049aa6d6ef5714bee10af1404d2751562bf70f5f76234053d711822c3779669bae8790ee02059a476e8ee97106b3c5945b1c2ebad0a5b02c096cea5d60ab3ba94e035598c7305bacf7e3d979c709c1c27303c186947b972e4079fd19998bfc6481aa14b57fd72e2508663aade7d3cc850b98d6d69f89a9a9b9d61e320bc7d4211c92d91bb6b8aeee32aa945ef25a3a29fad4f4969c3e1c628adeb52249c2d81ab57c4598eeeaef47865b16b25878b8a8d8226d2492d76715443fdb070b72cd42d794630c4647a1450c08980ec65e6b1bfc9218354674aa6b0d200e1da008faf7891a2d84a450c35338fe3e03d56a9484377970f032bde019a90e202d8a202541b394eb97e03e9f059f747d7680085d07", "52ac", 2, -740108740, 1537743641, "d57fff821842dc043fd6cfed77911deded89b42d3cb705fcb216d41d2b6e3e62"], + ["030000807082c40304f2cf6afc857ae11eb2716b679a0806016cd497542185e597cdafe546e3d6346c03000000046352ac51f2df84f5609842b91808e69244f13e6b9ab9c37cdf58551064f6f04b9890f2f5d3bf3afd0100000000ffffffff388a7a94c1febdfdbc0b3f06bee4780f5675b16eca298e5b7357396932cf8a8200000000065252ac655252ffffffff6d8b968a52a82863a8fdb0758bc670548a8de6476fbe431d2ecab1899a30821b0200000003520052ffffffff03c8cde00200000000009cd8a100000000000852655152635352ace989230100000000003ae6f7f860c1f1c502956f3e05000000000000000000000000202a175ab2f2027bc149b97571826638f41fceacbebbc8e30e9b0debe38250828d6a4a8e1c297ff6203c6bf91378a8edd050ece87d69490c4d9970d30304472bc113a5ffe3c75dcc2419a190b3f7e17ff8e4a521144d6f1977b4cc85158ced9e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081b7d1a33bfd744b1ad04f59d43c228ac8d32d99c78cde7d91734e8a3e85b47d80ab1f79197459fa5695ffee36cfa2fbe22e95ce919bd8c4339e5b12ee44666050999172fa3ca932212eb9de029c404a12f5c6b3c45f228daa5b9e4f03cf5a7392100a941964dc614773908f41bb7a9f1d5bd8f24e696d592a95f8f465507cb903025acc968603e6746ff43f3ca344c98e511a3fa13879506ace27afb987275787020c67525a8338907c6a49bb21db09ffbeaf431816c717e20bb78fa97fe9219b400b04a11c155f772819aceb5881bba99bd9d54f1c5cd3d8f517b50ea0143351c025bff03ae3663fbdd5dac3aa44ea1baa86965b6b0713646bcecc4e9ac60c231c5b0324cea82eaeee12bbb6750226f2777749b93ee0ce4e28c5c9c6fc226f0efcc852032662f955d375670f20acbf1d1a879fa7d45c6e58a68fb45ed5c5355c007d1b34020628377982afe4b22145cea4a175341bc71986d137715471cd5567a7bb2ae1ac031c77cfe32e2f28834b043eedd21ae568fa14978fc39e2151c5eab64b9fa9b9a5031f3671eb08bbf99d7822d6f8e2e2d96dedeb681db9fc668b566bf0edb1a50a807350c66b56b3c6f1ee4e65d6b992a9c1a7b13220b50c86b722132a693dd74e5f8fb00fa952e419ff36520b84a7938df73733b7c298a5520ff322961ba2a69648a401da9dcc4715c7277b4cf918f437ddf9da587d0340de1e136655b67ab51417fe1da646c487aa07663efe4215cfcf7dbdebb1ecbd8fcf0b4b588f44f54991b5d4f9349021a5fc13ba3ebe8f44a10a471343e7b1cfe9f17fa80b94058d68ad1390457b0cf02ca44d0a1db53eab2e6f30124d77200fc86f979020aab06f1dbc74352e9ece2c95b33930b6a82b665b203d84ad50edb0f90b5b7cd722925309b6e9fb3ee8e6fa6b810ed29f53d4f5a5239925e59271b7efe5cd1e9c4352fea79821ac48e6641014e4179b0f7f334527dd30b525359ba2c12394f5aeac3587621af6f05845a0183235d209f2d7014e3d81963a5fde3b9c1143a5387d1587db208d3907347b531f415b57d1e8ba19d79faf04a6b5b868780a862ec33380f016bc96c7101f40f173136360115440cba5d2978cc62f11d7c1f2f4a0793ae06b99c516363c68a03ad99e5c11381fdf86839f646bdc98c07e64c2e64f6a00a413c9c9d9d2ab9fc6c2d429dfec958716da6e1c858acc17c3cd2dcd7483a7f0cb6057c1a2094bcb9f512eb24a3ec49447ea7b7b70d0301024fc25333ad3eeb6604fe80075a3cbfecebdfce8031ae47dfdc25ba56757f5a4452988dc64b3702a154c91741df62ad7bbf8cf199a30eaa0e78b890156fd8ff0c80fa7b8ed4adfa162ceb56c6b082a518bcd29f0612576a007b5043284cd8ea1afed5bbd21ed60fa6446064bc1d9b96465f3f38d63cac078f6ff28646488fe3a58d88b8c18da185620e169a27530f6267249a5002c0775cb9ef5a2240a2f95f5c67f92b2808ac7ca161b9a2801d3ce3af98afcd80079016c3f6b623c7f4841da6e441124dc4096c0e219ea85fda777640614378a681584683481a3f8f93783d197e47f3bffdcd5f39d458119da47125886c092af1b46e14c9dcc52e7c0d642801b9b8b6678628bda9b7c24e180986870e12e446c6fcc5f1bb11d66c2536b88b90a66a6967a4687aa76877ad3dc15f999f61ec0d58aba4daae19d583f28fd2f89927fe8f040228e2ac1e03819db3d482ca16dc71038d5018e0aaca3e106bb4bca2543529380e09c6d3700e744a3547285c74b3dd25f91d450f85a86f5e364f6ab55b26337f8f77a28a6c3df53db6ff9524ea6c88f9a01a847db419c05fb281d80624b89756e19c417e0265b323b02446c5018a5fed63dc97f4e5dc9c55bc63699a411e75bb06e9671d5bb40cade0c6ba35cc442b9c58bdd8f674f891912089809c5f4fc7814275da1c6e63597173de8b6754383d526ca12e4232e9867b63924b1d448391b8c39cb5a5f273a46979655e5a0cd9f31b8d3baf7abebc7e0c53f188e9eea385b02b82d850699de4901fb59a556865d8b63b101c89a0ef34db9c0f9d3f8dda866d27ef86c629b790553315e2bc93868770f5e579a8b2830f1f15acb0bad494a8afc6dac7fcbd1a9dc8a57782c6b454895f57f3633b46493d44e00075896636aef97b684f2027d4374ace6a3370c2eebdfe9fe3c72e6c6a0572223b5802ed9b7416821036433051e6f41005b9c796873e3cc923b939802d5f20b9be50a2171a8ce7e99b767f6ba88d2508550ab504d133d5d14febe425321199caf513f20971b04000000000000000000000000c16329707bf6ec0b206cc2edf0f17e9523d0c63a35f97b84fda5dc18c6afc8f234f08f57a2be145bf0a9a7ee2d067bf8c9f0cf9d91c563bcc96f8380528c5c0acd8a994785f856e046e975ea7fddf67c1a3c70ab1d568a45a50af52a285e0e160000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000097f44f9caa593c5fd966dadb4bd2fffa62841a94ebcc5d830f4268772fc3e9fe33c4a60e8c988e610144f193f1b733c7dc5ff5cb74f70b65e2e7d61895c9353b701a5689777804c3815309cd3eb479d0c72ec513bf8a79a47cdd7f65223214f712630a8f188f1d3e8d427686b9b7ef620a8fdec2bd210b6acb0384467d5ac7b70314fb410d243a0995370cbc4ac876e7b2d19332ef3cd83beb11507d7d714325b9020c667d04dfc25176e71141361b1f5e5e284830a613af9c2d8450fa5231d44f420a081d45174f7d23dacec1fdd1693ba3a1f14fee8a50f8101e09980767ca628aded8ada0152b2aed1361ec33dc893a12a7eaf839d84d363395e6e41911db88b31b0314d866a425f87daec0c41fce4e71a9237d53a5df67e4f65ff9ac885a0f5edec7020dc53f606084b953917c9a1b2076e22888d06e968aa4dac3e041bb70f46e15a003169c6ccb8174c196ef632bad6d4766a96f8c18648923c4561fac7f894c049829021bbc83d9bbf0f607d712cae1c8cd67c8f009c5423148ec0520016c4ffff20fc2021e1e80d01cb9ce030ebc3a4a59d65b17296920b3032526007cc1650780cec70f908d2ef7b845b90a29ea5b3ace2c1d022233cca795050d98211133f7ff0b1c39d122523ae25cf62d99a6cde1bf58367b3a9470f57e31c8a810f23173e90c6cf096a29f82485f36e6adcef5d67b3564ab11501300617f9f749f5d156964e3be9e9e158f373b8c248e9a0e7fa7f8af69fa17610d9562bfed079511aa061b10f4d5dff3deb60bc75b07c579fcee3bf4a930a806cbf83bac7f0ac794eb38700852ebddfbdc97b38c388df4feb31ddf4dcd8a230436c060f980b4eb43cc53abf3feec388f3b3a8d968673240ce02ee97b36655bfd2acaa0f3e503a0dcb244e8ca2d315642c68da11434d9311cbe9627cc024e5e9c5cd601626143b44a977dbd3e639393e009ffa2720de57448812a01b2e250aaf1ce8695f365d18ea87fe60d1cc333a47724813d927e3896c476d370311db44b62889d627e58139ee68099420b051d52655f37fe66d642a319f21ffa92a3c2e34bd90771d55c54e51592174a9d2827dd484ebb2c4b5779455e86714edb22c661c12ec7187cf9e06e29da07068151c9444c4984aa1cec59aa6f8e0d2311d09423e6d0226655e28fb34d98a5a7bd4c824f66b218a709042a33bec232ea441a08b2b58aad70327f691958b6224b3ff06b94d80b4c3d46a7fb290aa439597db31f57d097996b0752a5f9fd5b5ce5d4058a02b43fe92ca5eba799fd5712d371d5c71b35cae8171f5c014c80ba0d834d2196716e62b4581934dcbfa286c1ddc51b4a142695e99d496ff0d6d92d7ca16ada1e953e1388c02c9fe819be1eb9a0e76b61a8b53db6b1f33a91b1ad1456a457bdad7fc2bbb3911d86f1b942cec457cbd6fea69484d17e7721ee08b3abab3a82a2d2cd374bfcea7e28e074ddf2e1d81c37c22e6d1cb35beb1437aeb9e4c814d883f3a07b74b9a75491730315ab6302d23eb270e5490849173317cb8e11526c9d56cdb0aec9d73d60bb8490d9a340f90853eadb484227fa7f88f39b658c086299cbf73a023d904e0c0204d3a38490bb90409eb93599674c4ec638b8e326a95f6717b0a5f5bb91ec7c03f0e393cc50b0e85da1765e66581578fe9aecd18a88604b1771db53eb5128023da63c890ca690d447e29788205d04040227aa187bd8b449e1d78800bb379d9277d36fdc007298bc2c4d89d28a3cca3b36a21458691330677668e50c17b5cee6723864e63f7ee080dba7d039de477b334ca88caf7bf950d36c4140841c360cdb4e0e9cfbd2168feaf34c74def97d7546888e40b02525d3474efb7ec68d2268ecd5adeab01c8553400b6190ee031b44481ebb55448eaf0067cadb12fb0b6456ca6c890a88d3144f75e5b16639d668609674835cf4469c5b73205891d9b57a6915901e007125a55a4b3a01d4370257d1b174de39dba02e81390e04ae2773b922be1797061b724fb11c1777943620ad111d3dc81985cedc2f22aba7ca9ec2229bd6764c807a95c3b01b6928d1296a9a27e61c7b776bc64c29b4a48e2fcb835b2b268710ce2397da37ddf2e71c3ebe1417bf0ea064ffffd93e15263f7bfb76e040d2b32662972e9cb3c4463fb270af0ba031964c36a47051372d37b1879c89871d6714fc1006703062a8b315652361a8a5e6e474479e236b8f19f293feaa365d5fea0e6459248cc8e8555f53402f5dcb329d6a512f5edbde7c24a0d98ba2458a740681b9765e37775f046d2a49c731ca379d6c0f02dfd21718be94bdd968b454706d610bfa3cf1eca29cc1bfa4434d0b74dfc1c1074e120ba6448eadab4aa0bc406147f8ae86b03ec6d6691d951a19b4b166c57a1a60dfad954679c2d04fb688c16cf0a7b0685b709742f14f3c0e", "51515265006351ac52", 1, 1929323119, 0, "03c1e4522278fda7a968414b576e3d99c96bb763bfca39412becf69ae6386133"], + ["5da89f1f04514fcb100927dfec0713100f64de114bc8930529cfcf77a6f35a6b4cf694a26e030000000151ffffffffb1708b85f7bb73a93b812fc0a84c0949d23dfc230df4ea78315e9762f93dfa2302000000066a65535353acffffffff0b35d56932af83873ec9317444dc977fb463c08c84d264b53094f987ba4cdb0d0200000003636352ffffffffec5c65c925efc2a9439bb224e54c7b93ddd5d5f0f460156a908f69bcce7044f9020000000100ffffffff021e2823010000000000f618ed0300000000010000000000010000000000000000caf8310400000000bf70db30731b4c4bc0fe598d514f3b9b032e5da448e3becc9c2e3ccd6fe3eab3d65b21325b3940e44dd5f1b42505a5372e0df241934abfec2198d9fe743e80abb015f281f47929ecc88e9d0f25af5f741e99d2de27a42cbafe59119874610b1700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c36e0fd4c71044d1b00d836c546345db8061c7296ebfb9e3a290183b5abbbb4e9ee5ee2fb7877e609ec9425d0d71daee45acb59827d08df145000d4fcbab1e8e6a3aca7b2acb1c71c704c4dfe85defd39a12228905d73bb048d821a16318c5a7ab558878307cc4a5e54f7c95d76b20b2f042e1df4c2c9540d651321193524e1a030adc008f5bddd4cd08314c787f889ed2f6520e706a96d0dbc946eb7bf937d5be0220f203ba8e30ebf451766d1a420f13e0e4602d9dfbb4974ce0dfc2ecce4979850b07b74198ae45ba3c2d77d28c6b2d841c39ab6a3a75f60f20ae9aec4fee41723290664e11af421795911e54cf64cca977369f5f68aedd3380c82d976f4e38bc84030d7317882df364be530208a062eeecee2ad9383cce7dbdefb32361dac9a0edf5030c06d7cbfd80e8d752a3bd41b4972da891b132f3b51d5eb66ed5d337cfdaf32b032f77620843780b81384bb0388b1abd00eb52fdb0a6a41ab2883ef0ebb17ec411020c55c8e5fbf52e0bb96ca4d591501f9d46de5fd0626fb826dc14e30ee977af650312649ac776f7fdae06fd3bd20422b1716e28e9582613b1507272ff647914a07f986ab8334d7cc05f842080367be9defd40ba15b2fd922f4cf845c322fca006d0833b1c225065fc3815b3d784b947ee6cbf6dfb9ff9ea337ca8c972cc75fd281737d4ac7a3b1af695fac0d1199e85ad2d35717906988d4e5ad615677dfdc343eae9fa504c0c9c27f1530543a95031dcf7e11412ecaac1d04aaf4d9a4c873742c11b1ea55e18ba5044c6b65c2504c578708051f9bf16918e4149eff2a415daed03c01316ef0e81a4f2bb4282a30d8d6442ba464eb1468590b802c66aa78885f09a7790d2c4357d5fd5101e1ca39df7dc81bb0ae80f1894e41912a0e49dafea7b19c5464d4fadd5d913066b90c2f7c41dcde59c180e1f360a6d1b495e922c652b06f4d9de7dcca56672f6248a07c9914dd5cbe939dbc315127ebdd3d9b12b326a932eb359fcee3671885e40b5e5d479619b58e44db62b0fc0d22b0a1ad50cb554f90b15346f587ad41fbe9841880c842405480d31406c27aa5a49de368e41346a62698cbdeb0cef48d6a16af896f5260b3ff8dd8a259842292631bcb6285ae4605329d0ad9e19cd74b346a8ad6404ba691e3455f87c7db90c4950c36b3aa618ec4b254c11ccf1c19285aca53dd7cdf70adcc5d9b2d10b9fdc5fe029662db519bf495849015a114627fbbe9917151a89f13565fa2c149d0edb35fc5e522d1e31a2418ff71d4d1df28802ca2bce6ae3b41c863ff05825c77f851b7b5bdf327522c8f874a201374370e98c9e5b1852d0db2fccb07bad4b5ed65d5dd9137b75b7d228f22717497f223eb538160f5670262c6b0604f64a30aba51baafc536d8fcee2a77415728f4e165ad0643ecc33dfa0ed44801c3db25a8454235119aebc32db1d75116df238d27deb89307479d7d53695b079f2828e274ac23165c2ad91ff26c0fb61dbb568f982b76caf6261908f0cc524d8b8a98ff307273923a5609333a407e4f443642dca729671d92baaf4c4c63b36923701c6829bf3202bfb92ff089dc2c535aed47dc58cfa522eb2923e1ba1e4d0939d539916f2be55d8a006b4058ea28398d69eff2cb99e2d746df31ebc9352a9547f5890b6e0da4e318399c09183be906239e790e8a782aeda0e3df12dea29ae7aca8ee2b12b33472764f99d45582543a8f69800c670cd90c703dbaf6a0c532a51df7a9f6faa55aa8c935585c3c29143472156cdfe54bd60bbecf8c740d6f55145edecc133242803769f833eab0fc86f9157e61ff317e463b666314d135ab69db4b0b80559db5df6143eb914e0146fd3a3f8a5d8169c577b9d09fed8ff533651bfd54d7acee229e09fd17ec0f8c3463a1511eca3d0bcd71d00fe5618707cf44c921d2ff6f422e491ca594c3085c495221b334348c5b56314ef0b4802a9d85d36564078b6f642306dbf02236d7e1db28130077ed2b87b4cfb29d97f4086cbdb6c034593e30f66aab329d4f638eb5b0e02715c00efefbe05bbb80df61d1e7a09702f8af4c5618c2ce84319803b47973fccb384875f9cb4c6cae1ec9e5855fb410b71a1f6faa63202cb8a90be113a032e303cc19ecad6df227f1e6df922b63f2476f8005cbad75e2a699d0ec2a69e2f7c47d05648ca7f66b7305bac9d3a6fbcc24019c3ec403dd264b2b559c121cafbf501e81325cadc3b7f0a9919c5649ee43ce6abb4fe196ee7d90c43c40ebeda20a6422170b67d8163bd950e33f1db1defd185affcdc3e9f10dc3dce02456cf5046b3aabf31b65e3b24b08eef8daee25619734b2dd7a3fba54009d57c186f28338372f9b011887bcef9ec453f46eabb662a07ccf8921b747c6275c4dc9e78308331aa58441ee0042ea46f9d8b3335fe61fb442c5c30a", "53ac0063ac51ac", 1, 1527985764, 1537743641, "a1821fd90ce1e40920bed3d5152e11d89d928fa0aa6c262edebc229c53be8b8b"], + ["030000807082c4030174a93d720d06477a5538b04ed763e1711794cded63166828ae92542ff72f3fb10200000009ac51ac53ac63650053bff3092d02b41f1903000000000763656365526565537ee50100000000040063516a00000000a9c0e7fa0100000000000000008f2d4a0500000000ce4412e558bb3d1735061073729f08bdc63d5a1b7c4b0896b36c5daeb392f42a91a60d0be4a17f05337a61210bb43a213afc55e8a7cb5e44cae25b2f066af5144cfc47c4da636deea7465ecbc74ade89340c690c785d38a2b9e703b3f209421100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de98c2917707da4f46a04e16667317a20ba5662f30001f3b0ffbfcfd8add96f2d7de5af453636077ac5a90ca2f037e38c12f799cad97d872c217a7718aed8fa6ded80f75f91d390887f562433849ace6243824eae90552d035915269cf9cb759b9079e7ba45a54d1c7db2b62f85ce6ceae5eaaabbbb77f4fa36f2ea45248fdac021c0eac36577b58b3f862b1ac6aa3bf3a0ae5022377228be0d9f1c58958c4d65f03055bcd193437c950e9a38317d276b4450c3f16c64854338baeefb9f971fe31200b03d63ef9d429b5a5d724ffa71d47d024ddc4cf7cdcae80b1c33504d5a0855b9bc2becea1cb9e73d0a6fe6401ee0ff41f8206eab07451ba361afee21c0e2a1af50301924bc7b55833f2fea8e6ef76bcd6ef6a9ccbff9757508cefda160fbe7b604603253b2551424edff355710f2f5444bafec6715a805689d24697348faeea91f519020a7fe4b81169b6d2ae17a28c4778008df62742a3835570e106abe870c7c57a66020a1f4f020d9a6fda47fce6b31b527521b067a775ee49f9072ba6ed484427ace0030731dc00e9e51781b0593aa31b2a90fcd64b83eaa230ace5e64cf19b61cf90026f802baf5d98b00a12efd890ddf83aadc1b73fcdbf8d8e4e28672d8fbd37fe09cf6633d13c211ddc0cc4bf875f40728c7aa91497046f121df63779986aada996cae1500fdcc1c0cd808320c6d7539a68602db0b118713cf4571dd2da2e0c52aee49ac0e65e7e44aa9f7705fff5c8dd1c5701eba456723652a22aa2526e200601a0c3b0d80132c4d594db9935fdf4afdbb996fccf7f9bc5b53aed24842e6ad73763601e0890c5b60139a309aca20970de4ddad7a7bd7bf5498197528b11bdf5aac1f771a00bef1768565820faa5a5e2be26d68fa4d02a0cd3e96f5966a2e2be6a338d7e9613097617652d0e5f70a2cc5cef18b4219e918eaca9a9933062a01b8ca64af4a6a62cd53d7aedd746c17fc2376ad088334b3f32aa39836d66251821cbe85f028d15d1a785e7471fc3b30b8c6605322151ded462023f4d97383c975c17ba459240fa1b29bcd3fe32b0c06771a86e26708d3914db4a383ba32b3fee659e57dc9edd3970e1ef9467b9ba9482afbe25360f6d872367327617c25e2c369cdb81ac5fd8c70bb66df8541c0b57b71229b51e09dd5a8f016ddfd20c9f7cba5fa0d74f5b93509e81e74c72992d56d410f19c3b371f0fd37b5efb2353bb523d868e7b040bfdbf049b40a75c1ac133ec09a7847a3ed99159fb78e972a23a13797d0c99efcee32dc704d332eefc223c6db8168aa2bc43f33a4885ae2a195188e936d1c854ba6b9c158e3522c4fa225139357a8dbecd964f9ccabbfd108667f88bfdf3292d740a948136b43d689ef0447b34a9b5c9fbee151d761c09f83ac2312e1f1438938ae0a037fc333de705fc84eb61b1bdd14bf45ff5ff59d3458f1354346b662efb50f136104f76aa9e456a1f2c9521e451ea8b9b32981d01f8b3131cd52f9815f9c90ae3bfc6caa85e50925e25301e97461c94cbe44d6409cb056abc532af9badb0b03a69dc827824bddf280f584dda295f8301510df06939d81b6e0c8c97d6dd45e34b24e579063ca9c72604b5bffb0e1ef8d11b81336d427a661902ed4ab113300815cde7ad6733323c67037c037e3b3b11070e46dc1ea5109ae298acfd6dd644645064e4d552a344c5c9209d786529c7714faefa75e65e91c992871cf62e636916104d907a4074263ffc30ad242a130b2ab00eaabeebd50d82feab961269afd913fad665ee13364b464c8558fc0f689a973d349bf364bbf611004ec7776adba2ad68ab845bd2d1f5995d7132e8ed344a4367d7864999ab5de9992273dd7946886c856ce30b4b5400e5e0c635b2f92c7d4f188011ebe3aa4666b3303eecf3b556490e45343e0ba421ca083b7148688926db734b325f2bd71e12bf8bcbd339c748a75776ccc53177156338485b14dd7d39b3c4c1f69c9421b8eab42f7f5415aaaf0d2a3fe57a867a9ae10913ac19c880d1931f834cc6643912d39fa4935f58da845e80932d1c7ae5bad9b90e42cbfe61589e64fac841dbfe32fede8791d48638c48d8adc2f22d6a122bad4dc59cd31b45f234b7a0e867557d7c0d59479d3d4a5b15f27bd8fe340e2ae89f1e403b29657b974663021433f2aa2766b59a6bd97ef76da3831b356351a17340f94e107cdef574dd6625233eef46be1905339688e647d463335874828633b20d45bfba104d1e52e0d50ec94b5c441c7a200d7314fad25e4c4d712c4d31ca59a8a59357d8f0e2f1607026bc957ebcde75d16231a2809ae7a7ac681d910615e3e964a95435d54208f9013a6456c62c5b2f3995150d6efc7161fb2d5fd47f50b703c79511417abed88aec5a99a4b7c53fd76f7b7e2208a592b09982e5600a011ae3a7e365e8a804", "ac65", 0, -1094666649, 0, "f582902984d5fb872e9ec722f7b5d673ae01efc463772a6472807b98c79ef1b2"], + ["030000807082c403021455ff10b68c7812f46fb6d300875b18d1bc1c0f0119bdf89d7f4834b6c1a200010000000663acac6a6551b0e11960feaa425a1e02a23a008a9a73486bb09cd25c3066be1764dfbd22ace3b55f715902000000076a65006551656affffffff03107a2704000000000263ac0b8642010000000005515252ac00f9a50a01000000000453005163ff65819e0000000002ddee2f02000000000000000000000000b1a0a09e72a5d79fc717fc272d47670b4c9fcbda08ac65478b01cfc7e2973217c21b6e31ddb52ab60f058732773487d2a21f10a06687cbd989c1faa37c0cc596e82febe66724ad8c08cf2a13fe8f481455d0b9c0b18f7c2cf2a36488285f3573000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009b82b4cdeb4eaae89f5df1498a3f34695ae334cd6159c155fa290cd7fd9f3fe24b226bb73477a5c6a0f0a86212787490bc5962619e458b6a3ea0ebe6c756a4bb6a5a64fc85c531764132ca5e0e1b2ed4d38d1e31e2f4836c4606660e7d5d8629269a17c8eb467c015fc6be00d165c020d418bcd2b3dac63c0529c4de6ff57654030102be61b1701fda0e2d560dd1e5111fd8221e594b31a22801a7280c1ce700e8020c3730592d8ca1d894c45b3f6e340984a9813f7ac082321f12438b50a29024a90a08b9c1a2eb83c2db651be13894c5af49c78754d4f42df84ac01842e842ddba24ee6f2f530aca3310de72e102b26a90d14eb02a3d07e8df929472b73e906059880303d551c7b3b29bc3c4cb7e790bd0a32726f44676eedb985f93ecfd5832604cea0321e304a711709560a49d070e320444e709e04243e5052f7f3b48b3c5c6b741ad030e0d17ff61d41b85532f72801775a325876342d3d94a0023a1245a71fee2e073021bd230925bba218641ed40b28250d6936f400700418dcc4a8345c51ee70186ca03060aabed464a6f19ed2001787a76154b17aa6326c70a644f0a155d848c7c7d96dfa403a2114d7b3ab15b90a3457e1e5f09043365bb7b7a64831f1d65ad1f1b09bbdebb76aaa918d654c8f2447af561c3c9a46ec2969151fcc575a5939474f9c561c54123f9479e3084b2e6e0fe2d757237db1730ef6e4e32897e408b0ead9b0d05f416fda3ab966f0f3fec08db538d867466eea007ea24cdd56d7ee5cf0f74c4cf7bc4ca31a1a723ea28f36be6a4c2daa1c877c798ccac67d82a499b8e9d75aae08c3dbe5998f777e9d58abc00dc0c49a01db9463debb226c61cf89a9db150c5eca4c77d1b2938d741137b304b57f2b2d0c0878bfe0b2269f720e8a22d880bd8a25ba3f12ef1102ae28074277bc4c8a0b19388d7bfd0c37c3c96fadf670b9fea0d92a34d4062cccbd38a1f46eeff412f4713b4ec19548804c3e3c3aff14b412234cb376785e9f5716774d2742c053fd879c188b01a7e297a794a4efe74bd13c72fa8d1c871eca5c115e4262dd7f476d8a89359ec9b9dc107a03dae82ca19305475cc6760558f7e55467c9698e2ed556c64b498f6c01d286f109bf7c0cc93bd5024c7bcf6645a50f842e90d95df0bf9f3b8af8e83908c7e8f1578284f8985cad8545e889c5a544f9b75d2afcf06cc15998259887df55a23cac399f47bb6157cda42742e82289c4cfc293853b24fda8e71148d8936543d069b5b6a645dd3c27513b05bf7456d04bdb47a0ed6a78620df48b642c8887a63dd90ea34ee8390406418652f6109b91cdf25769224f19a2040342a87e949e970d6f7f999fd930cc599d0b1320eaf49d0f574a01d198947802ddc6b57e395fc30926acbab944d92532bc069b2641e1947aebe5d471cd6b1b1ff9ca545322c39dc51ee1bc6ed30149905152b828a36abe1cbe4e5d1f4216bcfd3f261a30789931ec462036b052d2894c19f67af0ec1443a457445daa26233efdcfe8ab097b05b1a88cc643a55e9728957b3057cb0fb0689ad7fd88d9b6e405a6af1d083bfe3c507fc83af23b5fbb11712552130962f17ae462e8c4be7799f8c94f9c3236a17ce9c55964678fbb4294564841709ee9784f9ab75a08d02db512960afa3b3631be2becc7d2082b107264d4178aebd24202d205b322826c55b437405cef8de02d0c4ed1360553f531662b508c3e4fb9981fdffada79751d0eb201c03e33d46e9e76d4ba98ddf195610bc8dec63f15391c91389585ce2adf90465ffe1ba502d873e50d2e07153b40ccac0ea058c06626017272a30a8b23d915b1f0dee5b9d54543b7d95e3667d2b05a280b5340ade15cd5064c2c4974d19b5a3a95004c3142269ef1effe1ce8cef68abb6dec0741d37b7c6389e602cd9cf7a3237e40cdb363764c57822bb190057c05b1e6869add1d9d84b7fadbb06b468ee7b2349cec49a1d25c06289958e30a02c000baaea95ec7713ddf0a266fcd6d37f37bd15163aaedff3e77a64ab17138108491f5373d8bb6a4032ea2181ff88582f0585f02c21188999d8547a5bad80b95e83e763802facd8a4f87cf27d186a27223da9add473b4ac54b457e86eab48de9065c7361428f6e6d897c279401a57ef3e977f9275ad370e8ecec6403b4049738ea1c154cafa6257ce453729827fa55828cd922c91c69b3399d25287b8d95ff0c468c8d99b4a37b5838193aca616bbfea3f814d861d6dfc49755a317ea942e11746599eca89872868ce9daed66e60373c20bc4262863cfc100000000000000004825280200000000581efb9d1cc41dee78fa9d80fc87ff53976c434cf4f64f2247abd6d55c8ad9add1a4fbf6268e38b42f472bed6c862bda328e5700a268ba982d9c9361226669e6843701258b212e89c8488885c547fcb1fb47002d6e793a4f78467f7bd90d54cb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028bc573400b4adcda99b519804bb7a126a5be16c0d4b9e94052eaa4e8b63e441aaa5b965c3b3adc779e7de84c499ac700d01024ec128f8b994b2c67f48b1564be045a28b2d56d2c358d9615f8bd52a49a19ba26cdadf5a218d93b6dbee8991d274ddc2db92d665575eee8e0da54e61b08c335136f55afeca3d18353bdcf1c9fc03172c58b703884eba9ceb2325c07bf516a7fd36fd0219c94a9a8d42b9cbf21ece0201711f983ee1dd775ff8d3d737c5c74b0439e17fc0f1a98ec8c529af8dc429aa0b07dd6369400e2f014152a4694390eabfbfdfbd8b6cb8de19e742e4979098c87a8401357bc438663265a765d7942a5031b46bc3cda8f0ade982042ee94451da080308e20274c1cdd3d05004ad9c10a7fc417fa12c4bbfba96c4aed4c1d42287bc82032f7d154717b9ce98099b7142d39364c51f3427ae277ba64c2d54f6e8c6e3493a020c31ec6763d9c93981e511b2ed59796290127004d634923dfae2b11f7f80dc060325faa75a36dd4109133851ac91533195075906982a35712383be51d20a179eff031ef69dbad37377d668d8c799a0ee3a67e4cfdeebb3844041c21a60cb5dc9579314b0e70b23c31eec38c8de4a8c63d61b988b92fb91b84c1591c0692728da5c310eedcf5156be2883f85145ea3781d6c29bfe7ca2392622ae7b4f22a3af5d470d27f53785939292c68394199d78fb93b5156df1c79802ef97585e5aa5f498dbe3a32af4cf8a888636f6c34f7f8e472b41d97adb78950fb749ca1e5376ca6c0f82d14f48a3a1c32731e28c441e3d03f85836cdf6794cb2799c2be07abebee2f592ffd4d964cedb7c03ee2eec1aeed141d95197abd82c46960945a8905c7a93bb389f66f434af451539d404cca953637aa583c67653e11a862243f3fed6effc0c0fbf2475d658fc671b53a5446abf23a132402670a6d72e7b4fe55a0094af9bea9f01e7674fbdf9b35e732aa89feed9c1ae73572bff3a751e7d0f3785f2ea1e1a465bf94aa61d954b2f3e709618f88771e82ded68e58ed39ad8682665cc42a82e9efb4616846643df65f37f059dc07c03a6ef6f67884c6698f13a9d65ca8fb3f6184aeff66790fa852824a2ce3faa2cf6b1df111aeed04047ec82130d7a5936eba09a2db42f6270cc5a8a8ef6d8a2a8201ce07879760ea92827fea0c767b31286509d9896090b1c2c5ee86ee822e7300098515082f4b143bef75e396a1fd04d0ec2f4be1b20ae67780650ffab3356d10d62485f4c83e202fe315de5a9ef880455de0a6d26c44c47c131071bfef339b4a7449eb2a56d9a85c1d6c6357ea1aba18d3f45057cb591b2c01f091fa9a0aebe32871775948e7a49fea7d3eba54db9bc82836403561794332794c32e4d4c34a5949d83aa82aed3078468c7fffc83256f81e05fb0edf902b44439f74b10257f70071c19162f03bc7383428a42d7bbbe426791f0b9ac0714b4f427ad26850fb7ea479f2e99c1497fff6e06fc994bdf1d805048b534db2c03928d0bb08e655726ba99ae4ed0cfdacbe82075dafd4fe875a0c20753a5a5fb4e58aa86b20e543ccbcd5ade7fd0f2ffb670b8c9148fdf0c18e1d4c507c0414a127eabcb0c1c9907b9b431dff879de55afe016b2640c22c9cc4d375b7c27e266a745dfbda1dbd0ce648045c721fb3facbfa8c5a765c5febf5b9332c39e91a7f2dba4c02c05234165031f06d76bc6290fdc5a2d2a02a212173c0abecbce1cf0470475c4eb2b9bb07db52fd8725669dfafc87f3a26ed063f40bbe7a561aa55bea67d8e1fc042648cf3b3232a53ddb3960e7aa98d965c547d96820e3b14a9448224e0b8ea247fbeb1047059ac7098c982f6eef4577ba5a2e152364222d48e3756a4103980ff34364a111a74f8dda6d45cccaf5ee5fb9fbd5d7a0538cf4c61a41a177021ddf39501c8e247326e15145bbbbf32db785de6256a7d5f96083a25197ad2d91817b8d3ff0a8f0f642b07f7495c40c1bc8481e6a14e6a5883ef89d3edac71b6a22656cb374c21a137deb16a0aaf3149d4bccb6b382857875ef7e4153ae9da4ed43d92849cef21c9795855d278dfdd3d5fd21788c81d368f15d9c4b25b8af95aecfda15bfc93ff51d33fec73f4145b8acb4afd8f64ef26af129b1f0e87de59fc6c8450c51d0a2e5923d09987443a4552bb6df5e4f322b84088b69215e20c077362acf81dbf5a23363c1273bd1e58cf52dd0bec0717e484408d79af4a9cb7c52f9b72c71a83b13b04e2943aaf05915ec4122e64a75aa81da9d55950af459623cd076e87c47404d9d614d2cf0d48d54f1309deb6f26942cc73b503053ce40906adadf0dccdaf28f9278c8bab96ab84c612ad796d78e1ef5a15b964603f3dee1483cdb77bf7d0f055b266746575b3632d530f462fff9babfb81fd892ab6f2cc53b3ad7a20feb125eed8c3db82ad00", "6a65ac", 1, -1061482661, 1537743641, "2e4f560cf98ccf7c43eeee44bc344fcdd7c1d289acc005cab1d125b07d826565"], + ["9ae98a6c03dea91e2ef43b0937ad82e64e290a4a06c5229760eed9007dbfec0aac0c9f39c600000000015149b455dab2cd566ce4c2cb8ec3cc1882e267a1b13b9e8a744892c165de3d8252856401e0030000000863636a636a53005318649383b26efe9f7813ba2fb735cac31d56de146c15b780856b42f3f67b4df332321afa0000000002ac52a2e7817e04aa16f00100000000066363535251ac898c750400000000036563656745ec020000000005ac00656a00ae0f1c01000000000963655363ac630063536f85994f00", "ac515251650051", 2, -1397139905, 0, "1284d0a0342cc8612e18a30b9ff7975fe52c94237da69b2841c050165aa1c951"], + ["030000807082c40302026e5f09ceed7f2bbe34c4efed827fc9cfec2871384b3832f59d95b883284c6b0000000009656a65636a656351acffffffff20ec34899e3d864e686d27b757403782243662233872ea919f2a390ecc83e81f03000000056a63005352ffffffff04831626020000000004ac536565dd3fb605000000000863536a53520063ac6a541e05000000000865acac51526a6353ebd319030000000003ac006362f147cd000000000130ef58050000000000000000000000009c9f5aeafff0b1475220e2b170da4fc368c3e5d85d701640fd7e400cb79cc0b172295e8c6d9ca7dd6d05dab3e72c9b285e892e7cfe6e438946c2bf9628cd2a6ec363491b8ec14549d45eedc65b4c8d6598bc49565742aa96945f863c22bf75eb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005aa714aea8e1d4ba757e9d19992ea97eed8da209eb93123dcf0be9f1d797464bbfc5943a2a4130c58a34a0aaac3e88cf0e4c6c16f7988f6fb1da541804d4053f36ce9b6883660556a115544d66cc6fd8629095e915ec7fd9c78d6e7bfafc2a2cb7bc2accca569bf1a343ddbd9979997458ef544c180a780712895ee6c5ab8cb3031aa8e3aee28258dd69a98d2a88fe2dc5f88517d798feb0c5bdfc682783a38652032fedd70f7c0c1d39fca6dc6cdaf2c5c17d279afca6c355f9b1305aaa20fb39060a08556cd6f05bfae1c4a1a22e090f835cc117f192ae384055fa230ce12160299f1e2f1d60a4ba4000026850912d9c9557191f0260c0320d9b91ad5b7dc4baf207020f64ad348780ea5595edc8a9c48d0334bc8178eaca3599893f0eb81a4e6ca875030bd06b1f3216694c0f77e47cb35bf3b9cba59100b20a84bf4d5f1582b6101cb00324581c2d81ac09c40fce0c0c0ebd8d4481fb998ae752adc5661765319c7e612c0327d201b75cf75e5a78378c09a6c42344904751f76fb53bf44922bfa00846ad740303a816f44b963f61121a23409f830c3b9228e603af91e5020e6d037d628a4bc225b5a2bf480a53b40a85b0b56d7ed58582ecb16dd6ce029e9fbbaba47a0cb5c681cb1bfc87a19d80cc1b2626da51e8e9855c8eea7b3463e867ddb2e9aed1f278abe419dc69f127a2044d9d4fa20ab7fe8e9f469df8886d0496dd3aec8a25e73f66d2b7df36e05aab256f6070b8d120f66ab051ada8d5f210aec6487005995043016422cc2c4d7d08d7baea14ef40d4d9c6fd16d302ca83e89e3e746f9a95ab4abcc0da8b157b081e6f14dd65611c41a90513981fbc97c1e6d20a2910f58a63d45d8b280a6adb6ce7d98c62ebf4df4dcc30050d9a11cdd7569b8db8e155b5d783a891ebda96ea6d558c3982473e34c4f2934e7ecbe267dc173d9be787664cd2cc2a50d5f3404576f7c17e64c37f3036df7a4bfe28bbc2ca45b7086b3bf66f1675582627dde3484e1889eee598689597efbfa6aac0bc1cd22ca7e886e1985f873f2ce24cabb0ece867b39796656182c3f6f8a726f41b378b876a6b90934fb34c4cbb93ce29b3e86145aab2b8ebc26acd47631e9ab750a1562c64929769c622fa7df27f99cde24039f77cac14be0f0404cfad116d1c90d266e3f4718e05d585d9bb056cf5f380e0ee7e5599dcc0c86670288f2c6f42643116b8498d2d0924691881634ee853ee557c6074f99c6358b236d0db1cb2ec0aa8ff6043e41cd9bab468529ac3642f27a8507332fd7043516b8ed7cd1e0983c69e198dfef5f1456a100c6b6dd5feacd601bf0fe52cc4afc9cae8252d5dd86bcf02562b779b98a879d9166d30958c7a7cc69cff05390236de0f3d95b97abf35c0859fe49bd4977920ebe52459ddcdbe13b399a36f2e0e4a93e052b63bee9d61672afc8997902a3403380b5d00f70cee7ea42e2ee093d853f9dbf2d88bf6c5b2ca8c6d04cb9ad7e9c8940426ecfcd1d6293acb77dff2cbb995380c156c813cf35b9ea40a9b3f3c19a3b7ab669d27820ab2aa760f19aa7cc749765f14682aab1dcfea7a47afb024c6dbeb52670ff0d903be58bd0b451e801bb7352d8c2998484201a1effa111a8e14a9c5e5a7c9d618df7f0b50f0ded3165de11c6554def74ea0b110603f5e82327378d510905324cb98fb6678e70d6b4e54d04001a713a570fc57ab8d0a615812658ac0aeae1af95f32f3eada9132575b829d9efa073355f799c824fda54b671fdbd20dd433a57330383a924ee091953e0ed47a1cc3e27ecabd6e69e75ce51a26c0b4583434249a95c1a2a92561da03be3ce4237547e7368f502e371ab834eed7ad973be33011ed67bd3d9d9cfb42ddaaab65210fd45e32aa842be79b4baab01f751591e32494e2d735ef2291d433a5426cc668a32f1aeec74ad89345b8a4ddf3a3734780cfc0299447d09ad26c9fc1d31f476a893aeee6ac1e7f807fbe27b1eea24ae79649e3d28878c80106e0d13098243d57943e0c2840fc7e67b68a3fec5fb370daaaec7b6fbc138515b1c68859c13338c1ef7f8d60171d17eba6caa7dd4103bb5f63613874a0fe52b5e63caa71a8eb31d5829776cf92a51d5d2c010b8cf33698c0965c1468119ec60c0a895577d779793973fb1124850c2bc7b3631f388d29eb031928ac6012c9e5478bc8b9f7baca3043fad3fda70bd438585bb83f1316c1416c857b4fd52f96b2f2a04146a302a254bd77e906d8fad3da23b7e6ea3b1a28e64aa6433b0c24f97d682266dc42e910798efb5728becb50f0621a517ac801cd64013e9008a0d885c991f0058dc760f7d5c68551813509a88e689956e66cedbeb4607583720b85b3964d8a5533bc6bf0a54e258e8373d0c08820eb19b50b4f7deb5e448ce1b964073cd721675254dd8bde556ca18305", "526aac636a", 1, -2137542490, 0, "98b91cb008c90fb041add9e7bb8e49156662dc5fcb23f7ae2e5c381058b371c7"], + ["2f9eaa5202bb4ea03c5c0ae0286d7a957314912db050e3789b19f61206a413926425d2ae0a00000000085253656365655163ffffffff088a63ade88a071c0120548d8407db0116fcc7748a648ee1ba07747fdd902230030000000765526553006300ffffffff02005b96040000000007630053525251ac0af5320400000000035165630000000001000000000000000064bb150400000000a7cf8e8aa69ef68d3a788451fafbad0eb6601dc1dd6b58331ca371c5bb38f7a6c6133cc1496526c0c2259118ff3dd8572c4430567e815849ead0bfcfd1aa0a5fab2d752173e7636d57e6193c0a00e426eab0ae46991f403c4fa5f35acd82182d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ba2c87c009ffb1de0d3fbe1b13340ccb4527d6a6d8b8acb815d67d89fab0365a455e35d072a159c60bbc60024704bc20a47d4060de350d2f3050539237d094a5bfadc875fbc5931c7a4456ca621c115c8a0d2e98d138dadbbf9cae1d373ae6256287a3ce9b592cb8f95c380950408db91ee763597b9ddf96d6063c94408fd900021c68eb08b6f28a1270378de8a163c2ba416ad5e83796b4c2feed27433af35ad6030ce1b184f7bed5c2ddab0b4433427ec7ccd79ac5f712be3aff12b953116934320a01e7ca45264ee717dbe519deb9217df1fb3931f850e7152a1ac6792f3e57db92c6f8f1a6d77d397008cec4e5d361515261bc26c9d60bc4144f88277445ccf55e031306ffc5346c5bf2d17afe9d197110ce77243d676d975c1e37b5d54b82b722a2032d0d6f2b49d6d847f8b06e01004f193585d74400e9d9282dd095bafe7fb71b41020c83c217303d32aa708916637ac91217ee02d0cd2c1f9f7a1ece48b28889dbba0204ac91ac3653f7b26267dd5232d7b40d88fe67b7a1277dba917ca3af170e5442020c0f4acb660612956378eefa84c2cbd255abe7f465cb0811b7bd291096211b9e49a65f091b72e3d120c4735977c869a79fc98bacfaa3ce545581a5fed2c9cb9e97e67bc7bcf6a735c28b05c5ba1e0b5c5797639df86a325c6f1d3e1af8f2794210f2b6d02e7a4b12bad936f0b6c62e9e70c88dc8cf3a2935ab44e37d70610941360156c145adce4d791e50569570e2e1b524306761a4ab591be049071a0906d529b25f461cc136e881f1fda630f8eea025e3e1828d5a0db5940d2530f5bb01791dbf1882836e6f81c06ac03c8c23a3a994bcae6dce4dc553fb6700b0549332ba2eb057e15662af4070edcd9bfb2bf5072b8a9994edb32d4de7b7dcfd56bf6585a50f511f63ad4de4a2e2852a4229da91c0e8d23bb737b38af42489f53df67e6220cc792ca275b89c34270ee6a60dd9af03c3a28f29ed8bf3786e628995a9d425f406c3a5db62fce39146ced1b28fad6a3ed2d2ee206143b01a64114b53dfd7314abd4305bc6a20d7bef4ab3ad37408319a6697046e80a75000b0687789812743f3eb53e0348002e2d9add701751d11dbb520e96e479da14cd4400c97bfd888ec0806b74f521f827a958211a6726e08394b13eb8b6d3084a46f7959508f6d82ed6fab8e96b3edc66c249b5403fa0106ad27512db07068a1c0c827b43b472506b05d696bdae5d18b3e2c4dc09f50f5cf7f19008fe52055d8ee73766de6f37fa87101d57274b43411beadde884775a1dcf17e82e4a56f5e4885901656e5ea808f4c23366082f8caa6c5447f97d09e6fdcebb6d4299ab225cb93b44da3124a00393ff3219f832f033dc1f76a393db4d90f6955b4dca0490ba405b852df471a5ccbed8bb20816e4b4e5b4ddc726770ac922540f2aae8b18b51e4015a02d7f3c531e1772d9b0d368bcb819a67bad79b22e6e45d4be81035bd128019a243359908bd9b1c50dd894b29fad5efd3ee7e7b3048b1837e622486a0fc060869181c21c4af5abb89335c3f94aa103a449bda2e61a26bd37f19dae780d2a863fb9f85e5acc26c98a086d1764b848b5cdd01590d03b5c0e884601697e8971ba197ecfc805661b1cd1cd5feba76bfc0e08af2bd90873f07753cf3c46bff6ac390fb61bfcd406d2bb7d025218ba6bc4bf5ec0d8b90a1bf8a8f4b5d03fdb1b6b8e9b34ec9ef634d85e31fa1b9c030670d9ce254361d7482e882d8433fa1010caeae5a707e588fafb516c9c2da6ad647d19cc2da48944e19aec1c5c78215527143ddb00368fdecb9d9fb1ce0b3b8e65dbb0181f3f0058c13c8530ca635bb247debb319c7b318cb345c45fdcbaa7eb6a280fb22086cbcc9bc4db5e0725ccf389048c775cc71d966ac610cb7903859a9f7d538c7f97db1be866cddf598ad8a0500b9f8b863bdc12a27c8cffc952080d1a049d8190c9ae2d5fdf41e0c9117c361966e95743ccf40a29ffc2ed60283774e8969be5aa1a13e61a3825fd5dc2e95f751a0d866706344672d7c9a4cb08d0f3e339db28532a353756384bc865a6945891043feb055bbdfb6c5f80b6cd82ed867922d5057a9005be6649b14cab2ddc2a3c9f8eb62ba33e98d6278555a0092aecddd36b321eb428da3b4a8bc50f3df09094b923ac77746f758c5e2c5ffc308d1469d0c8e9d0d3ba4f461bef76e5a9ea94b3b69307636d5878c07e1db35e2a5dcbe6d0a7d2cfd6ac1048bef6c23acec04f7b461abbf178c2d38e0e0bf91ce791d6272add4df5d2df320bdec7a902f618c293559144ae2bc7b42978babcd7ce51024f841faca77ef316370ebb7312c1dbffb0858ee3765d6e1f55b30a5ddcf695e983fa88b77977f29ffd9ea3851b30135a9634459dc0b20708c0f629145252e4cac9a3b3f0771b37a9b22b584106", "516a636353006a6a", 0, 1823461283, 0, "8f8543db77a3e02a6532ff83d167c92cc41a53038addc15f51c2e0da3d8e476f"], + ["607d5461023be04301ce84d198585f995f1c515ca00d5a60c09381e9edf83e367b1bd743e6020000000553006351003458eb54c656df26b45fdbcbbe3b656128185035b4df240f153ba2a8efdae8b1c864fe1701000000025300d815dbb4049dcd0900000000000452acac002cd1200000000000016a75b0b900000000000251ac6bc1780400000000000ca3377a026b764b050000000000000000000000008ce102ccf3c8b01820f6bcc697b2d500cf9e82af568218c164dd89670519c7d0ac4d7b4611fc4044088e92cc5c98675f6980f05ab96a030f4b209283e28be5766bde96435ac2c0337d04ec6c1832fdfbda2537f5d3c0adc746ca6c29ef44c4f8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a5d87f4416d20a1d323164e6199b8a401777bfa118f107107ce1bcc1cdcbaf9b2a7a1150ad306a2f09bea4b13eef591f1e1399ab9e2a59a755ca0694672e2b53c6daec661d56247811d82e2720281cfc5f978b8cb0b2a490164c33097932cc9a0078e30fd5e2c611f490542c4ee720e3e25b0923db84f86c827190714d025dc0210ed8501a064ab726b9a2470c0877613d440eb378287abec0cc5269d7be4b188022d2714ff1a4de0550a28646ea343f0b319ca409546179fe1a4cf691ade980da00a03b1291a4061fb70dfadeb936f228b6bb19fc725c05ac902c6bc5cbf9e82f786dd86baa0ee8dde5e10aa12fd04eed988010654bd772a252def0542a3ed36d1af032c8687222f5959ec1c0136719fa1ca195ef5b860db7fc28f98ddf57f7af87d11031ae2b1d291371debcd6315cd221b191ef65873775d3bbafafe1d48eb4a8beb1f032207a924732b52303e2429dacff5065915a95c246bc633ed68f410568e82ea4c0227bf1149ee80730dcad6b9598639a88eaa603c9e7cae9e881cb1f8c0ac66c93e02071451ec7789baab8cef1fe933b0cef5870bca5fff07b1fe7a41bcde5c8536a2d7cc0b2def05b30330a282a40e3e06a5053be146209e33aa856a24ef767797bed15e09d60cb65345154ba3a4beaee39aebd0245d42cd14b8c6bb75ec805948a661e63e21a6529ac735021e3e074334a7f45040d2ed9444d7deaeb4ab935f24861634c1382de1f2763400b425c870083894ee5b03cbb0072f912a0d4e0bda35d103b00fffb35c44653d41d873832c9acd34fb34c8f1c22f18a7e42e4ce8ff94057255a244dbffae10c6f5f1297fa7958c4a122a3954c412e1ee084989d8037c0c877852a9dc3bfecb7695f773d20c970cba4369b3186a266c30b9f1545ac146d9aec474c285a7f9f9d50be0a7e8c9e63aebe293b3b4cb664c42052aa98fa2ffa65474c7da2f2c9b980014255510755df47e4a88e5647388524216b9704aef71cd6d003d3d0f4bdba212117e5ac2be7a66f8c8d2bbc9cd4c29a06885add55d90dbd89ddd21fd42824ac6c72e4ef5f1ac0740893a2cd350df67f5c120ac4f86cbaae86879241202658b5e63b95ef7baab97ca1b135b554a69ffc775ccb49842dff12e0e2f4d6b7e77fca503aeca6021bce474ab86ab398275a5c7c9da8cc87d401a1284a58f8cbf81c504d48a62f4c289ba0ec143b51e870e172a0497e8d4397e6a0211ed26cfa1c4b4154b7071e4fc2c5fdf16727093bd30fb3f9f12fcc8b0b12be3095ac9fbc1aef316b332efd92df5ff985558d9e5d1958d052a2606195ea6997d3b06dd156a9a03c1591e8dd4fcad7f8c708523f2ddcdd2721a10b12372c117d2cb74790e39f7c9a97ccbf95e9128a3659b56ea8edc3fd29669160b5f6bddb958b4bc08bb82a28569dcd2d128926ea205cde1371d3f42e1a3bfad4aa741755e6f5dd444baf809c3a660915ad474593685f0c2c9fad3a7327b0a519286349aba2a3abd1c4f8de10d522a2949d01eb8c3b14b938f1cb7d1de4e6475e233277028fcf17937503e2c31a00deb74621f7e504dff152c7147b6687bb72925f0adcc79c852b7559f451911fb95c01d95266f40e67cfc3a48cd67211c3977d575ea2dd8d475bfe9d8d5f119b62964f86a9501912f5fd5980af4c672eb8a4967b4698708a3d33af4207195b25cf4d8562266b3fd280e890bc47f4c9f8bb2cea18cf1ff33239e8cff5889dbe1da52534a5eb295b3ffec1b73c6ac48d3a04e9b6898d8cd96f2af88656a5cbbca78f6cc28c55942505755387012980c003ef7eabfe2f2c6cd239c5c2b09a050c37d08697165169fe3263b7ccc262f2bab3b54e5c768c3bd2dc87e5c4b1015490bc8f1ad54807ba8d18913b19919900fdda1e0334c64b005d58f080b4f4f2b25b52109bff7b6f2dfffa237d785560737c2b5696b44fbd4d541666fdab71a2d2648e4654901cb37bc6608b4944ab7fc994323e7f2e6cb36207e5c9396dc89c81654a6473eaf8f90aa81396783fa40d7e3be3011baa2f052c0fd7df53d1cb13155f7b70fcb69c63a324eba49106cc94e4dc145d5f5eae47ff4745ccabd8f829264334302acf19d4ace5e952ad6d0f5ade73502ccbb378f15dd088a4027b98b0b3f93ecf9db5cd17cdc8c8c7323022741d2813cdf3d4e74289d0a86fa009070906edb1cd71af9736b33f601a038d6702078a634d160cf1fbca7aee30f386925495af7c13241b350aaa4ea3337f6d2fcafa2a272dfbdfba211613626349bea01337fe9a89f0148eb4e18d5b0271a94da03000000000000000000000000b62daf8ba0e2410489722bbb81e74a8061faa38e1cdd403b44ee3c7ff3a90ab997eee9212206aa9622976f6e6f3ba19dd1b0dc9acc66debe5478e1b648933851914863598260fca2b28b2acfda99173523f03d97bf650c507d0d8fc0d03ffe680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036bcc95da2981e883a4fb266d7237d6f5df1361335588aa819d07ce3ed868103ff247ccf58aa0782c4cb201e4a08aed3075ae60d5cbd7ab0460b353e7c55a546dda57b766bfa8f67b5421a7e9881699d2f1cec8f9d4218bb51c7bd3004e2ce602d17b13f822d0f3ac52d4abce58432541fb52646f0c4fb15655886cb6769c32a03223b4375c5098c8a893df8cf97e6f5b26c7de1445ea956a6e0eef849a86d591f0315ccf5b79259a2e48a3dd118df26fa10abaeadba50f0400c1be9443475bfffef0a066a662e379dbee0cbf6c9ad96f337f701b6aacca3b239f441a6ad992ddcbe454debe55df6c94911e2f7437cfb5d080f9822612a9c60b9b164e3df0b73d7f4400321d627c567fde0a21d882731e724a6e995fd4f72a8373cabc903a104a28f0d070206a5ad3b6f9f5305f42e1fb0d47a4bd254b1865782914ce594ddfcc0522b53c402057397e5dc42db59399728740295c05414ee9a52541224a06fd81018cf66488f0214c98c8d4c0d30cbe11103922098568b75085c053ac6bcf6a6f181e498b77f400303a6bf5a34a42cad1419606fd3fdc533bafd38b113589d99ea0490c7bff58787ba2e2ac1a3ac44858017255a2ee76c79d704040b95a8a159ac8662393ee4bdd377998c0ab36c9376ea2f04bb2a989a394364411998fc657e85379d0e59c79b141b2f4967bd2055338ffaeb87b2b803bcdec98dd506c2aa6012a42264b11c15afcfc608d42b9233a2dc60ae693e66c5fc69b7683d2ad6c0a0361346e32d0bf4380ed1fd96ff2a8dda3d9fd3d23fe174767189a464e4e3c633f5aaf14b5beb1599a5a239da575765868a351831530042cd5e17a2f8a31eedee2664b56dcbb0c9d62954a293dd53fdce54c82977d37d1c344230cd3d37b0f0eced2092fa484cc92b7df78ad501074b83e2aa537507ea4093bb3aa6af11d97395a95657920e0cfbb3ca6d61e00f779c502b47e002ccf46262ba3e047c7b70c24e7825c4d48adb2340e35f3365fc9148d86baccd8778a7d3b723dfde4a07dc3740c41929aaad92ab635afa2ac9af0a9ccced5b40f454a145df78ae0c7c24c2473704d26cb2f84f69b3c60e95760cbf695c8dec5e7c4ed31a5c678ae0477bfcf05371a57dea517e023efa5980178be24560ed3ba39c455f5ab71a5cf82a09295bf616c739567d9a7f23017c4d2ae63900c4a4ee1707b86818bb83786acb6354240015e0562f529eff84bef9b011466edc8a6adaa5508cfc6fcd68df5c5979066b29ac5cd002842052c8c078d8e17d778547353e072a8e59fbbec186806fc5e99236b7b4ae90f244758040368e2d351b3a9dbaace7b390eecdcdc4931f7f01895c1d30010eef5aec9010b5849ba81bfc528a895e5542aa19dc8f0a3574d235ae045cf586016ed2da5c8f0a6f83d416e3299c8130e5b46a748879e8e06128e27b8ee3c1ef18e1438e18123516e6354ed18958cbf662db7e82b5b0267241ad6d2d5e074b6ad4c932a21afc8de494d5676a5a458509ddce9adfe555a149909a9bab71afd5a00094ea0d6d3c19c5b68795424cd6191498ae121716e80d0787afb895795f949104a1d16ada31a252534979a48781f7492674284993a351a00e4481ec26d7e03e955386e7de5a6eb31416457ffab5be4e5b25ad0d649aa63184359d9841ddaf9db4faa4c1574b3e258d9d22666736da6570d482eefe33a54fcdea6cc66a987f2c4c8abe5ab531d6c9ca139a630d59d15a2b45b40094b5acf67c629ba4bbd72d2fdb3acaa180f52dc8db58927c66c4fd0677e8ad97276b251b8caece38c9d4a6bd40dd7569aca5c09c7286b51b4efc41ab40b5ef6c5fa9b65d63e1da655528aa01fcb89cbc5a46a9cd0b6f26968aa84ed68ffff18f9b2e93333c905927b0eb201638c5405ab3b553608e7fcbc245b45157363f0cfad4ef1a97575175bf5f93b9fe217751895f0ab8b21251ad6190db5e4ef8d9a3536d3dc3a0ed1c31c9a292c2ebbbb55d3f9fb213cb1ffab8e2d8bf59be46b68982f8990c0a23585ccbbb57452ee4eb7021d9933a7ba8c259643c50c6c93a2a278485fa9e50ed6293c04773ad119c19399abe062969ed1dd3887871c7639919027e08394e08bbba6523422a763401825ccf66ad38c85a2f084a1b4b55bc0f57e6799d330327f239bf94a7408588b4bd2c1ddc49840a1044f63edf1768f4c14506043c4df36679d98e6ce637d1fe31f5a73b82aba33cd790e154e01809b5af0f57b2ea8be5a10099667516b6f1272277e7cb1b90bc685e5cace6e7f02dae65587e7f10d77a63ac743dd1137318c5e37a4cc8c5d3ea06aae43a7085bc995746aaa14ca57f987b55a77da9f1db365c44b27d8c4dcfccae3f11d5eb69d619fbf44ffe5eac130d60728575afd65988dc907fd953770407d97c0648f3c089d5ddc2c1e3ea795dbe05", "63000063516a5165", 1, 353261683, 0, "c6708f7348ea020fb1df9965b191a82dca940b26756989c29ba374650db26fee"], + ["a5928e0502e98874d0a436eedbfe91134f46b379fa03dabe573981c2c6b86518ad8b433305000000000752005200636a00e1b63fae2b728584ac3141cd0f1b52b04e8afb1652fb1f67b0508b6e334e9fc0ac09e0f9030000000863006a6500636565ffffffff036c51e201000000000400ac6a6aa1dab0050000000008ac656565ac516352e853e605000000000465656aac80167ff7020000000000000000b7d28a0300000000c5a7443181a908501934251887fd65687aa94a5881d006f0266f823cdb3b84fb2bb90a32ffe30bd822e365338dc9265b64432fd33d81919d0594296d419b462f2176cc39f9409b4460ccaec89f7c56862db2b8ef8d989bc6fe242d4c063d81900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043a8349a97f8cc28307a09dec69e62a7bfe411a6a9eff06bb37494877da6d240d4c8dbce591d99a6f6467896366c31698ac79972a908236cfffb3fda4fc54e1e61111b47874fe58dc012909d1079a28be703efaca6cd63646fb0a93ff824b63b302ea797e3a5772be874ecab261ee7225a28551919a75e5b5357143a3c32462f02155f1651c1d3b9c3a5fa9468c5ccaa1d7ddec0f7871081e1978cb57e6645441f020a89be40619bf6d0c7b4e45f1bb56a7b570599081379bd7553b43611f1d7e2e40b091fcdc084980ab958e94daf03ed06462ee86122dc8a791798c7ba311ff654900db7a5e6bab0cc6a6b340046fe8c2f2c30b09ceff196ed68fda7d0ffb47b6ccf0329e7ff8b0231743371f76c9d5d45cb3aa22234f83e890d7153bca6b41b0b9faf020a265e43e2e2179069fe5c62cd8b4961c7068a1e35aa725e635c3c73295c2fa80301ce93acd29882474c24e14d064feaa55d0ee12ad1dcd9ba56813093aa77ca2d021b64a3ec7cdf57bf1ee4c81ac7e248c8b966e4e41523ae6a4f00c03ff515689c022a5b3b80879d5874d676117b1dc88817a30cf2b8e8f06af13cb28a3a7f8e469320f140d51657c36989f1575ce4b8781f24d87d285dd168b858c23a3235308837466c485011b96547b057d4ff9673040d467e0f52cc2410bb4b0a465df4f27b7af9482bc7144f6a365f7b9fa6184dff92e64cf04ab99b0eb237d289895be3a0d3edd35b8bcec648400e9502e54441a3db860f759788d22591d5251a1e938098a931abcab52604b784689883825cca3f5e8b8e8059fb0be613d9a267b4ced6a0b24482852d1578b9921d70997e10dcf9042dab7d8df36da1d30101d824570e86bf90825c8d8dc281340f5c3a5df5bfaf6e9c99745546d8590be9752724d2ecf4d5ce7d779bdc7b839f7d224daef404f2210f5705605f02c30fe61acaeff639cfa7da0c49884e05fc3853c519c08836f743ebcd66e9fc3ff138b04949147d129502cd08a0d459aa97d7a6087e30c2def2d3fd62bfff8fd77d5b959dc8209529c2c211f8ebe2d85cfc27dffe3caf4d1485e36828a9f260d62af2b4d9d3d72182abe632d99d4b67c870ef2bd431625607d46dd463410a6c76c04b2b88f1576013b199547fac4ea318d7436e03f7c2debc28c15a131e7d61e7971901ce9946295008eda972d581b2a17434107a5c9ac07ed36b75ead9eea4c05849fed11bb54fb35c186dca1f5ac8327697cb99fbdbd4800cfb5b2e1aca5adf75dd02f70794da684667b4a29bb372a8a51eb8e721455246a0dcccd76a40a42bd961e3d075f7c405d1328af70e0c7aacbd35858057594291bab5c87cceff84573b9f707683b275f6f47281cd68dea1491213fca8b7abe207a8b6679f254b94ca5294c58a57bf36a82bfd60878ed0b1bbd3796c0ec6f05205cbef21e0eb2e4b5a79ed3bf8c32057d57890811f0794d964e4ae0dc392979ce3f757795874903e583dfcc27a4a115d66aa83805c73b0127b882ff133cac17747b4d012a2f04aa698d5f34e0d5df7f7a30ef9a3254e551d8886385c98c1bd42641e5b6845f92544a2388782e58fd19787ccb8f051623ca33f71d72f21932554f5625be0d6b0856c7b2f430bced37daf223d9852b9fed5c9ede655044c1578fa41da0ec4db837b991ac98a27cd2e0621de02cc77bd4737ad75d8d209c53c1c644922a0536cd5675a17ee6fd407e503f4642e50e6baa2b1755562b7456398c21a5e6998ef8ea409964219e810cc0e76eb1b63a17ac500bfb12cc52bc4b9237975b124bc4d1a80678b9213481a48dbef6552ede018b9576ff806bf575707301ecfa4a831b09065c69a89652a162f9a83f38ff5db6a08a2bc7df3021da5781a1706a266fb11cd54dd22081c8a8ed0981f2a167a9ed1db741339675c4f858bde93f588dd1defee4bbd8047a5efaab7c8247f0d2bc08e208668044e54d75236a38a236b31c868bb55688872353e6c43a83423481326867b22780cfcfa5b962dee87f7c7166e05535867378717808e651f8229b2aceef3e26ea78b327516f11735912d6e9fe4493116ae91e01d0bdc1bc20d9044e1085402575f1e1642a3ae39895e6a12b923a77e237a5a99d82c27c042b6ab60adc3d6a062bbdc10a9b5f5d53e42fbbad2ee7bd70c245c397d4e0c27d53fbd3b68a511e3540b6492a9a42a5dabe049b197ab0b587361ae5453a22f344ee40bfaa68f555a1d1be84b0310a6a51a89e6f9182012a179e3dfe2e34f9fc0491544ff4bcebd695752c3d7f5218ecdb94e2e641dad2e2530ad9a050000000000000000000000005922be6635611545f2b34c29c9b53d64e2962f3d6ae3dfb82e0305e5c63a96b727138ab7cbbe1e5d75fa0a51843bbae2cb07893de10b45b03b463c3682d930ed69d98c91aab6d85888205532404d90136a1101865c1b3581086c34d86ae9018300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b3b12c9b630d16516384738c5fa1b1df2e6d508ecf6e05509a00d442de2d2172b6eb4e44556cc26609d90ba23293804e6de426ce4134b1540587a2c79360e4eb056dce4a0424c7c981f8873511cad08834132368309b5f1e4c58f63289a4d54638c03b70f368bb8cb8108d15747a8b38cf795b339f85882074b93cc3d943df90020072336aad3c8eb527c7c5bb040c7718f9da1cd04e653d57b024504c9bf1450703289c67b4170d885af39e1bfcb4d245ee34a4f853a7154fd4b9f238c98e0c68220a023712f867de3d7dbf2b716d0f1973e3df2b85daa36ac54bb0ff4fd42be1fa533f706f517547a82a5c4e0584b5b85628427299fc000a471f98a0cc8ca51e7a8b022d6fde23bd8a96e2a495fd6646dfc716dcaa370bbd8caa99f770fd96ad858655032a355e9c365998f92ab5c29e6c2d4ba460b8b0f3b8680ac294bf77d1ee983c0902269e1cf246acbde4628f126462042ef52ed04c5228830b4dda2b9f5708b0e31d031bc3f1719ca256ee7ae8bdd7dfba5468e0806e087c9ab1aa8a0a84bd8da8ba5e0210d4df9ccba9a1eaec377b1af59ce528b267c51a6768d3de2c549d8547d96e4f98d742227c0ddfc41d1ad0d257c59516d04826d1d12d430a6210a1c432f8d95ca7cecbf7e532621b889186aa91a871057cfb81a8cf77f1d6fa978b64faedd051ed4c8a6bff87218fe4404451719f3305f21418a47193c2eb4abe45c4ba9c9f92e60b09a5428d3912c767ad0c2967c3c9d94c1c7ba7103bf4bbb381d822f301fa9b0bcfe8ffbcc211352443ccdf2b18ef1f4a8b19b0300fd86c26e3266f217bf46c437b78b77b23752e7aafb90523dfa3b8a1d68f279a6a5b600b270a81dafaf4b03edb7657ee98166bfd2b0c347bd9bc28139d820413847cc21924c457a5e9725ed6245cd012ef2c19fcacf9b90958bec4bdfb3664820f35deb108a109f3acbf9f303628693fb8728dbd6e47aeb54f47de81b9a12d6433200deffdfa657dafa799c288e9110850150379347124fcea65f8bdd5ee06c438560bd2082fbc18cf1f0875ceca05f026aa84b45e4e55c97d671e4c60335e2b1d69dd532bcbbbcf06f3552791ec39151536e7bb5fe5514feb572181bb2200571f1f9f39078c6a393b02c628f2291e14ffd74664db3ce9a735434e4d00b254b104839bda260a94f29b4730c9c6579d1acff7d72f17277bdbbb8ae4e413caca99f0b08a5dfdace64c8f22ae5a4e244022bd231f29043f6f6159604a4c8d9600f275df51adfd4d385d02463ac35d5bb16a8c0fec297a0a009f37dd9be603ce2ff0469b6c4a407df7217425603da6300e9f82c9a73fd54e6f6979571ff0f23ee9b4d62f91d4973ced8f1cd99a7200e5a11bff50828a2881a5b7e4e9572324b13236d14bbb2459b2433fdf20af9bbe89d27b4a2acd76778b384c90a2540d7154d2a5b7301362b0958a3af6ffb70377016b488f043bda68fa6bed66e06ff991a9577fde36bde497eda07cb424e505ea1b52c1f76c76589a5945594bbddb417d56fab741856dbbf4088950505dd1effce067d9dbd001dd8de66a8dae62587428349b3fdbd87be9e37fd082395e5f3d27757fb9b0ac72bcc4b853cf54301aa178df0e8bf59950917f011d4b8e788f737acfb84e0886fc1fea1cb29ed6b89e9a550a1194b8b72312f5f9ee71f0eb2fb3b425158711669e264972ca89924e0efe5c289d64b91760b25cc6d8a5063cec34f40bce392da625b862e1b32a75b1c1011b2280d18ad11abfccce6f8a385b8739f947c7c62e125016a7cc2f4aab873afe622c63e79d1f205e6e47d0b8a2c83e3c5f802c6329c98545cc7bfd9f002756dfeee01853cafeb40f8adf9febba7ddda24ce63c335c5dc9fb7c13d0449b29189a98899a680b8de29db88ae1a2c65c46337d0b16006e2fef791b6351de064551da5775c6e179279bbede8041ab13d02bb234be9b9f84b010a55c95b4f32dcd2b1582634a54ceac14828e4b2aca481b1c7f0485f4ae08f9f34f9014c4ad6fe485e99efbb08d79344dfaa7634f887876916ab15f7d3334249646c2c75d24574246338017ab7d52041b1928c42cffd01bcc961d3b20e5e7fd01b96e35e6b9a26cd136f2271ffb18fc00abd058a26cd2fda75faf38151c33d3e047e28e5da1d35c29f10625a7dd878e3a12aaed6652c39eb2a0d335347b6befef7d39a180bfb9702a3b8b4391cbad46bdd7914628e3ca3cf194c24631c6ff05d928f8cd490e1d52b44ed01a97c201c1fd4801b9878528f7940c4c0dea258974bc06b87193a6a622de33fbdf6b44aaa710e959ea1a36b55a235e5184b81c87c0dc0c3776b0ad62aad255118e4f81f85b7b668712688b255239b6de5ee2751b43c327c2aa7de8b2938e78efd819ac5be3ba7b71aff524bc480c17e018cc8bf1015edd56dc23681c45000c", "", 0, 1217284831, 1537743641, "5f2e98eb044ced84c44d317aad7b99a446585449838ef73d052e36259848f826"], + ["030000807082c40303cf61ae91cb4b1203097eced4fed61becc080308bbe99ea15b8adbd5832189a470000000009526352005351516565c0c970c72b64cadf0c9f817e70888d19f7196754de18c01d75ff996ea859835327f99c3f00000000065153acac6aacffffffffe29f9e19af3a5fb29c714940ff84691ec75070b671b41c13ea628b2f1428f304000000000500ac6a6a53ffffffff02c997fd0000000000036a006ae8e10d050000000008530000ac51acac65f42a21ef0000000000", "525265", 1, 1436171982, 1537743641, "4826c3b3ee9741ba34ed3c849113d184cb592da8f04f735021160f4887ca8a11"], + ["030000807082c40303673df78e5cb0d6c91c81181fee3928f9c29b86863e848198158ef43dc4e466f203000000036a0065d0b7f754cbdd2e48d2e9516bdc3fa0618e8c2bdc61b0ac6ea360c2843713001790aec6010200000000ffffffffcb6735c54fe58065e9e24e63c853181ba28ad81c8a34eb3390b059f07464e5ec03000000075253ac53000053ffffffff0455c51c0000000000016a54938a03000000000352ac63a80db60000000000040053ac53ef14f001000000000000000000ab6039b702db79a602000000000000000000000000703a69bc3b98a1a9198a7d443686304a922ded01e93513e4b1d8452615f7367bcb99dc955dee43a8db4ecc8e4a68390157f9713c21266113cadff76636b68826fa5f4cedeb38bf59e4827727f56f3da30d0fe09084039e2759c367820a09a953000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006510ee13c42b440d5ff75245230cc8ce624038ff5582f8529ba7cf609dac169e96879fea7ae94b97c37b0b9d8525a0042d33e6e0d6c4295dfa9af5ed5eec391d39b86e9ed194f29b53b4020dec2db362fd2a4ca64e5880335c7d88f9ab63a7af7290db1602053c83de1005059b30e9779f365ea44251f1abac001998ba50613c022368445e481f45ddf223662ee5118b6fda429d0571ad2d4b4150cfffcc96afee03001bba152a1d7544393436595157a8d4a8fecd68024fd5065ae6224acb8afed10a06d3170d4aa96cc0606352fb48b03eae81198c7bcdc328a08ea629e8a91d96c912472e80601360c41be58941ac9ddfd516c61642d5061e637e9c37f01d2a408f0301cbd7fef3b4c50ef5f769039ee4c848c25c76d0aaa435a1013d508e1155902c02137e1e75140ddb4c7744e3a9b0bf374e585c5c120cf404491b49680deba16c81030ad2de9b568462af4853b5c087a1e9fe846001c715a2c2bdd61c664c4d1f9ae702303c86e20bbd73be2a1f35735f55d16fb470ad22ce879c3c6455899c99600f83032f7b3245ab10d30f271337cea40716f6e3fe9e46045175b018cf72f5649f832e917a42b500dd7294aec22bbae1bffc8265808e12decfcd5e04131ba556fd3cc32e9b91ce6b18a67aee01afa9debd749c63d96acf8beca12bb5f44a5519041ed772fb47694ccdb1f515014113e80b5e651f737a3190a5fec013deee01965526979ac3d0e009d2f77f2ba2003d6547d16dc4e81045b318c9df4326847779877b693ee4457173575c370382b296d0a49a68805ae0f3c2879a8872dccc8f1165d71fe3c89989c3e6907157dc3b6f34ee91e03b1133d04107740cf1d3a8ffe8b0de1741edf94317de2be1b3d3991dfbd1db1321c21d9fa83eeac21ba02ac175504cd42b94aa15c6317b2c39a59d9c654006ee4bba4dfbe680ed29360ca8e8261a6913147d872ad6845f8dc1f9e4c4cba57b8caf31e128c73f92b19a0ed95d30ca1dc5fe83b95cc960e7254db5fc27080516dedcc57e70f7e2a8eae6bb6cb77de30aad32ff25491a16d996ce9db6ef3342f3c283c7c3303d640f9be07b2a78db37e2346a2d628d86692ca2d6b9f87a379c866724a2bdf53bc4aae9c8bd1fb0725155a1a2ef56868efbab6ec1be550f0e3775a17e8f6d97c70d2e291abc067ea9db783c2dbaf64f0bc6cde385a5efe6960fd970be88568f1e8721f1a4af50ccab1f87b214ef6e3e837bcebc53b48fda157e948850ce85bf48bb6c9ca6ece48b3a0aa695d02a0b2684a751614c8bcfed5492672a12eabecc39401b02c37119576d8cfbc2fa642cdc7eeb489cd1eaf595b6afb8d3ce5620e9c661b6fe748ff53bfdadc170bd651e5aa7961560efd4afd1099789b7acc86eb394811b8dfff373d4393ceac8fcbbc1c045303a6d6a6b440e9afc9a9cf9ab612d5e7569eb5a1faa41023d6bf7745de62d97c53311b5385e5c9fc0c09783774df497b85a1d723d11a2f3ee313dc1d24333f15b3c8ffa9e4f08776a6635fdcc0b8148731f1609b9d5335ca5327ba3996798f6091c5653d6eaa964193effcaf1cfbd4a92d0752f651df2808aa111526e4c6e66eea70259b201c965f0c70f91ec329ed2d102a534a8482d55eac26eb53af1e15e116f391682faa9adb367d1e373330f969293f1772cb0470206fa58b81f925760941752470549e5ceebff052ae07f8c6c286627334ee11ffb17b3a25076aca37c4f88cc3b8fe0333900f5bd97b1775c5ed3e8acad444d2c0967dc06fb49cffc655368b29e628cc93fb4f0c2cf0eeba6257c9897eb7d663fa5551bb8f9e9f510b63c86e3b8cfbefc01ae6599c511d7ed4709f8198433c48079dbebcb93d576720dd8f490626711ae10ba49c9e60373bb3581b28c36ba2e09187abc1795073bb503f0c4198f3356ee0d0eb323b3ddf90bdc9bb545e9ae2cca5bfecad58a0a5376550868662b2412f179721bd1a574839aa5e9c0b36c3788dfdb4f33c7852d5aa7e3d5f52c6a094d3558793f0c9b3ae84591fdce7044b5004e8b2705346c59bd6e4d11c6021965015f09df4976778128ef828421203c2681329beb3c4a7967a6fc67061dae40c97d090a1fb98733154a2eee37dde8cc5bbffc23871c0eb716496337a179d305533058db8141eb8ef4fac558258fd97a33029569329ea16303e056e5c0844ca02e521049b963d11dc54a8e4009d686fcd57a80902580bc90e1b5f5dea596bb1f524483447dab54563abc49a2efc6966cfb43cbe41d8fa1b66ab533b9ab852b38721dbd28187581cb450000000000000000e752f50200000000368b0fb46b8f282d2d12a00745be97df03a79d862bd5aef4d1d9f5f1d4f49a4da7503eb9e8282ff54eded3757d75c3a967785eb3329f0aa7308b7f333d4bc7cedc805588dd662c67c53bee2ddb16f24fe76e7632dcade2d5dfab2b3fb925b43e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087f6bea3384f217b553fcac5efc33b55b837994183876264526e9e944050058ebd30bce5f58bfe71cc26e6b78c22f48fb61034ba0af6dc282fc53a0487082c8e1963fa413bc439f4eb3b6696f3b12cdbd7d5bb87ce8ec3d5c4be57436a718cd513fdda01f51658dba27b0d44d857d9d0fe6ca9ba863fc72951b4aaf5e3a3059c02217865d365b541c2828b235c4d211bc3229cd88368d0a738e7b2edc1ffffcd7a032eaf37643c2275554c39bbb7b133d556abd298c5e75e99e8345aebd0bb37f8960a0526bf6158e8111043e3a15a92078df6999bdccaefc477e5e9d18e0c1b51da1b27e59f563e3b34ce6fb3de18f89d98ce86452d4dbd71b1c53570c26952bb0a6d031f940efaf30a923783f7c761a965e90a8bb6f601b6f3abda960e1d0b98136ff9020f54e5ce117b5fd2d49ae7bfbd6f132d7c5665a61d83494db0937c207622ada4020f9163321c94f96412c008159e24bcc9b374bd427aa88ae7712b144826029c90020cd33d8ec7759f4ccebd8c7b93405c7fd4e049328a7e7f1f12030ae19deff0cf0201de62b43cc8bc7cee1e37ee2bfe779fc9129e43cbdd7613b1e8ec1cc12eb7d26537778d8ef1df58b34be3915cd89face57ac54f12d0f4fc5a62b6d0f1c3c1d58875f0c6fcfae446b69a7247768bc540dfeb179a1e37246ffe79a2ad8e9e9f0675860ca0420b93fe5ce2d073ada94bb1163d1ff7c45e86cfa8d0d07cc658bf2982b823537d5763685965e73ec747fd01e49c81136f8988e9c7764886dddec10c34098aacc9b06c93d74d861d89cd531707436cda7a97881026d0342cb0a67e2759d96078b7a29f76627e69aec9eb58a3be1552d875175f591f7a306b1922a0f0ead5ad8ca583253d5f0cd63feaa92a7c3fe1052460d4ca3b7e01add39cf607ff569c741f2dd95fb73c592529c034b06514bbff8d7d207b757b41ce2c03c45fa57b52a7cba94ff7f66ecc712063b97a0a5a160cb352008485ec575e305ed27fddd5eb5e398c857be63d5fed99a58078976d5356cf2d5b42e0535ee8edc9bc02c83237c5999a0eebcfd35703fb2d289fef28bfa5e524ea1d2d66d2823146ca72bafaf96155d9cafb9818e4e556c356e7a269862e15bac299057de93b58c708fea86c978ec8376b2a74f10f2971c928c2879fa1ffff59669ebb6f1710d40fddea8cf3ee49d01822117054c43f1446aa34f35c66b7946e2ab59adb892a79a651e1b4a89093e8d84639941e1dcbe0b799e4c599e530f9f24303a398c602c21439a268bfafccd5b93d060e4d153db9fe522034460a9963047a647cc44af94fb17e592edd053d3205285c165386ce2d0ae5859c6579f0748769ac4075774265d46589dff30f1cbbf4cb3a8d6f7d9f5b894817560fe59b54791143a7b9f0506ebd8487d15a44fdb3e346e64cf51e480354d408964dda3accd1bc42532470427c8281b56793b51bfbfbf5fd92c00b1b63422ba7b0999b23f9cd79b6c400046dc789f133329f547014985386f35e9fde151c0eb899fe3e423c68f9acb117e4e1566423d79cb5e11558814e1d92cf6e84199210841712547c24e48e6d27d0ac32a4f008dadff4a0da407a187cb9b346ed249a2b505a3a363c19b30e5785a10b0c74c585b03b2bee98ceda8dbfef6f247f1e7f803926ba49467d2cf293974e0b05ef0324e219694211b49c9959d4146f383b91dc696323a14cfa8c93bbcbd1c1a56ac5ef897381c74899529a261dfc6bfcdfef9ca62bfc7d23aa56233c8de019b3c1a522d1c236cd5bac4d49da0e2e19e42360d9aa1f86fcf957250e3700b103476b317a01817ab0743f072c5822971d5b80193d55efa1f902ad02e2b3bd0e96fb4b40aab0f47bd63f17355c02def861e7653fc5fc0895683b5516bc4caf0649d37b8fdcffa21a02eb340365d65913c96b4ec792552c1932d5cf5ffa3de36ac229b177e5d1b82c5352a84d675d9ffd3822497b6cf6cc54b2ed1a2601f0e4078f3c88cf83e682037eeca8863718f90366cfd8cb58ceaff0609b5b9f05c0990f4a0cd540be672bae6abee914202cb33c03c6b25b5087ac7878eecca4a90cbe93e2da120bd74cd0dad2549b8c601e70d3714386cbe916cc512950d05b9b923dd28e062047e9bd0bc42a9ca791cff00141c9911620851e11facbfb9ffec4b8c32a5091b12134993dcba55494f27db8dd8dfc0ee6e1bd5bb8e957ac11f0a7670086f2401f1b3b8e5ec25ff4b0b1c1bc17d372ddbc7fe03c8c94dbdaa48b0526aefb4668608e23050c97e4cf6772c32549e607abc071d914a88c97f5a538da2b91061eb386cf807732c2345473b8631614f849c79c9e9e14b05c8824af8000f7a60e247d72ff3e3fce46515c2f74bb1e765c37a4e7f03181547f6af6a6d0f96505d4629d4bb8df7713c3610accf3198a700bc3af151c9b6beaec00", "5252520053", 0, 1547416838, 0, "a38b854668c61d9057d942350a21099f88050b4ab3a5e2f6fbd975938ce9bfe7"], + ["030000807082c40302775d1c5b3d560ee9b45af3847059357e6b14bf42ad04c860642ea59c81f31ea903000000016a6c7056b9229730857636ec659a8ce40c45d79a62ba2a10d670a8195791a038aebfb6648100000000075363516a0053ac537b6874027e36d40200000000095200525153535151009dd4fd03000000000353000000000000a8bb61e9010000000000000000b869e10100000000e60e90577ce8bc27120b08cabd62a28e1a1333d4834b4e00d938403ffb5e8208a9fc19b012a5c64751ad429e5cda16a665d525caf58d284aedf96cca2c04e54c651b9e1a8170ad47d62c8ead30fe0dffeca13b08923ed126f85d6fde352f9b1e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083bee019c7d1bc0848641aaffd3736ac64bd94d1de2e9de7688af5efa58d02b40b7196e531ae97f8dcc8edab81ba653c4409cf979599f982049ffdf24f42159c7f6596d5656327fd89d3a177ef5f414cbc26b37c3d11a65613f7bbabdd047f1f30b9d96329699e398a5292ad9a4e1a7bc1af22c48dd9139348a8086f91818abf021263784d6d7e379837febc37a42048435872c32974e3e6e3a66adbac68a8e9390211e8c8ba7b4870b091148b841fb941158978ad55c8f896d0e29efaa68bc6965e0b02bd07cdfcedae810766cb2a20f75f1b0ab9e29325a96ad2b41bc7330dbd42816e75aa9fdb634b3eb04228997a1fea9702ca0d7dd1349f62ba4cbd4f4ccf1924030eb21b139a493739e14d1185a00e2c1bb4872a533ec52ea006a96d5b499e36da022c7c0041f7997d5cfbd0df383b46e768aa5b077279d5358dd647554c317c6fe70219225446a6979f3fb3f569de22f0e11ce9cbb9a4620156faa49d6e7ab0f04bd8031a150145edc6718a0d6943e4057d3767a9d4379054736ee0ea0d8981f2589b4603212ca719e98977847414b0cc3e52ea48b89afb7c3ede3bc11edd67a93a4478242f39dff1a4de513a13e79bf489afad716de0fbc58af99f1e95c8cec321ffc5251fd0c653d56f3249125ef33d50044c9073ac5bfaa0b5db9e1aff002d24768009aa10d11001eb62b28feda6bbd0494719925d05803f79ee02362045650755929147f1d21f93eafaba43506e24b633e48b47b904b4b3f68f2b0d63ef418d91909d906d823e6806795b0490299d5ceb8273744e51b175fb8a653c6452ef15d2bcfa1558852cb01ae7fdbbede231c52c7f675f3a187ec353bb4498608a61e3568dda9bf159b2a6b3ac74b40b0e7a4dcc8e60bd107fc026b37342b26a7eb4147350691643b228b01d5c170f8db3663949eacd6fd7ee7489e6383f2938fdb6d05378c814578a9e9c171f37f95956f63f9e4f7186eda0b0a55d4658250e93c90b18334200c101a2b7ed84cd87da150f8844f1a6eb55143f16313a2d4d84e5d1ce16d8c879dfcd5abd8c866dbaedfaae7d8067e812d75b54f84824352d0a8cf82044f1a71e83fb115286649ca4532b1ccd159e61b874a8849aaa78be3df2f01412030f741584ebae15ec20007539ac3d2e4d169a5aeb1c1cf8a06f4d5c0df984946832a32779c08a629f83af9f21494cba88ba73f36e1765b7df648bd2e87e2a37d4e3fd3f8ccd4f5caaf1c3f124a69f0f3b7e0327e37b64434a4dd0ad71b92dfd398d0660f1780d894b8890c7c687442d5b180ee8ba29ea505999862ab9d732a1b455ac76f89e1f1807e81e710fce6f8ca62380faf1be18e13ac460ed50dc84124563c2e658edb8bd99f3e574284afc14892d50be8074d8ee3df5158b4dd18161cd2eaae7db4d77f7ec344914b0b9880b5ced44bb5df14a40edbc7c18b95b690470d245e9c22a0709b90effeb693bc9dad83828c3481e8713dfc35b8923554494a4823782e8540e984aab63bfb4eddd9019dfeedfab322d5ab617bc405c8f2e39cfa02e59ae9cd333bb9b9228a0bd2da4cfec6f4a8b4a6c188febd6f6dc01578a5379f5300267ad2260e8efce7c53af31bb210784ef252e09d6cc75e9db356724d6d125e8f588e727128da5ece1f4186601f9e7d2625cb52fc53ea946274251583d51acff70d11ca8dc63fea015ee4283a1e4a5d96c96aa7cff8e0cb1b7884468c542ca065dd7f62de520aab68eba09e8325bc82962237a35686ff8b25552173aa2f9afa5535071c15523f1ad18bd5a61b66a4edbf3859c12bad375824acc840f876e5b193a0da0331ff6f341c4fe41b76534a1568955f9f3561009f79bbfa62cc4c246a867d5fcd0db59592f321fbcf7e5beabf0c8cbe259b2dab5f1973a6485ac710ecbe17cd31e266d3718c7497c48e247b5cdc17506fca51c061080144ece1948bcac6ade7f227c1cbd953a2ad5bbc83521863fc5ddc0fa7ba20b63db6d0145f3b0aca6b6d967807548cd1931bc3de7532eb8dc524130410c2da78ee827122536669f80294c468b2991f31b942d279d7235fd766568964c353e4baf8b31a1b298b77dc22363fd8cfc55b462f1952db6b8ab01a8bb31e75160f226683f798e8f556c8786920d559d9436027a146ca48f3d669d545bcebc0528ad8bbdb467554d0d560cf37f58fd90e7565dfb99dcff735f25370e3b7392de2d2b7002dc2fba2af3663befe823ca16676935e6bb4b8f03d30be8a60efdff903fb941158bf551c65111317da6689b78d6a600fbe96b78e9321bf87a0c968f1640a4824b772303051d6dd5afd596848ccaa7525a302a0f2e464e63805d6548c56a07051b0bf4eea6ab0e1d6787527a01b7c9187057e32b6d436193cdac3810dabbc3df89c43bb3b27a26776e21231ee5fd2c1e1447f0c22fddafff0c", "", 1, -1439560012, 1537743641, "84c986dd512183a8f7924d6ba4aeb4c9ea714f5801a9cfbfcb4b566f06fb7bbb"], + ["322184180230e968d0c5c27033bdb870c514f80b2139cd1d880b5fdc78f4cb31feebf835660300000007000052000053acffffffff563166be9fe55de8e245aa70c28f354e400f1e4b3703998c7c651c92ac1212b7010000000853ac516a005263ac7b4d9dc602c44324000000000003655352822403020000000002ac65cc20531703d79cc301000000000000000000000000f35ef86b1846b3526c54e5920b60811383086a08d4ac1df30559113fcfb1318f5069c4641a67ad144ce5942cb8f5ecd2d2d0666eb675ac4fbf55fadf0ff9c8722915ba5fd42dfe0ab03fe6bbd81481b640d4199ace7bc7625003fd38f8950447000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008e59cd2f521a46cbef0e4f492755338db85b86b2934f54c3ebd09712292b54bc35ace246cf4c57dcdef1c3475c08dc12f502657412adc15a1d8efbd84668b88e299234a414d5d82aa2be6bc70cb5783a9988a061bf82256cc08f1a937601620e902c948452c8b64d09d18c295b1a351e9bcafa6f0cc42c6f6f0e38077a6870820226ced571d49b0ed831ea3f6ab72b0cda74932255ab759053ec4a070be68562e8032d063cafbde24ba2cabfd82c9d6eb80e16c0aecf24cbaa2c9c0ff53ff766743f0a06d9a5a151fb881f932430f809144092bc64b5a470aa6c68bdb59cfcdf4868c9cbe474231ec18128d15c3d9cc34d5f8652af79e83f0e93d440991f659c238046030da69dc9b99df2e4c1ff7041caf624ca7566af6ef3f6633e24bfeb86faabb7b803281103911a1abd0a987a9961bc7c7f8fa081549480dad5f3fbdb897d29326b8a031f15b5cc0cdedcad0cf42bdaeeb6e174f38059e14561c5b417a502af40c4ba97031181d168d76ba241f4d1f36db6742461f6fcb02ed2e4a908bd8b06b3ebbf71a5030f94cab677b02c3f710998807961b26a0fc37a3c9e5d453cceea7a935fa8f16c150725983af09064a5ee12c483ea91703ee4534347b5513d63ad41b85c93c829f706746274761ff1d938ca6dff4ca5adc07f5da6f8ceb6da08ec0cf38ca9f0ba49643747a19d6e902062e68d089a0b7a440a9fcb197aac7571201eef824f58d9097cb5501f21db88231fd4aadda6f3571548063e9ed30ecb1b0e1478cbc4bd51ae2ab01ff6a90acf2ff9838b153dc5793c0409808a0ebf32a789a39acea5baef80f82f2c97ad22b1ed0153787be0221885f38678df06a2a95d0cd014189e49aeb71867b9da394714adcf542e8cfadb6e60966450c97741888f7c73cc08defc1fa8ea68d85a9f696976bcec6da3edb5fe741fd95a6cea69c212b32d1120df06beef05f1551b1b2677033e9bf8662abc76a6fc1b9c17202107c94e48ed4729ff105e66a2d5115281b596c53dc6dd65591bd9eba6be9638249afe2cfe9ecbee619788c57c35487630c3efe01d32f86aecac6e0f180312db89f4875172dfbc9741635cefaaef5e574ee21905cd1ba474d032ad35a6fb21b7c2585ae6a0f08d5c8ecd0009b7de2029fa508acfe974e249dcdc74a4d6d035fac5fa30175033204eba2672bcbb55e22e23563a9ec238799987add3bcd182bc444ae707139f4023dc8819586bae4c13fa09b6739705122bea7e5bba61210694f3b735cb972a1ea32d1efc80474e3fbd10c1e2d15d1a58324eb828b9974ccf4d7257822a8512f31623392fd31d1bc2099a72bf30b887794d9dfcbaca7f5a6b4dd881976db00b4fdca162af089f34226a7267b9acac01adae06b60b9fb60a00994717b6e0e23380cfa520417dd130072662cd5d1ed7613bcfc5939b9d57f79857310f3ab5466662975c9644f51e82177ffbff3c02c91bfa7bfedd9b0f38f155f385c5c64f506431acfd4ededb39a3446a46b310e2e764a39708dbdec2af36ec59dd9c77c642cbbda7a66d30a101059dfb9c2c0ffdd26d9b63adb621b629d66599811d6bf09f7ef669db69fa690cc87d79ce42c31549aa009843a09fd34dda8245b2d3ac3178e656789cb8c7ce9c1f730a4cd9aae643524e5884291d27464b69672dc385cf0f303ee603d2b65c6cdb3aacf5d18c130918671f5dd73fabc30cf314c5e8873bd608c03736c4dc44cee85f67f8e3540993bdc21d763f50e39977b9eb1c13daec6f3a5cbfb6c2b911360820819562157eda4440685095ad4c7576d763a41a2498954d42d239267f63cc50003d4109c2f5df9c5f227c4306e420a8996712cc917e788faef8b3056852b64f545f45ce248b62c09f605e9ccd1e84a3b3ffad8d4e0297b0064731323391d73c87de75efde69554014c4082bac1e3a217e22be5431866fc642c7fadf067dd83547a5d81d7e67c93889b6670d6aafdf7c7f17c705c48759583238446a11b61280fe5c16568acdb3446955cf0d9d58215d931c9f7f37569ce332b63cb635e759cd8bb44184859175cc1556d46c6210bf67c4d855284444a032ad4bddedf50007f41002aa5c58752d3f3c4ccda5747989d9c0a22838f5942ead8d57960b9bef20744926d13621b9599bd0062bf011c2da9be1fe3088952582abd634cf90fc6080b1e7a78295d01f20921009744948ed8364d4ea461545f1da1ca2ab4d10d1131275ede985d84feafb539639287fd571f32a01411ec03c8db1b38bdbd2480b20885b78c66df8c467646a17e1622318bdd900000000000000004f85270100000000b041d8e9f67ec8239df202385de8f605964382cb1f8b8fdd106afdbf8a7b7dd0c6106cb742c3d592e95dd84a8aa6b586cc1e8880ab3609ebd705b01a2ab007e41e6229ccbefc59bdf0945602ba0812f2ed362bc46919b871303c9e60a6f5314f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004f24fc75bc56766d7994a900b0b1ec45c14c98f979c15c452eb776efc019acfebd00fe2cdbc1f73c1c6d99cc2203907b5f3a17b923db68b1889da5ae96c033311f4c456ebfd5d4611e3c463f2124f46e16e4b84ef859a312f860dfdab6233bc2abf97ea0a1604ee910eeaf6eb36ec4967740f49d28de1029a5f16a3883df5049032d30e4bc7d222e5c22cbc7ceb6deb0e24de062233026f5bd433f581c1a3a2002021d5ef506dfc7a5c9a96b14ba3d21940b42a0a460db2bfeacc9e598c38b8995b90a05965db1d45fac6415506ef37dd999543f82cd4f0977fdab04c6c10c70e70cf17445c9f78b89d181700fd996eb4639ef606ce7960b3beb12cc71e31b980875ae02136f79eb5e6040b4c59a1f4fae42e12235df2d532aaa37487182ce4ea2ac7dec03151068588951695a36267165bb45f47f9e9725cc687b60a1cfbd2fba726da4890229ac5380eeaecd483de2f8e247b5702edb1f06fa4b9c1dde1b6f93c22c7c97030317b0f2ff220a172999c26130c1b077d2cf0ca1f6b4e8d0cc58e5272200cc9038032dc649cfb5149cb9c5c2969d97a7b5e3f560489db211dc676131628757291e699c89643b5ab3e98f0fadf1e4095794252bb454fc83e485c32fc6de2fbf9fe0fc2bb58889ba0b9d3235aa900f81de251699984c1b882468627534bd78a2f9f0175520e6f922445979e57b4d51316e5aeb3d682932bbc845ab8224ca872fd63f64087486b713d93c020070b755e50153e3ec30f5c9663d0f4c967352fa093a68454e479bd3ecbfb2b9eb5f2c540b4b541a2e459b22b70a2966b4bb43604d12eada51cde364823697e18a9e82af9e35bf443f5ca48d7edb28aab7a45168eea670158899c98ab1009f21e7cde37f90fb0d30d38fb4110125e04d23246a665658f1f00a19e347dbdf3f3b5de33212bd68252f631610865dff717b392771b55c224fa00c40d427a84f29f95bf7db6803d35b77efcf93278d125afeea7dcb076ec3bd5a88b115745210eff317c339d033967f1ec6afac501100be059793316dc40e0a08d1edf8765df14fd217af48905add20ba20fd038e4f1242a9679f7605a59a4896e283687d7358af218973085e061a847b226026c04a5575e41f8673052b78f1bc383a875e0ac6c7b47fe56f625039dd2e8ebed071740971916f254d5d49c90fbec1e324aa80ee16cd8abe03abb7e19f853eef31e618722490709a43c82c936fa2dd93cb4b42d821c16f4ceccd8528b73aacb0b3281cb66c1d6347f93f871a7d6e5c427a2a40c08b300f8e57718baa0d38a319e67016d860003808a78a392acae5496bf9e7af9f0552612c5cb402d914246df2a4b13031d271d60804f61a0b7e4c706fa50c0e25e715269b1c241a855a1821034bc1c9916f0b674a3a234e72e1ef8f2505215a66ef7ed0b899c569342dc13255459f537cbd8b2a711c52c9a3b2d5c149d3f1a1c93bedae3655b448e266ad094df9ac8b465d08b36dda0cd21148b14703790653ff086100534637ebdf4539848048ae5b10324780dc8d87c5825cac3d69fb1c068c8563f129424884fe7aa9e2e0bcb3fc6a0e14345e6f311585f9e028cfcc7c5d1da5e366b28a2d686e60fc57ad8198e1981500d9b5302527e7f5ee5218a09dc0357f8f9045fcadbf01d71e0b1703f5f4342ed85bf3c565f9b8169f727962d96d6c898acefe0e5aa4ecdc4d05e94a820af17fc5a5243e307ed38322fea3107c4f104f6d0248068e2d9451498c43c402ec226473fdcd728296f8e67eb8251188314b767ccb67c3becf48b4fe17da5e0366d45a86f37834dfedb540bd759ae4b2f965088238213c534b617aec1f35111e2ec370d51846646129314fa5bc7524a0fb54254f65770ee63c07b98c06610c9c7165e916f4feb38f76e2987938d787159453f6ccc5ef272ce2c3ab0f1977b2999eee60424b245e3f9b4427eb2d5504acdc812b3f9f4f4c764550bbf82f730ae28d1147edcc939972c1bfb1e18fa32859c82b93d0fd25282737698a5d8cd3959065c7432c9acb202fabcdcb63c3e023d0c6f78dc8b81948cdf4a388c681486d195bb13b0ae450a17cfc8a91f484de669684ab60ffa9a128a80c8bec5a9a7dfc49878ec967cfc1c94f6ef5a332b90e6b30feca3525ae82fe0d3e7ba1b1f72422291ef729853afdef7dd86bc80586ce15bd4955bf1ec46628427471135205896161e68b0f06231d305900229320f5832a6feaa5d8c94477ca89b5e46f8d35ea9dbc5f027e1eb149e31adc52f86b2f14199916d60a29b46a5bf927b98d3bb0c223363202000000000000000000000000e3bcc9dd883360c4feccd66025c3a8fd23b5ccbf620216bfc31ffa0ed0deed84e3aa89c0b93810c81ef4b09347d22e6ff5f2f91ab2c1d56a7c23bea4f450b75833ae1cbf313f25e643fb7e44c1e03ee925b37b4d78f61c7fb16dfe2ae6ca60b500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a82958887eb12834190fb0c8255fe628a03f3f36e24c8ca362d2b3b4973a1be5eae0fb9d56b3b795bfc2b2889a9050e09c51435d97ad09fef9d03e218a3e11062184e60b98c8b754f4c00d2c935aa95fcc9735784d7659d83422a595339d4635d8f8c23ae6da194ab145c338c5b19e0ec27f60b02386d7e9286f16c31ed3be4702025e0f1c9ab7119bcd82a7f1c9ac4f5bd38f52d952c6cdff2fd9a800f4169ce1022969a4a29157db8ad1e20eea7099cdde71635c36d3d57fdf23927e3ea603d3d70b03d7d9c0fda2d71efd1ef5f8b0f240a2f96f8908a3a0a1d8263722f488b83a35f79e18261412857d09ba4002c3ce06c877a4344aab8667b495fa4afad9110c2402137748e2fdf0fd334dbf2263750da38929cf0270923e16cb81af8b25cd3b9633031915d7309f5522353a6ee9aab9ec73e20e21c925e1fe8f3d8c196c26c823f8cb0323d765c02280f5b27d7eee8dd205656eae6c73f4026cb165c0e0d2672e230b440303ba0336d8266e3e3ee07545ba07a0afd9d3bbee34a29d651845774fdd78e61303013ce13912f4629c44997ed5d43432995220522d5cc1b828f89f00652c4f26d93dcd8cc31b9b6a8b387fa69f56b9717dc7c3ac6c7664f5124215ea83646d3d61aca080a0426020d596a623e29e5ca57fccb0e89d347c1c8df3ffc2629332eaa751431ae2a8a08cdfcd029b7a8e0d106786c1718320b65fe118b7e498ec9641eb26422d13be6763c90ee9d71310ce10320d843421a7b001019c6af2a4b088d1c579edce799e25e3717c66fe4f6be5ebee49129ccc23b08aa6bafd3dde090b93ebcc9020edaa4917704be36dbb4fd91080eaf30107b14972d55404f488d9ca99bfc463266a4ae863fbb166281b1a4fe48a0e98dfd1b60672ebcde31db04c8f023796602feed19eb935f4f0bfdfc4a4252197a6451eb4ead33a6245f9ab4f3fd964a4cf0b1d755d56116d1c445ad795e6c80ccc2e97acfb748513a092cefc83e822be1bef2ca94a7390697d4bc47e09110a60c3c65e3365a75bb3b96f2160ce85fc82e6981d5ebe9a74ed0df58e5ba21c4312c358c6429e6db0c88fc2abbf907955fa1ca29dff5d8eba3f209173a96e718fe14cb026a5019dd7b3e4e58a3e6fff716a7d62bd779f6d7aaf274ae79d918cca09ebb9ddcd91a4adedd8393f6b606052c11dfb9f0759f4a20d6e62bf462619e4c4e86e06811fad31cb341e0bdb209f012e3f7fd13ee9ba216a011d2040ce0fe1c48b232ddc1f12edee33f31b7dbb20d3ef9ad98aa7fc5cf835833b259487878a83158fc509e8c2c3f189e7cd026daf1a3aef74d35ce384f4a11fec5f73c102c8f05fff28b371264029d8d1719fed81270599067a629ae28c65d6dc366fee821c2b2024c89ca3675b747dac4541ef4fdd8029dfc7708613ff57fe7d82b7b591eebfae32c9fdaaf160d78e6d0797e8717e47023b18824ed00f7e0048ff87889d6f977879f13564e609c35d83094b10066c5c832d96bf2d4c5c51eba571cbb76322c1c9b01fb04d6018b5812d2a22b908d85e5b5255ddd551586d2f4e4e6c6fd0d47ac7047bc55c70ad560cad5352c9de143c9afa61482537f7f2d00d4cabd9c8b9e82798e8e8e202e2fd9bde3faea78849727b85c51b9707ec74d75ce3b97d72ac46ea8e4d53797f89a0fb998d206a0c90a74014fcafe1d5c8f66ca8cf0bd003756b9888a2533c92e5e4de657e5d2fd300d72dce3d66904d2af898001a76333bddf83f7a26ce2279a1ebfec0e82f1c202502304c012cced77ae119828a8e0df6e7fac6853c8a52564a9fff6dc28970fde7fd7c0a61229031fdb788786edfcce2ee58e43a4e605981760f49e41c2ba67084cc666d97e48f44207f0b7c4c36dc866528f1dc8054d296754f9741fb190e8fcaf1ee72ba0b2ca23c390baeb7a73e5a9f3a1b46c6367f85926e20ecd074f0cbef2f4404ed016107981177f2e3759cd0c6538eb3293249bea4926b37be824de7bad2501a797b8e55139f876984361e448ac71ad8ad3a47346a873911e270bd624725d502fb46cc3f03be26eee35076c99c57d44cb18035031a136045bf73b8500e7d065ce87d38ce72bc6e7a691a7ae883b61350bf30539ebddbeab4dbf42ddbd72f6a1aa6c8282f443ae04320295d22fa1f2a6298529982b0b219b4fefa3ecc114e6ddb6a0af9ddae1d457467c2925fda7f9e6fe56af0b8f0c04ad4a4dc89e8790ddf9b0bcb494a66b07bd428073e2f52c6062f7430be64d388d47c2e83a2d95894bcd51a26a049c5c719c29cc23bc92d6e7e6a8b25411bddf6bef414b851c271bbcef75d68f5bb1367485d0fd393a9c9733e7da85b1edb5099ab567530159049d1a67f7306e2e26f0f48a759447a7673fda840bc84c6409c5eddeb987c6ec5378f781cf97f704078acde6b6c4fb0b76efb0d", "65ac", 1, 1352377622, 1537743641, "790c5b5e528e3cf8c53d03d13319b276b24c95a505658522c1cf515cb947313d"], + ["1a8dd4050218fa5f6bc5dcbce22e6e86ad688311633e0846fdb7d82b53995c36bf760b06010200000005656a63526aa17f9428bfb2cbc8caeb81a446e7842ef801a2d21ad2cef35d7b28d104bf5436fd40765b010000000165ffffffff02ed15e401000000000100f798f5030000000002526a2ccc513000", "656a656a535152", 0, -684260667, 1537743641, "aea686139c018e81adf89089f589da986bdf0c18c60ce140abf61088fc76a78c"], + ["f067753001e785b5e4d69a594a97fb6d0a3e12ea3e567c5e6bd06a70bf74c8b682d1dbb99e0000000001650c05d8a3012974a0050000000008520051ac5300535100000000020000000000000000e93bd70500000000c6b291dcb8e20d044a666e21b9bd6bfce53989c570715234416bae25c8a6aa243070e23db94c2f94530e939203488f12325bb37d5f02df4757d8a76f3e0410a6e3fff1d18a2e5cca9f44d91adb8feb421867637ddb4d1c17cb67fa1867b208ce000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008890813d53e9f61a644b164a82bd0c62ff071e6498342a7502a6cf0dec34ac0abe1f0f5f330753a1eae562a4c38daa79026a7c88b2e00b3a3c068130c76c58ed6084bbb5f8cbc25e66a625e105d5fc8489dc135d2b23e95d920698376a3f12c66fb248a1b798c66d32ce022a9a896e0ea6f87732b4210d0b33689a6d8abe7aa0031d88d0fd0e41fb5d7a8a38bd586c12677a24e7df41f99718d159475e295141db0301c2ee572a223a034df3503697d13e14ad8bdf989b8df7211df6d3cc2f2a23660b07cc26905435ef0494caddfe4c11eee86909aa80a67c65d1cdd0ae785dea8486725cbea2c9858f53901d0982431e02cb52307d053656d6b94968f0b04db845650229793d7fdee7390f6205e5617345345bdf289dc4b6d954d079d1f88e8702c88b031b0f58538d2f3c6118595cfcb6675e0f8731823a4d0e3478be863562ce052a8a03081ba216121549ffb94228ad7bfa8786b41cf0d33dd3d87174c96d24d6d1e4910217cddcd45c03806fe6f8ab0ac8d649ab8c056cf6155705d2226c407b564f620c032522a81daae7cefa4991252a5cba5bd905dcc11a7c4fbb663ddfa3cc3f0d1b3e426e4f5b36ea414ea8d99b287d8edd5e80486f6d6f231056a0cdf6496ec4491ed25f0f96116d5323f9086d2ae2212c36c008608943f8058915d4d83bdf2dd1450d2dce122436204eec9f28861b962865e65f9b546ffeb5f3e43127a6012cedb4d20cef9559509d2bc516b95442927ea2c24ddb323b35df8a872ccd356f87d91d6b10a2b7728a40186bafc7b418ec87c717b004d2c2c5fe789a3e0aa0d25295a28a0edd747f2aa38185acab621e4360e58e3cb781380a95b20523b417b2c0a5368b80482da9372ef5e18f12a22cfcc6395ad7477415557baf7de30ccfff156e93c3a88fb9b22b973faab26ff621c65822a0ae33e3a6923bbd2b140db492bbbfd33301756c3ffe393cc7b4118809030e0d03087fec6bc4228233bcf3d29c2f8b8c737025fce8f0bc731bf3e1f2bcda5c248e7eb9c647312ec45eff5122cbe1c90bc6e2bee9846236d1601ebc77d66182f1536b47dbb708dff7693f70123286077a0ab4955691040aaef1a6d4793912c84c85f686f97f88e5c125c35c043098de1617088b90e63016608c403cbcc1c87eba8029e497d9dc3c9f3f287bd01e858a0df828a1c820f393ad0d05ced1d6cec6e0cece688f4cdb8319b9d8fb7d9155b5c48cc856a1dd5b271be617cb3e4cff115847145062ac47bc47f82581f042a3564296b8669de71b528a75446f23f10346698758480bb01445008a37044a50f53ad482d77a39f5cd72eba4abc52a8cd65c48b01acde9c25c5a1449fca9eb540e1c942bb5d3f66e07cefe58a4ca03557ccef140e5a9b69d4692af638390ce784eede20b59788732acf26e81b374971d57136bbcd3c5ae5d705a0770181e9b1fa4af2ff05c9e4bc55871bb677b0260ee06777459b8b6924faf100a99415498d63aa71b771291565fc847b20beecf05bfa6a12ffcbd7bd108feae40e70d3fb77f5c616ed5c2913cdcc7ef13d71441f52da209b2bc9b3787ca14a2e109d6c811ec07a7d5af6e5c1d8bb8e850718388808df02497b9b17f8638511ca1ccfd0456cf6c0fa79c392cfa71602b3fc2b85e5edad79b996c8036d3b181a9fca2398898a6f150dabb21a1b998e23880db1b34d20e74d74be70e84644c678ce1167eb31fa2bf2b1398664a5f0e207e09c9d26decd4b26604342351f2d84eabd05b0d7afc2b73bb98a4aeaa6211d83f44340bc592d569747f061e2a80ec03c9bda06a1a300a6c968e6d81f2169de43c5382466d7091d3382397036ef11ce17c8db2f8eeb14a030d2b6e85b6b7571f6a6d3cd03db44ae60fd402ef7a9c439644cb741ab59d31f68f4cb9d838f5d0c410c851491477d0f1b908bff229cb6f8c992408f88db8b873c5f577b617f503ef2f198ef9251dad3d90c6705e5cbc833cd29b8ce84be929f370231f93e85f7a42c9635c4eecc7bc65f11c0eb2ff5b4a5aeddcfaf2eb90df365dca00636cf89567dc5ac00e2a7aab1bd5dab0f696aad5f84409d2ba0c2ea170010941753d7b7d538f4921748d7d83ec80b27a742ed9cdd637a77cb09a5cf9e5d6606a575d207cab8cdd200e0e0fd8a9635f5361d8b68790f8e6fde13009d2ea4ba42f4181e4633de438f6c7ffeacfa1f26960e799fbb4bfce82a58cd4f8223d8e0998bc802a44e74bd2cf6cec7d619e5526d2728aa534838c91ab477d7c59a3a022e09370a942749e60b9aec6498a11ac35029e00000000000000003901da0000000000a6dbfe8a11eb7afba35f1761df422e40d2d30d76f00c6b1432b8707c4bfdde077ffb35ad71c69622521158bb5a43f66ae38b01e1556a0784bcd99be6c6141633abd997b06ea2e3f77f1ad72010fa06d9c11aa30e256f0975c7fba43fcc8466ae000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e0b5648958813428038754b24373dd411eb3e25fce819119e3cf55cb1ad0e26a5defca8816217b8dafdfedfab85d85ec928e7268b8c98cf4daa052894e4debf66cb8b46c985443d675d6e4f6f13222cec8460a857a99926730ac60d6b4d397a7b748951aac97ab0b70c335118d5099ab14a62820e6b29d91ee55eb0f53c2963030222b09ab9f8ad23e75655bc909c88fd7063064b2a5fe6b8f298ace142bb6eb9030f18f5985220c57ff90b44726fba4b3968f7d3509bf74a785929e67ceb8bdfac0b00e8b5bc66aeff024b5b8db6bf8860e10c36b5d0f8975f45444bae5eb56db00d258ba5d76ee829213badcedb0c7411214e50530288f8b1295c9f1f0854a9ec51032a31e097a64b4f33ce55a519bb89574575a4ff9733aa95befbad46556eee4615032346e7ce5ad2f7ffd7cbcb1c559636839c0bcc2999a94642b33c8a4c7a925071031a690e7c96dd032b4055537cf66bd42c15788d82465bc82ce468578ad09ae6e1031950f9808d2941fbbd1381a70a6a320675cc332ab9e2a3183a73683b7e237c32031752cf76ff6dda4f3444af17aa03da3e69aa425e92ad0511b581cc5344d53a5c150f257fbe4f4def602ca9be3e3e2e942bd0c7157aed4cf99c44e6e26ea9ab2ce7b05bd39cdcb5fe8243f1e8148d2b3c92cec482bd45ba803baa0f5360745fb7e264ce43783340a5d5562fcd800de3d44905e13a506e5cd9a9268fc2098b88755f6083a19fa0ac998473f40e1ead3ddae8f5502e0eadfd6f7e335e48c75ff45c49a8b107b92aab4219dda328b77276182f4a7608b179d04c3063ea00883a7a97adfaf1d918240dbe1cb80fd2b8e52302fdc57477d07e6878bb33ddc408cf285f84c2544fd90bdddb7d4715e919f45889d0ede7b0c68eabb59b9cb00689d2ce5766727c2a35abc6df6079e04cd6a1725dd6ceedc274c08236dd761b2c64bef1b6acb163f84bc6e5fc617c989dfb5682b54f99bc7adcba733c791a2865e0a330193b43cb6937688abc86b59c1d9b66bb51cf0951d4600bbc7db4d6ec0eac2f463e780c66489bba2f094df65059cc13b474e7908f5b8ebea4fa295dd0dc4695eccfb6eec40a74c923440a5745a8ed16dc3f5f87239ffd913887da5b0ad786aa7a8957deb9a652f3d22c70b468eb2bb96e73171549a2533b33d9766a2fc2c10d0fd7fb3810c24a3b9e7d094889f9bdbd3caba9619b1346452892bf492b5837b1b80351195d2cd3a6e94794943d7a867fae2bbe9e0f2baf82312e8ec20c5877e9c1891fec299de458e1ce77d8c8acd3f9849547654e9ddb191bf85101dd39c5a84f5979975b5368ddf7e9bace8dfa6577adb219542dd0104e4a8fe0b96f2b56de9df2734b1c002e2c85b48d0a1e3e9c29910b016b3dd61704b885a8250b379df979ec9457a228dc08f7bde58b2c3a8304cfd5b7032dc1b83371766ad9e1e2f3f8c8d6d3d7926f42dea4d4e86e26be566426fc2616976e1ea690d9d470f682fd2ddbb8f9891646f008219bc83896902965c1620aeecd79f5805875c147b2735deb505ed8ded71603af8ebd108d1278d0f4ef63c6de3fc5923bfa3fed3d68f7bc3a414eceb3c145d15b5239361a0c3a9a6f2a98f58c0f48ce7f71c4c20ebfd2b41c22c23a150a35c91e4099070fec441c308f37a608621dccec4e8f8b4e04c3acf4092ed2e9398859b1eae0649114de2f6f6bc54916fd7d96a036a6abc37fcdf9e94d173ba6707f04c71ede5d892ac4e925848b994904231f7842358b9f0ca24c78190a9539ae7007658052019edd76b22d40bb470c6d406fc4c1602f929295576bbc4fe91b970f5e3c1304116f1623d6951ca6d5b20a9ca48bafdbf81a081ee9b3f3f224ecdec7595c530c55af1357450cffbaeb42dfe7fd103b95491edbefeeff09e4cebe8323dddabb56b4ca10ea829657b50a981b9acdd7af53cabb43231afbbe6d4e29c9a78f8c73ad43463e6ad71b7bc8d9fc7bc8c46e45ea2f08d70de3f497de0a19df5805c055c33049bffa9f808e6f8102cb39b85c979d90f5200cd58e39268cd16cc7aa7edbe94459bf389759da12565547cb3acfe75e01e8d8c4f95039955e4809609ea4efcbebc0c7eb9acca6d4e0ab668e9fb6084bd87b8011bee793c883dece25050e174da6cf0b791dee147c0ebe7e344238ea00a860330ab680e5edeeb48a3a86ea6e741b60a473b0f5def79186a36e936dcd9d764ba8c69ab7e983c05c4f73b34f04e797a83e8715cdfe10924d25b1c34e03edfa5c708cc88a5596d77984d5dacdb2e485888311e5fe3e617e1a579d499a6b349b2b80434cca32669343cb241808c95ee4254aa36dd6a9a4e235902e99203387be6dc08cf3441cb3cbc9493502c9cf8dc4a3bedc13bf249eb4b07d43fcf06f4f6c79479f0fdfbb22a388d49d7981db3eefe46adf3023ef416305", "6a6365ac", 0, -1488409917, 0, "92f0b98c330fc2f3a703695ad9c55fc63e84b2d3c9f79c2b30b0fae7e9f761d2"], + ["030000807082c403028f0db90d9fcb035f9c13ccb71404853d651ee3825cd7f9f83ac84d9589b008970100000000ffffffff8d1bed0074e5bc1cf6b7f1167236fdbe68b511b3ef6f6f8d76e10c336227a1a301000000086a5353650051006532bed09a04d4d315030000000004536563ac0d214303000000000753656a6a6351653ff40905000000000463acac00ef1ea402000000000451535100000000000000000002000000000000000061cbe100000000003ac7346c7a696ad487c42626e18889b07d266e5307efdfcd0ec431aea093efd2c38cb702ce743299b6634d998568615c299738bfd50cec5bd2a31df10da5887f293565f90c1507c7cbf8ae7a2844de1432a860d7a3d95c496bc1ff4ecff25e9b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cf4b47dc1d63c432b8dba76e69263f4bde294608a3a52b36715923b2b9955cdc07cc26d6b2c9cf706f77ade0d1783eb2cb1886915eade80f1a0acaaca5d9c5847de737322e547d5c73395f73da7892271cc1d0916f9898debdb6e6b8349e187e3bbe4f39d2cc66aec176a15a794326b60e71c0b9eef5e0353d410c9bd3e4e9b2030a6898a4d5641694437cd4ab18cb1604d45130bed0c2b03d2d8d56c47157df5b0305c2bab0d22b8b222dcd2bd67e471c5238daeaee8a3e2fe1fa967a15f21bd5b10a0834c8b7e439f033f32b87a95c0d6968a547ae586b3e5e3dd7a7985db179c7092634fcfc8d05e9b3f7916c260add294c37a842e5d878871169384e751432f25d02020aa17124eaa8fca88a2ac6a3215dc24c7ba196da3825a36e5cd90cdced2e6302178c24ca44496039e85dd2cb0a5c5b9acfe44d769254ccc632db3d1c55ebe19f020661d1df80bb0f4f7191eda986ea34fa73e9fd7f0286010c3f79a51ffd1b837b0204155cda6783b408878cb746a6a57ce82f9950e2762e8373b28ab53018f487a003087ef763700a601c1a663d1d037029c0f1777254031c4b73d27f88d524fda45a0e3732a24477a4421f6b750e01fc9f597eb3fc88f29d2cdc90aec1c9bd2d393e083faee31b3d2ecd0750f771aab7e8cd04fa2841dcc0dc0b470f233f3778ed43cb6ca9178c789c0963fac99050a6c32f4b66ed0036504745978ecf37045392f0576d51f1df0e7eba790245e40f316bb3fb79a3d0da7493b876a07aaf729b22a9528265c415fcd04d93a99f27a10ad532a15bb1fb01bad59f4a419e6ac5f0442ee0f865747633db92995e4ab9ebb7134e2b22827255b8c6b5a2364f569ee2c9f792d8a4b90c07d00559b4c93d3cd328460e3dd33b73f3de3e2245e3cb1fd3e1e000c4f71996120631d244ac19feedbf4bdf3fdc3a4547e18e29192a18586da4ee64fbe0bb06750942facbe32d9ad48fa6eb3473ec51e3c465fb2b88494a2cdf9c0b800e0600552c70e8ef1a475f316cdd2b4bcb929828cdf7c7616f34beaa1109b751029a34dcd5ac53b35052370062c57ecda8a524d325ea4ea109bfa23c826723f5d03e7ca0752add1796e9ee3ac34043abda2df158f217412615044aa1b18193aa531c6eb14c3a8f5b1a7c41da449b2b9e4c74fde5296777cc2b929eb2d0952c372dd34f0e67703a84c86b313138eac3294cc2b4b956561c696bcb4eaa4aff578226414bbba9c1f083f48b976b9b45383eeccbc25c53fc713cbd661047b14745e5a7035d46f356e2cae48f10b05532174af6f5e7f5812ded43d5ca56281da5c3ec9b8e2de55ef498c1daa0fa9d9c5b08adeb4c904b5e15c9528c8b01b0a8aa7c6cf38b9a3731ece3ee5ee14737a12de088c025e929a799b9dd303ea089112f01222f7fe09d0ade615f7418f185254ccbb92925fe7473d788e3b3336f0a57cd5dede0537807415bc67629ebed0968c7a7e94ac68e7a54d52ca7f9c468823d3022f20bfbfe92faf027acab1b8b94e1e8955582cc02ebc2bf7db81f10ab3e3027c426421f2239eb603bfcb31fc3b01456c54b84f29d771128060a4df763aaedf2221255f452258cd7e3af0b8d8c128dab8dcac8443949f02e12fd395d03ae8579026e0a2735f44a301fe9ca600af410355b27db4aa1b1bb4a5ed06ebb41ea8a6dc0c201dffaf5fa7c1b0d07ef336b37f2c429fd5349cd7a7df33c7b9aedfbe5bc572a5b3e8324a02743bfcd9e185630544124baec999cb06165da323a68f9f2d36e19015eac050a30f97a6f303687a1847bc49f83420bd8264f12c9213921c24ddfdda101e3ee99c75309f6664fb81bec45205b7edcf3877e3d20d6c9c3ebdaf1c96d81d282a1674865717c4e8284d6e28307760dea4203c7cc0d1e4c8164221146d0efda63b59933718b229cac8e832aef082f2eb66606fe8fefcf934fa32d0b3cd3df3d3bd245e887429aa6f007deb1614fcd18b4ed11bb634a0e6eb879643bdaba3117b819dfd11b0d05f3bc11d12b2009b38b500612c358d985fc39d10eaf17b4244a53f051ebbd09bb019051a09851c11bb7a21f9be5d9cff9fb4b1ecd0109532623d357d1ded2d3a270b472641abaf7893d7cd022680d7bfa913db2f959084cd436ad086b4c4e7871e45af4f174504ba0b9e70f6f8006a1c253e581e061aba223af369516ad64721e81e76461def49ed7886a256970616f3d9df56c5d7bcb75023cdb4d1062bdcd0d9c6e1d2ac2f9331ea8e7c4ea3f0cb4c73ffadf9647a974be56d812adf9c0adf86e7a9670de438424915a030000000000000000000000002ff6a50564924da917b29cb696effa00644b10961a0e02a8913b836087c7ee284fec7e378b3d71240d7f0c00fe7f3e64efe5ee297645352f5d0abed31d028d5f76339f4463a9f4d73b0d9b98b0e66603ac1175ee6e6a875e4865732789dd9a6b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000634bf52a5716ca38e711faa4c07f974d2616624812f16efe8db906ae0066764c116a568668e019657a10e7d5f4e94dd4bfbd6c272dbf5206530da74da873989cc265fc1a1eac02d1deecb35bad50cfec92ab303efd7f9b93b54d6dd3afc4c2c08cad0fa8a3720e6908a1c2789fcd16e47892960090cb2c5d7a5a77c6c5f4c210321c66e3c7758dce464957de305109d843152ddd085fa98baf2403aa83c82d0fb03281ebb91d5e17887f05b74683e5c9a04325000c320447ebc2a6ed70fae9888590a04b0251b11c6eb72e1e877ce1dc1d44abf0a2ab891bbd775a9bb259de322ae9af4e210746171ef8f6a26961bcea4289592646c300580ac1acae9500d26db03e8032c81472fb7be00e95701a3e524d79a2167b9d5821bfb15dc96246f00ff4e42d80315b9df22eb99d3b91e46e679609d35807489504cb354f866b6bb0cce1fc284c1020d6a9d9eaa0768eeeb7f753b1f84d54574416df337d6273a7395fe3c30f11c1d0319dea5182b608c67e625c983eee4dd48a1be018ec19104d10841d4e6764f739b022fdab6f42eb093897c0d77c5d3bf9efd56dfbc4f6d8e05dc7a9e34910b9f391948547a18d8774c877160af04d271fa637de7e49665c2a53f71d8f87ab809d25b49eddab2ea1298e706ead155cc10b898d7dcf017c8b647906664bd270abc9d0a6a536e3779c8b5f178c916e968e07378159bfc0c2e88f4295a4606fa3933f2a432b1d0761ed9dd872decc07d30bbf84365bdfbbdd8a7e0b19a8571696ef27ac65c9d6ca112ec10e0817a562c89238210e1ef6010c692d687792210bb0a11bdfe7d8f5ce20f8f83207799b653a8319b7efd797975a41c765cc1afbab0a03a2d8eb1ba7382b9a96e6041415bcac73984d4161279144910c8847c27726c508b4b4366740fd59742cc4e088afce87e33c1c39e52d12373923f5d24efa9a801536ec1012fcb78d360dfbaf63e4c33f382c07fdb03d036790d408e19bdb1ddb3976f91e1e1aa02c84267c2e39d64dd7571f946ca5c6590dbd16a2f339c7479db27d2139a8373387c5fdd995c2c6fb1c0877866e0bf70b0aded5f9c5edf5ef49ecd236f7c2dd988dd17869a566eed9bbf1b2695a1e9c9088bb41916c94cab38628febcf9bc2033af08c6eff48e7483f2f9428839f0a7790007be768199dfba046c34fecf6d775e3967b48b7492f4be57cd5db2025c3471ea7ee89ed9ef2b3ff141f562cf27f4fe3a299c53bad633b6e799a13ff74e94733bff48430bbaf7e0924a33fb79ed9109168d30bdf9d6cd6e7eea96c121dbb65f17d9773520e424c83ba15d11fa9a8db7cdfb0ed41cdafb89cd3685994ab965400ca6662d9f9b548664cc3a93f5fc689449aa8bbfa989a7f70e92986a6f2de37cdde7bf06b3388c365185b208b5883342dfafb0aebff8f433d54d03cf1467d8954c5f635844a988e2a30e1648afa3be18f80c5d759f6efa3ee09d83f4e0c62fd3fc531bbf5a47e658259deb799448e70b3eac3400621bc18d29908566a36ddb5983c468ec0cddc0f67ebf8ae38712c1c5912db57553ae7713e502d01086ce992e2253b0fc65795bf7b4a2cf9f6cfda7194a06cdc37e61b4bbc6147fd50affe87eb89b9258764d7101ca54632c0d52722f54a1030c02875a44f22c57c9a56dbb907d06cf4355ab47367a4f3b6f7792c904cb6910db3087305e244c1ad2377ab79c600ff2c254b00d46a82bb6c278412899e2abb428881ecd39f98d47851bce409df2f1c6cc148ac32e5f2f4ad416f6b09210a7778c18491bbfd5e2a48afb284d8b797914c23ab7d287f46fc12350cfa7151d3647de577e50dfb1d260895a11becb96947b16c0ff7e87a4126c1b985319a77796d0408a04baf9c57883f02714f2ba83db128f29f5c186387c5d0315cb61aec2096ef8d4004352444f0a552f4ac7d5be349480ef7d141106dedb90df01062f6807c22c422298c455df7b35eb7fb04e6e86522aee1c5e8604d1d29000859a41e7044d8ccbf7b9af6c693a03f0d539a3ff05b428729002baab0bffc85533a9af995b04b7be60a6e717e0fd717f46d5d20e06ea02339e9458f60d6e14e2d8f7f120c708fdf3232f18d0d8d8a454a75fb783066ef316d7b6d3605c12b51bc65137e36ee9ad121213acdb98161c2ba39094e5dafc859b2c92158f48ff19682da9a3b0332461e00b3c0ae632c43163be29236e388cfd01186d70e1475a3388b20a15e00398e669b42e69c83ae6671c88a180c8f8c8dfe196f6080226b9121e2bfbb4f40d5348fddd21cd31360cb8258ab5d9f8c6429af64f1b8f46f4637ac55de0e41c5c2043ff0748e3dc32ef42ef014cb9bf163bd7a08e1f30f1b24e8d99c761a0cf5826a6bb864257b013effe3a2d9cb24a24c0552ddb3365b2d39f437001a5c609a71b69929f9791ce9b9aafb700f", "52ac520000ac51", 1, 806868455, 0, "e22875729a316e4fb28c943ee87208a3481ee5efdc26435c86f8c54bbdfcdbed"], + ["030000807082c40302368879cf418f04a110b2e6442b36fef990f6d720d6300cf0c16f4a554799e0700000000000cc5eb367614417bbc11fbfb5b9ef84c2e5b0662f7798b04d89ea99e44eb60bbba58e415f0300000006ac630063526502f897d4033281ce010000000007516a5200ac6aac825dcf0200000000036553acd7712a02000000000453636a6591b96b4b0000000003c44225050000000000000000000000003eea18eb793b2d62d0e805c85dc965d6bffe01b6c6fd7fec8a077ca6674ee1bd0357a1d28f3b22eb161b216e641e86b04fb83d7476e00a939f7d6891bc2a4f3940095d8889b102b485e77bcb7d559fb6426d672de4d9095b1eed007ac837fbbb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000da5c9bd1543eab8467c640b84ad13c8931a0952a5596101ebad65742a981aa3a4cb1edb32cb400fbb9d349988c464f3ed636ae92254a8bab2ce5819839a661ea0984fe900e3b4b66704d9da7c533788240b01d1020a0e08980a4c7f402503b24a7882c86e22aecef28bc419d55b12c5f9406ed06ed3f5aa8d5cd63b4899f246d0322d7f412030aea24988279aee51d0821d27227dfec392ccc4a7d25feccda095f022e6d7e6c756c659eca336649c5d0a0bf73a01458a5767fc15075f0831bbe3f070b0807185d05e0729e22e29a32ae01d7e0fc88f8e7636e23c175fb4d113ef9519c97bd0250fbbea537e1ccc09230358c241ddec4dc679592a6d51b3c48aaafb8390226c21fa5a2dcd56f47d3454ce5b91a67040ac4c583d0575442d7003e3b8acd2f03192057eb8691d6132cb0873f2ebcf46128c0b0a47dc8cb51f402fdaa696a2e69020caf2bc400af366eadb32d4554ceab3e6400addf6eb2bf74dfde56b1fcdd46c20209010c38b756dd61e7c93bff30ce895dad3b00e2038a131c3ddb60dfaccee581022bb546403dea8469cb4517813549097efdd40d4f51ea6f20cd41fe267731fbc6d85e3d759161176af8c5db90874ce47e0a281f4f63cf3b6e1cf47beb1a1ecb5563c79977d54c1258d6634c6752aa64058b6960dde52e0e19f8c0b98a81e45dfdbe5cda50fa40fec2dbf3445195954baf5ae3a363c9aaf92180373de877ba999740bdeb6537cc073bde658c99ddc223b0e60a8fa34fc8848e53ca409ed341c5cde9235eee16a6ba55b872bf1901051181b2c1d569fc81e6fb8115a7c580f0d5115ae7f9bcd1a980cdbb910c8a37caacc57e8020ffa1d29b92f4c4529029922ccec4d81076ad67b4bcbc6cce1af7cb6d528b782717449eb1faa11edf7f82e64c8cc8a2e5f8c94e22f153dfeeca0e3ad98b892430673240f4a2a5977bd437d5613d4c2e8f81080adda13c6b4b288d962fd8fb3bc15d89aa60a27dfc4a4bc0ee557dfb1c731552804dda0fe8158b79dc2fdf3fa370d739921735741b0931bfb0518e89ec6bbd395e23a93eb1a5fb65087f179f87951d7dd3f543efbcd95f57f5dc9f23b0ceb63826de36077c333f35247c1df5c3ae9810f347e84505ff59118aa7194443f44525ef5363d2081e1e787f39427bb5cd8a8f20e0ebd87289cbb6ba242639219714b4f14bcd4749607aee94b68e8708584f90d08227d7e01c769015fbed389d95121ce145eefbc917774d934d28fa308f6c969a94e0cf4354113c65fe008a34dde61922f0d540dfea6c75f9581e73e199e45699b69337c0c26e09f530a9b0f47aeac588cd42773ef3546b73237da90f72dd333ba6b81cdec933a65e44c83289c52bdcf40da96ad3e1cac198d320521766032e2aa30bde417ac1f574e124cbc962a5a0613f500aa76f6ee0b1102f294b8d2c200e72ba2d0581376c339d2a2e7659af6b7a619394d4f84619a967ed631dc6c89d6a5b32693545dcc63faf9aa7665896d5ab855966263a9d16f62ed748b4623649acad68d19a63e9e0d94f27c34bcad3872f2daa65d64e4129c84fb4160a4b5eb39084b120bf7ec2cc3e2bade97460703fbcd7621393e8107ead1457a2cf9d525d0ce270d07fd9408133157641266452d9ed8884ce5057f6312c79321c4eee64d1cd3c193ddc262a25af4a021d4fa0dc0abfe2615057c3208c098b2358e544f5b33ac1080b9d372894cf18fed3e37664f581c397df2f72252d03dedf464d29a4bf07a2f9e3b8e4365b210eda61fccc1dd6eba31697c83f010e49adf130a3b401e31d60ce923353ae0b0dc0afd27f7b922f797b7df889bb2c6f4992e3aa4d475f6a13d2eada4ebda883d7d6f53d7a57699373b9acb678316c3ade0d0063955584c0cbf8b2db1ace82d9dd249b3803cbbc604ede2a6f7e8f6be4765865eda92b72d810e9834d78456d97ca2a827e7c3b5a9ff7449b55e3ab8c772e4b8be468c70d113e3658738ddf5bc995df8d190f1d3c906ec9f25b5edd165d563ecd80bf95ad7ffcd99c72916723ffbc369399ebbca7aabecfabf84e73c9603f2841554b7bbc3d690a1e64ba6f91375e82923fa7046bcdb108f05b3b89bd24de40e36fd8e8ac33abb4c30d8d9977ac26455db9353b5466543221275f421fc2a8e522bfa7d9851488e3440c9b15e4cffdc110731ce96b40d3a1ffd165ab51e33f932f1626acdd894fa416ce324c91b245c006cd0a152486c6f0f1019e9beffb23b760f6959644f0683cbc66d623305ee9c8836ac57e933df50685d1eb811d164ac4def54100000000000000003dc2d400000000002f1a55e74ca6474759efbd660caf6d4d7440dad80bb9199e4ddb2270f927d2e62fc67837452cd1fa1605f7cf647800468e13251dfc826192fda4b8c924242e4581619b3d710d59e3bfba312d38cafd5d6e72e9a223dd216a8fe6283614818ff5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005aaad6c2cdf0503911c3a76b909b31c9cd8f0a5992a5933fb8c5ea1111de8da784cb550c80ce42d55fee207f1e7576d6e16f7c4bde8f7a8d689724bb4e429dffd97917c1d0d7b81517435c342d578a758e786201cc97b7f63a1b81ac02964821fa17262920fccda5c3d27d82b3b833c71b7d84397c5685f0df0ed1a4c940b3d9021bb14224a5f6761190f329baa312ca447794e58e63460726f4efc16e8541c6140200d5e63949f0565e9bc545142bc7faff43bba48382ac418c2cd95d3cb03507990a00291be988762d9c81bfc5ca082e47406c553a403ef387d505f2bf0b95c1258927c58be902cc39d116c06ce263b5c0d6d7567a844619f3ec1155924ad877c5bc0300f2ce0254160d67c74bdab5b6bd105afdf6da80409f6b3b4f6ee3865ba6251e03257d8c504632c98ed2ab6a174ef0061265126091312dabe2049ce2c238c9a1520201ab1f8abf33158bfa77efa54341a084f0ab29e70bfec3e483e93e647d86ad15022c0486a9e60fd537addf747877162909a850444c3d9713e26e0ae02253adbf3303029385cf7d8b0b816abd621ea268a743ce0dc022804262adf472c4222f2510a3f21c96776d6cc7b2d6578bf946d06454de385b2ac1db017e93d1420f811ce956737395c63c98aac070483e8f75299e93a1a0e46c6dfee34369eceac0960745ce83f63be55ae3f96b9cc4e9e06f729c438a47f2abfe8b63d194ca55d8e02f8ea35171f375bb3c9b3daaff1fce2159455d33260fadd7f3226a540d2b80045ee3ca4c7e74f64153116e5dd6b36fb5e18fa3d613ce931741e3df917504c7295b085dc091fb6674955ac337a3d60eac33cf12e9be485e36a35816c3a2fd56bb96bd3998420ffd824a4a568018a090bf8db7e427a9a030659bdc06f5965720c354314d1adeef488f57d7d323defb7536998c8efa7640a925d4bd3d0404e14abe66aab97128c820f277c9d5a70d01fbfd57842ee482e5c193ca2a4d46e625d4ab968b07de69589ff97cf629a3cd97d9389470a71e03e4355815c1dd0380a7fc5c717e2e717fbb4f3ae18278724f2ce46f7fa23b3242f77506f2264b4b143582f7bcab5e0f93367a2426aa711e7f3e51f78d8626ac220c716c141323cab4ff473d0178045b2fd1fecdc556a142e00b5a3f294afd7441ea4364ba5bbbc93b86b3a0ae3b3d42466350a1f3ec2e98b61da2b7751610f497494620ec297016cb09203e51d6b04d3f0af0d5c617bc4cbce4abcb71eafe28938932c67bb57c62d7cf53c0f97f7898533d647ad8d3f55f3e7bb6af9912fcb2c5d9a36c0ac3a61583127470c1ecc7a62bbc4d82b0e5501510c58b759e71d16a1dcacbc4a3cb2c32208c14bb6ae65af68bf19d5cbeaf941712532170aec39f2f74985e466ff527b716cc75eb257dae9bdc6950a4aa8dead1e97556873ca7cf47c45619ac42d26792a740d7aafca83e4dfad1c57d5758b0eefe20f1ad5e4ef295cada1a696c39f9fd6eed10272521ac9acb1898df6eaffb80410eb9112b243337c7f6bc3862d23f9007b398b2636098f3c1e5799625c6475654eae63e92ce86dd6e9e20743d33d413e721129cf3994067f7211eb73a58014ba2c74b126c57ab879bfbb47aecd64cd7abb2bc59b879f679e6f9a4dc7dfc21f078eaf68f14b07e26360b3cfc767b0c97ca19f4e146431df6d4b71dd1f8f81bdf81cab414b63d7c88b7f87e1c9bfda4cad402b53860bb4309ed4992fb5627d00ae891fa3aeaac4ddba0ec72643dc3af6ba371a1b73c5bae92f850db0470415eab8ec47cb8611f082170603ca3338ad28f0572e7a171ee21845a4c70378635b487f227a48035f7120d79b020b3ee5163ba3d1f724225f8dacf6cb6062bbf2ac9173b5cabdbd9694a2f0ecab8e09c2d3ea8513b1f482c609aee617ca45ac1d45abaeace3b4f1a44b4e80590b278a11d7dca35cde53adfca33ac601b1a5b9b07b6d9c834d896f83092ba21aa2f71194e83adf70d759a3f22b6b3df62ef1d642f759e2647d0056b3e8380c91c7adf26ad68c52bc6265a1b8d4f0357b2067d81def678f46e35e4fb1a13960d5ae597b35fde26c7cb0633c37c0c672fda01b33f5738599372456b62cca8bcca38b4d63a9c3a40ffa57f522f5d0d0615e37cf28e2d6d9526563e85e66dd32d65266f5ecd5e7b3be5e389e23e326b6bb25f38f4f7c0f7d3b79d3d874490cbb975c1550208ba55812deb2288d2ec236a57751901621ea29933f8a41f94090aa4ef33718ffd031c7c7a074f468d947bd5f5beb1b899cc6e7085c9414d56818964b40000000000000000d94c6d0500000000f902bda5b63225833e5626cca7c66f4d84f25c2b194410df472b4efea776adec729494102a1fb826f5e5f683e359b97c900aee8548b9baa663cb1a45eb4918c1499262199f42ba5c45c2298e10058a6088ec32835bb5f8ea12c18ececa224edd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e986f6ff7dd6e61493a0c9947b21c45432e344a9e61484dfa43b040fdf6442d3c562836d83b417c161940ac9555095426f3e08c794f653b5625adde6f156b145cd71f1a8944dd58232adeb2977dca69780c2cc5dc40671d48c7ff97d6d278c936cbb49aaa65c9d597871e76384314c2ca29d79c39fab5a7670f1982a62bf0190313cf3bf47d0be2a3d10258bc63cc7b77e668cf157041c2664b3a3818d928af10020d29536a7283c1f4e9da3eb3b7f24791c984d49ce1ff43864b493d93afaf03150b0862fa1a0a43375b36f52f4e1ff47e438c8932dede0da6fc9faa31edb428cb3d2b6b80eda189654eb64f960d7f5ae2543904dee4645564c21bc241ff97db28d8021e52351a9e46518343f4b239ed176ad2019e42d22ac8ebd436298f32e797b9aa0212382d044b4e3d87c72fcd324d0e32972c4250700b4ed01c19d125c03285d8da0212f62df597c253d2a049989bdf0e94b1ac673f04964c76ee72f678eb5e5f63a103118d8f9b88caf8fc4a7ab34aa6d7c1afb503d6a3a30705f2e319cf281cc03911031016c70aa1ad435996be5f383d9dce79332b4121c71a446064991fa2f7da527abfb55b65abf1e1d2bf9d4e96db91fab713397169b28b27a484050607c71c0b450ce250830925091595d511a912356430e9d5cef4c3b46271959cf434885ef0a52f200dd69a3401fd3937d70b30ed06b98986a3c819da57187cb47206427bd5ff65cbd3b03a2771409ec52750994149d6a7bb22d2a39f5e3c2541649f04d707f05aa4d22cbe229dc0f5dd601161f6a2801e2190cf505c2c9a0ec14b5196cfd75115b11c5359eb59bdc807abe0af18aa62f65513bf204f41120ca05cf46668c01ad9278cc8136fd8b7a6c8c22b826699099a449c41493b38da7a0426af6622e7343355e627da0bd476c5d0bc8aa2ee923e77cd534df6369ad560b796f2aff08d9ed4f8a9d145f0b94e88b85bf252f14ad3d41a91c0d124b614e2c306c4b84aa5c2761c88d166480944d9f5cbb95c8aca1fc75f0cfadb1daebf4a4522b333acbe0f5320582ccdaba84aceb26c4bbfb41056f40b1725a874861dfc2fa6eb0958806750d954ba7acf01e1995b6e85ace711c25ebae04b0438c783a39b48cae8cb63494f0188f44c305b23c9d9a3ce9bb7bc8a500cdd26d4bfe0506e5e43c890e4d849a359bf1beff8148153ab0f7d8579d03f01b09bde998353047f241643dff0991359b594b1a8adb100429d816baef4433b3af78c77e73f0e1e61a17f13f3d75e7614378f805b8fb755b196a6d46c77fed7cbb18a4e427bdc2e6d212e841048a39adc7fddae56576ffd5a61e850906e568504f261821e9f6f597fce339ef6af8eee95ccde9fa913652d72619bbd955f66aede88c159a86d48693fb4d6cc1bb4616c7faa5e48e7360fa199f92a323dd0fdd8f5baa818d17a91153d17e7ed0e3028440cc8b46c1697e66779187002e3609c01b5e9f35176204c8ff3ab10fb8a1ff8cd7d7981172e24cc2b125ca5a32c926340edc0dffc146a8af26e0adea1cc50995f64a8c8cdebfd0054a06828c3bef8037ded974b59779ac953f04973708f566585b1634c1749191d6ab02e940cc75bb541d6447431cabb20b469f5ff947677a156509bb0619413d99a287ab014e30f41a434b02483398f6e21e49ec39e2d4d3b363f36585c6919f66319c45d9545ad436206375a1e271c2cefdb914aa662f77b824023f2938a591dcb0c16ca31c8a907241ffb04380bbdfc386bbcbc4b2f3ed77ddbeb2e4277a95780f2f630b41b265b5e550ac10ad5d59b12ef2b1c17421fdc939306dbdf5972457c10c2ac3117d3a2001b9370ff8c469b77a8803b5ebdbc248289bfa46d53835607775a82d46aed2cacd814ca42f46ccf9da75205d1e6a36f527c63a1415b3696a677cec35adccb5a2d12606f5d1a33a3afa2706fd5e6664db65934c35f1cb62f3ed159641674fc6f25343187b2740775fafda368fa02993b158cfbc2adb8a1f14c153c51774924754de84c471731242105f50cb71fc92111e5ab4c678a30d62729a79ab3002f47c6f027b2503ab1c1c2061f8a7fa0611f606f2cb7ec05065b95a80a2211cd03b41f74e7642f2ad7deabab5ad7723c8fb0fdefdb777cbdf6cd3cfd9106af75ef7c5157d9178351de8a73a64c8e161e6dc7417b79f3e2be0255e0ad5b1dfd0349915fe5a88e66f0a22c935e6f950492397086b8b7235d242fa3d9b65c7cf6fda3b38a0b910875f60c5d6855c56934e8d43ee202611ff0a80db4e634cf33be21e355dba483ec436b047388a47e8c25ab939e864dd8cada09dd5999752baca296d7d03b3fc77779ccf24c02bfad5c4ba109a8230c956a5e2c14decae9499b50c4a4693d54755df85306741b229f7c2641581dccbec957f2bcf43f4f7162dcb18af23ff373bd04", "ac", 0, -1461451764, 0, "35a6e26039e9831031d396fa0cd42ae1dfcba1efa15ea41b6e93a9ca2bd29c66"], + ["6a345b4801551b6a3b97f67d952f325b34ec675e0d90ed916f5a2386135a28d6a297979600020000000963ac5351636a0000529010ba450483f1d803000000000700ac6aac516353ecd8320200000000095252526a526a636565bf121e010000000008006a656551535152c72d2103000000000665ac5265636548903ebb00", "516563006a52", 0, -1232720034, 1537743641, "fcf97e3dda3235c8e6b51dc3c69fc0d65b2fa87845f4eb02504ebc0097ceda35"], + ["ea5f331802292071de582365ae628963460dda4062bd666a726341efbf27d6e730c3ccbdff02000000045152526affffffff758050af707b800fa0382273cc5746fa370d1f13bd3013164c27cd7737ca13e8020000000452516551ffffffff03b23dbe01000000000853530052ac635352962a1e050000000001001841530100000000055153ac6a5200000000010000000000000000435465050000000042be46e96c6d2a1b3d9083dc8542b9f3a12af4a79561327166e590f28d33578c17eaba232929517bde4bd2179b652749f2c19646f5f0490983c5f8b5c74fdbda1fe65a588e45b2d734e8b49c789b12e652f005672196f45d184339416c51c3970000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085558324707c65a9ab738bbd0c74babb7052d1eb6c7262f43ae60e3c71112e6b5e621b90e8722eef649a180e8008349de85928d836d8f6c435179088796199a582ae8cae96a6e0e77083c67f657819dbf374b3c79daab6cd45b21a915bede4acfb55e96d32cef7c01d1082524da93ce0c2c27d788a6271b55f420311f4064754031d8197f3f4382cc55902b0be201324ba462b944cd71da99ff207d66df89e90770213d8718c8cad5694dde828c1c67cce317bd68cc6922cbb9a5f4c351dff747d880a06d31f9088c06592851f8130d97359d32ecd48fd6532b493d295c2a62c7eb69e141d9d2c7640bc23e37dfe21ea2705ba3de8d7cdac8880af7e1f8264b59f6df9030c4fd56923e767b540eb95f8097cbd1d6c26f7ef3555696cd3ac9636c56a62a30223e1fa96a0d0f30726fb031bba2d1a22b6a1e51a52cec2463c4919c04315e2670215139bba33b2129fb717e466bd468278b9f976f7362ebef1fa53ca14625b26530218499b921c8ad4e62d07e1e92b4f155c86ff9bb1d4ff34225861f8f711bdd3bd030be62bc320c932eafc21fca1b17a1b282acdc3d1d76ecc0b82c7a9ed5c0a94f0d6f0898be40c6a055d983e985b14185455c24a6c2ac30051acda7a3f8528e691e08fc249e84cdcc5e504f9c0d2da6a96d7e4df319998de3905631f466c1d6cf0671b5676f17fca01c806eb1595dad9f3c21b5d2f3d082cf7ec415e58237b0c468bd43f10e0668d3a94d03b3acdc3a57e5959f92144f212e20f2f5d13451e0ed478012dc442331e49a8e731b33a0db3d633d6531d7edbab063a4372dd088bb92bd67a3fe67f6da23177adf145b7a5a6d30411c4fcff00343642b1db72a8632eb38ca1caae6f54b0d24e6b2f294738f95fc569dc4e76fad01bcf6a4229367aa0d031c1bc0751ada21e0d83c39b698f5f027a4b3ebfebd0fc695ed4b774d6c11c9878968106376900f5c10ebaaa603f3acdb28fd74d728a7e187213f3e05ffb8ab0bab00dc6704703294e35c3c4de91f665f65da1c418f22991d8156c25160af3d4e645fd8c655a46415e05a98db9bc3ac8d9186877128d1e40999ad38f4d9e0dd176b7d28cc810cd46905b4b3f66863ccf8a42fc6875e3962fc2619d6b37de442cf5b4caf2c17151a216608208bbc242c887bc51cbb2dd84d4b40db780a22e8409a8c4ba924a2bd5398980a77d2bd66a0c3f1a503e6d03213d618b7b89fa8e219035a117a1aea1d1d1c32f7b7ecaa376b712f784dbad2bca61d2897e3e21365e81c04f7d27a3d8b8ea2fcd9a2d4c2232187ecf2c0f66ba9121986398c6919aea806bfd664800f0202f7b0213a6851078050a6044403e20e03b6b178af3dea37ae82b5eeae0f1120c58ccb3fb46c0e3a17768969fd5ff4949029ef9aa0c6dca5942208b9720a9a357035120f4ebb18ebe58195ba2426d8ad44a2f68376a79f02e3958445c01bc7140ad0a5a7ce143919b75e235020a3753487c63f9f9c619bfbf9e25320ff5c2c92ea99a8fab2b7029423bf57a6a30d8fa6e043e86db6fdd8305e40ebf3ca615e577f3a4628007578678549e16697613ec9097dbbf544273455b493e379880e64e78bef824dd41eea905bde6738318a79d07fcd223d4694da6e7ce68431bdda8014093653f9c9f69f55b46fa845f90bc97c9bf43be6c3bc88f207043706127dabde5f4a29af9443cbabbdb9bd2d4d26bcc0a80a4c8d1dd133bef710d40bebb0c52f881f5228935d6e7606f22d95e226d18461449f394f1535f5d83791b5ecf7351c45677e3d927b18f3bb35a28c97c138a2bddc622f87532df7445bec208ecd44b07639be390eb8eae246a7b07553d212430181d21b3ca2e18ae08356894601e40b2a06ce4cc178e7b2cf00a642c0bdc1dd86fdf30c9a835b69a05ae33a5e8a84acd7e698b876a954cc5b130605bd86c7d595ab39b03f7763c04b99dcb73d7383ae6d02940eb6ea5eb77b11c9592b7ba69d18463b4e9eaf67cf66cd3408798ba1a7037c48075aaf09e15c7d7928be73806ce8384ef415576c0c2d05482403d0e0056152d2b190e2ce12590bd2388ea48e3c2eb41f97cac0f40e90a6c33b871bd94e3e873480bbd7ee8b40396a505b305b84383c39e5cf98464b04580e73d96a1b83a442163ef06bd4af89d3d65c96356971ba30b835e35a090ad1f0b92497d107b847006258e38af9a54fdb89075a57f6f9f2c132e46bdfe196908053ad1efc9cac9dedce57738049f37efcbeba739c665a34dad08842b977f4ca3e711bc4850026cf8adf5d1570661e52fb7898bca0d97ff57a0fb6c0c7b24efc9ee6a8197b8613d9c13190dce3a0163d6ec046c6b87c519320e73327f4bf7ebfcd2fae7c36fb84c27af34a58bd9b08162561e5ff12c6a0ab0e37ef55ccc592a92d5094d1d949b54742584f1e6feb1e007d708", "005363630053526a", 0, 299713053, 0, "9e0f6bf668a3b52d63c1490bd1e5097561a40b03743466523ed83052dc3876d5"], + ["030000807082c4030350ac85754925097a9deb5ec45a8d1f13802a004e51a8039dce252525229eeccc03000000075253526a526a52aa69bdd496c117e0b42549d5f891f0b9b366879963519dc9e037c58a0963f797094796b60300000008526a51650051acacffffffff9954d768080bd6881278edc48869b12f604d3ca8e243b7e752929043b9a3f83a0300000000ffffffff02bb076d0100000000076a536a65ac0051b49a9f030000000009525151636352ac5163000000000000000002e2274001000000000000000000000000954fd733cb814f3f2b9c25b4ebb3daaf8845e504048f2ec4e8fc2e9f9a9fdd79ff3e62956cb92cfae968e54a5e0f9a7fbcce358774d7453253e22269957927ffa92b775663a2169ae647c8c6b1c0c150301e1677a94638924ef7a21cb2e5269400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b20e7ece78494fbfff1cbbadd78a9b959bca0e4c61b419ab096279d832435e98d6d3a9dc9c397d0bd32a20643479156b41a28868271200d17285292d75addea0ac1f55f2fff8013a6bd19046477b293fc14fd0e004345edd6ee5f8e0346362d2bf91966c93259d1bcdf5744aba85aef90aed6245fed8a17e8283e95dc9bca24e032de3adf34fecce7a7530c6c6ed483878f58c8a1a51ef2b8ad66e1e04bce0643f0325c74626eca125dafddc6ca8c244f6dcb241d55c9b3bd505d998004976b0fb330a08d5d82d9dd567c96761e2239d781cfcd879fa8dce5c9453af7e3e75b37a093f76a4bf43390bb13ceec305186ae38c004a88436c3b6a025220f029a5f522fa7f0218549175d4ca4cd7b39652002ccd275ea6d890c4749ca6360c072ab04c30888b022883ccfd2351b21461747d19f4a6b0c4580ac152f1aeca8a6018aad1ddcbbc6203022fc7193686728e27e4cf9dbf8159f36ae9b71de73902fd2dd08b1b2a4091cb0213db4d657635fdbba2bcc21c33601f8503a66835bc101c193c1c1c77539429220204ec481de86e6ed22d2084f74b358ca9db98c2494b58448ac385738561f04dd68135b70481fb910b12dbee29b745b99150363a82e5be06948274f235289a7d25e7aef46fc58052356563dc953e1cc01dc270a8371d25173dbf46a7644cd6eab5c3f8a08eb7a488513ef9502a377d63620aa76fde11b83b38d7411ae396ab0a089d83e80ec5c99cc3be8fd93b19304d8709c51f66c4d0b13ffde4ce6320a8ecc8647b630f31081eddc28050b0050ab0c026d84fed74c3e73c7cdaba48fd79423d5be20f7bf80b368a835fd601ef72a8304c2936e484f628784f77d7a585d16a0001f229617a497bed7d7604d5c02c2b30cc51b6131766b10bc726a4023c73b72b5151874b333d594307daa6bce50d80b2998fdc5aa95901c766125f75db1e4dbf894114fdf5a6e81f72d8e49553f9a6ad05981916d4a23691aa0717e10471c84753447931721cf66e314268ed6e1a68146c7e0681ac0a4358263bbf2109b915a83bb43deed97405c17bcff5d7d45bbface2cf5774442fc2d88b49285d026bfc5e0649adfa9d6028666d6883170ab8f749daa36accda091158e12315071df96d33d6b3d6b75e2cfe016bc0ed73debbf35519f7c936c3249ae195013c52a1b11a448e23f57984f4796294dce76b41937123ee1a02e79cc4be40d5736a9318ac5ecf736cd683b86b715c65f26dbe9556fd74f16de540170700a462eb474e0adb5772958fa601d17fd9f5ed33cc01cb5bb56ca860bdfb1ac43e9645cdd0367d3b582f67f8e3cfc0e46040a4f7125515232c950cc92a789abb87d833cb41d8ae8d0a90ac3419311990a6ef3de2c528eb1ab0964d696eb7a3bb29da6b7e6ce04d0cb8b6f701b8f5e6f05ba8b5bea570f0a6e81a4fc9cdf8f117e3f2be14f02f1142934b6100a9a52a2b67b82ee418123f9b829604a31868e29d90724e0c0df77f936269cdcad02a98fd76d254b10837ea7a5043443dc67050033ae5da5165c678d0103ef0e00ec4d2bfb775152815fa03d5f7d456610a0984dd1d3dcad9aef53cfdb23fe1e792673895b025bbe6e8e39922d387c657694af03b56348c9b1df17742c745e4f359c45b826f1033a225b1f9f11be6e4b597b4092b316da4831b64a195848f8489ac7a2bd58d6257c279bf0e9fcf871e0114e5ca1c5a44cc7d2d8b3ea2756d3403a3ddd9bd3b235e2e7b2faf3123a31c825d847dd3e410bfb37a18f10c5cfbee9459768538915b0fa458f58e17cfdc94a5e758e63b7468072364c2c79cd509a5e7812ed325b9a83926ba13e05bf37e61e78dd5ffdea468782ca522e589b225c4138967ca02d235f0321401b38a07aea2a5562cfc652aa8dbd23fca877a0b23f6a82fe21a1094954ee1eb3ed5f63605b61c69d7f4fa178ebf5fa93da982303ab52c5a456bf95d3967d52867f4de08df4253e6146c28f26b86f8ba0a66e3ef794d568c1d02244b83ed815f7a2057ab2c275eb56e5ca876770992734a7ea3dfc764732a06451dcada21dc623d1c9933d2eb07fe5fc71e6bac740be9131023ddd5fbe35031d26ec2366f680ed79e5823a7bddf81696dbb2cb8443bb12a5a1c872a01ff528b02a8cb77cedcf43ebd6175b0261796a93c2cf2f0f81763480afdf2782f32aaa29f4d65ccb681d280b78bdd9658e7da8dc9e42ee6200d2808c683e79afbf7b9267047e1ce19da010e2d4ea9cfd20116518ec027458b72fb2c13b00bbdcab22d6d2f63ba90fec7b872fd8cf01d9144000000000000000015685202000000006dc167c0f02b58ba8f8e800255a5d89f2093296f2c28e1adefe95b4384f8bb4336dc2cb9f80d9dab96e2f66a6612abb2b8abe54ea96bb218135044057f85ae8b9740b3ae9d1d064b100274edcb6e9157a152be179c1065ecb2a8ddc624ebeacd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042a449b46f6ad534eed9c52fc119586192b4a7a755765a24533f247fd53ad9f41a4307943098ca4f699b9faaa6475241fc7be3758180c9cf3837dc20874bdebea7152433fc250de3e2a95829f91c776aa79ae0fbfc6358b10d66c89d901f86fd58552b6d3b2bfb6e568cd5e2417db46a4306cfdfeed7b9ccba7ea8c0d7a6da480214622785e4ecb460995f4df052c53d50f75d8468522e60067849f865c78f435a022079116063ff0592d1e86035accc21c2ae3d5d47dfef9a58580441df6c6a8f4d0b01ab37002c3dd4742ed87e2c292b4e0f3ce32f540d5a314257a13a096e03426e4b96472c54e73b19b6efefd4bcf3f801ea91240cd9ed03e8060393ff66c2240603294b355f3f4c853ca4fb9b72408f78089e7d4650d4c209e265b434c9fe04918c020d95495baf6928cb61edb354084eb7d10b19f63320f8864ba7c1aadc7f9068dc0225a6ffc10fa00efd9c8f8340fa02db6b7c236c08addfd61a8528a8c5f57858da031502eb4e99e45fd0c6367b89f495bd6211a464edfe65da559f4cea58ca57259302244e26b0b7589517fb07e2d0d04f6afc89e06b94c76aea5d3f7d7aa00703070518e39e071bf0c518ef08863ed6f27c66281d0f5e973c34cf656601592b22dc2dc4343a9a3829697701a6759647b5fee44e33a9a2efdc197fd0e641fb7a20ad61d4ff6f9132e04d79268db08b49a017265ef7183c2d8f14b41dd08907542fdd02305b4bb5749d26b7ed9bfedc5d49e761418c0668530cd61e07e7a2f955603448ad9131de6626ea5eff57b12a0698b72cd58e9997d17588aa2a87ef52873e79af272ee91c52fabfe6aefa8a1d051c5684e1ad7434fa7c5512f5238d37df0dd0afe655a7a07bd93d5eff7a93f73d1b7bb55456a4d35766c3a64e8b3ddc0abe3e0ef0d8f01cd38a277411a491c17bda5937d4e00391e8aa3dee9f8b44874d391d6d948a847a8b900882c36fddc021a9fa1aced720ef27388d7598a2131e0807799ebc7cc8fdacab38694c8335570ecbcd80b03768d6df95b36aa64ee0bde3487713e7abdd0df7a87f6094a2fe722d4ff9f5a98eadd7346ddb7cb7b47602b49ed425934a4405733dd58baa00a7b7c9c3d9a562d151356324a5e4e643b6a219d01ff9f55b6f89c5185ee9bdbcca38427edc4ca8fdc689cd4dc4c9180fdca9152cbbcb78b23338cb01559599eff01ba57b963032c03175722172efa436d39a9055d998c6177649843b419fd7b1ef9b2d1eb3109e2e88e96daf1ca7ac5ab88fb851ac26eb5b6c1321ae7cf6b8d85715ac5ee804101e76c07de7ebca06ad5116d00ae4ed92d74d114055d202d9dd1eb8e3d4eca564e764fc33bd2fb2e27d7bb01fbaeef2041ae3e9cfc23bd1e6587108c88d840accac160ddbe80836c9f5534c2b0de08766253fa0b69ae4fc001ab103b6b62e957ca8db85f76860fe1e51c905101660320d56db8f141df4b973a1f747fd6178d8a8d7db9552f9647ed9fc4e268e2cce0c75b50c0e482d6c09a40ecf2303cb57cdb6d0dbc8fa1ae38e698483748504fee01ff2538695d7bbb79fa53c8c6f194a4a54345a42af6b2f4a8341c176615185d6967d8ad0e7164245449c851d3a6326a46154e711a2d23a25ee98c26a2c7be8faa5722270ae5944d5dcfad0f80e9d7a22375e40af52d0c871273e9131bfeb09ce9ab0733abcf8e68e1db8600a43f63957d46579c16a6e2757e18fb2d05a6ee2de59a161a569d01eeb20d71738e3ada842263ed4f5c2ac348d6b207eb6878211f6b90649db6dec51e49449be2ca70fbe58b64e4ff513651472180c3ab79b2b898c88930051c02bfcdf4f58342e01fbf0e3c1e265349a110d34a2b033f252ed17460f78c03d463ee91a9fe880e78f34b00c8b34a7fd7cc18c7827e1f74f1bbc06690f67b1ce31923ffb82aec22bf8e11e998611a438578f7425c21ef99930f62d72cd0cb283519790975592e2c46bf4cd573887e58953794ab2cf4ade8407cb7392abf2fc917615a539361f721ea133ab96cec67159fd5ee7fefefcf8a47e1b58a6b472054b966a02db9d944b23f1526af25795652c278aa3a0310cb2f71245050eb923730e1fd271a9628e069ffef4554c00eeeb60bae5d7388423f6d1caed60ab4ebd35135933397f72fdc3548582864f70c0a4dc5606231983355c8e50984542545df1bb3c9de6408db2b400ab3f8ef3310e8cc9db47ef9a56cf5b5abdb8cdc18712703785b8a99a93040359ae5041444b4ea5f2b26986027fba93d5b6b8e6b263e017d5d49ff3d7bfc1b769f68f899a7c4608d8e86aead7fccccb17a7c4969937352f81c32f90b669cd5b1a24f0c10e53138a0a3c29cf3b5cfda1b5eccab4220579ca3291641367cf5a33ea28777ea8ef6d7bb9d0edb673a634ced65b332ca900b933acbb8dfc85d3f1d87122195bcd6806", "ac51ac6a00", 1, 1596960850, 0, "55bc69369fa744276ba89fdaac2c2c6987d71e1401174bb9fabc7f0b9557c5f6"], + ["030000807082c40302ee53e5a06bccde1523c4e963e443b7c4a2a7d19ed96243b8566059ddf91e3ad9030000000952ac6a536a6a525151ffffffffd078f8d895e2575c00c2e1e2035139ab34a1e2dcb36f7a978bb182f01358d6940000000001537f15198c018a037f050000000008516365ac52006aac90c8fd6b03e95f9b02000000000000000000221803000000005bac2ff9dcb8f50fce2a281941d196cffd3ee602c002a0d37c87ed7d30d207aa281952422873270e8041962a903870d2054d6a5e1863bce2bae770cd3db6fa3e377285eea0e72fa501215041da0157efe1cc86003ada99b49e2c379f240ab37900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dba818a2f0bfe5fbe82ceb53b7a3a5e9d275f02cef20721c1a1c19cc4278115ac49e07949bf1614c06124731791c3062ab64826c9f773617206115c203fbc5043677169f276ac6495efc882e9a15cfff75504800f3e2aaf444a7b611f42a09a031a14e9168184a7f7b491b1c54a337f6b14ad829978516391f1e4bf2286b09d403069bf53106b3addabc9804d8f9fb1bc74af5501255e6793c19602dae699ebf390302f971b4f9e03c44b9104655643cb06ee19798d2cf7b2d8c9e6a45c4bce753220a008d44654caa2d1f1b87fb3fd1257d45074eaeccdc3865feb2b0923feda9a557b72bf40768b5e7efd09d12de383d2df0a4d24cdfcd472db772295eda436f4c9f02043cff44b4203525f5ef17a1e350d3816f4f7dae62396d69e73b5b819aad625a020c9b0a5b2695b0b830aaa6ee3d48200740c2f26350e6a6a12132460ead4d4de902269c6f98cd7c461890cad8585b5cb5eeb70b491bd2efa0efe1ed13afebbf548f031cc6df2e80e32ac2a974d60a4a24fa80e72b1e29c1d8372a70965ac0b9e408020321a62ca95859e7038ba562f4ab5b631ab92732a632ac468f4c2a99b5e9ec0b5310f65526f61cec1b0b1f3d3b974545168625c5e9702f12a83933773d9122742e7eb5e870caef561cf4f8d8b5b710db8cbaeef6162247308518e6be8f7f40fde52f4c732a541cfc93e585568f4b1844276d4e6aa78429084c03e859f1e5c98845745e5e0ecda40d2617db30af89b2e7392af2cc0ebcad42dbba19532115f6cedd96515ca778bfc68d8286247b9dc1c3cf8831bb146e2f93c0528c75020bfa34d8d4f986c231cd7cae82183ed5d61767923dca7d306e360f7d3bdf1b33f61599cef24504e65589d87950ff2c95e0a6ada8f4ae602b21b133c86460b59b43206f25049ed63575c821f53e345f779b1ae238a062ffd5029ace6940dba7251d609de70179bb30205da12960302f90ea67b4d850a1e407af45099d83b7c12557a64933448c2b34b0ac7c8fd87d21143ff098875bfc0fffa79720b4c57972416e7d86994e9e12c419a77f608da858c8fe8b129ab944c4791820465e05105c51972e1c77df217133de1946507023593f3b7cc6bd58f4b645d282f2d0fd03db62d5c5acbd61b927c26d73138fefd73f5764f14382e133dba2842ffbbfd124fbf40029ba34a6665dd1657bda83fca45e02759b424796d125d732b2db5d74898e049a7d53316c25606c3a79c97c950924a658f80ce73dd76f34933e7379248e08322fff23cf8e33b4817e4e1bb603d104e197159326f9b7ab6b876fbafa81e831b8f3f203cf4cbc5c6feaf0674378e6902943067d672316375d3d0a6989ee00d682414e496514d7fc8baf552cc284f22e579ce7cde038a369e9e6d3a4bdf10ccb11af94b9146244866704cf23eedc7582815bec9abadeaae791df1f6228417bee9aeb94ffd1110ae3cc6a300bf3524095a98732cfeacbb3fc0911fcd6230eeb88abedf43bb8a57117e55d5ae06c5cf96efb28699d59b84de69bfd3b1b82e591c346034d7d899269caf506d641965c75adad862e3327d7092a7c7339a3779fc5ef5e25376eefc77d738983233f33e9dea8097d6d0783aaa5a16406166642b603d4f7a32f5cb129386a45134bef18f87e28cb7ce5161d03db7ac8c4cab92833a237f905de9c91e134a4ca8eee5ab5d582e8cae3e8ee76ded9bf0edb15fd1a3a926ecd1d237fe50503b17965359a3f581bdb3574835652bb1ecb26f57c2e94758b107e589217c7bb6d3507ae35292c1534fbbb5a632ef98f7f008565683c19dc52cdb0961958d125f390324c26365f304ae6661b812947cdb1441f3b8a741ea4d156dbf3a252c8b657538940e8307fa45e1e5d0f87c91725bbd0eca560ef1773048872833e1fe4d7cbb82db6007f9c71ccb77af19d1899246daa62d5273fb618c62d02132d2fc0de08e837677d6e7968020a4748814c1d00ac075f84818d798918c322f27a5eb677c4134e55f648dd0a3077fa7ddf684450e4f4a59f2132ec14877d7a16f627620d7f30571db05aa6bccaea8e463ccb5032a5833c311170defa45b4803e966c5a1719627b60b07fbdd492f391d6413e796532ce789e077ab4f92a99c9735df2ac9666b1ea3bc2a213ad2e7866899f3c81317a2c0b295a3190569c6a67f1cbcaf6fd39c89de120d200e4f77de442b581e966c2b23faf6e82f0b9138310fc421c2fdabea7c822e92dc668851a86b71bdd8870583d30c0447ac69efdc9c8fbae197462ab3d5c5ff3d09df4f590eaa86bd2f17e9800000000000000004d4a930100000000afa867d24f3afe53c722ec62ac0104c7c7dcfc3d3b09f9ce2e0390618b4acf3c2d4b9789c6f23933fdb98a360fb638399da0bf76e6fde88409ff6b1c7d274e5d1951e33dee7bbfa4451641aced18072b057b2ab62a922b01524cc5e66a62fb7200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0d1d1d4292f0404118f091c881a0611605f572ddf62a2c5812c28e2dea888d8a33192b7aeeead704900a9eb306090cded98ecf2926bbc60d236a2140718fb48fe3721186e5bea8328c083958b76fb94dd8bd11c86c4406e78684825f3a82ed785aaaa1d3b8179867d65d51f3db1c2969c4ba1b3ecbfbb329b4086c6bbec48c90208cb83d1972c64d71fdd2e92a1dc017f6adfa0daaecbc2b87c1d96c202c0d59302031902c5eb82889415407e71a48308c439dfb237efa4a817aa477c3151e1274f0a06fda1dff7e56f0c571bdba00a8206216ef4c9bd1a56204a8df5085f0b15be4597fb8dbe323a45130a0fc1c4415eca9f86625f3ad491d4c153eab2e4f31f76e7020232201024d34c32deb98a4f0e241c76921de92500a2ae2b30fab3c24f4d9b43020a878d72d196253cfe629ec55784b118e6b80222c0fa85f5ce5a361f280734a503136dd89347116c594aa3dbb031fe88610853b66468408099a30eaede8cf5568b02022718028ac18585b3749673df828a4b2d8f115b6f6d8bf426636499f94ea26402105d9964a1e8df9250a10a5d0f41dda2e882d7340d068f52c5d53d9a26f2cc69a66b57983ab8f6dedd136344466a9272f73aa6a6eda3b035ca1cb808666dab72d42c941a9fad84238abb696b934a91fba5ab80b96c45dce75557ac09d0cc15ded3020a26ce136cdf8626ca5a11b497874d9eacf31087b85cb50d0969f9c8d8202f3e33282d8995c7cc0bb4eaad36037cb2613702026e7c2ca67f58aa63088bb4a929a0b0c075194586c1a177266595b1bcd9c2467753bf24c726fe6a89b8d911b3dd3dc23be7561b1c38eeaad28243d17f21cbcddc9dc299f3c3939de654c5dacbf0713632e92d7ca3b41988a8bf80556aa6e304d98167a16ba5d3b1eb5b04d5375870ae2db070f812843b5f3205dfa9007ecd3f97384ad6a8f84ab70978a81a66d4097187a089ab9c12d34a53e58c8616370e9f7f983eb43bb54afaf869eb113a6e48a27abfc2ca607756173e5f028fa57e70bb30adefe206f17bb65731e4a0ccb6320fd2e01b21f3e16d8fda5ecdddf0f8a1dc1ddac7bb79e72f7655f96360341faea948284454f614d475dfa9028695a04f43be995e5e9f7bbcfb5b9c14932b448febfef79b1736874c467c896eab38c0ba3d88edb77eb022c28e382bd6c885d0135c205baccd49682b25b26719b755559143464dc3c4a322ee90c725521e77406d65923f3d6c6e01427a9c1d6ee7423119ef2bc66eccbc62b70e19b69dc3dc3fe7977f8ef38b7e48c86648e70ad686b73b7eca980adcb85e556168d91e25e6252d9dc757fd605ea00a3bef8655ecc5abfe2d17e843be20a7c61438b0c3c7b8852eed390bf3f1d593aa0ae637c92fa7ba8dd9e04a3424624a0d57e8bf5b082ccf1ed64b5f46fd2fa1fd726336dc09b308879df43c341a00dca809284b7c4cf0b8bb4b400ac51bb088b11893a7d7e4187f6c9fc8fc3cbe41d6c939b2a9e8328eec66c9928f1898be9de0df554027214df3bea5131b4821ac0df3ad8484d252432a1768680e62164f23a134f4a3fc9fd86e52b94505f7d64d331801832d47271145ea48ecb2e2dfb3598e7ccbabfa8ee38d44101c99ecdd5e1002e8f021ead75306795af24b3233a105e55bd6e2a671948e3eb473931465045025b570250533280b9d5e1749a6fa6003cc925ec4b4a66cf2a1047ea88ea0c30c4f71a201d69f22e6f69d7b79cf59bf46fe52254b49cda93f24c7ab9685810d83fd83a06c23c5e64c165785be6bedc47ddc456a653914bfbf96e6adf939cfe3d03a155d12ba2b50de07da3042d2a80dd05aab4e19c7f750674ffb6d25603e1a005270e8eb88ebd63fd7ddbc46918e8fed9414f57761254768c9502f83105ad932a0d012d81dbbc9d35249876962d6653ddfe125e2507533d670f76dcacac16a0d3678a2b639d6cb0fd1c43f742c8b17c7fc0275f60985f609cf482d5653aff9d82ba226e6991a24d02e441c934d8fd51dc3122d6974a633f519033afc6aa6ba3bbee4d647bc51897db1afeb8d795d365a8ca8d9183a283cbe1a06b93d59357186b53eb8529a906605f3a5a77b39c75c11670c2476a1492c1d0d5e19a120ed2c0b3f86e4210078720a4272c7586629cd86f8a17b4d801b05402bea321faa939938590163e42b5f1394bd85b1d27f2a2243bc003fd837cde263481074d69ec9ea03dcce375504020fc1c3f715fa33606d5366c2ed91988de498f553922524774c49343bb30a889028d76257321c0664152dddf711cb4738dda3959963a2f4c6aed8cab13ddec7a8205b6c80c6d99528480dbc8c6be358a2a5cfb7263a6bc639efc69b843817a87f40289ed4826df4949aec052ba61a851cba83158e329e11fe00cc457ef86f78ad6a1a26e31c692608dda54a78c43fea66090b", "53ac5365535365", 1, -1509103470, 1537743641, "2f9f7940d85e006a4172c6c9765986c8b030fa8a29e63477d5ec9119f42b9315"], + ["c0853d610468d4eb527a0a242fef86eca4e0eb94b3b25c624fb6d7cc0ef1150280195506280200000004635265acffffffff4f4271e6b16d08eea21a1a979803182d4d2eef83497d55c7045a73b09ad5dc250200000009536a00655153005265ff97a34573852fb46383d6047a268d005076b8cd8067d156c305a85d8bdbace142ced3550100000007536a6552655300ffffffff90b28ff77fe736349fb2ac24f947479cb6b891ed994dc5f6f1c1a2d00587b96f00000000086a51ac656aac5151ffffffff03938852040000000003006300c734000100000000046a65636acf4fea0100000000096a656a5252635152000000000003c8ec6d00000000000000000000000000e420f76308566d59067988d1f1c0e84f48f96aa0943bb6592c6bafe64de3d11ee790146c62a401822b9498c27ea6084b3cffaccd2de7e6a82ab1ad52c4a3352a27bd2bf037da0a1a9a8bb02c58e77928bd8ad83bf9c44cd19c213549f37ae9de000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001376e7a28fa416bb05ff04a2fa4bc83f5282364ac856fa23addb81d90e43003431fe866a8afc6c5665be795ec24d86f81c5723df1c45cd941b4e2e654a8497a8694b97a1d284b52230c4ac9fd9b7a81d0c84e51b72834c916abead75b798fd347b340cb57c7d5db460d11722bccfdcb6546ffbc5453ec0a85ca13f62772ce61f031096ef60acc53e0ef2dcc9e740182355f920308b29ca311ea0b04f3b80c0ae570227ce140cff026db4e4f29696fd635865183076432e429ec732a419215c8d2c190a0859042e53eded2a7ae880a508e9c63ea77d0f8542642800a0320d32e9b70f890c34030e9f593b6b06960766bbe0b6e0d024754ff6f646de4daac26740fce5b202182e0398a2d2cd0cdea9b900863e7663c04cf28ab74ceddbbbf6aad45018ed7a032504670b6a26ad4a23528b6aefe86e1b70332867c101753e146e3244084ad01c03185e4538b84f2dfbf3354ff4984b34c20afeff6179b20435ac161d6255d74f51032f05d15567cd2e674e6cb00087c7a1cdd2512e242b88a37a98b71e7cfb7012de020a7d31efb28626e1abea679503ea51d94ea5402086defb7fc91a946fd43f4393c240285222390627bd7560a46b4fddf1d195cb05667e57ec2f66ec3318612974b8f37547297d655338d5312226a207b9650ea1e92e34e64f8d661a5983941fc9bb41d11e100ccf0345dea1b811eb692525d567ad4bd086de344cd0bac3aa6225252b84f700a5838a025ce5580e995eb128edc6e0fb71e1c8dd13f0d33d8aa804811a762a0e3a389ca7f02c2ed6b287c8975ef1ec1a962368929832653477b3fbb4dd736facb429e4cdb9b1d68cbaedfa05a0923430959ce02d01c964d7278b8e6d29e889df25ad92e898fd94f762f0b5ab939a1b42a4583c49255db5fa0282b6ec3751428b753873a5f24ccfc021c68ae5a68683543dee7e72f8b0efbf42c10b620b61027bd01b23d19b612d74bbd8cfe239b591ba26432b0734f13d16866b23b636cb6182a85356007e4a7f828f57679e502f93b6e5f2d67af25a87fd41023c83d404f5b07996a3eda495f1baa9a22e7dc5982ccf7fa4165bbea00c3a484f8ff579e06334ff3c367654e0c047cf5560937070652b40f6c04f9bc19424095024239a89420ab80258f3bd8a1d4b6adf4516f0ce21d94f0778957f4bacada975af1a02234ca90315d5c33ae471514d74746e1d22c003da1f76249c363c101aa4a07e1aa919ac05edbb84717001ed250dbc564f0dab5c5c1c6efd9332b0c1fde0996f44cff5d1591da644a2f3872709d335922b8391bcbe5232ef7f30c18c29445aa32745ef38e3e10dd28cb4908fc0c80d6f5c016e0469054941a00c558786499097cdc00f7dcca7ea85e1b05b97f30ee13a0c0dc37410e0423a8b1a6a634909fa9461a92c794b976930a72922fbfa402c4511ad07089a3251149bc77e20759a517bf91038b1258577f42c6d2baaf1ca43de9b637f09965c3c6ad19b3b7bd368c881019f53c119d139ba754c48bb4df0c10612e06fdcdaff09dce04a55d2a56981825b3d1494848eab387c517f401d80dcc3fff94fe178275b2c50539cc5ed1cb886d5bcd0b4216ec5c76ff79ab3172a346353acce0bb3975689b3dacd1e43ff7606f6f9200e686d6c83c98da1b1173129727fbcf6422c7d12ea9b2cd34a4d370d16b6d5dce5b14151bf7556c5dfcc9592d206fc670bd9f62d150bc5c9827868d0d358433c629f0548b754aa50f6daaaa7c458f285078d261fd926303830c0b05b91d73678e6474e6f02bbd37d42f614be361cdd33222f3d5ebb3a734a715203aaf26bb8f363211767bd6d4e1292957d439c8ecadfd960e39aacdbaa5a883cd897b25c1a69e863be4fc76d11c7cfcb51b24eb5eb07633a7a5bcc6adee4ff45a57e1953226ec85d23f1579f399e8aefcd0bb58f976406afecfeb2d9dc7877f2a595f3a28d14c92c6d0bb61d708f4bfe41a3d2ee31b6c11c2d7361d88e5543d9bc00cb951ac6f529fa5e580de4718a8fdebb068848d14229fbec74411eb82b2e061f5f0d4ca86bb61e6168e8852e5959942d0d01a1be7df4893fcbac6f1180a9d3bec76b4f7b772549b3509913979d6d22b850a4fd0a3297e45aec9cd9082efcbaaa5482c9a11076252c89c18a32b8f8d387adb6010633e3f0b5cd3cb04661e056371a2f8d45e4acc6b899d4798bd55244ff406b2f94407fb2bbc3f550495dfc3c30d8c4a7d637bd1cb04ea5c81376a5648b96fe0845befd8ef968607e30b8a30e6f200f2aeec360314e67b20fbe5cafa98fa3960000000000000000b5b0f70300000000b84aceb4251a643a98bb2660372e3078c852ae0fa25b8f5ccd193414a3406a4e67bf127fff8c9e1eba28f538566e0dccfd6c8cf1a6657e98ca91cff0ee01472e6448b9d2dd18ff99ce589839ad21aca9505c556633ab232abe3c9bfd73d9542100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dc9c4e6230a3baddaf0ed752c48de02c2f45820227ceb649ec9a607b6833417725ae8f2fe5138b6d35a901b79d4911bfc7470f75694228f3309bdab47b68649c8d9e6eccc5238f4717b7361f0766079895cb4e5431a082b8975d5781430ca7f152ea7ed2472cd881441e83a53183f2122543cc29af8a40b5d39f5d02e4e2a12b02260a68323b3878d74af8b438b10268ba04f07336c31022b2853884cb9f17d9ae021bfefc1d0c3d3f4660a94f27d9d537328bd3e3e6a2b17c4a0bbc3d4d22c892930b0797a7d9151c99d84742f47f9a9dfd0542c6f11d08c8e92129733484bf56188b09ca885c295ad46914d96bef4d38850dcf1df8a7ccb1afd80b21feac2a858d11021a2d34b5dc9508d166f5317586550d6558b67715224d1db478e6c8ce9809b0710316950148deb62d3d3ecfa7a4eda0dae5c5217f706abd8695c2dd1fa9a936b399021adca3294bb0faaca0712e640f3ff3c68987284f2afed4a8c1e96c9d0f684bba020107af492a77dca9e656f8073e6d011444634439839e3ee4d774378cca21e7020323f7a470c25bc1df7003fed0656a577c6697335b097f737651d7eddd3450b7ce39fb4f4f0643b0653640a244830c8b622d27942b9e325b022e85d05135ce1546db6cc8edf7cee84c8f5a3b4fb8fa7a54ec30f697afd3b7d55fb5867d4795d70e7a367eb10d694cd9afb61dca5de9525e22654a6a9682c1458c37800da37f25283df1b66ef31b7f5db4c896064258721c7a4391a79942259242ff765f4cd09b66b5d79fbdab8e3017a933bca6e79a1120afd60f7def9a417d80bc451f08956c00b74166ef3343f283905e824cacb4f237dfd86f4f8904ee9efc80004743eee3c382077ab63825eddc78703a3f194b2b617366101eb6933126bcfc71b0fcd3d89c374cec275f370e01dc6ab5e396042dc8c841de8dff40f11a09c598756c25904f2e24927e2d54a0a561ef477d139b102bd4b7680d28a4061b24c9608eb6215c984c4b271da7f54da86c4cf72e28ed8d7e07c7a7cbd7803142869b03bbf86d6913b4ddfa860d9c04bd622b43f96c51f00f40adad46bac4ca5616ec2d6b08907b58df0648b63eebe0186c5f8bf4ab8030134f116921cdd5e81f5b9d2dd88cdb096a61b6f1d58cb5cebebe59bcb9804b3eda335e1d268e6d3a1bf8bc9acbf7da4a9f7bf0d1d2780f26136408beed5e61e84fe598204c82cd5c147a558d726e7d1f24fc65a25f334872afc64aa8972927799047b3563a3d3df8905206e2eb4fa7cc8c8328785e81d8b29ce424c3ee8de10aa2f98dd377d1aca6fe6f5d8adcc20690ffac327d6dfdc9ebe6b311560454aa11d18a5496724dd01cd6fad5e85a1fcb7d810ba4d41f52bcc8cdf6a194d46d47dce3fc4a69a459a08c6bed7d57226bb45e986306987fdac412cdfe15ad298341707f46e5d36c481109820a4bc9bce9df91e401db71d6f5187498f9b6b6b8cf762ded20fa9b0402724ec7a1bd997a320f18bf032c984c8b4f22fe1d0bd02d3644311091c01c9655d28966507b7ba335f60057f27df10723389c6ef466327a318fb4071099edff15fdefe81ffba9d104df67012542ce8b67079c1f1800280389cf760bad845cef6ac0c96aabd478640064c3b424c9a788c8ce4bbd03b5898097df12cff86fdaa00d180acbc3566abe7007df38e8722a005f05d0d2199b8bdb90b34fc87341521bef9c0f63903f75b430546453265b91346c194f976a5fd9cbb57334a6cff8a9faf21b2fa4433aaabac7194a47716405eff94a5059df39c63d98197b0b12bee426a151c8a2ec73200e6b6117f937046d7b85ee0e8fe19b2bcd7a12ae7bee7905dc4c3251ea79b24b5a05b745b906c86c84c0de9fbd73679323612c1634a23f2976451a8e04ffd7de615cb2281b339d87dec033a1dc3485d343b254153a8b2c2f3f00305d389983ef5861a34e405b4aee29bd24993d16c448e106fff6af1db9acdceb0b66dc8affa33d8b7cac844a7024b68f10697f7cb00d9ff6740ceff874e62b41c129e7f21a4dbf3bacd8e23e856320aca94f59da158efb85a659bcfc609c2da52ac781cad9ba18bbe499e739f95c984c83d6e4d9637afa3cee7638801a3102e4404ef48004168d577524a36b84275bb6fd45f0d78fa87af3109c2e7fca0e79af5ca91e0f0ffe11009fc8c6bbde16d32e3af2a4aede75d9fd261fb4538319d8f4532010ff255e902c541ae964810c9a4b6de5aecde7e606d94bee0f73a6d881a7aa6416adfa1424f34506f79b741d1e104c8da6b390bc8aefa0c2a37d36570958040000000000000000000000003bb12eaf98e63e7ee2323ab9d7d42781a136f5d3c11982598d043d0a98625150cab2ee50347173688e206058c469fe158ffea85e2cb2e114e66508b11110a9ce79bcb25efbe3c6fbe07916b4e3ac288212d24c7af0b0a44c09323227eb93502f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008f1596b0962146c70973ef3e97edae8577c70e285bebb8ff83157ef5483248f186579064770fa955b30e99fa416a29dd47d4f63a6f457845037feaa715673921dc4ef9e9dd738b5bc551375142d900416f9c1c4a6487f6da85fad224cb156766bad754c3c0b9c613f54aed2da8cf70f7c80e8dec7e4a6eeffada5f762c3c2ee4032b7f88479e8a16e787c2598018debaf909c5600217deb033fdc17941b0ef47cc02210689467461f90828a87630d7ab7b7ca6cde9e4325a36498ce1e14b3dfbb4060b048a5c917c1ff5b914018ba38a1660a00d12a5a911862e55f510015ca4b9f451c414ead3f843e0e7fc5d32a94505e8564bcda2fa9da32ba77eb1cc94701d4acc030c238373d6157f39bd8a7213afd7a2340d50d33dbefd81a0409e85ae1337d95c02011ca57db8032821ac4da6c7af92a4aafae60e36ce5b3a5367ef5f9e72b2a7a50210fa65aa9792426c15ba0067c6658d29f3855a43d9d6de26345be102918c6a5e03189f100537094e49deef18a56580ec43842452cb0291fc0e48ea1f90f3180d500314281cd7d7d1ece65d015cbb72f53dc724c39e12387fa3e44ccdb40d9af44639d52401c36213d0862dcef8d760c62b67830490974a956698ebb5a2456c2f01ee3056fc35407c2eb81c2464b5c079924eb15b726fb951e8c9cde6e93ca96e266d74175791bda0cd1290730b302eaffcc6c8270b88d2ee64526c36c00de3f8a99e1e180d4f83e2473fe6c5da08e86a6e5c96374fc21722b1021ad4374b2f2939838d706fe7ab5d69328e42252df283bc57bd3cdca435af7c726b38672fd6c5e92276629b96b809ce42e28f3df1f8502aeb614746d34b99d748592b33d678801b80c051d1989ec4af36815d4c802d63ac62c4c64d31a396da922c4aac2a93aeef3cf44e3ab19e3f9f5ea3e0a90003394087ef8badfdf440cef35f7a3ce71476089b1558eacf207db0a26ede3930c18af69aa5324bc97f3a43bb3e5bd14852d1ac664a540b4b1139e0afca1917349ad281ba14e6e9fbe2751bce2547c8099c9003dd8812da5c552966682d3cbc4698e62d9c8a42cfada1b7dd37d49018588d18b4b744acc5c7b37646dc07743565c412ba6e6e93cb9f81b01ad27d8dab8e8e1b94201114080ebf1136ff7b70c344d2e3103f6e621d831ed28214c4d82ef38b733d999abd963b88162ebad6303230ddd076bae33c538179029cb4c7a0063482aef0cd377bc2f1f525591e617423c0210f9dffabf80f39b1737e7a55511e64e13ca8f52e09a523bcfe9298f4d0ebcc4e5213a6379066c740341d8f283fe18902f4c44ef2645db6112c3062f58238fbfdc02b2a73834cbb877d993b42dbda585023554af3bfb2b1b1aa3069ccda5012dfeae21aebff4eff6082e6f6efbc187c9fb4b8bca743e556a655e6b904f1b2d9c2e56ef4609bd3a447265fccf119e760e28161175e6c83f5b82a7c6bf82067dedb0655e2918179bae367e9d826c7bebcc68cb89a904c2aca19e3b6d2acd09cb30df3521421a83f035091ccdc7fb087eb366e9e879743836f5fe7a10a9ee29509755533200463e0fe3da6021d1d17acc16bd3c394fd2af2d1b003d0788c75d5d58fcde1874e056c19deefd97fa2c365274fdfcdeb885d2744088521b49d2b07cf1022422a0dda8ab13e27c2e041f371139f0b7c90f1b5dc03c80bd2d2d242c65e9b939e8cbe63e0f7255335c465094625e39c97ce615dc42cde15a2dd3b27b0d01683d32a729ea8cc398432f1a8a8e3cdea06fea93599eadf7b3c8a20378ae65dd0d7d5590a6a454d7c75906b173fd7cc85fbe9e43892802e6b150c840d0dc007434e3ba911a76c9d9f360048d0205204f946364cd0fe191dcba95a9ad4ae4f13c4d6742ac5bf09dd14be8f1b9606cab7dfa501750df4ae2bd39afa4a032d382a1e7bf2fbae57cc150455d74947910c303bbc9af95e3cd3424bb04f1b7e45ed54ecca0cbb59a651ed9f423b248f225f40cec3a5c24360dff350d7196c02828f41064af346f6f74118659ec057cd299b22ca9d9da04dffbf651055701a192e1f120bbb738e8aedc5af7e367fdf6014e20bae49319a3ba98577f57a333ce26c5711bbd69b08f90266dc7b870e892e7af11e26ce633247848006f398059647bf51e32985b13d1d6dd7da8eb6220bb64c2b49d128c95e06b271f633ced797f0698b6ed52ee7a8b15298c5344eecec4b51a425d40212e261cc2a00a90ba643da65a41f7350842edbc2cdb88d813eb583e34ae16ff60fb9a6ea2fdba34c646574542a2271ea9ea633e6b8bb5c0dd6b87f8b4fb4d144c79af12bd92468b219c7e7861bf56dad89d78eac2ebc78da5cbadb4650d3bc26cd18b43c884b42f5ee62264392afc47d9ee2bb375896947e80630435f4a65544a1520dbc71657d5461bcba30a4b89a6033409305", "ac5252510000", 1, -945032891, 1537743641, "cc6b5f5459a8116c05003215d256446d21a7314adab388367f0c01a9adbfb505"], + ["030000807082c403042d2e865bcee815db24dc3de5a11ead170b8f596e5a49c30cb6319d923da8d3e00000000009526a6aac63ac6553acffffffffcb4d7623d82306cebb5952b89e1599041ae8d659d9594c25f57ac0d5feb8c5e20100000008005152656363ac51d656dc19477c7b2a3eed9615e3c5f8a690eef3046fac803a7ed046083ee12aa074204e0d020000000851516a63536500ac8406fefa3afa7749d82369b416be987094c7cee9b4574b3026ef5021719530257d508201020000000153ffffffff016c7207040000000001ac000000003925a0c20178a4b60500000000000000000000000070005759b8b75fecce091714aa5226969ee3f7d0b9116fc250853c42643fc84601ed5acbeefd1e0d346605ebc8b6e9b482345a39d6f42861c853be0255b52eecbb59b6ca6e508ffe697935f4ca96c70eba8f9403b574608bb0bfd10ebe554e610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000051db51357b034384109f4d268d9c12b96bc2d63d8d8c00d53bcaa41d44b04286dee5e648d6c8fc40d8c45400d6fec8bc412b30f04f467a3638c15d47e2e415dc31978684ad2b7f9ee516e95fe5d10c7eb6acffc1759f28b81e662e1633f3704fac8ec97dd79ccafcb6c12da716d19a8f05445e6ed11803083b5459d518648d3c031b6a98cacd3694d7fe80b2e96b749f621ef7e1ef61ba841ac5f676465120a4af0214ee9573c13a727143a3873d0063be0a7c1ec2b7b611bab601fb5044efd22e030b08e4679dbccd7ad03ca9c883054440cf36263b3105f40a76a1f98cebe3438b8d9a9557b84b5cb212c3417c648ef9c1e41c3ec208e1994917ce0e6d4b831f123b03077568bfdd566093261997e764a1aac7900290d52430eb028d5d90038867a30d03238f388302234dd8c1834214dc0155555532bb5d3bf3ef6692adf02b88e9bd23020f168ae403408a8ca5986dfdbddbec3e61d3ba2e0521304750ff18a7d586cf7d031062e68facb013ef1974bec903c3ab2a34404ce0b11ef64a69832a4c7de9de2a0326119c2e663d683c27d6e8575af049cba5769cf1365c86352ce01ddb5a8f65a5b3f36a940de0a207cd1e514c163b674d0b237168115daf749804be992278440ad8bf2fa1ba3de9f833875ddf34a9f33147bcae4afd71dfad4973516526e5b48a5fabb3ecebfa58e5fc29cf2987101ed064f3208b0e06fdfca8806192889740effb6f3e48813a5d58bb549e58471e86dd66aa8cfe7d0ec01d4f0cf145a8aa48e35e3776049dc116863ed6402ac0cdde16f2c3271d6964e696573234e76bfe5d6adec314fe6955f4af84e965e556f2a056be924b1504da0679ec800726fb1ff43aa72b2b6da3a11f081b5fc5baa396fcb890925aebbdbda11ee6ac99d4eda0b2207d59c47babf6486c9d2da6f0264760527d064de3842277a217228612d2c5a5d1ebe89d393afd8797c9caff1cfc968ffc77d6c6ae2c96f8a6712016c339d0b5c48092e5430fd3011ef38e2e79c11653b97e80db8ea471744eb941909b83cb2a3efaaa9e4105c9d3e7baa876a7a29a326ed600ce15c6f48fe2cbe38676d897f34f5e8b342e1d66a3c66e3dcdee7d68132b043643837000ac16ed357ce478524389a2a05eb82ea3604a1ab98d20d3444da78029f4628e76fe78425a3f791493bb9baaf8a9b5bc9ba1fc98b7a5cf9d50308f0b07f0d70260401f1a52c2f0dd450ead2c9b018bd44972232234e2ecce34068739d26244007a9d922fcc83bbe1cbb38098f8d2dde27aaa3b7a4ecc743321b6d5449ea00c7719ad837056f9d7026cb3ff425e28525d0a5fee678c1f43137e727d057f69d182965a00fff6965087e5ddbcb68121edfdf74ac7a1f9a73f6698b28366671e3ba6744946f727d76741a1990914bf7c897f8f08a73bc96a758cdf37fcf55973c2b6b0551e5bdeab6fd4b4dc4ed7dfd2f2e3d767fa7bd666335d3d6b91be3cd82525afdb755a956945b0970872f74f1fe8560d590127f24930af21263228ff09886c06e07b9196e8161577ed20b456e59b15d6bf7066dae10dfe328dc206c2f707b20e50234657d590818efaab68b8359543cb65ed0e6385b3ddef100b340adfef6d206eca112d6db7ae8a9dc2026ce5a27ba9d3c0b9da73de30ba8629a5eeecde1649ddba11c45c0b0e2c7cdf655e6525ddfa790b7bdeb353edfb200e623672c1fc4a5b2708f55d2bf10524848e898283da62984aae2e2875dfbf916dab0b729a5f63acee47f4d31c0b58ef888ee7ec102a20ba1ff14637dd9dc87d73ecf090fff68be91d3f14e99c790ae779f99376e3712d8e6c895d595cf45803ed5339c7e7c5b3f3bf6209045a3b6b5aed6f63749df50cef77452ac463a849b1fcc59dfb08d52ea53f74d6233076354070419bcfe52fdd65153147086ed1f02a0a23522736081d2ba610f6805a54aad895b7b554349e8e4998613257d37d14ee2b130d74f5704b1bfa57c7ba6ae262cc734605c19d1461789d136862bedd8b1ec029cc314c1552ea9f8d88ebf3544fbbd448dca54f71be3f1a3f0cfde5d797a764c227dc57be3ac4f4ee0b91703569592d80b99aa35c56c85bdf1562ebfb489af8ea22fec36484b2499c36f6ef7b937d4a4bd083889f54799d52c1db1a4e6079a72f42a70fe0e28554e0c0c1d86c8c052e66b00f5a1e8da59790e71b5fa38ced111c39618968032179680fd57fade9d6ee27c74ff2e2fc4daec32e36d251494ce0a2b49bf264f2421e8efd2eb7c61154cbf4697c2df8d60fbf1d6c9cfbc2273e80645d345d3fbc7442688b1eb059976e96b9fb6a9a4aba4882fc5c698df313a9732a268f4cc84bd1ed0f144ad9d73ead1faae2de14080a8b3ede769e91068bd9ecd0ad03888a9cf1f89485ec97471ea69fdef72d0aa1cd3384db9a8880d2369fade503", "6352516a", 1, -2078586765, 0, "2d67074df94fa9dfb7b9fb61855016694e88cc8c3274a13ca9e209a8dd0df65a"], + ["23df1d6f0233397426427ee6770aab05e88415373843370831b89bc6076c69c775e2b5ed0a030000000365636affffffff2154396ec0b1a1f48e2bcf462d0506434bbf57fe5fd29f66097204194f1dc0f1030000000851636a5251516a6affffffff042081e10000000000035251518df6d1040000000005ac53515200c67ee70100000000007a4e0d0200000000076a0065516a6a6a0000000000", "656a6a510000ac", 1, -56634375, 0, "4a75061d37186e6948669ff36c1139c0748968e18f8f052e43effa9db3dd60d7"], + ["030000807082c403021f356a7682fdd348156a1bc6f2bb26f9eb4d739f4534d429a76d60b35b592b67020000000400520065ffffffffe2350896b2b9d38e54ecb598d8cc14f575ce8b2ab4c203d4f509fd2ad73354520000000008655163006a535152ffffffff0499e527020000000006ac65516563638d9e1a04000000000900ac53630000536a515d2473000000000002acaccc19a20300000000036a63ac0000000000000000010000000000000000dc16e6020000000030e9392d363cb9a0d7f821de1ec97e86158ce6769682c66b7edcd623eef84780a5a1c200a385ca7eef4f38908b3de0de85a0d9f79dae35aa7d1ebd01f72e087a17065f68bb3c7a5b4ea12ce205b53fac235208ee25d01ac0bd33f2877d0f670e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b277666229a8fef0d8fecc1ccb8adf2900fb124ce5f91574b1ce6eb31b495381c106a2477ee7a844a9d03e82f9ff02797a6ad1164eabd872d89c0ec10f867c95d2c6dda707ef4956ab1a7099fd5a8e67b8a89c2aadaa4ddbb6f664025635634945d10711ca1b7b2d2812188a283d65b35a0d8e17e65fa6a7a031383b6611826f030415fe9682b15e65a040005dc19b689556c22d225b50c0eee5ba8c199c4d61ec032c30a6c6707e5120bc2d4a11d750f4635154f37ee234d1f26684e28093ad53d90b079cfa04ae476124a848734ca4f63908a6526e8f9145b3448e10c4ad0a3647fce13068de76a8bbabe19d1343fd3afe93e198b3c6aa8e3efc677a8ed0bb1f8cb5030d4ab52162b9b99f9ba8c16914fae6024d30020117db94da6d25ffd2466585c10226df1c9f9f646caae869325ccd23c2228bee968f2eda561e661a3a9c2d412624020bbac9f3a3f4223215ff11a312684ffadec8b4c96af04a3f7f9457f104e0f160022256aa890c4965eaf32cbc90f64379a2adda490e39cc0e7c02e644763cc337030317176cfa2a6c0f5c55587e89684572ac77e06e48163485e0a598076e845769a448fe537755aa7fb90bcb3ba6cedbc64e2a8fee5a925393545efc3c52ee915c0be76db97f81ec75a1ccf7ad77b3cc0180b4fb125bc328eaa44203e8c9f87427b05617ee85398266499d9b730f88ef2e637658c26e1395cb51ebf189186f7012db1be45b3c8aa604cb0100aafb40d2a68562673d273d4cded5b1b60329df4449bf4ad435c3c3352093151db38f8ea77fb328075b35bd8f096668323d02e2ccb97be36670c90766e008d5f13b3ee5d6984cff019acabdb28988ef1ade103f936eba9fad883a74f30fca5524d41328d39965ff60fc66e5ece1964a2ee723f306a6f3c32dd3f28829ed8715fc525798793848d0f8c1273e43b3b4d174de1b586488fd44f93b082a518f4a091d8754ac2ba3320e49a9de41df1bb4dca7f85e6d46f8b6b3826669027e5da61de832518273201716c560fae9a1bb5d80bae5d45d9653acd81d06a101ff48aa7425ad40d8faa4d92088064b6ca74ee2b3227dd9b72d2aae28133fde9a7a81deb30d83a696cc3f95882d957967c01a20129d29de3035b3bef5441198a95c0c9c37cca47e2e1f84a23fb07413427b8690f3660a6c5b0d7273758a9c2e0bc78c06bf68187d0ca7bcb14bfa77d762d3414e7a6241e7f2168d73729fead945294d28b4e6d052094a7c1c48238fc636460ccde49fb3e5a6c7a4a5d57d2c6ed0e55384b895f2b3353055bb3ed6528d5fc12b548c120527595fa2fb0e44046719e90dc30ca357719afef51e228eb36cd942c6c72f3d4c085736e71f029a4c84f41655a3b400b9919e847c286a22aa2b3fa1da542887cf716ac21f305211f643330e4ee094e81b72d7c8f52ba8480696d03f2ab5e6af4bb94e360856ba92d87111c39f2862206d9669d3878a94d33570602ec5242eba1ef33edf74f2559ab81dcb3d88c09aa46657a67dc569d67e69eae18eea5ea47eaaf7cf7fcd0a140ad658498aede06b1e4a1bec6ed73d67a7d9696723eac5624caa976f91307d3317b91f841862c13cba59686f53abf66a71ef50e4ee7829dc55f40bd7672c0ad5a48f5e63d4efadd6338c75855284f0566124ccf57ee1bc80598d6a9741db0d275c83018933d0beb6bf81ac63740ced37105d1d381318917c318f2a779073a7cf7b55ba1fbc96994a07a74ca89541fc06989c36d0523818fc4a727502b383f2f9784cf8cfd668b603ae2673aaebb1dcd5c2bee631068d9a0abc7b353a46581bf351e317fff8f461eccabe7836141fcbeafbb509cc4ba27975378507dac711684e3e0c6bcba998c4bcce31235075a79e4f8da29ccd3684ca22ae91f7303ee195fcbf8b330e3a94f33e34156d3b36ce752d784da24ecccf2dfe1d08d6564a100403db576e53c914b1a0f22fc923121d4963bf43803db17bdb9face99da614656752f21922d0518a0a2a62dab62d303b74b8eeb90a15b777881c76f058d649dfcae8b023f582756e6279ff19f5e8dbbe53e0704cf2f38b22e37ea89c87f17f9993e87d6e0ffb80a2bf0e3987a9b178d66928261ca2bad12cd1791fef73c73f447e908aa979451f5938f796aef2892a9d7eb70067f9b641e39929d195022a324a702203ed93d75cf34781f9a45be8cb71154242fef86dc048e50abd8f9826f557baf4435b3d53ca77b7214244595352a80622583d59c903442c76f748ab8323b4cde0a0afe7f39e7f36fe135f3990c2e63d24adb75be3964972efd8864317185e0e10f70aa73d168b59ffa6e937936a42922bff94acbcad5825a39ef33d071ff99ed5315dea6c2da4f7fd8a96113c719d0441383aedbbd860212086b75bb534d92bdb7b0169b405e2471c9de295a896f837fd0b", "0000ac", 0, 1778545437, 1537743641, "7c2a9193f3ee46881b4d669652dae4f9972808b23f75ea4c3f5e99cca3ba21c0"], + ["2f41e16f04d349f396e38a90a6e3fab44f4c9c2808c8c3443452df87dc88988e282fa29a7c00000000076a636a51510065ffffffff7127af2238487f2f4f34cda8f0944e25fd627396cb37c5d36eabf9f1db3461550000000003656a63869498654b1f8a54e280b57cb1bc5a39f2c3f9aae82d69e2d507fcc5ccfd3ec6b56c40940300000009636aac0000536552acffffffff791e5520f1f75d6af9da5e8176a5241552c951a25e9027f7c9a288ed7bb84a350000000006515251535251ffffffff04627f52040000000000e9fc43020000000004ac52636aad2d6f0100000000036a63acde486003000000000853656aac6351526a0000000000", "5253006a6aac6a", 3, -1452687354, 1537743641, "1f24265b13212a05c0dcb16592980f58af3752fc51dbcfbb0c7b0bce1a9ae556"], + ["030000807082c4030311ea826e4987bd7b049a8d68d482be5448ae90909b1772e425e5e5328eec4dcd0200000001acffffffff663ba66b1cd01e1b5a7cc46422ab0738fa00e9387c9dabb62fdb5672c803308c01000000030051ac32362479fa97019113d39641188781b29484a7354706fc2cb74e662a549dfe254002a4a30300000003516aacffffffff043b53e60000000000007fbad7040000000003515265e6a8760500000000025163ad268c04000000000263525b2bec51000000000100000000000000005c4e8f02000000005565d691e4ed4215ea983c23ad2690f5356c6f7f5dc1b7737f4d58f9875fbf9d4dc2d0cdd8128f67d0db0350f1790b5b8715c71d50309c309fa98666d71643f778b9ff6bb7df31d59fda221e6d8c213d9da731030d73a02ac175b4882e9337e100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f9599beaa4372cacb119590b9f4f64979002bec8f4ab1443deebee41b9bffa787e36bb671c76098c45a392aaedc34940c2f642b78d1d2931b31fd163fb88f271993586f3c60a2fa104b46a06d1f0401751a3e7c39fd4742bef67649c6608e7109322b18825a156e68faca93eae97f2ee41b1024059a77b4ea616a41a5c2d90ba0223f2a19fb4426015a0afe14bec2576c891693847b3d0809272413c6c463707aa0225e20f5b1b94b0cd3f3e598e8bc087ee506958f3eef6a86ca2b5c6ae5ecbb1790b0723024a645a8c9fb57dde1291e124a79d609ea685db44443db740a83b9595f437f570dd8866c1335f15a0bd1fcadd8858f03cc1bc81ee3ce08961f2f7466016030644f99c73035060a1408aa7e8a2b7ba2fc040141e19206e2b01085e6cfd24000200c61cb46a4804d038fcb2bf0d7cd2d0b448a63065f7adc72d9f7e2b79687bec020f39ff3b1ea1cd96a38afba205e204346c0503cd4259d5f617ab4f4fdd004e76021157347223b7c311eb706867e421fe2ccf86f3d8ca7df91b7e1ce94f7807273402146c935749b01f1485e2f25c25619d64a5f1c8ad81ab06685271cb9ae0cb89abc8a9a189d15aad8690ac9d5c78613cf4debaaf8fc32bde24d7511279037cedc6f229148954a8add89cfaa9be1497d25a7375df5faafc6f3ad2c7bbed969cdc42c9738f196cf426185e972065213cc60f96ea07eb3c5383eaca0cef79d53c56dbe01cd7720d02e027d9fa983218342ed5a0dfff59fc8eb1e7ec83135e0f468be94ecc4c7860adf80cfbbba6b9dab97af2f0067e4f71427f80939eec2e593ab27d857cea9d8b19d34439bd17012cf7a5077ca0842affa677ea5078e65c93f6867d5cd04f230ba25c2c0dba4bba66f82943b3018e79cf7cc8b60fed109de3114f117efab693143a8495674f748512f3ed8d780c7af874c2dea908e0604dbfefc35a7636c653aa1467bb1f8e889873e3836a7f8edae0135fc33ed34ec4690281c0efd705a12c079805258c19a7b445a148998bb1141ce302f186a5141bb5dded404928c0d005862d9c61c09f9674287371bddc8737827b7509f395eed39484e3c4fe1cbbfc8311489395e817730dc28d7652255cb8c2135fb5029318b18a33e6ff8793da09dd1dbb7f3b54d40a4ad1c39abfd59aa8c68b3a51f82a549e384507cffbffb803271761796ee4a059b5c9ba037377a34ba80340305161cc53ed63895c96fae3f9d4be1b61b656e682aa219ce930c1d65ef74ab11902ec42517c197bb2b2ae9b9a8e61d09d6f9b64b5e329ae48fa58b771f74d5a3281c675921361a99f5f597e4e15e16a10c1e511fb8368273edfdc7c0468220b62d9c54267fd77d6279e417f7b345a01d9c6dbccac17f9ae4a7f44190d81e85fca12ceb3f5585c94db1247a90b3240d70aa3c9394133e9cc7134d5605c07b095aabaa17c8a502ff2fdf5c44fb8869d0f35fb36025f31d4598067804967c5a06524d5feb50c4c2d1d0d45839d111de2ef7c1496feeebe438f86e5f485306448895f3534a71c78f766d5828add91b3d5d7f5f219c1c71135d256c3d3c75fe0c970f818f9f6c8c482c312d5791d68465006a1cfe124468f214537ee3e0f4cb82d2044f98ad3a720b8a6b3c50de29906e2f83a41d3dc1dc03c561e6e05e1d924269cd9222ba2969d1a07435473732024282b3c5216ade05a61d1455f87059b373e6e3ae383bba5791bd1b8f0893ee1b13b185c692ace35c413c210a32ecf772d8ef04a09ed51376779baca3b100b25c7c30fd74f01e504212ac76e732b573353f735a2c0cbe4308072593843d47102ace16b22455641da07c03a77086ceb42955fd7a9da10c51403c821a51cba1c5eab515a976036384848899f1139e16f4439cb841528c8f962a19536ba35300d112cbfa4be1a36840ae8ab43b11745812e4464e8387d7c472a5b93d1e8cbc4fc3e749c9624d4b0ffed0300c414f6e285e3f54c2b5e49def77fbd92b9f8479bb1a1741ab5ab21670ccc58c01c0767fc9f785be60d79e4dbe7a9660e8c37209a5be6140171189b7a6f68f37c286801379fb3dafab62a2425f6e09718179546b180744b201ec8f7bbe279b2285c71922fe8864fae808c1bec51d07ec1dd2b8f648068f28daa9cb3696ce1d926ccbe29439087080d098b81b009ead62cb74cb7867465db5b4aa622da6fdf69c8cd72ddb62fb616840d56eaeb13af4b7fedbddad44893a08e559338758cb55609cb58e3f4588cf45d1f541d5d9a75fe6a63fbd2aaa9c844d7b40dca64c9c3d0824ce997f55c4ee7976e9834733c521991f9c8156327da6b3f7b36339ed65e41295aab16450dcff092a52b2b82a4cc85202f80167ad17cd5d680495daa4ace0009c79a4464675ee02371bb740c9255069c6b9354dce574b1b9ed9b3fcaf45d78e7e989b8d604", "65516a", 0, -1320400433, 1537743641, "0fe4805543af44e350a97c123508f01f2beacafd1ae77cf5a6bbd6fb99baf450"], + ["030000807082c4030282dbea71a979db913648e5c4f57a0040f2b5d22f9dd5ae6fec6f141598f74b9e02000000056aac536551ffffffffd6fd840356da78245c32e332a7148777c04668ccdff3d622c388f81642474b170000000003515351ffffffff015aa656010000000007655265536351acffa529a60f75e9c70200000000000000004bd52e00000000001ff56371344c1daadf1ae1bfcaa01f14130f4b0f0df72fd3eef89973103e16fab4223e82dc528c23e8795715d9be128553fe6cb3b89f2905a271f2e1398cfcbcde0247cf2c1305a3f6a30ab4c9d090af4b8c4f3310b45b4bdeb0d1bba2247a0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fb8292885276a5a84cf8c3917fe38e8b188de808c015f66260aa5fe3a6639e3b1377b17320ba6c6b2445154f9d99c857c1434a3eb8ee2a29d48e0b99c4daa91a1723fae4ca064f7bafb651e45011774aef2a96b888b0b39f18c8b3a26418d0dd4b37d65a43132689f75bf14e22732a028d51b0b53af0f2a604cc52675cfbd8590313a8a37f32ece894dea82c943b73cee6952c8869266c39457d53d67fd3c702c2022c5e54d6a5decea24f8092b6d034169a66ea34fdeaebc5c5b5dacfad21ff07210b0815f6e09ceb376b3285f7f83b6801b3974d173d9324e21ec55aa093a25b0994793786282bc2817d98a026493647b702834525b08799e94e9e77237e559d43710220b507600aeae4bb5e6b3ba1aa24e070b5df902586bc238be4c44b2bc9ec1098031600d8e4ca90f5249b3adfef1ce3b159f4f13e901372a347817f0f627fe4f41a0203f79a0f91c9a314876a4a8d95435111b773f557e477d5754ebf8184e31233fa0307b2a585b2c1c81051eb851522c9061ceb7de60facfebcf9be5cdf318fe36d7b0324509dfc16e351441e44bba9ab0337c7a7941c959f29a12550d0a6fd7b213b616a80aa905b460e644707e8ab715d25845490e0d68ae335e49321a5689261e29508852ea3bec1cbb799433c223549dcc96a9d3b9cdf40d202b7677080c747836519c2b4fcb3c03a71eb28a288f31b6902545e7378443cc30dbc3793f1aea526282896c38679e1378f68018e5a678cad408541fe16d4a8d35b56adfd16a1bc48943345a609f65a6393e0de5b8e21c46c53e96418474c3b65a8e30f2b040e9c852aae4643b5118ec7efddcf3d2d1c601240f3677216034a2639178494e2be9f8c043bafccd359c7f7ea1c2a28dafcce3bac8596a5e57504dbb6b015743ef929ca2c00ffd114113b9119d49774da3e0be28408f81b13dd702cae194aa93831980bb45255e7160fb88bab2220b4f9f72d9558405724028b70b3770f602c138fadda7c9bd3ab0e10aa14a4913f71987ae323a8752ccc034fab6d4a43d9dd290c10135dd1e1b492c38895b2e64cb760b34db55db99b5416faf35250cf0bc3c1e65046a326abf3018259b039c9bf47c09e01caedade63d6e0e6915dd5c9270a240e7f8a660c01906152540c12d14afe996f26fa5bf965a0f0c18f140d6c33cdcf71c9e227e673b805abbcd820a65c06892198cecfa8e495cf531ae216f039721660e8a7894e8b41c556f8a38f27a8644689259eb1b21449f846ddef648f76416ff1b440afab67eb21c07a25949d084cad2fab7e974ff8f1f47e1aac9b895ce4617b6e4025185c7bd09b8d0266052716933a19797ae1075992d8721c621f8b3418f1fcdef368d64951511fe5abcbe99663de750a9777fff7704573058baa3467e40c4dac528e2a9640dc6f303df44a83bcc129f20fee588d5db3f95e061559c7ac1854cd387f6ff68fd6525f4bffb1aee0f66207c1b0a4205b19b2d5aa7534c2707d6d9c16ddff9d4a859784d0b39c5dae41ec84018eb4e39872449f5ec9dd7229c5b57ab0e60d37b5e1a660757f8f1f8baa859c8e90384e45638d0a49c32507780245120a83caabc457cdf24bb8e2aa9bb2550aafb5d1ad589143e829145ee40301f7828ec0790f3cd885d8a1a968dc78bd48fb40014e0738debfd77089a5d82312a8deddb029ce11a24de737b49c150ca32098497d55454784f6be2815b069976011d5ba96194617ab5fba6bb1cb973f2576d94f7f0194e1d730fd94e5dbb14b6352e61b5af70b48637f5ca64612c25c65502dfa1202b45c3007e4900aee6f6adf1312d84334f549753817e4870909903f19f159dfe67200acabf8f46ed8a235249c5711ca53e9e0eb4562f9ba783578ab365e654f6b165818dcb03268748f4f3c0dd8f1abecc3c7edb92f5e7d1b9f4789e85de92305f4b319219fa60701a5c157a4b865f224ad6a297974a8129bb4bf1e886e600be1d731024b6b352b6bfdba843c22e199274638d2cf939f47c9455b529f8a9a60e8688fae2ed6ad2462d0312be6b754807669b66a1d32d485b62be3d7957f5c28d154fddc76b144ea9fb3b746325bcf9eaed64fdf91a6be19b91f3492768eb510002e26506ae050a57faa4c2de8e141fecf3cbc8b96215637df61aec65e7ed9f67ea8aa1b3137ee9e065a6c3172b601991905b9f806de452490707aa344a35c8419104fbe057a6087fd509d8999e88c4ddd4e721f1243bae1663f2d568e83139775707bae9036236f8b5fe2a0f2bb3be1b76ec4ffe36632af782ef3090de3aa7fc9fef3d0100000000000000000000000090dab05adb2255f63125f4f6f582814fe2a821d6b4292749fcebf0cc7837a18dfd02d153884d9a267fe1365d58d9a9ec2b554be2e3cf4b5d053fa30fd0b1e2e463c978f783d57ce4c1cf168ae7124b4bb35eb3f155b687c06eb45abfcc17593d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000037b20df5d1c4c8560e8d9c1110fd41c02bdaab5a8bc5b407d729f44eec3caa1e36fa2f77e4bef258c910461f3acdcd63f0daf361022d5c515cc2fcef8c7c893c877977ba498e8150c2e3a1972fd5a18854b393bf9bef6e01126b9a3422e86004ea90e0dd029a16e3202d2b1d466c04e1ce8c539c0d7d53df0d43203c4798b28b0315eaa530c3f9acf7da39c8142c6ba9a5fbd0cfb6534edf902e7bf235e806828f0304689c86cee65ea4d0258857ae7c6a4f5d9b98f16412b3699cdae6c132382f100a047b0592660e925501fec1a3a4ffbe9435ccd8d70fc434de470b756c89b713d62847dc5ccf79f14bc3f919bc074ef5a8be0e04989309f6a2e198458d4cd848f70218ef44d69e65d82ef931b51e74438c4b1f068a72320fe022174757f8fbd370610302056a7f4ee0bcd2193b8c73c844ca0be1151bac7c8ce556c70058b9a273d8a103078f1cfb6d861025789458eb1908ef318da7b8da578eb6062fd3571ef828b7880223ccbc61e527449a0950f30dbc61c4383e2a8726bef15f9c6a694491e459fb29021745ab975541f5824e6f0c15458d35d9403cbbe761d42fae8caff4ba00543f7e807fff10174477eecf6c4f95ff3ba42eaf11a852af7cff1be65a879a0f688d32981b2fee59dacf60480b5b72f9b6b3b9525b6e2b47a162391d96270ba1ac3bf9cc8019c62991fffe4d4b4e720cb3f2caeccecc77dc37e136c02326f1516f33727414a9df76c130153a61e909b2280c12d60d1eb7e2b3cccfb1615c04a312fac98476e7f9119c036475f67c6902d3611d9c00c92fadffd921b90cb67d3a12c49f977156b5e6288d112531a6274df92657664f87b9cc81f037f6ed0b0e6e5d128b4d6f0e355cea1d6fc01d73437c04e072ad6af4f7834081ab8688fadc9bd8ed058a08b53578f4f91205960c4b6f677f140b1ea7642c334422d19bdc1e5a689bc33f1b9e16ec6a6a4099d08e2190e7c0c0a6a1dc1203be462d1ba61f8af960483b6d840abeb33c0660dffb7f50185a1f6c7b7ebd9c3241cc906b1c57801f56c6856f12e3abb77a641f5a91849f2f700a8e22117cdcf62c4f51ee5a2aaeadf04f18bd60b7e4ead8e5a8cf5df4f602cd81920551faf616e9b84700e3d1ef9df16db3e05476b79613d6cc319fb720984190dac96fc50354a49b8c6f358bf70cb41195c6792657bda69505059c6e8b60085576fdd8879c119cdf41d9853d5fc3e8b83eaea5cfb2d339119286fdb41acfa3f9b134bb24bd2acff769fd1968ec104f6db9e908d727ed2d27118fb1fbbd69a905d0123481a9a8789973b9fa94bd0eb8a8e521e173025d37eed002f279d1a15cf6c9b461fc8befc45ab8752ddd910d2ff3ec6eaa5c54a4a832487901da9c8be2ecb3868dce6eff3bbd938dd2616c28abd010fd5f4e4bf6119f7cfe5d6faa8264c07addca7260a9538cb17c04704a45d7e2f73879ae8d1097e7fe4f9b8a839f460df3f9d4d638213bfe1caa9748d1a562484ca6b03f69573c2baf6ad46bd9a1c1076f416dbf466cf07c6bbcd4588a6a8cabbbd2337bc372e19be29bf46d53731a8ad2ce021c7b794d007290fe630cbd09e30a5a4c683ad2210ec9e3c590b847db37ef922f0b388aa0ed913063c59818401a91c5d3fea4deba9d0151ad7644ded438220a3283ceec17c7b69839615d9ca20142bbe590278817a9dbc64f4f25ea0a56ecc680f3b03ba4fbd3d3c4f78a4619757529358b2c67e9bb06068f73300eb46310ae10662adaf02acd020b7178d25e0d4938a2e2cf6f3980f93d0d252381663dd79f8ca95077b0630d5c2c89ba86b47ba2d45c509f9d92dca00084d25b175263ad667fe5ce20164e5ffa6dad22847bf647f5fd1d30b0e97b7929218be0fdf3d573537a8e745b8ffc4ace81b14657c345ad9f8fe95215090b8e2287b12d78e72b7dad87dc3080e8ce5ca5bffed0b7f5152f6ce4be4e7cfc6b60ef742f7093c967ac1eb39eaea6c433059ca351df8e8fd64096c3fa7b42f1e7cb1d2d0baaac604d61d1dc2da951b0e54c02dc2800308ee76654d358a793f72dfd16da70128972ac28ee412db998a6827da7835b9cd9b3035098d06de337a5eecedd69bf0d536791dbe870f221c669980321adbe5bcdda97051078c613791baa4b92123b01e7246bbad9fab28f7bcae531539b22c3bb30f68c973803dc66c50b447ca9c70ac7bb8b3335444620f91e54a0d4d78104596b5059490b7d411b306f1ae983326f47d3eaa499c1e74d983862130981e916dbe0ede4e5ddf783009480ef9846b44c75a8ee5b928ddba971ef5dbb9ce54496519560153d4b7ef9c8de04adc4749c741ee214c331a7a5cd789985201a9c4f65aab6e5535383fbc387b4aa33158891809aad2de11c3f7bdd7e158d4ce3f14349b3fbd1076cf3021b40708fd866b12722be4f9e042e06", "6a6500", 0, 858850649, 0, "9b3e90db2ed7769dc90392e024d9a741cd7782c3fab0f6ce9e54b78663b2e722"], + ["9269560803b39df2ab9d275584e4d6f2b7c5ba977c59c9ce37893baf44f2ebfa92a4066ff70300000000ffffffff2ba1a49f7d815efbb66e152e43e7c56e297220821277da7da23e902f15a3656f000000000152102cefe7b63d0919c18035fb284f59c9ceebf8426420f76b35f9c974fce095b7c088444d0200000003650051ffffffff04e7bc460000000000076551655352ac5273b0590300000000010070d6b002000000000153b6b9ad020000000009656a6a536351006a657c86cdaf030000000000000000b4ba35040000000088c4cdb60ccd69d540db24b3bf551f1768e8ebb41b038ef89466b3e93a64b93f1f1b11b4ebbc885bb9834f743164f0e72c4f690495d7c01483e38bfc3b4d716629f84eba528d965ba0a4a4455bf18daf38e9f7c561a04e29bf8bfefe843e34a60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074fb68d6afc4aa9d46a40a54937555a94831ba729795849511b4d6fadac84fbaeac2ec60b29784cfdbdac27d9d81c18c769c8c4fce1cb151d38afbf5608a1d916e736d2e9005f874df0c5cf84867ff594295852e7bb4a82630c44c2855f60aa2840a2c9aae0773ecc8b4e0b718b4a4ae51fe82fc6281725f6823702888ff4c3e020b4659b8bb03d52979329f4f0506c916eccd507c3a3c80c7b035e6f5731092eb020e0db9bb6eb78a015b78645c13daa7e65a464b7addbb53b08c04b398348c4faf0a076d45e096df5662e55998f7fb83d1bbea81fb27a9d763678c62205609c3f8704cdd1a992e97f6c3e7163b5311e2600fb8d0b0636bc5d95ef68ddcefcb6b591c032df8d5a4307cf699e67fe1b0edc2d78d6ecaf8ab6d55b0c8423b0ee3ced85d1e0216bbb533cc1146e8083be32a589fa13928e7df7f4b8ddba50962bacbf368dc2a02025e63a0fe5a332f2a5c2d9047d4b348a884d2bf77d40e724a3fed6d1a61e366030f1e01964f1818096ea3da46fa9d416d33d6100ab638c1bf0504581231a87235020aafcada081a8d809b4be39344179a9733939a06bd03d5a0916a86df028ca1c0c02a62aabbf7731b95a135f41bf866edad43eb8644230ba5cc321ea2545aacfafb95b8f322ccdcf724ff691c12fbbb3b42895d72cd606c27c8f0dee112d52558ee7138119fe2a7a3b447998fbe3474ec4e92039e7f3b9e1890bb92b744f11d0c423d04e0069986ed10eda54ac5798a1208090cf0e02580a85d7549382da1263d689bafa08e3e16cb13f93229b437b4a9fe956c39fe927d2ddd8ed67a21687d9e728e2992d446c2fc415b0f46d1210309b5d8aeffa4193a854bcc52ce20abfff4cd919fbf1222215c8c4498e3d0d660b3bd95f921ea00811701e72fbf358ba540eb3dde21b36c39554bf9494c8fc250243053ed9adecc868371215fa4c9fed0113160d56baaf923ee99ae8f446ef01441fa0d3f0957c6e79087b728434ebb0b9381f4551d701042593966d236034190d0295223edac52773aa55543066dc66a323254f32d336f96f23e6e031a25e381187fd733e9cf62ab63177f536fca579d8eaf56d42475f4bd64f860c0c5c5429454529899dec3a8fff54450155d60b7cee4c2ca48bcf8b357ec344199b3733041ce06eb94dd0fc6daac041ad3d37062f4e873387af12b3989a4a578adcfde108278033fc58c1c702761dc246ca8ecb0135cd0dc81bda0f2c280ed03236402d5dcb02ccc671995b1777d2cb0e9a109ec3fa781c58ef59290c93932c1959985615fd8c23ad0e2960270ad8a15e9cc98e9f2df38902398259dc8fb83f7d699f9ea2711239fcd49966714a48757270c32829bd51b458e123bd0d0cc791880be6f26eb5e4ba266e8e13b86bb366ae7a4b147e16a2d7214e4a698502d447a8ad0c6afe357dab455ebc829e0ee1d9407f2248ffc07b30ace6f951f886f6df6165ae7ad99a56c2801dd07cdeb57586f2d9a3bd367550bbc99e55031f7051d330a7d59eef94ee110b537e54d01411d102b0145d496a6102ab4f7dddd490c352214b2632e1718b7be2ca04d7df1374d4252cacdbedd5dbebf0eb8a12da58a87b9210efce97589e33f0b104796548c2782b6660746a7bd62192261bb80a33127fecb6aa329a1dac48f808fc9e77fb23059091e6d8c6fee13079223df97d758218865bfae263b5a2d0e22a6de5deb2c3b2b27de2b8774ec461cf93cbecca575148c3a109ae66eb447307dc1631a9c4b1ef7d2667a1dd97da9297e54a8ab19afb30c5d9527bfe2f4a0cc8e9bcd4e42c8efac4983434271f43127e71aa01fd7d69a9fe318865899ec6b3bf76f07646279ce97955a77603ef51c8ebd3d226680b3d8263de07a3230fcc595a749919c75b55dc2979e0c6e9353ccbaa265501a1aae1843c1b3af650dce06012bf2fa488e731cae92d2c7e04ea3a1d9c37070fb190a5994aba5d4a5e4ac87e6af584f175b345f6da543e004ed9ea751cdacb30b72fed69f108c0c0642e20bfb9d37039532ddbcac7927200cc42d2288880f598530098c591bf505488e5126425dfe96b3f8e4b6da7219c88170b448a1a0ad9bb57c6189845a78ae47114661e29e1337cf7849de8b6c51c8b051820b9669ff3165e5b5d6be10b99fd7a83fa6c65ae58d781ad6beb0bb1380b78ed6d786a05a1a0ac90d08e36190fe49d78e0d405edac46520f1b91f34e26ec532bc54b14dbf617ec9cd41540a58f7ef4a0f657c96b6c8b824f545483fa24140a6038cf7c896101a000337cfa7cb9a3e20bf6a91000000000000000074dee203000000000200422ae3ecce9501b50c039a1abbeab60379a22e4dd432227ebce51e9e7cc0dd1c884befe3b3164867e87d4af9da030722c2fcad9d8447ee2f72b021f0a3df5906db2ba7e901a7a947b9fa1fee650c1257dfc661803ea95d42684e2665c78e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000059b25524ff53521347451283e5acf3594759043d61249bc8b65e72b81ab5cc9557423410203045afbe7c102b86e754d74a11d5901b2cfd8d11e307b1edc9c33e9e21bbc1eafc4000f3409af0c02c8d59cf1245c757cf5f80f21b56f222b3bb41cc865b8544451ac795fd8b9384aaa40b9c0b9f38f0056f888667e837064d40f8022df706d62f0d524f787186840b111d0d583cdd6f49a5df83dd90a4847b707da8032e924f7b7bb96f8f58692d9471ceca66edd9f8bf4bffa3fee834924e7721f6450a03dcaad3e87da338612015a70585c4cb1985f089ba8231d0f1b264054391757c9ca93fea97ef5b5888fb4376ded11f88f35110cb06d60fc662ad4e6050679a90022f3e7c0011e008897a4108c13a520998e2f38c9bb937545f59c484b9840aa99a022c98f5ebfde7e1b9fd2f8bc766131ff91e41cf49060096bf026e6e09be00220b02157132700385da7148f8f097da54882e21b8c3143603f5994f51c27068e4d5a3020254cd4c7e8e35a3f258cecfdbd8efb9f2d7fa76a8683f8d1cdfb9420d036958032f4388ce73b16c9d3eacb5be566d3da97159e565aff5d40a7d28880601a44e1a2511dfcee44365a9b10cc7eaaf7e07b50b0633afea83af65dfd0f1b9b47a816f80e21ad03384a556947fb8b436877908671b80dcf9ed637cab436be5188de3d1f63fde362c5b3f1e05546552420a0a210550390abeaf5fbf7a927a56d61a24db3366d4785335ad94842cf997c748367e4699633948df77e26a1459dbb1653f30a53b8f8c386aec5d1d75c85c46570da6c3dd4a0d21f57d2b58b274865f12c90688a749357a66df112a1b745749118b2b89ae6083db14012d69a770b11401a5477d9a4a7f9d8ba7b64276f016a2b1ba744b67270eaeaefcafa820a8c786221a4f652a449a3078d7f390a09c9f8bec86ed8ceb9ca5706568e5bee1eeb38bb99371490bd6fbecd787df1cd444c97f13511911238cfdae196c51987e5334c1310ad97ddf174fea7fffc8e6f87daa3887d6dbd0d65a5afcf95c96afa09fe482cd4eb8d5fe320e9c577d8a82762d6fb21b907e245193b3d36fcad5414c7489b84851f49680bae0066770cebf7ce35f77081691c25fbbb908c59aec1d0d60ea821a284a2eeac5999d62192cefce736c9f548e05a5eea52d9457ef8c740d5291cc2b6703bce611d1d1ce6a8897ac0172a669514f4540fdb15167b61a9fc694a3f705190713024c0df36b429bb38f4c3e255c39a812f764c47de9d0e1c324e65367d661ef421ecfca2752147eddee90593c476c2606ffd60762857bf168d44241a1320ec480b24ac2e35e54d9e44fa3d6a62e4c50a9e7698fef41d27de57fcc589dbcbc1e93b40e1b1bc4739e6bcc1afb120548b21dada33fa677d5057404be4250cda453428b0c465facf8bcf550c0ee4375879b10360af85e72c07affa66128c330d22c3144b1aad193a7b504fe4cd4fdc1f618d3f362c83ffc26de957035fafd4765af764ac2228a783930ed874b16e6f10b5440b0879113405194993ec5190389c52e4654860793ad61b99826aa3ca4f8be99fbe3f7092e5a82f2889fb3af6be386be216915c20fb02603b0c2c403cb56f0a1299b6b92ffc7837d721d69d76ead2086097abe55c109a464f9be9f7e0b6f836b037cbe5e79ad31ac37645bc8ed957dc6aad37b98bc85d7c69a45e1a4519a04090bf4b577c404fcb3e5ebdea8f975047b71e52dab0be54dae304fb09a32a4355591b3714f6439bff7be211d1e5382331f26a5c2ddcb6aac4b26a926d4113da587d31db01422637277172e69184b48d1f898438446ed2c66af54bd54b42dd0c55978519628be2991fb1cf10a6871664c87e9dd522e0ec72eb96e0f80daa1ac507eeca6bd8e399ab44d3972b7b0ba437b3a62fd93b9bb252ccdadaf1babfffe506002d53cfec2e30b6a88d012d1631b7fedfca92a425d465c90f6124d6090729d2d6cc23f8c134293727acea1b7bb4f5194c9ad18df48eff9577c8fab751d3d56525cd09a1eb32d24de047ae3186207307ba2aab8813698c6f09b8e2b026fee55019113ad5fbad54189fcff1126e0d9e051a5ce14fbd5205117c09a28cadd39654c0ca94a6b5eeab6629040e91ebf7f4e248ab17885de9180f495cb58256e594c668818020212128ab130a07c3926d5900155de44480f485d08452da14746ba30e47bc0ad4873a8d232e306178261a2e9780a362c2d060f6ccdca03efc6feeacc709bb66a8d53405fb241a83c2bcdc7ad7e35e47cf1ccbae2e3aa1a028dbef03590dcb9000000000000000082fb5805000000001e612bb8774d2583d3db6dda6372db030596609346227211848141ad680be829f2ee3d6878e8e6d104b119f59a3c3d010d3c2b7de0fb87338b28af8ef3abed531c4405e7521d45e7ed1fbd1a6e57bb86f877f83b3fd2f31aeeba203f45ea7251000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005f8a79bc3392acb19cb48b9c5a5ff85c7044f5c5d293225860c6ba9524a6dcc2de4b87ca2bb445755932754e168cf8031078c09ac634d1b7a2f8b0f63fa8c734e69aa5225e4421495d7e0c860b4bac8e8a80a2d028d419861479d8dc8ac78f43b4bd63532a93e29e0c1b6eaa9beb2294a42691fd001ef6e55e04fa00ef4d6e14032cf012ad39ff8b716aad7fcfaf8469fddd77745cdc80de8755af4ee2bdb82c49020026e2f63348a552b2503309856a69629ffde823f177039ba0a8f808773cf6620b02dfe911b900d90c0a2530caeb91ef50ba8f05274536536b3f52f29a73bfee87a5288460c99ce8c13d2b4970e8ca06d838c8e287a913d4bba388e0a4e4a06b52022259b3b21091c8a07a3ac69c247a79b2c063790764ff741e22cc8f1143546777020486b9eb41d100f45664d1ef0a7ed578e4a0ac694f47f9617a433f5b858406770228ac20fbf9e5ebecfe464e2706e93f33d097f1797706bd37e68a7f3abbf53003021d22324dc966de902f6fce2feb1481f0ad6885365d57ba4c2d8f5c3cec5395530219de8dc70542ea9d386076cffc6212616bd1569c525ace0ecbc1b247e197dd05f42f9171744a994957795874d5224bf2d59cfe440d1d527ac879f49c782d2810be8f9f301390f74811e384658019f717efbaffdedaac40a7e17a04fe8a0fd15fa11d30e3e0d81cd7122c397e309436fb9882f8b9963086bf8c2b1aacb95f4656c383128c2c6237d6d3c10d589c971f3634e5f539983454c4fdeee389041f703e05cb01a721fd354b536144f13731b3ca1d0b94534e9b620da5624762a98a414db8bd5fd4044f98a44908782ccf1b7f69c8c4fcb864c128ca52f489bd5a0bcc1cd20652052b365f9006a6ce2eda0f00ae420e8902aa91bff3bb6bc765d40f728fc8e9074f74db0e4747f52f4179181f0ef2f9130c40dc02663ab68858edc9992806f50bda0ddbd95b319eca64bc0fe36f77ae5de0a19c625061c39b2c964d1d3a221c8055de3a002718a2208f963029c0d5f12f763e3655ca6297cd46a793e64eebc6b808f34e7e4b6d89a445d4921f6a2821906464a08feb4510149c5455dbd32714ed8428a21c528a6f05bffcdd4795a5001edfcfb275ecb2ecdd08bce7a6cc5bde5dd9798543f84b9094cb0187392da005e80f5fe96438e1dd2f5a01daef1afaccefd93f1f16545726dadd640c73bee7d089b7f26d242526ebe831f43080c1c08b1d2b4163aa0af89c51a3d54ef5cde085ccc9ea2543b60112b0aef035def13252b8c5708218c6a26103b1c7b24b7835b37ef95c7b2fe159c03b60b5f2246fa561938d2e9c8f3e7c7e613a7aec2531003a42af500943caca1e74025473bb8a6237f020346b1f8892eba22c3e910182bd5accf7cf03a280aee45afae18ab7dfb18c518ff3532ee57a90c220b536fdf22a6a46488c7396911478faae5d2d2221224e3ddcf0af8db7a44d2bd49ee3269aa8c54b589b989e0a40c7eed2cf91f2ad8e6e6444ec65f34719ba6d16d5609e2faa55e2ed91ad06718913ff7b2dae336d6eca6ebbe9b84d5eb89c16d4432430db4e0b7422323867d2d7f3f395a7bb1cc17f9e4cb7507a8cec7ea22426cbe2d3faacaca80cdb46b9ba06b3808288515e349a780f44382ec9adeb0f26961751f2fbd1f596a2b27628a8f5a461bef8325faba6be0d158a5b694bfac66088b883b8a8f12e461270fb28b41bf7d1159e89dfa6eb1751ee3888059a2fb418a83220a61e5d6afe8d2149d72666e79b26d30e7354eaa0e06ab4d96d2887d3f55b7ef9e106aa43be2917d4f35b144ef9b1b4590f6a50a33055dd94fa6d640c0f8e534c4c071d73f56c06f8d3553ded891f15907d81672b4eadb3b3b3e779b914cfbe5ca3b61dfcea3d68dc1ee63b8c0a8f43e95d1ad6c4b4005d97cbb115b7efeee426466911afc24d6eddc2f4cd7d9e2d59dc133cc1db325da9e24ac69c7e8bf23cd6c0dffb03c79f0b3109a37db63f546e14f71155ec307b3614b7cf1a6064fcc032d40f188e5a6ba04c13a2763de60bc832502edb31a570d9eefbeea72a35f9da6b0297a8152db59a75efd0ca77f5b4744a66dbf82cbbb07c846c9cdb6add2089c6f9fc28235ea06105913e5af202102d24080cb199281cf5af66f0a1703c21fb652f409d32c269fefde1d06f1e50571483527baab5efb0e1ea7d2c0cca89a62b195cf7f738c0c46b7e2624c932bb9ebe457961962953bcddbde31296c5e4951a2c7df1dcf7feb31a76ee552fbd5e419c9512760f6deaec52c4ed8ad03cf95800d28c6c8ae7c9b2ec4a6047b07552a4454a8a429f6e5900cd2665d1f6a7998b261d322684db4fb7441945047e91a7db3848a290f877e2004caca7a6377506f3b4a4c5e03e54a2af295e9b90b902989e9b28c31431906bcf69c246ad7d44225b246b6596b20d", "ac516553", 1, -889140828, 0, "739b1a2f48bf6af7acdd28d053264824e3aa103b6bd9ee11dd16c30edcd4872b"], + ["5a97da1103c5a3c812b6cd566f057b1f291484400585889a185021728647be1f33ffa6e0bb020000000863510051ac536563ffffffffc626b10c1d9d3ac62e9fdf0faf51bb81037435d471ed8cac0420c6bddea2b6aa02000000056a5300636affffffffb15faff89307674d8fedb61272a0a48bc3607451ad4243687ee9ce152b994d7a0000000007515251ac53536a488817290499d054000000000001632b66470000000000065200535351532610a904000000000700636351630063f52e3c030000000002535236cb7aaa02584184050000000000000000000000009e72daf6f79cfcd56d62b2b7316ec513b5cd069fcba49d8b47cd422d143c1164b29462e0f735dca46fe5764bbc9e94f45e3291244c79b06d38209fc79c2cc98986098e62b68ded6a4062a0458f0d7e94ff17b3c4560377583fc2353d7c65d7fd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000097bf40ae43d683cc11113de21413fc344c4a97c43560043a1d270109c3f6d7e77674538174892b34a4f0a8e698065db5b2b4f5b7ac55dd5b0c3e610a8769987f231f3b71a131e187f848ab979f2b5532ae6790fbcc0b0392affe3f0fea7f0c523356f273b3da8f8a7d72db363149ec3419b4bcba26dfcecd865fb9c3ff1aa442031b97208fac96e66d47b5a967201f2fd849638d45165219642311cec0b6d12ee6031246da09277d5f7745d80dfcd876ae765fa746ac1eecb81d96367ef84495ba410b0298b9ba31e56df3598b84123fabc78089da3ded56272cb5023aed675521810a7cf8fb82eaa163db91b587017956ba0e08e034e56b999add129256f7d26d20d6032ed15ca89badb626da4524a59d4bb2ed3f9f51b150458cd7f0762d22503aa066030e07d3360b82d58b7b458fada8aa1a8c8e9172bbec57d743c4c2e2e684fe507e0319ff2f365b03738e429a1242f03252f33a05951e55acf291f2cf0f2d8fdaf43903225eb63a5dca7f4d8a7794b2c4fab35017db2b5fa4368f40524b09f14fed12320228ca6acd830abbba113444e188d03cdc3ca4e93c4110e10582e0247351155ead368cd8055238b0f4e129a70a0d46bf9a4cbe539a6528665724c5f1f0a10925d289d848c2746d553b214eb085e23863cbd5af4ec28f1e3c746b59d3ca89ff1dcd837a9d9b4962fef5a514008fc98f70778c63a8a1fe0d04b9cd834aab4f5427a6c7225d2e93fedef8a102ea78ae61bb44d4bd9e4950155d7bd8688980ee8cacf1dd3ed00bb2a0ea507bcbe8bf8f5d25a8977def47b3aa467f132171dcfae8c5df8f9cd3447a3feac6253fff5a541f3cbad7a96a8e33231deb4e8dd345edfc3d0947315d77a611b5eb3e3719e1103e8859c2c1927982f41a05a0c250aed7381f2441c9e2a62574d30d14cee930275c5ed8f62fd1aa69512ac36ef701762835e356e33af4cd3b60eaa636e7cab2e8d1ef23c0b52afb7b972b33a2f8a468a079a9f758bab7b76750910a7e3449d0e0fafe7d10483c6773c76811a1ab313ef6eb85fc0fc47adb68d7bceef19871518c2184d554146733d45ccd677b5bfcf2d5ed6c9d72fed77c4f8b0ee66eb964284e86f4850b6a142b193e7dedca22a380375299abb8f0634cd7762096cf4af4cf5dec0f2714c2d6860f8b8d57716c8007be9b3c688020918c6c014fabbbfd275c58e6f6e9b851cd8700195d85098c9336956397e3e7ee9b1e0fdb097c7d3a574413a3df2510869c848f03fcda9ece0dd2f7b925d3f0630ea01c44012eccda3cae3e997ffa82eb2c51dac26afb4c432a20f12b25caca1e94464a8b0973453b34e4f3ba9025ca01a0c4ee11a4a6d8dd4b465416c7b1153c2d16abcdd2efe4b1f5dda687226b19b7ca6902b5eea9f3cdac68e8681657a734a0dc0fc788772fe60e6d4be9e877dd8fa057c70bfce80948f43d8db6b09331180cd550c29c7e0cd947f6c40d6073e57d7f2c5d057a38d35b8d8810fe1115459d6a416b4d06fba4da3fe6ed20da27976f858386c8bd42b938352a17bd269a3648a391556105447d117172bbb0972fcd034ece421465498563199c10521f297aabd1a2b174e280c4b65daaff784f5932e55276abfd6f2cc8f05ed3d63113f41577492b79844ecaa36c12caeb89580b2bfed0447f4d5e24f986199af350017a4ccf9b4d8b7f1cdc591669dc52af10bdfe7e168c0dee6bc0e1cb5ca746a1175edc49e2cd0e2aaee22d9541326d6568c7526f90735e20df36ca6009b4dbce63dfb71b71918072bb905532068d2787f1654f8496dbe2a97c070ec86a2f201601350cabe5dadcafb61dac10be80d3bcfadbf7fbee84117fed9bf0e447df77408cba4a627d28d951b35b8ae65106246d2f5ca4f5f1f96d5c65ecdc96c555a42b576f05dc2b674c4dc1c4e3347fbece01027862636555de4bc9be116b081e065eba7ca5c6c90bc0cec98e33fc518315a99e2d02280f126cea6080ff9adca81e72851a62b0a35abd361856ab1016912341b760a266681718dfa16d622a09b20be37457371234cd65c6a988e15e223f843a6f6f25b4a5cc8482eb132792f56a09b1e18db3feac476d26a6358aaf66c5c75c61d4be7d2ba870fb393fcbc84a91a70be58278a304586cedfab67ac46ea3f5c96aed77f511cf70289a6218ec11278a3152bfc9a793779816ea228821ee4c4b2ac527ea2bbd18b610b873909225f77a05d0fb7734746cafd492f8b06423e5fd96092b66b66d463db01b9ba4152067206af22c8775cc86c511190206b6996e9dcb050f29c0660452010000000000000000000000002b13257704ee3919cd230c7a4966af62f1a90433f045ec9ae6e2129fbb3da7fbad04b0b57ce63d3cf7a1353b294148af8a5405d4f9e78db0c11b4e9870ac864161a297354ec93fd05cfb6cd66325d0802f5760963566e2726e3777aea758407d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003a76ef1ee54018bde846cef011d9ab1b223496732db9ec72e4793bb6e8634462418b5686695c5c3cbb860c29c39f012ab01627ac5a4cea8fb3e90b22a271e3b9e545333660d151f74106b9bbe6f38f5357f6d8643870b81efc146a6e80d6f34c07bd5b18a5863df33779fdd48789d7441428555e93f906e4f376b290576300e2021aae290fad0c4b652d201fd5375c0b012920c79f42f6de4d207b23693fc1fca5032d64f8464ba7f0bd650e658a2417af78512d17f73e1bcad4cd61a96c055d97c80b0530c6d20ab2b3597c17e9a574e1c41349db4aa03ddc9f278bf6969b1c69d901a08a2d10d087ca82c71a6b5ad03aac346f2ec9a230d473ac7002644fc2eb7adb022bc6f3e7d0fc4610dcbe5e687ec36126008a3b32ab20e6ef9076ce433149537b020cc00ba74aaa3d2c1f4223fb1599ff769561ba7c91c2c5f749ea179009c47a6703254180852bea2939bbc040b5de6e78c85d2f76fbb35b7cb6cdfad85a1b358aa2021c1c6e4460082eaac0e6dc1c046902d2e629d3e02df5504125ac8aaa5d67a24d020e535165337e84dc3effff2b2cc7e6801a6a444c095ddb3a98a8696cb67ae12a148d7fb79201003612f9f91cc85d8b121703e505901986589ab41e6c07aaf776ce19f50f4c934dd6ed1e6d4a98ca104c0e9ea09bebafa10a0362ffb9dbe6c6f84891f1bfdd52b30b8124dc462ae3b2de451d8b5111d1b1fd70e88e2b8f4dcc9a86b10ee74f1d46e9683c37e82df6634bd66c5b6ccf3e2aee636b99740a32f64b5bbd3fb72ce381740575095236ba5b1ed5837864b5e3ccf7bac822aae04a9cd7a5e7926d9e2cbdcc1b080e4f36cf5e00c7d96ae765c0a02ce297a3660d73f306233392caa4a53efa12bb5c0528a56575e140c7d2124880138776b848ab7676b76a87b18d90dc48651333e495f3a19e321fd6b132e31ac332056fe03bff43a7f0b8e699ab851853b034ecd9849a2a1d7662d0a914a9e353c279778a0f9b43291fa286365c5e18d4db29981477789eae822336fce18bec8a6d8be954c3dd6df3d6b65ff960036bc814b4f49b6e3a098c2ce45ca83d47955190c625bff90b556c459358d5ef93185dc07099caf85ed1d253b65f37a3bbbf84a4ac97d29a260f36ef1e701f671f6736d7b2859a67dbb36e288999c890569834a7f33c24c7f3085273c24c5e3359a371a7a1592830a1a8a6420a43bef1376a5ff25bdb9d25de7a5e588f6780da511a417be647bf9f64d1d48302b0dadaa97c1c9795a857694bbdcf77bd8df57d24ecf209807f9570e39eb8210ff7c98a251e45a84f2c4c20e2d5b9ea904b844e8d4bc36171dec924d2cede0342302027df476847159ed8d20b300e5a624756d951dd8d2a1735e335d526ffd52e82f58cdad0e5e734729072d87452eadbd7761ab33477145b9349030a28e4174c5e21c3dcc3340d1761d4d68504c5dac6706fc5b896caeefcd449e5ee1b2d79c887e0fc594a6c4b4ba5aeec0be9255a79d6e2bf1661485eed7b7ee5472413dad290f7f361db9d8e0ae3538999a300edccd30e2fb8b6302f5b77a60bdd7558627445a5370ad763938433c368877623c4971cf13c597472b9a8207ad9bbb94370cde20ae41aa4b21d3e5f96034b5a8f219003a8a53d5d7abcceed4882ffab3cf932ae639af6ea9312ba765da15b740726d208934f1a7c1b15eccaf8a16ea4b5039c91168dd283c8db5306cedd31701aec283c9400dca52decd529fa53aa44694cc006e68233349c6468a47ab1fb573e1d6dbafba157a5c5c7afc4313f102d54ff879f64f5daca9b1b1f1e730bf3fa15db66622572860286a43a1fbf48712307664b9c273c9a5e176630f0e933b9f1c5359b38f0d52f5cc55c16bcb0233e2cb6b56be5a22aa5afe23ba6d2fdf68a6e576e7517f784f25dd663dd6e5f8325680bc7c0afee464886355cc171c66c92e6b09087c7cf761dbe72dd055c071f4f993735ad2270589b97b7f0f0bf2082516b294637760b2d964920dd9ee0ba07e121b1e6b4f34d7e69f403196e50d2549c368b5ec9e7ffcf7e6f04d0c84afe893a0a05178f1116ab1df2d6cd420b2b0e674fc5a4a43ca76673b344ce7dc771a5fdb81e64d169d4365030aaf339d6acbb3d944aab7ca129daebd95cd4b1516af3e299cd7f2fe327e5b8dad83b138aee7cda36fc21286c38926c0e84cd894def4b359b54bf466fd8208601e43f214fdd5062f237b949fd3f7f51569362cbe437574c0b2eb0d3bac11fc9b7a4e7f9e4306e53989e050a27ad0c58e8fca336b829b3843923a74581af97ada3055111551414f393c4badeaa8b981b1d32795384cfd8c35735f227550d3fc74e12c25e8355fdbc517e6961ee6e2bf67c5db4cf6755fe287a0a3a461aa37442c68d5ff5dc8eb89631d3cea395145d2bf55cb80e8aa163ecd4cd7cf20a", "", 2, 243579345, 1537743641, "e19bd85f20084f9f562a0fdfe1450f06834866f9f1ca273373a00edd7fc14f2b"], + ["34159f61033fcf5e6d20d98e6b0d64c0e61e0dba913b7659936d24482356ddbf53733a98c402000000085200526a5200516affffffff42965f6dfe3fad9bdc6ab26b80dfe679274a4dfebf90372b5ad4cdd1bb6df87e020000000852536a52636565acee0178d20751a7ebb2b410261fb7f46e7c6c69c35d8bc2396215c0e2e75ade86bbe1ad670000000006656a51650000ffffffff04ff12c6000000000004ac63535295b14a010000000009635253635100ac6352e941c5040000000004525300ac017f56000000000001639ffc559b01f6773601000000000000000000000000ee31c0188986e89cb5a01fe8b473082f01b6afa771823bf527774d566140a8d78a49b1a3f811e8da0d3e683227345c1b9e39d69e4eff1d1d254c9ee6b52b9d5c8be66409938501ec1ec51849666c77c0c449f9606ef5c3e3bf2ab151fbcaf8060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021dca8baab206cecc62de21ddae8972741b5add4ad7bfbe1a65b743e735e791fe39c955b4c25be4f11937aa23ca904ec9e59a60b8fe2750f4c3952f701681c27d0f1fb503b08c0c88930a1fbc4845dc2ff238a646db212fff465bea90531b19068f8197c9d39f0c234ff4ff17911b1ecfd71bbe8d5baf2e52da5e8096716c3f3032f8b6e2f5451266c729b74d1bded3cacd1188021ca33acc35e4874ac55813f95030e570266f1437fd7e495c0eab63f94a8a816f1eb4d60c4208229bdec7489c6710a05a9f60b9d9614e2e831d46bf29cbbad2064edc8f390b1a8c837a1cfc82ca5daf0a519e2e1c87251e3e4eaa90416b794fe468c047164b7f91f5a08a03d9cc255031798d09d3006413e684afb3560526627a1285a0455f6fc5475ea70f8696058520322afabb95bb7728c24e0030bd5173de5fb1cfa4d530e1c3cc822e2ac1a61dc580301ae006f313acd966bfed637cafc8aeba9b6a9dd9cf0acf8f295c1977385154d0215534fedc41d89d08cfabdba30b85aea5349469fa1d67dc3ba33a900188aab4202062be8cbd2ab47134418065ce7971ad2de150ef981f5cd7dc0224ac95698f5d990e76e6b8c757ada6bc1f1f75747bcc30312083e2af79d9e76360247cfd88c8deb273c4c9c83abfd27275cd8e821b413ba6634632664c26d8df655291062dff07d931dc9f482453bfc0d2d801f81dc74aa484b31d216eeaf7c2527b7f5ababd0a47df131fe5fa7bd0119962e382dcd8fa32c770768eaf7487ee2ec97ef468d50c8bb89b1890548a9594644501226ee2de257e7594ddf449e1ccc7a2a256072d3d91861013b55859146df9bb90f5e1c9a2348718fc4a1d33ebfc6bf1b4c08dde02176675c229ccc088a0e313cdc5e50ddc56c404abd94b9cb8a065701a0a17427bc268e5d33d819f5e34209ee881847e8911eed8c5fb04cbe1a4ad32af88519a5bfd30bfed46b79a870acfaa0566fec8baa1ce59858bb8d9bf43d6edc109f89bb0c3839eadbae50f16e4c5dec49d4193fe7ee8fc5e6d1881d88bf1ff5af5b86390e97d2b9403245b944da414c717d82a96fd0b7caf0f9c045a410a06b7b3066f669a636484352afe607fcb1db55b438b3d0ff9e5b5a15750e4408094a4c01ebc0363e06b0e3c3f624b353c6bfe6925e0e75d6c62c70c6f2bdd700f4e2ca5529f06c498a8bfdda337d47142d173a7543dcbb4e868cc3de8d3cca319cf4d3a368636a85fc0fa1856b71a6bfc7695e4767e9925672c3e84fd38a7639b74e72f6bf3e62787cc7a416028cbe84591b3b01b8a8da201feaaef678b1731652733dcd00eef6c5176b95827a74004c12243b8b744f6cdeb9ae1c308bda543db2ccd1989c94f01e700cbb32f0c3e11b371b559e8b37f54f2fab8b6548c7f04ee60b352e26670eb85f536212c5807c7de5c053c86c62a2995c16f200415a6e844d12121fa540d1b0f71e4e5acf018f03ade409dccd806688c596b529eeedba955effdff30cfbe2c40d2751f05595c80f4bc1afb410561b924b674316fd201a3e431aed092cade35288bfcefd2377610e0f9b6225ebd201e5d3dc65aebefba3a763ff57abb2323b8d609b2853bf5914c830200607f8a27997bdf26a568eaaafbc2cd7ec999a157eb624715f73c995b3297e7b62ad6bf1ec9ad536c004ed6c9bf5781100c8809d29153fea9cde60cfb3437f84ea50dbcf4ec76689beb5cc4c1a07a87f489ee475a09ebc61671cb4612839bbb30fcd0c6b0477389f9b2e69afb859fe5be4f792ca5cfdb3c3e91008a3fdd595b0cd47d787a4d97cc9621501eaf8130e6a2b069acae89ede3251f698cefcc11a672702bc505a0114bee7684c4d1fb680d4d8a250a951a26fa50ec715f6545625e41fa78331ce618af864424263fbe56bb1e4db799ee32b0c55ff87f034a6a067be34a725d091e129b616428fcce9fcead4ad1b79c61d1e10864ed1913530e037b9280c9eb40066373709cea15fd0afdee4d81ebb31aeaff2c408b1f625251b2020e6c34c2e0de6cf6e8ba2f0974fb1c359a9bd784d378d26aa811885715d8ab1f35ced9a61d973d3bc271aa9a3003538b1772c8526811f66e43aa0b2a05ff78e95a40948809fea0e7299eacfab5149045af39373fef3348f4b17e8d84b0442b6b29dd1d9f801d2bee08227cfebcc0d0cd04f5769faf2fa81b4936d0d65f90125687ebfdb40839db11cb2565863f9def3051a0c73adf7552931acf9e1a743e9efd81b9d1560e1afdb5a0e2454446530b0e649feb7c6c801598f25ac5125bb53491e99ec31e2036e1ad9440e94deb8216bd5b2c90add5b5f79203510517f4ffe44803075f7792d796ff06c2a3e23930736f594e948184d4eea78598df1378d5c07971ca16cae506f66a228504944eef9c46b9345a5a186b6f7d7d6df874eadba322f66aade6b3d0e", "525200", 1, -1941464378, 0, "06391925e7d0e6d1eb380031824df0eaa9235a1178b00a1dcb3054fa38588879"], + ["030000807082c403034e0ee83cd69174cdfa9723b3c59c30c5e6b83929b77fc345e15e45bb27630f490100000008656563ac656a5365ffffffff6e68dd8dbce502cee4e26a9b1ef96959bc7358261afea537c3b0f34b68aa80be02000000035352636eca3e63fe27cc6fdeb8fc33514cd154213eacc840c9ad7ba632f6e1de45b9a2c678b60b01000000086552ac650051acac15f8f952047e7df004000000000163280e3d0500000000095163005265535251632bebc002000000000452005152ea90160400000000055365536500d54714a1f6098edc0300000000000000009010140100000000674dec17afa8d9dc73dd38de2aa21cce63e93e5d94463d89833a47640b672ad4c056319b454d9879788b13cd422ddf51a6539807c2efd7a32286ebdce9292edb0d51bc9d6dd22abc281ab62e723eb4121978c8c06550a3a3949d80379debeb1c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b42f95b2a1419126a257cd654169662e9db4340e872240da3b3db7ad1e32cf2ab5789518878b14afcd3fea6df18f98bdb4cff097e79504bf3242bfa76def521608be24ff85b645ef0ebe21d2c8b41effd24be9ea137d4a1cd7773dc77ddc2813cb0bf3146cec145bd4136ffe4dcf24f7f6a25fb59213c2c485e31cd6f5a9dd7603015bd39c27bfc0bd932d3285542aeff60e3b6576a88d036f8efefa5bb3a388b2031e4edb273c559cc6d57751910e15c0d200a78c9a0824f97ae3b807e0307b8d970b07d9752539d841ed67247d879d6658067030fe13618650f68c606cc4baab32ff9601da6aabe14e140be2db90df3814a2663e3482e16d15ac83006c8dc9fa28a00224f20ef495c9065f9d82507cb940bf2c4465b532dce26e5480b5ace9cbd0b575022a5ff78b1456a73e960c7a842307dc6a39a4a7bca60cddac2f11e992d754dc4c0316ac8eecffd75081c64fc3103a547c470959203095877af052356510c59a5b9b031556253afe275368fe3661359d5e7d2750ffbfba6e1257636631a6166c75c446032457abb090e7278b97e43750166519e4dde503e4d278bab63de8808a304a8acd5dfdc7dd58ef9126e4a2cf2d63c3e14ff44a4d77d97d1511be783e9e09001d8cf72c94cc88cf918b0c90a68cb8ee32c936b083a4208e3ea1da960f3f7ae9e80e6999484fa1d108d6d46970feb13a9765d6b4ff6c1ad126ec45b07dd7ecd97daf413eb7dceebab91097fcc6d9131304ff0ffc9593e66abb1901921b35378cc8c0b80ef26dd58b5a577bad51ad5690db230ccd7248fb01beda77cb2e5bda8ba39dc22ab5a6a80a3023ee1eb044a68361709b0d6017689c9e1c17cf95c20978f84a7317a99fcbe59062fb2087d7a1eb56d85628d6559ae7d7e6a35ed4e37c3c4851bd2fdae2b656878930916eee17e8a4dea400c0a1513ca9db208fc6adb17d59fb5d7b6defb0668f30977bdfbbf3ef93380c00d244b2bf3a6f256ce2442af7e42a4b43c2f5ef1ffd1118596777f508b25f7efa29858871b09b8233bdd82902b5b4bf267e301347dd854c9c4a49272830315906db373437e90246bd2cdaac13ec4431b1a6937dea6d669a45923fd9031a1c0363838e0d7265d220206e78ce8951c05b605ecae4b8c5a2246553f238eeb0c3ce810dd04a7d923f606505df36f8c21b4941fe7c42a04076fe698119eb29a3b20f1e3a021aff3f1cfdb0ead9a19dbaff27b8e0a00d908be58e869d88d403ab07603a4cadd1ce4636b18d58a9e42113ec0431b2b0519a0bbd3511558c31bc01ae20b69562fb7ef5693cf878c7293cae1ae62713e6535c5821df32f69d53c0c91e1b14227f8e782e4cba04d35b3d154ae027f5a8db52dd6aac2cef38c521f52bbf23922ecd0ae7e4c3cb37e16de69bdd4ca67a284677c4d148b14156bb2041655886440d8a72ea0c771adee0083d45054ba6fe1502accea883757d81c8f34b49ac67252d268255de57d071998e34d1aabc36a7c2e0abbf90ee0370b88b9074045bcc73c40ea9fafceb99d704eb6ba459d9df0cbfc8579d8eefe9091a0764311a7fa8d6c620c4ede1e9291850b19b55b72dcd6e96cfef6a1ac82c97b2f9bf44333407a5342c15b43406963b091516dd33e2ea3fb64a4eb2a362364e2bab1dec605bacce521d1e30d802a8a9dfce677999da699f35d3518bd4fc71b4def3ef87f5e04fc70b02ff4f9ec887ed0407783210bdfad4dfdb2f484ffd748c03d671915b79dd7e34c9ff0b7a5f1b74d0b34d5794523f4588e62cb44939aaed6841390866eaedb7425002dd3e637995f7e495e6537c0e6a5016ad7237d048d952ec09d0d116fbb44028ca23080cb7720d22d73905ca576547aee21dc4a5eb72f930f73c4dfb2eea6ca62908798c89d2ad75d6f2d2d97dfdd80290995048ff080f617f640eaf4483d1b68edf437d24a833332a964576330e40e6d25e00fd6c34094e24e0d08bbe48e63d4685cfe1dfad12233cebfe8f5bc4542072503d9d2814078dab0dee493195def20137d22249c2e3ae46a093c63ea4353e2e2a22e3423d8c7e979fa353eb5e9cb0d8e2dbd50580416a2804a5c4259db9f171abc16b069658cb610d97bea4f4e5742ef37bb935c732d9ed9b726fac8b36cb052019b59366ccb2e51a53694647e56d313a3c5e0ade104d8c9068d449d313b58a0796b711175ee3a35a272833abdb9df05588c53655039610ba2c2b1100486a84b7dd71125c9394e5565cf88f203128ee0b6ebd26596d9755f42b99ac0366e55c552b4bea1ba7222cb485b681819b0a4c030000000000000000000000006e90fc39f0bc8a464e93ac9d25794148fe5ae653cf49811cb0c1299a45d16d9687ee97a5d18bfe203f3ffde2270a004e28edbd76a891539c920523546f6b88bd51a05334d858f10430f5118cd59a5c3505e0e76a8d8985d4093c48fbd1f82ddd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d14d602b46aa6b6cd45aa0b6cb0ddd33f2745569ab5dc6fee57ca39bd8004e7da11d2bff0ed4556e7cdaeba0d383416decabe3a5f71d3d3fafed886066e72a137224d30055faa17df725ecb9630580232b867fcd85319cbfe8f0adf8f64f3041ed521bfa1283f4b208ef183a6eb9dc5e2239c2d61f86b76c29464ff96119b69503139e711b7104037cd1cf84520f5a52ed5f3e8ceb290afe9d7bd810a959aea57002149f96e5375680f84949b6b376b185f1a20e575dbd19b034cb010cdf82fd79960a085e2b0cc175b39f72ac08d29510ff7f760c3caf407ff0a84365d00f7e70444edb30d7adaeb2d5682eac42da4f7791bbf59e1eb4fc3e3fc4662f5552b8d82eae021d166a6da809e5c1f743f9588520ec69217728436c08d2b1efab3baa7b38198e0326ef61c180e2a6f1957c1109e2ad520b879a7f9a555652af1efc4893164f7038031529a0bae5685c9cf3b7a260cade9148ea5a8263f9efc209eb07055aadbb18ec0226441a4ead162bb12975c9b6271f9e220533f5ce0aa5ac8dae354b8e2de12c0902154cd473dd4598f01e8013230c85ea30f15fd9873abc5e11f4a1d232f58c3a1d8a086fa6c296205771dbe678b171317ef9866db802861dbf8250ec9314689a0769a9dde430631471984a03950d682f7fec5a1c558d01cc3d38b97a71964698e461e8630626460d46e0040d31f39aa57fc660f603d1af5903d30c0bc1122e5db5e5e9d25faa07cedc8e1ea8fd91996c23a13088499330abf0f1038032b226f73c2b696b09a77a42cf4ea83ea334de781571ffed8cab7ebe922393092e89736d1be533d23d7530779fbc1438c0d626afcaa6aaa9d6724d7322a57b9ca9da5577d0bee44ac7a9036e6bbad8fff78ddbd73fe3f537c46f57bc7a085c8ed1b08b339f0ffe06bbcc419f760d3c01bd2f70c02c42a6cf3e3d6ef1cfef75f452cbf0edfeefb8059a06405fd27f92790d4393542a86d67de62f851158630a997a278c90993b73fc5e7a39d09bddb8b5994ab0ed30e36f29f5c682c8226cb0d1d92ba8046d3b2593b883e58bde2f827a2d8744bf3d59c5fb79cffab50edcf2802a8e8311325601ab90607190c6247634a59766013a67c3f15947d67858a054488bbee9f7695eb89ddd8983e43e2912f39835be898df0a1481cc40fe5dbe02f940bcd94ac2917cfb50d0df975024a7647e61384b7f3c031f0233151c806954d650c8d44f281f91acfaccecae26837e192df443cd29087b075296d4a1b783627412e84a4067d847feb468a29a9e9eb60e345abcee21000e830f157cf353060e5afd52db1d66476cee7703dd31614417cc11f33d08db84f6bc804381d4c424933a75a02c0acf37ebba6babfbc4d4cb3f15d8e43143d98e0f53074a632f526c747c1ccb4cb47e2e57a86bacf5a11d6ca638b76ea03ed9b3eddce6f02a03b118f0071371fa8e03e54df416f5f811fa2513c2dbc9a72223cee962241ac04ab4ef092b8ba1f88625be9852c7558e5a2caa8d3f388f01dcce4ca042a88e70471a2cae8295b1ff8fd3dcf9d4a46a435b636e90f28c1c40123674ae187a17d88fbb27ced6f81696e9fd9134991376c9bc0c331f65e28fc51ca27a2bc1c5289c30a2cd5f4509debc95b98a3f546753047524477ca7874bcf53726d89bb250eeaba690e4ff442432a7bd5bc712a2e72eeabafe53cb4960eeedea232c4d68c2576910d5c9986b247a8fd9f2584b823a56a3c4392baac6a79b737f67b17bc2086a1a002b39b8f7f21d782f3ae642b1bce7113c398a93518cba3087f5b0b53d823b14f8386ff9af039201088ef0fc14aa1997dfd54f34a17b8f7e8de6299c532fd8964c6e40a7951f931086414a5c80231263b0522c461aafa137e978316436aae9c81174528bdcccf628b94d0c5add848f609b681b0eb316d3098bd81d05f7f5835ab9f615464aa92ecda36c4c01bdd88384ed8324d6b083151614b73f5d0e1e3f611b555728d894c55393ce5964df64c460a43fefab115132e468e6f921dcd0a35fb18f96208315870714c0261d717f353214d3011f6256b5d5a168f124d51d6c0d2b4ad18019f532dbd2f9918d2e0301c353af3d9b3b335bb72d6f2dc0fcbc24328d26cc16ba711b100846185352571f44154593790c8aeedfb56d7ced86598d5f057fac68f519675d8cfce47f24bd4f85e8816dc770627f08d2235191e4cd7ec545a76dea3fde65e67f35eb52078c2f0a2972f58c500dfcddf48db22c299cb321e824a74126725390220ae95cf508e1f62b6a32ce6348e4283857214f0000000000000000d929d304000000009067211c1de6cd01f52ebc12e47e994720fb8be55e8543117e6278cb912de1f5a0ee35365dfb30fd8db30f1a11fa5e1b059b764a1bddcac364d02f97a5bb7b188f914942ee15d90714af6bc76b59d187d30d186fde9624ee6fb057c153ac8a10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f362c8be2ff5d5d6f1888c57d35913d77744e6500b25df82c20f814ac1129985bd1353d8aebd73c8044450e1609640ccb37219ef72c191964ea19711f3deeb91a84d900e97c1c08c41018379564b23d2d951e39ccdebfd8ac67dbcf5efdf481325101b8ad616dada82289d164fecfdd46d6b4ae012789b8e43df8c6b5ae365a022f1911ec5ad3396907ac76737d1b689480ad735e8d4574f30ea88685a8f70faa0213aa0ae32555f8f1ded176c327902231059618e8f6119445dcbaccb26a1fd1750b0361678b07a5937670d8b6828665b0ddfc6f7aac89832eb27a9f0b254db28679108c6c8b01d86dde6db8307861941bf3aabdfd4ee6793431b32131ed85334d6f0222995060b0cdfad2e352e45dfe3570768a27525285a0830a3585980c6c1442ee0221f27dab916bb26c93c53d582bfbfae85a56d2a954c53bd216f9f8fbb5e3467a0306042ff4df34527286212522a244aec058fe31469deafc745d59b31fe4a4936d021aa33bcd71bf2d833afdcd248ab7f296632c9a37a32b4c32120846db5da0ad48021450c38bf65ae223a8f800685c7ca4f650ee906411d21eca780a2c8c4e8e17e0e9fbb50288961599c4f582045c9c87e91ff3c98b2f5371a63548a5223a494b3a9e8cb4c5d49d8e1efaf1b733fa36d71afb150781069843d9b35cdbffd5665e3ef7e87289369dfa4a64d9e6a0d92816f2c66e841150e1754f7bc3e98305583121662dd3e9947b272b7cc0582ca7aec540d03079609efa4da66432c5ae37e2e0f4c14689ea424ca2ac7b5bbd7ea358f3b7bc3b3a2b4e8c1258d5aac603b717435ff30f5a08c9d20d264e4a3184cb06a07ffa5f771c9cb93a744f9fa1d9cb2e40be053b3380a1405f5bdba4cbe02bbe14199914c34b58fa4573b4c94cd42da3124b516b94a39a25d343c46e525ec4790ad964571e702115297bab9c6e3e82587f0b3b60afed328c471adbb3b783449b45031fa74126dda0fe9dd2ac1f07008cf656565eebcb9b42127b07d39ddb1b4f96f1bec7837a3f3d32ddbd1e55c71e5c6c9fa107d63743b74e90004972b259282714e141f627ad94f06570054ba11afff8539fa0cb6879b750ec0ea9edcc15e41728dd2610dc735e8784ce358a2c4c8fed2052371a2eb1b61d399ff8b978692277a0852f77361a4ee7f743ac48dac877d6766073390a289ade172a6426a8a11b2df22e45a182ca1426202be7672556d927a8a14be2e9977a36261f3c85735ad1e7fdcbad909af183708ec714c123b5f5fd197c55ef3b122dbe72ad254e839e89c9b2f87d8afd7e07b6ed932e85d38635d70d17426801ecc134d9859cdb0edfc67affbd26633a421f50a6cb05781469635b36e1ad20a270b4dbadd4f7908e77ffa0b31cd016637ed7b7f7ecc51fc59fc00791a04c0154e3dded7c16a2df94d65edfaf494a085a3dacaf8768b7d64ac3699cba898017d3e24a75b12496a26b369159e5105f2daf6691ac59c2206e98f4d5e7beeda94c5f5b8257c3fea59112664572c3f20f056e33b611514e0d1dcc896b419f53bb2ce8c181490819507caec7ce3479765d215a7d09b85f4b941740b782673640e0bfd0c4c64091c90d23d287f0b87be0d0e9e9eb131a13ead13ca5f59748e605bf5c4d105d74cf2a3163e2d3a9f7daa5eecedc8b98256c677888a1b5d7b1ad89eb76e44cc5eb45f4862a7a2fff3b26b0dfb470ee3e649c99ba19897c64c8a73f4f4faf7c8f1adfe1141bd218e707f3eddd5e22b5e4c658e82885f6980c3f4a22372fd526d6733b7a5a5955457cf48c58880eb819752da5e433f802c8654a2519c43a5be8ce821c34ff693431c794d168bcb572d9e4775801c5a0fa9b855468463af2393a5942a768b27b3b87a47c19689c11e1586d9aa5d2f5feee3e61707238e47c5b8d9fce63e51d98be83c89a656bc7c1f388a37c735a32c92e0deff866b8e15463967a09fbeac1b8fca230d036be36d29e40737d365080df8779ef329cb07fdf5d2c41ba974d7736627cacd6fa5e6b60e8628f19fa4598e9548b888184b8c0ea23368b6dd2b87e7905fbf73152c34bb624c4f28f118b5d99e817b95cbabbcee5d92a4510c7f86de8cb813831006c4eaea2a0c7b1514b59a889fe3ed3468edcf55aabbe624fcf030dbf8ea1857fff96f5e186f1fc006d199b1e89118b62d65b08155e82a24d696930cbd4e86f3f29a42bdd83b3cf4f559877acc704efa43f7632747205455e20a59d87a211d919fcc50b61c4886c0f2ffc79dc933a4c39608b484405099e7e0da5cc6f2f9b541ccb50f9b95bb363cd024292ab169185ea7150c616ef0a015dc15d92dc378812224539546a1c401dbfe34a41cf13e840faaac9e13762a502f3dd5b30f479fe4e405c512a0ab94e0cd32545df8eab52bef1fc12d4251f19becf84c6a4bfc2c9794a090f", "635251", 0, 1857423729, 1537743641, "5e4b3795f131c18af14f7a2d3bae1c0cd59c08ea812e74785195c1678e92833d"], + ["030000807082c40304f1ea2f997b3471c07f92ef2b775d96f9e0589ca9a0b388b514719cf6f50ccc140200000004ac6553acffffffffcc43e0035ef0b96ef53ea8c72e0ddefc44b3e31476655b9733e30dfd9619eefc020000000700516a63635363ffffffffe8adf488be0da743d7230f6427b4d3100dee1861b2a8cf69254c7638b9277ce70200000006ac535253005230e04d330bf7d6541af1b9d166cc78a41a6874eb42ed0295b4455298b368ea78ebb62a91030000000253aca7c6ea30010b2df502000000000251ac18fca6100000000000", "53656a", 1, -1751386165, 1537743641, "fa30c6dfca2dc9f0764b1e0807885f83dbc7b9d70f47933a15af76679a44d5a6"], + ["030000807082c403026fc588eab305832dc7a8f2bf1a6fa7a7979b3aa82969eafad88b7c41e345283001000000085252656a6a6363533cb1547e7eab97379e7d412d9d65d4f28d3e8b18e067d77851d78b55fbe88c9db18a34f80200000000ffffffff03a6006902000000000765526551ac53651e6b6003000000000365656ab602d20100000000085351535253515163000000005294ba4b020000000000000000593d720300000000a29d5b15e2aea406b1cd3bc9c4f34b98c88107bf1525282dbbdc19e5a5b36b698eed86e68bb395f77d377bf5cfd93f89eededd16eafcceb9d4f2e3e4120d69dd205a22aa25ca81f371a2383d8d049b9635d94a10045eac530dd59f066b5119280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013253c06a1ec2bc849883f454d8d714bbe291a0ecb3d29ffb94e9b14a93d8327548fab10ea0255c099066cd00b75be28004fcf1ca9c663442436331e06de15d1c6ee6f44cbbd32d6306d0c3427f300084ab63d6f63e771f0250f6b06ecac558067070684f44b89b9f25d341f740602e8c58522970724a295d9d60f0fb4ab2016022e353714783ae333b560a88660f8a49ea1a6686485c84bf1ac961206ba7e2e16031dc1ecdc9d0603be559e8f43c909fc02e095561f8a4323847255c6cefd8175bc0a030d7c730e0c6d714bc36a9f7357abf112d13ba022720d8af8627a39f38b3b459092c892acbf15c34ae1d03f556520d0ae1596bc9a2e685edd0579de701adb4b031cfe887af4000a040ed66f24efecd5da74ede1f89b66b8d0ea07e29bd123af64022035887085fbad82229725a7f81eb12cccdbe4af9119e71e270c96a06a757812032414682c587637841eed431e3359958f8580c0369de0d32ec9e07ed9d00a487f0304aba5959f05b7125ef1afd7cad903d984359a8a8e559c2685bc73bb0b51966e022c75cdeea3ac5e95097f6d74f1ab84d4709e67a3e841f2c8fe8a9f789644a6625beb638289f05bda51f425c7abb4d8ccc1a83bc18bd28b3c8775a1758bcbcc7e9745c3adb89f4d37a144b568eeb5c06364fd1f6bd14e3028c65fa22ea915529a5dfff76a7e77a0fd67b3a86639ad16d2dc5a1d91c83afd7267efc948f1742c40c521a6386748eaee5ce022e517b24f7ea198721cd7f5c582b08f354dd49fa36043350d97b30709c39b755315adec260c4e4d6843e10f57713b705446b28d8895ea5714faf7b8c771b95e6da5961135e6d7b0ddda75a16c1f3f9bd9bef0f719d6bf70b682ffc2496ba5b22b79dd82dd1f2ed98057086ae9311436a6cc3d1c2a23697f4391e2c5184da198ba1ae457fc0d865c47bf9bc0c0edd1274270fc309aba4309b23aa29f2780a1c5c78634f95a7d9c627394024261c38183978ef3f24739dfd3286ac0e6bd28b853821f29a3d6e133f8dd3abba9c4ca44e956d80e151e4a09307f2545cfd2958673b9a41bf6c4e494fde25822cf753aa5c69c3d302c400694ed3e1320d85603439dc897b3c6318afd2c2de5b5c491f8306d22e51da33f9da2844637e1616d18c2830cf55b8eebf6212990b28a73d41eb3a05e4311e1e1bb26aef49ec8077194c86035b4b2b0496b980b81678e6e061025d3fdef03b57062aa26f6bdcb7a48e6c762bf950c1fb716c9160f6f561ba575296f997b1ca419df09cc400f96683d7b0e31acbeea0d0edbe4c09a4e8a50f04567a238d0fe0a326402f9431f997fa2df593a051fbd41a344e9e043ae901eeb91993426ef00a44fc32f786294a918e6dd4685b9171382f1895407ca7ceef31e85dddfad0227af96c83e34ff8593094c28db6392c3d322c4856b7b23915e06ec257ccb9c6fe1c87640b83dad8b0af3287041a3943681669e7187c4b2f59ef1a0221753717b3c69a9123a618871e4e682d857b75c86521881b9487e2dc3e32c380a1d5f4d8e42797580418491066486c6636525366ea40efea311e8062005b778cfcc2ae1703c79a3bc65de9c08db26fce9b85f4b302f694bfa3b8cf1bae98cbfbf4524d4db5bbf33ef538d0d72b090a645a74e04f91b871f7bd68d9174dbfe8d292a7b2a9b58dda4b84cdc68d48b27e06423927b44869377f90b43ad6b95c029501483e54abc19ffb919619a711ff83fbdc13dd8ed27928a2362c4c7c3a2985df4502f96d0b8812c0cfb41e1605a713be2127d93cb5c81a42ece4fb9b3fbde10bb5fe5a1bd4a3975498a08d76f6c544cbc64dfbe414aba1dacf4f07ce294d74dde1d2470fb1673d3b5d962c7036376b00dfa4cdbdad277825883e7e440c0925c1e917db2afad3a53ca5ab8af24058d48ea164833a165cdb3a7b0b5685042236c9cc78638f3624326c859ec9aa43044ae27a18a45d422bc848a925ca10f88bdd30ad57cf29df68128c67a945d18cf44aff425abf895158aa9116ba9bd640b5cdf495619e44cd057a857c6db4e79ad37775781225b33026a5913175ee6689f545386c3470fb1a43be4d5b5c170b25336826b8e1c1bce11b74a1e0633a18c2699b541eab1cf55684277a6b2871784fd27b56050c40d5853901e88ce398e77fc6560de2aefdc2ef9b8dfd71976541d58eb6ad43c37273ca7476a5379600798bd394f17443db74744fca0de794ece75ef2bde9b9b0957347305322bd773666e0a7f0c4612b8f3ab39005cc50d8405cc7c101e558b0d0a493bd373f91cd0764d320500000000000000000000000051aaf11aaec97501588f4a5769f9aa8f8c0779d4c7a703413f6bbb430c31e1408ce5cc48724ce470a3415f502c9506fc6395a57be2537be8989260a6fed255af29261290a332a420138c8ef7b362b81f17155a0f8bb0b581e1671ec50e1f185a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000032bdaa42757f14d3297ebefb2477fc5fe5d5ef85f12bda462f0317bb654c72433f9ed14462b0c77b42e004cbe55b1cc89a4f94f21135158d98f8f5d6f716cf8b7a7019f10401537e3f1cb7e213cfd089bb9459c0d8c2831141f63558e802ea0e0106f949c62cd353a8e2a9129185cf1c9a71c7adca4fb459f26d89b2940dc93f022395a203022161b792a2a6884a32ca55cddfcdf9bebb2a0b3c2ebdb8802858220204ad413c579b00ddbaebaba18efa786213de4d54c50162e0eaa5233364535dcc0a03b990d6e4c8ac49c439d9c9fa61a03a34080d26d9cbaadd1256c9cd1ec2e8256ad8410e2da7551fc7167292ea492c8471fb063e293908be13454881a13b5a3c03014aaaad7311e3e1e6464bc72fb87c6faba40553b330ea592af29aa7858003c502058d97b45cfa67803bc4bb9df486a15c984c590d1e9b5d3d2dde8e06c6628a44030289ee5925722248871dcb6eabf78080d20f459d5e91bed77061d69d012f78e5020ce683818987fa75cbb25550981fea1811bc9b63c98736585ca373df6f063565021ab4f315649baeaa527f61a469704644ad5156a4bba50b0e4f718b532e7cef42b5ee4784512c7166ffba43264af6d4a6f46f313eb44f7fd0b016b9eee69b434044a0632ed11972dc022d4a37852637bcfaf91608aec756d9ec7ca4706659dcd54ce7e83d148999fe40cd2ce85a280ffa2434446b406af34adf280b93cad853a43de068a2935102420c90f239903ea8cbc9af774ed730dcb5b3c005bbcf3d9252626b0b8a54c7e99714be235c60ddb98cf718722a23671547926dce67b19be29ab393fa125e34e96bd0a3c1f674c39fe058ce0caf83c59116b5b38aeb46f5a3368f55ee629939c40b71f9ff8570ba8051027cb22591d54c3187d8df1fd034066d001fb946311ead3b4d561795739e04f78322671c90cf3101948c7822f5f7cf9ff040e5e88c5b6fd27266523cf3741e16e3bb34e59c15da8adaadffd2f03ea85d0582880490c82d007b2608f83af422a8dff75186c00057098bb9226fb627dcf3dd1982ce639fa5b14a9b91a5e0140504fcd6aa26f66ba0283accb5ea8dd7d539d60eb8c0af8cfe8956e51894c88cd654c9bfaa4cb8269e41210705f8ecd0411d798b9c3b67c3ba7ef0277a0221cd32ee42d417ec31fd84be996cdce8710d623afeb83bf2b7a0e39dea025dfe31f8a42cf7a702bba0881ba2ef3677dabd78cfb7d4af3ef7500942859fa19b293f7752cd0ed9de3ddf469757f08867f358d7c8f648fe1b72e0e2ce1f1c57de3c5cf74835ab1a22f8513726489242298c0c139678768513eb4c4dceed2d83248a13df98c9af7e47b189109faf50bf9b14d0a3dce86f64d15bdcf9822d77aea8fcb0b6147451363752e26d60c8d1856555bc49c4973e0cc7801a779ea4fd595f9a503cb1da6115ef628f5a64d926c6f1a0bae693b70192c92059b274d73811adaa2662b3a82ce1ab0fb8c52fc8cb20f9cdf4e389836e2bb0d63affa3ae684eaaacd1a71655bc11f80c14f45f734b72f80340d3bfdf5fcf27b35b1dc2c30d12c1e863b0a665ebf007bbf83099d6de281af9c5de90d760ff2fb02d4cf40c458e318cdd4c7edf58db3e18134f1b5a61f8a73d8a7d42ed176b0e1a946c079d25560d20c99563f0aba5eb28ba991349aff8a4fb68b29c66796f1acf9776c9ae9f8112a82628b9698138e207f6c481fb59a2e5e0e268aced286fe5666c7bbde1ec49bac75aa461cb2ac467152c4f8c0b0c4ca18dcacfa7a0f1fd0a7cf6c59d691f96c058471cf0ff975a0e6ed70b1098cc01804a178ec5bd47c4f5e5db50c6f96df2d95d97cbe57954e9cd955398bd519783a5104d9259559ef6e7b7033f694ae3901b6762830b0e62b37320f277fcb57df530ed46054591bd756bd74f64843033d5e7b5dcc05732ae7d4dcec5b963af9101e95d34fb9698755f6524bdc4267342ab47867e718ed90f0896760d626ff6018b56adfeed8df025023d2d3b9ab2a71a57d9f6bcbc2db74cbf4e8a12c034f4adb9499e81f334fbc88a85d7e913575bd15e56aad3b12feed401a3899ba596b48d818a6c59a69cacac3820917c66bceff4aeff9d57c3456374fef643e333914b61dba72d92ed600f1b049e881b5e7b6f9203da125d52885fc6e73087944067c17e11169fe4781386dd1ea7666b3d8713f034c542fcddcd1b2410c79964edb7aef3f9c36e673bd698487dda6d0ab0b066589fbca67b69142c7ef34eac849f8b80d299a1dfcbd05e5dcc2e81f5934f1b1d728d3575e8cae45f7252d47b04b098d72c207708040e5a7795e2a3df5fb54ff4fc83935fe6991e7e4e85c12d6191f0357af77d486e54f1481fdcfecc6e7b7719e4feccb6e9ee043d7dedd0e7b90f1cc49ed74fadb85a95ebc524ba6e560a8047dc753b97c0d109f4f400", "00", 0, -36157852, 1537743641, "3964d96c8c7ca7b161a537e175774c8e00884e16fa6469d268aa29d165268e27"], + ["cd20ca2403bffb1b679c89eb82be20cf9e436d747da941f5828c6cde3b69ba8ab780f45b3c00000000004d64b8882812f6b1fb4726bb1cf764b6c9e4cb255b300f5092fe694578905b3c952eaaeb0100000005516a006363f38adb11d056b91d9f801a761ff8d4252fab8e513b39732207327591b6519b1b762234cd00000000095300ac5152ac52525121975f54011e65ce03000000000352ac6a24c9f7f500", "5153ac650053", 1, 1687145526, 1537743641, "61194ed560514b592b4efa90e5f9cc480dc3bfe428d69779da8d904e403c574b"], + ["030000807082c403039e532459e25d0ed1d6553e8d7d4b141d6b9d833a0daff9a10b9959e49eae74590300000001acffffffff25ee12be25bb4c8f389a5758289b7b13c71e9b2921cc9ce7ecda87137a58524b010000000165ba17a07dd141308d6fc06cfc35ff3a4f091724c6a704c6186f173f164cfd3c9be714006d010000000551536a526501c8f129032a0f5a02000000000453536363f652590400000000096a656a526551525165515160020000000000acadb18220de3aac01000000000000000022ca39030000000075e168ed89333c6a80ed1910a8204bb7f35e3b81c2335cea05b40bc81f06faad2621df2a6aeb6095c3412746d82a07447820599021d925276f202243f1b464690e92a93c01aa0fb396e543ef8258094581126de9948bcca646ea55c90ed6215a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001315508589115d2a3014d5a8a99587c1199a88fd4334fc85d18c15fd6ed02fdfbf9d2c795ae7db421e07294093c77db4a3b2975872a2b2bdbb1b21b7775eea741f062a218f8319fc01e77608478aeea83e60f3b3df41d1e39cd9e09290ed0781356177bf8ed5ed3ed9245f6af0a9f855068e7426e579e2e19d0cb3722172d7c40316a2f69e46c70e8a60b7bb17589570bc18dbeb7609e4d7f67266b0903a230513022f15a667b7b87c606d223e3630c5e4b7760d81e0567e03fd2a04bf4c55af33240b054cdc010774bc99d3e4661371b50626c6a544e29718e4881461167fe286cd1b7d29cb93e7a6290161297fe3af663e3b8fff26279e72afbf6dd32f8461defe48032f06d726c9f023c1582da21b41aa040cd525e50b43fe30e78e973ec323a16ae9021b859912a95708f9ae36ee8caac4859b8f4bb28948bafc4d1e5076240c0f927c022a771ad84e1af50ab7f9c1d1469ceec8a9ca34fd2d5bb5ad6b8209d2caf2005c030e0b3c064701242ecb7aeceb57cb340c1516cfb6f48541208a44995815f1623b03230ae317771f5c2f0ad4ccf9ab5f717aac04c28039849870c2e47b5ec83f3638728534ba459fd8ff1e3e28817d073333f76af0e90f63218d81d92e188fa6314328c6a1a067dc8886341dfec05ec92af1c0fae61c6f612e4cd1779affb3d0992490b69f900ab5a3bd0cea139d5fe45136b209bef95ebbb099d87070462c49491af21d366334e4ffe551f7c3530820d542d67d175b61881188a1e301b8a5c188c1179bea4ae0a97c85c369efb69cae039ffefa3e051fd757ad8ab72f5788a052222a36fb81408047cddad909e9152e0b9f1be2adbca931c73c7955063f8fc3ec35d2f14a69e75993522c89c04493036ca2d3ca28f3e42a52bc5b2411ecdcd49c3f451b7e9398bac24b067313efad866997c39bb81dc5328f8bdb1c70d8e4cbe6d58292d4b0f0bc82d9a74d160a09eb91a1fe3b610dd023995d8c63923927384278620f1211a902027904792aae9359c797ff68fce2b2cd791122e0b743d921868c1c20f886c548cbe33b1d237453994397eddb02b7d6087929ef041f77b0611e543cb2a2efb88031d9f1c99a62156ed25678e4b0079322f8bccb4a5272d10d15615bcf24292a6f1347465bec1699032a698eab8983d81be9e2e32ab8ce9aef36843865c296053bcfa6ba9803dbb1cbdd3bc580a8bec0c4ffc90e678ce2a135b79927cb4d10ae7e8c442c4e5e797b5d58ebda8474ef74664dd87ed46562c49bb522c1a1d14196f0357d85edf814acc1a5ebdc7bd75fa3950ee4246d7d41ca6374e43f934c55535d9e7e067e0929655d498f4a881d96798919d65f56075ab224c2fcc95690d9bade6fab809862922a742b7120f57d4610e424dce5a5774992e1a4e897f042d72e161860f523e82d954be8f121c50351394b739bdab9339c2624dbb58e3866329a9f54b87d6b65e39a0a2cf332e46a340d79e6d482339d22a44c98f0e667637952f4ca65a235bba3ad201894d4b0175a2ece95cec36c8f25a467c4172afa22a03dcd997419804131731e432b9ed82225bfb465a93080879bdb50447c14870310cc0a62ef781e08081146b0aaabba6230e44d5966de2b4d6db906c54edc087f420fac61683d4d0a0db1ebbb2700b697651f37645c46fcde35368e04ec93e116c8668a8cdc698d0093b8926251166e7032e09dd204ec3d0e0e415c06e31f2328880b4660f050ac6a05fdd46a0825599c3b5499ebd4b473648a28374e12b4d7dc378c27c752985fdfb706df26b8fe632f7b93313d54c212c612f5788a89c33efcf71553b9c6014b22bc3824a697f830c54cb06f251bfcdf50902492cfb0efd57456f6522dc1d80615f04d54b1915d716b3dc3a89edee4e5ccd60a1da32d1372588fa6dceccc3636756ebe60b6c579f232a0aedeb805b189e74d1fd8b940f857a83136461ccfe9ed10632d938dc57be0f233ff4d7aa35ad0af515958d4929f7e82b0b0e3f9de2bbb701113611bc2939b7d38b301360a5e241c4b62ee434424038e11441d1f4742adf5f32d938bb45051cdedd5b7efb1684e050d6e015411570ab91e57e009f024dfe51d9bf64312aab68bba51087f2efb02e10e09b763e3172f87fde55f290003583322e18aa8ce7eec0d1db9a0b82707a5ba8cc44f318bbdabcf776cfc93ad11512622abda18bec5d0f8239bcc9a1c1ae52c80d4c813b6844ee347c7619700c70b4e205b95b829f4872a4308c55b8153e57d6044d0fd710a009841a83476a310138410d87aea5ea8db1597b4756fdbc2b100ef2a8ed91b4aaa9794abf1acee49177151542f718148e80edfc489a6bbbea8c88dc94ecd37809f5f31610cd2098de2d44cf57b23df50365ec636248607cd052fa2fda71c65beef09953d6efafa05fcdb1a4fb1fa818a0e", "6a5265", 0, -1832888214, 0, "b054b0a4b03f7fc224bc57c9d1ab93fdd7f17245e5081285911f94e834682c89"], + ["99e765700267519050d5e47fe5281a6e74608a777a64ae1128b1f025755528ea615f76418b01000000065200656a6363ffffffffe726f10caeffc15cb9c85b978ec7bc81cf78546b64b01f8a9e3fc9482b3862a301000000095263acac6a6a005200ffffffff01ce54690000000000000000000000", "52525300", 1, 319053645, 1537743641, "b9d8fe6d800a9393949d90b4f04f0965f1dc565b5309369c9a5a7dcf018a28be"], + ["713d8276045957e32d939a19ef3968ed4f6e0477e5f28625e952e538f547800d84d02d67e50000000000691e81cd92e1031441efb3f5217014b984f659b5323f6b6d42d2bcdd94067e51ac90ca6602000000066365526553ac447b7f1633cda21b1ffd1ed1c17092670f7bea15cc1dd93657b1977f633c2f123ba53a4900000000075353655100636aadb21c7e04dda19a4956957b6337c24807d562435952919ede84ce369e1a368344cf0cd402000000046a630051cd2ef28e04d33d220000000000055263525363c3eb1e0100000000026a6571362f000000000003acac6544fc86030000000006536a6a6565650000000000", "", 2, -1718253438, 0, "1004c354134ef3e4ce6b4328ba0d6eccbd77c024a681ba5fee2c51f1b77ee7d7"], + ["030000807082c40303e77945de79d28760b51c43d9b80ac15e06bdede7357019d2a6ae75cd159c5fe502000000045265ac6540ab8f888337966eb00bbfd6d4a14f1652ce53f912e9415423e11dd652d1ba864d6dc7ae020000000852655253ac6300acffffffff654b9bbad0d3924a25434f9f26cd555ec38c5f5feae429b79916a52a9196ba79020000000152ffffffff039eccb004000000000251ac99e888040000000005636a5153523b855503000000000700ac5353530051000000000000000000", "6a526a6a", 2, 616752151, 0, "f89175c252c64325a215c0f0826b52bd5f49c56c28e3a2d8745f76c59487d7d5"], + ["c780af2c012175e7c84273c21fc958494daaa145c172e91fe2cd695db6759b11b1f824b59f02000000036a526a4b37be9e046b152e020000000007ac525253ac53ac6af35b020000000006006a526a5365a28c28010000000008535351515153ac51327ca404000000000251634a970cda01973b7200000000000000000000000000e5fe13ffbe0076cac239ec2a91f85471917c03f418c10a0443245e1a8409305ffbf9196fdde11b864718173d9a929e1a5a03dfb805c4c8aea2b350664d4682246eaa2d98db3e7ca61caea35bced603ea7e6af646b3ec726746a9b430a48c8f06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004dc19c0b811c2e1f67bc3235b0087590d0aeb122be0b568a26bbe97f210d4decb7771f209329c6d1cd0ae49221b0d201b5af56d93b5c42f72a3a25434a8e079a954017865682a8c0daff02dd0ca294ca89ad7e5b0c87d24fcd376e14f670eefba07a22cd02c87eff0d6dc9c603afffe10b1190bd0731485bb510707b00e09ca4022fd3eb7d39bfca30543a09af07a38cd81d13183d8b668d93ceb1818740eca945030b9f1b1e33cd558df5ab0b2adfabab48852cdbbd9d70d17133411a9e8c40a2d00a024aa876b5ab0f421596798ad7113904f4f2529e2f3f3ee482de3cc5fac8486bcafc16462c6bcbdb3bc0121ef3c924a7228e13067c320969e0c7a5c63e0c1f3b021d43d00de0f0c6a235040967145e7649a78d3a32525f088a5d605a0feffd9af602112e55a837e5781ae9980aafdbf3db98af5491d770de4013788d38291f32bd0b032d5ff27b507da724c998f7a1810a884535a433b127db3c02f4c17032025680f2022dfc0bcc6d8b0fa5d820fa67c00d8d7e2fe249f20ea0113ada97a46c57962ee90320261eb91730a8da457f18cbc403288806a165680afaba5326657b72a73165ec9b01506c68d87049add88f18195ccfd35f79c0cf061d78070d6307661f51346faf4280b41654f4c3469be1902024e2823bcce16d444fef0178bbc3f73c7d0e9cbf04fb055f7dcf98cc952a4c38112bb64a3738336844c5e89335c1f7637ae9015efc30f9e3ff3dbcadadad5d5f8e5581c4acd3d687a3b4443e621660c3cf7786758c3540008f2a3025458a424fb051ad94b3853170150bf57590e5c83da351cbb5dbf2d8e4e00e644b8d323909aff1757c98949f9fe21b6ba6cdbaafa6ec29796b6bc7617627c60ecba16a4e08b246e1f807d9690963d8d3decfbd274fa6f8b5e1c7e69e4f53297908e924e74579a717af5f30f3a13e1c987691f0c6e2072c5e81a1d5dde8dcaee754055ceccc8161015b17970f13cf4d163b25aef4a03b3bc40f7153cc4923b37b55c656632593ac5dd9c89e9d8a1d792a4d9c0f890f79bd7bbcaccf32000777b3c64c5d1296c6d423960e78c26f1b33c390f355b756c013ed9df9119971506f5fdc2a74b51884e62143c794af2c4ea125806a6ca4222d88fe725b5bf2ad3a0bea2afbb5d40404928e26f5d9124911b0ec2873256c4bb6fd4d6c1230dc62826a6f189ac36a20e458f399b55e6abaa0fb0bd3560c6315b723ff163d6af673af863399a6c37c6c0d9f6dae7ec147bd0e7f80616371b4cf20a033c1f36cd835bf83c1747011416ef43989692ca66441754ad89a48ebe489e85c5be91949aa71b0746879b387645a92ed90efa5c41ab6707ff897ce69ceacbb4d53188e54997216aa81bcd94aff97c187fdd0183794eb0b34feae11e92ebd3b238b92f2a8500fea0d97b3222427657708f43599c24ed201f702b1eb00072aa9063027cd5ddbd9325644f0c4e47600bbf76efd273557119901ceef5523c948ad90a9846fd049235f10566d29a07d672cc096b4c585e10f031557850332e455eda625a1c0ff1bd0987e56676c5caa1fce6e1cb4ed6bd509901f5cd46883a416b87ab68531e471ba20a62fa550d745843c730397856c7b66c4b233905cc3449f3adcda52f13990b18af9816d388f3a0370b57797520c11776c3d988a69cd4428ab362fdf57d93f9c1e817f7c1eee0d2d0b43ff6fc3360b085170ec8831468e5b7224529967fe3c838ae56d389359b1a600589ae88cdd19a1449bab9dfb94f2852d595334e340660037f5683eebfb79862a2451793065645ed8b6f2bb643fac807fd4ecd34b614039c82d3e68388c8cd854e8682a696d6e33b1d6fe4ca998ea944fb218fb834e3714b98e15f031a8458e55df5166fc7612aa1b77de06a9c95f3f232d21f942b725f2a13947947b30119a9c3c9e43fadeb850f5b9230be138c7f86fc26120946ac6ff16cdf250a60fe3ea6d73ab1c51e420782dc09f596ab8bd5be5b85869fccef8c411d6104e7c2104c91f5ecafa994dbc01bcb8db79571ec40563ce6f7c0f9d90c611248c1d11d19f4b4385d388ea938ce31ad27f6fc82b1ce0463dda049d83d75c7e5ad9ea74592285cbed234b36f781a91cff5c9dd497aa2385b189009a6be99b9c08b3baa0f9307b7c478ceaa199271935e1893c6a5519bb66f86ecb02031364df34847834ec35655f6205cac3f44a46b91548db4f6ba3b075fda7f04a517c994c522a30e08a7e2f5c45e73f6c61ae8a920c07d20134c6917b5254b57eaa15067ba36582d54ff3bed792a849eef56d3a1f73dcd08758516db72cd65198c87f8dd0f7ea91cf9cde9532ee440e7a7568014fe854a45d010ea55c1205f0fd46655d298710be4b20e0439c206da04605827fdf2641507f654f5ec460616cd73ed17599f30c8f5879892e7e049e1e06", "", 0, -1644364371, 0, "5037d59255ba254c1212d0ccdf49f8b7ad73aa86587c7b2821a831aa0a35c27a"], + ["8210ce4f0113d0e038c536f6ddb6d1f6d2f55997da1380007851d7979769fb45b4c8e3731c020000000652516a536a52ffffffff02a9f21400000000000165a03bf80400000000036a6aac0000000000", "6565ac63ac00", 0, 1435527252, 1537743641, "2355ee38eb1865c7156d59ece21775d4b1087b5629f6a64f1b2409f228061851"], + ["030000807082c403016df50e466e672944040dd45bc45d23b8ef8e0f88604e80cf224e74ed737e7db90000000004ac00ac65ffffffff014a3fc60400000000046a63535100000000daff0f7d03d19373040000000000000000000000002598d42cddfb043011d20654e0a0968446af0656f37c42af0e36288a8ccf387dde7c346b41631fae6a8b13ecd846e32210ae543bc08e0cf9849d4c830b02276eb22777b7ba63c72c0dc8a915dc682976d1c4828827c187d3979dd7b6272c74380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018ccadcb1b750ec46609e20d79a08369968de2d1bf595782ef7c6b1ab0bf4a9eaf65b8a42520da5c4d86e9762ed09d46856767fea85c6eed43f46f355f4a4154459a515da636174640bc1844f00804010fc5b3f2c97d81e4f47f88d900eb5de51aa88c536db64e06c9b52d7700bc17264ab3840ea466b1b36b4f22b56d9e7e17021d9de388514859a1d12485997aed66d3eee2c8a7b6f4b7ffc88870e2071559da02102bd3d5d08cfda205fefde6df575a1bd488beadeece1c3839b0b34fefb3339d0a0408037159023b05b92506b3e09845d8738dc7aa50a96aefb56dd226c59fe9bb61cf573ff0fbe3cea89e96eb7870017ce5a8971c7bf072a7084f01e5cf7c5e4b02203d3915587836c2294ae050fdcab55030da4dee7c811f713352930333c62b1202224bf4558752d465df3121cec53dc00a14622e34143d2b1222ef50a862433dd20200c15ff29eeabb88e9fbb33611f86da684813c48d53eb8c4e8485e9b25375613032a49b4bbada57cf187723f949d6ed7e03f53cef582fb3fd997f61f5333ca8902032164c6006b0407226ef436d6ad7a31d79651bccea37b1d3ee7584b37b921bd1290fdaf90b13e5d0b796fc765d141712e4f8c9245eafac9b7865700dc10dd37c2904aabc3aedc4bea963cb808c7b3b5e95f90614489add44eb4f41732c84cacc8f8119561da70987944b650400c5465dcd5af18b65b87fd38cd43a3c68119bb070bb8fbdbc04d6a295c23f00b9ce88460e668d113e0a9877557812e2d4c6f57a38708a5544744c4f5692fbd93a36d310934fac45606ede094f2411d2d9496b395ef418006e81d8597661e56254607a44e69ebf0c717b9ec2a988e534558d2550578c7d08c6e94a26a73f5d68b799354d0ec88d7890f5b303c42638c5762b7fdc81be3955b3cb802060d34d95f653bd6b8c56dadfc23d8d7715e90eea25df5f516aa482e9d6b253fcacc33024787cb6084235d0578024cc348d070bdd27e5e5af2aa3579c297f8c0931dea75b27dfed7931e4aa3a72330acebcb54a6c81b481219f884570217287fca57a5c84d494dd8d01604e857193d3832069453428dd5d2d079792135e502f820a2b1dd1e0075911866b1d56399f8e7550421c987d2d19a71e53557eaede02b9a5de192f1a890e9ca333aa7cf51004c205a3c1eb0fa1de6ca8042e7bd183557999f6999affacecda38a723b6ffe98d6860d52b7a1a560881bcc808fcf9522c559f3ab89f655ca61e0345e9f81b3a8982440d905a10ce9ea7af43c68544c3709fbdae0853af8392f303e6ab63481d81eadc9f74e5e66ab5bd1eddc1ba1b653ef448b85125208b325813f1ff89fe4556324f1de8c565f68476920bd1a7e7f429b416c37b517f954c9d0e6a2626bac292bab17bb4b834d0c9373b264f432746bd8c5f7555b7f37311f9bb1d1d070b35b57c8c21b6de39b2d99d84cae32c33d61de08947cf824ea445fae1b8c0916a8e4181cb17a54b24ba24fa06c5f700776e1c3a6f116b83ee8500a163792a272a7d1570c29c62e3aba971403aefe840cdbbf5099bbc0e1d2eb0997467641421507531858104d861129dcb003b8ccfb373f54a4d49f8824033c85dc2d99db740c92b29705e53d69cb8a49fb83196eaf8b3ef0a555ac1b1012bc1b347b631747be0a6f2c8d629b3a1422be177c254cb12c0b1726ab88c20253179c88f2453a956c09cb6d2f0b49c9fe9bc8bbe628b1bfce86248839076c7bff45e76db298b76e56f4196dc085382b00fbbf29b52db8e58d536d07dc9123bf3be5a89a0b48339003012fea087c4147e8e6bca836e84933e84c040fa0d88a2e4c3a556c0d6db4e43cc7354d0330a8fd1cb61ea8c81b394b7e0fb563bc65958cdf681bb2c55890fb79b72af214b613e024566164c34e8cc8f8f97376a55353650bccd51644fe5636532f20c0ad9b7258918d32b4da574cae34b79924d431e3b2738f2d1016f4216f1e37b126894134140867def5d8a7ba350bbdcd8f24d316669ff0e1b59a60e9ea29ddde7c1bbcdedcf827f4f0fb9ff6fc2618ca6d7be109f939b1a875d90ea37ffdf45aba55b6bc06432077377c3fa15cf59cc1ba5534024263468fa8b9c8d650c1d8b395acd83838da2574da61c9b6bf21ab359965df8d11c2700f90827dcb5e0465e8751fe061251c7609cb537b01fc0298841ce5794a24f272b7bde65133c6a0de5dbfd6d69a762c0f4a8d90aec1eb62b526d22d919656f7393917a82ac0dc9d1c7ba80d4db1bab8a032e7a4117436496302c5a605753a1cef5d026da3db5c83e002000000000000000000000000bea2f02b89899f2df7d1ea49c21bab423a00c7352b87ca18ca823c0ce382560378e88be20e47255c8c1c53f216c8440cabf3b1179bb065c47f9361191775481da3d0cad2775cf805c17e9691494ea9fc5ac2c0ef01d095b033d21ded1d42aa0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f5b3bbf4ff5a04af5e4db6544425c621821e2d36a86d4ec817fd413f3677e504ff7fc0544fc08515272a5cfa7de5d4f1be8824d601e32d5179bdedd63ca0b33d5a2b7c5632a3139f290858450eceeb24ac7af4c8f7763c2b729516e515690b4ff6482172da12447161005ce56cbd25917390628c948f7217642f2f64b71f41d8020094ed5e55fb504f088a31d1a5f69a401da4fa6606f8c1aa292132d0612e3b1302012da5810fbd500e10e2f5eefb2fd1588a4775570655ba37c5a52478570878ba0b010dd0386edf1d2b291727f2085112620a27fade79b1fde454f325229806fb9a5841ab54f4db0b918520b1d0f46f8922cf3b8bb503bdcf65a04833574fd641b40311e193873a7be4ef621c548ca820e0a6ed66539b13e25d035b0c4b01dea9de22021d87b888d0ca714ff8faab26ff06c365f9de52abfbf18c1ad6e574418b70478e02277905cca615e1b31faa1064bc8391cb2a1ed25c332365189c8ced3afcb37a95020668e01dffae5402b8ca95ab0bc75cd9ee330dd8251d4415c75cf71e34cf397502073bfb069ec83773779c7e929b064df8ff68dd771cece9d34907912b8a7c4e96e082c0b970e5172129a46b9767dc4b460574cf033b49e0c77a60d86719a238b71c69c30d5e78f02505d25f6491898c10a68dd1a663580496f5e94245138415de5471fa60ef2002c2e670dfc10b4794914096a40f2fb97165b2cf3b1fe39c9d6a20899cbc8f00ac0ea9399cc7716ba23c73f7db4a4d5fbdcc8373cca933fce0ea9b621d786741669dc5d0911fcac5a9a5eec88d9f66c59a64848bbc34c923811700c430f2a2cedfd84fdf1e782e68250fc60bf3e1e44a607724424963a6adfbf37611219581313b7a8168425c99a5b54d040c21749b6795923d034a4aeeb1162f6e354f94bacac1ef7d42cf0b57143350099a2319a7f674eafc2a04f990fd610e3537b147f425e089687ee87b5e58577a8d34ce76242bdf6de034122734f700651b58ebe1525a86875d70a0f63c0ff7dd05cd1f13451ae52c3994f14fdb9d13c1aaf3a90380bdd84cee332ea7c93495cc27e14e27c7dc356ffc90d372fc5a7e17bcf8cd2b5e3fc7259cb8bf3d8faf6d05ee8ceab678c5bde60e865f0e5f6adaa6ea7ce41c04734dd020bfe0f223fdc9188dd8b213924a2d84cff04ad205064ce2b91475fe7a3efee157775fb1dc3a76e609585bf5574467c48c0edc32109f6a9824c954edb1a570c2ca3296ceef904139a9fb79c0c8aba0ce58817dcd95ebb288a81666d96a4c2da77b4338ae2955a9974752c3f4d18f8cd0d5a0be572e2e53e819e854ea7d7043c4a056e0334303b1f142e92175af48bb4b6852e5b36083a815544506244323ba316fc4b876f096e7abc78677832e68ea5eb7b136e934fda8af42543e1735ed988975a2edf034e3e982d44b180dfeb80ed9eadd40c08a2b61cb03992d0df450aafa3f461f53f35635d451155e2d415a0f3c7ae5d1c7dedcc41578466f7447932328aa8f2fd860f1c7b9a286e6eaf0efa3921e534d0c423c63ed6dac66345ebe6664cc0d34e6dabbd1dfa1b0f5a89f66ed2683906b994ace3d84782b987fb0a0c61ec55701d1c24d9207ed536a2745a19c89696449b7eb5c84522625170ad544b872b107fb92e0550aae445d19a6d48bb2a71e57bccd068dae01ee95d11d77b1ec18ca3682bac172bf08e7d68c671c2b1e84ef3e5e2d6b4df0de55bbb763e1115941dc23b2cf51fa87a86576bf470b3b0cce1bb3db79f48cf63e912f20ca7f9bf72f82a5fdbc1189ad945dfd9f3bf2938c9a541d4ed5bef30b7b967de674bfd20938a8c1cec059384aaacbeb50caec7a22d8862b20707f04fbe698cfd0a2e12127a7849006b5c84b8a34c3ee6d230b1dc91e47bd02823e6346989ac2279f86b9e687bbb6acd3de2e3c8ee745bbcf7323015d1e8d4bc0ef7dac5e6ac82c2f58ad74e9b69e8487e6a9e252cc6949a2876a1cd6af16a3083210ebd7b18e961b2c24b2752bc7c1ae38a45c48dd95cada79fd1c6abe465dfb64aac11f2c1f74a8965ec9d139670fedb54eed315d4f890f57d535e58ba28e0612fc5f9403a41b18cab2f1dcba1352e8baf9d38c3ba2a4e04c369f875ad08790ecb59d64c493af3f1a1e5b11db4cbbff5e6534f11ec0c3773cc7e033b980c6882b868e923bff6e3d0cd0b66541cf3eb484e081c5dd60d35f8c771510e1d61e3872d1c4fd91960e7bf7feaf8e721bf0f46e4c0fd0a5bd36a05f95ac4b33e13a264a7749e91200a16855fbfd4a14290b15cc6b822bf9731fd085010000000000000000000000009bb506f1700a0d1ce797813912cfe8629b1c830a128ea47cabe844c26df76ab3c3cd8a8f79be3bdb6ea5d4442f02ed07ad33fc98ccc2289a7a4e807566db71c95a332e4b621dd847e3a23e6bdf616c2eb47fa33172a18cb634b08882a1a339a500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000efc0735a2e8a75d8f6a1407021e75484749ddc51fcd53b81669b63807e9de0e911d98769a10a9b0a9215a8c96b89d80de81437022f63060250a9c496bd90b4852660cfa2b2158654bfaa0018cf990c4dcf55c4fe091244a9e1c87e20bccc97803e5d51f796b13444ed1d21479a70f4264e1c2338e3721bf1630632d7c20690980306c66df05409ac8b32ce9256d51d11263ddb5c11033dbaa1c7974016e9548728021dac1b936b2fa4d9f598330a9d34473a2ec966f95d4284595a9d89052eff32850b00082f1331cb9c4f63cfcf6c74ed6ed27245ea8656e65d8fd212fbed5dee1c5229a728aeda1da055132f86eb4a88643e8a95c34a5fc1a54803528dbd4ca4e4fd0326c4017a0bedba94960b89c169b19a604305f38afd53b02ff4e5c3c5906b12b30201edf6c0c23801754afd3bbf6ea550164d716f337d61988c48942f960ee06fff030f5984d2217b768a20529429df7ceba29e227f7a2af9477169d86d178084f52303246475378cd6b44c18abf1a94b5679e23b0ec948015ec96ec32cd8e612fe409c032e512365359dde3d772623b98055380ae1c964f899987204f3fd7de4cf436b6dfaba0379d7c54337a9bd838069d3ae635a5e81ea785d53b644010c2900dccdf23f6d344c01589a8942eeb0d096d6f9eb17db8333f91793f472e2ef82f513f854b040c156a617280b3af6c0f5a249dafaa30fe57adc4050fff6583a064638e1034b26adeb6d6ef4055858c6af95127a90064f0f03e1f77d2f31055afebfd82c52b27b40c8918c60bbf5705015ba5e00bf9d0f1c02c2326011dd7d50b613b2a264b21a0d890f06440c2332085c3847380dd3623ea6176e74d9bfe6eaffa080292aae9c0e068ff64758c12b376062bf82c33bbcc082b52466fd7e7bdf4d4f7fffff1d76ff7c86e0867ede702b3006409088c0532978da702f7a681daa63d17a83bf08d287cf21aec6ed29d6b0f312d3273723bef2de071d2a243e93d3621f5ba6aaa255dc6c7913fb87944aea633e8c7521955ec589636bc2258a45f3c6b076edbd8d9233fb49ec936193e8b315be8e1ed80d0f4f9ac2ce6a13050f172afa123aff697ad5ec688cd5da6d5505c3383454a78810473c9a295abb6fe3da753aa0b163d1932810f341353041b18efc8125931cf5075e163f431f5676f9affc40e4727da594fd9cd86536ef91ea21b565f170b5f26cb1793bd9abf6b3308e0bcf47f22dbdf1f1ae4561cba146ade4d9c1a7b29c78606f30b7cf3619f50f0b24d517066cb2e357a25e43f9915593e400aa3fec815123eb9fca21a5aab206628ae9974f8a6c2310c071955250d33db3e482945e808aab81f571cf793efe153b9b2604e57fe30a1abf4ba0045a5ac02e36a597088de4b30d0ae2c5c574014cec07a5daa6781b80e9d870415cda3c71cb856b941e1298d4328bdce47af6d35ef7f845a22ea24882c2468ff5823b4cfc6a55415d1eb309e871adcf4c9d9d21a1674c0fbf4a7e10b11408c943fe436a7948e7ed6bb62776aa30bfd77498d367009254440e2de2a9d50c4afffa29bf988ded70a838c4f7ff0ff2eb36448b525a4cfba0db0f88e7a182af22117ecf4e55b78443c78b21e0742537608fddc3325cd3b9aa62de6885369761e2d25d1cdff8a42d69ff400b5f1f95c21fc5d31dacb006f44cbdbd9426483b6fb281664d507c58b73d5d38b740e6696c59d1471b2d085e28b050c72c608f5d9e66018bec2f419b0da180d8de63b9e3526c6f644e8419a52249d513075dd8277428b354760add376f09194d6be6e9558589930ab6ebe93655135dac775becf6b507647a0878c20d02c1b4e3fad2c96af5e0cdbd059c08f8f2135f770e6882e492cdd319fb2c22a388cb2bb5f1a842da95c781c607a6f598d1148f481afc386eb7ff8b3ba0cdad945814383fa4d4adeee0b42e3d27d46d9d3468afa57087da4fc2c51515ad969d02cedb54c6e00b3890871daa656bfa22d5171503191f73447546068754cd160b4f665dad5dfc519a8b1ced9c584e2ef93428db54559d54b9635398448b1da1fd507986fe8ad22e31c3ad4ff8414de8931fbff5c20a29e7e982bdfc946748e281202392261d8ea0fc47aaaf071fa4744360661689546c79f719134fff42a2ad7ec5deb55c7197fd4b7b2689b435a3ecadc310b8eead9211574e091206ef5a8ae9a28587dc46c32898f7d48238ccfed2469f362aa3ac9be2e30e6c8940d0e404f200c2bde2680f3d3227a5cd22545c9176fbad32f94cf3530c21eb1bf4c1ab9d55dde32acfc41de2375626d3d46a84e4d0e66df070a784ed4d8672beedc6bdea083e2608cdb47f9e1f520aac66afbbf04bbef5587e99b24177bd37289aaeeee99b9e74963134761a7e7f40ef0667b07eed996d95f950ee808a72093959a55a80d79069666c506b715808", "006565ac51ac6a6a", 0, -1209250835, 0, "603a903617d7e22fec9fa07ee1d281b95ec45086cb99a2f8aca729e3d1e149a5"], + ["5d18a645029609d7f163e89166303175877acfa80eea98272c4f67c8ae49ade2c0dcfc95e003000000066352526a6300ffffffff30d2aea4e0f01d3a6cd17a8efa2b2079eeb2936a484df564cabc1c624e49a471030000000153ffffffff02577bec03000000000500acac00ac8156eb03000000000463005353591869b501f8cab10500000000000000000000000052fb65492934179b90b256a64467da061ae263780d2f01e83f3543b3758d74e5810e3f4a0e01a038ce5c3e26d7cc6dd735147f8fafc10d76b4ad8d8d22c37126b56ea07a14c5b40978f6ea14234ca4718e1e80f2d1a279db04ae963f44ea70de000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003204e8fe0b6834ff168f09ea8150f1e989f8822ceede3d3abee750bd5f36e3a4682b193b98b4f0922f9d86b839c23d9ffa6ccc8abd9d62747d2475ae1c8ccb80b749fb8290fa4bf41e9df7cf65459400482993c94c4b2c9dd43f9333e3a3fc9621f56b443a100185369d5c26a660cd8fe258bf64240b9fbe298a7ac916b66438021096310f0eb843fae5f30421f2c3731d7a463dc1604432365fd04b0987dabb6f021fb49444a864dc4332425abd898efbe9f96bca979cbce8e2259a4bfe0144e6450b05084304f873122732722d27bf43f4f2f631f02b52d260626f4656daa624a767d8c7b63fc4ad51f1dbbc8beedd2cac3b3cacdf00004e2d6e574ed0bbc3514e5602167b4b24fb465416d60ef903302d98f2e1b4f44b534cdf79bfca06c04fd015b90219a8da681be5046a811b3f62ced863465bf4aa93ef65d506f100b6d64498b1c10217213b9847a92160f3f84dbcc02ce98a71fd097118a818d7df08ff261fb7897e0226a5e8e400cdf7e98fb1b3b991b98dc575e2ffe8d90d2595bfe455892d17479a0308b75d115ba03b353a170bdb86954de4c0845c2a9ee766c2c0d9a437e412008043238d7a59e7b4652d7c8e372b0744ceff4ad37e57432a7bb5ea7d22313826415fc43963e4a3fc59c15bb9bb791194c876694b63aa0fb5dab3cf3b0fa2d44fe7f8373db81622519299ec5c704828d155e9b6a0ba3fb6075b8aafdd6c76d9db640b2decab937ad664b753364ea95d6f717a2d7de4dbc841140e48f45bf41211b0b55e86a00bd538e6a1f8a9da55f2492316b8ca38d33298f62a525ed1b95387ddd5bdb8b43a40da71a40aeaff4cc065731fe5fe27cd7db650bae18fe604d4205d8e8f926e07e9cbb33ba241b173eadb30f2de80d2637f0b27f35e520c0788e3204a9ce36250fd3bcc649605509fbddca1ca33523764831e10bddcce86675bc4b19516f957a589975e217b9c66207a31044284b1414353e054129f39f787222c9e882ff87c05e4d63372de8310950823e494cfc2941a7844e874576d0b85831bf85bbd69b15bbcd0b09ed5fd1b8273e846dcd265e5dee375dac8314c33b10d8829ab161d6f57aebef9a8b2ed9258d4d71c9c64229c1677dac3fcf1f0a6e189eb1dcb5c50db2f78982a4042b5a9aa07201bf012891c36a941591055365df39364c5627a5ce87050e6359136d48a2041b8c4f48b2fe62ce304c96af601d28ea291924a46d93c5cfceb7036ba0fd8668b5cf54db8c6eb271b25c7413a07985f43ae2cf31dc6f86f9f7974a65a2c48e9ca567e4dcb6a81ee64c7833e08618ed70e0bb78186172addf1579669d4eac4c7f72c66e3f8e6addc6326ca022bb78d0580e2fc3c68edc077e2fdecda931d859a02142ca6b1a7fe86b342bedc2d720cc9fddebc29691ff8ea2f88518ab48de29ae2f97a8832b917c08416b45e8c93ada78a38f8fd394f56abb373815f33ca5996890c3375e7dfde21f7d06e3e4ae619afa17eb41ce470795f2b540d691d50b0a392f31f067816e0534a2721e53169099de84f3e6e5f3f9d35de4238c1144f262d8bb1cbed5f00af4526d96361c05fe48bf7d16b71a1f73f2d0621ef3595460a57dc6d1096b371de47383c60e0543334e2c5d1c63b932665618993a4d909c3304728f9f58dd378e35675c6d4ac7595e1ba3f2fc109dc249fd17a83ea298b3a2849476baf70cd28f147ca8c8b842bba4e1c905e57ac1830467e00fc7bac690dadbb0395db499d93ae8e11d40cbfa53a53715a8b9bd6a0558fe87b62e136ef9b739e97bd9d6b706b5365e62426992a68ac15c933ce932f7bba7e91e7ffb893e3f9cb87d9592fde386e15cd31ad049db979ebd86ae2e18090e71fbeb36f08d4c54bc987d8e24310367d2c4bebaaa4a90ec0f09dbb9e83fa3b1d02e201d2b8a654b2b9ab9e3642b73f9a373be5474fad2d8a67616f4293f5d6ac92d446882c8b479346a5c9f61c6e8ecaa5b15c25a4588b00115cf406c0f93c3d6626215f28712edb8d6d5b5f67f5ffdd38a8c4c4f976922d61b5f2f6d7457cece36f679ea15cb0bbf541549d88f4b76e9bb3cbe948f12643e05dc61253a7c9a011a094e4aeb776b3dd7c8a6f29a5a6b28631abcea33753e5b2deb8d819f3efafcbeba6fd96c2c6a642ec9f06375837b4e12593634ab216751748613ebf40c05f830c91481fbf2eab020768ec67cfd1f19215be7745afecc9009e67dee15ad7de69f400c5a44eb127b478ff14759013125c672be2a51d69637d246d3cb47bd545f9b2d0575932aa25a72bc718c88a5dcd2709b4bf3d262c9943cd32d6fb1cc1fd8e2cbbc31bff9ae0e16f9ed147a52fe5bd3dd898a47bf15f7c030d9fc5cd09c6c20fd96deab0dba2d4dc8afb002be1e7a621ee9d67e8e3af0eab7487a9d36afe7f87beeefe83d02da842d19b200d", "525353006300", 0, -1246051117, 0, "5c7693900f0edb72eaadd619ae974f01b4e39a498d9726949c712354e27768e5"], + ["030000807082c403015a0805951a8ffc76690b74ef503bcf45b80a70f6c1dd8cea2411680db2535051030000000451acac53ffffffff03b1d05c04000000000253accb7f0f02000000000563635153522034a400000000000252ac70ca5107099d3a2200", "63", 0, 1974096124, 1537743641, "859face0c1fda2ac9a4736d932c8ad2a1f6356391eb8e83a206ae4a236fc534e"], + ["e198de390220c687a5e23ac5d730cd1b74019ebcd52aa3fe35b2b094eb84d174381d6865450000000002ac6affffffffd904e034d44af34c5b45a6771963b87434dd2080a17569a7a34ba8dd73c6ae0d0000000007536a525165636314bb49e001a97649050000000001520000000001000000000000000050501b0500000000d80b32d541f1f8c830ff0fc09ae146165288363ae7fb0c4e1fa5a003bcbda6043fb1a1badbcbd9595e830bf5aa9a5df53a813c885e5ed52d548cf2f14765e2091f695c0a07dfa4f1bfc9b65223ed19232055c67efba1c1ad0319ba7f30a36be000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aa06eb89fea39f33af386488013e6eee8a0730b6d6f12053eb29f98b81fa3205f37747de9a40d08e590698f6c737310ad86817fa55345c0e6613cbe4cc3477f3d87fccce72c9f083700d15900f0baac8613fed419165178e4f3eaf76fcee1fff0a9c5d2b17cdb578a3675521acfceb83749545503d92205cf47734fa7bee069c0208c12ae2df006f8602c8eec2fe1c00771c91f2fa6f9c162333fc6b9b29527dd5022e24c527b7ce9f783ccf94de7603e3471ce90b8356847f3f3aacb10f82c8be0b0b079a55dcfd0190b3087a417efa60540fea5e29da60ebd8bc0c1ebd26d81646863f4eb6e35a2d35794d69ba7469aeb485eeb45712c72125c1f2422d052f2f8e0c022081c07845c3d542372ed9b485c4d559e4008ef31e85165f2a05877ba0eceac0030f22d2522e0b91561320f17de60721287f63028a5c1e9570a07ababcad8861e4032ee5c9b701be169ea3abe489275a6e7d4f0bc7168c2400bf2e973c72eceb65b6021d3d848761668a07af794c7a0b5c2ae0448435d88b2f45b068a531901f55dfa6020f55f0585068f688ac1d070d6f2934b70eed6bc4d797a186eb9ac61bbea55859a95f5cfdd609a4fdb8b632f4cc22e79fbe80744e5e6a6c1195ba98d2406ff3ccf50fcba2a1775576c5ab3ad9d75556926b2b02bb5df3a60305952b4e3e20dbb39e1a1a9dc9e4e4470d8d9028a865118d3b8ed2ea2215cecc539bc7eaef6c2062bd5d4152fcfdc1e7ce2f43576bb015d2153d8bf995f31c01362cf3c0acee1512e89089f958908d00a219f9997b86945d298b26d11a5bae4e1e2521c07f6adc0561dac798926616d460790356d7671004a2870262f32e8c0588ecadd39da05cf438d3916be9f297acaa185e2016224cbc739e084b86e3b04a8f47786145e89e5cf28f259341bf8fabb642f28442b27974d5ba77012ea1e8f468821375ec720622323a1119ec32b86a5adb31cb7718b2aa67d11f0d6e785e3b531491538dfa488ee8bb9a18db8944aa97595d340cb905af894d1b32505142bdc757eb06c829488c66c681aaaa173e21286cf7ed8091a7b630ab02346825a9c6d43fd58ae0aab9c5ac57a94bfd8d1e5984044ce1fe364831af31406d00155198af7f9c6f939784a61bf9f7c06a4966e7c657e7c230a96b50900c80ef074c9841f405bf637d122b91ecb2df9d8dbadc9342691597f560c6a5cffd26350e5a613cbd597d4107088f06b7fc12f254f2661c680ab3a454cfe29de9ab9c0fedce02de54c7f58eb1fac44d7b182d0dd13d4de8c0016b9be16963bfa294aecd8b9dfb58ed4f3927afb7b04b17f65bfcf209b0a028ff4abd92e7cddf419a9ce25b459a59d058442f380a1453ddb01331bb1e5bfbb0fa9d326f13c6398d0af0415a179b88767b42df052f5d2353484f47fcdb012521b0e3ef033ce8f4a314fea6945ef2d04c2ecbfd406bda77d500785ca58b995ee2e7fc39b2993ae8c74cfdfdf6bd8abd6557550581c9a96e6c3d4d03d3de2cf69278be645abf33d63fd05f97737741da651328e1334d804481f8d9137a3529f148c12b17df0c8b51fd2d2e109bd861fc0391296c555394cd930bd846e322708d54f5e6d37e5c9e00fdf96ef53a894e3fc5f44b71189096b18c79c92938eb7fab8382960303b2feaef9f49bb12d8be47807a7292b204c791f73ca684a7b8210094e5f28f128998b7e425b3016ad22fc84400cf4f16262e45d3998fa8a6833f4f2e6291f9892e5133df2182924cccc31dc4cb7df364f8c51453e3fb7c8790bbc4b88e450a8d63dcf802170c08b13dc5860ccf84f8daf38d914d8dea2aa904931fd66b9081a2baa791889c260e99bb640926fbd5c39243aba6bb3c09d1d44504637d1cea9e2c12a157ad01bc8639e9a917a4bfcdfe280b2b4fb67e909dfe56aa8522bb613304f68ac092f97250b03483a95bf8967d97b50522084155bf457ca8305e0f25590cd915e0014a7d5f50d97fb687603e339f17da8a273c3fb4a63a36ef5b73a4478d5faa3cee775c57a5bf74f213cad1a037a08a70f406b95c0e155e34a3eecb47c2d0b989316c9aef3287017d2fd47cbcfc7bdb5994a5b5c1d1a834b692be684af098ccc38482efc63b7c91a2c134b784d67d90cd6d3faf3627813cdd42f21cc3bdf57373ade657c86338bb85a8b6908398fe35f2812eadc0bcf3efe661db002a91244d5512ffb44ea0458f503a78ad53d6d744cd2d52dda416ae22cba7e662a70366b11ef47748512e7dbfc8b6442bc811f508d04bcef0d8a7793dc3d8f47d5c9279225496ee5d80ebd47fdc482d670f73a12b61f9476c808f3bae6a97b7ac50d491500333f824bff2eb8a797683bb4ceb32f73f00e981c6b8b080d54295df7338455f82642c831ff7fa28329d8615b3c47ad61d2fd609dd1f9be6566f9a0c5ec99e838e89f00", "6a5163", 1, 1235525320, 1537743641, "6e6efbd55b2a9f64c6fa1b52298f5c2f01cdaefb12345be4fd0d6875d8926efc"], + ["c94266200133cce88fa56cc7fc205eb5773941db35e968de61d85b891dfd4fe94dabd0e9430100000002516affffffff01527ef2010000000001530000000003000000000000000019857d04000000000ee33885c006c5d1c81129202599ea4d2ed914ac0d45d31e8cdb6502eedc7868d379a3b746a95beaa4bf0bd21e2ed248d272e27e0570f30150f218d19df9345c78a494de26ab5376536043dd1f96fff6203ac164c43f152531a8e52729e9560a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0f35e77c62f20185c1d2832eb41f95de14ab021e822afb35b989de9ff310ee9bca890a8a0ce725016c05b6630a9af3a90b48fe59921a3914295695d0390bf9cfeed670940d78ae0386c1d7b8643bd95a8b5d7cc8c4e692a865f3d06d5484f13b9b6458b1da507592546ac8c39159e495e7deaa800098bfe8ee41b1f0aafb896030165adc4b23cbf1cf1013a5374f7fbfa5fb82430bf514bf258e357e8def0b0a50226716a5c9f5726a0478fdc7f383255c7b698f11fdd9f9b7916a179f3394216520b081fe0d1ac6dcc11653167c47ff41ec79176c5cf029b13e284222a8a57d27398a588358e12a592565a8b35802c960de3b8e2287f97bc8364c26a891bfb2c64680224ff98b1670e4e91be5bbc78479f894550cf0f01b9046e30e9ed62eff2dcf6c9031d43400c81a4889164227a4a7df76fdea8318d33ea1578b760c3de0af1f23a6a0328d1411bf1a5132909d6f59ceae67de8170ba3bc7646c5293c9d8263efeed0930317e91f049246d5e7b11bd807f51f52ea14651125df8e61064d790cfad71f0f8e0323f98cc062e94598a10e85561acb19c119d07262a7ccc65dbd99407516cc9d233ec16ad2071ae6531c092a3a0bf5b0c27c119c3cc2a214b979d1bdfd990d4f0ac37ae96f2ccf777b915f46d7f4c58a878fe75a476a29343d5507b006220ac5dfddf98cfa5e17e0462005f1447baea253f03925cda582e67c7cef5e2f2526611506b763e11828c14259d6812b96d6490b727d28e9311a54a42aced57d57e43ef112f8e1b36a9686a40a0254c2651bf135b3eb856b98613c52fb03609b4b95e5caf4bae879ef03174c42873785aa4a680ab9f8be1b0127413807e6764f5b9cbc053cf21f4700c73bc0032195e17a7fe4607b41b4e1a33f26109427ae7ee011fdbfbfe4d7391127ea914c3cbdbf9478720023324ac1b515052dc9993cc36de1b03676c5390d439352ef55bea31a40580f5ea6faff75174738ad5eb7573e8c4012cce370a891631e9b5ed699da83e2a12ceb7e16e65d94e829e6c515d0cd8c6feed505c6b40a1df946bc06a3781ae5cdf7ec75796072df4f1b0f4c76d94c3169117bdf591a7bb0056362c0383a733f95d56f9d29b9c24d8b0aab03b713ffc696fd2330c3a19ebecf95421c5e90253053bd47038322c7d919b11df59e23a78a282f4b59612f38a8cbbdf0713b327cd45e7380aa902d4a30d0b7441da4023d164baf1f9ab10141e2ddf8c6de46aa7f1a7d9da4cfe6753c4a8d4a0fd66127b47fc9015efaa3cd905b110954d650a4d17861ed1f8e33f66c2d8c9d02d53470d28f334fd5b711d2eb33cfd75648d365c4c09ee7c5567a3ff4e6f9e0f70864a8f536ceab658b76ec1aadfb213f54b49dccea382139ee2bcd4e712c566de7493b3016163e76f5be3475fa8bcde13041fb3cc0ade52a5ed9fb774adc24b4f751217638af9a8b94cb90a2ce476df4d8774ce73bd788979a1685ff9a37c087ffe9e2dba69d39dfaeb1ca32e2bd7a14c48fbdce4db4609129f2eaf339db0e88479a8ce96467ad9ae575d9a73dec44785233114da3f9d3075da08078cc1989a259d3e65aff55fa7a9fcfc520dfa775e62fc9620ac53e0c5bc15c66c8862e9c59dd9a3cd1d0d5f0549c8f63a7e0916ae145839b20779e803ad1fe7b0080e565494cfc5d3c16f4a3f6b77ef0a23306d443bffc5e5550ac450afe4832b8878f9b1671cec9ca62f64e724e45e2ac878f84583d3380dfabf82576a33e091282d6cade0c1019cb7276ef8bcf0c4ea3f33a4a2aa5b3e8e8b7d1e18edd01c0fa3544a47f42fe28ae048452928b6d14a31ed638d97ce3f49812c78c15548acc45a70ea2c8193937e5d1fd5eab5ed0ed3d0dcf920670e18364503b2d48d48f5783808ac5c5fb216688b29b42158fce780ffe172af849172ca2155bdd8b380c0ecce95994dbf3f2dc0dc7776f782990635d22d77a65bde3f23ec2245eee4bb16b44bcf5efa2032275464613b85f5cceff260afe47cd62b3bb9c9de1e9c0a6ae96d882d7dd3ecb10648aefaaaa35f6fbe085f9a4aa7f6ca0b9e41df2a301a468083bbe1f13880e966a84fa178dcee72cdb2c34a43df3fc698837a7722e5c70da884f7b98b021260c95a71911869d3a7b7fc06f15e9207f4587052261eccc86ecd554bed5ea9968a5fd99b9c19ac292e33c12727ce887b391a6b6faf493940c3b07d7bb1ed8e8a0a2c38eb3814288c1f9ad0795c29317a49f98e3a3b6448ff9f30844a3eaf545737109f575befe6a1386f5df12963a4ec3e125fb8b705afc3cc500000000000000007ddf9803000000009cf159b769c8f7514c7b18e518f050c01046532d672cc63ba97d5da42a01b07aca69bc39062af361edf0ce1fa21183487fe98c4a5140557fe31716f7fce53ebec9019243a27261a4a69fef4638294b21a5fbc1ce209ab4d1a5dcb26c2435fe3600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013dad0a7a8bc3afd3fdcf38ae895bad10dc6e9b66192b3bcbfe69f4636b93cbff8dd72506da6a45268a16ba8c0aef8048999c819144b9a10646ebd9d81d86c3bf2c995a96dcd518fa864f424f5e72b954a8bb3efa57cb9348c414ec44fe9e87da5062bfd599155ce65d71161bc1ce90572eccd9ef8e3569aaab12de7a57787e030db6946bb2fb71fd5e84af86059d9eb76375bd0a8bc34be9fbdb3023fc44c91a032dbc31ff18b38ed1ac9ab9e19fb9a722b90b2f5a53e5253340668e586df3620c0b04458f41874c4ea226a0303bbab1e0dd22849d90ebf2eaaea396c70d1bbc40459ae4f3ba5c0281e366570fab7386f98fbc1e610b5f55b9bc89acfc5390b6e423020df4b33fbaed680f80cbef3b1d56adfc4c9d361c4276ffb930cb07f0af8e55e20329c5512e0869db1d97a2f265b7b1e03f09e2365f3d8c195edb76ab54e3722c01030f07eae4a0db973b7924a786e7ce7e9dc79d0d62e9cb94493c22d307a25c6ba603113cc1cc232bfb99687295e2b6330c3bc4a97c83c44adfd4d07bdcdcd3961c00032995259f0e6973afb2af718950703b415201b4890bf74f95ac19e8e22da486a7745e190708a0923e0b366062e22feb505cc2a24f5086097e55b1b6c81c7c64c65b7fd8a5149af3dcfbb0d13d224875373382217cc76744ce393a5dd6f3d31781748738c209fed89d6d6358ac665df8f43d8f4a777a7b5a7d840becaf24b856a2405fca6076982f43fb46a8d11a3a68651563f20b0c17f161a8a382ac04261197f3c83c4b99cb64c1a7532fe8c871c2d44e19577f1b403676ed99f49557020639dd49cd967591b624ed273bf83e36870d0526e7d14d99d553cce3bccce93230ad89cca3b9d427c3c83abf24f7124882ba1f038c507995e6b664f0b65dbab13d26473baf47f37534e41203b4cb1953a0b4c02757a48563b97dc619e4f52089d41a851b1473cc083c62dc2af253fcff4566c9dc96c59160b41b1dbdaa7d19aef0e8165ca829da3b54490e4bebbeb4444592dc0c9e771269dc2d6430e24dedd107a73ed6d988b5164edbab3ff611b2d9e53ad6e22876dd3a29c3317de8f8222b3be525a26b659e9b120aa10e603686ac1b172c68c453cd7f0f0b1f20f1c5e3d48fedffd83c469ef25fec185ff1e5f43e8f7250a03bc71fe175129d434130aae2d3c124a02a3a7efbe78087eb921d373ab2ab17f1e98e1d4c109acc064d9a5c6fd7237eceadada4dbc7d749e396afb463ca41cd5a483a17f5ca3115587a207f1db75c68a5a16ea86dd7b3e798b342acf1ff78926a9f6321ae13d396157c842070ea0e5e7ef6695d4923a725c8059ca2f15e0cf95e0fb3479bedded45ed7a0d5741e05e28880e08642d60799ab961624fc5f84a774e5213ea6969129e840a1930cac27171c300f6380edbb21b58cfd26f86cacf062c339bb8664f80de3eded2414ce59a63e9ac0203912f575308acdaa35ef8038d999769e4cdb1830638f13fb2275ad7bc85b41259e4a6482b32fd2b96db7bda27df269e867f4ddc54009319647953d282777a3d52e36f4ae8a530132da3432689916f7429153e8e15a5f6f953c0679e030272a66da8856fb96d6a04fe3096047340f2f7e5e87eb1058c087b6623a4f667c851eb6e4328a4183ec5c884e968ac4eefc8a7225f08e9f680eaf3441c22521dfd145852bb3d55346d7837712953706d6c8b43d3335422c9734f71a8b81cb9c82260af7de6cc4207af68872e32f1f5e6a384e7ccf1e8ddf2d317e0f8c018cede03175774f16d976a7be8d7f8790959b2eb4a95ab31239e3e27484a90d86f45b75851fd35d4aae596eec28994f7f210db9233145430b1d26de115367d0b73dea770330b0ada61dac22a01efaff8da0effd52e2d00ed84565d6363677b80fd957e09e9361ff6e22f02bf6cd5c475f6603760eccc59fadecfbea3dea84510975849c71b8e6e698e22b0707f31554fdff767c5372ebc9785d26666868a795bbd348177a2ffd868afb7abf9a68b18c41b72b014a3ee282dc007c0db7e9b1bcb6567c09d83e9b13e31c537b2b9a827386154b7f2ecd2550c425e0dc7c923903ebe175decbfb2cd130a14ac471df45e7fb24bd3e78310e1704ca6c5feb73169e08493892f1639e82b2ca81e6361d15f19e3d29e0143b2184785920338b828905327133072ccd475376f5bce499edab71693df74782e1adf30371024eede9e18604300582116b09bd9dcf5ebd102d48d486cf64a9abe7f55c6b2532920f3053c65ca572222f89295717bac7c095804f506d8dd5e7216f8602000000000000000000000000f40dfb5f6b0fcc1bdc3456e03c296107a47ffb6f4c8d55ec4e9a3adbab0efab9ddf23937c2fc169788a76926d254bf929be94ca39a17e5f1a381e3965780b26143467874c94b86114faf120e1f8c669d4b870aa329c096b4d3af2d914016f3e90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077d861e866e2c016218168152295348087975b5be40cbade46bbaa00bf96e836a8e3bb542f0c1b235cf0349bf3adb79e614441bdb183f92f8eff4fb0091c0caae66517424b7a140057c3f1542519026478bd2433213fa36989e470c37fe0ab2d153f9a8724d924f3a95125b11fbac2b9b9832188f2f2fabc40cef50eebfc85e702225635e30a34c757e6a8034a8d3b78e83b36098ecc71e7442d811b5cf23c48c90223c994a8900f1702f1ab1c860a6fca1314c364dd721834d8a1cfbdd81b43957a0a063b3ff410462a2623b9c5f5bdac6c1864c68972ebf364ad742d659defe370e8b01eba2f4ed9249ca86d11bd177a6d2c99ff6c8a196b7a06e515df95ee9adc810222176190d8c91f7d60b7c7c5955e3b8d4e459408a954d38b217dcaec79b904e10205d95b8ca028731ceaf7de478498424550e99fe08cb6c79a413884e1314e58530322194f6c8dd957df14f7cdd588d67e2a0517b51b7a976a8911716fde37dcf49d022b1c9e166674ec90446b65814a6399a760e16f0afad3ebd2d182b6e42b6acb8d032fb3b9eb7ae0e0fc65596eadc340c1ce0e778e1e3386d236f4928f3be86b0125cfe046a4ede3f38797262a255c729dc2c72add8ab8c477732e1acbc46b036342cf206924d1856073f47547e0fb119f92257a25d7153a10057a045862056d925b2427a0e8a77a09888fab11f39e47a4c5a3f1fe8e63beae002b60aed154bc6412f7c8777e9b8adc6f0c34917527a7ebb0befe09314895e463f4732e862c3fd03078c66b3056ba470bfcfda774b2f08b0dba37be78ecd157d1626cdc39124dde78d1cf8d0f852c4aee31038c90050e1170c65ce6a3fed3458ef3f1328ff1fc1eebdb6423b70de66a7390f4c7202e8c390d85bd375bc00944cd666d29eefbb099bcc62ddaa143a3023e2af5a36a7133bd51ce633ba2ac495c6ed13c4d05eef0f43bd9e0e5c43ee587ca2afedd65be0ee5808312f805fc8498447ad4ef2e8e24f4053a92ebe61ea873c3d53cbc327ecd06e7316ef9ecabafed8892e994148312fe8e03819fd3abb9e0cec4e8fb0190bda5b34a82d7948b72ac53be54f4c0b48210e2c462789d96c15d9b145b532b7a0c5dbc629566ddc442b01b14282860630bfb924f5804e6ddff01b2b1287b9d1ccc9f153abbffc09597a005a973132f48c68e806c63e8775df1fc44daeb9a6d1e10d72e46bbe78f435ce1a8c8c58eeae72443f40dacfbeaa5a562aa080c17167c883fcb795448b14ccf725f767c8cc4403d75d252d64d876625b6f1c44ae20b6de62b9de8369b20d58303e6378ed3fd05faf645077e8aded1763d782d46c6335da041573e99e216bfb59127898e7caee2216919b6352a245100de4188c1ed929b77e2da6425b125d4457c8484df0c58dd6866205edd239aeaf67e34e21c9f39e102de3a7ad6dcc0d73c4b45da6e224a1966e2f7cb7407e73a08c0aa3dbecb22bd4ce1d523bf008f3c21618fdf8cfbf62f7d2eb4c3aa09c58a85d9df7bd6520e4e4246d6bbf58aadc6462934c5e77a1b2929399fa7ecf9e1f7ceb7581d533a60d8382d859a6fce2619e70cae4da62abf015c82beadb639170cca867c7b69a1f3e62730aa339a54d4aa591cf20630f70cc47f2476d85104e97de764caa70277ce0550fb76cb2c4b9b7ccfea04b99f4aa01a271bdfd92dd00d872d3624114ce3ca9ea2161ad5f15600e89ff5c533e1d8cecc8e7f17e3ed88f390b1e797b9f72cef0448b0da665af5b28d43e961c60505226d31f2c126020de49c928e5d4f13bd8e59a3aa8259dd2a9d7444e3c631abfdb2563c5fcd6d5174aff266159886c9ebbeb9dc8c5e5a24fefcd4d5a017c97b5f3b4c06e4d63beee62f7564885cb1537e42a0353f437c5892de4ba46edfc1b615406095f8b018f4b4d83215067cd27bbed5d414ed7cf3b5a8af4f34f37b82df39451e5effd3db9919a94a12bdc214d6f55e31a6f4857d9438aa4bd53ae572a5aa02b3db57d84810122e9447c5be719be3b736428ec602f3b045253447290718c1b6528e532a9f01319abfcad2415e3df5f353d2d23a8227aa967fbd585dbf8809f0b2e067d37939ded9985d134617780264cc54f6e254f50cbeb058aa6c8a8359c1a5bf4dd169b605cbc4bd8dfd677ef40458c7c84acda7a257de9a6338c32a725fd7b85fb4f047d597d0e2921a7a4f698ad42940e6427bdbed4d8ea1630e94866434854a0c982e18f5bf2feab8b978f498282e04986d717e6fcddb8bb2b618e15a2370157f5f9622f1f7e547da962cfbc878e8773876f1a379f4cf4568f0b2f2121030ebd7c2df8f3b894099b3bf857ec5def50e409029d85cc2440fb997ba32d49f072fdb7fd74c7e3866598e78c82e60df1761304636e2707b9b49fe05f87ab338b0a19286527dd7470e3960bce3fa6624a2fc73080d", "0051ac51006a636a", 0, -299759723, 0, "5d84f838cf8091a5e0905ec9fd3c242f4f14606642f952649ee6c62bf4579e1f"], + ["8593b31a02ff7ec57a5884c0af5045496609e37d35b12928617fc8ce3daea1d66ff0af5aab010000000953ac52655363ac6365ffffffffddd8624db79d661c5d1605e77c08ed76f1c8c381e12299e63ff093731bdd3cb7030000000865525152520052acffffffff01a7909e05000000000300ac6a0000000000", "636353", 1, -1409998479, 0, "64087efef30e3b332cd501b1c4b94e02e194eab26a0595286a6501f9c04917da"], + ["2323a94204f29d2da0241e8f1a0d5af9f4f38d08185d5c6e771dddb40b95c818e013cb111202000000086aacacac6a510065ffffffff94294a8863b3e2d55dc24bc7528ff437f9cd4451e95f1b0925cc762b5df81643020000000500516a636affffffff210982018ceb653cce67cbc644389ac25b271e7770c90795f529dad054df82d100000000046a525163ffffffff21bdee68628be3b281bee3b975fd76357c867a6f56872a25e4b4fc091a2396d0000000000100e1fafe080229c1df03000000000200637937980000000000086353655353515100ffa25486020000000000000000181c12010000000036c9390b2fc0c26ab6ef448edcc4140ea40363772de8ce408d26dc7d5917b18e153d6425aede70f1ea590aded59419399ecf0503719471836258550463a998b50ee430d0c7782792357134d8ca7b87c458c3a2c70713f678625c7b4b2a536f90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006866c7c43660d1c68bbe04a363f68b8dc0e621e8ba067efb73de2605801cc7d19cd0eec413d919e4ecd4394f00ccf521a1fa60e8b6b89099545c0807c35704c757c91e4eb99e82d269f598a3c0b8bac93f33f8b0f17f150007d68ca847ce6b2eef4015e589640e6b07484329920d1f4bf492db1c4d5011f73f1447f866b6017e030200e7984ef3093b136d597f14c8e31bb0642b7112bfe0bf1c6386e78ea87268032b42d08df94e9b0bc18230314152ea97ec9e56246f64885a85d75447516de20b0b0861c073edb3bd9795fe739a6ea39a2b8d7ac3fd7e36d4a3e8bbf2d14ae366d2fb388ba31aa55cbdfc71d30e6e8ac6b6b46ad1900470912166f57f94221e7fe4022774e31bad4a7377c16a6d08f16856ceba8d41f8e007dac949e87e9c2d5806d1030173fe5c0e3171a970b273fadd0cf701edafb1e2990202126ae442c4b46c84680224779163a54fadea7eb99be4bb1f10c1ccfc8034caf0e34d27f6d7317bbee43f032eab307f80173697c7fc605f3d3813fbafeb622d061a1ccad3efeb352723665f02097d77139fb53c06d2758c19316b153e9959d9cca981328d3264a3e6511c09412116099b0506335cc21f62f822e385a06516174561064dd678f9346c2e0daa01e67661357a39ef98f6510e41bb28508ca2b4e38fbb6a0da1265627e74aa1dad644695f59e88088c9e97cbd8c402065a59c0cf812a3421147e8aea5bfd2da83a2ad1632e6c85f4d7c5f702c5bdda4579f76c75a221682b271576ddfc96c336b89aced9bf803d11bf7688075936ef6686421c69fff2e68c7f6ff53bcac69273f4a4345258d5ef19be98d4c4dd5d8941462b63e35dc4d8d24936e533f7ec91371f0cbaa9e24fdf4398e3547a0bd50369d9ac0ae8338492cf84bf6fbe7187e484a7f55d1daf1d2a68952ff892159fb9bc5b7c7230e1f040d3ad82f7f02de4fa83dce1a334bb6b7a2d226ecf0ba8b07f6cda7dda4e98ec9423e8e0c40f9ed98e545aeecade7bfcaf4231ed03edfd550a2f968618058a08fa16d2d37c087790a00318cfeb74555d394468885d81c1d3086ba9d73a59f1047c3114be74a92fdc69c45de094e7a29b80bbcaf62f5e78c4a845ce08904bb686d44bc519d70f403b7e0047a36da18e87a7e73e173566222465930b61394136f5b730b9f558efa6ce2a3392f3e3536e340bbb34c5b032730e2253f517ab4d3061cd6c4a9a79c9729e968f8a8cd535471a1adbf458663ce109545cc645f744186b5e749ba21536b3fa7489b366c0b793c000e42b71b8b8ef26f4bd63c5ae939ecbdf0697456fe17e38440090c7fa042e6b39a1eeccf1340c76f26779de5547637b49fcaae66bc6c1ca36cdef73e9337b9aa2377345b4a203a5da45c84096fe31fd1e7768eb452b5a00691b6b93cb26c5202bc5904047f3d24306c0d44a631778e3df3eeb5c506a86985fe2f7d92ac1fb483ce1c520696bff7fce2d7690992811f9d7a66dfd7116aa6ff54f5e9c0189ca2bd946d6b0d3f391afba9cac8ccd4fee2a089f1c57ec9c66bfa35e969c4df23379461176d659a3e7bc8a963fa0b740d4e91e7bc54b5a7ece1b1fb2d244064f957c2153e862cd82bfdb9f5ab24e7a7a8e85613d57a760768becd03af5acc95faf2f8fc6fe047178b463950dabc11c8259ac6b884bfe9674626b93db25616219298d53baaa3a85f4859a390facaba63d0fe94ef17307829cbe31278ea681572ab38eb10a2061b050c92306ce23bbb4d2eede9f67d7dd8ba74ead1e13f4690d92075a9f4d6da5b8a00cfe3d821ce0eb04b8b16d8bd3bef50cdc2fe3cec9d9a5f9bfe6595b266749ea022c70953f4a781e17baab1c6625b196bd93f654c76f5e346afe99b87dbe0ea5e9c701f0916b5bd857668c19370d15e0d83e6a0908f383d0225da40af48a96b5a64b21df49cb584aec2419adf0de8a2b112a39b7ad1c83f916e5567df2c43044dd8c6a1a1a88c8e9baaff29bcd48a891771c1d926b03f6380534eca581ea5cbbbbb5cd7c4a21cd5876838029add9ec555af9569ef2e83873f7294a6bd81fd76e1f0642610f932f8c38e9379881d240639953a8c50e0e00e15a69347476125347d33218f5e64e81c7a78aec1e37f6fed58221f6de868a7488e5740ac334b5711679ece1e1f744cb91813edbeabf4eb08b01f0d7236453cd5bc593b84ea9a36d6d48f2e0572cbdd3d7e9b82b4e8e0635e6dde9200d9dc6689de832fc709fb6b45e316e756064ebdd404a7fc75e22b58370c1bff24b3298250a52f51e9d46763c152455175375d9bc8aa0f4b03000000000000000000000000aa9cdbf299fc62b8600a2b3a19fcf66641515decd37eaa2e5a10694e4d42af286348883baec69da1c3c278faf3230e8ca44fff3e20d762c67348c16283ee7fd164b5c50f264d9e22b8a913bbaee81a52ef1b80e24b02e354edb24d29d429f3de000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d3fb6032f9ab428120d0538f47d4d78c198040a04b865021bb8d8f9e2476d0ca333c2df441fea73f3013b97ff68efed8b38c255804791954ca5fc6a6d1c6c8253977da8bb6f6e76d53ab7f37271efa4ad417caa5e35f7977510dd8fd0f1c8d9737595b0c9ced6d7723e349a2204faa0b1d3c76d5f7bb7b00554ca5dcd9abc9c0325bda50813f0038359d91908f905a4307f538b740f84090590be5481f8d8e36203065b7b9b47e379e733ab5c2877632b6877a5f88d71ce63fb532ce068e6bba00b0b028aeab2ca9f4dcd97d53fb6df099e73402af12855d3c7350deccaea6935f63145f9421fe87797cabd295c3b6a4be5c5177fb5afe0964cfb7b8eb245186308ea021261f4619d7ea74d7c08ceb0d4bc06adb7652c44fd309730977b6decc5e756e2020c0306fc5e5f61c1747c88ce02780bc95908604d9497443a5256ac03c1e73f9e02242d51468a733bfeb6d4b4c7555c2a954277795cc6cf351e5b1e90d8bcf2c7520224626aba71ee64303e2b38f78bf9082123f7a5c296497913f7afb87488d5255a030bdcfc1c3f6add59fe43c73042dbd84494145528f7dd2f35b6d876f137c3a93807a93dd5a8cf7e27fc118398f18d3c72e88810958eb68c5187e4454be2f6a0f99805f63cd4c50ead5b6902ed06f027c4fdedf6396aa0206028ef16a4d724b05a273169ceab782e107348e34cc9f9c5626ce74cef30f04fdcf7ca24c3663dc093bd3486bedcc75ab07f2ac5113539242155b381dc203e2f6e3e2d303b44f03c84bdb47ee3880b34e30bfaf76225fb53d3d22d5b595b56abb864349260b528a6595a62864d06b995f97a9b191f422c213d2cbd11d712d1c7d17f4c97c269d6a0d0bc27d03b64327910380364f89f8390cfe367eabcba545178bdeef80991b0df6c52329ff2c9485ced0e8b143900afe113aa994111de1e2e486ad481f7349e5915e1d3bfd0490d15025edea4c70c52c9506914f0fa4c4936658bacbb65f5634b525aa6ecaf7a3c9f7caf108cbd99c06ee1a1267a278568d606a2ccc62cc27d8df2a192de1132d85095b725de61ce8e75b73a97c4a134fe7e6fff220794470dcfe3f4555a12edd52597fc891c4039ed8910a4f1cd5f604d5a5e250ddad3e0917b9749f7fdfbae5cbeb3e851e5d821067f0de54d2bcdfb3eef35d4f9dab5ee8df18b4b3315e457da67e81b6de7c437a7df91bf0fac47f25789ff50c983f077923dd7174511698376b9d7801557b3997331396b87ecf617bb7ff4fdad341d4bef9e139a9aa60a482fa3d7b8574124fdff9f746dafa9858aa8d7522ce94345e408fce12bcf8b24445d2508cb0aa1d94ca9d77b28d3aea9be0e10d04d3642bc988ab1cdd3d2f1be35c85632089ac717970c91718dfd7a3a906239138c9d022af119150f88ee59d26a46f0e1423781b623eec5a8b97c3ca91de3ce253a9652a3199f195ef2a1fcf18de0ff0fbf4b5130e10fe743fa2e594b6260c43cf673718211936754317b9d06648e1e985f45f2f7cdf1d67f7a98ea695a7aafcf77a65d6b22abf36c5401515e84aa5328552bf1ba0207c34e06a99fc4cf503c2b2fedb38b7d92a8b8b66e33eca54b708ad2a5d943a1163fe8f86bb13762a19299d6ccd31c7d8a3bb4b389b277842055f82e96a896c097ae007a05f0c98dbbeebcb9f528e155507430bfbe0d743fde24a856e61db70a87d3421fcde5e3a6e43326524824fa165a5823bc48b340dab7da10f7832b34213fa2b2507f3f69a8354dd2d824d23c6c8a70c0a0a2877a299d95e0a51ffb22330974efc5812c58105c4a39efebe5dc5573dfdf18432ad5a73ae2ca03123f9f107e1f3c04916c49015358d40cf308bbe7c59c70893fc74c47f066618f924d5b53780fd3bd97460d9e975206f1ec1349459f473455aefd11c30622459b224804626cca26895ef33950580d05ed178b2c25d1424fc5bb3b2445227eabd785c94ee112a98c2e4280aa135069ab7a96a3616ba32cc090a27db4b023ee5898db8c93516c975cde42ac2182ced5d0b126581a85b78621a53796572d0fcc32e60e6a4b0699f31c988cc86c37771c0f044bc08aab8ba49d05801df9574737987eb205ac82e821277d2d8597d90b3cecbdf13330ae3ece4a2ded2bad1257cb7e1afefd7028e4a7a28f0a833e00ef1c1149bdc97f44a429c0be78ae5168a2ec5b385c59a32f9609bcabba07e8b644a915173bf6894d243fabe5df82a504807fa445a16e0573ee4f5e98f48f4e20c5cd014013588eb3b21fec8442a411674463176f06599180d377bb747390e78e08120ae77a09d5fd019606fb0d172c2b537bc242e7bbcc19e60db6070f582da548dd40b22fd503956f3ba19d4b815af560dc55488e7eeb324e21ad2581724f43c194325a5deef3fe6b0358d4c8e5c9920deaf325bea24acd6d65cfcc07", "65525163ac6353", 0, 2140922588, 0, "2e39b76077c5cbc3e5cac53bdc50e780220169ba4e6b4a2224ff52ccb08ce0cf"], + ["bdc0300602e3c431b18ea956e29940b3b6d51ff513e496b1e207f2fbbb5877a54464f35cf50300000009535165520065005363fffffffffe30ca0cd06504d7a185ddc0b8b01dd6607764869e917ce467314219063a16f00200000005ac65ac6a63ffffffff02572b8c040000000000d06c1d05000000000553535352515c63635700", "52516353", 0, -680847213, 1537743641, "8cb179386ca061991e2d7921da44a8ef68c1079ebb824a0dd84582c82e77f5ed"], + ["4cee7c4601443f72e86b86cba58483e7c4aa963f8e3f582b6e6c24929f73575992c2f453330300000000ffffffff04049a3d050000000000d8531e01000000000553000000003b9d00030000000001ac1be4a4010000000002005100000000020000000000000000a27a8f0300000000753db64aa3e7c7f774b181fb125c555c3823f14c6bd8de96ca6f7d10b7090d03b5d5d4f3c6679a017e71d1e2c24f43490f6bc45f3036cf326402ffa2c759631fba59f7ba5eb2a2305d6723405eb5925189fc668bee52b79b5e7ea826c26d4e5700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dc0e03a08e8c1b8bec6234a06e71e1d28ec34c1286a8ed1337f5ca61d8911ce1934ea1ed8eceed725a130effff95a00c60e212023c9ba2cc66bd4160bb88d8f971cbd810c378dfba8e7dfca28a02bb360a6d646fbdf6b76d6a27e8d6face3e05682e5b69048964c4d2528b39e9f93be3484de9263e0f971878c38c6057fcc0990226c191a6b7978bf58af811f5ac72b7f096630582887015022e3a20322c3761300204dc1e4603d290753579d0af4dedbe5ecee65dd9595e0c41705a346ed14a833f0a071756b2510818b5fc7f0310ba850831a85d99753de27833e24ee3373616a640502c776199b998c60a8ae6a0714723d431fc0e14834d6669117d2ed7ee78c376030dd7a97b1b3011054393fc6776f7e2c3fa568e690ec56d14a69f7fbf296541f5022082a982d55b20a3f8d963cf501d8b082cc3c23eadabb10875c50529a7ebe78f032573ca1665f31bfff7f95c0a4b8cee1cc99d08f306253f0bc089d7c7dd2819bd02198cc12b7ee7894bb243994be29431ebae5a16bba15c65eb0869cae53fd58219021c61aca366aaded833ba8a059a47c22ddc1afc310a5b7beb2e6766ac2c0d057cbb34c988e8bd104f65b55701815e8a55ac70ced620028ee3af1092ec0e7917349f7ae21115c60ba20a22f106d674f51f74b51b4a3dda84ec47ef87e3a409158392c5666343a727279869ef2348628e7c7b8c6e74b273bcad6af2975f28b2ecf8145cec6b352da78ae377bb41f9af2a016eda61a6a21de8534b2a1e79026838aad5852b811ab06a3a365ac2eb9e64f9e6ce937df48e5d82e0122562cfd87ca851a7af9609a7498ac2b5a468e85f7ab1d3ff953af11a104a49c7d68d2d39ed77554a60a66efc35f240b1e9a2db9c0b12c3022b356708bea1f0403c010ef9fe5d2f355663dc4ea58a809e3207339212fa06531375798fe976443f1828c9404487a2a95889c773b61e318a715956a52ee20b89112de642f25b70175f71f82374d8d44089b64d8df49b5378656a0983263891eb0871721edd52d4670327c7b3f2f88fae2bd5322bb59dff08ad5c0d90b53ca96e8fd1332c727d089ee5f09b859744423d3b1c8499cd9f62ddf6f71e4e1224b1e5250e62e2ac77f9afe261ceb1d9f51f910f86d2324f2e630fdb667acf27d801b0fa29690c7407a78ca5da9a6a350dee6eeb185aae655a5fbad101f5d079906f12b5add7e9b0e901d831711f4c87da59fd4449513d25e2de0cac0061b0a5b556709757713d582b219ebf89278b7292cf4608d27b44351eaf2b94871d9b3cd1fdf19d9c97bb683abe5cd1995be126666ff401c4a82b72b5400995e66947c3be44b0b594cb6ebd3abf88c9af8aebdf684ded600e5be4fc340bd7b2c5aa08b36a2871849accfc98f280d02f356b61bb584be5404f2611e56cfac94b474a74669d14e9cc3fe203b945d3233c349014e38f0735f8f15b06cb13fc99c0a3b0a56c4dcba612ff65d98592c4aa32a10fd8dfaa9271e46fe8dbd7dead85973c138b5a4c42a41a81fae1ea8020dfeac0046d81a738fc238407820027fccaad87eb79969979932da11e4715c55e1bbb1b52aa7f02ac85e102a011ea89ee5d7654402f089e58e52f56cad50139e202a5a9f2450d4a29e7b4689efb26cfee5546663ffb49de3f0a090cc8acebde00ef1f6e79d5ed894a9067293978451af1cc89fcb12f91214f983738ea99ec031601e2885822285d0d3dae60b4afe853443e54beef9ace5780d99e5744044ecfb843d9630be08c8bb1b2f235e44dbcdc48d6e0cf24475e1afe72d03ebde2d94944a31c0ca26580f4e9cd6661687c28f0d65fb86b756cbfa2b760a1b39d037bae8cccea90c474f0447c81d0ec467fed9064069c06cf3858c1622f54ed82ef5dead8e0613442ee064c53751eb0ce3596a65c4973ca5d73b910e82272ad13032eb216f3684e5ecccfa4c5d54425f489c80e2dfb24bfbb946832ae54edb2a2114593f7aa59888101002bb46c2121c3664d6e3231d7e10e4a3bb6bd69b35df5b76e6f07d16d45d360b4fb01ed61d969b8df0e21838eec70b7dc1b462c28b1ce56bb37a22b71735aedd9cdd793fa2d5835513c96671502f0cbf6e2c2d86c7a52364650234bd59f637ede06a499acf47bf499050590f7caff3c93aa062b96fdebd3baca2d990caf5314374ca5aec1fa4519b42e04b7bf0bee35cf6854c82f154740c74be5d1a6d88b5f39122c497d883fa48b3bc54e7df2d7fae02299110874e0132987e54f238df4d8055909a5fc084634b9b9157b237920f21a477a85fb32c2c402000000000000000000000000b2327e6f2f897adf583ff9e648917e655598f0efaa40097d8ded07ef48c4a2bd291f78e2a84006cedfefe28a4c2f20d8439a07a8cde7ba48644faa50a9663e8207b41d5a33f747bbd3a1431e46d8a84ae620641330ab5411268bc7904942bd85000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dccb7361fabed62a907275e9925534e9712bb63889ab90020a028c58f96785afdd5d29a5ac91ec96fa1625ec6d1b082570a56bb1790a29b9a6de31a763955eb180035b0ba30a92e7542e3f9c7b9518e6b85861c3de707612fda6a51f6b5196aad726fd77c9fdc1b2d3189ea2f8d4cd7cb54499a1869e6426dea3e4731c98948030445c826adb7a56bc529a7442ac07ff1211f5cefe316b421914e3314dfe0f785021f7f86460c89f5449ed1e37e9ffa12b163aa9ca65ea529b968269bb4b20401430a07cede72f923fad495e8967a79599f5731eacc9a3af86caa0e90c92bab9a7deed23a415565d1347840c829ab5c52dcf6005bb6da04f7246cbda8f58c872cc1a20313fbbce3b889b85b0f0e1c611a9f074fc1d88cad4555b48565fd0a4b7ac6c6ec031e3960b8509b62970b5c97d0d306509067c2ce0401c5688eb40f0a7cc4bd61dc030b15b764820cf0b90ae0c3d9747236c8b56646f0027e953f41a31cc2691cc9a2032b6ae3d7371be99292096f5f1c1040b7a43ca54984eef44a611f2c02ec02c8fc0322d4b54f7769ae60d269598ec45bb2781385b2de4fd7996736e7460902aa965a0c4c8d414d53ff8208fd91d67862d54efae0b6822ca384e40f218ee4af8c1d25c130a2818d4458d0ae38d661b7b5dce4c01df124d0216f11391220ac0f192f20462234b525f5929b7af7e85ebfe59be3f8181b4864701e02ea679037f66202e08a4e58d1bb9dbbe295b3b3dd34045c94f8d52ca51eaadf5ddb5d03d7833c96c1e578c8f7ca70e155a4e0f8bbcb0ceee29994626d20dcfbe15d1ea6902d02b1cbe6149da558c27632865c581a7d28556d9bd2d75f73024ed8c2a68f715156515f5d35786d202d09aa807abdfbd4b957c667c236bc4e2e5ef982463a8f94bbe1c2e85e17bc1d4135c23f5bdc8d7baeb55840ad9f218a0ec7db175d9c220a61438afbedcd8774de26e7e44278f3da5c3fdae818bb0affab97989aecbbdcb675ff2815394fd24cc9c2b5e54cced781eea2c4e57bd4dbce5ea8047c4a3e79b0796377edf7bb6de16b97153a4f7f2956c921096b5e696b1124bbca4d940c8330a1653d03a9177ba51120866959124155c9795ba8e3002d45e6d330bc22fe0b6544e2e950a5f48a175485e9b9e6c79173857f5fb31de2b5baae567f0687edff4b778dca6abffc92d0938a31b53cb73cfb4a313b02ed737e2f42fbd0caca097fa317a107bef246e498557c10a27bc62d1c5d47c85157b0ae5a3121c30b88e4f981517b47332e2acf45a73caefb097c9560160984292937f48ad5551bdc019a3a1790c00c388cef7260b9710ce7cb1aca32a558f04f5ebf75401389a39647fffdede118169ee0e0ecfaafc1142e68e78437d930be07ed620187a9cc8ff18068a20bf2a26b8738f84f4acfd2ea241623e6288c6a5ebb0888c150524b7a7b3695bed342f750ca5a59ac25b728c8eb114eb30867dc79f832c2f8645714d0ced8ce8f8cf4eec60a74f2284384f14f3cff2e368d0a762e8928fbad7ab35f149e15ad722975e9716029b934ab48615805666df4849346bc3c318e73dc2997e7a07a3b69d8215f009824977b32c5b49b67f22e2f72cb92fa6af797db8f1c3bac21f1bdf156fe061aebe8c57a2973563578d92ceb2b50093bd50102a4cea2c8c53afb9e62c99400e961159e36dd93538912c501075e86a1bb65b15bce829195de0ce44b2446a26067c87cd72bc80be6dd1f5d7896ceb0c3ba4ebe236b9c6f1ec4fce4e267951accac1ee74b199f4892b0734e705e1cfc41ed59ef4a00e5df0166f6e8d09a7ce18a37efe8fc164bf99a87ee71fea37315769fe6a92e596f9f6105e0bd8f7280be362294675da75f6dd39ebda7e3994a2c626d8435c839a947fc67374da7abf1c8a025991849ac73df21b31096db8368324a24dd3a958db21d668d136fc9480b85e8c7e9df708a10d6dcdd0573fffdc05f16330f54a29cf00f4d07a51b3a769381f40e43c6e9830b22deef192bb11500926a4236aa66b2cb1f57ef8394ce4552a3a9c1f27a13f317cc4a812709298ff3cef8f7a6f50a4e6c543a249d30508d3bb48ede17fe7a796d78fe8b7f4bcd5c004a6494c1104fd60bb81b4114b43bd3747e6e8e8d5bc93a914efa496507a6d36fc86c27e2302f41b5d5cb37c30017c11477456a7a620048d75bc14b98014560972abcf32468de16ecaab8cac4aaa9eb6d4784057acbab78215b9ea665a5470ab34039155fd6777d2b374bf3dee5fbee4aa1b6594549f1a94cb1ad1b7a34485373e5b8461fec8b85e6b1da30dd642d5ba31e337c955bf9f6bf27bc93552ed3145b447b8acd472d60b66f94d8667e5151d4bdb9913af2ae9fb9440eb7b3e4d119223b1356c15674a674bc044df668883d0cab68e296e178cceeac85a610d27a0a5e81df049d01", "525300655165515265", 0, 710671951, 1537743641, "91345f2c78089bd583a5e2e7321d6c23280eadf16115e43482b4a66839ab3443"], + ["030000807082c403025efde018dabfc5378dd71ce06395174e80ee038f3cf3fd7ced6d5cfb6cbebf890300000009526a5251ac6a5100acffffffffb4ff330143f1cf3284e2b4fa55a955522d254bc25cb66e30603373bfd65a9882010000000165ffffffff0379d931010000000004005351520465630500000000086351636553515152a399e905000000000152000000000000000001b6ba5200000000000000000000000000547957fbb816dcc3b367c78df5592ff317f714e2b00dcb1a81f187be5ec3287d6a110bdb273989d1e5252062f32e7c224db6d10f9838c278a27fad46180a94aa12aa965460172893197cf793f1377d494410d277a78e7233cb50c80cdad029dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e924e443384abc5953ec381001dc8d32d74ea6db8b129747a050c1a1b1bc95a95606900a92dd9a6af31e6829afe60d19beaf8e96f6d3d8ff6b0dc3bfb47c4fd7a1b7c2503b4572b320c0c534bd802f7ee4c766e621a68e09a52c899754aa8e17a7f53d2f8e5bdf812c6596718a1389d5402f01b4d5acda53249210290411b6030229554de30fb5001829a66dd747825e9321f447cac2f16e396f0ea35ca9647d1f02106c5b87e1d8e193018123eefcf6e6c4b208c53a02666eff34a8b0693efe6f460b02a09cd6a3cc720aa92bba0148e9b591ca9c816eb38724821032998be57244946a5c8b4f0f1679d244f2896ae638de7b3bb635d5d2736c413c71344cbec8062f020186b0ff97dbd785eaa4573138920c8a7e1e4731db9f64120f0cc5849f28a47f031626950a018c114934fd7a997838b243b17520d997332e2efb4a31b127bbe0cf020f7aeabefe410562309182355d0bc50d0433d69c0c543c2df60e854f0c422a320304e1698bef6eeb1c4767951efec232f30f2de2ae92dc144b270bae99455024e7030be72cf7b54f3acbfdd477fb8463f69fc78598f4cbc5477b31e4120cecc16529c1ae0b585b7a3ff79362b5803794936338608b52908fa24389a8aa6dd7138cb49c6a7960dbeaf450b7264c505ae9ab57f6e98ffc1dbbc6e16d63c9ed7f2f1674867087efb50fa47c9b7e120f35c096578c73c5d4a72c4b8e8f71598f9f3810424ee3b70f626af91a2d492ceeb00b70e3608fa2bf71ca4bfdb79c074616e9251394850e856eb9263d6b9e8bbd43de320f550016ce65c9e0fe6b146c92e66b5cdfe562edf201be2ee872a94d6d2acda89ecce8a38005358d199ffb557fbd60d19c226a3ece92dbac6789213c9b0aecdc706fa66d2970a83e0da70b133881fc9afde07de26bdf022313ee882dde2bd6bdaeeafcea84de0d997a9dea85a2c7a50c53b0fdcb43ac73a1c85d9650c31f909573eb584a65a6e4ebe68c6756c780318fe4e1265b379b0af3891b83d05ea22d7f11e4db8d3c5aae1431daa628d6a8b69999ca27029b3e819a59dc43015225535defd56264dd5125538eeb7839a883b4c7a9f5e1116f5f4f879b936cd0c93974a4c5301ea392de132e482b282bd8e3008107093fa01f24343ce14f9428a0ed365999d8c824a2e79b109f461731fbaab28e42531f6973ba5c365d277c8200cf4ea0cd3816573d95ca6fadd48c56137ed27da9d4a2628e31f5b5e48450a1c1c5971c6ff8f2e7eb61c97b98aed48ed874c95dc841370ad73a230db570f83f214adbc3846e11c382ad86d28a07dee1154a0cf9294374d471f812486f5e6c0594852b50f1cc820a7c7276c4e3e70e778557fdbbb0eb50fcedaecb2347ea8dda338260d800c76692b1f77fea4f375635b1248015b012823f977b5ade3bae231665d9f04987fc87d4bd867a14ea2352845da8216ef19ef37b8bf8b7f0109c909cce2a58c8eeece7d16d1f7c59a9cf94c2214ef105069c84434cd3983acba66d28d2fc0f54682f129eb299afbc2b1eed5d1e87942cf48cf3110fdbfbbf80af4f3cc8291c7239edf2ecde826446ce1ef53bb0ae9d948be2671edcd6ae6f1b0413eacee5f5d899a8ec7eb140e46fc86b8b36ffcc2ec3db868ba97d0dfacc4c0b4fde4ecbf8cbe5bfc99f2974f876789fd27293ad82003bab8038ee46ff9614fd3fff75f62f7fc6446051833b283fde7eaa80d9cf9bda4da4ecec266471a74341ae9de4577b31dd1033646542d5825c74123f522870508abcc528755806ba785abf3f062f60138ae67e83416597e53f18e2f59ed1bfe8d95a6c21e740d22606aa93a734d17ce18840e052f37a05933c8adfb4d3f38ec6b7c2a479d7730dafbccff839fd9fb157be616ed064e23352767742b464eaac2d36868d76063170f34cb9fc0ba676ac1ba12aec461cf6647781f4c3fe0142b55dd433bf2e7955e5e8744b5d03d2a24af6527c06e5932dfc92b1afe239bcd02eb01b0bf1db2f98475b7428e943d6e9d79ee60c3c477b6bb67d72b382f2527c4da66d34398983e97f811e8f2ed47639ab50f6eb7c3bb1568eb4b1a130019960dbe818740cc968a95171d0d71a33c338ed68fc9d3fba17f23062b334c7066e8476ddfde80f95345370f26711becb1ef74efc49fec4944b5fbefa6d99cc0fb463c4790b67b85579bda62e0f47a6bf8ce3afcdb19403bee6340615fd8a103afc04d57a2079230898f71c915e7d9ddf643c9960a2c1bcc64a1a14bb65979bb610a116e507748b478daaf337eead754d18fff463cf3bcf94c2d6d7f4793002455cbdb227406ee1ab63020ea85f32dd7aa52e433a4316922fbe829d6b368f32cf89aa4f9853e6bd42b79b6b2a3271df567a923f43de33563a423e71b9f3100dae57029cb24b46ad824521116475a286d4ba9bca0927900a", "6a53ac63ac", 1, -1344800502, 1537743641, "64bb2aab93424009560cd18c43d23d31aa92f8b729c9d7b8af7e049ebdcec20a"], + ["030000807082c403011d06838e7cfb0cca448f533343b5bc1783b2a357af4188f0e71d1e72201db6120100000005536a530065a07f054502ace88a04000000000071bbcc0500000000000000000000000000014dab7d01000000000000000000000000d2df2df13825b36adf59033d0bca51b3d946a3b84260c57438a63ae3efdf7cdcd0c2eff1ae7a75ee5007c20a8a6e8bb2611554809a42a705cd394460f2ea3d2bb8c9e8947ccda59a1b6c682c96349253a30d42a286d86aaa17817f66ab3ef35300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000102cb763b8e41d99f82f95b5961509bd427318b2ef73076053002d7d8c35e9d25942e986689a4da3d0d88408cbe2569689c6615d1b65ad05f4dda5c9d4580b8ddccc6edc5e36335705a734f5017f944e79e2e5714f4cd39436f4d16b3e426b098e4e0fb50d11f9018172341b48d387940c0d784d3eb198423cc1d5cd9dad04410222e3f90dbc170da9744bed8e54088b8230ff95088bea4bd5208b688f362a3e300213c1f5c8225321a68d04534c553bbdd7dd1ab664eae8a3af856ea921896a88540a08c6fc1e2d7d252592e5ccbec4ce502a0b88291e3d807a0a9511fd2fd83092dbceca3b52d98d5ba1eef34b2f7c0a2119672565b9384a02dd24778d79be80463202261199989dddb0719e1759b4c88e2b961448da8fd1aa0a27b93d897d9c9a5354032eb777583da8b88d2c002274c0f0bdd15fbf30a0502c41bf8895cecfb4b942e7020e6653aebed92186a36a2603829eae433b0466e9435a2a34570424eb5c4742930310e911080f964b1c2fbfba534750e0e856b7525879af108763664d036a7ca0c20215cbdbd8e4b37f9aa9e8737d9f982861cf7d6abd38d6e4406a66648706f78ef48716819e0d09c24877196360a7d69c1994e4a6b213184d4ba9e388352c43dff9e39c77930854a26254ccefe4a125d69ecb22a19097e116a6b75fe35b701ddd01208ff9649b6861fe3e247b114f5d562c3dfc5684ac2d99c9b96c6485d454f13b1b428c0f53b957171605eddb66ea2a90087c00ab9b0492cfa29d00cd5834f4bee6389effdf61318f91053155f3de5e803ab5a86c67f138839c3407959e0f95097fbf987694983f5d36eec7ad5991c6b1514d518a196acb48a960b178770f392c39aedf24b43e1bc9dfa1b028e58124bd98e45fb930f43b7baef22f66f026e4303d9b691e48aeb42591007cfb08f2b8a2be72a4c00249a2a17447e920cfafa0049f4e9192cfd8461b61d6f347c2174209dfb1e1228b6a8a4943370b4cdc0166307108ec470eb778cd98dde36a9b9e9a2b2e1039527d000732b41bcf9729905b5d3639218529c4db904380954b1af6997d4a8bfeb6e369d81b8a323f69235f44c3d12d9dd88a6266c22f63d276da99b376faa03007f3ae682d5aa9995a59963499a2fe6fd76eb8901ea2d048ed901e0b45bcb69209892a447830201c5ca1e4fdfff575b23e34a780d56ddbb47dbad64c3c3992234b6fb5a8d516b2d9af43d69972a8437b7a6ffcfacf106d7bb18e12db1e500107321b1d42f804e272655c41535590344c769c7c1eee0c569643bd128362842c2bf92ffbc5f1c45b7ff108c879b5f8bc5e43150a53ff9b0ed23ce2e64c7ffd3c656082cb7745ba80f0acfa7ca36e583e2174d566f24fb867ed19d481d9da0b4937b0d74929a025b770fed50e21486bca3c483c6a45071307772a7dd491ac2059a77d22fe77a15f9ae9ee96aec567792bdf648b69708381ac5834f2aab880d41b9e184ecfb6662eab95fcb5a11da16b149d25ea85a183aa1764d1357ce9c08714b1f9782d8615375f1ab0a7bcd31d9f81e840a197db94bf897451b653ae5c68bdc0ec6177affdc4e844a7740539332432d027eb4352783653b3f994d6fc7becab0dd130b02a2f1aa97288bc4d6fc08d6d3c92f3d405e47c40f2dd932538a66d1373ecd059a81466df645ea8ee55eb2cf6e7fd2230fd93292e194a7f4e8f75cef57a2876b80652bfecaf0bae508926ce03072864134a5f4398f9dee75dbb0b9fba7658e244b67452067d195708012ec86f8197193f62722ae66c34468360e72ab27cfbaa056298fe6ee02542026ebd9508506be31999ed5cc0984dac965610f27eea02f95943ef2c9c188fb63de93a246c64541f2cdfb9cccc94eae375896e16e24e7b06f79fd8a0846461c64cd7d6d05e8ee26f8adfb4faa4a77b9d2c831eb2add18a7047a42fa24513b4ded0ebf00c8eed8f01be7c06975f401fc34538e3b80317f868329f66774123e1362a64e5e1c5bc3cd139d0509c3dfb3d7b3b9ee68579fe2b8756dfcdc6c7703a72a76fb7971cf9554b77039da93b56cef040b39e866a60ed343beaa10885cf357cf82a34839e9a9b8545d91f1b4715e7ef03c2e8d04e0c77f9ff6d151c0381849bdf9b8828ea5139414175c72e5a046bbab824c0f00c9b2d95f9f1e90872d66a526147ce95faa64639c239398112eff03c1a633f4c587c31c5b0a9ce80ffb5314e2dcf47f723e54703dc77ca137e1da2fe2d2a8cdf4c811ee561b747763ec04045ad4f734fc5f36eb54a276335899da92cbfdfb8025016c76723f7c21fb4c4871fb311ae09224f1aa4dc282f6e9cbc92a85d69ed030648d92ca15625a2fe111f7854c16f8139f9112d78ea7de9aebb6db3eac3cae1bc02827db3c5591216b52c66545aa2c82ed43edb76d7a3b3ea8fe93c54dcc6380a", "5365", 0, 515227481, 1537743641, "9d8598a891da9899e508725c2025d1240717851caaed1b6e67fd2963e5f60306"], + ["0000e33e015bde0d887c452cb548ab933f3aa026e36298f043a4a15412d2d7d6895112160d00000000056552535200c540122204ece4b202000000000953655153ac636353630638cd0400000000026500bd6ea70300000000076351656500526a9503480300000000086500635263525251df2c271c0100000000000000002ffca40500000000d31ae2f9bad16fa666b3216486d96321c956cf46d8a7c4c34294a2e6de622ae7439712a0534e1f1c96aef304ecd6abe7840a04bfe17532080d409150526f9379347a16f05411437a91a154d952853442221727f382cd65670e402f93918ca50d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000242b8b81c219d7e235c767f9b555a6f0f5140bacc42f3645fea785726e4e34a957ac80674cda594132b64f91e086d106c525382f861c39c402e54e39d441d67e1a5a3734f5a2bce76c1a19c93bf1bb0240abaf5521df11f73bef5cc5b90efee1d1a3d0d9c0714a16f1cc5b77dcb822556485eed39fc08bae024511e3a8510b71031b5e1d72522258db55b06f3002f6307d99b67acdf6d1c9a7884927e52f0cfd51021b80d9ce658616566bff4d629e94b6ba303fabbc544e8d8e7d488d41dfcbe9d90a041b301d20c1d30cb0064a39c311d6e50a0bfd30838c427f513826f3631576c3b149bd288078acf5d99be73ddf4f5da4bd42b70759907dd9d2d3f1b08f1ff71c03120f362ea10ce147301cfe070d646d7352fc18411769bedb369ee083c96749cb021669338c04ad02d7b850dbf0baafef066797295e6920ae3847f6e4c7c6a5d4de0303b67b82c1601c85027eda2a1e02d60f7482a9d164784bf1a65a07fc83245b74032e6ab600ede624bbfa4c08b33f2f8f0930bf04bec3e1b356199deb1ef0f92b3d022452a2ecf93f6a0c6f996560ff4ee9c6f74859a1613314dc2039c265c26a3e4152803c5cf94b67f34598e55da629113b41bff5d9ea63bc6b3b3531c497bee5a85292f72b3c3b4f347866f05703daeadc3c066d084b3e4a6f93c7f9808aacd27f6ee08d75afe53994ef911fcd66ec064208cdf17eb82d2bc1250b206949faceea372f8896399f4319f48a8ed9f5f9890e644b516bb3c45d42dc29fde8ae4af89f4d4150e5e3c36bb9bdbc88456c219336ba498410f1c97b07d8934d90a108ded11c0a13885331e846b1a5ffb32e97367e0e4290c5c55ee88f05fa76eeb6dde41ed692f57b13f057ea593f48a93dd4b272243f0fb91cc65967f0fc014a83a503f0f5b99adf741a48e4bd33c79ca697983ab20c5b6420f1f60625465665e1588271422d3a01d5bc5c8221940f5b121979fd76f28637df0e2feab426a9fe9ca19f6cb37b9a5e26614528b864afcdab643e6df47ad96b1ae2803b8efd8720d0db6429b00c1e46c5c6f93849fd59b5bb5e1753a42fa74c806b910d8b1d5f92d1d63420403bdfbaf8ae18245e683f5ce5c40e8bbec4c4bc25061dfbefa2856ddf7541bdd1053355d2782a7752c4611de3841dc4b31b654156bf785eeb2ebcd88663d8ac99cfdd4ddbaf16ba0900f1a63384e15ab2bc664b6c3ca8cc8d34eb23b562d8f50ae87df7b637cefe5724bc7a070b7a6211f0f3b6ac5772ca315ff45c51b6376b7b8be334bab1c8c1c23c31e5bc25d66ff52b7c5c8be584591e23659feb6afa6b06002261c9f8019d75174ffcc46f8d1f0d99636c24cb4df826198e400840c98d11010595ddb5d64d44425ffe82e0cba72ab7e6fa5b5cb85f44d4397d1ebb08c8ce715daa23b2306b7ab05bddaa0bd54de6d1b6d73f90a333c284e8b21d53b7766387baf073ffca25c847bf6cb13ee8726648a8905d31eb91b3038610424a73d6aa96d9dcfe90f146b055d297b68008824e6640649aebde5d32f115e9698b2c7030a669bb535078b54cb92dcc12a0b8066e93fb3d14dc02772c713356bbb59cbbd2ae9ceba497879aa5b469599c440b70b572b762406d8efeb34cfca7619185132f50347b0e7de9cd348bf6e53d07e9f249beba7f3bab7ddb5cf5fbbf212702d79ac33a58755d5945631587e415dcb4d7a8fd6235b69b2a3c1037855a68cf088ace87d9ae532cbddcd0024f3454e0fbce262334d3498c175b68f27cc34c7d28e93dae59720e0d11c93c7a1be0c3cda86c604dbde6f3c24c30bc6110b4e86594f050ecd31a3dd06015749c92b99d4268846319e1956d1cdba42bf588ca522badd260fe00ac2cbaf275b237bc849bca3c3ec8e7cb287963a1bb9c851713bdf51e4abf613eacfccb906c7d9d1f71f5a3b24ac4940ec067a111b0b916bf21ebd43a412c9e219a189f892973b895a150dd39f36538f88c737e0ca9b0595c8275d50fca6dd639edf23c02e8ab369d5a6e94aa621532f8234321997bcbd45da73fca3fe0ee3c29a0888e4f5ab991cb8c6fe2a0e445f2f555569000599efb1a92820c9e7140d5c12e30d38bcd035953e24ca180ac5b9fc3c5caddade7742f50ff78a524cd3a44970318a62d98e197302a5b5fddd34527939fd641e8506dba5a0abf789dc6f4a89e8b06726bb30ae82761fec111830e471ac38eb41ee267bbeabe31e24f79481472ebad6e8c35e1a8fc593fec924ab1a494062349955598406ee56e5c57c739493cb8e96b74e2f41664d1ab64af57c598fab67e1285c3bfc22ddce2f99c8e280b4096fa6e76454ba3ac7d68c3ebda7ac66cb23d115440edfda36f0e2fb7244e33f1eef589def5465e4b2d4dd7ca934169b90107d74b2055482e0f93135b3e93af556dbc91c0893e680ebfd5035afa3009", "", 0, -1239815601, 1537743641, "1d074401d8ec7a11989714791c3ba45e14db898e47269bd4c9460ae9caf1027b"], + ["862f207b0477c51c424565738c750130567d806d51c3445e3ea02ddef9ad167d1c9bcb8308030000000400ac5151ffffffff6e21038948a2c9bd2909d400f789cca09c375b96305f873ecbecd897ac17ba7901000000055163515165308c2d34164bef31a4b5e0b09dc764e794bb5e8d16c2d8d22695aef2106e281400311ab80200000002ac5306bbd9b832e5e941daf11c296029fcff22de1d91e7c31c784c124c950f96b0159a89786e010000000163ffffffff041103e402000000000353515124ef31040000000002006abe98e802000000000763ac65006553630c0dc4030000000006526a0052655300000000030000000000000000c95dd10100000000f99b6f9df3b92f18eb87bfef84b2702ebe8e1af44ccaeec9ee4e6bb9d96a3294adc864fb98d22ecebc063636268cc297d1041283c6c2e4ffa303b0f7cbdaaf41849e2be5522420b981b22c4280e6ab86ecbc0bbfb0a3d07803b3efb1f95672b4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b11cb5c0bc56647ccf5145dd6a7678de0275e252261c44d9e8fc7cd124a633675827b382c175be08f73c391325971bbdf4eef7d322caf8c0accd25db04f1eae226ceb7f5ec3aa5c828b3818aeaf1b6a48baf0f8fbb14d43d13ab5e159f93722d88c9b8d9c49ff5187a525ac994aa9eca71f581908b218e3454f9dd38a8ce36403240bedbeb68748e62c5ed32c72c6573e4836dc05aabc7572984d08bb89e2d551020e816fc3258a29c62ce6e037e8233e62987a2f8b88259fc35da5a45b48fc5ef70b00c2c1b86b674e46fdaa40ec9b55ec25a782a7ff14581eeb40ffbb297604ec011903b7685b417da2dbc72def72c129921ec74f3a5b06ce5e53ec5de3b9fd91ef0300e969c5367a3852ec4a5a30f78a796aec102c2d815243b4067739ce7c3404ea02120cbe5d467f7b59303b5e5a6bc2c4eba6e07897bcbe982ff15d035036e4d6ad032d482a551cfb772508f658c08b1006bb2ac651c632cd98872570647c25871a0302218547f6714a29654643332e0528b60f7dc8d568d2637648fa2fdcecb4cb37d703145389c98e7c4560ebb84101973aab1cde01aa938dcbfec681151da205d8b21d2ab226ad5ff20d17df729b5256cc8c425f77863c53a0c9ad7c46f73997806dc47bede7c65bdf859ca2a30d92abb1e958876f33045d6a0180e18c32f0f21d0cd50d63ecf2b3a97543ce2c84de868eab750211a878a834f6d5259a3abdd0ef4b11deca7366676c1e6355a3440f12a49c62593f6b6717ac627e35362877396e49a0af8fedb80e4c4b17e743d5650c3591ad0bb5378e210cc8a1a01a48077dd7783762a2d72af1b98b3c33de7b1c27dc5fbe473625c3a5eed7cdc34cd7cfdaf960db121194562e068cb0c2d28e7b34ede58a7fdd086878c3d9d6600201b46ec3fa5057bf5f07e64950b5bc1c6b749da8862c76269218b5b5e5694adc0076815b8f4516f5ad30e485cb9127ae55c2144ab19f0197d0db4f66d84c8632b582ecb44512f3a60e97ea85c1bfed0a9ea9d8b91044beb98383c047b418d4a9f3510b1dd88eb17d69f434ca3fae7e7823332f9c89a4af138e9692dc540fba0bf0e7fd6d1fc61e86ff8bbe7e321f80379584e3bc996340146ca652c981bb2056abb2e7eaf2acea342e9abe8f63f912829691639ff9495762c05b0f0ce51e67060a5ace195fdc42e1f44ed2fccb45ea4ad28bccb18af97c52e31aaa55511716632f3c3e84a3b13f0f4387b2ec421628f2098375af81129331f4f2d6092833ea454151e09c8fc7f3b6a52daa5980f7f0121da00a5d941367038a59ef86f2cc656fc50cd185323152f317a4bacb9b029711652bc199c6bde122d184ffcebc4d9aa3b477c930cbd683042675b173a77df60b0fc09596f70ba327757464b3c6f5d4a2d01fa295001deef6460f5ee04499c349a9a72002e3d827ee193c807ad3813e8b58eec1393f622f0b66cea39aef9816c544bdb47cda50af1089177d664913193a523d6e6d3cf698a161e53b92ddba1cd8b1549cef798ee69dec8f919330c5cc09339d8ecc2d6a273cd27d457e1e86bce8c56ebd9eece3da5e9d0452527668b1d2b9f05e3086de106916bd4ffd270a102689bfd5bde825ff5d05784f5f3a042e93e6fcc254b164d9c0509b96de080166e8898a0b6210029b41ae3d38871edcf6c0ec16d7649b98aac216c31493fde7796ec4e0da281f497c08998a881519efca12fe685b5c2bc1ff889f18b573192468e9cc5a4a548d07bd5da82c1843d43922f0b449583f1980335d44071826aa8d870430a2a48ff931fc116752086a17356c44694f8415799fcdede8fdbced5499afe7a4b0a215b54c2426a395c633f5105b1bd35bad68744ffe5794d8945743947175827c60722e7dc42849f8dc1ff8a05b850e98e44757b8a32fbf9baa640a3e7a9ac0c5e18563e588a2484876079384f0b9caf9ca33c9ed931a3b095caaa0b6065c724f7ddb52a06800031a5f7c34148af97090b8750353b767ec8680c8346ae7f03cabeb745604e411a32d7a5c5ba955eb29c0f6876c1e5f3f011ec8d5c09758c6f5ea9a31516a91b6e95c5f74c9d5efdf4d4a5c6a22f321dddad7428f2897a2a0baef0550ca9573e12c4d363aae0d1e2b51b255a295f8e222b8cc5a1b2f36ceabbad387540ff95367fe049afaff4af28998c403eeca0a2b0174c1f9f29420cd073e959c35bd51c4ef7e2f2f68bbac2a3860f605ee35f2096fe54a0ce5c484e0e5d1f2e68bc1502ae5aae63528bbecec38f0faa5edff9700be8ff0e1d4dcf56d2d656c623782b9c0a2308aeb0100000000000000000000000075e63076b308882c906db98069f2bf032762b0c5bcd6515ece50c504509ad0687a5ccda6e7a6efbfb894d9905bd7ea45220d4784f7c8c1f06ae68b99f8c3217b0850d89a2834d0a35387de63b80e2a7d1d9c33e30c1cbed9682b355c5fef608d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab06e27a9a81629c70e60910823c6c57af219a2a159a288490efe9f3a324db4ddee762f909fb1e9f38dfb4f00a870e5405f81ce32d5f3a70973df651dce6acfd305eb635fdc02fca802f64c0ff3edbe60aa30399f470f602af924295c6c15932fce25974f561ddd85ca3ce16fc604f676e56226ff4f9c48f4d0165e075fda2920221d7a9ff3e4e16301d8098978bb58b2cc0adede75ad54e1fa027fcede2e1f2f30211e1a5343bfbd819d92dfa6a032e80de1b416e89066383977d1faeb3e50e84300b01b1d47d872f7267a47539bfbb10b19b237878c617c0dc56ae56884f24f6449d428af9b4e1e5d45997378a1a7396d8036bae71053ddf90a2d3b1d3bdc52b1fad0229e42cd4d5c1419346db60bce2acffaae749991d54a8722951f9161d2de91452021a74c8c135b8b5fb6eeb9e5c907424b0adb11a7dd751797790bc5a85b51a16da0223f312f7a909264f21f873bb9305c571f87b528978a23d2ee8d47614a02651310228e6a1604cb9177996633bd320a1553194b90727213c5db7a3dc4051cc10c1e5032ac15bbbac005eb76df37c5ce9548cd6ce2c4b69263ae26f6b9971dc0dd0c7e33330e341dc341cdcb2e3e84d13e1214046800bd1855d71d2d393676fe2e070021b2961677b098c458f3c2b5e572aa2033572c8ba4d7319542d2f6d104bcf0a76d941f23fc20c7499162c4f3ee7ac083750d19dc50e89ca74c95c8a82f59bd8977f3cd43caf9b2c552a8645ccd26f74b2bb1c4dbbb95125edaf705e59213e21d28aba5d88b5cfffa9bebaf18998f96089a86d1214eebf4ca6a437957596d1ce984d7de1f6c85be5321965317c4204458ece9fae887f137b968593b873475554213751016f7a8bde3f007f411ba8d811fb7b3b44d4bc2520de87e3773cc219b49cbd3328064fe735085dc4d4608d11c9c34fc95214ec8cbfaa114fd723b6cf64cf22864780e6a39a5bbdc0191d1329b9de50544c5b1c526043f1c39abb22996881948514f6b0a3c70bd13104216c15fe64a0c2fbdaf032611a9b63fc2343bef0b115dcb439222094a4d096c7e6937351099bdaec4fa7831ce1bfdb1a189ee0e160b58cf2dde510043a5fb87781c54567279e146ccfe28a2f9f0238cbd93db9b033afafc7ab9b4e4c770634c289763dcdbdbef976b5cc40c25940214829ef45a574347d3c7d3c1f6b53a803239fb3832070015b2833d60598b7f23870a1045303228f38d1a9a3edc39e5d9e844d8da0ea21cda70465ad751e6ef142ad7b84553565bf0c4b51af45db2f82ddecbc71ea5be2d9bb395b4ee7c32c4155780093fdd722053b45f131aa154eac3cc330ebb12dabc6e2b8883f842078f6ded8f8851548aba2375a86d24e72db7311372093fb960bf22c4d12b2dc7b3365e5e63137c7c12d18dd239a698e1006c55efb36a2a3cb87ef5d63343be97bf015cc896478d6dfe5106791b4fa9e104e6571b49cc0069264199e13a2ca72e815a953a380c1e6f97310e1fe7e02b6e01e7842340628e2780c9f72e09ebf2d1dfe87844d475965bf07a69889523b97cc7faa27163c2225ebb56822fc0f791cf012f79bba52924249e338155316027b875de3bbf8de605dd3fc4812fe6ea97c24f824c215c8bf51b4312480344535429f591e5645b5d25f0f4e0d6fe428ac394336396b4e7e2ae890f41c12bae1d08c06e6c0a9510cb04689d2b8137f572cf46cb34127dd7681fb58b0a49761815a4e8962ae8d4314f1956d2270abd24d7b318cb9a98ae67c12c37f470cafefcee4692434c8b38ab1d89f6511a8cdcc76f6dbdf62a737a3fe5f0665a4b78845f695d5257bc95bd7b0658abb85ea0b30da12c7b9853b988b351dcc30994f67342d17c8f1f1be193e2b97539f94297aacdc16afa0a0ce469de9bbbe246ca15ea858ac9996f7bcee35527dca655f0112b8ab7714b722969f28d99169f55a199291c1f517d771c92b7dab2680e731ed4683c3e138869f3b513531aec91b3f2ca1033dfe3e15a3fea45f9684f4a6248d2c2b4a160e899c80e1b58a26db6c81b7b2eb597a78616742577f53e1547bb629ecf166b98b1be95e0337286d94aca3f7df1588deb1ac3f381d367bef60baeb31a0f8fde0d2feccad9a88bf69ef1d37ddd965e97a50e6ef6740cea856f5bf15dcec0eb6a2f0b16424abd23ff72f3d5916bdc7b785c952588a30954d30ac86d3f993b87ec42e123b07e52bea5e8d56c34136e811664cd4fe1e35a65b1927c0f9c6542f93d373974fb6f5cf1714a1f3b4190665e036c1abce2921a7676140675df1e6ff31a40200000000000000000000000029897be972177a9e6801c53f91c4f1ab618302a063e287a35d29a8bd294e6ed05a7e61a3513b5e170d495d155593f5a37d2e8d22ca52ce09d047e48d68334b30a31e475dd97aca5be4a724e09729a61bec7714cc0ba09e5b7d6129ad11b81c45000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ee7ae9f4f29d3a6b510f98dd320a3e4bcd039730d0ba30b157b26b71df0ecb57cb2df052c61d7a4d445ac53af00b671c071c0afa63e69f183a6251763a58c85ed6ab988450310d4644cb9961d5dd373963d4406a75178d2d5df5672e92456a00ba1fd3b6be5bdf18b70672052b44167c0b94c06f866446aa077d9a624382fd703188c433a8f3b836d62fe3d2027038cf6262d6537c37625efcf91aa52f637c8bd032c356c5d61c13a3f33a63e3d32d112f2c1fc325f3089ccfec96b2bc926a3d7b10b02a37bf47dc65f6bff7769f84678c04c5299be67e62dc8e0901aa46d574dd477ce1111a570a4bf0a8b7b73b40331c54fe9161acbe67b7eea9f211a8ed9cf5ddc030fa6e6c0889116508af416c1de133d8e5e2e691464eedbf601c3aaef27bd8ba3021d9845e37d82fa63056dc47a2593eba2e9300a421e450bd5f3818ec54e22c0c20217ba069d7983eebbacc32b61202060635d0d9399f001b8338b9813ed4d6e7c72022d308fd5b0ef09244164ea50df80b460f9816b8fcd70488d22192f5d4905be3503089b6f01c1988640f1f8770c5c5ddc53d328815852e9d3d6c54ce6a426f48a4b3e811c169907e8559ddcb5c1e76be04d3b6a7702a280d5848dc77e3baccdd60b587fa180077d840007ab4d9c104d74f26ca4417daa6289140e4e78ddfd15a043a469234d119482e6d54bdedb8552dda82bebac76246c887339651c1f669ab817ad23363940fad32f0f6f5dceb5f8bb4798a0527b8cf51f9edfa694012d06855f57af8ba8ea7e6798513e76481f749f4e2ea2f57c242f11b2796bcd41c0168f1da6ff7ebc62a8a59a6b1d2e73152e488237ce9ceb21b37d976364634b5d27a02c161bc424b9d5dd0df6274fe391e2ee8e8dc3d6561f9a19ed54011b395529c2aedfb64e3ca04ed31a06a5bdb882cdacb10a7c7146adcbcf7b1b325b89c5fa013d423af0927e48f3b9c697e54b9e44546bc853ce6932df647c0442fd7d193967589a0a46a6c52a3e0357681f27669a4ca77276c3f524e3309de4ccd8f3405b4ebb366b77d3eedb451d255f5e0fcf857c8af969f9ab566bea735fe29a34ae77e2d802e97aae33ccbd6ea9ece7ff2f889c70da8d06973c5dc1a42bc4b34d978b0537b5567979c94aec5f52f1cfbcf4f3af91f32067a943e986d63e727c96f3cda861dd3a4b7d5925b5cd0808dd7479bbcbd04d296258ad9a981f3c1930a4fc0aec99dcab4d66fb46c13272303eea5c8755859e2ef0a862be8b6a8140a791563e8d283d28764ae6a6e6c02b2bec7b7c9e57015d4202d7f3ab71cf5ccaa531fb51e3a9ef18f0f0d5d0b9019438a5a903bf777398c714dac163d261fb80c41710429d26303f5f2560234d0b91b01a9a37f18ec103ee8dafb2c7c4692b2c8649415cbd55f56f1bb5ed492b9de762706a0bd11193b29285ee9c6575b835ceb4b5dc780c8b21d5f173780be68ea9f5554a137ad784105038bf2571a041e8e4a629ec8814d2591dfdd8e4f356ba90d182be595bc4108aee81a9efb68c86130a04f2f90433bc42dc8107e61eafd6a61f30ef103e7c9042747477a5ec88642f87c2521c5457ef954c58e968ec9d8b0e53a424398f7bd26a43922df73565786106495d2542c1f2a4577d4f92efbfd177b67fd8fb447790662a1548d0abdae89ed56ca8b258e85b6dba25aa912c082fc71824bf50213492cf8d2a39e28c53af7a4c262f207082fe3012c5b1e33528cbf21f28962cfc267fc2a37f84ee22b8beeca84febc7400f9cf4c23be49a92296fc95f5be5b2e8b25f405157cfba0e20ae8ef42075d46c84a09d725b1c2082927ab82c917692f2e3baca3d345a61c4107a3e10d80319fb834ecb1d832369837b27c7c116cc02c39b05cc3d65feda530a3aed06e8ab47b06d21150efa14a47b5c9ad7662a41f840b9918423586c1a1bea5eaf894920df32464f91a1367b4ef9269c9d35d118f527c3e6fb2e6e197fbea87c66559653ae54885291e600fd7f6bddebaafe61f5f557a883b89933edd55ca2c16cd7efd2376afd0d60f1ce69c43d3fdd50229e00cf37638e90ac7712e1fbbbb5853ca56de8230b34250a46ad70813d1a075380a556c9f42c54328123a747c5d648c1be654f1e9b2280f1b4525c56a94d361f7eafbd8089e352b96e2afe68cf6ea0fc4c6e93200dbb4435fe2a54c158009ed489f5468a61ec015d2a4f417eed070a8b2abd7123988e0583d417d489b653d55f54a7c2839ea48f9a31b6ff588e7001c2bcaaf2524d8adbe0f8f44408ec59c4ff63cedae31010e295a1aacdb34a9e98c617399519d168d330f9282de937fc9857d1abb5f201fe3aa3fc406e140a0cc23ad5d45557bd18bd3aeb4f49ec46533991874f2b75de6d0c968217a1921e0d8b65be56e21ccdb3752cb9dea836307f003ad201ac40dd100201", "6aac63ac5265ac6552", 2, 1901831755, 1537743641, "43c08c87e6992364753b4b53afab8168868aad550b94287f5c31821d486b2c73"], + ["4e672a7104fb706b40c47d3e5c1032ac9a16dde76a16e6ec258be88e975489873cbd0f5963010000000965515263acac515253ffffffffcd182594eac286c0eba489f29a6059bce3daaa784ccd21b396ee7d0f6de5f70a020000000651536a516300d351681feea24602b53a63b141ed816f79ca6d781abf0b884903a32c3fe1299c165718420200000004526363acffffffffd36e9edeb216979d343e709e4aa777d43c22f631e39825cf79e30bc72b4d84c102000000086a6a6353ac65516a54dd3ca4040c4beb010000000006516a63acac5125c57800000000000653656a5353000db5380400000000026a517736ea0400000000060053ac636a008d502c8c01f4291f0400000000000000000000000069024f706b6de05f7a4a86060e84b38d1e22aaff1646bfce9f2ef33a13fe25934d142c780f5762cc2d2176716c7a77285bb009b877cdbb29ee51e14ea35440faf2aa55f296f218a9ef05aeaf946d67beb5b943b2a867bc5a0ac58f5bae7ac96f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a78a8eb7c94db00d4e06f29ce8ad5419bc732904917db0d572e171d56c0da859dc6ab2299ccac81cb2c0a0697df377eeb37211ecf521d4d4a984687371da7683e2f2d5aa05a8ba919fa0a36957629a24b6beb79531becfcd635950726691b2a8b58eaa0583c7a3b509c18a95d1554a1c9418dff02bae1f7ec2661c98bea025c503173090ae44aabbe61eba0cc2422bd719f5ef5b10d8fac122b868a1d72bd25dd40208052643685b62e7b11a1282a591b375a50134abb809084d3eeac36ebb5cf8480b00e344b1529c54f26878d94de3744fff8afb093e64c2bddd067abaf544bb67c5ced98ee7f17ddd79651d46f173c904aabe20040324e45a184f867ad91782b370021aae754a64214dd8899017bba62a82dafa4805f49fc04202968fce5d803fec350210b56b7c6c36f36ba8c28a2fa39a05302e8520b97f5cefbd5fe366df5cece70f02128611ed965fab821d0d65c2169daa5b8fdbf98b1f7be70df2187ff89b721534020d42876eb7a1e33d1cd4df924701f0a82f40f3fab48017781544e6cae31b10d5020b71370e9c7971c8762b7040d1773a982db22b6c0247f4a41d43cfc77325302298ef7451169cb922b2119255851410e173289e538c92082eb0c0e449133d570654f3576289a5ead1b67c97d7a929cedacc1e6299a36712da738f061e8938d04acc0c24e17d7451b63b8f95c391d7e28b05559d8449ed3f33ca4f7c82081eaabca746d006083dd9b084fff121167abb89c2749fa4be2a2a4b96dbf79b7bd7bfc5bf1ce50a6b2d79089d7538aa810090d66c78f4b3c53e4aed6d9d02d4491aa0c4f8b5efd4045817339a71490231e349a903c1a5e7af95d3200ae4e277af5f6f28e7a084df198ca84f89a4fca5ae31882e01f2dd6f64e8aa0951d20969fd921ea4acb3219010e99e1d6a5bd53abf00e4e0a416c8ba312f8fdb6efc55d5efc3fac830a60749044b8d100f22753bb4ad8c6dc778e488b93a735c129879aef9357f129cffc509eb39585b70301a072e3b8e476bf56cde37ea9fad742141ce8092ae3e807e08ff0f328e57ad5703faa65887095f51073ad3d4176753cc72f7c3c7c3ddaa6c03c1d74b8fef0b92992198893c6f3e28476a7e699109a3e20ae1a81e77b97bc65e0f41a3a7c1e4db1349af1778e14dc2ea1cdeabeee793d347ab60b0e88976ff446695b35074cbd396f73dd0048f9bebb20995dcde2a7b32c0c8ee7bf9df717f4b666f361d52fffa48eab59b1d487bcb7bce5ed6c2d707cb2dd08c04d3e7490636413a320994a46b8223ace1eb0c58490c6f2af74d98cac78904b4a68eb1f0eef85d7439efe4acc7447195160af3942d903251d9a615ad800f9600a4e2dd444b834dab66cc34e406b15918cad588a7e2c23a7073dd45666b5c21489c038dc3ffeb7fd9e4e630799764213c289cb6c1a5fc858de52bafaebf0ec4dae7930ec8150a1acae991feac6c359b5bbc82399dc84302b469a076b6a61ac27ab9ec9dc1ab7d5877654bff0fa6b12b0752fa264c051c6dd75e8e44bc740bfc8cd7dced4d5ecd13df6770fea627be8a8e4f59aeb61d7d5490a9905b06ee12d7e2a0e4c636f2eefb5e6438f1ad7eb03f4fc8f4e3c35e2db5ea33d0676096e560dc63eeac429e5bfb70dc3d6464656add853f8fef3cb16f8070a69bc29fc3469c25b74931f76841587e087408857aab1c6281bae9e2dd1d437e093a7c61747656e591947bb2aeb77f10c89b1b55e5b27d9c96e630e05670e336c57a80ff0ddfc298d7ae9daf650f3ab186960b8ad2524a95b07626a1451065d72f22738e13442ba9ebcd5895f1223c45725910b94cc60319fba31c151f08be43e5118188d312bceded3eac8142858e2b161b86f2203aa6aee713c2f2d513cc541c075162dd6a9e4bdfe7f983101120756355d2f8f05c11c6f2ed2d098f276919f101a8fbbc367aa02b9a0a1c9c9c2603b05f929ed035dfd7587d4dda905f7e9800be2d865b82621d8e7a384302fe32a4c2482bba0f6b9040168b9ec0e2e8642010b5d6a2e93ab78151091320b5d62b72acc151ed885f6c9a3b9bc266791b7c55ae3b4a3c073125872c625a283b6a9a52f134e73744ca347e1d777a64dc80e0986b995d5ce9e8b1e9ad64f5c05a8d0f77adc343529c3ff8470ff20961ac7ca57a071b4b48e736ef670ab6f9664b1fa3473cc25d414532b7d4b5a81cd0a53b8cf11593bf4f9df41ff6c2a865a57f850319469dadd18494e3bc66c3abdc552a0bad31f98745b0b500210585126dec9e7608df5852fc252ffa6efd90d90750c823247ec866052a7f839c15f8fe5fea9409b98f55ce0786af3c99e0e4e3975171d90ea03f35372307745fc62833cdcdc1c16a75d9b1696ccf692c721cd5adb1ae7b795050e04307cc077395953e23eace8a760c856183bddd19bfbb17139c02", "", 0, 289614840, 0, "07bd8b6d9db4922f89daac9f6d8dbe07a174fb851548c14c62945852806d1f0a"], + ["030000807082c403045e2fcf5c24e501d5004ab8b41c2e78c1ae87ac9b2fab729d1e8a83be9bdb1b650000000007536a6a6365006a381b9132ff208f1a3b0f8d22ad3940c2f3681eea9a74a21219660cc0e6f1f2d4de99648e02000000090051ac53635100000019e8cf2741a36ae819cfa427b90cf44a8b76bbb3e7cdd94acd4b443c280f4ae0fe2e3f18000000000152ffffffff8c5a0fbc9b676d70f7cd47010cd1ad11e3b043b3adf2145b51189e5f1c98c5090000000009510065ac005163ac51358e9be0013356de0200000000095200006a655353526362e4083770306f370200000000000000009349bf0500000000155f611bb4bba5c7a606f8d1a3f7de83509db579151be9083b5655934163669d6d1f758bd656fb604a218aec8bf5353e5b6cf5bde3ed9f522bcbd1d3a7a95d20f3c35dea09b0d6ffb6bab489264d677960fdb3810a11e255d041ae7cd7007eea00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e7a6917d594b31e078943914afb8ea5351f646be9282e342fb50394cd709800402ba557171565c5ccef148096901f07eaa5656f412e3ab5db8a5811ec29cb158b9d9319a086dee44fc3862489080941f890f5368a6b90af3fba15dbb8dd695bcdc0890967ff9e2c3b1f2a200ffd858243f0f318ebfdd1f182c05066ec25b2135021224c841ab4c0409121606ccb168ea3e0af4592f6f321b92467565e15fb22121021c988f700619cb729005d88827c9da28dfda2ff2e1ed7e61592bde4a819619e10b048ab61b1f87d5931410798c3f7c5c7f6b8824982632964b54a35e03d3baec093d7f4e37b4c4044396746d952546f95a0f8008deb4e463466da28ccca5cc3c6a031e80598cb716c8ffdeb6c6c2fddd38d5f8ec3c2854464495c02c04773ea5d43d03230b2070691b0e76058eb3f0cd899f2c2c5669fa8cb413ac67533361dd26f5ae032e86ff159d188e880a468896b3f1370d9ba340818736c4d47e33fd776a88fb86020a8aa5941246eea27248e9f32804b5677aff1b16356fe5dad047ba2d4b5dfdcb03163b1cb60878cdf4222b74d5ded2f84d06f70f46b0836e458059fb3414b5799e5d264bd100b3c04d470cd9de55024e90cfc257ab726a99324cc6765f22eed2d69b466782758c12399c74d0894c30a4dd67dd38a2137814f9b60d0620056fc2f0c2d626ecef5fdaf417ea426bc0526d4011728f580a1349e7ab38975f080ff09a7de501eb3a929d23dd6863c3910ff7af95787c45c73ca46a159e0a972807b24e92b44986d937d62da8e4726375e765bb268dc031ef2dad5164ba9c1d7becc0c480f4054087c67a0f9493085b7eb5fed70f5b2946959b38f55f8a3722821fc23f11ea10716f1fd1c1ba83db2ee3cea3eb3ace5b6be6110b4fe8f5a4da47683f6e98182415e6a818066906f7b981dce88299c7d80e57f40106f7d7ab234463850e529279e13d739f20b836094a1f7004978df341981525b5225b851c056c387c1c7af67936821da32083575505cc21abac179ebaedeb78f8835faffabc0115b78853e4d680dc21ab4ae2284c8dc645c4312983598afd07ef58f2507d1b90618e05007e300bf04208b76ec8c26267e72b38234a9c17f3de8714018aecede54b784f96e75515939b92036bbc76a58e544fdb3181b23dd0baab17b3a94ca97b7c8a1a1bdddd45d5d84026340a8a8ba25a4d594a9d5f5fd450d352ca1d40608f60ced509d213e9f1c38e78a8468290e7d1ce6c5097ef695c63d1da2e2b371e4c3c7d81f9080badd4875fbacb7a9b554ff9b6f881b49ac4dd65d2649de8a7bd3a73f563d9e990f3d772348eddeebff660f7e8ae59f7efab008a269e88043b73f15178a247996194a5cf25c418066b636819f7c162dc1e7c3194518a38dd9e4be25ba803789a7b84d877000bceb192f4319a57ccd20932d8dbd5edbae2260d291d73102eb04a38e1af2f0984164f8244570bea2e83ccb0c832b80a034dbaa5eeb65f6555d56c7761db48433aef23a89764a59feea9bc38b1c94548468eaf698ef1a11cfab2ee88f4f8d8af083f27be5364721eb8c6e9ad842dcdda9150b72c9cb21fa3a085ed97d0bd06bce8a28effd811223807bebef80a028464ece7e7e4e53612937f18bd54ede10b51b6e88bf60a83d6451f44deb48598d6413a38f46c519a63c031a1b5b7a82ab82af158d70bf6b5974d7c8da8f6f68d6be67314592bcd5fa91357174842a3b5b257c0d5e834c5dfbcc387df211642c87987dc8729ccce1b7e4635247289ceaa0baca326c0a824c59903e306cdf19ef0ac04752329a2265982ae5279bf011ca65dd6b707d860e7aff6a1204ce709831c705b1d3e64f275c2bfa1d1892c9024412b623fefa1db65d9d414661d3f4e7436cffd6cc52338707c09b3786e9560316c5cc25c8e1d69f7c2a0370984fb81555f4e4a89a94874ecf2fec1a7f1aa3c27b5dec94be8bdeeda38c86f1de2bda6f709ce3b5605efcb47df116d01311413667276a74cb737cd7b760b3b7772fd9423d644de787f7ec8eac6d77a009ca22c353cb889183bc4472b5903f1dcbab4bca64bf96dda0a147f299786f0804baca2f26f42536bdeeab33d33b6cb45e6367c4a937b53e81f373a5742129d5dbce17dde54c4f0b346b3e3204db9cf5a774506ba789fc83e0f14478998bbdbcad037ae085572a4b633ecb2d141b488ca43ebd0dbcbbeef6121a7ecdfdee1eecb9fedc4296ccb37c78ee3bfd9be9d4be306962984f0b3301fa99953193826fdb0d6c4f8547403f983ea656f188aac1c71276348a195020000000000000000000000009de2d54e9743bdb28eb878ab265b49fce79897c8c3454d9e40a0232c2045e22605dd4a9b858ce169f0aadffa8e1b2db1e7bcccedd859a5eb2c097a66d9b9a18191fb88e3922876fca61328bcedf159246a4868e9f38025585193b3294386e7fa00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bcf0525569ac941c1fd17c736bf80b50907c65f626ea46f859c076ca3ba4914b0f49cce7446dd85d0dce68d09b35a1dfacb659f5fbd637e1323b3326b869f06f95d782ebe18723bef7df33c3ec5d4ab84db6b574cd08c7b38fffe7abb4ef996ffae678b2643355028505da5f3844a0550e3e1508b1f5478a12f010f63284b00803304e3f5b15a72e918dfdb0d1d706db4bcc417bfbf4cbfcbc2d00d0cfc2bacec3021f07cb2746f431ecd2e52ed6949c920354f9b4a4a0968974f19c5046f1589e280b0750e35942207bc04daa06c9d89eb6d5ac6be0152c54cdc31b4037e9ac0cf11111824891063cc0305fb4d0b56d0d6670737434ca685abe579f3786786f6348dc032d2a27e31404c712e10cf744e210668ffc54c17f0e245acda356eaf2202d8ccf0313ed863b93c2c8799e861dfec512fcca3e3f2f79fc5610105524872eb7695882021e20cbfdd182617c880c87e3655f3b189b1448cf38e2fe8f91a59b82eb21c03f0221c3400adbcf3450cd16f934423520321f9b57b6d9cf52629eeaa9c8f881678c0221ce049284b74f1db34073acc22dd08bc41ee693511f2b72237300ea77734511a0433dee8c4c5108da7b653d947faf11f03e0bc2b03c1b44dee0bc60e7c46d8eea0b744d5fb009fd0d0deb976be00443b5dcc41b97c147b2d6a134281bb33848932b933e99e0a824971aa3fe5d30f10ebda869c8c9faa089dfe1cc1d08013022fb15c9351644b779724318199d31f2657fe8bf7ec3ea7393bc2c89d1d78b0dd7e06e2351e56bc4fe519989e45dd7e6b0062592a63d54ad7ed4cd7e4545cdbd40eeeb3cc2e34798abc9410d255429ff00432b2cb517ee595650dd79aea04a507acc9238750a5629827d9134ed8194fe0eb9fe39ee1ceff6471380a6518115a18a2a69472d4308cadc2e2d54575d0d954327d96a17db89de56567dd81ab7f7d1fdb19beb634a94857c468117d5329f787df2e706e4d4948a89f903c08630bc52fd1ad8c4a0caa977d9fd5b6efc7c8c018e4086a736321caf4c11330003583edd39c0b5a6e312f7cef53f5dbd399a57a53964f080754892ffc4526888bdb71c7e9153e7ffed251c6267e0a90169fad36fe936737584c5f70d861cc6a5f3f4498357b0cbb3448d0fbced61b1fbee76c7137fcfafde6618acde2e79ef97b3d275982236db739ab83fb7434b8b232279e8959ef62b6dedb03609b36575f8c18ee978f8e64748fe4648f708d6ba50c006816f24883aa858c656c2188e1739ecc4aa970cc41430f6438f53d0a183597b0a1191119d8c006a6eac8feb0d9d6d024cd218948d34cf0267e051d4f678f64922bc16e74a84ae6c07c559e711a96ae33788d965f0d21383a1c9a7c877aaa5a5adf01e00d28ae96218e0e0896795165b5a703b40ca9b889531b28bfd3a4b318d4fd41ad424ad2a30036dac46624b6c920cc05d13238b090b05e2647c266f62553d38b5f06094de6d28e9751eb5393ad8811ccc3ba6ea8bc64c81f0e6bb07a3270744d828f2a2fcf5bda016e6f95c10f854989ba9d7643b9fc6482a6c883eacb02c853011a533d190793dd58d01ea3514bd3f5d35600be1ceed1f1f89b5060752a2310b88a807c3d549963fa5a022fa98677e4ccc4dc1c08bf94a215c51dc17ee6a384eaf29b83174149e49afa213567199940c8d567b2d41b2f6d14d9cadb14998804db6963d41db27335d1c987c590cc80c02cdc1f7944b0dd871b92ae78e413736fca3895f893a317732e85516d11aa153b8374152158be46c02c97e1d13e439701ca6042556ab607ae6c0380f1df11b0cbe7cae0dd5c8c36f91b89741cfbda161c0cbfb148e068a4f39b24ce82c82421965fc95e44b972697c8f07b609e5ea5db4d92906b395a7ca3e1c3361c17461324df1e87fa5d1f8b5dfbb00ae95b7ab0f4adcca9f08330b496b7a0667a4867d2759387bfabcfa0e4e5643255b1da70b11a6cb85cf309312a37d2bcea880d12dd841c58bb1ee46b15123462143c0bf5f28c0ef38ea22a77a8cbbb40b606a5014b241cbf2062e8c22d2ba419ede388036927685507179b32907b547a00c741f89bc10a4ce5f6ecd317e261dd19aef7211628f972f5359e356121ef5f726761bd2f3998f49c1ece65a4531a73c9efe9b18600d7ec727640b9ef56df057a9a7a549a1c8fab93748ab3616720fbfdfd4ab06266b4696d4b1ca70f56f4083be5294f5682f00c5931275214482bff98b484bee4b229a57032018eb37fb4ff76372bcf8e489b36e2f9c98951184f1b05a6eff5ae18492a555f5777d277c313232ac61911d295d204edfe98d9257f849c6f7bcd0a2d2d226e9b053de004346fce67446bcac53cda15c24f58ce583dd5f6087a9804ce41e5476e26683d64eca0a4b377b75b3d2eca822885d26c4ead74eb85675dbc58884ed903", "6a636a00", 3, -1127645152, 0, "52d640156cdb73118bbd8134562aadf8c6bc7435649b86f7a28fed36404beff1"], + ["71b2b80e03a5349d590c0cb3219e07547e063131aaf446a0fec6e9ee6cbdcc5e980ac7f353030000000752535352636aac07c184b1709ec8b248c661f88be75a89b8311626c17e370fd0ac7ee4f5305ce3c51326a3020000000165ffffffff4f1491e780a25081153b75cab91904fc7e66805711632a1ddc426f11c461f60203000000095252635253526a5251ffffffff019a2bb3030000000000000000000314fc300000000000000000000000000094abd0efd883c1398d3d61b3490116b2eff66de6f99c8eb49d7af2bc20f644863b2b4184ca7419ce2445f69798322177a10513cc8c51d4009dd26bb4bf4da5bd6438f139b3e23cb442af1303b9787b3775b28fc350116f06791f68f2872a9cf100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab9537f327c3f08fd44aadfac200fa190ea5e4b59e646697d1f9bdf944aad1f996796431c8dc76340b8e5b1d40b8d0f70ce0b9b7059551b429063e00ff1ab89d15f833275f37979de791e4d9f291f884cdc1aabc007d5d0cb8022a9b0fc156fb9fc9ddcbc2c3ef2ce761ebbf3ac1cfed5250aa0a971d4c5d723c12430fecf1f4031c7818a7cffaec294e98ad75c04cebf3c8ea40b6c0435e7be0f47f67b3ad566103271831d845fbf79d69d891a88e1f1c71b7acdd871682e4d392c04d10d75c71bf0b0099f7d09dd16b0c2fade5c065722a4039b81d89d4e2b99ba87108fb0ffc6efd76156aa946b0f0d4bac7c5766afc1b93a5f42f0697bb7f7c0de8b465bef3e5dc032fbee2efb1a7a67d4cc9c7b4f077d50b48dc5662fa5cf25a9178837a8ba1095f02015680500048ec65905e5eb54db904c92500d67299e0bd3163647bbbdbf18bd2021905eae619ed0b4533c7bf0911a12be14edbd4c357046c9e88abdaa192d0e666020ccfe61d00bc1a324db9b739fb50b9971cd12cb462013e6fc2ed76d9d3d36d5d0320b492170ab84037a7711ff6f3b37412e2f550bd5d5158456c50811d4bf683b9494984d9fd33dad9de87c074aa999275b3753a596333c88eb7097e23fa595468d85a8bd7824d53e718d3cc006a7b2feb10bc33f266569252187f9246b16a94a26ffe3f56f25433ed8cfc617ca94eb6a5232ddd8891c901118702b10960bb5d81352b4b0a0a9f0c7a7e19a672033016f5ed3b0cc23848db22a3ef9d3abb2f5563843d5344c0e99345f0393f21714d4f44b48f231ecf538306b2900d088dff4dd105a1dfe49dd0137d6532fc461cf08f6424195dcc72920ef23fcf146a2a5fc9a28edbc2e75ca34530135d870e3ae4eb610a74d647393bd84b0b3e51e87a490681446f983e587d1b7a4bcca984a6675f0f45bb976dccab781b96fd5256a7ae0210ebf5cf8bbb95d67dbbcfb310f4a350e830d001a143060d2fb6805db689b64999f44e7122b83d55e1c1e3c3e9a991d5a2c49c9495816bf4af2c67fb7f3d6018163a401f86b40b9c92c2fde9ef5261224065162addfbca45bf9c27222742e79dd15bb7ec1ca04db59efd7cd48a99885dd6c8b675a8492029be04920974d2c6222840a8e65186d48e229595e1941340d763f691c83fb17f217f868f28a34a237f95d6d8a63cf737d22f7b989cfa65d0322a57d87065c9854f3640988fc7d232adfca12e33c62062aceaf7792db7993ff0e936b968e9fda50d2fd32dddc78e4ff7457347173a32dce10b09097f37bee8771421eb522366f169a0d8b58adffb7c0d569bc8e312744f32252eb70a75b0317aeebd754d650bc2db04720a96c1b5267f0c47935e30105172d29b84e04c6b3a35e9cef01d5a866e032b94cfc498835e04474687b2e4ed4c1a42a302f21c068dcf78914ae6369884a1a911c420befe89a030b77417d4f042b984392c6278f4a31f4cd593fb87bafede372d5f8f745b02912a4833a6e7a042781156b123260cd84180d3e86046bd9d67cb15c5ebf036d38d22c41c66cc8700d61ff0ef70fae33a3650d17f3bd8bb3dd0520f0ed7d08b166fbdb4f4d5f4219b203ac06e9003a0ff71daaacc5cf578d625d384b5bf164508cbc0cd8e14cb0a1498939c26e1559585b7149a8bd2fdfede950376b642aad2b01b89352d3ecc1098d67a0df4ecda74b16fdb6225313c0f708ca57cd4e24dbd4c81b1b03ac507849805949fc76385d44a4e818cd8a801031f4de143ad44f09fd4f9bf4688bd2434dc6e82ac16d036a2dbfb3c81046ab8092ee224fdf03ca71748ab58916abfebf0a9d53133c545d3d2a29b8f042d150a83f1c56d39434b2638b2ab144dfa1e7c97f0bfb62662dba329420afe7a6d283a3e5a93ff37569bd85b33ba4bcab7a40d188f7b4d42d2fef8ee1bc74c8b611cafcf37ddb9c4fa17f9c493c3af333fd0e89e570fc4dd6ec5055005b63c78b4f12e294a40e48217671e49fa5d5c19a36a9e9d2434931149a66c02441aea3499f55dac6420439ae0bc8b04c006627840460cce312f740070ac9b4d6e7a9362a946165bbee157d7ef7a8515cefa72a0ef22c8870381742cd45702fd8df60549555e0085f76886a14944fb2b05c4e58e8a8369eb5a1bc5344aeb4bef90747817d5320e5513d7459dd4b0c3d62a8c785c55f24bc96c7764133cbba019d7f24ca02dd83572bbd418757f628513e8284e85d87f8e7cb9147b0747150204079a8ee2e874f809ff3c63b00242c35482948775933b2d88441a016cebf7b4ad82c3662a9000000000000000007f6ae300000000008f1108c66fe8018256c742ed3f8e9f90c1e437da54080eb7949362f911f84189e803952ca7bbf69f1186f19368d6248a3af41ab7c92305437568534d235670b6d05c3329e2c2080b2b2892d01831c64f3c03c8b52f72b0dfff9101a398c72c31000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009808c6cfc3fdfb9bcdfeb5d4cc09be6bebfc8f72bf257eb2b43d0234ea07a57f335689ae6486a4d72a8362d272f7c506b6cb9b7962ecdcfb50e61b5c7517f21a57585a78db0af02361170a8f0158d99c1f8dc3a41c6e6c4a5c06d9110c0b374da25534f65b1338a598575c48801fceddd13f3b3d4d31d36c1262705fc060b29103198dcfe54588430da3c5d09e5f83a784aa0b428c9a192907c5a431cea771d8cf021a17add2a2bf93e2796410f482b4edae32516df2688dcdb3ae801a50220aec560b088ec6aab1da53e43bc6d7872eae3547bd45ca9aab2412d9c3ff9c75a6a5d2b9b80653a5db3debd2b3534e7df0edefc7492f615417f9fea9d3945face5ed5403030eda6056a24596319185bc63e8f69abd4fb76f575e2a12422a7abe0d0f23bc1d030cd00b561035c98d7bc2052502f61e6de29e1583e25f6a277c46696c68d7282a0221d0032a9535cddede9cab534498769b08c391b4d25e23c2e7ffe079754d5a6a031bcfc2091120d28f4f81883ef5e393c7222db58a009e7fd2cc01a1aea0856b84030c934efc4c8be1effc0f1ba580c3fd535f4344aa0c80ce4924e96558c796651c86f945647eb2ceef0d16688597301c551e4b07b8b4b1d2b63a5f11bfb782a67a8e8fdb7e3da1e7ea63d0d4e88eb14e313021c653ee49c6a46d8d1229f8b8ee9461e00f9638767ac250a9cc45a2b0131afaa03276ff447f6dcdc9d39bad82a4a64217f6eff500be7ae999b8fe24a0f8979c6b07e31cf20bcd43ae407cf6c237960336a85ec6f51ddef20d4167d004fd42d99b5560f09bf25c5ff0768ddeb595b8cabb372ef7c61e36c1b71189fe078f247b99bbe82c76ae6cd535f5a0270b65c2abc64e9a76d618ed27aa692e9aa7aa7a5bd4c13f31d596b0cace230a98de4d9c79ea20ea7f27e8b852538839dc6ee61634cfc8bee11327adf227633d2cab3add687d02b32b86140513d430d6475eb84444576d1793ef9fdb21b9f2226541624494a29c142d677275460b82f8edb0b56365b520eba64335e5a1160765ea48bd50c0b8f6212cc2b38c81222ae83f2e584bf08dbf3ecc266f5869f8ffe04891261bd79545af6562bb8dc844c2555a30abda9aede8432b7013d9c794ecd3480568ec30ded0b9275dcada8ec6c7ba01609c31a0bd2a405c7591dfc0ddc154b697586c43f396a1a1b9c6bb6dfcd0115428cbf71a03f8ae199987bedae21652d7b73bf56524f1d368ccbb4a957e0bd24c060a57adc0cdf6cbcb110e63c52fbd11e8d7e98ccb0d6980511f3c80c29d96bc19cf75411dc6016218aea884ef1de737c718b1f6c9e615b383c40af563341fcb4e6b650832f91e66c7e34be1d3780ee39dfffb8c829ca85433090862eb7e44fa2ea65efd2c286c1f27014c4ef2f3e7009772341def35255dc18f3e8b969f315ded9edd073ff948b37dc1dfb18e6f564995bf12b7955667874ce89ef2804d4fca1e9f1130ffdd23795740891bc47aa6b1b4c213ce638fdd102d91158f13ebcef6517a9cbd76a604cebb59fba90890fb3877e8fef0ac63333de1f8d333465edc6e74123734610f5eaa9620c6450d40072fbac078d44125e695b331fde7f9fa49950cbcd8f9b7a303464a6c0f4acb7fc9c8881fe2375758ee723d7535755d7835164561c4d3b8faad1131c24ea9131efdd72e5e16eb2d6c25ca056d25e2985c72168bd391dd6d75b398e6739cdfe672e0f4bad46a2f11d6792e4f9b6d61155a2c74d04203e32ed3ff9ff12df90be77af303fb18d59b472992026bc28220eebe9a09dc9cb56820ee5cf21e9ec921d27d798e3c5ce0881bb9d0fd307f3370c30cad0c6e64646e4bfc9d7d3645debf0e97f1f28786230d89e6b2f1f3eaa80b0bbcfef159509acdbd89583038c6c9ed549dd69a6940d5c1bb0cf0f203bd53c886e9740c1bab18688ee470bc96573fe8f44213817a6cecdb8e6265c790ec9ca7776316de44bfba1d8d922e46ba02118895d12215ccf3a59ae861dd8652bb888247a23397523ade7802eb53595cffa90e6bdc4638d787615e3e02a6921401c3d45e1fa83fbd8b75e8776739789568023be262cde36f96f384fcccb96baa1f7db29826889805ca615c374dad720b8c69477519340a68b51431f9479c3b438c73953b87aab352d2854a575d9af684343223d27cd64c75fc70a41c05cd0a7e7e98b3b0651813c4a0f347974df82291abee1b7df5aafbfe96ada8af5ef2317a3ba5d78f22962387493e1d67e81ccc061f4fa4c42c3f319c346000fe4ec68f70d342e7d3bc368914890254850000000000000000de04ac000000000035cff9e7b9c257bb0f84765dd027db1598ce8c6a39593bbf8ed0f12e80aa8a56447d21d2b1a105d83ebc25aaecacc09a1b8da70ccadf888a6bd49354fcea5fb081ba663c639f9376e09d78d66f584a6559ba8a19cf34ddf9981afc670f8af8360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073c8f8512482625936861087a9fdbc3afef3212f1b3a000663445864e84d21984ef3b61090da8f539a0c7d26a3c83d6f82e3b1a39e1f6e7bd3f8882317aaf20980cdcb39b3d964f3b1f0000200f9b65ddbf5d4767f2d143103ed689d63089012dacaecb7c3d707d59dade90038dc07b4a2435a563a76d05a64266c7871c9a801021ee8704f18e23e569f7aa0a880cd9b38aa5f4ac52b7670cfd2d1e8fb54b50361021265a887b660e22fb91dc1eeae1382cbbd8a60bca0a9c61989807e6b699829e20b02488dee91ee6b1d9f19672c6ac35a1e39b4f33902ab9001e81ef7d123e99e98d32aeb3d5e12dfcbef1dc6f905f24bb7c803c168337656207f24e1f560273d270311f88d636ea09b1f16024b63f7811c3d1a8a50e143e46ac155ff2be0a1fecdb60227a9fac805d0f435bea29fa1b72ea832bfee5a7207726e4167d2cc5b3938251d031ced0bd29f90cbaa96c8cb98d852d71a7344c94b9135d44068bcb075645f039702211a3be7e44cb1d9733cf141f5559d70e6dcba3d720a7ff50fa3272aabd2e134022dfa8e99b6c07f0c59c2058501cf51bdc2199a9b3a8b4b7f00b509ea4713ccfd7143dd6cf34747d5220a181842dd111282897e787ce0f50e087e1db1b09d7b076376690420af40056499b30769fbe132457496a5e2001e1e1cdf4aac8282a02bd7bcedccfca77dfef1e89bd99a957069633b256865c799d5833114f2326534837a5b13b69a6b8fb972a53c1c316eb34ebcdbad8d8b3279334aa92f558600ec880efb03460953f6521aa40139c337c27f466a56187a62704c79d51773e67a73e41bbd3aedd29a3c948e7deea724aeacc32880ecd9671ccf2524b1559330adc3c81618c55a76e5510a2ba46c8baffcb571ea9540bd5f2116945d1d0688dbe29f2b251ae5d52dea15e6684939a281130d858c08c8085e85186b19fe8362d21d855a680d0fa4014c1d291fce0f3734e5ebbd7007021b9d440032b3a538be3785c641b071b73373bf243b2951ab06418a4caea47de1223c60ec5ad307c82fff6623281481188d49091c6337af82cdb7caed65d3520db958194dcc335df770dbc623694977472f3bc4bfaf2358507dc7949e9161769c4544b8e2484206e1e9cb80b7693766053143738f14cf2191782be7383c36e5435ad600932639f0c1ad04de8a8dbbe51d4b1c32697d3dce36adcc24fd7db659c46e8c2b4954a4c3aa465dedf06ae858f3b89e97abf307a24d93d849d9902bc6953f86cf4cdeaecf7185b9639be690229ceb479d0510f49c313423c20b7cdcf60b5d58f8d4670a222796be6b3cd531f44a248f21f8d5670a99d9aa209570d0c0c4e4c1c9d1ca87808f74c600f70032c07e046adc78a842258c2985e9fa21ea4ca410fec187016a75cf45b1cac6b07e98df2187d43d736612c90c383382e3225851484e1a504eaf281c029ad479509f571a6f7e3cff9fa095634164a839307778c37848c2d4c0fd683ba6bb4b71b0f901a298908004d22edfddd3392413b8eb2abbd45f2d8148981398ec351c55cb7cf2fc9938fec028eabb2659e197b16ae2c04dcbd031f99979ad0a90794c0b15dc5126787328fe0f9f222bafc2135ae2122dd9628ae1af9d20f2082d47926f878d805eb6888ff4e6a304e28366673ec80457d00a04be9a3f32e76aa4053c6fbacaac7dbe8b0f27503eb4364d5c9ee550387bb4484591d4b92df98dd75510069a54a46a595f33352c3e21ed92ad7dfbe367e59d7b6f4cf187ab9cdaafa19d51de10b4f5717f840d31ceec6e40305ae67cd15ae623066cb9af359273741a9b0dc3a5f56107f8ec8fa7f81d5ae31cb8e98ba8ebc48961fc2eadce74dd2b1b9f3db25f1f150964317a79ca4c3b13d5cd08a97d5816c7d768b033c27fa4ad7f3bfb5164f48be15f72834b302f75cc75175ecf39712ad3b22335979601bf760543653f5a275d92f6a7c2cf6fe5edf459571c3b5293460849c2f3522c30700100d25e23be1727443c70804310df59cad8831c24be3f4fd32a1e7d7108ca59f181a687e0372421a7b6a19e396058aaa9d182b64c39d3bf84a2346e47e96a43b191bb986b457d92bc26ab9c8411b146a7f53760d4ef9a05687e08287528ae420067155634cb9dd61723c1e2ef330d5cf22e81665832221e040ab91f532ec6904b1f05897cde42edaa1f114752f881898d2ec844ae39dcf877f31a936fba5d461f8c74cb95ba59ce313cedcf61390be61adeb4991d89a7c1dc8e37e0766f4c49b65db3ff62e6360420740388d71f4b7655c13b51d11d905d49df291d86c079a17e3068fdf2be0446499ee435198cb039f5e18ea737a7d7180711f171ce8d262742616f80539b182ace66603c1f77d04ccaf0cda2f38aabb3ef31e736a4d2ddb99ddc1512f32f54429c1b9f3230a2bd2bc6ddc38924720c", "6352", 1, -640717403, 1537743641, "591658179137a3441e5932437f119588503e9c1d838eb31ef5eda9fdf1ddc740"], + ["030000807082c40303fdb44d13310c4fd4391b696573f23ef747c2658dfa2e6e3cad40b71d5d27f96f03000000026a51ffffffff87e0ac38f41a21bb1e32ca6be16d907c61a1fa84ce9c8afac549a56362e5f9030100000003515200fffffffffc054cd9e5407b58442131246ff8ec5bec4cdf7166f90db6819bbe6a713d9e0b000000000463005100ffffffff01dcfc4603000000000465ac515225e39cf600000000026fb0cf010000000000000000000000003da3985d4cc079f9aab5e24fe0dac5b09b02ba801a8fc8c29446d24fd65bc77ea8aed5ecdb4caadcaa4c530357b95f864bb9458004f5691aaaddcbae969ec2dfc15e1e3e13df9ed9160cc641f1804eeea8e4982c1f9f12e54f19569706372e0e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007274c7ce972335ff7b778780cedb909ee1323f7f43d55ff6e04a68c859be659d6f808b52450423ba1df678dd36459242feacd44c7de063e8fffcfec8518727aa70d23fc65022054a14d44f9f4f3cbd8be41146a61fc279bea698472efc5f910884444efd44b6c963898382bd137bd4f241e3e736f74f9245604e03a7551b79d7030b16c2d7880332204c5ef56e3b5b9e86050520fa6f65c82965e04ad5037fdf8202021950c54a448ef3d4795a1be40307bd097ae2649944b278ae6616746ee136340a009494ccdbc2240cb79966d786dc78486e23a66c45f31780b692862e8e61df6cd79f140bdf8ea75e3cec6fd7e74efe3797f09936c388093c9537bacfe708d643022df3e80619420695e3f5493bc1dfd2f543d310743130ca030dd69fc3fbeff56f0212e1497577e7e123728bc6a92a4a0caf835964710b1516f4cfdf722208325a570217e1cb7f13a1212f05fd907e4e0869bfd07b6fa5fecff3741f54b9319fbed930020d7ad99557bef407ae608e311c907029802a3b098c21d84a346881ba6d1fd5c2022ef45009cd645f5717582851cda547e4d3ff22c65811a8a02b36e1c6eab5d4bc273e24c95e1a3bb4df68a9e2422dc393f5b90b71f2703953aa99e37668568847dbd1c3b28c4b07ea4c9f3263f01253fcf641ac503dc4f42539e5efe63e71b68e91dc26326a7fdd32faa62487209657dcc340d61848ac6f26f7e2e5f511cb9df3e33b7aba6ce52d2b40d006fee58f59ae22a7499edfb56428380d5b5b550c36e92a66c9484cbcf7508f330a5eb731c7f0fdb705fcf6d9737cd4c40dc8a4b58bee66d2e4b453647773d9f375565318da961340b624414123d881b406b0caee8f982d125e4fe4fa7109cfa5daece8c665c58399c9e19630ec48470d76eaa02ed82ba9f0f9dd307769e8b53f51c40ff1ff21c6e28e5012ce335b34385c46c7f00af74faf64ceb27bc564054c4c3534686c76ed96156c6f8d9ab338fbc3f7977324dbb7e231791e0446c47d47091da1cab619ef032dd69361ffc955813bbd3091ffe01b7add926d0364a55839a068ee39c0903e2a4b4a2c2b13aa93b9ec3e9584de4af2fc80f49d4c17b68a828d40dc6ccdc9fab7a086e3f0eb6eb407702d3925d908cf56a3cc82db22221ef0744204fa8c8f2d2d8f22df72f186489decd8d541f36fe9836194c92c4aa7d47a2247c500349906d5961a425701800c7be07ce4f1362d2961df92d5b58c529d0715fb5ad19210b300853b2b8946c41905c72d2434f2cd9b4ceb6f482e022cbf9aa78e09a2ffef5e791d457befb162aeb56a4f3588c5672a618938e9ff8bb161cc6283212a49432ff83cab0cf4e569972c0e82b7675a16407e4a7048bc7b7b3344dd1a52f3dadd0b23d1e013db70406d3dd57b7cd3adf681a27fedc02e1e21047dc5cf80d4537a3d73e63b5a5a6db3964802c8a3f282452442d4ccacbe280e8e9e8364dcd837d15ef0ac34476af503ef22da979aa44f67f3033f7a94cdd8d9e6625fe4c465f964e7529fbd0f1e0d4e684b7bfab1c947695cd8263cdffe1dbbb79f53b240f5e6ca7d9044ae6001d589fac641fd18ada0fe5cc0882bba1659caaecc64f325c737e41dc2b221325db99f2e53b289ecf4c92ac41a5df24dbaf45e0fc3d4cac404eaa9742b65e364fff08d4467ad181f3c5d7043d6efbf2f6f959ef8504a7d6e924900c2ed479d50049f122eb73a66e25699f252197c22d23ab75d1e96537e33d1fc6ec2ad7d958bd2b62f047a28fe65543517717263ba672b6c2c9feed93d33a6488709701cac9429fe144c65ec2dfa779066dba9a36195d750fc6adaa6ad408aa94a9951d9e13386bc16a1f7ccd0ef6b44f8d349bfa056643c37c96c2286bb3ae5aa666691523db1f23b701c1fd086b5c1614c6683a5d9dc286e5313955fa87ba7cde15ff7b840ccf7fb3ec1619574123890469a586d077e0fc1875342792a50bb8d08b2e45ad0975c51d28b5868ea108d4ef277866bb56ae3b10e8f44158c9a3914d803ca0c481ba13ae7af3ab67ecdad3d61a03f4b13d2003563eb4c2e5b23f8e83a7659be74e02267050300c419ca3ebe1a0c6e9a5d915a340b96741cea8bf7cf52324f43f344b06209c000b2d4f52a734821e328f31e26a91f1de8d93769475f2aa9781732bb451ce55799af32c44ee5c4e9a0f645f1b49a269d838a0a62ab376b736bba65fb03e154f094369d55696c0aa14a54ad3cd589ad5bd38369947ce0b0eb725b3f74463b80863703a5ab0b213e371272837fbf726cff9992bd0baad3b90700000000000000006937b00300000000b045e6161e4d0ff8f7c91617b255e985964e4641b3760f8367a9ddd38ef47b99b81e6ade676bd0463922a51743fde534b474a18d34b04bfd57bb38efb9ecc2c5c3103b4d8a863042820b09d2905872841005c6f0a03ab02cebf4d3384570f33f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000147173be7b4d928d785f67004779db31811f3c4be5a263a5af0ea40ca359f4c32b17d7f2a645a65fa1faf925b96ad2fff8c9e2d78fbc267ea6027115dfd41021348202704657e7a1818b7e7293f51c2e7d1264b92789f8eacb6f69072d1b0cca077b8ef56894c11916a187eadaa64c651dd02f0ff30181a15eba0c1fda2b8941032b9c742d5fac02af8eb44d288372c0eb4b25e8bf2aa569ff747741d19c54b7c8030f00b553415364354379b41fc22b2a57f3158e1d89de5583076e731f86fe5d760a016035400ce042dba3b5d253723cb267db7c3b56e8c1a876148b3858b2b2413ce9e3bf939958b71b2b40cb74ae05bc6ded22bcbe26eddb74079dc3329bfaaad902136517792f60f320e83401ddae513c1466f43509db61c14103b04e13d19c659003153bde51615cdd1d884a2398763d5428322620b647148da9590a9e3661833ceb02010db99ac428ca120c25b38175030cb6bce8f40e09b9b4f9439e496f6b9bbfc3020634ce79010c2f57b44361f711c65840737126de717296f4f3938fede7bb35d00224c4c33ed2353086a94064304a47c09e9f3f650e7a7f5f86dd08a5656df38d198f4e81fa5311f7dcdc0059efe8ef797bb2f88319c3978bc5148622f4709276a27b72657f5f15e55eca056589ab159b81914b44f09cabbced7245b5611b4484a883511281f481d8e1da593a16182d7f5197b8e52cd5b87cf7692531046bad4e356c4263906a0f0a8a170afad95db50bac2c0e3bc2a7b6d6f11d1192b10ed38a5a4a36cd1efbbd7e3089438b1da3e1af3bce62b168a2d444095506b723c763155c9d3ad33a3ae1b2933ae06bca00c6c54c514211f1368c621a7dc75b0041bd3d108cf5c42a349f27787e02385f0dc3ec90d5371248446fa0831dd9d52acdd9f4b6c9d8ed27e9f384b6dc649b16e6bdd34be033985bb2862abc0bb81eb40dc8cac95d82069fa87412cbd22ae36d7f8b1dc7c14fce59338a767c733ad0d65c9217216b3c921190d01ab0eee4a41255c4120897e3109d3ebe749fae684b7162d3696726e01ba13c7e32e4fbff22e0841bb21a98da6ec7df7e51ed8b23153f488edb2bcf54d63e179eeb7c2ddd97c69823d8b51081217070e4081e9d3996e45d7b5781da51fd55801420bced4cf7dbd7742f98ab342c5a9e7698e839b75f28a68b82e12ea2cb44079a6adc12c7b2108a3f38582e5d038ac827f9fd448ca4934c75fbdcd6e77aa0ab3ddec9e623c24d856228f519765a732a205950a78b3d922ac2cf8c764851fd873268909b6d858ff457f6dfc2d3e8febb3cc36a379511ed0a5567b791f502678b5402c00d2e51bb13e7ee62aa9b898c92ed7a1f65adf71ba2b8b710a2912d5fc6fce62c9dc72c349cb82f34cf90c9962d9057d6603f66ca4c1c2023911f927f524962207f6126e7f0795b8fd5dad12a2f0d7895a700e96f584dd56a4bd0ab4c48acc981a5324f345d5269f57abd51995386ecc0538571d4f0d794627b4775146976c079643efcfdb421217e1a5057ecf49a904b979b36baa7ad79213d87bb7524ff27b24bcfe6209e25ad5b019ca7ddbf2f4635d5d1f7dc70590a4024e66f7099bf10c43fab1b7d8dc664dfa846b4aea236ecd1bf2f338b45c5946da688d8a3a59797c5c40aaf0af5a2625cb0ea8d024c50bbc381019f21f9419c2cd96e48e9088a6f9da08f11bf616f2832d3e22f2b15a89652b157deb73b361228961f86bb11c92a7a891357ec74d6d968170a8795d8a0e5995fc338a5a38b12ca88704544176a251607c132a4ce0c74209d0a404143367d86327e418652c26bf8983dac26efea9e6deab808c84b5c70c4d436133a1bfd7003aa70f3fc28be8e0cd31cfc3d0611f991233dff34bd1e0dd0541eff7e321bc956ff385a01babaf3dac639406668182440be9612e65d973d5ea44b4ff78bb4b36e9add0b7c90f01fef9b236924831eba55a9113145cddbd102fb22b38294f1d8e1df64fb5e8bc9b293e61229da76cff80e24d1756a63ac5d768c4e466805c0e4e8e1e831accf1a4ae7559d09504374e39f93dba72e0a5e23ad72bf3e93a868251338b93f1a5eafdb34c39cd80a71b0df2588e9b85fe9e4497739dd7e3afe9e8f48cf61e392dafaa7a19f106c6f3551ac6b10c8a9eec09b0eec3f31c5e327a4480fa1daa836cdc54d46946e4a859cc47123eeaf6f89dca7eb5649072135a0c42e94902b8977c2fe3fa014f69e411fe10544a21ea7b163f893c776ab55562e6891801a7b89bdc7f3cbdae0a887e1df14a4ac5e59e67e8efc627ff781b86d52c6db526722b405a5b500462f2861f4eb944bb0d1a8a369aeef0f3f9d677bc4b4f1459bcc6909669e2a654656a3fd53ec5a4d94588720f408dd8002084b281263f191e855d72b2b3a565c6ceb71df19ce67f48f93b2c6b2a0cbbbe4ae05", "5263636353535100", 0, -489642415, 1537743641, "ad15e8799f5b484b23391f78f35b8b1872d70e15ee973b2ef4015c0d04d1da0d"], + ["030000807082c40304128849fbfdc3c1baf71e0d9fe06c66015e05200debebd14976dc2b94cef4c1fe000000000451ac52acffffffffb62de784bf9e213b1a101adeeeb3b61d2ebb8c8bb5d417a6c2bfbb8b6b9bd556000000000252655501a777db8708232bb9d16d5bdabc06766977c6da40486d3e4cd4decfc4343b1adc20870000000000ffffffff6c3c7aa7b69a102479a6877a9c9cd83e387cd92985c4f13122578a157a42ce7c0200000001ac6cd1dec801323fe40200000000086a51acac0053ac000000000091d4d04402178b0a03000000000000000000000000123658917cd6c58aeeacd645cd8c37755eda80995b8d27b66aa63e75c2d5476d11ceb7645118ad29584d9c91f46cee5d9d464ed97ef8f7436b6fc1e2de2e699edf46208d722cb108784f1673722025b07a782f081e2c5fd5a8967a470780f74500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000df5ea280917101851328954f8be4219058cdc56685dfc1036b035b30690a1bab891db61c9d96699aa7608988493a0e15da0e672def69215236193f4a4fd13722aa239580ffa9a898f904b6dd447bd321c6a9ba8fe03455116be93832c400541b8d40fb99cdfc6c092a9698fb6723d9c844452e6f0c5fb3d348ff27338d375b7b020b82817af2adf9195476b7a34624b3f5d195a9254b4d2a365fd65017cbbf32b203101bc21a2fd5201cb73ad9f9e8521207f4736d5b79f32e54b781c970fb43dc310a05c39b2164d2f2585d0cc2d86196f9c8f18d58de257982d90872d78fe64d5ec8d3ce62509c697e28a2e900b3755c3ca9c3fe322b810f2af7f3cc59c678eec0e6032a9aa8beda1f29311c1dcc428a5d3eb250e6c00db77e1374c0106d8b9d370b2f030f0bebebfc8d4adc17be79662afa1235fd260147ab046a0639020591f48aaa0b0205c8e354ce5a5b25f99a462b552802a76ea3e9a3b111cf88e7fa86953264624f0326cf57b7aab2814b3fdbf0fa33afc83d1dad4977e07d40cdd89c724a435f047803002bc73ea376ad884383a56acc3a08b42312d2335d5bf398213c214ebe248dec6796519a532746a2e53e3ba06714396c104edc59bb2bc3b4845dd91b5a880e349665ce68c7a0e78788c73b37ff5c7bb35083220b01a17a94c3ba092e957db30cbbad32d7de7e312c2c18988763fc4a8d3a4c976b617c29601068c4d0b82ea966aac075c6e204e35a94f4733f21962b55705593fd89147638c8f97f12a5354af7c5216fe398be21b2ac19b523dced7b388b554584f08c4832122cf59d7a166e21729fc044cd9dbc190c77a9f9f1916289486bde4bef1c91a9904fd54b9eef16673fa055740b7c12b0e9e0f1cb3a5199f7a57e11a230525df169301693eef34a00877e38e8d05ab536679fab6a6540e7ac65f076ab7cead440287d1d634b3d6f87bb9b9dfaf082718a7cae09b450a88b5f2208472ed7e11fe1acd8a3b8f612e7549453ca0bddf3fba2c8dd60650d0edef98f7c810801834f15a5c7e1de74505e70272f01a5084f7e8ce8b4ddf86cc2869bdae83173babf468ad5391e8022e7a24456a434c690a2f89817bdb6e2be38aff2f88682d3e3e04586efe8867d2ee13dbe4ff41a6a01462c3491bf8a53aaed45771e9e90b8f61029c57b09d819ba23ed3ec4d8e2fb18ce507b4a7304ab8795893956288fff3b263ac61609d9f44711d9a2c7956ecd793bf7965b9746b9bf8d28dba787d3ba621887ae21b0cc0a94719e8ef131f923521c471467aa339f06f0ed8cfa618c97ae09baa185fdb47468e9fcf6f19c841807d6622c004da8f7452cfcbbd5edbb30f18c154ab8001f60cfd49ec0fd70e79df69a6a1183c17fed94df2384520a254af14f6ea6b2f9890f71bcd7b077ef049aa3c8b51bbed6141b6ceccf2b024ae8deff79bec2ef710da564a5a4cf28bdeb8b9269153cf0ecdb99cdffa98bb051b1d701ed18b137c2f2eedee6ae7bcedeffea2c2e16ce8551caba48e356637110991d35b2e5e9c3594b4305be14fda3c9bd0bfa8d8d2bb4db6b638cc46fdbcb2029212d03b30882aaabad5cb679ca8e946d7a913b07a0cf3a93958d8832d940ac3c57bc0d6e04fee270fd3aa20bd165ee06cda9d4dfcc0d9a65c68b792ac226a20274b6469bab522b2c34df39ff6263d3a7fba0d1a6ce9bc0d8ca9c1f8a63a5366e01b7af4b4ce0faef306d31e97ce6812381cc88157fb3551194709953f99f86e4f06894ad6966da093f635505d7c2f2892ff6a8ec4e4b42a27e0ae41d3d80a5d90231a0730985890c73315631f99aedf05260fa2c5ff79ef7b32db11c3052107fa63f8d006c7af40b9756fae82d09e7e12051b317e122c935c60d0ccaa248f1c7079511bb1205c61c11e73ff780adfffc2790eed14fe3a7d2bd28b14470ef3fb41b8b86d2cd412d082a51ad4e1e6098dd8d495ba0fb9d237c05dd31dcf501c4f0e8ceab3abfb36a8960ce3a4648f9ccc907f7a9f602542a28efdcb8e73478f28d286bc065c0696129df8bec496022075c4a6ff127d191b754dde7a84ec0f0b8f54afb27407457473c64b80ae6696f9f6c61d88c7a63462f223cbd368a9ff947700ec271e5efd886bdde1a92c1ef2148f357312c78da2a39b1865bb2fbcf398f0779350a6e7ca370d6b7af6e37be2a0b11b1ea3b6387f1447c92febe8846f70e962fdfdf69fec95b66338c7c96194843d5ea318779acf98015b7d7d19d8ad2a10e46061ea3f60c43228287b8b4b6b68457835c58214acd74d774870e77c76f4c0000000000000000b9c33305000000005b9ee7d96bc9c33d587a83a486c28ceb2c89785f268fe56bdefd83e366b62064da8e0c05acc3e8e0b89263cc160474a9e44489976124a0652f3f2167bfc2caef729778b281c7dc28af2f4d0c63425cf39460045a41b3829a72ea2e9ce8e2171800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d96a51c8ca8996bbeeaf88a5e694f85fd24812b16f5574f0b8d524edebf7d10dd66dd79f8a5c21d4d0f9d4b1ce125973a8ab6f08ba889d3b918354a64dd2b74df9e63011ff8bdce7115e3592a22b78de50401e1fe00cdaee4352349ee68467734e7220c7da39085fc040595a8b5956b55403412e3f45f73dcba7123de4b56d5b022ada67d0386bfa4a93a6a09762b2f2e95abc27c558d10241a06510d5cfee6b62021a0e00ac0ec8a113813db99d6a936b77d4f4f6ba559524b08c7cbaeb2328ca670b0337087500d9fb15fab1fe839b133126e959115eb33df768d61fdcad5679ec8b1aa870f0c1c5cbdf8755f061057b2b6d0d90c9471f2520046bd287a331b2c6a2021f16eb2647c4c07f1876727dee04b46a3e1f9ef9a469b8bbddd39f850c95cc6a030f13cdf899bbc4c68a08d95c9d824b63c06722999a7f43b385ba783627bf294a020144a2bc91b2557a646cacae67ac16a642f1689f535fee82364cfedf38da49980316c2aef56c21353539ffbdeec73e3ef4de5af1a9895d1be345edc9472d5551c5030b7c9e93a48f809f084cba18c62f577d825399a283b440dfaf3289e239d3c94e7c70dcfd1ee534a35bade280858d8ec51096a539f765d498e6afe0f45e34c4860778f3bb7837a04274f39c51f438206e1d8b8f5d8dd2f431188fb986f9afd65387936822156af7b0503562a5b15f811684bc37dcb5876acb4e394a29fa8aa61b931cb9a0a8e0cdcc0d5ef2ba7f706bdb57b46f9b3bb0c6d8863e5835e0229b0463661d74b734f05ca0eb9b601f514985c5dad4a5c661f1dfd589d368e0d7fb8fbdcda3373f81a9c153915db71ad4b59a0bee04671f06becc6bd862a6a14c3ac42dcced1a390f39bc2e2258a6fc964d791d4d1c71597c6af60cd08d1eca357f37a5915574c7f480ff1c58a7c9e36786639a203dff25d0064691fc769b71cec0fd21a9e586dccb9edb95506416c6a5c8ce6ddc4cba57d38135bf4bb33434f955eec5ebebc1109aa406d1a9aaf8a734727f48008eb1fb4129b7b8231d496366adfb89d0fc037e7be02a93d9a071aa2474bf40af4042c8aeaad4edceaf4e426753c6614eac1123b64bdb612a4351eada09560d6dcf88fa9af8ce3040c34e0bc830168b954f5df7f448f45be998cb74a670f32acdc61d9180da815ecc41b0de5896b3c7713b583e4dd9e7142412065a13e01b12ca6e2a6e9af4ab20086ce0952a5e240991468ee879cc7710ecd6af35d9c4b1f706f6a71f69c945de6317fc13343311e000964e7a04c586978953b1cc27abdfd6d1fe9e46cbfa3bbefa47d042ea7f7176e0b03986ad1bba87e5a569d5b677a64483d602bc2101b871769ca194b831ad7a863f7ed6e42da68d187ca8f6f8ec03530551680d8361cee02b7c4f12f20c7c6ffcf28d104dd3676cefc8d164d76a0db8a82d87d703f20efc66663d80d1bcd64624de3ad91dc8d54effcf878666bd4f0622c40164356033f2628d715df1e87bf67df686dcc8e4bada206b82cbd9ad8ecbdeba9f84f7796fb25e5ba05438648921977f1014b41b6be12b63e862e7d87ccf54bfd8f1495229cc6460ab2efa0d8ccdfeef5757b20456f9559a4d63aac4b64d2681f08bbf221dcfbeb7093900c99d253e08fbddcc4116e361709562fc7207e5363ea15e17a499dde1fb50ab06f30c5c102ea082c510199a2fdbbd4e5d49a496a0b94c9b527174d57477f0ea12c91e1c9c93152b92ce58cc99b0ee5c7e9f632192ded603de4d870b635bcdf80483c238184f1a5dab955dcc1e606fe90ce9bc3373d48c4a6a2c890473ff755d45d35df036f3a39450ae2552df1837f1df252b67e1d9bc87906bd567cdedda96e1cc8478957aa534e5da5641f254e7321fb8138ca4f5caff811135a29b89fcef7b5e2c643920513ae0314336d3a6295a5c347008f369f238108e04e3cd336ba6665718adf871e5f9b3d0f816eb2f60be883f4e1dc496aa5f741bbef9c605ff630d38a7d9d26c85590e24124ba91e2f66db192b27e3682e437a74903ec3e68870524cfaa17fa41527506f12cf213634067d04a80999c10a874b0b54d94b221acbc7856eda83190640f0e55b76a500f8307455f28c0aa70b601bd7a48e4d1941f838ff5d65a5e7d148bb382b68f44612e8997f7d6c043c1b94e29a6f2a4ad8c1da2fab462f1e7c676ba9cf7b14bce5304e904c8bea90328dac505075a720393569fae632c2bfaa3b1aad65356316bf6c7c3962900b31f410204d67c2adfd7884417ac0c076e6b648bf5232600dec83869f1b9da1a2088d632acbf3e9be0044d4eae711094f3007cda77ba0d4bcd86653d41bbb70d86d49478c755400db28ffd53c45fb9177f64009470cc8064f202afcf0c2cdefa8dec6fe4014938e22433c3119517a3bf5f94c08a99fa2d8ad371b9f88edc7aaa100", "0051535151", 1, 860576797, 0, "a06b8d443227e2ef06fdf53062656e32048ca0432b9b5baf3310268958371f25"], + ["030000807082c403023cf1ad2fa43014f366ef6040bfd923b5a4aced432ae1fd5e87e2bd340b98007803000000085163635263ac6500ffffffff58383abb65de0444c374045a59aa20556df5a3810a71fb8dcc52f29e512373c903000000016570b9c3d602f876c90300000000076a6a52006a6351ddddef050000000007536a6a536a5253bca2c9260000000002a1bbbd00000000000000000000000000724bd4333a168722303a9a74dc64fb28d6fbea3d96eb4ac95ea692bf6c540312aceeb0ba69dcdc81b2a66953ce4f06a4de3edfea224428e3755f8b95aad6575fd5ee33f7a824ebdaf06f2e7166ed2bfac73ee549469a947065599bbada09a9bf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002886aa6014f2f9635792314af2d8f22554a83b261a7daecafe2b072b5fd9d47aecfe6e91730a4e3b1b3eaac628688c4345ed20e03da4ae56e088a7c88d1ee7965d6be74c4df109b21bb1c00a1dd3c4d17866f16498ae8d74b45366e6bb59f464311100d90a349c103176eebd08792dad5e7accc64d65e3fafd0e9f70f6c1719e0227acd0f6ea81894b6b1876c7fc7629ddc210c750c8a589a443c18d8649b38cd9032c491f7ad8c60915d5886948fdc3d68aa37f4cfa1aea39c8b0fe184f046caa6a0a048d9f53f2a6bc14aa6316ce5b2d472085743d51b23f238d60bc75f1dbc53d0cbfbee89d48d6969196bb51408933a8791fc6569dafbf992d611421d32c7c4a6302159ed31f8f4559827338724c37c67aca5689c9676154b23b2a8c4cb0fab00b3903064cbbec44182e857a713d3a7982fd20e33c8c396b62f38784048ac673fa810c030a91c7d0f787956a98a541c50e758aae1a96bfbf94aa5f7c147f0f8c976aba0303285c276780ca4d0cde7f57d576b6c71017c6358ce784fe9d8f4e2a466e772afe0224b0c9592602b76e0a02ca11716799022f2f962dec88a9eafecc76f1e86a9435fc2eceed8eb93cab3f9444d9e2c5790c1491e988bdbe81560752c59979bdbc4061963b6666f037a88bb4749045c4bceb07c29ca6d6f280578b01bfb9c96ff3bcf91fcbee5afde900d7f4b4996d6e581f10d7f512e38f1038ff33e71e38e762e44397342e0f3a7f605c1c8e3d759eb32804e62cfbb3ec1504c5697b3dc2e18fbc162f23ef31d853ca17383596ef9e31ee75c12cef5d4b50fb6495c96253ed8bffea70127a72d6b30f85c7cad324b99d606a64bf686b8230384d13730a52fbbf1027c8baca50763584c07c004a7a1ee84e88bcb7646324c27f178fab910a1cbc6414c35139c64de7cbf1dc279fb4aba2fae2aff2e833d71ac2e47fac3df4bef189522842420b5eb03509ab9c7997fff1f574d7f3a4b20f1b89ae5fc332f1c484bbd8db44f632bc91df86c940d5c14e15765122cbbf72ac24947e07c7aaa328b2f9900a599be7461ea8ff738462e260a4661bc8c457b144b6e4d14d34075b0b2d10afe29d0827ab48cb9324485134810abdecb801561d622c8010c97383c30713c8e64cc69f602f18da30da49701d0cfa8a0c8e2da7c100648fa92a0a9d57ef688d8d26fb6c1cf085679f60bd9f069027c257feb89426002f3c21348440e1617e89e65c161d5258e71efaa6377578319b081ad2cc3440d1a3d553c90a9ea2c78acb916f2c1b082fcae18c2804b852a28ddb0f477d50ca42ad225357c4167983c7323c147391d367757bc1066295bab4858567824188a34f96a647f60f4889b8b00717905c44bea63045f91a2b060095f552a2e1960c1a8a893c0698d871f3ac52895778c418ae10677200439373c9eab19a13a737fd7d46627c5da5e0b654a260c3e45e5f78f642aa400db0d27619878934a13a06d4585cbdb29bc2726ce69c629794e5c769b7b45e8e81e6c2d469ad48fe92fa1b158231dec1855ff255ff76709a457ea0c429fb4b9b57459dffe41caee516dbd3d75805e62722bd7ef312b76a34f45b79e75f94f6ed34bcd5e42f1d86098be36aeba8c766fb7e1261c598f7bcfff2dbd52ea0ddfd243e93c52b95ad4d806855d8996eb11e115f600d565e764b2ab009ffc356166baa0c4655da0a70b3a818744cdb472297e665ccefe783bba0d76e29a9c33a7d07aaab36faa836a30831057ee4f09d48a211096108b0a6f4fbced0521b400ea7fc0cfb7b8cb0a74503c68fee170bb6cf0ea9fc5b53bcd471d459d95ef49878ff4af1b34f56ba9e2116303a6d31c4cf8a1a9fea01eca2aca01216680688b7afa9b6c3d0e4b64dbbee934d1f4775dccc60d27d4476bbff58bdac17dbec48cb3fd973801adfea2d6934ac06cbb7b1bee11cedc386c7443f1a1888977c0291068d0238ef8e468a3ac23dacefb683c818910b7fc27d383f15ea2efaa8556cabc6b06d92e6905833e1c71e83c02a9ad50ba891eb1a924c690d2ced687ae9397b849086f49ab21ba0f6efbba6c3aa15b0d3e0a2736d30e363b8b76687dbd8197d8e433e0ae597eb52dbd627e27f6839384aebd157f50378d7e7a93225a48f1dc62784ceab0dd381265a79660318ad65278c296b2491d5d423cc45309fdc769c5966a4f4bf243d735aa5d70b822259959d2fc691e454b9a877afee60e9cd9cf0e569e74a180897fee81a8cc37a1d0fc899a200121387a4002a6d0a16b4ccee3982aec4ec9870c2e2d5784052a1628861813264010000000000000000000000008caa9f76d0468ffbd1193ff802c2c2a2581ce996b010aac98468a4638a1d9cbf8dac78eb71e7621f794fbf470975ea3b534a9610c13914831364e10868dc56acdfc5dc08083734dfcde57d5a600249555e9e048ba1d04cbc41f3968da7aae1790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040cb6df9cf5ef0c92323ff25d9e89c67f8197021249c156b27258f942f018b18c999373e974fd7a2d47db266ec6b1284154c9904d6aa240e2cc5733deacd49e177b48a01484aa965aeb74d20727aa553f42f993b77b48ec6c6d4a1d93207b6a2de6a16e9bc2aa7af1c8139afc53b91e1b9f22d86645afda9c5e1ced008b5c2420322f88cbabc67872a6c3685b6df801ab2f9896883fc667ae4954e492d731f2e1e0328c442eb23a11493ee5befcf793c510a0a1accd2074ce8e3ecefc8022f3c45090a003695335a3c4a4ce84c458c5cd4a3d58b98ad2febbd2380f080570f0b3113782e27084275fb6c7fd2ae2b3da3eab8ed1d1599fe130808f67714c3e1ffa1b70f03091da76a39aa2356300c1a31af2ebecba83d4140ef3adb254114a0b32651c3ac0212d7b60fcacf37cef5e5f722144592eb1ca83464660ab648cf2c9c920ba70eb0031141318ff949a8b0c9909f1290109a59c29b19c0b6eef7398eeffd8d886612fc030bfb20eae0d652583e094cd54c17b3249ec30dd9a9f7ac36ea4d04b5b0b7b0bf0327ee68f5d1f9051a9fb1502cff907e8cc14d1198ece623189490dc8ae5deafbd91420b4afa93ce75450c7e59bef0026e978276b42ed9e1cd29b635184ccfbaa651c6d011918fa214813178e751dc32b8446a9c83a1b0f9104c929ef14a09bbd2f0278b3832a1aa9f82b5811836c83d8002b9ee10689c20ea2a8e96e7f01124aaa4af3610f4ce3ecce8342f2e1640f14a7fdcc74b0714902891c547987fc7e8045f2a645160f8b85317c6445b132738f34c10fe16719e914b786752be183298965e395c403540f1004a89be3e2cb346aece44bfb4aaee4a1a6d69b56ef9186daf7ddfbec72ffe9ce5ec8e80b9b30759648dedf5df73aaa0c610d42d5cf8d8b5df9552afdf01440a68677ade687a4bd11d2107f88358b98ff4f1e1f311d82ded364064379ddbeed041cd1ae3ef9f53e60ba1c5fd220d61ad16ea35954ba79898d09aa18c3a21d61acdf32cea652bea9575e31145b95bd443715b2810271430a2ee5545813c816026b55ba5c9311b354b7e7b7e5489ef1ea25c55d866a1cf962a6bcdf3831149407f7baa5132b01d51abf4492ff169220a553f2a2c87330b17d835ad18ba07a6a38434d801fd1b0bffd215a5f1849e0026d6106809891daaa6a1dd99187a692badbfdb1cbee80aa4788122c63387576362f4a66e448751c9bda6ad8375fd41de6b88516f4408a7009880cee25ca09c1e735d4bfe91696aaf5d747a77fc4d47b6bd82d6ac6854ec7713cf76f40cb9c17bf12e9cd3f4ceccb1c712dbbab3cb56d4d34227e279aedc7b4a396b03c6605946caf46dd8810005132b3f5a0f04141118619905a1a0478ece5f3a21967654093d90f22a98af45a5c58a94bd47f4fcafdd7f91d20d4a73e5d72686a2dfadd5d6780e797f8a990cd6712acd6e57b0d89c4dd94a810536d192bb1f54baf587de94c84080b63c2297b0c5281f4a0b4d233e62ca00e8b0b1b7bc06e2785ac0c17dde6c9cf3fd7524374350be5fcc8f651e0f9e09e43fb62b5605b597a87da3764aac218d981d998454da870ea02cc7037eeaa657abdb52f682a1fcb21b6a87f54d86d37ee21ec7b1f22f4731f34363e83f779be8ba458bc452b8266443663f47eab329926a8d7a001ffc24f0c9aa78f1b381bc40a170d3e8c43ac110abd4175d086eca4c183248da4489d2848ae1f3e90c789d04772dd535ef8ffb97d8eba9ffb3165fb5bcb51b034dbe7432eab4f72bd02aefdf52fb4740f4deb07b08a223c36b917149990688aaafa212ce3dc84945c9240f65579fa599de42b2523f3fdbab036e35edc544d05ec217f1d7fed966ff4e7647d4ec961b9359acc76661042221b8a5a5a5014002740a7059afb7f884f5015374b95f7ef91b340a29b0c1f8ffbdce32719d9c35cb650d5ce4a49bb9d7feb5ac42bbbb29089d85a1ccb312bf7b79e1566fbdcee9f48c5a8bdf9487dba8041cb35e0eff4683bba440998d096cef9fec906b91014c147f3fb21155a2f0c6c2e201f644552473cb317ae495539abfce95637c362e89f9994502dae4fe4d09e112c7aa7bc2dd40091f27f11eb700c216b56791bc4d36602f35b4c109e23e1f43993f4b8f66dd8c9c26556df9316f3467d502839e05c31dce769c353a426057b7f5a7f77fd2cf4d1dcea6c81ed4a93ee53f9a6f5353b3bbc672d0481fb912ed17e74a1b1cd9fd221661f37e2672d34bdd5721961c76484393ac9fdc6fcac2ce8b70f9167bb4782211a84fd852360551203bff0a9db6151fa1e154cb73ded6c8a89eaccfc26cb7aa9ce29599302f0d34dacd8ffaec8ee90d189d49fa3fa91cfcd22b382889fa2f67b16c7378db24c33ce1b953699b3071f8e4b7b41132978974e355787dadb22059f78b09cd93f2608300", "006a", 0, 24039051, 1537743641, "dfbd378f65b1d3db126d57cd93cf830992c220ec77570a68247f184e7ad89694"], + ["030000807082c4030168e495307f90dcd30c4409458456cb215ef24dae80622685b8a30edf0e12eb9602000000090052515351ac636a522d4101460197d94e030000000001520000000000000000010000000000000000e216e00100000000951739234bb641442194466836cd0cf61502bdea402ea576c97814039c11fc598e38915a459f7315cbb8f7bc2393556f1bbffcb0f462463d777157ecfe4b54b4150fd169ea4665aeb424fd6b2ae0c61312bd955efa171f9e3409b0d1b15b72d300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ad7815d28310be564a680bded1bda94be2223c892cc85b69f9d22e82c2b8b048cb992e283b85135d6f9f235a6043dd6ffa05f7d6ec8f466045725c0663cd9dc8868b9fe6197243ca31fdbc665db66ee3691152550b12c3c28941a6180568307a84b1cbaa3d6b0933e6cac1594b7c170f4bd815f46b9cc98f887d6529ba73a98d022fa6aa3cb945340d4642a208f439c31a7d4befe773eac07785577e544a53f11c021cc2a8d39e29889869c32230698d7bb9eaeba7ae2d7e5338760a16159b84196a0b02297d76ce22ad209327b15cecf073bdf81a8c1ab25c6ba29cc1a7a5f951c186a7beea4cb5b53885528b93c51b142b872171a0b73f22295ae34e5039dbff2e2e021feb9914dffdb2657543f53e1e2a011f749c9d682923cd462ddc8d2afe435e600228eac5bea68a8dd3a4493c0e61d0504c08d60d8563e636feb788d1c24db04220032878cf11e89479d8e211df64fccc09ff7fff088515bf622569cc6cd9a4bb3cf90213e1243a2831327bea1a4bc122f244415aa5401d55c3a09fe1a069565a94a787020154778107fe44bf88d963f3329dbca06cd9f2a85e42a964358cf9a1f8095e1a65de964652d4f1df0a4078a524550f3889513d82fd18972ff7740dbac9a02e00e6f887e022961d6a88a2894f3358ff3adc1b2bb8b88da5ebd1f592c9fc78bd46c23ee92dc93245d1cd45931f7adbd7bff63d0f6c4a4ac05d62cf5a1937ad41765db98934db88e4327decaedc32e87324cb36a9a5b811d69fc1cc88a55bd7193303d4b0a05e81a6271f915b8c32df26d609f673fa22048a2a11a2ec03653ffa7fdc1d1f1d727638406df6686f78255a499675be4096b28271346852ad3e6a92318fbd324ec9eeac8d2dcf1b2bcf38d3d4f85ad53755cf527da6d4d64226eeaecc97e5ff092efab0d00852b4211c5f7de8e7b4e5abcbce6f208a5d510c0def68dd038b834f03bf77147f3db0cf5977c5ef181ef8008117dbefcfdbef56059d60a578714573a253b93bf723a9cc0412e56f94d8f6c6f595de1613aae5a495b9d8b75584664b18ee7b35a1e9b1a9727f42818a720712955fd8ba3bd18c546539d6854af7ac05c3b9b3165556e46b9bcebc0fdaabba56eb15bdb49f89f32b5f251afa4b1bc04a461ab925ba07a42c430f262c82452eb4df6efaff623d24c69da22ab44d84ad0769f5216eaf8153138e15a08b515d7804f2cd48f11ab05f335b1fefba4236e08a54fe9c44e31155466589fe1e9f939e276505feef39fced7294eaf4586ba9192769be24b973a9c71f1cc9c8a71a8a9a2ba92ef7bf291039d4e59b5a92bc48375c30e29252fa722511bfa7c1a89ac07913aae09665c5251124eda6b50861a41de213064187f63561bc853380ad40d6111041d905f260cc378abb421ad719154c6074856805b4715d2586a14a6e15b0ca76975d913a14a9055ec6905dbe013abdaf3f39c67f73a3239a5e0062d867f74feaaef91896bc8631d26539ee0b1cdfa61855de6810ed9b42b5330f7bc2d1d7ec5e12c1fa6763b6f5eebfaf47cf3a418a54774cd931f20a92ae92bf9299b166c5c0291774029b03d5bb43a24bcd53a01565d9471800bb8513647162744037a124c8bc3abceae1c4b327c369674783436a53680731e1fa0c792d7c09535f5e57e254ea380fc8bea90368265f2069d233f8e49e5af390eea63d52bd58de49f38a1df81fd52d67fd3d840d3274f0091171616632b88d2e1fca654a54f1bb69fb898425f91cb76b6a51301ce6cac4c60c5e93201d885a6fb99064a10322566b0c95a850fb2a496acb318d10d9b3475d34238225553b99439da3c99b7c4628810dca68292b7538006a9ebb03ecdb90fcf82a974bdb4378d9eea8e844e0ca3f58e2afd010b46f83d4e06ea91b051f3a0aca1672305f414b2d354b9107ebcf4c56656b2717de76448d0757816577789fa0604022d39c095e6703aa92b43ea54c4cbf8cc3b89258b6ed73fb956151cbe16f5286881e03dee4b92fa4eeebbfbbf2a77744795c5628c9b741bdffb2330526eaed91eb3817411c0dc7988204a0f3b2680a95da515bb164fd1e6cdcdcca8c81bdeb971d5e5e423de76bc803fb64426e82600533d09fb8fa34d9866ba2d2b051e80731828fc609b92cadfec3e12fc0e36413031d576c8b8074f10de1ecdb4ee30a9d07bb248e1f21bdf1ec263458a6aaf06f5259542f3e37f729773e5251b792a249b74d178fc3f3eec7488179790b3ee4a0c434c7c25cdfe4b611188465a80cb60a590a95936984c23f648cac128fa76d541b2e03724d60758e7de2e3ec4ac31dbfbb317e8cc607359b8ccd1df55b413965c04024c428ad0005a75132ac9b0d208f22bc37a5380ee9034925a339dd028ab20355dbf726fd69e2ebde773bdf2a98dba732a8473437fea038b65da1fa8b04db0c", "5100ac5200", 0, -382385243, 1537743641, "6f78622c386f920336b64d74c2aca1e5bf208c968a50cba9473d2d176c0ff571"], + ["7afc9c490126885824a337877ac2be4d53f7eeb5cef0d86a749cab7fa2684b9be7848b28c70300000006535365650051ffffffff0124df1304000000000253650000000000", "0051ac", 0, 1082198691, 1537743641, "1acbb63e79f31de178407ad92ae4e8848cf20413ee43f937e4e589d8c30f5ccf"], + ["286cf26703732379d143f5792aeec09dce0e05780dbd4a5ebad11f132b054dd62b9ee6f51e0100000003ac00521842bf3cc1bf3ebc4d698f84f5b3f2be93b7fb0f31aaaab33262172d7c5931d6320e34ca02000000086300516a52005353ffffffff9c38f96bfa2527fcc0e23b1419818679c0bceaf4b734ff7efc802f452b3d3f610300000003510000ffffffff04b06bd00300000000016a16349d0500000000046a52000030ba7302000000000952636a5153636a636508877d000000000002656576e7315b034eb89501000000000000000000000000268955c1189f71fee5d29c813be63c0229ad79d8d806f4a902e5bbdf60239b0831abde403fd42b766d2c85a388e652342b31a0c51c6e642bdb47dcea610859dec1a9b07a1b64a122b5789eda93b9bfc4dfbd07f1cdcfd030ac30d02e5a9731c1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009222882a76081191cec9ceaf4a22cea62e60ae9a975b84122eb97de933ac41365a1a0830a5fcd3ce42dc99ada247a17d1ba06bcd172519765f612bff5134fb0e942eea9ed9285052fa17dfb2ca6558fd20250e1b40573e141b324ae3afbac94bd647141c86e48c79b743d2ed5e6329e15433721754c155920aba3bc3f481791c030d83d6db2b8f60d4a5913def8000ce97ee7b3e0e6415a2470455f81063433122031161ad67e85450851c5efc196511ff6c706c6bfa7b5256e2da4f952ede6e45230b07b0cdbfa745ac3f4875f619037a43866f5ea7449897e57314a3da1d6f5b1c6338e3734ada4b4fb419ef14b514159a9ba8be028fb5040a04710d6a629a66d4fb02088dbfeb0106484e75d8fbf4cfdb3d1d1a0024575480ce1d9cb373c2c5892ed20207310c952c21d78734fc158c90640271199359d2a01a423a109fc4266f33abaa0323ec7b45abe156bb0687b85f3449f35119de9fdd3ede2f0880783b5151c8e03103092256d562c9528a6fbed2412532ab52e4836c32b24783345ce16264014e2d4d030c2ba0bc0f8203f4bfada06b6d9fc5760963d02ba8d9a7af0e3e06b32d218f72a13ac4ec377be8f10bd5cf2c4f37f1a897e05a6f1851e2aa64fc8b6c4957460910473b7dbb7f1852571f91dedadbab52ed5351b0add205c5ee76800c98221afae017126315770e239a30d7968163e81f73007d7191909300d2fc29a9944a0a8ee8170a54de3029420698a51d6a18f3d0342a1dde8d3ef781b3f9e31cd83d01baeb9a8973fb9d20621d7a97f8afc188ff2992ca74024327678ee7a48aa1bea2b718a34557b425cb9334703e6fb1cd71f322b694ec773fe14194eac373e2b567dee6d64c057f2c200f8f21a7b7811607f98c034ca17ea331b1c70f25d15f0cae261b71cf74205e8f543f334e14f686c3a507ae4b47fd9213522189d73e54fc3369d8bac2e01ceae1b963728f6d9fd26ce9c681493ad61ed1642694a26ddc70371a7919953657092c90d105ec62ac0d81e15b498c0aaf890785a88eb6fc347e0ee08cd2d756da38a4c3d873ab69aac4ab01547035b7074e384bdd3fb203609d491b801521ecd3d642251a1a5af0d8c6f3df3ccc94bb667235fc55cf690caf242bfe52ba092bea1416a355441bde093df23081eb80b2fabf4bb9ef1a456f5e91512849402df614d421ef3ea30635bcbb677eb6d1275b1a524fd1c44306b9553bd618e6de361d677ed6872ac5dfe2206e94e1cfe33a8e59073ba3b44a00a35c09468aeaf12e18be3a6734ffbd22907f00b6b0e02b6cdb69b191e4535317074b26a3fdd68bf7ab1b9f4c3405609c6a75c63e41ef41d40c999a461f332ff871ad53bbbcdd3da1bec393b494b408d33b43f60e0668d70f22adfb0cd79882b3f76a3eae0fdf356e6989a10920429a0a565d9a2b145324ab6d59904d32efe7592f90d335d3f26286c359f5f1627e19ac0154eb34865b7fbf7ff45e2adf23aaae215c99b7584f0084d11e1807215755af5bc9d885db10b2c2b5636f73dce622d5c7f758887cac5ba9f0852570a9f1ce38cf38de5687386dd48681c796e7d1ebcdf235cdd3ccf8e96477184181f33773002448ede2ee8918918a82cf089367450abedd3a648cbd28f7b11f6120b5a5a9729ef8180ccc86d80e4d7ff491711846cd80cb3c9fc6873b628fb78b5c00dc1e04c843a5ce65aa80d77908f5ebb405fdcc7b70ccc0722637422ad23c77abb7499e94d4f0bc0c0ffe2db68b39a251922e11e0f086fc93af5f6c20730eb0cc57c8d6b1efd82f97e67dd5a92f11e269c43038405f1c8900cae5cbf54afa9312278309bf18ff28da44ac082d2f8d08806c588e1b04de8ce10d4d1474a5cd638f0d06fbcbdd1cd849b55f28a8ebdf26fd74aef59c95a6c175fe7d41b1a266d8495dbae1667d7dcba5a533f6a6ecf82bf3a6b33d6cedad4484a724a6a33a25a87ccf2685831042a0339962cd4a95bcf1dede26fe2ba4f480634a2da04c380f1c876fdd102f3134bc34909926de96133add934598e702586aba8222a09c87530a9161098bbb9cde054d002facb43bc4205f976d78503f1b0611a57d5e24d04527a8176bba2104fedb04d6b02f392a28c2d8edfe3545939298a902dd31e5af9eafadcaff1e111ebe18514e7ba397b1c889de613dd44ff18225fd7f36e5f7cc0f848b0615c44228230c2969fc20b64b9cd1de001156e4b691836db3cad4f91f0616bceaa9bed6cede5737284635d04f429535677d19c3249083c9ea170afd07d6faa2842fed69abe7c81a89764ba3160300000000000000000000000075e7b84269445a52de6d0fdf59cc28afc0289c4c6a30e05c18e9b288a2bdae70a877d8b842e42e73e9a8881848dbd0cd9a83b7af4344cf547344a2492e846a779569ced4920cf1ae28d3447af7bdf1b5d85208351d62fbf2ab7e36ad7022f317000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003663dc0168b8dab5f2f0987466a4241e6540488f0a8b1858bcbc282d3d2d45b23fa43115ca5fa0400f4b1ba4cda55b509bdb6e06865700ec2d52eecd928cd269444779d4e1d0713a94c285dd66bc3de01825605dd9073998625ffc1407391dd5fd830deb6a8646e49fbdc79fccda172a8fd584e609d850a6323eb7f4ec520b640227e65e990fe61861e9aa08eed05f93e0a78e2350fdc416504d65678158cda81903115c6bf684061be787a4aaf60d3f168c8b33a0df275a3b948a36c68c7509d4290a037f9c1b3deb4b30255f6b4fe05ef83921c1ffaebd833fb62bffe745fee6de9b130b69b8b2aa725f3e5633d4b829d59f686afec88efcf6e7bfd13f3b3eb0b422032c2f94e76391f2b70a3015ff6100ebca0d720fe8be317bdd9be8711b7442df86021cf4535aa2ce2ac3361c9c7c435e10985435de9d7781297bae3e5fbe58a58d30030b81c2f01baaddf99aaa76a7ed09fc9b39794d1ae07a4c090f800a2b5d9e4b410325f1c5b1cfc4ebeb6d80b7c12e5f1c1b27fbcca55987c0591b1bd6cc084fd703021c51dabcbcaa29b2335d93f8f30e71509692eba5b1df83f38964aa4e861f1ff8cb0653ad09ebd5b66a1a4c0b415980fb790398c30d745f9618ef10b084c402d30bb954de81979dfffe8905c0c6e436d71ce93ec886520c1a261bb5ed68e5218be0dbaf2380fdccd621dd8214ee474cb286ba6ffc23ad3d69493d275e08c11105f040fc19e9ce8289ef8605fb433ce9a226495a465f7964f855080ac118d6676371a2bbbb2b4dcbd494d7a20b79d4f1947881ba6d5a11923110aec41a5b6d0709657be207b8bb1c1f28aed1bb894e7f0eea45d308323482f77350d8ed360cb81eca8eae84590c4acfc1213e65ebe6b856069fddaf036ad7b11c17739db89eddeb4530d32f7087a0b9d0b45e03965ddaff325934e4e0fb7e8da3a54ec180698db3cfd3e6d5bf18035927c8bdba08142f285a346949453192f2c329d00de6f5be124b1e51f0aada80931533bb9c23c4944526a2bc56c444039b24ef2231f42e61c5d171ee3009681615ecb47db6173ff38dc7f04b0a8630a50392416753e7613cb86e6e06ecb7807e42324f2c295b12840b8164bcc9e8e3a92d66735096690ec0a1b76239f34c0f25c6f7171386846ca70b16df28f3c6586090de3603ad2101d4c15862428241a34e816716464c3ac7de119b5eef2c39321f5de94366d078113ccac220c8c8d5dfb0fc2fb5d2007469a1ea6b2a1b65aa7fec9115ade7b74372d1f510df6b0967142be8904642bb145c91ce58ba2cbe9fc77549f85596fd479234bf24281dc05e6c749cacb031de158d82420c00db969392f5fa12c0050546466f990c5b6b884e70d6b8637c1e9783871aaaa76cdb11d2c6caec227813a6bf67f6650637279732121c3f347c69c5fcc6338802f6b8dc3dd4e98e98ef4b10cf22e98ff72164dda77593d268885499cd67f404794676089a49dae25c8e52834af40df3f53aa2df8e7da488be717b7439936ac98c40f6d5965243622a90e9d4d3fd80e388d4d1f7d29c774bf2d1eecfaa4d520c01023b74b095d42709d38862caddc482ef0bd15d4219f663acbd9b3c64dbedd02dcae47661b2b3a3bffed510c4aa70b88bb77d4246ab600a20d749c8236ae0f4afb25829e9965d932006bcd3963235ae40c1e52793cc78150a42d6452c42cab4c6cca68614cf07a6deacb8d86153e25d68b12f740b74089f98ffd94eecccca5397d2117570829f4a304ff3c2b905ebf87db30da7f911bcf65a5cd3bc0b4fcfa9bd6f4cf2e6478a1c9fad3b1b36a61f551a520d6686f6659fb58de9c886b603ad6a116df231d5daa481bbf087fed614b530d935382b734ffe8bdeda11b926222f92deaff7f9bab328ed5e290ae9bcc04bc1b10a65981b261a716c4f861f744de8e85696461ba0bd29d01c1c4d97bd30e132e1edb92e1254ebd6e960cd5491d4fa0d6b8dbc1142a512db51826b1f99252d024df7ff0aae4651a913e7945aaf40a1527fc62605a4de2baae5b258786d0894a34daa35161cd158e70f96cde8eebcbb1c4c1b4a433fdb7e307412b42456d3cbbb86ce49c8db99da5aecfc0b1b3643a1e9b75b8b018f6b1beb29d57d7e13abe753c4d733ba2a758d5e1d4aa6466ec4762b04223209dc9b78312a484d4c211c13e0bd7add13a4d4cb44a032d9d27d8a9dec5c8c3172606bfb1333e4966deb31a56b01c3c8c89511ad7bff15de82ba88d6badfcb43ba7f23cf06a9c7e30ed79678df593ab1b1ef8b60a53deed424333123444500000000000000008c6eed03000000006eb8371f2e21ec4ebc600402df9caa89bec36d38417fbbaba344949f96fedb864cd362f408fb5858e32b40ce15a8e4885cc43c96228ef7e2218928e3cfa9cb478a1aa8fa432aaf1892acfe3adc5a11a524f81b58b7606236c5c6fd857bf0209000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eb8712747c712b42dcf70ba558b319f351729fff9cf4c29f5e63347abbf1c37cd80831f9fd93dd65bff6f330a2d2d3b903769b398739f5f59035a1710c8860b328eb5f9ab9ac30e53badbb074202ff1d0411a7eea8fff3b4f2d0b6bfd3dd9c736ee1b3da39f1ade27abc0f8a450b1297daa2867092213ed0d5659a5e8dfcfead0322a93007a79f5eb6555bd74ea2e09954da1c071195e8474d68dc85fc66aba6c0021d338f6bb12f84873b97f839c0851135b2bbf74f57acc2ff9247c63be23204080b0266ccb98e301dd88af5c866721ffd98d40880546678770c5f2672faa14ee85451954f16412a2eebb6f71b70a1fac4a56cb74cfaa43abafcd7988130e54d55250300e3738b9786a3765a41d3846a8ab0aaf6b38610567d3b90e944dad6bd7119340319ccd0965a8b696059646917f06ccbc32f371a1580303fa126fb0384a700ddf7022409c7ed31bd0df634388e2df41778a20397a593ffe45c0e19d779ddf088fa1c02222c7c76c46e9b13c1f05b81a36fd5e9a77601264f99b6bf37b9447e44ecfef002108b6bee19a15bebc322a33ee619966956f10f8905ff48eb27010cd66b3686d6f70b7f4b8baea24b90a2075ddc4548e614af30ebf5d6bb4965bb3934894daf2942134147ced39dc72116910e38d4fdb8ea0922e6156e67ffdd9e65380965fc4e1beebbcaef861bef562ad0a1ad9647fff08ea3c1f9461826c0e6f1f241fed553c3d31026913e594a1a11ed9446470657450abca73cf3eb15cbaf7b64d496c6d2f30e75335318204479044ea555a7654b7e6a04bd8a422a7989620a36745794e73f85ff6256d20d498a1a917d0bca0b43e24cb1356dd6410c840e9cc0cbb5f09cd4d6dc34072d5edf564cc431ffb2f9e9e55484afcd60914c389f25f0ba3f46284f942c4ffe65a3cbb7ebbc5537c76582604ca13409588f9d81e5872a32f668d9d0de4d952f5f2e296394c1dad34ff6ee80cd1947d887a1db8698d08ad3c69b3c6bb0e66297a6e4083f3571a1dfeb40cb1f63871497097e6cc2ed64e986d60940ea7c3e1790f3c203a24144646562a496f5f51d7209d741291b0e14dc8d3c0b2c99a8d24a80d65a01dea4e9ef98c736d6364534670f4f11c659c03438e890e6f1b6b8b46bc1ce6e7d454a4e55c49abff60cf52d8f06bae53f40ccdb1fccf5bf84ec5180a034dbdef59527ddd47bd41d0b1bbc261e98c5fea4b4f03e3b2168f3d3606c7d12f87b7ab468438c64acf08520d63a0cdf29ac3d520cb638a1bbb3cd541b5295d3db419669fe3c7ce1a0676f1a2410388bfb0deba65a3f1caab56107344e3022afb08fc18d5d3e41d8f86b991479bb7af65d6d0f54b09316af120de473fe9a5a5cf862a2cb85a60d93ee0c95d60e60ccac06cb0e1f5f90ace6c308c29b50cef69b2df0007e188d4854d09d35d4e9347ad28445b515411ef280c50a981e2e813703b1b93f211d7c3b999dc2db77e010f4580598aa46525966ac090c80b91cafeb9197f515e4edc59846dee1953b2247f5aab81c27ea6207303cb128ce0b87c422220da48d03b9e8206761dca0f8ab1344a69e554dd2fcf459fa3ca068d69104ba446a3ac12a97dbb0062808d3090233458da254b7ddc254973df5b79a4cccd3049e54c46cd65a9097714c08ed21a3daacd6aadec61d1aa5bb0f333bc8c82f3c155170102735bb9a61f116cf9ca78d6e83c1e12d100fa1a13d3b282d799d2c06724b255875a360b327c3ba187df81378123b6bd9c8d9872ef539ce43c73f6bad4294b9269d9516d2f326e89558b0905eb32f31a8f74da81a669c953ea9058dda538fa1182e6d45474dae5b0675c4dc32de9dc3324347326d86300b85c1630cd7259787f4b6d68b8e8c14a202f03718ab2222a7b643058a0cb2e68f36e81cbe38a28e1b5d29b393d4d847e884c8e420efe58c29ed8554a0353e280f574ca73c178b257e3caa7a15335035faa2eed8baa35a62da4ad13711212528991d36fea0e5de647c0bc8167a0f5dd04f0359bebebc1e870eccc4a8a2245c0024b10e672ba91143c899dd4c5eba8659df479b267dfa11eb28d4c1fcea0d3c726932e8c725e54d7a88f4c73b6ec7f7144ba64fe51bbf25f9a14a9560b174cedec2c5b288ade00d52e89908431449abb44ffa2734b592215fd1f675555fe5be0b286d04d96de3ac6e685a203b21c5c718b0fc5e81d80befeccfad049f52766dde1d5231451414e5ab069b31ff5c88121695c57fca84e0c9d55bbe0d966c3f963d14cdb5d175092d58ad13265f27f1c71c90f88faba85c84dee9bd2539341f7549374e2c493209838b350a2822497387c0ce3445e845489b7a0e00ae410ad21bd7f962554d71226d6706edd0b76160426c1a60a0adc127f8dc565808d6665ed42215cd4a267d2ee05ee88083bc07e4ce951a836afae204", "5152", 0, 2112136949, 1537743641, "eb92ffd5503693134e31a5c6d4f0139efad8cc7798a65f3f8ab3d5acc4a5d5c2"], + ["a380d23303a1263e6c4097a36e4927ce641f94b14c72a0533213c176eb8411bcca6f3eea5a00000000070000ac5263acacffffffff0fc105684c6760ae35c7930e9714838ec9d09879cf05db5e8178e1ef89cdbcd500000000026552ffffffffb665de3fe26c627b49fd90eb2c6e38cfeecc4516353c7c46abaa9c30d8998e610000000001acffffffff02fcae1e04000000000753525151526a6a2f7ce10500000000020052df167fbd03000000000000000015ce3e0500000000499fc721307a576868511138d2d4c599d2887441191b5c8fae8eff3e30acbf13be0c4dee86762c49d52a575240613d7b0fbd340e55b7b83a408ed7454ff4ab2abb2e4b734b7178f8ea9653dd4b5bc0721051e9bc6632681e94398de2e825e660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008007ec8027bbbfae7dba3d330d1febc500f1a591c08e536991cdd041ffc1a9c491bf0443b1712c8f9aa42c36546af1f94460df76805730f890e297a9ed818eeada4926e3f5b73553930134ad6969476d57fa98d80842c522b9a0f75bcc522ec356626dfeb61bdf2fb6a4e8ed7d32d84851d9f05b109411225c144949774589a60206dd79c4a47cc21f945f4240ab9718c034c891b1779253a4325736f743b95ded022f59cfa0a8cda5636bfe9fa8e5a2bb91ef839821a1988e86f93ee66ca40b5cb40a033599d40b3379cf15766d12af4ef382c77a04091affb064a009daf511b80861bdd862fbe73dc083c82f4de3bd6947e458af4fecde1889477edb174f9604ab7f0302e415b54ffe401bbe640e8bc425321a3f1e176454a2d1ce34c25d3d2ed80497032d47eea0d810cdcfe291fe4df885da23051127545b7d83be651f9b68e942605d03196365007e0b287804dcca9118386e7de42b84941e315775a894ee72d8c2deda03270d10ed68f8229a466148c44b79f53e7d81b2de7393363b41aefcd259ef405303078adfcddd66431b19bbbe5d106c544e4d5e1fd29cacad27eab2bbd073f44fd8b2f22a3fc03597e936fff8105421c25eafb72ef2b853ee2cf713447609d2fd46f1116d327aa65881a09a1c4fbbf36472424c4ef7e1fc9d348569ca630fa2baf7b41ff5e684db1ccc0ddc62af2186985f7735900d86b9abe97f24ebb6348ccc663327c4aa303f1eadcccbe6fb30340606d9ac479245b60630b0b96abaee8365ff9fc4c965c7cfb2e273706c776ba7d2099831aa330b17899d11f935e5eead0da3a6308de171b5646ffd35f64a2c60695afc836d6234ba8cff371077d961a050b10b97347c468234e22a8a745c9842a08463b585cd6327d07e01fc99975f24f3d26444139d4e0ca29545364adde265cf75c0d82a83da717775f63a7a4d729ed73615afa5e381252426f0ab9e1176ab1d5df564f97c097e1edf586a2f11725d18e7c94ca1aa9a801a3ee4b5680c7cd1ec8464be8d2ef98590bc557845ca2b071cd61a8493ddfe70d93ea0a2337f6d0cfcd62a3349558af22f8341037f7fc3275e469142e0d47f4777b62c9c989dd99e5db4474bb8a5b66f11c579fdfa0af046600006deac2a3ab0547540acbecac9633a03856310b5901d68e5cde68255f25ed05aaad822f50f995050bff57d081259c52fa5c9596f272f2f181384d341457adc7494e4770c3d936e3a1dc4b6671c0573caf173102beccb37e7619c0ef94868f82cac080fd75bfba635b52e3bbcebb208499ad71d0be252265aece1fa854b74bed89d629ee883b7463ad9e83903694625056669d6944281f24afb8971fc784bbda9fdcd0251059ad50c55aadc68cb35688b13da8a4af6cdd40f11660c520fbcf3e856ec1cf31880377b1ac65a547016d1841a7fa5c4bfe93445a61b6737b606e9c5bb140a72e81a75207387a7deb57c21ad8e5fdc2dbecdb99745495485ca5bc1b00ce093cc3211c14c2bb47b80b51b96f0e66d08e79b7d763665d3eaaa292cdc0e0bb80912b8665a7099359742246446a02d6b2c116d3585d084a2580794843c21313990429dcbc55bdef5feecda61de28c0c04211bf9f3dd92fb1985a38a37fe335080cf302e2e3408308fcdd5bfd2da4f2279155cfe699cd0ae8295559bd23004b071498a85fbe3db0b9ec600736e7f0b2f664ac83cadbe7bece883eb801feefb809e4f8d2958f735752ecb82c1dae13e432d4a45bb1e817008bbd1bc79c72bfed982775f8fc16845275c1a19c140a0b8875963a427439716917af20b38001f6569bb5a63a282b6cc499daea1947ae78a58d7262fcf34e3f216517c5e52f6312f66b78c8bcc7c0c651643105cd18dbaea78c3011229249b4fc32a802073704fe4d4bfa779159cb9d8f6f2f4cace04af508212d4edf5763d88905ca0c234d3193499d9442f7349fbdf1c919dfd9ef84b463d68a1e54dd27387998e809134e2b3b462e172f6af584711e0765572a2a11318505e3a2ff13dc39fc31d23ee05c4a4482dc7bd05610e73265228c3e11ed069b90b5dac09136336ccc1b1fa20829ff765c30c7d61e81776b1efd673ef1a4c858d4ea9fb748216da1ab56a11a01b32e1751067b19ad914ec5cacd47a8ace47d55ed4fea6266ceb1972c34b147ff8b1d35febd359601a073d815614f91d565401ed95bdce6cb7441dc301d0a9d1c45e6571bb08a208aa6f9d301fdf88bc16f1abbabb0853ed6ac64f713f2f1cd89c2f4f8594d6487d1f73c9ab7d14e1b630ca7cf45e6f829d002000000000000000000000000cfa69122ebf3db277efb83027ab3cb1363862099525fdd0edf427b9f32e94492049b8891eaa52ea38d8acd32742a737efb4b1140dcc4936c116b34e3f6a366bbc7738bd363fe63eb4f61ecf1287143dd6c7a476962084131cb0483b88d89c60b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009ff5dcab7431f82d540d89537f0946a34d9b774ec513188976d2cf465134bea047f02b54c6bb8bb8ad2b9d68645255968fc390d3bc72638b00b1d2bf3fcf83112fee3026cb974ca0b0bb112838b58a6bcb256027bfe0c1d3afe9389d09a100590f6932568917207e7bebc843430fe3adf9e5562be0d7e97c3626d3cc7a3041530203e11410eb80d746c2840c08967a31224918e1c0f700ff1cd55541a8e661fc000304246e7218a19331f42b8dcdea2e40ae6e693f988854aa4f5ddccfc1a0dfd4e00a003799b2de57da7035a73fb7c6d6f497fb29ab43d8f14c7e5eb307101d7a5da12d497f162cef439d061d905f38b5a557e482273c738817306c89d4851cf240e2030029007bf15adf2567e38c70ba209bb3f3c61fbf67a199d579a36782d186c1a70313240bf43523436f1dc15c32b70fd2150e605fa490240e654b28092ef66f9ad1021ba767603426934cffa09462732d1764c9f747036c6b9f412bd3b9568b2833fd032d05f200326f304a6ffc5e257b2d509c915e45ef3e6035852cfbbd7530521a8e02185f48de8a4367958822dbc7982964d077e4a035b552e6163303419fbf49f3a55981ff99e0eda771048af4a038bc932c2d0f86bd987517bb9ae94d040a904f38922c51864c81780df1a23441028bd456a9934e9bc895baab4b312b47f356eb0b1d2d42825732d0b8da044c192fa1164725a8411a5a15dd5a9d4db0217f79563aef37d5b8194b2c066935a586bd7ae681d9af3ddd3b59d9b4164a7f43f34be756a4e8811bc1cf4ca0bb56ef29a4911868c260871ddd561718dad995dc5833f0437c61dbb40a805ec19e07e5fdec12aa64b4b0a4e8c8279707ccca2e051fc9ebf8113ca009fd642e4ccd90a5329280c4a8a93765c6be8e8eba5f534747756f7bdda38130857e54c7d4180e6b1dc90a6713d483d0fa77974002e29b1d1ea4149fefed900347a7a9573f4da3b2f943686449d6ae50f8e2f23ea2bd56f0976d1b6394c502e99fc7ae3d0c4f92d0980d46a4e1a9f82defe3e271d3ca1e3d0477e31717b13613adf44a2a7f100f463420ca2c6164d7dd05cedcb710f749a5f76c2e0c6c2bb1b809b15d04eb462d9be53ae87fe1fccc9f9ecff03d3eb69fd2a8d8658c12cea7027be8a86fd84d3c66ad21bcdee665e1bbce94ccd1447f210e5dfad9a8699ebad77779281022ea9b0a60883d30f3ca9d83a4a8b4fd4cc75cb9b8f72bf656cb1edeece8a633b1ee1a75da8e8ffda1aff75c851ce7214a55635e85c8e6e48b49994733e6e47cde8eb579783124f0c3065dc39b11f97e1c844c14a3a763f73d565b4f84fd9fa428df2493bc9a303d937df1de384fee23749f599c32bbe4d5141c449a95a71758c488255a642c585d92dc9d58bbe1f65d3cef54157ea45a00ba978685f476e14445d87a9e68f08f16f8786e03956d9d0800db27a55a780dd4a018eef81e972dbbe47be7138e7d23e29601cef2fa1de11281cc7b4525eb454e8949da1a71032f78200abc414defaa87ae4e36cb125e911bade94973875d0dbe13a6a2da7a00d53ea39dc224bd56d25a0f1e56a81aebfcbb4810a2f50e09471715abfa89097d67655e1fb66cbb74b6b6a4f8c1fea7712c3d4b4bfc51def08749e83b091b76fa35abeeecdbc37c227cd57707ae11df382a55b510cc1b32191d5b3688fd89374248d697e500e539c9b6d84701720e3fe288ecad75885b8e808013ac771203494c02f87e1b65fd83e630c1cb9b06c7201324e9c9815bcf083fcc34e4456dc97df47bf3495bce1c72242f7db2ebe80aae67347b8879ca390a0405d713c9af04b51ed72e1e845ed6e7f90ea817fb69166c72ed677d2a7dd00918e7846624c28177de12b5f8fefbc1695abfd73bcf9fc243909e9bc91302e879d264d7cd30ead1e141c1f9a13d435ef92b29de4188a6dc329b5538f9ec77f27b70fb7bf03e32b8f8bf345cd44fddda75c5f0f4340eeb62528c86cfc23d624a4e8e2fcec174fca403686fcde281a7edf1f073613c278706458e073c9ecc2b5b942d38bfdc7777db1446c3ef9b2ef025458d3e0c4115c956d271f2737b9a343bf55ef0b713f28754b4cfc864a1fb30499f446789e127da0b4e1356f899c5b8e4e5c5e1dec2be00f9852cb8bef471740293203d704fbf54cf22ff2a906f0b582ed1ef5a36d2931cc51f56094da23808b813842f845e0eefb19c9b96d8d92fa9d59d8a610a9f924a2db8c6526017940619c4308612d216520f2c8927ad9eb0e6f6379c4635798bd765b72fdfc060832e63320f158b5b4a8d1da7ec0400000000000000000000000074ecb911ec13ead00d7733fe9cb84f434ec707f75565f6f5655171621469cbc64aa14ae7f2e9c4aae94eb11669993c8e55ed3c58f04207631ee81670c6079a0daf0fb1cd8d2f52d45f8b5abb0aa2c69955e9d54bda6418e1337fea368b698507000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005d7ad584ba52de6557e57367ead77a3e3f9703662242b96e91b48bf9c933f9aa0b4293e38750c3bf972357e656abe5fc5b376992021001c273d8d59de06e208ee639b3254169ed821b5e5f976f0da2f0831ede6f8e23621356fd49637ed289299e2bed43f030a69f60314bbdf8f47ca63c218403d2e7ae244f64165c85277e77030e4e8da29a8a33f382979443e3b3698a32e4a4429fe91b334613ae0968fa40eb030fe81660a3811b863290c58dc51513bd8b831b134a60f145b9b230ad306b3ce70b018fb34e64c977dc557f0fa40ffb91f0f16ce7b6251476fd3f15eba192ade14b2f6515c6b93e8673467351d1facd311393e6819fbcd761716bdc0324d42f9a8d031e0db017359204a8198479733d04ec202fa1b3130f50f25d6de7500434de5f2b0219c160367e7b96d751c164108adf05d7af415583c1d697a350fcd70c41058ce60206ab10d405c7e28a52a83c9cc60f695088d6fceeb88d4fbf6d54a9225ce678050201fa8b5764fc4d66ec9441846b64e3e9bb101e2921a91b0d0febb15bfd9c60bf022c7516e39220692fcb12ee43578e318488fe56290ecf885da2b8beef7fc3e3ba93d6aef194b2d61f7c6324760bd4e739f33ca5c0688374ec6adc0e2614d1a39b8a7418e9391d3215d1d9b4514c269b9c46a90e4a2ac994e986c47735183cea3bcb741f418d1330bd805a173e0b8cd64f76530ad43db9f2dadb8a237bc4cc1c257480d9301ace9df44d8e03d657568f993e450c5c76d442ad28f23cb021fc16a93d72e85f1af1da50ee279153b1295130feb66ce9a8afada609e03428dd03a18c44cc4c791b3cec250886ee8aa8929269f6ce1c7d5d9ead1c72946921fcb8dddd0897cb095a032ef0de5ed818ff6cb19149337b5d1def75e9bcd35f225542ecb22fe7417a8e6f9c0f933e91607263c9a99e10efd9013dce5c19398b2faf912a26b620398091ce68f1e8886a5f708f6007474e6911f99173f0984d0358f38515ab8d58d72865e95257281c24e5ce6b898d3e87e1ec883a7a7c25f0636e92647a24eb3cf7ecebf3bf0ec42e793a5e4371a63b19f00dc0def7e2101344060d92b12de7330300aad36708e64ff735a9dee0a66e735dadaadd57822724162856d77c05e354e1f904ca87ec4bccc24ac9bbdad9077ae9fba4fadfe891f3515f67c48c1aee9dd11dd8bbe751c12719c5d32a0cce414e23bd72f3c3cb48d0ccb827c0b872e296550dd9f5861bf6bd70aadf406a967e0e7fbaaf84ada26593dbf62e82a30151f8aeecdfb4d443dfa9d7f196f03c7640b1f617d3a28100889a5ac5b68a303e405201894bba1910cc1e92d119e9033e382e912f3f1fc9ee4ecf8220c19b01ad5c5de5b3444c8ee9ca031891274f3e17dc86b699a8026ebda9698fccb8dd9bfd2a7e4675f0b74ed4f79c6366be4770260856f03aa187fc494c8fae881f8d1f01035645747e560b04ed0452c0bd24decc50bfdfbf64f9b3a874435e899466d83b4fd598c3744cc2ad560ab5f37d008225cc84d6afe4bd1c0993f175e10a1cbe3061e24b815e794e22b8208e036d39b97e60d0dd0d529415037970dc13232708de19c6bb30597d399ce95ad3e4ea94063ca347721b3c64adacb044f116a9a8b99b850481a62a20e65e2a07c2ac580760430a40f005a613469f20a8d37749270f83c8afe29dbeed5420005e0d4f7b12d92533f8ba818c5e9e2e2fe4a91df2112b67e2f159cbe1db49f395b69f8b8f7d33045ef0a96dc364c11cc2919b08cf4f1bce9a494e131a18db962e964321fc7851615d63f4de9c62c7392e781bb970a8fca76eee7f475ce232cc8d10b53adb05fe34d3748e217015f60aa93b638f7b03044efe23499cb727f7e267d93c076477c5072d250ac13cad9312ae988b3c5c5d6ca101c7bb66fc97c3e848b2b964affd09d622d289bdac594e6a0f120e5593047c53c9af63a096fef60da24a9686ff6b3641995c42e827ea3bbc7e5a8cf8d517b7859f6b98c1af0163ce45150c4572c39005ccd6462d2ab73a448874e4be8d283842ce6f015aff10ee2f082c0c4d4bad9a047aee46bf86a5c8d680b3f88bac9d4c91201cd2e18e511b85d7159fa7e36b6bf797d67573260227d75e46f567143761e8f6384712b576ed887115c6a1c9c2233089234c02713624ba6c2b7d88ccc6c872181212ca1979fc853e852424f5cf2e33f7f4fb203bda01d19ddef3ec856860982f8ccc42a594d3a5b3d8974756b36eaa1fde703bebd40ab86d328b8a15d71f7abec7a5477a6b6bb880792968bf7a965b5fddc46239729474e53f36681c9631049cb0a45069ba48c982f8d51a018b58801c6da306a8d04c42ae401835a775f8d34cd1f75a9b70aab34a747c480725bcbd4e7d06c925c829c28ca66113f5c04e593e051749d0573c53bcfddb9d1c14fc057108", "6a635163", 2, -564800263, 0, "86eee12cd8433397671bece77beb312f1002d8576a4451c7de04b9ade1a8b723"], + ["b52c6a2a033d1425b0148dbcb8ae5bb2544a07c3c9d9b0be786469b90f27408d0b17f10a1600000000020063fffffffff0c027f56f4cc7aeb872e4465e8586a978bde3293fcd3b79ee8b73e9a18ee47b0200000004525253630e134e2f8ab98580b5ecce51899c9c1282028ac3e3b0523d4b32298b3790b14bbf18ebe903000000076a53636551005392776a8c04908413050000000005636a63650007c232030000000003ac5153846b1402000000000153d578040200000000075300525352656a0000000002000000000000000018a1f80100000000af769b41d950b8dbc56a2893fa610fd6520df6b734f07a0b607783fb8a1a32ff344eda042f4825ab130f4a2c12bcbc591eecad19bac652b2d6c912aa27727dfae93e7455fa2180bb1c0dd425665414f76cfd4789712e5f6801d17820dbe136170000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064ef40898d37aa2b129e9a15f74a788ebccfd23d45fc344a15fd2885669899f93aa87cd967570e0b402febed0455b2f08897a247084825a38cd7570edd7ca4470a6a0b626a56a5e663e1bb05d58b27623965c7f941a31d51f9a6c54fdebc738528b69026068b6adf7f125180d4f4dbaf6c39d131e7dde3b68f4e7ecdef2a167c0305c7ed998e26f0d695d96c2a17c5ac1d32bbb471df64ec1e188b73fa8376cb2403145ea0b54e265ee6621a5d24a5607a875387aa3bc13284788d8ee4dca344faf80a03f2f6ed7492593878412bd853051365b43c18a077ecee10791e6f7abc4043603fa080203efee48f24a81cbf2d35864fbfbf8d3187bf72da81a6d846d522112a032335db8ae513625cb73a4774b5d50445f98f35008c3d3e2fdaf3e4dbea42c6c1022f0656be2c9654991d9ad9e139cbc4eb6f8ddc8c06dece3f01f4210ea924b818030dca5827ba8c55534aff2adf13885487a4f74aa9d49c28ff8638dfd0438751bf0212ea895c19c0c58d0e494eeaaaff64def30bf0ce72a1598111a58e1f2842720c0219ee768e76ba8dc9546e56eb78c89607d9493f9747e7fadd0fe26dbe6f3fe0421bf215c258ecae35d2157b6ecd350e1d88a7fe6b7f409633896bcb140d925af8d290a09a3d1b3d4ae3e60a87c93b8e2a3f8f7e82a491e7823c9cca658dd1b70c128aeb60c5881639a36e0701bce475147f10e85091dff7ba82f572c467c71133cd3713843f446e25dc2a07503c49609b01d24592e1904f61f132664d8cb872b9b78740ad2b6a276a838a8bd439c5c776352bba66a7ca31960657137abaca952effa274b13287ff6a9dfaf6647dc870dd4316694a6ab597dd28d60b7225f2d32b8df664ed2ad55e3d183a0bf96a984441af0e74a7d5568fa67cf25e484d356fa7bef3453705435935b39e4189832e4bb1e28bf286df986be218811313ab69ae5a73ab7092e4453878dbc4f427d98bf80d94d18629335abcd27fda111ab12822ddad5d7a931cc40925660009a65f08764d4457c735dc7524ce1f35255b5c379bd087581759c3630e1849e600b8ecd3e3be6d8d1fb90b38b69c0e2de3699a9f16d963493b22f66476f6875780f7f626b48ea140dbb21020b3de5a1d09d3f042e1be3304619ee9bc62b6970654dbc42cc3eb645db5080268d10acda687b9bc7fe90b2e883f01d2e6146a6ebed79b6a6d57b28c3fe1a5160b746d9ff83cf5305a2a13a8d544f0bf7a84a49eb91d36d1be332e0a8484168ecf5d52272a80f95b98a3364464c7d57a99150b3023d2c22f6778587c79a4b0b5e16b6adfc1b875f27915ed12f66a1e5a0688c82e326542e858bb1adbd75dfc7a6f57a579722b1eb8db7742f083f1843a802f4c59d6981d8e1fa6e22b15bb433ecf32f917e0cd1972da85a6d7c13057df7771b721e47f187b2f6f46b8612b40da87d7d5f53b610bd17862807895fa465456754aff040319f63e01011562c831e76b756b97ae64ed1d8edc1de02c55c35675fad9527f5dcfe5ea4186ebf9611f5241578e6a9dc81221e6ae4b05e76335f11863dd05ee818368cebb0b966c52fed82f3045dd0b2165a03146614e9e65f7dc498e611a027d0023cb3e6d262e5259495b0f08633b6b9b6462be4785e397da802b7570dda76febeb6fc9762082da639b85814f7851cb134d77b7d203bfd0ed80edd292ac0be1d1b7453508fbe1e0a1471f5b8c0fda618a610862f45782e7d77778743c66845486f443622293feea20a6e9fe0415d3fa8782b695dfc52568352f0d15c833c2b72e88abfdf38f948c5a8846a61fcf17d06bf472929c41565de3668ae1dd978ad54269064c5ab715dd19507e4fbc91e4f0f5d5b71e031799755154c20d16c83e64f128dcee594f49da6db6fca769bae69c91719791d02cad0e7db09680b2fe10c14b21d2412cc95ba7294bfdd82b64b37f8925e52cc36d72cc514e4b0df9a36b8086baf355c18b0f8b2b121e2c141d11562ba351430000123dcc8c8375051427de9afd64b9db38c19b05ce3efdc74719f9aa013d252aca221c67b09caa782beba14cb82f8e85585949f53240c6320c6cd1ab997ac06c1e83fd26fc70f4c3f902b4d9db912d34a3681e5484076ee543926f0cb3b3a4db80387a457b72659c33c6a3d79f90ad5fc619c5c50a062dfb77f19eb2a5e9398ecf7eff033ce5ea2c5bf55e48ab10a32e0ec590ecc56a3f1f1ea83f71afd2f383f25a2d1d8904d5fb180c36ca1987e01de38f3acde5d607aed7552eae0a596c75524328c63d602026a082f4f82372bb3946f0000000000000000025c30c0500000000bdfc3b8e7905a70a6fe7a79c6858a624c04ab7d3435178fe6b38f83b1e3af8bfbc1275a3fc748f62ec38c371239f2bb2dd590a780d4ca3036b80b39c88115a213f9c8eb3a54708608dd102bce8774076a32e66e4488995c45f4753d057605e9a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000067b578f184ea433fc5c7124952a34b0f14ddc4c42bc3e74c4fc7c0e6a4c72a13ed0d6a1f928edaacd8e158d6cc6bd8d4230266d79ccbaffa14bf98a559d9551e461170e536712a0c8e23325decd439e0dc2cc514ba71713b50c9b7b67109921660c0cae0b7732ced3b8e114ea60ee953f0dee26c3bb8385ffb02821ed70d520e031c6790edc826660917d07113430ed86e5a7ae820e8fd7bfe379b57634960b1a4020d1b7f43ece669f32a96da265bb8505ef93dc8ded0b15ceaa33133c1d1c198b60a081daf709af4d4bcb1987ccaaf0170284d3901d1efd060d7922e747391379e121c2295a3dc86742355996d97c07c3768d2d35a80e602dd6607293204bec4a8b003021dc0f356f1bb5f3bf4c5595613151dc05d8e775c739b5a9750b1529465108e0302e4eed6ecc36f508b9d258bbb5ce8c93763ff120dbc50922d5fe07b6e75a711020a41ace7e881a149b0b831bfd7ee6ec6b3148e2a698d966dc8e96dedaefdbaa3022d53f2c33e2bd288f54be36f1ff444522f92776961c4cf84b993aa9128cbbf89020651e8d9df510a6329db607837d9df090ed9248d2c22f4622546de186314ce9edb721a2514bc34117b0fad90a18857a73f8cc851acda2e4f5db46cda092ecb7852a5aaa921c8acc6ce6c942a2c391101329986b28ad179060ca5db75c04f3b81f4876e51124659d4b2b2992ea276eb80e5a22c41bf87d9bc35be8cb1288a9fc9a5ce85c2cc92d1acb1eeded4e94c24365560c36a8b3d77257c4ff94ad3781d8bc93771f881daa2419b12c3d19f0e0b96bc79e015463ba5a4869a7cd5285551bdc93a8e70baef03c9ab1763408c25c309c64f7c529747b5247db62c94a7b34ccbbb34ebe932cb3a20966f0889440aed8179d6c5613bc6d5cfd18401d11f1edc0d69421b4b9b70439b0ccefd855324c17d293577c5e83a503237e75a0eb9ae2238b2e4bc88e7de3bd8a51de56811659d78d81d44638f4a75b7bc1e9e883d123c9bfe56f18f1b153584c563dfcda647b3c0110e21980cbe15a171b68bcb1c73c9252fa5059a9ee743ea4af5ac5b8457d7f741e28500cf590a9f102a6d500b4b6c8a991a246c5844060703557a87872beefe280cbc6b5f134ab91b4e5a241507a8a111e4d39d0a44b38089584aa7b3b9f6af42c1411f439777688b8ac67a15b446ad834199c0d6f5a83f48117e295fa290c8e4ac0bd59a27959faa5054c4959e58b430e7a701c09af0436803680b081b4b2268bf7c3b2c0c876a9f58b068656b0ed084b92899cdae5e46efaa6a06d8e3d194ca06c0d88ccfd78d9abde92b33bbe87aad023a5df78cd115666db0f6256aa886f3e7e35ba16bbf6ffdb149090a6c5d422b2fb51a4791700545e7cf32e8031d5b1b1b3a18b5ba60dab6d11bc4c24b2c0da28a469bd8ea9b36ff47b48471d70aaa8630b8e5022a2335da27fcab2e3cfefb47f80e970c6a6fa39006ff7c85506061facdb4f3b99284c3458afe6413f8a75056b0eb3b6b3defa54a496ac65ce8bb0201d2760adfa5f138bff074977aefd6e0722314bf629286bcdb1a677fd2dd2ff50e722e4dfc340a069b3fbf03f7f34feb80327af69c19f82fe33efc04e5d2d8f0207729d60df007ca784b64194ed2123a916ebf2a7df2af0a6f7475a4dc3e8c9328f2efc82bbfce2e320654138a8ccf3528806ba364a861f478c86d1fba4f358013bb836e68831a5d7138f4ffffcd17e90a3782af445f0d08ed99d1f5b527642f34dffa02c5c78b5af4628ab37974eb0039923219816c097bd3ac5c84b28ac0689763c942492f23041422eb20bfa474d9129fd62f08d1ee3581d0c157de89f2e00dbe869e9c9c8ccaf84e0380d061b3ef15bdbbd17f84226038bcd55daa8706727ee328c2398e1a60aecc6564b83da82b9e0092877dc077494cd0787745001e0cb6bcf3d9f1490b937838626220b74b14e6cc1f1582f621a23e686840f1fae0c1f9d5f57d8b3d46d1e93a4997381aaa91621199ab0d73e21041ae3556ca51f3324939be069935642b25f944398cc52894e5ba489a4994dee696c247741aa0372467dc5f034c72fe4fa0f40d07ffede8fdf00df1d46d8821a6a285bee97b1f0d93280ce77b60217cccd261ef0a52ee12ca174a189404ec66a1dab9781b00e1232bd8622056175f13092e1882ada4fc1974f2ed597ec7f22efd8e9b2a4f98e16f87ea87fd138d29dd8750ce8faaaf4d390e1914c53686e83192198e8c3299754df0ba396d6213820c6291c28ac1ce9a54c0018778ca40f22c1406c03a016fd930643434a98bdac2376475f8291594e40e013c1d5364254eaff8935521a3fa72afdd5a358dc602ccc48b49accc3320e64fc5757e94f393746ca402eacc4197150305d70877365399b1e7e93c663602684aa4a0dd77e73b54507bd956bb5aab5a54e1b009", "006353536a0063", 2, -852992176, 1537743641, "2e3c42985e6de31106d186818d8f652b4db1d42a224fc1aad1ba4c7b5c631b9b"], + ["030000807082c40301e4ae05eea4afe4e78cdbd6f0caca5709ef73b061a9782eb64333a4d26a55c5880100000000db4130e80158b5100200000000045253ac65aa5905a00000000000", "65636565", 0, 1270046897, 1537743641, "5560992104bac14912996a4a692dfb9bf168583819454407e865232d0ed6539b"], + ["50c23e52011b9ff0034b3550d0ad468c37ea249ba07ff0eaef88000292b74f9b4ce89f950e02000000066a0065006352b68de66801b9025b0200000000016ab93a9139020000000000000000b461e90300000000eefc8b1031a83133fc6f8a9341a0d0df1c30799e02f9050cac71dde7d6161c0e89212db12205912cf8ee52c4ac5871c391b7997f7c9186b6e4a00a10893eabd26a05dd3d297a22dc2c1446633f66fa9a6c67c646c23249e4abe50adb922d30de00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1a651aae9ebd8e1bc9b0f220bae5cbea35744ae70181484504554570362116e8d7b3abac066b7143f8105887702adeb1e36f40592a03e0e4654822903136b1d70bcc46cd452ff6b2240fbc9fa4301167f0e829877ead5257a1d2d589297a557451760f75fc3bb810c8c5f3b85dada254b113128d38565d11bdadaff8a6755d80314f5a21bc85921302468182ef499415b313813e1267966e9d24a2a5e4a884c0303181098a0edef6c70a7d0f8c7b0c3fba702776b9742e5f1158aa65fd2bb66bb4d0b02c9474f8a70672802976c700b2e20a36033dfea6bd1b217283a03d235012cabc1e4c149e21f486d72d39c9d4fa07cee11f512c85d5b0a23987e64bccf825418030dd61b6c619132cc14cb907184d0cd921d049c466b2254ea08b2e3d5c869e1680309046b70f2afd616c9eb2871edbedbc0cf631054d4f938bd7944f4b27c32f455031ca5908a67dcf61ef50fa36a5fdb40ec1741a6926bde6abab203ebad605cb66a02028d68ed8a3f52443d7280342be9d3a5af2fe28cdf4138cfe055125f2955a2f20317169557228f7e0aa2cf70288ad09eedb51f9f6477a1da9a1c83137c429cdddba9d87c0be63e0a329f20118e36250ce0088ac5f60228a12644fecbe8e92dcd47eaadc68b029241ec86e405bd1c4bab467e916445d6fe8cdba274073e2c60eb94d0d408366ced6d78af9a43582804c58039329bf1f99d74e13f1e760600c22156edf32d338b43c9fd9c644e709ee45a1ae33e279af4f8b14f0a9ac2c0d39190cea7448791ba4fbc86056470c36236161a3a7665c4ea75f654cd648a6f213ddc8a48381eab05d8b912cb8238e50b9b29b9622548db0dc24dc9718a2fcce20f16cd01315434e7a61fdaf595c29e63c8a7cee0aaa8a18a4a3c55d89627fbe54d041ff6593dab13771954b681c080c4117124d773a3d1f21d498c3c62fae29b1632cb4e924c9ae9bd8a516419cbe49e0685eda603b879cdb87748a5971155ec348b87f1f736a793a5f9377d4bf2b8f14211d9cfff478611b54af6dc206d80656b6ab10afb0bbc66d2ff9eefbee64db109bf3cc39511f27885678caaad6c2df808f142b59f9dac5ecabf36eb92869beeeb63aa50d1c3dbf847cdaec7ab98e14b3fa2f4ba5eb2e7840e30cee5591ba57b4ab163daab661cc72d3bfaa0b0fb826cfb485384b1f8f99cdc5c3b160eba1989ea024507ccf7773ffd7c58f4215b3c7be6eb6366138570183122a5e99c2c01203758ed6d39ed883fe313a455fdfdb2cce709649af0984c387c365d7d01e6afdf2596006790d3d4207241b7a7c15ca3b2e739144025d3514a5c98e7349ec3f478f2915f2d27ff2bd629085eb159d867557f941bce213fd5dece052239ca9d82c324707c42d711dbb3ccf4fd17ec43d24102330676e3e4d150de1f9a4607e521afe27ff3e334da6e91477c8a0d1e06c80d0ef1f083040c98cc65484a4bced464e1239ef2902e7c225ab9d9d04e024a25c23c6419973183b932c78223e2c7586598830717ab1b15ad6d5c434a5b89dcae0400375ab1f10d70f28284053786871133b147e5e70d86a662e1c16cbaaf1fb350ad214e593d20993c32eb80053ae3fa41a0c1c1fa7f818b6746eed6f499a421b00b90e689f81777ebf4ecdf9c5bb9343f2655c424894c9404f7cec6e11b1e7a55527396542d0629bacdb2dc45b2ad9d292b2051962522a0a8e923a99a8560edaecbb7fa6c34adb6bd32c1555d7528a7f6f8d37bbba363283d8f2321063052084ba06b221e32b06fbe3bc15984c50cced35bec0c4110997d7b0d08ddb7e8bee7f92f51364f685d725b8d7d8ce6f61f20c9aed0b452494e73cbd91fd1296960c5d5fe53bb669faff383eb25318abae418cf2c3cd16f252869234ed87d671cfbd460ea591019cae6acccc889d1289ed470d48b6c9921ff386ed700021b2c83acf6fc7e4ea3e23a8401643a098745be44f74f9c1552a68734fc1aa75a0cdc906d7edd0bdb19d80b8f856971c305c648e10e3f7d85fcb9ecb615ede35b2b8bd77b3302d6856a81986b041fc7fcae989276a6d822077068e23167a650b3719cdd379f0870fb05699db510a57305f4523234eb90c3691de4753a1d134c18e381d5ad017f9269986aac110060a296e134db54ba4639886cafee0ac52257443ff408812941fc00026ab5f43883722e3039d65b0c453db952be63701dfa2dd65bfe36f49e5d41fba86594bdda0cd54ce0f704a0262f012786af4dcfab652105d6b6464334b1f9a4abb908c8a8d128b249d43a6275c4b4b05458470000000000000000ca2c9004000000006cfff26e195b31befb46eb15322681de09415622c8db79a7b73f9914b3eee89530637a4352d81cf31709e3cb203fb8ed53eebc6fd72e77c71d44e2b39f046d85bbb166846d9c861c9e8229e6fec9b7b1ee4cdcaa79ae80cd16a3e9a30d11f01f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003caffb3e1e472f3affe39ace681d4a6d5f953ace2d145950b35aab5f1e201a83687425122969f0491d046523e5b06b7524cf67a93b99e3712637d267cfd1b63b51328062d392ebfbdee27dd306c96375d018fce26ee827a1699f128ec18bdc699703091078840d0b2cd51db5ab417d7373bba1f89e849ac81fd0ee79d902c35c02291dd5331e834fd4e17e0a666615d3571a1e72ec2701487a93186d86eba91fee0224a1503b82c4b60aed09ee427e4ed25a52ded8c6f1dd18bfaf86d03a930963200b0815eccc56da4129c38dcd3d33944cedeafba60d2f9340cba0326ab17cccf5704c9c542deb0b011bfea08bb5581b47e9eaafcaa4d7d486553877eef016b0920d0211e61fb46d23ba651787d2d38a5dafdeb548b20dcc7d3e0b6e909cb2d60d8a40021e3eaffc596db45177e80a26cf4670ed5204e67912d896895bc55dff5120e0cf0303be003311b0955164fde0ff52efddfd4170784aecd36c399211feab6bb0f94d030ad54a893e76d2ca5f35e00ff7437905f8b0a2029603f7cbdb545ecde5af7e87020fed1271ab7792a936b1280c0b2845d2b0a396c5de57b6c89adaa23c152a6c0eb4fa60679a45b2f01d945bbb99e68c4c0963652f9318737c69dccb8e1e4fc3e5709579a8f4c701c8c1f3cb689a265d0667773553c8641ed9fb916c427cf978f5b8bed22684ede79185ad9bc82137a12bbe6cf103824455db98f30ae554ae006f379de76abbd725facdc69fd28e5f094dfd9a4234706de72ec2d352f8462f4863459989f592ab1c4a074d65ac63e5e5d9b206478f90bb8a61febc87712ededb90f213935fa5cdec7e082d0165672892d9b334c59e4cce38efe12b85d7d6b37da0a66e6bd97b66a90a66dafcc6852b183456ff06779eb83dd10c65170b19afe4c300385b826367c540d0e5c6ddb722cd06b6fbe9e42419112d695eb89ad79161ecaef20e0f26e775ad1241c7d1387a36d9f475327cb616693b4156ca08e2834e538b373320aa8d12b318278ffffbbb9e956a1987782ad8837f6f7b77af1cd6b41678698dd81063aaa99fca16cc275c5e1986b936853e851378fda4e5c74bd17c93b272e0fdcaae667dc0efc323292aba1c95b98173f203bdd61217341d1b9bc726480d9e98e4b98aede63c163869438ec0523ae0dbc094bb141075aa3e9c8ec10345eae2d25ab0ca6831b3b303494ddabfe80df140c64673ef4e92e83804696c078e8634f07197ee4c28f3f18e6badfb1c89b95ce0a5667e53ed59e7186dae95ec57d0c0e323db2573b6be93a679f805c6fbd2c873ffd490b385da9e6613abd4b295028b65d30a9a9311646255d28cea091c4ce9eb7b2b2bd6a1cf4060c8220a8dd9eb4ba6bca3d3af38c811bc0ae84b399f0188ea200017e4243041e29f92858d8af6df71a7353a5759883370679dbb3e8136d82419584f80ebc9c999f5da64c8bbe3edb2ae6a55c63b290137b45295c6df015755d13c24be418cb8684c075a55a63382770aa3187042a7c94ca7b9b235cecf1adea37196323622e9144f362bdef473689a286cdfcf2095f4dcb9c2c2615f341cee30e75082407927a702d6f951994523c6665e054bfd978f2ff63af226531e744305860e7120c9a4f809f8de440e632f8ed06993b01540565004dc4ac953b5acf5bccfc2da8fadc01ec66fcdde5445757ddb8120ba567dc5de8241c6a9dfc13e88a9bc0a15c070e487ffa688e441f2a3c1a09c8c5a0dcb8dd070a4a4a5948a97853c9ba26d65bb98ef58e03792e04695f2d21c12c78bbae55f507909ed5d491bafa5a0d8942d51eda08dc433ed0d2f0e59217155d4a1bc6bbc80ba40ba9524a5a764d6bf0668fd1e371f1220011f096f58f90780d4597280e255d1ec8aae142637488d5e7d98c5fc60c7836f0663d6a41cd8c58e5ec5876cdc52f2d3f239d1bcfcc3952305317d82444a22dfee1e5057aeee5e44f825c2933946e33913a0d8b002765beeca34cbd1d1daa210a7cc14903fcfe51ff77f5cd96b1f9956c84469119d738aa1c99cf6e29ffe2b54ac785fec676743e46581450b87d65cf306a79391be93566a0d623694369d7945ce37ce0bb59584dfac838ee478b06d03cac454ff641526a5e31cf8f96ba6f1421f9e1d0a12002cafc84cc3b470d1f943b82447ef2cb840fc8bcf5fc5e1da982cd16e159ff7481fd6e4fad68868bd016d3691a814620fa1e2ccd7bc60f973c2e671a380359f0f6862c190c968ce69217401f6b2e6bc4b96ea199ea618266af3acc9f1ca1c3923720b4764126253622d66b1410fdb00ed7927b20f42e440d2479d49ab076403000cedb34c251c68e97431e990d922002c7ceab330e6674e08d4ca275337d679af62db9b3cabaf4947bbe21669f8f97dda982d6d8340569d6fe62691dfab6f51a4f7b616d08359eb1d6aa5256f04", "630063516a6a65", 0, 1570969214, 1537743641, "65b7113864d3245ca36cc637155c114c820b0bfe01ca4272f28f4db058582644"], + ["030000807082c40301c04861e316c8351ab1ae7a8e737f1718cb33d4a2ec0a5a1dd0cb6d786839a21f03000000026551568a12ae040b10ac040000000004516565525c06f90200000000055252655163002c5b0200000000036a5352ef080601000000000665ac516aac65000000001172e3e001f6c88b0500000000000000000000000046de8444a31bfca39659b06d44538dc99844710f7a8ee3b32287f1f24e658eec1c0443b6df34ce9bfb5195a82008b320482a26a642b9725a670ba3f47ce7256a380f523cf6fcab20a760ae24efcfa84493143f7dc37a4b4644bdf8b85988ea3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a54660e3184d52bcf3d0479de9e5c8b933ede89f2978e28b81e9cf08d24c9e4597a463f0125df82f78227fea09528b7cb1df544ec3a50e3cb9ef44ad3fc652118f5d3ebd67642f71fa38d5e3fda400425cb5dd3a5dcfc8b199b872187ae03a3bf0384238e35dea7a4295e6501e693026ea659c3cdfd3c490eae53499f4c3290803038fed4aa4b12c29bf540389480c6f465e473647c241baa7cd6985810f31d2cb032672561b3958754e55729dc422e547062c83a9e8b258634c861a06b6438c927c0a07967c0db4ad0bbb25c0d043c269bccb6d2ec0ff9769fd6017a868b391304e4d484b1b6b9009d53274b8834fb915aee3100918393470ba0eb90dbb15232157ce032ec57e8132f2d474903a19d4351c83a32c43a992cbeddf64748759f62dd4cd430321debf5e09975b99cc4a52a8fb7802451ad46bcd32c0b8a6820408e89e5f73f902294d72dd73e4c146d5030f6ca3d1cc7d253a1258fff67baa60bfb2dafe90fde00216e421a76d62b72a31863a2f009047431567bbf31eee777546de0d3e0ccdabe9030554e3756dd493d2687f6573bbaebb391dc31861bc680d28dfef982f32331063ab0690e132edc74bc21ce62f6f59cbd0b256faf173157d67f680b828b3c663250a26b0c89de7306b7c627cd4b50073d1f0d8b014fe7bfa64dc2fbab395a9194a8f2f83dc8b0a1dd599ba62fddb0f1dc78f6b8bed4f22b2dfdba42bb2943ff75294b3b243c31dbc4c02e6783986a303dcad72279ba68e2fcecc0aafcb4f8e7e8ee5e394b1c29a0868b206b80c2c2ecd5f91a0c4685e738be67ec555a20f3ee68031675ea2b2fab753924ebd2f7826e27c9760e0beb34d5e45b000ec142ad029381af1c51392252423c90126b228a1769417ff4ed9c4c8235c332ef3ae95b3d1f6358fcff0dd1c535864378b6f9abc3f1b0cf038f3a6ddaf4d08f3f650a46b00c05b9699c590fa4fc5833d6632fc6c526a3092218021720fc84cee22b65ab50a52c8ff3497ead910884deb72c6d355a48a788c37a1f9c761113aad75863a879bdc891d954ff0649894ddb3c2461a440a8429e0b7e604313bb6da4a40575e6dad70693bbc125bf0dd8ccbb02b2f095077774a38c8d769484f5364077f8b96a07a30b2fd4cda1273972b43dd1491af9e0b9e0003e063c2febc8505884fc24fd8e849c922cfc521c936a3506d2ea797604ec146f0d46a2060abac0ce220ae181c4a2693e9cef8885601b11c0a3be62b3ee7e5984e4e5b281643ac2524913e3d93b05deefdc91c1a1aeeb78de898178d95270b20c44ec9f3d650ac879988d5d0e391cc767fe102c1d6f881c16881df011690bfc2f209b44fd18bfc63e97ae7ec2b82b333fd44a3e0b377a78ec4a3ddf5cd74ea7c2ad73b8f2226b3e021aad3712c7caf2ebbd79fa3111c142909e4fc1f25f020632aaca06c289b6ee2eca5f9059d6712fff5a38c72329605bd66a44417db3b51c5822d1c04851c5f489489ddb4cd27a5bc3e19b1e6edb42da0eb48f7d33f9eedbedf12ab853628d2c69b8326bbef81d7b48f158a11754e7da88e7ae0baa240441deed87970aeaa4baaa977ef9e72d641c1bb97a83ab6c6a836d105a61918a65fe08496031891a3b3d86b7ea4885833b0c107a863dea5d556a782a49972b600dc647d17e1a25757ea4b179f04229a29b94a699428a0b8190f22c9df3fec6f029a1c7cf78372a2c75e328153d3d6cbac826fa132773a4d06b2946e052d11c41d9bbf68617f0d6273918307dd35599d1f6dda0414b6c430118685bd979b7d85eb236a91efd0aaa6ebbb65ef34a253a5e863176a427ad36d7feae1cb9779f5b773949fa3c94b7762e962fabed4674475a90060118c1fae6ebef5b486c1629f0c77a72bd75fc604797005d24ce13183b94691ba1d725b70260451cac373a39335e9c1e29ff9862892f54e2e0ce81c8632f04d9ad4d8389805293c20e7e6dd4ebd0421bae045e58853e2d767496012bef3e073a3fdec0d7ed9dd85a531fef7f3afe96baa4154c992a0c6c6ed601a5f89e3e2ad60a99fb9f000ec1e755e564592fa62846ed6cdac24664ab2e9a3203b31cc166169cde5aa75a3778b8b809f1abf32d0e08ab4c3ad1c4d10c0edb6b860947ed88faa705ca9ae0b5444eb62928781652ffdcefc55af69987a0b23ac9182fc2edcaf2c08b0e60ace0d2b5547ab0aca1c58bdfc781b7bb0733651ac1b776875e32b0247e47fba190a7b61d36533443ea55b0beb2d96dc58ce62dbd2df5d20cc3e1fed902df099753d049e0af93f562a3199f4b727b059b5bf26eb876289a1aee96c34269a9a7fb97e3a5c47980dad10704b21ebfb4f5d9b330daa97d5af29324d8133d4222ee9f3790268acc8f68f48347823c7c748bc9c009d7e033ea1647f8dff707e5a91cf43795bbcad0aeb304de237390604", "5153535365006aac", 0, -150717590, 0, "5b5ef5d9939abfad9ea5218b6d831360f80616cc21f9c42f3c6de12bfeffade3"], + ["030000807082c403030245f922ac454436f685f11926918c0ebea801cff31ede78086e85871d4929e200000000085163535263650000ffffffff3d6ef9d379087b58d527ad689ff966f930ba4a4696d6e379b84e07f2758315810000000007636a5100656563ffffffff9486974044b51945e41ff35ec62f7a3f8c88d3fc77006961c978c3e599de4bd602000000086300525253000065ffffffff0311d60c00000000000900ac00636aac6352651aab7601000000000453656a0030679b020000000003acac00000000000000000003eb070a010000000000000000000000009ae00aaf4c839ee8215f273f685ae732c5ac09c963fbccd743ceabd3edee769b937cd802e0f6fe85a9e52b40ed91baf13338605e9591778e4c410369a0c51afdf226591e0dc8ff410ee9747773d767236468a3bb71b92aa4fa8bc99d3b3ba00b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a6b26e3077af40190458f21dc0e18f3356c4157429d67b9cb62c31c9d6aa5ada1e462f440c491ca40a402581fe1909bee37a16123e2d716ab9dd81bd615adb7418bc90b32637b9ed56654fda86630bb415fb5cea11dce6d1f74b233be78029bdfbd24d258e050479bf9745b9e0e83086ee5cfa5e43f3beb52c1e8fb9e68c11f020151bfa7518952c7e599d5679cb92304f37dd1d6224e9a4cda2bd8b5c42bb0c00225a9fe453adc7c7d056c6fd413540fc74c9a074ac827330f9f197c17a82691820a013890254aebc364bfd0b40825b7b7d9de8477524afc88bfc8ed7718e152e0ee166b75b8265e7fc152243cccab8bcacfc09cc653caa4c07d690c53b053c5374f032d9188d881cb9a27a7ac191b44815222a9c338db695d04732a424e2878cfa6240312850a311191741b2ca13b767c9693692e3e8541062d3a7d170051eddcc42b8b02159578cfc62fdf4dafd968f3cce9769aa9d47efda889dbe00ea6a1d294abb6d403237dbad5b726c10f89bd80a9c8e99e3a3bd6ace37ecc2d81f8d77a6b2222d6740311ddd5442df1b97f5552547ed4e7b0fd59eac0dff542913925ede151bf96d39a28b6f49a19f361a4474de669cb5cd11a8f77a16431207aae37c49a05114a272a6334ff70e14e9f56099b07c1a1b70557079311637b85461a77f26c8a7181bc5c9876a029d9041e382066fb6cb9e8a4ba5b3aff6a7e350def760c7677de170388f5c0799b87496efcc26151353366984fd5c236c9578c20f38591219680fb43a74aa285e95c3033eeb0391a5f023550ffb907515306750a8c1c9d054c7cb061edacb204dce8bb60e8335790e02aaee62c95bf3ee1e8740fb75c021d968ae0c3cd6a8862934534380cf733b26ef698076f4fb0639328fbe977545a61c8c0dd4fa63fe8ac0aa47a2044f24ffdb057ccff5e4133c5ced9e2285e326f7928f7060138c0038bc61085d45e4b5f3b7fa5ee8ec9160d90822f9cdad524020c40fd54ef9a78a8d0088cfdb584fcb483ee022bfa37829db09856a3954574be7ff9f98c69cfa889bf60efe2bbb94de46ed7f61bf39488d3bff46ccd83fb3be6c85f0b50b3ddcb179b4071c04cf609c2b3378242935d6ec4df82986341322d3d5acd04e0ed26b1e5073d6d73dd45e001eab2c831e678d2da7feb75547f037287d70881129fa9ad5c843e490b85fd79ffeb86ecc089028b594b94392b77c8d7a85211b50052132e391646b07b5e94247923f7b3a398fdd9814c7589446da91b4ba3ac0f8c1b79f3b01ce47507e463141779bdb11fc51f3fa2c7b762f1e4286ccc855494ee10670417336a749a128b11770e51193b0f4bd68eb8f2ef69028cd1a87914bf7588c84c832dfc1675e815b30e102e09694d45d128ab6a01196b97c0dee6e6a20b75b487ad1882cae0c457dcbed0e7ae45f57958da044ce2aa255fa91e2dc55eb9728da36f4ff812b4b2ebb932467022a5ee89adf987fb7adac1c7e018faed12a9b893332fa946bc48f5d4c20a1c93b7565b4c0878ffa5cb8a4c82f2bd83de4954a4d652053089087a646aa1406f9c79676ccab63e318a956b98553ec22d01a897f53199b84ee371df86f1a33a90a295351c6f7110811de3f898f0ad7c958e8b325aa7676be5acaad72de10df94becdc6151e0b47d168bef2e1676130dbb14a52573dae2f87a082b2975f8bad7c339fc63fcad3f616caeaf4a6294957b6810a22b4e451a9f26ecc556a5529acce79c59b69846ea175e3e4139d46f6b110735bb6dbaa7ea32a6fadd48742343328debb8d8894097d37bb895bd2b9f248d95a9d08b539174343a88e2192ea07b03336fbd1d168980f191834233ee11494ef96991ddd159adade1e033614917f053f43b34f67e53756eb6d361beb682fe697ec3dfb335e22334f94b9f82c97474cbb81f5515d88a1691a6d8e77d2ae4ec506703be5e899d7739ec15d4d873c3b4b50bf418cad993b1d1a2cb6112efce9ca70aba70932f6970949c7654819e1ca60f2b657932fc03b5b02ffd381db2bb508abacec759359547697cc82faae7aa05b90c8b5ef4eefa7f0bef90fc912683b6331497b33bafdbdf01fc78076a5d57f66f53650df6a9d9aafc8c42a7f1aa183b17946e1af9390e1f44f5a1a8077bea1998a29453fb5a98190871d0fbc52c1eeb4921c481bb93c17dc51e4ce5d72b72ee38f6f8acc65592b4cce39e6d8320b0bc27f7d7d684a0e3c83591d1ed97d85af68aef2b5a0c74892d0e3fc13415db8bb974eb3118f6a2a8921cfaeb0975151bb22baf1dba01e50a497909c214000000000000000000000000003f88f94e0cac5eb6746292fd411dab3b4885e7c9fb511f944273375d1e99d2461db5c675e6696443d3b77064288918061b033c71992a5d7579e2b3607de86a6d20d362ae071f38ca7255d97b7cc9a5683af413dadcaa27225284dcbe700da4ab0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021aa4d47c0d4cfa48f4e3e9d8ef41fef2032f698911ddda307cfcac323ba707bb0bc5273f7fb4e4afe5e72bcc1fe8d378d4d7dc0982f213dd06621dfd814301f0e13e963503ae5f42b1a2395b5505a0b8ff9246b244127f93bb5572a887fa154abf74bd788b04f539a7682b1483d371d0e686fad714eac9fe73109acef421dd7032f87336c7202dc693ae997c6cb7b7abbc997e4047cd2fd3c4be9af7a42dd356d021b8010ec405de41a4658d232eafc872b18c58fd28e6594e4e8e72a926cf35e950a06c7beb25a142fdf71554dc2b1df895b52806eb2528a8e7d3b7fce95b35a0d2752bbe498d6c2a62567273bde02c20fec0218d05508e67dd2c8d8ead33e289db10326fb78502e050013e2ae2cdb1fc08e4414fb937d165fa9b407bf09e20fb67905020e1266b01f4ee89eec217b4bcddc193a80f39825a534b577f2469165e7a2ede30208b695451ffc045d2bd02b46b0d1577c82ad22fe1fdfb90d90d187b6e11978030300f3e9b1c2229f70526067c90a133d54e039c7e56defe451d8a677dc69237e7f022c2053753989906a9dddc0d1b08361ed37bb969227edc4d3e9b58603c1fd2d4bd4fac9be6e257b5add330f45c3e181ed68514b221fa6d84d2bdd7288ca8614bdb7edd2e3a83e3955934710526268512c691f86d5326c42216b3f08471c11716ee090b71e6548ecdb035dd82a1e1eb1552e196a0971b16346dc931e10ef8caa2125767300e6bba475b5f58756cf9078a9e19600225460b9e4df0765e65461ee8af065488d2295a9f1e2689ef1a86061e42fa33b967a5f0894b2333e5338698489520df3575117a6606fd38eb7512dc48c49b254716fad1f93f26ffb9f9c552fa73768bc0f8a65b94f5b89ee7365b313b04f675d1d730414af409e8339b178fb5837154d06ffd5c6d191e91eb77be1407053ec8e9729d27e67865d957b605b921d1e7a46c88c0d350955d51907a5ababa8079d105b60cb80249e95fdb0a0f09600c9590bcc2a188df763a3e81066d32a302df20ced1e11a7d459778a4f4327377f9330e8a81154d11b3d2f5688ba433b9ee8604abad13119fb9ee4f7b6e41bf817a1e922a2bafdd6431aee4d04fe7fd3d3ecaca02a3f2817c538bc501fb3a4e47733c58d157bbc0cb12edb7c823b95b6acc7db2027d1c23736224486e6a9e8faef8a91d9d3aac1e0767d2f066fffe76011054ca4d3e020e312bf295946ef8605edd35abcfab0e106903e2742e1006542ace0416965c4de3ca732fef7c5ab3c045b4fa2401719065dc4e15bf42eadc337f1da778bfc53e25a8ce8cb8b85e90a2db1601522a22d34da89905c44107408aef5b239c20df33bb36902cc262d4efde97b63eda9c933644f3ce7f42b52f089aa7bd12b659ca65bd86d2fc49f2e87f7f0518bcfdb7756a8f489cf869dd7ff38d7d6f42b3192e1d9ee3ac059abd657103b0bef16e2725902c9c2b9a479800b5b4be7a01d52bfea510de0ab0a0cfacfe0d31981cb07b91123110b5c621909103f57f806eb2695860b7cda8609238b2e23219ed59b24b5031fa8e38b17462630b177593410adf9360bfadc24ae5fa7670063fd1e353a93e3d32cfa2811b49b33e79240ef4d6b6f2d3bc9198f23998fc35c2ac98c45dfcbb22248405e51e40d9e8852489f414eb0ce03c6a6f7121c4c772fab4d619cc731cd1ee585885d4b93775ae9f7b2e7bf3352dc96f62cc0a8a7ce1994e4cfcba58a550ea9c030c56e3f59722756389693b3db222afa79a99c9bafba82f190192c7d3d446eef24846614a48590fd04c0805ae4b2fef32aa1bfc1d183dfece19ac366931731405fe2b0b14494570b86acb5c7f291af8dd1143e1d9c6f3e47f6520c219eee2d4f87dbacf0d7f81e263a5f61088622d3cf710700512995e80c8b8f64272432fc8ab8664b1dee6caee447d74d428738a47180cff2644694fd542f7073db39cad8843548fee72eee52b347e7c51710d6c901be3b2cb35ea6aa42f0f71ffc95f085c36f6f08ed2202ed03fa74a167bd1a50b9e7158cad179dbfd444f50b2fef574f792acfc7b815086d3e3b03d7e29ab6661e862129a8f31a8f26802c2b88111d7741697cb0db9808303e103a148897944651d14032e8fd0163aaba3f552f061a5acc79d08200e3d581f7c7b8a1a377f0dce3a1fe95704e6499311f6d0fba745e200efbee335fec02d5fe1d411c035964c6a7d2e9b752a5f18202f6147b84d7ed517b0b89615c0947724d0b65b44f0952850891b15dd73e1f766bac0dc0cb5bdf9b1d4c89af1326f7a18fdda9000000000000000099990103000000003b0ff05a110db31d7e77b943088fa7e7c99d8a87361dd2f38ff26807fa82fdd8f696f94e65e1ac46cdee24c64ada8d8881ee40a061b4bc9a9eb44d600cb4e558d461cbd76724a0af2ae1f7d5afcbc2ef5134c7f57889271d7862daa3dc76b8ff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b4d30a9c5a2d487d7be24abdc7211d27d0c0ef5439ccf240c451571d9ab55961bf1b3b6170b556cd9c2ffd60b6120c20d3cb7cb3e3df9b14542cc280f9624010102eaaf8c32fa45a69fc4472197a70e23eda68768e317274022947b3764b6df8cb4128f351f480fdaed4a1d08c2145ab009f81b397f4925c09af10372432fa5602132ad51b67b4bcaffbfdd6fd1229e586c84379b7086f2ddf787eb6379fe8c22e03167d330bbfd4df3416fba887b776f3017a78d2d5b207126a426857804d5adc2e0b01401670e2d466c1de960cdb75765c17bbceaa8e5e1334de8889240e67233e6c2cee21b9adbcd4806c259b5dd3e933f7a75af080ac8bcc6349fe0cc86d7642230226b0b3c2a2105caec234302145267062750e297b5ae1993e0a62338c9b8fe34002082a030391ef3cb5afcbb6b0ca5e5b52cb9ec1c57ffb69880dd3407459fea48703137ce5b9bbabd7430b7be0811be546730b59f2f8dab6efbfef939a5b65ed66cc030d79c3fd9eb6b68724ec55c80cbf0dac9397fa7adfadc0b980ff9c77203c456503126d9a6be9c2dad7b0ceee9566cb72368ae77b37674f0135051c63240efc304ce36a9728cc0a1c756e85a975922c5dcbdae69b2892f88b48798bbb9455fcc54adc517aab17fea992be57928f96031af03d0d147aa733bf812cbf94c5419d4fda4f23a8236d8f930be4e88c3fe3013ee8a5ba69b92a013bd0e99778fb98fb7568c6fa1cefded53bc82cac3c00908ab81cb35d825ebca2662556b1ae3749ff668c338a8d2764b3bac920319c32d1a24fbc439a14c04c4696ec0d21f5ac755255a1b2a3572fc4aa2fae775bf848d59c9f420d283c992ca66c5add47f44e18ef82b9b62f513217342f070abbea95c1ffadda137f0d731dbc73a42f3fa2ffdc4b79d30e9deeba95fdd559c4ef59ac75085b35a268413abeda2a2c9aaf8ec54cbaa216fbd72489c7cef9a76e976d6902bfa1dd8f94def8fe2de8ba5cc6ac853b409ef7f9f913e64848cd63bbcfba676461a70b15feb7419b4006036665853bf79f49d0f3f9a602c83a1842f271615174ff810e75b8a14ba4c9de3c24802a6d733f20c73f99512fd53857ad4c86562a0395799bd5d2626569db8788cd3422f196d7dc362fd774b8e5f43b01ef540e035306945b97990c8349b9d5a3e72ed9be33254a7803a9d84719fc97e935825603042b70023686e08fa1ffce5f590907b934db6c01f888b11cd27750c3f407bf51856fee8f125c7eeadc26b0b09c23d1dc58e8f46d0189b5db370d9e1dee4cbdf1f13fe5b8a5862922fb160a8d14fc40f1ebb70afa82ab06c784f7ea8adbceb52d3d285a1e28195c91705214aa44e3832852d9c2d58cbf7677894bf7d9e56cae14fb4c224397a0f23da5a123b0b4d3a8be586211b846a30e3d485c0ae76cfa9e47123cb49b5037c9fd400af41b528be068a212589e6cbb3298032db1463181e780514a23530225172923f2fcafa3651064fe72b04a4d190ce47f988e4c5bc42a9281eadbbd75535bea68bb1fa840f983091b3f220035109e80178021bbf329a585073db6aa72fabb4a8c74e79a9c538145b61f04d64e5eae6e0867d4af84228eea4be151f702b945da2492479f045d63b16eb63201f131d0be5084ae3b40c6ee6fdebdd1daf39adc467788e42503416bbb19826c4c1ed0b0ae0d8379bfdb3969fa6912cd61056a67294b39ecee6f1867a3edc5f661c9f3a41009720d6978eb0b5b0cbde5949cf88020ce06f0b749eea89f340a1b2cf353e3140ff9dc1951658725ec91763ab44f188264f63e03952078175499d7fdde2b4e5509b2488083b07bae45e0e6ce4e29492da4353f726cc1e634a8d12f3d4ca60cf648d08acb2b766aa2e9c6df5b0e7f1ab4cc8fe0cdf7146e2c1c7945f15710804a51ec300f6cbbb2dfe4575104dd95cd978619e9c337244f302ec43d4d2c2dc60a5ff59c1cc3928f630555dd1d1969d7bf35edced25b90f3255baafa4862c2f47027b11b55515c6850cdd4e1ddfebc1f9d014465a766253d772f8547e0f5356c827f0b5cfa411a1a7a54fcf994d63ac5dcfc3987ce81aea6ed1924973a85a768bdcda9fdfe27d7455dd1301b3c9593e07739c5194490f6939daa4fd08660a2bc3114122430feadb7336a3795e85351483f5d984beedb8156b94ff38e05e2dfca9df5adc4b89425b54bc05d944a58bcc0dcdbb89ee9a91c9674105fa82c74461a8285ac7f8189a1d06d0db4721432221d2312201b5115f32f7cc6d66b62dd37f9805e20dc0bae929d777c66c9b390463861f81d69952828d52bd98c24e1e5620597e8dc2e7fa278fdc5fc4d1051bf22f63da40e340c880045ac2838759cae9190d832bc490ee70dddad2a7e5094221f385a145906a9f4a5fff3def54d368625f8f2fe845145bbe997ff1a82d4a2430e", "53ac", 1, -471772630, 1537743641, "776b5e94880708f433d5b605972c4f6d0b37e204a4dde644547900e3d4378f9a"], + ["030000807082c40304b38aea5354edee912e1aca741bc7009c35c1be5a6c467f635629f527a200719c0000000000fba75fbc67e23a76edeee827b06e06da0867b39aacb174039318926ea1a81b456fe38aea00000000026363ffffffff4feef7fde8f8e1f57908d6fa361677f03682ada8888f4fd68da21bd84cc29fec0200000006655163530051ffffffff45a3f095c36a1be40fd9f3dbf2d78ce66eaea83e8401386eb1229c91d1664c8603000000035151513b31022f030849d100000000000351526521367702000000000665536aacac006d6963000000000004656300ac676fa15d0000000002f02a990500000000000000000000000003c7dacf6a62d2214fb9d6cf380760dc9767e33d367a7ac10f02540b1fd218104058c23dbdaf9515a96da1ae7a5e945a3faa4955419bcf6a625a3e35607a0d6243dac96c50ea2142070b63cce7ae9033fc15a7fc76dbf62dcffef76b483ccdeb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001cf4329654e76e4a62686fb3930349f1d75ff7fe10af9fa9f90d984e537f83b672a89ae6e41ae6ad2360051b1e5f5116a5cf43b15e96381e9130adaab360cd66f830bebc7ba69d6cd038625be3a1e47d2d595368e9378688b508fcd7b34652466709e50baf383960db494d48eae5ac6ba95cf925d87fe216b128f42ceff4714e021afaaa21759d8d1f8a7ddef4e07d537a16a1571d1840a730620b3deb33d584b9021e5dbdde7ae3f40d58be55f12283d76341c60c6fd431620e768a4afce665433c0b07d1e1aecd6959e3d531971eef4ea360110dcf466a530519b624f81e12d53effa2c92b8ef4d081e2e4aa1dae56e8e13d9186e89f19eb9a5e8907d9d75f757ed2030ce7fc67e50b53bc40adab8e7d7b8e104ebabe05c49bab685677f06e62c0930e02131576fe7acccb1db5b2e2324b6cb9607a8b600026a677e79e6458adb3cd55a8022ee0d5e715e451f528e0136eba8196a55e6fb5e82f3c56a8c220dc2eb8a4dfba022f066c02d6e60720f80b254a3e4068de976088a0c19464d32becaf9a86957e6b020e595e5de6be55316aa99aa2e29c11bbe06960fb91ef8850711d277ddfd0c7a8434da77bedd4344709266ea9421a5ed9a00533d5e2b4e4aa7a86a635a25e6348ac60f128cdd6638f9ee4b10b4c0f3c1666d51b1a93c756c3e90535e3c6efdc673fe0533d8601501c66399c6c96bfbaf4d434f19e5b7f0107f42d3321277df494c858ee812f2b152ad6f3ab78bfaedf3c1f0a51613f97e551fb0d9150f874293f9d039dc95ca466c3154a00dccf6c3dc1d08d3b66ad81f49c58e89155d33790a1d31431faed392f153ed8f38147c5988ded8c4b478d51bd0daa7f298272e7e3a374dfb302265c520034c9db9b4f3ea1b425d144c0110d6c31ee13a09de9d611da02c42c7644058313179ebc9d47bade60abc8250e6faff2b4c2fd83ed572db3e6007b782978c337847800af706a45d0078337439b82faf4294c293a741d530b66bb5768eec63e2c99d2ed7694ff2cb711ea4a8a774e5502d6943f6f5d91eee15b3901d8d8dbcb7d9acac685bb74560f4cee27df5beaa0991e9bea20fe68079d39c50334e4ede3064222df36d3cbb9558e98d0b3296c3115805bf8faa12169b674cc93ba57409f810ec4826fb8a78fbc604262c302c7e617f1f826f7baf75d2a7ae6debbc422ca5458966d3df55a2f06ef744e238f0c587fd645c1adfe7eb9f0aa57da6acd4692bd63e874f5d7f60cee161fe47e411ee94b69e83fbcc564569ced900960e6f6e84fd6a423b8cf6923e139f73e173aa203c4ac8269a4d4f486c53a69e7f4abba03b0a7c7583d7398bfdb5a406b31d5203ae1db10dfaaab13adca7dc301c4b50581452cff09d0c0028bb717bb8d476682b67c4d03ae6f414d829258581edd00a7de350624693915a3c688d069337220553b16c510631da588df0bd69e28ba7e506aff480e550a0511307cd7a296c549d85930259a28e5706518ff59c37b16df620403d91b17a6708b4d9589277d59c38cbe8ca84798c5eb70936ce725316d29c960d59bef45265bdadd44aa47b016129ada1da3144d3eb175155592c7f43931c01f3df9821b33cb36679d71a7e2be59854c7ab9d9137699795fd5f6bf46e21f3ecb0b26f09053e06f2cd8273290c944b6c2baaa75feb33adefa857a5da0e7bf233fdd72483cc5bbfa1a39b404efdd9fc183518e57c860f2cfcfbc6ce61c48cd33eb898f0696100072dccf99f8e22926b0c584ccfc4864727cd3d1a48b774bfdecf02271a58a0589250fb66114318540382b1b15793cf8efe79115fe54023b410e278966161a9df768aff561736f2614afdc19a1637d026e6681e6c9d2126cee81ec72831d2482b95327040a2e324b83485c818da1a19e42ef8436568c22b46969f0e4eef1d0fbb6b1762e98fcc234e51590ae4ede6fb6d5ed5eb91162f242f98a69a84bd984dede1295f511d3a81a26cb0f0b45f4cd354772adb71be7f5bc8bff7d2c6f62b355c39e8cfa412a777094f20de1e6d0839b456c1ce7596dd56855709900b3883722b0b88325c5be2181b13bfbac1c618d6038388a7cd5d82cedd74b80931ead33622ae64abc12bfa01e2172c3e2908e36e82f7cc0c8df10b02054e6ae43a565793a62adb0632fb04c5c0fbf8859d65bf7d611bf577b2c7dbad68660048ca5f562eda7f1f085faaa2ff9019b8b77001c009abdd6855df78d7bed19f74c6de3e3e97041d169a43d8f2441e969c831e38c1e4ffd25a009e93d85fbc631b9a29960d4d12a4a3ebcb5315a4754a3010000000000000000000000002c68df9a6ea06afdade977623ac73ee532371d13c56270c5ac9dafc7a4f4b3e447295d290f3a2d5254273fe8c82f2ee1e130e2909f9f440008dd03c3cb2ed4e71af3faa0b02df8ef81680baed3faf2f24b9d98c14a34a4406d81f9588f2f77ce000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fa945660af53491a349e5f466c12d0949dc9c854ec939e4e8caba56ceccfdeb5a48fb14b93fc25145fc1e5c367e350e27927b457fd8a7e957c670392c0b9f2cee40dcfe35573334fd8df79a2e49ef22da0bd559c8ef5df3ab678a0cae5a3d1765da655646c5e9b6ed2ac0a190f44613e63b4329426857f3eab23a042848fd1d0313ede10b102211b4af7ea1b3a3786869ff73a274b60d44a0888d1889c5531c620215d077b171505a724e5424715599b58c0e3cb85af10eae8c992c67de32d5e1e30a034654812e1ad84d9f260d12d516f2985952978249d678227b2bb0a9e2af013bb4a7d8570a161b1aa955874317b02cb1998a3b209dc1dedff3994d5ddadfbd000215f09661f8c0f5c55912923e7db41aba65ac316a7a4d475c758e47ec7de2cb4d022406b6874483aac8db3f3f45d844378dda7a5fb5455704d183646ddf6ed04676022e3f2c5556e4b62eaa64791bc3fcb210394f9c9a99258a01e55d623f817c69f20309ec73e5da2b226a7ba39b5d2c6104d3acfd27baa978eb24a05b36a8ded46873020006f5c019ccfb1f4920a1d9ee29f8846a606289f2740cddd010e25ca401dda593e2036032f8ba6cda7599a29d58b99c0d6093b133843b64dcf29c53b09e50972c532b19cb07e5f818fe7487b363d9aeb353fda42e09a55016a300d6a2d41d812f75d86b711f75b51088ade8f4b7d0c383d510264d7bd34c63f2565469a26e6d87bf611aacdbf36e9b7dbc75dcfffcf5d425e2b4e72d52a0a28a1eafddf855d5518b34436ada75c9f24e740003922634d19fefc9b3b5c2379a4b4849b53658822ff2a6e9621209fa1839e8726d36779d7902337c38754ffbd4d4d07760561c7e1a59ceb9f2511c91ac48661608ce0992a13fcd770f8464c7e5f2fdfaba8d6e6e446fa0ce143229b3b519278a3b8f1f4500a651b3b3b1d4b62684680a4c7a918a611f2b5c45e6ad4b90028051570690dc0efd6982a54b6bb6c81fa9fb4d9820db65ad0adcbdeb5a598022e42f2992522559be4768a42be232b99cb861b83231054b76fa16317c869fe462c1977ea63ade234861976c77a159936f815bf05bedbb3edfdb08195702ba051b6e8a16d3925a01d8e0db60318780b74a1cb2c92936ea556d88d2c31b2c489724041521581e9485900a585f15d98fbe924547beb2bacfd06fde511cb0750962bc852c2ec5929e2dfa2bd87474e848588158d0b65ff6ca8a359ca792f51bbd129fa89b1490fc5686b7fdc468563501cfc1d4a5691947794a6ceb2bed21558bf71ef009d63f1ae84b382d550d75972c02835795d113bf2e755c89d2dd81f2c5ed8c0c191e6096e4ceee42b9f0485616bf02decb2562f9d1d7c254c7af2786d64362513cbf7d82184b45a9c3d68f462ca55bf52d4f41d5ec1c72b688e8bd24b005385f6278f7bab4ddd0cd958720123c5251339dd2dd0de32c4addfe7356270a5d0fbc6679cf0f24ca2dec26d6e6682825788fd95a7a1e7b03c9eed34a35439795762d6bc9e87c46c3ab14377c9d42a6f12216f2488644a81e764b5630f35ae38620d75bd019e73c2a235189fa34be80c1c169a56a007689650404cdbc6a2cb72301f1bc0be7faac90d342c7aa6699444e6cef75290fbb5401b7bcd7a49a02d806132afcc967e8a959dcbfb7478287dfd0f0d54ecb395471ff9bf7b6ea979d82bf3afc3c2df2b4e8ffe90fe7b97f989999b1d8c9f75336cd30c4dd7ab33118af6b425967a7182586938209ac156d21bbe5ce28ffe563dc70f58b00e72b3b31aca50d9de7fbff8bb99c226a8eb06086dddb6fa23eef495356837deaae68a7f28456a3af7d3136200a97fe2c6a4275acb5793f830767ebfe570431ebc662a01cea876de2e23eb58839c9c4eebb37ea8d164479c5a0839bce58fea7a4c72c8cd094bbd79b225bd3024b8e077b7d1378c75e961d7b9d6685b843c8f999e2a5cf3d2291b84467df888b306b83a889def608c03b589adc9e0a8da42c9cb4b61983fbb144734b73c807dfc210cdc9902ef18f3180dfcf6bfef6f7a9685b440620d08d3bfc2ed49edffae5cdd02f0d57a386f4cd3a137cf7c5c8ae067a0cb9e3195c2c7811c937a3e5fa9503683f052e259f7530de998290693d4a10192197dc82a9344a94482f9f1cfc1bd25791732a4f412938dad397a152b3434b97983a8d22fefe5c2acb2146784f2a04654ed260577a09f1f1dcfc46b469c29771a9ba41d88211e4d5118340232cf659e8371368be038cdeac375dbbc08f14e91bbda5845c5a9818ed52d5400623178cdf10921f26cd9ec139fb8777a281af858d70452f3ac32be799dbc3972253c0d8224d3093a3b9c63bfeeecf1bca0e3fdfb3a5762947a722499f5c2b9bccabec5903c6ff5a81f5bb5a62069ac923d754356346fd0f39bd037a2d32c2c153eb6dc1ef0a", "ac5151526a53655365", 1, 1221443303, 0, "72c01073a3d806c726e61c7c965d2ccaf45965b1cdf33b8ccfdec10dcf45dbf9"], + ["030000807082c4030253d8d2bdd86e819c4bb6adb8a77d66d5912bfee923557ed8038304866831fc8a0100000000ffffffff80335fc2cdbf20f6baf9a497ffcd1c4c86a3a48adec4bcc9f76e686fe7b26eba0200000009ac52ac0063525151009c2f0c7103823db5000000000009520063acac52526365e576da000000000002ac528b26d7020000000005ac536a656a000000000000000000", "", 0, 1726733575, 0, "93fa4e45718860e72d977f41bf6723898a236060d515601cf8c6a9d5fe484056"], + ["030000807082c403035675b50da6de9f1d7fd94940726cd66324ac1ad37fcb73cd7b2378ad24521be903000000026500ffffffff354df6831e85f59303a74c677d448ff6ccbea07ab6b66f21985c9bc561d55d540300000006656a656a6a63006b160a38db85c722abd381c1b3c8ab1c3b54c7cdb538b4817d65dcaf5cdc37df65b1060100000007ac005152ac5263ac137c6b03186f5103000000000953535153520065656360186a0100000000036353531d63210000000000010000000000d9b09ffb0100000000000000003fcac7010000000073709b017501d52afb18070b2a72659754bd876b8b6ca0d05aca8fe5f3ffbc5556f6190a861b4aded81164b66976bac6bdd14b5531b01a282c74af26530fe143f5591764a98db7828969b38d6dfedc9282b3395e698af722549b6f35fb84845700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000491929598d4c0d40df2a7e8b2835b449a52e766d7ff1afdf058e2936dba5631b10289985e4618b1c06ea61805df0cdb290874d7e9318a729653902c9281528d581665bc5ebb5cca48d28215eda5aa7f5227fd218cb41267003d4096ca8f82ced77e10b44c4bc89aefdb11e8ef734417f2ec8521fb25d032663a070805e2e7cd002081732d7bfb559d429d88947c6f02f6b52555519cd81dbc83dabfccfd307431d032791331614d8f9b75fd568a87d4b09d2535ecf28d8b1c19c4ed53cfed5843d830a0326b228baee23f2e36a8dbdf76184032aa7041091ba3ca5d26a4c30e2cd2aa22b909d06415ac1ebf1c42bee92828c6c0ef816f0549af1113073c4ee481276e40317c7bdd3197c8dabe950855dd4e24c38ec8979adc72a20ee2890beb963be6bf7030c23451956e3bf08613766c0cc669607704ad256fbab874454058cca9c57165a031e25df8a2436761404cfb852f6927578b0ca133294fab66fba3c8f26d559f79f0209a6dfa43e7f1f349e26548d522789826a320cd0fe5ab5ab85db61451a26f8c103115a8bfd2d341e4024e8087896827e74b0a1d7079d5766ad812432109c9c6c9e1e14a29164480050f9ee5c583e58b3353db6f38c05c90ac7dd672c7e3e5d7ca242d47a29e61d166b044076cf76fafee269a22fcc233074f7fdceaf3d0164cba903bcfe209fa0c7c76c2e897acde79c644cf47a5a3d93d0fecd839e64213fe93b27e21b7e611067ecf87d33292b4e639606cb1fd5af3934b627a1a6b4457d47ad2bfd2d0f3da3dbbff20252f1c12d2c95c132fa89ffd5a32d1b2264b181bc818db9b592f0665050d91a067a69074a4ad810da4bd385177ee3e2ec2c18af61c41597ad0644d72aa39fd3b664bb4d71adaf9f29dc6fe0f13baaf8d58bd05810dcbe1e20a5ace349e8a533553d1e6fcd40bda5e6c34e04a3f3253bd881271404f63762115e4815e2706a59ef23e2fcd2b1388e99d43aa16024a2f8d7639deb6fbd1844f8c9fe08a696e35cfc0450b102e822a678cc422bb9b0e14f8b2a61913acec44c451bfc110d98d35dd9f7a69b5a08ed675d69f73701a0a580f4eb48b7967ef7799de2426169c0d78bb2cf2ac5afe533ad3990fd25c59b725cb69039b136d5de18c284c0502d9a1f3436877d20d6c05596e7712d160dcdc8ff69a328f810a5149a29ba831790151a5eb14b881d596b8cf17af111467db1e0f7fa792e2ab1787e23e3db99844ea4fc4edd000c6825c6814e35eb2e50cc84a8dff41d017857e3911bddb5af471398c00b36c627427940ae644caa574f912d7143bd37ef90fc304d09d10bb1436cbbb33a9bc3382543cedb7a01b324731e4fdc6d8a6ff83ba28d491bf494bfbedfabba2af1054d2e2402071e98ae3cfb9793e123ae2982838f8f163913f0b58262f399fa35c10c870ebf2c3a7fd43141524f8e02f016d8568bf0f59a72e5c76405645346ec176c17a4c21989df3c726f616567d2e0c3a88ac88a7e6023576e955955545fdda33674acea5f852560301e02e7b53d679d18cd81ee29de4c456590c25788c774839d326b87125e7f13bb7fb5c59f0cfb891561a997860a9650436694e68ea3cc649729cf5f67c1a3235f3d9b4797931cfdc14f245b4ae2f839e7a7de08e8b6097f372c18f6eb579e6554d38d80ed3954a7951b956f89c8159e481d601c57dd4518b4fdbb25158af2783fce0867a19b70f3f12e1ac60ca94da7afd35fafff98ffe84406f900c644d59c0846addeff2800111e29902768302bf9a1d89dee3f98dca9a0f70a524e48d01d6a5ed1b20d1a891417eb908057ed484daabea03bc5d7ce97d14cb0a9c42f6e27f0765cb911ce2ca057be1b1d9f5441700a009e9f7c2892d378e8135084347aca677b12c12eb0faf5787b68c47bf9f2916f96fdb80d8d7291376ba68a9e76f5209db999e1ac0ec9e62a37ab5a80528ceb5b46a16aa8be63e0566476ba47c2e64e04c07fa1cca491de4b905549d4f841f1b19e5aa5162fd92215f2d286f9763ca29fb62e90c1feace8c15315d050bd179550ae2f776610580448463e0e1f4dd9d98aeeaf58dbbfab85209ac546c6b3ab66cd57caaa533ef0ac00deb7bff723417f809c5bd145025682b73712c4da0babceb9afe664dd5820485c1d1bbcaa9ee10c12247770beae3992d26bb38e56356e8ab80f3ceaa55b7faf69aa7f4175aca0836e725830103a0fba694f78598e919c629b47273d7fb39909aab9f1104de0f811549ca24255a6783fbfd2eed69ab605968b47b781c5012e790e9f8de6b2f41c39fafde3ceda2cc869c2944e27ad2baf7397a6b339c914fe80b88f571446812e816036430bcb20ef7b96b02bf919f4216ae973447583515bda2d4ddb54342c9122b7c8961636f59700eb5a801b887c1be46248a05d435f634a92ca5899b72a02", "006a52005300515151", 2, -1471148157, 0, "9c808ca475b92d50f8cbad097be684151735c680855ea9cb9e12e162672d03b3"], + ["1199787f032f774c49b4b0e2af92ae27c4c3350c746909fc5f04a460f3c604190b03bc4f3101000000046a6500ac8e3de8b121dce3acd7a9274f7aca63b5b8001036c0597e222e9734cb1e7668b8040fe5b6000000000552ac005200ffffffff18b591d5c1c47894a644543e9781768d03ed70f497b25f1dc02edafdac7e50080000000000ffffffff030d4d3e00000000000252ac8ac4da020000000008006a516a655152514ebc7e030000000003525365654c4a2d010465ea040000000000000000000000001d6067cc3328a16d552966398b3e27557888da181d7210dec746567e8f6c97aebe47960e95caae8d333e70057b1d6ba522db7515dbad5fdb9eaa34f7c0960ba743e982119f76af994b799f6dbd217365b885302516ccd97e3f0b40ff0f7dbaef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b16ecae12067671709683720331f39e33afccddf75574059a5eba39e9e131405f965097833222562e95627f59371ac520b5ca79054a1b87516b55359a30a3a4c55db3c4c05679822cc825ba2dd34eb7be9212f17277575a1dcef32bb8dc86ce7f57276598a58a697a08beb2869a91cc889b554b1d1cb6406f9c490a24c81015a0328cbc97e2f6da87863153e27dd40473c5f275fc8b6b0b13d642e765bb313f98d020e0b96eb99454198623ad4dc394e815ece66bae524186af50391c808ad4b87d70a01c3b4d26b1028657629112663795156e617d3270f0f3276547c7e59f6ed1a69700efa987a5f37523290afb10982328bdc1df28c4acbba52e3ac74a1bc16bd81032313d866f01ef5a556ec443c0861020813f91c5aab94dcd9586caec0e447d6fb022a7f34f2a30f77d1db80c33bda00624d5f614b8e7a1ae581906143809f9224be0224dfe0124f9d2136fa23ff3fcc59521fb70977145e0818f2635cd9902d3a33eb0200ae4869a4813fc3903026569ddd9750279f71cdfff2897d3b85e2fabb5e27f002187b558c30f64fa49f9987913b2e9693a34cff49cc5985879f29ddd4d20afba827c2f6adfe5b9ce128b29b8056cc9a73f309965316a7349c4a5268a24c94f9bcd947b00e5ed99508d54065adfd1ac8e8ccd0c2df2145ba592accd4d84e3f1eb31c12e475635d883313329de682c3056ba12e116eb81fc292ed8e43292cbabe39ac838d6287679b0d68d538dd06e16e2ded34198487c593f7e827ca466a65fb1052c3a0a5033528457dafff722d8deaa87ba9d74829cef2f828a496f15138a2e4c3325c6c8df6acfdc9a28d68f1ae9165be812b870708dbf9aad0f4c9cfb0d95f23ebe083bed9c8f5989b51265b854e10e44b486c97b3ceb4bcb9f3f21b0a81aff370b9fb3a4f33433ab148d06433ff03901a6cb6ef22d91e70e19eb043db63f30b1c9cb30ca7c6c4f05984c0d692c009b19db0553daba7e7adc537db82362cf23c1e357ddd09277d3ae2dbe3d309aef810b131df24415ca26cc3bb24049839093845d2db29bd49fa191ab6ab33531af6a5dcddcc40cb311392486c39642958e587becd73f84008b824a798106249265f8887b020bbe76c7202e835a39a1ad3631452c326a6ec0447b200e5f171df4c905d61efb190e0322dccef9f8bf66aa4ba4ae18cdcbf88fc65f05956491084bcb63c56c56d8c570147dd73d9531e0bb12d535075c36fb25f2553ac51b2d9ed03e9536e8493e7dce9d7b09c54fab65be3755644308cbce0c0f14bf5f9201970a33cc19ba4ff271c17e79b5f68cd70d809952013b811c750547d5150c8183483b7653d666bb0e8e5c2ddb9441ab2601b5480eb2af8105729711bb42bc327b634b7e022e20c18033539d27940ef3a2d8f9839c6280cc0dcef065ebd3cff0a4c6480091742d0a12c9e00c8a93733d21f3f9ba3d2c4990fc432a62b8890d026d8cce44bd3131d7a1c1c66fe252d90d1d893b9fd051bb592102051803c117367ffab1b2e0fd8787e822b65c1c011adacd86fbd7648de84f4f41f7505a481339fe7b0a339bee228cd6e0613803a66a6b7c560de5cb85452e06094691de7d52d087f090a3f7b0bdaae5cd0c85170304a2d48048c49cd8a077659d5de51acc035ccc7448640ff7a47d6f5869c776e77ce7d070056b19ac76a1ca0585bdfcfaf524be92ff8dd39b994557fddaf8e45b358e284998e0146ee55a5ad1b881ddcb9b52ad79ca1fe79ecd6f56675213d35762a5e5efee2b0aafaf5a051c48b851fc16da462f7585bb99780c2e6af17afaed1b30e5ea45dc38d2adf634467a27958fc447a6e880430cfcf27e34e25ed327172b6dda1acbefcf8eccf04fa4b3803b13c608578dfb503ad0abbc5c054814e85c700e621336614c9cb2a44844ef529b5075114d088313c538994bd922567137f500b4a52473ae38c2fb16c51dcca6d284d434224cd68e5f582ac2bbd7693a35acba25bd5dd6f2519f1b231731887b3e409ed46c5f2b8f496b6ebfd1be114523161f4d8ae34a44b41db8968849dc3e68b27cc220da43f4dbc59df9aadeefa2cf40587a61fab88390e5ef69b5fbfd362096283f5217332cd35f65190ef24b01e5127a0279197e62575ce91d29bd8724c33c355f9b474d382be2072cb571e433c84fe49ebbbcd154c32ca96f931802c6ab51380b1dd84f118ee15dfe3da6af14f90faffec7271a7dc511d62f5a878c299a042537ad8e993fefa26c3eebc7c1891989d76a478f3a296899fc46b58ca361c05399d03f6a3bb9fc05eafe794809ed4d84a14b6fc1edd6fe60b1bfb3709b35d3469ecb3a75b713668e8b2c9e024edd29830f15cea620fd2caadca936ac388da9fce8f8c45003d36b89f344f56b17de89464429896167b5d519a904b6821993bf0573fabdaedee93960d", "53", 0, 1221588783, 1537743641, "b49d8b2ad1d6aeb9078cf3f93f131a8f1c582e41dfc699f2b28b19e04d73ae72"], + ["030000807082c40302ccb9334a485469de8ab7de99599e32059da5153ec0c2028c397c577ed9aaa2e70000000000ffffffff0f7cd19c37a0812cd1f2e007846b5cac37e6c079ffd9a9362aa1f36d7efb307501000000036aac522e5c057d03ffce390000000000035100ac274f60010000000001005f3a56000000000008525165ac51525351b9640f063415bbed020580e60000000000000000000000000058549365b633e38155b05e372f3e6efe74e5935247bb0394096202e0fc86bd50d321cb992788c713238d9efc012bc60de263b55f049fa1955d4b2004be66140540eca52b788f95f60a979810ff2c0c51e9d88c0597de7b90b9af88cb645da87600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d75fbd2de93b8618551d14c32f057ea240363d004df0affef2505be5c4b89a08c974028146c1eb3dfb254de760dc9a3c30498c92072d50af3bbda66a5491db4d32a07bd24743d6f8f29a301855ee36c9dbb25de64d4e5f7af30223ba5f344c3f8540e1c088ddc10bf3233c1249b7819eb4ac8df1618a0b486026bb18bac08b0c032b01042477210a4228bcce6532baf38dfa0c3f3c19d57120c43a73e3f3e22f49020d979aa7cfa1a9f2aed11c0ce7e89ed124fa24d7731c2c95ad012fa63cd6a8400a02327f1dad1a80dc3cbf57a0293aecf5d80543f7c5cf806d6357c9e3b7957b26235c836813e16e458f3829dc405366d9b7f50ccdfb74634d1b69a084af80537d020cb8cadd60d91f546ba1fff4e1192a7b39ba545194d59ae63081d5240a701842031970294ce2e0201fe6ec6f8bdbfb46a7133981e72534e83e60fda355c600510b021f79f219922d0216d82fc46048be8a8dacf76fb16d2363ca20952b3227992777022edb1b610141dd62b05041dc7cff40d0222fcc77db07f1d0fb42c7df297b5022030b4b4ecbd2e25c17a8606ca11f602dda25c28b0cc5e35041e1de70c9e5ee37fd414366bc95823569d0b61353e7d301d5e411807c7dfe2d31e4bd7afc2a1640f29e3ab1006450e8533023560e1926273ef444b08cbabcf3a32259a18ae86b6302d151f9adb90e4a1fe0d92d12cd9ce619f4c36a8ef4371e1618173c54a8861bd3173bd28cdac409a65543d2a7740b187441f260400a5056165880a093518f0a23fb1f6e3aeafe1b3b009a2a86d7b7fd3b7846aef2bc2632cd1c6c7c42c92908d48ad82c3a3002df62ce2c386d64870852db80a6a9b2b96b3818358aa331a61f8d254aaa73121c9fc96bfa89ebe7716625be1ac51b223cd60ce133b900a454c891756c71c8e59a321abfd373dfaa642e2efa519a3fb66a8fe8b0d9fd3dd6835d8b22a1acb36f55ead763bfe5b2f7c8f431b3cf41f45b1f192343d5865fdeb74b204064b0308bad456ffdc2aa19186d511029b32a7b08f9c2b8365f545322eea7497d5df2c5658ff25e728c827feb1fdf73d1ded5506a26468bfb063b2fe6d794a38579a23daca205c62aeac9ff64f0cdc0a37a6119676837ef9edee9ebacc0b07b9a4d542ef5ecf8bbc065bafcf6d588f0c193f075ae9cce2127c83ec9c459c9329ad9c436acdb0d23e32b9e691c2775292f1273242a01c56bf77a67807ae1b7e73b36b59c94d2b36d3620ee67f06c0e1bd5a7f0a342dde0c732046901df9b99979c0c33361700327e54f6e7edc2f6ff3014b2f7c2e3be18b600241fd0f251a317d18ea508865b05154632fd1d02273961b71edfe52694af4500adc1fd99eb1b2058096a32390872c87a0832dd5206b17820aa5e7a754a180420ef21a5af1deb2ffc24795ecc732426846aaf67a73e30a640acd8dc008464fa36030392b15eeb1bbb04cff097ead04ab20102cfca87385e651f62929552eb872633d69fe68399ecd0b5637c0acaa76636ae883a5ad4913c44cd1887df47993b4d27d3b3134d9b08beca14ec85a6613cd3047632d0556a73ef7fec4e72a17705fc9ee6d73ac8b0f8a0c6035d9c721b8771236b957ad80103ebf05e1cb6e553193159919211968b7b19c7aaa723570deda50f4c9b9c7e2dc24761da1aa08be614060e26f1ea497b6b24096fee53c44b67cc4a65ecf44a33c3d767accc63ed32516cfb17458b9b9efa4acb7f5f52af890bf0a75613e018ef58f078e5faaeb77bf066694b277960b87aac20d0f8a2a58b35c5838fabb7a46a32d6c8df966bd338fe00b09278e45a7d31d12d0ff586d142619dc60760759ade28878b477c269d261d27f0fb918ffc909616173d8f5fca99787a3d1e28c3eb7170abfa14d292cd47c5938309338e30f0f6609221ee49e52b1b8d97253dbcdec3c6ae3700baece1380c303866f6a7832189daf64b23e519d2d5a1fc208507dc4d7581fec9006052ec1f38d4c8c241eddfed385a3876f02d3b9c23bf81d66f76d0952d645382c50c4f7f4878ad048457fd9f145178195c1db2f80c390a996576825a15b91aae863d0e6837c24de10c14dddcc0fb822bb4adc90a65ca0438818dda7c1534d37005be7933f8e4b50bf738b94c12bd299fdcb6f5731eca31d9e2da5e1c24f15b94f28cd4e555c296e9533d0c7c06125e1610d76b3f1281317ab4a06a1b5ef6bf7537bd723496aaac11e625a5e7099bd317ed8255123e535de704078eba99ffbe870be4b507e38ae0269f2ad23456e03c8db7e240936af313edb4981ac603650000000000000000c2104a020000000038fd514b94418dd90144b02b34d1cbb614437a29f97fedfafcd50e40fab78d46dd759120b2e2c014759bc2bfaa79f3aeacf3cce8347f640d12fd8f2f24ee7b573bfcdbfb1f2fe9c0632ac4944466c949aeef2757176c9f611691a00df530c7cb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b0ac99df12b9c976c715fec1f2010a16ba77a5eb45a49bfd35658407d661286dfa58dbbb3842b1408e6ab4ef0b84c20d4a575e74073fc915eb08aba373970fd82f7e53ec189c4b60116395044057206d778f7a49ac0b3c2bc7d79ee7bb5c1ea5c6bd146062dce84c6c3d12eb4481ecad206d0414304c397702a76d2a4901a1203178b3d17f06781353a5f1be951f3de6bded7f4ba88265dde31556973462cce02032efd26afc751f3a5266b1224c3645cb35a951cf21a4ead0ce8da8397695823250a012ddbca974e84405533e8e1a7320b72f4efdb88afd7b29108685a2e014f3e1c73eb197be6c09943ebfc780c67aa9ae35f33090a6c9313287191541d7dff476203011439b665d3e3358c079606f9772933a5c2e08da8b3b92ca3d171842a5ef5e00202306653862eaf419397e2cca0020774f77031170c327f26012f1f38a50002d802117f1a84b174f78c4d296f748be0d499342fa5eed06e85fdc91ce35df6fa696d0315e3e9e4fc74f607e0f0f0b96c65f467555aa6f7bc94f0e7f45650ee4ca5a21b031041b071f86ffa3a30d6d2d536f8ec91a2046de02571370b062a1051fe6bc1e62adf54e4d8a0f9e9022209d11d8d33a2a07c8b16885c2b421c1ab133b6b630376e77be1a51d7ae4932f4dfa82826921d8fc834ddd489135890f95c4d86df45f46bf45af9e48284320fda1c0527efab44e5a48d928bf26ad1ee77749132715dd407463835deebda86373b34c12dfdb06bdb35aa17a96e5bece362fe7c5116ac1e5ef1ea976ec8dc39eaabed26e29884eea385efdb5371c0eb732553ae80beb04d9366c14ec0687b30bd4e60fba72663bc4e02e1393c28936b5e62248560bcb62577225768055652ef781e1068d82ef07bc70714ccdef34d6ed4ee647ebacf3374b68460cfcfada437b1233d83ec9fd617c326647a5ce13d0043c6d39bf3c374ac77c50399ee8421ea4cfb9425dfe590d0f66b91effd6c2055a161c38f3b7a8a38fa9c1131a476a9620b40b012d5cfb505b6c5c5f171060ced00fde7dd7d3667f3b7d8009df932646474bce5855207e0620b4f8383a539b508d8147a97a26b871dbf0be0170d1ebce6286d1f87e5900f07cce8217f9a8bfe373b6c560245acdbb7f257e52faeb9061c6968cc01bbb43a6f0991d255b0ee85d68cd1c96d84a624a3200a0e8e8905ecb8fc89f79d6ab1474e1d77fcaf0af6708fad37cbf2ef729307ac0aff2ed32d1eb4d67b385403844f9da10481d4ca8dc5c2ef630343d9a7a006ba2f89af1663925338427bf25ad5ac75e4e7ac32b974b64c21256416e4e288d366ec7d0cb8f84a257294d923844ee8121856a45b97ced9d104f2bdde5a1f321591f2f4b3f74fc9384df9f3b70cab4e5b68ebb3636205f6ecf6e616a8820e5a3afc06045166e271068ec9385ef376e5bbafa698d58ad44885436f25e416ec08a836e5a429caf0a8fc548fe6b261efd46070b57414f067e2d3838868ac943d44c44a4402264d729476fdc0740ae44221b752a102ecaed85874fccf8e50135effd5c87d19861b79a7a316309894a9cf7cf4763e16a23eede359bf6ca3d78eea1646a7cd655d2d6854347fe7d4c39bd6996b00e5924effbda2e5574788fe29df52988ed52a6c5561cba8d6cf87c3022ec989544eba2419219accf3e1975bcd762eb42a9a1cfd4cb9a12614cdbcf1e49887552908ae63de67bfd2e823ed6d780f5dc74426a3c70c4fc3a75a220cf0ba9412c4a07d498db71eedbf28ce5f7ee5dc32c1c31d1cc54c0129c7c0d9d19f506e2c0bbc8a857516325e1a325f9ccce9acabc73690c5d570c3b7580eb4c612d6dccb8ee5f9cdbe8e2667bf77746f364881a4465fd0394f3d5e2502c23232351a52f10c9c908c038ed2c247a22bd1f8636e05ae47fdd95c0a8ab16694fa40ebc8013c0355e1af240fde98222d8567f15367f2beaa2fe232467010da75473e2bd54296034186e95a46b644ea7c4c748f2ba2104bfd2138784984a13f7f75b5d7ea015e5d6681fb94f2d1a13c0e1c61d4c6881f9f89986d3197becb3bc2267b96ff9e0506f6a6cf496b630caf473fdf56317012e691f649c9623ce98450602dfccddb146fdf7b1bb267cfb654df1a2791e707c8ce18d0509660e984732bd2ee50953a9220265866cd34efc1dee456b88eb5712a55573bd458fa2a5e33f1e4a6d63def7a787e9516383e8e2e27bf13b50c7ac309218bbcf38263ac4aec4e60ec69b1fe38be2b5b8df759e8be4610f9b3fa045ee813a09621a287c7248d2e6cc58fbde92ebf0118bd47dad967ab3098689884fa9d1d6025702e2e29241ee4777ea9c081a456243e281d08fd6b49727f175d76bd1158088521c3861a36a74d1ee151fa23e7f705d7c1c8b40442c33aadc29853760e9a916a9fc5eed9b578c1648d75a2a104779607", "52", 1, 1577874246, 1537743641, "bec62a88f29475957f6c1ae2f705e36791d3849b7023d69d70995c23a0d06d05"], + ["2227fc2d02c178e956b03bdec4e0204d2380c5c221a83420cac9a9f54aeb20fe2798d5125e00000000016ab3d37bf80515e8aa35586e22d2c679a7954d35db190f7cedba83a31e0114e2432baa503801000000086563535363516a63973d52dc016910c90500000000016aa0a9260102f94d0105000000000000000000000000840f0f64edfcd0776d542034e0bcc80787b92126ac8e338426afcdedefa28548adf1b473d557c8101918cd32c020e2cbac4be9fb2bd0c6d72710f78b85d8c398f8ce01ea5b690d1dafd28cc601d47a276243f813a9b4e4ab7177007babb1e5ff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f286978ea018fbdedc826beb6238708d00d5f09133c22bafcf784b15b5c8b0917fa0a4f6f4690bdd9a868d51efe0f989c8dfcfd5e91c9d207bbf221b99847e1183724ab8fb3fafa78287ed4bcc7581bf3f81a5edd96e057f48a0fa0d729460739b1f0988c67193e64c7172c7c2b6fb942dfa945e461107f917d481f6aaea08b0300a74aab9f68074e49cb5800b02185fd9eb3ce8e8fdae4cbdf5875a5675dbd6c030cd677fb670720df00392995f79e3e55dffa77bfc18ceb19f037a9a3de1757fc0a00f673ee98810020bd76dbf562f8593ee4d284e84854ba97c8f3e152178f26acc9adc6b2dfedb1578ca841f888f5dc956ebcb3f24721276a5955364be407c406020b356611db0170d270d2d5f1e6096e7dadadffaf7dd22016ee2d0a0b9609a7b7021c111ba467c03bae07ffc085a9f0ec05302755238f92818255d930a54a1a1d98032a1f36e4c61274b9d2d864fa4e63c045f61ea044c76a7236645eebfcb9dee2830313401c47749d07ea26ebd527e30e824e845d8725711dd921630d108bcb847bb503284b94e2d0d6bf1193abe45a7de8f7e956cece8dfc61e7b099006e4172397e300a5f12189007112e6fbf9b9cbb2a520bbd13619bd45008837fd23918be2c0ba5dd7211c22c229cdc9a8a659a0769f6207365d1ef09ff14ae1c07860cbaa0d75ac39bf6d38358981cb03126c888a60e27ff558495d86ae6e2cf3c5b5cbc33ae7fd2adf5b73e46b6892c4dba876f87170c52d5e4580db6d8aec93e21ae74a3e3ba564bbe679036f9f6c64de224c091d028a0764341f25d757285d64c43e2dedbdd1a74790b34c6f4aa9107b0788dc7a348ffbbabfb3a2b55e386319bef80c71616566618fc308b89f06f82e84259abf8e6a6176e56ddc93f0fdd3b118ad8e0be5520896dc7d93ff4db9a2d7e52e2002578f978c0fa375b90f1fd5dfdacba1cecef114997af4522465cea57d9ae8290a16e688a8d561de27c97989c51426e322d3641cdb23aab1ad467b4a7d22a0307f8e927d102107f1f6e1957137d2e8e87b3bd1d1a777641998d1532da03b24997ba0c1c2f209eecc1e2c6f8dbbf68c9ecd5e79cc612d7d66fc265d8b9ce769744742183cb032d0dff972ba0fa25a981a843468003160102ddeaa047a61b5dfc6e1495600a9410e303e1601b9138c1941128df11a889aed06e9bfc85ca43c7b31cab1b38d4d6fb90db33f8edd42aac2fa79d0205468e3efbc013ff91ffb7ab7008eec62c0fedb5ed0fcf752e528ec955be7e06ebead1cc70ead66128e4c599d522e61675a4c8155be9bb64607c402164d0a7d42ce626e193ca91227ea55243c4cedbabab672cf9aff5559701be6a76c9e860f9cae652f2f0028f8116ee3ff208d62cd9ef46aab5b63fcaee098ad128fd7892302ef4018f10e13a02e77c5e904858169f81330585601c058e96135aff640d71d07c330e69b69057c8d10d891e5aadb58646f4b81f35f4fd7ede1881fbc2f4c1a6b6f364d960468ae9eb1f3d45d98be415c77573d361837096f7585d1458bc3e1add785d9e3641aaccf3c33fb56eee1ead466cb68ac82ee1419d93476c2d682a13b6a6d6126476ad7867cac0acf4a10a0b0b2f64af3430566c9831c3e1f8ea6851de42be03a466650369f23839da2417aa1f048e706dca8644903986ad90e6f9ef51f508e5593936b68ca013b22ee6f9fdfc1f9f8faea7c3cac05105f813dcea1ce9a7c8beea6ca2971ec444377919a3878905e6f770504265c01f235ed831a42b044bd640925f6d35fa40523510a49d1156aac9c1d61de76b683579afb20df8f9c715b379382867989d55434b23c81edce5a995d1457fb0aa6287a340f6ad8657d67656d7f8c33c076833379f9d21543d99d4b2f4ca5045670c17374e69859d282e838b37bcf069657fed1d67bde7c090a2e407a6aff2e7bb284cc8abe6bc5fb621877b8bf0c233654b58730c08642f7ac2774a1fdb76385ca04a350cffbe2580e6b6a2118ca31842298f3463f83c5f26235d7fb4d739549c782540bd45b7b7dcfb7f466b48f545887f05e5f5d0ef8b8fa377bbc22afa84d58d28dab83c5bf1b76fd96dbb439d161da0a7c2b2e9fc8b35af7b339d82dd8d063b9fe3ec734bc4b68100d98a33e2fe4fa0dcc028d54b53e1d227031dfc97d9e20f593a101215dc39230cc82823be0e27fc19ed2b052037f42f953e3f21bc6b663221534439a70b7437bf3ce11cb55f330f341fc763534deeaed7da74ff978b9784e64e1c6eaf580e0b3eb91eda1d26792d9edea2d903fc933a1e0000000000000000c9405a01000000001521b03ebb6c146973a5676ccbf82d1f550bb079ae711b8f9eb89651e35130e4c59525e53a317fe997e6b1f18cae2819fb61a17af0beaf0b756c8cd4ae164199d3069a40390d132fe1477e1edfd198436b2065fb6a9026ee3bf1d8a48681317a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fcc2702d45a0a097ccfc5301b5140e322841a9f767bd7abd5e09778f0fd48fcd7f906f69ec2e6822f8dfc15e98d99b4ea94ce374e03a2016825239ac0fdda89fa267b8a45e530ba93a0022d1671e158133b3bd6f97bc319f8ece2af30d7095343d3059866183ec09f4c8aafd1d57fcde734760ba416d83766ce08c497401f2fe0313638b9feab0989890f9185f5d64a8fc8c0140c53bb34b19c2460d4d5c7435b2022afa31e354da02bf95dc99afe912d9db34f9645b88d68ff1b79e6f24450d170c0a0627888d4780ee8080c2529b2ad59c637c701127a8a54100931d57192ff7883506fefd919643ec3350348cfdf8e2dd6d7e31b0a94f701879915778792b5f179d031134409321b4e4bfcf7fe80eb3df6b0bdc1db5ce08c1505b09ff83e531c29108022d86657adf29bd3cb48acae04f3e9b8a2f60a022eaa79465c582b3d73812dfe8022f0d5454baed5908ab70dc65030ed6790aa7e6709799cf69e43682163b13aeb803254724fac204589db273e321d82eb213e8481e97a5ab9aeecd610156584989930227c904d01027056416d38cde4a4df17a2c02052ac06eee5502bc1f3cd4c133051cbd73e6c56de8f653b9b68ae77f53f999f1ec9c1f4b64589c67c104af55b756a8438368f6a90d5d351c953f1a2fb016d4d610b88845cf107fb35f1490000ca719c4070fb1aed8da133790e06a036406ab157a3525b7f6a6e2235a630d5ea4b0517db4e71a6f031478c8dad5ee597fa48149ebf7c2bdfc97f959e7541fe70c207ca521b97aecc2c85d1e4f4d789d5dd9f843934091ee3284e4aa1f59b9c1301ee188493b09f05f5bb6b9ea87ee61d051df15e8b7585a294de5ff545c7ca274fd55c0438ad2d58ddc503dc5ee54e583112183a49f3be925a9670c2de00acfbce2f302ec6178bb023cad287902372561bb66b64c54e372328eda568c604698457fda2604cdd9c47de811d790fffd159492d45955da30bfab21b820e52ebc70c19873cd68510b8f669ec7c06b910b2484be3a0614c995c748eff27bb02c0372150451c276402a992cca6b40d9779a5bfdbecf34285e58dae0346fd8fcf0d0ea874d24ca7015ea65fa6c0be59a32f727ac9421dcf8fa1f187dc466d2b80f0b7eb2e9a84866f90b04a2f988d2f2b4bcceca961776b36f1121c82d75a473ed3eea671b2efd1b397d9c3b4ad6f1e0da7859a6c63971ef3cb0987e3c541d6b7e966ad929e93351916213cc479b6d64094753072a24ecac6c0c4ed5513faad9c79579b83b31718db5690abe39f183ce1e86928edb1a14371edf76c0a85de52c3da84f884335555d1761dd3c09e65e5c1193cb3d10d2bdd0e6fa46de4cc7828b145181f129b328cd48d9a98574d698b329dfba59defb75837d8f7e38ace00493c4659ae20e4fc2aea24993389ecb5db2b345e546213cbf21106402bf805a7f808b773fbc396871998f5f8193de82723394243d39154460ae353e3fc982193c94073f61885868494fd6e3efb07437c1b6d02df9fe63dbc059d9315485391a95e03cbca23c06547cd2418b815173c7bac08bde5f2f53c33e378e8fe21dbcaaa004b4747d73a1a8bf39f8958b47958c7d7b22ff4a67b84a4a6e664bf946d70eb95fd28191fc6ede232ae62f88e4082f7b0725ea77ffa946204d98a6310da7c9430df3c61dff6ac9feb399f39f45a7cca9b4412586a424fb5413a0dfc9c2199c8809fd1b4ef87b1dffcfb60982ff313212344505382fbfb6df37f1ed0c3a45e758a582e4016b0d6e8dbcfa38ace34a2d17c9f55708cc0c8f2b4cddc8d9dcf8b563a59770e5179d2270dd74445f9cf12cbf11b5c23603e697901fc0b04c35294a10b40e92e7b1a36860687c4b11b57d2411d852cb38e4f947efa5b2d8e66848fa278aaa8c5ed07732f629178ec27c12076e34161e168055e901cc6e014a428eae2567d8c71f39c75b3d243a4bdfa746b6d1b65012b287787cd0b3ae51d6b32318037c750e68ca02aaefd086d3b47090caa1edc524a51b0a9302cd8886b51d4f106f62a7e068ab2f4d968e4c4f2b4cfeb93281592716e5eeba96c1ae2fde2f808537d2c90058d1210e1330bed2666bab59e7b73ff17457bc5a513f31b37539e48eaa5036896212d7493ef246f39fee2e1778dba379515eb7f7692bc92b6da83c338e6eff5e2fa59a7f178eeeb5855134f5b30660d4165505ed7929a55104f98751b2267cd91166aa6bac235fe090b990c9d18be707e146195a0608b12bbf15ec82a27c221a4182c9f6e8a9cc504c52b312a7ba970312c95aa01ccc5ae8f73228163809bafa1233a91ae1c8eaa22f737dfb1822edd74d1f4380bd1bfbac13f22dde4ebae0d43e0699d3f3a6846f6259b119834898680449fb9f27ca1863d33b7eaf6c076f59cb99ca7955203b06ac5c082b8f4c59fd7cf039a303", "65006500ac6a6a6563", 0, 1360803834, 0, "3063fe6d649f65d2f6cd86dc8d9645ee48c7ae6f7dc2c824dda61845eec9942d"], + ["030000807082c403019309719ad6c6b605421c2247cc0c320ba7e3bfbf66849166f76a82a0f55f436c0100000009636a535353516a5153ffffffff039e018e0200000000036a52515fb78501000000000653655363636a97a9c901000000000463656552000000000000000003d6dfca03000000000000000000000000b2dafd43d253c1c3a2db68a5e841f1063d64c82aa1974e3eb339eef22221e0785916b7d3e6262d84ed15466f9ad0ce2c19cad916a212fa4f0daf4b168798fd983ad511deee4f1d0d2eec66b2410255782914ce2d6ca50034022a05861dded65900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bcb7d9973ded9bcef84711eb2034fd5c27b02848a99fe6cbad7598b1f8a31302bad7aff242c56733c0245c22bcc59db79831dd3131e9a457b02e8b291330710894c16a2dc228608ec1cadf05616b4e013cd01faa621efbc5a3456d687b5e6e8c1b115c02e83d325b2e13fe55411642020b7b9c4060851aa7964bb16a8f9130370219d2c7907fbc2711c0ee769f9c9c5b2b4d796bb01239b5e6cbef1606755eed1003237e9dfc7801a12f46f7b012f8c91d3f4c4e5240609643cb01e41896bc2b9cf50b048e3806662a4ca68ad3cde81b1e4f0618f181c5ee233fa54621e67d826913eb3fe044abb35ed1efb8f9e4204ca20f5b0169334a4e74ca2033e2c6b3a6418a04020d34db209921221d80a4dd063f375f13c27232b31b35dec94991c43582a585b40324b75b4485f9a198bbede2f0b4ea3b1279abbab62b5bf417452c031219d127c502295ebcb3cf59b0603b58cdda0bcb0c01479656c4709ad68a511a5dcbe57f2c00031d33d950c45f8f56fad09f4100c66d5d6d63d99ec27b1cdfab7c76dcd44f799a03003261689d9c51d7d9101e7ce7cdb5684f12a07d7e45334378030fdc445edf68979c824905601016cc05325b6bc9669acefdc0d856dcc5979a0dc2761d08562157b148cc9f7fb9a01e87d7e853490f732756de97f021537713ae43db24e0d6c59494e761b507668ec7362df04088f6ba83ee618cacdc6754fe947404009ceda4688db88454dd10784b6715910daf2b26ec96fe4cba7f424f0361480e67a1a9bdbc93d201f9db510fc5ab78ca5be3397d00adfa4604fac5ef24a24208599d7c1ab5a3ae9bdafb4740521cc0e8cb460586441cfd933380a29e0e5447f134676a09f17b35bb89ba9c9309638c8a388cd5c12f9bd91ed570aa14b0e5429b05418f8677c58eeae83119b123e477287261b84737e3b4b36f28716e85ecd65bd55199b743b1b7c0c6906236b6776a69f4570e08143a7ef858876cbdfbcffc8d1b515bbcc9190e537bc8054c3d060eaa21b93f3b2f942f923841234656df4dc190725fb41029dc63f556ebe43059bcbdfa76a69df2cb00c432de6b8ec8cedbfa9d3d56b1a16e17b7c6f3657f5f19557baed0ac60040fcaf573d20dcae6be77b931a153122ce464e8c6e1ca9ba847429e3623c2e5f527d5077b8b05a9db8589c528b72ca06c0d500a8d48c7db939e7a1310791a8e79a4fa4bbdbcb774f01591ab81ff3554c7327aa731317139f7127f64610e499a9eddf0ff013f5b99879bb9f793b78271269f68c22eb6ecaf4093cd3b25b158de4a0bb60f078eab38284a7650f518ce5758803fca512f27794d0c49d8fe3a3442c7511838d053a207bfc9e218a379bad54903b52cdf79fb1f5244f1e09c708e7371ad31496bf14906865543078cbc0d6277d88745f27e213767513651f45c944f2ed236d49248389a91892e6d769b748edb7630af63450c910201faa7755d94bbcca9d5c4c8e9253c387f46d5fefb3a0beefb9bb43bb2e355217c6e0485964aa3e387756c94f4412daf6a7ec1865c27a312d9ddb5bf0d0183cf281c7f84b5bb92ff67782e53784d28015be65a7dfd8c7a3f99e723a759cfe3d51a0462509f0b29a3b69400786da222639db835faa967a06b333e06e700d8c802784b7824d0255f26f961e310ba866f978534f2bde7529b460d5e9ced6896e9456ed3a45e2ad0341aa8763ff7358a69d5213fe7bb325fd69534340848fdb8a1eb42167a695d3bba859751a4b07d0ce2fcc40ffbd0dcc79e95dca05215563844fad89817a28bdcb0185e80e19040d981536aa6906d10e09995f8dec8e6404fd0655d4e4bc9d5d0113108ffa9fb9874700eb37ecfbb5ad0b49b7c51534e94c9937b272fc085be620a74962dd7d2ea48caed73235b730440ecca60ffd18de4f6c98815736cf3b37142891983c7c2353beafd5f0eaf9a6f7778ad751d8fdcbca2b5c0b77e57cfc4c6bc66c12fd266d4a6b5a4de29715c8ab5673b602ae0db2af2e35a3d72ad6173c3c2a887a651ca7dfebb1e99ebceb6c10ae722f81d1c9b6dfa7af917dbd32fb7922fb8736f05f46a3c6d0a3061dbda41d444a540820f15d796849fdf05850c9003014d30feabdc18c72b09ccd1e0074afb6c71549b524d8b0d0b84ea818136e5753b80e5d45ce730e9e5e733895a56cd37c828913fb1d720e8cf0c88fd801d0a707cd11ea45777f6b68a756e9f3ae93c80adb6558eab0333c3899f08ac47531035aa35b33adddff6f5ccf706647fd292d14f108c9eeeb6f6dc8ec3b661c02a9bc81910d529a3ee0000000000000000000000000003c2ebe99f56a80a10aec0f96ed46c2262fd8b1d4291bbf15aceb8fa954e44b466e56f3595c302383c61178fb04c210d41529acc40a33d4bb95134033f2034f341b727b0fdbcc45a3d5784cce5e226e682a1a49a35c5f39ddd6e18edb173b934000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001554ffc6e5373e366b3db226c31ee638b13a53c633358ab8aa9a7d79ceb2e915a7701e79fd265189f6c5f8e4fab8f023ba7fc00dc4e9f6bbc061394245f201edf3d9eafce62ae87d3aafe3a60acded315762b17ddf5e51cc1bf2bb1f4e3e6f3084bf8f3fd3eb49e7b1f5c538a686103b72673076e82eecb089b1461752bce345032017089d2dd5e0182d5c269467f8dbe6828a40d5fd659aa20e0028bb8e8d26a602266f693b9fb1de0d1cefbdf07d32ff4db52e163dc64cffab5a44a7482a3ee0630a05f90398d8ae66fef014af24d30a30931072cb5b0546b62b6ed9881bbb61312f8fe11d2f28a85ab30be140750ca5f981e91c88a23680b3b2547bfd67938d5b27021a6646ee7a3329c0ff5f1737e49a29fa7e663caf893bcdad174f3de0a756f0a80206c9de90537e4ce3deb678c652f49892e277adf22e4cc9ce85f62f6112caea4c030792de54e4967052f056dc2c4f0265e8ad17515db764fbf176a5645c7d33dc4703222b9d6bb2b6f1db432d148bda00654cfa23caae31fc649bd70ffb1bb9fa8b5c031fc0512719d06b0c07d66dcc4bd0f9e5c5403c81531b188e7c154bf1f527c2d3127e0da6b7b3ed5ad25c7f414c5b306df67b180af6ba75dcaa51511acdf484f08659593522a531a473041925a7dc14901c498286fb81977638a5e0e7dc5769b897a23e5e3e115fd5f8d2b74654e71b7a52732ee7e690de212b214526b4d01c08434265d6597bd519f170f8c899c89dbe63a0e2c36589f871801aac477e6373d818722e1ee5a546eac98a03ea6ad5144e84e4fab502db0735d44964b31d6d17bdddbfb1abd6059e81e33adbc4d5701a37a374e37de1de315de22631982a6fc23175401381fb5ab730c4e2e3b40ac85602f1f241b04a9a451ad5a4c0e70778dc3332929e6199bef5be3e56512d463432cb5d03f9f609c99fc067dd8b637279252fee84c39e2acc160b0a1f9422320f60650eb7d0d22ec0ff7b7447a61a421c50a55d6196e6519234342f0b7e277408f34156e7fcde52c89a84fe83c46a974d3dcc65ffd87fd87360bb16c09c30476a7ca992db2f57d3fc460f47d9f5c747f557fad224329ca185900c9f2d713c46fe5b08b81b0a0efe0827bfc125f6afb90027f7f31bf1c619259d2b6ad03c4ca6dad8a9a94580f12c0b7130e7a5fa517d00b7720493ccfdc297a5519a773195c6e1e131af3e8a711a9cbe6916222e9cf770d19f2edac979ba9fe57c9d5dac51ce76fe3ae7a25a70dbf06b2fa3d1d2c2eab6cfa52cfca64b0c332e83b16bde852254e0ee9da269030dd660aef3869cd6622f1eb323e6a1264accd575b3bab06dd48499bca5f302f5f4923497d00ef8cb4b9948e31f2932908443610fa17187fff32b243546ed13be9285cc35d1733e387d77c7c14b4626fb607942b09d81d04728dbd52ec6b740ff1ae5e358724bd97a3a488bb365324382ac4314b8a7548c3eb1e374a32b51687b47927677d97bf2b9e6bcc4331ecfdb785476750992e7e61dd06c13e771455a5fd72a7f773e256a86fba5196e74be6b37e2be17b831cc763f977215307d6cb06026ffa4aeb24a5146b914454a8983631f781bba94b0146d596e08c7bd10d1d099d48031cf699e8c41a840b8ac730d84c0032789faac44b4ff2beedf11271f6102cb2fc708cb336f499c8105215e4850f16c849c08cd174d0321c5ffb8a97abed2488ce8b3f9fb33db97bcb02256507161f5910098aadb08a5c773aa5fda969cc59ba7a65f4f979b7d3c51aa9ac8b382b663f66ed9555cfaf06633bfb3f405e95471250b4feaec73fdb1b19551e8961575cb29e595f46c66482a9bb67d1c95591211e55da3be6e006bb54a85f7dc23427338524530438af0a8b62e1b1955bd8d82798996e30872ce5b69bb00e5826c33384cc743ed9c61becf4122af144f36c587d730cb7908229c08284e22128ba768660fb37b2289c9b0cd5611d85fe4868f8fadc7a07a4812fd6b667ee7a4fc3e892bb9a063e28c0db39369a16cf87a97f5b5c87d581477eea5651ac347513baf239fb36197d57138856e29bea33e6ddcf7bab6a5f81b2ca4ea0c0ec68abb42f958826416f75aee695610e063642e0e81f2d63615b0f548e3e616dc67fed83cbb5d26aa0041f282a28b25cc98f6f27b0a2055d831e606e7ad040ddc0b9eb931786604e3d460b5d804f0ad2a22fa12a390ff69a67d6dbf94d7e0dd51442ddc7f2ad35d3a982981a7d996df80e7be885142a30f7aebc8730026d5df1126fa3142f14494d52d12f293915911d16712889acf0b3d4a05000000000000000000000000e14c8bc5ec9d7178696b28ff335ee0f9cda583946288c39c4e3c823ae01cc3494547132abaa62a88107e24313c543091fd1e3b9b4655511beacbd79e6c71ad1d78dc2fedd70df84b28505f51241bab092ccbcfca16461be025e1f74e8c70d6f800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bf23d4d396c2740205b97eaec621bb4d7aa7ff49ffd17c8e4e2ef177e8d7e6ba92eb6341d21eddfc60ea3090b2305b588facca2f1e59d7d25e59c249bccf19c52cffb38b5b3de3b0d6ab02ec8a67f06e84bbf2b788322101e29d35a0890ce848031d9d6fd40e22d0acc091f1cb7b6973bcbd2edc15b1283b66b3cd5ab1ca73950310c9a95bf2e1e4910a6992fcfc18df4f09c966feabc2d133f80311beb0ecf2a9022206e780fa2f24e7e11a7115bed82d9d0d572bbf03cbf2fa850ce0d78a26309e0a04717df6ea4363f4211dc45662b911ab67b23caf5071c74f75bee58d468177099fd25458fc8ace48b86c13334ea905c4eab436dae839ea70d9e6107c0fa5369803075d6e70da62cf055618b3492b9165852ecf16c735328d2f1844246b9c52d45d0320371e081d60a5d66ccad47004e90f3905c073d4f3e2c51421751c1047344650031688fff7292336fa48cbd8ac0a5c0603836b01bb82ee65bc9e4423030aee9141030191de17ede6770a5c75e3cf8f354e18170a045c4de2b3ccb1f9dedc4ee63268032c940ca139b47f7c6eeeb96958514ffdd2a1dbd1018ce3952009069fa27ac3db9f7ee5544cc4b33f3df48d37f7c63d3bf2ad8f286d3d042d9e3a6513e1dd70d585c1daf9261dac7956fa461cf3873a791a2263c4ef904f34626f703eb83c5bccee3c63e12ee806b92e211bc628a3a6ed3485fa9fc24ef370cfee602f11113cfc79b802dd838ee9c2d3aaa85177eb278841f4307e4e642fb96688b281af7910ec7d23e9ae3de45587d60368dca7782b971b54fbfd55ec33818ae5f51affada54b9b510836d1306f379f0a3074941b500069160915e6cd526b35b106938d99bcab8a9f39724a4ef5976f8055ab4f1e74dea204e8d9f9c132b2026aab5be7649cac2d9800fc1f22f5235ae46fbdfc8fef8d9169937b012ebf40f39054dbb3a820c7077adcc707800f7a8cdefbf631b365f9710e502a76c2a241cbbdfd01f9120b45631508a89d1daf97c8d29d8f0f6971926dd286d64ee791b913ad4d1777e5663aeb78330014ebb2e01576d025d91ad250279389a49b49fc2e8630bb64b11ee081cd42dfd60cf424c54a2f27eeb488074e006412c3e6329125339f1e66cb7ee28ad9ae99abd336999ac9ebddeb8c145486b459a9767c6c1773da9437590de95021e48864fb52cf0f741b20ddf76cfd7ebec15a083839a540328664ffc42dfb69f56bc9d33e6015421a5480cb8045ad8a571c294a7e3c194d0348853b51f823673b08b217b332ed8019bc4e0b0eb8c0b7ecb9575b97f5da0530526a830f111dcec5b1c59f0aca3cc02f50337d4f794419c1eb3ed1af32ce7400395a9904e867b0424e773c0731ea4af1af01b8c9af7e83454ab8cb1a8ffde5cbee858092ddfb25a95788cfb8f0fc9d8527fc09018c136eba346a78ebc125f94b0d4861c002286a6f03d9c8697103219f18fcbf7f8ca1115189cb1fdad482de79209d215e41efe076f2cd030a5a03a137f214d806024a21189cb51137e3a20777926b6067be21efca0cae62162336a5ce8f06cccd99ddc649faff0f31bb6f4381a209a3e21e83c25291678e25b5714fd49bdaf13389dd9fdf2596ba036374b58a04ea14264754703c352d4cc7a3f5ddafbb85035a8904c244ab54ca77ca66e60b0c7e0bd244711b784b8ee4c09061f5405cee3154813d9a03ed63976057f235f8da3597cf1c745daaf04e2db6f62e9b4bd7d404f36b0549d717055934e70a3c822e71da516bdcae0a00aa3b4aa7fed03ad0b231d2414a46d5383b44d9336646bf14aed1f7b0452e6edcbd2e814fb64271161616d03c79332a0cc7b767a7807474e0619487b5b4371f7f6974b6fb7f324834e440583c627edde8a1da8fb31add952235957eae4913e696a82982a7cea4ce5534f232f14904cf526850dcf73c2a6197acd44bf150d37b12aa71d9049adbf8e0ba19feb32da0f52aa28472301054654477aba6bcc7dba9f7876120f59538c91c83b35a71fd751281e784a55861cfa8afbd268a1616d70c8e8c19fb6a54a9d3e0f9531dac2f865168d1759a98affa6889e5449c1d375f6ba2b6da4df41a99d1369f7e1da85c6531f80cdfeb6a214f93fece5029478c07ebe88c63ee279d8ea9a3ab348217648c10bf172aaf91770f653f74e3d0933c4a43f72e762e27c8d5b6361c4307f3646bc8533d1b0992b43aafb57a106b0d33a628aa4e996a2b5adc258117155b312e221b636a42376965bf21c740a8ddfa247f4d4dd748e517e7f4ffa9cb9c54d240c02e7e2e8eb162d7e621c6bea69c87360ff798494cc78982e29de2452c76b12599ed2e33e4206cad3b7cceb2da695f1c4ad4a6e0da6698a3ffde00dcffeb83a6ee77d801d49c4bb72fa9f5566a93a0df393132907adad0287e8a1419cfc79046a27dd204", "", 0, 1077927338, 0, "c7c2e8ae96fbf626ff7d3e1eb069d354a799ccd5aeeae11c409ea4c3f6c5eb2a"], + ["030000807082c40304572788a2f520a74b38cc82b1c27c7e52befe3b0c59719488f5d2af46f0c456ab01000000046a515265819fc518db47f7a091591243bdcd9e01785aa78b6fccd53edeeb440eeec886c682267c6c010000000551ac516a53ffffffff9a1c255d10b6f89a453beb1453da3668ed60eaf1fa54230dbba0d4e75be5d91c030000000253acffffffffcb44b9ad92816d6c238523bad785ed7404f77e1c49c3d0a6dc697e96632fd23e00000000002e0843ff04cface004000000000029a473050000000006ac6a5165ac0037cfd305000000000400006a633de13904000000000265630000000000000000039f0335040000000000000000000000002bf570ec4b36e6b5613f38367d7c6e8dbc97f19eafdbaf2dd4eb29a13e76a5ed6b96a31a0b619b7db278c22b82258567f5f5079161e2444102e403b840cce9aa778a2d3a7842576bcd100222f1f9d5cb5dc7fcbad4b8b7c8d9cba6b27fc67ae60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022bfd0ea3953f35140853d6414fca45943c2b6e5df041b85c05c4c9de43697c806834b66beb44d263bec0cadbf611ff2eb5e1d493452fda8e7f4cd4d6534d3be542addbe57734e47d58764eb0a4d17d64fc7515397710d92895cd08ff7ee47cdd25207af4bac9d96a37aea2fafe5666b25c479d3379d7aba33998579ae163beb020be8185af77a0059dbde6f5157fd234f686382fad93e4c67f35d57eedc5ba4bc032c47ed96b11f04fed70ecbe58b2aec3a6b1f3afbd066c959ead563ddb1b0dc040b06fd25a2186e69f21c58f9dbfc7f948bbf81dec968e89079e0fd3ddc6c8445dd2c9a6a0bcf76a53d2686a8dcc82b6f60f61f69a9fa6eddbdd67cd1da5782063d02202dfdd56f77da829ef55661d8e9e75d47bc32f343d07d600d60dfa8a835046e0327787124706238cc1630fdfc80847a7fa20b48634496891d36faa96f3cf1a4990316921e2930daf98e3996ae3ed54ab43e6b2662159ca7d4a84373b3b1adf1e6c5030b4087dce8b3f6dbaaa055db33c84c3b8fd66dd406cf2b107b866235497154720222c78945679081ff625bd9612da17b9e969db635efbcb22d9df1d66135846b4ec0c68399f5c0012f7a73b667b5047d0f8335cd34b15483533408f86bfd2f96830d4c7b8ab3596d98fe54b8a7001840309fb5858a1752e6379e6068ee222160c0e0892aa27efdd91b42685a23601d157b2d1c97b2aedb52a5c05cec99328873bd3a06618f98dab0d40fc4ed61413335f2f54e0f737fe56c53cd13d04c89288ca86d2491a5aba0210d1dd06058b26bf50f08918850e6017427cb2bc208397c0b0c24242b528e5654e4da7db285edd647a439cb9fb497da6ad4506a8301783ce0d5655859127fc887b25561e011c589e9ad94f3d9b09e5eb8f6a4857be699b6b14601a11eef7f4517656487dd159f56d9daec07c607bde62dd2c5c1b9375318c5b0fd5eeea48bc612d4c911b3d9b4f199929cad37db60149b00bca391ecb3ef5bc36063673d70ce840be1b73b69b73ab39cba736dbfad5173f14d70842b64e3a58bd27ed91413a21e7deae89f02c4cd18bd44415d2131f6062a95a7de8700d7ff32a28b8da0db54ff6246874c393b570858a9b76e7630fb78d305ef20019b995e206f5493a9f57acccedad9ac85a054159fd50f685fc26b2f424278d3ac480cce77945f1d3ec4f971906a3c55b9961cf7e0b616b1a2f9aa3bbf1e348478f6e5360711b657ec78f202824ff5b592769d0485641672fbf0c14271f425da25a8e5c03c2003683f68a022c99530f11935996c26cf30dea2713fc824bb66d146b4d99bd8f8fb21006ae30c78443c158bf95d207ea5bb2f0a5a85911e0c97c97a0287cf68a9e45a84565b6f621e69f4866894956d4b946f66358833b0123d8eee9f0e39796ca16538184f3f9ee5055fc0e58467e8d0ebf75b674c9d9ba2ea634cb0ec41fa359bba7df98b465c704f79c1b27a5bdd5a5ec17103665c9d36c1ff4295053c6fb7eac3442275dd2353d9e426a20739c1df076eaf07d28ffd76d370f31334ba947f0e664addce2d4534386538d64d0123c884bb6a38a573572ee8081e139a9f50020bcb3d49d9159fee07832a51a6fddbdf60c7c670a48d4c40d1e330eee1c5c12d505c8208fe35e7cfe148a9af90bb620c5c42a886fd025581a0c8fd1fac68557d60893ee103b7c60e1503047d337e3054a2fb5b7dcec33668e912d190ddc0a03ecbdd176c58db135c83beca83bb61da47cf8ff1cfd5fc56c39cb74c7f3eb22b435e83edd4fd7930ba0810f3b62d6dd525cf803ce07a8e7e192d1530cea4fd6d212e3db9ff9b9ff5032baf0c7f59aadd030296dc903f6d92a6b44d29d03ea58704b95a38ffa679f380f2d384ab2b2f3f3e3558ec5f975d7f421e9a63e01be1ffc023fd319e6d0464c66fbc2520e37474f4c6e9354d2cba35f96c169eaf78ea35eb1c486377c58de7a70919962e0807815f5b26a987c41ea0759af277200de1e374ede8245b6aab2e3819d72918eb54c2c188d6fdf0a39aa80f2a530510bff0fd28a51a4191b8b37d63e6b936f118712c02db471fb5ee1abbd437bfb2b96982be0de1e484c3a41eabd8566b7f0140d12427ff1f8a7ad1acd209632a7c060c392175ebc1fa3261380eab761a2db8988370d9db5ddf732a8f57da1a3d304f32f536b2d6c1d2f192a197639e5d2a5f16de45b917a29d7607581a8c8fb6cb9dda5ef3914e62c9ef6c4a4301f6a8948c21c119004a599bf95f522ebbd272981b1d5ee4c1b08f36de18b08fde274031dc8f04636a0db3eb2000000000000000000000000000af5c9a54e2ca5e6da4c87d23e4f4e7c143baa03256c37a8187bbe6fb8c5a4ed788afe92c8ab796f7fc0fcbe4403471a5cdfbb2de47e26223acc1997f14241a48056e271319b9c5d5131881548304a54fe198d9d6db156b612427900784feed5b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4bb226cfe18b59ad7c03ef24db03651dfc801787bfbfc9ba0d8827993fe3dff1c0d8c8b402790c60d677951ce54edec68b74db3b387eba58950a4c145a40d71e6835a8d8ebf0ee55ea060f79ecfe4e82db6b7a80f9a9b219998a368b143a4591099be96beb7408a533bb3bffc629fc98ea5e12c661f5af0f11a6b90c66b5caf031b655ad9d4720993aa5231f784dc9321ed2bd21c5e42fffbe43a0265db6f779b0312ed7f49bb096a66f11c71d1c017d24b7d8f2ee2dd973481f2f7e3cbd48b802b0b0328a1654f9ddb60f11bacb326af331420561820f19b79bfd65fd75a2fd63de6078c97c14165c1c7a9935901be7016698b3f69049807268542fbb8c1a6c3e67b02264603da04e577b287d9641bc78afe9e5f6055b32b1e9514f9e36cdc36b6549502107b64cf68916e90f36184a955bf5909521998e162e5fe9ae2ba5fdc3e2fed2c032749fcd7e9f2c9e5f5de5a4e3b63b8bda507c137340b83db88c6d521ead293bc031947dfd6b466d4f2a6249258af66f0c3ede2bace190adba5194ca386fc37104e030ef65eac777171b343d8185e22e47256ff7a04362539e8fca25e92d289134b78d6d7e616682423b8d25ceef984301a8e7e113cd3e6c728f84a111817e5e87d27c734cbc00319f9e1381c3d1ad9d5b83c446d0c09a1b298692784432c520aac1c79cdda2dbdc546ba0f6338068e02ddc0331a7279ce92e003ff0503e77ebb4dd43742f41ff6381c7fd330f64c8ec68cb806b1783acc82d8d0bae00693f22d80addeeb2c71066c870266e685b506cb72f4073df67150e8e40ff68f5399e179d46b21ae31dc038a845fbc2c489164b3d136b7e80df977a1e08b04ad218b01a4b2a29fcd6ed381e9b7e31b9c8faf80cf9945179992110c21db00ac4af1694bce231bebde6daa73d610ffe5f7043ddd48e9659d07246456c2ee79e7da48f44f0d157b34a4e4d0839c76e8c39945dd16d419aecefec873b518583acbb76886f93fcc52d744b393401de2dd7de1327633bc083250827915d7a1f9a092e89444ca8f59da86b7bdde41b3cd793e5632fd98f7c5e5754afd5e728d52698c5e15254cb01bd3521fe004cbbeae17b6b710a5f0885a3b3423b5729b15ca99cdf46ac10637f3f555732be0c2ab11ca4ccb9ef9eb87c200f509c6ad7637fd9d9f07efb374a04f39a582fdf36db3c9fa72f9c52087eb1fec21fe358ae6cf8a494407fe999543d50695558ee56a2cd85bfe739a938119d68d4debb04ec1faa245334f4d2d103b17f8e9a51620f68fe8400562fec0c3d23221b776bd822a911a7e5fabb91988b79509eb625f287f559432492baa83d39f6cddb6632c5b528d1338f21a23e5d99726d7b2d081a31bba04dbce3af4ed6a3217ee10e1aff6e853a431dbcc242815b88fca9f425eaf5e22bf59a51c34e9d85f31659171d0753abca7c17f81a0f8eb00b626d816e4cb6a0a858afd6d7b00f43c550b9bba7ac80de1aff43268babc6168076b9947ab019468f7bd9eda95c3e628328b1a6e185effcee88b052ea8818946dedda6df6713c5b150d04ff2d216261c1865c873d36b6f05470af68f0c3826f9e5e041cb03c61488e8d73101afa40d8be20840423f09c67316b393b9c071c93b3eb8ae9e8bb228db1a90c15481f03d2c26524324a714b82d2c2e0035295ec713fa5d3a27854f3fa0131a4db3f181ec72dc868411b1aa2e26740c424fb902e7f39def8ea85911f4cfdf70826aee1e7a6798bf6b499870e809e615ff1c469b49c0e375e3a48e7e5cb1d375378acef85938da7d57207d05aa8bc8a41c7d67cff6600e6d9676653631cdec42f188b4ec1772a1dc7466def9601f79b0171af704fd7016debe49bfb36bc63ce95be156f43969c03d4ff089bb41babefee5404ada905b449cf9bf583e6a6515b8ed291b0618acd15e7000280a51206cc7ed3029464f6c5b7a367d3aef22c8eaa4945eef9dd90f04752bbe6225c40cba6f7fffa7ad6a06fd97a5c12a2df2ae2361a8fe850917855f44246a22b528702d6c1fbc24eb5e2024fdcfbb016b6b45be3d05162a8edfb9ee9b530c8a701f6577257252a12f659668902138abbe8ea3b1461c6cc8327a6c2ad73c44f45b4b813fa1e7b1961a4d6fc3bd56b174f6b45c3cfea5336ff08bde315a52230104c0f841aa43ff220996972bd9bbc644aeb73f847ad91240534b204c924df8a5a9c4f2bd84238c0076c585883c6df75cb60d8354309e5b1e0fb5719d8e7ddf90d6da5f7211c1964aed3c6f11e51d95e80e9bc3812db661d64e6b8b812af7de0000000000000000a3e5e00200000000e53118b48522044beb9eede435b3a6b87dae21660c424707c9510172d19a836458c8b10ec2c467f0b7e504b7c0060928abad050ea1615a04254daf8f80f0b4d250dff4534ca53d97a08c47ddbcaa61521502b709d74eb6596235f1c392be0c4100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c5fdc9b668d60eee8f5974239cac9d8077b9befc0c8d2e7fc76a17ea21e300d43577e0c8d5300639593af8d17c0345253d4b6a0b7beaeb911d87aa3d7cdb69f1947e39d5a1891557afdb3b253058cf234edc7db56d03547c468756bd9e98d2fcdcf5d1e64068004f695309a156d35c669c51a0f0b50a915d3429022e42909add0204119bcabb43f0f66327da673f0f8f5334d3531a35756c5d0535d4ffcbad2fec021248ef4a0f2b8e7007c37b19ab57d9b982d89c2644a772296274fdfc39d3fa3a0a046067f9b11977e5de244890b313d4d71ab3bee6dbef1607a6eb11dda820e76aba2f9712efb3c61bd2d43f96d31889d5a717ff43bb775b5cb060a99c8d451cb7022296509b3e77c2db28d205158464eb93791e31b7c62db6b555f2939329d8a2e30328e19732aab0969ae8ca32602cf1d1d0b1bbbb8a675e312fa5e069462554faad0318787e00f4f70a936d73ae7c69b0e1a1d69284cce68267372cd7aea363c654de03298b7c6fed719f8fd3375f8dfc509f818bb2421b9d1eb2d8207184cb7c8fc676021926eba1310b7991345bdd0744078f0e6a9ab9cbe0eb43ff75893e40fb45c9fc5dc0bde126f202b0381f3f689dbe1a9013fd7ad709460d44da11781c01565a301c87af0c6e0209104fa4dd38be083424278c8378da906c52e1b40d10ff6da46c2dda80d9064f8a11d2859f43b80223518449ab2930c4596320ad40a321296b543aceaa3e4d88b4dd77f16d0a050aa7db107dd5129f5d0a6c9bbcadf2992e7570023c2006533092e703a03906606a85ccb491b51aa69d1b32140b7c9a58a5ef7a133b98667e0f82fcf99558528fd91921c02fd50a35ab3abd01be1e4c66a16aee794bf59b2fdbfeee58838bc54f7d81cf73c35dafe70983de4a853787e38f32bd7355c35f31ca65dade45650892d2b385a3c23400376f74b2fb9ef1a82433f8cbabcae05970dbaef73d6f183b3a198929c5ea815edf8f7d27b21f3deebd27e4535805f29296f7d5f83f44a2463548c739910eefcac13a9b402b15187f20c044c395683d86e8e3c0b26f6be63bd0e72e0a1df0a78691894ab1ffecfc0057c0f51d31faaae3f4914248980212bd65ca1a29fc08658988cb364c571a06a52b1564d7587731b6cc6570b88968942b20527831dc1953e38b339c874d3da3bc855f0d236d0c657ce0d9b51e7f057126d3182e041f15e9f7b8c4768c21a914d01e265fbf777aae529bae9f1d99be63a681dd766f37c0c981fc7c9858ee81d828aa5a55fa8d4b695b3e6917af1b73b7bbd5546a2282de224eb1b577a9bf8ffab30b47a856b457017811e7012180cc55d5ff45f8db9a67507149acfd8a1d53900b4d93043ba6212ef6941b0f0a9694c607b205fff16d2b65fc9bf7aad988326e55511f32177f4afcae60db94084fa87281f91602d206a83d47c54f319e9c3b7ef920b7c3174aa269e6bd96ac528353d4738388cbe556b529b149a9bae7c0505e2a3c37fa3c8a6b99b0283bb41f553719853e1d8d6f48798b3aa2e94a26e5928ad5f63740953f42e108a54eeb7f2312203f4f46af27e37d73dc9a37314f09a01059a3af9e8bc97f59a98603ae279c6b6e586548e7861020122cf21c5c2aa0a6b37f8d05ee0a486f686287a754e9bfd02b8ef64775bf1e8170f741717a860f81fbda61ca7a9e6d8cdad5ee44798ea5db25a9fb37d66186c4af8e5978bae9aaad274ccfbd2ab742ae938d887a5691c78987417c58c56ad635d7dfd9c7cfd8708ba6fef1ba43a893744dc91ff07115c355061510859b19fd3c44985c32b2a81714035572995e7a86794fbc97e6fce208ba28fb9fe6e5e7e53ed0cb40476307c6d3020720a2a4ad4c15808f68cc72ae4f75ed0a0c965e9d8c1186f0a1362948bfb91fe7d6c2461cc18c9937cf3dcce6924a8f743bc140c1d815f86de2ce633f90cbec554875c192549872cb4f98952d252b666ba4511de1385f73188942df9dcbc4b11a72ffec3b51a806b9eb3491c022ef94f1d852ff95c6c03ddd2e07ef90e04177526145fd0c946c562ecf28534a2a38f96caa13283d925b9b973214d4104e96e7f780edbef2e8997ccdeed6fb3296b47511cf96b79d9960ebe1f82fc34ec08f8e141a813d1a58c2de0da7340d9a5539ef7aaeb3387117c73316079c800ea5cb06119549f8fbd8d713ad920682743eca65645db4a42edd53db50b2230c9838cce942c7a02feeb5a1424006d5ac7a6c5314e4cc0cd4e07ea3a0fa3b7ef14856e9449d51de85c94fd0647c0017ee867af3925029c1184da3884b49bb80722162b9c8ab10f7fdd327711128bf990ad932ca87ed09c0095831f4c920c601ab5cf86ed99a70498ce4fa5715f7a0815f02c4af8b9c67d1fb091bc16c773517f54c885ea35d245e2c01f039258751aa3a5f533ee173f7dd34c15100", "acac", 0, 1175556952, 0, "00a838e6a513a2a3832ee738a2ca9e3fe53001f1e5639c87d43687b1b139f725"], + ["030000807082c40302ec6c179f46c4bb91b6b998601fd04b9d14564c1e20acfa86f84f32a92de0dc260100000009516aac65526a5300ac000f9e63c3a324ffe68fdcef50305003eeed11f2a538b65d258baf75151c40842dd7ede000000000025265ffffffff0313f1b5050000000009515251656351536a51e45f500100000000036552521fa5e90400000000056551530051ff34e75aab91202d00", "", 0, 321495878, 0, "c58986d5b25c0fa8e6f774a85302c4d5e0d1545a8f7f2a5058ce4d90260d389c"], + ["030000807082c403030a0ffb963fb582e4d8bd99d19b3374eaed2d97a85b80519d2ddcaab521eabebe000000000500536352635a58d105c32d13779d09afa7c8d58033282fc804819a7a6646d5df6260eafda160eace67030000000763ac0063655363ffffffff69198daaedeb56cefb7c01c92fbe86c81cd6d96be7f8f148903348ab0e54de5101000000075253005263ac65ffffffff036cec7f0200000000045363636379d11f000000000007ac51005365006535ce260300000000085253520051006a535c9288c400000000037fdd1a020000000000000000000000009038276ee9c7021c186374be58849dec0e4beff609974a8ec2ff8930881e67a865e86a23c5caa30e8e78af1a12b569cbb9e5b8029de7d5884ebafaeae4a872cb2cb6a6d02e8942ce3cd2d67b177b2e191017251dc1357e6091b9d582943619c8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007c38759d57f775f008f25a0ccb8f5edbd7513f6d8d4569496553f38cadf4e90e94c518ee57b5cd5371d8263d588db0f590c18f93f4a1e105aad5ebe469c71fe37faabdc978919603f9e246a2a3b7cbeed9bf5ea44d1bbd2b6b746b0959cda3330d5aa6eebcba46dc931f748f9fbd6855b3b116b8fcf8acf0b642660de9246dfc030187c241915612b8c79869443d32d3eaca155ed3bd1fdc74214074c48175fbe30228de84e6f1aec26510f5bbec2626d0d85bc82bf25942a6c75c5ebee87e45e5340b03dbdad6b22031e70fce86500b36c06bbefbf00a40aff62a79c3d0fccd1c426e3909d7d34871e14165eec96fa5e486e332b9fd35b006c3d3e162646ea11d61c003148cca59811064b6945abf370e26310a64ee9e8d4701ddfa670bb2a4fa5535e60324d99bc6c1581f12b6333890c1d6d17d2b1adf70c1310d8aa991d4d695667d830330052efe217015e3f98669c3da9d5f4988246527fbb4ac644f979a28394e1009021912d563f64e33c412b0ef7db87bd54b3e4bf6dec0842581fe67094f30d6296a02064aa0252c970e07a259391d665ccf682e2cde1ad512e06c78f09c484938d267230ad01bddc5c15c3c5133d657bbc72cdefaf4e04797eee687e4467b3feded78436e4aab05a00506b1a3e424d68a04d500ee9bbe34e37db8c6b713a872ea6952b6e50f39f19a110e26d0b26cf9c6dcbdf09853fb78d7e3cc6f5c8c07f1b261877646f56f62973adbfcabe18b79736e3838689690a1561f7be679503bcd8132f2182cc9e487213cdb7c468abeff673f37c879861b71a7a77161cd576ba408387f770fe6877174de401a8bc73d410fedc84753e9666156f8164ad464b1e393e987b19342d3a0279b04f5591b42a94798cc434d68af15a41ac5dfe70d39e5a0a629db42bca814ca2c9ec5cae81335cd583e1f4a80ea76688ca5c1221af15ce046215285ed4aed3211d57e4efe2e6aff3f49d1baeacf3108ec78399ff40e721cb5442ca2d6f31d8fbffd6dac1279ba02da3f3e2497d7a466f8959c40843a6ae4eda595b073391ab13d4e57d1881a65ccb245870e0a0dab8a3acd097fd1c46400855b398d99c0d91f444fbb0453689f8e428793d99dd60ffb6695fc2e7e8939a127468b9fb0f8a9ad1e7a3bae37a2f733191852042ed58d11b247e9974b47352024d59e3cc106d3dbd06bf506da7ba1a99368e1ce85507feb20c3fe0b472f193d950e0608848ac1633811d2ddc4abdb30fa1cf434bf0df4899d7f7178b3842e9cb091505e40f90f0eb95e815d04c339bf3d2f053805147ed16b492b05851736f32c3ba88c05c49cc2a380d71148f15f70b2572d8cd5db5732a3a10a08ffa58ef64e26b40478852c9e69e70b77d35f437d3c3b63b571572b965e05faa8eb3769747041df4c8745e2e725f30d5d2be0dfa0f487bde0e7df652847cb7dd44dd85f2a1ab7d11942978cf0be458f585ec0ce8da5f236a43ef1a5c1f90555f2cbcd57002bf934118f2f52e81d3946225fc6df68a7e62c6afe26e96879b96c844c7e85f2002cce3e76db6cfcf4fb4072dca8d318ad501ccd2661d20eeecc040759abb79324da8b9144b34ca455feae4406b47d5a5f963648767c7af74499859e86e31d7663b90c2f203a326ef0a91db740a7a69bb5f5bbaefba62fa75aa2754ea28ea433fbd161564f3f62c22d3b2917a171dad1f71e16c6accbf8fd487b70337e5241629c6ee0005d7a9ea526a8c7640ad3d68a43185b4a89d1b99b1cd8c1e8c790a33ac72fb530e972302f419f2e34ccbf4d0c7ef1594635af689696b0d2855624adaac86f4b50bd9b7e907d3a16e50c4e74bdbeb1102fb4d44f5ecb610cdc29867e6603fa7d8dff10af3e2deb907cbd62c3582416b5200f9008f26d5e4c7f0f15091412d21f4a0d3f3c81d902bef8307482c1bedc5efdced5de0bb5ee7a9545d7d425ebee186e25ec7cfddd52ae33c0a2bfc06bdf55beddf81fdff2283d29acfdbc9e7c484ea2985f8c4c02d098e814165d2f75309ee544d2a851ad6449133618305cc6fbffd3570429987ed12109ecd112c2260ad72d2f3fe054699bb0ca04800b68cbf91187cfabe6531f7835480c9466ba751614d4c0aeccb0e6813ea8997ee1ffe461ae3fa0f237a5c7b496e9e4c475679886aa25b24a3a11c8ce008a197a540ca9fd68b0dfcddafa5b04beefc6c62b6dd02c3084f69c8d0604a48d434ea97f011c0aba3c32b53bdb7d74efa01f7f91daa96b2a6ad4ae133473a4f20c502e8708d6ce5d0b6a9f6b153448af2aefcb84d32d43bcfb53fa7a02000000000000000000000000350fe5670a919389b01d6bc2eb23cae26dca9e92462863c272e215c14f4ef5f51f217269159d016495efb2b1254c9695bf743830a87c837079b6253f60c0863175b757a70c71b22585cdee198e16e1a810c38eda5089e2d197516a71346607e20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087a56dd91cdbc66033f705323f776412e457aa4f2ba726179e7dc9d8866e09993139805ba57ab65a4949cdbbf8593076a865ae20739df919d254ede299895ba55717bc1f1a8428b66c12dbb50fbdf71059812195a5d73708f378ae5b8bdcb23bc44ef32ff7bf2c49bfa9d3e9a82cad747fac353ab14c87eeaa6981dfda01daf1032d7622d73bdc2741f1089df67ab981d23fd5d2177c9faaa57f0811203243f7730201f46ea4d53916a1f02b55657c5978fb4002667f4d27d6965e4a82a2deabc59f0b038c173a9c53e7d4e21ede916015a8bf951b9bf2ff8bd10a788fceb252de4eccc97e622ca1399827d5a2b840a2ade11bf376f6cd05ac5664359cecd6714b8fb703147ccfbe37491e8d4dc86b4f759b4f4b72ab94ee730f09eb26df780fe2b37bdb022fda9a5a6629dc0e97c7d900f6edd9f026c6d3c187b2397fc3a491db152dca750228da2159ab0ebe0c5926da0157ebd41065e2cb4744501465b99a808d7f3bb7ed0327d8c5981543de6ffa365c90780f6513855543690d2d75a6af2205cdabe47787032529329156a60218725d1e069d628bf9998e7b778ccf73aa732a8053eb263ccf0ad7adfe9d5cea14ebe06b45962b005b200a4dac11d38fee2583c669a06400c8ffea709e858828bcd95112d0958048159ffe2ffa877a8cccfbc462bff21f4344a8ff9001149801f97d6c8e4cd0929d762ff6270f12081d91646172abbb62d6bb571434af68721ede378c7aebcba600545cd56fad0b6c2706f439a3632d58ec40f2faa93c3ac07b6478301857f0eb034325b5f296bf2f0957e7051db3e21323c8e829cfe9e1ae0d085cd29b5a8cd79d8ff0e8f5621144fc1af206e85a267fa5020964349821094ce11f6c443675ba1b1ea4575f64f46b49e7013c08df0d2523a257d3a42f03918f2df7d28dcd8b80a47318d9e35d55b164398ed9a02319a62a372e32ba60c42283a37aae2532260e87e9f4768d5044d6fd1ae614a32b72204677f471df2e150b57d1985c2950a84ac72efd288e21d8b9750ee535e76e0c0b0c8c566479c6a008b30e84287f6223e96202ef03dfc4563e9a147908820fc09ac146e59350c33ddd10cd05a91f370bf273327e64d85461b448656dd4f305f0aa2c053d620a8dcf740f09f99908be6b250166f9ccbc585bf433ebcbf3880cf6702c437db3cffbf9c4478e0d39121fef2ef3900b5efc6a83e829f4cdd22c5ce2b6f90d79f0e2ca5a7978d4cdba34de5fa92ad2f99e79c44f3867f942d2ae3ef1d63f758ddad3f1a7f364ceeadcd5095482f64335e0d676ada2c76e492640937dd74a2461643eb1e3e90387dc800d7f44c0042b5b9776e9fa764c8f8ce35f31984f133d9783fa0f0c3ad4cc4faed195291316ead7fe9f6438e308d59b699e011c0fa258f7ac1766cd33d0ad5e30823f3b399d2a9d74aac54e2559ab9cb7118c2572187d6a0770bd5a1f331c71b89fdbb106d7201eaf4da99e8939de7d3543380da61faa19b3f20955bf397f1b52de1063c00a9ae48b951afb60619474c999f2572e1d735175115fdb7695fb695f438b1d3ff121c3d1e3892766169616d0259038680e7e2ea5b40668725e2398acb95a64aa7320d4187908e186868c11b447b8628dd0480c4e92fc6aeff3ab33691ab2f0f9499044a6bb0a92e50f6404490879a2b37ef218ca746c5da8c91c1c340399ff7a651fff2bf64f2cd80f897dfe8460d1c5a7f72232766bcbd70f476634547d279da98dba7dcf5ebd9bea646fca5524868a33c2e27d69426a50fe97a131162ff31305f1aabf7c619d2f4894d54461528d6bee0bebcd0e6e813928c88050842cbdf2449a6cc10529919d2786327727d49d8700573fc574d68e384c55cc1d306b3e309b827ee7e964e71f42a51954c67ab9daa17236504a385fef8064d7dc6dee9e879782d17d6a1e70172d0624a93035530f892fa7e7ce8421051f1e844019ec7044c46312620e30677a33fb94d94d759b8807c76eb3afeef3536f4ff342897bdd3d166fe1f5d2dee46b6f4cdbe42cd3ae0a0310c54de4b3e301d743fb7d4dc7a309fc2b701864bccd00797be213e8cbf1daf3bb6d0b0028187497a33b7c5a5e3674b20d01ae3dc6cfe0bbea30f3708794e2b6dec33182956580545b40b55b66f3f6129c93390a30851591a6d8af48eb6ef8afbec36ea014d256d6f3b994f579bb63dec84a5907f9ceb2caa03b39b6908ab2cd98bec70b1ef343fd811339566c2b34bde46da5f44ca227166c6ccd20d92142b13336c2bda5026cdf96fe6f14908bb97c976ec6ae410d04000000000000000000000000f32b1b511e1125da6a734502e3b892bd8fd8895d3e64a6c268abfd77654ccb392ef9bab3e993239364d04b96b436cf0e93a1617429096534449d7ea2a830e79e12fa467ea70e052795fd18296840198e4860441e744faf2230dfa398c4f3145d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050263c4d74101f0d2e7e0f2db449d52bddbd18ec4781d113e9ec7c200e5320b578870e0af60f1e3d66e5b9553f1ef1261f4fa45b55278daa1a141add1a809ab80de4494a49585b665d5e1c29e9fe69daf1b59a07c2976e5789142fb5188f9bc497c0864661ecdd74f45aff4b3cf90694b02d0d4f201debac5c59dad5f6d79bea030cfa3a7c9286d100e882f090b0f5bff4adc9dec6002dd694f387e270cee0d41502205f8848ba803d50cc376bacb11caa1e2f3146fe830a4d00d138b68534bd07100a0599365ebcf1792f6e3050363d5e259450cbfccd78c26419e34e18643012337a2dc2fcdd34b3ab6c82954668eb742b1e1e65ce7b71eafa9628f1f7713902e511032a88df8a0f53bd064194e9f69956eb8dbeabd37caf3455a5b6c12dd524e6e96d022e27a35807a7351ece0919958a1e4ad749801a2bd38bbb691f88fa0d8a6608f10226075831b2323321d3e2f388ea6effc8a9ed6a582d47e8760392cc7902a34e5b0211d7d1235b9165e1fd12aa9b4fc528c77378ecd71c0c5bc25d4d25dcdf568cee020e570da1ed73526aa4513896e8ef6151186a1aeaedcd1d2f50d39e5d59fd22d832c36e68ca10d475c5adff3f65ba8692b51ebb0db30e2968bca02a466766885560db7104c79910be88e792d77a4bca3bf45140b1c541adb5a88d2ad2268a811c4678c637a28bd45d2da88ca1d38a821dded489b9d11ad47f3ed86808fa44c7e04da8c834c52c91fa57afbf254fbaff298a015062e72084b28ec649a8da53addb237082137083b1f32fe944bafd9730f95e491557db94b549901d45ad63de76762d2f97fac668020a3f1da355568565ad3303b744f3dc24a3006024c46ee6569f9f114958277a5462fbc789b685a3936fff5f5c16cee5c6f2ed190b7ce6ec65f81a310e716fb7aae9e6af50ed9bd663e758fc9dbe2250f310266fa770544dcd8017cf89bd776183a29a859fffeeda1455c58482484f0254c124c120189a981a49ef0b3ea8e67deb8e1bac9558dc69582f3d538c2074557c5556c3e735047a1808cf7e305c89bd76b4704cd55c5838c43a399c88d5c6942c608a4b82ef98c2dc3e035ce667630ec1ce553ca9ae1c2d873ea8e2e258ab9b66991abc8e476d9abb1a0ed7e281e37ae066ca3860852d4bdaf1e8d5918c403a094a1badd25d8a14d5c8718cdfc10a5ad079eb2020eeb650b06fb4f6e212ae44976fc7bb725021357dcc17a3b4849f02408fd7f4134dc604f1666835ad87ddd0a271ebc435d8e5e7520c90533a2dfe845867867c72b7aaa86bc108d704fad90c306c8f7bc98e0575d19797d8bfe5c70498e42200fd9f3531f87a0c527e6b2a95fb5d87724ccc35d9ce499a0389aa3ac6a042204c951c8f4965b280e0fbc4646ecf74d671e8b854540bf60da7e5f3d40dc0b2afe48a7001a7875451e97aef139090bea738d28ab9a2908f315b83b6ca8910bbff51134f703b5fdb9177affd97789742c76dc666f2b70bde9c41af40eb4fb2058a1404cedebb23190174e3325d9bd1f5a88c04ff3746cbeb4a990499bb4f9b531c263fc0882140ef321ca252617433354a2592523400a9b049a0b1f72a99d25ccd765fee9135ac0a0838b36b0880b4b88f38294fc34049a654e4d28f95d10d29bc67657cb2198ace5f13957477190af93b6e1ed97e8f2fbc8abc77817b8132f3ef1e981565dc0818be10e1b6293dcf863fd0b9984f77a9da827e458798f7db4399eb3c0f332871723b8cd74c341034947d6938abcc47930607850e8775e3cb67b5226ee357c2cb23160f9385bc2fa445d6b8c2c6bf4bea23cbb470a6271d4cc91549d64e30ab87ddc8c3446556e88e04c4d066da939a4079d7b0dd3d29de13a72cbdce27e32c97948ccb624e6e295b8b4ef05264bb5175c7e9249dd9ffd4774b9c2d7ac6d7eb5257c74311a215f58f85fdd9cea62f961538861970b973b291102b1d8f0535e8d4a8f8129ed778d2817f4aa30c26a71b8a5074b2e967c987e7134a3453b8afb77dee5d9a14dfc4bdf5eceb2ece0c4782c27de5ff83a29bf7b4f469ce0537ec74547f9e36ac5c13eb2072ec5e90cfef78859e185ed403189ed7e4f280e4002309481d9b961a608acfc64ef1433528937f7a55ec8b6ed0ac4d47a319d29ab179cb9c15565f54d35a97c38297839b6cf1c6b27bf95b87e5082c12a8dfe161ed89a39c54fb20604053bfe8bf0c7369176b53357c78f7ca91d9c7ec63987e4f4be7b9b838b7df7d5d11de3c87aa143b5f0a05477056d889d9a01f5d969fe4bed2a8586c4202f4d5499a24ae485e11c3b2b4b28b0ba7846c1ab21fdc5bc76a3ad096dbb7d85118d461a30f608e7aff439dd13834e5bd0e885d4dd02b399a1a3d197bdfc4532ed679bcb450abd73f6b8f0ea1ff3bf3259d1469b11b7f5b0d84eeab690e5270810a", "510051006a51655153", 1, -291795576, 0, "0491eab34a35eae7d0231750f8f86d368132e105dcfec59dcde90ee8d2eaea92"], + ["030000807082c40301eeb9b1364610df379d5699fd7c6f358438a40bead2d8b09b0f687394e5be91b00200000004ac535165ee0e23c803dbea1a03000000000965ac005351635165006882c202000000000652ac63ac6a6ae90208010000000005636aac5100e42b5de80000000000", "ac635151", 0, -413149335, 1537743641, "b8db28e55f3b1a3163a20f0c72d10e29fd9e96fef8058e793eb351b712b6d38d"], + ["74327f3f010b2cfcb6433c22fa35d621e24ddb18ec9795d0d082b12d52d48ac590cb4c752802000000026aacffffffff02a13c3300000000000751ac63525365ac4b225405000000000351ac510000000000", "6a6a5100", 0, 1104014219, 0, "cec9df379942e732aba7a35b08b2ee864672a332236e67fabfda93c0bf6dac32"], + ["da722a1e02ae4ca534df85814e778819953fb92383099e75a897a71d79aa30c0bd6aa250870300000006ac536a0000531e8228dc208034f1e99270422dbc823df64a07dd7ff887cdcbbaf24d74c6ccb3e6afcc4b0000000006ac536aac5352caf11e5103131e930400000000046aac525209cf3a020000000003525265c5019d020000000006655300acac5244697487039e6ba401000000000000000000000000a3c6b24caac9320d204ad4146dc10bdf1b2fcd53878cecb6f74e3ce750838e9a2a7be36238cef7553b63d8e5a6681634a33fe1683a2f616ba6a6a9b984e07a4b2c70c8e15f52c19f6fca50cf4d91979051a141349abc35cd02efbfc93f8771c200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0b889dbef37c77e59e83b033f6493d35414a86610d16f7c0eadd971c865b6909335124db425121752bfb94f5f13a287420fd7ad107a8274dfdeae5a43d634a9bdf6785a12b765262951b742e2e57168c3bbb9705635e8b64e270abe0d87e6ee73629cdf3b9ef6a23c05dace2e629e103bd94d0fe8db32386d058cf35b177a2f021f0ffbc867628b44c06a224b5c1cd31844cb7cb72877316e14814e5a8412529f031e91d32bbff0ccf09ec2840596fbac042ec7e65b784cf6c5b2650074c4ad40180b0803d49b4bcd59927a0be16b6e6c5262f144d26a964831aa454052b2797b3ddd0ad913860ac1e181ea6f87194541e71919dbe9d56094ce37c397c47ea0d817e00206cc172d3f9ec90427c5a8ed517a3547af32da828f2785cc8a632665b0ee83da020a135b86aa08ff608108ec9c119c9a8319a136d85e8d68b5ce7442ffa7874ca703078c81534afdd48cc04c5040da4920acf99dd42aad5bfdfce0f0867b63749bb2031d88891741e63cd789f673e451bfc17332314454f804f2c9ad51b04f81d2e7e8030835ec00a37b5fff963dbc805b0654410e4764292c2467cca774e139a0a76c7667c425be70371bd0f541147cb503c7699be58970696075c9a4e1e4ae3d6a8fc8304649ab03252dec8bf4e3362497285b9a7e79ff75959eccf09892dbb1206e6e3604214312aa1391d40012852e795b8fc71dfc8837cd18ca32f7ecbe1734fb34a30322244ad5d35b212c50755ea5bde752cf03b9ed3a52bfcfb01b6b6a5159cfbe5f34771155581012fa9807a35f9a3d914909a465adfa2772c479f2608652624f0dfc4fffa7908e56f6bf929c283ed0258dc38936168f994db9fb773ffe7ef0f8b951e3e0e4af19a55cdf88d26eae2acaff0746c8c5166cfcac981677976ec5fffc65ee6508eacf1e3c82ef9e2183362ecd17508219b7474dca449bca54be63f501b4c360f60a016a57684f5829266565978851876ec88b59a3222fd480821a9b09be50d5dde2bc5be3fc568436838383ed33012bc53bac300659ecb8ce3e4f9d25f7731babc79f6cb6199e118d4abd09a4bd0a31fbe30d15d5c1a2a476d42d73949962980afc27ea48f4752daa2bf6d18285440ed6ebae68e249b0a4c08aeca75f80a7687c0d1c7f193d39c8143d7930f5b566ed0cc3cc5eab42cecd0303b716fc5e55be1f111d68017e3c5632e6a7d802455ed0f0c4fc538e2ff57c618771cd462645a1491ce2a79fe81d197a4d70317ea47a200709ee5fac56ffef0af95fef7fb975cab2fe3bfa827ff636fc8a0533288e67bd9dc2333d789a549cd4ab815e0e3ee611226f35f0e11daa5d4edcaa2e91344355070f4ee9b472951e7fdf49bf582d030957bf83817433157bae79f7e43903a18d82414fb71bbcc490162ad536144f8401d255df4a6af3f0019e12e7d5c04f7afe690375ea4136939a18f5d32db9ca47116bee0f03cc951459e647c01c1d13fc58917d375b20c2ad60b5c43709212899c862409624d387e56bbf16c18b3d2afe7b80366ca29a5b66305c03b2a2008143343ddaa014aa4f3ab0d22c45ba1ac6bd4be2d1f84ebac57df48f376f8c32a77476065a17babd700ac86302fa7912f578b3b5cd88e4b2bee172980b66a8178fbdd67648cbf6c594f341f309329b5a48bc9cb1928bc67767d5a023bdc92cb9a41125c0093cf5a9258e72c26b23b141fba83deac59632a96bfac7d1c616157c85a8df775761de925142781418502d91dbdcc49ef861c01665db1cc6d15a2965578e7f9f83932dc97beab9030d58b514a88f7b76c37e18af3e56a20097e34253729084eae5ef0c5f651883feff9faa75853b42787d12d6fe081c47168aa0438f9f91fd412748009d8b340a5b8d0fcb9c9417f3ec017bae99532c5d71708be76c33d3a3e9a5f0f6c039c76053a4a7a4aaea28a0993d1599c66b4c93599b96b7805cb81746dce401557822490634a2c8d7a3f256ea805e46d2836378fa552cf0e0ec7fa07152e1459dcd009e0fc7fe640e29a628f21da7b0e7b7bc0eb831dddd9c3483e81c101328b7df076d015a7a680764b16497f5843e11efa4a23378fb4c1ca1d70b1956cc72aa89f0855d52a512948e2583aea4c712e563099468bd5e255d430e7a94b4d80704a587d484031b8c6ca30a0d07137d6e57da637eefebcfd7ae019e17ee771b2631615695e557845ae7ce30cac56a4cf8fafea67b7d6c81e74a83d498e4a59fa6f5ebae8f87dd3a9e4e2d2abb7c37f3f0de1eaebe51df3289c2f124b143c671f42421ea6f8341e12181000000000000000026b079050000000094607a38b66c814b08c4d19e3ac06152b99cf16b95cee72cc71fb3227f09a454a706ca30f46a4e007f908cad5675472d78c0d54b10097ffc423f3d8cc105636378c03ebd47624d46aa4224f62fcf97ba281e596bb608dae71bee5f51944743c300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000da530673eb711509027530be27589469a44f855103ccac9d3b3c760cbb4da8d8e95e0e07269f1f4fa505d6af1eafc07a9d12a0d962dde3d4ddd3dfb8e7538ae3be8fd5dbd1a962cbe4899478b1ec419c7b467865f134971f60dcc563a2e23e2e68785acdbf9cce7ff645fdc82929ad91f697517eddb948f0ec6d89102185acd8021850d1956486fe3bc811722a2930d29b1318e5852af8c93fa0bc101f38af51ba022b493bd85b6a457df5c0aa9792581456a671a88856a6128755f7e292d1fe893a0a01c8fc6011278225784c223151cdeb3aabca2b6fbb9873f44b9478815b60f9660928b7a40ace62a3ece8a07a8d416c96947661a365a78321d2cad994bcab0c31022bc10ec72e45f2f390aaad9c9828d8ef305dd4bd4a12368443fdf94d3634e3ce02015eadf942dd2793cf04cd456f5cd2b6857a0a58b1d83a478bfa1f555a5042f20317f946970c21b184e180372fc91a47637e7d377a6e2424a2099aaf36e7f3f25f0319dacd451e159925029d31bc9136f680fc2fc64c425b5bb00213ae4126ddd442030de4a1c6ebfca438c5d3381586358aaac31452cbcc82b66a40fd78ca0a39344b57e6aa436f3640dbdb9ef4c1fed4ec6c0835b0c116f8bd0336e2d5a981f560ff4e76442702770e89e5b17447763b60e681bac8501ce3f4423b4a5dc4b1e2c2499241e8385864c95682297e402097ff16972e711acd1bf868588fa6c730339181d0615c3f1a1c6aa4dba467359c458dbe76c4203a1c01131439d5222feb59bb5fbc0b79458b29dc1f140a82bd895875f609d51d5917e1c799eadf4439284250d37dcbd03bc2d17d45c5c8dad2a42766c990a0247ddcfd657d85825bbdf46e81a13d2e3b8fdffc29b46017af3662418debc039d4e7c411585f26e7b17843faecc444072da0b6c8d5b682ac5b9eb903f65b6924c949042273964f0bbf1b6d9fb4a83d6ad996ce6f5faa8251873dd0b5c1d3f504f4d20c847937d5379a6ffb172f9a50dd328706c55549b5585018f40692f8e0d9baeac60042d0d8d2f1976452026d48bcd9f635650f6c62e9c8342f7571099ec9d6a41091c1ca8689134a3f56f3b0f28f32aa3ae1eaab1ff70ca6e3afce2ee707af86b5975355f5004c1456275a113d3d1f3f93dd42797f8f11ecc27da769127c2996e8cb240f0d047e960c119a43ce800e0d0787e15a02aa3b8d04d22048b639c1625ef5897dda5a278ba50748a93fa5c9d3467c66e2494a08517d621099ee10152c436825192af0ecf251628c2634add33e80017e42c693a7ccd059db476d97a10de7321026e2b71d82fd047628b816e711e0bd07f29e5421b95bea45c73ae389d997c3a67bf9e5a9a232ae794912290b16245c8b33dc96fbc14254c5d86b6921be7213f048f72d7e8b3a113d5825f1b3211407a9991e6df560475bdf0979cfb2faed53ff2c4a5e82e44f58d1edf7f0ec1b6eacf842be9b96e7023c6ba0e34ac6d5f6606a39ef9314b5bb38ba5eab9543339d1bd7b7575ca902f3aa7a9a666eb0f8caf07ca5518780dd4400674b197420b82408441b97bd64a163609e5bd28caa41d63abfcc989e1ef68fe2a9ca4d283db091104e148e7978f1f3c469bac68fd79e960fa8acf823006c9f6152c736603c4f06e838655e12af720df572b190eb251d4d88f68da538b03a240b02ee9e6c688204205f98d1cf3012bfdd497c956d3a0e0d6da9eba96949e540dc95903a4194cd2c3f843f3880965711c889aa6b6c3e68d0a48319a7112005e24d71dd283808f494e7c2c34f142bd3ad4046fdda332f03dd9eccd1827ad792c2a5566866094c1bc053721370e6bd35034ea3beb8263557cc89a0af039209efaa24664bef97583a34545bac2aa0b5e82720a7a85b3e95efb4b396a534ba0f5d6cd22ed7e0c83c488d4cc53a87985aeb1eb2d3c7d071d4b682a537765bd983f058177d9d397ca43bc08221a0a426239f10fbf5da5624d7148a1a0fd314613625416babb495d8bd000f2ac67515f434a3002a823fed7c9e0de832a57e21c470ce31e1d8287c181f5767585525ce79b6a72670c72c263434489c511778212d590b8ecef4c7bd82a15243b93fe03fedb68268c4ed103a760750525ffa1ad09df738c6b6b61054ea6e7924e945ac8324e50e7a1b4aacb255f5ba2e9011bb94009ac98c37518f2ff6000986fb482c5ebefd31fe72d2f9d86b29da63e4eb56bbeb20881ef3c9cf5fa3009c3c1534540bb8f3851628db48209c44457163426c6ddeb15010281876c5be8dd0c9bbded6e5def26b26c55158de9d00000000000000001ee2eb0100000000ec6fb4eda6eb77aa5f532554972d303e9565742f2f454f38fe649c7a7e6de65bb699f7312169d7cba818037142a4a1b5820e0ebc9cf974058ea41806e2a77f3d0978028cb920b4b2549d8ee707f59b7781b74494dcc74cccca45e17d244d273b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c3b906d4f93e29ed56e98d5148ff1bddab5ae32fa75697d82c64ed6267be540fb8ec9d41125551c78fcfa5b9b08b3213818fa4dd299f826e042e13591dd3f2e4e13f5cdea5efef44a068c5141bc2fba03dab5115b0a2c40aec6e7dd4376cc09867b892f4be4ecf7201212460db84270b2d4bc9a679c52d7f551ed4aa0d3ee0130302aab15638bfc47fccbe5cb10ab56cada8f85bffc18f99d815f0b745dfc84b90020b210345dbba2dbc0348fb8f2837ac704d4ea33d0b622658df88770df1e442e10a00f989e4a75160e8fc7e799d693902b4802f303ad03dcdad64b4254b11b53fc36abd6d25bb04de382261ae16ea2bd6105f65685c6e2cb3572428238a833a4538030ce8452bc81bd337b8855347d88e02fc641f6a4718e80c17114fbbfcfcbd219303027eb31d32efd20b5482178dae7f37de4fcc03b275ff92341ec85f5f928a3a9902303bb354c4471e5e9f161efd2efca93fe1772a2de922ffa2cc100a30b4d58e3b0229b0683bb6cc3e21605a3de79fce647dc6568b747be780b147990c46444b5ee6032f073000fb5d4e443bd07dd2d798f4913af4b136a46eccba43e08e61b93d2e10a23af6010af38ebfbc5a2c1eb675f9b1754734a92a7e3beefb2ca5af9c3f6437eb5bf7920f79d5782478a6973ac961073fa2e02ede5cfd8c893a2d9ca6ceeafb742655e50a5d1adc623bc15c1a308ca002892593db9e8b94f2b4bae47165063b87a9683a141e57d2481413a65963e1e0551d5c4e96e2f28798622b4edaf333d03ec53a6bf551fa13b01cb78c95b86247c6811d02902a4611dcdfe2d5b56719964a967178155f1f017870aa047188e32e1aa98cd5f70954388de0ae973ed78b82d19a7cb551ce3c0acc7f635a4f4d009b28b27bad9f378266b24177b5f17742338e3eb9b8486f81fa43bacab7f8a923d8193b5d4450ef9e1b42a0572c1667a8d9ab4cb13515a249a76ac528abd2f7c38dbf3409e25073197db5d175328d9f0f2d0450b2d78f61a79dfe0fbb20ea6e00e41afaad4146d23504beea93a812f0de96b1b9a0377d44cba8533eb8eb92575bfc512809c4138e88b121e9600cf0468608ebf0237b980a9e6b9f4982d87f4f4becfdef79c89c4740b69f93db6afa1dce9ca95c2c323125b262e7a7e5cab2cfffce74617b8a30806fe69e173fa757cdb1595a7994baef1fccc304ed627a6dd9ac29b739a09a04afe123645361516d3a615a604ec6ecee9706451e96dacfbf98b84cc62a29320368b81827f3843679b124aba2de73ffd36427f62fe8984515bd0d9ec96e66106ff31fb3ccb1f1e8ca48fdabca96975964ee13dfab44d4d479d4fecbc67b0c20e189f4ce59dd1b124b1813e1d8a9bac8b5e31debfe578e7d7b53d861c9c9ccf3da93bf6ea5a55d740f686f525da0c77999a26063f8e5be63a75019471d7b2081e02ee25c45f0d22ad7f187ede468fa1021cba7f640f33d028cfd44c0f21151523b4135ef1688c13e9ed5c43f90bbf6ce0ae929b63a3236316e4539a122596ec8c11711cf5f8dfdf137348b4e884d0d5c04b0233c72d177bf4be8756f2862737c39284035d631594ccc3792c934103ba09a008be3a4f22c4d4f61c5b1952fc32baf851b1047731a1017864d1aee57f43388d48f70e5aa2eee988d6c9926d4dde1811e3f0b5cbbe59a0b2d28537094de329dc7730de98694f7a21406eed019384d2c7daaa339bce8c579932edd138100bd01f2cb26ae5bc0b02a4f34a8d11e6e6fc4d71a3eb24dcfa643c45c80f070fe15080050335cf9f583d4e9402aa8e2fedc324e54d13885bbd92b3568264797161ba18c33b4388538c9fefec54c31a78e7085199f303c730e0c3ae0e3940547cdb79fb33759a65b2b02dd711988723ad9d604eac11537f3ecc11c3c612905c96603f0da47f70d180fed2b5a59e4fe2ff5d2bd612e2e32701dcd837997a60388180abd8988dd924f7bd7c32ca8f86637bb217e5b0838363ac119f93daa482647207bfb270936bf785e8f01697c7dd98709b4d7cc3f259ba7c891a191eeeb4dd4ab967e2a9ef44c8be729f19f2a00078e68b743f023abde99b4509cf6d41070782ad764c978a8c8be15b470643bc616bd5eb7958576b89ed8fc2162e764fef786dae7b496ceba2a5ff35f0dd5e1da6071bbf43c27e827a4b0d37328cafc2466e3f1508d55e9c01aade956d3f886e06d965eb057a61c40dafbbe5c9404516a768d7aec974afa4fd951e3f1ed4b05d3351ec0e76b5f88cc0012148ca7571fa8b70d8daf2565c13116d501738d8eb3a3a3589aa939faf41fe2f32ed751ee1107f3092200f3520c9980a54c958c5bda3be4fc2bbc45f9efe97673e5e7edb9d7ea9aac796645ea7b32495b6d5663a05816b9376eb4c262cd3b1f3c0bff2f332d67dbaec17813e1ea3fc9a971fa276677cdd70f", "6a526a5363", 1, 1954938644, 0, "5405bce2a43b96af8b4c19b913f4b03be6e13e98107532df2f111c17fe65f90e"], + ["97328f2f01e5eb739a8b22f2b3f3a3293d2c193536f682d61683b3133a28285a2392a5ff8800000000086a00ac6aac52656a964e0b2003afd9400300000000036300510146bd02000000000552516565008c0d2e010000000008516565536a51ac630000000003d8aac5040000000000000000000000002ea2ffaae81e6feb7d39ac8254ddfad877934996d7a840ebc83e6e31064952884432bdc96b9bf86d1c0c4e604f2bc6477c2c188e4315018fb473a216d39159d470f2246c631d4f9456b740aa388b4bd3240592c8c3d16e20bd9457b50f9202c7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b987f44ec24da97119a51ed7436a4ce5f12193adc6085ef978e4fa09bac4a09ae57c9f21a44000097bc6b9d90a0567df0d7e93f93035cae75138b7368db32196a8e2aa8006fbafba55df7fb08e8040d11c6b2f018a9a7aee9ff21cde64ce4fec7e390149b1b028f7827bbcbcfecde8ef5d04f1c57c2e7d8358a42af565858070327b0d360fa90f5604f7b6be3d40068672b27e7c18654af377d01953a07b7f740031aae28f7d9cf773dad3657d0d413b7c05d19b5a1e9368d60f74315f59d538f160a01c52186fd32052c7ee6048f1427dd542d0f4a6cb7738b5919ab2e31d3c5686f1b39d31c0628b18b63c9a40c01030018be44bffd1c0cca0275ddc6a147b1f1420222cc2b0d5c9bc9169ebfb00e408160bc53ef164f6aacd53d00fb58bd4f869586020ab3a83a10b6f5d375d8038386f54359111b161a6b5deafa88e5550f683d877e03168974e265f0711bc837ef871dea9916a7bf2d6a802826deddc45d03990851ef03114f8009336571408ab82ce98c631dd7691dafe3389e4fec7737c202f14bcbb10221ef770ef221c91493df3262f8d318fb7f16dd9a4dc095ebd9d6351a2d5a951fbac558adaaf19551e7e9788f547ff53ba8a67245e6a6220ab82509699f88a7138f7a84d771d5a623518c4805daa8b3a4fbb2f1aa6fa721703d5e23faa2178869e3a4e3464349e3a3ff0c034a4a1b2b8c834ecde370398ed40625f01072ac4ae654206a0f7b7ab72074e606b1f2e82902851c84c53dc751611424254b1a9a86b3202db206a32574e58735f5e7f6da832861626d43a171507c707aaa25bd9586747bddf513b1cd2c74b480ea7d304558e4c4e6ff809a117812f7ddde74374ec7dcde35b6a2dbfae8532496f975409ae286d5b32f3b8947cebfe6771814096444d65c7377cafa1180a43c898fe23441cc8c2d72c53ee8ae7220b73dd961db868fc4a5b61b7cae42991dbad19fd00ffd84a244cf6861895f7bcf1e8f7368dfbaa4db8d34e3bc85d0887fa6cd53800189ffe74e61b98983823dd004aac6d8369cd87c62a287c724accdb0571b428841cc2f0be2ac8c7e1c3d2111f26b4b8f4c6009ff92651bc1cbe3e6b27170106b813a85fda2e9e77186d7fb9d53452774960789b6ad9ce2ff54cbc139c2bc86877bbe2b4d2024b4aa84383c2fc56ba49a6b896fa2ab54660988af85601036555ceefb790f984f4cc7034007ea37d0276fa18839c79cc26915c8388badf100fec3f37be76378fea321e40b79903600f3227bfe66262d92b4231c9588cdccab5fd7d2f6d33b0d9d7295d71f494a0b565c87e63dd61c7c68b55be71ba2a1c4ffc006222e75b6699cd4c4996721dcc020b7626e1903d1f98601e3e33df54d95d4f5c280096fc695a942f4bd237752e764214003329aa824ec121ca1f6b01665fa6dd59fa762db6eb513fe6957da35e74b364b6a14c5ebc0a8f6c13df1b39e2c0f15e7803d94dac7bb31d9ce5edcb470228f7739063cf55a0d2e8fc1fe6d017d38f97689870e79fac2f9a0c7deaa7d1b9837da147298356d22d29e266b7cdffa8acc76844f70f51fafadc49acf46afcd8bb705dd515046531b0e045926180b222058f3e702b21dbfc439119a2deb1770e87a8f43fd55bf1d6682958f756c7e565635032d9b13a2ee287303352fafed76260a9df11691e90bb8460a825903390c172521ed7ad9f6dc541a3c8678036dbc964c66741d827c1dfbff96f80d2597ad0903acc1326d1d6e0cb4e5777efccd2ad2521062e4b54729974c8a015b8deeac1145d6879361e18b6ee4bf8599283bdc960869169eaa32f4d97d179da4b1ef797a5764519dbaf1928d475aec7fcda3c1396b6ffba32f0561c63a1b84199cfa851c3ef79dadd6294ff2d66a18484c7560ae2b16ec22a21a28ea5785010cb942e75ba35ef3955ed5fccb3f29a456f705727e1f961efe6527e3491707aa7a0f8da0e2ac093a6c559b3052dce09c9d6d65b181f9ae6d07976445bd251a385e4e581d1eb3ed145aa0b3bd6ab8dc014a5a80155ce0ff44d348a44db9568aa45c0c941f59f58838f54449500cd9d77db0e4fd6d26244aaa05d8c637faf1dbeeb0dd2cca8ed4034f33e09da2a918a1898e399278a5c8821fd44c6e213ec2f429a3f627944fef239c8d4a93927039aabfa579bf71f045b02b202d374ac4f45144ec27abbf78292a9302ec08f79a7f1256b0bd8baa53c06624ad3982f06a2493c2e266725cd6fafe361289989807ef433b0a6a30c4c8ca326313c13447fcc881237ef6a755c76379cfb5656a439c5c32c60100000000000000000000000008c9d5bfb2a671e20d51c38fbe9bfd5fb5cf96a572fb626f55f90a42c141e619fb16b7a28c0cc29e9d11ecee7e6185f4f10de1e39faef139ded5831cf061366f68d95ef8e7a507da9701d0372da6b41196ec499b375ecea29c04743b8ab0a0fe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000144f03419b468efb6f690587064b8f8d4632ee65218bd60aa2d86a01d394090f5ae090eae2f7f070d99656408acc21522577153adba5037c5d0bf3a0bde1934f4f0adb2eee841b1b13c9661651e755c94ad960cea19cc18f281b22a15a9de3366b3dfe01786727ecd846dd99897e08b8c0213b72879ba2dfd1402ceeca00e84c030886376c3502fbeff986a2e8ed428824fae4419c8f111577af2bac4e3ee11034020d38767334a9c1cf847bfcc06d92632bf47336a7e1fda038a1d8fcb83e7fabe30a07f387961c2c15c31bcd438e02e5c06ce54aee05e61d826e8010639631a7ba245e146496b3c685b13ddf69cd3d99bcc85b7699fc22ec93a03835bf564ccbec59031ffac2ec27087517d5ff625eca2068cd6d8c4d6d8ff67dd4c9930c581c1a94a3021f5ea7855a297c7aba4d886942d1a712fd643f4c1b98678fceed14195f1002c1030d8c0212d9ac92e7ea75cceabd6075493edfe8b3b0555e9d361ba5726567b074020714da5776964ec238b271469adf45fd55db9c2d221f436b07e704859fb9d6f7020c30e98a1273b45596d360d4da13f52ca91a9190cce26ba173c6b4737fde42ffc776476d30cfe9dbca217332de282b4e30eb5673351e46bd02dadce599e4daace8db54faa766fb905058096ba442d99e8c1db44d361a11d706ad811924c0ae2bc1d8aed930cd6800cabc9fa7f68bb478ddf919f19f60cc42b0fd9ffde82f7955cae60d689b5612f84f7e5cf8b37880ffcf00dfaa8fb1a448aa440928b48c7c1d371fd36574efe94e05a889ec29cb4f2af0f3e2437bf4d4d5691f405f26b70dbb19c2ddfd6a28746da6517588dde437d0d9f92877f01f92da7ed5a41e13cf07d881663341c26937bae79a6ed3efccf82eae8f34393bbe4f7c0d52e5b7ff74d851c28306582efc8e7b3277a95ba1c1d11cc623c684363a4dde0f082b8e0d0f20c60d5d8ff7be8c7a6f6b9eda8ab2c2431684dcb6613e76ae4cafebf979d7b0ecbe43bb8b65e1fcb78889f40e78ff7b197e6c78f03f1a76a79655f56af4f89be579ffbd9a4e79f30f09b329deac795eee13b12c7e2e1f8ec4805ac63e71d054dcdd74719efc65482fa27c4a3fa7119f722ff232881a59e6ed35a6ae0c1a7ea36f6c5aac59ccc3e88763cfd241f6227eed522d9e21cb75ab45485cb59f04c796213754963e68a71c9f68ff9bc24d9dbfcd919d1b8533938dad03a490f7aa8e12c03896a670457f2f14e87a0f9819d4ce571bf65a3df73e3cc4474b4ee314d93d76d610e8b36b2e6b38dc70f14df027e280587d14b96c9a5a49487b1b21861017d46cab69aedb094f853e2bc904fbc4d966cb8516ca3fb37e5dd1476b4076614a6fabe611b76666fd3a294fc81963817ce6b75ba8269ce9add799a02f063eaaaf35767f6e2c4cf6e6d60b5d2b8764f4b1405e2c0cc8d103638aba8b1f403effd2e05bf30446f0558b6cff7ecf3718d860978d75d33184b5698909d1e8da0bfc5d098b68b030f65f5794a1d5836d190933f026ae66d53ce848d2956ba9801eaef31be501319e06b93f096ff96bd65b850c6b596d0f6251fd9140ae93fdcfac493b72fa1705f435cc086c4516a8ac061c445617343ffbc9d78300c470250a4f8b2fa47300630f4c950a055a3c96dadd99edf3da55346c50febd42ec894dbc18bc2c5f0f281e3baf5eb3d1524fe753c98cc64a337e26c3ab5ddd30aa84bd8dc496d107893a942ac83d9dde211dc4217a0c0b88357c781d88e2cd03ed7a490664e7ac84ac0bda840c30d570b700a5c3f8d9fe4514cdb1fec3ee61630ea13745dcd853a96e6e45618f64397ee4cc44220457a980c662468314ac5850356e94763c2562b1c08722d4391a9a06a03019903a8b989e4f8c95610fabadeb13618cf2b22a808b6203c37bbf3f94fbe8f956469a6ac79a2ff8e5af0f7c5dcb9554679ff3a1a71c12319e6316132fc5216cfd4d658c4753be03972bc512d34ddb4118164a40cd772072c71ffb480cc7e609fc56939c6ca2914a990bb35f898d1aecc4cf778740ce63f2425206bce0461f382563cfc7ea3bb8dfd17d807a7c494a4000b2477734c52bb602f78588d867ebd7626d77842e6175004bafbbf4469a23b6ad1dfb2cae8cfab1ebd6159ed8e2990ac39ccb8c7819a7c305b15a0a32f3a734d89668028928586a19728e1db59374c5b5d1c7088b5d537712c491a18ce60f130ee1a9c3ae66264c8ef5ce509484153776929e869b3a560bba09e7d2cc17c1044624f13de4860f9fc2fd8d86fc7ca3b978db9686d7dbabb10d00000000000000000a70af0100000000dbabe7b0508844a7e595437e1215bcd7d69ebb16a19613a91f3f6b3bfdd497c34ada8f4451aa6b0aa0296ea0d50d632fdd490c62ad1f3582dc8f4d8bac9135c4a7c4e1828891176eb65d7272da4ac964894acee33778c34366a7ad4371c5cacf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000481da27c160d528e86164065d9418e10f0f55fcf98078d3bff93b4ebfc174d90a1387aec8e5cfca053e935d1a018a971de86200c8a8a89fe2a62b0b3490df118f35189811f089f91891228f73bd5e83874d49d13db5e2eb1a1bcd8ef5fa75f92ad1b67b55dd07e2c4a2cfe1114a877be32586c00b59427fb5ee007fe297e4bae0319bf63fc89e999093d96f8d0b177c324764370ad31ae30eab65e1b434ec3806a032c99ae8d792658862f14d3ee8606f643a2b418a149acb64e9a2bf1719ba4be2d0a00c85be13cde4db126a154fa6b8b5424eac7fc7a9ab90b61e0fdc2f53f75855f7147d939ab9c4dfa3f4ca2693aa092cc90f2673b49fc17483c5db5f8efa377b1031231644be6c3395c14d312b6ff579feeb89add5ec9a5fa8e6b290a2bc915b97c03199e94e6d4fa1ee12e0b1df3db1b42b1cfaf9fd5a1f570a30d39eb06f952badc021311beff461fbe49660eed065127134b28b53b7216046f16cbc013f996258243022ae7f7e277e459b3bb058d93923be6f64682f68c959c3b8e9e65698526e486570300b411c4d9bcb3a818fe24527ff7c80bfc8cb2b63cfa43cb76a9c76624053f665e680aa1eb912b13eeac384bb29200e78aadaa05e304a294bfbd1d94c02f16ecf5e4a96420405f4124c4b914531749eab110f8f92cb9b00f117858eaa5173bc7d7100d4567877c47e8fb0b3f411e3bc857cd2674c6690797cbfa4e042e5e03c13f1ccb0f3c4f701a7761e343cada56916df3ccedf437e1726ab747e405e8ade40fd0878f213bb7afa97fd2c26191c93138e5815d4c2041ac2c4f6708b802b9c8b8e571cc8766f54487e631014502aa53909b8fd3cb522dcc7b3c41486c8ee5964979166fee2fc9889fe309cb907bd15e1ac2d92c2ed6c842436348b0e01964ac69d4ecbe21137c56e8ffbf8b7271fd963dfee3d3329b0b3eec87c158f87b21825135439e4b55a2807c83c3f6b9452ea7fd38ae7d52e8f9d74ed248ca273d47943320ecd906b7b8746765a8581876d564b6eee2079a389cc2b4f0d77b2456da4c3bc5f600fd83d608251464f14d0c1d17a2916bc403105c6ce3bfaa251dadaf77ebbf4acd871c91d5307d84aad4f3116d01dba7e97d751434b793f15b5d80b0c4d8d49808139b20092746aee72ac9689b12af8c90ade54c8d497117ed7f28b03833d629776b75a989757c12558f66bd09145e3fe51342d50ef3e004728f9461996e4aa3d70ed8ad13962079c3fa2742e84a72dff4c8927a239ab280b3516e043bf00997046bde966c4fea2627cc4dfa4897ab5f2663e516be6b73739315b4aae49a47adc79f3ecd5f274598ae260f16d13e2cafbf71f59da044163009c571d49b1aa959678267b1ab54ef90f3c734648536edc06b17474b173adbc101a59a47885a9eae902978c112e279e0cf01f617d7ab32b61b9cb70e287552622e77360eb95d27e1db9f83fb7218c02f37c289f32cea4c2e9d7885afca51a40bd52cef9a1426c5b9411e0c11866c5e523fa8dd511754e585e63b1f0676d1c49b5aff586e79bc15d51010df4839bdb63e693bd49ec482680f15bfb62c8f25feb28e869c2fd4f88b4362ddcf8cd83db02b4bd1792e60b2aa16870095ace02e21777f2e8f5d9b75691708e557e001349d5c01acf595e4d09ed2ba6ca6032eeda262cc7860c04c1231fd223b36f75acf36ebf530dd07adf06a742b9beb3d41d2ed5261652a956142c253e91dc915a83c050f159555dc7f6a516e5e590c3812cd7d467803913c093e609133d0ac7042f776472a090f919f52daf942ff0bdafbb8b3ffa1238eb63ad1d569aeb4d65e1136e006c71187816ee9f80a71e68eb09129e82c770bb9e3323fa2217712d0d55d7c91744314e76b9162685f25b3cab1d0be2f3e7e185c0172172cb8f0091659447d8ed2e65c990f8b68268a1defb4b14a18aaf3748f7f052db73a02f75831fe655554c9f56625f59d143c6fd3c18f40e70c4961c1fd45b32f470b46e6588c5a60c3aa3f4ae70f3d2624e9cb68b64f7c8c39562293801c24c7755610102a64a715117a9526ba8c18df83bf22905c9cc1c6f58d6f7466df17714817c65d38b79b823e49ca8412f44be2792804d5e787fc4ac9163d80038ebe840da7737bb6b545426f105670fcadea9d1816a0db0ca60cf36a5bb1b1211240e1e106e3ad740427de2499b3cb844acb19a54abeba2fca872f2a9a4adf96762f95af5ceab27c84fc9f540cb15d64ea68764d32109d83915a77d23d1467bfa3cc558060af999bc644e732116c4b20f162940a26bad827b86c9431c7d9f895e732530862d7e1621a16bf042ca6a902b0eed1f69b26558607e138311b3d65198c615af4ac3d05c9f5f7a8f6c94e8d8b67a728423c77e50ba14f22d22dd978a51c6d96379dd7553c11efd488637e3df1e8f200b605", "525353525300", 0, -881952397, 1537743641, "7b71f52e8bfdcdffd88b6a25f21e9136617b96c7d0ced1316c9afc486560724b"], + ["2eedb57c02f1f4fcc503dfba2af84264bfbbe1e5b5f852c01f05625f34219670cd3f41cc30000000000600520063ac6a8d06710cf49351c44555fa07b019d971fcd4d3446b0c2428ebfe137af8c7d7b4a3cdf6540200000004656a53acffffffff028f89c40400000000065265656a5265813c4f020000000006525151636500bc2c515302000000000000000087687105000000004bbb6bd7b3a8b21d1431f306b7bae9879829afc1bc18b2ca0c45b7ac3cc4f8863b69c1e4471f02369c50c699584e1e03637f8d33d022ea4a95b350f0f5cb67cae7fe8ab64ad1ccdb9cc346c1edf79b614e596faadf787adc9031e7fe7fe624e900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d2de90bf5b21ea98499155697b8b387393b666c54104790bf6fa0a52386aa0fb4d51d2b69844f4951f1b2c97af5b3485edb9a9f481ecc95ca2f3d93bc796fb0b7eeae2193766fd081ecfef315d9ddf3d6b6561d3ba1e2862c3f5ef00fc69a291e318e3db8aef29ce06c455637274ff61d044b5f7f3899158431db9771ef285a1030308ebadab22474e40ebfacd56b9c53ffc36da09f4504329f753d3b0aebd6ca20207bf1352ec9cae8244c1f5a63db338212a76606255727e5f2882540a2144db930a04724ae62fe265a93197ad28c99bf868c37fd915cb386f201ccec07e17b602d5d95aa50f410791c06c3fff1837efa00ee98f42124d2828c0cb617bddb176e3be0328af4ad93896d6e370c2033246fbf8b88055e61b8e681dcb1b0f27f6ebe9a94e02035427954d25eb93daaae98edf77567ac39653e4f1931e5052e4a6527132479b03030b050d1d7dcb444d58cf85d05e72d0040d091db212867b622da09a832a738b030677fa922383d4985b70f759cb7f257c2f05468fd86b8f1bb02fead40ead9f780216e8aa5d42cb9a1fa3231b94e4ebca43c97c531dcd507c5cc627d3bae31514d5a8d6d346fe1b6c0b44d364cad82eea6504f65b82369ae4abe4f2f3a29a551e686ac6749421858493645741fa40814a54f6a190fb9543afc5e6f4427e190be30f3a1eb5bee14b0dcbce45caac0d7b616cbeddde70565fb134c105a5409b4e8ce9cdd4bd4e2d7e5a4fc2699532fbae6ff8c64a3154fa45cd205e6d22f25d326a182e851e239765e238aabdbb958da585303336896d0bac499b4ddd11872c4209624043409d01bf6fca60397b8540c3cb958cd2bd3a5cdf5d305d95f0d767535e2a6ec3a19f7e1de77cdb3e8eee64562c5bc6ed0ac553d1eb16511b123e99473158d21c725affedebaa42910c8987fee046f6684f7b1ce51e3363fed46f56b6dc1e5939b10028179d7e99e490224c643e5d7133e6a53e1bc1bcf051b99886ab132242c2795f9990e6db8cfbab25ba3d624f676ad197abec186ddd185f10037f5610a5e74608df48e984e2062b278401bf40c04c01035eed241bd6972500c97e7a53fbaa33fab301dc2cdb9192772af01c52fb4f3cc15db9c9ccfd553ce96fc80c56b7b7ca3b95506fff4272ea38a5c08dc2ca5a38663244d5ee7244b148dbf9cdff5bbfc0ec20382690ce84ffac5cbea2d1523e1a772b6e9853250ea1fb9b0c168d95db19ff57446596333b2ec7d55e647a716dab0e9708cab2c145b7a3decf70921b4dc555b628cfade9882ae17c3983c62485747b1f06930581aa93bf2be6e2a4121e9210f27a6c1a0957f24fd78c098930abb8aaedbf95fda7d8bbeafd76bd3beca3b18fdfe84ce53c33d02396f25bf3f450ff6e23818bb360c670d94a6cc49f17151039c3a0af5f036945cd7b11f153540d0f11d5c725e0e10a6d3af09ab42454c7ec8df7f24b386cc90bac812c4c0e659b7fbc339f77ff0f2306916ade3458359f70496de690f4e6fe1e9171c3c912c87597e6be88cf6a2bbbdb2256056e1c51e6b31bdb65d5f868280bdcfe77cde062b0c7b88876e710ed0eab1a7fccbb4b25cb57780fbd744e89dfd0cac4fcba58dd33e38c895646cd178e35a36784a8484912d2b0195919f7bcda33090ae0d14c7010b07c3f5f39f2eed0c4b929719b11215d2d3d0acc3b9963adf4f960d8b16caf5c1fe821cd904a36e652f2aa384d46e9df01ca912d14447b731b25d30ea5811b3ec1fdde2687751918149ee790a120f07885bf12ce4fba1b70a836f8e9b2abde0f7cbe3df65fc4ae01433bf9709fdb2cb1de24384a48e56c3a72d64717d41e796ff103cfcb845703f881f65bd7982a0082b30f3a68f9f70c5da64faeef5ad33f2ec263cfcde56c18b80fe8983a0e68a833a8605b71c4d8b47565d4689299fcd56a071907a29a45c70b803b26ac092baebb48cb23779c074f61bab661a69e6036c18e186bb01801a60f730c1f81990458e3f65e245ade9f9f0bb28a68b0e28e303f213844cb83b48ab56b5c433c34eec4435927ea7f9d9f88587ed1f3592c5a462909b8cc55cf7a74e852798d6b8982a4f165a37635befcfe3d794428efd50d1bfa22f2470efdb6df406296d8129e11f8c124aace4a2107dcc2e9bf6a6747461613f08899469086be1f6342223641612e2c2a3f1c40abce6aecd25c4ebf66ffe5484242792ad825564cc0a51c6a7eebbe4ff61aa30367f801841f057297d25945aba4c4d41c8c3a3a60901cd6c861c76db27427db0d7c5e1d720d72d4c819225de90000000000000000f262670000000000cea4a8bfca4382911cbf87bf1dd4b21cfe7b93b353d226094d78de0b46aad8f9b0e0fd8a17ee677611b6e89313ad265aad1a8991c3b27b675b052bc6fa0d526b5ecbbda2e0cb76124a73edafcac55702104a9aa89d866ea2ed7f29baec84ce2b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000244a55efadf34675e47e4a4ce42c4577671d69a40dd8fcc37c1a0737f45acc39da79d265c056457cf58249c4c65db42396d3cae99bc0874ac247735cb3c0f1255f4ec6c9f6ee744d374082cee34ab8569ccf17d53cca9917358079565f810d92156e9199657778eaa89b56f704e46cb97b9a34c71dd3093588369db7737800802303b28b607a20f518a93d79fcdf6ea75c3a2aa7779dd8ec6a8f1d5484fc13e07031f9684ba5f6c447961b8cdb2e19737f946db57b7e128eaead366fde10fe9d6ee0a082d67e71c9a49e588de1eea19a9fc8d2c007e9a86b8e5bc343fd060e5fb98954ea7f1c7f74c955caa948c5bc341aac178999d6e5f034ea3ce18c478bbac2c1e021666653b7099ea504765f0fc0e6cc5fc3397492c48e60604e0f4e5343c4762350203e0d481959f95bb482e7e0d22509ac9a7b64d98efc182bb45b26a75039530ad03021f30999e598788580bd28eaa3b05bf9bc05b1ea998303e7036b1d50205925c021ade0d01e89e6772c1e5efe7436638dbd4763b9d4c8a756b40634e559a7228a8031c843f40cb21853b3977a2ad32872740d13220a6363788d4d7e884bc912669e70f85ec7e321860bb326633f70bd4d55f36b45c4e4378602c9ac98d064d8a6953f7ec6653d5d8f463e9f373dc8be3d4eacebef24e7845f20aa1fa1f03139a98940e5cf9542bcc6e359df0456d937922a8596565248e22c3fe1954daabe56fad304546079d3fec97aaa7b2b66c86f75c3cd0ef546819d8d61380330625cd7527adaee0875e9ae2d6d3a8ecc6f01feffd8c17e9555fd248e195ba03055e3ae10408075ad3f3722db4f74503523e87802acf67a97147a2e1b333e98afb2cb95e6bb1f3b0ed886f0e3861de2e2986d7eb11bb847776d60fd00e6cafc923200fb13e17f59ddccdb828d525bca22941c87f160ad3a41b87db8d2f258382ebe4aeaad4dbee05c0d739834a836397fe7a99c7b787979cfce436a92c02ed3101a5c2a7ec7c41f4a8b2d1901dcfa6e8bb130d8817c496933c34079c289e00a42609256c4684a7cdeba4a4e723531ccd66597e41a81bda5842fb1238b6c438744f67ee7e048d16aa1921415faff8bb3c12ed9b561222f400c6a4869ba6dab225c04883ffa59f1d73d703690319633b641ab3e987a84e336bbaf577d58b623933cbdd2b3b36e7d1a5fe2ebe208944a52836683bf4601919b36e44e6853162fb60037cbe45f861f7bace1c47bb29b26b98c2730e5ae87a2cb9bed61e9f1e9ef75eeee5099cf340a070298183c8b2f554bca1a4ce0b10f0538888e3d65b477711417b9809b8cf3abab421c18911a84ece3637cc8554785052008630c67d5d13e4d41d470213c13cc1410f2ac35f9214ee0a057786e5b06c7b50d36679bf56808530c1a67101603d86190374feb413a891b2188e599e2dd2f8e5e7685630a2a24d17c0b540d942a99db867492339987c4958e97a8840f716f2ed088fc5fe1efb8a873d5772dfd2ca26cad06845be5f62560b385c41bc33294be3c5d4293ba3a33dcef46ddddbb6f048f66cf371fac7b0a8282a6d71f499a6ce7757fcdd4b7bcdd7ec70133a9ff1a1dcd336b8b0314c8d99758e6312ecb48c539238559ce1652ae8057ff787787a9d43c5a50486215e9f88550d0209c521ccb2658b735665fa45d3668fd3d702ff6203269f48f4f14d2b79e97bbf1fc2a2d231af50990c5ba0225a22de6ad0902b758fa544c9d51c9a388a7fc2b7d9320c99ebf05f4d3f83f414596cf9b849e917637c9c6baec0716f5f74a518fa2d5ada7391ce2c0b41e8472f779c75af663a54865efed294176e4c8d7bb5d8fd341d5a94db603d2ce71a897f0db9389d42a39d8e2e0dfe2b21c9b044a3b3ce55c5618a74d2d7289a6d603f55b2571759e24d3353fe4c4718c37e835e40ce642ae480476568b1625080210ada5848985f17e9ee49e80fd5bb0e28ffa4fc4e68efe0811bf8ceb9c7d61421680849838ea7fc1d87f89b20d91c1683399be74c0ac1927421987779cc334cdb7d7311f4d76b828c881dc640c5013c4655f8f3310cb10038cbbf0036a97414625cad529c20db8dcf5b9f287f2a0b75453d400bdbb33bb0edeb39dcb67d2d503d17651e5e872a1679ba0bca43100a38d7683e041b0793821773dead55a1d1b910e250b211e41179c367047c60bda540cc9031fce258b57dbdc60f2c1b181052682ce8b6ff1239c938fecd8f68b28b1c11b091b47f4ae314432c434bd38d91853cc62cd07bdc813848e7cd283ed8456fcfb0f2a94213887416ddb90efa1a7b4d51ae92eabeb15afd1b4a298ceaef2645f7fe6bd5ec65e988ac7ba8cbc31056dd4f4e9e6c678a7ec942664e73924e4ae4c74dbba9cd49fd87f1d19a39320cec0c930bb95e15d22afad720dd4e25ef2242d50637d13bfc4f6919d3122204", "636a6353006351", 1, 1173042975, 1537743641, "23c2da6086703cdf4e993bee0a4b9f0496abcbc9b769853d7e9ed6695d5c29c3"], + ["0bb4ff6f033cd6f0b5ab80b76fe4901cd436c15fc6a2b60607f3bc1a6b8af67f676d640ffb010000000151ffffffff0f4313e2bdade04e6393d4fe51a07c443eee2aa83a0deba2949ef84d08a445fd0100000008536a6363656a6a6a4cb5d6df5dc7188cb4d5c153c76b0a019008a8ea7e0946e004b1978ee30895b8ba4f3d1e010000000853ac5200ac636a63ffffffff04ff66430400000000035151652b29e4000000000002ac6aabf699010000000001ac11439802000000000565ac520063000000000200000000000000008d5c880200000000c59c3c072ee46aefc5e481b46524d36e48f18c6735452a9bac87411de2818e341f7a0eb02ee3588f9be55101f3f29047740fd0bf2da4d592e00911d266ee1bd2ef8f2feacbf97dc3607e4f20875f86b36469f60981c9357e4d2f2b06ceb920f900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028303cefebf0124c1e3e135191aa76f1110e1e0ad3067acc5a3cd32d9ed6f14d7a8d280015861c47db3ff961ad02864e576b0b0810de5878de8f26e15d8e390d4ea4485b5406cf3d8e2bc6e6da90156b5990c022de767a36f04faa34ba010858341c0a9248814bbb5b0b1a42d2e99e390bdb6a4a9bdc27036f1935c62b5c293020e4bf11123fbe0fe9568deba554e0769b185d8a405060fb3e051ecdc419dadb302217a16d85e0b6e11599469053dbf9a08927b1de7598989dfc4f9e7a54f584ff60a03629e8e40d196de104e23bab9f2b1da30c7396dc5b059b1c94671c5a558a379808657b6a42128e6a54cdbab46c1c872b0cbc2d74c00db6746dc931d61aac943031464a8e972f16c8277a1e6ff64586570551f7f8f4b932cc05a4846dff8405fb9021d38cd70f177ca052536b5e60441570796576da518c651c828ba2f00547bdd7803125f160936b496dfa880dc1e508a416e099d63e976b613c60335d66fadff1301032e4c718db1e882662bc6b725c575107e27f2c5c954c4aad066b006f89d050e8b031a336f0c958970d8ebfd67c215c1d9df51d3989e104d42fab0acfb49da77ad075f8ba0d22139913b5584c5c8b4d83a60c0aede9e04cd0df61b537bc5d558c43798b5c9dcd3903d5b3a361f7941336b1e2e71b42cf9708e17fc09bb47b407e4e9f7dbbb640d09147ef77ad57602fd2c190bdcafba1f598ee382f69e894b7c6770861f53403e8f4c2b7d37268a471ae0c179f62f4c1da9c51c44958c3453c2cf43ed7f2b09b63e996c99422195022a61bbac2f21bd786efc431ad3a44f7d9abaa8c710e9be789dafe5c68d08fe013b2f70c04b474e37dabb3dfab35ce7807716017f6f7bd84b2ee20cb1cf247fc2174d2c3898c612f1443193214deb91c20a808e07e3b335e53c57aeb424653b24865d6f7b58d2af65ca5dca502afb7575bae0d431c886c1874bfcadd693ab850c43af7c4ce72b002b897cc1d48de77c18608d75f58ad6ad4e0f284e294131d739ef1019f27a7db4e466af074e0672d80ca6c1959aa387d7aa40efab0030ce0143cfeb910a72aba85b75b36a9bc18421cd8bebf59e905a6286cc52b17b46df0a5fcc754b84161f67416f01226cf4ee8be345184ca880e71169fd9225ecdaf8589ff0af53cd74cc826a129c3cfea3d15ff453a421bdf8f42de19cd1b5d55ec14c000f77dadc1fa68729142ac9d2ba9ba282328628f63c6b06d2899557f6e4c9601805c7510140dd887e459d192b9620d323f7d00526fa72e3fb36850e32dc65d65fa0840a5a29a550b24c295af90868b6207c941a2500a089f44354628055b25a03f37d3276a4645358fad2addfeb936f72c7555831b3d5a19a6b21edb7625de3a74b95e1e7cae9ebc81a05ae7b790698aa7b516e98299fd553e83a3c6c01d0114a2aa21288faac73163436f439f122b489dbbb4fa994dc885fcf423c86286554843812eff6006fe2b57170efaef1654287614ea57500fde8542fc591b818ce4f91c20deabcf6e980b84ccdba44f58ab5ae130b757c588f92889a39ae3b7a701c0c39c027833ea3c55f207b515138348eb3e55f85bbd11a6f9932a4dfc9cffecf7fe7a62f42033dde4afa59c6b42cd0ecb148c7b48f73b06b311237f061edef1e9e13a163f243ff853f4c8add1e9604fc2a2c4274c09e360465056d51af7caf6e51ed9a3703f50d606184d84c6d1d9d0ad93cc725e69d4f102192db23a4ead0bbc240bfc7e0a4be9b3141f735c8fb0d89d1015666e7a63d358258c30f793171ac703abbaf9979bed5483d59ee85ced82a85c1a0e13646658557fec29f56902577533f30247a449064d7b4103d52edb2b158fa61f680223c1811541628799bbfaf25152cf19ac5433f8b6d1427edb4721477851322e331195c445e81aa088eb79f5b3df129e223aa53b76881ecdf802248199230a4c6db49394dae7a8cd318433166c6366f06e80dce1c3cf857007c576285b1d6e4299f7a1498ad4484ef8d2a40d592b42e238e08a192ecb1cfeced2560f5047e37e4e54fecfe361580017f5a764aab9b4eceed2d9ee7edaa081ab2c6d6957320e259e7cf29db5ef1345669f3de2d193279654200647cd09cc6ae47b300bf688de4aa67b14c8a185a10ee7177870a5ef1bdfdbf24d881837d1ca871b75af6fadb54fc19d67db9163320765f55d8f667a8d0b8d3e5d4c0efc373f4e2164b6126709858ecaf0fd15acf21cafd7470998d59e318fee9d4eb863729582f14c2224884af5f6fb224d7bc01e873aaae86328ccfd3ca4d0000000000000000bd72c10100000000deb466f2ff691167c809824bacec129d6523c23e171403c61d7717b7748247c8409cda899a0a372e2faaabdc2a629f23cb49490ddb7e65552dbd0c98a9230665124c8632b470c239d4e46bec45ade08f588ad5612cbec064156f97a44a65fcb9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009204b5c11fb9ff10e188f56e50e19ab4bc4f91a0c7f7af37c5c4cf77a9a5bafb1e84ce5c72ae12da21448a1200e9b9a135c37864ca5a84250a75c4aa3e9ac7e04f8d5b60f4e4615d335910da42e3c90c13e6d70e5c739d659ac50a6936fbc972265b74ae18b6aa65af54e651cd04fe0eac4afb1123091e24997c7eeb58ec746a020a0e8c2c65c537b4704480a1fc8fa1c0014f2f9eb33a98400ee9b618c2e2032c020414b231139faae0bc9238d29c27432fa40496c057bd76c094866075243c44e60b04233a6f8fa50161414802289a380ccd33097af3e9157dc8db3a9cc976f89afecdb4bf407b34d35c821c70656b89d7753650cd30f7e422847c4babe72d131223021997b15a95505412d6af73f61e1034a3ccf1731de1718d667a4f4e83e8aac970020f61c771d8fbd40f195ce5dc801e3abb7c75e13bb790b52d0fb996f6b2ae032903098336c5ed881bd35445b786ce030a1f691a2f04efb28b1bbce741fdb4f5e051032dccd22ba3acd7f4f22e2e94d9a718cf2d4ddbc4c89f94cdf363659cb56eb42e0218cd58ba7b1ba5cf81a2a4657cc43c2a7b11f24ba2a03f5c70671112dd5748aba29ada312cbce549a1e2a46f48f1fc5a9c29b2212ad3b64fed3c9499cfbba252712981d8b2554f9ebd5e252f5a016e48e7845a8212bdcf8973a2ffe811d7f54efe6e34c9f0eff2876ab6044c3ee53f4b73cd3e441caca6d77394ae0456dcdf29628b28f57de0099d4caf07f72e3f34ca73b8d5404745cf04ac2bfd10195f188f3d7fadd172400fd8c8d7b5de7620719b0a9267aa1e2e85cca02f4e52b566fbf2e91bd54b3cd44d79bf7d9ee34251b07d07d0db63d1586d534b1a887b813c5553ec8661de9c79d09a863cdd286b25f0b253c585ba7b2198ce8b393029d63eaf2c68f4c656b9b01df8a8adbfa5436b893a0e8f6b2c3135e05abdae6911b29d510b54b1f19de48cf92d5d7e3d04ac19ddc85ff633d3050ba15037087160fb3be58a4f05c0b4ca5da9e4d803be13c2181f35badcfd12c329c80d885eda0314a2182a116b1e3bc66db36ecff2cefab4630ea4a373fa458faaf30d3801398952250d5054aa991aaf412fb1c11c15ddf0eee3f446ab96f5878ef98cb74146c83f64c535d9d9b85f3cf374f70e25c4aa34462e1587101ef78197606a075be9050c575d31a6038553f41ae0fa6783b915fdd7958d0b10d70d51fe59e8a3769518173fed39352f91a171af04f0032379c602ee129768a14c992744187c8eca7a8bb7243a3560de71e329b726d35b287a823bb6b6bbb7d324baa74783638b7a339e27adf7be449cab1f7d446357043c443b1aa4af193500162c77da2034daf1353671fda6df35ae95dadf50454cd8873f5d6801c111f37f574420bdce860805388c688b160541f36f4a3cb94a83e5372180f806d8caa1016f468df7ff06a98da1333501845611545503b8ce35871d396a0656aa67c6cab8acee8783d8a7394a808780c6af253283c240714db67b0cb08c479b994571b33477b87e0baf3fb71e729be01e320bf8cd8f160fa7dfdbf8fb11fa50cfc0062279079742b9f8022f76a253992afcd22b869e6825decb21e436756249e754042bf17626d408b58384b69dde867455fb6f85fbf3a8ba26452bdf7a678b8fc3f002664887231faf71fd5e0eb8942183d66ddde7344570e396fd9d4c24d5aa5bc1938ceed4be9b0e0945fbe166891f8af37b1a8af9d60b749a432879eab59a505967d6b9024c118387a0538007c6e7a488e36a49b98d8ce7b4789f5f5118085fd935252244b74af7d84a9ca5d1b12a21e6012f491b56371f90dd96cec7d905803343aefccd05b2ab7390fc68f1faca65f4660d8c965a6472dad1e8e09fcabbd317d7fa61ab45fedda9152ffbb721f53f0374d590a57c2ca2b67a095d40ca1fa2a3fa25394fccbe102e15d5c54939996f67d3d7a08167446f40bb97de02cf47f13879a718c50fdb27226598d2e905ec4045cb36f567d968618189db23369a5e404c982a28c045087893427270d4c52b6f2c86f9260d5c0afda8261ee49aa93d6e3a4f0fdfb2cef432f6962445157b290d06d566b12c0adda713adf8c471184561b12f6ec49e15a2f425e4535a48c50daafcd3b601022f4ad08d142fb4a0b5274c6d47c3f33f9e374e02b68c5bdcfffac08f85232bcda2bc71295f1e2e7508d035b4adf7e88a2c403efb52214f4875aa4d889315e9044c6368cb9a1d48ef6f96e7fdf4a7e703ef35d4f5a6332bb4d6fc22f1f24b4f663ed89cbbe50c12af61aa9a8cd4c4a1d4ea55223bef5606203aa80ed045e6fccaaf7464187a6590bb2006be293aa9052f6fcd8e47c21069bebbbe7f71b2c6a81a845cadf2273ff2bd9547547e7b648c6629f83647652e43f8c8e266daec1103606bc9491477ba26903dfe820d3307", "", 2, 1091925640, 0, "5689c31260014ed91aa0bd06bc914e8b90e4702539aaf10e812b1d8b9b71a532"], + ["f06d6c6b01e2a5d0336723a64dc7653c16b7879769a8a40f86864703eaac71e792f8e19b940300000004526aac65ffffffff023f5436030000000005516565ac65afff170200000000025263000000000388ad730400000000000000000000000084da4eaeedd36c666eaea9f92b5a3154cf167479efa952ba492928dffdb8975f5d3117e6f1f71a9d43363cdcfe1e82df2c78741611940b8f7cd88a99e84cc5a63ceea395798285ebd069f540721f62362c0e8374fdfb1b5b7ba4dd3d1d6b298600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cf34e760b08f7ac3f4ec6f4aeb2fc2cf806ea8f32841f8ed744c261ee206872fb97f809fb277b39887db883ac51cb25ddda5027b9fcdd0b92582b1d59f54e4d6a1b5a51d4ac06bebfa6a9fb160df281c7bb6d464a6902cc64e7011b2284b4d9bf8456280453ec9ea044e56c9d58602ecf07fe47ebb19077e4ae509a119f53c41020b77bbf0b2669a4ec1368639016aca6e7957e7d10aae8a86145e0843e0c9bb12030527e32e14660271f2ca2c4db247576305d3653e2485c8a9d5b6880543df92ce0a01b22bbb9cb06a6e4aa6b90c4f91a5de763e88467085091bbd3ecb71a88638b72896efbab8c7873fdde5254f1291e097f98afbda90e1c8ae6bfeacc0ccd4103a030e6da7d3eea5d5cb823a82dc4314a090d45cf7082b9e25dd3647323812e0eff0032357d2c3583e8b141496346ff2b2b4b531dc0ff6c05f0c72af3eba09c1f214ff030ac2e58ae1b9d645c6b0ed95debb53056ba54c583724257f14c48312eb2c0a8202210a4febbd2acdbac493f640663304b7212cd8da0c2c06788ec34358a0704c2f031714d61fa63001b74930db5c601de5213a814dcfc876e42da7ad5e31bf4abf220c58389bb9512c7b0adba57e2bb9ca5fd93ede0d00458cd281cee1e612edf7ec3ab77b2d4d732c2691e4783d2a7b5ee3ed6c67b3a58ca47023f13a7c69a4e2a3e7105fdb7cb3d47e87e06eb81d9f1aca7d3a8709b384d4d8748503cee0ab6dfdc314ca65be19903f84b8d8d9467edc921e32e767a6dde11b2822937507c7b46df340c8dc8bfc0ca5ab3ebd0782b3051b3802a709d76f43bb6cfa1e5d748540f2befa811920417271a9db1f40bed09d92b0136e87dadf4fa31d881086937c8fa5fdde53f81257de448b5e70408df078f27b156c276720a73d88baf7364903257ccf31908adeb89a55075530c54c768b8c5dfb85e21ee72aead9e02997f8c44acfbba4e42f0f45ed35d834654dd7c248397db0d76cbfd45311fe6c8b8cabd30d31564e144374c1702aba671a33acec90bf65fc4993577d44813e5695aab42dcafa99ea7c74494fa6795efa18b9794c3c237dd56958178fdabd418cd46af4e1e14ab6512ef1492e5ce4e7128c4482aaca2b32613cbc21fda8cb515e1a20bd4068e1827a48c4cd658baf1741b57e2a74fca16abc5a925dca8e2d0b631f8e498acdb0ea2cf0389fb63cd3c6a35c6ad8fa1175cde00d57adc98a20dfd179f0e650f25c6ac90adee4de149ea303ba1dc798143268049b0328f43b2b67c402aefcd8a5baa1d94f014cf44a6c0676c18f835dd152fab9c1a4551048a20cb9f250e3621bf804eeae9086716fbe99674879b1fbb86b7bb63f3368d74dd1fe772cc4b89fb9bb39eb48055af50b390606acf7802516e7f153f68bcd1e77ed4c3ac007c90419f45144ef6b385e721664afea3bd970d5a5472e271b6f91eb38e578451a46bb936e8485d35bcddf877b38fcea5456d26dacd4c33a78137222ad8e54030a96778a8c6a820295a3a4afe5a63755f86aadbeb75fe73bd8d82ca26d01c071737572a10e51cd0772271c70e08d821d7df2a63f5eb9b05cd4e50149e31c6ead871c9519d7b41c434bb38a75954fcdf4a17a3cdec1412874150ce0aebe9e7c4957f35bdfa38f700cc90ecf3837ee1647d97e263b7d3316c4f5a2726668112e8d570242cfb52b59934accd3e153c29ce9f0eb23a4a8bb923f9e7f4d4f10d18e8e5a6362aa4d171f62d14e85d7e4778a0dc6bf404f9f7c90601b1eb330458e726dc064b4e80030eecfcd8a46493f4d5caaa4ed50562f50cad1bc1ec9a9ec1f78d0969800b5b1e9de71cecd9f8ac9265f23f48702be2db82d84adf288091c3ee427461d0a65a6fc5d430c48d717148a147fcc49bb1bbe2133fd573a6bbbe3e44393c3dc4fabdcca0d6fa0cb3a31230da351af29cc11776f450543ce583c8ed2c896104768621ed8a97b2177f1427020f94df91004250645ff189196a863fba2fdce03724549229268b5ca361f40ae78eb01df4c8627daa927331714b0555a153c56ed2d00d6163273e616aeb52577afb029c466ea0275a852fc0d417e3a2cdf76975a885d680f5acadb601a1e6fc38d270964cbc08a554c3a306830a1227a795f8fe8ac00b962277d8bcf91be5930ee1224c1b105d30095cc7e61c7c307bd7e62fb386bc1a610b5c21c73a1f5aa0aa9c76fb14d887c1cd7fdb896b859b759f838f1f275e12d9f7ebdd9ce77e2047858667ba0c2a191435040010c5002763d251c6b72fe8f1e102a31762c48a12f7d139b03f1a35938eaca914cf15402000000000000000000000000d2c808a9b861dbd30fb51481a76705a6190108ab9f2cbb4d37df02fc7029a8bc1067f89e501a8a212545d01c51958ef326a7b0db02b13ddde5244781815d907a33dae275263500ecdb49ff0cb6adf2abc22d1c37d18c8fa75915bf5491f2013d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c50ae3d71a8c3e632a75df524eeea1a0392b08512ab794008feacb398da99a06205fe02aea23c5e90115b9a24f4b3a5388968fab2dd136a438b995a5f688e26bc4151be119905875f0a7d35c0ab7e381594e44543e956aae2396eecde7306f4b391f58be1dd95de944fbe5e9b436bb3b4b540b059933edbcb01d19015a0e48bd03092c5dc17760b344275d41d3788325e89bc822a7c68aeff9f8e90eb1e2a5c762032f6c661e9dea37ec742c33fb314cf91d86ee3991461a1901ee6456af01d8f87f0a04519e4d69a01fea61820f0d14e5236ed3cf8409681109c7afa71633df5e80e890768891c89315e4972afc373cc87e5f7c868bed9097d875a1fcaccaf920a87c031516d4d6ad7dd939090b3a795a0fe3c1d4c0571dd250d97cf41fb6a488712f97032475c07d76bbf44a06d3f073cd6e64c8cd71039d046cb785bbac20586ad8329e021abb7378705789be467503cfa89a86610023a92692adc6a2378616e93dc586ea0324d70de3f385154ebc641f1a7e8df7a45544bb1342c8b1ba4e4bd18f0b341f67020caee07750d5bb7b51cbe56a683c47892a54c2ac42cdf34fd24de0a811b5d3318fd7844df6dcf9812e26d32475dade61ba17433deb4fc85efd1986d121414e6b8794583e5b7ad82f0bc8551ac3f55b71ae8a85a3ff270f0d0a0c4a08e221630a8bc75dda4133dec2f5fa3cf1382b6599cf44aa8ecae7283a90a158a42db8624b6a0eb6f35539162892d889fa83349b9d03f879616a2699b2eb70ae901530ba16e444b31620544a525f142b29dc39c473ae605c94497936809cd4aff16bc5dd121014c028cc44003a7a60837618b82f9e1e613807cbed63fb86a59c6b88dbd02e2eeffc4f2956804069c8777c5e78281b2d6ad7f0ae349d58ab7fb310e819488dc02219e7fef531f5a71e6c4e07487851277804fa9e0b1cb01d0c215d9c6e0c32d04c622f1fe181725856bcf9408399575f0f445b2e3fa84880995e9a9d1b44f33246e43e8ecaf6763b3f8837bc7de1b42370f433663017dd854f7cd3e2ad6a66edb6198a4afbf50a7dee966f60b0c3b684ab6611ebf858dceda4c5faa29e6cb85b8b947bd688cd57ba64ded8ff00920ca79ab2336c97294a91bcd37af4ada74c256d77e17b529f17f6ec36725e3910645b12e6caeec68ed75027c307c44cf65323c5aa8627f6aecb0afab24289847d50917a346d5843798c3fcd05e72183cb712ced58acfc1380e6b207f0577df7cac16849f670d134f549531aef0839a1811a2e9b02da7ab1b0b8c4106565c133bed10d3abbfc51a07f22b8dcd37776b14ddba7ebcef842a360c1d1492089e7f2aba3cfdc21b45ca06b062423a89b4849b9cebddec86462aaee6eb23607fca4b2d109ff308419b2ffa3d272580c57de2eba58207823441065c4eeedd246264a7bbbb5db4e6e1c12acbefc262cd64db8554bac2b39d6f98eb482ab701d061c8eb4de5ef3f2976f92e2549f00a3f513019e44a9e0a747db64eafd3d5b98e8d210595996a809432e82376724f7e297b3e472b38f8f0c581f8db6f69e58ffc3b07ed88dda46334b86c5a8f0c07d05b9ba43ba11907e40cddd25f49c76951c4b6b3fa34df6edce3db54889d8d44f928ed5ad7b4db10b2a70f20138621d7048e7b58e1539b7d39f8751acf323657c29525b57288937b590210edd4f48ca94e6d7ecf7e0e4ad0564e175a0454f6f218b3f74a53cd065c63994ad7153427bdb7958d7ee9d7a8152151756bd145c4cf47e6e8eaae9adcece05440862a43996391639e23da141741074b6f514ddaa31212f8f93f38354a1b889c836d21f0c33f2338cc9b369e24ecd8ef8a1db42a88f959a05c3f01436afeb0ed04d7073c061bd8ab8fc79bb7be2fadc56612237d3cb09feb9a80f3b9e498f4c163b6f0b15bcd8cf90c37df65b4a83482bb1eab624278cba4122dee1a56cf806b92c0cb1e079f9036b50f9ca19bfee2a5cb140f9977870a3d62d73a4ba8d4cc48ae60e793742aee5756a63a78b76bebd91db20e61eb785d13487b6f855dae6b4819ecc2b3f156b1ac2c82de957ee9f82f6e4749e40a038cefaebb244aae0e785a3aaf7fc5010795f3c68beb8087232e38f5a2ae98fac628b21e4fd2292863ba2a7bc2dc8cb13c3af304815ab2fac49d9d83c43d07b4476837b499f9fd5c4f6017048d2dfd8609c93971ee20757fde44fc554e25ff7496dc53ae47e20d7d5b43e3095f5b0a1b71cd3ce0a34ebcd5e5d3d10f6fe17fe8f52d48c496ca2ff4a8276cb9b8d36d122a610cbe1694ffeaf18d50000000000000000de986e03000000006d74ad6d768e82517a1f8e41bc6054fd1f6219a62b42f5d1dc36eff2825886dc8ab2067a33a4e57d169cf4e56f4f1703f1c475f5e71150963e35a0e21ab45ac831942750565ec2f88cc0fdaeb283861942d7181fa9a6c0c19395f72bc4cf97c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b4c94c15ecf201e6660b4d09827cc6e9f84100aafe39d533b9c6ae10e559409174aa1db79d81c76f412ef1492ebeabeb88c1516849ee04495cec82b61027e98c811f441df02ceb4e57cfe757be8f7048a500e27c98b7b1baeee59f729ae7d03866eb9a1e682d5b79544b5b56600b67356e41248dff0b2946f0faf0a8be56d7020d47911c860ae3fff3853074ee125d5b9666462fc58a97efb67df02799109ef2022c7e2dd0d156c953797d1aa794dcee05258482891a0fa5b4a7edbc7d01a82a7a0a0463d6916fd5b027af47f130dde592899e923523aed1f99235707992009342ad7c1e329616db3a7fe6842268ec8693867d8677c024029b6c73276a26f156197c030f181f1f246001ee601bc09f74e59e064ff06ffc36546c701299c607f9410ef90329288a70e24d81fb08c4d246e08eb66537d5d6b41cd2580515a0a6436e6d826702227bbfe3c00c7ccc03d856980d529654d19d507c2ec5fdeee16327624c63fb84030257150d3b2c5f9db8cbf5a4f93b5a26cca3bdf66361862fd013df5caf357dd70217bb1ffe23a66bce22508b5b2991e0f9342c76bb097b5a5f41eb36cfd44130ed0592479c220dc19c4f84efc35a018e6264fb1f08d40464a9dfb12fcbfbe56977b7a0c63774372d40cda8b4f7bb137a1f0c8b2742ec78c554fe7cb4c858b4bedcb8e6b55350b4e19371f3637b9450345f997df55c86678b89922e9d4433b47fe2c7ca1d0c4427d2ffa90d347dff3c7ce59163e0b0b0259eba1cd008cc52448627004a2d8d270c91521346ec3a293d9d19a277369c962d355a99e643b1055d10110fb8b02858e2af0580067a367311a2d90544a1f87077ee5b859504beaf7253847920ee57c940b5fe79923d5fa8ac251c55f3f064bc08d80c7f1b9c160397b5be662971d9a9e0615cd2f670abf877b1086875bcf7302d6191fadaa08d63caa08b027c82deccf3560fafb7f4e8a1fe0ad9442c6fc248913dd0d448c0dba31172aa366dde55d8537f0fb31e67d8568181e6c0398d220fd406165ac74685f6c2f4696695800679c3b9f0fc7235a47695eaf315e848ed9aa32fb045c830f8ffcf3a224875816474ac8c9381080ba2e889d2b37e26beb97353d5e2c458f36c16c6599ebe3d3960b55e80689f8aeb22607336cc62e96d40230f51992f50033908c65becc2401d4fa9ee455ef79c1a649287bb874f63c1d40b8038a250b19c58addee27c2a4521336530a80dd23d95f837beaa328ddded6a5cf4b381e369227071e75dcec99ef13c560f2559f5266a08e14bfc0edc11d9228696236aaa2b7b0494f837e82cba80c8006cb5995703ad73b853fcb960bc71a12e19459c036c8d2ca0003940b708e8cc4828d210d82ef3519f17ee64129f3d988c3d55f76893cc031989c0da7726a5c0a7094f2688868e14a2d412c58c4a9fe78c8ffb9500cca3cb502286013101cc69b8706b258c99ad76d6f7c58b3ce38751a3fb3341f1d6238f36b760e40146732779537e398e87fb42107bb7148b57b201a7e6396ccbd781622f1685bfcb4097deede2f85d7d6bdab4af16b14153a969fbc9077ab51ebc2ea2c05805586a84f7359da3ffcb8ae4be57682160b32746c7208bdcc344b2dc94ad70a4dd3925e0119b70543c3f5fb5f3d47c0d80f4bfd7f2ec66857fa79a824babb0169078f0b71fa17dc8f74c0f908eb575a2ba20b99f84acbd588aa4cceab4068e1c850bc2423bd51394ec6d2b907a1e91fe73c631dd9deade28e77df35ad222e25c47e9fbfd5b61ec64f547ad4e4ed3168a36f1025083726950ad5c569c3aa2ac1bb94d41c131210189d3ae811d8c42c2fe9197e4feb4d2112ac4668a491c6cc68a08579d18dda04cf8f49a3f3aa6212732f8a194c65a162ba7a28fa8d1ac158efcf25c1d2d1af826bdd4d8272d51b88fd1b2dd7d20f5b34605bc3fe7f57b5f28c1c95b7380f42f89e20b1cd79e15ee04227a3d9c056a9c64bc46a58deddd2721c73afc29c304d3bd9db0d1320affcd85be7667f33485d7eb75cc8c42dba575a118464fb7c7786589f8198aca0eb90fd8bfd7bbdd7f679ee914b4bd1e01d35cb7df03f31725bdaf89deb2cac8161e62af1670f022437fc5f7d878e0840cab1e7caf26065f0b8a0c6cd530cf86a45d5da49c8a08b2828b270fad69c4cb229a924d69c0094345f72fa2671a2501de389d80fd5d9c7e2a68b316fe4e63666a53dc3ca8f669e7323cfa816110a15d17417cee7297ec3335510de2236ebaaad89a2795791db9101a74d8c477840d8ddc502a264dadcdd09736b9bd626b382ba9fe4e8270cd83a66ca91c19578c07610470a931577dde4e48361fee22d307b066b0157a5b9715998dc8c226fe550f4ecc1e3dd4741863b7f3fb1205b58536caf0a4197b4ba6129ee124927c03e65dfe0753965e08c3190d02", "536a5353ac", 0, -1826300334, 0, "3e659f9fb94fb98a4586c796b750363ed3d336bb53451f4e308a37c5648ed8b2"], + ["030000807082c40302d6821992d6ba4d2a5cb886705828fc4404a72663407229490094474e22146e84030000000452006a63e55aefc68307907d65a831164b1b99891714b211a8e557c6d7f6e35b6aaf8b38d9c49be60000000006ac516552ac63ffffffff04888619010000000004636a516582fc5105000000000151b92c1a01000000000165767727030000000007535200ac51ac516ecf99c42b1f567500", "acac635252ac", 0, -1530100607, 1537743641, "b29366722fc28eb319aceba44484eeb1ebe3dee86788d8f17e23f0ff558f6ebd"], + ["57361001044333c4a1319975661d75fcf743815af687597fc12356fd94799dc87893255c9d03000000026563726103b3391fd0fbb4abbafa0f3d3eec4e909ba9f5e4b1e746c505f670894c29b5cf53f60200000006006a53516a00ffffffffca97178886b1837157c1df36e3dd6b9ef1fabe89e59f51a9b1b0356f662963de000000000363536344d942d4eb77a295a11f6fc4020bc21cd49441ef7855d7304fc472833ad2a0f0177121430300000000b375d1b901cda93a04000000000800516a635363510000000000021d0caf040000000000000000000000008d7d1d5deac8088c01c31444baa0780ef26f7a0429a1447f24f0d94ce5b3a6649389c777692d61cd67241647eedf5f4141a36fc8f1410c7384b436790c22e72d14f8a0a48cc2bcc57049820846ed7ad6e9e482e2ecfe713fcb5b9f6f6f01923000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d01f108eb437652ad180d55a18d19e26df3740d94373149d139aeb88f0b4c9050e82ca82d2a903926d0e8c2f97900528f4c50a7f00133e0a5ffb870b104c40f0df30fafee6d48c5b6b06faec7c89e2c661c4ccdc5b35aeff1ca667b02dc5b9e92bc34f2d0996ceff5b9acd8c6e388910c59e344363ed319ef665df2473ca67b20228264ce86d7bd45437beca620334a2bf5273e6c04bf1b512d72d6a2fe553d654021877142a4cbda327c9b1eeb8eb029d247de2802f0fc8e28e901909cad4a8de640a0346eac7803ac54bac98cdafb53d440bb76fab96c9467c8b5e2791c2b6283508fc9f3ef6e23637e6d250dcccb207ce1a1c7dbeabcc37ea006f580167cc6334850213d50d58341e9e0b2f460d2f10da6a6318cd62ea0a618db030266e18a2ecd5ca020824bff7dd0673a1e85150565783961be5208a4b9773d2b1706378dcf8c60bc303118eafad62451b0647c60f52be4f88b339f162f4f6ae9998521653d692941f130228f7577b28a5acd68912d9d7c645b017906210281e58257470d47c5ff32bbd43021e1dc7c9764c95fc1840367df941f01a811338338b601440859d04389cc59da98f257211c5bbf66a1f1235e72fe4409f9c76e18822b96ac6dfbae335bfd431cb91f7d0100aa58a0acd1b2e50ad9b390bac8337cd94b0efa727e8dc6154d22dc1b08d3b469ae4af1c3ff394c68837997dbb9499f6a24f64d624f726dd620bc074f78fe0b8bfad3446c8ed829959be45836a82a60a99d7c89f527b7a559ed0f2307d45832441e28b39e014ddfaa5789c923ab97630cea16b4ac8a9e8d97955a5eddcd5e60027511026e5c4adb685160fdb0b2954ed55f12bc4f1e87566d27c9cae7c0cf89118e085277dd01bd4b93f808a1e32d6e1b220fc8b9f6164ed3803a7884be5828dfe8841fee06d6a9bade6c8327b33ab468ea50514731221c6000c51ef2e12c049dc2ef043127adac2a96dbf4b5d0425f00590540d07b596e2073ac20f76d3e0b1dbfce8b6281dd4ea3c6021fef57c4e7966c059ef4a2aac682bd0064cfdf95a23a69aa5e1e695ec817c3afaf71236d0737e0bd845824da76cb52d2983643327e2eccf62949e77935eb149882255996ead5eaab35bc6e507fe27b74547a4842c9e6cd79653ac1a9b22cf43b9a1542762b9e186eb42336a5993598dd91607b6692dffa6617716cffe4c938c7b08f20780053a4c301bf8b6c97b1127a43fab09d36dd78a1cc84ce279f93f886af6a67534ebc33f4d1cc4bcd9458493e368f1266bb58b949edbdf8423b8ff1537e52c81da66451d592fad8c98c68c57deccc2d249690c56ec3d2f491a812595086fb6a0001fb63930845705e4b020da9594cd0c4c761657bed1b45c225f873277f3fa8446564877fbbd7652d2d0fc600f1e78e5d9a633480765e197e5f0402b969541fa8ed311c675ab7e20a8475efbdea71677f2a6a27ce87bbc93e639579c68ee4b269c84c89a7960c9a1fa31835f36fff3f991fc5cde5c4c909afa0745beb0cc55ca61f758d1fe184abf0c17917f1a38eda96c8721cf6502bc12b5f0ab8b35ed6bc3d9fa7abfa8b135c10c68aa3ac0bbce71e3353e3872dbdda6d1b10cf54dbe3a3baae4f8c391fb2edc4e02ce94a4df8f282f837cc322951ad766800734abdff9f183f6339998f4af6d6e17608592b11b4375af99e5b74bebce8365cf7245aebbd0131e34a5a9193cba33e90af11252c7de65b3b7d28ccee302f5016ea30312a62303cdc2adf210c81b68e8d0f74beb7604696c8b64dfea572e3e49542989975bde53afbd94de1c6d12d76fc62c2a56b0fcb001a53853654ea29c7a9ea7f154fb2c05d54bb4ff133e1d9fb18e8b4517b969afe6a5663fc6ca35d2c22c940335ced6cc9f489e108f6b0948a79fb0eb71a88809ad5eb234f882e3db5da653b97a822beb6e8a6a6788c68df8de8c52f97f911d9a442e64b21a33143166f73815771118dc1e7191e3239968c441498f055a37d1ca11af3fe2b4996c7aaf45fd3797d084376c8edb5504e3539924f06891ad56b11e1e9d66fe0df84bccf57abf4b0dc9aad7d3aa0cc604b174a262bf5d4d8edc70f7a7eb2ece9420bf237473eb8153feb75dbaaf07d8a2611c6446344527a66d6cfde08274d45745d444bcf7a974f0d3ae53708511c28c85957ede74b37e004e47aa8c35343acf4a28ec84ffd1f12b1b3f2c86fe1bf5aa2e87394e6c674a93e81a9682c1ba6ec57a960062f8ea3178f4648098e4bc9592290c16c8d503d400c50f0d955344fe62b87a08073e8b7ff7d9d39b72c90500000000000000000000000021fb28ac0e18c2d54d1fc6d2da70abb5184176748d8e360456be5141c7ad9125fa8430b4e23c3ae2ad38e4c3e8ab5b01449431cda90df20e5b1a9c5493f54427b93c4d30cf990391333621f2e6eb8fd21dd2ae916bfb4fd1a71e2a1a1a00b0c400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cfe67ed554f48744394e2b45e2044af1b7549f4fd86fb6201edc2a3bc0a27a7e534a7582c18d6ed1f836a810ec40ed221cf0e047a6a4d4bba6e6afdb7834b7afb6e2bfa91731028d7e138864311466c7dc158db4a51a335e0f99115648e15dd28e7bf367b4d155b323a509253db3f99e8dad6d2f4253a6b610c0f58d843ccb4a030fba1901b1fc208fbd1410333a30b8858781f2fc899c664f6195d5b5e444df9903082c2262a0a53b0fc65a469885b290c5a885d1bc6ed57ac8d75f3d93788311ee0b045452d897af9363d0b00423ee009712803e2b46543493ea267d9d23a1349b8c57711bee36603ae972001f47c4ca3e82761c843abda2cb07431ed6b23abb49480203e2c604fb5e16af6253352d24eb6f1df6c867ba4f7cb973393990db1ca1ad7102254c1b5c8982e50d07c77c79579100555622a46082fa877d47b744645cea7d5b030017e5ea8b3e7b1ef021b78266b21f03812cf0f274f0c68fddf3fdfd9e0988b6021fc7ccc377296d2e9c12a6c646b3b61663e48ea83509a4e7fa203cffddce7993030e91ed0888512ca9b3ea65af741197980b5538dde8a7eb15be1f027fa7acc4216af3ca6ffeaafa309001a4304cf30ceee2bc03f3312f76ae85490ae592c3c20066a110a1300b5942c197803bd8395bf4030a51b7f742d9eb62b5c435c2061dbd31b9ae9704c4e23ab69d25bd4691d1090634b57d54a92dd5067e0db732c1dcb7d08b43a57d7f61608c9a0fdb809f9a1e44dd6292691f35b49a83bfecd04dacc2825959a8b99a7eaa36f0f8ac7945f289fb5a4d51ccda81688c1036715b8fe761be10005b1b2fc7e8598b9968e365229946631c2ec07045bc595c371018f30d4a904c592dd171dea82a5b06177e4108a732ea7738daa152037533ab3ac9ae11b5ad43b9db67dbc6528104c19ef090cc2f5c392968c0444b4ad2dc2de002da5a636528d62ac675de9ae4189eff0330683fc2a9378cf1fcf0e0f4aa7478055713d2daf4fe20c8d35613188840ecdc4220ed4d3e5f22f9a135d7f81dc9100ef38ac061b3a421e28c88a650a1186579a23ec55b83e60d6359a5ce786be38383104dfb960e634a7352fbe14a919865d4324d52898469e2242a1dc9143ee911b580506f2f26208426abd363d4c6b80082ef361af81065fee83154fd1e946244daffc7b00e753a5fc9ebc8de603ef3e8bc01cb618b972f95c128c45dc98978342b025cb19fd7099318fd31f7463655ab8d57c6862f1b48056faa61bbc916672d33835296ca230a940230cd44e18a7347fa78a04995492af6a6fd2f170c859af425626f349c3ec680f49e05908a85d3a0146e6bb1db219e3b7451163fd94956f2e7201e8295f8b6164794b3f9af6de0e6c4592c390e501bb630288885abf5d5e556088b7ec021ef18e256cdaed79d83937cad8b0c547fa1cd8f8154a885bbd7ecc5421859693b5f7bdb17c8c7ca7867ca42ee0dfd875daa0765746904156cc0a9c4022d8ccc92fe5eee879d39b7a4cc9da284f5459f662c6dea45da7d851e1621945c5c36da0721cf4e42ac9c8e852dd4f641d9fd79c59a0bd299a388c5bac5c912f041f14f10e7bacfaa1ce1233c42e7959ca8c86ac88f42ff9b8dab7d5c9fc2b48a8522f25daca9e1e2944224914b3e5bc789bbea924d500069cdb2b84e2472675a33357d2567bb918a85897bf754ecfe7d171162cb0da45cd175aae886dd9974e2755676ed070d70bf6ff6c3cf7f1e67d6cec11fb49bd508bf9db57766a81ddba1d20e119addfc77d511423ec37baa97ba7082494d22cd53de4011c172850b22c81c6f9fbe88b2bf3013ba198c9d075e7696ad88636a8b78662241acc7ea5209085e50324e5da03e460579a0b63933d6f92a6c7733edc011d7fc116e1085aba42aa6e8863190dbd81a4e2451e702cad27e780038cc110a05c34f0313017ea80847a30aac3e7aa9978cef6242c0e2dc9d0d3832e9fe1964c511516649ec522b99d872adffb27402cbd14ba245f01c9262fa0ccd72e8d324e88ad489f0584f7b222237130a08fa67dce36215d84680afd3b3c91c5d133b58cb43d01316e3aab4564dae65e11ed577e741a063e934e9552e305cdd7cc368e6491ca34587e09ee6328a3f3c594231d219f657bc8b1c54729b2b1ee961416908067d88e5f6eb56cae30d529a219630e850907af63c05cfe9e6f49590c2dece82ea6e7a6e45d9ceea922bd95bd4bbcaecf90d4e5a0adb1f2a71f1070da7f3c8508be0a41a1c0239e6636529dffefefc9decb6bd02966deb904e56554e739b655c0725af631fb5ab8c333147c9b39670f17c431e117933aed975f30067dd20696f5ac118298989b5df22d4ad51e804e39185fb35c17343a3b086b42034f9de62cc7a31d13f988858f9407c8743cc844a7533183942fe75cd5e2908a3c65101", "00", 0, -541017162, 0, "4b79c8b4aa56312fb7bd1de424c0eebfd514b89388f6d186182072922d63ab9d"], + ["84e1fe3f03426724a61c58ce0550b1c9610e1464a3ed165d94da89255affba2e60b8b41c5b0300000005655251536578af64e4109740fbbd513e75b43b392033359b483325cf926ff249e81f3a570296994d2b03000000046a51535280ac90e3ae7b408c2fcd97109551176ee74ada93a37836815137c8f2417c2d73be2dee6e010000000952655352536a510053ffffffff026db0e7010000000001537dec5000000000000600515363535394cd701a00", "", 0, 1878472092, 0, "94bad49c811e7863e5066ef8c280d07bc4a61eebb45ebccbfd791d142a5634c8"], + ["24b5953c032b63ea0f11c7f96f9b0fa6ad0f5f67a68fdaa7d45b6e5e6317fdc466bffda4f4020000000963526aac6352536565ffffffff420a01efb9ad67c6615487cfbfc14fb544f79c416a6dbaf85756718acb794a1001000000096a536a6500ac6a5165ffffffffbe81cc0c3daa5d291a05b02ebcc76f0b57c78560df70a649b306658b297088460300000004630051acffffffff04715f9d000000000008536aac656351ac6a336d10030000000009536a6aac51636a656a363b5e020000000004000063ac240b3a030000000000000000000100000000000000007967f2050000000050d1a5c90e2e90cc0f6a85f9ae08c1bdc4af6d2bae7915355f2971a46288202d9b3ec2ddc58dd2a9bce660045a601467114dd56bae20035b8cd419cd2919bbec223430125f7271fa9ddf2962224633e0a744fe8c09c63582a93d012e4856983e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050590427f7230c91a4f6ab206b5e4733396922cda0434a129a2197ce4b3e510bfda8b64db12f3fe947023ca7264ba4d1ff347683732ac06547c3e24d9b9cca0c4cae8c2be992f0e364efc49e76a926e03d0243e2e8cec1d7d2dfec27bdda54f8551bc577a5b77e73b14ab056b4bff50aa313b2d085e872bf3fe554ac045dcba40214c7d2b8c913c0057c6b7dcd4697823743fa76e89f4b61f4697bdd339cdeb0520312a0b68edcc848119c5a902f168a3989c9eb9969150011fe8399be400a35c3890b0709ae01a0e268b666de74eb9b16ffe2920db8e91a6f0808664ddde7c32cc59ed6b25efb4f766c9163c0d2570b8393cd7df8b19b260cdf83626462471f98c0740221c475b92edf3aed2f8096c3f2f6c37ddb96a6af219739e214ed853bb5e45ab102170cfcceb5160fe2ea1d05ff2363d0f539b0f139443d99fd35dec0824198e492020e2aaff643d97de3805513d13b9e4daa335a31e1ebf42156f0fd44521220b74202113c799dcdb95785b21c04066ee5571ab4f5daea63ea8164894c4144422cf73c021f61a437e430d67274d032e13b2c197ef7259ca787645eedcc0f24820358a37af7bba97912a91a22b35c4d1d79a048634a7b268ecc12c78c931e58f697788d46ba29d1bda01b64a6a681faeae7e4fb0818b96c58e2b01e567d36088e55f9b2bf38942ef43121b4e54bf4dad58d8cf45a0776a0b92d9fa43ca4c26babd6274a0835cba0e736667c686c90c8bf4336fff24ae2bc569bc27f7a8db6e03b84b0a2a88f331c4cf91aabe6dee8dffdedc2665cf121d4b007038b4978891e4a192eb5126611c2ee441a3a38ab9925afd28b25fe5e9631fe72a52cdee750b3d1979f476d42b2eac764a689f0708325dc891b98bd191887a1cd3b09f57a4cfe43d651492362f57e6e1efd391f1c9e17d09fe9554f7fc6a6eef43d3efb87139584e5959ced96e69bfe3aa773c06204012911d4e401a730b36c5fd532f9fe6764c808b5c2fd00afa62f4627970b80e530246348bb7a224dfbfb54288bd470abd41f96795b794e88cb36e1a5f9fb9a3635613e6c861e9d17c740f8bd1b519155f4c8ab7a8217d9b4cd4d65f6a34a507d30a67a26b54a3f79d8cc5d39d21f5f6b2f93a231984dd6147119f537a8724eb23b6fb21e7bce712760e423326e78e426506d08b1391245688d8dec1a77cefc23dda54fc2124de2d7063583e3bdb424f0bf444ba4f1b785b85406a819dee436d692577b5732a51749870877b9633693cd50b74b5d87d55474b4e31ff3b7a3856abeca0aea067a6691d58a753cdb797837d4c147058439a42ad9ef3e191c892d405027bfc526f4fd7c40ace7cb009cc2bfb8e6f227c7d0ebcf95946bd16d41260a75c38007ce93793b370f96c61881b73cf9c7ab9e8087384d5d4378510c9ff94d132d02072c348c7b6ec3024044e12e27c794fa42540d6a157804d09b2ad4e54a2263aa0cfd679fcf562fca7bbf9724c80ae3f6683ac217930cc98cdcfa45f1044f99df18cfb4aac67b6c8a1e5923e9d12d414c384044ac4986e99bf80af6566dbef72ad70bf91c93d21ffdb6c114ad87e3be6a2cbbb71f5664c1750240abcb4182d915cfdc57dea76228dc9d9cace2f4d5c9b7569a44f67e92f9313655cc0b9d8e9a3781bc121226e00de447eb13355032e62a7aec9b811b0db2be0ed41f02fefaa97ab13f7ed08dcac40bad4a6fb80d9037f89a8531ae80e80f48a89d419176a196f55783c0f2c9cf687a3b42a85e6769865bd8f29a165015739c6e5d9c93e2d766fd62d1924c125cde6f50999fb5180840bb3b2b1fd10c17195590813c338f29471c9c1ffa1655569d412f9ff309347aca18f966e99129b6d84ad872a0209bf1e046d006f721c6ad457f61a50b19096c40fd30bd9a5f8ed6b6b7d5ebcaafa21afe91cd31438c289fe0eee0cc352134232ffb8298cb1c01c3a9d6c668e39d759f84747ffab7306670f402b785bde6ba11f0dd7316b716d206d8b4027f7c150d7bbca1221d31cdf0ef5cd81c74bffa68c6ccbf19e38c309396dc84ce6dc73891f688dc9d65cfc2610a8219b8bcb917eec5ae2b4485cacd392e22c8b599f05cb010de0e5556442a6487e52410d171a1035f481589b99ffa3f2c7eda42a2f2f75d38bb29e3911c7071a87dc4af8a2b2ff376b75db92275e7b3f39cc444441bd057838b8f25b3cb26cf1427a21cd245f329ec781f657e4fc6c10f1f8f7796c5591f6e0a14d2ee202052f29fe5c52c275eb75cf41ad934a6e8b70551c13007b3838a144c8a137ffc88628aa465504a832aad254a6d34346ac1675911f9cbe8a20cfb340490c5e2d6baf7683fcb914104f42ff5f10c70436bb35031ec3b3203253db3f1c727c2413510a0bc7c48dd5ede4e869203995cc0349aef1e607cd881460a4ff2e775b4fc517f0d", "63ac65630000656a51", 0, 1518800732, 1537743641, "7a9dabd283479c3227f448c8b0975bfd03e6c06402248c4b86a1d8411d949190"], + ["030000807082c40301ce503447eede5cba2aa0e7a9f7455c7e8a0763b08b2c32156d8d6809236c55f30100000000ffffffff01f95f2b010000000008005165516a65005200000000000000000200000000000000000e4eae000000000045ef69c33ffb8f32d93221248e07ce2bd7881fca1ee26e5b721f10bccc32546187003c5db2a536493a407e625fe0fe62fed1aeee4dca7b70e37edf7a88ed09f09f8330d1e4683ecaa6d18768a6926fa0773028a294b6deafb73c262cb0568ca8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004ad165aded2e3f17d11f3f0c29d3da85ecb6623bdb9831a34c365a330b64d8773ed152e3abf562518ba0a74fc10bf51c1fe3736fab0778d11d40f17fca49c8962c74edbad0e0b7f69c50609119a184edd545407a22598f7cebc94deca706e94dcd6a8aa9896d99ff72a992e3447c30976d6b25b2e2fb2b0b15af0e801fee6031032f875abd130f53fdda2078beb7306882df149b3005e0cf72deb3bae7c170fc8a0226839736a61866cb842b1d96e68a2f2ecbac2921ffe4daa032ab3d747afceae80a05ee6f941bab2067e66f7d8bcb0fa94073c4c837673d39541f8f5d3d9f5df91decd36b00bfca537a8cec836d79a49619d8ea83344ac98e2fd9535f77e5bea40c0306a55da6e6492816aa93dc165ee59532f72b8cc32e81e4dbec7801ca7e01b44f022c02b745ef8b7c0986f41c0636ece392b44ac7280988e7f4c0d7ef739a242309031b8dc3c581e3ca70c9a54237199f0a54447ea795717c34ed4c022ce1ac0d4b60020a94a609f7964639936e62955d9ea7a6557da1f0729d2e5ecae6150d663fa4fe032435fa7b897eda47274b00d219e15133211f48dcf6dd590e180034c438744acbde921d0bd84e8f9c9c53ee86b75d6ec1693a3be51e36df74264a1e56ff4bd5dff1c00987bda34c1edcb9f76c7e97ae2b26948931c364911e08ef89c914c44f9db46239f2fc84ec7929d45ec63a6bea4a87369888ec1f77629fb4fb57de7e8b37a584ce416a68511c4af2e0d879f0e73ff44a4b5c31231dda436c3e28c38eb1a6031416abd2b590a5b8b80e456a67ae6c7292be75aa976744de5176975e6d39ad0daa360d9c0a130038fd583bf8d7ecf83bb58a41dd9d75b55fb37ea7872241ab4b3313ef6ad4a507d313f92b3618387cc9c29dcc2d1b2d302fadb740aba76047eefd422bf50b4827ff814cce6862ad0743a6d3936f77c454232561200d2734dad7d563d4d5d32ea18a4ae6fcb0089314be641aee3ecc714a1ab7b234d4e18515c10eea52f36f020a927bb0a449d61a562493bab56cd738500f94095896472d7f45a2691aa650dae46753804a5969eb053d07e025c40d983cbc46533c75fe63eb2e0a15b72b292acc0641933cc2a353051bb82925a96677d6b3bd0d7e83cada5e7eaf06877964e5977f93c70c99f6eb79c36fcf04174281c63105515accbd0c343e8601a23b12c06fa1318af49c4b4aed2c824f49b17ccbd4c5a648f6f8e4a96364e2e93ebe6aac4d063560807682b033f834042cd638181c3ef33e3f10145d0e9979e19f746cb98d4db93dedc0de0c30d29287166610eee50b1645f7e1e502b207b28f75ff9088108006a86704c45ca7be6b0245941f200d3f8eacb33d8875c2961a8718220b7af948cc554fd30332b06e1c8d0552ae136ef717759cea31f97247cd52b456c55ffc5f86d7b47f93e13cee9c3b5c915097fb3b11741f081a2defedc27d6e7d6dfe84193c1b1b161189daba76a5619123bd2c48bb42affad6a5b6cf09049b0c76353191cebf831516860f2626bf9731243ad428c0dff27a5fd7cb8b8c8359af43a68059dbf96c91beec70bd5b3a886b2f9011dce12acd3d7d99b57af12b54430218edbeda89935159d27a619339ea27f90a1bb7ecabcb5603592c617d8c08579b3e1218cbc001515c1efb3ae3e79ce27a4452f3baacd9a25e83f6041b8799b37996b121e53de21cc696afda88484c0a1d5c1c38204de12b5efc32d40e2c761c56b1d3bc9a87aa6eb20d4dc44fae881407f4f5afe032b78226b39eadcd68bb6da55561d9f897f9be93d0c74e9c2b70aedccdbe431b0a771b199f54f81512a22be53f4538da2cfd474941f4589e6ec415b91771745020a46178b2880074698aa7aee149e1983d510632fef3ecef27a2b368088041336dcf4840ae4d570735e18a3fc1e123a96bd05c819c7aeeaec25fc9076742a97f0481de25ae667b385451631e192753fa2254bcb0c43936750d1f6920292940cd929102fe6be15f10653b71eed9549f85b724cdade42ff30d2beb7287c2ce17843baeb7251d76f64d0f11618c77119e62f9d6b15adcf2c13951615c4177fadedcc3b07d15de8b72d8b84114cfebf8f95162625a93d190d4def38a5d8f90e9080f9994fe754be75a99844bdaf4f517e0f35479d6c5ad4434c770209d17e3d7167d248f126b181bc8db146fd7c0ebdcf4e189e15709deace893f4b856da5574013688e8736259596da88a13b305ffb4eeba72a582f5006d7488c47091a34098774450514f1ff0ba5d5c6a554d7e6f7ddb603a7adf1d456be130051e38050000000000000000000000006f885c8302e0f5c1bafd8d0123e87cc616904bc178e1140f861104a57c015fac42642bd292bb12fb56ff40c377cbe66114dd57dd62d2c57426b8395e19ac4158287909afbd3f32d08cffee33000331307cb3b4ad99cf0b17b913989b2ad6c519000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004b2ea9fb1cc00814c82902c05ceaadb8cf3caaa4d69fe2c786a25a0036bf799f6ea00bcd2ae8a13bca396b1bfc19fa51e7785380be5f8a67a5ba8ae079a66e00d286e927c23a9a6fdb28a19fa1fa7eb01c968a41071d827102f3fed09042e0a763477072d0f2ca9d6a5b70ffa23cb19d70109e059d9ab6964a0b04d4c7b9a61c0223accea79871c8f7b88af2e01fa6e7abcd486d4a8b9c0b9059717e16cd8c260a020208ddb44a15caf0c23755311586d0c6b6973c4dd03301c1d85321177c6ad0850b00cfddc7699547e8ca262713353adc1db62a992005591bb0a2ae5db3f04b731e481762e0da46bf92a519c110eed60bfd9cc2e79e3e7e3cefdf92f0f1bccb563b02272a82962f55c005a4c795943ad2863cea47e05e4396d0894c678bf35473ae4002025352ab717b7274b186c37ceac66b881b2a906f6722187ae064765f646fba720310126c400653c8a901f6d34a384862f645de9da1396c62b90ee85447031caa8003121c11654ccda06c1124defc3fc8a5801e90de986cbe4b8a1d29d200196e9813020dfb72fc25d006bf624e0541327ee764d4a34adb7158508e23f8b223eaf3df34560fa2b3e8a97bec36da64205e77e96ad1712e1235fdce6042bc868a8b5243de60312cf109c885aa6bc0947432460efb6471804eeabcec20702bb786e821e115886af9ac08da096de9610963c5f981ba053af5662083b46133f722f2912ce7bc465cb5d907c810c1ce958bd8223772ebdfff03f03e2a5b94e4e3fcbe295a91ff67294d5ee7564f4fbccd0ca836461363f423ead1fffe808a8237d9a668d8edefc47c054901fd721119dea60606091b2681a585a10bce9bff342366d0c55463c2590d15e5ec3cf628b8ee9fb9425421db41dd221a279d201773bca42c64725708cd1bf2a435498d020c5f3839cbef1d6b56411fdb00b5234745662defee21a19620aa9082bba632003d56c90859caa49c5ac53b1f584f146d48d12d37dcecedbd50a7a6b1ee6161db2027e9be482c21eaf370c7c9e73cb9c11b9072c40f7c405ff9bace51444970c9b2183f83124b21606c8d2330aeb3f1fadec1119fee6f898081a10e44522e7ceef237625bfee15e4853a5e3a7e36f06b05b5a331f66ceefcdfe9949dd8e8d90ae96da907c5d5b43197fc688c5e9a311635a5a42c205444a31227d73fae6a0f33e439c5bf37467dc0a9d861f88f5b746266df9be66ed331fc36be5966b1a7e555cbf90b81c9a114e926192cbe9140a9e98f20356ebcae8d618c367ca776e69537b824272572a086fd9946ce33bd29b8edb4dd931e875732cac3baae97422e7e71fffa2142081b96f0c3eb9240db0ab2c0d9d7da15b0293acdf78da1967cac518a981e2fb87768721917e81247a400d94aac86eb4708087cdd02852648933821399b76bfc115281b47dd73277c0d0e48ca7bfccb0b999c3c19cebfc33ef62fb4406f7b3cab532e2f53842c6ffaecee6c072f109d730060b3f86d59caad4619e4478e0c75bee808823cefc032be907c3d3a76b56ef74c77bbb9dd808b8e7fb9dc3757793f4ef77caba8d47f6e4486defe07f250b8508d7594621e02a57ec003c935aa605eea85d20b30cc108321fc068169753d280fd1178bd89fcadc64f612e9c33eac3396607fd74b2c53360a11f7a0d82241a39487278855d4f1f4a718b5d320d0490bf5ddbbadcf49c39e8e9c07df6524928ba4390d7f1060c61872974e6852f0441bdbe5459525b5788869ddc686342d47040776be79849a504c43f5e673e8cc3346868a7c9e320baddd6e7be738cd5ce6876d2d39a2bb1e529a4c3c0fef38126237abb97034852b56ac3b3e6479edf666b2ea8b86190c087b01027eb66f7d9052023b9cd1fa6339ec7caecaebd6fa068ed94cf135450e472686f7b8eb059884426cd3dd7841b13e56fe9459bcd658377b88d34efeabc1cc6540c599e15de943be2acaed572cbe76f8686a8e534a12bfa6c2ca1638ac4d66e67fe787b718120bfe02be45eba27476dedc837103ab363c31ed355bf9eb445986e4e87753dd0278353b0af38ee3e227c3a1cb6c3fb9d7c43e3130b81047c10b2a07716f8d1085eefdb5e62e41348a35ad5710c581ebe68994ec976f414dd6989ba4b1e6a0649b078ff7ee658dd87d7312586491386c6c2159fe9d8c59b84a421b46d74dec0d48fcde95445c96d71e4d4229b486629583f679928645f2832f58b9359f729b72dcf0c4dc2afd4926e085ce503b247a69c8f0dd9fafce61e28e6f711de09971c5a3eeef8a1ffaad14a0895b346901adfcf83e68dba26f7daba30617262c72179eb660ff6f8af0cb992c809ce0496f81359960133c89ea0bea7d05a3241633ea19e3c7b1e308534aa36034c64ca8de14d2196ed03be7bcd86fbe5f41632e28288eace326ce1d221aa391ade0d", "520000", 0, -952761114, 1537743641, "560b6cbc95955bd38f4b07321bed342f63b5e6722d2a2a73f09c68d3cdcff48e"], + ["065f892201d4a519f0f1c947bd47410d126c52993f5572ce80f479ca03931c462c94a97c690200000000212afde0034e16e404000000000152b1377a01000000000963acac5153536a65638c4ff0030000000007516a6553ac00630000000003df1605020000000000000000000000005a070b2e8f371f34f9270a141dde8c1f28c0841de936c4baf3762478b16b06d99b3a4029f72a3e7aa8208c848596e6934aec26e40894774d177f6ca8e1fafdb584708abb463955324cafcd8dd385176b419221a7d7eca022eddffc5cffa09ec100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a940f456036dd7c2b73371685d15561d2c9739d23a7b108ec474a43710b706c76cf07a9949e581cce87b542f4dfd34c7230aebf28dc3b2a5f1f2432bfb7765b36b0abb21a7983264e922d4ef98f29cab296017a3ebbadb8c3e9fbfd84c14d508f59a46c6676dbf3be48e24602bfddd78c77a1b37533d71c108d95046dda2054103294fad6684472858456fc1ade370b320210c85e41d7856495bcbda36b76ff6e503002ae327849ea1bb9077473ac4b4d1f27a1ab7225eb420f8e2740d399d0aaad70a06372435c83d1546a6fa6f5880ac9a1bab781d6d96d25cb6916dd3e16cbe734c0266c010ef6a9789ea70f9b42141c1e6f79b8597c686c84af62ba1a66e3662f7022f29d5fcf8931d936dbcca32412dd83e49959485815e7c838c95a43ebe993d75021686b8b4206505e1bc6ad568e96701ad7c1e4dd837bcec6523ef344b76d528240327a10fcd7425fa3e3bc1f213a5bb970bd556ea893a4d7df2e14af310bbc2f95e02253d368a2b5ba13a085240eae751cf76200a47938a40fa4cfd955fccf49d73450214aa5a1efb49e529f42601ef83b56b789d1b5c82a60bd3e642b8b85a13d1b391d9b895d5805a96e645905f643a65891d22b30d1870c6c64cd8f22b958a99466fe43ffe1047fa74af95e1052ac111b79260c9ab4a31723178d385a22e908ca0e77bc1859302a7b39775174a257645ce850f4543ebf7186740eac698c43b3bee0cc0eea971166c5a9956e975b1f178a8b3731a1e75fc057545ab248af1cff189cd6f56d7c7c32e9c64af6621b6840d9cd92b17ceda2f23f4673c452a0d4ce45c9273f5ef371d2d788d52e6ee272ccbaa819fea053cf0c0e82d64919ff37cc2179b0fe6bd0694fa1916a0b1cfa7ca701754c40eece4584d52abf4dbb6acdc76f7016dd046b4f41442fb84d3341ee83f6ef7bb1648cdc1315c1c907711d6aa825227981c285754a554f1a8313f710000a9dfde5ef1305909f71b11e7e74d81c3d47b6898fbd943bf0ffbe459c9ad325a6f27e0e344c45a3a90fd382e7bd2570d0fab5405088c912bcbb1e47e8be95cc8fefb3736776358053fbd88685eb926bd93157cca48d3b6b71cdb7f16a188df43f9792877c2d93dcc51baf27f160fcb687f702cd8a1c2be15c0d9c2c6a386a113c79189744b1cde9a209fab5271878f22104b6168c6f46c3f4ba85213646c54f25429bcdab908ad1f394c5ba651e941857f078ff68718e7f1e8edbd48875b5928fc3f09afac0d38160b0aeadefc4ae416477b2f4b41c1cd8da8856742333039783c97ff451710ed1d611bbf9c72b7b91ea468a5cdc621ea39d582d58f288118c72cf4e24c8755214d77b7f6d438b55e784b87e93b9200935131b25d2ad196aaa7effbca5c4526ab69ddbfbbf2ac7e35aa25b14ea90bc2578499f17688d407db7a31ce3d9425b0285ec1e7c674b74e93a6c80339c1efbc19417eae633a8e3e452bb6e3c953c71b7436831e5aad356e58b9201362acaffa8d10034267d2dc7d3388609289db1450931f1d836455e50fca735d87ec02279b96cb9c204f0d285020ccd96aa7b21808a8b6295776e43c86f7f6e09abc938ca9bc91020cc7b73a3645fbf716d912b3982ced0e03fdd7fc499012859bdef4d2af40c2e36b78c9b1933e8d95f92aaf32b2eb03556a18019fe4e32a55581fe74bd17d93d5020b987239ab372daa029bf3f0a18a61ae33cd31c4c8ba3ae7b4e25c34d90419d5d45662272706222d782e632d4c32d73fe61be73d76e81b71984cfc6db2a45f669e31fcbf756ac9ba6ced0f5e10783953c46868a84ffc1edb43639ba68244ee6a1413810fff98148bba653d92cf5d70bfea4c50d6b740eae25b219125e51404511acc1bc5039b2aa378419c682fd3c2cc4a29a77f95ba93fdb38ba2c1daab2574e86b99e17bc6c31ba3975cb309e817018915fae574bf357b688dd9a32ce4f415c6f07ddc1a6965281dd714622ea79a863e1c55b5e443c7de710595bda407fdbe1a94f16e01bfe10253d4e7ae318a0fd888baafefdaaa3667e5989949c8fa6b766b0e9dd4b233c01dc863e7feb1365ffd936ca0d7955038323505c7c6b16f6fbac2a43c123cb1ae6c9e0bfd5337e738f74d564495af968be10970a40a4d391f81845e63da61b6fc47cae5891151d9a8429238e1a31bae4e5666f762f024cbee65c809e2a479653ffdb89afd5b99b24624f9fdea32bb5a3042f5322fe8e1854b4f64d532c1b9ede1b1294efe234f6a04990f552b3dfdbb7da11692ea4a9687f9bee6f0c2a4c9d46d253ce6b54d41010000000000000000000000006072a9b16805f1e6e662ada3f4c7b4acac1cf26af7459c9063d23ded0662393480c1dcf2f0132f4c4ccc9cd8599b51ca3d27d4b19d3e3ae775732453fd9382025cf686d40d5c026ab808a5bc591b1d52c4038a9cbbba5d4ef1a2455a7cb96ec500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fe80d18f0baa3fa04929a5cc359de182567fb8f64ac87bcea8792dcac7dfeeb1953310db6d8d27382ca619c1a372dea449e31e2110b09b5270852530138d2d1802d2286eaa9331543318594b3eca6b23853e4a44435b60b08ce1e19c69cdb3d63bbea380fd7921de60fd57841c50b6a2e1904fa80cb231ac4f291cce1685619d0223b6e084c6ae6d6aab84bc43365f3b502e41a3a35d66bf9422e728b930642f160302bfbc83da86b715e5f5bd2d4812ece6f6d146b3a7955051ec4fa75f0da3cf210a02582e9e0418e96498f312d35d6ee47e9c25f26e44fd3ea72652c24a2f8b6d1af019fe808a2cac48deda06c35158348511c3c0f30d53cc7ac91a4ea3b0ff6089030f47a3fd45ce795728906020c039667e40e16a9d22bf820a18de5e3bd76d2fcf031a0f21968e3f4a55dab70924eeb7a56e503b0d329f9dbcdc60c95f34f3dd8cac032f0c629e618312011e2b976920527e3676524f5c4a1144f57e9006b6ccb0b1ca021ce978666ff829d0e3cab143d872f6684a06350ee34ca0ae255174e03c901c2e031ef53c14ad2a46af69956f4a74122a1b5b42cf25b7fdc743fb55c321ca486648139d0b5edcb656890d17268cd7a77cf7e6fbdaa47760664d9fde5186e0a9002b80bc599edb5c776ea5ee9e199298a69557b1ca02b8671c34575c7f501cea434d9f36899c7cae8c0fd754d62f1579ca12812632291c44c68427c8b4278f3dfcbab7535b1058db6f6a48f6b648e53defb3f0b8452394223ab658c9f55c18f63748c27f2b2871ea638c8d002c84fa691f20144922b0e8ac2b0e6e6144d98078ef4831788841a33e380e94abe54412211d76f289cbf9b916150683ed94492cdb2502ccad43aa74701e427c8ab1ed193bc796740f424ed1f42be315a73677cad92ccfcaf922f3903192adb1cecf0d8919cd338b1486f9c9b0683f727a14a1be0ee3a2b89562d77dfb169419b67d6b77aa3ddf7f9042754a67cd530fe748ab058b5d00eb5da7910173652481f85e130ccf7e281cbc753cde86009895f307edbbd18043518599c9edb4650cf2d8949c19f0a8e1aae127569d4f27342fc4b2af28da34208f1fe55be006fc04a75d7943b249b6847ff3beb61adb7b9d0846a9ea9e45bbbf94b3a72d17c4b4856ccd3c98abb64bd3075f34192ddd8dbfbc961843950cce6a0ab4992b762dc00ccd3a1c94559998d2e0a6f430f816155ecb468e2d06ccbe81ac0924fec6a92299f3356818b39c1b1231cd1cf2aef909d8e6cf20aaadef88dad53f445359d4f192c90bc9c5b0fc25f4e8af363f3751385fb81ef51b6a8d702577697891d96c07636b901b240c8726bdff0d8e5552be55e15c07cf349dbb6282e767b339939b3649dc15eb88d685500ca4e2ed2d5c99cdf7c65270815a50704a29a885d897e125534c80ba22c4a34158e495d157beaca5a0bac9d22142247c60ef4c0981fb0b33176b1c5497267b88bf659ee2045b61ca53d8c72ca821ce1af6c9f2372dc4784a433e4803ffbaac984af403f0a66f13a8bb6bb644e78299554765aabf618b23e471a9d7af376f1dd1e06bdabbdc6cd86a2139f29f81ad8165085881cd97831482d306aa747fad81e812a5ea17dc840ac1fe0a4ee64f467b1c485c4d3f9fec9030ce7d57c60e82f65759d2b2fdf1a60540a98ba9acc704dd9e0ba07ed7ac825cb1911b09f23f19e29ff63d4802737ee4a9acf4c1a685324ae44dfeb9c4e3cba7f3f5a0ee92fcbeae6f3bd63c116895168373de564edaa4d1f0aab39d61020ff6205c2d3b3a2eea3ed7eaef0c9652ed357c8da0ee51db0b5c09caa3ff1289d127ce433d1d2c5d390177d88d1e17c906d9f7eb691561fce9a72baf7b3cd4390f08109e14e93087109ce903d9fd812e46aead45871e4c910064cb5a070a32dae7b71d916bedfaba7f445830e56e45deecf9b81248be9403451d0b79c889dddf9841383afc840d5042561fb21ff99c2a6bbf0bb6b0d84d91b9c37aa2788071b88ce23c1cc0cbde29245b4101d4c72bd87f554eb81099515d772698ee9efc35b1a81740ae0ed6afca395ad9dfecd3cb2a152c0faed7b0c7afe462eefe2b1460165f13c5a32e0ff67861b79a1e4314cdddb76528732b921858e9dd2a11b45f6e6696e48c1e5389a1b06b0b92fb2b20f1742e3a2f93f0f6e320c08da626eb5dea1c373292e9fe81f8553cf187622875e3733c0294ed5deb5c24bd0ab84bfcaa80f6d7fa86be2e8db46883bb2a589c514d1591e922432541bc7cc430d5275c6e9aac5f101795758ea49bc5e973e1b2e40000000000000000ad708c0100000000d0ea4eb0a5f4ea9dc6caa90d33963eb10037e8ad18b3e049832a2afcf7f058e56b843eec0aadba827673aba2c822bbabeccdee1392b34e6565bf9526bb91ab7cae01a3de2a3b42e9f26a50a8c961966bb122f0e72b72451123c7263ff2785daa0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015e46c7756ed1d9f4b5abecae6c6dcab700f8e852d99f7589d592d3ebedfc31c04396b9c0fd1d78bb8c9f133bd7fb5a0ac41809e5349ecc22bb1f21d341cb5a48a00390eb7165b454c5aee4b39821b5d2eede112317d642c55c266eca9b98a13a8c94fdac3ef07db4e6e58102a2105473872aaff8f5c3fc832b10b8fc31e23d20325fb7ee02c39c2485713a7889a0aba317962b21485bd95628aaa48aea418433e0305489ecee4e1f0f5bb6c1316d4d2794d7ac5a9ee26945ad9adb8157600b7e0690a019ead4bedf4cc448193d7a3ef6251014c184df9918103095e329bd04d237f49c25ef14759f588e25314ea44606492ed09941867bf8bdf0d221a06549f855a400324b59accc537717622b0147e2da02d65724e8b527bfaf0e628de84b1506c67af030361b36b66463f031e88c8f34d0a22d7610c4666d088a3063fea31f8f8cfe55e022ffe221c9cc2954489257753432728b75b1d3fe409c27c87524b348c1fd25f520220fb6bf51cfeb9e891316a2392f28d472b2107cb4eb77c86ca1461c44e76fdde0213f5ba95386d8bb985007d1d998062872faf65302ac9b7c9454ffb6297f0db66f319462151ff9e83ae0980d04ec291c10cc3ba667888c291c8c81c056e52c7ea74968da5d182b2e641b6fac55180817bc7e4862c90e3bf61dc775428b5984353b71b818db175217c14137db9cf58a5a7c72551df141b7ccc8408ae885462f97736d71d2323b1c023e352e902998d2f8f9fbaa399d0c7a31b61c93947021e7e0bf023b4197e7eff2d73f86d4050be82e57f7e5e9a63e507ae85e0b30e0168ca8a36070737a94600c4748fd14d1b5e9e334d12a8d944f5da476e923869e2f4e8fd45124f8a9f88540cbed1f2380f296d5ae6ac266d2a4efd9b42abccf44ca37a252158f4b21bd70c196f0b1825398891ab472a23de86898c1ea3240c8e9427ac09286e09e64faa6a003c5a06cfca34fb05e602084a2946026b1e86e84847a0bdfa31be5a6911bd53d6829dc4e203a89499724a46ca16292f2444250a1a6ec31fb3b9b9f14adaa677d00f20d0e1db77e7fb1fb7ec780bf8b7d3eb56e5ad386543b96c6826b9b46005230485b792e14e18c438f25a0c592640aed5fdf88a48eda50e836bdc5569c3e81b0dd1ecab92ac22f1bc73b99f7ddb69fdf228f2f6c90e9ef7880622d3a959cfbfafbb6e88a29dad64023536c89b706dc22d6b6e3ff2b04c3df8c8a0f58e4055286eba9f8458ea9ef3dc1134c8c313c00ce86ec3db0d730d4ad81a35f8d8a99365adb67b838c66f9b961b159a50f8c632a077448b2054c9b3d71a90b7089e96e86addfe76dd51596a11656e0f2269212381847f064cea87f2e895a3f5edb9cde0ad5ba33023291779f5957884020ad68bd9fa103f08743bdef24f3f9e84f8a96299c6f359fbfb6e0da11e044867769ae167bb948af1b87b1fb2b7c80a1fe330e0f61b37754a1c6c826e71d2e1fcf133c9a649ac8de2921c856be46323a65a45720a453f5ba502eced76fd2713bc35184faf67c8ed0764f37e23fb88aee832bf8a6762a073283e0908b9e1d037297d16b7ce7c5755fba3990ec14d532cdf94b69687e5f7303abd85573f0596d56b37d336001aa209e5ea0066bd472494da03c3f0b30fd2cc3e238a590802243e299962f3dfd8d05121669541e431d5c87a3be0c262f5ec7168acb2ffe50eb8942e2dafb8f85729525e9311c2f067c83ae8cf71b60e1f401a75bc822efeeddd94006069f9099365f48e8c073b759bebed9c9c65d74f5ecf89d73a71faca0d83f4dec69182700e710a20fcd3245c3ee036197c389920e3c1b0e491cdf8f306ad32130a67395359cd943d70fa75ef969ad534cb098133202406a5ea54d6c711e1faf9ebd0499c702e0fc33207b0acbe6314096463b04296bfc90c3a8718a853ca727e9963cd7646056e938a642a9cefe65ce4fd48e6cea00385b144b48d12ed243a356d2a4060ee4be20c0cb2713c2772aa48c4f1d508f8a074d40801705e4f7e2fcff2f0971cdc667b4eeb70de5ab210a3c7cc982ae27f502651fb9441ca02d2ece58517d8671b42fa5d74b78d5b99fe26fbca0add167c3e2035eef3978324c26c8fa09c054950e60fa1f4d95f4fa32d24f2dcd912f29ab483b3dfea9dc786cc2f5f2c33893982805ad05939005afb8c272e6689d8b17795555cb8b629c20d09d32ec2e06505154bec92238af6515f95d5dcea29c6276d2b47b42604865827f13bcd5a21aac9595d4c75eadf3d8b4d7c93706ebc75f89d5f04dc9d22856a3db8bfbb00ab34ddaba07c2898672accc9e871bd2caaddf7b20f42c137e63aaf58a0741d2f1963cb399ee03bb736328301bd0a01bee9b2f73bb748d3a053124b92873d69ef3fa7d152237904b0ae8477a7ff1dd59b46a92dde32b47f2cd4778b303", "65536a6365acac536a", 0, -810573223, 1537743641, "df006e9084e54f50304b5f64ef527dbf4ac0f84544fa31cec136a8419ea813af"], + ["030000807082c40302010a3057fe70aae3f72c8f81340a40e90bb1c3d1bd7ea5979eb4e4fa01f74c650100000002ac00ffffffffdcf2ae656f5163022e68851c49c47e35a13b548cd6c35972b6dd4c63946b361a000000000851525353ac53656affffffff04dcf4a3040000000007650065536300522967d0010000000001001b9d9c000000000004006a656a8e6fcb01000000000952005351635365650000000000b3831a7a03000000000000000056caa005000000004daadb0d8ef982425cec7b3c20c29c63b2e3d5e797d69a04cd9b50bc45b27698b2a6b733639e5702a7f031d662ee29132721c6915e8d3dd60ddff1a207207edaaf31f61cfdf0b53c67586d3b580304e5eeeeab9efd4c76f34cb588706c1a7d0e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f2006d6f907528732ce29fc0a414cfd81bd1569eeec21dd83caed9983ce9f0f4675cd8cb923fc3890e49abcaba7d926a105892fd0959e168fe556abd19bbd4913debf71f33c9f507bbbdae652076fea74b6bd2c978fd49e33b185c5c63e38bcf1f40fccb98412a261cc4990227951059b080aca7a154aecd34ca52d9f046c276021c7352f4ca9a7f5d574121b34f26573c064ab04259cedeca3b150f793582e3660309e2e7bc90c0fb5e861e6afe11069771ec01b0ce14dcd84c8383ab357b8920db0a02c65e8291d47003e02b7668c87ab83e6e6f5ced9d0276e5b5bfb25f7fda4aec9675f5fd0a1c501d4ee25f6022c57b59512e0302ee8064521cccb61d4e2a1f0a0325d7d8b44d54ca7db9167ff034b964f800e10a160819855fd6df1ed11bb824b002102e0dda32c615209a910af1020afb59104a0ed60addffd7fead3948eaa4d2c8022d53d61b30dc00c0ea309de654da61d52013d1d7011c587dbccfc351a067eadb031eaff41f6ef2a5b4772e0c79fc982275ec949a731b6e0d476d75583c44b5a3f2021073f84db5969cb779f25fbb9e21294b70addbdd76c8467e1bf8af693b04329d6dd647d40e1f205581da8cd4dc43d6aea3bcc10a570198b85cd4888ebad6bbbe2c2f21c32f3d658fba1a1a9dd68f198a54814c1c5208ff8c5ab8c3acacd9884f70f74b3acfabc1d84fbf4788bef87ca72a0bb1433649cade49762db34f01b01ebd1fe145455c8f70dd4beca27b48b214f1d19577465f4d129d30d21f31a10c7316dd06baf615a1e68dae0423e185d200b5cc5d4e44e3c98124ca885abeb6ca5eee2eaa2516832d62376d598b2a56f7520a0a208762fd7d0ced37ae156ed603aebace569a60aac283f11b0bef0c92f328cad8477c8bc8d41751d1b0ff1d523684c0f4a6217e1486f604ee69b49ba378089b196cc738a253c705eff9ab9779ede0c6f303bbdde98b96f2fc483320c6583725ecfc78b22050333eb5d7a1cdca13757bf5fc4ba6a434467f56247b78e3aaa58f4d1f72f4331309e3c98512ba8427b440418cd0929453956b1b7dff745d05bf7532045ff41feeb597d7b77e0f147a3ef810cb2bf54f684b1e2ddda902e7f8fe2d232cd3667555130eb6c7c5721467aae8a7a78003668c45961e0950a196aa08e7ebf6afa6b3123bd4c9c633f5f147b1dfcbe79220293bf1026b2439607c469699963841af56cd0c3226525796042d48ba610901cc300a7ecc8f1588891b3fa5b760c6c3121f45c5a06f0f7284dee691cd699ac8dbb32933b4040420a77b77c4abdf333d3759378c42fdbecd854564340fe0131915b27c901ab1813bde646f3325a5b4d4b4ce03b51a004dbd68803cc3d1690b32814d4961b6690ac082ca5bb7e34b9fc6e2c6a870adac64a5e2d4d3691a42228b951b205bba2072e06d2657f79f174418028ebfdb8fa854a4f6ad1eb48797eb74d2ae68b46104c19b6711451665b90f4ad523e8971438e7b5b19913721e487230435f9b3e9a05daeb75c472d834c56be9174bc6916156ffa7376841a5ef4bab68840943d3a1b002ef8bc304cc0cd78492546f35fceb645f1a66a88867b158429471d94ed6aed77e7fea0e2cdd4027553b194d3ec80909a5f5e23a134fce4f6829ab3c433053f1cb6226c3c5ae097595abb58a0b35d90bfea2699440f40c0afdc76a2a28a8aada8d267d93fb7502c4d83500555bbe945519afaf949b57cc9db27d0abb3be22af638ac0e8ef231e6f672e5a93420e49b5ef48cd686ff5f2d9eb4005da839b7852e7bc913f9d96010e407733a5fd8eae1efba7759c393ffebcd561f287f724b0faa1225a80f1150aef42e43e8e604af05dd55639431f56a23fea96e43381aa694e399b97bf4ed23ea48d9a4418213436e1b217003399b6c419d938bae3e97eb3b7342caf4efce98a6ecccba4a4633fb70abda84356f9bacc9fbe2b54524fec099f44c19c30d71ad054322502dde2c88fa7aeba419b5396bde30edeba9e7b13d73b5f516750329bdbcf54537038e531ac0e16bbacaabe0c4ef42214e93e3a89989dfe3087569438d551bffadaa26ce886c5255be87bec0b0d017b77af50381979dd54b4dac4e3402be1eddc461586bd2320729099809f178c1d74898e132858bfb7351c7fe91af3fb0b8f0c71f370fb9850df74570016cece66beb4ba570129957b45facb5b534231e119417ccd1261770b9a64ea9faf791f9a149486bccf28676a03f009724ccdb939bbcc4b9f29f68398206b93ee5444572206b9903dc2d1b41be4fedcd6fddf7a2c48fd0f6020000000000000000000000004fbb7bf2ddb1d3b35d90e6ab6f290d34fa766ed15153aecba158304b0d4cd3f7a9bcb24cb74d295e47cec249cdd46dab951d0ad8c946512b14ea4a2c0cd07bf727b1ce8eb16228c4c0351d2705e902fc733642550e29ed42fa525679ec99fac400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fd1b460fa2859186cae3d9db3fbb31b15852ea6ab67f1b04392be616d694820be0a2a2702892a7e8ca31ddf080e035b1fa69ee09276057b38c4dc42cb92c6e9cec622fb06c61d6b0df8ee8391ec86d6a4e0441f5dc7e27e58cd901c1ddbaad9658ff964bb4120687df46823e5d9364101225c24acfb5d615ec808761b65e7344020ea406d6ebe2eb3920a88497d6a02d7509d1a320d0d40bce3284a2cd4cfbe47e0300bfc1f0155a46be0522f16aca86e014383b90a69f78976f1855e81c049dc5170b04103a5523353872b81f6ac15fceba0e394d4602b6cb96ca131ff59e332981c02a47a4b3b4658d7624128f05fa9e7d4a3ec706b961a4f92eb158fe11fa06212902260c8f74ae5a04328d5a033f4b00dab36523058f866ac1360c4e151c545d3a5d031b672d29866af76138980ee10bd00c71ed580e1e1f3cb3d34e85ee7d606a9c0c0304b521cae86312ecad1cd827205e15ef4c4e1b1a922577da34fe5f441522c28d0311f0121ca4d86cabe67c79986230efc66d6ccb93ca5b613f4f0ba2749c187ceb021a83c1544773a0aa95b3e8f3c4cde172fe7198e8a6f317c34807d7e46c4646fc4b76dabe8958130ac3767e8bcef2c3685d36b0bff52b73b32f7a72c20c81cc5062066068af854c9ef4052f7b2483eae066519228945a65b8f93455fadb634796e2127a5338d09c2b5d9cdb930419a7ef84016b8f8e7eb2ff1d7da8c480fbe17ca9901c5a79a1116fbfe44f38bdd6a3a341be29b9b50f056f243ebbf6b7f16282b12a198450799e67b67ec2f109f8163c573eb4030fe83274a5f947af82f51c66aeb713ca0b7b06041ed587a6df91248d6fc93535ed8b54992538c22d1d834148f224bb26ddd31098d5229a69ab6b37d87514c2cef37bc09e6d300ef056611a2efb46e25040d8d51c17a6a95db2e7de0938ad5c4bea88917d1e623f0b186526efd47506615c4ce42bfe5b2331ba2d29c5eb2a4c3b697e9027f4345c3c06e0ab48347dd1f5ae35ab561715bfa68922ca1c11701d46139e5499f022b4a64c81e94f1a8ccccb64131a95f628af7f54bf84f9577e4afaa54e22f68a6347136f9a5a3d3dab2e87b83c8bcdf63ba7b5d155608fdbd8afb7eecb424d3f22475b8ec58b1db065d95c392dd15862be019dee18a9f9d1e73d37ef27d2a3ec8d05c5b7166614a9236d8ffd3fa45abf662d1b25311f9397469d5b8e0699f34254d6b715929dfd8116720d69f073beb52c73501817724d089e7a9fa2cc3ed41d08db8221b703f2c79a67ce0e0f06c12df2f257f4adf294017ff48731eed4a62a24786c4b8518409d48b05c2bcdec0b78966ab9e1add4666100278a76befe6d4796bf4a4f6451404218601cdea30d82a3d5a35e45829377d17e0296dee40c4e62f15e9232d5494b0f4c9f4ecc95640d5cd69539897d04cc8a5a4ad4d4c3b31a6311995bb80474fce0faf3eaec4e63fcb19948c120bac49c7b41863c769aedcd1e0c59a0eac3b4bdb1e5b9242023fe290570b8b8c749dd0b3d956e6e7def2711506d13f27ed45fac7f302573ed7815c8dacdae86315f9a2fa538a1760a5d9dc34c9dd11bdf422610dfb6eb9eebb0fc9fe901f3cc635a9ada5dc25d450bc9eabd11435191f5e28da13db3c79ed5c8505bdff9f1c9332fcfe1e2e08c500cb92162f0db4ccb2fda920f726683617558725d6024689a50e5c5a63bebb69c206a64b0974ff887c0c22e469eac77cd8c6362ad840c97532dafd6dd711a3d9b1dbe3e76357456d14372c7c0484b31cf471b0e4208d824c747c088b3ffe410dc6df09214fa763188424559b05037ae2bdfb57dfe6c2ff1658385b058783da9fda2cc5ddfcae1210d7776fe8b53c642ce3ce4dc0de688ec2cbd8485776800fdb602461705bb565bc3662a83db22bb1715b25730ad4869ad3bafd1703a2fb287fe9186f9dd1ca5f7ef6cfb84f6f447af1386b8ab488e53a6110a603c450f9a1bbefd682b7dd614a9b15b9e30376b8fa684118b482c0e9df28668a7bd2416ff748cb56d1a59c5cc9dd03e95a8eca2f7163e6a73e9a77d2ef6b43c4a083b9b77fe4ef8f9a7933a8e062db7b7cf9ae04df1d22395cfb10fe6e4b9b8f36cbfb7a788cbcc3aae3d05b5acd847575d1b689bb0b41e1ddd9ec2e9357c8340926fde436baafeddaec89975d1ef56264ff6bcf85099448a5ad8558ae8193d19c7011133140a2852e5447fae463a3828a331ef24c3ac06199e25f85fe0dac4ce3df583dc712d286d1637fd4d7ca4f1cb34d7c4e88d2ccd83d816aededaa5159cbe68a53000000000000000002248910000000000dddea4c3d892a156383586ea7b98405e335272e0b980fab7da03d386be8d52855a5ae24ab3bb13878f703db1184d015f10e1071a5a8272d40074b9c601cb6b011a865aaa90d60d315dbbc951afdc7ee8ea3b3673493724e5c684759fa590d7aa00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000291c660fc3faa8f844307ba6a49fa17a8ff3f8a8050d07addaf3e6c2eeae6f8720da35e6978bdfa9136a09171cd4a6e4b84e71c2c46289d31793d8ef464fcf9b297f6c87bc38cf539a8cee2bd9ababd756d793cbd32edfa764a966e4deaa024e268ab6d647732d55763cf68f53362c774503375bc44288794bba44befe7212030311b4de8957a3342990d5862f97c1acfdb77aa8648c6dea8aeef5d7db17d18c470201db4348e37b66d0b8d52f97305d7672da1fd6a5fb87d7c44fdc7504ec2cdf670b043c26f4a79592fa4b8e42492c60f474ceeb423c019ca281c7e123b87942e24efbb078af83f2d3390f1b039152a09fae3d8c34c497d402d821a90ef1bf248733020f7a13368184c142e6f4b19eeb6bd5ebad147d0b97aecbaa57840247e33eca22030904a733480cbb4191197be262e9ab4eed91c0d6b075a392144e824df1576b36021ad2249df354efe1247a56441aea44d905c6e3853a52aa18402ae5a6771bd3d1022afb947a61dfdf2753d31272104525895fd65def42d0968b3b658f181b32ab7403119149fa804a622abcd77155a34e9b9517fa6e45f7fda4c08bd438594f1b076b95bfdda85ccb2e4e56580f31e551831e1ff35ee857e8d2cfb39c76c298664c4747e131dd3eb478be7202425bdfea0f0a42c1b2090d90201a6c3067bc2ed830e2d312b6795e5b27b28ab19141a9d7f8fc1b257b9dabed883d5116400bede0c2743a233658ca7b810e8f8d102b3e0353cd0bc4992da91ae53780bb0ad6d06088d4ef18998165420be646c823afc3df33a3d73091737801710007833d73311afbd372cf2f2706fdf9e997ab875596551d305b3d53755104069ee179bf9aa3fb2867c412ef799566f215fa385a27dfb31608919a54b91d034e2d24eb4e4b8d88f40c618855cd11c3c38949cfd3ba1c0dbdfc1848b2ce0f13d6857b48be7aacbc187beeb63afa190d1a2f84185b0351648cd8509adb49f240626efbc7b8b9df98960575a03d1993d6bf0d93f94e0c837a07622f2c2e68cb000dc25b04de3db6694b3714fa99bef7e80d831cf908a86c146451a4952b0c37c8afbe03f8cea5b2a11ab2e107b61f1dd7bbcdbbee99499e1d5e463b0e06d688cffd23224515a8bfe1ae2f705900eb6de642ab46c725f5fd0f2517dd77666ff36df5100dbca765c0e2e34f2e50da19d86201541037ecab7f8ccc27ffad774f83cce06c6e362bd4afd6b01522c8dbab4eb2bac09bc8411d7115fa18d4dfda31ea31e962dd69a1534219b895788298cff5218e60dfbc75923420f5acd57f08110321d4da1d0140c0eaaf889192a4c68768d95774dd281bce4c64c5bf0fddca4da462b4333d3b9df8747a8ac93d1a6e0052b6eafe2fc3973077b3d0fdb66349deac277830fc8d3069130d0a7871ef5ffcb700a805bae1a02683988c1c503cdb71ca067e8d9ee4ac24d0a84a318aacbf6c0ed75c5af48f2d2bde6cb2fddcdbb8ebf532df0b0e64f86bda6d10a4953195c40ce105a187a34e62b97158a18e599defa7cbc66e90d08427d09fa56c0842b1494d4436cefebc995f7656a18ec5790373d3831e2eb8da740ba77828eb91fba3f16ea3cbc635eede1d21eb58f4949bee8dde81f1c7874c0fb70ec2bb2c02b6a0fdd7119958eb3f078e6d7c2a7abfb59dcab7f343d0ab024b1700021b1b05a160e98ebd2483321cce96135a36ba90ad5ed2f57170753fad0d1b8ac686c902f3728378e564de32cc9e0906ac37f27c905b6526373e79976440931b507d450762aefb7142f7f491a83e55ded4c161fb491364a69605dbb50a453a913ddbde6b4e08ce1783bf539c15a7db57032d96ee7b1964213b5ed98862fd8734aae01dcb3f02cd7a8a1d5fc90a4b3675845cfbb4e83569b01969433bd7756f8544c801d0a165e13f59e2bbdd9ff4531bac2b9924813b0808d2dd8a43895e058cb857f2927cc8766f8573889c62c1809d3559c3a39efb1abe928e64275d0202e186179c6e755f4a4248d75cc0913d6ee8ec2437099b4d59b90b569c93ac97cedd7f2196560b11ffd9014c690862766393e7e06834117d50057153f5b60839cee5198e6d2862a8ee55853a0b14dbc3ef2ad867b604923fff356beb53544eeb176ec5eff03dc4b06e2b8c436a99b5cd3359400bd642a17e0a7f7edc1239da43e40ff04a465ebaea561ee26e0a53a38efceb306afd86570df1b9f1df2cf835efeb3031ec054f42ccd76e0c800b1b04f880ea6b884a3303753983e0fb697a1a37f7c6a180fdad03412a251625cf1acf370c6ffe279c23d5a5ebdef910b88f792665563c83cb5bbfbaa52fbc8b1204cdacf8204640bcb45e308bbd4e84db0b3fec531c600b24e8276a21ad82676299f4de1a3fc7b0fdcaa9f9b6c966b6dc3b29e3b4dbc94d22d004a74ed3870711f486f28e83523fb8700c", "5251636563006a6a63", 0, -821722306, 1537743641, "81a1b9735cc730c6137fe3eaac8ac750598acdb0757e84153ff00cd4d0346c53"], + ["3b9b45780207f7bfa2854617e065673b807584ccbe95fd2a414d120ebee363c74488eb1833000000000353536afffffffff037f8caee30747e5145eb706966f2f59801af0c4933a8ef49962f0c569cb48d010000000363ac00ffffffff01099014000000000000f0b9e2be02944c550300000000000000000000000039c3b68b9032f186aed9353e5d879703838f573d99bfa75dfbb89015980b091fc57518f0b310c2c4146cf206ce1caa7a7aa01c50392e17c887eedf249f7c2d58756c21e0e5dff7ccb110fc0c1688d964876d73ccb65c337ba9e426df9f417f4400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c09bfdf39f71a31e5f1bd1d38b21e0d1b68223216726f6d0bf0986dd5fcb5c76e7edc63c087a6a08e3844aaef764100f971fb0037c15d4fb40ca1f05eab441fdc05610466638d6e0376fb335c6617545dc7a52c2d1918463662533434c43484d4a9a0538a085e0969e2f1181db09204e63b76e3d74915f0bb2049d38201112250320e127577d9e2c50b3e2cd3f6c71b870fe0bc51999f968358c444d8dfc706a01031f1ba499a2ab260307d96dbb1ca6178e7dfddeda14e2b2f78bf79115e02d5b800b06902feb936fe0b31f1fdae8170fd8c415ae8bd70fb396972debea03f3d91c973bc5f76611db3ccfd5a59c14403a7cb46ca8e61fa30467ee0346be1c30437f5f0313ba4c9576c628e79cbc11fe6b0d4776ccd71ef666cd567348d4db971ec4ff1202248e5489b01b89d11ce1f05d22e8f9ba1989837131ac0e2504972e6e68b6bcdd021fd3275f38244d4da4acff4c7a2c616ff66c6c160e11ce917371e1a6c02b67df021fe993d7a0edbed3f0eb63addba8f9c060b4393fe127995a4b2b9a659a423e6e0312ecac703fc94575f9fc696b3b49bc773a40be99fcc96a4f367bc983adb920647ebdf24ac31d6740f2cf186e88313970eba39a5492a06137788f5343c80b32e7c884cd4bed7acb886fcbe27c6132844e2072d2001cc7a9d8d3adc1fb21969997cfd3bdd040c4afe1a28577c30c77c17c6bdb21d1bdd319f0a667b3e95f73e9c996f5c2fa88f867d4cde228ea240a7122eae1e00dc590c929a2660ea0188af0de01a6bc1f0104c415d4bd970a8fd6dbf482860e50b5086036c05fbb95fa78c0e706d5844ee34f174206ccb76fa8b7cf654582b17fcbbdf11ad0e6c4bf6928ff7a95e0f16f46c70b8d7bdaadf2eb9fc4c38528f9db2424815f0afbc5b99ea9d6e934f5204276818a1c8b0321e9b865117a4167c1d73f54cf7857898821573f7e6bdbf59b7b597a434f172a34135021a94a4f371cb69344667d0c021eccad54244ae0820ddbfedba8b1a3dae41e2c9b66629632b82ce4d0be65dc00fd6acb636f6752dd558d1c737983fe5d567430f50519dbcbbaaf0041930122fd7142f2d16e5c97bb07f1db519cc85023b9921d9f317d9aa4a1570b4c02cb9e31a3472c61f60f6a372125c000a6493624cd07c48c21bbb1056a388af5c73b3657c8826997c19184d16fe9dedb87a9c4edca3d80d75202583da5399344ffaeeae53aec52fd4f74470858ea52ddffc66225c31a91df8f0a8b3778276e267dd46758f91514295f22f6414197f847b46f976918610dcaf4e6e88972e2e978790f0730362dbfef401d691e96ffd28e3d97c881aaab58b935a22d9610d3011e76a5b17d43806fe3f507c7d68f71eae32c85af9502ea49eb034680c5e760a0fb5e0264c3fc05f6a3b20b4792f21c26befe00b92e5b23935a808a714e5731afb9483f5fd73f4dfd99b34e2d37928286a4b0af3c33825fa8aa9a0ec64d302111ec360e56d6b37d0c1112c76d85644ec8a8b2877126d9f46581009ff3ed6735a1128adbd4d9a4becc3748f8a6e7dec600d8c9631d1f1850132d302942aaeb9db3181a9bd3defb9cdf3ed2bf70b0fa3e40a3f6ee957ef0097d6a593c9f87496d26eaacb7ddcf46c976dc289c8f5acc4e56728e62d312b7182e5a919ebb050736133a2f951b237d909e6d7f5515062d5dc469949e6eed7a15821188146e8a31cb388ec2ca27b2cfd69899114bec151d06c8a9014495e19dcf2058a25192df81b202e25f5ab58ca8361fb32b6cf78779b7e3c729f1edf7981c84d2f82ceab32bee6f8aef9cf568d7ec14851f7e64ce57a112afe949b9dcda9230e7025bfd18cfca6810bd9f47aa65af9d56285166d49c8ab4ba92fa3ea87699530bc314657fb265129967c4e1be5746b8baa7f8c5b043875c2ff0853e5d71799cc19497e1bdc925617b690bbdaf492336ef29978bac3b8a622c7cbb56af785b5beb24811f33ddd9fe679d1a2063e0d5c22c08eac34141476c05a9317d557d6af41a2947f72bf8762d2470d9d937e4fc4cdf351af318bfa36415a1ae56c2d859f1f3df53a08ea53be86890c4dd0fa3d037734aef6346e14e21d549be31415d0f4f6d983de78897510b6c5466a28f14baf0cbc2ebca0348f29d7770e3835409fffcaddff6430cd50f1b683df506695c15b1b17166c07980c9796cc2f8048f26769222267a478c023e234d1502b0151f2dbbf11315eaf6550853b8472373ebe602fbd9625007a8056eda6788560ec9747e6eb97b2303c316189fe33ce18f7ca1028684a515875c00000000000000008b74a604000000008dee903af45a9da8f852526ffadd94e2fe072a23caac6277b693ecb05031d87a64ab2ec1764289e8122bbd5123da5d4b1f44b8d84906785bcb948c492a22cbc34c2da2338f67484bdeadb62c7344e7c94eaabd490581e085e46d3ccc7f4a252800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c55eb44dfe81c4d36811116f00caf77ab4f94760d918b967d81b3ec2be09c7be8fa18b67a623c3361eb088760682a917ea585f4e6f2a428724c591b8aa08827ddea321f8139e6b1c6fb8be4f92586defccd1a705139430bdfb5ef864b41ca96ece4de14831a6e1c9bb0231afdb4019e6a3f888644c404a2612616e29b9fca3bb031ec804bfd2f7519f476638364eeb95e2bb1ea4b96d9a111c705a923baa76c023020546f2d7c2dfe308eae719677523a0004eb9a85c9c60c529330c23ddf72108160b07c2fe3d575cd153431197591f30acdbf69b9b59857e01cb8c620421235d311d9b2fe968a3c0e714227199b80f0ba72ce8402c95e178d06c826b2bdff7025cae0216916c9d8e7e48d3667f732975db9a1685fa644a8311a354bff3ff0e291b26460224b1f07d93195250cf796c1d364c19aa4b01d26cb563b23d22bd7d02cf60bac7020add8d8a7edfc73b4798177809a83976dd8bc64433ba4ab84fb2bf9a93c3a2e6031fea4f407c4e8dcf160ba67e87a01cb9ce9c450376598e488cdbf7d53e3a59580305a86153b1aea95e68bbbe88905884bc28cc9e7445bb177198249728ddd35e68584cb69b719cec46b1747e89932ddfe0cbc584144e9e218a00d00f910244b89be806e0fd17d648202da8e4b3ed13e607cda2124ba978f7172cf6536f42eeaaf18750c5f18155b9195661d5d938fa4a399a0161e25426a42a33407c8abf3b5224c9cee46a81758892b15ec066626851bed4919a860b0e1476bc64468c101aa5a91bba96ddfde01395e65c09251124e7ec1b02b1c679ec64a9a0539a8fcad5b4401b6960c38fbb539eab96e819cebccf3a2e9ed0788cb265876a4fbf54d87e5b9b05ff0e47863e7e389c86be4904459bff915df428428f78bc1d1809a481a9f77ba913fab8e5254ed493126b66cc890dc4d93a06d32f85769c02e8e1fc5359320aa600a6454e1ebfb2088c6348d550f7396ab3bd091856b8152b00f8105e3c03b1d1ddf50b9682307e0840b49178d04417321b1f385d53cce4ee582ead2cb4233f9f14a3e90c8bac65046cd5382798715b6c8b08583102a07cc4a4fab529fb616594657f01636aaf2154d9e56d8dab7360b320325ef43ce3a1ff784edb4fac0c704b5acb7166985b9ce689e88d39a92c823263cc12ad7b80de5f0b22f68fb64fed4a925c2a8b936de9973e2f3d51b50cc2ae399d601cda6fd72a8851442bcf404f046ddda73beafb387b9fbd4a3badf2d39f009c7dc629880435ffa39c98738d9388b0aadb52b48a5f9dcb9d6f661df52fcec02c1c57bfb83358eeec684d2a5520e755c4f8a094f34c97f2201a70d22c9723bb21e088c4a75de0d8e24899dbd668de69931d2cddf875201e4d4e1b455736723fd1f83ff47dae90c8d13a5c795a3aa139c7de48c221730da9ed71aa5e57eec0570edd8315db9e607e9be30670799ef3f374ec2f2224b3029ab25f3fdbf0090359077ed3edcc6ac16d079d483edd5b502df88c1da932ee8c72fae7bb033486fe9bd0f34c5597e1a2cc9870d93721b9cae9b268066b16e442ba39a1f9d6e1bb2e499b85a487e037738d2d654d3b2810e643eb895aebc8c4d31c30ee1330eb50a35c850c97938517061dabda88594feb7fb17ffcdf323d692f016be0fe5e41c66dd7811163c8d84830e066ce76f349774d581d65fae89f6958fa59b5a1d97b61ac00a491726ab5611de937e258c7ce412e65fe9267304ff89981d7a6b0186b692f5001e8906849bd616aa4f7a5c1f104aae33eeca2cc976d3456caa14cd91c2dc110d777a0d846b8e8e7579e2bd5d58a5ab3bb3b41f46d83a5dd917dbf548c1ce24e3ca5ee09748ed0c6502a228c1a38bf033e743c8aa95de09b99df18d2e2dbf053ac27219b25d0f405c4be22470fdfad6eeba748ec98b0cda5d30e04a123d4f20ee0075c5c0ce4b3e88c2675a4f219844dc7e63090897ebb6075dab19229aecfc132755b3e5cfd1eb8d0522891186e81db9d721e453caf5b868a138672d9c4f95e6593a9b418dc61ac485577dd918efe2f4fafbf83f37884e2e20173aee8c79c17648f5660002a2bfb0279664999c2cfcca073da2565de88010369795c1a6aa9f72343d233fd2b7e9a6561fd823f70e94120862e8eac7c00a3e3b82bd0894e98c5bfd5a0ea78e11b7faeb1c730f4847a60640b828ead1796c670254a7883024dcd97751b55a5e2e5408d3d111bf4e0a2a7ae3927c7c7f0b7f977a26b96b65edd66a16912ee1716f9abe643ac5abc22e2e127a0f96073fc01ec83ddae8096b02fd152279cdc49a5c23a6beeb0145b91c7273d5467b3d0231811289376a7319a8da23fd2cf1d2fae16f91aa48981f6d911caabb946647d57a782e4263985412490626bedb5b5f7e31e9d07b4fe0c6326e37bef2dac0962fbab573b05645242557609", "00536a63526aac51", 0, 570397389, 0, "eb2b38e156f1b9e9fcd84551cdb9957b0b8d4b9350d114eaf3dd1714adc37d38"], + ["33aec4100292ccb42576e997072e5315ed7dfbbb6bae5377901b3b92f02e8bc82ed3ea8c7702000000086352ac63ac530000ffffffffd4b2b7310518e1316b8afbea94564838ec4e501de880ad2788622230816f24fc000000000800526a6a6a63536359157dcd02b4e8a9000000000000595cbe050000000008656a53525265635223b0e5b5020000000000000000fe047c03000000003a65d07dbbeb9a6fe3b7dcb3ded7d2ca86652d986958671c5ba67b83873066922bd9bf5015650008a3a29ba4268b234eb961cece388809566f283f7428c6e00c74245af2021923cc3625cfee2030aac22a8bb6c1403516079b1472f0b27ecc37000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004f488b136fee0935335af50509f1d181ac7bfccfd6d8e063745e099bf0c7daa19e692067fed921aedf9c4afe8a5fc5bbbcff48a429d8e0821eaf2927e212f957cde11f5b468d121d5a44522c6757deb02321023154965708f33bebe7a37a8f45b11f052f51def0f6b80769e6d9d670274b4a71056283061d79f5ac4c23393b0703302f7090b48380a29751b994bdf7ebff8cd1d76852f49c412a91b99e06f2a3d3030d7caa34784a767e0d25d98844bec72b06a4b3b8904b42f5c71bc254163ae2ed0b04439f82871e9a0636f9af098fc998a3f3c34ffbdf581e506a2b7b8d8ed053c860d69571e4d98798d8be5e02f972551f5e327c809a0257b5277a70a1a6265d7e02094de109ee14310b76024bd02000193ec518cbd7401522b5968b147c3ce87d630217d040d6e68998acf1e6b2fd10b144f7b8d72da3fb542905a9ec9721b8e6be8f031991c24db2f0567649d796f34795a48c640d2e66c3a94684cbea060762090b820309022bb5f2c3909480e0d1d8ceca1ac6c8c1292107b1819df0049fab1dacf33f030ceefcab9ff14c0c49681f7a8d192351b3bccff518f2597780c177b87523df0a286434f083729779a3d1b4e6de7befab932b9cbc7c4790055bcd765688ed6c2494ae033aad4f44a0172aac4a3558abe9c7f05941e3d75be6c2bd6502fb23740355d69b88fc9dd51ff5b518a485f1e71696f6d3cee67203b6aad78d8c9c1a659afe353756ea91bae792ef7f8ba4025c4bd8fa548a19c69bcb2e801479eb51618b7312d8601be4e9dc93a64bc65188bb180e88137f145ad3012fe7eef553e405e859d10c9d465940d80f8fd1b8a58668e3872fdf1ed0651f128022b3278c2e17320135d528c23d7fbbd5ca5fd3bf9c306cff7572b875149a9197b4cfd85e4c9aa72b76fc9e9fd20cd0babe501509a75508eccff42adc6e49a7b8d70e8649985169b7a1b1fa8a8b5db1da8097a54586e36840c0731be4e9bd5f62cfdbcccd9fc4461a0b4ee88789e510d6ced8d8e2971925c2d2e0791600432e9dcc25c1e06474762fc96a8d0d34e0faa56cfde9a5bf5d04cf2a2269480b2da32ce1321afb368f478d84803742a3dd61d727f3fb1a53f07a2bffe071bcb2b6a693d0a31c19ca59c012b814357d0c873fe42c9816e49e38ace78ea9f0b96d3ae22032eed8568366bb3ae427aa06f77f1d09670ffe48b55fbbd186954f260ef4f27262e13527cfe20b9094e772f09ba083d0d00124ad57b910cb0541b7ba5164a739d97e8cf630e4da2337aad53b2a74d886aada1ee9491255e2f919665323e5abcf371031d68993e81248352c2dee1b9a9d1d83db652b84b8624e255c8ded6d2a813c6b77624a0a60d920a0b9c9192203230838be3fb35d999d16bf065de3ebfab013c9ba5e33d1e9fdbf184845ed942f445ae75c7c2fc84eadb8880f88dac1e794d97116c41870b81388e7951fdcbf501c983395e58c7173e83f33b7124453c693814664159ac398c1d313656939c9492fc80bc445ec0d76af3240bbc1e1e89362c71e418985596ae347b4b7bef683d1fd59b2fef5cab7692ad34468845422378b5f0a9c676673452010fdea17a84080fb4ecb89ed9e3e3436cd114811c7f65fd79ab2cbe5fc90dfca3c1adfcf421c33a2724a3721fda38b5965dd0736fadc95817d3df46e10cbb11078fedc3043ffb52564477c5ce695b19bc723a5881e01f48e3efb0acd0a2c2230cd94f4e28cdcf216c6dcb9ea8a3a852c0b729372079b28d88889e568e699661654cc04d10f92e965a38a7f39d0f9d753dcec374d262d1f20eb549470ed40b2ee52bdae1cd839763ad0223f4e8c9dd0ce62f431def9354e6f4ada310573bfd3ea79906d9803f6deac10897d733d870e0804b4291d7d9d0d1a187e6a1e007f97fa902894d2c37d6a654c349e4a4030ccb355469a4561d3fd3132b8bd9526940b7dde7fa7e6690f352252451eb34bb7ba5ef1246ed0197fd78c6e82825a243764c1fc5eb7c6a690383ad770891d2c0e8c2748b7308d3d3621230ec8e244348457f6050774e6c5ea505b538171dcb34ef28bedbdceffc9b1c88109ebd4448c82506422f8539bd92fb2e5b40186b22cfcb4b08a63636154ec064bbc6d9f1dabe8c53750561f3c8962aa9ec3492eef2d811a28db47a72b2029a105c0161f72c993b656b282bafd5563c14e0657e9b3d61332578ca033f41826f0afe09f0f2b7fbacaa61143f70165a7d16d7f3fcf020a1b5680684666a7fb589564d33b3797fd954ac1d48d31d8ea1dc1d4caeb5ea9c31fd3d0bf0000000000000000c81a500500000000c7714450a7ebc02035c82030c1ced7379e67a862c6f89c773a833a5740544e6f0b93d200efe841b765d3ccc4b1ab775ec85f6c0c241492a474c6fdec9409b4627c0cb096dac37577eae82a3486e6ec289c45b82728d5509613ea382e31e4270300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c73d288d6c9e8bf8175254c0eef84fb0eb16d523b0683f5dcd8779e4b46db2e133a8dc7f08bf24cd46d6d608c35625ba0c595fb2cadaf6ff947125ccf695fd7ee0c12b6072c563883c1fc135f588757f9e38870c6c4feabebefd42c55143a15726da9f10fb9f29ba5f6e401df2ebabcdc268bf10d65257c43d21d6aa3ed824f80226c0c322c0bd5d627b243a7350f4738eea59c551dbbd296102319b1151888275022bbd9327cd09f64af33b0ae5cbd2488ef5591ed2316add4f53a7027d76a76d410a0878b8cfa27527677b23714ab47b697fc12e13cfcde0131d391dd4e94d7e145fe2d7c4b7c95f667df387f6417aaad24a4859b8643d29f6c2247a3454876b2859020ef043147760eabcf31515983fbbc781d0222be30ce3ba2474f37166dcbc1ebe0219a17c65060176fbd5024208c88f163a1394a2442384474d54b7bff862676b62021c661e72179a71ae8f530e599ed891fd122013f72d31b2f32a0095e7201257f80329a0bd1e107c23c9a1fd6f90dc6674bc0c6e71ce33eb3bc497747cdf5063f3a002217c3af1fb43a282eb60b116b1831eafaa7983567997ba69c79c7c467e8e6bf46a62f8a00b691b281a52ae61069297ab523ca91ece84b4b3658d93789960e42cbf803b8498d40fd178ad772172a2fef01774e4b16025a796d092d00344631e80cfe35737d1ddd7a85e20164629d50754a02fac00247562aa1038bc42cd5260ccaf3a4292cd8f9b27e06e621b25bf7fb776ad271950ff2db2fcf3e2e849ffb4ef27d15b90c4fee537aa195cecd9ae97fc6e169c44ec149cfbf8e30011236d7319b4b2d2ccadcba82e263b6f1b4c9da86e6a7febda94dee49a1e8b90c6a3eb423c2d6ac4a051bdfc1ddcbae288818f3315c176e12858db7a5f466eec4ccccb9a69b996e8638dcbafd203c99477fb3e29971b937659ad51e23c6e58aed9808bee491cc87ebaad3d20a46b7080ae4ad21a2c9d646fc6cd7f944228c35bee47fa1c4b3d20c89ac12b1d3f2be4124ef64fb2511d8da397175613660e226ff850f36ac17fef1d26832ac55e75f993db65f287e71c06ec8db380232a090fe3e3e8883eee3df6d76535c9ee9825242a3fd659c159ef2e8c253a953ffb4f7582f9b52346038eb49198a762deb519a6b441f446cfbc37a8527e1d187b1139589252a8e321bba056f65ebf98c62f7b08893718d50045d00a099920ce774279a9daa3e96246eb2c0764d4a76c69858554a7e97d66b7af5a19c9a8c6df8a7e8530c4db1d5d41c089d051728ccdaf4518d369cf3e74891428f31a5239be8c74b2cb6c2f5dd918ef3e5775129e215bb2dcf6b8b4258c76a3da278b0f32099b749fa60c53526a644037e9e8fed4c5967c37e5c1b3e0358b148ae141536534b908c0cf7267145132537e8ca8e1905a16f762a8176978009ce020171c1b1d531ecc7c8662fa2791d75fe20f9a7774411a41fe38086361f3f42dd2b40ca8701f10055c09238f7a3f66fb8bbed16bef8ebbe1f96a4cd0518f8368fcaed8f379a5407e0b36f9cdb4ae8704bacb39db41b875ea5147005257d89f79d489e9149a7cea1d5fd9e8cccc236ae0a2790ffb58b8dad5b6873767ff423abfaad8e445c8768ecc5a54b1d8896c6d45b99733fd347835621a2e56dcc33bfd42b5b042cc3c05e713fcf77c8d0f2cc6bdb7622def9ef325afe3d8ae07e256cc024ee78515561324561d030efa8a027d460cc0e312e4b2c58db2fc359a0c76dbef8de19b13502aa0be8adc9f3034c97edeb929d985dd81ee1c5ff988a0f5fc4b3f8260dc7366fd8195dcbd08e6fa05a164a4b8716aec111af315dad5e949ea7330390be2ec1c5aa06703aece2f424b1149495fbc33f000d7d5e925f5fb96b45e07161f0d4c8847fa04894bf5c27ac6c3cc1e1e9b2da8d2e1356e721990f4b075948188327de44a88d9ff77faf1b7edad980fce24caa4c17528b817020e969a3f3d299671dacc96d266a8e65e3fd248f003c36cc3954a8fcdb3051176d8f05a6d754eecaea573f623ce264cfb9e468c7ecc3900cf2accc79729d2b282fff4a56e2811b65f1a70c11578d07d007fa9e36f8518c0b45ad4f3ba18933a7c89000fc42286de8d89f391377ec1561dde5a209e9a04997ed67a7d6b9aa8c7ea05fcc7ffa2f9b59b3d6305ad62d08ab5d5f187952dd848289eaeb1fc46434dc58628a6208e3a6614c546524253e909534adc0e2dc25f52c14b58df8fde5e8bf27b97546e619cd87b0cb9ac2ef585dd6132e87e08d98e35d6362617723aadffd80960af256587e1b1f034653cf1b213f1c14c249beb0e63085c9f13c5a43659ca40995b9369fd429f9d94af054c51d1899cacabb56ac7b40d1b6450f5439bca5524c2f0897790264634634d3d3ce0cf56587e6d70ed5277bca28b60fcd1a900a7051adc866a480c", "5300ac52ac63ac6a00", 1, -372912135, 0, "1e35ddf28f6ecc28496caa60711a52655814c31dd9826a173df24b6150273600"], + ["0d61b16b04ccabf3048e1cc5559723a04b0e6f120ba55153734eb8e63f465956923960501b0200000006ac0063516a65ee5851cf79b10263431ed9b36a6aaab987ccce5f50c0e65b6404def5e1980ae42407042e030000000500515200acab010423d7459f5051f4591fbbe5b3f1b4ffe805c4cb6c4fb77866d9c1037d9ccf36abd40200000003635100ffffffff39d8e1ba918c37dde4139bb40518b65b99cf390210ced3f7038849e5889ecb2303000000016affffffff020bc5b1030000000007536365515251514268af0200000000055300656563e27bcbc50200000000000000006a8e2c020000000064b33f8726e5e067d134b1e49332b6cffb65196636bd90ab4c899aa5e16d24bc1023bf1a490e445a64fa434407f9f6ff9cdcbfc17ba8dbf0a7916b8b4ca5825e8990dea243d181486ad071b04e4ab531117b0d8c711dfd0cf76390f56067206a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075899fdf44be99d843c26557846b58c04bd9a3698a05e537d9ee6c5df00bb2594e82be365ecb5934169751374a2a3810589cddfe73634e5d3175671a539fc8d0f57286f32060c974be7f69669e745d0effadc365436776cf7282cc694c40a7d7dd506bd61e90180651be455ec40ddaf8b248c0102b751f6b5c59a67a2801bced0302615853b77ad1fd79ae294b0a471751c0b911a8ff4465cad44b6dd258ab55930214a4080a73ac8150d56dc994aa46b635d917c88e86c5167e3c91d1ce4bf947f40b001d8b7923143e78138e460fe484e84dc9b94adeb87789d7ab9d5a19f0db94ca2cb7fb1ca56b08bdcb03dcd7798494d18935876464ec9dda4184f635ff53156e030639d183874cb57f8206c0058f8a13c311ba31007c013351f95a4682dc171125032abc72528935c4b26310be702e872a336df8ad4ed052c42229e6956b48c1a935021532e3868d147631f80f617ee251235eb3a1b8fa53289faa2a4e7c860d8d49000208e836aec7a21e7f5f2e9c861d4434007637eaccd9de54efddd97c75132dbee70323649aea9ed0e3736a490e568d663897605f031fce738648d45e78a6fdbea4f799e8138eda3d133db47cef73371c8c10e08bb7b7d2fe094331fb83661b26e2054d32abfe9a99e7f8276ad508ea9df76bf71d59bdd0457d89274fd545081a201721556ea024bd834384640e65ab995909139fda9e7e36059d489b5cfb7d11732e304dfe54d92444c96935790642cb1aba94774a905242a13637f341176823d73a39ef64e4e1bb22891a4cca24b2260e57b7e9c06abc0ab5393132c15dea5fa31369a757fc999740029df36ce5a9713a215adf1e1bc008654d1d1682dbbd680afa52696cea625ef796351b3c313bd3cb47438ed17e5266ae77f43f89535108334e4abdec622c078a1d363f6b59cc201d0b8dbd12b06164f516140a19bb78f633e21ec87413fb3016252e006c65d26224ca4459b167b9e57b210a496491da35f1e57aa99acb0e1bbd23c4d6bfd6037bdad461a0861288ca1c81962cc1efd35b065c288b5ccf741148756f65bd2876a3dde6c1a3faa8988d15d15942bf0d54f415d4d596b683c2c000c172495accbfb98b8f5ef6787f33673a528a60d61165af1d9b691d25709491a9ef97e00f9fc1239b3f47ae62a5be58a04b30c307dbfdd5f83cb0550aa56e4ff83bbb6b13809f29e53049304ac46582ac12ca2ce81e2bd2e5a9e5ba9886e58906d0c2a45799be811bdbc8820ad943cdfa01b041564d738a6bc3a3b5dda9126ef1ed6539d59a423414efe992876af5c324429223b9f35d6a0eadf79c0823c05910f6af8f01dba532d5035fc25e0fe24da09184118639ba95869eaf50332fa61ca8f827126b319790bd12b1e213d4bbfd9f6d5e3b02c00f3841abaef57a82ee5dec5b06a7068aca5942f5a2523a92301188c6a90d789cec7836604143a05329c975a4b706638733dfea6d18c73569b61bc5dc016dae3a5d2d53c5eb1f570f7fc05d7c4c4cc1e8928ba7e4cce0a500beaca957079f2e4e3636648dcb4ae3cc6bf1877c1dbc6c8b0df77f2c817844f5d63422d7e2b7bd5c2822d65f844ab32bb3fe379129f4afe4f952979828c38099cc3848d866e5bb5c877d111dceedf37a29f81f07e4a74459268b9856e72b59c42c0b61d1c2906db47bd1ecf74a17559ac9123634cb69d667269e948b36c9306ae2d27c9eb66b82e5ee37b202f5046bdeb20a6372c5568da0e74c65c541e9b54719d3bbc652ffaaa8c90f849f8f82d5bfcd21808db10c0b18f5698126469007057dcd50c15bb3af02589c136639becabb66d86c37e2e6d9e61866b964b5cd42da8f725e0d3880625542814eca6f356053b2f7c99ffb1826a931b9ce5539d1b9ffd86557664cd7d78aefa6e926ddc3aaa36d95f140a61b7f4c7e51324866be8f1541c84ac8c35983295c7004b6f4911505ffe29665abcda52f02955c7b5e6a45c320fe2acf9830c9beb6e9379ecb311bacb0282541fae11ad1800748c5cbca013522e137cc24f2d11b0d444019fa8f291d00ba2df6c3c26f03b88634c5e2763d59128f509ebbd4ed340adc54c5752e7c7b0398dd8cde4e98278be9fd08adf0f1123f6f2e952621638339d4887ca3cb7797d7cfce97b5269c86e51e89ad04d430ac951201e3680dcc7dc5d10baa139f6e255b2f71c8538bc6fcf7a8a5534ff4feedaa1422b6a41a02001a7a24febc7cbe3785de3141004a2074a7543658ec098c7df1fabc327d75405f902019e213271df1bc2819f1d6f886601711a7ba97970000000000000000a481880300000000b070c5de8aaa3477ae58fe13539bf5c624c3234ce6daca9323eed8e159e53fa4c8dc2a9e01b8e5545a9a538cefafd6c7f1f961fc7b6a1c687833896b58d14eba821b3662e7e647e6ea66598593ca8be01104e085df6225f429466e2b48ec8b11000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009b2b988b7a77757d0d6ba1103765cda811fd6d7cb9b1e7bbe2947cf90efd3f2bb464674a7d2a579313b918cba35ee2d8dbadf6e6c487798801f3c359d0b02959bc37134c6f8d8da07d1e003e18fdfbd83a0489bc46bbf1ddcf335683afe5f2a41d5fd203aeface4da1c11f010676b524809768ed8693e57e13ba9a9042f171ef0300c8705d955be30f965b24f5850dcf51e8eb1b819ded6f6d48bb5d6f233f3faa0325d8b3e80026649ad844e7ecc26e5859b7c997ef897e47a852b1be6a0404efbf0a02ca1c7fff79c7840588426e28c10baa5bdbc9b0d2ce2327544f5f56aa557c5c7172f3c0dd7a09ad14b5a1dcea96cd4d1eaa74679cf4db98eba384dc43e2fd9d031ea4d3dd46aaba2dbbfe83091cf32eae4daee2e00cf01693dd191e78b59d8983022fe4c5cdafd7e43398342b7b2ff1656521361e762b0aca918008ebf4c6b3f2240208419b23b6462cfe52f60feea72cfe92cc439f3674fc43adf26925d593213c3e021f604acec93ae1412ea22be170909c5dd714340e3e66f724a733201016788eab03124d025a6ed56e97e159b17af8ae2c9ca7224b165f6c1e3e9efeda9e3fdf828bd4ac410c28db253f464f4dcb2ae0d1ca06106cdf0beadb6fc708f9da6e21d31c117efdfb18fd15e5ed9101cdafcdf59d0f7c5e5bf682e9d6e13371e5b8d3fb7aa4b060f5e5e7b5cb801042a76c3fa90fdb870456435d7f6ef49230568280503b9edcd16f90a59dbe9888d9cf7b47d69b54486fa3d2783dce40d3e16a953eae01e0a25561cd1cab38185256f4154e6b39830232b7054fee75fae23f523b7304e70d4c5449111738778f1e5c676ec0b0559dc07862aca96d30efdb7bfa696df1527ce5300776e942d5dcb086ff1bdfdcaec09a0ee2cc628e58fb0f92fb4c5b51a8ac84d95023400c1deb1c6319eae10c70e28d48197b8ef17b6d1a2a58cbfb09543cda3f19e91888fdd477ba5664cb138259777226cd435ee3c9cf34b8cc0be79636237e38de03185dc1290550719686f0329b51cdc8694e61eeb531a55c9cafc27012b0a26e08249d45c4108f962f8dbdbb39f2815791850d548a63858daee825dc7e7ad7af735c89607566362983ec9728e26a6554f7e1e3e12f784153359ddeb787cecb43bdd89f844802c39c668c35a69a4a8e702e0c4a30bbdc4cec89b0cb1817b0a2f6baea5805148f8ce9dc1a81eeacd1db6f4312dfbdb4de63e0cf6ae947699f925ad1f9de4271db420c85fcea6c91f3a4619176327b0e551de96a061ced409dbb7e75384fecf336607af3624f2b7744bd83503106d10ca48816142907515137c82f0c6ecfde6fd1e2f2cdb45d18c7249cc6bd79a8ade21f21f49ecc3ee8afba95e26dbc215e56f5da6b34eccfc9a6ec890e35b50ccaaa2cad3f4ebe270a5bb3eeb658e9643987b5230489ea33e7fe41ec93619433140ad17cbab4e532a463fa08da1f48f3ea3be7741a6ab5bed3260232de3ce3fc33a7d61f1d64376964be1e79be7b286e1392c5854aa66568b883727d9041a288a533b78b36bf536b90964237294de16b2d9796132343e98b7d518ffaae981cf99d7c6e2d32f58e26806497572f4a805597c81a47466878dd4fbf04679dd76fb4108cef4e13ea0c38d5b54c4ef2e1be74b69f753ce4c5f6261b3b60312e75e053f133ac58ca0788a28147005634a08f00f59ad9257f393f9d2a342b56bc4d0575de17b33ef524e351e9297f9baa8ee930f71db03903a7450b81641ad4a3d057d7d3213abc57b3f0dae961b5a534b3dff9d61ee51e09e12c2c78cd122e8a956cd67be56fd3c4ad13745457bc4e016639741c6124deb620ca9dccb47d2d1f69a8dd009cda11d594b652a3581c6ab0a6a96d7b1651668529f886958906a74bdcd8b558a945a3107ed003403beb7f1c5ec5dc4d1505469c9bbfd1ca4bfd857b12bf66f989d4ced6f9905133a4e5870e44024b3311256cb75c2092a8804624b8122774424a57aea2d65a16448c059c58b5425cf311a22697abc90be4f1fc7228d1abbe03e7ba40f2aa8e5e58d847bf1b4e24a67fecd567cc91348f3bf55b12f432459a168b9b9ade35ad02f31ff1a299880304fbfc5123ef97667da1a3e24c5dc413ab0e609ffe2486ad34df1a320c79465eea2f3f30a9c603d562fc9d1804afa2bf0fe1afbd379b6aa004353b683bf68bf849aeeef7d92e849a0dec06ea76c591c7710042781342508492c8ce956e9226dda26185e122d274d50e01fdd10125037b239d5d96516da5099582239c83757b710c634d6b539e9b5ec4610202e40daaf716535f4dc1d080e69e247fc3024cd4cfa7e66cf33028d974fac34074cf89585de6b1fd05d4c5771a604b31adf55129bc850c481bab9c6bf145d7cf876db2714f8cfab9b9d79d5283dc6d15a69b48ffc50a124f6ad9cf0ef0996d0e", "0052", 3, -502082915, 1537743641, "8a126f0ad39fb1139a6684e69ee303553a4af50737c25a2bb9c7722527d7a7ac"], + ["030000807082c40304aab3704d9a7997f6bdf6a7b21496d4e5b3fc0b6eafff4eb6072f66a77940f6c903000000056a516a6365ffffffff54d8ec39eea9550c300003c702a2ee031ef7e26efe0013f5f22c1b95d945b8f70100000005ac535365acffffffff1d9c9b0d9b23d2cf03dc4da5256efbf52d26158c403fe4b8854e0b3b5d566cab030000000451516551ffffffff4d1e20ef4af679f6ec5d3bd8fea0dd560045eb92ec2e4e25e22bc31adfb1adec0200000000116657ad03d2dd2e03000000000100f12a0e000000000001516cf24d0100000000080051520000515363b55be44ef87bb4a30300000000000000001432540300000000e2dbc278c8214c057b0307d05c0d253944ff36f906c4c6f4632df629d6097a8d80fbd372b92346da4b8940fa98bbb2ee8dbd011466be6b615752bcd70d2c60e7d27e6a35eaeb5f19f38d607399aa85ba979d61249e41b5522c59edb6da2bbd5a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055eddbfc937ca881faea53247024ad23e84d4b9f012bbca4fbbbad35dc6f58b18a911e050ae5f4d35809ac65ae899090dd1bdfc66f0008d0897187a607fd1a807bec5afdfaf4b5d5642e0a210ea7e982b897fbf0a5257b41c3f82d4b29bf0022d934c79f8205a087515fae1932a56f4ed15c5cf0a29d214a5c2c3b05c75c1d02031062f1b8b8053b59632b7409008d439f8fdd174feba54be92d6490e5738ee5e00212b4e19fc5e675dbb2949cedda9931953bf044db0218c649777861657832f0ba0b06965083227890131220f04d871f74d4290e3c5a5b2c4476b5ac7be5f6a5880cc5f9300f19f50ceb56d15c4130ca1ffc74946d94379f421463ced3bada60e439032de48283982c1e74bd2bb939763046ac2013f9229ffbc4b6f911c0d69f7d7eb6022ea9d9ff6262e9d514d542f5ae55e937efa698ec268a7746e9acb05ff3c46470022a6464833162bc2dc0841f49df904835c3ad772b8ab61ecb4d6d8fdd5ae43ef903045e280ddb791105ddfb6dd72526838893aeb37155becf8c3d881dfb27ef66d1022be61ca87db2e47381056371a88b0e5fdf9d25df599fa527d3e69663d277e8b762db9e023778f1f7e33b84d082b6452ae19bb9e3e3668e55ded12a4fd958c36dc7dc7051afbf4c18afca7c1cbfaf0c290b16738124482982d1c08dccfdc71fc174ad3480bbf541a2d5089582206a53795dd0702e83465830d1c269e784b9f6ea5f4aed0eefaa24004af804e4386ddef859b3c48c62a9adb767613f76ba110f9567c8266df13fd0ed28558c61c38e282c37044209ae8de588010cd38b76ad90fd779a99e07966b421d64b02f7b0a3185b168fe51da5d238604e410e801924ab6a1518b54fbade1f8509d0497747e20ac5574e73d21434ff475b97e673f51498f75872701497f68b12e29c82bbbbbbbed41fc79e9834591fc56ed76246f20bd4bb19e9a87ec24c04bef3e00c95c399ed6fc15166f2b9470f533d3a58f365cd0fb4ce88506c935925cbf5c550b107b8d8436690e4c86edf48ac836c015567703361bc155039b14da54c4e0a8286c52f2575f0c1e31051c49395d9db75a20e11f8895d5d4c9e64b6598473314102538d26cd5ce0847c4adfb736d7f841b5a8818bb2d6b0bc2709ecb29505da07e550670d413365f7d5522db9d8855fd099974f3b6e3c7b5811f5f4891a6f4f2fd4be02c591a2fa2d46255ec5ea80deb0e4141a8c352308c2165bc58f3a0c50eb56550788da8e770fef508d6f987d9c0f550c8a1627b26589031690f6b5bccb6fc176845adde14fe5a303dbfab13780d9c8f5ed2eb326c8e1ef9b21095b3a47c831753307c1945a96208642d68aceea2826d7d5503cfec092ff3996837085a8b218ab6853b40a23e5233ad66080e3e79b4d6949029016b5f1e73b2baecf1c463a33c9c18dd3ab55614c0f33b67baed609391582f645aa8e8a3ca8f97804c4a999945fd746a4a844fb3a6086033932c38f2891943af9cccd3da523ca7c4d11c2f79884914683e8b50a96412ec298b05da15befd7d55c4d02b401263c62e62b47c25d692821a6d8511811794e7516bfb9e29124960f1b2e815bb7e21ab69f2d63e1aad6885840c31e0b2619a5cd5526196cb1e2bcf2c4e616a170b965e75ec0922dd42ab93d783a6c3d158306010df997dbf2dd88eca5c95984f7d695eaee63c4109700780b1eafa6c1bff09b40b85ed27d3def95ebb4292d3ab9ff72f4c2870c66a693992087532347ad41ec7a39a481b5c5bbf4204797ea8e0b650ebdd6d69c82ed8408d920ee59a9a99d857b8db85f8efb0dc4ff51144615f157f7df56aa6b7d89317469a96fe40e0ff5ab644730be369a3bd634f90c258c229fe3e352415904bd7bc91235b4232d190f9e808ccdfbfe03b72f0d25f6b6afd901889ca2b49dea03a5a091487e26b7b0d52671fefc05c413eb7437dc2ed548f14aece5d5e6c9a409df78d03142022b40974fda081de896d01df24a0bba323c5067c7f784e3b0b2c281e2daabe8603ac1138cb524eadebd412d19f70dfea251978500a7e37321dd13c12b81c07c34f49aa1ad23f650184eaf80a325a46092da674ea1e2d08d333dac730612f30f072e4fbae8c599c92803ff3d79e6c40677db02a3bde17bc12df9456f80fb3029e11547cc88211bc18e1d9d247dd3bcc4706f9ce04b50a53158edce7ce907e32b73d0e9620af1b55b92e31f2c4f0b6a0e930e7e59c0184922766fc7623ed05920238412db2c33ac128b8b204057331c2dc42531e8916f77a18136c53d5968a4f323c4d850040000000000000000000000005b1e4b1d5e488d14ecb449adf973985ffc9a507a691746809e836fb580d5b12a5dda9e7723baa85fee6c278df74f59015a387b2768407ec4ef063290cf0621e9e09187b5e954568742c43c6e901d792deaea9fecd8c76e370ff6b2781707d96f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007c4b7291c6442877fc14d500a0ae9603dccdd7f700895a072fef1595e183aab11f2e86fe7f0eafce53b46cd8f3526162cf9433dcfd6aac90af0ddef442f0c636b15681e342a5877ebedcc1f6439d6c0e8051fe45773b762d687dcc6fb76eb3a4b494a07a70cf2e8bac1a0147f429aaf7d23efa827eab96063bec0fcb1bd2d4950200bc2c8a3b000cfe9746e75fb13da35953d91a47c177a4ffc3bd6983586973e9023014d9245ff9d78f5e3a528b5149eb033afdcf415bab97b83b2acd753517d1240a06a689131a0b139f2bfed9beef37f419db95930cc980aa594597a9f1fc8db6031cfe33f7eab28eb3b172c2939ce42c053f2a8ab0aed35b3310aa478da3791012022ca9c650c53945bbb4270b917f3c8da94b9034f2b9ad643786d9673ad80a0d2e020f9201e653f0da68fff7c613b9d5e1df3fc18a906d28839689c4e28396f53b7e021b67a21f5786deb1b185d9fd029b1ef49e843e6a6f1c17b5da8be34c56951cdb021e70d03ad88cd68a5acd9b2bae5562aeb54e36369ad37a7372d7825212d947dd021b681caa6d272e5905686cd14393df5178e142ad91a8f4137c7339da751adb83cd1b0c298e1e6e2c7816a4739969c775a55d536756268b0dd0effa9d6d2f84de5e966c78e95f2bb2a6216b002a335594f25033f3ef1446d89c13ca99f4f78ef19b143648b77de4c92d95db62744696106e701d3cec09d40c5afb06cdd19687a11cea5f374fe8eb6ec7e66abdf22262a9b7e1bf4ab2619711182879c63ec0b02bc50903350f059ab822dd29a46b05b9ba0d8b32f0446724764820d9375b5d8fc81bb1352408cc83b604dd02e9d255f85854cb1faf61e631592835332e4003600cd36d48910a09d7121cd1b15812213b031766c4c32b5c631bbc1303dbebaddc08f662607fcdb8ad6095a1672ecaff2cab4fbd38623f4e39cfa128e75f60508bf8282a2f7108d9d5d0db5611ca6cbb8f15288a7b96b75d5f3a0615cb28b5f5a9cf26ebe2c5c1cf4eb585fc6130202642747b8cd13a9d7b62de65bad900388ff6b0ddeae5db0c5291236a8a9a1270462657bbf7f12e714b11064f419671175e46c72a154ea2a9dd9eb95f84bae91d608a7d4afee88e3cbba160cab32087193e3db2ac82260d6b96373754685d287724903242dc41881f4763ca281cd53f3749605451cf72c8dd3079c77e5bd24a90746d1900eb28a5f9e22b2292b561382e54c4af91edfe5911a74a118bf1b7e5abff3e346712253d74660d3433c0dd83db1ccb11265a1aeeafdbe708654d1b412ae493cb3aceff51be5b04a11007e172ae6341246c722f6536d60978f05678a05cff4d2477ffbcd66b482fa14a3d03ac3803f5dbb145e65f39eafb80fd16f4f5d6538bb7b42017668d34f32f0272bde6bf4fc6c7eb7b5eae643aaf9e2b5887f2596847b8781bde2ec1406d4eca6d67d8b059feac6f78fa469c1a8cd57ba4c3688f9b485ab2bad0e548f17e86c1b0277429e4d0e0fbea9bf85c533f4244afe4fee5d4be4c3647f8a389b6a53b589d9f76309000960d98722b70ab6ee6b8b8672d514c3032e017df90a695f475041a9811267fafba83deb20f987943b190b087e14e27d1041e7e7b81cc52e9b9efa16ccef27c5f2ae29c6a8fc3de66d0a6e982a69e1a80ad0ddffc61bc765765037881cccb711eb1975c24b62f9bf10c52b211db1f199bfa82e4b824ee6c19b7e4de7adc4b37bc54d690880d1b2dd164d92cb96507a94c9af3e17cc92984833e0686fe5fca69b7e8a97fa7eeee0e68b1ef5536f6aad8592db00ad0db4c5da614ac1bc50844d4f126e8305743c333ab071deed6886b7a1cb421dffbd8c780c7a1b0c9a2ad2c0125fda3ea5f8dad492707dcc57eea991141a168ed8aae4d9863a9053165b2b01177dc2774509e23dc09662a73d719a2386eac84a11c1f3a36c62155c2546553b9aa4af6b336283c663aefc0e946b7322134293b7a3c531e5ce5ab5a0f1d6c0de85279c03654d6fbb2a916267eb224821d0e7e7939d079380441ad0afbf9856247fb733e7d875d3cee08f11a440313c35cc88e674db6486884bbff56fe77af266b6b43f1a9972fcb094a28f4469f0c96079d7f3249b710d67c0a05e0e42fc0e1f7ec22be17e21272a952f20b862fe498549e69a40095857b3ed015e5c70ee6b91b0ae4e1ef6b35dfa443f30113e6dadce0f0973d6fc126ab5016bfcd8ec4daed8bc29cbd72ce9f1dd49bc2dc8d821dc207a61da3c645aeb99481920e178692b1f25c008815d7ca681d610e9bf76dba54739ba9f14ceb5d270200000000000000000000000060f6a898ec39dfa3885c878a56040d505cec7ca2927cf185480093d06abaa990031d041551d07a02a8c317377bd061c0e2d89c48b4af72b739a43fa4bf0dffb3d341179010735d9a8688fee5b49a88b27ca96bde639261d5e5fc2ee2d6ee18a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aa75d344f2c7d761535d966e0f8ee4a7ad8da3edff9567a8e795b371751eb3006226ba0264033b65e670c2034e6238b7a33ca9a3f92a81c278decd25f0ad12b76448237256f9cdb02fda07241d8415ef834972ba8f44f1d5b68bacbe7cf2533f172edff5271aeca300c1d94a86532f0a3dfa71e718daf45cad8b2c54aea9c00c0209f86741c05e10818d7f58a425bef69ce86701a4052a1cb3bb3aaea389a225380216ad3cbd387e5b02c50fae5320cae755f0e74226eeadd7421178a4720146b1cc0b08f9a64bb78c102d6797a59f20a0acd77deecae6d96774f9fa72aeaf53f42c61aab7c7e0794518d60c27d88a2e7f4b91ad6b12af7689823a6d90f9a828c837ff0322b5525a165bba7c7dd753e732e3d2a351fa15af0f0d05e886beae2d331f6c58032509012e715ad1c946e53acbe8112cd113783b72cc65b5e3094f5928fe258278023035b3de3be3c0c04bd6f2f92cba43117fcd1dc67c559bdee8861e335b062fd10204ccd33f1a9dbe4547c43e007d8686e6bb707d5b4b5aa00c8844fcc248243c790312cfb50a138c829cb229c227b1e3e1c7363246dd54040b009744a9790346337ed67f2ed933bd7e6e66477a37a922f2645361378139d82e6bbb9ab306265257ae4df8df1c69f4f0920cd949a950621de52f81d8fa5728df496784ded252da0be072070c357349bdc1bed6d8287209ccc90936f50b86b70198a6b2168c6d176e26074f1dc8efc3630e4437c60352a33e6c55e146b0bee634e67bff453d7860afdaba0c9ff94f8947c330b2a97b26edc0ce58dae1bf342fc980d1075272638e28c73679c1478cc4dd9a7cf852f87d66dc2189261d10fe67af8d972928e16aaed561a6a876945852228ee6d1db381608540968cfe8c4febd09a63d1b7a2eafe5afc7163ac50c37f95cd16c149d6dfe9c9ad7f4b7a907e3e0e293fd13d4f922ca6186450c31c8e22aff93eb9de025ab45a2226d275fccfd57fb98bcac099d03624357db77a8a220bb6580e25ad3c2d99f69b833e262e27d8961582b58b5dce7ade2866a47c26efd512e5373baa14e6af05fc3c1d6b5d32b1629afc923744afb608c188bb4f16d1672c2e050e17df06d2d18d7ccf9641b447823abdfdc6d18af3524b8bcbdc6164331f13027fd0705be8e86bc9e1d22029d52bf47d7983f274b58ba3124b2cd4d5be6cbc2b8e0e3c4594347c62b53e6ba00e4598fb52cce903fadaa4ca57f8fef7cecb7d1f953da3b89d5552e6c09bd60ac209fe897d41feb5f06d1783f7a4d7f2528c891fc7c4686e16518d8a7ecd7dd3482b46650d12aff76f3553608c4feeb88954cb7a3a83eb1496bf00ec25bcdd7149b385153d8de6ac2304fe92871d0d43f513674546e86eb410a7830a0755a0f2d1f4e363a422e73a57401ec216ff1ee9e3443a101ca046134c5efd3bef6972958e6492a19098e38ff040f6425b2ba1399e119944c15b6fa4e6461247004846de65d2ad12c6978a6aa385382022b6594fd7559ba6338d8e4e1053a87178de7e3e636c1932c8d57a8ffeaadd3eaa9151d82c6aa3b71fd789dfb01debd7314a1fc9d65c2d6a78b3a3293f307b9b7d60c9b5cee25dfe695adccebede6d716b3ef90f75dbb9150274a00a2963f5af3d25a0955f8db580e5902d80b39de2b7ba4ad60e07e091aa7e8ed8a0edf44008a27937de5eaeca23145229a015ad7d02ecaa302646e02f67cf0144df8328c752e46236b751892a96833a18cdb8bb871d4358c62e9830673fa3c188d7e5e21f4a7c6178e03094f76ef7904e184ce915234fee70289ebea8105ac43cc54d90f22761ff7df67b36e2b67adcb2635094e1b1507a95cc151c6e9e0af7b61b891d6248288e779bc09011fc1db3a73c373fc53ecbb90adfef90d9eba7f420a6abe7349b930908b3d995f84720f3edab064d5658a956f62950acee38d9bbf91efc883b4f0b77f1760daab69efe4fe56ea476f5e61c1de692172608de5479c26ba550170e3d437960ab0117463064fbc92cecb966908a2b063cef65981153bef57f407bf96b132c94002e28fe29e6bcdd2d15250ea5fbe98a0b0d576b821807e76e22ef605d6b9e0f70ee1709c7d5144b4039aae87afe1ae119abff38ee4693d0d9dc08635e5f1f34ceb6dc4574c7d3aca2e317ca84d341315facb9588fe11e134ce04b33fe48f15d2dbc12bdc3b3e5c76a425d016be2b9974018b726ec65cefd05e7b5e97feae87de5695e0fa8486246907a5acce734df4b026e4bb7edb0324b391d99b571477edf87f2234da90e11c765f432c7ebd9c859dd34ca14810f469602ae04bc5c9731da56e60f7b53825dee5752829832159b0b8c6eafa12e06dfe4807289b0325382fce99ff49ef7d0c5e2de99560afaa91533d4c1732051d73f19cb30a3019e128f707ac1da362cba06f20ce75012501", "", 3, 783418331, 0, "4c319b85f12c9b4076efc11626ff88e18c94075a4c7c0e8227e1fcc8186c3068"], + ["030000807082c403023a32f7e9445c6f8fb4e61c558f96e67b1de69e62b6f079599501b33ba2cc16070000000000be8369afc0e5b21c1b028324fe5447fd0b4db08261111e72b20446c1906ef41f54efdf0e0000000005acacac6a5328fa219a028ec370030000000001ac4c5e6a03000000000051e750a0fa6d9a9e0122a44d05000000000000000000000000bdad9abe14efaaa3a32fd34be42cb626582b1893042e9c400770293728c45ff1a2495298fda9c288aeae9cf5d5ec8f032be0b82fc3242865b70051edf7e4861f284115d15c64ad33b393f7f83b6eba82cc074dd7d7ec68ea560782859c4554e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b778f0c4959aa22877d57e36db223426305ed0e0e524716856cb0318266fc205e83c6f2f91a020f65ff41c372d9166060408ca774faa0e24b74ae836061e780c92290eb7de84112d5df52a9117483d4273f68af9ee23799da243eabe95164aaee0f4ea217601ffc086c948463c9e2e51681cbdabd48055c528ab1539660f4bdc0226ca4ad410f5cc2717ceebb9f420d49d7cf732ba3df54807277cad69143c4c4402000cd7ec9ddf6a047c3bdb61f91a5810bed928a034199b339bec39e975798d150b041ab103e60220074e95a447aa7db7ce459bf88b6ecaefcadc97ebc3890183ea891f56766fef8ad8ef8dcf845f6f669b6ba908c50c950f348697c21b4017e9af032b2bec456b42c340c1828d60771fbc8b35eabe926cacd457b7e262d972f43ed602096b27fccdc42a7bcb3bdaa60fbf4c4ea7dd900fe30eca795a637bfb3e160f820220ee40a943efa8fb2abfadb445dbf66926b1e4b70c4709ecbe010774ac1ebd4a0324d064b2ba6e9af997a94b3e6e4997c73c871dee67c5d1023ab32f4898be3bb7022b9db32b2d7aab79e6509ef5ce4555400503359a4f15ed1f619cdcd0f9a31c4730cabd29ac3e5331ed10af4b3cd63a959ce334d13ad87cf6f4dc029b45a133f4716557f40a1eda6ec313e98a36f1bd37394b677747b3524d9d05aae902d04f34d0ef5be4aab4aeec5ffb44fd5c2dc702d48635417e66d235dac9b623133436ee265629e4c38cf47c6dc3d845395d27216b52d91aa45c5241b795933a96b0ac2c9639515b0de747802ad12c360e55d1677be0a3013dc120c8541ebfbf4e12a89d3deae54b9d5549c82f1f7782f3dbae163f3b05581a1b78bf0b31019bb2de1a0df217a708d68fbf937e8a293b565fbc562da49c556b74b64f7b0e0ef227b85ec95f59d6d42d8cf496dd9af7d872229d94bcc2ca445ec5d42d1217d4090fdb37c1b037f34ee94fbaf0e94168b1c95abb8858aed53f84909b6606e4c43742557a394bdc8c6669dde2748df49304492c2981da26d2efff43cc483d2b408bb4b1a0dcb3608ede7cdf40acaea79fa9821d60baeba14342771f798c8a614239ba664c21b1acc4a921fdf1b8a41c765e2d4dd088c6ce46aeb618b7f7abc8074eba1fc9284476919d7ccbc4e0368166caf6e0aed01b0bcd2f32a6af6d057a9401d5dc2b5725db40630f48f2eb8949dfb6c5499ba7a30fe49e730a2ec96b29956b4fa0cc734bd5d425fe8a6d19e2e08b4bec874d0130c34c2881faf3c3c5d75b876afe01163982b98733ddc5a0589be3b0b938eadb3eb74777c2bd37655566f7f38145361ee81871d83b805895408e61f0c8b9069ef8d485f5eaedf3f0dd9de3ee982b66cda71b4728d5950ce2f745ae292f6368baa46f0ff6c0c195350b5a11d75b975f3d57dee7d2c5e1ab6c8da61880b7ef394db34f95a62204ebf140a437eae25b21607c2495a8d8428aaee60e8158cef160c8cfa15f4c8b3cd84b9931c63e8f76b2c3edcd88ae86baa1a0d475d5ccd3c35f4cdbd099489736314dfbe6ab654cc48dcc436871d82902473a1297d8a3fa4050d75cede42c4adfc7fc7352f07d39cd15fd4a7128ca622a90e0fe76df25d1048b54dbf20ad6d21867738bdc666b7eb1e1a46c286c495ba4a7dbee8b55e14d357ae49fb943cdeb1eb840eb492fd2e60c58371d7ae52437f2752037e7b7f02ac3ee275d538ecb5954a27575bf95cc32dfe46b69939679a8210b2787b1729930d95897f18ef387aa16afc5f4cc1190f208c7fadee6973efb29e12465546089673c7a0798736d2dc71797360bd80add0388990f657ecd0b646a0fbee5a7601431051045962661a68329be7930f353b7084b5beaf4053a32280b232dbf6a5e4dab8763296979940906b26a1bf966b9c534be686522e2cafef32edaec4f59c40eda2ba88df691176370bc9d3876b74951a5234beb1b89970012c0d8934a7bbe67b11d4e3497358c8cd109a127bd7c236c1f4a26de7e155935d73c912595c7a51c15869edf3c0267c8d0eadbfeb1b1eb4cacec869578bc2b1a3fdccc33eca5d64e2df2ccb121e96739ecb983d33e47628d5166fc72d7aa22248d3b08b20b711fc1f3ad1e84d77ddd5728868d40108a0f365941bed61b372cdb4c783bedfa28cf51b9f2dc4a088d6763b7ba04e20866bb17efa9d2c0960bd21275d9e937a50da0cafeaf105180f4415e16f457f33e4b7f2bef54dd365464359bf157a5fbb6c57610a9a9dc75894eb28ef0ceea860d0408d71230be675451a82baaef3226d09ac649eb4a3f21a01ca0bda913de25cdd187e74bcc43972bebf0ee86a9e46308102a488cb1a9831b9f6189fd06047352ac9fdb7693c3a31e3e6b4e9c7b056071e95cc2bbfccfe60c2851f3306cfc12776296ce9b2e5f1b2ff20efd4359334e5e4f1f6e5624f22f9c03", "65ac635163526500", 0, -401298350, 1537743641, "58d2917e7acfdb3466fcc7d850ca2f614e3a0f48a92b31ca7c26e07abc7706c6"], + ["030000807082c403039a443cdc19e7cabce9148fd66f86697e0bc27531c429a596f83dab0918a6c6b703000000066363ac526a53a7681d638218b276dd14e3752eba2d47ebf002f97feeceed2610815ec4e65f03f5a9c0da010000000865516351536a516502f8e37f9598f1bd9ad5e46313c1059d49657421df5059be6cf1ed81faa885ad7e1cda6c03000000045153510072ac1ce6038ef9a30300000000015224ebb404000000000865656552526351634e2a21040000000005536353526300000000000000000131d3d601000000000000000000000000b2418c181a3a70860891606f2ba258b4aa3adf99c7f02da6bd90d7b8634fd2c454eb49d949b00546ad3d45527b16c7bc2af51e9cfe61ef0d1ff57b4e805b3630b81009ccf6eb0793fa62dd77cdd3b73fd759491170def837160bea1569646e4b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff97aeab63120490075c558de47061e58f288e26f44b6dbb853b8c9f3586b287e473eb0e05b22728349dbe641a5c34267b7c66635515d1e95247313fa486ab13ef97925d20600da9f1e6e04758ebddf4013b4830f265559aef2416fb4d5d2d2c9c3008e2fe14d1845c24ad0a95e3056a49fed99f63ee7436d29aaec48703c21d0209694408f8017178d5e6f9294c93096d945e04df5fc68cc960fc8c4969b6b55f0308e81973cd06e0721a73c46753556ef306b7619269bca2b528580a553acb76a00b03e821b6d4a82bf25841fceeb897d245304338aaf7df683febf75dc1d568ce13c67c1d5502626614479a201a9a9b4e6bfd08c9306c09f195a7307aa8f2f5f35f0308ed7314a41f0e0e60c191b73fcbd4da90f9864dc2d568df82b4ec4ebf93cd09031d7f84e45a3db1a87d212be84d7f909ffb8a81ece2c5efdc73dac200634af5f5030d1080746deb6f4ac6cb6f858a4e5d8beefb03da9771321c136cb149b8deb4a20218237ac821b288ca57d8e4df2c19f50351c25e15a8332681fcdc8ab1c321be350306686d31bf858de006105bdeb8bcc8dc70e705983e66d91e613c934839fcdec37ceb7fbfdca81429417cc8ea60b89cf3307669cc6232fb7bc96e38bf0465d78fc2d4c5a7057bbcc2c443026f677f3df894465462bcccdac084467b343f9ba174ce460b5a21c4046de3d8f723e904c197b82d63b3bd75f18852745d2d12ec6673a6c20b6b7ed53cbddcaa9652a41eb63db1c9d1bdd19e1ba8bb157821b9f8eecd1bec01d23ae8ca061ab56960d25420d0b5caa382199c86573ac0b1400c47619669a25e99f4ae455935ed78e1bac30f1403a3fc9756ee2bb4b506a2fddb7daa94a0b44a9b38e8b6455439a77a2bdfa134015bacba9a09e6dff3b8f6f0b845bc300ac8c1c9fb2ed01d76fea413351bf0909d72b54194641a8b47b248003065c2ad4dda9e76fdb30dcc81a27876dc0b03bb02a161184205559bda77a268621b30e7ec4d125c4d94a10984c4494cbf39bdefd129290551168911c2da04d7c4b10dd97de8e3deaf97ce84f3ac07d7ee3d3002578dd9e6517f3abeacb445fefa9c8e235f9d775008e9e750ca8ff93b602b0e78d7316f828cac3af241741ff7f1149e5f2a99f1f6057bbc40d34bbbe3243a10d100250a5bf3d4b4e736f655986e8aa7dc5dbcf3377c511835ef2b97a9c88a5ce96856a83975dba3bc937ba8858de87a2fda75d62e21748b7535d4b3b374142dc5ea2aabf0903ad9a24fcbe0ff2e4a977eefd228e3675b0ef26371849d22aa6f4dd923ae06d82fac5ac24395dc57367c18026eeea482c82976cc9c3e41e711103343f300b9f71d0f4d555c488b7f2aed49d9ce0a377e7d16e10e06148f27c7a90d94693ec6694b8a12a43b4f04e2a9a83804dd6dee3ad5fdb28a24a1df5066526fcbdf226a1c7bd19c9037b79ba3688256fb3c3c260c75cbc2a1c1307262b87c077b4a59110b58d071047d410cb01a4c929a4f4e5c81c5428aef52746d954978dbb500caa3262bb6557cbc4bd4de5ab92c2014de11a28510e0b99830abd4e735ff3ce49eddf7524453e9e3dcde6a757f9edf4faadeaae1335d7ed7ee731f88eaeafe8b358ac51f2fc7b48b1a63bf8d4998da095a9a25210a8f098ee17400bf55701d4b6af52ff8fe61a002c77186df794ccaa48f4dab47b8dc0a975edc578b4ee7ff020b1c47dfa4a3b35167f3c504ac60a45cc5e4693d5366d8cb5568f00c33d1095a25210e52722600614793ef3582656c0c3a92797f87a1c3862949ff7f459754dd4ccdbe4cbdb797a0a73cfdb5e541915cffc5cdeadff813979b4ca11289db6a4fe4cf6bffda3ee6b239ef893d7c96ada4b075bc414b51bcc0ec746c645363a1b96d4fe09e897cf53d7131034147db37a1ee228fc706aa5ab40a57f2bd93fdb2cdb14fcf41d9b82a79e4c4b9c286ab18e110c3fb3348a363969dddc2c9843a105350defbc072b846539db1c83f80321db619750275ca36333c174530d746001b4029bcaa2b2f21618cab3520281a5b1b8e25de0b57187b62f1968b2dfca9d8dc937fced1dadebfef4a6250a54ccd08716468c4558d22179b867f67aeaf3c4419db6f1ed20cd92d5236b2ca57b1272fa68e0ccd4db74e5cd3fbc401112ff743a5636407a95a700a50696a6c00e194a865833e334900dd983f1b2a1b6607642d5201bf6f81497af0c28ae5ae1c9de0d3e3442782658405bbd135a47ad54743c4e1c9dbb66c3d310868b6af41c89d55bd3c338446c517d77bc09622b85456c6bdbe3818d4bba14eedd584f3c98939e830e2edc2f38798e25aaae3eeb00b21ae2b667d707da55793897913152387ec9e30905e9f931d84000388b48ab0a9b5217c0e21fc28c50f2386393c53a585007dea6ce90de82b1ef942d624ddfd588e0dec8f06", "00", 1, -968302226, 0, "13f1c9a4bc1c1894ba458bcac0373e80382ba09a7db914d9391daadc2287107f"], + ["c8bd6226031d94f85fa616406daeff78bce7122624f43b804b256e80b36b626aeddcdf08a60200000004515353517ac5018189f70a50fed2aeb67df152d7e0bac56183dd9173e70d172b22b2c192adbb98560200000004515153536e28a9d8e0a4aa44ccc293d64008cf2ca7a85c0a898c2dcd3a9c80fdd17a6d108d0ce1200000000008ac6aac6a52ac51acffffffff02cff71a0500000000066a0000635365bc4c29040000000008536551515252ac6523880da400", "6300", 0, -177608855, 1537743641, "eec51927cab3cd242850933ee93cb87cfb3ebda687dfb7cc41c165b2211abf7f"], + ["030000807082c403024655c05adcaa4cfb9e3fc3b061385de0dc86b9f307cb901622726b010f4122950100000006526a536a536afffffffff9bb9a14259b2ec93bd90f7d5d6fb943ad7716d665bcfcd21ccc162e4c1ae01600000000004974e57503105d9a020000000000719f71020000000001acfc4bb802000000000852ac636300656353112f61f900000000030000000000000000acce2105000000004b32d264994957daef462c28f999489fada11b315eeb2f2bb6a43fc48b2ab257b3e7742d679f938c3e8688fbf027282db76954e22009b6f459a4757d3191b32d93b33bf1e913305fe0b60e01d4e979b6c0ac23b782ba5102a51073e449004d820000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082908d40bcd52c08c64aa42e4ff0194f2ecbfec7cf3d1a08f3cf112a6f5d154fc0f139da745df1a4ef2c389c49e7b5d48b62a5b25816f31f33dd2824fa2435f93a72716c47baf4f7be348374205217e151a90989fef33de3505752c97b42267a3c9dc35f58d37495fa71599dccb3ce819395c9a6e628891d54fcdd3f953855c2031078fd81a5ef11e571fb24d69b4a4a007279e3119b6851813c50f8a37e57edcc032e94f4e790b24973f259c9a5ac7ab1b690b32cde123de5161180d8aca3030b850b0320a3a0ee9f48c3ae79f45cf522ec93ff78072855041b22cb21db0f2729eabd37552d4993a4bfb39c70a21802285c7049bcba4768d5f8d793797b2bfa5979be020d8d9536eef2df62adaf9f38cd9644c5480402e2d076cec32ccf34e28ad454d60205297a451680cdb913f6b03eff9c76a404a0ba79b7a350da6933058445b840fe03027483db522c4567b88baad552b257d7a0d635482dfc12c803a246321bff66eb0204a453a65cf0f7b6cc7b60d67bf6814f4a374af2ec0ac7e4e07a45e9a4b63e280327e19020a4873201f11e6d000db1d5c3b167cec2fa158475923b7b42779261954684ea34a89761ea76e9cf30ba8c213400dc1d9e54c48691880c1a1a3f1d2469462a17e979538e4909d8b17c4e72b7a9506f816df1b21e98a5bb52f76bf7db8dd662227f2fc0b8b3fb9c210ccdc18f77e64736168588c458993f0f6461aa35f0d071506599b0b24ac4f1f154b31087cb28a8c432cbaaaa7982654abb257f40fc6dbed5d4e4af881da6937a527c28709bd3fcdf67dcc26b8ec4524419c66f0309910161634944e8aa8bd38081dd5581a50365972f37c9e27d5c7c27a1eafe7c8087f3bb588e7cbdab80ccaa118560220b11db4e6093e9306cf0c3ccbbb31eb6bf938955f24a279d2c47a4b140f930bf25a09cf46a4b9d681f1eae137896a58e5c2c1b259b8fa83426ebbe45cd7da4008b4ca8efd46483696265b558954e26fdd879291e14e60b3e1b439444c22e25304036c596dfd43ec9ade2d4fecb62063d620cf91014cd0693fae6016bdd98c9d13da228edbad564c989caee5404b17fc78f9b4d210a1ea2c3fdc2ec6f34e0526d901ad6463e4da9c63ccd7e83957e71235b7c291844629b7a11417adaf30b0adefe79d67f692c6e10ec2ce42e21da4563f9d187fe1352622be36f9c92396f6634a7a55abdd9329a233486d3ee6aa8d4fbf2f5b1bd28538157ab269db401969aa8f18546ee5928f87612c6bf7c596dce4a3dc0e49fc7efd2fe5beff52123fdd3c1f4ecfdb219be197aa50c88c536eb25922722952cd8bebd5038445ebe83b32c43e3a64825dc6c60d928e0a0e2d420bf773a2ef477132c610586549876fdce4e14384f68ba8e1249d3b4fa985b669308f043ee57192a53bdcbf3bcd2efb67314bac51fa041472d255a2124be11366e231dc96700d2730fb568f7d249aa47eb5c13e5b939377b6ee57469f83a1602f971238f4c17e734102c1678130f1eb7962933c7a68c852b4aad6934fb13d695f01c29642c41b700a618505d7cb1f5a1266e3a6bed1a0069458e324f20bc002bedc42b877bfed18aebb69f63161476e3ed2466d866c81c13bd85caae5f26b249bf0997b90e55f080e438168c37ebf7fad3eecc25c51f1f764ed24e67abd583f5607c377aa6d3dc8f5fe5d533eb880961ca8af3a6fbc2d2d43a39a7a5d80cf8cf7dd2efed242d6174f632f78438d8578211014fca8538986b3928d37742012a093cd61bfd6086751ede751aa85e96d0c182cc47c7a323c4df39ebfdb1fca0135bfe8f7e3a14b87af85a33419a5ce59a734b50cd29b0b73d170635656db62290ca51e79479e6db37f43c17945aac24de73649d3ae40408e46c0aff89f41940f29d8194727915fae6a5771ee3938db164b91a2af41596dcbf6ad66991d70f05a2da01a1ebf84a7c07f751ac2738c029761da8fe118dfff3838e32bf87fb1774d274b1f70ec04e4762bdfe9c0800d28e56162e18cf10a029db78848dde112deeb6d6c208f9c1d082b3b3cba1aee276f6fd5e693cfad3a0374ecd7b8daac7349014619f9efce583bfc8d3ccecdea65c33fbbc8cce3d4b76d8437a02d173e93d86befb8f0779bfa5f842b5c5e007ac295c84e094e3bf50f8f47c63d9dfe2696fdcb7e1b37466fc2af409cb447fa4a837fdc3dcb9db66ca8e09597f9fc4c254f9c50000407be8709c41cbc782310183b276e8047f49977873363298ad0d26e382dbe77eda2946c352da17947ca1f8782b2d48abf780d2d2ae3c65bf6500000000000000000000000000f81d1355672f3550a352fe66380b1f6047eddf8c27768c30a838fcec0bd18bff945d72a37dff243313b1d5722b9cd06db4e10c4b4be8df28671e74b6e4dbfd83c3f5a96d1944b69fd4b48ce1080d918e23ff8f9aecac18491422de35e5d5f74e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e73ea2648a4e32ef63529b368d7c363735565e5f1699e4e88307001a4f8025e08f7f93f2e4eb2d1ff98c9b274a06f3bf57bb4cb334528c3da29a860e77c1c3ef58b0e8840a6cf00b1ae2d9290ba3b0789051beab43cda6ad16f6d2c6ebddf250c009225b4d51e3ca1d34dd7c72cbe3bf40e84e6d00c9208e64846c48e9191f09020dfc6596fc9e7e3802de92b14df48dc7a196caa967bd6fd0873d23ac87d827e10312521e18bca2744e29a8ca2f2ffca68361b5ca447902c73342b1cd0d1580698a0a0218dc5c144fec79b9e5ae2589f1992775147cb0340935faefcd816748cf694cc06945177a9e5e2745db7279dfe88f50ba3ea3198c234be5738ae2f6592c6be2021fa6a726199749e08284489990acf68024e48d04aebe06d8146331035e0ddb8e021276a285235d406c7940f15f973c02e9c19f3a3f24c19a19dcc8ad8f475a0afb032be4b92c1395f0e3ec83c398e6a70d7429fa8081943346a7040ad7c0e8757f6d0202af89f632d896ca8b4d59f12796d3de7d39640c2661ec41fe7ac400cc1a33ac0322fa23145b958258254b491d0053df255e493c0ce5ebdf2fc8203df00fc8f4df549ef505a6cf83a9a55ade666bf518e67a9f206be2bc63804af3913b230848444cde4acf72996e0e4eed97a3bf2c4124205f9def129900814bce984b1828e6a89a09e19c21bf87895423b2571417f43b304e5218771e67ffcca7b94b3f9e5b5fa511129305841b3b0ea6a2c0237ce201c17345fbe085c03ba896ef573e9dff4f7f9e52ddef15f85e4f8f9e1d0aaedb69685b542502211d30717047d7b3cb47833c9a97a36ec708a53c1ac9b91b26e8906e7c34872b07b108f78875ed9ac5bcea51c16f715a222cdbb8c9577861905edeaf677612f765587e5a23e179a5c0c5bf45bf3e581df414a621a30ec30a49a15ab763bbf94843cfd674db3608d5acca3778515ea01cc35c21c11f75425298d1be35db24d734765bbb27a433383a2e07621cbbc472d42ad30a53bcaf342645713539cd740bf5e7de3793fd7255ea42359f232004be9dbd64a805096ab821c109be2fbcbbce53d2001daa31ca82f486950c2ec237316debd387e1edd3c23d497e40167aff3d0a62741acc35416fc8f32985e3d12c63968bbd989d7023787e100df33d5c2be8e3adbb56152425332004de321153d75969560b8831989492ea1a7ca17e8c7a4ab90b8a8c993c59cb42a54bd3e166c5721665e754adcb496e62a04f2279bb98d624734f0e44f9677160d1242e47f2e68d49ee18117ca22370fbab48ce3e40a2a4ec99cddc5a84193716954602fbb855b527f78734b1191d121f0362eb3bbfd679f50f33818671e0bab869f37a3aeef3eadf094869c6f2875b83f60da29da7d8f6c3d15338523de7bf1d4f74d1010a1bf4d134675e0570a59bf4963a1c0efacdf63f77a59cc9dd40782886e84273717fdbaea7860894fdb86d5929e89d0e4832d0dbd3765b190978f46adda54817c59095adbfcf0dcca79f7a8c86c0d1a219d170270f5cb77792e3a324ac293c0e5708a5223e9ea731cd6f45e2a885a43fcc8263cda9361543aea31740a91699991f40b583930a2f32428a7d4af4a91061c15c6a0b6ec434bdae41d38fb8db9d23f387d082e9753677975951646ad09e2a8f1694c1c096da01bcc6fd94e71af4cd30747d832e197dd7dbf50bdb379d129d5b2ea0dc3d89e54627885a25aea8ca0d50909abd749b5bfbc06b33602325fbf48cb925ac4e4e21cfb6f44f99ba07bc8987089882511f60c7d7197804223efa6ff5ed808d5b57919c7233f5dc4dd25e176161e128556d08ee27dcc8c06c41bfe16c2e8e649f2e1af0eb819b4a618ee75a75d16a1a780e5961089e3c5acb9a8b1fdd2c755933e46113808281825feb76cd1cfa368ec8542e595e534e6ae3d836118cb3658b6109fbb0b284633f2c2af7421581deceaf0f680bb74497885338ea821e29ccd632a82072285670ec8bad0abfccd1221c23d47b2aa56ac34743801e26fec910fa305944044c3badec3c2ff86be24aa56f6d14b478c8eb3cd889bc22c78db18f9ba42bfc9b5246c2b9b09f8f1821e3c6d6d4743c242dacf0d51551fb8f02dc1fc063d23546c7a2a6f9cdd18a6bcaac327a256750f1a44cf722380323c1901805905a9d4419e7fa655c78b6533e055cac0c35692bff8cdb8bf15e709b0eb00443cc9a903176814cfce6fa3e90d5c647136c7336b734908dda10992a5ea8a9a0bf6198962e1d4e6d07a6aeb603456e058d4f29fa53bcf3729d824c584274f70000000000000000e2e541010000000049e249c8d7baad2c3ed7428b62b70de1420236763b041110930c9a9c591e5f7159ea85a6d8012aa8f317c3e40a5332365954c02b84c97213edf964f9cc67d86d2a71a75529e39dcd81eea07eb69e85ddf6ae9931f000d28084d96ab8968aeba900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000139d694391dbb20b7ed8c173193d977f66a6497b7b50e13248e0d7c8c3298440463c711e74ab2538e9c8da72b5b25ec8883b854bf1ae948cf5be1fceee27bfd43b76de63ca5177a0080f76cb164525f3b30381570202b40a8a58f9216795cbe733bb43371d2ba5da9c72792990ee208e04e01dd5895dd9b9387f5def08f73cd102068380a04cde7b956136c71b91595c0b0519bbc6797097203a1f1896bd92b3a5021cda8e88b7350b12de50801b45e045a9c50f004fea79914b97443dd23f2530490b08b475a8827000c6c20a3edb3d47074f856f1f8ba5cbe03286333b55bc31f4c037185b67b18027ab56f5679a4831172a835465525dc1fb18548cebc93813e612030e3219b2f29918af0d821c8806e014f3f8d025eeec2c5f6303d6a5e6b787cc9f0316243080b0e1c71bc4877f2f85901dfb52b617dbecd615e268946010f7f9cbc503078a44c5d6a2857d6c0976ff9ee157955ccaeca9de5a14950371b1cb9b09f192021aeff83a5ec0c63ec28dec3c95946bcbdd67bff992aea39c2dac53472749ebdc032f3930cf74423605baba33daab9f2e55b21dabba6c5b79e516458bab4bd5924c72b52e2bbbb28c472c31e89dbc204b2144e2af496b15f627a4572984c9976ad9b6ef321a0692c1d8dbcbad55f55f571a1d842d7f098fbb7c6947ae274863d214848241cc33b0cc2ccb2220b7fcf8407fac1d62ec62046fc6ecda80bec6b1ba5ab21e7103ed695ca10781b090fd2f999ebc4553ed75c0c2943f64202975ce3a2a65872092a1d274d434fb96024d19c1a7dbc2be33b56992fe88e7f9b7b056bc1e6c5ff1c665544294dfcd7145055f51391a093aa7f6e1d1975307d96497612e17938db6cd823aa12f2ca3f4ea17adb4238381252a5f8a0098d7f0ecb2c08c049676a33e2a327c3de00a5495cb1aae8daa53acf71fb54848f61b39aa0f8bb898b6f5b69c1751ab410b2e3c0189de63e389050daf61cedeb5271399ef5e1509d6297ff45f9092efe17b50c169363e4e5c642d7f6f52aab1c95b9f98da1a1b602b0de828da7398f5c4abd82660dd33ebf6c6824d89f3a7fa303f25121f199834e056e17cd71d4510ae2714f14d8dbd3d6a087ebd0db84a781a5b597714546b435e68cf63f820ed46fc1cf49943208b5b2cd1de3f50c03d5fb33d12d5de8b7e41b3f0f9aa75640065c0de67bade15221c313cffd332b7a28831f060ff553a2af41b97291a1abc09aefb9c0f68c6063caf3e9d7a32d643be1b2fd3e721a2a7f030e94ea1ae61b55ba5afd4b209f6789e08bf849685e15e6b0a9e01ce058bb1581b0599f233aa9f4c09965cda51522c79ce60fd248497999dd4cf82799dbc4daf0c4ec7a69adef2b2836343a4ea60c8fb4e7a79252f0b920f21b1db81f3b4e2225b61665b12554c18696e186f017d25f717c6bc0417798917bbc78347b8dec02b23ed10e66ff175171bb88627890d2ff9da90d6a6a44fa724003dbef0e8c4470b5594a61879eb46da50d9d088a697c16e284a1da99e626d0590779e4af613575d3171ea3e5c6afb796756a0c3ce2eadfcf7786df6f52f1206b626f3e72ad82fe12f803f521d5623b19c896603caac7c3eae3f09fe377dcc046b5a3419e72488a0e7d439f7c21a290d59716896605bedbca9d6d803f0eebda091616d87dc567970f4acbb1b3019522556ee574dbf594040c5ee5092cf94fdd81fbf403a9402705f278769db063c4b6e7a450dfe776be655f22da4140f72cc0b2264bcb0a2bb35bb4bc4b84684c24431915297e5b4b46930b1583ba8c8baf8ad11da8407f52b99ec2c5b8e997b78ac1a67d33ad820fc93b0805e721bb36633911a517fb925bc771cdf526e6be7edecd4b4645347e0aa297420000eecd0cf7d73ce952afe5b3bd40cbb584c522596cbcf5789aa45e433be05e73980ad25e66804bbaec2ea7d9ad2d81920623e99f6af8b57e84c5d9bbcaf8b6036ff53e8d99a476ba0a71c377050cab2df0c4d28ca44cda779d3d49f9fc842097d72d1042edc917c7f47ee964e751bcb5b5ef66d3405b68c65a0d74401436aae8e6dacdba8f8b5fd7fd1399b4506c953d47370f72dc3b2af62716d1a16d35adb864f041d520fd84a8ff95a29d721a0bf5a882bff0e1cf57f4ff1ef5537261802fd421439a027c51cbc08475af4747afaecaa7d359d5a6aa7c7dd17d00afe0d987c51942c14387d9d05ef69291e8cf5968bf9cd4e9e496023b01289b3b720d0ab42e95137b4980ae063d8519a7f183b41f644dfce51c81ee54aba18b4837c4dfa9ba12ab1f3f445cdd881599bf32c08adedd2d1964653186305f73dc4ce277c0de95c1dab2e29e064029f7a231b533394bdc5f6c3da499b4ffbf768e1ec7ada0ae0ade6273e49e89f18f3c5b8a1e5f1740bbb897772a8ab2efdc6aa16b971110a7a0f9600", "65", 1, 1484102376, 0, "1d169fd5a37416746912e604f849caee9ef1cd4cdbb7e1cc80fc715294d70466"], + ["030000807082c40302b64fa2b084cc8d0dc3190ce74abc5efe310b525bd1a87b0268b3ed60fd701cc400000000025153ffffffffb000d69d826d8d95cdee4523c900851e96fa36a3ce58a018c31ed3689eb875d5030000000763530051656aac4c352c2401730e4b020000000007ac520000655363000000004190d5d700", "65635352635100", 0, 284378056, 0, "3f4dfec149f041f1d35a618bf32f17c5133a622bc45b7aab0e7ec05212f5598e"], + ["7697a05303a36b7e23fe0a4639c0b69b788579b795ac88f1509fd1798bc823fb7b6b03c9f10300000003ac5265ffffffffc583eef68d5466643fb0d7b147c090f889a05129bd3f0effa568fc4e1d1c0aba000000000765005200635353085a5427b187f4295c94b45bcad7f5db17133c6032c0177a00abe0d83255995cd4d61f5e03000000060065ac6552acffffffff0459ec960000000000070051636a536a51d9ecf40400000000065200650063530b097e0300000000016360ac740000000000090053515363636365659c20f0ba00", "ac", 0, -1849733952, 0, "8b107da50fba10accd8de476a387d592dfb55fde8b266cf1c8f52b1837663432"], + ["030000807082c40303a7c39170f8d457d55037b0bb1bf7f339cd448c5fed6a34b8270b3aaab680384a0100000000b0cffd6104eabf6464edbda0dbc588b1cc43ead8e8b6f0c8c42fd36251beb048408f59970200000002526a0699c83c4480434b08836c1c78474ee5e3147c2a5ed51ab53d880efc16d8c882ef3b6bf80300000005ac655252acffffffff04b3976c04000000000652536a516a00157f9b010000000007ac63ac5263656520535f0500000000055363655352a3420a0100000000086aac516300515100000000000000000003a3d76905000000000000000000000000ede5f48da7b3f3b29aa7889663614d9d4c820d91f1a71514005498d9726a0ba88458b17b93e8a3fc5e08e8732e92d90443c7346699a55c2e352d9a4d7bec36496c34dbd9213b5c7e43a742205d2ba7168404fa846990571ee8d9f6ad1b9e75ef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006cc630b836539c338e3b33f9cb9b770fe5a9c6e10369e2d4e57b614e6a35a9e5f1d5c7de94c17d3af29b1d86cfb2f7adde7ddba3055e2146bee06c3b15f3a97e704bad46448727addcfe9d0b641021cd0731cbe4b08388471dd052a7fbac8afdfcafc1155a5004460c3a3d0e311619a9aafc9da312271f7f9fc2698757a7f1c30222c39d6ac61a111a6be7021c7c6fc6c6204b59fcf2e5423f4385f1299fbfe304021bb5279d0297aef4c5a2aa9d66b84771cc01165615e78224494594043fea35880a0293ab3bdd91cfadbf35ca1bac5bf4252f5d09ecc284f9f10279b641d82a4414fd2cf8991d2013689e59b5b25395452e417a9c242eb7bd63cd8713e5fff3735c03299b69ebbe47d93468d2d94eccad7d092f8b573567ca09b1930f38ad640262bf032bf2f4e29edff7fb7a3a3809f0b013e858a93304cbf9b05f4178eaf38387cc0d032027c6dfa2fcba9ac622a67910a36f22f8e487791148b193b89cc22fa10796f203009b0931f3eee209cc24afd4307114b8923743ea4a4f38494e32247e4ec041bc022ef026ca7a084e786600a7bceea943126bf72da82e80ac7f2dd19089f9eb8ebaf7427f5d3298ae72cb41a4fb707c69efe825d134ed445ad4b576d4efd77541d0cd6718674d0ba3193ed34333bb53d605c2c194e5671ebadf6b0002a8b92e308cf49b880c2f5c187f7c76abd88f62477ad279627c91f58245542c471975ee87aea1914aff523f70fb8a5166846fc4b4699e8b05cf72ae0fdaa92d75acf46ee76a93992536299e27b224f1f0644b05f596a6b06c0e6ebe5e297d13b4cbd3833334ab477e9b47f27ae98892c8e71e3afaf6c421db715356faa844059555c2c1a37ff475774fe1735b356e20adf3920cf52398a8848a1672bb5ad83a86f762962aa8172f27b644ff00e28799a61cfb2f6dbc99f6615903af73d46dab2c10b6971e073b8ac02409e1d899a536311a9cb5d8bc03224323104f3fe823fd09b5bc3bcc234c6c994483fdb5b2a612ff307bff8426b8e6c30ebb5749825f6279455aeaa07ba31a3be88a9a7abf214fcaf96514fcf01bd9d871ba3e14a04ea84434df4ec5b90b1225656d2990ba9bc8ecb93d9bc235f6469f2f5da0da6cef5283eee46dcfa284b45bc55263feb3ef5844de7989834d4d0968bdb4a85064af7789859ae6c955ba6244495e441832120b57fd728c665ac3f57cdd495c2de021c69d28b1219aea1e09b2cb0d914595417aed4a7922b3954a89201e0b29334a742668e4c2648ffec106369ccde6f8e9f3998f026a3b4e5270c0541c8082b7b0a0b14016638d5e4ec4b20f87d529dbb5cffcbace884c3906e8268323f0ef2a44a956c3848fa01a7feebe69964886c82536ca0711b2f9ef886e69ff4083a43f5a9293306a0268e805c65dc947ab3c1fbceaf2bde07b07f0c238f50d64b0763bd20bbc4b35ea242853a49a7318e98cf68693a63267b0eb479c922fe64eaa46d7cbd70e2c06a14a05acb81e400434e427b31b3669359a42760ba74ab04edd304ad6ce12eaab28ed37071940c0db9f35058a66647b5e08c98d5ca85762edfe3b047808775b5346b91c466f559dec3162a145aa5ea46155f589d32147d58011028b3564d55a2885d0339c5cb0ed4bd5a398a1a51aefc255e9c4d918eb447043ba52295dcee8138ad39a53896f10094a686147d42bc94033bcd264e9dfc54450c4524e27a8c612a20a501a7f02a1b29f42050bfbc3c7f7c935333af44a03713804d6da68b308cf04c836bcfc7783213911480f4c2db1c989f4acc9e5d97297819ed28eafdfe2e26f865f53386bb2ca0c5d16d04552f72ea30b506f4d2e44abb9df4221ca1c184b38b993796091ebf661650ad6c7283c214b5e4f2ba23dee32525f487f6e76a208c8c32f8b4361f33f062c84961463825d4bf7800908d1bdb3f9e3f125417fbd653802e901d813eafe4df633d45e428337f232ce493883538032c8fd299d1fa3a51fbdeb594c0e975f1b98079241248e810e36285ecaeddf837e6942004acd88c0cc53ff032d8911bdfa282bbc9f8ebb89a1cc8d01d095c2a60d16252fabf8d544c4b97010b1011451b6185dfddaa9c87ee0a0a49fc83543e8f7eae47c40f2b7d824c96fe3029630d8bcf939b9a74a028d73823cf7e43331398d169ed5362cb3356dd1cb026af341abf27be9d9dbcdc9be841133fd55d0a24b1bc2d7e71fe68c5af9a01199cd54f4be0fb5e7e76ce8b9c61308ccb80b5b5297b63e068eba7640ea16c0fcb3a0cfa1f21c7394d90538251c4ed0d4819b64471f8402000000000000000000000000f1a925b483b217993485988c4cb29d58519dc41b02dbb40ef87b17cf32eb672bc0fa739a6f5beac8964c99ecb07c667db4921679e1879b2fea6df63eab83dbe0240c86e186416e4d0a584fa05ec4a7cd6b70e09c3a6824e8ecef03d24536b28d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006edad1f6cea5f0786411355db49bdf0be05062592e2a6460956fd01e9d3b6be78677a28be36843ce71768656831aeac52e7af9151c01d6637ea80bfee9dcf24b0382e8d48f6842a5c917f7a64053f00fdb306aabadeb42cccc5dc13fe1087262e649b1c0f0f33a13921293cd8c20d1d7a9741414902358c8b331499e1f53067b0210bc9ebc822272cdaa7025f3bb4142a53f93a7450a691287a0fc61c301785c0e0214383c7e04c657f70f45303c8458a7096e8e3164b46e66c37851aa74311db63b0a04c90efb4b289d2e4c6ec37eb3fe9a24eaa6b743bba0dced90d942917e1b73b2336ada7c19a25cc380c7b6511578eb73d4bb300e941b0bd72c74fc5c21e8a11f0318dcf4f14dee041850f056244b62636966349d6da825c23ce1d5c096c4d4366e020b4d7319677a86f567d7eb092eb13e13a975e98c4f74348534ddd662cfd11b140303712916925a4a8126d35a1fe32376b9d6828159d324ebd0c36099d9a239dcee022021762953b44f5cdaf2a349eed0f4665100867a136ae2ed68016c486cb20516021a4d825d75e684ec08aa3e22c9429a7fe94e9644cb2a4aafdd12f0db619bbd2adde29361babb027f4762e4b0b98eeba71f178c0ab50c53365c532bc6725b89aaddd5f8be8dfffc6ca7e50892768fda9f31cd94f05f64ee0094b3e4e8a06cc04814e3b02c94cd82ce6ae951aebbe6df50feb37fe7529ecebf113fefb08af82aa00e5257eed489152d664e29eb4d7395f8eb9c2a8b0a639a25ac88218ada6eabedf109b605da859dd6d58584a457979c23551d2f31fa53bfcecbaba576103207188a330aef3399203c7508ee3c4dcd9ca59205fd40abd0299486bcefa6568d97621d15b4bfbbba2456f8e26f7d8bc3dc6aa448927b6ab9dcf022dd816151df719071f2ab8f74128d568065edc22e05935ffc9642e078bdaf33ded87f1dd58dcfa5c68fc75cf83b0cb52d561c7be9c7aa9a98699b8b87ec40a86eabba644d17a3e7ff407a1a2acd55ab0b599319069d1cc142286f3231ba0eb59af457acda4ac6e26521bd7d0d8fe87c08354359b02b431b3e25323bad6775042edead6e1b6396c1111378119d6c076cd5dd16fd5f55433b8a433f373e3e297ac566f03fb49b7da4baf05c9398b63c8c9fffb12d55126f03546c801c805438b108cd60546e31e8ca9cb4e5c0d89afbc4f27adeaee1aa0ef91466fdfbc4e9ed0e935410aad49ec1081bfe7895ac9aa45c43eb91cf61d2d8524dfc042a1046ae0cf3ffef27b677e7c75d502524d539dbfc1383f05303de1925e75493b8ca83fecd3c0bb1ba4066231232ccf8a8330442933aa6ce94858ae0caabd983a70d85a8c185beddc650e37ddd76fd5a399beb5a9b368299a2344531deaf405813973b4a03002b2b0fc528901dc36b3f49d95c5732ffc05a661d9760e458f514c41277c84e1b91613abd8da14b094c3e971a789442edc3f10c07e527d2abf9255b35d5b45712230b47bec4dcd0f356b194c543b750b8da38172440d730ba6b1106c70ba685e9d9dcf5406cde3ed5111e7f890503d3ac40f4516ca9389381578f0c60a08e2a5787ef2394950815abd2c85cc22ff9a07f841b71ef240657e083e8cfa897afdfa7e91fa64c355f9acc7a6f702fe2b67c2c3b251b988aeb49ec1964db76bd77966c1468d33c47106248b736c41c165b6c06de453554135be55bde3309fa33ec328ef702bc058b451ee9468e5d556a63efc7e858dd315f9db77da0c7127c6efbafba56a59a2845036767949a0beaa89a96821e1223d9243dc413ea1e6caff069ebb453efe0a4fb1d69ed73028f18666f8adcbdc9ff148a7b484ba16b910f274eb9c5ae31d2d1877a93eb6923f8721b36dacdd83714990dc701f133a168bcebd50fb5257d101ccdb1409b67bea6c733a8c44082c61c5a0455f2627dec43d28f769fa61f6ab83b94a8b0caa84e14a0a0f8494d5c5c539b24eee48cc94b72194038aca64b24765be7c853474ba783dcfa4f570b801dddcf54148e59a243c5168e44e6645e23f3316feaa0e49e8db8d5a0eafed0eba2fb282e3c488a4f9fcb9560bb7cac7e03d5b0dcae47c7a9cd0ff35a400a9ced90aa6c7ea76104d7ce991ca8baeb6acfe9255dc5134dc3437f297172f24ee7b30c9c01835bcf3c37547bdf565b36ef3dcbc121f848c6b0d7d467b87706cca862e5fea0655463a204a2b1b0aed85649d32c5280680c7b2c2b4e471c1b868d50121814dfd235e29594786d54145a62ecd2df9fd66cdd125149aba02dc42c66c3c950b3b121b0b5940eb4677204000000000000000000000000a836261dbdd3db24c4a778124f382d6883966d7083b1f4614f2ab5748921e7b53f21d9cafbb8959099da47680789fb701268a34f3514217c386e41f0dd66ca002e835fd6beaf104fe98078e6ef6df181491af33b466d83f62fb9e821f61762550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001758cc6574514b6fd893053f5d6a3e4aa709ebddeaddf530abca17fa1607e54cc8c39b0170e8f0a144ae7d0051b789e7723d0470693892d133b1c70be7835f37e83470d30eb759f124726d46b5d368c92534a8a841f388bcd0ee88cc5dc29694e3c201cc770462b49476fcc05dc72ca26d81506385e62bf1062b3dc9e46c0400207b4419ad9adb5695f90d09321b293fca88d680019d4279f190cca1341f8018002126231d4879b18f5b0c49cfc86c1d8bab4d486bc8b8354df283d0e5bc63b72530b07b76829a556633acab3224592e387b1f8bbcae315d8356c48f0cab748d52b529bddfdcf43b2af23ae66fdfecefaf848416205e3c4a2223eeb9acd7877052727022a4c4639699596c9ea89172cee6ddd2e572a8cd2f5aca1bf6e71e3408bb52d86030344d02400012cdc1e3d2c2ae0c155357465d686ab4ce2a9522de3694972fbbf0318381a8a7010f7641748767374e102988c884746ea1d3db7c24780d7808e82a60214952e40da9b0ca408991f3abd1a4a978b574411ef6f2a154afd67f0c37b30ea03019a2d4981d165cf350eed7864907ee5cef47ffb2a91547e96369eff7f066ba23b020fa07ebec13ac7596c6a327a566b499875eebbdbf23a9b90b2dc61019eb7ce79c5476538a885b0c9817374402e0deb4e6c9eff3814314adc4452fa0b067bdfbf2b9bfc270c71a09e3e66ed85979f8fc6aa06cdd977ff992475572a5866fa6aaa5abaf0b0e3c6186a77bf479dfdae176b3be954fcda5cc1502b131dade8ece579d68e95d0dd50b083461cb49342f975833dd7500853f1099ece6226b88347828e93d81374856a7d386f75a2b4afd1fab85516fcd794804674a05e6f18bccda5115e538999724700abe1e575e5ff98af707e649b9852d6699cdb4a5eb5f6ff7708a3435de1ed98f99e57d9501dee3fefcc7d3b4ac98adeff722adba4b5d393b68d380004e4e40ba382dd8a4b263edb77235b48fb41affd880a8e2bb3fce558b7cfa6b95b05f2598c390a3e90535d96e29312a50f758de67cd7e469c0dd57c8059e4595c2fb0b854b84fb1a8780a95b984c5a1506bd6f4a0f161837db6535fa826814211af70dae273fa4213012a0364d0d08fb413394bd93ed80dc4cbab59ad39d2d860cb71aaa7d8e99cf89d8e71416ec3f3edcec61926211c89bc60fcc04130a1e5c2188dbb1106a357d840e5969190eb647be4a4061cc852e9e832eee17f025cc73d6a9e2e4cd8622ddb0bd6275c5ce17e263ef8b6d2698428808711fa634589068f5eca3720f73b69ee3eae534cf2d79700ea55db7aca8f67a1552cbabc3124b4842cc7b4ff5586dec1ef0ee629237cedca967643bcbba4cbd5d70df35dc33b1309588ad2657f69be7ac0fca8cf6bc167c4c5a7798da98fa61bf6d85ce404e11a36ad02829279ea63d1b00bea95ad78ecfef7d8bcbe91deacde2b1a8360f41c943afe6b0af79b5388f2739f8b95168e88d95b3f8e0f3688dc7071a06abafede2424edcb0d040399cdf1463961748366dd058552fb0f5a639c4d800bf0c231a31fefbb617f5d21e9d167c098fae6d3787f15dcfafcf85d5d310313b173eecd9abec56710f83a9df8cf4adbcb5f7a49f2626797c7741e5b840c95901f60c7d1eba1c0a6e83943558c146b657418d38ddc9d2c0b89c9950f6e976f20345b70b0a661cb187d0287613cf123b81bf7b1db3f991e46dda94ffbe864653be6e98e38d4e114d7d082d1c4857e1450f223fbbd66e905b11e21cc635529edbc4d0109a95cfef6fe0100969c32e5112a2644e3b3adf3447c550097d3572552e7e4a176866481670992ba468d71c2fd7c65bd9e595a16316a5c1f66e95748840ad71385eda664ff85a9b03d0abad2be8efe30308b5c83ab1429b74a4a0a71369d06e1dde801e14c77b40ee860ab8c088d6ffbe93e3373e7419b2aa9df182235abcdb0d7e2561f877bf2dadf7bc2d5ae1c6d28c29cb4fdcbe41bfa34470fa1185472cae882a0dca28cfc5692f61e7f27f25e6857ecfcad3753358d748a6d1948ce08f1df89b37be1e9beae092ec99a05c9ae958a67c98f7e69cd53b22d67689df2f0da144d602cb381801eb0fecc2566edf9b42ab425ea1fbeb209025dd63ae783ec989a7144b989f632b3b396305849784c17f1593e4854f3c4cee1db2d64d38ff323f52ac42f710ff2f007c99475aca87a5c7a5f74effd87adbcd4cdaa436fdbcc21f5521bb1ed9a33bbc5a2e3168cb2dcb818932ced95178dd4cc8b08c59346d9739cebe5d8671c37cff972fa87030108ce764f09e9fa2837ae3f8ba932fbd044ad485a9fe330d9df3b600141077254adbdc6ddff43a6c04eab21f43f22fac679d63dc34f252dcac8a69c742009351bb8c4d23b0e6869f98219440c4a16e0bd9f683fc742629f446add8179b9cedf8d740711a0f", "00656363635263", 0, 1025392125, 0, "c52ad4d989ef4063a0bfa7f0c13713ae3c99b60198a8bd010f5b8ba782862543"], + ["edfc012b0477d9ffce42d7013d0a0aaa4ad86e286f9a27394a061f56369e4b435b4708cb7e000000000952006a6a516a510000ffffffff8fecac3fa23c95956f712890230e4545ef6ec1d0ef07d40d98a75c7725c59eb40100000003ac5253ffffffff334558e6e611340cd30a68fc5274dfda6043e4bd94bd61e95d9bc2b411d5046c03000000066a635253ac63f5b8c3b2c7c7dc6cfed45b39a252efecf5bc032b037677afc7e8505cc434a2e082d8bd8d03000000076551006565636a9b617365046e904e010000000009ac5351525163ac00524900530500000000003864b2050000000000c6da580400000000076353acacacac63000000000200000000000000001330460400000000abb550202d4845872f6da4f2d89e37efe16ea997aa148adb7e602bae4caf2188b988c33a53dc53ad957eee363e20823824b67435afaceaefc2cd81c51a173533b32eac696a57e8f0c7431309bd12197fb583e4aeb5758701652ea36e2c373f9100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030727c0b0413663b4e64428bb0fbf4e2c6cd765c5825f8775104956861c63ca7af8ad674cd1b411ca6d64baa56cf61eb3360b5496c0a54d4cbf236ff009efada501a157005db4de8ed62e4afc52969dca17aec661b6ed07be030b7f65348de852e950580b3c60100aa845262dbe2982466f0f81ab8cab13c63d26f1331ce4a9022c787c7c94a4af1abad31d5082896e483e0f339b7243f9806ca785273c33353d031b958a3610996871541e93a0d56f9a9ac34a21be0fe521550bf67a4a67fa9c3b0a03fbc3283d2a775f973369a2ce852443ab42e1440e23f32994f8f085f79b8b5120075a87587f05c6a03153282d8de86a60dea9867701c92c19672bc2e984b962030debe0f0a5d3091cbccb041a7b661fee2cb3006fd71e8351c62debed395e52dc02186d683599c1269c2539582eafcf79c96153dcd7bd7d327347cf7e487f0c66ff03022e3662b0fe6a5b7722cad92f6cc0c786ab2b9ec096c4b39018894553dbe9210313edf7b16fc9ae5a719d86d34475f3972ad37e00cf118fafdfd3b02a435a95e2030e28a60e5493abe60640bfc209c250f29a7c7fd4b34ce6b6b4a38e06373582f026242535c36ee452ae4960be7015299d5a9fbe8ca295c891e45537ef42da84d2888421c5b2ed507d4530175504fa2f266441425a5b008fd765313420a705485b35b304de9467d7636c980659cd23c9e3f5948413cdb53f5120815a7c12ed1299f36eac5afcb71568ab99aa13f387c81d0c631d39602a5d21c10603dbd59064b237c37cde4f660c1962e09d3ff2feb9dab9fde82dacdab8291f22c95bf031dd3f7d8f422464a554d2ab17b9a010c947ba7f429dadbea570567c2537c06284b374e216ecce73e044b250513720879a104f625fd51d18e874c88a9c6ea56a6019fa1ed64ba3c902a2ac3bafa7170cbc21a928c32570eb9fef5216ec30f78a9d812ceec9ec2db192b0d3cfd1f9764364025fa57a0bf8ddb98654969806a6f690b435617fcfafcdcb5f6a1f96acadc717eff47c30738c8c03cb0ea6c4c1362fbbd224a9cd6369eda5bdc030779e25331c885b07c54d85b0902dccb81b147ef25dbaf5ef8fc9f22c657c6d85c6c02bae2a3757783848ba3a3be5385638b0e7ec7d9f55e083ee3e616fd5293670e22dbb9f0c44833e3ea85ad6d53ef41fdc447bae51a7a39181579bcbc08df0a978bc105e293e591b99fd76dfd6e90a2faba2cd73b342d696beab3238f8100cac8474d40d95b111cd8bc74f88cf209dbb3cfcfd944fe93e7d1f745a7f5f68be630bea79b49a4e8c471f3f7594d99ede4acaabec2a2547ebcce9b705d93417f1a0dbe3e385eeaa6b7d3b45b332ce5c1b0873e3dd3d2d6491e063707168034bf4fc36914fa191ad0d05988abb23737b2b834757f8f86c80371f96f804a0e3cb47a45e66abe89e359eb9f1b73f0a20128681af1f72d271ca653d8954aea02baadb2a08781f3907196e8a4d3fe7aefbbf89a90b9dd62e45111afaf8d85555d3b64ba624923497cf2bb4d0cf08c85a460ce0a22f5e4e871b5a8a9b46d52858c3de6eb1e4af8902c02dea19096d7f9c32ab9a8effb8d0c4ffd7945bffdeb79ec15549a97fff309d955be9e48be931a5c373019f42eeffa784d7ece5fea682cc9cc14c91f49c3191f4f51c9ed181320ae8cfe6c15dafb766984a7ef0931aea8e84247ff20f75fd3ce266a114fb7993e5a1015ab765ca4a6d15d0a80b886781d5a93dfa0c65ddfec15e638e7da56ded8e24205e81cbea7d860cf3387bd58f2bf8f75d5d6ed44c7108692885bf875dfbc17dbcefc0ccd3b064b764ff84b8cb50d86f77a292969f5dd81203cc0285d7ee5369b5368414bef4ef20f451f7ad0b33cf9210652b1e22e0fac92808bcfb77b77739e96ebc9732bb06985855648d6a20f23fc5ac40d15ebc0fa61404fbbd9200bdf87c039a7bed4e4a9e0e9fa336c06293a6619a48c608894d0dc5bb0c62b54db3d318e27f3c2f4221e5c4d2333d09bf7243ddbc9a46d48708c4ebe4309a60ab36e8a1ff6bc156fe1c0f70e532760a23bd900244cb9da0f6f402191f5693853a9e45ba4a44b82e8ee19836df5a3f727fbda8f434943c8221e4b07e82dba13f8a33845877a610f700b6bb88920c88f6092dbb5ebdbfb6cab9e667e25d24b6284d1e17389b840788b78ee97fa873b8362a4e6e0034b6d86e056dce1e53ed33ee049f3d7e120660e0ea2a33bfc91a02c725e43d5b6a4b65f86e3a86fcfab6896f3083b6a8b6e278c3dfc50b13fb686794894ef9be192b8a9dc0ce841282ba783b6d0500000000000000000000000018bbeb09445571bc18e806a8a9215b162a41f48deea7e75e2d2bcddd5e95ef6ed217f07ba47046d8dcd22813a6e0aaee3593e8f78f1244f9068d9bff82cd0f8fc1b91a0d741cc056297377b9d907f2e562f90b3bec429e3b971c9d6e83b0b0e20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029fbc567dcfd43f17cc078b9def8694985086b06c3f35c537fafc025d6d2ba3ad13c470af6d73a083395d2824ebd928c2ec5e4367e5d4f2c9df56448353b2de61f675e9ba3fbc34845dbbf7c66d7e0961f3ac1db2d06ce030bff9d1b8837add0396891297247259c183313fdc75fccdab49f2835d3604bae0723cd3b66e788cc020e40796537a5665435d48bbe805b2c9f40bde12314f833bca69d46652f1088ea0300a933b8f48692bccd35ebd30b51d37db03da25f0c4bc37beaa64b787307acfc0b03d4cac6f3434f4c93dd5f8ae7c3435b2a8945373e4bb5db2b901b429b6f17a208273c4f4bd3c219f36b088879835ac34aea848eededa97c2ecdb4bf719d2bad02136db36f26f72f86e2d08f5b1c919a08cd8bc003e97e3538c55bfa2eb5755161031e28697ab28610bb5227e0526bee94faee743736066f4699e3941c3ec90bc2f70224bca9c28a25432f6abed2f02e229508d46c08a5e1db0c61ec26a23f65ba4cb90304490df91447fb59e3ee8a2c06012614b298442313540c916d931723b3979a77031d8aa06f5d1beec2011b12a330e646ec4cfa7fd661bd164418792cbd221d50f2be5944a9049d47c26d8a73ef21e9e871194c3fac741041f1b943997081563c38801ac6732ac4a09a3532b8dfe1c97f97031d3b73b9d0426a6da1ee1c1a8c5f3dd4f059fa171b8cecfbcd7b1d5c90063884691f8f3c63db28104a923e9632222ec85fd381a1f2c7e891b673df55da2e793bb7c296cdcc7baebc071cca6b791203511a40aebc86fe4eff54bea6152635c27a9ec9bc1f9aee9f67b7a225f08db3f1d4e81956a0606634c51061ee5c8ecafb0e1efa43c426eb0bda51fc73279246154bcb1c2cd5a71c6e91c036a35ea0b4984d154fa949d732d3c98a5a9f462b5cdb03c56a8939093ad6fb07642ee3910469ca73753c9c1bf16d4e0114d92aa82ec5c576712923b361e9d537694e233bcdee1970bfe659d9d57f3d093d9f76d65141059e399110a4c87452020a5c1efa94576dd58b23f440267df6f95d3d4c213c46eb88216e1e40d2609fd18fe23e5a12c0f726f85f06b7fcd615d52310a5161b50cb7382fbed8c78e8ac76c467e243235da99dec702a99ea7bc714533bbfa72244679b343935fd272e8056e4599a94755933bf0f1d11d31b5bc3e05fb3a341a73ee9cffbbf160d0d7b00ba250c330c4bbe9efe0db4e7168069322f037a52c2a051188982ba2773256fce062528affc4c94367cfb238013f543bee4527fdc31fe6b2c93149771124174a7445980f57d0865dbdc9d2a968135e1c3ab6f02a200bae1103ed623bddc69d8433efa31197aaf2f8e782cc3874b59de5ea972f966ebd6956cdf27ac9f356f3b158855b1b160711e4e127c8259e6840f9a82e93ccbab2af71b956859874cbd00753f4ae151530dcf291707ec6afb7dc3995a4335b39525aa37f723bb465d4be3daf4fa7bb0fe41fb856660ac6b901afa027a049f5e2075d9d523f9cf9040c20be94faeee35ec7cdac2eba4a0409df0e82415024ad063dc38ca24b54436a723fc8326124c6586d32936872a6d212b6ced2a76ae534f180d9d26a902f4ca2be3d378ab9f1e5e89b9b3813bca99aed5d89dca34a604f20af2c48a33bf664884f145eecd5fe6054da608a53b0144029ece0cd91f8447186cb71a23ec37381c259eb6e5e852f44b310fdc0989fa4da25edff25cf1603689c27e74ce71e0c8659b083104aa101d7c89be45c6f17caa7733326e9405cac7ee3f46ef47885521e7293f87f543e1c1854a058c331c92c60c0f02a58ad94cb68f6014c0fbec171c9497397a9c11cbbeb3e34060abc08387aca11884c19e73474d356dbc83cca66a5803e2a98abd88cc76bb291e6c2d8012860bd1365d741ca29aaf86f635baa34613277ad9162ba2e3fa8b4b8524ed770648490ccff48d2f70527d94a7967d853b8782cf0bcc24e2b5a7b5ae9631f7c649fc87bc872eb3aa3fb1e194e7674a5e918c9e696584a6683b76f72b72a3cb3d276b3fd0a7b0975e6653724b44152a0c50e37db7e549b3832e578c99e6b4cddeb086bd29a861fc542886e5ddbf27cd791b1fac84c0a94cabea4fc3c952f3161a4d77dbbef3ad540eb59d23964ad34e93ddebe662cab2487cdc4e602484cc9f410eb5c26a4eca21598bae1a90c12c644fb9896b767203f3154e148af64524185a7594cdad7719f17c62ad31b21c3c3ca4572e68907a70453f3463edc0d75df973a9651bf74f4cbddea09134df935d465ed2d0eaf0bfd34b33c5ef426b6548a398bcb14fcef3cbf5e2ec0b590a2f229b754d56cdd3db32d64986efed64ef9960252f6b5e2f3c4c73533aebc5da0f97e8e6eb6e58d5794f355d3c6af85317b42d694faae4e432b5ce500e4f523e0a1fc1a635dd4eb48159ae792e0a91ae106300", "635265", 3, 1864993491, 0, "a6d33b8e6acbe8432a22027cf5ed901994a7d3d6f43b7222ebc93fbb87a5491b"], + ["030000807082c40301923dfd0006da40080c211784243f7795af15efb84429a7b12d7958cca87a10820100000003acac6affffffff0296427e0200000000076563655253ac51b173400300000000026365abc444ba00000000016dddef05000000000000000000000000e2d9b32cb7eaeff703286a4526b6fcf9f8db431cb7052223bc68cbbaa2c568e6ca6938ad7d7ee6d3e2f51705b279b7fb36be96feda6b757d4929424f530053267d8f56004be71f579c36192ee5509aaf058219506acf8e405abb64b7d33e1c9400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d9c59b2f0a9dee67a4ac880ca8f8858f98089d810b57fb8130719d1a900ceaf3a8510dd73b96a314c75d1a450df9e1b86f1cbd66ac05cf81bfea7fe46aa936d57b89043d099f2ea8cac803ac57bd08273500dd4fa2cffce531db3568ab6f904a6e21d398f0b21a9973698f7e910e97c86c115231fdaf4002ec55e81e79766a3f032c9f23dc8e97b1dd01c508a4056837f5cbb24089eade942de35f955415e8fa280220e407c47fe30b1e429313a829e1b035d438db1d2d49f4da3ee319370f3229f80a0774c1406b4edaafe3f0976b673c54999efa7b0216eaa3150a8d8e77a13fe6173c26fd1f40a1c5e8bdab4ef7e17c2ba2b730487c92a80efdd9068f44c4f85697021abd0d05299d428098bc74053da509ea1db74de0fe6e13b217381c4bf8090eb80223dbc71add09b9b9316c7776683ca1077a8498b1277aa9de38bf7577dacc26680225c453c79bb4c34a0effb96d554aa387f367157559b342e4ceb4f46ebc32707c032b80f71e017d4a4fbb4367e6330569fc212e8c13a9b66b75e43be341966583b6032f511635ecd6c501ebb9e3356698cb79f8a42bcc26eff0e333ea18a09a3c238fe5b1b3d8c1ca1f24b62770b8197ef25ec803d8c6e31216aebbffb411cf2e01063fec37ae01cf6b0506358df7db4689977fd682c3dfde642cdf47d2c1fe1aa593ed27ac6424b892dc0c677857a45283a558cfc38dcb968403e49fd8280bd70961904383a9bd088cbe345fb46de6594ef3496e7dbf2062a54a531f9f4a7268b27d759537214d3b2b0b8548d724129ce9d352775172b91ca76b1fa5e15c7c66ecbe608da96db44adccc53c91153afce54d3cd7d1f9e5c17756fe764e470a76f2acd025bb520188f8fb389528d68e66c889fb891876b6e3b621ec19ab47ba62d6b748e87432ea084d9095f1c2249c365c3d404038e4d6e8b4f51f5bc7504b28f84637ed896c7bad5ef1bdc4162f5a8ced6bd045d3010d55784f5e13f6d30f92eed40f8433f52363edb3742d9333ac1180bd5a5e7a94cf2010b1921e7b1b1648124ba0c503490a3aa4cc08b07a67efd40f7ff9eeea10b785b39320e40e36848d15c8f1d8b0dd8404533624399f374e4d9c6d2bb64fabfdf0c286e6fe2c570b1b3573befc3cc89d40da59f9ee8e7f0dfc9927780a8be70eb64ddc1dd02ca05b46b776ee57684a090aa826d81001c763a34e5174ea8bf72b14ec8f8c4e3f9c96fa391c210cb7c50a4cae8c35c404ac9751c44b3b60cd75e42ea33144cf70ca46551f11b43ae984f61fedb9eeedc160552923161585f44a5833bafb2c567b14598195158dc478779df7a23d6438d5d5e922469a118846e603afffff9f2abc4f08cd0d3979b13b1c736d8323a279a0820376e7a9eb05e6bd5e28652025f51bc095eb8fe7f488c8f15c5adc3b6e38297fe7afa6065e5c4ff6e1bd12b3ca02131a558f90a5e364c6e9e39d569327080d1623908d4c041f5997bb1beb37002a089c9f60417b708c1b97ff6ceb7dcf32cb6fbb631f89ea5df665aa33b57d5f02d6390707602ff07c7e335d903539484553e535a83777e9acc6b19ce5c7a85e4fc893755ea8abf7dfc9733da06c546a05f7b6a2c69e9dced40f52940a496ebd24158983830bac003cbf67a979ad3a901163009933e241a83e44f4dee588588d16931a0e1213e128bae5f2e6275f12d550647368d3f69a4588c07660277e9c0920d239f9311c5a2212b0cc6cf6c7e890240204df472cec171a0e0b181e008b21901787986e4f748eb377cc5b1a62843128ba7f76f2a84e77e47e43d524b411321b8d98e9c01ab91bf78ff1406fb0bc2fac97c74bdef62b6082469aab62731bdc395eb36d752232c2c6227ca095cb0d3791f828d7bd4a73768d63c512ba8511a8111e3a3c4e872afedcf2d98f6c887432ef003f4214c0f905dc9e84318756ffc9dd5876d12d99986beb5e1c9ff77a0aad119b9e46f3e7b167e3938b5b1fc564a3cd8406ffda8d881efe9a4a25fdbedf91ab3d421f5b6700a8adf7c8e31b063a0af7f5bad71812de43005905068fb0b16cd910236dca7d750d768e73f9d96658b7380bf88e785a08467b56eb1d2bd819032c282e829d47451245cc8e86376c31b09996fe9ad20068063310811e26c5f278bd46bbed6ccfcfa5fde25b4f37599ab3df95613e80388fcc4d87cfd4ec1408e2c5b7f7458484771fe84f99b3be40542350ffb1ef4e111584e9e8f7430d75c4af1c4e16d03cd1cf2cd5983a5dc4fd2c01f26b7e61bd4f6c9097a9271fc7cc29a1bbb596afb982b4a415b5fc189bcdca9c86b72f112c202c77394ae910f682a133982a6e886435918c604419145774f8e0336ad15b2295ec740a60c17b40edf2962aae844257fe7ae042a10812c9c6bd33d815cc7d51135d80c25e6038526bd609c13d3e238ce76dafd0a", "63ac63526a6a", 0, 205200832, 0, "d8a943d1fec6e1b32626de0efca5e3eb05fdc3de040a37bb688a05110cdb1aad"], + ["17ac6726047560706b9016da1bd4a95317192a9c208b29e63972f9b45c253d7e1016f0e8870000000008636a6551ac536a51ffffffff6e00d18a2696c2b1a14e1fe72dac13acfad3f01ea42ad23047036b1b85b692b1030000000652536a00ac63ffffffffab7bb86c3450d9dc79af4fdea4dc89d5bee1f66cd3df6cf6d4928d9ac486b020030000000400006a52ffffffff0af4667ee623063897662b635d8d5df5fc742782adc9c7b94d563dc6abf0ea42010000000463656a53f4587f3902a47c3d0100000000035353ac9a6ab10000000000003463938200", "5365635263005263", 2, 1153208478, 1537743641, "39b149b97283c43a6fae698cc9b33c4f2d7e66cff2be143209b725bded32deb6"], + ["030000807082c40301841fc312e717c241d90e6d7cf2c9c0ecbb845234afbc9252e829ec6c965a93890000000006ac656a0000ac73c90d3b01daed760300000000076a516a536353655fd29f89000000000200000000000000003139bf0300000000692932c2e57ad1381334ac0ab9becdff4f18700b9c0519154617808bc133b8059dff932e2da76ca4023d38d37cf3038fdae85124544cadb1decfc769302f7ed7ad39deaa25b6f86c108d065efbf851051400f8101245b04846cc405e06901de400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f5b836f763810983421f4d0f71bab7e1fec17ef053e9e2e40ee1e9f169a44e6d175be4f8fa337e7f2e5a181328ddda272cfa39af678d81beb7a4a44805fec47be2767345a32c64f5d751f011dc166dc3305b28d1528ec47120edebe766a5337e1ed7db7dfddb9f84d32b86db621800ffad29bcd22542c4eed6d330e19da770ce0307989db99fccef29d31f41fa1991aeebc56d64c689112a64247bcd685b324b91020e26d7dfd758b4df3d85be51f5b7d0f50aef62ae969cafe205b70169c57a818e0a08de3da4dc50a2c686a03b7594e90fb6eb365272e7e7b6490698df3bdf32c01d211f30d0bbd97b807655481a6130c0245b963f2b6b75c76d96aa46f8559ae14b021854dc4e17c974db4e6cdf3ff8cfe7f06e678cf3de2c7d1786630432d4f45d55031d7e4f84d2841a48a3a80957ab543c2609f667a64be749a8ed05f1a6ea0f067e02004f3f8cece261a222f3e71434ea61b410d398aea5d0306f08c92bd33562b5fb020d50a12de513ed3d701c2ba0dea747447e7a035c534ad76ce40cda6016cd3bb6031721095d5336ad55a1c72897a948b6117d83cd4e9440ae0ba06d56b32395714641afd4541c6b2eec3f77ec633ef6fd1c24af6cc92cbb9016b4cff85654ac9a1ed3115449686d9c6273019b6c878a59a99a847a73d3baa7972ec3455dfad87419d950c76e2841b9344da40645add816e4ba445e66bde58dfb2ddba0622d21a9e9c31117c4c89eff717511669f2afe52c625d7673e4fe2bead018a55312516dc91151c68ceb66339cf0e8141b823938cab4361e5793f72ce4cbbb0118b6415079091bcb62d23fdaebaa98aba39654162404268c0fa67a9b0634b7557ee7fe38da8aa49db0e34fa4c349d41e0d0ef3c17813519fb89325aa0577a596ee533b07926292bc4d89085dc6d61afac101b2e031429432d2af87fa808aa3f948a87497e0dd7929df8dfc415c41d9a5df9f57df02d3f2ee19fcae23aa194c68443a2273f595195cfdb24c09102b2efad3032869a7e5ef3caa8508f4fb0fe3106e1c7046ad21e1e11eaeaccad58ff535c51e382a35081279d6be1db57587a8ed28247dcf3a4fb75fb1474ab99eb865d9b17c469927b08676b6eab519aea96f9df71be702c1440860ff8024731c6d3dad6c32fe06bd85b5cbb344a8ada2c4656523df2d64537883538b0224100f744fd729180e1895f1fa7eaabffd76de38f3eaf80e1b66fbbdc4cae11194c3df8309534cae946818f3da1487b8a8ff17267b98b9a49013a9b05fbbe1636e1f44029fa96bea7ba85fcfbb845fdd699a2ccba6ac2fa6678a4e9ed7b548d65e2596fd1195bd914570a8e7cdf9dbd1c24c60ff14a664f6361a2b1c8864a3bf33678e93543650ca98fc0cbd47450fb0e70eb1e6cdbdebe783edf5ea58c37f60d0ade0f59a27f20d845eb48da2de8c5885ab270a32eee3fd2bc165e42d989f9af61ba3b1473a1cab69fca248ac1f108088d89c2f2b776f673ecf266d6e2ae46ce785bc2cbbd921bd57a20d95aceda3d3483affabb3f1ffc0e140875e46ea290e93c059118625da6d0446e20554f46627b9462d086eb1a1aede357b8d760861f65e22f6d7aa1ed221159911292fd4963a53e6599f613a63f6968674da619e0649621f6b07d151e4c078474cfc8bdd28b0ad4a8e919d0356396265b6bec7f438ee206ab00a30088d03688364c1e09b5439472bad81a7d0a3442963c2fff95d96fe484b26427be3760aa72307c54ede9eab00390fd3c4a3f24e6143b9fd36afb863163d61b1e19103ecca5f89b789f903d82165c0213ae1950d2202907a7e3da8c3a61d1d5091b8e40296da70d57c1154f54d5ef77b07cdb4f9c38c35c38d5229ca3d82fed4ca1a65eb7a17f6b366aa504b60e0f6af3360ddd57016d1f72dfcad52ffff75965a86fbcbbc7059f11218345f42b8f929ac5a69fa3e634f21f34d6a8829d41a7b4678a058e32f706fd8fd7e99ceb02d91677a60060feaf006e952b4bb37c335c0b35853702dde94b8e626a0020b5e08bdaa0147442dd770baf66542b71da02a7eeeae85a163b8817ee52a285203bba0c3a94ca13613b39ed9aa434310456439b21c4d1a248343ef7e30804c084ab2e299cb05889dc249e500e906abe3caa2fcfae9be2e61bf781170a6a6be673af561b60090da3c3dc9d5a809a56c6f784149fbb7831914d5fe4667fd2c0039cb29dab657257bc7c677234e146dedf1b725deafa1418746abab3ecbb0a3f67740f0b77db2d90e97945f880b65ef17412a2e5aabfdc44287def8d7d7f7b000000000000000029727304000000003f5d42c851e1e4ebdecb2a76e0715f02186458ad2b6e951cf54ea8425b6b174f688b9239c83b0ce4859bdd86d8ff0a8ad6e07fcabfe1944037df36a4e0e303b2ec79ee72730a12a20ab03b389344d1ffabd8f38b013c81ab64090c8c83102a57000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b194e29cc808ccb559d67b80fbaa7a3f72d3f515200a032dd79f785d60564328249a78488dfc606b9ca0042e0136d349fd550d74bbac00843dfa6675ed03f9599421d8a4c5a2d0c7e468487821ebcd9e72b9ee2084ba8cbda7877217961f0f03509d7e16f7d1b8dbef96f5fb3b6e732e557b6c3151da252c171c3a65122457a02127f9c65893ee8e182937711dd9deae27cac6a1a400d09c949ab971aea4379c7022b25bb710bbdd40e9f6c919fd9fec21b660f85a5b2b71100ae2e0e2df71097a00a0856af97c2565c8ade0f2eb9dcad6e565412de7b6b573b9f6cb36f2d2545dc023ff343b751c540e1c9fb2c7d33d5d1d65f3ec3d6e9360bda3430edcb7f5421f2022aa72f55f5f27e99a0255706d2781bd6db5e1df969e2bb30af8d85043d1d55d502063e997293a8a0efa1c876003b822d7668a3c312e4a03c6a3a9b19ecae9b54d5030ce4e9a6f2a8a8a50464066715c0ea6f6ad6acf8059eca6f90aa492a3711f2cd02237cb13f5f117474f7f7c05f50a60f31447c79a68182c6a01188fae2712cbc8f020320ec7827b1b7f1e15956f48bef336d29265471af9575caaeb7da21a7ee3a7047ccb6164339e22490461a9b344aaae75b0bdbbfae171d1144812881da3a9cdd8497a4f781c32a6cd0c16f530997b596ae6b8046326d7ba8a9c401d08fe4ccd537c6522727891041de815dc2617caa01ba2a525c0f0ab29f5fde7caa64d4103156d5f141c95bb8634c8a3e2f126550204afe56cb6652adc9dc5711c33f7100f847af6ad294f483aa5bfb5bf417dc065baed3ab08cd3c20d26890be1dce1ed03456fb9d06ee19050ae7ed6222380e98178982ed686024032c3340a18f8f67ab7fdad0abc4fb9a0a502294904f10681349570823a3b8d1ebf4b91364ae7ae44995fa984a1cef33298b27a7d5ba576b24a946e9c3d3189da8e0bfe5ffe04bb8e74612719c0968dba6dc25206480ecde18b4d89b4fdb87c73ef9cbec35826b9f53e1e9516717f3c67478273feeed06a12aa6454897983b55e62e194c5818ba66c8c19d986f5ff4e62b97f41ba9269807abe781b80f3870098764f989c75b2eca8fd3a94c0c25ab2dfdb8fbc9794e187ff7ba95d3dc433d3a838855b3f2e099f2b41444545c3d35d39bc07e89a21be7fbe18723b78691ebd420d05bd6b7abce3679c5bf232b08e4a44c20cab11c6d5c38df34ccbe92db45adfe37718ac30ac8cf9a788a412eb72644b9e58084db4ce0aa41b342b93f4443149209b0eabd6bc80d995c073252df06d002181c4f3d73649910e55c1de2a058d180fcab3884e32cf0f923dcab2f20f8fa2aa955ae0d5d7772c4af41ec4e971cd7fcfd60cd99abe2420e860d6c18a08f543ccd277ca9c910293dd60e756fd06a71fa295c6bdac7e6413b71050f2545e8b2a4f7fd58a213e16d14cd91580296beccf4437273fb0b248dea987c33cb9403a0f53cb8643efaab48e3ba289a52036a3119584992c54d827b06bdf255007d1063b16de0a5df6f32ddd79382b8cab49a5b488577ead31b7bd53a5cf5f61a842747ebea281192f0ed07889ca1e3efa87cbf44551a785513281f13bf8413d92f951eb6956883e1c64e00f5f1ffc6c6c9004de587dc628155f89db35af6349ddd4416eb124466ef6bf8e9db8b5044ce9616b07ccc2f3d9973af94a172c2511ba65ced2cf01c3ad0dd5329b1f58a2d7c3aa0a2f0bb109f70cd2197e634a7eaf3d4c3e4fb055f5637de898c6ccc10e7c363ca01d2927f08a025d214c4bb7dcb8903115727a035ac6d1731473bb8f3993cac7e80b2b47c869dadd22d66601d1c8fefa957ec68ae48d8ab88eb9ae859e68c9d3af9eb8c7f0e25c43ebdd02e21760f09c06332c1d5fe6303470d1a8b8c3ae42c47a0e6a266b29d66957b9a7adf2439bed96f222533732083a867f943a6a858e4aff052f278ba4b9d14fb35427c4d38a54aeea979621cde044ad33a3cfbd54a2433a768b1c9ad201b858f8130c51797cd31b3915abc381c7cf172bc3f5360c7338a18aaa8c32b5d5979f8ed2a730b453a63278db415895dca286eb5024f52462ccf4e015796bae15c3210ef6a8549b5c2fce1808f05d4436a15e65b1fa74c855dc3178735e793670cada56379e7005ad603b16b3035130ec89e1f1ef58ba8dad23dfa9145712e0466cab6d4995cce05186fb75f53aadf1aedb1d916c6a6fa0b0e3ce7d55b288ca08ddc5290e165dd413f2c63a8fa645c0f64a95ea1b4fc9d2ae297f6491926488c6f88d05db1c2d761511fdeeb75a3be9cb976492f87b99bee29751d7aa316901edb597c5133c3aeb51e46f0b67d546660d8132349951e4931c2d58db635aea5619f320c5532dfb3a905d5eab41135693b9b8984c91da671e44948b126291c4ec2a01b76035f5b40ec64ebf5d13b0b8518b4e130d1679101", "00", 0, 684908530, 0, "1ce8f79fa501019854730f0d329ca1178c33bcc6270c451b6fa14d429ec973a1"], + ["a5da193f031115618f6fa2ccfaf87a51c9084bcb013a738bf9d041a8c95605c5d26b8d45810000000005536a6a6352930941dff1b62e780b96c53c3bd2561b12f5306ee4ff327a92aae3a6ad159d284a3d42220100000005ac516353ac92fc169e24f4e6527246a832e08af878cb8227289814b57955ed2d7143ee83a62b7a3a7d0200000000ffffffff039c6dc00200000000055365656551fbad4802000000000153f091c7050000000008ac52530063516351387bb76700", "0053", 1, -457316893, 1537743641, "d6ff6222776ddd7f64f46a0cc43f34e1492dbaa9e564e8f3f747a58eb49a6da0"], + ["940e020204e3e13366fdd525a1a836d15dd53e2357eed410d45f86daa1ad11d6fa5c4f6db90000000005635263536572a039ab10a12395d23bcbabb6671051acce104ac2a5ab762fc9335bfe7192ed4534f8cd010000000763536aac6a005170eae85b97f4c4be7efdc8b74f38693e530d0ecf210e118a1cf41d8b5440c10d179e8be402000000036aacacffffffff36daad406787d777a37befff3ecc645bbb11da6e9e4eeb52235fe7b4cabdda3e0100000005535351655272782a7c012cf1e4010000000001acec098fe70300000000000000007e45360400000000d7e5f0ed26b756402a135f6445bc8510fe19cf817f575c74a1cdeec93755a75b0ef88cacc22a4b3036a6b7e7d12e29f3489fb3d7958713275ea781e08b78e69f0a076f08d508e79d8ec694f0b53dbc3129fe118480f0296a494e81b6cd33a657000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d87fd33159a0eed6187f939cc3f7052bac6b0fa09be42be51c11f3e633c473b97becf4d4a358f03fd1fad2120eca93ace554021f4584eb7aafb862c94445f3fb6d8388144bba14dda7007eef89a6b339a5eec107410eecf007f124970f6f44d3ae9828cc739be1899472984d5f822021019bb1e8b1ee901a6d56d48542a403b03286fb0cb844aa9e88b30c9f3db06dd4c619b8fcf7f636097070d213921bc98bb030f092ca27159c9c884a302a6d01b0d35523cab1a78729d206dc4ad8b3083ede80a03480be7c214b9a17e5a700a4c1d4f5eb72e574e736a4de66e3261222ed15d40974557510142023729e6bcf52a2d654b325cd4053ce78e1e5e8ba2607966f765021ac7d1f72363b98807cdef2ecc094bfa943ec0061a1db15ea7a2d8126da19e1d0202f728736ceb42c6af173ec06992dfbcf43ddbdba1c7368ad62de102afc35cca0307e143686afe413e8a4a943544207dfec7bb86e6ec02f000196dfc270ce20fe1031e41b570aea3140fbc553c58fdc49f17ad0fe764bd82f2d719a995243855e31402204a62e924adc8f835b8a4d833d6ddc7cc89142bc4e6d63871b2f38f5f0f7e1b2d877abc1c468f4199f64c964046f679595727a7e991947c5259d47fe714ed6d4e2327ac7a485f56a460b8d78af776020f9a41a8a7802ecee1ac4e4386de3b60c8fdd06700c8b973fa5385b8403f845712f16ae5d12a5f681da1cfc272bb0e1d25e79f21111ddde5bfe47670eb4ce081b14a88e579a810c3374bf97099ecf1fbf81d38a64ebe6629178800d32a004762316eda403d776bc49abaf6e3ba11f5ba916b44608c1f0ba9f1eab3e52bfe1b3a71e3972aa07a2677e62722d07905ca6de849655a5129fd364bede1b7fc649df064d8dc2fa5ed7878a06ae8049df33289514ce6a425cdc923448ea3f09b686932822106849bcda61a2436948f0b451a5176f6060314e7f6e3623f4da9b923adbdb110d9e0781c5cf0b179776c9a48825f4093771ef1b880c62cc00f23f9ddba37fa53c0f5cdf6b42523414c2006a5e887e5766d7bf0a2246d6dc06ee37f54d446acb873488ccc5c7c6fa817658dcd2438a5162ce3473b644fc0a245531307e6306ace128a90b0694f4988214e24be2515d6ef2b0f29d19b287176bb53a94bea9e0e30d687e0844d0b5df6260cf831dcf8d843a85a9b875de89d50ab45e68e2e370d0dd3a832e8782c10748d12557ae4001d87c534743fd8c4d4dade9e04e9a5a709b7ad81b2fd472285a0dccfce4bf28cec32dc088aff3c96d6a3b6ae7d134a95a71461aa6602626110eda7df0755d5d9c30af6288ba80926d174f696dd5bf4ae29a88464bca17e80db127f4e66deabc638e713c21acaa2da3edc884933a819806bb8b6b0e529a2b84ec22d39e9b8fb92e0396eb3fdd492d03dfc6f4d4769f3ebb76fa580561d188a626ad34aac613517d16ec505385fbfc1ffa44e5070c9dff77105468a81bd3586a2eb3c8bc251f244f49976ed7ef01ea2e08db753800fcae1203025668ea2a18ed31733359da0409584944751948e35cb6e16ac104818e9141f513f7c7cab83d2f925b529d1bfd176b0083defd04511a9fc1774fbfc4bfdf1c2224c3b8e1ae1f6dcc37cce7b899952318fd2b271afc65f90f2e7b8743fed051872dbdd6784f38c7249819a5cb91871e0822cafb20a5c429e4089b123b23392bbfbdf2ec309419ad8131a4974b9573f50b09c24e5c1b1434a38c86b4e6efdb71884de53a69678078dac964bd94d1e781a129a4a4ac37b74c032050700a34e6458d78f2ce8b941effc03a6d34e28ea4a05a51f913ee5b686637dd236a807d7bf0b98765c9b711d2604333564637ad13d1f1cf770b27e18b333ebc91f1927a68412dc42479e665cd084986d556e8c60b6a1b7839a435dfe228c30757cfc8495de15086c8567f7e0ea4fac2d0a9246236acfdb991048bff0f82b77d64ea7e288d533a64c2e0e65270e4b333f60c10a2ddaea2528663d7fd603cbfc53176eefaa3ae5d0af5599941e5dd0517a79434a54517ebc5f5db234e2c783992e950f81090eb164cb099674c05aea81cdb0de6a66c2c2c8c13db771a3ea56ea004b2f922650a103685a47713397c85581136a569d03483178e9d5f8a067d9849598b6059070b632d903eb5bc30dba990e602d8605d561cb8df26edcfa465f3724c54041dc4562bbcf02d8024bbf3e194ff1e88794a62f457cd502bedf7ff16132080783e328fa44c3da6e4477cabc986de88ac9038c7161bef974cae8555b5dcc269ef5665c9b66d30795000000000000000000000000008569c1a213bc410d98a9e32024e38e30b778a649770a4773240baa96d5709c8532105e215567e6f9bc3ee53a8a0986b13731dd6b2052715d005f55b8c7cdcd460e002da843d435cee4b45544a69f3783e7fb3d760caca0cb102870f29cde5a0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a74d56b508e168cefcb78a83c8530389c239cefe1b8646a1e5682e7187546f798bb36e99d3021d3dc9ffa151aee0f065f2096e4cb08482ba3781526bbd3b07ba1aff20cacac2d46f6828a409be01819657e499bd5c5e7b90901b7ee7c90ae92aff6ff610cea6b3f41638a5fd200c3fe6a1e78a80aa237170b81fe2122fc910d10224006d8b7f7533225b8d5417597280ae8a5cb580f75fc8a5a57c964c969d1edc030a9c2cae9073f15f93101029fdf60d066d04de3a412e0614e17aefa9b3655ba00b001765ac06ec1dc51a3bb1d9abbdf5016f010a1ad1d9372c62d7cbdf5b38c0e0b420bbbcc8f779d83c8ea40ac6ddddee9db8e867c40bfa95d5a79df1344b896e0203406e80a1bd363be1a4e994898391b8bf50f11b470bc2d34b0468120593d8b60229fa482f88ccf4a24e36a58f51dc5f1a973dc965bc94dc0353a2cb071ca91623021916665c5ae1b38abe5b1543ecdb3b0e7336eb0122a8b4b18185b4ad0e3a92c1032c45972d595c134fdbf328cb7adb18355a2b4d9511d3dab8d3bc390d26bb4457022e64875d93a8bef9627c4899246214b47c6a389a51d38f5ef51f8716b97d76e4f9a3cc1f33f910318070bc9ca9230e7acb6c5ef841afd88a5183019ebe5767fee15338cb59acbf8d18766c5d2973dabf1f9076b9a856abc67405f90bb88cf18a17ae3d83d26635303ee39606cf531d65eb07d5361f27f3d7c92f0c4f1230f34f7eb4b7b4a52b0b21b3ce63083df1fad9344095b7b1d0cc2ff7681be9c40135eaed51d424d915a6cadc26cdf602dd16cda2045f6af439cefd7a9085ba60a6cab3e0d7df01b7e490200a9a39b47ce56e996594e00ad874236324671c4b8b6a7ae27b255ec7dc09e37d6bfbf2abfc0d3255bccebdfaa0205118a9a6c25c64e21dd89421d5c29171a3a38f833699b0b63567a57c85a4420443611c59a7b6fbe5f82485930cd96ee8910ff226fea22cda583f44e1c00345815ea5e76298f0c7b596234ee15581ecc8a1e76285d82807abab89be805db63dc838ef070df1545d2b0ad431d0b849c71a826e8bc2b262e8dd25b1fdc7504a4b50336d34ccc4684f59e2f440f86c80dd7adaec5d95166893f8b8abd3bf06f4796a8945684033388db661e6d10384d4a2f9503529bdf59cef04b628ddcee28b7e928356e2327d5661d5023392e915ae3b18324591bbc208322c0362a9a58af52348276fdc5373a77a8b62bf9d4e1d01ba6a5089bd01c21eb703433bd944a2fc8fe39a5258ad1d2222fc52af17e3e9ab44f1bf0beded402541fd581ad4070ee9f7098d2c750eee5cb7beaec21c2ebea49c1ff16e108eb158dd72cf2f51a57c763b90f8c6c9b225d47b3656af71d6d8a2c064b0c63fc4c099a7f43a3404fdc1342e9879ef4c5c67f3af3d756f362a9a82873da8c22ec4d12a97d77e767bb22c9d59539f5cabcbfacb0f986136d77997d6d9ce8bf1bcbaf7b118b41abbf9ce0306a5a60b4fcf14b45e9de463a7fbca76ccd75c722371642c6b8dd9df1b31930b2b1a83c642a85a9553c8594e615bdf755ef4788cdfa5524ce219003a0a881b64e52b38f5c9a5312d29735062432d72670d6538649244b86fa33edb4ecaccefb129371c781f020f72caf14611ced53e96509aad8de4c2f2899dc2a14940da813f25415a34c4680d05c943877cbcec008e4a051fb99a287e4e935d3c3a456ede172497ae73df66910936399ab0bb1c45ff37b47b0e180eb53755babbe1f6b053e95b55e7c0f987d2ae7a924a8a5827bd3f3220ece463345c9b29d8281eba2fd06ba7bff11ad0b38a072b2d6b862a11f26c19f68f6741b5942ed1ec769a72ddf3eeb8fe48ec57b1ebfe167b9561a1b66843eb8f41dd87fdf9571397726c7e6c61591e5246d4b90644c099ebf4f9a509f255b573c7223e3e4cef99c16b7d4d6f34753886af2549b19976b0ceebaf3034ec9ff61aa1c6a30184432ad1d65961841934f10a52026887bc65b31f3cda6917838d61bee77dfdcf03ddb6e741f94e13e412ba97419fd7f565efaf681d5040525fa2e698a6a666b605d868c13fe674939d874340baa03c017f4486b349a7af5a16bd7612f958f15ea3686d3bdaba1e61d39277b4bdfe9512b9d15e2db36e263ff18362a6f5292f9f592740d3b64feb35c8ce3c27164514bfa235f808dd7f59605671ee85553acb54eea290891884c9ab53dc313ef7654b54f9c1a2bcf6d7fd8be5e530234cb591e32098a4cdcab9263308d3fd7847825b709349e9a080945fc0e13faef356d09934ca659523664a455cd000000000000000000f25a80300000000b3fedfea286389db922979700ad24edfb7b9612bc06facf199bc25ab330f2e8ac23f247e182b8762e33b11b204724c1802ab7dbada7765b5c32e295709a58f8ab73ca0af9cdef5f083c33b2a00eacf92afee351b9bcae800e7d7637cbab7193200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d8b21b69f3a61dd8f0654ab29564056a11940feb3351bb9c2bc384e22caa0d9f7a95a7647fefadce3a1cf31e8ff68dfb46bf1b4a2bea3d3e3aefa10289ed3571f18984fff30b1ccf35d6ab8402206a5a647fb4c68866d85c32602e442c7019ad35309b138a847bc794cd758497ed0cd4405bbc7ec916eedbd57c70c5a30bfc000300aa55e6127764c562524b81bc99dbf7922df082ae004f114b3df37ea16046fc031dc98766cf29aff8fa4ffe9737cd104dbe2ed212e7a5105e8f3f18584cbff2a20b01276f8b57a8ba9fd5d8a883ec588e8a05bf5c9c07b74eafeca93ad69d198c508ce40884214a2014934d5a3367026a560e982865fd966836d90fff725e11b1f80215466946d2204f3c4a76e5178e5269e14fb2ea11ed1bb1184f35e623bbcfe91903009093e9ea5673ca444beffd68dca8a1d5270852734d770dc77a41e35ccaf23c021e64e0aeedc2eaeee798e34b92346a627904bd2dfa526dffb53f77309f3da6d103014a67f974a694c0486bd2119df6312b93d25e8ff5fabfc1d3dcffcfa7ebba3302224ab2fc18f968d522e05a1969699ccec618e78e9907a5cf18f1fdea706be2f70c315c66e2484b1edc70960366cafb3390e750976186ccfc79d3493b57364cc3ae0a4a09d10c97c3dd6d1af342473ef011904aee467b65b61f72f2bb3f34d99db2d677c2764bf063d0ba3dd00c6b1cc0b521a14f28ccda6cd22d4bd146f95d61cb997042d25d19c012c4bb5235e1bfd249099e4d3a6fcdd6ebc32db8acf44099fd28cc1560f165e2d952a01e2f4c12e5689ea70276d9315ec683f72f5faaae8c3cee6a18d674f63600d810d7ab52ea7f578485b14e88c5666bc5e4ccb8cd6aa34c21787f4703e7e485698cd39e6ab07d3e2fe926d40bab502217eec1991580dd58914c205f667560a5eda86724ed87a53e716a1d4a9e56bcce8019f405992e0bd7033bde5d4851726f77be9456f76b74720e7c59c958a4228bd577b5ccfdeaa29103a9074e690b70be1eb7350b1f97089300924370f5f18eef4b58552f49d49a40695c106cb30803aa32b66207a745c388a8f2963f12323b00d5a27dc3cbff9c9a9fae49aafb9479b87d845a889705b8944d28aca4f8550ecb5efabb6b08771566bcf73be4089b469e9aea15c88351be013605ff650d4b0caf100ed47e7f205fb84b82baed577c429453eb6a2fe1d9562bf4bb8f85dc670e9baa9105681ca38ca61d8d84b25f9b28bb4406947b0c55b93a6bcdbd857eeef774f1faa8f6a21dbaa396c3b3f654c4995a6ce7875cac62e6ab898470a9434b7396b2865c06a8ffb303e86a18dddc98dffa5e459221d9fb49ade4be4507c5ecd3df0f9b523380ea9c4f06337fa56b120d192942ad6dfa1cd587b70919b9a114963a82e9b2a0db86674ca10d904edfb7735d16da72f49db1b3f7c1f0bf2d516379193c54024a7255c96605e2bde9c9c1ec93fe72408d264e82e73a143632d8337966e519014b6fcaf4f9402d1d8b0292968bcb52a2f63dab964f2b0ecf7bfdd8c04fb429ca3b31abdbefd2e4998fc0e62be117b3803e393ecc8a0b9192a0739cda7331a4c2550abb093f2a66f38cc89f4f28bb7c48992ed7d343517abcf53d2d825fecfd80ccc44e70b2fbcfa092ccf8bf13a4febd41d4483783ff6e44d42a2670eb777ab4f8026ef02c494d3f5f46b181659104b027426275638d3d51aa90704008eb649035dbc654d5421288e790b06fc9c3e62c14112ad5d1f506f8fe7fc7b80e9f132812eeb66480a0417483012a82a9eebb8f221183208bbd3a0b3292816deff3b9a5ec743a575d7a4e2942b0bcddc2dcd842ccc9b8d056f347d9f984d87a3a5c100b1ce920ad0759c3ae18979c669464dcc730455c2171827519124e59fdfcd194ba0b98461d62e875a5927157689438191b8e06b8cdff48c87c128d2315183c20ace5023853bc22f0dce096ff08ce88edd8d78f4015c8683f671124b7250c29559b8f7640d768df676bea5c36e0ea3335faef1ec31389cd92b86c76b2b11f8e04be8eb8094b493460765359cd4ae406790d9a683255fc17d6d0bcb1567a77cc720a89ed4673b3fe062f753cd199e0e9a151b89a02e4efe488df6115304fb86f4b98f96edbe4fa9be99eb210145858a3de0f6b098cc3b4e83d4d32f29c0d630146718955c09f0606044fd4af63cf1e710a2d5bcc38423b1ee3277105b3f5a1b4e6973c6c54e2cbe57b06572ce9cc16050ccd61d4c7a6dd17944870a790955699fa7dff1a9dab0f2666d4355e36418811077ed58b277df331197985ada234496e7718407f6182481b04514b96af42032bd616ec771622fd9aa736151aadbf31a60894bb6360ad032d068507d5c3f89294d5a971a55e32e1a849de48f30d6976c5da8878c0340cd64a381e75c654da92d8ada1329769c6860d", "52525363005200", 3, 1997281448, 1537743641, "edbea03fc1e415baafe8cd3a8a7064066e1ae1f873100b3bed5bf0574fbd9172"], + ["030000807082c40303b1289c44d309d8a31db47e3491e5ffdb62817180d684d7a94e213fe2b6d0c437000000000851ac65ac00ac5300ffffffff5ff6a9c53f57ffcfe2a08eba7ac1c687d2189ea728fd95bbd333789bb755a06c02000000046353acac7fd25c34cd127d41936d8bc146d495ee7a7d3e0f63ada3373539f25b860fe65575c19a4d020000000800acac6aac525351ffffffff03511ecb050000000000cc52260100000000004c0d7002000000000853636a6363516a00000000007953db28010000000000000000f6ad7500000000008129fd51040ae7fb6a8e3ce32cdc3a8c7ac0c17443b7ca434397e6995c127fc961390a08214709cb48ac838d0b2c9688e9db3830c2e287f1639a02fa045321d461857d6e17770f88953ee3daa946e11d5d609a14338ac63029d229d40492a7ae000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d736d4926c1d552f3a110c70ba19ee5683004d1cafd3db61046dbdc975dba7aafba7eeb5553a2e54757c8051394b51374fa09fdee4d8b7a56f4d9f922385b18b50e411cea57ef85273c93eda71930ef004a330d9cc9df5e75764d32ebbad9514b8dab0a9738078fb575154e80e74cc151c75f98d97ee5bfa32b74fe2ff28b2b02300085c4e5187e1dbb38ebe0c17dd97978b9d67cea57696b3c7e5fe26691dfee020907acbf609827fc732ab62c8c4333e5f07c559caffab0ead3ea99c8fc5919240a082c19dcb81dd215c453a28f74ea77adca2dc203887c1af6f63724979f09bef35a858da4eb026e639d1021aaec43ccd5c90a7e36e2e125dfca88c1c1c6ee653102256898d00ff2f9978f81a37bab54587791ea8c739f5355f0cf3e42b75cd8a01c02018f0eec96b7909f60fcab40e6fbae71a958746f00ae74c08519d8aac8482f87022a5fa836991084fa451284e50120c0e7c0353770d786961c3083e1ffe63b5ab50228e90834d9c4827f29564a33fe6a20a4e2daab6f54fa9cbf84763395342c4070022a7b37ca6d79cc3165e66eb77438cf8ded51024b1944f2f799df5888403c9397caaa6f4db823b9e29809cce99b6c94b41a3a63f9e2b0de93bfe8b6dced556c078ac1f8490c41dfdccec0b5aa2687f3fedc1161842fc9394c3e5f1887f796228d5e2efdd4f8c7ec4118f23184ccc173214cc4baa18661c8b8b59e0ef0c1020840a696b1a14b601d9c0401ad17aa6095b2855b9686b961659e6cdaa0235025f324369c0cfb40d58c5d6913e3456557060fbffb5afa39689aa7965eb528ba794b5840aacc3287de34d0c01ed05bf8dd5942fb11bf9e6b9c931c5836a586115a5bfb9c4798ef645bda951b02f5e7b000115ac7dadd1c7a3fbd5cbe596485eda03b21bf384ad482642697762a5e60cd5548e2e1214d32b2e663b683a2eb651da98615e15a3342ccbd5810414796e941d41fec2ade7be7700e9401bcf4ba9efe6e91f5c48774193e2b3ae0375b5e62729ab26ab1fa2febccaeb101b0a722b334a2c54f01df7cca0262f6a88e772262a7f443ac60f416495665db7de1095a550ae7c1119a1764cea373b80af830bc761979bd316dc4b0c638e9348e31acc582ae2478775b25a2d1d7c395cfdcaa5dc2d0d4d27aee8262501889b168681b80bc39d442b52f335b1355e1fcf9a2f6e7e6fd3ce738fcbf6263f2505ead17261ee17d12d135bdcad9be1716955316c098377c2b1264acf510cd7cd5b0efcb2db40685491d65f6cd008f609740806dee733b8d4efe6a8674bc06716d1b907bffb1d90cd3582dc6e2e1c0ce7a8915593a382aa0669f9702250158aad77a43b160eadae4b86d218714a3033bcb2e535311bcd29b99546e871a2d64381d13c98a55099e5b8f22e8614c74944a0dbe46a9693b65779c7ed608836a63de3a503e60904a851851284fd262b751ea22f38355c3a2060de608b14c9742986f26d7c159a4fe0d44e3b8f11c96fa2375bd6ed52d9d3a1a738bea7dd36dca90c37272733b9144d9e1e041cc5e1d45dbb7a4240c0b4d76778076797fa861cb71f18060144553da2d0dbf3a0017ded4115ddf324876d18a31ec7fdaec805d11df5d5e523cfc4f3401c12e8cdd517f128b83cba7d79edc7533cb0572710cd450db155a950bfc2c08189f3efdaeac32e1737e10acefbe82266507f436c6c8bc89cb79095599e0987e744935844fb858efcb2813f5b5f3b5be03d75a94aae7791ca95cd51d4bad40ec4ada4e212c76e8e9a6f4dfbf63b2a6d715ac8cc3420af06b6a3efa85f0cb66e3c2ea82ca49ffc42ae1b9317f8d16726c5f125a3fcf01b8e7b6059fab4c16b7d08cbd4891f0eb6d6d1f386cec73a801be41de5715b1aadb582602e1a3d7c2d2ed61dd8337bd6a7947d84b756d4a1f342f16d4da7e06d549fc04417d4fc6a507895075e4bd32e76476a73691e8bf7717a93b0a7335c67461214e3e7cd2cc2fe7d880dfba35c586549568eaf08d584a368644aab8c56904d26d663731d88a29ea77e067387bb2a9e49632b74d29f770ab4a29b71e11e11cc87e8ebca4589893551e06e5a1d5e65df4f6a899536957afae85d853f0ffca4cf9937c156cd357f14c30be7e67938d985c1612212549861e4bb66819e94177874ea4ffa6387f2ef8ffaa3ad43cd6645f625c4dd99d4b99821fd5725de0aeac499682356a13040be2199e8f40923357363d8ad321e9a7ca366304b95e36f053162272fdbea787658afa6c0532cb71fbb7134080496c10aeae4aeaa440c32e6c90662fc76f367e1657eb15e0ed59efa2948fc03ba5dc909e1de132a1f92f013a8624f93ea161b8b2336ff891209d466e6208331dfff44c29f93270dbcfde29da5f3bf2e6c92155961ad32a7e3688a3449944da6021604c0d1fc5c13813a563903d0f", "6a51656a00ac", 2, -407502766, 0, "3d25e7a73dadb321b621aac4d41ea3a8cf7a4f52c74227a62c5b9336420526be"], + ["030000807082c40303f1fd691987043ac1067f92c7b029519aad8f689cf8ac03e2ff38026cd824dbd7000000000553000052acffffffffae1ea23993888567f03b653185919a1efced3d4bea047f185fed38dc7bf2747801000000056a53acac632df04c43ca0f96f96f692632cfb9c00934557b9b5734c00344b849d0b32b3b74d87125f4020000000300516affffffff0158257003000000000851636551ac6552519f0b7c0b000000000100000000000000009837410500000000e66ebb1d01c96770feecb1aa8382dadfd4dfc725c52fcedabfd74acd8f48a33105e6040e64ffc017ca2b192e767b965c0bf0287179fc6a8bd1ba6ca266a698272aff7ad092cb0373d604c00abc356157cfe5957090c26b4801a7a9ac7669616d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fba79d09131c6cf6e4fc1b4b8cd68b6cd8993f9ede9ea37e94533c5d1e283e61a44d57e59d0f8242eb294c39a7a1a384163b51464fbf0f54a3b485d238959ffafedba2960cf22fe3f8e47783b99658e0b8cd00b05c3d5005e34f2455d8777d9178b329d6a6b31f75a593f99e426b62e29edf95646f158cb5f20ccf3d1fca6b210200257f31face31de5124d1d964d08bbfdefc752e1ce6e09999759eb1e1c425bc031ba0297c66ae298b4647c6504c1b758e29478cc5a9b0512f0d39dfa5fd58880c0a038f38243c5828a73e77f9ba3f3f20b3c226b7bf986bf992ee3651edef449c6a2e1529fecb1ae95b2050ebf8a60448a299b0909d584156c9b5e0416ad1f2070b0301c420cc5468ad86d721b652f488cbecf713d190b50458d44ff04ee4729f08950321a6bf266b576a082a3bcb5a9d428ef79618bf3ed37945c35b8cf0633451edef0325cfbe2063bd8081d3f9af04c4a43471239eaa7dfaac58aecf2b987560fc9acc032edfa3995d3a7786bdcd00cb65b7f327c94b34ae996e9bf7b597e2585027ba7e02211572f67760d3b3ffff9cb1e803b93f5ec050d4dea2f8849300dd289ef920cebcde5aa4daa84de13f262572916dfeae7e1c5140c8d532b0348c580185462173d5c6710afc6795faada88ce6e730aa084b38d0d35aec5ee5edf35e5553ca861d88d0531b6f69b9314a9792f7869022adf502c6673f2f7c575baf92f858fc3efee118ff23f49b7c47f6cd44bf872012ed3a4b8b750fa09cfac7f48233e78540a9ea929b4f036a353592a7e71947fc9b36d870006da9f395547d0d04f334b84a7c1fd7131928ec4a9a297c182f7f67a44cf9f7e1a089f7a475f663b06ed49b600920ee925cd101dcc6aaa8d28388bf461d98ebda245884e5a563fd440ad88b13fc4e62a51a24776193e2b944a9ec4d1ff88581579726554ff8e9b49520ceafe3e6726d7bbea3298fe1b93ba92022a82f7fad3dc4ae2795a920a6d676216a91a842a51fc16a5d1ae92e0d289e6c0d4db8974f8338b2982214926ae1820b72dbbcd184bf9616e02a33079162cd3acfb80e19b9e5464a0c47573480e2b2356ef829a81a38016197a118aa3615faf8d4725ed9e7039896d47a25fd9072e28a40a3c79698ce7aba7c2c8b48e8c803cfe70f307b190656039661ff4800cb2d6cd74243c04b42e2d8a94f305873bae5bb2fa351a9ed98577bdc249d9441ede0222b2ca34f2139fabecc3f84ccdbfe4c5cfdff9ea09b6ad1b732836a300ee2fb32c3b74357e321b8d166dd5d75d2d5893c0f07b19840a2580e322c3600f78f6303e31877958f2fc8767759ee80221ca5ee28859441efff056de197a36b3a1b95fe97167554f704e47d652e3d235a1c6038f2aff73f4f09de7352a6c990ee9e48c07f8386e538d5bb53a2e36f650c45e67da68a47d140d25d4ace10b0659e2b58a87bb9f22ca157f2b0e04a2c8d9db1ab3dd063228eaab5a17fbd6aeaec4b7a309754bb3e6d1a6c1029e6707344fc43c0f7c6ed1f39986fdf2c738267aa8edd16b216e62e8160bb9047efc524e856d63fd9d0acef2ec7d3ac3456c7a285add9a410f7fe7f132fb1d1bf2c34175fab375c16643af1c02e8e499f149456721c15167803b06c8d134c0784ee798ebff83dac102dfa0786f4be8dc3ae439f6d51bb744eba447298266ccfcbc9ba5c97184fb8ea6820f48ff91d0c59124155f8e1c01f2b7c8412cb8c602a19fa135e61741e0a671ef76977a8a03e3d7631977e566a7468acefda7f498de5a12fa39177d284fd383d4d656245729131e3cfd8ee44d1f93cd2bbc3f6fe4ec849952acad8028eb19a6bdbbf31e53d0c1ae66a40f69d6c94ba964a78e7f4c5cd2ed04fb37b33df923d6837d55ef741091034c7a1680adf37658382d5658df531222c92093a078ab2f1d5d07f71668140773a98ffdda40d08d08099886fa3ce93b35523894fad6cbcbc4ab2120154410b91cbb00487e8d8b95017a07c078614bae9f235897ed9d22851d301c5d6bb4d6b50f6fce9e6c752ca4ea72e36e06f1b004828bf7c42831a1c963f4cd4caca8b08200e609be1c58db846b85b61d6abf4746bde8ba040b490ba4f1176ce7189cb5133a33cca4ccec80a88ec5b7795be0f12bed344f1949bfbd299ac580b4aa150de155d081402be2c8b3ff67b2a1c804f44c7e0fecdeb137a2a39007d2b0001e10c64764afc2dabb3e47db6afdb4c7415bc8c73a447c5eae0dfc013bfb7d9f584bbd17e8fc4aa73f8b5a07b1d606540ec487d581e41d02ff6e71166552ea010fe7f3c53ee23aeb5d20957829497dca209153c5827c53f664117dbcccf6b74cc5225aacc241b72677e0681eed7ae643103129dbf1e93e913e861d7ae43c349bf199152bef0f0b78e52adf23c130c53d3003051aa32c1d0a9d76ba54f282199dd07", "ac636365ac636352", 2, -1366046387, 0, "de558e02c9d5aa15aca7ef033db48d75ed363cfbcf140bf079be804f82ddeb81"], + ["e62b8e7c0404dc6ccd6e472322b3e5456ce95cc0d5036f64828ec12b0418d7596e3201368e02000000046a6a52acffffffff131ea6f6a2f0b70ce2e7385d80bdfeb1d66b0d9641ace852c898be4fee0023980200000003516551ffffffffb55e99aa607f752359d99bfad854214896ce82290f49e67c143b045bcf3aa66f00000000056a525251535a8782e059757f754fdbd858600a0c39992736742f51afb59dcf350dd0866ba72e65d2630100000007526563536551acb5dd8b100135acb205000000000851635365526a00ac0000000003000000000000000076b9eb0000000000e5351f6136f1d26d91b8c875e1697716770769082ac6d4ad941c06475777878993082ac91dedbd1089a60ef711334e39f28b6b77715becc7e111f40f056ebbd5d48c2c8502edd6784c1ddfa1e455752a0bb3f7545dd7b944932e4f46ea3c20b10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000032e34af2161d8f134b51ee041ff1c3feae2fa15d188ed45b6443695c85bcd80d0aa2698fd2695daf9182fbd99ac2afdf26347ee8ad92bef6ce136cb4252286aa543efddab2c5a1988ed566fd5b22d79a80f4264e9f0fdc9951f14ac7e63cb901abe5e52cd29d88257588ce8093faba3b39235a8e098ef7865b67e0760e046a20032bfcfc762471e90f1c84d1ec8f43bd6c9c295badcf4b4abd6c2ead376cff77930200af33aaaec1f7a5e13a0427884b891b46124e3dc082afb61cddcc12b807d3c60a03d286dba1cdaac3266914f56f23a43568f33cf2833c9e0a9cdc3153fec679f9b2da37863cd9c2db8cb6c83c6b8d76c1c259a99a7b5a3b2662462c50ad85291d020957c95f41f7862627650f5c34d51e142062a9915f045489a1306b2b31567a330311e534c56cb0454ba81c3181ed242ef188d648e01f829af4517d02900afa1409021d5936ad9701974c6f212520eb1c256bfb245644f46a56a8f2fcce3c2e86cef703064dd4720268e2d12fa6d0a20ff23d0360bc0c9415b96ac3de92eb2d3cef849c021596ba19c5b683bb49f98ce0fe0ee56ee79eca5824f1f8b0265c2a730865abd9a310e9958a2d8e1bd3189ce0cdf655f6c2ee6d50c6489143c92e866869b850d9970ba6f2c9cda5d44d9b4a5361d88be2401fa1d6b8822960af7bdf0dba67ea198bc6e30641605bf654ebcdbd2a9daf6d1d66034fd78b2e596dff55ebca318e26b56e37ab05c2d6e8d76ae75c7efe1805bc9be3cd8adef6faa2cf98b39225710cb2b37bbc5c0e2f7ae36091ab4fee06231388f4ee7840f2dfe79aa6737d2764953acb098f499ee51ac26fae9f2628d20b0228a65ca40655b2191854333922846c71e206a58df93935e430013f96fde8747506a1781fe3bb1833f214943ac7b3c2ff87294e20d5665ed01844446c62ddd0457e3c701898a3652cf06b1a210f613b69b7cdff3e12cc476ee4906282597eb767dcd6169dba312ffe351953dcd3dc4acc29ef4a8bc4bb275c430772d7513b8ab7762d1d250043a017b2319231c85c38553fd82ade74f89fb332d3f377d10114474edbcc5fee77689bfb2dcf7d164b2022cd37a86010690c858e17e7344e189656227b01b6f00b593b248afd0edc4c55836ed59cc000172fa490c4d0ab99e823d4c48092d6cb6c08a7ee8d192b5de653a35bd48ce220a9b0fd655f148dfb0cc1c436d552ff6b3b95576536a1e4b29a8bb6fc8a0a6cbba70dba5b9783fd72e1b0c879335b8787dd1138cf257f70c196972e44f6cd5e48dddfa316d9c48dd2a039d2828579bdb23171f5fe28d5da294bc1869f38dac30cc2e2937c82a0a47686a95e58d2a50a432841feee2bad454147e378163a12a5e490ef6801286759987419c490c0a06394896c24ddbf3588a7557985946f37e48ceed7976c4d3b0d860baa20a5b40e071b174f1b25423a19025ba9631429b566810aebaafdcf3832e6c5538751c164c031efa75a1f144b59278282c674316fdaaa3a1157b120e3c52ec310ead28e6c89b4f5573b84fba6f9a15a8465df90d8af08054658d037b99fff5397f80a2c206873512c3a2913b7791b3c6a3353fd68bbbdfa56a1f11294988415e01090e4fd4e5cf0ff13f0503811fa57e283197c0166c3c28d7dc38284822837800cc353a1f858f82066c13b6cb30ddb732517e04729ea5cf3160de7f89e2dd3b7c309269d1864faef6dea213a19465962efe4d2923a5b31c112778415cd9839219db6e193807af7e0885e374f4520a728b1ba8eaaf6282ba3feb595b4a155818c8d1d1651dc374454c17e221b5684adf19b58dd31050ada81e125936d952a34c47b9595af43cf5d140403ec8d7fea86a3e4b81787ccfb5b28ee91cc5db85c62735ad26b73d46f82eaa63b74313e294bb452b22acdbc4da4cd44e58300b14af07c6aefecdc8b7e253ef18a88223b92b02a147641a1371091a021b9715dd43bcfc4af132456177864ad877fa368cb4b88945afb22c6bdd38f93065d3ea7ff083e4f9d30d7b9c75d33681aee4c0f2a4dde72a5d102cf6fb3ee70726f15827a2ae5acc2eebbd85d1a56fa9171fcb8fca9b1aac7da643282868b57f323ecd990fd01cd5e4b2c9e49549a241699aa53e4b6299e1754113cf0364dc6877cf16648ef7ef952c010db0be4fe6cfc61c7639abe7c990c8cda6dd9f6ccc96e2e292185471b3894b0cd76a5472eeb5161de04791d88f50788dd40ede308f4d3d1c60bcc055393426ecdd0636e1fc5ac2216e78ce908c371bde02221b8512408e093f14abca961a1f40000000000000000520eb70200000000b0e9322ffffe4cd5bb69c06432fe84b16d6d310b714273a0589242a996d8fda771594a222cde61ebc8f8a7135d7313fdf1ac6f4b1d60214104d18430bf7c861224c2d58387da540726a3ce82aa28310feb9d260f7c9f3e72924eec66642bae56000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a187e274c65e8c71927e74f45fc163b582df56cc84faa66fc1cb162c6455e6689d16d6ddcb7c172475849d8fb9785c289cb2677718d6f07efe0af0594f18b1a0b7e142db972c1c9b87b21902ceeedc2127bbbcfd3ca9cadce074365b08eeea6c010402b98a2274386db8d5d06d62ba05921fe1770c6f448e7e8dbb4b4c66344021e208bf9dbe008878e4c561b81ec833b0c7fea8ede95a68b1d9206fea128933b021280dc32fb7a62cdd12e99612b6b38838180f3803b779c8cd602060931addbfe0a002136ab428e891d6318ba2e1fe5454096c2f2cc55072528e5421b0c5b539ade649fb5a6fa104fa5e7f91d02c0574ab32ea5b658431313ce4843b78797797cb203300bccd912c74d24201b50ba13444786eb8b481d5e963225f17dea9301424add031f6d54a62dede0f33b4794f83a8700a0f44f5072a8045a81449ef98606f19d0102255c795df750bbcb2e109701ab38acad5b6b93b8d3de56a9e609a44de93317710222d805255c0dc56c8ac573f874b2813708266d599d9f532f3f0107e00b71894f0208d3e2ef6f3cd3fda75d6ecbcfe698b7f2ba4b0bdc2cab37c89751f9a9d1bc2bcbec9e598b031701c2a4fe5b2d7730cdf035e5314e358334876448cdede4f089bf1979257ebe5a46bdd54878f2524ab4ca72080057a901ed4d726e379ef7f6071750d2eaefa8fded5dc8d208392bf0be1a9a7a98f08cdc5c3f505f8b0770cb467d13133e370c1096de923d3b52310c3fe9b29ac525a20d76040567cd0523dcbd9805f498fd292c189d2069fd3f0680fbde688b33a1adcce76e117cb87799f4add55486ec9c008577f2f20d6f481f298f92b24e352cbc1f764115817b5a11d2aa52b0c60c20fa3c86714798b8633505490bc938098391b800bc322b1ae78fba3e74ee66d4a0fa4b280b3f16084226277788f5a2db5485868cb8458450470967e606f428bd7127ec8b87752421b7578a680dd01d2e53ce3b2a7e8df8d84868d406cd006ffdeac1809c5842427317c5958220d152559da0beb5e3f71c97e448c4baaebfa2ce0f6e11a3997d8d6341c7268e97f3071b4239377fe1c4479045b59bb6076912e021e4ac14777e607b6171805800aa876118eaf7e0f6d820f0108392e0ef8eb416b80566e51e2e2cfde798aea6ddfe6b3cd57ae09bc3eb01e9b0766c37f31b1fbb86dc7d8ed47aa92c0db17b462189599e517a9d690e39567e9aa110d7bad12e02ddd410b91b475ecb4af65c32e592ff128ce52790b9f4b624f025bd36d12d7b6728f05ec94aa31a2c5d4a2739dfe5b7aa4c0ad0b416743ad2cf7682e92b7a905419007ce7038688942d8967d496e8ae641350b5f6c9c876768ff56683bb708bd0b203f5a093b70c285833d99624ae846247e223fe5b461fad77632e01a89ce7d2fb42f7e2a8f0622df5249b35762fa77c3add3cc540b1fafbfde0afcd78a0914701fb06b79b8c922fdd2c1f117c53d902cdb5de0b85c047bf28b16e9f1b244d21e09c57587e01acc2111d9d3bf16139be82f667e8f58b6ddac45e5a082d3d0588b20c9612a525a5fb68f9db9370f15562a35eea571fee1c7b453ecce4f9cb66a97c13e5f224abc10efa748362ff8f6ea0cd304bcca186b1db3ebb12ad22477522e92539bb504587f59d6103514b84302af382a71eeafef56f4a74403fb6c4f751ae6a4df7116ab59dacee9cd7e2166a51bf320a673b73b3f3cc84a3ceb5ea92a95bae974650542cd97aa7257e88166fc94ae4769ba09848cb49e7e1598e23c35c689c23d4bf9f892c07fa3053652840a7c3840c29c613b3ba5d0ae1f3168f1e0017dd2716b1fc4f81c3fe176091f1314d90a0373991da199173060bd0fde4278109fb985ffc72eb6c06be35afaf3d55a5d7e7ab4aa4f676d8ef94f9d5846a7e1092551ca3b87b437a9a17e51d206e803be59b8f551147372eda4c4e41a2e681250429ca319baadf94c02924fa42f05ea5652648de3ba4bcdca6a1f69226e49c423b3323d2ab0867d46e1531e524aefab1ffae4488e10cd2728fab6b41bc4d9a3a7f263fe98b9dc272fabeea53032ee87d6e7105e433647aaff5bd4bf2e6428ad28e4980c407fb33885c476d5f80f034ce5f38f23ab363f5b166e995378b1d4c0dc19971cbf7ea8a07efee8ecf9b5ed1106723d94d9519f743f522849e942a08ccc577e3059d911eaddef50b434d7399c6c0f894cde1c220ef8fa004df8723d0fc6b1b4e208f15603180c4f8dd13e1c58d487345502848ff29eac3bc95620b7cb80a7c242c9de0512694c3c23239410000000000000000772f44020000000043fb0bfdefaeca067e9af9a8c633bc85ac2a6ada10269eafad949ed1573af737787cd2566aea366f9431074f2c5cade89e13ce19655a8a277ce71b0280206c4b19251296a71106ba8578cb794e339c8998559881eeb3af1aa841c381062daabe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054f26d9c3110b48f52cd2a1c9dc8dfbe79578a38c13e3da40c48bfb77bfcb9e6422a89cc2dfeeda9025e410a1f9be05b5eeeaadc09d427b28942a63770e4bc5541018b0c1f46673fff9c1b28a21c21d2251072558c88e4246a94a1a90cbd5eb8736fa39dc6accf01b5daecb5357d1d396d65b8fd8e10e652e0cf020d3864d4520215a9a880870f4a9b9eaa2a904216c40fd61bcd8cbfdb8600328010981690fe250220f54fffec22f648ff5fb507881d2f019db9fd33a7fb9059b51998f5cab4cde10b07c321e1b7bc691f828339100b5d2c4fcee44f5f9adca8adcc210830c2b541764f35a0483524bd59be939c41821570c8c9a23a86b7563050f896f79383c4a0ee02264d85da7672a9822e4468bbc7ca6ec33ab9d61337a58166867531cb89f95d200321145204df87d4724677f7799efbf2adaf6b589025fc2fa7de10f08369ffeb8b02178a157ec00633bb862d88ca0b406c8e3c3f3dd62359bbd2c4396256389a3006030b931a2fcceda17cf9b872e785205c3c73b21b584df1150a492669e5f7745faf02226fda5a6c9405661a1f51af6e81ddc4461129d6094667d14c2ebb2ec9e2eeee07f192bed1a73fb915da723e2d93c1856b9d907d264a9f181b5cca22deef8c45eb8cbd5cfd3036cccc117713258635458067e0c064729cd255a28b15f50d273bba34b505dd9380f2d26e746118c54c15793d5db2232f88bf1bfa79bd09b3156b3a1e53e6ae664407bf4fc2c4178db69191d2c8644894fd03546218e78b13e155140a30266556f15894546548a57f4f6da49b6790e788653c3c650a7110ae30c47b93bb3330bcfefc7b36eec33293a8957c70bb78237082a642be85f971323017dfc529996f4915603daa0bb92df1babe4fe243299eaadbdc8ec585b034e379d57a77264a422bf3b0cd8de83eba65201c2df4179d763102168b7e44b49cd17ca14f1263feadaf6890f2c7f203faed700a5849a429067ba400d0c8b66ab6032e7597897deeb6f3d1625a0617e7db40c8535a59a8f56d7b09c6fdcbba1401c46ed3c453740edde6bf5e14565e2e770945c555302ee63094e0616f206bb6d072724d1481cdade766347bda9d5fc8bf71e69d3061ed8688c1bfee1401dc8e6270117e7df40f9be77ff20de1d72cd294e2497655db0b88c3a9d1c60222c76c61463e85a57c807ee48868c112406ac0abc0162f4934130947f2c5428e2d3004ac866e96cacf65a6792b1f4449eb2e9aa1dd18cf8935e1eb9ec92546d3130c4f29e769e3eafc81ebebd68d27642a83139ab73f3c47c5833068e03ef806bc4294ca3c0752674cc9c8bc024ddc5f75ee7526512be2b4ff85db43010e6d49a8805ce7d641bd59457f0727af237983cd15bcf5e0c5eaf202faf2352aee0ac2d4a40374e7dce693036c33d0e963a7a4e1ae5fda4f02bfa8e86629c05e82c4cd4793c57222d032b3aadc5e0de233d47acf601a45f23c7d720a4643291510006415855d8b6e39b2140987f295ebcda7952478e4a6beb1161d7047665a1f373521c2335d765d4fafb54f4e24714fa764c1bec8e94991126396ddb14364cf2ff98b2852840426d308ede9d7367869457ad2cf34d14984d8b8b6ecb9ab9c7e44a1f750b9599110e957d9c12eafd97654a8ce29f500bd44c3f99bf233a5a2efce5a3c18feda5bbb412630b72e2cfd3fa6bfd4cf5c68c9597a8c2d0a0d6755ca564b80c81589bd32d5d079fcd05ab73a6c214d95da922e6ebd8fc966f39cc2e0850db2ea419436062d47f13cbc742eac25ef14124d9b9d18ab690900e22c2d298da78470642aad9b94475ed868554f40aba11ebec0de4bc0cceda30a8853c441d98e7a89d0643783c23d2957d148b7cf012feff6fcbc1423b7829b2b28f10d87aeefd5416fca8bd96378e45a5cdf8404c155fa9d74e4177109ee2d70c2a53de81316ba5fe17bc9e0dfced2103edbefaa0bbe0e98bc64d1a4c211846cf83d2183cdcd24843b5a700c08daa2e5469462c8d85a626b68d8578c12c31fa00e43ad39f99f79fa1191b8639c066823ea476e1f8e0c7e431d7ed30de7c146fad7078c3e87f843ec2b6368df625cc8d0aa4c5a80b32aa89b2cef0b6ddda6ca7856059891df7bea7e9e681fb61a5268feafb5efbbaf43d57842cb79a41ac18e8a76ec1d39c6df11d0378ae37b439f99ae1e034f5bdc9b268fdcc5bf4a239d7d9d9c7899cf6a71abc202af34ba2d161103b38e6c6dd8cb0da96457f7012a1252c15f505010a2285c785835d8830939f3ae8fd449ed1d632864166a0c76d8ba3f2f4753ed6fb4ae3080042cdf4e656e8768a1bb99be9207fb876ec2bc749df07a0c850d15405d45ae126564e69ddbabcc722de2a19705939b7040a124b0b6bdbfe3b2c539314bc7e4a35ad7ecc53d35642da9fd92a05d754d7c935ed9281bf48907", "ac515352", 1, -365062026, 0, "c15b2aeb64e48ebe42498cf62ff9783d16ccccab42146e4e886e31371ebc5cbf"], + ["d002096b0432942d7d824c64c3ee63d550c0c398cce5efe3102cc0090ff5ad80f80590d2b401000000056a536a5351578ddf59769e626cd34412175248d22b62b1d537f3014a5aba56348dd1ec69a63024dca20100000008516365636aac6500fffffffff4e7ec7c8a3ed2e0a23f650551534f5859cd8407fd3c4e119e6c8c5e99ad904d0100000000fffffffff2b7116c643c74c396abbccc7701aabb64eb773b8ffa149860c860c5daec2b230100000000ffffffff01f224d7030000000001000d19857f020000000000000000ccfdf603000000009efb882415896d7b958749b5035dad73287608869f5bfb9f053c25248187880903ca566386b720c932d83b59c734946cb9cbc28d707553c7334e517eb89de5ae619e1fa198e277beb236296b4d19e2736d3955252415b57a04570949be5871af00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b2e7b6489d0eccb17ab67b4d26dac5a83661e2e5c009c3563a5cfb363eaf5d16114b702e6754f6b83495ab915a1b0bd27d977380e22710aba4eca799b6791028e83f929ad453ddb49b8ee78f0f4871635c5eb34190b76eddb8fc4ea8f7e6aba6ef8b9891a98134d5d4ac05af26bd5bbc5525be1e261f27bbaeb4706c66d457df021db715bb8e896c4d63274c154f97a25453601b030a2b7d70f9b761275f0ccfc8030d40d01a551aee797e27c15f6d5a26c2b01efb072d7cc9870f3b07a28a47d6be0b001dd79054301499b3fce9f2ead0543939b2060713a8cb804ee3731cb9e8eb181761dc4372cc603c99cb9ed506f4d02650d013aa90056a6dd91cbdef7bd2812d03218007ac2f9897f6462764bdddbb4a77ab3e9c87a0fed99a35ae4640a859a6ce03304cf08e0c7b8a9f03cf307037d1df2cc917746c12f4f3e14adfb0279cb3d3cf0324e7ecc3f3f80d3cb6c607290515927d329acdc9888bb09657a12dade2ea570a0223d7813a3848c32d461328d12e8c0eb79ca7d5a4197322a7b447c143d7626b7e0319c728580f1afc5912e1fc65ef97cd1bf94f516d157022743423ee1dcbf5a8ac04c363a31412179e36fad4bd16312380f18118aca76c81041efc7c2658aa50a0aa34cca1dbed7e1df1d97b4b47a6eea8bd1f81f5311ac0304d84e16c438e465f56091da6b3c4469257471b7970cc301f3d9fe3002790f00b9fcef2b3c7777c18bf58c2fb374c6b01695e9f1b2e27137a5da9101379af036e6522e246cfbe88eddce39d7ed983e617d117e9e29a60b5427896547a9c03c65d67d78241e6638c00ec371418588ac6459d64ad773e85ce09e527f57fb6a10fabca3455510282dd64bfe9fe2b168e3b8c663569301a2b17ec6591c50b2fc28c0f9ba6c3f24178ceef2fc2457476df46434b9e03b2e048c24b94898aaeca909f174dc5ce87f487e4d97b328aa785ab8c3def05b819ce18670d4be48ee544534efeefa6e7f57cdc5ff9f183633e520ec6a1d802512652cf85db9c1b182d562a5e08e066b0bf4a43e8bf29888cc4f9d6285a26a7e21376511d18de4b1b94108954594a44b134580c0ab0ddb88b2cc70f0b6505ee0cffb9ac8f570737b366250799325293c82d84066393cd072634d697c755d2e0efed7bdd303ba614344695f6f374694660489eda7842d6b51e20836bb356ae9d7716f342ba70e75b6407d4483da0380003486576638aa5adfcdd53269918b16c7f762822d98bff8b0fedd2a132d0d22c5851189110f5a13d355e21b9799746e398f696fcda2f9df1b9ed81cd966aded5d636cc40b7553d7e4a7457ba1181c2977d648df434be760b9fddab43171d3a7fe9381df1b71ba94899fa76fec99dad8278c9e9a0723a3a5bd95ed59b6bf2c3669347e8056e4f49b95b5b61c1160e71b65e7fad05d14e0b869c9ea016ece47615b48c9f456ee9446c99991f9bf0ca66c30913a7df6a38b448b69c7d3aeeebbe96ebfd050a0b7d570f59fd08b57b93d3e6b00cd125d0928d8d885a52df45b70383104bf264f5fca852f2ef14c5c05de3f380c38d38177df0c14fea416d8cc46cf5999f4ed9f2f7abfd1557e753d100930452e3847b839777bbc8f09ff7a334faaccc4dda56431b9d5ae1bffc22b318d06d7c86e3ab2becc1e1b653f97a07bf1ce54b6b161ec2e73951949f84f6cb5f87fb19044253c297c4347444e5fdb7cce616ac56ceb8b35a66e357e67206864403610d66be5702eef6ce31e80f4e111b1b8aabd76bb10068f9b3ac1caca13f2a41e318fad989344479eb27e8ed43f61fcb62e2f6658c390b5b3ea9271e03837405b4de1320a2137db62e0dd2bf236fbe4490cfc37ad5932707c7a44f51fabec01e1b1d4c0574ab7ffecd2ed0a3707e52c7dca6987bc4f6fe2f0cabc1ff397eb30f615494f148e9550fede88e950448a30ccdc0fce88bfb073d527626d91e55501c60fa5fb61decf785cf8d7a6f4ad346d195f9e868f9f27561f9b7bb7738ea9ffab97987a889facb1d720fccd786a28bb6f574348eed1cf4738805712c15259ca994cdb7a16386f3bf0f60040356c3f4202c9d5509eb43b6dfa41fbda227914c20579098acd4598c612319370ecd1fd75b1cf9365ac47944febb5c9014f0946de872a20c328a65a4cbef83f84ecc5a8c6cc95669c4e6a16546b8ac7fc50d31775bf89ed7033d9a5e6f1a9f8ce135bb7a906a29d62ce177613ed88c18ab4653b72e8b7aa0889077a61c77a67e67d86b9e8ce577bb43d73b4e5e30ee6914f1321c8ac78461ee8670c2abbf00000000000000001b9dc505000000003383fe4936add65db586adcfb7d52cb7a9883596c1518d21aa883c9991a3946ff556c96ac474da49682abaefb909c08752440c9bfb59ea44af0575618c576ae3dfde2673872e984d4c8e77345393c51cee14be84e3317faf0377e29e458899d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b3be087cdc25090c4606370e8ba3ad93891ef3de797f0d816a17e4473d19e95ba87368b873310a57ee848a12ebf078fe32c71053188f91af5560869da6a35fff60e043d4cd51c5f1a6254c5234f419b19592fb9140febd43b4e85f28f00c42e5aa8fa1ce530b5b024712c713e7e6221b60d7d644ba4af51fec007f2ba1c2e4303003beca1897f7fe9c701a2d0c4eee7de4cbcfdc128d431e07453fba3dfc5b98503036f2da58a0b9e9b5ac5a454a61d0222aede0e885c662eb051495bf1cc0467f80b08f8d9dbd6daee03339c8489814b923204c2473ea0c0fb44bcd04516ab7273831836d88c826c8ab6d7d6cf04b19f4f7a65eaadb7180acd352547bfd7c231a43c0226ac6e2f2ba670c0a17eaa7b630023a07538be73a2536d038e4c9edba471e99c032e6bd1246335b55a331cbbe3612140ec991f69de8cdbf39329678d54dd770703020b3c40da222377c4668bf37e8a539e92ec847f7f9507544b45a59e70bfba16ef02108bcf3041d768f71f4d4271886c8cf715d12920919526a3804741abaa18757c0227e0aca1d7063f967115d4c86b6313b5c55b35ae39ea3f09d42426cabf4d17fabe95f9a18048dc01c5acfb47b443b149b632693c2b4a2ec783a36ae752389c04f3f6e73ef5ca16697c8af68ad5508fb34f1f946f21e293b9c6d12cbf5f7b052ce90bd50ba1f87b0b9ee5761f51debc63897f770fc45107cda4c840c9722e133202b220192f95831d7d4ed62f74fdbf41242bab1630640579e6bccedf66d30c0d5613e27d168ec19874d8d8ce387e73937153f10e1da9bc8fd63e34b6223509b98450ec8a03a92b3c2021a394d103b73d10e435663863ac69474314da39dbb399a6cc378aa5e05c434cb517c568465adec5d163edf2601e9200ac3b81548b5911448755012ec1b7be7682395de99c25b60cd763a8d0cfc4fca42d70c7257d5d24f7f3b374e83eeb4fe33a6dea204c38c4df624d5b7db694bba177b5b6a3b2bf034399e5e42ba160be39c9fd3a449da5b885ebf0a8b88620089b242bdbdf7a8062ed8acef88be34e6c10c27ef279a5bab0a28c215d15e3c782c2f9315cc825df3d7390bf7792b6b3bbf9cf38d69e232750bd849c329184644a1234da800d17c67a50bfcb2facdd1f2b57a7f46ab91a50aafc7e63b219f3926c2ca3e6f5343fbe805decc64f3c09229d1bf0726b41a2b45a9086986de375962f3159a3bf1279144929d468eae73948471bde32f4fb433ee9f619402ecaf79f4c08b1a31cf47fa0faedee6232ce0288ddc035b9ccb0636b880eec0eaff30c492928d44ae79076ad32745e20b36b30531af21597a97b14bfc2ba03a30f719c9ea6d7a2a0b437d4d5f1da1ff4eed9c03b6b4425605ff6a816abfc52b8408aae6873bbb5a37cffd8323dd70d95854fe88aac6c00133dd83e30e93fe53dae5c37be9b610b8eb79fab7811ce501f7c2aa98b935978a852598318f9dd070c3282344c094bf3d31fae63e8caf00972ca8d454477c50621651bcac829a73f5c119b924a4723852f2dd56f416a8d1daaf1b82f3f2be80e57e00dfca1b833336d9cec108880aa86950f64db4f365836e987c03a02d9fe2992c444e62674665459f48c53ea29efbdde2c7c2347758619acb504972f6e0aa088492b7cf1946c598115626ed2dde0a00b7996f47dd9956d1e42d7a4ec4af9049115f8a291ca0153afdd7db3cbfa959ccaab6c94add9e25d939afe8c877645e250f86f76db7db1cd161ee812f3d2b01b56142e388bd396fdc836d084d67099f94dddeff8de2d4e7558b6c1e9f0ebc8f91489770ec37a35222cb27a8f14b2446cbfd8347ffb5b9d611fc8095f6f11c4b690e0728979b7ba8099a507bf1063daa55dd8dd1498124f73210b563d3a87ffbbe0c03d888044e6e1c614ac8c6ce1a770a310cc75e4c57645e6bb7563f1cd443cb3505611522c7f0c2163a893443448571eb9c372b6e61d3d12753fc25d27aba802874834dd01ab9daf7b3d7d0a8409fefcc5f3602c33e62afc5b890b1a8c97d6fcb177e2f764928c29f211a660654a4822ef291d74b18a2751d3c04195a67401863b1ee1850bef3a274abb3fa0ba121f6d2f2ed9439724df9501e54353b29981d97c1cf27b18565023dccd7419a5c2e0ceab6fd14fd5e5ceab02f713f59e157e83c2250376f97e4908b6321a3e855ad65989f2befd26c6e25e0b58c94f5f6565cfc1f84cf907623291487c0cc27b97095e34971988ac97ba06a53dc7ea2c56d642d9c1a8e83eb44d05a198aeefbb10e6869701bc14340732b15fa98050eaf87b4a036d53d879d8351f87656409bad309ea7ee3456ecb5faee4f22178a8cd67d1b2a7d484bee4104fd72283b5239069699c27786dd8d6141ade54023daf94fdb5900152d43198240ae94bf31f99cba7f6bb88c40991f6ea07", "63", 1, -1375261697, 0, "73bbd86e93e8b460e755d75d498d2bcbb1be3a8e3c31a88c2b7ae957f6300d58"], + ["030000807082c403037aff6d71dde15341d836e5774ee53472e4c4a67108a1248b82bfd5494eb619c9020000000963acac6a5365636a515b3b090d89ca46961e88414a9fb6602a15baee21a7fd2c0f64ae82ff28797cba3678c3d10100000008ac006a6a52656300ffffffffdd6d21411e39e0501a83f770c7e77980f9f9b755be2afffc943d8a6369d4ddeb020000000663006a6a635162db15e90400c6380200000000055353005200e02162050000000009635300656553526a53614c7d04000000000851530051515265519e64cf050000000004516a6353d74ed7f0a08a83ee00", "006a65655153", 0, -1060634110, 0, "74cf48df48287c5cc8768bea00d38ae178ebfef92e272ae791f43c5e28488bf6"], + ["030000807082c403028ea66838d1c700b5bc786aab1bcb993250eda43856f27d9486b813f3d5dee76b0200000002536ab6bab7a76a26381075d5501b030473c0add66740bd30a41a7d42da916b193a08affd97040300000006636a51006a63d51d48f0029a7fe701000000000452635363df13ef000000000005530053516500000000aa1be45701593d63030000000000000000000000004575935a50bca74e2c951ea2dbbfec63d05be42edda804f8c1b130d80de8af116ddb4b3ea8b1e8865e8a2ab810c29b221f21e61f959693aa2b4355092a222ab2ba32ef8705f7450a574bf89b2376b268a746e497ed7a3fc2a0947356d4844a980000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017b0b40ff714acbef95d2eddda0c4fbdff41cdfec2166400869cf543f9ffb04d2984ff97a7c3e705a76c7a95836045374591321e8b35f848644ab2dfa1c947e43623d340d2a2465c179f8f79cf96a5b090e3bbd6349ea299fed0f77c372a7aa4826700ae5300aa8f67f8d7922b75efdd8e564aee8923df19707acb7ec0cb350c021adf24d74e734dceaf19594b5268d5a82861dfb3955a27682f84496410dfa960031d886233c75c35255ea1bd748315445d6fc09ba7777d525a901f56f129d5da0a0b023552be7f42fbe66fd4282e23e569c303681b8c7572a4c2c97734de304889d85d2a6f4774cdd49c960efb9633cfd070d6806b4f92fa6124cb00f1b31a5ef9dc02219a7d73253b28da8e3e7724d94e35de39bab8e3a742c23b5ebb6bce7c2c460c032cb52b8a297f91fd3a39a86bba43c76821fd1a82f961e6b2eb25f4e0ae6050db021b1356f2e40b5665e53f093b87b1f18d7c61961353e707a740513560699fd53a0309bf60b8e07a485d4913438b74c175fc85be4bd5f08f3a75043578dd15483ffd030424a886b6debab0c9637e0ba272214bc507c5a6586feb572861158da478919a29605aa5f79882f040e385e8521270a90ae8c6cbba07fd63340b26a5a9d88ea225b21fbcf528bbe4f50aaa1fce94fa65292e08423e33f7682c57d259bd1ef281e6a83f6b138834094ad3b1bff2b9d8605d9a676a0f38ff968f4980e0eda22d403cc9e81c33979dcc6b378d771a94777afd02ec778eed5ae95d420f8e48913952ee6bb8d6bf4761a54e00f40e57547da7cb35b5b3ddb526a4a3a7d33a12fcd89fd4e486640c7ebf91c053cb036ffc62d424c8ccadb3e68fc4192a8041d44947cbd4cc4acddecd72c8e9f9882f12f1c932daa54d077562ce5c038a88d2251f01817a42b4e387a13e06921736b82ce4be15fd930c5fb5174346e311b719e8205fc388deb0a3a38123e7f7939e8ba58a8768b1130a000e5e69cd2903bb48d63b372e751e8ad2714a3f9456d3904008fd5d94477b2d42623870da29cd0e631b157d05de6792def11b54c12f92626d86b26ba486493b9a833abdddd14760449e680dec9f17bf1ecb2584f61894adf1eb6bbd501f08fe8740ec7af7c200762d75a530f0e1207f6518436a1cad596da5ff8379f138fa627a2afb31d6879c3a46cbb784a88feaef7f71b1672ffe82b98474e4eb40cd8a9f8171ac6b9b63c522f89489fa57968c6873f66689966479ab5964b3f94b68ec458da9532cefc4a6a8c89869e556539fc86ec3a322b595747831bb9e501b5cee9da2caaad074e748f00000a1a379ec695c2da17059c04c5bf2833922b0f6e553c1bb7e08c20cc218831b9487237a1c344dcbff2ed070c22f36ec225787a06619f386b1177d85c69e58f69172a36577a9c9ca6481396289315eb8ccec4b68217f067f58c2d03524215c326ae1c3a12eb15d60cb1c64e8ed362e14d34dca7b8431f86b6d67f2730d7bf832beab7c6980c6ee3c11d269daf24dbd2f83a19eb423c9b0e2314929d9a6bb0b9adf7cdd5af1438842dc4abe4b65650032100ec13d6875df066ff1c1c087e6398209f06b491f0fa2e5078d05db963f5c5c20feeaa82af94b3a350c4804bd1df360964eec5ab6550967a05a69dc296280c3032864b414aad89612c0001915ceb3bcb59ede8f11bb73f19b92b81a9bd43bbab7edd613c1e7f4fe19ffd8677f822c2181bb4bc640a98ae8a400f3aea8acb35e19786fe57a64273ecd995c6ff54f552d989529d8f7fe0d3df0940850316c0c1d31a14990004e4e71752eb9cbc142c5cadeea4960599a3a13bb3918254e8a084fa8a525a113ac288e9ef49a6fb3442f27f71ad00f3c3f45aaa8491939adea58bbe8d319805ba5bb026ab0790ffebadb719fd06ff3650a59ca9d678dea43976802bf0d24075942d571f65d8b284ae54fd31178bff2da7b8a83145fad163fc33ea899839af9ce50f4148f65f05d7122881ec31419659c8d4032018e42d423a9eff0cabb19aabb1c323c49bdeecc380a3a6b54d6b5a74330741ff544998c8bb348264a7df602f0f92847ff30e55c035d6d1b5cacee1d591bf51308e1e0ff9196a00c2ed8f994cd7c402f3ddae809f502eed15a1178c6b2e7d80cd11e0c62755c408c41fe208adf6d7554f9b667d68112c755bb98be06164a68ad6e8014d8d06a201279985dffd375fdfe5e060447393b398459d62f0df2e6c07e29c6d345af7a12c78d97aa8fb77ff151bd624eff42314f2d55cfde3072c3f5e1aa932dc5b0d18c14403829c726fcdbe19c5fc77200d4b8b87413d3fb3caa9baedddda955b965fb7847a2d24cf73d36920a0c91635625c95122b4123cc6a01422268152ead703d40008264de282af9f21764e2e4174aeb521458828d72323e24510335beee0e7adb036ee89fd7c09", "53", 1, 470102923, 1537743641, "4e3ddff5a15be684edfa2b9e3bc56f118eaa223da358d642f55752f9ee71cde8"], + ["5d791f2a045c02948334191b79afd3c0cb894cf662529c36dc0f128d713d8a98bd46ea0381020000000863650053ac5152659f304176fee51c19ef00a7a36ec5b585196d4ab6ea9348f8fd5ae9f193d1b4155a4efe0403000000025153ffffffffc9cb0ea46ec3ca7866aaa9b00ff38febebb5cd9d15e75eb507d06ca50724594b0300000000bd01ad7674f1d228802e0ee05087330328e345c0098ad7804a18fa193379ec2eea6a3d6401000000046a5263650da2582401994d910000000000095363006a52526300acfdf9ddec0208924300000000000000000000000000aa55278c4cf5100996e4ff98365c97e3237e7327e796b38cf2ac3f93eb7484288b03fd8effb693d64e3bffbbbd526218af85d75bacc0bf0eaa4bed7809dfab51a047c20b3e1f1f9fa1c0c76228f8aaccd99b21fb1b26951bb182b13cc4de77760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018782693001f62d0ae0db5cfb4d4fa801f66c730da2b6814196f7759e96872d83c1465c41649b94744df9e4725fe50ce2bfd4433017e7a14af9793d1ece58efb8056cb9c5105097a4e0056d5ce4894f98335f8458ea13b2e4cc67caefc6adaa71ea4e0af29b9daa16d0da7425daba9b462e42cefb87c594e0d41bbad1faef1240312ebdafba75c4720361bc411caf6c6afad7be093ef65cb27ac9f3d30e5d5be6a030a8ac67f37845343b8f20ecb0ecc23a1283a7d016cd198a94a536d66349f79cc0a07a7f669d80d0c2ddb10b5c380f9ea0fc780551aef4585157fb18b8a8311b8cb021d07d9dc77e976d9ff749e611c2447dccad67f34a9f2218b990f486bb8ce10032e1bc1923272c9344057acc41969bdfac53d3ab82a6bb421bfd54dba4de6165d02304aedabe387c008763a0632118717ce7085d73b382eaff1de0a720cabcebe610213e81e6ec6622cde9e8be3877e20be749e0667ffcbe770285a24c36ab2060e1a0318fe80dc130c384e8a3b5e12fa2c73ed86fa2ad43d05b8e5d9933a269c8042a40317f0d384a9952602d802aaa3d8e24dd518740283a785466b053b63bb9bc9db28ed10e8ca3ca7508b29ee154c2bb2831d8a5cce67476d746379fc25f28428f732a8daeb760ca5565d603d69d1ada0b3d4e18aacce830a52033f01e7234d135a993ecdfa810b5265aac70f59bbbcefac78e6546d450d323cc5b106de5e069436c4fee2a5b6b816bd801aaab015b215046ed503d9a7355a656724491316894875758e9447bda592857240bdbaff33a1ac5aecb0a512ca3265215f3eb94b19ddb2db2f50c679a6b79b360837e471ec7e8367a5e51810f79de836235cd1acf9e36f2d15337443aa6e865dc26746a72d2853dbc8df248e0d3b7d5a77393f95da48720ef5c24f1d8a754a1439f2ec879443468b2b3cd0adfe2a1e394380a57340b766226635d24e63759f3498c792d5f3789165769b15ff18124b8920d4471fab5861b5555d488feea0859f7adca1ec9beb1b1907c74a1fd8ae7f017191fe194ed0db81e2d22589cedbf3668ec58834a164f47f435ab6e5768305974c36a7e2f48966f098eb8506a57dc61bc60f6a1bbf8516a9db4ded5da9e5ce84813a5e8c57ac7671f1bbb0e4d7e57c1fbad6d40fbc1097520701b9ab374f6684fb4f689b5927139ec9edf3f0d48958a2bfbd9480352e02d6d5eadb7c8ccf231cc1f56411062776c820ebc62fea7c610d4544fcdd401b12e5a6f5fc1c6c3f89c50c03fd1b0769aaf7c5b7ef46b7d70a6368d5c7e19e0e3344c86975fb11ddd59dcb6fb0f2d2b6fff2d5e51fae6092dfeb800f9330d4c1c251ff90e31eb00d6d2b6d9f9ba8a056eb4108d0e89ed90e6060bab81f4f553a72e4108a7f3a1939e17e243a0af35408922924cdc80eac662215476ef6d6ab0d0f91b1652448e4c13d78b75dd511872590cbff09ac746898e1b4f27386688551eead9068eec6714336ce1f642735a171a3ce907ffc1ef67add712899d4853a3f9c694fc7a0e56515b1b0a0e0923bd9cd954238410a4a790ae04af9d5813148493fdd4a6fa26d90ac1c0d8b8e2d6c1a232f161857ad2deb0067ec66bbd015304d97fb1b645cd275e0a64505a5a2ce02ca9e743db17db48b5c5dc35a93d1b46e29355a55d4fc1e52056b697a3a5f5a3f62b77a70ac84fca456c4e80368db0c18a69fb77c9e0c0bcb2274ac6a9a150d274ab4aad7267133922b39e96f0fe5e10de3cda5ea4bfda67881ec9e79c1d034f348475d87687b77097a0817791bb286aae711404ae1e8c37b72185a0528a38032d6b4c46cc0610cd409e46829060935f8629e5a3d82ee0ad1fd369b3d0378a5ee9e66f5729a717d978010a470b56259100b74fc8b8a415e6f65df9fbee6db5180146558066e8d35ac9398f6f6a62aa65d3c7df8c899d21c69107ffae28549f351e5184f13473b065723fa36965e302c4981aa95c13ab349f7731d22f23f9c6d91e3624da5e8c01efb216515e561c79e4e573721907602fd2a3a09fdd53184ee48a46b93128d6dd8ef75dadf7b848ddd73b37605cb9bd9d2c09e1ed6b1922763ce0901a60d6cec0c99abee640cb2f4c71c9fe17511bcbcc6ac7159bae44be1ac3f8c172b25d09025f415dd7052954de06cc3ab7f8c631f1c79590bc937ba641172f9a0b040611102edb30da5193ad88e921cb91b9a266da5ea68b7396fef1ecf7aaecc70d6b1fa66c7c2874ee4f73975afcf16fc66e126bb00d825539d20c6d094f352a1c9d6ba959848d7ba3ff53211f7262a52056176c3f500000000000000000000000000b020ab2d89ac6506064e3ed55b6b2f773984752df79b2d96a05df1260e69ae835da6c8eaea230ff5a7b50c56ac11eae2b31b5876a0661b180eacc888ccc0f876f1ea55a8701c60d13ff7cd424289472fef3deab1c5ca27c633579b5f1c12eade000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008f582725da98b3e8a9cce8d5f06bb57a9bfd179a9b05422eee18cc4a028634eb83a53abe15564ff4e32139377d63e1980c4891c75e91dfc07df955c5d62402185a029801fa9b53498d45717ee1ced0d2d10b56c43801f9e10848931ffad8263538065eb3fe58c134ca118d7eccf038d0d9d6f858fcedb55edca9783b9368b9130227a15dfb474c0942066161baf8da1f454712a99573e4ee3b864da384fff0aaf6030b064c6ca070d6b57ace45851e6c5f1de77669aa7abf61e71537b39a5dcf48b30a03c1e6bbc8adedd7d5d338c8b5c3f17164d817f6a29003073aeb20e1387d0aabfe6b477356ede104435cea61ee97b66c736add131e0bdfeaf3187eb2d8c6c8ba0305cc4d1e96a93dba9bfcea99e674d4e962a8e78d31543baa933d7792aab849820205b46015d819b2bc2bc41e30e820dfd88a44b76514cc3165198c7272a004dfef02207d35fc8e1a4134056de513de5e0a338f4c77257686c664ec4717efac166c3a032700b2f44a48733ab9ef3835a18af41584252ff14c28f926da81d4ef0d3d2118021d10711b6506a7b97fe2a1102d276ee8e39d73b0b873d536e559f4279a6d80e26c7287e22717ba3f7ecef438810bb8536d49f19a3308646571d0b33ce463e0ca7b0da199eb672e58f317adf5d49e7529642ebccff39325a7f4073d87cf3399c1fe242630be764e387aa34a6fe620362f87b56a40757d8d02f162bf1df720a69b4bb33d202a8ba6b31bbe3d55bfa459a5c077a1b0d8dcbf3d5d42b4976f0c409abde1130b35259ad4e9824fb8c66201c3b7ad0ca80db6916a6b52d6cc979910859d31d20cc60a6f0dac8d6ed9b24c5283a2ad574d696590f240c402aefd0036d774a4c085c527235b83b793c8a78bb76394883e2e8e5ddf465392be4b405300a8f327f9b9bdddc8811c9919d556da28ccbc199b891ff8ceaab066c5df99841d44821378d858733edc55fe3aca37b92038afe1a41762a9ea1b321cba3099ac12cefc4eb2ac31e823a745e69e739938fd5c6542e22e119d034f62694a873c9af488c52574df4c2cd90185c9573a1a7b6bc92b8e63575fd3b20d1dbb0ab12e5e472671a74615f5eb9c4ab59b60570f2ef06f1f8ecea683eca0f28a9a07515bf69309e735f44d8a63277bd3bf2c3e3c628c58557ddd1989626e40e3cf5cc42f647a5f62fdff66ae6048004a46652cfc9c7e2b5071e0ee194e09b937c3ca67940ae827888b40eb369b4541ad4f0cce8570bbd6859ea9b7d3440fcda54d2defaa453b87d209960e4349bbaf7b1d571b582e6888780f5eefede0dd72a66de76f0d38c230cee2c15d28e4b4a70f2488a5647ee7cb12f43fad9fadf1e1a626456c95e349ad0447e436b311ad1216a184bb5b5a56e7d2e1066948a4e1d6f0b39e0185b7c8ffb2495b44cf0c9e79c9529561b8197523d45d7d339a94af4a002d2e19e84bafb4be29c78ce8199937de2e3c5cda024f96b35fa5dbf9c01b3053ff31f44153abb70ac35eb5763393222fa74d1977124c44f39abe6561feaa67152540957a3e881872abca7e29a09a27e5b7e3b94cbddc7d8221bf0d55f50ef4133ae9b34adf75d8cb231ff633fc41c476c1b98078a395f93890985ae84ae91dfbf9567d336d970d40e0eb887b1b6882ae2585f7ded98a933ff6981e0d8134510464b37271adffdb394822135f095b88da10e0da07b4b7856132609489b72687b2362dcc9899e3419581aacef589f719995979b6376db2e381bd4beafb360c58ecc05c809f53a66a73b56f541acaea08dcc17662353d3f70438b2a6db6bcffa927a576eb711777fff3faaaac70a143514b6edf5496b17b3c535d8bd37987119d18d593285579df454f8758f40e5b39689f86ea838ca434d867355413589afc4eece2e52e42c9e014956f9910241dded21bf8e25b0820c7c0243e0cf0f0e5cb7fba8f55ee35c042353c113072fc0f77d7f80b9d6921784df80478d94f3b71bf8f4a6ab790ace7c95d80b232fc011a76cc08fb3c05183c88c64da6bf787ff2714cc0a26e7e062218e82bedb26a080374155fbb4925797d29e1c76f9f8c8081d4c9b3b7b6ec57d5d88efd290bbf723b2ea701a254af76abca347fc232e20eaed13907dfaf870623b22a1863eaade4fb963900c52b959239a947e5a50463e14e3227f979ad6cfbc962f0c0c5228b6bbbfdc536e4df21d311b0cc189edd1e08ee9f9bf3f99f95d457761261d96c4d7771bea1390bf11e7e4c7860270fd38fde407ad856a7b58f3a11ef3635dbffaa70dd1ada0d7083d389cd5d32ea7fa9cf1a00989abe7ebfe76d51989771c7517f0f30dfb724a3816d027f73b58db397dbdcecd6823e07a9214d6bc70d3d704bb194d185c5fd8c0816b53eef13f256d17f491b94a517af2a4f9414f38f7f54243f1ad7c0595d5529902aa405dec507", "ac65ac53", 3, -110181336, 0, "ed4473f61e084a071a8fa5bdca186a639b7955e1718d683045437ee37f67d464"], + ["0fede06f037898444e0f04bf78f92dbc6c149da756408a07212778703cf0c98395f547f9b40200000005006a0000acffffffff05d1eb06bde7ffe501f8ad8e1cb95f4c1eb68825d52a7f9b829ec27f88f867330200000003530063ffffffff4e6907b64fe6d9a1277e0b5fa294a644cd8369d0b3233fa5ed2d36fa336493e0010000000865655263ac65ac515dfc8fd801e061dd020000000001510000000002565ae6040000000000000000000000005722e51bbeedb8560beb2a6cf2a114570be327af6f70f20987821b4546bd94639073619ca1e0d7bfdcddadd90afa981523b75453c1831035e92dd1fe45de0ff07ed10ff28b99425ed0a875af6f9bbe4eb9be7aa13257fdb0f3554968aadc3c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023b83652b6bdc9914655ff8dc8509069b74a0ea116859c6e934ff473fd71b68538b6f09b88ed8efc1462a29afdb2a801dbdc0608d6f049c348d0da9ab50934bb0b8ccdba0d66351c37971d3f5b93591cf41d398ff0f3c897ee57bac167467a8c015e3f89aa8ebb3ffc8ca552ddc8d3047cdafe11ba55671a66a3e8027efef3b8022408601ababd812b5f30e7fa77795e85d02e75f3a955ef69a064f9db121a990202094bc8a6f086a9012208cb5b10f4cd62f7e0fa123a91b96666ea410857d8b0530b03b2f068ddea4941c07e7ded0477f4b10906cc1ee116d097ec6c31d696881d9139728345bce00a087f4a86dd94e1b660dc667a2f1620ad1ae8a8103775d4aa7d03052d75950412d81a04adb1d025c9afbfc25e858bd3cda76c17b337f8264401ed020cb0e79feec88ee826a43e0d0ccf98f7862fabe9671df43afbf6f7333665e7ed021f5458a8e2cacdfd7c3de8e63b47dd7483e33c4a283fa60c25f23f37e612ef3d022402f78f1ed99b31fb69d192d1205afd6a1ed32d551ce616716ee13aae0ce11e021f7210a672ab12cd3478481d8352ec374c05b28420de89868bc17a5d5b443d9eef9f92bdb871973597f1b476fccf1cedba5e27eb6daba6279fcdb340acf99ee135cbca400ed9ebf145bd190865d4d42b0f6d6dd527553176d5e5f79a713926ec37cd743d3731603afacde8ebe130f67f799b083938e3302c3405b6288a78687dc284cd9d1c49201f85bf94d5052ad6f8a8e180f6570f88297856d341218a58322d3fd8e67593dbe210a7c7d61e1897716cbd367d45a644f451b7096b5f456249975a2e57044db09603e6b1b743d8db17aa38853163772dc8a56dfa30aa47e44d292349a8cc243d006b22903694c14bfa8c9cbfcdf84d7a58b8da7d98d143b30befa2a8793015383f023667cb67a13b799fc9e8490a8c747f96564033955da066dbcc40ba62dccc8d2a93057c742820354918fd51f2e56c77b9bce534731a16afdc0ffcccfe14944bf0ffbc394b13093e126dd48eb6c5186976ccf9b227b3aa898af86bfba95a6c1ea2a21ba832c02b47a12372970cecb9ae20f8b1c9abc32ef108953cb0782a0ce77a76b52cec2354adbb304634155ee3719b8a1a8e799c17228167b3a195db47d0f6b9d3315a4078ccbf4641535f5f00ee634dff31e781fd5087a9c47d3cc5364a94a53b8d7fca150792c10248b05bed3333760fe303ed5ceb08c457bea0348f35cd4305fe8342ea6d29d3686aa5659801afbb3787c14650dc24a2525dbae0a567ca459fb3aa07d8d6730b65de63018c5141a10a0cd638e1b6e9572200269c47ce2a8c5bd8c35d3f0af47d4e7dabcf966ba5b231b06d562e3eb5570bcc189a093bd3deab710abd98736b4be2ae0cc156ea0bd3e10a5bc67161a7f6682c44fea43c16fbc4ef8e0a5fc90791da217da751fb8e708ab700718a3bc0e028df665210f3f93271dfff974e585d01d31d347cc325070414943cfbe042f72511bc83e7a5daede968c42a4490a917404f6f49d4c66693f503bbeec155ddcba0aa4caf10023ef332ab6d7f1513da59cea2c0d7ac8908074e973d071e6f8c327324e91829e7191559a8118bcbf405038eb7b437c592724b5097725477d3054fa7f9618aa7c4b95b52f358b52104f26b54002b5e83e5af0f4ff278f7b807990903898f2be4024b5a041c7556dbdf031a66e45015f74f4f2eeaa22d91a6100e29f2e57b2c0a1f959cffbf8684b82bcfdf0c10cffb65ad4c94899720a453fb310d26206ca2c261bcf80a249e866792874ac6a505ea67b10a60f0f8858da3c5d8ea05c7c45cf4fdf4aaf9fa226b55cf46868c0d90602b8e234a9778b598a5ff2fa13ad4956fb21b906c52d43ef73755f4db81ea3f5dcd9a26a4f7b0e5f869577500648c2e766b854b47218d51536e30c6e987fb8b8c65af2b1f0c370e8c5bf7a738bf8eb86ad3105bdf8a09126aa0e2074c948f60d22bace3744877c2ea971aa31a061fbf61f5ad2b2ce7478e4032170549b819964db323334839d1821e03e5e825968839e70c641e39e29886bb1ed427e30d3d5edc60a6a08f06c2cfd8c5163377661427e2f6ce87cc58bcaa08855017985fd8ebab0e9426181840cb316a7fe5b4a48f981ff4b0b98f436da6aec7b99d89e2ef1e9b522b50207851a69a09f9f17fcec1ae95fae4e6d6e34ab0aa66ddc27a2d170b9a41ed5809e2e8b4a9ea580f5025dfa8281af57b400d023a61e3cdc438be6a7ba99514f49c03f857fb14ff10866eb784f2d5e9386453e9c9aaed800aa4b29fb9ce01000000000000000000000000b5c7082f899c9cdb653d7d654680101798dd15da4b8a425e8c88a52487c3ebcc3793cad3e0389583a38bd5c2002005919780fe917a961a21b56f9f359de47bba0d837c7bade6734d2633621436753d18f46b88f98b6b0dd84a40f5d38e3d0de80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000094b5bc80adfbc64b8086fd4927826c4a76d7a0cc1fcd94e304877d50e1bb3ccdd3832d5e1f1787cf1fe99bf48662620f95a7c8d07508472788e05e2738541da18fa65bf28c24c8342f2137c648ea5264d6440ed5f2489b6c90f9ae314ed0b6197cb6aafbc9493d347ca2b1ba7a8acd200536fa1c66d01bafc9d2807b28a8992f0312a1e636854b6534dd07e39f6001dfa95d6f7c6f9ed34aa7aeecc08ec6353e7f030ecabe4d56f7eba62abd88bfd4334437e73a2cb4515c268093a16bf410f81c440a06cbb18c730d46c98b538300004364700f943358b1b17bf42b54a075cf9de696015c4caec48264f7ba6bb5d071cca14042b77b9c5dd2d694cad702cd0109764e032c517206b18d999128ad5eb2b6caca3ba29c6f7dcd9dbb4be6a923c0aaea2173020c8ab44954be7114fd99263c821dd723d8366491a8b63edae79bb6b42e0cf08d031aac270a2c24f529be389d4854b5f200fa07010da679f7c37cd4a3b2562fa8340205219907b127c32837dee8d7d0bff8ad1223f3fd3af81bc7c40f8f8853ae3b5f031ec576d551e31378a78a3cf542feadcdb6c68e2e3dd208c898f5f5af7e39051cdb3ea13375cc0d7f13266a93f9d3e62deb24e979c7cfbaa6902a82b2f66f0fa0e7197cfc3e4f037a1425828a5eb6eb3d4338839dc78c31b9d245c9edf87501064b920389b3332da01af4179a5d96a14b98ad801cf86a7bcd3038144f8f8b20a4902c0b29d6b228bb2c4ec3d1c5d03a692e81810375da3a094ee9570ab59ef84637fb149ac8bc69134b7ee43811bc1aef11a7be554f10ee05e687d0d0a34b9afa2cea97e2b171522f254664ac98c347da06bdf1c9b56c30380022d6e8c7b1b86a8be572c758e5fcedb2428dbba395d27fa5170668890cd438d7290f08da3aa727deb2dddf5fe11f15410f3324ba10afca8f52051d9706646725c57d90c3b99e399c8caa0c22ee9b3bbcca6f4bfd23232cc18d47160eb4420b9b4e75de519a6fcb2a3d2854701b7e5be1642bbb03d41c89fd01ee2893f8757e2be2805ea0fd828228afd5ae710f2e89fb5ed500dac3eba8891cf3c9aeadf25e904bce0e22fbcb98e1b1d7bd889030f9092b7dba2fb5d879fcbddeece9db21cca76663d13a859530c46dedf9c22ea830f4d827c5f503b6dcb1804c234ef1c5e04def374c8c166a439f4989a1eab6c42c13cf0695767b8a6774ad9f049636227d116cf419b22ffa5a2998e576394d40a462830604b7e5e5a11beb1aad436c580f235bd86d99b910b40981e5f3b4df1050383963d11b3476833ac605f62768e6b64fa2c7cda2aab76970be839e2c694fb42244f7ba7a7055110ab0098022cef28f2a48a082b1d5b501659d30a2c6bf893553a37b2df72a46798a756eceb37599ea34d76cb380a376e9e975ef1a51ef44252126b1c225ca5059810d26427a69852b7a0427ad978be638bb7f9216328ec615b0e18b79c1542a8b7d3527204587ed6cd5bea3d1ebb881e9376d2c70b70efbcbddd78487f240f7ee9c490a86f249ceef3addea3f0577fc3580870fa15e7399df18f021bbb341f02e5261f9ea9184b06011f85f5a7b632786c05074b777461dc8e5be0c11a40dba670b2022972247ae5f7293bb84957714bb968ab7520e299e44ccc5f5da01d88406f36e5ade5a6121430fe917eff92abfe762b4326825034c275c3474d31ecfd6128b6b6552d2fdabedc4f8678d3711b77b8e750de32b6fdd3c0814535bc559217f6b36b588850eb71507cbbd0a417adbd4627e8dbb15b36967fd7f9b875df64c067d06f796d4d483b691b6992c531d7663ab4044e981d77122fb7417e325ae1e2d6c994846ef47bd33fb847e80f869fc849f89c1b224119187abac7009774db8ae02ac0215fcce99e4f47507899b2b91c6670faf7152a61cc2aafdd7851b123460aee9e47acf399c9e25e73e8fb03d0b739afe9ec893bf1f00387a78885d89c143bb0be4793676ddfd7dd0eec7920725a15f8e8b61649904ccd58332f1c7def6eb41110a1161485c0899af45ff5d5560893e6fadf874687487ff010df45a758ec537cbcd5b3870180d90db2368b73b424ab66a0ad21fd95a24f8ec6f5cd61cd854cea2762099795c9b3cd21544205375c478effcfe83523ccd4c92156b5c276bb9b4ef6a633bc976b42fa29229471bed8d99034e8aa3a1e6970e4ae7b5caf504157dd62727666f96aa48bf29fef95176e52e2c90849d7d5476818a0d73ebe0161251a0fd67e4398fd115908ec58e1b67eb76438f0e01cb19e10cfd94563e4fe4c20fbf5936c1e2748208400a64baed8af1249f299c308dd9cb83e70ca6c5f462466ba56e789910ec81d97cc0573f1b624cbf9bb5ed9d1f01aa5ff7084fd873c913ca00e2ff1d88c39249e170528b5f04babc152ce987f3f4fb08bdec0b8cfcc5706808", "5351", 1, 2061477248, 1537743641, "8da4cbf6316c42bdcb24672104baf5a06e8d291c89f3452635a69b97721f4b51"], + ["030000807082c40302e1b82e1c8b046e8d4a21af51c487aa52b104a8d4e587f98ac8144c4779753643000000000765ac6352515152ffffffff58835841be18f2c0099b59f26b957396e753cda84e73be338248c1a1ca81d9f803000000076a516551526a00e4c44327049d2b570200000000000d941d020000000000740a6d05000000000015054a02000000000000000000000000000360b3ba0300000000000000000000000001de1c80e6ec94046756c8e32128fc860cd0e744045bdd24da7b1e0b38f12d0d418ef0fd9de3f64b5bc6bcd11f075ab7c043c1222fa18711003bf3766b95c461dcea88723fac32a7fca9a508c2c13cf2c68c2f61551a08066f7e09ae68cdbc4d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e48064e4f3226ca110d0773ba2a973c5422a9e798cd166f60c14356300abf0efa8260fc46b742a3cc19ca879eb22131ed5e729f0fce6dcdbec4b0d5d66b36b4daa9f278c400900ac28b35d27b0e6c72fc36351fc2241a38a24de1804c6f5da171fc952bda477a1789b3e9a4ebaa0eb67994c49f01185fd2ff720fa98143774700309a619fe415041c08acf9346a22c9ed2aaad308b5d09800ed833ec9df8cd9d1a03203b8f78deddc816a4a75f60ee8189ca0d6f1362b7a87055cf44f54f246b6e300b0853db26aa6cf379920ba735fff9e48130d0d6d2411bfedaa1edb993ef87ce16d4cd7bafe04112eceed946ce6724e917ee058e7a6157684577fa924ef0e2a6ef02250dc6a43b516fc55f627e2802adb2d682096d570bf9e645c2be7f138177659c0205cf5db425c821bc733905d69b43318806cd9709e8c228c58ca523c404fbbeef0208d2db7212697bf69ae1b688d9779d58f4826d1f3bd9af6fdb358b4b0b4d003003287e5c3ce168a2f16e4d6f9d949503d282670f8d6a6ecdfe8ddf261d70565ecf0214542cc9b724e489e5ec6533ef974f8e03d3cc78224d56a7dbb338b4dec6405c14b3c426cf8debc922e31ecdd88443e84413a8e23b944dd801faa76197ee860c39cc1cfbafd347501e881b64aa430cbb15475e8b2c3dcddf7e8daa14efc23aa16793e7887b91982de3a4041d3f5d581b2445eeb81a6104474344811d3d829681fe4ffb6176136640f29450d3c6e3c7d4a9e8cffd24011adacc1ad1335465fb4d73a8c1ff37966257a13e8d3ef7b056eac750e529d968d5b958e9a4505f604181e33dd4e55a1d811c6c833bcc8f749e932a106045b881472bc46edd8720faf339d53129969c4aaf3d86168c413ac0302f871265dbb63f7798971c4ec7248d8f74d20895497865c534e5a12f3688925617897f393e2e851d2218c7e9b4f44dc0a2c458c8ff6a60cc08dd479f5d6cbc205d6e33b09a648e163181998c529eedd00f95df58a900e7e7c33d4643be49de9af31f3a41789865d7483409804813a90400dd27aec1d829975567891358fe55391eac0def4c4f62d4336e7f39ef60c42fe0fb3c000a75b68d73d838b0e92149a62f892985bcfaa1ab3a2e72772c3dea8433b9afa9096f4a0c885a0334ca2d33da3fdc13073aec919ba6a7a7a316a0b998ca77da4f90c9369f87383db40ae0de50d656207d379559341275dc322d73dddc2c0dc97ac1c9fd2a2784b06e84f0b2dcf6995a2fa4d40b5963c34df066c451c34db21fa54d914327657e655f816a866655b6dca5d3655d53abf653a66dfcca8fa6a3b350ab5a7d9f854256b772e5970a92e7df6b4f5badf098542c10a299092cb828ec991cf575338e1f26c6297e97b9224259cc3e7e9c17b64308b60bb228ba9008ffd984db1673a05dd20b21bdf98be0be8a8bdd283dd9e4b16d35799d03c828b5270d43a8bbdc06f4690db6c8fd5f5312312363b4005d7f05cd86134802b1900cba070a5c98b7130b35463f4e757c523e9ba941ac4980fe4c556441f3fca429de87fb0ee528bfef143fd344e2677db83d893014e0066f81fdfc359df62dd27eb0de644d642ea76b3932fdbd6534e2b1356e6197522abb831e19507c6004755394bd7042de696986bed420886cf947679f24937ceb914f5672745363bd916edd5d489fa435e8455682bd5e53ce0c812275d0feaacb96a95ca2ef02f13702fd8dd3f0146cb3f59c9763adeab243c10e643984663bbc996921cf73399403b5dacd231fee2f1472caf6d5aafcb7100f74cdf948c09f86ba926bc3a71ff3c2252613e0cfd14591a0ca1ad229d9b60c1fcce09e134c58365089b2c4880e099a6a36fee16ef01280e3377fcb265e4f21bab9a47ac6256f410f4ce1a92e30980514d229b1feabcaaecf2e431505aec195805172df725a483c0c1452f21b7056691921a086dfb39171dff32a3a37c1ceec19c79bf925be0aca3716a6f63a24591a24474411a587a1e7a4259225532970167fc4132377be28544491f78d8e9e406b50dbf1d091007939832f2c9c0b8544d58aae5b097d7ceea8dbe96758ccc9fe1f64737859ea323aab194b387c8cdc393874090b8c3005b8810ab4eab0a20757277c70fa1923c99ed2f14960465a5435418b4c17d9b72bd5013fdf6ffff28fac107e609953f2fafa225cc0cf472709a4cbf57e17fffb5a9cd76b48f4a9ea8e1374872c495a660678bdc78dedc46a674ae16b1585dc25738302961d44c5b951531ec7afa5944fe1741224ee7a620a04e42120a62e3c1af3882003000000000000000000000000236657e788ff1e1522db287312ae3e10da3654a5aedf4475d75c7b5a12ee6ad09af61d6c625b1f47468644746357169f8eb1013d21c270a56b982f04532f8afcd3d6783cd6783e92b76adaa6b603c16e62da6b6215fd54dc2d34b3073224c2a600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f3a28a69351d04b0db6bf49bcc3b002beb87a516523b3547105f1a086fc584bd042e0f4a53f020daea9f77a07c2eb940058ed6ad8103717049e556b97d6e9410861d1ba262c94fbaf9bce7ca3c8932b07a710b193d8033c7c87159b91c01f61160cae3cc46d8f28062ff10beba85902f31de611dde4f44e2c42dc1d83859bdb6032d70fb9adb5f2cebe0f771963d3d474cdaafa2ffd69f52fcb5e1873885c469a402186e5f0c6f9155dd97dd0b5ef248f61526277cc7f77d458515fd111fb39c9bf10b04e1147b5901441b67021118d5e2d130f07f3f6461e70bdb99ac47321c7020573d59e45fbde83f5357eb19b73b33ca2e4a099c1802599d01641ba000e2aced9d030d9b7282e74f1c34171c07be6263a0fc0badb99c30cb6f2cb8217881f9ad50e10228d05eeccf645c3a41cef0fc19b20613b8c55e6c995c7d89e8f16d11982221f9031636bff3e207f219a9046562dbc084959e8fb9e77d01cd710addd83a6b30f44a021518bd6e486fad58ace6bcf43c588510bea7ca16ca1b082025acb0df3637da950314014ea72d971e85388962432e0aac38134b6225aa378f23dd8aef10bca8ec5da63e02bd450d60ed24a589af819a8ad9e1207135597d0cc5673690dd866a301dd54de10a0cf6f13d0d1ae6e9dc6701d90bef46295a80963b4ff58b217b0a48e06c504581006da06476cd32f014678058dfafbd61117ad885f7611c566fd67ba9eec5b8e3be416e6fadb73ad43cb612184d94bf54f99cd74c9d954f5d661c3fd07ba56e8b82308210396a9752f5db53cfd3ad3ae38cec71a3f8f9ad89ee31fa95022031ad58bae47c59d0e6581e7ddc4624f43ff88fa7a6e0de7b3e261e82a31fb3a5928313206767202500165cb8647626c58754aca41aab023a5ead92d7dccd05abf6e4663c70519d8948ba37e6811cdcea33b0d623cccb0056299f72eaab7d7e47f397b49cfda316fb23f78f3ee6d79fdf2c01aec1981c33d5b2415fd6cc5b09abf16f8eda4303a1fed0931bfe0fb3572ec493efc6ec6d11b55e96e50545642c094d0fe4eb517661fe4678c8017a605f852c64d5f269061e3ccea2087686e13806f9f493438326d632b8ff205d2d249af6bac89128b06114a58b83a268c53b24e011923559af77fd2a7e2fd3948b06b83c27116b79ea460046617fc0c5619cf10ec313e2e3a3963b354ba97a1f7768856e1c76f4431b6564766b203ff70c952656aaa700b336c27ea83f5cdec49d27802468f8ce90d5b5d85ae9491e2e7e188bce738ab56be184d43a2460f9ce7e128a8d628c10de5fe0c5902b8a56a1a6c3de14995fb35a7f4e3adc9b1a231b34e4ff333b3f0965722d987cc8a5bc8a3343c4d09f0bfa59960e30e1ec0b16c51f27b4c08daa3f41b98f1ad56bb33513a75be5c05ee7bbef8b6ecad0859c773ba58d6b554780d9176df877becc0aef2fe16260a67073f373c253e8dc49b69d41d5b87a55f9427e35ccb54286d125f459acdf0295fe001a8fc706e864154de9fa1caac4781b0ba8b48297d9af519a2da51583f12f34d73286b17dac4c43c8abe62d11ec6ee6723e70aef86524200b270c711e5d982eca2f4d43353bc8ebc6d4e058bb991c68bcb31fd58efcd7f25d6728d0995f2e0dbf63aa522292c9c9c84e426729144b741dadc5790ab1ba630a312523c2e7921fad321836e9d4d0e0fcc0ee4b212c9190e94f3ea9a4cbbdb840f15d575c0c337f3d5609e7b3f70e7218c9a3480631bc21efe3972073f16ea149d10b307c39ff07c107a182a636c6ced64cd15d4ff8870715265ab883a99edd7d18121cec6eee8472a87abe9e8fc5e77689139fe02ac7ed03eb1aa1f49f393ee912d6331d055bb7359ad784f9b9d68b04b6144034e7d5a10ffa053d430da89f0532b82d3fccb9b0d2ad06bfb8cee78fc43b2e90a8b0133d26aac9bbe23338d08ea9ba935ffd0c33cde85ab2ccdd9af6f2f84060c2ba89ec3b8f9ff4671cba4498399ada45aabd754d00c0dd3b03df23b23d07f59c9dbb758cb00ed6a1ed09be33387bda30693c1b81030c577db0ddccf8dbff293a0ec683181e466ca4f3f03f5d646600a79de3d9c9b351ce929f2200af2e553528ed0ab62b84d312e77523b672d7ff60330c3389abca9a2901e1d8288730f6a96a5b67b72761df760f79f6ce7d43449292928ffbf23f8d3b50e21fa9f27ba18fdbefc6c6464bad105c6d550a4b8d14fb2f25a0ccea5d053bcaa89c53cdd81127b01d0b95aeb9ca0fdb7ffbc142821d074e6b1c656ba2c8275a9c68ddbc5e1a9fbef1273b68f1040000000000000000000000007fee578f23c01cb247d9474ec7029628cc2c588b0887a0709a016c141bfcc8a8d2ea166ad6f2e8fd80ea02870c03557f1fb07b500f4db683b4881383be9a3b1089610f2c101d36357c4ebfd04300febbca11e0d45362225a978ba0c87a9c384300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000351daeadc05f8fc22f7c5ba70d5f15a75f313778215d2e75586384f93601ae437bfde80b70da439b6c514989c2cfe3d5979f78ee16d8d673c68ca3ab19734ddb79c9989675dcd64d820720dc6a76a9388d856e7697a2077f487fc1149862a949d2656893053c0f46a5ae34a4a6c11e4be808d9c16c520d8359e31863b77127d70226dfc6cbe0378ff8b6818a2d135572eaa9565812d0ad07b5f70eb7ef2fcc2dce0323f0aa1dd0904435657cf0a4e03164b10c2d7efe673fa0e38ad2f4c8ed0f0d0f0a00cd664a6d17000ca2816ef34aab8dfd5eaca834657f2bda83346f1e8f15cf1f7a5de0ed37972f247e91b05f3fdac99720a6aa6337ef8a70483536e23fe70cfb022a1cc31f1b3cd46bb7c339feeb514028e80d002f4a41f1eac79f3a6fe8c5c95b031871a76fab9ea76501c07d89adcf82f60a7087a2e360669209efcb365f5b3f6c03071770883b5248a79493ac25d9f1431215b60879e058f4a0a29a7371b37bfe83031721268e5111d5782d6772cad5e072168b87779e45950ec94478ad3eebde5cd0022f86374a76f46b339b32de56e9deb8533433c53b9f984fce5ae67443b309c80e6d416cda890d9a1942eb1ad849150a9a2e6014ced485204f1d73455f906504b7fe385677e95a03e37c14684d16f77a511786d0e6752402a0de8e0c2a15e9bea2c6f451b02c40fbfbeeb8699353b91089e429cb8635a3f921457aa242f35384ba3e8742b2c1c63a65ea0d4fe2b6c3dcec8e6c794b3b6461d95cb8a04c6c0fcdb26cf0cb583809787a173ab3a4d78989e13bfd1551df91b725c2459b78a097b978b0f0ee39bdb0929c79eaaf6d873d7b3ef483894e5a2782e56e2ccd2a3f491c3bb93e8d23f6108e8ce28b3c57e51308c2e840a0f1cbc2056f01aea48bf430d1989d13e293d2f52702757eaf2d84d4e074de7193a21cdc1b0bfb970e9895b0a12cedd7d38179555b3ee57a8ddde5bb72d7c591371d6015bca5575d718affe6cbb57d483979290bf0aff1d6ee7d565533a59a03f2d921b3c0810abba2f974633c4917f40837702e41ab952772959e3567a69238b1bb0b006075447093badad368a11e6939d7983f69b693b9c2a56e428ba1f494951f40186cdc69f2eb5031d453fc861b76ee3a9514e72bc07a01382de6eb9c6514466b951829a2007fe9cbc8406bb970c8f96f01f58f89cab92582ebe2111d65c8b6ca06bcfce110798f81840317ffddfc53a131e6850e42a8d6afea45c17c7fb05ae5235c49c680077c4ef7a2b78c7f67cccf05c3ef5dc0347e34d644532493c7c9ec67db942f9018eb4f7b0afef346e6e58b5a5eece83589c77279c8d7dcb85da9c7841790e9dc3e961d230e00f549c192bb93009f2b688914e27e7b0080bdc7590691dff4256aea41059e9118a683dad8e0ad8c729e3735ff23cab4784bbd14d5bca0fd3862aaa4e6e91f054db99e77f284eafdffb1ae5ff45587ce942e2c8bde0a254d68d77701f93fe531068d4356d892bc37c8da6b43d8f75ca89f1bae0ad3d0706fde13d64127c4bc87ce631cbf084cd002fa2d9c96b488e82ec7e362cdcf675f28455ebfdeca81c66a5f06be59b35158fb280d5c74e5cd674bae40ad47cee635b6113ed74b2d916bde8e04dcdd6bc6cae4aff1f4aa93f035d1f22d399b4a42b9cddbdfafba9979a82de09a8251bc02b88115390f5e267688af8df4eebf841c330a6a331d663c61565db48644f08dfd1c606917289ea2ecb20f8874a9ddbfad7ea5df59c90abeade4764e30441ab889aec5ed95187cf731f078fcbf711fb4c56ab92bd0d26b227435288b50ad048c8fcb9c4dd28f6986905fb9cdcd4b11b4745ca860e5a9f46dabfae1e513281587bdd435419b89c2584231d9684a37625b010f32fde0efcb4ef0f9a86e9634e8d275f7a9128c9c24a71f15650a0995935c399af52df9126284ff68a80c8e8e9ce9f7962f70212f2eeeeedfad3d6bb77761381e4848d9eb44cae10992d93941c2d2510b20bd3b3499fac8fc0f92ac1757880581b9e52fa8827a5cab9f9488ddb85331b8a8a37c2c3f30d7c3debcdc89df9e3814a1cea18d20e3a4ed20305a9c219fb6b0333a4f9b47c01be3769847c50a223bec2006991b2b9628605e1833cdf64a6ecfbea1d8256866846eb4634c87cac4e7ed822acd5ac8b4a2afa65b8186df5fddaf7ab2b801746b7f4fbc13c31b5a384b4f0f1967dc2d947d6b2c3dde0c7691fa5e4fdd7d6da438b98f88b8623b54d5ac819db01c3d87c0099fd28d54f400762b73dedd456727d1fedc123c5229fd623a62ab8d8183c987b58a91472decaa794d3047b8a691e958bf5321b31aeaf18722ed7ac0155ccef4881fe252477f30f70ddf26c1adb9520feaccf25d94e08175bb92e5af568befa6f7fa47739e7e37ecb1436a2a066f41d0021f79ea300b", "00516551515163", 1, 248496992, 0, "288ff06b76d9ddf7454b5a17b80d7eee7501353ed1458bb649f38538ab32b68b"], + ["030000807082c40303f19ce5d64bb7df274669ac94382496ab2dbcfb275cc24ab5218704bd8f93a7f6030000000365acacffffffff90b8702f584c459a7ca71c35fa275857b84986cc0e94519b20176aa047383ec10300000000ffffffff4f83e5d6e2724ded5833064be86fb54dca9608166041006a2b7ef97526052495030000000151ffffffff04a9605104000000000653acac00ac6a0c9403030000000009ac636a65ac63ac5263ecc9f5050000000009ac6365535365655265f02a4a0400000000016add8a66e45e206b01018791fa03000000000000000000000000434e4df25ecaddc89bf07f9db23dff189a2c08d485839df0f27c79f0bd0d80ac533e4abeae111e2b1962f301bf31d66d97b6f6c5d440ab1272b5a21303158658c31c4eb795fbffda0cf5aa1bc0adcf302211d7d40b169fa35fb688041cad448e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003a31915c0aed6989aaa85b4af2aae703ce3fead8c350842c26494cadf68227a8256b0591ef8d856879c509ce8124a2d1f193ba6c686225e3092a303bc9325a046eb99414e31fb22bbcaefbdc23c71de3f0cb6aa7efb8b04e3701d0ae4a0e2924213fbd7eb95e2d3a1edfe87ac10a2dbb1b2fec9f912c5d755062a46a1d913586030ad33e06e72af2d6ba3ef72a6dd592db62e9f2da4a263de69d6fffac8057742c030529adcc84468b741a0ff5435f6d5e62b5902aefa95a8c269127ec8b188287640b039697d61b3df21a2ef659bb415dcfe22f5f97a0d2d3494931eaa6ed4e20019ee627499c1e79056f31b3fc64a56c963362bb1d1b5dfeba327632f2f5ec1768350210f08a75a7c3fdfa09e94e7b8dc9b561afc7ee1206378ed6f5bcf1a32ebe325202040c3f0eea75934713cb8818e1ee2c18fb03310b94df553f439e5dbf1c8827cc0208a6e25f83e452d08e6237a780cf85615736c6ff3840ab011707260ce33aa9b3032a0b254aa7e7acf2a12d90181f13b99a0cdc6c566b98b09d03db92e163651110020ad5b2994bff0a2212ab5486f386f2016cbc8a91741fafd65a146e97a4aa05985ca59b74feca0c2205f65e0cca47f35d914ce7045b75249e86f3cd0629ef6395cff66cb42f69a413a65852f1936e05b9f0c6d265670c44da1379111210b990127fda2222b960735431f5aa62c0b74c8ee1f85fa1ef7d444814b52dd0e05096bf15dcc95b8f1aa7a654d322f488c4bcdbb7fa75b60f67fc56a80ed78e64a7b9132872424ffebc95bc173acc13e2abff894e217a97982eb1c4d16ff27225332fb1a3b25653f22d5e7c3396509ab39d22e8b396268d5e1f1d5dd599777174e1945cb3957780f05123034e6cf70a0f416994160ce5f3b969e31e8e103fd48d1ad0d9798e522879ad981383bd5fc06acbf4b6dd3cc0cc0f3ab20a2b1a7a3bf3d5e827c7bd989a286625179d8c36b45754078b5d8424ed3f1423e39fd0dca0ecfd09acde7a811bebc7a9e584bc2fec66f3e5ead68d36e3d15b19e037483a65f7ea05fa076194feb76f9b69a7d914c8a9be42b99508400600d733cb55495ad7b0855df1a386649afc6349b338b511cfff3384222d90bf60a25f6fd0ff1aef03cd0e4d6266878690b68d8bc80c9dcabf0ee5315894cfe41d092d2a8cbb81fce47b4f63a30e1d0d00d7726f577012b03493fd5a80af842d39a46f4e5744ea3669806a9b418b4b3ee342b5bbb671588bf51ed900b52ee1ea42d0f3400e79269967a6b6a6bf606fc84c804b9831e006dbe958c4c0ad74e177a4379bebb6d3b6c9281b09b2a73f9f8f4971c6b9d5d2e1bae21258b96659a29d95152db4532b708548114ba55b520f20636bf4f6f019472594a765f75fadadcdeeeda2b7f4f2e15877a07a0cfd0cc561dcf74ea210846aa7dd2e9694231ccbd67639b4d197ceef611baf8fdc041b6d74fd32b1d5b9648783f4820ef9354d6fdf1b5853f16271a78f5d4f630f9faf8ec2afd256ee68e5c9ee44ca26622e9813f0ca044beb203aa61f1b9c0241d3ec0064d9c753e6dbdbd1371d9b5459d09166250d86a2cafca59a9037b355b3a1335c1b74bbee3e7df72b0b4e449b25f094c6cf722c9aba72702d98d3cc9920b7c61c6179cec4a5728c711ec114d4df401feedeb92fa29400f82af9fdb1846790fa9736516da02f7bff42df5267d58b5f8ee1263dff2a049e1a4586566e5ee8bd30e1b0e764dd7eb00b2604c45d226fc164b95f8056c8299468ed5760b925e1643f02f37bc2887d35df045753334b4dc726425edfe4d5efaa32a4cfc533c7f97f6a700ad15b04035966ec32d4abd17ead9b7ea80d335a787f1b9a27052d48338ea311e5f278ad67ab2aed8949ce2d4e4198b0a4c2191ef116de687d6eecd9a5ec38610165965aef0f6e3fa964fc8614d3b470aa68d940993457e2edf0a21f6e318c823b9f8df99dba89f2311bbed79b56eabf388710a89880564a95e17b46359e346d6b295402b0b11c49be04a944e688fd25c51cf65ae619a47fa66ef1789b3c9c59a20d23abae54b3693882387099cfcd480a86f2e4309337349f55328c4957c271c758fae223397f063b23b14a1ea8453e1b1c9f86fdb4a191afc73b22e9ef26e355d992685739b4912e4c98df814ad45991f829b39895833d45cc52f0186c99a06e2992ef99010a232c9c2423115a45f1889a3bae62a198cf2b07311cbdf52eb7a49f697dd051a624bb2877e87a07c9bbf58068ea3ca79a2a19be1133019d83a7c3a71e2fe76885c076e26c2a2e2bb7fa176c5240007c430feef27eb481bce9ab85a86fc0e831fb80d91fc0dd70e06e1e7ec18f91ed4d0d240e14b7f1283e5baab67ca2891b388272dd7ab69d7e07d705845221ae134b70cd635bff27bd010357e35190a47e361fa3757490f69774dc07", "6500", 1, 809535198, 0, "9d292351c322cb6ab4f080f2e58b9ab97c9df1da9e7887b10a595b03a60ef6e1"], + ["2b714127018e080c01ad6e309dbbe92abe18ad34cc4b76f34a992e03fe2da2dfe90adfc762010000000034a66e8101910c85010000000004526a6aac000000000264affc040000000000000000000000000d485f504bd83f73184de06f5f3df3391a64415b0a68634452f183f452ffb21b3d6bee723fd8afed30ea54d9796f3ac295e4270cb16b6931de63d0de5e7e00ca3474984476519c210e49e17fb0d1d936af34d0ee73712b03324149a0256956f600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000117d957f5383d219254a5098b1cad1d13c5715b4fbf7d3ca752a15a958a843ab08b6f6380417d93bf45060d4a38cfe39d4b18efa0458df1eacd5a2f9602f1c7e85f6885853ae35b615fe172bee0d3fe75ce4a6722cd18eee4293033c5b35ab8ab9d0ab6eb6b4a1706281e33957be262a7d1c2a3bc247740b3d153ebba0dfd7e2030061119689faea1b6537a74e00a1164911b72499590e8f1e9b968850d7a6fd40020f21ad8c0e8d3994a401c3e827a39895fc36e70ed5575185b8db37a51dfe32560b023a9fc8f3bf785fe67db9081168cafe2139ef1c48b3dd4427bcedfda2ceaba91072f97cb33e6a91d32fb191610d6ea056ff51aad030b2305b2947f0d10809170224d4002e59df9c7a7a17b1a7b2c8eab1295c6a598141190cbcb5574f4b21d9430209df5650074f5244792a9766dbafdb7d3f5494ec59afe6acca37685273f741e00314744069f1f613a6ed1d23df2ea960f67be0a305a5a86d547ba0231ea190de6902201f472331beb6b91a51d5025b3ea0e3caf72d06b85a60cfbfa1fc89c49d3f820309eec67c1ac679b7f4a95bd5e3b2bf009f081ab4f100ec1db51816dd992e340075e2ec2e550884f9f4c196f07e7b2afe28b3ce96f405a9da0ad70124347a0a4d102506340aa6204ca327533033f3b0f883d33777fcc273ed3bb4c9a91fbf04c155cb92d8540ee2ca2aa9166545352e96e1cd689090a3a0eba05af03893042ed3f16e28f83b240b46c7193be1d07160eb6cfcc992228617afbeb0323e1adbcde082ca27ad26a0d331e654b5c01dcbbdfe005490abd1ba4d6ab5d4c46331291cce9668da2924aaace9715752cbf672a1bc41aa495e2dc30dfb5408619d8eb464a3721a446d255265b28958d550deb27b49bcb4aeb4bd07e1620cf56a605779dc8be6891972389cd9aecc982697c9232b3dc7d74cd081e8bff392088e27f80f6be15ed19bd0e665e38962e1d205a71125fa66d9209885fcb7ebb6eb4f1857db900d7f74fe2ad229ea41ab9d621e3a595bd450806e90f5060a07e75eb138275d014a00e130a1dc3cd3790bfbe6052cecaa3cf24a99cabd2ed766d6d35c85a140872dd0f3f73a3f478237ade8631b55f1ed981291c68d87522bb161ed69c895f5e6c957a0550f1517400f63c944a065434bde26b2f3b53f1ad99927c2866b786eb04d0fa001cc9c95cd242c3d7978deecb66c09a3c5ccb1725dd9a02641e24cb074498b05cf32c9bbf88aaa7cae57739e92cf878cadb6db30540ead5df717587623336dd289b75a657086550952050a7c7198d6f70844e6a6e0f7cbafde7680d71a4e48456c9f5f677b0a51907f3d9d6eda6c88f59ac2e6c21375207f5d7596081f1ed359f22253a7b8718ed60975ed527a5e203b560244b44aa07b228626a5cf52411138784bdbc9ebd7a12f2ca01a1b4696812728a0db0f0a2ee46c59a6121ae1716369fd539fffad68cfbd6a111727d56cb0a8fd09e02fbc06862191483f044e3e44e3da6f477754a7e532a306c79bc6fa6e246bb63f54645c772d3ef34c14721885d79143eccb29cda73697f76f98a1998b1c87cf148eba605e0a08f78691fcea56d508a6c830621b296175b6d69dc4554138d8a74963ab9c7633b4c2c8a55a815c1aabfa3289ea14ae7ffc3d88e4f0d322189825f937b01894792fc6ffa8e062e0c4858449e4d8eafa564bece408e00d5af0d4a309a6108ab2f2b4e6eef57cd83b94a7efd1ad2eb172d30eb756d115cd93227120cf4c127f9746becb60a2a57a71b0375f4674617d17daa12652239cec35eecc160473c0d05bd7d7d3db343e7cb63d870ff8b912df23e05b1d859df7af469e29e5ec53753c12eb8e3401bda4ad2ca5b2893c12b6be3385773e1fb450d22136944e4fc7e1153deefcee1272a73898f7ba7bcdf211c48ab6b46acfd9329dd10689a34666725d42fe10eb9d7f478af42a002970ddc4552035235852cac86a98fe664e202fcda996c23debaab586ae74b546888ccf05fbeba38c24a43c79a00a014d9186fc4cd1bcf223a9b15d940d4b85c01d0a5c36bd91993006d7731eaaa8afd01869c10e2f682133c72b011683e5fb58491c814f26aea84c3d54dc1ca32ed126c358da5e29899c28fe804cc07928395840a42336696ad9764d1427d2aece2552b8c4d06c4cf5a0924ffc6f0b1ae01cb31ef94192497d982753a89ee5a1886d866b794239f8792bdccf9f28b63c113762bec7132ea245219c7b24a362f7f162fc6b57b79325c70c0d0b09f2a3a41d40e144819d15a7a1ac52a35baeb84601a0b3c08900000000000000000000000000324c354bb5a3fce9937acf99646837d4aec018777281ae7e0cbed89045f27f4abc2681b053e2aa69c57eca8a5a2165ed4c2be8f724d7c74e68f267bb6f54469dd6b16154a9e3534a4aef37787a84afdf6e5d407e8b2b7281882fd52ee1a92b5d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034911292aa2fa5072992cb8e95d99ae4428c6ee836e56bcc0d98fcbdb7269a7297f4ef11692b15d7dc0a023985604411af1e9da361dd2ac0a7b8e3d7bea0c278c6c3a0aeb0c60c52d39a3b0fcb020af4900648c46d454776808a3c988a3cbdc06c92afa2fda3dfc3c16dee6606b5cbebfd51064b6ce24d28973f541c6319ee2f0220aa04477f112b4aff981f63eb4989198a0b4a691268aa691e797b4605fb650c03110e71d85cf6925db4cb49116ebdbc67a6d742f359c6bcea3cb2d900cd535f000b04c7e132f0f5cdda3635ae59c3d3012759d297c51e04d63ca1bc2d0889b281cc1d3dacb9d00f4b41b3cf4f040bd656b76b9a95df66338d09f840c55bad9add910329d291c4f1480aec2ba7cedeef2b87973a94af42744ed2ade43893b81de3022f03262cd130adaabe77ea411c2a0b4383523a52b2ae7c675c437dd0102f7f4308150326c9351bebb29a361334043884ec5f1a0fb3b3ca07154454b9b44aa548a12460032021c6843eb9db11abebdc4ddffe22ac602339129898968f06a6202c543d7d60030db7d9ef9e0fdbedf00b1703da03105c1410eacbc614bcbbe11523389395a278d122509d78f258a0f41f1b986c1b73a6327d9306953798626bed1ea76a1afc71e6b45be746195038c920b86d8f0cf486ecd9ca37051a995e87a68297398da5fb9030fb89c9225b4a2cd41ad10c7ccfaf43fe65fead53f05324ce8a251ea87c9f8310e6e2d84bfa8f4449f2555635152b6d3e178d71af8f2a9457d3432aba09198085f29fe6b045ef04dd850b9f9f92dd1676c4b4d2385984e7f97a9ce06f920efece20f1fa6e606ad9208766b29bb53356c7ad647bfd0af9a33a76438fd3fa62724aabf1df6fe48c7c5c62020a68432096703e3472c07a5803d49272a5c97c6fafd76d16c4ec56c24869b1e2da056e5348a9be8ff7a7ca22b8cd56131e1d6604d83250d7c0d4ea4a78f39a9a69ecfaeb173ee43eaf9df2e62338788d634e592633ee98555f7d11905c11edba8f5bbfb84bebd6921fee9a61072ea501f958079b4e6ceb53b991fca984fa08731c1bdf5abb008f7b88515e3b53f5acb419f2642200cac5298a9238ca5634792f72074261648c6fd64489d99c25f3a094c38f7aff359d92f4624961793ccb23cbfcad4f3476a554a69089c675fbcf885aac7ca742625a91edef72ce4bbd0f66b8ce561d58c1951c538861afb5f54d11758ddfbc93565aba69ca6a320e1363b69465258de81ce2f17588b060b38d3641d8694326d263302cfffde63834049c0b20041ca5b25feb8855330bf100483b151accdb40ae7d322932984de3a5cc535e22893389061d538fb972c4a3675347952295977feb235a17e3e21e314bd23e84b8b34d52c0249f506cbf78c1050f08bcbb5ae484af7ac540ee82f22e274e2ae903976f7a6ce4513aef01c3fd5bf6116a15fc27773a7eac9bd1476cf7897719959051424a82c5f31c815309320d34454a43847c83af07e9691401ad0051b39d1c26705480f6205124b54712e975a028823ece3d5e349a85eec1a2d360b54a2af95ce9fe418db525ecfcd0f066a6397578accae3f442da29c3933c238c572955b4cd935c7ecfd98f95561a228c8dccf60cfed93c694a15bdba1142f2a0db3d6bdbf46d0efaf93b5ac2792379a489e25c48d511e5a679d814bab2c39164c03ffbd18afe61321a1fb989369b105313bcfa6796f90e302893937dc0bf322deb0c25224fdace6c0180013ecf05006b22feaf91f1532729fd4ddf00c95de36bee33d213cf3e604836bd2202ec06a99dffab0c7649cc6edd8370ec3ee4c9505132dd2bfe267974740e67541538b070d33968bea86c66f3297266f333cb7bcf8c431c731c7b840d78acf88974cb2410d567cee8a7edd45a56e6bc5361180b8cbd63f4955d2e791fb270524adf18590d96fa8e9cbc7e6baa3c353b64dd8b1f6c3b1c897a0f62d2ae51bad28ba58cf0cb995ef930983fe4607374b4b140dc29705ea09ff246c85ecd1890d0aec00dcd43e39ec3c5bb314a8bea8c127a1acc3609000344d8b59904d7e29bcee44e81cca9a7a2bbb8de4e0bfb923585163c1ec143ee3313d597cd1d4367a9208e3e229b5965f46d24b4548ac23e8cc669e1018ca801ccd8d2082cc08aa878b8e8edd17e99d1fefecf3ea73443a76fdaa986e837481b7fd75ffa0400c33917661171e9492930118e30a9a4a14d9e28de10cdf1d61277da920ff1aaf31ff09856de8313e9d72ec13888b032ba10c94efec4e2237d3a15572a5415b12b98fd72238f9191a248d33c5e8df61a970e06a473410e46b4b94f44a12bafcf7fa7f51ec593a1a3caef62b49c96c626c50dbee5348796888d43c483b83bca407d313802595c118b937e99d82b619efee460ba07a1643fa9d0c976c11857bd0324ced7340201", "5151655351", 0, -1242455307, 1537743641, "b59e779a19b18a3e1b9e1524916fd4e60b80b61cb0639e9a4dd1f2ff284c861a"], + ["1100e1060115fef90479073c9896fcb2416e0506eb0e1203989899eaa3c56b2818a375353400000000076aac53656553ac93253243013f3d88000000000009006353ac5365005200a920dbc903000000000000000077f1770300000000a3d28d31805f55764215620606bb7910dd6f4950cc42ba6ffa37f9891f348ee8fed11d16b593e99b6fc9a44e78a4c8df482a16dec8c4e667676a07cc5547eca402b1e833656a7ff79dd0e3beae1b3018ff60217cde2474617e5edea0a4d38aa2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004f2546dc58b75d5966b2a75baf91c2211792c3945cf9a87ef07bd7cfb268acb7ac68895e5a35f7fec02f77e24e26a92e9901b108311bea736fac5d69b1ac6bb8aba2e368eb154cb2c2bef49f88422b3ee573a5dca5bc9943ef0d5d47cb8da4a1b1dd9ad4bf786155cd51b68810b9530b3ae512017968aa93bd1118d68dc8444603195200618e6634145dd9412a1aa5665c72b35eb5a4f3c6c960d11b91daf6fe3e032019704a53857a9e6c3bff4d35308b1054fd597461d1ce9f442317e9141e264c0b05bc2654c4f8a1c342373e33be787cb570363fef654c6d24d9fcadb1ce44f91bf20b91a0ec6161ffabe55816c3fba5ab5f787af811a4e0f64f143b83781b668f03075b5f83a52acaf5c79374258791ca777c4d3dc8aca8cd5cbbeed34ad70a4bfd030af4415ed3638dc877b32a37dbe39e19503e05466a7a6bc78e9cac3199ffd85b031d8851f75a1b452067d1df4325a00c85dbfa0b49b43cbd5d7927b6269f27e3010227e95041e4008318bd931d0d4400830ad0ddd17339a45c39b3d3d86ea8febe830328178fa65ac52f13b52b738443c5f385554c8bc293addde82eeee51aa5ecd3334daa20a3b48c3dc82cda8ed02039f1abae00b849b2d59fd2eb838a406e928a2e23f0cbd416317669e6d1dd864f4cfab644525077d96d99b1634f86ca18b28bb151f34929494ad28752eea766da03eb094f4827b719a53fdb818a5d9815b83bab78255f7555752f1d67f63dcfbe1d295949798210b941b2cd0e176f474dd0fadad147d4ac10e3a51901f1a6b2994555de0917f6ee515146de039755b695cbad1f978c0ce1b1dcd1f4c1548d8211411df9d179b9d2ba5a7605d81a432f0d3e632607bc23ff82f4a09d7080dd79ad849510e055831fe9b0f5b7bd24e7aa0e3601d6aeda058db16bcc5cc053f26ec6ef992f16231a911b9bb0e78c712b6824d8ec1248d1d65e200be59f4cd76683c76cdcbfcd27e940021b6744c1b72b4cd6654acec07d0aedd41b1ebb07c7787ecd2bd510ab8c20e4e616ab53515b6da27d4b5c13b1151b49832dc1c580a2b596344fc8bfed380509dd2fa8817bc35fd5517bc1cc487d83704890600f4787d2b97da42948bbff2e252b0e5dc4a7cba082e0d418a1211b3959651af2a501b7d07679cce60e1a07c3217d8d3d35e6e804ea9140db9607a25921f7081cbc06f222ded624ff0150a4405dac02f544a1c86a1ae1227ef94f746a2c7bc99e414a60f88c9a66b375e21809b8482062929b4f7f4737a67646dd99b275dc6da218c13a337bc105c176c777e41997aee2718929d844c82c2c5f59d04eba259892748cd9f2f7ab86a7714acc84c1137f3d67ca41c32b39fa919c893b5ad17c627e6693d7513de6d41eeaf0c1a49017a0da34aeee29232288058e1e21e212164cb14a15cf825844018788779dfea14c5e7cf90a5ba4ed49558ee0813e897bd00a4114121c74f262a4ab214924dec6c904c793f56880e136b1414e7eb73444cd8ef6db742a02a349ca711126a1a2b3921e098273f5a04f4d36ed6559a95cc4bad830c71d0640973c1fc7b54f66be553ae3ce29df681396f649bd6774b0db8baa3694b0770ee663311a11702d9c29f67e9366e35212e027db7cfb1aaf5a5ff4a19531301a67d18b234bd8748dc121ef0a3716ea822ee18014356f0ec02655fb58778f9276c22cf8642197828e2d418e99480d328ddcbb87803b4d93300aafb64241d74bbad08009f0c9f6167477a42067c41c5c0e133b2870f881f1c1b3709b696b48471f12020e14c35fb026448ba722cafd59701138ccbe46a2bdbb5aae1a35c31d333223611d4468643f75f357b934e211517d9ed268baddb835927875a07da2a4ad57c197e920e029dcf210714f4b8fc2ed4a4bea90064b3d79c227cbefccb8e887e3e816ecb461e2875ae115d618c5d1d4c767e409af4b436947357cec4839925cfcc108c9227a77abe6e724fd85b660410da28789b09f53ec0c1b9bcd7b49fcd25e02a245e18a00518b300cbc40d8093b2098b05aa008fbe61fe5a3475e6249933f03f1b03fa5b71bc0e4db90d2b044432b5c94ece87d8fe1061944472edc944e44df59cb7cfbd27e9a0953a39de68420535586cd45dd0fad285ef42fe498d8eab1aec482276fd2ae610b469ebf204fe5a1d647680558668a708ecaa912938a9e30db1b68bbc95b2079a8c19d28829fb60ae23f45a4245f57d456dea43b43716a716afba324bb7677d0d7eb0019edb27a679f6170ded95e60c45361d59a1872925901e76059ebf30dcf31a7cdbb03000000000000000000000000662e402e9bc5f786328ed19b10aed9cf2635ea1fc37a9e6038e4253fa7ed995c3483f4cd46d264c5e88a95802bd0b306116232949cc0382227251a484b77a05121fcc23dee8c2612aac096c8770ddac0ae6d855ada28b77ad3ede8e70ee8dea800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e5ce8bcd326874214f347886fcf59e6dbcb91efb6098a87007d712fc67cb3674702ae8dde61a03935ea90c0ef364518c2c7d6c1f6981bde23cb107afce0b90b1a84b0f6dab3c479e17ab3a5b57da5bcefb8591fd5cb93a7cd17a311deec55d3739ea3bbe55319a384cf2929ff85d984462cf8238c817bef0d52a4936a3dbf8240326e651ad7b6fb59d93d72f340bc14a99ae5276f617735543d1e0bb24c22fbdb202202f43acbd5afa4e9eb03f46b1658d8d71583ebe98f7fbcf4ab3f7801bc50b050a08b4323fe6e7add2c909f09760487c5d77b8b53ae99b22b76921f4c240105c98cfb43a61bdf78426965f8eceb94043d4f04a38aade5514d3e6bf92f87ea4242f02151556bbe769eb7009431ea9896f08b93db9fb7cbfa6f9bc6a4e12d10d7b7973020c811a2ce6d7940fd503c108939a672901d664eabcaf5eb68f5ee6b2a37884dd03009fcd787df37d7ece59b6adf9885aa78ebe64900a16653942c2aa431a0faa02031a385c47c9bb1c5d13b5b3ee540a46041ceba4d70f62a7d37b97b1ede2f028f402176ccd6dd4fc2feb734b139e3ef1e3625c29c3a006d2e26bac167a98520baec996bd3c50988faaec9851930c5181e65d158458ab2b247cebcdfcace2af085c452adbe479a716bb0862ee56fcd26d0537486924de1ef9de885d3eb0090003d2d6ac143791b251d67d7d39e565fb14286426e400a473d5047748ccb1e70f01b3d8119d068a49a50322bbe6fc15710eeb40bd2851b4ef66c8133fabfa4f81c708636c9f84b39b7f5b42f09d4867485a80dcec2ea688e1e76d1d059d934a0261b42a76a0b05c6ef948e461137b79f0cc155b7419f6f7dd07838bf46700a1cdee9ee946fe0afac5c71cef559eaa5cdad7f0c5ee5baea1a601f8a1af64d56dfe38b56fa052c52076110412e79ad168db07dc55f62bc3d022aabaa95fc32dd3e90161e1f1cd2fcceb1cfdeca207e02bf97e06868e8bd816688a0f67ee6f9e68aabdad369ce740dc3b8e72960c1d1b51c88aa7d3691863965ef4952cfc6a3c4e2507b3e4202533acdeb05384c65050dd3a7868a6734fdd7024adf5bb7694aaf9b4ba139623cb7f287edbb976e73c6234516c77dfddbd6a726ec1fd4e2b9c47600c336d5b633dfd3d7686ceb92f20c56ab3076d451531a46fbc04f2effe512b72f9ffa343054ecfa1121ea6ef19533fb0036aef788f2e0e2cc04b00a7a1cb9bd10c34cc9851e4547d42b08b9fc16ac07a170a0316e31ffac92182e4ad433c4417bb9ea172ad3dfb618e1453a90c7487d4d96f909376f08b4c765640ff08f8caf522399ff385a02c16e7a36939f1e44df7f4caae9b6c62ffd7afd1650a7bdb2ce0d4105c791d305ff3cce86c7b2a8ffd8b48bae9435e80046ca7f29b062f6bf5c1b7aebc48b3ebee8684c3bb64e4f80abf2e9b200f0fe8e0d33ab659a2eaa35219e334e945cd25e8a23b97017957fce5e6d1859d000169df2c6dabf7c0dd35fe041b4df70c459e4d4fb6647b8b0166ed532c817ceb90bbe1340b97c427bdc19fa961a3f80cafa9cb2e571754a87f05c41b176f70ba4fca6f520fb56bda79b4bd1d772d94e5e86f6f249e989572deb9bb61e79c2bae84ba2d96e0e616ba940781f3648ac109e90aa12ffee938803d74bc7644440adb4119185165807a4c763d7f51879f604db0f32ed5093d4557ac010faee8c14b43ee4c8d803e82a86ee905ac82f6858ce5b61e277a3fca159c2e97941199d2d300f7e6828d5823fb94d4c352fe4dd2d7ad4f6a015d739d602805a40e541bac0ad5960fa566c51ba7900fd3d15d8b4afd87c82fee3e403acb0b58bc3593ad5ef5708a8694d269c20b217961fb098de14fcba8c0d3e8973f042f269175197735359e2540b4cfddb3ecf88cd14806b431d9b773dd990f47395503fc893c4aad3c9f9c94134d8690eb8230789fd60cb058ccad08fbabf9b5e181425f9a1f639d436a17b6907049085af85289190e47f671d7bb3580c4e86c12a4ef43648c516776e39b0567593f6a87966e571bf19723b69420f81a06e5623e0f6ebdb519c33079d49a9a7538688d72f70b6993d39c9895363b050d5a194cf3736232f5dad253e853c0dcf8470f359dccae658adbc00eb966b64e5bda669b1700c0af687626b95194ae86ec1ad5c36e30486107ef155e42ebccd25859dae7eca0f464041720f792a5b8ad86de865af3c75dabf0baefb94ac4134a7b0f404e4968b8113fa492543727cbaec83069e3be10f02917b91ea02a747f8e08b2d360c24295087639cd09c436f3c319cd960c050000000000000000000000000138b09c7794d5fa3de6ad420cc1f9353cf55dccc44bdc06f25d001eae2cf7b53a8dffc83c321a7afe54a044c0e4d795b9c1697920748579d37d1f7f28e5efffde6588aae99c4df71f65d2bc55e5b75905224355886c9cf438ec5d24c865386f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005dfcb3151782c188f6aee13306684616610f3fbfdfcc0efeb4fe01583de0a9f666de7787d2bc4dbd02ff5d42cd6307490113f7f4e88d2835ed5bb07a72010160b430ec7753aa902f35f3ebd65c29bff3ee252ce77a5b04ff30115f116a623851711237c622d09b805b8d030f85a291dd4a9819bcff54f4d4a4504eb7fd27f7ba0301a922464e871d5efdabaf4bea48fc55027260d337105b926d0867527c38f747032517fd886546f7bfcbd35369901bc9ef9e6e6f5f9b20327a83696978099702710a01e74f7cabfee30e07fc494327ce5282020dabee2043d3326d977faa8a1b94d5b80d52eadb6efacb6e38dd20c9f55332ad10a7dea98e3200d032797d2963aa00032accc1266666b55e9137bd93288af35afbe0097749d1e5791e197a2a3b3637d703125f672958f6515c74b2c638ee016d540192fe2be7cdcbe2bc54785b72381ccf0307eebdf84de2f3c7522ae58ed9e27c5eca6b70b975f5cf3b0be39c93525c8c9d0215a2eee6389db919066c5dabc20f4f7128f1ef91553f8e778cecc1dabbbe68c8020cd3771c6dbd6dff1e81a14b90f4f57c28ce70450c6c2c69c89f10226c44b4ff66ea4a667cde89f0e9e3b01879182459a48ce0f3e1f86a479daddf574081b9a47883a0bb5959bafb2d944c0fb03ffcf6c5f0966df9f9a9cca400e829db20b8a25d879d7ecac8c97e48796867d7c810d2340ca0b65731eaa2d2896b9d5475fd2e40a08860301a4dcc69f796e6aaa6560ba089199701ffea5b5c03129072048361dfe586ca7da0d7a6148c5cb7a74e1e8d7921dc8af24794645bbcf201d48ffaf8764f183e0cc05b850b689b78f0a21c7b319547ad52575d5255df91e6c29d4c76f2e9b31981725c0cd72a95ff8fbca2cbafd2bf0b720a2a2eda3e44ca136ca47bd5a552a91b26ad4527fd55b1f8af411ad95794d5ffb06dcfe8180c4c26d71fb3416f6673c20e6885f7311695d0490e714132d475061abae2d170458b03856cbc8b71190d08d5ff80e337e97e0e93106f618f3d4e9b609f767f0ffd28f911c15cb3a8e5a09e313fc307c174f07fc94c8aca77aa713fcccdc38e2345cb3a44c86a6789f977027038463a3c5edc79667e498de84c7bef9c1b8da0f677ac0e2b1678fdccc96fdb3ea67791a3a8a735d5a70a34928ab1d84469570925df026a2ac545dffb193c7693e25cedf07e672ad96104932c6a65232f4772de44892cb98a770760aaf71abc9b2005e9d037ede71921f9f9b86651f222d5425425093ea3aae74a6354bffb46a6443b6eb2da9e78db622675702eeda3d70fc5b62227cc805ec7ccafef7057ceb58aedeec85decab557df9628618a4c7419543a830b541a92e218ad9e6ebb7a63cd68069581db58ad17ca8978dc7216c50cc6c6cd87118c643489d55921895d88e47b1535293b72a2220ad6c6b471b77c116b75225f0ad1b8cbf07b57a9d67fd467bacf2a453401c055157b30052656ed0f9f19e04a7b2a3e30fdfe1b48858b98de0e10649eaf2df51fc0632b20dbbe0bef67fa620882208c065ada663dc5198356cc5db3ba8186e2906e99df1746b786dd7ec885e3a4a2a71538700fb8f06e8013102b4ce60971fe387762d86e76ac884a3d8dfc4979fb176f71d4bd8a1235eca5c9d3cae1509fd43c66137e0bc48e2a905e2f01648106a395526e5f7146626d7cb53d3e8a1d1d748949d1eca75a1aeacfa97f3837d159bdf5c93dbfe17870240a87346ad37dbc8b512eb1ef75dee853adfe99434be8ceee527249eff88ebecf7ccac8c0efd2f196cde255ee1c2fc3c8a309ad019bba16ede96988a533b2cac04cc29d7d4b03d3de251e731a04a6027cadd0320974912f7827b3268385b844572885386ac600af381fdbbe025870b33e603b4d92cd81ac2a3ba000413ff7df17318f6e72c9b8601d7d2bbea6702ce3157cad8ef1f863dff201e9b1c31e42bd8c630c55c7d22431a56d8921348b437612148f9ceb8c5c082c2dd7f547d20d75906e72385ebb93e28efcfb1936fc9c989475f17dd40f942f0ae48e6da6c53723b9e5ffbc5665750b9ee047f593b2c0c5f533535cfd34773e33219fee613fabe4e36b5b05548ef837574ccce484607bbc6344e1cd953a2f91836af92ae1bacd6669a14c4d969d4e040f5fb391e8429a48eb6ba13ac4f304b12eefd3175df1ba5e0c55349462b263fe8b9de8a1b136592f1cd9c52b3c2bfadf2069dcd6f9594691bef23a28fad82e0d4b03793a10c4e7a730a48a009668722d6f1cee9af8311b047ecd1cf77e54c9d90fce66a4ebc0a853b688d01a8a1bb892f063fb3b3e7ff8bcca64b41dffd9f3fc7bc30a283ba57f212b75686680d44599121f114eeb8d04b463bc4dedf4a2f95db866d50ada3b20f0dcc50b2b7ddde34a1154701a5f6e3f395c200440eee67718f91636b820c", "52", 0, -521153239, 1537743641, "dd611c3a574a3b11beea8827c883a3ca865f32fe3602a6343cd7b27cbbc8540f"], + ["9172a3390248debad387849f7135a83d84cdcbe082870630911dc6d5308f241d951cb5311b0300000008516353526a6aac529703eb94b0c1b57dce4766ca49b10ce4c0a697c2671cda22616f5a9ef596d02d041c4dd1000000000451516500fb1462cd04a194df0400000000056351acac51375dc802000000000753ac6aac6a65003ff95c0400000000036a53639c749c000000000000ff05f21f00", "0051630051", 0, 622476469, 0, "0902d020c4b4e75953319d73d972881a42a4f87af193b962f30b32e1e4eeccff"], + ["030000807082c40302f216d6e3cdd47574833e40c4fa00e7f8f12a33cf66f75bca54ac4a0baef962f601000000055263ac5353ffffffff0d013f1f31d639a653f31db70093b8ba2eb9d13f699bbf1bae1165758aa2013900000000086353516aac5263acffffffff025aef47030000000003005363a109dd0400000000006d900e2f74eb579302a7fbd803000000000000000000000000c18acafc67516e7626bea83d2e0bb5bb7bed96043d69262c4c3fb2d0eb31e6d11af153bc03e440970fb0ad3e3d830ccd2d7ff6cfe7c97d3aef8dc5e65e293f15cf760b0810b5ab6593279b4c15936a81e600dcf8293af48d8aae383cd6ff54f600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000358a6b6746f7e83bb2ea7f8367651ad4721dd1ba04422a14fcfd90b3f382fa5f7fcd0ef3c58d2680fc3a9235ca017c6e7f75087f3adaf9397bcf3951d47953908d3103c49cf16562b2ff154c01d63966462fab8f86d3d13dce1777fc614821b8f413d9979c52c4d3453d9e453f2b22a121652fdc5f6b3e4ab2e918c60e429ea4030507e2f134f60d03c78a4a53ebf488b2d0b376d940ac8e5aa51e4ec5451e21b3020d92add5eb6791ed15a57ac4b9bd5df5c5e7c08a28f3d8c21684a033385e3e580b077d70b63b31565bdde190b2089f41ee6737d92e24732248d2dba5a35ffbe6e5c17074714c99d08e9f2457840b98bfbbf9336bfb0bba96979820e82e606a76160309bcaa60ec868b5366c9621646f5c2d884515c4469463b84ffc79abdefbe966b032238367a2553f16d5a31aad6481484e9dbf8a3c258fcbe2bb12fdaf6c33131ab020fd66bf51197040ce92698a006a24a1b23d8d9f303854aa3c7537be6e1cf441b0223220af4cfe3db0d6ac3797defe583e4ed1d85bec22765f054c0e4dc839481ee031f5e26bba0701eb3c728a4f5725f7df96745fcbbc1190607c0657538758a8a7d82badaef2952d11cd7d23c7156cc8bbe21de46a67028b61a96acd13170ccc69493c859d8bb068634058f2e3f68502ef6760b001ceff4449e82b35ad6d7df29a11291437eb69389a1c1064136f56981be8f40f00c5f3fa37863c465aff6580152870dda23a26a7e8c002aed0602eca26e6f49212206e3a1813b1efd5bf13642f9a59effb0ecb33026f631ed9464dd72cdf8ca7466fa2fae79347a9ec571cff04eccc3a63d417c4d8dca57d98ddd809640e1dd5c44da09750e2d015b14647d8681fd1235892c04e532b167fb8822179c2c1ce3633c0ccc988e73ffa73ae46eada7fd6cafe2e648c856187dc9f31377099c3f9751a35c44f0a43462572ca3355ed86b99bc8984a329d392d2b17a3e7668bf8ce57c5f7bdf7014311127fe2220981d1f02d6aa81353cfb377562fe67462ff85ff5dce077fb2eed642e3db31f1c0d3901aba32ac544a38848d8ca7f9672035867f2a2ed0c1f17a171d8116e6391036d0783b744e185e8d255369820468ffdae3b441e00653f40b1f800be83b5da50ca79f5b4337de286c53ac79752a5a0217a6878697f619ff897af75cef20fab627797166c37befc07d64d7bb831662acb0bc7a4acab11588b1f7bd66b1626e8b4fd718a41f42063d2b257f63bcf78c6992fc7699b28b723fbb645c1fb8231d341728336977d7a3d6680f994402bf2fd3cd8680dfff2fe18c8523b8fafa9bcb8eb962860f7e9504496d4095fab9be9240ad07565efb24075363d122d2338ecaf72a6aa0209ebae275f37364b9caf5b7356d5bcdad797bac573f70513124e11bda8fa7351c83ee26fbe4521beb737c33b139348295748642988dc8daaac812c7326c319fb3a7e4893080db7f3a3974dd44b8635a41b847e70e45b13054e6d04f8ee19b9d5d5b2edbc29da3e04ba676ae25d1ddf3a46aa43bce9d2191e623bc075def3f104c7ad8fdfe22041cfebfb338c12f92a6b978c97498c08fa881385c9468b217873134688592fd9eb3f0a6ecd8dee7da29e1c781d5db2c2cd5b64d6ecc754b5a6859d12ff2f4af27673810f58a04547177a3c049d8f6a2c922f1336c6e86708f2c9d81878b46c7d354b21146693a6ab0dbf3b6627e536ed6e8e3ab766472f8dd80aee3d75590d400e70aa64f918df8802ce5f3d1d47f70d95d7d7669000394d70d6cba766f34537c23feeaf72d0698d242f5596a219bd9d2addd9ac1da22ccef2d0f49fb6687a57112a3bd97e91a471d482d01101e3f3bbab1f6e37a3c63a681796064d68965a08d911fd431077a8512131c14749db9c00751be3bc6233a251ef08d8ebb3f336ec061855bb23d1b42900332831da214c707b3a15f321796ef0de70cef6e7efb6f79774d8000d01d92f89493a7430b6a5b611c3d1c73a1e0945064484adae5dc16b8cf015b6b6c3e70e1d17895223be90833de940358b83cbbff41802898eadb7c113ade9134352caf27087d04c745620bcdbd02b5cd060a85ec2e60c501b01fa9168e235ebf7800394300c73c158723912386d1da30d9374f23cbcff150cec9ba4c2e09e3df872d6bb786756ea153f2bdb7c8642d4c4a31f927057075773c443ea0870927f8e76aac9076a599d78fc05e00ee242085f24b10e3673f4169610f693f51841668745448bc93ef9942a3588162aee36286e518ac9d601613623849bdc59d83a124d9d491c523900000000000000000e53e104000000009cf1bf6b208b50559497a31f91732fd3f29675ddfb5e26eea7f88fbd27a104ba36e3819145e460119cf3712a219e4ad5b46cb0f650ddb4418ceed268406c84d338a48ab153238c77e73181cf59f338701859d0df790e5ca98e4702330cb5373e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a3488dada63d2f5520dfb6d563d8bc05206565383f76dc613a094bcdc0b49914a771b7a7677d6ac9dad6c295db8a8f70df36f1e1475a67deacdea38c79919785645ff0039211e0b332c7ad4a9249380d700e45e3877d4ef949feeb26000c2b2ecb854746242b906edb5236427c7e5a4db63c1f63041678b2a71c9665f51b11a50216e3e151a20103185547cdf9550368eecd187f7408307c4eb1fbd20086e8b87f022e5e6b057456f55f9cf09051b598d0e3427b35a2c0af5ffcfc639259f83f82610a068a66f7630969db005142d84d11d6c55a9f6514e7ba193ee7d70c7ffaa5177c91b16f5bea3df5e24c54784276ceec4de6e6655032d8876b7efb06db30897d9203209774a1d02cbe50bd54aba976edb98d98f0e57e9b93693198b27eb0a140ed540309a1ccaabb67db479fe35e450ee9a063af5fb67bc6628b09f3ca6566a1dd4191032e5c82169d05d9c9d4839ec7935219f946941a1dbaf3a531a7c490b552cd00be030f01eb927e141e3461bd91887328642455ca5125429a8126982caba20bfd6467021e02f440a5615f8775cfc2bad35044acefb2a0027162d417190143e97dc609f0b12f01ec12f21ec8c03aae312d5e94f2f79a1ba1661053b4cfc15f9d5c909548320b3308dcad892af20eddbc1aaa770f2caafb9ed31d2c2c813dc1032f9dbb75c612e3fd06dca4e78efdf75c5965c18e4465cfe5e342d79279f4f7f6a0c1cbea8b376f243398c7b528f20f966d8401d5f61a9aac032d933fc32fd327b390f9ffbd05c35bbfdb5c8ab784be1190c02028b8f81902a73512a7372b5e91131bf924815ee2ff87e13b6d96f98271fc60408567da281cc136d68a9e3a06413e7492760caebc8d31c1e82c1e15238a7a7c33d2b91f5a34a7d5af298118227320abc216446e3bd5c776b1a6841cb8191b5e2d9d1b495b7b4270877e7da8f6e1b1eceba0274a14c146aac07102edbf83b39fafd7614bd115c036b3d156611ff2406ddc7311bbd0e6909cb5bc80ff0d430709f1a458ea880c8651d8a4c022ab8bef56a9f02032a9e846352ddf5647fd4d7eaa94e3b038584590bff7dc2b01d2fb48d1cf0e8bf6f0144b14b697a53c90dace5c5879b89ccb78bf9b90a20d7f46088034cfccb532901b7422e3c17f55f8df9d1b782dd9df4d6259bfe4c0e7aec3ec4df867ff14d66d697fd211d53f29ba8c7f30d05e94efa1396f560663d0efe8eb5ab8fa2375f674acfc65ab56f30472318ad8ba6f95b45ea402efad0f2f17f06efcecffa97c0194d825130aa88e6f36d3b8b6da5cb5bf6828473dc5a4a1eb1fbc8636bc5d62e45d0ab55c9930ecdd2fae9ff563d01caf6b32f5374cfa75d62c2a77b3f701a10c2081649d7e6030852d5842acd778b69b658f72f140b76e1598a217abd1d635765538109e876a2d49a5f681dbe9ce7641ee11248a625ed893884ce90a33714e317e6f3bfe7814a1c09c169acece2ebb4e8f88500fcdcf1d49e0165e1be146ed7a129e64b1dc1da58467c932f149079675590840a22d89cd0654cfb9717054195258aa55a4d85a06cb4db935111584ef4b1f1041faf71a3a0b8d84cf89c8f39e8d3ef6ccab3ed539a1fb094ffce70fa8a6572f5933dde2cf0dfe2d287dfc8bbc56c6acd7a83bb4a1bc82f399da3074626f7a4df11f71f929a177dfcc06893698a7340147a332719a49dcdafb205933a9230f8fa1873a58d08478b069163290b274366ebdfa17b7c99464d45690826a1bdd2b29384efb27d43f7f64182143c248c1cf196f53bc5299813cbe1619c422f8daaea5ed227df209f4808390d57cf16b96c69634a704310adbae2d9724f5cc38d702ff0056f981a07862fa880be65168656bbb233979d27ef55e9a6fa740210ce5f1e53f42ed3ed4c4aa23db839025a762d399f64b61ca7c188208eb1f7ecf8752516735ba7193e80b60ca4a8068dec563cacf3c6c9afd0986d781274b255338f643c961c81e9c2982756a8d9dbcc1ee5c3952a8423d91f742e9084f43a0427c3d7de9e32853adceee8b4389416854cb32972716a224a17f46544d8bb93681b07df1cf6be92f44ca0d90513394e56a6405a9bdec8c70d165bf526891b00f0aaefe56afc61fbdd2e6b04e7aa43a8f66c2473d99a520b166b4bb46d0828155d6f9bd565081daf402bc3c48706fafc94277b32c13d308038deacece01ba9bc4eab0281d0d8fcb0ad862db265cf0d561262a4250e670b5db52a723c97249870a98f647e7eaea2b35e36908b660fc60d502b51ea081aadda7abf647f702352cdf8ff765dcd3fcba83a3aabd8b8aded0be45f87083eb54cc514e17c8e734beab78e680cdb43cffa728087a2dbce873bdb026b41c5f2b35a5c525d84c525f9fbf98ea51c55f1355392beaedcddd280ef025e4e98153f161b98c7ecf48af29cd6477867307", "", 0, -694020789, 1537743641, "eb91b5a82c6db796777583705df2d1821b326c68b64cabe38a59884d54f56434"], + ["111f010c038c4294e4da4cb06d9fc7dc1d67904eedbb5e6fc173df1ff6fd7e87927e5bf7e603000000096552ac63000052636388e64a004bdca5936743c3c504a19fe29516c4ecccedd06ae9fe98862249fdc7d2e302fb00000000016565ec733c7c49f754562f0689280ffc81ecc8875b226f98c221fe2dd710c59dd7ee63f5c203000000085151650063635253229b6e5802249ad40500000000036a526a32393701000000000663acac5200650000000002744357050000000000000000000000004b1ac16b7a37da77528b1fe4fe2bc8eab61f9930e99eef1d8fdff92b16dfb21a72154e0add5c96842d1cbc3d0ba26c2328d73a1b56728f9ec27412895edc6189749f16aed63310662b28a45263b63dcecd62e8296d5fe968c82a86afa90804ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2878aeb3d3fd6fea86e2b4670e34f5a338a3e01ad35bf43e064ec059c24af46ca56a149829e5e2d5171e95c70c987fe3eba69f6cbf5f380ac7a8d55213af86e08b3f430c54c70a4c55cd51f94d3cb17495c9d6fbc70bdffec08a161ec09b31e45ba24b8366714a06331f1cfe22e5683820d10a60df9c4bd1b69c2d439f7fb0f0202a68efd9a948501516da64308a8a8eda001c12ad09f3560902d5e81551c04ba0302727ef106116d4a5a55019017fb3081fa1380e0f8fb8a2346f75bfd1814a5f50b001e891a54b41f05eae416bfbea56707d85db34dde04e7cc59c5cc97cab3b18be3421a8a504a718aeb2c7aa5ddfb3f828dab0fa5737d8666960767da5810fed702134215c422e958dfdad54c2a65254ad244db65b4bcddae099b6a7e6c2bebe3b7021ffc157ef42b8cc0d80d5ebd85a7208cedc4b3af4b46c9ee6b7419b886c4656a021d1e71be65aa582cbc17e3bb9798d668d34143e8ca7e2b6b1fb0d75263178504030580d2d151897f403cd5e21d6b9a6f2ddafec8230d7f86652c08003078c37a8a020735e9cdd068706771a738181d4c459b7ec27f0dba6acbf26e39559f11867de6e85f7fcf25899449f8f6990b791528df57a00f479f486a7f7b8c2936437426efad969f71ed78777486bb790da0252f4b64c32e5a847b456050bfcf8fb15390a8d6e756c2f974dc671d510c6edfe122a02e521859b455942aa54ccbe1c02ede62374dc0e203842de7138d2494126781b97aaea44d7a09069ade6bee1476104b06a796aabd95e97d9e13db960c2e43770b578cd190535b3b01b320511792c52b231a66c1a76e4e49dba99b5e67d92dec21c7f33b66d2326ccc6a2fdc7254d2e0daab33aa59ed6369627e1715a429b802af1a01d997d680b1855dd0b0a6cfddcbe6cf4f421c53dba97d63c661265f4b604db0b03b69cd29fb1381b423533e514dc66f1514c4322fef2687992b6aadaca202ded7d51f5d109570d07f27e5075788ee0b310b886c9fd62e451ed8670a18f0f6863b66e1bdd87f8d257793813d32634366e887c5093340e8caab1e04984e662aa0a56ca1db6e6e5d5c5053783f55710985a7a14878c0d92c4bef49cc6a31c7676cb6c3366f97b30221722064a2d65257617dad9159308f71ca9fa11cd2d822cf2a5965ca759e0cb35eb65ed19cf38d67d8b939120248cff48a4e6e9344a518298ee3e25045c2901f2a4e0e5265dbda8b5e3ee84fd8b6f933c776d41cacb3c35902b6824792c9794254eb6a496b7b860baa399d7a2740d8ae6622409789303972d6b42aea7d2f7d7860f28ce3eb449b038c68cb2701b526be236d0a8374950519e73608e4d869bb497e4740998877650000b8a5c3da062cf1a1e75a0f0d8216d3e44cb6470d3e22dc55987709a6120e11994445f18d6b5c83f29b8ccfe3f4ff88e498727ef13fbd39077e16fedb29a875000f687586b8bc3d8f610d12452552a6157ef1251798e61febb1c5dbd652b1dee84df4bcdde60e8fd2b78b375fa946595e74b385f87ac9f9c0f118c1f2b07d25e57a27fb473bea3b042377b7a35d2752f9167680ca4269112896986bb08f40bfe4ea1d83c1fa0aa6138de0fd6261919b0c82e1f0191dd13d9f074d3ca4f0b77ad4023028b566268bff211bf35066a17eec2eac9ea990ffdd9e2491849d1a13a61b149ad6de9c4b3147f37ffa1c2d7fac4a5702ecc4948f31cb0a41886c5f5b314d0228a878bb4aaa41919f45869a95387d2f8e1ca5674a7e987902be60b91bffe0c1a2e5c55a2130866ebe36276889cb1d1eb461fa275e798fbb41053ac6ffded7213ac44457389e48775ed39d787e4b9ab9f72972d7487bbcd8cff0ed36fcdf7c9c12bec8bfa6791850db5b59422b8d2908b5f7c36146920cd21f24ea1e4c73b4c178dbfd3d6e56b592ffd93250e022606ad1fb3cb762b8e47274cbd58b9c48ec3cb5b2647ad80c289c9a6348ecc555e257d9b863665007ac439341d79dcfe4dc6f6c4a8c4be28620d1e64cb26aa6c3ba6b9dde06b7dff73a066fb9fb2896add35130c7bd22737bd2aa0f1d778a9595c2f8fd91e21b08b441884fc4f2295bfb65eaf581cf31c24a0724ec5cfe6afeb7ea1317c339a40895c20c1e5fe359bee71cae588272ff9fdfebb35f5a7939e3a446fd34dd389d94a9d46f87ee9778e49069ee8f40ddcabcbeac1a716c6463b218bcdff59f2429c2e8ffe933bf9e5928cc8d716c3e6a9833c36defbd3efc6e0711e7578c0b5b7922db2c0e15cfdc7c9b1494cd2434c04f46d68de0ca0c47695619d7d83ebe07030000000000000000000000005faf2549b98320073e1a4b451769fb2ff4776be93961cc76e57615b55f1defd23e0acf78019a7021472dd5c9f30006c360a47d204221f17f9761a7a93a383d67a0735e19ceb0d8caa65b2ff30fe04860577937774e0fd05363a32e20d8837f820000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000078ab9dc457db4cbc765cc230f4c7bfee6b20f788a1241767b8ddd9c6828712c2adf985d45b916e21769fcea079c8081e712fd0ba6f0d665a7740a126e671da6a9572d54402e55babfcac51bed017508a3f60077dac980ee551fe47864cceda9d5e5d63db816e29540e0a8fe0c5ce1f136770f2feaf0a65b100edaee1f8aacfb4032d50f804ff0e262ca859f8cea40ba17ee037cbf0b38b94618c0286a8e9c89ec0030b2e8a6080d5380b076cb70d476f2fff00f991912270d81ef08b4025376d208d0b035eac35904e3e7586668ce9af2d66d4de86b2f12df90a59d4c014e335c417a1d80e721bc4d35777ac0e8c94d5ae8716adab1147fec5d9cee39500162cb4b3e803025100865c09632324a3785eddde1dac3ad1b8be69aafc01ad2694bf0977446c022fd650ade73cff124fb0b727efb66c7e3c741a0ae6e0ebcb9eb3a377eef963ad020fbe203a1f093d1c284aca5e47f54431bbb88e7b9585bc4814981f7a942f6c30030dfaf4fb530f24c32a19c13be12dae725741914e4fa93494de554874847acc20030db4c17fdcda6c3e7606f6b11b6664464d252126f4b0a401477114f5d5e353b20e68de48ddc8f80f497bcd327d6a149cb404ad0b86d948ef03952b4dbe89de7b4d0167ca7a4c5631008ea31647a78c9a09d36b35ab1eb66e08488d4a71b7c9208a929420b35ea2d520c6f5ebf8fb3ebb05d37411852bc6199438dc90ea4ae157754626c6c1adf96186a4822c049d7bdd69b0d084f714712594167a2e52d2dacdd736c5719f4624b16bad8ea63137f3ac6a0a02bfc79990204d25f1881779f8ee5cf3a6ba9f9190eb2a77cc205e43b053f53d76abf51728d4134d5e790161ab6c199931a4767b1464734db0a3198e7ead60480a6118eecc31d72166b8b150037d4b06c5e97480633dfec3bf2b0a6668751d958fd22f58f710dc4c25683cb76381ce60a146a3989453ca2340201903f907db6451759c39151fd24f32e455db687afb63b28e83c1b05ee248a1eabf5f330af5e3fe7d3bfb94e255d385a05001068d641d80929ef5e5016167f5f03b8125b25b9d2a2c6674b186af8dc77c61b455e5a36c8c760f25e92c2001af3ce16d37fec75ae0765296a734f41f03e216deecf533ade5b8fa1e41fbc7c50cbd6bb4335cf2c98dc2d114a17783bc462db109b2765360f285001dacaead0065a2ebd5ae939433ea47869bc8a02910a147ffa4ac848889c1c71c303fb0738681b5300cc7f09e08115ce87dc0567f89e6890991988cb5549b262e4ece3047252199164880523678c0c5057a5bae371a2563c3e3038a698e49fed078add31af52de9d7dea29bd664e10136303b35e0a912801f174f78d4e3184d5c1ea48d4252468f97d47b1e64118a16fb8b0d2caa2ff1387c819376233fdc436e7f9619b34160df8f147d0089661f41067d7601f905f71325ca4ed2948c1f5320f05d2db457eebfe8ea3765e025c32c1cea5e0cb90c0431a97ad326404cb16053263c4fa9e9dcb70945e60d76496db7e9808b4c276abcc8b71b6c13a84b38bc417c66b1283b2cedbb86db3bfe186409b028ced8323f07c3f808f12480b173a20421b0aae29186ece8c180a2cb5feade90ef5d09a9b064fc71bae8158ec86a3a5f6b1ad6763de825273a4596be2288fbb88d13cb7c89238904231d9487e55fa9854037c24c6f82dfaaae93a21c7e35564e2d020af9ad36d590d51583c45998de0f78dc02c96c37cb1d4e05bea6a2f9e449fa72ab48254112741259fc819947e689e75f0c87777e27e15c2c7903a5f8eee0679d54a4cf20bb7527571ba8da7b1534fe3d31ba18b9097c3bd2b455659616b3b794dd66bd97baab2fb983930002853160bc97f88601fd881c7c6a75f2f27b3792784ecd16db79cde377594aa59ae9c1cbdfc92ebbebb982b84239b43afb2d6f655f25d457b1aeb32b3d094bffc3622ad1b5b60cdecea2bde6fe387500926d235a81682a31badf4211f7c656225038d6f4efdde134e34f45ddf89d71553639b4ac4b274053b4ddc45ef897d0f9254232c78056fd39e434297f9e0bc2ff60ed223aa2dd6ebfe717909405d92dde59233afd84ad5291185a0de6daa6abb0ee403d493337fba183ae3f89fd0baf9ed07c1860aceb62f5b76cf4931671aada0c0804d7b899191c863d4e4e03e3dde5cd8e4dd5328b641c200fabb8309005747e30cd82d456bcef1f04e409c57d5a5aa7b3d64f4e89f57ef1a0f065b5caf2e32a457ef2655e5f3c0817168b4a2f19cb9569813d15943a240d343b1ff030a7d359d7deb3927126982f8d2b85fe666934cb880b1bd56ff3cb5d4d3020a22a71a3b5f1f739287e4e229e55235a3017d2d8dc8a34953a2003c14f619f234e2ca64d0f9f0b2d93df401cec64ed446a2d95148dba461f6e022021d57a0083b9ec1d0a", "51515300", 2, 1510545828, 0, "f3d48dda793f6d8c6a22ded6b041789354c98e305a9a90913e3a01e8ee7f8416"], + ["030000807082c40303d94904561b88e6c5a09505ada3d18d8c6ad8f5013e64267cc54e33e05d53d219000000000253ac0be9d207c0ec2d13c2aec5cd9ad9fd98f4b6322e24ced7b429c13dca5d4f09688227d189020000000552656552acba012766a71460e400aaea7d5f1335e05acf6360270f752cf2445075f37ed86af5e5780701000000085152655153655253ffffffff0342c83c030000000000629d11040000000006515352636a6a8fd602020000000006005353ac536ac99a33d500000000010164b800000000000000000000000000347b62e8d36a860095a2ec866b1a0e9b8e820a79fdc6af664ab8c599c882511685f65e3d9eb3b5452e235d0404f589bf156b3a9cfa8ae9b5d96995834f7228511be1971565dcbdf0989e81f5ad914e32fdeb92fae6da36fa79742fcfdc048c6100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000486dd7707b5f90e20cc4583ccf26374af4df303a278d052deb78737ccfb2a6e951d0613225634a67c915a565e212ac22b88ab7cfc9384e859fa859024aef86b6356023f2bd8bc79aac17a89d42e1ed7b90e0662d2e2edbf099918cbcca9b9c9126b370d7e7e3e30cd5d045ae1fc6c6da7b0dd8fbffdbf818096ba4190d881a0703188bcea12c7e84e366ee78d8cee6cc3cfb72c8c0b52e1c3696037ebdba9000350320780339f763a006ff3a95a0f1fbf29fc5d3beeff7e4fd15d926580839c9a34f0b084420f781a866c5bbad3722696e90d3fd5486e4eebbb2749181c80ba0e29b6f3e9ad21f6a9083c5ff3e8c5179f2f13ee12e5e8bd2f017d0a7464f79d9b3b53f032953236378e63e19b75f5d6d8ce7195723e200e8470a8b54c9f3cd2904008621021ed70ba61d6b5b457bd1d9184970fb7adf0dfca7e09fc9f9adb34f6da38c11790204c944225b6a7586ca70d432d126fcaa2890b7ba44628c303f85322e6b9f452b021d928d43c8dcde1e1f4be5a1f60bf30956125df081bf71b7fe46a386c8a9d6aa02029365fa6bbb11ecae16d533192600ffbe00b66e98777be617ff4bd5c308aa47f0549134ee8cec2ee5b5dcfba595cbd72e25eba041539d0782cbe7618170e6a587ef0bc735f8ae616db0d4803c22ae0318d3fbd3a93341b68dedbc68bda5227f9315c40f41a8c8a117c0d9ea298c5d9d0a00b427446ad4bafa8893ae003c0cabc945f582ebbe8c32805ff5b992ddb1d3482fc86da8cd42e227451621ed3ebdae7044e126dfd7278d34a27514dfd8a70377b32d27be17ea8155366c421b73490b4c72cd6cca1eeec0c8560f5765f225326f56dbce84f987e983c130bec83ecf658dff7a9625a73c4746dfaeddc34210cd3e8e545c032a3d7f1e9816a8a9803a61f4337db51d07ebe6f296ff0c4a461d7a00aebc83a734751394d87b270546f0e666fbe46b4dbdb69d989f481416cc5d4e14031e3778100b9abc98d911de2f4bae487335e60af222729f64751512d8abfb0c0e625f54201f814197ff9f9b04385000ee817275548898a92badf86e3f2ff489a57a69033d0ba18a6fd7d2045b5b228939efe1493dab9d5db61a2af685b639ad0a866bccd348346fbd6fd65810f2cc498e2d50d953c145f8eb43b6afd301bffdc6568b9fa889fb31caa609d0bbb68375e91911dfa0b560e3413dc3e9ed63fbf08c184647804abef87b336a345694b8164fc25d90cc89b85d5e3d63007e34b1731432b925caeeb82029c412588ae5a635d59399586cfd194a0fb2f3bf006abb008b85655b2d6160e002691e0edc6e301b928f14bbb1aabb482ed776d1f0becd533033a0a070235ad98eefda476f26a18d0da419bb0d8a0da61d2224299fb04d0da88c0c6e9ef097cd4fe94e53dd01c0ec882c9d8d1d8149a9b2a4c2b71fdecd7c09f8b7fe533de80ece6795ee445efc219f0528e3d614a1bc1e7dee0133d5da7b0724109fad1c52fdd69794de146b6224cced92601df66570bc1a9a46b97cbdee8a62f297bb24b72d8c662ec1c11865aca842a225aa5f768b9a3842cf307754ace6f46b0dbe5639b9dabdde9b45f8c7fb178b70759ffdaf3d749a294fc2a40926728905df8e23dfc38b0368f8402a25289b9a6ccffe3fece5408019ecb4a7a2eca45d34b091b6f7400361daaecefee6d356133b4c524b9157f2f190bcb4d7facc02408c37730f9b0d299542f773cace85265296ff1d26b7589023dcfb9d3be94fbf1385b4a10c54341b01dc52fbe3d7cf86795cdf692fde6fb6d6bb91334bf79bff0852db4dee42ecf93bf2d08c5a18123dd3330d1792fa79e7e7f532610e204f4cb7266209aae5318302f1bbbf9eff84209ef29e4ffd6c632cdcf10ab3e4135bf67edc45c1c8e834fc0a2bc96c0605869b76747445219a6d3fb0cade1b03e00591b38a5f77a304007285a6cfc430f016cf731c541811f7bf254a5a6ae7a7d76f2835f7c80338502e3ec0317b528c6fb50e4f4dd74c06f31cebaa3e115e22f38309064d20c1c158c8002d1c1618bb5a0012b774968daf317db73ebdc70d6dcbb3b0c80ae7e573311a0dd919e781926b661c9ff22a4402d0493c830a54ac12807847cddc469e229ab579bccde5cb4fb52eeaf269415e29f862c1e0a9462345ef31878634e0d4a141c5d1f6295b6aea86361bee3e38a5a8314f8fa274558b825b377a7fd79a202cce00cd4a887eb84c653d54f3525336050bb9342825a5e980f97b2dfc905ac688d263fd40f4e7aad6dd5e20d2d8b1524ae9948e53e5109a47577243e2d3d87be385138a4c70266d71b919ed833a4304868677498c1850a705695cd040329975062632af38f1b79aa87ab5572d86d3e3a492ffa9051933f0188ff21d939d441bd033be9d902970c0f6579c962dd7bd9bf9eaf449e48fbaf54df8d606", "", 0, -1338298954, 1537743641, "1307fd92432cdcd615b6a4c35128c29f8afbf773cfc0ca7e6b1062563df903c7"], + ["030000807082c4030307b7be7afec7eb81507e46e55e99b2b9c7ee259e085563aeec6b22f7144d8b7f0300000004635163acffffffffdbd521f6563084cbcabde0a8708fcbfe54a6f1a62b44d4fe9dd5cb20283e1a680000000003656aacffffffff06dbe0e6cdb71767fa3b25d3f4f23700aac746128be7b7f8c028c2469fde2498010000000953516a6a6a6353ac51ffffffff017e5a800000000000030053ac00000000000000000140567105000000000000000000000000117dea80a627db26877e83e88b2ddae72873803da7778e6240c610b69d2c45675512c3518fa5e7865af73b7ab616b6823f5ea79ca666d44e6e6ba4bda8357291cd95ec278f6762cb8c1e46eee59b141329639b8e3fdae5a2ac82c35386d6d48600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f184b65d914837561d562390305885ed18378cbae16ef4c203be3345cf14fb41d255ddae97f1751ec7c90d6b6e6e82d00af9bfc7442828615b6b3797dfacc406c47493844eb0cc7efae02d61c11edea560083527127b881cc841be1b68649d4e2db9b36916a3e9979d0db6be75695914c2694320e5cb235e67df520104c3d38b021e550ee03204405aec4a1e51610b3e8c37c687076d06241cbd12c3dc6563de13032a420e0eb05efa2319cea1ff1d2a0a2754dc71903c6cc2aa979be23cedc2adc40b011c9617e8c102a36c81f69f5ce91dad05e756bf75ab059ab05457d1a17af2f9616d187ea37e58ed91776d75f8e8dd9a6111fa88bafee2a95357450b5284905b0215970c1300a63975b660b9cc65b4c0f5f03402f0b23b7e80a800a066349ad4ff02063e38702be128ca12a3601541dd051a649913c0aa4d6c9840927cdb753fd204022b2678567f3db74caecde7478f3b847a2e6c42efd870ef749173bb22c027c6fa02077c77cb740286602491614d10f34e1de92c6703d57b91c0061ea27d88117d53030e3c8a4bc8138885def42d29ca2d4eb45470e8a59343f95aa2da0509c4d1fc8568ef4ad7119f857be19e83b15b662d93c9fe6ac0c88c60746a1c0cf02fb9db3e687236541f9d07b2c89d9e1ac633c7e75c0be75bc9000e39ba44fa5a15f976d9e910a5a709ccae1083f0d0b50cecd410a3bb581f7488892f6847d6a06a13bb3a7231ca16323e1e240e0bf74e6c3fb4da53d23c23f6239bda7202d4293a3ff11e7a5f1d24068b87580555e3eec9c077cc9bfebd9fc1da59ef220d922ba2c5b3e33992b3912687c9be79e8b78b87d6aed748301c7afac94ed59c6d8e568f9eb8416bb77d613ba48c387c1d7ded141ab0d0ddc3a777b5ce6aceaeb0d103b09ecb7a703392111fbd3991128d0b45a5705ce1705d80877f139324aae743bb72c243275ce2cf1d6a35fc2ace2558b82608fd69955642d21385effc06d208ba0363f71e512714580942c072a14f6c9396d1608b18d3b93d58410589121d21feecbbbb095d7d42c1bfd92f96cbae18da56e95b9b8964af2fc442fc018dd63095bb983a61487a3018173463811293b05890d24cd78ce2a7e6bbc9892a67b5fbb5990a0c0cd5d3ca932d2143cda2d4d2690c0c6afcb2770ffbdfd2c65922ce565e852f0d36327ff61b617a97e73858426f8737d32c0ed54346ab620ff34a7a55e26f5b367f02c3253470d1874df42ae040935537c61bf47f83d2aa76bd0bfa2d777a277c048cdb8c89936f427aa98fb410e46b852afdad7f91ebee58d1681d03abbef68bdb646e7320a3785841bb2735a3447af5ba327c1d26c9ab96ccf0e9bd26bba2fa3cf1fef1717cafec70317d32211f318ab21828f06d01e1414ecc69d74d43491120f9831e003331dbaf7bf3da483fe7b937329a880015b20c09c3c43cc64df852eaa0ca65d03edd22a17a175be4460e4992937d0f685c437d2f4f280d7aa237b7a0e939b3eb28bbacd821a6f4db61ded0a0798936859fba0deeeed6786f1c1a01e491339d365b4bfb1105fb66d734f2e2c731302e786fcfca8532fef381df56a6408b34cf826704255cffa62af87ec54735e6da018d01b72f5e2c0cfd256a8fa6569be5f5352f47ff8b359cd8a7fd81522d684f009950f9ec1759c7ef011ef095c5e916a4c23c46574e4f83b35146b6371f24f0d29ca3cd675d0e24ae049b09fe4a0bfbd35ac10090b0c2f7cd75c387b6e95c7ce2670a5f2c1799258b0ad53da4f8df114751cc02d98831db13940bee3e04bc11362d38220380e034dbd37520a6c8f529f5e45e656c95b4a6ad4831ae8996fbb1b2c1938c668a7c96b3b7e7a20cde8189a5d7ebca81355d5d63b3754618e28451eb055f272e0053c226e720f2b3ef114c00978f72699e7c422a942111209819bf24af1bf03d3ecd8014c345cbc6f9cc3bff8b576ef0f7dfb035d6bb7df614a0ae3b1289219936c512c1bf686a27023891a25d39fd46758c48201540ad36beba5ee0098edcee00cdb82b3d82b41532a3c91febf98fea5f639996ec4d63ec3e8a8392a75471aee9d859257150208542e9150a364ccac2f0466626ff5ab9b82372a367f33db398a107b773482feed0141322aa9f685ebb9116c7bef066340a5caea65fa989d7fcb31d47a292d38268d32d658fd5aab5a0d4fdd51e2f580c69829efa60bebd8a2bd3b3f3c5765e7befcdf0732c1c6f05c56f88c4fd7063708ef5d3a256df465f480212a89e8f83af3f705a0a645a5866e54f909e5cc48b979c98d2dac8b7ea02c63e7757c661e7c98bbcb6ecc4e0a7c05d28059a7769a6f57ca1915fb4f701f2e4acb8ae1039f594c8999e0bd5fbaf5ad2557093c7f72f86c668c1a15d8318332cba4b2bb565fc1ef5d37901f34c795d6b372a9b9905ae5e02fd580b", "6a52526a635165", 1, -298455192, 0, "043f124e7450a2a49b8818fa3c056f406129a2b8e584506ba02acf7b9646be6c"], + ["030000807082c40301e50c9c183bb6e648cf7115be28e8000efd891fb91138a1b19159140c492a82d301000000036a5253ffffffff04f5194f0300000000016a26526a040000000009005251655365525153f00499010000000007526565656a63636e77ec050000000004520065ac00000000000000000300000000000000003694d20100000000acc0a24fe230e4be7a7b2f89a966fbbbb9305877ee8a868ae568710c197dd371fa3e3799d1cde84e8bd93550ce390057ee244ac9f6024b90de96186be4ed089d516ff18cbf0eddec09d65ea3c71231995b1c23154d252d75b20eb32ee268262c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035d33b974ab4b1c12a84aac0da667687982c25c0fbdd481de13c43d65f1f7ac286903dac6cfb089341f89b322a0c91d3595cd7d7f2a84652caf60aa05383a9e43d07fea48d685bc83d77f9e04f769c4bf8a036ad96cfcd0aabd57840be091a32bc8fbb3dac2f13f49e79ed782af1390fc3079d8641cbb88a3043d7c228e57e19020e00cf66607b5a3bc407ced4807f4f8458552f392c4a143eba823a435db5a77d0213783dd7f724cea6373140597b5107cbc932d7f7d7f3533ccb2b591b6dddf8410b041e3e2e73ecc66456cec3196941befc59ea2ecc31a3983a78e877d0d93605096a2b72bbde42d01e56408ca6bbc8c6dda327c4a0a56fe4ec91300c4e73d3556e03239d8af96c99702dc159255e839f51c264bf428bc7e7c8331e69549564ee0fd80223163f57cfd541e24396d7fc5ce3f353456e84d76cd9deb81c1dba21db68a84c021292cd4e813817619eba2389a0e47a9e080ea4ec0ffd12f166d4887131513af40308b45c3dfec27f87ceeabfae284f6a9cf487c170e0f408ecdd7b208e2e450b7703110c35e1035039e1cbb8f2cb35639f89a62d01b0541f990a5f28c1a6050c0581a38d0b309fb2fc010238a44ded760d6ec1ca48513662fb581c196ef32b70cdbf5ee510d854f8bd41ae48d0c8982a650a6b9aa5506c922f0a7812459e24e569fc70896f58ae00b15296041f014a07c3e1c448c899f5da29c6ff93f258e3abfe3fa60db80c5233280b03dcacedc3b3ed7f71b0e9022519baf1aebbd29137171b5d24bfd456360831d01df5a4ad9280b29fb7a5e6e2d10147166a7d9010507f663c48b29ecd7aa21a011658032f4f60faab844b51c4e30c7e5e6078181071c6cdb252674a6821b858834dd81886056079c6f29ca6a5313e7822a5cbaaef64765748b0e416c5aa8d92fbc2d75c6ae9b59b3134c30b09dcc82a6f4413e8529e58af8bda2dd16bf4feea21d619bc38028c0d28ea93b66a622297a84759b64fbcaa9a01961d345cd71e87af0754817ceef8693e481a8066478c8b5301d4d4df9550dd825b651671f17b87bf832bc2f58d1516144cc06b3cdb54c8aac207be3a61391e210f86d78c65f3bc31d022eb9aeef53723eec439ca0fe663583c63afc934e86b8044e472886cbf5fdca9ed414367a7e96b898e66a372cbd92d48a2bc59ee91a1547101f373a0d75cbd473d3edeac87c730b4960622c36925db35dc32d18fca5b933897b6c6300b73cb0248ffb1efcec3da2bdec822013693f3d4eb7c92aea1511bd183b93712983bf9a78dc3d3fb9c6f91296bbb83b964a8cfbdad9c73fab1945a37518ea9c6dbc8040168403df8c6bb19e59a6cbd38f63602e72649d4e36fc58ee981d3e530885c7ef8b797d5cf96ca144d21d69585ec4c52e0d081ac4453eeb25db9a07048908c24ccdb87244f07c7a540d89c3d4725df07530f06ebcb6b42c26dc5d3833664c54dc1def0e4444256aeb12ba6bbbfae7826e2830714effa7d8f56b1325c5c802e94df6db73281821aefa8784a9f053e1f82322a462aa2f80a1321a5afef1c5aa7dfc2a8f218a686fd8dc4159f243b10e1358002b4d8706110f07749d31b96ed7f1de8620f6d637b3952ffeb1780b9fc70d4c209e30d104b26d3edcec01d8aa29398b0b48b3d8256434091068d0482ad08b843921766c8b6af3f07ef55d85ad26042c6f161c0edb0490e14f298cd96730eb363368900463fabf61effe61b9272722bd997d1b73db74286a086fa93a0db3b18c51c8c372bad555cd8eb69cc5b6e44935724c90799d2f5f6709a3a0cc017c8b687d48e5d317c6c410b4133d801cd345717cdc40e068d2b62d24c9184d23570a27b0cb9c2696799766e66f9511ae53a04dc3c8dc96955bc70d388cd36b53264d2497e38abbe68916465328dd1a89fb1fa39ce5e33165fbea94141d7766110d96c5c2bcae51abf6f6ec8c0efcd66b3259bc4ce2fea018ef99f1f0461f72d23f6742bdd82f1c425e50f93a7add3e6d9344f7b44d7db66ebfd60c009c437ea81ded7df61aebc7a55aec468d41a6246b81cbab6c5fcebce79dbb78fb22a30f03c5dd8eba950855ed7a7a0094d729d8f2859b87a5f79f0bb7202edc80c97ea6a0119c6705d4018e886dac606f052d845650300efb5bd9b95775c525b7f1d0cb306b96c1bd47176d01a789a4f1a2cc7beb8d63751e96ab8c31b6bd1f1dd8728ca7d7e105870f12e5bf734778df036056af51d8fbc962f522d64e67aa6a07f2dffc09248b1cbd7154d360e1cafe43fa6e76f566b2587389dae39ad4d0d760000000000000000d46aab00000000008ac2aef5afaa32a8cb72c809988fcee4e842dcd76d36df53097f804ac61818d6bdffc9fefa461eec0f5f372330174be2eeac31cae6682daf35b0b4ffa1f76acc694d4740d2c7bd59eadfb0dee6c74c736d57016f67b2741b043c4486f48e6a13000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c5bd84f50604e8dd7a73d19f7d82e223887d9db79a7b3a7bd90867b01bfe9971d6bee0c878c3406f6360d68ae923c76b6a1a7817f9dc5502426ae0799f4b16c55ad61950279908e2dd25837322d58d3e739162303bbf297e8c086d30c904b5653dbb2b9d8d4665c665d97321af8010fddfa72e3e73338e63c9d6ababb9c7d99022da5a4d12f26b2ee82cfb74092dd12c56d63287d7d10bb5a616838c13e566e75032794b52e59c5764217f745e6c625ce4a2af896f3081ca44d6a4d678fd7fa87770b07c277bbb8b12ac7cfee320d3ed3da9f9af51983b25902701295978970fce94f191614e259c99e032e69fa19d04437b862a0ade330fd218898c98d4ab03b38d80308b999e5a006dfae3c6855d2d788dab2d3a407bdaa018b838c354c6bbb14795a0201bb552ccd1220b6b7deb861cfe55a4c87cd4c6d30c6e0d0d745940d923c5204032e9cd9dcb5416eccca2694d802c0ab41cc1474892e7b285c988d3b66fe945f79031339bb359524b8d24d335a204ecac9b422983f6e4533fce4aef45d8fccd4c684032baf1f6451ea4c1115bcaacbc540e4a7d8a429c4be757696f20496892477ecfb00c26ecffefbe5647ec49a68587862a4f2c61f8073f2d634ba82ce6aaa5a9ad86139b921e0343fe4e365ccf199339a9ff6ba2a0e759b191a80105ba86e2ee2a9cd7cd12582d4607d9485d5f5d6c8e73d4b82c4cd4120e418c0acfb38c821117fa77159d84ed4b90211512a52e415579f824f01947d2b6bfecb10c78b1c74684df52fc4f6bfd38a412e79c10e342be02eeddd42272c0be98142653c2b7955b02c8b6c1d7351d6446fe08b412cd73aaeb28890834e3f617f6c80775628296c893d3628f4cb675e996a5ea9071737582c04a7bcdb0380a11fdf86c706292f12b2edbf24a0aa6e14426c5f69253eee6ea3bc4bd9258b09c05d39677bd7127cd4ae093a8ca68996dc6a8d22e55dc425ab6a02fce13b6cb6a50934a6672c236cf005f3f452b915151a99c45f221b7b27b7980cb8b3e2025b2692ba01f049ced56a8960040608729848eaa5673166616746c3b0a632073bce8fe014c87231abc834fc69b08dd154a5e17178c0e2d5bc148df8e6e8922e96fca04a2f22da73c71d204d0388e37a8713d597e7d493f37713f38fb216deb814fcdde9b04ce918fc8281d17d2a204732878a086ba61960c0293879f316bc056ddcfde5dcc3a2fd6a6992332142f81f96b414214734cc070251a6620780e8682af3a8762b5a856332cde5d4ff50620f5ee39c6568f42d56ff3ce82a5f917226055c34932e5017773e28797758f85ddfbc568b3a4bb2638829f8fb1efc23bb7f066a25dce4bc3641a60c83a0097234d5602010d186ba1c79b141db10b209bdfcb122db61b20d3347717eec05517c70011d487c734242bd53247ba2c79601df6f79654812f94edb0e868331ade5325a2d19c6470000d5e7e534282f27a04e20dd99ef9de3c053749659cc672cacfdf6eec8531447eda1968308a1e0fd1f367722bf532fc3991d6898d1ccfc09716636a9625c63ece2c71dbad31565131769deae96ade2abd4ccead147b33bfe40e0dae5bdf3b26fa16d1907891fb4d26f1c98e8260486e022c764181bf907ccc0c440da955928a766066ed6d813452de9d1f450e666d4f7ef4ad21c3ab7cdd4ddfc8134c9b2a90e15d86a67f99a736e7f7a612a913ccf6b8eb51ccf71c1974ccd06d1e522c89775f5ca431b4f01833970d093d937442043c40b839beb5b5333eebc6424f2962eda919b166dd2a2f393ad97b5631c941f3c75ca6a9e673293b07eb2869c69ac9957586a24ea468c82d258fd7fed61723ca4b8c512c081ca5cf737a9831814592c60d2127ae7c1897eafbc16eb651295864d08f2a7a1b09e50743117e4d5477ef4d3cf7ddf797d524f74f854aec7fc99fb1edcbe86f8e8a8be83ed638b8b56f124f93358fe4d3a3027905e257728be953d8a79bcd0da21a436d3a8e778c280a174a6585dacf02e5aaf5029fb93508af979bafe0853475896340d2ac0311e0318c1e09facb8d359ca572efd02232e79d83f0e7ba66be95b6ccd3c06371289e16b5b0c3faeb8a59df8ab00b6976ec7567809ddc7f460723107609f69ef98bfaf28f78221f43d1af72b2bd0c5bdf9c865ab09e10b5ff0782368f8b11028b83209b21c0568e2c12efa31c8ab28e32bf7ef76f03261f16eaf6f291007ecdcd5c59411de46826e7d31223b9f7751a81237392e6143ef84d5b0d1d5c6b450019d4f40bf6f3cb0f9102006fcbf8ba32ec2bb061602000000000000000000000000b256c14dde9372d25d8bbe265fb7ba97bc7758fd15df0ea55b68a5f62f467d91a16de45dac4d9f3c14965c5e27604ee8738398b8c530579c660fae00b131c933249729c4b289c79e20c70ef83551b3f6fb6d28440c718a54511b158656c627880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038ff0cff79abbd60b2dd5aed66350e37de9ad45ac187fccd452083c4ab3a297cb7aaa30a8c7d9bfd8985b407dbcdebcb0c11bb8b6040bc66e5c6d0c019139634061cc1d8ff74fd79d1bb9a3c224a4cad0ee1cb72e32050d7be986faac94cdad29bf4c942051b444155ad33da4a583c21c09cf2a0469d5d06f7d02b3e75a8b9e20228f781f04feee74c8e98b321ea9a4a5722b1b3a4d258ab0cb911be90b7b552a1022a6b4dc81488b9a109a84e507ecbb101e1b0866f3a62a9a3553652e9680528d00b07972d806e46eddb05e854fe71dea9a111506ea80a7a4fb67e9d1ee320b263a9cb2d4abdd274ecd8864062a3604377d381147693a5653a1677f9d885b1831ccc031dbf5647ddba4ba4b8558ee44dcbae8f5d441a1738c8528e0bfa7106d0261d1b03289cb64c32732ff3f77e42931e850d19a01baaab07f65dcc2660ce6ca391de7a030a42c8298667f88ce73e108310af97d25ef672299f7fcea5dbbf0e570fb103be0217c591dbc72dbfc4f89bdc3f80d1ccc2f45e6deadbac9cfc280f6ff59053d7c40305a5cf0ab65b2ef5661c9470109499145b07a7aea3db7d11e192099c33e66f6a76da2a306b3c89adc941c78fda0d6187bdd20e382676718b0e944e26878d0e1c798137024cfd01b6057b8044b149923ef400e345c5c1b806515a9dfa0e2b4a5625f99aeca8d92c56f1bd6239077c28ec7e6b3b33b4a7c715aa917ea3b16b6565d86451213f647a08cbe9fe4991158698c99b69b9f57bcdb595b7a084666f1e9930431f89738b9ebab706449b7062508eda1d6d376cdb5f2565164786cf59504cb3d00def260ae35fafd49a40eb6bb7bbad6c94038e5eb270d516e2466d882adb41d96c74f35712f6b231de22e285702467957f0c59cc4eb377bfa4e6da5a45bffbbb1984a2a0a377ba6e3ccbd7fa061ed56aec7c2a292e5d87d5cf4294fa2b72ab96be5c52678b0103d4da47d9c98cef3604ba59e2f4e681492d12eb09b538900cbb000dda2100b1cf583e4007594501b12f7fd73d0f17b69b80ab8de9e8ce65a4a7a54c8fd4ef35b33bbb1be9c09235755833fe21649f089237675be40b72ae0f14dcbed90ca86bf3b24ab9a893b2498b34729544157887560b2881c2b47fc80c11453a75442b3a4d91856bd0d04e7e966ee854c7f87aa657b0cc6a12bd53d3dc1adf277672fe6712e70f29bf8e33aeca15a706f3275a1408a1e61d2d5c607e949ace3e99231229564331ed80d65d050ce2b491ba37e63ce526ef05e83fd32fa753baaa0a15a915356a876833cc415c36bf6579d551eacb9b2f44c88f81433714b2fb724576dac2ad82c7a6cf79e34b8c19b08ad927dd995f30c8d0c75b786d5f7cf69ec0f6e23804b0dcf6ca7f238652c505b877039b3071415c1abd8e9c6169fc39bf99794e1263a457d27cc3b5f406c37461c1e7fc8115b78af0c0ecac117fc248f9ad8a0c7757fe10f295191c902f07a016a8e458a580e74f6892bda2850cacd043959b7125454239125346ee03b912e017076934a36e66768f5517aab0ab8505a578ee08f21ab4fbade9d803f80044a07a8abd721b32ea80ce446f778004a3e3ea0800f24ca1525ef59cee1a14006969695a8fa9c445b8c61c7a08ee70fa574bee19e05b2f9dc64dd6ed149769edc6ab4af46ad58a80057146a7c8bb4baa59a0ea15248a3ff623ec30992d317b273aea7d72324e7c8fdb2907575f4438b300ecdf23c14ec495e0d6ce491338757aaa7122e66a1750d293b7945ffc5d5b1554dc94745259e1b4a4d4c2e463cdc63982a7cc3fe0aa61e231b16c1d58a7333a5ed6efd046aa5d1e449f210e3c2ea9b635882096bef7d89f5377fe7b5134dd435c96888745b9c1a96a5c39e71e58676b13e2914e85ad69295803e6f997fce55650a6a7b85d82aa124ee33c0b77806214045b5cef113389abfb9828398a68baa9fada6ebd3169d26bc0ba4e766e910bc69d431f2dd1effb8a0fb7805e83c4b9825d1426c94e30419709cd772962fdeab9f1efa99c9cb191c71fa12e6fd5f61d15ad685970038ef7f7f4aab6192a7425a6a22f5a9914e9a055a8e47aa89b1660c7439903ceb30c8e788ad0985c0312b34fe25d91431c819f3645f154888eac931f1d766fd6941046967bc5453d6eceb36006ec7d65dba10820fd74d75f160d7e3cc865994bcc59e9f70b8368b15dd89d8269f537c5051994799c5b1668de2b7ecbe1a686d305c8ab89714f07680995e06b961f011da5fad8a5cda220f393e7ba138180e436033ec6b98671409e546823fcc43a3eefa8cecc2506e599fc2e1fa06d569a7dbe27be7d1741642947cc86b73b451862f427c4a38e840a6c33dba307197afbbdb06bd98cffa533da63c958dd76c51946d25d782f918233ec52d9ab6783cf1a87002a94f23cfc3f2506f3c9758609", "63655352526500", 0, 421208333, 1537743641, "81022f706ba645575b3e6776ed99f109949a662bec1acef7964711255646795e"], + ["030000807082c4030356b786bcb5066d1243d13252119a786858901ca202fc9c0cee9a83f6872cdf040000000009630052636563005353ffffffff0af50a7db9ca3a872c6b69dd968a446cc0eff7974340b57f52099ad586daaaba0300000002535156a94ee666158c0c4aa839c2025f68b4b6820e74fcf42ce8887b9a64dbecfd184586f05c0300000004636a636affffffff03a63fdd03000000000563526a005164268a02000000000163b720ca050000000006655351006a518efeb1200000000001000000000000000090423f000000000041bdbba2500417a5bb48c27b7e831646d9ea31a599e12ccb78511d5c1d7f189035f140ed0fc546d6445bebcb89a35b5ed5786800e655cc6bd87fc513320bc1568f73721f4673a970f0a8c25c39df1c855c86ed2ca2a8a42ad4a11247876ceafc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000094444785875a9ad4da6225173f04d8c8a52cc0c99ef4a027c76d8c9735b88164da1c03422c4b528d0cd14488c28073dddb46129bb51f30dfc62a99d079544204ef209e7be7b45b41140835805bc02e8a8fa0b617b99609e5d423aa85181d24cb455dd7704c67f4aa4b83993e3b0cbf7990d8ebe793e66c884dc0eff8500f537a0204a362d1063de5f3664518db8c997e2b1f487613a0c01a50e802a7b48cd1ef2d021315b00313b21a7d4cd4184dd5392e7594934ef90701feadd9ac174ccb83387d0b00df2d57bbefd807d16903b6e5b5e53e2bab19acc7e27148eb348b204a5186077941f1b76cd704664508d96b04ca025661b49422f92cc9f4df5fb3500dcf21f9021dcc88b1c1171a1251d7502b6c3184367ecf3ab9efdc217b6a4d703ffe112c74020ea2d9e62629da81459228a1f82548787948f87f272001482a7bd3c72a8e9cb1031664f9ce90e8a3e536fbf12b52cbeff88b3b6293610fa7dc27e2badc248811fe0323e7666b96a513e8d741084fa936a6854a91a4267685db9f1de1371c49cbc4e20312e93eec073f32bb2e114afa9b34b18ac1395fa43de626e6317a7c9c0161c512e3459984e786e12ffe3a7b43d0700d97ba0cb9798ee3592e9b7f4db7aebb33fd88078ce3a3e0f681d21fb1b00a790d636726ba65b91b29b6f6570dcf84a5562caecf7c49b427b2e054ef3b33a1ba6760b4aae0ca0156b7cc867c09432facece5956f1501721b5d6157ceb3a2a461fbcd219e435c69e56f5bbc3f8df63cff4693df16a8542addfef8edc1df86cbac125208458b155aa3c3c20f3df58ea1216f510608d3b0a6b4e3067990dc01f896888798de833b0bc2374ef6906d375275b35f184d8101de2341312a7d77a02c095966aff0912a0a8b75e49d93e3bec151e64d67aca2dd4887ad767690eea36d99513ca78f18f1e99537cd8eb1b26f07047990a6e11b9321bd49ee3bfb883a064c857149746d7c41af8252ebec905082dfbc567e04ebeff4c0b758b9a044579675d99c5590831578d7dfef9cf4975857d8758f81cddfc2fd81859a749080ba6c529c9b0f912e808e749911cfeed8e97ca498de1367bb0e42e7aaf4e9c0858351f21a920c635897f8b824739c81702d63f2b879511ab4024bff15e264892947ad59a3f9333404f057272fbde12b44b50cceb4717365bc1fab37283188ca8e1a4ffc5785b5c7efe7a408c9767b617f7355aac8277e377a9375ce44d99bd022936fa3daaffe64b734487198bc99f7dbe71a6b2497153c3847c8cfa78b18e003c7169b7199bdd07a36c99b115a7881cfebbe33e1462c17f74fea7511279111258297b8cfe0f9f250b804826a8878b917baef4cb9d9b6f7afd474e52513ad4c9f02a518cf2d649be9ed57b27b075966b476b848ebe3c2e62838c3a742dbc24c599de7cd6906d487262ae1916e5a80cdd1dd5bcb48c5d11d6977245213846d8a1b373779cdc5687118a33f70ccf2537db5411a33a02c03028dec434eeb954a025354e35419d2fc2c55489af06cadaece2f1a2e6abbf8d8357414b33df2e5aa88b13e08656438156b5394d8710cb796c742e98d44e57a08834444d5025775e3df3c838d1644e586b957e6b470aec22a7ab9aa6834c9c600173da4ba978c6cc16f4316d9cb0d9c9d92cae217f292a35f40ef7b7ea73ff9dd49a31b614eee058f8a518ee0261ba1a670bd7ee5c93bc643fcfbda3bbe11ecf08c05ddd042ea2993860e872320152688d8de733537d3ef5497cabd203a9cf5b7eed25f1fe56d1f4f08cff166764043873ea008b1b5cc978e07c3a37564c48fab5259cfd56ba66258684f6bb0ed9afd8160c6c0d49f4fc6a3b5626744bbad384364eebe4a489e793dfdc5e417bb8e069291143b0f28389e8eeb8803c5bc0a62b8767783cbdd54cfe21e785e9ca3ec50545261bd0ca4e94fe4728bf3bf7718a6ebcbcfadebb27eb2f19fe3f8945e3a4d46217cfd23a8867c46efd99ecfc7646ae94a1af209e41d1fd1eecc388b445127ae4aa889792aa558e8bd9299c945a6615667261fa2640014a380288d9b1f34544b570e2d09a9680343403b08e5135c5e00c23eb22045a20f7a9e0f1d608a1cddbeefd31bf2af0baff87bc9bced793cdb8f9ae7d4395b8f7051f95e3eb4dba2f2a759a9b82ace6f9b0f64d8bccc937e2ba10e680f48d8942763f633bd5ec3f4a1eb647de6f84ea41fcf8cd56aad4c47526d9f5e02bdcdf9d437140ece13d29673ea6735f481f519bd70dfdd8b6095e6a7696026ca80bf7c6383eded32443ee1910dddacc407e1aea295c5b796b78e278174c8d6fe0a2ab0975e6bff323f69f7b733f7f8aa202f74e9386ddb45be9e343bacfaa0def55c78b155e412792edc57105c4360251f1f2f8059e55e2b6a470cea9e962c53cb7f085bcbed01152b33e5138907", "6a00acac52516300", 0, 1695924994, 1537743641, "86b9ae7bc7fc2e49e8740d39f1686c4f81799c3b7b893c01f4ef440c42d9b05b"], + ["030000807082c40302ad0c250bb52db2d3fd65dc251c0321102aabc46c80d076b983b50c90d58f307100000000086551006aac6aac53ffffffffebf37e7488b940b2bf783917ae37755488c5b87d1ecb577815fb2cd94ffb42f30000000008516a65656a52535359e5f06103a5976a040000000007005151650053536a2dc00300000000045263005300cabe02000000000853515351005151650000000024811f24014c4b2e05000000000000000000000000d16e36bdce7efd7d1c77fedc193ba60606d9341b7d24048e0844798ec729a59ae83cf006b5d991753dacf2627cd4bbf185dc3b86b6fe89b79661a69dd012f5aa3cce4fa63c2471fbc7161b147f572ddba01ee8cb50d4d7c2139d1b3e490f784300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d09b53dd8f891330b0dc29b42fc00e5624fcc750f05b4a0e65f9593243e7b3fe68a7d5f5485a3e15b24150b1ecefae1f985041e62e2898e9aaa85dec8bb0b534effce4eb0056e8f27f606b974c2d07337d3141b1d1ea3592472fe48a17fa1f090ee6e501789435fd23523687a381c186c974fc75745b76605e5b5b248c74f6f2030d993bd34f02d38cbbd29ac9e019b3a6a321f412de4620da6d9bf5797ced33620316c33c686fd200e01fae4640c9ded3654af39c60b3f17504b71e499922301d390b02536daabd8a7dddf9e446a2f3c8d44ae6846188bdb761ba23de3f94819fe4d029e48725c5d6ca0ab25ca8c81cec1529c9c2cea8e26a261a38cc1a198c988d52032e78dff4dd67d4bdde243324104df6d7ab86f90ef454b3b5c342299b173cfd030206878791e3d3c96467d6529071127a06b5962e88b7d2853db72908f14830d61302213424f400152a733ea21f84221e4f05032615ece35a1750d148249a9a4d305803280cf0a379a823f93d7d3259c012001fc2874e8d6f3f081586ae76a0b723f96e021feb42de981327e88aab949eec6eaeb45a1efd8f2a257b5eb73186d6e5b2ddadd16029a8991ced6abda98df411d2cb17447635cfcf1049b8a9bb59dc0e5c9d2bb8bfcaa85f4550e01e9be18529e7d9fa45a500091070a9b27268ca7c9c5cb1339d83a5f58f7cc3756979f7fab51df7818d8cbc9bf0b3474a43ab52f6440a03f602cee8f1b86bfefb6708f0870d8fcdfa56d8a9891e013e37e5f3d7238da7c4db4f5205ae87865115a783a4a49f7b630cf5e10f18e13a191424ed2fd99ae44cae1b367150ced6442c7565ad1f40184fa201367d2ac4d08033b6f240d3d7c5cabc6038d3f763c105f236e38936b17cb29c0364005d4a4b1ba954d5e638b463bf246205dafcc022807422ebe982fe55919f22cba40bb4aeb94b9b892ef46d386acda246a3a6d1144604ce7044a9b5e4c7d9d4a619f403cb60b8cc5977c03e38b36827e8f9d7c553f5a5a65031c68ceb4df4f3c253ddfd98213cb3efbc2967785557a419c1c3b3466a8b419353a8019a7dcb5b4d07593f0974c2343ec692a10c06f1bb8c0fdb2dd331046d87c4fb54a49bcf0f3b6408288fd559820feca74ccb91e59cb79ffab8fd218bb3d4c469c5c79af6c43442bc0ab0b705398d73df0212f4d94bb32fd4025b8b64cb23b2f2848ea1a6840bab041d90b723d22ae83eb8aad5024fbf266b8bac4b34ac4160001fd9889a576637e943d3994267d881561cf6bd3b8c0e0c8cff6a4956f5cbad13de772b17b96c1f2aa52b641fec16a985703f5f298d51b2e21f4272abf98f3075df54865bb62f9321943e03bf7050fd2cd791646c154ada5440aac0670cb8719c3f8bf1bad975937266f7b9c4e4f3d6cd290af5a1ceaa47cfd3db84e2787d5e7041a02546ca65e3647ba133e8da79d8a7230a20ac6d1c8cc9f07f50f4984c6170971e362205f0903071bcc8c34ec7b9c84e1f1caa9bf28c1e6c283cf9a876a96e6321212ec6fd48b00815718247c6da48e317241dcfedb5c0a6de213d9e3b46b4c55609e7129222e7d410204b75ea0759587f06dc07a2a334b4650042f6de42b9c2dc403c438cc4082ccc5b842035276cba92fa0aa5580b0e75df9a3f861c289b8bbe7bf9519c3b2a0a8f067f6c32d78618807733a39f98af4a07133c3bd6f8abe31c3d66439e92d2d6791c843b662f7ccaafa15d48a5b2e96a37fa67a715ee1dd684581e1d158001b249ff4663d94a61eb9a018d1f286324d2410ddd8cfe0e960c3b2cfc3127f1b097489434cfec25cb9d299e43c876039cf735704c678f0e78b17586e19648fe54635797a656a49b77c8b3adb92b0b20e35adf174c3db233b1d7a86ea5ab547f06c8a1ab42816e949304e4571c946f4f40799b2e07030ab5748a9517c304e21b730e50f5c0c49630af93292aefd079407bd106ff0d63e7e4247288bdcfe153dc1f80726bafe900f384f4a33a7e7d32d23f7b540b065c7ea7a7f253729b4689ef8300dfa131ff31f8b4d8a7246946b9d299c74cb76362b297322a085ddc22ec83bb06e043e46b7869e0d3b11d357bfbce0ccff6ca68d97ffbd97173735731c14203e691f784ee576632ac51fbc5eed920438e4920e28106897de34a162134176e92836271893654e37cb0d97bf1b81c25df96f9db359ae712ae109599bcd18862b4526d5f576ab9c47c975f1bb63d4401fe828a004fe96b3f34dba29ff8573a06b8e9d427e353a0565dfa2b5498599218a6f48c049c4dc91eb2b857d3856d71e622917c41befbcc5954fec819b63363decbd9f2b95b12ce1ae5e6fe30e303f820931a99de8730433e3d004272b1640993266b6f985709062830c912f90d483825225f0892e7110b18425d93501aee742eb66f83447deb5a0dad1657293c5006", "63ac", 1, -43392376, 1537743641, "38c862d902b51f32728252534da4d52acc3da86e28d32ba253a64b7152d2b650"], + ["0f3b747d03de20efba80d182a4598d1ada8158f9a57fa56adea7c51b5ef5731af1288436ea0200000007526553530063ac2cf1330d746d7689f7a29e7815408852d1cedd61da7dee326db361bb4359a207fc0acb110100000002536ab94a805c3ee5a3985569f6d3966efbeabf73249b0f7e3dcd93820939b83a7e440af67e8300000000065151516a5200ffffffff0154754d030000000005ac5365655180be135f01a2eb5103000000000000000000000000d23f041fe6d6a241bd5fe26e65e4390027f4945419d7011f4bc98f886a57c78d7f68b5b22de9c0646211477f29b3e178c62d9a886b8a1fdad19179f0e825a5ff173c4e8d108c30f67af3ddf1b0537a4c34368552bedfd9a3b6e5896fd54576ea00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b5b086f4622d3621a38804de32de637435da240dcfe14d3b6c5335b765ccba5aff98c8f62700d41171806da411d731205a445e19cebc89d29b9f0aa1e7d5aaf20513cf0dc55b7cad730c57c5b8096131879b99a2831b2ab90aa7f1614e30ba291eb7e638d50d4451a99a46d37c1064fb673c29ddcae68b348085d15190e1da3c020c3cba1fbf8e434023fa5fa8e9db45715da7c85845b3819709dba9011b2de20f02223b52dfc53aacc82be70c1c80ea2f818a92432aff869e90f1e8aa520b457f250b00cb703c5aacd072662e57eff098494639d7bc954198bf6ab6c14c109a6d810b7efc4535e6b4e79297005257c7c99ab05ae1399e10566a6af52348087578e589032d57cea1f50b783b7df7eab6a31a78ab18c514f5fdfe08bad524dd302b17cbd6031e01886101d2f39444a5fb93f4623e95aa4db6257bc83cab1d08ef65b16d5a14030e79bc412ed12cfc6b6011c306d914b1dd596948452ffe1f76c91765aaf1f4a10322815616a44cb1b07b2f349087c4d6897fad4508c777267e208eff2376cb083602080385eb56b510f19dbefcd7926a9dd928686d11b2cb4f2320820022d7ecc2e01471d6b313d98a4282c719908777933c2058ebcef73bfb3a6dc0666f405ad9825ea30e398dbed8d46bfe016f37841573167a06723b0350559f03a1a837964e17e2e23cf32ee17750c0b986a8c9c81660d2898aa3b95b5ba69a77b924d11c713f0e9ffe8a981cf7290cc53331e08d0ce4a1cece6c2c6dc6516c9fa7e7d0edefe444abcf1cfd536fcb05c1250831a45c6c0907c65e6e3389cf6ec66b2d2868883414ee8caee3e9c5f151df845fb710d2945e27cf2ccde3445dece60814191b7a90e2a8f359e6c02b48ec6d85cbaf5b46f3a8a3858285b634bc3adec51fab97f06d5259875608c884ac59a91fa84e1db68933f24deaebec3b4954f22dc2bacd32ed292468f41dbf797ac87059673fba05dc9c4865bc08af34eb7260e011302f09f8a799af12e885355031de7a7083c0169511e5657b4aacf86b3074d0fb4cafe4256dad21323b043669975c2ee3fc3ea257992ce27deebc178666d597fe66782a9b9678e3caa7ce0f4ec4a5d4a01e9477251470f40a5d76147048f3f31a87f605e90f79045de95b1cbdf37a1f82e000fef3852a09d0803bf201f2cb1655dcf770e5a9daf86bbbd7d38d96c4621d3b16a74b7d7455220ddcb609e8eeffc73b3b6aa3473fc38fb246f84874746e208f15292b6ff997e4dc83727c1b6d653af88da5f66e02874c2de00f8d7aec4e9b0044ec4b75d7967426cc5297cf6050da84e2523a4aaa40fea08f6c74957b9a08f450f27614a877429696dd045436ab5783f9f6cb6e5a73227cef1cd4ca433d071ae709093c8ec59829ae87787cd4fd1bbe0170f4c3def9aba9050275f91f9677c987e761eb55d4a644badbea49d947a265aa30decbaa5fc6eacb140954f90c6d09269c9d53ea5a17adae17c890f52a67b47fef437212fc22e2801e536627d4dcb1f9b13eb7a28cfa082ff986327021187ecc83ba47ee3bbce119d0dd49ed91df30b6a16674b25833bb2d53f2c0b057a484a6203a8f4c0f42a2208151c1bb0abd248113a84b2054d0a52a553b9aac799f9c37781f96ef25f714d7f10a002ee37891bdd803dc897e6f4004794901aa3c76881b5eb43da55dbe157c49c134eb32d151640a3f79c134be25197e34968a02f063a4c146ea7673a6e3cbaa3b2f223cf7d4a31f00118e0f25b3e2cea11ed9ca87fbb13e4bd09e77f7be6a7908bbd935b891d73afbe95102224694827bc340e618d2d7675514426de534dd1cf03e4616ac3336f7ffb7b2fa79780115293f7b179ebcf9953820b9f5e5868a590016dc7452d2a14da4c5c999bd55f070a5b1894e7c02141b6ef718943f48c7fe9529c5ca010b706ef59635356c86d984afc498bb2e60ca5ed346bfe40ade273d3873a7644a493a7c1aac724cbe9b9c18f37fba7365034bdd7b389e90930d0f0705251fd1783d3001ef0f18a80472400e029957ae4d26b241a8da3df740f32047c2d20b2c1354450050627d2757a6d430c7aec6934c963dd02e73403268741d364670355a1e9005f99ae177db352cc4451e548e4b5b99ccd122e1d3f50bf7bda067edd971e4d444bb7f907efa8e5071527e1e5422053ea3b7002e5ba68e694d4c330b4a908471af985931775eaa614d9d629204e847442c8aa61c386798f40755649f344f472224156d34602a0155081509fcff438c38ee51bc285b21f47d17ef78498ccb4e53a7b5d677d8f8db478fadc74b7f8c87d554e31afb24cb5af7a970836ac4db348ea61e1929264126531b651f059e0b98ac1eb0e6c402fcdb083d045d58c0f7824f2f66fd7bd6aa7c0f36a1121f7ac882022c67e51a89cb7230b2d5ebeb0062f1c37a78c05309", "ac656565630000", 0, 618953117, 1537743641, "3269fa0b69b3d8c20394f4eb8ec685f662575a89d2c37d79e76e6cdf40bb464d"], + ["030000807082c40303d34b0d60cd94036af478fce5a2ef6957049a94eac7610acaa6cb4178e50aa0300200000003005352ffffffffeb4bc88a86f5398db3dc7d975aa81caaaa76ba7ef53c99f054e4d55f49a3c3710300000006516a5151ac00220fdcd9e14c043c79f74e7b9d2d25e614332544d21c6f4446348f0d448ba93b585c0a8c0300000008ac5363526a655351b67bc279010c8ce90000000000096a636300536565525100000000536ace7f00", "5252516553635252", 1, 186677060, 1537743641, "b6d93168d1d68cee1c35b4212167b86283f55da53f16dbe4c17101158657d8a9"], + ["030000807082c40301e36c2ddda3639af26a68000d85a918171b66d57aeb910cc4663c4c226cf2f96a03000000096553636aac655263651f091be2047ea78a0500000000095153ac51006a00ac63486947040000000002ac517a0c6f00000000000765510000516500a57c25010000000003520053902b203f616db791026dcab302000000000000000000000000c81d9ce2b0bb8ab92312e5aa926903c3a0de12e45befed19e125cbb800b3e4228fe7b2836f4bb6780285eb7a8372c822e1f4c27d6e083cd3f15907a7871e50f6c339c5af104e22d5c21184e7cdd460cf7ae3bd514d8e5177b44ce36f4db7fcac00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000155a25990522c40ca0331c64f43989eca17cb3e557cd37ec02208cd58553483bbcd2d656f74a8bfda5087cb796286a7d69625359a2ebafe367bfb87252d03ec4a452e02aa710eac06a8fb6fbb3b9e1f61f58dda95bd2b018abf4679fc25860297f7054d709e480b54dff297a697c3893d22720881402814fd701d9fe5561d1b00221eca0b974652a5951547f34f7b336cfe9571dc318dd4353b84f1b78792ac76d021310b071c8c8aeba550032f486400531923276ffa36faaac0e2a7220bc5f3a890a080d177d60e34ba499d560e2501476e76e463a117a749b3437a0c8b6b139361c18145479a47c90fe06517b524c63b36a5cc6e85575834cc24725eb9edbe61e6f0313c0ccff18f07b54fa314a9ec1d2b6985fda10b1f81b1628c277a33ec805789a031bac2fa2c662dc9e27ab6e98fb3ce08d518884a32658118dcc0dc81bcf59da93022647ca45f1f43f0089e00019472a33c7e9e26f5c597810a47b68dc3ac92dc7bd020e668a38d492571cf2d09e4bf91c254010d84e84bea19e30429e08596312a753021a8b084b951b32d37713cbb231a475b946d8c866f732d4c75e8d4f142a96a2a2034d4172fc9841c406cb6720983205cca12989a5cfebae1d741ef628ac0851d143b264326dc98f390ef436a0257d3a41723d670709051310c113cf385cdae7cd70c41fc25c307f46432647927f592d97aade3bc9a6a102c21c6fc7e31948a0b62423197f06d583116b00e5dda9ae078105cf6c17a9a5d989dc6a19e20ce8ae9e9dc71535ce8d0c353b63cf985adb3014b99d7b8a37e7e48f812fcf3c52b06ccc503f81a8e39f79ff3479705292d4d121f67e77fb7b84f94186c521dc6fa029fd65a31ef5d7f2388fe6c0fb7a1b233cfa985df5ca59eb024934907d8c4095eadbe779e1f6d302a22c5dddd06f20c197f7352139a832044a35e9d146861b7823511bbc80af271d8fd88835211079fb47b54d575684ef8e3e0ac04216dc7c11a046dec4d51509d8cb791b0d42228f6b49d27b5b93ba6981e27bb627aed06631afff12db611c026c39bf32f620bcb96c9f07d896c2ca13dc6944a57a3b02cdcc005135149063dc690f54fd18ea5278bf43a237ca52c47d17de17a4e39f661d8adcfbd32f94495259d593268a6865fc5332b75733128198156d8e8a631a29f82ebcc5a52b7c9ca30466896d9e8651b095ff059aea7d6718d68d35de11183b91212839bf675089aed869a9e5580a255a99949f5a2b5f22fa2f125634a1a66c48418a073ade5dd5a5f0b1e667c7ab17e64d8dff6f677bad6ffa3c0db1023e0d6367228d5866fef097330f559a531a944debd4f3848f9ab16cc6288d1cb0b8e0142fadd20ecdee5435f5bc0a3b11219c4d49f325b357b97f3470d7a0f6991aeeb3ac9d509b233c17207158b7e85a3dfac740e95a08e8db3e5dff3b153ea61f9451508fd0ad87cd78aef2258a65e6318c58b099fb499af3b335927ca72ddebdaa4e02e5f6f151b6914eab1b3d2931c0e31f8435d0e88999abd4c129fd1b5e0d90f5d1e3f5e5e187f23c9bc96b79d82582d4ceba8cc9382dea9626f62eba760e143ec8a504f8dead771fb831cba78c05ab38aa56c8c5b77157ccea77bf8f07360170215de22b2b6a0446c779835319863ad3885865d91d0ad10ceb688733740bc898bcaa0c5d91afac7115cfb5ede87594773db559bf80078fbdf281d59c591add80fddfc254913780ed7a8f59e75a321ba49eeb481f18409ef341cefc999a8eaef63d5b4425bdbe75ee96a960e74b9a301e6266af1100896d5827db10954fa61673582a853dc7e1c0b51f47d97cbc02b856a9fbdbedd978fbae8ebc999e0d5c5671a2510e3dd382ed9fd82ce471438b36fd068bb87ee0d26493558b7ec68bdcd503f81e7065e7c6aafd50b61b80d2e1d73909302639a26d9d936bf5cd39e94e3388e2f400e3e1b1b08c587aef2c9cabf8917cef0a147a95adc2ee8c1cbfcaa79f6326178212c31a36c4901dd138e8bf5b8a29adce71053a563bb548159c3cfc7962adcfc07a85b36a95dc5037efa4df9b931d3644c548f30f7aac9dd1c1be0b077ba511ddbb2e149fb23b3c741638528c65bef0e8f65f79389842cd6e3be631682c41cc113b379d421bdf9f2be7052b6c1f612e118c1778c459674093797a039cb136034720d7a4fcf6e16094de0aca503631fa66df3926faba77848228297703dac452f1b34451517390ac2cd107cd8c77ff09b85f162d999629a21b2a515e4a797525285a3df846e60b73c1a87df5802977e0bae57e000000000000000097f09705000000008506f7bd713ffb292282051bc01cda2911bad58553dff714ca083655cdb540904f1e7a655f4988f49f9bc1dff0cc9c4faebf2cbbc9895a4b57e53964619c63b8b5eb33f13445a944cfb5391e8c184161c1c48d338954576ef34b9ccce09e75ac00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000201a607b4c80c928f51ff5adf3482fe23c6a5bf112f1e85a972a9b5bc4e01cebb5429c7be9e8fe193e73678a9614b5c290d3b0287996d3d161dad7d115f199ff63010d56899cd39a90bc64a9e30fda76f759ebf6d4ba555e22324bf8288ea3a98a296b27842ac7e68e431cf6a256b2ea4e2f0f1a789b7c36aa6eed00ed702725020e96f39bde7c2803f15b61b8c8d2e9a8ff9d165201fb16f9145f02f291ec4eb90208028b62df047fd7a2f15b53ab63702dca5561a51678829c3ff7edf35b65bba60a0543195d4b91141a0e08c4ed4deb0bb363bef43467ba25f647fc7ef9b8b3286d16afbb71494cb83b34eb270e52a3ef224caaf35af8b1f9212f47856f9660cc1302290db732d87d674f4f93418dfb67a247c2babea7246373ac72637b4d0aa776f6032781cac9098d2822dc187280712985d846944ff04c1825f26ae72f3bdaf040120214b23536c0266169d0707b60bef2ae5c2b7cafa035ffe29ad8c5954fc8a40487022134412725cace425d355b07efd078f8302d842609f1c6a565eecd04005f5d0e031d4a132aea39d64ff5454d3550906546606a2553c58f7d696a4173dc85cf4be7ba28d2670411ffd0411244d0d6f94d813a2d58e3e7dee977bff83c944ae91e83f18570426e95e48478ae8dcf406f81bc88e1cbdb29683e2d36ffcf6c11fdd2e8d55d6b6af59aa7b219b2f43e00a4e15df64b5d70a043511a1eeaadfecdb29a36124d0f6e32ed6b5ee18a75c81489114affbc18b5c056dba765f7b41b1bec83b5318e429cb8ce7ac76dac31329c6bf633efbce3d924891051becdc09143525306f05f825af1e1c070a538a2b5152865fa8a0b1888f99d45f418f80c34370955a324b6f3c47fe758c77a144c913446d7e9e6e5d0e69fda97bcaea51ef4e584dfe8108e223db9168bcf113a01d77e7fe27e6fea7b8847c6d5e30c228217301b02d2874c396a119088e273d1e3699f29362a2b0f20f674bb958fec353dc12696fa0d8b33d2afe14cc256745c0cfaa788cde7a38fa891a5c3a9426355a1f01b8d168eb69cf469fe6b404161b35e92142573eaa4fd9675cfb782397789c72eb8a2175ae224435d1e0ca6242ac10199524a294f7078a3ca97a455f7aff1c567b10aab65a9665a4230f15c92a28c22fb732c04c3ae016152c3e24688ebed5ab77162a9c91701b68173be2285382dd71f5242f34cce44ff12b652a6907dc0d11377f5950887ec7b9f28fa571543cacf538fd4478a7979c73305f86fbf3a41f430b8d46f9d241eef5f5628269febf246ede4d2641140b04dc52ba32bb33c91ddf95ffc19e5ef2a8bd8a6f27f96924521ba8154ec6f7a77abf0c7d3c59e675a6c14593ab0b31ebb406644b5bb16ac6a46102cb34bb10b9da978bdbd9bc25da8d3a8348ffa9f2fb2b63e23d8acfe105243e3bf97de430c5387dbadd0a71dbf30f8f959185af0764ed1fe74462f9d30d619bbbcdde4fd2e9c75572af551e221901c906b2804674e33a7839c5315142f9517a9af08c702e239a2791ded009e63d27cc909402098b5519ea0a68c59590d8da4409d09a4fb2234e20e10ffd81c2305cd104dc33e4dff04bc3428fdfb804ce9f7ffe54ef1cd859741605bfc11bbdc53508647297af115db01f8dc7618142c292330914ed98c2a6c623256a269e371f95a44dfbdffdbdef1af4ba6608145423923aee2e2c12e0bed2bb675394f13cc805b710fc15f907343d4f9a833e46ec01caf47a062e65bdb9d7b3947e081f030cc8ea8eb08d1f88bc31b31a360275fcb6b10b11be8dad329233a38a7bddbd327031428df9a8d91b376738a58ccbb7ad07caf843e115e0b292838bccf38820e0ce96834bbbd77e92747838284cf87ff1981ca9ff40deaa88525c4e7378d0bff244a5f40a6f11a6ea461a1c071b4bed6228710732d7dfd475a5993136d705c2f458178189f570bf22e00134a7605115c03d121e84a33f1dc6c9eeebeb6f59c0db8c4a1ab46ad12d1fb5e08f6d8e796dabc36528db922394c098294757755a8620626acba2a5e2d5df7d98340e98245baab5ba7985b442c8503c2348796eb52528a631cff9c776b9d3b894ff409d3fd45c24bd79f44cc81f3dced2473ea003c0c541b0bf9dd46016a736e4f573fc1d214f0719a40d3445560c0264f53316941efbbca20cfb05d8a30c04e8c117718f1ebe5191c6eef0a0f4c37902c790df13ec6a1db6a25f8424446168c1f8ddf94f36ba1a3500ff130f5f1ffd5dd798d6cd86a2f30f8d86eb067a956ea0cecf3d7c6555af1a35b4ad83ea4e9905b8593966974f79cbaf8b30c34c15c4eb4c650a4e0da0ad0a7c122cd07de89284a5d0969b03b45ff9ec0857a37d8e32be2ced1348b042f8a3982a5f5f8573fee3b8c83ee59bd0d91dda3e2cee9cdc1b8e41000f2fff500bb80cd6038e5d9bc07", "535363", 0, -549801415, 1537743641, "bb0daae130e0c5841b47e9fc0999fce58df16544a9b9955f2a9fa98d323772e7"], + ["bfc96a2a0498b8ef1f984ea8a44323ae4f3295d674101aab59fb61dbfbe0480a6f03d1eb240100000002536a0f908c63911fb063588ba010f073b82bbdd1bdb70bb44af372f0650ece35c45cc4326a370100000004ac526a52ffffffffdc89b4b73752791d46c63b59952ab06a06bb71489b548296d8c0f1772f57436203000000075153ac636565acffffffffa2f1eacc474df1095d529a08ad356a741bf2ccf9e6bb7199a22fe320116c2582000000000253acc2c3085103678ae40000000000046a65ac6389a2950400000000026352dba93a0500000000085251535365535352e360bea6020000000000000000e059970100000000454156985a6c556997f27b60bd96159198ea23a132dff6eed111183a6ee5ffbb25951820551358b1ddab8e671ba25173c6173b049c58d33e65a750335b7dc5d6fa7d63f31396ca96b20565026f94b252882c5604e5044f979a1a5ed673b8433d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000884d82392bc7cc7c2e1db31c11dce3b10ac0e69794d68c0a18c87b5b54447e04ebc6a81ec55d946d98b8fdca9b5be9e40c46f9fa77ad2ed2b0b528e6061b85f9c85f266ef43cbd80066b65dd21d89e0888f7c65c6051a61d1a7a573e6335ff6f9af62753c775bb7337aff5020320efe91b8ad2145a40c314ecad9263965a3ec1021c5dd4190b911026eff1d051807c2f37d970c0d11c5c0256ed87df4b54a8769f022631fd6962e8780281e526dc6f966b9936cac48e92e8c8fcafc02afc67630f760a026a313dfcaef0f4ad0dc2ff38c5b28aa2168bc168b36ddb336ec8966082242d0a5389cadcbdbebf112a888acce43e2421e152495992ee022e615cf6df119733022d3e3deb796cfbba8e6f7e2ecafe9b1b4ff94c395279946d597db2a79615541203264258bbcecfd38529b271381cf7349180a67d80713a77554c86ee269ec22ab5030cf43296d3977257a840abd30c8e0038da97542b3c5284d7090aabb5749e9d0b0304faf34e374bbb7fff342576b4ac52b6cb557fb3ea9de85ef9f2cb55141446f1032e749c99574d73fd0e928b2fff86a725d37693357645fa5006ece91a561a61551752afeefb7d2985a1d8a51906c9fc14badecdfd5d251ad80032a0c59587deef02360a20909bd4ad74e6f8471774bc62bb0282dea852e11974f8830d5f937d121a30528852d0119c442aafe8f1dd444e94b12499d4b8c32991a5ce612b56ea3e580accf286a11b14219260cfedaaefdb277feb06e773846db78e14df1f35c4a5ee994f2218ea4b1a91868d3e9e6f6bac93d6a7de766f919469580e065697a69b4d8e57bcf1158954fc50966bc2ab1d07640e7a9973b3dec32c92c929485e9d01c4163ca2f7c6a755dd145174af186e3dc75d34dc9bcb91b7162519e6dce627d7265e51a52b970eb9576bf8849e0b9d7e90736ba75f57fc9a2fc97d48ca0ed85940e48e45fc908e4e16e2db4ac9e6d96669e91aa4c1419c043fe73bd63a4e3ef2e0af9a27fff4e3ec1bb1fe46d2f9293d06444362a1e8de72069adbbb252af203661e1111b11adb4d0f77bf4b210df45ab12671381d32aceec05cfad89572f35f91ee318bf9db6782022288528408c032eb330faf2533986085d07123500682f077befcbaa2cab5d9efd1a4a26b8fb7abe2c43f5187a5e91548fc0ac052e93580036065669fa3e4c3a0dbabd5fe3065c2963d0f4903b32d4b5ac072a0a2d0fda1d294a7167c00c9a22531d73a2d4027f347a46c3a2a73671ae3161ecd1188cc9ec9ba2276006901ddf24214f4cef694a3e71ec34923fd7be0c060fa7528a5bbe7c06d0c781c1ef3ea8e7399256f5e0d697e97c879b51343dda22a79425dae33612fc5b6a08c5c57e426476224673f69c94217f83a96231afd683851686f138e257a2e96f3b2f2ff426c029632f690a90243c66db26c40f2b222b1440186a3c7c93d91488ab39813f42663fd021a52a5ac79f32a135ef2b95d2a5484a3385439744d76b34c6e9944c67b12197bfd854e180526ba218763147f1916b4691ab5f9aa7c6848112e9ff751adffa04bea6c460cdd131c57b8291bddfd1b39a7ae1eb6c26ce9415d4e31cb509fc203695f6f6daf9fe62b384e5c687a9bc0e7390fd1a201707037e689c35b32d408a023b99cbf73b83d085970b5c99ba578178c4207ea07f02ad659e3c0c66cac8da3db949daba942bef757438aee7be6226fbc46088567b904c9707f19020f8dcc1865c59b229717715b6afed4d625bc9343a9429f27ece431452b9320fc5a4cc9ab8a4d789827f553c88afd590eb16c38d365b17964695c87bd7d7574e1fa8bb81d2ff01e4ca0696b7cbcc7d0be5a643b3edcf11b2c5236e10f99816585b817a417f7bd2fc6aca9a14c8850a9a2282c7de51a8daf87010dd2d4343ffc2cf62017afcefdee5b96298b80ae216cd1042a556a4988ebe2276037a694a7f855412ffdf215fb628ee11c968f55bc4ef55c219dce140258f8ab5547fe54fc5883af48fba05e96bbe1350e066ea4d8c2db865a4ad00138b6bcdb9b8ef50567e7df8079be77f753a3cd8b56a84a6ede1a8796fb4bcb2e8ed83d5bc007119f10eeb94e136caca2b0394c65462c8ecb05cb72530d2f1679f96d68dc70f99d83262835b05722fcf25d21b7c3bd9bb6496be4310d933d17dc6c8bae5b33fa6b137dd32217ce5ec33d766aaf13ee2652664034324d3a8c25d1b96890c96815fd4263aeaf2e7522260f9536177ee67af853567a9d72e2305c0862fe802aa56d17bd8d60c48c5cfc2e7f6de57d1f31d06f2e5700000000000000000000000000aed511b592259cc3b87b80905943419fac70f1de49065b46ff8b22517ea2dbbf71b9e08224638f5fb5c4c22f446bf89cce3199fcc3fb314abc11d77eb97a1152121a1276ef28eef1c00b5d5f79362e6043db5078727bcb95771791faabd2f58a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f664825f9927c6643e0f9e3c57c3ec82f0e1ee35e76f7c41647877572dd8a0e9b8839ce716a1a049130b0d88da47a855c9dec040a7c3f5304c031231a80dfe9c0b33ce517737ff36f58a6793241f2018f91cbc8d9b86a19bca37fb6c3f73778cb5ad0b59311e5cd585b9817eb6a69b942d9ca8f700b178a2d4eab2ed5d3cbeb030696b76dd53e3ef76633e2ed8681540cd6f8df74e5cb0ae5e29a5b495186b34c022ce5f1ac223d2e7e524f2b10bed7b39c2ac40b50f7efa9ff79c6bfa516b866050a0844b3b594aee64e9e3842ba578eb7b6aaee4a2e246599cd0697f848fb35a89782e203172aeca8d99e9da4402bb96b34597dad320f783e77da6e053a226fdc2e020eb9c8132445c0052a77a551d4fcedcd54ca9d9d3e87ecb6ed9ffef2259926b80322f6610314c48510dbe58f1067f8e399249866d59168bb53fe862d02a12cf0970222847547e408a63d26acc3985474b5a94b7d91dcf1a01a1f9054f141a4d280f4032afa4dce9b7f8b2608f19b9a5281751b297ae0876a04105a37f550683acdefa602166868e8065a5d48e692b1709d4b66d4276b56a779c87297afbf4201fab93929de9b82109bedd41cd7c8159048592120097ca708bfe644fbaad58f29947247e169cbc98ec1559ea347de6519659e49fc80cf2f366d0dfb46b4628c7dd92b172de2372d4442cadfa1ab164c68d6aef2102f6cc35c66d0f5ac8cc24202b072028de6c30afe84a1d2fabcb60433e096ea47c8507190400c6d8175a648d2fe62142e75ccdd56ebc45e35066f472a2397f399781721c607df8be03ba0562dc8c64f1489d04963586382c664aa493653e7e1b075853816091794bcc7a767c18d95dac6cda71f4e305801546e7589343494fdb41c40c24e57cc2b041f040ed159bdbba64883b696a7987b8eca10bda9bcb2f40d9d0eba0dff2a66199c718465cbf98d4508ba5e6ae556008ff8fcbfda1c6561aa56117ed84ebbab9a0e1053cd0407b3e97c499596945c455119a2974b5c69164fe6913c5b0e429119c243e34ad5cbfc732dc5a10fadef1ec15c7a69f7092f70de5e804a71577805d953ee4db3123a6f2ceefc2db6831be108e1916910f04d1e79328cc4243d361f6f4e70bb7f6363cb1df0bc596f4d829ed9052a3be95f43714bef41cbe8e90881033f5d5002b3f5591c84a0bcceb343f659fb1370bb3dc55236001c5ff3d27f16e104061078a1bed3d6c6d272c4d1eda26abbb8be9e165ce6f956531af917c47676569917f49a1cb6895d06e1bd83dca166513268c0a0ef1053fdf7dfd053fe415a9ab7e31cc024a6419a0c816df1a51684fb517fb506f30ad05ed8ff44f5af76d581444ccd030f37e297d151b74a279cc2dc3d3384a6ce32b7ff9cf4c78c2da91de788a148dbc9b6978b9834e61534b67fb67f4daa37427b621b50e131b05286367293361a46f6a49f74097203d91cb9d94d03cdf8eaf50b00611e6ba4f0d862a9770011dde0099e2c050aa2edbe05c83a10a34138b88630630f9c9c6e2d7765b677eaa7da2b973023e286845c60f10b0bad45f8a8820d35a221223fc660161c680f23168a06d7aa12b5b2ad88c11feb81e748b4a9e4be62876f30153ee2f603354c1f8fb092e0166f8a34a485f80c0fbb82ffaf2e81ed19dc41b2c88f8c13363797ba5848e04593cf727aed13483c024ace79f6b0dd6478253853386104b99c371d882fbce7d0a12a19f0ed7f73f67d92a7d57b223ad02be0a25da93a9b64ac37585d6edc0d2c1bb653828f823eb8a04c6796e3c4931b5f04ce18c93c0f7ade1053d064678be676f4ac767e32a5f2adc00e8b3774ab4d9b7b377a7a4e9c43ad8c0594f7dc06926570f44264920ae4ee64f51412c4c15924ad4eba83e276303292319cd2a370370ade893e8ee36129adc713069f28a171d693380316d0fcecb4ce106dcc8ff82d6d61dd3dc44bf8e0ae36b81af2d66263bf28cee502062da8b6166ef9563c2f86da629a17956489b9f218557b23c8eec51197a933725dceb856d0d4a158500408bee9684163ff37f87de37747d53543636375ff6e33342f4767e5fdb06a1fcf6bc792c427597cc7ed5555e583160e70ccf68da9738e8fc695d5a383685fe7d1401fa916a9d801cb4c1747785eb6d1e538e542723f67df08f1995d1175e2049a37159fc689f190e0588277070737ddc102a7457296fbeea8dbedb8c88944a578ab4c68badbe6ffea13a400a739224309a37118f7d57c66dc4cf9a2cfa5dfbdf1df96afff8745c2b8bd6bd9f3c9eed0814a4f8f1828f513f7b7df6988c64504a6627dc125188b66a41d45e1ac890ad5378ef1064f52a95953d272a1b0a8d4c085f92f4de9cc33cdba1c2150ba721ff581af844cc5b4460162c1b2e8a7b2159086191f26485ed68ab92a1553ac938c0938f02246680c", "", 1, -2044221074, 0, "7d851cbee08ccd71d52615c6be24383f819973286d0acca3ae46fe74dd8c4205"], + ["b866b52d040e57df909c67b3b09bd165418436d85a8955d4085b0a0ba58113f10bd2c432d801000000085100ac5265516300ffffffff5a5de176f1392540b66f76b52a86c14ef3b8fbc56cab5831cfe20d6ece805c5d01000000086363516aac52006affffffff068cd5b2d3625330c9201dbb635b07a9cce05879a428eb34a1cf2442ca6c9ab900000000055165005153ffffffffe7c82b32cef29471f784594029cd34324e157dee5d86f4e8acc03dc730e8f599010000000753006351ac525128cab918015a6d8a00000000000765536363655251ae2db8730189eebe03000000000000000000000000ef5fc2460175a14913dddada8af856dd33068cf95e1e2747255e7f1b61d203dadb0f7578ce8acbec871bd8afdcf17c103505bf792fd97bfe9ec8ae2992fbd3bf0a0b80e1f4b2986791c699517e327c64f50d3377e6826572c1efd368d59ea4570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a3d17319b109769e602d14d2fa14d1418a65aa8d4019fc93d46ab2c6f99fb199d6e22ca62cdf16c40d1ac1499be25052bfb841b335b8cecf0e99e231e3991520720d644616fc76f141d1061bee6b1f38aaa4cc7f10a0a1f74efe922ed8fa3a55f8ccf01eefe6b09781f8786b2deecbc86e8b607e3167e548c80bf3e7c5bae6021446d0086feead3c12f4512ab8c41b0ff816cf1b18120ac607fba39c047ce162020c0ac0c147470c472df2c060a6aed808514e341259e2219bbbffca8f8968ff410b05ba855f08c63a35f7baedbe784c88156d034ddf8365c40a51a20a066219ed0b79ed77f1cf3de00bb2dea381253892f97d8ebe3cf1f3116a8c63b27cc33ba9ef03185612ebaf31868c75664c3480e69aaf30cbb05e3b111673d478b8f5a63a9696023041a8fc5796f85ecbd7c6d107a3384d26a2ce6453ba8589f81ad6b9a55c11d9032594ed66efdd749e20c03f3be70df14a540f5608280f8e7ffa82a7613eb33c2103253ff1235edc39fe91329155f99122336d6f79f096938f6deaf4243da33668c90223cf741f1dc610f3ca8b792b47e506adedd5ae3adaa9dd762f0cd55b7f58c00e01cbaefd0c40290d9e6d5044be2534fcc2b4c5232e11a6f1e610a3853030dfea44e84216a97a3a206ae314382a21c4a2788fe59ce1820d2be1eb5516137873625197e59f148a882342fe63ba61e8ce713394099806f19a0159c1137d494049ea34143f8a96dcd4b2ed3707f57746d5f7aa37153e7b9a0ec081cb178ec772905651b1f12bc59134df227bc7480661c94497df0dfa4332c35c6ff290b6a833377156f019e882af5f9bc583f2a15ed1390658eae97a8ce769409beab40cbf7cf8500e3c23542fdc15455a6544b66d4088e9e53e16a69de27e7a1b6846a20b18da248610ab61ad2d74a8cfef73b1e2915af0cf2d7297e8cfe49d1349453daa66a93b32c3f3dba0fc13e494804d3ccd98483b1798de0613012db70ffa03968f1d257d9a3e33fd292646af9e65cb0f414e79605f8375ca65c4635dbb487a7b8352dd3c6580021f8a80d02724095ebb40b06ff2e83b782c44a696a15f4468b518ca6e3d401fc028217cc9994b306f6141c9d949e3adf9b2cbeaf20361953dcb4b35772e6ebff36738524003be4cdc340a3a83151a81df22b6aa79e0c004376716b4de8ae09881af893e614909fb6f6bb2be3a4b7013e1783899604b641245da164ea1eb686c897c2483204bc471271a7a5a2abd280b8b11e1f297246366845a3fa0255cd314e0b9f5af6276acd63fdd6a13b562c051c27fd42e2dc4c129ea5f42d148d7129cbc9d9e571d17fb697c5c5b016f928958a98d86a5c6488065e87872c9acbcba07126fd3b3603b5fb147a0aa75bd7ab675d217855fdaf0084be2f757740a2e1336e9368e7d6c3fcdb2bc8de5c00506900075fd5aacf0477e527f4f48f2c92a89c1bdb4ff459bb1f5191eebb3d6b5fc5b7d9be39cc5c0c2fb5f8138a1f08a7c8b0a02449afdfa3201162027e764955d3a7a34b8682d44f5a28c4cb030cb3145a4126df53ec3640b49fcfa8da47d67d3288111a2bed6dfbb1ec04c741a2232bf3570e9b07dc5d1eaf0f5790960dd329efdb887692ff903be485080670290c52b59bd7181cba50be3d0be65c4af0838a79a274f409f5caa63ff13af71e5b56c4e77f7caeea33a91a2cc943fe6a27883a174638148ab1d57fbfe70e992b0b40e9470a7b7087c3c2e9e2d47d42db1b2e5da7b108f0e74136892c3d6d4c2258d62cee556630b5fca821a8d1a7a11b9d9110f3e86fe8df5080eda4f4799eb63a3b09acf6e57ab6a3c017b0049685ff7bd3fc9564ae6f4ccb78f085d3f12e9090b0e85cda19f13b70dae6f84875c4ca2ccc3d2bd876bb160729124e95eeef82a92278831c51fcc489d54c44901c3d9ca3f9136ada1688e09646c67032ee00828ba69a40b921bb90924d9a6f497a7158ce2144e9b597b4d262ad421a9216dfce3e6e2d18e95394dd0ddcbdbfd34c356096441865c077da4108b2bcc0f2d01d5d0991d403831f36e4af440b310aadd6213e9560e705d3f0245b960a40a3a965fd1eb6731af42eee63ee7729ba05bc55177a63b1bcd642b5173b1a3ef9f8b2015064e2ac2c4b4cdad1ada1c3b281e473fbcea38ade6da37b3923ce24e09707175af7e7bcd8f3159cca7a55e28ea166838b0ddb2053604b0c8b642f1d6734259ca4ac453d690ea136b86a300d4e00a2a9aaefa7eaa92b544ffc841fb50ca6383030a2b14cde0997e7278c3a638aa44dfa2d5d00712b5df710b3d6e25a121cd0db2d7ad4ec10eb7889f03988b581998dfa1ffe31b690325935cff3de83a655ec8baf3fd54cb264275cac980338d0b1e5a3b07e0db625cab7a7eb14d219a524e1f4c1cbb5416af23ccc9414ab58dbfacf4929c37647cde01", "52006a526352", 1, 1642598088, 1537743641, "d37f2885dc97ea833fff9c52281301da17887a516541cc4a8fa5557cb6f97255"], + ["030000807082c403032f9190b82d71825ac3626cc4a1b6598359080f4d649d59eb4f426bb1978cee6c020000000463520065ffffffff32e1642faa16466d8a28b858557e50e2c8eef3906e216ea3bc9b7951089ef66b030000000151d8c567a8bf9f9f94d9ea086023738ca25b05bb5a9dc33bb1361d9ee3ba3bc3b60c8b770a02000000020052ffffffff0109d495010000000009516a53006a63530051000000008eb4834402000000000000000083044802000000000503ec27b7f78dea6cf0ac25d548aab0e36041722dbdc67bca6fa1ba95e8424627ff3c850eb96a11c05a0319821d917b89274bc57d9f57bbee1755f5d80b309b650c7266bb9682b05991313752bc05116121f7d3775e40a4f2522419139267400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028f85d40fa176d0b3066d41fb0df060804aa7e49a34e37bd13fc0942711bc50c3217376f1dbb03a2cc4dba4702af1df6e8bf99c5e56fc38ec1ee425108fa0252252b56f6c6795d3b56a225d254dae7ae3e5dd8c87f5b9e5014a61822be0a86035700bf58542e481f70d59df692105e2b178928aa2d69b1aaddb2ace58e80d2d202175e77e62b7ee3964f966e0cd59cc5bb6f3f49f1c2e881ddf8937fdeaa06c496032957709b6efefe8ccbb86d90c6a7ea444d495331b2835ce3dc3a6758b7d74c1c0a07757fc5b5117297b96431a83e079eabc63a0363ccf5b75037b6ed63425ca8129c125ec9c2ce52f84bc6bd294c8e2861583c42eb5c9a723329d1664fcfb7f116031068e81070481ef9ce4330205cc27d1b0cff9ed0c181ab067cb740774c485992032a27e1cd514c4ae4c065abe77f8cf71eb7f1fdde948240f9c5748d651de23ab1030fcb4ccc97d55f5e9e106a0653fb9dfc6ce90d311a8055b06ae605ac7b35d93503196154aa2d594da635badbaea3dd436a7e74d72683ba2e0398e816e3c4686d250318d8cca178374610915bb60eb0d36e69a1ad515cc7326f07e84ea2f1d97fb3a933202e3e99589d1e56e89f27df03dbf3787e60f8e66079bcdcf35f1ce233d677c13c2d4ac02a70107f1bc06559391b45b903704c20d6e72fa0b82334c0322ad36560b5b2bbafab56ad3d80570fcb7ac2bccc8afb755f2ea058ffe710d4a38fd24330cdea814243f37b2f02771d1c97e76b14fe67776537c42f019e68c03f3894ddbbac806668ab0500c42883b702f634d625a518b0c47763947c7a5bad89da3547b653dbf3a9731fabbbac0a88933cd06cc5ae685e33fcb593cdcc594c0cd9fbdb1a486877277996193e6310d17a730943d56086c94e8e90856d6e54ed74652b74ff144387905c4f707024241c3071016a7b9eadfd9afa596dd49e096006b765d4893b3dfee07e2b08cc7482a8635ebfcce2d072e709b5d76db4cae841961a2fc2601055e3a43ebaf0f47ca7b30e891d64b49363b028c6550fdfdbc4dbf6870cb9e1b50df818c3368d744840f6e82372b8bb6c918113c482ce06dd60ed77e0545cf9ae6a1abe506e3d9ec52c75cb313f05b1613ff45fc310866d18c1973b9fca12fbb9e65939dbfff60f7cf4c5d8bbde8779df16fbc411a98cf74b842b29c9df5f0db83c01f24ab817f0c285ec08d3f32d85cf22906dc125d0c342e759eac6e2db3218d01552ddeda19052c0b040d1021563e8e134315f7ce57ea9a206d5965f695fa3365bb8a85cb434ea531414ccba1582dcb588c84d74c0f3f2ab0cc4a4bc4d3a808485f068765db05117ac26d171202d7c6109427281c64e8bfe45cc33c6bd29805610c852df06342020c1fc6153fa1caf2400eb85fba35512848b420488b8170761ae3caa1b6814e82c723aad1fb4245c76c58f8482ea589a09297b2bb5e51d37589f64862687cd055ff5719d512a9e9058c800f2915851a45d06811ea5643ef83fb7cd396e08365024274fcbc34fb47e0bb06561deff6792625f4ab66cb468d27ce985c79361a2a2c09b04003fb211593d32fb441559100b13a7bef9413ac71ee8a8fb6f8c2d44e366012bbea181368f514291de0f5157d74be24b7fc6a8c81b3c5fda81c9e3b9428b1383f3f9fd6537914bed70253df03216714ee085db51b4b2cdb9d29b611799711f0170085984ef1589e490e874ba635cda2242b6a1e11392f4f2a9806bfedb84ae48ee70a5c0f53ddfb293406943be6b0a9f858309e98f3551796e8dfdbdef4cbba16f9d4a16eded759c70ad5b44000a0683df109cda45486151133a95661f47e6426b79ef28bf7fef8091193c29dac5ae4e0ddeb7e5ce27af5495c937c6ffb54f01312e7f22fcb3bef33a7dde28a4682a8579b822d4d126ff700adda39d5609c89c65739bb99f629faa36b86cc8c046130663f1ec22cae05c62cad3bc067e06029b463353df6965a9903b9edfcd95da692fa45f2416eb8be3282eb9508ca368e99adc73e493e30ad1a65bb134ae6576b565cfabf0bc8b0d9e1048a2ca5a3a2f00706dfc0429419806491afaa78b4f50e646d6f44e2a15ee3e68611073f46517ea09e42d4e55ed72c5d4ea58f38ee905997c0961b9427db18583874855b970528140182a51afefb68edea747f2464bcd527ac724d114edef0f6bde4df8e1978c91eceb61b42d581e4db88eb67678d3ceb0b66e5dc06587b24763a7d4c1b54374363f882bbae4dae3b4f71d88851004e88e2ecbef25c2dba5489e323bc140d94540aba76fe7317690b50300000000000000000000000033de9c5e4829c1fd022f8e643a10d8dd25ee36159689159d1059f8832a824119c4295e0cdd3d72be02f79ea0d2019694b2d6b8feaddb528ffda0b6e4ecbfa961a1caa4211aade6ed1e34a614289ef00227d4f4f852b1a65f05b801609b3878a7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004047da47f47401735f6dc4b934677c88aef757a3300c63bbbb1f8069183fa694716a11306900ffa58b6e9cab1261fb431d4a9e8c68f9a7669544ee7f66f322569d83bd632ae9ae158d8328ed8b1add5ecd093dc5466b678ffbdb7d36e04ff0f122e0947b4ba81323fbff7a2df226532a228ad7714745e792a6d0c5e8024157420330000cc129ba88d5759f70fafd826c161c9ba7b1f41c551c47c2587451d0d749021ac9429d70d0a79233f85335913be9983567e6f3adfd8ab53bc533d779033ecd0a03639ad105585fb0f34152c07543f9cb7cdbe342d4d1e21666a858ae6a2b2a529fd5f1d75405c27ff9b809129f0f689bfc7da281634e1acb2280ef9595aaad480220080f02eed721e734cac5573c56b47a03367166f85038431176f94d3a1c1486020891028319ae99f99abc420cc70c8e2075ca87accac6d25b74fe3228d70938e8030835291d41db6866b72c8521e209998215f51fec65413643102cbccd7e7c576302188165baeb7f901084092320a6ec01d2d86e0fdb58ed30f0cfbbdfcbefa6749d0320b35f205da8f0f619dc28656e78963855239c5eb45ee73ba66b07e56ea21df26d2460fc661d7f551f541ea8cf8e8ff9f6cc06ebcf10ef9cef447f39ac64f359abab43729cf5e1ed55d547475569e356d01b9e1177dacdfd83f758d5d8608de613c6911749281b7e3eb7ce72a8dbe83003c26285a97f3b17f3796b83e3a10b43724ca2f4c91df831255dbc1f6bb5325403c808e1aa0f27650c8ec7247b99feed6999d0ad96b19f470c00bbedc790280812a8f9a15ff02fc963c5b90dc62be22e8a38590f9a5e058e09a527d1d894046480dbb9a4da16bbd2e1e3a5f5aac4a431aefdda25940f4b2745459464f7349e05c10470863d420ce2f5824472b74a58e6a7e324a9cc88fc9df3e59bff567d1837ea76681d1e11d30160bfa4e13e4bd15417fc3dc2885235393d656b5fdd90f9a269263a51a034981e481cd0386b1fba82d659a30f5a35438ad43948ab6872b29fb5d2a21fc6135f32b8f49495290327230c342b995a285f0ab7ef69caf85c7782fbba23d7e1a7f45bcb4180ae7cd28303160307e33058ee84b629abff5cf2d5475d08f632d0fd4f55783d3104be3b84a248cfda1efe5892a277db7056df0f0fc4687a9afc0ec8eefe6ca817840004039b17fef68077af0fa2c2889b5d498f1c7eebd641b28d91be394403c14dfcb0e81b3caa3d73e62591172c855829f331b668b300536c01a11bd72a13076fbdbcf65d7e18e6640509c53feabdb5bb234d31149cbac6a99ed88587fe5ecbf486a5b1334c7839e8af48feb7d4824f4c4ce59c33821b466dbe8967fc9e568c28d8da5d7e3317b3134d096b23b9f3e304efb55e5708c337e27f8628ad0fae462f65c86801b0539b70d697efb30eaa680d5844cb936fdb2229d4e8201f8e98acd9bdfae9e54741db83e8918ada9a9c216b32d5f37b4673d2ac67294ed68f921f830cef276c36fec6b8951d25d5b8560325676e1f1baec826eb2025fc4e4d1833fc89478c2d623b4d39733099b3d45d931042e14785df3342f2d20fdfa3a69a9282ba2b093740990ba5d02e1c45893b40a084e062ab7aac747a6ec1c3ff0f0b3daeeafbf43579f397f486cb81293874cba594ee78f12db5ba95e99eee3d0025cbe2e9dccf8aa7ec728fd2c09955f0764163fdf7a9aa9fce3300bb62e175bccb86ffc361428422248101a79cb6144ea4abd0406d65cfc8012866557a510b705b72a0a053c5209901be4f4838d1e8e2952c77a2b966df021df67c7c90b9bad2d6b93295d3e73791c65689248354117428f7eb924fc1e6ce81681e3bbcbfb2a77a9821a5f05fcde850ffea971f56f895fcfaea651126c749bb2633f4b37782dd31eca3f274001330cf688ff0c9e822191068646a3a8541b8b9cab831a6f6e8c05b1aeed13ad6e06a052ce365abd9e0b9d829d2971179101324fd3b2339de37213cea2a2663cebad79dc9b77a71f93c2ac257f9d05d1e97854bce9653920964e176a207da11a8b209fcbbeb42ae2d78a57e81090281d6787fe0aa4c5154300b19e698abe579b28e05eac4094d96331e92f471759066ad6d5e49f90fdd880eb4188cbe5cbc279a2616498297ca554a64b62ea23235067a6f06f395e993f3579bab5fb2dccfa52d604cfe0e69301bc6c955ac893fa3776d03ec605e36020125fa6829d0a352c59ba808228e9aa4e83caae1bc7a96cdbe2d49c36543e3335c5441efd169ea2087eba681cc5205c004ac4fd1eba322fb5d429f451dcc949addcf71a1707fb409fddfca4d693ea99de7a201a119c308c435e1af2595b0dd7d9a88582878af26249518452a96c87e7cf06e8feb15384280d71782b47fdbd2c0ed8f288aa0d1c0823480f1ec332e64849b30ba2038507be5bb218ef80e", "5200ac656351", 2, 846273779, 0, "7819b1d350bd8ac24eccdc7bbba9c1680ac3ec3f0dd153a4349212b24b778c7a"], + ["2910534703bb7e66e62eca3aad22e72939c5946b7a6afe0886679e6e278a9ff6a854e967400100000003656a6afffffffff9ceb321f05ed8956bbcaed2a97239891fd86814f45f2c6cf8517ce4f67262c902000000060063526a65acffffffff54e6fd072d4dbcf56cc193eb772addea12ddaa1d1cc6ba0df6da49c11d83419d030000000452ac5165ffffffff046a6e7203000000000763516352535263d5421a040000000007006351526a5300e7f06503000000000500535153530d17640100000000066300ac6a65520000000003000000000000000061d4fc0100000000cfbc24d6023ae87b64ad4087a1c47e464fe67af6c5ea3400661f2ef894dcc71e8406542039e0e2576a07b833da63e18d8d70f2015f28a07d912d46e41bf5db36ccb0680051813ba75b54fb79a5e05212114563b1a086de4bf88d1e547a89ff25000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004f884e810e3801b69d52f11dc010ba64f56e80374f6abb43210ca925b1150beb3947d477ca2d7d24f9a611ccad72349fd1768382aaab4010dda3a69b52812ccea6fce209222575842f54b8d7da11b248c4a632940bdef563dffda0fb5a48e9d6788f0e2d9051451e0e1d18a2641f3efc65fb9686a3a4ee891113753f44321c3f032757ec2f8021d3ebbeb2b5923125f7fa28a2ecef48cb88a7a38f23fb19205d760313bafde6e93afebddf158cf922bed30f0d303e8a8fcbd710a3e5f43635268e0f0a01ab0419a985730741005a069b4761df38cf6d95bf2b0bfb6a31077907735026bea666f866eda112b30ada45166cc978c06cd3d5743d0f96cabbd9c31e850d88021b5576f74c47b131142daa4725c22ee75c3e5a2b3c93daccb5b2848a34f4cbd2031066f2fde8b5a1bed5ac053e8b7a8d66e4aee3471efa5a3beb0c94d27e377a4c030938c1a3fd426718976fb2998f7152b130af7fc4e17ac93f94e54428710ae42f030284a3c66adfc29eadc4c140b813f80a0f832bcdf2c9162815d151fd9ea444b80220993758109ef44058d977fd48f7042c6fe0164bf90adac1cc9c2435703b96ef0f57d6a617bd926ef79f8e6a9064ce966fe8b53ebbb886fd45c83aa1504a0708696e787fee5aeb612d25650c6b75cf8a75f2c9ed3d97256d014bcee103a47e464af1e0468fa7262130a70472365c825cc1421c9adb0e504b285b6b6501f1dcd35ffbaa044a4f4d385da53a06eb58b1e94f73b66d754fe938dedd939b7c32964dad4b5f0af9270c001aedcc337401a6a900bbbbf7abf2804beb1f981d0b2df4ee52466f32f7fa07951e57769e6028145b686c26f7ea720cdf513fcd56601c35f065ad79fde345941ba48363f46981e41285b732e12c81891f9b27fb52b7c96c62446ff755a2bdb3a08d4089dde2fe84da1234128c56e94db85d6e6b0619b2a278ebcd9a37854470aaf81b0fa8a9427bd3278e223ff795aa39dd1d0e7dd0c7c235c78c1abde01cd71507a24b1f18a0e43abae432b548f79c513d752f7d23aa9b95f40245543d75cc6e48ae9ccb64cebb833e4ce614051482b0583c762c350b508ec09ed3cb604508c652b3478f52e149b6e4316dc094e3716a0f94c99b749f92a23ff60635df6ef9f3c4ce8cbb869e85ea38b4b800c71e2383f3bd9be22bd64464c5178f347ec79bd221270bf3fdc019e1fb96c278c03a78872169ef41f7a0ce7a7af2f5b2ce0cb13db69b4e39fee4e012cf4d88e48efe098e849be84cf98d75709b4407b637ca91cece473dddb655d4cdd6be27f1c470e73bde72996fa0b937b8c6a680694919d7174527ae2783866d3a741cf85d2ed6a917b2cfd1c22e3c232bf49db614cde4aab2de0b18e30c6d3ef37b6639aec796827d12159001aaab1697b4f0111d22d52139abece99eae98e07bfc211289559cf518f6ec31b6782c461fcda046058cdf2a811f0b5c645e86b5cc04998717f3b51d35e9b62b393ea7845acf645654d51b4d8254d0c0e81848d84e0a07d6e246e7ada9048d6872a8f02bf8f0a8b4e6c4b889b05c8f73f4c5eb21de3e00abf45b118d7ecc69d41149c20dae8041c8ad8974927a50f70051fa1caaeb6e8536fb3bc558cde0bd4f5b2eeb42fec616885461e21df911d67fa71e570b94c8ecd418c70b989a1420945bb4e33d5ff4e8e6e423a15b6b5ba7fc062c4e930e7f1b799777f0bded76e5d7c61046d07be3615e25de7d06af77c9e562f127845d295738074814457e43b193d93f75bc1615c513b050ec79d58a3d8cce16bddfe84e37df07c5bbbf24d951f469a99ebb4ca0d4a4a6bee872f67602d63f8fafcadf3894af8a662ddad5e4e9955e354608877ad33ade9018e75bbdbb4cc0aea19428970abad69bddf2097dc44f9f6857e0fb566401305fedf6d57c29db51e60af7d285e1d80b573d40323ffc478b3a1500042c1f43109e0eb8aacb70b66bbaeee552774f146282e4b22a152c4de6c2a0f3efe1a8491064ed514c3640bd7b23d678ff66cc35076c7ca944814962fd7dc38e8850ef11c5b6175ac9a5b91dc449a7ae6d9af7970f209db72c45dbed36a1d4124bb181163fb802615b10847e19b654cda9720c7be9ad23e8b28e89240a082931e2ef416d69bd3390fca18ddff9a10af5f1e26742d129eab8b381bb5aef5caba67f78a55ef7129fb4bad3a860d8519dccb5075f78947080422a7ce0627ca575bae2d72ed20c171a6756617192e68cbd5d7d6d360a09a3eb7589bb67cdac8737893e2b8b964a75aed6f844600dc192bc1b655670edfa1a05000000000000000000000000e257c5de9d485fcd065fb4b5fb6c522d54bfcc28442092cbaa58e8cc179dccc45c3d341cecec4b3e04aae8d98cc6cb711c4d2620ca3b147fe2c65e4a288541f0ffbb604310747e662832edd3489052e1830a849e142010168f36d037ce54134d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000383444f3ad490d0a6600b41e3e04334d0d7f755dab23b6b44b99e6bd1633d7e6ee3cc7b1cc67132c188ed34c4e9c9ac658f12794146757e9704f2e3aa1ddb4b32545090a4e370ec29da673000c9ac7efa02642497352d2aa738be897eb508e8dd88aced9d1a020dd5bcd663e2cfd1878f30b87b5dd4e1dfc972e1a70d65c1800030a248a2e5cb827c22d6c84ea63d953c420f055f4785c7720a61b24377ac572b102305c8535172866c02cfd4f96601cbd586147dedfad3a1b3a2d51bfb789b221cb0b0050c016fd08b0bc102ead3300e9c3c56c3c6230ff8dd98c0663ecb7116242a1293dcbbb4b5bd09c4b97c04b1f3f9e77a9bece3efbb9c5a1b6fb9823f2094c480300716a59f12f861bccdf33c59d03639d8fa8e3a12f3df013f35dfb1f757b234c030e88d53730c051e1925a317d3f9194d614d927e911cce5c1d8e680394d54deac030d9270a7d1f5e1ae76da1b42dd86100073f784c8c4c7dfb040c8a7d656c7fc3f0221878d3bce217fd5ece63852f2fa4668e6fd248e01623ff9c1ca1d7d3d3150b9020ee9d7a3d38465ba4ee0b6c700e6fdbd6ed28d956c993200cd1248bb5a0020bc0fabef7a9980bb6feed4eed4caf85822b7f8edc7713dc97be5976db47cffb677b3475889e7230d188309e0d4efdaa7c974d2f955fc8dd67440899e3b34ad95d9ea8bacc1e885eba813a0f2df5abf85a9691094dfef8bf5f4523c7137b6abfab94e9a469e488321d01a5418a4495ad83b2616e760ec7c4e29bdad7e77d8995980732f028254a79107e68e06caaac9cf635d87cf48e73eafa7538e66c74934b97cd126f1bc5987eea8f85aa0baeae0caed3e49ba737af88fc41c4db60be5bd5f631ab8de3dd34f2bedc951adacdc070641bdf5f688b291e24f69b054a8889768623ec7cc165710b8c09eda8e322557b2473418fd7fef0ebfff04feba75b93cd32358e8b10221d6bad0f92d629fb2afeeecca4680e6a9c3f5ab268a87c0e8373541c5b7412d39758d72ad8432246208ff4b250afd525d36f2e00ae516baaadaf324243217f03355b2759f7fe0148f3c9176513d0a6875e926f375a0fe18187caad03832196bffcf463bebb4f9dd5d4ae5d80d3e0ed8f4445230c407811a5cd8a4842f963bde0ae3d93d5995b33c8407fb39712e13571fd8d6e484547c2635ea0d747e2e7db643a9f73090eae631a439feff8d31fe8a5498ed576227c5535b17eb432b07dac0228e4ad66374c1c0e02864eae314c1d1c1bba658a65ef431b7d162c433c22444be1dd7a7a3148d1e72a46f862164ebaa10a07396e9b32f97d4faa7ad47b33c39fbdfbebf54a201f30e4bad08a428174d7744d8a4e19f6175a3b3cd03a299b640eec52405c5bb37f8b1457ca867d86926bb2d5e5990b7ecf5700594e0e9bc5fb8015489d6b96e57b0d4e613d4370da4a877ca7afbd48cbacd24c7c33752fb6e7a5a6a2f61b755e96c7f747efc3a4df116b28e1204a0fa675b3155ab57a42b449877e67127a6d7d98c8f2e8810773e108680f88595a5bcdf2a0f87dd8ae485de2f8312c7f7f7854976678a798edaede051afc0471120fd91c8169e2bdf2a6019ab1f530a37501182c002a8c07466ab1ef50e52f2dde4f6bca7aaa2ee79ec1e1df542df14569f62cea56e8cc344399404b27c8ea2f67c453a5701271aaa677b1337a36abbcbe7b8735bd19ef98819db13d95d08e736b40b60c016936a737894db3604f50ae2a35cf3a63c1180e172eb6a0dfa10d27dba2e8288829cbef89f01f557732830197388b0a61e65d0396eac56d953f5c70ed7724c61a4068b8dd083c9462cf64bbf7588f4996de00f9d2230ba462fb0601965de50e2539c620765f57016d13c18358da53b2ca5e70365b04a32bb6effcb0377ca8861b16901afb4f6b651b17b05a23932f9814ef3c8e50b4f8eba58ad2ddeddcf19e70d021be93bfc1bd3ea9e2cfe37b32721b393f20c6ce5471563af190e607b6a5ff2099913c610c26be41738591cf48750fc64cb5ee22ecf142fa678224fe344e3e23c219a9686a0071c3d68ea71f0d2fdf649ded863f2295cead339f0c83b96860c43f6eb94516217dd876f433d4ce14c4c0425c5663ee89f0913d011e9f983f9e6e83b1e7d5171b4ac6a9656a30a6053a67af8799eaed10713fe7b10becd40c340f6037c21eb9838b9066c220cd664a6b9a13ca01c387d7d65d8e48c643e8c69a5c0a82ffec116cce0b04c4a837105cd9962c88f5dcffea0272a488e31cd63d8673e653d12f9d1fd2db766110229eb7fedf0293e1022000000000000000081cff005000000000dcd84a6fee3979ba4122debfffe7d1ad30a12f513d71d09289005c933b17ce072dd7fb8db07521fe3571511d60046d0b993ed81370dc0a9a943586fdf8e4c5be7e7a91a1f2976a09731f66602179d0637c0135fc21c8bd0beecfba5b930fa5c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e984cdae59105d756c7e2368de6ade74ce66d55cedf7ec4e8d75ab5c929a8153e0280959278dfce0478cf44a4e723078214170c0bac7e414d0668d4bdcaec9847e58cf4e7b1b653b80907817a39ce0552beb74b6a96084406e0400f7a502e4d217c7dd72d8dda6cd0f66e10a26b90418bd7b9966201c015853786534222e47d020723fdf9e6360c9cb41f06c4c88eae4d26beaa4d86bddeb757c1dbfedd9bda8b020f75b7f8fdd83223778745986e83ecb9a3762512c242ec0919eac033bbe19ded0b01c45ce157b3e4dc1c901e716013f669ecebf5e1c8db6fe3ede533f40c9afcb3d934d4e895c795a0e18a67daf961f4a2252f2dfe61e3ec09779c3e9a6780cce70215a036ab226326e86f3d036094b6190417f4d7e9d70327aba6464d4715f516d8021877e5963aaf308976cb3a92a782a848fe49ac07d7dcbbb60e7c96c904d6d82603145a3edfbb691b13eae095534c3e14d88fd669a2ec220c6fb11a42a463d24024022e4c297f601d6b48cc4789fc0ef806bc300289b801fa82a16e6928526a75491d0209f44c8d9875c1429e95936c379b9b86ae1b4f149bbcb58b0ede3f8799e78ac8ab6d603e02eb85b9ece9beef13487ad1526f3aa9a97be3a06dbe83df879d7992da03257dc499b479d537e4dbc31e04c6a70047379401e9527c7678e5c332ccaba2828302545387abcd8076af534a789c422326f12d6295bee946980e286c071d772aa2ebc43fed062e43455e182752b2b127b1b1b2b6170ec474fe55d174534ae48e9897f096cdac55cca26291bbf751bc3f255be541b52e9078d36abb8d4a51c47eeb2397cf51cce02e975bd6e062e2d21614b1c0a754a4c1c320a75498fdc4f18916790c5e028a3bb6f2cb8724b5b0cc4e3cd003f1479cd2e70d68fd2f39e622ba553b80237f328ed2fba781184ba6bc129201d0f40612b2ddc257caaa003d878722a04b97320f41701d7bdaeacec6bc2644054db2c4e4fdd3d9637b8cd3299f0af7aef0ad4b2acad55e380940681553f441367eb16f87409f5efaf32ca7ff982f787281a93c103784e7cccf468a272b46f24c43a03a5815859f6bc9159ea53ea94456a1bd497dc727e7a5479dafecdf235c775d9695cd079106b1e52b874193e72805f0e54e8354625f798f8d041642e88f98fa047bb85ac1d9fb3a5354880b37d954a54eb6b06dfcb60accd3dad2698bb918a03f9653ea7aebe9a844e968a645b2afa6e3117914d7f0cac2682d036e2d0d2db04bd7b201e6cb149a186ec38e4ea07896353dc2bbe89f91ca3e5952535f29163e06b1dfe0cc0da0ecb1850e1e80f99c687bd8e188e85f834a83b3ac9efdaafc17eba0d54393b18be15cb1073ae21aeb7d18f69de8d37abe164e399a81ad7d9f3b2e2a3c0ab1fa488c018de6db379a880b4a2c4f97457fbfae19d4dd2cad58e696ac1cbb984947d5269e7b8e4a4aecbc6ad276ac707f48400aeee84aea5e403b2aefee9fa00630ea982da9b712ad19aa88914a1b11c60d75f1224fa829cc90eebdda3c34cf0972ed3ffdd0c66866925445013b735f3a67dfb41c604024a5436f5cb829665db6ab1fb1ba372240382d5c6eef069c41923be2cdd6146e513a426f6d612bc78879bca8a512fdce7e366cd9470e57a26911ee29233e65389a4053159faed854c97b2d0483522567f1aef4ed1d193191e670e61254c48500c2c274a81c90efca8adb8ff1b6368f8b9ef612a9588704808052f0f36e8be7045933257b5647d4cccaa4ebba30133253e210582dcdbdce339fb07d079bfec0b1c709212bf30c4fd1a63136305a663a488a6f8d9373597f2c0a0594c33e8ef5fd82f270649fa538eeb055659877ba4ffa9cef3e892f43fb5dde58d35663385d60ce3c8e4b536277ae8b616cdb3c4c6b763a6c55eda45d63f07e9deb792bfe2492267294e7ea9497eecaa4488222825e31104ad975f0c6f55072a306d1f6e10275d259062e6a0aedcf3e32e2dc6b31a89d25907945b69d43050cd25056a37530619f4a5302f27b5001d2abd81268ab1e81eaa047f649e8d2c08db40c700f94e68bcd8af66bcf35269796f3d516409e0d594299e7c22314347d1ec15b553600c938063b8eb2643064053f8d3021319ce7ad564af520c4941b4719788955d796315b549d98e4af4c1911cb92909f062d497cba25f0142a34bd0d707a7f785ffc808bf5adc79adbd63566d668496e9c187078d450d658c481703fb1761a05b8b8b93b40c2889fe5ae66cc662ebf172dec73ca4cc5af4a05582edf60da7edfc86e4684945eef29a5bc58dc22a623ba88984945dda436ef2acc3a33ad40fe57a55e01ed95681d1b7f5ce2d648bd0dfb6ee9b1ff36a2e1c50651ea15295c0c3591e1443979dfade061a35afc36b8193610cddacc023fb24cde326b484fe3594d65a99373e804", "", 2, 754103613, 0, "201fc955a01c9b32a554501cd3c343725834ad1b05c29a8eae4e38c106f6f614"], + ["0290ff1c038fe4d51858e2a8368b25afe54615e81c26c92da62d5a977cafd9be3bbf76c96d030000000753656a6a516551dd97e4a2bb50b68e40042d3f07a42d15009f6f8956f4da366d2cc5f9c69bff1d35eca7a60000000002636ab4e97acbb39feaa7c5df5eebc964815e41f672bbb4b3f70c8dc0b307cb2f1474cb5fbc9200000000036351acffffffff0113d1ae000000000006ac6363636a51654711540250e7dd05000000000000000000000000ea264cc2b7f62f3530ea3f813cf91707788df27616306c0b109b289f22c22e4aece4b607eff3015715a8bc54a7c5e2ecc1799f9227ed435eccdf871112117c075d230d4a5fa38376a1b18469c7d2a3f04a02a4850ce2a785675a71b803c67c6800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000596d5a0860bbc69cef07e5ccd0b60b56ce496f3962b73ef1064f05a97f13df059b409c90b9869427ff6dbde835e8f159f83e9c8f9a01be5dadf06826d11ef0f6c387b510194583149ab55a41bd16e14ba5ec5121d86062bf23402ede3d773fd47944f482396cdcc0dcc2789031acb518ab69810750d4bb18035da74a026fa3a4020224e5a4a96a0d2ddc55574bd76457dc41e93f6ada1a836ef851bc5d7e3024e1031525007a22d420cf512f8eed9fcd24a509ddfff9012649ce37fef28d7957e9910b034720c82b9d1f23627f1d6e852940f0e44f9edded57a47da51aa77c77a6295bff74a3ac9f886205e71e179a628289622b5692f4a3db0707ac855f5e7b3ca72e020c4fac776e7a3fecd869f0e0528d84907a22615c2e3f31cb6933682b7b4f1356021d5e8b596d434bf0f67c35560b55b1663ebc912ca1723fc1329f5b3009f0706c031ee4fc23013c4a39225c312ad51ed7fc8a21c556558b05fa190dd5baf0b335a30315cb33ffca17caf21b2b88bd275af320c135eefd521a0ef712f9dac98a5db0c7022fdfa1cb61f6fd3411010e904c1b2291dfeee4a8c0a0013a98b9bc218e17392533c4dfe6cb1d5b2e41e1f6d3a74826fe766c982432bc1b0685eb594bffc39e16b9edccf6850ecafce3921509858f372fbdfaad8d5641a272f975922d2397e54c1d24982ef0141e9c32a15ee67b10f04cddd0e6690fc00d19c43f01b08aae30140d8621d5bc22d718434deeb26b808deeec46fb5e4692b4d07cf9e25f1b4fa7ac954fb1850dd1a454ce18e9c77b5cbd9e6d8d5ead045094c40e58b2cd72c88d44c135d5cd306674f1019b20f1187ceeb9e30b60fb7b448752520e4e8b013c64246dcdd39985626e416ba1be26bff98b2fe309a129b9b96b85014b9ba390a06fb638fe20713fb915dd7b337be54d008be37f41c8eee297e50f4b341f9a5c4463faa7d6a085117d5304281b7fcdfd244da7cbd4a39da3908d76734f9afabd67314cf412e2523676c55dbdd525abf50d96e2385fd9c75954115fd0bc34263d86e5b4b6e62c889fca60aeaa10c976a746c1ec259ae70d5a88cc31ce0428d68b12cd2afc7cdae9ebf7d1072f1edb1bc436803c84801fe85af8a60f0dfffd76b679736a4e56a5b70c9c71256b114e7008a8e1fc75e54ab65d7eb4fe39d78500b0eccc782dfb28f068a7d2955d526a73ac2f0c4a50e67ddab46565cf86b7bfb90b43303e566662e66dfdb9201db1b52ef286147fafda627e77ca9101721e8e6fe545077b75bf5a0a0b211e6fe3f45c8cd055fe338878a758cb174046e0ecfe060dd41754280bb4575eb60abdcfdf6fcf2042b64cd5f66acabd6b32bce6f9cd00a369351f52ba90182b7e5199a0c89a480fbac4d60b6647ceecb41719b4e15e9335f5f7bdd44f12adff01b2dd27d0940094461fd35de79f6786a1aef52f3bde41b702583720851d7c9f47063491058a889f7893ffc6b360209c50277aa077e7992ab710524b07173dbbd23aa5078cfb07a6b71c60038c56d51a259805657f79230e2cd9b5057a0ea90b16f6b4d3b4f68c4a38872d6bdac37f9fe5cabbfd5304b5cd4af6da41514a25c0f61781e353c01dee8ea5ac651f3db2434661db32007de050a347bff8fff0c50758ef3f1f4b2d2ebc58934395b6b71801a1023204f925451f1c7be62a2d42ec1edd1ea3130fd3142078418f7ca1a9f73daa8ebf4218cc695996198a64e0b232efa5c46fd9ecb1bdf9f00901ecf10fb9344ada723516881dbcc603d474e821fe39c243ec2483edc40b77fbf11341c242615f2a7609a9111c2a2465832510111ee7b97ee322589ee33ca3ef484c1648a69965cb57e9c2b2d221f12d5bec8e7e4ba5a01011ecc05ff0316b7cbdbda238704ddeab0e824965eb49b51debda115653b0757b9cdd0a3455a4f6d119a1108b366a7957953cb18383ee1ffb6e5739eb5293c5db80b73eb07eaa73eacf07d4fd5b9e9cc89f76bec9ed4927f6668c26496ad44071bae319a929a11da1b07d79bcc14d13ced6efca59a3844375d6639bddadfc7190c5cfb5075ad36b0994d87c3c2685b32e83237477358534e1b6a23b92dd41023f69d366c7a7cd1fabcd2ecc7f6bfdc3f21bb4f606e47930867c38f35be91514cc42129ffef9c911451b482dde5ed8461efda2a80adbead82b5e85d818acbbc9b632592e6f4956ad5b80a39686ff6ab34127bccd27d0f2e8c1d0493fd86e1127f94d0855fd4065f84f563b034601fc6ee747fd050005b6c06e69ffd2260bd436cff503d2003ba1c62f112bdf2ebd7a05000000000000000000000000881077e9684a2892d4ca6a400719dd0d36cb394c785cbbdb4628408b380bc66e5a9341f9cdb78435ab018fd70da7d7d79b06051c3da904a353afe056b1d5a17c9987893ac5b0fd1ae5ca3f716b71828b5bf10c475bc499b457338ed561c403d400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ef958db4198c70e8febaac12900304533d6df7908e736d7aecd2c60fb128e9cd118030bbd32c3134d4cd7e1409397e3b4985184b22b4f54a4974a7d7014ccdb7efce371ffc3cf5a39016d42ace562f99d8f1d625f02b9f90c021b047e059d4880525689054ee39af2df3c914af0046375383cd1d0d9708c4b7019fd4ee2d6318021d2b1a2764d85c065a622c27233c6335c14df6efa0d6b3a99e44fede9d64d737032c5f67df7b51c64aaccb2bff2b36d6db72de9675aec9ed4c8ae8a83c4740644a0a00bdd073a99ddc0e9c689577b869e3a877149a6cbdbb038caa6059a85945b39b22962de623ae9635b6b6ea5aa9572baa93558cd1c969ede58bb5e06dfd660c42032f88f24b97baeb4e93381e36ae1f7753adea4140a156c9942f01189ca1965980022ce85589baf514d23ef731ac1c2583279d52de1e4ca89607265b7b3b3a1394df022f482c5cc93d3e637bb00c65ce7fa61b4a0fee8fd5a408f44b0cf08acedbb4c1021d1066728b528fb8d96dd1fa3f4c19777bb98d4b76e90ff74efb5bf6f2f7991d0326df64c6aceaebf965f55c45395cd46c9aa686dc49235757585d551f13df62ca1b9c7204daab9b1208a477a677bb2792c919120a9a7cfa9d47c64d9fee17c6a7bdce24ae5826b2398940f9430280c50bca8bbe4fde0ed23b0be549142806ca75cdb9cbc73bbf130d4a9e8892b0906d055f2ac8985e28e8bab1c6f18ea43d99460dc1f3b2f175782b147ac2054a798ecfff39bfbc3c719a4a1d6e7f09199586b77ed640c45cabfa3381d5126bead4e20e343f3662415dad395e5cf5d91a0716c33c1d08b32592aadb8a8b9c55a3d5cd758548a768fdf2baf92ac47dcb9037418b88a580517ca6a0432b4eb8c8ac15d8d63371928a3e934484484fc22de641cfdc7badf296215e1ede57cc248d498b839647620dacd727d2c380792ae25608a4d57dfad209917714968972c2032e3e5eb323aab25bb43adfd1da99b43188a6297e3f848389a6fcd558d6a462a185b7493793759900374a4a6c1f7a4f0b48136749fc698cb80a773a29b01c5d01c3591b56686ce99534cf6e7241fe75cd6932d8dfed1526f798d313517a1696677fbf4f35cd52f312ce8363acc0072e412d38799149d63e6721c2c17d34e3c461af9b8e56ebee1590d4841cdf379593b3a7bc8312023a7c58fcbfc30351cf8b15b22b83bd1e8e75dc3edfc330075554b9993d1e739bde3784fed4fb176a79c15a7c3348ef7d8d2c44e6e2cf07aa87346e8cefb68118c2c523a5c4867db2a5b36fd23943373a2bc4a9d0e252349aefd280f47b2e7f2b542e80c128bcbe144f9b8253b08e459eeff1fbb4624a4d9ec599d3d4fe85f781d9ea9ed2c865851983cca830049183814cf8926c03d85e3097b6b03b7ae0d35acaa5dc4353cf6d6f8bf82898e644625ecdc39c25d97d48c867846f68287eaacd70ee852e4396258cbe1982dad6493d3c03cbf04b1b93fbc972a5ac28965ddcf13b1a96f5fcaab8deb2aabdba3c348dc007047cc9f911f0608134507b694c89dd349a1eb0e56be7a0cb401d30e77912726a40ef2bc77526d4d1ddc81400bb9a53fc58d99c39245cb29aff880399e1e9a8790f546ba7540f34dbd7bc5a5a5f10e63229e8976bb8da04f3d2aac092e591749eb5adf1702018bd81b444aa168d4977d3fcd7ddf44f3db8e1e2e0d6800f226004ce3700a21dda3c5ff5aa7ecb827ddbeef5c60b787f60cf57b5918b2c8ebe8056a930c613007548115e0cc62d3e9b2eb43e7a1678e01128df19c15553f314f6f27c3fc11b2d43d37d2b83911156d9fd2fbeb083e312a82554ce18bf0454411ce52076a3c153ac6649aaea32d8ccb8e5f1adc68b2865b24490ef49cbb1b30482c58a91165e3b6dd087e4169c5f7694e3a3e55722d40f26d20a7bb0954271e74c9aceeab6ac2dcc4b22d1e9b3531c7ad05ca4a34088a0ede98706a4b84d292553a2467439737e27bb6cf01b96554f7e2df3f811ad6e1ee2dce32bb9cce8d2590861132b6844fc0ecbcb2f63a35cf1d2ad47e1aabd39ad10ebb7ca80f295535ab67c141810da136607c03e12a22bc72cbee8f5417eb3c7b87b1e1617aca6224566109f53c4a4909644efadb56046008d18f38dcbb755f2cb4746df8f5394cd003768c17618bd66342c649b87756a2df03fc1d19be9998cb330996174577201ea8056024fb05f769d7ac8fdb0aa50b7116d5b17b76b634c73159c598dedbc9c578134e6dc85f0b9bb005ef431f1542fc63e134cc0fa0eb81aed8c1328aa230155249552756b884d3aefeff33668df1a80fb61262cb4bd07b8bfa47eeff71ae3f1d0e8aac33676b2833b712f181943fd1f13ab6c661c49610a8006d6139487347d6d6b324743cea04052dc7bde13fb9b9b768679d42f759ad22aee145f91b6f9c93809", "525163526352630051", 2, -1667522293, 1537743641, "25b07dd9a20092e2a3d21e93a15b62c7fd687caec76c7d3c106a645fd26605ca"], + ["340b39670163adc5ad0fceafe7877f3d160ee968b336903b57573dabdf7925cbfc24730552000000000363536affffffff0433066f01000000000451ac51ac0e019a03000000000763636353ac6a6a147ae400000000000352ac651dc14d05000000000000000000020000000000000000864ed20100000000457bed3d12af09deb7d2d9e75d4d91587e2c4c6970c84112fabbcd0a44ea1f50307065485b9889905f61d029600b51cd1866e425e6deeb26834661378243d64998bef23197d4746a61e63e5195aa7b8f4adfcc68537c100b6816e6a78f65c5bc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000db09509ef9fdcb9968bdf098485aa9e70f8ce65f416c28eee52a10e0ef9ca294bd527e9242a2c486261e0a7af9ac5492e5f415abb74f5483da3dabe1556845662e31dffe7b2f1a5316038fe1da40c5b1c09b1f2ca81b4bbed91e3475858667c0201076f4174345a262b3264d7752ade62134c1faa81c5358b9570f45beaff6b30201b9cefc23a54dabe0e923f46912ba4c8c79a6a13bfd87e80f524440114a935e022ce8e87242223050a6d61f74c898fd6ef281144ea1e73a512f63d7eef2c5a3750a062e6aee15dac39646375ab76e80fcec48a3abb596e0eb4b88835ad70089ba3ae8f16a57c3614c0cbc41a56946affc0d1a8499e4f2b122558c546ca8c970200e02220172afe8848847a2c4eb09828725d372618e938639c545d8ac9576f2c2b46b0219defb82fd396837ab248d8c52b0709cd71615f6373ca39889282093ca2e1b8a02266271ae1b93587630bf0976131e5fdfcf2b469e61c2f8d1364465294caa86bb032653ca97d4a4f23411bbb36095de7a843d680c9cfecbfd47405c1d0552c2167b030179ff73f301bff35c9692f2b2ff88c99d8a593ace68768f8a673e3c37ae71adbdeebc6340cc778b61bd8a3ae8ae1f1ca9839395fb674425001a70d979393d74bf306d30f418e49c4be819eb81e059cfc7006b89604467e967b60c5c16fdc0717bd4b1c6f66726071e8fc3f868e7eb956b15c6a321b8868f0e5d72853bc03b5138f0e33fdb8b7ecb944ada11fe2585847bf3ed0866cb6b840ecb284a4ab627b2b414cb27ba02099f1057e56785584f4955979d2bd65a9af977b08c3c1f9bca6acc1571761aca6127525e8e65320e5770a036e0bac1c68e967795dc0eeb85ffc8bfeddcf1208a749d47ad7c0571cca225776d4ac06f42ab463471297baec9d1f3219b13eb47c5e2a3d6eafc1ad97e661c54e3211d81988cafc379d7245240958012c2b7110acbd65d99957c43bd7a579df46321347121495a36afcf353f68d34c88f9f52f71efb670dfed56d257c6d7d304fee9d9dc8373a4d430b3fc0463f1be12cd47e35c19d7eebd9bbc718f54db10647c38193693fa4f611d71ba88c588f45fab2bf6556d025ce56d5114c67c0d0f00f98b15ea9c5dfe016d738ec382bb5aaaf268bed9c2b422e8e01a1ceb17d164dcece4ef39386a50ae5f2b0a43ae0c9774c8d3e3c3a3cc206ca8237f441b1598627cd8f3e7afee9f8c4e253a88e66348cf51878366093b1bbe225df4a8d3b65b286f5cb8b7125a9d46d70339e76a36fae6c5ff7df647d90aa868ba95e53db539d573cb64b5e9f22cc30d363c883654bddb320616e13270ef4d22aa76db1fb84888403861615ae57a2a06e3769f7560f75db8440e66a2a49ff7a253ad05dae9c753a4dbeec687e0341d24927dd4653758f6349bc2d7b973dff3736885aabf252538443eb06dde75b43aa2b3903661f634dd21a8e619935aef1e81afbe83a07e9267fbe91ad3d6c548e05b44b934464ec92d77ddc25bd6a379c14e498dadcdea6a2f9848175590e16659eb15e3682e65111ef9f571365f193ee97e5e319bdd9f3f07e13f06c2c1f2b474852256b53bec1750db4be441f6c4633966c225fb301e580e520b530aab3c697ceea1c9733c54670fe63d11d62bd8d19e42808b71279916eb3bbb8b9f04ae91949056c3b9d5dcd529ec69634bab1531640966b3f8d4d5ec1178d78459981268c3683da9e40cde0cf3e8cf5ae718f889128f4ffd9728be79dfb75341ec35f5648fb0896361aadd8c66433648eb89c1e0bbffdf33232665daa9c9d905634e6bfaea96fc9d1c9909dcdc0f791b9e808be3ffd0c528ddcd7fea5d18f9412906a6079c7beb1c40210356c0d0a3b8cb7230d1741fd4197cba8cb62e0707f21895b1431cfe055403dbd782d0c3146ac2fdffd7f5cd454fe6a04551177f7ce223d7d99c76c96ccad3e656e30873e4922765182a35a7c985348eb034206d3dbce776f2f0ad6c69852cef598317ed7e3610243af394365d0f14518354bff952de890eb8c59720bffa1f4099765feb2fcc614a5830f66218c68e7d4a677524692579e4e18c74fb1c4f242c6204bd94468f94bf3899b44763490f256731db5ffdc27860adf6b2ed41a4edcfcaea189e00ec9fb497d19c087da92eef807fc02ebf52972a13886c654713f06d45f270afd1c42f177dc32f115d83637ca43819f06c1292cbd8675ee026003c6f0848967fb567a8478c2d57f19d9e8cce0cf93c6fe4d89e1fd56f4c851f7b0a46a5704b51c5dc0e82eaac99d40e27344b9e03777257d503030000000000000000000000006b409b13f52131744d64be1156140c90e7288bc69684eb04e6b7a1d9d511f897c36db957f6d1b0ef0c6443bee62a6eda571212adb73ebc728b539b4e29f7b6ac9e93865de5cd76b65617c6470c254f8d31b3565d0e695350fc9a71e94393131a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093d1d19b42d70f4e609c86ee9072ca617b033fce2db2aeac1d5ad8f5dade161fd8dd134eb4cf6954b1e1c744cbfff522b0e31a15028c16421bc521bf1d7340d325b37905f98038de79a75854cf9c6a46c1ca19c654163f984537b2a1c5f669bf951d5481c0dde3a3c1c11b79670e13f216c6fc2a4717dc5d6abe98a7a4d11a75020ac326e73c094ee31331faad31827cb2cfdc8e8fae65ea634781bd3c1ae9e5d302068d96fd48e2f767b418d0072ed047cafef7ef3bf839e028ae3a0d969be093e20b01c09c312896cbabf77c72de4bd3d689288b6c0ecfa3d74e18ff637db6c064e23d77174ba83f5d916c7e816753eb665eb61b18735205fec939ea08dfc8ba85e4020b51e588c173d3326524b758cfed60d2f0a7f0269f0a331c12422d42285999be02148501ba89e0d27bb7be0e06de578b52284e8558fe9571ec88136036ce9a27b90222f38bf2441b671934c68ef36b950387feb4677c4f1795c850a1723787fb3beb021abe5f4b5672d7161bf21605a1ed9aa5ec0189f61e8d5e881a8a6e4c7af6768b020a1f07e3e2c02b5ae3edfc0f72c7eeae1373d416e339e50aa44ff93ff9b368f80e62eab8077f2f6e883f93e8a632c96b89559bdd6942222729d51a23bd81abab3dbb232a41275f823e20f543e201352af7f239541d29d4d28dc0317a149c28560b49d4c68a87eaf7e052b46aaf9dacfe7fab6f92e1ab5e995f6d100836122e222977b02aea7173a55046e84e695cd83bffaf7ec19e87971275f7c8fede8adf4aec48d5d79f2b0f0634954d4a17faa4bda5e6c3805fef337fe351be11c12ad4abb5555be88ce830cf7e4c4e23dda583f1e229893f409f094b7377407d07aa34bbf664e12fb00b4ca026bc400b98d01853d3c09daffa95a72a63fd08cf55049be31acfc8b7cce4822c9640e1a85533ad5774cb6e90708c8d5a89b277f7cb3c26454a9f1e5220d5e948a4f58fc4f6affc6e17d29fdfde231eb67c269ababd2afba642b2239c4367759cef5f9d9ed494d22abd2005b4a7d338efdfe66bc7e4ecd17c5d79f02808014342da8dc9c81c81a9fc6b696166e312a8815f3ca37aba07b074047a4d1627bce7198e7470adbe50d0f8258f9a1ccf254f16451755cbfaec6bd442db25bc6c1674bfaf66f29c481b1ea379f0d9f1f2de5be16685bc58d51fb8ff70d102be6f72786cc9f1e0c1d2e08bc18fdea737709d8fc5a3b2686a04ffadc09a2fd5aad50f4a343a1778b7f94894443e22992c8b545d6ab6c587b182c614fc0ff57fc6f26ff042457fbdfeab7019e88848a61ba216bc22240f206423043f96141ab173dbe0d490165edcad1eee29d120c46a94319f737b1f6fb100f09a8c0e9cd17383f22653fd3e75b932ec97c07bee92c0172f6ef313911a4e2deda7a76af885824fe33f0493638fe8170b72c238f1156cad6407ca98607511762ecaf2cc10bc90a3926abba5f8142203b6e1368df4c1c90a1cb2ff554a2021a5d1f988ad4f9d1bec6113959c28fc0bc7ed3d1bf5d1ff640215f6489ef888453965a75a672708c1dba7a23601a91fcce4000b5f15a55ad582ba863942fa163935e9013a8ccd43531eff0d95509c316ab9485c389be7cb5c64db1b32d5f502b8b28dc44e7bada5f2c18436a8e6a0929f0324ebcbb7864847a62c3ef339c9b735d24fc8a5fe3aa5992dda96a2c689e4d0c1531113147b2c5c322c45d562706339fb615338d83ce6a3b6dd714bf363149567b1402786c419099ee66b8a184355eedd2eaf7081ad02fdc1f3b7dc9a0d88ef0e70eed43489b6662a8c78946d5db5bec488b0c3ad6d2523671fb1e95a42fa170bcf303cb5e125cc74a3692f233cf5d5f9f64c2743426952a70febeb4a7ecdf1cf43d2dddf9ce9f4833751fae09cccc5ecd20220d80599f25cad00958b4ec80d0de630de72f8c3470feb22f4c96953b19829b6fbd7fb1da4bec2dad739b11994d98dc86110e225dacd239013630ab72e360c3a59b9f87345c6b7c031e3fe7c6635f2ca7029edd7dd8baa878fe3a4dfe707e2dd8c809a014156b7736b37a92eccdc7a4563e02537d166c4c8b074f6c4927688f030ba42c06999d408ec4fd28c3e2842075514594be95b1ed504602cce2b79ce1074baf04a5673dd2d62d0d9c8850fee1c41f90c1766057b4a3e420205b9ca09bde45e78f5b90e3920f7c577287ef6d35dda10715af4ad4e3e6557c47fbc16ef5e07e8dba65ba297b1255686b401d18f9cd5998ba0a53b8806e09699ff4a41fa9ac08522f9b9696b91a21b90fd7bb629b7281a5a94905ae6fbf742a94e5562b675cfe78ab7fbec27c3af0ed073959b3b018ab22947cf27633a5490134ee5aad31f3a62eeb22fa88cb5695a88da7def00ab1e0953526c34a0ea1278f3e8d0090785e807269765f624365ba8ebec1203caf2d4a0790e", "63", 0, -493055947, 0, "acb6bba3534db83bf76b3ea2d81866cb82ec21915bbea42e233ea7a517f46125"], + ["030000807082c40303e85610bc2a9bf1c88bee81ca36e6128aca67206f025c13d191415e2c31d885de0200000005ac53515352ffffffff34da49ca63110934372180e70ed9906820edee5ababba12cd26bffb1185868190000000002ac63ffffffff050d77807608fc0a30b10aab5140aaaad67adcc5a20857c7cfa01d75d4adda3102000000035265acffffffff01a3db3601000000000008979e0e0a88cd8100", "ac5265", 1, -921674116, 1537743641, "08798e464b33379f2c3d2719984f538eea0164744e35a88528e6c77c412af8a7"], + ["030000807082c40303c4a001b5d77a06d75b25097d6b5ba5c60dd5628924438b553fa99725063134890300000001520d5a0127a79e25e1a8691f593dd242891076926c355e1d814660aeb3f5b1fa97f914f5a0000000000652636a516a51456fab3a4bd7c71d647d2e5c07bcfaee094159dc9e4a375dff653819ec4e258c7e4f20c001000000096565656552636553acd35d76b50430eba6020000000005acac6563ac5da212000000000003630052a911d804000000000351516539833d05000000000951526aac536a51515300000000bb815d83020000000000000000997ed8000000000078f5555e65b358105994c2fa568e8b9e8ec6c27e8e140d27803b8d02277bf00c41f35dd95317b666c66bb9ed11b3da3c1d91c9d18df4d25672bd63bc114bea9e34046f4501131b90eae6d8414572722dc4e0f134e1b6b63bd66f353be746234f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000079ddf9ad9c628e19afc5ea49c613ce38ff816697579c3e29e5d3eb8e471599dc473e9f82d84e48e77902a24a63e2be24ede89354c8db4b02c169fd2acafa11cd79eeb9c63da91e485993dd2874fe024b23f98dc3aa7a0814852fb57c4a419dd720189b32fbe1a3713a0b07ec873e2ea5373c4bfbad177b656f2ac07e39b758c0302c66c41f72ebfe1309e25b844ca0e35f666735ebd5e19015a2fb44f930f54600215da3ab2c0553260cd087ddbcd00fec1fc9e8476052c9ecf88e65f25d65a47bd0a044dd2fa04f87d5ecdc0bb2e842a1d26f83107fea199f761d210a636e17d1b50992518d2250e35d4c5549346d5b319dab83196c72e130ede8d4efafdf97d9f2e03228c3ea8ea521134e484157aa667f6e0a808559db77b7a3c617f270facd357210224a2a47e3c9d29af8e083c7e542e3a604407faf28fcfbfe6a09def8e4b7cf0c3021c179e6f92eab28de32caa091334e2ff924903c937025dd83a70e72b9ff49909022242d2d46c6f1e246e705fcf625f03e9899071eb8aecd6396c635270903303740300909cdb1465abfca959b3f0356343ecb7a210502c9dfafb433d86c77644957e6276a27a640ec9ad5653efc50f6e02cfc8680631210cdd6d85875003c6ea76740d320172011f8075f8091c9233323cac4440281a6f13da8c6ce63981ed52044088158a9a2ef6534547679366dd0b4591845fd2a6e884ba9c801f35ec1dc2a59c2bccfecf5996d66556d7fa30868f94d93e2d10bc6a6235363f5a5722b28d2f2f7574312eec3d24c51ce44f234dce5a51787c2fb5358bd57e63d236448ed27b796617a556c9fc14376c88935b2f113dd1969fa25cbd5704f28b75b12657f2b714998c1f068c067bdd483ab46321bba0a14cc6d89a241e234b7e78e8b418b022b38f489531008f18ad8ce3de07516c5c96bfc2fe9c132e94efc65f0e5e3a83088326975dd250a68ebc5db9f4ce6be6af3957379976efa9edf4ce98968ce35360be766a03d30ccac6511b9d76d2ed4fb7d1749facba087e1e795597f9ad5f783dde0b037eb988f7f91cf4572968a3a010ce1890296603db9293e56cae1a2ad98fbd6b5e72bde2b2fbd922d6570aa075c07922983d2e303802706a36752dbacce6766426b99777526b862f083a50eef485ca05de59c2d857694535cef648b2d2e1abbde180f5259b00f74067c1f8486be3507fd79335c7a9da9fd816a48236c28781596815052aa005048c51222eeadba0af9a4fdbb8f50380dfca6eb9174ace8453b363b3603b57fb70f4c96dd47a6e7ff68ed327b22de7fc99d17bda033252de31d5bdbb25e5533de5b7b67c51bcc78bb33a6174e9ea30985fc841d8d9639bb8f22f109fa4e357433f8f6cf9469345a187e29a232a41d3264145742fad96ec4da5a7fb012997a72a667a449723d48793926b598bcb94e158adc6ebf2b19c80dd77ad1af64e43faca2ca2d074c888fc07af4c2d47deea0b27b0d76c5b5223329a42010cd51f5a7c362ca23b28a478a48427abc7885971b1e1e7ad0e31705d065f726aef123c1a14607924206b9d2c53c03bccafe454fe1610f017508fa361e0ba190d7d82de9de7a6fc581033dfe7f20d908e74fd1e615b23da955211bddac2a2df8c90817641fde0cee9828579a98b3825da500e265fe3f88afb4e893c058971e2b46eb0963abff725a52437aa1c411aecc9e653fcd597688b13e682fbc88cc5827d41f331aaca9a7e2d8519026c3e46941984ccddd051634b81c8c1e1a3a40a18705df97ef535e49fcb385357c74a829bb2d3c3126efee41313bdf360189b9a9a55045e98b7cdc6f16ae7816909ec657d63b8d4b233b53eee66320db6417bfd7ac690fbdc8ed4bfcec3176e334467ab516c07cbe63c3eadf4be35289bcedd87289a367493fee0235898e7165151974bb93ba1daeae965753f76b174e81f34a5e89b471c4c853eb1ced51f8550b97221edd17959df15c6b9a7eedaede532d4ca1de2a310e913a74d7f8438f729bc8a6f05cc71f05b433b9b2034c61462f83971e707c5ae5e87c46db38ecadb8318527b41d44aa6b383125ecc31f1c9ec8ba6a2ae4bdd77e952d04b7f5ab577d6717cf1eaa9df56ae286a6a121e313cf66530d5e9c25dcae6065b155f6670da4679f753626378b30450037fc827ba2ccbe50d5c08d333077a0a3b02f76a0346a2439b64a0b219ca24ee20c8c2817485828661a4f1c047372e634bb887d90c38946e1bf25d208c0d5d5c0bd2c6860751c31eb04d62dc86fb86bb6b364a14ad911291ceca1b1221ef9b9d010000000000000000000000005172501f2e8fcb5b442dd70be8350055d75e68dd81f20a6ecbc6e09ed6fea939c6c6c265f2f9c9f4d354f7184c6fef5cdce3b1e6a992d09dc5cc812f75c459ff2785a986013a7edbd793c920d6b813e5303677b4d8c4bdd70c09fe53c04d6cd10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000059cc242744641266936cabaaff7144796c390e053d94a6218cb94068482c5f67e44427b011a2d71717298dbb0c06cf224af505b87a129f2d056260315a20e71e6dec94bc27f02ab5553cf0410edd527d8ebf7cadeac243fb4a3082eca332a81858a643726472d04178e4f08347a5b4c74c56e2b377bf390f62b1690cb35566d6021bedb274a50f50c5f5fd259121fac2d5311eb47ae28692d31de233f76535c98b031bd31db02a216a9eb40548f82926db1340181259bd2a23866aed632d3439de850b08e1fb81eefbf267dd7cbaa2da90cba6c3855a204b429c08305b374ab9cda36b64be3ddd63fd2650f30cb97dd93856cbe66bf7feb0e80062d359d1453a8a7e83020b06d12a233d0d19750a86d8e7a5a1715f0d0bab9089edd8e3ca6c2f91f6e71403144f1c457d2ddf7ea2a8961bcc5418084611eaa4e4942eb4cbdde902c573ec6c031c92663709fa1d95cabd36563b87a835cfb2040c87321e87347bc39ed9d3acf9031ad0e44e2d30f8c0731c5c6b31b191a6e9bb2375018b82f1686b997f67809dde0201a67d1371e718391c68dcf2bb525add64dee0ebe653cfc7695718ca18b25f47430ea43816f4633030c3385e6de37e6753eee05a2f5280f82e754725792ea37ea9644264309ca77ec2748a47438d673159157225c3edd11eb8709be5f6cc2e9354bece5825037068781e7c0acf076f672ffa61eba650bfbf10d7b63c55d4c22d40256933d902b5df9fd733390f2c94e8e837b098a481712dd2e7c7bb100275fbcd2cb76279746c10eb849ccd6ba2744f1600e7384c2a1fac919027fb8befb222fb4ed0a34201a8b3f917cd45e3261a3913730c36771f28edb5f42220f72292648d804ec6883462ee1ff7cd1300fc456500d6e385f742220d80ba34d558702613381e4d070e7e9114c3dc5d946e5f3b862ca193b8ac672ec28e9fb13594538efecf131e2503a7ec19361cb60508ea93ff9c704589b7837f52abb2a52ee520b17e244226a39eb96f44dd194fb40785ead59fac01aa736b6a97b1374298ff7b0b0be9299e7275277525607647e0de4ae7f33e8e15e6e468e8f3aa1d413b110fde05dd40cb00aec8d72a72c15b7ad15584e4f263934eba816f127a9fec2016d2789d0e838295c510ee6be1fbe7c150d972c963812af9b5cf9cf9534f3b6fd802c9c8361537afd47b6aac6c4878b307b6806fb18fbacdc1df4e0ea75d4f6ee7484779e7ebaa89e09810af2c67142beecc5dfbc8dd3900f1388fcd19425ea6cfe4462edca63ecaa509937fa744a17b04033e1956a2602ac1db64f77dae96301b53659067cb1cc2eac7edf60d01ce49faa211ce3a9974ead2693701f6a85685afee73789c258fbf957ff622d6d12a15e34ea87fea3d6a87e5ed849ce8d67eabafcd8eee882da82b9bcc59b74c81290ca73777ef895115bdb27be33b576ac6c89e28fd1a3e233c02eb356a03a85985ad0615a974c27629fb07cffc03ce6af1f6f0fc60d9b87d6bb86c431b953c62d672fbdf67ac422bc333f27c5b1041540f7de31ba2817f864e8d85e34e1763cd68fdb38913da40f421c28189d165ba5c35c231221e49c78d08ac0400133b40e4855350a2cb0b35cfce3eb8e2f4892feb8b0c75ee349233a788d6360f888046b314937e8c76e2aff5ecd59082bb7d303eb46d592a60e8c3ef925c7c66e0b73bb2722b09c272107ebaf2f674428012bf6ab5ad8da64e333486264b55c9510b4c242f2e99a681313bd7a156d0a8dd5a8e69cefd0f314a5143095f5a3d30001433782b2672ef08cf4bd92ea5b0a9558aba7d9517164e3027f8cda3767785d1e1e1e79137471bb6745e0cdbe639513725f2d1435f18c3bf41e795392c4983951ce2a2a91911f9139050a80c46aace42ff0493c18dd8852b246e158ed363bbbf7f09a39a4743fbcbe508eb07aa08f35c12f4a6f77a0955a37431d95d1f4c82d19de2b908be6fc71874a7b7a68eb13253e9a3958bd6135179701e0574d84b5288fff1ae0fe80e1949347c6216ee7237bfea550bdda175decfda5d661a8e7a3bd9d58163eb58d607fcfba15654cb39d7cf977c4ce4c11da800d1cef7d134f370d356b30d8ea6224d6782a09c7d59da38f9299a9a47766a32cb349cf1225a210f6171e795c460a0a184ce0c4d95015c075eecf8434a2505da03e876e36ffe7e3faff14f6d2066913a6c3f6bc0453b02fbbbd07390c730813c354f31fa4c83031cbf881c93a2763457c3e05133ec6758844d60e65e80486f13f4af479b6076d11e75b82ad47a1652b3dba710d9e2f09fb50ada321e2a1b6ab1ff8e635b3eea18f32609f50dc423ae57d6e0662aebeb9a1f5d632547dada662cf98f325cf3915895d17daf7e14162be0fc9e6d3264cf7808ce2939145a4cc88a5034169f210ed0f20e5f98c613f821d5a6f25d03", "", 1, 32145557, 0, "8f279afa6d629e2da48de1fe57e2e51abe4289b0aded28a8bd7f73b03be32a6a"], + ["286b1753010a626bad2586ae6911d48968c99e7f8731ae31c9d5dc3106710bb457e3bfc1b80200000008ac6500ac6a535265535dabc60424466e050000000003ac65539f7ee70300000000005a11520200000000055265656a51efbeb8050000000000fda76a610100000000000000008f07b7000000000066fad4b4ec97ae57721243e8d9dfc801252f2d8bfdeb9a30be7476a3db519a3c7861c3d90722b278dcbfa2a8cfcbe08e2066ed4c040c678d726165dbc4895adb090f6aae5b79bd5f2290661a3c79779a638023ccbf9b63716036a7f0ac7a3927000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bbfa03bc4e49bddc6125310ab090065eaa501775acfcbdbe189689762d14ba6f0e21b3c95e27e37b59e52076b0860d462d748ab2db1dc057e83af4ab92edeed1db1857b7443927d573b1d063145389604fd63661a1d6acfa637bdeb8759ebb66a1a23f8c354f088f5c47f9723ed2c9afa50841dd298f8a81a8b200998ced61902201a311fa1e991979f7c59ac15cccb054e75232c40f2c24fb7261521c2a6f8d7030dc72c13e9abda77bb828f132fca3fe194687c15e047346e0b2167f656f531e40a023cabfbbbdbb7db9c9c5200ebc47b812a3c878b590a936aae643dafc7f8b1d41b8cb62385e3167d98cd86a02d1d59e802fcc63892cf37cf7f073a6cf493446103220b0b2958d9608e8686a974a060fb01f3fed73d45efe87c30d2e4cbeb06c913031094f40989ace48503f23b2b15dabe0dc5bf25c25eea5081673308c1089b5b5a032f9e8912226bf185dfe93cb149e3c708102c144f9af085332bbae610e52d0c53030f31418d33404eb255744fd8c3426b297e4da2fdd0f23ae09a361bbc0bcec98c022cf1d3c4970ca9798f29535d21df843e37c836298027cee41e5b32808d04c36825330c81976b14e860fe801fbff11a785ae7f8d0bc312bedfed3f4177e3604a48262ee9ab550929e53881d12353468b31b67480618a2df0ecaa0add197a1f6c720825f5a336440ba4157fbd9eef9f3aafe0bb9d9326fdd7070c8437629ef626e3cc96dcce664f67bbf6b391f0a1c912e7175c0c4247ef159330df7b0e583614d373e7075e23c211b496a8c4f145148b06affca7cacca320d032633d5c69abcef40f1774085a6b033b1d055f8bcdafc0fc76d50bffa8a590f449578fb99a6d40339fa5bcf6aadb93868d8e9ae03f5b909a0a59c09795c4f46724d8fc96571fe7a0fa24b9d89272f396366a8a719f1d8b5c8a7b8f47c5e7739c543265f7ad99d91eda0bba3f4416c0a35e702e6603e653d671550e1443ca072e1210b0ecb52619761b0af6215294d6f76d2c8d6cd8a26480e02339edde2351e86818fb8989b5f7e73034e1080fd4605393ed9f6edc6309dfee589fa769412be2b03af6ad9451f40ebd920836e75ff60e360888557b61448ac538dbd477dd3f1dfda1b95a84673d93b6b4147533c94c3ae3a8a934d80428b54adef5d1e09f99ec54191584727cd50e2a1a2c66df0c652e0904f569db8d26c8a7db1f3bfe3f7d572e29b8fe24d97c2f82da3fb5677264c38e96d417568805c599c909bb85f580198b35391dbe7e11de116db143a1c1333b98f8c0ddd1a220006c3c55866bc6257255430fdcb96be2b8c62fee215cd265d21eef118f436cb1eb71c1e39939064f26b934cc019d6bfe2e1eb75907c01424642b911bf066dae38c8d6b58f50a0b99b61c4f1b1c6592f74115217b2f8d708095353b749b6f4a0425fcb12ec8831ceda7dba6318dd5d3f62097de27b35787e6656f91f62ccc5334f9124ba3eea86a95468cc12bae351fa3cd152e46c83d27c2f422e39c38eabed8b001e10db22b93904350be65bd8c551210dd356bd75d066d55929d3651697da2309e32fa379d829b070dd17fc173b22d63ddf6ecb7d24ff532f9a90b2eaa8becb26c59316f3912ad00db16ed822b78916f731cb07af8ac35463b198199bba555c6223b03d80358a57e462bcada4a128c169736e041ae0ccc41e02d2d5ebd3eb5c37d08757e88c17ee84f9183fed050e369b5101b79a26ed01113b817d49ae26dc4540f9379675740a2940696e3de1020988d2032e82eb8f94bdfee0c5446094a32503596533e2d613b3651a628eddf87877a73010b98003333623ea167fda4970ed2e29225e1693cade411194a8379eb48177524509fe4eee33aeea5d2ccce88c2c8d0b15acc3275d63d181d3246efcfc9fe850caecb0a487cc1b339c518980eccc0d607999cce1469163c6ba43255563b092e7f08f08aa782f22f38bc837db8cc32c685b2f334b530fba8ad848a221ad830c824b31cd43e3bbeace1e1f94a6ed776a9583dbdd33a4ef5fbc88f10a4d7febd5c5461cb713bc87e9e98b33bc7cfaafa84af9aee46d736e82fb68b3798ace5bb3437502708bc896e2c82e3d5dd35848b526656cf503e30e205d403e158934e43b37403edfab8519f2d4fa7d3414f6cd129f7703c63f245f7b8c59378e4a110b8c69ff9c938e1f26487f58e3c4d587bc2e4b97145e81b57e9b7c8ac920b367adb2fc1e618fb3c2bbe2d3303e6c945ac32c41fdd38b055bbdc78acb9021d24a78d1763368dcd38e23c9fed14a6dec02746d96eb4870cc68c9af4763a47e04259031b0709e0c388cfc8ad7156f81bf04cfe22463888ecb57e79f2e017bb38391c61cec20cc1e83966eea2a75a43c220cc17c51d318ebb7c81563c14c3998ac09d1cb69161659caa8347386fdc7748579d20b", "ac53acac", 0, -1740182601, 0, "73f78151539f09073533f53d2c202904682ae9e8fe2346485214cd05f2184eff"], + ["030000807082c40302a2226d8245970f809c251ece7ba560c59f4ad657a81f63e545fb4a5cf226d7360300000009656a5300635365ac636b55d0d19a4978e63255c7d76edbd661ae72f658986db4965033d97e964527a9af0d5ab3000000000351536affffffff016f9c84010000000005516563636500000000000000000100000000000000006d39780400000000f765e39bdff8bc627a831449fa8105360864ade9b31d879c8ef2e7b93d2b05e0e77b2ef8668c8553708a072352e633d33f9176e717b517f92583f945ca08132f18d728b7d6378b80678330c2690a590e8fd3f69402a6da901153d1412c9de620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b3f916fcca540a506407f069cf12340a3a0c1381de6557bd29d18b9f30a466f7e7ab17efc8f1abf3e1d59633a54fc7b64424725395d588e1dbf57e86bc9513cef88524e8f14e00b738dfa56213db2bb4262edc10727dd3b1ac933d60b0ffa15ac9ced8a71d8183855f94b2ba3ed15718f5b61ba31f48301e00f37136fd1cc990317c20da970fb2d1942bf4c160e76c4d944f771bfed098ebfb3823dd34520741a0314008bbbbb7a6ab3d5f8c8bcb1138b77beac8457d5f6b697f16eac16b3a8198e0a08198656b457f4d685450ecd3409b70c21c128a4edcab3c856b296e121ef34f9b46b77b37154b723c1d412e70f54da3ea6cc0726420cec0c6a6656722bd71e4b0220fb3af2ec592cf5cb086a7669cee307d5f2f4c5fa7de47cc88029407b8ff468021c66fa99e354f13317aa9e5ffcea88ad4c40bbb8aefde882662ca96810c0200b022243221e099bc2fad651b207d47f9ded3085798fd4cc44b6fafcb7022e8a9ed40310562ff9db40791b9a2fb386b2e799c3a2ffc02d37da7f581685089bcd95491d022867e1639bb8fa5c197ff799ef4b93ad9d839b317772f5cf9c21d92e71026add3e2a741ccc29d56f952a371011e69464c9f1a00c5e5350c0b92deffc940bf59926306163cda99b48cb3ab7828bf09448fea1bd44770b15746690c0e01465cb049860e9b4238db23ae157544dc8dbf9c2dd0c77a4257cd94e719170ea2bbf3c335a5135275cd119c805e9d84457cf800a8f1d9bcad2bd16e95fea40c44d4ab2cb037f803f56e54b2a475aead6750dbbdc3ec16b009fde5c863447853b5968ec00d4fc6299dd37f713531cbde2ea801698d6e202f51f138564964089b0626008ac74651ae0f9fe010b9a19a8d29028c12c917c679233969ac583dafd2ab93d65fa9df030d6317541e2d89c9ce76f6a4bf6bb3bec49a8835d381728d09b86ad6c9487bf391577a981b87418209c8e85b4cfdfe44ce02719cd01e4257b82863437d13d8faa0e1e54f17dcaed28d4c353b09206d74f24c8865493d7f9b0201bb71b1102d4d51980aba2b7d352e358036f0b7a7a9a6f4c0aabe492dc12b230278cab584ad75b525638d55315b58def6874fbe3164ac80cd6e7efbf2e3d95541f1c376d45b65a38647e2861c4d6135dc63a25c8c8df1c4b53f38d556b08b9186edd06a72e29d80b7a3c8963d94e05b81afb159a7ad596c90b9862c3db04721d2d8ca7dbcf2b52fdd05100720d2b24e31704a6a1702fda074b54518bcde795e5522cec2b262569cb6564bceaee5af76bde7479bde70ffe42c419b89ceb4a54a78f600f3ba05a2c21028bba793aa021cd3c7187b5607303dece8dfa15f13e8abffeaee33267abffc25691c1d1e9bbd583b5c6400520917a70469b828f2e41c9f3926c03800e9be608e9c88ee121bc94b92551c365a4ffac09ee058684700887b72f3f9ecab8ddc216bf3d6c589aa941e8d40bfa48a0e2456f85b515abfbf7096c5b787bfab1be0451dbcaa969109a8cb34de6e09200642871cd32eb4ff8b79712bcbef4e6de1ab9f2ae67e8eb466ff1799493be5ce4f14db675b843f67474ab199dc25643ea2ce83ccf46f1aaa03865bbdbbf7e1b0707bd08e42a67e2226126ed92b7ed6f2e4d3082613a1d54c85018bb3b6e47b93ff3c094e18fd7998e0f6aea8c178efd0524c7a6f8a4bcfd7180144d969a2330c848e032d22b44dd35e91cd13190948da6ed7808ec9236f0a43e4758c1d8e42e2e2235816169982cbf7616a8c3ee87f3806a46bfed18e3eccb47729bb7cc31a68428efde611eb7a1ecfac4aea068936946377a170651c38e80902e7565452936423bf97235bd10289869b0d02658f2b9a06a5e98fc07978024051185baf30f62b1189d264e4d4734f3c7e44cf2a776f786659e9a3cac2fad925c9a887adf092c1cdd92b0654947ab275522c9a83212576d2c16bca1d26d6088ab0fbc826e1988c10d465dcf6e2f0cfa84fcb25b6db623683653acb07e764ebc1c69bae2f3ccfbbd9da33b979e00204d7c133e0772039c41e00eafe089a4e6fcdc188fcb588e27ce68ee6ade9ca4d6931162984c9678ede8863fdcb8e7e8dbe2e613475c6cb68037350b8029d9afcd3a04835e60ec52d7364397e300828d82f0ff0f3c8e5cf058071eb0a1c4fac1b8c8d32869a6fd332217c3c22f4ae2783106df0fec8241ad82f606ab64f4d8b3c26cccf58b8784beef1180e3e616a8550a6bb9bb81e35b038c61e712e44eb2b173f9c6762b57ea300ab074089ff72a21ddf55543ca185b3d6c6484e397a4634d8aca50e4a6b9313a262df15c045f2de3ff4c8a9d1a074796ad8f384924484ed48a9f95a6e8a1a3aaa4a96384003ee5ddffe7c79fa2856f4c445b85a9c9178029b41ed465deff674099fd44bd81248293af90241172132fe00abb0b", "", 0, -753011132, 1537743641, "d82d4612b1f4c212d2990c386bb53d8541a243812b2da9c23c50b715000d0c83"], + ["24f81e77039e404f1244042411210daebcc2b17657b9856a8793e33764e444c1227ec967ab020000000165ffffffff6696982821f4e0b13950eded40ef5f2a4621f59f9287e7a50c07bf71150a3da4010000000700acac51535263c9d282b520c29525831e79a12d8442e44615707eaf873171cbd200d9b887ba99d71b5fe7010000000865ac6a0052655263ffffffff034a6b6802000000000765ac5363635251a5440b0200000000086363006a53635151c6cadc010000000006ac0052ac53530000000000", "6a636a", 1, -2140714474, 1537743641, "28ba3c5c4d67474cbd78299ee4d8cd7567b61e0a0d07878fbd5ec4afe8c02bd6"], + ["030000807082c4030425b49943153fe14df58ec5976974a6642a854c9735bfc56faf9f67e5cedbc22e0300000002655393bddcbd84a5e59304ef53fa2e626c6c963dbf68abed11c1360de1d8aa83162eca878c8e02000000002c962be970a9fcc32c0b66c3d54be84ca4a30bfc03da4bc4955d23e350f3ab80fbd210240000000006005151ac6300ffffffffedd380d5db3b07d9af3e4af398defcb6dc5a695b0bf3152b211c60ed018672cc03000000086aac6a63635263acffffffff03b78da403000000000665536a00ac0006823d030000000000ede023000000000003655363286c428a000000000200000000000000001289490500000000c85b8a411e40c579710b53e4d0bb76451b60c29611a28516c113d4393f2afa1fd1e901cc6aab4fd9a4ab852b41a66a14b070f546d678493f0f8a82084d802923217bcd4550c5d5005f053db1d47a2922799e67bb57994d95799278bee30c377000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eaffb264a5498621dd8bb9e71cec09d428502086f275fdb7f271cf14a387ec627d4f54f583fd5ba829a9c83c45e1303b07d5cb7acaed61ea2feb4b793ec336a24d650ca966c125bfc0eaefd93ea54ff2af2bfc89be063c9397aac04179a847180f959c62e44f6858e821a9a8572f0fe8e1d10be1427946a482cde59cba2224f70315e273eaae94e6aea1b55d68d061b8762324507b5800e47df77d3f7f32066506021e61ace0976be94ff1541e8bf2cf1c38c91196edd7e31eb14839efa0ff0e6aca0a00d40fcec004cfaa42bdb5179cbcbad667c47339bdd59bab6331cc9f052636a3432406147bc1ee15e2d49dfcaca9ccbd2da2659091decf3642df4a0e090d895e0217cef162f3a86edb128bc0a6e7a8ddf96ba0d0fc84fa4b44dfce2f188d71b3da032a16f1a4307fe6b8ac594df1c959cbde4da4e4d10c5910d37f258d1ea5f9cef6031a1a34a9dde030a41dd58b541508cf397d425205983d64a72e1f1bf10802049d03109d5e314ccd215439fa5b48c3b6d909dd8f934e5ad331b59896f93541b06e65021de71e0fbc4c144a740d3f72663ffae11afe4b4eac8aa7673376517a4b48931b4d9510a72e1c4b23dc556a32244bee57cc1333d72e012aab0667fa6ffa95c0258612be41c20bf84205b95b737169db472097b1c3b497edac0430c907d1303395e906266ef7d85a772b0a35492e87664070e5b6fb247dfe4d0ed73413c4aaaaa5caa9ac8d8f952a57161284e937f420756401ff1cab3bc5d3cd8386bc84554ccf1063f87a1044ab499b4d181a8745e0b910d8b56402df99a90cdf1e51def77febaf4ad387db40c945d5bacfd4204c8d04a9ebee58177c969279b4801c361fcab1f5a71363356605ad1c93a8f2e9cab9c804d26ce008c82b040ad5c770d6d9dea21fea38b6871994c72a99e9a05bf34e83d74e39357a5b5ff0bd9d9b2e0813c506a0d0907a82eefcdc040e9ec802833c267b1b578d133e558b9cdcbad1ccec0140c01c535fb4b3bb4348bedcf35c4bc63b0f05eaf865bf990681f9902dd03865f9553ea15a7f39481e95446fd5318e793d7fbcfed48da7897a47c6690ced95dd01c6f3e3e7042c726c96f7accc135dc1ea615efff4a43a963a88833dd7176be4e6d0d36cffe8eb7e4cbb937c455ca5199558b2a0522202aaa63b8edf9de958f61cd4fcdae9e7057da759785459f9c2465af8eafa8a5d6702486e6248edbca2fd1c8c8d1d07acd098c3d0efa0dcc48024b4e6dbad33209efda8a2a7b63ee5216d55c8019cc69fe9485c619eb4e093e8f3f0aaaf3ad35559cdad454d9ef80ad6bf758bb9f88df16bee977f99d955c2cf72cb65d70f10f1cc5aed4997e2a52634bf3d68a02e1a455b6fd59ad4fd84556c7d241ab31595e7ff282237487b9b45f1d0c350c9dbc6d7bd4bc797287db354ce6ad13b8b29e60b57b39249216966c5cd6b0190e4a477cbebb1a94cd36c803066e750b777bc69b3300ccbfeb7e081db5f9df3f6b09a2ddd11cfe9be5bc0f73fa27086c1ca6b6e7c06546e59a9a458de09b34e20017a51ed8e2281b2cc62c1cffd24ea467e38efb536d4cbe1e9bdcf54ee79df783637818fe9b2452cddcc7da540b49dfced5c94644c87562066e093e7e6f499c28f198985affdb49bbb36882efeded8d247d47fe63442ddd23d145cb5de3347e2434f5f650078e69b6ce030271daba38524b9996ee3639ff94b671dd9fdc40b0b8200508d43ece58913219a11893f9f867d34f275ec019ac2509de7e2efd5ff9c1c3d9c05efbcfdad3253f7feaaaa3caae57764764b32f535755e2554e3edf9c778939c87028b2beb2829208adf0152638e5e187490ca584f838075321fb3fc3cb983ff16828cbf1c21ed5bce89b1358a29b730701461b1cd815d5fc1f0bb1a7645ee3e9ecf88f338f21029319b9ddb380512d49ee0f258c97e1578f33cee2b4cb2010ef3943676fa0d43cc632f4f894a6b5040c95e5f2e2f909ad43edd2a6de3a26c994c890642cbd1bc719c5f952c22a2df369984a97d000c9419763f9e09bcb1bbce64c733196cba89bfc624832aa3de6a5ca8239896e81988f851824081fea030ff539d45e464c2c2618f1a0f7dd3dd8a696450e183666fe7640af407de1536441c6d7038d975e41f6c76f69c12faf50100352c1b3835f7915b58d042758ce0dcc05326716d727e112643070471121728fb212311dc3ad3a05017f3c01cdb4589c658c5f229380d0a4c3e296aac22d312991bcc4de0261093275b02d6ccdf7ee98feb33ea2e3d14661aa160a9a64f2c000000000000000068ae2c0400000000516823ebe2897fa457cb26ef2faf2192787348051516604d565e2d43d94d33f674e0928745fd6d054f7f16d019072cf09223df25e7a8dd00fb35285993218c47866d67bddc91868b8b93c40fc52e2a8d0429d4df4a4d53e6ff1b8f47cff36bbc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d4962bd503848bdf914baeecbda162bd0b96581649b7a9f221774cea31274d24f18ac90754807766cc03d3ec38e9f2d25c373f93fa77eb952d06f0fa85fc1b7805215a6cc1e10795af6d0b768112748cb1e0510944a454cb3575dc10311cc465beb081f5a4a42c9b00268e81ec5697a772046d634e6cb0fcc96885f634946bfd03163c74a6e069991460e759c83c153c2efbbc847d3dcd0d10b0f82929a478869d0222e98e71b68829cf1c2dc36c9a4265e9a9199b7ce423638cd4c3e59feb4724f90b01db06d58ee8ead65f69bc9a511a18d78ef31b527a306ab749bf246a7a5c1cad4ab8ed8204ea4daee8157bb9fb1a8a757fb15dd2d7a586fea4c477bf50ded990020c6626d226db3ec93d501b188ac8ac480b31816f74078a551d00d4da1b6f5f9f021f20afd95a34cd0f3f3290c6f60e7a91b9a5d213984532324e14def3c6e6a5cd022e69b08b8d9147302977f131eacbf2fb15377b7af9c7a51527193eaae46e073b0203f42c2a0b375a81e9174d2ab4a51e68e956b42e1983327fdbe384c915a6e203021c21186797a3b9fcf25ed8922b969071e8ebf6d27bc617c4cd97f280627d4fb6c8c87511ba40a42063ec927ff8897a5b988c650af46e1e0cdf1f5d12eb957660a6af6a3767d2b67113d680de577802fe0bdea2cf28bdd168892017e0ee2ac46a7df47d4d233663b73c0d81d55099f9c61c2cd94d3cec2a33ab2fba67f8534c7da090e380f00bac8fd7fe98c9db4ac774f9ab58d2e94afc202968561836c12bf609a5c321b2e9b33ed6f815f3025f88d0dc491ce3f286b65ca7e635adb49cfdeaf3791c529db247ecb2d46e6d370e6134a66fc00d9d8ac0f301f4ff3c92fabe6c15dfab67e906f581ae5aab93393a2add9677fda74324d7b441deb9121cee691fbd2489980dbb4fd9813909b7e2bcfa7505b2325917d9d28dbba39bfdae3afe508625abe86ff295613258f59b6fb39d9cca752788a490be636a05b88fbe4ecb710397545f0c38ecc765d8e31d1407fda0d7401708e5f161622fc1acc5e0c10b07623ce57995b15a91db30751fe1b1520155aae733f38df2f44a776d916cb6f4f1cff5f7638e81abdcccabd72347636cc217f6d4a3cb21eab035691b0086b3b8daaddb3965023c749b5313db1f62e3ce62c71ef7d33d78fdadfe3633d33e942632054e42c0a8daadfbad648266756f3a1192a83fb4bbd53bbfb2276edb4f861cae34f0f0c607d57c98bad954a49c4c05e39df92fe5e46d6b0fc6442bf84403095eaa28be33926c26f404adecc7d0e5f545be09dd9302e8fd685ee7e45d2a42bf246bdbd7deea63539016059bd4ee0824aea6d702a39dd2826f4048bfeda93e7cc31c00e79158a33192653609dbe9728b45aa373735f0856c35f96c6923dcf5aecb2b3824c936b061b2ec1560c45e41c8ff50b4395a3766365070f49db7e523cfa7459b835a381a48af165065a0b3b4b2468e071a484f6dec6c776ee9274544415691fd06b8b9988367b7ef181477e9c8d10b7b416b1efb692a4a1166806632f7763559712925b9b5239b6004135a6f3be41f391e6be0caddfc19d075452b38ee8610357880dafaee0fe9a3d539e89cbcfd8c69ee0913a6458811d51aa7aa06bcca06ba8f9b74d93c154e4a03e615c21c75e716cdd52e08ac0eef87dab181f70cdb020bdc6ce163cbc8774457bd4bb9c64b12b1422fab66c69da05859bda1a835f3244c8be4d3e335a7871a6fd3a6f837d9a734e1c7defa134f57e4504a88af2ebfd3b798949694c294ffed3da94e5311b91f7c1dcfc35d50e3e24424d8dfaf165f3d09f794f3818570532fc07955f879c0a5e41f4ccfad9673d06f31169b45037f514063043ef6894661007f7a46fb0e3bc0c0bbb4b6ccaef8a18fcc9d1f1ad21dc78216cd04f9aa96385167de0b1b39f24d88d4686c0e3aa55a578b4c5f3ef875134a3198def2c6c12ec8e0e2ce275eda5dbfc9161537a03ddc677dcec9d5badcaff5f0d73164898f774f91680fc94a5c2dbd0e085fa78e848e9cb35a780694e1efad92c08abab5198084d6470fe48f4fb6709d82e83bd66804bdd6d0b61c3fcb1aafead10b561917ee2f70089658efd09ad37fb4e2d479fa1fad80af35d4df0c2f84dd09aa5e79469f6e55cf52434a403ad66dea774e5e33adc240bd9e8c93a48f104b25dd3bdde65d044f9006a339cb59e7ed90ecf4e466a209f20b40c94e1e9f6be8d06fa94072a2a83c8984ab8e4d18968f8bec42d796fe41c65457ff3fbd0fb0682df670e1c8404cd41cd665b69de9f6da53b9d92449988a7171994cbf0af54c2cf2cdd62b092d411d216f74cb8f64587b807ed998518933c77cbb1f2a1aee6521e12f986fd30b865715861491abaa8f3df5b93803bfee762db105e0878081a779bf5d2a8284e4a181e74edd6640a206", "5253636a6a0000", 2, 1609480731, 1537743641, "4367f3e65c4e2acc71dd0aa939de39e9cb47b216b108ff9f9d5f231dd8b687be"], + ["030000807082c403012172aeae2a5dca894e95ba7a5ac555f499f4685d86fa1f7cdc40b4fa6267d87c01000000016a5a0bdaa903a296c405000000000163a5d45a0300000000008ba886010000000000000000000000000003000000000000000065dccf0500000000e286d36daed85bc38f79875f33730e5694c6c1979abdfbfa5c9e20c40c0cc0ce4c86f865881109017342845636b75d2b2f7cb31bf631982ecfcd3663d804bfded0d0eea597d03b43d118d701b4dc1ee59943a8a3e337f30ba29ed1e6688a842b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004767ad9c78939337362d0ce517b92cf4a3a24f826d4da22c7f6ea9ddc175ac2811a27f6297a08f9e9ce2676024145f46029a37a7f977ec3763ae298d684a22a2d18ec32af6caef1b262fc7a8a68d6847abf9f83bb5e4dcc49644fa54bad60aca42b3c6e057123980ddb88d985419cb053cb2712f10b8fb495d8d9ff591a5048303003d6fb951dcf96adcb919216ac398f76afa5ff32c9f105c58112d76d9831d59021c6f02611d5c5b9d4f9be541f29db76000af5a6283676c4d30b2b4cee55dc25e0a020e04d73df62c6111e9bdb5b9a2719e642d2b3f61873905232d98df4bf27fa4a49ca3d38802ed545752ca8c7ddc692aa97e2682e5ed76e19d89b25aeb2524ba030be33582faa21521a98f9cfc03de2b8256e456547271ea3601dc3d9a1d33f9e9022bc03a4261f375684bcbccc4bc2e3b8b7e48938100db22d82c971216cfc7726002038c8ecb97f11c39629f08cbb48d2b9e3360f752a9373bc4235cfe48ff503a07021a42f74c75a1c3352900e3afa16a6f282e4a5651e003427b35afb5e95bdbac83020685e377b2021eaf3362c27e657c6976d802fa4588e5744f29848523cf06e968941730fa7e712f1e92f5e16404cac4878aadf25cee0fd20303944bb11cc91a6f310de5477ee5db8c351bd1dcd83bef4289c8e0b430ddf93ad9dab36e3452c1f3454d70694b3ec507cfeec098149675360acfcb60f5f49f52ba5781b6be3eea91fe876f7b7ddde1bdb2812a0c89c5bf45c193c7ec195575d0737cc19e041463d45d63feedea01ab15d21a90962003b8f0f2821cd7054ec543a8fcfa2f0a048c58faa3b3f225508f21dd1b3589ee417f0f3bdfc515f05034cefac80ef5b89a9429931c416ec07b50c998069fb3dfae382f495847c153acd17b998ce2d392563f5906068aebcbc7db55c1350d5623ddf623347ddb928302b7af7a2000aa486139fc8229647e0d9eb00b6cdccd2fd3d08e8708123df0af7c039782926d5988edfca25ecbfbcaf0c21f23228396695254da4c68fef78bc237657ad658126a081e59c77e9db3922dceed08c8caca986ea01c552f30e53f7bd5c32e56988d182c5b127c34cc73289318e90fba8e1852ded2515e8e18e60c7e4b38d639e92514723af493146722ac8f5a81c4a2bddb4e057ae97f7911b100b2e63f4893eb06a2a036f96777896f203dc61bb8e8bc74be103b2cc5be7a9d9e23c118fcc30c522d0c5dfc32267993e7ff2de48c5b5b7336f5b0b5c25f9b21e81b70ab5bf47a7397690d19e9ed561610f6e887ed470c46b7c044d04fce1273ad2b3255436cb9e1c37841f243c3752e568c3895cc2e58f204055b0c82bc6340c3beebe69a197626e1503b9df9cc639441f0d2b6d376f6b37ba485627923480371a44c0c226d2b620042cff946b152aa7f0d5f0cb321d45fbc925e5530f2fcfe1402c72f8bb59dbc358c6ebb66cef6c3eddd037159cd3b2692a22443a7815559b2e2671dc1fb8a1f6555622f129680127e040b56cbdcc1c1a23a8641416ba80cd385776c783d14997058e1874d527a4683ded050078a9265ac9349a43e0967350bfa6031647acbd0a4df7f0b0ec3b2dbd0cf36edb010ebed779898902221c5b3cb6073192202d1f66418de712743ec0f19beb5728cf01211a613c305c1e9447f51b806c7474ea884658b76c00d9183479286ce8a6ffa1e57998cc03ce6b2d68ea3f340e04109c8fc21d43b2dce940a4616b22787c9c691c026855e90b5a32adc4089d7726d5351481ade5a937861ca4eaf2e358f5994b0681edaa09aa4351635a8f5e06d28d22a8988407bbdff4c4612e9a5c2ca9a838a880025eb468a12206ed001eaa6abce003b1093b214075a6cbd6caca0a77ae85182c23160af4ee1eec7726be1fdc90f849f2066f8179ad53017d306a8d09e2c2f873064f82cbeb96338e6ccae82e38287149a85036b0b1fde6b59c3460874c2f4d4810fbd90a74cd93e52e0a289ec0953d29ce9fe7e6933282e31c309ac20079b96dab20f57e54836f110156d926dcb733c3702a21c1c3679f29b6dc3194ee9a2abf7dc6ff85c035aa1cc82a84297090bd3c15a0ec5a0e020dcb29ef610788b74609874eee09dfa388039f784b77a6e2879b44b8ad6999df05aab3a39875f2ba2ca037a69ae87b4c8551ab4a095f0669e46ff0ed1310759a8f3da3cc300a0aa43599d37005bf79b9262e1b5202af20f0b0e071a1247ffb1a2b31c15fbf642d773c96af973eda8ca3ceee01b72c0d1d0a0d57fec39e9852effda78044cab80d578c3d92caa298d9faad6b312040000000000000000000000009a78da2af5dfcfaa25a5e861a6ba68a704d6c546235b2172f08929217b31a94c67a9a4504fe762b11128a4f6ae49dd7c396f080a27f34129d6a26ad38fdc95b9d5388d3e95a86a2d08866b19e10925ab0a44047ec51056bc812705e8825bbdf400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b738d7d9b9b4933563c36272cfb52c9e40b0ceb940cf3d97185198fbe51c38ec26c5824e8ff0d2f06d626bd6dbde522f4f5bbb9995d1ec30d1e927a98df946139b3744739ab3590af5b3a1de74a0941a2545a9efcd153bac209c40f582a169c65e9dda63480c2374b1316712f6f3685581dc2369579c783e1f54692279b054a50325aab2a598b7917afdb39ca46741d89141eb520902d052611e69d00d98ce34600206aabbc38dc1b48164a13ad1747dc36d017d39256476f1d233659e5cec6a9bb20a0199b106cfac1b6bce896abc9bb9b385721d326d546790e6f922c9d2680e350e3a3dcff07d4f6a6626efac9ea1b907fe06cb232622ed4f52cf4a4b16ffd38b620229781512297ddbfbc3956d7ec7644801315772c1f67689f0092442a4205932090316113d8daa7d44f7731a47a473a082933f4a65f12636e39a52a716a17159c0c8032db30553b96693eccfe7d386beb4eae4cbc4df0fef4761e5ac0e5dece27162d7020a8d1c4b097fbd75769f31ea453e2d0fbda41458ab86ffe58fe3f1bf4d39cb14031d0a3eb4987931fb4314dbff1f21d84b72640c1e39d5ff0a0efe91deca58c65f077f8bfde1557bcd9f9bf4062c99c035c74298e97d014d73bd9e379b55004c2ca80eb8c0ee1b7f5472a6c5e825c815a11da9f699ce633128de636ce285532b2163c419a18820dcd954955b40d89a2d3fc05ebfbed744a4524433e1b4ba6df918b96bacb268bd0fb37eeb6bc6692bdd900b74d9d8ebbf4c31022db4ad27861ad208d325ed22057fe6ef661e4f223248424993babdaa6067c8a98deae66e3c436c06f5736cfee62e5390568a38f46a66c0f7b8dbf267101139e559c9b88fcf145d4f8ebef5754504f811f51489cbcb59cb094aeecd5d49d5300f2b9c2097e75a3fce68b7dabd7c5e02b5dce58ceefc85e67663249812b6775ec436cddc6df08586ddc1727faf8ba3cdc8e4b8dd9fd026d9a24cd6198ffcde27b14a3833f4e8e7b0cb6b1a543e38c4175a400a0f5808c6cab49fc5dec838afe95df13e265f1c540cee58dd20c241f0c4d2183378d51e2ad6025bac51371e0de43bc6f4ceb20b14847adf6aee52ca30a84e28faa2f2e65d895553b802e69ae175610d8559c6d4688e21a7a166c6695ec45c4d9af0217067fcd14624c15a8532564bb5e9e3b16f80b8d72ea79b8b82e0af39cf1e8670fb98fb2aa949535660b0f9bfce35b33f79fcb4827cc63e31b182a0aa8327c8950b43f53db79a166035323e97f1f18fcb3fd71eab90b5a5c58006589b9bc6c5e9b6366c8aa3f1aadcee07c207a1cb0c21927274426d7a5ec888cbbf268b79b9ab008beb064650c315a3262e2bb1baca367fa3b6d7c1c61adb9c4060a17071f98309ed0ab64dd5816dcd6a71a960361c1ee209bbad66ec7f51e6a0b0c99cda68223c22e1f2e487c7cbf5640fa08cdb156839e794cc1de95083f76ca8d99ff176665c43a65fb3583cd4e3613456a0cb2b5227a3b606732f387cc5df0c094c996865d71ac8829a8e105f81a2b3538e6b617b418d81e0fcc225dcbda06341a19d053dcdceb3b3b4513967b29a4192d589616818d872dc2b6f069fda406745fa5930a47947d7745272595f2c30e683c4c3cc08a29b7c882a746c0b158133583ead2606cced2dc23ece49b18125cebe02198da8af725111f053b9ca7ef37babb6d91d37d9b5469b03fd909317f9ca0d2911d6a6ffc0261e3bfa45d3c1f862065d92da6337385666f8320a6e07b808544ada25350cb1d4dd6a66a6d9ccf29f3bcc5f5de82c9a903212787b3a89ebd9dadfc6b5708bea697c05f32b00d7d6e78b2d3df110e7ca694c6b11af849cc14b9a82e602bff586a5f76f2fffbf4c24fcc3452eb9d81b986fbf68692746bb94e849603ee40ba3a2254854b8dd755431dce4a620ef9bb3d78a42a61878b69b24dfdf97c1a9f6c2df6fa5a92c08bef92a547f2311710452bc965f8e1da622569cb4dbaa712ebe386222b361f396ca45cb43e66ab408a903a546042520eba7b7d83cc05d8ecf8bc60bcefe69b0a63f3d4f40496244eebfe029187d21744c528132d00507cb1569eeb8c024f37b035d279556716689ac21209d4b85af14e39ed55419517d4daf9c32d7495e496bb08049ba17dc6cf33090c27afc07920f605ad89298d1ff0acd23861589ded0f499b312df5687e85231d3d5b26d943faf246516693d091503c20d50ca28f1fc384d0e5f7ab060e651be69c06c747a9c5fa6cc37913e181546ea57021d9a360e21527bbff4323549ca13e4fc707dac0100000000000000003ef8410300000000b38ab676314f8dabb3892a5e89d19832d5ac53e0d1b054e398f17f8b381a2f774b227bfafeb8b4a043e03f8d7351557b2a5fefca513a6116df86a4004e2dc7b071eb4b52e85679cb40e98c6ec44c92714f95f4d0029ad4764863650f362e8ced0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098c4b85c03b42537590b9fe14c2af523bb196f86354e40ba37f9bd0f4acf28a07aa287b154451617fb050ee07ad227f26662786b3bfb25c1bd1a80ff38cc6520aa658f55e12bf4139d813c804ec76f4d25b153fbdd71c253893feca760f000970f2984ac8450df2ea59e292a3621624dc72483bda7bfcf6a15124a1204101fb1022e282674ed9a8c6301057fdbc6de59a770b1a2157698717f150d8fc2021789c4021caf2646664a112dfc1cfe73eff3165b6f6dad8bc8179c5895fbee22370106610a057cfa576b3203175b624796a616243bacbcdad2e128bc8c7463c2e9393596c4630a0f7337d8bef8c9f0f41c30b599a5e8e090b50047d5adb69786b1dcdb6a6d0320cb46970b0c9d29c170ef086108727851225db9a0c45e56eb9efb50193f400c0204adf640161369f9dde9e38428b098dc65c960efe3891f28895a3de35462e699020b5e34c41f10669fbdd7c12b446dbbbb7c5554ff06334960d3b66e6c9068a55f021d44bf6c54167f432d52d733fa21743841dd0510a454cf56542d8f6cecc05219023040ace97d354c938e8f573eef81a620858acba9389910f4ae8e0f11e3a2cd2a5596cb0ed1e0a6556863e8133c9a87cafe046fefa7d84cdcd3b13f204b02e555a0e43925b4db814cacab859fff661c4a21b3296103a52b82804ec7225728652d875078a7b411c317254e37fe0f80ad35b2163877253e8f977585729b49790c59021eda07a9a61c225d291d8cf1a1765424c6dafeb9e4ac97905a56e17d916e1d50acf9e99446f512ab3fe1e905f4449a8be8cbab12af4c56ac9cf158cd86ef2555e682b23f271e75d30f2b6ad948a7f0d56a295b7f6cfd7c5023f12720dd3c9349f3f7c25adb76d6307b86ba311b8a581f37d4350fe2bb1a26997ba2a2ed658ed70f018a0bf808e88f00240f5cd7a2089ef3c83ed8b5b7a54c52d92841acfdd3c3acf6d0944e11b4840631f2606a2be21a742f0511c4214641aee812e112563922fc2b58e644e9aec16f5ba0f41ccaf9614e3b1d5b067117e52abb1be711d6e96f9fae6d8415a197af059e65a42e64826449546beb9723575eb97d95355a96cb469f5bd6ee3dcb5600e252a8b42e62a80bfe2ff5debee835032f833a714f61eb90db1fdcf816c730c9fcf3320027eb978b6e21f17fa6bacda101b47fec7a4241cf6da682fbcc74dad7c62c57d62d64ccc33290a80c2acd1052752f5a808ef0b54839560d2900e83618fa89363f7cf5b3341a2eeb7690d23733ed23eb44ab5ef8f3d07e4bd1a63e2048b7103400ed786d3c7069b09d8993ce2aad6c8497cea5eef02dbdb69fa9901d64fa8787dff3288f3fae9e113222c12eead71c2b1808696507974ba83e4571bc73f66f8f60521fc7d0e4055c3dfbca9c4d0c39e6e494ab7e4d30aa5c4440ba8f023d7527a02d002f2eeb33316563ced7911fdbd008bbdd472735d1dd3672c41b8521d50aa3f565de5304daf8656f2e95b92423a9637434e833c794fb174e6d7cd52ca91157fa2ba3602cc098e975e0ca2d94ad77ce6de51afdd4652ba021b74c7236b18db6ad120b67927f893c4c2d04147308710ca47f07a4383a15bf145377a241cdf6334b2ec6d4ce53b1e6b07c88af6f2ce73d4384c3f140b0ea557a58cb2c9a2d91f6c181877d7f99a11fcfd52ace54d363933e5389cd78b10e21936e85c1086f9d59208ca0e0748e03c962393d33031ecb9b210c898a6826bace402b520de98c210de0b99cd36694cd4294a121a3e848525ffe9fe0d6861c716f2d3e9ef50f7683984831f8aae867e9eec10c76494a8f2c9cc93d873038e71ad732bca7dc98a0ee651d5a9d66883bb2a1028c111dd40960debc3a277816389f81ee00d423780a84dc52ca17f204adb940cd10cb0482c4e6f36ec509d3165d4a069df60e157568b04db863523eefeb33e994ab3c14d30c7570598bded16efc396bf3c43577c367d5a47efd31929dc670122c87723fbb13c5b2196fc91cad56d501ad228e4fe732339928a3b7756e8f25bb6dda05ab218907beaac7696fa744175123e7f6d05ad2b57fb6481e7638d02c43ed95feaa2ad6409f018782a6f991cea7438370abdf788b4fe2dad8e8b1ef63186b00c489d92958e697a896918a64de655390aca712aa69d978f5dc212de9ca9c61312ee09e218b4105e175493372c92de69007dbd35f8776e60e7920370350f135272b9501fa3a7d1088ddcf429cec565018ffa37c4de0efb5ff2f79b2453e249d464cc832433f331793770a1c03f6b080689f65881a068844f7092626bf2b64e73d205df9c7e466af736f287d245d9cfc9507cd4868b7fa59b05647ea2889cb4cbe460c39ec1de2f15dfc67574db4a1a082d1a5c1f14b80dae94d5a52b36c5ccfcdbc6d3c808d4b33ab40de8f8855eef66634f9e4ff248b04ca01a000", "", 0, -1656043844, 1537743641, "1514c9c10e11334aaf6db08d8a157469879b18c82a9226788b9cc13a63592638"], + ["030000807082c403019a0ce9a093a3b688576a43104ffd3f3892ca65ffb975a76816ee73b2969305cd0000000000c4a78e5a04e0692801000000000963ac6353ac655353527061bc04000000000153469dc302000000000863ac0000510063520cf0c0050000000008535252ac63515263f2b6517200000000010000000000000000753bc20500000000c89734afe7701f72893ac07f8e700ac92c985c23361364d68a8862dfb88bceea5451bfa3854a988258463c5c4fa0188b5d9ead46e6e3af024261a4ca3d06d491c17ba614eb2f6efffb9e205b3d494580603981569fd864b2ba6d1f79c19d65f400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d71fa7310e14513e9db55fa4c23a4a4ffec145a5b5bf2b7be99a69613aa9c9e30be98ce2bd4a2b4547da7091410c04c82ed6375df4ececc87e9d96da7fb55e0643296ad68f73c09ffc0d24029544b48889f56988f1f630b76cf9ade3a61c1bfe94f31a6bc7504ba2a135c497f00be198c5eb095a3b0b45405cdeedebf7f16e40022a53d5c76137e5265ba751ef43d3028425940cd28ced19f26595bdf2fb33ed420306984c87fc0a71650942ff30408ff21d61cc7a432c34ac91a87fc48c1a2e811a0b064fef6918585a09846c0ffc9a3aef45fde3d24ab01b8deb157528972abcc3d8ecdd353f67a9159689999c3e1646adc687c72ef05292eec93706e79f76e7d82902085eb4b2ac66aa1efd4a56844b2af51b1c7a9ef629f755931145fc621744cbe1030274e059b377289ff7cc7a12e1466b8e4d2f4a51f5d1bd724a1e09cc041ff560022879ee17ca0bc5fcc0a5edccc350c6ee59190838f223dc5ed953d34cff6915200201275884f6f642e29b4a28d48efe55cff15cb1737a0b8979c0172164c69ac32002139b8bbb056b93ffeda21c3ade69d6af7cd639345eeb126c726072d9722c02e608b8a8b02a2e70d041c54cedcd24e00156ff39c29588c901f32bf23bbf86aabee94f34f69a4fa5515a1f7ed19dc1f57e67697c82d3cf060309e9ff6f6316968bf123856484117b228ba9698a7d7e70030291daccb62a4b78c4224deca253a836460932f906089a2bbb180ec59a4db2372e45fb18ee88ba4b1f5bd77f451e732f807b7b7890e709b786647698702e2cdb8af98908f0aac4fda74c5c8722f3ed6111ba2263a910322ad35148215203d8a889f7c2ef6ff4cfefc8caf5a92298df6f6f6ea6d1d4cc71e2d24accaf6e0bd9a7ffaba3925e210afb128128d6636d242759860ea4a7ee7b2b5356cbb325e204f03b93138937e25d68eccf5ab9f250aff2d1de7dfcb7982456887b7af51957a4fc1d02b7bf984451e6b11de7622b96a29cf956c23ed517b53b2f04157f97ea8600a493a416f2a13743b8c999f229a55ca8bff5721f82a9f687fc26355616354b8c669256d8968a020e183225aa666fcb4346793d8f32e38fc9ada3c9b2c24b5ddaaeaa1d3b1368cfbb3a88f9780d997fd30b87bd840d31be258c56447f94b862495ee7e0d5491c6f9b25e8a41c1650787ae90cbed03f8308d25b8bff2cc91c0b5b50737fd34796d04fef221cc139b153e086899229f4f016819480ed3c56e9ec19b0994391963c749b37ca2166d5a876df309fffcf9ff2b3cf136d42310267378b1e855bba1f5aa7049f993f31f1d366595860f139d4ffefc5c7de30525b95442a5c86b0954c3da0ee31582e251c5f2410249694effaf8fa4760d95814e46dd9d4e93e6b4f8ef1d9177846958966e6c85f2252523f68ff2cfc8579626cdb910af8a0019f0d8b9a54aaa0cdc98db2573b7c7048fccb0d73fa35a875a41ab1e5af56b01503101477cc0c3a0de5dc48bcdb2dd9ce50e7a7894f6d1a1e7b401bb8f2ec7bb065ad4800189e30161f05fb8248cdde53c566042607cc0e528764bb1e8bc981f7a1c57e6298342f297eaf6fb0dcb3eab8001808cc8b782eb9a69900c26e618c00f3182dd2aca3db46a6dbcc570ece6369ea21dee7db1fd11853d45bb140025650778cfa573c1522f10882c6e5d65840d8fa346c76fd4f6ec599001a8819dd141d868858b069a4c76371d0aa0d08c8e741f0cd573254cc891b9f63be5cf7cae5683515d472506bd94cb0b6166337b31e40d64e30e668875bbe861ccb0490d5eb069973d3ed56b6c617707f83ac7605d55862a2e2d005b5cb085d3967f02426c5eb3ca2bb9dcc0485cef32c9deac0987d9b132a771839e20c9266e2a80ac7c10967a9763c797c79bf728ec94f4dbe9b0061ab01a063668ca6bf9057cd429b566fa5b846c1c427cae20b867e0ab06a0b7d0030eb1f61cb9810ac687fe5b8bad5ccde58c0972dfc2e5d82578c7465983b147541a29bf7f8d898b5360ab7e1477f03a451a08d464d8305c65a2729261afd01e67c63bae0a44229e5fd2722deca420547fc677250e4048d968d352882158b4174f4446e957c407e07e488d0b1605116be01b1020ebdb8f3be5c1f5ebeae0f22182275b5049f3209b4f46192909d1f75154685b83d8457cbd3ef1b9931fa11d01d7a75402533c4725d30d08e18bbcc9aff5391266f6f77eec4d49cfffcc139b3946f239b4419b347e45b270b165ca4de88713fd9f539404b190b4e8a9355ca23890f3f662557a6fd28bd29fdaf187cceb77d6210728e87f61aa18849f1d3aed86991a07cce1cd0868d900a32296b102f6bd8bf569476a16a904110de8ff3e58acb581cf150cb79040c8a3214efb1d2d736db15672ec78b58e131e338b1a42da7ea9ef77b9e02a44f854032f40134fe0b09", "51516a51", 0, 1447336534, 0, "18a22c811cc403a0940bac2c038a6c6fe90ea13126ff874e51e83351d5518a9a"], + ["0855b14e01916eb4f771458e479e6c921c88550f53de30231190f93e287812e270acf4cdaf02000000015248f7b57f035529770100000000075165526a53005345b1a30400000000046a006aac435ca00400000000026aace64474d0020000000000000000d9b50001000000007804af560769cc96f869159dfcc185028c52ebef2adddb6cfb7b6a45f14b05178ebb9cdb425dea5d9bfae023ea97b6359e7c449866fc57346d7e1b34b66e9efe1a4ff8773efac813d99a9210140fcfe94f36ba257570a681e36a3548bab509d3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002024aade5cfd9390213ae1f64d869b350e0bbdaa51f7dac346515adc7be9ac8cfbbca86ad704fa960796d26740eee1cd8d5f6c9f0324fa0079467e9318792d3609efde9f96e545c66a86dfa5c57f5fdcfc09f83a69a7563f234e93d1cb7b3db06715774b178c0a56febf7fdd2a3f3115e382b20365deedde11bd9c4a41f5a8b40323be528d5efc27b1864e97ea0af46753a334961c944af9538a82f0f59990e85c03140e0d829fabab4a4055b9c60de118509f04596a72f25f7abbe9bb5b35dc95340b073a0aa6b763c6fda5b618255dc9fcd9ca580fb9957a0021146ae14c251473f54d8aeb56cf7bda8191eefc3fbb5b02366fb9d24e91cb7a1f747cb1c3987a00a4032ec599f192adb762fad368634380415dc87dcef16ae283871af078a797bba3c1022be6c1e26fa91f7be89a6a0f447a6f1393de986b27b97b195d47868b41b4fa7c0325c298d9db64ec66eb6b17da7e9d76821f8b5fbf53c3d70d07c385c82e07bb47021974e59ba8590b332ff356013330a3fe7186f189c83fd9fd055f4bdb09336326031a814b401c07056e80c8f208da077dd71848093f276b782bf42e59ff10f2dc037d1abbf1947eda56bd4f01bb22a0c9c7cbbe7305c432fb350b61cacc9c611a06770615b7e3d541bc8a1f232d0efc21ed3177691e20dd25d0305575104fcc93cd71b9a46dc3235a383f10e65ca3a713799471be4a9859508868f9273bd3e63eaec171ecf4944cd7b549cebec904f5f4ecc8d9619356cdb6edbecc57dd64660a2e9ce05c0d48718a8c01b683867bb0b502da3f9faba7a7dafb14a6648a27d2b96e3976a1ccb6cd0714a9d66dda6d47ed99ecf0d6fedd7afc77d6b596522cc948af1be24feda757dd1ea64f44d83cd6c655a859f95a97ca5c039f7aeb839f6b5fa894b2077b68e904f44efd51e1045139a0924c0f722285f7bbd23f588076654bf5fc9fb664597ca1f6df0f5aa3262f953899db1faf4f7aaa71094f1d87fcc84c3b265a077575e621588434cd968f72d86c6f68487e817f4695ded82489c3d3410d12415a35ff0244e049125a8350d0e721db210ef79addfd3db251aa7168f3ead348bf4eb00130214a1016d33075f0109a69aa6313a2edd5102b8a209740c8e7b31663da8e3b2c047b56f5acebf49cebcc6b116daad469caec62126c394c3a4ae47a87c997228f5c8cf76d1c2b78522b9d47cc9048fa47a1695b6bd11ddc6a0d971bb83a31309f5083cd57f8ace0935b08c29c2981cd836273806c1233b2541142432705fa987e5281a36d349f4e3e1ca19dc8869844b55cb3b8659e8404cc6fe1c44f44eb850dc92d07e8d73ce8b5e7b7c91abdfb202b84877eee6e2404f993964c7a8d3429dcfea8333c231f2ad96097b9f8bb8402f0ebec45d1866d09ff4ce56c330c67e0ad35e03c0b0d50116945423adfc3878300abea3560919dc232d73a0908aab53e58ede23c22fd8bd15eff16c64ea1667cf09a7a58b34f127bdc321789a8a91f4309799dce09838377993cce2df3edaf19b0f63c27c491f5653b89ba3d957b98c75c2b96ffd2cc6576e8255c97dc24934450505b2a9bb7438100bb9e3a4c2a93426ee5a1af62516fa9f157dbf457004aeb938519937baeab723fe39294d96622f45d60b4928930590a15703d881c5676390778c39267081d50bda50b91c53e77aa5a912dd14b464cd4554baffdb4fa0fc66d74f1248cf219fdbb97b7f46e48016a51c5a517ba3e22450a7436fbea002bc80f1dee29f71cfdac72b603f11b9448d6046759a57e93225b790c488a15bbc7e366cf149a6ed28b4c09f69dcfae07ed9407926471aa824ab0d954ec26bcd505085a957d1a93a59074283fb3f91b4b3535987b537223696d6d7fa39ec7ab0cac6f5fa68193b1c297b31b0843c90abac6e9a5753fa8842ff13d23a569c693def1cc52162124eb989c158d21ef3a9f80e9541b914816991bf35d59d8c5b381d45d62ce79e561cefe29928a6090b707d53ab1cb7c05e2e212e696f08f24c9d8f20b1fe67f64f39bb6eec859760718571d5a3a0ac2f1e765511d344d2ed61476e06ac7130087e8df939372358604d4c11a85ced82ce24c18beffef7adefb2aa56a28b07364afe7b38fb43be39bbcbf9c638256b19f1a60ce3a568aa2198a7727995c0de56b831018662991d586f52b2964ebdc1381f6ab252e8290de1be367cc2df59520e85e0d731395fc19d7ad9091c38596ee1ce7ac653db07874866602b4e4e316a0e25e845a20b2a119a15075a4c1072aab2dd668c3bc56ea876cb0c74d00000000000000009ed1aa04000000006c67838454314adb52c96b057ccf86534bd88dbf0c2de710c923a5219db154aaf6118b22dc4c07151db518a1beb7ef2a9a927044644eec6747c232897f486ef83bfc52b6d52faebbc7c9eb1f5ad06bef5621ee16cce3aa61a4e0a09125e1113c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f9bae5cde044112c8c715ef7a05c2cab382785671c5e80d0802056d51d2c483076da53031e02214d47bd2419482b2d20017675798d81a81980ecc4fd3381356edf20abd3ff5b7026dbefefcc74791b1049f911777ecb1e753cb779ac03de8bc5bb8113e236e704861836371ddb025056f663b2a6a7adef7da35cd13c5c68dc50325edb71f85e765aa556b36e3c9c26c7daf75b74d840cbe6b1dbc79afff29ebba032b8921447d9141cfab6a51fc59a6af845d78b7f914ea19a05d05b221d46ce2810b04fcf501f55940faa5f5d4e9c2ab5490dc53c04231de96587ee7e0a34364abfccbcc5a0243d9d892d08350c44c6ad05dddac4e1e61db4b984a8ae023cef6072f02247ec0b3175ad060c5077aa108e7c0dc83aa8ce4f0e9060794235ca56b0b93be032792667b7e5235a229f0650ddcfc8fd388716347888ced185d6864229ceec4cb02034833c0971ed7680a3525165fac44c771af436a8fc12aebdf18deab5b6cccc7030059220dfe0c1a583ca72924c4a4a361334d06118a87f342e8e6d68e51014db40221bbe32c6239c5c1c9611acf868ea49be917fe8acd4f25b3f28bdd64b5dc62b1c284d5e463edd4e318a5b325e9a0398665f23415ad9026928b0fcc5f916aaed4ad9dd840abdb81b0a42ab2ba5042682ebf484415199eecb5f50a320346e3c05d8c3618ee9b3f421a806c4235ae70bdabfe9c7860a8291c08e7e54f699f5cf174289aa80f8642b49078daf123a1586e23b0a2942e72c8e6bf0fab43925734bbe78ba24da47c557ba65b5fbf80287d7fd177f93905b219d86032b41448bff3364bc97dd639754dc62f3abc95007926caa85ee50e35578b3c8eba2b447a3fc2e8a1e376870f711bf6e76b925915210ff4726b78f812ebf26bf10bdd91c510bd5445e0f6c0c9731208f53463ecd5f236e79e2525685e12343476a31b241fb147f50cbc76171b9cdab826663ccf114176853e1b3d02e33b93f72e4175ea57475fb451042af0a3beba0245d7151374c1d164bd1056aa6b4e1a204c8aaee9efa9af4d0c4b98750f53c02276405dbacdf883309cae6811f397f1ba73636b021de46bc6c4587725eccbb43bc831ffb458ac6e7ea6c2d66ae458fbb039ec8b04a90f6f10555b0b398f9c82a794f067f524cd4456dd669a21ce5702a7c8dd89be5f5526d2f84601370523d0f31ff9bfa7844a377e6c5210fc4ad10a4a343df2f0143b1406d141050b5cf1b167dbfe5fc3bc94bba9d21d8f544a952b000256013ef3be662833eb96d64e7ed15d0a87e5762de70881319fa1ed8801eeccab8852f0dbbec3f1794c7605560530516b7b024a13f9fcdd26be7762c819e837dccfc998d01cfcbb5d64fea04dabab4e568063a79196a4ca68c7826ba1c54649ea63142da44356b496a3956bfa5f35b0eccb65f34e0b569f86b590156516d86ea559a77eaaf33393e3a0f960f0a936883686684d4a019b6492f85edc59988e9e3b086fc1397fc6ddaa72c8e05497ca237983296bd317d547a14119b865f383d130449bfe295c4eb7ffc41a3f7d6bea570c577caa53fca2202405776ba4e48bae77e426a64c8c087162f4c8856b6df8e69f6bd474f74372a8e55931511926289cabbaedbdcab8863a1c05e3881477940cc3a70d652df92d82fa65e1f44125b8c494bc2fd9ec9bae400e280531dc34c34826a1c899c86662148be387950d88f81a60d6d035aaaf2ea1ca9eb0b60df344924bd119de4fc745f8ec30c99239e61bb75d984498f181d3cb4db1132444e73e04e0df5ed5d97a250f40d06715368ed93e3de3a0bbaa6ec005a2e6c35b69822fc42c1b9a8383b33d114ab4f0890b5c33c2cba464b8f37b365433592b8550138ee14c97ca1d68814d73ab5f00628cad3ef6bbf4fad446b18e505501d3aecbc200e2f1d63a22e17d9f125c61230ee8c9babd8988ea73c43bca1edc7379fcec27a096c6ad299e9b268da6b614de5e0d755c7704207e03172201f59a1bbe66046114f7bc3f35054ba1bda7ac548206d102def244d4d2a0075a51cc5e83a1c376a2f4af3272995ef0df36d48f0ff6f5025edad1ce6f9f2c815d25db68f4ed0f0351d9981d158dbfb5421b2c9e56fdedb2f5acea787d39490b7d9a82df82815535aa0907683c0a8752ef08a566561a02ebde9e1838b0e5c26516c3182d92424973f0a0a898f0e6ae48e4973e4b30f3d17076903a0e9110115a21662337657f1dc159773e65824cb488d406692b3a141673631da4370ed89ac663497a80d685faafac510dda98fc903f421629f99242c1a03d4d47fbcd41d79e8ef33fe7c7f904e0890419fcea65b83f85eecf7e5f4375c32d76ebd01280f47642d42d3014a2758252bf65de5dd5001c01e64db5c1313a90036cd0141c4aec308114e6cc1b63fc5596ca90f00afd9a3a95eb57792d06", "63005300ac53", 0, 186284734, 0, "f45bc9b82d65bea7fc4063059298248de234f319bf2aac101510f7fe4e86ecb1"], + ["030000807082c403026767561a73a497d80719f0a228d294ac2397c4a40e8d22637e2f12dfbe30e5c50300000000ffffffff29c94b094f6af8738654402245dd09a7f2305be41bb34677aca4b9fc5670c57a020000000363656a37dd916101e373e5040000000004006a526a0000000023eec16a01d9ba51030000000000000000000000009abf96056b83f198926f2a80778bc2e81161ccf1c797a08444725735dd7cd178a9e77ecf6979681323e8664e4f57eff45b7979e271d797728b82988a6c7d108d6ab8da63f30b59c8bc8c584eea1da0a4e6ed2d04f6dc89b2a2a63476c269912100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000653d6a614ca327a4fb9c13d94741061651fb1d0d30a4afade460484e641d417175c6c0834c7c9f56e4c3b0c008ef31bbc1b9c42b88b2c4ced5989482adc0e359a276cf0961142f05ce3c1cb30a29e3117b3f87d4b6e4a4c0cb52ce6775123909d50c00c85b1a81ff806673e536576b23d3a38cf45ad66931110e319c7169e12b030e6f0dd7289ac9ef7b1158ee2199e24bad05ee86d28764727dd1698898db19dd03302f6d34c213ce1c4727f802ca4af8bee9564d7964558320580dbe348e6858d10a0921d586ecd1aeb2da30c0b65e82f94dce89d8dcd66a0c989e845d2a7eae8f76da51416845d4b7304379e6da8be62d0cd9833a8ed14b5b4d8e64b8e567a65fd40202b7172d58d1baa57fba806da1a097f2b1cb4a3e479678e196feb2d497a059570313c018041adb94024e4a6a7c1658011782707b88827b9161756ecb17093b5ea7022b34bffa6e3df15c5029a66635a066b21b6e7a6b2926c1548fc6ddd118a98963032fe0623c0a3b28c4d3783b13b4aca7b86227c53f45a05906cdc512c27b1f60e90324cb77604251ccb3e7a02f4f65f391d3462f3acfac83e34e404a3bdc5373ecb98825ecc652ee90cff7fd4dcfad6ada2554ba6024914f6ace2818c14fa232359624f8a346847a0e54cc4c100c41588dbab4bd0c7e83efad40d016c3c4b67b5eac0d376aa90aa48f1c1066cfc26b605daf6794017d8e1137df1cd137b0527536ac37e094e1bd883aaa76667a5deaa51568c9f242621f40540fbc7ca62f3050c0e6f92273f1557f6eded80e7e3175a517cfcc1f459a7eb32ca33cc617a1389603cbe55c0282783fbfe56d052d0880be9d0d09f241e826100344a3cac611fbc4beeee94dc90185f6adeb10a48597705380bf0dff28d3174f0f9d0b26b8d7b2759bdb5c552fc975fd5150467fbb3ac042eaa3fa58c0d9fffe0ed716ba713c6f2ec02c4ab5c7bda7c18cc6064480655cabd160124dad21236640267b8f7b5c68d9b1386ca669d5e82a06dc82492ef31c8111cf42e6a1024a307312f8a8438a696aed7a890a77b78755778ed06d7801f1b8d1fd78134965aa8b06bc8b3d6437799471bdd1197f33c09095dc0fb8e5c89777367e2a48da15c0ccf8fe78c81c20859cc306e6b638b9fc4366ccad19217e9889e08fed2e1c3bf4dd68ae2567c76a1b222e7cc2e1473676d6f892a70393e0d4576ff35815bc08222da8d8e18bd576a1026ac7835e003241e4e05a5524731edca0436bd9956db3348f43e84442bda0ac80b541451afe19d3e69782d05254df072cb7b501fde5b11b27c182a1a0c927c05c3b1f02cb9b87a0e7343daa1cc48044b0210edb6bcacf66ae28e9e2668a673e28c3e0ef037bdce4c4e2f58d5ddb504e74ab714746535e90004a0c535598d3de277e68adfa3988db054e1aaa77daf25278ba91bab5500df84b10925aa953921ef8737a0753ca4510240a1695d61d42fff9fd3113992f5b92fe41ec1ae40ef9a78416816b0d3fc055e95f62be6f37f168e24216d3ada002a787808f269ce59d02d23db346023e210a9e9e09f0e9f74a2f06321c883b9f016167cfea2ea7b303df9d637e89320480a86a47a0fca88cdf7ff6dcea56836fe044738e8dd6a6c364dbe1e4cdff047ff113dab8d9a92b2e98915d10839b70f2b3983caba80131ecfd8debfb9bb9fe6990b00cfc528a3c51391d7fab2e1e6e991a168bd3439a077bf1aa9542c436dd6e38028357013ea4f7654dac871a39c50bb926e673b87fa98969a33eb54362cf208852bc9e1e070ce95b61ae9d850b9fcec92b9cd49bda2ec5d8367a16c68dd7f71464470f312986c58dfce793bdd22bf59f987a3d6e06e868bfe16937fecdf7c1c129c93f89c85074e2503f7ee77d2e772f79ae2d3e18cc21946f113bbd30405c982422d978f88651c1fc7eca3b0cd269f2f8888b60d58b7c8aae563270d905eb7b07986bd049ff6331c09220aea5196d2a041d98c6e1fbe18ed2c5bf204ff2972453cfc368d76bac58d2c88464a01a821d1a3720c58f049724582974e42b5acd0d08487bbd6736147b96e2bc80f115fc72d22adb107068b6157ac39c7441d090154634ec96a03e92f4ad2177909836b2169258624889740bddec25b6c559af8b4c7d3907aea1eb886e56b362c777c9d0b0808efafe4089fdc322204a4b597e1ab74e96a2fde05b806b8af470c2f2f47cad8e7931d3831876a6b43ec37bfcfac3d7ee66e01adce32c80a19b6ee978eaf167f0082e0abcc039160259932ee780128bdc2b8b154a9f3ae75fd294204e2693ac7855a8c85aa940846b3f037caa5eaad7a97f0f66555330508edd0b5a2e3461245993f071b9387afb96021150a4300f69ff80f6bb1a66584a2aede8a4aacf6a6276c13b5c014df147eafe5fb57d16f1e107a8a5fa4383eba3eabb000b590f", "65535100ac6551", 1, 713730048, 1537743641, "d10ee0dafa0b2291a1c0032fd9f7c355de9bd92e366306f3f1fc629f554d0a2e"], + ["030000807082c403045b3215536956388db305212714ab011d732bdbce50d0a319e8941641703441cd030000000551ac52ac632260acafe4bb642fb7f140370675b6a8fda871091e48b7b58d5642c3c0701080c5cead3100000000096a636aac6a5363516affffffff0a0907b2cfd762f359320dabf1c2adde8bd3c7339dd5c0f2b8cc8cab2a5fac710300000005516a526a6afffffffff8a6edca1d478009e676c38eda706ac094c20d1f1706af70edd38c5fec86d32a020000000700ac65ac535263ffffffff040f3e3700000000000265ac04a18100000000000851526553526a63ac918a3f01000000000551ac63ac6aa7028e000000000002515175195d060000000002eb508e0200000000000000000000000095ed14c2cdeaf1c5acb0d85a4b7cd52c90916d843501f40c2341f9614d30d626ef809931b673a5177b6222035888690f50b91c34c268e03f8f06241422286023b665ee5b6c4122c4e01b624db723e32d667a247378513fbedbe7be26de4ffabd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eec1249239777d30af06a7ffe8582595980ef922b91a74b1c1cc4276a7a08f6fd0eb9a495ed995806e60a13507892a27f9df47428563cb9354cdd2da4db09f43b4ddb8ed5990403caf9cc7ff2e52a11507f667023b6ed0914607410285f340aabde7ccb06fa285fdb60686cd65e1fa0c11f349f9434ee48da11b6cf5d6276f220212668a150c6028c814a3dc4ef9831b79fb0237904d1cf95aa65638714118b0990305b90e24bd758382ce347c5ee9ed194978f9ca2cb1553fb769b7787d956cbedb0b026a7e43b0b75ec54c3768617708211d9dcef953ef31821b2ec2e59a3cbf8b224eba0ae02531aebec4dab2e8b005e57c633cb6b9062357c6ed1549e3ad46c2a402235f3d804255063ae7be97b397105ca435bb1e9a72333200b1c3b5039fd786f10316e78c1e07a8e12809869474b63642fa6cdfd3a34fe04e13daa74fcaade72442022471db879e613b1b9c5c152e915b2e068a79565aae0fffcf2c29d25489f5773a030a4579170d3f63db29521d3422804c112cad8ff9dfe12e811149e70961d60d8f020c0346f57b0e3cfd2bc419f915b1ecbcf7b949ea17a9b98d30bb0959671d31aaaef764895a27fbac08f0dd98e22b63e25c2c241f8d61b4fb8b4b6459fb686963c2114135df33f7960bcaeceba017a2708e3e3d25c0f6a31c548a58423179c30c9276194942728faab30efaf9e7729f0998a2a39f2721d2073b2ca68286868c75e79d6d1833a03615c7c8d63f7503396cb9e06932f3d3cb296690107c7efa64702299fa7b8e194439acde0ef26090a8933dc27eb6a99d88651545cd77432001ea12aee9e4fc68f2f3d14480079970389ed70952b25531b32f0d8a75358e4b7c9bf8e5d46f23b38ebb0fd49d31dd9e7c1da8e90e99332a54ce8bafe62e5013d07dc1a6fb49c31d2ce4c1d24d79069079d87e09dfea07bdf2fa6fd85dfa2d18a9cc17a864f3690c13ee0ff5fe9ddd11b198d6f3157b4e2852f81d801738eff428f08eeb407457c399afd59f433fc7c22564c9acbe01a862615a596ebf1ab4271eedf3e5c0b97a72dad0affb3b6f665d32ef147fd76d6c445eaab90937e7ba299acaed364626a1b37cbc7727ecee9c4586fdbcd5f1550c8498ca4565db92eaa361907171d683a4c6d6a27d1ac2bb10a4dfb5d63eba61c28fc8f8deb2b0d1795e0116af313dbca0fd1e85c194651c1576f4e6cbf1d7bf576c36844c76d1300b4ebd45dcf4c59a18ea72e1f7cd456b12b86cdfbe165d1b07ffd087a97fca614a965e202d89d113d12780351c29679d2f2db33fa1ca39524a541a71bd15c5834fdc6f16e546ddf4a8f4e95de56c5132b27b7c12716db0bea7f9a3679fabc180df4f12c39cee023be1a8fb345ee33fb8ba498d3fdd212586d16320b3f0d237ac04069287162c177eec98f9f120f44ecded074b7e7f4b2a8375ad31462205bf77ed41ca003ef3aaabdd5f5e508b7e5d48b4edd985416742db5efa35fe02363ba62841b1bfb31a79e35be8dd8e6f7ece8240fcfee6accd97b03caee02706081bb5dd205911c6e44ef807e91c3fe5d4a36f8f6fd0314c7fe71dd1c564e54cbe1e29082b450d798bb37171ae90f014fdc5d178901a9ed9a2f0e24b48b42d716af762fe855b0add24aaacd1f7dc723ca16a1c5281e5dc39c68380e959b6a3a447a17a5d0dc4ae8c7852b4f032ab9ee94571d7b71dc361dbd1a93987e03388d5cdce4875f333d4ea62fe5143f7d58707faaa6e2edda9d897eb75e326151a6c35dfbf686633641186c2c0a8ee947ac6d3e118ba10033cb4020354d1d0196ab7a9f8640d70f0ad6e8f5e886a144bb90734a68d96dd24cc1d3663fb3b3fc5485cde6f4a1737f7bb569952c73b0b1a4c6915b592b5f46f13662b15f0fe2d41f29056cb58ac66d69ead34d561a80550ad8a8908873613cedfbcf01b79f1483180ac12ed973dc2efd3276bfc1b63b42b37e09a3a9055c39f2e6b6fcd677a79a72d9c1fa46f5bb73d13b0253aef34371d04a5cb1cbac05bb543ba22d038082a2abd30572ded65d1ad79f1e0a536132bbb62e19855493791a027236210ae1ec791de1e635e1a8e09e7fcd67465ec1c0b994a4b37f21b3bec07ad97b1da412cd3330f65d59d2b453f38801d38c0fe0f4aeca1bbdae3a6bfea0eeddf081ce57b16302dab6cbae3040243ac8afbec78a31296adc6d86314947cd5f0f0b3205c3d3d10eedc32b51a68a4688bc61a2cf5a5086790edc044b641b3eccdb0d858f243f07f82d0a2a01a35367e58763c3f9dce37005f02d8bf72b167311f68133c3ad65e04000000000000000000000000169f91c62d622447256fbd9d47f927ac1d296934621feefcb613dc8732f3298ebc29cdf8e486f5fd1d86c4292be0e98329f3123a053cb983dcd5133d1d32e4dc7c73f2df5d373ca34d580b35ab0e9fc0283c3f59c325a2932d91eb5390970ce800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c340386fb085224742c22e6ba4500da7e6e12c04eebc1c5af1ad199efeaef9f4b496f04e47686a28554370183116fe4fc121af0f135010c377e64c1b9c9c2cb9cfb3ac78f93f2456b76b2375ba2a1ae76a77cbbaee088f4534638bba55879798246749d48b42ed2604c56fdd150acf6cafe93b5a8974e9ce2bf5e106bc84c80503092747810c58dbcc02e073bf49910b26dffeb95575e09051db1286612281677f0224ec63354ffcfd9a58f76334066584517ca2790d2077d2376e4a36d5fb3485a40b04b8384145a6bf6772e3c1a85417b364838b66523876b35fb70b35410fa72a403a0247e157100b491630f1eb09da78c4d71ed7c8da8fa77a539df3bba0a2b5e10222505c98258e12a0ce03a8f7b1867092827cf0ad66e8bc57857eac05a939b96b03152f63efbb47d50eb3012f01e273f80f9ad7dffd6668a0fa06d9acde07f1ffa2022ecfe43429a5de2103c699de2c2033ff66599c741a55f535b6af13b996d8c15502291130c5c9bb028a5b4cb6efed144b927eb4e5594af70247811399599db072020229895264a89001f7c506373c30dad28c0c2017d50443cf59e4daf362264aeaad9b25c2e084532a30977db54a3f7705d52db7af305785987189719fe80bbfa694df6b9f51c8946d4ebfbc042b532c3b325278f55aca310144fd484e12711e206f2aeab81e6246818eeb66e8481e242de2f88c77042a7d986384df78b894aeb976796e3b2cfce3c4484640e322b712294cec458c45f9cfa1f66d973e6e4a7c3f72adbd4d7046ca60494459005945e668db1ab725d0d8eec0598f745fd709fc8924174c899889ee669af8fc60766a5cc6d1374baa93b3234fa1902770a60a08172ec643f5c0780a9e1580413109aa6518da62a3ddac7fa7334e8d53cea3cbdd53b41dcb74f939a894d8f848e189ff1fef7645fdb6cb86e18389dd7bcca5978d9512c9157d1c22a099c48ea44bda8e74c5bfcf0d82e5d6000832b530157f92ec345a1289362dd1052a9b0155319349c70bfb93092e0787e3d88add3f8bc26c168fc8a4cbd84e3c2d200ce7979b6e7244ac7bfc18071e41c6f6eab2a347a669e5a01af8addf8340774a671c9d08442b20ba7461412cf2814c45f972a21b463548c349c16bcaf3ea0a574804c56e5e3be3cc9882502e36574138f51582c3f0b27c3d098f8c21163774e40d9ae90a0c0f2fa8083ab4a66d1c6b76a539a4cf11138c143c633d6a514eb4b41d16936ce5684adbe8de9e93b988254084267f3b0b2dec6d1c79baf3b3fd542e7a7f432d0dca3c33c915be5ac491b48393ffdabbbf218e5440286104d63ac9d45f35bcc89f64524e21ebbe8d9d2061962e653b457c4548b156e8ded9e683bc80b84eea748f30b10f21b69019d1164fb9556e615ab7afc498c9211093c5470e0d5b4d2a86294127857615b5de5eb6e63999fca8b66fbe04c5325603be6854c7bf7616a4c66e02df5e99996c6990ce6d6c8e8bcaa32384390adb05613abb4890d05617f1b363ec7f86b321cb1c0166e012afe5a217d8604a9b0771debbd81ce8ada02478a9303b7959c96facb1bba5bb20601275beb0207dcaf71d0e3a904616d9f6f90796b9e44daefa04439fa1b487a5d5d78d762bdf6ee0255661fbf83089cd596dc337efad8249ff33ef40471482c16453f0116b72e3fd66260d4a909d89733d2f9cef2ac396d9fbbf4a4e54192b243280968ac5b74cd651f6cfc87d9ec7ba01582275f5ce403916f00f666151c0d4c82c1729099680f7f6df42444e3a668c15152862730c605a1580ab78ca83e2502540971330df5a52bbe3648ff03eaed470586ba2aa701444b22e6cf7c965dbb039fc6ef84e9feb17b2ac90e3eade534efd8f26864b6cbc99b5ce0819947e3465e5c7c33e3873b71fa7324e5df0e099bf43f9f3b9ad68119332403304cc7a09eb029e567f597dd435dc200f06a69b2ce5c92d68aded78940e8827c3e261dc63809470a2d5720e3be1bdb05dbf45668c60cef338b8f79c210fe68cd56cc1eae71a93e26c3f3f521fcec62944065b3a5a18fbf3a434169e04ec3f9c93dce5a1b5dd952760dc5030d83f39bb7f44ca32638e7cd41745a0b5af52a3512e0b426b484f1930b04ca11a38f5702e02f5022b5dbf5ee10716650ea1aa888587893069a549e1780b3cdd03d879842c9fc53ae8ae3fc3897ed2377334efca187b294bed17d4a3472eba9ecd42d5013f8977cda017933c151853fe809471b9fcc17d7f00613adb70d855c597fd6c35b5fd5cf824d7f38abfe44a7d5b446cbaa33e341c7a5b975258df6f14a63a786bd691fc58373502a3d3b94644521226a81a235adc6461d15250ff38e3eb2a12417a41e4cbef55743f43dcf3ebd4fcb1b89b96049d24b7e6b8e0f02abc1c4c6f3b6c873b095ee0162e125d09ddfa4452b3c809", "ac6a51630051", 0, 1153267492, 1537743641, "16efb957df372ac689541408337615b4337d6e1fa5b532c3d574bf40e5e2fcf9"], + ["030000807082c40302cad97cdf0de4519239ab2f319e2dfde0f8aeddda070fe034a70a025e5d1c223a010000000652ac5263530029f73362df30d54e807cc97c2d6e9e0bc1586890b94cbf6fb734ab2d6e3e84c71895562c0000000004000052523aa455d20268c50e020000000000a2330b0300000000070052005165536530d9b54a944771be010000000000000000d06cdf0300000000ea13198ca341ca75c98019a114b68606abc15a71192357c93ba6250a7189b0020a631fb348dade40b628152d4931023ec9172f6811b15b6ef91f651bc6f490dd4b0af690988689326be1ede4fac9bf98369aca8ec68ec9323e76d57e2db98997000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007e3cd791e7891379396a96d8e16121b3fcf925d7a99d60a421570749f1e67c0a48229f1c68e4aa47789d381804a2a1e79aa0971332c888b1dbf689b51f4e7e14e5e2ada5edfb12fca78c6db08bbd19956ef247e650cae1c9a926d076b16bf682447859c4d398d69267496e36e768fdadd99c429a358a2f6584faa22f189b375d022e82dd813e0baddccf91d5843136ba598cf8fd896616b870ac2bcb5b73ba2777032725b3a2e207687afc6cda1a10b45394c70c64ef6871bed2edcd2828df8b28870b006c51e24c3882efd4097c245867fb6dc99b53525456a2783d8e29bffd9193ec2aff6b0fa0b61aa58f545f194728798a70c583121a9aafaf34083ee0828ad8a703130143176a8ba638435c59c1803bad3869519e930196f8837b353ee403c2a835032af310ff99e388eda3c369eabb0c7441783f9164d6d282aef6f4b99dba9f64b5031a62e32b782b7a173ff8abfc5bf997cd532af61fa3668e107b850e5ce382958d0318403df29ebe414b90b694b788a0e25e876f56d35a2f4086135706751ef9bf0c030b366385a895d9e6c49c504e48ba875fafc22b948d3988185b23486b7678a16bca4d3e047dc0d0bf06867c68d73e21087e693fe62d07b489144ed3ae39c4fffc65bc62c147acfcefce831348ae63c153530498bb54f9455e5546f88766b18d7302a1c944e18a1521323d79d490737893bbbb5bed727f431ddac8e2ffdb90aeaa03abc8620e2ddf8cd495dac7be0fc2f50ce501cfb12639193764e0f0e005e9d995e4320c6ba713670ca91eec1da5800e8eac613be0f281db058360eff6b66f5328c17f611abb1a85612b7b44171c4a6575f1a8a3e0244e1c1ec734f238aa3481d6ae6a801a84d0206fb29bfa3c947eb967219d59ca860cddd407b39c813e30d25560f63440ff6c4cb2cdf8aac9e59d02f755cc5348aa05ca0a0a1187810803e29dd30e32444788072df9441b9d07c893eab97be97641f95925dc1ec6b849576ffd6b804e6996d0d1d4622aa68ae18a0673d811c6a1c2460a10321244b4215dd0b633a869929ef3092f0c16039f5b8828d0dfb64991f90f94cbd78da9aab41d89f205200222801702fc44185770b4f34ea1ef48bb3fbb0a8dc6ee1bd5607551b7a13bb1c84dd31758411711de7edeaafd3a072975bbe016fde851ad444a2ce46e4f292402e6f0fd006122450767dca454f3c65471e69a15d51486f53a9b2e1dd200dd0eb830ec030d122f11a4deca3d7fc084921f1a5c4ef094683f297a2ac4be18e6567009384ab27febbcd16e688920964defe688bee5b77143a4ef483e72aa435e78338ea1cae09ca3a19d2bcfd5ed87474d776f02ab268ede322fa938e66f4ffabd87d6a809e6f361e7ded21d4b22ac918a32a84718059e054700f226d4af77e0eec54a3defb5549145f7546a8c167d5bfbc05e351456dee8c7eee7c49c6f10ac570c61dbf961014eb1607349b0a773a05ecb5a0b1eb7507feffb12bd8a31fe0fe8b00a21c5a6af43a2b655eaf5073467eaa48f2a875eff0a9ffacf7f32e1bcb2bd4cc3abcc14bae7796022e0b848bfcead8d04cc48d96b63b608de65a274d885bd99f50b157e6730fe06463393c5c10d363eccb6e2874b068224a21a662e477fd9e221454d960816d97987058a28282f3b00c49575af918916c20a8edff01b6f89ccf079c9211905b0f4be243e31e32a209024a04e5b185f3e545ff2032de8608d842a0333199e470666b440a40015834908147f9099b5654ed72e3f1c46766bf7c8c7babc512b6fee9fe7afee551f79f480acc30da7ee8305583ef1c73350aa9f69be4333b751c5c923fe22bce0b1623a15ea4957861712e352ece30d695460050017c11383e85071610abe2849b969bfa087c321e9594b1c811878a19bea93dd8a6a96873c194dce12e6da733012d997795b130f64204c2a522cae1e526b198c5ad22767c09f01e7da74547f6cc852191010e884bef2e2c40cb55c18f119fc8fb11bc959a5301a2dbb361cd15c47ac834b0c93363a54bb474c6f7b4e17d14e693125b2aad8d04f108bb0b450ca4f96e0e39c1dba582dbac3c186a0e21cbc6355fcf9842648bc2538ad0da7cdebb0a9c6bb3e6078fedcf39d690c50c0283277763562f2a5bd91e6f7c5db8ab503a666ede1b16574af125b42b0e34a5069a320d5e0fabb3d6e4a69162a4d7d81167ae0774491723bc3926a86510f112acccfef3c262bf9655f25c5102c90132f39590a1c2706da1c310a4671b9cb303d4f3608a47498ab42d646c8561fc3aa152d52c7c6647926c063f868bd973a91a5e6917aede0c94d1dedfb227ee09b409c2e08f3a2d02e9d974a9374241c3f783df5666b39dd120501710c25811986dfdb35945342585114b93ada97a5726739ae6394e61345426a314ab988f776dd33e0d35c08", "516a", 1, -218171987, 0, "d965defdab1c59592d14d888b9d558ad1d667fb6b53b5befed361ea1648c6649"], + ["030000807082c40302edb553e2013468202ac250aaf895430c3b033c9c4ac129b111855f8f12250cac03000000066a6365636552fffffffff48321b26532d2184eec336ddb8a66206557ecdef983555beeeb8e82f4ea138e0300000002515261e640a903ec7a3705000000000553ac51ac53b648f9020000000005535265acacf863a10400000000000000000000000000020000000000000000ec5c1a050000000064a3d291d37b955fe8c175362007a35b0b4dd1d655c47b1d65392647fedf6f09095efc9416d7162c49e80cb87ea06339170063318a869d6c96ca33c75264fc453aab813e0458cf1fa0bd0e7d49114cbaf59b0282026f328b4c06c0c1efbdd81b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000644ac94e0dbc99e90236088282b1a6de4962f0d8e8dfd6679f956a72a392fc84e9ff5d9e24df52dc94c4357174bea34317aef96ec0ff442b90a5c5e683576920db3161f398d15c9517c390b709eaac9fd9523ec7ad0874a40c08457d8eb6daff312862cbd0d1e2496f39ed795976c2cb9e485de30804d31616c6fc8c4249d35f031796ec8a1a0542cc56b578f3c87fabffd632fed2aadfe8b7f894944aef776669031e773644f54c3066505735789adae1e559aa17acaaee279bfb1398ecb19f01690b01cf104c0848104c8d11b94c0f36eecd1609c84526d7d91175a40e3477b323aaee3a87721cb599d8e2ead5e098930004328f5ca487a69e6317aefaf3127dfe3a0203febe51f8ed2c0e5ad373539bf9d863246e3c68c67f78d7629fec8532f973a8032cf17ee649ee8002f5e980be8c282f0f0a161f45604c5a40f16c59405bd748fd0227f3b8f10ebc1e17a6deebc4bf3dcbd6debfc33b02e02da0491b1e66549044940324a51753df261842aed311eabafb6d815084dfc2b4c0d97c0f69bf76722a0b59032dec6ba8a57db136a91c4fec5ee22d8a4ddb914ad4a09be62a017353d866124b73926dc0bcff0165ac3dcf9b67ee76183c305595f00bae59a99bcd35a8997d1aa7b3d80797bd760e2ac9fb1127002068b9ee5a749f6a2ed13de9294855f7f71d81691e509a12dd80df21b3a6009a67653fe8132db0697a85cb7bedb97524f4d059abcc0b7c3352c8f31eef51be800fa2477581558696dc0eb6bc7294f224a8ee5f382c5cdcb5f273bd3a68c906469cbfb8f499aa08d5a202f492ad99ac0d0faffc9583747c0b237eab09dff58e543d7d56cf1ee668f3528c13ea2704c9486dabdf48fecf68a5760f0dadd86cbfcc8bbea291c19533f9918ed201b5c6dbc0ec8317c8a2059cd0bcded8eeda29373e68b52dac19831b4cd0fab14efef0a2f252bd94c959358d3129f7fb6858dde9a3e8f7a36577b3f05a87958c647688f518917e06354765bcf3d6289d0170697788300395c4bb4931af13beffed86d3315cb160df2c73a5a94cfee8dce157afdc085ed867044cc223c8247a0668c8362aebe0694464b3e13912ffe5938e1c21a5d6cb10dd4afe6422dc854842c4ac596497d67befec9d17a1759b5fe1e12195d5c920217627d75820ec5dc9d324a95e6c052170a54be45b5c171d3d15e49c4f5e83c51d71af4ed42462d1f721156a1156ca3272dd6c5172cd1d4f3cb9e8cfffaf2609af201ef21cf9d021f5253e6fcfe2997c67ae22a877423e3b73ed71892dc7155a0e8950263520d7f3ff4c54bf9c8fefd819ebc422c8d80192f6941c54c69999ba5e523ce6a75d75e41d50c21ddeffe022c042b6ef996368b906eb48626c1f728154b3de10b395ab6d55a1040e4c4e8295491418c39d669bb327318b16927c8055edede366335e5f17fb8556773177fffac8c59185cbcaaa3b7f6ba485d9b6dab99a42e885726fdffa294c8b0108709edc0389116bd590ab61a0f7360e77451e50da0fdad6161f905a987262a4ac0a12f0d6b98a8dfb0baafd5a44252ade19e1affeccbbb38f4cffc37974e7cd0c7d10784eea65a2af30c1f11f2d2ad8fc5a9ca8388336de12b7fac7b9b3de35974f8514e95d7188c0ebd9c140f277dce8202928dcbf8139185e48e62bfcbf8cb072ffddd49a1a59910f8c0a33d2654b87714dba9eb36f2e64bd37fc9f60bf226ca551a765f2ebf351b70c5cde24b221f0cf1f09a83e807dbdc95ccd0449f651f661ecd40f5c69a3787b45411233f1b5846806c578b3454f4cc53c5c0e49bcd8b021c4d5a91b79d7f0e22da48adfa196875b39f84a2f7182c382e846c637c54e6e0651863af0e378e27a5f5cdc6abcf811518ff9219e4959c143a42ec3897b27438a719f65541addba3916d35db01e114be753da33314b67875141a6f4c03b532228fea54b471c46f9a1900ce5a7eebf7287fd317de66a6a7590e84adea46abf5922a1fa27e5c1e7882b5696dbb457caabf0009bddbd6d6fadbe3d3a0469357b94028d1718420d589257bc830011749fc7bf58524da5c45b2d8c96097aa4afbb2da8c488c1543d8fa91a65decef7b6f01a122142a777b3db861409d8ec4f7c06190c40b3488b302bf529078dbf11193de163f7f1622a695666c10b1ea31aa3044c7e99c4d492d372f9a055d71b03a4f0cffd436ecb9482d3f0c6eae1d89fbbd218ad328d674d6bad52c2772217e3b57921e7523f27b14a995001ecb679b869e18b794581e6f0ace78a3be43bf513d024d54f404e3a47e5c698270300000000000000000000000090ae2254c998154a75ca2a23d0906bd51f1a10842311c6731552572763d0e678f3b0c77901de98c1aca2ba8331a36d7e29081b1d6db0130f013149e1f49a70bed56037adbc8fbf8638b8bf2a84c0e8f84ff1e3c93819e17507f00259d9641805000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003555f9517269fbb3611f2beee1f1f5b94a4242737a363ea116bbca0e46d323d2045c4af26d37923dd6a80a18b1f76f072477bed5d8a77f06b2652f9e743b07b0b2242390729fb0874714cb709d3a692139786c83118f321b5929b245666e0863a102979d581a5c5e8ef5838694c4db0c70735ff575f3dc81eaad130acd06564f02115753810b310b7b1725e4ca0519801d64d7119a8a6b12a1cc79077d1e5aa122031d3eac246bf0c5fd31996dd7b6d4a3a65ed7c19f54abab1865e4fa56508e8f370b021e17cfea34226542ffb24f46dfcad6c3964d5adcec1172f67f418429261bd3927b826a522a3c52fc6255a76321f98f1947d60ae38a059f5463a1a19f5d362e0221d3988dd326c0522eb116ea5340ad186de4290c544bcccc7138d1f78830934603007ae3000aab4f4a4d533783f265b94dd6202d8e561f23a02f3cbc946e8925ef0306ab4f73329e120e7851829805a648b9eb4c976c932954e3dae24792c0f767e503170db9d25faf703de6a29d8e17c0f09c54920888f040e6daced91b4ba4757745032c3d6c0458221b0639a6ba52b0f0b799154ae187950c04e6edf12920c09d697b62e719dfe0d6711b497ca031211bdae61e0f1ca53a4f1d15487a63314808b93175fd9a4d985927bb433130473b77530ee8ff1ae41bbc04f0361d85ffc6eeae76f7ecda3267ce16d7a4bc9a8cc42f03ef80b962ac606bac04d6a018dcf1d3e5ae640dedef9a5a3070c4020dda229839e378a810880f9c054d7346e6b677f9cb1a47fe929875bc5187d8c6181c86620bb07cd25e05d8de6df7088871b739cec58f7b266fdebe950dfc4dc7c7417efaa2c3f67be978d70fe1d9b862a8b97344c6cd2a7661be9dd9e27cb129cbbf7efca0bafe06ebaca20d46b5846db0bbe4b351985a4e3db8099aad20256e7491a381f95a49379d5b1805782e64c68aa48d04a58853b9e71e09f17e1c2dd0e6a7e4840bacf5b32e75da599f966fb8627a39fd49a2aeb28bd61a7c6a855e692b8c273ad120b03b9bd7b9b2faff2edba424eaae8d3e2537fa38b6ced6ec67fbef6d23f9f16547a3680b4d1b55379e52f33b534745dcaf26bfdac36d6768592e874c6a31684bb5b946018e3da52b91f928bd2927aeb203cdd6d6571dbd7ee3ce03b1f16bad3bdf16e77e9c8a47e4689c2fe3b8bfcab15975757a58d2395a17d8a2bf0c56b56b769d980a1fdee9c089bb8a856cb69395e9584087ad3264e87d1273f922230f0215579895c5870ec7fdd77b0037609afc90680338d99218739e9bcc408d63bd14271bad344a5e1d75316208fbd819f132f6eb7068a2840b68857c87b83471b2ce8c5735ce0dcc60e55035d5d3766dd651a07addb92a93434c6cb60b5bdee383f9f280f4f22f7a972beca3cae11d148a5668190144d814dbacde6f90d8d73ce2aca905eca71973215af04ce061913154f38d00bd9060f2ad02bebb197c47a0ebf25450e150df12479eabaf579d2b21ca1003d49465d1cd340438749a455835ff45b066cf8a7cae097bda97efae9b9ada06f9699296695b9b612f88fe9e91bfddbbe64b94553eb2bac079c6eaec064f8e81f230097984f0522ef9c16e8c4f61525af4f7f9453fa1457987b822b2a65d7ba4f618cad1297c2b7ecfcccfcdeb22b696fe8653dbf797c8907fc0c8298b8273461559956b4c1069d329066b98344b0ab42bd51687b5ee331068758581c9d1b1e5534b49fd68776688d62a7eaf53cdbcac5ade703cb7e4bf737e46f0f3c29bddb3c0ac9165c3d58ac5a7198b87c5721c07c040f4b3d3576da0ae18e1c2bead14a053cf5e21e699b18eed45509ac0dddf1e90810a6c8a68a0bfee5eae8ef7e7a49adad8a60fc6e848e8673d0b58b798f8a5d2c24fd7bae4f7a1863d292d15780407f80dd22a2347654479ae83727af9d46e7be1e717d0dc321dd2cf7c99c16847ef239f9776482e69a7bb8b52dd22e243122cd7cb94f72984d9eec0ac6e12504f51ac06b2bb933022d3bcd3d3433f3201b809c8008bf0d533b012e717d7a82dadd591ee1c5528241d28819cef4cd497d87e5a78195bdf9a5f15d45d8a5220fef8eccb498c1e8fe8f5eb925dc3524d6054a4a7ff118ea0743ab344a1d62d4455d67a6e05a100b3eb052c4719b078d77a78877a54399c10d1b6c23f5a22f46da12f82e6a49ede77415a75e804cc6d8dab78b0d7558d02731163a99a791be7628daec2936fd6f2617da25ee81d67f0c3fc6af63bef534749387bea18276dc3878cf028068145448438662026d52459881da86879373bae48702c2c7f257453f9455dfc4c3f2b93cc32cec77492dcb9a755ef9dccfc138d7dfbdd7720274d139b492c30412b37b661416d684d121042e016b40e1ffa7abc2c4b30e463f636423049f32ec2e24030d5f69610ffe90a28a8cd33679f09", "53", 0, 721362411, 0, "f1c8e9c31afe8b76df23cfaa622ca5047c70daa7151db1ca5f4b7ba173959f21"], + ["2eefed0b03836a2ea8838c901f0c319e0d0241b34ffc5525dfa023d5309014c3291b6e43070000000000ffffffff8ffe34001d582ea0ec5bb4579cc2c09adf7ee6568d64cf4bfcca6c7c64a1d85c0300000008636a5365ac6a6a531a18b974cc64a671c94fecd4d15a3442353b9251ca7199a135d5254d0d78e984f4f27f7f000000000653005165006aafff78d8043d4f6503000000000600005151005182efb0050000000003650065c97ce00100000000020000fc9301010000000002515200000000017882270100000000000000000000000003010fdbcded18dbff54f5fb7ff317c40c3c09436831fd6ad46c035a34d288f910b32c307c84edd346052ee9bafc2368e723b00dce6151384521ec659251023b42e4fa20f5ada1ad4fecde4494515a810819bdd8f59c5143fb06d7093136c31300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c01d93654c32186c21b5f0a87c93c263bbc958132e75b4ab630761fe0dda7b2049495c29bb85a006f166c7dba39bd69ad1d55cf9021a0f1a3b3eaeb4f088c0cd8d88bfa6488838c4dab662c7ba557838da5e74fc6c00bed111b066e2c0a8e6a7b6be4ef34084dc196930c21576d1763d64d194a9a61ba50b173a98e961d3144f020fab306b03b7039fa6630021018f1c0c7a07eca76698481477cdd9b8a772cf170229bc9e7da6f4ea8132b3bdaaee18563a2ad13c36f6bc6c1bb30db042bc27ed500b08178f20d82ee86bb55acbffa1a1212e23666fca870bf56ed08b5cf0b0fdb7428f0e06be0bf7fa3ec8209704a9dbef269fc5972ea4e38a7207cf8059a770c88c02182ccc2b6c10d3a341b00db37d36ae3c38e8cfe6ac56ce2ebfb37fffff5aaa1c030e41e298bc34295b0fa547eb907ecd460bb1836062cc455fe76dd9efc7ef550303069bfdddb8625ca0034a2cd26400dad326d73a222d3173e10fb72b62bbb15b2c031c28472cc8f49cd93f9725af37abf8876b9dc74e2bf97a5bc162d701944aa65602270ccc525eeb7e117a7b9a72f102ed92ddc7a3822f655a9f6566672cce5ed14512d60629f9e77b3fac4d0ab4491df178bec68fc3aca1d2374fd5ec765ceffb6ea97de44f0a8090f6ba85a9c57f84985ca23b97b6382594b4f3ed6f1437d2f860dafc7dd216ca5666df5e4154a0a9569c8274ea7dbc5b93abf8842d5a7af6aadec6144c74831060e43d9acb8b5eb851301f376d1c60fd1376c21cf2eba271cf6dd3a3eff3b7062b08ce48d3262a50a48357d08f3f49a426d5282590e854c49275f18d9f6f2701856b35310206e6d672e0a936fbc8ea2bfc970cea631012da801eea52c3c57f7aba6d53e2c5cf06eebdc0122f6d56e547031e26f021a2f3a1709dd930f7d12d4fcf4a5aa5247a042780f26460bf69fd440f052c63fb7318c6319d6e356389862e79cba99b8fedb924e25783a546e58bd9263352df3a96eef8f19e184049dbc7fcbbf16a01a3086a75d43105a5780b2a487874c9c5961c40aff33f5fca88a6cf9fc22e324eb9a682070493d40a97611f0b520525fe7532ad7fc5baff08b6d9cdaa04f7d5d8e76d20ad7ae865e6ff9ad8a24e0e82647525763d45f8af6859ec15e648647ed2b8b2dc0a1d443a66dff32a44d6e5b274a3ff3e0b690fa3e10f40b5ec2c54f1789306ae289bf7b75274df437b809dfbf8c19d45cdb816973d28bee02cf60d8618fc622f7f7b2721e80c1ee7b4048ba24a1ecb518c16484cbd4d1c96169df48172f761d8dd2b2bc90fdc7414eead944b82a59ec6d81b80270ba98fca33d6d3778b1bb77372412ce4e817007da0be73e3a26da69bf1f07061284cba8e2c944c39de88ff5c504982d452daf9768203c959648825049e1f0810ba6a40026f5f6c407f83326c4c9214c57ce24ecaa7ce41db8d82f19b4fab80e0a61956d60d64f7fd71f08538f0c827e2bedfaa49e53f2b559bd64f0b85c62a66332b57a342373c9408af6ec520cee003a71810c12ff311609beb9fee8825301247f5a37cb4b77036ee2f4a56800d869966db2258cd450ddccf3f777bf3028ff57f94391992c2231a5adeb1a61a0f74f2e8e364f7a0004eb25df2c7f79433fe928db0cce38d25ee1a6966d91b1d0d83f2fbaa57f2e8c2ed20715ca78c4ad0b5272dd1c73a91b2e8c381246a0c2293290e09b45005ed06f9a1f1981cfcad1ab6dcc06a64e2b92d4c7a18e4dd903e3411cc7893d170d9bfb476663dd571c3899ef950afeab950ad344d182d5fd83d7f0f5695ef24f0cd5ed2b339478b5789973e503800afa1cd8d4ca05207a39edceabc7dd1aaba24f9a415ed56ff89535254ae5d5b59009529388e08a3dcfa8294df4dd501a37d47768094b39bf8d61ac1fae118b167d7e040eff5a09360d517f90e957610c6ee85a49b8402f69e711d03a6f17a2fd732ef81f9a482f678d0c29334a1aa1d3f749ffac7f83f1288b93670bc16d58115670fd6d19ae63606240277e4c9fa8ddb205bf568b2274a9afada3650d8ecc91c042f29c675263ab7500a743d43b97012b2f902d079826830d3793c4222c0d659c0679d1402a72705bf2fbb35f006e52e84f70fadbaa9c6d7aeb74bc02f33fda26aaa3da1e5bbccf722457127e3137127d9d8f46abbac6aef6398504367e853d2f50ace8be97c8ed37b5b28b06b01df82f697eebf273e8efc869d513a39ed5079433c1b0b567330a11f078a3ba6d172a42724da7cd8242128970ec93fd64e17dd92a517ac1be0f4cf4a5fd2817e16a851108f0695b8b3e2c8cac3caf9fecc140398faa57d50170f1102d11d5b72e407593e070704c5f8032ce1ba86465fe1eec1589b47af1135ad631ea9bde990d2f304835fee9b505d549d85f2e5b5e9d508202c64a631b417968c01adba2726e006", "", 0, 1393646884, 1537743641, "caf48507bb96ddb779516057f8cc659fc464a1c02c6c3243fbcf278cd8df4b64"], + ["030000807082c403035e1b565f52ea61c962272fbd2f5dd6511d811d1b402d5ba563c6ed4a041fb99502000000026353ffffffff817a04ab0c3184151c0d7cf72d1cf19344a9411346ccbf7a13beda5c0b4f936100000000080000ac0052ac5265bcf28e8836739f194043b20e86342509988ed7b8f08eda53957e172bc08f10182aa068c4010000000653536a6a5263a3ae7aa3021a2d8000000000000151902f5705000000000700ac5152ac635300000000c5a93c4c010af6d400000000000000000000000000ae921f09bef61c44194e213a8cd56e4828774b9b0fbcd62c35e83e495f9936ffd77e92cf8f392b023132b72c1d966fc779987cef11d7d5a69b6c91d8d84da3061fc987eb55a75eb6598c7930af7b3254f1102138109726fd709b4bca8f67ffc5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009cb4cbbbcf702a73018ba9c9124cb96d36c8fcd9f9d122adbda9592756d4cf78bb498ec1c89b291a48544eb92acd2a3ab529046dd8a154fb8595cb485b5489e74d740e3ff77e919168d2a4debae102a034a15b2ae1fd6ef23c1981bcb0e805a7c4b05b519748e8360204286a9dd3da812cb60ad680cab24b8131b4279b9bf258032f3ce4bfeac6686b96019d4d929f7c7c43e0fa1aaf97fe30e10307f8a6372a05032d272982d8d70a10853cfb7f636f0d7dcfa0390bbc66ef363bf65758c852a70d0a06f21f30e0ef5c6a3b9bbb63995a0280ff1f7522061ab0aaf2659903331fb962f580feb5c3ac1784a6cf0d23f2a26ff82f6573464b63bcbb71100809d355b8ed03160217b92eeeeeb69e8a6a2a1c421b20f317c80db9cf7a24d8e77e305fa7fbff032d9fc64ea061d2b351d4bce411fb2009469f1490359cdd84e34c3042ea9a612f022a0f72e374a293b8d1ae410d32909b3daf2cc7b6d2808c1e7f6e50b17351118a031a16a90d6346838c4c9fd8840dd938f5d9da1e06df35434cfb9899968d010c8b0319238471a220062b9448c9649645d6d6a21972a71ca641b19da00d9688d48fd99532a2d3534fb6c33b542af10c60d7331da431ae5e40bd63589524fbe06e0317d98acf19e417a98ef92f172be9d88ca96a59341dccf4bf750ccc35ca6bbe9e43db3062bbec55174c59966d231f769ef850de60a1cf2c8d09034966ce2df575829140eabac5288dad05fe38623896701e98ad5f007dbad758afc156193260c8209a4b2fde3aa2eebca194e7a8c186cfb584be6f373dbbf3ad1adcd07d73e07d0019feb3627fd82e1afe4e5240750584e7ca38036b34671bd5f940d4ca535ab438d127ce38e78bb3adcc8703a31fdbcad5a5754cf784f267cc8762d70ddac699b363440bb681f496edeacace219ab0d7974860666dbc256db8b6b4772ec4bc83af572dcb755f9161c0afcbbf55e3e13f4a4ec35ee1ba24500818f0f1fffa4833bd3a3c7c3f5dfcfc55a66a812a422d37fa2191de579707c62ae9c414c79f0313c737bdeb215026e90796e71a9030aab1c91128a44839528ba40148e0c530bdac60dab3b4e179275978102fb7b436e877fc4230b5a14619a27dfe11663b7581668ea634bf156c5d1504f741b15447fb7cb420eec8c8ee6668475aed6e83783d67bfa28c1cdd07bf64d35c982fce558f6c60ead3fca48dbd938562051cbd39e0bb9a39ceed849a0be9d26a70e7f0c67215264a9034ab6f4d306fdced454b7b798842a89f5c54e3cadb17e74e18fa983a6aaec002ccaed6b4901c6770e999712f9ba1f9ff7e6f887113675253365cc584418a954bd64f830089f7673f343561fd0610c1581d25fe9dd59e00a0b3f603d3da3f2897a7cb3bbe5ce4d368e159197f100bab1e5bd40324f95f8f35dc2a92f18f42f61a4a74733f4a7e826b34b6aa4722d0560c77205ad7f606e59356ac230601d4ee8bee9a1f845fd9b423c0325b6d58d29ccd7f91e595350c8672228584031bd2e7fda9015a21ecd16a407f50be985644471b2bbd3df2085e490e8e17e3ae439ef085fe86015e4f1ee656688a52ebd3fc358c1038dc2f0733beec6afc5291dca70166766923fec88996b60b185775ed0e3989ebb89c963fb2a0c768fb27ca84c73252761451d14d868bdc7e58370ad8bbaf43b4cdc29243d8ec0214415974557b2f0c952f7af6a7f4a3fe182aa76a53a719961c39e88adc17169bda50904080b62fc0c4e384931f3c623e3d68fc6996272b6c37ac9c8e10ddb469fa24196ed9b3ce771327739ba16cdff98023f588bbbeeed905bd26a956085a49f007c942f147ab1850de90a5eaf7698abe2df1cb27cdaebe1945964d8c22f246a1ecb8e315a03f1d5ca65a5775f4340ca409e8034c98c2ffad79b8ed2e826b98f2d2765a8a3cd3f29021ab7276303f65f0b4de0de410683f9c69b40cedccb136f285dbd925e57a1c7920bb3f656fb070c59c3d66f6da862fa5d60107e132d77c9c3c086a9544640cfb7624bb0d09e2ac991be82be1da8547824ea3656c59e2a61592814927e357a35bb94743209befaaa5c28ab03937b2bf4db1f30707e137a12b9ce43483b654402389967b1e4d50796f2d09b510f36d12b9c81967969d591adf52ebda3d2a18fc3da6ca37484195cefb155c512f2b6d6b6f319ba0f3067194e725b3186e90c1b9e9f53a02c5a6ce30f20360ddee460dbf3fc7b654f987368c09fdcb0046fcdea5e7d8918d4e950d36684ef978717a5e6cd8e77d26b3e451f9717e9916bb14efd38d0264c3c4f60f5d255e150674b03ea8e719a0c4b5d16fad68487f3892f3e210a6115748330765bc63df0d7dddf5443c8e957c433002f76935402bdf89fc0bf78fded8a9dcac3fc7410dec94fa1ab840da6c0d14d0e9a9b303adaa64a5bef505", "655363525252516363", 2, -1885689224, 1537743641, "9158224395880878ac9efdd523e80b2b1c6dcd49067f2f75bc0afc9db5e283ca"], + ["030000807082c4030137531794a4758236d32b01765e3b5614a1490efc5a77129b2bc82d5ab8a2117301000000066a6300525265ffffffff01e470f50000000000030063653e04d4c40000000002277ab60500000000000000000000000015940f6e77a2cfd8bff3641556ec0c3c2ce61f0f948ddaf18ed38a6b53d7b0956ee47063b3710611029f4577c76c51b08bfb55f8163aa3a3b0c1e479861c22510c76cf3ffa43ed2a31a3fac510396928f099b1db4cb676542ea16c72c123178f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005557e124a21ff45f3e8a9586a7077172d91ed934978afd256afde920cb05097bf269a0edfda5d30304e6df9bb7fb5989cb24a9662a7ca991c245273631b2a01410a3f79543223fa3a50de8465fbb21017604c9271aa607c51e5be020de3118532bb3546b3fd5ccf6b7954cde81919b349f5999ff3993da63510ef468ccc3bca103075466784bf5d07801ed1c11e018ae44dae850453154cf5ccfb9173d325426c3030abe0513536bdb1fa815e57f1f5734832ba4529076b9410f5ce81c62982366810b04e3daefcfc56ced3bfd0c9081b43fefe020acdeb989675a731885e1a02466c3b47233211be4a508b4ba309cd85fca13f211f7bdb1b3bbd6b59d3589d40ca1550206b3ae98e9d00b8314020d234a929182ff03ef295505d23d7f0506da77748cb902122cd32050d86cea4ee729e54211c57a4da734c86f00b1f54e5c663f7ca15eb7030b463f68bdce98a2e6094acab324ac0196d5bfadb94337bdad71409e3e8377c203089c052af0f45b7978b7b485b49bc03cdf3ac2bbf30daf787c8c84719ee6cf0d0322e6fe448eab259d785dcc326117a9b4dba97a16f080691126406ea9d31301e348f6cf052b529d9b2e3344d5090815ce868143eab9d42c39b2f412bfdce186449d501bce01b26ddd11ee3eec1cd4b810f559413d48fc9c658d540e4e1513882b0083466dd0d45ec1a985d33aaf48aaa20467dc92cda4c07a6b6fecd908d61def3cc8d95b3854d266eb2568b5397d9e19103909796128c16215c14ce1c4ddac78c0f6bd6b600cde9436649ac5f6520c95161f1e751a45a279960aa41ab5789fae4f9a13592037d47571f1830ffd1580cd2e250d3b9313eb5ba750bcdbfca4f8d4d91f8217dd6652c877a6fee0885c8790ee29effd7d85a68f7efc06abd883e01973c4c3895d2cf99660788d6e3df3fc7bad45e241fb28ee8d370607aa71efc12e95291b98df66ad2277fa4a2f7abbab5493924085879325cc6328e68efcdd6a6ff89462004bf689863345d628cd00828d3f13c85f25c669fd4bf70b8cb0e9dde20d3e013bf53a74690ce83066b0940d940ea90f1bf1094dd6d11f4af213db5a8508fd1a9ab26d2c68c59064f00b7504b0fb847fdc3790a2ab20e3fe5cc448b095225e540ff04b45f70b7df11d521c93affc84b7b51c4cb5055bd181015663f2c250f1aa063afc2157585539009db856c83572b34bf9557af5bfda09810f4750a56075bcb13cdb8e48cf4baeb3414520af5dc7ff9301f1a91fb4b7192a151ba6b13e6dcf459b1e58e71bb0e7a93ca20293995e0129f921c00e3ade17de2d227be0737b64926541b303f8013a762852352f91be78e3502893966350336abf1ed89986065ad35f095ee6235beaefefe90efec1c614958920ebc57a26ad11ecaeb1fee1700ad4bfba62774fbbb846c9766115f15bd07c527ed70cd925350ac0c01500a41d5eded1fd35053c7e549d9249a757e24cb824e2887e703bd34f14713d0102ed5638d505d4bc4729b98844256d860232bc107f91268e5b8cee7a7ed5aadbce8f4a2d59e298c9fbd58525508bb656b49d91abd6be2a039d7e647256f70cf00569a64a22988ba83fe9616113a8633ec5aa887eef380d89d102d30be907509293a9378b80116ac816436df13732f713d60de81afd6275fc34d30593da4012fc99729daabc20e77559639da2d23f1874124f3154a1235b2378c82f3acb2f4b977a5dc23e2dbb321cc57916b2776e3a6abae1a242ee961bf7b99d04386809322d02863bd8acd3a75863eb942bd0b9084ecb9276999dd3133d882fa6f59d23f213ef203c52b055824f10e9897b2a209a5e5cf76e0541bde2c91b9bf72b30a711e2c1bd34762f8b103c875316df402af880d328dd7d31ffabcfe7f3f4e85d3c69f08bb96482f01a45e9b10f9964783434886224ea3e6a7bc4fe0b125455ea25751d8a7e5ea59a448a9e045230843962459afff94480df4ba0542c76cea9fad6e5514d7101823b4797ba63a6471d3773e7b14ca3586c8ddffcde6dca307735c010ed6cebc9a44253aec76f01390b8eb0c7d3f15d097257c0ee0c97b150cc19f675e2d005562128f202a3eb258ccb566319a656ed6076d44500dc0e9faed8fa402a6639963d14e5648cc8c27f697394f9971a027ccc702ff3ff182e1a5879fb727bc79fe7325e346fe1a78d39c0ae61e41bb4f907b39fce77cfe9d3ebaa6af1a089379513b9fa76d814e8ebb02aba9ebcd920d49e81caa5a7ab29424e91edfa07011272b06d3b87a8fe22c1038e086cfda29495a3a76049b403000000000000000000000000c6ec402e1af0f28928c1b281f9a80ddb974e537a0668e2ed20535fd5e0479787fac22445601bb77f172f99e048b9b7aa7825f5545607eddd3f8d044a588cd0bd52753b08d0e5fa44f2fb801e349d9693c68e7edef7c1228b539e3974334bd5f1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003188ec129839069adcd7d0c93bb2f0b2e744ba7a2475b06d9e57c7e11f8423a4742e6bccb371e99316fee46825b65541cec3773ce9c272dd9cda5115459ec472d46bf7c20ece6d6b052fe99f983024570461e3cac3caa3961515509f478b2c276b4118aee50407cf49b1c8f2ed0f805c45974238220c5a1f12a2ad4525f051b7031849668aa0599fac36a207f12d797358b49e7f71118549f7fa16d172ffef03bb0207f9c4c0c9941ecc4442629b0a2c136e58507ab9da526ed5714d6bb6124030a20b06fa63a54dc5f19a5d134fcaafd0bbd015a90c60f599682da8b5bc6d2591fb70aff368c05305333d4f570bb04c3ba8045dcde61d41551045b40b862fc31e62b203163ee31abe7e067a2a6dfa5c7f0022d5321546da7cf4398b9132b6c779cd7d640226bd0dfcca157013d7bc93ab464031b6790d0b058894eed2e688b9d14bc311a402110e367aa1f370bfc9a41891a62d5b0e9e8df62f7dbfc4f64efbb94aed47c53b031c13b665a6e03e5a43ff2f7ef56241897b4e0dd33e0369e87f1609546f91622a0229c39c89f9726350de8d7faa742258312d1b384ee0c5c512fcf99b0a0d31c168e265d9e183eb2eb57102fe6608dfa59af984ab713771a4d9bea6855542113fc336743cb12e1918a7e289890c794ca89e190ca34b5e795e03bbf4d8c4a1b1a1b197ded77a51a192561d5641d92f9d10b3918e6cfd9a9cb355d15413b6263344fa46a83674d865851e6d9823a95e07962f53407f71432b5126cbbb48f709bafb61a90d3bb2ec9c4f9473cc6e200609e350264bc2b5be35a2a0a156c644d768bc44bdcef74c9d38b61254b18ce952bfdcf0cf87b3788a204ba4ab71b1adee80a2700578a172df9957c27cd302dee3cf1bb6e2ac5139f2cd8411d791efd49c5ea5f4c941e507f3a15bef34818cdd4d9deeba4d7e9123d226c06845976fa70a26de4ff501aa57fea7f994731d84c69635b33e922e17c7eed8e34546080ada14305466fe26ba7d1290b954d07c6bdc8ce306cb213abec9d582fca106f6ccefab7ec661beec76e400c21859d49ea0ef7bdd6daffdb4132a53a727fd17f44161ea9899c339e28052d17635dd40194b8f111717ff241b038749e4c18826a6d83c8ab40d904b30aa2fab2405e8dac93e1d3a0824dff166f4f58a7573a2d1a7a99842c312f064b8876b1edcabe6832631b2345447a1b781e395f230ff6f27f20e47aa588488a71d346598900fdd7f2b2f4ea7a174c448bc76064c9d72cc6dc8606c90a452cc0203065e3e9ee6ad81adaa12f0a5d8f7251cc9b0eb79e4e813457a1f4bd7e2cc4ec1c0d781576b06cad402253907d8f93155db3937309fa25f1ec30fce13219fea82cd64dfd0f12ab4bfc6440b8fa5ce2d4e29a1c3912409a8eff91e5af935bb7d143708339ab5246b66db720aebae59b158c6ca5c5f58ff8e6fff895ca8aae1c5854e8fe733050a9470a1e8916dd6fa1584b5fbbda672bd78a548711f4399526f6a0e3567d323ed87605edf504faab20acae7232945728acc39eb728e10db3a1d43991258886e3522cbe110c96cab4f0ed40fa37bc97efb62269701e986d63a9d97cc8ef8d2138ecdda0ccef76b0776e0e35f89c026a7dfd6886d173cbcff0c8f88331d56b5e7294a73b2d81f531f1b9d76354b55b4fda7daf09b578ea8a9b663cb94fb68800b7988ac44bc079fd81fafab847ce14563fcf3c1e9e1db9abf9080875486b2dc6f6c3bfd630bdb130e4a4bce6f8522831b0795271a75ec22ee5730eeeaecda27102970210a84f70700fe74016e8ab8e74877b221be77f2506712570ff0e020249424e1e2225e4f237f5ab1e6e3a5b92d08218f7ce049ccbbb727b63e57ce83128a5db9cf720a33b893b1b3f32da804174d1d37fd9d989186845dbdd122a57bed4b835e668e7e436f114584e1ae44dd47b9cd2ec3deb0e81346f74362b6f2aae52604c834cb403483534fe6939e3d03733d71cef44fe6bedba3bea5919e2e4a0f06c145abd3540c7658a096bb126fb0fa33a4df04c448cb0174d9fa370d1755a877c0d64072a84bccd4de63948ed5c8a69783225769aaf6ff0c39309675ad4e7ef38fc68d9a24e3bff3adfc17437f6b02ccacb8092f03dc58f63229af39610f35134766eea4a0df297cc783a7b7a6da7d9e3c418f997624b6e2792085d4a8ad4045ead8748fe5f7a359f4b8614c5ed19f4790c8c6dfdfeae17248e880623f5ad08209831d35e35ea6525c914b87b27b17ab52edd4bb72fd38630cfac3834083f221f65cd09355b137f641f829ccda0b28507204078f16422b118522d06f2c996ca1aac829ebbc180995d1225c468291a32886e4aa8d3dc9f5e3372a49177bc7a0c135f286b08541fdf72f714278ef99cd6f5c1f3653a7f0b67c35450b4bc7025210b49b73ddc682b017ca4d06", "516a52ac65000051", 0, 2062222163, 0, "33c90c3af17f0a2d300e691538dad8ab43e78f6dbda49e813135195079d5bd30"], + ["e82c3a1b039116ec65a194083e7dd3247db99475625b3cca3be4dd470fbb95e066df8c8a7a0000000009ac006352ac51526552ffffffff4109faf0b57a29fde101c9501ae2a41b6f12376afe5e8e705f45c4b5075e11fd030000000600536a655265ffffffff35bb5e47851634493bd363522b3902622b379aaaeee500523f43fa4c57ec68cb0200000002656a0a7556b20371da01030000000009ac65656aacacac63527a2326010000000003525100850b280300000000065153ac0051530000000002000000000000000057b0db0500000000fe9261e629670cce94307db0b57f1bf11e320dd1227914d364863d9c0fb395825490730b435d4052ee5e525c973adfc6438b4bf9795bc39308efea68f56417e88dcac60536b3db4cb1f66b6cd067864aa359ab7824e42536e0e285a92d9bcb180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041c3e6188a9df61fdeb038ae890a74238d3fbda78cfbfa841305534ca1f564a9d96c6525fc5b91bddedf24dfa681cc27c2a91c391628b03d5ab8fdd50f614f8e724072055769a416b551a20c512b55a74f18baf92f6a3ead29b5674f605cbb909fe3e761776b6f4106e471648ad1d9b4f2b9a4fb152f726b480ed5543fdfba10022999a2b337680e6284bc9d70b31965852c73d1ecd360af1b39e51466bc86185303150754171aee9dded4e542cffadb2a279687fcadd528bfc9e55c270e1b0d6b580b07ad779a1815e90a3b0ae19603395f1a0aaf0f7c157ad9abd7481c0f59ce0b13e656ea80d3bcb04138d896ec3b49553bdd533e6c76876784c53f237f37dc51bb021950004e27b627b5d88ecedc6f160a89537e4fcf33e772e9905511fae50e4571031b7eaa74df9c6e0ced534e65a19075228dcbd05e8e2653ac57af7f070fd2380f0229976da7d38375cfad6bc3fc39265f0d4ceade3fa969d70f88f3b9f85cc128010221fb0b03e971f544b9a37ff3ecfd1ca0b6e06c0609912338e475a180a341d71c03198090be68d560d1824a3131a795098a3af2565ae8a8888d3e20b2aa93bfe7d77dafb709b4e84025606406e775c1c84740dddb11245be63fd7bacba2a83afdeb5ab0308f1ecc4a7844d602c847cbb7e2ab0f217b4301a45b1bbd5059d9d63d6b22a0d27f1146a6cd874f6d28073b826e3cfdd5f498e4f528a05ae04ace92101f3a439ec7ad5e915e1f57cce804e6223fad0cac99264bab297dfccb14905b1c91cdd6b7aec670f410862bfd0c2a632ffd8172a07b67b5199173a4a3c27d1864f4b27ac2b2b45fef541b1e002d85767e940057e06c8a8533a617f5999c0dbbaa6a2feaad56fa1fe6b65f08bc56e643085c79f3a9b2b7a69b5ad43a0ad5191f3e4a030a39541bbf986018d9352820bf57db1fdcbbe7ad2b66cf554ee23343668afb7ab597941f02014988992c797ccbcbbcfb5c752eb3e8cf2fe77f92df89bc457d66e47202002eebc50960cc9c45561bc83b9110b40b6c362f878c6a2de40103a6166ac493e1637a31a1f8bb2319eac0a2c7f0f8747f221c9c9646ff0a953c40f9cc20df7fe835fa8a685083ed610afe7e02457fdfd1982858b7c2abe670a6180e32505efe65c1632cff0fccfb2b734528dbccae8a044bff5555751c567853ab99aa7f8a62358602db1c6472fc0dc42b05140d44132594f934e16a7590bc05c0646ae93900b9bf0159f0cf64c966557f20a921cf396626e579f5b2783482aa74b5ab1b1d5ad54e00032c5a44e3e6d93ac399c409933793d5c29dd3ee478446412551a778f4452be191c3f9e67328a0a36780a63d3dbfb47e0bd57191437de2b72e55a5a7c3f6143b28f214103e9124803e7d4bdad9a625d9bcf4f9bf0d509dc64fcd2e334a0e0438d2c3baac88f90b8f457c91201a97c0c89b03962cfe9e0cde0026447ce82fb1fe8ed8d4db927c334994eea9755a6bd0db21b9e967a5d1b613b659cc51051f68a0dcbec443069da3ff101088f262e83e037b579cac6c8e9a5a86473d4d7816fe05f3114711c3c9bd1ff58251970f451089d06d2dc2571d7f7dbbb93fbfeef0fd8eb94c3259acb1db0eebfe95c86011fca39c1724c790bee115fff2a9df87a84ddc4c7c76cf16f30d102707e6bf33e6ce48659755d2f2d2ed9f27da559ff709d1cecc6ac83f6d3c0a8b252819bbb595c6122613b86de295719239d23d49edf76744be3380f6aed9ffcb7e4500b346b9f418f7ba5ec9a9ce69e0af12b29a15c50afb6ba356b2e5d7b68587832cb350e6169c0811860a8ef3ed3751162fcc13ebc34c53d4c41c619e7b0480b32f0cdf9f6fd3e44096e868358bdf0718c64e3cc3f7dd00aa5b988131396605a1ea743877b0331acb14ebf372f08c88eb66c4c5bcb325bc7c5256bc68210b457c3f4683ffc3e29696957814fcbb72654b6a37ae10eb271ec390a9f41ac0ab7ca8d47b80e692640b0173bca08cfbe0ffe4ebe347b5dc9a8c41505c85a0716d9492c5db3b05b862cbf9e4d467f02eea192706b0e39ef2fcec80f748fe4c71468799b0ce21eb40432401aa6c18be106d95e72e84ba7c580c7733ecc21c389be689b24ecda953f85dc86e313f4beeeb230b86a0111c59f077bdbce97fa820114b104b4f30d6120478dff775edbad1668d93cf0aec3d34b5e4c33c77cd8f08fef0ee9ec7d3de408e6a87cb2f6d52ada1934312b7dfc52de6a44fcb63bc050fe2f36bbff8c062f97c4b066e025ac2f9d2932cbafbe7af4fefdd271d12c61227d55ef62b8c13e94005000000000000000000000000dad1ce45f8b108120953f02070feb207d0f50d0b3b579fd8637c9035ea6582d31e857727b58f68261e0118e6dc74a9b536c12016cee45bc7ff08af8226950ecdf78a29488ba75ccddee62683b1be3827f454f7ecb993ab8c173cf833b2ffeef800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c90fde57ea52fbac06f71e6f2a432b60a96698b3d6d79eadb679125d3bae82baa3614d841477e8077d357b701857d08cbfeb05e70311facdf1a4eaf3be16573bbe4bfcef853152f87dedc605b981fc2ced2bcaf5c73622d9e283f158030e991cccf6e3cc21249de8d3c996027390c0509a111cbde3e1e510a86e62ac782be797020c8a0390d8b2a781aa5bcc847e068ff5219584d7fb71a1e44b785087f5b1985d030ac8804194eda4ee7b84622c3e45101da771be17dc0c38ce21afe0baccafb58d0b0827222ab903924549866168cab6716dfcf98469f688198b85f163a31ed4bf998040d48340b372867a1be8997b04dacd5c121a648663859cabf56943899d490a0310c4ddb05b12ccb9464b4bd1d26cf0b0dd0fd12a88d2794969d2a53c89e0d26b03071d59b976eb39939c261c87cd23370475b8c4cf1454b64af9d8e0d9653157a2022d882367f7a65f0f0ef0d6c4c21eaa39eb5cd59bee5a128302972cd736d4c49d022df3f8c6148017f790e1c3cabda119669d77a21bc3366e3b0f5861b6d071ca1a0201546b4af9a150dc24eebeaa80e048ca9cfab2fdb8b7dd1a9d1f7616a330fb2b8d49dea9dc573c4f02fa59e8a1af7c684b66ecd22b54a519bd85620506510c40ce36ec41e6a6b779fa6c1b790af1579f7b4a605d8c0399cb2c39a0e0d67d804b11baa7ab016bfd61a3b93227b74839338a23b1eab8deb387ebddad59284350674582b640ddeed91033c817b41c29b7173af487ac6e4f8265bef237ade22d5e90ff6179c1e5d4fed87dc7b752f06bd9d59e79ad830c1e33eb0c8933a4d3ccfed839e7e01e0baf5981bca0a6ca56774db0e4d699a5176440dc0f65cdb4f6abcc3676940a96a0ee02b3353850b234a65005972c10f2c528e5b6660d9ac4070f6b1d75d16a3ffec4d3ead68fa91c03c4ba577d56b63ad7251b4d2708da6a04f25476b93e338f9ff9e441a839651fc8d279283425cd4997c5cae5fa2a26f489323c73b606e556f82f5bf0fa68b2925204a7dd8ee29b0ad6fda0649ff9a3149c6bb9db186d3fcef69904cc555ae0fb41f885c67392bbbf7c8b74f5e47f5ff8be1b0b15c1fd124629d0f9755a7655b2ce149b3b657b0fa2644627df1ac39f9ddcc20bd2c67a5431952d94c2e02595f32a4b2cca5a6c24daf917a06407377b9213319984a9b2c3afc90f1508684e157c4be015a50f5ea08de46c605f4c685d6bd7e1dd470467461fa202d7f0b000024e2a315d30cd70d56199d7b8d7bda8efb66aaef17c74c74c177cf6cc486af829ea550863cfabe931eb9df996288f82115eab00772ecb1cab1d7fd042ffcabda10a21d18efb72569756727498576265e596fb95f38677f672d67d824ffd23707ef1455b07a0cdc3bf091cca3613b010d187693308b0b1d38fef4f7be2cdf4a2758a2a7d664e03e4fd7558502e2bf95d3632fe36aff8a777caeac70c695b0b3a04288956ec23d71958dd1d6eb5064ba432b73a1c5cba0acb50fe03c282673ff2362b00702047886c8078844e2708e30fb68be680d578ca5e1b3e79d8531d555a7086bed96e2e69c6892ce2ced1fec917545b511bc05e2b83e5063f1056aeb2b7f6dbc447837c76aa954e79e5cd7c3b813932697938a78b355f3f31f2c0604d46a4a3c4f7fa194d8d07e6e9c0827341f45172ae112eb10843628fb3347898f9712f1ec26b35245bbefa2f6d02a2faa98cb068ce3af06b3f4595e0b15c1e84f70df01a36e4d5ac01827d074144a4487cc24b377ed5cfa9a6c8d14d4b4ec4fbd7f573122a54f3a505e9c50acccc45ae72f8f0d2878ff44fba1736f907dd34a30da3fd69fb0a2fdfd4f427d07826583bc6cc12fb9971cef642f48f464f97d4a3c1e53428dc8fd2b7f07e3581c0720e1fb6d9694b23135c97189154674651ef81b6cd07ab8e94ed0104cae5edef7e8daa1d1d4e3c7c5f01b3c26b81c58c0d53bf566b4a8400b28018f1cbd1c8c79520d7d2f45efc5fadbf90fd6f755d0c7ff11bd8be9026dd5b3ceead75a7cc5eec7f053d71cae4f76608e24dec78287fb74da41405c45b6c76faeb86bc6df5b848749e4f7128993d6a69bd36e6f9fc24f36863a65f1ab67c2122c544f9b88af5387da8d7985c5f3f4ebde2da58da3b91be55233bb405e7e02f5ad2f00b088b1f103bdedcc6fc0284f599236488f7ba0d4cb4376eaf1fef4a8684d46dd0dd7d72137e5ce85d856bfe9f30c3b177e47afd63a1b3b99a2cf4b536d301bc85ff6d68da14d49f1ab218518f56ba6649068f635450637845a2dbd5f71b9e3d2726336f8b7f966b8fca7d5f7b009c03b654bbba19a493021466fed5272ace2010782d4189e5191d1bfa5e1cfef0268599170cc62380c6b0bcbedb4f567f1a3c3dd624043879adceee4ecf105ca863c167889d9d01eb62de0f8cbfa9330ffc9705", "535353", 0, 1923920036, 1537743641, "44f3699542d35bc5ada15d2e5cab2e2bc99a12ba2df9b91835ac2a779c0f7724"], + ["030000807082c40303b62004337ec977727cad8dd05982fbc3136f8bb772e76293fdd911c0a6a86da20200000008ac656563656363acffffffffac8840d379d6a9022dab282d7ba0ee12d3a7fb9501cca7527dc600356e506b5f01000000035151ac730088238d7fe2794e96497c2fa9ec310fc99c14d062d4192a8c9a225b49437742f48de4000000000553526a520041c76bea014d279401000000000552656353ac56403f99000000000127fe230300000000000000000000000084835773cfea8bbda714e3ec896d2453a0af9268937538d83aa51db49aff932cda60774e357fcc9443362ba66722d4b5fdbbabf697cf1a97228717e98ebccb87bb91105a69a36df7cad6d952af896886b99762e5941c0c97ca26d79d3522b31400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000267c332e2852c9535b64c063768e2378a9747bc2e74529616aa4b161a78134ee001c6fc4543176f5ecb5fb107e82491f16de00081d138bd01f942628191745e59f76c2135dbc01da632c081e82ec0b4a7f2ce04941a67a303704e60f4127aa6acd1ed1dd0cffec86a0307c3ca4d148c81ec6f6dde07de7ac20fa2720d17813cf0310c6a94294495db7c18dae792f1a4babf50b1b1be67d59b8cc43cfc51d14af98020a730b1f949db562699ff3e09ee6e3f6da61cafa8a2a9c7a51316ea99d2ff5c60a01573941c45ba750b36e93ac0acb00bbb48914d6e58a5f5a1f7fccde1695226a09e9143da234817810da656100a7a5ee95c1d88ddc6fbd689aae57ed6e321899020602a9cfc17d48f8e24c2ded891bd32f3000004ab3fc826ee3bf16826e7b5dc3020e8c03a797f893ac1ba252b51d4583ea5a711fea1b1cc285af52853954f94d1a02113a9e8aa063773ae285f0698186ae817d631439f1d8193012c7c8e743416b3f0201da8c41502d58d8b178b7446ea947af2e64d982381f2925ca2ba63a836f25d40314ef341ccedb8ca7140427b8402d49f059eefa77e8edebf2909a90d8ee6845aa18994aca9f7e522ec789fa1d0e60828af9db41ae21a099d12512dcd9beeaea3fc5930184bc8bcfaae6c74a5d8ccc684d258a53279c8a5ff1f5b9d9904502ef855ef493853e8ea45d214b418b04192adfc27afd74f2693dcd9bdc41604862a42701cf62b0af1939911c710b3800e43cb88a6f0c3f1ca974e898e98e4b135c4a111bed0a73324fe07dad4eb1b00b5f8bd26aff8331ab0ffd9dc9400d8763d4a39b4154fe1ed76e2d736505e90563df5d7b1c1d07b51b82f0cfc8ec159906405cf83bd2494f45d1ffbdc96da9f1ef7532b43bf837cf74eb6e6f677f45e8792cad0ad2c32c7358be5b44a4cdb63558e9372dd8e32d7d9a23f26447d0ede06f6a54f857bee7fbd751e92088b16fff38abb9db1a6ba63f44804b3da318361f1f69a3b701b737cd18c0dd5607895fd5da270f0fe06fe8fb56f637865bc270de7526aae3c14e3ba3190ff9218c2b4995db2243b39c35a5c43bad104030b6c7151cdd2bc4c8cb428c17317aad4155da5843f5fe7721321816b1877a5fa723d3e95c93b5e80d3e6c7de08049d2df98a41c9a322b90da934aec361eec25ef1e215fa5f781e6ad29d1cf13e036b61b2719f87ae7a84a375101617ae1dd8ab6b0a8ad4f27fe2272d372743c98870e6005c8117ab96880b80b27fc19ee5ddd9ae441f986d199a9a603320750972740eb9b4547a3591ae3a6b05be448fb44e3d85d27b77535ae9fae7b717f8b7a94270e766a38dac02350bf1d4a21cbbc4c60b477d643bdcdf3c24a96f59c089248db1765392d345b4648ebc57d0b05d94ba65731d0702315cab8c679e974cdb7ec03eacbe1fc84388cfc6346b5e57f90f6170153324f2b0aaf80085373a52c485600141ed0efba29453ee4c044994d44dd592549eb3f174563e9d1fbfa58142b9a9a484943c4ee46b2867e73956940a14f79f0d8c2d652a67a62bcae40a335f4a49fa125116bc3b052714bb55dbb9847a2eef8eadd10cfc5119eaf6ee5b31924a5e021feb63488eb61ada72a35c213b93c694efb83919972bc544ae9659513d581c491a4a49bd848aade675039de1ca7e90cc517b71ac2d657d1869510e303ffaa36fda2030595d51e1b82ab22dcd15f7187abaaf7a8015c5c209216a9e809739b82e6c06e04b24fe2995391000d39bb1ecdce811835bb89669b8c57927783c0ab890a9a3df67ad4350648a1406d7d3980f4b224b2d8ee945c90cf9f3e993c0ed0bff1db09a0fd82321f6bd12e87edad7733be8b36a483f242b464d0d9174f113c0b7e1e32fbb27de8f228448175585667cd6d72a1a64e1138ea3778cd7796bdb66ba15ff231608d18f8cbb24dd263ed5deac3a7424fb8b4455873372f6286ee4319a4a7cb58456b0ad254c09d9880bfcfafc85ed8686f4d0b47f1cf0a269006d98427c2aaccb6fe9d0d219d3c8a4c474bb0f9a530d7dad7e974fa939dd32b62197ff71c6ff799f486d40d3003981f5e33e4e70ed23ce40d2e4c988bea40c0bebc0952f1662a01c7b5bd658be4fbaa8657a235e234fb2999479fa6aca25b29b1b66a3f6db954d1f5cb044ae3011ed976c4a78d2514931db2f589f89f986dc638c91717bdaa8a73067b89e69365b4334e34446bb018e6573eedc92ee45efd2080e07caad725b77c08c89df5e02b200461cee7fea16eebd32fba4446e61c7f688b60648ef1c4604b5fe3afa8dd2bddd7b064ca02be85f0dc78dbd8353e0f29b4fc59099596247e79255dc09c378be5a8ab712d11d5a827b098f3646fdfef8bcfaabd6b2dfe9635af3f9c8ca902ec5fd35f82f761de93a3093b610369314f67a9a28e37c5f1296910e559828d08", "65", 2, 1313816017, 1537743641, "917b1f9203bac77029c96e285c14de7fbf8f310cb895e890a2115d8567a7a3d2"], + ["030000807082c403047c8463dbc3a1464f94f591d3c324f0b5c98d152df8500dc1d869c1e918d5e897030000000353ac6aa2062c684b9f2431dca1fd74914af2ece574b43fe8a07f81232507056c4242d0585c7aaa01000000055153006363ffffffff688b00f1894c9d8c51b04a9d87e26c237895a47b1000c12d778dde2ea78440ce0300000000ffffffffc18ca11c288d2bbba2510e523f00c57f244e74c39a18f4affc80d2556fe7196e0200000004526a52ac4e68a0a80490bf170300000000055152520000cf1de9040000000000d5cb8c04000000000500516353654743aa04000000000263ac000000000000000000", "53ac520052", 1, -1889739853, 0, "462cf222dd95ba662e04a53747e8d0d777796865b61e187f16a7f277bda4df04"], + ["6095bb16028be3fccaf776acd66a922dec096dc61ff9980fcf7a7adb8dbd2e99d25fe6e114030000000753acac6a510063ffffffffe729bbba2ac24d48431b9704016db9f19fba2b4240bb38449f1b1ff5108fba9b0000000000ffffffff01e6287e04000000000353ac6384b1468b03950f8f01000000000000000000000000bd042899e82b72207af69d74f921abc84b366af14bc2f61e360ffac311b883e553fc52f359d345413d22947a030e5993b336a96192e8366fcfdbf010ed2b963c7b06a4d68332ea51fe67d338c5fefee0c5bda3c799400b17296615bda78b359200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c85f07260e0e30cb7b99dd43f4983801d907c1b2f7f1c75c2004d375207df96d8fb76730771b189e5f5abcb63a4d0a82d17ebff7ac095ee78633e5bc978efb8a66a3147902f4f215e66f641e7ccd3c55d6dea6c3a0d376a87b28e598415d0035d653ca9780e7fc845fe5050352e44d065d586ed04e152b409f8bb2f80ca58b4202167df02dbf6f062a40c8640010dd8936c16509403faf4e7392735e8d169457c40306b4c5eb47fa9172f9e3610ef7eaa89ade1ac2fdb91b3a4cdb5f46f59fa7bc420b000259be126ccf2bd66fb28c50c0e2b6160bd0ffe79750baefe4e3989564b4ff6a57129a1328c244c69e31564580a641cadf7d2c01bf9141400a3843013de71802175f053d39ac890f412d2f3de06ebaa7a436e0054fa747991e49422f80dd3c860329ba039d66fb902907d0e2aa3f0089bc1fbb55f62d58432f9dd06a8e061b0fb903046a488a93db4e6a4ec72704804e41330ec19fadbbe31dc7172fd72c44bac8d7020a90d20236abca5161b4c3019261509eefb08932b732f6e4c0b8c94a28081d89030651e1995f8899943f7654605a41856a678925c8a572770808e4cfce2245b62047163cd8c4ef829cfcf9585631c03f4323b596f74ae97fe7a8f5fa27187e3200adb26e81d04ab4062a65cad01b9e438312d2fc5924bd2f57dcadadedca325f24cdfb92458c512739a0190433f5f5862c023e6e5c127ecca5629f65b4f66fcc63030163bd811c3a1555546642c1d362edc8350daf08edd2737c6cf88ca77e8898ca577381d2f1b57738b7b86fff04d0910b05aa6edb0f8f12be8965b0822137d41523227c7b0bcde6b641ce2fa0a75f03feb990d27ebc4ebb84b0cfb5eec6634c9d4f7e18a7d414aa37409b95547f1edb8e044219841e6f92b032439f85593a7a2a0c685111066613d8b1c996969fe72078beffaa0db56ee9e340df0ad98b3b8d722fc4711ff6bd620df13bc115a6608166b3a7a2b6edb17bc77d208606886034a70a8452b2c9dc072ad0ece817427955c472614a0c5c0ae3f1d91af4d43340aa38616a567d633359aa29ad6d04cc636c2970492446573532518879747eb01521e35bb5d81a3c5a6a6e62e67c751e552033fe8872e392ca6351a2306dd9894d1a560b06f01c41d51ed389e0bbc1bce12b1c45ac58853f1233df3b4dcb7c27a6a3176289e07203c99cfffbf4f1992ce73101285d984a73cda43876a73512d6bcb42dd25e66ee3fb83ec1d80e65ef5333710addda2163e70ed7dad4c7c29f1dcdd05f927e94b0bfeb445983748d2462e237aec71e9b4d30b3368ecc8c2196b08935d8e700868e998f6824313a472f9f066f66c939caf1b0fb5d579209f464399ad3af3abca8f70252e7e330690dc392bf55c3ff81bec7b9efcff7bf00dede2684fba913121deaee9679d786be2609de1c210e4dd55014c4e2de455ade318371ff7eb4ed20813465416fc8407b12928f3a1dd54edb3b19a47ea8c4075a334488381b55657761978563d5f2447b75d975bb31f265f7fd3f271e787d8c6d44e3a110f413cc70586a20dc6c75c33314cc7530d142728c92564195185f4da4b565b8008e18c8f778012ad54da56704bbcee9ff71aa41b744e6b662e321d55e3b40c35a06fc2279ae55d501d91663896be6ad6c859b10cb3111d6ec3f5ced1d61480b18061163d2f45677f4c108ccde8df90273e5b7d1300788e8fe09d03d725b7f85366983257e49a9682ddd75a50b3a4c681d6731a48a9697d2a9b694e2b945174a1c4485d84250399bedb94ff55af15500bafd16d683a02ddf6f5b0d8ac7cfcac4f1bada762dd99d28328e76f011d9383047e14f058bf1e3d4614e934ec9bb939788d2391db22c95e00a1d8fa3f259e50c02bbdef58745ef175491d1288a21dd87e6a248d035015ce41dc706cd41391c3d387e3a7ea86570994cb222477e8a90e9dc6b4603b7977f3a5e08bee7b3777798a0ad70b715372ce6aa8f6cbd7fb00360740e8a844ee9983601c6fc8b934c07858d63dda601a6b2ddef8473d39f3250f6c1d6490e834817b03834469c9dfddb1fadf82aed925487bf9df9181b9d4e83cd385c247bd0db6a343fdd61ce27b0294593df2a1378b402a29ff445f84eba888da81f401dbec023b4f38d0111ad696747ccadfed0e7a49fb172491af3026ee00e01de5e0d85d7053c78b16cb40fd859e8afb48e397fc0933eb0d4c8d718b082f3d49b95b401c7e94bda98fde5820e06aa6c2d9deb6297d9a1eadce3abfa76cb154961a6a9cd775e9f48ea3bd651538003c1e3bc230000000000000000e324f6020000000022f155c7c9611e9b58776c650180553ad004348e8b7d33aae5c3aa2345046a662259d9d7e9b6874ba50cf7333b72aaa1e2aff1f742211ea4ae8e03dc9c88ad8800562a4037d7337c9c1083977a817dddbfab281c569ffaca8b024efd46e4a374000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a1ebe9b1c40068b671420b33f2d9afc190d9719e0f6188b92163a855e18d3ea8cb7d3b0d688e69ea691177d0a6e158697718fcfdf98eba0ec9deccd15d7553cc4e8cad91f42fad09cdd36186262806c2de8176954508ce8da432deccad072faa1dd2e816c7f88f97244a7ac3e206e60a3736725e52f50eb1b84332a691a4e3603157c470f3f33463e51beb0f8790d5f277ddb9e14c7734de2590a7733641ee28e021ab8ea07e22126acf621da70f317f7437f6da2c672acdb5330c06206831557910a06e147899efb3341d99811d2bbbc061f6e95b574572aadd233374e42e25b8f2963e990e218633e96af1a31a3964516a973c10aaa086af8d59a96da2a4b0798060329ffd8ff4aabb2d563d23e53c72a1db06d73bb18210aef3460361e2b1bf868f4030403542a0be1f3e247cbe1357af3c413578773ea022fd6dffcfe407153e18458021883a271fa0d5a077f47771215ca898d022f11eb880cd6986e657ae8a1a15eac021e50af34c156d2d5a03b74a5cbaa360facd4549ebd733d97d9607c12be65d4c80313e92e4ced76c911f5b3a3503dd4714cb28c18cf053349c0a9318e4f6c31f70b8880883c7c9f972e99394c926d096598e8d319adea3ed0327bece4805f739562780c35293a19beb4b0a02dabd497260400b94e0fe6d41ebeb8a40d926844c14acae7bc390aada5400d8294e4d5c9d4d9f5a523e8f11ae2b5869bc9fbc50adf493210f7ff9eea1b502a65a2bc187bf136380ae7c83dd02720365dd7aaa910b182929cc0cf1615af3f165e8e7d6cb363da42f56b6a162b125d2d2fea5c9f62fcfb7002197f9ffb9646ffabf763a529efd80b2037ac9a6323b307dcdcf84657fd49900e6eef519f1942947e8602bb9f4280fd4cb6a7d279f012d57b03cd56e3b1f6a119deaecae1beeeabc17f55b9ef800f4f95fd226dada6f1d48f16dee4452daa4cfd0810d4cf7b44b0ffb6171c7c84e526d52b1663317bbf7f9e3a0c7c48df73bb11ca627204afc90f7a6ead177c7dc7aad248735716db7015065ae13b0dd7a75c63d21ca38fb9a88648588a65db15679fb31aea121df4dd1f14a07b443877584a79d4d6d7640bae2af788df88f99e7cc82e7a12d57ba6c1fbd4446985e2658adfcc2d84bdab724dcd8645ba483d9127066c71b03ab09ac03c4c0909bdd3836b569714fb9da6b479e1479116a5269111624263f1309ad0b0956aa3141627efcfae5e9a9c9923898374c001175d0529e98f3b90aa7d8e1eb4ec1e9d9498c63e4e64b27a8a9d046ba5e9451bd09e03defa5efffca67a88966a542ca2b5723612112bbd0402a99b399f405f625889b603bd86a67aacf344c3a53704922869d574def5ccc1535cb06a2d219184b8e4c3f5af0092ba3ca9184eae9b15383373da2b315e0e0367b4c2f6440f78c96ba7eaba110174e1482f10ec1bd08c05e4d95405957b61a179773d096170371b25b6c303635c46bfaac18ad0925002276f26ed632cba3791901b489f8c7e110fa4baf2ce313a472e2f90dcb2dcdf3e81b8e041dba74968fba6e58bba82ac5a20b5db191be6481097b5b2b8fafa3f013c4ca6882703f0fcc05ac4d5ca55903ed078a649618018c790d999cfa75cb67379f4cea73bcb72ea0cccaf1f8f34792eec73b52bba7d73ea7e215005f185822c788efafd801923554bc88b060637b9fcee3fe776a943f40c7586a9554fad074ab26ad90f67b1ab88f8d53b7d6ace4bffce53fffdf42f2934782d26f6fbe8d76b4da61ab4ba288281c54ac715c63562a8199fe2686b04f010129a4445e2a1a3cea3f0c3ae0033ad36d29dbcbd20764ece764ab1b2e9c6a43f540218d97b796da7bbab051316f9df33410a65f0f6535817c0de80851be7cf4af839805a07b89abae9cd82a8098a9ffa3049ca6164be36d7bffa64f96c14066bed4b36538f6083110e265d1510fdbee9f1a1d76c03c081a9a6a49cc21dfc452c3ee49b609f2225cfadadcfdb881496e35c5fbb144e7086657192512eab20300e1332dc1f53ae4e7d61373598cdbb831cf89ab7f679238d57b566b15a418099f684673c7e3eea5df9f74fbefc8bb9536b3a5e49e0699b5e2b25090f98badfb91df171a06167f62c372ba5f15cd59ea374d857f4a2a394bd7ab1253a2c034121afd5eb5caf92627a5f6610e0d7af5310c9051858284f668ba282ff06fb9a286eab910dcee1b30341ad398e4e4f95f1cbf2a0add04893b4502eddffb2118e60a62e520b193d1ea92280141d95d6ed0f4ae8b6f6084d942c87d2b364a51f16ee3a754b3c81020000000000000000000000003874a3516f272ffa7005202bdbdbd4520e77cb2db33b42a4ae2a5de21a2a7775f6eb3ac8dd643f336115f24bdb34f2b5af58cf0c8cba8d5760891274b38086825e811005b01d53466e28fab72752318a3da33b0f896c91eb9115a06f35a5b31300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ad0c7b985c54dd8b6e7c52c9b68ea88d2eb590e23f65b0b0fbd75943d382c57bbcb8e61d4ad2665846d7ab4be875c7c2983cefba77c3440cf6d2dfbbd6bba94d3094cce228f45c6d85354aae237861cfb46065efab0397904346112e4aedea07ce4e75e1fc80069557e30c0da066178c7d887f1f97870ce4c676cb1f671a1fc20212144fe9e0d97dc00436f5bbfe96c0e33fbc01f4198afa563072f013f967831303292acd7f79334481778bf3983739f2442b07cfcdbe6578a67a37e517c7639c950a0823141fcf36021ff127d90ea2e76bbb4a7aaeaa0c7e29cdb2108b8d62a57747f5d9e83abea248ebaf2ed8f361ceec1ec80b06cd0e92db3f68ecd1afd908ec3e030685361d446e8b5bd7f246f0c892499eebf560175be7d5eb4d2388d89a75da06022ee4281b256fd30a1820c114a97ceca0fd1250df7bea9da5df93ac313136a6fc0204143e3d5ffca2ba28075782a55765e617bac1e60951f8333c6f38e16d2b3283030cb1d86176ca43b915e43328694c8c62cf551394f1dd32f41d9016cc22c8c075020f77230b0041727105efe94d5f4dc133ae12e7492e787e642626015327b9cb48efda0ee60b72a2404e9fd1eae5cb7bcc8adec72c46229310ba7667237372c0839791ce98783b1da588adef5051ad4a57c4c0be8da1d4a397c343c6917427d1cf6cb57388886ab9183898d11a724a0cddc4e8857e3aff45387eb5bf7a5b354a4179ce7241a0922751a7b9fc867d8b463d89230a38d44fa60c4207c7cd808efdcb0a610272a9a4f91aeb8bb26051f54e013a1fdd5d20c71006260c8755997fab2f2f105cbcad72b49819de1cfca529eb78da3a60fb59ae90c5fb003db52724736edc79dc9d7ffc8424c95f6be61f308e84d0ae6570160b5e91bf5e632fc2163eee6d271177326db743f30a29d4e1038d0ddc22437b75c90fa99364efb1794b2ae24823ceaf5c674c66200179509e2ac76701b43ae185696fd5fbd4c94dff02f19337743c75c3ecad0b169a8c4bf040508d613baa04a55212122dd207361410017eacd18aaa1a74a01f6f7f3c9f935c927ac0fedee398aeb89a20f31bf24553014e7d0768f270058ced148a9d70b781354ce53e2d40d897b96d4102fb96ca6b6b6722c9040de2a6fe2094d9aae81c0668b5e912d8a44172d067f1227cdbf86d63893560bfe02f6285bdad7c9a16086b4ad113eadcb148587ac942bbded3ba5fbc8ce31719cdca1f04316360293a3d1f2ba0276e638573e3f6dc1200c2c7cce15e9a9702d743c0fd94fcbfac87e1f6702eff444a12773d8e308cc2d192bdf4e72a525adb1be27b540f3fd835073258b1b2615ba7ce6ae75626d58a4e2b44a39963975282cca42baa8079a164bc548e042cbe96e0a2f4abd2ae3a41b82da9e17ee38aff749aec3a8a2fbef2ab40323a4947a74c896cc16e84e7399bc09d315b85ccb4b4e4b6b79431823ba64bc927f83e7f9b389cbd2b5327efa280fd0560a091e0edeb2507ae8fb37e062c12275f4b68358c22b281146c5a6b9212220fc9a208803fe1f3131adda8cd7da840192e3b10c9586be82343977999a1fa1bf87c383c4476e35edc398765d4d5a08e349d51b513bd4247808459baa845823c2ba469e6de6c62f8c38f5598e9b86420e8de980bc4fc9b20770d61912b0591584b7fbe5917960a35e10c41ba536a28ca0d4f8fd250d6e62ad4a17641412e380a432666a91d6603bf65bcada900a8c591caa03077af5d511491090bd7b8640896a278a0703ad1a55c48fec9462a8f60a831658b1c77fdb5f6ea243f44de1be2a354175fbeb8ce8cc72a8ae35fb48feabee10f20c54f91f47ac814fe41788c113d1091e7e7388731a44219359256d33ffcbc54b9bdd5931f1b704756763496c237087166a77b4aa3617112dfa11c39c9efe0874f279bea433e064df89faaf3f2ad08ff319dc6d58ff09be2c2015b2cb17d6b0cddad0e90725507ea2542d83a6e6e65ffa6911527e65a6fecdbc8aa7e825ea6c9a9e6d1f5ca6d48416447b2c709c1df8850580d50b84ccad3c59d61b96a24b5de88e36af593cb8b08326265493c584ab850b9651e4b467a46c832c5a7650958ea2b9e1ca5475ec2103c92c5de3e62853c2f5cd4ee1c060523f5b2790098fe37990cc67341249faa94d7379ccdb2fc3f4fb43a113a00a8d062df62c837c465fcbe71ca250e39938680c841c4a7e761d92d480c6419422e7fcc90476f6a783bd58fa6532b9e28b3b9a0784a89342200ac16a3d9b38333e977429dbbab87a85955bf2139e6ba8f060a7881df7652fbc454fe369ac99dcb4959a5083c985017b905b3fe1fe127c347ee9c3c8dd2ff900561495a12b07f37a0018d900e767db1a9d45611cd14b797a09dea884d15c69ef01a7cb4ae0b74c1e085710c0fc4ceba5589d45c3539852603", "6a536a", 1, -1088114906, 0, "fc969b4d56646f2bd71341d0d762f9f157a751fcb364d881f69da91447d8ae84"], + ["030000807082c40304bec517e92e9fc0f8913e515a3848421800851ee377de405e09141a018294cebe0000000006526a6a000053ffffffffe7ead3cf63d8584d458e7ac762af336d32c04387450f1419b8488a9c551c2cf301000000025265ffffffff615703bdd78c9019e2a4ef38f00366e28283aec5f8035c45915ddd209acd112502000000016aa465bfa68e5b7a1557511e94a6c671534affb041c0d7a192ba9919e43b3c0c417d37684d010000000665655351526a7c5b1a3f044add7805000000000700520065ac52534b8f720200000000075200ac515251534adf64000000000000a5eba40400000000046353ac510000000000000000020000000000000000592da70100000000d4840c615069e147b7d38a2ddda50af05fa567a4259e23c25802526bd444dd429c51abce33f00dbb70dbeb4d891c03e0246aa76abc28cbb11eb935acdf3ceba42ba80918a4045913c05f7fecbeb0db3ee92d08523317f60e876926c4b9323f2d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e72b845f81683bd1071201adc9ab2852a74b8f9570fefe205068056d2d193fa0ced9f12e2efcf2bf81717bee25fb5d76eb420abe13f085e396bbcc3c69cd3da566d3f37204225016f53cbdf579aa2baf599ed7fec69444004a6fe5b2bec6b6da82210846c913094c2df2b6007a455c0f9f2d346a01a783b13c61d91ce36c2ba60215efe33c068537743832d089653c03bef5947f520868082b32c3bb6b8fbf9803032bf3a695e1398c0d8b109e3c245e20ddf538dde6696233cc879d1864eea778400a00036dd0d118e2a98177232f32a2bf6bf751b7fa74c7f5d8fa36517fe2dcb8850c3eefd96b026bc494910e57356795d0ea773e6d140c3d51484005f2d263de1403109ad5037691e7c24f393b348358c7b73e9543bf41ea15482e32abd244aa8211032b41d2716ab159b0c4999ac45d27939835f2b538f37bb35361bd936126df7da9032605b3fc79eaa29800c22972a9d3c8e766bb9ae36f44899c26b5cf204d576ee40322bf73ddd1f93936419d6ce60072dfee7e0a22da98f61054b1b3d782ea6435e30201969ca1b036492fce4f6bd74448270764e229ab609c1832183a6b2fa25b2fe2c678289640bd36a11431c78db16c73e649b5d9951a7e4c0a4ec4948b20e47e252e5f38028a4fdac553041750f96b7358d5d22d3bd0af1260c5682be7c927c2bd6a12c8cbe0b60da341641a3c4774be6f4e1ae554c1999502f5dfbda8f3b05d44616591a60f3e8d852b3e6d0e201238b657dd161eab93827147a48d2c2de832662f9b5c6e134ebd21d49755ff3ad383cbf1f7832c1783122cee7f19428384cf2a826db2216fbc034944d96013e529162aff6f250af5e976ba8410259e5767d1eb0ae06f883de416c42e8a379a5c2402e13530e3e79aba1903648b48c0c487376de15b11fce7265e3dc19855c6e4bc7e027a71583647d5ab2d18e704b9872195edeea4404a09c4a3e962accf1bc37b567d000ffeb538411902fbacabe86f3cac6db0301141c82cbe3413b45f39c33294968dc1e4e6c6b20446a020bd37489185510cf905fcbd25e8a74c48afcd02f1f242461a1d316048acbdc68c8aeaad72acb6fd8385eff25c2cd2a5d7ba80570880f8d2a03462ef9208002ca248913f19bf9e72ef75a331fc3675a2a28726841c16708c98c16b5c26d851e94843a8534e3ff361d657bb0e279081e4dc9ff12319a652b46b6e7c51b03bef18e1970c25faae68b3edca3e159aa80af830cc3839178a678f908e2ccb52074615dceeb12b87669ec7d787d40f0e762a8ea0e6d1c2c2bc0c437931fabfe6496e5a625fd19a0e7034f0d38069638819518eb643acaac0300c66611beb158fb92cc7391ea88a284ecaaa8e85d43710a4e3ceb1226371652d0b6836e2e0a3218fd6a9b6319bb4f4bce38b9ccb042cf1bf7167f18f39115925360e56923dc7ccda3216d65921bf77f1105b6ba974689612d8e4654bc04e1e3a1229481ca19b7bf542643d300737944daf8f0dc590d654d22f49e665d0bb2d45797550f0779d6d788f697f48c3995d69f5d3a8acb3aa3ee807db31f488f6263182ca57ea6283a44c72bbf9dfbe67cd42753f8f8361c25a4d3acdb78ad4c871f5f80ba66de66e7270cba8fdcacbbf122a0c940facd22a28252eece59c5c3077dc7e6587dc9ebd2eaee8d38d6b8921a7ba6c93772bd2ff43e02454ce72b2d3a290dd63222c954f7ffbe3cea90418f7683c74a1f6c3d0f24616771702d6deea02c6dfeb7fc52c1e9506c27de0a055ce92d810337071800bafcc6a48e3249f1ad8747aa735304b5700be748f955bad3b83d03835250a2868d28c47f262d27fc03f772211e1d3c1146b7161ff19435eb2a1685eb16f8caaeab124a9d05f875ea111721739f72b757efa7256194bbdcfccc4f8f339d990286d0accc618c333a0c1927c16eb83c0eaa08c410797561d59e16049cf84099530456c4ca1cd600405a325203d632613dacf5f9eea911a15965837ffefbdd8422516a6706b8e7116fd9f8f214d92e38fd30cc98a7fe60cbc94fa1f6591e6197becfcf05627e46fb967ff5fd67956c2966a86ac28d0ffcaa75781f5e3a9c555fb97f200c2b74f80689fdc4f49df43b5d26adce099c0768078612acc3624645aa42254dcd572da26edfa0b024f411d2c27a1812aa8200d83f1f888ec80acc916ef170de15ce9572aa9ed236dc921df841727dad579597ca370a41b72f5a6f73cf188a35eda0fc6740532326cc58f03faaf41bd5eb1f7963a08873282fdc9d0e420fda1cc21c1b35b5bc14ce70bf4f66900000000000000004f4d7102000000000e051c2def64b99ff35747daa63afd82a674d0bfc3c0b5c0f11f862b3ef1382ba283e0f28be55061fecd6ff56a2a7a6759ea2e28c3ab7f6e32b3eb87821ae63fb08948f6b15bd0aa16a2c0dbdb290b07a024a373f33753df9aa64cdba87ba5ea000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004aec3dbb30210a2b7074c66237808152890d8b44cfe0c3707e4f1c00481cd765c3fca3de5926ca36f77f6f208cf033ef867be2f3eb253914b3926100078b12f119b20a67a0e288dd468e2fa497be9cc793fa27fec17856f44c71cd6fecc38069743a95dac0ce65f257ba753c6bb254a3c28bf951fa3066cd4234e935862879d3020234e8c318f2ea44fc7d3d83470b548294ba27e6544fb5a6bbc163c55cf89fe00216fff9c32203ebed17fea9e7416a6f49ced296d0db3e83bbc518bfa9f1a9f6bc0a0915292843b53595c8ab0a840aad5dfab268d777822179f59ab9f28ce03f0071c50fa1e2d512cc2fa13ad5dbb496c64da5ccdb169e578ffc1febf1500af50302031407521d2ced04a6af5868e97b0a2cb39e3c230f8f65daa6578af39ac208d7ae0306b1a6452e69b89e4e2889bf7334398afec2713abdebc0340f772f170b4127bc021cee57a19d955427531bd3f565b585bd8613ab09c191a1d173d1c8f99db4dd5c030a95ed630d3a04fac8504a347abdc5b46905efb971fe731dfc33b62ad7ea4cba030fc19ce0a619eedd515a6f161b03d731ee69ef7d28b594b9a8c1e949b64da83ebca13d950c36d2a8b29354084a0bed6f6c9e5d6b978693aef4da159a0b484ed47a9e4459a12f125652fdd5fbc087abbdd5ed422f77ec2a54cb96ad9c4fcfcec6512f3463bfcc2e94580c2d5fb2bce137792cb433ce881d2b69e6b46da447602d32fc344af3d175f6dad60eccdec2d0fc2bccd8f3d226b1f986117e79140753f9089490ea82bdaaf289ffe4b3577eb2938cb22160d1091eacae77d0c3a6a2a088a969b590b2946caaf2c3e1d606638ec357e5160daf03673ebd72c5716745cdaa69736dc85b73c7eea4d8311c57101ad5c424e1052a21ea9b284498805c7ca926c108a6c52cf590d5683dd411defdc5bdd58400281a8a94906a7f2dbea0acbbd823a6f396d8d8b21ba00a2a2c48a067ed9919dc6f9b120ce7fdba95a11071e0264764ad373d7d2b1290f90779c44a4bf421cfc64472aee019258769b85b5d0ce48a684d5084d5e17f5bce4bb5e661dcdcd9819a8b5e8eb4e50265efa81514e4170a2eda50d06aadda9a01d4ca336de58b0184764ee6600ed194175df74434880c962244f07daa14ce274a8a3c47ce619a9fd0a7ea9ae49414b575bd660af794bec3e48978acaaa8772525809c635cd39a241c4ac42d7da12f1f78f0c0886f7cada98517d10af2da021cd7e6f46502a84f73aa40857ed076c3976e2e058fbc3fb555ece32624c5437d7c64b03dea678c2c7ae804f7c7af2020f3557d986643facb9856f2b2611bea22dc7ada1876af675257ae3d25f49fdd677de428e66756d4e3ea160d11fe3961fe250eeaef27c6dd80d254717580db328de3fbcf37984b1f6d8c83419bd6648e4b569960051b5e1d20f36b3184dbac753da7a22f1b1ee4657172a4991aa6e3aca8eb59290b36cef7b8c02f5ac43a8b10cbc9c84b99e740b2e34034ffb1534eef3760129a5ebd7a49f967579ccb3d0acc8256ae6c3e43fe5c7fc62344c0566707484a4aba3436d7b561008e87660d31d707331382ea110d3f120153af5db4856fffe967d9352a3ec9dc2329c1ce9a3541fef199f298a40752bbc17fdc092ab251ddec057031b057c977edb45f3af588421ee3d6f87d16af0741005ac37aec33e168608f8ebb90f029f86d7309592c095f39eaf1edab8cb870149ca01b5b11473b0422ef9beb769f58ab23ee96844e0fbbd007b0c6b81a62401cbbd1ac855280deabd6132d6a8bdc89f57fc11ed24c4a7b1878f8661eaa0802968b8fac7ef21c4ce810759dd744139f250c62802de072ed639a05bf94c0b7276bcbd955092a393b43bea67806275e8f9c7c7887c43e4bfe87ddaab140f5e7491cf811b87f9a1342a91febc609118aad280b36c5bf6711736a24ebf824ffae6ae8e9a803f35e87a70faa537cad3da1c57b137501b0928616f9d4b60405b813ff107824b36bdfcc3830078d750ca96874eecb925b34046ecd55ac6f7d9d0748b4b48ff97694130bb26b52d9e94cc7850803d5d633e2234585372b75011ba127907600a2d39300b611e2ba1354377b7cc1fadb2e0df61e13f4a243d0faa566dd17a37202eeb94b65c38af4cc3079fac63f5f0dddc0746b1ffd56d666fa65b51484f21af4820a2a6f018b5fda0ae47fd7b2ff9fcc7732bad3750992458c8d8b3eb42ee11178d6d77a5457cd219e10773d005cffbfa4ff9e62e2809e7fff4c3a4d08b1e8dbd2a845bb67ef82e54688ccafeb44d8de7a0d33dfcd44ccf2a8dff7a8b2c75c79670ff13ed094cbcd0166a3ec5288715b57070052e1edea958ecc09530ede6787cd5aaf8f3afc9b91ce16c5ae2f1b1e92636ebaf15c6bae173c30659f41979dd9409e96e8301f586431b0abdf606ad903", "", 2, -1576750550, 1537743641, "5358980c97ce38a14320ee83dd3d65f2c4488178fd20f0814cf2ed174bb63dbf"], + ["030000807082c40304128191a7654213580c73c88c22fd1f2e8c6389213359929f3fe7d82bf8cb46a00200000004526a5252ffffffff6df8108b9f84d17e71cba507e47631955dd38fbd9ed94b892967c3e65cc9727102000000040063ac529ccdffe998a35b0d32341223ff55722a3182a02aeed8511fdddc22d6907798913d89a6850000000000ffffffff95b3d50dc22735763edd7ba6624d2c2ee4ec107271a7b3f9e18eccd531f14e0b0100000009516a63ac00ac53006affffffff0265b2910100000000006351500200000000035353650000000000000000018f92800000000000000000000000000008583a8f8ce3b8eacb58a4c2aac7c5eeebecab4fca2507fdade81e26bd357bbbf131872401f929176e95d9d7fe79c0a0e928714bfdf32e93f8e41a742ea61c66e179bd36e0385465c3c46f04765f91704ec4a3e253c8643ef7a3c374a1a5476a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004f15d2ed7a71fb108f2f0740fe1ae07cfa0f94fd6aec43805427621775af41b608ab7c0d4bbdf2212739f3b7f9dab2a9a0e67584dba8e84bbf3aa658cdb06dedf16a9c456805bb52e79cb2167d974db9b1d7579694774aa9e706592b03d7ea3d0fab878c628e8ac7ec0c9201a6e10211797bab9adf80e99b2bffdd28c2a94e870325eeefc8934af8341db89ff0e745812f4533162176235be934a28844ef4ffe1d031b92ab4bda0bd5860bda3950bef065aa5719c4935a4d8c4537f91d9a39f07b440a037b6854e3c7f69dd33789f7e21968114bc8e4bcbb7dcf0a6b95647d20f5e0ed7c10f67624e30bf792eef2fa7138c7b397d84d6203feb8cd958d32689a605671031325ca231768f217c8cf8d9bdee6d4f3cbeeef08631def861b33c2abb72647270309b35423e5d561563c669720c92c897587c788c9f94d1e0bfe6c7db90cc710dc032b84ccb5ef852caed28c5665ba5422cb5e57400fd54fd86e8ea29244e2d323f4030a1b0ed9f9fb91343e352e9284acfab34eac8695af634748bf468af617880946032e1abbc5b1bd3ad7ab7a382df6ddd58b975939c4ed2c6da2e655b4f98664571ca56816cb272554045cbdafbfa6211017adefd75faf165d6a0aad75634697a5b4705692ff8964de17d69b761980c5b31a401109f3954b923b5828f941f030182fa4da1c0a548994a1cad1b951a5c9d6618e7675c37581361f31e748d6c01b3538802bbd516cf688e89d7861e9de431e99bfb6a92ab2285c019a889f37c4bc48f5d8fdfa9a1a46b59693a6e7a50bf8609232a539afec74be5373f46d04bbf7dc0e1c6b645814616f545efb2311d45bbff762c7d5643ee7b309f6f0eb327563ef7c6588ac2400cdd37e442751916cb1905258aa7f7952b5f660f81662b1e7b708bcd2728437a683caaf4fc54212495fcf168f86c4728ae34d52e291439c6b0a8f009ab19e2ce7c2c08f118c6ba6cbdce9ebf95e2fc4e5105e426fc5600838069e1600d4145561955e34405a8e5eed0dc8c1703137f3e4eda7289e79724686e4a7d4470ce63b9262a927e4f82b0cd0edd59001fe8de3490200284c508dbd917d19cc8d73a274057e77eeece1441fa41c599244b7680a8e18093e82e7d6f76f9efde5aa9d5e875a560d4dee3c8399cc9a13ab843c64c45e4e9e52e294a916fb7e9fef82506376684eb7b84f05e56f6680ee44b404dde5739a26ed7af2ac555e7f7f2e325e7777dfb1b74c60e3188d644746a4c6bb092799205a861697de06dce16e1a77cc85a8ce0df11e98e9500ca492a68449885ddc79d569dd449fd0113377e48574903336e3f6bed22178306d4b44e545104d056169bfbc8fa4f9a515a40fd843bb9257899d226ec2e7cf965e2486881a453d053fa3808a5a2bdf19b09fd3c9f26725dd331af2434ef30d4b4da7ed2a7f57d3cfda77933874db5c2a3d800532b72e537cc9394b9531e93587708711bc4ca649ca33629caf160efc6c2d5aede43d8a8601c57f44cfd473679f10ae41816fab6f3679cb6969badd002c0150ee15aadc48e4594b3372165d6d597efe0e994975b7e46f37beb00d99c59fd6bf7bbd2737ad8ecb62288bce018399ad91ac70f205a66147f072285dcd8d89714093edd970f37e6b071c936b39b443556b8871d5e450094dea3b58afa7ba5287c394cfb51f2d3c5923dc17e24ce793b17cd1917297a7328caf12f15ea189706bc1ee6de3df15984881481f0fe6c2666f53cfa199da179ac86bca9c1326e6cc2a0b04d7c90a850943fc15db1ba997242f188383c37d5ade7e6a59be42a412d7bc139cbbc93895ec2be502cc037294fdda537de78b61e84562a107d12faddb86940dc768067cced6875ad3dfb4bc8f9fee4f532bd96ae8aee1b13ae4c1db65a0e7c5251c124c908d26a9378c5aa4d4bc8027f2a58c35c88d4e43d7123257f1b7da46fff298e9f37fa202c7ad99614053ac41263314f6360b1171187fb807c9fd1c04c92ab464e8e031a9f7df4461e32fd7beeb8d9e6df93fdfd5d04a7bf52957c7cbb47ace798edcc6e1ed893fea2e5b322bee5b36eab108b35dc5bf05be80ebbb281de3420b60807020a0e4980471780e3c518a408680826f5e79f1b3ed0e9feb85d146527938f4115d11de98896625aca0cd8a180bcc8b63ec3e9d09c8b2a41dc69b7ba9120ca75ff5c1a45c91c91416f3e43268ed3702410f28eac27272e915babf004a9d44c715e881d9b76156bcc26c72ee2500cd01305e143783aefbd38d838abaa5f2ba6a09b1ad2c293345cf4b28b709c4fccf83bc824b76088e6d12415822f040cf1c3fe7ebaff9c9642e4800d2f57ef700c402fbe79c3af8f461fe8a3b215ee994b1fb8f0f79ac66316ee2c739c01fd05444f76fdf115e620c46a44dcbcf5700070ff80f15be329e92bf83507d9181ba4605", "53", 1, -1520838297, 1537743641, "63a8581730e981fd4e1143d1e46a6ef85cf729a33c086a8264823bafafe152d3"], + ["2b56864504c04a48b38211aab00cc198f99be44965cbd1594321bbac610c621887a65cb84c000000000163ffffffff6a1060eaa807eb73d6df7a86724b13b16b8c23dad84cb3188c32d9fedfcc3ce00200000009ac6563656a510065acbb4cf7ac20ab19f78ecef3837daf7a92386982d413779b609fcc296f5bcfb53c86c08c5d00000000096a63655163acac6300ffffffff676cbaee7d33ffb5f72c82fdefa42fd9dcbabedbd3c44d789696fe2de2145bef02000000004a153d30012ffd2b05000000000952ac53006a5363ac6adc8037a3010000000000000000562a44000000000055aad333d17781a91ef369bfae97614ca4b7c542562c79b793da9953e3f1d1cc59da6e7b9193a87b3f07786993f451471db5a49755a3a9f98a556f5c4b9787347814e720fe646128e5a17fb6b50a1ce6248231306d4026feb1a301c16c601a0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d5062715c5ffce1ec42ebf81528c5723fe2d1330f31ff2f640575dc514c5c6f796f700f49cb54e73039144a47a8fa940366fba1dc3b610588afdc65ddac2d86841d5747607a666130621b8227949112d47bff166002641fc58bac91b2156838e0d69041be1fc705371c994caee6cf9357d28abbe89152bc4241cb0f135b309702259a1ca5111c42309f127604346a682b67ab84b322652b87c2e571f93ac9229d032651f170fae581d535c44b793fbd53e14d06f66c358ac1fcffd90ad7f746b4820b08a10c16889347ec8f5f5274f18cca3ad273f7701e511d3759b659db9312e0e2c13ce0875a29d83bc05a18fe212bd6c0b86a4d2506ba71c35f8bcaae10444b6c021ccd926f452b10709b9e76675e4d8070472328a4c3ea3e1f72788a90328c2f11022d422a529c3c77365a10422b1a5f86832737fb9c0bf3e7695162e9ce2be9dd60021989a732ff22957b4bc08a9e895a600e014c2678456ad724bc60901f6dff771b03010d7f2cdfe00a3d3680a950f68bd4449efe90766afae7ae4e07167ede9a64bb0220219c12ff75da3cb5e51f28379ab904fb51f078b27fd1525670d8a593fb91e77355f51c14e485e4e5fc9da3f1569d65120300cbc1fa47ad2dbee48356a473941c56fb4dbc929b08989df2ef4ce5d85e0731df4e47180ad3735c66b30387f65266f91f982c33d052d05e9b70b475258c53f9d06c3784adcdeb3a3aa2c1a926c19ba25731a24c7e220d018241ee9fd7963f1f4a4cad231da4ad43d23de19dc299fabc71f86d2d385e1eb73f1d6ad9faf2c89739c83e6aa8d660e486a632a286a5adb63b63c54a5a4ff9c63397d11aaaf32ca265c4d373fe1fa7cc8ad49e67b2948b4ec6c398756d556fd23d24c6082134d8d7cc994fef6282d3f0ab04bffbb85344feb6f29ae0ab666d987ae5c9c99ed181cb79d9fd285c6a66bb3fdf2df48fd98ed15cfb07103349f56592bc53e90bce096b8cc28f81d1cd610ed0fb55c1f5a18074a14019f3c02d44e0ff833d4f5cd56437bab336a5465c34e9ca35f3ffb6e3ecd8c9cd6740261fbbb53b8db3678e72c261db6f34d16b9ea418cf547f02b1d6ee3339796fa573234434ed8d95c5a88e449c58b03f940647c7accd8c6982d41a1cae6515f145c494f4786d2935e32f376f79126a1c51f2c33b1667335c73231fe401ac9d725b00ca7c19fc1d969e5f1e92793e2f198323bc32ff06a9662472c6422aab8b6c19d55a2116bca579771c59f8cdc01f10639a9175f212b6db864814924933966d7d77c45acb7910348c6ab2e650c144a1cbbdec1432c55213121370907014c0651e2061bd16c00c85e7b0efcd70b0d42666314431b1a0e3a73b37ed6bdd32112821a2452ee1ad6be58cf4682f69095804c8e109897eba551ca8b1127caf40b944ef69b08461b20105a6006da08a6f3d783deda9f0fe3bbf7c64991eaa8e7a77a5dfd32358a06431ecff0a498b55abd4cb65fd974047ced9ee529bca2a9b8b7fcfe4330e5a864af3a80632d7b3f442cd5c5362ed7038c88a9e2bc784530b930d2bb5f06c2249f46460a9156c57cc00098891986851b7bf136d218b6eb1c72a48c1aa98c09bc9a1008aae06f893794ca7b684671fd3ce447dd82da16defb3f352f783eb8358e8d7b08300a44d15d434620201cb7bfb7e90bedb0a7191050bb4e456dff1fac667466ff7aeb55a071919b466478f902299bb51193b0631719bed369e83f73d7fd3d63634aedb72dd4ccd207f241c0a9773a2641b8e5086c861800bf3162c7cc4b111f2ff359ff76f97b3dbf3765865e466715f3389a161a7705df54c22011144152c413f2b6c9be314bf85e64f6176ce0a496e73c914a7f20ca7f460d7f654919b1eb34b98a1eb56ad73ea576821f3c79172cde18b0ea61eace680e3ffb240cad6b1e63ee9d7da954137fe4cade5fe7cbee1cb5b2e8f6d018ab224571d21ebefaae9fbd167d9e8477be8edad4ae22820303dbac06de359d0cd2864efcc770be567936b2d59333fa7a86e714bdb0c10564a3e3c39b0b7dc9f13968216c12a4e513d859b0568f1e0b2b5e7718efb98d0f3857ac12d20a27e13554881f64e8ec762196324f7b39bb3c79d226d06dad004f24ee081c723ed1b79e0efb56dbbb71eb6e7e312643f65c79d6305cab57b9a200cda092e88e592b864c809c4978e2bbd2b180a57fbc8f107ff16725a76b1fd7eb025b50179b1bb7313afa0ee6b6f52c5f8b31c715d904239ca3031c85d16613c9524bdbcdc0d69ae9dff6f0d7aa7f2d60b2a85190a7b764ca50132571f643dd5c7ead26d39f524aa65b114e6cb6d4117764c8e106f1756623e3107d69958077425a9dab1dc72189714184b659a7b2d7eb314e4e0e7423db4995dd8b2bbfcd2eae1f0cdda6b798e7e59f6ae9a31d879c8d100340ad937434b3603", "5352ac516a", 3, 1584858262, 1537743641, "8d8698185987c70c85e8763288bc8c30e82fbeb112f52844f4490ae379eca38e"], + ["030000807082c403027eb28d3c058855bc67d274006ebf0dd23b7df504fb7b7440668dc7d2b5f531d70000000004ac655200e981bf82e31c67ce88aaa1439077ea24cec655e56a75db8b0da8af695a7baa9b7e7f4cc303000000036a6a6af222ff43038ab93b040000000008006a5365ac5353ac120215050000000006516a0000ac00286a50030000000004ac6a526500000000870d080401000000000000000015af0503000000004785289c23c0159884229298c2721b454ea3d7ad708da9944e3f308b8e24021f603e8066ce1c395a18cd6e415364ce85e7f86bf23d4bb9f40fb2d0ad01a4757d98f1e9702def2eae12cd67372c71cf238541335853acb22d8d83b8a8e1ddb3380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000053fdeac4c3228caa0aa2d97ae7aa21484c4c9c5f44113de9d9673b816201b06084b650909bafa8753b5df2b082979155e2c1100b87aec13d372925b60a67bd029149c327f8de4c5cc245e8dce28d08a1c38fe252b8047f19b8d3b7e0c3af7fca4cb0addbc2d9a97d5246b742f148e504ca1635ad27ad08c1dfe9a33c872a21a8030a374f590e064fdc6b2d406b269f72c0bc496412ae2c9ef9caab1bbac935285a020f1859a2e9986c06d34d213dc35488e030e1ee7d84e28cf1dc4874189ae985350a01172f653c32c738ff93abfdccacc12de23debe99e73721d52421c686fe6f1a7a983f086e97d22b1c0e03a93a1334083eb9b4bb581c0fb545e2c6a5a98991b0c03289736d6516e282dd5ddaf3b8d23cbfb01ce617bac93ce53316b3fddb1b61bcc022e81eaf2117ddef3625ed47a7621aa42da95a36c91f4240be50971a8f7b97ac8032fc0f6a4e2836b6d1b472a5bfdfafd5cb588ffb2fa26afda9253f4e65c7a859c03091ad5b15c546d70cddea9e443608b382010737556eaa3674b645b085e8b18790312b73b195725c1abd75d1a5195d8c39f46baa61042df85ac5c1acc084abf8bbe243f77163518ff4c69ca1bb0751d7473fff03443076fbcf156f36aa77e1a505b2f2b5d6e1b8c35f25a168a9234e5203e36860aeb4b982b941bec5322294eb6a3151ffcf12d8e132f15fcac1613f822925ac3da7fa1c07c8b735b1323ffbe71556e0ac73a67089233a63a84b4fd3c4a5a1bb2e35571c4a641d251d31a6ffd3188b275f88bce0391d17038486af43e4e809087bf916d50c483d2c162990a9b3308ae31353d98310b9416b5ea9d95cbd7623ff17c7ada0c7534cea7d181aa45fcc3e86e997932b6858e2458560fbcd34b07d2ebe7c288f9755166b159baced86cf7e0e5b85f7100e997b6c4458947bb41db3c621a05a13f0be6eadba1b471763989f03c08a87a60a94b12db4c5c39137865647a7be95d7c61f02099f7774dc7c6de49885c1bd6fc83f9d854440e5ed466ba985cfcd32a49b54e5acbbfeba1141dc9477e33c963d733cfa64699253d4d36de94cc885a5bbb9e294da18be349514ea70c665090bf2689b19184fab65d6b4e789cbe3d03e3646ce27a24af8ecd24e316051780077c53ff1ab4702aef9cd400ba041bd3d46c0a10d2be816295e62fed2483e0dbc0bcf5f000bcb62a79614aa3e3d145ce2103c5e4b6a3c1c650482005650d6c3edc3ff8ee684b7d350bd46fa120490080c6906950d7e903957d6ead971dfe3b784d79b06b9d13f5c1a62a8e2a775b82e19a4477aefbb7e1fb6b9769816f22f287d7f5937362cf77cfb9755efd197e079f4b741a7e1aac4f9cb1e1d6b865901de5bbcb530776d80376afc079b8a652fa93e6eb8963e10d6c63977e087477338b5336b6662f17502eb0f6a96aa05b382cf1da20d5e76a1ffe16dbd09aadc79b1a4e60df3d50d0b0cf1c6a0e83be0f5353d7d1c57eeed076e4d7d3752f69fe37bd0fdcbb748524f8ab90bed22770768eff7650ce7d4ee2c42c3542818c6c17c5bccd51a2e29c94bdf1b530e0d222c57f134c5fc2f27963d087df6c46c8f897685c01e2d06ccbf1d7457e9b89e7a8e4f8e384d9d53468f84a6a245fa8181b3cfd302b585ac7fbe5762e17e73f6db9896299072ce99721d551422f53eb5b35dbbc0f611e8dc1c12a17bccd6e223dac9271195bddfd4d6ec0c96584eb7d0feb831f0c8e936b92943a71e47795c099dd002bf3b5784b521f085d951c83c0242695ebed3f68ca857712f8dad1cfe0edc51b241306ceaaa84a434e7269d2f9933a77bf69078887b4c66633d1e6794c248c43a091023d92d4ee6f5e803e42ace4052584feb7e98be04944683cf40fbd55030663e51b0865172e17eb6d3486bbbd8161d41f5346d51b163aaa064b06a88ea8d2600152c8a20f1199e5903cd8c1d60afec0a20592e2bfc43cefdad511a313ba7fb4aff2c88bdf184c4f15e96e8c5fa0cb590f216c9b4d925bf40b3103040992c80855d71f3fb5b28bd315e7524c1451646a487b4e52807f310b2360205840841e8a0176395e08f898c74c44a9c79121c98122c7e0c8b930bf3ae50228592356220a6c5f0f66368bb7d6230a8136f273f8bb41ddcf0bf86af59e091d10a2fea158ae6ea2dca4eb2b605b3ce0fd5db5bdf1e7032f60e68fed531db53e5260e8ca67ed83f88599945aa30ad079e30a14f94b55dae18d6db0aa3fb9192c0d30ee04897976cec604a78ea6ef0e4712acc740a15dc2bece4403746ea0255e90c690ba60453588b5cd57e658d3daa3a92c5f0fddb50f4c252cff05b6d896cb12d076cddd36c1bdd5199e07563fd97d2fddbd5ec0eb81d1419e328802e9eb6130ed93b360e5c5258f0f21f534b860b7b2ba076bd6d1eee389f611425dc63cf3cecc5e61a54603", "636a655163", 1, -876018883, 0, "bd288970466e141c059a9674ca794e53cdaddf8752c5493e54c48c376bb01fd2"], + ["030000807082c403010e01ad241abbd99d89f0e7d714b1519a1c8f7355f7abe4c71f4065da1a11f64001000000036351acffffffff0362bd24030000000000524b91030000000004515353529dbe530500000000000ddd5bf50000000001990cc60500000000000000000000000099dc0bf0642e2eba96890f74fc411eaf33e95ae4205c501ac0116dbde44af8630703b67b6677c640eb7f2291904878614d737ef15b8684ec29581e0f67bc79edc64c63fcfc5e9e13d10233c98bff60e0afa13a70f92dded9c6d401746a5757220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aca20c090062d3e67e8d6e5d76727ee04dc2437727f3841b8c0e78b28e48d6776f152265751dc84ae1d679d1279fe3e7284be00d0884dde294d1f7fafc96ab989e4fb406b95097a93fd1c65bac193029e5131c7e39481a681822c0aed909629abd1362b2b49f308da4ad02ecaca2b826238ff594d2580307d3e111d267de56022c19cc2f475f5cb9580f09963e50b4f76cd60df071a88641a451aef6547619b3032d56770c0d509f48bbf525e2e790a8410695e10575ec29b434a8be4caa1938fa0b02d815ebd9b05c5ffc3e91d2b9b51fadf4688c6380dc6a8fc793baf931404b6aa689d7153d85a96b0bbd7e10c2d871e74e4470c1942a9eb63a9abde1952cb9a3030cf7bf7cd366d12792265e7ffab2aa222b822e105e3d185f74701deaaa3a2393021c4839b8e86bee540c80d5e6a4c4945d97a74cfb28ce826383ce2a08ff79861102228627aba0065e62f25972c9af5dcc9847c9998ae4a058b2c5aedeed5174714803094c409c96c2419568375e90e8caaade808edf77e100373e1b009e3a1df94ae50314772c4fcaa179a9ae171dfa4a871fa81ff6321552ba5447f9c3b195fd19fa9f91fd8a504987ceeadc89f24d9e258e317995951c90e7450e2f38074a7ba3ddedea25b917cff05d4dab24d0ac12c2b3133886c4f24f3e304372dce435c484f5a4cb34fd5325a1f8c5b9383b202fa98fc44ab8f43a18f3deccc82846fed7337fe9daa00047b234108e8f49cc1cd6305aa9ca1459734ece782e8f020761d37230fc1423c54614d4133e721cc320f3cde515bb92f018869f177848680bc1e9b781b33b5b1f040501a03305ca558dc8ac675fadbb1f9925e0d97731ab2a5a7607562c6efb1f257a2cd504d51c5ec69fb819fcae0b706918d94c8b5f8520ff71cac4f73cd099b99ea815e64647bfeb1f88a5c2c2e4c63b651c0b121398a6feb579ca3ae61be8c507babc1f5af2c2fd162f8b79a9e946281b41747558efbeb087cc533db2594f6b390e0bff8189b283997066a02bbfcc64903566d1d7c659d200830356dc0eb279476487a127673a39691b99f7dba766c31b7b74fd41fd4e998648463ca84073393ca7aa737a6066ea30fb1adfed6fd69527cd43cefbdbd4fb4bae863428366d9cc5de534ca3e7f1fa790b54cd96084b4e515aeefc50aa3ffa90f0aadcd728e35c335e07289c12539e62ef385ae87a48a8a39ab9578ca615cb562a3fa3ed7f288d967ba1a5755010f1f1dbd9570623b3bc7a8f816f553c4398b3a2c205b0d2bb0802aa5307082a222fff2a8a568b92b16da0b4ce376cd8bf116172448751110b3bc900fd77b528eec6160b90bc508bc0f358c70b8dbde6656a24692e58a8b1a2cfb14c9a6d25cecf031e81422cc620990d080fce5b2e964ca91a80b57d5a57f3e511e00931779259b10f9a39393e826f22452c6b214dfc480f6101240c543eba5e0be6eefff9767faf7f6d6a6fcf861762b718a630bc1c2a413ddf8aab66c538bf21aa1e040ae704a61b9f247e6dece2123e00aeb57d6c0b8e1359db7c3c2c445adc0c16cdd1f5ba20c1a53e710b103da7e157dc3509af6db022ecc9130da2e08aa1bca3bc3eeccc8d5b7946fd283f147525baeb92f9ed28ed56d5bfcee56dc24ba432db35c5dc1f59f5fb70dfbc2c654d9a192de543c577d649f52b944d6b937f092ed3ab20ca31424c9112c0e42a7a6fedcf2261196d74c972ab9550080320263d753e84e309365232b13b6d2bafffade8425af1ff0b168a6aafdc40d7a15645de8b2342679c9b723ba1fd44f3332697dcd47a570906be322e980a740e080163b93e465bdd9df1631688eb103d5f59dfd8eda26d315d3de6c1bafbd20a1e09ba22570f754695b1ae55c204e74524ce6041de4ba3ec461da7bfb70c027d7116c53191466051046cbda277199ac563a1c28753c0fc6f449151e0613a9855658ee775228e395fa325f0491f30e1b1877307ebdee9e75dff8b64aec58ee2129012a9f71893a4d870d38328d4787849673369b8d5c0201b925f47721596539c6e95fb368fed691394498e985898e7b87e1fd2774f8cc82e365d78b01391d5f6f756b66bdd5bccf03e177a745a0b4423ce909ef0ecf75b3d3af79ac2b00c2afa18a7f3b963d362f46d17bf92c8dc997c88d71377db6b7c3d8d11136c4a0748eaf7f1d96c29c9246ab526dea84a91ee89877d38b61c1dad9073172e31dbff593b653eef3abf407d93507f16ac22b9c4806345d6d73e2f4fc48dd80ff46366f372de0d6efd358fbb8300adcdab84cbcaad807cdd3db2af67c2f329b4b556b5799f42e92c554e5264b8a0e94e585afdb7eba41767274efafb3d35d3e39dcdfc91376dc6bbe7e6a5cf97e3bfd7f39f69876d125ced9d7609a9d7d521753a9879d990f5c1d9e268ac84fc7a4bfa96a71a4bc200", "63006a63536351", 0, 704890566, 0, "9cdc9ba9fd78f23f3420953f5403ea81d7ab4f1c4bd69ca136b9b4e4d4eff5cb"], + ["030000807082c403028c64b32847bee3d494a54ab09d77113cdcf2cc9bcfd3b8511aaee3c9496b737501000000076a6352516a00acffffffff0900114f53721a990f64bc1eeebd1314046f6409d8864ab1b8f3c5a1153b77f40300000003ac5163ab68a9ba01c292790200000000056351530052000000000000000000", "6563", 0, -395493780, 0, "7eb983804ac7f9d20b5838f566041c4a65e6ae474129e7702400a0efce4f4c48"], + ["0409a15801d67428c04084d95b46d1c9972de21f5fea84cd619442a587ccc79d381d603fe803000000016ab0b2e5b702664c62030000000002005391f2f70300000000026563f3ce981900", "63535165ac5151", 0, -430015201, 0, "471d8ed0b52592757d38ace04900a6dc0945d32194e43c904ee485ae0643769d"], + ["2acead59043cbc85212cdd60306aaa5f9503b10002b68a762b4d2fde0ea5b5d7e5ef16e60f0100000000ffffffff96d1d5a82e09942a50ee1bf9ea4c62e80fda035e091018f7d214e9fa42012fb503000000066a6a6a656a523f3622935724da3e91500ff766e1c7c8d972663e48f0cb3673e6445ca52461b83c95194e0100000001acffffffff25b97af44b14095b60eb89946521f1b8313a078eb6e9d4eda195828382ac46120300000003ac536a2237449701364680010000000002516af5729ab803143562030000000000000000000000008e7e3758f2e966fb777cb9e30e2657e0ffbb669cd1f69cea0bf938e00515db523339e10496665e6a79a563d2a8f4057ee7ff2423ebb664482241ca6257339858cd0a324cd66e47f697882bfce73af0a6fd86ef1d09e2664d0ba9d0bd94c032f7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008bce670bc46d35b750183398804e0bdec16bb2bdbb4e54e741b01d1fd721dec58e437ad18a9bbafb300933640147926032a6036d42500a65ecf12a3039054af251a5447bde4b2e8c521c3731849ed68842a7a2d73477882461daea75b86b8f11fa4e6e420477b61356afab3ea35fbf6236d97fa06afd43e0d441dd74acabfd9802118cbb07d62b9c2fe85360f0f633bc483ff9cb41aefb0338528fbea5294f921d03213a373d9544011a3f44d72542d7d98c9e18d078a89b902cf321514fc0190f670a0000390c48dc73b873e5a6425b44177c6cae4dfa4fc69148694ca366073c95ff867d540704352eee3f677b419505a2893870dcb47001369e7b83a812e5a4a052022a68abda310dba7abd422971b23798876ac8f691b676d97c9e21763377ee69e3031eff28b479d4fc564bea6de3de78ee1ddd639b184fd4d0a138a8762071a44d5e02057efe477eb8efd9ee113c683a0a391eda100bc9723877e18716a17425ae5e430326219929a137b5f8f0ec97de529045eeff60a309b84fa1fe6733600d2940877c031e15aa2cf30e64aad9e014ccb7b6c1f4e79e3cf2bb7f14d453aa7aa294e4daf5978893b7a7947520824c057cf22d88c5e382715fc8d27f58b4b56cd34fbd8cf893276f3c6583ff9b02623ee9070f1d2aeb95a91631a341baf1a9cdcaa24d9ab2ce09a7e2830e995c03eadca1cb47b0f1acf9d7da1383d6e8c0592074f90957197ff749882199e4586a94626a71dab75453daae4ba4ea65c29920f005421db81c1d4451f99f2f7747e8e4df8d644ff7790607011d4b5442ea583c4b961e4378e6d441b4c4776a53cac6c5a2a3fc225f554442b6d07cbed7967260cb7d5e5b62eb7e52a8143b829b363629b77ed64fb7846cea530aed5d335336fe1d72354be63f584fa0e7ce050852d740738f64bb0306cf3e017dfc4aad4bd8223cabdf14d012a1574889fb5accedd89eacb0e44a9b9e8e87033383c9649737707b19e201188d93735fbc2c559d99b88c5adbd6af4072640741cc856a1d9e51b2a6e7bda724cfae88f84c352dc442dd1fe9d317fe24efaef71500ee51553fc4b9aba756c42c9b4df9cdc733f8c12b469db8be2238a218d47bbc75250ff121440b3809847603f746253b6d19a644ef2e6bcf64b19872d823d678d88c6d1894487c162e177d27cf9ba685768e46e9db5365c092991c88c34e2a5e77b45c09cb6371a81d9725c480cd186d7d4e6500c36bb500f028db38ccf36100c682f21d264a258f5abf5e7eecd3f11212788b2b1e0b02a24e9f275fed3edf3c02a5880f75d8e4ec90d8dec9dd48513ae62562cb18bba19f561faf8f05c591e4e172e46230efd70d163a0500d73d775549a5b2df82ba50ef8091b803cb0eaf4dc31697f6856f8125389875fe8edceb6a35dcb2099d360b6a1a2d66276b2cf013095198565ea2b9879fb084b2d7f942548dd01edc91467904ecdf99cb16159ab1567d5a3a6a31d919f321ece78c3ff7d2dd2d75e9d16808eb7b4ed7c3baf174c1a6c22eeadfb6648126af9bf6ddadfe88aac7f4bd90b2441b3b97abf5fe3c22ec2a5501702a8cb555c5d9c40d1ebdb61c02051c7f654f5629c485bcbdec4d04a0899d135023f9d3a8c69d7f53c1e426803a409895c120359a6225df53c03416bb28826d807d3eddb723e189c3b16bfebe2b5b49ca99471203c5cdf71a04a1ea7fecea9b9af38587de38de00b2953a3cd315f86bdb1e43ba8fe5e2ec5914f0054702dd39f520d8e1d9c8b37e037c1fc68bae01ea2d493ef2cf50706f0b2a87622fcd54ed3963f2c9a88680ccb14e84e83d22d1b511625980a124dcf683af9ae05fecf8cc692e6c449d231071b97d2440aabf136b056ae3e7cdbf269ce545cf3697901d7367035062ed06242d61d00a020a9a679191dae0fab9a12d6dbe59a077c7cb27d88cd0a9e893e371e07794fc41f257906b8a972ca59804e6d63bd674a227711e101e5c783911c01d54e940c396da0eaf76914f9690a87e6a2936ec1886e6501e0e5b699bf19b4ec8d50c5e578da3ac1c55791737d39d0b228435641507894917ffc70a6a505d8be6bc15f7771b3e85ada30c2af8a8e25baa21d0350dcbad407349af3191e112f1732a6c6329c24106c284d7f0986fcd92ba5ec737f00ced044227763ef0e03cbdde233c151d071c4d31b8bf93d1b6a14107c408008b5d34e2ee39796952aa40c475f072efefb36707a5f5cef3f022646269cfd552d888647cb3e7ae5cfac65fe86206e131040c2526b3232442c0fe24fc09283e9083e487206b0100000000000000000000000006c334e1c9a98cba228a9e4898e1c5d6b22323591c517e0eb40217df0297be0d3d08546d47361b6b4f4c125dfb105f69348b6f2b9137d73ba0e5353fe3f2b67fea34b2842d8acb38030e5094242e39986ace7215d8773c1b15062d25212d9d9b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d85690158661c768a90c33f4eb3fcb9e35c8a4c001a5405c9d9198e93653b2322f67636e7cc56e2cdaa370eed1ff7354e3eb35f6391c27c704c6022ab6100cb8edafebf8b5aa5290181d22fac0664556ade6bbe6975977ae4d410b4455c7f4b9ff54bc48183fd422caa119431e02c3d3f4de9ba31e2cc547155386fbc57edb0325bedb2352039a0fa54de0e9461315abb3f9c20f3b1162a5f04ee0ac8f646210021bf704da1f512bfd39d9b811ede033493219e9b47ade4b39218350806e8845800a015c39edcb80d036260971c358c62d927cb3edb7cb7f02e6f5645659aa24c5ede464092c37717541cc2416ab4b479d28632ff575726c7416aa63a2edc61c33590228bfd67f220a7e5ef36b3e9ffb9365a964de33f69c1acfa1d3193800f38d78b7032d356ec8c7197d6d1181730b51cbb7f3b919136eeda0e270675cf061dacf8f2602239ba29f01971dcc25dbb0b356dec5b2de34c07f8671f09340bafa0c3c0f1fee0221a82815c4a17077bff3b02caebd18ea958391e9e8e19e26a9904c31c3c296510219aadf057e49ef4fe2e676b57f929ba527aebb0e11030a7e0347bc500814375bfe62dfaf4d29d4e7eddbda8d09f5be73d5279373a50af03a8b5447269c4067ae5b6131724e97ea732be59281c8a5ef8cbdbf40d341dcbfe954df19b7650129cd461343709af7d664a95f6a792b9e35f0381ef4c7b3a94159c743ee44ed63400852ea7aa53124031d4fc5f0a178185c03ae3b772ed4d79469b90f3f17cd13db1f9c49f7010bfddc241d5300982452d4586e38ac42329ae44c923acbf0f4eb9dc91cf78eed71aae124d409aa289d1df4e9520d1ba154f7b5839cb1c63814500039f7213f08e0d6347e62bc94c89a5a88060d309751fdf01cfccbdcf8a195b8c19cb5557c7c4baa0219c9b316b98286660a72043fe587f5f2310fd162f4b8b6266d893956854e0d7ab4cdd901e1ec11aad7de2c1c92a0eefe068f0defeab9fda562ef4037dc8fc2078ce4b451eb873f60d9a2017bba4c4bdda6fbc6cbb20f428ee64d69e14f8791257c44313eb674bbdbc3befe6798d88f3a7496520f8e08e723c9c62b91c640fe3651f689370aab42355aefba93e1c6bf07ddae66018bf0a4b626d716bde5ba4df1e4e7f49a96265d362b530e1bced5aef94c6f4800b5ab5a94e798d4a56057e43ace585ea2517b5996b1787d403358cffb836b0981c10e67deb292caec08add8a2837fef249d880739bd59acdcaa360445c94137b8be75856ff267baaee4e2c97d0462f0a1e940a541c0e6f2523a569f7836a970d92ddda66cc849966dabb794007910ff361bce1e62ad324404d6a3b3b0dd72777e6e55da531a6ed351da3a119d2b506d54c374d3dceafb52e0f973e9982d9c882807922fb311879409abfa5a1ae70254a5e2fd59d0ca354f2e5a38f1c54196eb8db521aed9f019e457c52c4edad209f09242e7d8b44c69cb652458643c56afa178e8e2aa699a1a5cfdfa63ad67d6abc0a8a1eeff56ccba9c0ed4a454ecc6560bd0a57dbcb842edeeb71fd7b8949fff2f087307fe30b65d78f974bfbd627001981fd967c6a357bd04e4f967fc85fec355bb73c635a500570d94882a1ef4d7aeac03229bd4d38c84d38fd1bcd1125a8fe49a90b925144fd66f2d8ba4fdcba91898ab419dfa2d34f83b6ce4e9301cbbbebbfcc34d8d3d46aab8b6201ca882bfcfdb057274f3ba46f39b1db593396059e9a3ce6150ba8a4ad444c2cbe51106f8b6d7b9c2d9ef7205faf3ab68bb5e0b5c3fc231fc060f747d9fa147dc18b7215cdc31bfed7b64ec1fb4f6b5b76f5a2d88ca63dc9d75929ecc74f7d852c3822a89ff35db5de928b39c464bc2df8c2f9172cc879403c03991ee14dcfcf01fe4e1d8ebd583329b57fd243bd4a6250c97535f678dee829f9c9b80be57c91165da6e62ac3da14b6c400685476ad9e7dae379b0f49e462ccdb52f888cc8acdb648f8c4f8e9860b5c0076687049c2a883dbf1ad7096dc75c21b82714530e4b21eeaad7316b9e44ee7e70533c160dce9172096b36b4418e4f631040631bf69b55f3a31aa558bb3e6f7622215b431e720694d899f623c77e29c473fe8830ea02f64b41a053f9b7062d296651d1aee85d55c7a838218de684b09cdb6320cc85f25a5f9d0b1c69666afb0e8ce3ffdb090a7358f7ba4566b2cdf25c8e4bb438fb9705a6011d283223fd69136786ac42d53f54e7fb5fdb6470a8156b6715f2d8bd8f45324dc1d8410ced449d2f5f3a7b981ff607b2f1abc46eebb3afa1abc5251a000000000000000099f0960300000000db092c2ab32ae1f2ecad853334d9bd5f0cc0d8267261ea1a6ed5b19a5376c08e0bc83176b2a4732679163cdc90f93da570de57dd4d8c426b788e0b82731b923a6fedddd592ef959aaa1c5640bb0eb6c4ee8b67c222f406c193fbe6df03f78a6600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e8483f021d17c5161d673e04c914488e7c35c2011779682177b13847e8d660048191639e9fc6c9803dd5f34dc6e10139cdbc47321e63af8c4ee32ffeda5da167f7ae344a384dca349180cf82aff2286f3c38412eee2b7b5af5e6a0754c3000b23fd81e023fbcc737e38485f0c3b95271993b45c786a299a434b1c83011e18d66022ac45817c13b656af5b5031e3917f4cd2d2fd73f90b818ad6194b00864014f1d0319dc962bba7fd2ad54db39df6ee020a205acf875abde489da6cbfa31e9cb7ac90a01cad4d0685b7bb24c91b59e8de780c29a65d0e194dd33460ae7fa5788eba6bac50c01c7ca632f0670ca29fb5cd7bb2d07fec0174673f25588b366af954a8a92031708f6848190553a0f3f96e56f77ebe1c7df8c7ce507da46b18cb2309da26859032fbdd1bb87a07cb81afe6161115ca6509139944a9d40412c271638e92ce401b9021db4aeee5de5a26eed099ed9ac47d0c30f58f8dc088675e411fd477a9ea171a8022c3a4ca9e5947d805464c59e401d67344ae073667e446f77e851591e22d1a3fc0226d42884c0fdc8f61646b3f0a2ddb754066b6ee8a945b12bdb19eee8eef793ea4bae3fc5cafbb17bd6be09eddf1e1cb0445f062821d13a01d75f813b9914f2115c56b2429e63435de3f14d01a6d6e2f9935f223b979d180667a8786e86275448977449a2c49cd0f866a7180399f740fbe290dea0b08708c8f28726762ff362a43d0e45a31c8326ae84bc0141e86edacb474d51dec66c87afafd98878119a6b98ab13efcaafdc2ca535d724c05bf96910b6f7e4d00e53b75465906135735d2be1b85c72666dc76af93dbda719f7356be14d57bad9fc6e3eca477230220930a4817e5f337617bd2e2ee912f171dd8f3b69a6a8f417369f2d8b228562975fe031c6142dbe53613e37495300dfc97b9d8de0c0b6c1db77b385023974d00495b3a484a70109257d869e77b71674298d29d1785e7084368a45db5ec4ae5cea80fb5f0d2c9a39d372ed16fe5c188230d5b5b319770f695c44658668ac9513d465c5e8a209d72153d809c7fef95b541a4122535b310182cbfcb917dd6f0676551606add64f229c629712437920e9a284f329c8d68926b99413b284a5af75f2d48cd777e211bd59e3798ceec65e16624ac3cfe878de432b3ad5180f348758586c884435dbe148564fac7a7ca66c06859a410eb1f790a27db648072e309fc58e659e1850ad33e81323dd947e2f6c464d58e5f58d4f7f56f3e430c102db66d82e085b3fa9a010fbde507ca97c3d6bcd0ca72a42ed10f458a4d088a0ce80deb2f56f0739b039927be8fecb13483b3b978422cb991ffb725f198a436fb1aec32eff15c51e8747349f77fef315f11119722df9662c01c7f008ca4a9bdd183aa33c4e88323e4e08349fa5a5646d527ca269255446e45e8284926c69d19d9766798d8cd385dfe8049c0d946700c490a26653ad3bbdeb26616a8dad6f608c0a5183319bb433290db7d8b49061acbf4c6fbc5932cb30d22fa126aff94a6216d7182d6b5f348871121dd8549b55c177430725eeb8909ef736b2ce068d7fa9859087ea6eb5ed74463f55bbd25ab587d74f56b5bf6d4bd3ff851167e0b86495de0ccced166e52774325123c6fc701a659f777597c2794c653bc150be0821d3b46603254817cb6da75a8cf74c70f6d49a78d997087a51dcbe5b9a99e1db8cbbc8ac8c7822269b822d9bd18ac3692d85804f8f560f7be074654b4a0b6a302e44fb303ded3d5e941840632163ccb98feb1aba2ca472f6948d41af26b991882410f1bafeee2d17f82cf7fd4fb70f10661181eb71ad9f79c830f4584fac7074bf2a79cb37277339dd353b4a4d38bea77385c2ff6c8790c45270e49be6eceeb46beddc0363594aa53f8eca6b1f057b90e4a175ea5e13f426901f81cb0acbad82cf1d2b219b77e8bb9d01ab879e4c6a00e8783fb312bbd376fcbe21c99e3cd95b879f33edd25e73e5654403a65245344c60b3daba0622ed6e0e050166346f81f44c832635b5fa929cbf437a5ac34b6993d9b833c3110e08d848da990ff3845dc5e4f4da03335488be574b61b6be4f92321b330fc7988dd17d673349a63ad23bc4ac404c09bc55e9af64fa1d1784f6ce71da16161944e16e17bb83893fe33bdf9df6fea370b9f6d801def8c927283481e503f003f45151ab433a96f9eb4e1d417170abe2873186f81512641d42ac8f45655a1dd4ebad0febac5e2e674aa7f0935ffd2d2ef0ab87d6b3cf5e78923a1340431d94b498694c3d56023cc8b54c83f63b0e0ad7bfcd4e66c08d25c3f55fd4bbdfcf7b539cf0944f43fdf739cfbd985db60530ad0abf0f3acc33e7a0bb83bee2350ec0b5ae5ff2e6418f1ed5a28def8cafa6116dec2fa1efd98db5170ffd7d6a8b9db00542247045ef9694f222b427403", "655151", 3, -1123167027, 1537743641, "05ab55952ddbc5e431ee2a8375a9f278494f840b9d5e637206ac5432843b509d"], + ["ef720c7504249444d2dd7d90dd8300d42bc5f703b08a8bd49903db20430c385774d3ea6570000000000865656a6a53656500080d163f0fb85c938b72c70f05de60b6cdc7c92e149085043da07d988dbd165ea76953900300000001acf94a949809f35d88f4d25b55ee1118502242abc1080b5a2b91448303bbd48f87a5e458d80200000006526a5252ac63ffffffff0fe03867f6ecc14092c60d32e3d4de374227236083644e51f67eef949742550a0000000007006a5100515153ffffffff048f9f3d0400000000056351635153651fe20400000000066a0063ac52639ab8f8000000000002525197bbca000000000009536353ac636a51000080756e6e00", "53", 2, 1472115369, 1537743641, "334af7ee648dc318475dfc27403191d99cddfce66dec1449c5bcb93ea8def845"], + ["030000807082c40304b865e34f9a0cca30a1c6cfe13c9b19f32caf5dabaeff5ff12ff1e8586e996f230100000000ffffffffd1209d224737e3f3464357394f4d9fc44a66917278253ab078f6c320ab2f1d1e01000000016affffffff7ebf704ca9cbfbddb7509e57cf0b9db8028dc23ae1e0c2570663da97fc62fa00000000000363635128990280aa993aebbfd1bee61ec2a1e315c86fbeb0d01f7377429bde126f8b08714b230b01000000046a53acacffffffff0351ca06010000000006516a5253acacf3a5480200000000065351526a51514d77ba00000000000463516a538b21ebab0000000003000000000000000034013d0200000000cd032f695e6c3e1e3d47caedcf137d71c6adea7030b8dad307752d3d61fc1b4e7c0add70631e835b164f1a027b904a157bd5623c1d05f615ca40fde8d0539f0a913312ce71ef5496d66c0a381fd7073f7bef1423d50a74364fa1c59e4e0dc90a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e3a50d0322d0eb7a61bf7957ab494b452a1b0dace1ec5e293142e6165ddd3977fe08b40467468cc33fa006c9d468064f1e2196129a0e4b80997434b0a7459ecd3b1123159294a538279f13f144df05a2d3da2438c4d80a2dde532247b073063f2d8b089f8c26323d1856a0a52020ed95519544e3f3d73f2b307d8f311402c94f020e500115ed4f3ff16d16d9f6a21a78fd4996f575d3589afe3934a5304eaca3030200c21675249b6960f6023237397a59e1486637b627796961cd03ee7969b207800b0330706a0b9c9f1492139bc5ec162ae4495c5a4927ba41719a0f92e9340d1d09505122438a82ab76c9555b0ccb68e64091a2b3f425adbb8b9b66eebe3dd548dd0223174344a3bfc44267f8f9d7229b5f613c0ef717016b369f7e57ad024d886b56031bd0a650dd0c1ce07bad8080b98b66ea445ad86cf892bb70e9eeda6e33a95ed00308019c5ec830e81f967b834f6bb7913a168f165460eccb68617c727c7b995c9c0203fc65fa4d9344f6ffc41ab565a95f1edbc8e7151bf87254c5ff9d98726566f0032ef91519b9c4c4ddac4fa4d1fecaf0e59a4a2418f6ca2d355e5d2b92c6cb48f47d03afb62d01c9a661338e60b45cb935793bbf876bd11937eb50d1d65df7d5d6e201bf7fc64d052151bb508ddcbb1ff5b6f66955ea8d7dc1e6b3d718a1b62a316d53f07754645332b5487b7ffd3dc538c368bb94fc9791927f09d237b59519a32da4cff6c775a98488bc990281531d8e7caa7ef11e9eef4c9beff93af30c0e9a38fac591548908254667bd81f603419444fb95a794b0962e01fbd25e13a1577f67c2d58147c85e68c217cde1c45f7c93a73854099cd4bbc50f5efca569eaf629176f1062d0212be4e7e9813f83e414a0e6fdffd6e68555d83a97c5e48e8d92046b60ba2bff8041a79628294a3740fed867f6d3ba02a4ff961df4d49f05467eb7434f2dcd35df3cda31fd79572457551f414338f60456087f6467bfffc0f2b03190b4db265d5eefb691112e20b62fc47e81380fae28662d9b2a3f30c06c1ab569d8300a6b5b1a6cd38c976fe804ff3d8c118ede8818d78154941edcf3339cdfa350815f475c22b4b15040c6d36a676af535e0096a008913e82c133b1f416fb1bc9807ca45d651c2234f0a692d46132d9315b24613fe66c4b59d4a59cc7ba8a0752ab7a977be28cfeb73b0d8edb5c8134b60f941e039773633d3c0a70a9e999c2188d8474cd81e9a3420b295b9044361f28135f39ccdf0abc8ea612e7c9705dd04620a7df152751f11b7056ae1b66de3e17e41c9e49bbf6f66affde03f6b2287f8fb92161ab940c8bcf76efa68aaec84c7e78891c85205d65a9e4ae36b4d6147b7f7d459272457031157ee4ca5d15dbcd957b2dbdfdfd1683028c618fcf974841413f31a6c3353e3b4f297eb7271634f12206aac4d339c2c8feb2df3561aaee68eb20b1bbc022a47ed663ee017432a19c5caf560a736ec09251d953a3b1156fda27dfadd70873505f72e16458f146450b1129170f95849e0bdf11dc35827e04694eae250885c6cae138719932979383d9a63754d181d9527e7c6962e17ca7eac2363765ec0488cf0683e1077560aafdec57523ff94aa33bdd9ce65e9d1c95f302e4729c329881f6b0f000ff21781035777870ec32023c4cc5d58084b81f913ee9bf3e811d6956e9edd44dd7622066936efd1d47cedaafc065574d2ec86d1332458874825289d28983eee22ef85819501a83e84998f3d20e5adc45860af464bd46c2e9be87a19b1886e016d8eabe751e067848491a00120e970852b51027a7f00f1f3c67e0eff0bce1facc9075e9b748ed3a4c3f346bc9229a492373c9dce7fb02a125bc53de912e0d96fe0138806aaf4397396df266cd1f25142668cb16f8a6727fc73ac3e398d3c39d957c807288952766e638d3ec81ad1838e2af5ec3a0bbacd9395e40a322894c2943d9c08639a3ad754034156e063df1ca7e21160dca411b473b4625ecc5ef4c7aa940a539d409a01bd523ca0c8b5b22876f1dc92e25378f6336ceecf75f4f208fec29f1384ebcacbf7fae31126a53099390cceb527ea12b267ccca3ec53ec689ff64c039b8c969714e5fe87fa3c320443b657a042c0b3969362b8ef94344030f0e4917a72e97a39164f8b4906466fb837e485a98223b58ea925b03fc31cfdba417d0dfa0a68b5a511d0fbcc05d9d05ecf5390b4eeba574ce27c054c906d1635f21ccc816d4a06113642306b5bce99e55770f2f2bc345c4f141c23ad81eb84ec22441de94b1968bda0e62ef371203000000000000000000000000e1199d80090c989161747518992aa2b8b70cc89e44db2ee4ad0499a8211157a2a021a3de94e860cc13b028210fcc55ed82fd3321265b114406e808f8f3475e3ab2cbc7f4981b4682554b5508fbf8de2542c9f5a93986482137fd6483b9f7e8b6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c87950a9e9ca849091cc28ce468f6c88adb3684f86679e125ffce1e2ada6cc8f8f9e6c40e33155e892d45de67e948947791782bd72d76f68f52e56e0e99829b80b321a20ae1ddc742a4dd169389fc67eb6423b36526953169e956c7cf3392b20f71c01537ab8e7bfc8d9c075ca47966cca923f55c872f275e3e11bfd8de5fd1022ff5cbeacc967036507ad7cbec5b67f7dfa30e470f0c07db23f6991d6b6507d10312288e33a4fbefd37aeb897690c7fd7b716905d801f8bf704ec87fa21efe064b0b04b5019322028e81abea57e05864dbc446de088ada53676c02dd9c0d4bd90f2ac93513ddaf52cb0d99755c796652e926e428c63e3a3ca407aebbfbf1049b96af03156ec03c5876048b88243b02a348942a840181e2e276eb672049836f2409db73022f6d4a7da14479860f28e0bc682c03129031b9f799508010fca1cb7074ebf6930324b4ff60b45fc15711cb4f6fb184c59ad8f27f20a1f2757353f34971dc6f34e4030b8b077d99c3b37aeefa1f50faf1d7976499cacee235c62c06366be38c7b527a021886e8ba49489d8acadb4982ac4ab26a737f78ee0dc3a9300d09cbf307a96ebb5c99bfefb0ed84892adc29da3fa67f7ddef17366497d271d1cdef08fffe28d12c1560cbaaf0a8a1d8fe236311298155d8e4ed86ad1071cfe030b572097f4706ac31090b53762906c50a6c957841218204cf2aa356308784372c053c4a74ec4cc71c37fc8255e418d045d4057b7982b550c14966e562aa4e08b93a4664d470cc1647cec1d414bad467fb52b433a4e372637f2b75454c276ece098bfcbc3e37c649f4c0a2adb75b0d75dd3e6f063650dc13934a2434c876eed60e169ce1b38ddab51df4a166d84bcc6ffd13e61cebcec3b7198e34adeee3ee726bf130d390cf731b0bef27a5cd6246c915364211fbd0d05fd18aff712104d0884b933e4d038c8f86455f7be9eb40f616957a46840af5057489474539ed6cc3f5a3c31bea188d448765f941a549c11830d2f0ed72f62d2eea9422f1ccd8c40bb31ac9c1285f111d38277881c0bc38008baf9ed673747076cae4bb2637f4b2104cd68ae28c0776e50a673b6e74b85ebb54d927334eca99140d611621e4cfbe5141a207bfdbcac2b46c58faaecf70c48e2d4937870f59220d6c625fd84ca934be47fbd9fa24082b094919e49ff6dd725f7606a47285a778c89eff49befd93d7881dbdf040cb72112d44ffcc8d4eb3b7ff5f41e580525761192e39386f110265e3ba562f5ae5a4b0710aaee3275a4c75bc4bd16955415bade33b67a3365434a05652f7263b622a0b636b618478c4d2739f8c87ba793ed45503fc8a5a4520b98ccbe00cdf759716f548e500e6f3ab6269069eb750d90c493820b112656f5edff7220a29682624b1e933e5ca9cddf853d7de7a5f8d3e56660dd9cbd522b2f5a21e394a76b94651fc58435321688a970432c96b13be0ade323168572c7ea65fafd6d442498c019ef6c839282830657cefddaf4f298bace309ac985cdec5d72c3dc4b0fd665b8b729b43cca7266944f4313112e8f01275e228a9f40483eae57d628ff121a16572cd07329c7721821ea1d8d292f8eca4fd07c62ad597bc97605ea102dea662571a5bbe348c89ac4f7bf7d6c1bae24e265fe7a027dd5b38d22e8f88f4914e7faf5873bb80e6fcfd4e054ffd56311022a29b505a6337b4f93541aaa7bfd4190ace1c29305e9e35676c1b289aeea2a2e4e66ba487f823f053e7c42a146798c53c80236c504c2bbda708707ef17c068fab137b551d2f4c250084438834ec1d4e1180ae03c3cd3262a0fa4d63d403764417bec97cbbc78d6feed6d1b6f67630e0f79d6866fc18b55308f87a7ff9daeb2dc7678648507f2bfd7d88a368d54474ee3cba853e0688aa9cef7813e5c2e29d4e8942d14643b0f9d5d13569f6c633b548eea662b6e32caa403b84635c48c275d353df33ef63dac2f43a5552ea2a4408d0e6b5220fdb8276b29c4e1c624d1c63db9927a020575e23974b8e0323e87c591221cab7c27748bfbe041a9dbf4638232c7516ef1b22925c318aa28315c0f8570a0ba0588c36caafba79bb45b66c137bc57e93ef5daa0b498ec89e611642905cebfcd2c6b6967cf7907a86d02f143fb9a9027ca51e39ac2d78904c4e240e877d8f7ef7a401c4eab42556c9071df5063f565660e3e1386db31747a0f895f25f7433731b4079e3895cb2be4e8042f0b7b9e459382c188a583a94721638833d91b1e16bf3f37c84ec74c570dfb1cd6c4f04f3ffe8b55ace589d5dfb257419f040000000000000000000000000a14c2451a9862bb75e0e47d5a59e9b2b68006430038da9d4b0f5aaaa7f7f1f28309354323ccce1d0609794cb03815a48eedde5ca90a803fe0ef58e2768a03163e6441ff2403565af52ff9cf7708028dddcc9ad40bd01e374ec7a69c4b409dc700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034527c9618e4c4647423f4d82521cf16cafec3cb61b2a7bf7f2a57de4ced09eaaef78fb9886870754275f60da93ce97e37d9c391be5db7005bdd59cf2b78522c7dfb014c17696128b6eb6b1617e541246283dda417012d0f8b94070d4335ab10775698c09417c2ee9891d504f0a18776898c02f265caf12b1b60bfd1a331692030f6cf240aacb9e067a5b79270a859fd6c312d2bbab33fe92746b752914595abe031c9cb5eee80a7e13b3936dce6293be7c63f96605747794f555be008c32dccfd80a040903198271e884f70e3b8907cc4cabd2a688380e717296b1191ccd85093b060fc64e0f7611ecaa3e7bb353a4e34646e5613905800e132bded5e8a9191b1809021cea7b0b21d1fec68250af2e4a759adcf66297a5503f8957694e4dff313231430207965f4380f953007cd82f184ced4a670ee8355336ca24cabde4a0ddbed8ff5b030bcd311312bcf9dc66f7d928954a7882bfb81c4feb71e4df53fe3a83ca4a0af3032ac5c948eee6c763681eb91d5d6914036f9ec1e79423c36b1022f17b6aa69131031d6e8e45ba97bec7e99bfae0d8ad84703af0cdbb0361052417ca8f215e0662ea2f09636e1e0c7881c2a156c4d1ae10fa2bfecad82d0b7cae30b8d7fcd2bbdaaf7b568e263f240aca338f02c404d09193edb2cd6ae9d40094365316363a6e5d78fc04bc7cc4c9781f39fa126505b48821226c32cbc637fecb58a90e7bc9c22c3d4c58819bf746311441734670e27975d2d03be37b5a4ff9e5a5df54213b86b6069dc45413c34406bdbe09df4e367e83452c2821b2c503da361395dd062e025f47f7754d19db76b40ba93fde1380abba7a85e36892a02387f7a254ec858022ddb64019f47de565f5eb9c3019723f82640dab0c8ff83881dd300cb0703f79bfc141b5ce1de092e20b69bd04ef87fb8939bfbe43d7d69899518e785d5f8a498f736599deb93e980b1ff6a76bbab806a453683e81a70a630426b9b3127a6f1444dee0a5c663210294050e3acd18babb1bf9d4cb1a34502bd6f428b11f7cf3d1e31d7802447ac014256a6dde0d638466cfba57f44eed2b1eb308871aaf3ecec24a4039acd7d4a1a0fdf1660ac8c34cb83e708744ad9f2947e6b247a6eceda2d9d1ec051450f84f9a5b580ca1734cefc8deb179c026dfa2ef2cda913e3c91df24674dc53a81515f8b76e785f39cf5d7020b7de921e40637bcae2125fb1e14e11016795b3f00425a12a31fc0f1335d3550dcfc45e78588009207d7059cdb81c50b8bfc8e18a2cfe3f5b4f81e999981b0680df4bdc11d94076e86b03c365e1da17f38492719bfc7d8e97dcd5cd4ed461a02cd07f7c48f768fb8c3867e96d132cfe39a101a6d4b56c61f84312bff4efef40467ff19bf18bf51fd6214ba734cee9f5b992d9fd8218dad0c5b5aca2ac9bf2fae9674836bbea8166a22fd9a8f9a5f0ffa4a0faf64e519c0034a4c9f0b0514fc39e96b04d2b8d3ca2674604d94ae206f828190ff6bacd197118b5064af4ddb150f464f66df78d3c1dc181bd64576c97b37068bb8f52d4c439995bf6dfe40b368facc21f0a6c59f004511890341f7f477a8f86a41057f8e66a3a217603018c7ca0dce30f6144b0172a0ccdbfe0dd2a7188132761370067109b72fc74225abb31356eb3eb1a41632ebef517edec48112cfc2c6f4666c071a758ee15e63acfdb462cd5fb36eb40df0f0d11281fa73df618e51592e7f76d7cde17560d3e2b223a394b118482639c6213f8657e6a25b8c387f936d6d30aae06ecb536dc7b3953284db557a8ee7ace3129999b348d53d6fec179897fa731283bb91535bcbcd2e3a663e9d3a6e65ab44fab6e9bcede3967e538bf1e18c191e5c11ae3069e29233108a9c0bacc4770b93f3d304e6014730345790a329eb52e13e5b99d83bfd5f8cd4308e9460f0da2cd4c0682c242937a2280f0b9e2ce066cdff5837507fe83c00e998fd3eff6cceab6d1eda5460a98a1003ca7dab7ac272692f55210d1b08044f5264305ae614ae4fc2f9ae16efecccab6f8374299cdf30ef069aa51752ad342da98f27c43e312f755b8449b2cc0cdeee5512e8bfa535b7c1c11a94253dc6c66040b362f2923ba9e66755d9587672df2cd95c863fc0dad65ac6a86bb0acf7eafcf4c224ce5b7d6561560af89415c32907942fe8f4f8f053610507826663128cf327f09fa20374e2e71d71e6d0733e5c905e810b78eb65d95885a60380866e781eb3fa0c0c4652dbc6187c396cc47dcf9623affd56e79da14e4929e9c7bbdb1f0cfe3c7f49e3b98b7547477530085cebe1d1157beb111ac0cc8fc4d1bf71cf53c197c6129cce3abeef5946c0fb357053837aceb4a4f6e35b0c9a567c935266c32d7cf0d0bcb8b1e6e12183dac05170fa1d7f0b1769de32a5ad750e1f9da7d5f23d34b8bcf32536cea70f", "53536a", 1, -889702242, 0, "ffa9ddc2dab45b65b784f3b7d85abcf2278fdad228f3ed9c76749ecbbd069ce4"], + ["030000807082c4030488e6a3471cdad1c7b4b122d9a2aec4c1ddb4c380c65469b8a132d00bbca405e800000000045351526a1b5f0cb86f112d52157ddf44c977e09dd34bb9d38ca8993fe8a99cfbbc31a7f35234670303000000030000536b70fe58e04314f628f499c509dd680e3438907e4e5e3a551330a9a4bd762dce44c6f2e502000000066a6363535251ffffffff7702facf866e5ccb958b1a7d9f319b51633595180be25192ab09bc4ebe20b2950300000000779af697031d354703000000000765ac525365536aa4d23d01000000000056004304000000000952ac526353526a000000000000c651fb2502655c240100000000000000000000000075899cd7be23bb90560a5995ef35463739ff7040990a2fe262cb865973c3d1989780eebc53f7769e51e91bd31986983f3d4cf465c0488d72d999a9db53207f883942a2a6db2d16a27b0d549e488b9c5a215eafc20c9ba6e345f43c2911bd730e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2a2c433cf3c4f3b3e4fcbdb15fa8eb25a054ad88258bdbea99f4915156e7d2b4cb79984eab14d82786220844351d8ffc9a6789d1e247750b72c415c026ce976a8bd54490a97b5a99ce3838608d46b314e89cc475a86cb40802274f816e797d586247f1b8c38042990390d0d1a2b954d0875704c82d66c3d6a2cc3b5efe228cf021477652ffb1ff84381fb67341389690383345fe41b36daedb19c7a83ffd005ca0211458251daa36a8f54cf2a663697d391c84576d7805caa22a4fe5f9c549c1e400a09100089efff027a98fa7654767c3c78908d3be14b489541b2f64ee0f32fe35299dd0f939c28c6a21f929078e0e8e5ae0548024c12eb0af63bc4be59c607b64c0226348a8081b5eb6248ec9679512562a3276601ab0e7e16cd7d92454fcd6af6e9032406a294231b77d829514525342eb482441027d23247225dd47a512ffce481b6031608a95ce4f53839ad3dd3bcb02152ca1c1a498309a7c9ab1ff141a374777f13030f0e0951b36de7cc523a6b73b2c1af6656b020102c51ceb36c254b67a5ba89340222ae70f7296c42958e64909742f94420b63cb3fd829841109fa10c803cf4cb78c6dd1bb13b469d4919f3963fdbed1cdf57cf6b6b156ed204575744d58d417df105cdd10bff34edb89dcf901087c60c89c421a68e45b700f8083c9ad2f301bfb5ab0eaeec759830ca34cf9a03558c5e6a4c2f58bbc60c24d2780cbcebacbfc2cec0cb58dd6f03570fdd07686afa79e62565180d221c41ed65dbc421c6bd634c26e52c01743cd0124a8d33a8202275f0780e073f77cd6aa0da52e082ec670290ee2e29745aed197d2efb587e55ef836b081df60adf02eeaa27b268141b8914d353323f4151951e47775698bad437a3ae5c265fa0735ab20998cfc041870d81f53b9854d3f598d9a663697d0c2d2ff82eaf6e49493af18822de331b296b36776d9fc730cac623142ca3b53103a046206628e130e6a67797c2bcc2a8e2e527771f3534f48057ddbe6a165a67e0f6c692920ea0b31f90fdabab281a79f5539161611d6842e5cb4a4f8d412358f486595f3c8535945f2bb28b39b75efa935fd2f819c65bf1578a1f2c69e86b1c5453137090a98dd67feea8cfc9762ce1d0527371d8a57aa9cc1075092358283493055c2b1e8dcd77cb160fad812efa74e1aa09a111edc81d403beb4cb3d283b41a902d45d5f58b614c3f744b750b100353c7e5667190a8f951f1fe76f8595b63d81032589a5fd2ffea25437f34ea7f6a4bf041e48e19e5449ba98834170bf8a5f566cd6601d8644f0c9d6fc1f07cef4de2e8a3b27a8560b836c11f5c0216be01d3332af84b62eaac2a38810d2a46e49d1823da5ab3b2cbeaa81f4431f2f9a09b9f55e0b881e2097d12616e249c6867cea59feca61a9b1d72fa0c1a13ecc6102950fa9b1881c5d7d816f69c4809a7c10a597ec658f960b0017670a9be9a288d3c6da411e0e9dadc3367b4940e46d799d42f4ccdec09dec8cc1f06ce866c345c98d9e51750a82f0d954609e3bcb14c0f1a6052422cda82f12f0b61d242f4949d96d49c335a1f1baaf3bbc4d66ebb66a1a4a8c64ddf662520425a77e13bc586c357a22433a098eccc12616b285c54df4d06a1569ecdb9d0f768e75ef4a57aab701e805ad23e833fdef91d87bbc0827db397a043a21c2143bb1cfd54eeec3ace428f13824d73e9b32f7a1a052f4db5b7deb5ef5e34fb52e5604726ad00904a00971c265724779c910bb2418238238db369747b774a6dea30769532dfaa3f357afd44355cacc168b0e76d14bd26e30f66f6067fa50831e8b6a990918d863dfb8addf41e34e828e5fca5916e10b1613c325260572b648606d497d55d444af7183f1b658ef8509c96c4f891fa798d223a2fc58ce591250fe86adfab32526861c163636aadacf27c217df6d9f0912b312e11098a52ebc7abfe7ec90a218cd9a24677185793a98b48ec3d0cd10615d7ba2e54f18bfd461334ab21f2ae92b83747d4126636c17a3d4f83a9a45b59273f2efb1520c0b5d4b1792156922233a4fb222cec60388315abfb9e37185c754bccf786043fd715e5ab0c912ab65f86a2b3f5d812ec901f472b3b5cf321b37585605d516f470655a4d97e87a2c579ce4f1ac82d10c689b73a678ef913e3e77178776b71570bec89ac6ae2d64ad43db19513451d8cbfae0529e13dfeb76c098cd9d1c8752a4f1d433dc45144cbd3eeb00282c76614249337fb297acdacd231a88f8426d7f864b661204eb420a3e02ffcd676c9d8ac814e659cae1e122b35b05d48df000000000000000000000000006d688970cc29d456b69f098d69aabd1a72dca41026145801b7358d936af1967605258b3c7738dad8a97a8cb0529b4f3fc3957f44115abb8f29f47ecec88c547ce7d1e7058f5473ae6e9a1a840eef79728127fe05bd800e4dc42c2933e01bda7e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a694c2a0cae511851e9eae4db4a0d98187ee8f395096c255e09e26e0f036e394eb668bd166e704275d967ce2da5d9b174e03f886603840be3a386e8b0e6db47a8cf745b2f384e53396e12f0159462b60bb41a0e33d6e158f4fa93c95162ae1c4b96ae1725f16773e57ae384d13bedc68633cc6f86f559168edf71179d9380431021aaad02993b9dd3000467a54a3f7d32c2b8a78302b2ca1432086c3b1710fa8c7022ed728d9d17fa8b6a047baf45fbbd4ed35b34f3a1734ef0106332e2da7ec0a150b04a3a381b66c30ce5180fcfee2a131d3b6a8ecd77da450d2818ded349315e4877cf99eb5c318f3f9111c7c4bad630ce751f73d34dfad2d3a4ef01b2889bf1053031bbe9cd676cb4b24f193472a5b4f111f40b0393a8104d192294bc5a0fd62790c0325953dbc0052e6cd709a5e74167c4b2bd1d072116e805f415431920cf6effab90301800299e038fb5a9a4e108736a84018354016d048435a2fe372bf1d6e4d8e3a032a677c3124453fb9cbc6e60855b4ad535cfaceeead8034441180af3e49ee6e3f032b2270b52edc06f533c17eefafe87cd3139bdeb83377b5ed9baeee86b096608a433f6aef41e9f4e4ea0461d0e0dfe261f8659610d9ac8050ddc9c4b1cbb53f44a777995d3fb3317fcd4cf064743cc5be6876d570731e69d9156ff8d21f566d1b679a01e253a5db0d0d6bbac1bb3bf106aec4e72291a172da7e79a5fecb444656e11b3c8a7150f84b989555c67c1597cb3217ea306f801f34b736311a9cddc3d9ce12dced42fc188c343f526cc40b499fdd641990b85d9ab2f6332dadbe3907df75ff523d176facc1c61a81ff0acc7d7e88ebe7bf0270d7581ebfb31073700a30483787fc4c2efe6ca84db75a9d532f3b5f863bcd602449135ecc0815999498f9a8f0c10fd934eb780cc95ddb770d5cc7d127aff6797eb9b0ecab34b1e94971ac961e2492d4402dfce0e18bc0f08068d8660a6740e587fcaad43a0c3b6328337123d7f0fa49f38d79ee1e2de2365f16d389d3165092515d3830a57197d096865d47bde1ac00d40a14ba504352cc6bfd63018e61f3f00b84c65afcbbe06b8d6d0796ac7e564714b3634e06c8f767c35d6dd7ada04c0751e5e892e3ba4c4c2b1235b85f9876cf178521337b58e5117e7c0fcd1d966e5dc146a2668fb1092e862969cec7d1bacb6880aa9416dd5b54874631fbd40977402dcae03f293319b5a9ac158a431217f3225b47aec56f66bc070b80ecc3601d7b5a58ed052a69863f1086ab0257462fdef7a3d698b56f2472ee20a21e5dda073ef4b40721d63bcdc06baa00e8627a55331f2efb70f1836239abe675737f2c16128830f07ba6e79840fab4a5643279d9c645f814a37b7f4791c63d4e3abe54ee3b8130d3fb5e8441994ab1d5da7f8b13ffe0f90fbc63e131e1d3bc5c8d449f421283c20ce239f68b43b5dc6ad3a80fc1737356a5501f9bd119e85a4b7191aea98389c5ff7563b8c569efe5f9d06fc9fec564fc9241f4f30b345759d80ab750001d1946e634533ad1b062713347b83cc7e35676d208dc4b47d4cce71f27f25c6adcdaa4a7dc61b68c4a8b0f2262f614d054c69174ab2bdd91710e36f59e33e450219a640b306683b52592f95aa3cd4ced9d775942cac943af262cd7cf1f02345a20d0f0626aa5db81df662ba1f98a18b58ac140600d58b360b79c92254d94bfb2a52ba478155db95dc29d9472d93a9eb581cb3e615166226938a5b2a2cccdb14ac53a4b1d9d51c1be61c0419f35c0887f3c81ce000b1140ee9119c0d500ca1c8658967bfe377b75cc788eb6535fdaeec046a9210ceeb03c7034416c0e3006e060bb5097c644126c04272ebb09fa72afa4eee80f0a7d26e1347e24ceeeb44258160470a995848f2efc9ef0d0555fbcf52627cc244e83b76e62df6db9b4d27c8153082ba87ab186426b7f600fa5128fbac84098c640686944ad051a63d7fb56b2d19af6631d493170ea94001e1fb2c976f6f06d350e73e4305886f37cf68fb195272fc74beadbdcb3b6dad11f8bebadbedbcd8cb8616b637c7c2b33ff7762ce8c1e5ac72b166e45849f1feaa63ab87d1210c366707a0a70d493dc3435838d72656fc400c370a4b1ff6a6c9aff64b84baa903818112f0648eda4c958471e715f61f6f7cb851e1232c150e9e0d348b6f1ed83c7779ead3ad69701f9a8d12728e64c159db37d774d92d9ba5d75bbbf1752d5ff5f6841fda395e1152e76af1d1272853852b035a6c177e16a58090ea92b3d7ac827cb94d94524b17d9f001627aa27ed5153a0daaad03b20b3a5252114b7e4eb1e5292d2f2ab2d8ae0ab74160d3846d92d7e20e10fbc7565f1c4c69b444c90ae189357dd54a304b79f212d2f462aba76d3b2532c409d446bde91561b5998838872313f90a274c61ce6067d41eb5200", "6a51526aacac6a65ac", 3, 2126205303, 0, "6cbc801ec57e4e04998193adf0debe7b951fbd83db194c54b6ebd0d380d238d2"], + ["030000807082c40302f914e29c147a3619a2d6b49cd96b4f97aac4a335b0961c1ecf7f7af125d99d5d0100000007536a5300ac5252ffffffff1d6fbef690f94abc56ed76c33c46cc526cd8c5fc0de0523835ccd4808fd32e0103000000076563ac51ac515308f1230101d208850000000000056a5300630038d52878fd14f23400", "ac526563ac5163", 0, -1308679946, 0, "49725365eb94ac4144735b0ff05142ce8196f2a0498a851c22ded974ea5fc0dc"], + ["030000807082c40304af7d24a47716a21d99763ffd781dd6005a961b975f877be5da712722cf428c0d03000000015268050fe91bc1cd0fc4f6c430b3193b2ea169f8cf377c99fa42e63f014b691f6adeebc77803000000026352ffffffff988c103de18caf7518db6336d97d0309ebe908a096e8a0501c84045e370d6bd90200000000ffffffff3555daed6eaf34b1a87fbb25736191683a5fbd06498306ac94930e07a451f0af000000000463636363835c0f710131ebac03000000000765656353ac006a1713df5d00000000030000000000000000aac2000500000000be24f6d67610bfe7dab43ad7423d0c57d7379aa5a0d6ed7bc2b2e1045b6b232e0fbe8529a3af1355ac06b760d49a0001a6b83bc9e558d77d5f80822cf0f5fff7c31521cb54a19283cdc82942cb27701809eb9de5596cae32a0858bafc6ddab7c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006aeb4c7a3c6e9868c7fa22e7871c064095d180c081bd90edbbbdbe24eba2bc9d2bda1aaca29e8fc8dbc92291583c488b64e5e4d44ec357c9159db25b4be001b331dfe8448095f4c01b999e88c58f6db672d7a5d4fda5c1dabd58efc3416bcf43fe5b8d452a89a43b4dc8f60948dc99bbd0203670457e622d1d74d78ff28b2cbf021677bb5171e158bf5309d0d4b2b456cf44fded13cffb98a353ac943a75295ed2022ef1540e94d3d1741aff706c7dfb345e4dd9eb02e4f6fe21cb8717fa466d988e0a079e40f4e767027f5add5820d971e1c1b5987f648d0806054bd9137b544d4c0f8a396ddc4313faafc14108a74954fe77aedfa17dafa9935dd14a5badbea2bee302297b987d0c9e398b341b383ed2cedb8332b7d5378b78470c27b63e8e7176354e02153b55461cc9a5a3153f0d9d3d1de6e6a8419d1aed08561c27fb51aa851d75cc021f7292c0432ceab119483479a5ab4e37fc9db301ffbb9fec4d8b355347e2209e02208d27a09dde3dec5a691afc72d9fafa8f178fb72bde78876fce1123946966fe03267dd6d2816cccd32294b59ccc7968364702af8f7803f9d64d4c286b9c1d4d171543fad70b68b8f46c9718b898f2597cf6e7547f67276c0f3f9c446a4cf2b1004bb993e38ba9eb7a14ba8b7913573c0bf77c741b62a54fec0f825ab6fd723af4fbf2ac8d154a5ce21adfd7cc8d90e514928892c680c0947dc343394049b90294fa9d28922e1f8c3475e5d07eacd3dd1bc0b908df8d5ac5215c3bb1c7fd05ec73792c1de4e5c6735e85c0eeb66281a4b83c3ff3b7fff760e665d5c61d9b781af415da622174ca56335610a030c87051a138dc008f13851d750d657213732d9233f4c384b79b09576000792fb64529c159861bef3700b8cb745b320fc06b503de544b83a5ec20bd80021f82d3ae186975dd0e6cefd07dd9a41e3828de7c17d4b5c0526fab5846f310202a7aef89007a89e0192968cfbb9237f38f7f979627f9ebfb55137f56465f200f70887c33161399ba21c00006aa988c595b182e51fe5b38966993d61f0bfc90cc7ac1118a4df72d465cb723f34ff4de81eaccb21314d66c149017900dd8f516454d95450fe40ad4cbde522058494e8a0ca2a4b15da9d5a21d7c3f17c96f06935f9f2392f1e8d5260a6ed67b615d0d75350db63cf32b2605a5ef62c608bb22b6d92d83cab2b0cfd0378eac3d4572606052a2b0e10741925f94915bac9ff6a3b10210c37226429213d10f223ebe19b4dcd44a850c0d875d96e73428aa6f2e9dc35c6bf97c8f103932f58b08077782bfda7fa02a614c4ffe4ec945cf0aa102a9f556e6e62c8bf95b5b7b1ae8b5713e27306699bc35b3cd32b894cb388fbd0f85e35b398f0159de5ba99b681309f2ad0c9144adf89423cea3f7e644106f8452c9323167a74a1f47c2bd190c038c37ea448cb3c47f20812c3e6cbae7aeb92e4c92d907866483dfe9ccd1e8ab76ac590eb76394180a68af96dc61ad1facfb138764dc8f68bb36f517a82259cf941633f2922cc682df1a4dc4b3796cd7ef84a19180d1e1e8bf21cea8e2595e6655674a44ff59d93bc88dec2c0b3877cfb8ae4524ff27d02ee3091c2173f4ca926c7e7ce4916bec0653da3eb5a700c5c04e961cee422d27740d7e93c3093fbbf244f633f55b9055d3d0854a80c25dce7a3cd39f317e6f8f80837e26291b205af2822c9dd7e75e50a5e2159da8a9a0aaad14ee26497b711a054bf670eae76eb4bcd78f9b3aa9b2e8fb10d9a1398bef94722e0a7720be96d0d3db133e702dd7b3760affaf12edf43a064627c272c9dea98c5e99150e2cf40765641221133436e27de6eb680f670f354b21a65b61721972e24ab8498fee147fe283e7a5a2abc3602a2774d7e30f8dc2a7a5ab1d4db7abc853b0bc0fd5ecf21577ec3b2af6b597ef5ee3f7fc9cbf0759c5e354e812f9ae3982d3afe4e60534ff32e6f5676fa9fb47731ba15067962df7d5b1d4baacf0f76b7e1347dd711d440bc1f96872367548971cabcbdd65b1a28f2a8cecc4bb9c70c569dc223546093a230fe77006505ebb948029740838f26620aa5f91300ba797a9aee753b50be09c62347e8e77faf3b342a6055d81dc60c46c18a31e134290604004e0942b2b9b990fce63ff113d7ae1e13935aa55deff4eda6064b327ffd7ca22c0f7b303aa46713d5fca68eec118c588b8b100bd80f0b06629571fe53f1a3f7e65e350df42f43303ed7d4a05868fac2fe387cadff726c379d2fac17802f05779103fc7ecdb038dec9745e930e56d0fb9fa36309dc0100000000000000000000000098c8af62e1d984a8380af0fc856fbee734dedb06b498c7525bedf6b918380dd6445b29a2ee7b6f3d4ae7f1bca9f597b2b52c9cbf0c140667961c744ed4762661940b195fc73df6eca4dbd8fd3231fc8a521351ed258f920a5987aabb3db7581c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bfcd21300d218c1124e27a27f60e5793a3d4d364c6c0ffe88374f249ffdea2a4c3f4d83e841541d23f456fac2c22f8097fea3c380791c5ef01fbc7807d58ba798b4fed07e7c84a5be8a8d4eff2534ee3c6e04da2076035954e12b479ca936c8a200d2230ac02d55e7e75662fdb5cbb8f5c9c95479ce6420c0e77de0750689cf6022e73741d3eab75edf6c1b551ef8da28d61ec36855545043d2c296b627356120b0329418da7279950b69e1267a8d21fb02e721ab32d663bdb81971bf6440466be490a06f860a06c46c35e7c0e307f52faf428a1e514a1ceacc40afcd150515ddb4d8b6e0ff50739c2817f98881e6f9b624bf1c89b019c16b9875f774c41da9a49f9f1022b6ec5f4f38310dd82ae43192bdb080d12858147c1ea94567abe7341a1f28830030584fa4f2c27bb8629725009a91c7e32cb27e86ae8eaae2f647158652a3455260324ef78b40d8fa7aaecc82261292fe3c7afe879f4a3fa17f2de00ac6f4a97fa2f032036226202ca5d45d46e514581cd7fa34f6f593edf2585a09701314556a2122d03271e11ff25ad7354d09846335911c98635ccb61dbc52687bf0876216f293204cf9102c361e4a9700ec7147f3e418c3dd35bed583e80896cea2447d7cf55ec230717465a1df2a90a35cf1d02ba9185fc55479679b8e35bfb8295f006f65353b77ffdaad665974bd97afa4a7d5af43e2b8dd0462f60e3382ec9925d152a2bccb8449bf11046629038bb438788a030c083430eeed70d6b124f0b198950456fcd8e776dd0a02c7c704af6fc599d739477f57ea42266a58884b5fee7c05874a035954763d0da0d8f5755fb9dc6e1641cdecd50bb317888e0b6eac91273f95c660344df08495efc97f410b97cd980130d4b48a9472e6b299027fec106bc5276165ca1554f39e5c39a39865097b7f6c5bcca717b94ccf4b619984670d72e63a41a2a011ab987dd439e9d4fe2840549b3909723fa1de11e96fcd188b0ca0b742b084cd233c4b917c31d6a37021ef2f7d1a50dd8df90a58895fa7dde5de422cb93ba14e0fa763656e31610565d6d24a5912354213a9c97e12dc37d20022960e689b927d313b876dac4076d20ce511bdd7989eed7bb4c7934d7c020077c84fd8896275b044fc8a92a20e800d6281034285d00625edfa99ad297e515ce1dbec4bb2439732838d6b986d1914c7d04accffdc7bbb293a8bdba386344d5d6779f28289d8191e0356ed753b2f538cfd2f997acede99abbd68969b989959fa58d94af79909ff6423e39245f5612f83d7978ac7511fb10418346c03b6fe46dba353efdde70684d6f395f98ec2a635074de8db6f7e7f1cb47322937af18e42104363ba2c0258d4b99d08536dd58a898fd66f6780a587b19b4fd2f6e0671c6112fbf2dd467cc84e131f81327d76342396adf51d9266ae913f66949e76a13f0abd2d519957ba6500b7e92ebd4cb906b3418ccacbf4a9ad87a80b074605855178eea42ee81fb9e13827545673a998837ae05cec0c881020da6e0f7c6f9121f222f5e39200923bcf31a3357d9a7e4ff3987179fa26a99c516a49a0ecea8af2fba7a19d9d836ef9a8419e61a7d487823f0b8b4cc03ed288fda3eb617f7d46f8d3ad097c003ef746adfce5a1fab50bc71308dfdb24f708228275329ff450ee46d69a3450d990a61456982b3d8ab257804314970f0e3f104895d31aefe0b3941f4f90aadc11b104fd8fe57c26b61b5cd88352a0f0ce56a52b1191630013b70ffc1d817e69931c9e5ba4eca6454e5953e755463200707376e0268969d10b660651338dc9e7e137c7cbf4fc78029316e0d8bf1bfc9815be99c058e8e11b03d03b236cf6b17bdb535836e9ef104183660bb3c269d6c603d5aaeed91124a70b024db8bc871de451a44d7a60292bc983c17b865bc1bb4b9f84e6cf23410c3a59620c5910c07aef35a6adb3a0a9f963ba09e37384dafd597cab28452b727ed9459435566125347f37b852d1919ee26bddebbb09ab31dcfd5c5247cc18c8b888c5f64aab4034dc8cfac98f8a48cc81ca3f8bb34793c4f2c91db0eaaa4378a8094b060b7e4e292a78e41edf807f58de9845269e972de666d11be93163ae3225bfdfe8b31baedd44d16d2c81284dad7b37ca4905327ce0b16f9ee7ee65cc24fe77df5ecf99dfaa935d0ee18086be63c8ab8125dae1f0d86fc8ade66da8ad9e022cff24ae52621a1ac4b7e81aa0a2fadf48a33e86f7004b5c7dffc8a7d62ac196f84378cf9c0905269add1d3857c6413529b2f3f25d2fac651aec9cf34dd886669973f400000000000000005a9aaa000000000052d4e2a33246fce5e64ee6c98d0a270e73f70bbdfdd7786f2f365681e1eb3f48b3cb931cae8e23885850e8cc4cd858d4718b5fd907d935fb25d03b70123447ae39b00048078423a011b3d060ee4084cf88e601a5e99b2fad1d4c14d0a41649c900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000232d3b972c252d6090b5043b6cdf8d7691eee3359947152eda7957a861269e8195f9f4c05f86bbe86226fbe5246daea997393d82ee9f90046d6cf68da2066d83b8142b6b4d5493842cdf4c0335f3d3af36c7a0ed90ffb24ab3aff674f32747d1b3f0e7afe816eebf8dc33802672a155e213a59bae8fbcf39d94e708d93d2bc5d021273c6a79a213baea58e24864ef9102e7fdde551651513042d8d86352a17c797020a024b72e768e13fa5b48f58922da83375eda0f379af188c7ebb60ac73b4681c0a03872855005387fcce089ceda60f83c8b3ae63155c20e02b7c2eae43b2b4093a66a4807289009eecb70be6078bc6e3ea53dc2872f67992edf87eaed7b9b1b45c022463af0b7bf533def7af3afa695cbee0fc57cf64c8dc96d9c4ece1521655c585020f5e76f27522757900dbacaec9feb6ef09d3425cf2af6c37971ebcfad995c895020ce40742ff45fb5aac5b12c97f02320da96cf6c7bc1b55caf4b4512c2156ddc0022f94a87b9fe472ff79e94d8131cc94fd923b2049606e62590243d6afe9d44caa020710e2f9e5602192406ede91c2526cd1b6b696afc04a89bf3998a16dafbe2865b34f05ee61707176f8de1b6a0120e6f2c743f15553eac185ab4617ee68ceaca50f3a03bf316dd1e23e2400901c6acbd31e46560f9680c18148a452cebba24284c3a5e576d5b300717808431003423e189d549d3cbe62c2c24e2c4d2cf339c469efd2bee34910b2277d85e5ecb84a1a1c4212af352c661821c538f6cda31d22cdc3428eb01401afa5302f0e299e8ca1d8f60d1f38a85facf9f42e3264012c0bbb90df206e8dc965744fd80178d5ceaf2cf0ce10af40f082af9af2cc40cf0aa001e1ac6fdfa3b6927e4d205b719c711d03cb016808ae2efe9e81382ca5430e4042ba515d8088a3811e20a7cd15a41e9bc157c29c3e318b58fb778969b1bad508e39297928707107e4271eb6885b15262e9c4aeb1fd403c5d71dbecff65383a45cddca7dfee82157680c986cab98b900b5cfe2156a0d8ce9df21a92f0d5f1909084c743ede753b3b5c3f4fd914defb97d16f5f22969b7c2ae8c846da439c7a42c4fcaa19f03a48b7a09bf943a22d40d5e6982eb06b6f61d0cb55b9d244e38b2580b2627c8f003a656769d92294b1a85fb9850493bb1e1dd1cfdee3c7d23a79d123f49bd748444be9575db81143dd99a664aefa24f73f3123f2c0bc6f952197b30e765328b370d523d5120781bce81f72960cbb18b2bb9d9a5eb7577f6c24df2cb7ef98975a3f95dc63184a7cf2662834ff2a21e605e2201fb2014ea57171809a133f956bf23f8f857441a8548c3f94c7df9cfde5338d5c759e0a37c7cbc6bb028184293546b7335a6eecc7ea5669b526330b826378f4319ba80b5d7d7ba1f6d8c3dfecb4722d6db255acd0997ee6c19fd1855813eb1ad17c2ff37d280f6f15b166bdaea570996cbbab053f949cb179f719d13b5922e2c4c8bc9e4ba108fab02d5c850628ab725e73db65c0b7a6d66f6ff8ea6ff98ee545093baf5a358bec5b9b2c2dffa3bc0ac6961fe6a38881da2d7f12f865894349cfb811658085b944bf266c3a3528cda33d573f242dc55f8034142f88fbef07bd23b6a63dd8e6c48753b7ce51ded4cfe30b64ffde409710c80b1af2a3e6ee6b7e2a8e549c13f17633d4af13d0f6d90daf64906d95f5dc08a60c032995032795f04e7873bd712fe8930730c9210a851857a1f83e70665c2ca1611a446d4bb1135db9e3fd7888c164c1807b79677b0fff3ebca9d4f7f94813fff5c2443eb7b4aeda0b125131adc842b7140b69e0d1fec44bde0ac0fdcca8b655e9684d85b49576745117a9de0283e1fc70f4654cd2e64992965cd93c6296f8f18e3b8c956bb5ae74b8b3f05cc65cb84619939939d10a4f73ce4f86a5909349e4a61a25a76723db07f70dec0595f7df4553ccbad389c8d2f33623f827d6350e21b10ef7e997d68377dab55417ece8801cb7443548b86f494f67381f19d829b157de96b4f67f3e758462304788c1b756fa5407a38cdd1754520898bef7fd85918b3ce04b12f4290c9ca7997fe97a4bb9191f03a6e06e7cc3dcf6bc7256611e83217fc4442fd4ed77e89e569fe0febe06c7bafe0bff79f53ee63894b97c4da5b4ea6b5b0d25e8007a4c6d3dd5bdea9ab877e6c9a2898127ec1f8cf12be6bc200a8cdd64573ed68f42ed80ff712e859d8c0803cae08ec4dfce068fd5db9be4f9282c68046eb4145d8fcf913955f7c5d73468aa22855b3a1431a4a4572ffa11cc9b007814551e8b492c35e53a6d0347ba6c6dede67431dcf336d8b660c238ca55073588f0b2bad480eebe72703ce4d41db30b988ecd8518f945034c887ec81564ef3702310bf4c2c21e4d902f2444c8e0b30f62561b378dfc0be65e78b9236a0890a5bbf5ebb3b0d", "", 3, -2118255587, 1537743641, "17db3110fcdea60c990a028c0d2eadfe0619d25b3f3c161b9e3410d135ed2cee"], + ["91bf162a03327d367793a4c6fd5459d63506d08136e62716298ad146d9ac994f4ce37377520200000008ac52ac6363635152ffffffffc3721db41e2adcf18fd1eb78725a215da4950eac7fd8ffc9e34136843408ea8f0100000003516565ffffffff35d9a46103c41bf4f088e67acce2282e7a362d9d975a3c7c7f012e267ae0c8400300000008ac6a005251515351ffffffff03a9faa0030000000001519c01fd020000000005650065520099fc01050000000004656352ac00000000020000000000000000ee957e0400000000b2fabdd09efbfab1cd4e6558321c3d8b16b63ba939b81ec3ab90d09f5c210275044a524464ca5b0bb2c4d078ba63f1112de6bfea96a4585bf95b383bfb9a85f7da49a3da6e43c96966da75ffa3bf346795331419866bf4a527e2404a7a6c7c8c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000efdce4f295d7a748b17c338147ed741cd153c1e604b25971d40fd4d3476229fc51f36ff31c4a123111d73d43a9276e894a912fe4828c66bd0806b8a2a763eb1fa2a2d0d4e55436cb8f7a94f1fac205d4ee5cbec54c65d25c20ff059829fb77e39be9260ecb0967eed05bbd34fc1d18c06902515437c317c17334a94debcdf55403051f61ff23df7cceabfc28fffafed2e3693479c6172f99899a691a79ebf0108d0220bc06de6a43a93bb57267779cf83c67513d8bd2872abbf5cbf7f222bfb9890e0b0880956a14aaced5b5b4c6671cb440fc89779230abd94bd339e1a30c28462bf8115cc393d31704240ca98bfe4771d47b244152c2f3a2583c5df9d92c45dedc12022a498e93743c04afbb7b2032dc04f3bb1ad08731cabab073fb11021a76504255022a9ead057361aae44bc5da152a86040c7754d7ec52c4e6b9ecbf32ee3c47bb4f03066640c6165dab6f9552887cde85f6aa420fc2926a8fa1f5a8658b36fc755118030cbce06a067d86f8520fea0b00b89d0b1c0be0a8c684b05a315f6fce1063e6090227e8ff463db0579ef37f2181fed15b3ac0e22316e6974af47865d3832f7b16f73ba5a02e99519ed4e4b40abe4dffe33914af945ebe4776e57dd801651af58c89372d730ad5f86ae73e24ef7c492d6c1f1fd056ab02757d802ed4f73af07b2dc5eb80099cecab8bdad67bc63f6dbd67ab179acc7c4a9f82cb48264bfd3f5b7677afe35024b31bce184f26edf616fc72642bd6136ae5ac14dbeb27a222be2cbe70a2d3bcd36b0425ffdd7691b5df9c61e420037360cc3c6989e7098718d399232a4e96cb3d2998ce14e97b10573b48811df3eb42a79d4548c2102b7ce603b3cd71af27d50daf06aa96ab3b5a8d266077a9b14c3a677a37718fddc35c351cd63df00843ad7b82c347bfea4686ffa2c1cad7ce584e8748b7d03a2bcf3380662a84286b461881a6f8057c33cc9ab0682021a6ff2e7d57b000939f2f0bdb73de1b90a54ed9da87253ec9428d8b7a4923be980c7c1b845d041e2c61e1b67173fd2669f4137ca2493c33b2cacefc7e8c56190a30b0879d22719f992d25d0fdab4d30d1f2804b8ab89975d57def1badec67a89c3b393d700b08a33eaadcea7d52fac19d008f6a61ec3e8a72fe15155f0264c078abefee2b91ee27d245b5b57db5ea715c0c5ecbe31bf82219cc64190a0406b4858ed7fa897503374787c1ebfbe62e40599ca79516a262a0cd294dd8c6eece3c1a2b018a9575763d5cf6688b5b6148222bbdcc01ac015fbd098c5530f46bd9150706defdf2e1730fb3821077ffbb4641986cf224ab46c966e3a90f685a19a7213e3891d7b7631266c4f3353d546e51a260479aef58a5018c2f2f432c05eebbb8a89d10a6f0b312267d2810bab475e97c880e4316ff2e245be5561205c0076a8ac51ed9dfca90f9ba2e6e76c8bec927a297f0ef1116f1f8bba20ebca313aea27b10f6fbc42368045a3927e29e11fbce17ac6be56deacf4250fcaeec686c3de738c3709b4c774d66f6b44e7840d997279ff584849b6a1a379ca6df898c5f25bb18ba3aec24064485a5c3d1a671d1ce71552101abaade72858251962bbc07be04f430f373f412b6700e5bd12ebc5ec32a05cecc2c1f81ad802d4a4f9374bf0d6855163c715bc63f7a70ad80d61010ba343095b0b9e1b2dddd932e37998311730b12babff029343c8e7aad356a339b24b095863f83745b9cf3773b4c369fa5f3345d41e294621cf4a83e6ac776e03927212dd686e419bf66763fbf2625ac1681cb9cd8068f4dbc481fd5174bba0f63711f3857e93ac39b05aeacbf6dea906c615ea21dea3624347ed64010746441c8cfd77f650796a12c006f9ffed5cab14a7924ecf068de062b258e3a0d8e16e80c08d44b4327a750ecd8b2d27697ad38865f64d2d97104e2b88893f019caac195a2df8b32785e348b3438b56dfbfb3e8437a3525ffbbb46fbcace41a23e92b931f882bd742a7322aa4527fb5045b413c4ca81a8f93e702a80fdedbc40a12ffea1681fd79788ac079f2421bc3fdae524f965a82d99aad00ad5d74674b4abfed251092a9f8bd78ff339ee788cd39810f28c2ebff7b18f8eab35fa32f240bf9505ad3f056f4afd079580bd9358c24a4619872932c4f798825aae81c1e1b781ee5fe1cf429b03455440c49cdae54fc54065b768bd395c0bcadc73eb15f452d2cfa81b2a69662ebc9c4843688b8c729854250f528b79cbfc559c64a029486db192a562f3813caf3234da09bbcd748ca518e86bd717ac8d2f1a55e00000000000000000ce47601000000007b384ee5ba1475609fc4e2d2f76da71d6947723a88b9a47e421b63d59bf4c682f5cc75a6ae0f6f13cc660ee4a9a54dce059e84f149865643bf3b0766fbacb8dd9125300bdfe7b99f4c69c9ce2a0de23ebbbe2bc44b0b6897ee47ad7983277e32000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e5fc7b83235e9243fff1a91f092de36830b24945c4ae59561ff2ca849ed90a78b92127faf6a5de33a571e9461a24769064430ba8c60ddd6ffa8a46a93d19ad9d5b867dc166b4377a09aff8c7c207cf5b9e37928d4bafbf82202dd390374ab87e000964278b4581246e0b762dd27477e1d71b3aa8d9f86e5c492ecbe2d03b3fa03287edf0b54710b353fff8d949965a17691c0884c530a31f39b332b33135fbded0316ebafb043d8bcf6dda0e3a528a3342ad780c21c1860f4c7b3d1bedad01048810a016c90321b6c884f90c96128d231da718e0027256a856e8f8b8bbd88f0bd0160ef25f1b83284f2f06f98b18f8b3e9d78438ecd98fd380c4337393b6f447d3d79021258c44c822776ee3eb1f52ec942f7b503bc62b14d0aea14f1713ddbdba40a450204fa13db446b38a66c55b5e56c9470bd86233ec25f33fa95508e4efe6e62322002014b1680e8a2cd7b1d1bc96cedbcdc88ec5a2b9158d507334a9b3db4c7266a5e02089ae65d72bb03d61fcf3f627d3ef5c526b99928e6549e5466a5a718a32222c0021e5545eea5ec80e733f57ddcf9cf04c22aff3aedb00117cd621dd1413386252c60679602312a24b0c3da79dd89375001894ca9a78929f9afa4b650dab120d58771a7ff3337fe9252fb77ebd02a7333d188f20f5a1d8963ac48f70ebd75c2d83d80ef56f9bc3e948e8ecfbd516af02dc975a3cb0f256e79f8b9f23aa53008df9e4a232d767733b9cd96f04bf612d4884519a7efd19e1558947aa3c6c9829e1440454c57d9db771b2f73380220a10a7823c918cf0287f554676c6ec32b706f3f140451f399378a03e48ee1ae0e3ce043beff782a4c5b743bfa0d0df88eb4b4db1ad950e92d048336131aabf39380df9cb176359cd4a49d6c45c1c1f4aa0b4ce5ff1b5180130c200e27cdf68bfec6cb5e07b2d16c4a41b7e09fa7c7e0a5cfa76e783edcde0672870f5832be565556310531e340d7b6a9a2a934ed08595796827f70c99332564f5d24f84284c3e9fba16b71e489f966dabef3704d4adb8aca60ce1bc6844780993d52931214454df82fcaf581fd48e2fc2709e3801e9afdc74d2e481160b43d4174bb5670d0bf81568eb93f94d21cc9254a74aa2b8de2945a455335d1bdc5afa25150b742ce37df57dbf2c178885fe951176014fac74b00f9f99bf9c2ff872cd2db66a45e0d761757c29760ae70426c48f358536b3637ed4cc82bdcd2d6d2c25c5a23a2fc742f84047273bda7af3cf0c5996b05d5045c27bf788b7b70b7e2783455311cc6a82dd47a03d4a40039591e9be3eeea8fbbc230e18bb804987086b4c67f7a1e190eb73b58715fd46bdc2033f9ff4b29ac04f8dbf7343af50fd77c4e1ffbb323a1a93191b7d8ada6c5049e9d09f8f310ec3cc72ba2f3f622a65edb442324aafcc74c554964ed7ab7267334825d7e4ad5817b6efa17530566d590c826e39595043f714bf47a10f978e57e72c0eabdbe537a0551885f807a1aae48137f322f6f517ee64462ee714894b4db1f610265a50961ba0c3d36a4a91f6db27c3043fe7af7bb0cc59eb1769eab42df15f50741fa5efb60bd69da7d62143f0d37052b7bd7f5bd1aa3fc886a5a5542089d64f46a586186a3f2c7941ddb380bf73fbb3fcab62be286cac1ab2b737c33e1858e60d970651d54d8414ef1b45ce1a2d278fe4f99f0d43bed45fc66330d8e22b860fa96850265c5a7b8d97cb537a24fc4ab20aa6bea05a79ef7b95dfd173f96cc25f685816ee352cf1aa745fa9437b1d983b82daf26f6dfb42a5f06c742b8b9495d9dca4a428359924a718b982ff383ae2813e12102f87058e78f5a1d3920c1c3909f4a9f46dfe37ee6e6d36c0baf5339eb702ee078587021c19065f9626c9a8c18b5e2593f9bc8587b39c3c95acc4339160f43848451c4370961a1b3939257b68f21bdf4a2830a99fb80f4f2c31c5caab6b6bf7b83a7fccff456593d59990da046c453f2943fd44bc745049da50eafe292776400470f32c1cccfbdbc121e3ae0be950af5911ff8e5f4539adbfe77260a1e901f8f479e000123f5ca9b87ef9900ae6573b7801cf5fc5a904d7475b12f9f47c104b2444d46b6d31aee1784c44a37979d1afd4dd0cbd50fd84b2d15bb5aeebdf23b1d42f3e6f93ded9d1f677a0efb03f152fee8abf6da052931f87e4d90cc18281a394fcb1e6cb442b6d2f322e2f7a17bf4b30b30fa0ad6817ac383189480a2d8b2558163eb954e8f1ed357d2c65fcf509ed3127c998783833d28408fe28773b895b651665c0ad87c8e3abde43e9a2f966a1c5cbd8a00dd2a69360c8c2536f0936d6f6da507db609613f6b05f1c983856d16b351b7ea23915733a84f41be236d3ec0e55ef3528394c572cff987e8af96d3668acac3f1e51cfefcf605605530dab7beb32f01005a486bcf2de1d08", "53ac536300", 1, 1595648217, 0, "4c48bbdd660d26379e52e6de8c4edb4eeffe2cc3e10d5aab68c62dba67c5386e"], + ["bc23df2b029b59bc4f5b8c58cf0a9bc05989c6852ecd576427c24cb1a31dedb5f736f260c10100000002ac6affffffff41461df9a8e4766fa1db421072fc58300822235d508240f293a4c613b90f27790300000002ac53ffffffff01c83a92020000000001ac393881b0010000000000000000064eed020000000000ac37d25d79362f92faf23f395af4e6b78077f5bf1a841e6c93de961eabefdc15422b7ef9a997352c6e9d2513e3e9ea8c43d20251bef8e9e22d6b3bd040e838875068a010a2054160cc2d9a9cd261401c54e1fd64fe449e73ca62d772e21e96000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005d3b9f93c0d2d0df62fc8c649f5892862f6e42c4f422495ad90dffeed192538252dd7c2876830927b5beaf9ab635157bd3cc6e5a017e7f7ba14822b30d021e165add44b8d2d29bd7a7aee03de4b9f7bf52f926e3b345a54fc08df010f054b5fac1023ed7b8686d54f67608e734415ae8732747d8bf498fc5e0ba6556c66a4cf7031b6f3fd8fa46eda56a6f936688d70aff7a88b7d67c2bb25e06f259a68ae761bd030400b585109707d5aa8d404b12bcd0224cd894b649168eab5d46b3e69edc77590b01d09d924c111b79a84ce9efc8a974aa6f458afcc90481d915b6cb02a667ff847a81860fb09010a1aafdb9b38153e9c6c98482954258947fe145bd72529435a8032262181e2cebcee2c92db9a39a01eae6623b8d6da7063fc25a1a9ca0ab11b0fd030be53b12840035377ced19313ce03f672aa6456abae1aca349917e924bc14b320321c2aefe7ad83ee7ea47a1a647b37253ad0b1628c29faf1fe9708ffe9e21d7dc031ad9a9734caa85c0019a0d7cb2c5fd39d8b36a7d3e114441ccd44b346fe3cbbd030eb70496d1e8e47121872f8cd331bf17c92277e7313737dc20b1d9ee0b986803f5fa0a118bf843a4d91a88d08db6cb06453356ff77f933441ef4148a70305d9ed653fe22653f8fb9dd19b237cdd8d5ef6b3018dac28f3acc67f1e0adb787e44fce7453f7f9d7840ff26c634b7a7b0e4dfde476a8ca377c45a32a290f41dad0773c465f614cbc4a7855f8404088276e6df7d217b7273eb175223743efd55585aa84782d6859d3f279ca37a1180dc18387cb8c5fb6d3b3755fd178cae45b74cd6eac7738b589d0540847713c4fa90e1e241885ccdb469847828a6fd4a50bd02b5f02a9d7cacf783b5ad8eb169ebdd445dbe03f3bafe5955f6ed26ee75e6a52ae8d3d16d49916d9e8169c0ffa8dfcc3b77b75e770204c42ce962840a941c463c3b250a149f66cb747123bb0ce65509d9824c084b8558812d6aa9bbc24cc51c45a539e734593b27b4ff44a83e762dd3eb93fed831140886bfd1e96a2cde35b82cfc253cd76f16cb44d8c62c5ca1ca9ca4dfb3d1ccb76ae62d82a5ae015ee7873910a9b5b704ff03cf2c13ceb2ec46d0f4c16d302a97485d17f3cf8cc9e7960539527a704c311a6159e7901526e9f9c49282e47ab620872a70cc30bfd56501d453980e65435eab521b71c78dc604bdc55c49211c1414544659ab71441682012ee38eead163047f1aba4e35d02b86e1e8f6eaab491f4879f1bd571a95bf09f5220524e167466d7250f1b72138d97418ba1945c8e5d6ca013ebf7efd3fdf4eb20be6e7760f2d67786778a8d878bb9bbd8f50c92ff404545a8c06baa36e7c9811bcd6a2fb7bb3e1b15abb3948bf8d7bc66f551d1a5e3cc7f2a4f53a3cdf449ee7c5372c3da343c1ca89f478c182cee07f41344be56a6b63d347d9beb85503cd53e889a55fcb9f20fc5789a83480c8bcf68f241d71ab99ace4c20f8b48bf091ff3225d4aa2503e1aa619a440e96a53002a385650bb922ccc58d246a406c01c0e5b82eadca4bbe8e82ec92d9f30e866526c3f00041d17d7e3671fd6ee929543a53bcd08bdb7d60bb9d4504d39a4c84ca5bbb8a1fef106df9f43ddd2c95d93af260a1a0449ab7a9884c63b2b4ce8550b4d7b2b54fc702ea624390081d5a479dac7ae6c5a0afd54de2c1fa9864f47951171b0bb87900982f68c5224557bad1ae4828932aba298a4ad6a4be48d404329ba9611e9e583774076a313e804039b478f9de073e2f23151270ef47985e8fc1efa88a7ee79937e6e0f363b6f58f276f799147f4801249fcc9cff89b7e5107bf02d6121b5adce4cdcb95f03ecd8cc84ee43103caadf5c26d903ab4500a071140201097fd56475adc40098703002406d9126d4e004c926eb703e95d00b16ec21d04e64d203b5b4a4893f54c9c6102c9c2ed3a618631212bc9b365d57f0b800a04cfe8db57395b46055d2c5187e16015016db5300781275c587433b3960bd47f19cf34532ae7b9ac365a405f5e0810129830f02b3cbe602c7898abce2899e437cb8e0d638540b51c816a7a12adc3c4feda8784b5742cd652842b70c17f7aefcebecfccedb35f503c8a2a0ec14ebc20a1d6af27de0548f9344130ecd3376cdf70801da160a9eb986aad85a3c3075cde895f4c361faa61ea6cf0a4a4f03ef1657c6b9e85fa371ad3a9fb309ae585efbf0a1516cac532b39bdcd2b28c50a0ca272f7cd2483f67de8bc3ccc5c91e8a3592bd0435da336ab0e1760c36f4aa2f0fbc80feb54c7ff9bc5509b95afdbdd6102795982dcb388491526fba52f041a464807f9c8c10d92a99a7c5c35f1dbd43a4f8df2ab43de04e982f1ff9934ec89dd71036f0ccc3f2c86b607951502ffbaad06edf4a2d391d7445126316a8b4565f79596a1b71cd9fc5a6745aaa0e", "ac6a006351ac6a6a", 1, -158057810, 1537743641, "9938317ef35cadc6e1229e01fd07a7dbe52fd5d23abb6e6903d429edc0cdc1d5"], + ["2da3be4303e1ff7f1650734b59053cdc10be0b309c02dc2f73b780b9c3525e2013d35af358020000000765ac53656a5152c7934de9d91ebabacd0050c07445198c93a29291cc47e84984016f65ecbd0a89e7a67e980000000005515151536a3302e5248f027fdfb59c6f847ccc870c610dccd8a854113f18584d3f9bed441ca81816d70200000003ac516a23eae71902561e4a0200000000001466f002000000000351515200000000020000000000000000f2a9880000000000e7b5e07f4fb9d83477fd594b49d44152968ae97d7e1b2a447699c07dbe5364b85bf4de6399c4f820bbb6095ef652f8d80b28d5f3a996ae82748b2565545b1a14e1c7be70ec285b3657fad7b28fc111b8c556d925b71ab59fbac59124c3f7372d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000927dba415ea5c969df51a53fc9cc579283c67c2f54f8c7b91a776f683a5bca570d421ef9dbecd59edc77124699de1b1c01a21fbca01bd154f23adc86476253d80b326388a394402a768f87109192fe47ffa0016880ad5cb8af7bbcbc5349d96c5a9be43b170fd6c9e5af249dbe118e16875ce6519815b0ebb716b2be5398054203222188b036a9579e7baaa31fb7d2f74457ce64ff2631807123602e1b3684e54a0314028181a0649f2042b1ff3b59ea477dae8f4628864e37e737c7d87f2bb8f1410b01b2d459d6ba05e5ee046be20c567fcc23e9be8404a8a8982e44e80c4945d525afdfb13555c971dd590522fd031dc92b3cc54daabe4df9be144a6d169702383e0201b7056347935875c1b3ec7f84c4aa253518c73d709d12757713f975fb93fe79021828b4ff73f4b547b32f81d2cc17d1e00dca14220cb40b9bca2fd401157722e80315e2d5f6baa44c2fa4582551b830bcf57ab1f8275bf66f576afebc4398f8d836020a3d0e94c4eba865705b86f24656cdd00e6a812930153cd8196b630136d1b4f2022a08a6ec5898f96c54207eca0e737fc9c7f0d2017140decc5169b2d240ffcefd77a35985f5bfb0b8ade3cc4650811cbf3fcaa8eb640e726e135096271a6a7bcfe319e8bc18a886bd9d9684337a41d63dd7a985aa78793213275bf95ee93bd9582e57ab4b46f8e1a05f54fd2301db8ab0cc628c0847e55cf9a35c5712607cce161b1256be3b907cfef6accbccada6479c062a16515e7fd8cd3024bc0ba2142ccac817b665cd5950211b0a77dd92a7b5fb88f6729fab69b2a221d58a00357b88807da1bc6efa47ef25d3c046ed86257806b0badaf7acf0eacf70c371c6a45422d35d936461a27e4d9a59f3a5a18bf3555f51fa1c7bbb3a8b2dfb4af2df0a79550ec7d345342b6e6da16c47e57f0b91b44b536609e7e48f8290dbacca28633ebe243eb59497204960aa0fdbd9a871941b7594ade2ccf15433288b7a86f0f2f273226ac815c2de968d08ce97c8f33ca80bdf8fe01c36dc729a0cd797de3040ec0b385b7395713c4db69744f2bc05cc6cbf016d2deb3333da917f920ea6a1d66223764bd7b675963efd23b9b9ab0dc834901be3f8d875fa2406b3ab13f1af6d20aeba715cfeff6b7d74610efeba99db1d5f88552f622a8dffc7cb5488e3d28165d45b87339745653961e5469ef74654c2233858690818f22b0eeeafebb82dd2002ec7f71f193f657dd21267305f220684983538808f9c0ea1da0d2276c1e7d84f896e8850b841ff72d5753c06a748a5a51783a837f7bc343fe696fc651c3b61454b1ed186dc7af289ea3de26f706a845b4515dc123c6bfbb4a0cd22bfddaa8ab801d3df974c631db0623bf3b71a54fcd590ec0b1af245e8dd309b519b193d60b61990af6e244ec002ee7dcc3f6cca768611f852f3ac94f28370eebd00d1660e752d8b06978aba1604808022dc157fc8345ef1fe5f41734bede35163b2cc858821e99177f02e69b6825b8ce01e2c99f201ad179e2eb909a7326188b649c833e780e8aa2a6f5795f7556be5fbb4b2ca19f969a8ea68275bca29cc4b39e5e3ccab251b8f0e6fe405529a108d0a1f98de5579fa164267d5932ebe929a3429181d05d88d6ae797ad1676ad9cb11c98057019f617cb0bd3e5eb57b94f60f7e05c308fe0850830b0fb78d4ce67bc516f02501489d2d9c1258d7ecde855d77fdd7ae5c0667014c5f704dbe8e184bb2462746178fc064aa4b188672f8b444cad8ed9bcfe504b462932d6660d08a3fb012f508aa7f92e882b3c7ed00564e28653322ebbc32c42589d2426e67fa26c7ee034fdd025b2ec9b533ce1e39b202a7bb22fc36ed020ef67f8c3fae5ab4b279b990b67337601da7df544bc24537d0ae6f7c007b27ef2ef93865205ae5f511b858a4c4804671d2b41212d6d40d5a510205e755c2287bd79e90588157e40963ee80cee98739f709c2401a6828f929b4b5557bb6c7461daffafb16789de5c7b64dde96bcafe5d7824fc85e15ae70a22a1c106ca4f16b38df833f9a3b37ac703350943a7f241828eac9320f8213b6d71d77470c3294f8ff0756b88ca77634d3cd53fcb2e5bfca99c20b5ec4f5c54de5aaac92d0ae9c86f08323ff7b63b0d70daeefcb4eb9f572017d07ad005b16fc99ecc6c700b7b5088f82092df124e4765691d379ce83c30e74ea89172e7b9a699c14f0a7d8a1194fd9fc0a47bc40da1ccf7b21316c578a4f56297feadc3c8af70d5a71e64273f7bebccfbd4209ccc4db58368ce7864847c4e88401c1bf2000000000000000022e5250000000000aad986d35d193df13166f316a05b1d28ff015484d71c0164b6f410d1bd0a273373d2e2fecf31764476c4fa8d680a5aab19c4410ed3383a60e76c8e434405226778175cd233f73f103143e7731d7c92cf7407cd1e7dd6536c81dc4ced94b3a4300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011ddde7655a0795056557dec1aade092c8b144e03cb2117f1a5592297966b431057821a9e2e694161bbba23e35df8499a5f4b19c19df403851b66d66b079ce74edf3a746661dfe6eb850ef91c36848a04b291c4a3039b016c11539b8ee871bf76f0772f699faf2ac3544e99be7f7575be24893599c9a55d00b5380214774c25b0228a89bfeb9c60e2de704afd06368b01b401246461092375a7f0fc5de86e21f450229766b45de1685a055f0ca826b1c9fb2431fe8391e61ccb6ff405f9c510221810b088a5b3edb012adad3704747581a39d956f8a3b7ee981e5ede17a9df2fac7045cc8dc91e492ea30dff57397a2a551f088709386948564c5d5eb2cef9f1776b5502196b4f67f2ef426314446f11cad10d2a7a3b94529791b06c58ddece6dda18912031002b58b4b7581b06e1d2ba0baeba5e8689a9f08a376206a06c9f7bb7502fafa020deaf3745ca026cc7f765a71cb9496ed8e72056a34c9be442fe60c17eeaf38b5031cb541cb98c351b0e0941276831697cff31f5311fcf4fa563a46aa43180e596f03045df57992bef76aa0899a940237c314c3099088034954a3c8e399d759d5a1a0edfa87fc1a15cdbaed7667ce3b4758c21e1775de034419c6bd097dac40461484c388ed2538f6b80e11225db50f709a2fe753abdf0d10439131ce9dbe96af60966980b6c24642ba1228b9bbf4f98e1d8c5e3d541d83fce9a86c7420a91c5ac2c7b8bea465873a3a0a8cff481f02363ebad56fb3eeb3e3277dd036d77df95da2811e917dcbb8ec90958865e12aa7569088fc74d0b29bc082e8a7c31958d8764ad0bc98a4ac0ba5b8658e7b0c14764ba531da2b279d2fa674b779ae663c12d5cc2fddba25719f0aed22558994cf79582f369850603c2eb93535f896bcf7fbc171907047eafbc8951910db5f6f5f78f04c47cf9a7533d24a1e7eb925791279a5c9b03718ab6741762894f99f46eda61dd393fc3d1022b579bd2838422259db18008be001f4b9cd9207b4fd2aa6e639dd35397310ded79742e12b3f4fb11c192b8e079616883d83b71ccf636dbe3a18a5080fd4f475f2cdcd2be1c5a6f48ce4ba9046bf47d14edee0478855c405889e680bdbed489bc4974e14f5c5030ef510c07d6638ba7b59d134a226225f915f75f79e8237498fff54a6b0850a0e76a64e911b444ca37b4539688624ed6070293ba0de03c59835bd3cf3e21864861171d0b05ffc90b67180569e1a41993fe7097c5d54442ba485e98a8e88d4d998f32680961247a7c0b69ba2d52b58a194b6361518e263879150b10e27d0bcbefcee01ceb964178c3dfd4b4069171f3b09bfa86f3f33c4e6216680a31274c28c7ba3fa754506371327be35b04efe872ee4ad3f1f1bea80419343a6f92eaa6ca00f793187f5a34a7e25494b616f302f6384cdc7581a89e0209e6c6b9a2ef0ec2e2305b5c02aa340f99f905bb8156dea3e352c6db2a642175faa9c5374ff620b2f794cbbb2404156ee8820ab2eec50f7426df149b893c47d353ad6c9a9847a5703b637328543eae4d987b6a783281246f1375e78a604a295dec39b3635649cbb21671be111f366f8860bb0dbb1b4022b3d41136790ffc0c14111f9257a1ecdb81994e80c86532cac8ec1af22256a9ded0da3febd6cd6bc6ba669b1907420d375f5d2ca734931c92981286216499bf6dc1b762a27f9ed67e9b8f7b82a33f459f67486706fc78e0365d19952fb43a147df736d659522e34318f436d664841ae4d83496e617599943b048f751700dc6e020d63c5f2875126b04e0680c81d27ed321b63267d0bb00b655d00ece21b595bbc540a52ddcf3a7ea9d61873c7b494033ef8f8332a60547fe6d71c1580fbc74e7ed4118a8aaf80ac2641fdafdd6c0703711424f5e6be7bddf20fb15a8ea020198cc693cea4fe7641e3fd386d7225142c6e9f05550123bd656f3f270f6d0b90afd502d86d335953af7d17cdc96d48c89a2bf2cb76fa8976e5693e42ac03b840ba2ed1cb57a8111c0abd9eed5bf86265621a55f1fc4cb80f181222c49917e69a85f027fcc2cd0218d356f13b9d5f33688caef6f85e6ee64121705c15d752745034ecf9c53262915ae0d3adf3d33f512698b114f2d3e88bbde2a4e50a5a4b1f4b36aa9d64e7b31849d7ac9d53d93e46480a611bf27e217878256307d735fc0296ea4ce2aac0eca96b5565054c7cefe7e52ce603b61989724960cd2b3af1c859754b46be78d9b25f94d92eba6d412d83b2cbb3bf5f05ac25c89c57f992af43e7a793a133fff4d06b3c6895fae7b36f68742d2ee4ae2660a330fd47e59e20f90439275fea0eef9253e1877377910565a94b321d52f398250090e1f06bdc15228eb518b7eec5420ddd5c2ae046baf3ce3740437dcd16615ea37d922e456f47ba4277b21403d19a6c77eac7b81c509", "6a535265650053", 0, -1657081709, 0, "456932b184c52f860e0692410cc0e8183639ec9651296751a1e68a3f1878cce8"], + ["030000807082c403015cd8aa3ef532a26dd14a96c632389ec3087ddd11199dfcf2d58577e5f60bbf40000000000165ffffffff016887930000000000086a00006a655151656dde3dc64bf84d8f020000000000000000c38dc005000000002eb923c0506da12599207c508495600523d22c287161ff8618618edab5ec3a245943a72b8044f99e23984d921f0bd66962b34e91eb23340c3878ed7f72b90520ef7fcd48314bc49259fc571f43ded88655bd169cb5bf4789eef7ac3e0d42d011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d1faf2c8f80e783fd3bcaf5264675c7561317473e87636b26c14708145d84200616706a342468e3d0475e026392f1b23a6e723f09ab22823686a82bdefa51ae05ccbf31984f63b9f60e0a1ca59541964874b39ba2d4e5f153e55b6717c75544c94ef813d304c93d2579f952c8941d9d2bfc1cd96ced086fb10b70a9739ae50d0308e49fde9f80c16fd1a27d676f40e1d029c92824b6308d69c89bf05e5fc3148b021e21030d44e6d30dc4512ae6b1f0d9770b523920793336ac21f8d461afa5b61a0a017b4865f347d51a1825679cf9e8c05a6b862a25d42fdf71848a69b29851957972ee22133600156c55acf31ac9a7c9253cb33d1e6db52d1f90c1f3646c073c02022021c6704eeb0b6c576dcfe469d729355273cd13f64235d8d88e83cc5e273e2603135beed1a0ddc15f9def4d485e9a047b285793efaa59022f455e4f0ee9223fe50306cdb04af54a77bd6ac8f6fd8e1c72b031f376670e7e46e4f6c2969b0749e628030fd920ba7909a66af0f03f9f6df5a7b553076d6b3e0032a34d17d06778f83e620314643afd5ec28363673ba7ba19a17f9491c90a2e6afda061bb5174350de4b7966c81a149b203805de1f5eab3addf9775707ca85e9b9cf7b2474a55c664117d243754624a2ea695237e3b68c5bddd28430a739d28401e3c7e123a5e067dee837c55d0660fe1c9bf378b14850c26242888e58c38be417e0293aeccf5e14239f27c24547fc915652ef7c01a1215662adb3da539f2d70d914cb260357bcebb0625bf4c05f78a14d685032b12b2b08b9574f2e89fd21667e0e5151177f4e145ccc3dbdd1d6b3a7c67e1a8103c6e1ca771e6a81081d7183c5298b420434b32aadf87d42e69333b8cf92c022ba839609c0ad45703276751e91bd432986c163ad883398895162b88a9b662ed77fd587147611a9ddee423469c655c40d388e3fc89a9e71360ca532813f96c34a27158b45198f02f2488071e78f88d9efa08ead380dd00f5dd10c9d6cea56105d20a5e1909ed039ed7b591d9345593c93391dc9949317e2f7691b9991f6168a306b134abfeeace7bbbcd01107f9520d660f3bdd0e8a740c04ae02bcf2fde9d06d6215285b1ddc8b6ec2abc5cce9b77efaf0f379d7c22773e0c599ca85fe5e1947dd460eb30aa7de29eab806058ec6f01e72478fba96ecb8eda5b23105e2f4d0e99e77e2938203f02209e5c5aaf512b38268e6b0b84bc42de2a0a617fb3fc3882e3c7ed1b2e4910b4ff34206e3d67d4fc4f37ce7a6732f82c3606ebde9339b68c16e50e85c08d2696d3e7a5fe2876e257f91f54460322d04c8aa8e176ce8852b86cf04ad272d96060e010fdfd02b5267ba109e9df226b6277392e71cb3f0aa8f759c645a716f67cd578e0d57d1c73665395c544861a64417fa249f6158f892d1acc3f37024786ddcacbad99ee1c85574e25d6cf2df4d5dd990f40bd90aa18b8d6e15e7365fc3e127343bbf9b90940bb9cf1bbaa19feddab24e63e61a689a6101cb0b9f340aab4e1faf054e78cad3258cfcd7635b8e4935d0b6176bbbfa677986b46a3978da3372185b5cb0f9c942e157c1f2a1dd8499edfd35a7226806b3ecafec8d57eed0cba17188b7e4e277870c9a07ee8c9e4024bf186558a9f63021195672d19eb64d0dc940e06fbbd49fc807f43fb02aa7b289cad34c571ca318932e3edf450f1534e1af65cf9272c3f5b71c3c004f6625e3d4d6f08671bece34566f045b2228a39e39da5e8e2e0554ae16aae041f0b4b02661f416ddc80548e4b56f27839deac7fe31c82377793ff449d3f03815e3b3eb1ce859aa2d4ff846f1e306e0f1088691281c1b979a753e0e9334d158e3c51ca3d925fd6b62aa873071363f55a0553f41f351877fc66b0dd4b7906f417d5423a9896dd7496e918923885395bdf1d416f4e3502a3338785f1a4f6e11a1c818d8c24b3e96912a2755567f6931a30c1a73bb126e540b28768f6f7db97c4f11fa6f04bb9334d5ce0aea1208f645572a67b9b6f4450edb9dea2c4d251a7f6c8dbd3b95877f40c27bc660e9247faaef1b621a1ba78035bb14b109c9839f3d8aeb68c86ce82ded41eeb71c9082aa08bb45750b205f70e0e775d59214d4af75600566fa495c806851e83b11b4ce0a26dfdd63ed21a9a2a402771ec702fa11781804adc27a722e4672fe8101175a4ee721381922b46e480b2286693d8035fa05bb10617a3638361bb66cc9e628b5da4902d447d9d05a406652700ead9961431412ee4cc4a783012cb0c256dac87bdd721292736a175c9f14900856877a21b00000000000000000000000000772cf68843066f8bbe96ce9aaacb9423fd10bfdc72362813742524c4b3aeabce94ffdeaf646babf67bf5f6ececb61e185fb160efb93bf112584fc9c367e7e4a6cd265b0c9c4691288142d1624827127def7cfaec4c2839a6fd6bf87f4622725a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c4ecd0fa650f1cf831a8aaab0f80a7b2637e60cde66f595108433e2dc4f3b2ab10b7c3754fe294e31c3c09b94ce2c850b820bc64d5ad017b41f460d0719e2c35235be3e5eea7783d87bc2cbd13288b080f5f9fcc60e736c638f5009e00cb3d43a0a111d3c2f534272cf3a62a1192b290c11071413c57e2c3913e0b1a2dd5a873031e9a4aacf761b4a0ed392a5dfbeb8cc5718c5967da3615888a51b055f9f92ec10324f584ba3e0c9881effe2921366e718552fef8346774769b145131bccc43edcc0a00d324277a7c5d0fcba6458f3a6529beb72f3df4e1742cba6157710e9eda7cc358b1fa07b61dba5f31c3c55f4871f954191458a37868585907a7235529f973ae020775b189c5d5976109b93ed962ae5d094ee28b2f7a52848248193c57efca6a00020f2900f5911ae98f59d8a5ea7c081ef5a4aeb50aeda3c2754a5c64fddc56a1db020a6a498e970f73af89034e187b25a0fad264c1135808852d72e320139a12e3550314661fc5d3b947310bd0f407f4941be89a3a73cbb0564eb525766ee7bb64c9f40305bf2b735991cf8416044f52fbfff4b25e92b76d5c86f213179a79e8afed74304dddb802a67bd94d47f1e1901023e23d2e4fade4093d6722896b6c75f44da02719fc37020d414ad2f55b7e22658dffbebf76dbc29928ab07798bb9aaab666c64daae412629304e3910fa978cd70198666cf1056f78a875aa6be43c6600a6bab8861d6bd9bafb95ccfbcdf538cbc9a19409db2559fcf1260d988662244ec9a8b8d76629320c5aff4b45e91b2f44dc8ef87634cada8e1a2967ef5f0fd2227f5081ff6294894de1490d6fa2af988381c15eefefefe1998f028f8b2bb25912c0a738ed594733eb69646ea990ed05f0ebe7589f57707ef3651fb6b10443a235d89c64fde5215f01028daf476d2150e130d9d25397015d1f08a8ac40aaaba54ab67890a33c76386417f08059110b09c9489c1a8839fa458a1c6b2dc3ed5b1cd15aa90736a9b3edbfe6c70a734bde897b9a9e7c5491ec912d8248d8bda15dbcc0d7e5084f49d5e0182494b15c60b930fb04c323bc6c074ec3b0841975385765bc323e44f4d5fe67c6b9a1d6add4725a31702a6e4b6679585c41d9b201da4b6ed3fafc0fc2e74cd0d1f756a97eface9380e490627a54fefa9caae4bd756bac4c7afed7d021f95778b435c98efa2823d78db92eb425bb1508db6669c3da2fd61dae5d043cd2a67c92b4be25dda437c46dc6087253a81e51c7d9d0e7ba706e90206f542b41f5b75f0bab844d9db4bbb1c75bf47f91d35c84ccedcc5d90ddf04d981fb136d00c7f60ac1ce6ba789da3e8ae88d4bcc00e6839d963ba4f9cfe063d99efcf0fa7a91e28f85a55d4bac2e670a7f7854b98298ddb207ffe5da155f4f754fa1f937f43fed33624f3851c8914f92dfabae63533f4c12231dd14d74edc4923da296316aea9f276f55f176720f4d8622f362231b79cc876ae5266899063811fa585115080c8f067bbede8e99a3ec1a0359cf8361d33cfeb8f58b679a77bc7d7ce28b102dcbf5bc69f656646e7a4246c82c110d54b9385ee57a51c8fb66a5e9508b4f1e62d55697da7748d5e33ad4603155919e92360d6e7fe3683226da728d999f7362c30e479ae117a402af080c5222c441e49f3da14e359d45fdfc24f455f9706a6d3afaed7cf7096c645e0848e9453b441d244c3b244dc7124c8bf8218cd2d9608f0d36531980a509a433713f9c62eba74bcd4c7ec2ee342d8ca2be77aa84da7d6f50906a5c251a5f492d78033c60fca0a6ee28a43e45485d2c3720a560073e192f9e8a93e337c895f0949afabf713182e1092206f1e4b9a1ac1389f889978b416413ef7a20b7fed3a9788fc903324cc17ba93eb58c19e5d6533f8b73d44540827e58446eb604a0fa0024ae837dc6e15c54aa5166a029275d5c8ef6b91dd377e6b07b1fcc78bc8c22cebd742f87737c252cfbd7657b2ea10296667464237bdf4ea6b852dfbc6a40026d5c72fbdf1efc15fff0bf15d3c81fa45eac79de7aacbe9cb85380d39af0d98fa369bb472483f1b394c0bd22980c8de91524474342966332dcb325e8dc238eed5cc3d95ecc31b82f86a5ca9a34b50bf0e0e5a3e4f612a8c0fedcbb94961dd77d97a9d0b98b35463108e34d41e20f1689e8619e76dc5c8319862138955401245625905d4ecf48ba98644297c49aff44961a6f32bd6f3db4f46c2fef78e394769503c3e10a685d3890d29bdd5896831ae25de1c7652f290f8c333d52f0dd65f7b4012e485c5012b6dba3da514b67d4d0f7f54df5f84a7e24dddfc3e4736743f4159df9b5bd31c3fb0e8fb12bb3731b530aa813f0efab708c81778ae9bca9d4b400a7e33272660edb2485fbcc934bea0bfc81cfedbb2d33a7bbb4df99cec92ae7cd52f5912a055ca1e01a2790c", "005153525151ac", 0, -56721546, 1537743641, "46ba0f0e4a3072bcd842e2c83f81ebe0cab8c3d24ca3757733ea716b614713c9"], + ["41aca02102f5951a2f1d19c3bff41731e78868a07d141e1b0cbb67279b37435383503206cc0100000004ac516551ffffffff09991956f436c10ee3e1db93510ead737be05de5a5165dcc6b054b8408cd5c1b020000000665000065656a3faa844104ed991c000000000008656a5200636a6552d760a30500000000046a53ac530f34b50400000000005e347e000000000002ac0000000000030000000000000000d04c4c04000000003d6d61fc82a01b9cde747cdd1f13c83c00b9133fb46c1698aedb048732c81d2582c0a9f0a823c03c8dd6a5f3a7ca905f95d0eccbfb1745794e81702f6a462dd93c796cfecb2a9a24bf337a82ee1c48bbbfe19260865cf9f0adceb350eee04e6400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140dcf0485d845aeb72ce16a193385da67c3870ec0b1101c4365f99d9bda773718c86a28c96e4a593294bf06c2fd3e1449e105a51e681ced4e8a8584549e699c5d485612d97dfb965ba740fc95e15562e20cabe17ba2bbdc789cc36732e6584cd91802831030622fff26aa2cd45c21d8ae463489bfe2ec334b3de900bce0e9e3032c12b7caaec45dacadb61f45214cb8a4d61f548dc81c210d400e792d1e655d080216f77bdf2284c82a4582a25f859c84e5af65dbdc2ef89ba68c345f5ce169aa330a06c28c51144109aa79099332e21ca90b3418c16b8b2e3715396b4997e96485073717763b1af53543560c0e26b99c2b5fe451c481b203819e2404e0e529fdd90402190a67bd91e744939eb2ed2dd086b286baa6596c0ffafd3a40ede24dfff150680221b715121102032bd9d0d94d95f00049e2ee6b2a74bc059c15b5d82a762ab83003261308837499d75f2bf987647123a4344a222c584e49e9e1e17ffa97d460b2250322fd3b3ec8a2d9bd7fe792f94c644bcaaf216c41a9d55c5418d3f859115d20b0032be0d9b8da962d2f34aece443f0d36acba428117a6cb77016528a5d19f49c97ea4b2fb9b527af089b936bf61e76e830477c994c8ed1c902467b0c32c0b34a2b0f971201bdfadb5d74f69d13e69b445475b63804ecaf9db0366703865c52b0ba8860db066ab77e4f564ddb5cf2f0bcb01ad1e5694a1673d3e2d6a9b5927dac7710e30d0cc336097cbe9607613f308e6dc8d26095ae9ab2cc56e2927558290c22961ba062f3e3a2bd6afe379f06801a60420fd96b884ddd9632b7e0526b616553b133758d2c1f519f19eab36953d6d51474973420d08f1046538c56640b4b14a0770dcd35e0d80589cd4b12f396d5a8b624c035e1e7d9e3da22252b76f97c2eca1a3a2e630d682a660aeddf818095313791ff8137cd404d3d8be7ecb75395409b87499a23dc1813635ab36f151668dad1ad9d73359fa94e1706ebd82e505f80cee146384bf6593979598a803b08ef4c9081a3ace1955fedae6db604a11cdb3800ad53cc8691647a5ddaf19213271f7c123a5fb19a109c948e84ff8fd239f4bc38374fcbb2df5776134014ed78c0a7ffaf8401ddd6d5b221c487079d966e459fb984f3c5372f70d3c8fbb7046290296fb749263285e7c5c177a3005cd3bfddec870b6d84a60e896b9f998f031a29f91f946a12c9a4c2e3e1f556ce5b5616d027b453dee024d3aef03e4f3c265197eb79a93131c91b6955a5147f2065501f981b344ac1f29545d74faf8774c420ca8661b88ca18585ee610a6881c1756fc805cd10a388e69904c0a7d82bde7f0671c496e3d52407979a3f8c1ad83025582fa804cfbc4538fb516d3a96631b12a7d1fbc07f3c58d5b17e81511dedb889732e81bc94cfcce828f609a8db5e242338d9158720d64b06cc35cfcd747d24a6031f6bb4cec4a3c206689b3d35db6b9af8b281770404b70f8099d6158060bdbfb0f073b3d8de6afc5d20a2814c04880fc7e82d3cc26ac2993787d87eeab20ecf76ff9c52bfec6089481521a6c7c75d353d9b9a85f017bd6678e07e0bb094ad81b18dc5a3113bbba8664104db0d12ebd306b2504e9b4e2a54bfecf3d998fe543d93ad414199d9e5f3fff7b939c6563bc6dbb1cbc1599586545d2bc093bd601dac89c1400f5a843161503c71f40d015f84c633b0129b147da7b592595113ef1a7c6f8533e9bd21624150570c5779a371a1aa3945a6ba4ecee7521c555c8c70cd70aad8fcdccf7f5edb7e35ee64737eca5c19ff8e15e44b34643cc2dff7c3a57a724e8e8d907226b331b1a430ee7bb0623690136552c4d2c6adce1457f2f49f62d375a247fdb36a0b67ec3c458a8fa0067f28c9a1f2f1faf402d84b36165180eabd6977c469d7f89c8f3370c1fce9ce5d16376737dd5fbfaef9b45d0e301fc291d9907b3f1b4fa9a564fbd5c994d721dea7391349f06d5e1a14a78a83e71bdf5c6d98fbf2d5eede75b6b8d3d70c416b252a51795e912c5e30222b4cfae5274c52514ce439308b82cce8e3e72ec346f5ea00bb0aed798997922991dc8df170cde278f8aa7ef896413c72c60fc474d9ceb4df8e789ecb79e1b58710e6e9c509ebd99463d3da3a837e78755b3a0bc59121ca5e62e138c2d87b1e201eded12e3a7ffeb9468c8453cfe8b00209f691c3420b33125ec88e33f2b682b39724dca771be8ffc8e7a9bc8986eb4caae97f44586418555050031da5efb57e076f84a416e1125f530fd9eb04a0b61ebc5abbb7b31b4e5fafaaafbdfea87d33dcc32803000000000000000000000000cd37ab5980240fa71b23af8a49a33a7aa8633c37a216ac92081889d2458bfd3e43005b8449f45a61c4c803ea8d0f862db4e5942b166e0b671827e988c658b949b28eb2db655a0ec9fb26d29d74b6d9fc94b3ba96a084493176f8ffd39c186d8b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008f03ae0c697162afd1ef6d7e4306f025a0d9a048f96e4ce887f291ed081dcc79c773d41b4139561a9c1b614c7b5753ac8fc1dc7358ac12d6c8542f72141a24dccc3419b47fc0e7886b766804b22fec30178997ab821d87611afd191679637ad5cbfac7c8a334501a594b38ac8e98f8e2023050687ee25b70b24080c95fd5753b02159587a687e6b5ddbfcc098e746bf70b5fd237053b865b330ebf6da4e82c85b90222ac8ca6e0e91c29ecadbe233b490fd716c65228fd606f41a713237fba80a5550a05b3c95ddc293b4562eadb369b054c4b1b01be99aafc1d9e552c3e8e825484cf5fc62742e27bbe4efd88c5390a94adf721aa96e20f66f48a93169364a3b8fd3d022137f37b8bdb92e51c6d80b0c0ad909113e2db81796cfc64239e827a9e305dbe021675ae4ccf77c1723ec8836a4ba72fab8bd4a06a963ee4dcb5de560453cb93d8021e9e941d22c4aff157782894aae3daea67f01ba2c52eb8b915d8d9a0ae79990c020db34eef44858cf987c199864ea17bb4049b2679bfed9ee7af1ec6733e7ec96c0313fb1e60bbac715be79c0dbc32dd605f614b7b61b2ddade08712c060defa1518ce94c0f486d40d4576016eaf3964c7d03368140fc4412b1f8d78bc562d1d94382965375c6d167db604352f045e090b5d95fbca58afa0ae896a31cdad96294a222bb6e9027c5588d5355a667a03c79e2f051bd826c5c3d3fc82209eaaf2e16a71d1a045e99e1616d0880137302b9780be404dea9178016b61e9f2588c6240e580746ac6808ed7d533435218827b099c07bb2d97cbf5f906db22552b7d53e3749716ede59df4af7379f13e7dba583696e5ce52ea26d87d6aed6dd39ca295e271a508d98b19646dff335e4cde2ecb9bd5e46edcfa75eaf7178abbffc17a5870cc8aa1f1bce04d1ee36bb57cd22e2469646e6a8e850dbbd5b0b5b98c332cb0ceef871e03dda609feb07cd000fc394609f55541fa271c70899418dcd5fe601a51bf6e4c3ea277c5bf0ff4d0e24a75c8edba26169ce30e6b1280d82f9e6c0fb58b5d3e2f67a23bc1ff0f4f4b47964d4d0cfde2934cd258d98a903345ebb19977e9dd553944dfc8c7cc2d1400afbe13ccb354e10a877e7c761db8f043f54b2d7481bd9e0cb51a45bfda3379d972f1d36afe30935238fe09302ea04ff6d123bb099a21bec3d6c4a428716f9678fe6a05ac128b2d30db31bb5c417ab8a7f5cb36875793ec5a4541f52434aada83d985bf37aec25551083e98c7301748c67479bbf6205c846934e812d2ce4d4f7119c368c8f289fa2e99ef5eb53ccd96ab407a73f3d053271c66b0522b5c5e7c7e5d791c2d8f061b08cd51de063f9b031b432f75dcb56a7f6f414caac6c253f3f273dc48d7208f3f3f612f2b9da0158056a63ec6a3f3121b3973e8e26faca1e4eca806f614df76184c68f8fd039e7daccbd5a32a09ef67f9806b57bfe2e09c1488cac3efda58651d8aa1a008fe95ad8a9393e13534e96ed7944b6a3f9648a726973ddb9b9864c53861743f3eafe80c308b3709a6bf188681135af9ff4d40a724e0c35a8582912087a2d7737bf3589defc96998396f2a0cb2c68d15d6f9dacc82de2cc398c05996b6df0b750d9ede1ccda487f7c7348223c18c0bcb4c652398d80798493e1a058cc85bbe420eed4b966ffd1334ac086a07215ecdcf9f28141ac0b243c15d4b4dd6f7f0f6633b7cce157b0bb05c320c4c3c39e3daa7f446481271080d5d394b769ec2966f08de381c492fcf5263840af00d1e3c70231003b80cab395362e14edef8a287daa2586c62711af8c7d227dcbe25f431bbf2ccb586cafd8f340b5aac2fdffc3cc193f53779cc14d4a292f8c892833f25e6f64b80d64691b1d153e69a193175fe7892e597ca6a9c40732da57d8c868122701fdf28c1f9088c9b1fda399bf865601f1f2c796135ca916a61c311b8b0450c5707819330ab5474a0f121d6e927d4ca25459d231d4ada187823be452a3873e0e3a6404cb5b8fb355474fd69580565eedd3cd718d0d57e3ce231e19201a84b606fec5ebfd416ef92170f742c42a876ec053021a968b4aa9acc5307a8d64e3759b62c2db7f9a0b50bf3f36b6b26bfe413919a8cbde18688ff941486f730aa15335f6f5f01f6722b4f766a51b1e640d96f1f9ba196d6a8883950d99235aefb2ef61d2a760ea5b45379223dad08f3490850954fac2d7d20412560243ef0fca7ac61d99e1b67d11070148c1dedd9f8f8403571010752e70da845844009face553dda151658e124ea600d355dd1961a4b1403660000000000000000ded3590500000000c4365075feae5c807c688aeead36dab0f657af23652c7e6080ab978319bef6e9e792df99c959104742ea675f1302e9a4944c0a362572fa15b1040edb746d7eb83953c4c64c26593389a4712a886d9009b27584b5374c14d93a7494c30ebfc065000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f42f69601686375aa901306690b00059bc6daa869ddfc111046a3a91d4fbeaad5dbdd72f01d55fb397ac110ac5d37ab048f7bf7b83ce90b59d0f14f98ebf000e5501a2f78911237f68446ef1bafaee561b5b05fe2c6a01098dcd4a7ac5496fbd5d2541b9cfb24dc89d09f84ac7269930a1f146fd964f88a2ba7fa5e20a483d50203ed1df87809462af16ce7230d9cfc0a65ab7f3af6dac4ede599d739b0ca1c900325b7bc319de5784431daf7da4b36c4ef6b30a30dd98c45aa4dadf7986442db7a0b0340831025863376444029b117253a58ca09bb7413eeb986339a4bb0347fd55aa5fe2bdfb645f96fe53fe292134fb212c018ca8d0f7f719f6a7753f3040a2fd30302121ade1241dabbb52757390d6e5eea7eece094e06fd436f2f52f9a8feacfd70321aa0203bb98f9232dbe385ab669164b6ee373765d47cc4e9c9f9c09c34e00d80313848b45dc03c6b032fd458b1ec610a2d22a15d2a3660d2f83ce3e7e24844100031884dd39037ff2b59f0e0e921526edaf1d4e55f6aa05d5fdada74b4e30081cbe0214e1f71af8d564da562608aa040f1746e812fb004dd97e848cb01b1524d5ae5f561f1b38cd71e7cd30f4c01452a0eb1da8282b6f70c262d1957cf34899ced37010ba2415c46dd8c24edb4ef95212eaecd22d9131dd7291ade65fa60059dfc3b804ef746205bb1bf5e70ecab8af74313f7229704e209f38f907304a21526e2ee655605b2c5606f4a82dcbb17f4bdd7a37912a6727611a216af4787359c7efda9a22db03f5cccc714bc02f193e3c8ff76749b4639b4d4240da2c0e48ab8004db2b27f13077f08234dbf4e298833689009177e7e066f7b4456ef5d2d04d287e212cc66ec65e9ac997a57a0f482194622c8efd9d43cb928953c4e37242faa648e1be96e993e8ec0c1f798d49d178a82fd3c33152cd05a5f19acedd5f4880e997c0054838a1e41a50738bccc8e52ad5105cf3448b0115fc9dfcd3c8e08779aaaa62d73b5bb6ef9ba0e1191bee03a37229d356e3381983a0f47e0015fed5029e636cdd020800c303d3fe42c1b3df2a673a5435b4a0f1d4d2ab914c37fd15e19b5c271c3b3d1239f3f47f91cfc61654224959047c959746e0312311163d1df2b2be611ee6ab06e8476390687e2c35a1db8f9bca41f6238cca74e3a592d2a30f4f8d0bda5b1f294adb28d43bded31114d17ed735083a1774770cd8c833add16a9bfe2364f5af4f13d26e157c4cd49720a659dcf0b4c6c56ee09719f270784f6cb8dbaca6f4454ebe113acf4899a823a2cc7852e1327b0ea9f8b6a2ca3ad6fecb4eb0ae626259ddab202eac4d2d73907fc30e65e4d160149d7cc055bbbb03aa59fb848572c7b3d21fb6422735f377e9213a6607f76bcd52278ad4d02216a492cd4115a4b77a76bcf3be8651831a8561c9c6a4b2212c9bdb2469ebd443aa271edb0b6b3dbf04cb60643bf47d3568c41d3effa2606c77b2811ca222144c2b7b29e472f32c6391eb8e5f80365ea041192a12ca69152a3b549565fb6a2ed410f53476efb2122e4ba63b44b2902133c20484b88665ec356bc1e6f3dfd6acc48f0fc7eb4ba26c4890c7b41cc9e5951ba64b9e287faf2f41983238ba860426c72d1c6ac18be71ea5d7c6a665e1d58bb9cc3ea33ccfd6db7b37885aa115ae6d48da6c8ba554dd9798f911b1d5495da9d00f87c6c937d709da34ed6dbebcdae946b3bf1258905f5e727e75e71fbf3a12d68b2a003abe96e8d974771ff6efe41edf2d7bc636c0855573bea7c6e654e9ef741fc955cc7967092eed7af8b6bf1fe3c19e28920e85d4e77893153690a51f3af70523df53e2fb5afe2eea45018b5a4e38a35eb676fed0b9c7a576dcef2b0fcf16cc469fc734d5f3b5ca8b91fef09ed3c922265d050694e0f4de7ff9c8d0af1d8724e1127cee3ed61bcfbba0c658e341d1e489f80c12dbd1e5ece6e36f472e6a83d169cc55833d9c1b42a2be4e97800cdf30e53d5fc2535274261e96aeb356166f14026019ad62a896870f42d1abb884f3424f08e3a955f44332a353a0f8abc91ca2a1b652421e4585f4625f2860bdce09b2002f7dbc19123df99b91b078d6f1849e56cca685c4d75b0a878be78ae296b52f4fa74970beca5455d4d52862a9325b3b1d3946b9c63e209f1993330dad8e1f5c830df661967391666bf97d340efcf056ff6d1360c2f19a9d7d1739633cf92d49c32b7280582c6ceb748af568863c83cac97a97a776d5a73b380783a42b50853456f6423bf8dd6190880a7157f6464259cda45d0b107ce03c77c229372e4a35ff0a1419baafeb491f5686eaad34fcca41f7e7c9281fd40c3de89138cdffe45faf896714b7c2457743fb36fe61b2db86ce46ba78882c299453c2281ca15fac33b27d7ca6c473e6b591e717ec5f1fd2e945b7b35970c5209bdd0c", "00", 0, 106926605, 0, "088eecc6ed775a7c15d5aaec1aa1f1ae9a4595a75f6ed3325d9471ea7c39e579"], + ["66c7400002495142d14b088fc60ba192778e27f0a88b069c726ed29058867c272d55785f8d030000000151f9e7764a40e1814d0271c1d04c79bf47c06c578576963824e8754cbcfe177192c8b2ca710200000003005300ffffffff04f16eb803000000000765006551ac636aa7966505000000000453656365f7c4d805000000000953acac51636a525265674e1a04000000000751ac006552ac6a7cea33e90100000000000000005027f90300000000af8c655dfefa4210b59bc51b5ea37cfbb7d83c99dbe8ab5a48998662e18d21e33c647c00158d04be705736244dcebd7f525622227033259b12fa993dbab2689777f3af66e604ae7bcac2cabd6e9dff15df7a03ca9d772400fbda59dab8d5a554000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b4ae02e4e288017d933436965f52e8aece52771dba49def019805e42a1096f30b25454cd784a859316af9e04fcbb1265144ed5726df7bcd1d082d887c367d33c2883b466d77f11cc440d327f835ea9403a964e6740a3ccdcd05607be0b77ad4e5578bed3d7fc85b9c825607b60ecdfb36cb9e9d46650e8db2b0090887c289a9031d2af43e029cd8366162ea0f964942693c1496301cb2b28e2a51de9d985b26050301bed72018e5bf42c1b38df8368c8f8cbfcb9ed3ff5437340b200021b5392d220b051faa1da3fa2433b496cb714bac276a664faa129a108b063a381d37cf75877e95a060249aaf338d9afe06066e3f16334f62ae356f8db0b8a8a495be8f0b353803125aaf2c11398ec5689c03d1fa237a8f5ba8b85df58aa08afb1af903629652940216bd76c60ade09b18f433189d0207655263f23591655b18c2f4c6a042dfb2e12032181dc46045eff52e4f6d810abda04492420e32dda2061a854c8ac4097e5d8ce0211012ce5ee10cef0303bd58eee2305f2d479ba49efc1aa48ebc6603a9e26e07c020b665b2b9f7518afa3bbbf5e78c47fc69796711c7a875ca49a0ee81ea76c53b5857bf9d33d14db63a336cd4ad2a8f527dd1e5c8b4e1426fa02b967aeffb0d597df5e6885d0aee3c26105dbf5b80a7fc109d9ef321c4ccb52e071735b29ec289f634f79f1bf135674b2ce4ceef2b5a1424dc49df0853d81350cf153945503cbaf5c836cd2bbd152d51b1856373055ad6becf0a4ff99d4eff4ae0c277883553f894ea262eaa31ed8ca3b40377a0de80891ce4577899e251d56c0cf0795fdabeb558a29e5068ea3790ddfa3379b9cb6eb83e1fb1e6b6b9929231f5943d3407e6822aeafaf40fa70aac0815b970bd998f61d8ee6d039043cc06e6a56fb8809735654a232b91d5d95e63b2ac4f5897f659474f64fbcf8d901eb31c1e4b226d03e883a3bec79cd1cbe22b983c239854c5a38cfed4ada0ed62111a0b9f3eb76b93a2428732440bfc763b3b398d00bc987d3547c59906792b0a149f359db9a2c8042af2b2186cdf2db73bd3771657767174cf49b85812a4128eb665d86d3169bf52d0604556bf8819ce8ef710666ba60764b3182e70344f743f756ea38fa7e13f856448cdb16e140fc946930cc3f0cc461150704048220602829be2d99e0a7d14b81538d58bc9aaf935baac0a10eb63aa6b12e6f3956ee72931e57feb7c3eb58983790f59a0742538c5bc5c34e3672095642f9a1d813c296aeb301eb71a731d2b438133e0a678072dbfd118d09b62cd8a1dba028da7cfd453a27b73466e018408fcbb703394cfe31b66efb4be07e85fa50647cbb8bcb9743280e07821cc855418ef606720b5230ffe98960f0ab9e85c505a88fc4df6dab259fd5e7f649b15c1b0100f0ffebe0e4faeeaa1fb5a959103efc9c072f50b8c24f5237c686bffb7adc0369f9bb802cca97906015824d13cc79d10ec0386487deee46c37895e11ef9328041fa2e069a3baa9e3a87d1d2ffa2fa0d711fa69547228b9debe5264c8b52f26c64b7602536baa69b6bcd0f0086ef2cefe86bb81613943010830cfa1b3332e0bceaa0d2d41f6c5313a56ff205248fc48aa615d5a8abecfb2976b872dde12ac42189b3a31459b9788a2db570877934a610570d105248abc916e12932550dc161921c2cf0859508c0fb69068bb5e7708f653ebab94d8f153e01a01d6df911bd4f4ffd96d9999d5b185b172501df32838f535660b348ed18f6c31ce5dd92822c66dd93acc34b8a5f0ba4ac484c44a3055a5f0aec61c519ae8e02af1f74a916a240db609340ddb56801f24731b77b1b760ade3f2b1a41d254198ff7ef9ddf542b8e62aa4b9a88afc362a1322316d79b30d01bd4414c794b387e926097d45f9727ae0fb9df012a8364dbd91152b9b34d455fc217a1fdf38b05a9883896dcb7db49bb0dc36f4714c43e0cc77f97fcf4a6a975e773fb23d1ea97c4c03e58d505d98b7935a812199083785ac850ba539489c3dde9d76c1754eac1a63afdef1b240ffc2024051f00469712c6418ff7fc29df8f25a9a1527277cf94f2e24ba279c6be8fa72fdb81d9b3a17bfef8a53c3558e854695e2a397f0825cb50d88a69df1eaad0c37a94c2e6a964cea7e06d381cda8283034c4756bd4475a51625dd7f8fd5296950e70021212a258fa87677f1e2d4a01411679814b6e3cf567f3968f8b4577c7182042b1f4c6806b3088379b9b387d25c6179f884405a77d245aebae744406837189344c9690004f728ba43fc4f15885461c1424ac0c9934304d89c45ca3bfa9a92de799940bc615fc53c193c034973e23ca0dfc91e8060dc14b838261b102b7808789ebe6ecdd09c6e1d7b6567aece4e189ade03147c2004f8bebd6174766279a288b245d6eee17fac6813f43c70a6c5723876e8afd209", "0053ac0065", 0, 667455739, 1537743641, "de889cca9db460c328936ff963f71e9d37ff46438f6c91dd0b32fa422497ea0f"], + ["030000807082c4030289f277ac15e1a3edbc27eb443456d374d3e845c0cef676649bc46ed5c7564b6d0100000006005200515253ffffffff897ce833a63e1cf5f8a2a467326f58254897ccefbe18539f01033b3c47300f3402000000025252ffffffff03f10e02040000000001527c2adf0300000000030053000ce06a000000000003ac51ac000000002af24f3203524c6500000000000000000000000000e58a2a7d29001bd92ea7b3de07e10140d76c9d62e3a13292f1565f6c502652127f4e0eb0acee5970072c8f66e97b50104a98a97320ac4f503a5096ec229ab96954165eaf5adc3023c9cd8b5c8cb725a1f9389f6fc7d03456c0649f08d137b2c5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c732d5d1becb1a0b1f5089048fde567e362a83eb7e48b8fe7e860f20a90ee8027b1b0a83157d20311e4a1be45f4c3d4dd2ca5324c9ddb7c25014585a8e85c6d4bc98ad7e805a577e5ffb5df599f0f539ecd8570c3229139bb3bc269d7a6d817ae76e47b18f25025e5def18f76d8dd86adb31daf0d2d156fed6991c88600d4ce0204b4db5dd6cfad57c06169c3d95d20ec04b456491f5523002f1f2b24724afb030320fb0df7363b5cb18bee2a66013c580af4a326b55e6f9b9a77f80e5028951f230b0129cb973c1314c052c6069233842af084464058faa3d97820b6345099aefc26724b51ba094c53d603d97acbb52b3dce666a605ef5efd1bb57f0f0411081b83602195d941e801a951a8a9fd591961ddb8d5fc7daae4da7d7fb7f8b026874035dc30202975287581e90062840ce80e1363f37d12ef404352dd103d218c9254ff0d7ca0315990cd3280991ed130ddc62b9b0e9fda6b250c03113b5aad0f3bcafc8c70df1032db7222e1e170b7819c36966bd08c8e4fdc521e7278588937a4797d36e792b590313182901c8a1d443677bb941ce10cc54ec64d5bd6f25053c5797e76da17e56d04e3297453f56c9d446c7193074e65ec46d0d462c78f83291d6115321557bcd06d18065c3d27bd94d9b2fef81d1a23ab2831e8b9b6ccf3800eb325901a253868a89860cd2f52e753ba4c2f0de0f3cd8df3e7553b9751d4f6c07e393469713327cbf7ce9892dd2422d4b1ab6adddc10c02f6bbfa100d127b9596b49593103755737e7b3439faa448079466bf2b039dd5362633957b2e9dff756b8d03c43621c7faa987d000267db6fbc67f194e7f22e52d96020a6f706b13088019d468eb93e6455dab317145d9449e258c96fd05917f6150aa3a46c241da046667079c910423593e8de40525e3f39bdf392ee1fc215bfa61ea61f173d654a26226cfb071fa25c4c1d9e9830aa0cb0922ac478876cc05e13080163f1c59a3fca0da8800de843e69175813348666614e79317bff0ff2d004d5c8d572676c048b699319eebdded5fab14a76150f2417514d45de2935f306a179c49dc5de8db70755fdd344e0e5c49ea4b77d9503215e210aa860662e71fa1840cb884799632134cfef1ce9b6bde3d2f52ef377c015f3b5de2216b2fd3d2ed44163ef0a30306e5a0bf8221678d527c92a69acb6e2e66d54a649572990c0c383ab17c782ad3f15e22c09c91884d4e1a014c91064c53155bb351fb364a295f40fa8bc63d0f2b46d6c5a148719e156924efca6291098312cef9b90c25e312320dbdba93851ac915c85cdfada7a02cb77383bacd2cc4e95d7f66caac73289ada6c35177bdd8223889e2b594f843837979e78c7e923c562ec4bc2d2a0a08aadb9d74a9319a340c43200441ff12addc02d038a02275c2d09c0e460e02489ce3bfc2c74cb297609430c378b9528708a9b1c72fb7adbf23d12504690888f8246fc04c0c720cbc1d026020f5475922561f3af0cfcde944e4afac580ddc952aa7d47c5482550d8cae49f73af684b43c0444aaf432b2f52050d98249820802f10015b4e2562c5b7ad430d52612f2ab2d1709734d0f05ec9fe4e20c15508f417803d900b9da34a5bb1b986daf4895668acb6ab81050dc8074bbd3e2ba716bd0d4b1af66286815fcddcc8c743cd68c28c268622c541948bb042a62442a91e140ed9dc0b0e63d495a29e4c9172c79a5a3ce1060bb51922367bc0140cd2442d99ed95c8a249aa250410a228bb375f6fa2ded2521bd97b4b07b6d3197c61eea3e1f070f1fc5c3a7e760d1bbf494592886d4d0b415ac16fb9a4537a21826a034e0b662bf498028eafc0698cbb49b9a6724d93746a426da8224049db54c64dafe7c6a368a7b382c98dc76a0bc29eba7f511286598c104e7205a796a76aed9e238d97eb9b3550f85a9cf220c64233d71e2659a826e7f9f332f092c51b36e9550c74f15eb8026945f877844450138347b3c64876cbc4e13f3fed363c6c4041134e3cc1da6081b5b6170ec4a764742f5ef13edb1e716dd45d13875b5e63fed7b07e9faaabf0b717938674fa8dbae23a234549e16dfcf18f6987edb8dac5392f42384fb9592d9af775cb6fce1c7cb01d1347bdfa2cc310d1ac261c023cc65acca08445dc2c488466a97024e82a2ae8e0c720ca981434e989177df545c0dec8eb6dfb017508fb670d3110b6bdbd15e61f15315da88dfdaecb898b43343e20ea6e6b42892226aa527b873a5314353251f294722b3832751719f16da25a16affeb192f8655c2cc16e5c879bfcde900000000000000008453da0200000000d669e1b04a004cf7889d93a5846f409a93a00b5ab6c4d4ef777d42cb1780ca64bcc23c964324a9eb21d25393b467ff3edd680f0cb521de1a6f6ac707a084e0b60bcb75cb3764288affe5fdc9463d68f7fc4efdb82ff543893312ba403083ee16000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a18d9386037b5625426dfa5c87571f9c684129b2c15fa640bd3b1d5cda05a651ea1c06e5b40e65afe08b26c5401ff39e093cdd852d867c42fc75918858ce3b38a89440c508cd14637e29a79f29869241f5c2a49f9c8a47f992408df81285f747c6c7c10c51400bda8101df76443db05054c8011b8a3f9f401246883be6610a80324fce1e16266585003445ca2d33e45025e105d2a24ec099a9420f185c24ead91020509ea32f77234afbaa52b86010bb5d7c6e0d5a324771b5a30e21c10e6f566f50b02e027498ff6dc1013a6603533ff722014b23aba45888427010bed8a4658c1efa85977d5a047529b6754bc5c572c93958cfe342ea58a999dedd546b58606f42a020e654fcd8087fc45b47bc2b9349bad7d93830c746daf8ffeee395ebf6e1a7b0502163bf9f15337efcfdbf500c87004ac39c140ab9bbd98ac582e65420f7c0001130219fae4b19a5a82dc16c5a901da6d84f78e1f95fd0283e09dd1bfc4a3b4c7a30f0305d385e6560d30767a18055f8a37a985f902dbb73ad8c565c70437f34481d09902158fdf73ebc00a35062f4e54c9f99c9c8fd3bc4412224efbb3165b4b6b976578c12570ac92fa0b01d3018f6959cbeede9b2fb2fe5984be52a9b62106b8e964298150e0a07736a3c1411ffb27374610918c45883c71064f90d06d87034d237a912670c3ce908b9df3e9376fbb386e2c9cdba71646d61f7544e3874a182100ce187a94f7a8272b965e2cad448c5729ec49ab57cae88c812db82fb77c13e9cc305d1a6f323427d5b04c04f9d6d3e71d57bec29df389c237ee2f315e99b3336550f109252c8d0fb6c653f402df1c9a5f6c4df8f8bd38851283fa4cd7c80f5e0193734447f38cdca00b90ea114e00e739399149bfc07a35f48724479b2949e1eb27ea1d53950b7aa866cc15177f42e1061007da12534b4638533f5bf5e4218ee08f1e1b04e98e5182d7f40981287336919f19d7bc96a64ae21adabcdb637934bc62398a72ec5a59cf70544ce9d0d32967a0fd2b12306c048f3cbda4a05257492efb52aa65010a9b2c5461a665d7156fde68054deaaf9488a29c4e3dfa22d46d8b278bb5ebc30be4dcdd18cd4afce3376c209a9cc4e3a3c884efb1b5edd13488f409a6b9982b7391d2f4e76d46bfb30e89e821e1d5f9f93da1a9e71cc83b2ebf7d1991c42ff5ffb1150eb279da39189f7741398c07b3875fc0e9ff02fd98d0de16ab6b371a55508ff3ac31e0838f2dfb5da946c2d9075754084349e309657cfb5a7750caec0e5631cba8e2df49b4eee788ed1b37b509956f98909304e970eee917578685d4dae10a98fd15f13e6109d6e95abf0646d3a344eb9a20e64984e45f55dae4e9e150675aac3a8f17532aa93baf1cf976f18913bb7c751728a33cd6778d01fe29806a997ec157edb01944d1683b4a261573085db4c4eb3c760818eba0312e90760ec277ba9c539b68098618fcd0e8b22609054c1bc8f0f6a5e7d22ba539cc46a7ddf58d15bd17793b3bdbdc73369b9c6408588356c8d4b8b423f160ec255ffca1a870f877ea467f653bc413f0fd294d339a7e57178770837bab9244061396f39c7fc03ef592dc685b2c96404a84b5d5d2eb18b1420ec280ecf6a507dc4835658e6770a319b79fb64010e7f566f8e65deb2b04288e85fcfb6dc06bbd00b805cab87058fee777cecbfbd6d97713cb95c817675aee3944c6905485d50dd91428e116008d538c6cf2c2554d2c06e725d0dd5fce1a7426c084cf258254fa6f5a2f8aaec143d855012712fc8b73caadce2ff19427225caa7866347aba9c817f0bc5a893f9b38bfaea9703e9135e3f42f3aa8c45a488e9b7b4bf693e73a9dc0e173f8d42c309583a5e32e726e6efefdca990d4d4cf832bf97eb78ebdfb55e3216afbca5454f07c50bc009546bd33524d7c076711f4b99cc0e8ed612a6863b57add168255a1239752bbe469c8b94a4bf233e8bc24dec7ce013c0875c6656d0a710d826f7414348c1913a29c15db156dafe3a3d58da8d9acb28978032ce748ee78bfc5e7bc98f664a4d335961c89dd11e865f1b87393e6f660e76fe6376095571aa52029a9ffe1afdbc2311c65debe43b38ecdc041d7a59c1794e5aeb1d7eead9e2562a8b6bb7b3ede4936456676c9c5df2d0fe510803cc1ec388d5e0621c976a3a81ef8a7c60218a5311d59760bf46b31a01caf0db777d2abfc6f0bb25128868d28e26201ce5a33746318989b4cb27d77c910ea8f94fc5d88cf67ed629d4f3d37b46b81a8c231f53a01f15b58c2dda019bc36ee2660086fec020000000000000000000000008d041a581e6cf1f7824dd97b8b224697b687b3c4cc6c6b21071b78e014dd4cec2e35d0f0c213db27d75517f1da95168b742513c7c9ffca8533f14e733adf6034d99c5f78f33cf66f054df225bcdc3624addb57a7b19dd73b4717964c072fa0bd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009260f1418002dd0aad73aab9a67df1a47197a9cf888dd04f585cae64233ac8f1e99e2f3f9819f3fc8aca8ef99fe19f44a5115441e020bbd35242c98b0972d070708f716eb8a64f84578a066dec8a28689785e4cda313a0b0fb77084cc6d2e0950201436d6aec7f94236ef33ccec07f44aaa243bf3604587e45643302045d580d032cf0141aa57b7463eec55a193f5ed839bd097e6860ad359a64409998d7f48cc0032114148e576c450e18a2f3fca277ed23777950f74425589b837e46bfd3024d710b05153cc89e78d7ea89b68be14d6467aa0b02728cec074e2e230f1d512de27eb2632392b2aacce1aa581fdad244e415fc6ac8150d07b7042e5a64271e438dff53021b74115f5a98840db01ed811959651c8aa09aff630c0282ddd0327c879e68905020a3f1bf694cca7f64a968d9fa3e8a576fc3d4462fa51fae01fcaf4105382034e020c82de0419ab3293f79aeca197867039fc346ab1acb5d3a2c7c4c9dcdbfe649d0303de53a3492feea820580b968b0571619838567dee88ca593766ea0d595826ab022f9dfb55e47e7577943a79a00f147b73d13667123b760310a41fee1ec1e00fa8599c8d2192046cd9c4e64bdbc01b285cbc36ce4250333759856d33e1f124fddfd869c9ea1a58abfd7ca3fe1884953c72fbbbbc0f98896e1468011fa1c6e2b0903971acd8e8fdfa6f76bcc0f50829ece214913fc9b1837128531977043fd03efd555a176d1fc5f3bb8311f0c7defe15b2b0d52edef503b78ce4af1a8d75f993412de3b0690db0876f70eb424a9081c06feb21d3b28b899cbc11d8801103cbd006fcca1178bcf378fd08a6c0440ed04bdced819ec3e435a307fa956b297ab316f55c4ac9d97d7cb61093ef386766a3a383d3c02872495d82e3ff547e3354fa636f10a6a0b468015704d5086741c96f0ab7162adc89a35202af3947b975212ca8fc24471c866d47cd497c45e483c47110e0f0ea036e2429298b3aa63abdecadec4c844777e4591ddbdccc45ee0cc58d9635b5230eb6e7cc78434fce4424ba640190dbf72c387dbf73c5faa99da2fcf6991b7c62b44031b3bfa55dddc4e7411f61785542726c666535ea86329db964d75ad846aaa1f3b829cbcc9e0bd56e946659ab7efa2ec9dca280242336f6ce8ca7c035b5b1ec87b9c74ad5526275a706cb1ffc05d31b4a4c0751c33c9907447253362387fc75380103ac00d55727eaa9cc32144c31d2f11307a742eab1a3f2a38c417b71d6228a213d2b5f7d1ed309114f2aa645cc86c7dc6bd1852a7f24e3cbb8b2b6be2d1477a7b069744c8520fbd3323144f4cefc83cb0e63d591147b450d3a3cd01b66188816600ec97ce7aae5355b4f0cf419a35ce84b84b9d1124363be147f8ba79f33906169a02cf6e03f5b17be77656295e413293a9a79798b72bcd2d42a4c4e24d08f95b3605a65ab21e969e9287cf86743a837f0f62262e1e1a2d4e6bdbd4340b8247868125ff8de037dc180b993bb1279539b6eb285aba1b9dcc7d87c02b9f05f235bbce03e4cc540491634e054aaaa79e1c4f1e5a4885187d09e69bdeab1e13ebbd372925976b1dc21df6e66905f961ba4637e7eba732feee6b88793687c4c814540eaa863fb97e825f516724ff41e4eeef93eb8cc3e20b44ef93f44f5f6fdc97377c9d9bfd192324fa48570f077414d37c0f2540720e4edb42e2a82016aacede535da85c95468714a12dfd30a72665748bd926b15c44af59b2d498a7c6a3c342463cf2fb34cfd31c8077eff321f37ce3c7f165e575ba13bdf65370a369c989c667c0f885174af25fe765994961c0b9cecf7b401558a3d0a9cb693ec58fbda277dbde82f760db77629e91cfacb1a454cd81b57c42dc1e0fcabd7ce5a1528192ef19e3ee6a50b9fcd94840698a1576f95b89f29581ba8d2dd3ebc404131e793b753602ca1900eb5c3b49268eb3c089c1acf4899a2be95e52f016a5cd12e2cb97306e1c196c13b03e136b01aa77d08dde3359724fc4500416fcd7cd632e5860dfdd3e9a5045eb1a253c5f29af8737ecf5f4e6528cb084d8aca4337e821d4db3dc68dfecd2029c6e3ba06b66b83ccc8b768e6803a48fdfb3b6b9dc4e3649fff1d6f484ac0a7dddf754953be69dcf6fbda29e2d63cbc432f8e8c7ee0ade69d51cce996a040d9843b02683d758413046bcbc7b8fa40a4e10cd7d3eccb762862bded565cd5ef23edf1927897a7b816e328c3c8abb9bdb199ceb0159714318a73f77ba0ee53d8274b24b1959aff93f4e1e1bc88a35af51dde74f36a41abaa8f826e0929bfb4209df8c331f0113086ccc9a76c31c26c982c8abd3ab6a8302d6cf1887fd5acd8b0cfce7a58215c7eb1d017854872360621d454b969def4cc0f22d0d6c12a0e7b7bf57070ebceae02f7673c2965d4b2ff99ab16a3ad2d22bc427c9d9a0d", "6a", 1, -1222303870, 0, "1aa5380bb4ebe17a9e117c2aaf25237ad067767d7ae89730aebe7436d3fee66f"], + ["d5ebb1320469612a1c79b0d2a3e35d03c25153ec000d064830dff5e60869d9cc53e99384f00200000007ac52636353ac6ac9d09de8b5025d45c8b5536820c8b54a44810d4353cc08c8d155f6d9317a1309fdd3311a02000000026aacffffffff2167db1876305abc521e37da77f773b4a6349b99554f45139867f15a3d685441010000000652006a6a53521c00f3abc128bd4d7d32fc8e29ba9c1a334e01a03595193611db062536353dd7224934470300000007636363000065acffffffff02cbe0c4020000000005ac00656363e948440400000000095300ac65656351656a00000000018afa6501000000000000000000000000a819a91fb1f4591b89e4f0283e61ffb2e9143bdf24846ec98123bf4c3cf013d917f8660782150046a13ddc6a5fd0eac543339cd5e2dced9a6e4f804220ae442ae377efdc6b2b40eb6780ed3f46194ff1ce47b189a3002002e638668424a6c3d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b55500c19d4b582ba1456fdef01441b1fe320df1a1761649bd824a87f127abaf5d64292ea2f99a32c627d3997fe8e987e79261f226775e12e58150275fe871aab6f29e6a065fb4fb9fc4e11656115ad5c4d92256214420a4473dba4be12681d07f67f99c28e446c22ad061040a5f83d692104eebe6ce821f8aa0a5564375969f031ebcddf89577f583d162fa8a1635b583ed3283d9c6c53bf11c2179a3da96e5ba022eb12fe3e692947d4b3857360f217e7ad4d12eadadf7472f5e46e34bd30de9f90a00807b890407de01e76b11c5805f2a1583b68ae34fdbed995b0f69e052788971018697974d032dab895c35be9208a357345a5301a70a386744478467125c739f030f4d15808acc3bcd03a11c020a0d8b845c7d887b17493cbe9e8c6b7be5873a6b031ef3605658de028e9331e378bab31f1bc402907a6dde2615ff2edf8a7a6c044e022e1af3c5e5e747bc68780f043e8a9d681221f0cc74880183dacf06b73b0d9ff60227f232ef19338d5583f24f53565c6595a6b6f063478ab6803857749ffa8c80f40302c39aa3ef6e0fd6ade0d7f80d49ecbd48b5bbbd50fa34c39b901dfcb599a8e2c34c1cac7f3d2c526536fde04607485db4956d614a3d00c258c830a36cb25789c66e6983cbe9c44f1badef35c6255c76fb0a94c5928f9e7467c1f8caa0b13aaf59c2b65b53c746dda925462ac983ecb572131e738b4d1808b3f59c03b7a5454499d1cc87e2af9fe922f34924398b524b694f5b39f7e9f39167341acee5c6ece990c9a211c1188217bf095885fa11aff539ca802ac7ead0cfc76adffb13924e3a813c630a32074b025ea57adf1f735e878795987d5c752027230aeb4d733b01891a682bced410397cf271297c26c3241ca00c1f00b4dcdcba564469065904ee052045faaed081a4f7288a572618be92591672cf37981b350fbe3d01bc16b1f4acda938a897833a2ace7143d407ea01c104a519e6c77d6dfcdb6b755f5028ef7c880ab86f8c7475e80e0ffbd529f7954564bb691978a9dbe6b8e5f2373aa33ae354a92f094c75c0e24dab51600c3da28c31611e2a780166ee0799f2334ed8bffba1ec2f4de3377012cb7e9e2be56f2431935fc390c8ab231ba3d4bbd75856b1412efb521837802cd8d1ab9803bbee1ed4d091aef8cbbe5891d75e88379485f7164ebf7f00fa2114ff9d5d22f0fd1132310f75fdbde9fddc42c802a290eea6abfd86a9f8368487da313a294a7a57f23bc969e63d32f1df6f803c96dd85bcc80570d2f5770126f08ddac68a9fec812423749f1d163c6fee7c0d852c05ea806ca0f9a1241fe9fdd8e30f73d3a699c0f219d60c8a627fa954cede86c64d84934ddff1067f2959f54d42f318696432aabb0650170565cd14e531aa79e7ed6d3e7daad70de99b395f834c76fd16c10dc21849a7926856702ecfd67eaffd7ba6156be92d80466c938a3ea6079b8f6961b085b432358260a21a25641efca4ac92eb86a99de70501b2e885a7b41ba98af4ae36aa907d45ccbc75eddea630aa0a1c40923f007b3710fc756dd16c0736dea646b56a7b4e16117fd48141a132f5c6204c0e36d662399d850ddd8d2488d3fa0111d7d6d556992224c917aaf4515754cd61a5accd0f4e22613d4de8086a1944f56408425645af5de0d4c91d90207f78fa8c3ef3837b0305f7e66398936ec25f6ccb581b954bf4c3ca03ce0789d1a3050da1c2170c495a756988d4a4d914b1c383f223640a3e4a75c0e4cf217f2bb3c37be2398b90b62734838e81d54e5e6e16f2a17466f5b84483212586f71e9684791c895383be3b4fea5674817d89b91595d4ab0580c86c8c2d757f65a462717b8870aff815cd166125452ff0ad6a4c5643c7e180b150a31268132e42f22399abf9107506f9b18d911822ddeb4535b4d7f5debc98557824f468eb55092f584c201f3abbed66f465108f76d9bacebb0771e80a1aa317a25c8cc0f0c6a1932f19885adc2e665aa2b7179391853616ebb7877038529aa9a46c859a6077d9d7c49ae34cdd8e376448ab2c2c3732d677692aa66f0fb9c107b02446de57c90036af12897047cb3229e328ed67a87202312684e488972a5e1e4ba403d7e4873c2347219483d2e9b79425d724ab629964f225e04f32d6b66c7c75b9224c75d7942dd4d6094caafd89e113327b6193ec8b5b1f5276b356c944ccdd529b37e06ea95edaa09899378f9517f5c9169c6656095c4bf20ad0adfbc42f8586a4299c8af4591a5d0bc8a202eba2617ea74f159e4e522ca0a69468f311b3b2abbd2a1a380e4a62ca7048b31da125f6cd535e7709adf2fa2b7208a7213581cfbb5d0082642e6c115dbfcea55021dd0c6cdb6ac691c1c5ea7789ac4ad17a7f34b19693a347245024590be4ce97b3c8f96a5193eb454937a7819e116e397d4578f6c06", "516a", 3, 456556175, 1537743641, "c389852e68dfca984011766845c9228bd8cd11a340dd353df6d0cd689b3bec6d"], + ["cfbbc21004db57f4c43b88dd993e1f27a5103bb45bff6d30745fb5066e16d91663505638f20200000006635151516a006b4bf3d2576f29386d8a046a4752cb0434963a520b8e9b96db434f5b91964a5dede081c10200000001ac788eb485d7aabd5cf339a9262aee4d79b748a95fab8c7e03723493d2aeadcbe2d16a15cd02000000056565515352ffffffff0ccf11104cdd90c40dd03755dc5dbc47d2d2a5225249eaabc27b244d14b36dc40100000001acfd87064f04a029040200000000004b36fb0400000000045265acaccaa88802000000000953ac51536a536565ac47351f04000000000000000000030000000000000000396ff00400000000c19e1258336f6131bc6fdf61542e9a68a7e98e12671d548b09180fb4927cd38bfb3442a7aa5b10dcfa8f999e34c8ed65462d550393d1e5515da140ea29eaa988e2992678c37341edabc1c4332fb2006aa02a24bbdc242fdfd446c0dbf1899e520000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077a61f627d046292e2fad16df94ff0f660c22f3be25800049355677282701d4bd149f573e1d2dffb189833fcc94e3c3978e65ac4a8de77e2e4240b718df5cae82446ed121654489b336227a57417eead6991d366658f298609b122cb1ef1c718f5c5177c2d091e2b6525bb50ecb52f6a32ee33fca8848a8d2790fd6bc5ba034e0213312d5170ec55296416b9a3f33f13204212919ef6d44c7ef8bc812f2feb04350225f9297b343de50bc33709e14ce56546cb424bc11699db500d22e85438c3dd240a01d978eb7a391b882f651cd1b24d82634ea5ba8b79765025c51fa2c8c2a13c53b7ebeb38861ac9dc3338aeab2319f2008df2daa9593e3c1e4d4035e965b35c980218ac40590c617187d72f84d25052b872273ac07dba78901b4837813daba22ddc022f3c727bbc8ea152b08bdd2f53c72a3168df30eab1de2f7006f46998dbd5cff302190637902463e1a79f17a5d093d916b7e8001cd3a39fac853878b1f61b35c4a2020912ebbc1decdfd41f74e630c923701d75fc59742ce7066a99335a549b6d930902128c53a58ad614ce280eb072374404618c8ae3a3f69e2c9130b3ca2f818cb7e17dc5d0edc800f3452951669382b6207bd2f890edf8d92458b8d9572ebf1331095779f74ab3cd17905372556a3a4b2de0634feb1b3cf63b50a964f5c507828c9a0ba9779d4b2eb0717b4465158fb62b27a091b6ee81b3118141a8cf9572b18f711fe865fc9844952fa035c31d8a12fa21792bfd9393a03eec0689137426275a798afff93248d6613b849944bcf1dda6d8b58b7ceec3e861c45f4d6cfc03c55e81da2781f5a387830151ebcce8ffb9a31bc3d9782f0ec281373ca32ee1f26f6b69628ced6c1098abecb42993500e75b28fa058a77c3590724de2303c5df1e31e0886db833dd6c498acded301b09b63b94988484062bcfa201a979e1fa150128c58dfd642d25b188c43767abe3f22667f5864b6ec3bee58c8e4b3202f5b24df32f96e5e8eb85db2077650a8f4d7047b6c20865ae7c4c66bfe6433b2d07ae29fa47f22fe0b77c93ef3013b122e8e28ac1329a569ec6fb2251c4f19607eabd726ed43cf467f842ab32017c2546051a29dd0151ba6ceb6fbb556079649eedd847db0b67b3ffc129b369796b6b4ba6ff3e76e397489176357050776661375e13871d5de63b441059a6f898a707a1398ed8f550161645575a844ed9ad5890fc27d7078912dd70301ffb93abe3af2a5588d7c8cdbb0cf4bfa63667a9cee5fd8c5964d367ba84498f54decc0565a917c05a2e063f5a478e56cef4df479a961a14430256f19fbd29ec2608388940a565796510fa5a1aa2918f9f2f734df23bc974da3f643143e24bf680a6f82c317b239af29c7773805a856c65162c9b915399de5ac238d22e64b5679b7d62a492f29f1c8fe64f56777af6549e780cc29eaecf33d2164e9dd82084c11cc86832b235c268106721946a73a80969a35301e716cbe634f1f5c2ada97ccc96bd4908482af4fe6d7b05c39bc93c62115edf51ac9ec85cf2a29f61d382d7afcfb1d101fea0e1cde3692cc2e3110489c11c28949ac322eff9eae47d350703aa32ddd023731454ef87ba138ea16203166dbe54732393404b560257885b31e0a6ad1d877ec8dcbcbc70ebbc7d1228919521a5b50e16d7f35f0bca24e8364ef98ea1ef326c7ac8398206a63c3e8ccd9f507e8ddab3092d1bbd49c2d332e2e1879631cd180b40a404ed7acd268a81b0d7c54033cc51f99c49675099c4c096c734883caf97169d402ecdee6cc29e0629bc138bfd955730df2680afd8646069e71762b2537cb14e4047be5ebc3c6d2e068ab9a9b67510468a364c2480b80ebdb12111b0a43f1507be93b51a606677387ca3b134245f3c359d397e3cdc68dd01c37670a87be4fcb46c1f53a01a18ee085a2f678cd5628d62086d719a782d35673b7112a37fb6b1472b48af7a1705746c16e3bf9f0a1d40b6a32b2bc2d9a2faf43c63aaa34c97bed2162258546a7a4e122ba9e33318a07efd3abd46720f77bb60fd08d6d1b407d8e23ae59a069d2a52d33b82bebd62cf6a0500d0a0eeea9a2805c5def3a3f536e80c26e146148ad8df509969c85b8b5242de41045a0acab75e254c5df1d73c514eb729c0555204e3087600f63c21568c785eade5ad4f371f7b9ab1d227d8efad63c8180bfd23bf7401b2b873898e1be3bc461dd31e0bb1c1b6e7f38ceb76bf84d5fe8628587a7cf9e92963e25682ede10a02c02cc8d3a6629f282c6b31e88a20d40e4122800be9bdaea6fc30000000000000000812a7d050000000091c6874a41398149ebd5a28851e491fd0da445daccf1becccc0055fe9ef3016caba306da7cf1f0d774eb8d716b7c4d0cb563b0a33a1de3853f3481b9cfe69943f0c7237c4509cfb29c7ca622d49ff6a07eb90f23c42dfc9194708e4b3f38252100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c91bd72fd83de781b9df0c9e56df0c0e88e0f3f34f405442ba90e0de30b10b620c8095ea011f5c2f93b4317cfa8d4b34d33910aa344bc14baa9e64d3da26e1d0e653cfad79979c46741a85ed89b4e422b98f71b40680e90755cc4805b53b3b645ed7abb9b942dff38ffa3c802f3ff64cad2b1bdc598b2cd6dc94a8d982cb075b0221c20fa3fe71249a5b76f2975ad36576b78927e3872a01b114eee6cdb31f107c03062510aea61188289cbae21906b4a8dcedebd51759d64d0255113bcbc71286440b0645b0d9accb922cd0ed9f7ba1a02a81c7fbde358cc906d18159ba197285e49342d3c532274b27f1b8439d79c74d394fb1f0a46285067a941a83eb998694f26f021eec69bc26faa699560a953b76c54673cf6d780db934cef39493e76b0787cd950214117c7d97c74b75dd6c248b07307783c9fc7524b090d868781cf9236be8edf6031dcd189c4e382f7bdf144260a2ec712b89b98f139262cf431afffbcb076bd3c4022d45e355ae10f102edb3c6d2820af52998874b08f288a81c8f9a2444dfacdf4f0203e1ee662fa002093c35723632ee124ead2c6a5844443a4abf5ef1dd6c99e9cd605be2e2775a9a352579f973c6e1588d9863aa0c93662eaf2feea72774f6a545cec5248445d9fb26afdd2223d80090f95f52c3dc5d976106917d8749eb423b6715e77d4243e19d436e4d46ca55f623d90fb093daefaf899ecf986c9e0a5529f693af4857eef54f68781e597dcb99087713b928ecc75ab46ec54f21b8c8567c4c59a068b94c79048ea54abfa51b98bcd523ee251bb31cddd9d5c33c780de3397d0f5704c75eef7077ddde9bbb4495714664f5a15a2d588cd6fbe69e19271d5a393dc3d5116656cd88c5bcda9bd691fc4e54b949b8a5c98b07913bf7d2106348e3562b12c9ba0f2982b327b595b86d79457ad20dd25f903f72f2a9508c6a9ec34b59022111b80cfff93cff54d42e28d630a08ef4ff5626ef6ad34a8c2cf61d8ca89470633dc93494e09e7a8777d79ade2b5c34fa7aebe4780a19fe38c5d8e1a4909749ad649c7402af4e36a3450dfcfb9c02466eb312cb2c871ed52a0c059bc1b1b2f5b22d41985b55fd225ee731987da8bc61c3f34acea5ce4c6d8b087ed31b594fa8313937510f64cee72d5a37479120f601d5f1c3a333ea230f6c21e7eb69820b8cce0ff7860deb50af4cc21f935d4f1e1d657ae2e384cb4b58e5b37a1d9984b9ce5b3f96ee6622525f02ee856ec7d98d6600a75cd7c817b92fe3dac769994f22d56f62e9a902a6e477c655af223e6dff052088f40f0a4a200373bd06b538dc8d0202e675f181746f5b71ecb98305976594bc41c0d081067b7cb1b1244ebfcb3546ea8f929d1cdaa41aa82b272c344497a963e46b1002aecb0c482cddf559b0b213378d1ed1f2fadec2ebfe9ad0f46ffd3f64b8a4ebdce9028e1aaa43a406874532f86803df7b3bf30325d4f5501db1993770965e7fc3bcc95d0a41af575d4c60424d2ef3dd575bf628c61712652e1e85c8d914dfa96b1753541916aeb6935d6eeca28edee36b86eb6bd65aa59a9bda736ff9cbe819e75bb9e0cf24730cac9c6600eedcc1889a6b804f5cdd04d74daf1bd1ec3033f99fd5016b486e7a6f5bbf476845ae064ff002db9ea2a926524c7be9e556112610300730d30c4a6ee26ca02657648c97258dc97141f583580446e327c57cad89e1e9a66776d10510847521dee858bb14d8f183397ff39e270d46c75c4b1a95e88c8b04f475a5367e209bbc48e0949be800024a5580cbcb4f01f51f48de15d2a8c3c5516703ee61db1b400db37e6ef2f8ea0e5d24f990c74854b8d8406f49a7772d876b7d900315ac79665bda2b717fd017654779ff30ab8c46cd86eab10683f541675523f34cd89d234d7936d2e51907c73c02725077ba0bda91a5b84ce2fb1261ea074701c95e4b7fccdb8ba8f1832ec286cf0501ac06b9358d4458d47d4a612fdf5ebba230eda377f93426d4289e03d1b3ba11c8819547893e37093a7c987a31bf1e6ca2b2d437bfcf383f48b8163382e9a559f06a480109d8ea75c2c0ab61b4d41baa3ca18be2c52c077d5029167c3fb02e8d1d5f9251072eafb92b018b8bc499d3140ad74eb146d83d2e5bcd63a9787e111b81aaef5c6f463b570cfd37887cdb0789e8f3642acdd53f381971360da02d513dffd40dac2799210c2223676b74135ba2579fb27ebe72d7ec3667c6c277f8af83bc411f17c1e46ede2e9220b314be8b0747b70ccdc09c181f8599e8d92b665e0aca5b50b7272818c57f0000000000000000ae27260300000000fc29c74ec5e20927958cf9db69ef0cc3439090b7ba5b45627aaa8742e32d0daecf911ca6fa134d790fd7f7cb705d73c421ebc2ec7c71eb0539fd59d5eeab7f348cc9096666b931db71e377403d2772cbae27060092477e1a62eff22c05fb42d9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008cd1c72060a2807aa0e310e7cdaab1f2de4f66b876bb37e2fd24a51414b32689ce65133e345fd84a6d791a9534214b5813e580eea8e2237740e3e73a710c7984bec1fbe41511563f4be388c8d324086f655502cb7572aec4f90b2bd498c5b880533ddfb5405f07b9c0ac38828bcb1354b48eeb7a0eb39fcae6a16655fa11a7cb021b80687804ec1eedc7732e20d4fe274ff0fa3b0fd9f5553f9eaf31929494ca6d0325d1258b553e827176f16aec2202519d72a61d0a5354369f0b631817051bfb580b00abec5eeb5de30114bd5754a3e8429a35b7f7e8c99f6b391b801838286b292c5772008d43818a02cfd5c7450ed0208a712b70abf2b67d1811038bf1a9b492a70219a95a0ab722b0ed946bffc67bb42f3550ff6aa51b2fa48c3c2bf8158519f625030531147e86449627880416febd3b9c8b86d0e3b229c8bec5e54fdc155ba44ee302276d5b13298d1b11842b4b68b4730aafa4b2031fcdeb55b0f0ef3a34981bd5e9022b948e494b06a85c5a7b06749a5031ad61fefe4b2531079d9e5cc6cc78bcfb110210a9d05bd3a448cd8447bf224a98caf69de7d1832d7babbbf8775ad363c60adab8770613c2417b265705a71faca91182a30f88ff52ca4b6c799ae8d681eb3ba5cbd5509c5d8eb0ea378dea63af8695d6be062d8c048470a4c53a1c2322b4198a48e223ea664d0f51aa6b0b158830c9c9a80a02dbb6170e34ff7b4fcff371b2c6dad56896a65ee040924eb7959866379c799de78b3bee44ea2310099725764a9be425d83727de91ac6e00f168296105c795539dda79e8a2e8798c65c0368a11e1b5d1324255f23a52b481b574401542e84da0c0ef25895d08b13549ce21b0073883ee73021e86eca96ef260d339e2107fda6c775b007ab99c501a365b7bdeb722dc4c23f0b78fa6d426661a39dd747bacff71683eb3e3598eefbee377afce32887b4c42adefc687edf9b17a4e8826f1747a57cff8ea28c5aa58be97f65d063e0ba4a9a1b4a202407fe853b7f5fdc6aef1920c920721096af19fdcea3a2216a1facfcdad605dd836e1014f82d1d6d8fc640488ef9efd3b12baccaac5efb197736e6224211d3dd08700a8e14b0208a8fa2886c5c71176e04aa376dd11b776cc6d7a50f6720d0fca26f7ebd897d885d24c2a53b2eee84b7aec55c09c12e480dab18ca3091e33afd89a2b70990936c706d88a6b22675597a7e6eca4995223dd911838f71e4379f696753a9a0e4d35013a3c47553cbd38f88073364e3fb5dca3983dfa16633af445ba01b1336cf48f7187cd9669995c774421e7151a96ad714168e656809fd1d9a62b9f115d42dcae407ab35fc36eda9aa6f5e150e2d4fa30e01946467dde1b704b2508a777b9e812b560a20914d0fa2371816ea1189c7157c806023774b783eeb20c745241e2415b0463ad546919299c02959816f89b71eaac823b8ecf2e5cd6e00c55e6493ec3b20146601e8e74bb103fcd0c35544e38e54358fcc2b61298c21baf061c75f6d42ab20a583f5ce2e09bcb9f723f8f72f511aebbc02aad77347b3f4bfec3abff5f5dab9346227aabc4f5c374e8ee5e8cd847db1cb09fcbf8395baf5e1d356c092d8e7bff1f0fa5ac4992616adf03e434f214edf0402680d26bff3a45b58113dc33f0076a7b24afba5251c61b4d7c8a7474f38cc60efb85b138275d153b7d0db4747b852cba130689e582f67b00d8425abf4a544811be13aa94ca8528e0b674b7b5e1663553af36fdeeedae5efa63d389aaa204163c461a5dbe0f4b0d4674c4ad112b19647fec449c50382efebcc45fc46786b90713ab81bf44ab3778e69e31f507658d893a41d3438a524b4abd9d0e8f35a74f39c87204f3dda521e4962e66e14bc13d81eb566e0582b9822aa2c61f8f0df3277c3d9bd650824ff6fb1a32dd9ec31b5a3f9b20e1bf44a610639bc5e97ed971f04e44480308aa6a5ba109125b72380ce4983854d77cd6263e00309b04c8387e2ac7321b9ed1cd0d01c34efc561bd726810f074bcbc91258a40c26a2db497d08e70d435f3bbf2f1ed5fc1b32257892af1f6653c763537281652ed27fdca08ae8cd4d5ee32d7306f4ed95a6f74b2a4c829ff578b3008b03f5794de487477a53cc1b3da555796888f5be84037b9bfdb6f8af19f18ea8c157fea34aefd337ea55d697bed327ec937094d3ec8fddb9d90d4913bdb723e9322a503585e1011d52d5e31a52d0ad095cea3135f808f650831b354426cd48737fc6dbfc19f189b49d32ea4308debc416e656a64d2fd15081097a0b2e9ada9ab70ed8a26ab8597b72a2b161254f7188f324baaa74c71723e6215c9844199d036af32ea09fab1f3a1edb378ecb140954cf8fbf0fb41144c4f9c18356859dfc80e4aff6c3ef27d08747609456ebed32840d1ea9c142bb2a16e32b3a188cc0019e50f", "0053006551", 3, 1575428823, 0, "2d87beec6ff7d96be91f95fe8439f9e2c8470a272388165a4196328073198199"], + ["0260154501a8bca20b25225b3e5d8f66b1bf60e17b826632f54f62932a388afded065ecc0b00000000026565ffffffff02cfdd4f0100000000065253ac65ac6542f863030000000005ac630053530000000000", "5152536a655265", 0, 787355631, 1537743641, "1932d32b2dcb95cf374fc5f5f4be46a8272a70536e98da150cfdfc091f862e78"], + ["0546741902c73a20f3cc22095994bcf6ea8fc42fd52bb1454480cd6954ae6a905e3b04326002000000086a6a5353526a0051ffffffff832511c77a32fef2c1ff0581ec6d9f5d39429e75c10dc0e2c3d3d45e1e97870701000000066a53536a5351ffffffff025c5f130400000000056a65656351837ce7050000000002ac000000000000", "5353516353526a00", 0, -1924696480, 1537743641, "3c58667639ea7056da12413f0a4f3e44437db6c3f316ab5c8eb3b61362e73622"], + ["e029a40a0227714e4609d3b6a76fc76bf6b36d48c485b1045719df08d2388b370b218a5c4303000000055353006551ffffffff09aceee327be4659658038f3f976ca517bb7509af2c5220d3176709d68c57d5d000000000700510065ac5100ffffffff04eb5d14020000000002535164004901000000000153cbb19b0500000000026aaccc388e030000000008510000ac516351630000000000", "5352", 0, -367524853, 0, "5f7e5dd9fb2f1e835a1d5db1c3263ba92295702f13062d3ed3d9a660349c4940"], + ["c73b5f4103ab59d3b5bae63441e72de22394bafea62074187e9555a78d1b02aa3d441f7f5501000000066a000051005295494b2c9dc8186ad05cd4b44147a6b83e47fcafc3e4e1fcaef786e5381dc9642c9e078c000000000453635365ffffffffab2514dd587194cfe32c21c1a9c465f993787d5cb215dd045c9c953e6d1617ba0200000006ac0052536a63ffffffff0320b41d0100000000060052536a5251f8baf1000000000009635363ac535352ac52fa3bee0500000000066553636363000000000001d0d3e104000000000000000000000000982eae68379f8a103d59b35a0150fedb2203d58239361ea0a61983c9918991b407c32f2d5795a6f3bdc363849d7f9f9807ea170692bf282900a4283497ffa3200cc88b802b0da4e74cbea45eafdf50edf0b51c0b329e8a0e0ed9d543966c27ca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006010c744d252df627f6b6edc8b3491b3b8f4ef01aaf53948bb9ffd4650f515a51c6c8bfb0ecaf0a8f0c4bfd5e4e87ce1672083c2e45e908185df8fa49b50d03da1dbf4ab2395007dbb3cc9d23eb77a5d4c7efcb174d350cbdbb102240c1e4991b544458142bfc5df8b3e38451735dd3e898d6de1934bfdeaad533be1dc4e21bc0313a45d534eaf2cada1798cd8cda6aa9c2052d51096ef6d51dfe15b790428f59602294396d4c8624e5a332bf9c129681af3424e3b9b33136bc63bb883f47160be6f0b02dfe19645d7e4217ba1c369681d49e9813e59b325a4e1bb8e87da3e48976fd8992b6194ca78f696c89c2292af8c6dfe0f3cecb0fa428d3e621876027beacff1031c3d41b52fae170f824035ec893cabd1ddd6419c4c49c97ad2443c881d5f76220307cfcb58f5cd70fb565334885ed473de2738bf1d455784677e909da17a54cfd00320302992f94387c3075ff3f9b31fa2d237e88a1900dbe52665776ea99e66513a031cc3b006a0f7c694b8ea9cac16c93c32838d383bc601946b2e236939359669aa03064620a06833429262db733cac3c4ae2e57371416b97d321787b723b59ed417dcfe4b3c2b58dc643ff2f6e3b4f99df0e6f8a69561eea93f806cf9adb81628e75258673f9264772d0426ad779f7d23b5a96f10113731e3fbdc4f482058f647f38f476d241eb4347061a9e5d7dd2f77e738de8c35db7c1ae9011aa622fad39a770b7170cb20bb6a8c4eb3535b0934265690d40800b0e02c686cab30e986538917fe1283575aafc625ef35eea0f0ec9d071554b9147ded1d737527eef93547f8495784e9a81c9522d2d7dc73d18119a77199126d559d9913f0e45d5fd4c5d98562a7916499f5e0f104e7689154f1d6adbb4aa20ce1a52e3e0c8fd9f8870ccc64a97582c429cce80337880fbfba399f2e35cb83a76b58d4ef244d11764ef6899bc153e2f5df0dda551ce4746fa5ecfda6297c3ab44399445f797779d5a20de9d4fdfb3d99a945824cdf2df058a0533f4e0162fbc2202a76a58cb31b288f488f3516d0b3294b27cea912370cd122f67c211ba26657fdf171c725ea33edd1caf7a9631ae0af7c5475eca60425187b09e37023c930db601c3183f3de468d762c3d4fc97bc950411c5b5d4e01df807da4e17b9fba0fac4969d791792e71dad83b710a86c9dde58dd8e45b7e04d5e55307ee7954da346e95cd45b3a870c82fbd9175fdf0ce3faf2babb69e08d202ef39c38d74f232dc1fc5497797f8899cd53ca52667349b5d2e7393ec40ba3a81d9a4b84cbaa21f36ed6cec30f5bcf07063caae9f939e1449266adf7457497dbaabfe4c816582726e27147af80be1adf028994189cf9746bf9b4879bf36d69978c6b90f8af8a49e129a961b1d4ec373bbc371e22a507f03f816bc582f341fde1746f6b76b7b9d0a870b6c095e8a21028e146055cc52adf56e22c8279371794bdfa5292154900d61b2f98842b7cdcb4dbf4d4efa56047368b54b4c818b7c72f8205284b2e700b8cd98b21c3a34625fda57f324c5435f8dd6fd375597c002c3239c2a8ce44a876cba59c000e4bca75f4358a3c3aa7961ac7cf21a27388c0cfdb998b7051a3b8843c97be48d8fbbf0b08dde9f5803d2a350c565926090fd1f82ed80c12f25513b996657ef65e73a6c544d3a45cc8fe0c575dbfdf7cb5143a1a74133a42c64229a72dcdb5924c7b5e1da9051a5388a129aab50cdc71a1f81dbeb8920ffb615a839943ce1992ac87b68ad7a522aedbe9cc24efd39894edc884596c075d57ec995bd216d1151cc6fe9c9d220e9cb3ee200c1713ed90829d85f0bc33cead1a026da6cc90a58eb002b412b730baff5924ff93a8dfcee11db8cb544ddcebdb36c8c29ac7c9e111cf9a65f1a6f347584cc2a8d0384bc155760d9b2230552668320a20875c456ce06cbfaa6a6040758e7286ed27429c3bf3ea2d6ce771d0b9aa1bd21c226d8ea7de96cd3d464bc8752d9b7de5864e139d2e9d8a7e323a9c49ef8c15fe8b1982cf82d87e94ed4aa49819462af54c606d429cbf3d3e34d2495d9475724b235edd3f58d0966394408677345e620d45ce5f332c4dc793bbe980b965bfe8fe48ddafb6945a4a36bccdd0f2ecd44933bb11a19e84835639a0235078bace6c4657b90ca8b2fd31643eabc27249ed88e92d839577edffdeab38f345f2a317f38d89e3247519f7bb9bdf75834f27e4c8e98b0491adbab27f4853c66e9b056cd2418e94c6ec8e84ea1dfe280a26e69d7429e41edb11319f5744d0c773872e537995d1ff99b1743c51552ffb977fee9fa71c8ce012a4605fd60afc82d850b27c32e1d52ab085549606c34e767caeb2c5bf01a5e2660d18d2e0ac44359dcd508d76744778bd4fbeb062b0e86a7ae08b1ebc0036dfbc49d822206c81b1349a6728c3a1dc04e97d06", "00526353", 2, 1612076931, 0, "ae3dbbe55a4f7f98004224cea88fbe752f3b159c1a827ee5c587fea430de68e1"], + ["030000807082c403036e68122408f75f2d97cb9d7c81ca3b8c1cce95cbce4639ab5e99ea9b94715d52020000000753536a636353002e249675927295eb8483a3c48c1eeb92ede7d5383acf44fdd145f29474eb3a0680a9a6ef020000000351656a5b3abbdfb2900ea1463158e8e02a96e5cbd3a5dddc4eb276c97228cf49f042e67f4b10ed0200000005656363536affffffff0461f08105000000000453636a53189e5d02000000000965520053526500ac00c5cfc2050000000003535251221fd202000000000153000000007bfa25880200000000000000007a1f7600000000009bce305cc5263292e5f0d0179dccc4704d8a6fa992632d4698e668e697c463dcfd3aceeb33701a11d411b2a49a35c338ecddba6af59b393931fe6c60757aa0a13ffe8d258b0bb197752b5556cc0b611593370eb66ae7c7009f4e98014cae7a1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b22e7294d7330e075b65f94b4e479c7f03fb3591171722bf41fc28f9a1ef7adad2dee3e0f260afcbef9215ff73d82145deb2d8008d98d3139b4f6b00df455213f294d64d2f4e2be0599d63475c918688e11e14f1547f75783fde6406d8aef270eb43f9e29a3c306afb8c44fc376d56180e66bfd292a8d58434ec9a862e357fc70316e528faffd5620b6d518339252481bdbebdccbb81fa67f12acceee78b97322f0319abc84a4b29a049ab37d3491b12796833499b1d8f6619da5d94c08fecc9ca600b01e4f5acd5ab9a5647e80cae89651d09ee26f64bca9f01f7eb6295c1cf56b4a7a080b6c0d61eb8282aa90948cba574d1c0f05a192348f495f6097c8a07a03dd702200904fd4fc995963ed7d062d445bd3245f5c40cf67e374d23d5010e0dba81d3030dc2787693427c99f2831ed708c537ffe9a7c05a17cd2c45d49ebf33e9236702030a5376e71d10e427ed23b9a9f295c52c5b44e7336fc712adffdab5e298360e4f0306b283642efd60e0fb563c8c5d260537921632866c1bc07d8d65400e7bcb2305022f3daf8219b2d548cdecbed851a3b2dc92341acce4064f077be82c91b5b9c2ffa97db89d1cdf27e376684c485adb7adc3d637780a7cb627d82955cb4cfaee0e8c30964f8899711d4abb3be144297a329e628e6425ec109e0ad848d9d74559987f6224a626ef4e0d72baeb94220a63ec00a09f67ba19c11ed519f438ec1d20956d17f294a9c52e16c6b12a4f0395416cff9b12ddac031f9e3915b874b66104d3912f123427111b1865192fa591218a78bd5041a8c21ed2c0baa8a1aa0aefdded14aab9ece6d5dd7831e9e3fa52c15d1c629f44dd7885b84caebfdf782dbd5633b305e302a0e855bf56ce43dff1b83b9276d2c9b61b97ebf7806cf7b285f81114efb77988f65dcd04ce6cba440674e6b5d9852c4d11dcfb243d5859079a6e41ca514ce2f420bd3a2a3f312f6f9a3cea3f96821dc62e49b537ab3cccb4336a233e58732d4f5e9d952a8316efa9383d81416c512ee29a4af03eaea7c152fc81c861ba15429d317c11b4d172bace9df806c93bce2fc583a199883bdb3ddb0a357e14859c9c919b28e4562b9409f405a213f422da65b0a71d2db78509caded62f4fbaf9f3bd900630481dfe3d62110e5802fd327c7ea6a99d1e6fdee79c4fc6c47dc69ae64936b180b5491579c159743731d0af857236f7d480b3844be70597fec904ecf18559bc6398e30a885884110f3baa9de37735db266dda1ef6239784195bc363d55f07da4b6acdd581e0c7c879719104c81aff644198e987ea285d9b43c3d84c07161fb312d6bcd1817385f823191899f231d53050a1a2b8a40668bbc5b503dd66d181730f31f882d1658bba81eca41a570dd5350b276f3ff361eb07219bb7686469e9399c5ad913bbb08bf4387f5f58e745c84f31228e097dc66becdebe70056d4c8767d50e0ba4f76e13cbb28a83101a8ace29ad32b56bcdf2d528ca86ac2b655e97bddbbb58e293d6c0206dad7f595b7554148b29f5eb83c8e169dec3fb7fb51230604654a92ea0bd6de982a574dcffa5999e26f02e8c8a3cdf3e830cdd5c3152c810c3d578dc0163d200cb74e74e7b965e29e15fbc1eb9fec8b63feb8e74d7d246d64bf274d7e17e6565676b812b2cec5adbbc4c23b14b9e824e4a4afcaa3d5247be70297b221f0e106895b632089d763ab55bc5fb464b8306fda41f9041f54ca20a1e03b5ab942c2ff0b86d8763c796a6a75d2626244169799300b8e32388d046266663d510cbf87f6c1079e894df78d0d44d9727d9e5f66b2b55026bdf42cc0e20ac9b7abee59eee31035534a94453de04c9d0fbb5918424684bee6f05dcf54e098eb2587b47e900df70860a681ed7dff7ffd268305587b2806741ffd653bb4f1fad5391cb3493cd62125a4a27e17d90754a0d474ca2418c9dccfbcb91a67a9021931ca8867395667b8bd925daa44dea1eeae95c7e562bc697cd8c9711c560f3c2357b2c51182efc8536e61de26252f02431dca8f0fbd7782283d4b577481df04a8c0682b52efed20a0d197bd7c83b272915c0a80a143e335130ec991a358d8d31573922be3e16b070bf1b484290f4766b3ea6c810330a85c6eb9d1c8fa723d205aebdc3a3897db302c5e0cd64986b03e258c27b1cb5ba326d2a9c5956e0b48dd4efd106806b7a1f2d466ed0867fd353e00aacdb9cba4001ed96d88c0a28f3d51fc935a386877dfede513338f6ed408e90c7a05f5f392fbcfab3999390c0f5161754ca281bb4972d201cf38d455bf00000000000000008352ad040000000014aec4d73913d89a08f7f9a3d932f4bc5007626d7215713812736b46250be6a53fe40f6d2f87b309e141f239a7ee7916557cc4326845876a2d814270ed6b57bb602bc846165bf501a1d8dda28ce7187aa624ed46f0cae5a0d6dd3b4010364eb100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000754e565cc712467392785ff3b353ce6ab7aa1611c17be6c83ca25cff33e42fcf76306812bce8790bf2fe45d24c35586d20a6ebf0d2b81504448bd6559222957f9d9a74496e8a5423018c9e031827f886414a8ccd4f2135c5742c3f7034f7bced839c1235ee83ed43ff8309ce4158e1be8a15d54aeb3d3e891ded80e0668c32780228a72bf9d294edd49fddd68bfa60bcdc1a4476a641ea2aa5bf08fed19b5cd0f20227b13e5b52471820d87a27436d8701870a5ea6c936c7970bfd2162a7a0b612e50b05665ccd3b8a52909ceb9e8bdc622da39f40badbe930e9e32c89811ca6a201075316d8e067d246d33e260d5f66c6fa541237a5d558abdb5743fb7c0065202ede0314daed4420c5659c5c3c746e585c3469ecb35c7f4d7fc9d05053cb74be8ba34803164e25bbcb24ab23c4e73b0ccd24a1ff0113ddb8aac84b62e06e3a213454d4360209b40aa7d91e4bbbcbaae3f4d5c1f027cb998bd44073de85b0ae08a91539c0ab030d3322ae2d00403f63a41e50669ec718060b21bc3a4de02b38d75ba6aa11be8402298aa75028f49c7cdf932d2708046eae357542c691990fa47594b523eae90a39999569bd96ef9ae31241e19d15ab9421edb3bdc962e415840d4e6324f06cdb30610ad44ec1e89effa959233fbf2d08674c2a8c376db7fc08d1a9ebe130bd9b329efdaa1c79469c7076c2e8019c52e0478fdaa4e11bfa44a83ea1b337abc58f9064f386b6cc38d89105a8abccfd88b24e96b54a76969673b05fb0b2706af28b9e7198e2c8ede0b1f1603a03bcceecb810c76688d2881211d0961b5849f6ce562dbe33c0747197ccdf1f8a892129f783d9a0bdd6462a1f837d02c5b7ad5c795937fc67fbad081a41d9c8f1f35017c6c0508c9d1922bb1659495e5229447312672f3be088e4f4fc7cf6420b89f5bf2a8a6aa7451a52740ce648d3affe143b78c8b6775b222b7a5b494f10695f6571178cc3ecc97d6174455f3085c64dd647d4c88ab30a9883706a3740c531768db32f838f9c4fe238e1b1d477513410fc61529d64596ccb6c5a030fd692d8fccea5662ba365a51594b50c5a33ca13a2d163bae74410ccf15b2c17fa9a2ee2e4eafbf9a9d68a0b9207cf12f8a5fcb9b08099438dc877aca2c4542750c2c3de4c90c7f272d73e98d753e7c14d1b8e6a9cd996937444767ba6dfd01c5d39d678f608620ef919e4aac5ea699169c4c89607df56c8ec629bfdac803355be5ec5e2940a9708a49183ff82b0b00b5ce738dbb5ca739437674ec30753f9322e73e1315a5529f2384631a56690d6bdf69f7a6b2828b44881deda96bf78a655bf5c3150d0cf4e72cf5ddb6342c8526f9b240b5b5d4617e3e05f623707d347450f7a9fc979e0d0cac6ae7082c1215a8272db5b5c52f26eda91001d838c2327db8e70b90f97a72e9cf06b52dad1b9d8799875cc18d0602be5896fc361a670a83d97b92f257140d12a1ce8d85b4fd543daec2eae8962bc8f23508246de18a5b0dc6576819e0829eb27845fcf85947103614068e70538ede9bff0f3c702915f4a9fb996deb6956a08aaabc0039163c10d7a92fc4d46bb4181869657503f96214ebc9d3a1f10405a55ce643bb7ff1ff3c493909dd52cccffde3540201bc508b05c51766cb51e9cb56a656466998bae3ccd903cf92387d8fcb355b717e5d505fb42efac5d19775583e8b3c15dd591a1284e1018470d72fbfd65a6c1d3686291b6771186a2b4c523715f44f721f34f06a40b04119aac27b5acc3bc02ad3397efe4c165fe6e2c51f078ddc55ed0cecabd736d9fa858aa565c48659a89a64fa3165160aeb3dad84a6c9a25df17c79f7b5beb0981698d03c0cd4504797d4f8e5962c2ac22c2d9ecca3b7ef12453902a82b559a1bdd1a73756bb7c34a3c50d3ed2ae3cebb7e95f13d901b091a169a7e56c911b4cecc4ae3b78910a7ab78c87cf64b40631577402d67974633ee9029073d81d56185425efca7cf5b65d6fe2d0c96f2dcc48d3bff2891d4bb915953a34f84fababe573aafe4321a2806b8f2b77a3504389f7fd1d987694bdf052e0ac566fb4aa5a60bfe2f6a31795c1f366209269e4654d4e03def3ee3d760cc45a9c3b96cadf811c568156802de0c9e0097094bd04bf02e933bed22c7d46cf180f6671bc2913f8efb70c16363bcdd938133ff38728e5a204c9fc923d0281c6ba45808bd4789ec86f0a56c37d56e79c9fe057957f9bfdc2b1f2d321e9533ee0d404b38f49ca113fbf584cf290b01462a6885de48817eb0939be30ba625776b85a0316aac3047fa7ff62c50ed55869d9a61eda005e647dfac8269557069e30f27cd73ef4798a885ebaa301fd20047e8577e19299bd6cfa0466d6728a4b06382d485307f9280219d1a44a2f2e2e7ba45a5044d75cf691d85e7d9eaf8d74ad0c236fc380ac430a", "006553005365", 2, 432100598, 1537743641, "189bbfeb57f9443fb895e3657c23707180e9b989967e7aa62218c1f34bbd5f90"], + ["030000807082c40303482e88da7538fd8e3fe6141ea04e3637687422c72d66c0d4d5f0f5a918cf606f02000000025152ffffffff296ac87f86cc22eeb95b867888c4ce34f715d0627fe867e38ee79a3055ac2bfe03000000086a53510065535152d621effc28c4cbc2e9446dab4ad11d73333d3cde877dc39690790047d2e9da1f78d416d00000000006515351005353806c6c0203ba8da2030000000000a09dd703000000000451650051e9f3550200000000045263636a6ccb2d0f000000000300000000000000000f704800000000004000d1e8e47dcfa84eac3a2eab3f9030a5dac723ce1232f2ae62a31f91ac65f7dd83563a0cd975fb355f874c7c4da0f719f3825af9f4c79c7c0c10669b291e5985bea6664bd34658ad7cbfb9c0b433912320092f1ea820dbbad2495a67b1d8d4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d59ed3b1508c9fbb4592827b3a87e8a333f27cce47e7e462aafbaee57136d089cb9b44c605c12509f4b1c7c4651150a8e9907ffc401e2c1562fcc823e32e4b0aff733561e18ad27bca241c684075807dcb9888fe1d1fac7bb7024c012afc89063e528aab0bda368f5b5d9d77c0ffd1216a69a3fa2a73b4470ee0fd156ecb8a3030ee91be5267e18f97fb9522d844900d3d8959e5915838972fcc0261caf4cab0e030d26a61cb9cd30acd5639723ed61d9f73f13c5f3c608d08ea4ba603fe7d4ff090a087cb4568e346ba9d7b58b8d603ae9e51c011ce6617b0afb569fad305825bc0c2f9f845bc11864a55eb5cb1ef60fb746c381cfce6bc5772a51fc1698d54085d80225eb5da24f617c31825a38c0e48242dad04f87987154cbf00291326bf783735d0312a11bc72dd10a5f35ffdeccb568129efef3d085e78c6283c02be2bce60da6a90308868483a8d14cb9e2fe629a2dc14febd45c738c981afc26f76b97acc306e1550309bb5b9b5aabd31d03f8316bc71a1e01a1761a1728c63a66f7b0b0447949462d0227b29f4b993cf46b841373ccbcec9d6882fa6f29c04fc1c746ba407ab8d89545148637ffde46d7fe3fd66c9f7e0bc45c644058c3f3cbe0cf315ef0f7964a56b6801135459fd3bf94c9104dd925134c589e76b878b5e9c507b1c0940839b3d991516ac9c2b63ef3a7dc5d99eda385edbcf46eaab11ec47dffbdfb9251b87b1147ef38ec1e4cdc71c2cb442e1625563ee21e47401308eb5e8c3efbe7deae9b0ab9eddb0a49054b2cd32cfc1c70801eed98ff07cb62c1381f7967cd03eaef19dd06575d2612ee9928c5de0a9315b98935320942d0b0441e76d7f98867e28682ccf04c0f4c782149b217c8fc4c7d7ccc58f1c755607f9d6d5c70388e170b5ea84f2a421593bee0fbe63e9225704cbbb3de80276c4838e663cbd734a4ce46df66a6c2280cae43af272968d116160fc8d87dc2a1782cac368f5d4284178d32aeb72e1654b7ce9251c9edfccc49e82ca3681096aa1353b74e6bc98c604a8b2e4d0ceeb26a0fdf9e9ba484a4cc6f9936a928e63aeeb38dce5773b86ff4228e6d3a5e3cac1bbf7f30608e40fab185cf6aad5cc0c856af4800623361bd09a228d63600aad3a47894891c4bd0a378a6584267eee4b1160733ae6a5faef3697f939cf063bb3edfe7cee34a9035934848b6536e58f63ef32cd153742a98aaf430c7503d73fc99289248e662a1980f14b7004426bc6d61863f7234665928d9abae73a7a7e542ed174a9601998f6966728bdc05790656ef16714625986a03562a7be753b9d58bff2c91939f5a189cbc9d232609097814b8b274803af0df04ab0601fcf14993e53ea908a6f7f964f931f00814e06dfaf59547ba73ee8aa71c5039aafd1a9b89709ad49183c9ad17b7300d3707064fe2acf917dbf6382ee41f5b98ca7e04277f7a2dde88fdc3fa407a680522b456250e70dd954c74a91c3b9a86e2fe2a64914f221fc12455dddc349e899d9640e90c75bb64a288a13f7f3153ce34111632a267fdceeeb67fdcfc7c65617cc6239b50e8248507d721ceb2df200909118e471d04afa4a2bd71e1b5d58ebd577d4cba3da691bdedf77b6e4de5ea71be31669ca6046497626415bbd9178ad507b7ad9078a876dd421b20e408adc22ae090ad3358e48845ab24169bf1c21da096769eeb4932936acf8a95ba16c15555e83989bdf17082a896f1999bacf271f1d42f9c9ca488882c614e86f3d18a26700367d36efb583e8fba4a4b074df51167eb9feccc13554005a4017b887bfa0df8d568de0fe819b66fbb35b0d1d4eb61bc9b9a28dd675f7120e08c931d7f45fa33215c4259fcafc81592f8f2dff018ecdbac14dcfcb1d07b6483dfe93d567c4e2521495a2182c157a8d42bf35dbe171f51d1dbee269bf27edead4698d955b846b81602dc25e5dc0fd1a8803d52d196e1129c6db55426af2b1b8073704254775cd568e43f486998a41419e8444c3791bd0c51a07af4c295325b035649f5bd9d7ee42ea28ef4711ed556e523154f78ab9a7c5782f41800b9ef7a4b495ac15c2975e632906f80031b17eba7c1c46fb60c9386650486c976447f7721fdb5e4e918e4f98effa9d34e3655c6e7e32681e7dd7083435be749a86b2f7d380d671b3e9981d4ee3da56f30fdcee4955362b6bdfde1497a18611ba3b5ed8036a4677a4fda65ca500fcd95a9ee44ceed32c77c64636ec43e17c2668ebdd99127ce744ea5752fabfa42d809ef4dd4b06828dd9e9fc62046475a7cd462433a7af1d20000000000000000e6ffe2020000000020adb623ba399977401969095f018d59d72c8d8510d725dccb821304f1465b0bbcf7dae10b638dc2048934974ff43db45f6901ccb5db6391ee4d6d107c9881fb228741d4fafd3bd41c062769dacd0d68138955fb100dfe075e13e3fb1295dc410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063bb0effda89f23d9657f2396f877c877845575f8c6317d435d7af78d708e384a345eaf1f18bd7f7eb9a799aa98c11cb6dc47de8c01a16a6a87e23ff40c1340f0b9a57ccfd87f4c051cfa35a3738d6f70b9f3d5c121b3b61ed0b0360e275d7054e98291920a2785f9966097405a10cba6c600b6c23783b47fc68e9596263b516022d579c0b879ebf4c9f8597f830b6f35841a854af08c2795246e521ba9d5969a70302ff28417dabfc2ffd01adf6cec907903febbadddc251a18e48a2d174f5e42ee0b035a6bd634c22e1a3a0c8a18c959662c2128959c9ebb7a1fb2209420bdb8a1cec9a5fd6c0090399ad7bd8a7661147069a2aba4c09bfbf4f9157ad6121d53494f02037ebe0dcdf5ca6e1c689d2ec9799908fd88a5f9d009f6a684e8ed207bc58da1021e8eac0cd65a7e596eff03d5f018e6a4f6fca51226dc441059ccd2a59f306674030df20c446610d705b12a6e21639cfdc40da65efa4826f29ece4438e6c93af4ca02258df474eb90739a5772f82929e4475be50ab068bf3e8a66e139a5dc8b753edf022bdf9aad95443079604d4041f76714da175d2d74bb9ab15bbf9db3eeef0766afff338024a94bd2a18fe389152c0dc5a25ff156513cbde453cfe1c621bb32ff35a9cd40e4799c724f9c994d8c34da1001f2e14607d4b475d594dabd12f15d86f62c1e733dfd4b354eb4c442431a93dc785b685a9b3b097037505a5a6024afb9da066aac314585dbe29c24f09cd0ebdb81e0f0a6c13f309a52d5850ce33b21f9a31c38070bc2d6166a6e6d5f17cc521fc9f999abd62791b144b7a7f12072d1c24c84ffacde655f6e438c5febcbe998013fdaa8806f169eb75af4300905fde0970780a4ad3cb32c3a28e3615b911df82dfefa728233617fac284ed29846a8ae83e070b1de01b07fe439766ead6f3bee71730cf30245da0a5002a1f2c329225b70b3e5209c8236cf04b54f6974853de577d8382a1c2e4472214c6c128050c3433513a63cbe5fa64b14aaf6926fb457d8f0e423a1e0853bcae63697f9691b43a1afd438c4686e5fc0dc0f83475b0003c048f24135becf844c2bc5f5849551025888881ba26e11c031ff221dec6333351997f96584ea88e23ff36d2b8458a08c9e8033af5a5c7a24f2e7572fad216153eff098e6405d78c3e8ca9f0006387c91f278dd8789e71ec585e9f9160201fa1442390c08e7bae68c2f1c413ec1454a564f3dee7a6865961c1b28aeca61d85908f952e1febacde2ee8c9e0b367540a736660c750388f35e150b8ccd0e3089bdd67f5a5e7443b8ceb0f7f780002bf81931f6fa417ca8c5adb89f5624b375321096ab3f3ecd1a22c67e1580022feaa8e253e5af66f4c57a5a7d850f5b6faf860f6a9d34573dd448ca527c7617c40461ecf27047d6bca0af21f6035e35ab28363aae3dba97de9bfaa0793e5e7252472ddb192964959a4b459e14fdb4bbb01a3773fafcb18bcfdbffda5377026e37fb0ee419b1ab38128581549a65973e621c648c5d921c171979b92fd15fbb3a6f173651a9fd2e2bd1e222a7d55e8cbc9337b601e9f85432b608bc21774f0420bd349a57f2ff4b393c6408b3dd2c57f5cd7f6d5b1bf84334c96e32301b642f95b28c4e72fc2d79ac137a1dfe2eeac449d7f606cc6a6d6b12e06afc91e47ea23d5915a68827dedc3677770a9af20eb99c2321c1fb40870aca89fb9b08856e66692e21f662c26bdbbaa84879a07f8f91299078e11a5bebeb49bc42c85ddbc39b9dfe3316f66dbc78fac37105bdc1e7532e23083e2a12c366158cf707048a0ec3154e1831ea8b399855d29012e622710805246aa0280713660e980b1dcbf83c1a2465382c4c515c8022e059ed2fe22f7ece9a1d67ff850c683cf616a4ab7cee0d80d5c1625a9f282314be310cf8b43661386a773d65ab0f281b025ac011e2f1155da665029d35a9b3cfc127d60a6a00a111e56e50ac75a9316b86d20db38bbfc907fbe3748c840636601ae25163a5cd29f42d92d7629618b297d9e3949145b260a77249579adc9fdc56f327d3ae1cb139172ad269592b7243b485009c240763b59d736ad7885ad78a618722bd1e1eb8ec7686c1983a9ce439bee6e36c73b913d5cf76815d26b99c33a431e64764ad4ce1d0ef74bbcda3bc064bbe096eda164b1b320efac5943db89a684fadfa6891f2bd7be368ce27de3b4aca6f14a59812a4291c70d11df582ffadaafc77379708927e322a8e0f2a3f333e2aec601bf860d2796d448b3e8adcf36657b63f21f07b44f826fbc411876dfdd207df7a00000000000000004211580000000000ce4572a3463f2066307acf87cc7c313e0864aff76cde4329f52773e247ee8aa0ad6753ccd2a697cba26cd02be49a54d5bd7e563c31440dd9154665e28100ab240c99a32d1daad75e86f5f061fe86c07f11860395e4eeaa1a1a0262374ee8ed850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086b140714d5913e8d4b2940659d5bf7c85ec5f3a87494eb2f98f17158083aa4957778781c1dc155937a7d1f76e4c6981cb35fe98a1f0449709451f300d55cac70dd6bf0960d1e85c63ac7e8ad0bda259881f8e4676bfcd76dd69b680fffdf847d41e0cf13ccbd22b3298b55d7cc95a36edf150b265c5ec4cab3e071ce45067900308f835bd433456cdb54096287584f460d5e11f59cca5de84b2a05cf6d539e3af02279b3a78bea45915681b841bf252dc450cc021fb4209889f6852347729756e4b0b04bb50d5ccf9eff57a46feb90bbf50ac3c01eb3d0b67c5167ef0cabecd8069e62c1d411b733217f9b39ff3b30032abc1317b8f3134ba2e9dd1c8fa085d31149903128d06676cf8d81a16c61b19c60d90ffdadd1d6058ba962b5f571022ae745b6602167a92716b8b069c4bf0cce880bb235f9671974e8897c8e45d40c7c843489c420226489156d3b9fbee3f6ca0cfaca9be910b55d80d85cbb47df2a3412254869428032ca60ad80d220689b09e95c5892e95111df456fe07a158dab8816dded70402d70205195b1b7b3aee7f421496f4c7629a77cd4bd361df4d88c493494aa94172802827730436a85f4e9b9328e276ab59fe6b4eb2d97ce9b3cf7b955c454d93710198c46781abef1c53a001d6b54b9d6aa3cfb98f04c979976cc8976635dd06d1f9fea8c75aec10206222c030b00f89d06f67c25e5ad608e3c639c13816cb811299d41ee5372e20a2bbc64604e7edbde73047e58f3f56ebd05d9207b84c9b331c0eea4d591c319009eb6d9721d6c791951838d8306e4eef08e0c98fd54dec948a2b92c76ba81f75cbb4bf42dc34a3f584c6de8a238068cc19c56fc00f58c05213b6db16e4c5ed4bb7247967d58d4c3b1217319d1e21e8befbafb5f573beeefc8ba5f5db51d5d6258f6a2f8504d89900705cd5d76d5e74753d997ab238f7fa946d61f5528c40ff7ce8ec63a7c11958e27487ae5759338336128e49b0a0064bfc9baff7af522fd3686b7ec5f56a4797097790c79956912f200529374595b613a61b4db125b4be384c6dce7595ef60169d3ecb3d006d023959fa962b8d5d1dd246e46b91a217fdfe2c3868afcffec36778a88b44b87855a03180f8cf895aca58a2bd0ce54038ef57f2630f35ccd6a7f58669478bac8f5683dce808744b250e9344efdc33cdf1167fb86f5ec90f1aac87043e5460684b6ff368226d7520cc91c7a5ded30fc940a07d954f25ddf672761846076c1cbff800daf9f9db9a23885f8cf4bbf3de22a9a728f66d8f4bf2322095718243f6e3dc08c4f1f12c0a640168489c9b26e97052eb7bf4513881239975ea4a256fd5fc412de3d7e27ae9bfc05573ae9e15fb5285e1cd73454b97b328553a7faf9d0d3dadcecd8b9ccaa705a10180a9258ab14e3960d0008d89cff085dedbe4577490132e1e6d086dfff9424a051dd99552f00424801886b89220275acd959b70876dc06f3dbfcdcb30774ed35b8142676784878bc8981788edf29cf4451a72a35306401949e1fb4f48eefe9d7c741ed774747dc5775c0730f882d58aa1a733d27051278a00c0979c917d217cdc39e12321a217018d5ef45350c6aacb657a5d3b4ecd290b1e81d52aeb522a0efe8ccef5cf72eae00ed9136e4f77a0172a75a0d5dc523edcc3370533dcef5dd81559c68d7d14b694c6592b7e11e446a923db54bf23ccef02a2f83c991b4d27f8d9fe3f93ef7ae98a3943733f7038cf5b9b72b972ff9cd6e28e06b60630feea681597f9fffa8bcd995a83aa5ead5dd78d8da5dba35c6c0852dba7e9ffb2e7db6c1a92ffcb1b1d507830f15f432ce6a8e6647599385a5860f27d6f2d86aa91df4ef4beadd61345dbb86d590a3a551f6f8b1c12928adc805c95b71d5aea88cdee6845a95bcec5dc7d38463be2b5934e3a8e4036b3765bb896d29d2679cf3a90dee3aa3232b3787c09c0e7bbf393160f9d8dab46ea1c2bea7348c7d77aa6e914e0ffc9f06548b859e3b19814e9a17d18047df3e75357b4ca0f2675222e023d43ec0eed39205b293b4bbabd597109bcb92ebdd22bf10fb5af26bce03ee0bbb6dd33ccc4076c07c50e0d7fd0af9e77ce9411456b437a16cdc68d2eb5ade472e134757a2cfedcd2b3a5cc2c8a8677ffa74de8a3c2ec7253b503d68cfb8eda9059af305cc86975fd1f43d19d0496b34ea88f65dbb812c7e28ceb5794e7d75afea070a86031069f273538d9a27095d0a5a66ce0df50e55709a9385611ea1550cf737826883323cb2aa3930ecd9a4f4a9e85bfd0dad8425696dcf205da2780c6e3bb20e444c1426075fad940fb9de256824374bc709d62a71fdcc66a141bc3ae709a18001bfd13d6d1602676a0f036329cc45ce1a9c14fc1bf01760364f107c843fcb3cd5b924002909329b11b27036c69a6c69520c1e4b144e85b790a", "", 2, -321161762, 1537743641, "81003245fc01e90cc80a125cd46ad2515807074acc5c99ba90a502a51650056c"], + ["da81d61a011e817c9ce94555d5b5dbe7114bc618ed9ad4b69c359a185ec7bac2d617b21ac600000000036a636affffffff047d893f040000000001631020ca0100000000026a65679b140300000000065165636a52ac7089d2040000000004006300637582f2160390208903000000000000000000000000dfd977b42034f9534dc9c2207bd2f804719e11933625ad83131999240b14c28369a1f7bc453fb57c4a85a5874d6ce6a077e2427ca14c1860045b2b3f28078c9516fbea9b544351200c6bfdde38a9a35fbb392971bf004c5304c1a130c8b3487e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002cd357b6ccbf83f7437552db002c61caa2044f403faa3e5658b4fdb546df16fb165bf2dfdc1bf23c859187eec8ce6d02b1604fb3a3898cc07f8e8bbe3f898f2e91307eda86430837240ea9664812f151ee6ecdeac01a4e092907791e01793d8ab582a55d07aa836c900f1ed79228060b7129238fdb0caa8c225d9b07311ea993032fd7470733ce368bde5c89d947d6285ff75fdd355466855cc0df724618c03e47020a784264207a83244ab673ed68bbfd98d9bff6bcb9f0e06bbb0cdfda716d46f90b0784b3debd91ea9c414524c10dbb9f8745316564c8da41cd1b05ebc3374825aa8fd99cadfaa9c0e6006722f084448ddfb05c463c513f39805fb0b03ca0433f1e02041a8bb40b69e354fdc93671ad3e75bceec1008d3c2cfff0339e93dea8986bcf0223dc20004b5536a766c4a09a3ef49feca219349fef9e51540ef322847d62c217022fee4b21e15bfcccc48989e41ca96add0e12b8fce0072133b3554a3bf799aedf022b11dc6f702f9fc17557abbf6b8c21a0b21965296bf0db0a6e96124899f2bff1022256e920d5f8e28c0a3ce13d71c31827a963fe1c90ed3c8d523a549ef6d5cc30a304410c1f746b6f199638243f5cf9bb6e915a93539fc6f81d75044aec299c8adbd8d55102947265c4bc6bfa902a5194a556c0e24dd4844dbc6fc97e3166406793b279f2669ba5eb1add7b256af6fbb753a5d8b82b3b1b7864b8380ffd5f289f3339d1c34b99bf648f2b0e86497c5410ef3706133ace729c3f81e1a040c4f8c907bb2faaa4023de73c4eda78d2f3e3b67a0e8213d7b41256639724081d96556f96d8086a4e88c8dd863e4801320f9ad37106713f1c1d89c7fac0cc9f48031dac85f49677af6c77531417f4a469ebd33cf88df9ee72c5c16e54693b712a4bb94b107ab0475b3bbb130d40acffb082566f4308d4985f5db3d6aff04d0c4640e5e5ccaf1e607ad3ebe15cd388da122d59879f8edbba5ef116fa71e182a23b631ca8f2ea86c82bc9692093cd13e35b7ff676bb1a0e635fe33a387b4f376185816a38eee53c92941e2565cbcb90133e241dd1fd58ead526937791f2a0a6653f9075e0322a61b461cb82d4baeb3782b4afdefe5b7a172ce33c4a45f532f12fd1d35b42f6a48ebc9e180e72e9b3a16150d283fb6c8bea446ead8cf66a368fe13073408a63404bb563b8ae82f17a5e07d1f5db366d863608684c57d210a6e4206dec9705d0b2c6f47c00c990d6ea6fdaa77ea74104284451e5f15c42eed3a2cee52e72cdb2b93a0d35654598f0467c7d5f02db3c6580d7fc4591d52cb0a6c1ca5724b7d039dce9f0141882ade09debe2064b802e7fa2756fe741ec4354c20f0d4940d6931d083fe0c72b568fd5db627847b85f7fb903591a92422206cd47d965069c6b0a462c3c59e1ea8883906420d54062441630837ee73efb8d3c69e8a802e83fd5a7952091ea1c0c26bbf61f9797b2f892ce38ee12d39a7267a9a038db1d051943c4dc2df076b50d97e26b2b6cf1675f2602b9d49b13b69bb39100f7ac1a1f2bc7187a7f9215a4e99a92d00a74c9e916ec54352f26f224103ded8a2329630fa7096a215b2a9525e805069478def271d6436ecefcfa929e195d51fbe909a44e5b5d89fba5748c600dbe4a884488aa4c39ecbb2dc94bb25b54855a587123ee9764ae5aba43e97b321ce71d77f4d5b94150d592a5d360bc4a3f7ab55c1e2339db1fffe9505ce5e26b3f37d261f878f55f48242af1ad9ec269f58ef7ad0ce67ea4292e606ee58cce94120fbe09a94622deefc736708f566042127bb2d4292297cbfd9d6d7da303585fcef8762b7d1544ada0234ee604d93a480af602bd5756439622b9b229b177bbecd0cc9d62b1325ea88443178c8ad2a3eb441d7d0de2f849a5bed5d23d339d1dc76fef93f8230f0c4a5ca045bbc70b72081e6665fa895956188e7fef4aadfe20f998c77459fcae21cbae75f288771f5ea4bdfaddbd92e687857dc6f5e740b30954c7c012e838c6f259a6b641d839604461808fdc1bc51ce4111e14b4c4cea9643ad91edc33acd5c8ca7731b91e74f415ab9f60152ed888ab97f0ae1051bd8a49e0019bc575e715a2e08375269838355e55edcef4b487eb283d3f09ed681a34b08c3fb56ef48035f1edfff803bf80a0bc529cc99530d432fe73547b703493ce09ac1d771d8429240144590140d5a23d0998eb7b2105ee057ba89a57e912e72ca8b07e71abc101b437dec0d08c877a8b89b9cae17c121c7ced0b2a2c3678bd17e986ecd467a39be3bb9611c7d8b740fb5c9002000000000000000000000000bb11c596b6b5b5d51c3bb90533c40061e03d4f5be258ca791b70af4d31845bf8669bfa8ad53f5c2a3505bdaf9bd94c77d8f60f571ab47ac1169c4b37ca424b4a43df26282e23cbb640ee2310201a117d42033b9aae14c78fd27e0890a3f5274f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d76a428ea25ab0f0702aa45bf9ea8c08129dbabfb8ba603120add79d06ee509888b393e557292ce292d0de6f91cfec4d20ce5613fdef9222ca04941153f38c764f764ad99683b3447c5e791190b862f74f866e5556044a56780cecf4396e5700b4506fe1d347b7074f31efb7c75ab5f83a169a28869437deacbdd361eec9524e030e06920e9d70dc7f10865207dbcd2efb6b0685354ca6ceb4d6523cfef4e01ffd0214bc34b724e9f1d284ab43547274bfe4c616c9012a54aede015ffdd27cf9fb5a0a05b6274425a769f2d443c3cdef91886b064ffb9836c48032fee5db27e5dffd30303da911cbd56ac92f28306628b397fb489c0abbcb155a1f4b0b4eebc0d552fe0317d32741aac7baf9c02121ff6d1d9fd3b5de3f0b41fa80786b4f0444d527479002104377484eb6954a276defab5d7a8cba6f2a4c8d038fc47b8568c70fa79e134b02265809d02328e5391e0bec266e374e5ded2efd4f2997f73c476fa647f39168fc030f4b4bf4883d21be016959d5320b7ab6edd9c9d56d33ac0aaa5896e1070b2b3d0206a672fa7c4c4ed1fa28599abb74f64a9465fc2a22e3c1e056ce0642e73b052ac233a315f8c7e676b8c1c9e7b6f0bcb5aaab1ae3c7be73494995d2bb9e314d03408c317e7d391e6d6f8ab08c4c0c16caa090e57055fa92ddb2dabc47863708320493d1f637ad512a97332011eb52f4913ac6ef4b327eb21bdf5cf8392c716cbb4bc62b63aa9a097d59a4636b0e3d0270343c0753208d009441e902e2b03818bb44d53d8a50b1802f5a48cd35bbc97495b7f1d295a755abc1677f8c59e3c5021cdc9f331896b54d4e5f1855e23f0dbac640a9d3a723e50128e6a53fc2f218535e7d8543c6770feb0d09380509aa0600990d5b0763f1a69942fe6fd9f0dc69bad6d8fb6793b690c52f0acb66eb907725e41a460aec829622380f2cce7e524e9d37c1d4a75f490328304073a65d472d933f6b063289ae4d8b41d64bb5747330464c339f94ef9b72981bdb0c15e5cbcd7fd526f7704aef7eac5df6b9d9d6f7828ebacd51d28546a840d57ade69ebbc4d1f6f8b5a8f342c2a59bdfb4b8d91b71f10ef93e69c3947e7d09a1a4cc0645b6456a82b33bb868cbc58eb82b1a8ece7a6e771725aae38ca60ac781d25dc8e1b75ac1c6916819b9db54d0daef5e382d68b6033e5e3770ba4463f15ed2425d3531d655d0f5f8753b1763bbcf273f7faa9238b4afb9c4d09f639f753afa9b0405cf163cdb65eb573025be1cc015e188151510cf4a0baca2a5a55d972ab0a549f256a1c3935feeea1bf49a876b9ebac26d12f24f23e1dab70ebf772f992738990a03e9916835b37a4919f1f252a5f2577da1bb3865da7ab0c6731ba1f5b74201baa07b45eadec47097b9716caf657e987382499e58f21d87abd80a294fab958ab817c7ca5dbac3017b586be111ebb023673d6fed02ee748c90deea74bf4f245fbf815645b2918cdccdbabfa8fc317e11d1f9316cf2a89105ec2838ee8bbc92ec265eaa8123f7a6d934fb3bf01175c46a420780e0ededf5e09b9c196a7cfef69e978c37aac49e6fff4ba1b501c9d5a9033089ce50f46dfbaae3ebe0d933cedd0c6749a8e5c1e5c2391e14b6793d1e459a28e94e7eb9b76ced4581a45118c9f4faef7b53019a6d94b394156232f29b2adf357d839d46b2d1892886f9e387ca462664901c54dd7e7e75aab868a0e87f5cfe7ae77b3f6dcbeb995874f4e1a35ff532269c330e863543223a903363bc8b5fa4722dd382480a4071d3baebf795a229686eb127af42c83a29c1fabd646747b74b5fa73f5dd0d5a4a7f14c1da1a1c824c31530dce2e5cde51bf9c366c735378399638368b757f456e4dd29203a5b22ee439fd823b40e98a1a9f2c70ffd1fee9e49423e47087248ea01f9d20c28d4d85242eca8d0fa2b4037a53d7525c4ce2e37e6c3861a6703df24dd0c7d1726b2f14aeddfa70584637b2ed2d336112dc69e5d02a8881e461870294e554f57e631ff81d7a8513a7f0c9d2a7e5421c010966a9e93a2309168e4ba9381c544e54d4bc12887fbc25cd7bfbed56a39803f16cbe509b7783187d97cb9d7d76ce707645f55fb37e7d1a6ad1a0a36b425a54d585af4a3277d72cf490a8cc09b50188521973874a0d04359aac3fd6b7b310d97071e219adedea9d8a10630c9b49a56a162634d8511d595a24850ecd35676a4a4a1b19e6d93e12d51b43ea68fe680042ba8fc700902c2b010886668084aefedbd166f989d0f6af5300a48822f341e168b81b7d62547f86344601fb5600000000000000002aa75e0400000000f103c02e977c7b50bdde067669182ead8d846c4a4dcc763dca61d1af6c84a961cfb65703811ee09ab117ef56bbde6c684155d61b10eea512932fff6a8d611c8f200739ca99b689894a4976b2d7d0ab1bd57ffb9f01a4b93f74de577f4d007735000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d441fda6b113d56747888628c897086b0349aed041ef167410cc700638312f07b8c30ae03778e62e1800a44c58c6691b7f0b69220b267a42515dcbd8fb69329fddf9ee09b7fa706e6f74090b72076930064533603c1b37519a6c074e5985eb4abf3c0fd1bc7efaff57688b516da09000aae7bf120e748ded0b5144c83e7a7d4030db9ab565ba86f5a5163d6ca1a89e9a2ed03400cb902d0f4ccbae08b7cddc49c021c01c37273281de0955f51d4a7204f303c865d3741ec1a1e525c2dc171992ab10a0444fd4914593e663db0e0425a9eb00837d0a6c44cc106ff6ef969d7bc3bb506358858554e51ca1f417da1d6e90d499512796f0ad37756f2abbe331bfed6840b020c026b6654a7875ccc6b2e074e12ffb441d1fbac869b2d4a1c1edbb342620869021c43dade93e963410922bb36787d6082bb960408913d50b3f43c172ee886c0a4022c5805ef2930b2ade2451288eb0d16dd1ab752255cd0bf091190cd90e499f779022a491acda1576b8215913fa84bc331350fb1eb1ab038e918ffdaeb350671ba9602132dbf96308ba71bdf105b4a6462c97056336ddb9c8a7631bbb39d3d827e762b00f81ed7e5a7804b03ca79d5c9f48c06b61b251744986bcb191938974c0f6c6fbf49d45d1735ed7915aeeddf89d55f5e4b63e05068c4c8c8d766feb332c3c916f957f3345da21be888e3be61d431458d3160d6bbcdf4445d1de78d1167f53dee5590f2a03377428f06eac2b0ad1d0bdbba9a6173664bf8fbe1c36f957d7d99cf0e3dc55152910b6f4977c6c296aad545780e6eb02f99c34ce493a13f493657ae9d583bac8766f9e94fc3e49ea1ecf06cdee66c07ca598ce062c239b49cc283e76472ec7377fd5f8e9f57b9ad1e3dd4b6954eabf0be066ddd9117442122827144d9c2158297075c7dafe8c6ecf2c1d6fb72229080b4654f8b46123b7692322c7bf921578bb59d31d04b120d70cc22c436674c0995c05d27668d425bf445c61f205aee96d3efbcdabc286c39d955687e14157fa4cc6dd37b1672a9fa6183d34c65e3ebe56af7c3d28550775003f431f59f29f71e46013491900963f9ccc5be5c05179e6abdbeb5319a528a269cd78365cca8bfb35e011d1eee99838ae9163fd468e02aa70a998749609e4fc1f79500f32c03e5afda0072ac5e30b8b2e9e19eafa8bd645a94db85434ca060ee9772487c90e57dc53223cd62fd8da6b3e2d0d42e76ae14cdd21f3e5d0fe3f0c163847708ba6481d32b6db806e7e41fd613c53558d649a22f0c83c2e96cbb4e92ba55dda3b43c7e34dc174f598585d1aa8749349524dadf35bc3ed932b01c49726ae9c33199cdd8e046c32b23fc023a3bbe6b0dfc228743d0e603d98310927121304b75234c75ab094c19650be324f8ca7b638d628e14319f1e215fea084d6d2580fa5d0670e81120a488728b606bb358a34af869dd95d6d661343dff2ba17ae53eccca9068e99d6120791c16ce935c775756bdda7189f5351f9c14ca8242855f1607fd9e0bbb7dc70d029117d686e520613a831ca9a53350ecaa57c265815aeb8434d40634557a3d2ea813071ee4a3f5d8f6e46e40582714fb0c4af97119461a1f5aa11b901a6385acb081bd9e5bc4e1db8f7d7c9f8788b84c60f8c631deeaf5a0dde6487e92011fad2015a83703bb2f932c828729490e84377bf6ae359250f40277a2f01d391d32f5dd28510b356c0b8996807fe8ef4a882242c08108e1687e90b9a5e8c7f32e9177a0f35b205b85037e21a225c1fd8aa4c5748fd0eeda14359ab8db801d8f5ff7fa470a86d7fea8cdcdbf73fe8f342a7045e116e597a07bd53069b2f5027c9c87f40bef0995d02334f5df9b57971330889951e9c5408b444524ab03d70877d6b4a8a767c614a1fddf0ac7f9887252f010a561358afeb7534239a403a72c1bc2b4c1dc7562a9e6a7da7b6fb178b95630cd9b8fc12bc0fe6c0d0258462c676c6c5b177e3fe27f1fa53f4c992795a160d881341db40e592e9fc28cf3b8ddd91e4e907cfdc290162b2946d136cab39497f480c09f7a8cbdfd6fa121df61207f80a1577ca26e101c340ab58b0049361776bad81e196ce1799f1314c15acf34bdac1c4ec1207e630b039f93320c894ff42862a7ebe48f6e57e3b7bb0b44463baf9a2678104a0bcb9c6b3dc4840f926e150713aaaffab27805c29e1c512d187c6258fcc99004d4b37fcfd24388667cd31b1babbcde262a8dac4c418025695552fcc0d0d3c21a57d1225fbbd1a28e96e6d4dfa25889a7d8cd795b60288cfbec34318caca6a9cba692b90ed9f1baffcd24a4da0740361a0cd264b1d791dfaa9d491819ec6bbfb2f606969706458f44792d1bebfd189b0c264927a8a4f422429fbf623731e64ae262da285b735fd510a9644fea7f8430e3a1a6d5c4e16ed19b0ca96f3305", "516563", 0, -1807184100, 1537743641, "105384dace5745d6cb7b8264f2e86f85e6a1a1c3b3705b64c64fc0f380f2f068"], + ["030000807082c4030184af441a599f9b3b5780fda2925d6fe98ae155dec4de215254bcb8db462d81ff01000000056a65516552ffffffff01d41fd9050000000001530000000000000000039a09d6000000000000000000000000003bf3c4d0e1385897373b3c35238ebeb9925b9539acfabbebdbd9fbf8468a60c2389f18778fe27f5354ec8cdef883302dab795858f6822993bf12121dd694fccd8b9a615d99fb5e341902ee32180ba9d45c45bf65bcc64fd4af883fe0d75451a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af0d4f3df62d12b674c7516daad880f56dfd52d3fb472f66e6edd6d8dd79a0e6b8e6b1ec1452a9999ae6bc2733611d9c63ef2f689302a9933f741ca9767dcc5db613b1c0a1d1fa95e34a939b7e015ba050112f7f5e8998ede396593fd49306985f14e481ddf320141e8bb9ab9bb5445ad4d5e9860a4927b3aff0d4589becd8b40312636cf8b96c0782e155827980fd53b85a491e84ea27d072c64ddf16bd09c702032e09c0e63561b511236041006e19e2cbf99b874503ae0fad619cccd9b5eecac80a042be4bd2f76ab354a9059ae117eae35ce5d223bd2e1ce722441b2bc01b5bb9dc3ee164632203a930b54cc233fa10c2fa6803ef83371dd5fcd2dee7330cdfdea021b7ba3556e2c5b2c3b73efdd96a2778adc86463afe368eca9002e8a6f1d9c45403189876c09280233a3f1dc44a2f2f22922067868d62a8ed4bc46e8f966eb2adb5020c29c20fc3ff147af795a1d87dc5c9a3692fd2662abf3a09cca9dafd274e2e6c021508f725f46bbc414301450e1b364fb354a4d0529fe0da0fba51df35307b0dfc03132c3238238ca60ca43d3a036b4a4e09fda0a2a984c917668619b7d94b3a414a4812a970bb2298c06ac462b653c3611e337cc49ef66917b30743cbb1e9fcb832055e5659f27297fee8b72daf5504bc190340bb21a877a895d42ec99aab9f4855293d1552f08132ae11fa705a202b683c77f293c7c9867829896786c904e41bf4ac87b6745e7cb4299b5a0114c2dee217964e28d2df7fd08a84fcf93f80417e6c99099e5ceaab9fddba47688af049fb023712044cee0fdb69d1fd7fbd857a3def60bbb706307cd1dd961dbff91b7811230f224f6753adba07c567e40e43a76d5e56987437d4e23e9b0e7b368ab506785a7834e2abe7432bb6eaa45682edb107a3d1927b815b3ab17151e25f2d0bcfcb59a087f4500238200c95369d48b5032f4d0786c5d968fdde88d0f64991c87907ea78411ec43047b4d8f4e6d5419e7b89cb4282cadc2feb6f03cb896f7f9883603bae8f2b7dc7614a33edda99ff3f8123e9dc47a0d12ae5da70e2212aecef3b454f03eb0fcbe6774d450f2278348753aa5728f331ccf58a67c8935efe29fc9874cbd5ef47a2e0245290a84ef34773e2320ce5151d5ae899b3344eb061970929064ff8a239e85796f4bebce280ba224ec736e990792e83456faf63862c9fd67b27d1bbf9373a222d7b06b83bb1250bd527c4c7c0e6e6a26b3ae01bd6e243e01bb065588cf22855ba9ad66964c81cc4383ef18ea8ed91d9865c133e86653a386dd420d416f50c7aaa3d5379e576e87fa0f844e884a5aece92141eab52d6f9a040ef4bb97cb5c807327d9de9e384cddb77d4bfa2a67657def13277d92bb98d9f42faa71c538e0766d68b7eb872dd23eae5456226434f2ddbcd491ac1aa40b8c7102ff925f022aad6f5889997f12b6410675c6f052866c2a5dc1d8c822ce8961dd973d73ecc357d6d8f3ba8d9f3da32a0fcbd3a1925e210499e522b7d4c5e9b2ca5a07101be4d95f34cf0f2cd22fdd46fa183c4a4e0d046d26f4380c3bc269a61c34aa2fae9c884cfc45c429b3285243b273ebb0a87d51e0e1f7e978dea0f058e721cfd86e0b2365e512418195b5cfad1c013115c8d171f2e493144af8bd3f5c9df5eb54008f31e862df28c393a3fd0e432a8dcc784319915f189c5f9a0460e5c4decf9dad1456198c9f899135d954732c7d8defbce9fd64bcb5467c54d17ecf59498b448a552612af6484dfbd63e8392558124a2ba1883a1551053eaa4591f66b495d32ab2e829a9f0379b95f8fd14c6019e15e592fd8227480532f60e2cc9797e5d2337bdbda51ac5447a323db9bcabd852270f3cac7d998ccd140bc3aeb8a5c00329f295fe0da949169557753c037e18937b48a153ca666011c9938aa3740e2c4b1ac56cbe2f5f2135e4e45442ad6f5611abd3965b331a1ad803052abc50db6cbd057d96a922ba5c297fbf4628a515422b4fa1eb3f5a95fe777b2ad3acff8d3c953fee0b5595cf60cfbb39d9abe302ab740b439f8705a33520c81a87a65405925b953a28692bcbb5a97205d4baacd630d92aa1d26b9feff8206911dc8eb4b2972e3135b4b4e7fa951d09d34fa342d08b091c3afe00bc027d6e580b35ba2847003cd2c42a0dce7f4e20750f48fb0726e7067c774d4bf5a1b6eec31cb20ca3fe467714f97291d23c86c200dc4fd3b854d56590d971a419d0c714f63664c0cfd9a10e3e0d5b98dae041a0d92ff30e5d65b757b9b9575a4e2762211bf4bc022d5faf72a97d3e000000000000000054f9b90400000000ddcbc15995229383d7f49bfde87c5df6b9b4f7cbbb992bfb45ed743904bed6ef590f5acbb9de58524c8d5383e7a0263f1c507cbd7f16673535de847244f0bf51996d76a415485ab6f0ef9cc629ef702d84765e4591294b897511691486ba7f8f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009967be3eb9fb1e5ee87ab68c4c3edad3b4efb0bc8ce9d076922c9e1f8465a06807949e225ab5f9ff8b00c87d3ccb1cfc4893ebc1211d83e092bd7a0b6a7c64809a06f21286fc767feb33a315a768f3f59ae19917fcf8d70b254a83270d93794f54089b46034ed455e5f0a2ded5ffd72b4bd83f4b0c14aa986742b629aa2fff4c03099052c1ff3377dcf7ca6a7c7e9629046972fbef324a44ed0d4eb51d7c643ef303219cdc6416fa84e0e64a048995b09297e552cd2a62687b0d34e7fc94034e61740a041575059a08af353beee33536e5262db09fb6f5c43d71baed429b1d3dba6dba2ad8e4e07cdbfee66e0d69c894e09a49448ffee61b9033defb96d84583f81cb303017c20527ea7569f6579b7713f7edec1cccf018b24be040442cbdfd7b0b86fa302027cab642daec99e2da5bc2734ebfe0ed2de9f0895bd7a20ce0b8b2a7f22dca40326e5ad51fb628f5c32ed61632f5c8b092d9875f1c1357637cbdbc5adb644d740022142dfa22ff5f9173a4e526993b536ad6c4fa53ebf5295e264860f68cca960a902276458a7b8958ec37193bb172ba2e6a969e9cdfb7f0cc66cacf509581c2f5f10fb576cd01a7ca53e319c2897e186373f976fcd8dd1f872f6598808c2d0b29bbedb498cb64e6c66ff90c1eb6bdf27eeb3ec935ff14b71f73a47df939bd2362f63d2bb052c2108958906cd42bf4ce4429683bcced9d771eed641dd25d0ac351a5b19beb4d9970ae871e284c78ffac80f8ff72e1d25f8c66a80c4ad3bdec70332f75831af6db405311754a2be7f9fe84759bbcaaf153dd326a92ebe15bc94adc6b5ab2ae301f4b4aa7054e649a30660bd24e2d108b0b2ce7de562d04523abd22634f58010592e2649c3fad2fddf2d2018ccb5124d7e4adabb8d65822ebbc58f820cc8fa4d72f8341a290d83e777a287c812547bb65ba83084c735e2758e5735b559420ad25c23d33e3cccb766577e2d2298c18e591700bb8b966a3e96a325d76ec207e3e1e07972b7b49a1b16d2a8cdd2c44b47f5694bcba9d72070f2c66bcfcb5abdc718dfeb2cdcbb008454c02c8e9524cffb98e2b9178891a2a20deb8a77df5891616403298a15c04055dfa0518b226ce69b6a72dc923c6ff99e4180a8ebb0854fb0bd4da0bf010726c16bd9ef6de861b6e073bae70c832ec2b1134533865c5546bf242a1f7e0a2fd31dc1934e386d6fc419949d8f84929c7e7e1ff511df82120f128dce7642df9b17e8a8a8e382e9205f32cf134919974fd6622c6dbaf233b96a06b0dd3b647881a30f7c3a2c7eb26b217ed7bce7aaf6219f989ea71794939c1d8290601ca5b1f8a08700c0fea55845ae88d7bc4ee45f83167be4cfa294aa6981f4ce54912858478c7bf78fefe075867b4c1a811b4ab545de68f78caf8f514d031466ce2097a1ab2ec0817628051e942aeee4672b0e4f690b93d1d64f66f22a75017410eefe403fb4433b1e987d08e7733555e2e76f2320fd1186cf8b99e2c47274ed5280e170c426b08665896acc62d649008580f23ba7e6daef5ffc1847109ba3e125597645a08c08b9724e543fef8c906d4969b3dcfda4529cf5d232147a03e09e37ea50ce4f8618bdfd63447aff8ddd8748da6f8e1c30ed5b8967412996ea9c6e183fe5efaa3d58d13fbd03d29b35fe794d387f70d5a83e79b4f5af11da8191d840e4395550d387e44a5a0b90e487f50352be15f8a3c03804ece0719cd61af0545f1af077924eb6ad29ea6178a95819c3c550c67ebf37919830b8258f639334327bb27e263d71e659ea3714d61f1a3143e2e089b5717bbaba7e4e046cec21f4734b81b40dc7397aa6c8b2176e74eb2ee2d82476a1dd6bd8704bd7b98d4f4f8e25e9e7fd3c60ca5625161973fb88655271da9b6c88aa924a02c2cc15ee36f8944db61ab991178d0df69917457331749674dcfa7f45ead66eb4b32ebae6ae2b5b1fbb6f55c6fbd0d8dbc73207e2a9c5dbcd1ba6896053e2d524b7ab1d93cd89de05d9e9139d1aa5245292ecc32cd8141f887451412a8863a9e7de5ff153a3e024d6cc30f6487eb35f1c3fed5702ac3f11a09fd448e1bf630821ed7d37b2ec781e01ca4237ca9389aaf4e5408de3fe0654bafbd5061e543c7b96d0152eff5b379dd3c4ca8517ca5a15896624924da0772a4cdd7a6d5198b4bac210e8e1cb088b462a4688fda55aa42e325369a65a1fbc5700dc405bef6938550041f5ca99ef37cd3a2dade73b9a81546fb4644831becf4c1c2e073dd8bf85cb2d2443cd385b1fcdfde5bf4e71181b85c016589d1abd31ee0000000000000000d65d3404000000004521fbbb975dcfbd346facf305207fb14a8ff72afc9b36294d12eeb655686964ba3513e169008383219c2c9c64551d5b9becdb9aadbbffd42e0fa3a43bb20fc0c317e092bfa9163f89dff50a1434b4b5f141520321e1cc2f8284cc5a93d451bb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000165656ecaa8c40476584e4bcfe4abf71764201e7b94ba06a3f69befcfdf12df3ea88b8df5b51f0fef2f2e7b66ad580a5f45945fd82490124b8e5fd3450ce3e124868eb1e661fefbb3b9f33ec48ab960e0d23a2b35494e0e05c4026d6def664949f47055e762b13539be598aac8e9fe9593c7421b35cd0e48d8631cf1787a2e2103094dd544a3e6df940987891cffdefec1c6d70fcf38e8235c5e1e95ad65f09242022805c100890963ab30737dc28b92881bf9dc1047b36967beac82d0027464c2dd0b03ee18a6c459ecd2d46995cda369d2bad08813e68cb39eb3a62da815cb4daa1c98db8f2f4add66e27134371687b0942dd7128f5ccaf3da142c2cce00bc96b141021278d3aec3a31ce4a5947083782d0d7dcc763350e3485eedeca1bd44bbb689c802099a5a5c7aed1d1b58211f0ef0f27c1d507794994d1243208326bb42c4b29a3a0306f2a58568187df93b3c41f20f2881ff1edcfb6a572f4476af9f349f7e028a98032e174b7b45df3a17fac5406bc9fc2bafd5808f1493ddee736cdba6c28b7502a803097c8db877f91d5de43c1b6adad259d8b64ae80662bd7f9cad76e9a30fa4cbbc328124fe2254467f0f20b98cf028b6fe7c34df620134a73f3a2772c7976227a4d7980c2ac676bfef08a19bcaf20e8327199d17b45c678053bf351ce1e9a45b63b1c67297d6c7498b0383dd2035cd5aaa2a2f967bf0f0ac20de13cd972fe23992920d0af46fa48831bf23b9da65ad2498fec77acbc6e82fca430b3121028c54182d99bfab3370793e0bc9c3f4bc7e088a345a6b2297de41a8303dda3652c71c41d544d000b733e0b4f8f2f3bfb08db879f3402b21ba8386674fc43f81be267b8e89df1c20b3be4ade3022246c0d2ab37fb89ff0a91562ac28c1ed41b742713b63d2152505ec26d001495b58d2f06efb25272a189b362fa4cc006b9390adf5a01cf87f8f5f9c44b99ec781cb4b72687f37e680d624f405bd43df22979e04b574ee8abc70360d954bbbefb6cc22871b0b2fa48c0e75faa7e62cf40e78e46614a8ac9c8d973b7ac5f68510e5e2831b98ca9353582c9de42f21e314129929576781223c2d0d246394a28e30996e8c8ce426aca980303fb556f7e04129919d288df481ccf3020750c21589507ba5a61a4228c9baaf5e444b10739bc2fe3da27def6ed7490c67dcc329cfabf744d0988e828299301789c63a4c593bf089afce99ebd6628fd1de98aaf1d248fb80e93de58b67a18d8233e1c0c0a2d511e33bc049edb90c76cd11a2465b23eb0f4040cd3a412cab1f8a45ab5a873554b6ac09cf0d3be2c61aed267f2781033a9bfc71768dff3c8f9ef3664e581b81ca946a8baf7b9e6dba41cb214f2d2f65240f967797a5f114dd164fc5088142711d1f7a286d953434c3114ceb6ccca321c032a30b0ffa00321437870de85e73dd5d23efc5a9bfc305ade360474aee4f851cd609c721232e8bbd0508677e520713d2cea5889a15fd1bf0104c50a03813b13f1d0758f0f50c752c2405deaca1039c6855736617923c6581820f344854ce6527cecbf00e8c9f6533a142597f0c07e151b8396ae2ea23878275c4d0e84b134a7c6d21ad48c1a7890e4d71c3d34bb764aff17fee3292115021309e74d20bd2254de77b3adac40d5fa0cc5b2c57b7f6ce8ac31d10de351060a3ab211a3fc5c93f0f1f6a7f5774c8776d2c085a6abd6be3f4fe6cc71ed430bf10632605870c05ade3bc9ee2438773a02da06aa84bf2975422b63f02104427f47482a7cb34bb596670d7300a13fdacb4fb5899377a7a482d3d5891aadb29e5428314319d378d57394c8a60b84a8e4754be66ccc1c3ac932dedc702e41399a88798528e6f2a9c763a9fdcc19231d348517e3bad20cbb05928629a808a71d084e309b161cefaf164598d12449b456a45ffb53c1698ef60b02398cb6ae3eedbbe3f718bd0da8bd06285276496f66968339b42ac9a4f4d2d63b012a996897f10d88b6ac5cc9b5759ffedd3d355299603ddf1b4a329cd87b61a2451bff023eed9a31911b139d0caa98f82b1bad3f21a53b914826ab6f96315b44df2eed3fba693a4f6b20c70cbf629b27236a28a82df944e5683c55ef189d69499cc11e83b4951d4bf2e4d3a28e084991caceeef6c904bbe7e59c7405b8205f70d5c634200ef5c1b7852ded270644f5a882ad97415983ddc6b9b937473d7f9702785f88c4413640e345242d5e822f909ed61c3c905a923283cb4bbf7bbe3e9c59e0c314a9e7ec2ac5414899a9da3d3aeed749c2ab7b772f43387f0ffe67ba83230b3a57d0e695a4120339a746c2d1b210bc7bc56bd65cb221cc6a16b7575409c7365c922e41baffaf26cb56e76ae802e2ef7411eafef4b278bf593d4840531fec7c7a4780cf808af86988f4a6e04f50a2bda727492a5c7f83e05d102", "6a", 0, 187932507, 0, "fc5dfb9daf75e1c73fdac9475d1076554d7f5294ef21fb86722f5e6da08bc2c8"], + ["1823580f019ab03227fa017910a43e95147e98a69ea42c938eb968893c7c6af7ea1ddee8850300000006526300ac515299ac652a0402d4eb0100000000056a655352632700c00200000000000a42f90200000000056363ac6a53977f7e01000000000000000000032cd71d040000000000000000000000003488736fc9830d49b30b0e1f75efef1095b9953039bb42c975842fb0b65b66cd992226b4404c7b3e0f99d67ac9b6fefed7d20879a18f60ac112b32a03fc122127d122953eb4ac89ed947f8bb25518be535472ffea75cbfc96b44a4feab94da25000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000be89e14820879e31933dc7df5c06eca40653b85be3bba5043bcb9d16f701a0ff015d052ec565f0e6fb025eadb74702168bbcd260d53a5896ab69556d3215354675ac765829b4f98f84a18f8d0538caf55add8dabfa0a78a63baf851544f359b18425d14ddca599e13d3108c786bb6478da3ccbf79d8b067b726ce13faf76336022cd79fb5f9ba03b5d0d4110345578098b8bc99e430c21c0c165710ab4833754d022f77f00d508319e3be68ba76f51477b6702f99d9ada11920354c22c059ebc2b70b00137f207fbb52cdb11f7d187972d39178ebe510ec8c7d39e9dbe82f342ff83b1d7d3ffde965554cbc44151063d80ed16b7e847ae1ab007c67759b3718d91264031c0c23fdab4536a2b7b8f731b0a34c1219a4b610f9e2018f4adac3e92fffde1d030b7d4d4486ec7217b1bfd0e7a929e0fe2d55d4aa92cdd26b47076166e1f170e80206710eb2ee2b25c26e3393c180080e122707b66bdd727830bca396567b1ec707021a53eb9f8e2d42fdbfea1d5edef5d474bb144a4656cabc4e255212d0fe3a7284020eb5dbb074fa809a293382dc11d6abbe42ed8b059a92a584c5d46b0d520c99a13c1a0af52467e55c3a2ac915610856928f4b60359a37996302d5a45284510794d0eb06a634fbf52ff06e6b9f2216ecdb49762eaf282d41ead09bb2982675baee74a9bb4cb9251106d619b7fd231ad37b09b8d7089069397d3410ea71759b0e7cfdc670708ea5d6e3c24b26a142bd1ffcc9a7735dbb54a1e69a3601c5ee245826b9838f26d2232a99ca830d27f427478acc6b3b065bfbf540cb2c74e60a40b14d4e923ca8261b48b49a1562e1c956c9d44c7fed570c49354125871cafc6a37d6092b34aa1560b76151bf00229cc88afd05df8b002a6b72e9dc89f2bae7d4c0de001ce81aba3d9b602242e4d94f54b538f9b632307e955d43e91afd119741c5d1145aab11068e4c37b02c9299994d457777cdce38e235ff6364124dcbb532100c705c79bfd6ed0134b30237eb69d64abed68b2280290d04b52cf65e68207e97da881e7ae918433d5c11d71fff911dc11477cba43e05c2018033a113b1a66cb15180fa462e30575efbeedf36ac912b4e678602ffd59efe7c58657e2df8c25c53b32a37db08f13796bd9924b2918b5624725add986ea4e6b36b019a8363248924a3336b611a23dc9bac7397d69cea3eb87410e85aa202df4d5b4ed94bc2e8eb1b8a4cbdb140a472689b81c72be390ceb1e22908b300bdcd02a84d246e06e7e1c9783af1794db5e3b8a9926a9959e2353a3cdb9f44ab6acadb62f7e84e8bb9a68c0891e36899687aa1fea188be41c1fe335caf27b86cd1c625e4d9c3d2d719cfc4b6b03b5eeb8d52188f2f3d1069565806f35ae36e6f2c56032104b5fd07ebf90a83726b1eed6aef2ddc8847f9f2079066766bb34f43a08c076f2099bb099fa9b6b9851291f88b1fd28a3d5314611f1746aed50e628a428dfd95e4727609f6ad73399761fc7267ef2359fd722616515a49388392c23706e8ea9a64337036b6f3b95e5b93117bf8c10d286fa9544927874bd8e9eecb6448c93ace05b4cc835f491cc44c01d71cd0e29c50cb493614a8fd7165c670724ff3a13924299e7fb9403861c92a3d1e57932d1777e83eaa3d27cacf85abe72c90fc9bda81ef252bed875b513f85d28401a4d4e75e27522022e9f9c7a73ad149fa8424c894b04f2e3d07d160c47ee67de5bdf31fa3031a13907f9c633762cf1c45cfd3b9334356828812e5cb723c90bf05d95e4e104a055be8e498327cfdace2c7582830915b32a8f68e3da1f3439e01630176dcb695445d8a8a767856dba66affd90e98d707efce67a364b75dcfef89602f75d544094d1643bb97a555ea6b413439f79e9e78e619bfe732d703d6f1008bd513d18452e1d8afae8e9b2c042e63a651ebb239376adf015b2a43c3204f5a29778eff0351e9512b29ed292d47f26182f5fc9e3c7e37c430ab325862d3cfd85143279b54278dd2189b21032e8466d7de4a251839535e7bdad474ba38767a7a5286bf915ad28ff1789f5ff17b717d23c1fdd07cfa7c4e18f047538d71cf886f06b7926615201a880697c70b5895eec190c18129cab6a4b63fa5515ba872ad24c76f81e2014ae699503c8ba0a11445ce6e52ea9d43f8f667dd853e0db43148bc50af29bd9e7ab5bc2c01386c31a4119165632db41ea6650e23fe2e6b7e6b03380536373ea584f87bf84519b65d20ad5b7b869c591552fc79886ffe52c653c2e8fbf1859ab98f46bd68a4a4586276c04c5f59b04000000000000000000000000f9d8722ea556c12cd87e758aca772ba89284aff4d6907c43192c9cbcb06c8bc9858782d26c50aa9ce99f5394a083aa906cf554c3ef6261f62d7f27e60871fb7933ce2f60620c6c0033d7c923a7c610189e7dc1ed8442665d9bc701ef59e3269600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fb8b6d399f3bb7d0c3718b0d58f20eb79b99bf72aeadbe45da358ae722bd3a1662b263c28eab42de5e900d215aa8812e9634a970d2e5441959004eb37d58a1cac4a7eddccd99081a47dd18acea702701072a5281c43df79e4b64d5427ad7baf12c5a04a07482bd8668b19ff0f5a2e03030512481850ae985cb42032b6b6aed6303095938352aec5c0872ae275f8ded7126e7c0628ab5258898e847e6ef089cf0a0021d5a7308c4972d238f29a86794d49073bbb898928c810be3f51554c3097328600b08b05df1597f5875449c5804a6516e9f7b0c313dee0ee85589d14382b43f0f0c009b1aed14d92272c74023f3f2557b18a827519804a79d70ce4bfc7a6a1fd629030ce0871978514131e901243e5e944047c2c0352cc227ee17cac062a2ca3fd90a020070767f52b939ca1b11ffc951da98db1872afa1a76fbf1727d18d77ff1cfed2021945cd550d570464e562ec8b146d4dca7191d02880457bf9c99213e78cd60ff60206cf4241a3557106fc208b16c18e6e9b8c6f61ef390a496c749d71863d4d73640307e878a8e1b0adaea380edafc71d6315a37e7996f4d1d032f971f80a23b5387b2e84678dc850f7a04e0ad4a855a92f00c00ff68cf145e9d2650a6920a95e087c317724fe09d9beaf063e10eaa069d26e55e89bf8b9430fd447cf7098c1197d2e5d831c969d274d5c12cc9e7156aa0e023bb8f2d6d64b6213dd84b8419b4b12111740c59c2a414e170b599f7346384d8e02d3422d42f8997cd67bbde0d68b8c5c61e98d3aa38117ea4e35fe3d200e93023b8ab301731cc19f90c04201ca58eed8530e194535064e8103a2f72dcb578a0ce634403f9c73597696a5353539fc926ea705ad8e6e255c79b5529bc1e1b2b39e1b8ce66cb02f58c63631ceba7e79f6d73f66154d6eb0fe8912734c3c2316bf88f7aac1ff0877a95d848ca28435d3cec88207c9bc2fd094e0964caf31886f579c761cada40144e8eb7e8d52554f6ae39d168864520b01e4c15e469cd0392039d7f7ecd0fb0c394c5de5835ed8cba07d95454194367f7f474952941743a4f8802785cc925e6ff9922a6547c250a59cef979d71af1ef96c2f02a58f7ae4613d327421fcf1df9b3e7a050252247d55751abe6bab347ccad778dbfe4e7921ca551a536d2ba2deb53272cd14ebf3d0bdd9855e0528b21417f01386f1ebe9b3c79341f68ff538dacea4801404b68ecfe3312d607f69907bd39e33d4d771da7824988742b1a95ab3df9ca7b1f6c450ca48ee129c2268030995e577011eece1f810ff3a287cbea6a5b0f1a01dfce7d9f4289519fa28ce7a7eddf60906e59b977021dc3723451c46bfffcfff450aef27db55390294090143ce6685ff6edf81bccaf0583648ba393e329484152af450e050d23a4a91a382c433714671f722a701960e1cef05dd4ddd6a8a790e3f7b96cf50be1b78c27be34c0aa6aa74c7875d816823be930f350740d9b96a649ca096232666dec838d043c676bd9592d7f0f23292be7b3f8b9cfd69a39c580ab4e0a5abab3cf84fd9dccbd9d5c0537192a985831d315b1d63c33e3236ec8bb680a8519a3961fff8099788f018ffb921be00d53cca519b1a7e666a5fd3719b0732380cf5ca14a35c1908aa34025614d700118e9d31de7aebb48af85cfde133d06532a6b949f3bb9bd1c5b443e689c0af9024ed2eb09a673e629db81bc7057f90bd50b9b5c52d2028992258344bf5e0a40bf21e686075b6407305936afe04d5d9e9b8458d64f23a93cb25eb28d0ed78b8f1028e205e74ad32c27fa522068dbef9ef770c1fc4e0145e44a0ad3390fc38174d98a4460bf5c900931fe1ff9cf648356caec780f368e3ddd66bfc8a7536bf56271ddfd7618772754ee0c4870208e836274de4c42fe22a715a110e70b3c32998f3a9f62f9befa894299235e48132c0bac9e9f2119bd4e96c787ba1a7584a9422fbbd061a4043b88f17e69d8f37d97042fc4f1d5dc0fb00d2e63a7ac1825e1511935ed6d29ec9811cb871cda15b8d28b48909ddb5e6da5e7135606e3c1ed00c8d774af209b4a7c7e5a07ad8896880814aac8e0f927eaf22826c97bf15e6934ee290739955799840f0eb9851f8aa161e411fa9505fea644f5d5871f0639510d9ee83a64d1d3ae86f69203fa870a266eecb6e3e9bfb7dfc3a090d9af736ae1f9985e3450e8cd9ac884deefa8a9bda44e2e35b41414051d07aaab9de6274ed876204fc9518b17c9c03f8e80502419ea45cb3213079d6ffa889487263185164f8b8b6f4b3a6dbad14a648375d7a0000000000000000facedd040000000088f02883343908f97d096826b38fdab9d17ab4acfa83b6a1948514454c5504b91981df9b2cff2092b3586eb15830a9d196c0f631d57e6d9763df30d4e503aed9161d42c5a5999dbea0c538830c39b83ed307425804fe78db0a63e0663e5d77a700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b12f5087be569116fc913680e5bffed83610ab355c8efaba0f7914f7e8818a133770116528aefbfb953963c69465c0f9218cb25e99775e513403cadb8f579bea0f221962b616e8e6987f29f863418ff9143fca19315428db3de8cc0383df5579f5d9230ff82c3e35ca8dc0aaabe8b4b4fbe858167baf5f70026f135faf5a32cb022fd27a737e03506fe9bb2aee6051e6f80df5343eb12fe525bcb83e417d99370f02024afd246520fb5a24da2a59d7a7f17bc257673f3b6d8bb043faf8a8673c7bb30b071486f17643c3083bbb34c255a8e059e9307933b478a541fe1d70dd749bc3820bb5ddb0fdaca8186dace105b12dab47fd12c19c8984e8ea0fdbc224b65ff6c3021ee61d6079c012d7e46d4ae056660bfd64ebc0e8632dafeaa6020a898a97b8860321182a426aa9abcf111521a24a776d28593e6c57e86a8f331aa1d4797a449db20212ae744e20f18fca5115aa6fae7dc8cfafc89eba2fed08eba2073f75d03dfbc30221fdc2128d5fd0646df3c75b58285ac82573c67ef4cc5dbfe830b5ab23004cf503250486b707bcab1a3f2fc3078d8f36bb683f1e1e4ef3fed0c04296160553c8aaf07b0066a2bcb2cd85f5a558b31694af32a3a54d97c0b20ab4d32280851b9049502662209b8352b1b252b8372bd8df11d07a023e18824d4c42f6aed51ed7fbce650cfd5d92d5235a0acd45f8b456d303f933b849f84e013fb4e7a23eeff293e7fdb0f5a69174f42304ea176d79cd5422d0a683bc06a139ad999e4e3b3e0ccc7a179e56d0268048ebd3c07e235ad189b7528928232d91763b329965872e0236a46f4ff6d5cc8b5353ef9ae4932b87d9d36bc483bb8715d1045dc9343f45534dc51adaaf00c8768bf02e72ce0102914db950b5d602084669721512d6d508a9a5dd8f6de0ae19bd3f851c6c4f4ec64c3c01c3554b0ad8e2f884879b6122ea3cdb052fd5cc3d20d0145d8d0f0b9ee6762fabf2d33f3d96d2fd68ec6eef1fff0d2df21bdae2f06fc178017cc8b50a9cf934b62dac53f97bbd3ecc60455d8e9132811abf4ca1d7f986af0817d5a7cafb5f12d0e3aac072e5b7c565189c4557c261634c245fc24425493b175d1c89968be1d5ebac7d3597d71bfe6502eec35e7c3b9dc8014932131a77fbee3d47ee3434b94adefe8bd06e1c31736361bb1483d4f1c4c323e87a4c7415112b89568f868ed3ea167b8d65584669093e5bf478cf10fe085820042cda1290c9a199b0f890d7f45cd2fffd09bff2b770cbe7e3b49491bab0c5289f0b121c923efbc2bbc5a569d19baca80a1221498894d5a847f83134efd3ba51847de68c881fd75ab948fef50e8514f5f8090b9de03e0ad9f030619c3cab4f915918fbbfde5cf73c0d51118e168eca54ed59f52c641c3628d4b1ed66a94f1d2b286ec7f491f474d21bcb70dc03472153c1b916b9d7f38b40453638f0aed466e3e23f4b8a28f05b9b6e4d4f9992f301e9a53444b471f6102b2e0d2a72ae93a5cda1f8cefcdf8b905febb19e291a65de58e4a501f1bc1ba7a74b1618d4a77fd6a86ab507c22a6acb9aa063701abc697ad6c8d855efdcdce0b4bf6631e2e7d55f18156448b348129b274f1ecb6b07b7fe3751426ee5360a4e86d0e91c2a46eecee60857c811fe050f3fd6cdee5a38cb9c7341dc6a559b05f66c62832285532d56bc8448d2045f35e8687717ffa5a6f959352d2ef46a32abd17ef6d5bebbf1fd0544987c30831a2795ef8c382869f85ea61066889e62c391a490cd58bd80061e9afaa82cbc37ff205963d9c81f42b7023b2dfba07f01af19be65c53781378472eabcbee3b0ea4e9ff1d237998d7cf17c8e26782045405aff94f71ffd492af1971efaf28f1d35917661fd57e0409ad010cee5ec4626d1c8e6dad09c80a9a1c45cc4b54a8e4962b050c4ed6739de1083ec8d6c1ab8dd7700ea5130923f7a70dc932c48f3e9a9eb86a7d90afcfb61801223d246d644604cff77cbccd3da4d9c746f581573cbc703da1b6f6b1fb4688cf9c1b73356a7322c2c3329b147dc9f0fe04c702c40d6037242c4b2c1e0f15322ed6ffa2e520f26fbc9adc9902761c55bc885838888894d04ac8203431030f6a720ef4c314c78e2824ffc5d539029462b5d8b497cb0525391fb6724f28dfbc56194d60f295b79a1411e58cb5240e2f7a615263472664ef8be0d88d68a01403f94a8e2bc3a5b5116373ea9b2c048e19dbb8162fce5c98154e1f2c3d7cd318201fa0f3d10ca61d6960a6be1ae22bd6777cd6e2cc66fdddc88ee8bf0e46e96c6ff37e0732968056fc1783fbf72a614131b710a3dfdf8a0d25272883ea8ff66ef7d1bb7adcfd7d5ae290a87e3a06d18694777a277d323613d50dc585a5e390ecc51d6725efc32c0c25ed59f3d2eef0ead4a734277355fb15b2178e5a13b812d09ec726569aabd0d", "635351515363", 0, 514726874, 1537743641, "0d7014f6d66481c7b25b8eacc5841eda7d401e9b615e619ac172f3937fde7d4b"], + ["1551c81b02e0aa4c852efc8e925e7e9365d39b265e5e1fa40fc6cd305d17bb7680e0902fca0200000004ac5200acba9abdf9709341c196adc518183de834201eb838a4e5cde07d4149cf547085d08a7732de030000000151ffffffff024e026d000000000006526563ac526a2078fb0100000000045252515162ce403f03d0c44e020000000000000000000000000ac382698587a63c36ec24d44ea4bb9835c2dfe334104064bf894bd36052771b6c5a9e27d874bc9f072ab553c335509972bad9b30faae5b0349472a32d081af4f280cd2df66ffdf3dad4c88fa0b2cc4daefd14e3cf7e85a1caa14cac73bd13ea000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f6329d3f61e8021cb7e532b3232d1e633512dfa9d6f89ca08581a9d13149371bdd904663386f9385e87f864344b8c8d096841ececdce0ed169ee1dc468c4d1dc196091d63611698d2dad49f3a24d3c97d90630a79fb34748c7341cca724f5e135558f159ac5a387f3d948e53dd8828cfa029adc6290be18bff9cfc012cc6d5c0223e900f0a8ab6a4ace210dc1c62eaecaf116ff2bb72e2f0690fe8d81589aa51102188ef53b2479e2c6c697382b57ed7c01797005290d869ab9ff9d909a6cfd72140b0343128c804ca54eba5b0581aba91451e131fc439fb6e85168d128f1e7b6daea7f579c456189b967fd9869adad8bcb7edbf773714cc54ddb3ee8bca9e2b577c10219bcfed33156fdcbf529bea41b759c8ed666a6ace5fb69d21f205042dec61ca50209545076acfb6aab2c4f8070b4af85c85ccd525f2c3c40c6b5511cab0484376002261e8c4637a7f76010d58939c4f746dd7ab1ab9c4076ef4c107f28fdadd5bfe003279029ba9bc6bd2b0e238cdb486b20bb3969e4b3a257c55b806e02a3e83654cc031f1fd0e181f3fdc559dfd6015de68affeec47d5317d07dd2e409cd6e975f238320840573509c55d30fc895d1f38a3a21fedfd7690b744f6c1706ad52e42dba009701ea2f749164e91f4a7ec5e864ec6ec4edf305494e63b967b0d2fd0a6eae179c1b398b986802ea8db40983a148d7677ed24b70d4b4f3d7ad5eddf205bf458bb89a3d176fd99a7688f3d72d64f5b22b4077931831d709d560fea2b531d750018fdf5b9f102107bf9ada162b87325be8369a5f87227869d64b769d3d7d9af66455e7b97fd429b255ecae52c720e051d4ab49fa3bdc5dcebb363d4cb4cc9c46b54703ada0fdad5eef5b2f4f273bed64f18f554dc1f507d6c8938b5b649d70e76567670649507b6a46888f50a09d0b732d2e9b276d63da8ad373320754d149300d4a3895d1163dc574f784b7243429f285421858e66f4fd43a26bf379c8607d3493b60e18264c40d84d38624ace8b806745f7c4bd8c3937497f3af0a59979e717fc7ffbf461303f4d128fbcae06dbe7210e930b8da750a4733b5949c1a352f8a34e08426ffc7449767e6b86a8d6c566c389b231df208ca6e21551d6460a2d695004e02262cd0c0e9fa625fcd922fcd574fc0bd889ae758d1aff9b49bbbac21bde3afffd11b75fa1d30c3c3b3824813c58808d8b104a703aaef1a95960df9b2ff80274889adba5ff84abc5c769876f7521c64ad57dd6aec8a36a906816a4abaaced1e06972d1cfe4404521f558e6442874f42ddf08e0c8e75b4b64ef42d34210d63e5c66a4b4c3e267da8fcb084990a2cbe21084a9c9d537e3138a37c056db526bca78321e9b269e67e3f98c452800027947e4afe3a2e5c921741aa1a4143907773eb16e2abcd6dabd687970ae23741205ecb05844810cd28e9e2b630add8c218c0ff826c5f371818ccb3170d634448798582c6cab450091d7bdf7cdc818076f4d8757d6f26cf53d03f7dfd08cb7f04b99e0cfd6bea77c05d6064eb14427156976e2b4cada9ec9ddbe7f0289081c06e3deb53fd230bf93888dd65e4db1d277f7c2b3a0308b0c7a526dc1fa60051801c3af63742750a5df76d06e5b075bba30885e8005e0811159f3d562c490e04931a74b128915391f2615db4a34bf2654c3b496eb0222b03d09f9fe7fe566669064d432a3ca265870efa414b73456641a101053b44d263a3b3add7f4878aa4184b0f45e331d566106441b518b2b2dbfa9f4d1455ed753a830ac351fd68f99ce7cf9dc3b8f76d4532b0ab1eee0ee8a15fa2914e05ac63d0dae1a3f8e2906629f9c7f05a63e07142956cfea743558b64462ec31cadd6c9d1cdfb87329682942a617a5ab4114cfc1d4ceaab8b9b418a66a9644d58758f88f02252a9ce102767297b75332035ca631beeed3a0d0cedba4b73f4656e2c30aa0a9473ca9e18b85f17d992a2b20ebebed1086b295c265c0eef038ce36347daf82e69b13b43a0ee58a6d3f45726a77dbe85b9004bed3d66a9cb5d6ec2b88b05db7f5674a82ef0b807fff136f79543914f9f2e8c05e75929f907d4107143a87422c09c24fdd8276402dd2d61c8b838fef2e56782a9de845917d9f4e76d22f2ca148eba761df9153274adfdcae8362e6b8af229afc94698acecc664219292d6b0993a423293aecfd721d7819e807fc4ddcc22d35473de03f428d58ad7f72acb07c91fbdf900b5f135e8593cb4d5a4fcd00e0af0db01f32ae15ab33cd882df7babcd0b8c9edb8b36a2638d228f310329b72530dfd101000000000000000000000000d76e167fff51cb49cbdd27d311561d7ad04e867823742efbe474bd9a39e7eb2ad800098ad09dc6f915bdcfb67a9deb8dbc2c81cf57bf115d138dc9b27d461d36ff9bd91e7254fb0c285cfe344b6e9de5beccc6853a21ecc104028128eb12be25000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c4ac866dc89f19ec1fe6b0af89d1620540b6d091145cfd25f619af43e60a4ad7910dce1b14e462ef70b1e8ed63e68d3425dc6e7a7454b7b04dfd14596f3383b904c5b309455221b82aa5a911e5349ff35d9f77c4c6220448685a6ab833015a8f85e54d3b76145afc411924263e62333be0515f29da06f045fa0f3928bd78ee602241519bd2bf454e9d16e1a3c82311bcd551082b21c9601e193b536e0d4c8b5330226205d28e395597fd47fd9bcf7c67ce8452f47427c463c685714a239f3f020b30b0151eb31417e78258cddd6f49ab7086fc4cb6038d7cb87ceb88ceaa76a619758138439822e19c073b08406e3e736c913199832368974b2bbcc307616909ad6e2031618f645cc480142b43861beddc4fcfc3a62a41431af785e1af687c942259f8f0225d5537cc3b125f6ea2424b25e41ffbb917c1b0ca1f41efad607a80788be175102211439bd3378d1b5529411a6f733e3176cad817d02ff1e8e1fb27d69a0777e3a031496191e88ae4e31f8109591475cd0d5aa452e33b5eae9ae35e6df05ec4350010321b205592ee5cc734876e0619173db0440b28c85b0061e39c855c1801c7642ed259d3e13819b0692cc3755af1727c9348125efc618bd01dceba9857d76100a738f1405faa00b7c13025c84742d4705b6e333ce411e24c6295a397af1ff77c5f10369f9180f765fa0201391aeb1df7ef64e24f4a6853940844d6703c0eefba02ecf43a3616387d1d44a06584f6e525856dc24c899b0a45ac65fed4f0d415c52bcf013af7a5b8f8db697cc2e676f1255b95f2a4c50ab63cf25eeb89b5ccd36a9cb3570fe13a1a1f5d2892f93c4c80fd615d5be7233ec10a1028ba041e4ee4a572a68001fe8b0fae543aea50bce37d627b9eb660bc2aeb63f41630e5570adf37a9ce19ef2df09739dd3aba94a40e0b5c1e53bcfe116a2cd7bdd8e36f5638c160fd0043579e8cc9cee9c7333dba40d1954f912dc203624526023d2f4137a5d20c51b389b6e25cde4f732c444cc5531247fb74d4353372e2f6ae8f0319f2bdd0ce9172a1f62a1303708695c0b5b04dda4a8e690b4f9fe982c3a40988569c564ae93aaebb3ed4ff813cc71f3891cadb84ebadc161b33ba3343d2ad5a2e784557d0d48cef668d00728fb3c08f0001609d4b11777081dcfbc6f6a6470f13fe2e314efa7de300b87a5390cd9b790c79de9413d8c51c69044788ba1bf6fdcaf5cd53b7c32839e129983d73449d7b0ea24da312ff656950ecdddac0fdf572504777b70631785e9336ea387bcab66832c5014acf15aafe5aee3108bdd1faf3023c784ffafa6216b4e8867adbfb9aa404217ebcd6856c888f5625ce69a89deb0cbc5c05c4be1c1e8f7e5c1b061eae42590ef085b775d97377eeba80dee6bc5c9070ff02f6106f0e986323a183af51cd021f1ca0fec644ae84bcc7f4925b023ba06c963d459ddaa12b1caeacf2aa0bc99f3c3a693a4e5136e14a8824631ab8966d8de40629a8035bb0d0f61380906a6579a88de39508472e8291acb8fc05952b66552654dda846d88bd6d1cf41f9fc047ec754e560595ecb37aaea506e6bd4311f6d955172d2c7af84f99d280828b422a14495e50bd24db79fc63542dbc6acd687202e848f0c4a83a4cc6b7f8b9219103528358ec38edd9be55b860088ecf50d220265fdf268f5be67bf56e270b331f94990febc99b27d5c16545b457daefc4134200686deafb8f66bc052a1b620f817c58da26873ea82f9b17eae911dd54a879a3a6f91f85968326bbaea47769b5ba677e05550c3ee1c93f1acaa349693ff5bf40a6c969101b67bf00fff88b9c439b26d9ac1c64d92b359b356d56fd5191cd6d208852069b991891b83545ccd55f4eea7dbecaf02069823781276da6d763bb2184cd34c45358cf68233e5a2cfedd47cad7191848ff3e924933ea53ca6ed537c335a882d154614465e5a8d4111584eb4dbff98705905144fb3d254239af4fa046af234710d2827e4e70e25b8cf3cd7d53473510a3c204771e26b344caabae013901a54c99eb2dd8aa1acb02d9adc759793c1a326e32eb44e4d89e038e1110977a5ce8ee42c38cd5c063e3a6abaabd1220197dd2873aa87808eff4d2ab20c1a1082af06dfa0644d175fa7c75179e475cd8824b476c2f3b8593a29468f0b7f27ed367a4a63815398d0b259e6920afe6897fb9ea011f09e10aeeb6e94f9ce80a93419e36490594d2838cbdecae97b09f280c59e90e7c0cfbc9997bd1175d74ee171153493c2b8157a73d59c2bbd126ad79b74299a60a960227467000000000000000015ae320000000000fee2787eb2191bd32cd37e9e3e5649c16f3fecda26c171bb78fff9fc24eeb3e9e2305cdc40cec5475c56962c7cecaf2b97a5b46910dfb78ee91c6ba6bb710e6b8f5190fec81665661fa941468fbfe08ee835f3571c72f0fdc75cfaf0d843831e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a25b5da35883b02180a1014faa36f3b0f7b003fc4b4d1275cd99c2ec4993c71214f8ea93226d1d717aeef3645ab0bb67f19cf244c0149ca15d953588e9ce19fd9b46e11e718b9404dd12f212a4c2d2f31f39afb62bf825968f474a08eab5a9b105b2d070a79d63f038a88f53182075dd80cfa0932c7a1108c23e48590bd05cd402129f1e9ea09fe3dbc83ceeab34ace11529c559cc4ba848939ac5c42b39b7d2a8031d88a182b86a4bee989ad142c1a2a36d9d5a3fa36a424c58214b3510b45bae580a015b7413ad0ced142a593b5f032f182658a1e9e58d2c9887eab8e93cd2a3d1cfa438d2096db805f7ec7da8a9448d68eb77aaaf15ed2b2069b32d7c80f6ff2010020386b46f7096e81e0755695546aca2abcbc4849a40c468c65ba9f1862088e5720221de012b8ad9b720b9f7bf415d9c445c2e8359bd31a59ad4bc7690aa8fe96310032102335be9f585d010936e43f94171b1251c858bdc9eb7d42a385779df8f5ece021562d82485dc2b2c79c0ecf20b0daa63f7fe586cc0f47dfc8c2005b5062f0e88022fa61ee8656ac2a28495d38d40643b7e3f66b10f100f42046d3211c0554842466e4b0e3328389e49e48ff8213d42f3f3da69161a5779b43021dffe5396c874c34b7e3599ec749a297190504d0d5edd1c6d713727bc0b33ac4282e670aea2bfbc181ee0941947eec2d85919c8efd48ded0a99c7fa02f3db6ad4af8c2726b89e23a8c1d0c9a243aece3e8e65ac052a1b04bee43c094c0ee85a6fe6f772e38d83f59804dcf086ad188e72b51469519965cde4def7e0d427ac15bd1778864ceb82708488504a444a4e3cf02b17fd768f866d902a43e79279dea13592f6b185f9d631e22fb4f68497c9d97266e08b8c035dc5daa88657201682a25a09d613b1dcb638bc560567d6f3f4db5c5c11f89cc2c4c58de19e48685ba52dcfdc612248289f14115d825e37b8c58258f89700ca99a8dab2c23b02c64727e242d0f80d31ec3e3e349e99a40b15092ba2f5626fd86e2c8e1d4adb14275016cb774f174ab42a67814b435f0a949d12dedca070fdb59d4b291b8615a04ea6a034a3a676587481245dbf31b0f6c8896fb9ac1973001ee78d7a48305c02f0ded7f1fa61ab421adda0874e3deffba0c6a3c7b50ce1085d603f6ff4e797d4604ce2d6b485527da65390bae132c8bc8a0862c0893c75e72045eb91118aaef2e5f73c25a6013339e66060f9cdf9824d1041ab102eb888063a1157b19b629b04d5b1043b03d0313e6132949a653f1afa297fb558379d2a22a7dda7cec01c2018450eb6034ebe5b47ceb2060ce0dea62949d0639427f09333c8de2df197b3c3c0ab7a31515db12e0ae4f8a06456e2de9bdccc8e3c47747909122f04c3409f668500a7a211fd419270bfa373be4bd528b18b356d6ff8750149bfbe795d44ab1af79dd587285a1facfc7acf5107a04036cea189112ff7cc7ce098d74ac47bc47b8141c6b704d1f5710e07a43ad807a6f6168beb1c03da895e409763649c11872852dcfcb9a9e9473ea74237a7cff54274be5f67e80b77b0122fc67747080952fb83b70ff95f5ca60aea3e1a3f41294f3ae94b6a675ad18cc090a09f11b8a167cea9c37e14eec25641baf4c6dfbfcc999d57e80152c35e346df57f8c349e27a324d93a67dc74805c2436b6b7695791311c1c28998aecf00a4625aff69390670cb66203225d9b2514240365918760f830f2c3a03e0535062882f597cfd2c4021f51584bdd9de112639166653d17b0206a27a0f7b98215de4e90388aaf02f8213c277dee1f1839d4bffd8f8886fae23c3b9609fd946a363e9cd49b29cc4ba90bc5e5dea7e0787643be850743a1b656d9dc2fe21f77f6158fde184c01d4b1ab23baceee71b46f9bee71b9a69598f56b9ab3606689dbea72ffee3a7275b3bb4a191abb954c6681c370de776d78f4927c7491fad6c3ed41b55beb6ff919bae5d781c504f0fb9e52844e4afa099a7c509952460ab4e3a37c5aba70c0044d062a90d4c7f6402f3b3207494434b4f6777b9352268117b666c0ef18a633cd6042eccf184032b10b99589351d2a8a19ff079f869fb263379c1d4bd4ad39012efc72f9baade917eb1e7e2d69e35a08aa7975b103b41586f3e791f11e1a1d6bd9193171273522e9fada160afc352be6f8cfbc0a1c61c2deb8beb35c45d6cc3f7c361d8366b1d938df8dea7196c9ab48f41f280d774aa683b54c0fa30d0d6c548ebfceafff82e3a1b3d115cece0d7dc00d4e9c529100c2e1a4e214307ee2b44ef78482b55794280e060fc6586ffe55f108084a693b1ad5b7942a7a652cc839fba5ddd45fefcb90cbc47ef070443ca9c5c714fe9ba671708dc98d958c1a8a7e172cdf97db233ab3d022fae782d2d7963e8b9729e7bf3b310520d2dddc9c05e3fa1b62100307105", "65535251", 1, 331693917, 1537743641, "b92a08a87eeb5d86733faf5d488bbb85f527c8aa13ccfd7f858965a5a609e034"], + ["a8e39515042e90f179d0e6d5891d682913600d5149e6c78a28390ca68915cc421a866a2d4e0000000000dac3011071ce542b6f38fcd6b3aa2843e7a67bdd3dbc9d2dc172735f6e0d8b2484d2161203000000086353ac63520063535fbefcf5540a44f2742e78c56f8bc42651c393c940965d1d65335320e876636c983657d402000000055265635152ffffffffb06252da7279175a7049e54b1f72b5a99956191d904afb00d5eed8aa06b9b97e01000000002e1737770269f9c9040000000004ac515365a18b44010000000000a1cc41fe02d9492b03000000000000000000000000c9b25ebb913b3385ff0c34527a436949ba9243ae3969a358c526b63bbcdad59098bd40f17b821467d76d78e77126179a132940c663dcbbd45cfa967329164477b5c562944e23a09937f6769804f9d9f0f84c6984a8d8c5c09fe5236848f4562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f963e3b9e4682859011b273109da7875ec45735154edf46d9c471491def250267f8eb58a6dc649a0b9055dc713586af98d969520f3c80e100eb60e8825958d052fd780a82d66a0b4587e976e8adfebe764439e373237cfd7b0b63fdc02c6568c68adab1056dca44b0142d436bc6dae4bccdd19c022397211843fb83332e39ef803053ebd7888b7c669ac037ef309eaf207fde1b0d35f58c40ae1765e51769c18e1031f0252e645e4c50ab436bf920becc4463b2978e796c31e9912a0ccc0ba5bf1210b023b78a76c184065b0c43a1aa3054b2e6e18c157016d664ae1ee69be77547f0e9257e65a8dae016c830aa74592cf089544bfb3494a15599df9ca53db4dfc8c1b0304e6e156f0dfafdb70b295891ad4f24fd3c4dfe691411799dea4a955b2d4ef93020314ee3ac4b0b5803981427ba3b33fc63f567585e9e815c1c3be25434233a4aa022bb6a0c0464de9c0281865b220bf8dd7009be3029debb605783c8e5d56edef3e0328782b2f8de653574b38b3616d2ed0630a58d642579640520e041d234319cdf70213fd3e71dd8004829a03e096b28e26e76df98f4fee55e40a540d4d4124bd6ba4c652d01fa580d898341ebc402cc7eadc752506046b4676bdc26c5ebdc8701c2d2f739a2ad330e8d13182d833758d426c857ca1e39b5aec57ec0a40143b9de96a08fdbe55db77cf90bdadd1ea8feb0009c945c29dc46e8d7125b4388ace21453d481cf267496a822c26c52ae9e283cadebccb7f73fcd4a169cc0f1ef2d4e2dda371f7584720270c1df81286a61a16b1e9fd4c61226c295e1e4616a009e0228fb498a53166910a59b107fb55262969c8f878b97be8b3e1fba59f90f2a47f8b87c10f7c3b60b8d6159660d74e57b220dd51567919ef2c11902e7e540367533bfe1a3533be7fba3b9729d51df1de94cc492248a01edf7602e1448b5572c49a9960bcd43312313df6f4a75a9d44a74828bcc3ffa7f1b6bad180ae4da1854ea0d7d2b04e9627b7ea86dffac41f5c5fd7f690a6d744d14d37086859e36a1e0bbcf254033c3ba89a8af0878d5b02ef86e3cd155394f0e05b550c41c36765ed606fcf0fb8e3b4c93ca9977563411de035405f2f4323071ade6b2ff9efbd112f0dfb99e11b457e14488e00e56ea5e5c99d65284d96aef32f1e8453812d62b524193c169d5d8b92d93e5a02db845eb0155a5131c000e79f273bede89ac00d38017447d5d1f87107255812512d8d4641e28864df53c0653c57dcede4d326ebca532b5d6058ec80f9e113a5859be655a9fed81f9dfb16a5fd12d91ee3c0258abb228cb4bc9184c68a25706ed040a8088ddadff8bff14f39f6a74dfd303685217cdf1bc61c992bc87e6a84e71ad9ae16472ad6bc0f1bfe016139cebeb19b96205d7d8898f1394c0ecd049a53bc9faee54bdcb06c69685da355644eb427c72fad70dd163736aa9187514c3329a07464130c905b846f581f48c3bd7d728b98bb2bf78efd8e92a83cf7f7650710c513525b0bd1d32c5b08ba19d150676c65c358377c7a7452bcea4af78adb73807af8a2b8a726dc873b0f2c5938c91c109c0d565ca3c9ecad6bcb6f6f892f8aeda0db92c2d8b9c8d0651779c70980d347ad3fae0d373945f039568bfa248907637136c89fe3cc1e14a9f6f728893eaca5d8785f91e2533727b68150485037f846e9bb9a23cf8c1dbb099f475ae3587b66185765ddf4da8cb7f6f309e3840098b21e2bde9593f302e6217e0824910d0f0674c504fdd177b763e115da84687c9e579431852c1880625be09df02b77caf13256f313dec6102eb907db29a7b7effde731497c821d79846f3e770fa56ff91fc791bf3e5e0daf34d2a8daa9e24ae154d42f852c3dfc6fabd4055f8df37d80c0e5fe9cbec444c6978865679bc3ae9d00610a9f4cd42ac46ba6b621834612a8ca9dc86a48c1b32f5f81a8cf8de912eea8f7c688d0114e424597c7b58b79906e2378f5ed1b76669988278bc686bbd944baf82e45caf3b5598e738e9acb189bfe026fe52d3ba60743ad9bcdfb143e505f5a0a603a8e6c06dc214810a040182e57b767d27f7ace8e4c6165ba43b2ae69bfd1d1a21ba28bd2e621d0bd35c08b39ce1f4a085cee248f4edbc19bc6a7a43f481abcd2332f53feac47b9bce7054114da2b7b987e4fc31fef7d337516d8c3a639b439acf188c25b3910ab317ff82c07e82ace8025917d61d310b609641a944369172d41d4042a52d0372655c556f3bdfdc602e8b80c91af301e7b241685f12927ce7daf1bed70a416b2ffa03bce74eb00000000000000005237570100000000c79877c0666f08f669e7aabdaa3e64c4eea7ed3514508b7d0954e88ca8898d665e521df7b8d8833220ebf3ddea8a667ebd40c0b9bc1f2ffddd80c870b3ee96d8479b59ef8fbcc457fe1820cfa339417ab5bb5982ae75986fc04f28fd586e156c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e82e94de3c8876344543fdbcda4dae62e83f7c81b9a1bfec69d21d56248f30bff9fe2a64ec4f6e2b037ceb3f90adc53a3ee2e0496fc4fb4dab3ca94a1e5d8667b4e0589f48a521e23109f26d10d376dfa532d5ab7d49a297493f4b15c56a8e4772f25adaa14b19783737cbbe3e8c8983a2ae8c56bc59fb82b2579c62e38087e70313cac0e69135f5bf416f035b4682f0491449ebea9f84723eee58fbab1a7f787602168faecc701b5b05aa5c0b431afe071c8cc0a9cc8969a69893fc686bf0ec0bd50a07fd6d4d3e01f4a213e55bd82ec10f00c0c041c447017818aa20ca299f435e5f069befab50ca700244f3549e45705db4ddf188f7ad1a9151fee773b6c0d0631e0214d3a068f56ca127f8b89d754351d3699c87e7f76e380559ca3aaf414c16c4ce030ed4ddec54e4751b2eefda7212c4d0486ad69e9f4f2ec8a925fccec288e3e07a0311410284db2b0c955099929108f195be5c456d123c959ae059930e39f422ad2b031fce97e1cb49c1861b07f131b5b95fa789ae84dba94f0b4bdfa30d3d916f37620304d0de4612ffc06d8147799d12a68c9e25cdd0b7d6550d2e0cd96359272896030e9449af746c15f320a286e3b1c57366d56204071f8c0ed655f0900962e210b8097df4942a13d2e3a19240d4ff38def02dcbe24dfb80bb5f8932bcd467a28fc01894d0f7a1c387ef59825f3e1c361e441f863badba4fdc22bfd23c6b523277558c23633d9cfb029e0badd54d5689b9067724d7f3554da202722864d0445b4a0515ce28983ee84a2c8ea3b24396e95a085625d1e124e562f91d4b805524498a21d7235a374d836ea267f977b9ae93e7c96269ff9fcfbd73776a06476516a524eeb2c54640737c36ebe508ed6f544ef9655716fe79f8bd21ba312a0aa4c77d13b304c8a048d8c8d115727785284d6321f0e89154a02199050c8e910035d2d850d182363d47b65d3b4cd8cbe4568059beb81a2aa8e7f506f326a4f777089a5b23b8daba6aa6ad8deefbb842a4c0ca4c61288b5b2faf16ae1bb3ff592bff61cb9fe325dd7da9b5b65eb95d4b9089061266962274492bd204897b9801561e050cd8c23f0047b42dacc9f92f938d2514dea22e4025deecefdfa58493abdce704d63b7f7fdc6057e99a4004d257bad03b74936044b5ce840e8ab6607f9dd57ed6a71d1bead62fef7d5cc5d1014cead43ea121027986c066b775cbfce9a9b3d2bc76540eef59e067242672aefcedecfd8001b52c0514c31539909474a72b888b5b4893a78029d7997d42dce60a8d43b519142d69bb80f58124e6e99d993a6d02fc81d955e4f2c6d528bad3f4d28d2308f75b97f2621393cba346d3cd60f6942f9cc016bfb8f0a8d74ca921daf2e077ede21d9fe9c8283274922b6dac7a117298d71b89407dad6d57a5d578cf61aa15a02aebde171f439faf4ea18bfa6e8391dd42cfb1e1d3fc42bda46b3807f491c3f09feda0841050b90870be7fad610b105577b7a527191bdd64dc63c9f58e90b021939d0c62c9bfcc098d83aca3ff28851100ce9b845c61bcd489c1bdbf71a6e7188909bb30894f4c2228e994d7d38452090aecbc650648907f28351974831d88958fed371cfcb6073733503de3970e1edc1674fbad266f58650fed845a2182ba8696cf38392aa44bb76245c7b72f7c1434fa4bb8f0f272e39bc24f69b50963a43ee4356eda7e5604056a473cf7d0c57a2195e6944b7d8c7a039d8fc70165d131c16d05b5e7302b97af5e5ea63d72ac5277a09d382aa4e3e44432a242d6ad3220ef72ce2418ae760c0ff22a96facfc9afd34e0643a764f01d57551039eab984e8fc345f3539237072af9034082edff505f5e3f822fbcf2eb06a8b7ea5d7a4a2a11fee138dd1d0e874d3b00477a65180d84232027d08ce8a3a39f1455b4c4378d02960708c107a626be25b7524a5d4df9fce8426460fb9a62deb59180f1d49488252b1747f1cb8c7307e2962b47c9924334c3f11505ac5c7bbf9ed3a455a1751bbe750fe4361d78a343144cc65a22c3f4eeb167f19d92adc08df2df32ec503a14bb046ecf9756629f0f8a0e3ebb3bede77341c6cb3ca0f22dc0a08a8edffe8235d9c3b6f98bceb5cd12acbb6fa33651b6bdb1e6c89208d146a3f27daf51391b0d5859cb997119bb6389adeeea32747d51e89ffc94d61b4cb78e0f3eb78fe9b5a42edb43603844c534a5f9a45c701ab1935489e0d23bffb7977a354c1aff2319d612756dc5fee70c94c06637baa5c321cd5dda4c9e5aea3e33e1ecabca99f630f0c6946a333be4b67567d574a4cc38f96abb1a73746efcf18a3b3ac2e3d99742cf963b5804f75dc32b2fcaf44e14688d06914c0a7c15a968fe3e2b16081e562852b7a395519df2f3f6cb59a3de5c129129b2b81988aec05e3992873b00fb00d6e3a7efb8e07365801", "0051", 0, -1287531766, 1537743641, "6f9f56cc0ac3e5bc08e74462812c44a3c79f018112bf595c07e2227373a0cbcd"], + ["030000807082c403011660a7710175e9a0d31a7b9877f11458fb114329f1cb7df9048dae420e20827d0100000009ac53656a5363515251c0344c8203715e2a000000000003000053953a5b05000000000453526a001c649300000000000000000000ae61f70c00", "52ac65", 0, -820935966, 0, "751050cc7c36327938342b9f74fdcaa543e3329478a204ab8236a32e300268f9"], + ["030000807082c40301891d995541c87f2d520ab4ab3aef31effc9ebf9aa565ea5ac9f2999aa7ca6e2102000000025100751ebc2901b0685e0200000000005cf506dd0cbb371d01b8e642010000000000000000000000009531e6643b109ace6240f98db2b1411eb30303c68243f560a56c76b6b2ca539463eda939325a7d58a02b2277d12234147b4a5592cc051f3a7eff4cbe85c838780b4c6d8c2d6240cc4dc68ceb3f12193da36ff25a1e0c8fea11576b940de3085800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000538354a1317914ca1e1aba8aefcf26d2da30ea576432f07b41a404cb6afa2c11b08725f3a32b23424970f5a82ef38d5060bb4e8e5156ea19db8d0cf956d765cd7cc4cdaf452ab170b5b64d347546279b2f9d0e1c5fcf3a3f63a2d48d28a08253f90b774349d7c0144cf23ed4c327ca1348d4abe04617e18efbdebc00970f534e020b38ce41cc8bdc1996ca0ee3e7cce194bb89f14e10d5a2e8268ef9132a540c970220bb6fbb3e17d72e4ead9ccae59fd10cdd2051a9aabe77be0a8a41201f4288b90b04579ebf75a68c1fc0c371d4cc10327284ccf9bf526d02dabb6fc30b7090493572d0b99b07261941bb6eeae66c77393da6dfa8866c1a4cf01da3e1a602e28ef00212af90aefa2733a3758ddfccd70ec73e97e1e6f125115f99b461450dc3b79d26022d748a098eb6d32118cdb4b5d6d8a1b9f09714beedbb76b7b625b7daf206aea50307a00886142a59abe4bc61057838ac46c5f89b8b278388a75608ee84c6194906020893635d404ee13574dcf167ae07dba0bf4de9c5eb7cb0633e799f33cfa5dc9c0217eb08f524017bfb7f143f2122f2c06fb469f4f80fdfafbc6336f3a38b1c21a55effb00d484ae472a115c3e5c2e59f78989ef246b7c77166655cdc7d78bb73bce2f26228dfd756a6356e95f399baaa69a9743be03e36000d9f6daa05c23e1e9f4750702f099868c16ed8e68f8a28063cb2bb7b506a596a4ec5ace6fe4777ff40b3470ccd450a0b006bb0901596f833a02c8239ac989b25ddecf8893a1ace0a199d587cabdf420b630cac8d5006f4fe5e8be09f1309dc55991ce6720699e3b4cdf262645410831b297f5d75c69315e8223637ce15322f27fa4c454534f39cb5053fd1db28acd7995a4df9029391aa43ebe5f4662ef6cc19858a352a18aedcb9f7cba5e5d4ada325fba03642514b08ce0c263b99e6edb8bb37b3bf37820efe1a53fe404c223884f5b829f605ccec2c557beb4541a8a0ed5a96b92dce6633ec60a075aa0e245b1ed8b671493d9cf664a568222b28d7d709392cc564325f36289709983172dcf7a46f42c2da59170179f7b4862fe9df200112fed63f16464b3c0f755f8bc14db8deaf579d3179ebdca6b6496e14087cc0aa905f5f0aac1df341438352f7786153d6139a4eb280a532fb7bff46abe341f07320a7f42534774cd33e1f160599c01b60e510195d205b0769f7bde87524d5eb77a1e4ceaeb0bd73eab70dead45ad0826e9732260c1ef8834a4b96ebcc64dcc905e60d23727fe918648e21c09ebf1cb2219ef9210b7591913a65e8233455885218fde73552b8d2543473c9355f15739a5a0b6093959b6a82fec2f8a968168187ebc7612df5e15689fb21a04fedf0118d74d5edf6bddb9d5e9a144131138375a4eba86bdc5d913bec9b9b4c3e25f254c97564c013eb706ea6e7971375c8d25e09af6e6019cbc708b745ffd474ced9f70f7922d3b5a5bf2f51d93d93f7da4f843b498485915c89173ea58ac8ad8ea061c695647f8fedeadc0e9cd1ec5b6ee56efc640daa81468272e253d50c23885b08707611a5d9ec68dbf01a71a9a2eb7c339ed7d6b902ce8ac99a662344b68a4d7020ea9ab381e0273b842311cb7a62597cc58b58b712c55ed55208901607c87d2334b6e735fdaedf3beff96d72ac68f72a8bc47af542c2deed83123f7d2dbf65b6ecdafc02564334643bc3589ef82cc235113a9b09236ea92f5e9a2ba9a5731ddfc35ce9a32c1ca08b34a9162440ad2509677e4cd92a05a56794e144266be99934e73b7b8b387b035b8b54ca83ec200e162f8a7ef5b699c76e1f01ac844d5a8a32ed087fa15826250db9184dd64bc0dd961da06622f11f8393cddca8b16f9b5adf55d232f89c5b213d4913466f119b3d92baf4e12023e7bbf42b848a3b17085b82b20c2cf7632392ff0a9fa88a960578be8265031377961e981cf140fa509cebcc6bf91be66719d9e3d1a55deff223187706dfc9de7780883e89e3eeaaea8ed2f79143760ffb0d4beea9bf771e6cfde3af10d1786af38a559fb3811b80033c1e6ff60e24e27cd97802f9c20efedc485eddee04f306b478f4e6c79b1ccff16fc6592dac31852f20c5f09ad2df17f9fc75081fc413cead24b7ef46a72c966d6c1abdf47ed9aaf96f786072583df36709de4cbdd0e85d8d30f3ec3fefac7617a82b3ebab1f53e574dc11546236c44f70e07d1995f20f4f227f79a4342543f274977438ba0fee06c65917f31b5c37cdb5e2f0ee42b0541e4415e25cbab030a5a0dd3d96955026ef89d68cb20eab294e0b2eb4e0baff3fafc8dcc4a01675a91777e6183d8c472ee78baf3048e7cc01785800f91d699e90daaefb9f00c6d74d851b9bdf940665cdf132bd714aa0ca60b2c03d90a785a1ba9b93f3448ede6f5703ec9b395ea52c7aba4ffb1af8b44b1317803", "0051ac", 0, -1086482984, 1537743641, "e1051f93a238142d4b2736ed77aa663dea781cdf81d1eff7db7fe9248b1b9498"], + ["030000807082c4030205f4513f3256bcbffc4b2babf96677f05f530d334ea5aeef8ce3ecba8a65500302000000095151516552535265638b910512704066fe9269da3f475d801f5334aa61bae50ba5df1f549f74f9f78c0e95e4ad010000000165c9842b120151154800000000000800ac6563ac515151f9e8b05200000000030000000000000000625ed50400000000780636aef158605d7e18f60fb5cb9dd712fb31ae5d5a4992777cc272ab2b58fda3cd1798b8a2049e499f3a4eca650fd0527a14330f5552824c9381cd318582b1336c171b5291c247cb58381b1c015c891d2065ccce128e1603811c490952e96500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cbbe0d47c06b70e8d12e319da10849d49bfdf4c2d231941f1bc774e55e8f607cfb459c0103d54d75787c5316117bad75dbda6debde4d6853d03a54f9f7d7c6b9db8fa07a22f0c2609d261d67a23d6f5d3492d421a5b29eff6007704df70a612367f5762012c8f0d1efa5664a474fe46c4750f85d93d56de24f5fb7fddd8b4d83031f3f4fb8ffc4c5823f7ba63760729e8abc920a4bfb0c45b18193a5c726aa82d3022f30641383f1713fda3ddbe37c29bfff2d534553ae3536ae364e74db608b7e2f0b00f68f6c7283936c1d017bae86151df98ee38787b34d770dbefd457c2a743a966ed45b7ded0ab3800dc7eac27b008b218c9af22733bfb718ea5a9f063ac63240020a1bf2e9832c0a12c33315806ed6b550cb16c97854ea9037b9fe912ca1c155050202644bc964865f008bd7aee63a5d8d46b015fbe6284af241576e3357daf1c7d102253e62a6a7f2bd87977c870617d17e890dda9f12f3d7fa5e203236bac14eb6aa02111c39d4f2b08f7a977cf0e9a0e48fb98b92beb57514a9c98f28d607acd31e110302c9d2e2712a2b29d54f630d157ebac0ee4e4be288aaec931cf2ecf29da34e10d338fe45bcfa46da012d4cae9b2b132491e4765acf0c54c11019347cc76d8e9e2565314658e41bb85c70545b3b565aebd7c2840750b2f703353cb68f01a2c8bad339988dfbae8790125353e9ace5f2694ed0cb9b857d83b896920426c63cb570ccfac39c1ca4248e4d0b3afb48dec0c8b73342dae3edddd452ca1dc868f975a29750a739470927400b8f7d4d1550b8f30f6da86f3ffaf200ef805b6c9735d208ddaacfdda04a152c52844f64200bdded3c576fc2b9adaea9061003884647425b3c71af3e3e9bea2b7ca610e3cb9112d8adc80ee8eb2a16e48fab323c4984d20a392e47065710748ae9c4e8a8b4c7ad67c8df75e99491e5eba1d1d25dbb00629739c1e5ab9a6d113412eedc0fe25f90fa480422b3d1c62fa6c510818a63a59ee263be3c0498ad234e787eb0ecb5895fe5fc223107ce0e4d156f570bdef566c6a3db8871095f00543546178bcd809587d5bbbfca369d4a413f18748690c1195385758f050b3df208c32ce6a63d0650d2304507fdc3ec2a819d229b366b2b7b03c374fcc728b017334d926d7e2196e78b119e933f40a1f83efc9da5a0f1299d15016605837f75d25afdd8a653ca59ce17c5a614b549997591df2b1cd729e544ea8059df97b3450114ed524fc22716991b1a54ce96fed8fc3aee7b10e3a593c54e4dbbdf9df3c09b88b66c23f5bfeff2a09147b1fd1e41bc5e2d5f76abc4182142e84bc074558d1f24e0635c5f7e25ef7691c57805a911c7a0ac357c01d652cb633e4de9e40cefdd4208027d2aa9a5fce6e64d01a0f14e35d7a0acb4a8e964620503178f5f5c1c0bc82841729fec411aca5ba7fbd195b24d3a8d6eb84f99dad6b5cab5e9b387a77e27f07db50f5ee79fc659c9b7fa2dd57eb0c625a8a7925aa2f0a9e027ec5fbc4ed103f4a9871a177a468889ca03d03427df09260e541d83f971c58eb52362646d6ed60d2674b7e5c9266ce957605158e258b8e6069e99f97c0a80a44e501cc36c172e8d6907b9bcea8c119d18bdb6e4da4d01fd76988ac4f60c15f9e19e2c1b4c6bc95e86e79ac10bd8d49c29620272bd904c9bddf84e76287c296bf97bcb4c04bcc317e566de80a9bf70a26812bafcbfbaf3ecd525c0f82ce190f537150c4ad25a0f9e806eed52eef03545ff35b617a46d35cd48f7a749e7c050d0073d8aed1fbcb7ec1035517bbb82f682892a3753c08cf4842c297bb065fd57be150c6dddfe2d6dadf350eb64b255c393a4bcae395de0e6bb2c75d872cf4bfd3df866583d09e749ac330214bdce853cf44e457958cc3a257c0d5902bac5394fc9627ea617278473b84978be15a3a845711501c05c15dc5a86b91438697e0b92687c28887d1ed887014366b7a0a6a5ed8068d206d899a534f7300a64a1c0b21f26cf7a929cca6401143bf6e66e5adb4bf9ce97cfa2089a1b88734b5574737aaceae0a69f8d9632ae057c62a846560e3b3ae2d616cedb873286a12cee9b44326ef9fb5f64b482100d1db8c74868c4657c3723ca664673a51e6282c042f45c87cd795c115d236c00be4863897265b6e9d7070ddf514b10d1c60c886754f358d8a3be82c1afa797e5ecad33c3158f1015834b524ee6f5a4204d3a7647080c687b752ad8781bbdfae850a73cdeb7e797ca797e16795ee28a65ac7aedc04136f7e672deefdd5667f8a6fc040fa738c0b925b6ad1a7495810500000000000000000000000004e1f0585c024114c9fa95e83e10cfebbf2ca3e9b841e4ef8b69d4e07a1487dd0b23e045cc630462f78a44b1bcc6d4ae5eee07641b558144da6cc047abe656a8091eb6c0c1f8346e386047c847f07e61e6e77bc00de4df9ceb6778cb9ad69b3c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aee0b064970f61078053807f9ff9c510afcbf75458e93e89c3fd0447a4ff2e301cd1e38b59155364253df80751bc1cc3f9f1a6817f347fe357a4552a95fe5ed4aece30900ba35aa535ad03446edb30ccbe57911052dfca1508645c097f3629fdcedddbff28cc054e293340056441d5c76aaf6fdb0960e03bd6b75b829d14d7480319b86e6948012c4d3f48c13a2bf38189191cdace198716b19ccd4604ca0b8e77021e0ac48cb9f4df8218a894501dc5283a0e6ba5665db461ecc2d3e8b2a470bbb10b0796dd1d9030abf402c9e462c8ee6e3f1bbb67b915c8845adfeb26236798b6dce7d52315e457398c0981a58a4a5ce71bd538ebc99299ab7817b9449c48220c0b032c95dc4bde6af4798f9a847e9df259887c021d268ea9fa0ffec690b6e54f6340031324e1c7360d67c47e3f9c06f850bf0b70d02f6e47c7f85000d77a6d08d2b07003032e3341bf56488aab0f23ea10b4f25d5ca536a1d057b07f1d4492b4c2665f520321e77e479f33427c7f459733020761232b4bf72693c413a540b7420529aff2ab0303d8d331183f4e0c8be8563deb4af2c834506ff2016d2de0717eea6b8c4e5f3ec4de04d0f983c0b4b741f520c8a78bad038959d8f7a7714ae7e5ed4fe85fda0262660fecde2211bb71fe37660505bb068f3e3b9f5a2ba2dd0c0c4a3725fb36bf432e11d08e5c6ff98f0d3889cf75fb770a33967979dd20d6055f8de24d097ae11628e359e1c8eb1fc1f8a2a9527e460771f1ff6f87ca90d6e2055aa53e9f35ce8d6fcdfc2d17a433ac8b3caf242bc4275eb581baa9ed3131a9a5b2bf7b35780bdbc0da8850739322283c5374f83c8814985762a2ea169b591a029ef1d517717e3c1313ec478bf9da827411f24983e79b527c966d723d4a733e3e0330cb33088accb5117d32108982035b3e3e91c509428b7655a9a3d4fa5ebaf8a494a98d1eec6774b79cd8400a211b2244e1162405d20ef1d32afab331d35b1113fe90b6cb904ac4156dcf2b7af866c5a57b758ac0f4d3417ca817772327132aeb6a043278fa8cfc61ab7a822b5ef14567ab5e0db148f054305e2501d0209166195c3a66e22fc0272e1e587b4bce5275904786678a156377ad800e8a60b952a1c85adc37f7271a4587d6813db173ca5137539fe2584c4bbcadd64879f4f9c4932c548f9b64257bf9cc199b734725b739a1e1ca431e53f1a5a7436581d2404b3f708ac231e8eb99463bdb3f349e996d68c180d94b023c20842512ab103811c10be628c30ceb67a81012fc51234581808720f7f34eae2b378243a6d56b23e905978ee6f122d117ac13700e1e9ba5b9eed8ff4b4607a9d9924ff9bed6957cccff8371e2baa7fa3698af52205b775d28ca59229c25517486ed31e1287e3de0df4ec5080017ce5f9146e4d06c8da314788f4493e34b8a189668fb0c27eeef4dda30a9f5d7421f9f67d284de91636960ef395bfed887b3c4ff86791db64205e490d02fd589d9ff7ca90441b7b3a2404bdb524475e56dc717b8b7d46a025e1de6144492d061d495f8a7944f7d91c08d019417ecb7272cabe536893a1626656ac81b9955771a7b4f93ee2799eb58f582bdfe0c60d293ef12249fc39cc0f480a5da2293b3952d61cec9a2667b505015a92da1111d12791576e1a8e9d40f5929a5f889abf83eab057acc990e8ede90741f30da49fa385da1504d71b5bed4d75059b124a19789cbc4f6d63f17842619231008916a9f3670a5c6fac94ec0215d880a9aae16fce0b32f324cad069ebfb947c4f5dff485a3e2ac48ae9d757e4bd5f1a1da0ba26f3a0ea6008f5143bccaa004d7bffdf41627661ae134f6e0da0d9ab55f66df3f96c99ee617a2a57e09ddd482e2d0f9b4dfe1fef00ccaede67f99bff8305ab0090e8ea2b723e258a5e14ae8ed96693d729fd7a53da688e691fc5fd9bf0cb9590481387394e69d04be18baf9a984657ee1588b445b23df3c491308c149f2c908c9dfe0029fd4c030cbf68267f72ae6e935dfcbd6a3e83c7ef73e5d13f94bd6b9ffd284791b66513835eef075972d1eca11a6cb4ac7cd263edf0ddb0170370d3c9eeb93548d2cec1ccc34554dc41dd31fcab017bf487f3c8b1510732fdf999a8816caef3c95ed10f16f487ef73444d6a033d19800fca9c57a376105de84571ae8bd25f84969969ad1c8bd41031b3505c0215388f27c6d2f531625e851738f990aed83601c7cab96ac544bd24ae5736348c857e13c2c278fe72d5b1d975f40f35aa8d81d8a25a1540a03a2aaea52b63b476b3e1c0cfd97c65d41c000000000000000003e95640100000000b7bc3afb71be0774d4a857fd28c854eccedec53bda6fb70f60128daf6a5dfb917e58e3e4885b00468938b49f9e5be7b279008db9c7da3c42a9373d0c8a612b83e857dd5e59d2288e178b1f39048b923e292d08821b9b08ee8c29d9f6a9c2ba560000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074f29cb26cf064e4a2a684e757f9e18ba13f16b75332b6679a2a24f3e8ac9c6331f1d9ca7b0197cd35d7ab1346e6f5885bda73beec257c37100758e10dadfa57ba0e342c530ab9b10d000f20ef154b18cf9d3938cdf4a64f1b2e529daf4e91142fb8d9aaaeced3bb584d93d87cf8a1cec9f8075064c8dd5c26ba7f992c646a0e0219b2b519a4d09d7759d873a67dc65a3cfe8f97963c2a02be6624942bdb162ed0021e7d293bb6d2ae4797d3acc890ecd02d8e403a3139d2ad07aa4dc954a98683e00a01c2baa45c05a4c82d859f8783fdf8f5f2f996dc7e04617ad7aac014b49c5c337a6d47e19c013f46a6dc52a033f5f8c2817028fddcfb1ccd4804815587405c30020626548614218cb197c1e54703724eb54324171b1b52e57dcf533ca482fbce14031aad64e357960084c14bde4e043033f83049be8650ad7e4d582207ae575eece1020f879d290698df37f6db02c46dc601e163a4a8598c8bf31b5654d58e8b2ff74703200f13bf887cfb8c684f9e9c2f4b2a855ea4fcac9d24759d12b98c3165b739280209df4602aa6e54780a843b2c49618146abb61e623fb6b40a33ddc0721b84960ee94b937ddc816a6ed44f9984fae8037945eb41729c1f8c6ae22436b53177b80b21a36013b17ed4560c8452e0cf0cf05136687f4157b2a2711743f4c6686ec61d578b17548c34dca84cbf94ab58345ff2adeb47c5021db70059274124ae89918aba009115393ef6046bd6d45a442536f15c7a150efb98edc9874ee766855737e9c6006c679c24a015a3fc33dde6dddda3412b281b85118540c7b913ef902d7c1f2d69289ffcca7b274b9066ca67775a2b698eb524dc289bae35b3b92ba491d684cefa5b829e2943544e9eedc00e7297e27262c8738b67939a03b29a30b8ca375d8a393e2807d9e8bd43ace544ca27e859cbe3f5b76674a09a33eae62241e6c1c15c90768781e6c142ae204077da5d3b0bb5fa188ba00a594ba0b013baeb94c99009057870a3bf23792b72942069173ea00b2ef19ecb20fbf2b6a2d5e28f4e88923c041fc134e892e5b7838220b146c46acc85e1280c20c45b14ee317f87483fd17b6b3a4a4be2f46083cc338f20a83d5589bd282c0a27cccb28c04d95863915db130f8b5776915d31df62e83aa2bf8676495b7a8aa247232d2e081482f7b32333afaa4c5f84617e08f10fa3416b8c563a72091ec91a19cf45a2d6dc185e988189c9537dbc068873eb36359834c0ebc900b6317dfced8aa15fcaf642192807e4626813b2b0a4353b14e8c87baf3dead2b5d29d8ef7c1f2bcd9ade30827e4c79972ba2bfd360ab397df35c3f828629864a120655bb2fec9802dbc18806b4b79b2a46f3c2799796906276edd82dcb16e8c604b3c3772e8cce217547c3b8eff0cd4cad1f14ad72acedbc4e6b93333fe894af554460cae190c5ad29c36dadd6f6ee172ba67c8c3828c86ef8b1ba8b6b372b2339c0d1cf7ee5cd263680f6fba4a5229c24c318c2cc2647e0a4f4e805cb0e97e99495b9b624dc1f06cb8c8fdc874128b1c7c4eafd7ab29abd767baebb315726e27d71b9d81fce17ae38ba1cc1d2aba1c122e9b5a5e786fddeb88898b9ed3b544d6fe668ef59c1f5b286c9cc3e456ed25775d6c029cee9a78ae71ba9b190ff78ca3c7a411971c14308989343ba71e3110f9602cbe6f8e1a53998572a13051355ef520147ff9296cf34b1e705084ad7526c51b7116c8b70e70cbe03f2c837529c3091efdf2362ab8fea9575b9fe1e8443638e05681e48b70e7a4c5c52f611f4de6bc754fdf42e11722913d8e730a1ef1d45a724e3ed1b68ea619df998529d1af464ef8e84815a2df06f068dac368449546beec2b6497e283009cb952876fe13649f3b76810274ba3f24a5c7ab02b6fd4fc92aa45d12f428466b667fb7a742370a5798d767367b403c09b4f3b5c68b291519ee189dea7e8e110e6d213cbb06c1fcfeff9b524ef37fe9da134a6d9ac724cef54d8964ce686c9071cf85fe8cd50b45e7f4d93c0dd55581713dff5ff273769257223876003ee173693dd9cd75814209eff8c9da9633b892886f4980a841d35cb3d0b894220f837462f078ac520eaa0990b279895dfdb34363b6a263b1f8961ec99f27ee69d4acdb3ee74c3eab597e9cb992f9cac95af4d11423c8a2bd3abe14a6be7bf9da017924c3c560a94a9319e0d937042969fa2d172c3688f7a7f4dc5a3a909bfdbd4cbbc5686d28e97ceb32e1bb7296fd9d94f308f1cea5388f8e820288514ffcf4166253f255dd7787b713d8affc2e6b92e96724ae1c5ed12154df740165182ac07a8c335bda8fcc7d45bee636656936390d4c2546980548e2464bcfd2d695e60c4c326b01772bc2d3eebb3fbfa4774a9f19fc394e4609982cd324732ae1075f690b388aabfea563812b9470bfba70c", "5265636aac5152516a", 0, -166871512, 0, "d007e9a6b53bbd86013b3a3704d2597c5990bda0b59b8a3c46704b4ae67d06fc"], + ["e1dd5255034b8e46fecf433eb9def3b807343771a7e8f53e5c949de1a98fff515230fcefc201000000006afeb88005a8a77de577176cd2c5d34b3736cf267156e4d7749d5635ed3d14ffb6e4909e010000000563536a6300f48dfc22e562c18f49569f47b5b17394002844af4cf5c0e07da887313e632d190c60bf14020000000552ac526a51c4343b430184eef00100000000025165de02001803e701a105000000000000000000000000cc7851191685299b2e12e347bca8c63d13d87b39e8b5968502c476d7cc48225537dcb57f977f461f902dc85fca19058b1ffda01fa65fbc670a33dacdb0e3cb42619491e91cd2692228bff2a2cc9aa3e44ba57becc5e80300818fa717a49f9bc700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b04ce49e8f798fa95c54062014ea5e3400918558b8b33b300412bf06e1d81057fb37c84409d4ad2106a137885183751772324b43ac21770d94147babfb179f37cdfcb6aa4f46e32d2e90fb1cfbc82e5a763d95cb1984ea9a3705d42c692024059fa0965aed922081513fe8bd41fba1a53c342475770f246374b37a0f0605aa43030e2a3e88fa1d9f92a8d900a6b68a5d2bc28c526af3ccb6577c09a19543d8f4b0022d87a022c6370917ceaf50b68bb789c144e9af816c55efc0f390a119dd3d55430b081bb2e5b8491de7e32d710d78ab666c832e648494f4508f53828f7a80e259e40caf75a0e1f5cb9b0f2f641eb48a78eebf158bfcf7225754cc3aea7e0e7dba150221f386fc625c0f5dae87a3d036851eeb345f54875b317fbf57457e9fd64dc17c03140298a5790b0b5f3433a1194ea09b4f1f057f5b9de4855db8ab9463eb1fa3a403035ed03ea1c83d34e0401d888c761e8559f0b94540f68891989e51cc9061b04a030fb37d744a42db8db729f9dceb8a6ad5f82ba111b4a48f104f6f81270d6a1bef031f080e2a9bd45afee2d659238235793d3cf057e02c4a549421fa74aabfe5f756a9a9e59699f66ceaf08572f18076504b64ac61a918c7569c44f87d674299fe5059949a88427c2ebcd40ca5dc872c7d6dbe7d3245b9d557ac80379d540425792ac5b7b028f6ddd3a75387b4466d19301f47cac324a98edf256c0280b61bfcca5bef61346e5780c68587d1185fc7113411b9d0940bb496918657d9079e62787b68c10a4e70a0749ae002127551f66561d2478993c3af3636e2592f40e9bc28ddd8c9f4c286f41989ef47b10dc802e35c6edda5c41175d9d3ea983b3fefc96adf3f450603fc35ea8e62dc56683478b187085fae730de68624c804efe1ff61cb09ec04594adc082e7b62f372398478955cd192b806bf4f904a5e928cdcbd7c3e5e8d2f491b61128297ace9df756335ec4642b40360c16d8bf3e5de1afd7a1b7d70b3f751a116a1fde2c88357e75d42a78ee6417e9e12ede76417edefae8f10c4de7e17421fd567a9dd4b9cc06061c08f5c31acc720f94641dd4e5da381a80aeffcfffde767d98a9f107881a740803b37f1738a189e75e557edfc75a3048a3fd220fc0f2ce8f9d543d3825d2a8002657dedd553aa2178201d12076621ed6faae0cae624aea1ac8ec48738ffd4adabb1b8a3220494e0185292e82957dbf6e3f747add0f71bde0a1389e4c90c2448f79f2145979749811438ff016aba83e690b6996a16c9189559c1261d6bac4c35330cd914afd59b10a72c4995264340dcb1f05c1adad70900d201ea00bea3c268722806ed1e44a4df339d8e0289f1073e6d5d44a039b435b1b1c44c476ce7110a83ddbaa5d497aa3daacfb3f166bafbcf614e953779a7a8829f25a8baf61e5026dc231237d3e3d1e96769a99807b53251736685a4812d06c22630a1f2e2319045c2c1da10058873953d3ffe794297230087a4795b562773e273cc1974dd697e081040868495fae61dc4561e363618e951c3827850e09ef33fe0db807b48d16ed45ddacb85f1d7eae7bd5ed0ea8be873e0942a43846112b8982cfd9735675e40417874b0e6acf02ba87626c04701d8d5688ed49a95f2706a5ac0aaad1f3becb2f6f879ed322571b5e66e6c994d7051de55f1558e1f51b8ee75f375c257d35b0b5abbddeba5f2031d29086c87faedfb78a2d9095757feedb0d47224c88807b80588b16ea9a8c6ac0b72064b5c7a7cecf8e0498986ff0513e3b0adcbebe1c7b4afdb5501eab4dfdb4e453db862b2dc330e1fb4d0c8edbe0ad88c95a4009f9c625434a4f815ebfcd5dc687d80e05af535ad5cacf938a370a5551714786bdbec85a24464218a88ab47240fa0f2358928f3c8067fa16cc2c1bc3e403e7dfdd36090001dae6c87c3c1d6b1481e27289ce5225069331f0c03c45ac5f3d495dd767109e531888ecaabc4f03eca2aba5e7bba68f20c8daa3dd709e34e6f359a293da5506fe130fb50e5b7a1519efe4df459f7632f90bae4758c501c56a1f6b0f7f160c6a6550542e824197a987d7ffd0cc1ac1af8875e7ac9d7ba4f7341a58d7957b92407201695e2f280d850de6784eb8481513fd3e4e1fa0c181c0fbd480c2d83f589764664d9a9dbc71d11c4c680e111ee8d35527ed1695892883ff4ab9d3cb5d0de932ce7845bc8f3c3d3b573692d218d9c23322187e193e1c35d5ee61441716299a66c45ff1c9c0d35e75dac09fee285fa17a182b81b4effbfb29d668188a8ca4077822200cf1f9bf5f6ae9f7b020000000000000000000000008229220086948d05b9c51cc53851ce99ffcc9b93f8769c9e20a2a380b7db437e5696ddf4813df400f12d528e4f615ddb17974433819f072954c4ac383b0fd6510f35f7a30352cb9aa0efe6bfd34e0d29f27866746f7f5ef2aaaa25fe38dd435d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eb9540cb2c523ca23ffbea48233e5369cde1714e977aec1b6b0ac4fef21164076e2be0b8260062dcd4a4e1dc56aa9605aaee9ca0593e138f9e37d0449575deaaef70d56734abe12835d0878575f358d54c44b0149fcf8f48c56c022b116900f05302b950b4b70f1c33b7ce046506dc46f54086554358dbe8e5472a11c9589f9d021d4b885050c0d2e4e2a61a6853f3080c6845d75e53470f0c023827616931e172022a4b168d25ea1b4d27cd78f7e552a86acd7fe1dfccbf4fa223c71d51f5ef73250a074d547715f1d2489aba793db650870d19c0bfda598943c757eea9f4773b185bf5c575038b1f017817af120795b0c8110a89db9e7e7888a63daec6ec515d2d9f0223a36df293999f77a142c3dc761379422820a64bddd843849e63b56c5a5051f3030988a48a4090217f3acc34904b7ee89b781db9bed40bc1bc7278a8067551a67e03029b57da239364788da28bd6cf6022412505838b7a57887524d17d8b22e34e360301d5a38cf0a9797e6d30ae05a6e5ee4273b56598654f6617977b23f761d955e203249729835ae17ba365608621672eb52ab21c4cabddc6698877ff31778a0a7881fd3e9e7cb0b5a6155c0398c0340c7c02b82e18815d5d15089ad6f0d1d33cc54862624b4184a0106c48298c326e971c9be5204b0d301d3c8726b3ba44c9eda6415a6411337eb47a11ef546f9ac61b23f4d100ce6fde176f2c760795d3bbd99e8b4551ee08c0d9556bd061a3c17c1e2a62c8be7b2e4c50cd679a9c1e0bdae993afd73bdbfdc1daa54840f80ea3f77ed55c98992950770644e3702b597d7e95cccf771ce18d9acc9194de219aa7f3dbf10c863b5ba60bd0a670f962771760a0b08e9893368cabdc758a1125434a1fa0b3a43813fee10c7fe725feb032d155fa05ff8ed14a3822217a6222745c1329b8521859c21a8909e4e1d31002d6910095d24a90a26c01dbc13801dd4dbdf97dd8c659773685bec51b1bb90f1052f34c59e1560a6e54bd4336d573814dc413f32ddf8619458f0b6cc33565ba51b98e29a8343a9eab469c331199bc567aa0c93ce0ed4bbff952f922511b1739d39571820feb62d29ee1db24f86dbbd90d50b9c328c93fc4c3ab0849e7881841754a70c2baf171c3a760bb71c61014ca29385fef5d18a3a1d5791c9d44164f8af98189df3d29854da5de7e404419b84b288b3275608f37fb1951c81eb6857961afadf58812ae43b4bdba25332b4f0ee7b1a09cf7c05a722227692aa623e4a58332fe6105a7e137ddf375dde1d37d72aa8a295d8172695fc05385cb3e8e3cef3e0dc342723941fccdb4cc973337a5e3076d8b4aaf9388b96c9e473a3bce95d1dda83ee2e2dd2423f10f93cb771c75e23e01874d1cd809f75aa16535db4d5b7ac25f1d0f6b6ad80f8b607659bf87274e0f33e2af27c25a3658599f7ccc886c6de2850a97fc06e4faff37b29ec7b77239554ebffe9e12455bb1c20ce18ce06151705fc389206dff5a653944148d5b3fab22ba62a9a9051dfa42607edc9fc84a702f05878db2b985c34391d4bdd24587da42de31cd91483df2702cb006650a205577f0a69b9d65851be7642be1ba804ceea1ffb7bc94e85f185eff5290e5f494471fccb46c9963f7685f8fbd3309e2ef1617e498bf47224c3b0da8e26236cd0655513224199e942101ec7ca7fa47e8dcf293307507b40409899c39613a299997408e41e912024b9aa86ee1249d7dd7d472217c2a5c271ee01969a24e94894d5861e8d02592781e951d0437dfc1a18a2d6679d773fb794ea92fec1e37154f62314bd50b6315fcea262317a45f023a26480aea0602a8b16c11950ba53eacf4dc3d823c5512587ae61f96420685ff19b5538edabc51983b0093050f669b9b9db3052dd27887c5bec1a0b75b1ce7dadaf87eeede8e2f706a3e0c3405ce721e5819476b693809f075ab0afd5302be11cbff2ce06f5d433ada522b53d915a0450860f6d624a6e5e16ee2e710047b590360f167c4d8dbbfed5f828357900800b66cfee6792c67b53bb326a3cce1fa583127f0a776130d1a04f6093fc0c4b688f7d8dc4f95c9cd060a81b58c69f02278b0271b0e3810579904c9b5af2b87272d16fd8199bbfe8480143615fad301b176cf7fb0da8ce5c5e84d2fb134b0c9eaa18ee7c03ed7d40c1a8f21b532ebe74b0a60f99073b2fbd612c92fb1cf97a72e0453ddbe45b51a9bbc7a65b715fbe6520d7013c6407b9b82c313c65d46bbbb811eccb9569dd6d8232892c8d1cacb55874fcd8dffca466c903c95df4cc6926820000000000000000015a10d0000000000e4315bcaefb2576201e1132caca229c4ad07850f9527eb1ba9623a8ac402696bcf85291c54749a38dcda39dcfdf3724582627803c9cd5a04bce067017574854fc5cab424ff79ae1a76a23e561b5a7a26ec8bd19229f514825ec2423d7c6916fe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014280146da999313aacc9b9cdc9122731ca100822af7fc308c16866143c3f89b44d8d6c4a804b007f0e2a844b28c29a62e787cd246622dbedf4d1a9b79fb839711b67380727759f3bd3a75af156548e527774c727a5833f7e6466c8308a77269315c8371f91fed0677554a824342bbd3e1ac2c6a45a457361e6c560668cda5cc023023b2100d24e827bd1330b63a0e98fed36419ed487d316da42d82b2bbf00d1e0312d7a4b4d3431a4859f3d54d3ccad1b7901e17f2844b1f118d1779daf4bc960c0b025ad096688d09d3e2e8d57a8e1f614bd42a1a8ee454f1271a675074afadadb0ba65403f34c21cc56af48fe7dde2155b5194e4823cda6eac58f054fe8a752800022927f6f057db932ed9ea644fa5fb9636ce953726f5e130c1f1e7b4328d01ff250227cfe883d73eb83cb91764dd37b8df88de1861ef9dd955f36f056d2fd5ab2ebf020bbe1341bdfe2bb53d6317eb6050dcd4f03bc631a574b14e044fcf09c30df038022d9033d52ae9f0811feca7cf548b64af18f90c5a399449c987b96144d20e9b36030504e84a83514dcbc4cb034297d9c2af4de1958fe081440eb0034a29da31b283dcc23fad7a3308e71325ecf06da44e6a70b0dbb872c26760ec56c03b490c07b89210ae225d32ff7a0a0989c1c036f76280023455b60430bbfe90129ef8079e0b31a4453ad49b6dd6a3ca21277aa9e59fe87e43fd4d09ed44d8d1d16cb7d70a12d4b9a669410ca7bdc29a4acd1f8b9214f98519f4ddf57fd87339c1d00c567109159c35ac42d8f81d1708e665956eb11f980ecdf29cd8a4785d585dd681cec08521c2dd1529612ce9bd1cf03b5260175793dce905e6ec72006163f672d11cb260f1fb4921217c5efcd010c30b4d6618bf8a72266847d9b0e7b6747777d07a14029f8638996367ceaf68d8463f8929fb62288192486b0ffdbb7106a4ca50873197cbd9802394dcb225287c328d7b8a9a56460511fb92457aca190248c8667586b6cc4a49228150494b5682b8035efca9db5303bfa97d6845cc56f746b9280d6dd5e86564aec6e2da2a4435b684d46669ca84b414c51a06e0a958608d74d7eaa96e1e1cdb5f556bef1d95e0e5c490cfed072e11be995b924406731759108118178b9a4b64dad3574844ac4acf9ef13aa8cbd8b0cb52b6aa8d3f46e2619345a30209d8ca74034702f51bd84493ad675de83779b460ae6021dc55b1ec0d0258dac237229fcd6473da120009c4df9d7a0e54450bf8d8c5ab70905e81e6eefc5259ed02a838b1b4bd1a7be1dc9df88034280f4f0573f1da715387aabff7faa866c4b9c6ac59972fc55b7fd5528932629193623a7f9832389b47693716d003fb858ac834405996c7ad24a8a942cf5ff209ff84a1440c853ba30215aec099f5b6ceb7b69d66d52c6b793f5f5dc88351944b3522aa05fff8db2dde939244fcb4189867bf092cbe5f0139b810291aa60e7cce7bc28ef08e4514998d7f1c20efc62f43d27ca885a647daf9398754786ae2d9b89434a976befc7a533d19a1203dea587b679a93485c0d8fefde0bc2752c762101bc1da9803b10efab28e017da4860eebd76a655a9d028e1523b128593785ae3db9f25545b390a2d6bbc6ab4b5a3d43ad3aa9be14421bbd0bcbca8f9ed723df357c55a0bcacd1c6270a64b0bf330eafdf4600dbd9aedfedd20033cc481a6abc62163f308c19dc4cff204130e808011d9a0d2f448188e1af724a77c910cc001e46294ac20fb3a4ca175d3dbff19bfd53b8982c80cb6dfe1dbea0e53d20ee7be41cd8967e23af12aa8d41e3029ffd759c9e1dd30ebc65cfadf46a57cdb1e6697873eedb5a5e56de937f408667836859baa7d30eae4c55c3e1796ce3eddc0db898c889e778bcc0f162de4a33069a3573d3bde643d9efa82b21089280d0d0efb22c4ce56241692bab564bed233bd2edd114381dc0bf900082307ee4b92c2dd3eac694887de6c0e18a75030f8935d19cb686c98a662d546955b6ba3b77b268624f67aa5582051103e7e511b8ecf38c24686a2520bee410baf7e4b23c33f885088809bd62112b4102139d3aa8aa86c7c87b70351ed530abd6606e1e269e250fb074dcd2798340151c1f934fb50dae33896b487aaeca2bd8651e4a02e0b373df523a10af5cbf0891ac4a16b36bb96ff191d3aa756798d34bf734c5e3fa13285b7574b3ba2a50710206b28e36b872669f3c85bb5c77355222927ee18b5f5b1e3c6fca8b65e3478dff44325d6d0f7819ab4b6e36279667039c4dc7ed01014106f572940aca0855877744b9390a99f7554b5d688792b36b49a64c2e999b6ca27e084dc40edf753ab13a119b2d02780f0db7b7887c0ace17e44a2a6cdf7ec2dc787bcb95ebc982e9bc4c5ac0f0215b43a5b50c4c60de0982293408e3aaa7ccba9509bcf4e40d47358386f02", "52526565ac", 1, -49015535, 1537743641, "5c221ad10230cbf034ab829d18c7cd45af9d6be5b0a14e8674a9c9aff3f3605c"], + ["030000807082c40301ff976aed71d3495c51c0a057ca9d66456810f10ea2af896730f1b935f702e177030000000153ffffffff027f536501000000000451ac536539f8f5010000000002005200000000000000000300000000000000008768320200000000969f937bc429a593aedc0018d05540177f3a2fd55dee2ef801d5c6c7fc1edeea922d1f956585f666a917a6a698f38e04f637cb55387ed3344cc86945bc7148ea2e42788e553c81d7f2e6b8f48af04364a8d326dc836a47620aad463193ab16ca00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cab1008c7ada49dfb5236ba732b4654a0a9049d1b8933ea658784b6076f902c33a68899bba005e843c0cac6e737317e3ca5d3f50a9f33607606fab8b9212285a7f2e57593842874b089ddf611d9cf39b098bfab413d3fd12777836a3bc871a8c16ba5f632f283c582d3f2cde5182b2de802b732093b3feb181b0466d0619d69e03027753259f3e3505f1e216d781e9245066125397a67f359ba38acc24f69494260226f9f414272be73ab593d554f02968913a3d884e8cf7c0663255695118b61c520a00fd7bd7d2e39c0185a0e6d677dae926c7237b94d98efb72652a979d8d6533ed0c437c2112f46ec5373b9010b8abddb2607e00961708d7b03a4a1847f985aab2020ddf06908abfef4e77e59f64d25c15dfbac438646dde1596b1ca84500a79203c020e22a6cf8c9022be54efb8162c35f45439c0ddb530dad05838168cefa7b7b2cb0313d234e044c3b577377039eb86f815cdc0c931e2968c500b87e741d39dc67111031ab7527259845d9d5991d93c7ea52dc82ff7a21b6f524b551590c62790dfcb6f031f9ad53f2f74156eda949fc43b52bea87cd03eec6d3c1fdd4354b3bad530ef9425e8ac1bb9c298a949d41cb3997ce15db977c78c99f17d9a6c96774bde8ab65710429cec5043963931b4bca5cf3d401183dfdd9df886fd04d14bdcdc440039aa832428da4449d3d7f00fbb80b98a6ab3be34758d871c01dddb2c585d52e79e9e3de3f9caf932a84760407ffad4884f05eef14881990d76a4abcaa783fd9c0f7328437a771810bdfe92b2a7c21a28d0023978d660ce66e9b1fb687c74eda0d2a1b6615a5b581faa951f29f1d3825ab9addffcb412e3a9e0b8918d6efd2560e6f5b109a6b14b9b3428fb556c053582b769363ce5e5794483578c406a79273e2051e20552d3372904761d9c5414ea31d6daf3ebdda6772a3e7f58624695627f6842d300314fcd078a86fba10f18205661c43ef8be8d61f703c1f76d4991c828e528eaf4fe7c9ed4c9fffc6c6b0fbcacb175e099b0da24dcf7a6f7812fa56cd8b28192de8ffabe71963cf94ad976f8d05a6e7dc83994874e053d8a01a36d34fbea147df96111bd0e841d1d092509c66aa7bbf0513bae3ea1a0c09628ebdb6ee990c27b13ac65fd1f59444bd346a9c20bc6da22c0921a3305df57b4645e5a289391bfa90bfe878fca3feefa02d11b430cd9a64e8a9e1c6698fd86dc7b5b14a1fde53bfed458c3ff747d861f8beb1b57a005789b8cb3f8ed401543a55cca9c8cba549799b63cb28f0fe5e10d078bda03ad06b8a00ab164448d6632d24a38bef4f056a9a6254edd7ba40599288545029aea887ded62c212da76a26085eccbf93cb28e366d5f762e0ce5f5886eba9fc4b1edf23630aae83b33eea6b7c35b92b1bc91d02a93bf58939c16f3c12956ed205372ddef6ae738a914daa18f4af987210ace632a8d80cd6daa8ea72077388f55f57f3318e02ae3a709c794d570bd3413afefbe21cdb993558b27e616a1504f33ce2d2d72449773b29b94a29e155521ebdf491d17a9bfaef11ad83c013b83c81faeaa225e9a24e17f24517590bd457d3c75a2a6c3b9cff3b0549fac338077507292e73a7973450b8682de9968dbee28384b3daebd9df399ecf478adb1d028111b2189ae7e138cd846f6e72812c9614df66d8961cd74c3569822e953ee27b3f9a53d33d39df521eb432310588a217f1bf40931d8f9707b3adf107882a081a916f9d73fe96f9f767af5424b5da72cdb5b5fdae345e2ac761133281ebbd31fda0fae6e79bf41bf3045a392581c4e066270def35172d9871cf957a2cb773eb234491d27ccb27863f917d3b678b56652608cddacd1fc477df21f7bdc96d055ea8085423034004c47d740d527b0a4bfb93bbecc8d03a3bf16fc86d51584ddca45858514c7fce16efff2b3db5f6ac4cc87f33ec4f85b5dc125c604ce59497d35aff9db57e49c7b9a80fd9e286f43e3b0af4d6f285300e0411b45d200ddf59071041d5be51d721d40b4e9ae0b9f5879b3317defaa1aea67409b2d502b7279375eface4cbbeb2065006547019cec9e65bd24420898a2abd780893cc812a9799019e8b78705a5f47ba047c1e5284bdffc18e5d173709b6e90c30d3cd0eb3f6c6a12b5bdf6f0591818a1082a855331043314ef78e07c8747caf2c5e0192d131f8340c85d4e10adfd388082f88e3bf09873e615289ab2cae8a954dc0cd09ce89c3b8394b99c743ee44e0f02e6693d70c96441d36cb1939597291aae964a3ff329513dbde60b3d55f67cd5cc360000000000000000091e4e00000000004d93e6aeceb38d1bfb1c163219673de0032295eace9fdcd039b22225318334cecd5625208d3e6fd26240343854d7d4ef8334bd9dd23b8b858c2cdf3b4815c404979c37caa2af731a87af4be7c7eaa4f3ca5301c9b4ea79200c5841ed16ce0a40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009741e9a8f53cc722b8e8cac5437fa7d3b92d4c3ab1fd3da939541bd58942f4be8f598ca2c23e55140f78dab9361336280100f66ed83fd75d709b4d3393b5ceced4d00cfcdae81065fb79762a54c37264a465961ce5b57177470fd83b3732645f42c7a622a4a4902e264fe85a1020974f0c1eae5875f4ca50311605a49acf04cb030c4dbd2a58eec9d39c2caa2785cecd5bb9290e6f4e08e91613bcec56b63759b903080b74e2701a8c6ecc6393140e6183d71a82a45b3d94bf7292008442e301e0090b00ff9a4e9c11dd044e861f0aeaf04c96430ffd46c3cbd03afd2c53865e3b698b5605cf9d42562052df28ca99fa2a4ce5ad6bcfbdce973779e30548936dfb732b03072ae6f9b78727c9aff756d1ed9f6fe01a548ce0c691ac2bb432406d694a7e4c0205c2d6a168b77bddf35b00c002e2837b850f74d4f27f4b601d0a59fe5dfc4444021fc579c241ef29857670b0021c2d5519bc219c27205aafe5ff991716e44d5d81021a3ad2a1045cf617870eb1371099655a1f285293546c430a95734bc52770c8670319d2a178f4a1e77f5570a20d26c043be54e83b2dbbcfd3e45662676e5c778ee59dae67ab9f1fa535c0b5612c79827d722140eefe30b90a01c958ebf420338888368855c789c1ec9cf30ea597b04e44be4f1420acb71d7d88195d5346245959559e5c1f0ee60fa3d5082407dd79c13e63f2ee905db4cfc6a2e6704a0a88c114cb0cf704b99725b2aa1a76a43e4b8753ab4fcf9ae346537ec682867767411bcaa1460d5907581bd45a42960546beb5da5f90fc2e5dd693462d3f5ca5de47f8c4a3718b2b7a79e9027e81d9f71b3be78242a926aee9fe5beffdb28f6cd6d7196b6b9193233de1d52d9cae4983a975e1be64a61629d7e88e44913863b4ef5e5cdbe4bde1c8c667cef988b9f89c8c4aa46f6112d9bb61e9061c557604b7f9ced370be9e10d8c96c08f9fd95cf0fb2bc4b4bef9cb08cd987b89caa7902f5881891a5fbfadc8bfe631e9d492e0e5ddc63c14f64bf1aa3fcd9c989f050b8eece27e4cc6b580f48b29ad8f1cda5cc825dec3d7b2c308c55ffb09b5f7c75706daa03004e195cc6c3d5e2c2c44362f4ea5dd314b0e0a3bcc9b88e6eea6da20c13b25a9d8971db2018ce60d8b2fcf14c2b5321b71f91d49c2db6866da54ead528ae4f8e98f55aba0ce6e284ca2b77e7c91bd9771782abda8a3f5c6b9bf23e6d0f08fd134f1410953ec42cde8a88a87e4ca48728e602ff268758df18b2806875a7fb90b64657c5a7efa41c0ad57c9de2085cd0dbb40b2ced74c682a3b13664393704150e371a9f0d25dd0a52321045a032ceb46c5449bf829f877ecafa620644b852e5491b6415c4c9f840bf878f98bc7a6578d2ef04c41340e5aee2d4e81ade6653c9bfd1839f3b48ed5e2a59f3a46971b40e082102411d223682b7f1571daf1fed6be2d23e496f9cc22c8267457902161de3dcb319bc8d1b7f82dbb7612a5903b9f46204e18f1891e1a5630e9a2ea8a5c63ba128ebf284b0b1e868a48011fd468454e072398f6aead291fc405810653f0b7411b07e5dc9723d4cf6faffb6ddbcc223a9dfb3796235c859107548639cbc3fedbb57ad0f37d5756749e3276753e123c1cbee81b20f0c1d4ceebc20515105e89c77893ff52bbfe760cc91af12c8d3d502f56984e52ec809b3e54aed89fc07dc43a57034a79cd97fc8b70f693fd911cc9a2486c72f35c44d72e021067f02e3fe46cd3be56b1af348ed885e32302f0294815321ecc0a61c104217201e18cb95fa2442f41895dd4195e5ddd6f2a04071066b59f41fe77e201954d70df99e997c7e60fea32a8874a9212c3ad66c1dfbab980049fc751d8260983e19fd5cc1ac871053a18048b6dd1dd481b7baf252acdb14df1a4a6b0e3064ce1ef2dd653804d539c12468d59e3384cbc32b6f72e9465798a9a3601be3b9ecd8778a7efb23d6be67f8c5ba11be7dad069750e2fe1d912a89687ef6e8c17682a72e7eb807b7744277cb2f677d85eed9d6ae67e12bfba4edb6a0a5a32146031437ab918bd0c8d2fb8b1acfbac1ad47588dc528bbcf72102c056b45b492750c5d1fc6bb87006e1643d1b0d444456c18cc136efb8e9b10b32082cb13f29ea7e54396f2203fef0aceb81cf63b877604dadd9c22ae7680be0d34e173e20a74062a9555de198b2fee7e107061b1ae68bd14af2467f1ca052827b5cacd17152e26a3846c7b2a076adb2e602a56435912f1b8ffb6009d5221734c4019d6a82a8f333b0a7d3d295c68e5a34ac7f2f39581b868800000000000000007afe3f030000000008672ba22142e5f312befb1500be585347fa4b55c8faaab08b1da7b287e3c842d9a428e777a37aa6307a31cf7a49fa9f46f730712130d45032f12e1616bb915444562477b019bd55dbb00ea9cc8df3863592531954ce511a15a96608923f926a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae69eddcb35f964a4e9acf7367ad39703fd788a3fc7e6d48d5c59f26d0333288b17e6832b07e0b5c338b759bf549004b76d9c18ae87906b2ad6aecc259c821411c817b5f5618cb6544936827b826ddcef3dd290b49839dafa59316d4c5d870a411e44e615fd9641a3421fe40d1ba4ceba7b57a27a9b4a4f87f8ba18bbd7eea540200e68a909192cfda5f3cf4b8240c4ab8b29d7aa6417d3c3fec12d9a85763fe2a031947552dff1b2a72a4f457f98ff62c8fa7280cf2e17776fa9aff33cac0ed20da0a06ffa7ae02675333cd0bdf07de8ea8ea58e8df927d171b412f4f5a591f76275bd812b5a89e5de5084dabbb34ddca1858c461c0d211ac244bca4ca3a25c407432032c4c32e68fc7e6a54a2607cb370d3fa19d98a4695dbfb57fbe1b711ee50ab6d8031636f95237096db14b46732383e1f2f78d04cf60f8f026f6fbeb6399f031daec032b2a02b9373300e73fbaf4492798cf7e06ac8c3c604b0fd51c276f9a8a5d8e5403252221f3db084f29730f0c313ace90668208fe9c88c068a321ff2ad1379ccf0302248fcc601ecd73a8538bb519ec85312cefca18d26aa6a128bdfc32d06edf100783c30e9ff36d086b304ac500dddefb7777ca22d31a3637ba240644d9e8b83d1d35cfcebc81b1069610457f18247e18bdb33d13cb79ad1e72f258f54c0867e70b154f2c187d2d911cd2790fe05b6d7df1f8bbc55179c8adaddd1c38057a7f7be08a0b5e3ebedc794b4ed1df900600f77dd0e9d5c48600148cefc0863d4d6165a494e7dcb8f0986d793cf318a8b88b1ec27cc82e4dc48c79ea5568a2d565aa7753ef1b95b552042febe0cccf26bd97d3c2acd4a817662836408418eef8bbbc6adbf4b88981df82eb41a00bad733277431a7f5b83a391a6fea54c5e8b09d768b70a0e8774aea2dd86e96af1cd0f2829e046487c492d7bd1b34087e20b3e3fed709dba0092a67d77768524ba5e0763010d2428107124f80dda6688a06ff1a97618751670609dcf23a954ab3b47ed32bef10915ddc03f7ae248a316bb43a89ddd278fcf356f8158d500b0cff9b748e29f2d0d970bf4f6e74eebfc4a9d95f4bd127c25ba01dd0595718c4fd7cc33390c967cefd9d75744428d7076d590240839dd96e73401b5bdf02a61be61261a64bdbfc08af77fc51ef86d64f99985c7d6457f09f93d2a641e3ad89075f6e4fcdb444494fc179a0c793244a1ab8815e38c63d9adae29e2cfab2720ab28dae70f124719bc561b95e1f3b570a2ca8d1c5b702444841fac8d6219a98bef3c95ec38d40848b64674dd0ce5ecf64aa5b310dd863b4e129703c0047fc078e60fd6e7f9b86d57aa4831b6ea12ce259214f461741d4553a6b8e144aba436642045c6321002331fd70e4ed7f2a0fbb7600b77ab9d1b3276cc0f5b5c469d5211a7ced0525d6630883ac0c534660507964f93baa4e49f31fbdcd861fbea3cb6da63b229e6c3162e004f3b4d989d504d3ab30ae28cb98bacbd995361bc874c0698b060d5fbd18cd069f1eab2a1944c8d4d8a136c6231fa719593b6973eefc98d1c796989a4a0e1b87e3e2f3f733a90e093aa0a19fa4957ef649a4e31a408994205d7697018d9c7bab53cfce6b233862f178c32c832ca2bc5450d138516287664e5c0fb3f438a50b09bd839fc68ae31a9c50c81618458daa5f5df2f30034c970a9ec1e5d7c50fdb7fa4a202300fe4dfcb5601020c55a1aefba1e129accd5e8769a7deda9530c215e6862a753008e051ba73228285637f7de4c7590da12ce31510dce82b2fe531a0e05611df1ffb01425e5d50307944d68f690c8ee04d9c3f64e2cbf3bfb91e88f39c7face1d49f1f85718d44f9caa30c4cd296f0fe252f4b9592e931323a73b6d09dc8be95465c8877352a564538df9c25242801fa0969af75e680b2cfc78d8d1bde6d14723e2cdc7dff569ae3c860da25a8f6558217bde45d46ddb374b8c6e54e3832c0d35606b4e49bbedc95a2e1b2907348fbe5639295e818cc34126a14c1f583cae31e738a8d0be17d9fe4730337aff200d3b8c62cc852c73f05ce377b36e2f753784a55d32de784ad6d1c446af4fe073b0c62d9f64b4c5a576a98e4140427d82a07301402b01aa20fd226b3f6272e332de5d012d58af5d44752e78c1a83c5a9c6471f29d3a06fd14282f433d2ef9bf007f9bd25cf96fba40ef853eba8844836092cbb9cb9ececf297935cdbc144cebefe2e643cf36c9c7ef8ad0220719dd6676404a0cafaf1cafbe3790624d80a3559632008b161cbc3058e67ffba9e70469a7a64383f14df055e09503518096c37681a0930becedf8e6b16351caf682bdd84f007527f6e104b549b0d41efe7a987ab25ffcb271502d01f38e0f42cfe0f275822115f2283a2aef1d43e020b64ef7e8b3673510ee2377a0d8c291905f45951bfb8e5cb220e", "51ac63536a6aac63", 0, 815141338, 0, "ca1395e9b626f7b0338fb35b47e84bfd3d3913057a5e2d0f696ec858954b48d4"], + ["030000807082c4030214170f63471229151b95d3887e0d7d223a85504ddccb3035b1f19010dacd8698020000000263acffffffff1b3db6276da4af2dbfee7a4f492cc9f63a6045dc4b4687bc1f088ae9d1027e8601000000055200525300ffffffff01cf3098000000000000000000000000000000", "ac65", 0, -1879166880, 1537743641, "1ef5628999397c261f928ef89e4cfe33e58af284400efc23c59bb687e3afcade"], + ["030000807082c4030135390c671d2b33aaae7d934b6c9f61ce0c48feb7a694935669daba5eef22f6ac02000000096565520065ac0052acffffffff04e1e61201000000000852ac636563635352f5a9bf0300000000046565636533cd8a040000000005005251526a9ce706000000000004535152ac0000000080e946e50246039b010000000000000000000000009e66a4a2573f75af8ff73640d385286c1eb2e348dbcdfd789a40cfc5d9c5df5a3c0df77b2fa5c4fc42849f4926e7a569fc045696f285536f82807ba3be017e94c4f49da2397f55ec5cb77790f3dba7e3d2a0468fe607d8421e88821e64dd0f6b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2b4e111ab0663e377b0f8d9426f4b4ec29a45868137553ed1f967cb8530270c5eae7defbb661e76c5aeb450dad2ec49776a195f9d1a5a3c425e7b16c61c3be90bf1d37af8537b6d67dafa78c91d5f01d4deb3ce0d2e38bfecfc514c335d9f4053901f5c9a419cedea25c6e18000fc752f13fd1f78a5a2690b51c174acfbe0fa0315768a1253f5195de60446f4c7b5cff34f40af0cf2b34ea821a765a47837cff3032de7f73e0ffe8b14c47c1bdbb056f1eb5a8dbe2a256a30c26b5d8558a2a17e780a0045fe004547b80a8908ed7ec3d07a6a0cc0a3db3675b83b45b3f092d060300993791e360be30320d330ba4892fed04deda84583edaea5180bf9c8b23ab07ac7021fe7698b8ef16ee4d74f7c6e626000486047487a6a3dc38fac6c32ebc3afc7b5020d1ca69392c8c5cce07816f28fd514be1be381a24cc0b20dface6fc1ede017050323fb5591a911f9d65c910d36c9a48a7d1be91523088c494b23bb9a38eff916250323b85e4093f6ee5c0af9a62395b85a7ddab79463851705b5adb077a2debeb05903143bf461fb0c3ff9f9157c6c37855e3bc37b59d9eee465ae3416a9075cbfb79e703a6b173db8980f37de65e73218cfc52528d1dd6e65809fcd16f0d9f691b12eb9e3777f0f78843afadafc6c08e0e65674dd3fca55fb401e871c04ed9c3912547c3da41882785c416ea7b9894b7cb71b5d2bc1a51dab7bc54533e756e14e97ccf58535f5695cdbe925bef9bf128ca844aabd1656e3b481c76f9c31ecbc41c7c36b2a6af815a0f829627493fcbd9dac06902a951c92ac22edec40da899d0233aaadde38daea8aeb70caee7e8d79c641d9557a7810b93fc6c913772ff8ae15e4b0da4ab1ebe628b76d5491a50926cfcaf3166ce367efd0aa7935e7ceee56f73d8d1fd4994fc384b2a7a3dcc66c9ae9579eb17f481ff86df8eaef21a90e59fc366ff7925b1d6a12930a025c537c358400f256e0da3d6f1ec065db12101ec3f0c7dc9b1ee62af923f87ff14201ba315f3bb221c96a8cb79db0dc6aba3857fc0cf65e4eea7de1faa170e29c23fd7b259e18e1b18729e5d6826c71d14098c0ef61d7930451f798a65a7c807edf36271642f27dd11dfa90d4b25799c3df7ea04ed339fe149c32460706737bc0bccff0450b5069c637479db72eeae59dd1f952da892cec3f1e5091df94951bc0264b07470415183ed77d0f299c8b7363019e4365cc06275f5beb54a765dfc0429e0a5c21f80daff3e020b6761cd30a0abeb82ef4c64c77862569556c83228c46600b86da6beab824072663fbd053065015de8a952a943e76872af39b0a2a29174a99519629b3396c034241db8d95fcea6339527d878c4f7bfeaaf205366a9bdb04db66972138bfd59ff005b7b47a78c18729a29fcf529614d171fbda665ff5fcdee0e57b879174f59c5089115a40b409098a3572a90abe46a96dda8f02024daf60516d28163ea081f9477a85215b1da9d360718debeb46e93ec6752ffc2e055ebf53188b88cd5201284092cfa99bed33355094c415a788231491c56624b3879e939eba33e8efbcf76fac603f9e964bd0690ea975bc0e4a66a7e11229e3b258f1d0c8dc0d01961f2826fc476d5f67f0ab830040285b2d65be8688803c2ddc4a2558d6f471111a96f246e39ba1f3419447902b2829e6bab2d475a9b5fefabd5cb5173e7c556e8629afbe67ed730b5a2df220d1d439ffc597cdf45ece500a718894562754abc8e78253f513d8b5324ec0d7d3b15fad45dfd1f15cceac2e2f9e74fdd5b2d9f274d1bc8aaeb51b6870bb1d2b2dddaff68cfa5a69ead06e0f4e555f637f1bc455fb07d30584c510b558ab02d6e378b975364df6378de3435fa68a0ea060e7ce7f04ca196f6826f303deded6df975f557a6c8246759a08d1801ffa689a764bdf93ad5c8aedb28c3db061248a39f716c482a0ce65b59becbeb29d5811f5ec0bfb01373f7fdbb9476b35819a45243af3afd70c2e00b98030801a47e32b7ae323c51cdba3a3cccf4862208e6db0d6ab22a7ea4305f03a6fa3ee503891f0e71fdb05a550c741036d0415e787c0fa504b26cf879fc34a20970af6019b2babc4183e24d2dc4e94b21a9288ccec66dbf4fefbb4cf0fa9dbe38f1ac709780b7a898a35d24a84fc6f9339b6c288143a75583edcf0d63ec960f221ef20c29b5f0975a3516d82688ac935628879d8ff09a4a5853e215bf3592bf31502f0484a7a0bc099b1992e8323446c9c55947e388c089e29ce869e60687063db96e8ef4f5ab62a87c0f1e23e9c895af84f8bde030000000000000000000000007ffe7eb5ca0ff6f12b3516c2c936a094d162cfff038528a3fda1be0232243d2902c54de227109d44a24e6d5a627903d1eae7d3f0a1c6e258dc97cebe82d785bc044665a8e29d40737a7c4a11f1503938262ee72f47618f0b395730c1959575d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f82b727b69ca49996c878ad489b2089bc476f0ab8deca2c373df58ae54da4f40c4a12939cd29cc8d59266c50fa0a9a04d1b83d993dd9ff2b511779b93cbb151e102b5ae27c67d9b295537752c5a721e6e34ff7dd161b88c3f755f568f0ed6b548f0c975693b1687abc049aa4c045066de501700cdec32bfdb7578bb3eec2543b021f5496d948259b3b44ccce4b9f469502e0d5eb911c1e5adbbf11f3329da33d2f021be86b1dd6b9da799ec5a45da1ed7774c68cab706c2b30b1c46bc1b01bce85ff0b020a3f16e13cbdb2d50b955cc6c4dd3e33d5365141e01924dd7ba19bd654f534a7810d60a434e5cbd0301343491a8b8c373f9993e2a1a6ac09fdda4c10d9e698031a60ca33f213f681dee0e779731cc5671626eed22b6ee64eee89b72039058a16031060fe9bfa9b7f6a16baa0fdd5e780f06ceac91cebf15466e0a41bf5a43716df030d7d0490f2e6fac5f5bc4cbd34c6a2922acb0e6b3220bc8cf0bae2aa973babeb0228194be845e4799ca180cca3efda7b8aa7644d97dc011ebbf97751aa3b41cd9b0223e4d8a1b334b957b0ef330f70d062f518ae38f07f85ed9bf003fdb7eedeb732257ea25599fc3161e0c40cce024ab82345f4ecc02b86a1d41d62cdef3b9be7300ccfc80fbd74a796687d6f26e10bf57a746fddb84661a6a6707e0581c512c08df7f940e11fe7c4fe472b5f9a310b08e68b237aef3beabc9b020d943a9047927a969e42e2f7cb26cbe6e2a8301ef81aa4635ea45fdf02ceef2bdb821f906e45f10105ed1094c02d33206fa64040e7cfca32ca65b049ede3ab4b57b82d666bdd635468d2c199b8fea502e42a7345c9b5d6ffb3b7300ff0ad1eb8283410c704adf9aa3a5b03f4f33935e58df0590cb26303e9d2b2872e41862f87da3fe7a10ac12a0a3b269838db384d0a82691c3aae93c992e35ef0e58b2282adf5e5d8904e40d60f4b203172a19f0af9df5cf6c8180c9484104a4d81cb8b535db5888ec69d483d793f42ac79bfff937b7e90dc518fe7302481114f38642f7fb35ef365b2391fef1e8a556dc2374f0488d8cd3190c534b73e15fc51b355b648d5919b3b2befe568ce9aa9f19f931e29c50e281ffafea4ee0b7ac7f865ff6ecb909f8833c759c9dd6a25093a99dd22b09f95d846bcf678d6ba6152a6432f84bd83940e1dc468ea80e243bf0eff8dac9fec10580d1f1c1422d6971057596b25401ef2887d4d0c5d22d457b72478a4befe7b5b4ca443d49c31e0258bc0d12497b27369da946a0d90731e1f0b10dd64b72ad954b01c16d825891edcf16ea7344d51b552e96ac6d0415e40a58eb2fba3c2bc5f4034c68ab2a0a195206095ed2bf3bed93b6675771bbaf58571ce2d8ebcc00674ef5ee20c81e543597ec9bb1ae2fc79a7bbf05a34c9de93d645a192e634e977ede659dafe561d7e6067b0bf9c4c4bfc096537a9dd0eb0d92161401c093d638e890f5de6ddf678472ada430eff845fa98ccfad6d2bfc2fa17613c2155ff891020101a906b9e775144610f7640ffcb543d893f4230fdadf8c496786e8281bbae67bc8d52f55dc08b3f323f207153138fd3da1dc0fe8cce3dd9db5d41c2fc5751541de37e391187ba9d71054e8ffd641aa7f8378a9fa037d41ce66deb431bb9d257877de7ecf7373834df0efb507b22dbb3314e528e2ff399606c9f091e4de80f02732c293db857a9e52265af7f613016beeda1c2407922e456e04afd3d1a5f4081a3d2cc879ac5fafe0e3c873da3912f3c729fa655c1c28ef0a40be533d9f21991e1e43c0447301ef4933a21e50a382fe82b768d708e6a8119bd220106f2632639e508e5636cbaa48959edfbd83fc8422be9e682d614d6b0c854be9cd292ed49235cccbaba038f8c21c90a20f8518b12790be1a7497a6fa4762b0f50b27311ee5821b0c15c0ace3d8d4b767129814bbece0301f7180f85fba2a82266edd260db35749d35b6a5155e9fd2bd5da945d3e8121e39ffb7836469a921e93859b1c19bd045fa84e8fd9720d7afce7b75ff6604df5d4edc4b9c300bb0a4af24f721d1232535c1fd63cb25239bf723d5d205c044728ff4b8c4d4e79fc239c86ea05f349a2bbec78dc8cd53c1b51a9b82de7761246c0f721052e6eb4ab79a31dad88be6541f05a61ea9154ca2a0475cdc8c9f4800fbc9679eafde01c4bdea8a4d9cb7f7ee8c25a3c7bdc36a71bb5da436ef65cefa97aa18a6d2cc24c36c52b3fbdb2eac62aa8c86f6b13f8b897b688b9dfbacd918ee3c5148490e6383f2a685ba07f240353d35b6f7ec1eee2e213949f0a0fb91022c42ae0eff11c2a7cd576d09b3d85c9c16894f19103b729c42629d40790ec0c8cf76c3ea466fa446c64c9cd7a07ec60393e197731e0398633ceb37a9d39bd82e2fb904156d6773743203a7cbf37be74235009d3f0e0ff2a8b080d", "635263", 0, -1524549655, 0, "a3b8c6621791eb6e3f09c41ebad81ff20c38ef2579378e38b2ce2679ff97553e"], + ["030000807082c40302d7ceebc9ab6928f5675587737819cc7702bbc54d16796156796e0ba332e88ac101000000026a5160f9b9074bc18c703895b62005164fcdaf14f2a155e0eb1f944f0cc3efc3a13563565c3b0100000009536a000052516a006affffffff0425b5e5010000000005ac0051006ab9c8e802000000000565acac63008a2c7d05000000000300ac65571e6b0200000000086363536a63516352000000000000000001a65468020000000000000000000000007c240750da4238896354cbecdd1e515db395d203fa8d26272bd98b88fff2a8586555e8ae694459376290e9ebeeedee94a95cc239e2041bd4981cd69aeb1618d04ba253e585b8f41e4fe5a38df7f58053cba1cc6a60a975b7629474641b23b92d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fb55d68c4e84f5025a603b36796d64a1910e8170e9e359383579c07a3b80f6fd2a53aa167b9bf3b2a0a847130b77793653b8e33289ba845d9d69cf8b3d654ee7053b9086dc165875e3dd1a74b9183aa01e53f7d96a25350bd91c8a5713f2ad1ed06ce21487ada8948e0358486d41b286e6c5b22cbd9bcc7d4455b632ef36da7b022e77d841f31391b03cdab6f968cd3fe0175ed2cd44f1e99743239b34d3f59cba0317272e85fa6605bb550f1bf15d3c72c0d2c8b6145d530beca231ddc7315367aa0a04b42bdf52ccfb6bef373107ceb44a327edbdbe6562b4f229486ebb76f1f7b64ea4c0ebb1429a8a61b46bff28118bd22de4023124dfc00300e861ff46daf0766032b24266e29e1b0d6011eb357d21e6ad129266e6e1e2c169bb54d6db8ca6e77be022649b32cac081541c925d057a98d727baeddfeb23ac0d9a6a47e4506af131d5a02136b30695b82864985618a271ee5c21f174837e714b3d617f52c3e19c42af85c0225eaafe32437916ac56b5fc06b1b26e546665f8d9b4f6cb13ec5741ffeafc2e60204312999fbee40cd827598777e7c346b9d7a44bdb9f43b2644a81058cfe31914607eb3ce9f1bd281c02595a938a8408fe7899b76ae1f9561c56b218a5c9ee1af83afb7b5b7d65acfa4ac572ce0e250420f3d12fc2b22960e883bffe16ec417a5b8b82828e9a76b7f78b16c7253c2863d6b081434f37483b4285800d32984b78c0471f724f13aa8fa7e71d526c62dd0d790ec1f660ee04e31ef51e9465f11006789a69a351d30ce65b643c70ab21f6afdf1b418388ce125c80c0513fb34a19d1c4cac1af0240c5b8823798d90c78e390d9b03894d24d5165f2d9713e8e3e746157d27434113334422484c3757a4dfe81ed20cb9c9d8a830d8519ea782a28eba32c757d7bfac38fe6776aa0e70420844a0337011651f07704acaee6b35e087fa5295c4075a236cdb14272b3c952a31db624cc38c3199874621d49699a4de0f6650281e348b16fb536a8621be850a3c0b0f3a3bf57ee8722873a79043a0698d590ab95e742e691b0198fc2055401063c07828883e3ce7b671fe818d83d66286f65d671e449a9c9ccc7ee80a7876ee2df4d175d54ea15e4d2a5e8299d6a72bf7b65eb42bfdf80014bf5d007a8c312ca97528ffb9951ded3d74b7db5e5e8f045df5939e815f81bfd21baa1ae64568e1415285dc7dd05cdb96b3d42242b10b4c751636bbc22f12d1b13c545f3462bc92fccd66187f0b42635be4a9fce458e842a53c50c6ffa2e8b4d759cc385521aeef7ed30edbc5c95f73db64cdc90fd490e7ce3e54e1c99a1a346e3d48df7accfcd6632e81c49bae969cd61b7a1ad82ee74ccac0f6574810bc821d389d3ce902250fc40b65b7d20bd2a66af751bbd15d70aa1692a06f55471ca5ff5b754398ab9f2e9de8c84551081e7d9c7377391ac168247409a1f80193b25e6ace99c753d508e2d9475898bb942e9338d5d64e0ed9bb6dcc7af74b6c48b702b33cbc9dd67b902ad93a5fb4dd40f90fb0254c8939270bd9ded3ff4db1e904f3724b69314a69f6b7e76a822ac9c072080efdf402d849a4a7ffe032371d4d81342ad972f731d714eec006003c987fd2196eea3597a6f20be3a60cc651c19ed1f2404b25ac5d6212fcfd9911d11023436c7e6c32fa2352816c154abc90b9c4e78559aa6032174d4240f5334389e0d7e394e48d68551505b7cb1ce1f83af0a425817c29fe9f10c9fb9d8fc592349e0219cfe2e1aa5cdf523cf38aca5a3e574332eec7ef5de9e1fc92742813958d58d80de4cb2c055ac95f48168f10ec74d36d90c1a10214073e86a00dda48a821c353e24310c6dccf365179e3687a7bb5cdd85d8a2a14b2fc9c79942e15cffebe1dc7c1b223f18608dcaad656519f644521d2912a718225fd4259fe7a211a4d6c67277a7cbaa8c734691466fff60e285fe5918ac705bbeea33a5d0f58c0954572a478cf7deb7afc15750f71fd8c55d886c81627c18d8bc9443cbd12b75e76315cecb75f879b3e4435c92b28574c89cb44e2d73254894cf6cfb86c9f974682dce93942c1963e166b82918eb69277f2f523fe3ac246c57a11121d6593d89a9d955aae4b6ac1c2529c6621baba91fb55ce9bcb4f13277865a021ee68b01266382c2ad1e4f74400ebaac6191c14bb9ec0b9fc5744e03f24dea26d140e1147faa44a90393c8abb302c5215e56791e1001245f70a8179a515c41a2ce025abf237eeeed0c0578e00d00310791dbdce9f6aee8c87fd45d3d1053703518a4f369e7852a772a58b62e36bb84a34a62bbfee5957c9479a0dcc3b41e4242bcaab39d33790994a6fe96464d9d79bca9655dd407c93f51b3034f0434cef20798465a7f8724982788734af4469780bfdf4d6e8a1fb9ef732fa486414d054d5b4cb5fdc736e48c94a02", "6a6352630053", 1, 1278606574, 1537743641, "3cbeefa7b28cd4a85d30ae5de7b6471f72d69adcabe3555d7b0c1697327752b8"], + ["9499d2100300111a098c40c5133b89fac9a0ff1b3d2c69d942eb65c113ac0f92a6ba74bec10000000000eb74b07e0aadc89db0f3afb7e36a786db766b0e635796516ee022360a968c5daf8d9d328010000000353535133eb713febc662775a3f6c5f7eef3f357e7aed49cec8141bfb206e4415af348c848e16c50200000003acac51197d48f404b7f45901000000000852005253ac5265518908eb01000000000265acde2ba90500000000096363ac006500536500f57f94000000000001ac00000000018344dd0400000000000000000000000015e47d88bfa8cbdb6b0f0618c6772e7be2632c8e1276a857afdd07bf11e86e316e26288fb7464bc89b7751e29173a7b5ae50cbabdb2e555f788556a0801be409c246b052c16b5b9d7f95444eba25eda80ee35c6ea77e8a6214596c31dfbc69fb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006eb6a25331797f238362eaae2a0575e0b2cb88a55e3073fb0bf32d30a891e1323170ee05d84b2cf9bb7fdd960a439a0302af868324b9da668c5924e940d2543bab9a4751706e5531bceda4f9c860ced6e1d2ecc479dcfbae6c5fb8ea64b36f89ac172e537ab783e8665e97c011dbac2b48b439a69c5f0cad58af50489c1153303197976c3590ab3a6240490f600f992acf3a08c0893163bac067eb89d2601f12a021b314f51302b88bca5b9dcfa9753eb71bc3a82709064588d3781213e45e4307d0a06a4b007857c77b15ec85262d55d9b82037fa6cc8e640f3353f65ccbce867d74b8bf0b1211bc1bd5fb617442c857cbb6d4d13b0a788208a67d100b81a087a9120220e300cb489047e6f2e0ed7a8023d5d2865ff7955784c663f424d848e2435503021a4a445a8de16e9347bbfc2361822e8be96670990d3ee7fb821209460eb06ffc03182ba5ba3486b2b1e30ca9dabb2de6aee8b19aceb633b12468f3f875535e9316020d755debd2b9a3cd0032c4643f3a690007458979f605473ade88c20bee638cca032d6634ba6936edc612679624a2066506340debc9c7b930b641d4d398e1613dcd207348fa8f26a8f8e5d19a0d109f15d18725955d8f9b629e1a5482f7268a424162102a6928c39dceafdb7430dc4a863c535a329717a9ef8fbb52f17012290d836b487217561e1f47e4a46a06e5f59573c536e4d8347b06c601d71f01dd0da6fbd4de3282f73d8f10223222546eeae22cb1752bcfedbffdff2b24d42466f34cd9e609bdad8062c776a541bcfd6d3ee06241e93bb9dac7aacc988fbb4af3db06c6bf7f1c0900df782fd6d2bf223c61da8862ad70daa5ffc03cb52187e70da0f55966febda1d5a1677c3a5987b2c4faa4226229e1224177fcc15b8267adba488ec04303f0547ad26a163a140c6d105a8f668f887e7d1aed33f6fcb3bedef0ba5e158a39303dd1fba90e7823d16169c08ff286013159c0f6d43c9751e81051521b86bcfeea7f3974e5bf20a9aa6678d3140348d58d868ebffbbc327062884ab7b69f730016681d08d8f2bc9067017ecf7fb6595cb41ae04bddf06c3b7f005adda459fcb8032a61b9c81ef6471e389775b65aa4bd9a35261d4797fdd1ad1376eeb54cd9332e2ba65b3c6311446275fd5c5ef985eaa7cd6b0dd606f71b6a9525e65e69787353f66777895626f7529d2713c8a2cb241d6aedeef9f80a609b1b12fbf27fa0d1510fb192028b7d34cd6013cc4a85dda73bb3c6eddaf6eb22d7209020a822ae4972308391b07585dd456e703481c139b1f4ced6bed9f1ebf55bdf12edc639a19f14b0da48fa86118c84c26bafe10389746a60888abfed5ca15b46797bd81db58ffaa4555e025fb1fbf0d1fb47b117bb802d328451791efc58dd9ac2df369afdafe95c4746cda0323e09afdb8dea93cf885d632fdebd1a64fb108ca40245047ebb4024d9d5dcd4e34edabff512e2ad8441ce895124c35777e071a4a0ec3767d209a4dfa62485d9859d2de8b28ffbf0791d8ccb4214297537b0aaa25092ac7a8033fdea65afe371a8b5dc0ac48fcec24607006e3b038e2de572d5601ac9f081412c4c7aaf6912a3ef82cfe65bc07665a4e23e82d31fc31fc64d62d22baac7440462ff7e9e354382b95d5b4f480b0e85c2b33a6a7f914950fa635ed296290fc7699047d2a3f8e093f849aa030af45c3f254ff6f139e94c52b81dd3c4fd0249314f4b9e3a7d114ea1bec5c83642fa7ef706fde4bc7f90a651bf65da5cc888ae53d54b0df2ba9475c9d748263a3971bfac182b6da8c6173469e5d4638de7ae5bd7111c5a61688397c03747882d4a9eceb7732bf7aa958b6cdce86a79eabffd4e8188470f68260a33d13f86b1b7d271dec4c6802c2144456e1038d1f1b6aa81f95de478d1dc6db38973d37128a69e3c7da0c97d478a728255cb3d2ed3347506b16e20bf3bd387010c97c069db9e4a8dc08e154d03c6eb8ecc4b32f2d4bf0a573d9e5f61f15964b3b5ed44334420868bb90e16a0df550150c4273b8fba1b7b939fffb56fb721fd35bbb441b7351d0b05df95e5e18114a7153502bd118b559fb179eb2dc143350b0f34b4986ba74a4100abd8b8ab1249535298bab43816a8d5c4565b197fd118943bc3251a87c1a07e5d182c742cf6294ca6445966265dee9e705a1ef2cd98edaca8b9da0e6f25f6b29771bbd9dfc3bde2ffe537e1f1baaeae0c42ab3d84a301328475835e6d12aee79f52633e17b38e17444fe0d7f4bf9e5cdc07717612af14c90a2af93f2235d4b7fe66d3d474a1ebeff0390927c7c2bda5cb395bb737e6bf716a146ae2039915ed36a66fe709093fe0b2e162fbcd3fbd07366137254dd8f4292e5e76b3606010bc235557917e80e5fe87bdb1b77780d68a7fc15852d6d03f0cfe1aa942ddb17fb33ba1fd0f0d", "515152", 0, 273789000, 1537743641, "71da7673f68329cba17dccd9b7d176387acf0f1c7d42ace03bc4202e8a14388a"], + ["030000807082c4030149d52f8e48166b404f466e33e44721e07a37836da6b93c93842abf1da35fed43010000000765ac636363ac51ffffffff0321761d0400000000056500ac005364c6c705000000000100ed2c6b0400000000036351ac9a9a7741fab44c4b01287a4f05000000000000000000000000975753241cd6114af11e0c2a01d1da7c741afcdc1ec9241cd903e7179e7a6753ea39667a451cfd8769722f3b9bf97f0d2f6b375f1802fc59fe47a0ceeb2c2af8ec296a4bedb1582439fa56330f7dac0e248871ce27a682f90e9ae3c5dd99ddb500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e9df23722df050fb55f6f9cb65ecb1a10ab3d21a00c94060f288dec2b79583f2197541ac0296673c98277be80d2fb65020d69e3b4316f3fdf379595bb837b4db8c619f7cf6fdf58e226183b28bc4ae2458e485b0302283a20ef2557bf9605b96f66a85959655274e714530bd1bce1b454deb5423df4834b928c8bcb041e40c21022bdb5ac6b4711b8a3854072be3fd0b69e6cfb6822e17db28d6adc0f65407702b0316ce62b3f88ded95dd08997c0146dcbe6d668fe9958e3c07de4a315ce9e0f1a00a02e7a027227a0795ce654c2b9cbe2a620bf0b38813133efcc0416edac324a654ec8ff7a792aa5c3f4886fe6941cec6dd9dd819e5733120944c0a44aaa86cf85702024c618867cc59b77e443bd151090f67617b945aac3e2c7baf97c0b4605422e4030e012a366f006846882d1f98adcbcce4debbb45810eef41280f5e8d23800ed6b022314c828dcacf74d8f52b4ff26e6d9eeef947654a147ab7a44af1b09c7a9739a022065c68e5b0085da78a117322e4ec43ca28c10e93ab803b429b42f93576eacfa02075fcc09097ddbe1f006f59b7e1430f0e6990f21c712b80b2e98e898389d8c0ad8ace009db252ed8836664fd6722436519ddf2dd3ff784b6c18335e31b2857938d7ba085dceeabe7112bc08ff457c75905fffccdf15c866fd6ba2fd12149ee3f5b99fcc17d86302c794277bf6adb8421a4df356889f15459b195357707aef7d524c5ac68bd70a7eae416192585a2d4cf5789770c58ee0de3fc2156f966453ad2fb3cdf607ceebe0c8247047a707e6e1afc5bbb2892060c1aad52057cdde4e3b717ab5bb6a8c707ec2623fbed045f0921d5a88e4db50cc026781bf868ec972a426d7526b8c9dbe1d496c5a1f599f238a914dd78162101a05cbb2b0f3299cafcf3647eb50851e127575d5e9cdb5ec729616d96bfb3d73b399e0c46af43bc6f1c6bd833a60c28be8a88a9c2e69148cb1a3ccdcd857c1a2358178d683c11110c90c36b6b329f26fd8115c8fc413011ccbb6677fd55687ba55fe9910d464dfd92d244bb6711ac6a27bf706fd4abe11b566b51bfc361c159368326605244d9be404fb4ac3cc082bda7e02ddaf6c9214d2e0e7188952243b1ad8d735fee72e66cb8d69f8c942dd4b551acc8c88a6eec039e7dc5749c24a5fb888d9048cb398c130c4b637b9a3e333df740546ddd11ff99b2cd83c189c5027b1dd27a58b9c6358125a65d1715a879c6a305a186ee4062e2bf9fc1a428dbe001b02997eb5111eb85549aa1d6054cf1cef242712c0e37ae92019050ff4f04e04f92ca6ca0cf2cab83d311956b0ce4b49b6387d89edb94ecb92634727803f9630221b15d57b8556bd1da20cd32bf081cd20beba67c476b4d59679d4c4332aac5fe37180b87ce9d3e98600478a43f4060c00629149abbee4ef2ab287a98ca13e79073938491294f060d777a20c99dc98ff7a19aae8672518d37cda4602f44e908b2c761cdf09101a5194c1d1202adb2364ea7dfa4fbc7a444e5d22f1f0d44cb333fb9b0b244f00fe5bac649963a11b0e36c060f13fca4c0a91b9ab0764ec66de56b3842085486b4e96dbb98a97c4c188c5309075e84791c6b4be177a053d806be1611b407911391a366b307d771b9ea3a33d5719d19ee95b791be4febfa21ff8765090b236271c46b25016ab1b64e3d9abd07ab74b56996a8271e138b6439a884672e7fdc463d9eca7ab8d606ab5593284e4aaf6ef6133b34f31cb5a69e4917d05b49c1b03443f50ec2dc24a3dad77569db3f65fe022b22aeefc5937751c28bb8ea4f339acb633eb73e23af0ad3e71ffa96369d1b12367421aac11f986e0af748386e469718dce3b9e86682c4c6beb0bb450eafa689fac3f8dae6c3a412e6dd3dbf75a638ac94a246f155142d5cf3f1209c2bf7b01fd13390e40b5430401ab6b8796e9e0ca31c58f1d2fe6008f3fe4385e3f75e01432bdc0f37e7deac6e6f58cff6e6fc5efe99ad7f65accfab2dc75727c34ecc35a3cee474a65e1017ee2ded1bb8b01580773bc0305830ae6afbf708d6ba966bd8b29cbb4fbf703cb03db487fb9af5fa8aeee5953aad307db91884f1964c728a6f1c669dbb487bb2f142674078b25f9ad2d4aca23c64849dbc9eaf02b4868d85b792389bf4d654d676a8661cd9c6351d5d5328b25b8935ed8cf05ecce0e32e7f640e0e8fe97e1127adb4f8d31368186f72fa57744d7ff17ec612bc375d0e94d0f73738eb8d924a56ee1a260242f8ff773430e2a6c58970c65e0ed1f5588d8f9140de578e16b8b86d569aa870e9ab41ea79e413db3df8152650f50bcf33774e7847bdd0ef9fbb6615f8766d61a69b9fb4e40f5587dc6d627ba44df9ad76370ad81591eab708bac55535e85f2536367ed08e22ef7bbbb2a667c6fff88bc66c90b1aa1a961d300f0fbbb75808", "51ac63005200515365", 0, -714958258, 1537743641, "f8f1d3dd1317271c8bcd7d33fdde262476701d336f29bfd51f43c7c77d5f2041"], + ["b3704a16040a69c5662d0ed6df28a3f4b4dc90ab3b44f6a78adb9d9b90909e3fe05063f11b0100000009630065656300ac636affffffffc458b0e67c152d03703e9ef7c021728ab55fa59cd3e538effb8d1e9b76760bc70100000002635337448636c2121e2a0a4343c4e116a5b1db5e29aa79fcbe9309821caf2b5891827d5615790100000004516a5265cacf5458d1385dc0e493e5c13735a26d44cce94ca29d9af0f3af3b1d97d015da90b1840a020000000763535165536a6affffffff022a09830300000000035251659c850d0300000000016a0000000000", "6a635363", 2, -151433051, 1537743641, "d3e16af00325ce3868e65cf8495fd598f3266234f46f0260262a8bfc089ac13a"], + ["91cfab7003256dde824c5ba3f6216f6f7a6deb8f8d8371b56fda0180194a4aa7d510d8ab4b0000000004525253acffffffffc5cd13fcecd10f8c4509942b14477d0428ecaf43a4b530bcba1ec89fde616d02000000000351636ae45d15356d28c3fed6a8de46864862b4355dbcbb0fd2e81d465ac6286bfcce6c3b93661f030000000551516aac51fd481ceb01be8651040000000004536a0000000000000100000000000000000014f30500000000137f2d2f958166d21f1fef7bac79305bc366fcba6adb0070d900e76774f82c5f80113f24c396ab473564ab7e822872fdf824caf8e62a8c3fd51dbdc8e75116b0dbadc0005fbfac40474e09e4d783ea31989f27ef1f2f47c98e8cedb8e77ec43900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a597265dfde112e9e51c251c679c39657d9be2b5155dcd587c5c9437baf9730e938dace07350a87d26f4a41bc8feb908060edcc6128c7328aad6d8133930077e09b706f403db2eeef56d15eac3fe0f4332769a317282bd1e113695ff371553d3626a65355343dc953b4e557d1d5dbdb2343ef496c98e09784d3460d0dcd9fedc022980f6d491efcf26e99c4011e2e5d52a0fcbc469747ff14a2bb67e818d815c3c021e0246a83cdfcce4bb76286ac5561baef9ded55bc27f8c0da0a92b0a5cc6664e0a08db4559b74a0fc5ba9c223cc021ca368633bb66b41a3a67e1ff0024faae20bdfd80a22bf12ce1cc8719919e223a3e8696632bba09e68b45d5b681d648cc492f032efa29a39a1a544d35a18ed2df63af53163cbccbe03b19390ef40ff4d1eccbfc03278884bffb664abb6482323bc6add07fc3bc99515984007ae33f462d88c9e478031e570118717f43cadde900906500cbf0e1a01d452e4dd55104cbcff0e8d25c6e02070646cdf54a36a9e9806ababdce63da27f9665c69e5bb146c188dff4c6c131f030c69ff9a71a200dc1807405aa1f3affb7330b6957864457bf07c7f71f32c052bd0a770e3a607921957e01c77c0d0a4b8acde6fae4e28c143da658470d77c1128ca7c228373d66924a8ac104d406b2fc96684938d48ad0d755e6f99bb5a27b719ff6a3fe5531b159dfcb365ef2de4f0ffa0c77d82d147cb99d60e42f0d9df4dc5e3bbdf255847972a0f12018b13c5904479a803f2403082ac9ee3d851420c966b6636b51ead92885b06f371cf67e4960716f1a0c9b86b0ff44e0007196963887bda658e18ee5f2875e06c6a6d23ebe1a9c6ffee52456c5fa850bfdd5d70657ee77cbfd2a75e3d5da951b6fa2835322243585934c8ec1d3d8c03d8fe26ee31f38ac92cd2fda8b2c795ac8084bcb733962ac11839af1ca919d6e6a52384165b11779273d072c92cfc7fe9441b2d4b0833e90dbaa81926b5ba243d83d53abdd6f01ab498d69b113b738f79f603db5dc9bbeef8b39dab200080eed3a2f3f52c16d1df81006b2035e7a0ed1b9920054347893ef63f410206e611de2f4e5ec700c4164c10d1692802f60d3a5c59ee9003ea40cc635d60f4b0d86adee6c50dfca02b59bddeedd9d020be3942454c77b71e92945286b79cf0c18043094d4b47c5161eba0bd1d5a8de811ece3bd18ee486fce21b960c157f690ad759efbdfdd31ce89394aa79737e50d62c98de9f951b41f7987eeb53acd52ff69f4bae7caa6eb2765bbafd51216fd45f67f9c265de446acf5bf8f37f0d1a05ed9e1c55eb327aeda164da4e6c72a8c05dcf6b1465e0e54a915a84ff2afcced3dca5ee4ec02a44256fcda6afbf2892df555eb14348b8016eba2a2bde171c73101b7fe4e344708b5c07b706a34317af7876b4eeff5596875e9aa98bec31b937fd5e500b6b454eb8059b0cd50b40cef1de8ba2e8a11925920466566e51a88bbab1878db423a910653a844e5e145349f458c2bbaf7b2ce74f71c922e755e3089e8b524006038e2e30f0d1b8b32f21e2dcf847254078ec9563660e83f25194e81b14cc91133d70022abe8e90d521f9b4cef4dd826d5b2046429bd2d25b6707d512f189f288032d379252dda433212a3994f397292371660d6a842ac3e07a4d171d341ea55e5e99dd4f67b49bb72bcb92e4dc5d2433781f93a343a1df616156bf99d4875c5f087c1e911f6a6f0974bc1b2fc48e28e7dfe9510cea86f2c9f756eafd2de033b113deed237f10dc04a5766071b1f131c7bfff2a645793a7eb0976cbe2ea1ae70ec235638f5a77493fb24acc73452f38d6e23adbd2a5e801db08f8a10812f03b964af1656f4b247dd3a4ca3d27832cdf887ecf088ac47240e0e12dcf9ad10429cabfeb263191849747394fa0ce050d3aa68fe9750c974c5496e58f0652e392aee87cdcd5faf1ac33aebd991a02601de9bb609841dcd7c59cfc5c12dbc915fada9db8bb8e97c4ae1cb386433a26ae8b67fc562b5029bcf0f0fbc425d76174baf3383e4d64642d8661293605f178bc363d3237cda9729d2eb50920bdf917cc28d1ce09ea5a0c8aff74aa6c21537af44c62356311c64fdc285fde89629c9a13edd2a15dff65786bc87bb582d490f0047561b07a319f21aac58e045e0f8509473cd40ec7ae8acb75f8575633c86732e7ced2b62cf775f1172aa4443736e5cfbb612db9ca92473261dd685faa254ed81d86585109777573f63eb225c0a2feaff4c4da78c3e0649790e0a0dbc5540efa4c4d81e4eb77ddf5d824e19273adbf2ca490aa0cc17210ebe1dd941810bb2dd0c61d9c387de9933082e94d166b5c6b3bf1974f03f9a71401f92265d8fd68cae6b35c1e073e59e05dc7640189cfc7df8d92ea2cc6e6d56f1109e0e479e1062e2d44df41f58db74e463a8854ce95400a", "6a5251ac53", 1, 1019001714, 0, "e836787bc5ff28892b4d83b8b24cb6bf6cfcb60e5cf7b56fbbfa03b36b422ad7"], + ["8e02f857045a93c447ac6a0e684ec1eac9dc8c275820d9c840632ed64b9a3cc1848c9a020500000000086a63650063525363ffffffff66822ee3065c573ec75f58a6d51647d4b7696297c18814075616f17477bfc58301000000076a006a5351510003a25fd0681c8b1a3a34b7f58ef5822c8979526708603406035b4ae933ba399b6af9664a0300000003516351ffffffff57f01abbcf9efb6a7b85326165a29a624b2439c77056b704911e650ac1db14ee03000000096a65526352ac656565ed6422180481021d000000000007525365536563535a814b0300000000066a52ac5163510788de0100000000066a006a5352ace4067f040000000009ac536a5251536a00650000000000", "", 3, 1941426068, 1537743641, "31d1c50bc4f9d33ab112144d4ebd80c215bb3c742f6aba2ed6c774811c6b9fc4"], + ["9fd9aa41047659338d822e852e7f581667cfc98f6e4e00ec880ee9543b25fbb1828fe022be02000000046a5263639f35f8e419a4ea62d97662f6ce17a409c4c5f77bb4db66436e134d554e11f133a89b3b13000000000900ac006a6a6aac63acffffffff4bcfaef8c5e1f00e07d494b5c6c94b35cd98da4b3b4a67bafac9299b399b91a2010000000965656a63ac65525153381704a1a4270ac342201c71bf9420a73427aeb9bd8b50cfeaec9c1bdf18aad2907761600100000008ac516a6aac00516a7260f84802a359fc03000000000463510052e54680010000000005516a6a6a510000000001bd28c30300000000000000000000000063650ece4445baa2a2f4a16b1d7fe008d7997dfea432e06cfabbaf848da7d3502e97a2cf753a75e3e34192ae329f891846b3f29e404c6a89088904f9e35c5f2df91dd74f2ea0d91d331cba1d978de3e1e3b79c837e9503d742f7a1b37c90f1c70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019ff89bd56ad3b0d3d4edd5dc40a4c424c18023dc6181c64c26a0620d9ad930b62ab7dbab4fd586e4aec9658de2b73d44d3a986e51e859f52ee981a61ea93a8b12f8572adf0192d74298924f29c0d87e5fd9d7064c8e60b657887e609e214f4ff2550d0f9fb8ca6a5254636bdad350dd486d6ebf6019b07b5569c4d4895018280209de7c323103973e039318b9aaa4a257c8b0e57f224fd02c38f4ee4ae0b5260b02151027a90b66ae0c7618d4775ae0c83497843ad2d3d050be42960d8ffe5f0fad0a044450c420cab583b9099b9ca269369b9d2735679b4eaaa4ab43900d17b01bd5980534f764a5b51d75df1c2e976acebd3d750d790fb4eea43f674fb88b433a0802227f3c59f147581741b873fa0a6fee208849570ed3726b2876d622b1e2300d8c02256f79f9d9ac9f41e366878ccbf2fa023a22d38df71c734ab15bc305f756822203027b598772e68c5b3c4f92f879f758c206e887c46dff08a2b2b11591749aa51f021c39c3ac35ff2c6a2ff2ee1857267f5ebe51b4037ccce2ed1532826dd7e25e4a0221b77ff26255a022edb59f86a95fea9edb06bb077cf005e3f76aaf86c04cfae05a38a30c11ac1dddc6d0c14e4e5013dd9cb7ff46acb6a3384882bdca63b490282541a03f12786fcfaab84befb157dcc5a8d5b5fc8768d4f0bf54e7f49e04dac0f4117c3b93d1927e47d80700313aac9efd4de3356946bf70eb9b209a9fb3823a26cec5544847ac2df4421f9b5235d888542bcbfb8430b4e099659864ec2f9332467099b021b387ae6c84928284744cb5ec9e0bfe09053db31cca857b5dc6f4d6fd8b2d16a2bf3c0debd72d5af9fceff726b95622f0d7b10bb0a27f70269d64f1b461b4e22469b2ddec122c77f9ec2c8fad0406f702b69f4d60f86864711bf336327cb468b729e960bef4c72f68d7e3c97ea774a8271465bdb70d0853410d865c5707567331179d6c550d18c5ecb76810915f4a26522d41a15aa322535c44e1635b2e3047c68b04b5118e4ce7e1c876f15268948372a1faad24854aceca40c74f1794508a9645e4f0764f48af58f8f953df1dbaccc8d7f630bae74185414a3f706e05c812ec6a0eac6200634cadea13c14fa3f0c2447798db5f9a8cbad29706534747327dee3d21abbeba002c9b59310990bbfc6a27fef720d8a72c5ad0d7b9c567bf2f14f89aa92c3264e0e534b9ecc2f88ffd0fc6c3355b1164a6648c19bb17aa0227ee160a77500477044275c0c868a0aae017b51786fef736964ec2ead60cb245daed3ba9bd63a86902645d375583838543594938aa07d90a622b2ef12f56c2ad359be4bb27ed3fc33f68039e183af5f46eaa98e632f64ceff9b6f62e8f731b42eef05876be2c5ae0558ae8f2b93d2b50cc4ccff5d1aa59d3fcd02bc3d9248b22706abecb4e181f256e611c0dd50a11692248f81f5d78e21e36f4b6bb5df447c0e5aaaaec05e9dd2479759b716c78e73da917ef6016d00f3744fc8ede58162c9dd0fde786c07695ecdb03f65beebc21f2b0843b07a35ffae76b95d81cde133f8c076a86c79c1dc8aee00d783767bcc44a18d759a25035bf4683567407aca6e9794aedfc97dc1b36c5f7bc09f524b1f22e5d6b30262a4c19a0086f900e20aa85a31e069338e3b53210e5dab647809d25a15bdc919c7b0a9b3b4ecf586460e176c021c1f80ea1f3c31615497afb40da9874b622ec7b40d88fea3bf7398278ba5f2de533a62ab5a44013c3ecf754775276c15f06fd39a1f532253fff1f2b432d7b51e94657070b26a7d54fb71636d1ac0f0368cd28b27176fbe0cbe7536ef9ecad256e99007cadee3d31fdf675424f0f1d9e82d16a14ea9d9ca6e887495e40eb00ee7dcfe926a27aec9930ac7aa1b14d8e7899a605550f0fb9640c1ad637943e025a72e458716266b55036300256b458caa3c29343446b47404bc156bd8480aa6867e2be45714ecf52b8e95b14aa1ef3504decfbcdee4aa7f591eaf89648c65a23e83f84c27a870ef7857733b1327743ccd56827f9b0a156d2c2970b7f6e8bd9b16f896cc92beb2e3d8db27e1b15ed1ef0f25716566e91f8d81983a364c69b6e6d58a64e5331647c661ae076df5f42116780c3d7515be0fb50918dc5a12e36a44f35c74718c6207804d991c4e3210458749fa26b402b39a11184dd03da7c75cd54dac657c1a4cbf92e6e2cff36d720b032c4ed9206a930eb7513c5e6772fb83f0472a5ac9288a358877493ff3f0970d24db7367e6917d9cf2da54351880105e74406c5b49fb8febe6308a2764034b1a4d919df195381c649951320f633621fb92e9dee69f158262896a8966886a46b02c67ccc7564122b08999707113ad0ec8111dc5b0ddda3428fc2a2ab874bad4c2b44574495bd25d1df4b51517cc2679f987f925fd9f1bc86170b12e4fa48af73a7d707", "6a63ac5163", 2, -1688082806, 1537743641, "fb2682c5389be24440a386b2679784cd14165892b4cda18eae247ddc6cd71bd2"], + ["18c9e76001eba1611efce92c9fd1aad14d87115a6676a85d982010a65e8505b7e826f0019e0000000005acacac6551ffffffff04b3690300000000000263ac90de85000000000004636a5100d6c90401000000000451636551dd18660100000000086a00516a005352ac00000000020000000000000000b7ebc201000000002df2a313e7f10023c0a454a7feb9f10ed3a21978632ee9f3b9d11f4ae39c7712eb0e629b0c773ccf54248e9e9b80a1c6945e44db42bd28ace75ab96318adfb8c495759ce37b41f1899a9fc1a0e9f3aba1145cc9f4a27a0820979ff7c19e26a5c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ba109cca7c61e3f1f269d504f12c882a33a85be8225a67902baaf2590648d745d2e86e78a7b186a4b1f9f3360a1ab71ae5a903ffe39377f7a0fa922a7a81d6d53ec01ac3b81926d66118348061adb25733a292f4587314afcec831760fa64a1d5ffc9a586848eeae4212ab30561929c7e1bac88908015a039d2b28c83b249b00227731fa97e62efb16620f3107216f31bfc6a6d386e713d1a88ec907096f50ea7021c05bd0f021c3d6700688fd642ae45009a86d38a8c1f162440962294d7554bdd0a090bec766b4900b0e5432b001d208cbcb709c2ce4d0c43d865b3ddbff801b35713209c3b357179aa99203b01833e5055ef267bf3676cb2830bbf39882a557b6b0205063a3edd7c0117f86a0c11ad39414b62ad73776bad0a176bc33b93c2ca2243022560e588227cd2d62a4d1668543c7b5ccc9b269ab8ffd40c5e00257004252b5f0323f3c29e55a2e87c5825038b2694e174a81bb6f9e10030cbb533571f2d4c6b0003239f65a22e658b06f65656521a804e7bffcf4266174321de6de241fd5a8ddc5403118eb8a39c8e0b4a97252fdda4639a5e952693aeb6cb3ff3729a4e75c357e13b69ef05b47a4999db6b3be2ba2f6f099ee37e20296a64269444af273a778dfdd5d3de115e01e1b655772b28e90c2e5ea34716651412c8a5fa88859778cf1949b466f5bd02338a7bdefefb221ad1b97636f234a30b939596fe864e46d8dbcab95b615f5c3b26551ca6770cb0dcd4eb976b5419d50209460f05fb881cf2af7f8b51aba9f1c09ea3b2bf58aecfc86ccff8ecbc06a501017a58159efc0675bd27fa7c41bbee234c99362300cf75d4da4d7ed2725af286eedb1adf63a06f18767924ee0f2151fbbe75df071e79b1aaec5aaa96a50cdfffba18cdd8e457fe052431c3111ba26b4e38b826c765fa82e15779af6ea727575edf18f07feeb0b00e2d04af90ae97fedd191518c262988c96898215c55397359de85ad65bf0a6ea58c986f382e0482876ba5b13bff26763bdf54e9d0715e49b1cdec6ace3ceb6f8665323cd75177bdd267dce30d715fefacd5690e5c99e1c3f34e2e3745d4de41b6a4c160f66355b2628471420ca18ab79798cb3a20632e1aea208b1fcc049f165f0f895ab60c44aa950b4b98e5ca39e340511eff2593f8e2a3f30979ee5aa7440f3723a7b0a2dbd6ab4720ebb396d28257a57022e9bd7eab986bc89cd31b36161ea856dfecf2a05977e57bbfb7e8b50e5116fe7aec5254b106d2f69570a79749d2db4505a70a9ea0b5185a6861027b1bb4e05c84e60b7d7e0b69775ce98b6a13e2c36e00c3a1d90665cd2ed4ae07c2cf5b765491e9276dad4e4ddb0c2279547dd5ecc0a9f49d937f28f8813bcd6e55d166a48886b19a13dbb681763561db67df7ed18bad2d103079b274da0df1a0858bc61ed0562d67045e9d07c4c41ec7ca667070541511f0d83cd4cb786c01a1b666a31f26133662f8bf9495f6019b0fdeac8da0f39e5a7d3f7250fcc50f4c5e16f7648766965850cbc247eff9165180002251ddcb2aa5da70d6a42cf76d538df8be2a429e4e999fe580ee8b965df25c7b44d062a538cf13c8951bec8c365173dad40602f807a452c44401663bcb1a2091c3036fe5854a35b0e324b3b941d6d6f10b275e32394f1352b3fbf3009b1e77055717ac302f1c0ffc7eb035b38c7b3537ab5aca0a878127254ce8a50ac663966f1bb0d38467d341ead5d732f23cfacc62b119afbf14f0521f793d505f9a1aec1a64368d757102b100e7731c54333932f21abc76f603b4842f3511957e4d192d5adc56eab1205ab4446e81e07de9a0d8c7ef5d9b101b9e8ab762a2814b8fd16dae8b23e1a725f289aeff1f075d87ff61ee87b4b60f8a16007d9d103814df0690650ef6dead94b659cf32bfbeac8056bbbad9e4a3189ec7e757029421a5275749463274d388315f066b1d7846889c024632b8fcc6c1e17d411e6e48eb605a4e04f78dfc072ab884d828e6d7c83aae4088d31957955808c1ed19a2fe1a717f88cbd8ef5f59f958a582419e5d9ea513f3b0a3e659bd755b0a57efe785688ffb2a9e139b8abfbd7f759376e356341f9efee0b874c01ed70d9ca48022a1f532d5f7cbdfd57fe98cd40642893cbda1a9f1d7ac64a4b56552c40dd29e15e3b5550a2ea7e08da86b40bcc6c9786fe5ee0d2103cd55e556318fc04b8bfdd20786ed6753d5650457fadad6719ba2771f06247294fee46c9c8832a4f89716eae6d3c9eb7dd7991385d099066e75eae941d27d26e8adf4525d832dbd7a0d71a0000000000000000580521040000000080585dec1cde34d45fb3d9987885a0bfea94ef919451d117256899ead7bea210823fb0e87a3f65ac465c57a1ad7a784ffd7ecdefb203fcc72091c557f155b278e9359833979f36e553865022e4b0d284ee7e3b4b1a945748f98e582a471db263000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b0ff95baa3af710f430e416d188a0d833545e30b8e7823a8e5a0867b5bc3a35e1f6ace5dcbfc65cba05da354e8ded3cfc4a0856da0564e80b2c81670a2e68a3135f9cbf82fbed7260b9c8b443f2c51a3dd161a781e23e517338fa67ab83b0870ff1aa7f02e5348eb7d78322eb79940def930b4bab729a6543082ce873eb75230319f1bfd47f3a9d6c970a2080fbb6f206dd43427203bc77e3bf0d95e551eabce60225a15ef39020d274d5a3725073be8e1a8edb0d726302f326fcd123cef3fcf65c0a00f92b6b9a47e8047922a490f4246622e3b65845f51497a3d2ae7c3420b1e5552556265d048088912b5e82abcad74229c6ab44adcd1a0813159dfff1b0cc50b2021545d872893b7a1607e54c00899a787ab7fb207bff9752bcd3c34bd6bd25fcdf03106d5480124035d26bb125ac3547b478193b8814c2081d2e2d05782e732a45df031f85256a350c1cc88de80870c9450786ba38d78d5207b94f8d754be005df7ef40219eb8dc6a45ba85b69a95bd7be43e93c3485c95547809ba49c6681cd33a29ad2022628e9bdfbafecbec07487dfb9093e535505276f057cc498e68706734d3132f22570b97819d5a8ed0d5b7c0dc5f38cb773957356449c8c553cacbc62c4cb1f24b150bf6c9cdf17089685a23a34e569442385ee41ac5439ed52aaaa9aa4e744d7f54b5d30d2fb5c01f12fa181bee5c7dac32f2f6f9b824ed73074a55f6b831f2ea61c9b99761aa179f453bec9cbf72ed5f9d44ad12081a0c53f866dcfff6b62cd334f122647b3946b087784aca588a268e35ecd277af6e8db0ef66374e42a87ea45a05c7d8c5a43fc779c43829aac21b35e8b694f2280de77117883ae89364c0a7fa00b94dd905abb97500973fb5374a8df1f3e271dfb5b34fc8f5e0845fe1d3474cbd1d196d5ad0b8996d8fb149d4f9130d3931a5b4b91d24b2e5b4217110a0ea8e4b00d16e866a7bedeccc325873f6f28822e9f1c2bf8a39ba4823896f7e241a7972748c0c264966d92de07b5be2c36b4962ff052d85305447984467ac904fdc44752808eb57d8820cee57ba46b5fd79d48cc96854eafe259db8d8bab21b0412af66750deaf4018280aad9bbfd296b466cec89ca093de0305683e76899aa7ce13507e480fdcdc525f46fee5ab4f609a4e76802143d152ceba5194ca5cc439b1944254beb381b3640fa7348cfeba5afceb86f9ad396631984ca9825cf53313291aeb0797df42558e8605f081e7f6bb2c77d1168cf4d9c2763aa9601aa70315fe27a4fcff7805d813dea5c903aae86f2c340f3ccb009618af27f39cf92964256bf890604dc2a27daa57f61c84ad84f35323cc04f83568f1b6935c9e00017a11fbc907847824d7234ad08f5e6cf9e3ce31585a1dea70f0729bcfcedb1779eaacf9c7d1200bdd23534c773473ed559057d377580289e758d6c84054eed30b0c8973a0b2faaf9d28d7f67d6e7c19e64cf19880088fd898da0f42b124111ee831b24e160b4ab66bce2c8ad97cd05d10da26cb67031d23728088d84dbc712ea1ed1503a93fa928e2b32cd3b814de4a975a06b98f4481afaed546ba8ae8d6be7e8b6966b09cbe7020fe65e0ac1109258adebfbd66037207086107d48816b5e6da1db9ee9e7127374d8e8e831f0c4a67f8b7160662d0f741b9210d61c7b191810f78cc64420c20db87fc713b7cc836f81d7699a87361ba22754271560ede23e1ab57fe812ce36475013b6a882466de8e90a4e2971ef8fe74b4bc61e234569f81d0f6ef05292524a0b5d2977b60b0b3be7e4bc77da03d97c600ed60fffe45007e395d8e4dfb1f7cfda467d2a892f051f64f7685d30006b2ebf48282541bfe141438e22c03524b6b74ad0b94de471287b0091fe8895bd9c3e7311bca5d76ffe15dcd1f029e1e4591c927b4423fb5fd62d8457e38e67d782cf2ceb3597f11c1b327d5eb052e58eccea1babc19309d421f0685070271de5c51999c87164dfb751b45792a3535a1f01e42c7c053822b3ea5872374ef62e15847c4c568d1939622e518c42f4b06de1c3c0f56336737a27205ec251d92f14f6dcfdddfd8866ba02fac6722378d1be54fc698e2b1f6ba4fdce5f5dcf6a5e2a78a5f4d561b845078587470ad50dc303763440045e30edaa90f0d50c4d0e0edcd4a2e271ee9696d0623a000b5056dae69d810ec52132e8dcfd754f71786944751ac5671f97f71ac00ad69b21e0b5d32932de69cb5d9a0e937d8ad8fea4b05dfe828683f0d102bf173e8b52d28a79d89118c99c0b70b3dd3e136fffe73457406e84dd76f2c60de5c6225313653fd156a556a696ef253b2f6ebde1b1e07fc0c4daa241d06d8991be789f5e59fad606a3c0263a302f41037b5143e119a0fbc9d8d814b54cbb7f43dfafcbf56455e95e811c3073d9e8d62ad56a0ef0d3fc644922ad907", "", 0, -870437408, 0, "0a7b28d3ffaaeba96d2fc41128a9296aedc4142e8e8733d45a9f0b24d8684bb4"], + ["030000807082c40303a7d7a973cc78661fddf6e34a192dd866854a14cc5597095428957b15fa53ff030200000008650053ac6565ac6affffffff0f14dd16f5f11a1e3aeef65be0bdc3c4b2470aad3c9ee2472f2aca55ff56f53503000000096a53ac00ac636a5165d746d46b1af61453c08c83524842826218055cf99810e4b38243d890df8fb0ae796726d80000000000ffffffff044c76ac0500000000046a516a52e2f3b802000000000100c4807b030000000000408e5b040000000004526aac00000000000b3109810100000000000000000e758e0300000000a050037b6a85aac738c4d81e82b72bd3a233aabd870cadeb6cb8f7556ed03c491e399f2e76bc869b1241829f1224ff843b2f8bc4b489d70960ed1e44d4044bcf9eb5172071c4901f041c6195aa6c2ab9d6b262c99943ec5d8a37383466e3dc7400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b3567c5aa41a564f409c348474ca85502213b2983d2de3e932ad366582a281a6c8996943d987c1472e52b453376b54f4033713b3a84fb57ecf336516bf6a7789554bd8910e0b735073b44e10fa1cd134f6e69e0afefd8d3d04501f7643c6e356bd487ab09094395516f2e89e4b46877651c034577ac5ac90a753aeaca793466e032ec1d525073e8fdf5be82434b10455ded1532fbea8e731f256fbf1aa63a951e3032b62dc4ddd43ede4c6401e25ca654963b8d138ed055d173d6326fb77872e74400b072dfe3c5bc5484a22465054f34c82591af8e7364503243aa145acfeb27b5362d2acbb31227af47e41d97455f5e06f288c89d7204ead8020a401d14703b66baf02196a1051605aaf57a2bdc26468c394e0acd3c91d6a9b622a5da87fea25841f8e02228d4cd6d7deeed5e802c82d5a26a241b91030e9c45572637ed317a4bc6074aa0304a0a7fae4d92c5261eaf05e91f9d7230129944f176a12255885a8af8c534d670223e0f9b98193cf241a8f8b4b6d6a42ba6b3a92eae80b7ac5bfbb159856dfdab303300afe6d9bceaca0910ffd597624e17f0252ffc049922bd6090a6fba31c0bfdc2bc3194e5ab9637efdaf8ba5b27c5076903321c0420e87eb048cfe68bc925bcc720d80086a6e271b345f88342726c77c9c97e98150d6d9c08ef184286d7a23b27550b8ea906360008a9458baecfbee81c98e54e97d5113acd76d027671ab5d8a93ebbd45156e3833a24a376e55611b54ede77ba191fdd97cb476e9687d732843f63314aa72954233ed7c98e577427e2ee6c368f9696111248109539af40f084c69eacce81c777baca51e71a5de13fed894e185509b62f89501a4fb8e2e5dda821acc0dac963f5ec22fb6821a0726070f38be4a6dd16389833f1369108d4ef2543b6a08bb200ee91e2a2ec72b31313244917935d5ee7f9b7c7cee3026f0c4ccc6851ad85e6f5fe878de6a8d11b0d873c0d8d98834d7b9fc529abff58f3dbafa9c3c399494dc0fa30d8e577700e9f241fb9dbefc4bf9f58fe5f41e0055cffa309c1d3361d486f4ada5bf50cd3dde9b20591a268577020d4b435170f628ef28424d8cf9cd25171cb218be21b076cb7f3a7d5dcef3d86be6cde9dbed706f878be65688c2715fc6ad46b2af7e4ac67e0b10db8f7c97e96398e4eabbf12fb0155984738df3401209ce321ac35904d757b7c70e0c701ce80a14d5baf3f75505361936803ef8e3539eebdf1f2e251ac085c2fb41908b477419adc74744974b0f41f45eeff9560da06e0a44a74a0720f30ee4a32dbf0f7037c4a6d79233f8881b4323fea2c9cfb8a2c41dfce4282028252123977cee5fc6690ee105fd8605e2289ccd369d77fe831449d41d409fb121e9d8e6dd7198f710069acdd735e903c2c12d1ce8429d11436d1dfcc34f7810bf3bdf5ecb25af7f50330c26d6b31a985cc60b05aca8500167a103b43569bdcb0fd2b6ad24f845aae9d6328043fe27019791cdc434046dd3ce1e3e798b8cb91d6eb188447193ed58aed8d5c3a0f0e3097a493baf24a87f5d6252a32781dfed376d5965f0336bba3bab8fd62a9a542972d93998e09056520c670b375567065303ad3e8bcc6ee40b448c6d554d032c8ce3485485f52aa7662c1022160d928e41d1162d9fb6882e4f77886b28531f2d6889c330d6abc3ed26e4a1c51d0c6f37b6ba24dcb3a563f375abf6430f6801de1b28b0bbbacd2ef47917151c4ffbd186aff8a83524e48ed12f586f67e880394dac93a1818562b2bc7d8e15a3b3908e862a5783781f66d3645b6c31f255d9d919ac77613613e68f0ec35d42b344a1f0a2508472177453507e2a77ca94bb004b610b2cf0a37f7c140cb8489acdc146096b5018abed82b1a0e861a7a1e12c49cd69993807644cc67105cc085754a7e571fc84101a9898f84e53bbd0c198df5d61700a92329bba145fd425752956ff4565f38eaf51a03c39830b7ffda68bce48b016e22ddca326627ea4f13c3f64df298996a22d2fe2d71c6ef73240c2e97b1a6bc0a79de95cb0d54af0a48c53f0a19f49c98b36312e547a67e78a97053a0ccf68c440132d120c607b91a50a8079061a01c3576166c9081e385c5d0991822664240c64e13d518d30d4ddeacea4b6b93924c8303c776322f54e27f90ec8525340790d5ca0b2a101fde60af52b3378f807b473b80ac0ea49bb78cc8d796e8b97588efe2ec2854964a139a697f326d5b5490fde6a72621cca08e7a988fa5691b78cb2150253778f741db384bf9d86f56fc8746c77ef29b001a0fd409a2920317bcb5bd57924008b1face314da9a111c98068630c1f76f2a63e9a1a9c246a01e3456359d5a609199f252ca5481606423c3d81af8d22ac24a4bfbb5d2587b7276df3661d9e1a21df84b9f48e83f1cb6fcd4921c471b5fa33cfcbc5e37bc06", "656500635265ac63", 2, 1899969149, 0, "0dc177a37dec5bf20979d01a7662513f1c8ddfb06122a18b1320c4ae834fb09d"], + ["030000807082c403035ad8e68d9eea428655adcdeece176d5610b95ac0c144c71ad126b13940e008970300000000ffffffffdea80599aa8b726c5d641282c77870288d53800aefc693cea04690ccae9282bb0000000003636352ffffffffde0555789c468e8d6278975126e505a6a56b2234a10227c3144c98827bc149fc010000000665515265ac522b2b66fa04659c2b020000000007510051636551531509120500000000040051516a1ab05c02000000000151d966a803000000000500655251ac8748249c0000000003c071f001000000000000000000000000c3588b95c920c339b251320ee0329002d43e8029bc550ddcbd2c12b0c6f39384842df08c2fdcd6a6805e6b44af1dbe0a19a483d5075e5bdc2737c8269bd4e981eff468fdccc2aae8bef6035f400f5ee1b564d20550b2f5719ff49c368dd068b700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1119cd4e24679c5f81cb2bb4e78400f9d823fd81eb650db7fb915e2027360c8c448e95e7c364c1d4a41ca5209c81f364e59d3f656b26ecb8a058c66547902a799e4ea2e60cd79aa4cc42a3fcc747336d9b6e9a90dd6539d4901839e9b8e2d9fb3a0795f10ddcf9d2a91b22ce2118cd0232345f95ad86f60ff66a47ad38b1dff030d0216dc15b809405056e4a1ba2f03d17e11eb9fe3705769fabe90ce612fa74f021b5b1d95e10481b26e33666a6b5a7dd6d16e99cfed52364266bc6a5d4d8aa6890b0651b66834c9bc81425703b794f33d0b48bed49bfb732f95fd4f51f246f2105f39f92af6e9e0948b65d58e6a78f780cb90003a56fd9fddbcaf716d83998ab1ae0319df2ca9f0c3ee14b5b138c1988145a206aad00a93deb2c9e967a82bbdc27c98020af82ffb667798ecca12eafb82ac4c54532004848e7b78795949a03c6684ee2c032f64ce9a2add431d13504bc550dfd578255f934cd70878f82dab4d8ff4a12f900221a0f766de3cbb14f9d89453478e7055b9e717489e9cd72894bec73491dc3df8021196eb5acb810b32c5de84f546c072716ba54bc963589423c41699e794e50bc53b46ff4e5e67c761056dcd0dc5f8e3815e0b8b9be8fae44008b2fada95ab5e3e701acd5bbd71372272af32498d2b6bf202407fa11d0d5dd739a9be917cd4a9fd17799059b356c10034ca0beab4b76d12e0a731cfa01a587a43ed2db143520ad3246e1ee770b58956ae322a3a36481f841fd5102d7950fe135a0ebec465e26efefbc242d9ff3b643447aaebc7290b919b7f5b7742d9192e42db88c8e28b98dd9d8cc75f8eb8c03d83065ef640d542e8da944b7bb25c2d60554ded6611e1e40f6dd6e44052a0c9d9e5ee0677433f55f3add654c501a9277607f3f158233c006615a4f35b8aedc3e84f8afce5b3cd214ee239fb396a305bac936b3c6a7bcfeccbcc2ad7e7cfe27c348e0cc7fe73ba100bd978658d49fc083ef498aa6bb9dcf1ec5aa2b91b6fb3b0235da0d7a68a62b27bd3a0cbbbadceaaf4d3cb1ea892fda8558ec016526542598499fe291f0eb3167c74edf41564c2b907e9b22fb91c72c9885d72612e64396843fdaa27fccedfc04ba092c819996a27deb209811f6ba20ea1508532cf6188f8031f228bc8d5175820494efbcad4d14b09f35a69f91de51da017c68900f02b4139d037b8c87cf16ef8067aebd3415cd481ac980b18dd01113ea322d860db334f12c7c8958ed35d04629d53e4b1fa5e3e4518ac15284baccde1b6b44776638b2359343235b452840b0a1f4067ba64706d51f179f078e1c1698610c51ff8e6b52ee3c8b3669d7138ad2b42c1f7ee106f715ce2ef55e80a8a18462674bd7cd5ea2cc85d40fd3a38b0a0406d7801b2acd65d8e74eddb16eb81c5afd5fc115fc4c69b2a3edd8d6b16d1c2e033afcb802c441464f8e3f58e53cc136115eaceeddd8634b66a0be4cbbaffdef9baba8ead7fb9cee38c0b2f3f26100e0b6135eb1c3de1d91a37274787c7c9705b39eeb4aeef91947e5737bbb01dc5f150ae117194f93c18b4e51439c3b70f1adb2c6848043e5aa2ef0d90c9cb3e0ca3df859a85313e32a8b345f04de3ed0fdd1992fab2f776b05670486f06b690725ab09fe92b45135d9dd30f282abb67305f91edc9d529d8b84810237de24c21440980b9c43de947d0e1f54d9dbdcfe4b909b352c4d33e07cd06849debb4bf9d0d3987a933d933c4a0ffc4824d8af6ee922ac8954d826f16e909c4c497c7d97f33bde62c52531c8f7aaade80076938609c9a28eb3ab99d04f3feff21e8677458b4abb36ee6b5e0359e6a94a90e4417d329d544c98fb6dd917fe198d51809d669b839ed9aac96b0c9f4ec6d7da5c4163723c24e61482c95a47bc1c3e5ec8f3fe9496f5d4ba588f570c318a2b49596ee48662aa2b3a1d5f6e36d5d251be898c981cde1f5ea780ed356540a07e114820fbf2a713c2e1aab6c327ef22afce3cc6dada47ee3f8a8fd7e367bad3d14dd7c6a674eb936990d26a8018f67e855285dc6ad14b7025454b55aa3457ec11572fd0521fa7a1505241966fa145f342b2ac1810c33a3d2b6c40217fe42b89089260489ac04f0a364b4a13a0ca3b1e1879f9cbaadfa34dd79f3e695ce27ff5665f4ee18dea30584ab74e07a57e628b5eed72531f9f29101a75e1bbf5b364f3487e21fdd682679a0581db567cb44fea07f6af44a11c9e2bfdea72266cc088a67eb95adbcce5a4d496b5ba21842115738ad08e5924211cd69f5f3a93e80b91ea5de092a64602b4ee119b24400000000000000005aee2e01000000002cf3c0b4d2d3942a53efc70aa12cf61452f0c692d24194b5e91f8a8aa9b20f5c532653d35797c1d6973deb6dcf65b889c766df11a07d83fdc5ba808fe14b8672897185a53d524eb9cc4f83993fd1d92af1dc133c1aba9f2a7d295e8021b5720a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029f880e9b05e20744c851796300922b26ce9e740b42271e8602ce153598d867f4b6e12671e432e155850db06d10eb4fffed1ebfd5ba13be5594dd791a92784cdb662494a08c93f1542cf84e4711d27e4ebbb43dce2ab23c78e0938cd9a4dfce71e732c80bd870b144791db5a344f338ac20b7e8922b20b76f675fd9589e3025e0327bbfef1ef92c7dc387dd38757d7966387c25f869016f3680ef6c3df43acdd790302b059b2bc24654938bd3a5ff7b17c1f5b89b1522b212977591fbece96c7eb3d0b06d8ef0c4dc7985eb63b9bc54af96bf8f39720801270e700bd5cce6123791fd408db077e20bdca5baf5f462a80762c7cf10170d111ba4ff4f738d0dcc0397178020c54cf5c7128d158613964a00cce0050d00942846e4dcda54a52f1e0bacc9190020a0effcd753a5d34f5f6beb6bed9c49076601826ff5362b47441bfe76c7668600307c6635f4b59d68987015442305b6b84b1f184d6d09e5db543f2f7301adb591503201a876d24fa076968f99f65e6d95cb1eb1214e6c5c39a97cca8c9795aaf874f030c6c11518c5ed5b394551e6d88b01a33712878f7e9c3bdf2df84375f081d666dcf5ce8e1680595feec4a530ad65391b949790468c25dc15228a9a7a0de61f005517fae89ef9f34ddce32e18512549687f371ccb68349a700939ef407695214e799cd6ec0aa823cd2fa6006bb44b623b8260a1321ad9be62726b8591a7397b34c44de42e0dc7631ac6152de65887932d5f719e28bf62a5a09c383f722c9e8ce49af6993aa01cd2a0149b4262a8abfc55843baccb3ef072346b84ef1574d81367930ccfe78fa3a731d58da6c14d72a9f2884cbb3083e9d79b7bee092e22e560644ef1605507372486d074526a805c9d68be4ec54b4b44b0d74f223a112075689a72b4106405bd8d9d53ffef03a5ac5d8262c783a71708a9c826ddb59967e579ea934e83de9562d716fb1e3e3d978249bc84df0c5d07a460ba620b0e24e0f6da9dc7e9027f073b21337c0c385577e132a600eafefbf1c26cd31c46a8ce6805e9bb2570c2a56e6aab6d42fcf0ca78bff195a86757fc847b4e953f6f0e97a4cecfc540ee2066451b9f9103dfa277b13e4487b59bbf39341f7e54e806f4459787b47c3bb29858b375211b63ba8b4880d6bce55ac84ebee17fb1c00a94414546c9c396f4044902ec378be293c43933f4c70bf1a5bbb495ffb882655fe91a5f270eda8ff8536af97c4a58f75a4008aef05f9835edce5143f697c215227bec6111ccaaa841be9426e70dc6c6719266887f5b9c2a3ca2d9f076a921803c521e63e496af6829fee6af95f2f7097677b944a77b4ed7538713e5ec098d2c973970a424ba944eeee8e84cf23b7f04d4e9a35c367a5d5d9ba61b0e8784cf60d2f3a2e361b5a393959a2e146009c72d1c60c2739dfdb86278975f1933089c3ffca5595dab59a0faebcfb132e78c68d1291bbe22ff5c93ca677d274abbfd4caf22bd66fa48bcf4c26b15c6fd4181b66a60ceb353bc93d81b48abf667d3c7733bf6420cb5801452b9976fe09dbe91a9b9213336ef047cbb0003961cf800eea22221a110eaf65db96d32eac912931ca15bd2a952546096b77351e45f954caf6fe299545f3e4675651d27f850917d4a712549fe2ece9bd920d7f9b8d1b350b5edc4df729756acae69b1835a53f111016d311995da68159c7916f66b381d8daf03f610fda6dec247e4d8024e426f9f70bdf30e3469c10e5e8c78559ea11ed41982f5e42b437ec0282d66665299f4c7d5873022d9d122ce40198a6bc66563a50d723fa7a6f324afa27bcc317c8c52632e1d391834b36d1c34b6047da6fc4ae21088e6cced4d8b16093c1c1d0d9e202d706c7493014e11a1980523f9231f77aed1ce04375ad84a54df81a64836351d504ca678e699d98984a2fc25608f846744c610b957e99d9bc5aca35c7761e082d006945b3ee439d98515a1c2d042851d4ea6f5fde15499e8849318f7835bdbe94948d6651d11a054e71fb8712cef3178e3035830aa9486b8951c6fcbbdd7e33ba87185c076d94fbf70c6c7de65960d470e4913e09dafca14bf71f89742f330743c89b28c0a60110de08390b932104f14fbcc900d3b9251dcf5beaae33f1c262ed50337e5776b560cdf830a2eb5ce829891bebb8c3197b386f342269c7e7aa6b9764971fc0ae02799ef9d455339c85b75fe460933f86c7e748f7c2b55ca0dae199fa995f8aa3b523538dca1d4688ebe3f9664ec70b2e3125b95d9053c235b2c9c20a4ccbc0d0d91e3ab4a66b7481ce000000000000000060464101000000008b64ddc84f4af1ab4a661d1d76e5f3127b7853c549413253ab9e4ebe84d031b38e23e7301ec0b2f53f1a8ec340bf9bfc435a83766ab18d6b2a428491199f551c2d5b88bf8b8e8b175d4f164fd0bc55f82cb45fe763fa706c021576562d200c0c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003421d5cc183aea9973f29e849bb3ca2356a24e4ee93627d05285b27b0023f2136acdd3a7a27df331fb3b1a2732d676b16f3a106b42ba5c1cdad0e70f20b2b6e40c1f6b3a67582f97e606754422bdae97ddee877bfab531bf9dd0c87ca0b2574c20a507464ccdefa60dde446633539aa303476ed1031619d0e98165da84578a8d032ec4869dcf93c651daba7580a8c0c4ba0f02d073311109c1308311578d30f6e2032b85a18b8fe9abde8effbb7c6f97eb28f03ddfaa65115d39530fe7bb5af08e420a0429834469dec43d197fd6a17c1e571beddc71fac75aeafa8a3bc82d2d41bb55ecb31ef3070e302e00251cbd38f7ff9d471008d280384f3f35e2846936e08ae40224f12535d2ab3cb0d4c5391a66c69d38f8b564b582e7924a5ae45d2af2491ceb0316fa1a8b07516b79d806e42d59e402caf2e4863f05ae9929ec95691e5d7de591020154ad5701ec70f286e8281d4caa3bedbdb5bae79415c9947b418e9a5a411618020520c819da894326ec6fe629241044e8c0d1a3619a0705589e5b0ca48787b5030217ca7f8999cf8410a400b083e8b6c1a4a1b52321dcc68e321c69a7f7f06bd86317763be3cf92b7c710710be92d2abca2eb1ba8ebc01615c92c7f6ee1279da0836e36a6e2311dcee4ad102554b788c1c61680b1e893c0728ac7aaf06e68d95ea6ab45116d37cc474af1287ec62053b0b3f2de841a68d29ad685cd87510298aad1852bba9dca4a4a0c80ad7271aa909f6bf787fe9b4af4447e2d13ae8924be8c65f4ecfdde3da95a6c9143aa352fd94366bf3e8217176f8f4bddb94a857f0cd64444264ef416f637fa92b531aeb48a50d60293b959890ece21cfa9976e69e7f7ec4430646d77e1dd8c2ec457242f34d43b117f32944afbcee90c2149ec475473bd3355d1707813e09d6fe9e00299a2cd94a8fb08b8991eda04adc9ede705f3ed299100a73a1ac50a2dbb2ba68422298478b62d72ddb92f622f32ab80b20ccf5495d7b9d54169e5368509af26f3f329e6f37e232e6884c208e78d46719c870c41bedcf02c6e7880f1fd8765ae1fbf07e647ea1d522627f0f79e808ec91629a169a792229c81a7c27ae3cea95be55697a51ffc760767e8f576888f16ad2840efe83b999ed6373ecf635035992a8f3e7996d24fdacbf80314252131583d8c79b8004c3f33c41936b3225a7037217c8c75581175e90d807528987cdeb21bfe4510c95160260b8ef9b709a3a8fff6f1c0404387e4a6a60bc89a93292b248e8c6fc0a4603d71c766802cfd2d94889bbf1d377dff983e78067c0899ee277237072f07fdc28879fa796e8c390f144761988548a16f94eca0e4ac9f4679593a52978b6f87e8c97e2e324d3efffdb7a06f3de6937541b64168cb3884892faa517146b34db8c110e507e2b8b9e5139d7d24337141682514ade55ac3f60993127f44723bb167a43eb468b3d1aaad76c11f1bab47e0935cc63a608b981894372e585e06b72de7e59820771fe7e76f6c20c29a44168bd2a8fe87a2642388bef3fb5c3c1cd4e2cfec9913272090138a6c1cab12133e52aa11fc134443728e9d0b63e69a96b02c9f60301ecfb63ca569b5b5af678392f71e4c049c4c9d8fc426c700dbb6972203990836e0b322d3951fc8d08df14fd1c5586c079d450f4a438e90f10851bfe34d140d8ccfd5ef691a9666db6ef8fe13553e384e9205a26c7ce20a211b203a432bb00d2322c9cbb7cb90c53c71942d7138fddea435327163c4da0498f3497157ea1e3d0dac56cd336778d98ca7bc20e61f368830e7199b9baca0cfcfb1a7291da284622b6db8df6afa8af98aabbefa2abde8cf12669cbaaf0e5bcca1569c8188833873cf10d6324976aafd15e3f4b0e4ded0d88a025d362c1b19964a6fde98f1e88900a2251105c2ce9d9358901824be9773ea71a104d2161952daf033b60dc81626c34b0aa44964f7673af490157cb8eead5c6af6ee82d75582b805190eb6c87c1197397b31ebe341b55ed7866baba0ea5067cae90c4e4565da597fbd4d850baff360024f4a331e0054c72c1b36e9c31a1b3e1df582dd5547b7503be946a094d8cecc67a665c50ef17758dcb0f3ddff3d0ec5ccda3cf2c90f16ae15cddbc052824df4fd3667b1f1a8d747c84621edb6ce6e03687844ea9586e093705f0ba533b226b6bf89bf2f508c8d8b8a01208143877b2b0eeb88f14b500a05894f8b4eac46c364712a7688ce6db181dad810deef69382bc1d2382d1dd162d3a5a5b83706fdc6191623215d441efc7eb64fdabb2551700bdb1f6a7506e67fe049cd6a7cc6d7240f63031a0896b0375c32e0e7bb2aa1dffd949c99adf5eeca09f90bc0ff6c8cfcf9dcc4c1eb99fbe90f4aa80af89875c1079a271c92f4891a9ae9e0fd498e22f5ee88b716879ea96c062c1b0815d98101a6c70c", "51526a6a", 0, 1183303914, 0, "4e851ce8a95bf387e3d02919c2877155bbf3b25e3100378ef67ca0ee78e979c6"], + ["40cd222f0167087d2711273805536f93358e161000d5b4df928934d4e08832a91079748e5400000000055253655365ffffffff04affce600000000000563ac635363a11f430200000000076500516a5363acdc787d03000000000400656a00831795040000000007530051ac6551630000000003000000000000000014fe6c0000000000ea5b779626c7fde08ddd5b573a42b68b75049d3f1ab3adea72f7d3fe133491e02dbf529aa71fc505b98f335cfe1410a0ea4432a328548d253c2c64aeb70c38a6f6151d60f4035b8ece882dd2ddcd5588e2cf11c3469bcb0cf597f248a03b8fbd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0904d72b46aa3ef8b24bb6b976188ddd204553165c28c7f3be6c2f9c32bbe84839ed0e99dc307e14c82ff731857617dabd07291ca5e14f54c3482d0db4108368281a9cde5f5466d0caa4179bf3c1414b89f5a9cd1ff0585b35389bb21118008d7e22903e2a7d5775b0cf92e65802b7010174249af09cad3e5abd1e031fc0fe10203d119ccdbd911487db248a332ddb99ec51cd6bda53f76263d6ed0e68d2d705f021931e0f99469dbf0ded6c6c8d65e8bcc716123ba08b11465a3030492172b9c150b0660a5184ec8155f26e5cefbbd53b3218a9a809546fb9288a3c32925537df8e2ffe2983abebc99d8f8c7bfa5d722159edee649052a4d5467cad96e9d27928c68030bc02d9e2aa22b178785a109ad59ce8db362299c5f9e9f9a906393e6f2ef6d4a0205dc86272b7bd303d5f8eef58cbdcfed51a7d90529e8df307e576e3dab9e6403030f185696bf5a7393f435ef9cbd863e758d09c5618ba4d49a2270db4a8955b6960305be63d9e666b4ec30f0a9d96ad92760c313ea6aea2896854f9c2cac42ad92d40324133693ae1be01607509c6be7f6d4e735e7b705112850b83d170cff4f0a3b28a083a70400edb480fe0c09821a7dd42e2d0c429fe30ba9628a47a4f3809bbe77aef38f7a78d9bcc05d8f136fd4aacebd3834ba0d684176bda174580eedd02e4dc3fcc51a06c9667d95ee3d24da47c2238bfe9fddb8968fc117b8d76a0454bbd8d6275ef08ca9659a1cc98588e571cfcbf0137efaf0b4efd1c26b4c25e9d6388abd2cd30491929a37033db74a1304655f4e2efa4f6166ebeb5834c8e4a67fb2069b7435c7d82d993033a58e3431079d55d924c4195a3cba6d3ffc8baa331856f203e28da6ceac15d5afcf7af25d45b36adf600086f9e6dc8a212f0a67982e994048292532038a9f5c2d752f30c6510f979f592d7bfde7902872fd475fb42bc736f17d8d122084446f106c097b5f366aebc2327860d432414f2b82d85e3463aa35edc76d7b108c20e37bd56e6d30d5b094c95255debd4de595b0ae0365d76596effcbaf9b98ece08db3213a617e3da55d32c935b767eb902557b072e56966cc634e5cd4fe07cd582e3f0b4e6ae43598d8792dfb9b9f34349958f93477393c4b5426e39038f9fc85ffce279cd6afda3c21d3bd9a95eff6a224f2dc41ff138d43c63bd9be7bc0399ca8aac147d286f0f3fe27a06a9d72de921b2b7063fa3539462f287b99e92f22015c7e69c9b1c473e993ad8df53fc4630a68554808c44a250e2b8113338218af945dcf2323935550f55be032095d1f692df036ff2cb8ff7414ef4f218064dbfce3c18826e780c5223c281249db909883624cd2f80849be79a27b801e4d498fc6931ee36bee705e70d63c8702c9cb58429f28c4ea5eaa51d51bbc71365870efe97446dab5cb4d3c775722bb19777db4b206b72c2a3004c9963cdfabdaa99a4c582165ef20ba9dea0f1bebea0b29c073a20d7beac6a39f16f00dc1191996084da8b892fde1c3a400e2f0535b6d244c2d9583e7120e3b2db290845e944b9d0c462efe6799769d1f9d9420a089b5fca60515aa6b2d6563951e43fd9a058493b66060dd1f77121749eabc314d44d8a5bcb97725afe72fe17f822f6527d9809fd0b17b5992eefc8fdfa84408b23fbab321df046ce2a5eaa338c1c6601ae1317ab97f36847727a72e758d4bbdf20b7155b5b60798d360064f38cfa9903366ace2ead599e21bc015dcd01a3f5b21d43c66fd5bd2815dad56acce77207a5fd0454c68c0b9449025f414292951be02ccd6d5c3538f4923cf4c3f445d83ab0d8fe1421d117ffb0adaea73b87f5d4e69d52212d9a5e17edf3cdcab00a4dd0d3950b517526c4020ccd1d70a9085a460a7e4b46f0d59467ae72be742d3ff5bdb63c6dc0cad6770cbf620f06001801c1d6980023613aca2fcdd2ef6170e95c23ec85691bdc12be3d9eaca0efa9eea62b8bcef116ade2f68ce8ddd9ef2dfa9a20c6c86ee59c8bc619eab07f66015790c99dea603ea18951a7d02ff8a99f245aab86b59f4e8efd0018d96b9cd6224f5a80400bb7bba8bceeb403ff31d1814f69013276817fa20817402ecd8e63dd9f30512fcbfe3af199b209d5f896266e7e51a0cfe7fcf76de1d567714ab9f0045f6b229429481a5b43f8782974fdc288a397dd7ab82ce3d437528bfab5fbf2dc1a3e6db466a76a51abb28622b4703f424d6ddf70d1edb672f0ecbf557e138ae9e74360dbe5a07ba743306a52333e3d86adfe0195f1ceb6570b76569bd2fdced1d759276351cdf7000000000000000003f49400000000003755a06265fedbde73840cfd6efc5df04ae3fbf5afe63db2ca6232743bbe65a597104a8814cec43d2db95eaa19cb190bd8362650b975106a8d2dccafdb1fda559c2a0d78848cb6ffc4666ee10febc70a685ec8d3cac215bc1a9f55ee153d4a6b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000114ba3949c016b7d5d5e311153b376b45ef140a2b9ec793ba0eda7d95ed24662ec361c627b98f89b67ea4c2727a7f86a3dbe6075c3a7d3b7ee791b2696bbd1f726cd13419d7bb81d145c4010ae93b8699eaa5f2c92508af31fbbc2fbee02e840accd7837cc67eba93448dfc2e8126b062fdc2b860600f25a635179927569c4900225f99dab9aaef738bae2be546ae6d6b2295537071352934d5943e90b6fb4d76f0318e566b2629929d879412f360aff444bedcaca184ec1d188ea049e6b931bea780b02f858f7eb2f0fc8ad1385262bd1c01259fc75bfd1af8979ec50b09ae62c800ce93ac60d5b08900c0b304b96eb930215c0e654bb9312380c7102050035935b2e0312df4f315aea575d1893a35e4851d6ca3d27e6432f0cf9d86b99de26a01d057703145cdd76c6f39816fb6b3aadfb16f2c7efb97246beaf3610de6b09f239627a5e022930786d598fca07432c31dd7cf2d2051dc308daae2506253973fb25db8f06ce022036d2773f9eb0a631ea9ff72f71e73915235cf786eaf801e67d6d6fab301aed020f9799033f5f2fe65b2ad82ed780f88f4c72a57e4704081758fb65ce7f3a59fa1df120e2b8b68f0ec574fa18918a54ac6c0de79e9a3b3a3db22694f7b0f05896b258999b509579d2a005271cd37bc8f89b6f7076661e4e41a7c95c5998589b197842a55c58bf27b4d1e1ef01b4591a3b766d011bfb768abf6650092c4dcd22aa9c4461fc891dc190a16595acb110dcaf2d290ab04e2085ee53393da8ced6167bd9ed9eb165ce799dd6f051a99d24e96115c0e4e78acf762cbcca862d9a66b14a891c0cb76373143641f46e49c6620438d3184f9a56a3996f6db787f0c3f43d865d4db9a7d91c9ae0001325b7d4c0802d1336506e34fd95b462f95bd83e03d5d90c5c8e8d17c090c89d1b8a0ed9fc2d5591c21b4413160c3aa6323d30301d63399b820fcb15faaba840a39fa6f635463fce35243372c788f3cb2eafd4e031261ded044d5fa8fe092dde74dbf9adccf4feb2582e351990bc42a54ad182023f300900927002ab6e5011ff0f33226170633f22792767b401da6fd6613db011e5b1c0a2cb6c8d61c35e4f23947abdb736a00bdcf7401f7bbb1c165c0088fe2ce81b478037430182ac9d93b8ece33987353f29f45be8c3b9fd0f850129bf667642a959b956e208536e2c835b3ce94e3a1f34f2a60b9655ba18f0fe318a1633864905f7580e2a6c9748a87be4d70fc010eb30f105b0f47b01aaebc05c6462585a2c1e5211e8ef928b46cac3043848f2f2bdbbee567586f8d2ccbdc834b830676912c7d4d4a267bac8498d9b16b1fc81bbeec45c3b014dd43126920fb4be22dac0acf10d057f73030be2a30ecf0164ea6b88d43e391e083dc7211200c2778568145873e7793bad405a5c87a7e8cadf0979020b216403f2fdeaff85deb820f9235d587e47e2cbded957d7c00e0fe077df001705921ad87b363af1f431d540f01bc53324bf44182b90b2f6a70e253d20c6d960e6f4a0453d07d2001347e0b08ae9d4c5ffec85309fc204b0464dc7c9763f0098684b8dd70350b9effb2b3b197bddcad615e3ba821ad20d40a8a107bb680ca33c431bc14253956b23c6138ac491b577dc35d34dc1ee865d26b0fc0138ba00506fa1e866f50618382630f248296a5ffc770b9a67c0fd0c5cfc383fe1629db5296d3beb0a7d36ec2b1447c714bc7d3a2bc4ef1a302329bdf0203e9d8c0352960d9c42fd58ee7b7911cb477c7ecb8f175480c4ba17106c4863b8e00ace8f8c5a96b8349c134bd1a05f7a84dac680da62efca1efa4a947c16a86bb3775437f69fa7fa3647635fc469d54e55b8c3255696bf67823d0b2783db339c4635ce034f1ef4d9332cde356608439de077b6713324aa28093f4c66005cba5620fd03972df3245d0642f0672be9b1f593798837693fd03c08276137bb37ad1cd363f7c1b266c45b1b9037f5c5c0fbc01919e1e6662ba32b6872fc960ef318c005cc36227be0db4dd0ab7db2b722338ed65fb815ffc70fa133857d43c177f20e97572e4ebcff63ed8caa3ca250852fbe1bf793647d7fa20cdb126427250a46a6ef1942a5e680832d5103288cb4c06d60e832cf84be8db1a1c358751e7a3f90ecfbeccbeb9b7d2503e3fdf450c33a7aa97754f858b81ad7ae1d46f403980fef1a45d711943fb7552f1f462ee43769ad5d2cf309e982b7ba07e5ae148f32d827c88d2c8f30a6a0b069bb0b700adf3f2486b24f505e9fae0c7de128c1396dc9bec0aa47d0184166186fb8877a915236de020000000000000000000000006a8841dec34d84895bc6c0b4537b07148a929ef17208d0de517969558a6dc463c05c599d4f698ec9da0fc57b601ae5edf5fac408194267e0d871feea953c600eb5812ab75a0ad9d7f5ef30971a9d0a55b5c1740f289d1f295c5cd55b332d2d4d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a29e9bfc148187189944f1c8e52aceb1a10b0878c98b875e6f65b858dcbc91dc5d52731681e7209d8222c98a42d4bff0d592726457561ea95229e65caf0105e0ba11367b51add4fad5a1d833d2c53eb516c9d4dae1faee90dddac8c53c85a4ba73851800f40085b4f296285e5565d440c09bd1a496af1a6325b3a91d38c3ff78030f4ff52a63b6e1186b79836703165bdf834313815af842096234ab74326987d40328e8a9f0b59c9eee17bd0d2ddd306594fe4d5c42cd73595103a9813bde1660880a043002270e521eb2081f3bc88e2695e634effd87cb3465fb5a8b70e23f8eb62af0435e58029efb42b7b07b50f1e570d213453b7a0457191b083d22a12579c7090210e92fc66f59bc19872402c4939edf71a4dcf78a01570281c2715a5b1e1d72f2031416c71bf2687fc31c446864e00d31b0f24a6760f064e9ff460e5ace9e2d031102181e69582988f746773793236d97e67e6aea9e70d7d34f006145bf50c11f39910211743cc1bcc8b12f8a7f58ef678cbaf5e5f2b71b4893ca4a5c1e7e8ec780ecde02098e1ae8c938e383145b83f08f5a2b49e6f76f3ba6d41cbf4cc2465cee1ed9d0569cc3f5e0f7dcf8941c55e828ff1271b889caa042f7694e49a2717883f99f7572fcb3c15b5132307550b3bca898bd8dac50bac0e22cf9aae4144fe012ccfa0db6c271ce61ee34b05335cf82bb22091bcdd4e81a0ffc877c47feada9f89857905b617e1500ede01824bb6e84867a4a730de0e78188b85997b854031b08137f80dd29b996c50b2979e3ec5ad128d877aaef094aefcecbfe606609ebc20f7d06a2e59d1fc1fbda58675281e5c9dad100cab4ff06620ba39344a97fbf356ccff91810d1e6dd306f7b245dbf32aa80ed6690d1e6e27477ed008ef2f2ff1f344d49ad38792df9e74f470fd9a856f64e09c95304cb0ae3cdcf240bd315280c37a7a468d14cc73ad63e0dda1714241b5b5295cd2a9295e6472993955bbcb550ee85cd4700e311e1d4b6e99c5c5e76bce0f2d4a571d628dfa54f1e742badf0617a501517143685eb032881769b5e46ef1477d16f18d45b551f09c6825c98530dc7fc0b521fe8cb1c10005485a4d4b1f9fa310d465a1597d0480733a11bfdc83c0a8e6db8512e1f2dfff022ab1ad036ba2eb6555b1e6b9b8435068a81227dabb869a5b6fcbe35fd38692a562b09ecd776d47c15c32482000523f3d7b17160048aaf3f2eb9640c767b30738337841a629356aecd83fb8acd70c55c2e142e4296c10aac6e32de4db90a1cdbda954e25705a246a2ba93a7ade33996656951261f7d9b495526d1b02c145d1937cc4a8b3fb3088d9f05fc2562bcb94c87fcaf06f7ba473843112041e903b26d3abde05a2e45951f330bc1da759ca13ac0853f00a06b58613de2036963e67e2d68d5b5d80a0861d4098401343db01007ff5b24359ff8a658cf7f48382d16f6b0406285e218ef1e18414dc3f9721c6cd1910edb6b06a069cd2d83d6d65a9727ce5a6dd06c2a3edefbbfbd36b4cf6f71e2bd10e28757710cdf82db4058d941a6a2104b13d3fa15779d69498550f86fc03333b0cd9dbaa2e8567a978d90a923b66a383b0340f9ba8f38a2aa97d31fd1ae556dd8969f021d930fba51f74533e367058b884d8a9ad7faef2a6761eef94024af3e4454743840727d3afa3a733ea98a34f1808efacd1961b66b026185fc06efa2d81b53567197cdf0cd5128c277d53a203751fbc3bfc836c5c4a9bf853939631cfe605c547c7ae0ccb5e6203a71d29802d45226780f10f896f5435e47b89578052faec6c688a125d107ef5529d44056d50f29bec9f07920725a087ed6ee919b715c84af00c5c152673e332e23a42d449ddcd18b2b7e57755cbbd8c484c4de04cbcd78de5399c75ddc9094fb53ad7e4a0e0b762dadaa37a3c5eb77eef64238b0d153e6121a1a4c0e603fda500ae71cba65bc962584ed4f773eecdcd9d4bf5e3ee7be0db12d00294a27587e69f154a526eed17ee5e04cd50275ae46866197b0cfaa91f7590524d07baf7432e93ab6e890c758fd3f8e42e31653fa8b983703793d437b32939526cdd1ad7a764b91d1e21f929eea0aaa6575ab84ddd2b0fdcb2bbe9b56009378ee6f3ffee11925230b925894d783a305a66bef4c714099f32dd76ae22b37db85b922618cca9b4942cf816faf6ea2cb5d832bcf91fb7137d38e9172517a22ec3c996a4469ab4c1ba844531020d80d091141264e6814c0af2bca8b44b5864311d13a1c8a57ef0dd16f1e972e9a130bcf2243f8791d08b5250efc1fccb001cf73beb16d62b260ead295cee0929bbac96803d6dc82bbd6c4e3ae23194d1c7fc69851324a82dc8dcb239e59ac26c2c8497842750a4bf7267b8b9f4abf28e5fc732cd452017c82d1db1f30748f5668a32f59fe58069db605b3f0e02", "63", 0, 248378420, 0, "26a67be665be779e5e6e196556834efebadd1189a9ca43d1a8826ab6e1c130f6"], + ["030000807082c403040edc61dd3bd6b0083caffb31f323001fc26db89cb905964f2ee7b8be1823987c0000000001acffffffffa4b1a30a2bcd218f46fbc901697bde6dcb39d02d99fcf33b11ffd4f7853091c401000000056365650065409beebf984ea37140213b8f2fd99004f619e706b3a60d294f59fb6838a95fc8815efafe02000000055363535351ffffffff4b79f1884f81b1eb7f6c857216f44bffa55db371ad516a6c80cd678fbf9018470000000001ac34033f73035712a0000000000002656359827c0300000000010054bd0203000000000565ac53ac65ab1b17f60000000000", "535365", 2, 28371754, 0, "03b3ed9c981fca488c55780e5148382c86f0ffe706b9e8070c62412a5542d7eb"], + ["030000807082c40303550fb20b84e5be66c3332edd4ceef200e0718222454f4ef24156d1d977985c8c00000000096565ac526363535253c89143eef192d5fc1270b28a4acd24195c0556927f30c09532a691be4f6fcb48bf5219ee00000000086aacac5100636a00fffffffffd2d541dab3c0a63d854dec8964f34686bd43dc3fbaa36e3ae7f3ae3af86e13402000000085263526563516a53770f1b44024a2eb7040000000001656dd9af050000000000d41c1790000000000388d58c0400000000000000000000000052957a5c8f1009f8c0fe5b9042d8cb611d9dd318d5166df74678cd288608f3ce034a6e39cf382587bfde1c1fdd43e461de0b30ae52b2b2afa0df08ce299ae97be4c5cb8ea6378f20fe5bf690ed2dfd63b9f8b3f5617e22920473873289ca4eea00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eec006fc3f685a069de52e7229ca3053f4525fcc8da7491f645f969159e5f029dba80bbb6d537c1deb3c38aa34b7023e9f4a52ba94b1df2935ac5215df34d24b996cf7213083fd6c213c177f655d4cdcf3872471679e95c8d5d9bcf89f9e0abb1ce2e505ae8e9f607c1f9a02b7e46452c56f27e41154bc323271155b47be062d021e9217e97ec73fce7255d609f46c2eb769db3a66cfc01f00d3aaa595798acae4030f62a9f620b938b1fcb8d5acdbc69fe023582762c6d94861575bd087c6ed0d5f0b07893ba77b2c11ece975213b7c3d7eb5ffdf21f6bdf5b8374b8e2d8e3f9702263ed5328d696e15927e9e5deb7045cfe482f4a22b2e92ffb4ce7bf7bdd90294c50311edba0767b8285f5dc5577bebe4f2f8446639fec72a351de8ec63a3629eebae030cac8bcdb148e1942593a25a72a3335cdfda407c5cd3fe1a09e946e0383b186b030ad72622698d8a48f7ca8b845905b9ff7f6d30f1130ef8b955d1f7fc9485e4ef020f1998bc9b3533f799016fdec9c98f68992980d7c03ebd2f09d974ef52e936e8032a6279795470791f18152ab0e65d1b0a7920ea205b3ad21e383eaa30c258d12ae11b50211e7616238ba66afaaa6f9560a4f1adebbb08df6884b6ccfd095b6841adff5c126158c20a7185336a3f9549d063169b19b579a611f026a5f8c28f41903e1c3b83cb231d52e358783159de5c0ce1cb6327aef3baeec3686c23d6302c14646707b8d39a487dacd0d944b0376e12435b2b86b9e33e22201d8ade1762a339f668cf27eec69d0de95706121a645a1c41c42387c241e1d97b284177d80f36dbfb501aa3145bbcc4cd96f8ea40c1b9d7a6375b9eaafece1cba619f59338351d10609c1bf04a8d3d8d736052a105a6e86838148a456e3cb14783585d2319314dfedcc8890309476ea8b8791e027659f40fa7376466cea5857d011f20448821316493cb3c4b4e174a048cf849b7a157ab63cc80e24e7b440c82f753de6b788da7f1af2445851f5c2b5cd8888291ef2b4eaf9bce3b70b23284482b01bdea78d8b39667190229c4dbd7c1af41c48bd3ebf8671040b71522d140037b756058a35a76d7e4049ee62fa3ca50d1b9c3ce9237a7ed2ac5e39f52eca5b3721a82793d172a784943ccd3a32ca7c35dff7d10f9e53660edebca4f5c1bec837d30151dce3f0f8811a5fffc042ad47e2d11a1a0b74447097f8ce69040eb8279f68a131413cc13ae3796f434e4f8c0b6d7be4c246e59142c7798d4dfb3f6c6437ca225dc6fe73bd00e66b0c480cbf4927084a27e007d06d50d4aaa1dc1cf9707b29f8261a6ea0ecd768e1c0a5ba47ee842b5c5440401d75d885850ca5be256e437514e7617f47c67dae36542b78a74b93b8cbcf295a279df1ac4a77d62eb147bb385dbbc46cba73c28995ccda4ac84e8d7fadf68c8b0cb048f93828037572e397790cce1b95f91cfad503a3ee8f8b2594d800bd839ad851999de547facda05eb2e25657996ae7272c928a1b8d0f5dcd0703fecef8f6677ebe8953277c67f104fdde70c43267a93390b291acc3f4c09b4b2af3356127976199885f1a5521f4511f8182f6d8669320506f6477792692c2fd4a6af25c0146006b36c0f622c6ee3620991ef137d200b3d9d150de7ab145607735ccb7e445d9884ef0ba30a3225ca6c37c1be41a2f82fc0cd234f2931f0a4aa8892f79cd93af6333ffeafbef7c97ea8de214999035a09e19a2f80c61f759a75c2e84b66fb1041063aff25638dcf60f74cbf47711b77775563205ab7c47fe9ff0fe29d1be0b2b3b225e35b7af94d0f82904cc31fe48d223516c5ad23018db13d567fca272969c00bf3d91498b92b502c6e1caefd8eda9432816d3fa914150b6830ddf6403819577b40ea7a9ef31cd8ab70aa508452615e07d0bb5ba12676997a44f5e7df31bad27d97f7aa96e837cfb5a95ae573812f00dfc472c5ffb6a9dd3bd5844f38a0e050c5b5c24996d945044c51f808f21ed751575f732acb8aba795af292b7d8c76256a0ce3f6aa27daa4b59527b1f5d84444a78d3d61fbad348de9a9cb6e5ae95eec9b2a1046d01be1d59e1b2e653cd5899bf9a3f64247dcd7c1d2c130b1fcae14f67c7eb2eac8a21dca405fd5150b5de2a4b9036535641b3a8b466e96e82d382224dde65dde3c9aaafda87a9994e5aa33eeb8a4527a7e96fe7dd79c489cba2757bd0377a7b89a977e6b0a11076ecf4b325328cf25e24eb9094b845b3c508edcf9c8b4b4cd3bd6e57b37e3d22a92649efc1b3c5000c020cbc40b0c88fd522c6544d8559e98f447a505000000000000000000000000e792e2529ed195aea70da99e4ab796630d40a0b71db87cdcbf3bbb1a3d6010db216fd864587f40fbfc74cf822e10c314e9727e5a5603d4a5a556e2e9ba0b122f531ea9263fa4676603bdf9a720a9af302b6ad31eb1031162e2b4e979518269c6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c020cbd69783f3e88670257095cdfd2593d1b4e56e75a7489cb9982ee796d71179c921bb16ede68b7e29088ab6c6e1da700ffcd86602e41b8f21fb47bffcf9b94c1f4b8e891da61d3fdb9ea3f7f7441d1705ebc443de0e6acab6f89d0233345a29adec8b6da66011e7838f4425b80eaf47550dbc1071bda7b9ad4a63108240e021fef108fd8acc487c1e4c4f394a2bdfb6beae71da8ed5eac706f25ea220dc4c8022fdf7772f2172b1dc78ac8402708a8c53d6ee9c92b1b0d2cdddfd977e85a0feb0b07988e7bfc7a4f2ad7b703b36a5165efb040b240b8df7637d89e267472d0a1bd579d1708a9644f20499a691f16fc4aec84e151ed4369f492ec3af0e64c895d42030ae9ab2fd1351337507df27ddadfd34db114dfd4c31dc8189c943cd08ec85aa1022b4d77af9457d8d923cbfe8984e0c12115b172f91ebe7845189f767be359e8590315f30cb84615317d2809906deb469a81c886d7a67fce965260b93168cc81186803036ff09999e910e3d6357edc8991002bf0d401896fb3318d8fe4db0491987a60030c979e402550d7f44e8f7e7c2e7f89ac5e6d623f83d014ab6399ea0cc122f8abfa51555f7e8c5e7a6370934fceac346e2b77604c5a400e3ce0df5c0700cd6b9a375e4a95c0488a485a899b44d14466e42b6ff13b3b59d275fd4d9693f7a4ad660153829718415095310c90cea619058ffde9a990233a5f4f1f7b19a5c882417356efc7b05967dd70505db7dc56d2e8ca702307f34776b1e360ae0b6c01c6af7d32475a7a35d0c17bffc233ff8455a89874444ebf242eb00df6c6fb03e4f5b3215d19bc89d7b6e0b6deb65c45c7f968587181e0f047c963175ae1fd436ddf2f9bba9e866f19cc0011770107e1da46bc25787f6753bbe129dcb73b9e9ed83846441b307424c962807d779f863a2242f3d52f1898aa58669323797b2c7e824978133ed0c00e810327a14c1389fefcad4efd180082718423bc0eb60a73367d9d3b9bcbac7a5aef8a263a701349c0ad0d421b206bea54ced82ac6f2d59248cf3620879d3e4cd8e1a1b08cdc25569d0000fa4d9e27f6817bd762d89364f584f0bfeb95cfd1d5eb93211c2b3040d5cc9c431310ec3d763a8ba14dcdf638be3c281f035ba6cf8b417decd3ebb9c058a31e440916e7d6d4b1d85db3883021a770a8905b089a407d51a53e20a9de92c57b13ee751c8038f4940538e5c18d9826b922070f776558a2aa6ac72ad739c486d0bd3472788d2b24a2d957d9cf0e68398e5ecb9e45faae9fb3d1b68aad09e55250251eb0aa35e7357b572e5cc66c4a7bad8fa330118cf18b87550a8307e31d3ac8233e5097e76c15145dbfc524fefd8e5a829e53d60de006a7d8cc7b5afc709918d2452c6cc6437786411a4a7b314a3f6607fd9391afad4e8523808ecfe594e79957641770d987735aa076054a78ce6e496ddbd6f0fe4a37169a5c9fe2f3781ceab27113987c68e945d52e67254044691d85f4561913f801d65406465bf2a04a8f492d4ca4f0a86dad7d2257d59eeabf066a3aeac25e1c6cb0719c936031ce528750f94dff7c07470a2c7677606d966aafd8b9b1bb4aa32864e9b927e9c64f02ab5a35340751d36264ccdb204d7f420dd4fa000c6abf26bea6d3c3002688e8dee4d1c685a530180f4b8270454248c8f8f03ab156e3f5d3730ee1f0502efe1709c73e4219ee6c99bd817c8badf4a4fe78baea106cf92297845d5d1c9498ebf10da76d44f2469a38b5c4aa117a0d6cd4af6585c05250269d7a5933e1fdd1393bf04d38610d571735598fa6e6119c147cce856318690ed087b8558fb5004012b2947301c2c24be93aa090c902d2913069d78c1f784179e5e3ddfb48586126ff85da476fd8b349370600289e0adf22b86e3e786cfa9d35c7b3021dd6126d9bee4bfc431b866ea91cf7e7e9fdc0afaab17da27cf224f56b7dd8aad02d29486f4e4548cd5399a4eda4b0f5e81e667744e2b3102774db41153e87c6964b23d99f5fd2d75ec0198acabac7e210a8acf8f57007df3d3bdd0796f98c430735b68ed119292943bfa14b69c9d469463a7d8bded639d48ff861dfe82db7b225f16c09198056cea55073b4ba1aece337872601d84b9e4460b7cdfaf7dbd15dd73eaeba79d423aabf8a1ac23fe0faad042f3006f87881bb3df3266178973cfffdc408224baf0e99b164208b6dc5ea98ca489b95eb85d95f492b645fea27e14e103d0b26c04560d2f8e514c3be51e751016f7a394e6838313813421de21a4df530fc75301c8507bb9a97162691fb440000000000000000211df1000000000001f681b499411be50a04e55e8dabb12a9b430de40662c629a82be4caa2d1df7047c7577494bf76bbabe17a0df7e9c093a0378aa656c58cda10e56fa7185cbc796c3ecd573cdd3e2bed85c4d57a007ae3509084e565290c0d38bad549cd56d68b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006502c355164485a95c0abe4033237fe39948430b917f3e5c81ce1d0ad095162bfe0381bc45c4a43f58e4970ff2ecb5ab459fca7a7562f5469a4d2caa855a4ac4afc1f244a46dd8b8de47059801da8dd6807602a724d545c405b8526290a2aa0b75849c729a8f7f6fc9037583bb05e81d3a5112eea3d31e51c2bd600279bbdf2a0317c1cf0276027357e25f2839c614de72a0ba9cc37a884823fe13d357096759c003194b663497ef42a904dfd4573c74398cf9780d1290f8301078f27ef36ca286ef0a05655319e5be2a3e3d92d3d0e36f145fcc34562be45fa2ae58818b8ed11f3590aa62beb1244a4c8d2f1a8be9c1f9348733dcc3d537d5b4f19be7c59efda260e103250d60f713fe83debc9fa800d1e8c3f45543c084d035098542906d6cbf217ab3021674b83ccff8325d2a99a72b7f1df34640b0b12ab462f9542ab29114e5fd7ffe020069da5cb44302c2cd05deec8295522bf609858f1618679e1946f64b84cd2c0e02090a782607156731574ff6cd5e47f6d806b7a6c5b6733072d16ef3322bdf1419020e135fc65f160ffa1019bedd39667f35cd3fac583dd8316197e34a94b97cfba823b17b4f2b939aa041a65a90226ba747287007175106706f86826d9b584832e55c2da259ab5ea9a96066878de8e34539f1cfe45c8bca8aa4906b5dc83b66d2b572fcb4343a0c039722f53550ebba54850e92ff3f5dbc3fad0ef1bdef55a4611860456b078eb8179d0b14df926cb5d86b012445f9f3d408943acec30974b5c2817f070f18d86a5cfaeb49e7f560d9218946fbdfbe5c2979a5a4f0c4696ccc3e205a7164a13e73bf69d50530e68e4d5d88fafee8aa132acf5e37c776a2d36477f1be5d3b46ae83498d83e61c2ad52b0306f6417d728c9d4ddac7030fef6d4300109487d40e81f400106c177f32bac5b2292af7328d2ceccaf52883ad091fac8f5d88396f6e5758f9904049202dc7a37c2b20a5f631a9a403c6a47182b51e04d6cea6b25d951494ddefb447cf50033862b30d8cdbe7ec8fbdbbe3c6d135c5298c987eed8453557688decd290616625c86abbc9b48fb8fb3a36e772ef9a34bae91b7112c3ced46080a72ab4e55f900e130fc729538ac04a69e6dfc7111612b0b398c922d148ae347f46c6eaf4e23820a46d97614d89bf411381ecf1f31740657a95ddc62c4bd7a2fab0b402be141a546a1a7dee64d8d884b9143931a663064c0a2b40b1a9af32f7941a13bce9e9c3cb2edfe68791d79ed145a771f5c60eec26f9401cac0cd1b734d3667dd0f0d4402386cbcc0e2d6fd0e87e4d62588462d275dba839ccd5798f4b51e21ab95497ca5cda0c3445dab12b2f2132df632ed096b7c4bb9b627eeb635f03c2b72197eeb696065f7494a6d24c1bb32441feaed97062e95a30b6e3b1e0c438f614a9528ee08ec16ac8fb98e80fc17a919eb231a7694d93d415a244beea42326ea943854d2e3e8b47277c243a090d7ba69670880a05ab02a9ef06dccb71cae288b045e5a3bbeb484bf9f4a971cd209d5c51ff332c6bd5c34e3ab7e4c9994d7504818f8048ee332c27420efbff753db6bceac0722f8dec432de86a834a78f39d3813ec0693114dd42bbb203ec552eca8f651bdec32007b45649d1293dfc952889107ab5fde2f4e062e7f0884987b0b3eb1aca0b17126b8046c2898b9ecdfcb220b44401c0d7f2377e08b109f0c85bdb7d8ba53ab280b4bdeb2533ada011668a163f9eafbb7f725bcd0e40cfdfae93f3058fe49abb678438c69d4f65890d693cb740eaa61a9c23af709c16c2dd6adae8477717d5827ff433d850b57d7e0115fccfb16ac1c7cf32ad6020fe8cd09466cfd9ecea21a3ea54d27885500db9e97d60f4e4270def5eb5e0e62444c83b995ed5506a6ec3a351c7ae17393b2d514595c1205c9e02815e94220ba2a67916adacdade7e8e392bea03d0f10b7a8954b20cac5469b78e3af7bc100685cbc0a0aea8cf51a151726ddd971c9042d2f0cedfa5a80ec12e0dea33ddb11f86623f6a5d0cc26f3b1d207054cddffce3e9bdcecd2cef37003b992e330ea7d6d54e81d5d420b21a77473bf28bfcc2e60a5d8030a2299803978beddb2d3f42282ce69e29337a0fb684a2a7128b9c00767e7a5623fdb70668a793668f84f4eb6006cea1cd0d55a954f697450af6e6364adb32c5b6b64c578e04705b99c158198e8bc2c3f8f035a7f87b9697334419fa34df536705ae7aecffea6388090aed239ab06b44ab9dcfeb653bcc354e680a2d4a1311134fcac3d7405eaf04530983d4d2b77c5114b778f4ed5e7d372cfd1435cb5e078cdd8317cbffa1f02de8d67e081703748927ad1a58d20f6ee9808b5f63799aeb5be775d6030d119554a022d0acfd5f47a077ab7fdf07b9a70ee134268f3fcd2247cf70b52ccd6d110af91a37dbd26ec200", "ac526300000052636a", 0, -798177479, 0, "6ce36c9939c05ddcb6cd14e1f199e6e691ec0640b5d76ecb995f5e163567c020"], + ["0546a37a04780d3ddbdd4552a73ef08c065430d52b3e3aa078dae3baf08fde5eebee3318f903000000055300636a52ffffffff590dd74627ea19d592e2247b76e8b1506fe9135305b4bc566378fedbf7ca7b5501000000085300635152acac53ffffffff96d94e89d3ff7150350e27f36ef64da475448964fbbea560658eb93eef71da240200000005536a51ac63fffffffff5682825ced18a924b9249ddde14c3869eee2fb813754ac6a3079d274ff5b7ef000000000852ac51006a5200acffffffff03db9009040000000006636a53520051a777cf0400000000025200656730040000000001514e1cb9bb00", "ac", 0, 910430291, 0, "f6c115ca3678c8c38bfbd4dff9512399ec52726587b249da100c8f85826d1aa7"], + ["030000807082c40303d0e548f793813b4e2f59165cb688f6f7a2b905a6cf3c8a85baaa20fb66c9cd50010000000152ffffffffbed6433bdf5e71c248355b1df826c85eaeec87880f374c08cb14ab93c128a37601000000066a006a6a655335f5ae8e8a7a54940d0d2c1959f1409c393e8b347233c445dc03346d6b436aca842826de03000000015170253ea40223eee002000000000163baaccf03000000000451005263000000006ed875aa01545ae6030000000000000000000000009dad46ec81a77fcd76594284289322778e1230a257cc19c955cdb8228f030ed4b0273cda709dd084cee657eb1e74a1fc23a90ded9347cbdc366963a65e5798ebcee8e95ca426eb1946c4d83f2631a7d23b71605961df8f8f6e6213da033d715f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003593373f709203caae4323c865702a4d3402ed5a222b46f8f76dfa64207c13141f611d40bc9177364937e88b542a9189f49a471b00b54b179c6919cf657b02743eaf20b55feaf5d4e2fd8a2f0713a51eaf90026e1e45aeab4c0b2ec80876f910d48b5142a6f06a30c632d603f27a2f7d1222f1f79cd8174b917706cb9a998a75032b818c35689344767ab1ab78947da6a4756623350485de9158bf1403012db6a6020210bced545e0ed186c512a20e9a583f404256124bb0b4030a82346116d972c50a01803e84b3a5127a1a8e96acd4d906278cc031ddd91a81c5ce32c93a14bdc5da0718c0dfea0f9c5b72a2609c89de7714a77ac9d8a3494a68c4982c350055d34002194b553dc5c5b8a68db788ee3ca2950f0bbbe3dbeeebc8c437b2da8fcfaecc39031cac8a6d312e7bcc0d62b246edea86f58ddeb35dc4976a81a94f5968bf00848c0222d0083ec6b00f7321bbc5f47fbbcc3ce7797054c8d3011827d3f1ee2913b00302170f36244cb5ce660f5e9dc699b4344180b20cb94f032936ae3a835291334130032e8ffaa96be8de67fc8b2ebb9a2281846227612785482830ffbb842ad7d4e0ed9b6bcd4c6c21faa34931857d561ad3beca88aac445febe193a5be1d799f7a2147e7296e468df9eefeaa0ac90de8665f1b587537cd8f32ae44d104dee90756e085a7c03da7043ec52b49499484b1aef9033179822db1925642719c9ed480a6fb21c504e6171bfb4e84c1e2d713c6672b326409d327b6fe174935db141108da62332f509219075da865ad98f424ca8ad82a0043fe29813fc37fa89af7e2127e24750ab3e77b0a249f76ab83920b41a19493c32fb41a2d0679c1ee3326fa2ecff3c41b89d281c2833135bcaeff310ea72bd6d4015fd1e04c3238dc0ef656a5047bca8e66a36e489c576e3e8d213f4f599781aaee032378681f186f29661e405142074e71a971169ede2ac26a8fe4b9e07b60c39560a917bb1d07c81e6ae2d48af19d8881da12f573fd8169cdede727f327b7ccf2be48b03927c56bee2ae2575a3bf0743d48f680e01722b0095e40015fef3f3dea0c87d252b5a947b5e03b158962f4a7d9a603e5a1c19209a3d7885799a5af9bb945fbb7d0a223de0b1e72b7693e68d715b8e8893aa5d1e48758f6391265f77e4b9bb35eb7f26e5baf006498057faf5b698a7c1dba448eb15eb23a299cfa64e80e0e66d0e853f457a0bd5f9663c95e27b6062e420d5d60234835242b0421816025e0660626b2bd4a0d7b02a4f401d6b482fcb48a67f0e738848388a612af27a796e0acd324e762ae98115143c96d36eca83dd8391592fb52018ff4521579db817b68a097f4aec9632e15811e7225ca4c664ad287602499e9f6e744803fe651348d85157efb697df8046d944ec28c9c2d4042c82d22e4c89ceb445b8d8c2b98d393b609fe2601ce5145a5b885edf257b5d50a6c25fd6c16b61ae25c790bd9f6b9a0be69192c5caf5183731b42436b36bbb3c34b4eb236fea4b2b6427fba22681c250198576c44dc24a6ffff504543ba587b80d7342e6b0dc46e286dbd52189e41cb5124aca673817229fa86304b44005a2651f7d95f11ec9069f92a6b1a4455e07440d28d6ded9051122b98887021fa8626fe54db9ff4756e57d8c8e8c2224abd10521fb0391916f81a62fdc37bc9eda8160c2c053a31e88804bc469c864a02d680dba8340aaff79376fa0e6a0253bc0665904e6ce9e305c03a48b8592d0fc503964812036a08cabeff42dab14191154888809e76c49c82d8c12635b0309debf98b0ba22fb7fc35e26f9cb97b6cbbdf0a2519a55835b4b264a341b185e0501925e1a2e10b78b54540f70d667e02decd720b70610ab7d653e79a10db812e148d6503f2175b65531d507f6ae09520a368181af5fc6675d4dabeed29a0d4fff86500b5f6654ffc735b2cf278add6d023cf4dfafe2a9413f0d8a704f7757a22d72bcb8fbe85b1adfe924ed6eadb422e1e2210b6be14f4400f847451d0177c8ffba833b11f409204012140c5cf5038c7af63c3a9695d7cccaf1b90a86d7e773131d9fa9a35a317f29a8f95cd1c85f7eca02b110e6a0da2b58ff34bdbb08506cee643a30edfdaa2211fb4744f28fc9fdc6b939405cfaea05d0dcb93750c4283100eec2c06bf3d4405c3a759046ea17c5c5b2810ea4e6ab6e6ae886a7d82ee4a0f37df14a9138cf9e569185859e3ee0228f82f349cbf47f32b1b8633451d2d6c0ff41979a3209156260518b241b834ae7bc996b1aa420110e00cc95d934eab75a8b865f749187f0b2460b640f5c4c5fcae17facc8147440b518401bd657b308d33959997330fb4b5872804a514c8e022181017d71e4e771f8461fabacef5c72294f260d84ea21611df5ba8783303582ae7079afe4779fc18b123d479e36e56f5c696ca706", "ac5163ac6353ac65", 2, -359073691, 0, "d4ebc1c492bde32c68259c9b0759d9505cb470faf157a43e4349045245c00782"], + ["030000807082c40303be4b019c299d439ee93cdced75c9d4c069c285d9330a2957e484d7b00cc8c6b90000000005ac63655163ffffffff1d86ebc4bdc71f0bb662dc408a878bd685dd45f3d1ffbb4aa397aa136da46d420000000002000046f385fa8d45830e5c37e893d579f2e9b7e5b9a2a5b26e13a620485132f8c7462124dd4c010000000400655100c555303e03afab3f01000000000352525378b0e7000000000003006a65e4e07f0200000000015100000000000000000300000000000000006088570400000000d35b81b5e3a730af77d5c081b7bed42462ace0f0e5f455054558ff8110205460e9980379105fda23f7bfdb7353fb4c2f656e1a2f12a3a9316ec1054a67470c76ef08297a88e43bfec79216d31400c1cbb22aa880ddf18e3e7df77a313d19c5620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029106fb8f68329ba8e2a59bc9333fd782f342e5c9c769332341f3a7acf8556643f4b449cd9004fdd3a9cd3c6e15ab4eabf2d3458b7a944656dac4e9542bfbd5d13ff8adbb3ce85b86cf853263aa65006d8a4f0d9ca19cceacb32f964c28416ab1fabbbd034a8aa8b8695c702654ad41e1bfab309a9a73d913d15705c3c35c7f802097bbc22648f2dd518669c9e1ee19160d80bb7b6ee6e962e4fe7861a4958b5b8030418a6c17b1eaba79025b3e50c9a70e25af04ca45e4b64e32e7d040e88fbdaf30b083e33941e4967b5ca454856df0bb13223a978273c150a51546168c885e81a25cd5bcea0f38777292cdb335047edafa117cdd0e458cd471e040750f9916bce98022a0318fe408cbdf46ceb5921c81c4493c57e5f53d6fc30b51a8d8b655e3ecad3022a64dacd8ceca10afce8ce84fb568aeffc219caa5871892bae921aa792f57916032fd8ffbaabadd278b39108aefb209be9b6c6098358266c4184059e43bc1f79da031633179d33769748e8a0b7452e11e1b04ff27082a890e6c8676e35802669a5d50223496ded4b5f93bd755a2df608195cbca227dd3ba162520e63df5a3a8f65b241f5e74c4406af8917cf4934e37768313ec2351e01523d82a0c85ae42264283f0040a9740973195e7e0d1e9d3498a42fb7b5525575d1d674e4efed96d76c67128f3fbeec7f2ad71fd86247b87958cebafbdb61cd9b7ee858ed98bd98f9f1553d04338ce8b99edcd12947ca0c68a813287fedbeaebfee3960d08fb1d9349834a6bdba8a17515957d237af4835c238d16410b3d8962c41eaf8b1e9102be304303382f30e35869fde7880d78977f2229fc83b4971ca065e1396226924af73ae0df3ffc1422c2fc3dc5c45d06259bf5823b4f9f9050306bc8a25a2f00b96cb7e931ced0e842239c7f3390e4e5da780cd63ec6f0d1141da6a7ece4a3fbe7f4a9123cb6c0e0a6660419d937c411d8dde2da45c67384312f10dbcf6bfa6f98e5116e82c69d1b4bae94b421bd9b6f5187e49a49a9e163e57b292c5907ace9ed776343dac566d79989600faa9f69393d9a470a48aca0cd0d822d16524300db965314536e93af3efeb87dd7505a9b31bb7409e5dc7ce76c19fa58f83e138a1a8fb943d9392d4829993f92a9d86ab21171d183b5ff166adcf5260da494c1055ed504254c0ebc32e7b8efe815236fa0068fdb2755c4d072f8abd1c6d79a06f9d828516e755c0ab4b49befbd3a05a5b0aff29bb38eeb9c0f9f2fe6519ffadd4160f23a0d3c865ed2d24db2c1338a5d98db28b1ffb61edf4e1b1be976c864bebcba9cf6ab325c0c53f58e133d0151cb74c1ea2067d8f835a80b25adad2f518059ce0ea71300c111e6fc8a2a4321a3622be8f9b73b108c56f0cc99616a21a852b288580fa70e706956df6f7ecd59c4d37467841074c7673c0d5b66c0eba62198954ce01ac3b0bb5a9dc93339f81189ed2313580931749c0d905c2560e58c7d06623a961e61a9ac538fc5279ff009872ada2568c6f2e5c73c0f67857aa21376f00d209edbb6074e99c2026c911ba22d6a31055e1f0f48ad8870cab8ebdcc23729f145c92ab0cf1a7d0f3dbd4c86db883fd4620dbf9d59ead98d0e5325df5618c2e7441e07b8530d8dad1cca9cce14de170b45a2caadafaeb9041bc5b33079bcad628f0828d4b08f8bab672e8bd937177660f2b2eac990ce19d4c4f13e0f9e9f394a815534e32cddc3ea27ae86483b41f827f14bcf1a5e54b5bc66ff8b7fa3e6027297ff0d49758f582508377d722d16f62fd07b239e1505f34a4805e5786fec8d576ec4cfa847146c2e5010efe3ce57629671811965d225b091552a45a5b94352704725246bc40d7f42874a8d3cffe6a6baa4e64567106f325fc80e349f144fcf37a99c35c46f4e7dbd5917774c930b35ec9bc1619a0ab4aa06c611a6ebeae823e63caa5ccb403404fbccead6087c856314c38676b9f08517ccbfbf383442b2d920b18b959caf9684b0a7a68122e9d93f213e89b226d03e0a7daf7b7190fec5aac6ac978c91202cccad72b8d161cb92a5f3a5667f901dd70d5a929fe3eb9fe2fc4dffa5455b6906d2ea171a5782e1955ef8c64b9c336725d28ecc2a4d5805884fd7aeaed8a103d5c115a039f23c317c96bc8e523f73e27c753e796f36ae4ba49b0633e88b3a5bea27306f4617bc751311c895270b7b40bd6721b34c72d714457e4226984ea1bb344d370f7dccb797964fd954dd0dd7018fd1af07b47ea999c83faf5a528d70bb05c1e65b504aa66c1b17a08f74b3e79e5a63c782b00000000000000007d3cfa0100000000975a63ec7ccbc71dec59c7e04f86251c50a0eb2adec2b55688e7ed8c90139f6502a17178fa2e61018f9b4af7a1a044140b9a2192b6c85a0073a268fa0df6c2ad18bfb4ce409913f97cd63c01e894f2c4334163cfd584ab1e08a92af968b7f8ab00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d14fa035ac622df1b1a10aea77f54d06e3612e9de3d6c66cea4043cfea679db79b94014a2ec9806fe97bc4f2db60267bf8967f4f7570d9bdcb39a8d66aa4717e0e3de4a504b56a4d346abcb35a60dbb778c2fd6e2222ea62e9a04b6784ea3402f03e7baa69585dc47a3d218543fcfb2b2f112bba96e688881886006b67f1a1ea0216b1d05d5991cd31e97371afc08f860e039e44ecbbd431763519575026e89e4a02157e3a34ff0267dd55b3c332ac631dd4d4e879480169c5efe007c17d65fa2e3f0b033dab21b1951f733f8b7f1948d2899ade714892142bfece37593ecb77f594b1225d923a7d0f1b7fdbf997dce30918e127da7c13bbbcf3452a650d07e360f7f2021b95df8cddf05498512d48678646b28d59125432b8972faf5a2aee0c1f812ff1021d04caa479dd9f0f8ed03a461bd519ac872f02135295e1728400d1269dd16c110308f2127ce7d266823544519cc54da341422ed609db3c2ade910d077117450e94021819d5f46a4b3f480394ce465d65e0cb6549b5c05f797bfef231c14fde30da4103180ddab52e592d5a7d4a18ad03207cdb3379bfef60b29fea7920f13bdbd463dc566603e18a9651388d0a030ebc75bd25653ebc4a0f77a294f47a6ec77efae2f9527ecc7bd8114c8944f8ddc9c50ee86a5b6549ac43bdd1e0947483416dc933f2f3694925cca32c6d09f607053c945702e84ccd457a4cc737712572042bd87065df09033cf0c437373e6ee3092757d6a932a3a1c85eabcc5afb2d979f7d3309701f22c691e537c00f72cfa9c76c99580e1d7b489f27ec59c715a09902205b76856f46567d8fcd7027c3191f34f5018b2402824d3b52e999ba3733e20e74bdc4960261db51bea0ef7a1fde8c88300b1e484f992d82b52939034894976fdf8fc85823476dc9c95087abf0f7717395e488aea4aaf26d30a8227a74e71a4f9c8cb41720622e49f8cb7e01b587dcd14afd14e40713709a2092e406e71fd4d21876b3bec8af56cf7c9114bd2a910d13b1d902f31a9d4301f80fb33f3f574a489c5c9262cba0f95ed02d6f253865efc6a9a6c1e6f936db74571832da462e10a160a051a6e6cd96b58fd4944a9fa6c5de9a46065fe0bac29e2777a9c7255a9176bfba609b99ede7dce36595e9ce86e33d12e7a1bec56c53173c3fb59753b2a5aca8cbadc49112cb47fe0b78c44a09111aa2189670c983be682325c0de1ed899b2f2a0e5ee8aa23bcd9dec7c7ad9481216022402b09ac1df515ab687cfd2ba87cbf4f740ef81276a68e6148190d9f030e38c7d0d2bf6bd42e7aa259f57c1793dd0e5d193e8a8d27362e1a7cd75e1ff34a98af88587805cfd2474a155ebd621ebb83f2482c62adcce79f7ba2985c4f148cce2587b9050a70ae8042f76b31da187b6df83d2062397cd7ec08486b01d4af95e6ce143f673be34bd8c703cce3d62b68da41173179a46baeffe828e16403fece5795ab679ef7ca24f4c687a8746c68eaf4c52ae8ed25695b03fd52ab775b1e58afcbc311437fefccb979e71afc9e0f890f0c01ed786acb306d961c1215a7d3b77e768caddf263aed64a1cea637646baf38a9055a0f1a677b8b1b4f09a102d2813bd637ff0f7e0bb12146e49e697e96ea433b1dfdbf65f2bc0c1a51ba897259d11539790aa1a379029e2e5fffa382e3dc92b2349b30b4f95c5ae06abb2bf0523f94c4dd4c7acf57c1713c871a79ca234e14941f104a8d4be457aab32a233577045c52a5c7f57d3cc5a3dbb29f6b7340ac2aacaeba60294a33a1716046a7af29fe2f00d0ed64ee7159307211408a8f9935cb2f028aa1d0b21b5f3217966ccb3602a7df0a4d22abcae81017fca670717ce830041cae0dd475385d652e58fc398c865a09484e7d9464e7f8c1eb7ef05c154a467474f3ba75ee55e2d1de06dcfd676e2d220112842424e58c4df9f1120735e2eff66356e0bb8dc9d50b8996735249e9ce4e819a4db1204a1ef76faad2c191f42fa1396935954f856d6a6dd93969d88003f44600fba3fcaa81518bfeeeb76d33aa4298bdeea5c7a17e70361b0818c47b94102312da84b0fbde3c1274738eeb15e32138d99a501fac5d0485533f0152a98d96214538d15359074293f8c11ac02090bdfa43c62c3e4c8f46750f463296e00257321f65803981dd61c4899bb2cc4f6704ece798789d149462e27801ef0aa3ec8237ba6211e244494d8b1a9b7ef67360d93abc8a761e5d0f60fa5104e7ae9f088977f5b7ebb0831449075996ec5d4643719630cf4d330cd73840d37a3195f44f99815e30f240000000000000000d5d2eb05000000007b72161478779598c8c36f5ebf43027042a8b60a5d989f273ac706be206f934103b92b9f4bb2cea9e419d8ddd54ed83e6c72d13c92b41dcf16b88594fd0a209e6780c7167ddfaf8b89771ab887a834383920d6e9cfecb56decec9aeb2e99cf9a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000185c44fe8221d36a49bd5d592b87e3a7226a25d7719848b87a6e52db87cddad921fd8cc2dc5932f25f9f9bf09a64efb69fb7a8dcad2b7362a054eb069df9dc98b89de76aeb808c1b278967ad6a034aa6fabb89ae6d2a1b97c37b8faaf993f795915595da23269041d2cfaa3ccbb68f0cc7eb5c04dfe8342ed43cdb8e1cd29b64022b7e660c7cbe11cfbe8355efd08e8d2bdf72669e5478b248321437ff0a7402590318611a574ea60fda4cf6a63b22d56339ca709b72d01441caf72fae492bd7f1c40a07e2835d8657a799cb1f102ed81d694b99ecaf5ec8b1dd9d830160d6d1ddf53c4adf323c9afb355c457928d7bed1a67c6bef27effad76a9a68b6b98e898ad0a8022e07c8d49b6bcf127f5ec841aad7669a7fbb3001232b7af93414153e814c4473020254abf5530065462c8675002bc0f98eca22117f36b68b777969ff21d22d5ad3031aaf04056d4ab0168c4aab43e899e706c4e2e1758e1ceae0b00b567c1d5a46190220695114c52b173badac4228cb41447e1abfbf1276a51b53c6c5d6b49c3e39920302f30f2fb2f8e606378e984c72bc980859810d78bd7d778896b509a8db008712c07163e3884c956060944d832ab04211f94b7a60703509523869e09234c12aaab260a953e137b0812641df8056299c93b192c76b0a40c75c315c39f26695af127b69fb3ee439400f7d086bfa0973daf95cef92a8222265dd64426afbfa731962c446c092d92c02619ef775d00483941c553a826fdaf2fe6a27a22cfdb611505cce41431bcde0125c58ebdd5d7224c3e2adc9ccec212ae29cebaf52ef805b3de56d9fe125b704ae2e0c50ff52ac33264c1e66bf5056bd05dec1fae781cb86f68ab6274a4c20af85b87ef970291dd741e83897be0f5d909c0d055193b3d2aebc37a4668864bcabbca01707cba8329de171b2eb7c109415629dcdbe40b24fe9eac22d6e454336bd6436e78618f1da5683b4aaee1f0e5bca5e0840f9fd9e698e30a0d538154570e6abea199d258b2d3000737364a109ebc190bf28d3e6bdb968dd639956abd2d68475beef379c94dc62541e0d3d1a48d819c3c02a15f32a19e0eabfe2cf416b864ca9954160839500fa6f1a409ab4fbbf0e4280b6d8ed21673907d92302d51b855d1f95007850040202bf1f2f96443b9881fd835fef4b3af8a18811579529a45de5ae7d804aba5167bb860006cac3b0a12b2e3ef4c65b9f0d98d6c1f287ab2cd37a955bb8e15387fdeff77257fe91693f8b5e1cad31e80b34e5a751971952afa02bfcd9e569d65ded4579b93955a4eaca22ac856976439078b0349ec23c41ebd710a59d81260a0cf458fb6fbe28442ae81e19a24c157e32c61552ff1b9f2e4d32ef238f5a02d0f1cb6b6ea76076b0607fd6ba506e634eb9453df46861b91a7ffcddc56378960b16b054036e08f2785172a5bb64e5db3d5da9adb65e231e3c159a192098330c66022428210d70207dc7812f6f9c2c6310e3da4647cbca8b7093674adee5ba7ba1d85ba16438b5b4c0ad14484083ed19ddfa0d6078b711104a4ab3144bcdeadd9e1aa027a6438601fe1c93af402b069500b089ffd9defc76ac0dda692be464afae8fc478a68b7e29ba517b2e375c43c8e2600d12ce2e008c64b2b4f6b47d94277467b20f8a20c41e2780ad6428e971d7063716cfad9e5c83c1ee98edf12bd560860aa69c083c1076d99f28dd91b68aa19aaf493bf6fd19955553e449d7c025ce17b9bbfe34c5fbbf17e0b16cceb040ac62ae92195c5c63017063d9b30ed23a45f0e32fbbbe79bccbe8fe94fd1802c32f13c08aa5df84d0ee02103083b4f65f6622f20697397ded4bb5605a432d6c8663f7f7a7c9c46b30086216b6a36ccb6cca52ebd486860130dbfbf25213f575005dfb5b25ca0bb84f0b55e12806f43fa97ee855abd3be07a5cc7ac805917109346e44e08f7ee6f06f95215605405a9bc87ebb573f327eaf03e3ec33d81e385e40b434fcdd95f6327a58c0862eff4186d7c6c507d132eb4e7223b6d0e666b0adc5902e8cc1f32edd96e53de9c5a539aaee231501a5dc6564727a2c62b7ec5da5f98e89076d0cd1e2f8828372b81a92a0279f0807dd41294890cbb222f439bd4d7f9c547a5c479a1ed3aff2f52c09ca4656587c2e175595160a7c824a977013ae83045bf5e488d4f00a8ce6f3342a88dbb26ed6fcf2ff655eff4c699a78bd2deacc119950272300134a6e49d875a4680528891f6363a379a2339a5a67d2c0e0ac0b12f2efd7311ba1a44960bf770baa34cf0598d0a57881ab6c1c9689520585b6be68ee04193933c2a24abd0bcb19bdf8a75bce9b6370dc922a48d90e1066501489588d6f66cdef53341b7612d1a041869ae7e63b9b540a2fc7218ad6299a31b4813b89f54a9d0ca6dfcab484fc5c84be185edc67968f8a950e00", "6353", 2, 1381533410, 0, "cb7bf268bed5123b8d9be13564e4db7a0f2d207290a875ab353a597da81931ac"], + ["030000807082c40304227940b7af6cd7fa598b1c7ea4d77d67526085f86b1c3032103c5a7f0713c5eb010000000465515153ffffffff06c647aa92d3574d3100c7f2268e40059c49141263de8a31e08f9f277ccf5a3d02000000026500ffffffffeda284c4816f150d8a030590767a46449b110913a017f8db83f5e6028936363a0200000002516326d27b72c618d5adabb7a6260ae63a7f0d23e19b6d2c0242eb3e344cf199bdd0153f9d9503000000065163ac63ac514d1fddf10416d0480400000000046551536a8e831e0100000000045165525170feed03000000000465ac6a008cbb4a03000000000600535300ac6a00000000eb388ce2030000000000000000e9fffe0400000000940ad60989d4626f98d953a353804c047f4fd88e2be3ec7ca0deb16d942dada056721422fd0b8508d8128aaed5dd5801483eab7c3b4b2d164360392537572c8ab556ac6d8ff8653d67fe1488cc4adabfbcfbac3da2a7101b20842fc52a84a3890000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069d1a6517d1a02ee2614cd08e585069bb8e4c4d8916a7ad3f49955b2ade780143c1d1d0dad021304ae2f0409d600b4c446799d8da79406b661e2fb5d4b9612a69120ecad4a313d119a2126bab210c7a686a28757094d1400e2f2bb2217a8ddc75b710761ed9b21449ed7cd1bebcfce37cc36075299bbd12006474a842dfd328002243d83429fb13046e73dc100b3abeb286d4cd6b2453b54719b96f768cdc9f5310311a9ffa8a8885f8d93ac4c5b9eda23accd4de8f0c0e647e046a673c248d959d70a048502470ca0c7ff15795aaaf6e745dae6987a0b252c78111c173f16a5c92b5d54589179d622358b8d2ae5c60351e981b6df9ccbb323613d1b1cc12d6162971b02085b17bebbf59f246f7ff5458f426fc02be58aaeed62998d3ab067cc149fa52e031a36d0cba21b37f8ef5dc82e493faede82bb0c1615e7f419130b361b38aa75b10329354ec177e2b87ce8ed3c7b537923be3194b4b72545d9d6a9fe1473f3bd431b022c31d741d5a320de2416f4360e1b99287b125d04cbcbe5ded9927ad7cd521bc8021e1b5f04a53ff0376bb29edf997da63bf268a1d496e053e7836e0b9791729aa3f4c2284c8ed59d679b5728957330d3bb1d3a003968dca7a660d01437fa9d2c06b0624d1ea38c35a7015897641b5d4875dcc711e4b8f9178fff3eba45ce259e2e684e3a4193ef1fbe502f1951ec173c7fcf056f11d59ade94fcc86bfe19d89310076822fb3ef614b5bf81e645dfbf1d48b76d568403d1b043a480dc2dbbd07ce2ac432623a999057d0e0742563c8a47954c60b70a652152a59d6b8a8f6112cf6f3c4b40f8261bc50b7f66b3bb72067e6a560bfbb247e7e16e04cfeaa6689cb673ac4de3095713f411bf1fe5137e6b23c6fd6a9839b604398df2fee761c7fbc1fd7461cdd4e253cd83d5bbcc52479da6d3c0011998fad96b44e7dd27e2ebcdccf22b9593686ff89efd636797acb6796a29754973b1a41e5db9fb195138377df07eb1422a8d7d871138557539ebf5927f821d597d2434f4103a1739448df065a4b5c92c9507891594531aed390a7f305c202c14128c2dded3104c7836bbd88b31b36aa93f6c10ae5a841bdf7f14c691931ce7fa3ca300c22804ab1b5929b4d59d675b905cdee606c04b1de2c8ba0b14d1dcc07f360c8128a140bf341bfad36f2ce3616d934980af1a1890baa964533505c1b3bc7292e7b18b482e7fc9d3f46583eeb2786fda00833bdaad6c4bc8e989c6f1ef4efcd43e3fecb1a0731218c6f9c596ee24c019e90a8ac5c172395ce5d78528cd1e2493fa104e12882a263b25de76814ca2eaffcda87aa53bbba57104d6261f3ea32ced255f845a9c349af68799b68d192f8e2dd637f132b996eddad9bfb263180ce9fae488bb1fb464425fb404fd2bf29d8e15e8ae519aec5f966cd6e96101f79b954ec4179219fc15407322232497582ac90406aa592242bb33a6a20564bba4be0dd7b4b58e9fd25e1606698797fbc19b1897b86f7daaaacda6476991f7adccae52a0af3f547f1d2d5a9c01578496a1fbb7d3b7736733958b93c2477e5de743733fccd901c538c9f4e08844fe455dc560c915e13cd86201dbf35b17654d5b3e942b3bf7b110087a8f10e89b178964a42fb1547d7fb6c0509cf4bc984b944ab791ed3936de2f8a69a990534c1350a8b2c64a1e6198bbd41fab7ba6d3bbcb6f4255dbb496dbd0d7cc2ff5c9dda4e31333d34d09ccd5d383f6c37a1b06dde5f6516094f414cce03fda117fb83d046bfd53e4b0f911d154baa1e163513f64d3040164de3553f443ae735ffca215c574a64a1d66d1bdbbf3f464cbf05cf5d4c863c7350f250ca4db97f10e15e3cce23a5e367660dcc7698bf04fd7785b53e7ffe903dcab388df9bd164b570fd8289c826d801477e7dc167a1bacdd23f51855fe3698ee34eebafd63656430a02017991323d699ddbe0c40ad736b6f5b0d9afde71addc1ba03ba4f15c0f1e10591a59cc78428ea3ba543db6e6a9c91a7032f1cf78e71a8a39f8b1fc2589a1c0434cd3882058696a00b6ff67d2916bd07a79815f8a0be3266916a994e64549fab60333c706e88c6f751b9cd495e0b3cd2da8ffef5b443d30fa792224fb1da347a85e8cc5bc9b17a39c35d1da250b757e0f421ba44b6a68faa362f92dcae227cbf02e115a70aa790c951b827803825fbabd017069426da8b9def622d6def57aa274926623877f86e9aad3980eb0d4fedeb4d297144a243dc40a46003ed212c1073b7fa3d3ca38001e7bfd75d384a17b5dc092ece3577ed2f39056604000000000000000000000000c554d7f95f42ef7260b4662b2803bf14525fa7f695939b096550f7de3243c676a35c61f2aa0af020181369611f104bd2adfdf1dee0d020ee1236ab492c3ed6df695dfe9d2c7c9c070cc898bd87076f2a1e1ca57e14e775103a8c9b7c5bf2d40a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ba2c2a31e0083e3775d251f594b221dcb0da6362fac9071704018d6d330f903cc7da4e76a252b2d838f83bf0ce1073ed2ca9b1c7b4c84e6d4c856bb661e87e525a54a430aecd1e159ce9bdf0aed8f11930ed216f241fb307168f103498dc8419aad1400736bc12638256e3f7baf6ca0ae0f681162c56b56767861aab91434c3c031408816dfcf9f3fcb4af6749bd9e2de381c7aa1b20cd0eaec9ed8f89c626feff020f4bede887047fdc194d49533fac21034b48d7380db332f193b4c2d15ab9cd280b0615f767b0d3525a7e8f0da0763942754f4ebf1fa3e4006fbcb06e05d624eeeb4c9888e9baddf72a891114f8b2163bd4c52454b9920b74eb232e6ef32486418c030fbce0743e5cbec4dbb1a6646865700feed98d93f162462c928ae5b0b532d75002294b96be4715ecfea204a1a7c3b133a7a84d7b92f97ad5ce5f358a938e09e5160204d54d6c562327caac774cbac2ccfdc0ebda235f9edb6a35d87b56f4ed2abc500329d0190510b052c13b3bdd2d19ae5bab0993b9b212824fc782a00ddc963639cc02056abe4390a6ebd747a4c9a26226fc3d89c8a180f7d72cfa421cb320f537a7da72934fe9050da7a5dcba19beded00d23d9bec4e4ee5727dd1653cfab5ad36c00323192d13e5d85586fdb8decd41577796f991bbb4ed68dec881010e8ff63703da3306e99c8c5271e4d173a9aa24cf9efd6431e497c70d0493a1f4380e2378f15b21e0905f4e57b4e3c93b7a6770fe973f3f016f862d83c01e049f336a972ad1fa7f7ddadb282bc779e6d8d72e9dfe2b0b35adfc2520b24050c59ef5024a2fa065b56231a4f02f3830f208ae3bd1a4b7d269134ab99368437a4774bb3f7163adb7bbe5caf07318cedc07a09cb1a6b5b10646c3dd641bcdd1f5520436f051f0d4ff816fe45e6aa452dd286bb6111cd35f74b7bf11b1d0e9625cc0add2feac161e350200e6a12abd37f21f4ed3cf73befc2f405a1f96aa9f2168bf0cec2e2f0494c68add67781711ce6bd31d2d95755e8aaa4a2ad9c7138ae2e39fbdec80e549bbedb779c89222fa1041656f5b57f8d417a4ae3c784e136e7f83bd3c7505d065d4dd554dc0aca966743dfb4d3ca0e6e983f52eda24742f5c812165885925255ceddec643a82afbb28088dc013852fd5655fbb5658768c9ec3955bb60be722a8d08528f2ffe62e492e73b38e7a895ff4b63dda99f552257c0a1d8e1c4149580c6cfba50e51ccb56aaac3659763c22638649a571188a0f41c631a7e652e6db0328989aef47f99baad19003b62c06190b233e9dc5079d4e0bb3399ddd0c2a9c8b9480ee4cdc0d59f12be36cb0f5b452d877b861b2beb69e6845f1867ea4eca01c9155cbbfcc3cf0b11efdad2f605f2d6b0fab5b11cf4ce953a2240dcbd5400a534b5a56a233fec518784dc07a9dff348a2ad8e2507ed5dda3b25fd1f84008ffc7b883faccffe4ab65123d5c907af5d1dc9724be1a8f5c2a96e202a772a561a4030d9e58328e5f79fe8de8f9167a7366d7852d46e7c5212f8ac189be3665fe80f61b539d16e93ff7dd7cfbb6cecc2f894813cd248e249eb50b38c55422dc3f6d0b054a91822154c1c7763f9d5e1cea02fa786572cb514efa438099a1acd31a3bb67df940f97106c82004f95280c1cc93a016d66ec740c09f9b14a3b75edbf8a25063a44ab076fb5cf2ae7afcc4f01c690be1ec0e16d5685082a76761b740ab71c5e45e71a0f34221ebbe50493f60943e40d03d67047c6523782e35c59ebce9d86b11d81c54df0841c3071be9a642872068f8a3da5c60219600fed0f4591d02b39ebf129bdeda265b939d44338de50ddcba17f7f220317fb16c86c6888e4b6bf72da60e631faa30d2837f077e6f7b2a462a86840bea8ae938bd597b97e8d248fd7e2a56a1a9d72eed7decbd049fe6046f1865a8910e94535e11941b56479e9b1a5dd6ae3c52c3bd21cc1e3f020455f970ddbcb7f8cb64813df1b0d6df321659eb939eb1d5d216973c5aaaa84efabfb030cb07e09802c952509f9ae284166887cd18c5e76e0977797c32594ce7169306aadd7f040325bb8f9d70695a6fe6f43dd67c6f0d360f9904a0ce452532ce3bbaf1fa72bfd22d403d9441c685d56b278cf83f1e6c755bced6f22c7e040280cf02c301f1272b3b954c879e8761c59591fac04b7fec4b8fc43e8016403fdefddd7ba55d05b51c3df72f1c11fec22569a398b5121ed552d70034b835b469a2509f0eb9779bd46610214640bb0bb662ae505fb81f68bef137cf46eb5a60a1260c2644752d514fdf9e40000000000000000700b0d000000000008c92b660ba26315ce71bf9cc36a03c41f5da181c79a24b9e6884ba4a10f70d5b879995213c6175815e22cc6b8e9a176997139ea4919a42261c339a2317d0dd82819b0dc718686488aa86771cac4e7f7d82d57961179bde1f91eaefbd2ff08440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012fd027d3f97b6689cd447841f94bb95ce5d7c4e358f2f2ea752030c67d8e3e4ab6ff86dcc6e800c1f939cb76260704401433af56c5293806407691b28cefc51d97092fefb8416e3ee3fc309a5cf4e0957f1e0dcd7159c9b9efdbc94d705811105622f61ed11958573dee78f7571239c7afdef42801ecb0311b1a51e19a0555b032b15a72eabd02c49aea2161ebfd4899cde7628bad7f4cac65adddd967f4da73c022e3928ac531b38e41c785094ed92e377791ddbc6f8dba5d33ea98ed92757455d0b00a01edc8999b0a1ca5f295f63c5a0e49369f86b9ce32e6c4878ddde744d2b2b7093996f35e46f5abe4e416ce025efc6d82385f7d6afd1c4d5d9630afbd351890314e32ce1d51e65e6e051a3e0e58216c7dddf5d3b07c8fd41e96d848936c0787502182a843fe3ea21f60a8c24a56b638599aaab8b16a9d5f42097768b3462ac173e031e035d771eea01d2bd1652093bd49d7fd8c62aae4a85e838fa112a8e30c60038020877780801d090de81e7684374ff2e4f094b0ed8c55054744aec64444da5a5030212247c8ae44760a9f823f5d010134fb5aa5de29225318d9d16c9a7b70fb9aa86e0c633410a584ed33bb0ced0e4d5359a87d6ce92450cda672ac8e927842ce08af12cbdca3f1cf8efd90901b579a4c3f38044416e0651516d982c0614b0494b3bccb02a3726321c9aabf1708afcda2a7345436e0822a7b173b392e3821097fbb3b931cef71164009883d3ccce24f537d084852c43f97e7a0fd0f4c6380e4907d7b45637ee973f6134ab1312783f3de2f01d5eec45a86990255ea66e2b4293bc84f5a53cae5a8e433c134bf52c68dd12b284870053b91f20ad23df2c747096702dd0b847008f0f385a2c4b4b93d9a18bdef4eb436dbd3dfaa73831ffe2b9af29c739ac550790f7f683adce027924af6f7e2f16ccef884b61978196f8ad8eba92fea4aef2559027f28ae64910724c0dab9e75ff959f519f29473a63d1a9c35823ff562a2722492f976691685d2e20ee6ae82338239624ac953d70a6c66484c3f6a6af4de35b60d5fc22587ac4def739ad4bd2d545febd0c79a226fde21b904471247b8479c99363297fbc2bb6fb658396e3e8f88f18189d9bc5ffee9a519dfda93298be8fc2fbf507eb780e80ab6a0787478e7afa58f80282f9192f254ad83046e0cfaafe44845254c8dc85c76b91a50cab864404c705447eadd77b8d873db7079f2fc322b68f83b0facd4cb914eaaafcbc51ab6f6c074f8f9b3326168be89c55373fe85e54217783766ed2f09fd1ccf5dc5092698a253c70de580ebf0d6b9755e1158cac65ee04a0d72b9be3425e626413b8451b0a344f4b8f1a12911810f50abfa204e9810765e380aa0272c6e60fc6fd98ef75e5dd18077e6dcb8aafe6f6536f426a08d0cf28d8c9c3677f2abfdfcd767a335b33e1fdf5207cea56085762cc78856184f604ced0262771840f1fa05dfd63b7ffc0cc9ac0bd416f3824dab333e191e22fc3b91f9938c720c1026000daf218f83f4fa3565a5cac2f2cf12391891f60323cafcbd713a7dc501c2aaeef79abbf6e0c85aa05b7071d88d62e5a6e65b22587cac70ddbeee3c895b95e0332d3297b8a8045c68700b19ae50631754eb8054d2db554a79f77c14a290938bd735425ed5b07b9490614074be003799f678f5dd789a7da0b1fcfae6e002eba140bdacdf700c0244e1101f02bf1126e8e05ee78e4591da10ce3f5c2c1609a3e0254c4480b5676088154b8ac542c5fcf1a0091ecc4d72b978f11939c610a04ac58b3f7ba47b8b990a49be6d4e325426b882e03b40ec3a79785a560c8e590a84e727968103c2cb086cfce506ce037d3c9d86f5ca040389050961730abd248956d1525f4f1aa34e19b053686f2b595413da2891c21e177ad330fa391a295f5598ea0cac4490cd348419d90f7ed5d7512f88b4bba3fc1ed94d49aa5bcc3bf6e572c007873143879ec83236f2e689911e334145235ea1a13fe783ee23bf9a5eba42a7641c358aee57a0aafa5fd1ce786156875fa7a1ab9a11faa327535c65faa8c9c04e6cc6972cb178d71bca1afc85e1bd88bb8345eeff9ad475c2e0def93c5cbbe100ab9d57b00e191ebd733972d57d7aca1330277a45de6a14f5524d272c343670d3f626b0c7994f8cebdd92af3341796000cfe722aa528b3b695465b6b79cd7dad549c34ad2ab851ee806ec0ae87d04c604e230f57e2eb7d1035b3d7f3a2e7c3b3fb41ffb92ccbede3709e2a6bb75a6d544496001441e83cdc5e28ebcccec55330cfb3b5ee90980b0b5fff901b06fc30459bf6e9d7091e6484d640179a519f216c4575de3cdb7f7533a0574b72a57b8d1cb0b8590052c07c496fd15db85f54b16b6bab0b0a84e7564e7d2ef5c250053e84617c7383d265384ecfedf668d536fd6232ac30e006", "6563005100ac63", 2, 2108154866, 1537743641, "5780af7489f22c27e42af9b26cc2e0acd2b4c3632e22a3cac66bcf54cfc78ee2"], + ["e913771302ece7c6306424e0bf065a8ec31a9761bd7637bf2d6e8961e1fec2b95d69aecafa02000000036a6300ffffffff67c0befdb86011def9920336669633a5b882f67aa9f66553399e0bc199f19b090000000003516500d5e897a202f988550200000000007cc2c60000000000096353520051526a000000000000020000000000000000ceb79c0000000000a472a979f454581ab1664648ff39eb01e6c769cdaf6690338cd3b43496db2921b2b87ec8589cbd4db8b1caf4f54a1d7c67f1cd4d00d7b37f62d3c2f8319bb09acef7e51d20e22ff0b594e1d59a1b2ff55f4b845f35b515971c898f6f4e027611000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004ed531e1e5cfb500de1e1a1193a5f2e0735585b78765f82b0e33793133e500cc0e89916c9abcc62aab64bd34df6b9ac6c7f2f091eade6d5e87dfc931f8b9b8cde3796c00d3596b134e9ba8e90e0a0c14975055f21a2a8d952d91440fe409058990a4382f86bd324f95d39b79129cffae7440009f614d5be9bcc357f4288920120329da5c5353ad7f03b55c6f51a13e0103caed212cf5b18c46a5bb10cf47c85f920204bcce8c9c8c11b53d145bb70ec8664e506bd3bddd524820efb504ab036061c50b062062f8114ba9b175238ef823159b1fbd55759f733e62a66a185113ba10d0d4ea09949e3396211f7c3a8ab33bd8531408cc9061d2e6c0d8af919a6956e98e4c032db039013fe0eda900c3f175de85464b6a765dd1b91225e56ab0b2faa2465dfe031ccdd1d839110f82c5c0329edf6750c014a9df4beb49fab74ddd7cff0067e2ec02013e5a240a26c9ffe538c77c2fcae43ddca0c53a8833f013138cfa75a58c72fb0201003b913d2b72a254e9bb9c41b8c72300d073c123ee3272a4f817627545e0360326fb916901c802a36bf55eccd46d7d488607d0e124ae2804442c4d86e0f88208bfa59401ef2f23bb1646eb39f632ebcc514ceff9f7aaa796f9d0536976380a61582e48249a8263ceaafc019e671bf69fa340647ed483de18bb22c3db816635a17b2b71297b31f8a652431615c39c8e74f55c33603988c277fc15d8f3c77e75054dca0b50c534af6c67f1466f01ecd688b23800379d7262df99e9d5e3500d45dbdaa51393fbaefd9f7a043126f0b2f0e6d0a8b87344f4e5049d919a2e5ae0332739d8b215764a4b4c32a5844aa2febaa95161ca1141a76cc342e3bca7ce7dfa02b9970fb3ec5b076f2d53ac2c7144c25ec0d78f709184295f4f7c2e6357279ccdc541eb22cc825ee10b376346b7b47ca5774b843cb7ff89133ff362c29c392ebb54f917ea60d4fba7db1d20f6dc872000d810eb779c4676ebfeee9a51bf9de72e2e447df7452b5cbc86f6eb7430f03089c4df1ad934a0b0c38365cf615b52eba9690280ee146279627a22058e968d051ed0d8c3bfc079f7fb5afce8f95853b4f3f87d7feae286e7ef26e61ac6c77a731b95c8102cf085e5350abd6a6c506db15eeb0af1fc383f8c5e6a52a792cd13f06ae5186e43509ae609a2aaa93cd0a167c24bcf2f88fc82e1a06cf17ab8b279c1d56551a382728d220c7b466087f82a38c6fd3766dab78468aa3a7d10aa69c723d19893ca303fe2b5eb3a710f5bcf264198fe17ddfea69ced1c2f83407ef3eefecf42accf7730b88213ad30ed06c87aada3e4c54029ef5183f062a89d90b556a18b0228d0f666f69fb38780ba2aef5a3f27a5fc8959de91bca58326d157515eb0483c701e64aba6c7e249905f9b2392fc31f0aaba6b0c0fbd9d708eec874aa90eb3acabe37256ba16f84f5039e056d865b2780191719d3b3fc576bedf1908b49612be2a3d67adbf3e6381d050044c4f5c728988137242b5784ad6c64bacf5c676e45e09cd18636d870aa224ab362eaa6bf93f4a7a2084f0786e2939c7bdd0c065199cd7c3234b3000b5b42d5ca91136de84b46f2ca356156d001495930c1fd34559b85e5137e0e6f04d0ccebfaa9a6c500f6bfb043b759c734a07e476717128d1a7a007e1c358d47508b47ac08aa913afd5ac86ae6713063007d89eb03a38017edc75a4deb7d87908d184f319e1fb24af548f624bf9fb8c4ea784fb7f72a897ffb91bd1e6448a8f957fb5c81bb3855eefee9313b094906f32ad18d74efadb76b239ea207e46fd4d320806753f95a895e3d7be70a9156e1d276681a2c2cec78c314779744caff45f2f0d7963bb02fc720506ff345ae504e9867793ce55e2d29e914617a53b1cfb2903e55350df9afbe89ad82ab1042903a7bfec26c1649fd41b9d585a114c82a3c16e9ff3454d0ea467f684b51e901f76b8fdc058a636064b4859d7fd1e9b1d7dcabb7b6ea9805496f15b8e7bde2abcd5679fe384661ab794fd5590b0d3716c26f2d99747553b73514676cb5fdc0d0c1bd9ea162e4b751c3068d248baf27e8e613973625d85ef90926a96f2bd56292aa642c2f5ad4a37e554ad80814721a2125fd2e13badd1c6673a3eb0e8afb476780710b66758cece512dfbe8d1e14cc0794133378dd58208549f4e4f50c9ebbadfd542ed21063388c3f20ef233c79c28fcbe92f08503858765d1371e85bc29bb95aaca50848550c8e0a40cf3d6c9faa5f2ca78dd751b3e999f342eca76ff47cac4e8f18935872d5cf3129ac85cced300000000000000000b96cf030000000075c126a347e0675975aa834606bd4b60cd56c72b8329f7ab31ca07290ac9cbdb25c01bbe862e0259c1f17750e18268ac2b737af7f910b45df4450bcc027f274d764dde98f256b30aa388cefeef7e2d977c8862cabd790dabf18afa3470965a0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000628a37ab0d913b2d907a2a25d85ddd60ea63259b6bc39337d785a14c662f9c6df0ec200025206757bc218479863652f9566e5f2768afba27043ee05bc6dc58403dd3c419760e5a887eabe00f19f2c141835b6758d35346d39284af9048e27eea6f9fc67de4c65478526055e44852926510c61cd0bdad912acf9bc6153c4ef7e3030c8a78d7f4fdd2855d93eac7c1997779a25131c798d9f7e05f265361c6f2aea0030e4c74e5ca96b11ca9447bb7303e0c06b14cca397c2f557f7b9152d4bca22b160b02465cb84efe4d05f2d6aebfbd55604a28e45ca84f65f4a343a2a9b94da0118273fef70edf51f3851031bcfad0395c2ca65fbd57db4e6764e3e903de97f7ffae032d178f13568e6b7aad6a975f2681d8d7bbc24a5a28bc06a89a4d2d9c029620d902304a611bb2cc852c5b8df655cb922db3960f3c6b94ef4ced3b39a48fe73d114a02129c6d8a5810e8f0dad8f604aa31bf3079c03259fb66732a397e4346207fed81020a711db19bc8bbc81769c3a26e5bbb1183c615ca8bf8e91b1d6716dac36646320330522e141b3bf5509e6e4a3fdd6b34a4a600a83f351fadf3db8c7dc936f1d72ea00336c070a2be2f58278e9cc4f262fe3b9ec7999a59e5bbfa5ea0578239e3b0100353fea9fec99aca5b4d7a7514369045991afe5e21f0f02dcb6c6b9b50a7dd63381e1ef2644c31561eb1d297822d06075362c4952a93c6ff9da70a6853e7611eb19359763283c81f2ebd76cc8e32bba81343b87144f0125ec6771e6858b230bc32963ff0ccd80b29842b423acd3458a1b19e88ebcd74e2fd91b441c9f126dc588a9c6f152694b8e21e61a1c9e3dbe6c32223c19aa0540e43c369081ef4206f4b939d4359da50080d0d3a41887aa08ba2506d4d4ab627b0298de398a0d1ecfa135bf2bc0f26367915922c8ca0f3cc83474757747642fdd95393b2320704374606409062238fe5fde29c46dee7c69ff455a97cd9d489df44558d0d9d565a0db8a97c46a622448ce593b70859ee0cb511be81dc172e44de2d0fd50ea5eac8f3c9277519c898ac9395d87b2b13edc7f98c23cc4b137f00c6da0ceea1662a3079517690571e232b1973f46bf912f4da21ac6b5f127573523f3cfd3b81325deeacb7965ffd76cd99d7d03189a572b918a162f211fc1204bfd16067897a143deb62f2a976ba53c0408d35caffb45239e5d19204715988f5adb6f143bfd29aea048cfcfb0dbbd4b5107766591e94b8e971782a585965106cb870a3a6db549d0ef41fc2daf8243cb0ccdeab283c7aaeac4634acd845912c91c46625255177e8ed8360ff890d9e97447a2050ae3185a2f09dd59642a6ec30369826e8a7799051792c73793eb5790d1ce9c4db274393bf4753c1f22f5181a7578eb03c2ff9eb42cdb39d42c693b445148beaab9dc37b3a214cafa98dcfe30eab999b0d21c831b56821d7dc973c2ba4ecec07447c781946b0c8fb35e5ef1bfb232fae5da5a243965dd288d21245bc3753e42bf47eec4de420ca7d1d4a734400858953ce0703e7470336ad49846b21e3a0c7b40c7fe7930f2a36e65ef514fba66e8a0c75285d2750e814edab546cb535ae60a782e9aa4ea7ac08e117732025f34fbc6b7eb942135a1aa3e8e3b1b4c669c4ea77a3580a8cab3e11595fca6ba35ca14af125b7eb42e69e80c0b3e13937c923bcacbadd2a2857c0bd12f0278421d6dfbc889e7934c1df5c7261bd1f39590f910402876a8660c6e6cf1ec71fd3bbe786e0e8a3f7f359d9b2b07a01731d1f8940de316c6deed19746278a77a22cce1ac15c2dbc5424c722ee6bb275e2a1c7e8898e35477ec23a208d065fbdb6687782468f5417e63c6f0e2d9464bcebbfc68387bcebe50a3647f63dafbd5bc9d6a5bab247f22ccb5da8624e01196374a5a01aee9cb2ea8d98950bfe86f03ca8a0138df7672e380b97c713d7f8a585d4ee45cc87cf85228bbc6df74ef7081355562bab72aa1503282ab964702134412fbb7ddf7f63e758b29fd519ebaa9dbb7841debed4050cd2cd6c5bc8f443f40605f5fe2957eace39c929068f924fc97d239868bb55006e407f06f5d2be7d3cf6eca38c2b36a1b6ce9c63c2ca63b6af143c427f46bc64f346c5227db5cf8720aa5e98191490e0f31364ba9f66f3b28524436b676c628d46918d557796dd50c8cf5b07139c2912c93043c8364a179047fb7d449fb847d81f436affb89aae69d2208f285987e2c9f43c24dfb7dbd523191d4f3f2203048dc5b9942a41cd460757cf64232a20ed29f23495214d8e333ab6a0daab8549bb09a6f5af452b21459d2f49a566249e1b2b20d8f3be7bd9b0035cb01cbe624e66e86849995c305d863976fc3abe4d683c94aba94e0d8ead97c26b29877743db06ad01ef5cf4571ffedc3dd8e415be9b94fa3c5d941f557b0ba474e85306", "6a005351ac", 1, -1648583335, 1537743641, "4ae3d4613e33ce235ee3dbdeb63f8bcaaef7c8858acd031802242a65bd31fa07"], + ["030000807082c4030376c7cea2cf8ce7add2a641b30b07636b23517870d67a39cf188f5db816a6844c03000000015393e320fc0a442550c8b287f892c67770dad471cffa0b7d3fac46e52279a4ee59614be1c90200000000690676d3297a62d7a442dc88c117372b3e273ccd3e2f4457753e646fba05075d3383be40020000000952516a656300636352bda0ade704714f43000000000007635365526aac00a31854050000000004000053519f40d5030000000002656af3428504000000000463636aac000000000000000000", "515252", 0, -812182387, 1537743641, "70b892580218d49d38e0344c6cd51ed289abb9308cde1aae3f4352a9175a4ade"], + ["4e913e0604161f4a6e972dde2aeefcc970c7d821d7f27a9da45a4f542304cc6118a2061d97020000000151dc744d9fae924dcf4af8a81bb0db49d6a49d7f7782949b2b11384d31573e0295c748f0d40000000003535253451ec13f9255b3f31bfa8e8de81c8cc7e0895cb72a331e55a29ba60407401023c47426bf01000000085163525365516a00ffffffff0797d0eabc7fbfffecc633e8846cbba2aa04cb09fe32c2cf5e9a981e1e533a0b010000000100f4f5a2f8042fa34c01000000000351510010e12a03000000000653006352acacba6878030000000004ac53ac00951404040000000005536352526a0cbdbc7e033f7acb0400000000000000000000000061965221effa7fc06a25dbcadd23849750cc55cfcd184fe25a057520a93c12b64714fdf9066db3cb27306dd49eb94bda88382b24631c6b8cb3b61efe45befdf266439c98cefa1f6baf85aa58bac622dd0f87948c368033e109271f295cb9ce0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d2bd1875bf1756a99fad9fe0d24c34eba860feea26baaad769786ff893cbfc0a6dc73a6c83a270bcd53afe678585d89a4e731d8b307148a5609758985c457d45fe13819d005d84e56459f564f7abf8cfec88c6990d20896ee6966c36873f7acc32d516c2a08f07da4b6a9f4f0992bffe949b95d78da010fd1ebdca78dcb20b360219111d50dca92fb1f5bb8a91a000f9a80109a20d39fbfaf9479327402d112e840309b997c71bff175c686cb0a8f22cf5dc662c5024e1cdb8f161a2e7ae825722370b02081c911fd70d9b56286eaa6e4533c682d6d9f46e3105947a7d8d4d3366d21035e9faafc38a9733e591cc2f61906cdba7d39a5dea730af7e811db90287f3bc50211452d4158e386f1bb78c7ad0816767c345c5fcfe3fcef40ba2171fee8bf63110222ad8d18279e898219018d7ed6c38ff7d0d97cd7585d65f94da8eaa427e9ab51031bb32009d3b916e4c5b198573238276e75688c11c51c61b5a7d1a7a35a1d1e72022ce53fd916656538add42edf46b8d785406948185b683c1f93dc963f517dd1c502151c2971bfd780a503f0f6b88acd452c460fef264ec2a284ce12684c0fc03c14aed7521f256fd4b4a14e80a1ba7de915c6437d15a0866f8acec5d84d01e1da013cf06c5acb2479c3663162d2921c598022744d93e23f27ddf99f2aad904f2bd3cf8e26027acd9eef47f59cb783af0a13f0a632a96b60c4fc0ad88294d61443a398fb4a6bea1d0f1e9f1998b85c3ef3bcc1e3c4bbd47f73cf526b367fbf16e5511dcc3ac8e507751b617d161310cfd67baa3f48f2039be877b3637ec9d873f764833475017ee3febebef3494015228e9fb51ae035cb01c95088169c0eac8b4662ee4c168c04015c6ba054e90f767ebe4d7f8e9f08f7aefb8fcc781c634b9f65e5a2fe403dabf186caed3d2936ec1725a6c39cec6ee48e48b6e875adec016f71b5df9e64b47bb2db345157b54fd5ed8644a89e8c49e71d43d9f7f467ea026b4d8561d8a6c5203ba30546d668d8f978e2e9e1f224d1c17f8974d22c376bbcda1cf84a14a879e236f59ff32714d1e9b7bac3d6012848116b4a27dbc7b1d82cf9fb1f521bdbc623b33ab477f2e9ab162a1dc2c5eff8ef21f3c26427f405a8cd2b8ad410cde0df4a0fcf11fb7280c9eb776dd0b0cc30465340b1608bda99dd0be5754b65123f50b1ef99904f9ac7b1b6b68a7da86b4c53583449ac444918b3b7f6a11da35c151c61d52cad2013400cf3788985af6e344f42e8f2d0dcb43cd9c6a24c4224f67373030702ed7d7b68131853af2dea483cb951cb44daed2560e8135e855c8b647de4a64caec451bcace9268dcb5c137ee65ff4930a1977f604314b568c956a53ec4a733c05f783941f5ee1d2b1d88a27349e3f56be9a4446f0f77dcbf64a958b424454750c33a11d584b029b8d0b674522bc0522012620596490860378b0735155bfbf2c48cb476ea5b50e98bc4148351be368c1f22a57920741101c60233232c3c51ad7b8d6942995ef62654141e77b94a01d67147f46742a487b40a668910352c72f08de6c13105c8fd3d1f65de7380b0c853f2a813a76b720e4415de90b1515e3a237b7cd783c07dffe616eac06ac7d6327ec6524dd43426e647846049c03ad5ebcc061fa622ee9eae80eb27b632c3611c6471004315333716827e7a78ede1b8aea2bd364dda02a4a4eb447456fe4de9838c5b500aa595eff13bce2f769ddf33a0f6454d3d4f9b4ca17bbc92ba65b1c42856ef05decf788d827b0097334d2c80c8d5da155e3073d4fb2cd19b450e59a95e0d9e7f4f4a03282b204743a317371a09fe44cbc5a35f7f91936e35dda6d7bdd7b3b25310b5d35f499c76a99ab132b1925f0ff4ffa75d919dcae18a4b1641583153759def04a0421c4843f2a74d6cc4458d0c91da8b210371e53505d33bac59381883b59dfa701b6832e71836da5c9b9027952a6b9bc4a8fbee365a4fddae83948887d7ae6c9ccfbe4c0e61abe318a0a9f7729598131132ef3580d2454e9cc35e80954901c121ae582d78b86a4c751e00739c2fd1fe5b5f5e690ad6c36c20677c130662f7dd6d100b00f4eeabd8e2115ca570c6cd92ad58cbc1bef733f6d7ea8102c7e9425559f2f6dddc2e22e6d073d23307324034bd7d760d864bdadc269c33bf2de3c689f75504f415ae4f7d04279223899fc1e629b849ded1e3b270e09cb660961f704c744381507497b71ad54d4c6b5301eb965daab554b3de221a47bfcb70c962aeca548a4ab3707729c348788f19542b3b46b3c0196f491e6506abce9f204000000000000000000000000e6a19931010041ffdca5a55ab5877da389c8b9e8c2dba2500f88cde749e733e27ea3e5b252c2b8cd16dc7790113dd2591f73bc33e63288806fcca10d97a51abc594493c49cfef2f4bd30d427c9f0436b08ac875f86e65db181a8c469191312d6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009b315e1ca9ce820aba6a9f6f6817f4bf94d33b94eacaa29254bff3e81d5e19e7f3de3a49ac38a93c969692402b67247802618630d78b1aa46a1bcb4eb3e9e738e293341577c8071e4e5483156bc688a512ef0a025b7e946d3a69c6f2c47692d33488078f4b46bd1a380cb5735d3be0d89b35776dae1a0a6485d93ed0b78c7276032fe55ec742b6f68cb77c2b1855d353e0194addeb895bb5e9aba85f3469dc30780219ac86dde23953aef57eafaa343abda574efa672e5eaaa492e2936f10c3d11bf0b0881070c3d891d810d779ce40792b687f21d7b8c73ff37f9fa5f0064d14f9d2958bf0edc5ea8c5fd5d0e0ac9ee5c632f792a6cb9dfe9c572fc3ceb409ab003f70207942387f2f301ef1e8c7fa0ab331e14707700dc9cfb1be48eb1b85296792a610327a5090d02f467ac39e8c4ecdfd43b3241988577e3766578f091189fe394e04d022e9a74d32f50f6e2aabf68680825b4d6968dc754730f2d190b9a81d383cc61fb021a6ae6c92b8d8c8baf933154bc4206aae0ba05030d66bc79b8defcbf290ba9f0020f27227640a7e183fadcc473964db245fa262e61c23650b51dd14982f128e85aea2c40086f336ad08907ae5f375c29570eaf6bd0c0a99f403d7885364809db39f1adb59880a4814bf2c0cececca729b0e6557416175863d76322068a73d23e7fa819334166768301499799906aac20d548ab8bb943b52561b313cb28a23e554c07ae4d4f8443472ece2494c5e9e0db67ff5ebc4972872746fe316fa076b881c9776132558e6f3a4faf7a2fe282b69e3e93903c02cdcf6735651acfe3bbc1ae184de373ef75e0a4986ebce13209458bab884fd526be29340f5a198ad3dfc23db4d3846968ac37c2590677dc8d6b5b1fa7a343254d52fa25ed0fb6b3071e1b09085f43e496ea96912aae3814fc22dc32ba5afc4968542168ca5f1b1cde31d19d9131451d44dc03361a151255b81bc29c04e9cfb4b2aa97a38ca02f804dc12607b8105f7891838f785d8c341da620905f815125674da7c1b9d61d7bf03e80c10d87ea90e844d820d0ad83511cdcb37ab143ea7e4d5d28ad2153f389ad1e87d4656a896871313fd3ea5e70c769e0e94ab9fe691d40b9fb518ffb0ec592d112d4ddc6fc168e5643fb04da04b6c51502a0d5f07e128f6fd52a0bde3588308fa5d249c2d3b99fb94f169e1372ea9990499f34f9516b36fbe4b9976c7cc8d09d2b089bad59597d69e2ad9bb82e7183de4c758fc1a8502ed77731812d1d8f802ce9660b14212e0d28278fe54b0f6dacfe50d47dfbea77ffbc589a82ddbe16abe6e7ef86b2f90ec8f4634dcaaf357457d7c97fae65dc73e25fde1c1257107a0982be925fb97df6ccc9e5512821e490ffd8e0729d8a78702cfc5154b7c7d78ea425bf5d2901663d9c4bc4efb93e474c540779aa440e60b1d15406ba6adb4dddad6efd092ac6781c20c97ef89d1c70b58b4a2d3075b13f9c3063053a580889cd2a8cfffe1ee3eada9f0388abebc16fb29e955d22a25ae521b12809bffa58935ee199a03bf5b36c54dfff1092c824bb659076d07f31e23f88442dd8c5e271895246c7d0a3dfe7599754af23e8ca0b79849e87e0e793a0194ae03b06216965d9314a4ea41ea2109f7b137d5a9e5071ea15d6869e1bdcb1147bd3da4caf29e7f069538a2dcad9de59b834b89be470b089c468fd8b1889fc00c1ad82cf67904b7ccde7a284cfec3cfda881f6b5252f1a7a6ef8297e9100dda0670965a928f10784c00c492657d44499b38dccccd5eb10bdf321d0e66f2fdeb5245e000ea4ee110d40983d6338983895be50a9ed08e3dc8f04becd0c74625ccd7872e691bc7089371fe66f81e84af183ad679c423cfe8c8f50cbaa07d6449cefb48af69eabf175d8cd28ec2b7c26df3f12390cb794a311220bd098b68f04839bda8c0e07b42a1e100e1d4fbdf90a90eaf60e801be9d1a1771ae9e8c01d37369d8f9d2dd7cca7c424a3f51fc39b721d2078adfdb6d22b0b1120d3dc2c2a53f9554849fc490e0fe7d637caecbd09d86bdfb8efa8741865c3ad15522c486f6d99974be9b9cf18a6a5e8f6a8ed412d2c723842cc9d25e797fa6cb8cd68a26dd508ddd0de2624e6bf468b6e84feecb883dbdff884a9480f05c9fd077177a00db694c68f002447d615596a6a922cc62a0041e5821b852f2e0f7be0aefe2e474b1db03e1bb467de005ef8ea6f08e53b6a281264f5cbbe805fcf8b2e2b0d23d3d96eec947b7179b0c496b480dc5d2b8715d3045e5b6b096a8353856b0dda14ccf18e76f27bcd69a00100000000000000000000000073a7e29e76f5f8bba0932239fdc8557b07c000a85c59a10e826509d28bb22aa72302470aed796abe27dce6c3a29200423d1561a7d5f55b9082537a9cd16e470b2df8a130e8d8ece21b2571db0ffc80db74f53cbebee80fd220f23695e34490ce00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000399215ff0efdff79fe5e4b961052932fb8c97b667327699bc7ddbb65e6e477d088f4a7707901c93c8f1aa9ecb75b636d1c5f897022d558968414aa394026a4e21c543c303f327c0cdd698a71bba5d5fb0496138ea129894e02c5e28dcff379714b0cd18192d54a362f99e2fa8e38031976d0055f8e7f349db070d6bf312833eb021e7af66a39ec70b589937676d91f3aba68536393e2a079f11114dfb77ad76dbc03053be665dc9bafac50fb56e435c9c780e8ee6e2dc254dd5d46142727d03fef600b08c7aea0b5a6ae0984a500bbc96d4a3b3f9e1021ba0fea1863c6f281cb28c530dac8b3aad06c1186ca664da18ef52a09215d993ea70f6aec0d2fbb567a6e06920316b06a6b26f6532b6c74df636576a60464b7f38f8625277ea62599eb831b9c52030f1b88d33b39e9edc2f1f431f9dbf98bdf683d6a99eb2869556855d8ed0a39110207344fa0491275d25fbc4c3ceef1ae6fddff14ef5bc1820252abe8218c5750dd031b21d5ce3e290390427bc37d79f695b9dd4cbfe75280cca0173bc0c97a33592003227ab6661b84015b555164e641c2fa049314720b62208c82f8a496ee615b5f2257d58703c5f588c0953e0ad5fe2a57cc8a42ca6e6d7b419c74cf6a38ed7f9e7a66dcd8830a34f0c820cf40104547bd545a21dec48995cdcb9ab9519117deebe21bc05c474f7652423135229370ad6116a6b85d03a5bbdff2248c3debaf2f50c83340f65a57aaaff16aa225e34e0c7baf71bb635da38d8ac26da497c16b3af2dbe4abe7ebf0da323121b2b2b769e659f070299327eeabfa4b9fcdf749516b3217b045d18447b1f87c42a94d7a76c0bbd89f6e3d5cfd39d1fdf0f6bc27552e42949b21a9b0886ce6531929f5a3b68eeb4a4bf98b556094f74bd6ecaa53df1ae1f8c9be362a11115f397d52b2f1c2665ff220b1880b5dd0a198a211dde8e8fed55a0cbf64494137fcc743486c721a2c6ba8247fab697abfc4db93d5ff269982753bc4d7e897c946884db70ce73db5531c60cd63ad0058cd5cacd5a436f0ef3398692a20d692a5650707dfed616b08853cc8b123acd1cf317d477f117fe050fe907f82ae5e181eecf13b22d127b00a43e52e1afb02137d217a997de69363861e7961f01386ba3da3ea589b22f10afbd0c938ca4f280b597b40a4ff472b3d4c34695f105e1f3e8ce74948af0429c61650fdd87b6eb0f0b88e8ca4a18823f1523e84fa00d335c54d8b3cddafdf1d60f6641a131be6ec5edfdc5b780bb6eb5596a743131348b0e41ebff5d297071f6d37d5e5e56a124eae0d422400b387a0f295bf16f27ff1a491556e5283d8b9b3474941be12bb69afc223f0e0d1958c4f9fc083d03cc48cf2232fed901c24e3b4cc97c8f88a49132263e328acab174444deee859c62aae72a18bf25e17c28b6e018fd3aacb2a38508b509fc76584cd9197f2471feb2883a3785fd6dd8b3e05af30e3729ff61352cc10ad86d04ea14f20ab9e561bdaf65feb6c7aaed2413b08590fc7e82812f278258a6a36655331d633472c9c91c0bc68687cc3246b8207c2649822a1852cd22b7143bc02bbab59d9a8cbd2520af6cf5af4270817cea40d31567856038833b037913597c72bb528bc0bcb87cfb8095be314cfbf3e067365941c9c2e93c8132f528550fe645acc54aa276383489f20be5e089fc5d24acca45059e0bb025a6395d724d4045c73e250cc3bcc8efa73885f3032ebfa2731aab09f89fec695698fd3edfb2df8207cfab6cedc2efcd74578e447c25c67fff1b75256b5a64aaad6632e63a187a1d0c8cfc323147719f5a8830e45a7832bf9ab407ee46ce562be16aa21b564a9128ce08e8ea8843b343dac22d002d1ce83c67e283ef770bbee3863792061fa1f7a5e65964c94324c3c69212a47c81bb1ad5db2f87dac7a3a09684d23b5d1b279db146d6c411671b700558e55696fcb4257ae51d3ac2c7712ff24c09676733d76bc1f88f12af3cb93b280d5503d8b00ae07fbdd08a7b6de258e10639e9c54f11a1759f0352df2834eae3afc6ecfd5dc745d70ecd4d3688525cb79d10664b6ae65fc4cd8f9616aff0eb8b41ae13759d2e5aed122828060f05f0bac9c0fe20ecadd93aee25906fdff3dc6bad85a720ac895f07cbe0ea42a364edcff4539b638208806527f21ce6fa10e991206186b92696cfce6e03d1be68df791621367a80e78d39856a58c16ffa2cc9a17a6405be564bba82776b114f02a483943a3b12eff6feb1b3d9e82f35888003221ccb21489f53a6ae77ccdfe343cc0f76c793214525021d2f80116078f76e35c4d51cb97cd1c14a61bb6638accad3559b91df1623705c9242e5b7ae4fb3a7cb6427f7712be3a4ee9a366a60ab1cd95bedf7c6c4d79e1d5f970ad6be689d03644fd0895aa85f2a273e1a3b3d745178baa6a3f0af6402", "", 0, -2106854420, 0, "ae35bd5eb6d6a1a242cfab515628b3426f65db0c8f38c28a2390bd0ede324673"], + ["030000807082c403032e55017c69926356baf84d5a05232093e90341f745d8479d486d5babecccfdc2010000000965635163526a63ac00ffffffff2bfea2b091dd1cb124341421a81a370efc1495e4fc90c57f0ffb70aba1a3ca7e0300000006516500ac65ac62fe2a9797246501c66ede45e171b7761a7a44a9423f49230a46322621f11932ea144afd0000000005525153536331ef28ee01ae0d7c0200000000045152650046242cac0000000003c1af1d040000000000000000000000003c455071a8f80e2fbb71ee1880c8159d0a668df04f2dbef55a6d310ce0819e607274b65b8f745af9aa8341e49e3cd20ec18d71354a04214820c9d5ec985ce2ff773196e7d8a3b06ab320975a1796ab1e8ee79000679dd2b637367269f05ad1cd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c73f38ee2c075072d93bda31dbb11fc872720a2c0f35d9e65771a01716e3cea630eb1ae171d9a8d2d79f13e3ab7147aba427df52992651d1eed2bcd9bc7de0fe6380654bc6983a91322f50834766c4c14cc76757fdcb052ff0e75ff809a311c2ef42d71dca9510251d5b8ec9268a714d8d6a397b0ca638caf18d864e0f0f8bdd0223e857ab61e7e043f69e242284b80fcb9d02b4e5b7eda2311e61960112358e1a030c53f86c4e899fc7aeee457ab169b301e818636294ac91c0a8eb52ecbe9910590b009f1bfa94539d5cf0e1a10cbddb4204a1b5850b9bab50a645600fbc50e9ba1b8b621760ab6dd12d4b20b3f863994016e08086d3c1575f55e97f09b88c6b55d30225cc0188e7e9ea2e58b8e30ae5e85390db6f28fa1b822e84113218dece6d0005031ab6d032361deafb1b160d228eed8af1ba3949bce35e9b9e0bf1b8f25860612c0318a2fa4a6c59c8efbfca5d649a846fc795ffe2092a9ab07559e37b8d161993520214ccbc1351c7330155cc97d5db84e0f381f27e3c39ecc414bbf8c1953d0f5a6e03131abe87f8c9fb0ffa2d2d0539edcfde6d5bbf7447158897a9406a1d08557491e001ad23dd83fa938c6bd2055c041011f7780c30a14b4e8cf7b86ab913727621a6f6f916b127970529cdd0f0b8d3fa8d0df69991e5e4b5ed43e9d40c8165187615bd0fe5a43b664b02df7f0051635c1cb60b21bd953bca5a4421e81bd3bb634d02883c5e977714b8e6182815154df97593eecf152db1d096c8af81f5ae8db5772fc428c0fc300d39b3a384b3bce857b41a72a9e1a06e7387b6559df1e57a501558ad7e1e4d545678fbdd01ddd9583955d9a747e271f4016fa825c1dab993bb0d28e491b27214973ff768801556b36b8c9fe71dd1a3f1819df2cad896fd1119889231b8c445a43c7eac2233ed1ec0a861e7c8e646be84fb72c8eb7d546161fb80030e52307455010d7307b3a42a9dadcadd5914a63902c16d0e7569f418c5aaaa661b73a1bc78ac8707d9abaafbda0d360c76500fdaa6c22199073a91c2c25b3bc0801e25a97f0649c1442b01608e03d98da0d6f85c0cc79deffbb7f4a05123ffafc6cd7d4c58ad9aeaf9dc0dcadcc30f8efce4972578b94c6f1ed75fa1c375b2460d349fad3c49d985cef0ed00cd453887e621ba978b336eadb471077ba7583c78322aca0acaacd87c2e57cd967ab07090e793885e0206d67e9d93e80da1aaaddd3d711323702eb21382a084527ee0ebad65a9d1355e5de220c861a4b6b9e03e05ee6b0637fa522308fbd50b4488a5f391a91a9a9878765ca5edf0fc7f287434a72d121c8b8e5c1b078bd2d894924b9b3274e535d64f418b2cd016f1186144ef0499fa337df5dbc284e4e92680926e75bfd23ccfda4b1fa3ba78337a7e35221c4b8ae02b8839b4cd9351c2e282c7fd45c945346f144e0e07876638aaa07f739625696bfac8fd55f30095f9a45b49743976db1117f968bcd17f41cf33b9d01d25a93c70b6ac2ada4a4790da3682036f097f307383cb669e5f4aca217ea1f7c91c54b5fa0f7e76203cbadc7add1d8faa38e07db3fdb3466a0c01917c768a5839ac74323dda1322a01bd9f993e2b58661845c4c9cfdbc993dc9e6b091ad3210536d05d47a4d0a2605d2e564858dbe67cc2a02f39eb5ae36d4b374b057d5b83890d89b73e755fd152d884d137482c2db747ae94cbaf1b84d1e13671c8266582140823ff9391841eacef83bf1a910b99293a72e640dfd1a6092127578b1dc93d8efac23af9dbeeecb58b10a3cd5538dcb8a0e24898af0d1a32795f83feca2bbe1fda17907454cdbcf586f6862995358a7fccdda8ff6809bb75c165feedfa401ada27cb63988a9b3f673cd7972e877bdd82885e4e6020967f4b4fcb69865563d5c7016f1ae19a2082f4cc6571e39eea49310284771b622b44c2af0c47e80e0686f29f411a755fdc063e57704132ea829b3c662701b3299748aa4fb100edd5191afc229d9fe0d456218a1499567cd8bfa3336ea876dcb96b1119322f3985a20257b020fd84e781d92fcb2634c2c7432f7561c4beb01777fcac8c7bca36472236de083862d4c4cc5ba241ac1c194929528bf7fe513904ead50d585a06fa2b1697f3bd0d710effb7be1eb80d7440db7059bbd8b558d4447ad570ae8c3aa8fa9309352d18c19a20872957d5358f88aaf320a94733389caa8b40124539f1e3844977fbdcd510cdd94f8b09cf270cb5f6e3b63768f2ea44e81dc4701327ad7d50eabd35a15c3dcec7fe999b7eb493a825878f09152da5ce6bbac5002000000000000000000000000f799c1c12eafb72f361d7d435eb37a1900b99fb26192c2f56dbddc9b9de933006890db51c74df590047e245007f4d31276cdf236825b771a0d92262afe898f42123cc585956915cd2d66db13b73c2dac41369e5eb99ab53ae1072b5da57130d600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f0395737787fa8cfe52d373b7982f0818be07bc7bf7ca3103212a2734a0b7780576a497c075b07d61e1fe5c2e8b53bb8e31348467f2f3a32ea9cdb0c82070fda13df3e61323b95672003a206bc08f94b1945d3dcf3c7ed3d30753f889074e18636dd511e9617304af9be24546985f55cf7477984dfca108f0f6c5b5a4c327253030b766648b15c43e2034aeb19d24879f663ed91922e61dc2f6b1027d079d292dc0325d535c97748efadb5bd26c01600ec1f4aac10978eac28a18554b5941824ee880b0750dfcaf45eddf610b976d9adb04cebae7ee1ef47e4e0249311211e517f6aba8cc690876a16539f68943a31c0978aaefd4f63614fd4889e8786f66d15edea7b03290013e10426c6376758ca87c5e40a7b6c93785e772fd3282b9ac493f4e44ac70210dea2bc84be5fe725d44db2881a737f89c3ae13f650a509af328d500b4d61980224eb1ddf0ce3aaaf820c63e3e49f0a946190d6135f217245681c2c309d60e268022b5a29d39d70105919bbb106dac07e8991755d5c100c97efdb1d78bae018682a0310732597c1df068f3b0627287848ff847b989545dcca1a92502198d3d8d31349b53ee1f8292f99b14f80b82ad48cdc0619cc229e2331a37efd6534809a105e94058b640671c1f11edc09cb5e4379f6d3e4d2dbcd012e91da5058c7dff474bf364e587b91bb7f076d7ae4b425b5af8402caa5efce7e4fadb024f0d4e0b75764e04bf54458a1eb5f752d3152eea57ee5dd5f3a3f7fcd18544080c9594ccc1b53da1b80a853923e1e55fbf201eb5a05c775ed48097bbe8cfda8e0720e52fd41f79a3405ad3241b7e3d08f0998c119469601cab6b3ac1418774340e9954a738cd80068c00d1b5052030c5faee4786ed644597fc512759d682987ebc9bc13c42cf5fcb2485b789fb18046f349e85886aa7be0a88f26f0717c84b7eb74acadf805764a3fcefb830fc2e536305b9562de9cebb3deb2e4e8050615bd18ef65a49dc72c27d722c24ca333d0bdda3ee210bf9a5e044cbbf045cbb422e32c1999f366eae93b4ef7fba5c564e7725f833687430f2196c40c5895ac4f74a191e30e0f45278397c228b74423f80c16660b989d2fd3384c5e4597f4d970471caebc454a7e01a4eb8dc906eeb800eb9d60d1051cd414c9b2cebde018551f34c59be575db406352db8422e0bab58707b65d21740a036de4584181f0043e78b15f8a195ac987ba2acc7e6c5699fc7ffc86bcdcc10f6d80a5be04abfff23ac47aa1aa284335f498eff225d5b209da863722d7f602e661553a33550c933d4178fda95510ac6696f9d50b5cdb28ffdd93f8805edcb1386d3fbb9d223a9dca0d15098995145cc3308b3f09939b56c80b7e9d0d823c89d615aa47960cb08bbd840a165a8bc3ab1a01f0f9ccb3325482ece55a34d7b84f93429e60dee98820198c5319ad5bbf45f1dd1af00eab9d1a8f8e7191dbf02c40c3a7b665975a35c61317ab9027469315b681f75cc26a1ce431c754e30b9118a6b48e46e50746e301cd366acfc12bb338d877d79cf8d1dc63677d981fe5376cd48637c56556983b9fde45f3fec938a072d7fa0b2537655f50b7a7d236f83c0eaaf5d59e834af23380ab053e67e55221a01c9e85bf35ce8af69d3d9e0a0e91286a387c54bf3ae70030130588c26c9d10e8b810815fcafeea6dc3795bf7512b454926762829313ffce62fbb81cc9e6826aa6528791debe1c13cd303421d0f2b00dba65110efedd4486f18ca25d21fc371d9039a0c04a84371aa966ce9a4cfe27c3f7bd03ff00f003cdc3ef775803b5e73de74d3159ceecb459e9129b17b1d0fc75ff79996814f779c7e65aa29895596c85360bb4938001a3f8d8f26eb8d0616714a113fa3c88e82156217f0bd419c66c3e955131f80951bfc5ded6322b38f0c215fddae74036445e2b79282882b1c2948aa7d732b61d90407629609920d042434176fa181208b96366835973dd0b58ed9110ca6f057d908e839be83776f45ba99395bd2652546bf42643fdeeddbea83cc6df25619705e14d3aee67a7eb81a2c8c9e5dd1ae3a6077b4830669fe2777485d40f5da3f7a39aaa9eeccf14e266446db5cccb6436079b9c9ecde1eda92eb535463ed68dacb437b78d8e16066214d9cb40730b87930ae108189388815a219811788691eef3f53ab56606e3fedc760e1dbd8fd8124a39f69be08d232776d24aff65ff8643615dff011e6639a6ae8d1ce381b1a14f199d7d3bccb4e9af0b7215086facd691a603ed1bdf3b55fdac60b6312b140ab4b517733ce0000000000000000ba8b6505000000002db3ff72595543dfef70ea5d38b48a8ed9523622ae24cc895683fe42e82c8b9079c87bbe31d06ec4cfeeab529b7f6aba667214d7b24fe663dca614e9365e8b6bbb6538dee22adbd1747a3f3a1f4f0617b2cb7491db95f12bb3c3b49b08e02e8b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f726bfc2aca280408c1b5f6689b5ce72cf3028cbe97c59790371540f968390fe97acd9d2a1e558e126cca52da3346f2a545017e2ea284aa7a8224c6a8f1754c83222faf173bb7d186f30017caa5003071d58cc2eddc85cdcf2a8f4e8f2d580f0a833368a29427350f4c77bd4cba04279acb37e31d3c3ccb0bea5d338d88fa022a69750cfe540600bb399fcc69bd52288aa63224405f3127839d701b4d0a804003247f0cda8c2e57e85e8cf787c1c1baac64adf7f70bccb491eeec52162e40113d0b04f4043413b7f4c71d177fc7590c61f6a2e7a4d02dedc8be304466f2f24bace7fc7e2801ebe46dfe4f82e7c850635fe27ed77287a8c96dfaa58ef02ee903f51d030abce5974f5a6a1143b5b79145e48c0010af012191040130840a6b1d8ed89a93032f9d7a5aab7791bc3d4f0d16e0ce33f2ed97bb8ae1177bf89732d7293965fba80306dbfc2b3baef42cad42229ea3980619d0797cef9527e8688cad00f834f18f1102182a0cc6cdb3a02900d1ecd5bb5601bdac6d32e44d7f423b6161fea6708a8df403264c9503f6d38002a6334c70deb27de66817b15ebfd0c6dc1d4221dd287fda85ba79417a39999390cabb3115f9d13625693a72f16e15622ed8a9d538c784a783114e7f8e85acf3bf08f17de2d58a01738cbfd51cbeb35dbd138b513a2328e542732501f22b1cc46d712a5d9f22bbe8edd81fbe73f80759c51c91b553900c682484e51b04265374bfc3845d09a0e90decbbf9c580ef1bbf53c29c47464921685f2cec8750297c70d3b4b1a2e666646b53d68e41919679c920b0009dba85029222b57a77cc5f812aa22c965380961fc84dfd83cd12fd4c59a2667a0322b3aa2adf5a3140f228041d78ea408d7f574767112dbabf5d7395177505199fe457ca5c0c601970f3fc5faf91b94f4ff67595ec0dd37e5da0dc2f3a4b68a78de4295e45c5a92189fff54ea7a8e5cff9523ec36b33d2544ac4c9ba9c9b67d25f584db52d9b3f98ed1e2a801adad82f7470a7498cd6a5157bd67e18baa8e987dd5158b54fabde314f39d26909249035d9a655f9960b690063dcc1281634958724c79050478e339deead3b8f6c6c94072f892b7d17d11d3f71bac5241291e7cf9d361919a3f44072997b82a78d6d05f41f33a447b8e6fda31f8ffa5ae6a25ec7d4fb503e6e533d1e81fd4579813f83063a6eb340db45dcd02aa1117614abba1e0ac0fc1c92734763245cbac29b5e5a354567e809543a619bc67884f9f20dfa111c5946d92f3b1897865a3b84a5426b9528edbf8a9c572c09d489c1bab2d7688377846fb07524da77a56ea19412fbc251e663b8c1cc89bb2b0d267182bf114533980fcc9c35c1837c60c89e997161254a748b85149d445b1813a40c22a8a2a78a8b5144ca36092abe342f61a0471ab7334a789fa64a5dbba28563f094f547cdfc136269ce66c734f5007306edc1bdee6db1bd337c68a16b8ca10c86c914144cc3cba7e07088939c6607bc92de121546a966e337df8a4eca9a1f115f29c4d8e2cd800bee796b5b8871e7b1923ad6ee05c31b51a7fd1bb6c01140f8c98cbc7c7c64c972c07cb836666d107a253f3608f3ceb1202329f826b5fe2ee159ae62c8bf2519aefb91810dc25f7880f19deb83803d1dd4e1ffebf741eb2808940a0da1e247172d6e1abc83f0bc5010123fe02f1144624698b0c74d04ef533b6bca8de5406412a94e5ace4ffabea00763b49b9201aed30487999973d5a2cf4ff1e534b9d6a110c2ad24d76231898d9e47892f3e0bafe546ebb565a1878f5b5249f0033c44a48083040b4f9b36d578ac9758a629e942c6cd2c9c5bf01659b834931fb6256c8bd81f6491c2c2f2119fbc9a8ba29369a3a752b4d974efdd8fadb68c9318008fd553671a9ee02f4efea84babc1ba75a2ef44060e1f407ebea21c08d52f817777884cb6671c04232cfb50b1434acd5d6c8e64e1c5c8541331b9e968f13af421bf7ef5be754a15ddfefb4679d42ee23bf2d2499120e1154edfdb6952301090d8f3b238c11d3513aa0972e67a9ac14e27baceca01a9e3836ac094bf8af6743ddd9bf06cf39f98a6b822f06c301e09fcdfe58ac76140fe11e99ad88af8b42cacea77fab6ceabb428a24d09011528c0ef6ee1254cddfdc243d998057d156e4c898fd12243f9c4480f03784d521e1aa9d9275091d09b53975448bf84c0d9f6e03e9e9a240de006d5b9713ada7d438c8342a5c208bacc56cab887311959536f0761bd64ea179378ccd4f90fed2ad1e2e8ccffaae19ac402a986dd5964de0b9829977fe5fd25430db57a8f10e37c34df2bb7cea4b0400a7ed22c7fe65e3d9f5f97261613f7583332bb5c41075f2051ee2378b6d08bbf8048e016083428183db7ce353b329588809023489a3cc03355bdaf9396811e2242b122b0922b07", "5151ac53", 1, 186872614, 0, "411926509e5aa03bb6eee0825b0f715110639f622dab91090a46e6d4e7e9e810"], + ["5dc5707902035a6c8fcf19f1c7dc51d6a63cdcb0e26b4ba25ec16ecf02da89d6e3a3b3d14c0000000003535353ffffffff6587b722007ec23f615a6d99f157666d4d7adc32738c7aeeeb4dd683aafc829802000000066a0065530063ffffffff03014b460400000000015169eadd030000000002536a1647500100000000035163520000000003000000000000000043d8040200000000ce3c2e0531d85d8688f10c016abdfc4b321b5509817306bab03a6b398bda1e29228fc996516a92d97fb87e2a31def6ab98e041157102f38839a338adf78772faedeffa5233a97a7975cb9478d86751cfe6ec426af52f91bb720e25d17ab8c83500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d22576c94eb47320325c20d23e468a297798ae0b82f68b823cafcc57f4ee52e2d9237deaf01acdc6f8e404afd54be7db2723c408c31f0807139035f7f16d928edd79a61ce0d09a2d191d951c3d13f8d96073cd0168a8ffe9c5e809da5498cd268a2a017d05ac51b543da6a2ad2886ed8fad0643518613bd88a82f0e34bd21c0d0226baf47caa9431f88087d7f36c3af2e11dd3cd16751a532323cf38bf2bd696060222dbd00a2daf6cfbc851484c744f069edc3d661e379703b7743a56e8d9b4eed90a075c60b6f0c167157d4df854d7c30e0346dabf0219027274a2c7beef64098b452fcc4e0001f57c3849600d70eb0ae8e5f7863eb4b238ab84f8c614c58519d276022117f0a1715d0e6aefc481f7732b8bb17cf6b8406dbcce27525b2b0ad905562502163016ea9791e30bfa9984893cb8058553530f40c167c00f3d035b3c8041fbfb030365e014683a1b794669e4036c75aba7339c330bdcbadda95c37ebba2112059c022af3f2a46a13f673baf07f5ccc69acdd1019db63be50dd83f50564669545fbfe021dc4720ab5874241c3820f7b2c4321543a3b710e0087c68e893b18fdf550284fb7bcaa0aea3c30459fe0c68846fbdde9bb9b10f80fc3decac3d5715b60d3f3818d76985f2342b9f1cc3245f55f134e1b9b6ddfee513b975627415be7aa5e777f80b5ab0772e3f613f989bf8446064da2d8d7799315efed0be04a7b75dd9f70bc479c72627fda55b5b9dfc2ee06c78cb41125f63028dbd15a5059053086a1f872bd529c81cd405dffc328ad4a6827a2ddbea66cd597fdf17a3fc717b69e8b63eb5a5ef4cd914c0e66bfc5558bf3d8aac170d4faebb03d98329fe276349b0c08b154d663f348b30dd2cd804813419885406c27de3fc0a7937d412e7e81d76b1068542f5eba0df010be13d21e7618e60c813890317e8331bc6460c44d3bbecc81194fe3a199c40749f0f091eec3486619d816cd92583a68427a4ee22aafe7cf8f442a43f813c5cf04e0746eb14416ec46b52423b85912fff38e2a9dc03ceeca5b315c33ed19a11ac2062316c9f702042fe1e72e25180d4c7d17f57d65dc885032a4ebe2dde633998a4596157144f1acb0c3d46e7f3e353847d310fd1a430c30fae90d0a93534582a2bd2e4887cd7e8cafba2edcdf08e3ece6633fd2787968437821c9ba79ba970778def13cb9426762249a3c87a2aa35a11d87074125a8528788fe3ff557ef0fad57009cd374b8ce03a96d88fe39fbf8f72815b4d6afd6080fab61b54fcaa78302e2de11311e49db6f461b063a1823867f486104dbdba128affa3b669f1d2cd8eccfb2f40bcfd2b671bcbabb113112e017aa321d8161e233f4371e1e99fe7f326959c2a2afea34b548ba3f9b6bedc4ccb1416b0e7075b738b6432aa7a634e335e3b5aef06b974c716f9230a89a3b91418a91f883bd79207633211a0d3334cabcb6e83e61713faf4b288019bf03de0d39c9ed7f0000e968a8c079c8c85f3c2854ca12eb1dd47d384057e1d83aecbec42ee928f39369effffc7e218173d2f72455edd27888b30ef033574f98259e91d725592b5634ab507c98f8e2ea11e356c03f3a3eff992231d4da232192a7184f8ca9ac577132da6c5633fae6d167a4d858dfeec22dc18512d47f921e8e5ebd6cfc8d022a4756f25cfd4b2dbe51ae238f9fcbf9dffb9546baacdd64ee3b0f744fcd0dbd9f9c8d3e3d692004cb579a904193e442359db9091f20698d5397eb19768b1a7e1a322dad740248b27c1def045ec2eb0a89accd68ccb93e97bf7e6122fcaf468c834f5882cda3cab526c0267fa85610d30596a754fa82267ccd6c1e858a7eb6149f39e6952f885bd252d85941ab96a6a37e475652f14d03f1637be54cab2e3ee3a915adc7537e0707af5307c7ee8867a813adc1558b4624e7bd549f326680ad112216077036ad6df6a05271d73cef8c728b8b528331fa223fbc9ef2dcaec9f483c390bf8c86995d6bb031b35f46807c1b38c5094306810c3cc408033652a705b586a0f469273cfc856dc774656fe6d7e0dc635c59b5010ebbeec27f4daa4f2079d99327124160624d8dec808d0f209dbece713f37abdba3d7ec7f77b15e5d377a3dc58035826e5c46473fe402904fd80dc8f58b0f9fa3f8b2f7d0ff46d581c422e3492c3f0620288d1162c9b26aaab9f6582ddcb87be6313ff95c4258e45e211d7dbc2bca952a096a0790307d85bce7b9c44892414f5844a2889919c57455f29118c49ad794720a1efacd21b6f39ea448d9980cc043063bbdb65358310000000000000000c28d2d0400000000f88c60b43bfeee81a702d551b9ba461ab7230aad2ff1371218373f404a4cd526350720af298fc09c6bc80dc64956b35b7510d323de1e86512afe0b1540b30d98fdb0540ea37ad68a4be200774c7ff1ffd074101b8f267ddb941cd19d1d4fe4ff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ba03c7739d50b33dc62f33566d7ec7913c633e33fa10121f8e6ff6645c0fb942617ce77d68cbc0cfe5ec95cfc60d2b54a686007109dd012348d62b592c70190e3a1013e8179e88e04e0f70007727dfdc89fba6a795d99fa239fac0991210a041193d2bd3efea74d8ecf459d45d1f7284c0f85855d57fb85f6613b3b5e187383020289ddc7be1ae6686666008dc45a4f1ecc9a7f64e3eae3d7d254057b67fd0e090318a5264c8b9dbe72625cd889e54b283ed167091d0eb0737c731863f9b6838da50b070f38462adf0ee50a9cc54cf242dfdbc62a14043e8f72b3ebbc461c63e62608a093ff9e95c2539077702528335d6cd9b17079f8b6f599d396720a353dbb6721021f8512e836b63427367721e28c1f9a1941c19a8d84a7bf46cb50f518f942d599020a0eed20ddd4ee767df97fb1d4006283ef6304d2a2b8258e21a3649c2c1535110222ed19ebcd97b858cd2b2b1cab53c25bb9e0df480878d705a65f50497f14c11603029e776bd237f0dcbe495fdb41df7b797fe0760320249a394bf0731662660f03021a53c51c76c4430db551ea84901bf79ee7e5df37474884e4e3bfd1df23b403d5de507317f28d50df8bb950a88343991ccac619d4b8ddc3e64f2e1339405c87c46b2633dc9eed665bf6a45494f8edb8e157ad5cfdc63ca80b58fa4306a50ed3032e3dd7a15b3e0db9da13eb9695ee0819cd3230cee3381df804c9d1884b3eb2d647dfee98de661fad2a74654b176055cce074b00c956063bf600fe4d4ac696f577c6d581fe0ce7d3e83c836d848b38fcde771754ee897e206c8c8360ffe35c7da695330653b419fa28b4bb6de4282ef8ff70a7a2d4968a0c66ca4cc2eb5473686a7992c52123bf9911bfeed366128e7974295aba8d8b4759a8c771715f07a178951dd5f5038f5c6954b7bbb7d4cafafe36ad2c16b3aae15b7557630fe64ee7399dbf62fac8ea38d711fbf6b0760e358f1fcc9a7db66fd85cabd1adc771172ab179d89f0c6a71ae5f66c79d165dd355ef1e981c39c9d77f073dc2691f9efc4e0e0160022a3804aa44af9f9f4d0dc37338c824b8ea6334abb72d9e8a74c4d544c90edd1f537e1e7cf554f30d856f81e9dfe75776624827dbc8dc101791748fbb86b422ae92f9966c532853726eb717101dcd53c4de3daaf7f01f8a9182de6ca7253ddb8edb522e0f7601e6532e1684ea21659541f6c15d1f62083c3e1c38a27b73d8bdc43fae2105d2e75cb9e5b3340de59cf4abbe74774b35425897a30d0d1b35e514b834d887d83c27c6bd35c97fc2d05ab4e512dc8cb0416d18db5277a713628d40810d83678ca16ddddc6d7ede01afbccef7d85d1de934eb6d076406e65bfb7ace6ba214485a9156b24c2efb09a014be9b06990614b8868f8ac7aaddf0b71515b03f3307df5359a3d59a31c4504a69b898fbe8c352ab913e7ae468f27088e95adb526170bf9ae86781cd7829f7e7cc33f10daf64866a852fa7cbf941b7ca8bb6f11ee30a7b888661912bc445b2d86e37ea16ec2b4489c670948b42ff824d88513b34858de22396a14d7101e0e90be2e691bdfa5481331a0520ed346ad9188e02ef6e3857e60fffe297946bf4c1bad93dc08f63c80857e557b37bf9b0cc5c9b8a43265f5188d1a8063c0ec970963eb70ddaa02e1166ff6cd2ceba5567c2043ad87f3df84ef9d50a52cb5d8f254a7a18963ab3f50e23d4b0f63228f78ff8aa9112cb2435e316f1761cfea49794240569e08b07e242cbc8dbee4ba047076776395c1cead74aef9970ac1432042349af13b5d3fddb5a58c3d7d6fd63120c334d37b33c2c9e7efac352f80a0e67199692ed3a7661d5ec1667a75b1761dcde8791f04de2fc5459e158065a5342e1e9b4db1f4594abc7e2cc895fd3674dc6f29604a14994aeb4e8bb81f6a7d5b50702682061f27ae94ac2d3ce204f589fdc1f45105b300095c62dc85ffcc7c9107f1f198d57207f9b13dc1ee2bbfc416013576054cf7537a6c219791e420ebc1c0e8d6626ce40b7285bfbb3a13f47e3ba92947971047572c70e727cac2da96566a5b216f51531757e5f8a9c7ca1f9cd959222eda8a46509db0543fe357bd4f1e9568b709d2a37a8500bf5d7d4df5b4f782b85edd276211f8155560dc329ead6123c08ece261988781815f482d0e226752ace3576ac51af5cc247624dcc952dc4268a334c4fbf1b9de3c61be0ad6ee03b9e958534741be07504fa7d229e1479fa35b86c87966fbc643904f546d9011227176479e67225ffda53be8e06a645bdba5ea6eab8c385c34cd583300400000000000000000000000089e48529dbabc0822a7c42d138814a6caf0e9f9cd1ffca437fb87208d8cd69587500b38bb5721fe1b0ac197c35c0ad469f337ad3757e28e6d32f7fc167507115ba1fd40be536b77f8908130ec04450808f08b93cc065f3ce67eac61c043d4b1e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c2421979e61a8e0c9880486cbbeecf4642390632e5ef0f6c65e2e54b93301eb54932d4306dd52fa767d7ffa48cf70672709355a162c542b7efd48a5defe4ede1eed3feded9fe56b5feb6b043079e4eaa69f95b40348f3c59529fedeb3b8515087de0d21184d798707ecc06cb2e509c2f1eb924b6607750745f8b2d14cf5636ee0317c0568e32f3813c4f04662781eba62fbe5868a2db8f83b22174ffc2cbc41da9022312f3910979623696787551b4ac5a21d9022abe79114ced2bf8095266a6e9ee0b02b7dc8d9b3f75a4438e8c9a454e87b2bc4979900b0fda512040fd6ee8132a06d4c6629e47e11bd7763b8d06125d741527975d94de2e8540a44016f0e6e11e47031769f6deffbde0cfada04c7032578a239d719a0d67b5c49d1a37fa6fc340d5d5030415115e0280bb76ca14b65bb05eccedfccf65d1b5e52a9fc742b0171895534902085a11bb2b58726f3e397a73bc12300c560c1fdafea1ca22ccb4a5a9f425e9d10317a8494ecd608dbb447a195ab34bff8471a4c5aa9e52867047fc1311643dd529032b9e67ff576206e5aa0967ed53d284f889c6997e84857218d42e2f392ba6c9dd997efb437375e2a05a4b929de14c1ee416ee9c13a11717d28b838bcf794f0b71ec135cecd5bd45019b563847f143e6b1bfb83c7b1640dad1692354769493e32b67794de13564d69b5f6cab0070fbd5977e979320d9a9a5923abf5d3b16df3ad1e1e88bc6d989a407309203f6b369f9a392bfe976ad72f9a2f7bf77202781ae8049ea06aa593e7ba65008bbf0e9262229c7b012c0404e27f0318fbf85b112b9ceb8c0c73a4ca01ecd1a855cc2cc70e936c1666fd0390e8116638f347d85d49275c4d93a43f4b634355cd4b11b5d4253e2c9105dbf08b1e2805c7a0b21265420718798004e0fbdd85926da409ba9f1edb4b4b3811190dfa09ace97a9aa9b400a26eacf643f780ef50ba8cbe2eaca3ab5c7cebb50eb5d9c2eb7e37250ead87a4fc9a272b4661d3989ee69ec7a5d24eedfc30b87bd971a75c7a354a346ceb206af5d85fd93ca5813d579bd12f6c55a6380b5ae89e65953c9713557ff304b38650b3c7a6b98e61424a565f428a3806092887a388cb1b3dc2f5cc8fd481f7cf17f55615f6c22bcbaa20bb06150de44ebfeb06408ec8eccfbb4a289ab4ec2bab10bda5cb0db8ce868134030c730553f044716fc3e80658670057633b9ab0320928a0c52ed98b01caf6a26ba308da19f594f7da635546947489a059cac589407d01077e8b32372072897680c15c1f13250329307d52748c3bae5671e1a0aee8583311b79f46c4d944e708e686b82cc14c1c138851592154597fee59fa2726c9dd0162eec190242529d615dc6460e562eb5219dd173fde15b394ea537e4dcece9f916bea1fd30da9c616ffa1806b6a1429fcff4fc49abfdf844f90708636ba4159ffccb920aa59343f2af93bba70361682ffd5e2ab2ee0bc49be977323d3b8a2f05ad097cfac9a6b87d5e4ba6cb8df281d1362518a2215535f05785fe379b604d2c2a2d89ff9d8b9654a130c85002a3b85907f20dd09288a31ab10af8eff5e4e6e2d7cbc2637e6dc9259adebb1773dd26e92b691eb13b465cf503f9286ce2e34d8fe3b3c0b61c5bd71766396c7cc6f1e6d4ffcf92664bfce6bdfc25c9d6190865355e51deb658bbe97e2c8c16763ea3ac72f48104d1f2bd5bafcae36de4e8238428c4e01b70f55cd9919541691ff35283d0ecc925fc11d22eacc3c8673fe0f4add398af6180a58747e10ae8fe8b05178d81a3c1f3167cd851a6384c476652423812c63646b180f8f6969e8d6965b59ae023b277f8f7376ce41d43f7afb022697488c85c97a0f640a1878acafe8eeca95963ba6d0a244da12b7773e7f6c766686075d9542b0dce72c4378015e081f4afa0dcc776622195e82bb98587a1d97e43d16307f15d552bdf01749e90e282f6fd1313e58f32429e9e6ce9848efefa95da422c6930f02933a1ec326da8671d266eb4dbb5b1df7d73379228f6767cafbae13ca2ea97885e3f635dbde942e67d1321fe51e646003b5ceb6b53086cc377109a30dafa452fa0197875ab5c607d85bc77f15fd45defb0b4048b8a125888d4b2d38fefce21204f50f710d0789a95a519b46d96bbdc79af4c986d4b531660196627a53178d7742b35581f1e4438b37bb6dc882278b5d79ce6fe017df34fc18465409b8bbf4ef2fcc3486f0fd41f1e7a75d8c6479745470f42c225fd2e16ac352381e4dd3f1e14933e5137f1a0963fe148f0bcac0b0cc43fa6460c3ccfe0b1ccdbc69bb97aecf5990d25224257fb8a530da9d50db876a6ff9ae1a5bc0556861571df29ec81bcdcc855362051713ad6665388d43c8df48a344c317e5a6f2caa81b6b2df41012906021f67282538ee0b65e9219fc7317595ce05", "65526a00ac63535300", 0, 72056376, 0, "1d5f13a8e6350a15d092d3b42e021c1f18a0f03db9125519be09526091aba51d"], + ["030000807082c40301aaf15af86fa90a77b7a11b94187aaf655b8624abaa94b7379bb212ddef5804c3020000000252633327017701da45a400000000000751006a63656a53f909e02fe1088e0003812fc904000000000000000000000000ce6f71322d6dd7660e2916940b1cb8bc9850da322c4ebf99028a6ea40493af9ae172e19abef1df94198ffc8291baf11c9778e5d3a4f7b031edbc8c306bb72f3da753c93a9bb3cac5251b25b117ffc7f52d2a572541a0094b2d7cad6a7f321af800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cfb47a639cffab16e6b723a6b2532a4125354d3da48dae62341a76adf5fed96aa6d7a3e5cb37b146340e2ec53c4bafd2aca7de26238da30f1302ea6d2065bcdc70cef7a9f82cd48e4db02a4898f6dacfbb7a6d2e8885f051aff0b36bfc2d52ec73e44f4cf7f70708563d33ad827ea2e71ac174bcfa5ecfa15a36d20810af56ca022170158981074666f34fca2a57f496998d7262d5f92bffb54d850ccf415d0be4032e4ee582b21338bef6fb8ea859de3cd8c2448cf6369271d3b2012cbaade787300a078e659b57b367eec229d1eaf2fb4de8f3dad3ff4232fd7db1614f9ca04282340c3a056573d3fcc914f32ac19169ff24f21dfe508c2063b9268ee697bc169e6b03174f1c2357907dbc989575e1fe38b535ca05dad915b35cc952512787a40ddf71022c359e742a6f108955693d35113f10917e153d1d2130479cd4de272e91487c9c021001f392fdd78c01e39eceaedb1784913a718d2dbf9480977b30a1b7201a8bc50216002039e67deb171843f9181bb99697481693a40d7416e905ec4be50f0960f203281ba2218deaa2d6cc3482c406fe525657f8cb388961c9cff2ffb740db4f2a6f3bbbdc8822078ac69520af0719ccdd97166f217cbca93aa3ec0d302db591ed9edcfb28d3c42092ec3d18919228c785e2b132501bbe3472fb6a7ebbf4cc2033573b1dae2295cb7a175a51958826199c67ff8e88909ed28f554dad8744c57be8b9ffc8878774e250488bd2d0d5d393622ff8f397d605649ae42e111f88cf1efadd1b8367e3361bb80bc9ddb0885ddba4696162a860bbb5e892795562e3ebd29de82eef24fd7e9377dd6c2b4221583fbd62e6a128db081438dd066f896ab0eb5dc99d953411b94230e3a14ec55ef78a5903b2f5d31b0efac097403ead2bba31cc6c7073597f46d253ec38b98eec584915862c1920fd825b825f36ae90dea8cf1550c83d821e08b22f65433c217f35723766acaa05cda381c9b3ce15773f4842dd61a9c55ce1d737c59075b39e39e59c55a56ab56cd9f7790836e667af7b4b129bb408fb5eb4a139cc4e88c46907f3351e12e313259e7ea9c6dd8ba8364c304b3d888925be51e6886e4e3f207dd8685e6ceee09fe252ae0afb3c5de82ca331e0ee2f50d85fd232b7089818ffc8355bc216dd7dae8095c2276d4e87ab73cfb54f2ca1915faaa7dba98fd7515fd8ad5e63fe233d5836af840d17fc896d87ecfa5ac4969c7885b75dbbc1c739579b6e8328924e1d4bb557cbddc9951ac2945e5676afb79ac42fbd256944b32292aeef9d544809b93f15b038774e19c34d09369b5d95be7fc7e5b0ccabb0ae6b3c5ae4974fc4325918abace24887f732beae8a9b9871e33ffd977770cafe465003eced6d8bd74b48c905447f082d38b6241973d0f3582548142e6d1677defe342467f4fd5e2ca147bd281af1bfb4dadf8ff19386c99b26a7585d981fa05089aaca006d64ea75c27d1b45c4833a623739c4e98003d63e7eb23eae4d7c424e1cafe87dcb2ea521027c84d4705d65ab5db47ccf8b85d505d0c479d9b068366ad0f6bde069a51b817d1ddf17d02f12144e73329aa2ef910e171b1111c42fa68ee00c028261194e2dc15ce0cac113daec609e20ca32cc79c8e7d7e6e5d9abb4fa6abc45b34c40e4433d7394eb7dce0e2eefeda2cbe8cfa430331418429fffd7079481ece0386ff863ca5dbe321323b4aa545433d1ee8d02a7b4c3dc65ed0915910f66e5eaa9e650fc7063d269ac0491d40e4d47213a157a1acd27d3aef586205332e2e4c8ce4840372bee1338487dfb87e7e0562e0d80911d91b37a5041999fad2cf21d2eeebbd4341be33b9994482b4c6217016f4fe65e4318c2af07c22beb7d075455a90346d0dafc2d12ea09725f137ff80a4bab61846d25250616aaef1f5dedaa9cc46f48cacfe990c14a82d552a40a2534cdd92f4594985b26d5adb78a6a7e7ece736a5fc32e24adcde638b60fedd2c9d702e7041da86e747b5edb08cb5192858b4613dbb283a4a610a3971ca45aa0583c99090a282910c37a554f875129982c5e14b6789c7f28993ecfd387cce1442c97d2d521f653c885ab76ce439241de6f7ff091a2473e2d04e6266122d778719272238f86504a5db13c1e58668d9a8b6eaf30135a5eb335e5d536239068bf17d663de930ca116adfea6ebcab23933bdb6a3a11d0a97122b463ac3b4da96b221429a4cadd924ff9f1e355df10c9e374374d2521fdd3970898a69b9c55790b91b2afa32b5e269e69dee22a65523ee4649e104974e5217afcd875d0000000000000000e669810100000000f6df55ee77501983611708d5fb106ee18e2f59d2fae0fb89da4dbc9009c5b641b642522aecf8d6d4d51f90734c06ebe20f7202fb2136438dab2e204ec30b57cbdaa639369de600b4e9a5ef37f74c1f57fd42fe76bff5112737748737d3824cd20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091f9a159ccadc63661dc1d0727acd952db562749f5ba8c13d270a2be489c99cf0906edfb5eb6bb476b459579b6ebbd6d641318c31b180beaf9cde2fd9136a6b1a1490bbaa14abd899a63510089c1ebdc251339fd3bf0374022b6768d53f79ca084aa423442381c9d19fc8a4634d46d733d60f4fa693a69f78bd0aebdce4cd903020771348232220c6769347542eafd5604f732aed1681100c91053380f44208227022471c35f828be3296de3360dcaed72eb2e448218eaab1a92d778397c4b292d590b07e80eebf24cf0fce2512ed171921a873554e78025909b51145572fcb44b79c1904a3cb27cf323cccd5987f4d2b8acef0903e447392b5248273af62d6bb445f60204686f18e4e4e543ecf2d2ab45073327a9c853988c96853bddbd8d0da9a1f1e603097e99671ed3251d86e08ee20b9f0340f4f3924cc36dd3ac08dcf24abeffcfec0206a47e178f035d0eb72163731c2954223e17967915a21385f80a3db7e56fcc4f020bb67aca78fdccaeac84902b3a3a9f00ec4465148488ecf8da0b1fadba9d7cc603072a5c31826e6531e005056e4f9db3f3388f75278d7743376a316dd0d80e3691ef98349deac8d48cf89af55628f2232626443e8ad4d74c4e7d2cd18d045376c1d0a06e15f8226ae9504a73feb6ea6112e3dad0b3d781cdb0b47a2b10565313f29be6df7e4820bb207476e814f903e4e854fcf3edc2bbfffee88a274deab345e0970666cc8077e7bb7a1c655881103ff6ee9e40316f43bbe40868d6f1bce71f3fa702b580d22820d9c170ed8c764aeb34e99627f676238e9ffc8148f10b3b0b43a756f2d18ad13ca9d3544ab622b9e94cdbe2597b3f61c3db56c244dc9b78483e02159c317c3dcd47b1651f99d6a287db51583995be592613ae8f07cd5ba4e193246fa2609d09c18a541ef589010e78315c1e0881475c017c8d54a934c7293886e4d95b8f4b5c89bc7f1e4b9941919e6cc4e4091dd78d26465b551c06fe9b7921cf0beabd7d67373089cfebf4db7a2887bed2df275c5c332b5e0904463909fe12e5ccc990979a13bacac82980bd6ad7ac5c64e71dc8cb840f5d3b5849ff09d3eda87407baad487bbc1f6a5b6bf75822e9d7736b75e61b7fee6db836ec4a648babfbb7e1c990891b6722fde24e073862306cf5cc71d5503f71e9732bef51687c66fdb0a96ab4726ac6e327c2f7f60abd03005534b3932160cdbe058d76dd069ba25dcfb8e890154967d78c48a4bdde641926125ef61c4db296807123578361e9d3ab30e985c71811fdfdb42652e49caad62a007c983e8fcb2895edde1fa9034c9ace21e9106caf386ae7d20275dc20f2a30f435bec666af2f9ae38cacc453c2a89a80f1bc47a057bc7c7a0692eb41f0530f5bda5b799933aff291a999affc743d365a03a9bdb2b5897a071cc8573a9089a25827284af6b8dc65e41813c3008e4778f7fab7f64b41ed1fe1453a54ef3843aa34fb52fd1babefd1712ae0f8d740b95e9efc3e55ce96630ea22a4b89d635e7bacf966ab30d8cee80254e9186c47a7d96b23f050a75b928ad45bdbf27ccc4183632894c464f44bc749737b3d081a33595894a0f3e5631b2465ac64e5b930cfcece4bb796d33e7cd0886189f69634a40d2a4562749cc9c3364a1a6a330c60bd617079c92d7d69b7ca4d409d624367eec05cb55470eb26b49250e1f549f0332a9a93d7bd10223a97dd2a06f6cf890f8dd4f405eb6f10d827c1b3d347948320ad153d53dc8ce422c0ba1bfad10a896f930e90622af24f3ec1c2e2f9e6294585f0034e1101e74800fe1315fcdde817cd744264e5ddc00be98100ea07901c162217d66f30f446c580415feb3ff9bfdbad4798f61546a50d27fc3135c5469d6a1a24bf85f3cff723a6b2ff80d63310416ffe4d58a9edb34bd254831f6f5d9e5a282e8e4bd9a9953bf0ed01078ee65ffc12b603dd25b0680946c871d8f2a3e3089dccc516a977b5df47b87f02e7014b0222a02afdd9e6323431c68cbb4c7dcdf9a6cce1ff94bb4d902a2d1780b5a4f3c04302492c74334fe2adb9800186edc061a5b14c381e6f96fce87721a0ce8369882186c81db5e7272184727bf463a82720490d0e252856dd647a30ff2bc14ca62f65752821d4349c68d1a0154752f01938714bbda99ceffb47fbf91ecf1f485d80c5f850fe7986157bd6e8a29cc1103efdd4d96f3e8ae7331aa1a8f232d0c22e9ec7883fd9cf591d4aab81e88cf31f1eba35e1dba4db444702343fcf13795bf8aacfd1cf30846d3df421371c125f1beb9fb570a8424a000000000000000058b3990000000000a8c26daced23b27565587d0e028dc23c9f838c79d62ca3e5f1ac971236a39be08dc2f07e304af45b81804cd3b2dc2e3fb721c3341e612c58141a836410f9b9229df036689518d27c6f1a4d0af2fb88fd7ee4c4e9ffe0710e9cfc99529542bf5800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b4757f52bdd94315b0d2806e314f1ca013231fdfc55a3d509d8f8dddc1b96c30dfe65f6e82d34acb21f1b74080cd952ab459f87ad8b9595b80d7e19d242145c2a7cf350b71029ab05df548addcf4c384922b34685ce4920a6e6953ad162408af83af976dd41d7678fd31a617df91869f374598ec948313d3cffe9fd50b056232030d3c9100c3e27a19a90cdd2002b96ef53777628e854991d117c49a791d656170021a47d786651d0c4e508659d02ad1890116c0c88965d79a9cd51069b0cc93a5340b08c3e0b4e7f6b8d2669f69b1fdbbd16394794ea4ae4965cd31b94b65b5f0056b8f5acfff447be52390b86f55f3ce2587bef5333927a0a9d9bcd4a4b769c42c070214bc87aa61c7af4e5c36c2536deef702382ae7b059c578ea9c5293e9108315ea0316a0b130017b0268eabc2ebfb70e791d8b45f4bc24a557500ea09784152e37d2030895f614b94f500ae4e1fe9bae1df1b1b500b4a742f620b3f53e6bf402e99a450208fb2a9a7171f0eeb1bfb957eb89b800ab1becfc516b579d0a51a884ddfa28a4031a7ff488f970ab8bffbedc0debfe88e8529753e67aee80d016acbf19d334f337bc5a6ff212ad77651756aab52c083c88438f37a84baf85ecc964a6e49991f3a0a4013ec7b284be5f6a13863bf4ffaff4172ccf2b68f9d5e090db4013deee235c3457b619aec28105f941f3692b1eb86c103828f981c72165ec831edf08f18e25fa0a9e866e719c717a731e7f353691bdf9b96e6bb4f8b8805b5872d6475251a434021d77736e16b3bc100bac90f79ba702ceef93a3247b0a015fe00e65ebb5b54a0ede654233694612141e37d80bb7766e3cabfe310842e84d2da43d9cac776b151265d51a8f48888f91448f0f24e1068df9c6463d4329c1bf31a8dc791c74edfc9b68d1895b6568a6836a0ebdc775630e7e87d1d804adc60da897401f053050e01b827e39b388711297c28efc8b4ed99869dc86187414ad88e1e770633e4cc256852b58cc43c210d7c7eba8167d3658741e4073d98f89ea38534f66202c05387551923d00a2b864e4d15ee4aa3ef6a5a9e1e759d87c2128b1b8bbb7c5497050f9b2914b1b8d1c72c051bf3f07a174e71e4cabb64a8b324d60dfe2aa9ae20a8e216087c784a509dd09be4cbb8d33b8d37d66dd9c178c45de598712104c9a382900e37a2fc287968329707b54acdb7b80e2e344eb6962bba50c3bbdbc8026821b4539e9ecf169cd799a3992f6651ee37c539973578d62a57b67bbf21d8d3d05661b239cfa15443ede3346e92b6098fc047ebac280fe731598aa2bed0a0ace54c0c7fd542d093b258703a11b54823b47a2dc16e44e181b9f8651d6e46612d4faa3d64eff92d43a538bc8df36e4d6f120e88ca7f947c7db68b7a59f4f3eceea8c97d8301d8458584434f09af0be322df3def2b94b36ecd8ec617f6798b07cd00c58ee757c409aaa8576241270ad1114762e2fad8b0b5e19e1d9d25f5320bafce894c6cda0d8852a93bb2962a48f0e5072a96ceec8ce0ba5c1f68c82e38278dfe4b6aa32379b606b1075a51d7421a2dc07e3c02f3db0fb260c8f5a04359ef7d4f6ede4b759124dc6ac8b3bd9ca58fb950dc8ed9e5b560d3d0f35c6f7cbd1d6068d067faccc52385541c716ed4de7028b86b05ba090c5ba17c8a801f388295b2893db3e93704ff79af3a048a739ae15cc4bf24f7649cc6bf44115ad9625c9705f7a08bb98f50c54dcdb3b3df8cc55f7e6cf0b83923c0cde1c2d7a718bc081a169a0bc0cd652956b354d02b01a256cffbb8bf637bd65b5e61e87219c8d58d97d76a63c4a707b63c2ec07fdf79e94046eef5d0119786c93b72d72f7fcce0ef2a77a633d903fe138c9eb036e2b8fbbac9c611beb235169505fd12b3e48dc41a0a2a2fe77dfc284be0317830c5f20ae5ddbad73371424dcff0e28e31c75772aa6ae99a2c2a152dfdaaec4e9c8569e8eade9708c3acaab3e7d48ce8a77f6177b011cdd9196b3c2d036ca890b3b6d3d5d3ddccd3445f9e4a83fe192e2fb859ff52937e8258f19e0e46ebcf168ca5405ff18499009d1da15e32721b715529b669451ad3d1dee0b895657f2501b0396a0f87c003045ccecb54062ad20e79fd5ca64f7b33927f1ef366c477c0918d6bf935a468817a00ad28f88330e33a3609a1c451958f3e06a0814af9f6c328a2e736e8435b7234d46af34415fdfabae79b2557402de4db9765d48d891af3a6805c9b40588e3e3cd751b2f5fc6df0e25b9064e48cf77055be33b7ea304e3edf2d4cb0f223713d3157b7d8338190fb548de1f4fe5688a1963916b8d2de2b3b7fa355cc23873251cd0bb3c1bb85e0bd42495a00bcb3361ecacb951e41ae7cf26386be055638e238b572c049ad030e8c47e3ff5fcee4cfa213efde71b6b64290dbc4f2af4e3519a7b5cb7a503", "635265ac51ac", 0, -1858386960, 1537743641, "02dea419f79fc0f2c3e470ba2b916872f0dc410bb74732e16613cfbfe5f6be99"], + ["030000807082c403023c1ce03cc6ba8d12ec2005756b2b330569380ece25074956d8a7bc66473dc47a0000000003510063b053d830ff00fbbc80fc69390342d6041abf60ac350bba4001731b1983251ee5f8738e130100000008ac53655263005151ffffffff033028530500000000045300526364662d0500000000066aac51006552dfb7510400000000015200000000000000000100000000000000003117680100000000d5060720815ffaa3adbb9e6fcf48242d81d7a0a9c99936fb03cf7123ef772ed4257cb297e809307bb62d526d9b05b1fb871a415dba0ed92d2e6b7376207ee03a09f09fdb096f36539f19b4d5d64eca7db016a8796b48a737085c3a73c25d4b8600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e449ebce63eb9e32bb497d905b2e01d9f0f9ba7a5ee81270ef24e3a79859232f3c4541469032a3e3cf7578caf14e3221018e29ec18473be93e7d71fc13c90c58c3e582620fa1e091357330ec74e8c73f390626a8ac2173083beb706d2ec35e18ad2127791a4cae610f849ff06ea765a2e9ea01b18c44300cf8809a10855ee98a0329d1be4d788b7ab41369c43519431f88b0b3042d1f709fa865f3fbeb5bffd25b0300358bbcdf357fb0e39f21ced26dd2181b4a01778106eb2fd1318cef173996cf0a0568fc8932b5f8903a274b0c4c1e2136b1ea57df0f671066c14093a93d60486ee05482fb6086bfb9e570f5985117c9877f455541345081be37ce0ebeb8037f270328f525177aa5ccab38a31741ffca771cb12e5cb3a6ab321e25f7885a0256f71f032bb6ed1ff749a11a467844e15d163f73087a015157ceb7df6c3fc2aafad65045031f83c0b042286682dd9aec504af585639965460721c9a021cdbfdf73c7d47af2032072171ae1e67e99b5fa11efedd0c8774c1d42837e089003cbc25eba4671373a030f4557ac5143fb318a2b94300dfa05146977be4d6e4efecf95e8568cf6f9a213c6b5c821b35190d08a3500c3447acc85241912bb289a673428582a8e7fe9c797474f9765bc4d686925c5b86d5b5146cfc9ba5fefc871c1a6bf03d5856747a783c17e61c73ca8df8c80550851b5c9f4a87b84dab6aeeaa2f8ddb53bf4982139b172849142031a67022e0332eb84e35ce8fbfa9ffd4ebdcf9660283d8ecd615cc996eefd53ebc297623123213717e29826b2ca753a15a177848e4e3f79747ba2dd124afa6e14fcf28aac9287fc1848212443c69c524a42ed5fa85d6723862dfd7331e43bdc4d9511d27fa2a54e006872ad176c4faefdf36aa06d6ee62201dfcd0d35d47fde5b0659d1002b1383159f44955a936d7f68c1db535159b16e8792cfb3993d5c5de8dc3d55e43420f10b38c65375e9e71d666fec6bb0ee8917de8590f33588ddb2ea2be23f14d015ed7a5dcf4be493bb32c237f89bee643e310d3d34ca6c9fe8cac989c01b9643feea4fe1c19e7775fc5f3e2806ff46a5ea4372ca3487b63bdaf6756929adac19a0887014c5eefc6302adca3ba66e1152731255254339124f319d646e2f622a9a85f5e89a4da26042ffecc00f73f06f2794b451606250f2f3a0701bf8f303be887a01706e98aae19ecf7775266140686ad1f61731d0bb8ee83c6b3faa9d304ffa411a423184ad4115419260cf7658c82f320a9ce448dad9c52da30a8faa7e440976f45a32527d3544aa305c79474a0eaa688d69af45a85f92e21a0a898f9456f4e11eccde77cf56734620b252b9454a278d1ce36baef1519cbbd6665e8c728dd66af61327209f6a2ee780df6f6c57c4bf8d14f4898d407c2a1d709ebcdcf5a9033ba9239e769f4d8d4605f2ea40fdb7d83784b9f5726bb7c7572f79af0dde11bf7f599dae72616e55cd252343a19b053a3ae41091e1418eab8600a27ba9e72de7fecc952524315fb951e87d66a970e76f04ac47788dfb84e6f0aaba5900f979eb94b82aeea9ee449b1f4fa88bc42a38ad76abf566c9ba11ff52a8b93162fefafcec075a4f9b7562b29a09aa071f4b9808e7fac5d5a4079d55f9839d590382f987ec1fee62c34039d4d9299a7159a788390b2881a427517ceabee96be9ddd8426da3dff8293b7c6ca3b6bfc76d275c656c5208a23e7036a8fd0829bf6c0dd14d2f7bb03c30c495d8f5bd71b735703b1f6863a0e3f68f54382df64343d23037fc6314893183686ba6c76325a037ea487a665992f28313d2d85dd27d0a4d749db9f39a9d9f5caeaa054750293093bae1e3d94d3fa5773568ea208cbebdb9eb05c61984a3f49c71e22399ec834ce7fa9b34b05b0062cc77962bf3ac932984f035d14699783c0541877769ed80803bd5d688f49ffe6b1171cc82c8c73245d7a50fd3e1a13d90eef1dcc919d5655d249faf37419f5d6c24cafb98cdb5c3977a192d3e010a9aaca5bae99751bc954927d87f02c31cc245a31c3210928ab18115fb081c727e5ac3d40f2257a59fe00b99d54d01e8ddb2c2a479c42d7728f56a1a433596e496d9655ef10992ed5dc1a9d53fd71e8d904c6b87957bb94c77d6481462f32bf9f8ed4eec71798d718b60eec76e2dd2e07369cf8cf33d77d7d2bf1cbcce0f0a61af9dfd62cf49859594178ea860ee270ae1a610292a54c4f4415f9ac10b4f484e6d6d6ea680e038f33f866d11a592593286444d0e4829aa04977b799495b647934e9d65e4289a0ee854ff34c75e4151e528ec5a9f122d06cb17369d6459a37b3ec1870a34b31c6b4b5d48ebfab9ceee10d973286b1d3533242e170ecd1f3570d060f36cd3a827cdc66a72be015b07146cdfc0fa1f19be794d50959efce4094d185e914df6c27aaf09", "0053ac6a65", 0, -60658009, 1537743641, "dc3a818aa87574a9f83b915deb7bb5e76f18085e32614687a353db27ea19a1c6"], + ["030000807082c40304c11f5edf06a5597e27193beb2daaf78e5ffff720a495e82148c61a915cc1c8b60300000008636a636363ac6500ffffffffa07eba6fac311f147e0afae948efad0340c8f0dba26e0e2684bb3a185e8724250100000008526352526a52ac00fffffffffa32368e64a49a68f501cee43331b7fd618baa790e8fd633cb575cd3c7fd833e000000000100ffffffff034746b006ffaded3de6d410e5ac8ce1f60eaf590b7af594ea1143450b4bbfe10200000001518f8188780110c7a405000000000363006a00000000000000000347ff4501000000000000000000000000ed9ea3bc9c731b9c5773a121bed895883fd6ec375b1813edb37eff8c6dac2beab004a0a5ed13d4478862d7c193e8bc6b105e002315211872feb9a6a3de92140b17ea85599285cd967dc736d1001ccc8c28388090e149408b72e61c3ebfdf8fc500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e610178733e92ec3a2fb05a80de4956099f34cb295f1bb0198be80d1cd2d3c8d2964622dfc363f7272fe3937ddba729f19de6b34df0d85a2347def1f005e005279aa7504290101bdcfbf87f536a76dc94218ba0a51504efd40c1686b5c68d6fc2d26e6d6af11c25f03dbdd769a680aac46d5e72a9249416504fb641fc2dc288203305c6a25092b9d4d90ee4dd57fe01484b16df501043107b7fb367b0d9a5773e0022f07469d51cc93d7f8a97a88c2e33a8811e36e042d175deabe51215fef606df20b0737dafc475538c4fda28afbc6b3cd39f95ff03c9de87ac5128c6ca81fa918445bdeebcbc70e484d55fe6f15a6dbca6921aaf8c9a2907b23c9c09e2504a13bc70211c9b0fddc805e6be1cf36e63a99e280e7b7fa56522f4aadf7abeba31a70bb0d020dddfde3597b1731a9205be34787309328ae9f766c977b321bdb489cc570f3810227fee88b2c8e079425296d271a1cd5c8ef2f262257f17fbcf11d5b3ae3ea8da10209b6cd2011ba07345346bb46e95d5cd6f61b185def7f1534f02ce1c25567b28e020f442d0132f97dbd48653887c4f4b8e0198f87a295d6a24a86cd9efbaf460977c7911bfcdf653519f6c70e1e4165cd8c5ed50e4cd5a7a395e2f4140594760f38f9c9c6cd0c7035e0307b4f0e9fcd0e21091f1dcff24093bb42576f773a27e181fbab93734228469b58261cc0734d50062a8c962fe4d35f0f21fb613596ba51a16e975fdce212a83a424a5541092e79b18ad8e26e327470244bf803c3cc27d42f71da701c3ad769d5d89f52a6cc48184637ef888c5b5af2b161877dbdb693bbc35e9f2cd5c4278e455a53a63a8eaf83c974290ba4eb9b494ccb2778c227fe6cb2c151dfd28da612ac42e2727edc3a85e54de652c3a5aea7ae5de8236604b631845bfc1e3a34f7c03514ff31fd2721c34f574fa17022098bebd569b8d58e16809789a2426076d19b3b2d899f01e4d3e65273fc304d52f7ead1377eade0d2a8bb08e7b9a71d57910fee3e05f66b8165b07787bda4ec0c4a06105d0865798e6d0da3dadd2f2bce37595a3e80e8c7b7aedab86b984ad84a8191fac8c6dac54205963b81b5c7bb4d0acd75d62e22b7f808286a04755c18d40bcffb9393fbdc75a337c6e7c0d09f2bb2b71732e8fac71eef5b88ce0d7dc7c7423985cc20fc13897f34b14be55465c364488d331d9933f937ac058b35bc2ad1eb203d86fce36f6a88f1dc3933135f0517216fa8ba2d611449ee827cfa0a5a857fa1f9233863f628907c250249841880ff1baeb7455bfe49784843f20c929ee3de121af93c341f6b00d9317eb6b02b824fa74faa40d4ec9c83c3ac21a774915b5af38f6dbbb9f07d15557f5d9228cd2915241eb463b764154446fa63c4db48ec25d8a7db9d5337751173912955533db5773078357bba5d4ec714f89bee5a3331485f142cde8cc00b1e3ddab8c9aa1e8bb398718a69497760256f9acd523340f0b0dae913e1585398ff79f72c409de52958a7e70a0d1f13351d7f838e4dc4a09bdb7df22bfadd814fd52d515f7673f3f862c8e43549772b9311b1936707ec253dbc0d5b2aeec59d00eb3bee152ac3c832a477eaeed7ea75510909baa7b84bbc88140db7098197c3b9ad88dc2550346d15ac51ceb370233b9b64dbffe6c1e5472697c48e72c5992c7d97f86ddadc8ba253990b102a03e48217a22cd9a8a6178fad62f7c6cf558f8ce64abfa18596ce3723605fd00e9e6dd59861cc4ba2434be23d6dedacfa5e07f94cbf3ddb6feab9e063791f57137377eff9d33cc5dd303f6ab7739029fdba061f615e8fb6ea0ae7a0d26f534a903d177b43ac8968e5af972f9c490ad6fa77729c778f78fab8a27ee204dea610e45f37068527e6ceceef9fa671fac8fa85b29c3f8386367cc6a1c840d3d2ca8f65183f9e38202cca5881dd269aaf36f73bd08998b01d86ae6fa78f0d5581b0f0627ce53e549c98dc6212ee67ceb148a3037f322d135ca5a7e028e10abadd149c9dfd4d92d5e877ee70321f1801c6d8552ca6cde18a6c5b8d9b17d97b3b9eb2aa79f63fecef9b1048a19c413ac7783a71a2e6dd07ae06faf3ce3295595eb750d0a0f3f6244d076940b07d2201ad2371a8549995f1faeadb4571e54171c980ce303f4468172c4b23ed8e65b2757e615607368d9bc6b1dcc81bd144c3a852616b58a8e0724882c7dbbdf143a3f05e97bf272102293afe84c4f7f28d062dbb72ba1aa00e11f0d8c4250f13b2d16515dbdf74e18c8efd6bfd5c81fc1f8dc2ca725de120b22e048334ededbf720000000000000000157881030000000084ab99587774b792efee10d1238852823b7bab91e8550e7eb2d78ce900245e46dcb44198761157d8e55e85a63daf6844d869ff5a4171d3f0c1c97b748f4ed513f2bb20b77df73fc1910a51ac61aaf3dc760caced23eb575655ecbfec5da2b8b500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a13033f19fc31b8b7b3654c6cd3b5266295e305cbfbfb09e8477c8713c52ba383260b79fcfbda6b7677e7f5bbf19e12f7fd325aba88cc33777a5b9a031d1f4496d5e29781f2b9b946b2439705aa6f24031acec59bc7dc99d34fd0a89f0b6af14b0d61193eb83e8442f14ae84244a1f125a3e745e105d72966b8e0bbc7d6dff34020c6659148a5b98e7dd94d7bfd863f1ac743d0a05190a5889c361910be04bfa45031f98b51d02e68e3a156fea490032407e9939ca6bd6c748d3a54a0bbc842f1c760b00c125c0bcd0ed27a7d1021e382cf51d16cdeff2e61eb2fe968d3acf42c0029adc5a4222b3f6784aa962415d11543ee5619a355ee6cf5efcf832610e1fcc6e200228802e43a641c4353b5a125fb9085ad387b97f9236f1d1a0bdf70c8e364de26f0215c3ef8d78b16613a93c56ce248ded75dbcb8e274df0220cf306a2be48b1ab4b0314120768a34c422907b1b96118a0322c83cfb6e8a1ccbc7328aafd3da38da0b3021cc609e4d42d04732e9efdba2b3f6f8eee441ab324e4505bd7e211abb020a1c002033660916f3800f04dde17fcdf2f927d839bfce3d4746490fdebfe4645ce8dc257202e5788e7da0221b42efccd3b654429945b5c62c7a46ff0ec462a03e034b61ad3d573911282c9add84eacf00e6a8535314d67f578a2f39a840befe60a7a559e1c658089357dde68ee951428004b6231b3d63b8a53968927c0a24d046cb0759633b7a085ae76e8005148f8a6f0f0c5210e27518ec305508f1de25f2ed83f2b22d470af8048a82e15cac11e5b9090f4aaab34ce64724235a253393a23775a8645a247e023cbcf81681f10d30fd38386adc57ada4d3ab99e30a5f7b1e12d6749ef73f2c0ea006d700494a7313a3b647cc5bfa8425c8f66fc038fac73fa3cf730177f9db3a5eb4f149ef61bba6effb52a34f16261e74c92b79406e93be5df4849206dca20e80487e4c1a56e8ee4263efed3b8927598fa771d8d500e2dbf4480b9b78aa5a39b78ca20e7e1448434b06155a257273ced6a3e9747f8e968ab45dc3ea0d5cb68684bcea00cf82c424b609b28df76bae5943e84a85382f83ae45edc6c9d6f902012ada65a5651d02d3cdee42d03fde49ea08eb678bf53c8bdde45762a531cb1212f9de85f10a412a419a0b1b3b82508336881535a69bc48bc549fe3eb161efd04369549e674c375b2316afb716aa3bc44496d77df68a1157916e3252813ad09b68acf532b7eaf55212f22d6981f6a715c768a95aa32c77664f99851b30bb375955bb9054f18877e843dd18354044dc2e774f89371ab6bb6c08fcecca69b1366b90608ec878aa7cad1a1c619cd10666392a7396412d4b541549d302a62dc8c4d42b7b5141d1054ed14db046b9aace826f03af973bf7ed351fb4204b575fec1c06c11baff96e554bb74a84559f9bc2c3f5ea0ecea2c5b42d53824260fc4572c25ea8349b1bf450c5edab56cee9a22279e5c1352474a2fc2e28617573ba2ec8212f453841a485b62e92cc0f33025afb15caee8411f7b275e7ed5b8f268465984bb62b200dccc12a699b273bfac2bc38c889bda44aecd41c70087e1c72308e6f7e5040cb85fb969e59f1ec8626e806ef4abd2a3c18f2bcd8be3db2aba9b41bb0c0e479188ac1680e258d26616dec7f2764cae268196ea0c463e7eb974cc735e1e64e05f03ddb80729096497bdb3d9ecd54e29e599f725dff43daa026380ae83c4020ec4eb8eff462f2070c5209a82a7e4daac358e22cfe64004c362b630025ac9b555838d7b05a279f916c24ecea788a948479975317c462c480f0b1132d0dc560c998b16bde7cfa0e5b1d1f271436ab9419d28b126d5fdbbbf78e934fac19c69f5c15e81af8bc0bb4b0a388bf91bfacf1321c8c130a6dae56d65001fedd83eff0caaf5112ba66e7e02f55cd4156d881b0830573e0ee8a26dd99dcab9b3d91729489a599a5ccd575ce8cb435645b3e787b624c5c1e759a90c1444a956f96c3441cfaf31076e2d1b985171b9821cf5679c41aac8c172b140a3d226df6ac7ff7632f66bc9e63aafa356e96dd690c675b16aea9ca57e3b433e8575e8854afa95a6c725156f68642b86b81e14396d690ae309fc89d78795fa4899accfb3fc37fb427dbcb862d753d42fa27104671a90dfe7383014cdd8a9f13a292aa7738d0c9235dd0981770031ee528aca79d4ea32ec13ea6bfa032ebc4940df2a668a2de2779209d39bbe40cdf36be477799ce4844bc4d9394063a325c1e90c82c336eaec23a4ff807b06b511fa2479f11dbd32f25099625b2e21020000000000000000000000007dea4b9c2bc0e6c7c963a2ddd16de2a192ae28ae6d6982dc23061e5767f70baa91f8ca766f5649dc3718ecf2db8c0a09be589689f8f31f07d24ceb5a0d8399c906210053c0a00d01421b0396742ce54c36e18bbf65452238022723e1f6a8cab7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007237dcff2e99cf3c85889a47b13d3b0cc52efad001feffc3c69547e439acaf56c19de1cc68b29c25a97df2234bf33bed49204e522718cfc09ae77d237928aba8b4eb72c2c2e15c9713547ce481f820d64f463f22eb57e175276a6f632e930f506558ace4c9f4d3d8cb6acb3a44ff0f2d4e0523287fb1a70a53bbd349c7e42f32031c61b75da8959b15915e0a07e072237bfe54f31dac2baa4fe4a6866501fc4afd031936111b03931b5a080551ad1cc912dbfab02d2c48270d87ac923fcad687ba4c0a02a0f62f92a069286633101c298a10a32375b9745e71b57017da8e8b3c9b4c157ecae0626cd75282d118aa92eeb0b736de1c5a69ced10fced21cc8257e6ee786020c61342c00040a5ed244935854556feb4e200e9e01d075ead8c6e6e5ae9183440212ae344cf2c86e25869baa5bb8677d1dfc6b04a09c2bdc7fe5b4abe24941a3a303057c8c1ef356444ddce267876b21d25c6e7855c6c474b11bd14bc647b2c9579e0210ce0c973140d26d1a623663beb469c3a024602735d5eac2e064363f6a2d05980316e577351149e05b9940f5d7f1c22083b53f38c2838b2c91d081d82ad8e9037bc11511671d445909a54a68390ed4ab0aa9ccb80f8f54ef79591ef78853f4bcc15d43badc4f27d05aebd6931d5e0d81012f7997281831bb7575a6c11d956e868e19f601b24b1cf3dba2158bb14bfe7d67c0b289ca3c2d5747948fc43615c67e648553564728234e6fed1fed7cb76645e0b2afda6834692d1e5b5d543a6c28c67ccff3f12fd6131e07845847e895f15a3b6ffaff1a75eae74e54a4912c9e0fae44e75c878da6bb5b3fd6c3dbe4cdb822db9f415683b9dd9fb5c5d6509d728dc7c05972ac047c7ae3be407fd8ce1172d7a4e891c62797905f2af40a74735155808f462d655a11be2797685eb89960398eef6f65a1d21b68e8ff12556159a6686a2296c21dd1caaeaf104beaf924631888b31f62bd1813dcac0dad5c0e8210b2d47a13f4dffd4bffa68ef11f491a5c4aa99cef12301acd989094f4d5e98424621a748fe15f2ab754b1d385a452f42400432db3246481f47bfefccf7ad5921f900b1ad2d0146cca49928ac85db2963aa2ee79f62c46102ccfa763a28ee723cab2c9891fa0420dfebfd2132616a655dcd260605e2df93626ebec2433c6c344c078f52cf122319e355221a31ed8eeee9e4ef29c1f38cfbcbbe0cd3211d6079ed19397da63e32ec5f72dcac21312d6e6ec8c2f0ff72ef68f2679dd5d061f61991c3a8943b67c731538f47d388ad5a396607a661b385a6293ab3637e484be74b6eafabeeeb165563481d8a225ccef00c117a1cd32cac7898b552a66706b9cdce79fcbf15da996651f48cdadeb1b890902eb16c05c5fe15e60472de034260597fa36e3f94490c1d95cd19e20272edb22b957032c2bb8bb52701b0e6eb63ddf1acbd19a77e9073c77528b45642a7c0311d50d2f73a1843abb2741ce831ff9f85c5c01c6c092e3863482d92cc94a6bf0f1fb46c22c2ceca64c6b599324a0407fca56ced131fd5d22ac8af094e85ffab9c6af46094ae5cd3ee0442f0d4b18255f93b3d73e2df459df3aae45c89c83ff5f0f7ac5016c7a53a1a8693da3603af663899b479c72e042e32c710ecf2adc0e2d619216283d769fa7bac300327c5360e01233115c57f48d9bdcc379b728402bfc2d7dc2caf934b95eb5c7f759027425cbbbf2d7c522638cf414cacb07135705f8718978e3fedae5131c8cc248e7d1e0645dc04476f35eff57b8f785ded2519d3181b0ad2547fc0522df7f056340641b8ffc1676707d5233979c6545c66ef52d50823baf314dbb9cadf02d6cf20ff5c62d1d257a78e5a75c613f9c2286c98c0d80ace84db8ebbb12c73416a0a2c6018e92ea57b3ee567e70b5d99d5aba380d37a80a5ff20c773930deac304664bb25070a590b2658e42c38496d9d9726bed734883e23a9f7669c115a07e90173b12015c58ad750d4157724a0f4ecb427c5e8619a216b7211acdb8f5c3b45f9b08b99f2c5258cefb20f439484e48dc20860cb72eae8651df65318074137aa91018251dfbdab14abf0573c5acd26f6d0dcdc6fdcb8512fdda7b046ac403958c5c041e65f9364f110e3020533d883b769868feec689e16ec6b11b3d4d5a977450cf15a1c41c9746d3679266561c1bb21793b52a9239803d3f2705886564fe3b3b10d10764795952b052b7b18fb310ac578cbd7735852e15a001604fdd013188f996f57e767c74ceef6cd2dff8150fcdfc1d6550450ae2cefb28cdb3095d27a256a2ff09d8e491edfbff6931542842333558a3a05ea42399411ddda6d1b326708ff1c01ed0945fb5ee3592a06775f9886a9c5ccc51b3ef2016776625f5e8658ba245958631ace6e735bcae6fce3bd31d28bb6ecb64debf7468b8d5784603", "53", 0, 717545970, 0, "951eb914326d267a06fbe75b5c3bd4ab59439c3387230f653d3b46b9bf2e725d"], + ["030000807082c403016f33acc3aacd19b222c2130f38038cae803e4d56b77c7599b40469c685069ba8010000000753ac6a6a51656affffffff0374b74905000000000163942fa802000000000055ce8d03000000000663acac6563acf0e6ba5216472980020000000000000000b437a20200000000602590661cc1f748a7c230095d80f4a250615e1586ac1004a103df5139e4cebbb15691d668921c93d146c879e2a27025f0268daebf6497c88df421f81aee4aa93948e0adafae6ba87015ef765aa7efb6ee77e5078b5735edac3ffe2ae295b02100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000583f124a75eed9b4354af9590914d34eaac17f4ad5255509870d054cdfc5b26fe0e1740d35b06458d212c45d548c49714b6af92c9149b216e2fe17b7eb2ffa820ea83f0c5cc949036609e423c2684f20c3fa786a24c9885beb5a9101918ca19091e503462ce667105c46a9f6205d43f9114c5dc11aeda0d5c7cd9d2b08e9d7bd03138677138782dcf0da3066cab2def18165633d72df25a351c11e8bd451cc7a070210c0671e6d99b58d2d79e93af843e057832a9f78abfe522e58e01f21c006ccb50a006e303390abc1e4fb40a4a3b5e5147a76d2cda9e952276e011bcd9f625758b31e46a354748e083f6cb8039f17c3f2d0ced6995c50c203b8ad97212958362474030727ab68b65b2db6066f4949d9683b51701ecb2d78060578a1ec8d9d84e099d20201ff1058c2060c631752a8c9ea44b7b64cb73e2dfd93eb1baab631cb358ba81c032b195e55a3553e2f4c7765c3314b335aaafd47983e07c5f49101cdeb79a2814a021bcca8db8c5bd971a0f74bea023f8e0eaf994970042ede2d0adaffeb2ac01ba10300715335f875be96c2b38119bf88e5b4780d0a4efabc8658b69a5d0bf6d2ea808e55f61f3e29eaa384835c5eaa6f9a70b7c9b3539c1beffcd8cc8667b704b2eeb8b8003df3506f7020d881e58d91f214c2ec5b190a279cf133836176b28624541bff1a1e8022fa8d9dacdbae95a376407cc9ba726579350dce2f98f770cf92fbcb71a106aafd9cda7717b685652ee103bc7f150626c8de4b25b17022d68487f431895d1fe869215ecda7e28d8b41407cc00dfae5fc5c16329e2aebf0b5255fba9bde4a1d811095fe2dbb8ec05b9c2080af0fa0740940029f428c7f0b5ab2f3387d4fb9c84ac93976cfb6652bed302be14a0b5b5a84e1b94362c077434ea2442ac5db06c26a19499e51af770301a1aeaae93c71dd0c609ce28d0b5a02e19e9ab952abc9ecd646d7031ce9d8b2fd569587d9e4dd79a01f72725d97f549766a7b3d8fde754da748daa754ed648c28215c1c45a98e2d6551cda211cc5812c58208c97a77ca9967cbcbcc2d9adbec8137498e1f25ff8633d270586a1622ebb81f6556fcface677f2b2068c417c222dfeceddbcf75977d09298b5a3744f3ce0115ad254c513ec93a934c5fce5eaf991f39133671f62d964903656977d6c588e54207d5f73a5861a056267a7dc7aebe4c26594f79af8c81ddab3fa2b7e65cff149ae79d96e0707292c28bd63df9ba796a0fb30f8e84b1a8a3411f817be18c114bcc9af0b22163217141079f2a4789ff65e1edd68cd5556670ff9ce7a33542c7e77f57ed3bd22076b7d75d1c8fc2d5198d5a5b55f1c5ca6497bad6458d8c38831d330717b6bb42b249e5657144c05a84f0da896c78400d3d9763d8c6405e91875978b7aa51f8dc23909c117e4c7b9930521410551e8946b1320beaa9c5a38eff524ba81049a1eeebe66e0800aef8976b66c59389b6eb6087ac835d8e8860d2656be18ecf62011570dbfebfa59602394d0183e12468e4e10baed6fa955417f6902bc5478a533f16c1312d348da7571d77726f5aa45b140b144773ef6e60bee85cec59b242234b4f3217b50ae30a05c3903a2c4df798a1d3480b5953a920c98de626071b2347f2bf0a3172764b66a2848efdad4afd0dbba98860798bf902cfb2ec52747c18bf45e0b03337058f745f4e33dbfb4c3bcda0b9ccdaadca67cc4a34d7c3f6248afd7ef499ceb9b6bff99aab0698ee4d6bfd3ad7f042a7818a758d0138d3ccb37e078830116d6088f659a92c094fcc3b05fccf2ca0d3c7bcd8e0fb9aed3f38662643903856f443bc1d0d89f935670602466ecd380688fa4ad7d7f6bfa7ea87b4fea9519b2ad750178e4edd1bcbc410c010b67443708ca68f676f78a736a9feec4cc2032ce1539e5a86d5e36635e9a462c7b49f32d9abd2b261f73fe4d98cc158c503809dd5316cd7183260db02566176ac7b4408db1b1db7eb2eaf161885677015af0d82111c9bf84bf145f1f0bc2c86c292e0c776a246a81c828dd7e5b37a9d245647f4214a0e3dffdd8630e3935dfe336bafa0ae16eebc6f7b32dd4f7cb71a7bea71a5c550c066ca0257dde1772f4282e55d4a70dab90cd79867c118a0baab588e6b17da6cf9daa6a6cfb5b465cb8693619c156ad7ffd1026203c0171c10c802325bba34a0818f420ee1565bfd58c83b3efab3a2244da1e54114118740dd87666f56e0255e4ebcce22087626e08d42d6f12dc4f06e015089012ca15f45953f8ad980729876780f2531d6b3a7a62645ece50bc655d604000000000000000000000000c87a3fd582c2af54f02ac6b3645b1f2167155860ad7e5d0b2ba14441a8a9c2943929aa6ee463df053cdc205d5581fc1273b89160996684bcb3758f88ddd70b49f60f33541e2c513b15f08f99be44a27137794dac7d0096e12f0568b5a85e292f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d77a85cea045c9e40b47feee8c3aa3fa85a0ac81a8cd050a26c6dd36acddd4223feb48be1c03058f6b451e12ff68c6b465e7005a858b98128709b972534a262b53d30bee3ee6f84677525624a530b891886518a67615509e49b178aaf9309ab25ffec8a63eb85c03ec175a3adb3afcd906cf9a1c344c9390ede62ee90b98e4870325bd94c5667264b9b17062825653e334bd7dbb6f8a894a8b2ef8bfcb9cef4b39030bf625932fd99e1079172a83f672b966d47ba9a4d02c64ecdab803082d45a6b70a08b8a0973cd93e0a4f63cd81bbbeb91173fc2b723d390c137a6138044c601a7d39d554eb247758a95ee0d26d44670451387a71c3c838934b740b811545f3f318020d7f1105b526a5a1986d4d8fd91ae60fc8e6334c274c51a0f16ba052de206e3f0225f7940bf0ac9fe403dc9807271ed122b7de174f22e254f93bee8f42413f51a7020257aaca68f8493aff308e2b0b4671f523bdcc346fff0faa8c31b032aa8c81f9030baba35bcc0e607ce40b0f880fccfd772da605cad937704b96d76bad48ffb4e802294aaea6cc04a487e96eefc0da226655e8a85c5ac3432752fca534ed7ceeab2968749095782acd18970b68c5ef366092b84e4e8550ce9d7be1c41ea355f01f29b7b6d0d54933c614b9eec3a8ea4c919a413d0b0d735e001f2511cbcb2b12974a1e5f5b3004c24931565b87ffe4ff6e0cc2cd414c640ff78e4102ddde1abfea8a6cb37d587941b24d652e3aa0af4ee0e445de4000eddb562d85465b82f526d55f6be09a4e25d1964a472938efd774b78833e4999e710752ddabce7f89d755a70379f7a49261650843c3ee1b1ddc53d0dfe39d61fde2beff1beb1f43396b79dccd0c45b93363e37e565a8e21e7e533ab04073bcfbf4b58c142afbc1e2d0451a7d73e1a50bc5e4804f2792d3cadd9594f3ac036ecbb62650a2cfa74117c1bdc19f8e97f5a5c5695c4768775889999638c5aaded85f6070009e362a9e94679ce6faa042f3219ae84fc76217a32f64686849dc8d139094e422d9f2ec0c36f186ddd6d7a2485e8f37268901f62b2758e2ce7363bda59e6bc10fb4768cd92bf2868b5cc81ad87ab80f5f3ee54ed1caab56f406bd2985ae1ba50357250f256c5079e28562c3908766c08970ebfe1066db1150cfe754265f2650729055d3256872cadd1902a51712385f76a1c6378a0448f82772b3d4c5742fc034a7d6ba58a967a01dad66256761aa80cff1bb4bd3a9f91d7a8d3b076baf769eb4190b23c50dd4126cfea2ae4d6819442b50326aeefd924066106d067fa1e40bb1d58f4b9c1e2ea26de263bde9199322b9c71d6620743b96e26ad996f2d26c21ec137f0b6e9de2a0a81474668e2bda32ba2b75f266349f8e22cadf6ea7fc0acce8b60c4cb75a2e40454ac4890e2abeccfd55205cb1e056e0487ba0e5a5e1a28f54b6b5ea91366e04e73f17924594a6f11a3104227ccb386a2860d0d4cc0d0a37e3704169dd49891e7fc50240f4b947ac37cbfb1f0d576c3ae6481f14478b0b4a90bd61e43131c42f86b7a2ad86e4bd1899dcb87afcbdbf2933a70a9ded8846fb64213aecb3a797069846eba20046c424ed446cbd83ec1d8d7ee7d55c4099424be2a0d81b7b6c448249148f978bccd9826d1eb0c5686dfa00af74b8f55f8954434e4bb7da96c44790aa3647a2d0cf14684730aba70005149816361992ac6b01a8f951f7bd7e20e033cd93b43635956fc955ed2220ea2ed84e64d0dde9eae61bb260de9ed0d6f095f77eec9fd4d846de0998331929092448dabb27eea56bd6f850151bdba0cfdfee33aacce7c2aede5ba4b199f0a5fc5ab58c6ff241195a3f0d1ed198dafc2abfa45ec664758f4b1b940e7b25ba623be443b2abeeac4dd02763b70e601fd7e69695e702d656220ac47927f16cc223e1e198cd990effa53cc6150633c6fe858ff70b3a03d17cb419bfaf5ac9fff0642d247ae1ccce8155bb0318283ef48d57619348994e18be5b9d4c5a6585962732b11aacedd3eed8d091ed795057d065bfe2f866f727ddc5ba68fb4dc59e099420ec460aa9aefaf2ee52f69ed0c46f6a2d07b69e5f6661d62b38ea1f594be69090b1a106115b2b890eee55489748de355207cd753a36b27ae85a41e402d4ae879c5f934338a6707a79ae4077b242a85b95c9499b3fa79aa5af29db85855d625ed5ed842bf8c0296e47154abdd6dd8bdaec4bad31dc81f6b1e9d159ce0f04bfa178ada60c8d9d5298345587e610049278e778a9fbd3d436e0059a9ae2aa3055aca49f74b51f018a1f62351d7b7704e00da25e7acf1920c8abff668fa489fd9658de39d3bd4bd2ba04a8da010201139e79db376d268cd14d9228f247f010a693a79fdd9c3bdb80f1ba3b1da0ba2649f46372e176af13a92ae590cd2d0ac803056e32ab9a1b99113b0da0e", "53", 0, 2132613102, 0, "9cf1ae70d78a4f42a997bfba71a490244f48ef8bcaf9ab7fc86897e401a5ee42"], + ["030000807082c403017e766e71298193500affb03c5b14eee10c0da1c51fd0418709376cedd04cfab00000000009536a00ac6aacac0065ffffffff03b1508005000000000952006363536a536552861779020000000000ae8ac904000000000653006a63516a00000000486143f801f410ba02000000000000000000000000aaff9cb7de00824da553fdacf47a5c0bf4497fa3328d3954b0f9d95bc77d5d2c3701c9028c0c394190ea9a13a4ec9eee2a43c756a9715d7b923b95d3268a5b27f0d84baca2737d9da0663ed3e0750461b3afefb45c5d7c72b20902227c85c94b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0aa8cdbcac4e7dda9b92f17fb7c5bc1eedad1c22ac204d4861a148fc8af91cf5a68e65e469a801b97ee1ac2b54f8c44f1500c05840be7710cf1baebce325bbbfd8ee0b286326bbaa137f528e8457a5d4f6ef8d52ddbed19543794fdf4c691ec05df272d911a29ec63508ff20ea41ea2e614a5b39c97743de4273c61059096ba031e243bacfb9a0392baf95b446b3ae91d61c2e4ff10b34721a5cb9c670464467c0326ac3aa0cd94947ead19ec0e98013a708da2084bcb0b5c5713610489004becdb0a0424515a8cef41eed3cd2c645df6a281bbd97aec34b40671a9a3d88f7cf5a5a631bbc04b562811396f50b8b8dd030ac869eb6e9f82c73d6c1031e47457ef8256032a488e8834f86bceeaead247644163e0f270bc4c030a36c1aac0c1f74db854420323a9338f512982b44a6e9a2f841b37a72be4cc4573fd8663d2985f8534d9ccd4032bd09c25fa0d1ea4dfd26349c3b78c2f0653e4e77bdca929cd9e313433067a870315a41b9070abdfdefade842a62baba0440d508b3dc73bd183dd207dd5d144a34031c2e56ba26d93f6c7b9b7195d5a76956a93f4ddedf6398367dff9aee7e9d561a41d84a6e0c5e4917bd995989ea9761db05f43a6df2ff32181e3e15198ebf3c4b5256028d22e139ecc51cf3489eb77474f7c4331e5582e9e9b8010f44bb1d2ce78a9feef70026363b93fedd6957f35c027585e21f0f1b0ea800d77f1abc351953ea3c493446a70ff1f8790a21e68d3705bd00034754090116e87e6803ebfaa6752440473f99276ce95744976153e2d477c5b7742cefabd3d7e2556e291d3519b7d8f41aee94440eade118da04ce17974f56cb79cfd97ceb2273e4ce6d9555dac3fd01ce6ec0f98ae19752d24dbceb64d3853a94aea7cc8fb3fa3fa66abb44fe23df2c0356bedb8dca4c45bf3a68b3a99eece2ad15905ef3d19adbc2c18011a34d5526dd319f7ab12802a196f0de4c9c231c67c32b7f26f7d52725717ee2bff07db95ccf2b1216b9010614e5245c66b2aa0f65fd18846c6690286a3f45c5017d409514701b22c8b14f0ca9aa9a917a796c00ab64bbaa2ea95be1ebfb3ab806e0f39f86f7b2875ff23053b691dad8b8522721f1160528820b5f8442ece2304412301bf7bd96bc7cafe31f6b613eb3efe9ab816a9b5566421f837cba39c58386e72da3597025cc798983a4b115d8e1d5a44f78785fe2ffeedd7535726c31425b9c0422acc28cea576f4c746d2cb3eb1aca01b4dba78d4d33e2597023673725d4b752a05090d3baad0c0c73d9bf4a37715ed4fe8adc10378fe95ce5bc47fb63da0740d4b536dfff89503af6aebc9cb8fb89f0b7064532dd362e6d12479786e7feec7a50159ee649e152c80358a148bd603de1736cc2d05083268a88cee78f8974dee51c9e303c0b1e2a78c6c0f50e57f43d3932ab4924e2ff658f9f02515b827c9d6f8bdf4fba013c216c8fb8ca6bf058d8503eb45a1a8d1348c69ac7825d823ac4ed414a0d840073f1ca077ae5e42ec2b03290e28cf6f6e37c881309e661f1692810ddcd3fe311196280c6fdbfd36d222cd536f599c84990a30b67ba832df67d321b782aaf0ad6f5c8c591c06714954673cae540c80ba75eed488736863c35b6163461fde44e02c87167b532833e60af9dd070b9e43294dc962d5138c71ab9ff63542c1f51c4fc035b2741f587714b6e2208c6399e4ca82e0c21c1c5bfc78fd8f449ac65a5f387367579fa9f22e735ecc9eab6b10b85805d6b6a5321c6133d20f063930de1d4b80ba7ccb4de4215c065340dda7fc608189621019a6c2f89155a3908a0f0ec1c727b8864507d0dddca43f2f8534cd70c603eaf01c5581bcbbfcfecbac9f24255d011956987a53c7122cdddc0da14c5c96124d6c55f8f8f3e4ad8b43728746348b4dbc3b3fd0739b82cdd473d97eff519f30815e59bb0cec6e82e5edbb82883ee23370c4677ff0181980ce3331fec10053943ad42e2f842b9936e68458bcb2173d0b05a1a0c7c9004ead0061da02e6890c93b33db2584a6b8ab4ae5504f850526f3f9f7e4cec7eeb1590a22c37a372f9a7f20e5d564a0a0aaf0a08151c4600154f5c6c3f0b1efba5d43da669655ab43b36633ecaf9bfa992dff94c2892652c8d1e10dd8aeaab2ba63c876b5bf281bc49356fef8896b1f7fb28f2bcfc981e8641c3443f0ccd7e1f4d0e945d0b927eba827cfe477718c3952fe5f3a28a454184ee4d3657415c1558194003969857b8394203be7f6ea2cbc9b8d14f308f551356c3092a80b88e2e94ca152b652dfa2ee83a668e18588dde6968e648d69e4ed0d89121173229f4c7e8fa69c9a6f9461082719a5fa2bf62717d4d9964a6746d5a67ad66a9f31e83d7ea60da53bfc6e8700e2fee89cd0be38c4df6b626fd727b694999a0f9c1a752b375b7e210037a8370d", "", 0, -764619433, 0, "e335e0161ac80c883b6a1b2d45eef606746ecde2ccaca77904ccd94faa2bd06f"], + ["f840376403a92299d95e810fbdb0ba53f68add0d46c10d1728a929dfab49025941bb78aace0200000005536551ac513ef8c3f6cb3960fb9c014b30a38d3109894130ef4b44ad87007dfbe76afc7c716e8438aa01000000076aac516a535252ffffffff4ab1606c6f66569900c10b391cc6fffd3e68775e12f3452e4d538f99b4be489f00000000016310f72ab4039efe47010000000000c813b30000000000055252ac0063862b4c010000000005656a6a51650000000001ec22de01000000000000000000000000c3c2f2b6385292b5f01678a03836b1cd1edc1c65f4db9de8780a8ad447b1043148835c3d53d50fbfa3c068449be90ff2d7b4073097dbb896f8034472b550b2805c74811846debd083cdd3bd85bbb748391a7d50318bad7532538f724eadbce3800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000391a7738babb87e18f50a7923e2d71ca1c15d09d9feb04fc7c28b4c46242ba251d5ddc01f7566dc5df0c1d98e712bc11af8f6b929d9df44edcb608120a207bd8dff65f3a2749d938a26b8b8e48082365acc9dd8cdaee14854b47474953643be7396cb82df6f2a08f610769ce7b40ee10878d070cdcc4b12f16d0a12e16ea7f8f03219a3467b2267e39a007913f5415ebd7e059f8f7331cc511a7f0269b5e00bcf30305a69f82c205c62e18da45ff5c1721117efe41666dadb30699e56d78064abb8f0b01ed0a21cacced808114281e5605db5423db1f04f95c9b9410f654e8c0a91365cf6c6ef5f44fa51555808efaa914738968e452e500bcf464c20ebe83a4427196032f98462dc8253bd576300f7eeac486519a152d8c244e0c60a6df0e0848e658aa02134fe86e90f8901f9c37d636e5add382b965dd8575e2f793dc9a253e1ae1831e031f7275be490aced12e1cc8eebb4d83565bb6cc639e982f8f0ee9553e8ea2798b032a6b4aaf5f00e8bdd52c9089f664369d537e2df2770f0ce66dada4963503460d032ae72935a1d7ad31f4eb2e275ea5180e5d59df341007b03f6501037888404f50e574aab0484db44d549384ed71978c300f140d2f15ece5525e1200c22abe4154ac397324b07eea38b19c235af80ab5b1636c3bbd3254bc180aae17aed440f1243e0dc08a23938b195000eeb7c19d636ae9ebf0ef4d1b16388fc41ffb35f066c8e52b20b7927189fcb04bf7443c3dd716ae5891264237dbbf230ef525354492dea7dcc98bfe061373b993da3dd75991900c50ff3da8f0ccd18c9f423a08227c2c5894c4a34b66dc239e1611284a152e8acfb57b96799f05178a2b535ddaba110e6ad38371ed2012477ec0307f8a9918e503eaded7fb85ee8ff043578a48cafc4179459e087828f1e343d8fa83c7a8a5f6cec768f03def7c7a21ebd4a4e94a509555aa9a7b0fe6f9b32d8c4202ff35ff65129b5b4ffb57aa68b66df4a9acbf470e879b98d272da962f9433dff6eaa1378cc79abf0038ce7f68bea737af02150a9017ba5093cefa4f515814f6fef0d3410bed515566e5bf4b210007ab10248a5d5c5bcd0fd1963792247038de75ed464656d0bdc716b823ae4a3ecfe0f85912d9292e57712795614a923f10f22773a92b9f7a332ce5b44980e25694ebace80ebd281b98d45c612883fd76b2b7bc745c3b31de26e281882a11b9247555365a65fb79910e0e7556632a90769b975236a7f4ffd0fc2a4504201abec803d4b78ba0aff97e5683f885f5fdead82a24dda20a39a0f4017db86d6859505df120983cee4aea1db4e4ca03ba8215b6fac22e340d96220a79655d2228a240e475664007406f7aeb7149015100d8e615e24ae33e289efdc3f3e1667ea7aa186989b921053541ea61a33d706c97c4525490a50f48cf204190bbfcbeb3aa69f01db8603c1cbd219251b1b4264487d79f9e3ecd642175d13e9a4615b45d738c6dc320dbbfd2ee4e2c4d28e1841313c23c992666abe109b144d333ebd650b186b9626e740dcf2e82df0364d47422076156e910f2605a1abed1cec1374f4264fc445ae5baf1f8d0caac5d5a58f308379a3da0a291b7d6fdeefd265dbce1276a9f3520b44b31edf37b65ff661dca5923dd1291ffe814980a0272e640e63b0f11fb80848ab4771b62a55a2da473b2918aca27475cf2e35a5faa2ca985bc95cc2cb347d0c3f34de39c2fb42abaed31de5e51105cf8402a02e2fcc054625a33847e2214699b5c082868a47239b7b65c20b5f63eb82c6e83041bdfc3cc5ec0dcc59417a2fef4dd869e8615eda6cfab6a60053019148a8fa64a7280ecfaca14c670b7264a448af81bab6bd87acf2264dd2b14ec390920e0822280cf28bc8ad0c6b753645dad81e3111d4d4007aa1891be85ff1d2f27ef61e9fd84b1051ccbb2a9f37b96fbd51228705c8b2ed9f32b4fa6bcfc113070f8f57e17465aa0390f582e6ec4ccf77b83a1d1f9ec28aa9d639f3af98acbadab89a656d4be1fa29a36b8e1136d9c904462bcaeeb473f1dc4e71eac93ceba80c770954f5d673298c2283796a13f79b2b4551881f7feb4b9e8213ad2b27740489ca9150762972b29f347c7d27d0a57af7ca979fbd16ca154559a31d902ef35660385d1236d6c79ecd15907525fb3b69b4c15f5ff6ceebb867830592de5098f79bb7ec3e47254e06f384993229c9bc2af9d1db0193e159cf3c2bd4f97ef17c7cb716589192b4a74c8cb5042f7bbea7e6cec4f6e60b23dfeec8737ce09745f0c1f0685584ef8deeda13b8d79c45be23d655e4ec666814d6aeaa7cf81a5318a7d8739db40d1e1dda84a18d2859fcb99adbc78a16039f894919705914a823552ae22ee1e92c04972852001a007682880a091f5718ef19f7cf392ffdbade614a16c372d797c22342cd19b970c", "655265636aac", 0, -112534160, 1537743641, "7adc6861c7942355a14d9cda58331ad4c3c3e50b14c8a4f249bca3d100f4388d"], + ["030000807082c40304e2e2a47e5587c204fd12ff54c5a73e7db02d7bfd700e74ef28e3a5cd80ed490f03000000056a51535151ffffffff241e9ed477d84995a97a62f5c3874beff1fd2d4b05fd6c2ddfa2d8640da3106903000000025265ffffffff3b8c5272b30db34bd71cc79d6b233d8e42f9d308fcf76a382dad0957c8c9d6900200000002ac63ffffffffe0fad593f10c15f65596b8644518175c1297aa714653c49582601b5204edcf4702000000085353636a6a63515302024885035f3e840500000000016353a84b0500000000025200c9ea1404000000000151002feb34e01fa35f02540eeb050000000000000000000000007c56fa5bd901130864ee732c18c24d87cedca4e3c681cb1f1e11b91d7b714149460cc641e037a035de4e9bbe94e84a841f237cd9583d3ec6bd30e6d95be7756912198bb11f8f366bd027a94e7897adecf7aaf27ebfe8302d7ed9194b34518c6b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001810387d682a7848ef38b3d1db32c3d25bd91568cc71e214b5fccfc7b56892445c7fba7a117fbc34f0ef2304b2b4b0c2aadd5e105636749adeb9aa2c8ae8a8b26f772af06b11110f186f39d9aca358791526a4928584ac478d492e8da72df03eb271db34d7394c2a529805af74e03b9ba113161c9a862ad6522bdf7f84ffe242022578fb2bb9ae823a8fecb9ee6d427761e45b20c330780713b37cd4ccf734690a022878bce5af1baa61fac3510deb68f65ab1f0a8a78b706e3b8ca88fc86e0e264c0b0336825525bd89a5d2e24b2a3c4c2f975f41b07b08eebbd8a17d72c07db84c9386c870389917ea84ad3b61f519f0e58492aaf90632b67f4343cdc61268671310020290e47a3d4ebc4c07e4465ae3ed62a482665260208dba3855256c1b3437e68f02283b182eb369331cfd38b55efdb6605a237e3a0e8e6a36293baf18f991bf6972030a15d6bb65756ab4cdba74e55d9c2a6a93edefa25f50c90aaf9f78e613d99b7502104885c53c97068aec065aafbe39bfb240c935458299c44edb4cf562d5052970021cd00d1946007c1d4f068049bfcd033127a80550b901acf9b5c845e7bf14ac997253a9a44c9431fa6bd946920caaabce3aca05cce555f65e086a2d2c47567d4b0c4efc2be2d74961703e3a72e1c9d6a32a3877678965c8d4cb485cd7787d48874f74a4be670723034deed5db93f6ccfc78a2d270a5109f6917e05e40fceccdf1a9e91f94e969683d5d23790603f35d2ce82b2923da873d827a666f816286d13dd86939c71e2895a568a44b93f94da238c980b2dbdc66e84a04b62b56a5604a0c287cf26cb57aacadbfa0ea5b19d216ac5912d03bff2e2ae633659c3fd0c3292d0856eafd377b830ba4a4882f911f3f6bca2d3d5986263e8515c5408ddaa488aa4f27699ee82c54f37ce701cf4c94db9b57852fa60a8e3a64aa8014f584c7d6660883a626c318f0ca5e54a6520f92a228ff9b6830ec5c8c0a53f57e30d1feb83b43ebb5458c77fda385b14d3a97a52d4b2d80667424395910104455fecb93f809da58bb0ed8db4f46c9aed74aff6e39a90f520237f27194dc465e11f67e13057c8240df78294c3a6f498fd61017a29ebc6c1781d6a69cd4f95335583b6e7f98f71c172383a6f95c828c95da3ea2f94509acd1b07db6bd004265525f9c7c657b4bf9056704e9fbf82fec8a7ff8bca13b4155f2fe384a6c9d0677c7648f4595fe28a242c7f380d34e6462e06dccf09494bbf95052e3f9133b79439e80138e81987aa2ab624190671f52624d526e1ceb3693ee045c195a195119acafa9e0a9ed0afd963291bc187f58881fde1381854a2188173242f5a335e310ce558fe8af8295dc45fc0c76b6f445823f09b5bc9cdd9685777b1cb646e6b3b571f8c72b9b1b8c1737724c4908a8d83a25817d7bcae3ab27c3e58a4774c487554ffaaf5673bc6d800bf9b5df80c83117fd23d4ec4674dc3750705ba5daae815525f82c7445591c865e283317fd9a3f22d963a407fac0963b7606a8b6127f36a45d3f3e20c89f44631cd4a2500e377d29ea6cfb198f9e62d8e27b2a431b5e548c2515ee5c82ec513efa52b1213e2c5837811b0cf2fdbe96de4606fcca439cc920df400ba7456f321857b0c495d9c831ccab187775c3d74364d0648fd5c05aabc4eeaf54551d7142c10a05e51d70f94a99b8e150255dec09dec21f7ca1047ff49928341d3a1bff807c0148d502b4ecf05ebb9c3be13b7045d05ab278332c8c5eec66c5ff2487362752b20116a06f2f13b7e2ac9e50e1a9439b1fc2042a6200b1c7607cff6a0f1321c8f4efa96646c54602dffc11b4c015c52c5bf63ba9c8808c29f0e36cd9cba510305ef8114574ca58f2f67dc3c64e00f9e6a235953ef29d8cae73ee330c81a484a013815b09320e52baa48c7383572be51aa3da24286162bdbcd9b74dac4ce442067380c8daf8b799824721b12a79c0697c81cdb80d5a81175bc9a719eb35b44432cc947db01e4388930878737b4c61d133146d47d2ab55460b4ec7e8437bdab0433715a077b3e7661a35a0ed33fc6be1fb752b75bb8af4822b771f7a327311ed035e11fd83722f5d8ecf7579d9440e83a0ddf9de4cb3f65e4b8979e98bba9dbbcea749ef0b1c9e4c8f02235af34a05d37418b28e74c9d7cecb8a2b14ba3ad1ebfc7458236f16b45f5790e873196ac1db77f52e1b09e338b5a23d89af01469a06b33e96f7db366fae4e228def3721e59ab3cd5905379ae7077951afa73eda4727d5b5ab38a466c0099e38f05f513deea8600142238b99050000000000000000000000004654171bfc0ee82de107b2fa2cdad6844ebc156bb89a4f84f721401008e399f763f6b9de3151cb79cb482e2e769e703f1e95254813e4550a65154a8693f644c5a585f753cf3f8bb8d176d15a7a2aa1ce657406e97092d4e5184c0e8d245a17680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004fbb522fe17729934a1b4e10aa6c426c4f5330156d04c32825d267cc411d8dcbccfa0600274bdd2391d336e9c0bf4cc6d7dd8012f2555c1fe34442b78cf3ff3024e4004db4c372d83d1e3180e804bd8bdad700fabe75252bc80d6c4e0344a56ec3fe47d7419ad96eaef60491504fdde750b67fcb4c4e5279b8f9b917017f91303015d44d5eae12c928a9365ab2b4af9c12e089ad0b49f31e6be6e4bea805121ae0323cd65cb2f768416b5f13f513dfde3b685640b92cb6edf72f3a7223842e36c0e0a00af1c8c4713dbd3c5ae0cd3156439f48609fba978f337d8220ea0776e1b0edf91265c2aee6ea44081b45179b3c088d2bccba5cc60ee28458cf4084a66ac419b0306733a4e4aa5ee845c5f768bfb1270848323e9986aec1216512789319db6bc4a032f47fec1496e8e752a20df8e584a32c91b6326063c343506d36668375067f080032385aaba6088a94f701cf9ffc64abb3c843b6b47853f2b8c66bfa3e01c213138032ab98dc33f0dde10768d017406fce0594726e06ed290f169215ab48e65aefc5c020ac365a96baf25755ff6ef12e04cfd28f18dacf43ed1ea4a543a3bc1629f563fe7077ff7db692ecabc0b8066d53a760f73bd8f10c03ad6992df2f0eee6ccc219926c1dba947b3584a56f92d5883e81d30982eebe64eeb7e69ba39a96ee5869e1b5542761a89daa722818d8388e07498014a67681b91675ea51431a30c9743cb8fe81a9d251a0fa83fea312899d4ed597ed7a8d90f7bb77805353e16e20691b2e77ea69642b06128eb650926a60f1dcb214aae7d68bd18e3b1c10dd3bc0cff570790f3916347a678d808a57596b410e2429b095ae27e2759b4678631735cdccc7376ce591a0ead5fbd7651142fc25afc86ae55fed83e3b4e1b4fb13197ddeaa45c1d182a7f2b3901404b8d751cd61dec5a772fa23daf09a723dd3351da42486acfa49f5bcd81ece4f34c03e6c4e45d1990ba855e6a277758ccf2d9ca9a55f40a27959bca636eb88724e2598961f3088b2e79b45e4979dbe119e15e893fc5c0a86b3b315a774fce2b89050320a0b34c36d190b6059e93c244e68eeecfe78f8b8b3f39bd380e9237640cc6a319ec6b2eab133f266a635b4c19e380b5f2619dd4264eab68b70bfd642597ac84cd3a5f46b4385466d86b9f0962dae29b8fb938fc462086335d7cac48e35c9c1a89fa6cb85c0089fd99ca03e8b314a4b5e738392ecd335ecda85d8aba4947ce515dd12b402cd40d1cfdabd2ed7f25d3e32bbafe763b804e77705b85e437abeaf0bdb4f210b6558879f0cceeebe0a2ca2f979a37ecfe68a377f2dabee77260d7b529084cdd30453973103a231b3c65e1ca9c444f4373a48f6bdbe66e144f990ab7246066f4aca85a78fe44ec15c78d89049fa7087836135a78235544e0b869c4d7f8ec7db4b9c92b8d1adac5b027caae8721c9663ce621f72eda40d28508bcac8b7db1afbfb9e6bc706d30c0aecf12633191dfa9a48584fa0637ded8fbcd2581417303cc0407e0a2d0410307ac171a999136fcf450042370c8705df5aa568b31673a57bcacb1a73ac03f859ada877bed3773d86527526e0c2e87ba082f667243aa23684cb8b2ff7a3be9265a0bd362f947945a69a990a448247c5d67b6776c6ac700c72a856ae8e3681e6f8bdf81669b17f86a768724b8719dbaa5bbef151703e592c39c9bca3b02a2fab9b5cbd25fa623848a7505b44cb7c7681abdd3b010a2415ef26ea017b1887f8388079c3b04fbf57996d9ece54dc3b30abdba01b4f7175881013ff4018a3d0619c26237fc03edb0c79c4af6e2cfc28294193dc370d6aa2e8fb5306d77d8b316db54d626a51fa0a5aa9eea830f8458d86fb8403e7f89946cc74dee9956ba7ab9099b21ba938219b204376b45cef1a2669a2bf2347290da6543a1342e6de4089e5e83e8d9f442f793837b3c6baf389a5aac5cf9d3180476f8252ede39730fca19405c956ad5db47296b0c795260f35d9721d12aea0ba567fe138dc0647cb11d2abc33ee6125848bd1c7b16538b61341e61f7b4dc7fa7cfb22c80f2e34aa954f13e6f5f9185617ad9c3d3b51329e83b7939bb769a90a91a1ab58c9ee5d0e3153e78a19dde2507bf4afe38065bc8d34ff12b45970eb428f569649bd430ee27bb437403a711b3c38a6679b190db75eb5071964b33d20930064e4d3b5479b9515ae5cee5c1b784d9085503e2b2812af79e0e074c77c58ce5bec26e42c9250ada7725a54c9cd9f7dc2b49c3a288f49bcd043326d3205b9acd5bc87f59b19e552692b204b0199f702368ed233b8b66c62f4c498e87e747eeddf5ecb65ad5aa1d385a9524ae5e6f82438272beff9118ab192ef373c4a15b235fd966152c60b6216d877055d6b444f29dd9e6dee596a2cda2d767afdbddc5afc46dcd1ae021c57b18ec00", "5151535200ac00656a", 2, 784921415, 1537743641, "8479e12630e5e0e8ea0a0d3349b9d2b8f7558b54f66cf4add79e9dc00a9c6d4b"], + ["030000807082c403030da5748c8cabe90c87cdf03d24454e7164ee6ebd39b9099f8b370f3e91668a640000000000ffffffff032d6451a7153a14b4f0c1f482995c7c7000f20d8199b3ab6b38cc0f8cd65982030000000300ac6affffffffef41993ef801c9f2f33e22dc3b38126edec174ec52fad6f6f5b4f6ec73aa1cad0300000006ac5100530000bc06b3dc0453e62a00000000000165415d81030000000004636565ac99a37a01000000000153e9a0270500000000046a515152a03906bf00000000039201b3000000000000000000000000007aa6a17fae6b4d0b62e5db302e12afc293f2f0be3d779cb6403a69f0ca6a4b7bcde6099dd3c1c21efec7156399d3c6c99735a460f919403942ecf81974cfa8015ad3cfb0945f738ed84fdc1bc1d2d03e5689cd262fc78b805096677ef103366f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a9b7f8167ddef18fff7136e9a0c4df80f59e66ed7dceb5ef74121494dfa6d38ce2f09efd6a24de14d3eff3b4bd1a4bc1088185a2e9e6cabdef546b7565db8a9fe7680133b479382f2a87f7e7eb02a74f1c34dea722a45378d72c2b64fbcf9d16cdfdf41ee34e38be8cb7662cc18e5dab7c4266988ad0dfb5939726156dc54b9502252ae60d662c5be3d0eb57d193f02178e2d9e5e0d42bc25c8137656c3c2887700327a14f4f97b5917bcb4b009c09635dcc4c62e7709254a4c34592ab4ea59410230b038ef9a88d4238541fd7fb9523726f059e50b808836afc0aebe88379955da008635771ec300e8c22dab7e4fae88b0f51a24aa57c33db59959b27dc4e46663b53022a0209e6714cf6393e6e10296b5469d5f60e38a26b182a742af90c86b4a3e180031ad02586f58251f12d9cc37107ea6f24d3662c6a5cb2da2cfdaa18abe2921ccf032ed1bd5a0fbd92166dc28327d29530fa7ab9a205422173452d3fc1d2f20b2c9e020e3c26d79126be1ecd032f13317a7a51a1e14c0f08c8c78c2b761ca947d04540030c8272fd8ca2769bb48f13c194ea152d2b21101c1ed45a8b38b6f13a2b9394120485008957b531bec8b90734c11ff2685a46dca3c1e714c156f030682665d67991e2279cc7593d99a6c349edd210791bc6991a7059e896effa1ad655ab4ce3e6626ec112b88b964b947a74dc748c50af66165d8baf9d8d5d07a5a237fc8d48003a2086e4f5d72edc3da93f6754c0d6fffd553c2033a130baccbe96704cc894532bef1c7f01da9cdce3c7f4d5fac7527ac44556f22a6e95b64837985e66f172bb018961c7975cac781aa01b8a04f56c92d5c84d944fde83296c23085f5dd74a1c5b5f610b55f62c2b05ffa5feb72e0eeddf83ce48e40238e78dd06a146b05edc58dbb7e6917c4ea6d2fae4ac3c9938da990bdd557ae24b72f39d424b0f97acf41fd2af342c556cad91449c82ede40e9ce2e042c79aad72bac6e9a53f01cbdacc232dbbcaf9baa827388bf6fc299d4e0f776c6df6ad4e2685f1f84b8474c21ca7a33a9c7975ff96f13a2e47552f98d2b5a8fd8f708c457736811d1ae7b80e8cbb51a735149a11da7e3fce2b60f4b30d11a91ce6d3609de984030f41cd83b3f46480c4783d322840f06c43c3f054b060ab6916de6a1e7665381b3469fae61476bcfac96c78fa0c1d70ac4e521bb23ec49ec8689d7a6b7bc058e0e134c92b5599a3238bad52efe900f4ffa38d83d65fcc561b0bea01d56e16baf6871fb4ae603981ac07c1da7dcf60000f714ab0a8c8ac756f49d1a9905dd1a90eb755e6dc74361fb499c107333b4e0ae3d4ef98a5b31d1a25e4eba730ef7146b2e81325e5afbd5947d27f430f89715101faaa0821a3fbf052b2ca6c217cdea37f2d54536ac445fb83e6dc5ae0994b535ec2637ec6bda24386c5971fa9675ba236b3fa6d7ef19f49a9add8dbddb1601763ea77984a6345375216e2e1b5cb7c450f525e0fc71315d4bb2af4a74ab3baf181452ff9dc0a895d6e6049623604ec8dcebe5d89358d4d2eb326be86b32e06962bc343d352d88d36ebb3d60524b5281e0c15a876e7c2271fde96590851706dfc7940c10aa2f7a3008347e485eb2d03d98e68e99ee908682a4c93c06eb86c4f8be97f1e23b1c719ca0f1044bde09ac4b5353ef6f07d35a85d45fad4aec1cafdad294d161f320c504eccc46b292261de08a5eb342020301fbbce015cf289c1a08429ed8768399debc1c150ff47b9fea2d65c39731fa3b108ac56713047f54181e6552e055ea1a56c5567dbddb1a9e88186e02f7605cba87e9ceb4b8e62636becd6f6eb5aed71747903fc173c20bd59bf39b8b7ea0560f607360bf73537e817e8aa6a8b5509b2f713787d210fb38e6775044b5f866a32a44f0aed68c1cdb56f25a640b9d9c3cd15136fb144539b3439e2631475a35dfd2494b5b413de1728e25b6c8f17d0f30fe25f493d75c71c085f8280ee123bc31468b527816dbcc4d22674bdf8155cd60996dd57ff03074f936a6cc928e3ba1f10bd40d106999015eafcca7efe26872b46de0268208a5f3b27de18c911d27a02887ce94d7fc455d7f0027ddc54fd23ccfe445cf445cb447375e5173991d55ef1897bb88d5ad5b6d25de5301dccd8a83b5b2f8b43378f6748124362b9d11424fb42698c74338ddad11d8878027593db3e6bab0582865ece8f4753279a8e7895902a5c09e7b24abf7c597cb6eb51aee67577ccaa21b33f044e408c5ea8f22f760a9d3abed200f7b3ccd6d22f78ab056269a918406708180000000000000000035dd5a05000000000a086956937f27578e5a3b527f090f38518f4e8c47fcc531588fd8fe11ec8c39e601d3a330c7911e58709d836a33b539bd0fae28b3fd965fe761397c03558415bdeb2f464462be9b726966649ee360fee781d8238952832b0c20a0f0cdbe30ad000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005dd289ce4139a4776cebec8e94f8ee34d644ba47c03c5df576e6a9596711aa23c6b566fa2c2888b6250b4365e6db59d00a4e62b44a58f460402d67793b441aebc49ee08ce400f18c1356954afa2609d68f948b0c531aa9c0cba1758fa7bf31553c5c1166af7f1f119f864d92d26ef530184f25c180fa1f4aebca9bc19f7c72d1032ccaea3b25184184a5d25a475e3b90e94593d8dcfffed9832ace1f60361baaf202192826f5aedc528698a03c3ac5ccbc2731e02fefbbd6460a83b4831e877123610b011197f3761e678f04f3de09665ff07fe00d7906d873627d4fd7d666ba2c44f5a53a44a2b1b4afb6c9216b878ef5dcd3a624088d8d07958ded59b17ce80f89d6021a6c1268afdeabd322a28aa712ba238cf360b3f53fcff23d38ec6c92fa49e29e03097bd9ad72a25fcde17a67a85399c020af527c6822e677926fa97d0528cc24010228c79b9d78cbdaed6d3618854622eea9f67a2b59ea434d045947e3534c0e9847031dede4c67e9468881e06c839a9d0b53e53051a548fb3b4979079870d927cdfe6030e3ac9329a232fc8d4c08b40837e362f9c29ed019bdffaf37860980cd70a052a80ae198c9a9d5bd39dfe73b9fdd3130426f528775c83ae5ab298fc15c670d5f3855eef2f4d324b116536a5b275b52c8ff4f4e5ca8ff4ae09bd7068dbb58d3da659a2b3f2536717b6d7b10c513c60dfd7a00b353a37c23155812869dde0901c2b596b32929e8b5bf7c322271b96488ae8152eb7692ab76a7f93795cfe19da4caf8616d6d1bf690ce91d101c8b7b8aa5a768b0b59931f6a40e3d1c22fb9b512a0971e767ac1904bc3e577c841993f68c4e82a13e32d5d69e90b205f09de8a4a34e1f87db13606072bd338049e6e26bde4be2234f148b0190e856ce79ecdb3347c97ca70d3568cd23e48e0d27d423c1d5492d942a51f5f4fe7032346326831d325fe12e6d146dd379b25407b8af0324feed3f9ae63bcaa2a8c28c4946224e05cb2f64193755a9832e0564fb6dc7fc1f2432138c0527d82b7c8d2b4edb34a651915bd1727e22f454c26a7fbf92874db85252db7324f1a4705e9c66f900e62781f9f9cd0ba2f4d7c745c8fcdbb23d8068203bd867358cd5f75294e145d28a9b90af053c79e213910645d420b40b3964d82065e917907a82a9bb9a9931976e0160f7b6091b6eaf26987387da1878470e0a018521eb79b951c3b3ae920d5403a48de7daa207146698524d620c5684cf0addaa99ea66836c8a4acc8460409e8054f581882e67d6b5b3fe20317a6de5759cce88f493c940a3e78d3350704b1fabdbda2e7a56475db55691da3725d6bbb6134a9f7e3501cd5c0c9d31d9002a6c183863da7b3a13730eb618376fe3d73c375fc4d8377d557e0a4b9b67363ee6f38d20f33d5efbc8fc8679b8e7c6a74e3ba896ba676e815458d017691d4ceda693f61a39484c8d528e311e94f1762c2d50a1f246ffa88c16cb98ebe593fa328a9464fdae7c5ccca45ec228d026d4572b712d249f2e309f0a710ad316c1e14ab3c92868458fa5380fc3c96bb9fefff83b89fd7350eb590401f173c6840e4dbfbe6c9d15e309efba1d9efca74a897f9cc3085bafdd312c3a4eefd28ff24e89acc4cebbb33c010632b4cdaba61baf4eb30ac603aa107d5b4a17297a174c078d45707371c064d76b8f5b02424aeaa731f1542d047ead97c4e714fa381aa3b9e55a1c63059e8b740d80d26573e5b53da58c3f147a1a424f764951c9d3b33faed53646fb4612bf4890bf6cf2e1225fe3d5ff61323372ba8bc6273a7595856045461edfbfc7270a6d45995610f42f303e1176acaa89252d86d3469e3bb5544488f4e471386d57cafcd20f699db18600ea5e013552b6a0e8c69164f8e43c8e3eee2f6388d6d5fbde986cf99b6837414bb9962226ec49c395e07964129cf6d378ee93c1fa9ecbd803d75f875b1219c98fd7291e12ffefffed4ab9ab2df9cf96f7afd246e201d7df39221e523bd9b55bfec8fc64655cfab3585404306b6f320d0a9106a5fb6939da4175227d109caa8c25b19914724a775712af8010427180de61d177d49cea579b8f41778c1f248e0e02dbae94f4ea59765bdb8827267d237a415a38538d7141e3126b1c843ca3ba31814de57e9765858ab729ccd7dc2414dfb51d17ac71bb0f26af56cb99d3635b647d552b3c6c14a7161fac07845ee45298749134ef187e4b3d52e0fb0c45a4691f3bb7102c564c8687cabadea5390e58402c8bb658f1487891905a8f33225e8d86b22c8719157e0b6dee6604423dd9731d0200000000000000000000000095a8f7218be020f77743ed7bd6c3fd69d5e4b1da3dcff0e3979eb0374ef7c139695f5ad7e7929eb4b8e2c52c4b9a193ddad01f0243b3fa3b4e7ff734acc873d5587d62f44deb0fafcc3b43a4dbc2682ac5369acefb6e8bf60a523ac1a1001bef0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045ba3f6cbbaa3b4896824ea477ee74d27c57bc6217bbd823176a94f45f18a220185482989498a0bf87757a21df9b7ea94395e53800bfe90c688d34a85885fa3debb47be6bfcb54f626fb65cd232b6a2d438411ae6275ab1c94931bca4b9402581c7c1a10a9f03e7828c6d372085c9f44ee3042514c00ea2fa1221ec036a2afea031287ee42c3d763793f56461f53c4f2b928b3595ff78f6d65d0ffe83b7418999f0321d6f8561bac6c544ab81cc1c76a7ea798a42bbb0ddbb505da41d8db732c976e0b01d9c748286d41922506c1ac830fb74cbbc8e52c32895d23140d66f5af3b0b1b1ff07fa5a422bb19f376f88e11dcef66a5cd2c089238393556546bedb67164c60316d990b5e69a4198c26c06ef3177205113744a4030608b872cf794b0cc4bfc41030f8bac11c9b20bf83bdf1c7009a20a10e6718b78da8c563a979a6b6c1b58d512030f0abf780b449de7c59769ce706fc795368e5e732c09290f789faf1175e5a6cc022509a74b656d02c2b55658ddb1e1ea0a1ab377cfa0c5b13c504a238bbb75db2a0316aa28399d660f30a5a2e9581b6acec4a526248f5e73ad3e5187ee3a1a5ddb060f97bde562321b6a181ebbf2d5d82c2aa147a1ff2d9045175c6cead0c3b8e4739282c73d27322b80eed87a9c7e13cbd1b406313ac8f0ce830909d2cf36e8bd00869f598d0fa9886ac6008e187425ccd599cbcfaabe8234c5f081f8d704904e1f453c321a3573b55966d9b4b830a609b676179ed5f58ec23f92f0ecd7aa927261c8a70caf592a3624bef3471162d15f2538d50964bee5bf804aab00f092d1f371b1d566e00b2f5f5c7e266b59e6ba293afc689a5a1aed7b973ea8f998f7b23ce39dd6374355c824e998384ec667cb2dab247f4ab8d359619b40974c43e14663b9222a079d601a174495ed2d1f077fd237ec4c08e717233245e8197c67c20975aa0e3c9beb1ce123cd56274756acf89a8aead306feb7fd4b1b834004c2a121c1fa35aef0827d6e0c378f98830b4c433d445485c9df80699b4bfbcb035bd2aa0c46bafb8cc4f972a8cf6b4e154641e1b255e7eae0faa373dbd4ace1b2ed3a20433d9d180c65fc1eb672d0200b053153106fd27df0401893ffd5fc93e364e53b3f475998e7a3995d407cc1f93f77a1342be73ebbfdcf2fbe66b3e9e7d3037d897a6139c11e97b1dac7a92c77108555aa079a257098fca35eadc9a7fbb2e06e855ad51a2432cc9a590047418bc49f30f8531c93abf6cd53bfca6373c12da07c24f4c1104721096ffe0d2117edeec12b0a268244d7e982f43673bd506477ffddbf17db3e1881c6aadbd39d0897f2ba2ce5d94289c3ce2034ae32cc6f238a456a52e0dd123ffa21ab286b083c5ea9cd37df98752d8b9368d3956a30c5ff578839feb20b6e86a351db6ef8eab881801cf3b1389a21544d43368048e64270d1e51dd71b5c1a5110fb059a5364fc93b200a9ace11283fcaa80083c4b30af7e0ba8d2729af416eb719d60c5e99528a28fbf0e8cb8433e88f8fe51ddcd78137fc3d8a2f1e64fad055e61a9e44682ad145dffec83bc129713ec6a7ec26a973785fffd7bad04f6b13bc19380899940f24c6c175e2b9dec6ed10b0fec00b008a0ad2e12669103d124eda08f24881d4cc4f8c0bcaa6b6fb5b742e2fa417ffd39042391f669c8584932ee1a0cf752503ec6ceabf2ad28d8e19a878fe3aebfb44dafd690aaf9a07617808ab29ec491c65a79e5518cd768cd4d9ad140de4697d5ef246c738e815523dcd2a4d86b67a706b35053bd8b6960d77978533196b0d48ceee6cf03195c62759193a448124cdc9331510eb5ad90d2ae8e35bd682963008ebb33a2b4fabbd8659a6b59ec9f3ded0e372d357e37c219035f896e6b6166dbb65986afe9e31676092a0d519c8dbfbc719ed10b3f7ca34ca3dc9eda878f3877cfb32058dc05172410330b11e34b68b4f9abfe1b02f81e39bcd291dc6e3f4d955355029b6dfa08e65d0e608185cc28b0fec2574d7b3c78cc8d8963c1783d935761d74e57468eee205a1f86ef140f8c5a47878ceb632572f0de181d595140d2865ec339ce116eb3dddb4832dc9ef199d693d21bc190ee82134b84fced76dabdf444f90699919acbab05b74e00c25dfd9f3c8f6ee4d2323d4c89b64b888bc69cf86cb4d4716ed53985b67ecda73e5ae6cb9ad4195e39cf8723b54c8efd3fa28f0b94994a13666467e2b7e25732c0c23bb2ecaa1c239a847116fb02183cb25f6e3d3295182f6beccda329ce8cfc34f8a521813a91d019d6fd97ceafda9a6d3fe9856526b4f0adec0ebae6dda42ee4d83c7cf266390b73169aa43cf4d86ce29a1fc9720740f9cb40006fd7d9a78467197fd207182f3a016378d6fb769a26af178ba5d811d9f051806dc98046ab4a25bed4991703c706419a70a3ad552f01", "", 0, -1506474503, 0, "93054d6ec434d3af7ce10ab263ad69e385b0673b7f99a7f22157f17782b8e046"], + ["030000807082c403016a57ba705f5ba8660856fc885dd796093b88076fdeecbd55bb2ca0f6444981ca010000000651635265635255f455f601fbb49e010000000009ac655300526351636338f5bc330000000002000000000000000025852505000000005dafaa6beb1f753807810a3d53926cc82f8dd05ea1bff4db79e5e837b8597d627719d0d0411091df8a4b9a4c484edc55b0e138a15a271647d3ed93aefcd6e8d53ec65c6b4ebba7645e7e690f0fa5fc3e9d0ccf7ef4fd60c4a4d42cc0339f4ef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dc7aba255cc46133e21c673ef26193d63954389a290614d8ae530c19db6ac52b42d8897f10788d574af92bd09131d910ebd7b9c1eea82c2e34f47dd46e8ec88773a1eb84f09814313bda87d2fe05a0bd4f5615c294ab8df76afdebadb3fb2746ee7ca0a1ae3a50fc1f24adeec8f84937672653901b4dc3a034b9b2d4251c9e9d02216842c5742e56247c4be54c8f92bdd68f81a09645e6c68f85240ef1a620972b02241a0050c49a8690948beefb3bb9eed0464eb86ef2b86436b82bbf05eb7591860b00c056dfa7526578e3adf53e591abd49ed623ca32b22fcf88abc1992c2de9888bbef17280720fab98fe1eafec7c4be0eda2d5206af09fa1e71c92bbe32713e9f0201ed2695b352393a3fa7e59c5da927181cb4f1e5186c74a525c09bbedf9451c90210acd8db477f1108dfc65a270b5a00a567e20003cb44bf9d33be7b0285bffc1a0202aba2b060448614ea3f9db36e9a1b885b4bbff207e6b664c656923896df045f0318dd567b620466c6077250c315a41c5056f56e870627691ba7680c3f2674a74f0228a6d82e7bcf01b2c930b0caec2d4259cf3818b1a6c23f32c722dd928cfa54028b5a99af4b9486dc37c476e1f8575c06f24ce7ae24ba8bebc9c4e4d76570f4fae91d7b28073626f25095e1058acc3e15e4c0f80d42e4da77a97ab8f2f4eb21f500da0ce9dbb1f1fa836e2e2e7bf1ece6b3dde545c1ed6ecb2127311af902e7e539b052c35865fb27707c6712a4e0113bd923e6278c90e89de225ecca5df160d60e2bcf5296418b7dcf764a5ce440356b99d89a2550001fd5fba6bcaa38180657f1de595d9efc1ea5ceaa87348097f1fffefb7e9aebd65c8ccb8076902139e1527e656639af7720fbc59baa5f0b0802f1ae82006ad631ec8e1f6998728482dbb38d3223cfba12948f6f880022f4adbcbd49be8e3b8033fa185a1f9a79abe299ae70efb5b1a48ca12abaabe4d737e6c1c6f8a512a648c4358064fb5c86242a1e15f6f7d3276f36e73d6a940c36bb1a9803eefee23182933eaff96b4bbe2912a97441d0fa054ad87c2f686587390df010caeb32369d11162c476afb408644a63b8b0f13299baff2fe6dfde96d4bcdaf748d6c25296a95e97f70d39f1838f10bd1f42be2179bd086407a9e2ec7aa08d2c122770b3643e160215c5e24902cb91a65d5ee7b81b57bacbd4a2f545adccde4638177ae08f6aa91968c1ce82c4066204e61f984ece0cad182f15d4025bc87c748cb024363a3da284e98e369c3de73ede3f083e4f58af4f9830f8784ec79b0ec4e2d58958b8f8903e11628336ae33021b7bf68e69d372f45dc1df5c0eeb8f95eb4e85181b3de1fc26622e227f4ec27ab775ace7d0d0d830a9b3463ed04427c27cc98c2ccd7d7b5986768b7a4d0b7352dc7c0a6f7766cfaa6747cdaf2a1a24cb069227d36d356196fd972a6be6c5a6e0f79695b770637bba984e30c61dfcf1dc0fefb9f755b57879ec9db3308799bc34b9c799098548c3fa983498d3121f38feb1855b3a8ae038713873e6c4c5997767679b36fb4496da48440636da649885303fe0029091ca55d56a4b6e48b7c823dff5a94ad392fec0142ab572503eaa949b1cd14a6802d15dbceb07a4aa03af291e6210ecf5c717e615cb8a7edbeb12b0b97289777bcbf70373d640101f49e9d29370c26471dd8f291d3a96e237b1727e6c65c4d24c12ebcc86664259013e3a8c79ff01f11dd29232c79d45d4e16979fa68e6b98773586114a43d58c6500622991f8091d9de01c9889ef837d4845f01d4ec0ca8befeb1a214717fdca7f533a4a5671d35e4b95613c6f62d15a8dd9bdf19db6fe269538fd39bfabe886dbb7bab14f5a1bcc32d7aa47fcff2ae0ed0b055fa0d93b58e73c40a2cfb391d721877e0af73a01db0370e65f6fff70195f413b1ad5dedb1d5e6fd83b53e3583dad2c2af767aa14ce0d37d71cd2e27ec762aff4ab5b1613b721ed492cc92804c3622d48116498985cd0ee7410f697321d23a96aed46e794c8314af0b79cc37ebcfdd85894cd9acb01801bf1b30d1ee1b639bd8ea3397b3eca402c67106fb00c74bee74988170cbae1c2d524597408fe69e1a7d924e97717d9f467c0761bb6704c1279d8f1d7658c4fc96cd945cf6af6d6868b2394f572f0e9a3f9c7bec6a4958eb3f622cadd8df969d10443d80a45f2d5516da64a54c2cd93abebdf49364ca413a58327eea412dda39f40e5d1d7ee5920c01f04b059346239b3af271493435e72e887f6be04d16516a39886cdc5261ca4f23b45839ae117195c87008f7401000000000000000000000000bdadeee689db13e46f447710913c92e2ac1040c612a5f97946299011f06c6a3bbc746c8dae85e6f44b627dfd72c51d53e43e7121c3403883fae2a4a4b4dbc0fa40f476498e89a9b9e1116069835fb91a1b9995d1bddbf730134f8f8885ee9d4400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d213d1bd5c50402ee93b8e64830192cac521c73dbe38452516dd5582cba7058a61039ccfef582e125e38a8732f6b06ea7c210a5525a5af23e5e202a22bf548ca2ad25aa54b89d001de766af0329d093fced0ce4d2630e371e8a35e9d2f3a5a2653204e6302634ed33abc8f0a9701c143196bffe30185a413b2423faa855e980f0217959d62ca1434357f664cf63930d3f63578b9e2b4794b4950e604a8fbcfbcd8020817dbce4db4b2e6d9caaae5d5bb47e328880c4fef3e745ed30637ea02dff5060a00ff68f60b9be828650cf7c3673f85ebcb5183f3a2c745f231127810736c45ac1b63281af6c42ec55f72f18bbfa48042082532e22bbd45b5ad6af6547bea20da0221a04e5ee97501eeee45845e897e3caa97c16268f524d7ddb825bd67c927692c030820e99918325fd78043a5d8088687a15834972f5e8bfa20fb75fa8605038e8a0317cdf947a7091857775bc0a4dd2f822c753e4b515e7e6ebef81460b8e26c04b30216cca3d30f213e46637061f457f96ccd7f4cb08f74d5fba6e6ef21e1eeb5c7da03243c9a0ce26317328815f3dae43cceaf3c2017f5d1e802a0db5821f8dc51c8fc8ec7f84435916b1dc5fd08d227519e0fcd89fb60cf9f46849cc12032ee95adafc111467125a301a83fbb8cb46023eaf7828a8aa5c5d5a1412cd7c652c6fe692cd09e4f43f5ab16ce12cc22eebdf69b99b8a27c059e73d7b2ddf8a941404bd1538fb921ca63f733f9f8a5a35704430f4fda37c077ead35af79b514fa6e405111593716d3cc5050367acb83044b3d3a0729d9911c4ab608202c23d3e01debaf404fb4da3a6195287f984a923a45bac88db8cba63e54dcaa764651e63a8361780875401a2095b12ea4e515e129f4783b1e456a7609f07e92a995f58f6201720e2dc797c7d82beb5b875239fa665653e15952d60d4acd293421aaf2b4a1ec6b834c298bb414a70893132309c52fed6c3586ab5bbec65d427397c37a8e7f3319d5c0acaa3168b57bf5789fc0aa288119c9f429164257c495a5c35c1261567130386eb572d2b889c4200650ea664e187f523c400fe5eceb6d7d5eb646bc77a67fdc01299878f1f25505010c6968d6fd0c86dbeabf28ddd4a768e5ae0dc4f8fed2f3f8aadced33c1028993517627ba94c611cacefd3f9d9667e891b4f4ef7551dbf9af8dd03ce5b270306f58eee9e9199a0c66f6aef0272437e112d1cd554cbd6ab94d8ddbcf55f06c5d2b7e415c9f78ee556255ccd05773af9c1270ec4252461a6a827ea5c5759684dad4cf565e66aad070a19cfbff4649d8d10d0e4ceb7e1a8b2c98f13e2f909d5c9ce9e38f908bf50e3271c0e8f70c325f722b79afa9f4a8fef4052e463b25e9fff11ca5544f2c877c961621c913333dd0488fd4bfbee69ec9380f9320844b0de8d0ee6a7d6a4a78caa4f552f8ed2cde1edd1e8bb6d1d463b872e59c829d8b3b788670525e4f752f411efc9affb8282829e2722adcb210d4df5edec82fcb53c5df62e353b3a6e868ac20f83a670149dae07ccf4a2c5a5b54070db937cdd421ec001bab947412106fbef8bde72175229b3468898cebcfeaa1e015374f14f661c85bf1c411944da997c28f390eabb37b5c2fc2cc75af623ad095feeed31eeb02d5db52e5b645a125ceea4576f63011646d1ccf116c6dc3ae31b817a9a13d65cc10c60fa7e7542b4f3c165cc39746aa330abeb3efdad278450f26878d68aa7074567c15bf8a3b3c8f2aac29f17d166947bf2a4df02f761e07a066399f4d0e9c638f234f9a0497a6ecdcf07a179f308e8e7f87ec487b2e5e56c4c3aba06b37bb2e2fe8ea127e8796c5916c96cfc9810cf564b9f0226706db57d6c0cb19ecb6220898a7ea7a3f59755f82432f9f433c6ffa2358c4ef38705a80ffaf540099dba17b4b365dd5c75c86d37465ecedf23035cb0ef6cdc2b1a2c3dbb88a43d6340ca150cddc0f58b3a5317e5e2f6ec39d42e4c33ab10760dbda5aab6a61eca933061200af8adae759b269047a7cded6bf829b9053887aca4423320ef57b2770b087444389a3fef8e08a4b3b6679bb58911eb2ba79104e22a40952e2a3d88adb08c9bd41b20e987819692b2466cc1751fd5518992ad042351ba5180390c03e266cd39d242fe0d55a8091287ceb08beea5f7281658541d7370411d5f0aa44d440ca4e05ee66df3f5c684565897f1bb64a733a7c7a160c4aa0755b4d86d2ad7e16ec7cafaf94fea8288c96e8f3442b3a2db8a2062a4565d543574d8aa9a4a73c1b5cd6b873f18af61f301e5ab1272f56191ebcf89201afd8a72ec564cf38bf1cb4651dc4b6c4f521591426c526c5d10819cc91e3a4f55e6ab30cff6c74a3dedbc8ef37cf82ef80515f42111bad84def5de32124c97638359c06bf6007614b62e2914708d7f15619a179a3bcac9c693f7245ab0e", "65636aac63ac", 0, -680068179, 0, "be4e02bb54df20a56342a1a152dfad4b8f039007df6a39e123af7bcb894a4b2f"], + ["030000807082c403015fc21b794ecfe157e69fa071d00ceeae76d152ee5c1eddafa15c8f0b7c84477800000000045252ac52ffffffff021e6f12010000000008516a00656aacac53878589050000000009ac6a656552006a5365aaaa1f1f2e4da2b40100000000000000001bf74f0100000000a3977f7a9ee550211c331af25cf6c9d88b0df25195061efc2cf9ccc7176061979ed3e1145efe38c6b7daca96642b17a4ba8c3fc91dc9ae8ab819153499926ddf00f85e4ea19754017bf9a3563ff2c42ae812a6617fad66fc336a965aaef4eea30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022ce1a3054e9031c7a7034f9b8cc9195656ed4f8622c110ae37c8167aecff331f610e7c1e31058026450f4cf7c0de2f7ecef74231ce5c631b5b955e2803119f5259f7570c4d951360d462795cbd3101fdf5491d8e1c12523fa26707624b84849dc806f43f22b6f5ae701fd9ff953f6a3e75589fec532444c2b169f09a1ff7e4a0311c9ca516cdd73533846679751af76278f33e228cce975d17a2e22463c3db3dc031400d11266c7065b8f13a864d9ebf84a140fb3329b3f6ec50cf7cd86e50940500a05eb280a9ab1d7a41e3b9a109b21c675183e94bf34520a2d05cbd928146516079e27859a6b81dea6e01576d4b3c5ef1abc4cb0a16a85371335d7da68e5a2058d021042833d8e566771c0acb6492cc8c18410536776f7cfd7070b7a4fca9ee2dc8f0229a02f0420e5a91230f6873c45778bd3084639daa2c8374ae686d5b405dc589b0329ff8c1ab6210d5e7d41f4124bffe0a9ba03d6867503b2f1eeff399aac66f7b30226c41284f4db45b4e763a5e2bbd70d532267f17a6b6aea91effec1003df2088f031ba8044528d94f331dbb3905aab7de38fe2f4c0e4f9d78cc9b255b25600375710329ea6587e47fcc8a184cbb406e9e407238150ccc7f7575c2df7ca87dbffe7301a3066f2e4b27e0a8b29827e8349f93b941ff39cfe9a56f3317c51ede5400cbe8ae0c78fe0e3b9e3601f7d146c393d79c9ada051226c39033037754bf38b5791ffa2946ccc1f8087ed880776016124626e59d444ca5f4724e62b9c61bfd8361907d09bea172d6714f05fc9680f02be81e6e6b557358ca37aad9a73a9fe1c35f6756ad7d1aca140c11ba269da8214c6337b92ce7bff7d2a4f8b778f895231c931fc563dbc2c4d73f8775d692f96accc751a97ed08467c9033cced12a8705353523253568ee16e504b7cb826d131b077778da75a771e8483256143213dcfab17f4a1c707c9d1822b02243f417fbf090b4cb28775c74c45a55b6efef9309fccf34ac5f2b18021d0948be3a88f17d679043fb7cd5e86bb6226777639ae2e036dc8d45da463485ecd4f4e90d5ec184c7be4bc9179022b8d3ab2a74ea374efbdb4809e9018932e95f9aefe94fe675a45c18681a6e498804ca9740cc418724b73d7455c7f86d12326d4d817a61d74074841f63fb946c54b2be31d300b2fe3d7ee6589a618c41201d27359ae3f64782b33c912c7e6c8541a41ae33598ceef5cb16eb416a4dcc91655931b41f29693378e2b43dc95253ac20c89ca0294bfa199cdfc6c75679632e41a0b5c40a407ed4ba421986b46967d8d3bc99cf7a90557b790baa370bdd1beb55a2c69f150139d5cdec49a6e13e81fdd0890b6714523264e9904c8363570cbf809298fbbd48da7caedd9f6e47c0293eb03c8f6d22f512e1a2fe120ea9c99370d16929691da371b85a30b89dab5acb1492eaa5b1e37cf3a83e05d637f324c5c5d8b75a43f27b2c9277b4eff4211df29b5dfe72f1ee18e24d7cadf5379d4beecab1f720850e23a9f8c898e2c5d7ba8d53f243bb216c62e95b3b2918d75d7709063d274cb3107ac461781692be642359aa0a43f02d37c80f902a10c003a9c73bfeafcdcec5375fe37c596c4ecb83384aa6d2369123d582b1775bea90ffef9b727743fe6fcb8051e735ce6e122171870382fc68830c77df4a3ec0649b63d5ada34c7e870ae466b4cc03d95bfde7097335bc1784257b4da932e6f7de25e437e5eb0b5e5d50a66e229d4a3525bb0ae4548320ba5edff02c991ec35447b43df41cc147c766fd04c89684026c7ef52161895be8f4ffefc4b9edc0b8d5538a0b8304325971842be04a882a4f8f51e8b1bde24c259048c3541ca9dafc28b51e1166a26b526c29bc89f63b1a4d4b32522fe48055f210ca6ae57cf6308e07a5807df4048316f9f09aab505c144bc87455dbcf812568432032504a8d22005910d2768b28fde4994b75141ffc26ecbb050c40a963e27ead703d76ff94b9accf2804bceb5b0bd660e4ba058fc16f7883bae97433d408fffb2d4c7b753a0ced96c03ed7248d4955280b67eec8aa4ccaeee088072afdd0b40d36da972fd97c257a288f9becb8b9728862e2ab52f9c9acc8cb883766cbd14193e285b36b307d28f3536fe7d936dce89ceb94f643f2d523a28ba4a1627790e81c609064d154e6c9f094b3f0bed2fb9bb1ce07b874c622b775f39ce4e868dcba2234c8f15ae0449254dd3b3ecb70d6ecd7b0d83e0fd48b9d5fd13d1a1e6a625f804bdcf9474571730c921fd3a80aad82913f3f7ecf9ffdb4e68edc7a1be3bab61cf00a7c911a16d0b314a0833c4057ca1ecdf83afbf059b60de90e4dbeaebd7c1ddf0c1e939ebf30e879227de94831729ba134c7bae26cf9e895c3849f5c1a442900cc80eb4d8f77d2a8bf7aac5f00a34ad40fc7d3609af72e0a7583d7008", "51", 0, 50196424, 1537743641, "a197a01d15959777a04ccbe19bb0c4e4514aa85953302bc6260796c644bc1f20"], + ["030000807082c40304ab54234e5e4f44ad5bd2a378336add9d7ef3f0d927c4629f43e47c9d7092fe810000000000ffffffff51f4d94205f10b090cbe85e477506dc7fda4143f448a5544c7ab861ced7bf7b30300000009526363526a63ac6a5146de706410e3df0371c5272e6b31cb80ed7f2b6445f6cb51b04c7b51974de9cff7270a3702000000066a5253655300ffffffffc348ceb123a86b8b59eb4bf8229108266f1f28789bb4153a5f350313f6d0017f01000000075151636365ac52ffffffff0319e4740300000000005ee95e03000000000363656532028b000000000004ac5100ac3b2add42d09b9f4e00", "00520000ac635152", 2, -1843389684, 0, "122f2ecf230b7ba98b0a5b355a71161d24f45be74faf3da10cd41af1627dfe95"], + ["2ee64a7d01050478e40494e1e52b5696da75f0c9aa3f270a9b6e5ed73377e789e4f86baac901000000096a52656a63636a0065919eea410198dea8030000000004536aac000000000003000000000000000097bd2c000000000033fda610b9791949ec1778a3d551313b707878fe29e9ca410f8b770f2127cbffd8342af1e688242c645af676263ba2d2874760c3c7bd13262fc0d146f2bf69b7138080231b7378c06515dc14bd030f46b757d7a9383636fd0dd23bb27627736500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000687202e963386baa88ac03a677baec0db350f2d155cdb8aa3f58a24d6db181c39fca239e07e8125346c50572f7a6035af883d1d99a422727691300f5edc1b4f63f9cfc26cf079159bd0d2fdb6c08170c39e652685e3eb64cd24ec15eaccb5ff2899a23c62161ec6c5d1abb14248370361db56abe24acd66252ae067a86c0148803267625fac571d1f52fe264440f09635954b0b44ecc7c6e8c66bcf11689396674031eb5dd59dfaca3f20c8afd6d4b867937cf7442cb61c811330031c23f9b79b7dd0a01f2acc4fc2eddded43521f3e0eeb9d227b8445ce357bdabf2f1a61a4e2fbf8b9a53bba457f21fd7580a237a7b61c4bf649be4addc5f3139f2c8fe5efc18ff9b0204b5411377aeda597f390a0b06ca27f37e572dc52f0bca98acaf6a1c39d126e8032d44a6f0ff9687abcea963bb4ddc6ecc8af1de0338ac898b822478bed2fff236022ab5e043f2012f13c8149fd5b90ff8eaaeb5ce0b6a90319378756c580d913a4b020d59090b4c21694488579d57eb467b03547757b2478a5d44af3c49080f9929a1021aadf263e66dffeb29978100020f26a2d70bfed549ed555ebb92735dce88d1c84349ed72eac23a21ced3a3012e4ec6a8aa6dfc13ac6fcad0619ad1c1820c3be433250d665199acdf930b8781e65880d826a308882734c128373327f44c2c77cd094bd0d035b668fd6b66d17b52e214b3bcdef5e81b1ef2ae3e4220872c68ce48252d352f9587de087f66691d2b2e985287063664c1fe1020b699114e9129eaadc59dc0e2b0b47e6b0cf9863954898dbe5a6b59d3c15a5b5e2f71c627e1e1975c924b82dcffa1fd373c949194bd52b747221fdca694056064a2ab004acd49e1122eb5be8d8e7962a6aaf821eb5da129ef03b72d9bba42c545785f042b7bceb14497e3e9c0c84e81dbcf6f1a0843bd4968f602e4d8fa66025e9d842e612ad072187064e25b3187f39ebb12c2144177c35fce7b4fdf20545125626ea11213faca6a42813af20b1d733d601c98fada1356a7df7283f88c6e7f1b9b80ea9654c01da2c1763dc35ee98aef74aa113f77eb2d5d31f578a9ec04539a9f6355b8fc71ca3734d573087623de796a4823838586ce917f36724df7e9cd4dedc0d7454fff69f49e114d903e396f13e56b8eec7a1bb1e84c34f20c4ac7bd09136950aa497fc386d37fd5447cc0febc8e308024b6ced8ef19ba5181fba02262d59b1f172b49a345d4200916edcba0bbbe651ced3062b62a2f231bbd3796779d049899df113d701cd297ebeb707ffc559d71be5d421f5372e717652c5c80718d58a6e2bb1b92103bf3b3e8a5947cc71d3a75f98f14f90fcfc6a98ddf3407fc7275704066161ea5e4655ff7c0499f2b0c11a97f37a5e1e419468fde5fb328f62798476504e903845eb831b33210733e23a7f87ac8bbad6f5250c9f3dda9f773e9a9098941b56d0845abbbe4e4eee3857f2e3d38d14fab88d969430e5f1a08763b88112823ddfc5ec5f9e89a6ed0444ab26976e546a8c627daf317b94fd58d28a9862a93b8bdd60f67a33bd62b555e7117a0226634109a425b33ab98782a1f05c47bebee6d7d32a493d36ed111a4c434f892660fd00319f01e583ff11cb88acd956d4db1f4587753c880387d87afe2348f883e4da40b7ac6399bdc0ba59b529fcc54f2358182c4c39cf8a2d5325d4b48fd49b8411c906ccb3225711a20c026154e129164f4f13d56eb2b663519e88fb77b9e73962a888d34fb489bafd7aea76b4a6915025944a065f76674f0b094f7832b0a130b72ef9e81cdf46c2de8416e959c3fa44000975e26355b6732dd4e528788bd6de7804bb979dfab44aa03c8d4b8fa8e6bb565c30710510ba860ee8f1fb5cd50923c5f72998cea30b35fe7c9cd57a8e57060aa64dcc495c0ee38d982db7f3846d76317f65c7f1cd2e2548938de25fdf1e65407d21e40a91e4ec15abdf613327449211ff4638cd02eb3e73323b44349fde5d72b6f399184049f6d021bed73fe9c20a5869e67280ddb730642a37b8d92eda3453c47fdbd78576b5df180cea27250c241872081727ef5ad4b1139685c55585543c27808e4b4f3d9f2e7d0cd3df3cfe12f6c1427984e4d4ab5c411f0931e52ece35edb673e78644b393e3e4420708c2794e02878bdf07b5a3a233f8e9f62ca87aeca4d420ff6ce08c831e64557cd5a4b9c210dc0f074d56f69e416ad03667f9bbb4fee262af1eb3f547b564f5716b113796b16270a4eaa9cfbc93beb26d36144bfbee1f89f86ea911d12846516de976d3536c935420fcc4eb2d419000000000000000000000000007d693a46e7fd8f8f9b267f191ba50099f67127afe88002b4d5819549c9625ffaa8a02b7e90a26f780effdf20406fc6d5757cd168aadcc14dc2850d8875c5e9122a4bcdb0a34646c8541d97843464df0cc45fa25e262ad28eaf033811535acc4b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018b36f0ee555e7c6ecdafb6199086cd9c272d3fbd33e146c69e9590232ac797baf60fc796145c7532d114e891b0bef298c722f57ed628fa83f19b8423426ffbf541a6233fb11e95dfb540c2ebb0ddb7f6d02bf14418e4220bd585cfd0adc8922980aab83c41928af00f8ecee3f1a6935f7e08d8530db2996b69fa6431583b2f403032aa45856aae970392a3d7ee73d08ad165d1cad9137f0511fa14ca34498fd070222567f3323f113be924e0adecf29e239deacd76b90ae49e3b48a2b202620e1e60a03dcdb34e4c6ea23b2aaa04fdd1263d4a562ce7ad4281d2f06f170e6f207aa59e70cd49d1160337d47a4590e7df27eeaa791ae68b34c4101e8d13cb895fec96a02174ad24838e437613e0da69553a5a9ee4d015f6aabc90ebebff723bbb31ee3200317f92103fc41110fb82043d2e126e3470fd13facd976f3a63a4e797313fc682b02187f9bbe7a74a772b4758b22363e9c39fa374bbc0a686cfb8679083d1a580f310210395ef39fb13a1d060deb4aff5bb3e4bbfd8eca738f870ec1545e026fbdfa0d030e048b470fb45e9b6755bf54b45c9ef715f60f49379453999854f0986fb5f8fbaea85957a30611c4bdc75f908b22bf7a19a077c0b04b7248b85e7336666ac3beff53fdc301230c567934bca671e43ff0823107721c7be3c06932b55a4601515b474c14f0f58e5913848b259e8fbcc1cf25d11136bbff0964e6d256ba0b80fd1f76fde5a81fd153a8f927b973a6d19f1853b0d4b52b18e486a1260bff96f49980201b5be92e2987213bd3c9913a796f2e8f55efc53b23440eb49f556148d1b4e73e574dfd24e73d5e60fb51b5b739ac7ec101980e7044272b15b4b902b9d32bdaa1a633c3f71180442a1c75ccf8f4a7470107c73b11cac9fe985ce9cc3e53c764dcee95a9b2ca7a615e936b1a66558842300bae139660c85f20ec910c90f771cfeb5711f6eb1cf9d69ea93758b042933e7abb2da9fd8ee4b8da2b16eb89f8d0d8516ff3e683e1ae95cf8950776e8f301d9fe54a99917eed8c1a8afdbfa1ef563cb1db5f28cd80ee4fda4cecfc6ea4349a9a837a3914aba23afc5bc6be0c6cb2d22fe4e1993f095360180914684b6e800a0fcd56ad5d1306e5b8cb2e1b1d8b5eaa1c1702557792af254a30fbbf801cc16151cd22717d8e738e4e1c5dd90e06de5322e4527cf06b5bd7978ff08cbec1ac1a91a798254af353d3250b9e69124ce859c8ffc50f0e86fa0b8349313cb1ebd7ba799cd00a104f7f23ee7988a4aa2f8b2449075f0d1c1571caa43e51edd14a5ba57bb3d2e35ab3b59de3ebdbc3c65787cd65108d2a532a2be10aa1d6df1dcb38108beba8f7dc36171eb253ec2af247832996542afa4df943e4eb64971fa3f275cb7a6196d4a077fb3d7007af91f04610e78a3fa298a971759a97b4eb57a219cc11f0b251f438c7792eb6b3915380824131586af7ea0b08785d279ef315b9723f457c95f187b96f303b54cadee520121333433023c3a414bdd26127d92d777cbfb2696f02d58c987607635db2303732409210b043554b90f378b1cee9fe2fac944aa3727ff89535558acb319e72b9725562e7a748f10d885ddfcc959d63c03fc78f8da060247d17580892278b9c2d88de754634c83bb1ae08b53fd42300e533c8f8d16a21e3120ba40cafb891e72bf52367f7393ef946f7a1fbd634d5d90f22ec7c34a2ee2a34116b2877a5f4f12a8e010dec4ab757ab1579d8449edaa4b5fc715305ef8a49f2f3f97d86d1d0784d4e8a1cd0baca45c27515e23ae9270bc96727c087cf745399d3f136d14ae15403acf9ad06065203f074d7a8c034d2e5041d717488eee3cfd036fd528c8f279061e2a186f13a28713e9d03a44eca67127e4fa0db7414c15cf012b8d2fc8d3e858c92286308007ebf18290a1e934af2027336626b677084d45f0ef0d2c256cac333b79fee0d7d74b704f66075cbc9bb1c111af9aca8e8d723c32dc2729e627c125048941ff73195636203d4542404c81998216053eb69521d0f47a54d4295be864d332ddb16910cb869f06f7abeb6fcbd37d5103a14f179b90babc5a17401ecad777b7923c743d4524201642342751c270d46eaf3d86c72d89450f91817c139d5794ca9c379fab0f06fca1b82eb40b8614d9e9d65ce071327ed556d26cb6a7b87f1b0fa83754a371f6c17374d75ecbb03831b6cc103032bd684dbd55ee5a15d78d556be3e5519ee5b377709711b62231130404d28ee2b273fb8a4149a448b9110591e5d9ddaccf10a2a6b777c39593d05f7c4f3e72270402bc30100000000000000000000000037709086284432455e15fe0afed42e2e16c096569b396bbec793fe757bdb83e3f40b3786ab6d1462ab0fce01248012df8adef08e1a411b4efecb4feb0800198cb512afd5827cd2221e020cce3573366befa62c9c560b13f44453e18c285326750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075fa177b5849b1002b1535a920e1d0c28e30f111dd5f7c2f446c336eae6f47857e49b3e62ef06645348840c7ab443956e93b5dfc8d489c82e86aa173c3259eabf9dcd2ebc4a6958ca04c91c17877e3d397c906dd906f2730624fac16d4d30a09273ddf3c26e88f66c826b611a9853d6fcae0550ff3acaddf24ba8c627f81c92c021f56f32d3c053ad88e2d9a8c8e86d8b48a51bb50f042e930ad5cd4588102f34a021e6203562756f23c11be32be6494d60985ecea731375033d982709814fe1eb150a06ed7290c5fe731fc6930947fa531f3794046b5cc8985a3b458d8d3da2bfe968eb29f3782d57817c525e948b5beeebc0bbc477c2bd65e93a8b9cf0ed06c96aee030d0cd552c6564e9753a9b76c8a50c57dcb062d6598529893d60226f5942ca8c903061f6fccf63c8385957dc9ff29d7437b0e2bdcd46b150ea51e3d7892bc8a335a0221e72923add45417e39c41dd186629a57f75d7149c6c41d246772f475826d9fe030103d13bdece9966fad4366e98bba56204c5055e3bcb8fea31ee27bd2db5f2a3031a51db2567f640ac3ccc15f53f7a35999827350d28caef40a635f5132b97cbc3b42e1c56e415f03bf691bc0ee5d026a696d8203a1eb92cdf09557e613ab81cf59e202e6b61b65d2295606de67a983e41aa760f69a7010f35573bb88e4526edc41f2ef6a7f95bda7afd75217205311d3969c38d8ae7c888a34449cbd3be4aece1d7b5e7b4246df9c6d0bdbcf9f7330723e35e08d0395d1da2eb3f4efea7f0b2594616ec9d6df6917c956a2a742f2f03b184889151444c9b6e4d7110a06ee1eca37c00eb45e529aab55588a38b661864b0f33ccedab569fdf885654b3b88dc9bee70e414ffe984b681de2536de93c65105532aaac1e61ec541624c8739b4ef376c4c79aeef69b53af75e318a52973e380f053d243ab9e2c9dd19b3ad93a86ea9d01f3ed0296b0e3de46b0101302593e123e70c0f2f9a782778d95a36e9a20d942da0536ecf52535cd1a7be7bd26e3b6e5e32e40b5fc7d4b05204fe09e3fcc4b8b558f277ea46166ca4806a52b94328356e866c1b87d5f8549d85003135cec093a14c4738d751e834c1f026b25394dda57b15c62651d9e94c00dc8a02e0d5f5ddc8708dda62a068b460599f7c025c1a32722bfb6a4a6b511360d1f91686977286c8afa211bb672fd848f8361a62a28c68568c88b2199e282b638815ac72b28e14141fe6707a7a41dc674047e2eb05be18326d28d4a68bc1a3c5f2de6b63fedaac84568116e507c55c14a84d4fc9c2afaabe16298012e5ffc2be2732eb64b7797272ee6e692add780512d0f1d1c0c77189e1eb6b357c4ab7d6e8b382f8d00bf77f5b63e8e9c166a40a2f238124d99cb4d71d471bbc5b7567265ea53e0bd21093fb223256ba12624b629947062b28327389781a6c338ddc7c2b80e2254b5e3e083de22f1060deffca04527ccfc2826b572c477ba44af144df336cd50a3bbd9940761187d95a82ac678cff97faa5fe6dc5a34a9d2952218086352d858bc28eb6cbe7f65c62ca9b6c4bc5fe1d17875e099b556a3eecfea25178c59b92298b32f3e52191fb4cfb500e96d992c726f9c6a1d91daace0475df8321a5fefe5f799b2c18baf44880a7c002340d23e0556fdeb9fff0c845f035f936728525f77fb3fbabeadfce3a2a2de6180a5940d902e955f081ed3ebe6ae14697e94f028cf5a410cd64cc75a20a79af43f98066f495f1379d5f49fe40c31f6f6c93be411d3af965f983171a5f3cb145dfd424d3e0cb60f7cbc92cd5c417a5adbce371dff06ea5afcd2b548b9b9c2c65a3298003d53fe14cafc140a208495876c191b8bb277c6175ce8c04ffa7c6f58e98e198449c60276cadfa579bdac108fe4adae4487345e220055a612da046ece40116de09ccd52944b74f167c5a6ad586d1fe260812a6fa30181322707ec66fc9dbeebed20226722dd6586c6ee6bb0c5e609e6830f94b75220cd8115b33871622c0ffbce57301edc4884cfcb356543ced8206468c4e2e408db43b8504b3a8f3da764b2edd9698fe30c5f928a22cb4a69c25c8957074a8609bd800210f8004ce0e3071f7463092743e08c2623252d2bee62edbc24956abdc4df01c8a7e8438df887d4c62aa2704d8436284c79b5b01710ef62f00ad92e62f83bc16be8e7e98f22a4a0f468447073c7b8716f1447211cd55972081224e6484a60a62e97517b59f14e6bd5939082c07b1d96cadb94950c016a4909598373822ae5d04062a831ddf0b04b595560c9a45451cbae9cf936509de9ebb98fa8df20b29a869282deb32938413be465318a30fc52534e425feff8e697f0c361056bee1805d0e1aca57fe8610211c8641cbeaf83449bb60e48b69de79aeccbfed93c4de452091ef8c1a505519c31b62b8a14da1ff1868ce377e0c", "", 0, -997941885, 1537743641, "e574656e29147db3b8ae2e3798fe6b740ffdbd6f62413e3f4501f74ce474ce10"], + ["9fe0827e017212216323d5e4306fc7e041b1434355df9500a6c1fa9023b93f98bd16b350840100000000200195a6042008b90000000000025253044b7a0100000000096a0065526551635152fbc6250400000000026365c736170200000000026363000000000100000000000000001e5c3c0500000000f35de8d216f549f8dea13e5064869f0df0623dcab56df84c88f45f0bebc9186371ed50424d5c58c90e6e547aae11b049fe3ff135c166c055d4ad5361828c27f4018d2c174bc33a6414f570b107b5dfce46e61d31160d811e42c3bdfa9372326f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007fbcd2b4a1492458ec8f0acc471965a19269a9c8965a578e7709e4516fd571e713ed115e9e405ea4e0d5c2d93564f976c0f81db808c764d59ad1edbc9b1f76c2cb81cb5f3c599b0a1983d7c6009296a465be948308e6569af3bb5d53903ee5ad2bc6012455f2698a811513b8558ccd9b43de4773d49a76da1c9d76dcecf95783030227a837079731d1172664c9991b35dbc27590b6d98219c0d95203e2a11e5558022d49f31a6c47ceca674fe57b646ce1aa25bc559152436f10d656a8adfb6892bf0a05d029085a0d34b59531c2b1ceae3dbc4bd0607af66162f14466628764b79033a4a3fcf94d733e5ae5448d2a00d478686fcfe1d424e9372e1c0af41bf663567702122286151000daacdf602d196e324afc0457742732a79d935e5339abd8efec290314d823e0d2bbf37792612d936721d384f0003e66d8531fabbeb407772802a4d90313c2483992ab4ee55f50dc6f3ca677605e416c6fdf780e88853800bb32af3f4a0211f076a3af54fcbeb836303dc6c7a21c7f3f42da9d64f38d202b735f2221b667021e835e8653b85e7bc4e5a5c9890356f9aea10a9a488e9f266cdce4adbc77da42901d05e876bae826370dba00fe69400158507e800995d6e379b90b12582e5af744d4d01029d083c88d783ff2b44f88487132b74bf11b537468f578d0fbc7499517f449c9177d41d3a0e1f2bcd64632d4ba58c4f0342c36a176e310a3ad42a6bcc8adae5fa443c4f17e7c8520b808ec33bd919a6b1b4ba6cd2b73b2580ddd7ce7ae74a48184566866494f2044649b85e8cf82c63596f51401eedfd902e22ad73a4ec522f66e808890d6f00fbe62689f4ae6fe658ac0a3ebd5d274fe1cf906cc96c20e723d857f1dbfa35a8a09c008b011930af360baffffaaccdc4f1d1fb3a87f56ab7f496901f5e0decaa068664dfc7383b294b96740df6cfa5070fb16a150515d59c0b0f4d805f69a5ac5e7c65a19ce9f5db5dd779fd343431c5ae61f01229ee6e5747522b35e9ac2a330b73ad0ba30ed22e8acca316aa0f5a5b2b865616020cd91a031f4376cb6ba887ccc4dc47c01ed11842c707f1f3c4997c11c03c42c89e625e146499722034c93a489914298475e26b26f1cbe418bc809a531fa6d613354ebc2b35123a98c36042d10cad457729b88503d51738d5724c98301a80f1f7ac6598194a91dc6fc87d52841afbe524a7a0dfd33f2164744ae847dc05db51d87fb6c51085181210c0cc6dc98e6af4bd22387763f139f04ca10dc37d007a31a0974b77830d4c6b923c493c4bb17177ecc17f137bde60f19c2c7f0d220f85f1c8aa14707e9a8872e9e0dc8d5df0f266b7ed3d1a250f4fb48d242571b7467cd37acc0849de39beace1d85daefd1817444c38d903c2559a9ef8c529ebaf949f3ddc2d562fdd5d5c93985d75096139c9c1ac732b45dfc213bb99a3cbf543ec02456d1d5e27bba2531ae9ca72c35b5c3114a1bc6410aebdf2176827099a37246d1b206db5064d8efc5334ba845f570e1e29565c04ae01f572cc6cc6d7b48d89e9fd60d58691d6c46f6ce6a4b1565f8bc65a5994f82c44c538bdd09eb78518b69caa5f468bf7bfea939e5030941896cd59888c0c20826eefef19c08a32419ef56a9a94bc223f54444113f5cc7bb17b1cc4b1f3e9430d65c66b4dbd9b57be9eceddf182c17dfb3c39554951c8747a87b8ba315a858d6d85e5ec0298cb53c52e83ac89b8750c86863650a9e506bb8c11f49ea38acedc16d41cfbdef9d0853492f3de8e9634e711f3ea36e292d7ed78f91eb696e162012701569a627d138a232a43ed7e3b0884c8d67baee527b4228aa3daa80db26bc543391468e3dc0820eee85bae5a756123420572e773b27c6cf261e4a7424e71a7e9a803f3143b2503a7f7fdb6f96c650a55a644bdaa4820a5bcee330b2055887aa5923424935812cd8a77f3f6f0d1cfc052d524a3e2764958f242d840610f69b0363cb458be8962f20391a63aa460aa9ff75e81e066127b18cfe433d9f93109f9bd020e70ff5bcb22187a02fa4eb2734339ffecd83e6ce93acbd5c6ac35f48f1247dcbf0ca40251f23702445041aae15ed662d6bbb3b6431229f2bc869fcef4471b2eb7da8b6e80abdcb83ae8e9ba4c894a605e31ea72586270734beb28f1d7ab1f1c32e6a796f1feb1f9d7278ef1f7c54835beb3e93766bafad5efc4c398dec887c0978376a38e06fa94649408a1eb1f758025efe04b2f3c6a7b65975fa7a226cdb8c41db3b7116341961eb69c039820dd981b76d8e7af4b2f0a08c60f3febfe7e9e91e15aab095ec683e6b90653acbe5322fac44c92b2c61c29e6631dcf894c6d4c0f127fa2ef0ab2fcf4f5e49812276ac7762304e9b24f0684a89cacf35fe2e2add4f2e6914966d12ed6f4af438ba53861eb29519835ab716f6ce5cb6ba0706", "515365526552", 0, 669396948, 0, "8c8e3725f70a8b5d708be4e5925075393477ab8da53ac4bb8d934772b5d39ca9"], + ["030000807082c403045c512994979939d10fd1dc9c5638f679fce1b1cf850d2ae58c50d87b01f0df470100000005006552635143f754c7d897c0d445da2d941ec13bb95c1b11bceabaee998e6ba83bd5c21255d0bfb5c2000000000752536565006a6a46404bb420c22f740117d6ba5d9d75b79c6d0718c40fe8b5e791adf03f1f5136dcfe3f8e010000000551ac6a00534e9692b127d3b856c3200ec4a7254ffd0503c6c4436ddb8f258577a9ca421b60caba302f020000000951526a655253636563ffffffff042739150300000000026553e0e48f050000000000106ae40500000000046353636558e79b0400000000046a6aac538de2304c0000000003e98e8f010000000000000000000000009018b8834686cb95b390767e0dbfd6cb5de002682979d77d84a91afa0ed42c57a4dc755bd03e9d58eb555a5dcc83f0a028479c14d883f7d59a3900a4c3d115925d0dbab003be9aae530e3c08e4492fe42d3b2c9c2508d3ffc4fca46cf58c39f90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069486805d24cb7029a35db80b8207d4702a1351ef743ab88b88356506c097ee7f606a6155c38e395c7d0a9f0895763942509fe5b7c9a8901e4349a18bdf7eab2d75284d463b2e6412d0097e18fe0d81724529fda8db119426bf57cf6a8cf02c46b8e4c208bbb45eb4bc772495a8953679b6abbdd445887bc9793967537ed7979022444cd18f72e3715c08a2b238b26d653cf71e7ff3cc69517138d72d3fe96223503007116d6b35ee769b94f6103f5a956eac926b67e904e3d6cc915e254c97e395b0b0707b26831a742766749aff231a08dd8515828a20fb3bba0e6877b93da6dfbb685b79fc166e4d2a9fc856480e960c8bb9027865bc270bfb883d74c60e07da3c6021e5c2b43264e2d3e0396fcf7b2f3beb6a4983edf3c33ecf422802ccabef50e5302097d0da5f52513d5f6185c8169d45d1d96730107005dd9fa7d925fc6a29dd58a03286f683fc889ac696114046582f6dff5237ab82b1907032a0ddbc1dbacc54831020ec7a021588d33e5fc9541f913a3f3e19f4f70b03d6658ceb07358cecb9f720c0220eb11bd4b082780837bc210d1d4518ba3267d16ecdc7cd11781ba913341a4bcfa3b8389711c21e2a3e00e98799b7426dcaf8627dfc4b6fef131f2d69906ab75584e574018d4ce2e94ecac58453d012f55fb2466d0dfcf486b356a1cd44784383b559b9fecc26b809d264f83f5e8ffe86521cb76866e802d675a85b538f8936412c9c6731a7367c85d867178b7effb4da71cf284c0a9d0fbee6457fa2cc4e9d91844231e819f21887c66f1f40016e337a116623bd7583e2492009daa24c4439c343a6f53e393538cd6668a4a7ccc02c83eb7baadcf62fa2a3dcc52ad2581682125f960eb99a3dd2b3d498f66f2d6b35f66ec00265632f23d802985c31887884dbe65db2bf5f09017eb36206c7f2b762661c205e7f65616c9019b9a335908452e24599cc351d695b07ff3580edc8104294caab068cb2d2ac5cf995d4eaecb394ba194ab0a1b19f19d1475539f9318447036c604bd6ab1a0cc7f6ccde93e084ee4fc6fba5c72f5cfa3ec729ea0a71bd3981124a4123d8764ab1c44b51a9550e04fad17efc8c511ed0fae1b1dbce1b0008c5d634adc245e5e30bec00c47e4bbe726d672b34c25b1bb5c2d060c7951cbe9d553da6261f45557d3d508564d9cd5432dd25bf735a2ee0e86c2bcf4d1cea6fc50e3c5d9695f1fd8dca400760e3b650460f34bc4ac4f14061f0d6c35f5f6a7cb3718399c7e89c2fbe03e64b75b4808fc0b7fe7bf3d2063dee8ca73cb1374265d65d7ab51700a79937fb07016fd93ec747d281044738995205ea36ff7fddf0e0768d0f507aeaa4ca560d794bb6775553d8d22897e5b33165ca3a92baafe23f017d39179f9363d1327576a7dca0f6682f19c6309023a0a63dad297c3fcdae485392ac293b0dc27a37d3d75650d28723c236e2534c67326a2b75acff8abb55bdce2145c7c5e5707f63a1aafd8e65c6f73724256ed628b86c5f3ccea3d45255cd7a76835b4a01206ecfcab793c136954041b85fdd9321228b865770fa614e193768e8e0c66738b7f8c98ff077d35496d9c5dffafe6ecfc144846c5a489f2d0722ce402015b04de2e532e2d6e7621a0fe8c1cedcbf70c391ee71c9c1c2017d371617a20a897f4f83146c2a5ec173346b18f9ccfff7a4677d0b5b0cd728937bb5558a634e8acbf66f7f6535038603126079032ccfb8494dfa7202338b88b5fc3e7d5954fa6c1586e554093b0ffa37e84e24c875cac01da5557972d83270a77d1fb70e61b4b304864f8916d9405be5c13e0e6446fb1d0692fbac715a9886467608b4d9b5a57b63910faea965a00d3c509e06a163e25c47e030310134d346edcaf488820ab7ce2cc91e1b98fda3f8b19cab5c0a1e35f73d38de6ba0da44c707a2baa246d649ef207da93c9f8bf8a2177afb03df050ad07dc14a2478c43d1a32f15fd0343e0110f6ef910985e86b55461887b7b38991d75b05e7007e190672a3ebfb5a3ad00eeee125d2601248e1193d41cbe9192358548bda36e1d34e3ed937fa72f9946abf1518b185d62798e3fdf0be6415a59c21aea5f95653adc36494f1c40b79f4f76777ab6d1ac853c1f60ea48e81f08fcc865f4a7af5dda24ce1422ed2c5473b14b75e5fdaf7925487a514923432fc5816bb57caf32f33e8902187d884c467e1f6f5a975452b01a642eb08bc9b917fca116b3b27549648a99f490673336f88fb3afd7eca3dea98814b1a8187da2a8d8d66396f56bb520f6a222953be35b38b9f77d2e5c000000000000000086623e0100000000bc775afe1a3d81345a34efcb80070910e625512bc654fa9dc79959a0cfb2d2948ab57ff848c066a3399982da25ea15879816e802fbb3cf1fe8c15891c48358db03a944dd855656eb4414ae984a88f6011440f8adafa4911c480fb8ef445b25b4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006d305f7c92b89fe49a8145b4fe1d49a7bf6a7c6799f5d6153485ff8d3b511211a960919ae13fcdf214dd572fc54c4d0e37146f4a141b34ca4730321d9097a798fdcc2f394f03a3287d2a521025f0e7ee2b129f2cdb20c4682407cc5a4315392569cf6b1adbfdc4e14fe89a886a1098c849b23ea4ce4e1e3dc0c0ed8259bf93ee020a994ec3c64790a298f7a3c3d62079dabf0588caed98e413b63ba21263fd1c6b032a859f29d2960af8d65db52daf33937a6235a72ee71e234dfffebdd1c81ef3f40b00246664ddbf4519067eb80601a63826decffed533350dcacc940e0b966eedcd8b552bb2a127af7c2115bd7cbc3e8cd53ec87c465ec1a1620f11e6de606ce7820330120a33c036a42edbac0628ba625d36734733e654bba5f02cfefa0c85658ab2030f7795cd7cff5009a134de873c6cfe7ecda3a14340723c7f56985e2edeb5195702276dfd55b238f578392581b7cdb1a22724d352e7badcc313d94bc7dba08e58bd021576d644471d1e7cb914fae84f5ff890bcc5fca12fb55b83922ee2a36c088c6b02110dd79bc3c439ddc1483e676e51020c0ecec783489c0ac3da6902239c830807bddf08b65cf379382c04450c33c33e57c28edd1c7c8431d4e431c4c1dffc4095992638c41ee00b42d81579973abfa3f403a353ba084783ca9687a0e6ef55d39703ffff307383afc4d0e9634c491323c194d98f5c221128faa44645e9194462f7d05ab538a4880c5f0784c2eb9e1a87c59ba5ab4a2d6b67691805d08bb5f41cc6fe14a0356b37b46dd36459ae8a5b72b45ad319befbac2f8115162380d85093041b75e17e971259161cca743415aa17348dba2bb55e5a5d346127f43fff53b96afaeeca61e31761b8e488db49ef3033212baa05a04720a34fbc3ddfea52f7f5b1378813d48506768652b9af9cdf80021a9c9d1591d6c482478dde81631b8040124362b5f0e5dc7a202b681777724cf3357f73f6499dcef6867f97aa93b68020ae7a1f8d0655c8035e9ef3a70983321506f5682392a13a72401137895badfe5eb2297246866fc637dc2f47f91f2aa5addf62db00a421232ed777f6e22f671c2724480c8ead9283b9055fc96a20a24d33d950b3de4b3b670b20b7334d357148b8566f768b5fc5d769a8553f50f91cde941020cb70c915dfbe1b43843cc07448071200057a6ef27a518da37263318ea890983205901fbeda84aa3840922e453d562f4ca5af15460632fda14b823631f9f8ebad892a1b13b82d914a7f6a7eb7a115916fab59d325303bd905679af868755852ab3eafb3fd98b63db5ed296d1b403c5817a5aa6a046fa13230d3993f958ae4b5b8dbb5640041a0b63c33f73cf340f90dfae9ef4c8fe98c94e807df3a7ed5762dfdd1d6d4771756d45875b0bd0d579b95b6ceccf2c3a7ac4c09f28fd50de940717d8a8cc26446206e01da21fd88030b697743fa940f0276dbd67629cb390472a24abc5c762e67da8e820bdfe34190c1dfc89a6ace3e2461a80cb82e7d007f3f7a8d669f244c49a10653e38a7e4d71529d87c90cd17e1adfe22307f96a822e5e888e8f19470fead01833969704cc4ca78ec4542fcfb5cecc23d8bdee5cc2cbdebafa02084e00eb2435949145623f15fab6af10ff45f61b64cfde55753bd6632d6ff76bf16ecc8e5b674bb5301e4c39eb3bd5382fb76a81965b1375704cadfe0d0e235a772a2207356d6ccab388fecce64f0f0d640f78feed9bf27b43abb0de81df472cf7363b610d1bad6d709a3b13afa81c6958c2cd9e607cd3dbfdf215c9e50ed5be359882b55416284dddfe6a03e09611758be0cd6ff40a8c07cc30c00cd77b1b763cf5962d7dbb1ef8efb2394daecdbed8892896f3cc92f687a22eef926012ee82289992e6e8a09881be996cbf9dcb58b539fe102511490accbd3af3aa4f2287af6ccb79b190f4b41abf789c4373de05196c142c069121cddf149921f78f69df197916949cdd80ae0ec72cfe3983b8d04df720f93e8bfde68506e6111ddcac878e85f71180b3870311e0a15fbc9f83617c7b2d63dac0a8b7af5e6d0c32e2a85952f008bf913e9f82875e55e469be684e9e236fc6ce6677f6e46016687dc35b72b9066cd1e62b08080783efc72e9e1d62c2cef6dca558f4d0eb913a6ff1a0037e44566d35d4edfb0ea5d0feb69b4769126c42d0868a171e382cdb293a41ac551feb6aa6679ab5b8520c513e37c66081d250a1b53fb189df3b5d89cc4441259b7a51cde4198efc920be262158ad4d889c3dbb831572b66394dbd2a52e49af36e48eb0000000000000000b5d3560000000000a8e7b08e2ef272eb86dc279468fa40f90c6e329f776cf0b9f53c6b96c4a79fdd82c3e7fb9da0985abecb9badf49a8f2cb90f678e23019f6bb350757b19b4750fa7a74dfe17465c407676a451b811873956aa0485550c54db61aa4f0e85bdf03900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d79d0871bbc63ce18f46bb499ae9fcd8a5842b8b08c6b7486f90b636f6086b2961e564dcdc2fa097476aac1a235017ab21fdf14a4311aa1f54fa433feb93386862f92fce04e6f88d89fde9ffd8e930e0f6b494baebd69beb4c6beabb4a2aac213cfebdd0344d9cc8f717b6b8f1fd7ce93a26918cc3045e86e49f035eb1174a1202135d9c7b62e1bcea6edf8557a3751777869eb08d8550b0783c1be421458198640304a5c2fc930782939666203a81ea9d2c28aa50e1494265779d3091cb0c7262fb0b076c07cf4eff622d2ba1211fb1bbae167fc7e90df280d5e75f53c36b2066ea383f8419fb322a1408d1303b7af55ec8d25dcf2c9bc6665d971543343f4ed856d8021133dfa76b9bf1a00414b2f69b8e7c3cf246d0425ad645045311f3c8b0c96351021df17565367e70b5a2d2dab6dde3635dccc2883ecde8f326a0948f1239c44c190301bfa0500ebc9666831ca0a7379444f86ae83d791d67deb0f62c07ad08c22b5f020625ef2b3e76295896d024d85dfb6f7fafa1c8c4fe2d111ac6a12497bc1bd403031070fc623fccba965de25a6538275b003da853f3ebb7e80fbe1738712362ab427f5f27a3f4214508ecfc6171a6d480d8576e94c7e915555c1f650565c32ce1b26a1180442e83acf9b0cf697a319b0dc4766f0efba6836393cabf676ece0f4d9e8629da4152327a9d21cb4d38715d02da39cc392143301c306fba807e00e59ceba036d818d5ccc51dee1fb3531c356778857c6a168d22262069678e2255afe50a21b45b154e162f3f2c503dfef6fd89f50c961e9ac0f910a12406f4275da71b5a44a6c843ef1dba10cd7bb1ab72c63afc03202244e48c40c67c72939f4bb2a41fac0438e4b10476fe37151f34b1bb1204bd0e6152691f3d1e1a5d32ac84dd91a7abd96209cf093276f110a8a4dc8a83a7352d98f5de496b5a1b8f3f70dbaa072ce5ff9a9fd7400b2313cf6150b2adc92dcd379d4da0b6ae4709d80e159735c65bb3b2b9f3c6be3c7973975eb90aacadce8417796da9f6e856530523aaedd7aba2bcbc5182f5663f0875b405790cbd1160a5f09065d70f710617e4fd1cbae040a26923ff6e9361cb268735cc95b71f5c56e28d85d08725d166f1686a21a568e18e3fd06c26005a9dd748fa57cbf23def26b1f20733545bac4f9031d52f377d3b959eb5229af4efcbfd194a8cc9a373e29c3da5c5cf8a1f1b8eaf270089efe4f76c3ee38b8f012dc793ac8c16c711fa3d185d8335405b6dd433822e220ea31ebd0e8aab3f07e08927c36037acf398536e4f39bc2e4ce5163b6d095beb011582d763a3b40fb2f73d9a1f1ee67aaa9461aab2abe6a7a0962b33af0f6c8ca9378aae5a730c25bec78e956034d7dff6cf5f04664482a33280252cf5385eefd93b71e032bbb6cf8a859b02f51d2636e0d175cd166b1c8542b64e51cc377074e167bc4a802eeef4cabfcf67c0d9beb898cc571b268ff1f91c6b157d0ae9aa5210a9ed1485cc70e826ce70468b180c3d9799a69465e290bce34996bf3bee52c0adc7154838d79f8c934fdc8d39f6889f9662cdbdb0303c59df7d02d9d99f3a253c531fb88596cc6f6c38c00ba8b165fdf76660839902c476befebd3b010afdd514dfa8b7fb9a9720f1635d1201b338da0c69f7b0e49a849094e5fc37678df26534442cd2f4186b6dd889321474db197c35ce8f5776553309c36ccc417f4b232021a1ff111190fb56e008cdbec54a2eb12c27aa2c4933db1831e5d2973067ae5469413737503d75ff0e36f360084c7d06dd4314fc2768cb26d5280101c5969155295fe7b6b3ff0c6fffceb820608d6cb3025dc6656b3c7bb966dbd62ff6a243a3b4fe85924bc101b9c0acdd816e4074b964c675d488546f088d2091a13736630feed0f70360fd3ac79fdb6f503deb4f10c4883f40109659d1047d6e30c56c1475b160993d5d4889443bceef8d1f6afd78e83acc15997e63dded518e6bca2662661bd0503b4270a7e61179af24d57f32e04c384ceea71bb06f1d973718aa2899d4ac45d3dd850c16e8ec506920c0c66745f55fc440c1f85e036bffd1a472d62877b0088b289ac17a4ebb1e0e010eb80b693351af063a1d2f58c316e22ad5d11b869f0d6d58c01318da4f70c3c97005c20ca55fd4d3a56baeb57b914325dcbf23071efcde07ca8d0ed5cc63376b36944618f666fb88182cac69108a4fb1f37266b186be48a3e110970b399b2cc5873f458afee6576102fcbecd572f151eb0af3432f7ae88b42a2ce17e986367320be07bfae04689811ae239687ea6d55f8a372f501d5be64a2d28920675f4619e446edef81eb3a1d8237f0be53c0463dd3d72894116886402bf04a8de76cc0de34529da545c69f0eb1299b856903f7b514a6ec51bd336db501aede8cd050139f1af8763037ea190267c870a", "6a6a52536a0000", 1, -339911593, 1537743641, "ebd9254aab96b841160505ce1fda7bdf3044f2e0edddd8c432aa597b90126334"], + ["97d85d4a0100441273bd1c1bdf1be61cf471bd98c60fc48e3e03f7091c01e6111e793fc29d0200000004000052006f3e86ef04b0605e010000000000b6d82a000000000004ac52ac656b7882000000000003ac526368a6da040000000004006a535300000000010000000000000000f8bf7a01000000008ee92a3c9e29f15c4d794ac5fe12384326585ca2419975bf36d27532933cd35b0e5a5c08b207cf07fb2e5262527b4ba5e32e3b2996ad228277f97fded41d237363b5d4518c37236215cde6ad6c6deb3ea64b6ed9f51cb487dc77921a8d23376d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004bcd2e926c8295e2d97b880b1263a2dc401f2951bdd177c028ff8a89cfff4dc068b4e28d0bc9dd11ff564ef0d474f8353771ecb861b107aeb6a379f0a9ef4ea3db98af7baab966abaf9b322a4c5cfe6c7d271d9fb984487f03b304acf4e9df1eb4d57d995f3dc34e19ad18dff8d454ddca66c33c44f82b812ac52eb4301ceef50317a09f9b6ecf6f3c9440ddb7a796a7db975de762fb2d36b799b4d2b293083e630208d47dc1bfb1522a5696b885993ac4a5421e0227450e7b67f7b4c4eec5ee63700b04dfbf48eb8de3d9c2e3e9b4cab2a6f4e6f907b75d77e51fee5f7d8ea476ec392ecf045bd5b3d9c0cea8e1ef385105a9bab7b758c1529135b9bd57ce33e6f06c0200e660b561f31d0f096a21984693aa467f24fc3523bf054f5e40c778b475f312022024f0ba94e31ad9c9070f62537ca1d0a5081712f5218020d11e0b2ff777fdc9030f71a11897ca28970f352c468b6a94cea8b5c4750adcb91f01730903e1abe3110213af951f56d3ab9fb39cce26380596e7640153854abd89a351ce7a7ab8ee5d360223cd4a535623cbab39d629bfc191d2da1da22fd9f5f41a49397477bc1ac921547a38fe23b34bfe19bce51e10aaabcc8815b79546ae0042e62aaff8236d79e10145614624a25f62e168f6b474ddb42b931d267e6a539df6e681e088316941cb052559187a136ac388772462694b56f082ce54ed18e1c5b8b7d4b74054d94cbe1432450742b3b39c4ec363760493fca405937ff78443abc4182fb0a96775d763d1f3e704b53a296092636f72ae726354f6e258bcf2765626ce260e0b83c2a0b5aec66fe9cdcbf5fb716263919265ab5f66f2d4c6d7060cd3cd2148d49308ee84593cf34288cb086c7b2f1c78a8e0e12e85f09bb04a49a5f525d52ed8decece41e4eac584194d2e057150d0df2e20f831d9f762ff14bc2fd7fa51b1f4974ab45fa53ffdf5679cef6dca2a223cf5b0d2e83d50dfe5fd15dfaad4705d11b0d25b0fb90eb0506e882a291588ae88ba35d150c38818c93b47f04e6b4f2d9b26c39c24e0b6c6cc2d206f544853185087aa5e307356f5855cde956aeabeaa4828d9a121e5bc57fc89f472c6fd59fca7dda820ed9e43b2aa2110ac494e155425b42d1e5bc6f4ee5db0f2e7d05ac8b8923cd22fb6f33121a2ccf2ff3be2212a4cfb1b1b3cfb7fa063737c5547d8c1f728027f7855e7618700f7afc622b7a44878341a6f117b7ce70b874d57c1b490addf4b85d1174c539a828f30d524b11162585171330194185f3bf3dc71c1df76ed69e339b21124b4320d489f52c5559743446971624be220aaf37e54f89cc793340c2182ce937ec259b51582061661e333aa1d820f44080248018524f391b6ed2246554e001feeef4a660690876d38b3776d6ffbe5b7ceefa90fd3f35e5d40c4576f562499430bd92e3890bb2ee79469ea7e5b4bf5dc3961f0d5c89a1acc8689d02dac22bdc3179bdb65b2d94d033af156aec3d6176c08325f7bb3ea1422f0c5765caf27d650bd0562a3bc639877e90adc64378855f132341faa5b2eeb4da7c3ef60ac0ecd226093c927a9e582700b121bbc8c5887c5377fc3997dc21b9c4910e21f87c3ba460e3d0c50ff4f39b2ce6ee620762e310e498907a45263da6a89dee8e8315bd1591bde6e6d173b678993452a2f128617baa0a1d9d0d7c143305deac0208546de912b6886074aa134ba05ae7eabf857686b57bb953d70b49753432ccb5de423d6b0eaf9535e59f38ddcda86a2604517e4748cebaf45dced3664a56c598c5d093838ffa584e3bd1d8b9680da22be74124067865675c1924eadfba70eceafcf0b1a9665bb70ab7eb248f23cb10880792b789de836c4b56ec3e4738662ba2f631b530997e62a3b54b6de13818e9eb85121adee6ff19a1785e293b2d80516e56c5626c65635013b61168f305f882a3c0c258db4e087325183b0cbb261da7d1bf1380d5f8f54b3e0514d7bca2084d6f64d15548c1a0a8a90cc7f8cadb1679109d4a02b819f649e1190a7f964dbf244e2d7d2c020a5db61af4bd647d98fbd8de4f68fb81f064a0b262c60c95c1c66f092fb2e6d61cca9a0ffe4e1600fe61c0c777d7e47aed015c5e97e5d69f4d5d462e7b36a95231a4d97f969266d95c711c8fedf92de58ff42974cb3590e2d86116d7cde07496f841439dc492847648e179d5c9e09271d7ada264c39a2b8b126ac8ccc0967f35a828c65eefd09482835c902edaa2b4e53e8308843be0c162ca6deb75d2ad6ba51b95c1700c7fc3e7252d1fe0ef88f8960213ff44a467f7191afdfb52f177be43d88cfe3380a56f252913bfd6beed1c3834a253252af5f8b4a3cc316fd8b50763930fd3aee31b62f0ccb8807dd7545896c454c746014913b15a99f21892ccb9abf14fd7ae6010cf988ec26476106b08234f7aa00", "53", 0, -1310719221, 0, "d790f8e8c76110e7e42323661edbc25320cee3e261e04ae52c746d8d4394a885"], + ["afdd515a04063af696e62fec0e3f68f3301ae16db760f618509a1b569d1b1349d5880a4a5201000000085100ac6351006a63a36296d14722e2b728f5c3efd2eea6bb98f453c1cf4faa9a2b21eb7ef84f083ca6cde9680200000006530052ac5352ffffffff8146f816172132a12f67c75d1057c6a2028b2c77f28a7e6186fdfae792ea37310100000008536a51ac53515153fffffffffb04fb88ede3a6625dbffa7b0dfb390368c20eefd31a9e9390ed570714b78fd2020000000963ac655263acacac6aae9c35d703b94eb700000000000765525351ac6551dc2fe2020000000003006a6ab2c2320000000000056a52656a52d671614c00", "51635165526a53", 0, 2098914000, 1537743641, "c0fec2a2802214c8025393796f124a43a77e41e0aec5360903d63fbd11d6538f"], + ["030000807082c40303637e6f532d205d8b5917a2cf206ce2450f348f1704a3d3cbc0718a587b859f7d0100000007ac00ac00ac6552ffffffff832911418cd8648da462b85c0852b2d6fd3a6a584948510e03521a049ea6bf050100000000fffffffffa6bf0106e14f43f3f3cdfb3d26299c2886c9c0170b4227fe5b62603e298d5850000000000ffffffff01afb27901000000000100bc1d0e470000000003000000000000000058bddd01000000006ec96e76d25bd75a6791dde729a95a977d1dd76e06caeeb3df2c43994e185b8e7569ad405934adcc47df2b66ffdd93b33b6b77bc2c667ef345c0733a32f421f2a99aceae1f62a9f1653e675147f7ff7a1c1847d48bccbc99d7fc3dd5fb11bfb300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000987a64dd0520975584bf7e496a38586b82bfcdd6db056394564ecf2f9eb07fa4520fb7c2e6febfc13cf3ec086fa27edac8179942feceb2a9f55a28d407ec3e128f550b71a950157f700646615bccbfb49691d355673dd632d0bb0ffc9a54e27deafe6e666e97501c0f138d551180f9dbe1450d4ea9a609841167f9ea48ec873803021a2936c99732ade91a68d7f5b3ce0e83232c82135751ad2325e5a8cc135f85020ededc7219693fb2e35cdc7dd91ebf4b50bb160b0ce4b9bcfe923f0b62a3a9a50b04a451ce7a4f6652002d34e1668f2c545bf8c80f5b166fdcf91f2e8eef4b4d6f5c1035e3edd990aa197117132357bb52fb6edaeb4a13e409913c206da63359db0312c2fe336f4b09bf08cc2cabae98b8ae288aca80b80b1e04859280a00eda5f0e021669085502a19f00b63d2d56d51aca25c5525b1f98379181dcc222121226cc85021fb56e2ccd53c23e78e7bb89c8f7962652f2e1534ba529b1da9e7934efc6c9580213ce8391480373db8aa22ca476bad9c7af290980230423c18e7d1e626666a14c0221b4c3092bdc3aef2a78d622b1ea3d37ebb82281144709f346fde31ed80ce7a6b275a54e6f69efbb3b107895cfc7042880f99e038cdb8ebb014071ee3de29fe1cdb13234680ecf8bf7935af6809cd31d15b9cb3606f1a4804be78cae8035aaebec7fe016b7b3d8ca06cda10ebde0c6d31ba76016c64f5f93e4daa446f3271cc6117cd0178dea0db28d69ea0b4dbda831ab52ce43d11d560dd48c1fba5e49718168bb6489b031cbdcfbe90cf929b4e452eb9e79ad57877246fa8e4bfa8f175840b42e838dda736b9ae67285df7055bd4e425037207e50647ba1513ff7dc9943ea005cff06e52ebd87fb55e3c7c933014330b6e4907abb78b67a5f0715458d980ba4517049688f94b7a20636ff71c7613b9c6ea295c7d441a60127d5bc558402b8112e328edb37ab4f1569f597cade68118a77c978a338f806b82a8a3ab5b124373382cf4bcb5eee11398137a9e88fbce57e47e5da9013177876f2982b66ea80bb6685555bc6a647714b746794b4f4bd38e17595ea770370282ba1323190686519fc37c6c89ebd15f96eb1fcdffc0b3a8103072a7a6fb58ae17b5136fd071cee7dd88c80ac6e2a46c9619610a1a1581a0bac06091aba9a7c6cc0193d3b02d30d2de08fa8cae036381c7679385c795b97cdacc16f3885efe064c2d53ae4d6f71a017f5c8cecad91d6e508f3751f01b686141f12a6ec6ebc774c4b84d49516b18d1c7ab4b9438ec3559be06012b69554aaddbf1b08cfa4f5415722821d0544cc39851296e70032b355e3b30b8dc6ed4ed60771b0896d90eeaf4141ded063a574480b98ad1ede6446c1eb793a308bd0b2ac69405507a00bfe19b619708eb9752a9d63576a40317930d4bc9fc4afeda91cd1a04539712e0641667930ed5a4ffc0f4639f7f6af82b687ba8c7ab1352791af4ed618ce4326b0f77ef73ecc94384a76a79d81ca3bba5001053088fd2a772c2199c2e5b94b8e0b0afdc08426b1585c638744f66a2d04a74a9726bcea1b18501ee29b6fa464b3acf749cdd99eb1d7610b9bcdc04106878734aa2a083022cf14e40897401acf634151e78e7a069fb3a8d8c0edf94c4ad42ba88aa46c1b6cdf41bf94a2b4992999cdf092bd69f1fefd1b7f2277635ba3b2b7627219606a54782b50eeea67ce55afdd7e28d3ea2da6086e68a4a8052c462ca1bfb6b34f74773b79a81e305a820bcea2f06ae8148b8b37d8e1f7f09fb46a324fac15ae0c92b282a2ea1997c96c7a4d7546e8759f99bdd52085a729d5d2b90dd4c5529b14d3826b9656235950b20a5d8aa7bfc9da8a31f383c60eb465391878399c77195b0e0f6071ff48fcb85c3d07caabe6d15138db5c6d55ab213b5973bdb4ae259fffa710ed5dc5c02fe6d07aafaccf62d8dc73264b601ac4f71ca638d77b5ac494542dc3d6f1d3b7354c1609a6e7aad10d3508f50c81dee0ea7cd3c8c94d36d592b839a7e202f1fd6eabf50cf09c868f572f321b2a59eb559d32c053da7fc4137aa4267dbb359e11e4dfa1d8dfab5264e2fcbd0c8f3f31d732e07ac7767454c0f1db38d99b77816949545e95b9bf33ad2eaad24b3e0bd3ebd6fbe099987db34923839fa820c1c9ce24ce988762d86a4467e495ef95905ea6c67f2d671a59060979e0f54c7d3d916fa57ed7816f30d583ec7ae439974c22f318294763a881b391192e78a8cfadb8bb6a428cc403c480103b42c195e2e060a6426f0994b8537631e592f5db9789a12e7843f800000000000000000b2861050000000086d6e08526adad2954e3686b271f5f7927b37fc5c8110204de0cca64a12b9be910f776f460b165490732be0cdaaef819bc1951ca53d71538ac33980fc5ec85eeba541610b8007686c7e73da5af5505a6fee5d995b360724883daca27b412cf3b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004726a2e0bffd5237bfc0b4e433f3ccfd23192415437487def77e3e09d86247b96ed35a11bf582791e6818e95d58d4e4972d30e969e8b86168b765af47ac5117124e05b03e42a142e3a433c156fedb6e6dd96415d222fb8a0f0536bb6e882fa4f2c2447dacef98489552e8c4f351a0fc2750f5d1c6d3b83a8dfc50ed85c6b6a210208a39dc1dae03f97d474a19b6abaccb18991a0f669ccdbf5823073ebae389b95031dd258a01c67d1f10bfda2b38c9c8afc27bd9f3e3eee3b29da48ddcdac1377940b08957e6ac2f12d0bb0efca3224237bedee5379da396a008432f878ae1db85ce70a371a4185450f0f9f975f15485b4be40d6a2cf10cade1ee71559cba7a8169e0020397b01ca1903e92865a8c6a5746323168f682e6e8e1ce0835cddabfd580653f0228e9e9eb3d5a5c98f0f4aaac3bf32901482e77d6c01350024ae8ab3dcf1cc181030c3057832c73927ae8692667592d5ecff883a2217a9e140ad06688578d2cb39b0227d7aac321dc0189d3c1947aaa00989335e14d2ae7b2d9f36c8159e7ae4f2c810317e6b820c93939488e4030ea55b2ea1116f798b096f3efa6d63726d067db95015f11bdeb818bc27d5b88d528c43acc9fedc82fd0a58eced9cd3fafbc040dd4769fcec326dab362812a29eadac1143d08eb589a7ac3b7995448915004f4822e2d9160848d9382ea53469f3be828e04e5194a125e9b884feb84f8c6af1be50d120bbfec07154eb30af88dcb1b2ac5ab48b05127b94634f36bc602e41f6f3a4cd277da77c1195d410911330ed1e58247edf486266e152a552df4bbdf6d85ac0c94ba364992001fcd1e9c9d83272e3af8affb840f8b2d1797d6182c635da49ec88e1ca12001c783f43a86c9ff11a0959c914d21c93d30b986a2747e1c0247679a90caec3325a883db5ee9bc8efc16fab8c93fd706577418d28901790e3429047047aab5eda0b369dccd975812a81f0c4ba263ac8eae194987cca6ba5d81c37503115346f7c52600cc2a39af3b34315c4848082435e6e836ea7a8a9d90df1dcdc4a0c5636f32f17de1dbbd79ac5a9562e4967420d37f9af9ec93c15e54c94ceb391614164dae4e4cf8bf16a81e3e44ba77ee6b031382f88d8d8d292bdb7b3dec987e2c05c838b3ca1e988966f3dd9c929bb6fcf015cdebe038381a5482742eadd6403b8ed6f8c80f7ac52633d69b14bdfc991a05cde7aa608622658cef4eac5556ac2db4923431fcebf297beb6f17cead820d2b55ff1321a5f4e81ef87b806b160a46c288b1ae9aec0e126b9d20c445652342576425fa08b75f9e2638343ceb0ba6c13f31366ce0fb6327822d1397fffd937078df7841e2148c13107480af14f0dd6afc1bd02f9002e82cf52c43e5843a89e401cb06ac1be746631cfaf52d8387ac86bd49c7a4f690cb18e8f5c53cf02c85b19ac00b7a180674d673bc73a6bb9194a919530dbb286b204b5a91a022e9bc6bf4c0ad214ed879fcbcc18d155720ec309b1eb0fc9f6d36f51cff6f4d92d2aafd8b59f3e7f58aa953e43f682571a4999a233f24b34725b74599e6de14f8868795935a7a9a466a27b4cd6458a1907ba8ea8a93ff861290ac83d61c100349848985c1a039587529d2d4c0e2e8878329efc2e17fa2738d18d552004184a45f9c4869fd5ada21fe73092c549f557abb3d74ad175118cffeedffbbaf51f44cc1872eeb62e4f2a34cb6e685e0dd8b9d56e1d92f7c93e32fffc60f64c5e410585660afa04638231c40c9247ea0e84a70d2edae659eee5f0bdfb59d94424860437c0dd2be977d0e8be3d921796e7614d40c8ef96eefc0ba1b85424fbda01964d6b97d9fbb2140854846386f5f363e798e9e2af4b1f3c745509cf87e7a9f92a5a20754bd5c910fe1008ddfbe7e9794e86aa9f2c9f81224f8a961441ac578d42ea7e94ee2cc2131e496feb13895a3cb0f1e76bb1575a7a4e2c490ad7f81388f0066bcc7a6775c00835a5ad98c293b4fbe8a8a47a303738c7aaa2d292477fd35a81f57fad88f03f13d1152b16ac0939d814886ee6a5ed93d930fad4ce09e19dec6d071faece531123d088edb3e1b2be5d110e73fe07196bdc9a234382fced4037a1a835cab506167349295ac82b9ca76ec6c16a42bd5c6410936415bfc0964edd79192dd1c8ed0da8adcca40cdddf50ffcfe249f75af77b1126ba054895d9155740649afc172d1bb53bc2bc2e1f48454ed12b23892230560b450ad7f9a8c5ed355837a6b90f533f7d94b4aac756fd540dd6d7d04f6fa94f1e9ad452872b22a4650a897440bb142c35d0000000000000000820b8c0000000000a7292d83b9b573c6c7b8d28b8d40cb5f3921311f79fea5f7f697e0d443eb15c86cdb87ac50d619b7b6adc7723f28265c8be10e5812f4223ac1315dc58cc4b23cb9f0457dc00dff1410b8f58e90ed046a63d566844c2cb000d657774f55e7a13e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab7dfdef30d9e517b8e436ba732717d7b20fc09d8369d87c125b28b86b5144050b66a650063284d39dd3cb3bc12cdc54fcad2db4cab925fb22f1a06a3ef4603ff4a6af183abe396cb85011014ec8531fa1ea5865d156ed8273cd68720d22c27fe91c22e0b66dab8ad134cdae2fd896f9407275d270eca62b6e7d20642bfc7ef60228f362263bd7bf481a7e995ca29a1eaf6e96fc0210135f9ff7e618452586ce4a020124a870cb2b61113be0a9c22be2d6525b6e15bc37d44da01c9b688fe6c1d4fb0a00b8abf9d9ab53c96582e51169e60fe8f559c7be9a03d54dbf615c5a3b6f665d09cbe3d50b7a25b31ad455b5656dd6805e9f469268a1c0a1fa847e59b3bdc8fc0212a27826009bfff3ec30535a0bca112f1c480d30f8e5742fae3b8b3d780afdda03196542aba6171bc69cb3b0071394c4e27bf28066fd623e851984756ff1f3f80802178cf9bf0b25e1cd2d1e9e3ee16a8e0a61618468d0f0bba806234226f974b2ea02147fecbc077abb297601b77d18c43b41cf891ee26adfc4c77fe57b5e02783b2f030ba5068478e738511b4024422ddb182e6cbde89b6ba607a2c168b23fac11088d1e925cb53cf6089b0c45bce5ca220fc9c3d92cfd306e776f93356e34f485fb05eec2b053ba4a406249f10f1391b0fdc25dd094381502efb24ee042f828c803989074d9b812c3a5e25b981bf67b7e395f3071444855950f83f60ad4d77c500dba61656f7ef4b68f3f65aff77d28330d1ec12c51bb0f8c30ba57cdd51022a6572447c6c9c3308f3745b646baaa04aa30714684a931811de07ef54845a025743659168a0a4aa8e6a90f23bc3e505c4089f88754def3409bcabf9a225741ce17c1fa89707c48d2501973890ea51d67c86f662bfdaf05e0ad0a2572ec797acc843ac5771ca75c100d027e6860bf251afdd0b5e112844c3bdc87095340e395cdcbb0deea0942182c4f16a4f5eaf01eeab14ebc31971baf09af05c79070d64846f0c043198337533f6e76cc923b7ea3ac198bb28c0ce68f895f28110927a2ecb1f0696f7d889fba1fc64be47418a10919405fee41a0e99291e0dc3dd43db62c2536bd45751ce8d8426a40c19c38996afa21fee8c9ea0d56274839a5ebfb96b5e0d999bc97311c01627164f834b6cd2732db33709d11cf0ae6f2bd937cad8b07d2a759058980605d05f90e110668626fbdb4b39b69b90ab6ac25a5b50598d4cee30c12884a847ddddf7f81243254582c70fcf385a92a0c9ecf90b5283e3da43a394dea28f475adc7d075a12d3cae9c8edc6aaa95fb83017c85c03adc536f913ee3d93058740f7b365873eb2884fc5013f335b87bdef17f638242feea02d3c309456edd82c72c0ba14de6601ba53e7603878ae8cbf1c73766eaa1cdbd737cd206aa3ca133651c2c5621dd7e2d36783d230e182a0c9a048bb3fb1d75897803f9e0732d3e9df136f73c1baaf77bf6bc20d779073db53e78838129a623d090fad61b3ecec0380b5be2aa0f914fd1607dca614a1f5f4f48f1cbfdc453c240b347f80c0493ca4ff101faa47bce51c2b17aa7d732455f1218e2aa857662abe2ddd526ea2a1c08fd2c1a30c19287a74d8f5dc771022e1592a79881821f333b6535d8921f83370227a0ce13956d968a48773a650df44800e96b8e93ecf32b736be763fa4f9b2ef3f3b885781ecd31bf7d63556b3bc1df5ea16749dc416ff2f40c1c491fd7146822ef5c34a8da0571f68ea16978a65edfb148741f53d529ab6496e896823041b07472d6153b9f44a01801376461fc397c7e0d50fd9fe5ff59715795b62b1f91758ac49308a8a5839c6bbe55e88bb628eed8f2f9d2f1ecc19c85f9f931407fc65e6aaf2227f47fb91d27878f9c74741f632d4fe9551235069eaad629fc5e94d9d6aa64077308ffc1bd25aefb721a9cc2bfcafd6e57c877ab24b9f71db5b88809ccc7bf66100eadd0b2af27ae15e3ccaf85c7b02426016f3d2b3bb9c785dbe879da497d8be76dbd1b250c1ef791b443e0fb0e4709a75156081ad353ca22cacf0c78dc2aef4e5bb19fbd5e780e72eb34cfbfe44450652a3b0f6c73e79ef65ef4f907dbbbda2924e5bec78e4c68138668bd4d8592061531d0ab5741e46777f640785bc8a6492129521f7d4577e6e1b869e06c2724b091071328e9c67a21e36011375c98b71f56c6dee4ae20802517e5447d8203738c8a99811059eb54cc63f4b4a5c24e9732ca7febf3118d87bcb574647837ac84ba928345b1e5a976eaf560437e21150360036b04aaff07afb4ea32e0782ed91d23b588e022455e0dc5fa7ac281a4c80d5ce0abc1743db607fe397ad3ec0f7a1adc04da73caa1bef84061d5953559c3200396d8651ea06ad80c72ccd4fced63450f97afa70af84787d0e83ba5943dfde67a94fb8ec3358823117dff15a7099cac7205", "51ac63", 1, -1175947998, 1537743641, "f4b638f17fec68dfba12311bffaec25102a8cdb5d4981e78216087d510f30945"], + ["35b8fb5302c82d4a316461bf1772160c4344b3ebf58875d32fa5a66c36cabdcc44a2462d04010000000152489ea9c333f483845721b88ba0ca172cce2ab15067d804df4c02adaa845672da34bcbd650000000009006a6353656a6a6a00ffffffff034eee48040000000000b93a1c0300000000016af02042020000000008ac525252536a656574fc396a00", "006aac", 0, -2007214600, 0, "3b6d9dcc2f197e30ed9509c1df8e39b763e7dc22fb910b348d8acd71734aee0a"], + ["d762e424049ab31a1be0b7f3e27d951629ffd13f5638f28e1d793afec6ef937176601305bb0100000000899fac6b2cdfbaa94a3ab48f2140d6b3287f37902883090154873384a67c5a9fe1bab55c0200000008005352530065ac51ffffffff45b427defe4a6101408591b4ead224f525d6780667aaa1eef48981e7d331c6ab0200000009536500656a00ac6a63ffffffff4bb1ec46554d31b95cf0891b4d9533574a8d3fdc3fa9e8d0a6e526efd76e7aff000000000600535153635271f1512801cb6bb50300000000016a000000000357308f00000000000000000000000000a26516fd4ea4a715b99f64dcac7c6a7d23b86edaa7fdeac4b1fd74650a404305d209f68b489fcd3205c724987b0af80c9dbb70f596aeee4a4e2d93d211aac3e9bc1658d99a03d0c562b2b08e6b2219e26d61678ac30f7df0a754e3bee58c90b100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d9453ed89905d2cc8e5fd6bf954b09067b8e91b1072601972f6f0ccdc5162f7e5976d62b40871fb695319df7fced1f5b019ba5772ef7dc75bcdcdb393df3b6688c5f0f9f4c1ffe634693b1b20f84c41f0c8e5ad587ed002a5ea13c0249fe65d4fdd31d69b192b0e7f5c29f4002002850756d43daa3ed2c6c33fad7d7202ab4c30208f299e8fafac2d73b6bc59387a4477118a71b12ff41712bbb29e9b03364b60a030981d34b1517d389f9026bd5de6475094cf52a1b61f3fa83cb5e10e72b97f9c60a075bce4088efba9e2fd1f4fc6186fcb72f8bf9a10c3e77e8310b8bc4d8f315e902b73f6a0dc0b0d3a29bced0e56009e492868c75037fa4d822e191a4b364f0350314ad21f0bf530771c9a54e3f5092b12728bcf6a6710d76164d075565afae978502095d81dae9adc84d0546572d78c2ea9a5f9748ce2edae6305f25dfe6b7a6174102211b5a09fcb43c5c8afdbe3d2fcda02cbd6363ee3b64843fe4122c1b1c8b7427031b350ee30e722ea5be46b0cfa97f96ad8c41d5a2b257784e92ebf4758ba8f4890304138721dce4594b55c8a6ed5181adff9da0081cf36bca3910c1431411697a4e74208504fe033faf64943a5f89776e94aaaefeb95607712a1e3cf58f863ee23dcc8de0a6695eeaa218abd3a8b1b3d5b9a5c9e9f493afe46e1ed853d38f4b844acf7f1fa155eef0793fcb012b0ff5f9851f5b8cee5bffbdda2fdec37360be3ed575c512405ebc9d993a98e16fc1fd14b203fe323f16d214dc82b0f92f43d394a86159273d1e232ef991bca5260a5b074be8296b0cb15b0b113f7c0302add50a5ca33d0f6610ba6ee5d283151155949962adc580f45e78aecc18fd12764547a37f69eb35d2a8e3eb875a82603dce66cf60e5d15820690c60a4e21b01d228bd2ec7f41c4d6cca018d4b43dc4337b36a443f55fe0354cfc108992b066ce644d0cf73a15e3a1f285806c402e1af7cb8b3d6202a8dbd23439213edcfc98622ebb216dc9901e4fe12801504cef33a2553b9c28b156df05f6cdd7061d9dce02a1d8616f57fd8165161aa582738ccf274dbe71353f73fe23e111bc02a3184d9642aed519ded114a850333b57ec5be42da952dd4cb5298c3f48cd5767962ec70b2226ad30eb4f449ce4fae8b14c1b0407c0a7d416f154748e182972e08f88acd20ef3d6c24c17ddca12cf18e6f83a6635bd825cdd01451827902e87ee5cb37512c3c35c4b1887655bd032ab53421d2dea2662bb45d6b792b7e87ed4df0ab597e9611f46b196261ab7664a8f31e947089969183c6db309c1830cefd7a82d55ab13e052580fe97ba7a3b35321b52036557fc2f76cedd74b7bb4c2e621142b96245b973a958d109fa59806772ce0486118caa99b2657306c8d8c2c64ffdab7e4171cc5093ab1e0427cdf526227f341ae86ee8c83ad189a02aa8b073a4086c9e43937b7e21560eaaa9430e63163a79a15ead4ec980258ea3e90a7f81f9f24cab7fb03c9bbca661cb9e456d91cbfc6290e2b30405dd0ca1f151cc7ab50ffb609cab7b6a497dc90a75f1018a51870b238882581b4d635cb10ba7e2a2a0f659eff65ddc3b4f54d09e56a6ed3509e112750eb0586de8c9efab312536c8877478ae3a51d44cef4940ce1633962e016de4591eaa73f5346b44cb0dc8f72d494b29e8cafd919cc6122b985eaf90c41a8dd3e971200129d6fc56729e466e648bc853b94fad0d3db365dde637f453eb9a91771d5cb132519123389973c9bb79c424f235413f9b7a3a1f63bbccb3d2f1bef65aadafc55e1365e2b6933dce72702cfec1a3be37b962baaa26f1e805bc4833acc0c6d92e3621ffd380de75c99c30a2b14de3620a65f028067d1851e251eaab3c42abf8f7a9bf835d8c5eb02e06fe6c31cd7ca4e2077cef28f8323f202c7289a0997c304a57113ab5e368e39c708db632cf530c15b4bd5b2281999e7dbe4fb499bc07fc162dfde2dfb60586e887ab9d7ce614b663aceef283a1c6367581b9ceff79fb9015f592c018c3ced409abb7b8e39959b2ffb2ddddeac323dbbdf16906a24baae822beb65afbda4de56e50be0eb57c9327851f0a2b12137e4ee42a905af68a3dddde57cdd8e1dad8e976d779929013da8e8ec6e9b7902d5977c5443d9547bb7c64a82e0655752fef044cb5ca45d38b88e59024eff2d6007f01f19f65c8e971a327d4ecf8bb54137faa38db7105ab19249f41e9dc9d2cc828374af0f8b49d552324ba68fabe6703a68f26b31ebc4f0a59eff51e3ce2172b07e17dd77275af3683320fa4b5d8b6299cae873b561800000000000000000000000000bfaec88bc752d766caaf628383c1292237541fdca33152b05b7f6cddebdf8f1c5bcd9b354f424c1d4192347a869c7f1324d25890c9c70ccea177e52056dea3e917e10a3071b78d51251d4b9efc815ce21817e5254ce5d10212d257612e21414000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000763da5b688a512cd70a746aa6119d19971a80005e1bd2784a2ee3134a3e1cae9263ccc0139eede9af8967b7137dac94a7fa59ddeb1e6b0823128108a41e53a326107eb0c54550cf64f5a902cbeed5f17839b31a9a7a31645588c0b91e05c32e863afc36754663d0ae4a44c0b78ec46b28fae405312092a8e10dba6f3859f457d0308e729bc10f360885a41d2d8e6dbe2ff2a88804023749e2d4e8faf8e731846cf021906fd5b9718e772661b82fa867be3db945d83bd852680d781fb67e28033b6560b00685a1fcf76a8d0057609d5867a3aec489349dc0ecfeeae3662a97a594ceb3db0fe6dc90ac20aa3cd77a4d5de6f8c16ce62751b49038063000eda03ead912320324063a37469d2c153c88618ff604e13141f4c42a5be198954459c2bb83d1cd070316c79f2d776164aad2ec2dcd5eb026964d49c92d3c8399e2513d1342d9dcec8e0218c9ab0840ee3289369177f5b2bb10ed7ffaa9dd1b0d946bd0ee89f0cb8f5f5602070dec82f151f881a05fe70ecfb13ac7d0e526cd3f7039b05b8378436b97833a0227dea8fc1c3c27f8e0308e5f230435b5227288c96ccd0e52aff78dda4e0071195622e4552261c30acb28f32aef56a03f01268b1bfba4f0a71c5aa0c8652460344203806f6ac939ebbc3eb6c452f2892d74c2799152de08a5abbe54e420eb6793981401c18f21af1478a093f154f3c68db0b2ee22070cdec9ade2c88be1f701b45fc448e21b981d30c469b34a17def709c09edf20366dcbaa943198ce17b9970dcbcc300ec98f414f7d7675d04a77390c53dcc3a011851f9d4de225984891ab735dfb1c42fc5e2c0c7a21ac239b23f0a424cb0463057e2cd531e6dc6deb01dc4fd8ddbe95ff4532b337b0d2610de3dca77125f33f7cd4ed74a8bcb9e20ffee0476ac295d354bad3ba128446e6204dc0177c650362aea6afeef9e4c68c1fe8b2221d494ed3cf91202260d55a8200eabd0de65b2ca4b1c771d8df14a6d9a0454ed7f273fc77e72c0f825de1166ddee10e06518abdf1b23f2085055902985185ea4b0352efe8ff9e34a475fa53764aa5e22d15c90d997dbafdaa929196b7ac0d4e71c9fec4ea6e013123a7b4c785a4495bb1bb1e9557a55451b722caa7f5dc28afdbb831683bb306c2b4a3fe73bbc56d807cdfb2bcf10c57009f44fe4927fc3e548b9300d378905c5a47e15535e78bb1573aeafc7b21639ee2eb72f3b2005b8140c8b1fd6aafeed12ea37797b46df07a46ddf2b2ce9c2c670def3026f8c4dd0c11f42034ad88ae9e9a7df29039fad7b6d3eefd093db9553586c793defe167e24cec5ec912c963c0f57afa3dbb315471579e76f61d5c65c340b558471624dffd363ca5527ef46f65e8e4c5673694510cb7293479b8d45082db08e8a95c15c3f898e54b3213bb5155dfe38c1fe66d301ac191eae0618c7a8fece11dcd6a6e8680653faf0b8e214feb388fded18dcfbf0d44fb99cb8cc706f19e23697d66d393c00a427340556135f43333e4261988ca582b46178e92ff235d430d46b6754ce3d34ae2de2df1e78417482a843a4ae8a7220a3ad6324b10d3413c7f57bbb40d0f51c0f4eae987c20eeb80ada5f1eb5abedd5af666e3985c017f934100b065bf0bf8ed7845524a33e5118ce04cae2f118cf2e7379fdb94485f2ddebf25c4b665ba61d64b4455184b5fa7e3328d71d2a40dc3d7b87af3e7d9a78c544e95b844b3432ccd1991f9141cddeb87c691af5a36fe03cb102c27d88d37b64a36eb42c51610c94cc70ad8735f47b800f6effa164e9863e5657d6ff6c71341d29ea26c82601496afe1100922dc88c41504970f0ccc36572ae5a5ba8af125faa11059f8c5224d13e7a8e50940dac8e6f9a23cbb6bb4d17518b0d6c547c12f3002665c430d2d9c18ee7534087281c4e5d7f439d94f0c89b088ae77294293b4dcad8a4a99ba14e31f98927da20ac5cdc36734a239a8df4078d6f5f557f57a28a0e71d67f0d8a90ccf51a9de323436766754f9d4dc1ed2af4ab88b1c3ab2c319f63d3c6c50f82809d36211b498f8d0a68dc993ae2b5ad39e65e5b6ca27b8f9adc45f22768eeb92be2ef87617e18a522d66c95a854761231f0e7e43b2486d8842487b0ea0fb5878029ca6645f807ffb7880acdeea518df42e756a6fb19da42d6f8fa45cd64a5827504d5855d8b78515694639caf7e9aecd51b64d4f3ca2a2b0c6beeab1aa2e1f8e5614ab704f34a83d597076506511e7b22ca2658a29e329e048f44809c5be86dbaf20874395295ad971f1508c63baa133bfb40e5125f9a70f65901000000000000000000000000971f83353eb2063adbc2a314d486e5c542d1d3d4034a43a97e764f4cebc42f48af614551d1f0c569c89edf9e9ee901a412544ce9e219a21af0203cb5806097bec5fbc0f8ee0bee9dd0c23911ba1c267a830222a7a38a5068c1ab0826c86a8f9a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e8d6a0714181e257580a60eb6657aaf70cb61b473ee15b170f6c5cf78cf7a24e7c5574a81471dc4561648ba751f44326f3051f58dcc01efb88ee4696267630ff6c871fc0ad7a9532bf7da0eed166cb4ce19a20b20cd0d1aba6fa1c0ce766f08cbffe1cefee4d29a0b1219736626d190376514e9bd292879ce46eda73f4d37fc9030ae9884cc0f826c04f353060be2b84c6d44433a863b9590533462740ec5d9da80201eb5bf9187d6c8c6356a402204a0e85d5823736a4f1b2814af27b47470bda970a068588dec97af56f3e0b415035cc442e6749e97134ca2b01b190c33fe61ad371b16e57e86e5cb85e5b791e4070b285ce18a462b28bcf04d521f37c78c2669267030b73f432c9866ebb4b5696e3e3435d65b82bd24682ce54f2637478f7efddab8a020561a40ff45e7a67c9cf1f1d0ba52220076674e3c7481a470dc54b9645a34e6a0226637fa23147531b786e1e6c856a192d4114bdc386f95cf7e0d66c802755c260021a2cd1f414d3b84b0c98f014e55d83441a1730a324f2bc970c5653b574bfdef5031152484a20817937bca88325c40cf40e69bea37db40f7fe6925a9a7ded883e050672a5cb625a7eb68a637f5b82556fb465e0753db27af03213dd24017533284fca27baa2c2afdad3fe50ebbfd12d74ae8972a9965562e35de407daeaebce8d57fc68b3df412a3ce1d0dcb5225190383ac18ad8b7b7564f1f70157187c299ddb966a383681d651f8cfe15590bece79c3167ca0f794a8459ae3bcdb3e57137f845286d18c40d9eafe10cabf64ce97e7967bb6b0ead37ed3655b9722ce4d91bed9808969375a48924c9c97c8a51ae185cce41087c9374f6396c80de54989c02796be370780b73da0fb1c6a2f59d1a86b8d3544e737ae56493c8602e766a778f490bea014debf2c68a2e7bcbd14e8e3754bbf0dd69d6127a6e9317e38e8bfddd38a43f90bfd8b47971fa2d418e18ac7b041712e018dc82ff9987eaff28fbf97dd337b717bfef9470b73799642d3f02eb2a039008479ff745d5e73145738f940317175ecb88a758204d15ba081b70d02194ab4e56bad9a4f1afc4a8b18da3f9fc7e06b56f0b5afa9bbbfe63d983c3794465eaead38a6adfc50452f991d3f564e42741edff8567acc252dd968bb6fab39678ccd7a1b3904ed2498e3c6868282df2867abbb92c8ce2767768eb0d0580e2a6fdf968d6279a8247d3ddd5783758327c304c82733d3a2eb62ecb4e8bef76477cea430ac5d0e3e58e05eb5172398ab5c31f9ce0cf3ed3cf181d6e69e69ad59ac270f9aaa508efbe53b1ff376186d0e4ba765767105cd758f115d2c85d0bd28bab42ad590777d0c585fe0e300eb8d44d0eca73e8607a46e934e5d56217eceabdad34d3ca6af779ca789a529e51722f79253dd01d26cbc583155b0dfd621423ab805c7e6922fac2fdb281fa8583777c1670d798d54e1720364219e7694bdf21f211e477ac787d6691980bca2b075a4afa4dd6aafb4bfe080c74d6148fca1fb5491674045e8a5180d7cc15f1a47f8df1b61466dbca6a4f02f2aa6cc3e2e28924c7bed03774a465c048c99fbd234d8244a4c419793e7112a09c57eee56c4f8b90505c800ce4a1ab101dfb7f7dfde0fa87ebeb49a1a4f462ece47e75930d2034f5528eaf20074f8c0fe31a5dc39dbf237a0db82fd8067035eab3b97fa24faa7bf4c912f2d2a4f35e947d16566d33982a8e9b5ba60e747a5608e8a74722bce989997c015a858437ba57d828741854b313502581e0e70a835d4f76469239fab204a5501f651b4d7326e588b98561d5e0816d17789588763f80c373afb143eea5033a8081fd0307b0593c47b1f6890917f0ef9057b0468bd231952f9b4cfd029b78122f50983d6eccf183f0f7a2051c7dd91af2c38c4deff17c314f4533b10d68600560fdb0b614feb3511ac43914158a3a4f3549cd8c9aacbf9c3ba9d1ea85d29478a92d427d029484d9a18abccf6fc8822712d0cb8ac7a53ea67016b73b1aa48a4035e53379a2e369ed2e9c15d8226b0d82eb5c5c59f02b4ec7bd94bb2b5ff603b4cbb00962fb1a4402b61e29bda23c876ca80c6f8fca4c496876f6486615114ea5a18b9ac015f16a34579dd3db259b0d91224a114c4e9cf7df17fc7d8e60f832c1f3ef1330f9be504da85e693390ef8a0b81637916cb6548ef9d9269d8f000df5e423c98fc68df75f4cd18df89cc6dada0bbd0af125ef369853f4b686ea2ce354d4a58388d226f3daaf50e87eff679195d0573367cc542eecc9ca7580488838c2039b5f8a10a3f7a21aa1790c307938f25a27c21dd02ffb4ebfba12ac4706801561e02ce6b77fea4b76e029faede99ae14df590b94468df399e7b1a75f397d8bb51fc6043328fb9edcaa0dd13267d54b7617e767a4589d137045a3dc1d78a5335d98db9fb5dd08", "ac65635251ac0052", 3, -145564471, 0, "41855c977078a8e8b5d4a48a88fd7ee2b504135143296cdce2871ff841af4f1a"], + ["030000807082c4030468b9cd6ebbf01f53afdfa7997e907816ebce05cfc60e4cc895b908ee56758024020000000100ffffffff624a69fc7efcae8aeeb4e953499f78e8512f68afe54fc8642c6d94c84a7596a00000000001656cf09eb5ebc3232c0ffd7143a86e6e2b7aa2b4e1dc710f11c39cf721fb0820deb30b9e5702000000076553525352526a4f91052d96cb2c307fe311529abdf7911ed74f9e1fb72f0994481d8f06f5d3847791a16a030000000151679ac5e901de54ff0100000000076a65ac5152000000000000000000000390f6ae050000000000000000000000002d325a4358b07d90bfd8015eb6e05f18a49c43bcc328fedf04987c0511e8680f0acfe4372ab09fffbe9662bb7e0b15514446c9f9b1a7f4ec99d326fc8d8895872e109d761b3d6a6db0291a10d7bbc2622d8c4de3cd1831286ac4e00af6e1492d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e6af5c3fffd7b999fc4ee43d9690254bd794e5db7f78546801265e7ed8cd68ac122af07c5645e9c1781aec15df7369fb651910ff11d87852ae53637cb467a3f670b629cadf1d6e24adb54e39ca67940c47777c8a0dfc5978071aabd572dac40d8a6ab988f70c15cb88584c7714b8f1de3e1bdd8e453948bd85e8201ee4eaaad0316c9b1b4f77a1c7806f3882eecc986a26a7e55c81b977f7b24fbdb918efb2deb031bb57c4d9ec88c978f42a62165ae50f8f3849e3db8a4412586adf5f9370dc1f70a0247c6b9e660531e80907023993902cd236524ea9bcb3ed150c720a56f6735908be34cede3a464620310aaa33614ae67861d7acc4f9f5e402d4df5bf5f7d2d5403198cccfc7e950199d80219e3844bb76ded1ff953fa0bacab2e4a1c3b1f9a0944032a958bb1ab244a7e9e77d44f92a02c23b3ed96d735eed623225408776181a3240324dad3983255b480320d5fffb0825241bb3232aa53c8e36059b979ad93ab437802246c939f249b357e0f02483d3b0f5fc1f1b64d6382fc57bd8a9adc91e3200cdf0328eb940fc321d93c4d9c6b61569abee97dac8001812d61962526f84ef2e9c760e7f3b36e1e101e99fb1495dd03bffe4f6c9c0ac386eaadd6c6d9073e3f70d4d35501e0d665a0e19d1ada0d95a5267170bb8c90dc01ebbd1afe93ccc94f0e614019a1ff9a4880de6a4d1ba63cb98aef2dd43091f7e743748f02d9f18427fb2198e291d9a517ea321a5d2ee1a05db554fcbf2da9e8b65a40ebdc2935ed04a69dc08e35b760808adce3ccd7dbc25dae3e0ff3892f2631a843c73353a1eb8090014445bcb49fc0da795d632b4ba426d4d61c74a15ca975098fe57e4a7afd32ef90749fa26a94ac8a5e431a140013f49cf90862446fc2887f9d15310c5b5835378427bf084bf22d93031599e4dd0fe9ab4bd9f2496b367ab6df8910e0b4901e0cb79ae8bf0de78dc3595fb5597d70b77e627336ced428b18a92a31c5474c09624edbfb9bb0e63b8601fde2f1bf9dca33cf8511279fffb0c42500dcdb3975537d479fd6947ed8587e9d7beaaeede1d3fae1b4853bef512f8e47004f76b0c3797bd03382abac875bfaa18fd550b7d311a80d1614fa3f396cddd6c127b2608c8ec3c6f3cf28ba3fdb78bbb7f05c5bfc07f26858e3f455e2558b33ea8f8c22b307a71141bf873bcfae0d4306cd3aa7b8b1870d36752ef3177d9d9a6e7ca0bdca188aad55578b7fcd15469a8520876e457afd7db2f1d3c2e4a0faad9b2ffd72be3c8bf713380c17f7c6099ae62e5dd4ac55ac61e7197323189eb55da7c08e5b7abfabd89b47d9bd70af560ca1be197cd10ee5d8d278a833f1c02df483742b4ec7fb7b54cd07f119e39d3699d004ee215ebf3b8395cc707de0eca9293d225807e8923668347b5431f409847b1ddeddfec796c320aec69666d10001062bf823ddb322f6bb767668b0b85d4117c74c6b8172761d78b0cca09b8938bca81b81d97b3c801635c821cc0474adc0d2b0bc64aae3cd211a9f52ad373fd4d0bf046910350ce1985485dc739253ae618f6c761b57c38e8f7ee9cdb4509a5958777d28b3f08bd8036205a42f3cdf800a8e44a9380306faf7b8a89217709f7b970fa71bd583a8c17b1ab6ab39a673baabbb964dd75bd1f0c889b8576a49e6723eaf25b9257b9ee5b28ca98053702d68199f3b83a7239db3e8a823ba2e4bbcbf801090d7dc4312bebb9a01a451085d902bf394eab8759ee2d1595d4baebfe4258b6b9d5a89323b6655d2d653e19fdd0094dc2ef89d2ceec105dc333e26f5e17fc18ade34d6e6386ed926c2f326efcfe26ee9643cec3ecacbe70c31e8c2c58825ce516cd7075ae307eb35a9ab0587195817b7a83e4980c20a5d39fed945b6ba3e791e197016b905ad797a4baaa9895f041649fe2162c141fa20435908e4355ae4d424bfba4cfcaeb802c4d4668ca7a134bd3f45d0ece1acaf06d6754afb40f7de71938bcd3fc308b04c32bc48ca7bdf243a16ca00b97d233389890b666f1c418a001fc7061a22b9771b56463aacb1ce3d486cce0ac72eac56b129bd62efdf14c9695330c5844e89b6e72ef6b7a179c7d09ed403d2156b03486e9b1e62c5d4befbf8b7b2d8a8a8dcf07035e861c34498cf35dfed601b1abb724d066648e20181599de27932a542ef2d03af34d9eeba0424f44ad1929fbdd13a410f6a42915fe821dcb3fcbbafd40e33f9ca714d0f0d6055bdda0072d228883d385d3d3bc02b012a08f7c42208a34c35c4038a6e7f2308d8b9153b57b8c160346d1b1cbd5870000000000000000d910a401000000008fd3f9730ec2f3694a65450af5e3370824daa039280602ae6aabb356d474446132308a671e1b5f09e735b8c6a526dbc8ac7c25db35dec980c727f40476bfdceebeea09b9f0bdc4d1b1c432df97d79719f74e49ee61199c5cda29e23b24fd605400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e6b7677dd168414ce4d67d13bfedb8f680cc471388476541a8a0df090076c25d105d06d9a9c234b32ed91c9f4ea462ce8d1c757d6fcf112af9d74fff5000ad0af8b8371779fc8ec1a96050383901c53c4e403f9da50788e7ab9eb08062d9e52baa4defd604d1a8eee4e9ec8bc5e5258e28360bf411aad9911ff978854e95356c022fb0901ca13c2701e620114b18cf2d7f4248e4915f8ee85dee9af270031b8bd202183eea8428646ad4de901cc719323d486eba6062fa336c68be968987b1b41b8c0b03ebd44adac87732be4c4d6b434eba04199620aba66c15be559452a2741ef7a1ad504eeced063f7d04f6b75c05ca2e2f645e66a50fb8e3b2ac6695842f4beb280217b66fb7507f00df7ab162ba69d9c13f1d2c327ed4ce1a1537beba898741fdaf02110ae4165037fc12697b21b70bf8207b143a783978d818e29b3626ae43629fa50218138a9bf2c797c853056f8253c5fb641c6460e768f9b3193f9ed5f1800ac0ba020c275b8d9fe9f327941e4d28b2601fc6666e7eaf2d6c8b7f7981d4580cd48700032c47040e75e22fa389aea44c0697faba238a5acafc4a1d24c09cdbd13c1c141c31a3741f752a489b1328ed1da5926965ed9497c3d105c859d22a8f62ef53e045635b3c91a4660429a05c2319d11577a242bbee7794428e39e3deb527ab3587089965fd3dba4fff22320f2c928fc60d24c0d74485c99065e98ef71d99ee22500363819c8fa084cbbeaeac73f8138297de14dab4b776d35b5c6f8969301960401aedb98239084a7e31291f682a51d54c2fb22a3aeff45377d4e7add5b1b11da75a63e0a87f16b39dbd5cb9151e732d8c9b901026b9bfb4d59e7e91bd4c96492772433383f202f66fdf46496014329dab7020eba7760c235224040cab1d764fd49b8fb3bbf7c3f1211b82f1b7690cc66e06a522abd6bf24a29d511c18b32020dcd388285417791bfd5310c9a0dce257b5539b8f681f7fac4b906f3c2bb79108258417af6cb8b9531f251dfca374ecc71e601891d04b918e9f129a0f6edeb68826c21658cd4066cfb3abd9289dbc6f78311e7a08052223883b2837b652ee44083018edc642c23cbff776c1e47be0636193c0ecad33d91d8307fbac1b413963be613f88e065706222c888df9edf498f45600a15140577ef903c6ad55135aedfa96c40a8ff4fa9f4be66c8e24f72928af9b69637775a1233770ec75aa1ac1c9e45d288f2e3896eb023d6b4fa81c062e52d6a7402594d393bbfc2bd895e208fa9026c6c18e42852a55242c81b9208c7bfc021620fc902ee8c8d7ad7878859dee38191a43c071f796c942df78869e0140df8d82fd28dc421625bc499859f719304e248010cfb191747d15cf3a11ed21fca61fde51f9ca8c2c5f925b2d4e77783831dc6294eb61f80fd012935035670eedd07b76a8aca4783c5863d99e76fc9da971336d7233bcdeb04853348ec363b36b7cf9ea2e5bf2a380a244063728617644e3d358f24bff7588d2ca38acca0e7cf2ed9b8be96d9fba4888fe6956657b4eaac07d7699744bdb5b0ceefc9dc4416580bdae5ddb216d362aed24389875abc408f338212ede05c88d9480473290ee4b1e1200a0507e6a8bed5340b7da2e867c3e05f58361b1b325fde0af0fd655d159a6a74aa64c8d572b2a642fcd99821738832e82ad2470c00ae44b8559a8698d4e95524071c4c6467956423c4b415f5c05fb28da3256347da2d901d88cc770b07b1a823092fa9e8a905cdb16ab34aa4e9a18b490aecbccfc5dc5b335ae0a2c62b2f2d2cca3f4209b91dc9e1dae9362e941ae2dda8ff5c13ed919a316adb1694e07dc4d493d89c30b2f26f91a1c8bb6f09826d994057a8b9c21a8b57408a524ad0ff12ce45f169724b978f305a42e811ba218afdef2fe4cb157fadd66e03746f36cee718b6a9a5604828684eb158c678e1e549f9b7a4633fcff4c87a8c721e25783136dfae57e023be7e703b2d743e0bf01f02b19fc6ff540b03c733d0f9761684707e23d732529b517e2365db676d4c4d30b67e08b1cd1853818d7e006fa967702a2a83067483c6d70064efbc9d8a8c69874581da1c80dedda7a840704a8f1a575b84d4e12759247bfce4565e4517496b317e712cb6b1a4ea7720d1dd4c91e087a6b8a21c99d38c9a9d8c64407ae92790edd3294f0a63432a193f5e7f07b6d1007eca304b2255fda1746f4790105bdf9227e3a58635186fa2466979a5bfa2982df200f06b2a27341a419f549bd217ffbd17a1abf50914adeb8bd5b0c8642333379fe08a0ca663d8000000000000000074603f0100000000ef612a01f8cc98fe1b311f286571508a536f338bd962cdfc9aa5c180f6bd1932338d870a6710740d7d17d0d588041a5b30daa5e9fab610f9a40be2909fbf24c739f37f1b1fefa729c115d55d2aeb07170d482d9be7b48bc2185364a58f69334300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b00393042c5043b6aa0d23ca1e61d3a7ea5659602a6802b5d41b6670e07cabafe73c5c2bfa5fef3c3c2c8fd5ff2ce4928b817e718dd67e65d16004e2c8f9d9e65e15103c9174d34e483c6ea208378fabb116402a797423d12b9efc4f2847aa729f7cff77636b2f6737d433a1c82c081339a8c12875d6cdbd82ee71b2a7b2848c030a153ae4ba131cc7c22b97d18b2a705e30941ed1c96a1604239b7fab7ae49b25030cfceee681b355551af5ac829dac0befd79bf68307c04da030afe764d966245f0b05f2527014124cd41946d15c7205041a890a1db94b328731269259cdea7a9950880b617afba4edc1346351d8fbc4090ef45bad3c99966d2393d9dc64b46cd4e1022cfeb4e956548a4228d578376b72939a0b373a270ff04ee069993a8965d1e4d9032a288dee47862cff0477452f3a4930c4534bf1327882dac884b04a04c3ad459703119fb25aa691af03823abcf1cafbd20d7ea6c5b89b2f4eac0e3f6805a13dbc420325d59a73a2d79161f632d5257120014410638ec63c9707d5d1490094452426a903191570f53ce4181a06554262bc3decf91de956d426af282238d0f53a2c7f9b705d03f453953ec70740dd2d86c513b710417732ecd82974201872d0309a93f9e5ffc1c93fbf5cd0f2c50db8c508dec05f1bcf137d8d3d6bc48d0c556720f8bba8d35ced299314e1eeeaf3f362f58fa74188f9a94b6235a2735992352cbbdc72635ccffaae12c9a1dfe678d32b274aa5953db3e37be2330f58657d23cd371a520c5f0864903de2fa428d55e1ec1d48209a0a1220d16ff32a0ee08c8256429caf3ec6ee2c4436052ff0b91ccaee90f2ba57f263e9faddfe7a44936faf6aaed2a4c39c7c1a949d67fda95ccba7b704d26f7fc6f8056ee9af3e2b1b6365e5fd007659f55065c479b58316e406223416ce06239c4d780ae0f961b49d823c44cbacfdc5a22d599005362b1b02fbe05816d5a0545cf9602142b5aa5fd09bb3d1c493b80f14b21eafa29d2cc659f026cdcd367683c6f589979db804d486259f39e624f6a611ddb956680fe62c10df520122870c82b1355a562be880f9933bf87a480d93dd892a5713d0632c1769dd207187da16e9b1e5b2d2892f3441e05e22f71dc121e61683cb6b5314da92c648165ee84705872895d566983166ccd81f7a47f09cab76aa91042c09b0459991fedce73d72af976bed25eeab372298e457c0b4ebc9fceae6351e7ee69b0b9c2184eaf8e8fbe0b386e532a6b99970f98ac0f817a508bc0efc79e9bcdffb2929dff50ff5d18bd1b66f491080e36ec3497bd02c3baaef91259036005dc0b136834def3f13c0687db4bcf5a4d01c35213e41ac72ad7e73f8785228f9e82248b39cec4be795aa70cc77510876cbdec59ff34016110a9f8bfc4449b41a57eec4ae7a72ce58f8232307e4d9aff516e7f97f9386734ee39652dda6c67f218e8ba8b0e2a7417d25b4f4f28202b4536c054ef590324300d9f69de5187f88670894007faf19ab3f80068632dc0b133e8fbba615e4c639979237b90631285d2627228b4202cab114e7085be0541518b1612aa174456cbcf7d219dd3652f4e786e3219a709ff8730d58da69f66eb13ec20845a122cc38bf015656159eab308d9b16269919c64266369a16231a0db8caf54378548e46d918d42b95c76bd7029d6cbf35ea01ec91b96cebe96caee52435c65004851865dd9bae8258333b251575c54302d61b285443ddbd8d16f1b3fb41912828bee3ae2a28a1db1bc6b19f7c38a51f11c02327c4fa8b96e3a8af9889b0e43447ea792900139237805e47ee3499d9594c6ad21d72f43ce1dcf83127fc621f4a2f830affd61d439d22546c02b8234e4d88dc82c7bbe51774717188773241bacf68807f315c7525c77443dbf7a35afa699f0568605457f5e91f9fe46bdf6973114e3e89640f2c4a2ae95a77b990371553ae33ac8850e203662cf9fad0ed7ecf53c5c743eb3dbd6db781a607b99fee827b4ec9a08761993110291e6a36a271f93c2994169dacb851c6172f86004c185980a89c4397eae89c8ee4646b83ac91916bfce6097a3e3702e1683e5ceee0db2b8b3a292a4a5090dcdcff356f26fbd58b16fd426feffc6beb5ea2670d43527c70a7dd62cb42aa0ab015e9175275a962582541c46c91ce85f323927d76042ca4fb774f9b6398449e6d0af6b7a97a0e0f688a18791eefa0f5a42453907e097d272856c2ab920feddf321f6c4bcb43548f0f1569437d0c62a9d570ea30c8a7476cc8b16e402a6917b376570387a333d56c52592f6c79dcfefdc089b891aa9b67bbfe3e4d7531d812c429436cd1ce3d563ea5adcbfc7a47a8dd4e7c98818ff6c12315974026955b33eb0b06c72cf3492b07d473057b9298441684318549d6d4bcce8fea6698c2997689e1ca2c33889a8206", "", 1, -1168474435, 0, "5cc47a664764bf31707ebf6c54557649c811cbad79adf0871283024f65534963"], + ["eb5e2c5f028043ece08a5b66cca326e3d61195fbd255b5b4797ceee7c18eb4fd384d2d34550000000001ac07716e1a15eddbdfe0a47fc7bd715733bad390a93906452d522916346bcdd0e6708caa5d0000000006635251525163ffffffff027f2dd80500000000006fac9103000000000665656353536adaa0077100", "6a6352", 1, -1784199066, 0, "d487bb4a762c1f6821dd5cc9d84901a74b5a58bde34abdd5fcc673150981132a"], + ["2803445d0324164b46619b80be3da7a0f952347ee79171cd29c2499e8e30288351a204914501000000025165ffffffff43e3b69474900c3587b54e91c64acef16dcc21195cabbab82e4b636341fd1968020000000163478d26a4de09a32709d109ef87d6e14c9bc2df4ecad878c20891d5f06030a9fa5300a3c60000000008516a006a63635251ffffffff03fba3d30500000000056a530065ac151903040000000000433147020000000001000000000000", "6a53ac6a525200", 1, -1801080151, 1537743641, "59f967a043faaeff85b780a3d8dd855f540d906c12d63cdf10ac65db4a296da5"], + ["030000807082c40304fc42aa2fbce5758458d91880e586c98bdf502fe3abad51ce96ef90b6a1b951e6020000000500005300ac0b6ac5ffa8d837761a9a65b429242d9443df3bc3f5b9486c6de7362e0be247eb06e1c3e40300000006006565655365407e37468f3f95cf79cf580892904402057c399edac8e929c01518c2c5cd18b4713d164d0200000001ac1e0009b9e72103bc8f403422e82eb16e0024fbb9a732062c443ea1a31f323ab0bdee328c02000000086a516a51526a5100ffffffff02745ebb0400000000026a652662380000000000035252009163bd18000000000307800a0300000000000000000000000058be4cb7af61014af6452c3c44dbd65a4f3c1f4d6053dc6c6fae3ac4232a00e3ade392e91ebd33e2acd9255a6fc7fbc956fd07edbe51b31dad601f84a6e8cd04381c66f092b83d8f8b976af1de8c98d49631e1ffab3af0f3e20c3a715bdb1752000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005255ab0f38cb212a340d1bd822ec2d1ad55f2bf3691eba85799ad4560900cd3c363066ec288fe5e3a5b7d581c6fca77edb8a3f1ee4ef94fec2ce185479190fc5e54f469265e4479f4ef092f5ee02e0d239616da1b82ff24d7996740e23bf6fe23d9391fadf4a6b0c44b038dbd516ccc4d890729e2ff32abf9c33dfa6dfc53371031806f3f7b2b1891c394445f35af43d85812fc5b162b21c1eb31effa5f0ed990a0220059634dbf64094e9bc8ba0951a501bfddfd97b3ea9572d3fe9fbf9f959db300b0777b1867487b8f40cf08d32c81333862e0f591061ab5609acf58717b01d1cdd439f57cebc2a2e4e91c54f51f6c00deffe5d5e55ec54841060b874ec1c96d240031fb9f4f576755dc968129332edcdd78ab20d97283481457931c38ed46894f9100222241417876de61427ed0474efc15a08e2a7b52e0261b2f981122f2762e0909d032779e003a0442186428bdfea430ec1774b917dd5daf830af168731485ee6d7d902197e1c728bf017af9d9644d76c66e7556b76ab00d5ecdacbb4ba4dc2b9dfcdd20202c324e6c73ca1e83fe7e64ff3d45b0cbc77f5d3aedaddcc552a5d368775d39b6b48fbc865849115943b0d5ba1e51970c90c10716fc92f87e45bc31f4908ecb49869cb5717e405e49d3245c2626db7162abc5d0cd69270302851b33e8dd282fba01caf9623840fc4075fef1e271e610ddb23ce646ae9b2e6a5eedae7c4ba5e5deb009d9adc43663058a4bfd2a9a9a00bd59e497d14124cc9a94e2e170913229b1a8bc96e0649631b18c9c2fa100cb0a5ecdd12f1f2cd3e054adb89f0baffe289ba08d843a63a77dfbe816212441d93a90612d5beb06abb0ec466bfc1d4ac595e640e6482f2ccb9e28e4f4aa68086bee23028847288aaafd2e652e7931e6fe6f22271be5843532b310f74d88ab5964f9b01a5508b2858e1e36fe490ede13aace83d8f41ae072c938131d9ad35d7c3d7d762267a2f63e3f4fe0afaad85c4bf1abb759fab06d6f824ccc232bf19e238dbbb47415dbf8e98ddbf51f084afe843f6481edfb371cdc09617d2de9573f980ee1743f57e01d96d8571706175061615bdbffa87d54840ac3bfd06def438deb7ee1868a324dacf0993da1e80909e8a234e8bfddbe9dd7139ce2e5d4367e2fbc149fed340a6f5bf6561c54a03ec449f397dc4f48796903e440dd1fa3e9fc096a2f699aa0b9d7d3b681094cbef935ec5f9489b3fd13539be385c837cb0c0924af4c0044afc9864e5fb24dca3a2ec124ae229329b9bf506b1e7a58847c3d26880d410d01896946ed0fc461825c63b0e0a916c15b238e311eb38cf59aecc4fa38608aa4952766d0ae07af8fd897c631a7f5e56044e030b87a32beb1320ece47a89d1ddd560a4fcaa273a58639935ff1a1e791f46f7cef67d651feac42858692aa814484abb1aa9d6005d867a7ff70deb7036a8388fbab4edcc114c0d4bf864dec4efa1b2cb46906fe13aa1b7d0c44afd5dc5cd818eca3ae61d1f0e3e7211c03db9ddbc5ce3311cf3459554b040503d7a8b61d27dadef52bf871a1921c44b193a688f54b78c2bb24229395318df9af3585a45a9d3dfc2416e81323b2909b69c5920a66eb56c4a27c3c65b0c82c1112f0464c8b51442c8c206efa49a2f2faf492327c0058ecaf1112c1861280e43c624afc93ac869a2560432c6d8075657b13d599a181d18c34a3f175b0c95546730c29281788ec2bd5b7883c6abb03a4010fb3bdd3dd28167765dd49d6f7da641c6978cee056712c19d25af186aab2f38363ab8e859e45934fa21fb76014b619361dc2bf5092162693efcca3448158e108e8167bd418418fb5d578cc79e615f536ced3f54cddb36c2b6e75833565cbb80b93d9135e239697ca8cfb42b1a08eac79711dd138c28ba2f0202567cee1652b4c1914257522e785aec1d02bef121e0389955eca8a81c7da50aea797dfb8b7aa43fc2ea74c761aa65cca4aa5c99d11e625663de2973ed5f2271be66ffc24d9bb05c28e84988c968d61c0648580a844f93c6938f9f7f7130f04b562c5b960a89f96bb47fcc279bcd5f89d96c49ac33d6bce42ffe155dd691b0c4a7f34c47e8ebe278cc72b5c3ae0856966d37403f02fd2490eb9a7ff39b85bebc4b889005634e0257d10eab7a3c748fc5e7e245f9d2003c30ff0263e2b4ec2640f4dfeb0896d467ccdffbd1addaf9c116a5310409cc1c5abdb4bb18a61473c26251833c0cb2e1753b4adf380da4eed6c7b2d855a00b8d6d616db8d461089c7fc5455f6069b626c5705189aa777c93646912b20800000000000000000000000000ce0066f15c71c67c3c4c77ab1d4069a0ff06364fac006bf601474b4cb8898e36b1c7dab2217d166a99548de18327e456afec970e72e283d2d19bf1d5132a8e889e5c0806f1f141a07da505943a25a680502939dbddaa34f9f6503da8f2cfce6e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000037db8791fac4b4c43a197ccc34b48d3d4b3c02f8144cf47fd16501a15067ab30bf397c31ec396f0c79b96e58480fec01395100ec207a9a6329f2f4ef3e13adb49f5361020c27ad0edb0bbdcf8e12c27a3fadaaabf1a09f3828b311004f5de57a6e49a8281dccab411414ed2dd28f70dcdf76c8998c401f8dd3ba2905cfdc87bb02300cd2c0386d90c9bdc65740abebf5ed1ee1ec1311dfb5a0708fb194626b36bb022ba6d7cee8242723397a57fc516c941ea2339bbe32e895363f406bdc756844d00b005a251f26b872b97d6619659824d911b7ae90f909c7f7d6ed84a7d2d425ffbe37f81383a1c966b576d0a9246cc84335d6d1e264d27c6bcc38557fa1565ca540031133ae711780f07ad14b70f817dbba43758a31bd30f8223250c3253dde690974021082668d488ef0183eb191d92af3c6e503ed5b16f304ca5b7ced06172ec55edc032949c26215095e56905e3c2282450c1a3fc363df851dc3d931016b1b01bf90aa0217ff4d91bfb50c20d75e770f10bafe619cdb4bb7d51b2f74702aceec18bdd0ef0303c474786aeca5855a0922efdbe80bd829952d2d9bf33e6a74be9f1d0ee8ad401b33a7b6df70b5ba67d0f52b17a5ee69ea27b516d79e7fabc1ea3b3fe2d8a26b52c726e7346b722a430ba8036353c81978eb606838e049ae8307b548a1138447d0e984f48f4e367f18ec250f1751970403fca2bb986b1b23fe1d2df9e5232576f834e38ba1feca9e26de369f37a17737e926b50168c4c56a17b3df7d72533734251f4d0c3885409466f15ce8e3e23e4d0e06ac082905225da482622ba5a42aa9867bc49f8bd922c23df2979fd908d35ba6aa0dc638f295035c76e27983d5a23486823bacc497252900e1399e0a11b6da90925d2938854c264f8c862f6a9cdfa1f7470ddd14a72be6288af9d03a77bdeb7e5cde3f36b206fe139edae8781de63f5da1d107c1bbd3fff4680f95cf317c9748746caac4c69432b4d931524f11188ae982d80bf8d995944f0d126d6ae68119541d0678e4976d5f15da984eaa15e625f80cd5c166c7c1d91ffdcc17b18974f3e242665726554c9ae2925e0de85b62f870a60d5aac85ffe1d5a513cf0a7fa2930caa30de0db3f22f7e5744b769bcdbf32ae48423b53c79f2c7f1e15c58f64e7e0cd159493f725f28ebf17d438c23c661c4068ef4bbe7fd66c5e09275a0d2a8725e81ebb2a54f322ba28e76f6fbc5173d6112252e63d90c7f66978c67e886b609edd0eab5e882e4a78837ec329838bd2c2bb296c44aef39939db27cc5232b031bc8d0f42ba8d895dc4706854f97c451e61e987f550eaa9f755d9020cf7732089b6e9a020b143d020788f21eaf1f4103847a320ac5eda39128f5a3ee02a9f60f8188135d26aad8b8da092c8812c1e2e942672f278404bf5d7a5a8c65104a17262602a277193e0a69f4abe792af74c4130459eb6263b715c7665c041c68b66370344371d1034843cc41bce5cb51a9751d16e50ee16de1a321a0d5c59860618b66b02cb1394ee75988126a61942c6fdf90193c1de617af1f2c61c8ef65a4f17a74c13753a5c1965227f6049444aa07c48f7769cdead8ac3e81ba12934cfdf6eab40835f367a519cafc1ef17090916306d6c762203863434523dc56d100c1880716facd237b8a56ceab31c4a26b257499373ddd2a70e3cc38ef83e402a746e5959ba8588ca2e8c93375067540cbef0df52866c71b4e97d2bc74ee7a4a4cd19c4d82d7a83b1004206a897891f5bf0e02d27b7265870ed472a21e93e1ad1407f026532a76429d02a23bab569e67f3a469539532b52ee73ac91ded3e2ce53cac27a3071fb7c70993258a8ecb9c1c425c2dd5b78c3f30f939bdfce5bdac2f72076cf4fafcba4e0af2b3b5c6e502175474e61eda85a136bcdd56e81c0708dbd7b291e41b272934d5260b66b46f943eeb2ba8a053aa2ed3adcab51a1c5bda60a95dec9ef875eb305d43f9ab77e3b8aae6b118590a4541767778d35f8990123e20c4909649389d83d3d2aaae78f4c8db04afc60b7d6a0f6e05b30cb3b90025fba89eaf5bf1ea6b5b45c638117183c7efb258b1b686359bf6430373b0771c9b343e991659a60c57f0bc654ac988af990fb4298a6ae717d80d4af22a5b3616771c08f77524d1c38b3f03d5b63fe1b5967dc02152a371aa16149aa8dd5509e3a0286d2afb163cef36edc397d12d328c3d045342b39d873c640b8878bd7eaf37c550622f8d798e8dc119032930850453248d9a291e1b14266be23fb46319395e41190aa5f9203c58c0b10000000000000000a1a18105000000001d0f3bd24db990ac8247ec1df25cb8913d933ac8538d07e4c0288b62f7f536441b80ba0eee05329736e0667a843949561dff08127db4d2d7ee0149660c6cd725da083ed20a6248410205e6ba2bcc18549e369af193a88e9f44b84bdfcbb6af5100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000237cba9148dd146ebd1c6c3aa915489e88a6cb8fa07ed723453a950bf395c91aa79fb179cb1dd70f28d1d516ad18134c93c4d9f3dadfd0952122101ee946b8808d71eebe2681d7d2c74479207bbfcd735f4450664c14280ec99abaa3819735130a86dd5abd6ad1461123575e167bc75133ded67c028396233f2e3aba778faac50323ccf897bb2dd2d573973628091718586809b52eb9906ea18002e17576b0de9b031a330efdc94abbad9e661ebc038be85802bed1a24b6d40fdf96a1a4804124b990b01461228c00ab1a1e966175039b181040386b0377daf12d917c349e1f3e717e26946ff8c94f6e24b8fbf4ca733034b04384bd782135f325288208dc0fb995bc00313ed6f08e9f851ef3188619f68c423fa07d42f0778d6ca53bcf8cf69b0339ed0030227214cf6ab1dcb70550fa0aa8c31e6fb76e7c803684ac14890346aaacf2b71022166de91330fd25375ffcb6863a4de5782f99f529d52fea87f7314f9b90e44100220f39cf072d8f3ddfe722946665153091d8ec52c5fccefbd1ae3d3e3e09f557d030b5188e1cf01779041e0b97aca6d3af487d6aa331d9965d30aacc4527fbaff16ec88486914e8cf35a6ec04ab20875983986129b6b0ffe3fad990cbb09503d6f113b1b37dbc43ae26d4f4f5067b539018769c1fd0f63adc678c5fd87622a82a8b00dcc9597c510c1e2fac28ce076519e3d2c02c257b09f8408e0088808db8db912a5427614a2b8e001c3e63309042440be99fc21a2c07dbf81c06231a16133f7d183f097227513735b582f45e6153bb44f331eb74aee00bde47bc1dfa3d64aa2dc4bb11d3c0ef9e3f6bb91fa0e0cf8eb6ca9eed7365af5d04de269cc8c2539d95de3a61360d3f55a9367b86b44e2f73c5f12f140961df3db16547a16271a118e5238662b978a5f8889e41b46078395c85655a4bc62a524323faf5e4364f113d45daed7466e22dd6f0191afb34b9271ad93c9af7b95a8f778d2ffe5bc5867676892e573dcfc48a15b2769cfc2e63b2007800aa9efb6f27177ddb081e970ee55a4dff17b4beb202dab975efbb8c7d275de156b966d2cb2ee0dbb09924e395ecbd9d08bbf2a457a12fdf1df12224974f93621cc8edc1eb0fc3a0faa8c2ba781136d14be3a6f40c5641dec85eedaddfd0d4d9eda6ea88270792b7771d933f16d65231d936c75151a03981a8582e13191c7bbd1e91dbe42c2b38a7a4b8126a90247b7970715d585497037ba92b7f44cb76003d38c1d9daaf6478ad6452f1f76c837d7e411e5b5bb9af83822fc97e2afd0615b136165ac09feb350303ac0df8f67d3cf1e8ae764c5cc2ea03f8a76e3cc3a468653ffde232ee16f4f97628c2dc58f77754bfdcfdcd3bed9d1224b04904b1af251b495905a7dfc9a7cd2b18f322e03c527333ac954b8b22f62138584b786954c1ae16dd4c98a40c607ae9503e68215a2fa58ea856716d7596538ea57b2ffc918bc25b3e322efb629bb04f692cf62b4663e81c628457b6264acbe157dc68560c34cdf544d8816ed2f7c2e2703c6ffbb48e14ec11908bba6e8481dbd24aff201aff55ac18171a1b770de7f8ac3cb7a8b91885eedef459c2a8e6bc34e696451cb708c1e34a1f4c4df2250168e9d767f62319c9dfd261530b80d8f581ae15cb4785a8f791c6553be3a3b3bbf1964ac2cc9fc4df108365431af1733d6d02bebff93fe5bcb24c387b0861a22dfd79db27b6f1547501c196074167ffc3341078a215f729930cbd8e88f2924a81197a433b1511543a67fc6aca001455ab868b340a2d1f40d3f8e3bf657db8b8a93dbba237c6979cc90f839fa4f79651d037ef462623e3d49da971ad15c93d96f885223a751edd716f34d365bfa1cf07c23c9562bdb0c4c1d4f93fc63fceb317301d3d881c3d5e80b543dff34536685a42accafafe9fccd6829a01ea7b3a58ac818cf0c5ca5a4afd6225f700c53c3681a1e8e9288e7494fe27a514604dfb4705be53273bf6d8f40bbc17981909ca3e2ed778ace7b130977f6039414de9dd60cafe2fb7478ffabd88c4af8d05062d769ea239a866f9a98647878b7e3b62ab2a3498508aa184d13a4c4c187b516f5f4d0b6b384ba321adb707b18af46be8c996a15c5804c8d33d9d9c3bfedc047b68ffea51568b1348555ca1ba29f136b1dde07b7342b82327d71bf5eef5868828879f05b87840684dbdb216384409876c4ad3562080ae61dcd60af827d93f98c1755749a914fa5f02a35140753a38a21c1ec295a8f20ab0648e94705cd838e8c22c8dd9e19d78a679d6875c2518a3523bbf9e3d823c951c046d8127c22cb7af5dbb3dfd2aaf51ec4be31de2446f8c0710996d7a10bba5d5353cdeb409b6f387ece08d9fbb1ef6975c5b369ed06a129824d72f6f3640f823d373e7f871b68fea54fea1e8b3f6aef4a6e5d1126bdd0c", "52ac53ac6a63656a", 3, 157206664, 1537743641, "606b5f893561832cc423fd8332b12cf24cc77b575906cb01475b4145764a4373"], + ["d35a5e1204bec527fc90e955d68374b678084b235169f59641a88689d29a7b2c4ea45fe3380000000004656a0053ffffffff8f11cb62947a9f062f24348781ba94cf5f3ad2c15798877af49556e055880930030000000553536a65acffffffffb08fd6be067c97a89ca4ffcfc7506f1c6e51acd45cfd601f52e75fd240b5462c020000000251517a592b3f922853cdcda0b161088664c5958ba94b617746abf4c1769538c5c96d6b2dae90010000000863520063ac006300ffffffff03a230100000000000055153536a537aeec80100000000046353536a11cf7f010000000000d5e937220193289c0200000000000000000000000053ef4771d31e0e03d78760d74a9c0fcc53170e66c1a22dad512cb7b06d7414384ac80a0bc71132eb7fd9834b494064aa20e9eb6de004cbef5eb1048a8f48cac0ed40ad7952d6e59738e02b81a7dd5ccb3605a087a8063294aa6e5562a6b902780000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000047551ceb1f5224e8579fde24b001129db6a724cdbc31f0db2e1365865ee0963f8809a52d586a231d08fa625ab82b46b47419eed7a90a54669b3b6cf8d69565060aa38da96a99375bdf9f2f89e4101cc6146274fe6e4d91c4688957effad3be4adbb8ad024584e0f8836ad62048fdef6d0323f11726035b94eab5d38bc82e775b032fb7f044841f7b53c324e8fd5cb41db583a2f09a021b66fc3d5feac09f75f97f030943dfba1148518394e0f4e8307fb18fc5f769fbe3dc7b0625e91800d018fa750a0455bf7c5b65f142a6cc7f160290322b8e9b10f6b0da16462d202e2a97c8e42d2aa54afc8666a36af93d5bfc4945bce322a6aa93207303b40d025a0988d7e97302137d0e1097239ca4eb1eba98145575795eb22c1858f86c61f246a70aa185a77a022b6a8e53861e1c9c4894a39741e453981169fe646e40fafb3abf12dcba3111b80306ac0471960996c98a47b42a99b068872a8a12aa6cf5fb298bf2f3e144841173020849f0c56e789f5139716d9c8ef5d006ebd2b391215bb86ccbc2e7fa71423c510201d912cdf04601caa5f51a4edceac2a5e97edec8d60acdc4b5d696130549a6d82322e156f77719803b291b8b765cfd784f2322090de0e0bce96d8f48d6d92acce3cfe57348e27a489200a7358c0306856c37eaa90edd6a000e1d3bcfe678407ab564e6b1479f56a9dd7195b5e7173af6c9617e084936e713d8351cd3d33ecc57b44c83cddab12d1d6f73bbdb04e8603bc840440d44596762cf65f5dab54dc86420cce17fecee29e6fbaa7d0de2c24e5f4b331a2b9bdc7b2649e6a8363646e316e905bffbd955b03ce995a3ca2708c63eca63e152797645bc9633981c704a9a0cfd591cf52587d6834cf9088553b7418d6eaa9c7c94ad15256c2477ed47c4bd4418574aeee63c2c8e289dc3cb1167ead38e7fafb6f75649139b38ee1ebfd975f4d6536c054c6558c9fa76e3e578ec18930f25829edb26b783b671f7107e7bcf646c2e2905f84cce1e0b1c32f475cb1ded09e61db0d0cb415b2939ad2fc2ddee0b5d12a3bee4184881067689baa2af8e7cb87b860df529e2fc0fac931a0ef8f3d400169d0c78bd03a957b118f9c7cb651090d0a044019414f98d9f6c8f4b3f979e5e20255d22f7f1fe28a54e3d169385fd5f138db2d2bd64c91e666844e8c6ff62d4ae1b10eaf4d8bf2afbe05a34c414cc951e31db9ab441ddb58b8664841629e343b9561bfe5c8b7bb472ba2a638942b45241eeee35adcfb8f5d1023b2be354f299eafb2ec9e37507410da6f4a853dcdac38d6d3fc7f35e0dfffdefd3f12e35ebfc6dbcbe6d2c374c8c2ce439d6e090d2164fd837cab5dbe08934d4a50ca09ab763aeab1d119d04f3e67511c813b7db63a2ad85faa91e4fede3f2fed50cd853ddcd2e8d3608fe9f5001ec011bf5f4c33d127a2e70af02c68d067baaf5ea50e377224ea11a38e200bf25ce0e2f2d0c89b6262d212b604044e8de25b5c5aa2660f0db291eaf9864181848bc85f8b6e7196b3f3693e510c2c5dda7aa90b87002a485b2d595bfa1459b5e1eed51d666c12212691ecc0ee9c688b12fb7e3b5f8884cd45705a7892a9d322bdea1145a955d854973a835c873dcb0a479c0e0cf918c23ff148702b66e9e9be7eb24c7b1ff38ad4c8568362b5d34421b1901388514e4cdc15b36548aac02d8fd4a3e5a3a0debd383e0d8404e1eeab68316213d460759bffffe7c5b2f07888bd001cf62bd9a273a6b5b9962eece15a8ecf40396f4eab914440d2a87d245afe990c50e139245cda2dbfe8f5d212ce3123a17562c4ec397200bf7442048f8f28c23fc3397ae6e31b28486984c5d5134c7b45d6190b3598268e97011ca81d0077ebe66bb0dde0e68401d1f7a7f91ecd973663f519a2e00394a4c0131cb54196b9dbd62c6d5bd6390eb5b9553321c7a33806a8e2f330e2509f8abcd1796b03a06671efef33f9230c4504161a10ee178d906511f1016c8884d205262f8595504a8131c1195074c6bd41cb2744a28ab04f8e9e4b5227b9b9b3a49f1bd936b6e6d257e620390d601d25228e712898f97be4e458cfdf21d6607e89482298fc1d537373628c12c0367d0f2b94f92da26728cc3e75ae66467f3e602d642487df631ff752c69910fd94c6e4cded80f76aa42244077e5cbf597ecf13128baaa20672b59e403e1c6895b908ca8adcc855f58eb99d70f76fb47e1cb49bbb7babcf0225e4426f15b1188100d6fdc138442cbc321d7914d2b4123f19eecb3ccadc631fce92837594815c7b7eb8b0cb732b7027961b2be00fad8c877eb97110bc989261822039b6c8cf17c80f0f36a3dc87ca507ab54904645595e299410667ff07a900a1e31404ad299d082f3d77446a17cb5b3ba66f124a79dd1f10d85d99789f022c4cffccd62978e49964b84932115e605", "656351", 3, -1256698903, 1537743641, "45217b0135742f9f6c4b323f28d80deba0bf1a95c4bfcdb490e20cd711f1ded4"], + ["ec5f6c6802fe1791d75b90ec4206f672343602c06a22f06ec9a704cf8a50efd436dafb404001000000066351ac65ac63fffffffff0f00647eebe0e44f7da5843f9e55287c769951fc40e149589d5445e207c51b501000000055253535200c321d0ca0312d122050000000009535200636a636353acb167e202000000000151d8a328050000000003516a51b7835258030000000000000000ee407b0500000000713142187dce2157e7698d51d92118c42ae0facc6d604973042028c5815e4beb17df9b550ffd520713e9866a1267c23b63735ff9081c1e015f840bdf352a05f079049e684562e6df94d3e53950b4c76e4fdaa45bed76bfc933f06de3f249b4e100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f6e440baaffa8584763646f083d5dbda236a069cbd7a0119998acd79a5724d76732988d22126ae51c1b8ed41ded9e0bb7fbe614e6dc3b9a54321450eff959bd4ae3aea5647f8ef01ebaac56af1084ec0955738d5c053886c198f6aa472fd86fef7ff518fdc98a2e94f18e51f66ccea5dd6d8c82fbce278020af97e33699c0278030853d88c745f0a40832bf444958b5479a5f0835af5e02c3c92c9fe65cd1651b50203986aa8f4be2f81830a832666df3874e9809898492a6f11911edf87e8a48f1f0a033d8917f87e8936efc0d6bc019a0768acd1334e6ac6c153b5254762aa784db7a25d98181bbe06fe682f0b0324956fcf075ad90b7c95c1ca15872b554efcec8f0200f88d980f539d5a0e505502d123d8be14ca8addc3d2ca444b1b7f2cd37388c0022deb9103e45aeeab54cf21139743f51ebe39c5c8b908039bbb318d6aa4ad51e9020d3076c5d4080b4469e855cc91d012532d40aa226bf9d045b5261cd5be793b0f020767855d07b55f6fcb0ae4d159a05dbfd36f492bac8725e26743f4606bbbdbac032d7d24ff166ceb29000838222714070d7f2b51d40a25d34d93c54ebcbebecaf95b9a1298314add1bc8b869fa61bfddf7b544cdaf1d269815a588efd002f5c6a8d8c6962dee192569664bff97c435968d1691d1d130e1a29df8f4f509b0d4b725cd4d91c7c479a0fce925e4726215bd029eee7a1040a97ff79b53001dde23aaa5f220aa36a0710582d552be924f8338970302864e3ed17635fc9a990e47ef18eca08302846ef66e887c3333a604cb2a8cb5f4d4cdb2ca7767c694ea5595e2db963eb04e04abdcc535441c7db0265da456b3a07eb80719f06e51c2c82b71012dcd75a51560e31d5d80c7683834b8b55c63b869ca2dc4b822773f7cae43b86bc366ab8b4d6efefcffb2aea75dd864777f54d4def50d1564e9160fef23bd876aaf32adcbd6b62c60fb77f53fb8767d69bb2b685bac06b04b08ee084166fc669aee375db2686df7ee5994b018372b49667cb3149b5872309fc6acba5905994f8a4974708917a09fbe33ead9258b71dd230a1104af87576d945df65c74a5138a42ce31959a68baecb9a2479a3404e5edd8b2d3d7735fe3a3e46b910df8eb522b45185b200fc85e20fbf1eca75e7a85941fedbb1ba5c0e89c7d93ee527b37eb1781ebdaf8bccc0908ece832d798b1d8512978d0b9a4181e82f69ad300929c34467735fa69aca8433ff7c4f2d504a899b468f845e8aa81f23d56fc7f5328fb70de959e8d9fb3d446617ecf09b22566e9b476ca20fe0212f77d2b097d2d354e5e8fa06f227ae6c5019b18f9558aa1bf3ad8b425a5e1fee9915e62bfb8004bde84043559befa1e7b98f14341a621d7784828c7c2e66a09d25f2f4a40b43933dc5e81bc0010c21496e931793fa48a70e05bbc2e716c8ca38e22594d03f0ce717519064ab9fe84ee9c6b554a50286957a2a422afc43257f0ad2094420aa6969cf2aae2202f5b5b0a68c58889e5c9fae97308013b65170ecfdfb334f9fa5183f219a4c35b2ceca167a05d716f20ddd18aee09d27c9448e66e569b59578e804d05ee974378fe37d6ad3e2f4e87157229b957a66669efc30a3216d6fa9d004b1d66189c52b03b782874bec613fda9f87d8fe90525ed289e95d5b27ba83df5eb7aebc4a5c5434ffedf75e43433e44183d08ccf7ef81b893c68ccd37c1fd0429f18dbf4b04be4abe5c7528363e0f0b3976ae678451f2c8fafc16d672517024ca870f2eca157960cc48b286eba7ad1b01828fb521dc220bfedc518efbe5e944995cbfdf36dfa4dfe00286c0f29d8814ce1b8926edf3338a179b0152f05464b7198616dd1fb4714280d96bfd50bc03cb5988a69610129a5e578239674edd43090c22c47350dc1481bc2af91e27e6b02f972156de3dfec4e05efb51d94516f69d15d00b5a07d5a3638e66d9adf0a890467b1eda5bbd3ce28ea6d01744954485d4fe6c3dfe160ac70cccc3e2a2aba4299aa87784016f368abc6bc65697d3074392a5a0d2b04c12926bc09b2bba4d8cbbb971ea2bf4ad0e2bb1037c67558cef0f139cfc70893d06b2d23da7695ca38c676a90c2a5976f195b4f5da79f741533cfbe2b47396cbbc57006b1f368190f4e04acf12ef8c0806137b04c3e1cab6f75a005dd9636a0354a12b321e1d5ed8dc5817df4df906888db1f4838c160d3b9fee7f22b8e20ae9bb73ae3fb9d73420bbede4f1ddf1c382fe86ee744ebd1971286c90c095dc5c92fe89d61b1320571d9d23d8b869249a644739e378dee6e0000000000000000099b4b900000000006d89dd91e39b957d806a9625f629c317b4c4c3b454046849f0bc59191b6ec35681088173e4937a3069a0848040eee12794321ec0ddc2d2aeaba7febe49a01c6ed09eb4aa861a7a305a0db2353e67617e8377a920f29987b422373b48afecafbf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000095873ca6ef98177f56801b8781531f77d557b2d59a2a07bf1eb0faeae49857eae450d9ecdbfa88a0dcfc616d0ff2d65830751326329dfc804af4d054e30e08381509c5381ca5e153e8de64c86590a6bc51fc5816c5a31615bc83c887b05de98d8fef1f46ba181d88b13edcab862ea8f5ec7dc5e175f91f6950a8c29e532ff896021bb3090fe1cd485add130548714d69ae9deae6bc4a65c298a5f3933821c0d4dc0220a4010d13aa1cbfe9d4065d08a1f0e63902e273156a4d45ef062963a5e47c430b03c48a92c4262658cec90a3da55ac8ce0da7828f73bfce95f813f2fec1d89a2c64f6e578d3619235dc0e6861153ac68257ae7b04ccfbfb4a34e50d4defa81ff6031e630a890d8646ba4c30841230a5e73bfa1236be6cb75afe260b9177079175080224b40102db53252b0d0ac69ec3f66b41470dbae884f43e73eef6a086429ef20d031e2b93fa1e78b085f8c78a105eb4e84fb2e4a5dca99039a32f4aefed29a2ad2f031c84986aec307e40b56aef054ef2b76f4976d675e0d4685ea64bf60b50bbb197031c1ed91ee43ded4e2523fe2c78d19d67c8a774453265ff2f99d32e2b379f189a057de0dbdaac4b867bae0890e0b3b698a3b545705f39257ae6e559d6471bd19ab4fe3541fa7808e9fd47b00ac5b282337fd4e0301bdbba7fe054a2389c0c747f9c16518a403caee8d54084a201be9765a62f4c7fb588f69652778840e7da35dabb0fe4cdd8ae4deea639aa430814738306f9201669255b17b1fff3508255636f134846fb96aa5940f114a4fc02a601dc878a843ebd712da95d0022d0a167c31c6c7a6e23db900fe091a2fded76399794c2fe6eee453a66cb0d5737cbf580c9d973be603d18307020f7340a010fcc6a605122a4ecbbfa425980412a266e5a65e07c7723e154dd059975fcb1fab5bf9a2fcde872158d8985bb5b378819ec24623cbcdd81d710ad3a3def6c4043d96927c3951fd3611cf7bc60ca0881dc3a58614375c9d593a4246daf1448336b2b0c194b6468805f3054c7faeffc902d2d9b472d23c2eca1bbe78b963a7c47b8bba61dfa3054c1d1120424a6c5dbaa6bfeb18a04e51ee5828915495e46f0503e1ae06356d26dc528e2651309ea662708558b6b38cdb2802ce63961d83a5a9e49ea9bef33abf4e8c7567157cc1de6868724736eb76167a405c92c9a4b685a80da4a25d4bb153e967ef50b533ea25fdcea9f9afb3cda7f84afdc26c58390eaa881b0c711e011871d3908a83d0766950da7790a7cf7b4242b3ec75c3d2230c604dd83495527e7fffb35cd9abe5e75d1c3c5300fa932ce028c5dec4c394ce40a7577840631aa442786a017ebdb904f911cb2e4a3c41b069ca0eb210dbc3141f77c129d383bf2813bca6117e7e40eddde490eb51aad1e086bf9d879d1a211fa6907ff214ed695da70090233441bada824f2b84c3977cd8e3ea5d17eec26fdc895dab295d5aa360432123a7f6fae21d3b1f9acc30fe594cbb8c1210acc4946beef6654febc92d458a46aca3b91133fe981ef48a9a5e97065ca65cd586a4320920fbac791723099a3b14eef50e0674b0f6aa518a758a124316050d72a25faa483d9154e954559968ef08120c14e5a55443bc89e0b13bac31f741361420ac6bcf4068b11b48aea41a56acb5a7f73e083b80be3bde1c2edb0818eadb53f720827fbcdcd3ec04174996ee3e32182bad777871028f5bfbadc5dd4878554ddf2a6a04a3e0cba88f92c29c6c4547de104af3145f7705bc98d91b76d359fa15fc48a2de6d655780bc3a2043af015fc012187f1cbc04060cea857ef9c03dda48c162c9ee09d8bbeae62479c60f9114afd13a93e231da35eb95de87ee50151ab5e1cff261f908c2749cce5ae776e2d7f16d6680026f31522430c59af6f00d8c3b1618d70b5d89136437aa5eccdcdba3c050ecb12567dc1a16b0e6dd028a40ace949caab5a1b0ef9bbb62f753cf762448e6b29310c20f378c7a80ea363ae937dcbc0f8f7b9928dbceb0b1367ada6e908a589ffda72b14085ca05625c35108c2688f6f3d336a06a4e3006e5ad1c84fe976497c33e999925fe2d84f863cd72ae4f3817b4f0145ac9f0844deb97930f37b05b0d3c3654a32d392367e0a4a7a8eb227ba99d56e34929a912c247d8ecf8b546172568e0d2d5cfca698beadd22be11c3ff050832361cacdde4162e6ff21988d74028cc8a476202f8445b0db1c136fbd0215dbe02892ec3068d7b6cdf604dc410d997c1862e18eb9fe54c658d11833d1c9601c056df9bbc16206dc22aa35d70000000000000000070f1203000000004c2eaab46c6fbe58386b053dd7da5085634722deae9cea9c62567ae3a6c6a3b5fb63ccad84343852b927665d36425c31d6f940d3d49e17d487417059104891b6d11fea7e2094fb1cd34b31e6981633ffbc2f83fdc051e173d1a5c32343bacaed00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000745f6cd162c5a69ae133afc6fa3cf7bd94dd7d47fdd0068df985448cf534e03ad7927456a331676bda40ee7d22e48aa1ca166392001d302ab80a0c1128943c7001cc99f3509d35a923019cece51ea4fb5ea1615b8e2779ca16fe16c31c82015cb596654e1bcc765950969ea75151fe19cd96b15136878e4de60474c507c830410211cdc869c4d1ec2d634436e81b86c28257ce67d174745b6c9d8df032e24b2cb90300643b8bfbd06dc75d199e988cbde99080d31d6911ed322bfa6d48be2db7bad90a010c57272e45e674fdc478e60a2315051a5480333ceee4fcad72ebb772959701567ffbf07f7fc4cdf2e6d62cf396a893bebaa01c8724e21b403c4c7b3d08d0430223163222e11c85cf9ee1b6cd2a44890df6f4cb0e86227409439faeeaef50fa76022b9afc8044a8bee51a51a45d14a2640f871a448773545f11fc4f52e1ac6f49da020e09ff5461136ad6db7ffe5ffe3eb19f90385afea821d974cc09d0e390a38a870326500f308d9db96046055fc2b731ec46b85ab2cb979b50fca5f3c57bcb206e01022897474d67856e18c599e5d9156b6cdf807a4ce5d0828e4a037efc9f19afc48dcd46ed56bc9d9d65f534d92f98951659088ff0f74ff260b481d523f961f68f18715809e7d99b26e24ad91d3497c64bd217b5f8515b074525c8148018ac21c1038182228d3ef3e1f4dd85103576a4d2ec6713ca2762c872f57da3f804b6b310c7dbd19bfc3723c14c47b1e2047a18287568ac857d86aeab683336976489032ac5ba5b46704d5fedf7c4501e9203a750cdcb4d905b8ef76e16b80ed31edcd7c88fc4b0ef1514a7e5db8fc9c9e15c58cc25d691622402d99c2f081e8bcc3674f3a6b28e3731f366a81f4106016abb8c2aca72775bd368b254dec33f0801211143ab2dd65c196fadc9bcead26a03fe2d072edd19de44c5686c83d33a892d7a46e0d8c5a2fb62190db7aa06cf7bdcd4c0a08aa31faddd0ad0bef676a4b7d40eba7b2b226442477efb418e0daac42525526ceae9656c5cf4a880190dc2f8131012fc8c5c52c55a8d8029207e697db924c34cceeffc020c05e77b20539bf00dd9a1670f5e4a6b81644feb34bfefdfec1e7419e8fc2c6850cfb3403b122b826dd689b099682e359f3ba429484eecf238d3f709b46b013faf43e0d38510ad70d56cac793aeabb188d7121a554da26dc2b69329824e6277e67191cccaece8a242f505325da8434730a292877b4157ce94602281b8c0233ad86c3ee6ea7969b5b618d42fde2c63e72d4b8fd8e12dab4b696312174ccae3cecbe494944ab3bf921ff2acd86a5c91effdcd0abb58014e0a6cc75003771736c0ea329a404f2fea61f01ae28e292d6ae0516b4aaac2d909cadf82f8d0c5bf83a5ef46c1b81a86b9fd109130720a8d3c3170d2ae62e181191acd8dca8e8cffb5248b3ecff3cdc40ab4bed3d7869616462090667653a93ef581fb28a8d3e95343e7d61f9c316e563918f33eb09b19ee2ff2002efd5088d9b1589bc4026d94eb017f1afe11f9ba7dd85c6cb36941f00aa035ac1f6bf9ffa7c1523bc9f8519b4984d76dfb82ab1fdeb019068fd19932a06ca0a673c5dcd5d02d34514d07a2690bbb1c80f3a93a457c51be5f81db221595f4a597fc208ab497b27a721248ecd9ae82918e5a8d1e367fd8a08a044fb8722c1a76b70d230199dffcacc2b736ef803da3849d33f3c15793a68f0c8ec5fb11d70bf2e95d24997e18798785d4e4f2abc78fc5fb82d00207ea26bd561341ea8fc0e77c8f5d32f6a02d857a521d0b492e720fbd3c595284659e1ae029bb1c364dd8d4cccd9d88e3b9f16623a216bb34c12c5f58da05d20ba008e314062e1b850e99fc6b2fff56f36c40ca1e450dc1b7ff2937257851f2339eb056bfd0b9644be73c08c16e7ad81f1429bedd1458c93b6c3c31d34998f93d69f6bf80b6642078fd91564c4dba8da5f57466a5f09e7af2339fa7c3fe92c8580d206dcdd8ac51d91c0376ed6baf2d9fdbcfe410bc92a4acf69fbcd5a60483aeb120cbd3ce2d9a71db722dcf58686611bf39b14a0e18ec506a514abf07d78730ed9d18aca12e64df5d07c768feafe6729f4ef591e733738d562bf8eea264348477ffc75465175d8abd39032be61a45b94a3bedcb34520983f4a5a04ea356d58d656c72d625319f8bd64cd567dad9a865134ea4af380decadcad3c60d7e833a3d5c262570348edcc6add6012e65af00c281848f1af324f699851bf05440e1604c6edda52cbaf91eea93564d84135925b8764e35886abdd2662befe32cd7955b22cd05d6092bc0d450c10e3e3366320c10daf9b1c9e11522fa81117a8ccddaab0ba1c0d88d0dac3542df2060b142666ae741c0a565d3e4f86590344eb7f0c197bba48fad25a8fbd1ed63cc2a77760f1b0641120212caccb9605f38803", "005352ac", 0, -223476671, 1537743641, "408c00e5ead89c9d9aa98d1e6ec6584ccdf8717670adaaa96e979db62abb26fd"], + ["594f4b3001da72c6ac307feef443140d238ad5f883c774b7758cde4b7068825803cc73622a02000000026551ffffffff04de6b060400000000085265516a63636553b023610000000000096a5163635300acac6a9e310e05000000000465536352d15e7d0200000000026aac0000000000", "51636a53ac", 0, 840857718, 0, "ebb27ba0ca0a4e3815ba9657d1145d28c5ed21f7df430677548229693fffcb26"], + ["9e080608035010858b9ffc1680a88564028e020d034735dfcada93e5f91ad64d14b47bd07301000000030000acc52de7e2ad6a776b02ee98479dfa8e497ee4c83e686a011e86ce47b868c48d0bdd73f6c002000000010072afadde78774b51b703191f81da5e9270cc8972142901b6511bd2b664586db7d12e7cc10000000006acac53656300ffffffff04ce6e8504000000000600655153535346b1310400000000025365ab39da000000000009525153006565635352aff0c403000000000363515300000000030000000000000000feafa904000000005ba4d2ec1bf345719872eeef1a7e8341c4fb9bec46b5811d5058f9905f52e25b7d23a49e0e1430284f4e6f985ce0e90aa53130b3f45b9ffe25977a5a12a52ce3e5bf9bb06a7d53b7c5f35f390eb391da54779381a5f12fac06ff1c9ad7e7629600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c9b92e65baa4dd8454935a81fadf0d74a2f5154bdab752a76ae0d8989f995d96ce8c9fd8f23f4783504383bc24f8eb4134d5f720b610fc4341ae0a4a40022f76e101eb66860398cf822c7084e9cf1829d3fa1a9190025d5f09aefff7596dae82f4080807884dc4829feee3454a431f166c03afc46c31926e61f28bf7690b1db103071e51c6cf460cf5f3cfb689a27d590419b487222c0a732397764ef54c7af00a0228647238aa59d88a877cce80bdeff35e3141a7f42510b37fb3521ccd5bd7c7c80b03f5b5c64824ad882901b818e8faa614b18d39c3c32422776b7acc57351ffaa77279a207a45433bf644d5b4997c34191acbe7cb200f4ff9d4e4f802038bca0b3031ff5addc95a3c44f704435dba98968294e71a08547ed5cbf37032ead78a4c7fd031c568b414e6200ad7eeb6ea41c60bef43f56884f3dce67547908eaa9f922d811032924ada237810eba098ea6c7d0ecd2e75e245506cb930a22b0a2a3682e856d8d022375c6af0911ac3d36f1b67c05815d2b1d231fd5b9a7bb0680c6eca197d0cf7a03134a59ecfb22426bd336bd7d6f216faca54153c5745ce04d3b770c356ea3fa2d71534e42b25190ee0a2931eb12d383e87e9f9e37fe0e1c5007c11217bdfe932a37cf13a04035c29f5dcbd6b7e512b3aebe268444cafd241e4e5ea74b1edb4e7fbcc30e9ec7e17d51085977ed4fc047e293c01a8b0f7babf0ad6746f5739431adcade7445cdafa40fbb85dabf87330eb714b222b091b6584d7c5b8a331216d914dba71542186cebf65dafd649ccdc41833b9116e1cda78d2e1dc1c31c751ff03ee60163260a829599177a0c25594035444ca873a76b469ea58f175adcb16248239798277fcd926e7f2dcb689e6c3a36cac0accc5ab0b07a8abb90122a7df46f1db7b4c1e836e24a0afb7ac1f9abf4fb326785979993a5180ad6335b4a15640fcf16a5ea476af1546a78e6119acf89da88835974a029df50587c7c141bfa64b523e4a64b335188849acb40c82e98a0cd8fdbdf1e5c5434ea61d56704ba1bb8eb59c008e8549bd52d1246a8757e10cf1204daa22e6504746db095a45d80b6213f70c5e4caac29e040a1d4d18973aa0f432b76c9de33f67c4058c600b9a536af5ff7d5f7334ac93627e143d913f28bcfab1088ab743450de2ac9d2e4cf9787cc7c9c08cbcd735d4a99418e63d7ccbca9adbdc6e3108e473d12cb683be29b07df565fc029f8829e5eeb175710428622a42cd2b62541329f254a142f3000da7a9e06f9ad5f46a767560eed361ec4f69d88ec37c0a08914ef31bc7a938a7e0bec2223c67c6a6cdb23c0f2ff95303631e279a0f34abcd26e946e9c4dec8e8ae1c88890e5c04a54983bb3cfc8e7e8c996a73e8817013cb4e39fab83a728046ad2113ed66220d0e53b4bf21b4bf38a17e9a09df15282a3388b1a7aee4d79c1b4d7942ace13c8754d44e5044fec945c5eb63cdd557eb678c90135be6545f6f9f177f875c950b42eae32ab4545f10009416640b807473ab98207f1c143251193c5256f452f5f7f6c7426ad6e2b21a45eb36499e934c9d30726deaa87c88c0c76899094c0e5f4fb489e6e7fb52f4a46f9dea87553beef1b204c730b15b409d7e6d294ac7fec08f25cc1af1b3624f0250f938a9661a07be4bb67a3f778200d038828722c740185f9625ec12ef19cb3329cee5c2f3fb0f53cca2f465177c3dc61da2fd612b96a2da34dd6527ffee397caa161eab4a76b0e484ca39b453416b4b48cd2c91d5b5cb8434b020bd407195464e4b13ede312f606e0b9e84d8df97fb5928f5483f968cda61bc07512b3dbc1955e4d9e11e8329920147ffb5fc0915ad2b2cd0f15cccb82181d8dc312d8960c994084035072679c83ecd15dd06721baa755652db565b041a4bd125f17ea7f54dc58d4ff8db48a00a986fb98c2774d97003f523d630611cabd531de3d3c33ecee186a3ce2d6736ebb2c2e5efe71e9a10b39f1c9b11089288ec692c3b9f3b54817a7512d4405c42de69de9beee2fdf37c9dbd4202e4e25731be47337ed07d6fe11ee8b8c3a953c6f1c0b676d676d9a153d312513ad39e189cdd2555eedc683149ca48fd44b54546047c4c56b3a3591b89d12e14aaa3e5bfffd7c292bd7b62bd1f77a4f0b3b647766a271680b614637500a43ae4f0e2704205aadf30e7e733ce96a3fd21c5ccdbc79c4b08322d1b0784668441990a6b6b92e599f6305bec94b2205ea4ceaa4b018be6622dd347de009363bfcf24ca4ab5bfddc4ab005ffc95f0f961bb35f46684b992e6b3e145818020000000000000000000000000b4126a3efe821510201fcaf6ccda60d95c2892744dafeaa89bb3f0d5d7ac074f8814c5249b196a7fbaabfc50386691b52a8875a429b4bebc36b7e8eb9b8d19afdf37e486cd6ff196a92a992a3dceefa01e211f046b64c9f3778702b1c501fed000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005f3cfb72872acfe17de569883a9c7c7e8841fb010cd900c4623429111151b3d520a9737c859e7295f09908e03ce0df0bbed057dca0b536b3ebaa09be0dd89f72edfb90ee041502c880ab74c2584b04c37db3f631d945fee7b7fc863973251d5f97f0f019333e5d4d454992020b70a511d4b11374a3300c4e2999d6487940cdcc0321ef3bfb56e5829aac4f5e4f2e601fed7b3112feaa3aa6bb1ed6548df1ceb6e4021045ae914dbde2d8f28849e067d0810f5cb9fb9d594fe1dd9414888549b452170b0269facb088a0a5915f3f64807a68bef8b061c06720a5133e4a59177234336c654bc9db79428d5feb45e1acacf77cfaa98ed238df67443243d4064af09f9880702302ba9e9af82213e3a9c64afe47cb18e3985dd747f86944a32c909edfbf23a82032c135b800c13751a34b5af5b7e75333f9f27e4f5200bf31d8bfe64872c3fd57f0305a471e649da8e92fd8715f7b5bea72e7871e7868a68d02f78a7b9b082c246b3020ade1544a6a634472aa5d009d6497ba99464994511e02359cb4230bfe1fb10bc03082b2ad4758993c2502ade355d43b332f5034bada4d8efe8fa02e24f9065b288554c6ee66c76bcda25b70f4a58874a12a6239b0e8996aa376240291749bbb9039888e8ba48b1b0c07b505e4c96d42ef555ab916455886e5894b1c96ade025505e574cf8d254b874cc9eb982c57f41a5ae7b0c26861b4ef8416fbe013aa7ed5e3891ef7e90174de0f94b04b18b0e2807b018af0d9b16ffc0d0a65d747315b6c5d75777d015e519fea942875578c1838486653a77e9a1fcf5a8ad81a0a00f35ba0f6fac3a9262148bc0c2c7b359cefdcb6c7175971105a61a66301a724fdadba6580fa7d56b132439c0fdbaeb0f721e31da86e376b0d43368479d3529db159b65e8cccf5b7dc0d5e24c0c597e1e584311086b60a981ed8d31eb3c324a1083875cf7e3cd2140fd2632445b0ad0985671c5424043a17dfb51a52b5238d369aa1d1d31706bdd8d51603646e8e2719391557cce16ce174c42abfb60c1bb454d9a9f0f1b32070351d5e3847eaa8992e780526a2197c1ace2e4ef6f23f010d7ce3808af82633fee667e02172a1fc8f800917aa4ebdcb1d3abaadd81627b7af214deabd3b2e14e3a8ac247515b07d8322f8bedcfe57cd03fc02eb0105d5ae7a9615014196b9cf89581ecb871a07f1a8a7e179ee7b4dd545b986bc47757a038c52943a78f793dc15243262876d28db31ba85b854b181d308645926441d3b7170d93ca73c095c705f9d3d5d41524ad8bcd39acf95604f576d55547c7cdd8b4f2a4689a319892659757ca2530f00fb57df1ad1a3fd1046703640bd6b84a6a4fa339561575fbe6a482f6afb35cb73ac22a48ee98240c2422d1b06422f26c964597ece0bc8c8aa2e70ae8717361b0d8b935f598fa51269bc1bb708e42e8fcf72c9e7ae34fb25a68a6238db0c948641fba7ef4770dbab3474eda55e71a41b23fb59901f067fbec171dbdefe4d7f2e283f6dc091ea47e9beb334a5d7e222e02c1cd0eb998ff4c303376d4865d856fa3722dbcb6b6dd9bbb1ca8ddd044c24c6ef7d715c4d22c8aa0061a509b60529278cb905927ad26a4fb77fd098949b6dddff8dbc9954f2a5952483136750526979e4774ef86b2ff5cdf69e716dec36b677844e4d54401da5904a14b73faf6a64b5b8e42c84b63f1381804898baf6f17283ca9d52715d8588df242634c7f091930da75d1b910ab2341040a5c68e26c4a472ab17fcdd560ff43a566f024ab34410ed315f43be1e9c3349df10229ed4c05a94027002772ef7c566c00c6eefa89ca480d9b3b78a3cea3350d0e84f0952a36869d06f32fee72c272659fadc93a811d866a40192ad0b0c143c466d3881a3444eb02dc2ed241b5a0b20d3c1a0979b1fd0a4709a9e001c278a972b12cc75b9391578d7ca21af81350aa4b34be220a9d0b73b1688c9d86c367add3bb52621483abc775cbd11e52617b2c92bd779208d5476ea902b7ee6abbcf6e459c4c3d5e6c7ce056f2eec3e24767917302724cd125f23dd47c74a12935a8498a555cb252202659026a145181e672e1a69893b431f4104a76a5aec2a000ecbea95e44aa9abe744e2801e260329e7c76dff78377ea27be9099755bac1c37865198c9ba0984e2d0dc1d16e6f1f74aee2155fc1e6665bf01fd5936f3952cc4d82e182b17dc25b51999523f24c8d9a02c3100ff75e37e507fb406229739fc88f24bc941959c2f568e987ad4c364048b88ad8c9ece3303f83974f93e6754fd584ac86393d800000000000000000a39e21040000000093e498199dddfadda537d90b19bf1c230c13b0d6553a1f736f3638220e6ad37f3e932010daa8a3996b5fb903ffd0e20634fa2e799dea18c653a2ad62108f5748499fcd1b19fc683b72dc64537651edc092a96122d1b8c90620fe1a2bbb450601000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e32ada111f22f8b57ff85ad5bcfec0ba1cb88214b8a4901aef437824389c2f0b61a2341dd1c910dc1943d1ffa2d4b776e3dff25e332b8a686ac723b5994ad7162424af18c3b750e472cfddfc0a2952ff50bec4547ca95cf0952eeb5ce8a4f017755594a577b5f9355709e611f166ea9b0e5b7d6da35b1d59a738f2293c425d60301414c9cb781e8382da7dcd8bac07c0a28601bbec0d047b6a5f1fa76233554e60224da35554ad8086322a2284103603311e5cac9daee582201192ad870aa4ec1ee0b006a544f77c4cbfff0e9696e8cf89f0ffea79f0e5e62a2d8b210959651db6eb377f90fa0fe3a1f2d95cb9f7410aa8ad1e9736ac667e70a0b7d7bea14be296bb70221cca07aac7af2879fcb8cc50d689937ab8fe92cc784d8d92753ba5a0bda2781022fcd35e0524e97954ca4ca8b33598e5008f4ff38d866f3aae73a37e3854c06aa022fb48027e151ca2aaec3aa2beb39e98813b89b865f45a47a123f820bf151905702059772991c19c16ba5d69da510c7f75fe75b232171164422d84e3d5477007ba302290b6d4702465bee0aee34cd9b111fd6f69079204296b6511629c172c79ea71578f52d4502a38f13c7df47c41befecc6324719e219b5052d62e3600bb59c1e96c66b8ef1b358eec3ab3424da3954de96c86ac986295a8f41a9374af2b51958866aad7817373fb473d45d527ea12ede722a2cb2ae277f51ddf6714eab7ac01b7eb4a68102e19abc61d6fbdca40ee23989c8d91eb2882a683067cea249e18bfe8cbc484b5a9f2be82a6b167d56c87314710d9139c3b7b8115e7a48973314becfcba13506f57e178b05eb41e2a649c345d6616a24839ae2bde7eb19d10316e717b728a499bf2ea9cc68f93db7df6421f9e96b26aa342121d85d815ed37fe27ac0f56996f68e311e1794262c7bcdba4ea806c7da2a4a82ab7ef97ebbfcc558e427cd25eb28b80d5583660e70e560d037cfb01464af72a63af1f0f5b5451cae5740c5a4347f5d15d3ec5ac483f8219ddacb4712e9630ff21f4ba145d05c659515a464a1cabd9ea1bbbbfa35974ef6da08344f52e23fdc136c035706974268e124c4634c019ec5648c1306b3842fce37786cc87725ab5cbf5da5effd737c9b4dfd12e47d4351597a394e741c191ec3d8b18b14765238c1f4ee2b59ba49c330f336c24b3ca9044db1ef7740d97462d14d6bc3b85f4eb33bf35429c5ae748387c9524860300c52b912c9e541f2606f692bd6830f39a7f1d0599b0578b9b98252de173d14db47ff52ba1d740ee016a50644b0db00419d4ce11be42c76513603664a3e8008cd013804e26b8baa104d05b19261fcb929e8c0a9f63fc7226abb16b4be10b71faf2ee8935b45e8c6b0f9f27f0d2abd3c487bcbcff0db74920ce7043939a8a3bdb6e7ec9645da037a64ffcd7a738bbdd32a13b548b29322d9ce631e82aec15d9e0521e37b032185d3eaf21e650ad530806c95de0c54f869e38c1a2fbca482ff6aae4d768aad59a2d73f96e2d380997445f6c0127c25a5dd5b92252dff2380e90ba8d33f37147c1d0a4a5772bf1af492454df2b4820ab4954c117b7ebe3ad5b6b3575f6d4d79fdfe1ee0325776045df16b0ef1ce383c7d260b972d0d7d79468eaea58391cd09c4a06393b23a9dee598bce71512e92bffa0508392309d2f73403352bced4b8400c204e548911a39bc9557bc81ddaa867baed54c46984ef0f11eba3e96271c82e3f6757200a7ddc13e68b22681f73ce116fb2482288acc72c4534e5bf5017cef8a8100ba40595917096085287a9c490af27e44f272116b595b4df991424053c805aad2d84ba8901e84caa836a970003373ab3699d10660771f292b2efe0d7462c35957c56de0e596fa814a111d389eb11ed8786a1af6bc4df1c95213887f08f3ca8921f9975f7bd325d4eb6c57da20a05ef7bc9a37d2063ab20d086d51e8733c8829d97308e82dffd993da40058fcb559e715163962e1c2d1b9b9d0031f4a8833b5f3f16a8e529751bc71f41531e9e7d65bddc3a4f66f60580e6abd180872060b46bcf3e617798e8cd4631dba72df653aa5151fa4dd2be1ede9c3eb635aa9337483cef458f2d990909520235475487a279c23c67bb3163880b5d42d3a56a414f2aa221a47ed741a316603f555d042ff16102905b93b41a43389802c4756e28858cd7c68ed5f3d3515508c044c1ae282a043adcf146f4674568efea869c085acf9bd6ca1d4a7c453d6b92306e3affb5aa0e490410a1ce4c903f47acede927d896d57d4acbe76501e66cde4aa3b99e418675e5fd5325ac4958918bf74369dd75ce8265ad740fbef935c69046901e83b5cb5cde43946640805afe96594fa00e3478d88e7c66f70967bb5a695d495f5ee5444a9e1ded455f5f30366b1b99cf9483560c56ede8fb3edc53c01b2a16b0e", "", 1, 1166948492, 0, "af9db46eb05173cbd4d41b00e39007044b7ef5e1d9f5bf2f1601adef564eb50c"], + ["030000807082c403035675ed1e0d9dc818f186c6fc9e671b9248fcf78abcdca4777cd731d5eb5cbb66030000000752005365515153a1ddb53073a18bfb926bbf372b0d645e00a5af912927ab6e616d12bfad1588d54cf6c474000000000753515365ac6352e63df008031a418b9de8c197c99d0fd44a723a7b83419e8d9c00a6274fe7f5e00b4a0357030000000452636aacffffffff0251c5b00000000000055300ac6500111e5c0400000000056a006a52533243f06b00000000010000000000000000d791020400000000bdf066c6386f0e9419ac285797e71ff551cd2e94d1715a478ed073240be25fcea5c47fd47238f0bb98f25205c8f2dc9198ff8bedaefc419641522e99df28a3286c63ef2f7a8df6fd641265ff9a8fdddf6bf786e67aa12d5307070c69d1c240bb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000296d69bc38e7127fed3e8c30c8836419203d80504ce90f041adc12907f60d44b501b1297dc99e211fafa8b4194881c2f91300e26297b989edd6e0e13d347ba8d8e318973d45b68aa36c3108070acb72a78a9d02b42246c2d86f189a94e4758ff089a0b7e92ac97ea23f931ad7f883816e61c2d18c4242fe94f9d17b6248c83c803192ccd1faa621a310261911e672d49d0e5b1f9154ffcd62f31cd530494591c710318f41b7e530901d731602b3ffa345d7c545174c1276cc6a28ad04d5a377274610b08f36b8ffcf98016d46347e0812f2dcdc88c5fc0b595afc0c863197525ff0ce901f7d38adcd1fc51e803106b6184526f22b487fe264c65b01395cbba5cfc108d0323c7c229ffed569f484d238ad13c8324d34dabf20ea8fa572d6626f6dfefbb3302290c13f14257651d8f0cb74240e43833c848975d7a52ca851fb71cd94263fe91021821d5b5863c648855ab7b9fb1c9cc521921fbd7dcd993f4705bd68b3d99ce0d031e581652fd44c1c0f17b26a5a867bea0bceb1093cc2b1f346be97405e8f091e0020beef99808b59fe6a934514042c0bebb59655859b8e06c00d3c232868023fc54624b2943a293e905590ca38f5fdc59f39ca299b935e653b891280f6fe934bd33e7f4a45c5e2f432f4c393c579bafaeda6dbd1e08762d99b8834065d153cfab6012966b0462c70df47a6bf98758fcbd7003b41554fc492872e115697c37c9bcb76dbdeaefeab71bd1eace45501ae0cc075cb3c3e6ae9b51c8f0ab18a3688e98443e06d40d81f9eea880d53207dd864c54eaeb85c0a979e881498dcfb7e4a470f906ade29cd9f654b00356339c3d39a0d37c17ab3026297d8fba631e0450aa210915950a1ec3357d5fc8e69d438df1cc013ee90e63e9ac5c9870d6add835265efb79431fff8b1d3434ec40e348968df7e73363e9a32c630c43fac78af81a638df677f0803ec6e6e3cfe3ff006500e86f0b8962604ac08df995fe506b88418e5a14f2d8f0217e8c3df4208e30db54dcd78d40be88d011a0037b66ef4478e02ac4843fe003d002d2f7e422a84fd534be29d80d94fe51807f09d9f216bacb1323132b295f89100c3525cbb377fa95694f93c7a5f2f6253ec48325289c461df383c1f735f3f6d2e16103f317e61e65a61e3d06299f776aff01d59575b8a3e4655c01b3e8b5b5052c876a640271d97ba5567dbcc3e149f76cb1e4b1a8c54e4dbef1b4ed728a4da23811c093a4c5b58b16fd53cbb46dcb60b81688e108478f6fedf609a12f79d4dbf57d350a3a0264e34dad17b1b0ac4045415c1fb73e093648820ce9dcf1b70da2836e32c53667e5e83224f9d52804c4f18a4eadaa788c6091b4322b6ae39c6a8849f8b8a92ada7b61bb66dc1b96efe2af8785dfef4321c13fb910f58ecb8a8e17148bdd1be94fecadb18db8dab42599929df44669001d1944a81406985a70db07d43c2772074322c0b3424400787b06286c3170efe4bc0cb0727ebaba2ed70d80c5d7f62f354e1a1f6783a111d133cd4d5ccbdce236be3a4fddc730e039b1a424599215d7ee2aa2280dc7f9bc2c9ddda1151792943286fa6a4fe32bd09766961a22b86b70d30ca5996acec692d66a3ff21cdc1f29eb82c152f577d253b7ce16617e69885d0722c1da032c3392f1e04c5591e8975d949f54b03d478bd20d981f49f5494c3d9c600458cc8e2587dde6dd9de2cf66b31618f9643ab3c86c1ef8afd7e77d806d1ae9de0665e5d1def637eb90a2727808f783fda553f9e625a99816e66351cce0cc57d52a72ae98c533c135349bf8584170fab43712c81990eb7b48c00aec65ebc5653f77548fec8f001ce277df876c806ca8f4944f85f45f5d06ead37797d7555a6127cd231e5f139d6a2a12234fd61059e0661f0bc799a9e890981d66c99b729b5184983fea2a6b4312e37e0cf047f1955ac8a0e17aff096206c759f724836525ad1f81e4b19ee46cd8a994efb1af9936ac37412b9244f3f8f7e7255135909560e8297c1a1bcf1069a5a36c2574774ccb4acfb53f2ca45e41d64c0e29d9ca2f17997e471ad6fa3437f5f2c8bdfa10cf454374a44dc5c227e3c2bac036558e21dfd15c440180ea4a9aa9ffba03e0d2bb706893d0d450ccd2cfb8ceb267e7b402e6e1b98677ba6b479d565900ccb2e66aadb525a17f0cdcf82fb41d66b27d083d9e3874cf588bc5d8110ddb1c049e8c8dca6ac54dbe91289d084eb5f7bc28767296ae2070ae037e7382507c98208c979bd345187ab1d8f566302817444478eec96fc3b937b44257da114cd595bceac2cf3c06a5a153aec7a8df641113b1feae903ede12c182732a0ca1bed4a56de67c565983ddca2b94a1b7999c8a93910770fa15eae92f9629cbe1bb6929dfb81b9390f30449bdb4b98ebe11361bad7d384e74235527756a8bb48cc608", "6a51636a6a6a5363", 1, -661428148, 1537743641, "9bd87fd9dd7db6a6b679b5324770ed0593abcffed789a637e1186d20c2a69cba"], + ["030000807082c40302d0df87886f153e2f82c72b9296144bacaf7d92f9e658324651a95479e906889c0100000006526351ac6500ffffffff4a1a4db82f2eb26e64bf0187040a70f00cd42c3288d319025e2b9d47d77eac490300000004006a51ace4e23ff7040d6b0e0200000000086365656a6a65530065b5eb04000000000665ac006a526a16ca25040000000006630051515253fb9f4c040000000006ac525365535128ea09eb0000000000", "5365acac63", 1, 906935206, 0, "f953124f6b21a43b57e0ba24b95f2f2a81280631a8119ce9716dec89e0277520"], + ["63e6490201824330f4c08514e3914ac4a16b2b31533d47e640473d07b8590ecee9748c57d40000000001acffffffff04bd57ee0100000000066a51ac526a53a88016050000000007006a6a515153acb77a2f0000000000035352531b516d02000000000765635363ac535200000000034441b10300000000000000000000000096a6c2e659dccd4b824cf40a34a43c0a18fd7563bbdac1aa29fb9d321e9b8181872bb6e1416858331cee79dda1c53595e81f6fa99867619cbc4e4584f62da9a3504675177aff6a4b51450c808a560ef2d660e583b004fccd0d60cee8d944e61b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fb3d95c9251a2faf9b734477c4d4733b753b5b8d0d51cb9c6609cc34774132e2ac6c4e10e9793a9cd9ae33bec905b719828ee914e2bc41025f73c0760e0123e9000cd4477d4077be5be16af9788b5825d7630025f004fd189eaf41b62337a1e23965aa95e633e8a61b02364897c2056f050c591b73c7a0fddcf7b478f11544a03118340d9432d4ad7d00d991998822e5c67ec3b62ecc6e9e7ae8ea7ebf0ecbb6d02219b7f777b8a72d48f493fa6bac175238cced663d0210eec7b61a61f50691b840b07d2b847139f0aecccb57759e75a2cf73acfca653a6a1cbb784cec904866660621dfcd256a0537076f2b78a61ecb967ad6ec00107d3194fa9b5b14bcd6d719c4031f804b2493a4d5724bf0080b28a5465ef0bea776e15af2fd57cc188101d70fda022b7c452a75ce8df583b04379802eca03588d681bd5ba03238504bd4cb9bfaa5e030e272e325c8b36199fe8572b922cb976e1aca941a80f6d9e5ffdac4d03f93ea50211b9e28f972d3997fb800b58c3bc2dc335291b51b2a798989ad20d1c5c2116270303b71b15f1aee5ed6e9abb8698eff44e5600fe54056ffcea934d26a39030370a5ea8430ef690c388a739c5287be73c5101b4cce6a1200472afc144ea00d7fd709905795ebffdd32eec390bb957a0926c7d491956daeadb7e8091fb8394fb930382883e8a99fea6525efcf1116643d726254545b8068658509b4c2d5d3db86eef002027fdd03b69cd3db8bdd6fe1c7d39da75a98284b441130b594982bf9197a123eb5a5d79bf245af5e8149991c19b5dd33c79635e4308d6a378b9d465e9ffba09cfd09d626f03e6d5cfe5b4ee3f95c7873d3952c0261ab77962f9d39842d145d5432ed87594dbb135ab5f5fbcbebf9ac753787d1e475c92d08ab9fcc31e3c90f8682ad5a48c29ea175e4dfd99839f6df0952330cba9170d3d4c9e1b60aeba88d71218918e9cdf7f637db99578669d07fc3ad6adf7f3ceef8885b8d72c824e4ab97fbd1792a0afc8140096b8f1c5d3ab85691f92e8cb517556ef5691c70f14224dddaa4bd52aef8c3b60f6b32b0e16e2855fb0323b1392737229325048231d7aa58a32ebcc53d0b493e314bbd55f9e42233ef3e0cf50c3d0855cf8ff9c197cdee44af8f02e5e7f68a7743e87a197dde9983c9af4bb87451832a3195df9ed1601bb01ae311ec86e1c0720697996a7399db5a5311ea4725d537460cd63612fa5ac44a9a4f49c6e083dcd5ff96e663e7c7d37161346bf606a04ca8ac22aa848471b7d9d1f7ac74da72989ad550bbe418a9ed619020e20f08f8e8d9532dcd1e5d19bd3cc9e50a7a25c73d50f016f158c219d487eb32967e13b958ec8dfd64aa62c84af25d92ccd195dc0cefc2413d10480324f15757e6295ddf91c385a5000359602ab06e2512617b39fb4bced96585d37e4b65b155cc2a6fe74b8e4b42940ac1688f87a0241cf802d359e46d14b6b521d8bf2f4f7ab2700960c46fdef717d676e7e2a08a39fa51873518ca10616ec66df421f50faa27b814b567f87eecfd9ac1e3b10a19c230d1487ae99251a24bbce32ff2233d899829a250a6f4ddaa3e0e8a8c34118dda058bc68529daa069bac5bc87950efdeb7dab12e55de5386d554a4b924fd27773bd5c918ecddd1c2261954d7ab23f20260cdfa1ac64a3406768cb73c49766dfe8478b49b61da4b3fdc5d7dc2deb2b0720c8760429549e841476aa48e3bedc340fbb407355923a87d7096ae924db0ea673c53d7da9e2226618a614980432ed5bd1d86527920b7e2387ecd6881913f8fb702e4499fc6ebb3d4c644a221a3f4f03b33fdb725391fabcfe5e23b8cd2bc3dd0bcd0f245522275770fa2636895811b8f9691197ee57381ba6e740984182422195534f7fde6f4f6b3bee80344e94f7f280f531184ae68d8874fbb7feb183c35eaf859a9be2be33fbab6e55204d592d609ac69ebf0c086d255ef75a2d802ee5f667e99f41e2093bcb0f83b4c569b0ef290671cb733c1206f9fbb3e90d2f8790f27388b7c14fdb33d38fc652229b4064a5e38ef7876dfeb34fd3971d889def2db080877279c5e5d542267d3931db89a5cf564483b5bbd6a32b8538343dba698d6e832996ea98c83eeffdec69ef09cf2e33dde515c2112fdfd6a325f3926f66f103183a67d5566596df6b89a4fe987e48e5d1aec4dd0784024cf5ce12b8112c878b7a5f8b09b0df56f8a1a1e4e7cb1cbdc2d70672c1e6dd08952357afbbd7134c0289e06561778b9f2803f6366ab8c1f4ab9e8e293298115f6ccb5ef413793ff9c00000000000000006678a601000000008ec2f6e99054bbc121bb254c20abf04d2b5ac52b50edb65156317a0a8a4ec6c304ff0c8150b03fceb4669f0f71a481eab5ad5694845ba470c9901fa3d6865470462fb5f3eb1a6b26ff29823cd20ca626bd080559df37a184621d34496ce4415a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010872bb97c0ccbe0d6a3dde1e998da10be22719747e6ac75321e9a20381d8fa9b95e907bde6b410a3dcff25a8c3fe4b76950a7474f157cd75590219d9da582da88bf904c0fb8b680435bda53ff47049aab0821e6e2ccac284d0e940607776bf4f81841a46d89cb2636e5be46885a5101e4ff337628f87ed75001adfb5bf78143032407f5ea10f3fc929ced3d0e2fbe71a46f0b0aed584bfe0708bc44d9c64ba121022b02b7df81565cd34c0cdf6ecde2f3b95771c220b1343760df6acfcb7226cad90a07bb0c7d77605aa9b43d1358504c56b927688467272c9020fe90c94bead5e568c80582d1ff6c2150e7a038caa01a93c15055ce0f702ec22673a67c554780ebed0325603add0854b5cb587f998d5288a4b327aa5a09edd938213b1eed102362a0e5031a9577090bb411c3913399cdbafe1d67ed5ffd1756e493384c58c5909bb15fdb020bc1a466d005bcf386e8780e7d91397727bc8bca64f404020612c0d37a3b1b4b022f3d270762ebdb1df96326e9e9ed8a146295860778efde3cfcbc793f4c6b39ce03035ea79c02e78b5a77ad8f41d5bdb33df0029ad18d07de47f671533f65ab1cbee6ca8aab8719d7a075e66cdd2900c1929dbb8818d9e8807100b28329f88550e48a2737d39d4f2517827fd6ea4887f156b1cb24e452560110b7de42fe93b1703a6b65f929d3187aa054a83005eba3936edb11889f1f05d55f1c75bcc11372351ed32e19682a0cc77b23f4a88730dec799e524d9f105b319ea8baf3b8bdd0d0858ed127e9ba6a9949df6cfa353611f389748384a573dca281a1d2dbe222ce0919217e862e0531c95bbde7290358adfef139db98fa83d018af7847d6d759ce597879be4a33833ee8e0519707c9358ecd0d30b83cb056089fdd81dcc475b81dd9915e198c37de8be51ec6feb676ff425d95a1ae4e168b9fcb2a047315e727d41c93031f1dd6e1fc1c7fafab740bc0dfb672d8ddf25804d340c66dfc146d6486f093f16a9afc5e381c90730d9d8ea794c12fb81b0cbcc4b3e55814a82cc0fdd8bbde612df2f40006ebe7df4b90a8e790dac51c508f9e22998f5fdc850014fff7d3f915c3ea850f0ebfd7d76e9a8be867bdda25f6381d24b62d3f5f81f2700cccd897b2137c38ed45bd696763864c9c51871f2e9f4fd495e7bb40f1b79c0e08dc1436c7781a4ef65a4208764f65dc49d8c6ec63fe329d6680dbc250f20c49cdba4050c3709b1ddcf74d3e767606c76177d92f3e18b1305811cbdebe259bbccfdd40b9e4304a706efca6ffac888a761468493f36c42e842077a4b3308b26dee7f6f377ea130568b0837af51cd6344d2cf0bb427b5ac1b4d2bd7d11673a827fbdf9212d972e50aa25e985df8776a75f86eb28674f0cc83522d1b8cf3f075c3acde1f26223684342e1a9cd5d792a95c9beab25a51d8e3361d273644730ccc8255a54337650fa3168f696579fdb9606aafbe69481b70cc42a1e3095795a76c01d988c624d6764b297bb897a6e64dcda5ae7a3d9c88ce452e8b2341966ff620bfb7157a00e2172c437484adebc2829ea9cc31f976a57b25ee9f011341eb5f1401b75abde56968dfaf57e47cb61cc3540fa50e74ef19fa1d24aebf60a780dc7289ba5be97db975a2125b36a66b33c6127db7ec180084223ddb4646f5b3cf3221455c919b8cb44c43f5ad7117f1c8228913af5d5f2d2d3b72b68c3217a96cf777aeea441bfa61d6c9f13be382441acfc8fa1f6238d3f67bb0689aae19f944dc6a5569e8520f210ca3e8764737aa9596be0fa5eb78d13dcb0c28fe5edec52a501c7cd61447a7e956e61072402d8970d7a3bc1f3ea8a0aead18510e91d4b2fe371f45806cd2143e45aad1b3412a2ca51ce5d57b0646e0a53128274d7f1171c9d73b748074551eb6ff1d2885b9fbbd9d44e97896c7d13c84a1ca9411874374e0b00c062c40256bb4827a63d065bafd8bb03d9b84d9d49176d370857689e3081eaec5f1d0b1d0f85eb8ace69cb79839190b06360b5adfc065324f9789b8b8e3eae789866279ab182c8fed207b9acb1396d2175f005f77f1367125204c4208c1384103e35a7c0f823dcee1dc14e89057f9ebfad51794a0c9b9c01974cc28dc0c3904b7120445249d470dd8e62c29a1ae69973e04694522dbd6a5324a2998d0ff83410211611a7bf58e89e0ff992a7241dcf43acde78a0b319144a707a3974e4cc187d6b9c86cccb20ec92f4e8d89869a91a0e2be8a0ddabb87cfcf99970ddec75285d7c5b0f02d96dfca9033d1491b802ed71367c52c32ee60a43d55d1cb05000000000000000000000000b134d678e5456902fc3681bfb8f572deed9d771e8cda5b78608bd3611a1d2f079bc8734c9e13ffc6005810a2af636fdfa04926b6ccc4edb50a7ef6fd9c9ba0b1a7d76026d089fa7dabe5e94656c2046ade241a569ce2df339faa24ad9f18860500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e51e0d739ad790274cc8a5707ff0b5746897fa93d37b9c079c29f5e389c9f5c8b9181a7f5fa89d97cf75089709c3a452eb55d4d8119fbf549d0d76380f15d2a8e31ffd87e718409e9aa7b9705279079c9cb5eeac9881c9915af79cced6df86766a5aaa1daa98e86f1e6ac9406669ea77be50ed9d2d5c6607b5a6bef954245032022d874581c61e514581d27c1e3dddfc5b90514ba145789daa449ed1baf775bf1702267c2166004a004bb0592a76433917f9583afbceeb1010c14cb359c96b14184d0a00613793723cd271cc6b8b4128e282f57ef81adc46965a70ea1736c741b7efb3760ae072772ac310f2d123a29a305fa16489325109aee9be1799eabe2e898ced03066af2491497e9f928b170aee7ee2e1403194297b5630822dfb2401237fa4459022ee5541e974797fd4f823bfa0b80e92d437d18ee9ab9b03e1c6d2f13de132736020d65a5e2451567ea5d083d2fbcb4dcabcbd371aa545eb3065ebad4bb2c088e440226fde7af032b5d4b7ad4d79c18d671bacc10b495c080826312377d45181f2c0f022b232e0850a9ba2437f24bff89bc2164bd11e9eb153d51cf48e316ca66c250e6f871e6506ea7c1afbb252968730b6365a27d3967238779e2b9f1dfa6986cbc4f27d5e139d70fa7b35afc0b52e0235ae0869866fb70e51b15456beb7e93b3c35e99e34215f12d7f81890d38d98784cac626f618291a4ac80ce752f95d77c18786a95dd8ab7f85455948fc3f80954c707804ec3b092b76c5f3de18796a330d606d512fe27fe42f0ed94475814924051b8c8b0fe5f54a95120c09bc388c84b001629452143d4064d95de110513ed3974596270a2d444294fc2fded27adaad769ed50907240bea5b17a7772ccf1aaf6c13120407e008226c11730224194468dfbe0f30a735acb36a4c173915cded74751d964760677e76a41b6046f5bfc1a6f30a35371d3fddd925d39e6112b64056402f1bf42de80c54f260ae92144d7fda502c3b1770cda712205d9053a1c4ad601b00eb998d92cebdea9c41b115ac06d82c5bc487fda24e97399332f03844e8eb1e96dc38f0de98a75138cbfefd420d28aa9fa778467ab1dc7834522a36d05a08d27fc7a0e25bab107b72efa9deceeb82b0aa22a7abd1c8af85a280cee910baa7f8ae395f36b1bca9dfd2b17298dd11f2465ad9c11ddef55409f38eed8a84fc2e7ab19706e5ffe1107a1bf41611e0da95f9070635699f24f600345ef10989d04d9e5deadfe04d9d5da54e104b9e7a1939d5c39f71ad2ec932bff3c9ee2431b97e34666d2fa273d8d18de25981c440861fa37e4dd9914c735e1ddd9121877c1502d535ca636c4767bf7d25f496fbc9dd7d47c2638ce49a18e7d1d2f7294d9a209f4248007977063887eed801dd99642571eb82ae72d4bf615a641f5ae1157ee1101c61159bae55925e389105e5efa312b20217f7a16dcf531785f55ec630e127dfb1d2ea937973f5f671b208994407193f029ac68d625fc9a637c93325f9607d76aea7d8fc40c37e28e11940a8260980cc9b217a95e889d65e92b92e6d52a8259f9b119ce7a88094afc538c9d0b1a9d7bbd41f83c0c09c19e07faddb3e4307ca3193b055856a207eb470bef4a4285a1edb442d1fbddee14220552d918fe95dd3f3fa96eaf5a9f77e1e76563b4c66dfa08903750bf2ec257d12392301065b3ce1ea9ca038255840f756db06d48ba10d07a802e4b90dcf2abc1e76e970c2cc139d79fd579334e578901491c07c9024cc4c01aaca04633543d2d3cb582e209a49107f31a7c536c95eee82328449a514e5f7dfee9815a08e3fd1d7bb66229f6ce8af44cdcefc31aa09f1c53dea9a40941697309ed85f8c66e5589ef204b8aec1d7f861035f5deb51e36ed23cbc7b45aaeec2a62f6be06e0efe8cf5adbbf0c8870de138af81ee6c92aa3aacc03f4c5b967de6565d03c0aae2ce85dd16eb98a120073112a6071316f47300be654f3764eb49636986b869b7ff4426b4f771dbcc80d961da84341f61a4f7fdbe99e5700e3294dc2e15483a674c5ab72884c345ab176e2069fc43d1832bb6cceed247ad374a1bdde1c2bd38a1382cd06a423bf7ff5ace388bcbd82931aa60476f9b5dc9b0f2788560b5c9f66e3256348187d494c869bdc3c993a255f714aeeb6c022174a2b2fa34aaa7f47f5183a0eb82118d0b9ee38bcaec7ed4c30d03673a600a6f65b8a5641721da8b8614dfbbe09769f95b26ea9ee5c6709e026cae9e5da19ae1136d6a005642c1343f592769895918a18f82f624d5342c79110de82bcf1c0125385fc83771cb3d638c34554de518280bc03da876f69ad45e871b24c99ea22565b02870171b465ae72847af7871f4efa157888c458ebbf0767f94122d14ae0b4bf9b1623a00d647db0bc2ee760fcd4b3ab4671efb58f88ed14ffa0d", "51655100006a5151", 0, -1863630669, 0, "9839b0e31aa81cbb288e20dc5a83c05ec197d1ba9a2bd59aa63290ca89548e04"], + ["d51fd12d042b36cc97b5e9d6a61e631b26b6551f8245a7c9925a3153838081fe809b62559f0100000002ac539180c3c16f7c21200b96af93baa4380ad573000d2c9e67bb38f3387e65835308b9857da00200000008526a525300525263c2a4f65a9baff9c8a5629874906e997366e4693fc50798efe8f5b9ce9a9638fb409e808c0100000006510051635165145876b2fb52a0458e8395b2e03bfbe1ba77ecf7567d372e2d5ee4824867e2e97e53a325020000000965526a536a635151acffffffff04417d830400000000046a51006a09bf2f01000000000800526352655363008412e502000000000853535365656a536334ab92000000000002516500000000030000000000000000f5eee9040000000082f54f2e70585cd81f2a2ffb8272373e6b280b34d3f16e665f195c3b1a783f4c7533732691e137dadfe1a15ece73c90cea6843e2e92350aec8217e04625c146223da9d73ddfc7c3b7963041f155ff05833cd1daad0ade5b93f3dce9ebe53c68700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8a2e92c757522dcf47783d97388726f33be29b86f05d65b599b110314801beb99e18a621567bd602e76430da9e6b2490a6feacb5b8f1b188b6daea7cb6c4aecbd4e47053571735b842e0e82900399cc5f0517a77f044be04b30c13d48a5815fcfab8ac6b05669803ea0d758e18702e8960106bba9e097983f3e2e1aca25e713020489496cf79ba17a805a6002bdb6f349a020aeeffb5778d93abb8f38d64aa84a032267e721f12f66b839d155003b67109dc5bff1dba9b1b1a0b8c81c03792dbbbe0a0129c1280f5a8851c4252cce19c1609e317bb232a953019f7d0a2381c733bf6f693052951e339282348ffa5830ef39db87f08152684b9744e4f56e0b4316cb570205976f565188c9c183c24e3f02f021dc5b9492fa32dce286f64b446b76a8587203014497ddff6c10c9ba867a766fb8d89e3f86d8c881c772c0e4e600b718718a17021c10a3d01420dccb7026543aeca079cbfb60e257a04d77e467807c08067537b0031b75107ece3ff97ce048fc4a0f2040eb282ffaadeb8dd8787256e4af3de7cf7e032077bd37da415f2a61b931ed8e98192ba53cd4832b6ffaf0dffd293a69b065084ba76e9eb0ce3e300e117f0c3072dccda3f21548bd659c7c7b18c6c0bdbc491f27312e20deef268f3b2ca8561474d8a28e5d90b7e79d7292081e2a55318daf9f7443396019f490c22bf0b05f58e79efd39563541edec68d72ead38d3a06db341699a7df6b33cd0bd28370cfc41135a6268c847d64074f17682e9fec9a533f02f80518371323f406335522bc20052b5ffa685cbb8e8c30a28ac43e4979dfe196859f18a89dd1da01f58ed6128dabd0c2b9c1ee53bee288d6d5526aa903207b1690f780f2695b1cedd5580e6c2039e094a7d71059ddb19b16642a44262ab89173d31807113f30ebd16ac665d38e4d049c820d4988b5ecd7278a6142248f9abdd0be154e08c7eccc63a4a0846044726f9789067b73b1f87b3a5d429fa267c6fdd4a779cd238f3f328a41aaf5a9ad003d345c5af48c260e622a8c80f1d96b735c61bb330e725fb37182a9f6833ed5725f26d9ae73312f1db304893bc3e77dd51745c98c0511c73df34e273eebdf8b15252708eaea2aff91e7f8d36d5e941ed1e4377823c037b0d1dae05ffee6e29d7b0897e2f6f1d97f1148118a91937dbbd07c00399f14bc873b225a150b13a61c798deb37b888c07e42ef6fb07bee1648a3f6569e5abc3f57a32702215fb44b3c96cb02206e899bf7b7a0516b63466b3fddce2cb667fbe4bf4774e9b6da91613c851f6b85551809c9354064a7a6bd3a54a630d0952e44a8d7a51135ae2afb3f2c6b76175ce50c7900cf7f38c828b198b84f41b18b81e2de631e92de977e449014aa55788851353d60f869e8e6d814afe44370cfb8676df0a481a40fccceb3d94dbf4061fc5489e455da0c396008ed8c5cbeafc972a62a4278266878bf52f20574004dae4e12d945b5a393c87b601b91f8c6b3b23b0e9ec8b443144e6f8fdfb5b3d8583bd4563cafc7b2cf353322139c918188a3664c746eac35c2a1f9807603a15f95a619cba92c8e04647702b893f07d9de81f6f4476c6c65ee6bc4d934c9cec3d48e19d21a5704a89ef38c5050281f1bba4150fb081fd948503599211354df2b2d658f86b3977e53b7ab2d3ac02fa1b1669168a85993b511d41745fe28180a66bbf3786dcddc3d881a8c958529f9de718639317d75615dc6503062cf3f5faa42781e2bfe38cc915473c79ecc674ebf4ff9d83a901e16e6a1cf27fce26414caa316b742d880701c617e8ba8ec790934e912ee093a1f5e4bee20efbd10527b23ede1c2df67a758126350b8dc64484d095b5a3f8b364b03ee6f8c2b5c9fbd3dbcdb00b69b9ae332816e0d62a217669114805810032c8e2490c7193ce44724bfe4233dd4fb6c0c318c67c446a7bc4250f1941baec146c8e1ae85431d65bb5843ac4c27c119eb5451a6fd7e04047aee9779dae3924bf1da91863dda6955e0571f131201ca04538898df168e224cea0c23c57303767361171fa672a7716e7b8a98f242f8e32951fdb1bf23926f8b61bd95cd34580f8913b4b82b68665a0524ef63baf93503e7c94cda248042266adbcc5e1d70e21bcb863303e0a986683b1d71b96633d3452303fab2d8d87a1781174b6d97553e9ddc8c3b286b1580f3a47e68ab574a3a9beebe36fa36552aa4821a68284bbd8331e57ce7c6974a36a931d8a4691b5ca5330489d14e2866305e705d96b44bf418afb7297224c9ebf935e8c5de1d26d156ffeb1b5fb1283a03000000000000000000000000b6ad3c7df1591e7291166f3b417e177598124ffd116a72c02a2b556e0b059154d6007c5f8814e5514832f0e242fce2c75811b094e4f6ba328d2b18026e7c5b7e48da21662e6718984dad5b0c7c1f534c285163a52d2f563d3b459aca4a50f570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007e66b4ef1e9d62c1363b42a519b2eddd005d1c897d4d20d539389cabd10bdad39c34d886a016475efd63ad913d7546f217b960fd7ed16bf1e5fa7aed2e751dc8c1f084526fa776ec34c381e0ffda311dbfe8e6f1e7fcdf4a5886a0c0744908fd8609d518d0452c3469b0a0f367631d876067d4f6835fe51cc41715468d4f8e66021ebb6bf168e0eaeda00d9dfdba5d218be9717f575d7e8c1591610fcac45b736f032fc3163cdaf2115118230fc9026c0c5fee19839bf74df256f8685f26a02430880b00bef1f3a30dc1427e83b525d207bfaf0d2f4667464f1df3c90a2d037d7c36aabcf513833a4cd2f5c727af4f028aba18d6dee23c9bd7b19b98f6c5c9b478b125031eb6d605c42e732b4a45c130799177b4c6fe489c801e45c44bca61329237958302251dcf459e6ca8fd4cca4490144870f3035c5b1f3cd1d119245a44cfd085c94a0214987a19558081ba73ebd35fe2ec6e92e2ae7c3326f000e2b93302f02b043a180300de9156cafab4c52d554a3363a4757b18319f9c705f9b99243b651455000d9e0321c3ec01a9c91b0783bd3c97cfc8e22aa8dc8c34d837304137506390b6aca213e2a5bbc4fd2f746aeef7fc9abb7ecc38181655e970fb81f55350c2520165e70dfce5a47c5db4927807a50dc6c1531e74406b1a41ad166c1687a5f5eddb12dab452541ef343a8a0b659aaf9508fa7fa0ee379db855a3d0ab2aa74186c7fa6456150d69479bc4b1b93553c56e5033b4ed8f9db59c6347e4802f833ff096e38abf3c9b7487e7deb811d27bb1490da714a31c7f0ab5cbf043bbac4e2b4b41c440a8aaafc65ac9daa7b7c1cd239c54d8093b853965355f2ddaa045bd39d1d35531abc593c19c89c4165f181873bfc23ef06bd3d5ce6e3fbeef2ac871d1f7f476b62f95f94e70ea135fbf208ab16b472ba95a6121cecad886a098138fa26d3663cb018ce132ef7826cf94f1a1bd30cd642a5751d68a0892d8bf71c1e461ae78fccfd363920270a372a8a6c369de43eecde809d422d06593899c472bd5e8f11a102f2da9e81d5c10a34b0fcc7509b70e266747f4b33265c4e00f97e1473759cba8dbe6b2928c4704cfa68c1bd7610d1a986f262e6e2d3b9851b49c26a0d6ef54866d5670e01bfe4dbad47d2ab08edb236c2cdfddbcd08a81c568b32fb25ed6c53e7186330526475a4d37bc552b520141e30ac27d22829e2871a5a60759b5423df44c5547a3e24700c4d6523dfcc1819f491c09bf005a81f02c853f0f5c76536b0a7ca7210a025f6f39f2fdf1eccafea1c059b19a64243fe55aa53d417bc310e5df3034cc71e3d80b6999a9ef033823babe244f7447cbae6b37e6d6d352d285e37b68c4e2a6c2eeea7cd658ce4a923e103a3949471cdcae885ffbc93dadf5e139c433d5b4397d7c112feac8a963fd6956109ffa9d14caa84039aab274e070eb999c4efe8f120bca42dd8c4f32abc1d67fa58535add1da69da24d53040831a73c47fcc56dc4e2895519bce088253d49eb22a4b3a435018b95b5c44a9ed1952647ab4a3e39575d43f2d152a582d6a45440c076e7d7536f05737fc1d3ee3ba310727204a5d3f7853b929e0343328a332a1d46b74160451577af87d6edd87cdb3842efc87b6121fb00e12a620bc845337e8e61133781c27444556b666d1bdc56b907d03bef99bb74a431d23d66dad6602d0040bd7240bef4a449c5e8325f8d500d954bb6e01386f44dbf84ebfe4b6863095c79ca1243680fa1ed7471d2151eb91fff9e5fdac07f0b25f823c3421442900447539de2262b6e5bab28948f2169fb93403f978d6500c01270a09301e15ae51844f25f3333ef73351aba570c1b8035dd7b80f4e57998fe125f06f6699a0c32c0b4f714f70d3aff2cdc2c1350d49db463029d9559ae04fb3b775e855c4f5066051bc574db9d3b01e2657de87bf6472791c6205233fc8d145aeceb8ae629c0a17460f6eff08a327d5bc9ed4a0ccb59ed0511cb6a1695101e286115702e92948b86149ecd3750d914233d143949ec95df12a055b9c4931563ee52ffcaef26bb2bbd2c174bc90d164cc34843f9a311eff4084860012086e0b449474695326a10f5bd871df472a1771a0c3c16f1b0a1bdeb7cfcb3014a21e85296329f9c39abbec734b0d7b5ffaa35ac9c00df11accff916d66186415870a7cf8d16302447025c8a2103af9be8506ee66b2761575e4262c9f8372f26fe2a6232114764c9b4c85c7000df0228fed28d8e103c8a935a6d02b0855784c6d072a4b1fee1dc3ca873f189781f2026f3474ebd0000000000000000c57b92020000000094a2a169ffeec8f1e60c3f161f22e7b7adc645bdc7ef45cba683db36f55356b9802413e88e98af834a2bffb6671747d4de56ba0d44227a73e8b30f51cc90fad8ea2fa88d8dc55253a277f9bfeb59279f5edb116c2749f1f11fe69f5022905e7400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000204975413bbf202b7c173ff7abf041a47dcfd21dd025c68800c002c2649a1b2e13dbf74bf160552ee067d1f588d6074db47e1ea7fb1a9804b09d0773dcc76477a1b4d18fb999cfaa3e70be5b9f1eb307c98bd64e96620431bf4199faf0a1f21c6d4d592872ce393ba4c5de6234b66c86fc9165c2a1a59b9f13acd4dd33bdfdf002132392c98a94406c04a9d3ea4d17c5461e280408686a6b3af96a7673a352fa75032e2ff5496a5c03d17401f728e957f6eb9985af67cbaa4823d106f4d162e864700b082896e27bafbb4b925160a8e708c6cde5f81838f86278ab6426dba95f0f44ff76d86e75c010a26d3d34ff5dae2f414c1b7260ae78db55fd4d3fd367541798890217e938276d34c76de92e5b936b6781c9d83a8b17a2902b1b87a2b50f985182ca0326d8e4233909fe71ce7b4d31bd4a6eff357ada50a6a4ba0cfe36dd9becc138a80201902975c4fba05df42dad5557981096104233ca8996346ae545bba3ca48115f0210ffdc9f0b0a90a910222ee24f44d7087e83d6ef5aaee8ee80bff1b3ed671c5d021291b90104c79a8c5159eae88342fade902f9b52af5eafc16d2eba987bf25ca37e1851e5db885318301e842b8db9256f008213dec8f698cbac3fed5a8e2ef15ff8f2aa3aa8a4bd276e2f016f44ed69af20aeb3c27b013816060e4623edde723d0f9f5d08a117373e0dc3e4f3d67f96e023c5c00b955862828684538fafb6809da2f7b4cbbc53403a015749def633f6d7bb70267f284c1d240dfcee95ef5b8010cdd5dfe81eadbf7c204abf8c74938ab61fb4664bc52797ba43883ba85a06932b7fad934e81bebf329a142415a8fb77f6dc6a5a5f07f90679117385bf969343f9764af239efbff15a13d1742a66fc888ab3900b7d1751f40562e033e07c6f0be3c0381fa3f778f4261a83ec30b33de7ef7cb4433e39717ecf05b611c2f13fd04fdc8c6cf8b8c7b8dfee9a72207fa90837c9f41a23c30a2580463e199d81010a86b0835257c63146b192ef743c7f6fcc4c941ce446316b9c6e74d535be259a29a03e233f100f5585dbb74269941dcbc47ba828f86831db15793e8efbafe8f1cc4e844269e61ce0340162c50e7f54dc60861f0dfbda1913f2869a1d7411d4bade990e43dff3d71760bff87a68d09c43644de0d7722162214ebba8edac94a7531543ae8ae63b1a057fd5aba96921f2bc12a5adec009c13cad0c5d36d69f918f9176704ab7bf1448baa6e170f3d9ad97aa5379d796aff918a71eec6ae1573971776b305324001a0e8bf448edbf9a9ef65264ede297c3e10556ca1b23bd67d7cd26fbf7b5d24c08a05f366cec34aa8bc46c8486d8a1ddb00446cf92fe3d7edda9c30f3a8b828ba89554766acb2c7b5c62d20fc1b22a9ef50bfebe0f7ec798f9c53907212b90c12dfcc4a0003791e7f2797eebb3d4c848a7bf39d5ba2c68b34cacb19566e55c96d073a2ada477e3887e3739b9879955e55a007a91b7e719cd0c2d09c5d90b2424ba89841a36f9bbc5b8b5446c9d7431cc6dd74cc79eb7f1e5cff01bc8133e39c2afb5a52ce707e68bd90ffdf307dcb130151ee73cbcdb97145deb764d6c1782b80a72646fd7f0396209942a6ee3f5fa79400efec72fce6f8108de6db71ae960371b108b487050e74a450f15ccc2c24849f64bef1f9b681e8444b35aeb758331fef99e8cd0746c580e89aa341f098f6ee99392b2f4179849e7114680f76d8d4fd404809f966dd422195c7469e3beaee893d3f1c1c6093b916fe3070bdb56291bda11090171774f6ebc94af8d67aab342cda1b47cec484794e88d09b8e7cc4f56be201645d31eb82c0f9cb7a3574c973c17cd1441819d4bcd13568df9165a4e85d8c021a5f44798bfd9b81c25ed25e74490581225c13693ccc1fa7cc2d485125709e2a8f8fc94b5856007816dc216e3e3100d0e9a6b2f13f79a9a6142fbb89977566db431337b1edb64d2944b7167805d2e04e3da25781d4cbf6f11af5b00d4c691ba356bcae4341cb4adc69ca2624ba91d08530a76c266bbe760d79e7610d6e339c752d2585e099ba41260ffb6a4a887e3b7ce56d5b7634c0390ff883df277117ce3b45ab4350a6cf31699c2b7fa0a18e1744a422fabb8cb31e00c95ddeb580e6c5d7d6a6c27357bc4fa219f0cd8b5b466c682087442081b0e3811eeb8d3eb36e8793ac054dae2082edfbeeaaaa603cfe6180970f1dc3318b47686669e20414f4965ef445fbe827eb04241dab328a94337735a4ce9a0382c4eaeff543de2c08539cb318f3698d5c08783f3b036594286c19858264a5b0dcf0057dbab172c602062856237129493e968baf29b2f264f05228137f9c26478009c3ec5fcf04e1001e78f3468564dce0bb9aa6eb886db0b2a9ce4651ba7852381f31d93ebbd061294f7373612fd404b3038f567e3214c109", "52ac63655200", 0, -615402274, 0, "34ad4cc2f83761e63e9e2003b6cee22bf0d0ffbbdaf5a188f0ae8c32d37a7483"], + ["b343ab4b0327f478f36a63920e47d8ac49bcdf4e84283e7f071a181468451b0c2dead067e700000000009e4c313b9f1c31dc03c0e885fde052521572e9f28463af080554078f3369a676a34cab9b0200000002006affffffffef32edafada28f4c318afaffb30346a14fa5d36ab45c5b9620903c6c6afb0abb0200000009536552ac656a6a65520bf3af38013b25a004000000000453536a53000000000200000000000000008ed68d0200000000526c68d33aa403fd99d8fa323d31f50a6933c22dbc7fe1b4dabbbc7aff21ea1819f53ece18c32aa44591859939d6fd19243cbdce5659041c5456f6cb6a4eb0efde79efe3b097871f5cf8c5a4e50c7e9bba8bfbc83a441b9af37b3b6a2dd6e66e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c8314e22f60060f99e38f05c17856f44ce754af2d486129a9ecff91dc46da07901b79913606077a3618c6dcd8b796a7e249a9f81f6a6619b6b92bc69f86a4978aae0b46d35229238be4c59af5a154d57d39d7a84bcbe14af63aeb2d34d9a5d744e670d3cd08afada6477cb98f94cda60ab97950a5e27d2ec2c58fe5963a26396020a7dfcbbe606152ffd88c585a836fd07cf7c40815f784657c4134f795fb409c6022e951921befda01f1a106c6b11b1330902d9a1c27a4b9588a5d4e595771752950a05511a26450a21a8602734fac0cf560f708e57e6f974b366f101b1520b8a9356f48d3a88bb6df4bcb591323fa8c86c64639cd2f867ba80031cbb8376470476370310359ced5aa6d08d7bbd2f4e4e34b3e2388f82e318ea3f6e09b932309a6c63e20311f3f422c2b41a0433ff5d3e4047074dc6bd97fc591c32856aa7910c9f7d91c7030080f5f6be494dbd63372c8780dce1a9a846dbe8fd190ab079245672255916b2030e89522abcd995140a89f80708f8b58335c52fe44282cb9c7b89a78ee6d89f8902271569b9841f2a223acec316b3c338ac8ca1a463a117dcf5d733a5487e585d96fc9351a5a3570ada6c8e5205be477ec81e32d7a201f002f860c66fee95a0c66090a9e84316309be6a7012ce6af789d258510b1dc36fa891616c4229c85730ee46957dcd95a9c30eb46b01f14ce9b8e43b769ea1d7ceacadc2a66a7d11f824461b7b5c2052d85b81fa5b84ceb504d8a4904b27c1f48540c1d725459e4a57e139451a510d82112af6da593d1a0a07c44cf546ecac6c65422b13496d178cddf4e58764ced1d57878fb7cd76f8d3948aee1281903316c984ea82289cb685235ff02e39f9d74cf99de1f614e20c8728f32dc23dd55830d8fcfc1a0a798615a2990bd61864cc391075218c6057ace746056c6cbb41405df2d7b560194188852c6efb11c4bc9621224fcc991613f314ee1d9178e1cee74f6088b7cee78b64f8505786fddb6fb43e19cf70174f836b0daf5061e9e3b6394b8d3b070f733e799e6ffcee5b57b8e3ede2d9ac9e674ae0f63d4c7743c2aa383330efa5af06174a89dab5b52c0b759e6666f7a292ff6dfa452ed044f449d6507985e0858036636e805d08b07e870bad3d6702d8bdfe56d374ae86dd4c0434ccaa22fed19d2a918df78dd4f36af8b1e694add1ad74a2fbdc7053fa79521da40ab3a260ebbf42497c27203604872adc5b488205fe755bc67f22d7785fa574055d2d103d0ce2ed0f7e8aa9b8902ddcba7372123c2c87a549d74ed60c22f42447833413089875ce93e86ff52a442dee3b6e8773a82f39f477b4a0b6b13e4256be39c868de9c6c99e13297feeb6c97f453338b69aae6017a5ca96aee7e2133211e73913a70a05dcf8331ae1b344320cb3b07f1910193652039de0977e474ee97b7a45153f76596d890243ce601f5fc4c1607c4fdb8e2c9c6fd130b23b76cca4969c01a65c1d5a91b68c850a81ea9b751df87aba8c4da0280415fa4c45e2e88d99858c069839b2005a52414b9abdd4cf496ca43712d12473ebf81a2ccef55ab9e11e2bb191c20e4511a8c4b306e72554092de46cc592207e8e67cf0da26c752ee847ef376882592ed373672db7c5e88cb19d5a16eb32536b55d0e349f8437fd957e1fa89cff02552353b5bf2c79c649bc86e9d76f3b31af8609b78c1face726b8f6d8ae4a802a802d47da60f9e4009fd9610ecf93b2567458b378451e9a8a81606cf301f8f4aede369fe53cc92c983b6bfe139871a1d1bc2d61ef62175e60c4b5e1f2fdbfe5079c0c5f44860892919c0f1f092a821be51ab72a26d3e842aedb08e6febfb5785f4df25e5717938cbc4cf8a573ec623ece67a669c2dcdbbd29c688b19524d18a4a92a2001f2077548e0570743be4f23e17bc72d61586f2526e5a82de8e252fb534005860f8f6f1384aef0f76af74a2a71ae1b8762c1307608cadb7ff5ae110ecbb580bf25486c53fc8d2f0cce60a4dbcf62826fe121e28f6e4e617d841fc1a11eee3639b6286ed0cf01e84b676380e5c7eca5efc49446508908bdcdc756bcf0a40745c2aa9a96e3f0d887ca358bac431d9c894eaf0232a20ef4f7d28c919126bf1750947c7d3dff8a2b82f21f2b26d005aba4443a6372a85f096c79c4842e981d6d4aeec6062f9c5b6fa6fdfcdb596273ecb2a496ae0da7e57dac19129db3d6db70c67123437126cc41bdff8e8cf306f68b6e59e6be457d24fb0f5dcea53fc9d0b061e0c9fabaaf64af9a06d1dfca105c58e6dd10c35932b4a62cf1ea6ebcc030000000000000000000000009df39a059bd884746ba1e24c45126608c9f15e2a3f2fe569d8624fc9342ddd5a05b09c0d3d3693da443077b4968a5e219200162626fed96313f0068c2318d57090909fd17d30628c6d0b8348443dd98cb41759881aee927236dbca6b5896f02200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f184a2075b2baf83bc6bbc6b4907225c4e3c1741055790a45c1cc45f9534666b19e1c4c1789fae219b44bf9864131a1f0d964660c46606502e1dd4643e1d38233b211b3539f1da5716472500f5149f8aeec6a5ee69d6ad4d3a8e892e5680dd3d3409ff9e064e04e34f36f8571b2225960d59c4f87663f897bd420b5d185b5d5d03174ead75626f14e66c5b9fbd8d5b1726ddf629ebf17192789960a0eb2bc233ec020aa5cbdddf74b263203e239a74cf5d4f5d1be41772d5e17c17888452c3763e730b02e136d55b9d8505b781258ea3af6028e847434110e408449cd5fb20eed644ddda52fe05dbfedeb30f40867c6d4246bab298769c83ce41f60dcc5b68ddaaa191022078907e101d4909c8079716486fe4def40697a2d3617c47d98f6e3fe38c72080306a34a164e8479a2c46379cb2e7fb5d2e6fe4534dbb8a347b1f5fce1ae0c8928020fd519dab0f7f236df2795fdbf4ec98fc48aa2c84f5f29b2cb3139d9ed48bcb80222f2628b3e7860336adf4f58c4bffcbd499d6ef63f14bef08a8fe39ed5da3b870312f69c6adf8aeb06b4217b5e11b395f200ee684be007ceea879022918f7145b1cc9e840b8e98f0776cf985af648d508523a049fb776e5d55f14e1970d5b782defd0f79cd8164f5ff2eb8e34b6c504ccbf0f5ae7b597c3915a03e682995a0459f82dd4f3f4280c3d8c176bb5a4bf7ae2cd7bf380c6db75fa40a6e8a1e00b9ab780f2cd51a37af3f83d9cbb3971fcdfdf1edba67ba3456baa3fcd0f5c5a1a59c760ee9ecb70498345bf30b967f68cf18f4f718aadd5d5fb5c627ff17a67de116aa1254f4e1db25be7188879c6b1cef547848f2bdcfcf9b7ae91e96f3db2df1913fc762a8a603ff93e49c7e4e6f1409d3dc1411aa5cae5443ed00262a8663d0fff00a61d50cba2ac2649736eed65f9e7e2cccf524ccf457ffd2e711dcff6dc1be359b0e438744b86e878afc32eaaf682feb8836992d1ed96a82e0ad0f5ce1626ccf77e1ab22ba0415e7a7c904a8f50da3fed29742cb514232c09ad1ea0331ee9a0a86d6ef8f5add412ac72d9edec789ea29205c10cacf30f8e64608f0526a7ef40d8881e5574e0b9ff901531d5775acb62723907d017577c1b4e69e99732f0259c7ba83f05171569aab5aa9c07c1651b50e8a8b3613d6adb5d1b6ee140518c8eaa67db363380110b800d2a9dbc5bd6c00e7b4959324f8ec0f2d0120af3c9911d2baa73364dabadc5fe98f966aae778071241c490e9e6849437e823f26be056bd0645bc12e295ff815a51da781815a510f011b52c7c668254dec3758320bc2589a592736406490a011e98f436cc4ba5a17c339b01ca3efccc9d3bffc13cc728346379584a039f1cfe3bc398d8656594cb047531c88e3c2e9823231a7b99a21759ddc45a32281895bd76c9116217187e732dfe4bcb2af7cea752d3093f280910b6ad87d2913ecb5d0858ea0c992e48d7c3464db784ea1faa3af72ab5f62a8c6b1c650bff86befa082b93b0db5511da40bc2111491429e9ffe10bbf6fb0b40efb70586018fdf029e2ed4f54dcbe823f4a41d80d071ab02af39cc8acd483ea542ca7424dc87201f90600d14cf875262d0fbffe45aa3cc8023221da757e721fab7d6a7442b85408e8745ba944594e187766c8bb3be7cef555efa9dda234cf8b46a0eaf4b754baef308a2e6252b02983a41229201218780d7d43c40a8ca847f6d9c520e322198dc62ae3361bb5997ef53de33fcd404338e4715a70ae68bc8a54b874c46407b609ec9afc61317a98c82fedace33d737c5bfc39811098b3b50cdb9719390227aa12cdc318ec5c6c3a0f3bafe4dd3a65f249019ec4bebacd44be8107e01f4620a62402943fd6347dbd040f053f76faa76f3f256174dafaeb6d6e5b2521f3e20fb5c325f28de444e4e6b5346a44131b68d0d6d4329ee2ce47181d8c97704f3e18213e8e01e125984e653a59b663b92586d1e8602e2fc12d830a0ea68f72d2e852fa3aad506ef36d98c1942604dd31414535b7d5f4784824d599a2db5a14544589a438eab16db0794053bf25d4410201d4cb5509bc6ed430651200c14f668f1fa8f215dbf8a65321063dc3791d68bf719c2308767c0340718a73f8772439b09bfa7b24d86e6db0efe8ee43b53e6da0ad0c1ce8d51dd7b3ac3e0988d66b5f8b1ad3805c102a20443e1eb8fa5017234fd54ef79f0a0c5fc8324e6329fc445f41f2ac95385de81cfceb75b25171a67f22cb2df50c8678ba191c28da3b45e3d51f945287aec1c896950eba491180c2242631f23f7b8f55cd2cd46726427b2b1a4d634bfa00828587259d7a5e4640938942a81ae301da8a488a002643d699d3c0c9e869273537b612af0a8a8925e40d4a1016a6b9b48a46d1079e9d4c4182bcdfcb7d4c253d836d0bd367f7c152ebc828e18eedc09", "6aac0000ac5100", 1, -1066185786, 1537743641, "bfe5fcb55a268208ce28467f53b8d61e665faf450d8d7a456d09202aad76dd95"], + ["030000807082c40303429059edc86aab8801774ea13423303f89dfc8e42d04cf0cd2ae0b20e78cd4620300000009526351000051630051ffffffff667622f929d9123ba734c959b7311c6d0839f2d4f683eea416452580033d70910100000003ac515270b0653d3254ba1a160a6470559eff998aa002f72c86994a33d9aadaf7bf57b5f99025320100000008006a520053515352f094b96203aa59130000000000086551516a53536365991d35030000000006536353ac63aca364f20100000000026a000000000000000000020000000000000000dc83140300000000c2e5f9751ff4755a3c503877a0f3b6a742ef3023c3eb13b705eb70393d7ec5b480827acc7abe6da1c97d156c3183b20b32e9de7693edf148c15326a52b76d721cddc64ed86f319519db168714f6fd5148fb43303c4872224c92368c0b8e2e58100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000113342a58784540ee2b195d1cba33a18811dc8880454e24d81866bbd7dbd74ed82a06acfa9a7bf138359ed9cbc05ef446a631b33dffec4424fc937f44ab188daa0350fee46c9f0cb90fbfab34024bff4278275086b8222abf7ba065a647fa3f0cc1d6e5bd0d0364cd00c4c43c1273b9cd487601e9f69b6a4e95f70d4de3487d4032f4eb9727285fd7a551d99d25cb21335d5308e91102f3e1bb37e9ef2924bb6f603045d5474088c4561da6fff2fe2756f8af78abd580dc822444efd9f1d87f8edf40a028fd10fb3872714bd89c821617f3896a5aebc382fa1b58b672e622c87623628545312458d34e4c4960054cf14d2832aef3947d22d52e727017737dde287a688030bb23fd26aa57e54754a0a3f00df39f47da5fbd268ae4834013c8239b6a0fc7a0319757258a6f5b04cc47f33d3195750b252df0a0bec924ffb383343c1d65c2d32031feaa824c5092bc0d2af893aa9a2a303cf90c8dad466c3eb535c9eb689ecc03702000fdc2030b6388e09caac9cd746aded3bfd30595897a6e55421297cf8bb45c8021c8ca7aa9ef2edb850ec546b6465935a8fb1512025cb0a99ece5e0ed95d05c944d534c991d3bec62937bfddf94b2a6d119ac7a605df9890d6bb18de0a6dd8fa9710a540fd235aebf719037e919e5719cd0531d5bbc73bb6e90885182f7d3db9ccecafe77f9a89f6b39561f414060f4af1b74cf999527e2c82030ea327fc3ab197a00ac696a474f40c0511b4a1d4ee8918ee0db0d8df287ca9e79c73affd0ea65cc1c454017fdf8d1fb9902a459a584b3019b4b23dd27d1ed5dac00df4b869a6a223921d3e0d7be80c1275850586536a49e1eded99945f81eef016f45f5ec797a56386ffccf0e6697f6e11a93b9ec1bae2cea50dd7deade0116aca3d63febc16f96fd9777f0669266e799f2d22c29872732ec41369e003c600adbfb9a036a3778195fb5cc7d67f61024d225740504849a5265cf5ecfc278166baa56832141ad549aedfd7c8d4a450b985613d7a959d76284dc4c7d16f1d116e27a07be44c18b6f0aa34d846f748045c93d29b57f0de5de31987f7f08e4462f14927aa4d97b04b405d56a7b5ea724fecaefb81473530968bb266370aff8e6b575f414e966a12205d7de2c5deda19a437df95fd73693afd8bccf13efd0d57fe74d33de48317d50a7fcc3741060d8b7fde57798fe12d75728f3c5a726143cb0b3a4cc4ed8b15c28dda507f88dfd897caef8cec651697abc59702dfe80c051e8dd1be37b244076aa759a3177103e83a10b76a0f4cb4c216fbe7329575cc245bca9e0841aa4e0e785e8f4e69bf779c8556d5c730b5db843643558991b481746ed8ddd67cafa7cb2ffef5f520b96d956286f702e1c02bf14cdcd7fccf76c9fff1def65060a2520b8b892c40d61dffa319dc3fd3b1ebb90f6ef1e4fd7acf15d601978f7509a02b00b7b35950c3fe706d90869d772557b456f6ec0656de3511071e691ea73be2c15eb07899adc431f2bef9ba211f8a8122b500a9a68f50dd09523a1852ea1c75c650214f778030bb2b133f685aab9097c5c53006b7e81f9da56eb861cde2295ce47b4d2863f0834bf59118a3309d9685ed87b6dc49f02b55e6cce8b6c36341d67dff0ddc95ef705b9715837b87f0649bc214874c2fca35de37c610132f55a3b1469d940490ead8ad83e5fe7df0644e31e49901ea410a87cd0d80eb3de1177792f94bf06921659be93bcb17c5cd5ddf55829891c33f540b237fb8e8e4da074e9f4c3afb2efc7604e9b2feb350a6f9971cdd97efe173d733f7de9f46d7c06b3b4842f7784fe9b2761c6d11443c090ce4a4644025a609d9cdd62d506078887ab78b2793be6b3700c64ac1b30e224c11490442a35d762cd8c17976068b790073c9b0b897f0af0c3fb2420149137e2903e0c9947dec860b72797b894ffacf525031ab9774d796f841e62e8b7754ad5e1e3538a9c6af8a1a6c820797c937ced6d814cbd167bcda662481fdafddbd3ecbd37f52a7ab13d6fd8112d094d09f70181e1640f98c798954723624d09b769e9dd454db313682f578ca2d69df4662a513c99bb8ee8560c43c5da9f1bf8e9075d72fe17e7d953db385082e1f90298c5bf276b60170c900cc44440213f67dc0173d20dbb1db50544eb51f9e4486f0050b6e1179fc3cefc4703c52c37845bd4e6a4b31dcc0516cd15623a0034f7113d6f961c19eafab3fb0603930ee16e87e549fbd92a8e7d1fc1a5adf68d9c7c6d58f0b7efcdd847e36df24534802b77ba5862a145a622a039ae708309190000000000000000d5cd0e0100000000a5e4ca6db45c9b7fd3f7ef72feb17c7e8e54a9f6b27bfbd893fa18591ed9d5328dc6daea0a6fbb470ac1589540dd194e0392ea75f2d7cd0d7d1c207c967586b58638ed137c90641e087a561e477c5a7261c938d0c5e90ba6548c6e9e6436a59200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b2bc2a61ff6e0d5e8d1bf575ba843ede6585d56a2436240358d539a68d341f2a3c3f7e0233986e5da488051b7120469d972dabeec0d2e84c0daa5491ef11cb6c80768a1fbb5f9e94cb0d2d6e5f8bd063d50e7df0602b2f4e1a24de3105e9491fc7827cb2d0189572f8ea145b785975c37f0d1d2cfaf0712d02e1b69b2232f1b9032422caa810ea9f17bbd5324cb2f48d379554355efbbe13b4e734ae57f16e5999020856da825d1111b73d5653f25484c7e560bb9cf47e387c0b63b1fab206f1ed1e0a053b4ea246ec67e390af9a405fb869c28eafc3482cf948a44c242024f60b4a1c9a7adb84bf48de599caec3ce1c504c779c58169f98ec6053de5efb0e99ae1728031b799a5c6784f3bc2b6ffe789d128030ad64aedf666d65186c2dffc64441c146032ddecab3e0b7eef4244ce4bf2f2c665093e38b70ccc9e9e77dec34ff3f3a12bb02014f05fa3efedcc5c10a9f46ed0a9e82f97c6f7ef012117525471e86270f836c020e445914d2dca9f82b873e16ed0f8b774b127cfbacce8255c3df5a3c503d3622022c7a26e317c99d80d1df157a3bb9f4fd95c1c9d8a5360d5d6fa82e026dd4b9beebe9d3550e0ba23734bb876ec8caaef0448cecf18435e7f629f86092de6c53828c4a9742a2457980029dcbc51dcb6556e75670167be8c7baf52d381d63c637a94d2d01517919e04a4f600627c5056fe8a343435c5816afea33ddbd1c58a19c1f73d5154516c4f8b86669c107c644218657ec6fad81bff1de433e625bab7fa6cbfd3f896a7f638db8d13f1c5e460c649f70c496151e58b417f0cff2e56e1d245e7a76d4d1db9ade4a58ae5c69e616c664893ab5e2c16fbde163b7dd874650b91a5166c9fc4c35aeedeb57f2342ab6df4494e1b8ae59f037eb6566aed473204339c571778c332330c01243a9dda596e21f1f37c7a859d42c809ff8e32a444cffd5e437c41873512ecf856a8cc2aee4aa811e0c0d45029c817b5fb224b73346013c20564e92803428f750f4c1574747c111d35e11dcb98ec075672fea7e0a504db4ccde622c7575456b7f78e64f9e8d9aebe616954689ae8c43b0c322ad83301f36a29474c9373fb1b297f8d63cf3a2b9bbeac3aba09a9a86b74b594dc627c744ddb4c334cd18b3304d0b7987b3ccbfb628186ec352bd53d2f5125cb75f080b987f636682c90ad879f4eecc3e1c52377315434a1fe60b434f0fd7f52bdfbfe6d3bedaf86b730f2104a0c8a146d591cc7434ec6948df10abc39ed8fdbd85fc57d2c1de8a7350d41f05256e9967297a7463ff40c2107b973d9d1b7eb651fb2c63aed4cc5f2c7caa8ebf685e753a342da11bc66776f56ee20c56bc79e402f3a2dfec9ee03c6872fa6415504a1d447c00828b41b36cff1edd8c52efacf59eb5600a6746049fcbc8cf016990b3331b16e9cbdbe8940987c017e7681a0a8e3866ea9bd29222dc2fec6fc3178c85c0157c10d3f0d44b2491c2a004b0f63a41d937d77c44f5261747930b039b6f4a38f3ab9bbe620f50eebc2e54d3c0e49570c493ea1e453e6fa7c344b8f4cdc8cb777968e3aad61cb7420f57b1c2e14182e1963d5322b5a097f65b7390eef2fbc14cc92e2924736dd60b9ae5790205240b7a93a785aa724c6b1b1d68cee6e4f59e2c847d4c8877a436ccd3e43381a7c89b8c678b9d87e149b9fc2d20f2c81ff1db255a376848bdb94eacb785956d34d2a89dc9ba03218b2425f7649e7fb643bb25823d77127df4ebefd0d03e750e023bbd3b5f7c29f3f9b726156f0249861c224cf79fa5cf87323ff00323c390aa5be9d5144b1afa8aae672aacac1f5af9a1bc2085790ee5ef0676dbcc0093e4359c42b6ab183e75878dd33f714bc88d2ecdaa94c378224bd40a896d7bdefe46149903cce3b73b1761394a3a41876bc002d775152587754778e5e1beeeed729d10020c55961705cd48e28bfb3760e44d57704c9a17e1519645373e12cebbe1ea57e9f1394e1e5cfdfd41e021ed5d081789f05f92b60fc97f3352049fa2950a44ce088fb795869232ca022d34c7e9668a2a4b10d6ed296ebf3d90ccc74e0e11717327809e46daa28db120fe7369e9c5f5782228b475851a329e9989751ef9a436fcf030a435399a89da6043cb5a2183e10732092085d68f473207bdc0fdef6d31238ef1e51b2bcf47d61211e5762111bb87be361b5654d680a632d6d62c5e61f81577a4b359570a651a5e9aab243a0743f2d0b83600f8fa81178abca3b1fdbec86e15b82c5c2cc992eea8c4b7da9aed6170557197e33cf9d4fe643d6a2c8545f8489153551c1f51bab338027efed4af2f848862c02c5661593a77c63b7f0dcc18e22e3c91afee5a009de7b132e79720814559981a11a41da596aa120b40232894093f09979a6ad1b71fa457924ddc912ba7183484fca98be66be01f3e0d", "6a536aac5263", 1, -700187145, 1537743641, "f37e713dbd68fb0dbc3b7a371e1e32557dfb28bda58a674d278b1d0f4137b8b9"], + ["d7ff0827013cc62dc605cf7538fccec3be79ecbbdc5304e624a37d25cc5aefdca0c07c9da402000000036aac523f71f3e401870dad030000000006516352516a650000000002f1ee3f000000000000000000000000005486b3b69642eb3a6740f54574d18223125d8c4fadcc5b118762df216ea8b4ed0a9e5a06a37ca26cfa7d11537bcaa7c64faa83c8ff00fcbcc42f7df835845b91766d0b2c5e405581a664d1f7d7ccb25ecb33a777679e94f433f8f180a370eab400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e9d148a3f3c1ecae94a9e7a58bf0359239a3cbe521612724460754ab6d5a27c5ebdb2857dd04f1f2f5c181117107b934bbb25013217806a00ce2dd99827d6c5a90782ef71d892a70bb2f20d02de35c0cf7109c5acfb1538b38bf29b4c4da77ab5515b3fe89e0c73a28cc656a5efe316133066e6ad19f6e4e9f1c1895aba032e1032a7505ae341e56842fde7bb0714a19df375aaf8fdc4f714ab29723fbb16af634030730cb37572c094aa099e37a7068cc20e6207953244f302ee4336e5549e34c140a04aff3d3417ab2a19f43bea6ea03e9d1d5267428d0db861d5124ad5b2e7a6716af3373b6e5659354a30abf7bdd2da51bc29ddf1429b9ac93e64a9f4d4f1404100300120ebc523d8069bcb4f9a7b6c95852444cd356d42bec954c957207d5496f65031dcb00b6378c728c31f2a9a536dc19f6eb8df12c27d76590f45c005c844a96df020bd02a113133e86d92658411a75815d215b826cdd278bcd3e672a0b5dd0c2c890301c49ee6936e7ba5c32ea29a34520f8726bcb2fc09d886dcffb6abad247e96260211765cfeea0666a79d53a3eb9e280dd8bde806f1200e73632b22201cfa00248a18d05e609696c48b1f22d4b8f76f870c427505c71a718cdc8da58b6531c636ae9d9e6777c195ea8c66bae1ba282340feb352881ae29e50fa26985bc1777e1e4fd4d02952f03926f94c5a1f71a436fba3560eb302abbf902364c5daa88aacb65a959f297dace0a52063baa82828524a4cd14adb09a358a07829f1e46c0b94ffd66841f70c269fd5a516ae7dea2dfaa8d58104095c18893cd58b648ddf201867843a1fbb3033dc064c832098af0950a01472b46a22e144b2b5d46cd72d947ac3e5c0ea64251115d56cc20211260e21af879398ea67aba6ecadded2ae8462e4803f22952cf3a87b4dd2acb9bc862edbb0ccafcc18217d915fd9cbbcf2758ada37379d8c7136157eb7e8b9cc94c7eea6f3d5fa708428c524d3e99a6c1bc52ebbcfa4a92e9ded20c671efd3397a120d6398cb4d888fb1d5a0bde2e3b0b6b73bbb29718d5ad75581205d8995468197da70c8a0cea7700146afe8067a14889ced751b0fd326b64db530c5a8d2893c8bfc15889fcede4a92a662b173e4af0dbeeddc89cdd204073d43109858fa636f296b9ea763e127bfd8cc05a3ef1bf73a82c3827cab397f6f43eb436a4731ade28d854c4c83365f35bd95eab2f46d768f343d84a290f3c9ce6b024a8f2fd57dea4a567275f5d1689cc2e067d6785b968409a358fa193665aaec6c7b2f20c9c12a86bea75f2f93605c4a622324c4497dca79207f6cc47f96ff319a27f2e3bcaa39362126cfdcdaba1636e8bc1a7bc447a6873ef1ceea7b7c71b75ea1fa1601f6fe48f464b44bd684f66ca1c211cd67e2181b0dfc61c04feedbdeb8097a024d0785a3d81fd61e46b56d6987a56a93a624a068fc1f03e96fe348f98ee1f9aaba827d836f3d77bb8fd9d543f781c450029c5696503e4757869b6b98a2897c38ef42cde6bf4cd84b0d9a95c73154652e9932e35a3db5d8aef81a9f927273b546c13d2bd82e595fc5d3c411a6b83898af9dd0a7e093524c48dc06c47dc2657611a8b677733f636c705294980402aeef045e04b985e19ca25b4080ad61de689273f3f1afc6674b82b83196e8be9218d8d9061a07f55482db0bb2f587ad7f751f644067fd3b056f5ff7434a8f2fde063865a47ce963b98110b90dcd8ac178187e51bef2b9b41b5d6180ffc963902f3886e8a171b9fe986f83c35c358afe9775f685f470c0897cfe65074737c38f7810512b3682be1fec7c4b5f87cb5f657ac0f541d95733a0160d8eb68e90a245fc025f974c0c6df8c50cf222b03e0a728d9bcdc02e5c236da6c45cd85ff2c007249cfcdac90cdc18cb8dfc4ee89ca3bf161e37adc31498f0c4265264d0bc8f56aed5133270e93a4ed53cf9247d2e6eeb3e7f8c1d721e8d950ecda8fd978527b601a6935536462e70c26291a15ec05119124308df611fbb07f2b3d21569c7e8895ab5d068ab283756e76412abf1c0843361bc5f00881ce83ed5a9f92be15b9f42e684147c0a88e5b61d5f4f4c3641f51c8dae1db931b9fdef6a3458a1777359b547cae63616fb06964d5294065626d23300c0f19ccd8c63ff775242e71d6d44b971be352879e3f83b1fb858a6392f6db526616bb11709a3af8688c7d96ecb71919987f9ad24e9ec7f4b9ed28b76545b17af1532d3631fae988b6e02ba6389d959c316099b124a13c68a931b321848a3254a76885c8b00b6f12d3bdffd5134662d4003000000000000000000000000ec9437123ba462328c6de302c3c4dd931afd4154049eb6d107213997937bb03030a0d2e0832a95cfc93f67ddeb1fe903f888930cf47810340c26cdc1ce1d29637a5e76077e5ce52a8e194453cae4cad6231afcfa9361adb637ff9fdf9c83321100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dd635fe0b4ef10e2e06a332609412c53b055d308b5bdf79d175a864b7961704e84ff210cc23cf37ab001e1e0f6b2023c6ee769d4013951a3c75ca9eda33431ee7d86bfd818955b4f61a3752b4d376b81c63d71e5a38de87891d8c64329b3d406b1405ec6dcb5d1702b246e1221a5ee20b2a37efaa97f2426edc886c34d57a3000214c925b1e8c17fe4e81925015ac0ee73866a9b4bce9e2f6db3f9bab6bb96506a02084b3cb5389c23f1c9190a848b988715642d1ae0b0efbf9213286ed5c2701c630a0101bbf1ed4a89c7694a0c6d8d11f58929d1e0f0f8fe1be513b2b7d6468c62f22998836df086556591459607e976c30b3091c05d5a6a48da0a3dde038dc35ccf030b30989a84d7a3e6a50d7ca9c2d39fc7708dab8c49f3e4c86e44c89dc0f6ccb303029299e1b98b09b68ebed05782a82815a20f0e0d4ebb8734c68b8c4551eac68a0220de5aff4a637d56f764bf7dc73fad96faf6218f13778f97d1eeae89ef33941f0219a36105365f80dfe71e5be8f8e3e5f3d9c5008a4f067fe16d72130195f3b3b9031e53e43672e7c069ed777d2d788853f189d999b11d44b9b431dccb0bde8d519869f1c972869735df6747c171b0b61686ab55bcd1902d46d265cabac5ac1a543eefe8fb4674bdb5683b9755b1378706ce0b57a8b9eb3ac58c3d049cd3ddee569517665f5730c31c25fef3757078e5d47d293c63e02a656a66e6b20525a370ef8043ce6c00fc29ae66c51a6d07ad8fbaf87bc585640a643b7c2896666328f0d00e5c7285e70cdac3c6dad73855eae1e332a571f4b75302a31428897d0fe7997b15dfc5cc80280d21b0a986e8ccd9dd4b25e592953dde985582fcaaa6cff9b2432eb6c26ea1605b796dd3430a3edfe48f7bbce4c47703e7880bac318389016c1a6f8584b2306b605618e221a78486d55c7e6743ec80fbb41242dc57f5b3152187eeb57f3e2d6c91cb101f7021c44b741fa90b8a48bcc50e41420c18ad31df8f9b4612125380980f371100f2d32677e3aed9f11fc7c85ed3787211cd06cb4968a86abcd18b481aff9598b0bac29d074d29425e21c3cc1e77a14a3695d0cbec7c3f69856a5ab89cbaa7bf734005f3540a5b8cef88d7ad216789de072cf291fea8eeff98f842c805b7e1d8df22429d410a32e0028a710ebe5d98a3d1bb9730890e76900e4d044b144a0a07afd53bcc245874d89f3dc1bc9aea25e79e61e14be9f7c70e654ceabf01e38d4817058d22cebfefa8da7588f47dbf9b0708ebec8090ebf9bb59aaec83db5b2865be2d7b708e20f79665b056e4e995eccf5f969e8c77a08c8c0addd054eba568398e4bc9008a872f3cd8d372d86f979bd9055433e3b9b51e3b15a6540b21f6f938c7e86ac98b45625a028383f541ad76f42dcbc360c03deaf7e2b3b795d385edce14c7eb7ee56c3a802635717fbc1128a606236c064761102b1d3e8a6857a5d2d844e8eac79e5109d111c442b4a0551b9e0ad6a9242865165137b83ee5c41da5053b8501a2dc4a3c27a9564fcfe4f8d439ff35d5099164b266ef90271912716519e08d60cfa8b9f36e00215a26511c5b17c5e9358c21c03ba0ebd0bb20b98585eea2d75fe2746ef7fbd92f5ab1cd14d1ba9e2dc18a67473ef0b1ef6bb3521f19e9943827eac22de133d5c3b4c962475b1f09c0f0206dbaf6ada2ff7ea77456e336fdec9378b8b40f6cbc61210101c27c2ae96f993beec612d9466cc06f8ee50615e1b09bfecd81b23ddffb5d37130e70b670a099d8d9409d155f46f34aeaac19deb1159269c0dd95a5bfb31cc0aaaeb46d260ae47fc3499b636b3b8916c4709806ed8492d51c058c742b2b06414ed8d6c24860b7eb502b7b9900f112b9f66c13f334d8ca4f17799f44f86feba2318b1eff0ed3a5dec91ca9ad83a5fb5643893e5c9b72b398a898a2147ca6c69b27fba356ce52fc93cdbbb59bc4807d9c7140d14f55fdeb3da20fabd42fd4ab50fffa1da7b5200219fd92798e3320ba0fbcf05241bdb485e7ed0481657f560d16bdcf6864b63a1ab093f0cd125f16b2deb1d9abf884a4e50125a14bbde133d8b77b26f196065e364197c71da98f49ba1f725be6cf4da023c9864951cf3df984b2600635eaa119f77ccc32676f69fcf907a2e416c2d527fbb45d58d6234642d2ada5e89a3b0d7ffbd6d8ecce51ca51fd78ebcf3d12788472a05350d21ea9e17f2616defa30355cd04a3c2d28e0cc9aaeb9bf71208da96fa2973b5ba5aa5afcc66ca634de31b7daa5fbb479a2065da01888673b949246911e559e7fa657c0c865bf9ae9d5e58ee3a6f5fd5a92752c76e1f6c45d300d2b512683bcfa9042c2b5e9fd4829f1332fdf871f2edee989602d91838752c9888edca054d281d3f523f7d1286468636e03507edc547088dd7d6283e807b54983e90e78f47ec0bfaeb704", "00515163", 0, 57299556, 1537743641, "415586efe52df9e53f53ecd83d1dc8656b2ff18e905a5a30973fccb233dd04fb"], + ["c9843e08037a65994b56b7f32dbd2f843d055259c2a59506952d5883795b1b618fd353f21b000000000600ac536a636affffffff7eb0df6da0d2a82f4453948f4c244d1d6f6b0747cd60b67b2e7487650534e77602000000026363ffffffffa162c27043b8d0480e785f4cb0882af01d56d42ac69a11bed9350936d420e121020000000653516aac52634dcaabd3049daa0800000000000953526a52650053535297c4c10300000000076a515251630053c4393b04000000000952526365525365636aeea6a5030000000007516565656a52527ea0ec080100000000000000003aa3f00300000000b1d64a726f8fa31a88845a4f0f744d697c9585669546760914c07d8d4d74cff367f43a92c4d81d188fe5a047ff2ef29e70202aae34814048eaa8ffd0189b3a3c1423f917232a78969c340eec305e5ea4e224f54544b5460a9770af994987ce4400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000229f13521ea632dcdb25b93dc41605e04eb4d9bbf3206fd244d3e9034d9629abff4747bb244553f43f86d9324519449b48abeb877913a4f3f53fab60666f33981803357e51e83f7c2e1653f2d016a1596c56a86c785d9065d5420c2ac71704a9646ee3a848e928986e685f2ccba0689dbd4a7805374350289225a963aa1cf4ab030c210a3559f89b37968d3c07706c22ae7767e576c9dc8587a9fccbb295aebf99022a7613f62e602d4a59f7e7958c67bb6d182452071a2d062e84c4da45d182d1830b06b0e63647cf6975f8f51ab16bc75809ecf7779b206e002de621d1b41dcafdf78b5b299b7d4e997329663ba7ccea8389c9e0f1d36efb5fe91b5952cfc0bd2f22031b643ab23ba3b3f1a45b9c1d4bdc6da937865af972653eb579ce0b209ae4f8b1032e943cf9376044ff17be8291ada36dad9420fc6cdf9c9934c9dea7cc683f3127021f0298dc5fe7d5c0b15bc69e1182dc6f1cbaded078df1d5a98863991764e7a7b0226fd5043391409709c15b051e7a3382547830e2510ebf243d680c8696f2c4c41022503930f47c1398ed984fa4a0e4c54da5ffbfb2822e7a0564035e8c7081b954123e85a82037e9b31f127afe62c0bbafc72f5a9a0fed3708939fb6bf5346ec6f703cf81e4ea2b1fbbe9f9547506da6d03cd27b808bd758e981949d6f0e347734537eb83ac94f927cab24e68d15e528cacabd943780244e1b6f0bcb6a7756a4938e95c05b151e62c7feb2a3e1c35863f73c9593d0a889705c008b404c7fc7f7e30441e68f910679f9c90fac7103d5481d02da8dcc8992f78f8a71537fcf328632e00fcf07d51adcbde0a98c9ef52c5a0e387959a335930bbbfed50698745ab45d37ed0835a67d806fd659405f29ad9c788690456560e02f10a4755c7f28743379f91ff7d230d7863e2d398301f2c62dce9eb674c61b248c4e6486c2f1925c60b850f89b082bfd148853ee9b271175504e2cdb48e7308f723c2428f7985ee5dc583f49c6aa25b622dce637cb29b20f3c713bb904e0856709b7f37d7c75bf859138149eba5483ca178a668ad7c9a7098ee09f5c8aac6e776ce0ece82152fd2325ef465441623b3af2aa4816d5aa2f436dddd07773ed6250c62e84755a16974953aceb348c2518c31969ccba8d241d290d6b8b61d479a4501585e2fa55f7451d8bbff54d69716673d9c8f90eb1493d86e70827118ba14dc18d045968e4a574f0ac3211be15960a106dd8b30c45d344b45ca95517820d2020e460f595b20ba2e1db4b8c028b85b45630ba311b89fa90033e0ece49818f5c58c73a57d5b4c453fbe8283cf037c4864a0cdb7b05ae2e51abfbb728e0e48bec846c3d639f4b907b9706d74a7ccb2a08810a2eaeebe84bbd4fd9b7251d50137984b68915b15067b9411458102f326bce1473e0ff8b01d92af2fb8b499157ff3d28e3c8c99ac4562e99504819bbe798dccf34bdf236bc2a91c39a0d8f18f33b4effdd2553104ef26ac656537c800051a170f5fffb24a82e929994f0db36682e7c7263e1a9ff49719dc162d56f4a2dfa6a080ecfb3b0f9e30c541975b122a43858e8bc3b754f0bda6b327e013d710a50e962b9685a9d57f482b50e2e037fda0bb49b48e804009ef48521b6d95dfdfa4084dca265b4989f582986d28474d8bc25e26301189373b77434ae32982c5da7819c0b78703c50fb347a2df2fbbd46168958368eaddc590a8bafbe9151a37f9415ad4c55c63895e7213475b3dc35c6bb45296a071be726ad7f2ef5b5904e5dc8136c3a0487d577e4be00a83d3726962e4db15d03c54ef7f1cecec0c84052547755897299918e2f28a4d84bad78015fbd8ac0c6933ec6969f3615635b645c6b79b79f4d3723dc4d65e719dcc9a30c434bf03f3f72b7f7b127af711a9e7e21b82d3369ff1fce90693cdd92d3134a44664890457b68472275bd49bf4ddb1e5da8b3abb0f27d0dd7f3f87f97666b201e2b618fabf895ab73249c6c174154b13fe9023d516beb52ff355c9041333142435042939b2e4f5d824770ae52d0ea6f88da372ab25d0b57edc75f906cbd694cc21188533143d5cf09279301e00b5884de193154251753017e061d3597eff2ee396e12054f2b59c9d5a7b6041914c57aa42682c2896122f05d80156b003ffb1c2a6a098113b1b18f4f396558f58c135faf2b71387d91010a7b04586a59b4ad57e4e7f73eb5875bbb4a4ce5f04f1a43b1d9e7258acffd7aec7416febff03c965724cf1221378fe34da71c4f9c0c4c39183e5c4d84feea72248027a88c7c2c610085a2c5d2de52a1a11a8105dc3819a3a36f4eb53f86c471311d9f82b38432bd0ee20de60685b54f571001bf4b85be798c34081f70207d4451672dcf546b4dfd44ee6cde2c62c1a7a40390f1ef715a78ce8bdd7389859fe67027e6a67a3aa34b6e8bd0b", "52635365acac53", 0, -1950102242, 0, "b51d7d00700ad62a5d74dd03e3941cf0ac980110e0d48b6cdc1560f81ec397d4"], + ["1fd16d0804a90716067b57b6c9540081646b0766b375ac0ee9cef059bbada2548b0ce5471403000000015322c69c7fa5437e6bfc6819f5076ec5913e2eb0a1cdbb4a5d8c423066c020891c9554fddc0200000002ac51ffffffff99624771ffa4ff7380e90608756a05072d5b2a7a2f8fc7b563d5b19379c0cbaf00000000025152fca2632b6835a7d86aeb677e3085f9595fc2f8b24857c6d07cc92890ad35205859c77f9802000000076365520051ac6361b9a92101be241c01000000000651526a52ac516ed65b0803ace66b030000000000000000000000002bca0229e6dcfd7d7ee5ef2bab02dd4f4755ee409e1fbd0c4c4f3bc6d7511c5835f8c534d722d1a9873f9ef7fde2b16869ac33ee3733f966097b1b4f2820a40041a6060be7fde3052faaa3c204ee7f530d10562da8d370525ad73503017bfcf700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050ac06ca2510be7eca65284aa3e063e80179c34f461d0cde7ebef6c80c05c14d0f87807a5554880d73eca867d89bb4ddb95dfdf9c1bf6c58b0f1c55119263aa5e540577bf59847e8a11a37353641c4206482d12b424b55cf558c47901c696cac71ee7229a3f056035b57e0dbfb050fdbf333ab1e75627ab50ab3840c8a5f75d020dc56764e95eb366b9e36a826c76552e32ab493bb72a5007b2738f094c6cffdb032d377ff7c0919b05a681320a687670c23966be9f5aa653f4c8fe0e5bac9965cb0b075b129f057ff93b7c28aa85d70b03c51d6f382d6299bb64d2d8af676c8092eab921e648dc122ac73f7c26cc9173924736e528945bcecc537643ee52c840cffb02044071088562b9d93e75f08a9dd7d659b519c7898974a03d678a58bb3f4c1c2a0328d3633dc16c93101dc40be3bef46bdc25b2d2070df5059139c7f565936e058b02007b4bca0396a3d1c76ea000ae440fb57e580a69e7136fe9a5e97c5084600bfe02191c86f9772a687c636159b38c03f457c3f82d8461b460861bc7204ceb727eb6020e2d04582e631943bce08f8c7ada72cf180c6806d9cf1fae1e908e82e61944a4d3e4f97ee31d550949a58742f9da4f45ca01665849bb465eb47f4d70af42d9e9e00efc8f1386d61b3dec6bea76d24a4211e0cd3b32d073d602584a307a3eb930916930a52626706f232db147b4180a1953acfaa3d58b1e09bb6f4153d3d373f0dff23b6a8f84645ff25e20b0fd6bbe33bf2ff8035f5511b63500451a02c45e8325621bc4b1e8a02474ff24feae47b2cd1ad10992f3e9ef9579086e3a5ab2715e19e027434446a7c74b5e1cb725f99c27af18426cd0153d5dea2ceb2df31f956235e6c1cdf4d90c6e47935168581d599ae208fed535010e24999e5530bf53aa93d92c009fab1f5b66a9a97704e6af5fcc897e9cc3ce07672157853f9a35404990c3760923019c7b1aba6feeca3b34d24ea90e7479d829736987567837ca7ff8cc0306af90cb05315762170058ed5e5a1430114db9150af01ab95aea198976e1c600b11294312ceb6251a9db8535810d124c780c089f9b59c3da40f5d89fdcbbb8bd7e494c9ab7242cf6e5e0cf50d3cbb040aa3fd1ba3b24e4897600119c2ba1843f52281c4da9e05a931e433c8a03ff492b3131dde2fb4d52976e55d640297991a1fae2b4576190092a855a3a66dde91423f921354645bb9005a4c324489a10868bb9de168071a40af2bbef40bd15c626bf577e0bf9a3e0f154319825c0f030339953cf923fec633afcd1ad78d6965ba5001bf1fb6f1e6d84c7e50963d9457c66ddb8e976f3044dece856df44f19bdef204d873c826b4cb03e23bc8881b20332a1bfd0313f3c9c50fb966930f4c405ffdba22ad0bc0c9067071de66462716bf79b55bf59fe9e7b6bfe094ad4ff984a3fdf4344a693a47801f9ea6aca0394dbd4c9758a4529f51fc451e69438b70a491183a1591dcc5477aa186067a99ba08f568645eba3bc226708cb5e30cf3ff042a2bbb23971712603bc27907aab75931d393f70183e6b1b858a265afe91f202cda1ee1c27e62a6a9efd026315fbe2cd45885f4aeab7d5242b9539322b66669264710cdd3f29a6bd744b52c3307bfbf814cdefcc90e3b5640f2b0e705aee9dba8da439b732488c1669ea187f3fb239a4ebe5c730c8f15a8ff30a2e0530fb1be8cb56b0e94d491bbbdc2f2ccbc1c69139c0e7f525ec615b5dadadf625ed38e78496932a635eb298e4d93fa9c0e905d84f67fb9bf13c7532bffd07dd119bfa150bd0891dde6809f818c0204c07524e869693d76a140c803ee82c756657630a6b843c7ece364a2a3c968982a2e2d4569eb4aacb5beedfb9061fe19cc2b7536cd9993f2fe0ce2d5d4e421505e3dd7712a04f96e0a5a772bc6f6e376881582b4a51350b70659ae238378beef452fda1e1569ff85ea0231ab4d33a6931aa2e6b7eaee6da93e0be93225d745749e34fd34d9b723e78d1adfcbf90bec165f4ddf3343468e7c7ea9ae7743b192bb3a9399c4d530125b8ae8d087a8c7cd3d12b02eef93282ecee36ff92559d2f1e6ccdea69827cd6fb75ee6b57d17a5742ccb30682edfa6db66aab5008ad30314873a88e29f1f2a3f40fa1c5a664512e6fbc1d5da7cbe049e0b468824eebe31316884cb3b6b3586c811895bb3d6bed840518ff6cdbab7f4478599b1fef05f453ba947bc04f7f0c55368d2dd9cefc95f97400758a6bb8e95b59dc4beb73242d2e0b8364036f838b8975b486510119d468cdd1a7f93ad150aec7c1e662b00000000000000000d1ddb0200000000ba68f13a517a10ae42394076a444d854a00f8a7a4b85f1d5cb13085f73185e5897c6130ab60f9fc5caeb2a2b2945a944a14a2846a157c383bbd89c80cdd295f992719e4b4bb89a84ad514e25463b9965fbe623ed6fc3bb56c86704e94d666c3a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cb21bc44e6b31ab61ca593e62cffefc4fd7c90150135cbeeeb2e8e5225424615dd55327cda6134acbc126ad3c917b586d0d972d4746e989b53e87c9278f878d2e71b852de9d073d22b3f4fe91043bb952ee96c8be07577f6c723225f8eaf507cbf3ccf56775589c22178f6c0c829b46cab8d89f666338093a665b563ac19766b0319c56c1cd39802378c6f6a0cd286dcdd221246b05dae36b9a31433f88100a2e603181911937e929d96e0d538a32a8cf60885f18e940c19e34136f7fcc186c510530b05362f92998733c9188c40a9d0f2e835972120d8d5a862b4163d79374b4d1ac861cfd8cf9e9fb53a9f465c2267cfe5cdf12f8a78ea9db8f3bee87413f12d07d4032be44923993fa4b5b1d93c6128cf10608bd583e9aa027a910be0f62fe3bd511b021714fab19939b1398128f35cd6fb995f69e3692946b0fa7433ab362096fd6c880201f9fe33d8c56969dcc2798ebf012e0fd8c9a0e33abab2793da499d2c69df723022d9b2761c99d171ce06e001bc3e9f7753e7dc57d8d8e33035b4cd90dafbc050703165aba754f9b8da81c28fb3b5a4c8649605016afced967f141f68e8b08ea64a9916af555de2166a31be53bcae0fde958be8586c3378d221dbe48afce83c17e30829f528d81671ae93dca4f02cd981a8dc1897253e3c062092423aa3c38696a3ebd664e25f0dec3baed472a1f1e3f5e3240e08400dfef1ea9337b8e3713e7a8e8bf89dd242c4cb699a19000db57b95bc4256eafd34daf4b478776c8781666b1c75b805e7475405545202f927bcb3c01f9023d05402fe1bd85e31f4a9767bf2041c3d83275f5484ce135ba96beee560b1a4e13599cb174841b28e2f739e070ab7f61f787c484f6d25d3d2593c02b99fd5612d625c717a7fdd0d184aaad0012ca1b2327a5af3eed1692f05df67373ae16cf8e727f1bc679faf8f4752e2bda8e226791e7066563712c3e7f026a9031a993e88372ac3aa87bc4555b112f97c28d9ef052334ddf34eebcf904ce51f43f750c74f796a8adf251006afcbb13150fb8aaf1b77e5268edf3d7659d5dd261763e9f89cc4d7388c8770cbaeb3035f96cb5ab86cab0978ebac9969e086242632e0f7cd1c7b07e6e13db27c2a986b08594466a4c8728c3e647c67e8703da1764f117826047c9d3753ad05d72557ab24514e5c5a35de35f33cf461542eb22b90178966312f7f4464bff4527894265ba083a8c7e6f5bbbc3db98eee6d61c2d20ea9b8db44d5022223c2be8178d7584a8b3cd56e1b6b81fb837b9cbcf523838aa05deb146e18f081b50de044f028dd807047a226ad631e671899b47037111a82536ca7f7f62b6e0aca753b13e7f2365082c9a00b249e99303e04b06d6acea86f7e05aa0824d4e631ced0b8665a0d95032483b3817b8b15c7b0d84c12aa4467d771a3a4c2ae751494dd6110938743073963c10188541a43f3ae9c376b6393bcec3612b5c4498c8e3ef1f1e62ff34b09f433208f098cfb89e0740137651d75e0b64ae0cd5b6f291ceb34b95d9664ab01cb416f74d44a8437b6aed0bd179808d3e20a4c90e2195733ad884e6f20f59328c3a68f1a06e91b309adfdb6bc78dc53a8b054a6b67974c4774614ae4f19903b05aa49c91ad38e53e07c041a1b21d24307f9bd58ff88ea37588dcc2818b1bedccd958834426a2907b4e34748a858ef6d5c225433abd7c57ff3728ea11362336870be92d71fa8717db34d17e8b6c89a0742cd7d978c0612215669fddf57afb375d9449b9e11c2ecd68e9c2ad18f0944a7198e841dba1c3c52cffa5060f261c634625b13afba67fcfa09a41526914cc5fd0164483b2b5220e2ede2fc0f4e9204554ce4644d6b7cbda801ae8b84a43872b51b98b9bc596b684ff65698a3220328c93d3664b5d08130068698bb01f10d8327bf639f66822e0017cc1868afb95241c81af04d4c5d992a4d1edc94e1f6b2e237e81d777611f541bd8bb708d0626da4109c00008db002b8dc0c689fdf17dcc7a80be3aaab23800d082f049f97a63e69c3533b7c0b6df92bada2232fe49c78030fb89f2b56ed0d009a174ee3a97f76976b8ed1e9f76b7c4288eb91329a2ce202d7948bd413a483bd778080539f96cc6317a5b0569aeaf84d9cd772bc528ee29f3fe501252fef2e5163a4170927d6d8af2e8a9bf8035ef33d57416c524cc7c50c4da219469455fc43a4c24c6df6a3a8b111b568909f4ebd2603e610c7d93beae358ea121f041dee158f17df252f8eca16ac15cf6f7f33d5af8d1d3479606b4c36245b5b27f1baaad83d371da46e01000000000000000000000000be9d237721d3249050ba6fd25c329fc8f8788d8caa52420721062a8088ab538e9d3023fe172b737cbce8af1bc2d542b42beea00f9254dfb71062004eca25d6bd86d88be8e1333d76fde3bac22873bb084a1320f888989c987ce0c297677d155800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000538b90eb3a32009e818753da686ecf93bbcfbcb1eeb06afe1178c1818b9a763b5ac50b299e6e8869e5e3dd551fc830f81a008dfa22209f5322258ffcaba35cc1b31655ce9ee75aae05cd8fede70472f2e473fa1268bc55012b8d00ae41a98f2b687b88674af3b8938dc700bee0b065db72c3a5c939994f982b98c386b1c5a2a7021681b1b76148b7204afdd2d0cc6e61592999ec2dd5ab284d615699f91cee88da021df01133f5f7101f945033483809d97d07061e47912629c7cce25fc82f390dbb0a0767d0617adad0816b1b2d8d08f9c4b0124ff57bc064bfc943e698050251f5e6a13a048942f67666472269293d2457b7018ac9695113f2f69bfbb363da07a15802255761cbd3880628f0e17d95bb0cccf916930fb1a33b83e7d160c94ac06a2ad00326ffea99b65b6797112593115e19d84097f97ccbe537707b39984384d5a9e2d6030d8ad63a78f3c9e7db1d402ed481abdd4dcc6ad91122cff83a5a098a6eb369b003233bfc3eaa084397b12143885ad653c07677bcc3c7bcd9b561956da9fb64d1050220b31b550f14bc4f6a771edfd5066c56f4cd6fe145c969ca9f9c1cbc9eb37a56f280282042e268d144329a81d3076e8c080bafeca5d5b429dd8fc3857c10aefb70a01052337c0b32c07ffd9ebe24973637b0bb7854c7b98e9102d9d1b74c6a3f354d742c7042a532834ffd9eac4644071b70e9df1fe1fdf0b0a6e52f3b06f5d81ddb5c69944ddc808a1d27751036bc6588b2098e23656ea2d9bdc7e039e355143cacf7779dcaabcd25307b36708706adb866409f9b0871d9e51709a2db33792c87a66c25fa07999bd350d91a51a2cd6bda21629cd7da7b235c41bcbfdfbbfcad002fcc60186db77c786bfee2cd2d55f3116f8958cb4e38cefeebc2b13e5e9a1318b54b6789bcad1e803ec5c077784bcf36812a64bd4dcd99ac94e19a74035da2a72e3972c412797bf5cea742b79bfa7b5aeee342e832ff3ff023c2c2a9075f2c29ccd00a3b39e2c831bf4031547cd4e7eeb0cddb151fae21efd0cf6bfc85ef48f7919c286beed8f4ea24ec3fc8555b77748bf3c9cd789d7bf25e9fcfeb33549882b6a1ba6fbecf66b51360446d0d6e3122fff7ead181dfe77b15ae7e211ea60fa469c86e6379b9c2db2e8ae1080e9d9ce38365fb24d5432f79ccd0306b7f2cd170dc3fdac79168344af511420cc13624ad3d5554d80d8b855b9e21678c6dc45d0ea97f66d202afef1aa0500b8f9925b4bdc59b916ddee44b4cac2782a47c31300217377a35c56e93afd0004b42de73f90e5230a1aab877098c6162a55c5604611fe51ba97c3dba9f6deac5205a295f02d813e02d42711f9804d0dea3f0022e0d9f0a2978056f02a4551cece2296568138680cfc9ba4a963c5b1abbce1fb2346320b431b30c9d78f61319ae2a6971370adbe24b2c0b8b39f1a59d8ff95cccb3035459793896b35260064dbba56b927e7ade74ae1a813d53fa547bbdd07dd8592642b229544f662c7421a50f8213ca49cac371cef43eba32b55ee36a5f4fe495384bd6b3f501f5ad717ac1416d931af08a888371bbaed0df3ccdd6315c3174b8c5fe4dc6a591c88c740456026a75cb00aa3defbfeaa2b28c5e901762290017c13da443e1a933859e639ff7099663fb800c28d8c9871c73c4cf73e401b6016f750b09abc1798b61223f6fa66883877a027e1550cdda6aff5eb6f18e263045ce38cc81ec49dde6acecb0e52a6b41ac1fd74a9a2eb8d2ec3fd8e18906e53bdfc6e182d024026d8a7b6105602af9c362521ceea85f86d16207452f3688131f1b57490fa3cc55d8f30079a58d03e952ed1e7c0cc0c63bc3f4f53bac37ff50bb81ff4ac5a71bf3c54574e6b9890f9c98f874f8a82ca8756d0e73e60f8d5047096d6efdae5a0775117ca014a0c9767cbbc0466afacd89428d74f68a7c4896b4215af9a2c37b391e594a8c3fb0810a66d4dbd44d549dd916561cea11f3d0b6e3e789c0ee4c97ec5ecc4170c1c95c573aca95cd203936f7f9cf81122d10b6b48042594cac88297f43a9a41a10a8af7c44822de3c7907a00d35a9adc95944e3a9b10891a74fb34408eb62b3df86f69ebbaf344feb4a94e5fa4a60d590db476d8acc17b6c277d90605e17b06107a25568517b2bdac2c270a5707298c6b2164d8b01b029e894cf2aa7d2ffc9f723cf3bfb0d8bbddb9fd90f684b40849170c67624dab1e6fc74d233db5bf54309ff715819b76393c9520862bcf9a52919d67c3b3087976db83c15d276dfdac07e4f8bca7cea56e89d3d5db29a0aa5ee0bfbd9cad171f43244a07b95fb7bba174371637d5fdeeac694a57776627b0c46d20054a99cd7d88e73903486fe3067a9eb466224fc74977791d34d48f9f4a8344d661f8f03b30d4c0528d8863ff351c642ece2f6a1250e0f6fbfea2302", "6353536a630052ac51", 0, 1915258398, 1537743641, "cdbafb9f10bf6a377826e6d615be05e345e0b96185fcb33f9b4071c829871203"], + ["e9cbda2804102360780b3e41cf7a3573620c06c482ff5422acc8c4a862055bb8f5ce1811e10300000006536351535252ffffffff130b1e24ac59e9cf5ddc502cad2e05c2f5f028f44a2fda2cf0d8b7874d8757020200000004516a5163ffffffff45ffb3f7149b385eca8c913a4e769c1af3af8fc403cf237543beb8154abd05f40200000005526aac0065707f7599e770e998d5f3e638bb63d1d4fcf99e11d02b47548e5400a7e2706e05461ed5c1020000000163e9658d7804c4053801000000000353635142dc620100000000046a5352631d1687010000000006656552acacac9081c6020000000001630000000002c47f1301000000000000000000000000968556cfa845744e746d7e8d000ad78795ad242f2c4e52103d13dc00c2fe9f4e0690f29a69c0708b08c03f8f95ee9440d76317d739fcda6c0f56f57ab7c2de81569060a2782dd2465fdb1fd94ab5d03a8fd8eeafde4e563e52188e2e01cc564200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ef5bea3bb1d3fe2943b25f2cdd846c61a03f177019781ef3aeb8fc94c15891893a6a2c5cffef739cc850143354e4ed90813b8c7d9c33a6ea4e73efa62f385074bfc4e0a8b280ddd4429317c8a37ecd466fb4aa0a6fde71c8388e4caf81ce03be5f5a54ee341613e4f2e7b6d93b65f7ae6b6ecb5a6ee14deee5fa980692d7525a031e8ee1a2787c5f8a320de1f8c4653e4bf92929930bfa19ef129f813bf350a0d3032debcee6e3f2b8c4fc4b7eece81ac5e31fb2285c9eeed9a58e0e9dd5d98348c70b015d44bdb0a5ed9d2cd709e49eceee5e50319188aada38a389b44edf7791ecff21d65e8044a3fc4bc9a85b36aa8a97ba2c5d48729b97207aab43ae2194de37870208e8ed35185d90c87c0a153ccd3efac563e6877207eef8ee7e157b67080bcb78021b2f4fea196643a33c1b0db6d6c48e46255cfc028968036ee579669a07ae9df00324f777829e80df5c1a04be606865e8dd9ce873fcdb51b01808e90dea88d8b23b022cf39a5f42cb59b187e87321388c96f63ae22b11989427952deb8fc1ed74d279031614d5f3f2591269dc05eaa75e7156b8d1e5b34570fa16911e5caecf9f356aa66f0abec1755f33a2e29742af58c80128eb9f818ec88a6c10dc14d396c516b8bfe4a1a373cb0c73c61293284d601d3180b8830c13eb9835d7026992c60f10df80fb5ca32632517c0d450db4991aa4566bd453cb06e13d08a142587be07374b3bfc145ea02d78a1de68fde40c2fc4ab69098ea881383ebc806ca89bec90c05dd2f446aa3b9327236cbbe1f5918cee8d13e95acc4d0d0c2964cd5fbd71b847e52d388359fc48577abc402aeb3859fe848b635711247e77369ea46d42cf8623fd533cc4a12d11c376a53d79e1fe683ddaa53751e8abc22c0f37663ae8d16bda4b487714f2efa9035c7baf1ac878a1c12bcdfe0492cbf321a4ab5ab49d6739d26bc90a19f85389ec4e86df2e81909a2a225dadc5018ac32026b399ff2bba9ab72236123b97e4bdf5b6d76fed04e37358810196466577f92796147d9b6a7e5da3419548f41390ec82b451b090fdd2d73cd16b368f6a5591b078528aed249d5ee5a81c2fba609ddfbd219f03e3f3be03faa85e9e31c8b59699bc2df19da36d936ab95f69ee29dcbd96b03fe8b9e434da01128a94d7bf7656b70fb2b49e06d381ea1e1f753f03c8a9f93bd85861e902d9eba470bd3addcd714f03f11fef39b55f74c529a734b8112dc1577efb8c613bd73f2b9438499f8a9da21b9b3f89f52c01411d083e7dfa85f535370746fe14b5919618a40ee702d7b17e4220d16eec43552717a4282040441a5a9daa7577b8156c1742b17c9e468857c9788c7888c3da9a4ff45b16149051416579a49aefadd2182d6fcd97d10f263700c4fd9b5eed2754f541c841fcc2d16995a9de34f6c180dfba109c6c63f86fd3c1ae964dcc61204f1a3ffb68a3a0c81f308e6dded3a59d19ebb15b0fc8366b9f82871ba9d4c6fcb162e5d0f0af5ff0404eddd9bf16eb01d6f5eeb516a3d4ff99da1fdddab759399052ff042ba45275c49e03f8f5ef2de17bb46d178d97d8fe3955c231ffc64dd3fd2464b8562c66d02127f95853a086776a1201958fd58482a9d1d2700c50b7cc02c0d13945c4265ad0ee9aa760fe3f4438c34378786e4d368194827d574ea9d64a704e72c36fc4de240c3384f3be8d4516706a701a049414c49a0c6464d7426ea16b03bdbe65baa13679eb452a9d5d40d5c7ce83e4dbd7f23dc900642b6f0689c9ff88f30979b7352c91c0d4cc18a0acbb593e76501254e7899f76f59d37aaa2f7197ad1f65a1df0d2f0c3aff328279078c2f71f3347961416489d47284b18a411c757252365c3266894dc38092d939b06c848942b0651bebac9debf979fecd2ba679d26feeef9b8c503c412a5f3af12d452cb0a7f8132589fa49bc69727ab3a36b520c0962a820a2d1a994907c2348f4641f1ddd4ffe9df3553188a61af4fddc9550976a6d187a7d95f413e8984d1efd449b89af981caa94b50cec1cdf0f748f69c414fc5c21d897c6dfebae8edffa9d3d32998a6da1b2126cdd927085e8cbdba78613a5fed6cc58d97b185a1ad95df2dfccdc548f16dd45b8c05548687c014c0395a30eacbad0e7789744144f7577c512ad7d4c21f4eed81f78274d240142763aac1a330a250aef104da27bdd70c6349137d154be36d4ef889519cc9a2ac0525e0cfb2ae0187bcbf6df021622cd8748fa74d92568b158edfd3eb3e92af6599fa652e563cf1eabd4e37d6c154b83cc167f64c0d998c4000000000000000072c27004000000007ebe22362fdc578c79c535752791c4696c702bc52ef9701c63e54fbc8ace16f23197e4346e8daecbe3d2d8f7d404da795800cbb3b0997b0c645678466e5d71fe0668e469f173edf712ffac46a1303982c77da83de486185ef9a9783dabfeca1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d454c5fc04c87c3cb044c370a51236b2c6c36c7706e482ecccc5532bca492768b63ef641fd3fa43be2ce7522ccf7405c3dd8e9fe02edeb5da0442a7aa51fd9aed517d00599521f79bbe5b99ef2a8e1d6f5e4ca12cab63a8be358eeac06e4d6194e3a78c5ac8c27b7c58e8743d3e07fb391571bbae2164236ed764a845a086ad3021a9d0675c4176d2a4a69a2b31ce5e720f8c983f467886ca4e982ff421e667e4f03164e90951b7ddc76804e9d9bddaccfd046adbc6e86ed5f96271d794cdb89df0c0a0541007a2a188c466d22e524bef606f1b6bc6efee90596bb1ac6b3efe5dd80eb5b95947540d7d7ffd7ecf583bd77d86f036e88a2618aa3878b8d733b68a7d0a10303c6319ef51976bf4ff21f0200fde25d7237c2f58f83799e3b77d883625b9a5d021b6ee39a26187bf60c42d6d43b91b727f64f80f5024a44a08955bc0e9a74a30f030ae11d3d70af65af781348d4d95f863eca2a06ef2a43bc3ca1b95059cdbcd95b0303c6aca005e274bf7069bf34f780514758a0854d9d9fd0f405691fa85957f6a002168f27a27c2ae8b1f2de71094cc7e2eefee700792039b876b3a415c76e11bb6103dd21fb08d28a849dfc4f624ee34641d77b392e641b786e60019b18324be85f2bc56d2b7b1940ad886cb3526b958773e2945ae41cec16eaaa62c0eb2dc04942c4096b0e7da94df88cfcba7591c0bf5452b4f02b0a2abdfbee94d9eefc0c8c1193d5e10a0f39f008b4c19074d9a8f83a5340c62fee04b803c660e7cda4a226594b098e0e70638248eedb6ce16ed96c0c485b72a6fb934dc8aac30ed32ef222af56484a8a0bce2ee52fa82a1c90512c26cbc6d73676843d768eac0043e7d85f24ec7b9ec3f28fbac2e988b45789fb7c4ef32af7fecefbfafc69b9a08da4186f763e86cbbbfcc8b43837e03d4211ef842b4456827dfc07af9eb1173c0ffb7847f50254a1cd0873bbf373a3eda7760eed7cd24e696a90c5509add197f17b1ff2e18a19eb3ad6b481b69815f9a4045911aede43a0ce46837cd5379d6c31c959ff01ec255ee1790805f7fa74a4b5b120a7be6ddb43157704658f96437dc91d4408e8881eea4747bd4a49cffb57fb70a9afd13405ab29a86aa7cf3d6d863a3672b9fa277f9d37e5ce5a8cbd2d336a49ebe56aaa2a54fbfbf9418ca38e6081b854fc86dde6b1b98f53204697b9cb811c2318b298bdf0f39d803338fa3e65093579fdbfc32ec8e77599921f79be8a137f10a33f51ee0c5a94ff15be24bd52c0317c23170b602cd119017059d57aea66f98d755702ee0bf0e838e9684454691366feea9db180484d00ef19f03716ba2a855ef6a3899c1d3cafbb5c868dbcc4157d6a2430918c5abd6cad184625abd8edec9a38e843503eb3e985042f26e8166b06e792affe53d5ac9e58fb5fa4c58b3eddbca45efb055ba53b9912095ce209a4ba34301e2b0fcf6ba70f7a57059e6993df5cd57789241b89d56d2fe9ee8e9f6ab0f0a8b4937cd583569e06a11f6a7602c71655640c6ae8838e1d64bc972321790976c7ae4a7502cbcb37a6b343e12ed81c60c6de7e29727e9c9e3ba48fb06bb05679ba140a0d9588e66350b0c519c792af251bc2979be75fe90f962e704c45366cc2d77efd36e98faa5c1140b6a02186f0a7927bba2f51a341592dc61b68fa4102d0457a119eccc8bd5cd7810f8b2a68c7ee9d02efb3a39a8703d00386a4bb0616a6780683414f16b8640f634a6b4cdcb6f9a905eceb89aa717fb414d581481f21be8ba59778e737491f1de1dd41dbadddc73467e36ecdbc6f5b0622be5b8f908350ad697f987a4019b6bbfa0581cafbdc1ff27d301da8edaa513cb64dc81d0eb1325924a0766c851d44cfdeeacd65ce69af747d2fa078ee310ee1132eb848912ceb3b69489945589b7909c9b49119d4e84f1b3bf0de4007c75d133f9691a510609d50e52e13da73a655e217bc4dccf0d05c4f5fa796d718214046dab9142462c93cfa34073cd47864cbaae3c38d5af7218a67b77f737e6468b8cf16dd8e85cc8d5b8b858a8c31be9bb2c46a45fc9430b71052a586c00e5538f1fd994115a530910ea773e63839857fddec9af968182add9d027f06acaf2afbd5f7e4cad2584221fc27d9fb2abc45eeb6bb5e5813ab16f8c5d440766e9b89e7a96d729ed465366c33f29134c09bae501edc270377cc2a9054a851c1bef8314c00a30d08cd836ae9d4f14998689338a23a7102904e50164352766822cb762400af8bd80c8e56b1153d402dfbbab07ee93479bfdfae5791399422603b569093483fa2d716d2dd37b134da51a01bc6347fe11545ca6adf56dd8f11ba0a881ba370a533706148c50c1bcbd303e9af4d23e38b6b55cb9824fbcd985ed65b4bd66be93953aee2c195007f653364b8aa8e38e8f9280699c3e63226f8362ac1a0e", "0053526a", 2, -339457146, 1537743641, "da55f3fc4acf4f27b7d3621ec4056668ed61498625a2b3956d4fb224a9b66ab7"], + ["030000807082c40303b954e3134a453518bd20fca247bcafee09e5e4fc39f420ad24b9cac4350ceb56010000000030c644aa8778b59375ef7baafeb61424f45798de1fce20f38ca4fd1fed3e0dc8a4a5ca5303000000050063516aace4558bfa112b2a53f2f985107144fcd25591b5113a482e602701aa4c5d1cfc5c66930134020000000163491dc9190148221401000000000752ac63ac6a63537a20b13f2ce7d50300", "656565530053516a00", 2, -1557445573, 1537743641, "08ee2133abfe0e19a101862010b565d687ac2efba3b9d4a5fe1537324024ee59"], + ["1fd24e16010eca22163d91c16072d67d94242b9d2ccc078d680be74e2507c014b1b39e98c20200000000b42dd6aa0335753d0000000000035300630ee17c05000000000565515151007c06440300000000056a515251530000000000", "6552ac636363516500", 0, -1923103214, 0, "5b647b3f6d808317db98e8e196f412d8e6e7ffe9a64e8edca61ef8bf70505c72"], + ["030000807082c403025c02a4abf512fd81f429c237cdcab1751487e08595ee99624a7e3a50ce4e9cc80300000005655353ac5103cd1e8195174d6ef9727504ccd28b57feeac829f28e3aea57b0e8c239f0ed041643fd0b0300000007ac520000ac6aacffffffff03984f85000000000000bba0a101000000000365636342949701000000000400526365000000000000000000", "515200006a52535363", 1, 851486860, 0, "33667a8512d72bcc163409215fad62c8ba2b28e75256e7565cea98d962aaf726"], + ["15b084620216db3abeb6491eb0ba04a4bf42d3122afb4a0fc129a1677ec0ee37e09a1d94810300000003655152ffffffff557bec0af90686c74ab9fdfc10e39adb374a8b1359ebfb204d8cb98ffb3b5bb50000000006ac535152525115c0d8bd018de85601000000000465630000afb03991010000000000000000d81a900300000000694c0c460f4999aef56c639655b198d1bb386fdd03d9586949d9da415ded0d3e1a57e61d8562cfaff1374c81b0be0494a9ce008504619808c0fd316bb5e770a48f882cc9ecd7ac329e53833c52813a1ac1201ae85fff905ab655e6e38723ff61000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001205b52921052d08d336927367adf343456eb8d07c9696789d76e2337c306783f7dc6c5274f278de5f00f45dc7ec1c16f62f5cc885bca6c64c886ab07839996fe1e3d41d0d5d4b6cb56e63b40f7d394b7d0b0ff2b35f2b55763c4702ad3f894be247ba654ec400aab18ecda7a4e665c0dbb100e9c107fe0c7cff1cb6ec1f7ad40200ff3212ae9f5a19e014557fdb91ad0fc23d2306bd81c811c46390a04733682a032486a89a5a10ecee36c797fb1b83d82b5bae311457f27ca818ccbb12ed3b59fe0a0064e3b94b1847d0428ac0f3f10bb8d118a73cc21eae16e4cd45cc284c83b62934dfe6dceec959fc855c28417db74adf8bcbee21559ece098f882363f69e95c50326e45ae5ae0a5efae88674b189fd502c8bf19ff9442ad39ddce0ef78e4c9718e0318254faca4d9dbcfe6bdced720ba13c4b74a0e837d2737d4f707138e1de606a803170cffb701996f27c107196d4a006e48f17bbef92f9a244c611b3306cec1e7cf0213617687e4dc06ae8d60677c04a26a83bdf487f0c484d698075963c576b6b59f032242fa330bfb644223b8577b1bdb9794f8d3e0e0d1557c0693372b10ef07ee62215a48d6aa9dc358f5082282f9a41dff22ae336f9368b41373dc480a69dbd0e07d9607e3b2ea1adc9ca62d56d5a474d6fadeea002aa3347a5e7081f5cfc8b0bee12697921e40cfc5b5db3856e01d886826ed400106cfd5c3fb48e9fb6c3c7057709c801948ed9b6a054b3621eb591f3cfd62c826df3743dc14604249ab022d0db46fd7458dfa3329bd1413655507b14910292dcf07bb143113b6b5eeb2d6b82bc2ca54d890e09da74d8da2fcaedba620a56c9d8f0de1ee975417908bedafbfa717a87ca6dcab40c21df15ccf5e671c044d5d060bd91852337c0814e166f3e90b2cf4ca5fc66e257846eac0551e1496e38f75d3cbf6038fbcd276432000f3043ba81baaffb9266b580ea59b3ea97628267d897e75a626014208bd053a1163088c9a82eba80d0e3d5158442bb3a6f0552153ca0b7a52c6c3c9bc8f6b1937e2cadf9587e842deb937611cc187d6e47055f531c477a607cc4b13343647947a290f2ea9ec071143ce243e1386e14dd9ae45a90f7e804444beb04ab211ffbfcbe6d8376cccd24c022817d95793a88510fbd46eca096b48db13f6e34c0d12989ccefd94c0c9c6b8936a4fbcbec00c5db7bc11c68ee8563600f784f031e03f455382302c86021505a8a6475b185b70d6fc3d15152fc951edb2453b954720b8ec5d246c947dfdb6a5cb9fa1f1a347d477deae430a488a675c50be6e3fdc8c185a82070e5deee906585fd413cd745d8400b1b5e4cb84756db0220d0c38e71cade9add70a8f68b78a14e2687ed757b797b976a7700d307aeefcbbffbe5ec37bb3fb00f16185840be9ea4dd2cea52ee3dfad63be0b406e7cb0fed377f100a96684b68ee1b3c8601e226bd44ce70900a21d923beda131fd347bdc4834351815009e61ac5e4451a22e29be6a40713fcfb12173ba635bf426f753b57d6f2566a85e7e85b7a2af0af0af15a94d0e2889330d045a9e23ad690d7a6ef8563fc14a32f6258d9fff74704bd449e2152a37dfe3c707156041203bb755f6cdec9c38c561270d0065b2b88b5d21c22b26f96b828cd412244b8cd4e539251dedd1f1a50e67a47121076efb9784c25a1d0929f77b0b9fc6e93175a43554541694c7e427af233b341d1a4ac1b75f44737c62b2a181b8f9e86d566af2c8bd54a73243e20f287c7be732de076d51c0859688f10f473b32f9bf992d533c7f6de4d96f8014fe0ec29aa801bdb585c28bf7846e80904074036551005ab685168804e13b90c0c7b01c84c8249302cad1bec0516f7370791ed8c0d6d771891c4441089dfb6bca9cd4c0bcbab89b91c65dc9f8c9da609e1b3b021ec441e12e7c5ecf05a311d7adb1e072906143f93897b41e9d7a4a7b36034802e333c40c06dd7388047e96f35249c4e82c01e0d390faa5b54c8fed9bebff7d64ba8b12033dbaebd678553e58924d721001dc05ac1d9bf39eda9233566591cdb6a57cf4e00ab3f4409905eb18520f49ec9c47dd6e9129961bcfe1e72e1077551852b69a2a772de62876c56e823764dc405180aec6e5bd072020346ef025d1dce7a4bed20c6f68b2f4d1f74667c0c1a170838d66461ae70d19fc583711635bbff61bd3a031539cc83a202886ac810da0bc3e5647013e6919ed5a7a2a800cf6ef159baa5ec9eb74704f3bd04d9e6155ddeff7472bf64e79a34e3a722fd9998909566c83d0e7c98847924e60badd03d87be871a4c37fae1e8e54f848c598139c3df5ef037ed825200199885e9d61d7f0ba398dccd10d0585bedba988765236704ac7383ff5796a568fa7f30ac053f94d8314118038d02a900e6a297364d80c2dcefb6dfb83d21d5a7bcf0c", "00ac5365526a52", 1, -660328878, 0, "77d0a9185d2df8b2ebedd9f4a832d8407f7b5b36a712b12d51d3c5183d985e72"], + ["ad100770049c107f6015b3b720897faf24a669e3e759c86368ac3fe671ba394f87b6ab037c020000000663525163ac518fabbbb2461d834a94af95fba08327d97b3e735ec5f66aa0964301d95ee376c772d99c200000000000ffffffff551c0cceda66f079a303b54cd57acf22eb2a0f62e1fc0faf42dac20223641934030000000365655350edd031f90f63a3a191fd88aa09febefb743fa7b64cc37ece8ec5435335ebf635dbf042010000000700526565636352e398efe60271f29f000000000007ac63ac51acac529a8e7a040000000005ac6a00ac522b9803ca01fa920e0500000000000000000000000063c5520273808d6d34295a9fa76ce541d1c26e45f68719613f5a087f789ace64f7c4163c995c51747791aafd1c3d9474445cab1feeb21a2922d09f7dcc56909db110b5fdaffa09861f81a47cbced9a94809e458e463658ef653f7515a9d6aa0b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f96f3c6f843495195a9bcf83d78071438d4d5a755560cdb62188d6fd0cd1777ec8e6ae44faae51a5d20921cb35194a7c6f3ef6d014a562f52bb3763c632be431f312161de2baf9aa6d6aec8d98db6219ab20a3c653a40458188255ed559c55533ff66657105d886391330772ecdca5cfff681c67cc132cec4ee5f57511bc67303133ba6b89d803e33cdbf59f9412f219c3f4ff2ebf436b97fd2150315439984c50302dbf2401e67ac700d6c5151a12a5c242e287a54653480cdb87aeb0f9aabdf930a056c67ef2bb86069cb4ea80ce6ea3ac9928f7247b6ed3cdf8498564592ee2b6ff12933d982d503329f2fa010e3d080b4a871c562f3cc6e582b153de31ad54f85032acface9d8580c51a42b44bbf314b88804bc33b3a190544070e72ffec3a9a1cf032671e1892b07e46910c0dc547a0cbd0d48f00a725fcd53527ecfc1b318bc31ca021e5396e5ff272997675e784a6175a9a06771bacd8586b5da07ec9291d0a6c5be030d5e79bfadfda63a10956c0c6b28d3a0389205c3074ac3c554f1c6eefdc9e519030280a74a023ad591da85c528f6eeee568282ad8b55525c51b7fe5f532c30762b5c29c707034e69b36702f10d820afd577baaa9b8a8cd6421754fe8d7aea1d15b43528acf5081e3f3da2f194ea60eda0ac33e847a60e8425a7bfba6aa43fa74e1a62270e44b8d445a63dd2b5878353b2b9decc184277dada68a9b07fc90ea61d4d986e1718fc731b1d9aff589ee7ac5c2b9f1fa7f8a06192d114a894f216552243816a6b8cc7c4168c3d84790663eb639b39886b65a12ed361e2e662c5da7818679f8ba0a49985fcf2e8b322be8c71a9b71604c48e177cd83b0fa3345dd574c9908296a22cec7fe987f3769c69828cdcca9d91cd9dc80229f5acc9c5927b41122f924386f4b3fb3a6f9a8c190a2bdaa8c2c2125f764822d45d3b98199ff90b193e2a595a89251425d6e194b03a3f6a2145e834df31c365b316ce7954d7ceebd080d649dfd46550ccae4e456c31a35575e164a6c8b98a4691e1d12cf06d0f8235db9b17ac11efc787e0d30b90f67e1d2925d663d8c43a61336b351ae225fa64b23c70d9f633f4d04b0849bb58799e4735e4248d2c3c6a9e3b019c86f3999ad0ace6957d2afcd3f5c83936133b7129328eba34eb59bfefe35543475687f3809dbe373273921734fc218e22828e574c2207a1b3e46fe61e34841db2112cdca18406d775717b362b952024fdafe82b06251e9d25b6e1fee359a6709048615b1803ee62f075a834ca5d1c98f2eedac262cacbeae331a35604bdb0541a50f5574ad474993d8cec748a03025b05d0c3b6854d3bb996cd9d829056f33340f8b8139649f249f522d3e061144116471167e1d0c9a6cecfdc938fbf69d79b6c784c31639ca83586988bf5198cb2c5eb5c0f26ae4e7bf7c27df8a2fe9e58982a5acab9350fb0b19037612f448f7af82bf265df6eb006a853211123325e6b08ea891076218a80e52cf31bdee118462faf0741a21f6e2917600b6b6cba2cc01d20c8dc0fafd27cb7194d400b93ae681fd923703c70bb67fb229c93879545184dbdb3c0cf27b99292ab0f138f366fbeb35fd0475128a104234d5c15cf0d81cfc51be90dc6a752d461a16ab94f154a0290189db0a2c4ee453db5929db85cb5f9403950fe0a0abda73f615e643932091d79b0c869d7e0874d1661452c6f7b0ed7fc768874ff3d1916761c120a2e6a26382e21e420951c3777125a5f543dbfa1966850e75660f0d16e0676a2af3e42e6858ddaaaff132ffa90fb329c67edd3633521c2355394d99350794ea74fd7ca21230d7c8c1960cf4ca8d7266204f109b3ed94c678917307f6dbd72ffa0105e3dfd537c4025670d3cf2fcedf1bee1d9cd2565755f0457e7eb37715efa06c080da98f92ade65411415becc77f3b40f62be89eb0d578d7c1fc4ad63708599d30be531eebe5885a82823f5691889b4bfca751b6befe9151494999786b81fb92cd548793c6a093127ac093444edd0fef79c40fcc258850ce9cb7f149e223026e7d43b1ff11800535e578ef7fe7713a458ee753eea07d5fcf455102743faa9ccac276831fa5c3060babfffa269f87c7264d2e63e0fd5e14bc501426581968abf231c10e68cc342c7135fede859b31d6826a6a3714f122e0501c48a8c5c7c9e17c0c9b4db53c6f0173213f4fe3147d9a430006b9fd8e8cf33d9d49d6a2e63fdb312f775b42da205deecc54b15ef8083ea1b760459e0924b66452e4422c6856bc6c00abccefce10b912c897675910faddaa1c5c59b40537f5305344c0c20c29ff1003627271a269b807079917097a67dfe8a46f5a91772e277c6531bbe36e22926a8ae56b4de19d58bf1f69288179091963a7900809222539faec6574b1110f3f9a239d7956fcdbc01a148d08bf2a20d", "006353", 0, 156952389, 1537743641, "5954be524ce6ea89f4e57e97355f2acab2bf4985a5e231c766f933242e94937d"], + ["b92a0c4b02ce0295bdd5d73447414b8312b7f4cbad9d1e2f510feb53a6d46b0d12e483c53f030000000752ac536a6a5163ffffffff90796a2a2af288b889ef471653c78dfc4b9893409ba950c29effa6079cd0592e02000000026a522232cc12039280a7000000000009ac525363ac65ac53536f277404000000000700516aac63636ae9f9bd0200000000026aac2e689e2800", "53525152ac", 1, 181524863, 1537743641, "970a22c22cce5d4e4aef03bfbabd36739d6d00bd420cabbf43c5df41fe402c73"], + ["030000807082c4030458a8239b5d5ddfe08fe402a2e6c5e6d4006e54a42dc5b8b54dd43738e0b93344030000000300ac6532749e568cf1e3c10ce7ca85442ae668ef0e964fea104c794b183021fd1eb8d03236a75d01000000076aac535265536affffffffde037e397b406d356bd571d452bd70071a853d4a87345da6c5d841d86f19781903000000035100536b67ba3c0466cd166a54578b1ff1ecaf27fb7029ffc7a7cda3353132063e1af183de992e03000000096551006552516a6351ffffffff0495d16c0100000000045365536a259db2030000000001520357b40000000000009d607005000000000100e0bf162dce63fe8100", "63535265", 3, -1904990253, 1537743641, "c3c9335b3326af073e5caab6fff8aefc8f8febe8dfaf823c6affc20ea9eab77c"], + ["9664bd65025689192b5a71209ee33be4543c5ace71617871f588bb92ec0434dd025ad403c2010000000265635b3bacdec99011243f6dc568cfba6f815e1b1bdda63436ac3972a10f032831e95291419f0200000009635153acac515100005f29fd20037a45c102000000000007561c0300000000025152706af4050000000009536a6352635152535100000000030000000000000000c9d79803000000007297df232c1594a272c3be610cf845548e1eaea7d5c33955e58e74079cf0907655cd49acfe9787cb1a86f84f67b307cda54ddbec3650872e75818ad49f87a1688d46d8f9dace0bdcc7a76192ce2a0bca6276c8fa5bcdb9f6e0fbf4ffb8e6dfb80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030d3c55b5c0871301309da26c1b441da05505a0db645c807f6b796a04287c38e600c93dd525f5b8e6db30bce061d71423819f34709641f56cd4de024b0e243d74c45ec0f696d023af4382d49c3664a54465b227748f4976c2f143850351167f385637653255d478977ec379b55598611bcf104e2f26bb696e6160d799ff1de280227e014ee219fdda4901975be18381a687b9e98ff6b7d4a197fde30f5ca9096240306fdc0118109eff5291b976356e0aa752ced8a02ac7a0cd66b0b13ef1e9b38c70a01a455d5271da38f675514393268454b20ae5c03d045a6616bf600d61e1a8b10759bb1a55c4661cbae830403dae291fea9b887859bdf584f5e297f7715ab095903197c0f920485dbb133bcab06c32c256f31830e4768d5a61b60ea376aab7e54ae02102b93985f0cf85eb7e6075ad99b54c0a093e7237b4d3c9f681c40165c78456c030741af77883407130aa97bed40f4eebe8e9952cdc86b54a93b69778e76d5af740225327c580e7622f81e0b494820c48ffff6383a458951de19bced14fff5f21ad60223de11fc4a4dc8a7e1b58e1193a7422c4b2f97c126c6ee869880627aae3f6c1c2854c1c2c23a55f3d3a13e652f28e00fcf5138fdcd2e5c0e3770efb36ee490143116a16d5d1a03c72531dbe2f865e9f4d744e30c91189cfc3f0bab6689add28fcbd93c6c7718345a50b2ea624722d0c2c0767bf6be0a9b8c8f98be059587e039356b37528e83ba7a3a610daec8696d0934754d01f575085862efc5c01dc3c3019f318f9f57f3b811ec17f299912825485b64daea16a601f6fc75e24a999a5976c0226b8325f21459861a3811c3af014488c641d01d8b63d30592f20d71d7ad6bd6bdabb08d30c4fdf9d25cffe04448eb5d051a440a7ac8d84c154b7897aabc693893e44d0975b8b0f2a747110600ca3ae5e5fe15116ed13d71e0545b9e61f6500a14271035d35f0f626097a1d91f0958930f8ca42deeb5cd3a82bc0b499e0fdbca9798e3c524b34ef97556e2afe79d39f2f835eefe90593c0a6f3f048ee50c59ccfaa1623f161a720ab4d5031cae8fc9fb65667894596443573ddea847182ea6aed2d1d4db2f795537db491c93ac3c504947191f23520de9bfb5d4469b7a703c04665282df30b27337b53c5655632cd38413c263bcc544297987fb094e591708c5bfbcf0cce17b3b4d907ebfc7d801ba6cd20e95cea4c23e81b1ae14d5a8ef3edd00b4b5f56697bfb157c3a6bf7249be9597d9f930985286d4c916c29f34a3ddd0e77b4978b21c444c03dd776994e08a2e346ae7dcace4af69ec66e26a57dcd1d12c7491659560466e6f547f86dd7207968aae6aefb701fef2dd8c4cafd222daaa13dcb6eb3cb66be4ddabc783cba75dcecd7b097badb63aa4b6010e342c95ebc8c2a3bfc3e56917a047da71f12438d8a80ea2aea3cf391e93cef764e1c306d85bf7378a6c7810861afbe61d99f0ee7ee47d14125a6324313db21aa7837ba913950deac2afa88dd4c6fccaf1aea8131382de942bb5342327c62a112ebff21e8b78bd7547ee5a327d7567aa291ebf08c9ee0ead653f9a70871a28a24170de15947f27d1c0c93fccadfc15aa3ea2ab5ee9ed8aff6b6f61d88ccc2cd145b45f1cec5fd585db8e1f0f58acfb1f91ec7f804af1a7d6fc9cd1b0293733d1265059424f789de0b6f69abc20562c01113e5f65493ec0f2d91a87f502b0c5af57bc19d5c0085abe578c4569690c81285edd99d31a2ac96f012c20bde6b066bd14cb72732fea0f5de378f2fe7e5eacf431061185a00881452ccd90afda840af4476a82f3bf91a95bf9569b121a400aa8fe89b2b3d8242793747f29e4f4a3d05688299d4a97d273c1c1ec5b427da7c4874df12be0540c8ec2b640a9e5a0c16f1a92e83331a446dcfa3ba03cfe938f947d982880211bead796809604d36fd3ffadbc764dd2803301d7b733956e4692fa0aeac791897d2189e6c1b364805a0c0da754ee26a6ee4307af7740b1edbfe5eee7690e07f82684d0b91cefef628417859e10138d4955eb79a8cd7cf615e2dbcc421f94a0230770b3451bba4be1ef522237f5df9089e13b108dff98cd7c0a2c621ffac6ca3d95977967697d73ddb95bfdf2ddbe36f641514e9e801249f695e979bfe01393ffb3ae3f9ec1eb7d45579a7e99e087862bc153cff5f07bd9d7ec721b0c31d66186ec7ceb1fa7972debed0a4dec4707d4e10f6f1b68c936d47d594d59d42a76fb7f719e9be5c8abca5ccf25a5327d4c2ffeb358924999a245eaf8a08e24bc7d223c4d072f000000000000000090a49502000000009bae751bcd5232684d57bc21a6779648d5713b224a6263ba466528b03fc7c3d3890d92c1b68eb9d4de403799e02751037cb55ab15b32aab280ee2bb5366ed72c2d2371f8577dbd5b4a9e1a5e7056c52a538d5d39f8fc51d5820333245da74c3800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000097d41635c53c69f9d5493f2ce46b2620a62336dcfadcedef0fdfcde287eb792c4f71c7d7393baa48057a7fd34012106667d9d0fd570329e5e40fc2be9e0ea45764e314de9468cc6a9606bedbc83fd9301c1c0e6e20d12881781771fcbb2189fb4255ff4c86de2e159896f4c043663d0ab04c4680c59cf9415d12962b695dc01021783e60ef5063aebe3a054b4b841c92bfd30970808ecaf2c0476e8010df1f5a603243dd3f305af3b45392f5bad0da8d317e06de86bb52a804b1b524dd543a876780a0413fd758ef1fc2054107ce2a48f268ca37ab16cc9b1bae6f882c44cf479969af4f514177117f1c278d1cf0ebdebfc7f19f452ceaee9c9ad2555ee5cc267b04b0221cd10f978ac78c7c5aa3f3538af71e3f7e6ab77fe33d08416f1599267021788031f7d7909a24a4a7bcd0ff1176a2ce65b9ed38bdcfd407c8a3889f3ca59f4b8930208337d9e9bd6deea72bf3dea06d054a74f5ae85850e2ed3c6aa1b0cabf32355703035b53b4cf0368d276ac6758090b5d8f677247375b8fabd9cf4596cf836093270201cee164fa742ef4707cab59645d56976c7f149f6a9a4805dc840c6b71899d43ad5db84dbb6b30efd775cc437090fd97faca4e5a4851f0c5cfff989e3969a19229278aaa58f51d212de6b334240e521068ee5f857ccc3a351848e8d59ec364829ebbbd13b9d7c247db24a7c8d4404507518697d8e5ba86ceef1b38ab456f4363e5cbea81bc645e03f44a4452baec9516c57331a9929c7da8fce4e3706c84f2ea5917924e83dbf630ebda87536b275942a3c4e7ea49723db35fc080974744fb9e426261d3d3f0a923a23491f95c6e03b6acb117a7a01a638a689afdbfe8d95573f1c5379c563ff8609f93fd00dc714c900fb3cc1531a3cef0d38e2000fef652d03283b63cc545cf0144755caf9eec86d0ab1e17aab5742e6aa3d0b7fb3213fb9707b2ae3bd5f929c97a7b71934e29c06042024732b20c526109ba53503a4fe7db46cbcb5a3b173317e4bd16d75c636acda887353dcdde8b0474ed203f93b3622942cd04b0ba9dc0fb0f60120715d81ebbfd2f90551e20f4e2ba6e361dc279662a9b2cf00b47ab9cbe2673a8699c5facf36e386a5062ff2428a7f383823d1dedc50e2d2685397c5cec9221da4a518d67af017d6117297cbbf0e96bbcc67f2fb23a89ee6bed0fb746ed4edcca8ef44aef9a5bec95217468587c8fa1bbff93ab2a1078536b4cf78272a28fc34d73c10f8128d187fc50455d411a2a4a62eec23703163e6cecdf613dbeecf741e5c387114ad9179cf538219f7e83af2e14d61ca69800777a09a657b43af1d766c4d68b0c4dd8bbfba93915bbec132922540ad2f3e3137b1f7c547fcbe4c644b74cc6a60481bb6758da5b10cad94e9cc88dd52554f063478a6dee4e9a5d1a67ecde742669b1d5859443fd1db2bd44a39768e06c1c1767209d1622d7f3e29b79561678789b80cbde5312f3a50f9f8c9c7216d1b7469e847ca2092136324f94a5f12ebf76f82c29417feddd8d977dcd02a786480c2334cc293bf1c44270f6a5878b8b9e01845a9804df5c88013e8874c723f744245ad9d8ad4cedb316b23c5ef042281fe1cec9d64f2f5575bf6d8f109ec16da1c268daf0d76882b4bfb7ed8d65e8ee640509fe0aa93d8147bccddd5ad4652b675d678bf36cbe8528ccb6fa21fa0774aadb256ab54d4b05ddef9627c2d27185c5cfb89712b3504da9eb25d4c53c5f3391cb737e2db849c4b670da8cb38d5eae3e2350f0d2f54c2f01dc2a92435c34c2b0022d205edd7b7f21f4ac9f5282fefa385688e3f2f4f4dacbb589dcebfab82034e270ec9a295bd1d2544fd83c369c22eff7c909e81612bbe7c446808842099f3a2332c3f216a16fafad1613e45629fe8db25aa79304cf375b9db32a4430cf37f40e05db360c51a3ebb84a5125456eafec4f00435fa30d32cda9e90c5a10dbc9a5df4fd37129667d3de0cccb2a511152b2ec69ee463d1d239bd1800638044384db7497f05290d60f8109649761b57061e54db38a490df984e9a46a19f533eec5fb9e440b9687f1b6279ed86b48fb424d24fe70acdc8ad76a435446df9fbea107266384862483374552feabf9d64f4068b42999d8bfd23ed4b9f4eb3e925cb5030ec9f5a6010c6839de111fbef7be82f4ab09a049b827960b4bf1aa48fd8438200a0255f8e7c19af49ed8855068e10e4b29941e20213bc2a4f12964c4c4b69726960031fe6114bbe1457fcb36637c833deb0bbacddc89cdf9082ff8b11ecbad535dbda2c9995328a8899203000000000000000000000000ac6ca096ea0dcba304da61aae65f9a73dd935b788abf74724dd354c46d3ccd97b341996eb84aaa79fd1cf9497c38f343350ea98d98bb8e6f8726b7232db001e7aa8926e85e07ce78ab26fb4470e8e882dedaf2564db757117443c45022994d8900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000619db6746d409be8e2584fd19d39be49db9a33291cb4cf88161a1380da1ad6bcca4b6f6a24d097e54b16fbc33fb36e9be45f6214c9c408f0bba521e55e4657379b9419ca81592ac69a03dd066281359bc872e282641055ae3dfb2bd716cae88970156c8c51616898fdfc932c35f272ab4a50fac1ffa79e63858a3f39a8a67e28031a6ae938bfcd4d2f902bbc6d7a880d9418ef263d82da963845bfc8af8228852d032f2a1e912fad18325d22ec92ff9a48a645cd6f415698bcfe0e10c1e94ada4e950a02b7117a7cea3147ca0961a5604d53a87c053ba93782558d3e99cf0447ad1503bde86d87334bf8d2d22b1dbc75fc6d3d8d5b054598bb883e495b8f1ea70cacd70329bd603af76f266f521eebb3f267c2f1781554fe7c7f84d83038b04f3b58fcbf030fd662017c4d01fe37b0f2d1728f2b3a0d7fa2aa5f53f2d8fe6a2480802f4e44021837d639e3167aa2d4123484abc5c1ba7b85db56be704456071578c1f13e67e1031cb62d108e1d8bffc3639384e2b797bf78f1bfc09a2fdba947d6b81bf43bffae02009f32ba68867bf2c6cd087eeefa3eaca259a3b3852028a69da8016046f20555cac9b1c9ef79ae2ddbc5143a4912096705ff1b40560a88fbbd2e4452fc2d908d989927e01f0b5debc355f86c0cd7854ee907d7198445e72cc05cef5b05da743ad4ed35169a793ef38bcb7403e8fe185af40639fa4ef376d9d9b30cab8f9582ed0f3e879177fc9fae348ffc8184d5c2d0464c32656f38f06729d2509c72f064555f1ef54e452cf4f64b1956c857631c43612bf2f4345faf090ba341416087c356eec2633307f4fec382962c20ee3292f070af3f8645b546df48de5a527b14c45f08223ce79c4ea38aa17dc163296098cb13e35d399ae38b9b6f3caffff3c8de56c12f3e5d40a7ee89a593b819aabee15cef765ff42a8ac9598ca3e40c60b4ee66f109326889a260ad3db630882bdfdd38ed7686fffebd24918a63d66c265bb2ce1bfe14d12b589860e68f4e18e74bc670dbb9ce56da8eec76510631d0f535c6d8c9c9c0dec73c030e2a4634d50c55e48250ef4547a535f369ef6a59232ddc5be6cf1a8f673582a6ca4b37fb5fbbc74a196a0e1e068484a255028c32930ab21c63411114645a9c663587e9d990d607e126737607d84a4fbcdb7d772c5d028fc2dd7497b33e2076b6737f3aca6663123bd31cf33e0593337a3ea2eebe54a23d0900aefbaed3f84b9e6d79dbe73706a77e340230dcd6498a5c620361a84ce7f7fe7c2bc450f46ad56cf67664d300fe3b35eb4e7f38204c81ab19987a2a06d306c0535d43d0f700a96972959c5ca5156bf55fc484812fd8030e62d67b0826c37072e1831acb9551a7eb7a594be8ec1343d9f414d682b5103eb54ed4af9d667fc6b72e02c67bb09c3daab071644a00ed2964e730f369d2ab78ab9eaeb6e9f3517ed2710d8ebe66c8dba79c88781878b591644d14afd6340255dc52330848fca3471eacc33a97ae3e0d65e8423c258a6078dc3178184a7b0abf27d88e74456cd197f2f91b1cb5f629de7ff3a805671e9ba0e7a0ed3bc41b9e19b9c72f0cf0112e5669c06630e0fb1e1718c32e057139d3647f39752f270988639c29eb6d75eb2a0fe949150e42711cb43043ded12ddbb03bc99d0b4cf4fd8ae903d76a5edb07b188f907221775a54fa5283266ab8e44da7f30c190aeb706669e4cb06ea4d9b6189e2412b8e3b20783888ea03e6acccbe553592ce617ff37df466df0884eeb695d886f5a27f664dc0eee0de084797f6183e2902492c57c4cc4311aeef3d4a00dee7ca4fe330b36a5f4db8f14747e7a8b671dc6f1b689c86088f0d7673a0de8a2b59dcd4b9fe8f3a8292de19ff9795f1d054aed17322460b46a294535466e3d5f0a8faebb09699da5719f557891f3fd12eee02ad8781914aa26694256707c8e90ba460286c028a8fee735606e51a7be16eecf24ac2ef48e542185659ccd23c9332e911d71ad6c9fceba7827b3af2898a7abd2346cffd8ae31edd7bdae017f79b96a9c63b386c5263e13a1e5cb43ee1fdf14a60bce3332b55a95ba85ba5e460fa0bbfb6c5ca8eb9892b5e446affcb315bbdb1fea5cb326dede31ffd94702ce552c945cd196ca2c722426574e67352513ddeb4a2d68fd9061679d4611f5bde4c8b73bb26185e24d4de9fa91381fa07c2dc880eb1eb230d5b2453772b01b55da154890e3e3ab2e2e6f781aea5629d724b2f066ce119880e8c43df4d900ed19e23773d738e4d27f6c5378b90d717ba83e0a7fa79a96509e175eef4a0b1ff0f7f89a3fe43bd8e5b3e491b003b4838e49da1a7edd702b9d3d82c49d1c18e0f1f51da4e5d67b338e75b4b64153e098cb257eba34c77716171f318c856730af4635ebf4cf4d826c8a3357eba6a4ee02ce7f1d87dfdf2ccad62007", "6351636353655363", 1, -222084454, 1537743641, "3507dbb6b4fb0c7ce7a8ebe816b59e1171f9a6dd42994a5de680ca13dd19c688"], + ["030000807082c40303ff5f983fb753a1e10bdceef94ee16f8f01e4eed55f5a9205f5de429aa27cd60b0000000004acac0053c9fd22cf0047040d2eb11fdb53f9c01c2b4bbe4a67b6901cc1bcf45ff882a0d737b9112d010000000452000051ffffffff5030f1d47f1c4d89d9af529daab00bacd2e520378d1a00aa5ff10cb99d25d7b2010000000953635251516a536a6375d0ef2403802c0e04000000000153d12874030000000003006a0067f4230500000000066552526aacaca7a123d1a534d4e500", "6a", 2, -909824731, 1537743641, "9a2a416f6d32ffdc8ecb2289d828534eda7c7d7e4d1f9441927c912315c0914a"], + ["f76ea95103826a519d65ad5972f43673b46884b721ee18b36ada46bd7640a63082572491e503000000086a536a5253ac0063ffffffff8adcb907b9180c459f7e080750d9be4c5a9298226da89f93fd7e8481b98b2e1d030000000353ac00cf980bee07c7d9f9c11a60b2fd418f4676e11a43d1cc7d2189a815bfda179e4c31aedf3f0200000003005351ffffffff029d36080400000000086a51526300516a658c0366010000000007526553515252ac67a929770246d0f005000000000000000000000000d18ac7b4095b6eed68abd16a1f784e0edfe1139576e04bb4c8ba794d17d2b53b4faf746d129ecd990150e9fb2d2106e208f77ee22ff061ab3af449b1d7975297f86d4c7ed024171183bc90ba8a0da5f0474cd0129f2eae321e3f8b9e30d81a5e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cb0421326f377cdceb8351198031535322936191e22e939b5c7ee78a4a63ce983a3fe9970e2353ad25b52e98956895f17307099aa7add2f2108eac6f5ab2b5b89e9819b064d97710d87b99921c61de50da5f26cf58aee71d6674432e4f16f58ced27886a456fd87c656024910eb3b617bb6cc1498081d04371f7d910b1f0b54e02051fbc6d25eeb251080a21658a2bfe308d8c81cd8dc77acbb388d8a73ecfca10021169cc8dbff1ca5b9037c28be6ca3d0d1007eac1de49e4964bd6a218f72d151c0a00ec5df826fe97d295a3484c6936a2e985451a3669ef013226308473707a1d2954712e966035af7be13b396a95f2407d1811d8b642b4a30d22aafa95b4d0c759032fad00fe4abfae1961165bf398ea47fbb264b2b5d6c2e1d17e31ff1d69039ddb022d2c9674d61bc1f93ea45e3d13211d94178e926e0387fa26cc22dbb39516597d0308f1d990b194f328bdaf84d53d2631a5740c882af71d7184352c416e053afd95030f5386c0cb14cb2a023d649da1f6dd9f295a7c0a1cef3b2d038e817f82dd1f2d02203aa03a896d45c93d5ccb6b26c9a3a86be001fc40571fc162122ec87874df2e9d6deb4b4f1ee0437e929e4a7793738f1143b8d5241e2af7ccc2535b58a88a39e931f3b821f434b3e1ec436cfe99fb1f23cb692227ddf76203df38c678e77184c9242fbc8b670719aaffcb122b8d5958667cecd338563f34860697ee53a95f768ae8cf6f0b48fec5c15e7f677c4314b0d5a09ba4eedebbb66ae074f3e312c9b55f45b9e0c644ee43fe217f2b7acbb128e09868562f3af459ddb1a7046b0717570d002f274cd04e8d59efb0dc1f7c94306c8e838561347baf6406d8409c324696cf3783fce6712f655b7b990729f846ef5f4790e214ddb850a4d533cc5df62edbe2c5d0c485958670c99d49cf834993dcd3fbb78d8db94241a85100e51680c962b1190564fc99d34e7ba4e6e8478b65bfa6ed9a51c98ab5098c7e9880ea5e8d86196508778f8887eff4d55f0eeed6b8ff6c967ef8bce35787e55af530bd4a79fc9e01f441a16717d151ea7daf0144a4cabea1682ea656dcf90ac5d1449e403fdeef97d8d88b0f6c59e8f8e383b91b0bad19d773b772c7bc0b4af6dea4c972e68e7633bf278c8ef2238847524198a3d9052d37dff0df2d2a8f68252794c53dc47356326bbd87b754d0098ddb8be5be642f9a9402cf694e6b5a347f632239e9ab8b89d9e1a5a1afc8225bfffa082e066495fb27be97913b5432b0851dc90a0c665b04bfcfbdc14731e18199ec95c1103f9ca51e10e9a4bf6200d3350516259c180ba1fdb22d0d3c274738ce2a23330061ae7e7064b2b43b26fd3c801e2e63d9e837b929fb9b28b8122fe8edb8f52d380ebd0d961dde66d1e502aec2e9c94509c5e670c809f7d8b388b78e1d2fbe34c6ca27069b248c3475ca71c72950c64811283d5213599c76202b8230415486ec35d7cb8f04b1776285c46983ad03d042e0fc2dda96106ad43d02d9a5f4d6f7f5bcad66a7e5a9cbd5d464174f4f33260ae5cf72869883e61df468c14e8935c8b40700324844d22ac878f9884d53cff5bbe6087001aa7d4435d490c9e1fafa50c868255a9f80ae33a6b1d4c9156e29c7ed7a3a78a0afa222d3dcb8fd1f896a6a34c22c92c1e7d35e8c4e6025968ec53ac1b650a611fe3db88db39152cdd631509f15af0cfeb5b62c073724f36a1fce58eed98aa90e113244eb6a372d3cc894c6827e11252b6bd7f221cb1fdd60abe1bf05e4feed6212413ff5f71fd4c5db0adda7d8b2a21ae3e4749b57cc800f97e7378519710338bce0db9f5dddb2a648192f00b67b2ace42a577c2e9a0c9dae46fdab24dc2764e5919c3836f82353b5c4b8a5048a08533f14710f85e0cd13b99bad54221fad76058bed559fb1b4c5ed3cac820c7993738535885e65474abbc08d913668822698f1b6b26661a8dc2a2cd543c8a7536b61cf00c1454e01e7d94ee8e3502a5a0a52e2ed0837ccaaba55c926f58c331444f552f5a5198896775f8728defc8b8ff3a385eb2342e16c05463168bf2fe1e265633c915543f0473405f939f32c482c79f9a532159e62ff6f8ec2f2b116f931ade9a1bfd1be7653f04426bbe282c104591aa2c3ef097f66866c0a46de6f4f91cd048b5b866d5c22f52a9ce4e3d3289361d686e95dbe0428604c007afe040e5e358705d1449cc6b236002706af8d2d6eba2a20809c3d37b781289bf28bd4a9a5d9c59930f2d69af93198fec49993a379c2801fd9d6afadcb300f0f3d86398c2d395c277c997b80500000000000000000000000074f0e8c8d65fe3f6972a80f56c940de484bcbc2af2aaaa0555da62fbbc6390707e6870cd0d47c336f8c6f6d424ecdab57ba163ff9887e3f9782e2677e35923c3e3a02a586cb9cd840e9099201cdb436383175a86efafe1caf524babf2a41ebd40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060d898b179f65fb0cc2774bac4cda66b08c34480ed76c84d090f96eab186c64880b1479fd1c47e79c5e379ede454cad5af8813ac144c362eb0faf4ca4549696ca86cd558fea394c427adaaf1dfb26744e71984e5718ef9f8668a56e581f4534fb873cc7bdd4c376ecc0c5a4a49d89a87f8fc7a6284e7f10cd42f573292a4d1c6020d676da441cc296aea6eeb246b61e4f5c2622e7f337a494d9926bc57a356b1d5021752724ebf21f93e3496aaa111613d4f6339b7ac613f26418d246b7982341d200b0654e8aa553b821a1ce96e147acac5ebf8d118b55b3cb2daf23d1483a9b2de116cfd640945a614de113b5c4f80a7d7999bfc7c143d02819875b7fc8dbbd71d0f03193f751d13b395eab7620a418a6205053e8d4117711713f9dc8fcb5e1894c5bf0210c164f2c8db267e7941b0ac6eb91fce248b79233a487f7b3bdb25141301729002202c7bf56ca687de0f5fbabb6ce1fd8bcf54312888a555fde502c9e56b62b58f032f4cf70847ac72be6e1fb9e140b969cdf96cf769649ab296f06a52de3b5cebc102239f50fd6c7b1e53072164148677d46961b7f39cfc82f1064dc9db7f46b07a5d6a678b650b2960147e178045aef9eb31d4778dd86a8226301d77c69bfdec1a671b133918411f3198eff5739f389c4a2348b629eb53699d829304277fe57f38ab39a058c6b60fd7b45a18606f0e371864558eae183cd7dc936d46ee8c9affa33f4484870c5e686d88e32fd5e7d16c60540043bfe6fca382e4ce6ecda5e0326a5b01e952a4db320451454ab75c0c77b4b60ddef1204f790449919d42c17228bfa0175d335776f4504f62358e0dc57eb5c846f485a94ce3b3488b5156d1d8c2f43caba4b35cb78f4daa7803981e1dac8f10ac039238361de2a367583d4b0f8d1304b2e840499e1ceb31d6195feedb01e425fe2258b4b6f32dead7ebd8029f581695c7ff08da4fda1a573bf4b3e89f760fcf5058c480871d01501369b351dbbc2d3517429f63a3cbab9fae783789d547faabd1ff0c67e86130436d9348bb54af4d98b087822b10436c6a5375cdb6fa5a8ec7f59cf3c16c2084f6517dc041d16f03eae78024daf3e4bac973d125aa64f65b3ac1295e9c7d17b0329c2cafe98674f5ae145614826e41ad549077ed4a868e7919904e83ffe2edb5ba0b13f70a7f31652b09f0f90306749851998a87744a6657d2b10f969a1708df55ebe7d73cb24fc8202bd51b05bc422ebf7b93db3cf47003f82fc3987a394b10830cd422fd6f84c495a948498194354d2af0e16602f5bf7c02baffdd7aa7e53080447d494da383057fa57853249f4edcd2122c22b9e1259cc4f3c11328ad72f769e496e008f64713473587ea643f18375ca3a17c06faaca0de4d07de15965049570c2c83b35cf9f88ef30a39ab0807cc0f2bdb6c17904cecd81849808bbfac6d8df757d02151fa906dbdd540f1b9389f222827f18a04b276b4ef00e5f6174819e50adfcf75227086d3b59b1193d694dc362ea81be7946afa56453ce82c3af8bd0d64939dc105be849f26078ef4b9d5986e1ba5b4404d660ab8b8e5299ab475a7a928def771419231cd40e63e180f9a3018397a5a2e2ca2cc8c267826bde56921c66a66c089f93c907d064c6efcded3d02e499fb01665be658368d67895da938eab663f2ca5a431bb39b2f92d3ee1d7633f7d9d0ac4a5211a6b8b7ebebe96bcb35800692a5145e5a9fbe4db9bf1e5759065be49ff4243aa309ee99941aebec5cc84d1104a0d23eb04a93b531730c2abcaf8f864170a39570f15804964c5901dd1c283466f2c4f8980bed7f6471a0529513b7647fc4b787fddae50f16864ed3055902df45d2e6e44d8b9e49928c8a73c0496889edbd1fd08353cf05c97acb77966aba1783e0f1c8f89464f8600882723ac39278e5041dc55c546612e585c4dfdfcf9a92b29c83fab00fd2ebc73d7e667dd7e24a808c7930b94204a8060d7aaaa1e8cf4b864599394a36770e80a5a4d98b0cfbd9a0384f838630bc60696cad28ab957093a0c4a8f0303d798352946f65a43e518f024a69457f3e8bf4ec1b82962ed7253ba17b8be168cf896e3be674d35fea7604793b2dcbcec05e6326aef5e7c966da969305fc07e50706fab0b035c1da6316ada73979ec23bfc352006463475434370dce84670f8657177a7245d99b9c257685d497cc64585782ab5cdb9cb23bc9f9fd7e178bdd58a65fac17b54ae288c73d7731305ab376235f44aab23f5eec53f473e9a93ea2d6d1eed922f7e32c856681a44da7fb57af417fdbb8f684aaf599b32d92a46f37a76c5ce108677a7cdef98ba59674f698667084c9f8c83d69f09c5a2bebb7383108cbc5447535c89fb2bd2597b10443248ed3f497455879e3469fe5a8ee806c22150e8e4d5014024f35c92fec31262cb0f2a1ab70c", "6a6300005253ac00", 2, -1153722531, 1537743641, "3a8f32cae5cbb3eee5bc5cbae864ff9dc67a4fce849c9a985c1f54c1bb002757"], + ["0ac29e390102bceb635b13b9338ceb9ccbe339cccaae7c7bc40666459f979ca274bf36205a0200000000f67032a30130a3ca05000000000400636a519478bfc900", "650053656a65ac53ac", 0, -1085558292, 0, "8e2daa9d34834ddb5e9777162b2e47f44e62f1ff5dfdf399cba9b23ba3517d10"], + ["030000807082c403018a2a1ba687afea4a52029579aeb1d5ddded2bed188674a30c125883690c2cc4903000000076a5151656aacacffffffff03e4f4e301000000000253ac262c19010000000006006a636a65009894d702000000000351636a00000000ec2a3e4300", "6363", 0, 1890242588, 1537743641, "54ffacf547ebc187e8b53de85b716f107afccae8b08dff1af74f0337b7689d31"], + ["030000807082c40303b8623a3f3ff9d19434e3431734f111ce4429ffdca0b89a8a421de97428354e220100000003516363ffffffffb20ba1f6f396bee2616a59af0ff2099efb05fe32c30f9c77e059d29598d508010100000000fffffffffc670846c89acbeb09c68ff838225122394b3e5258a2af8d16c971770eb1639003000000016affffffff049c96aa0300000000086365635151535165a595e80100000000086a525363515363656911630200000000070065536500516ae23b6a05000000000452acac53a0de5df0d6d82e7b00", "6351526a6a", 1, -502947489, 1537743641, "af50ccb58784c20e1a7e9731aea5607c426d700c491d33ccab5074f11049a196"], + ["ef316154027cf974d57c76f066107824238777528d3cc8460c7cecb77d05d516fce7a9b4f5030000000752650000635100ffffffff4e52eab46a0fb57070a9d0f51fb56dc4de70a6c5e9343817013973357aabb0bb0000000003005363ffffffff024dbd0203000000000353006a58e289030000000000c7e7b6f400", "000000635151", 0, 1968658531, 1537743641, "f2e925d91d6ad259bd40968c8045f55966cd923a0eb4044b29644e46ec6520d7"], + ["030000807082c40303c3df1b2dd9eec22f2aacb231785080089ab9b6ba45a554128e092f1fddece5e90300000009acac5300ac51006500ffffffffc23f486b55d90a45a6cd74e1ac31a575ef8d98c662205e45ac11ffc07ffc013a0100000004acac5363ffffffff40e41bcc92726fb663a1c38d9ad238ce3961535b3c63e48737a81cdef21b647f0300000006006351635100ffffffff011c08d20100000000000000000071ec68e603acaaeb0200000000000000000000000016f9ac81bbd982e0bd58a8d0249f9c4def8d3c6a746768eee4661c991eff2fa38a6b35cbdb7ca7ea49f1d234277f19ac920991fef0812a9fa06f09595e25bb3042e9bb00b6e936563417e1ef99407b22cbff6a0c2f534f701577b21825f1da0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de66497b230809c1cce95cfd042e5273fe091143cded579bce06c02fe0937e54ba354eade0b09de1de06a481c0d44fbaf8a8595e10c346ccabaccd2f008cc94a688a2c13041e63749efb7d258e92cdd9d846eb0841f85b9d3e7e216ba4b1500f7ed070649eb0c99a4ab7534c94dd53d0d354c20c7f93d849025bc58388762d800319ea7c49a3865d01f82f01e95bf95d664e91039f7afd58524a8b5515d7f6ff3d0318858c7ba342c66455744149ee0407ebeae6be27cef4dce0d43535928dc775b20a01131338e35a7963484be6c78658f32c108f8211fa3b7f2e98ca33f35d9e6f6fb1456c9c244505fa3861ce578d63aaba4b2a1f4e453fed769d2cae6aca630046031a9d1de3e363453f04cd0f9a92cc1a6db73d3e0753873ff829e1fb56b1ebfdb60226731477b3ca0d73049e639a3389ba02b6e37307980673aeebcbc512d71b46fc022f65afab00bf9c791dd7980143c9b689646b86bc39d1229725386e244ee404730314e8230771edfa4374fa2db71442849ab067bf6dd4118b8c45d167cea6069d8b0228f5a7e335561f85869e44a76b5f772c8b0fca5e8e7b3bb3780addf2643d2353abb35d1d0d631a29525dec1c02beceaa6450f3982b663d29245b15658f16f14e256f5787e73943de9dc271d912cebbd87f4ced0cc163f24093fa46eacd36ede6a22ca339f8d52707fe29b1cf7cc774f51242eb352c7f303a58b9377fe0e397f0cb34f6606ac35ba1e289441496daeaa72e11106c3891316c2da188169b6f0592107fa36442a42ff6fad8bead1279a6121775ee11943d1b20fd61c0eb77e8649f7296dc2efe802878224191224120b9ad1f540202fcef5391fa7c663980a12bfcc10868a619273f8694f16f9b226e8dcc72d50062d0581bb9ca649841aac558e754a266436458684e1c1ffd23280ce68924d5a0c046f128fc0428313c86fd72101aaa65e224fdf141c1b79b4c510ad405065bc9b675b297cb9f311e43949414fe39d55c5afc48d7fc655cff071e0914be05dc5c6ecee0d1e7a10995519e79839bae73dd5b4fd6c765f7468697a06438ddea3e308fe16d55314e18d83faa1ba88a6d05b87231c26ae6c3599520576484bfab5a290e902c75c41e8adc890f70154feb6bac939306d2a8b7255d3e17f3dec2c41ce2b0ccb5ffe1dcedf95241e970af918f88f0217ddbd3eafcfa4ff27910855bdee7de53f6c509354cba8a499bf569649b0b441f201e403e99c031d2c6b9594c9103669178ae6985043472002b68d8b5c6a7b2c548cb5eb7998d651022c81e8625dc307f15eba116f21c3712911762d41072ed9dee0858bf2b3378c38856164a80262ca56754f853e6dc7c88d9040b64fa73727faec9038b2fed7df4a87988ea95105a2be867ccfd9a20ea64069dd264fdd6e014e78de671c32ccb56105dcb90cede3354d7a2df9e5de356de47b89f1ccd5b61627f2f25bff792259c6d79e25042fcf7e53dd6c7f353921eb592f4dce9bff16a7cd9dded1753d0b2daa4d22e8e7d887fede3a4b9a54c2b4ac4364fd04692ebba4dce63448cca21ed1257192e32912a0344e13c9caf6e99f8e3bb5bbe36843ff13dd4d43d73ceff94facc0f81ca31e8a2a73bd0ef394b3ed53465d055bc95912f750a4cfac64266b1552af0d933dfab3edfafb687820dc187df7a19eca8c2dbae6d29c56934adf670a1aa70376275708c6371e271afddb08ca0eb54c93a41e718b46c6a6e021365ece4ec418df7b08409fb1dcd370a0925dd3acf1c5463b5a83b949c4e859937efcd190c3486b533a65395cc647c435adae6fb49509d5263e75f09a896893ef73da8548cd5d77d1ef8fa84bd54ba7dc562ae99e2a28fa435467bd42847c1716e9043262148a9b0f06387f44d7e4318ac690594f1ba15c7671216ca1ceafb50d89acf42258da2e62c1459d6ba68d24c00a3bfb6eb479f4dedcab8724d7bd55ce3a9787697ff9189ca3fc03a9eeb8d1d54ec5109b68bd1ac617803ecd32773d130a876ad40b93baa19f52acfcd1bfae246ef0cd93c1503a14b9bdaabf83a6d01e72f981f9616da5fa648025f5664b15d41eccf1360d931a586f09af69914be175e72bb76caa0aac642a807650af533abe3caeeeea6d00bd69be539b28e3a398dca7edd35872ab59e193588b29e26345bdabbba58b59f6c04762b11d3ae247101f9c6bdde6ccca703d0899676c1c3604052d73ef84559d6b31a36c6279d98ad9b6f2d2a3f4763e5b569d0b744e96b889b6f08294f3d1a457700dabdfb198ed03f8b37775c13038adf137fe3cb0100000000000000000000000081243d8b97d2eac10dfc3893bcc95d2f4d12a2351def841ab4e70d567d16afc0c25d08ff14fc8ca1c2420266bfcd1849e1de1031587b09602273cdd1c5b5fdc8ec6105ad0c092982473ce96c982330c46075223567b111a7ec3e337d66c0096e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cdb2a85e43599025ed31b589ab3358027135c031d8f7ec598bd5ef62e9426b62bb045f0827d67ae4e7d3a9855c2b042dba21376cbae556188fed8c4bb2cb78aa260e2aa88f8076d43b329e0afa5e373990468ccabe2bea611198545ed1b232d4dd02ee9efd4568d79b5267b9d3461703b54c55c6cba65964f4a09571fed64aa30325adc5f51de18f6a4b052ab46278b71e1377ef57479876c82288f2ed2c9fc8850228e40c01fb78edb7e54a4a379b712ecdf63356337d133ed08801c7409d01548b0a0693374db3738a20f767490a0bbe88cdee075c92763026119e2e35a0de4d8278af5d5bff70a12298c91f30b03974599badec14480340e85d0f6a21046d4ff0d3031b1c9960d8cdd447a69069d6a85e083863fd7273909aed28228ad371cafcad56020beee551f060b48332850ce4719347558c03c4bba353c26dd8f03a5524bd76c8030bba634bb56a0ffb54c251ea41d162761186b61a539bdb912e774c2a494245b90325daa4670ac493a85617737cf33894796a1e3f4682a5fead2da94604f3477c900324ddc6924f93fc678614860414befe71100027c895a2470db5490595545350aa42d4fb774317d1544bfe8dfca7db61809c54c320beeb8e6edf49a371a5c22c4504ef474391b7b1617c932ab53ec1744392e197e082a2d69a16d5d6826677cc113fda614cff6df58014af508c2ccb2550d9d7ed08183ef321695ffb5d7b7ab0a48ca9dd4606890dfafe232618c50346067581527c14538007c8d37450278bb72796b6ebf3b590fd4438875365a55aa5c3081a26e12d3a2c790b8bef5d481c34065484c77ebec0303fdcde2da7b60c868deefd664c475493954bbaa6aa343d6e82c0529aac8d6a5c0cd90fb157c14ef65302694de9ba4bde2eb08b23fc2fc8ec6f86ee7bf2dc6dfc0361e725ec5d65ac7b0cae191b56ab00481ac9af1fdd4a3f9d621bf76b5135fd17b86efd1aaf7aafb58b78df6b0861f17b2263fe09b0c0e1bcfc5650004d6963519eceb9c896824e5d0a142934aab254bdf0b09165e3bb1ce3fd3560230c1aaa9f86073bce6736d72fba972e08a5f117927c811b70c315bdea99133e49fdbcde41d7715fab06551643cc0e1ccd5530bd976d3886b2089408089c54923f5a0a59f4197946f1ce720508ee4b7036bd38bae966bc0a9ffc668611eed1564b3fddacfac8bc76a3a6e522ee506a4a61210ba8a934583b11e505864851aed4fecbac636bdc9cfc566782160892b49072da3fdd234d01f13157e9b220a05ffc9e22c1f5cdfb7ba6307e05b67bd91be3c101bf69adc1975719ff674db21b925ed558fde7ebf757ffdbb2f4a8e74e7906f0b6d6fd2ec7b8f70f69603f28c258d92b9b1897ad1ea77c6f45d2c514d9fb7dc2a1d6fc532ea98475ff2e78a12835c46ccf518c4f5d619f63e5459cd19d530fe98f6d6668787a409f34c9b6f9f3ebc117079a9bff3e3f17fc4f8be27e6eddb208c7adf7d533dd8e0d83865a5b17691b8c1b5c1b3ec5a9bf53bc4e49e99deff58139e385e7883458fea77b7c2a520c6fddd9eebced08e0d8ad0d751d2cd0f21a34f81222cb239c8f5bc1ceae9c3c53bcfb785d763340a63f2f353de1330da3b9d99398fa451d3a9d4f34d7e0e476942a1514cb1a8c6b3fcc3d9739d596bb18cfbfe75ee94428703429e3095ed6475d77f5b8064ffec2156df04379e521088815f56737c29718b34ed6eab0c7d8adcb52bcdf42983b6b190004780b691eb49ac4bbf0541a82e8fa9b683eec06c85404d2e1331d677cc4cce84a9815d48bd6dd8b1aa5cb1afb233ff3ade529456aecc87128d476126cf558e9ceea1c75c45ad7401f7125a5fbd56c2f7a318fa48f9c4d25f68fc395d04c9fedc1785c453e7735759973295ca2105e54e4eb885a6606d6be622420cb51c90863ee84b24ae8750c66c3a5ff07c36279c404713abd40583248ca92735a388236c039c6c37e6db02efa9a406a759b5a939f484ee9ce06255e796478c329fb087ad42c9c37d9136bcf1f3b146d1176cde0e5170d0d882cc3cf93fbf55fc9a151dfa44264b8241e83358d891875a844283cc17d5600459f9ff72afb03775a7c73e57a78cce2fbefb2d7781d284be0905ae80a0ff7ed71b8fe014bc63bce701e07c4c4ad949e84f6ef1094972b02a4eccb1782e03b6e85c35a27c1093cbf0d7b47217f29a5aa509fbfdb99e9d6364001c823ce6649b4154e721d4370ae7680ae25136ba1a9e1b92ae4d973980107526b08fe71efc86cf984d2b43a0de3c6912408d311c7917a463c3b5100000000000000005fc70c0500000000d57464a0b8b616f922efd8ac40246827488235dfbac232367122926d36ab0e10a22fea7c4863f9a3fc790cf5f62e66a8144405df4e0c0384d8b82aac28fcb7df1da7fae4d77c257c79eb42e3dfb09f38105bac42bd4c056c5e27a5a6226b2daf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000904e78ac898ba055a11aecc3368e7165bc6e09ff770828a3d692ae9a7f5644d2ef9f5ba7d0c63757021fc3f060b0cf92c97d8099f7ae1480f3c0692ecacadb6d4f821c1e057e613c1e28d800dbfbfcbd7cb18086f5c0c9105d45ad1caa8cf7c3c711470b96a63ed8b15ec0d467ea37df14c0ebfb7d16d31f6280ea444f46e4320329beda6867da9b212b9f48364b4ad3a5dfedc3a5b300bfcaecdb2347b6da272b03251aa9d89714439a03394d00cada713c1c082ed2e387a14dea0c6c5f117d13a20a01ad843d24d2f285a2f79bf148b5058546fde2d1274ed39eb8fee83c1e856715a1dc680484e4fda5fe762018b08faca4406286b8df3bbdd48dd63b0ccfab3a4e03099c71f699bfdb26eb326388435194965126a80cc4f080464161ae75cbe0bf090314b574b4b90817e3b03edc97a5b490b066c45282b399fea98ae33b3e300727bf031d20e071df3f8ddb25d2259431e15b764e07e20855f20421061475a4d3139ec0021a3b13eff413cbb0f0eace2ee88ecace05f100323a665d1bb7436ee26d2d0a6c0324ec29a8685b7fd866388c4f499703fe595c274fb12cfef25cc5bb3ea5d04739ca9b6d101d64821299af876ec1f55d4b5c5d971babd20920c3d7f3a980ce1e662adbf127cccbfec247f4126b3adb632f3944172410b173e1a52339bb1e540ae9bacca744bf38088901240c5ce6e3f80a654e7d52fd7573ed765f50d88a20a8fa54a899c91d3d2838829399544df9fc87f87d4ce6032d09107f1974194ef9a04980c664093e09d2c261cd66b6bf79532bbb9dafb1d71c71652a2c343dd79ed4e7c1e6cb860e2878c105480c02282869e720c18c3e3a172a318b2e08337bbbff92cf552373861daf5992a58b7a1094e086681cc820ab95f3a85d739bdf47f44ab6ed97766ebac005dfbeb68c5c4d33b00229a2c43f3bc39b372d0386fb94ee5ca4344a20fc14ed27733ee35f78903a1b12e886d785b6adf89806d5b424ae2a60e5d86dbc7c3ac8177f623f8b3cc866f410d3efcb8609746cf42c0fd1c717596a4eea137d4dce6eab5ae26bf7ae7af6fc4067536291786c827d19844e00059528b740d771c4f60626e74cb8f750ad372a83b4032c6cb4507bee1b8164154f130edca792a684b2f2a66d8c916e7eaa7c91022462e4f17989f4cf593160c813724001f03b5919442e6a0a9dc548e1d560aef669c0130681d3bb788d705618532bed1b2d660e6789a0b1b7b6c22ecaedcb176718b027f2504435a4b32ab92baa0939c5d359eb52ff33d0e909f676ec46dedfea43b718f771f3baed337fd9e307e1d9af51e21242c74d40da347e5fe4c81c9417d20a7214912050aed6517c13df2d8589401d99a059127bdc3b7780f7ce8e7351c113ba3a0659516115b5b6d6abca37ae481aad3459f32c5727903d3705e7888f2b75ad3fd43c6f99ee3d0a35bf5384edb2a2f14d8630b1a02e45d139b525ce465402ff5bc619205f125b8c8564099989724759df2b83aa53edf6c2bdab9c9e4d1aaf9d81c7c034b1ae513eed40c18914ac5da6354442f87bf45e8d6a0cfc4612739cf5a5ac3eefcfd75ccd4859b48a31d6253e34f5857c0c96c69ac5d4ad5ea67818399e00eb343a5d8d1217998242f79b9df025246065a851b7187e1531cbb5f134ca7603368b8d4842de371a649a2e4e3bd282660fcdbdd16833737630e5c993d98eec93dd0f9a7551828813a3a841d7df6fc9a49debc6c6d7397b4c9d3eef50c402e76f7f0a14fc5c15fea0bb663ff782a2a2d204994e3e1c2fa720718ac3274d9ebb483fb44a6cb9ab0d2dbf6ffb095ee8aff660223045a16e0a9b88555f1e1822b1a00c57e9e51efcb8d6ae656555ae08a34614b7be4d4449aeff69f229d12777503f0282153943373f399ec24238b52bc9f0c541fe259704a0b8c42b14bf8251d370b9c52d3e10c9dff065392a44b79181f2e312e0edb5a52807a9a17ec1cd77c648443fd5a8d9e35a60a4a370e499520721dc68337dc229dd7e1e66b309795fc74e014e8e9872c09844f6903ce1ce4cfaf73dc9f78d425ba7095c8085a1556718933425dce600a2cc6d9540257657cebbab77c0701e0ebb4d539a517931376731ec7cc2feaf87806632bd2bac81a507433ac44f536f9a9c05d853dcbf8e8b0f775a2191f42fcca02d6f6b836561f1514c8e8db834cd60b23a9001f8d82f229bc8fc9cea34da6ba6723f81a33a44ff253c68f1c6c4bf056f78012e79fc4772d1b1f11528e04703cc8379b6af67a2a0d0946b911409ec48f920d2f51262ef4139b05ae017be324d9dcc3d1eebb90880d4002fc185da8141eed3dcb12b55102f2e25880c89a2c4db268dafc25f62b084ab94f783d124da0f134b07dfd5007abdbce7b42886e49c5cc33e9e483710c1d7f9ea6bdd03653a5e3cde50e0e7476d0a", "ac", 1, -1145859658, 0, "8a2c637ee57d8bedf2caff01c20488b5fabfc4a38e6585d3b883894468d6da26"], + ["030000807082c403024a7411500f5982849bbfd24462124954c851d978cd867f2b20a61663f41f20b9010000000465acac65ffffffff1a990d6104bfc4e85e8bfdcf5c0bdda19f7ca458ae6f8e8a848324247f7e66dd000000000265653c5f3c4204d782b404000000000551ac6a00630a028602000000000265653228d80200000000095352ac6a52536a51000846010400000000030051630000000000000000030fb0d302000000000000000000000000a4aa7488bbd0bf7db1ec73fefee568e877fb50f55b2de104f140e43dbfd7c21e0eae010ab9bf9f32c9097b419fbe105dd204be8063932857a332762591190af8e1dcd02656bebdb7014a6fedc4c028d939962d9731f0a751f6fd6df651138faf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000986f387bb184cbe7871ef3561bce8f04523540c00b5b4a1645abf75e61ff67bf0be349aa9e15a3521d2e76eed208b22fcf0822a75e03a1efabcd9e9ae841e83a2e17dbb924a852d6adaf20d15b96204338671e8dad68e6a1fdffd96f97722aef41b3b162d2d7af05ef0a1bdf042d8c74cd91cad646cfb94cc8d835b3944da1ac03171fd89e5609e7ecff6c606964dfce35af10e78e13e5c238539e914f2157844e021253ee2409652ddfd587fee4e427fb8040e14be85ac7de59520cff87284327eb0b00fb0312b439b06f777165d0e4224f81d670cb93e4760958cdb7327abb36529215e6ead094f3c2568533e5d679324da24afbe2ab1548a9034fc2348dd15c65e8030c825e57f25b1194cfd8921758942975f02e98c6697da5bbecd521bdcc9a6ee6022ed6c124aba2567aa45e65ac46e332c219ceb59b53f3ef6b657adaa7e6a2b4ad02036f57b24d1411b79ec5604426d00e389443a82f746a09b5ab5d449def043a0402199ded7e4ad4697b8cf1854763d77636ddea3ae5cd2ed67a70f2b7f6fc0591ae022badf7528076583b191386ce00a7049c18b097604caa808c997fe599cab7e9ef29c4b1785bff095080ca6b5e5c1f335f7068590745203399ef6f1740d39f0e98ccc83ca54e51e10ae54ec42ba7912211eb886c87c08e899851c3eba47cfb3b1055e202cfa2ac22a9e5a4772b912001e63025e92e1e29d8d3b134b87064e3aa8637b190a38b990e004ccc5b32b662d59b78b3935343498ab779b74932244daf2ae2a42325a724ec0709ce1db403ca03d6483369fe0bf505fc97291f2358cfdb93bcc8dc0fd56f9c1179f226b377d6ad9ada3bbd70f4d14c3204574c1131c9fc05b4892f58b1a2b3d1bb9f19c7826230df473f4ee7e991ee22cf5618ae216a45da04fdcf9b07daa60cd461fcdd17fed4529e7626d238cef3f7c1fa31a00a041775fda6b942eb89537c5a2f4ea68399758b60426db7736cd484fdb07e6abe33d774d93565d31b35b8ce1e3d753d67c3cb0910fc73fb27a99f84a5429afab5a5899d79faeafc2f15cb86c668dfee23867bd1c592d2ea76d1e481cb65bb1d41532cfdcc32b97006b603356b976d0fe8dfde95db8417e3c186a273f354f4b3a70a1fed56f62ef1a8b8dbef3243e2e1a5cb602e72a10f26be42f9e52fb8e1a5208491a56d055086fb73e05bae35ec2015d557a49ce88901287075e8181067441f8a61ef5db0fa0a9186b06daf5d4dbb03cdb2fc110b9ee36fa0c91c518a2f94f262a762fdb26da207522d47d4d6630ca105992378ef38ded02b4f3184714f67c925116e3e23468c3575fbec8cd13179250eab102f3af6c99f85f430cf398b7e2fd8a3faf40ec388ac77ec8e0c548f0a08ae84d120fba345a5e16596c4da3c4e95ed3a1467ad844fc24f511f9e1d26833a792653f074a5f7e045e7ba1c0fdbd9e45f73f71cff58c750c7c739d31d119b3a6858e47d8131ff181d7bc78a741a7ae6253973898cac2a3c2ad5e17d3b4071ec1f8019e79118af2697d75625c88da0f9ca2d550fa0a3bcfb645f803f8ca8eba233ce46ff0054a31ab08670972bf10df231c706fe2ad467ac350c9251567e65b1ab83ac9b4119d5f1263c66d3fcb1b7be5b3946427e2fc496d0665cb915e7aed0947fee710f828060a7eddce7ca9fbac7cb840dfc10a82e788905beb048996a5547fd4e77fdb73f58f6c08d70c7d62295342a30e2cf76256e0ea4a63a6693334204fa2d09041858ad3832eac0999aae8441c0edede014e86ae6afa1a769ae0f007db4f9f6cbf5dea9e497155e0a8d4aa786501f51d901965f82069ade39d5288f1330240f6cc299943ca7b7c7769a1efd5edcf37ed2e1606cec694601062bde11ce9e09aa50494092765b6aff99f274e5abe2c31f4ee6ff0daa696dc8d8c6f7e129619fb1910e50bf65962f7cedd57c8da1aeb3c104c73ed0f7499c4434ac22a975580f9801993156b11c9834e89e58f024e68ca3ca745c0794bc385999945d76c189ac2567140f3dfb8c15eaa9227f0a155f3d0cd6161e12815728f42a9323a5868f96c40139182dbf4c6c2ff13dacb76a01eeecd5d2f47c47e59eabc7722980a5b501c7209b8721667757409f6e235d5c3cfb23a5a24e35b7aadba7867735a1b26ef4500a89a525593469599bb7dc249692afc9507dae6f92ab2bd346025cb84b12c43e8aebc69d8538622acaae84f138dafcbad1f1ae521c3f4fa2217503da046595be1e325c219ebcc829d9e9787fe609c7fc01150ec2f8c93ef04fd66bcd77e2f226ee0000000000000000f8a0a6030000000075f24809a5afe4bb4277a6d61b6a986e60acab2a9a9809635279644cb8a31b6cca921ea9e2a9709b045f38897c1e3ab04c881540eb1f33f753fd7fb528fbf142f6872880a1750f79907a82929c7b50dc0fd952630f34364c61f42ccf6ddcf03c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b3a6a7d8476b36be8f510e33809681ea56467f797746754681541e5e8360ca9871bd7e05c7841db817a1c6b29075e628977021525e42498d16224ed22718a8b8f6f67c8f469ea24106d0ae757f8d84c8875c34d4b12929cb1cd5191255f5067d6f9223e922497836215cb3331b3361b8d5b6a2c35a4f5543e707cc27935a9a603053c80a85ae6de6583784218ac180aefa1488a4678ce58fbe5a7d3c35825f9f1022ea681acd9277088935b68f72cf02050683128911b5899436dfb6e4cb661c4590a045c75a5be251c7339493c60da3e15cf972d9f23d48f6c009c4aab7f26c62b270469c3cd0d06e539ab4ce88fb3510f881b2808cc8a9ea8e95cb94dd51ea90b26030b41ee9b0b1d858b45a836a2328f2e8880a59a2183b44faa0f4ff4e6df6c94e10328d923c59ada3f4fae77c8b335e3d59fb5823689498e29fa52b5de1cfa2f3b0d032cfdf8769374e66337d7e76b68231e4183a8005b3182ec3de616f7706a22580a032e63a22418a3b2220b290606889b47520530c6fa560e76f825a3f109543c516f03012b24bc5accbe250ec5d4fd45aa3726e794b32a98618c90ec2e98638314401ead43c2121bc8ee52cf779e64b3e97821a1c9d8fdaf116d6c01b3251a976a4c29cf0d0c4f49dc786a7d3e4fbd6bf779289c8bdb384268b833af7404239fed3cb1b0ce1a0ce20b8c72d86dfff30fd2159c368ca484c4e02237edcaa465de2529a721fdfcef4a93139d06892988bca349c6c2d654c59bfc6216bf986892ef0b484163a734fb4468f7a1c6fae2a9c8b00b04a8f3392c4a0d07caadb243ff482efe1023b40d467d9221ad17f5a50ac853d2e4b895fdfda46bce1d629c40f8cf5823db04643bb38e6002a81f5a74c62f3406e25e2ad7142cd780e2e279956e9d597536732425fb807407bee52a2db3698394ec18747de14e356c072a080e97dc318b38d4695473f4f1351e402ced91be7f68bcbceffec4afff680cdb832ec2738f319cb1df2af9ea2bb479b52b43d0dbbba62b1c6f380d19db129c6e7acfbbb7349e86c2515978a4a47fc4f4917dd21eafef8f84363b8c05adfe77cbdb9fcf7177acf2275d31d505023622d1ca2fdb63fe2bffb1cba6ca4b5e2ee0fe441fa8e47a796c21bb727e87cadb82e34f3ab4f6e5221a6b282b5c381bb68577a86590a0d43467174f9956b59ececa800a03040f5a2c0ae83077c536bb662ce9c4ffb81c8522101373bcfe8b66b30c3df57ba33369399988edb8fd5019aa87dd392223f70f254fe821840ae06c839589fb6699eb380c28f1f50c5e2e2e663589b63b5afdc1958b4ee707bb7ae38cdbc2f3ac635354c9af477aedc928cc269c04090d443f8b1262f799ff06f15288c64c626a10ab71c0b47e8473c16955c995d258d10352e3cdaac7aa940047c9e5843ae4e57c942a6cd12b67ebbbcfa6ed6385ee9773fd2ef650747d24b3d18308d2037830d5a57be30edaaf1a5b1abca415c9898d9e94e3dbfe8cba71d863e7c6867c4d3b33481f0f7988bb3908a95dbc8c29419e950dd25c3d8739e3d80c0649afa2c992cfcf13b02d91cb0961a2c4e5e4f2aea332953f1bc9a1756d383f2ac310a6ce185b3520e5fdc8f8b7753cc5e79e803ac7ea408e2c328fcdae6386ea3b0024cadad7232c8e3b19cc57941979726776c94198b212e57b37b183277d4dc5b88dff470f3d2c4170d0a6c5cb6a927e58b53c194d4c0fc02fc55bde1c0d6bb8b0d04ec1c322016a78b891f562585c9acf803368ea356bfbc25b62faad035dda542ed37211fa4e6223e6fd6caf2ee392d64a9e15f6cb2d362cdf1d6c2c91460455f463b8e6a15e64a29c48d26e5d0571aca0273ec571ac474a95745292023664755550730e23b71bbdf7fa9793f164a6cd0401d50fc5d7a6172d5d446fd72cd8625ecf2f359d8c81d4545f105e3b81d382f8b89d11d3cc37d387b53e386bdc55373e22c78ab35cde97f81e1ae94e924e6a3803b47a8d6ffb91000b26ded02eb5033cac6ed524036dfa077015a3058e4b9befb64f8ac94ac8d6f41c5c3275dfb35a03c7663e10b5843a88b2e2c02a1ca366ce9dec87e0fb8a79a210a5bc8d6bc1af1d35603ccd345a42f78b01cb5123dc0773e5ed504e33cc6e0e68a5b1e1444f5dd9e7d22635b8294f8390d28da3985a147463382e095e0bd70387ce1469cd6530dd4e3d4dd4e71ca2565b605fba4f14c85b9232ae82f03970dbaa2f693e29ab9827427f1902bfb6d3e0493c2d788ec50ffde9f11be265ffd7498500c3d8c6b1a8025439e56c12d5e123f10000000000000000b8c6890500000000d100fcfc317f22e645a0fac59faa18118768c507c63fbfdf4bd882f03fceae774a05757a720f134efa130f0f2eae24c7b8c5e6977bc3dcbe63a7b5a6f0af60d306ed623d35203ea3f692e5d57a424ab9b6fab12718f779ae72a72c37e9baa769000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006c2ec908c7955507edb01ee4663595db43fbe72e4cada0cb96ee58edcfc8028d89c3dde305042bd1a1ed50ab00147295b33a14f231142fc51263b0a8b4e7089a45c905930c381f09f081ef130fcefa45a81dc2614a1d4576fc2d13a03e676386fe4d6a2f3a795f0beeba42a6e5370e96d2225854d0df42c09a5e32d32df4123702210fc754711ff085946403245a221c31f540729438466a550de2f5f1639bcdda03040acfd191fbccbcd3ea1f973a002a056d6cceeb86b04a2c94527bf1c7cb792f0a036d538d0e51958d325ef202e4e165691cbf692a7c412df1b2818730652e54afde69f4b2125f1d3218ade092dba37989c66bf9d5b74d062555ed5f1ec82ac36003268016aa478b1c4b44f2a29d0fe6ae7237915e1bce2bda8e3a22a4dfd48e8a630313b1f194df63a6286ca1f62af237d278c0fd7f4de31993dea338dd8406ce40da0219fd67a5488fe47acc34b97385348c4c87207319ee934573929862b83ec651220223ed3ef917dfc8ceeb5d0b04469278ceccb4736e3c85eed35d47831e0b03c9f2022d6c5954cfea4a228dc78f5b51a48366a8739102d2488bf3b989e16bbe02afa1577df632e13baa270051ceecff1564592f6251c9f615aa2b818e7a7ce406739983288e5dfbddca8a552ce7fdbd49b9baa0aa9f7505d65c6a01631dff9f9eea42a96b76b075a2dfb6efb9a536db7f23d733b5e28cf48417c39a5240c9277aba3795e497cfbb3704fb9686b326a1b755bb54aef58c71ce40b6e6bfec27d3b8e3f4ad90494dc5cafe4c07e83920ada2d9057275485b59bc6ca8368e9d1660da75f6a5edea7321084e7c1a5970ae6d3f6f77727f99649ee33c766be545b71702c71eb7be1fdc9c3faa80e130846d103e6327b51c298766c92414adcf986d36a32925826d01f4453f548bd87370bc96e71c4d5b999cdb99cb597a092badae5fa1e1a32cea392c94c3cc2216033051f995996ea17cd031f0b9a3b7522a3c3cb197710a720d8812def5c85928777d1321298441f6ced45f243cd43f88b2619a1916d618232ad78071734de30bdc33d0799e78af5e0ab6354ee260e456e36dff141c076144c395eee850a1fc7ffb2f1f675ceb8ef3145ab9be4ab3f134a4d52001bdd71ac20d55a3c928dc87c4a907ab91c2edaaedc8c8a89a9f710fec34ac731f1c0f73bf9aef353eb13ec982517db637c955fa789d1a4f491dc520724c6aba69c18eeedecf65aa09e021962211c5c8b490420a0ab1ae4c51789a39def7b74a90eb1cac005b317d6c9171a745880a7f61761b68e501dca82ab94160af5e481de0ad2ebd12fbb197efacb06915408a791e79544f5467f824ec6d09720dc5aca2749fd00bdaeb835d3858aa60e463850337509e58a64a7ee5646da813e46443fbc3042bf61d559c86c072c361a60897ad04e47f2d07bf2f976fd5c839bc06a2b7b630f1584ff4f8a863fff0fde8cb423d89132034f655f64e156dcafeeb7ddae37b6e7981ef00cab5854c2fec1703dbdc456a22f6324003147dfa9eb03dd8a545eab7df6c5e99c3061b9018e71ec1c51cabfcd10e354254d3c987853bb5784e84d3e38342003c1caa5f6d3ac81e4aa278af4e62a5e2ac29b39c0d0db53a23052090f519b00b1bc110f930bc578fc4fc45555d4d712d5017835f1d6bfb729adcf50aeaa61427c609f28163d69c5cd9b6de7456435788144cbb790bc0bf467821dccb152d34eedc402bbf0949497fa2db335f224e021c72660ea14a09654a2131034b7c3ac6bfc8a6e85ab18c1a7a2b21cfe424ef95a40dd426c33f4adb3a081e4056fd55fc461da5aeccb174b4ea87b58fc93e547aac8e90bdfc99b9c4c80c3a3b928ebf7b041d550fef79c83fee2f5b1c64d21a11d0d5201a5b12fd1ac943990b023226f9750fc019f010a0b2b9d976eadd9cc4201c0091a33b39d7c6f161ca442c23187a03072a0899d34de0f5416e5b450eecca9fc74075d9d4305baf9f1eb47a61b45556eb701f069f5733c238a4c4cb2e113e04824d3b218ff5231e68d317465a41443cf133e26089b6618df05eddf2e68ff7be8adf3a5b771dcf614462df5158718ac1b084ed86d22a353f78d0573edd43eeab46944fd4955a2dcade14b79108c6752a0e6a6c9229adb3234daf9e23786168ee65f6a491c157e5f5192263e9328437667f49071d46ae480d03ad141761ddbae34c2a82ca60feba079d55d3b05c0ad1dd30dde17b6d02ecd4fb6acb5b8c058f15709572767f5604ceeb5a5b06566af77e04eb475a41d02c23edfc32bb68b904e901a5b108217a13d119f31615313a1d381c573e600bfc78bea8c5cd7cc012b158468140e2fe3041423051bfcd490942c73c8033cc7f6248907e90692fcd8a25c6cbec4ee43163781f3207186c535faa92608b32e7ed24b48163be26b2213f32aa0e", "63", 1, -1539394600, 1537743641, "7075fab13372b72ddb9638fa99d9ab11f13419199ca6fff80239d029fc8f9f39"], + ["dc3c932d03284c3f5d3d17a5399f30dd7e15b151177b3231d49dc69f8af383f0db9f5710810200000004ac5252acffffffffc104354f8bb61478dc23ed3c87c934b32ced189c7a5b6d2fc53ad3ca52a583ca020000000165ffffffff79c4da29d33a9670be87a1afcf15879e33160eacb203e5cb1d6ff54fe80c7cc60100000007516a00005153ac8c270390030bc0b8000000000000145b0c0500000000026a52a27b110400000000055252655251793069fa00", "63635353655253", 2, 1405937753, 0, "4e662bd48278a0c01191e32d955a374276ab30255b4afdce21927edab80ee2af"], + ["030000807082c40301b632bc9878af44b4c14cac41903617d9e4038d719b5ec114726ab8db741f5a100200000008ac536aacac520063ffffffff033e6e560300000000066a516a6553516ab8e00500000000056300acac006aa6220300000000015300000000e5c51a4501aa82d205000000000000000000000000a2fa7f605d4f86d6bf2112c9aa66e6b489e5795f89a80e522e173a4cd3e60e973aa1d838cb253f1a59346e48f38f1da2fa9813ab7f1d1b510e2e6abf0e1dd4438a55455efdf512076396703e353aee51ac181ce5e6ee518426d66f0b7814ca1f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000766ce6223d657645623314e7c681ddf6e2cd8ea67f7d31e7ced4eaef0cf9f65b41df4c96a1377e9cf5247752fcc0462d7c4afaf54c6691e01f5bb6e69862c2455af109df283687c41aa562c986ee4669f922eee4bdae3120e7eecedbbbb6684627acf80ae63ac8c35d3458d4aef370af2aaa162e8ecff72f3dd3ce257225258030a9fb514ef18a1892a98c19abba2d91acc726a091bbe83c37ffc2309904cb460020a586746ee76464cc44147a7ae12ade4ef1292ecc16de336f8c888be10af74230a0725c85a26e146464dc9c64eaf6d65376a7c294484cd2e5a3eb4187f3e29d12bb80bda0a0501e0bc61428f393d7725e926f8cdfbd14ee955ce0890afecde22fc022146c1ef12098bdeb336237cf541fc2c7dd8959998d401fe79fdc5f92b6d06ee022eb37aaa255b61ccb455c3d00c8a6beed42cf72b50ce660e1b52621e31e2f645020fa12da3b001bc0e16724bcd9a0e1005ac0fd01f552e74efd2de673ca4b3dcc3020733d230f5432bcce61572fcf3c1401d8cc6ad5b42f3ebc62001d559a8eaebf00205d9493bd269bb4d6fdc6c85656ac2f96fd3527b2a595df6d3a048a7fc8feee2817890ff93c637185b64a4e086b2ad4b0b4f37ebcac71549fe7f3b692d856965d655ecfeead173cb0847767cfc8823773b76527fa6b801189d4a935a115623da3f75458aded360bf6ffc00c237532536f8a57a2d4fd0fafc142a2afdce8b3969e30900a8f7ca73777212fb35a9aced8cd0a72c57228d456209f5fccc804dc01c700488e570b9708712e039ed5bd5c7085f20920873451653b646f7497d8915e88e3720c960670712040ffdcb7eb2f92db4c4d1d64bea659d9582275866abc58832a5506cde0b6f79fb5abbaee3cb9e45ad98e1633f7cff9844f98e2b7a0e19fe72ba71d8085809b3dbf682e44955c5391d55b5e20b252f07a4e65344541380208ed75d140bf5b815e193093251e5c7cd9ed994cfcbfbc85efa00b408d25c44a4bf3c24c208403b61ce02d0553afc7983e212042d219d5a2960da8f5d5d23d8febfd1c18d5b1c8a4bb020495e134cea9ca86713f4640010f0f89b082b866b6e446e8b1f9046fc7051ea0bdf3c8760529d713e710a8a82b2bff38e2974bb2e3438c5654188abea3f7e8ebe59d7dd000e0c43399a008107a48d9f240f06c8ac9ccb506dea1e9fb10b1d3c80d94a0138e1bd1073ec1cbc98fdb4035571e8cec95c2145f9138f0a6912b014a5842b4fc5bb5f53ac9b1c380182ea14deb96003164fd8f83ddecc9b27a7a9519e1bf0e3f939479b4be48d972db1993ba6efe82032f5e84ab7361574e0ece62356a7b09b9aac655e3e6df216c1b20d5233ae4c8702da8affab6d2e11e8c412eceae9352c3b81d15a948136b02b6dd649949410d4ff9424251bbcd054ffa6f0f808929052c67af7d6747b9f278a8c5a6b7970e40ac34c10881194120352dccaa39ad55330ea1677f82b1318d9b7829d298b158e16180ba482c453d7aafc9314e5cb6e928df3f3b86561ce2fe51ef1ce58c5992efbbb813abc35130731cb9c1db788328e101b14d7cd920d528b8bfec31639d5ef5aa0768a86eb33e261f840ccf74cc77748f96cfcdaee164c01d849cd535ca0dac3c24f594b9cd77d969aa658eb186998901209b7d3ff0fdca2866d11fd5a94b3731a171272518178676e1278587be932eaa7201be46f1b15a5ed711d4d7946ef3962e9c90a09b1d0ae6b729e124cda72fe3c92e862e3fabe8db49964a60bae8ea7d449a6a75acdc986025957f349203ed97dd8eb7c24e92cf989af43758c641af09b5bf78eae5533435ec7db050da80dde1718ade1f453f1a55ba3d0efece494a5258b314ecc3c58fd338342a919237e3c2ece83882647f4acb7e7dcebe09d8d8c4d163892c05379959adebde0e9962ccdddde5a6ea5071f3fdbffe073f0fa04cc5aae39bf820473aad7ea56e0698b6b95dca58288da2d335275f0f6b570e2b7f5da4c12527c809b78572a2fedfa2caecea40da0c4b6123a5d3e583a9c71a8fb7c9320c6325298802a2cf83de4fe6e6f97d272f0a5f92ca809dc49a86ce6af9cdc1825e68b445b0e4217984f3700623de1f8feb36a00ccc323d3db545fd27d03ac37fd41af608bd8eb7929f2929754b76b7f0de13723906d768a5b3aaf4292278c48265118ac9085e8f11eda3c04d44174efa74192036fd5f9e9d9784bfa5e233706898caa7beeaef5cb83a171128bfa0f6e5c9862043ca0a72ace8e9d99f3fb017b7af4d299241abaef9b8bd56e00196548afcd8bf656003e55cebcfbcf7d2274ecf55bfc08d63e1a04033bd19db7a987c54d3df8fb2b5472f3ab69671e1efc8112bfc32bd363ce871f46aa814352aab9d8e6d6992aded0f41f6e3ce0e859bcb84157206342becce050f49458e8180e416e444ddc09", "6a65acac65", 0, -530693294, 0, "192fe079cf4d307c3afc309c4b83a37f16529ffd3d9e345de1f159761d8e601f"], + ["030000807082c40304277f5537146ff9f5774cf45f45eaa76b4aa7542e6be7da5f70ece7660283cbe1020000000265ac52b03cbf461a5ec2de5d3c7c9766d6c08aa2292b4404dfd2725caaf964510851e9dce43a0200000000ffffffff2d6f20efd63bb97aded0c891c347f1dcba41924220ac5ef488a38c1289c536530100000000ffffffff7f725faf1ffb5e77193f9dee6c43e257273d52a2ce99410957d8664efcb4e1930300000008ac635251ac536551ffffffff03f408f502000000000353006ab15eca030000000000445f930500000000056a006a515178d638170000000000", "005300526a65ac", 0, -1326419499, 0, "76ad0ae02828e3743987ec25640f9ca155e68adcb252400f8ad63c6e8fe42652"], + ["d4e40807040eca4df267c39e55d359b1d78a2e3c5d11d4a2ec01ae395992e27a3247744277000000000152100feca319dac5ac0c40e71b4f00f92deff14f5265b811b3efdb8e385f6bd9a0b2febe610200000007516a63ac0053acd9b0da9f6be034ec529937cc32d73b777c939bc8decf3181005151a584bac9a674dbb7050000000000422007fa94b6e0ed29fce1e0f296e59c7ea4de795009f0d647d6a400cac1bdb9794a799e0300000009acacac636500006a53ffffffff011c940301000000000652ac00005352000000000135287201000000000000000000000000f8c15764ab89ce1649df3c7b1ce6cc32662da063c04179e5cb3f5e7b6e99488886597c210599fc3649773d350d90d946c645bbb47a13b06047b9e24cde96a2ba90e55d5991300a37da1bf746df9a9ff02d4d1807494c85956dae8d3621b1d97500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000843c33982988d7d70bb6d37d7b80fab003dca34806f0b191703ba0ba75e35101736f9a1e9fea08cfe3f36f4f910236ad9908b329d6132b0c25a4526bc0c106e99793c8db1a9a6fb2155f882b402565beb48c1e95a64e165d5bcb0be2f09a71d6cdb481515fe3995d6fb37062e09625a56c0d65114eac81cf588db02dfae5ad89032c867d7c2e31b2399c4e6fcc9452c24b2de3f64140a76a78583c1d5f9083a162022a53b019de0d79ff257910b1c3258903772645cf17a4f9c83c3db069094650560b04e33233ef1b01d9b867f7f0666b3837cea333adee8594076b6c016b9a3d2df280fd6ea047d850f69ab90c710265da596ac45c703131d206d7e320b36c7d8a4f031bb5a3e4c39eaba5b6a5e155925f565b8828f81de91d9648548a7055cb15738e0323e0ee4994e5b414b357f5d564d8bdfe2d65743affb52ba495914ac7bdf2f18f030b60bebe502ff0efec447566cf4b8e35a54dc6ba20659899dd94da52909d398d0323638d02212f172c7b838f4f6a27d4864f42b877a15c596f918393ffd0b93b60032db875b26eef78f2404e605cf52aaadc509550dca356bd8b3d51152fbf4094fcd0f8347a3f0d51d2567a5b8d8d0915ca0b83465a988af4cb38552a7d76c5ed60bef3889dee6caf64e25ac9b7c71973c2f77238777f6e3360b23576edb9d7907b7cd56784a775c0076c3244c287ea13b605d47604922d06e9679502285a5b74821a0637dbaeaaaac673420f80b87ce7082e43864ba64cde121b7a690a18e43309a9b85ebbbfaf6231d617240777b29312327d73a812ea8188f0b76bb3d0fe436ae1fb9abc5181dad80d806c0a0248ff01eea641fcdd51455e60e05053318347d737c31b7f7965e6e129335d8772ace68e6df689e76a24cdafe7e15b3b1b9a27af4b1516b8875fe2340508a9d8eac3e2b70e742068e1ba6147097932432ff19d071026eb602d17b01ea771f63ac0500987497e3aabd907e43de7629e78147d10a9ffd5439030c6229227ac7c62a63b9bbf7a6e1d4ea03273ae42c1d1ca87c40af663a1d5b11891dc729109b799576dc21af76ad4361866ea0b6122506e6d7fe6e9758cc1fa835d06486c4361791a30fe745b9b5c23ce67232ee2a41e1cb3c430e318a6f4ebc767a8eb220eab4a50f619419dc89e25ecc0c19405034e9e06661a651e779d909e09997a68c21a05f6c1c2c553fb3f17fd9820745a6bf77c1dab65b2547375ce56d8e8c6440da349fce6ffbff1aa4acee959c0f45bb0faba9e1ce177228dcf42928970edec8ad7b478cf3abdadabab225f86f41e501e968fddf7a0b8f8c08ee38cfb494449040f82ccfc4894872f3b15e165e121a411ecf21edbfd080d95d20d28e669104cc1a5b98d852e77a3cb6b7fcf5913977a93eccc65eb345a0c7233e32870fe07cc940f16fc3738f6197bcdd01f5bd6050b0988baf9d6c6b514a9924d81a4fa5d1ecad9c3a29e7df3160a81de57228252f00799fb498148ad3575c5694116858f4b2a79d76dec817f09d55579d1ca463a89b1e0db56cb27a2826ed81b5b74e32b2826582b6d44eeb3050980af5376379e80718ce7b2c5d648bd3011d38c64a87577c2926904f90f26346f13ad82664d0fdf4a7dc1e6e28b89643a9fd0450cb6e3c98173c3cbe727127ff41031411823cc9873c02486efb77e60739e281b3271a803b80951b2df7f9fbee65ee91ba3384f9cd27dc6c4bec4443f69cc0683f953454b08e9479c2280796f8af0fede29e6df02475dbc7d80fa6bb93e36f5a0751addec62624c708864b8501640f63d8dd1f3b89154226fc14881c1a964663c2a2ecfb723ff824c4a2a296490dd11d80b88f88279370c35810e67b43eda3bdc4f766afe8883a9bf8b68271e4cb22ff6041e33440bd8fb86a87a2e611ca3bb981fa28be8784fb66f494f4abcbfd69d8ecc7fb319eb505a6f50ec37264f72e359a04426d8ad5aa7a7015f973bbba2aafb44a4e4284f2f7d896440d869385677d77a05fd61e549b2968da6b0604a4748e6be74548a35e7f4dfbe2b76c4298040112df075d099e37cad53341166a1771c2e6cddd5d3d8324e8acb5ef3a89dcd27f749d70c94046978dc7558eca8fe7c27bbf11547b4c7d90845ad9640a0f859abbf50915a591ce953b633589b9b514f3c28b20d423df2e1d025c658fd98193e3eb9ea0749cdbbeafdc2c502a962c2fe45319fea2ae5c86b3792f22b37acc1e5d4f8c1a1d626ec36fc1fc33640c4ef3a40df7b61706c2201c02962c934500ff70d5c3861c14798bf74fe96ebb774cb9c7db9285b0042ccfee14e3c82da50e116fdf2a843e025aa326b609145cd27adffd6dcc61014ba7f47fab6ab1453fd6e8a10b0dfe75a203d9c41792410c2fd9b73735cbd72a66af7735221802b2ade014f6cb0bdd261944bd87fa1d1ea784706", "0063ac516a636353", 3, -1812130730, 0, "8afca09d074b62a369938e369e7eb2c76cc06b5cd3e8bcd948b8548fbd331cfc"], + ["030000807082c40301ba1b30538da436a6ddf18f4c27c1555239e9112564c5c23e18881c6f95d8891101000000026552ffffffff039b59ac0500000000095252536a635152ac5383dbab02000000000800000065510052006374100300000000076353536a526aac240fdce10c36ab460300000000000000008b8cda050000000014584e5b68dfed589b3e9d88e0875a3be1869e2ec00de39f78f67682f3dcd5f6d38d0536e29c0913c9abb6198370124ab1104c04b556008b71b06b547a585c9d050c108b2cfda684a0ccbc71d8ebf3144f7966eea9cb5722e8d8e414a385bf120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b2b39b382735033087838433a797cf7e5cd655f4b2226733f4a0833064fd4072224979800ad57d689826d07824d86c629dd9bfddb20ce1a5fae40dc4cab7a1751e1acbb796440cc5c10618a6fc881dbde8f7ffed9b84fe46e91337577e9a092c3e320a4d443f5bad435389e99c4aec734f218fc8880af55677043f0a395abb0217660b86c997be4e908d8b9251b0bf2f4dbaa652ed0f70c82f9004bd2755714b020d8071d59372a1da2286f5bc9965ef1b942941e3081c4a751c11168fb0dc2f1f0a01228a08c4c312af46a974679256698454222350aadf516dcebe019122773fdd0e129aed37b3375e1d28dd2ab11a7a8701b933d49e8abc7f2c015a2881814e5f031e0930c32b844aff43c4a16613ece3f8a28a6bed43fde4ebc649fcdb7f9b805e020ebd964d86ff16cf29c348ffeb7fef6e12daa1c6d26f908b75ca43e6454f388002261a64d0825c96682d45790d7e0b3e06b27984da9cdbdb18437d898be0cd4e1502288cb7bb519dadab835dde5ea3d7dffdac9bcb07999431f29e044c2d680d4b8a021237cad86d1555af9ec6977b25d35c3f1f5d0e7553a69bf7c121905b69cd9631e54101e98650011978bd78ad2c0843e3d30a205e953839ee125f6847ca0327394ea940e4e1959389aa6580f492a0966a4e5b0dd416fbf251905807933e249148f2c43f790d8d959fbe5432caadd043f29041ef9fbd01d44aceb19fabb934f7c977bfc30d1fd9699c90bebad55f37949b2392cc1bec2f2ba66d3bb0749697e0290b5f4faa31bc529d199d436abf7a8798e480f338fab3912b1b7c4244af5a8ff9ec3ab9dc8a3a01abc6a71ba644b2a0d331093a1620158d7791c5a060b92f7475161bdd08119fde64494e709d582e630ec4c61f6425bc758f4f825ae51b3cd3b88c72c9dafae9bfe66840a753a849d3e23ecf3f0ff390abc67f50e088005d03dbf99f08f74c249df1d9f2d7ac223ce52032d1e98fcbd5aa356a45608228bb0d284a53eb9985ebb8f39a3ef3f7c0c8ecaeea18e095ccff82de6d3d1f06fb23ff1555c1cd49adb8f5e5e643355e69d920fa745a459cf8609ff4c0c011ba0db83509d4e666c08971898b96e5edf0eca165e54946894933791a256a7e913e6d99037b1de22db5fd2b942b2280830abcc27025a5934246699bccb52e11b84bff576299cbda90b9f01263d0b2e61ef56c6e769df916f870412de554361204b0fcf92458f80d92f7729da17a13ba14a8223681e31148a17d518dfeb2b21b082616381b49672e9b6e14dad3f707f94d2f68a17675d8ef8bd7dd3d32b176e3be5ad02cf13a12296a3af94fc5014e2c204ffa8c444805c88c2ebf100eedd133a594ded9ccc5861298a84f8b3a3c89c0c0ca7d2f971c671d6c2e6bda083409533478bd0a41b2e145318430b5e3f5ae7f6ec08f02fbbf7cfc61f47c92891e16ad33dc92f4998d541dba63deda9de1125f165f8147d7a1317a5507ccaddad1ca9cc4e6557ea9eff78fb62fcb2caf40bdb937524f52a7b8993c59ae81bd91d0ffee7e3235ca23bd71fa4991411de18a1dbaddee6831008b07ff396270b2c220b7d6732c8d924010ea0239c5e50112f671723c280a791e2ac8160d017f21c799f1f81e2826b396f528397622855e22dcb103714c9bf00d109f37803fa789e4a1b243d7d5149335ccae5608153b6f04e2033f7f1d82ec137359c097ab62ce3e9fabfe55f3e602b0e363b03e8b64136aae21aac86c7026eb5825eb2fb45e09015508954d68c20cb9ad2d3cd658cdd73c5bb1f1bccb4dad59ec08ebf2f2d54b4edf77799dc5de8185cc75b8c97b0162c144505ebca008389a75a006522f6aaecbaa32e321463490f944e1dc6c82fe4fb6569f7684568d03f531915011f54c6b0a42b2927aa7173c34bc87d57998f2deaf0f69a9731105a9da08816b0ff8782ad458b7d6920f72b5219606272b68d3c8a141384c8b4ec8780e89873dd4e218fcc28ab739a6da80f7b05498de13fe4fc1b3c6547cb2767950dab0e9b0c66877c5ffaed22816ce5d61d35848dc93db519f0e4c7cc6fdb1fcfabdca961a7264e53ec1a0bad9492c59ebf8d5aff02ad3cd9827d7d7402fc150fbaff6976625b5aeac5190f23d71573090ab976acaf68d1cc857ed6c448942e85d192ac5d5fa2241e38a7277daf893dd77b9f15278e5c039754d42a1f287dbdbeb2350c46972d8e1691653404761cb2e48763960c51de46429b96bb40b89df9099e6dc2e2feb30b80ad46d07ee2ef29c98aae4654936bfed9299e17c420ac15b2102f98f53ad07d6010000000000000000000000002dff20c141a7ac324ae57abbcd842a59145544abe1ddd8ef1846d1d01b7f0bd3bb45314d92d5ee00346c4b108d422d6c51c53a352193ed9f77ec52c8b0f28153c2b6e077746f60754ffbb6f0f8939e7769d6e0a9a5daba375ede770c42745839000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a729d894c1b239f6a237215889d0c0e2d27272a2b700f684c6aae80af14c7223f9f943e3e60bdb22d15936550010858392e0576696c9afa06c9a295472d8a6efe46c9073ea10fab75c0e423360f7c9a1882db4e0e2080248ade0ee32bab89ee6a5699442c562cd65202c4eaeb2058bc994f2b981e2e63294c97d8855021eb480321db1c910a5323488a545cc9fe20d79dacd2b9113015e36f77424ae4b862039c030c06936b17cd8f3bdc5b0481959461d4f0b35add8705a98bcce872df7b1be26d0a01f2acd100e53aa259212d7627c43714cc471bcb266171588455d78498830396587040f226a32fabd0e197e263fb8d2a399662d7fc108ed6f393e31f779b394a031dfa65b68fa6910583ee0cdabb4adb4a9fd38a96879937b55ffd2c702fe12a2902206bb661d9d76a1af1fe24f66d3f1b28ea170b11458e366d17704c597a85b3b5032ffc41fe654edf5b213ecc51b5b904c1e0339b4d459780169e6759eb2e46520e022535a5ad01c17e2b161d01e35e820051028edc4ca21bb69f0c334f9c6892fb7402016ba5e73f1cd61605f3b79b0306168dae1e2aeb3387bff84d203ddf9fbdadf79dc8504b52bec9aec057daf9cc6d755388a07531cbff83ead2d98632977e615a699bb79a85564c00174517507871696a4dd6c57e8ed62a24d020e13bfb626ebc385cf19ec38bee015e41424e3c13762a78c5ab85f6ad001abb84b92dd3b244e96266c0c2bcf17fda3b124e219f3fd8ef73edf8dd26bd5e7d8281c89327bb28e743d7aa87a9da4b7ac28cfe2704e42764c4947f05a1dce713fa7df2fd7423ebf5c8765603def177054fd6222d6b65ef9681e34724c4cc44c7031c55897725e810592b5078de007a595561df05c5da40559dc360820b2becc236da70928633756c006b2ba9927d425c5fcdf2a7c7b3c00d1630086837c5d8e93904ba4518ddaf07447997fc6f2760110930ab578ef3e9bf45908082fefb084cd44fbe02a901dab17e2ffed15f5f417b075e3f91aabd319f157ca20c45a7e0a2f5a59efe060d63afa1f0e2645bb602c6f42e271771262206b451a8abd5182456637962c2c475a257b7eb8103ec73642ee2478aa6076d8af3e3a9e5667ed25b6efd853b5e3ef152c844c3a28e2721d0d23c72828be45ac71caa63f11d6130422b000a8d9df33de06c8da8757b7da6a22f3f1c8c6ecc8e0005506bebfa0b8770a866e4f791df044d32dcd059fc52af5149e9658a0d6cb7635c0ba2b47380b14a823e2ad0b05375cec51de64d1cb2c8599445f5ba5a3be3a91830aeae97464ced09b1dc6a2375f5a52c3c44b61698430d84336f70b5955779c211bc9ee8c6182de8e08716f69b4aae1e79cc90c6157f82b08c1acd932c01e8fb136e479c6daab8d579e30a0072f064a398606d1ca25cbd9011c055603269f4ba3797198dd9795247ae33766d321a99b2a091a796eb90db4ea81f4f4c8e2d943da50864afd2eaaff21570544fda9e2e90bcd2d0bfa3ec2edb263dbd40b82571d1d7941ea67ad6789e50b86a914482c78114b120e3d8b0ae5d331f4f11204ca1ba1ce4ca19a6db27411f335a7dd96c990314faf36d2d054a40d1d0a801a9343fc57c253ec0e9a993366468038f6aeac5266d60c08f3a6ac6a7992990a78664ceae001d882d0354f8fdbe5fdd0786379eabcbfeb693ae779bac3596469aab006c24a41c99850a0cc53ca49136a7c3c8293c2ee43951fbc05fa23b853358ec6af6876cbfeac5cbf9a9ea11df7fcaae9e36ee85925c007fa0fa4d8fb2049473e0301ea239c9997b87268f8d06ceadcf2ca904bc593e1b02b7875765e407eb78278b32604359553b7e97e2f03bbc40bbe41c61c1a7fb4188005ca2cb135fd29ef9dc8fc6fac1773d473045d33e3bd0a4acfc1ecec51aba95cfa9f7dabc75aeb44c3d8f8fb3f7729e047b2d4cd0b9eb3b2d9c18b42a394db704594c6131fdcda75edde45c2207944645ae3cc48fd9c082f2f65529d0763490a99ee119028767240f3738a64aef3facf0c720b7a42999831b29e751e30abd2bf8b60e949974a40d3a348e8dfbce6e38fab9a5aeefe46924d5a4ee09bf222ba49922d3c5ae172077296f605f6adde0525c7e55cefa33d7b40fc8b1eb96f26bbd3bb76c923d38baf69a753ce751fb296327e318f0ab79722a08a5d57955ca14bad95d068d6b12454a301babda2599e7b2d3f8efb2c06dfb88798664595e3be6a46eae57cb3044f79de997baf9067e7c5ccb7adc3b63eb107434f285fc47dd7ab938f66f9545026464bde6fa515f0000000000000000cd4b7b0300000000824b0b95de066737dfe4b6965837aaa7cff3f670fb122fd8fae94560907a75b3ac55115e659b29221a60cb4cbc5507520df43240de9482ecdf2ef00db9670eeb92c1080f2247eb38a3593991a538a19b6c7c13afcdffdfa1cfa54bd761942b7e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074e8e61e96a0588e6c05fc4858f38c47f37e44091e6b2264c5afa074cf65a4464fda01cdcfe21b152bc158d13e2cc6986f2cf45c6d6d1c803fdcd4bda2d1113b7aa1cf3f8bea51c9a46c26320aa9395a031869991b5e8205419eefc9d58aabd56ff67bf6eff2a0701053a4b9090e69e3850bf927a9f902e7b34c4f8f8938acc70221494e3eaa11ae277a5850138148024c65f32fd2ec989e8c401448c051a0c0750211717368c56f380b54be3993373220c47181e13bd21b1a79227b5bf83d0963840b00e0bf071401f4a9b86f575b3c6dc5da4bdb2f9b0da22c440092c2198bb3622a9406d59153b74a760f6c047127c753b303971e3074df072502c31eb119f2a719022e15010f0ca717cd552cf343720987373da9b802f5c0778bbdf6ce0dfbf9b00d02165c7be2bb9a240e746391273885e787dae7c2dd9f86ec134f3e1a03ac4002cd031b7a871c9a892ca95930baaf6bac58f8d017b63cc747fcaba91e143596502ae902107bd772a6db97b9f3acc29d0a1a74ea0444e8a18f496b94b8da90c71ff1415b031436dc573a8a50ed80b862d5d6cf853aa11141505863941cbc65b6ec7581f48499db065ded29421af68d4c5e2a907b53314b28cead2d84c736bb3693ad6e4f7adda3d947d7845f57ac71a011aee7e2f7d7237f31e2960226fa8c1cbc9af94923b324ed38007bf25eff8e2b1248d74a0a1f229c1886f6688b85a167f0f5903558cd2217c033d37616ea35281a57f0024a2696c86d563abbef24ed6420015b1a1b4bdb8b94aeb43a32d4ec36140fe2159724626ec7df8edad5694b874681acf2f3ad195506a32da87e1c12433c8ce1c69bb43a35f7d045783ad872adfd979f5d6893555651768023741c13ca3ba423c33cf19b4ddcca5ed0eef8041b5048970d9dce7e5764d70ff8f4723e5710e478f59cab39a826160f4c2be33fbcfaeca80b8470981cb3ba3ec0f01089f86c4fc45ed95ad4e1d839d5daba967d77d107cf9ad445dfa6111504b34e08ecd242f01d015afccfee64c02ddbb0b40be9d220021c064e0a105a651a8f6f9f65857c8cc3da6ebe3fe7a315a7798c298e189f3bb7a7755a04d0df4f87852b6873a2a6ed32275e7e7f3ec397c9efb2fc27ca7c89dc921eb96bc67b99d7e18d2a71d0427a2a2ee3041215b9ed14cef16caa48235154b57b3f62a95b160f04e07915ee24df7ef34b188782106dbdc555487916e13b5f764e7799c621c70bd729361ef57209ae55c3efb54089ebbdba5758c62d0b5090f9261b7789932acbff00efeb6452df596dcbdfe94c4e79ac68c10bd66a1d4290c2a8b6aa4dccb36220417abc9c083803222d1804defc1336b877b5562dd83195224b345c6cba1cd3cb2cabeb6a471181d15e1577a8737f33e574fac3b4b5ad3eea3fb122c555648e4dff864c634f99218070edd590b74fbd4bb29d71a5d690d67f4b15e586cb56b43460a985ab6743662f6ae8544c23918277bbd4ad87a7cda5c68703f577cd68fd3f24e16cac28b7750a698820297969077ef9f5637703ce34902d4b63503bd8c507bac96c6da321d088f81be3aa96d7bfa1cba33437420cdb5455028d439f758f9a2942a574bd67236d277db104c338ab6f1313a4e8cf3340333dfd6dc342784e96f3597c20649d3ee31cbc6152a173de13cb26e7295b790e636ac1b9699f9201bd6d8b677ea886e946f401ec600ce96e9503db47673a3699858de0e41f599d867aa4222ee70f64f74e8d22c678b640d5d54ae1ff5c9250041d4a64d445936eaeac7874b92e04784078c229363d7f55f0cdf0fe7b5a7bdb1cc7b1dd80eac4212c67f78277393578b041e1f6fce87b0d63c8a90dca0a585069ca82dfdf78c8f66af1f8124e6428fdba37376a583618b822c41a6c12cf3cb371ee981fe7cac8714b0bf4cf1eb01f7279feb2b28f3a54381b50f361f7328d93a93723f7034b6220cd6de90e09404ce49e5447e73bb014b08906dd92a6dc786ac57400e1cfe8ef237957c31797b04ff9ce5d8eb95298572ce323433b6ac8d8c8f3595740642d12f6c8fa757c2ff1dd69bede75929d6d6b9f7acc81e702e031a0c69b1e17a50f53624dbd8a5930a8a4c1342346bd278e69f0ea4cb205f97651e4de3fac6bf718f3c05c59ab5bb999e44a1978eb4a0cde104a972122c3b0bc39dde304d54019d7d59010c29915f5f8c41a50d5c6e9f0705784e68bd09f6ba353b5ae5ff2fba4f12fd650f7776c1b41291311a19ae2879ff4fee4a7147defdd4b05000aad4ad5a22a49f446bdaa6a8847620619f0817c6ad88a11bac1836eb1ac43f55d4b33963086712d2324f5fc24234a3a0d1ef417b5fcbed4c38e5b5287be76f5e83936872f43166206c6fe3c57073379a09aa09a983e9a2f8d25fa2d9ff77c33823e4a04ed22dd81e36ad14bbf5ea9839e070504", "51006551", 0, -1749758910, 1537743641, "59141dbf96c74bfb6623e63997fdaad953c996b8f8e6146cfc1399dbf6da1580"], + ["76ad533802a273ea8c9ca4cc89ac8a5b2573dda99c26f5cbe48996c0aa0639bb7df8013593030000000663ac636a63ac034146f4dd0060e33a20d8e4b6c0e3c03be98e25982c6aa1617c3bd9b388094d17645bf7030000000163ffffffff038335c802000000000800515265acac520058d0860100000000016ade742e000000000000000000000100000000000000000975b5020000000016e4436fddb8a69ec9e30e3b9e5676fdb87b9e115b6f12dfc903fb554069efb82cb8ae65c7da7ca74f6952bd86305d84a9ed158d0db8a82a6a513a7d280795f727d6bc025e6d907eda1c8f39de65bc4111dda6d98a2364bb8adf9d5db8b7482500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a53b355f6c0fbc05f3d61f4ed08c09dd7679c37703bd63666080b50d79b35eb038875dc4f89c30756b32bf7e4283467d40bb27400a16a2cf2eaa440f628981df39ab0e4ccd233542fa41bb41d0eab385ce0444af556f4f18ab9bd1da704244961269ce2af1723b8ab2697579a4f61f61daacf2ee5c77e78b8c7f4e2609aa0bb303240c96ca586f19f0149d603b6084e7ae6b256f160847b5868f8d35f3ae220be7031ebd52afe2bb1e1478a4308a544fb6bdf478d4d245af901873f080778cde87610b0491ef6959e419e01590edd543bfeb62a3bd4d2bbb234700e1880327a603bee42c57a00c37621f1f1d1d0d45360300fb793c25ae9dd5f57e834a31b4b634972703264fc6092b6dae37a240ee7cd6e934fccc1e4e246d796a8b6885255d5b5817fe02178321ba4955515fadc2c8fa3b99e75c23ec2da0273b5ebfbcd992bc22f0113502228ed3daeef6bd6a937e08672470efd44192cd4226f57d271ebb4b73a5124e39032d102939ebc1e08aef287c9abe0c1be0f205bf1ddf94a37db3b27375d6184b93021150b976f3030e61c2377372933e83f23fd4caa11200e229b2a525496f7f1fcc1648013ee7e2eb48fae476f59e573ff95f47e1a964395708953ac5bf78da0fedc309216973d56674a9fc4ea945c02455fc6946187e5847ec39ec6db445ef1621e90ca04e48b18089d864b75d2509e2c904d322835e2aa46fbb577e3f5df8b2c84979a8d496ffca91a91bfc2c79d2d575f10f4760274e5d770231548e66d9c30c5a0abd98317ef54048f4998456e586b9d1710446fc257964568a0fde3047c5edfa6a3b2d305464e79730e61ae0f5ff7e4d1a5fbd071a5849b0847785b6712f02628115e781323e2a9707b3c03f6cb593ba2e675e1fa0a840ffe263a5a1f312d2dc56b4ed27af20f330affd4407633bde825363a8d4650b928407e52e12d260bbb12fa9920e22d9ceb8278c892e53a32317d47a5c794ff2c7afd812a667d66746b83a4a26a5cfbaba6663821ef7ee9e8c16155e7340d06067a486ca922585ec7f8f2444a02ba35300460662fbf2469a36569074e2093e20fc433998709609a507c89ce89508343e41c28eea6494f2b477ac03e2e55aaee1dae4392b811bcd631d59795902271f08cc5bb390505a884404648cff79715a4482381da2498a647feb4f403f9c3e3d432f96f7d26fde90101628652a122062fe278df15fae55d3c950a897808e9f47421b3a0002554c4cbd07b60741cb47d5e552cba6460965a4459d40a0a219353682f7ed5e2049cef122864bd7834af0e9781a7411daf3c85d11c3fbfacc6bc4e881176be2a3be5d0448b45db08b9f9f9877f79b68201419dc0f8294d341ad07c07a66849d73817286426dcbd3d2a08208ea9d13f97dcf0b8fee693ad1e99523e592fe5c582ba902587a796f60220805c9e50972c3eaec16d01b5bf1e8d765f22d74538e3bc1960c74c19fae9a1ec444cd1ba74ce92cfc3141527fde3d55d7542514e155115d03afb0c4700fcbe1cb996f0168f8ca7e673b7a975ceac9484a7a194b221e0f43cc36b60811d9f95edb521e7a1efd2d407678ed72d0b1aca374e24ec0e0e89f4d1a56bd431fe140c1eef4c1f3f939e38ba98b66d4df9163e855ef59e219d28f84c843df1bd4a692ad012836d92849c4c3694ee82d0701a34e79cfecf2f35fed1fd751a050fede35004338157bddb8e0f9682cc131631b51a0401a014c534cd23f358c49ae59f9eca96f4547aed29f1b3bfb7861c716b84f9d5abe06cfbee81f9226a242f60478f0eafa03b4c96117fefa6d701ffe31795bdc9b374b5c961f63165ede1e5fd58c47e95c33a9b613b368550374f0b1d926e71241d0109774949552fce636cc0fcedd25de2aa227b24f4b0f0fad7a7d70c1b5ef417c98fee0bc2109ab65169ecf007b94f3e2658fe158984efb61e0d0fbdcb6e920547b3d155aa5ce00fe8a31369e0ce5f774ae92eea72a500bd4ad6f0e444a1b7339325f63a7cf4056afe3f4f627206b7ef850dd64ecda442b23e434430ed894d4b9813369d3a3d5e7967e7d64e14ce83c4fcd31e617691050da9b65a6fe4bd1574d11f3a018606b3bc5fce198e9a62b0397bc19cd3fb5ff73292d670613a0670b4b7ff37638d1da22fff0e4bd822c2d220e5ea2e6ad745f2f5a2830e1815940fe4674a3e0a83500dbeca9ed17d8ca74b223654fda87c14af2473197b448a1562e759889c9a189bf480fba7dce140a179423acfeee47f02b1c884aaee798a9469700570f917931ba51c4f62fbaf0f0738b825a91c43539e01a2848fbd78032e1723227f42196136ef00d7c811552141f1e4680938b4f07a5899a65811b11a48794ecd42299be9bdff1283ea3edcc888293cfcd8bbe4fcf4e3c49c443e4c1f02168421a6078e470148224da294f6e09", "00ac00530000ac", 0, -1223583658, 0, "8c094b687b5b150547316dfe325362a98edc59010dbe2801a7bca69574686deb"], + ["030000807082c40302c40cd2455256eb617273a788d4411ab4ef6e5cd03ea35bf9859787f1702d67e700000000095152656a65650051acffffffffbf7776ede5e6fbb8a92e4a1bd45dfb6a3f7ad93aa727805bca87ecb9b5bc84f70300000002ac52e2f9ed8c013633cb040000000006515251525200000000000000000000", "6363530052ac", 0, 772284676, 0, "7be9a5975b2b31c5281af59f5aec7754d204825d42842f401936a4e526b4c54d"], + ["030000807082c403034b3eeba36e8d8e4635bbb81c09738b4c19614006b291260f0c1513c8de6bd82803000000046551ac512b193626d2208353ca187300c2f217efd5577b5fe6a74a9594834afc1d6ef688d71735ca030000000665ac656353003750e1de6306fc3615335ca76426c1514f436e274c92e6d1817ff4a4282e4fc50475618a0000000000ffffffff020187c303000000000852655265006a525364b7640200000000055253526352000000006fe0c54a020000000000000000ea21bc0300000000d0984996dd8d80942cdc45377425105e9c3e25f8225a573d1586fa339de78d2c4c76499436f478191f7a3042ef6f82b8bfdadd4be670c712ee40b77bdaa524fedd0fadfe6a58da0c32472eb4800ac971d8c1e65b9c50c2df76be3380c5cef28c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e0847f5af1d55baa4f049160f617a001af19e47668b8e48510998deab3c9fc0fa68e4a1865f6c38e8f8e8eb9bf47733991805016f0f9b2f1ed8872f4a3a1bc4a0c0a21dc1df11becf1382ee82e8a484d809e62bc336f5c01c868e46e4485b9f257e649585343d3a37a66bb14700417aa7e868b97cb7c4f5c644f0dbad2930430211dfef417fffebb0a959b6276b7c91d257adee4e816dcd4218bcd1e0f183850e022a97f8fd599991ec69a4ba61630403c15f85a1fae298908b6227a549625a3cd70b040e6eef3bf1ab5e5d1a3e98dc6ce04729fb2755d5ac89566d8f73a19292d4d35e7977ec0d12bbd8ab3818fcc5cdbd96ccd9c7ab10591d9001beb37b4efcec890205955a09c1003337f78701b35c52b65da2910821a20f47375b66fa8e7ef97d9403067a20671f2d17d462269598f376d56e4ef4d3d7a3972c8c7a4b5cc05802c682021c4fd9c39aeffa0c945948426b79b5894299cef7f2d8791ce256eed761c7f69d031c212fefcd97633ff7c5cdcafd24881ee8d243ced41b5f61fa27ffd92d2aff1f0317a801fc076f87b9dbe96a8ecb7b323b21fd179bcc69559acf9403cc624d21137c102eb3d5829a1dddd0132b6aacdafbb6b94ee21a268dba5258ff0ad3fb6750813310214440a5ce822f1cd558bcb0a008ab9c15fcea46a2b7a726c503ada8f99b0656468a719afa5626d577a06b97ca350ce9c0f7c5308e8382f1dc028d2e20a0881bfa7e8d2b7f70d5d98db44f92a9a37380f022b90248ae3939db6c98e7957ddff642337992b252ebb50fd9e7d21335d1c3b53e683f598c48ba80ae84b8e768c5e04cc2b0e254ed58d98840baa2a75710c8c272b4a1db51b0789b2140ae0c12b7a7775443a53628b087e2feff3c6bc19b1c71ab26c883c254062f0155e10d80f7c4c96631793f17dd0487ee06d4af35295380ea11815d3a750341d294dafe172fc9d676341f10ad5b2d1752ed337b0cf0dcc6bec3f1627feabb2f3c7f3cba6a6d860206688d6aaf98a4fbff4d96e513aa1a5c28fdcb285a4ee9044ab5c9ed04b720adedcdb9d7c57d0685490928be906b6b3939738142be17ffee067dfd2bd42a289b69c4e9ed332f358cb0231e4dd956d1e75585b2ac6d6adc672ba75ea1949831f7e889dfb43e4ef4bae5e41a58551fd7245d7d16c40ee1c4fc4ce8ae64d342cf9b8abb0473bfb99103ff6f38e7431846c1587b2473bee691817348b4ba2eb6123523879833c3a60e6290f139b1790aa33457c855041b7af85cf0a77ecb892b436679c88e948634f0914d23ba0551a2626f5a24ed21880e760a53be11298082784481b58699b932c1707f95b33d7f441c167c454ad8782696b11e2d718e1bffb0950f8373cbb60b188f07f66c6f90b74652e01860d5bd7fc690f84fcd6bb0b57077a0463ac83060f3cb1c3418298973c5bd88dc8c6bf18944eacc521db907e6c11735d3a7a118f3f4a05604981625dc96ffbd3218a8a87930e41a579250c3228619b03b9d964e7b2fc761c44763730db824cef6bf02afdf0b55665b16690fa851ae6cc29e875e6a99d643c883467f3ddb19de4668b71854fd75f54945961170054cf30f6b88b25a3e891e0c6d5bca93c571d3bff3bc702f8ece811fea51e4b4847a21f7cce08456fbdbbb65d753e7f60a34a5f2b7ff8f41e1166218b69d4ac9901e67ab7108981a26d3eea96dbf853c79c2795916aa53588f1f156c6476ef78d226d9922604ab670d8b0897910de41821e930e5fdcdd0ccfc5983812f5a2372dcda4c3c0996a99c2443a54ed44d0e696962e8d86ffb42dca5502307c00c19a6a3ce4e6faa3c43db6fd343ff92d698295d195911bcabdd9457e240b2e67e0928799eebe8ed7c30619e0c9bbfd36e6315de9732293b3da61769a9734ca23e4a6ed5b992ef541cc0b52620fc4f48e53746f5f1d49cd24bc3ffdf2c0c2ddce08cc31e91ace14df7fa8c239433183749bb9c414bc60d89959244afd37d861f1434efcbd8fb787014aa5659a477cce30fd6f69ede9af976558c87185a2e97d2fd0c19fe95846d1a5f15eeacf16514e43ef679fc88597c6e3600cd295909bc70b5a27cc775a92529d5a141166a83e0ae152bc752367433e53f32ef38574348e15a898e0478a931cb259893569dc45a33bc5c1bca3bd3eaa575d57d42b77d4568831bfe818239148ada21af1e8a7e5871bbfb7cbfd472649636c7b875e6bc922468e9021ca38e71e81a8cdc6878b4c848e3d69de9888eb27bf2ea07223e19bd9e896fe45c405bc261277a96dfe7d642646833268720e900000000000000000000000000b1d0fb7bdd1baf73af879d3f96b4e38aaf5849fa0704b06dba3f4fd2f50ba2507c4d14d6b0b4fdaea68cd3a471df44d312b7c7021cbbd37ad317ac6167093bb3a11cbf98669f4b4e62ce7854e953cb65031a6714dfd11d7c820f1c59a868cda30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f42ae58ea70cb2484ad5cad4fae671c91e27ed89c005334a41e2e9f0c0290eba2c33b30d7c7896bcd7ede14db04a062d5f2e438c3ff75d2b90da91b3ba899264abe7689ce6a7793e6b2f17644579d9af147b6708ccbc6497bb02b49e8635fc8e90516d548d15ed32fead301372d18c731202e3d99c2822e20b29067284301c030052fd06315974ff1078997be9671674c2bef1f1dc1141282fd68b81b682b822033004e1f95c28466690695559a142d068ae03005a50977796b950e89ce952734d0a08616cb770aaeacd967b44fef420366f8c261a0f097210d1c8df6bec9d502229940b79be0717b250bd430159b59554993f926f9c5c2945b4dcb6c61f9578f215032582751f4deff6a75a3dd1a02e841e7fc3f58b80081c2af67ee3470e471939310229e5b6a9ba4ab92f5689fd28da4b9009ad96c2309149c30e20982bbf434dbbc0022690e8e501e1655b57a9c45db1a8c0325373448672d66c911ee8c9f2fbfa57c4021a5dec0e5cd5a7e839b8cd0f46e5a534456d09352f3cef26413b7c22d4e025000319925bd144cd133df46a6688530e5a94d0c7b0196f9e9f792bf9d934938ef279ee40878cacff9041073012a3f05cc6147552eea91ee05f58d9ff20e44ce75a25099f9b543c047ee9b387c459b256331eda396e88d3b0a437de183abb2b141a2292935472023a133f612297b9182bcf7bbe1fab32c87027e88b744e86f03766b13412f056d642d9720180a3ea6334f69ed0d225dde0f1be31f9636267e6f942aa6cfa8c507a7bfcbf082d61bd06e97a9828bd058835a1a798bf70457240b4a79fe6d1346d0d1420fbb73f1b940b8fed9acca8fd42860139c0951db9e341c7eb475f01e5bdd1d674ba7fd1c891f77ccc7317d88b0c911486875800b0d4650fb033f6c261a7e0f5dff98e98f2186b2074d57c24a656340605b03c64ca4c64e100181eabc8f60f040c71701f6e7a61f18d0d9632e2e091559384763ed79336957fe84a376daf49eb8a8a4eae995c15435fdfd6cb70ac1a67817a620bac06f11fc6a40d137e5e78748941235e413df661e4f2726c4d99c9d0f3dcf08b4dcb20cabfe8d4d5c2a2dd73c9b8b51e55e8d34c6f68b7d8154dc7bd003dd5077ef2fd9fbcc87e674e934a19fbbd8cf1231419a326d2ca71efefc6efddf76c6421956222b050ef6694c21c2f7c0e2ac5db6271941b221bd0b8f064ce92cb6781497dd74c5e4c5c830fd590cdf9aa6e260b64f4ac94ca1f83178fe02bca0d3413db5483375aa77a4c84e210484af22d7ab8e01f6158c183fdb3681d2fa9a14a91dfc88edd7c65a03eeb5f96d307aa40ca376409012df83dcfa0f27109565838b77850088617defa937dcf1c32e22425a9048de2b9a2a9646adacf06105aabdcce3b11d72d04ec271d5e76d2b30f6c33b9f3d0bff928844f7323694791a873c01ddc7fa95bb8ac0a4c8754f5458ae8d13f62700e931c65a880404fff0fdd3bdd3aacc73104438c53888480b7d097f7a7375467cc33788b2633a7b5bbff8ed9afb65522a01748246397b37c117bcf982d90c23e3ee13cbd99d5ccd7b7e7126b9a914c11e691326fab4ddf2935733f63e1955a8e26f7878b2db2cc39d42ccdf1b5b11ee05107c41a0b1dea0832db1cd85c8fb8eb17b4afb1ae07ad6463a1d6af4e1287e0ed6ec25d45f1c84dea84dc90be3ee54aea337635d48a1c9250657bcf1a338183958e6df263c1dfa0e488375a5b35b88c896b17d3b4fa15d540390e6be0f0b2b59d8e8d5d52b44187fdd4f6d3bd3a394e3cfa06eb0f95ccbf5142e2bd8f73b96d3584982fcb123a2f085db81a8a330f5afce48778fb2978bf71ceccdb6caa1ba9e87476aa7ee63c879ff005052c65df2220aa56550b47687ee3892ad98f6bda2bbc637b5522f76dd86f204fbfed47f8c89da65805c7bf183aa76e2c4c9e7d471ef170e54f1c5908ff9cad30bb6e1ea3d5508830c5d008ba03ce957b45b08a2e8afe793b951acefdbe59da55acd21906ceecfa600df00fcc62ad505724fe66b5b4367be8b7e3dae32f20e03aa068fdf978c8e42d3d65c0805f4330323b567eecbda86b7d1e081944230ac12c4a160178aac0134b12319ed15ca2402288eb7470edd53d3a7d60fa395420100fa45df1e2c26704ce316917f1144399d0dc6acd33174c7fe3088472264b475c66159123ee7b05b28e9579a3fcc7fe072fbe6ad7745e4bc81765bb620e7a0e562d4bef1134446e799962f8dc57d8624d051a3d56877bbea0892f5ad9cf461494d0bf464c316093f9deac5a67f2237df661cc77fa36f61b58fc5c0e48ff657895171337190794fb09cae99d95f8c7f2c5245d071c078d64dcd70b90bf9116b4a70156d006edee9f70a5651b46c90ffa4c1e4eb108dbb8c9b5e76a6dd46ddaadfc45668e087c3187980092d80f", "5163ac006a63", 0, -1632957627, 1537743641, "b7cc4fa29b46d04090d94b1ad907e885ddfd896397d0d014f2df3d8c8298a31e"], + ["030000807082c403012868754011c04947935771c1f5c6ba6af0669a42fd505bbefae7234631db07d502000000004aa3a8a2045859e00500000000075252005353ac6a56cf0305000000000097abee0300000000055151515352204dc6040000000004655165630000000096e56ca100", "63ac5351ac", 0, 1583282119, 1537743641, "85296f30478d553e07dc2b7a2af2899430c89669ca0934722db5ac82872b68ef"], + ["030000807082c40303da75fa5336b74cea06d748c0e0c28642cbaca3a3cd3a9923aac2bde9bd59e32703000000086a656363535251ac30a82c63f98243876ad86493ac079a8dea3dfeb2973bd3f6f0d7b3b45327e4f00683aad70300000003ac6565fc3c84acbc0991f3e1bcf5a5003df672c79bf414969a5c2bc6b9c56838577f9c4ab8c376020000000163ffffffff035512b70200000000025252d0d61505000000000553ac6553638e52a20500000000095352acac63ac6a6363000000006d02196400", "65516553530053ac65", 0, 860211217, 1537743641, "e45b2412df9708bc9fb8dc99387469827cafedd5d318b257ff79f5d1e7f49096"], + ["96367b7602d8d06f19acd891628929c4f383c18e4a6e98f2051a9ec32f4a4667c24b489f7900000000020000ffffffffffcd893acf0e2b782a80a59f4634bd821a1c609c83de0731a03f410ecd99975c0200000008006352526500ac65d4a298fb0203bf46000000000007636351536a00638edf9004000000000951535163655300515200000000020000000000000000ff917d000000000065ed541b98723259762758bb7ff366fa10433e076b95529f9a25526ee820f674bb0de6e71f3c9a855d6d80b960c55ea1c431e357015a779730baf57e2f2c2113ed2f3958b8fe5b8ba4237f34498be7a624f25b63f94dc38adb16126ba6899b9500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e79bac232b02311714393c50971d4a678fca293fe924a1ac90317dc7013be22c96041f714ecc2416d8e2b528bd22429337ba003df25cd98c95179a5760b5ab4baf184f2bff025932a41378712a2bc4f816f664ffabcb9f55b7fe6e1398a65524e2537be7493822349aa1648129ddc76e5e382b74e6a05f4609f3ad4936b1777b022ea2ddf7a52c4fe8469b1103225d15df9a87579e9fcf1164acffefdd38616f6c02028e6dec6e09e26cb90de53ce73c149a655167983206fefd086212a0a2f64dda0a07e99c5a4c71e7057da1386cfe72d0cef1bdda569650acb17ce690e2c2b8fd7544a8454cfdb36cffd9b30b5ab974bea55cad4ad1a487dfbeb6619a4cb86c6fa902194a7baa3e6b20c54fdcd0b74770d5310ffd78c189f1924bfaff2e4ae7d40f6802195148f0dae148d9c5c748b915d9e4899a6847e22e30e59f9574c687525a1ec0031ee73953a15097fe84dad00d74af3c79463a606bff4d172fe7a65b0463994aac032b8c4a5b716db45d5fac684c038c292621b235bd0d7998752c40c5649f3bebe00212cfedeecfc2c746fc2679afe4c6667c199576f5f17a3c75cc3ce1e6acc77b55b001a82253d883888ffe2213a114816a50a136bc29a449c4272e9bee7ec7ca7dfbf154f7a0d5dd4951d1bb456d38bc89ffa81710b212e84261224bd6c3991d63634e58e379a903f4ed32dc5813b967702711a64e60679f74a6afd3dec582ef132fba445c7d470531669c173e8ba10d3e21e756d479b64e1e22a37453a7b508e041d31b955b755adb2cf386d0064d5b03a99cdf61cc9f3b4ff8842a8ee489d78b008e6549086657fb9d4f8659bd9670870b18db870ca755477c03916dbca84e8327fffcb077b7a8c20f813c484511b89b14dda22c8c367cab270fa8701f56cffda2548d0a1558bc88e096e38d2bc014c6107dcbcb1f1a50ba23bfe7255bc3e570a1400ab357ae09f42ffe5c8232e6087f5df2e11cf6899f66cd9d61134f837b18f22b95c8798612152fd79d229cb9c243a880eb3112feba4e425155b252f3755ba562ca77b37f6de333260a8798f22b02a3bafce7c45612a7525d8f2ddaebfd8ceff4dae724a5c023df4d7dd5300b80bdcce127683697f961de06f1a24d4a7ca483465ae65756a35f9a4d71b7016a0052072b687d5402e1d9fbee11014117e552f6aa74c05e7a63a3c4093ea1736bf08a829cd49330d67d465ec04028c5f60f3815d15823a8a014bfc6f4602a08602835ec4fc67f805b30b071285bb6da6c5da4aa2f9e9b23e283b88ec97b488634e560d3e55c3f95c23a3f21220ab56f9317a3220154b6f6d15de04840e11bdb52cda6ca8d82f8ee8c0602d44f76eb59aeee60de0561aae1fd65bc752ac860380f1d563738f90fac8536bf6517c9a292356a1a8da8d20cea397c9cb08dc38c68cfe8dab5705711e23cd4437c342d1c49fd6f9c4c54858fee49c6a1ec8ac6f55e76620960a9d9513a7fd26883024baca6f411d5b0b62b3bd9b66b505f92a898a45d4081895302496f6cf0cfed4b62c5d9330884066badabeda7b56be9720b4e8abc91814ae9e5b242db475191c7e1b109f884e4675b218f1577836b1cf46fd192ee0ade2725861bf63179c703b18f1fb96e69fae042409a16be3623b92682190665123c0c9f072b42a36dfaab8a090f51c25c7acf9f7bc113b7dec6517237c2bde013c43e95ae5a7d633650cc197dfce6baa069d1b65dd281f9b01312903f6f53d59f9303cf69e85e4d1503770a20a1943422a4796846e526fb74b9e5666e3a9039fc680590d9f85d932dea3cf0ac06d9ebc10f89be4a3e76c170a455b9620e5e60a979a18332ee5b2a1025025f62b7669ddd381ab2a712720cc8941ac02cac80415e3fd275016452bd0cd9034c3d8614876233708be744d7ac8c6f7e39df3d7d71763bb51f73b8b8bd7d809cfd8a276e4c8bca46a32db361f4d731839434c594ee1fbd781e73ccec2d5378a04ad67385d5630497d541f544b86d28fda3e2ebb66be7103bf7fcc31353171f67b2481d9c53d836074242ecb8d83918f5978377b3e0e9cd38aa5e49a3853088bfa0dd56fb4cbc85e72f8c873955a79bd0bdb75e060297d7f5e17f5e2e05f0f31ef62a8ba53612ac9b7fb13b074eac661973728addd8cc2e9bde6e48a69339d9bd9ccb6400c64fdc8bcd5068a9b40fe38dd0061bd68d027489a27f4d3b99fa99acb897c48bedc8b48bd1bd7b8b51923f043fe083fd4039c6f7f5526f47ada09176ff2ce907501c4ab11b36a131f73cec367e779b1cb3244171b08376cd050000000000000000000000003b2227e96abf3b9de3d464cacd9a94691627057516e0e68fe59758b3f67f12b4452f67503be16630540478af146c2b97af019f3a3d1cd2f852816ab55741afe8c1c99cb7edea8c078b2a8e6a77eeeddd1859beede9e3b04f63f6008ecdd710cb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034a84640d50609989ea3a69eb91ddfe58ffebe070875e6c1987e4e2012398bbd8e32e3cfccce51f2b6ec08dbcc900c886a1dbe12cbfc5f0bc42d6bf81a828e8e9978c1f83f5ee313e7651607467d2ac7e7c23fa67795729414d4a9b0523be729356081db34f4997e14f94e172bc3de30686ab498912859caa145e2a0b32b853b0303412d1f07a78b68340acfcf517e24abe819dd31e082ec168f9906b45bc3138f02097b092f2cca46d0cec1ba0f7092aba8a6ee3f63473e0a697f33e9ac9e5f1d7d0b0497f220ad0a5d4aa5e37e6fbea31845cb9f833890f66f6419760da6985365a2f1dd3aa8a497e5d4a2f44659169d10424dc2c69fa41d04b67ed50aa4a256c345021ae91b9f7dcbe96a9a5c4572dbd9db5b72f2efb4db185e462a2d6471a6cbcb6a0329aa8f9d8449c323d0345c0017f343dd7fc1a5e0575e95aa7dd9cb2f8223276d0304fe43c8066b1a9cf3a994a6c46d06c8301671c2294018574490d659220190b8030fc5bba8c6c4462748e66b9730d50ed3760e18686d80f72244e2a476ace5f87a032b6318cda6b519de34669222e04e91c219c372e0d4d04fec2cb6133541e1533ce76ddab91eb12d609f5d0e14f43d59aecf630dca95fde8e93f88617b8f467a4ee0bec9f263042322a17764a944843ee3d58ac6f23859d9d1da698e1064e1c4d27058f3e2a407ea20018ceb89e6a90d0638ccccc62301f99ec275dcff761fba7163350dfc99f88b2d249de9a4dc8a693a309fc793d5c22f1934648ba7763aab72a8a300625cae5a60f2850b9fd6cfe7a9a261dd9b8b5e235eb1c1a15d3b68b6eab1312102e49c3eef8d8bf30bf4097753529b52372c9734ed96a4009bbcbc8c1f9c0d1434a4a1e747b6c00db0ccc8041cac1b11c1e0069ad44a1f23b071d67123349d9dd799d1e9e86c9a6be297e9cf02a48dbb29a1ebfbea0815ae7479392ff9e8096c022203af114c9ce9143b9132bc6a27e6a4ee6e09500fb716ce4b302e05311473dd3521863fb13bd5caf492fd9054f0496c982f9bc67fc0ee9b01718bf01af90166fcef4f8b2e5d50fe920ac949cecacd1032da15eced72e54c437b2779307cc0256acd8e85a5d24412653cf586cfb0e864babc63f9f1364d10ddb6b1fdc9ae5ad760df0b0087bbe7edc6fa2b48535623ac3aebeab3d6d897a57682a9bae0fef9d15f0b0f4627e024d2da0ba3c47637a662bcbaa18532d6fbbafa5e2861c9d2ef06c432d19a6ffb2f435110c81988ff43ca9f565e64d907c1c6f3523320f53b299b2582a6517ca7d4dd1a4f42c8b89db661de64dd206a00fc551eb1a9d290efdb14f3ebed85c7badd4bba3b9a1e833b2488be5c1954aad95d53d537ae231ad96000bfb333bbb5e7446ba42c10ff39a8fddfb39b92d1b07f3aa1c4afe8f62917a87336d2ae1d665343ee862a60bd91fe08f2adb0aa11fcf7707dd94e8ae8e8f22920173d0394cad85cf14441194e4418e26099dd50d258b0227785af75b9711f274f6388454ac57fab3b700fccf28983c7795c22038a455a806f604e4ee10781719f66ce00767a0d5194a1d7f04f3389695b9c50eec0a930fa4e910e7527bd14152d6388dc840825aa48214bff060118ad6f7689da353c4d11b8eb582a06206031da3916d280f82a994a628dab5654f24eb018eb072d7652fc807f8f8c7a4c618d41a5d76557a7876a1cc6fa820da7f6b55cdd7fa3ed1812ce0f86665da6e0f9beb101a9cf46c890589d7a74a5cb6ca12001f1dae51fcc4503eb0d9ebee11d45de23f7c14b1673412bb19acc3a9d676cfe8dd17262c0c082f47f0fee0efdece4991b6e11c0bd9a35e71c2f36953aa7316d6a5eb5fe8388aadfc2a78636923ceb667fdb50467605ac7eef0d0e3540a32ee09f183f471764a45223fb34c76816ac346582c3ac4b11d008208dbe83a7a21697df5b46a7d422465db7aa0a31547eeab2cc08b2ddcadf22e7b66f5f03625a0de5a4af7e5d10657ef9913c9aff75e9eff7bc3457d5eb1103c8babb64783069e2feb6c10f7ef99996f50e2f2e947e6bc642e9f2bd40a221f1ebf7d3c207bbb44a1e70916c92f232ae15bc11e2e423d2c8a0cdff927b574bf2e666bfa26dc0b8ba55338b3186c5c20a3b5f7ebcd224617e58e238a6114a31a574ad001ea3990bcb089df0c9a7595393a0f525c93e8fd074f7a99689df1486fc3173f9071853c359546bf206a41e0dca96e8a7632783c13d7274b403a6033d8a98e302bab543923bd41fb34bb485de44da0ec52e05f054bcb0e15629f435091c1711471d78cfad35bbe0dce429fb0fec4bb98ea6af8dc271a103cc8754d9d669f5589418b24fb626a6afda0f9c0fead068c82c5ad84014fcb0baad69c07e0be34380029931d1984ea1d31c1bfa15f7022cfd499b06ba533c6ccecf9568de576d464c6feab2059d07", "6a655363536a6553", 0, 312005339, 1537743641, "ba6189f82caa3bcb8ed59a81348f672e70487bd6428a756a12b4dcb84327fdde"], + ["030000807082c40301c0c3e1f8f506126d5a3269be998eb8520dd6ae3259793e3153b2bdea67fe1c6400000000065352ac516553ffffffff041ec94b020000000005006a525165a74dca0500000000050063006351496ee302000000000851526a51636a52ac60e5b705000000000000000000682e7840030000000000000000b13da504000000004202c496a3bd165e2da735a69c90c1f512e9f4c9593cf3c539fd3ba2d62da3a190dfa640ef8ec64efeefcbaf8e5ed79c5dc0d8479a9568e2931643a2fc3c59b8a512301eda50db2f2ba41ef54deffc3a111f78b45c10a2db8f930b42c3085dec000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004f5d0e73e3a73d994d7322b862d910f00317cce5802b97e592d4c423bdf0568ea338d4d87295928b1f0a73fe14cc4975f8013945b3a073dcafa5213604e1b3aef662461325d8af4307aa5d53035342866fff193efe50d8655c01abe6bbad50c2d88b183e1f29a903db94eebd778f1bc6ef8956651ef3f53404adee9c3a83874f0323234edb6a895103b79ce1edf30cfb53ed805a06e205af2e7246e89777445083031800116c209079831fdfc126aa84d418631676c765dfb38cb225ae4bad6c6b910b03c1161600ef4d117c2dab8e96eac86c91d3a4aacb7569b0609fb0dcd4230424191e48d596147d15bb5fd475dea4d3256c0f9a75ff08786c9d2123ae11dc70c8020540e83b6639c7f43008fac0380ab100c59b8c8f7a0981325bfd719c36e28bd8032ae46c03fc1a5e75320b846554dfb0a64d2dad67e9e8f1a5122f932ba3e0d91f0217bedc2f4f6866d659a8c2e628b47e40c97dbbe158f9a38773bd642396e70c69031b02cc1d2a01a5a0bf4c134546f34a93483ee067a9c41be47c16c827fcef6d8e032e8aa772ce589e97aa5862c00484e1e62893c6e12c0a333681ea7a2b1482ec1c66e38ecbdb2dbff9c05b127ab2bd5073e02a93048ff3ddb43ecba93ffd2cf6ad7f6e2ece8619621a19272213f1b411db8eeabb8216103d56bde5c7bbc0fd7a865f44b56f3b5f6afeb4d35b15f07e8c79fbcdc8484488c93e8ab01e582b9ae22c5326d8fd75cc2c64f56f24b7bdda6158770eac9ded1e1103f5f90abcba4f29317b4b2dc90c4bc4f8a38b07c32cbef0e82483bdb032dfc3921e46ae4f0cdbfd1a55a83e8dcf7062c60b8af9657f074d43a173071627050a6581b49a7a9b6619022677f5fb6dd41c382756a12efb47d22782424d5083be980ae4c58876cf641c4b12e54ae177133c08d858bf2c71b52a6cc8777c587da3cc0f497e23193c24e0febd161f4f994e1f47424627d813bc23ee7b277a92324f1d338df010e3ef96314926877d11560bda0f41760c591ad2963d2a01ee5e69b9bae8fca8c76d4c4b6efc0aee49e1de5eb4bb97a326fcae606a2420db58dcf1b67fb94149f750b8d80ed8f68747047de0489d69848979f6ba67711248a20f12bb20733eae245ab702963cb868db1b1611db379a43505ca388aba5bc7ebef1abdb067571192ab18a12cc473c40bb592c5ae7974ffdc5f33d46129b9ea9ac9abb14c03d9597536ffda74cdebf758b115f93908a399a84f85cadf6bc8b3df2e1904319e4f72bea4922e97d08b3d3822f17a241f4639e7df0f1e6ad529cbbe4c03a77332441b33d96b78218e272fb5c727a83e2f8147a34842edd74454271e6aeb049aace8f983844539d0f631956b9011bd53ffd50d6287cd97bcd511c8f9265424ed6f7ff83e3db9eac6baf702fc4f0d373d6251396d6c193679a294039960651014c36bd5539643c1b29a92678e693773d467cd530f5f4fed95d287cc0d99d4a95ca1acda3e89f5fe83ef273b8c6141944bcae2d1935580f68d7941d5b745564c98beeaf78ea44f8e249aabe3ee6020b7e485bce30669ff12282ac5627fa658c36590f34221e4472e9bdbba881c76a269012dbfc828abcb9af3002040e804353c132add883689e758716a6a7913aa45a85995e7cfae96fa8c0f4dd461967a1b3461c903b47b6162223579668bb072aa260bb68ce9da4e8b69347912b00236936d40ca62e541fd215e10c052d205711fbf89a8c0a5798db6f678c01973d71a3285cc53384158438b7543c236d2794bea1fcd953e36836f274152ac63279f6a2380dc8c7f7e8b442d3619386c261a46c7a13c290de014b51745e97d01c1aa3dd4b4e252ff0e0a7ed382f3d53064b870f6a1f2d3f45c7ccfec005d27932cf618cce3af162335c23ac82c7d6a93876c47c1bcc779ff34fb5653929283d9db5964feda531c51a7dc3f35408925a2469b15bff9eb5cd9d826214a1f479bbc931ef719c59568a2a97d2dd665bc6d62e6583e1d9c31c6a2df96c15feae0989ecdcf8098b1c178f625a3e1476068875d4ab41baacb190a24372ec795e01aab839357900da643c1077a7ede5dce8ee3d6dcd00d4cc991b231c087b3a4eb9bdd7a628f083be3231f004fb3ddbdb349523728fdd31fc57222afa59f2f371fcbf091f1bf15a1231f7d5b5fc596243ddd309068478e022f2526ea48448e67c22872a86453c334d4de81159904fd642d19d120a94064e59d528a24512ed53e7a01ce8048e51cf0ebaf7f31da17819c125e5212b66e608c53e419a394c9eabc8593b522aa400000000000000004bb7c40400000000785cbc78766a5fabb41e5d31af5028d9f23f2083f172a5a242dad418e2c29228d8e689fffb6ecfac995f3655ce6b895a9d3813bc2ace75678f8fde6acb9eaedf79ea3ed70cfc9ef48ac122f4df7614af2566848d53e056fb60dbc4024981752200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fe9046b34d73f5596ab4892ad9ea366c2fcf9790bd91f9d671abfe4a9e7856e60896f9f315ab8f1606c478478eb03e47b3531e88a2972db9368821e4df0fb62c0d0a0bac7feb6dd5e8f982c5508913d633614f235f55a3aa5f3e8add7fca389a734bd025c08a30b951f16ec2cb3442bf61be16b6e4fd500792ba498882fd6afa02265fe67d58902edb3e12bb2fa6f76fbd020763ac40089c3690b2c7699abd9ceb022c501a8d80d6aa420c7d9fa64b593e976e5aa5b563cc5bdbb935c12c8213840e0a0173a1674645db923ad27d1310fac5ef8d4c54fd2dbc832cf2763bf7832d5b68de62d841b500b73348a01ab7d609d66b3d1861674114a95efbc272fe37ec3bf502066965e8194b2e72f48db480e6dbd330f3da46533d8e745ff45087969fd6aecb0205620aa56307694d9c5a108b9e1eff298ee9be1ae376d58c9ca52ba1e77f262e03123ca0bfff67bdd364fa6020f71023f75ec55fd595cf33026ee0dea0d5eb04fe021056c23a4e1a2b1b8f7bc0d64d3f3b131fba9c09aeec584a6fa50f9500dbc25702190367ff28eec119f54b722a79e150611a54e4d6da0c68f9fd6ff007389aa6d32f67e8a1c8ea13a24d468f7ce0d6ed52531eb6fa93f6d6dcd7fbcea78c84707511c22c2b858aae541f7e0204d75f3358bef37f5cddf81280667885b48989b0bb93ab2f0a486736999d27686b90071a62c97b40071139b524b2584220911e4e2529fd1512fc46cf2e1de7b904a58650fe050ebcec3538a4e48a95cd4302dc8534b1a7ec7469ffa986d55a15414a3cb839ccf982da2beda0ffcc91769ab91d82b72d277eb783ee700b46a0cc21c6d074000d129a843e4c1885fbf181739f891572612094b680d79663b8d7aaf1590cb5125ec0511ca4e2ad583872364c764fcce413f24f21a48761a446d180a85883fa28944ab0198ba249125552526d719a43a902aef289e93e2410bf624911358923dc1366805036ca58ea6454de940f05bb46b38d2f0bdf6a7676a816fd6c776505fa149a9a6ec53f1b1c23401af255ead8a57ea9f4005f2dcd7dcc3d3c1b6e72868a28b55700c4f8b813192df102d32d7773bbf19f3a844fa4e0855467f484618e0cd90c42506c9d65e505ccae1a98480be22adfaf0ceb73dabbe5a57f4fa3956ca75b93cb04a9dd2113f9638989a846d3fb6a07d1cdfc96c38a0d86fc457ad1094d07d829e20084f4ec5513c7278ee125c853fa3123784753f4431a66de78c22f3efeb8a2d2241c128e63fa75e2c965b35f37a18a97e01ac21b23a11b9e8a749132e059a29c2a113e72f84c7de02871b8234b8cad0d29c2ab3ed7632208c4b781db328d62cfa21f065c5675a26e99c0cf879427b225ccb833e5d4e514d668537f3342c30ecb957f74dd6fb54f38415d0f9bd612dd55fc1ac60b8e73d093d5532f81de3448a698857c027f591ac87cd7be37b79a44016abf5fb97a1875fd4588a72a7f635a426027542e1ff7ab401467a97ebb63bd3e24084e4cce4e514a37443e5badcd8a03896936175d41f6b352bcc1c41932dacbcd2c03d0a98c9f549807a923b3d22ec92e3ea1afcb45afd60ed01716bf83d44b0447e7f1ec3bce8c7f81940ef54f1d6ccdf1e4bf691c3ec767e2732ea0975279e0188999cdf1b73d7a3b051767b56b5e7e7cd6aa42775e1cf380d7c0294951a2352f17e3e8b13e951ed9e1979040730643272e9f32e65c9b52e06255c6e3cf0bd1fe3921205ef39540b759a4285da6913e26fa00a6a912162f73107b6bd06db992197cca851925c848c07f762e6fd49294f48f2c500ae4e86371dff73b47d13d1d2ab0fea50dd197bd3577b2f9e1a642a47d9567f76a67d1bdf1d8be2d13670bd73aa60ca8100b984b2f624918b22570bcec30ad7897b4aae20e6ad9b844a1daa8bc7e52113b0b81981120801a28a7035cf842f806863b1047ae4f8632b825e55d5ea99d329e608bad314f927ec305ffa40e1a1434f8e325c235f0d1917d33121938023d6fb2162ee16734af6bfd16f8bac945809c69c0984904262a00053d0f2684fc5834b87634a8af2910c10cbfc1f0e594a87d440120ea5a8edbba725286bc4929b815fdcf2e7fedeec3a85dc4e43fb1fc2ff212d5671222ea91af6cb103994f295b58c56d338af984e7a2e006710ab96862c4420422c27e51d69ecb14824babc608a9bc591ce5cae29e5e827bcf6ec922e1cb614b4515d871fcc4073608818f4692d09e5c5a9be368c20d6f882188a64b2e239f85bb7ad4a5eb5168e8243e251d6bfae9db5880f627b367cf162e7002000000000000000000000000cc45ce784927e1fece08c1e36fd51e6f9ede8c220142a8cf02f1b1a9997f1a557cf8eb1c99feab96202c304bf0e6e13854689a178a334f7aad9290a2821246d1a863cb4141e476c994a15fd2bea192d5ae7e7c35bc43616f40b838879acb0deb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004b77829ca5d4a1021ca1058d8e7a9ecc73d20e8b78014279a88ff6481a6e02af5dde886eed2d97484329eb8e131fb82765f54fc3fbd6e998dd8d92348ac3dcea09d8a2172ce5c992157150e3ebacfce63bc2502eaa17b01db976bc9dc5fa2cfe4c0484c3862e9b7c99cbe2263cac5f0fdd36587392134325f22ed9506e7a1a8b03014be42ab666c3787037646db035c6767e18cab136ca5869a8a9964ecc62da890213bb3dc8c5b9a7c61786834766eaa0207d318c109b7a6c4df088e68931ab28c60a0747162e9ab247e9442c3251cd4cac97de08445518aa30ffa4096bcd3a6c7fe8346e1ca1e46c89004be431925ce9653ce2ca95a46e2da6d850843313612933860319f492b270b3033a64f0f16ca2f02d67b5bca3d5a2d2f2b10b05197263f30e9c030a31982ac4d953cd71cf8d825b61674b0d2df38abee7e13d696b5fba0ce3d5b30206810735fd297336671425d5d25afa158043dddb952850aa863a187f1239c31d0227c0fa57328fa17c541210d08457824a3483040d9627a2932fd359ff5363262e02213fdbe6db68b97a4ccaf0f838547652925a65aa8170a18aa9bf0a2bf5827a33207d69121ecbc862deb16c96d9ed8c01830d2d5a9448b68515f0fd625a9fc0ed0237fa2cc19b0f682ab471543aa92a8c9f7ee53b45ece78d20bf2d9ec2ae37e9fa3d871782cf5d4fa2eab626fb72d22cd433c16c5d5b1b4d8bf9699639d86a00e33ff9e85584f73d7761d10a227cd01cbb7e8cbc2922f5b8ff58fdf66e90324eb93ddfc969d62298179e7b05097afeb3c31004afd95b66e15a102cf804aebf0c7717a42e29a0b7a4720ccceed535f88ea6859a37f8ca7c64bc97da9a949345711fd9cd78d15730f65f84ef9af36b94bf8d8baf474bbcce2c58fdf0cfb3dec666d30ebfb539fc1dedbfee8cc833ec640b342f3d518777795807a18fd3f01f0d574ef77596f37cd53e4ad3a49d2f755539c95bd6b19c42630d21e81faa1c674c7186d0abd9a0a6de308f30dc60c253cfa936e5d53f95bf2240f4f41afc5e654ab9be4308bb97fd459ba756a2ff1af4ef8238692cd87e8ac651b256a5863102912ee0874d264cfa74a6c9d74c427f8ffdaa6525be12066b10aaf335155dfc3917f2ff58cb1161372b7c40ec2464befbd061f47494949a86f67c0d809dd47f5d1b4f44812e4dd30c16c35caf9f6e869c04835f930f40025e4b3b8985ae796a8bdb87107a09b96f97cc4fc980cb91e4e2779e12f5771e05abdf16dd75ab49546223a3637b3a01d53e2dd072a3d5dd2e0226af9c6c369bd81bcb6e21c4f345f3869e574d148c653860dc9aadf00dd6b4d05cc2ca8475001777d4eee4ed9530bc31ce2cba7eba0e5bb8c8d1da18f194b4f1dac63151b1621f78dd9b4ef4a1f522828a036ddca30a8d1527a32ddda137ed47064a2a03e952d12ae35e7cfd33f1366a6b0bef24643ccdf910a0662f056891e944bc50bee3eee4c3cd21481f3834178c8bd01b311eac00caf8f372994d599a6447ead0264822fdeb8505459cfd64eed843f7b354801c27a7b0f14db95b28fea14fa1c33b452ffa2efd8352a273bcff8f064bc9ed524adbcbc49037fd58207c98e55b214fc0aacaee5d90aae199a14f777040c2b91627a0a76021311433384d46869e8c138436ab7e7a2983b6d9fd55787215f12f68b53109ad5f1f822b7964c262f2c3e7cd66b6962a6ec47f5a6c88a312464062ebc19d1bcb83d0e207a6a9d95ed6230d1e11def23daedbbbc946093b3ff2ed28b7569ba10836f9f7e7235f50df814378035fd794b9d079025ea86333ed1e74f196bea7dd3f10fa8df39563aefd7de5f21156c2904c74a8d317261da7811b7e2c02b40d455cdff4c89df5a44a6c9d269ece29684188afff19b6df5116cc3de8134385b26f27cfa37c1d3f0fc5a4bfca3d1be44d9873dffd2a26434acc28a3b8f1972c54d0e0026bef0ee6d68cbcb958b55a26036f9660e789c92898468664edc029694deed9a1474a8d70ab09329c3e7870ab1edc19564bee42cdbc533493a546771bd9e6219752c4798c19562b66b2407164156a7fdbf5f175150c673c44cfe644804131073db23cdffa7c7a2ace50cf7f63641d24eb1fb72636a4f9380078194f81d85e8dfbf7eb3ecfe41029bc7d5162c36134a3c2fa8635cdb55778f3d8857385af03801b24c4b352262259dbef16c213dec77a216bf428f5226105cd2ddaa839b8da918895dc88633b68ed97b3286e2f4c4245a2c9bcee57f7a945d0ed2d4d052d244e39ec7faef427f22640b40c508a3f98d72045b5d32c65335787017ccaaa08b54f3ea1f9a9c5efb7d8957a27b27b01440f838e3a3880555bca03a2b45afa2a7906cbc64ac5c0515ac3f68b01441a89ce025db178ac9f6d8439715836317f4dca80111e73dd9298c7a6f8d604", "6551ac6553", 0, 1407451662, 1537743641, "c237eb497ce21eaa435b995fc253c823801bf9ccb3986477a6e74942866b238d"], + ["030000807082c40304ac48e5715332938601c404f11d0ea19b56dc8673558f4bb6ff6e31537afc79630000000000e1510f524c242439978eb65097e6cca70a2753b7306c6afb264abaf49b31be1ace95723c03000000096363ac5100636a5351396613a26e141e81387ff0f5fe6964c8989e34c8478ad0d9a491de5d080ed4dbd9bd864302000000020052ffffffffb97f70f1aade76dac58dd111da8d7f848cb87d6221946c62ad210efe3407cf53010000000753000065630000ffffffff0341c09e0400000000026563417ca901000000000853525252535265539ba409030000000004ac6a006a67e3de20776f102700", "515265655100636a", 1, 1595727327, 0, "dbd3e6bcccff4be7cc6dfdd0c2e3b97f7117dd72fb3fa7e6c0c018b71b5099e8"], + ["030000807082c40301a990a924141b4ed5b08f186d6a6ffa3e07794ede8e2f7093a4b173b7be0765b60100000006516a52ac525382b9f0c5033dd3610100000000026a63807b2b0000000000075353636a65ac63c242e00100000000056a635252530000000015f80cec0100000000000000001d0aa6000000000019f5217e67fb853d30e2c4882b70687dcd22ab95dc4088e74fe7b19689a16199140688b3687223ac012877f61397921e46dba3fa5a09cf73839b6e54133f6e14b34620ba4e31503054bc51f2bc5684de64ad9c449bc0aca673880e9458121c5e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a6662b29747c7783c959346acf0d182ac0e8ddc65e075076613e20a24bbfc1ccfaa6970873d736c64f9c43c9b18d78b23054b8d056709c429349c668b6495c16502556a9eeba6f9fd144c94a52c46974ee09c0d63b69850b309890eef2cba09be990667e49c3fb1729b8ae65126c5201fe51d941a0da46100f7cda3630d548b032e4211001f1e2be334e6d7fea9aa9969f17b8d0858633aeaccfb7ffa05daf5f2032ccc53cc006c9734f06ec9d96dd5e43e5c1cdfe396ee0bb9258141c3364f771c0a06ab118c686ec7631a277e2e13804bb372ff72d343d19475cb36881f8d5d1dc0b6c9401f4c187e501365597b72a8a43b79c35839473b7edb559df66b32821efb02101d800b88617c4e00d13b057f24d64f4e488be69aeaf1698293211787b9f7e9021f5b27ea08e47f8ed9dc21352c47b7dd5bf3392706de5bba92316d63fcfdb1cb03129b78bb7bbb5b1217ba6915e95403cccb99059ffeadbc74abe66279b6561788021564f6620a7bf33f7313ce522d05f0e63f1948012debb575e1e28a1f4bb58fa50327f40dafffb3f0482cf4240107c4a5727679202f5958ba23bf5b5bb357be9ef77dc667ace32cdcc93b330b71549af77c314f7542d0e8eb5b7acc5ad3cbd296f289163d1e6282f7ae1d78734dcddc570a12df8013bc5c2dff54cda1d9aa5c763fadbcba19d27010f7ffea49da81af2160e08a7c87e60b825283d5236083a581bb091175a09709eb49f5173b0a4c3c29269b8ee649aa71e3bfe3de976fa32e34a9705a539d405876979b83d6235c9fdd37a37ef5957a30e2e8721b9d9fe566a964a7fa1a31726dc54158e292ed62298a4edad8da448621749146df287956679b953b7e8964b3729593a26ae1aedd68b6ee7acf0565b532dfc4463ad612e2c4615ce4194a14b0aaa03b8eff534d76d1f5cfd924c59ddb035a81ca5566f278df1098eded82a65be0334e27e6de0e53eac6ab8acdf76fdb5e6d50376ff20c45f802383ca407d96d69351679ace759a4c8539b40c85deb75802c8ba3255a9e5ce6e9821f94752e4e1be6086cba60067357e113da5f40659d2fc4a12b5800e91e84e0180ebc3c9922e6aabf5009b57abd13c0bcdae9aa78764f58596fad1b90646d01ec5469578b546a1a671ca4189965af385e685526c233bc7247d341efe60c1e5ad386cfc7ccb89d8dadc22923814c4ce9d076fb6de4dda0c0522018e061d9d9223e278f45a4851695773f0d29adc13df23d85d47bd428d36b5963337d2414904d2d5ba11b61d0b8d423b2716e0315bf70ea9eb24fc88da993894d3acd37d75e4438bc03568715fa0d7f1f75037e750e3c667f6e028aad9420b28751820c5055b369ff6726cffc38218709c9ab7eaf4e42f87fce599efb96abca72174bfcc8833bd71eb0a1f41107926014f6b6deceb8f1baa4aa7c9e925433c8887531bd43f6ca64fd6cc29ae85264db46f2405b9286f2fd0948724b191e88a9a384aa8a6f70211ec088b22fca5285a052d4b75a187967e5cabe80c67f04510684dc0f051543ce798b864d8840b8b6100e2e4225a03eb9066486a4b36f77f88b5f1ed609a0df282f5a118e10416ceef3072daa2a18d65ca8d42c87db1967b76bcc5bfdaec0dc18da9bbf938ee4d3c9e6a421b3227764b188613726a6a54c44fa3970a97653ad548563ee79953ca142264ae6b2c8b077cfcaecebc4d44cf683d1e8243ebb79d3b62be58c4f80954346ceda4ec2070aebe7203e3423b09b32cf6a09041da0751934ef98d6d1185b8e9da9137e138003dc241ae6a0cfe443df23532dbd57ecab9b8cff3c9d22dd26f84f63880424ed5593de331fcb08cb3b21ca8d56c009df4d23e40921d7119847ef49ecc2a22c1a00c0aa9891a0d661dc0f3f78f4e3199b004aafaee30bfee551980c88eaff7337ca427943d9fcca188ca1cd126cabe92e449fe360db79ee8eb965c40146f66b40a73240fdf7d6d113bb5df832e9511ab73902f082ef309a0d3c208f027186b4e8ce0fbdee7bdf086ee8984ded9cc535dd021bdf70910eeae4b0dfaea50fd83579e2ef9d939da2632e32e9cd8f61edc9719ba885948daf7f0bb6dfea256c342b8da47525784854d16b8bb5254a85f2077bcf2e68b3b4197dc7a60842633cce57b01e43eef81943247110011c52036886a0b1127f75079a6f8c206fb7e66bbfeff9f1ca20430a68685b1bcbc0c8ef05ddf5e4042f45f2e930d86932f29270e10a5f6293190266302d7f3580b9f74f64a0af9ce59df72924ef788b7c82e2f51ab65fdb0f1a9a8b488a6cb5dc887f4895eb19b67ca35ca8441d51a6a53b3d595797565c4653010b93cce5ff84a0a16a69b391a901c5ab3c64388ab0a7f0a7099203ce86d9cb406175d41781678dffd1871a149e38786f0af4e3cff8d70bcef1d49bac76bb63a2900a", "525252650053", 0, -97007678, 1537743641, "4fc43a8ec2dcc5711e85b5ec38282698e26d0dbac92b7cf98cd2e5839f5206c2"], + ["030000807082c40302f87e93fa3be87b8c108ebded613dee5f7e6bd1252f4511b5f9a00c1f09aa1de700000000036351654637d26031018db9ad42e05ff133c991bc8c712f8d88727f2863b26b655d086083623c68030000000363ac00ffffffff0447cc1a050000000009ac65536a005352ac52ee50e5040000000000bc38c50300000000066a656a636a65fc0605020000000000e578707be76c3a1300", "ac526352ac6a51ac", 0, 1065294780, 1537743641, "695e79dbad2fe4478a6d5ff2afc572b6c0a69cb73046cc05bb5e2edac386c08b"], + ["030000807082c403039c7663105e6160b37b98cc7909ed2997cc2591f568efc58b57971235fe657ff203000000086a6a6353656a5152ffffffffc055631b0b2f761169d9071534a8fc834aacd2388f07b2a40bd18692dc1cbae403000000046a000053ffffffff19d5768103d50fcfefe9970b2290f3ce32e78dd76b30c05c7a0615578ee7bf8802000000070051636565ac65ffffffff01839bc0030000000007656a006353ac53c59909e600000000029b7a61040000000000000000000000002fb4d7c09efe40c2e8c988bdb7cbfcee26918d74db2bbacb53d398f48dff9316182e2ba18519e309750b57bbe70870d2d605d932db1738be8395d2e58408bee918e37eccaa6d88426ef467c6ccc4e86d188f936361c663e120c64df16a27c211000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009ef6676a11a04dbff2a3f185dd23c1a506be85ea546ea412f53d585c17293536a914b609c4e841271981519c310cac702bf8a2c666e1247f40c8f9eb6a76cf730820c657286d56b6617b1e0edbcf3f63794d1299d7055a74decd36d7f02d1b807da74d83d03c0c7216a6c80764b20eb530c5d4ee1d6773751e90bf447d68efea022646ea2bc1a4ceedc7544ebb1d3c9a9d84ec1360122bd28a9f02b15eb3e188250317b14d3f12f7d5296e659340ae5983808e648fafae9fd03aba52996c9de9da560a071f1e9ccef4717dee8aec047453ddbdac851e9b1ac84029612e6a015b29576271858c5b94d52abd0d0f04e4c636ebdc0c22a753edbd8a757db06838518ce48e0216cee7f386cff5279d506f0cd4c22c5446fcef062b29b74e8c6639ffb7191912031a198aeea491f1004c69cedfc06fcb2becdffb2240e4ef8000a8862ccec76d3e032034b690e3f09a91e581ee8b9e47ca777ea1d669e90fd78aa40c78ab03218b6c0228d78f9f38f5f13646740c4ab0793008d8d6e0d4ed800124eac7a66ad7acd22d031e13975a6d345e1d624e327bdf81828d59cbe7d0464963362195d52bef5fdbeac27b524d2173f184df12721abd4eba03911a9e5ab6d246a7f7cb03b39db2059f5a00c80853c826892390bd7d17bed9143acb3a726a803f0b5db9c03f92dc1908998a47e5eda4822ff3bb3e5272b7a67deae3feec1bb9f08798a28ff6a74a7bcec7033b082b52b0542fdeb4f0343803abb7c1582b248ae71243a75bcf54b7df8b1ebdf37f32a75413e6c9618550d5c10d029d983215f2d0842dd8a1f8dfa0eca2e4745cb3d42f954653195b72b430f253e53f326f9c1c1a6fe2cb193410779c0ef2abd3bec9142cc4c85cabed74fef6e3c474cd82913e44b2f8425b116fdb717ecdcfd8be2cf9cd30c4c35e36c965de95326194b49b8013b55f5cf894ccdd1ee87c8e1c510e00b45acba7df9d442624d488945508e294d21934995079dc09c3d6562c3de4fa2f39cc50700d13389fda0091a57b18eb3a5e1b48e27d3a2b5369eb1f789b24472edb773e31033bc186a437945b08249f11bb98882555584561fdc95cdbfb1be28d3b7aac8535f3a37149e695a00d25f270d84ac6b757cb711d19cfd72cc73d616112ed5cb661e50bc4d1fd3e0726c3bac3442415250709f478d083d0e28ef247fc93756fcb3313b7ad4ffd368a0c88f8a8beda90349de6b3ddf9c9cf830a9ed84efd71fd009bf6910a1c7bb9f5b6485475bb5a3c5dec3f8e8a60a106adb459f5fc4b9ef1d557858603bbc45bb0859539f86922b328c8967cc0914c33264c9c412324b14b20a65ad4ac759050eb91c9c8f27ee594155ce40ffcd5eaed020258b45e8dabdc28d8db776c2c37f0c2e2fff9bcfa8f7898dd1093623f3390a1f7e3307c53c0490d00f621dfd31a7e9ab7c5d41f3c7fb93bea2dc1a8d9196c53fe9278dab7e8bec47f6bdc4a26a322d66fae7d4d1400f3b00b58e5ec299f065c84bcd3e649946fe9290e5eafa828b628b7728fe18ca7f5973a5f8aa5964b075e15093d29ef2b894d9cf20a53b37c5ea4873a74fc3c68342013f821baf4c7ac1c4009786c29763609dda056439ac875611e395a2b64c3351a42820e66772a61f3c12d8d923221fd87e20662ef07bba7f37619b61d2acd0137ba408914d7ed43296690492c9dec01897d84f8e52001fd457ae5aeb317e8e15dde42d55ad192345a89d1a9bc17ec700f32d99ec6a6b5794c08b7594c51a78ffca551c29922190179180d1241bd7930d381a0790d472c2cceefe359b3f15ce161cbad2bd4a669c864b40297686a76c36601dc026e96ffd4d180fc3eaceafc591676e82cc36c8e303cef0a53afd4fe9080ec65d5d07a1afcd496a07be1847af25550c86a52b7a63a7dccb34d04be0dcb635c929ef1f3a2b4f96e488de4d5e3dfe42863d0d23f863805634699062b7f82b26f80776a9e4e26c1ab96b914e641bba182b56214b721592773bc8dab4cd787d343094b2e3422de60809c3498d573697c3aeb446cb312296f7782a2baef54641355a911d4b04ebb3ad2343dc2f7e34001a291239b19a2f68f10a40cf2b26279dc71a198558e5b85c95918008458449c2d6e5818d28367ea94a47aa1e826b62d1a688bbea189f3b49227e9535eb8739b4de6ec03126e2e384bd4c520807746bb02312b8a037d19f230a6e55fe9a5b5ad2dfbb8b0ba8ddd1ee0541b8544edde678601b3328d3df959e320e42d5268e0fddc5a4a2732bf24d8d45faae0cab760d7903a8e4f0431fd8cda000000000000000020b9dd0500000000954e781a68323811d485a54b720b8812e5fb4c8cc3602b21d0ac75237e19c5f7bbf665d9909fd8e37f75de5f9ff33e787eb62f0d2c3d75ce1d05288d10d6f2aef2173f2bdac4cdd94f73b193dbd0108f3bfad9e69612c51fcc83b12be67775ea00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0e9a7a17c566207044c50e4e761c0a21f45cf2ce3b007334ce11a6a7e42d8a491045b1b789c5af0ca3b9126fe678b6cbe6038c87b0915d42ae8ce26d92a57d936fdac06d728d1b73f5db8218ff44db1b6d51717b801ee98f895da44a5f159d0d18183e78b8581ecce2a4d18407dc1c00b443d4dd6333f767aad591e6fde9d72020bb3a5bc2f44ff759fb07fd9bc0c80428c0dc665d2e4073428c0b99ddd2852ee02069556267235e98ad4bf7e752f753470ed1f7bf521e39c7e2e80a4d3abacf13e0a02e0a641da467a0c52c3823b5644373ceff6a2ca8d3a02e86c6c807717f894b820fa13e75933f7acc0cc3d5e1ad962e7bdcb435593fa0a009ac404b4800cc1590219de10c27a2556fb9405bfe355839772afe466a209b54ea4c4dd57a3a9dbda87021146c55f03d4d2fb129d2f0a1eedc6e602dd24112b08bcc07a018eed148874320307eaa7052bae976055fe1514c4eb17b67788b96e2bcd6c79966914f03ce52ce20220ad845fac8a7181439cefaa206c117468888d3d8ec2883a028ca3cb84cd5e4403124772a5ee78f52c37710b687aabf586f3713b4c89fede5d74242a23ebec986f9ea26ab9b07b570a7ceca13a0ed356290ed95ca0f6e3dc939bca926eca5750b7bc24e9c0351d2581d893f034ebe9cddee31cbc902f15c0cfe13a81a61a34661a48da3befce2e9b3009409a718b00c6ac21fc285e508b00f23ebc9b9d641573719d5cf03978b2135a01cdc4d305b404a58518a3bec21840388d1eae24cd65b0fa2ab745af57b42f94d1ef784ea01d6df5a4cb10c3deaf59499f45b71f6c875568c78df98aa19f1ec61995855f43750c1f9ed0f1fcae2581e1859c7ad766bbe816b0bd07db38e40869ad7d32076c8e2ea8dc5974d0a329cf3ab88a01d26fc7e508e331aed3116ee3dae1cfcb6601b6f028c41afd1867bb9e35e564b97a71360c61adb769dc4fad2db05f670fd88cadcd7b3229e29ecf5fccc1affb6584d22b022ffa6637eca71d2a8e27ae45f05d49159ed2a0d1cefc7f40b179bbfda19d5f421ac69d2e66b335e1a3014b21e480305c12ca0aa40f4b1540e33541d2cefe1ac2a900af5c58302b3e5b98118c9ea1286e9beaa83ce51edbebb0b89b17170972f794a4214648f08e61d05f868517039a11aad7219c50ab1e382cc5cb7808347dd43400ddd0471b48112f842f119056972523c7b2fc3cae79962684e67c5b78726420f3fb27412fa4819ba492e13e361a5a0cfb87d9514105df678d0cad15733b89d4d0487da86c1874f2daffaeb223aaea94f87dfc111003063c6d5449f7c2a603132d6fc67658082a2f411210c8d81f0a6a30cd77e529ee5c0a7049dfc17e99f4acd5801678c587467a99661077c8b91e683ec9d6f2c95c0a12c3b03f6046250f5445e60d2aca537958ce59423a0db9d132b4c6268f357656501567ba8d07cfd9a075fe766dde83667a93c8eab36dbbe919f3fec0419db327ff2157fa0ca34375db91720407052900c93bd4405129ddf3e7a06f96ccb69ff3021c925f05a069a043aeac26c7dd808107a625f3d3c7fd117e623f94657c782c56f25b20e1220f81660aa61fcc7e4d474631085743dd2baff5e760948d16f25418c03fd61c7450f6225b9f9824b9a85526953d4606b3483fe2307d23ca8b9dabfdd0e08b3eb2111c8be40b6d8dfdc571b61a86a220f35f20dbaee3346edf497eb51ef9fe7161ebd832f2a9c9d9e77ea2bcd97c531b014be0cadb9ec1d43d206597f43e446b860e2853fad7efe7db0334c23421ef5109523de0cc0f9dceaa9cf397b669640de1eeb97ee15ada53c140cb6ddfba4be834c16f82126310f6e82324e6c81a948c063787a23b950cd80b5b0ca6e8bafd9db2f826a93e805bdb1d09ed36d9787502a178120baa4ab214d74128474514ecb146c8e97cb2dfdb36ede98a26a1855b6b1a03dc20e6a3ec7c267f682d6e941623e11c427e656e2a30bc6a74f1909396a8460a0b7976846305b6a54760f32d1747c82f0c658eded9222afce5a0c4f25f55d19735860d957dd07493e3caf198b4215ff770684aa15ca2b65a717c041092378e359412eb00081c84625e6eabaa44f564f406c0a113377837466c60f0e531f555ebfef161b86f9cf7e013d324e4cf748a9fcdc2d6b33da5c9b81bce8559f674b05472e8b421b63a78117c1d22e00c16f30536b1f3711df0bbeaa3774e3954d1827c9ac6fb74181e8e4e22fa0902147e3cd2aaf2ef448e391eb1bfb5ceee8ba98bce36b19b44fa9536c1973f6fff6c379aa45131d5e0e9c8dae15a0e0b841577a10dcf12f6710408e520bb8e13829dcfcd73431fbf844ec221c20d750192352811a6b71bad3fa61d3a1f53e1e5d7bdc16a8e07474e733628108dc83f94c658ad6fa5a96b84a38dc2c84c8024243f2bf7bc4cd1faa400", "6a63516a6352", 1, 985379662, 1537743641, "440b9425d2f55e4ff9098eca9a165aa76ee2e590cc3235a9d7622000c182643f"], + ["030000807082c40302c4b22d9d7bfcc7e34336128175623140cf19a6936dc01b1fea3031c365814dc4030000000352ac63ffffffff8e0355059090b7af5c0c1a29636608487a8b7935b3d302a6e9d6e186031040ff020000000700005151526353ffffffff015df9d6010000000002636a0000000058ee9165020000000000000000e0f64802000000002f1f0db9189b9d7c746115a9485979df17d59c579b93389a5d7083c6be809d4495c447bb76951ca07cbb5e07698802035267af6a29e1646b3534acdb7446aa40e9c049f36e7e42336ae77597cfb70cfdf393e70feaad474cc7fb33325101e397000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006aae08a2e5bb2f5c2e9ed651c492b254db674ad1c9522a818f2b0ba8d1b7671083c1e5ac003c20f6c72c23c96899360f175a911da7bb3e60b1ec62c4ba8c860616b82d8affa9a195ecd52decd08994fdf36ee9c6d57f3ca57d82ae3fd5b8027017d859dc6758a6077bbe8f9e65a32b45926ff21428beaeed876c02c13882218902178f82ac3134509fd230c98685843aa931068acba5a05e51bfe06c2442a08c4c02143a4ac49bad9aa8113245440c9b83e3cdf29f5ffd7ea9b6086465ca5fef6e170b00e76d30f76ee6b69a22ca9a0e81c9d26486f52d2bd7a0d7ba1da270f9b53d40e62bcd323b1ecf42cab5fa45dcc883d6c5a846eaf7e20fbbbbac1648a2ba283703260dd6277bbf11c92fa8be789d262c6c2a0a368acb42735e7b1bf82a6eafdee703016acc39278f0c273b87feb873ef27658b28070e14f1803501b23d96dcd3c36c0223bcb696fbb45195ea4451074225353d37b1e20fd565d43ddbdc3d3763975b450227cc6a776d9d75e07500beb0e32afa5bf7d1f5b8cb962c594f8296c1ec01dbae031d6ed827584a05b8a36dead324898fdc574655fad16f1ef2e2248045460593596ebc50aaab033bd66ed164f2a9f66089c257fd0a6db70a98d08bd1cb621c9579bc7d82867f652e474b551eefefb389e276c6edaa815a614b9885a25a51c93ef5cb844a24075257019e498c8a332b76228add36c5d2a1b53bd8f6fe331ec25ce73336fa13f54c3b9925b4c557581547064e66e09957aba58fdca882479d1c7fb3a63fd8710fef0f631501755cc74ebf36ca4247d4ec5e6c2c6537b2b3e379ed7e6acb8752622a3f7ad4fc5fea104a6a0ff89846264dd58a517a3e99e519348a68f179711069ca8d6f20b8a672e7a7eedf56b598aa5887b377290dfe0b961385c5cb5749e9148434c8b90b2988fc8f71a2a4bcc9557d9a8d6d666052d6c9c4ac3361736bd3531269d808e5c37b9dd487d056ed496cf0fc4e383f10606278964f4f6c277102832522596d61773ed7418dd24bbaf09807a8ae10113ace9c32735aa48f4f6bfcd29ecda44a572b74a1a6bebb5e7f964d304de9645a7ffd4f0320e5c50e0077e8b34bd6df0c13a3394ad170547661af4d9af5b4655d5d5a056ead3f9babb826ea8b4d8f3ece0cd53c1314bfe5ed085e90793f41274acbf6955259758b5a53ed4a6a300f5088656af5d7197b039dfc08d4aebbac7a4aaba5e2cd675764d98df4efcfef6a1d67e519e166bbf738c8d9f1a060859a292ecc95edcca7e014e200e752fd0a424158b6f4fa8a1a7bd94e1868aafd01381d35753693961f6113bf633c7c710278516dd0eae0eafb0a95537113f4d8e256192f53b1f78963c2f7edda8c6761c54ddd5dc0c0cf96c226331ae7d77112486a572654145ec3afdc7f3c18729f6a3ec452f19247cc7a519b47739829a105d04de5220a784838214dc56bd2c2a15081d72ac946c23e2fb1caa7d2682dba3c09e9389968679c36c091ed2b852151d61f2da0dc5727efd15dcd8db61346fc53b6cb034934069b8d4ed6c8849346a5cdd1334f0d92aa576546b90919829806fc3317f4b0131eb0c0ae8facbbeaf7d8a12be367b04925d775d4259fe07581b2579f63b4ab07201c924bb8e1d90a2ccb4be31a058d8c4e6a8cc47204bd19e8d6d7c79b38ae8935e62b6d68d7e97c5a324f4770f0453f30b281983cbf7dcd8ed4b432630a0e17f7fa051d5b05bc33ffb02a255355b96159e6349611aa5baf89f8563b68d6725fc8522ed07a449ec6be7d1672eaaaf309fe0e21b0fdb80882a993e6b6de5b00d13e97df1535dc9b54a491d183eabe45a4dd2cb1ed3e1cea05522902d257a413b9f1a98522f16a569fee7ae9e79a10643f0d927b07dc197a446a9a79e09fd196d5c755fbe9cc7ff6835d25b4611292aba9134d891b065955db45b2a5c56d8f6ab95dfa4b5e953e6817e56ca36942b73ce8fb5fa96052f96c979ab9e16da72c3ead939d711078ca2a4c4340b459296efc7ce16fb16b3e1cf1e9d80f2678337a0e81ce8426c46804c62e5696e7f16877cb821cb4e9c3e0ad2de080c319676e4d9cdf93aa14643e77ce3fe713d08990e5b76ee9a721c347f51e4d39a533d2fc54e2918561477eaa6636ce8b9b9c9ffbff673edf77b80e1af8ddaff72ed271b5833e59d24d179be1ecf71caf4fc20b2702407906ce4c903a71b71e8d24522c0c67c37b735021f8b916e9009f82ccdcd7de4f312ef4fb099f89c6c1317349f974e58987c521957b76fd07f2fcd78ed44eae8cda1393267f05b8c015d94bf503000000000000000000000000a1a66bcfb406c816b2c3e96b208db973064c6c72bdced27bc8282a7fb8aee1af0989181152aa1f2bfe317677f0e5b749022eac39af56f29ddc9e6ab5e40d4ad01541e6945372537c4e2ecf3f5f675bd7de2703f46de56c0ac2cfdf5ed5303abe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d0ea75fe41b7e6fd5aba9d0859dc951c8c9759f37a8f3d618e926ac768761ea14d0afe8bdddf4e8295e08024e58d05a5137d0f46c440903bf766c54e79e1881738622a956342582eae13fdd1fff7dde4d9d6b08e0bf08002c75a051b32136402a7d2bb5d1670ed81e44c57a3c29860617c8453e2900e684bed4926ddc8e3e030306b56fdaff72b51938d557b155e14d3ef222be11f8aeb3cf3bc8435c9c3c71390222474a13b2953af3df445c12a1b2b2ae498b4bfdcbb25f4aaf8a35316250cc960a090f3cc2543eefb0976ae97da3b87786399d6b80cfdd3e6edc3128072c6888c16f6cf36366b90da85391cb6a8a7426483cf4928a013fd63dda320c75370f4108030f42083421e4185bb8631e93c758d58cb116d6fb8fe483924a2464ad0a1479d70228c7746739cbe497100ae3a22dd0ad1061b40a08307193c9009662aa4d05f4e5020edddca6533fb9b89c06555b02d4998c078e6eeba06eb0d78d4716c3869418e00211c60ef163ab542f3cb59637db3505b2112dce7b6b215c9a10729c2846a1d5a103019334aebb4bff1bc0d924f3b84eded8266b4d45e24f1419fe648d0d35f088518e950c818d9f2634bd831f58de95a0b1e1969878427601c79bf929be2c6cc57c71fa6127057c52166ed640b835610707e75dc3d0e193dd6907bc79cc3f3c30e825cc8b1bdae80ed4d5a67a3830cf455348198e924593a55b3807576730a868106ffdca51711eb40b3d6f7d2eb556e3b6803b2bf5cbbb4fa8d64d13e13b44905f217d35a34f65e90591e1b60bb3043bd8b44c33bc954462053e0c0d3b4f81bedaa6488a78850d9858319fb9e043bd8d3bbbcda1a448ae09d01762fd06db2303f02f6f9fdc77fa9da15bbc7e1cdf4decc66cdc6091fdbcf2559717cff7910ac3ac39734efd2ff2a1c22cb46652558ec45cc11632dcf3147c16aaef193ee6a31ba42fe1c8863560158c5786029b1e600976f70a9f9dc4e90023f204ce3afa68c8af6d6cd634cad0f30695322588e98ae92ebece09c071d42d0a667c8949c5591ab0f5c1381a98201885b21a627fa59a601751e52efb6aa9ab86026002f9e0f0346f322057bdde46e3568aa859af36a267508f40c950f3923e1f5abcae8be06ee86836a95fff156563c261a6cde6afc8caef424801ed53f654e2800634c08c87ff7d894762bffa2f770065adf4b9f69be5c0b569bdf6b9ccf41cf3828218e7878b1adff4da9f1536c61c0244fbf4d55c267dc54711d0b0334984dbde69424172b66735ed33901c0aae93063c28971b61fed25b99f492a10c95364bcc487d65b919430137de23ce0f5c4f4988a4be1a92216126811b3b88d37c5d2b2c0b765c9f6dcef1e75ea430413050b7d80a3de6bdde2b272ca580a9c254811ef3ecf5a63c2f713c2a499c77af988c87bab52eb4b5e8f463a62f1dcff07d70b34404ea42f5d6903c958300d1691e4168b0dc37e6dc4a6142c793804675a49aa9c8d817c5e72f6b49d2f8789b44cf375e6a99555301a05d48a6e01c9bfa9105d6737c3e8472c9c83666b66e709568e94a9516a6af22d37a183a74ebef840aa5f84f9b21d5559835c2e43d3128956a6906709f3578c163013e6174942872967d4fdfeba68cf3dc6445aad2f3fe56915e01ef108271e9a52953b31e51e32d7ae448d52258b4a362412e99e7a61b7d24710b2ac8eff8fdd150263f5f573cbf23d834aa4acd41e083e6d19639e2895ba0efdd8389e4d501fea5cf4f292dd4640cd23ea10205bc3cc7a364908271c084d7ff3b968d65e00b0215aa32268279c8c7947ff5b3ab876766148007e73871b1089b6797263bd507f35984f63f645301aa075ae6fb24f68e936aa6e622adf4eeb913362f20bb40850fa4da368d0b0d0fbc342aa7260542c3aac164acddd35ba58adc78606b86ac62af47390ccf72afff8256e19436a02971c99fe154e553176611f691cc485fd7ba392adadfec693325f3036c78d1a7713d4f35aefbb76adc4eabfc3eae4441aa4afa80579050749076b9cbc1f3b3045111c6c427a5da8e641fe7b12c45417c401c137db301ce5e4daa1d1e86ab32c280e86f3f76b972a1dcc85c7fb436b629f540b6f94728e1c5124a61e18a152a18b2077ccbde4b339672c98f7ebc2f04099691babb8822d35fe199c7c0c86e68bad55ed9b3e1cfefdb0b4bd42222d54f0c88a8606a4eb55011f584e65f5429e02631b056164df81944f426f7dff17c2dd63dedfbf21fde9ec121426976b7166822c2d9fd596dc9c2529630e5cf89c54f2112104653c2e08cccf8b13e50309b16f03973d36b3f71262ed33e89ed327694e67eb6e90be481397ab8e2cf50944cd37f0b43600e2148d28df1e732dfab8b7e69eae44c1998744591215c7c65846312ae535c0e7de6d96785342aaf005431fd01a132b79e3808", "636a52", 0, 1242965623, 1537743641, "81ceb9e293e6e50c6115468561e998d2d2099d2d8ea04db958338b7a6325935e"], + ["6b239674027cbc7881d5f39dc64bab67f999a51f21dd81bbf36db13fbc55baf9638438727a020000000263ac0ba4946a1c90fd2b0d21f729614248a0608028ff71407ce9bb6ad5945d109e8bde6c8ed601000000080053005363520052a7a9d6250432c6b50500000000016a0d25d2050000000006535351636a6a4c87be04000000000463005252963b240000000000026a53e82519f40200000000000000008be1a30500000000872e966ff2028ce2202a99859bb77b6b84862850baf046eb082575dbb9592804809c9a71a26bba6f5bf13872c6d73056f999e7004db11e1443f536676db04c24da6395e3fa9174d2f98ed6e29fa9e1a1de23b6acabeed67aaa16e87eabc2671100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c2ba3c1939b0afc86b5f3b1e91ca8d5994219ecdf04b4ec54f3876bafddbb42ed1788fbeb713e5faea9b57a131a1ce3284b381fcb2ae67cab9a03dbfe981d4b240793e3428b1d269fa02b427c542de79b25f6ff503e1612fe03cdd2806156574e3f5a638daf19f2fe2f2115f979124da5b8895d4fbce561ffdce56eecc9b794f0300d4071aa607a9c020db7b12502054b8fe218a8ab8c9ebc07380b9885d12eb5f02015663d9aa204698acf725a2e90c0b54821bc65261f38414f2be46692d83eba30b00905b5b5c48aaef9709751fcc05a8754d79f28c2e347284de93c612d4c12c2141963db44ce7828dc3ecb57435c12d21ce20c3e6c53b0ff4955ad707c0816074031b45fa8fcc1a8085a755be04f2472edffdf93179875647d7bcc075c2e24a7688030bc75bbbf136a261797dbc08bdb27a701705ca85ca12fb3c0d140e177951ff9703003ca76a93e18996c614b095178d2efbec96ab8ef20d0b221981c79f479e09c80208ac11b7c958dd2210e6e4634f8da701294a808c3239d79ff15e1a0bc5e5f9ab022833538f6dfeb732ca8cecee1936eb75e21a03c2f41c5e508cd79fc1b047404aa8df28538f148ce8b6889d45d677b0c4a707e326660f70fd88d7ba07b9a8f7f9fd331c4156d6b06d689a1879a88c4f4c4a8338d1805ad10cb6bb63c568b39582ddeebd198a71a20f1958d879c168472fa0c1eb6fe790162e5846ec652cca3325d8ba54a1d54652d1a34df7cf386e1bc6cd606e63645fa6cf41f1c74cc6793feb1b3976c3cbc20684233495291f1de18d1c3724dbfe5627694975c4c29e688823cb34382e7d1edd1becfcb396b1c15b203c08b44376a8927b0c0c638a33a5b2ee1f423439c07bbd4af019f31e81316858bf43174cda15237529f93e6db35dee36f67f1f5bc6848b23f58afd12d1dace5769663560863003db30b64c83addbbc87c02e889c6a013366a970dbd812c255f27df4f97b0855862a51753e3201983a46111c8e5054f02321856380b819173901acf24ffdd96e5c9bb31f7354264e045310558282b9a95043e100371a0fd879e3fb65eb11c1ee92b38e4b04773ffdb3395d89866229e69ff42192c8b982ebaa4ef1fed6234ccc6438f56606fe2d0fb04b40e6deaa58b79d2534e167db7d37be57410899dfee4eea26398ec87f937dd7d09d439a02168f60e1f15934ded2e846672c53cfe28de1e95d0214f1be0b6b79429dcc5200520f4b9bab2666d63d513ec639507daeabcace1fc917e669a377f5c237a07cc045d4e8eba8f7bfb769b47ec7ef20d00ab4f9d39556e439923f7d85a8ef62a6117a682149edef3daf666fca157c3e748b4a65cce3b068b23aec9dbe690f99b9bb6658d8ec4ad586cb280497ed9f2a6ba07204f75f99f3436a2a963939938e89e8d51f9748e85c37709f6b4d634ebdbe062d0c622af3f06ba8a53d9c851faf5530d2ce65682be2b4bdf2d5a6c2300712635bc8880dd4ec69972f007eac104024b726965407333718b8a6962eae0616e05f1d14d9610b59275432614d16bc10c57b4bf990b879805abf0581652a9f3a212057fbbf380e62ff242854dfa39db98bb155bd5d10cccdac69af84644771778aec98ae669a33dee6d282e6299b9a30d61688a8a863b045e3936e44f604ac6a29c845ba6bb2a301d9bb5cd9e821ef2d461dcc7571cb92abae882f960c6d56f48d35749e1e3bbb0c0bf9c0ca512ab70822709d9bf6138c9ae1fac364c12d004b3987ff55eff75bdaa9acb9b7cc0ee9affeb4125d579b8b49abfe23de8ecce52629e7b8c825e878ae10fb8a85c07c9e58c0c37626862822c0531323a10afe3e25cc8997eabc3101f36af178896d4a973b4fd757b64bf405e42fe61f0b5587fb15c753280f26ad6b833e82f2b9933dcbf1c3c9fe7f4e559d66d64029c0fddb3cb3a5d6e04b3c31a13d3a61cb3d61315eaeb2edbf64880d99fdce1b9dfecc9f422241aa109698033cf2922423fea9ad836d7a9aec11548bb51da7b593e1348e78aca7d7bc8c958f7b529efb2d63ff38b02fc04e79eb6fec00844d590387ca6e3ed5d5c4d58dd90bc22d9cff97da8563e03832dbe2c4fbcd1fecf17022ce38eb2704ab4fcf2c7b5409bd9486febb9e27150c5f451fd4c8c12887e1b3563dfedfb4d474985df51c2cd235f74f36a991e5cee148963c8e167a3dc5836c8a3e87f127c28ee5bd671551aeb8659392f3442e72b17c119385ad8f5fe636f821e71eb0f51c4e1b7d2579fed8d9c46cfcdb7a739dc3c3efe476a98fa7e1b2ac4ba50946d19cb33472000000000000000000000000005ff78a067a304153bad4ce7a0336e0506ad5cc80625927395434ec62204335ac96add6d5c752a1babf21a14a3ee1dc9dca67fd231187efea4e3871e90385f19119eaf2eab07e58d89607233e3b30bf7dc3993ab771fd596d6d231d05d9bb48a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000db9f674c153df22f18d9b58fa520cbd3c586fde2e7750c8eb06b3d5fa57bad7e7d39d7ba93b30c855e664c61d6759bf3e8253c6a79ea4d07bf10f51f4fb47e4790937b1858a9a324b4bf1230f942a244c112df554adf3c582eba0e2a4ab371ff9f5b9ca46d59e679acf934711dfdac51a0cc3dd8baab07ae7e819f182a3c02750317add8da1314b028a91242dbde64957efc4add8a44167e1d68524698d2188db00326720692ecbc862c92f48027aae113987a00e7855fef87926bdb95ed4b4642e60a061fd58cbbae927c823f7843027a37b4f7d18607ae160f2a5c45186faa5086e3f43ddac4634fbc375f995005d91c4f0412bc4d0a555d3590d6416f92251a6d6f03142e943cc89a491dac8f502abf31f442d9d68f3273709170f1bec2ed37c3fdf003054284b67207312a90b0cfe45dc1ccc85325399376d200a8a61db9d73d0b22d50305c7368fecbee4125064ae6fa5d316ac4e5037121646acdc8ef66b014705aeaa031e44ffa8c476c9f105eb0b4197ca6cd1684b01ae0bfea75c3f5de2e226055b0e0320afec1d0548aba2b34cdfd665ca437ff1646591690f56a41188ce2e965e202f521fadf629173b73997a790afff1eb64047bce569c93c1df77150590913d13cace388cc19d4932e22650ef863183cb2876b4cc801a9ad68c7499e8ad519f701c10d1041c0970425ccd4c3ea9f39b7da20eaf80a7bf14f7e6a1f381d4baf2078019b8a58efa4432396891f16dcabd6dac4fd9893c1bd2693fec00e2ccc5d8660678d40da61183b8ef448cccfae9f81df4e4c6b2b7ebfc51ed5fc8031685ee821d88dd74b4188f137c3d0b41571770934c6bc6611b871288c1256feedc465387f43dc85b38bc076200a6670ee94e8705e2f28b6315785dae3dc9e2b4e473ca5c59b5a7d72c946f0c6183a29c537425592f6e056cfd49b9d3ecac4d7ff40472c46576b9f22d563aaaf78496467e62bc0761af55bc55c6b5cc4bb4c8b8bd200b47ea1181ddbf3b73c24befda2c2b435ccf1802fee70f03741daf082d00f0a7bfa83e342fc39210ffb75055dfce09e6d8def3e4e8ec42892f1d389120719dd63885ece357f2ad2cff4d14f7386ff8851b1d7b0e2c0d17ac125dfb01a45a53a5e60823362a1ef97cdc5420b8755d0645f22fb2b42285b9bdd6a470a827132d89c6c6411fc3975022008ed3a4628b379fc8cc08573ca71469e980d84636718e9a914220962604a42ce0f87d49768252a271fbe553f8a7d3317bc014d9034a70575fced408743ea5e63ffb24788678770088f3e0f9e31d2d44179339db4a0e7cd5a6468f6a1cd46b9951cdd87536675a054cf3d37d8db6cadadb62cd036c614618d21998f0aea32bb5ab7c2fb59737da545c0bc25f89dbdd3537ba0527f039a5a0bee53fac3dbdf86e46566d65c7a60cad7a12b3ede0b2fb74e252604de8cc95ec836cc1def8c2121d6a9499a8ced21b3d9a078da2e3d71d281b06f15c6b7f136f2dbaa6ebe86dfa2e55af4161c97fcf47a0109b92b3a622b917722ad8341c5035b3e450eec9877782c2a82aff3a2976a85c34a4eef22d2e821bbb2ed3c0db701f309ff9104319e430200686f75d84a5bd40f6d63a8c2a93da098c135730f6abb8b6a0025f8aa608d9acb08312452a0e1b07746a495bdb1587bf377f8efb9b872ff1ffe1b072de1b9b76d4300760efe1543bb016fc20566afde5231d15390c5e2aa7e6f1fd7cae2b04f5870aecb0ab2c585019a646d39eedc8cd4c0bf87286757e104c55e5a1ad4dc698fedebe58bbb5899ffeb4f4251c3824b8dfc54e9faa5a65d58db43d2da2ce819b65508cf989a97fec99615a9e2d73d498af5dc3e8515c5982e94d7f16d7d95bd90c1a5886cfa92161e84e2fe87a3b4be6d2b52d29a4f15e6740f9529f997ea3bdf26a1a97812c4fa3e7e7131d1ce967fa7b4c131646d17c0ea46ba441353980462f63783a26c83b7cbd594124d066b1d6e699769da6f8dbb27b988c66b51edc7efe43252deb89a86cabddcfde08feb23eaac9f5ac0d97ca507d2f79c03a651e6c24b0ae44eb172dcef26877e2e88ccbdc333d913ddb355e9ace1ded33f30c5c56d3ba965ddd8f997bd7b2c784f51add3f4ccbf3131c8d42b8ee0f1a5b7d19b510d5810871bf9ccf0e94c10c90ea6cbd95b1fb34c3d5501e7e6e32c5a4ed6b75aa7d6893464bb05b39a1ed6afe3fcf411d383f9e186f7ddeaa3f4c96274eb7a68957db4c481f85d1a8e7f40dc072709c852e57ee1c1a8cb4929c270bb3e28d7a6c4a776e1a4ad53a66630fb9945f8f42dc42cc12528be8284a8cc315cfb2401810ae11cac09ab72c1d0dbfc87a74bb28f41007727c45a2126be1445658dd78589b9f5a6d23fdf1e7b2b57fc36532068ed9f7f802c5b354d3fd8b4493b1992891ebfb985748f16d8f63d2e91903", "6a00", 1, -871106393, 1537743641, "8c0fe6211f15c6ca908661b56b24a6da6ebe081199fa597b5a630fdd997afb4a"], + ["030000807082c403019ea1856f2bccc1f8954b97e0f4cc1918d451214988b172153ad966df831904c60200000001acffffffff0275063902000000000453535151bf50e50300000000090052ac5151655352536cf51c1f4d5daa4700", "51006aac", 0, -862178087, 0, "5e9e9af5d85e2217ed2af9b0fce56d4e6cc2bf4b7a1cbdfe81517a96f7b8cdb7"], + ["10ed837801072e77252099d6375322ece913552eb1820401350c90bbe00249dab61e7fc25e0000000000ffffffff01f006690100000000086a5151650052000000000000029bf95d01000000000000000000000000142d3fcfc7f157e83c225e4c45d9ebabd521412415e14373c2c5c461d03baef34f4c54ab2387fd4e83131b142f1dd247a7d68f05d54b49ba46028c1ba364d140adfdd1c8c320b40436baeb24a1c4c98d58fa0925be017d7178fd2f798c53d24b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae30b9f2d62e927f2667f64b75d0f75500e6b7b42326f71f91a6c04907707a2469618a4ff4f7e38a3dc8a886ac5ec7278f08a46f54bd04e63b7683943aa2819cd214418489a827be6e4de4c99a7579f903e6dcb326005e0abd446b6e80f171125d9c59be5193cb5bbfe936807d59ed3c0e2f09b98aedaca8f0103164dfad2b4f0301881d8ceb5979a5376b659230157437898bd8b550e3ba977f1c25086c3a72e3031d3d125a8b7653ba124061cc4889d964a2f134b8d018aa8a0959bb93605284360a01b3596e6c47bd47361ff86ecaa02b5c5987d8700de3ad48568ce407c1536ca324ba92e30ea6da6c38f4d9a1abce0a11ea84f8f6d5de8bda94e357a2d5c5d924021063850f5376d4b9efae50a00d1987e698d518b967ad499d74d0a707c0e0c9d50201449e160b0fcbb4867e9beac93a533bf94ae41158ec31b193598e3b006652740201c097e2c4dcef700437d44d2e4e45071e770a29978e2ceecd5157147f3b0b22021073fbca92e8f440d6b1afa643a41880e21e3c9fb71137df2f857464146aaf1c0328ba20adfa27fa9b7cd58f7d14078471989296679ac14f43a60d027f36e5096f3f50c24e2058af933709c04877747e3a11c68367895ab710f2196f4ba3de3334864a7581dc0478739811b4fd586efbabb53df82b6f843c1242f09cc3c1df4fa39a4d9e34a731a130b5f0e1f8046fb217a410481697afe37b53d4c5afcd165cb7401925b2bb502187333509252f0a6ea99da665832a3975d3824f3f817dd419b9bcd1b8f3b8a8fde2544ebabcaf20cba5a8c9ebfe6848c580da2d0f37e005607307e10bf0fd731a3bac726782e7aa4ad3956d5a37ea2bb8806a8309e212b0bc346cf56cae99b672bdda8e03eb3f5e53db63129ab9a95689ee946e8759105088c5acb6d3a3f39acd45a105b861475de6d22a66985b6438c49610343e48a2acf48b581f3bba82a381059c4e10e3a012265b980e15a22e944f075cc0e2fd76cbe53be05c35b0f1e56bee5d786e419832173f107b0bd4890e962583928950990761c1863febb50207c224214ae047561b30982e6b2b909ce5854d4a842d3c62fda0779cf491846a8118c56ed05a7fd421161cc3e74aab040a6b6241695b801b86ac5a31b6ab937a8c5c4ef00f97869ed6f4d3c1339aeebdb5a5e2b8aa1912652485e0bff148f711565398447f2120e2fcc6bb64dd69f87a6d0f1c44ccf6ba4703acc4df0ba701a2f3f727e7762aeec5d2b0ab7f4e1271cd98fbc69794df9178d666b113d94c56c4d788bdd324e04fddec3a94b864a542d14157b03dbe652af07acbea6476b53d2d16300c05a5d18d6cc345787262539917fc59943ffc5e364157555a2b9ef7953447cd389b2da1fb37423b8e70eb55bc99e0f7b5a8e6d4098cbf550767caf5a182033b10e4538c71878b70696a254805d4f4569876dfb9ff312e5d01455e5f14f5571b4b389bad84ed813dbb1bab8cfc8dcef48debb0fb8a01e7be281f0910a1064486aa68a34b2833111cfe5e01e08702f0962f5c0bdae55f481a2298f9184363875a6a7873ae7ea959915a9d6f42d105f3ada34538913123f050a30cfc77aa82a4175c1a2d89f6bc065bc4406aa238407b8186e6794282148679a90bff5015746046a1a88533c74b46a925912b6fc183dfdd7af04d596b6e6379f7e7bcb74a3db8842025b5b5547caeef6da2179b34c997c9ec86f3b02909aabbef3e7b16e580d6d3c26109213687cbb8d0f8531dbd6f40aeff5c14a5aeccca530714d6af9df10ad82ae03d91db7f36f0d0a3c5814ea71eee1accc3a5a5f5848a9645a41c9ac9b5f055e5186420734c602710a2f5c59dd251c9610a1d68704d82b8347fecfea04d1f9c619eda8b57922e2a1326f0b0ae4d5187a111a550f7ece5384e1d2a3605f7c2e1f0c4b91c9e185d58353df0d125a95eeb83f54f89dab3910f84bb1124a997eb727db6efa52c25fe746c828bf80464a3b74176cc9a6940ebed09e2fac807765d92d58c66cb8c8f0fb7eb5c0c056d548ffe608bd6ae28b27d4283de7900d29a5ad293606c28c7e3152e785c909dc11dd380ea858648a14166d34e57a60cba2d7fb21918803ab3a6a0ab569bb88a30c477f91fb08a3a2b18941fbe7c225413c0fbb10fcc713f4835469c0c330d0324ac77bdd326c2509d84dfa184a4def649ab387c90752d088d69aafff86a28b459c1d9dd38fb2846f3e7987bcf48c8e95e9f428d9521316e54a954a4363a1adc3970299713710a2588663101787a201264a767040e7f0a3e62969f13891f788d720500000000000000000000000013f417b2f577b8db2b67b9d016f6e1df64c11eb554f22ac1fe4b030f9345ee0f4f5c82fb2fca2080524532f6768bbc9816012863214c3c4d9994c973502cf920f23639e582a52a17a62770faaa3d7755b79abe131296d711ef017f2c21650c580000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005052837d5b996d731a8739191ed674a51c8341e0b2b14386800282f7365d88473652662f9e9f20e055e8a7cca65716ecaebb064fc0dabb8281a4364e533ec80228a490c6c7c9736feaa4dc88934eb517035136b72bf2a20abb5bdf3f11fc72477108a30ba465f95da3055adbd7536f3886ac5f09b50f9f9d3a1ec7857f77b8a032820d9a9867d8e87b5d4e9c7039c30e4a712239c81727d90aea10850a9db2612032becc40b65a2d3941a927e4845b3d1580efcb42d92f3205a05e34dee198a915c0b05dfb763319f27a9218ccb77e67480cab8d08ef8a2fb211ad9a153790aed8c94ae60c12563eeeaba8c17fc2e41f0de2b7c70371688f888d807396bc46f41c5d10215b20cdd23f1b1d407768e784d88bcc0c9f4361dc75ce896288b79115fca54f3031b68a5b80a0849772a607dfb6325fd9276466153d9618923916a393f1e97fbee0229bdaf8a660e45a373475aea4480e01168ff4ea7636b4275c5d302000e20b1b8020644822d05df6d8fac01d0f22f68f704666a006378c991237c0ca358f2e748080308a5019dfe26964aa93838c8cfe60d1097993d30f583c32529d2ad3ce61d78034fac24327d064a9b89d6f60f7e1d08a49efc1d89de0c883baf82ccc80188f5f47a6e3d662cfa4e192723d4b10e6140fecfb50e0b98f97f9abebd279c2cf10ff16bc917e40bae6bc9ab553465ae8827059b24601bc9a3b3e39da9991bbbb47cb14830d897401f859166c307580ea219f80ec848e605c5fd68c3e780f682a8e8842772d9f50c51869136f0f0cf475df035c8ceff7576933ae0088f8413e0f032b070080628088bf8d90e4f57173c3449f9c5c812bba4b5ae689e2f085d22689fcf3fa493f84adb623b064729b5a6176578bb0ddb1f5bce0637107a46264e554677c88799d76396eca4583629dfbfa134acc5076aac8e7fb29731705079229974d175fc0857ab173e1aa4dbe91925a2850ba84fc2b601f66aa2253a8004c1f267dc2bc9d58c07d5b4e0534e7a8dccbc15adc85f462ff34ec9178cef9d3b5b72585f6fb579cc556b8d61b4a90e1cf4c96c69fcf2806d95e4e33eeb204065ebf2a26e629501ef74f70cf964a73904c19f8a4ee892759311458a182a044d0261eba02dbc6ff99820d9f741eb2ab5ceb496f05130d95b93405dc8d4edeba622f6e8c9e55cc494455aa2dfe7dbb60f4094fd89de1b2a2fb269607e947f557cc8ef9a457e0cde19c33f075a3b27d492c22976be22c98bde45e1179fb494f11f72b97ed3bf96f21ef55830c62eff1654ef346167f7f3e34e8768bf91522808726d2ab0b31ee905f24ca1d9568ff34952409dbc9842a238378f4c8f6ad83bc10e1ae9112c15a5f25c24d1d8e734a4595179bd3593e57950995aa570dc8740dd42b16f82cb20e4472f15b593fd34d9b88d7634b3d0beebfb7b4dd0a0c33095c5d6a28d00a31dbae4497de8faab332c49aeb8c09b9bedfb87957ec15fa04e364f8b051c0c6f04ce0660db7a453d07b454fec4b6ee4acb981eea7d7cefe56b005358d53d85411121bb74aeab61796da4b65bb6678c303f9fd86d9b977887515ec614693a2110afd61ecfda80966f4ecc797de517c51b05bd334b28b04e2acf72a583c2bafe1292172fbbcfcc4e85c6836122d4e2e8453afb6e958d6c5cb3eea6a7b0184ba7adecb2f43004e989fa4aee43ca5addfaa051875ed61f52a0d36fc36dfe8d07aa5d21e0aa4b97d5e6740726ed7e5e84217c7ecd85f3709f5bc4b0e9405359250d6ab9639a4d921e17de37d6b863bddb4e24f8713099f49506653a8db4f1509a5d90388c518159451e87889744707d925220a57f5b9d879ac01d701c4e675a12732596b0ca8199eb874022aed2248ae9ef980784d8fa3d54d71e343b90b8fbcdaf80b031bff1af9562973fff2641d900420d9d79f948d19e62b0aa74d61928c15fdf76e5625fb6b06f9fe4ba57b72a4e49c85a25ee1f2b77e374c2230af3273ab75f710f8763fe464ca85cb8aeeaba12d0d957fcb11414b0fad6d7be92e8059fb7d785e88b7b72bc13ec54151bcfd6d59b87de6fe8ff40cf7d9fecd440491c31fe7e8ad0ce1af60c2c1a596085aac3e184d4edd7ad1da93ac503dd9580832a3666b50d80a8e2b59f089dcbb4f500475bf5373308c4f0e8262e6aff4318b76ed7ab612f4ee3538670c61ff228cf54a1df2a54acd137953e4b9a1e15309b288dfa15a2eb57dfb936d3d9414b9943e736f5b8bf8b4a4622f95189b2234f76b79711108c6d0aff1319a77f8e8a2599e97c11a3bd7360e2f05a072222dcf45886409a318c087b5cf7fc97333035f7909d46edc64bdd6f7ed8c35f6a18cef3c4e0d6ccc5fc51ccc0e68b8701757ba7486b6f18e47b9dbd5e78f2b4330d6c51c0c325be7e8ec1f21308d4c8a83ef79700db837335399afd04", "6a6a636363acac65", 0, 938823340, 0, "23bcafedf35e56f24cb2a742d6fecb509a2090c1e8b6eb30db1f20de7fd34edb"], + ["26380d7603d6934ed25248f177424fbd67e5075f7601a88be0add2c83554163b0a56cda2710100000002ac6affffffffd157ee44561d1368556a206b3020f8cc940b2a0485f464cb47eac95656663f610300000003536a65ecd586da2f0e935bd54967c7e11ab93dbec44a995a7a522ec8a377ef34614318aeb74712010000000963ac52525363ac53526eb5855e0242750c0200000000066a5365ac536aaecd0b020000000005ac636a00536962452903bac90a040000000000000000000000003644af77c16da9ad64f12222d829d62c318d841d8c64d9bfb531cf6594ba7bee515c7fb7feb93449ac2b0345c7c2f84f7d23048d4a8b670e0614bd6a6fcad6c713b0c9100d502adc98dd0fe9561cedb1bc34c824601d1c0cc3aabc73f384d0d9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005575b67904c9a3da0d0b74c91253480ef0c420f87be59f5359fa87408e451fa7780ad043da81c01e8880f432fb696f3225d7adb32284ec2a22fb0eecabca8112a056f05e9da9c7c15fe6d5757ab8e4039f4dbcbef0e106c8b40e9a4dcfed23ef863614413271b1ef8ac0e732b4fdca748312f49cd0109358f5fb0f7c41a678f2030efd57c86ec1d04db759684b73a0623d078d9c8893a99fdf0af5e4febcde335d020f998ef0ae852a11addc6d76b8ef4fe788014f9051ba9d187ed39df8ff32fa0d0a08bf764384d56be465839f83e4fba62c3bb770ce1bdd13e0da5337385e50ca3034f4e3e932aa37ac756ff963a08a3c7bc32100f39eecde3d71c164b251898ab2032a93787b841d672e5bf22cf0f9387291a839fde713e4a9daaa3dbbe9dec54940032bba8a5de1804a1a30d76e95a364c090a186c726f35f6c7e9daac304d07493570326e5164e50a5ea8e0c5af409764a86fb4c0a2c047fde3aa890571835ed73a1e2021efa58eb40c5e97f28c50e25edd6f8cb0bcc797111070f9e93fc499b88837519021bddce9b4c693f429792162fb4929df332e4da861eaafae863bb1b16e95597a9fcd7e1a6fd4d05fe76168725787392bd9b20e214054b6cc6e7bd6ffcf67f68ceffd46ad1c4ef251522f4f2bff486857aa784eeed44015a8efddffa2850a935c90e1219f3e3215a2ac8f372ff67d486420d6dc697a59b7b3d4bb758df87b1afed4d6146da20dae9b6bf59071c8941a9d64c6d77e349c1d44103bbec1b69e3da350d8371a7b3aa7aacd671ac5763d502b10e745f9c6a714b2917c97a45f98d55952b67379338cf3d283506f966c7ce4278bbc6b5a88bf13897c17ab2d399b3b5602c2cd84184ede1002bc3d77d788eaadd04e7226ef4da7902c9ebde63e44a8e36235889e196404a1f4d32c579ec43e53f86b4ed7f0fc649e3470b93805dbef7097ab278ceacd4e656ea04504265ef801fd8096dbf68066b997e7ef482f614d135407eac4d59689c438995d92440a3878f8e7dc1e399c484dc1d8fad1cf98a08c37be30c6f6cd4baf4b68682aef227bb364e7a9fc0e280f0d048e1112b4d4a2a7f57767a06cab49316452e24e0ac4b9502d1d1bf1322d8ca48fecc1bf615413ed74266a86470e53901385553470556adf5292f4d2224a0c0301a9b9d6cdee1f18df20730aee2275c3f055a8c02635500c7f9a11d7e8fdd90f17b1e24d9ecc8a4480043409b9a18a2a5eb78419c499d05e2ce8fb998cb17b2655b8892eb438c62a940bd60bea41cff4c235969bf581bec6f11700d726a19977679d6f001b3dbf8516a16080a60deffca2f8eaa901136679cf0b8e8f6b04ba4e6ee9fbad2303057462fac701a34aaf700aa325aca3b4e99e3f33d23dbdfb9ccefbd470300dc51475d20d0136a5f03a13348612309082deaf8542b98248171e1b701424bfeb8d59a9b0c55215aec70c503d338e2844d3be225d89294c9fdd315c9c59ff881a8450929eb8fedaade0e5aec2c80dce69216479df62ce49b8e18dad2c014d9ecbad2a91b986e365866771b5fad53eb8513b0f5cb57c8338d317c7863f3158cef034b18e14eddb397f7a60f2323cc6eee6c9a6dd5d91005a65e8fddf06c32c84c9cf1f05253564aa4abc9515c5ead4921e42d651b8bb5ed00bc4cd4bb39cb3b5e93bd2c5df25853d4c445d6d0631edf3965c6a8eac888a311bc8c6c2e05a66e8a4f6e5e577054706fef9da69712031aea7dcca218fea483131363a091a3ff55ee805b30a016e4b293a1821b88ecec8779990eb0194adfa8ef6bb472a1b94a0f2ee8679d70b8c60768670c507781035c816f024edeb8ae171ad7b4e7a04be3b81027699b79140bbe9e4cd4fb3ca2f4f724ac666823ff76c5276d349f577c614b1635a071ecebbf0194129785c992232b109d78365e879e7a88932672dde262c3138ad07136658af863152f7e8a0aaf91f09a3138085c88c6820f7e713253468a600cf3004ccc146a62322bad572c96fe33f56a22d59f068f0a16639387482376178f1b0b1e240799a2fe5e853b129ac720bab1e58862fb5880b31ac260c660894b443077aa3292ed91c83e3e45cba40f97799a4c81cbf8388f2bc3c16f89a5c76cd26f3ab9e617e34223b97b16f8f084730920f705bd3e50a18697c1bd7e9f28aead2fe739a8654ab8ccd452a8f84b2f81303fbe3167f6f74e9e78d2c2f3cfef1cbc729156597d1c05ae43c07aa8cab8b90a9760dd3d621a9f839b8a298d0d9b910af9879073ee5450a6e2515d3cbcbca23a3a4633801e0ca82a040000000000000000000000002e6643a26f7aa614df5b626e664795576e4d3d77d6a540f1efa7a430889e594cc16115946350f37305900d1aed2153452d6ca6c9e1c2959c17a2197739123af3a05847fb17a3fc1f1cab89cafe4259524f71014f7cf34b87815d991ec8688c8c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d9f533231d0065ce3b4cece870a1db6f3d72cbc7a96bd18898c4ea617a7ef5f020ae1ef170457b57dd1f46fc7d741e187af2d65e3ef1df5ced214fe87dde352c3bcb20f42993a667be157531a7efc276da11a9aba804db7c7e29bc8cde512c13c7e9f296af639c10ab363f0e99fd8781ad0e359e3bc88a7750dc59658a52ce55032d2364b463b187f09f4020aea6239132573b5eaecaed24c91494526cb51f3c420308d729d2b7d5d901d19fce7725829872ed0dbab4f45d3556308c02f4c7de6eca0b037dcde2b79ef6a70f123f656b2c923941f0b7b31849ba00a0fe5491e564507d8e2db008301785e6821549bc225bbeeb8afc80f1653cfcea0e4ae2df0fa421a70229e5eeca6308005fa54730e5c7dfbb00c52ab51fe465ca878ac9d5cb0c07daec0303c8b76223ed86b8531dcfa15cb26307b00d6dbcf8eb5c1cc430f3d436ec53b9021e0201164713c215f804aa1aea879a2c2f8f020c20f3eef118960b22c531cb9103126164e49ef57a5d75b653492661a294467c46dcbb6d5a07515bcf73071d1d0f030f6351cdf0805d8194b8c108cdbadce1606df97122b1bc5c4279bbd31219f1b10ce5446c9fdc64f5d6d564c6f889728bd8e7b580709fc81550052bafef353e58837df1ce47d595eab6376aa1ae85d5e78bfb98a7ac4d19e556bac31a0f3611a458d77eedc487ccc7a0ae3913d8a2cf669b587541e3eb797dc634b8304ee3a66265afa39687b9256743d233287cf1ec4cf5938d6fe15301b9ec150da0995f8a2aa8909e31643acd3963eb324c7a6402962cd3b658026d9de1e477505f3f5bbf63423b67c824a8d25d4152d64c3e4e1d3431338d7e7a99096e7e2639697de8bd1fccda9fcdfeda2be065683bd2901b0dccc1957474565af94a8a44766e0470239de14cff54906e24e9f5daec30f4407a22443b87b5fecce9b5954f1d645014a13f6600fe290c299c0478a38bf59b6244e5f2a79fcbc078146374e0a2f6d3fc88df2b612d0f62ef8efe5a0b234d84c885b73400765a61dc74f242b43f6c9f54db7b1ad36f1c1eebdccf4de2eba674cda0eb9daf92abb98582ebc3ec82a2825e0443d8b5dd8e5e58f68df71808410fc1f5516829bb3be27fdfcc0aadda2794a78bd38f3f2f01122925649d1db6bfe34495f7bc26d5fcbd110f403c7810dab5d0dcb5390823ed9e4c6b659a026c764d5b9885b6e2915c954ceec543fba7c01664fb0c77a81c806c927e8549cc5728c63c1dcade38ca0d35a322001410b9f1dbb3c9be8cb0e88f273ffbcd7f30f2680b313ee20938a952ce422d24d6329be5216d66f3f433e8630fc9ae3a231a9066757c7ce4c312e085b0cb2d712da3b3dd2fc80f65f26b26763cb3f826f9ba44ff9c5bc3d012ccfc129384023d9d7d8987eac4bee91496d163c54ae12d2d6ed28ce6520a8afc49016afe963c58830805cd1aea8d552ca6f010cd5873e8ec1852374c51b5f193af115f178ad5c3d06200d62e2a58a2ad0c25f595bba3273781b28a9b1cbec07232061b9566baf1af822bdbe8745659f53dc706b47c2d05e155e0c44c30200988a85e07e04ac90d76d1ec404349cfeac37b7ff6b9d9687546194a8c74001f9294575d41136ae0b5a54f09b3eab19d1a74677ce93b2a1c3dcb5106481477f6099de204b9c80fbef7f2e875098e128479ed6ea2c3556cbe61ecad5ff420e0078f9b0e51448d5a9e430b0e3ffef66b769cd7cf2b39de0c9e3daca93534042fe17ea3f6cd88e737b8927bb94e0c3efd05681d335c234ea85f59448ce2d72de47d79a8306f307571bdb0d23a735f7a0c987bab805c30f80b484444379d60a16b3311fbaad12080f6b381e9a5aadfef6e51a4194f8625c379668c82a09eb692d5c1ccb6290a6885565a0d997f59826595501ffc1462e83256b4d0baa614ab10264e643de75b2835f2b7dd089d7b3755eb69bfe4779cfdd911b9f2fb3c4825e3e041952c662335dcfd267f5e37c33055338dd729f6704d5a20cb3c5f97d5efb6d44ed273c6a8ae4ce84f4c76484722683390f42169fb4d48a8aed177b9655adaf590bb0e3f8c04079fa0260f3a65475a8074a8f83dc1f45bbba05de89375a3191425c7db4bf1c61ccd02e3fe976d993bda09948de98dbbd9042c9e2d1f2a2c2f08c929abb54135378016902e75be40aa0bd1a742a6d7a1876a93133832453e3146077970893696e45cbf638b09ba5b8fd49af3ac08c208f06c0bbe4d3791e2f3f43fc207f5ba417f6bf7b986dda6930383d533a18d00356346878949ca3e8de432c3518ff400000000000000005a8e6e0000000000f10dff52a01d0f77a1c0dc61abcb5bb325cd6c39ab24782747be042dd7567316e35e8b36fa3e872b8142bb216ae894a6a21b6bf61225e816fb8f0c2266353ebaef5f965541fbe9041094f972365cf5f9b5e0fa13d3642f800e24c5364eb47ad1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005952982f625b3896b86ffd64e7ccf38ee8a984052e1ce2626fde0cd018b0fdeae7c92515b8af1fd8ab3722500279f21c646b252eff8e9d80e78d21af42830009793f127c86e28809eedf52b23c16a2edcc13cffc986b563df31472b02459027f8d04b24f3bfe8751d1bcd83c97d96c09bedb8f4fe6c31ea3b53b110d985210b503141e0dc9d314b9f0cec49f3904cde181e134fd9476fffcfa3a37f1ef4cff28d70320df86704db89153a1a4c609df0c0d60c7c7848d1d40351058221517e355a2b60b05a8133a7245ce92d0d4afba28954dc267a79db861f2926304e47532050ac9fca262758480cdddda4dc9685a174f5897ee474fbb7d56aa3c3da7b756c3986dcf02037330f51cc6403a51d936cb460c0134fbf3fc819f74f039b92cf4af9dcd91fa0209e4b72c42b1d4f653c28fd7d16b515ad9986893d1530dcd481749043631dc8e0306efb6c2281594a48bf22bddbd9c2a9d74c619679474bdb66a0563449594e353032d2a6ee681354a36fc0b0e1172372001c798d3f7a35da3b8875eff4eec7859e70316e24d2ebe08c2d87038cfee7605cd55ac0bb8ca0cdbaae592be829c8df1799699a42a80fce806f0027717509c2a1f6dbf6fb449b249dde7f6a172fef94a7a176e08d3c7a784f6fc1f9f46ed5859cd49483603098816b894265b61f06fd8e866fe097bfebd5824c398e9bb42456ac103ba90b25d68df75e91ddd9c6229ed292fa84a4d528a866f29e1a98b64eef03e0cefe0b9249de6748b5e340b3faae8e99ac240d59ac0b39c0aa652699703e3ede2b6633aa623b82f040a9db040aaac42f74bba7c66bbd3e262be0bb51c603fdcbe9135aa0bac50cdce27ae02c12d34825d1d487b7ec84a64d3f1d395a24227ba69e356d689db7e70270cf2b90ee2eb10decf2298d92cb3b4dca781702b15870fdbd9b42218e7d54d6ad489b2461d5af1a3bacbe975022e58febb631586876d115f61f2e52dcf9c108860fc4d5911227e450f7f6909253262866817b6e31ca5e27c8e16a8669848604e0fc4723ce7f83b49e9470f93d2a494d32c29400a75b763ee88c765facb69a233b101d9885aec10ae187457152fcdfa1a46e7e5a76a1cf63397bdc06f11531f5b0a8ae54aa6344aba0981a363495bc954fd4293de710d43dfe118c6176ed08ba1fa0cc5c79719052e96cf1e01123ace0e33a51ebeafc82041d34367534a4e1d695a5b741102d9fde86658946ae281639a2158b1f0002b449e82bb53be2e8529b6bb3308a7285d66d026e81d421cfb3fbded4cb60070d7147072ee1a3148ce75350a57b809d691313c8bdcfcda3e5bdeaa469b896cc64f86116a5a8ce5c385ca66b6061825438f8d78b62d71feca1246a130ac5368b92d254303976555de35908ef351cf6359ee955e0497e303dcd0a8e35586cf31022197b9f6e73ab3f1b06b8948885c7f7a2a0c934d62bfb4be551f4c5c25b6d5c9c924eb8d7e83b315d06367138a141f36f7fb7814bedb8c10f364727d00228f5abd7f981f58ca9d2475651a0b3f4539309421da73e9b1021003a17da8b0394129b99cad4d8a742e453cd3c0d76e88863f401f58e7da140952223054c8d064c468fc7f329cd1822f22a833400c91094b64c8aaa0de5075296f6ea148b00f1106ed41a6eb2b20fe14b6ab6ad01a669dd160c40d94b6b6f98c16aa5d4fea233081547549ab2fc9af1b98edb4c625b3a94284b5343d5fdab83baff9d1f9fd8f2d44bb7134fdb2ef90892ba55173316abe433ce5378d42a41a8b44d81f06a38cc9c141cd94509c941f21ceb40b9eb0613755a753f124632d3839a719ff8c39cc4ee2dbf275185b1ac9ec948f89748009c17c408b51164e1720ba0e6f6e724b8857f12f07616a26b798f507b4402630413dc5e832f9dcaf0efd7feb16664ce48bc5494bea74333efd1613655f54698a8f0b103a86a602b00fcb4c93271dc40ec1d277239722f2dd65ee5dc856042d6cbd98beef15d356cd45bca5a5961638410c33f4699eb0ca9e2ee5bf684fde5130e47dd07cc0f063492bd4ac817799f89778867fa0d4cd5ff5fa226ef43476c7a14ed8fa71f4fd56ce5cca932039cb09e2542f381b61b3e2004c740222d3e1aa303eeffb8f99c286d4aea97c89583991cb44b3f8cd093f24dcb3c86291a5cdc36b64d58fc9d967750741751c83d43d06a69a08382728096612e695104fb21acc2764496419becb71e657e4025f34c2764487903d7a192265931512ad5a9d24e099490fd81649d5f50b613a253e3b8cef6a402666d0deb7cca1f14bd7a2acaa6a174a60ec65d24a192ae45fbdd871aad7f94cbee67f6f31d7797d24a514271962b99bbf38662665c21294d049004b257744a7d55561b18f01adb8128d3b6b73e70e7e9ef5bfe8791b44e60b7a2e381e8da9d73917cb79f440a501", "526a5165515165516a", 0, -553338102, 1537743641, "bef54bded6f03298609f4e0543c4afe02db4da8fd9d25021244b7bcbd0e7cab6"], + ["030000807082c403047cc43954f269b23659f8ec93d5b715a5b6fc2ed317de97ea3c1767c160497b3d030000000851656365656a6363ffffffff378b019f78117e41906ca2970ee279e7a2b9eea411588693255a0142c8b8465b0300000005ac526a526af1a65586ee921fcbc222bdd7cf7fbfcfd294f624ff36f8d399da4bbbb45c968d7efc41a70000000008005200006a53655139b781da042f859f859a2207699b98ba5d3bab50d90328af173b12d93ef39dbd1e98efc80300000000513ab67c04cf675a0200000000040065515164d7fe010000000002526557bfb5050000000000a6bda60200000000016500000000ec6280e300", "5353655163ac0052", 0, 609231033, 1537743641, "5162526130c6c82732cc9f9608a260ca40ed472ddf910a6d5f17d84fde5b0090"], + ["05ebdc430244ae630a5c66466c8ddd0f327acc5bb108bd30c8f86205b11cef44ca050613e7030000000800525100006a0051ffffffff2ecaf5ccb515bb96dbdc2d4a61739a9910e260f5e4342d12a3244366be74942a0000000006ac6a6351ac6a8ca8a0c60305d7ab04000000000563636352630b0b56030000000003ac65527d691b020000000008636a63656a525351000000000200000000000000005cf39403000000003e171e800d39fd35877a8c2e2b0f4c09341d7c88f171980c8511de01543b158a629e9624ea6d0bebd8c518e654da424001fbd25d462793954ad80584f7faa109a1cf30d5f17a9b555b2763103b070150cffbe705f9c150611d261d08dd73b09d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d046fd6a6b48435f762d1cef6ca31aaa1e49b7cefdd47a222ef8020c33d002ce960e5cb9bf43f9ab77b8c9d0231978fed58b1e213350ecc41c4d60ef4278149d936410e6e2ee4ce202783ead5c0e610edd9d6390b0d5d27956be560e231b3083d43e388366bb41899ef0c5fdb552468f08928549db66e733559b58df42eae730215d98639a41d5f44a1b34607b8043982649fcf2a3f1d368a9ee4cde0ee3b5192020623249dbf9e1aa38eb34a89ed164f64be22ee92c13fbd2703fb755efdb48e0d0b00c20ee345247b3e0a6f62e47837ae727ada6699487657525abcb47e30150bec8a5bbe64e898e06f39742597de830126254d770c87d83a94c9082b227083c5d2030a11f0dbc68cbd500fb5f19d0bdc7bfad983ae20587d5e2e5897f4768296a3580228be4ca536100a40ae4813e655430fe03c37ef2236a34761fb1a4e3806da09c40227a579c8ee003f3c865b1fb4a91fec91efe2bd7b61463dcd4d0d464b71ed250e02040264d4a14c063875aac39aa1d533d055244f901fb62d0250206f06eb7665d8030fa4ec16b5e8893f65bb16f01417caeec73ef60826bcf4ed7b842f417aa4252b476034f23617dc80cdce4e06e06d1ef832a49d3c1e34880c2880e144620f844e7a516491a7cfa4fb90da1d219f22d7e8c7ccaf5494e2d45f3ddf5e440de0656ac4ab76efe755be032e1d0c96b13848167e2ae0456235d139645b23a73a6c5e66bca732c41e3e8965c6d03611a4d627b37b53a05f217209eaa8a8f5ceb0d6d66f8b7d2690cd952533fc1e55f5acaba0f6a31927a00e9449986523f19d527c9540cb7995c2db6361ffaa6545f11c8ddfb12a987aa5e60bd7103c3e6e62480f41be2d1d6c4c1464e14a4120683993c9177fc4adc6dd385e4b41b0342de8f19239aa6801002be2479a20238a91623c14b57007754fcc4a359f489bacc4e3066a4ef1248fd367b0e25dbeea0af85e2c257a1541dd53fde4d3bc97cd5b44e15c5e4c06d0a095d5731aa42db9d83d39539fcea8831f5c5ceb84f064dcf89b02e1dd455a7e51cde7b470682921f5e5378724c712c55edc916ad13725398a057190e72ac8800b53cba465caa2b22a0263d4b055364a177a42621ae2e88aa1c3f3f8c655669e31d16e9cd275034420b259c80c73a682fe65292149727cad5e64f73c27ef9851b830b458493c02be4ca81e1006d18e7340b485e0a9f741226a27a350f79052134e0edfae3119f94516a31b79faf73e800927a4a1301353c6e7ec1a271ed435540a9f57776cdae92996f7e739a46856a9c71f143c97b43106eddd7e1b401b9e1e5f4a6c2aaa84cbd92f9ab62c2f3751ca00fe5e4ab6e61cf23a1c1d8366e9d145686630a5b98118ad3a1ba673a9d9f8c87db4cf8cde9e62ee69865bbfb3cd053b35a8763629751c5efc7c109f57586cdeb7c93ecacda7ba0e5d124299132432a4dcb2ccf5a1f0e901bf83a506daa4d2ebfb9248b79fb58a4a796eacb35f3a56418353f11d261dc9fe498e26480126b548e38bc04dda8d0551b9ae588620e9ed78961d39737760b60268cccf115f60afee126181fcdf9b274a58fb476c17a7e2c64cf48e1af974d77fb9048b0268ff2116f8fbf39e1cde91502430c5e6f90245394694360ea880b6bf159e0687236b34088ae708266f2d00ebc24a509b1affacfe0caa65cc87a9efc5107134e300831998d9ef61e30df725a82e3f3dca363f90823918f2d0fcfd03b8579e583241ceb0dc08961dc32fb5ff5ff4ad536cfed4083bd32299077bb9c0cc3a6bdf808bb365d4c5609e73ff17001c30707c7d2704bdb0bdbb2a331a939b17e11b168ee83db154eb32fa27681d537f9faec0ecc3ee911b24dff06e0fb1fb7c5606503410b2c541e81fa8127b3053f063f2ca168a85565fdc27ba476f5cdb236c038d8d5b91c13ab77aaa7aa45edddc46fddacfc3f9357363976a6d4fcd138ff1f398840e9562efcb7761168ee46958f8b86aa9130450aefb24feea7e70a8c3c63c0b7fc057c242a7f1ed4dce5f19eb52e49c205c98d9c4364f1efffc0ec8cc0092b7a1ac910013578fa0ce824885294e5ac4e4994a4d9b8ecd0d5614cccf552fa160f265b1edd58c87d457310cea95051c73da41691d9fa0024ea966b41afda2e03406a882902084d9e1aa3651f644c2cc2ac88ba4be5bfaeb48dcb9abc73c6e9c4e6aa5e28a4f74da42e81768960e8720b29f97052cc8c8360c220e80cce16fa03a694628fd94e769fd50e4376bbdad61f918c47733f18ac87f9bd33f846ada48d5b44a13d8bce54e1ca902000000000000000000000000f9e60f46c0c2ceb0a9639e46df017daac99180ca4ee241ab381b42e64c1a4eece33347be905ecb2bc4e0e08c09e0f8e68a7e727c31454e9b5f58f6fc776469f685e5700785ccb15f7059852adf7552b9cb1b9283aa9ec1d5c9008fbfbfb03f48000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006af11bde2363b86b62c3dfc641e169bb2e8544ece1c87c60948745f771b0635d64b8992acd0e7f2cd2d8e81b7e9fb5d63699e7d0bb81a57c4830c23098954a2929c86cc15faba4980e9202c2c0cb734e358b1edc63d9a349c31ed476e363a022ab54b18badc3f7dbd0a009edb20e3254b4f5848232062d90f5e48e790a74179c0223b0e45d71d18df72f2afe6f82a7770e2c720a8c1ec255a7dcbb45e8448921a50323a20f83823c9b235f7bccd6f2fc81a335b9be1bee50bf9e859f1744268e3cf50a00f2a8b236586b983a53cdab561fde8ee3ac5f37e44eafffdfc97fcd9c134b83fd29fd2dafeeedfb0e7683b6ee70bbe3d2dcf88cf01312d668e72bdda2f47912022a71a9cff14e706e154d7285b09cb79ca73d6cabc86d566111c1fa389bfa9b0e0226c1ceaee3625b0e04c00f6011b8d1e2d2519dd3db2d7777641a68b6b3dbb66b021ae8fc4939e3b55aca2211e1aaded3785b21fe7f60c437759db68ae7abeb8d370219ae0162ea9f29d222e704b95e859e13c566553a03aefe4ac3108df75c8275350314aa2731fddd1cac609dbbcfec43a91500b98add35a3f2817ebb656aa69e60f948449a5a7f8efedf2778075437e9ed3663b6cbc34076f3d85aef93df1deb8b2a3220e838752034a6896868d295df6db985098dc7008ca11a2840e5db8804030680431a932f5645f245e796d343715c03824694c379c0f74adf8e9a71e76ed698023ca701a61bbfa4c8b712b75d0b71605b9b3c4987d9da1e6d44172cc67a52698dcde1f6e564b29efe7f2503c813faeec2fee4719a47a710e5de2323dc790ebb26eebfb5a3d85d0b57f5bcb76194dce5410270ac19c6201eb3413e94bd84c347871edd11d540ef09582271aebb64d393449678f74ba30b0426b3c51f1561bea7a31ebf7aaf4b0384cf3bcad6d896aed8603aaea185a341c2f13ecf0c21e8594f4e38f5392dae0f2de9b0814d98091d28b88f287be94b1f2e0b24ab8536b44d246bea3d9ac2c5a4ab2b3c6f698674af9d331bffc2fbe06de74960bf638de0084801749413b35826f7455392be9baaaa26a38fe4de9e2da878db171c884140f325d1ff58764bdd68028521a402dc1420c201f852a225fe866588d621031709986d6130d57c7b7cb396cc1a81750d1d4f679a1cf12f3d06e6817a3288f42486bb8c832179a487711c32d0674e0fc044f6a587f5f789cb22b99e0320429992442b06d8c5345d605bdbcee5087a522ca50cb4819e4a8dfa8cb9e95dada0bc5f667ae1129d5dc06014212b8ad3e6321b5bc04d4cfcbac74b90b474b3d56b81f7bd388307ebce4ca2d9138b5e952725ede771723e74d15113cb48dd50b61183d891c8290e552c1cbd8867bb038960920395d19bd27ce8a7716bb269487323f18becd295bfc51c82ecaf014c12649c7a7827e688f66c0bcbcfeb6d8f6ca0120f312162e70db641ccdeb45c2ecb5bb1d327b46678e5262af595b78294ead29e4e90101df67bd5770549f2b295008df8d1a3e96491965d6a40f23210dc2eb9b31a90970bac8cf47de430e0f5205e5aa2b7535d3e62802fa7ae52975a0fe79851efd054f3e1d44fdd277a6f5a9fe6f16da91c7a0420ef07402ff468b7e70e5d028d9c7c9f936ed0a1f05af146bcd142bedfb8d5c63059a6a3d1f5a314559d74829bbee6eba1d4208750b6ae511d8f779e86d635309063c7251229dac06852e42e0bda167a446f6335104891366c5907c7107828a8f396f53a0b5f79d4da2948bdfbfd055cdaac7b7004e6b505bc279ed8b0ed7a034d87e5b97c5ea466c76d7f470eb0f1d06c1966a6d214b378a7a695dc989a14b0a6fa900058cd1492c76558985917503e0e29fc1b6bc2c5ffa9a1490af144c21feda21e96743f6a7b5ac7184246d018536283b4129e9657fbd75e2d7403e176e6cb07c914dc0cd9960c6ab54e5192596a63419dc5a098fd3d9caf45b648ecd7596792da8ec5cdf3d0f27ec141ec05cd891f02134d7a917aec153630b4b87f05506740e0db011a41778136b9b7447dcfec00ed8f532b60bf7780dfeba3374d50ef4f5e2ef8980e9ced67cd80ce989dad41674cd7044b72c1a042b7436a09d1ced598e7215ceb35d61427fdea22b8fbfc388227e384e6e47eb1407ce2fc3b0617b33fb3d9da0d7123d6a6aaebbb19b5b2968a91cd7e503adfb5cedb22ac72530bc86d3e5de670d1cbed77ad28dc2e353aea76ba829f7b77ed88ac5251427546e6f9643424d856bf9ee51e73028ecd1bdfec0ccb88f84bef00f95dcb19946d2f505505e7f9d2f3751f2a8cf6cfe808cd0a2d1bdccb088e906278ac16bef70e6ab21026e15753f933f6040215985ec41f1adb7b185806bc624fffecae02c86ad3c3728791f1b59dc350b1b929dfdb240df1a1b6880808b4186138eb0d53f0266d0d3aa67200", "", 0, 394333005, 1537743641, "f1785d2097c43f13a9cdf4552b500600d90d026cf3d9869d2d9c21576272b3f6"], + ["030000807082c4030357f8a2ad0503d26988f19adb0732cef0c0b00cc58a9325e7069554050254282303000000095152515153005300003dde4cccde06d72a88f06cf6bab0022d2c83c112971b3b546850f7152e09087b76532532020000000551acac5265ffffffff33130ea0c6123164dbbbe9d8a1318a4700adcb2a9865e504b37a6a3016a4d99401000000086a000063536aac63ffffffff026715c7000000000005655365525300d7c403000000000263520000000061921340020000000000000000cac00904000000005e77cd7fa20ef1c3d42e1ea9f6ab3664f9e9c2455a53dce9ead5f583f39d4e912f8da5e0eda2827081127af94536886e3880bec7bef6b92aa1150e3aeeb76e622e3ab928164de70fa465e40b5f83db6918d378525f1b0d8e47a222e8d1d1acb20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054791326c3265ad17e0adb783885fd2f2e3495afafa6dcd4063645666168d2fabfad08bb348e795e13166416d326e1efd8d69d8945019df4feb87334900c116e18e28e3ccea1ea563750a1a2cb283f3af0ea5c60a235f486189e38cbca19352341a25eea347e47886a2faf566f2afac27f01757086f3b78318b46750d00bf004030a6daef5dc349c65e87ffd2341c9f8dba81a2c897d99867017c37bd7f547df3b021e3c9e6593d73c134500f3b9673e071cf86359e6e7fc10b0a1e805279534b4f30a0054d81db5ef08a70644598ebca450d7b0ec3fa8c07fd65939b3cb7e50ef539cb6c10e10aadf018c35599899b8e73e153a992f60fa20f6242f700ea3b591f115030b9dffe9742e6e3430906f1eaa68e808b07172c760ac77b23d3e75c26d70215702102e8ace1c8f06fc93dce6418e11bad717bebc87b9dfa10c475e2c3bb4537f3e0301f0d6fbd6f560db4b927d363863505998368df767e3ea15bec45527bb39bdf003173c164d5a4161a51116cfa209ddc38cb749c43519c5335db7ea96127417f177022cc45aff8c75ac1afb7fa6b0ad3fdef13951a236960079de42f51ac56b38fd8294b29d23ddd27ea18e108159db46bf46b0412eb0cbbe68ab55a6331fab5546227edba72dd73273308e4bddd6287aa02f475c771a16c089411ad74dfb05d0c9396892f1921fb31e2367a877b0ae898aac811255bbb87cac827e8ca8d3ea08a96875a6627283373e55ed7c59d2a913616c574bfff8da6cd7fdb880a15de4598bf5d1c8308ea9af21054681ba3d045a1ba692e7c315cb6fd3606eb96b782d4f90041ce1f2b9b3f0785e9e228b1b027707e314823ff2a27cf139c9095dc373e1a7e8055d408b6fbb09a8d2236665dfcd43e85bdb21bed8c6c9df38817ad6258ed275ab284be5739760739d02024be816eb97715c6af840a4182c1df1028a11f1b46d3eec9ab85d9836907654c7b185b2ab8adf045aea888f2b40f7a10a67b1bb413583fb58a1d649820af3d29771dbd8cb85dec18e5b480ab8ae3d07df1355019d91ba26f6594a9afeae5e8dc50c25dc63dbc0dfa2c8e19572b4a6a0786a8895922a9210e89c210af019f826c2a9c953999cc80ce3473c46caeb9a5f09526719da7076a6cd2f5d525fd8768b6a2c3ccca4ded3867a60d0f227b7e47d45ab133481ee12be51b8879155fd73c1999dbe18e675dd9fdd4dc7518c518f2ac8c67e6e3080517bd63e5fc0c7f981a41e2cea70aaa4ec6e33196813a9a58271af08e55a6346e3365f877b086927d61042d5f735d8c8b228fec3b65f9b72b610033c27db1e43470a3cfeec6add7df007fa02f37f0d07ec4918cb0ac560c0e4f55f28c698feaba64749077a3cbb5c61b56947a4458152d3fd3830df2ec30a240ba8b62aec4c7058dd4d189538fc5ac7832d2f31558d230f238ca66e1c6b3c7800db33d1c2ebd3d5cb53a2f1aa7dd57f32058602be0215a13c2c8a5f330e9aa3619b903118fa4d21e33abe064a2144351ad5ba26579656ba50f1203498690e9734ae966846ce4c51626f8d91dc995f7fb354ab4281bf0fd9faa60580c9dd8a161eb3c71b3c890c170d9db090da84d3b492fb2caf7bb37524b9b7f27678d88c4377e0d2db1695d46c023b1c1f62450c3c67def311315701c67eddd6573005f038db787122d2fe98c4571293ff33650943d83b48f68a9ba294480aa6804ee1cf0c591c5ce3fda6ca5477b0e3b30a15ec81abf5e869194b8cf153d0f970333f340664aa628fc71acddac399e48cc0d2ed7935c0067ff9583696aa23358c45141b55b8ffb2c03127285b92b2f104474feca00f23cf50469cde6bc3037f4f019b0e9b5d5dbf91e09aeb4aceb7273a53dc533d358c57870a9a7c6a314c11acf49cbe173a1977748accb449de27af5685dcd5661aacd93d6bccd97207b216058644c49077363a447024ef65d1995e1467da1f53e7341ab93a1e6885b9d2dd3108e65ef9cebdb7f004ce4a1a1826ad1abc40da65741d55d8a31edd8266fdb67a5980411f4f4b7e1a7c204a6bd9d2f9663bffcfe9b1cc8f63894cb8d296c1d3d365550dda412e085e989a706957d921ad4630aac719c8cb75bd1a385059b48d92e2d419a42f45de71606e0dd8c1b14808f4a3605fe6d5a3a1083738c0897d7cd4a2926750746fc4fab55addbf6d164832db64228d8afc7e4cd1b4f0a15d1ef217973318a7a40938b0bdb128222f01da5f110e5632df062580295c361d9e207198445d1f8ab89cc4af573ce1de1709b60bf53e2b3867e71f5f398a9c822c0000000000000000b46cda0300000000444bb55ade347eb56b95bdd5284e659f953354a69016ed0ed102d7c1abc6cec86b52d2e09625afd3d26eea2b502bd949b39691c557b671d8c02582b1efc96776688f6c5e0e6eb545d0029df2ae0c4de2189a877cb4e452801a278d5d9acc443d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f76f8029d93721a597beff6279a7c49325b33f1947fcf36270f48b6217253fd532a7557258dd8f89ec6bcf302af127685116692f48778c6692933f250251ace1efb1e3d9cde8a5275791f04da1b4d77d985fb787db639a3d21e5b5fc5b7f6b06a74c8b1dd02ecc31fb2526babb10b48f011ad50dba9ee36227379aef642dfbff0223e982420c0b781cd01aedc7f400bd19442f1bfe6a0cbf5aa2d51402c3952666030168b747cd5b572b675bb1f566cad962e7fc3f46b45c993fb2c665fcf5eaac350b0605e7bcaa0725905ae09c82d21685190c70d75959481bebf75ecafe57f7ab5a9edc7b3385f08937f112e687e9af91580a2f6270f5f2f057afc042895b36e326031b04c52569d828a60098e94d1b47ad474d50f871979ba61c95e4819e78632fef030a45aa42a63cb7b8f5b537d1ffc05aab6348adb29c8fdba416998eccc3a800620303b6ad73513b1f98371c5558d44485e037af8df78d1d5ddf94f907544d0141dc0317ff4cdd493a276e26edbc076203171e6759509823004507c0a860f9e97ecbff032a1e318f7ed56ec5e9e45872b94d4162107bda53f9c84487147a3a74b93fe277bc463d844752a274a2106cc04c8d53eb10ce470156ddaf0057bcbb0fd5027d6b669bc2cc9789196e1a0e9c35d01c2f35e480c82c8fa02828efe544901087401eaaad84ba975be7342e59d7404be3591521c76e122ef419f532b843c197c5e07330f8758b9b62f729d681a8fb2b903fd011981a18e0a66265f4a78a6292382797c4e3cf24b72357a10922b1131809e852aabe392791eb9b792350e9a5d15dd561708ead95fc0ed864a6aab770ee097083cb992102b3fbb371c5a34216e00f3399e72779539c4b05046ed4e4533ce2321cc302327f033d034faaca336836ad0af0404804c7e0b11016283c579764e9e68f9476894118956da11f1d48ac284aa63998820d9edff7fa3f0ded055e7833a756ec3fe7516790f5c1bc774f245516d4dc2355acc3a0ee34af84a5dd4b960c741b9f3f2a32451cd2e03440a837a1622723f9f90bf8dd7417c9cbee8799a72c9287efabce9b8c64157053a8c04070c5aea68686418acccd0141ae06bd4506da66b31c06e42311e7cfad22f7aefd13dae581907f72510de05f6e9d2feba87e098be54a3ed55c530588de486251bad5dfc191b537c386843c8962be4bb97df9f532add14193de1552e2a5d14e2d731ba2a932ff3d6b5627e9d5d886119184dc49c518e182d0f2672dba36f9a5b2882dd26cfdc6a1ba63f28d3b953fe424c29c1d76cc4b0111199db8d9158742e3547a1ccb384bcda17b8a36f56c2e149e8f0e67b014b562f0d3403dcec0a54dff7b42f9b00d71abc83308a4d9c35ab04db1f0f6130f2ef79fcb2acdd69f0b24a005e9564b78585d508e14d637acf956d1bec228acdd88946b1390c0b20152e49033cfc03cc66054b524c60ce1f5c00aff30edf7099970134cbdb74fe9f83cb4609ca6879852b8137cf09a9a8fac6bc18ba30772dafff03f77df3ef157f1e41ad689413c91b103b5349c0a9352a432e5a855df89a5a288b367feb9619d304b2f85b87f5c3ffaeb1b348a43d7dfea54b468319fcde77e23f549ac7d224dc8be675c14ace90b11367823a42c4d2e404b98765fccd3ddf91fbbd4faf661a76fa8e1d8207ff269a5dfd9aca6028773b884e3a38b4f49b7bed4bbdaaaf0e19191e4f5aa24cbf91aec77f05894a9b720a3e4e9ab1fb57bd134f933d57b2fc74e72d835bec1c989444117a36ef8e68f5d63b7b3f27f62b68f1db953a3c95582157ec5e3febb52b032f114144c94cfd94b840c239ac0e414a358009eb387f2495cb958006ff10005658f47271e28bf9d97a2fd3460c8b115b7432a843f631303dee7c619babecbf94f5e8c2b73696e7242a488d0d34d78835336b911db592d0b8432cb179879b78e7e2db75b41c3df7d756f3e9b2e038a1cc5e30610da87d3d07dfafc42168994cb9cb6c7e3bba8c85822530ba77406eb3117a852881f871b384985d51b33134e10f30915a9ecdb53355b59fc02f885171579b472837771f9d02f24355aacbf130ef7ba4f83b6d0084d917a00dd2afbfdbfbf402ce2b585c400b4bd355f29536dc884fbd5a3f24714d266116c2d6677b2aeb671b5c1cd8e095112da430f2894d7e62fc5cb17dbaf87eba5d0b5a086a8238c30214f7d6ece2564f9cfa1cdd9894d429e1e1590674c4988a19e74f01eafcc17bf39628458fe39b26e718f7dc22201caf6cbe58f7defd6e83e65b47d208a4db96f14f0b3ad4970f66c8faef844a2e12770ea7e8943c493c9e7bf78bdeb182c5632dc0b73207677ec69ad840768816994868c3a5961f47f3411b9e4b369aabe3b844c065ca53b3c6591f690edd479cd175a46a8fa2ef007f55894a0d19fd4402b7aa18e08", "00ac6351", 1, 1661871064, 0, "abdb48ab03edaab9a79576068b5b7e1744db7d1bee1d942d12c308448b77658f"], + ["413efa4f01bd5e454d217cb0d8231437c603385a59d661d1f436ed583ff2c3cec62354b664010000000151ffffffff03ab4c18050000000003ac5263bc6fb00300000000003290800400000000066553516a536500000000020000000000000000632c0c050000000097615ae9e0128376a912f9d6fd7cd069fe09c7bbdcdd79a299243f2d2c18673a5b882a350694e6f18ff8a986bcb5418c3edfa4c25034ed03925c1c3e4e0488c6f6004d82137ddf2fd9ab11c5f328fa21e33a2d1ba6559505c57dbdc9efbcf8d900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fd29ffce50d1339509bff2e274843f5697a553f5b2b4a90f8ef9c518cf930405a72c07de8e56ba767facd80c789aaee570bb1253a77242d05cad20d5da2ae04cbbb9b243a96a69de13bb5a17d61d68a5e02f60cfe13f7e822d96d6e26d30eb6d55fae09dd85b54d252f305dbb64af3fa3818af68b46b7f8ff6b4e451ef8d138602080c998cbf80968f0f55694ea0576edff74121c5ba5ffd2484f663b3bb4d9c66021bcea15a3a96a53fa5ab48071d6ec9c65c2ceb4200a98fea921e55304931e7780b08523c79b758112cfb4fa4f8328cbfceb05e9376572e8bfa89393fb02554374e27e9746aaffd809789f873e336ddbd07022c572abcf0ecc7d134f6a914a3cf1a031a9cec512523267ef12714717036785fc617bd93b009b20585a440569afc58ba0220c3474afba14fee97e3ad6439f9a1241301568b9032efb6f36fd740e03d81640216e8b2509f7cfa3cb5d479dc40b11b64117c38a99b10ce90b1df03225593138a022409e01fa09a627e1a529ddd7759e891b7523466d22eba2c8257018b6ff9dfbb020144ced145a0a9d7b3dcc6ba60bb04b9d8e03343c42f36fc3662883aac2f01aaa254d307aec53f908b0c82c02a70063f42a051db5fd5022d53011958d2238df7b199db19f9e81b927394e56885c8aec1d3696f7f40ce108b2f44cdc4c82024d315d3e6a6e23cc1f387b45bd46fe32c39ec217312adce3b82030aea55c80b5adec352ca40be57a773bb94f9e00b640dae006d8946bd6050f273c5b1c22d98097711ce2e10b560bd5a4b9f3849aa61a89daa68bd3c1f1324c2895d38c5955d248d34720b40f60e9114b3489db0c24d88992f5266934c3e5bf81e505e486bed503a9692c8efe2f8e2df1fa35d5e883a8dad07971a87cb6b8386e2afa1df7d4dd6228ce9d17e6e03722668571ab6c1b35e66a366e57f17304114df3a7b429f5659545c3212b7bc8625d150f9ac8d1846164d070a4e470d7cff108348cab321fbc3f8bdda005708baa05f692852ee86da1438427a828eb0e885dc93f0e0aea31d3634475fc099cc439220abc6783b9ec592f459b9533ac1d3e3d1f20d51be7d88d0f7c8436c2e50e9232d5b9f85e3266986fcac6ed9a545e709c9c55cc3c6f80d250aa822bacd124ca1849a379f84f6f057c93778c7066e40a65ca3b941c015a4a00a7b554021d413f789a27b1a6165408f31eb552967c23ef7cf4e36eda51e7ad874a658d7472fed6126329b3b5526f5c076c5dff0be449a2fce863fcc7044353a1f9b240dda03c34dfe0543255fcc68f51872e9969c1c5a9194e78b8e7456b48cf1f0b6bde9f7e8d3f40fda7b7408e515ae06b5d2a1c287593a711ba38e302a013a83f7c0fa22c910513b59b9e0a2fe7d6cac05c4b312ca1ad3e39630237febdb30af2edcf47136ae5b20282aa16c340ec4980d1631d4d1b616b0ce361de3928f15b5542ab230260847020e12e2dc430ec7dc76be1aab7ed15e0022da9f1fb3f207e40c33f0153e025de4ffdaf9791aafb55bae3c634d0691334005c20de9a6b92acfe3d616dabfb253a5e7b75474d29fef72538d023d52f915dc7631059b1ff79a48c38199755e9b7a33a0a7a45a4f995fbc1638b37c434fe93c9436d2e1e7c408a3d4e2f2af26094a780837f45de16c021b3328a068ab80f2d6360580dc4ed3162b9988a5749183a64009168b2cc3042d54d4787eeee31cc6ff3157fafa2ec18cf402f06e33fb005bd37271ae6b687c16634f35dacc66f0503ef2b39da8be1472c5f7f80183eb639bc911d119759dab82c626e51e47f508b6dcb487fcb50f2dbb1ba3d161375d8abe90f8224cbae83628ad93a60baeb7637f29281e0615faae673f3369bc2fdb8c543b1af3309f0faae740066a34ad6d16258b4201d262a1fddeee09083e0f3dff6f6bdab9014ecd86a511fd89d723ac4de30123065520b73b9cabb97141377d1cd9132c415a6cdb5f2956838c9cfef4ca763c01ed41d73082d4c06ef26729b4086c05dbc9db29009ef726272e654c1cf390766ec73ee885c0ed38775ed4a62313bf359a785c6b8b92132e728821d0047353d273b19c88bbb552512eb85b1c39da4e841dfda23a5b655e9237e3be67259d522e525f83fb60c7b90d0c511065c6fc8ec463d89a055061d49f28e46c6a8558d140c8469a3f7d09f72afacb3b22a9001c3b907481778343663afe08551ee0a5e2e2afb2ff3d47c9307d7c1bdeaf340f627c858bc6e34b52b4b6001cdbf369a870d1ee2fa8a3098d0068138924b9f4a11f380a322a948d7006364a0000000000000000ccb2700500000000882375194bed71d5c87a15fe6f25a63a6ead3599081b66c2945f2d4c30bb2aa098a7089359191e0f758c60aced9c8c761772c3e9428414b627069de5611edadd1a07e0a2fdbd54c8d06c65fc0a7b78ec4780c01a4845d020afba5f36164e7501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a91774181906a4634f9df9305250c55891a9239d04027c22edfe49db5d63d4193854ba189acf7269030a981389eb6336ca4cacd122dffb069a45013e6b42eac6d2e4e7f48172c65110b9891d1ffce625142390c56232bc4567931125f062b7b1c3d44fec3f71f1a0de697068f8c9e7077f325d39a037cdd1ca9569db39a81900215538f47126a8c48bc23b5f3b432d02bdeaaba7a0672de49363684d768f1140b030e1ce9d85578f0a04df21367589d6576b6150fb194c4f46b2949c684c49ef0430a04a381b57c391a4336b2604604fd27a513954e07e99c0091d262cdc33a57c4cc1faa26c6b51e17a0ca2856dd334cc3f3b502c92ab211749622077fe0d99555a90206b845c40280eaeea6a9b63d9b9570c2933e6fa9fa6ba171e80fd0151907ad48030e09f551545795ec8ea067624b86810d13ce893ac37d5d605be97064e658f42903147ea97e9bea8eb63989ba129feb4cb466ceb8ab74ac103c379d9db91b4b0e490324b7613226b69c1c6caac25b8f36efbf4607d77633b70495844f31291267e5fd0325355a9fe9cc65dab72a29f288f478a9f94be60669653b15148d4d594d7fc7a70e9a8ea44560c698f4d5c274bcca70b100eb05ab217b3f550d83d28d6e458ddfbab908ae07eda3ba330c5aa961543d596ea9257893780c7f551b1ecac38c6be2aac71b7a2f3039e2a66e0c30e48c9710b4069ea8e8d8f13984e0044c7655b2efa27588bd6c8cbfd859b3ea7d8ee20ac9e95726b713afa85a52b884ec7289552f1248fa097f4739f099cebd253f30ed50d1f1770104a30acfe1033a1d6a7fc1d0c675f1f279f3f94658adb16480e26aa6afd8f47e4e904acef2c04485a7c4133962434d7081f5b103a60b3bd80e04434128d2d7d8470364f9e787339bdaf9fd7ad09a3cfa4bac5ed9397b031ee672abb9abbe3bda65416a059af8c0d166d39389707d40446b2dd42993465daec933dc6192051e484ebf56f2b048a340a36fda1e99932a1788cc1e60974e29fd2afb92c53392920c231b7bf95be1b7d2719e819b24d6cde08756dc17f1399c11925e55a97caf8359462f193e13009ee1dec20c402d032ebd0a85cec023fd64dd10185c197775d85fee55290e71e2dda9215cf21220f4fc5733b6e5e9c674cb7829c3504ec3c285eef5112d449027203714b92f712f6e68a851b30016f66e5ef70ffcc38bb6262f44247c40c3df124ceec964fcc6312650b598a0204eca283d667f98c714fdc1ccc29f46710a5a244db1eba78d972b60e515c046354d877f44745a89b5623c6706ffae7f70a99b6d989c2d0a7b627552ad9144288672272b4a2f9f52e6f2e0f44cd082b1da3f7bec4b35d5eef57522d9aee63709f757370cc2190bb095ca5afd7371a8804b922ca369d689148a709eb81f2e3a4a3650de50dcecc2aa24de6d8b11be0e5b5a02d3bfbbd8e22f71eddd299020ab1f18753a6c9d9fe6c9fc4888e37707b59458546eccafeb2b40232a75cc88bc9743e9ac46b1a893607be33087ccfbaf68c4f66eacfee1e1e6d9166feca569e1fb6f6883a4aeacc34ce3210da29820dc83ec69c86baf30f457f636a54037ee4419aa2898f08c8db1c5fa3414ca6e0e4e4778552d712eafd90b2080db11889a721fe93bf55c6f1c864c45cacf2b2043bdd30894e82d82a13581e4d027891603a96c19604ca3f188fc10ea0cd928c63741a73dfa31970b9b73c6153d867eb507f0fe5725f26d46f38cd1bce95d062ffb55d1769edc220fc3197ebb94f3a0f7739213015a661f40c9aba5f599c3c598b6cd664aa271622e36e5556513e37f62e29c34559586de6344c772e8b99ab7003a9144651b4a846cf388b4533b416da73448539c4bca5082c12feab7ae7f09015b0493dd4599cb0baa53fdb72b20aa606daf625fca321d8c19a7e5a9c48dcef3804e63193c0480c33efcec3bff3bc7b870e396c89bfa82c832544931f5b5af12c8279938465476f63b0d14d394a702f301a91bb596354c4998a173e179bb60367270b062d392853e9894bb604e7c9dfe58f8e552fca3b4a8a95d15abf017195ce7dca84e228794868e08af682f9488702ea9e3d0255f93d7f1adb854b1ad9cf97a471277c22d4e13b0277b5768ce1b8a98dedb34a6a6cef579ce6dcb95240da415aa6fbc9ff63106846e0472dbdb1511db01300c4ce2b3db10ce81a054914e5c94d45f6f394c69cd718bed7fa7d6bea7062df68e2c1849116786e5f89fd6f88bdd2c3ec51f7bda334bd3df77cab044ae6736ed797a94e971ecb858dd146f09a4938914c1931fd9bf408a6da330713143556f82b922cd68190f2f09794e44932043abb3369fec867fa99dc49ced9a5340a9142593d3ff99367593c091193bdb1f6d53cc563aebe75fc51c1e1de4ff0179b59e631a76a4b6e01ddd96da1eb88700", "ac6a650000006a65ac", 0, -1754905942, 0, "1e135b1ac7c3c66a90a443f7c3e7614f2f4840e3c7190769a93c85bb7b82722c"], + ["e650db7603b0d5957ae22ef961c1fceab916a94e8b0428159f8413b6cf0b8280565a12bd980100000001659f32f92f12822321c8698b9ef393a8b807e05aa6d09b6f2fe92ddb27afd46fa1542c2de40100000009000065520065530052ffffffffa57bd3f867aa60ed13e9073b1f037743b26742bedebe7b3f9c144776529af8760100000002536aba15ed3501af72340000000000025365d9f368c60300000000000000003d08ee03000000001a7c31309e12a88dfe2c5e919e046be505747d0dc3a2137c1c7e9992337e3ba8e9bc78822cc4276d122f48c95340f883bca398547ce422568dc516b16f70c08876b4fb43670e0f1af711663946d9c33694dd7dace9e53373282383b23a1d06d400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000518920725ea3f565ab2cdb29740ea0e93b4e5865d2082149863561fc94ce822fe3a4e43b09e4c15106a059f813db0e22e4af52245d64bc4965ff4eec8c0dbaf21f3e2367f929e7451da7c08984b8a3f5a7589ba41cb788b1752f4b18c5e4b18e248c768ce61c600fdc836c95ef345228c3e3001783d727421db377b259c4d5d3030095173a39981845d90cdf944d1163c73b8538ce7293032d5c7144a42a2929010224593fad7bc618b65069e0f81272a2e3bfba48e080273ac7b5ebc8f3b6ce62610b02cd2e34e7d42942f87f58caab0a08d34e3539a73d83bb1810d1f86dad147882ed518396d42dda629e95edb7439d9a8be6fd261f5029f0c108c3cade8c2b0e5a0308ed5a3d600a11173ff8e30e6ce56f64a3fe8839ec1da80175b9a6372422588d0315c4c4a8413dfcf4638667aa36c01c3319c0d71280f725c5c3774967b3e70626021282082698d7a1d785f0e1b0c49047238b74e60b1f59d258247e63d7d5376c660224d1b39d85165b063e2810945413d2d2bdb4e0cb8b1a0a8602eaea09b2062ab3022f481fa2b52586a06e2b28bb2ff9ee007e92f5b785dbdc6b5e69e8f51d8c982baf3f074a24593dcaa430ac6fbb8df150cb23feaf8e8a5de5d6c1a63f9c4a90d128c02994e4adf3a495e512aa7ba9ed7c11b1f9f5ace8eb028009beabe0d5eaafa252329537e20f69c715273126b953321e571d6d1e24565ab7c6dfe99b86f188785e00d9fb25d993a6e1c1b16ab058f3a851a08a7264576e9137040619d2ca870c7c822ae226f228669296aed0a0fabbb992ab31f5f0527e2028ee5b53152a2bb1df429aa43af517617035f9a646ea9b8ce40c3cff6b9ebc1970260b68a2a8df2c2decd483398c6de0809cc01d0620e9ee2d16f59c06ca36a029daa8510d54ba818fed3d94f5c9554651aac2c258cb39bd1b5eebba8bcb211791055786940294569b51e7298d2fc8d290bfa8f5862777c0efc0843b9dcb29ab79131a7f51767c59988beb702e0d8a88c374dcfd5cece68f4e56541246a8e21a045781f1d44426fd3a67048e641220d5e678997b62468d3bc11426961a4f784593f8e21a9b397309ec2bbd573fa53f195e667063d1c7bfc3974ffc9b4f69378213c9d0bcf69da7a2705bf0e124cbb1ffe1eac98eb954062ae1e860616b52cf9488e5924d75d497f84036bfe6dd8cfa881b3a39741ed5af73b1403289bcc85e1efca8aa708b930c20244a3d092329abacaf78cfbf6e28e8af6a409c9d405eec489f05c6b7b93e642a7e70a9e90f12893687c8062c511c7477db583bd224eaba8d2a636d083b6103c7a40898eb9861e0dbeffe618c0af50ce5a39df824b1774ee85d6ec2b6cef1d4282ecbd905ded4cba8903853037361ca4836b5ca5dd069923109dd3dc8b81c56c565b908342c6a92f9aef55121c36665c5bd3536e3fa8ea9ab06a7d79391d3642f0a9f13edfe3f0a66971cd6238abdc68a8e092868bea869b65146c99eb5f639e434a253492add48534e24118a4f67fb712beaa41b8cfd37cc145cec2247563b8c1cf0ab0f392115f7b403bb339dd449acd0139fdc4f069401cebc617370be2ee37e313766495d9eefa39bdc525b0aa12bfe53a38eaa97d7b9e82f50dd45260881a160013c89c1921d601e79631a1e8b717d2e4e0a556288f44476323dabb1dcbe64017ba57776ec94d69f5fbc0a86e813f414ee2e956255dc3897a1421e3d29d2150a643106ecbd56a2a4255c780f3f7f2b601c82d33167ea047910b5321779487c5856769980502578ec8aff1577e1293db473af117156342458f1c12f32abdba9421ab21ac1bc1987edb2267f745fb1940367d45ecbac4e6e7d9cee0b6c86457cebd4de99938a8a96c1d81126a89bc664295522dc5c5ca6417d0bac5e56c93b104e0f72deed6fd76825b54a3c1160358103600cd1e390e718a5f2d1cfd500670abfc806dd1bc62e6242cdc78d792a78f81202a45f6d36d2d5ccd9589a0cb3bbaaf97e544c265afff93d80500b8b7bbe6999794eaed921e1ac09771daf1ece8c4e261e627aeda17a47c454e5eb98f7b95f8983731c12f323b86d908aafec63e8bdefc612c7a25b69ad0b1d833d89586e1cb7ee465d27810489c5d5b56cda2089731f7c9a19b76ad2f92e13745f13e27a64b91f6f6d59b04801718f2929865cf8db9dafc61febf6784eabdd3a71b7e585a9cafbab86abb5f1cf77a403909ca483ededafc8003e0bdd5f219da321884623a0d2d8f40d5edc7cc1fcc1b33d3a87c08e0a40bdfc0dd88b04536a1ffaf2a37b99c5b7d204000000000000000000000000aabf35de6c716a3d0a9d90e2abb12842dd26ae29aa6a518cccefc8774e1bf5b717db7431bdb9bc7cd46b94d319f3cf068db8c88c136e89ee1c3f0f906f92364e8f2e8361db7749402ba0a1dee3dd92b9598fd24f4c6e8001781071ae0bdda7eb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000abab7f96e6edca86498506b8435c4e43ead4e08e0b62302e3d5ea0570d2daf015a727d677fa4765aa401d16ef102f06bcb293e29d62c87baf60c6266126888db1303362f148941d1f808e24c41c6d508d7c968d2f91adbc3ae2da48275d3d1e68196127fab5d8e494c8b5386879dc1f616277d4f31a134fbfbbf2e3ddb714b5d03216638d7aabc8f165dbc9d042f8226f018e3a7eef1fd4332b149413560fe3b59021809338221189e38846b2b0a87ef164487df89fc78a8b120967b841e1387bfef0b08f3a3a345fbcaef8da2b6e7b7dacf1d8902e4feeb20f0df5aafbc24ec910f3d795d6e33dcc54da47ec034d57fddeb5d1a5b20a9fe67063269116aa285abd85602239145052e0d6beb3a7c5ed2f4fe417bc01516bc027d264e4401a6658dfd1939022035f3068837dc5207c0f5c96cc98197ef202f8521dfa619abeb5b1e245dc55c031742e08cd7947fae69215a8a4bf89364da1cbf9241d648d88dc5e7ba96c685a1022e7f65893af86cc49f8e71521021f48637f5727d10442ae9289f809948030d05032f2ea2549afc92904da59e4cfe9615749056a3bc1fc8550490500d3a41925ab0a169357bbca03526bce8d8335b9c53929a9f696349fb02833bdc068991df5a2ffffbbefcafeeef2d2f734022a5566c8622779e371b0158560fe679563ab755c4036603c76493bca3e237c5149faa67c579e400f18bd8e74fe69914557b7aa47b0f4e5eca0cd580960b0bb6717844844cfc7cc82d97744d0722027c81f12c0b78b5d6de5e5865a86a216d7284daa91267224c29a2971c6c8bbae623636e44df2d60a8c099043c86826e68126b4af62617ec82093bdd2072b57f0003e735d0a1e8cc690a92a290b7982546b1f176666eeef093f598b2aa96f57fb57212b34e2775c1f773a4ada4d29ac380aaf01ff35f3956108baa750e1227598eb2cc0d9062982a5269abe61b28acf29675bdb83722bdbbae9de18eb4a63e0c2abbc658a5bb027afc22d47ded18fac14c4d04a2c91720b81abfaba7988fd0caa79a846b08550adffcf0cb30bf15ab253605317a2dae6f551afd3f16e09ee50825613df7325f1be3340292827b6185726f4454a868f5659ffedce5889e23e453fdf4837c4694aaa768de951e875a782b123c9288ee74bb6f1183dc95da2fdd464b390ca7aa0a7fd180df464b4bd4d31e1a997fe6f90ac1413c431cb60e3d45658ef8c125e10fd8f40584f884debe0e2d12263aa3fa393d752fe274c2bd314b0c53d5f8d0b57fab9e05caecfff898feb691633e525860d10829c667acf38bc951d1fad00719548570fbc03297f38322626f56da29d540968de17a32427c54f2e5a8026f60c30955bdc765b5b8dbbcd34aa44d3868dae36b9075922d9d44c1004a2241ede0f1fe2e7fedb0d436485f1db59089ff0d271498d741a568b6eb08a01356fce94e92e871b9ffaf191dd3b3ebd8a68ba59b5a7c81ac37e17f4d40c3f71b3d706a03077f1d2756513e5e463e994e0fadb6a2bea3cd83155c1fa372370dd1fcbce49139b874097d948ea71aba12b9e30b80bff2d3494a215897da938264de9df79d17da48d6d512c9a4cfa51f8ae4205eb47a32d08c21b14fb45eb9516ab37e5086f875c2c227be217b773e9f8bb4d0bd4854690ecd6a38ccb853d86b470a3118ac44a21bd2a3aceb47b3633be63ee768718751abd5aefef8291a9fd99e2259d9b0afe5b12f2af901b3aa9418d4f5dff406432bd015a06cadbef0cf6f72f4a2f228b6613665931eb2650932711aae139944be703aa6adcd19a3c9c7fea87190af062eb63cb672edff60081e76dab19dde163359307bcdf1ff4e2c2819e5e2bf01d67f811d7bf2647f926f54cd9006cb4a30da34a7d79117755c397215f9e3c5b5f6b9355774d603296a489aefbc667bfc4da2c052439698d38b9a8c69fbd132e9d4fa477ff17382f32339e341358d35ff49ee3844d083daee9c27009a1724d36c3b269639d726cea4e3d369a3449e54ac0b794b146d5ec6e3c7758157a63e0d324ce4757b60cafe237a02b86be5658cab2008037848a297290652bd39291b665a1f2ced3f640c48deddcae603f7dcf6b222c9ac32a8116f89f851838e5e441e7c4f854e66596003fb6109d60ff4c691c611b2c55b500d94d7255fc5940eb340052e54862fc4b71ad046a7e1ecf303d4c8f5ce87e0695ca92f45fa7027a0e9ebccfecc6daf672ffaef9f64b5d84c5e417e380c7461105ae2419147a9ec6b23389fcdcc8cf2370f2f49173b69d22d7eb92050aad85ff5cac10000000000000000e1a4f100000000004721ab485e31d0c9150699a2ac4e474711cfd94719845c0f74b673e0e95a0c4674740379c046b4799695ae119eae853aa6536f2e7e4eb5b59511b2bf215742f494b1ed3d9315b2af742c6cf27e539ad7b2e76353a759876a8bfcca9e76acfe81000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003517a47b71d7bb821b3677bff595a874a5806542098ddee1cc290a05aa76dad292fb830672c17266ff0f2054e4be6e31be1d8d1692ddf1a1d6f5cb3c16a1292182c50a969c5f8f36d6555c9bdc37740cce02d9556a6f6f61978e67b00a5b2230376543dd942f5e631d62864386d70c47b6f6d416b1a85c5df2904a74e7c45ddc0330091aaa5e15b515331d11f9df41df818f9b1f49995e06c9852d51d4c4ddf509022b0afe9ab7bca7890294de5c38d7d4f4bea14adca437508e6bbefa72d0a8a5ad0a0258727f618514771029e4872654539c3ca4cda17201b602a4a62703bbc0a772cf62eb8566e4397d858831b0a0e515d3fb98d9f0bf8c28d6125f8f8f34f8933f030760a6fc185d9ee0a978afb5e53f8ac95bbe95aff329d37eac7724eec01bb293032c224714169fb4b732bd160e19c9425966b1985e8fce22724a80c945b63ec2ea032138a5db4f373654f58dbeb88b76a4500603bd9fe4bbb306af5beae9e5bc6df4020a6b7f14fdbff0c97edb6a68ed577baccfce515a773e2e46600b198451d27e2b0219f563289fcb9a3ba4a9bee61a03188f803734b3a33863a6d4f016352f9394aa16e9ccd4040a5204c776b22845d954f484e6132b5ee31487e0e8cca1c0a0866bc9464721fd2fcda370f13b6fcc0378e6b98b61da1dea7e3b867c9cc84cbab54d7f2901b1b7cc67a5e615baaa5767edbc0b0261edd92f0ada48d3eb0217e18baa639cb62eecd56c788d1ea0eaa893ac976bff1f7a3ec9572e31b944845153c42920b827d17652a8297f4593ec13ff12debb223e694f3dd8aae7e255991378f57e3523f8c53d020422f33d32c54e994480db763cef7029924a022cad0c4c2e6d1c6e44b02acd565474b107e62df0cdc9eccbdd1508a546d2097b49852e4bfae7a8c9d0d934799c614fa737b4b10e4a06ef00e4f23b891b6e85bb8001f3c58ac1d7deb2b4b7b9fe4ab79eeef75a366765f341daac511e64badc9cb85cc34a3e9a66dd839917414c5e64509551eee4a42ce7d57b9876ee0bba0a97f6d459498742d68ea0ec9754b3ff0af0719c89006b302a995e498c7ce110af3f40f0011b4154129a5d0068944b66736ed334293d1f0f0dbe53e67c122c8b051d8f184d536bd9e987bd8ed89d01e8fa0d73d1a416e3585fa5a6214965a907eaadaa6aff1949aac8e597cde4e1dd67b4262c0ef76051ab1278e1a9719fe68fd5d4d32c66b96342308b60c15713a2e60bd7871ab287923c58ae42cbdc97251a89f328efac58d96797bf63ae087e79bc85a1fd755134877b436aefd65ac1fbbb83de3a439e7695dc935302df5947808fbf9afce68cdf5de8d18f5ad9959ffb23d2ab05c3160255ad928d9d46dbcf1e9a2070c479d42122f581ff750ea11a3fbec190f779535cd0c3cac68b68e9627b88cf8eff9c94db0d948c24eecc39ead8527fb7208de7869fa8ea94a718d9d0552a2040973f6a8e92fa0cd6d3df4b88f8487c98498f9f0b383239d66a151f2ff0d1db844d783d5d798aa7a98b6abcc758150fc675132f3eb9f20ef7a07d4bc46f805f5c3ed364815590ffc64169eef887b10cfefa7e0cf09f38c0c37369647159511a81722d69806b154877d16a56dbd1a52c535075ab3f5d525c8d5b2256c68b78729c751a2e2b93e7e3867c7f4c3cf14a51f8f47544d18c0b30f48ba366262c51f9959ab8c5c20ab8b75fa305f11bdf7920357ed2c602f162c4320141d625df2328b646abadcb18ae320f0ff9bfc3238f4620f880c06f2c840933e210599d1d261262db5475cd21d5570f213ed951ac1b19df2db3b6597ed2ce293f6ab8f99e7e0a47248f600bd75245a93cf312a960d6ceed905107e770af724e1529334e1614a430a768560fab4ca5c5db23ae32d07cf64f80ad35a6980cff2c6f6a0ec554f4c0f743acffe32a21b54654bda07ab8f224470903b493cc8203cd5f97e94ae05e270db3a55779efd01c1c690d9b0c464be9d552a2065d39e867ab5a951c6e8c148aada9ec9af097cbf520d644292cdac25e7ce1f80ecb90c1c8fca50aae4ec312d6b439e3727bf7423076b2b844cbc6a368ecfc3d0cb2acffac4fe649d59c9db9691f063652fd78a4628e33167656e8d78a381cfedb43cb2565233c52185e6f7262199f4fe0da2b7b5e18d0d4504105fecc0bce3fdfd7207819efe57c011304b7f023cf09bdf9590eee5513b30c1f19ee84c07300456cd1850421c39731c088f33b8f6ae048f96c8eed7dbb5cdd0cde4081fe8503ac0a7460f48d41054ff8b7422f4f889aa507927e37db17a2341f99fa4ba441912a2a1fbcbe8eea6019e92460fa086f4bd7422cf4aae303972fbb98a3d7e2ecaf1eb5d2d0e9be5112bcd136b25170b1e388c6dfc74d867449a1b1f1fe95539e638ad2346f8a99907d5fcabe054397527b1e3cc3d8f8fe0e", "", 1, -1252882616, 1537743641, "dcf90a7ed146ad8784d757ae491e313018ffe7e657be01718087128f13ffeb45"], + ["030000807082c4030382da53b5415706e735f90f28c793588a3f85c6741ef82bfcbf9094708853b51403000000036a006affffffffbe0d9bda919631b6e9348e4d3dd966cd42f11836d6edcc06d844b1a873b5e4f702000000004e1e931c5ddbe20a335d79789c2dc56080ccf732dd89f53be468d95ac5ba8e00be64577d02000000008fdbdd890340eb800100000000020063d91efe0400000000016303de2c02000000000365526577b1b57b000000000300000000000000001f0fce0100000000b2442f37d3f040ceaee093ab12fe5e4fb5491fb2505cbe6bc6cb964a2af60569e6edaa8805efd6ec9d27e3ce2ee27f82e65711eef130558ff8d8dd554c86274e3d4d49aa2ecb563de9e1ab7283f6ddec3b01d3a6bc0774fa21892eeace4d270b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004362130e3537174fb76dfd7a9c3f6b7794d62889523907f2b6debc35c5447ad6305aad76a2d0c84b9c719161639f746f0f340350c4429b8582e6d60ad2ac8998b208fbedb33c21932a34edb72482acf9271591d262c475de6c3b752810837d6cd99dd149d8320875179a5bd7dd451958a6697429bb14745c38e7ecd90076b9dc0207e4c3bf5d59c0fdba4394499e70d6d00561b6069520b9b565e68e1d0fcabd8d022824728f2ee82d895364cdf47228f31437ec740e71d0a876b6a54455a587b9430a01bf7e3fd802b23056e44bb814b1a7312810e4cd4c8c9b1df65d6957948ef7ddd2be36f7a5b4aa0cad8352e9acfdb0f4746ee0756bf9e777d84990bd35b5f25c020bf5c44ff346392e5b6414f8d4f97f7093e0c35a1c309f0eb32bd7f4520e2b720322d3a22aa593ef5f86e30f65334cdfbabd1dc17529854f07df2f4599fdd1a6860300284d09328fe6bdc49cc16589675a674821f980b0bd79200ea829e04cfa54590302851ccbc405adddf11419c5f9bf1831b16b5abcbb37032553b1499bca3561c0031b6ddfb7c567822c9ba72cdd7130c8a6062996a609a7cb2a358f5dc4fe4948d2e09eddd7e5e82bae5425539cba825b4f2bd1931b4aa788edc0571e036fcdfaf86687d907d55b7d090d937c689e4793a5fcda38c844f0756f7ed21b354846c6f451a3deb7639ee46d28f49e68ad8913d03077d0343dc61dd95ad1a1e6944902df63802746571916120fd5f1d0dfe772964449ab4fb7719943e1362c30ca961f3ef939cb8127457cc93b661dd5580e772554020c89c7adb9304b70a93df52f8abcbeff8b7b0fc0e07a585860d06b37228cd29c4e60e162c39dc3bf30cda9dcc7ea2ba1f36ac6aa1ebe3414c696e16591039bec3b12f31712d7f44d2be440cb9d244787ce41fc0897fca0f18a5d626355e9825f080c4dae686958e42b91c89f8623e465cecdc91a42fe9fefad2a9e74aebe2d00fe314abf0088cb9c48d726b103e4c09ab2bae0f91f666e53e2c6e4dbc29fb73fe3d7c87d79a40e4a6d899f993c13ce466201dea4713ef62543fe858bb20d13c952cc9ad4c3c66e86260cec64c83b0d6bdf6fc15cfaed419edf955a7a60236ca2040ed64cc24d46e2fc520bc9e81001de55bbdc25d742c9264be4e1985685bb56a3a67b0e890457390741ad19f4dbbdb6d8dab3e691270b190e7fa4e18f658c339d894a05bbdf37914cafebee0285441d08a3555b8459ab4b125730344d955f0298768b5d5a67dbd71ff11ac2e46c94c7c90e3fe7f3f681457b76f71e647c94dcdfaafca44a5e4d82d5ca528ca61935369e2673afe6296e1d997ab8d7605643171bd0ecde548f9b8719b0074fc639bb07cb65d3fe112351795f69a03fdb136cea27d8d57b8884d1924880d55876aa5779d1dc8b5b23d9cbbe5e5095c2cd490942533865eac066670cec9c4c9fb0dccb617c15a95956ef9cc0d317d44f3690e90c449b69050107cf9542b28d0eb9f7a882953c2313ed8bae1486380d7d1e765bf16e25932e24534d0f5e6bf4648b0e6f062afe898f9c00a18777260bd61de2b9546c364004d217995635ceb726532622d5663fe26e6ee3540c9a6fc85639e5b050970f2b759853d1c6fffc1c984dff05a7099d8ebe30ad629fc516aaa93a5deb0ea4670fe92cb20a9d1218691b901d81e75a09c6ab9ee9142e3f89cd32371538ab3498115c55de6f50723fb681a0068db321316d5d7886a26c9d53a765a7b6e65ef40b3ea4163799d0ab3b0f064d9c249875f02ffcb86b19800abe6fa289f2ebc9c79803e0a609dab7d250d05aa94bbc1865bdfc4482a58214557bdc85ce7db7569d15b02c0f227ec2d53d0100abef775b5130309a7a06a5d66d13f62ed167dd8ff0760d0aab00c5de7196198a4ecf75de8c69725ec837ca7a325923efafb47a24118ee4941b3d5ba3170bd77c58831f303debe3ca876552401e7ac8792bcdbed8574a985c827a2a75327a65a10e3f36592eea815ba3026cb24d9b93fa3ec0cd4f6151b4eb240b64b248e27a29f3acea3a232711b46327ec9cba97ac6beaf564c4616d7c26ed1c6973ec1984be6ea41abb717b611785854679f1eeb1006562c25de1275996b2476f75786b3c8a63659fa6d4d5a9006e65779d399e972358a091b0091ab501a321de2e4df959d63f0108c090b0c20b84255e1810e8a80cd19f90274bf4028f5c0082e29e4581d5feb100e4b8e0d3311b0fa3edfb44724dff95d8b0df9f12a16dffe9d939e3d31695343f9e034f711b1ddc3a5cb14fdd26a7cc81a6cff1eb0000000000000000000000000085203a4e421b0ed30bef8e0372053b39f077ed5603a5c625bf0fa0d8909a1f84c2337a6838205069faf7714dbbab5309400f0abbd0b40549dfc0596a24dd19435ecb54179dc30cc6cb3a5501a56701b0d7d19032e3dea6933d13610d31829a3d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b3bd10df2ae8921a3beb1739ea09af53a13894cfc404029c16399ccac5cafe5dea6df71c6c0b208e0acc9e3f171adac2bab02bb0a53d39a30fe0690639e329cb6394a135a0c2e38a272ee8313d56f3841390ebc965f28629459138f7d5c9db86bc70f1b01ffc85d8208ce8626cf2aae6e1a939989a3bb971677eb8589fac97160323f294380885a845b62bfc454398945b93b9d4ef0071d26c68fe9e176a40b3de032bc9b03ae132670f6b4597e44aa6a4f8f473c3cadd25adb6ea5f69188a5d5b6e0b028a46d643305663ab0ea24ff9bb06567ee2fb3fa93cec6f6fe5607c2561a2d4409334873b7c1c9552da923a568eed16929122a272ee6117d4a7fb7301e29d0f030cecb5732311a8a40156269320f9351474a819e716af779e37890d2171593e510215611f207d40f560630c725a35a93901438e40f0bff0527182a74bd277c52ab60215bf07107a771566dead0ffa708bd7b2d116d7a9f8da5cf455544e31c46d5492020526359b4b7b1254ccbe61cf2b92d1fd8e4880c2282e4dd5d34969f68cf3eb64032db7c4eed1ea31c1cce7d1d717b85122a3969d2e910fd47a371b5765dca455e6afe7471188c21825a79e7850cd550ba4736793ae90a20ec13b95e7e0cfc981ac738f94667fee5e64dc37477111e60e55c0ea9a271d113ac83a9068a2cafd78ff106ba443c5387ef096e80aa59df8848a200797a5fdeb11701cff2816be79df54a9dc50422b76a7ee9038c946139814a4b49ce8e32d92aff749b3f110114a086813d8993c00bcd3da430b14ac40348098e4c0e204099de43f3a72b52e80f0c099243259380f1224e9a21954d0e69c4402b7d1e1415a1dd195959c1e1658b691abacfde851e9b174eadf5a22359eeabd8a41dce5bf4b6aead865fead55b4033b417802d036e3376424b66aa4407a7e88938556128429e6a6c4f96ded7b395c772272b89c56feed89edafe9440ebb5898193265f41530c411760dd325326e535e5bd0aa5ddd7a463f704c45164ef44d5c4a95e4b54bd679193af32a290f13278aaac3152ca47f0c514272b27d14096f7436b8d1455778615224823fa84d08694273c21e89c73214708e492515c4d323be0af7a2ba54a1a9f0b752c17eeff0c593ad5b4578f6cfb0b377ff445d1d1215c078157935928d98a8389eed8acc7f4c8c8b596cbac5a3fa7fbf724009ed791e0d8488bab05d8e5f1789f7c898049c5ad5787d194b97131fe3a68df1633d802b1f7d6604dd1e18d4af4cc559356721090b0419eb453a2cdf77ac3f4ea0e3285005c3efb3263ebd4352751eb2e3c38e8b6e11c5a7beb542d993dc4ba421cf9fdb7c363e79bedba437dffefa39c4bbd4f6f231d8d099ed0edde33f967fe9afdbb1c5ed353cdedc6bcdb4d11e7ef0dd7e0a3d78aa8c5a0ddac04bfa57f525a4f71f53cdafcc6a392e91625555be49e5a4f9e9f1dafd618ead06922ab96293b6ffe395a775c44b0fc84ff0b822d24c676aa1a11183aa68a85e3e9d22b82210fcb74a4bebf5143be543de76ba3026dcf7a52c33206768905546f69ad25fc82404bcf3434d96c303d08f7a9f8a9ec1c46ff732e555d0e77271b2d81cfff37fc414a56bcfacbfd09a6e4ee096a9e01198a9c0642bf6cdaf8f92ea742c48dc265b0d2ff07bc343bae705785bfeb30bdc35d29a57cc6a22a0db5bbefd2c56f9d9cb913629efae20adba4a1e58df71bda80164745d66772a7fe1361d76e4e4389ec1f71cfe4e50d9986e2b507b2c3fc91dbf2b12f0d30bd2eb1a8dba80fca5b23e4f694d45a3c20374035e9e27c2afefe89718cb23ff2700421b68ac6e827cf4ad65d97d1cf19417e88dd40e9b9d7322f16e8703a0ef2be49f6503e3c32a7dec27eb381d41817a3b388718d6741ca6cbf0326cfa667c0f03afe7e69777d24428ef8c76325df1cb27500f0418226f5e4d5b9240513650073afece771c18308d24b664bdb897e0b660ca48469e74a01f0651d1ad0c6ba00bc1ff799e89e5967bbfbf75bbe9355eb2b42e7188cfe472ce5ff7cc042f4b71bc4027415c98bb9116919f7fe6ba9df8fd2839153504f9c4e7e12428eeb97a89149eddcee93c92e9561e7231389ed679ab3a50f8afe065c0238d0b9964b85dbd03dccf13cd91869a21c49139378055d47a81056eb83020a45ffa065c9310aab09de2d824676cd44728c9e7561bed3a5944ab4cb7fb4424850b8d223c20fb8957d97f5caeba04adbae3146f4231a07bf6169b407075c30cc419d7471ec4497d4196bbb6ca8407a67ee95bf6d6bb7ff3490f7af500000000000000002b1ffa0200000000f1af54d6ab0f552ddc5556b0e78a0736b63a568b131b46c1723607bdb2cea61661f6e4f7a3fc3f37702fec58bcc3a135ff9d7982cd151600e95bbb34d8743fc74e28e060986213daf9432ce42cccb3ab3b7c9befa8ee8abc6c37b58af0dd43fa000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d276d6edccff9504c4ce5db5e2f80ff75520d5dc44895928b444058ec1df780931efce6768d9a9885929c736f1a66d5df41dd8944f8249054f91c38c92d6ef0ad082a9e4b90eb8aeb60258da1939a7d2ae90afdafe4fc0bae25fa4744d6d9af338648ff85acbc7e012fc63aa1760b7d33df4173dd386acb4c3f9f8f05f78f5d022f3a8a1dee71641558d4534753d45e1b3bce7850831c11afa2c633e0f00b8b59022c8d9e9b70d37587a55cb69fa90aec28eae72df3470199b7fd3d9d46888eff2d0a04698be5e94e2d20bbd8e34e228fb72803fb718ef2f5bd42f9a135598cf4b5445b7ada7c9b5003ee998e6753fc61f804eeeafcd28947e3d37dbfa386d0ecf77d030d5e5564308400d1fe7d9799b8b497281d5f966c48ee08adbda259f883f9687e030804d4e707d16830d6431478085897ea9be6a5f6fefa1c3e62ee737ee1fe88ed021c0ffa649b18ff81c1cc03b927ecf78f0349cade5f97ddce5cb1a51414528c1303254fad1d25259659210964876bc2a9547c6accd328c442a9be8e2053c212ab7f021d2e16620ce3d6dfa97fe660ed54dfd77d79cc47a49a581e56f5703a95f73b8d9f277ee5963bd10cb20a596cd66af93a4f8ec790a30e9d665d0d3dc5dff88fb9f16fc94f3696102959f5b0edacb4a5d806b2c6799822cd4378a7e751db7d263df9c4a8c3d3f67b25d01e695825e66943b5f81bf409c22ef5bca31e59bb06605c6c00c81fa844978aa14b50ed61e95a60ad96cb9f8cebbcef0cecb2f08fcd7134f22fa9e7120c56d849e5070e818923b680786ffd76e0af7e45f55a5b0b0398c337b7fed09d73ddc782b004f614c24438519fbf379cb8a4b622d2c598cf3360cf9f2017dd06e81ba733bd4584dab2f412e5240a991e7ea5b50384268d9ae7b34757995b7f34211d70f261f50a1115ca20bb7d917e0cdd6be3349880c8bd8ee73fa83f032dbaee54c702168c2258515164e48017cd2024cf5e5946b225f3cb745ab0c570a31069d456397e7cdd0ea232a674f2eba5075c69ed243fa3ec209b24941b8f485926897424475b7b17e0f4d806e5a9c263bb6fdbd876986235a7a92d6cef1e796767ea3201c153651e14b02fd765e94b370b054ac702c151f717d5de8f32c0f9b8d37c23688dda5a937a8926836a10f297837d9462315e24b4380907087939bdc5d4143ae88e2104d207280924b0993e4723f62709f4b84e1de679c9d710cc38830421fcf0ff44cc03f41fe685de9460d43ef8698915f445de74f9961f7d5f058d95061aa0772a7db397af87ec2c42e52afcb012c69b032391fa1b654a7b404072b4e6aa42f373fd072c09574aaab2c293e4fe662cf1f65b3b1ebae9befb9f33bba603c126c7586cf643ad435f4427f6adb1c9171d1cdd39a4ee03bfa72a2235db8958c72f41f801e5a85c278bfdae65e194d6b52b255f77b4335690bff375570e9550c7dc1728eaccfa428709a27c4b06e681c532c0313366fa74912e764b5b4e7a3b6a58826df0178209bf8fa262c3bc57bcb434316b19144c138039720b1ebfe1b909c8fdd46a87d26f94b9a8f8d8e3b2c7687b33442d075928eafdad2c5ac53b8d7cb24d4da43871b7d399da0de10fa1e8c0753d99f03e5f05ccc4a89ee0f397a9d2af9eabaf7d6377a5c1502048e2ef746a38f1e5f79b4cfe7ab7285816b2d4a7c7fe537f748877117876fdb1453afd765daf9e22da543b4c76277507ff4c13816859a87db77ecdba1e0a252d70d75fafcdfd2ddb4561be377d63323010513827d311ae7d91df81c6ce44204dca51178896dffa50d067dd78d30ee2b5a0a1886990efd4eb970d2a87f9dcab89ae49d105c35fd1f9a488dd533dad984e24480c5c439c83b4905f64c6205e46e871845aa7fa7a0b1f3b157adbdcc5cb97e3cdcc95801bc3f49f0a09fc8f911d6ddd83dfac11db7b8451b0ca6707b49fbae3c94485ba32a21d073054e9078bb40cfbf18d207b71a6b71dfbb3f70f269718666ad3d0fc63325850cbf3d5a43b3f7f87272f2a801b70a83f2e6f44ffbae9ec3a98bc6dd8e8d16328eba2e303b4648c408bbcd135ec13a2067b47b7bdf0e90f69e983e17570524e8d9924aa1ae6f72d47928e8496e6d66c148ac9c74a3e627de969984308e313b3b3c216dbba8c3ef2927d008d362089c56c996fd38ccba14d3981ad4fed98b4b9756480d4a68acf03d3c66e7f448fbe07daaac10f49e35f6f49e56c6d65d9dc27eabc79f70b02c274bb36ba70328ec1064a6d083c44483b470246dbfe9dfc1f6cb77d391c5ffdcc66f6f603d8cab8632e1c439ba1c0c7259fac3e09ecb21a7761a495c286b32f686e9bb6ee6c212a7357cd01727ae77e5d9e1c280db28d01020e63930707a241db151ee5d49fcfdca2e55fe12ecb360be397ab50b5123aa4867e0efe7f1ed983c104", "52", 2, 200400939, 0, "1be0242883e4053bd417d5ada455724414dbc4690b0f55d04c15a3f0f8e093ca"], + ["7cedf330044e90f2592ab42d78c72851849411f176445234fef4de7cfa4195e7e23ecda465020000000752635265ac636affffffff7e7e282a6b145cd6889b43c203a86f4ed536464139bb5ed7e399461bc9a61b0100000000086352526552525300f06cf15c843a55d5a5fab5d6021f639a343687a516cfd5f9c63c396311dea26dd640fc1303000000045300515398b9c5c578b5c9ee1a1b3e988975c1d7b2d0b35593b731c6bfca280e7b4409b799fecf7d010000000400536363c0278e8703c2cc9d0500000000086a6563acac6a516a4c056c040000000002635223eb8a040000000000a08a1a77027e241205000000000000000000000000aaf2b360ee7485651f2e1c53e5a54b28ae9136f382a0821c269a49d1ac87d32b700c1de214ce629e780375dc810afb927c6a0d5febbb348a52e215250937521f24f25f5f6fdbf427399712a73f31e481d61e869553893bed8af738e7a90d423200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dbae37e80e05e223a155a88758bad028b4c78c4af5707e68e967559305bfedb987b61ad914450aeaeebfdb6ec0d51d474cbe837906f2598b7e036270db3ad9162eb5a6a5faa17301aa38450da72c31fff94df09dac256b4d5979b23983d2b2b7427d13c1fc28c4c7f159ff92b1dded089feb5707890992361cec0d925860f9c1022e33176a95348b18ca7124cda87c96f45cc0af9bdf23eddb1f8ef540d67b61c2032df7f5bc64de54c03bb04cbac13a2a72fa06ce881446a949e923d44b213206400b0212f083ca7d190dfec599c117b8c14e88d6a09b4ce4aa2ebd2030941bf17a4d61ec3f23279d207942b2688ff5ff10f346a85f02e2a0ffa311f9ed96a67a7233032073657b0290c998dc9fb0c0a7ccdcda6c42bb1213592f23e54668bd4608a680032eea31e92f2c01c73166cee68a4cb99820f54560a955340a5afb0afa09809783030e894398d0aba25a45688b7f71c72c9019e712a17c5b7402a1d4af1802451eb0021410e91d7e1c109d3da39b26a2230f8be7ec1e2d4965851bbb2d6e809c96941e03020c98707d237d06ea2c6d955c86a86b64138a46a7f49729958860947513a5089cbb7defdc60870538bdfd0941d301325b49d0a187a5e1bf8a87068e44b403952a21338ed711027d0785623f4bfc19c32f496c48a8ceb45d5e5cd0bad90c269755f6eb1b9bca74c5d3b3c8b991de1c1c515926adebdd32a9693c726dc09d396c1fc01ee6a4365c41f218b4347335617cd10dff4537a060b015c20d7abe8401fe67b55a9a0e974acbcaf85d56c6ad99bfd96fda41ed5549fc3236ef0013e8b92102341bb45a6933b488ad5d02d7ad3d46ed1580e10c7c2876526a2ae23e535c79b6eda6ae04e62fe2d749bfd40151f8804577f3edb755ae547b11ec00368c3d58c347934b6fc3b36657d173e4b0baa92f38abc48f37dabdba42e34bc77e8fa0b8a42f67b8b8a4e5c8f170166c62ee02fe1404480c539013cba291f3a5c6b17bcd7bf275a1d7dcd0a17791c9f253e80d1bfc41e6de1486a5e01a7b8fd09f565f8d58b97e822e7cbd78746874a1a01abd5be629e7c7688f7e52636dcb7efaa05a912a75afa7740207e796148891ec69ed9c22ed25e151aac8697776ce648bdec700ee1e39811c309a1ddef0304604e8b51e961b606252b45a386e603ef10732a84491c7e52273060ddb3f1801c7ed3bf75a5dafea7444e1a1dc8378ff8560e631685be7a0f65bd84f68f9df1d70adb95595ac85a7c4e7aefa815cf87d0aa0ad646b53756ad6298d96b13b0828da3dd35a87e18c628000d67ddbe226daa52f1a6952eda6b580e4ec89da1b31718d7ec0b3d506ddfa881fd033824899a20376a8dc17e491388ff1dde8476582aa8cde8176aa403b1d9df12c0032e2abf4735bfb19bba7762c56173dd21167313d34ee3abf338472e737a77f5f78456dd95eb8f81405037564bf734fb9463eb1c0f24c0b50d829946326638d319f8ee53f6c6c4e3677adbebfb9f392a6ae6417ba479599984f983a0ddcbc5528bf9d0242dc95d4ec703f2ac6b44e2d9534b39082944b1190630d5e9d0e6267889315dc114a399882bc9cb0fd27ce26ad4e44caf1aa44e8880d9ea2e513910b51fbce9c8f02bd8ac57479163b20f5f08fe386b1845562f62b7e2dd48cbfd055675d68c8ca601e77e72b4119f5256227b0b339f7e61c4fd673ce7e0f39583b884a9d4254828f85348fef085b0c978efe450c29fc129c32f0faac8356c4eff8f687d58ef12f51dfe21d0094ea9e3dd59fa1607e9d12fb341f3b7be13ba9d54ee7a5b845d094cddeb0ce5c44b335beb52ef79478be0a5e19a83b85585859d017879c322503647d7c26a0b14caf0c5b8a34e17668b4f822181ac8158bdfe39bbf1bf68f5d6c175404c68afd297a4ac9f539cdaf3ffbc8457349354b969b216d57ee04bd7ca249f748b2e5399c3b10b1edec483119449115dabfaea8bd5e158d0fc4a9ea7c799ea7c3438a9d62e1d30b1126cec4aae2e0e21b72ae27122915fec4f7b1628558b5564b640cfbc28d3dbf6f5ce8492a57274db9693fb640b4b6414df15fbe65a6efd9a1ae17315eb0da268f7c8e63bf05e4e125c7dc2fa3c733a68211dd1ee0bbd537a0d324a6df7fd0ba9199aaaa2a263c804b2baa9bd981508f62b84cf0786edef6444bbc2c95eae1f04d8808a8eeace1713923272dcdb718302db29f5080a88db2d40a855a6a89471ba20c439a2f07bc371de9c638fb69c8b133badfcd6d2a9a4af472b0c864ba2220290ca732404e79b0c38779ccc28fdcff5d00000000000000000000000000421dbd54dffa1d831fe2d158a47b35ed72bbdb43b16c9e852733d6209de395c1ea76a226a091f17c3a999e17cb4233b64779858652d2bb5b0efa96a1138a1235feaa2c38a0be3db7562ff01faf4188cc3b276bb10b20e385b60dabc36ad5e3a30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014f9876b3f5faf0234adce086f10a8059d00def858ce2a194a032025594c412813b36376f853347ba0a24747c6904084acb7ec5500b5cfe9c004a2bf0b405ed1e064456351f8c577e2f38791b49de0e2862a9645917a58fbb9570b32337955756710d38418b33f04b7579c7c64828e9d20a86d235876ce151ca9261baa074c45020a2d18d3c375bc8490e28ce640bf6725d8c3662260b4478624c4dbe33133c08f03117da05f3a06aed234f6ecb17d106ae7b92f2d74cfa8e4d51ec4dbccfb6267a20b060488cdef4444975d75837d3e5276ab0c606396f14d5d5d2867728e657ae79e8c0a7fc7e9b958d513a04c17098c60a05fc5d4c6880ee42c41d4dc1b48e674c60212f39b3ac07f5245f3e9cab068c24e63441d47e7b46107fd671e227cccd45f8d0201968fdb81c657cad6cb4c75298e5f8c98587ef6d12dcc70cf1b349a11215002031dab641763866efa5cb2ad1a9e0ac0588e1b7612a6d49b799b25307499dc5fa903062becd98961094543fdf3f8816e63705dd52519e6d7db88b31a763c2aeb7c09021af36c09d02e8b1d199a2bd0a48c9610ef864b3601461bc69c98f5a4d004f6105b88cac75b8085bec1cb5e439242db7bf9b669231746f763a990d655fd01e674bb57b5654cedbf7e3002267006d10ca156120be11f0c6c54c4676cad08d39f7d7172c554ee395efeb5c8f2da251328c01018ddaa44e8b6da738b15b1720d66713120236612021f42f91bcfb275c155267c4d0db0e1b90417465db700584e8024b61f7c46e32dc02737e6d79a12335157c0139bd2652aa9b4a110a34214b3e04c0dbaa1fae22bdbb3d6b28a1362a4c7bbad79fb12e8e83c59f87442050c4aef9018615a7f4cbb07ebc7fb2aa8860504d03ee013cb47117241fdc6337a4e7d1336d4e6b511f04f2d4d9f5276c06919dc9d110427ad07b824e4922056dc0ea1d6a5954761039bdf0bb2d59ff31e8421f6f55a1ebb4e46489d213a769210f3b5f24649ed9c22ac73623c14369a29916603513702cd0e4d7c5dcc0bc4fe2abb317c0979fe4571211a6519c8a80faf2ff74b14c98428376d2d22e9f07a4367aaf58b18be8e0b62b7f231d80a4a660269d7c9227eaaa987463654dd81ec1bb10a8bff9832a70568e31a514ac3f7adadbccb5dd1365a1ca2fff1fa53ae9d95a8c4168260931762f9385fbb80dff12e3d9bf7ecb24590302b6b3ff7602473e7df0e912aa0111789d0231a86ec514b3f9f2e2d18b4b1ae084e6afd13985e3b6d26ee05f076c8b1b92e36ee27bd268069d24164e15da51fc867778e7323808d06598df39cc68ec6957e8233874697afd5ba7a6e41636756fa0bf76d1e54a4f9ec84f1386702af49192286fdebd6976ae434b87bced9b05d0b1f572eaca7ed8290c7817f8e2afa2cb2058cf4982492035295c576c129631b605e9d9dc192e332053ed7f454ae3c512026f229cb5ff7f6dc90e2774f34fe1ebe49e7e9e4f52d3227639344e9cb06ec29caa1d4b9a27ecaf5757d993660a0fbce7b66eb8a6980f33ff07026d5a7add684352c47854948197fcb77779d82f3c13e8670e0eb20cc208074c4130ebfd927ea462ec0b15b857c903df8832d4de1fc1d44b064352e5b29811a31f8b0213d9d446eab9a1a89ec735bd43a324a1b380b47ae4ff6f9d1d1e4268d1fe81d166c30535eda06f91652458906e4662082d5844f97159a05d91b36193ceb3cf4b6934980b955e6fce8954c9bd48d26da35fd3b822de8ad491edee3c3e127cb9b1c3f28330998e472eeeb0380d2c592fbc068051e835533ef95a93e39fb298275a42cd2d0858c6c9913be5909e832bfef683336c28df46e72e0df453dbf1ee6d9a0b9cd3781fbab6d45489f5667e267a443445816bfdd957359ccca0a936a7a92702108e87c01ca169f3562706af3a2e1a253a578b6cee2b6523afe51166ecd4c633233fba2d5b7deaa5cd5f98d1e8d7b8c1fb95b2a433f947ead63811b56b145734848dc07c5c990b67b6c5a24defeabea6ecde68c3e4a46db0e149f0afab950d292470bc31dc0612a17bf6db7c75013767bae84c8973d8802406cce11703cee25ce89c64abd1b465c4a8d88bb1e462b13e9fe2f3607d9a76d85e90b1c6f596bcab8a12becd94282747ed8820d8fe9d49352bbb525dfd61cd86300cf2ed582a57d96c9e3a1bdeb097e005edf84de3fc6c294fd9c3d1413bbbe9de4251e1e6378dec70961e4ba809ad8b385434f059e0f128b44aba6089b9b201896f6fd0205360965a66f84e6373b1fe480a0c0fe2acf9c02b39dd6d098d3944e33c618409c1bdddab86e3e98fbb9253d2ac0107b54be88a20b951b354babb8ff2f13d2d433b9b6a8c754a326176310e89bf51289bb14bb9ae4646bd2be0bc3ef54cd186b6a1ea0930709b41d3f17aceb8f9af9d3c312c6610b", "0051536a6a", 0, -212402746, 0, "7e31c9f2de205ee29bea902503e2294febf8221478886612d39f5c1f8db5a783"], + ["6044a8490331f974fe088adf77f3f4a2220a6cd856250b4745e0523f1d6473a8e0c9ac83a60000000008acac635163006a51e2ceca54f7d2221ac2f64ff383986ef8fd627d375d96c2a4ab29e0d35bb13fe92db23f0200000000085163516351525365ffffffff2549397ac50c741596ae4e2396b0d8869439808c9613de7503d452549e8e7aa80100000000ffffffff03a95dc603000000000100ab817600000000000865536a63520063538c6c7404000000000863655351510052520000000000", "5300530065", 2, 1244939269, 1537743641, "a40471670f6cee6d10a2f35223fbf5d4b709a8d25349fec77f8ff79d50a4fe34"], + ["ce90b24c047fcf1f8a3b04ed4d3a5a05782531faf3dc24abebe7ba5e5b99b5f1e7a5e8a3900000000005acac6a6500714cdcbb30b5b4520bffadc708b3cc315f76b782dfc1c231e99778a74745b3c32670ed260200000007006a6a53ac5352fffffffff2689311f00ac52ad0cefa9d84aca75a2e0fc8b9f9815d5b9126453a8a9822ae0200000003655263ffffffff6fae4144b16aa8d6d760582823fb6082d3c9defeb0874a94e4effc3ccf202aa5010000000752635363ac6a63ffffffff03acf504020000000000c9c69402000000000300ac51c57e0600000000000665ac63635351f6b0c1f6030000000000000000596edd01000000002def07fa812b39eafa1567aa43bff6730b32dd358a6acb349799c070a3e8eaf6421270be201ad8c8971177efd5d17e8286850758b8f7ce2e745be4afd1506f1e702357838e73331bd5db60df56798dc21f8606cc10c5821cae9dcc0ec0bca7950000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080c701da9a9e6d45b417a393d1488abd377f64c9b7ffbc68199775a71a91120bf93021ddafef458a1636640dbf14e400b7db5f1df18cc9da72fc4473d6d4004d89beb0fd04e2982c6c81faa2951fe2167d4de64e8033764240f1e56c474ce02786075530cf9d41433ab40c352b2abebdc99588a419fa46009a7edfcbb9db73c6030aeea781597816228bc6be948b38e0a49765a62714f6fbfed9bad9acb31c1b980324ef6b2c71227949aad85885d442e5631631b671e83735b9f8e4e50d5da0d6f10a0116f282f4aa7d0e1e6f2b0f1e42e93d78042213d92c88ba681cf2033f02e2b09b155d6a318db0a9f07979ca48ab283ae3ce9e44c1b8b1e3845bda1c184220510211eb0663567f059eb75c5122dbeefc627a1f393e672278cac0415b9ae0833a81020e8fcfc2b4b6736027deccaf3de652439df236b71aade7c209c02b41d06574f6022af8eb7158e738c757b10d76d1ddd2a1d304b3381e40b16bb48024f40bf97a330229fceabc38f4579ea22898f724d1461bbf3c5370f10a9ee8465e2e4677fa2c86031151b291fac9352ea1eb8b1af7ebd33905a6885d8c7d60a827e454deca91108c73e96be559534959736ab82af477e7e0d2a32e300384f40ae4b4a8c006f1cca1012c2d0bec79788bd7a1fa3a5faa073e7836c674d49b4aafa75a124c1ae2dab5d3e6dcfbf0a289f779f9a452bcc762ff427a8ded60823251a472e33041b59676097446f6fcc49ec84026981d68b748c68782caeb51bdd2a9da9567f64d3366ab42f2de1740a7ec48273625c544b56e75e165658aad71acf1acce2df943b0a9ecc366c99ac4102df480dae3ff9f95d67d87c3d1597e6e51e5084ebe1fbfc218e0f09e8c35d398892b8c5e7c0abdb94e2f2ed7a641b784d112705efbb30e32280775b5109f161457c1d77f13a3675dc6f3cfb6c3a39f2ee5a79e73e5b2991e636d697a10a5a16d093fac679e46f8351c1e1a616f612ad4f0d0c482d88b822260a711e5b9f1ebe98602bed8ff0e352d87ca71691271281b34cb6ec91f0de8e06417e8153ca6d5f721085674de8de553335b99515daea0aff19a7844aef1d7e2aea1f4142c38edaeccd6f3cfe5bd90fe5d7193c6f8f424a06f7869d883d419255f6ae2554ca06e0eb8635f2e95355b43550180216a7a53010b00a45745c3956ad4922ce46c5e36ec8c2e4aac2242f0bb5b9914d18deff7af5d077440d25f5e0ffb7367d79bed438b0978d07fa2944942c586e0df011f377632994a0b5fae0a5a47ff5e6283460d50f58eedcbc26c6ff28e28dc875adeb1164caa90023f649c9dfd397f40bdc8cf620f3f4cc064e7013dae498682819a597b0de10c54f8c51e3f35cfa6fa12429e2576a51128a2856e5f33cdb5e75add2dab2bae07d7f5dd0b3898c943ad0480103e467c42febec612469b0f77a458ef98eee312ea57d90cea140c548bbaa1c8b0b328cb2aa2307cbeac368d47e6cb7fcb97f46b651bd78f2204c0c0c9b20d324681f53933199ef359f16f2177ac2ee91091a81b3a2f2d65d73caa87f2a6b0bce0451eb90d214ebdbe03888cfcdc3d061fff7f12601adc882c92bb014ef23bbaba0185e83fc13537a8a08c0d03f284927990a73c9718e2dd33af85cc08f69ba5bdf866ea044aa7c1265013983d07059c45e6ce78e55cbf6d46484bb5cb46ae3be9c256068aab52508d904b676c5ba4759e847436fd15098496bc54b1dda86d3b0566d99b8aa7241bd4e47eaf79df82056e80f3160d96bbc2848dc16166500439492f36554164e6ae50a89ee0d0d04c94d0c5d73a362bb7ec5bb1ebc3d93c71a5948df33873b1eedbcb3b9907c2d11dcf8a973348517468e0ca6e5a0e52d0e5b3296134033be3ccf7f770674955b2bd4fde1a4ec7ae0f36919f510c1016ef75d5c15f5cc2b656114285de823c3b587496f7b891f535c87d31f3afc1a89a19dda451f397bec56151db7b2c06b57bb37d26f41bb97b32b2d17c7ea5053f50e93e3cd63931dafe69586e0f7d18a9ae5bf1d30fd303baaa76cbe2874c5ff155fc080fb11d36ca679ac626d9a6270c27cfa69ea3e4954b7fcaba6070a7df2ba4dbf32f1530a958cacb25ad21c5dc8d23b3e85e551bce749c24ef0a2b6d935bf30b7ab0fec77fb5d737b84961014f2b0bde7af5228fc4bca0f6c79415f7c92da8cfd1ce1c2e729d06fe1c5bf755caa69bf2208fc1aa2c195827c4487842e9b05aea1bbb4d6523399a8698366f68d899cd67e222bcca7d1af2d39acbfdac1c539e0287893fac1ff639e56afe55dc18b8a147873c080100000000000000000000000008289ef52791f655e350a0d6acb84b7545ed9122bb81e3eb3a9be3fee7f22874a96e9f2f58316ce2b0ecdee424291a947809d37550f7cb081f96c269d9e76bfae4612ae70d574959d9ad8538dec07a2a4dcf8696ceccca0c1f622660b8ce88d10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049711acac4ecf648033ffbde64d5302d934af1b3f84b55a4d140df37409bd9c75a5ad87bc23bc33bcf50658cef6b258dc97dce534d1e34e46c1ede8268b879f9d0cdfa59559649b51e76625370ce1cdafaae9d91c90b4f7854abe4365a722abad38572db321a300feb753ebe2d82818d0613d998a21c151ea3395276142541480318723adf918cfc89d467e83d5c14f58e92fd8cd4930905e1a87d7d480b5b39290219f810958967c048d61e2839f2a4fbf31b5e70ffdc4605c85e624dd74e39721d0b0512bff5328b476d47cca72575bde59061af3d823eebb8f12e62e3971bc1398f98eb8087276a4484a2249a82923dbeba93d3a0006161651c3369f41768665a340221e6601b8d959b92b75e5303c9649a5a05b84b9e705949688fb18bcc5548530002298731b863b6c422313259732c79ca1f7d85d1cf2cbbf36933de01941d24b3fb031b308e5118eca33b15bbe43780b006d01c4eeea1e49822a8a925cc4316a8f52c02080cb7eb12cd028b152bd4c378e6a494a5b1386f8a5f7d842528547f8ea91e12022ae95f791abad178ed5664b90d3d8b7720de7f8c18323c9a1415aba4b1a540ccf2339721d9ee71b328899ddb623978688999feb826299c9250890db7ecc6795addefc95bb7fae186a50d2fbe8476b53730e1dd719c23804ad5a05a632b3ecb8d0c0985266b55f5758339e089335422f0754b6454d0857bc9863fff26f25ae34ebb2a79415c943b81367dfdd0aab5ac17e2f0d82e2b69e72638604b6525b3ae4befa79a1fb03b6b43a9db93b8be3d801444dd68140eb6c5d60ec2af0f568f4e47b102ed7e7af1e9f5437cb29afcca499571ec5e53bac2dc333a0029129d707542ad1131642c049ee62b3cbcc0ed49653a813cf4206c5410532ba636aaaa87c43746ed5390e1f3af1f114d03d19f2d46d59834e65a9633f24936d2570d7ae2691b7ad189763a318bf3d799bc3bac4b3e3ec65f64733e522e671914e0c3c83b4ac17d51d6ff413943b8163c73bbac0f691387c17a1e12fcd7581293a5c30ad4f939caee7bebaabb71fa5eacb94aee7d96917f6e43e163e37b2c7bcf5a70805649c30171753d315f45f4f6462c0181469bdbcf0ed3291921c0b6344fd97b46a95023bf6591cc19780ddacb295bc73e658347007336d777367708245127e6aeee4abfd94effd697c6a0113d27e84bdf3d68394061676f5839e335d0a43b1975001f25f8565ef6d6d41e3d9b1259a465e9979e5e3bb21c93e6e205eb37f84ce56f9d0052c0fa00746499b818fa8e20ea59b9afacb13382288134109485bb4cd8306d3871c1930e507150b173f5c32bef666ce67e5955d0ee4d11b61ceb0b2676091aab142d0422a57d47848d3466a6a76d28e3d3e5ec98b104f8579bd84144d2632f5b70dedf943c45bd018737a79b732dcd186318a0b1fc3ac8f10074638a31a7dd3a243abc8d33304a0f318d582c2a06a78ebb3d811ed23e7b42e5e6ae4309ff63ebc35f5a085d9f021e6dbf0ab159ab35a990aaa88dd744bb55a74e13980a570db03026f6635164f417896e530de2bbde698e8bd589d3c7add57576cda6068b76cc93d1aceb84a3d73217af89fd11918f494435d946ae5a44be47ad654a5f6d1ae59e9dc98dac150d0fd7badc18a86e3e14e219662e586cb279bdc73740f87238ee7f6786eb7fe81a014a6dc5ee2eebb91f40560fada63bb80d573901afe997264a01fbb9148a350695cd2d0603e35a7f91970595a6a5afc230a5523dc20e0dfb662d50d5d3587937db0d2ea48767bf3a1ee7fa1ce5b9b1edef32b96255c415881d2e31f645afd0e2eac8827d7736897fef34b0c0bc2c3586d3ff41a949345dec1292af989114ac502363e0086891e12ac8dafb46415517828531d336c3ebdd249b0422d6dd6b4c0d27ed6acedeaf28cb5d978b68461fce51c70528e3fa300f136cb3f9622fd55645e2bf1930a2e95eafd37281df5bf0342889823096c0c13b4e28e74ee0d37523a787a14585edf151415e0714d34d4f4f06222e72f9ab24eb34538b421d9b0ac35f5505a92394ab2d5f4aac8192a20c552966c7e7ce88793330aabb76d0b0dbe2d0dc55511d5a2ba08ca5eb3f24babd7acb4223b38a9eb70b469c738425a94d7ceda099c39d778bc6a5f25848e22e35cae4610399e72b6d465c2077ce598abc33726411138da05ba3d3e0c52a3ac8f71d57f2b75408cd748b2d0cec5043760824d9fa51c23462da79d8bb7052ee794c62a2d06bd53bd90942a685ff5a9a18051ed8809ae08424ef91f5f15583000000000000000006ff990000000000f827656da3267fabe532614a4a45a7de63d17da0551a00abe62b8213edf6457b90250560d3fc76c0f90ade5b0da5e3e826a6661e2276a05beab6849fd81e9b06d960c6d50e8c1f3164010ac8c799308ee1eddf3adfa1e1c7ba5132b4038d072f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f2506d15e012977c0053b776882f2795cd0a38423ddaaa8e66d81dea52713f257dec4282742bc02f2304257713030367da1f2dec012d78561e59635a6e468d4bd9bedc83c730a08aca128b1861da8a993b4bdec40d6eedb81909b34373df50c94194166f37b14f10510bb98719442035e495ea6a201c49923427186375f1b579022c45ffb769d58fae8bc02bef168bca2e851c42d3a0a6262a5ccd51bce8fc13d503153ecb53654c1104bc25abab970dcb198e3aae1d6f47a0c34d976811ed06808b0a05ce4fb74a6f8adf0947020834850fe9bcaceae64c52699e400baf77fdda864f684c914d1c5705dcd9a851d3191b7e32c6d3707922b798ddeda22bb0e657fd1902192b82f4e74c2e212d94084df07a04fd8491556034fe0a747c5df027eccef3b5022cf960e897dcb0b81bd3e45e9cfff160350d778bda49bb6dd1eb36dfef62e41c020826343dda60b2f5a37cbea6564566072fdd925ec2c94402a04e1f6efe9547b3030aa4998a6bb800d998fb8d2849b1d440fb535ac6512c0b034c612a7676c30fb302179694a2f129b06d91a0781656e082fe21f12b840aca792852c91d2201fac86d935a4dc31dfe14181341988086b5a2255e53f7b4e32018c28e3c5ae3e8b0d26e6762f9d3fed4b2a6266f5217284243c7a1bd7db37c8681532644f122d758e14d6dee896c8971cd5bce60c6caebbad8368f9d5cf509ac9249041eeaa3fa3bf3d46bd93e8a4f4e0bbc1d0bf06bbf86313a3300943962d847ce27dbb0a32b05bb597c99e185f84f4b8f3b2f6026fd321d1e01ab77811371c7967a962185f80238dffc2c99333779d8876ee083d245d8244a2ba9fdd94fe13b9fedc00740e04cc36553785889e16e9f7c54f6ce66cfa11bdaa20e3ccc63a8ff32cdb5c3a0c6cab5ad58d2dc846121a64eea83756616f53d550f43c9bd27a1287bb1b56937a7ffed53a1635535f2a6571a40c5340f3efb5b9a3130e51fe1ce416c7bacde1f36dde595d18b0af2beeed215fe3c6ac01dcd44475c2dfdb0a2737fc8a40e96797c0917d2baa98f581f53e1c49fc4d020fd93d819b4ebe1c2bafe22976cca67795560eef87fb3ba3cb0b1df930d7430f06a187f6c5aeba0dee5bfcb9ab66a80656c7ca6cc00c7e77825996ccb8261a548222ee54bf96f170387824fab3a1ec1a7424e7def0dd2a59c5ba64ad378ca24b9cca892239bd04b077ba8fc952bd4805e1b4624a83382390da5d0fde210416e7b4a11a40ff808d52d2b6eb921ae8c6ae67148476d60d78d85888af27066a7275f44e103c11537a19cab95b8eea93327243e34724039d2b0a4f70867e343d40d1357122e9a89a5a9e76fd290cb747566c1374dbcf09bb8550ec6003375af71ef074faf0a632317718f54bb31237120448597dc6b46789fba11ad4004080db812e4bd5790c437db3d34f134ed48f2e3b4f5c4b27292a2050bec1895689035bc794123d4c8ccfb04592dde291edce704f01d1678736d5782e7c8bc3853d1bb05fe258159ccf723621db85b2a67bd7481cde1cf676d4d42d2ecaa7ea98e55de4a526b91be482954ea778d819bf57a9cd92f5781a71b5c07d2ee8be5b790e5a944b034d1b85a1838e9dc5f1b247859dcd0b1af62a8a9954b7317c8e5ab87b6d8620e84718a47f4a965b9efe7011c959535ae27889e7daac453cc1bb503c8fc8b2e8c2308fa8c3144e03259986224d99de92e42419088202e80f434c8661121df53a99b506aa43e5c7f68defe0422d7387f9dacca12892b6a529c728aa412955e321f587a4c5d062e9fe7ce3e6fac71c1f1844cd28af602993df8f308e67b89818195ceab21c3e5eb74d0da6c6b9818b8caa43bfe29a5a5b8a4d9c5f624bcf574f805cf73735bcdf3f328f4254ac094bc0b0038ae79380590069d9c282ad9132968c3f4e6da4c8f790f8161549bd63661c180bfed5cb2a8aec83fda82a7f576094269063e50503927d79d66e42a4727b1b4727fb2f29cd3717413459468ec72ceb03ea553e7a1f7046d11fb5bd444cb2b735ee2edb1ada27b6a88dbafe8a753ee028988cbc2a4e9863ffe513f647a80a9f812347c09e9d4dd1540789d6e9dae4c0c0f3475dbcf98c122ccc64ea35530c95f63a99b21d7996c57043cf6eae705815bce1a7905a2737af28482c27154a756464772d828a3a03cf43255066f9760351a9b30a832b4141a72699a81630f73f48f8117069ee52bf4f70c0c20e2cd8b43357392b583dc3767d795265236133799b39691edcb0a48f4affe5102e7129b2f8543c513c76342a738414ab2f2448f1b3e7c7ef5264be21fc54e62c6e297e7a06cb41b874d09ddd97277727a4ecfdd3c6d0f5dc7b502bdf7c9db4ffa822af526efb20130e4f18fe290e836bcc17eea3bd2ec29cca49208370b60501e21781b7fafc71b04d1d1f76a04", "", 1, 1624702481, 0, "5861e491aec1b4512179065fc3d3cf8b99c1b6eb7c484c7fc5dd64f3f9bdc04c"], + ["030000807082c40304356c5d74b905591353cb703171fa81e91f9161ff561f2c3f0f0bb5a9eb7637f801000000056a53006a51286ad401dcedefa57b9cf4caf6118fb1c15c3a8a2f275d00108b36eb35e2567c5e39803601000000056553536351ffffffffb76751feb6bd5926f0465adc362e1fe83023a5a3dce2fda036adb22a696024b803000000007cfdbca6f0b0ff5bdb96344b2561e5bd23f2b94c7d629aa5544272ee17352f20da3cd2310200000000ffffffff0419c2af010000000009ac636a5152acac526a88586305000000000452acac5274713b05000000000552ac515151eec3770000000000026a6a06620a06de937d84010000000000000000e6ce140200000000912650de0cf4f231902c03c825a8610bb8b964e37acdcd753951d1aeac10e09fb87384d16a9712c477db279f6500b6d4c0547d495092a1002e42f9e4e8eb809b6a3c70019061fbeb9784767b03486a14e7b583a8512e800af8f3b7c80a22d37b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012c622b321aa1e443100364f4cad85990eac0b7329cbbd7bfba632df7fabb90b8368c60a2945ff8f67f538b3d87476e941fab2344279da88d84884e1836a7be45f5265b6c0a5fb92d3c502b0c968100cf5f581ca16c53121ce84ce6957bce9f38cb168709946b3c60a77da990e47dca557308e5dd73c843f92f3ed765cc215f7032e9088f03032f277aea1fa0974a5caddbe57af9474ded65cfcc730cd1cbac043022992865d216cc142f1024a648bc15bd2f91a51735c9799341fe27fbadb7bb7ae0a04ca22a0ff997be49c982ec380733dbcde186d873d6d1ed8c19f101b232a541573133fc0008a4d19e08a71541eaae0052d423fb2f8fffdc427e63cfd1efd4503032ce70ad4668ed2d6c0ee3031273a56416c707a301b524bef324e14fc4511d25c030ccc852e8cbe3a5cc7f71610a995615e6f8e3e4f1fb68561386ce12e4d0e56230320d98f0c6bcaba1b7269e3166195877723e61eb840b376057c3ad63ebeea4bba0313dffe89bf30bd2a0797eb42e5f190cde80e66edb6d5e3b776f172aee4c50b34023034c48369a0e3e464d667f8e740232489b3198096870b7c0730dc8e71e394246360fe9035c2a0e353d433d350dfe0bb63736a893310d8c7fea83e3a14b10cf6ea8768a4589dbb4d1ce7d772206243ff2e3eb0ad9adf4d9262f61be896f3124769a79414518f7bc6d4dbe2d17aa7f8f3acd7c079c49925b3751a86bea9f12a618bd42f236ba046b4612cdc18e550c4a0d3b3abfc08e5669e60c15bdec521850c3f35644d2e4e663213985157447a013eeaba486387e54c8bf967036246295a7214d275ed06ade9b236d40976b10f80a907aea2f2ec1e3d6bcefd9bfc9a5820a31d6e30d98964a4fdbd01ac8d2db46b10f770f267ee58726da5a58fa77892886b910e64df39a743b467a3acd7273d0dc1f4af26843cb390013de5023637dd0d2d1e97eaa4713e5e5dd6bb3b12be50a8b3558e4d7be8f7663b0156680345fa9476792179b112626bb3d3808cc0809564cf9378630d33f0a2dff73bac797f0d244b379524dacdc944f30ad0205e664f11a28acea9e6967b6b87d8f6c8a966dbbc22be7aaf22f9586d9a4379a442e6748f72edd5d3ad28ad1ebae4fe39b16e8c99e726d9997454c424d4fbfbecffb40e31c77b991bc4aa0176261ba73c1ca55b184279a925b99032adb0c9329bf3ed39ae4e81628d1f290acf2d64e38b3ad4cd976d5e511123e7c66642bf5e74ced761c72acc6cdd3df02c2be687711acd98dba810418563ba29e1bb69998083e3ca1488a4ddbef43350f81680b553f3a8fc55660d5dd518cfba227569bc53d6e032222cb9fd39d50bc8b192d7852e731c22b194c9d794d3363316013490996a5b98fedbda72b3674c987ea7b87123e7b45688ee94ddafa756072b70509679f4fe4f3b0ce0a549495c9e58544917d780646440f53997232ac03c235e3959ff555887d2f32231abf6bd5dfc415f40329cffb5a1b83299d06e283b9c438a0029b5c673182b6aedf0ffbfbad0793748c78e2bffff91f92aba6ca436d7e93427aced0869b56d413ffa316fe54427710cbf9638d79a938421321114aebedc18cf8c581253289578f8813c0cbe3487313c380ec375fd64f0c0eb56950ded032439448b6c5607bc8a47962a393a35bda63f429bafbae5c1ff776946e38ce4695ba678efbadc55f3189460a8b57635a844c79b50e2cd86a8dcc982f73dea14af9ff5aa0519aac2ed99affc3d2c3ed13d6d2883db2f917392958c8ce59ad3cad6be6d20bc396e1d3cf9a4fc9671d5f61ed887b2b457913d16a7c715900ad629a27249a1924b4a9a725dc80dc08b5293b0ba64219c870c97257c64306ab81397d9b90c4f333ad7c0f8f19d28db4802025e5eb084026520e7d8332acd0b4cadcdcf4be38e2b09787bf657989f7e28fdc1312d7896c8a032497a748ef4cc346c0cbcd4a69eeebab424d7e27dd114733a87cfc000aa9429b12fd5af9b0ce2541ffb3ea0d4df985066aa6831c4d0302ddf25a53c901a3090958226017046d6df5c437d483459a5e38d8e829fc2fca205faf3b246a2b0757b8ee7fd27b9edb5d00a7c9129c94cd680c2a38ba8b1f3b7b154dcc14ddf7f697a98e5dfeb37bfb42b7c2a2fefe5a3b4193f9aa577392f13320a6cfe5e796a557835ed06e6267da83ce01311c0197cbbb4e087103089e15a46d6e7fa16faa3d177c74612bc96e677a4d029fe22caa8d8eec79d05afeaf96a20f421a2b0cb92e95262b22ef78bb8804877f3f7d3813caa5802e64b0bd052676950a2d94977abe5e6fa0b10436095e686986e2fa278b0e92325caf55e1be1e10ece70a9dc91d177b625e631c6753e103adf8eb359bb73fcafe7ea53744b6d1b9fc84e3eed4e7e69893f07700d570bf2e576da0c08c16c66c1df13aff6e90a", "acac536a", 1, 912114334, 0, "03744471b15b07d78034c74d77b633a7c49e06756442d293d7370d3d9f5e7f30"], + ["030000807082c40301e41e3e68a89b0c92da14e3590e390e6669a46817f937b2e3478b41892e7d7c910100000003636a63ffffffff020a38fd04000000000763ac5365655263692b5200000000000463526300c9cdc191f5d6d96802bceb5803000000000000000000000000214b0d42945fe51ccd14245082ec73732a852dd82b605c125917fabc1e729270701785c40532fec15b247227f08f882750b381df2fbae0dc9b0ecbfb8f1f140a1304d51a788cababc7bc9d41d84460af454c05fb3eab2fc3224c69319210461800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b78b050cf346f6cad39080f1601bac9fab00fad0b6af6f059841bfed85fa94bebf4bbaae5d40e8dc16979451cdfe951ec63d2ffb0597143cb508603658713c006ea522e53bb79ed3b0112e8591ccbf809fc11d5135e24f3082f17adaa555c8117df080c759b2e77284396998890079dc5e2a8f1d92b12be5fdb7408f6b8024fb031ee998c3b9556590dc50320f176455fa713c2d6b563fd27cbb96e5fb29c0541c02267e0a574bed5df343a648df899d6221f8d05e0b2052654de0a75b36d0bcc1720b0519e2224a2954d1278c5686c420ab9d4270eaf2bd46a13acef9d2f049f7acebb05a8392e635787a2a2b8d26fff5f3be2eb44d82727e2e99326a7a4f4108fe120213c262fc11bb1e5a2d1e8eabe6bb54e0b9adb34944b93430f9e24d49857383170205517de066b26c2a82b70392cb025b26a1b63fc676182b0bfbe1b7379993e965032aec31ed7b230a5759bfe43b01683410dd9a0ab43cad6b5df04a74ded17db0ad030ca4100ccac26288b016329dc79d7c7fbe4ca9a2ae2063244eace93e0fe22e2302133ef3c27fff269ce28ec2c86738ed0ca836c43388b1d8d73ae4bd60228d66b9f5340e11814d7db13eea4c07749e1e1f263f32f61141ac2f6226a61d08b12701047bb17f5b2528f6c7e10db717ffed26e6eae4d76ab30d274dacb1ca4a8865a6d49d18780fcaace801cd57e7b48ea40858977de179cb85be71fa4e97799ef3638cbcbfe5899a7574e895a54a557cce738981a788fa4bffb2158577230dbb6d92ab97d930e5a25b04761ecc501c6f21ccd69d784b91a425ab4c963999af9bc516b1537ffca9abdf53f33f1cef53da1940a35164588516827e0444d6972cb62e488c1ed1ed2cc026709ad2824b6346cbb314c8a3bedbce3c2613603d372d8e70fcc8459bd78f460e59427085f74b537f0c2dfde1b690d786efeb15e46e77905acbf907f86b022b57f4e71a78e1e16b56ccb3ad2f6155be946b45483eaade18f03a6b30be06eb58436a820259c18188f885e0915922f53bc52c8ec104ad5f34bd1aa0926ecb03cb1f1bc5bcfbfcb7aa1f72e154bebef5189d28554e3c7a516ee498fd87b79fb8eee56049687a87ce73c894791f5d2411b4ba24831cf373358b74c28db1b25744df8e4dbfd2c6d962e0f3e7998c81824b500353b05fded9273873af7258a2f7409b68129b287429a885ee2d11ebb76e5794a18821c4717c45044a4cdbc3e1681c42be165676f5aa6f02b64d2e163701e50997556a42d1ddf962df34b52719ec8da3e3a2654fbd5e4793bb93e0b9223748572ac0ca2c9200005bb546447b51dc0b9a7fdcd62bbd4bd1899829e1972f41837de6a6ff0a850e4ba0890c4f52e7c16b157f9624eeb421f0fb14cf39969cdb347e48e05a496bec9a85837b78b6e0237fbca6a0ce2fc3597417b50caa1d74d31a4fb2f44d5ba00013cfcfef4597f6336903acd994477af0f7440aee5cfd24320b6e501808e8feba2bc5d35faf7ee26d6ee23aa9a8b3d3618281d31d925b7cb8a150b05aa8971ee2953f9016e02e10ee53cd32126b0127b285556d29da8e5c864f711b8af60565cc2021fab6bd4f180909548be7ce5e10deff92a22c85732b4e73afd7a21585477310d6b0e9834a39b5e2ff706fffc97c77845e4d547388eccd6856e953f3e3be2736abfbd1e0ba9bb78de2f413ebd8e4d1f4ea05241044be8e79299dd0df7b08dd2b280d539b8d0d7239145ddb43f8ec0caeac523e81de1cb9ba52f9a5a08939019f2633c98ef1f0472bf3d83ce90e74e8f6ece991a0fc15a4a4e3b344cb2ade300434aab1ace49058bfd2a5ed68e53c3b3e898c94641450545eb98c0bed4c08a46af4ba5962e2c25fc7e7652b4b4b79dc4346140dbfef288098f4b6acb738fa60b630e979fd0561380ad7968345994c499a10cba4ab6a84fd1971decb7593c9b4aa94df9b1189e47a9a00b3d34d2dab7d9bb61e2080302b71597f576d2af02a26ffaaa886e48ddcde38729d9fe4c61e789c57fd407669dd487f21d80e6d33be2c810fc274fde0f321a0854f20dbe68e82a700ee2e42cae1f26eb763b17dfcc31b417ccc39880a397b91e5170c58639e282dfd374c88cdcddd2f21fff885314b622c088003937e2c50b4001d166bfc1118ab58dbefeebdc584fdc404421435aaa509f6c17d35065593e8339739d2e23c6d2c6f8150e39ba108e723b48ab3bd343d75d2c6876e56d9a0826de4037f6fff0a1ef316a45cf6531f3f24aae35bd6e478820f61a3b5c970d8065e4423a841b15676da7f89407384d4a603000000000000000000000000f3eed2ac5393a6b86756c2ab4da226a45dd78158647ffb994ebc5802eef23e7de50288ffd08c8837ce0efd17f425171e3fcb5f14e75fd7935e7c15a58a5c9dbb5ce44fc0e3ec5b5a29f9920ff9462d1338d6bb3cc04de9cf2bf79deee94818f30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f5293aeca98c2df7f26a65db7be15158ebae8e25ee2ff6b87fc242d81f2a647cac19337e5d168cf17a6da1e2c6462507046014f325f68f0d5562ae6f76ee732a4b0e138459bae7daeeafd4d55e26d9eb2dd8e0476142f753d22fa8ac342b129e562b1bb86dcc18324611d0976f80642434844d5b7c9aa3cd670354feb07ead02185593c28002b3d22ded2c1003ca8cad7b22f09754d0ece52e8f7b0fc2607a9a031cc9739426ba6b2d98363f73c8a4e64775609f106f41270c2844500fcf8626b90a02aba10f35cf74fdb888cf11d50da1e23f21d67977470dbdad021de962d2e34eabbcc6a20a7d879c814768148ec7f2dbf137cd917963ea8e1e04b558929d03a7020f40b690b9d666b1336453d5bb8cddd02dc9751bdd0f3c9baf666f7f395fe0ff0216475c6d9734c0884b6472230ceafece5cb6f64e9fa637c3d35bf7a9f344a2d103242a19c1d8547bfe2331793ae6cd6b60b7e0644dac999c2141ca43c5938cc43c021d4140f188e26a2f57590c018c9508ecfba9bf8a6dd1820d2e2181e33cf8d54d020e8927a085d74f5aeaf8dc7c3add4070559cbbcc27b08e8343f564f3206a8406b2740d85f00f493b3e6942a42e7fdbd83c08a827cc9830d6a9d4977744440dcaea2fac725f925c40191627570b75eec3cce5174af1d9c51a9def0d66c5964a15ca1e9c91522dcc7f0f81bc41c34e365ce4a0845ff2bd557a2607d72d4a0fa073cea669c821044a9d4b8c6defc14d8c6738e5ef00959a9e90aee887c334377aa30ac1c3c97451002da92e46b5b91d090732af6b1d9febf74cc421752118475c336b2cb57ad09d8884c87f76cbb610425524b008a0ace1449b49478c38666fc2debb1f3a4624b0338c7464a331fe9609fe6710c1d4150f3fdfc2d0cf1cbb2339b00a5df22e0a95eec3df0d51e471154540c7e5d9f7c247829a51525b28b8e679e073893693be5c41ed2625a0814570d4ea2e582daeb29d5ac215e00f45f8ebb3089bddfc4e3fe1eead1f1215f02ee1c1491c1bc53a7426f9dda0397fa077a3d4c34eb5bbfdd95410312b246498893d9f852d158444223bd906693fe7f1722d3ce8cd49799586ca9b0f2faa0731f104f2c5d3c7e631a7b3e80d46877b488f0c045d250d458d096d2e99a3450f07fbfbd534ea649762b5ab0d2dddd65c4bd19169ea50437b96568832e07a8c5d1000cd0da46d86f304b67b64c1bf11851bfaa0e13a92b8fbc55304ec3e2ca0ee6d21621cb47e48ad5032d2a2082b08a4e51f3e161f902a6d88ce23fca955db8251f2fc6ed7a22b070b61cfb7a5cbf615bcc8ae080b63c3c5ae8f3cf6051aba2405e07456e200a0eb53c7b1af498046609fc4fb1f7c331b661d8e51f22fedf8bd8b357fa0693e22ea6df71feb55ceabff1cad9d1e0974de4ef1cae03f3ecc59ccc875a98fcbd7e31f8c01e8e759b44009d62b9f77d8e3746961dbb70e735e3a472747171888085e80aa1ed66fce828c80983a10aa47ebf5b77f609de73cdf0ea8ff3b220c5f5557b72b7c009cc805438dafae11e22dc127cb764acd90c9579491564f438532309452c1831a4bb8175419ad4f94433480cc9c257f5a6fb94634669d667163aed6bc8b536d28895f972998e02e23d2107f28e72cda9f1a6bfc5af94738ad9177e36fd953d9b069fc507004de3c8574ada8aee91498974eec37a17db952c4ee94574590551c3edd048b80fcb4fe8f699ef3c40d64347a1923c80f332d2d0522bbac78ec26e157324816f5109fe8dc332ff0cc23f0b518fe400516c1e7233eb8fd7339227547780aa40918cb6886583df3a098fd0948d50a298ac3c424bb28d9400a2ee1662fb6482650c063fb730dc222bc343cdc9a1f348fe871b54aecb482235e84eeac0d47b3143f8d963b63737dd1baf2e696cb53e62418f45575d184193d3eaabc48470cda710c19f2ede990099bc654c88c0203b4a54cfd643ba1911dc87b80e8c2072f8bd76b305a66486cacf0d3002708a502e1fbef9e6cdf4d543164a2a749ef5ece0eb8442f419bb7cc22181d54cbd4728ac8e675320bc1b8fc509edc732d9d5afb39a225189100de53fa3b51c24278d2835f55c851e820a87618937d1bea19c6557bb69e1eda5c339233beb966d775aa21a0afda34b58224870925009c1944586cf524965e98a69dfa5e39683e13e8c34381d5768cf73aef675a2db4ce4f6e6e0ec0ae5f45ed8536f756aa379545165cdd95269eadcb1a3e7c9b2754e25ac2b73ef595faf4467335a63f143686ee00362fb686520f1c9325ff5c72345ed5dc7bfc059fd59923c2f9ea507ef831c398789e7a8a9c74e15f52bbe2d40ca3bdef1d4cc8623fd67d794805017dc3bfea7d7927e0531fcadaf8b697d363ab01317de10014060a58f17ec1f8a3563e421670809bd54e3de4da2cc49592cb6602", "516a", 0, -114642225, 0, "14c75adf28d2762f4daa704685112081097aece94de6fd5ceacd6d7bbe8afd72"], + ["030000807082c40303c015f0ddd4a35e8aa135e081083a65254ce63ba08c08e6148a4e89c0c37b1d0900000000065200006a65acffffffffb55de27768dc9224fd06a69f1494d24ef94b82201f2da2a27897f62b5dbe31d6020000000153ffffffffa95b57dc439d67f9694fb45bff31b889a39448c2abec654768604c820fff124601000000076a6565535353ac16ebdb1002107fe70500000000076552006552006aebd54e03000000000200631a77145df035a99e01000000000000000029b88b01000000009ec9c2d9632b2939badcb0dc88963f11ada5fce6fae894fae3750ce5d073db179296933473be7e423fed5d59c62d1280dc58536bc411f2a4451366c36b421bcd9b73219b37d5ea66f799215415f1605229152be37d99d9c2c6c6a400efac546d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000551864f696f37b6481ac5c9c6d8ba719b8bca87e08d7c9eaeacb07cd5bfcb9f12070129afaf727a0d9d0de7938764733d4f183dd035c82bf5689ae6e22bb210cdb535e1b35960b330a56117c7f8a2fe9a49d3c86052a8125b74eacf26a69626dc731415a0861f3b9705586c11ea163ce7a687b57e626cd4100a9969c8c34533603132557dc86017eeb1b2357f4f702e1c97eee7797ce3262b29b1c08df96ee6c610316a8516fe50f3170d9ff02a045c04266d2516fdebe4cab176a58361d3aa2146a0a070263d46a2edccc4f86a45ce6dfd693ecbe82f363ce8185b46f465833bf5d0012f064cfe8ae34ab4440423ac455763b37237a417325d269197c6ed56027ba0602033db322300e5a9e3b1786b7629198692053734ce6e440d4e580828ed8eba6fc032d14b6377307e1a81fd0cb280c90bdfacbfb1169ff0d14c7474fb39dfcbda87f0302b15a162d9f1e693273d41d0eb215264114741ef0b57b56284ddb117d7030a5020c8476f84b58c02c3d3100c3f7476db78b71faa0f11457e077d162931cbddf42021d0c22c138b42425c711ee0294c718505c8d95220cd01fc5bdd7e000fb2279a54ee03da8ea986684f55ad2b6e669379114d400b0660f42ca1ddf8816e88feb8a5093979c892f7a2a22c85f12e345020d371b60206bf9654629765b4dd3873fd58464a9e307ad4a38771a631f87982e640de45bf869b1e4524d8a7176dbc24bbfab3751f628cb5a2787df3487963f8b56feaf9527e0fc3d1488508c5d8d5f6dfc38f4819311076c9c20e165b08cb8fa212263d2b6f25eb022b888a16197590208159128c42a757a50020e702337c57187f2821d2e3a1b0b4e2022df92c414cabe7fb966584134df4e535b9c4c578c180f3cd31d2b3b6e23cd4920a58ed94f1c843a6ef767193263734b8a81969c52c0823d9768579b7f209d4c1e3d6a57eff47802ddf2ea93d2f14a817c7bed7b4f66f582a61770e44f07f9f4cf5702bc0e46fcb311711e46449c59d94c65dd76a6c8147ca6fc654991be18eee64b1fbfaf005f4a355a9e66b7ca6a97bdd0b1e6435b8a56b2e22717b3c645fff918ac742551416c387e5d8e677894930eb9b04b739d67f05f39a9c333334e5ab231f437494294f869ab95d836d9a661e1e143d720d5e7b43d295e5ed2741485e4a3a55c98d0015ee78f2f860a0deb7824e550d0ed45dc75f94f88c795f18cf37af934984197bf7d7373729d5368529dc9fe0552dcd536e86528c7bff2651f8fbe04b591c152b8a926b5fd7a18e45086a62bfb5d4e0978524e62954fc38d837439a8f0bca42a2672786aef60d8932aee4a85bffc065f02b938d477cb8af3868b3da564bc0a9cfc36de8689eb70c998e71cee52ab8e58e5e0ea4391d7a9aaec2140dbe04dc0bb5cdbce7144e882b3f6b5fa4d324925cfeff2178770f036c746fc4e547640fda8458001019561184f4dd1e8c617e1525f6237ed59108e0ac8da5af8583ac7f185264b5373a07f9670c19301466cfd0e5d735e35d9a1e9e956bd382e475b4af4f3a65fbc5f394b168d0ca0e6a1b78e6f90da3ec95bbbc1949e8221c22ff3ff3bb0336833c00d58975502860313ce7a8b4c5023d86ff87b237672ba272c8d4b01002e675b075db1ad24fd6e088bea6b040f633498ad76a81ffc86cba7509372e4b55f9263ac79e48c06cc908c2d2fbe88f84b362e9f351ef48124de74d39893b78a821162715888babef251e3997b6388d656fbc07461603fd2f8079583ffa256c0638ab65edaeaf730a88dc3ab0aab9de3a1e383f47ae83c9606e244cc086d9b0513285bca5159c8e2986519d4376c62c7a2f222992277454ac8d80227de3003e961e44f5fb3db4617cce8a72cfb59652af3166129f75477e1018b2f027c09fc624fbb5ba6b23812c4e9c4b9c86fd6c7845ca6d5f37158f4fde9bac942d20a1c766fd8e1345466a12e7cdecb9eb3e7635c7b2b306d5bb79d84c1971ad8961e197ce1cf9c17cf29310f3c1993edf9a3a75b921fa442a33c83773701a13d649a89b796e5a89ce07f3eaf20343da6edd26fd7e88ecd9851d00e941eef804466d76a5728b1da8076f97bfb5cd9e47b5feb0df9eed08ea3eea3f8b41473a35e264ba67894bd3b66570f5599caa526d9b0d22567cac2b227c56d5ac18bf2f352321bc455c58c3146630762d4bcf99ad998c16fd85d8b5443ddc07b5f4de19d5a3cd599d28783e786d4e2fad8abca9d5c07239af3815a7a164132c8c1d3cb29b974815fc4e3964314d8f24f39b31f3f449eea76364d45a3484b1e2bcb8f79aafce9c5cc85c6c11f873708563c581730d40494a6d56adef288dedafe9ed258fc0d38a4a5d3385c1e0afe9681ffd9e0d7b03cd02e71f9c46033b94fae0de0b5e82a15a3f8f13522c325d976c4f9e395b2b3c900e02bc30008", "6552520052636365", 0, 884530405, 1537743641, "08a2d99a66a1f88f3d26bcaa46c6cb60c5cdf6cc273461cec3d7cf85e554b6c3"], + ["030000807082c4030126f607bfff0a911ef3cef4d6fbfa4a9c4d6d7d24d68e12c5bf31ca0dcf6b6470010000000363526affffffff014d316a0000000000085152acac006363ac000000000000000000", "6351006aac", 0, -142191325, 0, "7b69edc913efbdf8c52c11e6f595ad5d38bdcc05f69303ab72d4083f606ca215"], + ["030000807082c4030470f62e68813cf9abb97405d27b5a7f8229497d954145a0bc81e97682a18d2798000000000023557ab741d8721e998b0f3fa417189570d0ac9ffb2872447363865ebb09a0080a5a5210000000000400516a65ffffffff58cb950290f8f68ddb84a9f9dac0dbea41e956ca9c25a8c4d405b5f3feeb00030100000003006365c503d26f4034c32e11d67cb5ca67db2400c40f5099ce0c4934be7e68454619da7830e439010000000551006aac63ffffffff017868ad0000000000046a6a526a0000000060695b6a00", "006551", 2, -353673078, 1537743641, "aab64bc74942cc9d514be0b15918eef5bb370a5f97ba3ba9de8512626bcd1fe8"], + ["fe3b5e2b04b18ef66b737f06890e554c194cbd11e3cc3762923d598783415f11432efe1611010000000151ffffffff6912e99b38a73aeb7a974a78064c4d439148b5dfcac563337389b7c8c901bbbc0200000002635179cd3dc1ae63af618929c24b7579d8f9c7aa5c444c2e7312524e140f92824c6f05be00cb030000000151c9c404a860b346d38ee1424506e859e6b6b38545062cdba453add929096cb95050f5f21e0100000003526300ffffffff037b1b9a01000000000753516a51006500aa6dec040000000004526363532b30d0050000000007ac6363006351530000000000", "636a5251", 0, -760812935, 1537743641, "3154017b75fb74967e20713852dbd5120099140564ebfb8050b3f6c816745d1f"], + ["030000807082c403010e480791c6744c3564c4a76e4c222fa3a015084934d7d21535127389028c650b0300000002526a4c9f447f04cb3cb10300000000056a6a00ac63982673030000000000d0bc3401000000000153a52bf60100000000000000000000000000010000000000000000faceb000000000008b537116e0c29f7f8bab8704fa633563ff5a3baceeae4a25c3499024f888d8ebc59c9f62d8444139f2fa15865b2e145a84c3be08994f7804bad9106eb2837570e5c04fadc11fbeeca52198d2ef27fc1a2d4effe47b66888d76d285c7c44fa034000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006943d77458cc52a8b09cbed46e4b9d5800a371cffa47a133ee0e294ab23886fac479594df93c68696f12d965d75f616a500a2dae086c9b542d90ecf117ab600cbbf099d78b7d6340f3a098f21c036c8f73a7cce16cdc3e6d2e99aa8938ed1b962dfcae391861992788d08643e491940c3ee76e9d79033b15dd3c2cd896586c730223f71f45eb9a9da348afd2e3dc45d8991a9aaed88d456eb96b753c15f4651975032df6abf011e57a0cf372cf2da228c6ca935ff77ceac1ef00129facceaaa2cbfa0b01f7be9e3c9b7092941bbe2fda13609720be36cc807899cc4216ecb1738ea4935affd772c4ec0922daa2d81aeaf13407a87d8ed9659a7e5eaa8004090829e8640221ce4d487660340f7b9f9993eda751e36da69b69884759f94b066f6c765a0aa60313f0121811248e315dd04a58670efd99ad558d1e09404580995fe738a5c4cd5c021a8efe2031c2f00c3a4f64fc6a3f6c285b41bbb482c54502c0db62cf19c4b7fd031a6f2f34502607d6917d3aacbf744896f020ed533e9e14d315776faa9621ae21030c34935bdf1cb75d2839eac5bad1ca5930c068dfd218c44d727289d4384bb78ac327733b65bb2f0aff786d9b70d3c3de23d64a1d25bdb9989fc07e8614f1abbacda8c9def60aace70657b2c169e326e2cdf42f4ba8483abe3d27cc1c32c7449e0d8dc38c7e58e102ecb16e34b853a6e9761d6b90115c2bc3716236b280b8cedbb38c01dcd46347d225f2aebd8a02f95b9b1b7d39640e7c69ab2d1296f0796cece95ae414c1ec999010f495e959070f58e42b7a431bd1769bef22f8f7296ca7a4965608dd40d588a1b0c577d9fbd55f252c1b68ea1db63a7cfcafda0829cc1418ee37515794aebee2d85cd1af75cddf9a2d18fe4046c008485684e2956fa5ccd4be3d7cac90f18c9ca8556e840c9825762653a38763220609914dd9065b3de8a4d17f7d6d3b6f55774d203a2d80390413bbbb50adba420a9b221909c25a088cdb9c8ed7fa63db901579a5ccc42ec37423835baa2a3c158d7f172e66e0f6677a2fc83c30a4e4074b81353b5f0edf168d82052b83ecab1a10d627bc4d77eb263199039fd268444f305e247ca604c75eb899887cf420fdd678245fd2e39c7fcf49d68cb1100f0e3c4366109be707736a501ca1e07f516dfd40158ee18f8c16eadb54499cbb4681455e9476a7d2cc23101366942b58c3ffe99cd0a6de851109cd70e44ccc36193500f17251161af7b3ea4950062bb9071934d9e3f71588e061e4a58a4d8f1b1663b5a25569e687ecd6ea7c7af5a13cf93c2ea1db97d544df55ba10d42d181114e0f641e9f43ed8e023b7c3f08a8b305a1b8bae5b5c389bc5ad311baa4cbfe919a867adf1b40d402101ce9128704c76f3efa5641884c832603e6b00400504e1d64f3d41c7499303ee6a63d7c7bca21cbb4538981f0f1a9a4c8ffad9f86c612150b3965170735b90b482a1821a81a729f35688a927e080000351ac9a1cdfb66d78640d8180c5e96c5f9b51f432a230ab631506983fd2717520eec92fc1b61e3d8d44064eda7572f9e9aff6865b8a4d166e4ce289452a2d31244ad0845d1532342bfffd4ac25517b05a8ce5b1fc1f7ecddeacc888349c66e3e95bbd213c8157742588ccb2ba00f4be4063ec39ff2b69f19375310b5aafe0619f789f33d7768a8578b481ffb22e044d4aa8afc5a3032f4aeb210764e963912d3906a1f2379190410ae35127c51fd3f04a486de2c50e4343059d36b18fc35b913c7203f702d089fc717b15bcf87fa63c0c042993834d4ab105db79d861d2a4e7c0e1b0880f2a9a51dab3c376ada5ad5bdc63b36e201097b9f8248527785433cfaa36cc3d088e4cb2a0736ef7404a548d7d8654eba074dee08341ba891a0266b628007499c7a9e83220f7526862437dab234c3e7416069c90e45d3872e921e31cf4824368e1f388aa3b64f58ca5627408ebe082354244330efda742f8d45af6735e21d4889f4fdd8d590a65ec5f86b0f85a9575c533ac310b34399c06f3ee500adc96b5cce3d806b576682a2c582acc4bad69e58eeb817cb2700624ab846bcd9e23bb8685b04ffcce2128a7a9f471bf0e25af02abc747ad9871885c27f19b58ca88827b5183b81e95460bafc49c3c28c03a9db1861e72c758f15e6f9366bf2c6695406faf40831be1912e22d6800bb4ffd4231b394dd29060b1a3bc1a4b3a626794e1c78a45ee4fb3d777374a49b325155224c4c9b488340e9402eb9dcce1be1b0c17f83687ddd412378933a83a11d09d9af950a8926a8e797c22c043f37f54a509f0ed4324df9b004befadccbb6fae137de55787a67a5665690f398a81409db5d88e490c966df6eeecb3b58f9fdcb6954e3f7b051d0aab63b4bb62a5da312bdd19729d78b29b23c45ece60e3d07cd87153f4e9a37caf0d", "51", 0, -539949440, 1537743641, "b41b32d88bb0b6d424fabc36309d99b0e76e2d5b17cdbfc1a5410a6fd89b78cc"], + ["9f2da00201da9fbb7ea50a17cbea140c6cc5556e8a5a305b9d2e07b34ce54e302ef2c6302800000000065152526500ac01b2e19001dc4369020000000007536a65515165ac00000000032f226800000000000000000000000000c49ad58483f25ea203731c0ae17ce11293d7118dd3b9043393fce2b62e140791027cc3c5dcb208563e3175cdf0a74df81959dce44f40120fe8a223808672cedda98b66639aabef52b482c60e0783dd3dbb07754e0c0c6760ece32c63818991f500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a62b5e79023009f726e6090fe1b0427cf2b4786094cfff1c7c1e41e2ba8e599fe822f952fb515587fc7bdf1fdb6fe199f88076be45b4e4644579932312f15bfaf6c71cdc98a6fb0ca5cd93bbeb806c4ca6f0bd75c0e500e5209ef660a235f7b4a492cb98256674ffd40a9ced118465b4b7488ce3597cc591b4f0f896b32887420309553bb15cb7096a231da9c616746c6ad3212bae99171a4e71deb71805960939031d91824bf9424f483557438d7d88da94fd6863b051c1a0fe6564afec2bcfc97b0a084ad223c9564b9d31c238b887672aa04a1029443ce623acd26fa829d0b283239cd72749aff4415d27ed2cd37789759b110320f0a3e32c1ecfb2158ac2c1608f032676413d8fc76c395428466daf37d885e29e40c286d10521e07b975114d48d5602152e3f42a81723f04c374d97bed029a66b69d0c12cbdbc64199c6e7d8bf78a300223cafa1c3b4fa32ff9d7880ba46a783e947fd81993d24989b7c8160e7fff770303175679c8442337cd1fd3e97f2991027c1cf11ee67a590b366173e3acd02c1b17032a3f5cefb066f8fb1873da44b7ce7228dadfd7e6d46f9b0e0a0d4299c669a26ad9ab21e5f9db6d22dbdac6c92fa793d4da34cfb521d3e40ce1dc2448e152a34036207cc77401cbec948fda9a63a9bb9c3175d7a92dbe900c593f560ef6c7fcb723a67ca4f310e7ee2d1d4752414975e6861b2cd0d15f42ce2159cdec7e829a40daf7f0f64c62cfaded9a9eff3ac807b2cfb013f71fb51bf707c892a3a0a090f5b2152a9fdcc4ae39fcf9dba9284df8d08b71d21debf07c154ccdb74bee8a326b677559c397c83fe2e762cdb5789a6f2a168e59dcfcbfff5987569ff66dcdc6fc591d55550e33b48e006afa7252eb0a86517e6caf92f260dd6dcdf419e94cea354b9ff364b03744210b2612a1fce552444855e22c14a4fbc62c1730ab5bc56d51e6beb251df7e1c6a731f2c29bc7cdbcd4227e4cfd7e49381f56a8cb7d48ce2d94d67da3905805ed37964a76340fa5c60609fd352aab842160080bad078c133853ce1ac85e898e85bf80358b998829f6bcdd9ac02ae16c41f912a303c61a49b4bcd9006ebfc499584dcb9dd0233ae0d7295d28b33238b99b0bf0265277d0be7e5e768e0702374f5995cec07be1d71b4c1a44fc5174c9c1173aa8558f522bf278162e613f15a0f7b6bb02e76fbf34c1631ca9351c4e4a2fdd46865fe55cdbb6c456fc95eab817eb387ac856602a8dade32e5ded37508107828261c75f822a090e010bd928d1f8fc40a27495d6a55d8cb7677f381985d7e0df20d32170772787df9b540c3777ac5995760f0eeb415655e886f4ae878f4f1fb811e9cb1dd5067ae4db6f9d20c868a74b8c93c35ce413afcf0f9b6cd1a7f0dc65fdac6ea0f92785b71c43e38956545d4340cd55f8e5ed895ca15b6b34439cb0cc7f5b525961c192946dfc32415a138267eec89fb01a044f9e13439cbe8a3998ba86691c8fc5c83f29b8c42b9f55a781fe9b9c771e22f70692a3fbecb2e23c721676a9972c62fad18cfba82c2016d844a948aa480a52f29dc8ec3f79448fd01760d77ccaa182b6f29f9a6d2dd9a73df342f8b58a0ffa6737e546be1da8c2635fcaa2c17956bea9c3b62f1a2e8960c96d12fcd9e7a1e43327bda41bbbeeb795c14cc91105cfa5943a4fb909c7368b881fc033619ce21aa27bc06e7eb5437ce70ce1bfa32812e8f75be7a40a3d667cd07519dfbe3e48dfb285729c775a21f058715bd389dae453aff2184ee1442e552ba291eee2c0d25707e32016c8178398b79a4755a0c91e3aff57ff5c44a9264f01eafb9551a2f58c3286c345c5cd85f6bd174aada08e46271a7a93076d629e2c91d048bb0248c1a88deb604e7c7a9e6ac0b7fa3f1257810b5b9d9a14eb2ffa6e01e6231758843d4db5b15acde16daa017a83c6cca6743a2d1de1f676ed84128d27ae4707a03fdcb3947400c5de866c4f88631f7f70a357e47a2485db0f523075f7be5b4bc41fcbbc4b4f0515d53e9c3e67380bc50ef7dce7dc178bfeeb26e3499196943e9dd2de5e0a43dc2ef8c13561af5f3f3710873391392c6f0326fbbbee36f517f4201acfaf35cf1d457f4bfb1b36771d1f4519872c80977fa418e60d51836d499ebff4b64ea226e91411cacaf030214395a053cfd4ee6899294e76001cf53ee9fc8038e3100f7bdf4a9847eae569a745c33cc2b74df56e7a3d0af8c4f4ebcc7faf02b1860c422cc6dfe70433bc64b1ca0579dae46e2543344d8a780544501b40a29ad36fe9b68b636e89b0000000000000000dc990b0000000000414f45873c6f1ec86720420e69b850d713b4d3f8315c1c834615bd42e078fac7ae0b1b431a9252eb08808b700f39628667b617558647df1468a010e9fdb3f07d5a8aaecb7e56c9945c5dbdb10770f140efc88d5cd952404cd5b2f95ed154fda1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009de0a6c013233f2c9c3a314c9ebe94a8074df35a0e66f9c4ed4ef329a3d3e5b804e6ad71e9700bba829311c4d154ec4b36a70efb0142781256203292f916cb5f35dace115287e5da90a53e5522a5f06604dc8d4e2d9efedfc51559ec6ea99144b7482591152af49d2737d2e94bbad538f2a651859b1eec2f5cf71c389a9eedbf03048f672798ee5a0aafe6fd24b576915fa7e11f63df95622d63a2488d74d375e2032e5bbf1f3f76df6113f22bb45673482c58ed2a01f04b8447e16b49eefeba460c0b00601109d56264b4b0fc7ec42e7476f561a8a500cee539133c08018ba69e7004679e88c241fed05eae6e74a97b5380c953b5d572456e4c2510db08a7ae476295031b251b9164d4dd8bcc7dfe8c1ea1b4cb66a30d8fe66590e763d9e9e00a4a54c7021a5ecc88c23be53e393d2a6a81ae77eb7c0787c8f6d543ee12cf54f5861f443803107d1ef6807d7e7c026dc17a97124d325b842aa082f34e7dfc67f2da2bf07d5d022d4d95a8ba55fa3c71f5d148e1f8c5bbbe6f040e42985296d0f85a22362db7a9022becd4967a2fe1ff81adabe3d24eaacb58cec223d0a3afb35ca34f563c5fd227c66aec8e7659135bbf2fcfb740af9756575ec99c1068d57a5449653b1898c3a1d8a48f8a0be51d1355f435fd041d5c41ec544bc933e728fc62b089cffdd1abf04dfd4fb8c6b4f1459247512fec3323ed0fd0b20120345a47aa8eb690c3b2e0a0b6dfdc902d66cd4914ea5475a9b8f12a7b387368007eb0e5ba7859d13031c9ff99c2ba6ce5dab12c178f56efcd1ab0a69db374fb852e11ba28ac8fc5b96bc4bf3a3c478f6cffa90536f7cf025dda37a257be5a7500f84bc008100fa2ce0ef5cba8d8d847a30c968f992b2930fb1ebbec7c66cb6b4323b61352c1e8fb9ad40220aa8db3c3472e569ddc35900a404d6699d4d8fb3a19ae410b823cd9342eac57ed135a3d3f62915763de627f04569a5a32798e3f38a28ec98ed4e49bcb6b0ba7d97a56648571917a6c9ed4cb8ec8b8e7c2f22926d2d7fb07ef2e4b72e21257c7bd77db0e06733a0b5df4310a3221b9d51554309342643c60e7c072ef2310e05778de89e3184d4d69b8b59503aa23b74d72737dbbc3e8527f6070ff3124c7ca9c5459041ee5ce29da0e48d90cbdd055869459c269b15b715b6a42f6e7db7b4c48c1c82b1d29dac22f7e27f001e3ae0ac697e6337d7b5cf0634179139a249be5719c3c496e55428e80c2e108c18065feeb174ec358ca85f0fcab348bda58e0f95cd11385094d6a5143c8614bc7114d3addeee9ade030308db30f5efe9d7948139ffeb85128eb97a3bbcb6a449229a6d56c6255228be9876e15fe7e22898e329eb41db8c764677817be4737b56a3c8e8cae305c2c91106bde4b4b189f603fcdd0f3c127ee3997cd38c27e70c60c0baa4eb23be70678f286bba3b5d7b4389ee14a9a691f2b934c8f4080e79d560302065c9404082fcc5201005586ee97dca2bad041a7117ce5f1fa12e92dc93269348493e53eef1ab387c6cd1eed12ca9b82faf68b16815b502773c72d34916a7dc2298d943515e4b6f336ed9d3cec975f03639ca4ea4edcf1b6314709748aeb81f8c77f00944e994b1afa8a60344a47123b2e91dde93d30ce682626ec02b49c6059574000ed6a9659190be7991b4359c3a0dda1456da1673bedd963c5a1a46c24b44d1580e986d85e0a7ddc9beba63548d76fd97290b5484d48610cab5eac0644c69cc94055ba984cd43d8b0972877f2811e432a546b72cee2127e9ab93283a10d164a65a0cfa48498a1bea8853b742a0a63b0aca2b86c5ae8e9e0f54b76707ce855d956817a276d177c7c793b9a77e561308789abab3a08dc59abd79acab0072a17095b8f180442e5d6328cb513a6f44f11022332ef58228fd0bfc07882de83453748db12e6346475adb1e7c03334fbd3252551208aebfaaa6e830b61554b9cc6f989b96a260797cb9663d3dda386d90ba3a7c8a879b8ceb8c32298d992ee2d2423c16a0b303aceab3e1e3a6e4e5ce362561c480e9b2be529bb7f91c0e15b19d5709b3dd43f1dfad2b2cf7f0e13b764a9dbe58b4ea24a5058dd6ba3508693176e707170f7135afb326eedbd448681c1b612c478cbc085f91455a5d30c2f6460fe82ac2e79b56b1188e7c3514c8ed8a37e55b31e98aeda7c0178bc48a44cad5060a4be51a056372e3e7f5e91f812ddc7af833b3dc4232a41200c38406a2f135a3ce549f067e677bbd0644136952341ec6a70db416d9f6cc9719c786fca027b3174334d8be81a8400000000000000000f1e648050000000046268abcb2b692dd725a958a074ef030580588e5b91e744d8ce6cff075bca3650a3b1eba653bd9c59f6005c7e69df1b8cef690fd87aa2bafce424dd9d2751114062d6b5c09c326c370e645942856bc9dd0aeac83de3deb30b84559d8a1f214c400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dbad189cf31edc7819528e9b49bce987cccab2842357395898c17d6f12a9b76d3371c546368bb44cb87a2b454d14a5974f74fd57c146414c372afd48986e4b03e8b42e472be855af420cf2bc2697e1180bb351a9f4340481c37c04b77924f2bc783701fec954b645104af5c96f0bf72513977877ee48446d58b11ff4de6927e00216975dad2e85ea7836452d7ec68bda1e26237536d09fa2d955371e496c3f07bf0310895a43e334ed7390a0bdf4351c56933ab730e6e81003ef136dec22d8155aa50a023de68f99b23d6dfba652bb4cb8996debe1f3883adb9be6935001b64a4172d031675fd4a3dca89e1570d5ff0c42f3a6bb337c0fc2d966167f04a2a2874746830324f7a669c5e9d0640dedcdcbb79b0d07a51ca8f05dba537c8bc1242f042201e903198df3d15f5723fc12f5b910167012c279a71a552c7253a91b752f56ec4a5c7703172ccfd698fd685c674cd4a66844aa5b8e9c513a3471b7d8382e5ab58f2bc5ce032308bfb449861f8952942ccb31c38b07b48a6bb3e93ec115875c009d723616580305d23131aad77aa555bd8ef2a0f7c5938302fecd0e4da6dac31a9fd949a004f8fc3cf74c097284fee4f691f192018057687324f8a8eacff7286d5cd6b80fa8846bdf94f1f18ab579d32bbe0ba8bbca24cd313ba526e20e18e0c8a79a15547845b0ce0d627355859c53464c5ee3f7979990f719e89c6236e22fb323a984ecf4f0e13ec7ed600ba47d84e561bccbae5ada53cdde6867f1f55a324bd716a6ab1f7bb1d60e94e6ce38a995ede37a02cf3af4daafb1a4e2aa311da36bcb6a940c1f08d6b97b4c1b0b978838f8a9622bce068d99dff003d35ff1d56f7f50dc0623f96e010656254c69fd10bcf7f574d5fe3cd288c475ed51cce6ba951a6345afec8ed12d4651ba498f235a5c6f5ebb73de24e8ce7fd2dd524334b38cf40a49529031e7213f4561a08802d826f37139fbb3439868bd4988c26c12ea3e0e0b1c33b54c37a578b187efb9d2f1d584a7ecfa78b025f0319d84e72ab1c519a505b70e7a0a6a47e984e9dce15e425a689f8140dcbf9a85ed7de80549329d811dde08d207b5c78f30dc82db1314c0c92fe2470e94b0c63ee97cd92a7564b2c4c1c0f571fd864dd674946c065735ccee96b5763b4cc45198f2ddc3a1681985599417fab2d6d49aeeb7380cbce09e2c252ecc4840530a82c9d03765ff7ea84449e6137fdf9f99cbbbf245b6dfadb47097b5aa1b389c4ba78be265d997c5697a404f319ccde9257566d43419e4f202877c9ce295c53c2ddd5d6256102de297e1a742259ebdb1671b07cbd356293672a108ae35cff8440d596302416c0c852013ddc88d1066037ff57c0cfa41cfa1e39ec513e0f83d430f37702532ea46bd04775d57aee6058d68a0b1bb024dc080a2fdcf20f14b47f66798fa921ddfafcbb3cd3592b302c02001a15c68d30d7e0fe6372c9684bd54ba86a916af06c9fef63cf15b67f84b0ea631e75967e78fd607fec95690ffdd807ed3d4a4a7742f5c978fabd3f26b3fa439214c3195e199f412dfdeca668ced82f29fed779ea24482f9a654aced47fd7d14c53ff01c396a422d8ffb59ea7eec63327c665f3ee19efb972509c3ffb133f91c5fa428f102aba3feee847572c5dfb6b43122f6d80092793d498c9e9cda789c67a90800047ae047169f5c5dfde5d25d28379815f6554f19f8de4a612923e8d9f9a01cdc32640553dc9cfc67fb9da6259ce95b288a151bb1c921b190d6051862ced4e4b293aa015f26098fff675438c02952ad3b1b01a907afc429f07f1a3125da53a34a95e1eed2e0c996e3ba8bcb23e00420c871769133f156bb525c0f22dd61d8501d8f4aa77460eb743bf237aa1d5c48969fb89bc4a812b6fc14b000255c30203e38f4475d33a378eb89b985561cf9a60c1e1b3caeeed41670c8776e534430f7e9e2391edd955dad49c5ef90e0d8c46d8dcf358bfec833bac99337131259929db142fca1a5bf494b4c4cca5c0f340b7e0bf67b3e84ca3a0b9d2f0b90269c083e8c6aa4bd1d1ca62e47285fc34331d72fa7904936f530d503e1260e4e286a49f15aed8d614d44814082fe4b25a2381538ef403881bbf74d125042c9eb986663d658771e54edbf6a6525ca6593bb1a4a59bf1bb79ef463b502164e24f7e73a16ba2356282f76f2906cbcf11827b6048f4e3081942cd6bb254a213c39ffaf212d5aa501092f2cd78308aa4c1f16b702613101ec79979d7dbdf6dbf035f6e2ea82b4706cfcb8cc5711af2068aafbfd1c1a6b432434f0777925a053b515c81389803b1968673692bdb7760086b071fb33fe3e7fbf813e2a490ee7f0c322467748d3f84c284ddaf7c1c9c39b8ba9d5e86fd310ef3e1c04c4b7fafee286d0963d455286f62f3a09959b966ffc36a4c501dd9a51c8de0c", "636a", 0, -584490157, 0, "6ff7e51a7642677c41bde46bb71fbeb043aa76af0225f797a0e6b2667e39c767"], + ["e6ebdc6c02415b2fb27da57a28674d3f42e7a6bc252bb0e3862038008da899e35625c12eb5030000000552ac635363c1e17b8be8bfd00c546b2f7cb5f2f4aad3014d1fe14612cef1229e16af85e66c511509ba02000000096aac6a6353ac535153ffffffff030da2de000000000006535152636a633572d7040000000006656365ac6a6ae24740040000000007525352536300536dc25e020100000000000000009529190000000000618bec0783e662c152e90a20ca7a1f44eded7c3a5115d57e99b4e10215fce5b3e467b366140b5ee514016f4b462ae13c0eb6d1278abaff95fd56bfd5b8c5bb66d5f0f292dbf4b8c7d8c8c62ea66104b2339d0be49d4f420297a883862bb7bd3200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1a45d6dcd9783e9052b1422dbc2f415f2de67ea0e3542bc0ad24a71daa587cfe14f212b6ffc7325aa83cdd4febb7ad5d62b4f7781de69aab844b7ad3967e39285e24c2084587f3f1d63ae497857015f4fe22fcd0f541fc9a722e14601ef527e3299d444d1b0c642dc28859808fc9fbfb2139996eb5096d5c32c974722451a33030214a8960c92c6e7d5da1ddcd3ddbe365bbdaeec0ddb8ab005120c620445028203065e9c695c5772f2fb0a913ace2a77b379b84089557eac02e676de202f8aabec0b0315e186b1241594129560871857991c19a2bdbb73b9ffed407483bdf5c0aeb6533376b0b9f40ed06ab8e3cd02481b755c316f5362ab569a5f056bc2df454a5e031df72550bf7b56d2728e5e746561be7838cf345b3c0d9b00a273e246449a7c5d030b13d3598e46b1343349e8833d899a0c5ef915077b0f8763288c78eca0d9d7000214196e8ebc005495cd5bc766132bce710605b98b1d638f22bf8dcddebe06f457030d497790b0d23fb1abebe2bed482d76418b99d3b56d10cfde289ff4d1dc2c09f0304b693c785ebcb61eb1da3e21ab2b109be757a730ec8f84102349d4a4e965e47784af66a354012b649d32b2320b9edb5c363ce71b971ce0e7a31ff3dfbff05e700debedbcabfb15a062f92c46b31535f630162901b9e1296c3fe91a5f3fdc187689ee8bb04d4302dccd2406c7ac579ae5c8cc5ee6ed5b954c39d599c561ade8a56129f938685629c6a2375337af9ea09d7a0f14e78ee81256d077aea856d80072c845f97a0cbff1edea3e2638336bb3b22545fea11b8f9fcf8b43f217fe522b73fc95a606d7b43264122e254ebbc33521551a8c0465e3175f8593ec7e3b293ee3d3f549611306596b3eeaac04d3c520f4a75f2acb3f4a0893900ffa99384aae96276af51b647265a9e799b4e73f857c23f137d0ce1d89eab0bcf3380ab01303b0ef9c8138c0a4cda68a0e6d36393e91b698454492ba887694734ed3471364c90357143ddd90ef9a2e35603ee9a889f977f69f4987274e6ffa0dd6b9572517fc6214fccb60936fed8c3aba8c2c387048c284caa11183bb9015f0e1c4e3ace05838e8383d15c37ed12e5fbfc804ae1838b1f6bbad5748f36ee27afb435c40f00a3e2c2afed723a06af7c8a3dac2a00e40e3de883bffb6f7f151164e1cc3d0e3104aa9e2596045b9e47be94040ba0f6f8f7b3b9f522b98a350d22bbd32016fdc5985e6b1202be4bd19978a08df8a35e8d97b7a731bff0551ab38256ce06ea5f3a493d1d94a7ce0501956007a0a475e53de70fda38ac954ec17008e92036711872138c05bb5b88e5643ea520135b4ae10e8b7010c7abfc23a74d84b4a4bda054513c4d156578d5963ded66f7e079dd9e0163fe990c37f6ef671594b2fed532ddefe3eeabcca6d1628d4e0603fe15ce2db9f113a629563da6cb107e7f71010c428754d0690f7130500cb0d0c878048e9e56d2b5b8a9dc061dda3ac8e49843a22f2fe3bb66b385e493bed47c9291505bdfd060162606a8437d3ddf1085df1f2d3c079b3fa28dca1150249cac6610b9072bb1018e5c107a9bbe42072992555096ae2aac35268a533d5f00596f78597d5842de8306abd86d2313a1e314820cdf4e5f6a537352741f81df39f59486bf123b21d4d835c2a0f0c6932f9f24e947baaf23658724309ed150b60e28d0812c7c9a0492f65d46b9583f3af35f4500d23c966bc97f621a7d4de1f6ffb8851c8bedf4ec20699edb51554910fd7c3657de967a16c7295c8318863aeb492782fe87e60a9bcc8bb08c8c92d1d0fc5ff1db05b4b874d0ee1a20f26366969cb2a4672613574d43f868471f0f2419c625feaeb09e09752e0a33c95372ec06ec6aef5e85a4aa755cba32f0b4f46b7886eebf5dc99730ebcb0ae4cef780e23895964d41f9405531c555644a285ad8ce603f2720ca1a91a1c3b5bcd2b5fe441e7f3fea7454f0d3941ace3836d33504fde30b6c28492fe91313ee4c29afc5ceaf85f4ee08a693b2d2ca918901d43526228409f80b297b38cee85042e2828439b68f9edde5fcdd562dc432129fc12669dbc85f77f1015cf0fb2a3e5c996ea52cafa36c68f57f281199d7e1c4aaf7dca2fd96716ff2618e30cdd4681f4c8da9ef0e5bc83735ac6c1595acaa63a8397e1f20a0da1b65b9e655c37961a51026f831272484a931c4cc1bdb39af350853650fdb39278b2dc17a6df1343705c87818854064022beb2e97a20dfb5d0741ddef247a1ea867940463183c9e51f9407d9fdf2871fd5b3be62d7859c93f8a1c7c54e9bc3f2fcd25230f0147feea0814bc2baab5d04a8c1725f439de0a415f6437ebea906e0e2929bd1ecb645dcc6e417295ccc5ff1eccbdc0b0852822ff64717f889dabdc7333e4c2b9d3db1a547a23978932168a144a7cd4ba2802724dfd09", "", 1, 1326535143, 0, "820c66675d2820b55b7602408e8cc7674b39e9caa2af60dac41e4461ea270449"], + ["b981b0440243c5047ddf3c20ad8277d0cfe588c6731ad05d923691a558a2150e35920f0d150300000000ffffffff8b3cb7b0208359c903d2784c1dd211f1f2fac9f3a01ee21fd0c996ea36796e210200000000ffffffff020bdc3e020000000000b57c9d0500000000096a655253650053536a00000000020000000000000000b5aee20100000000daef86528d83cbe2e6209163292e31f9fb812b022ee68498a2c5807c43fef1ede7210acc6d85e279ba5c95929440f913959b94e24d9ccde30a018bffaf80f5089855be605856f6b858fcf0427a70e6418e362e5adea7ea7fe740f28e93c7afe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f341b52145c0aa2c0423286abf641763b6c3b47a0f32bbf39e71bee79a637b3f9ca5decd9b6c28d27420215df33406c075f87e6877a7f2d087a383716d602db1af7b5f1d6be831e5c5ba883338931a017b99d4fa7704d83c12911c30fde224f70f25e5435e9057afb32f774048a12115531084a72fc94a2c8eb29613810dc3b40208e1422eceb1834d37c2b60f96b2141f177ec4e63e5dd6dd1a4b21761b06d731021be0bd49c6de687386d729b1b577c0b260e27d2fd4b9b290fd020fe1ced4b4ab0b01e4c221603c2878d361decd7bd64407c172aef5e94759d3ed61f986053bc1596dd3029b58195ed4d802d8625076e5d985567ecfdb5dead9294ec07b251fc4510303c0ccc8cd9d0b2437b60d38f2c8cb9b1a87d22be18671a95d0b21a709b972bd03273041758b0ad6ec68ff8734bcbef99d384443d2f3a9f66d43582ff787a13d05031c2ec09f175a15f78b59442244778f7a2fa2493200ca221c9d06466b9309f5c0022bc6285ad539f8035b34d2c755fa9875dd2558f12aac8bc18dc3d40fe325648c0224aa609625bbfbdf972e8396938bb483a7129bfda69d95cce80e22832dce8ffbb48b60270421012d1089862945db2cdbd4dbb0ccaca5e87ce2a4dd0f5e93cbddfccd4eab92ad02d074f3d70d73067baf989497cd4548adfbbdce3b148c74ff9ddf747132c3d9a9285dcf2461c71662a8c94e35ba9c40af169390d1d4833c740a7ac742fb031bab6237ada8423ecc0a405f08b4b24072b3205435a46c3a907d12ce7cb3da573b5db52353811e1c444192544a355f47094410fa4cbbce8c327db05d42675e351c7cace35e8d8208c73a76b2bd3f5cd7d74fc3c1da773af9d097785b521ad9cb34ab51f877222eaaf37a78b9d6540c54bfa3a0b1d651609c64b2c12539e9fdf7f0f6adb2cb6f72b3cf1583d4adc53081ac348e446f67c038def007a0a8475708a2e0c03de914bc4cc78e73b3c0a5488a78b9939ad3e0cdd3028b339b1fa85306ce8090b515df304edd10bdebccc17632ffd267dec9b4b188aaa1b2fbfee3f625482e03acf701d3962b22241ada13af161152baf31cee09d1e04c0a172bae5a1cb16823037a0e18706f5d102699758ef692ee424aee6f44d030b9c576e0ef88533c8ccfd2af723ebefc91feb74cde67e83477f26b3fd1a3a19b942f0e58a82c17b26ae42df6c677c8819c6e759d238439824c5de7a09663b95f161667fbd510175b3af07c957e273de1ff42a9859902262774c6b5a54a463c5ccec432460e403d04578f3c7de8116f33b5082e4e6f36e9b79b454915d6aee95db79684ed9feca51ddb470772467fb4e251b71b4e26201c404ce3a4aa407e47251062e049e00e777beaacf4eb1582d6b4f84c0db1118024e0870b6d294c9a4d1b7bbd49bc1503e841404da05d0c494605c52b230d8501275c5fc3d386592e439cd620a0b8d1d3567bc546a08b01aae263e03bdc5476857fc92cee383c0b7ab11205a29222a91474bb532453023952b5f8064359b0e20049285ddcc14e2f3fe37943db7f5ded9a9e63c095c93d7b16811aa253834f5c81ddb5c11fd913f0c97abb9acc4050912db1cb5c65df87116b4869e704df27a9b61fa808ab5271cdea29d3081799cc1093e9cc2fb7b3030c7aa6b4d11dc8a321635c336afc35aa0d78a5a6ac5e5b3234c0425521cc3a8adc12df2d9324866c79c08b46e9d96caa7ff9bf44ad19368d91d364edcd9400c8154dc623e2b2770790476ba7b0150def03b11972a0d57fa705868c1c1fc5fba381729894bc52d5f2b822bb7411928f6b0570787e00e43382189dea1334a2e136d2e3976d7378355328616ede4a8a1841796d3977d49fa79f6182ef8abd8a989db2cad1517f4300c97c1d73bce70db6649857a4d8a286ea808f3500ba1f797ef86373ff7a68770ce001cfcc8261a944b7c9af28190e0cbc469076caa318e9df8861d30589df8bf1393731f23c755ee013006da7e7242d1d06be47089fd3f6fc54c4737d6f0902e273ba505b514f40e49a3ba6bfda659c39bde54cea2fb80eb6fc1e75a97b95e21695aab5fac278c2ef8e6383f776300f87cdbaef73b99f5bcfd186751c916b65bcfa29b9202162fc01cd0efc3c5a3122fa13e22da25ef059ba5507240f1973fa8e838cfaabd4d0fcecc99c1d5d18114604da9677d875e2ab3c98643603e4a1b7b599e3ff5442e46d47ccb928859d555f9055b3a3008fac1cd39e7ed18457c338519fdf6741fc2a45f2658006119a57a8bbb08cc75f37d89aabca952b2f77bc5b6c546d8e9000000000000000000000000000aaef51b80af393dd8da5018bf241f9ab7cd1d071eb7afa0fdf119581cbca745716d75a40613a032b1699e9e01522506eec23daa5d5ade086c1473bfe102c33cb5465b6bf799dab981fecdfcb12c801995f30047b38e16915be1ccab4b158410c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d748a61c533c269dd0ba568a440051e542ec88ce0ea23c83b8e88271db7ed0b90e72281adf7752c9511df730cda54eacda9684ffe8f8cd56e83b5d7a4d78d415260c1e5d77fa42b107041c185d17b4b40968a9082be90e6c910b5bc96077b0ce0232ef3a7eeb2687763db552829ff5d70926734a66738bfdf2afb1063187b690228ad63b9b185ed105c3e18f88c29cbefdffeeb4c44e5208981f4ca86d3c188e3030261e324febc669aa50278dcb6756229843dc01981702a063ceb2d57e68ccbf80b08452ca8d95e44b7295319877097456ed19c1be42c23fac7e76de5996042d52c6e1f2044d082bc9fac3eabc16b66efae59f70ed65fc6e40b48ea2e90e13f2288032484b6774f4875bf86c0f4737b244bd8b94b8e265e9cd3159822760b8393fc6702252e5920e809fb03e22f70c6e0fdb1d39af8f0a1805b19ed35ca5ba784aeda780311a51451e8da2a3a98adfa1f485b795ae05c91dc56e0404f7a64c2102a3a35500313eddbfcdf7c7c8a39f7587e984a499cd42ae4d54d00a808b78a9a3665cbd10e03220e13dc98061300c72bf532123f4f9199b52bb4e0b3f0ee2ec7e6324a9f1e4de64f964ed495fe4510b32d3cd96a86d31790ee04687cd7cb1caf4a4dff62d7a0c3dea40d3f82a086bb8849ac47f911a16b486adcb7e65bcb5f9023544a5fe3233b6a48da9a1eb3ed10ac4b7633562b6b766db2e5f31bfe3a171c270768875f16e27a532e2f493f04596c19eece5ab63ef110730ab14d539d4a83f105a534ad521f555325e42c4c5695232466e42283e29f6eeaafd7d78e40307da198105cb798a3349b6c0ab10a29f16c0fc16cd0fb03551cbfcda41bb4f9d325f972f3535521f3f0aeeb462e72a7bea733e3ba5143cc8c49b277cc5b3e1f63d50197ace33045fb9d4c0105096285c1b84d7223507737f5f35204c16e7b7b8c7d7352df016f437994cb6d260582b1082e5cb996cec9af04ff73508edc8bb88979691a01c5d966d8d6f0ad9a15c943b3b16a7d3227ae1a5e43950f8a4711792bcda3468d1fd91378b0432a95dcaa152a7ca070a0b5e20827d57aa16ee6d5b63351d31cd98d45a7fe09471e72a9d1b8cd3139ac54aa74910a37bfb8fdd6db342e819d5793746a4e7007166ff3394e4f30caeceae900afdbce3a43906e06553751ab415817d614a815bf657112c6032f7e2b064adb8935798cdbd2d58cfa1c5eb5c660cbd396a3630e657ab50302d7926304027065693d0a8190c5209df4f61dbbe783c54e793345c614998b779b619cb63a719ebd9ffcb3f813a569f7e8376adc08c896354ddee0689cacaa9df6c32e469789aa8d52972598cc2d5316c1f22b53637c34cb1fd83de5f7a8e7d50257cbfeed2e0a489bdd78bb3bff9cec33cbb3f26eb9a5fb460ab3ca4e563a1b6488df12dddf4b4548c7fc78f7402b6439c214919be915533776fe82290b1869537f76bd0c8ac823841001c2d0da04d9fb02c0a11ecb9e1e865d672eacfff448fc7c09ab7b16a45911bd9760584133f202af14974160207d44fe724c1b7b15ffb548bae9b7399d73cba4b5a53b717c45fb5c3827fa92630ec9b23de9b1a0149620ac75e155055e1d2b5aa4d459c37ae7ef73d5d60d2bc553dfc9880250641a5503a2387b36c27f06060b9b4f3a51504a4e039ff3420285d272995e8c5616e56f69bb96236eb1c506a3be74cc4c21619e4585217cd8877e86b8ffe406349c5d021dbe513b804228664a6dcdc0664c09e8f8fcfae2516f9c679eeb22c1e2cee882397c12e98b7fe2d61780a608687b551269e09de1515543ca9ed98df0a8820469ecddf338c7a70e842ea9f53528c72c557e43fba590cee0b04574cf753a3efc3f9d8520c63080c12ac4a8b4be7cee695161b7ca28e2ef1d886a7499d7034ef33a18a80791502f7aa20548f8533aff64d7624c108500dc0ccacec025b980a49d904022f3be2bae3d0d40521b227e74f2dd68333e302736fdcf1c51600b3ad5fa531e9c88ff5a6b0cd4f4d596c76ebdc42c1cd990574d26e439c24d927094bf3b6be64bf29a00d2184ec72a63a65f39a6d410e58d729d7ce256c470e11394ea294e89f879f0d4b4efda28109c9696dc7d3e004222f2f60420b4b493981460f7b0aaab784fd16805e3a9bff1d742f17547eb18d5f964d94ad1f4e2bc07e89474aa448a0803ba95f6b08c636b810815b303f41a01a739c2c426d2608f33d532199c86e7fe9c9df00105607d5579f62475ec62e6104eef93df6b0a2c0205c01ee5db87be51a08cd929376aba55079372c3664deb087877090c8f48d445ca7f7e5d0654e082607324d1211890bce56c83cb981bbd119ff4383a80e2b69d474e44cb5725bccddc9fe8c6c3a0727d5cd3637eec5e747e5dd6dc026950159ec815f66a2149d7cb53da61c8fd3382dc1fe508", "ac", 1, 2133401921, 1537743641, "44580fe456870b7e196d3c41ca28fd4e87215128b81c409d9957e19a19b42a94"], + ["1fffc42f024d5f96155009202f270cf30915d62caf43ece6f6964aedb0964114a71b9dc40f000000000652630000ac63cf7e14dcd821a84bc53c5c6d5141f152348bad3f6192e8686c2bbd5679e8cd8de71b05500100000003006a65a009c12804708fb2010000000004ac0053529bdcec030000000001ac9d2a1101000000000652006563ac517d52260500000000009930591d01000000000000000056fb020200000000b779a7a3dba3d571de333876d98a52d8d9ec21e1b9fe9ba69eef686dae347ca358bcbd06c910585e27ab1ee746837bc6ae07f5d379a90d4fa7ebf82ea09564d512c907a13fe802dad39924f15badc937a9005238e6b1ea35fd4688f50e10b5c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000736138f53f41464cff13ebee666d86556a02794671141e48b9ec80fcefe37a160132e5bac72733ebf41482d5a392a6f10d61ffa4e8c99233541bd9edd1abcbb144a16d12bb0e0fe8b7150fcfc680e9b9439a2adfb634b04839cd9a5a222ac9597ac0b103745490fee4c23487b0915f62e4403cec84c7757f91e957e0a1eab8fb020019feea91cdc75df091675df58e010d780fc2a96af2454376a29113a56cc72e021035e2baa32f57bf7174b49e71fd25d7260aa9467b1f64e69d4344e838a0fbbf0b08a9ba7a7be20fe8307a4afe8e674b9bc5a65efa39fd889efdc6d70e8ff0cc89ea596abf0a9cee8fd06f2d9bd6454c0172e364e088f66691614c86d3bb3d763403238ed84a52b8355a26daca36214463bcdeb694fab79c4bc85ff526e88c9637550211371c0fa00d35aca499599d207f7d3a2849c414b29016bd6d69f858bb6fd05f0302336c9cdf7e4f635627be64e1288418c4967474d1fab39fdafeb6b6cd18bc99022fa22cdf185d5d169e515c8d9e483ff9800c11dd9eb002e303d7d346045b1e690311505ff392234b8437864a57f33c20b460bf1665263335025c51ad6a3a9bb1ed4ff480a45cb1fe5ed9b38f40a9c3d8cd4aed78e791d2183a3409c4e98c1f548af91ab6120b7373ef820f4cd656e5c45cd2bddee57a0d0c62d5c1c43405ce782559761a11f33107f6dd96753f7707faad466b616d2680fbd410498ab96139e39fb4afcfcf1c05362089da661d8e17742de4c5654b1645cf13632c09dbf00f4e577f842c639d0488ee3929ced86f42e86b277ffd9492f34deaa4dc28cddfc6dc7b489dab8369e09967d3a293eb2ad78c361799af137407bef9f63f459e7c2844c27cbd90c9ed35abaf6a4e8ed44560eeb0fc99563ec7ad3e947db9978a7aef589dee364cc6e1395c1a61fe256a0f57276aab28c33d184486de25e86ef24f73a58cb1929076a3d938e6ff43bea12ab6f16727c19217beb8140fcffbf5889009620607de4728bc5015ef82ae1d31fecd9d9be7a945683482f8c195e487e9626a480779ab83f4447015a486d072bf85db352dc552947427a0388a587a14247c876fa70f5abb5fb3294828359edea69cb4b41cced8e85a80dcea521edfb1edfa32ed285612426bf37c551af8d03678339698cf1071517e90c85d6c90eb6512e04f4df1a83be66f194aba328f8cacf9dfd304dbb6ac73551c3d9eeec83394900c4f32691b3123481fce722a20ecbfc43b781fcf0cf5f3c7b1f04a661bb153795506562595db930a8a5bb20684214e17175797cbeffc0aa5ca4976955ccce1177a40846b0507273ef771fd9c6ec44b0ed1ae99d99f18c544c9205e1dad8cc461b5b5a37f474fdf63939f56945e8a0c81d5adb0aed36bff85be53e2b3a0c96c1bec0299d44114d677c0aa7bb7bf43925355484bac143446d7682bf6272f43d85d9b965be375b4db8fff259c267276ef1bb2cdded726d04f12171abd36b332f034958f37efd2a3870a4edbcb76835530c9a1e9be5bd9922cc10b4a0c5b4ecce0480b41ba5392c3e329f69334b2de4b0d6c1668e74bda5ab928c571acab85488eba3011d1c275f54d0b728f0808c8f2f364bc60560cb29708dc5a2a7edcdf8034639694b804a95bba9cb07b26046c9f31873b16961334149cd2804db665a3ffe37e5bffa87df78506d71e25cc39929b05e0718884c7c741513f1aeac9d9d9a37eb1b27d8bf3eccdbf92fa2edcd298aff9aef1a1bc7687f6c4f2b589a86c582a3ea3eb98cf8b4e7ba5fceeb4adeed62cbc49ca27b39a44c47b52857bc6317684515550dde817f22d2c8dc6ac26b485c7d940248322130d013157dcac33fa4e3a034c796cb8a3f10eda05d1425b57b046217cce18df9447ed4e811beccace219a6ac44171ae9c7e9580c1df6cb13a020a87988f5ed196119825130751b1b6cd8e0d9cba36220615cb90176301cac31b934e75fbc28860d7aa76f477d5c43db8277a4b67f47e041edca24fa4da863b8b463c7f14b91ab4d918e0a1dcd37d525ac2a6290f01343a7bdd4ca6378b4bb3c61acd0dcc118306a83e6d6cc307393caf3f4e44d2fc21c6a533db5fcada6d03a4de692cd469f1f9f8d9e06ec8c67c0ed97ac65351af420bf61e15f7d312e1f6eed1f93c171a434e7a22e329010859d481e868150f3e2f1adafe149eb422a9e4fb4ca1b2c539895d1fc80de165a61c1bd87c95f6075b2769ffef5a45c3a93ffe8da2766cf74ffedb62a4fd0a58f3e8dad7bd31fc42b2b883186585d5cd75cc0039f8ea712e43175a19f23567ae45d5e20b73a35d641fe8945aa8e786844efe478e8ba9cf7948bc4032cdc299371657f0fe7998911d42bbb9cac69a2b9913c42060ecac5812160c98e09cde85599d53c7c3754e89a8143b3ed82b5641ca2eb5458135d2a755fb6ed5640d", "006a6300510000", 0, 1859829999, 0, "2bed3f6da8056338bb041c302a48d6f0be911503faa2e84ea1f3d01e64b4701d"], + ["030000807082c40303788d1dc8e742cede463e295145409130f8c17cbd86f43180427ea7db0d08a13400000000085265516351635165ffffffff03a99d5242475619febfbf7cd23b65349d72bb243f2052c2d5c28a773d50fa3a0300000003526a63ffffffff460becd654865372faa6d790f208bab096a48debefd2dace375d78a5e521044a0300000002516aaea9fc8d0434a4d4050000000001ac92bf810200000000076aac63635253517c173b0500000000025351aa308b000000000000e769cd75f226a0c400", "516552", 0, 333701990, 0, "4eb9dce384181783c902f41c0f978df197de9791c67afe3f61d41bac72118fe8"], + ["030000807082c403011bbe2e5132b1b60d288648cba559cfb5618ea2e2eaa07773055d6de130c8b319020000000952005300635251656affffffff022d77b501000000000465acac65a397eb0400000000050052656a6500000000f7941f6901fc5f2905000000000000000000000000892e08667e501350dcebd08b5e43ec69787abcc2df606c6fe1eb2ed025f9ec94ac54413f7dcaee4c91e83e323f8a9493cdb93af5a39b7def15d31b514a4afa89a276a85fcb77a23266632a27ba0e19883c922f9fa823b470ada9c4de473d521200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d59622991bce72a3c7edf8b1a6261514d7251806607c5bf0b169a41bdf8b9298adb63d9c8a89e73510482b5e310b9f9c83db593c925efd429c21c5d8d2003447e388eb6582613c422bda0a879627a732018dfa68b8475f1345b3ebb868652065a94dceddbc2f84959e0b71371905e58347b4653e4ff85d10472b70b4240179fd0216157459e791e23b4a113631e87ac08c36882a6c1be514ecdfaf3d560e72a264031fa699bb0a491eec5a17739e7199d5c7f387de5e04b3651e9d3bf7935d6455540b08baa7463f6718e6b689b23c7e62fa2b4e68cfcb0126d076f3e36f3e7abd6299266b51a6f0f78634b4b5d919560c52c0184ee780b28b91115828454bc1f0ca67022d988516b883c712b6c452fcd7192cb0a60ab076f905e55873ea375c741c2e91020a1b10c6b2c640711cb81faa1cec63642ee9beeb0f359b53bd02b9b24c64b7cd020956c70110de84a0f9a87a03c01a8357032b9b105bac11605df3e40de56a47990304e92c1507497780a5a3329589d0bbf0b164397f66ae2fcd4494d5b9340c1eaf0207baf3981a0ba294479c693ba1551ae2a0a4b9549bac56e648f6edfa7da8f138fc603041af66161e0a782e3709b9c0ff9f8b8d882e09a269876c5534ec5d6756b5f56c0b24e2a1a8508c7a816a02f2b3778c7fb614d57e5fa1bac36aa7b7c1ba6c8796fa6e9b9cbdbdaa335ea0385ea278fc9c2b018228ac80ea65c10f9388c4bc4223327176aa15ced7d6c0e59b4d2aad91bd8279bc835fb8174c7ba4614f4f5e43ec3bd3523968565b40b75e960259f79e07d7375122211a2bf99330729539eadb73c0bb2b67494746543afa3e6c5c7993316350fb57ce24353041d685e328e10d4fe6bc0cc8807dc2036fbae20e0ac8ae3a1f43231dce37e856c017942a40a693990d9c39b3b3da647a7c4f0547e3b0d6802f5f62e33d9220c3b108d05a05d2ea5d9ff008dab1d36670cf6afe8a93f0f39966533cb21a6d69ef41b7bef93c2b953e387e0dcd5709fd6bc0a5a5ee312998887354543082921e487cedff5d3945b63a2120764543562f3d9b804ca94b808b9cd931f00bd96cef5a0a48418691a70351e41af5eabc96ed4d66cd7d225bbbe4fa0daaa365ddf69f24305751020d81116cb200a64fe6d2ada62d85c4d5e9ae788ea038584e78af6b8bf6fe3a94604050ac6e3ec2422eef32a3ca3897154fe49f2ae2535bed8aafc5f75df6c4df75c3f7727b717a96179cafd550b99ca95bdf9366cf4469f5aa591de248102ed607f0ce244a622e50e13bf7650f713924b02107ce519538e182722b2442a5d5debeb4c6e8c4d8d4c36e9bfc74b5d522cbf4b620c6f4d54b2ad779eafc749e09ab3161f73e7d31970accf18d744f53c97f5cce0c3ea88557e5bc5b449ed188f5a1c3a981cfd346e0b1eca53c8a25670aa5153b14cd09f09066da309e15561ac95103341bd0de712afd5f97d2f455d9950ff5a1b4f4e296c446f2e189114f9ed4aa614ceb0dc417a029b7d9c9e30fad2fc0d0c4331f77aaa55065a3526b6a720cd18b911333b062a064db2eeb35e46d99af335e0bcc9a7d6125f84cd97dd8884f3d4a2f8261034906543eed6c5a95ebb6736b68ee7a1bfcc0c74d01f3835a3c98833ce251f3d5514e821df6d514eb90f2a49d5ab0f80bbc595948a1ad05316920317af189845234f801820606fd3ad1fd30c3b5da5f7d37736c7ec08d18f92184e33509194732052d90c8e0b51c82ed5a8a4d245c8078fc3c61ca0fb82aa0bca7c7d75d85f805ba79dbcfa26a78ed1f1ac8204ad99460e19b52dc8e20ceaa19ee23eb3b2a24f59eb35f2326d2887829a752192af7609713f1fd49e1e7904f05651529231eb7895e83424d8cf07c76f83a9eb1807d038bc326ce7a5b6897fb0c330c3355c736236ec480a71c0dafb556a4c944e4425118b07b65563a61e3a868ac55377f9f6f12253505e3fef42a72e0d105490b2afba2892d69c92363522cf134b05b015098d1241e4dfd22c1eae7e5a7213303c75d4a1881632bdc58a424964565668520170c7fe54b4844f9a11159f062cbf0cf1ca0bb820c44e1a64ab291bad7aa42c98eb6e9a626e102beaf5d555baf4787123e39102d803ab2cd5d102879ff72fc4cf17db78f4034441c61706f476e255268d24da0cc35c989b2403157507623f59b3f3b9447724157942749bb0d17cadc6710645eb2a7d9302d7248ba881c2a1e5e52d916d698518364d5a52f904a4c969590db6a68743c2abd697ad0fb998895aa1ee91f168b553887a24f8c0936457367aee2e60876aac44d050c2fbbee6fcfda4884e6e6ad2702fc22e7885502bc14ffa05a87d53cebc3a7d32074e8e15695ee4fe912c49ad69add31fbc2add0fcd6998b44e39cc8f844944cf7323c6d21516c9680a09285c6b72176939289efe97602", "ac65", 0, -1949763310, 0, "798eb60f16a09dabee5e89ff9242110c266cdf5b1e86f4741c16bd5169f2c661"], + ["030000807082c40303b561ca7722f41e5058fbba86b4975184000c7ff79c207821af027d9de95f518d00000000025263862a2d3bb195392f19e4a3a0e17447e729dcbc92941628c30493cbdc6f89f25a69a9842a0200000007ac6363650065510ad8a3e29ecd0c3a061c88b1ac8a9128649c5dea78acba00f659a4034f3a415212aecbe5010000000163ffffffff02269c000500000000036aac0076646200000000000265007c5bab9400000000027d525d02000000000000000000000000357137489ee2705383028cae3b2146cdb0bb96e51ee3919f866459ebd642c3536b4b21aa1b2de38993fb327a77fe717151c84e4cbd0cdb9ccb4185190c680533fcfa9802840dbb11ba979acdc0dac2a967698b20aa1135e4bc80f98ac929e65a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000099473af4c0b9c9b6f122c065db4d7aa370ad99dae883e9949c77e5faa1cabe63f6fc01d8e01eaaa723bf3f5558de0df53172697fff14cc08b161ff15df31813a2ebef9396555e23647672c299e850dd1fb1a5046bddca6fb25ddf6b551ed26ea2c238fef2e334c680a75b408651fa23ce0d3529aec31cda32a07698693262db60221a4b2c059ce1d67b56b3c47a0fecdc7eeac420540c035bf2af84a4885757bc9032d1348670194e6d20326d27765e32e4f6cc13bb3ff6e24ce07a1a99921094dff0a0516135870faa4f466abb274cd84752958f20dbef4e4cd9d493b0439c845d222eb9752ea45e93a27cf0f3cd2dcc47b8875dad336320f88a5a11b266e9fdd9480022169cc1571fe3aee26e600a4cdf332b77cae6163d16db7e15090726564ad8eb2030292d252b64df134bd8bc978f1ef42d7bad0b8131f45da24e6cdacfe6b421ca7030a78670c4eca7029df12b7112bc269b6d32fb6c1bed1b7b9272d83661af48d49020e9d13342c4664045f9ae814295245fcd95f22a28f1be2479ca02ac0308938200216f27141d3bcaaa434ee7469a1094d9c652abbe045f8f8fa078e3bb8c70a6194bc8978aef11155fbe7e39fca06d0a93ad7ee1a404535744b67fde99a5698c8b164e5874f92ecf3c500bc0c557cbbb32deba901a6c7760178a5b1d8939ea3e1215e3c3cb63b36cd079bb8dafd199d4f60072e14600c0659f7157cb6ac7f3d977e53527d9a934b2ba9590778597fd90b4fb75a34417f44bebf2bf9f0ef7814a5debea53961285f038f11773297360a71d27910ace00aa7ae82406cc7113c747fefa0c78d0fb857d57fa3ba06e07a2e341e0483789d387e0ba3e39bcedd34e634d5d3b913751f4e611af76bc370c610d3c68cc7fb141be1a232b477265078afbac94c002dce837d3bb10f9392ce2a93b1f7b7c02ee1f1ed47235db480d142722b2a105cb4d21da2211366acc60531319ff943ece40265397dfa323c3bfb8933052755756900aa0400e6cc2850904df77f31ccda6842515b67b65cadd83a1acbf4058ee1b2d71e2798459b2abe5d967dfdce445e15eba197d7e949d638c7390888ec87c5b21466f9adb8ddb299cd9b1e720cb4ad780b5192474b0fa56d15a6c88b31d7ed5cf89938649e978e596a658fb76c6adfc376d64e60cce22f04cc1a8bc8cc19a538b3e89bfec65d39a80bf8e80b16080066739cdc2a2db1b5b76927f33bff1a17eb26bac68eeb9075c11a202cd12001383615e22b240ae14611ab79ba09ddf29515d76779554f81bae367463ede1ee23540261931d9d608951c685eb4ab1f6b7e08096fbd8712f9c509ff896ffc6dc53abbba6409a0a70d2c98b779baa9075b1c7d3b45ac2d230357be3665bb23a86230434c3dc131fd816fcc32682f6393509835a7b3f7a0b35b4a7d4fc150ecfbc3a09f8fadcc1cd2e8df0873c490608f9d051db2f20ea530b4ffc3290f44714a5398c62aa84332faf0be8ca62aa91754fc502c3d2e67ca38f38fa2d9013ed36a453042cfb0a3ddb5b25a78ecaee36b7b5beb8d1191aa19b7349f248051d299c4c8335145da2b4201547c806f021aa648b3c68955e8723342f098e078c9b3d7e705e6bb2d93bc700812ef9690120075cd5b2ae738e6a33a13d85d8b1f3109c20cb53b152d16171bc514bb2705ddb06d11ef1119e1bbdf0123349abb70e7b4c3285fdfa412b3dbf8bcfbb5d226bb62f177ea0fa957f9b415d3150bafa14a4a98e6f943f4074478689b3afea753fc788aabedf47c26c64cca8b8f1bcd8a7c0cb34f5a524b69262901affa3409478394be1774c91f951e5e88344e6eb1456516f5672a848dfe77461b5452fe377a28a36080101145e989feeb98b7b000c89ee61574a29a1ceffe2504bb1037c0bc10d6d41992177ac65eec3467a286cf75bc06ee91c47543a7776533c16e3e85c3025ab70f5af2f63447596e8e85f0eae63611cafe51a97d862906832ae3802d72fe059ab24190e72269e7635154feb52555405591043c4b3f8c2928ccc89a9e7d2257c0771a3f58b2f0457ec97b1e30906c8261c49fe9705bafead70d97075eda38780af9f374da829967302cd4485b802ebe84735fda3f5114b15df82aa9181046ce4b652e807514c7f0d88ca4c94fda13f76b75ae3b27c6907152d1361f0a9734917f6d8d4916a3e169781c9d92a60acbea404ce33760c100e361fb0c94ec91fd10d1db913075ba13fbdd9bd76aba7aca119796c74e005eb91ab57641c4ef6945b67828cf8dc1e1a77f5d0725cd5b8d20f35b6f5607dc1279030000000000000000000000000942fc3d8529e323feebcf2d6e8d615e917157ccb189addda37f6d698a178e5b3436bd170ef4eec2fde6253944c9b2b0affa582129a8b41cbcf16fd01961ca39a2ea1ff96a24bc876db76fac0fc5b10b13ca11c50f257397838543197d7240df000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007d29690fc55ad5dc705d8c5c9452eca07116f38f821d7b9c216c3e77916266bc3d3d0a3370742cf5af3a016f33c48bd0d1567b0017ec799692d3d15ca31b4e40dda619515c8a8ac8139544e842e85d58b7e8d6535f928a3e2c55b10b9a134ef9e0669f2aa4d2f9289e94447d1055a812de99f667329185d0ad3cdf07c4124779030ffdde74c7337041670802b86de489c3acdcf727fa4a2ae7b1c3bddd74e2d16d023021f1063fc025f069e580b7bcbdb75f2e126ee9555db1e82f138ea33986cb710b04341b4d961d2013c3001d80bd381cf86fb6b8b2ebbe7af953067320df4c954d2362347f62ab9054eb41ccbe71fdc88b88d3cbd278acd225d78b393ad17d09fa0209dd9c8bfa0b4244d368b95c25745b2090a13c6c88ea7d25923001f456201fdf032a61e56f227f0a4e15fa62105eb64ac23546a6ccfbb4eafd806ec18ceb65f1150301e7c361fbbba09fbdca02e3a84ebe3be5e646079d09bfa424d1b5c6329990290210feaa1908814845ab11b3faaeb67cc477153ad7e721ad6e0c044a83dea08383032f735cd3deb5fa502d5a9956a8843d50b55dafc9c7b9e94c7d0a6b29bb3b4278f87750db6de54e7c6645cba6bec83a1cfeeb429643bdd6040f666ba40585b000f24fc0ca930ea5853188507b4ec532c2a7a739a5f55bf231b855659b5c60ed473cfdd15a9b4c381277730ba79c648a59f2cde6583b760eba2ae9c34af7641f22eee2c300b770b768a131799ddf9090d272b4c74716ba26e8e68907142068ab0e08f4823e066992cdf2b4cae6384c13f058a6ddc1d05a361bfa88ffa98fe39b2cf2c8062e5d7291c1015aea390f468b375f8c5e635099dd74967b63b2a677e02d6ad2e8889b800401fbb6f432699bc7b19343204ca6c610f42736368f0f8633061c0a25aa73be49871556dcaf81bb1181baac02419539b0374674e133c34365ff8fdc0d972f03659815cab22d19cf609e4f8a06cd063e0fcd8ed46d6ff97c0b2edd770c79aa597428666107960cb057c38fa24db4fee03d8ea635b0843f309b0cb40044551a9162977509954634c697088b301feb23b10fdeb20a6acbba5ba307a747faee2ce3bf7743f4913bc1db10eaef9fd9637c433fb3bd3c9d8dc85f0b819e0d074ba6c606026d3b33e4cb788f596b16a1de5b1ebd410ee55ed4416e2b2803ece1e74bc48daaf23edd32153c1a1cdaa7a836e574d738373422155209e72d83e94a7d693e92f9368344d478ab09c57074040693ba02009f9ab8b1cd59b4db40106a544a97ea8ecbe1bdef2a374ac6b6c38e70e677165b6ba2d40afbc0eb1d6aed5be8519b7139fcb1f1a4309a06bf760171244f8df41dafa38933295eca20da5e72c076a62346dcea2b6f9f1066b7845afaec64aaba904dbb5028120085d749b953231876f79b2ccc3d4be8aeeb85cd10a948bb32460fad71de19d69febea56607378c4012b1245c613fcfb085d8def4aa8d495c1e52cf0a1462d6f30abf8539d5cb1357cf1baeb0ab6afc76b5a216a956f5c7e346f0b3d9c618faa30cbf39d6903f359ef55c2c6261f1c64064cb278d6a9f8de9e958d273563e0be3428ff5895be5ebe59d3729d2c2320321ca1176e99f352671f5c7da44c64da6a252435751a602dfcd10ac6a1be19c1c334bc82ea4ba29700ab1bc27d6d57217576cc7b2e35b341ce69fffed6600bb4ffffb8147e646d81e9f2dfe12adea89b0481f1503d1433f944d891fe38e149a6a06078e99af9719d1473b0c42042e34adee6d2fdc697efef6f52e86e6e2ffc0457116f0c9801b8d2f86611d7311430402690177e43fa33cb9fbe7da4dba35ac80bb71abd272598a082e15b62ad5cb749b16334ea9f6c7ac226979e310bab08eb33c35e3f2fb2b5bc7f0e5b3caf209ab11fe3731437b2660be18a7db38706839c62a2926d7f26decc35749d03b89806a81ece72786b4c546379df4df9fdc2244d0916ff284a15236927a69506976f1a71200296500dcc8524b3d92df5e71342002bbfaa256dda81dc60417257f30ec0092fde226578ddeaeeb0601dac85c26b1cd1b67b5476dd360faa2a19bd9dc64a0b939265e0b47bd77668ba3fadc56d17f5462f936efe900bc9dc31c0986dcc77e801e850517999167ade7dad96a4187b55be5970707b8ba62e44381b7247f19b109741f8124a2cdddfd4dc47bd64146bafef29332239c5d4cc90fed298f7d9f6ff2f7cb3ad58a9444bc6dc9bdcba4e4e729cd6fbe9ae4ac2a5bb48b2bf3389ebf0b38bda287ca8e4afc608955434119496c3e0c96ee69cbbdd5dd8a80bcb2c3a68844a2732112223acd649d13c7de89db35dbc8bc0ba47cca6144fd39db703aa6a803a6ef68d3cd1c5302189267ec404e34f3871c9a495e84121e78f6f4d0b2a546a63cb4094834b00fd69e6ea201c7572112fb46beb00", "65530000ac", 0, -545910436, 1537743641, "03edda4937898dd1d0fb5f3af5c71d200e0be4fbfd92f291147100ed8680eec5"], + ["ec18073a02cb9e3ef8738768a2d55782ef30cd41b47cf83694e4beb832d67270c782c2274201000000050053515151fffffffff76ae42241ce6ccadbc2299772509a731ed0bcea525e35b15f2430b4a6f67ec1000000000652656aac655271e4f4e7024e8bc4010000000003ac6353694ba40500000000096a5365ac6a00525253000000000300000000000000003d27a30300000000f8a3528369549fb4380f71094d98068990343e3806270fb90c717bf2554e83e5705c1f05c23580bb71fbe1b08e1959e04c29c74a72b7fd2beaa6c95bc326e410e61ebb4b07af4b4a6ee7665695444a6a53a38527613621aaad2c2b8fae8104b300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f54b31b6ad682f03894dd87d556943e37e3a64ea9ab3a74a073d1704fbaaa66ebf2413fe6e3fe5d4aa7a304ea345a563a5ce1ce9f68a84f1b7caaefc949ddb26bf698407e255b5e58417537605c78bafb941f1dcd7874e285013e99d79037308897b11fccda329d4706508c64cef19e3d207c735cfdb6e381385ecbefc7ed889020f88ff22ed7107ae72c9c664dd3ba54f0d67f60bcab8cc13998255218a020e8e032015159442a9b86fd6bd5166dfd4fd2afe86aec47e1556f83728791c5d0dd5310b0568c345c282a87cd7f3c5c507be1262dcd82cf18f67d6aebe5cf5eff3487ab7993df0f9ba53f1b94bef66ea48fb08b9f536728ce97928f6054cf436f1041976031373b2926b6a71abf27e8c3695f8902e89d3041b042586670e229f65f96fdd9e0315641fae4ccb05f762e5507aa9749c6ec2d2aafe169f24d23ac891e1ade3dc7e021814242d364b3299b876b160a84153cdab5245c97dc4c0061860004c99b45df603180d4eef6f1679130bc5b5d8b9550388cc5819c845ba7ad63da9a56cb21dbb39030732902dc56605e5ba4ad993c959157799e76ae9b19cc33e647575c5ed9d9790c42f7399983ce9541b0725e92cc85f8e88a363199b33deaa1d068c70512c9583fe1d652ed5677a7ae28d756c3258806326da7559851f2b1291d6d8d1de29892638cbe68bee9df594410ac200274ccf6b5e3b9040e4c506071a6a479d883a980b3c14143d46455595c80ed787ebb5d74425109e3f575089fdf64ae0b73a1a2594cf3142fd59324f78a933157ba86d95b597381cd8c950b9d9482378396579be30d94c43a5008ccf02a9a33f84dcb3bb1679157c993144968410bf6c966efe7802804144bad0a40316016ac7c4f6b835cc7a72ed4a01761b9ce36e2e2a611004ce73e613c4609a80a6a2d18e01db5b869d7bea982e9b5b2179de04eb341ba5c6d2eb89c89da738f81a44c20b472078aadd965dabf45cd5d3f53cd74f77993b678eeb7d4db5310ef649f62f0e3e0fbf3089ceb04f0a84549aeec23b30c081a3dba3cf54e180ca2b1f214e80b3c00e595177ecb25cc7328b916c36a73ff3b5666478fe61558b661fa630dac6e6ba9edff2db055053335e0de4fa585eb24c4b4381f6f5d9cc6b15fa3a10496a6bc71b52151cf9deb16c2d521ff80ef2cee834ac421a2ee0b5fd69167f6281b08a9279bbb2c90671eee83ae5ca79007f9935af101ce8fb0f65aea375f9b3044fc5a54df5c4c7428a4a107fbc90dc977a0ed0f16e6251859ef840d1b546760a839189afbe26e1c8d78b3c6b4ae46bf6755fb20d340d47e8df04812f67da834957864df816ed8e0bd96326b58d555616a2d60fec80173286fd6781cc95c7e15ca853332e6eb3c5f1d7ad647efabf840a8766cd145d4bf3b46d7199e3388c9e31b87d521b4e579a153a9b96afe901f463b1aaa0cd2257e1ab88d61068eac336cdd89c9476f19dd381e2102ed0142999cca1b7cb0f7a66f5d8c33dedcbdc2ad5c1389049e6157339fb30efc201bb6b5fdad42da452eacfe9b1676069ed5f0336c1c458679e0fe7fd518c68659cde6b4b1a44a8765954345a4342ad024b1825ce73f5608d1d6ae1ebc8e59acdad3b1860be7e29675d44948123c73507525f06dab7602987bf8aac595c2670852441616deb85a211b9a65983ac36ff8f8c7c3fcbcff70817232aa2316092ef9c41c6047f61dc31abf8f0488556769b12d445a28289116c2fc7ad49d939aeedc6be3b9ac5d4dab93c02bb4ff0f87622b45f8708bcf0a0c2e7a7eef537c03b16b062a8de48122aac705b79c5927a4cafdc935041714dd5b38c716d9382ba9c1e18158101d3829fd9320708eb2f6b4b7684fdbdc334de3cda70987c23b94f87c128734189821956e55ca3b7451f15f86a4ab6189e34e3315e9b51ea39dc151d440022803953466d001e0e2c6fd8053b0451caa31447d298c6ac8291a86eac55fd997d6af1f2c8cda677a24a7a8f04f09ddefc9f340454b375eca64584046cc2647ec3af053851b73fedab60e010b0fb296528d42c9d87b2003f492e0fb8d9a8df40ffba16d3fe17b5736211120d15be1f8d2b1a26f53e186640f62168aba1c4053489490e4a38ca81143931523782a557b315f2476d9e8e059e7daadebb1306791b164fc17ada47a51f6aa403a669cb41bc49fcf9b878ec40958b3de35b63921a557d3ffcecfbfc3c715fc12a2e1df2c029084c1f7b5d52abddca2b50dd2e180c134d6f67ec5f9e22c4aec34cb6ae1f498dd41d5658b861331292a22296ba4e00000000000000006862f50300000000f963e65621ead3f5018d634efca49d4d276d9bc58622c3f5700081cf115b8c26a703b7d5ffab4b69f3af76842d9c0254dde3f22eab7d34635fb6ee90357678faa493362ee0f2eda32f895c1d44c9e4a815098037ffaaa00e85768e40c16d7a0f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fe488ff75fd6ca6a413efb23ea0f368a9db576e4ab09c2bf861e57579e5886b20cc7ffcf6fc569f104a08e5f1bbed5bbecb9a2a42c8c1f5e0ec53db24ee4ad764c200250acf09b4d6533b1df9610696de336ff3fb54aa161de82a838def1e8c6ecb7523919c7c4f7f0f52d622c10e0ae4499a724e1814278b7d92e2a97dfec002235f2fca4f9b0554f279ff204f029966ab54e1c5b0cae8141b2aa4db36a216f4032841000fdb8a4dd739a09a8b573d22676130ee05f2c630134241e29903d23da80b0055f3a6c5aa41c1dafdd51e08c413b3ab0dfd8519f7f8ad7cafb58a9bd0c4cabf34cdb5458413e44ee1464aeb01266f2d57b9cfff0cb5073a8eca005659b612031b217d316af8fd5154de6d006d2d99909c7c766c776c4be375688e2ab961c1f603231c46baf3ce99bdca7de80d18fd66cbb087d7a4139c0ce119761006b42d0040022274621415899fb4aa0f4d2a4544bd9f7991a9c79ef834433acc8100c97790df0311bf2c34a69ab27d571935b0f4165daed6023b76e2c53303681428dca94aace20313ca6e05320f9ae2b8bcb396cbb52a17b04c279c45f36f7eabf9cd8210c656e42007c1c0abf81457985ef8b18c9586e988323c58b6e3a8c07e767697c8a90c0d544e126b56123e23da39b49cacd79722c2b191f7c8e2af0530fc31405baac4bf7f8af8e0ad699f819371501d58f27e8c875c189fc53b4cc435f294e8d35a5e7f8bfef7e162baf6a6a10433a642dc657fef495d72fb22f31c15274ba48e32327bb896c8f6cc97ef9196193a08e5b30b62df43c323f41352c913822fc49d366e03e05f800c0b9a965414e4044a2ce955e5dfb86b3afd97f28d89b12875ee79d3dd7bc1eaa0ab7508ac710dfa3535b68f851fc08cd2f7dc36d14ba506419d503031d3dc9b667c6e2f4fdc44617a030b35a42bfb4c3e52548b39c7fe336e5d1afb49fe9347cf03ecabc778b6a757b42a1fb56f86e729bcc029e7a43ae331fc40a6468537a406b4ee9cf2f7c859504a57c657ef3e0be7976e93d8ccd7b785a1e0e96ec2ae4f3c31feb1393a76be0dc44651136d2e1e86b8763ca29a95576a9e36608f2ff6200317155d620d16b73e7af8c249cd736a9d31c33c25bfaf3ad2b840e4700945d87896e1a72b512b0fd3bfea058aa5db60d01785ce05c16542bcf397aeb1fd49dcda08b1cd9083cfeee5bb0fb99676043e6e366bf650096a118c80b7632e72c284b8e13b64b13da98f4572f729daba92b6dae81e44ebf754ffa241b55c5fce95b7c4bae6c9e4cadb0a01574e58258a8fdb7f072ac9000e9dd3e2cb1d82b94bacccc1e48d0fa2b21431dcf4bc17c80c7c83960c4ad3918b2a6bfe5c9848e9d49d67c99161ea5d511bf67230d8cbc86f00de1d5955381597e42d6e0dd16fd9aadb3b78b6d0b2388a380da4c85c25730e7dc2ddbf0bdd86a211e070bbce49b6b359f492026dfcce089538c61a6782d251a7bfb111cc0b4bf0afb84ab49f95bb8cdcb756b56f854245eb28d195838ca39dac5ea6454236fd8d8863fe4a9c6716b6a2146705c74ddb1d2dd25027af030a7dffb26c53ef9e6693739dbf022ade4a5948877ca2c0bdb60a621d92b0d0f8964d09885a8d3787a302a19eec3ff5886317c7cce7877d5c5b8599740acdc12028df80cffb2b9997aca8942b5fae12269410a6b9541579270f125afd50d00c49a0a9f7dd8499cd40a02d464467fc6e14e62301a344c87f694fd7433bde3f9d9b6bde44350f1de533128d4966dd528d6bb860739358ce521032fad7fb651b33c7552b6c5c57a87b6286b1e89ee23d415fee140fd099bb1abe7e8f8222cf01de8422c4199fe70c8ff2f4da3b785c0bf192e035e911c902dbac40dd31c0e192c09880a77c920544e4e8370b5f09f8b2eb6a3bfe1a928ac210874fad23482e69fe163be6bfb6b8cc93c688e859d65513c2ee4deeb2cb022cc9fad4349cc31b71ccc73ad3cb5bd698fbc18124c773ea00f96de377742a324bfbb8b8f0a6650162a1a4e1e9198becb0bb4889f52ad751f218095f2a0ec9874e2b888707eda1022ac6d0c2f5f5c44fc19db108b02e0dfa0aaab1cd4a4a13a1f51770f66bd3f93d174a6f558cbbb45f2d4cf618c048ca0118432fda931e7601d34df7aac2683d5e3f38c9e5051d92997c2363b35de29ab623d8544d3759e01be91f94a658e3b81e026f66efe1c9b628448ab4682baedd15d02dc9c81df4c57f02a93e512881f3ecbca802b0fc4f6250ff2e249839bfb52d97fc24e205d6e6ab9d0cae0a6d9601495da993cb1e1000000000000000005f6a6f0400000000415026b853215595abc7f3191f9e033efec4d0d34bac874a1d783a2cde4ec5d6031559b873c5ffb0074651be33e027c5b4bcc72baa856a92f4f51728fe08bb921b61a6a9b74f6a768e42c30df34075295cad2dd4f4632f79a0df4c0d7dc26b2800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000be64c0ec9efa31691c2902729560351da1daf0fd251427eefea21fd750630572b97fc9c97d067fcebe7ea72d88ffa35e10bd384ddfa1eff16d02b30089dfe0fabefd6b429b7ae8844d56620a159d89bba7c1874b986929559b7f232b808283e6764c3bd0e3809f2f941c9929fa84faf0372eab1bebbb615adb3d3629acab7c7e02252eeedda8bd37d630230b48788b2cf92d409d78f4d5641607291ef83aede84c02281e01e72cc76687a5c89f010ca97c76aaa4bd76b016bf50e814b40d8b30f8890b009c1ac89f6587182fe2a1d5f27cf58c1cacf9906f82839a9cf85f59702e97642f6e6e9d9ada0cb466c765c92f8ec99202e88e4569e3d32660a3d39c7ef724b502254293ddb9a8ab29d389ab1d1dcb7940847a792b5bd47a0468866bd278c0ecdf021ddbb77f5038ebb6ef1cc1171b8bd0660883814e5d094519223f81ffdc2b675d031771173249b69be2a09c9d1ba9691a25426d660afd1fb2dde76d38d7805e5b02021959a5e303d1177c4bdb5ff0776e39f8bfbe7e1329fa6818bfe89c92e258152a02041fef7402a12563fed066ff6d2ab310a6e773d0ba55150ead850d3eb590ce8a14865ece1afdbe79f4f6cdde8512f34e9b399c5bce87af8e8b514bbc867996ef31536e706f5561b08deb3d0b5dd510038901e54ee412fb7aeee191e20ae19cc7286c632f394b4627a3a861b49a307f8fc09c425e8c40ade94a8f79624fb4b9466adac5ff1d0329ebfecf3d6cc566c0788af7be939ea8e1e485bce38b28ec56b523e6ca482388625a2689eed8b426df7661d5c26c20e61396a29ec7c9b8bb0de23946b802d743d8bd6c8287cd8c6ee046675aea1af6d6bb0a91ad61dcbac2f0c681cc7788bbace98a60c137e9e008d183bc02cf653da8a99e8e4ba98a65a69708716a540c6efa01b32d78fe91aadbe825ca95043f003150f2103faeee57d4b8f90cc76fce47465c5a38e6a76f707d04a44eac63416a39ad67dc7567feb7db8415e250acef09c26c420beede6e810b11c718b2e99ff2b9426521871bf16af90911a7681e780934482eb7d1b761e9ec8a9ce2608e0dd09f3c23ef8c016c0bd2cc00f7e00d35624d4f917af1fb45e7589a2239b8608960e92c6f8ab10af98c047490ed84e3989b39a2f19bd61aa160b7b7f7a7983835177e073bb3537036db7da352cd00cfdce483ea4d555d86e9547763bf26d1b3af4a2aa4ac294cb383bfd4447657c9987d14cc809cbe165df58acc4870a8f4a62a0ef9e8198dc1c6095d2aa8e199ee47506838842a3937dfd2a0edbfa9045fc553a4d94252c946aa6b45d7231caeb71372258fda868b03e12b7ba8748a7deba754f02cf94236cfa01dc154a58e87bde5fea9402fe05c0840bb08f41be39e374e629eff4cc09d15e6eecdfe1dad635cd95c058aed0321e81ca22363975b2bc2cffc7486aa53c422d36386bceb5b1b46fe2ed7799881407d4743178959fdbc25585f4e34e6d4122d560a188c298e59f7f473b30b3b91f350b6155995b8cfc0093558f6717308af478d988327e6e2ae3e1c10080f123d6300adcab2a455b3251e0c348d056dd7d2e85f1d180a7edf9bf1d72a816cb597bf1ade645c7d8070759f39f331ce1b99963546a0a99448a48fb95d9829364915b5fa183eb711c705fcc85347bbeb987170a0ba82c3190b1804a0d5737050dad97e3c827457d5d768524064b597c76971ac8d9e7d59c7797b8369bed9b8170cc431aede2ded246f63f3e30617702176f5384f9cfc7aef6c8e6e6310405bb03141fc0b00a990c0ce69718e1c7a57ce80637c43a70fe63b30f7eb93f4cff8ea9c958c730e8b6b69657452345ebf3ae8af5f885dc59951abdf0ed4613b19fc6bc715bf2b4eea387a21d733f9b48efcdfa25a068cafce6c02961044718526e2e09b3854409c16a35c903eb35ae443d06e6efacfe943de4f3f60027ba796d01b547386acf0d415ce1380683d97181a7b5c48ce753f89dc678fdf32c5ff4efbed9c3cde467afdd231bd1d8c91dbc7a09c3a6af9c5f2ae63b95a291df96dac55058ad37786852ff9035dc7e1e0cb18465f8817c228c91845d917bdcdda365b3a85e837f33f872614a4b85cde7aec63890c771baf6a8f38468cc0f72e38ccd4a34a7b6fa577dfbbfeebcb233797dc22e08ef2560380d8a76700267737898022c98154d5797f62de995c740c6d9c7ebb6ae186b948b722c11acc9c725c1d78a372424cd08bca10a0f03c87441197d01f71c593fe2467623fbb9331659d669034c6a2312e6c596329cd1afb4ccfdd6ac37f14c579660720932e9da511e461a133303b7272f6ac1dea6cc84fc7231ec838360e9846df68503670bec1fb3ae2c358512ded6c308910e59cf4b10b86723a628249dfecb29d41d8ee10568198f5e6f6393c1d028e2edc8702b2830da08208", "6a51530051", 1, -62700499, 0, "1d4d46bee1f331696c5961f2916139141cf76fa466ed3ba960464c7000d9d2b4"], + ["f4ec04090316d279e4e56ff6e8d13d74a8a03e1ece299c291e3b77090db2955317913860350200000000ffffffffd09726bb1fedbd30f064b97517ba9e3fb943bdf94597ef22e989263e0970094b000000000952006a00ac5163526affffffff62d13599e837272bfc04d53ea3b7912f1676a0b491ffec3e769fe7d5a02087ca00000000085365ac6500630052ffffffff0199527d04000000000853635153ac53526500000000031efadd050000000000000000000000001e5a6930c99c7d4138b5be9e3a9c6e452af723ba5ad5ee04ef510281b6f2b436a78511275fd52c407ab995858e71385fa51a3355dcd450f97ce87c75ced3034e725321b2024ec3af0ffd55418c0cd26f6806a971066e3d940d28f730c795bb3200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1cee7d2bd7d6d7adec40a29a560b70210b6ba05a74ac60debccd8dcc097ad0c09c52395a5f0b41ee1edeab501fa84659dc5fdfeb9e32afed1a9f07a099c8f64d1b5fae12a50ec1dc378312221598e3a11c0474feb363c4e1941e81f2b64c5673b04148c3bccc7b618b515a45199aa3af7194f29b8694702d0390a25e0ca6c48032ff041b50e7d4cfb1feb15058b5304d298018f79080e33fd3ff7d845b041940a020d053298fc90641ca2256f3ab95ecd58930bae9e58f04e95ecbe4145ac9448950a0715e2fe5d3327ca4d7feac62875bd6a77537db8422ab5cdf23f5ad218ddf1faa5a8be02a83763ae927d6b25c3372b480f16538e5533058af202d58bc12b54d2020dfa7489a272284b3f416e8d9a227120f6a0f4b97dec63cfa83d897e4e292401030c261638dfda33673104bcea691ab8a89fb3a6da4f26d3d913461f378d7ca3310225f603f73fe617b8d347ad2a18ef45aa011acdc7cdaec6bf2b9f948066a7c16d031f0dea96cfe4e8660a5427f8207a3ddb8d2f4f5c7cfdb8efdce8d79cd891d014032c54efaa70ed7e4a0d909df98841a2c3e183c1dc996c7b8a84cb175b9d9f1d20dc16ae81fe83cfe161427a30955eb2794be15a3209aff9f3a83d641dda7825e0dfc050023cec540f9f8caf856f52e79f6bb4081fbea5ef3782a3823268b12a90f2520bc2c5e7804183f47d8b7c1a56db9518695688d29ff8318bd5d703fe6205d3b43191e2bf81d157afb0cc1172cb1fc6893c3b90e2f3b48e21c5ee902cc1c91dfcf546ce4d56a56868fbd846e0003490edb19b5d9b3e424c816cc316414c36cc6e48f9de6690009a8ccefef3d2b279138087b7549004967622d5b353728125d07f9eabc15bc5c003eb975a839654b9a624e822de3129723192689df11d8db405ca24fbfb53d0f493998da9fc8ccbf3b18483c70c78d78bab90119e2d346ae72639bb3b54967618187c85227088db28c47d491d809a3cf3bb2d81791d90dad5572909942cc16518b390712fc66fd14bf96fc74b4e32dc7486298f067474daf08c3dd6e09700dad2054a37301a001b7ba322ca304a63d7f9f5a129675d0aafcc50e975c7d342e208665ac0d52152f7155cc694f886affe58e156574d497e2861843d37a8ee7c4112c221f4e7255a1543003739afd0158419d87db29addf7898c87c0347ef6a763bcae282c6ea8ac83548a35602aa90a333af3503015ae7499b16484c26e377f5bd9d495a0bb5f79d7bbb4d3d330d5ea92b685d593d7445abfcf2e6baffee19fe6fea3d82b2d764800d2345a6a5b12ff303676ed13c1e1c2be9857672565ff0ee23210e33236acd985e87e1640e138cd70d7b3c04366447fedb774cc9933d785b45ef61ba981d54222fa5f4e1f78b9b7bf1ef7ef0c7248b1bb3add2fc43dc1ec955d0644bc6e78949f46df4a111399aaf3ea012ef1b44921cc40ed00bf7767b3fcb3f58bc8d3d152d5f29388449bd3a8bbbb9d19d7e7b3087dd1dac93f62b83aba6613cf7953f22b1fc1778566ca5770bc5524574be6204af2efc0dd7b302d231ec07c0cd567e5607513f1b28b640a29f6c3f1bce61e8e77f3c7c87bd1403406bdccd15c19ef339a2d4b2b0510cb0a29c08adc38fc9190453d2958aa39aa108d1846ebcdbb0b4e0601ccca070fdd662b8edbdac541157ac449ae7de6835d296ff0e513aa8ed2dd38928fc530abcd2289f923327a686dcbc9195532919ca3aaf86e6623571eacebc6c1a00bc8f090885197c7f0f936bd07e674fd8df5ef85c9a614b46e17ee8bc7fa3267b5ef75bcea445418ca6d11f13a7da5a57bad97a0f452b3be867210b6d0641a4f6120e709f593d8f65623b10a08cd434e5cb0e3e01e0258acffa098857b8084966a6f5d4e7291cfd8796ba5370fbcf8a638aac75483002f908be5d29eae917fa7573b86982dd099cc35f94ace1137f584d70de6d61ac3cc5cc84ac8d1564a4abb6063c0d4b345716afc31cad123675d8534601d232413622d4fab8f43b9df7752cf9e356ca3296b62cb7d9865051087190effe986714bdf94c610c611ed9a85534e645bc649f78195ec66d77274b1eeb9b9df7ce554033e389d3b65e613faad41bb66e57500040cef03102395bcb29467f9e04d07ae9ca57df250547b519b0a4bef06076d93139dd4dafef8da9dd583c438269141cd2ed395be1e0197c6e45851d950d88a41c5f5c1d7e1d12a7e024c2b2d8980605e502706bfa1cab939730eb29a55e8ca48779b05a40c92e0dd98d6f839b7cf9c7f02865d30267abc3c4bbf9d4a4e6b299105000000000000000000000000cba611fea1477d62c414a05c26e16f732c9a4b71f41f143df36ce7cab9af65d5649b47fadf8032cc7ab3ca779e05d1b735bbfb8c03b9f69fe50f2fb81799ce4694f4070f1c19c612d2387294426a983b8743e990e3331e9950bffe25ff413e6400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000720465713d740619b563452ceecc9c30f1c93767235ae33f3e214f25243b1a1db273fab432147684dc0b4095e7a8ea4fba98b74544b7ea6114aa51e4a8f0df449531e3011a5f8c7bec22adceded3372a4d8fd72706708bb0d5d4132eaf3172b7148c79548801ef5c8c31af7b7c0f29e5131827f812dbd8d1a08c5da5584def4f03129458d4ff36f4ba1112b74564b2a0ababdbb870ac9ac10986b8523c29e22b760216d5d9bc85361f3773a2c84c9f59ab9f022e34c0963f3b7a37e995b650ee28aa0b033a09fc5f37a245c8467dce1fb3ec187f665e391820bade0ffae645f5326659883758b45b6bf8d0bc608593fc554ad8c89dae25796207436e3c9ca6d4ccb5910206b560f5f0dcfe4a1cf60f4931886d08f0cc2ad225082a0e9bf32f0dc671cfed0200a5064fa2f2ff5c93110b01cae815d0640c4c9a625bb4c33687fc827709a638020dbf9009cb9da4db19dc78f76f59a23c613b3a9f18b16a9be956d24a312b91630302d642f156b2569b8c1fd1970dd07043f57df18fd7acaba04f315f54a3eebd4c020e473608dbaee1f619f734b8acf192486d79e82d986d57cf020a83739f55b769aaf11dd4e4f08b325268604b32023b7dda3cc1d9e54636dbf32370eb92a72a7553918c7a8ec993149579f825f390d7e5f5f394593191c349fe0846de10c302983c8f8da1e86e9731d4888d52fc9d934f14a95c5e83925ae4f53d63d61c0db3af989e8762b8af943723fb3a76af08bf762dcf11900ebb4dbfcdab681dbf857a18cec8d6c0b8b83ce41ecdfc0e043e5fd15d587cdeab77db45450d43c1995d1dede810f40abc677ec2d9842c8f6d36b5b044dce6ea7810ff1269eb619edf09cab97507f5a3679979efa743ec00bf95e29cfee9cd72d10c80ae402ae4b9ef089ab9eb784ca4528a09f014c3acee73088fb1961d42eb06be173f535cd24155e802a97c66419c316f8ba08e4c785fc1e15a7b6e766c5a257e2fb936c389b7326ef105956e906e22cace69a4e0c6b902e177698bb377e4047a4784dd0864ab74940dd4db9701aa57465cd5cc89fe3ec8c66d10b061e7757f9d5d6679d7e7c1919bab977e0ce0719f94613e7b790f6c1b33c2608c1a2ac31890adaf7da93076be6bd5eea6aa2dc6df7a81ddbf6926dae8da99d874d25fb65e9fa2d40a318ad1333107878cee44412973f7d13bbdcffffdbb16417a0694e86b700e3acfac6e6ac2c8bd7592286e80a27b18e990302708bdb2dc269686080df3da97c13ca9e824982e33f36d401957447f1dc661422801168900a367e1d9768622574aa63b59e9c6eb8ab8ca84ea24bb2cf32ab67ca6f0e2223c3905a8ff0a5bd1b9141613cf4394bb9e87157943935150022df733d731f4e96577fe02dc475f39b5c74d6c282bf7099e4709520b084dfc49559f8744425c931f0cc04d0b5567d98031e288b0bc918bc0780c172fadfcd6512025e480a08eadfe79a7588455619694685d98a8d4724b984c96d90e971342c6b661ffdbe2a45ac958d01a39d37ad26813c5ff14ca14121ce56f68f9794b1fce6fe7078e18b9e5c96268734a95a81285978d03cfc69cfe0e434cee2552580c63978f7788d592501a5a5bc1d17678f702fd49add146652133e91699c22d37cda59c20baf4fefbaaecaf420db9725ba8566d7b0b9fb439acd02fc27c0e5269792a637d7424fed6cb67709371ad0a7c94b2e398f875be6275fa381cdf194bd5a8408580e38218d868f7a711a302e4f52981ee3f619d80cb1a836bdfa7d73214110a92341b580c17e4ad3c9aa18018bfbfbd7a5b3190fa1c71d46eccae1588a7f3dd305959a560ddad350006dcc3d300ef6181eb30e6c4f5e2b98f0089718ca21a65abd1c6f44d899a7e4c63ca5f87a0e8fa1cccc61fa94df17f3e2b92514f2282bb61188264ef9dfce331859ee2200f94e0f9b49385cacb2681dd6657d5d6c53e64b6d5a676426da65e6702184cba312fda1eb75e42085837175d30d7017166689b110cc977b63be2f1eccba0a2eb2903d6515d5b556537a76ed3e46efa72de913aca0b2173488d818cbdd210b11945edce2bd8d639561174e2ed34e187ea34d34736fb4a7d32d49692777caea09575744932794390c979b5b293531357c5ebcb453b6a4fd3dc1dfd014341cf482c8ae312ac32f9ea67c8652150b3821562e9c2b451a516082124e21c7a7396106278d144ead487dcead9d79ac8ad8247f595e1b2c3e39e88e6e4c93096c263337c8f7ea632e8372c2cf5072294890de91beb97280e14acb4dd9c35ee60f2b1000000000000000055f34e0200000000f011d9b71a37cf1992004109cb0da1788e547e1f1575baa798ba614b0866045e7c31ca787233353bef0ab8b114730c4f0af86933b6df972cd025976b757837ac1f84537dd88148406699a4812e6723cb8ab2964ae7d091e1010139edf90637fb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000110e79c22600e8c736c7cf1a31b11ef500879a48b68bbd75c2fa8f3bc28527c68a11a0d371597119801caef304c43469270d36c5c711ddc6d96d13ce2795babbb8cad3c45e96eb28b193c491c5407b4b3442b00a495e2372aa9198a8f2ca3cfa80eed0d93021b0757ffb38ddbc9f363f0d84dd840a10f252b5795bae82d507880324672e08be463492e542ffbca7ab173ea124bb08256ab43d6186722e8c8f36e70316ac573aaad68d0c404816f505bd1b20783438c7ef6b28f4c38731bc6f08b3900a0895f4dc8f294d42d3a89204ccde8b5fe2ef97c0c49566d0fbf81eaa33a1bb8b47b5244f9bfa38736c397f6818446a93868c714b705380c6a3620ec7f660e88c022ba0ce3d8fbb673ac63484fbad70b98949eb5c80d69d90f92cfbd67cbe23b95002180dda55e820feeb8d50d8815dfb0952c395e08d0e0b8f47a00465868c6c17380223c6819ee15d3e07df8ed3f7fd0f9fa082f3245818e245744f1cb2ed1653329702251865f6c717ce2b3d11a3661f50e1e456d342d60d75f78e3499033b5bd4c88702258d4e246c9e3647a23aae3faaaa5381b528d25ad28ecfc3080b8ddee5f6d3d3b2f6c267e47303a81792a297fd4eb016492339c97c02c2a9c4de25df6d42756861277865b29339cc3e95f8623ce1016400269a81bef0cb7b964d08da214be0fbfa5d4793c95e8449fb5e78fc8aa3ac3610170e555b27824ed7ca32901f0c953fe0768c63bdfac39a2a27c2ff3ea6d42da7cc0086149408176f7fb43a3f67b606d5685e3925f34aee2c8347c2ca3e3d5d722b62b22a0285dc1c4680c169eaddf33d726e19ada646bf1522fafa509ba02589e7ed4e76a6ff7841da0b9ed10d3cfe195f9104d8f4eae65fa2f912e7f2cdfdb0e3f3a72abba267ca655342e24bd3d9b46c85bf319141373210f88d379259ef6390828f54c2c3f4aa991df8e6b91821fbaecc1950731fbe5dbbb51a62674947a365acfb4be70ee0d4020721229d7e992626476c2b9eb732ccb686a654273e64be7f0a1b03fa2c553bde5254c58093d2b58df148e27705a71f4fa9295bebd1d295b757d12644bcba7fee43bd67d0a3494e076b49af98cfe1637ba8be749b32491abad3283c8b1d0c20a1ccf47fe858c7b10ff5fed4014fb17bb8dea5bfbc66709b2f4b62838e920695baee158e7b1ff0e4aeae722ab70d79adc599066fdda6769f93812283e03687f5a29584d07872637a768e1d8ee71ef915e3056f4ecbbc4588831d57b5327bf2476bd6bd75950aab5da47da5732fbbc277a2587a74cb4b1edbb97c8e47333505bf113f1a336ab85767d7b43ccbe545bcfb94eb05d315d6a578eb2b63e7e7700913ea9032d94a330463af8a521fdffbfb561197e6fbb2bfa84a47cc0ce63c8c709b07b622892b328333b6b9635d2e49e691f8e41749f1f1b469edcaf187960443b2273df5ae41a3b6884ea9168a735466d9f34d071caf999d4bfa3c07a8eeb2cfaf15b61caf2ce7a843ce52794d5ce55500b6ed522f1ab75bd78e926c47d2810085c1542c2710bfd35421ab72fca8b836cce606e33ad27f00a977e3fcbb22fe618d3993101d3dd3b8ad91cbf590040e0e48c72ec2ee5066f29368f3af50262212269fbc835edc752fdd707afa95a1ce5a9e17430cdb18263654d61b372029f42fb5d7a17bb153bf7d71f83166c6d63368e45b61feb451f4e380f8adbe359665cc3d3c3b11a3ea59d94dd6e043c4eb4f5c5d2f53f1e562d2845560d0c6bdf3ef945453cf74003acfc5af36bb8afc292846a29119865b5895bbedf9a9b5d6677e47f9508c74550a94ffc860e55654fd23b13463fcd2174a2d31cf1ecd115b7a4b8d43561f8382ebe1c4a03020907e0faa7a95e9ab4174a6c3e203566bc585a1c57cee22897cee9966041964cdd91414b8693137e33651c09272debcad073e8aa707783541bcb7974541c23f3e7d00b9b6e6a7631b51f7a86f3139664efd10e124657925e60177bcd0a32e86bde1ef2e15d24c324f62657b1e95a2ad50509bf371b83e05abda018b3cd406e8fa60729f6c20cd8bbe3b4991eec8e1d80c875505f6bdd737fc047f2e0cd6a0e7aaaaaa812c51eca5a21a38d6972ab64a77f098d31bd0d2e7e31712654fde70f45d873a7cd04c35a8f41ed11e2c24b79af365036893b9552585fe9c1e10864d826483074991cfe8c55622a5e929eaca7e16bfd1073f87090d0ad17f8095970e1b99bddb69488396227ba7ffca379fc0ca7993de48e95a6244addc736c145db469980933a456f76a40cab8c0e98de221e58504b467d1e1fd2564df64f0746d57c7ae0f44c81545c93bfd0c1706f1bffc7b116f3d80e588125fe9eae7b7543ebd410947c74d4caa95b2289e8c547f3aa992f3b89531c6c3f39456b497b9fd860ec4e84fb02ba57f3df0ccbd0293be6d4706", "53", 0, 496383266, 0, "1956421ae37da37631b28531b7271195211b54f46c680111eaa3db5238fcf850"], + ["030000807082c403027e27ce690cacfd62969f1a2fc6462cb12d85729adac8371313b774c57bb6e4a9020000000800ac52acacac53acffffffff67fd9e0fed0efabd4a8c39440b3cc97bf51af10549e2e780f585d9f47cbb261b02000000015396fb6fe302b1b50e000000000003526a51bcfb4a050000000003525263760d959366a1f09a02000000000000000079fcfa040000000017720928d781b5db9d03e1b2cb9dd91214d1e7591d19395c77a8bd406f3380094983e88b3e7c25ba444c154cb251b0343a715e02f6f873c18b32e8a88fe52577457c6d2d8177718529cfc7f0af72acf38aa1e57c334c6553c014c5991c1e026500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e4f73f03f5ec33da54bbde1bcb2345ade5101ef71d51a15084e0e8b9777952f8b61b3d2adebb83db20854d27d4d1994c629184e48822593b9cca02f5e6b42b6dc9c6a62e04ab203507dc38537a2b48d1f8e7005435120073f9ebcc73623279dc53ea47864ec39648c274f36ee738b093a633891811ece2b0655fbf88967c0226031a40080564a38c2767b362cad27cf3adb2af3ebbd1762030a60f360de71cd7ad031186f02b162f6019a5fc6e6ed387d3d33298f3543ab6d911451b55291db0b8ab0a022393634c8296ae7198b001b73b87ed487d702e78502db9be0737461c2d6677efb1106d36a6ef46831b087c4035a197cb5df8bf8f68a6804ace752b7ec22874022077e7200931cee9ecb159b29f3ed95148e3ff0fd273455c84cc0d7a5ee3aa440327391b4ad3187c4fa72e29354b45adaed2924c596ceded759285edb2e03a83aa03047f8060094a3c49d3c1217a1ba723dbab5d6259192c6072b5fa21d31e720682030c91473f9b9fa5fb98bf7132f5cf37c56e12aef0d0c862ec40bf4fc9798042b00303ab2bba149415819b836f9f28b6de1cc5b03417af709919b4e60fb5f2d064ac57bc6da4b31c410e704937e1ca31c7cec8f54008211e19e1ff28eaac2aa8c54e8839298e9a4b542eed3bc98d41a045a256e52a2a6b0c1cae1bedd6e87ae58a80ae283183601d1d9087a9d95c0d9cae98ef761f15866633d34c930c7f20448a0140b28d49e84bca3ae33902d0e1946b77e1368a068e0945a6db5e58259d9a08000b72410fb659248bdf4755c91dfc4a6144b118901d9dcd79e3a299d88430413af6b7d8704b53d30e33ddbf22f87bc03464571b86d8221fa33a7914e1ce3b962b406e1afd7b01f58eff6f357c2117799b55398a8f49749717ab2ac7385659cb2e252798fa5b65a51b5dbccbc852d5bc309b1296229271651b74734e80bb0792030154524875694fa0d122288e8a86f2be405c664e9565365f703808a69b189b1a05a70e9398717e8231cffa2e8ea4f30a177ff9d041b5cc0775c58d59b2da9e08495f6a9e127c1176f3365c631e9dd31795b19daca5366deaba46c8e615eaaf0d25d9e39004b42f165e4c6d3f72db0215c7e59e4aa67a63e71f8eb4b651a73802a09e73afe2b2b94d813c098176424d3485c94cf1aa87b500ac42a75a08151d2435f25f79f43b0fc028bac4419c1ecf29ad9c46620ea5199523de48720dd711000e0161457e176f8d7cb86b3345e01af7ccc3068df07f13348b28170bf2ba38a85148c8ecd59658d21765394e1850be31cdaf3fb0a29910c4f181dc31cc12045a89ef89b4cafe7a9af48a75efcb1b442f6065f999e300018385e5f8b715aabd01dcad9e4e76259c9cb79ab80bee2c4d19f2e1c97636b65866253aea2c91c49a5faba46e4960063d24682aa473126827a1995907f89608102b7ab4f2e76d260ec4ae91dc46c9a540da1e4943e7c1ad56e1639c81530c679b9a66e7f1f348e178db1747842e330e2c42914381d95f0819831b3aac110cc53bddf32d7981f6310cac6bf1885aeac3e22bcbc44833c99367590fa7ae1d587a02195d791b1355f1f8af186f7622e387beff03b1a7fd697ac4649ca744bfad7642282302f6b9b9dafd89949bcf4b320e323b95f4a59f21a6307a08698a61a94fdf2f22d465c7de13d2a6c940cb5c6ca71077aa0db3d9227f7a67c61d07563acd236d07bcb329aed3147586e285cda49ddaf6966cc1f4e80234360d138724f4683a93411f280a0f05da00ca9b1717c2991ea585cd5963b2639b780262619edb00f3daa92c749f6543a376928f6f216ca700b47c1a8c51e7425e09d252fb8335c5b18b5ddd81cf04f97604542b7418def4462a3b27426f3ef0392683eb10f2b8869abeb931b7e747238484ca777cb54145c7c41c79960353afefd9dce3b6b380578751a596bdd99a922ab4098f06183a3aa4e908c64cfddaa88b3d38c916810daa64ca9df3d352d73d52ea85dd280adaf4857a2a8475086247a60e926221b20acf2872a3e47fe73fe0861afdbbbe4c325c700217187395f150ec3bdec392e5d92ddb6b8bfc70953200c2a352e624179041be0671c53337446c51a92cd2f16f4d9c819c33a3c2681a0e99c4a52be4c2f43dd1c7fdb5b86d699ce7432ed807703e826ad86a29d2b15fd74df5d23922e84746dd7c95df786c3c42be74536f1dfd38dc3b935593a0f23ac534b7302fc5224b7c9b83648adebacdb25c4c0f493f01057fa78ca89e6e6d38b83f21182adbd4810d07a215e262e6b0713161066c78166201000000000000000000000000f2c2c1e30ce4243e43fa2ba0d290354742fb1896f0414bc60e3f610460b5dc8ded899760f18027c162281be1aaf766708dfb941c6533ff079626da5502aa009a47fc1420ed9eacd69e6ea89c6880bf44e781273ecf0fc84f0d08a6fa1eb509e800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a843694a7e48ba3023bfc62046df84e3a7bcbf90071276c18fb8c942e43434ba302d16adb4122c5fa34acc5ce12eff8eef498c6b528d5e0b9853b1248760ea98e0a7bcca4a26584d1e6382a72d746a71695a743037216680ed76d022d251a57f4f3caa6ecc37c7b08e9daeffd96fb318548e542fc26fe09a687ee3a81e673c450226703ed5dad32986311e49089d0ec27279a88f8251eb9394faa7e6d26d6e90ab022f7b4b28d8d35df5b6b45c84e363f974662517214114d6221cdbdf0aecb652790b04941e02ade55d7bac4af2db7436262fb5901fea1ac107a3591bae4c7dac080320dd4c9c4a2ddf89245747ab4e9d36860544f33fadc4044f7b470ec461048d620301529df588318f85b82984ae81c8f25cad60dee5d2ccc786cd903a911a7eeb200303becffb5906b06c72d09aeabdffff57aacad843eafe87fcf18668bf8b56b9b60209b7a11e541eb58a2c2d99e41058e4cbb94ea535da81e98e0386b7e1d2964ae602242bcf0340bb5edbf71c63a64f694968e2ff1db9b166494caf55d5250cddaa1d021c56a4b6826c0fc0f1113ee547b6bf860b214804f5e6ea46f95cba12c16fd7b1ce9764fb14c124877c8b4eb778f599eb8174c428ace4ac730e6abd1ae4c42bbf00cd37f55e00ba9dfa1c4bb2e6e6c52b29be0e76e5942da6846701d48526788b0cfe1e1b0046bceeb5dea5dcb468687591fbf2e46b3db74608165fcbcf564bc6fa9e3f546766b199896f09ee901e24fc53bab32de2531e9f117cf6eab60d9d19662914d0ce39b2346b9580649983069fac63427cdcfcb093b43d98c6ebd7f7d9d567f5d99c81ed1562a752c98855d2ab53178cc7a017626756d0d5dde07cebd8cbdb195dd819053d0364d633560ec9da42293526199c2f116bc752d764e858f609f216417985ecde6a4452ccfc8cea2f0f3f122c1ede58e4f2ae22628b70fbdd078a3eee027e5925ab31e9a706d71120d8ab64aedd4d531d56e3b9a8f7e5f53a8ab7f290cb92d103e0c95690a1abc7240551a037d10b1630b07ab45e1cbf20f2b1ed643236e5dee2a9b1c54ea3990aa35981d84ab5e9680b32bbd8b7a11695bd29f863adc0d2be4a8c462ece35e1aaeaae1a6428521c6276bfc488342fdcec88475146c3c0c4ded87b2852c96783bf48ce56de65fb0a73e61af9d6b9eb2fe834ff45e3eb33b94ea2b5926add019a95de58e8ee3f14941b914cd61dc1b2c9012ee8a29b5b94c6acbe3e5607657520ab779297b9e6874fb69aeb6a1d7ee53459676854862fcf611f30af94e378f99c30d264d1443ed64fa38bcd2df17dd1f8abf6d456f50de7a876181db6d7ee297e465c8459b9935378652c40b5dcbd75cbeb37a8825c10593828116eb3f0f8b250a2efae961a1865e3459ce092dac3418e6de4e82cca5cfbea4573067880b6fbb8064eb22b7a00d7511546e0bcbbe4150c20f17dfaadc55931f641f54a77ac4cc3f6fafff43ce5672685a1bd337ef22b8a5f5e759ce3019e9236625f78275869d6837e80d820d513fd6a02400d4f55a656a58a0036af7e5a0533e5a25823dd5877866f27d225bdbc6d1e22b0160b97a0fe58de6d8d210bf96d691dd0ff942b8a968a87260ed38566f733f6e816c8f659d101a59488077d31331d752188fbdd38c1af1e64d8ba184abc6294e856662b3ca135c59afba4c992455eddf8b4f48d9619a5fbe269920a17ebb648cd38b3ac7e2c324a4ae3e4d5c645c0f6739a70d5d5fa2979aea8440b99545cb042983d99197ef1843f63ea2d04ff9c8291d310abc7fe1795b4dc31532eb77e52e5df781a0a7dc417bb9e9f762ba8eda883619fa8f83a63be976cb69360c72b810e2652057de9db259488316de239b49631708ba02f3f388e97809af74c8a99a843d4f2e8d7b6ed19812344e1e7e84d6a8cb283eb7aa35ec4d62843b9297373015c4b0f52753bfaa40e1437d03c83b3e1ce9cc21a31c45dda2c535d2027aedeb61109240b5e15a3779abd53188c0aa61a0fbf1befd564fdbeb7f12c062e957abe4162a1872bd1eb2d22c68f29f35396571545e776e1399144aacc66f786c2c3a041afdb7237a76d13e0f1329c8ba0e947b7c21ee9acd29f6b176818b14af722c9814ae75e62521da3fa86273d0f0db8555aaed0faed38cc35a7b1cb389c7fe99544fcd8b2b1360b73c0b9e055cfffe24e27f4b29252d2b1dc9b1ac57c294efbf541735821970fc4d47356971c894eaac9aa72a13bb705ccaf17b5cbeeec6d3515d8201b089e3e0812ba1023369b5e1e1260f7b618d9c72bb25365afa2cb75af11ef6cadf838b15b781d8a3e749b5112229cb0e2647d16986a5275cde90280e69411c8ef3e3939421dc453a03ac50777063881c6c77ef0cc9b65634ee82472a438f42cd2012e036ec11fec17a2032289d417aa9164bf8b41fa440c", "536aac52", 0, 375685057, 1537743641, "50480d5580e07c9876fd1c733c4464ca52f305b7aa04517bf443474fee42b9e6"], + ["d69a4c4604c912ef2cbc0368f8f8fc2ffc4ebfc57677ee82cc31f20f0d431a3bfbabd1fed4030000000453515253ffffffff62873aef656d82f6741a77ed346724dbb25d58c2e504259caed491c57c0297f2020000000653656a52ac00ffffffff28e9cad39defccf070a9872d01d2ed3d8c0010a4059277f86a7017c16c960e200200000004536a6a5294feca3dba0dc56e7d5eed8afb797c62024799841cfbfff583bf239d7dd194a59c89bdc50300000006525353636351ab906b46031c6d44010000000007ac5151ac6a53650d9c0b0500000000076563ac530051652a9d4004000000000353526a00000000030000000000000000a3434204000000001269ca99d03508c7722f2e8322c811108e7c2b2d343f079af363c4d227d0120a7b5871be63c79634084212613cc7238c556eddf71df249d655d932c3906290ba4348365aa5650ede5f9d82622c75e2309e212bff50e8a17f4c1ce90dbcb10621000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f0cfa80a1516eea4944b85322c529f2d947339977291b3645d378e30c656e89fdb0d77a0817ea94dff1727ced14dc480852ef999f279e289fb2edcd1b15a88ad33e3f2abe2e81126372011ab5bc3506e6d3b90afe5fc4c37d6a7d9149c8a600b80981d6223200e1ff7321ad91397e27d5fc0eccc9ff916978d166b68c9ee845032b9214eb75ec1326e2461e32bb0f68bbb17519e05c8a8eb3f22525184cb9e47802099d1295a8630f50d99d4cf541fdcd6c3371bfe1110da96f0258e86c4a08ec360b056ec2e625f07564a397773f7df72c218a6343dc895a2f459494b916f4be95530faec293c7fbca18577f8dbe70451c93242e18a74fd949615c3a02bbac95466803029c191a9876873b9bd6b308689e78cf546c012e37f7bfd4a3a1b3fdaac9bc3a021a6c21220e6448336b1b3e2a7cc429c4bb5a9a976862e99b32e77407f814ebe1032e85d2eca1b15b9355d7fc5a207bddb35b04308bc5a69fb497b90f29abc2b20502125035078c762fdc753410f144a3197fc5a097ae1cbcaceec0588d7bdce6742d0302e6b6db7fffce818693a4d525e36ba6c08994156669fd69eb2fa50bdd304e1a5bc8c2fccbede6613c2dee00bdd1eb60018a18c428f407172ccb02e026ee6bb533b75f84f2c3da1b67dc431e916ce76455bb46d8c0d296234f2d5b85b109c7eea0a7027e479d92ee7c2a49f63667aa3d0b75871b69b907fc2814ebbdb5e2179550c424c19662344c7d7b57ec1b392d2bb99ed8af350976cc76c1528233b8cfce03ffbf3214027b76c3dd41afc098c5fb48ec945b4724385209cddf165fd715f5b97984e2cb26f1a2a92694767d61fcc7a51237868ad6d8e3e188f0e88af15171f66ff434e9e6f9cd871a9bf8be237958393aaf2cdc43e722d3767d9d563dbd6aa6da44da780fcb87163dc220d104c470367c9384fcb1d106f40622d76dfd5d6932123132cd182c9ae434895ed00e05f9f42c8c95795aec2eaf7a5252409b375faafaf8755fa5c0e8f1a082723530d71f45f34b6f249a6d82c369ec10412120d2844448933fc725c7f669ee21c5793ede4e4a70cad7756b4fc4f8806b668611f2545cd7631a63f77984e612584a0d759a31e57c0ad16e794864683daeffe985c101534d62f932587fe4c9e9889373b8a9a12cbbfc2a782868ed288ce10c7ac22371ce82230a69120909f671516c30802dea357ac8e36ac131406409c67d7a54a111f86a81d18af2459e97c489bbe6cf7a91ed6d30b0097866c5d049184ff96bf8b9ed9a03755f602e7b75793a8859b017a3a0f079770cbc3170289745a903251ae7915ea8953877de3e5373b5e787a22898f7325902f3393eb653296bcd1b63aeb1dc6477400bc4edac6084d9a8cc3e314f324b6bd9735c0faaafe6acb03acfd40156910b23e4bb558e7ced2de8e4cde52950e3701d46d136352e74f2435268db8ba6196b55b2a37b23fdbfe3f4111896b50521c21302fe22cf7ccbd8eb24cbb8b6a35abdb0edba37c0dc8273e33b28fcf2a01d9ad37d768c0df9f4f534afda0912e0a9a12b9c241e48a3e6bf71d87045941d5f77ec025df888d2d52299d3c1b7d8d989c5ef2043b0354fff7468b79e0a6562febc4ec62f50e57295f23e1ea4160a9d91f1e9d8a5744b1c1f4fb60915ce2cb975a40e561f419dec3c38201e01368876bbbaac39233569a94a81ae92c746586f8a67c446e36480deebfbdc360bf4985f28d950324cba0e2b8bc60a614b8aea375f7a2e2fddf2f7e4eae75c616c2966ee0fd88f684cafee1fdf87d28ecd2a5b971a43d9789700b58b525697500933ee606baaef873909affe10b6e9778c70a06c891319729ecf4d64922cfac0c0ce94916a268fbf30c3b94b778d31acbfc64f34a5acd16bfdcb4290e7804c206c31c168e17ecba438786a60de3f37c555cb5c856d0e16e56cdb19db43f5cca81b4f261d952420da2528ebd1a1bc9391a57ad38e13d4b22682e3bb2bf31b222c97e3800327e080ff08e389396ae8975efece0b2ba54a066d5950a6276552b9890df3cc8e8229887e0cedf9a218ed2683a06f204c041557ddd77029e64622bf75de61ef2e659092e89e6d97d56ba104f32f95d54e59dd7a3c77d77b1380f0c1e038e0ba6bef6ddd4addef4ea52a453c3a089aacf12abaae0def001a15bb4b4f5d679959e7f564e2ba9dc7771c66a7cc7ffcb92daaf6ffe4156b8ae463867b0256a24ec2c2d8482947ecf07120a354eb9748ad63e4008acdbff0daf93080b578dcda8d167150f040ffcf334a6d95a0f4433919a164a2b06f020000000000000000000000002f603e6922acd095d4ce3ef2087d759fdc921ce40ffe35463767c32b4d0f126a8d4149afb2c7ade2eb06283f9a16b01665e733685414b737f46cc8f289987f96bc684085bb1ba88f851cac708f3ca064988bf02a07c5ad69e3c2ac5d362d7cea00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000549c6134bf5f5f69bc86fa4451770417eff7b491f39e1f8da0106eb4b84dba74a3052736cca9a89cd74c5a420bbe61680f19250c2212c16d719d83ca15f3552fa7daeef7d7d5770eab618acd6db5e7c427204e033c28c47d61c7d8cb642ced1c1215b8c6982dbcec34538293c32f717e5b32009c74e912d23c7c48de9aeb1d51030297d688dfe849b72177c95475bae2de6e3f046b2662944b786637f8e70d6cab030c865538833934d3a868d3a748933fbc2cdd06ce9fba749a8429a084992c90b10b0632a9b64b35fb6994ef09956b430632770421a65700d3ac57d9b386f4a4f6d99b80ad283ee4ce188d4eb332920ef63792fbd608347a43f0594200ab34108bce03112f86c4de1aac84db6b464de740593537431012dfe3550dfa00e5ae0b3cb4670213d61a7185775d668a42de6fe6152f06c4ac8c2f474c7a69c8de0ca87725b61a031987b2cef5aefc949b959a8c216736c9d710a37d1a2b4933b4ecee0310e172d3022cffc7e2fa7e17faf3bde6928fc4bb2a22ee59698b843e746c18530f3d2966de032befe604bd49f825209f54bce19da50a5768c8812ff84415bff27010d9e54c39bcbcbae36e8b834a4fb04e8700f6acf98e198a91ec9c64ae93441fea51e92968271e5825a9496fee56ead2945c0379dbea9300da1bd3385b6f649ce49f32beb06175b90badd3b5a2f68bc72f021c0590b15ab46a025c8ac0d03f739627b29b5f235d96576c88580d242286b2bdf39b8ee0937bf5c30a2ae30f5c24f30a59a765546bb5acc515ab40d1d513695c724904a1d7215599b4c49bec66e44dca24e4ae74670b9e44437c5326d04322b58be2fabe992b8e858dae36b8508bf56c688cbf7805ccb19e293438eb13735b9a3f7f15942d4d757fdd2c853b00341acec05da1800e46e92be8ac9671030593959d5ec80dfaa8832609d01dcca6a062665eb014cb66d896faf78447af6abbf89e828fbb4c2aabfacfc2f58f3ff59cf3a2346281dc931a41e5c1865068ab19029af9217d931eb36d293b2d5dad58c65808ecf852be356791e9a46825fdf47e98d42d20679432bbb672023b308f566759241444c9e18db8a3b4202d6f126a19f82cb8fdcb473e20438d1996ba46c97bb85670eb56553222a0b414dbfb16f86d428305b7d04c295fca54fc58fe614b9ccbadf0fff7d7a3d268f59ec962ad64d7a3d3d663e5e9fbe16bd83a9c0b3e2eadcfb64cbad75b9e7eb13b17005661340deaed65940ffacacdaa1b5698be8716cf821d27ce56eaf492f246a1119f97c0daf504aa0cc0fb27714665f6a08275255cf5eaa0db242d784a79371244ed75e6412cd29143562465649b973b8d5b15944dce1ccbdeedcd6e8343075de033b07ffd5654c709a0dcd077ab9d3f0aea61cf9a82b9d05d4fbed34ddb5d5b31824cf7d9cb9c5230001bd7aae78eafba0a21bea035c7e0aff0eff2386465eedfa98273c19fdb067999b441e353c031a68a83953841c97c4ce063de15ddec4eda3fcb8c6bd06b208ff1e3bae5de76deb2dfd0e51d97c9f8af62d0383c99bc042bb748da21dc72af22b6b778097cbb496183ee07b2275410ddb4c74a521c8934616152be373aaaa5ffdbac0119ea9b42358fe075e601aaf45b23046e1464e299d29fd3ea3eb795964bd5b3b17309798ae917a50fe26d72d420ec8a33f5030627e6541790236ecadb113506b15554cdbf6a1c8bdf6eb1da3aa25b28d8d4d8cb7e9d8536956dddbefd684631f4aac7f7fd174e4297079fc77bdd20b64e15ef115fd1b6cfef0c0075ee8c255748104d1608c9d8067eb6309c9e6f1b60c2c3a00cab30732cc4c5d73a04074a427265c81fb86da53358ffe87a34f1103cb868783e33c19217cde933763c493c90b5dce429b096e277475be43145d1a6f04c52dda5baa2dda17b6bce07b0539f9af1ba51dc35506b765df3b0a89668162b594dfd5a8997e97a73e7f968ea33b96341b3b94fc2d55be45090e3d1e3e66e2040156f4166a6a077eb2ebc7ef5520e051b9a5d129b618d7cc42bd70cb599fb99028b47dda3bdc55aacaa3172a6825446d9f167e09db2243fca66368f58c9b59441328471c86cf822bf41809ee22c079339ee430c2a101eb2a3496082600ae98c7e6589bc1c0e99c4459558a0a7e637f3aa73521dc37bcd401a261754f9b6812679897a4d049c9053478a98d66dd2068cebaf1527fff1a955c8171896b005c5c9799d1a5b3faa0b7e4d5a6c7cba6af537742ba2aa1d6f3ac64f0b6807573c504f6b5d95b2236c3b15dab38d2539465bc0700000000000000000b099400200000000ba565002e51c454d628aa634d2b607872d282e7b9ab80e8c5101f8e803af9f6a21d9709e4e4af8f03c0ba593e89dd3497740219760cd733122106df930e628795f55cd02d5bc87f57a3b03d5ea2d1250fe25dc7e83b68c5bd01aadce2534f31500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a3d8c253ce8f622888e1bd79a4fefdf292d7d7c9323661712b08f553c347a6a63d808eb9f98e5060ec7ea7433879c59ad8cf6a8ffd077a3621034d8b2b9674b32d99f6ce605f8c02cad3f218bfc0452b0d903e4dc67aa7c69bee91d93445418b3005f03973f0e899fbabeae15ee2186436188e5a6a74b7d17b9fdf5bdb092ae0020016e145ef735fa5dc8e8d5f7187653fa5bff16561c939611104be817d6471dd0208b7f2ec3502c3b5f836caf2094044de10100cf0742ed342921dfae447ef60130a02c09b28f1900f4b96b0758ad9bb6ff93de4a283afba75d94ace54a85f47d1db6a7a562521b319d43befdff44036338126b2965c52df4fd33e5deabb8e221cd90318c1fdfdeb5d4d15d61047759b8dfae62a641395d920f6cf8d5f38d2a4da2e0a031b8e5e444762c3b05c19a95f73ba8cdc2cd7378f276a889aefcb6be5fb5dfd85020bbb71794b0136380963e0dde50b4021065a1fc62c9f17634c9e19d1ddd3e7d8032d08db17f3f4f0ae45ae0da0ab070188ddfcd233e670b3503d2b7117b86799fe022fc581259473bea87c2321ea68ca464857384f09a1407ebd97ccebd3cc1027dba553ba3598df43413ceb10eaf4d21370dbe27da1cd9c25787a9181f26a99dcf2748f84eeb20ff2c152a134e063b19b999965cfc1e105f887ee67e398c9050952de993d0ba6f0879f3af4bed4b780dd87231bd86fb3856d2e67c3176f786bbe6f598b1490f95330642f6fd97da153aa1ac9fb6edd8300ad6c5ed23304f6b8569b237e2432d22603976759617040a97a613ff17d60d1da161929ef9076dd9b068c06aaa6870af3090955788bb152aff75d92431243c1c34f099ca29a778b6adc50641c4422e49c14ed0dec143dd8e7aba25d2564021ffc2785a59b6383d25bcc7d02cf03a43c7adf0e9239fec004a9f5b17460e0e7a7c9bf6f7a5bc45b06335735c59ade522c89338f40d73647d4b4f5f8d86676bff43756f8e4c30672117dbe235aa108cb48bd873200a3b8db31e8c7bb3109e2bb3a293a8f663594eafce5314a237c7d7d6565bbaf79afd73f772329a50b4550aa2e1d69de05b0f23ff55a96255ac1833dcb3449e8d81c096000a28f35a0e41e75b75c635fc85d2ca2c6567b2edc9a2a42d6c92585c2a985e02e4993895b0a661e6fe26f8eb4713f04681ebc0dd9aca6eb122bf6b266820a899e9dac1e634abd97c18af846d1fb7f6186b0d5d429565668c73cffc2cdec5cd413ba3a26121ad93f5ce3711d92cc193c977bed8baab03f553b5a8eae376f2121dd3c66a87a7459967c629fcb32534892eaa666f034c21507c9a30b59a74ddc54fb5eba64d1598e6d79586cafec0c902eb0369c1f1b91b4f3cf97263cdd1ef0c32655976669868e483084fc706b9c593fa0f2641409986beb6be2829af11ed4c2f6608e441be7929169703ffd3f46fcb8cb9a583cf644541fcdf015d21d5267a78792dea3354944c28c90c374dda98ba1ca141d0b69a96900693007c4e4ef7b2f59dae4c7a3b374327fc7bc9baa098e58d5581b62d18e3ea03ea43b7af84d4365241418dcd91494783d5b4f39e71ed428d990acb92d21c0fdb01adc56e5bf74d16592d1cc0ea7a1e90e8a303958224dc1783edf268bf1b095a0647429f30c76e3a598044fa79c0f8b700fceeaacf6d8cfee715ec3867fa16171467ce7f6e3e23069dbab217288e555295199171f31033f273d607e1bcc5676f092bf8a5b9a0be6b0b34bdc60c4c914ab20bf0f0b9b24db92d1cfb7668065a867e0cbfa312f7e56a582bbc30304f94b287d7b7c7f305cad955c90a2dd24877c13d512f28faba33bf9144e4253b40d6b1018b62210c82a978fa15d92667278cef7bec24f28e417aaf046fe4529b6fc1120c6f571d3d9fe6552f2d750ae75a3be94c5d48b5b6092d8d16a226999cd2ae110334db8d17677248789d49da74870a35696f2e85d6e02977726035390dda81537bd3ce2b6005a6eeff93293dca8c767ca56c2b41f420f419d8ba6b941c8f582594bffa167dc27112bdbaf5dcf4136510759c86e54979ec8669ef384e9eab7ea7fb6fefe99c858ef66185dcf53b40caf36634e2bdda18eb42692675160ee6ff7a61fbd9347349210f910fbb08d526d607c224de5b2321a015e02ad5950ee3d36faeec53ce6d52b0a8dab0f3c6d19d27b2023cc8579539193f4538f32aaa794226c3c311e43af87a78918b9b36ccfc67b53cc935df47c6a155fb9693850145c026da718ef8901165c1cfd41c4d5c5a68ee7b8e9821a18b8106701b2de7b7652477c5aa2223b1b9d9ac90a2fec4668e583bcd386ff783b831aacaa1b688910acdf1cb596e0696bd3ff43720ace0521df9acc96f64e015a72e1f7125eef15ccd68d2816f045f70a1a0e752e3b8433ff1ee46850bfbcdc59c18c388e012cfb0d", "536365535352526563", 3, -1373976644, 1537743641, "6ca350ef302e0c4b5b45c110758bfe326d415736d325aec3f9bd4ccdb91a615d"], + ["030000807082c40302e3e16858f82ddff037407d2bd2ebc5ce61ce982c23c86fde6ab800fc2107cc0402000000056352526363fffffffff60d9ef254167087e70d3b1ba8c25563f898c8d1c05a867cd93e3ccff5d72e710300000007006a516a53516affffffff02e49792020000000006006a525165ac669507050000000007516a656aacac000ff4640f59133fe70112132503000000000000000000000000ab60c6206764ba77e4f58b79faab2e510ec016d056e0104c20425a8954a26ff5c3b5f7f93e1d54b7086ab1aae4f75abf4786442772e87069cde4d7fa815b7a42750f9b3d7ea625df24925fbafba4353b11e0f6d6156f9d0021f6b4b84c28cc11000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8f928b328ef50cb35d9b6954e77259cd8a77a9907689611a9743117830207aaea058a5a472019f2ba5844b709f8010d21ff0c24b56f1dc6110ef9b2b42d5a0b693b61d8300ee91a4b5e3a49d4e3b003e19a94a83c17fa6e981be29faae642eaf8807ef66675d1c5452e16acc7a807932bc3d29abdc05063150aeab4f909799022aec3c007cb2aa249ed243d27b79af3653fab95a3d3f2421ba0a769ae3d4ba7803013eeaca9abdfb57a937a859894fa9b9967a2f02abd0dbd3fdba454745931cd40a010e7e87b198868ce0759e79203d904d3721348220ee0be8de75372cfdfa8aedb350474c0abe41289c7c9eca8a5229884ca296cb8912b3ad9eba3afaee1655c20326f78756a7efe981d2eab14ed2c39869ea824642a6444b87019aae0f4e1d3d53020c23941d306fe413175f653d8de14eff946744fa018434b766b0771828c0fdce0302b65190029badceb270de1245a13079d5aea024ecd0db9572d724232345399d022155bfb3b49692160fbbe6e97994a6475cdc7ab7ab61f9aeaf30cbabc54752e6031f238a15146090c0760981daa904dbbefb0e35d06a6250c50276be89905c82fc1fdce3740d7a99069d9b2d0fa4497ab494d7692c2c5af8beffd772ff0a4e1101d79b120ac59a2caecbcdfd97a1a6699fe0b690694f942ef81ada5f130b2aae6c80da554853f2bfbd463819bc017cb1a7aafb7e855fa548f5ca2a23e56d96cd626acc8bfcd6ba44cc435119d58c289367c2fb41dc2cff3a265e36239e3102ad269a51f3c359b563d24c2255bc3810e7b42db3e5d10d049c174f0243fc28931121770b70af9807829306d34358c4728cb7d12f7f9157c90e6132e11ecf12cb15b0be6eec45b89ba1c260be8fea474063975487030c81b96b23414df1cb7dc742ee46ff7bfde17df0e75685184366fb0cab475e31612fa7e5855b69c69ee8af00a3c6e0388a448a86ecdd0d8cf474beae84da32d5b4c51376d49add3f4f24dd7d0db5fba13f21055f781b76a10da484dd43f22002ff2b2f18f52f5166c1e6c720b2422ea8441f7b5003d69d3b047d948ded8cf7ed8b4cc26940e3f88d5801d27dcfc995a28c5f785205248099c1a860bd9cdcee2d96d87bdb507c21d8a5130b615ff681dd2e8b6ea3146e31042d6c8a3c79a5f2256d6f3a933fb5e55259778d6dcbce8202fae2e1385ef3bc2d8e9df45d6b463c9a3659284312cac7223b7da4ae4f1d4514132eac42dea7012d0fa233b1456abb7018f607a24f121aa6f4f3f67c58190660e272f1c7372ce92b287abc358a2f2eb6893b48b2fa5dc1f8e1e596e00d670c3191513b06ee8919ed8b694513f61e31b85cfab2c2885cfb7584aab9900073ee5ef6959aa55ccdddba9d1a6ebf36c5bec0b02056b47d84f06b389810c9be3e6d3c534809f42d62970569f138650602689ccfe815367773fa3ddfd1be7893a3a09e967245a7b87960e991c77158ad7c497250a55ee6c142174590e07b460ae7a285046070001d6e11ea93664501e56b46d6e5b557aab966512641528fedab434493e259a359b94ff26216d6c8b7a2dec3dbc9edd6168e40e5e8e15596307213c561bba915b78d405d3238aa5b4d1b4a3530f2d4690a945fb6fd91d70958047770250d5899424467a32dd231bf3512181908f3c0567ac5d125cb440129aaa96824f670bc0e9ba112f32cc0868a8f597b8d7680ad200ae3578ea497be6a9911335fc30512e15c64faae7a681d69ad7fae825eb84e8383fa1c2e3a2298e699c86994c442ede0fd9a11f1d9f8eae3ae55bced5f5f1c5b270d332e550654716d211bff859b1857facc8af777a1abf2913c40ceb524827a987c33bd98f64edadaf80ffa67b6420f90cecf6aaf4f68bd276d9df19e98df562033b96cbc3eb84637f905509fc911efabd5f0bd0d21a103fc3dfbc1f08c6da6fb5910c78c279dc95acc8df32a6837592014d05a2bd4ed6848a90b9aed307cac38575e47387496bfd2d0666ce310a1a487805fffeb2d5dffa0cbd472b48f8770f9f330fea888943e585447f0645f916cd0e9f774d129077aa182e9af06f8768b20ac49eb3be650de4a5ff44c1230855482c6a6cc34e675e84ed9dd1eca5718cbad0a004e91798f1a82808e69059bf1bf7828078ae21edff54d7a7e4150505364f86ea3131a4ddd15372af3ea17ed4efb06064ee6f163bdad0829c3510b56d95c94763c33a078beddff11859f89bd38bdcfba47469d621be96baa346746408dad8aa25d87a19e0c3a7d9d106904a316e27ca157ba8d6048a994e53906a836f582c74c30f0427c16c6a15553f2af5125a30f26db3a91f639762edc0e73f47005a4aad5c8c969f9970d9fa9e3e1195e8e6df84226fd9bf14dcd6e53f323911bacd512d8781675d52de9dfe15b8f567ccda8f47e1b4f7db61047e1df5805", "5363655365ac53", 1, 801416275, 0, "88743e8f517207abc6aa24e90a9b9cd72773d224f07fe0d2aa145bf7cabfda4a"], + ["808afb780289b60a0e9daaa37c80ece47455af9433d3c33caf578964e69c15dbb3b64136f5030000000152ffffffff6d63057a5ff568283ef88d4c7b4be772fbd4ce20342987235bad5ad280689ca700000000076365630051ac6aee3bc56e01911fe900000000000300ac657ce445be0251ec25020000000000000000000000005d546d1535afab76beebee62688954f09bde4ec219f0b0b9b16fbbe35fbcd858b71eb3804df9317a41e106e8327df4a78680186d2040def246b7526efe3bd9d2f6b86ed0e1a7ab4a31c9eef1b2e6f51d393372bd78f0dbf7111644ccefb25f8300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f0d699a75ae2d5564d1487f1ce4b17467579fd5dd17a0f042f7f23f99a49daa44b0a26c0b9e4a16b1c95d0caeee6344f5b1a6434ecfffb5951431ac9d363ff7bb925f7336ae944471d12bcf0b33b5112758a6a00554956274bda278ab5c9718bdc67b280871cd00e64213f7d3ffffbd64fe849f4b7671beb13b56ec3fac16ac20224b71613693c283e26823e8e02f764dd4ea95592bd2a917536d3557a77e24bed02195a9c8456a960ea694a9c9ccd752401e67be9439d878861bc23d66aba47890b0a000e9dd27e84cbc87ec5651014cb9446ddb642a15b94f4038e59d7ab31cdf682c8ede61cea002fbb3c8dfa6cde6f4818fe91cdf0b339328e23d8064aa09e058002143a62e5059072bf708cc3a8e9d6e062eee5c8f75425f9f1d75eb68e60e4aeea0221c62d3c002562611e4b3f24dd281a4ce87241e2241ddc879561afbebcb374c703016eeb158225b77145b1fda8d1a3cca3f3cf31b785f14c001defda38ef348973020959a8e4302221470482db34611e3a12a8f50255f86ab769550e68d7c3e17a6602149287122186a1bc1351fa9aa29251a79acb16ec14c804f3b7e8efcf06ef0cbd4a0bcc40d58bc368b5ef7a134fbddc5d9824bf8edc1259fc7cd988d47d0cd2e6315359e399e6269645cf7bd631363fccb1abcbc3837f646f7fb4908a1db93c509bd467040777e510a50654d913c39ab49941aaa7a032c1f72ad78472a6c4a05b26d24edf59c3fd5d119a83e4ac2bd2b6d723e861ea4647217e07aa0d01e8c2b490767c02d1a0f92a0b4eda760dac8df9c3dcb740af56072b477f7a40e026410559a8edad69b5d05ad24c29d45cdb1e96b94f001ace53e0c28f5590313e55b5792d05adf2aae3235e2383b2e3a618dfcdcd04fd9b12f11d74798f4d3229b96bfa4972239c0da7703cb792d4e58697554dba040f9b6cf09b67fbe55d5e8f2a68e95d3a86bbc29bdb1f1febbb3472f104d4210adb9fc00c3ed025ebf44474b35ddea9892da08d88a1256572c7f4c3fac78f93871731f63919ecd43e10b22bf141cccd9399ae7700754804d4fa5538a4bdc346fd2c4b78a62d9feca3ef1341bed9160feb25ab5618574fef8542d7c8f712d46129a86591c8d6a69678b793b3d2d2f16f9ccd472a2196d97e9a51aac6246b0708c3c74085cd7ac2453cf7e6395a2be2b3851f08e85f67c57820aa4f4ee757c8b19b451f2878068d3da8e1b7f6b18a4cde6501eb576fa72ef890bda5ecb1b70292c228ce0abac22de3ba3760fdc31159d43ab3c3c1dd14584397ea69b8b543fd7f046fef7260ad80c95153cbd9ed51f4e5799f2ed86fae65dd4707ef06174a62bc7075df3a7588a0aa480e80fd4d3350376c80010a3fa2569356aba9e00ea0faf56fdab8079ec5eb964adbe0e58dad7af700cdad1f2e010b93adb29a68a2754130dd2b0b9042e9b9a7e7c23960f626a588c093d66f4db87ad591609bfd5c8c8ffe522f65355c61d79c50866502c199482e3bcf66c1d0a94c7f2032538fe07fe3045522fb4b7c9f7118cdc00d9f5f6d713bcac1f231eb333663c35f14bc93dfbe6ef5726b1a67350ff41d78b35d83558a60f5fdd0e89f991767048687dc16b8642b3607e807789f281ab3775c4e3c02c1f22f195b2d0701d944c4e6f1c325546da3fe35ff978561ff2fed5ebfd966b69d1b51f64f1b26eb37308d71448b35b956f2a0af5d0306546f3a354941b94014ca390821f27d1eed208b33c7fee328c587ca2dd5fc82e620525081c897c3514e7514ee5a32b7d89acd33bb223bbeea300772d2ee555d43147a9d17791404827e82e52a174091452832e7b8736fd4872474cb100f41d889a79cc3fe47499df546469dfb4c2bad246953f84bc63f650d74f348482654a021d3b44830a9cd0488412a5abeebcc25bd0ce83dcdf7a6f86af46b7b07f599292ff2f41b76e3c38e31dfb61edded4f5b9ad41d8148e4606582e1c0862a03536556183ffb67681d3c152dc4b92ccfcd022b5f356ef7db977e07a4984ddab1d11d1fd7d3f226a761d63077cd1326f1e8dd8d368d0145d897c380a893af59dbf1e2b7de95d7840d8e139cc9e3ab3031b7ebbd6fb24ef956a9ba39445fbe57892a558a925840ebe85c6c0f68c8f38d099f1860456d1d1a76902748c18b944f94d3361046d8fc8c8b47622d0cb9c5bdd1bfc12f64eeadf43f2c018b8d3adbedc873aa5bbaaeffcb5e81e4fc8661c2d47f1a9b6994bc8445aa22b15c5109257183ad6c93950c2ba42b7c15a4a140cc91d1414c77d9a2e3ab2ac166ca95756bdec396d3000000000000000000000000005dbdca85027e4082725499242ce5bc23d2da66d9451705d335ead4edfe0124120c9dfbe02814da8fde6318a6a9fb6fb9278362b951b9658bf8316986696ae3fd5757a19a27ee9cde42133c745d101c9d89f6e77c6149a02cb5c5386e0cbde0b80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085fed1a0b7ba363fece63cef026a73e0506d51c7780788a259f0748ce799cf9cd917f0c7edb290b2d10f3132c5827ad70ee492462f4426b8551fe0ac47b34033530673f8f051bc6af8671f2bd6f27c48e542f4c9c86545cf59494d78c524bb3ef79684f895cd65091467d7ff09272b5ef6c2e8b0ae9fc56fe216c784da7c56070228f95702eb0da109dcf31131ae2e79e45f7c2430d0c64a9fa3b60bfdca38ac1103172e49183329b7f2d0f754c9a0497ff464d7a30650bcd8125bdbdddf1791d9a30b06fecf7ae943ad63bd0fabcb263204d7d6bc2e24bf89a9dee89a228f72c4755430f1c2b8c25b97258a13fcfac3ae9dbdf2cdd076e7436fd0b0fca7f73b1f4d810206d412fc184d1e507c93da48e25432bfd16bc2f1f158a2c7e6d3b25500017a08022eca8ab73fe5c1a4e32474d0178dbd1b229365c7291afb92b4ac263a0bf65222022f39dfea513324ff5bc29f4996832496ea1860e6d42796819118b14a3b3b4a450229faafa1a17b721eaf29fa5bf13d6554c89ad21423a061f1c69583b702e2849902161f31382592acfcbacd6b7474c359def407a34fd26381c435e6cd1b1ec79de10a2029464b28d0eae9820c6e6b9cc128c31276cee206915c560dfa33504eb74cbc9bdbcac89189a2bae8c40c36b2a3747890d2950045660c0a7a6b91866b1e0e068533ad1e2a41878b8fb7a75e92b6cf73792959b80fed47375f90a970f5e5e916421f768e27726880bd4c1f92f06d4bf54ab96ed42bf2a56f41df9a5c702e8a7c93e1b2a2725264742ba2e294d8fcffd96e058e52863d6bb732dfabcccc7cf8eef97876e680784c20799d5dc4ba1cef8086e190581509dd157e0a9eaaa679049240fb4c6d67bd3323143326230a19ce8bdf32ac73940308ce965feb7b5af77c9aa3d53c5634a6b6e83816f03a1c3358bac5e2636bee3a0052f8417d5f9d73a42a86adfa1e486dcfeeafe1e3b0319be22ab0f9effb82da5b05f09c73c39ea10e49f6d28f7f3f961050357ae6f03443ffaed8390fd418a78536572a75c17a9ca3f0fddc28090c90a83999533ca8ce498c311a3534026a65676976d320ac671cdf58a95b0f5e448246d5f15569b3039c1c096d89c223158415743b68fa1bf07869b9d0b655f626bd6433d1f93b0246334dd75431d94666657533540e3b853ed9eede4088911d3f3aa94a18837976baff1240ec8f838d123876a9cc8c330ebd0196feaccf80f5f4e66bf4e0221d18e5156fe208d28165863a97e9e79ad3d07326cc72de3f0869c8031ac583dfebd392c2e8d77bb6dd165c1348fd78dfc95f691bb7f1eba6643174fdcbf58175038894ca5759e831ae8e2b25e3c96f8235e1e3a9d1c40edc5a78d69f21e8b91872d46f6b275b071fbc2c228122877efd511bba502989efcad6c3dac1d5ac1d7bd48e09a7dda65977c7218da7a26a5a7924aff55eb73d7f6a8556af49e0966b434b6d18a0be7a4d9b4dc5d25d112da86da46fcb0d89aba389a3f1bdd5de2808d52cf08d6b8fd7436c62566af4633ba31abaa8896eb998cf489e140fe31529a2a83c6cdd4f7f78168251472f0a9bcbee8cebc9a3843bf71d810a979248eaffc3e34a5e5349b3f860b597708b3f3636216ad5d18e3179fea79e67bb3ce2571ec55be5b7460c4ec8046f0e839f4ab437cf39cce66ebd81c67620a72413bfbd1400c5848d1e7cbf89ebaeb2a4c8bf7e96d1731b93c263c5b09c2488fd206bd01127316f52a8155ad51ffe3ea0565e6ee83d8fff621a4e13af671160d90908e5d7f400c57230b74cd12db1afb29c1f44dd0125101823063dc01417c6b8f11037a157ddf9f01e87cc6f782d0e67db135239eff2e6698dc565cca1e61c0cb64f2a86ec4ff5d05091fc34b2483e51eb072365c821ba6807e1e9800e28d5b40da3809478c3127175e3f7555f02fe6a7f5d16f639cec6b338a5f15f906ac97635fc4639fa6a54e267e2d85bf9467d4007b87cc4c04140a862678774c94a9bcb7e05490fddbf1996812b74fd3767502dc2249d97eeb74fdf9b9a55bf5a29a255c4ecfb292f562adac87860146771d30ce2ac41bd01ca15c3816718682ec99eb3995eaf5d3d4d79c7353818944a246795af0b5936c17b24222f6e2fb0d6b57ccb443d653393991047542525431677bdcf4401252cfaaea1c3153b53109ac1374e94ad4ffa6a50e28f916898b3d69cf13b5f883182b70f0d8f79bc8e682e37e59237620086e4ef74def2b2300221b667d074e9dc55c1929416b8a87b8fc74f5975bd1a085cb1809ad7899b0854f80ab7c6e05cc130e7c82af5b32700cadf9314f65494fdfe2228f36c2fd281ad254a88dfd5185e98ceffacdf2e494974b7957e7c06a588bac17aef045293cfabdc5a510ece15d5fc14136bdb6d92869847298caeba3607394b3f8ac9404fbd1603", "ac5353006500630065", 0, 1826186113, 0, "acfee0bc56b80e7af6ab28588efe82d113adf47e9acb10205ffa36d7abea0574"], + ["030000807082c40303d04eb5d525b385b67c4df43274660e234be2c748b8cd03eaf91164654c8de76102000000056352ac5253ffffffff433659e4b1aa2ba55acfebe9020a9bbb9f2c87f9e6ec0a17c31773ef3e5cdf9702000000026563ffffffffd2d8138a195d19fa8b91876a0e480489ec6122a4393373acf667213dadc0147c030000000151ffffffff01e2cddd0200000000096a516a006a535153635437f74970096072028e817203000000000000000000000000ed49a51d2c9933c05cd2e8cadfe0f6a14d12a35252d0a92f3a2736c9476ed75531447f399e0017ff2490fdcb45a3c81f1d77cc91bf58d7a4e1f96611413705a2140be4497e03d731ed67076341be9a48fb31670e8c3e23d4abf416aa4fa8543e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003dde277346bb3fbec801db2b6048ba20292fec7f338f415abd2b14c527282ac37d6192d7ff2062938dc1a2bbfdc281511e4ab6ee964a7ac937743bb185673817c537b99e1c4936286783aefec686b4b80ecb316acf60f9939363f2719435a03fa9ab72898e0a3509ef323b50a237ce57906e93e779e68243b92dc7408e280ee3020a99966ce89a94d8acbe4229db32a2908a2c7cfcdf142132bb572e255237931a0213bf53b3a3fe43c56ae6fc2cb7c3f4fe60cdcbdb8c14b03fc9e26653963a9a4f0b0253aa76ea56cccf38d7e6fcf202ddb4546a34fda1260c09aeed4ef662f27c7180e76851c66c5717b78e88a1af9809974629b4ed3bce301af41477370f3a1e7d0309b61d98bf2111e83c8f2c00af63c0e5e200921c3f54d4fdea6fc333ec31c681031af13fe9575acb591de355d59d112a83d92bd5c86e16bc6630ffdb2c59e9524c021a6a1caceab8de27fae938f8f455a132b48d0a3c626401f29406f416bb7bb835030b656c0b99d608234cf670bd25e8eeeb9e6a941ddd0123ee2e8439b5b252067a020d4ebfd95a4a5f08de4d40c8afddc132269a4682d50cb9bfd2776c139d146ca458cf78780c903c2da30ac59c5c8f1e47b493ffb4a3e3d2b3224743d5fec7c5f8be14421cf7635495270a59c79f7defdbc998a0257c4f587b816e584da58cd3bb8e70aec995aeecf2f50fb52d409c5c734c6ab57f2c16fd3025ac779e0aa7248f66a98d664eb0b6398a77d95ce8fb62835dd9f90f7d74499ab2a5015eb0e8a82e95fa968eb647b7ca4ede90256d86160dfc69dd494626989247d73ae37edb2cf07e5e07ff2c0b583821667090695a65b85edd6aa6e6b4e7553240b5c68ea163db2097d053e7c307b93dfbbdb5bcebb87286e574923a3135f568cc6c09588b53165c3767a49d5a7ef0186d454eaceaa27cb39543d094bc91587e1a2baa8fa0213828995e217577382e86ee8c87976d0ded803ef1ca0028f5dedbff8c44e03bbcf92bb0f83125c3a865c9f8c6d8e9d21b1258562767967a14636bc970005c4f1a002d4857e8f89d8ce5e425861c161d814afd1cc289d07667fd1a1a8f734ecb50a5d664f9e3302d426b2682886c73262ec8d898623e2880b1bb4f050a43f06f80190819d5fd25102b5adfe7c192f9d3011a8aee1481ca4303f76e285a53bb8211bcd609909ff8d156cac7d5468f0a8543994262a5d3db9a8e52ffcac66dd2223cdc2288eec409fc55dd7ac5cab144d988dd928b89c274ad65a7658550a6e93058a8941958ca42c7b214973470cad9dec228215568b86a34ecd670001249630c10346b16198871b895c72fd5d930f5e9d16ce3e87f72147ba2adf5eab29522519119e672162c6c875ad69b8babc75fba01a6e6812ee9c49840fe2e5dfc4774035e886ee004f08bd7d91cd13522e45e6d13c04f49527397a981faecae4427e5a1a367603978872b8e42c730278506da01982ffd7491875ce605a23acc6b6115c7e211196abd8c66cb9c9420701c8d360177f1ca251f7c594e1f8b97cb06b58d3121351ea29cafa30ea0bb78e638d9cadb4829ac995a922a54ada42cb6b81b1fbf172312e26a7d9572f0cc25f5e72d3e5d60c21572c426bb87406ad6709286ddef94ee9111305189f544cf979480291a86130862c2d378ed2a71fbf49755d7bb17aa45ddf8a587e5e5ece269582bdbaa1f2e4279b708f713f5952ebb2ed5c3cb7979b0cc473edc8f4c3a605e1f3addd87440adaab154a37ed814a623411ee3bc9779ccc96e861d84e18117aedcc45b20e0ec1d58ee172e84c86655037da1316aacb075e99830a9fd50cd3f910a3ce667d3872f29dac3b58dad3f0fa3c391dc05c419e971cace1dc046af9092eeec48d5ee01ff023bf98f449585d3474c73de25a31dc757707565701a77a841f3ddd888aa71a479d6e5a572053ecb8d99e6e5f2413f199b62c1da5b19a382f7502dfe949c14553538949e3031533e108c07d93958ce71e8d7670ffca1d013addb6b90b5d02d2acdd264fc0008f72b829adb734d74af86837cf6b55836f7dde672536ef0a87450cfebb8d2537f80cd995377ce8d663e14f272a3722ed848c592dfa1230c3492326ffbd5de263f4368674ce7e40ec6c3e7bc23fc3e8e1ef89b4231fe39bb79f2255cb2faa0f12135b1febb4c9623bfed2b763aaeda82b54f2656953b22ca3405b78a1c03ab34caee58d15e94931083d9f11aa0e205ddd9369027202d1105df68f3e493d13206a4bc48bc1287747a069184ecd29843ef6fd279eafdef3cf74c5dcec43c0000000000000000648a8c04000000004b6a7b10641c4070151b9275b451d7b0224ac238d850bf103e01c3c3e4b02e29b6d55f4041998d96299a3c602d60e60d3430ddbf6b96ab0b354ef39139928a5a0c205551a20672220f011df430c3088ee0ac23fd1703744dae93831c5d5a7d81000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006abdd2e2dc0757d2c275b9224a5cc252805a564a74443bfa5505d5bfc3d81b0501570aab8a840e0a0a794ad3e7b3d8a94aa67603147acea11cdfadfda713d65ac248f39575b4e5ff238aeca7b164cc05782e7ed4a0bf10a6b58290017fd0b1d7cbb46f51b46be0f6eb55fbb73d927f0379c2530e7b0f20559ce56c06e1dcae71022901ebf6f900169572c7012550577f85cc8704c5a2b3e4d0f1497921439958a5032cd42bfceaee3695c10267662de9b9c85e7d8ebb5be5482183e0e9070ab93a010a04d8db7afcd3abfb4da7638dbd40911d098bc1b9188d60b11e6d264cc16c701034cd2489cd6ec208e1337d20744fafbe7f3faf06ac319e7a42bc0698e99755eb0330209e3497e03de52daf8134ef7d81289802fece1c2595e7b1e1f67e95d07a4b03274fdeaf3702840a9ddbcc580a00007c4efb9a7fa0f884477124d042f2ee8e33030ed031f11e2cd71dfe3d05820f55fdca179ff34ecc17a437f128f9d5c1c5823c021998445efc913163f4507b601675befe4ff57af9ba4ca5f953019e172243057d0212f7846a4be0eac337fd955e88a32d9192e1f70c286edc9b372661585952b9618342e8387d5daf8de4e1e973bb6368e04ed38627001754259e7efcd370d0a17898db2326b68f04931053144a4d50005ffca735735ee0bcce9592bfc8dab78f55cbdda59314c468f99ba85b53dc2b21d9b3e34dfd27bdaf37dec3e17cfa14dd0efadfc43515bd86cba0595b5cba61184fd271c625bf925601fc15383b536ef7170230bab25776ad8933e39f60e0d0a6b8520ab48067d8d31422892f4c9c12fe37e45608bd12f57b6a69ea2d81dcaa29b157dbc9bcb7ef523cbba2f189a8dcdd8959e451303ac4ba35528474fb1f05788d781814dc45133f6eae0cd0ea78444aafb8e3655f6bbda05cb1036c93a3ecf4122411f35bcef56bd34518b6ba6d1390ff0521b90a5b78c15a4f08c496f0c0b22cac6f3b7454f36b2ccad0094bdff729fe3a22983d197079a7b0a09b29d98734933900ddb5394db6bfd79c61653c708f0ab810cd0087497574fccc4dd48c7f0f9035f7c12c34b5be9e55fdc2879076cf1b460b4e6b9e993f4e33061827fb0757a311d8b4defcce6aa54c2ffaaa18bc66ae4f24e1bf09edb9a94fe75cad631332493dc16e3853e3419826cd96209bcb495f4446caa09f93bd7c7c86708da2b7b1bd393f997d962f3e30538150c9a54f4de8b1a57b8ef82e36afedbcdef8935d5c702b7e3e34b364cc8b989cfbf1c37aa5c7b3b029ec1e0bf82472513662297e8b81ffda1cbc6d0ae16452ef191bde806c8121508c60f30d98fcf50f654b5c9530ba462160e1f98dd5c58df91ea920a883b9b9f7bf4f22aa95bc105da1be51a18365e990a07b0de2cd54e9e307ffc12b2e7003c6877777a636fe25c99f118eeb8df6c9016adcf281cbd0792ea5588da6ce95e8e80a4b9797c92a02cf327099dbef7c2aa8774c8eb9a0b877facaf69116f1d5551d7125aee27baf6bb03e8e7b1a3f8f96e428d72918ca74e701a858f17b255c767ad8f2660787cb32dfda3dcfca67589e2bcd5b90f34f50f774a72d1a27b50c1545ae7d59584f0ea4188f72cd855d4b5babcb15aa4612bae43183a71126ce5bdd24119be03f440d3d4ecb4f454547568caf67aae03d04eeeac0e00015150fc3dacbe3205ae1bffd25c250a794479c6db1f4554568dd92cc6252fb7ea881a09d959248bfd5e57d19b9eff13821473aa397ab7286f8c7d8fe56d3cf1cbe3ca174016359f214f023486eda246adff1fad8ff0aca6524c725a6e053644b56ca55f75970189593c9366087aeab2a818f5a66b922684f879fc115bdbe7a30f1a93a955d11f655a2b77f5be579e04b90a695f32d772d9f727bce3d664e31c840b52c62adc46a1a742fac77099c7986ebea2c0c04d2809cfc3b55860142aa1969b48d367e949025b1caf70d3014c69fab7cc19fe4ba4a73eb0de06c1e19715d44658f85313f98ed938464b43dc5869ca134523efd2be9c01e7dc23f98cb3cab11ac302a08131e4eebfca3f89e2dcfc0791629d1016e0c5099def9c387cbbfc1041c14a470d3b4c6f50696afa427c4b7877937dbf1ab428830a164065a658459cc51f127986e5263dc9e6015e5e93aa8ad1fe0607e41a5017cc7395ec637329586f7dd656b9d6f34ae916fd9cd2db7d95388b7610454be0078c3bc0974cdb59dfe23f7f2282553ab986634a642b730b1c611590d2f41fc58a5c1acfadc0a67500997def0504f18446f9fbfa6cc1ca4ae136b61ec605eed7062a4949d527f9216bcc28bc2fe7fd556465fd568835e24a9ac107580965db4f5fbe188d1f27313cc986bcac51efac75be2e0c781d7bd846365600b5e76f498ee138f430ff1ef5de732c1da849b3bc671111fa28d7f3536cd30185b5d6d07", "", 0, 971178703, 0, "1ebaba9df16060cd2439534f3aa7111cc3ab0ed3b59c47005a02be58bd74635f"], + ["45a2a60401557abad87904b0fe2a618196e5136fc28483cd8c18ef5debc82bc80de4d7139e030000000152a42a585c03264a5a0000000000096563516a6aacac6a6a0d136e050000000002656ac80931010000000007ac516a53650051b2daa45000", "6363536a5300", 0, -1766309209, 0, "6a36e6eac9d764d63ebf461fdf5c6be33813cbc3bc39f4c1ec4b9028deff83bf"], + ["89553f1e01c34e0d8f39fde7e9f108717a53bca01135f8721ecdb6c537a43816c6c568189c0200000002ac63921d37b2014847b60400000000066a635352525300000000020000000000000000e6e9a40400000000593d7f9bb78dc5353307b3f6cf6013ea11e5769bba7a5428e7437458f23acd145008c62d971bed7713b2859a59587f9a1699974731dbccb1bd79f13de7fefc3d8724daa3420d7e4fc78d152ce2d5303ebc4eb3dd4790936a39fb1438caa16d79000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f2247672c558bcd4695f93510e07b571cc63cf6bd0b38d471c1a3dd54bb24b2283755ea75891f27d1e7ee66ecefcf916fbab553c6efbec78c2511a93946705a5ab4ab714939b7b9dcb9342b7639182572215e30cb42f904d960f7f44712609ebd0a24e792dc9d4585c1ace7b7994cc9adc26af77fe8fdb29caae7d8d7d146040208645b1b0c8f7c7bcc1a2a1818c05b53393f022524185cfb8d1e8e707e3b4527030983ad25b3ad706cc37aa32a0aaeb7908c2d0639b1cdae8171737e4100795c8d0a020d97efc0c2f82f2d506d74d0609dae53e1d688169b79a12b3d814f5fdf8207f53fe41816461528da822568d708e04711d0e360125f5b3ec1fb7ce18931971b03150da68e8b66e77c26f08b2700baef95fec71171bf47254149d0343d4283c17b030a48c9af684850a8f25565261dbfafda8206803811892e4d26e05c580ce9360602035f387d30e476445ff8fa35930c76b65186f3a20a995156a3465297eb63eaa2021ba1417f6fd4560a02d0960de0598c59d9c49dacdc94676fc52d07efc79614a00229b6844c29e89766a9755c50e200993163f83dfd590f2a4ba07798e5a3e5d1bfdf7cbebe8b643e77d69e862d9f5e2e67e00071e1dea27892b652eed099800b0047364387fd4c78920bc5b71ce928af479128fd1ce5b71535c16f1d09144c63fd38212e35ec2c928d6b79477e00de16cd3832fbe1e5144b6c8b0e880992554f395289c178575c56bd42e53609f9a00f6a4ab5a98f8b6f0d28556e30e97c8a5d579eb811330afcb12120c107f1b2f13fc49d4ea1435e7fb4ab82cd63e2e44d40fc8f9554d5b1b6be8de2f7cbc769ccac226f30554ee28a50bec136e405c4a91a356fa2362abc4dfc702d940f7cf9daec293919dba45056228940e1d2f554701fe63232b8c19764fa5691cf1a99578e354f9c3f29e91d0e24292b2855819a1a39168d0a8c12619c4ec47f4f47362bbd4c651b7e4bcb2415013eeb67d36fa914566c9cb1fc9d3f0b05195dd501dbd5b85d99f8891857bad9339389e7dca4e0e3fe5e5b80fc9654ba52bda2dd7f50edf0d3d75f0230020eef820630661c69017398f5de79821cdb6cc7387979415edb42542ab19c95e67318375dd9fc55e7df81891ef7a96f64964a537fa67248e20532922baeea49eefbdfa145199e1df7e888a5f5c37b916d258048afe98db4c54a03574f482b629e0e033e184d5b3d095496c830d7ba6633d4c600b6e5f0089b6d4142915d334a306cf2daec38a251310a5e8f3fc2aafdadb042b122a09114c830de491e623a1cbcda30d843107f5de6b7b65f8f277accf5d7ee73b55a7d7403c098824f619ff1e1c4529dec5b6c7058950ac6479647000fc20383078a6e75910d96673bfc8f1d773ebc389191f1a360560c47ec3ce61ac3ad90873018400a14626bd522977de79a4eec659465b30dd1cd04ea813d3ae684b2d3d582fe71449e53c3db3e03e7775e82eedbc659babbb89bf88fae95b5f7b7cc04ecff95d3764adf10ea6afab476aef260a14d567ba50f73e7c599f9ad8e8d78c165d1b9b73e732fa04b268fd0e2d55b0b8a32f015f0aaf80760da8e9040f99058c41e0803a4a77cf66cf07882a1041efa89c90aa446b6fa4bccccbb9d829479a5a2eac11a4d8f55114ff9be9961759a15c0ba46312a939ded38dc2cb5840f4408e34482b13a32dd4902440d62528df54f978a79d4e88190ca481251e4ba3245b043a74524e494f0c55a8d171b39f32a02836989afd3de8fccafbdb55f61d4193b0753125706b911b8be175e14c3e4e5f20adb9dc35171fe11efd64512c5eea084a94adddd3faefcd1f6c4333b2cb7a6dc4da7fc259d8aa912b612d6fe6bd1f6bbd36221d0984de27169c727633dbd798b8a8d36018b4d2391aa06921f63fe1bf791f36b23bfcec40975a946ede2ae271eebe0707574c263f9feb7ddb8c04f16e9bf0e94576d277d141278cb0bb642585328e37682c0e073ada303c30809d17eedce16d7c7dc8e39ab89bf93c3fc9508855205197ad5320fae4b624f00e07586ba2c3c284751f741c57adea911a85a6ff8861453964ac7d8899160770ba3b5e69b3d092782fbdeee7a52a111b837e917bc484bda35f14d4bd9d30c3ea9aaf881d1a521a4996ab99de0cc28f7bdaddf19889f00a1104a1eec4588cedbd3197ba687c12db96fcd0530c63ce407ae4d2025945dfda0ed18120fc92cfec162545e167a9e1f23b8b347ed733fe5f30b6351e45e3a411ad9a6fb0745572072b087b18894769f177254641f1acb8fcced000000000000000049c1dd01000000001149a6bf21fc819bff79fa85b4ee8680de5b260e818befd406c4fab7448ff5e37b651ee57a5b1ca3e60cac54745043bd1461bfa4153a182a1a18b275734f76d81c9091a1a0f0cf9a48ffc6ad3934b2c57f9c19bc3ef49fc432104376a9b0a17d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b1ab7cb044c3ebf164daa4c2da3fec5def426318c25f0fb52112ee1f16c4818e01f1ed2658db7e42b8db9b38bbcb63719d27efe19c8648b100161156b21e0b575204ec7dd9addbfc8754cfcf1eb7a975ad32262841f24bf43c8c87c2ad9df26173579b715775a60bd3d3607a27f7c26192322c8a8f6f8f37acf094aa3b73677031e2deb1b790f4a0d1f433552d80fd71c79244050c51e37837ef989d3c0e12c7a022f5078bc64859bc66ff36a79bea9ceb8bc6e428a7ca663a479e8a0c1a19aee110b081074474e616eb6f2ee6283105a2c1479e8797ce65a815196d1c91ff17b2851acc107ad2e43742b828bc8d237cd9704fbf09a97d1bacc46e2f869e08bddf571020157ba962346150b1c71e0c6a516f2c6fff68aa9cabc2c5403cb243ed7dd637a0317d14f78d87ec11260df3dd714b49cc8a7a3b21f8a187ff494e97d5d0f5ff207031a0861e1922a0d33a9d86085267742c5a4484ca7cc5a43901b9b26b2068cfa2c030df5997bd01d7ac5f19e678a655a682b32a913c08363173191b01293bbe48907021c74126d7a22fa38ea3249af705d7451ba2b085d0a938fdfa89cd5a654d85088d863f50b3cc37229307642e52d3dd156ffa06e78eba10cd6d51c4e49bafec6c0a4059abc40da022df19f2b9918f37fc0a4c3ab26b27889601345c8eee7bca02564b554c7f234685c55a3cdcbf70036dcd1cbbd15430a78dd67ec67a45feeb1d7e5297b99a4015a7d7a2cbcdb651667ebe3e644b5a321b1a98c2c3ae2400e5a0935c215939c22ebbd618778cfbe7372f0db6541bb63661f62be777583027920d24b6b44bced4cde1b9aa968d028c00454019b47cca70010fc615f1a3646c510ccd977503fcef97cb4ce593c53c796ca1771b60398c082f314f1aa231b4cc70afc8cda9a37de8a14ea462f81243e448d9855a77f54a7e05d2875d5aebdbdb36d433016f3b92546f467cacc94c74f7c51c8ea30ce95d7efdd8d03db561524cb84912e280bdec2501ea758eb2b4df7dbac853ad4e38499245b38bb86371aba7369d69a380cab5c472dda066eda44b3a9681900888f277e66a13b3844832b245edaebf501e3598cb05d82fcfd4432679df00f918f081fe8cdcd594613d9c51fb9fd187dd4532f03296fb1ba1d2f9cb1f2213cd64679758235bd041fb31ed1ee65ec2a2891ca4641fd744bcd38f2d1d729e0ac448c458f9776e9882113736c2bab120c4e9ec379b19f59a01eed034fcba02f2e75209a546f43885956bd172d3800ad5d341307f0094b7702ce97d0379a9f9dbfd1d24f8d8dce66688511ed9e740fcef4f82e833da48c208e9f418bb15a046ca598451695db8b9cec127adeb9970b3f8d3448b5163a02ed684c093f19da394b546a10100dbae7897be1dba22ecb5271d0f9be972e04ed50accc67415de24ffe60ef0ccb17fb133c192d0fca4044d09b052678c2554820d99f8c5592b3e3225c7c1c276cb6de40cd123a1ef6467e0c4337d02711e754b0fa847f76dd730bb861ca3d5858312c7454a271311aa3c1b40af67969e285d63a029eccdb3136102ebb6d31e1dae239492d38697ed3fe5bf2dea6cca7d74a6f156adae7660253d74c947cd2ef865a96060fa13f0646a6d088f034145a6a2bda1a96816abc1d7f5845f9ff1291366849d4198c20146d93f48965199edf285cb7fd710d08be32ce4def76b342f618da5f3de7f720ce574ab6a3591af9166a90dbad80330a7d8afff0cf3e5978f9d76010183ccb74433baecd004a3d7558876771686017f08f2c58c18563ec75560508f887af925bc89acb514e6ba43fdb67016305271a71968b3bfe1d43e7cf7fe3d18f70fca143cb30a9d843d8bf435ed4898f31be4cf3c3de170d53cd1fbebf734d8d7ad09dd81f0bd057b21e582dca6c888fcce5b95e925602486970a65f57253aed68d27a3966f8a316309b29d22c2644f9ea8665e6b12dae29c17fb6469490199a67a723a97d9f0f7fa6b1f49e2578a19b02b7ff4f8a68cee67759ef82ce8394b8b387dce007c498806f9e2ac9d3bc18528401614beb59528c10303a7b9128bf2e47434b62b36903795f37d59c6b1fc2dbea41d3b81ce491be1b9080fd3ac78e8eb6ff7dba482daaa33fcc5ba9adc989d4bf85180647ba7fc56fa4ce479cb5faf104838586d964acf3373435a6d91c1ca4bca421691ab2f11837096245f5f84eeb7cf5e7dfc62146afb1e3a5e760c18c6495a9b20f644f544d3cc723e8bb8ca2bcd9f52fa207c48456c18abbe6dc651bdae846adf0b0075489e63ab2b931644ffb2392d9d0b664030bdb59dea3cc24be6ecce37ff2483ca459b3095f1b540c8cb077d248d5629f8f29152182e8d0945a7837cbe8f60e3bfb5608e3d7f24843d50f65df1cb54c5e2dfc09b361500db97b4c26af655f31a4bd036e6c171609", "53ac", 0, -2063601244, 0, "002fc7bfe2e15ff2ae89aa9319448aafb237bfda39ddb723b47a8d42d176a9e8"], + ["1d09870401cea927e1d808060d058de7c87898a322bbfa104883730fbe293843d81437b63c020000000365536aa2c7c66201c1f60a0000000000086351ac6a6a636a53000000000119c2e0040000000000000000000000004340e96ce18f6d4e9ea19be08874bfae6b8157da50455c7c8686de126ec6d5c735741bf14bd8111bd3cbd3f636ebfcdecd125a5bc5a39b30696ba2c49979c987f95294ac91991a8127f670560568b0bd98c48cbd2e96c27d751d4876f84faa0f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008ddaa8950a1306585c89dc49c1219fe8bb945d13fee3ee06f67691d1a08f2516038ac99c12b51db743447f18c98b863bc634b6fad55ee2a31e6a693f197928e8783bcae4deb5617c0ec193e004b30b33bd3ad1060335367fda7bf11214137a482ed1b83bbe83b9d0817731b08292cf1cc86b05bb74ac2f6e7cc8ccff6419c56d0324d727d8e1fcd765eb3e7b890521ac6b15a8e587dbc697bf3538bfbbf85e9905031895d65a1d0603cbfb623ede58528e16592553d3e0c448e7e3acb3a36823bd850a02c817b17e0b02326753c26d77f9bbd0df4f4d342251157b17a654290693d67a6ac77ddddd0e8b79fecd247323205430cd9500a4fd4aa2c3c09c6fdd86e65b4a02258bfdbfdd78a5587635bedba775ed7947aaf514e978b70281a7866559860bfe0326589a630441b4b9a375a1fac3e3830d7e6f7993a9e5a1dd23256f283e0d1d9f032faa912077d4f426f2f670b00afb06674d96560ed84623afbb7d11ee2608a50b0213fd784e42c1f8aa1b9acd2765615976068028132744ff22e9799dc76beaff1f02002f1b498409000e5cdedf0d77b96212bc1e3bbc976ea085a1fa9a3b7c8916d46f3c8d146c6aee0bc0acc5079c1e36ebb8203033fdc6eb1f4eb67d0e4327fda50cebda89812b841dc6198fea948da254ccc2be0ea303c578b0fc42f7d5729f0f280869b4eda8caf67ceb29d698fe4c16905a132695bc3caa5092c2ffb6ba5a959498cae00d60438a8989218d0b7d8668bb0218019c19f11ac99af1ae1fc93688349929079dca123ea1e489019735ecd2f7d6067e9384dbaca2b93345d5093c721fea69b6f4b84d38e1ed34fcf90553d91173cebd8ef3e6592fdfd787fc19dbf32dbac9011367a8270fac00608a8394526e46ddbf232a5b87253dbd365ba43ec8ec3ec77a1dc2e66b5f29d6fd898575995b52dd47063e066311d82f06493795a9a0f64864111197f6d171e7bd016d920e3db896cdf43e05b0221c52e67edd1fb96f18ae77ab61946caa03db0a44d3330d60cd4fe1a63efe098c23fb9fec0573f29a815ff5d4c0f0d7b9153f78215b4b37be19899e085570ebcd145303878e7916b17c09f5e72b29fbc4f9dbdc790020d76efc43d75833c2ed488590e5234c51096a269c4fb3c394ca5966ffad7ad4ac7a16a083c56ad1583294dcde1fa57322a91c3f0f55172d41418ac0ea1407d23006c5241436914077815ad030a9bc4c96273d1318139342538d1c08421380c3af830c4ea0ff66b2af99a12b94333f6f22a7b289087fde35d00764abeaf81c552dabcef40005e6195800223a03f9fcf21de79d79169cddb06dfb3766eba05a1d3821eec9cad899ee464cda664dc0a2e411ab147e85b038cf0fd15595aec945389f7d0ff4c31d05a08eda27f0b55f0b8d463ca208a566b9cbcb51ea79856cc50a78877c58f4de0249098534a7c629467481194f7d481b7040d34d66692c121bd77040181685177c7ba74965c0f1abba456ce4fd9a6f2079d344ce17db1192092fa160c0e8c6be40fafe313fb63fd964b06ba98e51e8f10bbefe4b27fb6cd20560048adc9ab31445757399c4b4af872856ad222467532eeb3eb713ed408c10c6bce51811e13ccd640c83c90b3f20c402e9c585f08309ce0d13c8e177908aae7cecc918f35b785f07b7de88d2dac5d7236edeac07a0bc99033aa60c739f3a75ffbd24c71514eff04a5090c659e1288a8cb11043c67ae5db556407b7c7ab404888817ee0116a00a65622ed8ea1c5ae35618516a7b09049845ea7ee29d6229ffe5fe98b5319e43286fb5ccd810b3d581ee9b8ac60df687adfd4d7854dc78797f595d1340970378f278edc4cae9bb668130f6021ca18754ed0d9056dca3fe0ec39abbbdd9822c9efe0ef2c303d70200f125e95879d1adfe7b36a6a54516377a13e958ee19649923a05c6705c808d276cc0a92bed9daa3e208555ebea34986c21ab8f85b8166e64ada3a18831a133a636cd53ce053908a98bd353d41092d4ef9a4453b7c7b5c8f08cf1de96842d9bf2deab014b37e347057a98f36a68ab944c1aa1d8aa536b0dd7af5ce2ad6d15564f0a96fb3c33d112d5345bee52970a8a48d935fd2d01934ef96d6f9117dea6c4fa6bce0a723b70bef9dba816afb274de2547d7b64daa798bb6cc1513b07423c598a1e600ba81bcfb09b49f07a586993d6fa2d16f1fb84d6e0a2f93cb5f660b8a0e783840bf59d640c8af0e3d4b399151af4a9a458ef005f6a0946f1d19674334b13857f418006a8a2d94546079365b884d58532ad6e3c8eb9ee6ea15bd1e55ee4e9d8d017e655ace0c47f8b2b4a39baa68cbc228955491a8b73a00886e75fdae9af74c228a86d0fab18bd81d97f36bc62223ef1724cdb7c6ab9b109c0c8185991a66015832f590e80e4be532a1de508be29240c2acfd5ea905", "", 0, 1995900764, 0, "9721fb036a89abab2c9c4a1fd3d7df6af8a834cf1d712fcff97d84aae934009b"], + ["7955cb0002ded4d1fe9ff66bf872c7549d1291f8d6a074f7cfd8edf335a9903036394d27d802000000056a53ac5265873fec7058f64e437f0ea9448066b42015202a1d56d1cb424a55461e80c5f948c4e7bc870200000002ac53c8fd6a58046ced4a010000000008516363acac6a006512eb1e0000000000005ef1a302000000000952ac5365000051ac00fd0a750400000000050063acac530000000000", "6a", 1, -1208408977, 0, "00c4e3d7fcb8def9ad41aba6a934e3e100c260136ccae8575ecf5c19442e6af7"] ] From 15ced9b153ce12eb536dc05d02ebab5a0b983c89 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 23 Feb 2018 02:16:24 +0000 Subject: [PATCH 0523/1062] wallet_mergetoaddress: Add additional syncs to prevent race conditions --- qa/rpc-tests/wallet_mergetoaddress.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/qa/rpc-tests/wallet_mergetoaddress.py b/qa/rpc-tests/wallet_mergetoaddress.py index fe7d5893e..e923b5788 100755 --- a/qa/rpc-tests/wallet_mergetoaddress.py +++ b/qa/rpc-tests/wallet_mergetoaddress.py @@ -180,6 +180,7 @@ class WalletMergeToAddressTest (BitcoinTestFramework): assert_equal(result["mergingNotes"], Decimal('2')) assert_equal(result["remainingNotes"], Decimal('0')) wait_and_assert_operationid_status(self.nodes[0], result['opid']) + self.sync_all() blockhash = self.nodes[1].generate(1) self.sync_all() @@ -331,6 +332,7 @@ class WalletMergeToAddressTest (BitcoinTestFramework): assert_equal(result["mergingNotes"], Decimal('2')) assert_equal(result["remainingNotes"], Decimal('3')) wait_and_assert_operationid_status(self.nodes[0], result['opid']) + self.sync_all() self.nodes[1].generate(1) self.sync_all() @@ -341,6 +343,9 @@ class WalletMergeToAddressTest (BitcoinTestFramework): assert_equal(result["mergingNotes"], Decimal('2')) assert_equal(result["remainingNotes"], Decimal('2')) wait_and_assert_operationid_status(self.nodes[0], result['opid']) + # Don't sync node 2 which rejects the tx due to its mempooltxinputlimit + sync_blocks(self.nodes[:2]) + sync_mempools(self.nodes[:2]) self.nodes[1].generate(1) self.sync_all() From 9bb37bf0d5630b41af25fc6f4a45eb895bb9be16 Mon Sep 17 00:00:00 2001 From: Jay Graber Date: Wed, 21 Feb 2018 20:21:06 -0800 Subject: [PATCH 0524/1062] Implement transaction expiry for Overwinter --- src/bitcoin-tx.cpp | 11 +++++++++++ src/consensus/consensus.h | 2 ++ src/main.cpp | 19 +++++++++++++++++++ src/main.h | 9 +++++++++ src/miner.cpp | 4 +++- src/primitives/transaction.h | 3 --- src/rpcrawtransaction.cpp | 13 +++++++++++-- src/txmempool.cpp | 18 ++++++++++++++++++ src/txmempool.h | 1 + src/wallet/rpcwallet.cpp | 14 +++++++++++--- src/wallet/wallet.cpp | 15 ++++++++++++++- 11 files changed, 99 insertions(+), 10 deletions(-) diff --git a/src/bitcoin-tx.cpp b/src/bitcoin-tx.cpp index 710d0082f..4fcc13e41 100644 --- a/src/bitcoin-tx.cpp +++ b/src/bitcoin-tx.cpp @@ -164,6 +164,15 @@ static void MutateTxVersion(CMutableTransaction& tx, const string& cmdVal) tx.nVersion = (int) newVersion; } +static void MutateTxExpiry(CMutableTransaction& tx, const string& cmdVal) +{ + int64_t newExpiry = atoi64(cmdVal); + if (newExpiry >= TX_EXPIRY_HEIGHT_THRESHOLD) { + throw runtime_error("Invalid TX expiry requested"); + } + tx.nExpiryHeight = (int) newExpiry; +} + static void MutateTxLocktime(CMutableTransaction& tx, const string& cmdVal) { int64_t newLocktime = atoi64(cmdVal); @@ -503,6 +512,8 @@ static void MutateTx(CMutableTransaction& tx, const string& command, MutateTxVersion(tx, commandVal); else if (command == "locktime") MutateTxLocktime(tx, commandVal); + else if (command == "expiry") + MutateTxExpiry(tx, commandVal); else if (command == "delin") MutateTxDelInput(tx, commandVal); diff --git a/src/consensus/consensus.h b/src/consensus/consensus.h index 43fd1e828..8650c453a 100644 --- a/src/consensus/consensus.h +++ b/src/consensus/consensus.h @@ -22,6 +22,8 @@ static const unsigned int MAX_BLOCK_SIGOPS = 20000; static const unsigned int MAX_TX_SIZE = 100000; /** Coinbase transaction outputs can only be spent after this number of new blocks (network rule) */ static const int COINBASE_MATURITY = 100; +/** The minimum value which is invalid for expiry height, used by CTransaction and CMutableTransaction */ +static constexpr uint32_t TX_EXPIRY_HEIGHT_THRESHOLD = 500000000; /** Flags for LockTime() */ enum { diff --git a/src/main.cpp b/src/main.cpp index 9e41d9c4e..161c3933c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -73,6 +73,8 @@ size_t nCoinCacheUsage = 5000 * 300; uint64_t nPruneTarget = 0; bool fAlerts = DEFAULT_ALERTS; +unsigned int expiryDelta = DEFAULT_TX_EXPIRY_DELTA; + /** Fees smaller than this (in satoshi) are considered zero fee (for relaying and mining) */ CFeeRate minRelayTxFee = CFeeRate(DEFAULT_MIN_RELAY_TX_FEE); @@ -718,6 +720,14 @@ bool IsFinalTx(const CTransaction &tx, int nBlockHeight, int64_t nBlockTime) return true; } +bool IsExpiredTx(const CTransaction &tx, int nBlockHeight) +{ + if (tx.nExpiryHeight == 0 || tx.IsCoinBase()) { + return false; + } + return static_cast(nBlockHeight) > tx.nExpiryHeight; +} + bool CheckFinalTx(const CTransaction &tx, int flags) { AssertLockHeld(cs_main); @@ -884,6 +894,11 @@ bool ContextualCheckTransaction(const CTransaction& tx, CValidationState &state, return state.DoS(dosLevel, error("ContextualCheckTransaction: overwinter is active"), REJECT_INVALID, "tx-overwinter-active"); } + + // Check that all transactions are unexpired + if (IsExpiredTx(tx, nHeight)) { + return state.DoS(dosLevel, error("ContextualCheckTransaction(): transaction is expired"), REJECT_INVALID, "tx-overwinter-expired"); + } } if (!(tx.IsCoinBase() || tx.vjoinsplit.empty())) { @@ -2659,6 +2674,10 @@ bool static ConnectTip(CValidationState &state, CBlockIndex *pindexNew, CBlock * // Remove conflicting transactions from the mempool. list txConflicted; mempool.removeForBlock(pblock->vtx, pindexNew->nHeight, txConflicted, !IsInitialBlockDownload()); + + // Remove transactions that expire at new block height from mempool + mempool.removeExpired(pindexNew->nHeight); + // Update chainActive & related variables. UpdateTip(pindexNew); // Tell wallet about transactions that went from mempool diff --git a/src/main.h b/src/main.h index 2cae24b22..2a3b4175a 100644 --- a/src/main.h +++ b/src/main.h @@ -68,6 +68,8 @@ static const unsigned int MAX_STANDARD_TX_SIGOPS = MAX_BLOCK_SIGOPS/5; static const unsigned int DEFAULT_MIN_RELAY_TX_FEE = 100; /** Default for -maxorphantx, maximum number of orphan transactions kept in memory */ static const unsigned int DEFAULT_MAX_ORPHAN_TRANSACTIONS = 100; +/** Default for -txexpirydelta, in number of blocks */ +static const unsigned int DEFAULT_TX_EXPIRY_DELTA = 20; /** The maximum size of a blk?????.dat file (since 0.8) */ static const unsigned int MAX_BLOCKFILE_SIZE = 0x8000000; // 128 MiB /** The pre-allocation chunk size for blk?????.dat files (since 0.8) */ @@ -110,6 +112,7 @@ struct BlockHasher size_t operator()(const uint256& hash) const { return hash.GetCheapHash(); } }; +extern unsigned int expiryDelta; extern CScript COINBASE_FLAGS; extern CCriticalSection cs_main; extern CTxMemPool mempool; @@ -371,6 +374,12 @@ bool CheckTxInputs(const CTransaction& tx, CValidationState& state, const CCoins */ bool IsFinalTx(const CTransaction &tx, int nBlockHeight, int64_t nBlockTime); +/** + * Check if transaction is expired and can be included in a block with the + * specified height. Consensus critical. + */ +bool IsExpiredTx(const CTransaction &tx, int nBlockHeight); + /** * Check if transaction will be final in the next block to be created. * diff --git a/src/miner.cpp b/src/miner.cpp index d87205c64..ccbee75ab 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -166,7 +166,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) ? nMedianTimePast : pblock->GetBlockTime(); - if (tx.IsCoinBase() || !IsFinalTx(tx, nHeight, nLockTimeCutoff)) + if (tx.IsCoinBase() || !IsFinalTx(tx, nHeight, nLockTimeCutoff) || IsExpiredTx(tx, nHeight)) continue; COrphan* porphan = NULL; @@ -345,6 +345,8 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) txNew.vout.resize(1); txNew.vout[0].scriptPubKey = scriptPubKeyIn; txNew.vout[0].nValue = GetBlockSubsidy(nHeight, chainparams.GetConsensus()); + // Set to 0 so expiry height does not apply to coinbase txs + txNew.nExpiryHeight = 0; if ((nHeight > 0) && (nHeight <= chainparams.GetConsensus().GetLastFoundersRewardBlockHeight())) { // Founders reward is 20% of the block subsidy diff --git a/src/primitives/transaction.h b/src/primitives/transaction.h index 654a68b8a..bcd7eaa8a 100644 --- a/src/primitives/transaction.h +++ b/src/primitives/transaction.h @@ -304,9 +304,6 @@ public: std::string ToString() const; }; -// The maximum value which is valid for expiry height, used by CTransaction and CMutableTransaction -static constexpr uint32_t TX_EXPIRY_HEIGHT_THRESHOLD = 500000000; - // Overwinter version group id static constexpr uint32_t OVERWINTER_VERSION_GROUP_ID = 0x03C48270; static_assert(OVERWINTER_VERSION_GROUP_ID != 0, "version group id must be non-zero as specified in ZIP 202"); diff --git a/src/rpcrawtransaction.cpp b/src/rpcrawtransaction.cpp index 2f89529de..f28066300 100644 --- a/src/rpcrawtransaction.cpp +++ b/src/rpcrawtransaction.cpp @@ -198,6 +198,7 @@ UniValue getrawtransaction(const UniValue& params, bool fHelp) " \"txid\" : \"id\", (string) The transaction id (same as provided)\n" " \"version\" : n, (numeric) The version\n" " \"locktime\" : ttt, (numeric) The lock time\n" + " \"expiryheight\" : ttt, (numeric, optional) The block height after which the transaction expires\n" " \"vin\" : [ (array of json objects)\n" " {\n" " \"txid\": \"id\", (string) The transaction id\n" @@ -443,8 +444,16 @@ UniValue createrawtransaction(const UniValue& params, bool fHelp) UniValue inputs = params[0].get_array(); UniValue sendTo = params[1].get_obj(); + int nextBlockHeight = chainActive.Height() + 1; CMutableTransaction rawTx = CreateNewContextualCMutableTransaction( - Params().GetConsensus(), chainActive.Height() + 1); + Params().GetConsensus(), nextBlockHeight); + + if (NetworkUpgradeActive(nextBlockHeight, Params().GetConsensus(), Consensus::UPGRADE_OVERWINTER)) { + rawTx.nExpiryHeight = nextBlockHeight + expiryDelta; + if (rawTx.nExpiryHeight >= TX_EXPIRY_HEIGHT_THRESHOLD){ + throw JSONRPCError(RPC_INVALID_PARAMETER, "nExpiryHeight must be less than TX_EXPIRY_HEIGHT_THRESHOLD."); + } + } for (size_t idx = 0; idx < inputs.size(); idx++) { const UniValue& input = inputs[idx]; @@ -497,7 +506,7 @@ UniValue decoderawtransaction(const UniValue& params, bool fHelp) "\nResult:\n" "{\n" " \"txid\" : \"id\", (string) The transaction id\n" - " \"overwintered\" : bool (boolean) The Overwintered flag\n" + " \"overwintered\" : bool (boolean) The Overwintered flag\n" " \"version\" : n, (numeric) The version\n" " \"versiongroupid\": \"hex\" (string, optional) The version group id (Overwintered txs)\n" " \"locktime\" : ttt, (numeric) The lock time\n" diff --git a/src/txmempool.cpp b/src/txmempool.cpp index 6b3c16f2a..acb671ec2 100644 --- a/src/txmempool.cpp +++ b/src/txmempool.cpp @@ -256,6 +256,24 @@ void CTxMemPool::removeConflicts(const CTransaction &tx, std::list } } +void CTxMemPool::removeExpired(unsigned int nBlockHeight) +{ + // Remove expired txs from the mempool + LOCK(cs); + list transactionsToRemove; + for (indexed_transaction_set::const_iterator it = mapTx.begin(); it != mapTx.end(); it++) + { + const CTransaction& tx = it->GetTx(); + if (IsExpiredTx(tx, nBlockHeight)) { + transactionsToRemove.push_back(tx); + } + } + for (const CTransaction& tx : transactionsToRemove) { + list removed; + remove(tx, removed, true); + } +} + /** * Called when a block is connected. Removes from mempool and updates the miner fee estimator. */ diff --git a/src/txmempool.h b/src/txmempool.h index 2cb2c8f05..6b6434f1e 100644 --- a/src/txmempool.h +++ b/src/txmempool.h @@ -168,6 +168,7 @@ public: void removeWithAnchor(const uint256 &invalidRoot); void removeForReorg(const CCoinsViewCache *pcoins, unsigned int nMemPoolHeight, int flags); void removeConflicts(const CTransaction &tx, std::list& removed); + void removeExpired(unsigned int nBlockHeight); void removeForBlock(const std::vector& vtx, unsigned int nBlockHeight, std::list& conflicts, bool fCurrentEstimate = true); void removeWithoutBranchId(uint32_t nMemPoolBranchId); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index d3da306ed..9050c4b1b 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -86,6 +86,7 @@ void WalletTxToJSON(const CWalletTx& wtx, UniValue& entry) entry.push_back(Pair("blockhash", wtx.hashBlock.GetHex())); entry.push_back(Pair("blockindex", wtx.nIndex)); entry.push_back(Pair("blocktime", mapBlockIndex[wtx.hashBlock]->GetBlockTime())); + entry.push_back(Pair("expiryheight", (int64_t)wtx.nExpiryHeight)); } uint256 hash = wtx.GetHash(); entry.push_back(Pair("txid", hash.GetHex())); @@ -3534,11 +3535,15 @@ UniValue z_sendmany(const UniValue& params, bool fHelp) UniValue contextInfo = o; // Contextual transaction we will build on - CMutableTransaction contextualTx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), chainActive.Height() + 1); + int nextBlockHeight = chainActive.Height() + 1; + CMutableTransaction contextualTx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), nextBlockHeight); bool isShielded = !fromTaddr || zaddrRecipients.size() > 0; if (contextualTx.nVersion == 1 && isShielded) { contextualTx.nVersion = 2; // Tx format should support vjoinsplits } + if (NetworkUpgradeActive(nextBlockHeight, Params().GetConsensus(), Consensus::UPGRADE_OVERWINTER)) { + contextualTx.nExpiryHeight = nextBlockHeight + expiryDelta; + } // Create operation and add to global queue std::shared_ptr q = getAsyncRPCQueue(); @@ -3725,12 +3730,15 @@ UniValue z_shieldcoinbase(const UniValue& params, bool fHelp) contextInfo.push_back(Pair("fee", ValueFromAmount(nFee))); // Contextual transaction we will build on + int nextBlockHeight = chainActive.Height() + 1; CMutableTransaction contextualTx = CreateNewContextualCMutableTransaction( - Params().GetConsensus(), - chainActive.Height() + 1); + Params().GetConsensus(), nextBlockHeight); if (contextualTx.nVersion == 1) { contextualTx.nVersion = 2; // Tx format should support vjoinsplits } + if (NetworkUpgradeActive(nextBlockHeight, Params().GetConsensus(), Consensus::UPGRADE_OVERWINTER)) { + contextualTx.nExpiryHeight = nextBlockHeight + expiryDelta; + } // Create operation and add to global queue std::shared_ptr q = getAsyncRPCQueue(); diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index ce86cbad0..253eb6169 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -10,6 +10,7 @@ #include "coincontrol.h" #include "consensus/upgrades.h" #include "consensus/validation.h" +#include "consensus/consensus.h" #include "init.h" #include "main.h" #include "net.h" @@ -2523,6 +2524,7 @@ bool CWallet::FundTransaction(CMutableTransaction& tx, CAmount &nFeeRet, int& nC CReserveKey reservekey(this); CWalletTx wtx; + if (!CreateTransaction(vecSend, wtx, reservekey, nFeeRet, nChangePosRet, strFailReason, &coinControl, false)) return false; @@ -2573,9 +2575,20 @@ bool CWallet::CreateTransaction(const vector& vecSend, CWalletTx& wt wtxNew.fTimeReceivedIsTxTime = true; wtxNew.BindWallet(this); + int nextBlockHeight = chainActive.Height() + 1; CMutableTransaction txNew = CreateNewContextualCMutableTransaction( - Params().GetConsensus(), chainActive.Height() + 1); + Params().GetConsensus(), nextBlockHeight); + // Activates after Overwinter network upgrade + // Set nExpiryHeight to expiryDelta (default 20) blocks past current block height + if (NetworkUpgradeActive(nextBlockHeight, Params().GetConsensus(), Consensus::UPGRADE_OVERWINTER)) { + if (nextBlockHeight + expiryDelta >= TX_EXPIRY_HEIGHT_THRESHOLD){ + strFailReason = _("nExpiryHeight must be less than TX_EXPIRY_HEIGHT_THRESHOLD."); + } else { + txNew.nExpiryHeight = nextBlockHeight + expiryDelta; + } + } + // Discourage fee sniping. // // However because of a off-by-one-error in previous versions we need to From 9c12b8e90360f393d79f06cc5f80dc87240387b4 Mon Sep 17 00:00:00 2001 From: Jay Graber Date: Wed, 21 Feb 2018 20:21:24 -0800 Subject: [PATCH 0525/1062] Add -txexpirydelta cli option --- src/init.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/init.cpp b/src/init.cpp index dd10025dc..85507f9a3 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -414,6 +414,7 @@ std::string HelpMessage(HelpMessageMode mode) strUsage += HelpMessageOpt("-sendfreetransactions", strprintf(_("Send transactions as zero-fee transactions if possible (default: %u)"), 0)); strUsage += HelpMessageOpt("-spendzeroconfchange", strprintf(_("Spend unconfirmed change when sending transactions (default: %u)"), 1)); strUsage += HelpMessageOpt("-txconfirmtarget=", strprintf(_("If paytxfee is not set, include enough fee so transactions begin confirmation on average within n blocks (default: %u)"), DEFAULT_TX_CONFIRM_TARGET)); + strUsage += HelpMessageOpt("-txexpirydelta", strprintf(_("Set the number of blocks after which a transaction that has not been mined will become invalid (default: %u)"), DEFAULT_TX_EXPIRY_DELTA)); strUsage += HelpMessageOpt("-maxtxfee=", strprintf(_("Maximum total fees (in %s) to use in a single wallet transaction; setting this too low may abort large transactions (default: %s)"), CURRENCY_UNIT, FormatMoney(maxTxFee))); strUsage += HelpMessageOpt("-upgradewallet", _("Upgrade wallet to latest format") + " " + _("on startup")); @@ -1009,6 +1010,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) } } nTxConfirmTarget = GetArg("-txconfirmtarget", DEFAULT_TX_CONFIRM_TARGET); + expiryDelta = GetArg("-txexpirydelta", DEFAULT_TX_EXPIRY_DELTA); bSpendZeroConfChange = GetBoolArg("-spendzeroconfchange", true); fSendFreeTransactions = GetBoolArg("-sendfreetransactions", false); From 5943f227dafaece87bf2a2febd3d604ca5de18cc Mon Sep 17 00:00:00 2001 From: Jay Graber Date: Thu, 22 Feb 2018 23:27:38 -0800 Subject: [PATCH 0526/1062] Add mempool_tx_expiry.py test --- qa/pull-tester/rpc-tests.sh | 1 + qa/rpc-tests/mempool_tx_expiry.py | 187 ++++++++++++++++++++++++++++++ 2 files changed, 188 insertions(+) create mode 100755 qa/rpc-tests/mempool_tx_expiry.py diff --git a/qa/pull-tester/rpc-tests.sh b/qa/pull-tester/rpc-tests.sh index e2272ad43..6b0125aa8 100755 --- a/qa/pull-tester/rpc-tests.sh +++ b/qa/pull-tester/rpc-tests.sh @@ -32,6 +32,7 @@ testScripts=( 'mempool_reorg.py' 'mempool_tx_input_limit.py' 'mempool_nu_activation.py' + 'mempool_tx_expiry.py' 'httpbasics.py' 'zapwallettxes.py' 'proxy_test.py' diff --git a/qa/rpc-tests/mempool_tx_expiry.py b/qa/rpc-tests/mempool_tx_expiry.py new file mode 100755 index 000000000..b78af986c --- /dev/null +++ b/qa/rpc-tests/mempool_tx_expiry.py @@ -0,0 +1,187 @@ +#!/usr/bin/env python2 +# Copyright (c) 2018 The Zcash developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +# +# Test proper expiry for transactions >= version 3 +# + +from test_framework.test_framework import BitcoinTestFramework +from test_framework.authproxy import JSONRPCException +from test_framework.util import assert_equal, connect_nodes, \ + connect_nodes_bi, sync_blocks, start_nodes, sync_blocks, sync_mempools, \ + wait_and_assert_operationid_status + +from decimal import Decimal +import time + +class MempoolTxExpiryTest(BitcoinTestFramework): + + def setup_nodes(self): + return start_nodes(4, self.options.tmpdir, [["-nuparams=5ba81b19:205", "-txexpirydelta=4"]] * 4) + + # Test before, at, and after expiry block + # TODO: Test case of dependent txs in reorgs + # chain is at block height 199 when run_test executes + def run_test(self): + alice = self.nodes[0].getnewaddress() + z_alice = self.nodes[0].z_getnewaddress() + bob = self.nodes[2].getnewaddress() + z_bob = self.nodes[2].z_getnewaddress() + + # When Overwinter not yet activated, no expiryheight in tx + sapling_tx = self.nodes[0].sendtoaddress(bob, 0.01) + rawtx = self.nodes[0].getrawtransaction(sapling_tx, 1) + assert_equal(rawtx["overwintered"], False) + assert("expiryheight" not in rawtx) + + self.nodes[0].generate(6) + self.sync_all() + + ## Shield one of Alice's coinbase funds to her zaddr + res = self.nodes[0].z_shieldcoinbase("*", z_alice, 0.0001, 1) + wait_and_assert_operationid_status(self.nodes[0], res['opid']) + self.nodes[0].generate(1) + self.sync_all() + + # Get balance on node 0 + bal = self.nodes[0].z_gettotalbalance() + print "Balance before zsend, after shielding 10: ", bal + assert_equal(Decimal(bal["private"]), Decimal("9.9999")) + + print "Splitting network..." + self.split_network() + + # Create transactions + zsendamount = Decimal('1.0') - Decimal('0.0001') + recipients = [] + recipients.append({"address": z_bob, "amount": zsendamount}) + myopid = self.nodes[0].z_sendmany(z_alice, recipients) + persist_shielded = wait_and_assert_operationid_status(self.nodes[0], myopid) + persist_transparent = self.nodes[0].sendtoaddress(bob, 0.01) + # Verify transparent transaction is version 3 intended for Overwinter branch + rawtx = self.nodes[0].getrawtransaction(persist_transparent, 1) + assert_equal(rawtx["version"], 3) + assert_equal(rawtx["overwintered"], True) + assert_equal(rawtx["expiryheight"], 212) + print "Blockheight at persist_transparent & persist_shielded creation:", self.nodes[0].getblockchaininfo()['blocks'] + print "Expiryheight of persist_transparent:", rawtx['expiryheight'] + # Verify shielded transaction is version 3 intended for Overwinter branch + rawtx = self.nodes[0].getrawtransaction(persist_shielded, 1) + print "Expiryheight of persist_shielded", rawtx['expiryheight'] + assert_equal(rawtx["version"], 3) + assert_equal(rawtx["overwintered"], True) + assert_equal(rawtx["expiryheight"], 212) + + print "\n Blockheight advances to less than expiry block height. After reorg, txs should persist in mempool" + assert(persist_transparent in self.nodes[0].getrawmempool()) + assert(persist_shielded in self.nodes[0].getrawmempool()) + assert_equal(set(self.nodes[2].getrawmempool()), set()) + print "mempool node 0:", self.nodes[0].getrawmempool() + print "mempool node 2:", self.nodes[2].getrawmempool() + bal = self.nodes[0].z_gettotalbalance() + print "Printing balance before persist_shielded & persist_transparent are initially mined from mempool", bal + # Txs are mined on node 0; will later be rolled back + self.nodes[0].generate(1) + print "Node 0 generated 1 block" + print "Node 0 height:", self.nodes[0].getblockchaininfo()['blocks'] + print "Node 2 height:", self.nodes[2].getblockchaininfo()['blocks'] + bal = self.nodes[0].z_gettotalbalance() + print "Printing balance after persist_shielded & persist_transparent are mined:", bal + assert_equal(set(self.nodes[0].getrawmempool()), set()) + + print "Mine 2 competing blocks on Node 2..." + blocks = self.nodes[2].generate(2) + for block in blocks: + blk = self.nodes[2].getblock(block) + print "Height: {0}, Mined block txs: {1}".format(blk["height"], blk["tx"]) + print "Connect nodes to force a reorg" + connect_nodes_bi(self.nodes,0,2) + self.is_network_split = False + + print "Syncing blocks" + sync_blocks(self.nodes) + + print "Ensure that txs are back in mempool of node 0" + print "Blockheight node 0:", self.nodes[0].getblockchaininfo()['blocks'] + print "Blockheight node 2:", self.nodes[2].getblockchaininfo()['blocks'] + print "mempool node 0: ", self.nodes[0].getrawmempool() + print "mempool node 2: ", self.nodes[2].getrawmempool() + assert(persist_transparent in self.nodes[0].getrawmempool()) + assert(persist_shielded in self.nodes[0].getrawmempool()) + bal = self.nodes[0].z_gettotalbalance() + # Mine txs to get them out of the way of mempool sync in split_network() + print "Generating another block on node 0 to clear txs from mempool" + self.nodes[0].generate(1) + assert_equal(set(self.nodes[0].getrawmempool()), set()) + sync_blocks(self.nodes) + + print "Splitting network..." + self.split_network() + + print "\n Blockheight advances to equal expiry block height. After reorg, txs should persist in mempool" + myopid = self.nodes[0].z_sendmany(z_alice, recipients) + persist_shielded_2 = wait_and_assert_operationid_status(self.nodes[0], myopid) + persist_transparent_2 = self.nodes[0].sendtoaddress(bob, 0.01) + rawtx_trans = self.nodes[0].getrawtransaction(persist_transparent_2, 1) + rawtx_shield = self.nodes[0].getrawtransaction(persist_shielded_2, 1) + print "Blockheight node 0 at persist_transparent_2 creation:", self.nodes[0].getblockchaininfo()['blocks'] + print "Blockheight node 2 at persist_transparent_2 creation:", self.nodes[2].getblockchaininfo()['blocks'] + print "Expiryheight of persist_transparent_2:", rawtx_trans['expiryheight'] + print "Expiryheight of persist_shielded_2:", rawtx_shield['expiryheight'] + blocks = self.nodes[2].generate(4) + for block in blocks: + blk = self.nodes[2].getblock(block) + print "Height: {0}, Mined block txs: {1}".format(blk["height"], blk["tx"]) + print "Connect nodes to force a reorg" + connect_nodes_bi(self.nodes, 0, 2) + self.is_network_split = False + sync_blocks(self.nodes) + print "Ensure that persist_transparent_2 & persist_shielded_2 are in mempool at expiry block height" + print "Blockheight node 0:", self.nodes[0].getblockchaininfo()['blocks'] + print "Blockheight node 2:", self.nodes[2].getblockchaininfo()['blocks'] + print "mempool node 0: ", self.nodes[0].getrawmempool() + print "mempool node 2: ", self.nodes[2].getrawmempool() + assert(persist_transparent_2 in self.nodes[0].getrawmempool()) + assert(persist_shielded_2 in self.nodes[0].getrawmempool()) + # Mine persist txs to get them out of the way of mempool sync in split_network() + self.nodes[0].generate(1) + assert_equal(set(self.nodes[0].getrawmempool()), set()) + sync_blocks(self.nodes) + print "Balance after persist_shielded_2 is mined to remove from mempool: ", self.nodes[0].z_gettotalbalance() + + print "Splitting network..." + self.split_network() + + print "\n Blockheight advances to greater than expiry block height. After reorg, txs should expire from mempool" + print "Balance before expire_shielded is sent: ", self.nodes[0].z_gettotalbalance() + myopid = self.nodes[0].z_sendmany(z_alice, recipients) + expire_shielded = wait_and_assert_operationid_status(self.nodes[0], myopid) + expire_transparent = self.nodes[0].sendtoaddress(bob, 0.01) + print "Blockheight node 0 at expire_transparent creation:", self.nodes[0].getblockchaininfo()['blocks'] + print "Blockheight node 2 at expire_shielded creation:", self.nodes[2].getblockchaininfo()['blocks'] + print "Expiryheight of expire_transparent:", self.nodes[0].getrawtransaction(expire_transparent, 1)['expiryheight'] + print "Expiryheight of expire_shielded:", self.nodes[0].getrawtransaction(expire_shielded, 1)['expiryheight'] + assert(expire_transparent in self.nodes[0].getrawmempool()) + assert(expire_shielded in self.nodes[0].getrawmempool()) + blocks = self.nodes[2].generate(6) + for block in blocks: + blk = self.nodes[2].getblock(block) + print "Height: {0}, Mined block txs: {1}".format(blk["height"], blk["tx"]) + print "Connect nodes to force a reorg" + connect_nodes_bi(self.nodes, 0, 2) + self.is_network_split = False + sync_blocks(self.nodes) + print "Ensure that expire_transparent & expire_shielded are in mempool at expiry block height" + print "mempool node 0: ", self.nodes[0].getrawmempool() + print "mempool node 2: ", self.nodes[2].getrawmempool() + assert_equal(set(self.nodes[0].getrawmempool()), set()) + print "Ensure balance of node 0 is correct" + bal = self.nodes[0].z_gettotalbalance() + print "Balance after expire_shielded has expired: ", bal + assert_equal(Decimal(bal["private"]), Decimal("7.9999")) + + +if __name__ == '__main__': + MempoolTxExpiryTest().main() From 33ae5edd2cf6c463a817fe7bab45c09a888d3425 Mon Sep 17 00:00:00 2001 From: rofl0r Date: Fri, 23 Feb 2018 15:52:55 +0000 Subject: [PATCH 0527/1062] remove -mt suffix from boost libraries built by depends --- depends/packages/boost.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/depends/packages/boost.mk b/depends/packages/boost.mk index 0c545c4d5..7d8d79901 100644 --- a/depends/packages/boost.mk +++ b/depends/packages/boost.mk @@ -9,7 +9,7 @@ define $(package)_set_vars $(package)_config_opts_release=variant=release $(package)_config_opts_debug=variant=debug $(package)_config_opts=--layout=tagged --build-type=complete --user-config=user-config.jam -$(package)_config_opts+=threading=multi link=static -sNO_BZIP2=1 -sNO_ZLIB=1 +$(package)_config_opts+=link=static -sNO_BZIP2=1 -sNO_ZLIB=1 $(package)_config_opts_linux=threadapi=pthread runtime-link=shared $(package)_config_opts_darwin=--toolset=darwin-4.2.1 runtime-link=shared $(package)_config_opts_mingw32=binary-format=pe target-os=windows threadapi=win32 runtime-link=static From 2423a40c089b8e0e4500dd6bc04b08ac65c4bd20 Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 22 Feb 2018 12:54:46 -0800 Subject: [PATCH 0528/1062] Add field nProtocolVersion to struct NetworkUpgrade. --- src/chainparams.cpp | 9 +++++++++ src/consensus/params.h | 5 +++++ 2 files changed, 14 insertions(+) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index a0c73dc37..f11d53460 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -95,10 +95,13 @@ public: consensus.nPowMaxAdjustDown = 32; // 32% adjustment down consensus.nPowMaxAdjustUp = 16; // 16% adjustment up consensus.nPowTargetSpacing = 2.5 * 60; + consensus.vUpgrades[Consensus::BASE_SPROUT].nProtocolVersion = 170002; consensus.vUpgrades[Consensus::BASE_SPROUT].nActivationHeight = Consensus::NetworkUpgrade::ALWAYS_ACTIVE; + consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nProtocolVersion = 170002; consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nActivationHeight = Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT; + consensus.vUpgrades[Consensus::UPGRADE_OVERWINTER].nProtocolVersion = 170004; consensus.vUpgrades[Consensus::UPGRADE_OVERWINTER].nActivationHeight = Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT; @@ -253,10 +256,13 @@ public: consensus.nPowMaxAdjustDown = 32; // 32% adjustment down consensus.nPowMaxAdjustUp = 16; // 16% adjustment up consensus.nPowTargetSpacing = 2.5 * 60; + consensus.vUpgrades[Consensus::BASE_SPROUT].nProtocolVersion = 170002; consensus.vUpgrades[Consensus::BASE_SPROUT].nActivationHeight = Consensus::NetworkUpgrade::ALWAYS_ACTIVE; + consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nProtocolVersion = 170002; consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nActivationHeight = Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT; + consensus.vUpgrades[Consensus::UPGRADE_OVERWINTER].nProtocolVersion = 170003; consensus.vUpgrades[Consensus::UPGRADE_OVERWINTER].nActivationHeight = Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT; @@ -360,10 +366,13 @@ public: consensus.nPowMaxAdjustDown = 0; // Turn off adjustment down consensus.nPowMaxAdjustUp = 0; // Turn off adjustment up consensus.nPowTargetSpacing = 2.5 * 60; + consensus.vUpgrades[Consensus::BASE_SPROUT].nProtocolVersion = 170002; consensus.vUpgrades[Consensus::BASE_SPROUT].nActivationHeight = Consensus::NetworkUpgrade::ALWAYS_ACTIVE; + consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nProtocolVersion = 170002; consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nActivationHeight = Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT; + consensus.vUpgrades[Consensus::UPGRADE_OVERWINTER].nProtocolVersion = 170003; consensus.vUpgrades[Consensus::UPGRADE_OVERWINTER].nActivationHeight = Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT; diff --git a/src/consensus/params.h b/src/consensus/params.h index 53f8609d5..11504dbc8 100644 --- a/src/consensus/params.h +++ b/src/consensus/params.h @@ -28,6 +28,11 @@ enum UpgradeIndex { }; struct NetworkUpgrade { + /** + * The first protocol version which will understand the new consensus rules + */ + int nProtocolVersion; + /** * Height of the first block for which the new consensus rules will be active */ From 72b2192950f3c775226e6d4ca58f45b148aa0b75 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 20 Feb 2018 11:03:40 -0800 Subject: [PATCH 0529/1062] Overwinter peer management and network handshaking. Implements ZIP 201. --- src/main.cpp | 29 +++++++++++++++++++++++++++++ src/net.cpp | 29 +++++++++++++++++++++++++++++ src/net.h | 2 ++ src/version.h | 2 +- 4 files changed, 61 insertions(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 9e41d9c4e..5d45a29ff 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4721,6 +4721,19 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, return false; } + // When Overwinter is active, reject incoming connections from non-Overwinter nodes + const Consensus::Params& params = Params().GetConsensus(); + if (NetworkUpgradeActive(GetHeight(), params, Consensus::UPGRADE_OVERWINTER) + && pfrom->nVersion < params.vUpgrades[Consensus::UPGRADE_OVERWINTER].nProtocolVersion) + { + LogPrintf("peer=%d using obsolete version %i; disconnecting\n", pfrom->id, pfrom->nVersion); + pfrom->PushMessage("reject", strCommand, REJECT_OBSOLETE, + strprintf("Version must be %d or greater", + params.vUpgrades[Consensus::UPGRADE_OVERWINTER].nProtocolVersion)); + pfrom->fDisconnect = true; + return false; + } + if (pfrom->nVersion == 10300) pfrom->nVersion = 300; if (!vRecv.empty()) @@ -4839,6 +4852,22 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, } + // Disconnect existing peer connection when: + // 1. The version message has been received + // 2. Overwinter is active + // 3. Peer version is pre-Overwinter + else if (NetworkUpgradeActive(GetHeight(), chainparams.GetConsensus(), Consensus::UPGRADE_OVERWINTER) + && (pfrom->nVersion < chainparams.GetConsensus().vUpgrades[Consensus::UPGRADE_OVERWINTER].nProtocolVersion)) + { + LogPrintf("peer=%d using obsolete version %i; disconnecting\n", pfrom->id, pfrom->nVersion); + pfrom->PushMessage("reject", strCommand, REJECT_OBSOLETE, + strprintf("Version must be %d or greater", + chainparams.GetConsensus().vUpgrades[Consensus::UPGRADE_OVERWINTER].nProtocolVersion)); + pfrom->fDisconnect = true; + return false; + } + + else if (strCommand == "addr") { vector vAddr; diff --git a/src/net.cpp b/src/net.cpp index 05f427707..72ef82d5a 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -7,6 +7,7 @@ #include "config/bitcoin-config.h" #endif +#include "main.h" #include "net.h" #include "addrman.h" @@ -812,6 +813,34 @@ static bool AttemptToEvictConnection(bool fPreferNewConnection) { // Protect connections with certain characteristics + // Check version of eviction candidates and prioritize nodes which do not support network upgrade. + std::vector vTmpEvictionCandidates; + int height; + { + LOCK(cs_main); + height = chainActive.Height(); + } + + const Consensus::Params& params = Params().GetConsensus(); + int nActivationHeight = params.vUpgrades[Consensus::UPGRADE_OVERWINTER].nActivationHeight; + + if (nActivationHeight > 0 && + height < nActivationHeight && + height >= nActivationHeight - NETWORK_UPGRADE_PEER_PREFERENCE_BLOCK_PERIOD) + { + // Find any nodes which don't support Overwinter protocol version + BOOST_FOREACH(const CNodeRef &node, vEvictionCandidates) { + if (node->nVersion < params.vUpgrades[Consensus::UPGRADE_OVERWINTER].nProtocolVersion) { + vTmpEvictionCandidates.push_back(node); + } + } + + // Prioritize these nodes by replacing eviction set with them + if (vTmpEvictionCandidates.size() > 0) { + vEvictionCandidates = vTmpEvictionCandidates; + } + } + // Deterministically select 4 peers to protect by netgroup. // An attacker cannot predict which netgroups will be protected. static CompareNetGroupKeyed comparerNetGroupKeyed; diff --git a/src/net.h b/src/net.h index 6fd49536d..55190baa5 100644 --- a/src/net.h +++ b/src/net.h @@ -57,6 +57,8 @@ static const size_t MAPASKFOR_MAX_SZ = MAX_INV_SZ; static const size_t SETASKFOR_MAX_SZ = 2 * MAX_INV_SZ; /** The maximum number of peer connections to maintain. */ static const unsigned int DEFAULT_MAX_PEER_CONNECTIONS = 125; +/** The period before a network upgrade activates, where connections to upgrading peers are preferred (in blocks). */ +static const int NETWORK_UPGRADE_PEER_PREFERENCE_BLOCK_PERIOD = 24 * 24 * 3; unsigned int ReceiveFloodSize(); unsigned int SendBufferSize(); diff --git a/src/version.h b/src/version.h index b68bafc87..25527895d 100644 --- a/src/version.h +++ b/src/version.h @@ -9,7 +9,7 @@ * network protocol versioning */ -static const int PROTOCOL_VERSION = 170002; +static const int PROTOCOL_VERSION = 170003; //! initial proto version, to be increased after version/verack negotiation static const int INIT_PROTO_VERSION = 209; From b6e5cc7d27180539a786f49992d760ea33f7ef2e Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 23 Feb 2018 14:22:43 -0800 Subject: [PATCH 0530/1062] Add python qa test overwinter_peer_management. --- qa/pull-tester/rpc-tests.sh | 1 + qa/rpc-tests/overwinter_peer_management.py | 117 +++++++++++++++++++++ qa/rpc-tests/test_framework/mininode.py | 13 ++- 3 files changed, 127 insertions(+), 4 deletions(-) create mode 100755 qa/rpc-tests/overwinter_peer_management.py diff --git a/qa/pull-tester/rpc-tests.sh b/qa/pull-tester/rpc-tests.sh index e2272ad43..3a6412d08 100755 --- a/qa/pull-tester/rpc-tests.sh +++ b/qa/pull-tester/rpc-tests.sh @@ -51,6 +51,7 @@ testScripts=( 'getblocktemplate.py' 'bip65-cltv-p2p.py' 'bipdersig-p2p.py' + 'overwinter_peer_management.py' ); testScriptsExt=( 'getblocktemplate_longpoll.py' diff --git a/qa/rpc-tests/overwinter_peer_management.py b/qa/rpc-tests/overwinter_peer_management.py new file mode 100755 index 000000000..a7a71e52d --- /dev/null +++ b/qa/rpc-tests/overwinter_peer_management.py @@ -0,0 +1,117 @@ +#!/usr/bin/env python2 +# Copyright (c) 2018 The Zcash developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +from test_framework.mininode import NodeConn, NodeConnCB, NetworkThread, \ + EarlyDisconnectError, msg_inv, mininode_lock, msg_ping, \ + MY_VERSION, OVERWINTER_PROTO_VERSION +from test_framework.test_framework import BitcoinTestFramework +from test_framework.util import initialize_chain_clean, start_nodes, \ + p2p_port, assert_equal + +import time + +# +# In this test we connect Sprout and Overwinter mininodes to a Zcashd node +# which will activate Overwinter at block 10. +# +# We test: +# 1. the mininodes stay connected to Zcash with Sprout consensus rules +# 2. when Overwinter activates, the Sprout mininodes are dropped +# 3. new Overwinter nodes can connect to Zcash +# 4. new Sprout nodes cannot connect to Zcash +# +# This test *does not* verify that prior to Overwinter activation, the Zcashd +# node will prefer connections with Overwinter nodes, with an eviction process +# that prioritizes Sprout connections. +# + + +class TestManager(NodeConnCB): + def __init__(self): + NodeConnCB.__init__(self) + self.create_callback_map() + + def on_close(self, conn): + pass + + def on_reject(self, conn, message): + conn.rejectMessage = message + + +class OverwinterPeerManagementTest(BitcoinTestFramework): + + def setup_chain(self): + print "Initializing test directory "+self.options.tmpdir + initialize_chain_clean(self.options.tmpdir, 1) + + def setup_network(self): + self.nodes = start_nodes(1, self.options.tmpdir, + extra_args=[['-nuparams=5ba81b19:10', '-debug', '-whitelist=127.0.0.1']]) + + def run_test(self): + test = TestManager() + + # Launch 10 Sprout and 10 Overwinter mininodes + nodes = [] + for x in xrange(10): + nodes.append(NodeConn('127.0.0.1', p2p_port(0), self.nodes[0], test, "regtest", False)) + nodes.append(NodeConn('127.0.0.1', p2p_port(0), self.nodes[0], test, "regtest", True)) + + # Start up network handling in another thread + NetworkThread().start() + + # Sprout consensus rules apply at block height 9 + self.nodes[0].generate(9) + assert_equal(9, self.nodes[0].getblockcount()) + + # Verify mininodes are still connected to zcashd node + peerinfo = self.nodes[0].getpeerinfo() + versions = [x["version"] for x in peerinfo] + assert_equal(10, versions.count(MY_VERSION)) + assert_equal(10, versions.count(OVERWINTER_PROTO_VERSION)) + + # Overwinter consensus rules activate at block height 10 + self.nodes[0].generate(1) + assert_equal(10, self.nodes[0].getblockcount()) + + # Mininodes send ping message to zcashd node. + pingCounter = 1 + for node in nodes: + node.send_message(msg_ping(pingCounter)) + pingCounter = pingCounter + 1 + + time.sleep(3) + + # Verify Sprout mininodes have been dropped and Overwinter mininodes are still connected. + peerinfo = self.nodes[0].getpeerinfo() + versions = [x["version"] for x in peerinfo] + assert_equal(0, versions.count(MY_VERSION)) + assert_equal(10, versions.count(OVERWINTER_PROTO_VERSION)) + + # Extend the Overwinter chain with another block. + self.nodes[0].generate(1) + + # Connect a new Overwinter mininode to the zcashd node, which is accepted. + nodes.append(NodeConn('127.0.0.1', p2p_port(0), self.nodes[0], test, "regtest", True)) + time.sleep(3) + assert_equal(11, len(self.nodes[0].getpeerinfo())) + + # Try to connect a new Sprout mininode to the zcashd node, which is rejected. + sprout = NodeConn('127.0.0.1', p2p_port(0), self.nodes[0], test, "regtest", False) + nodes.append(sprout) + time.sleep(3) + assert("Version must be 170003 or greater" in str(sprout.rejectMessage)) + + # Verify that only Overwinter mininodes are connected. + peerinfo = self.nodes[0].getpeerinfo() + versions = [x["version"] for x in peerinfo] + assert_equal(0, versions.count(MY_VERSION)) + assert_equal(11, versions.count(OVERWINTER_PROTO_VERSION)) + + for node in nodes: + node.disconnect_node() + +if __name__ == '__main__': + OverwinterPeerManagementTest().main() diff --git a/qa/rpc-tests/test_framework/mininode.py b/qa/rpc-tests/test_framework/mininode.py index c74d3f931..3c9821259 100755 --- a/qa/rpc-tests/test_framework/mininode.py +++ b/qa/rpc-tests/test_framework/mininode.py @@ -39,6 +39,7 @@ from .equihash import ( zcash_person, ) +OVERWINTER_PROTO_VERSION = 170003 BIP0031_VERSION = 60000 MY_VERSION = 170002 # past bip-31 for ping/pong MY_SUBVERSION = "/python-mininode-tester:0.0.1/" @@ -868,8 +869,12 @@ class CAlert(object): class msg_version(object): command = "version" - def __init__(self): - self.nVersion = MY_VERSION + def __init__(self, overwintered=False): + if overwintered: + self.nVersion = OVERWINTER_PROTO_VERSION + else: + self.nVersion = MY_VERSION + self.nServices = 1 self.nTime = time.time() self.addrTo = CAddress() @@ -1326,7 +1331,7 @@ class NodeConn(asyncore.dispatcher): "regtest": "\xaa\xe8\x3f\x5f" # regtest } - def __init__(self, dstaddr, dstport, rpc, callback, net="regtest"): + def __init__(self, dstaddr, dstport, rpc, callback, net="regtest", overwintered=False): asyncore.dispatcher.__init__(self, map=mininode_socket_map) self.log = logging.getLogger("NodeConn(%s:%d)" % (dstaddr, dstport)) self.dstaddr = dstaddr @@ -1343,7 +1348,7 @@ class NodeConn(asyncore.dispatcher): self.disconnect = False # stuff version msg into sendbuf - vt = msg_version() + vt = msg_version(overwintered) vt.addrTo.ip = self.dstaddr vt.addrTo.port = self.dstport vt.addrFrom.ip = "0.0.0.0" From 7b92f27e18056132a5073e65b70e0aeaa1ebbb0b Mon Sep 17 00:00:00 2001 From: Jay Graber Date: Fri, 23 Feb 2018 13:24:53 -0800 Subject: [PATCH 0531/1062] Add expiry to z_mergetoaddress --- src/wallet/rpcwallet.cpp | 6 +++++- src/wallet/wallet.cpp | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 9050c4b1b..af9064d44 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4065,13 +4065,17 @@ UniValue z_mergetoaddress(const UniValue& params, bool fHelp) contextInfo.push_back(Pair("fee", ValueFromAmount(nFee))); // Contextual transaction we will build on + int nextBlockHeight = chainActive.Height() + 1; CMutableTransaction contextualTx = CreateNewContextualCMutableTransaction( Params().GetConsensus(), - chainActive.Height() + 1); + nextBlockHeight); bool isShielded = numNotes > 0 || isToZaddr; if (contextualTx.nVersion == 1 && isShielded) { contextualTx.nVersion = 2; // Tx format should support vjoinsplit } + if (NetworkUpgradeActive(nextBlockHeight, Params().GetConsensus(), Consensus::UPGRADE_OVERWINTER)) { + contextualTx.nExpiryHeight = nextBlockHeight + expiryDelta; + } // Create operation and add to global queue std::shared_ptr q = getAsyncRPCQueue(); diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 253eb6169..e2cd01637 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -2584,6 +2584,7 @@ bool CWallet::CreateTransaction(const vector& vecSend, CWalletTx& wt if (NetworkUpgradeActive(nextBlockHeight, Params().GetConsensus(), Consensus::UPGRADE_OVERWINTER)) { if (nextBlockHeight + expiryDelta >= TX_EXPIRY_HEIGHT_THRESHOLD){ strFailReason = _("nExpiryHeight must be less than TX_EXPIRY_HEIGHT_THRESHOLD."); + return false; } else { txNew.nExpiryHeight = nextBlockHeight + expiryDelta; } From 59da58cdb09371fee6cfb845aaa7533ee6b53405 Mon Sep 17 00:00:00 2001 From: Jay Graber Date: Fri, 23 Feb 2018 18:20:30 -0800 Subject: [PATCH 0532/1062] Change rpc_tests to 21 --- src/test/rpc_tests.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/rpc_tests.cpp b/src/test/rpc_tests.cpp index 184b9d54e..b7223657c 100644 --- a/src/test/rpc_tests.cpp +++ b/src/test/rpc_tests.cpp @@ -316,7 +316,7 @@ BOOST_AUTO_TEST_CASE(rpc_raw_create_overwinter_v3) BOOST_CHECK_NO_THROW(r = CallRPC(string("decoderawtransaction ") + rawhex)); BOOST_CHECK_EQUAL(find_value(r.get_obj(), "overwintered").get_bool(), true); BOOST_CHECK_EQUAL(find_value(r.get_obj(), "version").get_int(), 3); - BOOST_CHECK_EQUAL(find_value(r.get_obj(), "expiryheight").get_int(), 0); + BOOST_CHECK_EQUAL(find_value(r.get_obj(), "expiryheight").get_int(), 21); BOOST_CHECK_EQUAL( ParseHexToUInt32(find_value(r.get_obj(), "versiongroupid").get_str()), OVERWINTER_VERSION_GROUP_ID); From 1dd95be4a9db73e56d2cf5f60b40467cc60e467e Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Sat, 24 Feb 2018 04:08:36 +0000 Subject: [PATCH 0533/1062] make-release.py: Versioning changes for 1.0.15-rc1. --- README.md | 2 +- configure.ac | 4 ++-- contrib/gitian-descriptors/gitian-linux.yml | 2 +- src/clientversion.h | 4 ++-- src/deprecation.h | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 3b8f56c2c..499035161 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Zcash 1.0.14 +Zcash 1.0.15-rc1 ============= What is Zcash? diff --git a/configure.ac b/configure.ac index f9c0f1246..3028dc6e5 100644 --- a/configure.ac +++ b/configure.ac @@ -2,8 +2,8 @@ dnl require autoconf 2.60 (AS_ECHO/AS_ECHO_N) AC_PREREQ([2.60]) define(_CLIENT_VERSION_MAJOR, 1) define(_CLIENT_VERSION_MINOR, 0) -define(_CLIENT_VERSION_REVISION, 14) -define(_CLIENT_VERSION_BUILD, 50) +define(_CLIENT_VERSION_REVISION, 15) +define(_CLIENT_VERSION_BUILD, 25) define(_ZC_BUILD_VAL, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, m4_incr(_CLIENT_VERSION_BUILD), m4_eval(_CLIENT_VERSION_BUILD < 50), 1, m4_eval(_CLIENT_VERSION_BUILD - 24), m4_eval(_CLIENT_VERSION_BUILD == 50), 1, , m4_eval(_CLIENT_VERSION_BUILD - 50))) define(_CLIENT_VERSION_SUFFIX, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, _CLIENT_VERSION_REVISION-beta$1, m4_eval(_CLIENT_VERSION_BUILD < 50), 1, _CLIENT_VERSION_REVISION-rc$1, m4_eval(_CLIENT_VERSION_BUILD == 50), 1, _CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION-$1))) define(_CLIENT_VERSION_IS_RELEASE, true) diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml index 558d386e1..e10d4585f 100644 --- a/contrib/gitian-descriptors/gitian-linux.yml +++ b/contrib/gitian-descriptors/gitian-linux.yml @@ -1,5 +1,5 @@ --- -name: "zcash-1.0.14" +name: "zcash-1.0.15-rc1" enable_cache: true distro: "debian" suites: diff --git a/src/clientversion.h b/src/clientversion.h index 6873c1a39..4182b7084 100644 --- a/src/clientversion.h +++ b/src/clientversion.h @@ -17,8 +17,8 @@ //! These need to be macros, as clientversion.cpp's and bitcoin*-res.rc's voodoo requires it #define CLIENT_VERSION_MAJOR 1 #define CLIENT_VERSION_MINOR 0 -#define CLIENT_VERSION_REVISION 14 -#define CLIENT_VERSION_BUILD 50 +#define CLIENT_VERSION_REVISION 15 +#define CLIENT_VERSION_BUILD 25 //! Set to true for release, false for prerelease or test build #define CLIENT_VERSION_IS_RELEASE true diff --git a/src/deprecation.h b/src/deprecation.h index eb9899c1b..6678e4969 100644 --- a/src/deprecation.h +++ b/src/deprecation.h @@ -8,7 +8,7 @@ // Deprecation policy: // * Shut down 16 weeks' worth of blocks after the estimated release block height. // * A warning is shown during the 2 weeks' worth of blocks prior to shut down. -static const int APPROX_RELEASE_HEIGHT = 249000; +static const int APPROX_RELEASE_HEIGHT = 277725; static const int WEEKS_UNTIL_DEPRECATION = 16; static const int DEPRECATION_HEIGHT = APPROX_RELEASE_HEIGHT + (WEEKS_UNTIL_DEPRECATION * 7 * 24 * 24); From 7d0c1df409398944f45023e7a4dd60752689ec97 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Sat, 24 Feb 2018 04:17:59 +0000 Subject: [PATCH 0534/1062] make-release.py: Updated manpages for 1.0.15-rc1. --- doc/man/zcash-cli.1 | 6 +++--- doc/man/zcash-tx.1 | 8 ++++---- doc/man/zcashd.1 | 15 ++++++++++----- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/doc/man/zcash-cli.1 b/doc/man/zcash-cli.1 index 52af9437f..d67fbeac4 100644 --- a/doc/man/zcash-cli.1 +++ b/doc/man/zcash-cli.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASH-CLI "1" "January 2018" "zcash-cli v1.0.14" "User Commands" +.TH ZCASH-CLI "1" "February 2018" "zcash-cli v1.0.15-rc1" "User Commands" .SH NAME -zcash-cli \- manual page for zcash-cli v1.0.14 +zcash-cli \- manual page for zcash-cli v1.0.15-rc1 .SH DESCRIPTION -Zcash RPC client version v1.0.14 +Zcash RPC client version v1.0.15\-rc1 .PP In order to ensure you are adequately protecting your privacy when using Zcash, please see . diff --git a/doc/man/zcash-tx.1 b/doc/man/zcash-tx.1 index a065ca04a..5dc42af77 100644 --- a/doc/man/zcash-tx.1 +++ b/doc/man/zcash-tx.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASH-TX "1" "January 2018" "zcash-tx v1.0.14" "User Commands" +.TH ZCASH-TX "1" "February 2018" "zcash-tx v1.0.15-rc1" "User Commands" .SH NAME -zcash-tx \- manual page for zcash-tx v1.0.14 +zcash-tx \- manual page for zcash-tx v1.0.15-rc1 .SH DESCRIPTION -Zcash zcash\-tx utility version v1.0.14 +Zcash zcash\-tx utility version v1.0.15\-rc1 .SS "Usage:" .TP zcash\-tx [options] [commands] @@ -68,7 +68,7 @@ outscript=VALUE:SCRIPT .IP Add raw script output to TX .IP -sign=SIGHASH\-FLAGS +sign=HEIGHT:SIGHASH\-FLAGS .IP Add zero or more signatures to transaction. This command requires JSON registers:prevtxs=JSON object, privatekeys=JSON object. See diff --git a/doc/man/zcashd.1 b/doc/man/zcashd.1 index 91917eece..6bfa1ae28 100644 --- a/doc/man/zcashd.1 +++ b/doc/man/zcashd.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASHD "1" "January 2018" "zcashd v1.0.14" "User Commands" +.TH ZCASHD "1" "February 2018" "zcashd v1.0.15-rc1" "User Commands" .SH NAME -zcashd \- manual page for zcashd v1.0.14 +zcashd \- manual page for zcashd v1.0.15-rc1 .SH DESCRIPTION -Zcash Daemon version v1.0.14 +Zcash Daemon version v1.0.15\-rc1 .PP In order to ensure you are adequately protecting your privacy when using Zcash, please see . @@ -54,7 +54,7 @@ Specify data directory \fB\-disabledeprecation=\fR .IP Disable block\-height node deprecation and automatic shutdown (example: -\fB\-disabledeprecation\fR=\fI\,1\/\fR.0.14) +\fB\-disabledeprecation\fR=\fI\,1\/\fR.0.15\-rc1) .HP \fB\-exportdir=\fR .IP @@ -62,7 +62,7 @@ Specify directory to be used when exporting data .HP \fB\-dbcache=\fR .IP -Set database cache size in megabytes (4 to 16384, default: 100) +Set database cache size in megabytes (4 to 16384, default: 450) .HP \fB\-loadblock=\fR .IP @@ -264,6 +264,11 @@ Spend unconfirmed change when sending transactions (default: 1) If paytxfee is not set, include enough fee so transactions begin confirmation on average within n blocks (default: 2) .HP +\fB\-txexpirydelta\fR +.IP +Set the number of blocks after which a transaction that has not been +mined will become invalid (default: 20) +.HP \fB\-maxtxfee=\fR .IP Maximum total fees (in ZEC) to use in a single wallet transaction; From 34ce29b3ee97865b53e5af24ed6acc146a7ecdf1 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Sat, 24 Feb 2018 04:20:05 +0000 Subject: [PATCH 0535/1062] make-release.py: Updated release notes and changelog for 1.0.15-rc1. --- contrib/debian/changelog | 6 + doc/release-notes/release-notes-1.0.15-rc1.md | 165 ++++++++++++++++++ 2 files changed, 171 insertions(+) create mode 100644 doc/release-notes/release-notes-1.0.15-rc1.md diff --git a/contrib/debian/changelog b/contrib/debian/changelog index 606b33b90..d29b0967e 100644 --- a/contrib/debian/changelog +++ b/contrib/debian/changelog @@ -1,3 +1,9 @@ +zcash (1.0.15~rc1) stable; urgency=medium + + * 1.0.15-rc1 release. + + -- Zcash Company Sat, 24 Feb 2018 04:20:05 +0000 + zcash (1.0.14) stable; urgency=medium * 1.0.14 release. diff --git a/doc/release-notes/release-notes-1.0.15-rc1.md b/doc/release-notes/release-notes-1.0.15-rc1.md new file mode 100644 index 000000000..b4b0b2f0a --- /dev/null +++ b/doc/release-notes/release-notes-1.0.15-rc1.md @@ -0,0 +1,165 @@ +Notable changes +=============== + +UTXO and note merging +--------------------- + +In order to simplify the process of combining many small UTXOs and notes into a +few larger ones, a new RPC method `z_mergetoaddress` has been added. It merges +funds from t-addresses, z-addresses, or both, and sends them to a single +t-address or z-address. + +Unlike most other RPC methods, `z_mergetoaddress` operates over a particular +quantity of UTXOs and notes, instead of a particular amount of ZEC. By default, +it will merge 50 UTXOs and 10 notes at a time; these limits can be adjusted with +the parameters `transparent_limit` and `shielded_limit`. + +`z_mergetoaddress` also returns the number of UTXOs and notes remaining in the +given addresses, which can be used to automate the merging process (for example, +merging until the number of UTXOs falls below some value). + +UTXO memory accounting +---------------------- + +The default -dbcache has been changed in this release to 450MiB. Users can set -dbcache to a higher value (e.g. to keep the UTXO set more fully cached in memory). Users on low-memory systems (such as systems with 1GB or less) should consider specifying a lower value for this parameter. + +Additional information relating to running on low-memory systems can be found here: [reducing-memory-usage.md](https://github.com/zcash/zcash/blob/master/doc/reducing-memory-usage.md). + +Changelog +========= + +21E14 (1): + Remove obsolete reference to CValidationState from UpdateCoins. + +Alex Morcos (1): + Implement helper class for CTxMemPoolEntry constructor + +Ariel (2): + add blake2b writer + update SignatureHash according to Overwinter spec + +Ashley Holman (1): + TxMemPool: Change mapTx to a boost::multi_index_container + +Cory Fields (2): + chainparams: move CCheckpointData into chainparams.h + chainparams: don't use std namespace + +Daniel Kraft (1): + Clean up chainparams some more. + +Jack Grigg (38): + Scope the ECDSA constant sizes to CPubKey / CKey classes + Enable Bash completion for -exportdir + Check chainValueZat when checking value pool monitoring + Add missing namespace for boost::get + Add viewing key prefix to regtest parameters + zkey_import_export: Synchronize mempools before mining + Use JoinSplitTestingSetup for Boost sighash tests + Network upgrade activation mechanism + Allow changing network upgrade parameters on regtest + Test network upgrade logic + Adjust rewind logic to use the network upgrade mechanism + Add Overwinter to upgrade list + Add method for fetching the next activation height after a given block height + Use a boost::optional for nCachedBranchId + Change UI/log status message for block rewinding + Update quote from ZIP 200 + Update SignatureHash tests for transaction format changes + Implement roll-back limit for reorganisation + Add rollback limit to block index rewinding + Remove mempool transactions which commit to an unmineable branch ID + Remove P2WPKH and P2WSH from signing logic + Add consensus branch ID parameter to SignatureHash, remove SigVersion parameter + Cleanup: Wrap function arguments + Regenerate SignatureHash tests + Make number of inputs configurable in validatelargetx test + Use v3 transactions with caching for validatelargetx benchmark + Extend CWallet::GetFilteredNotes to enable filtering on a set of addresses + Add branch IDs for current and next block to getblockchaininfo + Check Equihash solution when loading block index + Implement z_mergetoaddress for combining UTXOs and notes + Gate z_mergetoaddress as an experimental feature + Add z_mergetoaddress to release notes + Check upgrade status in wallet_overwintertx RPC test + Document that consensus.chaintip != consensus.nextblock just before an upgrade + Regenerate sighash tests + wallet_mergetoaddress: Add additional syncs to prevent race conditions + make-release.py: Versioning changes for 1.0.15-rc1. + make-release.py: Updated manpages for 1.0.15-rc1. + +Jay Graber (8): + Add getdeprecationinfo rpc call to return current version and deprecation block height. + Make applicable only on mainnet + Add upgrades field to RPC call getblockchaininfo + Implement transaction expiry for Overwinter + Add -txexpirydelta cli option + Add mempool_tx_expiry.py test + Add expiry to z_mergetoaddress + Change rpc_tests to 21 + +Jonas Nick (1): + Reduce unnecessary hashing in signrawtransaction + +Jorge Timón (3): + Chainparams: Introduce CreateGenesisBlock() static function + Chainparams: CTestNetParams and CRegTestParams extend directly from CChainParams + Mempool: Use Consensus::CheckTxInputs direclty over main::CheckInputs + +Marius Kjærstad (1): + Changed http:// to https:// on some links + +Mark Friedenbach (1): + Explicitly set tx.nVersion for the genesis block and mining tests + +Matt Corallo (5): + Add failing test checking timelocked-txn removal during reorg + Fix removal of time-locked transactions during reorg + Fix comment in removeForReorg + Make indentation in ActivateBestChainStep readable + removeForReorg calls once-per-disconnect-> once-per-reorg + +Maxwell Gubler (1): + Fix syntax examples for z_importwallet and export + +Nicolas DORIER (1): + Unit test for sighash caching + +Pavel Vasin (1): + remove unused NOBLKS_VERSION_{START,END} constants + +Pieter Wuille (8): + Add rewind logic to deal with post-fork software updates + Support -checkmempool=N, which runs checks on average once every N transactions + Report non-mandatory script failures correctly + Refactor script validation to observe amounts + BIP143: Verification logic + BIP143: Signing logic + Precompute sighashes + Rename to PrecomputedTransactionData + +Simon Liu (11): + Fixes #2793. Backport commit f33afd3 to increase dbcache default. + Add documentation about dbcache. + Add note about dbcache to 1.0.15 release notes. + Remove redundant service flag NODE_GETUTXO meant for Bitcoin XT. + Implementation of Overwinter transaction format ZIP 202. + Add test to check malformed v1 transaction against Overwinter tx parser + Closes #2964. z_sendmany once again makes v1 tx for taddr to taddr. + Closes #2954 and #2959. Fixes Overwinter issues in sighash_tests. + Add field nProtocolVersion to struct NetworkUpgrade. + Overwinter peer management and network handshaking. + Add python qa test overwinter_peer_management. + +Suhas Daftuar (3): + Track coinbase spends in CTxMemPoolEntry + Don't call removeForReorg if DisconnectTip fails + Fix removeForReorg to use MedianTimePast + +jc (1): + read hashReserved from disk block index + +syd (2): + Fix libsnark dependency build. + Remove OSX and Windows files from Makefile + share directory. + From 7d937f290e08522beaf10d6ffe237a756a06361b Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Sat, 24 Feb 2018 19:43:37 -0300 Subject: [PATCH 0536/1062] add secp256k1 condition type to cryptoconditions --- .gitmodules | 2 +- qa/cryptoconditions/test_integration.py | 53 ++++++++++++++++++++++--- qa/cryptoconditions/testsupport.py | 22 ++++++++-- src/cryptoconditions | 2 +- src/komodo_cryptoconditions.cpp | 4 +- src/script/interpreter.cpp | 2 +- src/secp256k1/src/ecdsa_impl.h | 10 ++++- 7 files changed, 81 insertions(+), 14 deletions(-) diff --git a/.gitmodules b/.gitmodules index 83942a053..bf76cc359 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "cryptoconditions"] path = src/cryptoconditions url = https://github.com/libscott/libcryptoconditions.git - branch = komodo-integration + branch = komodo diff --git a/qa/cryptoconditions/test_integration.py b/qa/cryptoconditions/test_integration.py index 6d60ee921..f764fcb81 100644 --- a/qa/cryptoconditions/test_integration.py +++ b/qa/cryptoconditions/test_integration.py @@ -7,6 +7,9 @@ import struct from testsupport import * +SCRIPT_FALSE = 'Script evaluated without error but finished with a false/empty top stack element' + + @fanout_input(0) def test_basic_spend(inp): spend = {'inputs': [inp], "outputs": [nospend]} @@ -27,7 +30,7 @@ def test_fulfillment_wrong_signature(inp): try: assert not submit(signed), 'should raise an error' except RPCError as e: - assert 'Script evaluated without error but finished with a false/empty top stack element' in str(e), str(e) + assert SCRIPT_FALSE in str(e), str(e) @fanout_input(2) @@ -41,7 +44,7 @@ def test_fulfillment_wrong_pubkey(inp): try: assert not submit(signed), 'should raise an error' except RPCError as e: - assert 'Script evaluated without error but finished with a false/empty top stack element' in str(e), str(e) + assert SCRIPT_FALSE in str(e), str(e) @fanout_input(3) @@ -71,7 +74,7 @@ def test_invalid_condition(inp): try: assert not submit(sign(spend1)), 'should raise an error' except RPCError as e: - assert 'Script evaluated without error but finished with a false/empty top stack element' in str(e), str(e) + assert SCRIPT_FALSE in str(e), str(e) @fanout_input(5) @@ -124,7 +127,7 @@ def test_aux_basic(inp): try: assert not submit(sign(spend2)), 'should raise an error' except RPCError as e: - assert 'Script evaluated without error but finished with a false/empty top stack element' in str(e), str(e) + assert SCRIPT_FALSE in str(e), str(e) @fanout_input(7) @@ -168,7 +171,47 @@ def test_aux_complex(inp): try: assert not submit(sign(spend2)), 'should raise an error' except RPCError as e: - assert 'Script evaluated without error but finished with a false/empty top stack element' in str(e), str(e) + assert SCRIPT_FALSE in str(e), str(e) + + +@fanout_input(8) +def test_secp256k1_condition(inp): + ec_cond = { + 'type': 'secp256k1-sha-256', + 'publicKey': notary_pk + } + + # Create some secp256k1 outputs + spend0 = { + 'inputs': [inp], + 'outputs': [ + {'amount': 500, 'script': {'condition': ec_cond}}, + {'amount': 500, 'script': {'condition': ec_cond}} + ] + } + spend0_txid = submit(sign(spend0)) + assert rpc.getrawtransaction(spend0_txid) + + # Test a good fulfillment + spend1 = { + 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {'fulfillment': ec_cond}}], + 'outputs': [{'amount': 500, 'script': {'condition': ec_cond}}] + } + spend1_txid = submit(sign(spend1)) + assert rpc.getrawtransaction(spend1_txid) + + # Test a bad fulfillment + spend2 = { + 'inputs': [{'txid': spend0_txid, 'idx': 1, 'script': {'fulfillment': ec_cond}}], + 'outputs': [{'amount': 500, 'script': {'condition': ec_cond}}] + } + signed = sign(spend2) + signed['tx']['inputs'][0]['script']['fulfillment']['publicKey'] = \ + '0275cef12fc5c49be64f5aab3d1fbba08cd7b0d02908b5112fbd8504218d14bc7d' + try: + assert not submit(signed), 'should raise an error' + except RPCError as e: + assert SCRIPT_FALSE in str(e), str(e) if __name__ == '__main__': diff --git a/qa/cryptoconditions/testsupport.py b/qa/cryptoconditions/testsupport.py index e6025c0bc..35b7ecdf6 100644 --- a/qa/cryptoconditions/testsupport.py +++ b/qa/cryptoconditions/testsupport.py @@ -74,7 +74,8 @@ def wait_for_block(height): def sign(tx): signed = hoek.signTxBitcoin({'tx': tx, 'privateKeys': [notary_sk]}) - return hoek.signTxEd25519({'tx': signed['tx'], 'privateKeys': [alice_sk, bob_sk]}) + signed = hoek.signTxEd25519({'tx': signed['tx'], 'privateKeys': [alice_sk, bob_sk]}) + return hoek.signTxSecp256k1({'tx': signed['tx'], 'privateKeys': [notary_sk]}) def submit(tx): @@ -96,14 +97,14 @@ def get_fanout_txid(): reward_tx = hoek.decodeTx({'hex': reward_tx_raw}) balance = reward_tx['tx']['outputs'][0]['amount'] - n_outs = 100 + n_outs = 16 remainder = balance - n_outs * 1000 fanout = { 'inputs': [ {'txid': reward_txid, 'idx': 0, 'script': {'pubkey': notary_pk}} ], - "outputs": (100 * [ + "outputs": (n_outs * [ {"amount": 1000, "script": {"condition": cond_alice}} ] + [{"amount": remainder, 'script': {'address': notary_addr}}]) } @@ -122,6 +123,21 @@ def fanout_input(n): return decorate +def decode_base64(data): + """Decode base64, padding being optional. + + :param data: Base64 data as an ASCII byte string + :returns: The decoded byte string. + """ + missing_padding = len(data) % 4 + if missing_padding: + data += '=' * (4 - missing_padding) + return base64.urlsafe_b64decode(data) + + +def encode_base64(data): + return base64.urlsafe_b64encode(data).rstrip(b'=') + notary_addr = 'RXSwmXKtDURwXP7sdqNfsJ6Ga8RaxTchxE' notary_pk = '0205a8ad0c1dbc515f149af377981aab58b836af008d4d7ab21bd76faf80550b47' diff --git a/src/cryptoconditions b/src/cryptoconditions index 0dcac79cf..863d92661 160000 --- a/src/cryptoconditions +++ b/src/cryptoconditions @@ -1 +1 @@ -Subproject commit 0dcac79cf9ffeda8aff9d3e9e41fa23ac8208486 +Subproject commit 863d9266141667b469a6574ce7285134665427c6 diff --git a/src/komodo_cryptoconditions.cpp b/src/komodo_cryptoconditions.cpp index c807df7c9..4c516b320 100644 --- a/src/komodo_cryptoconditions.cpp +++ b/src/komodo_cryptoconditions.cpp @@ -3,8 +3,8 @@ #include "script/interpreter.h" -int TransactionSignatureChecker::CheckAuxCondition(const CC *cond) const { - +int TransactionSignatureChecker::CheckAuxCondition(const CC *cond) const +{ // Check that condition is equal to fulfillment if (0 == strcmp((const char*)cond->method, "equals")) { return (cond->conditionAuxLength == cond->fulfillmentAuxLength) && diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 709b566f6..91b22039e 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -1164,7 +1164,7 @@ static int komodoCCAux(CC *cond, void *checker) { bool TransactionSignatureChecker::CheckCryptoCondition(const CC *cond, const std::vector& condBin, const CScript& scriptCode) const { uint256 message = SignatureHash(scriptCode, *txTo, nIn, SIGHASH_ALL); - return cc_verify(cond, (const unsigned char*)&message, 32, + return cc_verify(cond, (const unsigned char*)&message, 32, 0, condBin.data(), condBin.size(), komodoCCAux, (void*)this); } diff --git a/src/secp256k1/src/ecdsa_impl.h b/src/secp256k1/src/ecdsa_impl.h index ed1d22818..8d97db946 100644 --- a/src/secp256k1/src/ecdsa_impl.h +++ b/src/secp256k1/src/ecdsa_impl.h @@ -47,12 +47,20 @@ static const secp256k1_fe_t secp256k1_ecdsa_const_p_minus_order = SECP256K1_FE_C ); static int secp256k1_ecdsa_sig_parse(secp256k1_ecdsa_sig_t *r, const unsigned char *sig, int size) { + + /* libscott had to add this to get this version of the library to read compact sigs */ + int overflow = 0; + if (size == 64) { + secp256k1_scalar_set_b32(&r->r, sig, &overflow); + secp256k1_scalar_set_b32(&r->s, sig+32, &overflow); + return 1; + } + unsigned char ra[32] = {0}, sa[32] = {0}; const unsigned char *rp; const unsigned char *sp; int lenr; int lens; - int overflow; if (sig[0] != 0x30) { return 0; } From 830d5ff54e0f203c1093c687edb4653af1ff3b77 Mon Sep 17 00:00:00 2001 From: Mihail Fedorov Date: Sun, 25 Feb 2018 03:22:03 +0300 Subject: [PATCH 0537/1062] vote2018 --- src/assetchains | 39 +++------------------------------------ src/assetchains.old | 4 ++-- src/dpowassets | 34 +--------------------------------- 3 files changed, 6 insertions(+), 71 deletions(-) diff --git a/src/assetchains b/src/assetchains index 1ca93b3c2..746f0d542 100755 --- a/src/assetchains +++ b/src/assetchains @@ -35,11 +35,9 @@ komodo_asset JUMBLR 999999 komodo_asset BET 999999 komodo_asset CRYPTO 999999 komodo_asset HODL 9999999 -#komodo_asset SHARK 1401 komodo_asset MSHARK 1400000 komodo_asset BOTS 999999 komodo_asset MGW 999999 -#komodo_asset MVP 1000000 komodo_asset COQUI 72000000 komodo_asset WLC 210000000 komodo_asset KV 1000000 @@ -49,37 +47,6 @@ komodo_asset MNZ 257142858 komodo_asset AXO 200000000 komodo_asset ETOMIC 100000000 komodo_asset BTCH 20998641 -komodo_asset VOTE 49999999999 - -#komodo_asset USD -#komodo_asset EUR -#komodo_asset JPY -#komodo_asset GBP -#komodo_asset AUD -#komodo_asset CAD -#komodo_asset CHF -#komodo_asset NZD -#komodo_asset CNY -#komodo_asset RUB -#komodo_asset MXN -#komodo_asset BRL -#komodo_asset INR -#komodo_asset HKD -#komodo_asset TRY -#komodo_asset ZAR -#komodo_asset PLN -#komodo_asset NOK -#komodo_asset SEK -#komodo_asset DKK -#komodo_asset CZK -#komodo_asset HUF -#komodo_asset ILS -#komodo_asset KRW -#komodo_asset MYR -#komodo_asset PHP -#komodo_asset RON -#komodo_asset SGD -#komodo_asset THB -#komodo_asset BGN -#komodo_asset IDR -#komodo_asset HRK +komodo_asset VOTE2018 600000000 +komodo_asset PIZZA 100000000 +komodo_asset BEER 100000000 diff --git a/src/assetchains.old b/src/assetchains.old index 20f47d006..ab3c152b8 100755 --- a/src/assetchains.old +++ b/src/assetchains.old @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/bash set -x delay=60 source pubkey.txt @@ -24,7 +24,7 @@ echo $pubkey ./komodod -pubkey=$pubkey -ac_name=AXO -ac_supply=200000000 -addnode=78.47.196.146 & ./komodod -pubkey=$pubkey -ac_name=ETOMIC -ac_supply=100000000 -addnode=78.47.196.146 & ./komodod -pubkey=$pubkey -ac_name=BTCH -ac_supply=20998641 -addnode=78.47.196.146 & -./komodod -pubkey=$pubkey -ac_name=VOTE -ac_supply=49999999999 -addnode=78.47.196.146 & +./komodod -pubkey=$pubkey -ac_name=VOTE2018 -ac_supply=600000000 -addnode=78.47.196.146 & ./komodod -pubkey=$pubkey -ac_name=BEER -ac_supply=100000000 -addnode=24.54.206.138 & ./komodod -pubkey=$pubkey -ac_name=PIZZA -ac_supply=100000000 -addnode=24.54.206.138 & #sleep $delay diff --git a/src/dpowassets b/src/dpowassets index 3fe8aa1b0..81cb5b68e 100755 --- a/src/dpowassets +++ b/src/dpowassets @@ -27,40 +27,8 @@ curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dp curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"ETOMIC\",\"pubkey\":\"$pubkey\"}" curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"BTCH\",\"pubkey\":\"$pubkey\"}" #curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CHAIN\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"VOTE\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"VOTE2018\",\"pubkey\":\"$pubkey\"}" #curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"USD\",\"pubkey\":\"$pubkey\"}" #curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"EUR\",\"pubkey\":\"$pubkey\"}" - # -#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"JPY\",\"pubkey\":\"$pubkey\"}" -#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"GBP\",\"pubkey\":\"$pubkey\"}" -#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"AUD\",\"pubkey\":\"$pubkey\"}" -#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CAD\",\"pubkey\":\"$pubkey\"}" -#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CHF\",\"pubkey\":\"$pubkey\"}" -#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"NZD\",\"pubkey\":\"$pubkey\"}" -#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CNY\",\"pubkey\":\"$pubkey\"}" -#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"RUB\",\"pubkey\":\"$pubkey\"}" -#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"MXN\",\"pubkey\":\"$pubkey\"}" -#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"BRL\",\"pubkey\":\"$pubkey\"}" -#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"INR\",\"pubkey\":\"$pubkey\"}" -#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"HKD\",\"pubkey\":\"$pubkey\"}" -#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"TRY\",\"pubkey\":\"$pubkey\"}" -#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"ZAR\",\"pubkey\":\"$pubkey\"}" -#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"PLN\",\"pubkey\":\"$pubkey\"}" -#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"NOK\",\"pubkey\":\"$pubkey\"}" -#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"SEK\",\"pubkey\":\"$pubkey\"}" -#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"DKK\",\"pubkey\":\"$pubkey\"}" -#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CZK\",\"pubkey\":\"$pubkey\"}" -#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"HUF\",\"pubkey\":\"$pubkey\"}" -#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"ILS\",\"pubkey\":\"$pubkey\"}" -#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"KRW\",\"pubkey\":\"$pubkey\"}" -#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"MYR\",\"pubkey\":\"$pubkey\"}" -#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"PHP\",\"pubkey\":\"$pubkey\"}" -#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"RON\",\"pubkey\":\"$pubkey\"}" -#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"SGD\",\"pubkey\":\"$pubkey\"}" -#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"THB\",\"pubkey\":\"$pubkey\"}" -#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"BGN\",\"pubkey\":\"$pubkey\"}" -#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"IDR\",\"pubkey\":\"$pubkey\"}" -#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"HRK\",\"pubkey\":\"$pubkey\"}" - From ec0b0757b6a3f3fbefd04e07a08206b13f12d821 Mon Sep 17 00:00:00 2001 From: Mihail Fedorov Date: Sun, 25 Feb 2018 03:46:02 +0300 Subject: [PATCH 0538/1062] fiat scripts --- src/fiat-cli | 36 +----------------------------------- src/fiat/vote | 2 -- 2 files changed, 1 insertion(+), 37 deletions(-) delete mode 100755 src/fiat/vote diff --git a/src/fiat-cli b/src/fiat-cli index 81ed6b56a..d9cc68ff5 100755 --- a/src/fiat-cli +++ b/src/fiat-cli @@ -1,37 +1,5 @@ #!/bin/bash #set -x -#echo aud; fiat/aud $1 $2 $3 $4 -#echo bgn; fiat/bgn $1 $2 $3 $4 -#echo cad; fiat/cad $1 $2 $3 $4 -#echo chf; fiat/chf $1 $2 $3 $4 -#echo cny; fiat/cny $1 $2 $3 $4 -#echo czk; fiat/czk $1 $2 $3 $4 -#echo dkk; fiat/dkk $1 $2 $3 $4 -#echo eur; fiat/eur $1 $2 $3 $4 -#echo gbp; fiat/gbp $1 $2 $3 $4 -#echo hkd; fiat/hkd $1 $2 $3 $4 -#echo hrk; fiat/hrk $1 $2 $3 $4 -#echo huf; fiat/huf $1 $2 $3 $4 -#echo idr; fiat/idr $1 $2 $3 $4 -#echo ils; fiat/ils $1 $2 $3 $4 -#echo inr; fiat/inr $1 $2 $3 $4 -#echo jpy; fiat/jpy $1 $2 $3 $4 -#echo krw; fiat/krw $1 $2 $3 $4 -#echo mxn; fiat/mxn $1 $2 $3 $4 -#echo myr; fiat/myr $1 $2 $3 $4 -#echo nok; fiat/nok $1 $2 $3 $4 -#echo nzd; fiat/nzd $1 $2 $3 $4 -#echo php; fiat/php $1 $2 $3 $4 -#echo pln; fiat/pln $1 $2 $3 $4 -#echo brl; fiat/brl $1 $2 $3 $4 -#echo ron; fiat/ron $1 $2 $3 $4 -#echo rub; fiat/rub $1 $2 $3 $4 -#echo sek; fiat/sek $1 $2 $3 $4 -#echo sgd; fiat/sgd $1 $2 $3 $4 -#echo thb; fiat/thb $1 $2 $3 $4 -#echo try; fiat/try $1 $2 $3 $4 -#echo usd; fiat/usd $1 $2 $3 $4 -#echo zar; fiat/zar $1 $2 $3 $4 echo revs; fiat/revs $1 $2 $3 $4 echo supernet; fiat/supernet $1 $2 $3 $4 echo dex; fiat/dex $1 $2 $3 $4 @@ -40,11 +8,9 @@ echo jumblr; fiat/jumblr $1 $2 $3 $4 echo bet; fiat/bet $1 $2 $3 $4 echo crypto; fiat/crypto $1 $2 $3 $4 echo hodl; fiat/hodl $1 $2 $3 $4 -#echo shark; fiat/shark $1 $2 $3 $4 echo mshark; fiat/mshark $1 $2 $3 $4 echo bots; fiat/bots $1 $2 $3 $4 echo mgw; fiat/mgw $1 $2 $3 $4 -#echo mvp; fiat/mvp $1 $2 $3 $4 echo coqui; fiat/coqui $1 $2 $3 $4 echo wlc; fiat/wlc $1 $2 $3 $4 echo kv; fiat/kv $1 $2 $3 $4 @@ -56,4 +22,4 @@ echo etomic; fiat/etomic $1 $2 $3 $4 echo btch; fiat/btch $1 $2 $3 $4 echo pizza; fiat/pizza $1 $2 $3 $4 echo beer; fiat/beer $1 $2 $3 $4 -echo vote; fiat/vote $1 $2 $3 $4 +echo vote2018; fiat/vote2018 $1 $2 $3 $4 diff --git a/src/fiat/vote b/src/fiat/vote deleted file mode 100755 index 67f47953e..000000000 --- a/src/fiat/vote +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -./komodo-cli -ac_name=VOTE $1 $2 $3 $4 $5 $6 From 8bf22c6fd0c9a3ea58c7101540b50d62f9df439d Mon Sep 17 00:00:00 2001 From: Mihail Fedorov Date: Sun, 25 Feb 2018 03:49:58 +0300 Subject: [PATCH 0539/1062] fiat scripts --- src/fiat/vote2018 | 2 ++ 1 file changed, 2 insertions(+) create mode 100755 src/fiat/vote2018 diff --git a/src/fiat/vote2018 b/src/fiat/vote2018 new file mode 100755 index 000000000..4e385d76f --- /dev/null +++ b/src/fiat/vote2018 @@ -0,0 +1,2 @@ +#!/bin/bash +./komodo-cli -ac_name=VOTE2018 $1 $2 $3 $4 $5 $6 From 28658719eab23190d0a9c4910254372eda1a0980 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Sun, 25 Feb 2018 16:22:12 -0300 Subject: [PATCH 0540/1062] tweak hoek interface --- qa/cryptoconditions/test_integration.py | 10 +++++----- qa/cryptoconditions/testsupport.py | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/qa/cryptoconditions/test_integration.py b/qa/cryptoconditions/test_integration.py index f764fcb81..bd72b961d 100644 --- a/qa/cryptoconditions/test_integration.py +++ b/qa/cryptoconditions/test_integration.py @@ -25,7 +25,7 @@ def test_fulfillment_wrong_signature(inp): signed = sign(spend) # Set the correct pubkey, signature is bob's - signed['tx']['inputs'][0]['script']['fulfillment']['publicKey'] = alice_pk + signed['inputs'][0]['script']['fulfillment']['publicKey'] = alice_pk try: assert not submit(signed), 'should raise an error' @@ -39,7 +39,7 @@ def test_fulfillment_wrong_pubkey(inp): signed = sign(spend) # Set the wrong pubkey, signature is correct - signed['tx']['inputs'][0]['script']['fulfillment']['publicKey'] = bob_pk + signed['inputs'][0]['script']['fulfillment']['publicKey'] = bob_pk try: assert not submit(signed), 'should raise an error' @@ -54,7 +54,7 @@ def test_invalid_fulfillment_binary(inp): spend = {'inputs': [inp], 'outputs': [nospend]} try: - assert not submit({'tx': spend}), 'should raise an error' + assert not submit(spend), 'should raise an error' except RPCError as e: assert 'Crypto-Condition payload is invalid' in str(e), str(e) @@ -85,7 +85,7 @@ def test_oversize_fulfillment(inp): spend = {'inputs': [inp], 'outputs': [nospend]} try: - assert not submit({'tx': spend}), 'should raise an error' + assert not submit(spend), 'should raise an error' except RPCError as e: assert 'scriptsig-size' in str(e), str(e) @@ -206,7 +206,7 @@ def test_secp256k1_condition(inp): 'outputs': [{'amount': 500, 'script': {'condition': ec_cond}}] } signed = sign(spend2) - signed['tx']['inputs'][0]['script']['fulfillment']['publicKey'] = \ + signed['inputs'][0]['script']['fulfillment']['publicKey'] = \ '0275cef12fc5c49be64f5aab3d1fbba08cd7b0d02908b5112fbd8504218d14bc7d' try: assert not submit(signed), 'should raise an error' diff --git a/qa/cryptoconditions/testsupport.py b/qa/cryptoconditions/testsupport.py index 35b7ecdf6..e22520f3f 100644 --- a/qa/cryptoconditions/testsupport.py +++ b/qa/cryptoconditions/testsupport.py @@ -74,8 +74,8 @@ def wait_for_block(height): def sign(tx): signed = hoek.signTxBitcoin({'tx': tx, 'privateKeys': [notary_sk]}) - signed = hoek.signTxEd25519({'tx': signed['tx'], 'privateKeys': [alice_sk, bob_sk]}) - return hoek.signTxSecp256k1({'tx': signed['tx'], 'privateKeys': [notary_sk]}) + signed = hoek.signTxEd25519({'tx': signed, 'privateKeys': [alice_sk, bob_sk]}) + return hoek.signTxSecp256k1({'tx': signed, 'privateKeys': [notary_sk]}) def submit(tx): @@ -95,7 +95,7 @@ def get_fanout_txid(): reward_txid = block['tx'][0] reward_tx_raw = rpc.getrawtransaction(reward_txid) reward_tx = hoek.decodeTx({'hex': reward_tx_raw}) - balance = reward_tx['tx']['outputs'][0]['amount'] + balance = reward_tx['outputs'][0]['amount'] n_outs = 16 remainder = balance - n_outs * 1000 From 4afdbc9556aa92178e56c61f07b4065c4db48842 Mon Sep 17 00:00:00 2001 From: Mihail Fedorov Date: Mon, 26 Feb 2018 02:38:59 +0300 Subject: [PATCH 0541/1062] New final dns names for seeds --- src/assetchains | 2 +- src/chainparams.cpp | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/assetchains b/src/assetchains index 746f0d542..ae21bdfa5 100755 --- a/src/assetchains +++ b/src/assetchains @@ -1,7 +1,7 @@ #!/bin/bash source pubkey.txt args=("$@") -seed_ip=`getent hosts seed.mewhub.com | awk '{ print $1 }'` +seed_ip=`getent hosts zero.kolo.supernet.org | awk '{ print $1 }'` komodo_binary='./komodod' delay=20 diff --git a/src/chainparams.cpp b/src/chainparams.cpp index d84278b31..1630824d7 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -98,8 +98,9 @@ public: assert(genesis.hashMerkleRoot == uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b")); vFixedSeeds.clear(); vSeeds.clear(); - vSeeds.push_back(CDNSSeedData("komodoplatform.com", "seeds.komodoplatform.com")); // @kolo - vSeeds.push_back(CDNSSeedData("komodo.mewhub.com", "seeds.komodo.mewhub.com")); // @kolo + vSeeds.push_back(CDNSSeedData("komodoplatform.com", "seeds.komodoplatform.com")); // @kolo - old static dns seeds + vSeeds.push_back(CDNSSeedData("kolo.supernet.org", "static.kolo.supernet.org")); // @kolo - new static dns seeds ToDo + // vSeeds.push_back(CDNSSeedData("kolo.supernet.org", "dynamic.kolo.supernet.org")); // @kolo - crawler seeds ToDo // TODO: set up bootstrapping for mainnet base58Prefixes[PUBKEY_ADDRESS] = std::vector(1,60); base58Prefixes[SCRIPT_ADDRESS] = std::vector(1,85); From 80ea0d26b01a8cff6f064f9e4b1db09a4effc6b8 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Mon, 26 Feb 2018 02:10:58 -0300 Subject: [PATCH 0542/1062] latest cryptoconditions --- src/cryptoconditions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cryptoconditions b/src/cryptoconditions index 863d92661..9ba2d4545 160000 --- a/src/cryptoconditions +++ b/src/cryptoconditions @@ -1 +1 @@ -Subproject commit 863d9266141667b469a6574ce7285134665427c6 +Subproject commit 9ba2d454564c3bb31446a2a2d1db8cb992e6cbe0 From 94ee86f05682a7c95353106cbcf565cdb5ab23bd Mon Sep 17 00:00:00 2001 From: Mihail Fedorov Date: Mon, 26 Feb 2018 08:30:14 +0300 Subject: [PATCH 0543/1062] New docker file test --- Dockerfile | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 71136b3af..a549bce4b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,13 @@ -FROM kolobus/ubuntu:komodo -MAINTAINER Mihail Fedorov +FROM ubuntu:16.04 +MAINTAINER Mihail Fedorov + +RUN apt-get -y update && \ + apt-get -y upgrade && \ + apt-get -y install build-essential pkg-config libc6-dev m4 g++-multilib autoconf libtool ncurses-dev \ + unzip python zlib1g-dev wget bsdmainutils automake libboost-all-dev libssl-dev libprotobuf-dev \ + protobuf-compiler libqrencode-dev libdb++-dev software-properties-common libcurl4-openssl-dev && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* ADD ./ /komodo ENV HOME /komodo From b26a0857dcb67a494d6c860b1f5717736fc954fe Mon Sep 17 00:00:00 2001 From: Mihail Fedorov Date: Mon, 26 Feb 2018 08:50:39 +0300 Subject: [PATCH 0544/1062] sleepless --- Dockerfile | 2 +- src/chainparams.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index a549bce4b..92b0b779c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,7 +4,7 @@ MAINTAINER Mihail Fedorov RUN apt-get -y update && \ apt-get -y upgrade && \ apt-get -y install build-essential pkg-config libc6-dev m4 g++-multilib autoconf libtool ncurses-dev \ - unzip python zlib1g-dev wget bsdmainutils automake libboost-all-dev libssl-dev libprotobuf-dev \ + unzip python zlib1g-dev wget bsdmainutils automake libssl-dev libprotobuf-dev \ protobuf-compiler libqrencode-dev libdb++-dev software-properties-common libcurl4-openssl-dev && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 1630824d7..0f3861040 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -100,7 +100,7 @@ public: vSeeds.clear(); vSeeds.push_back(CDNSSeedData("komodoplatform.com", "seeds.komodoplatform.com")); // @kolo - old static dns seeds vSeeds.push_back(CDNSSeedData("kolo.supernet.org", "static.kolo.supernet.org")); // @kolo - new static dns seeds ToDo - // vSeeds.push_back(CDNSSeedData("kolo.supernet.org", "dynamic.kolo.supernet.org")); // @kolo - crawler seeds ToDo + vSeeds.push_back(CDNSSeedData("kolo.supernet.org", "dynamic.kolo.supernet.org")); // @kolo - crawler seeds ToDo // TODO: set up bootstrapping for mainnet base58Prefixes[PUBKEY_ADDRESS] = std::vector(1,60); base58Prefixes[SCRIPT_ADDRESS] = std::vector(1,85); From b56e224002eca7d8aed1af8481d70b7fc1109687 Mon Sep 17 00:00:00 2001 From: Mihail Fedorov Date: Mon, 26 Feb 2018 09:47:59 +0300 Subject: [PATCH 0545/1062] Adding coin in single commit --- src/assetchains | 1 + src/assetchains.old | 1 + src/dpowassets | 2 +- src/fiat-cli | 1 + src/fiat/ninja | 2 ++ 5 files changed, 6 insertions(+), 1 deletion(-) create mode 100755 src/fiat/ninja diff --git a/src/assetchains b/src/assetchains index ae21bdfa5..ba5dcca18 100755 --- a/src/assetchains +++ b/src/assetchains @@ -50,3 +50,4 @@ komodo_asset BTCH 20998641 komodo_asset VOTE2018 600000000 komodo_asset PIZZA 100000000 komodo_asset BEER 100000000 +komodo_asset NINJA 100000000 diff --git a/src/assetchains.old b/src/assetchains.old index ab3c152b8..030a69ebf 100755 --- a/src/assetchains.old +++ b/src/assetchains.old @@ -27,6 +27,7 @@ echo $pubkey ./komodod -pubkey=$pubkey -ac_name=VOTE2018 -ac_supply=600000000 -addnode=78.47.196.146 & ./komodod -pubkey=$pubkey -ac_name=BEER -ac_supply=100000000 -addnode=24.54.206.138 & ./komodod -pubkey=$pubkey -ac_name=PIZZA -ac_supply=100000000 -addnode=24.54.206.138 & +./komodod -pubkey=$pubkey -ac_name=NINJA -ac_supply=100000000 -addnode=192.241.134.19 & #sleep $delay #./komodod -pubkey=$pubkey -ac_name=USD -addnode=78.47.196.146 $1 & diff --git a/src/dpowassets b/src/dpowassets index 81cb5b68e..4a75bbce7 100755 --- a/src/dpowassets +++ b/src/dpowassets @@ -28,7 +28,7 @@ curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dp curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"BTCH\",\"pubkey\":\"$pubkey\"}" #curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CHAIN\",\"pubkey\":\"$pubkey\"}" curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"VOTE2018\",\"pubkey\":\"$pubkey\"}" - +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"NINJA\",\"pubkey\":\"$pubkey\"}" #curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"USD\",\"pubkey\":\"$pubkey\"}" #curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"EUR\",\"pubkey\":\"$pubkey\"}" diff --git a/src/fiat-cli b/src/fiat-cli index d9cc68ff5..9e50deda7 100755 --- a/src/fiat-cli +++ b/src/fiat-cli @@ -23,3 +23,4 @@ echo btch; fiat/btch $1 $2 $3 $4 echo pizza; fiat/pizza $1 $2 $3 $4 echo beer; fiat/beer $1 $2 $3 $4 echo vote2018; fiat/vote2018 $1 $2 $3 $4 +echo ninja; fiat/ninja $1 $2 $3 $4 diff --git a/src/fiat/ninja b/src/fiat/ninja new file mode 100755 index 000000000..f7722abb0 --- /dev/null +++ b/src/fiat/ninja @@ -0,0 +1,2 @@ +#!/bin/bash +./komodo-cli -ac_name=NINJA $1 $2 $3 $4 $5 $6 From 427e5fae3f03f28940be20d9bb7ca7134367bf52 Mon Sep 17 00:00:00 2001 From: "Jonathan \"Duke\" Leto" Date: Mon, 26 Feb 2018 10:47:59 -0800 Subject: [PATCH 0546/1062] Fix references to Bitcoin in RPC tests readme --- qa/rpc-tests/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qa/rpc-tests/README.md b/qa/rpc-tests/README.md index cfda8fe91..3bc64eec6 100644 --- a/qa/rpc-tests/README.md +++ b/qa/rpc-tests/README.md @@ -36,7 +36,7 @@ If you set the environment variable `PYTHON_DEBUG=1` you will get some debug out A 200-block -regtest blockchain and wallets for four nodes is created the first time a regression test is run and is stored in the cache/ directory. Each node has 25 mature -blocks (25*50=1250 BTC) in its wallet. +blocks (25*50=1250 ZEC) in its wallet. After the first run, the cache/ blockchain and wallets are copied into a temporary directory and used as the initial @@ -47,5 +47,5 @@ to recover with: ```bash rm -rf cache -killall bitcoind +killall zcashd ``` From 704b76358d2e22563f16201b9f3ca6914a861046 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Mon, 26 Feb 2018 20:51:10 +0000 Subject: [PATCH 0547/1062] Use block hash comparison for consistency check when loading block index The Equihash check caused block index loading to take around 38x longer. However, we don't need to check it directly, as the only paths to writing a block header to disk already go through a proof-of-work check (e.g. receiving a block over the network). By forcing the block header inside the CBlockIndex to be re-serialized, we retain the benefits of the consistency check without the overhead at startup. Co-authored-by: Brad Miller --- src/txdb.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/txdb.cpp b/src/txdb.cpp index 26f0814a7..00585c6a0 100644 --- a/src/txdb.cpp +++ b/src/txdb.cpp @@ -314,9 +314,11 @@ bool CBlockTreeDB::LoadBlockIndexGuts() pindexNew->nTx = diskindex.nTx; pindexNew->nSproutValue = diskindex.nSproutValue; + // Consistency checks auto header = pindexNew->GetBlockHeader(); - if (!CheckEquihashSolution(&header, Params())) - return error("LoadBlockIndex(): CheckEquihashSolution failed: %s", pindexNew->ToString()); + if (header.GetHash() != pindexNew->GetBlockHash()) + return error("LoadBlockIndex(): block header inconsistency detected: on-disk = %s, in-memory = %s", + diskindex.ToString(), pindexNew->ToString()); if (!CheckProofOfWork(pindexNew->GetBlockHash(), pindexNew->nBits, Params().GetConsensus())) return error("LoadBlockIndex(): CheckProofOfWork failed: %s", pindexNew->ToString()); From 2cd576089f1e04ea552ae5eb49671566dbab503b Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Feb 2018 18:10:44 +0200 Subject: [PATCH 0548/1062] Separate port range for mined --- src/komodo_utils.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/komodo_utils.h b/src/komodo_utils.h index 8db610e5d..418a3225d 100644 --- a/src/komodo_utils.h +++ b/src/komodo_utils.h @@ -1455,11 +1455,13 @@ uint32_t komodo_assetmagic(char *symbol,uint64_t supply,uint8_t *extraptr,int32_ return(shortflag); }*/ -uint16_t komodo_assetport(uint32_t magic) +uint16_t komodo_assetport(uint32_t magic,int32_t extralen) { if ( magic == 0x8de4eef9 ) return(7770); - else return(8000 + (magic % 7777)); + else if ( extralen == 0 ) + return(8000 + (magic % 7777)); + else return(16000 + (magic % 49500)); } uint16_t komodo_port(char *symbol,uint64_t supply,uint32_t *magicp,uint8_t *extraptr,int32_t extralen) @@ -1470,7 +1472,7 @@ uint16_t komodo_port(char *symbol,uint64_t supply,uint32_t *magicp,uint8_t *extr return(7770); } *magicp = komodo_assetmagic(symbol,supply,extraptr,extralen); - return(komodo_assetport(*magicp)); + return(komodo_assetport(*magicp,extralen)); } /*void komodo_ports(uint16_t ports[MAX_CURRENCIES]) From 9db57a0eb3876a9883784ad306109592ce2c27a1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Feb 2018 18:11:11 +0200 Subject: [PATCH 0549/1062] Test --- src/komodo_utils.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/komodo_utils.h b/src/komodo_utils.h index 8db610e5d..418a3225d 100644 --- a/src/komodo_utils.h +++ b/src/komodo_utils.h @@ -1455,11 +1455,13 @@ uint32_t komodo_assetmagic(char *symbol,uint64_t supply,uint8_t *extraptr,int32_ return(shortflag); }*/ -uint16_t komodo_assetport(uint32_t magic) +uint16_t komodo_assetport(uint32_t magic,int32_t extralen) { if ( magic == 0x8de4eef9 ) return(7770); - else return(8000 + (magic % 7777)); + else if ( extralen == 0 ) + return(8000 + (magic % 7777)); + else return(16000 + (magic % 49500)); } uint16_t komodo_port(char *symbol,uint64_t supply,uint32_t *magicp,uint8_t *extraptr,int32_t extralen) @@ -1470,7 +1472,7 @@ uint16_t komodo_port(char *symbol,uint64_t supply,uint32_t *magicp,uint8_t *extr return(7770); } *magicp = komodo_assetmagic(symbol,supply,extraptr,extralen); - return(komodo_assetport(*magicp)); + return(komodo_assetport(*magicp,extralen)); } /*void komodo_ports(uint16_t ports[MAX_CURRENCIES]) From 95c463966ae35231a49f708c0b8465360de4b4de Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Feb 2018 22:25:37 +0200 Subject: [PATCH 0550/1062] Dont create .conf from cli --- src/bitcoin-cli.cpp | 1 + src/komodo_utils.h | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/src/bitcoin-cli.cpp b/src/bitcoin-cli.cpp index cac650a00..253c49366 100644 --- a/src/bitcoin-cli.cpp +++ b/src/bitcoin-cli.cpp @@ -65,6 +65,7 @@ public: }; +#define FROM_CLI #include "uint256.h" #include "arith_uint256.h" diff --git a/src/komodo_utils.h b/src/komodo_utils.h index 418a3225d..4b0521498 100644 --- a/src/komodo_utils.h +++ b/src/komodo_utils.h @@ -1362,12 +1362,14 @@ void komodo_configfile(char *symbol,uint16_t port) #endif if ( (fp= fopen(fname,"rb")) == 0 ) { +#ifndef FROM_CLI if ( (fp= fopen(fname,"wb")) != 0 ) { fprintf(fp,"rpcuser=user%u\nrpcpassword=pass%s\nrpcport=%u\nserver=1\ntxindex=1\nrpcworkqueue=64\n",crc,password,port); fclose(fp); printf("Created (%s)\n",fname); } else printf("Couldnt create (%s)\n",fname); +#endif } else { @@ -1619,6 +1621,7 @@ void komodo_args(char *argv0) for (i=0; i<4; i++) sprintf(&magicstr[i<<1],"%02x",magic[i]); magicstr[8] = 0; +#ifndef FROM_CLI sprintf(fname,"gen%s",ASSETCHAINS_SYMBOL); if ( (fp= fopen(fname,"wb")) != 0 ) { @@ -1626,6 +1629,7 @@ void komodo_args(char *argv0) fclose(fp); //printf("created (%s)\n",fname); } else printf("error creating (%s)\n",fname); +#endif } else { From 138cf7700457b08ad7993c40d26da2f425387daf Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 27 Feb 2018 00:05:09 +0000 Subject: [PATCH 0551/1062] Overwinter release notes and testnet activation height Closes #2957. --- doc/release-notes.md | 43 +++++++++++++++++++++++++++++++++++++++++-- src/chainparams.cpp | 3 +-- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/doc/release-notes.md b/doc/release-notes.md index 451a6f96d..c07ab3d9f 100644 --- a/doc/release-notes.md +++ b/doc/release-notes.md @@ -4,6 +4,41 @@ release-notes at release time) Notable changes =============== +Overwinter network upgrade +-------------------------- + +The code preparations for the Overwinter network upgrade, as described in [ZIP +200](https://github.com/zcash/zips/blob/master/zip-0200.rst), [ZIP +201](https://github.com/zcash/zips/blob/master/zip-0201.rst), [ZIP +202](https://github.com/zcash/zips/blob/master/zip-0202.rst), [ZIP +203](https://github.com/zcash/zips/blob/master/zip-0203.rst), and [ZIP +143](https://github.com/zcash/zips/blob/master/zip-0143.rst) are +finished and included in this release. Overwinter will activate on testnet at +height 207500, and can also be activated at a specific height in regtest mode +by setting the config option `-nuparams=5ba81b19:HEIGHT`. + +However, because the Overwinter activation height is not yet specified for +mainnet, version 1.0.15 will behave similarly as other pre-Overwinter releases +even after a future activation of Overwinter on the network. Upgrading from +1.0.15 will be required in order to follow the Overwinter network upgrade on +mainnet. + +Overwinter transaction format +----------------------------- + +Once Overwinter has activated, transactions must use the new v3 format +(including coinbase transactions). All RPC methods that create new transactions +(such as `createrawtransaction` and `getblocktemplate`) will create v3 +transactions once the Overwinter activation height has been reached. + +Overwinter transaction expiry +----------------------------- + +Overwinter transactions created by `zcashd` will also have a default expiry +height set (the block height after which the transaction becomes invalid) of 20 +blocks after the height of the next block. This can be configured with the +config option `-txexpirydelta`. + UTXO and note merging --------------------- @@ -24,6 +59,10 @@ merging until the number of UTXOs falls below some value). UTXO memory accounting ---------------------- -The default -dbcache has been changed in this release to 450MiB. Users can set -dbcache to a higher value (e.g. to keep the UTXO set more fully cached in memory). Users on low-memory systems (such as systems with 1GB or less) should consider specifying a lower value for this parameter. +The default `-dbcache` has been changed in this release to 450MiB. Users can set +`-dbcache` to a higher value (e.g. to keep the UTXO set more fully cached in +memory). Users on low-memory systems (such as systems with 1GB or less) should +consider specifying a lower value for this parameter. -Additional information relating to running on low-memory systems can be found here: [reducing-memory-usage.md](https://github.com/zcash/zcash/blob/master/doc/reducing-memory-usage.md). +Additional information relating to running on low-memory systems can be found +here: [reducing-memory-usage.md](https://github.com/zcash/zcash/blob/master/doc/reducing-memory-usage.md). diff --git a/src/chainparams.cpp b/src/chainparams.cpp index f11d53460..407296824 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -263,8 +263,7 @@ public: consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nActivationHeight = Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT; consensus.vUpgrades[Consensus::UPGRADE_OVERWINTER].nProtocolVersion = 170003; - consensus.vUpgrades[Consensus::UPGRADE_OVERWINTER].nActivationHeight = - Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT; + consensus.vUpgrades[Consensus::UPGRADE_OVERWINTER].nActivationHeight = 207500; pchMessageStart[0] = 0xfa; pchMessageStart[1] = 0x1a; From 1d6f7acf4d86c242a78a24f21f31b6cd0b8f52af Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 28 Feb 2018 16:44:07 +0000 Subject: [PATCH 0552/1062] make-release.py: Versioning changes for 1.0.15. --- README.md | 2 +- configure.ac | 2 +- contrib/gitian-descriptors/gitian-linux.yml | 2 +- src/clientversion.h | 2 +- src/deprecation.h | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 499035161..586ca76b4 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Zcash 1.0.15-rc1 +Zcash 1.0.15 ============= What is Zcash? diff --git a/configure.ac b/configure.ac index 3028dc6e5..86b3fdd30 100644 --- a/configure.ac +++ b/configure.ac @@ -3,7 +3,7 @@ AC_PREREQ([2.60]) define(_CLIENT_VERSION_MAJOR, 1) define(_CLIENT_VERSION_MINOR, 0) define(_CLIENT_VERSION_REVISION, 15) -define(_CLIENT_VERSION_BUILD, 25) +define(_CLIENT_VERSION_BUILD, 50) define(_ZC_BUILD_VAL, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, m4_incr(_CLIENT_VERSION_BUILD), m4_eval(_CLIENT_VERSION_BUILD < 50), 1, m4_eval(_CLIENT_VERSION_BUILD - 24), m4_eval(_CLIENT_VERSION_BUILD == 50), 1, , m4_eval(_CLIENT_VERSION_BUILD - 50))) define(_CLIENT_VERSION_SUFFIX, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, _CLIENT_VERSION_REVISION-beta$1, m4_eval(_CLIENT_VERSION_BUILD < 50), 1, _CLIENT_VERSION_REVISION-rc$1, m4_eval(_CLIENT_VERSION_BUILD == 50), 1, _CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION-$1))) define(_CLIENT_VERSION_IS_RELEASE, true) diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml index e10d4585f..de9e405e1 100644 --- a/contrib/gitian-descriptors/gitian-linux.yml +++ b/contrib/gitian-descriptors/gitian-linux.yml @@ -1,5 +1,5 @@ --- -name: "zcash-1.0.15-rc1" +name: "zcash-1.0.15" enable_cache: true distro: "debian" suites: diff --git a/src/clientversion.h b/src/clientversion.h index 4182b7084..393eef40a 100644 --- a/src/clientversion.h +++ b/src/clientversion.h @@ -18,7 +18,7 @@ #define CLIENT_VERSION_MAJOR 1 #define CLIENT_VERSION_MINOR 0 #define CLIENT_VERSION_REVISION 15 -#define CLIENT_VERSION_BUILD 25 +#define CLIENT_VERSION_BUILD 50 //! Set to true for release, false for prerelease or test build #define CLIENT_VERSION_IS_RELEASE true diff --git a/src/deprecation.h b/src/deprecation.h index 6678e4969..3e361cab7 100644 --- a/src/deprecation.h +++ b/src/deprecation.h @@ -8,7 +8,7 @@ // Deprecation policy: // * Shut down 16 weeks' worth of blocks after the estimated release block height. // * A warning is shown during the 2 weeks' worth of blocks prior to shut down. -static const int APPROX_RELEASE_HEIGHT = 277725; +static const int APPROX_RELEASE_HEIGHT = 280300; static const int WEEKS_UNTIL_DEPRECATION = 16; static const int DEPRECATION_HEIGHT = APPROX_RELEASE_HEIGHT + (WEEKS_UNTIL_DEPRECATION * 7 * 24 * 24); From f58b1536b4dc7526fa92608b310f4733404656fc Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 28 Feb 2018 16:58:10 +0000 Subject: [PATCH 0553/1062] make-release.py: Updated manpages for 1.0.15. --- doc/man/zcash-cli.1 | 6 +++--- doc/man/zcash-tx.1 | 6 +++--- doc/man/zcashd.1 | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/doc/man/zcash-cli.1 b/doc/man/zcash-cli.1 index d67fbeac4..a30af6fe6 100644 --- a/doc/man/zcash-cli.1 +++ b/doc/man/zcash-cli.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASH-CLI "1" "February 2018" "zcash-cli v1.0.15-rc1" "User Commands" +.TH ZCASH-CLI "1" "February 2018" "zcash-cli v1.0.15" "User Commands" .SH NAME -zcash-cli \- manual page for zcash-cli v1.0.15-rc1 +zcash-cli \- manual page for zcash-cli v1.0.15 .SH DESCRIPTION -Zcash RPC client version v1.0.15\-rc1 +Zcash RPC client version v1.0.15 .PP In order to ensure you are adequately protecting your privacy when using Zcash, please see . diff --git a/doc/man/zcash-tx.1 b/doc/man/zcash-tx.1 index 5dc42af77..f5830e6de 100644 --- a/doc/man/zcash-tx.1 +++ b/doc/man/zcash-tx.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASH-TX "1" "February 2018" "zcash-tx v1.0.15-rc1" "User Commands" +.TH ZCASH-TX "1" "February 2018" "zcash-tx v1.0.15" "User Commands" .SH NAME -zcash-tx \- manual page for zcash-tx v1.0.15-rc1 +zcash-tx \- manual page for zcash-tx v1.0.15 .SH DESCRIPTION -Zcash zcash\-tx utility version v1.0.15\-rc1 +Zcash zcash\-tx utility version v1.0.15 .SS "Usage:" .TP zcash\-tx [options] [commands] diff --git a/doc/man/zcashd.1 b/doc/man/zcashd.1 index 6bfa1ae28..eaef634c0 100644 --- a/doc/man/zcashd.1 +++ b/doc/man/zcashd.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH ZCASHD "1" "February 2018" "zcashd v1.0.15-rc1" "User Commands" +.TH ZCASHD "1" "February 2018" "zcashd v1.0.15" "User Commands" .SH NAME -zcashd \- manual page for zcashd v1.0.15-rc1 +zcashd \- manual page for zcashd v1.0.15 .SH DESCRIPTION -Zcash Daemon version v1.0.15\-rc1 +Zcash Daemon version v1.0.15 .PP In order to ensure you are adequately protecting your privacy when using Zcash, please see . @@ -54,7 +54,7 @@ Specify data directory \fB\-disabledeprecation=\fR .IP Disable block\-height node deprecation and automatic shutdown (example: -\fB\-disabledeprecation\fR=\fI\,1\/\fR.0.15\-rc1) +\fB\-disabledeprecation\fR=\fI\,1\/\fR.0.15) .HP \fB\-exportdir=\fR .IP From 25b080a33ba1ed6dab06493d372f871a29d53f9b Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 28 Feb 2018 16:58:19 +0000 Subject: [PATCH 0554/1062] make-release.py: Updated release notes and changelog for 1.0.15. --- contrib/debian/changelog | 6 + doc/authors.md | 32 ++-- doc/release-notes.md | 62 ------- doc/release-notes/release-notes-1.0.15.md | 209 ++++++++++++++++++++++ 4 files changed, 236 insertions(+), 73 deletions(-) create mode 100644 doc/release-notes/release-notes-1.0.15.md diff --git a/contrib/debian/changelog b/contrib/debian/changelog index d29b0967e..c0b1d157f 100644 --- a/contrib/debian/changelog +++ b/contrib/debian/changelog @@ -1,3 +1,9 @@ +zcash (1.0.15) stable; urgency=medium + + * 1.0.15 release. + + -- Zcash Company Wed, 28 Feb 2018 16:58:19 +0000 + zcash (1.0.15~rc1) stable; urgency=medium * 1.0.15-rc1 release. diff --git a/doc/authors.md b/doc/authors.md index e576a5e2c..8f249b1c0 100644 --- a/doc/authors.md +++ b/doc/authors.md @@ -1,21 +1,22 @@ Zcash Contributors ================== -Jack Grigg (558) -Simon Liu (286) +Jack Grigg (601) +Simon Liu (297) Sean Bowe (193) Daira Hopwood (102) Wladimir J. van der Laan (71) Taylor Hornby (65) +Jay Graber (61) Nathan Wilcox (56) -Jay Graber (53) Jonas Schnelli (49) Kevin Gallagher (38) -Cory Fields (28) -Pieter Wuille (16) -syd (13) +Cory Fields (30) +Pieter Wuille (24) +syd (15) nomnombtc (9) Paige Peterson (9) +Matt Corallo (9) fanquake (8) MarcoFalke (7) Luke Dashjr (6) @@ -26,14 +27,16 @@ kozyilmaz (4) Philip Kaufmann (4) Peter Todd (4) Patrick Strateman (4) -Matt Corallo (4) Karl-Johan Alm (4) +Jorge Timón (4) Jeff Garzik (4) David Mercer (4) Daniel Cousens (4) lpescher (3) +Suhas Daftuar (3) Pavel Janík (3) João Barbosa (3) +Ariel (3) Alfie John (3) str4d (2) paveljanik (2) @@ -42,11 +45,13 @@ aniemerg (2) Scott (2) Robert C. Seacord (2) Per Grön (2) +Pavel Vasin (2) Joe Turgeon (2) Jason Davies (2) Jack Gavigan (2) ITH4Coinomia (2) Gavin Andresen (2) +Daniel Kraft (2) Bjorn Hjortsberg (2) Amgad Abdelhafez (2) zathras-crypto (1) @@ -55,6 +60,7 @@ practicalswift (1) mruddy (1) mrbandrews (1) kazcw (1) +jc (1) isle2983 (1) instagibbs (1) emilrus (1) @@ -67,18 +73,21 @@ Stephen (1) S. Matthew English (1) Ross Nicoll (1) René Nyffenegger (1) -Pavel Vasin (1) Paul Georgiou (1) Paragon Initiative Enterprises, LLC (1) +Nicolas DORIER (1) Nathaniel Mahieu (1) Murilo Santana (1) +Maxwell Gubler (1) Matt Quinn (1) +Mark Friedenbach (1) +Marius Kjærstad (1) Louis Nyffenegger (1) Leo Arias (1) Lars-Magnus Skog (1) Kevin Pan (1) -Jorge Timón (1) Jonathan "Duke" Leto (1) +Jonas Nick (1) Jeffrey Walton (1) Ian Kelling (1) Gaurav Rana (1) @@ -87,7 +96,6 @@ Florian Schmaus (1) Ethan Heilman (1) Eran Tromer (1) Duke Leto (1) -Daniel Kraft (1) Christian von Roques (1) Chirag Davé (1) Casey Rodarmor (1) @@ -97,11 +105,13 @@ Bruno Arueira (1) Boris Hajduk (1) Bob McElrath (1) Bitcoin Error Log (1) -Ariel (1) +Ashley Holman (1) Anthony Towns (1) Allan Niemerg (1) Alex van der Peet (1) +Alex Morcos (1) Alex (1) Adam Weiss (1) Adam Brown (1) 4ZEC (1) +21E14 (1) diff --git a/doc/release-notes.md b/doc/release-notes.md index c07ab3d9f..a29094b51 100644 --- a/doc/release-notes.md +++ b/doc/release-notes.md @@ -4,65 +4,3 @@ release-notes at release time) Notable changes =============== -Overwinter network upgrade --------------------------- - -The code preparations for the Overwinter network upgrade, as described in [ZIP -200](https://github.com/zcash/zips/blob/master/zip-0200.rst), [ZIP -201](https://github.com/zcash/zips/blob/master/zip-0201.rst), [ZIP -202](https://github.com/zcash/zips/blob/master/zip-0202.rst), [ZIP -203](https://github.com/zcash/zips/blob/master/zip-0203.rst), and [ZIP -143](https://github.com/zcash/zips/blob/master/zip-0143.rst) are -finished and included in this release. Overwinter will activate on testnet at -height 207500, and can also be activated at a specific height in regtest mode -by setting the config option `-nuparams=5ba81b19:HEIGHT`. - -However, because the Overwinter activation height is not yet specified for -mainnet, version 1.0.15 will behave similarly as other pre-Overwinter releases -even after a future activation of Overwinter on the network. Upgrading from -1.0.15 will be required in order to follow the Overwinter network upgrade on -mainnet. - -Overwinter transaction format ------------------------------ - -Once Overwinter has activated, transactions must use the new v3 format -(including coinbase transactions). All RPC methods that create new transactions -(such as `createrawtransaction` and `getblocktemplate`) will create v3 -transactions once the Overwinter activation height has been reached. - -Overwinter transaction expiry ------------------------------ - -Overwinter transactions created by `zcashd` will also have a default expiry -height set (the block height after which the transaction becomes invalid) of 20 -blocks after the height of the next block. This can be configured with the -config option `-txexpirydelta`. - -UTXO and note merging ---------------------- - -In order to simplify the process of combining many small UTXOs and notes into a -few larger ones, a new RPC method `z_mergetoaddress` has been added. It merges -funds from t-addresses, z-addresses, or both, and sends them to a single -t-address or z-address. - -Unlike most other RPC methods, `z_mergetoaddress` operates over a particular -quantity of UTXOs and notes, instead of a particular amount of ZEC. By default, -it will merge 50 UTXOs and 10 notes at a time; these limits can be adjusted with -the parameters `transparent_limit` and `shielded_limit`. - -`z_mergetoaddress` also returns the number of UTXOs and notes remaining in the -given addresses, which can be used to automate the merging process (for example, -merging until the number of UTXOs falls below some value). - -UTXO memory accounting ----------------------- - -The default `-dbcache` has been changed in this release to 450MiB. Users can set -`-dbcache` to a higher value (e.g. to keep the UTXO set more fully cached in -memory). Users on low-memory systems (such as systems with 1GB or less) should -consider specifying a lower value for this parameter. - -Additional information relating to running on low-memory systems can be found -here: [reducing-memory-usage.md](https://github.com/zcash/zcash/blob/master/doc/reducing-memory-usage.md). diff --git a/doc/release-notes/release-notes-1.0.15.md b/doc/release-notes/release-notes-1.0.15.md new file mode 100644 index 000000000..3195c955a --- /dev/null +++ b/doc/release-notes/release-notes-1.0.15.md @@ -0,0 +1,209 @@ +Notable changes +=============== + +Overwinter network upgrade +-------------------------- + +The code preparations for the Overwinter network upgrade, as described in [ZIP +200](https://github.com/zcash/zips/blob/master/zip-0200.rst), [ZIP +201](https://github.com/zcash/zips/blob/master/zip-0201.rst), [ZIP +202](https://github.com/zcash/zips/blob/master/zip-0202.rst), [ZIP +203](https://github.com/zcash/zips/blob/master/zip-0203.rst), and [ZIP +143](https://github.com/zcash/zips/blob/master/zip-0143.rst) are +finished and included in this release. Overwinter will activate on testnet at +height 207500, and can also be activated at a specific height in regtest mode +by setting the config option `-nuparams=5ba81b19:HEIGHT`. + +However, because the Overwinter activation height is not yet specified for +mainnet, version 1.0.15 will behave similarly as other pre-Overwinter releases +even after a future activation of Overwinter on the network. Upgrading from +1.0.15 will be required in order to follow the Overwinter network upgrade on +mainnet. + +Overwinter transaction format +----------------------------- + +Once Overwinter has activated, transactions must use the new v3 format +(including coinbase transactions). All RPC methods that create new transactions +(such as `createrawtransaction` and `getblocktemplate`) will create v3 +transactions once the Overwinter activation height has been reached. + +Overwinter transaction expiry +----------------------------- + +Overwinter transactions created by `zcashd` will also have a default expiry +height set (the block height after which the transaction becomes invalid) of 20 +blocks after the height of the next block. This can be configured with the +config option `-txexpirydelta`. + +UTXO and note merging +--------------------- + +In order to simplify the process of combining many small UTXOs and notes into a +few larger ones, a new RPC method `z_mergetoaddress` has been added. It merges +funds from t-addresses, z-addresses, or both, and sends them to a single +t-address or z-address. + +Unlike most other RPC methods, `z_mergetoaddress` operates over a particular +quantity of UTXOs and notes, instead of a particular amount of ZEC. By default, +it will merge 50 UTXOs and 10 notes at a time; these limits can be adjusted with +the parameters `transparent_limit` and `shielded_limit`. + +`z_mergetoaddress` also returns the number of UTXOs and notes remaining in the +given addresses, which can be used to automate the merging process (for example, +merging until the number of UTXOs falls below some value). + +UTXO memory accounting +---------------------- + +The default `-dbcache` has been changed in this release to 450MiB. Users can set +`-dbcache` to a higher value (e.g. to keep the UTXO set more fully cached in +memory). Users on low-memory systems (such as systems with 1GB or less) should +consider specifying a lower value for this parameter. + +Additional information relating to running on low-memory systems can be found +here: [reducing-memory-usage.md](https://github.com/zcash/zcash/blob/master/doc/reducing-memory-usage.md). + +Changelog +========= + +21E14 (1): + Remove obsolete reference to CValidationState from UpdateCoins. + +Alex Morcos (1): + Implement helper class for CTxMemPoolEntry constructor + +Ariel (2): + add blake2b writer + update SignatureHash according to Overwinter spec + +Ashley Holman (1): + TxMemPool: Change mapTx to a boost::multi_index_container + +Cory Fields (2): + chainparams: move CCheckpointData into chainparams.h + chainparams: don't use std namespace + +Daniel Kraft (1): + Clean up chainparams some more. + +Jack Grigg (43): + Scope the ECDSA constant sizes to CPubKey / CKey classes + Enable Bash completion for -exportdir + Check chainValueZat when checking value pool monitoring + Add missing namespace for boost::get + Add viewing key prefix to regtest parameters + zkey_import_export: Synchronize mempools before mining + Use JoinSplitTestingSetup for Boost sighash tests + Network upgrade activation mechanism + Allow changing network upgrade parameters on regtest + Test network upgrade logic + Adjust rewind logic to use the network upgrade mechanism + Add Overwinter to upgrade list + Add method for fetching the next activation height after a given block height + Use a boost::optional for nCachedBranchId + Change UI/log status message for block rewinding + Update quote from ZIP 200 + Update SignatureHash tests for transaction format changes + Implement roll-back limit for reorganisation + Add rollback limit to block index rewinding + Remove mempool transactions which commit to an unmineable branch ID + Remove P2WPKH and P2WSH from signing logic + Add consensus branch ID parameter to SignatureHash, remove SigVersion parameter + Cleanup: Wrap function arguments + Regenerate SignatureHash tests + Make number of inputs configurable in validatelargetx test + Use v3 transactions with caching for validatelargetx benchmark + Extend CWallet::GetFilteredNotes to enable filtering on a set of addresses + Add branch IDs for current and next block to getblockchaininfo + Check Equihash solution when loading block index + Implement z_mergetoaddress for combining UTXOs and notes + Gate z_mergetoaddress as an experimental feature + Add z_mergetoaddress to release notes + Check upgrade status in wallet_overwintertx RPC test + Document that consensus.chaintip != consensus.nextblock just before an upgrade + Regenerate sighash tests + wallet_mergetoaddress: Add additional syncs to prevent race conditions + make-release.py: Versioning changes for 1.0.15-rc1. + make-release.py: Updated manpages for 1.0.15-rc1. + make-release.py: Updated release notes and changelog for 1.0.15-rc1. + Use block hash comparison for consistency check when loading block index + Overwinter release notes and testnet activation height + make-release.py: Versioning changes for 1.0.15. + make-release.py: Updated manpages for 1.0.15. + +Jay Graber (8): + Add getdeprecationinfo rpc call to return current version and deprecation block height. + Make applicable only on mainnet + Add upgrades field to RPC call getblockchaininfo + Implement transaction expiry for Overwinter + Add -txexpirydelta cli option + Add mempool_tx_expiry.py test + Add expiry to z_mergetoaddress + Change rpc_tests to 21 + +Jonas Nick (1): + Reduce unnecessary hashing in signrawtransaction + +Jorge Timón (3): + Chainparams: Introduce CreateGenesisBlock() static function + Chainparams: CTestNetParams and CRegTestParams extend directly from CChainParams + Mempool: Use Consensus::CheckTxInputs direclty over main::CheckInputs + +Marius Kjærstad (1): + Changed http:// to https:// on some links + +Mark Friedenbach (1): + Explicitly set tx.nVersion for the genesis block and mining tests + +Matt Corallo (5): + Add failing test checking timelocked-txn removal during reorg + Fix removal of time-locked transactions during reorg + Fix comment in removeForReorg + Make indentation in ActivateBestChainStep readable + removeForReorg calls once-per-disconnect-> once-per-reorg + +Maxwell Gubler (1): + Fix syntax examples for z_importwallet and export + +Nicolas DORIER (1): + Unit test for sighash caching + +Pavel Vasin (1): + remove unused NOBLKS_VERSION_{START,END} constants + +Pieter Wuille (8): + Add rewind logic to deal with post-fork software updates + Support -checkmempool=N, which runs checks on average once every N transactions + Report non-mandatory script failures correctly + Refactor script validation to observe amounts + BIP143: Verification logic + BIP143: Signing logic + Precompute sighashes + Rename to PrecomputedTransactionData + +Simon Liu (11): + Fixes #2793. Backport commit f33afd3 to increase dbcache default. + Add documentation about dbcache. + Add note about dbcache to 1.0.15 release notes. + Remove redundant service flag NODE_GETUTXO meant for Bitcoin XT. + Implementation of Overwinter transaction format ZIP 202. + Add test to check malformed v1 transaction against Overwinter tx parser + Closes #2964. z_sendmany once again makes v1 tx for taddr to taddr. + Closes #2954 and #2959. Fixes Overwinter issues in sighash_tests. + Add field nProtocolVersion to struct NetworkUpgrade. + Overwinter peer management and network handshaking. + Add python qa test overwinter_peer_management. + +Suhas Daftuar (3): + Track coinbase spends in CTxMemPoolEntry + Don't call removeForReorg if DisconnectTip fails + Fix removeForReorg to use MedianTimePast + +jc (1): + read hashReserved from disk block index + +syd (2): + Fix libsnark dependency build. + Remove OSX and Windows files from Makefile + share directory. + From d8399efc03a55cb36ae59fa865f14c40d151ecc1 Mon Sep 17 00:00:00 2001 From: "Jonathan \"Duke\" Leto" Date: Wed, 28 Feb 2018 14:13:07 -0800 Subject: [PATCH 0555/1062] This library seems to not be used at all and all comments mentioning it are ghosts --- qa/rpc-tests/README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/qa/rpc-tests/README.md b/qa/rpc-tests/README.md index 3bc64eec6..3f715e1fe 100644 --- a/qa/rpc-tests/README.md +++ b/qa/rpc-tests/README.md @@ -1,11 +1,6 @@ Regression tests of RPC interface ================================= -### [python-bitcoinrpc](https://github.com/jgarzik/python-bitcoinrpc) -Git subtree of [https://github.com/jgarzik/python-bitcoinrpc](https://github.com/jgarzik/python-bitcoinrpc). -Changes to python-bitcoinrpc should be made upstream, and then -pulled here using git subtree. - ### [test_framework/test_framework.py](test_framework/test_framework.py) Base class for new regression tests. From 62fee1296f21025020e7a7096e139d4f9c87776b Mon Sep 17 00:00:00 2001 From: "Jonathan \"Duke\" Leto" Date: Wed, 28 Feb 2018 14:17:28 -0800 Subject: [PATCH 0556/1062] Update awkward wording about blocks as per @daira --- qa/rpc-tests/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/qa/rpc-tests/README.md b/qa/rpc-tests/README.md index 3f715e1fe..daed1b376 100644 --- a/qa/rpc-tests/README.md +++ b/qa/rpc-tests/README.md @@ -2,7 +2,7 @@ Regression tests of RPC interface ================================= ### [test_framework/test_framework.py](test_framework/test_framework.py) -Base class for new regression tests. +Base class for RPC regression tests. ### [test_framework/util.py](test_framework/util.py) Generally useful functions. @@ -30,8 +30,8 @@ If you set the environment variable `PYTHON_DEBUG=1` you will get some debug out A 200-block -regtest blockchain and wallets for four nodes is created the first time a regression test is run and -is stored in the cache/ directory. Each node has 25 mature -blocks (25*50=1250 ZEC) in its wallet. +is stored in the cache/ directory. Each node has the miner +subsidy from 25 mature blocks (25*50=1250 ZEC) in its wallet. After the first run, the cache/ blockchain and wallets are copied into a temporary directory and used as the initial From 48cecf2ad95e769da8bd096226b78f07781cee8b Mon Sep 17 00:00:00 2001 From: "Jonathan \"Duke\" Leto" Date: Wed, 28 Feb 2018 14:28:22 -0800 Subject: [PATCH 0557/1062] Regtest mining does have a founders reward, a single address t2FwcEhFdNXuFMv1tcYwaBJtYVtMj8b1uTg --- qa/rpc-tests/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qa/rpc-tests/README.md b/qa/rpc-tests/README.md index daed1b376..a0229b56d 100644 --- a/qa/rpc-tests/README.md +++ b/qa/rpc-tests/README.md @@ -31,7 +31,7 @@ If you set the environment variable `PYTHON_DEBUG=1` you will get some debug out A 200-block -regtest blockchain and wallets for four nodes is created the first time a regression test is run and is stored in the cache/ directory. Each node has the miner -subsidy from 25 mature blocks (25*50=1250 ZEC) in its wallet. +subsidy from 25 mature blocks (25*10=250 ZEC) in its wallet. After the first run, the cache/ blockchain and wallets are copied into a temporary directory and used as the initial From 4db87174311a27617ac3eb7936e941566ae25539 Mon Sep 17 00:00:00 2001 From: "Jonathan \"Duke\" Leto" Date: Wed, 28 Feb 2018 14:29:05 -0800 Subject: [PATCH 0558/1062] Fix outdated comment about starting balance of nodes --- qa/rpc-tests/zcjoinsplitdoublespend.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qa/rpc-tests/zcjoinsplitdoublespend.py b/qa/rpc-tests/zcjoinsplitdoublespend.py index b8411c49d..98837b57e 100755 --- a/qa/rpc-tests/zcjoinsplitdoublespend.py +++ b/qa/rpc-tests/zcjoinsplitdoublespend.py @@ -40,7 +40,7 @@ class JoinSplitTest(BitcoinTestFramework): assert_equal(self.cannot_joinsplit(node, txn), True) def run_test(self): - # All nodes should start with 250 BTC: + # All nodes should start with 250 ZEC: starting_balance = 250 for i in range(4): assert_equal(self.nodes[i].getbalance(), starting_balance) From 8b391806c46b7bf2afb795b9a468365c859ed4bb Mon Sep 17 00:00:00 2001 From: ca333 Date: Thu, 1 Mar 2018 03:38:26 +0100 Subject: [PATCH 0559/1062] update code_of_conduct --- code_of_conduct.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code_of_conduct.md b/code_of_conduct.md index 959fbe4d5..b85fd574e 100644 --- a/code_of_conduct.md +++ b/code_of_conduct.md @@ -41,14 +41,14 @@ is deemed necessary and appropriate to the circumstances. Maintainers are obligated to maintain confidentiality with regard to the reporter of an incident. -You may send reports to [our Conduct email](mailto:conduct@z.cash). +You may send reports to [our Conduct email](mailto:developer@komodoplatform.com). If you wish to contact specific maintainers directly, the following have made themselves available for conduct issues: -- Daira Hopwood (daira at z.cash) -- Sean Bowe (sean at z.cash) - +- Benny Fairbank (benny at komodoplatform.com) +- Support Team (support at komodoplatform.com) +- ca333 (ca333 at komodoplatform.com) This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.3.0, available at From 326fc65e66254869ca0307cf7e5acc119f0f3df7 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 10 Mar 2017 15:39:18 +1300 Subject: [PATCH 0560/1062] Add environment variable for setting ./configure flags in zcutil/build.sh Closes #2066. --- zcutil/build.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/zcutil/build.sh b/zcutil/build.sh index 17f023991..6b142990c 100755 --- a/zcutil/build.sh +++ b/zcutil/build.sh @@ -41,6 +41,11 @@ if [[ -z "${CXX-}" ]]; then CXX=g++ fi +# Allow users to set arbitary compile flags. Most users will not need this. +if [[ -z "${CONFIGURE_FLAGS-}" ]]; then + CONFIGURE_FLAGS="" +fi + if [ "x$*" = 'x--help' ] then cat < Date: Thu, 1 Mar 2018 16:04:42 +0000 Subject: [PATCH 0561/1062] Add configure flags for enabling ASan/UBSan and TSan Co-authored-by: Robert Seacord --- configure.ac | 39 +++++++++++++++++++++++++++++++++++++++ src/Makefile.am | 10 +++++----- 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/configure.ac b/configure.ac index 86b3fdd30..10a2f897d 100644 --- a/configure.ac +++ b/configure.ac @@ -113,6 +113,18 @@ AC_ARG_ENABLE(tests, [use_tests=$enableval], [use_tests=yes]) +AC_ARG_ENABLE([asan], + [AS_HELP_STRING([--enable-asan], + [instrument the executables with asan (default is no)])], + [use_asan=$enableval], + [use_asan=no]) + +AC_ARG_ENABLE([tsan], + [AS_HELP_STRING([--enable-tsan], + [instrument the executables with tsan (default is no)])], + [use_tsan=$enableval], + [use_tsan=no]) + AC_ARG_ENABLE([hardening], [AS_HELP_STRING([--enable-hardening], [attempt to harden the resulting executables (default is yes)])], @@ -441,6 +453,29 @@ if test x$TARGET_OS != xwindows; then AX_CHECK_COMPILE_FLAG([-fPIC],[PIC_FLAGS="-fPIC"]) fi +#asan and tsan cannot be used together +if test x$use_asan$use_tsan == xyesyes; then + AC_MSG_ERROR(asan and tsan cannot be simultaneously enabled) +fi + +# using asan flag to enable address sanitizer and undefined behavior sanitizer +if test x$use_asan == xyes; then + AX_CHECK_LINK_FLAG([-static-libstdc++],[SAN_LDFLAGS="$SAN_LDFLAGS -static-libstdc++"],[AC_MSG_ERROR(Cannot statically link -static-libstdc++)]) + AX_CHECK_LINK_FLAG([-static-libasan],[SAN_LDFLAGS="$SAN_LDFLAGS -static-libasan"],[AC_MSG_ERROR(Cannot statically link -static-libasan)]) + AX_CHECK_COMPILE_FLAG([-fsanitize=address],[SAN_CXXFLAGS="$SAN_CXXFLAGS -fsanitize=address"],[AC_MSG_ERROR(Cannot enable -fsanitize=address)]) + AX_CHECK_COMPILE_FLAG([-fsanitize=undefined],[SAN_CXXFLAGS="$SAN_CXXFLAGS -fsanitize=undefined"],[AC_MSG_ERROR(Cannot enable -fsanitize=undefined)]) + AX_CHECK_COMPILE_FLAG([-fno-omit-frame-pointer],[SAN_CXXFLAGS="$SAN_CXXFLAGS -fno-omit-frame-pointer"],[AC_MSG_ERROR(Cannot enable -fno-omit-frame-pointer)]) +fi + +# using tsan flag to enable address thread sanitizer +# TSAN is supported on Linux x84_64 and tested on Ubuntu 12.04 +# Non-position-independent executables are not supported. Use with -fPIE and -pie flags +# libc/libstdc++ static linking is not supported +if test x$use_tsan == xyes; then + AX_CHECK_COMPILE_FLAG([-fsanitize=thread],[SAN_CXXFLAGS="$SAN_CXXFLAGS -fsanitize=thread"],[AC_MSG_ERROR(Cannot enable -fsanitize=thread)]) + AX_CHECK_COMPILE_FLAG([-fno-omit-frame-pointer],[SAN_CXXFLAGS="$SAN_CXXFLAGS -fno-omit-frame-pointer"],[AC_MSG_ERROR(Cannot enable -fno-omit-frame-pointer)]) +fi + if test x$use_hardening != xno; then AX_CHECK_COMPILE_FLAG([-Wformat],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -Wformat"],[AC_MSG_ERROR(Cannot enable -Wformat)]) AX_CHECK_COMPILE_FLAG([-Wformat-security],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -Wformat-security"],[AC_MSG_ERROR(Cannot enable -Wformat-security)],[-Wformat]) @@ -824,6 +859,8 @@ AM_CONDITIONAL([ENABLE_TESTS],[test x$BUILD_TEST = xyes]) AM_CONDITIONAL([USE_LCOV],[test x$use_lcov = xyes]) AM_CONDITIONAL([GLIBC_BACK_COMPAT],[test x$use_glibc_compat = xyes]) AM_CONDITIONAL([HARDEN],[test x$use_hardening = xyes]) +AM_CONDITIONAL([ASAN],[test x$use_asan = xyes]) +AM_CONDITIONAL([TSAN],[test x$use_tsan = xyes]) AC_DEFINE(CLIENT_VERSION_MAJOR, _CLIENT_VERSION_MAJOR, [Major version]) AC_DEFINE(CLIENT_VERSION_MINOR, _CLIENT_VERSION_MINOR, [Minor version]) @@ -843,6 +880,8 @@ AC_SUBST(BITCOIN_TX_NAME) AC_SUBST(RELDFLAGS) AC_SUBST(ERROR_CXXFLAGS) +AC_SUBST(SAN_CXXFLAGS) +AC_SUBST(SAN_LDFLAGS) AC_SUBST(HARDENED_CXXFLAGS) AC_SUBST(HARDENED_CPPFLAGS) AC_SUBST(HARDENED_LDFLAGS) diff --git a/src/Makefile.am b/src/Makefile.am index 2db4e362a..0c866ff02 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,7 +1,7 @@ DIST_SUBDIRS = secp256k1 univalue -AM_LDFLAGS = $(PTHREAD_CFLAGS) $(LIBTOOL_LDFLAGS) $(HARDENED_LDFLAGS) -AM_CXXFLAGS = $(HARDENED_CXXFLAGS) $(ERROR_CXXFLAGS) +AM_LDFLAGS = $(PTHREAD_CFLAGS) $(LIBTOOL_LDFLAGS) $(SAN_LDFLAGS) $(HARDENED_LDFLAGS) +AM_CXXFLAGS = $(SAN_CXXFLAGS) $(HARDENED_CXXFLAGS) $(ERROR_CXXFLAGS) AM_CPPFLAGS = $(HARDENED_CPPFLAGS) if EMBEDDED_LEVELDB @@ -525,11 +525,11 @@ libzcash_a_SOURCES = \ zcash/circuit/prfs.tcc \ zcash/circuit/utils.tcc -libzcash_a_CPPFLAGS = -DMULTICORE -fopenmp -fPIC -DBINARY_OUTPUT -DCURVE_ALT_BN128 -DBOOST_SPIRIT_THREADSAFE -DHAVE_BUILD_INFO -D__STDC_FORMAT_MACROS $(HARDENED_CPPFLAGS) -pipe -O1 -g -Wstack-protector -fstack-protector-all -fPIE -fvisibility=hidden -DSTATIC $(BITCOIN_INCLUDES) +libzcash_a_CPPFLAGS = -DMULTICORE -fopenmp -fPIC -DBINARY_OUTPUT -DCURVE_ALT_BN128 -DBOOST_SPIRIT_THREADSAFE -DHAVE_BUILD_INFO -D__STDC_FORMAT_MACROS $(HARDENED_CPPFLAGS) $(HARDENED_CXXFLAGS) $(HARDENED_LDFLAGS) -pipe $(SAN_LDFLAGS) -O1 -g -Wstack-protector $(SAN_CXXFLAGS) -fstack-protector-all -fPIE -fvisibility=hidden -DSTATIC $(BITCOIN_INCLUDES) -libzcash_a_CXXFLAGS = $(HARDENED_CXXFLAGS) -fwrapv -fno-strict-aliasing +libzcash_a_CXXFLAGS = $(SAN_CXXFLAGS) $(HARDENED_CXXFLAGS) -fwrapv -fno-strict-aliasing -libzcash_a_LDFLAGS = $(HARDENED_LDFLAGS) +libzcash_a_LDFLAGS = $(SAN_LDFLAGS) $(HARDENED_LDFLAGS) libzcash_a_CPPFLAGS += -DMONTGOMERY_OUTPUT From 4ec29af15416b4636f41f183667d82ee1fc347c8 Mon Sep 17 00:00:00 2001 From: Jason Davies Date: Thu, 1 Mar 2018 23:35:08 +0000 Subject: [PATCH 0562/1062] Fix typo in comment: should link to issue #1359. --- src/wallet/asyncrpcoperation_mergetoaddress.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wallet/asyncrpcoperation_mergetoaddress.cpp b/src/wallet/asyncrpcoperation_mergetoaddress.cpp index 5257cbc88..30ef560df 100644 --- a/src/wallet/asyncrpcoperation_mergetoaddress.cpp +++ b/src/wallet/asyncrpcoperation_mergetoaddress.cpp @@ -191,8 +191,8 @@ void AsyncRPCOperation_mergetoaddress::main() } // Notes: -// 1. #1159 Currently there is no limit set on the number of joinsplits, so size of tx could be invalid. -// 2. #1277 Spendable notes are not locked, so an operation running in parallel could also try to use them +// 1. #1359 Currently there is no limit set on the number of joinsplits, so size of tx could be invalid. +// 2. #1277 Spendable notes are not locked, so an operation running in parallel could also try to use them. bool AsyncRPCOperation_mergetoaddress::main_impl() { assert(isToTaddr_ != isToZaddr_); From c938fb1f179d9bdefc5bc7e55fc6330a8b8d3713 Mon Sep 17 00:00:00 2001 From: Daira Hopwood Date: Fri, 2 Mar 2018 11:45:05 +0000 Subject: [PATCH 0563/1062] Squashed commit of the following: commit 5e7222e4bc0401ef8c6d8049b12a62d4854ac85c Author: Dimitris Apostolou Date: Thu Mar 1 21:20:51 2018 +0200 Cleanup commit 2e1bc7a7cd6c72e7c3d2ff74cb30f7a56515006c Author: Dimitris Apostolou Date: Thu Mar 1 21:19:53 2018 +0200 Cleanup commit edd7fa87fb2c839c17457ff004d258a049df832f Author: Dimitris Apostolou Date: Thu Mar 1 21:18:57 2018 +0200 Cleanup commit ee34e1433806655a7123f0617802aa4771507dff Author: Dimitris Apostolou Date: Thu Mar 1 21:18:10 2018 +0200 Cleanup commit 20779e4021b8ab95a87289d2741ad2f0fbc7fb39 Author: Dimitris Apostolou Date: Thu Mar 1 21:16:52 2018 +0200 Cleanup commit 084e1aa563807f5625ad3aaff376b598e139f2a7 Author: Dimitris Apostolou Date: Tue Feb 27 18:42:49 2018 +0200 Fix typo commit c61a7c2319d3b9b96d1b5ad52ecf9d4f2fd92658 Author: Dimitris Apostolou Date: Tue Feb 27 18:37:43 2018 +0200 Cleanup commit e435c0229b0cbe3f4a77f43b01ca87ed0552d405 Author: Dimitris Apostolou Date: Tue Feb 27 18:17:58 2018 +0200 Fix typos commit e05bff3fea8915e95a473fe3266b2b1f727deca0 Author: Dimitris Apostolou Date: Tue Feb 27 17:59:32 2018 +0200 Fix typo commit 8c55c7840232cef7fa4389a12f6f220e86f5f581 Author: Dimitris Apostolou Date: Tue Feb 27 17:46:33 2018 +0200 Fix typos commit a1edfcc5cc29d815ba7e8c4baaf14c23ef93af64 Author: Dimitris Apostolou Date: Tue Feb 27 17:39:41 2018 +0200 Fix typos commit 2ce2c4d180e936ccc5c10745a6430fda5de38a9b Author: Dimitris Apostolou Date: Tue Feb 27 17:14:10 2018 +0200 Fix typo commit 5bdc6cd5bc9cff93aa48fbdeda36d4d9774bfa18 Author: Dimitris Apostolou Date: Tue Feb 27 17:12:14 2018 +0200 Fix typo commit d08749f549575efc6f44a7f80850bc439c12ad5c Author: Dimitris Apostolou Date: Tue Feb 27 16:54:06 2018 +0200 Revert one change commit a734bb1191c692f09f58bcc8e85160ce7c839905 Author: Dimitris Apostolou Date: Tue Feb 27 16:52:45 2018 +0200 Fix typo commit 95fbc8d94bbefc0db989c83d0f053111bfed45e7 Author: Dimitris Apostolou Date: Tue Feb 27 16:51:33 2018 +0200 Fix typos commit d17d540a83d035cf9a200f9a8b19f0fab6084728 Author: Dimitris Apostolou Date: Tue Feb 27 16:49:36 2018 +0200 Fix typo commit c4bf4402210bcb926ccfb3928afeb3a8a7490b42 Author: Dimitris Apostolou Date: Tue Feb 27 16:48:09 2018 +0200 Fix typo commit 25e7990848a1d723702e2d041c04bc68a6c1275f Author: Dimitris Apostolou Date: Tue Feb 27 16:47:01 2018 +0200 Fix typo commit d72ffb5b0253e0d7b992ffe13c40695421378dc3 Author: Dimitris Apostolou Date: Tue Feb 27 16:45:20 2018 +0200 Fix typo commit 705e6f271192a575cc99d794545b0efe75d964c4 Author: Dimitris Apostolou Date: Tue Feb 27 16:41:19 2018 +0200 Revert one change commit 4fd26cd29e21c42b027e37da2616761ebc399d16 Author: Dimitris Apostolou Date: Tue Feb 27 16:39:41 2018 +0200 Revert commit commit 8a5cc627b1048368fe8807973d1f542bab2e045f Author: Dimitris Apostolou Date: Tue Feb 27 16:28:56 2018 +0200 Fix typo commit 0a24baa7258c0ae0f244d82af8d0831b148ab012 Author: Dimitris Apostolou Date: Tue Feb 27 16:15:45 2018 +0200 Fix typo commit 38f93ecd90171fb881243f0de55b3452daccff20 Author: Dimitris Apostolou Date: Tue Feb 27 15:56:49 2018 +0200 Fix typos commit 15446fd62400c36c2a51f7e6f13725cc8adfd924 Author: Dimitris Apostolou Date: Tue Feb 27 15:48:00 2018 +0200 Fix typos commit 76533b41986bbc5826070a1e644215a74757c1db Author: Dimitris Apostolou Date: Tue Feb 27 15:04:38 2018 +0200 Fix typo commit aea330c2b0bf76975ec69142a732288cc8b192bd Author: Dimitris Apostolou Date: Tue Feb 27 14:46:29 2018 +0200 Fix typo commit 8b1b1d0be1dc44f36c22c54d1a3d56d84d456b92 Author: Dimitris Apostolou Date: Tue Feb 27 14:40:23 2018 +0200 Fix typo commit 46ea76785a26cf20a664ed211c8f3fb9a283e127 Author: Dimitris Apostolou Date: Tue Feb 27 14:14:17 2018 +0200 Fix typo commit e0d7c5748545dd0975507ad603623072fcc6bdea Author: Dimitris Apostolou Date: Tue Feb 27 14:08:24 2018 +0200 Fix typo commit 604d5a244323b17ba596b12d245407e1cf63a375 Merge: 6c081ca 1c65b2b Author: Dimitris Apostolou Date: Tue Feb 27 09:03:23 2018 +0200 Merge pull request #36 from rex4539/patch-36 Fix typo commit 6c081caf28b7cef9e62ed523284dff90e4add16d Merge: 899e5d2 88fa2d9 Author: Dimitris Apostolou Date: Tue Feb 27 09:02:49 2018 +0200 Merge pull request #35 from rex4539/patch-35 Fix typo commit 899e5d2c343ac7ea5069b8548e5df86c8e963e21 Merge: 6380c7f 40e73e2 Author: Dimitris Apostolou Date: Tue Feb 27 09:02:16 2018 +0200 Merge pull request #34 from rex4539/patch-34 Fix typo commit 6380c7f740246474c69d8145bde61688551efe83 Merge: f592274 4567667 Author: Dimitris Apostolou Date: Tue Feb 27 09:01:47 2018 +0200 Merge pull request #33 from rex4539/patch-33 Fix typos commit f592274a713162da0083bd6d22fb47cb1afcdba9 Merge: d86ef7e 4aeaa3a Author: Dimitris Apostolou Date: Tue Feb 27 09:01:14 2018 +0200 Merge pull request #32 from rex4539/patch-32 Fix typo commit d86ef7e5e4f7e9c2014358ec5b647d1815eb304d Merge: fe0b432 5cdd1b2 Author: Dimitris Apostolou Date: Tue Feb 27 09:00:41 2018 +0200 Merge pull request #31 from rex4539/patch-31 Fix typo commit fe0b432ee125ae0b876af2c26139dfc979005a3b Merge: 6fd6d0d 70130d0 Author: Dimitris Apostolou Date: Tue Feb 27 09:00:12 2018 +0200 Merge pull request #30 from rex4539/patch-30 Fix typos commit 6fd6d0dcf3714118a623c0d8d84aabb4578410a8 Merge: 389660f 3377426 Author: Dimitris Apostolou Date: Tue Feb 27 08:59:42 2018 +0200 Merge pull request #29 from rex4539/patch-29 Fix typo commit 389660f856cb60ff475a8757aad3873b99213cc0 Merge: a0b85ce 40643eb Author: Dimitris Apostolou Date: Tue Feb 27 08:59:15 2018 +0200 Merge pull request #28 from rex4539/patch-28 Fix typo commit a0b85ce3b4d2e6596da0727e05c1fe15c289b1e7 Merge: 6f9a1c7 23ead80 Author: Dimitris Apostolou Date: Tue Feb 27 08:58:42 2018 +0200 Merge pull request #27 from rex4539/patch-27 Fix typo commit 6f9a1c71a680bb3ed1c249dd42bf0a54663d0af3 Merge: b880547 3612eab Author: Dimitris Apostolou Date: Tue Feb 27 08:58:06 2018 +0200 Merge pull request #26 from rex4539/patch-26 Patch 26 commit b880547415afeae36bd19867388e60a3040a15ca Merge: a3b7da2 5c3177f Author: Dimitris Apostolou Date: Tue Feb 27 08:57:24 2018 +0200 Merge pull request #25 from rex4539/patch-25 Fix typo commit a3b7da2c6d6691f38751292e1aea63498a325788 Merge: edd8586 60026ef Author: Dimitris Apostolou Date: Tue Feb 27 08:56:52 2018 +0200 Merge pull request #24 from rex4539/patch-24 Fix typo commit edd8586fdf8c112f4c513804610c237d7e2e80ef Merge: 0c28eb7 f979c00 Author: Dimitris Apostolou Date: Tue Feb 27 08:56:12 2018 +0200 Merge pull request #23 from rex4539/patch-23 Fix typo commit 0c28eb7717821b1d68016f40911d07f2a7231b4f Merge: 775beb6 c900722 Author: Dimitris Apostolou Date: Tue Feb 27 08:55:42 2018 +0200 Merge pull request #22 from rex4539/patch-22 Fix typo commit 775beb625beb1fc5f72388c076b295de4b8ff039 Merge: a0cf889 1027543 Author: Dimitris Apostolou Date: Tue Feb 27 08:55:16 2018 +0200 Merge pull request #21 from rex4539/patch-21 Fix typo commit a0cf88971e756c37c406bab3066c11d6fc7f6d74 Merge: 4504b48 f3fa89b Author: Dimitris Apostolou Date: Tue Feb 27 08:54:44 2018 +0200 Merge pull request #20 from rex4539/patch-20 Fix typo commit 4504b4824b3438e931ca8d24a56b1887657e87cd Merge: dd0bcbf 2699eca Author: Dimitris Apostolou Date: Tue Feb 27 08:54:20 2018 +0200 Merge pull request #19 from rex4539/patch-19 Fix typo commit dd0bcbfc89293e9760156d5534f3a558451e1f29 Merge: abfb65a f02ef2e Author: Dimitris Apostolou Date: Tue Feb 27 08:53:46 2018 +0200 Merge pull request #18 from rex4539/patch-18 Fix typos commit abfb65afaed49c34b9875df79f6fe6eb2b7bf769 Merge: 68b46b7 6485c90 Author: Dimitris Apostolou Date: Tue Feb 27 08:53:08 2018 +0200 Merge pull request #17 from rex4539/patch-17 Fix typo commit 68b46b75d2e5b7ae97e83fc5541c46b4907a7899 Merge: a131e84 fcc0828 Author: Dimitris Apostolou Date: Tue Feb 27 08:52:39 2018 +0200 Merge pull request #16 from rex4539/patch-16 Fix typo commit a131e844652e58aff78fa8952e7547a9ba82b8a1 Merge: 8487c0e 8a688ff Author: Dimitris Apostolou Date: Tue Feb 27 08:51:54 2018 +0200 Merge pull request #15 from rex4539/patch-15 Fix typo commit 8487c0e39092b74e977c7a60f4a07a27606756a8 Merge: bcc4cb4 bb60b83 Author: Dimitris Apostolou Date: Tue Feb 27 08:51:28 2018 +0200 Merge pull request #14 from rex4539/patch-14 Fix typos commit bcc4cb46130e789faa9adae9b159ca818f67ec52 Merge: 23e66e9 53539bb Author: Dimitris Apostolou Date: Tue Feb 27 08:51:00 2018 +0200 Merge pull request #13 from rex4539/patch-13 Fix typos commit 23e66e956bff2d6935c7a4dd570d457294018a77 Merge: 56956cf 0808445 Author: Dimitris Apostolou Date: Tue Feb 27 08:50:27 2018 +0200 Merge pull request #12 from rex4539/patch-12 Fix typo commit 56956cf23ba1208aa39cb3ab1ef60375c6630263 Merge: 77007d4 7a4f064 Author: Dimitris Apostolou Date: Tue Feb 27 08:49:59 2018 +0200 Merge pull request #11 from rex4539/patch-11 Fix typo commit 77007d49fa1d8cb80aef02bea1dd15e522a47c90 Merge: e78ad0c 48c33fb Author: Dimitris Apostolou Date: Tue Feb 27 08:49:16 2018 +0200 Merge pull request #10 from rex4539/patch-10 Fix typo commit e78ad0cf0d91955a848f5e953a042eabdcdac198 Merge: 38a3e08 809f01c Author: Dimitris Apostolou Date: Tue Feb 27 08:48:33 2018 +0200 Merge pull request #9 from rex4539/patch-9 Fix typo commit 38a3e08699fe4c4ec715b1783dba18bff6b829fb Merge: eee3c28 fec279c Author: Dimitris Apostolou Date: Tue Feb 27 08:48:05 2018 +0200 Merge pull request #8 from rex4539/patch-8 Fix typo commit eee3c286eb84f994310142a9e7fdbd36a671e593 Merge: 702635b cf81b4e Author: Dimitris Apostolou Date: Tue Feb 27 08:47:33 2018 +0200 Merge pull request #7 from rex4539/patch-7 Fix typo commit 702635bb34abb2f83ded27ae95deefd5b6e7df93 Merge: d7497ea 3bbcc3d Author: Dimitris Apostolou Date: Tue Feb 27 08:47:01 2018 +0200 Merge pull request #6 from rex4539/patch-6 Fix typo commit d7497ea070e03380cf1d4f533b7dc4b881f724f8 Merge: bfcc1e8 f639727 Author: Dimitris Apostolou Date: Tue Feb 27 08:45:33 2018 +0200 Merge pull request #5 from rex4539/patch-5 Fix typos commit bfcc1e8ae2094ca4e9837f623999705f538aff04 Merge: f4440ec 55262fe Author: Dimitris Apostolou Date: Tue Feb 27 08:45:05 2018 +0200 Merge pull request #4 from rex4539/patch-4 Remove space for word "backup" commit f4440ecd4a7367e6bc4a5f75bea112290017ed2b Merge: f8b487f 61d5279 Author: Dimitris Apostolou Date: Tue Feb 27 08:44:31 2018 +0200 Merge pull request #3 from rex4539/patch-3 Fix typos in zmq.md commit f8b487f5699990fabc7fc383d02bc728db3cb9aa Merge: 60104a7 f2ce50f Author: Dimitris Apostolou Date: Tue Feb 27 08:42:51 2018 +0200 Merge pull request #2 from rex4539/patch-2 Fix typo in security-warnings.md commit 60104a7034f55284afb814e81a1430a8b2b0d8d1 Merge: be262f0 af7dfe0 Author: Dimitris Apostolou Date: Tue Feb 27 08:41:48 2018 +0200 Merge pull request #1 from rex4539/patch-1 Fix typos commit 1c65b2bd0c49f7f392d0e3a2db14ce1366a87171 Author: Dimitris Apostolou Date: Tue Feb 27 07:35:26 2018 +0200 Fix typo commit 88fa2d966a3b462ed34a9a4659fc390711cc0276 Author: Dimitris Apostolou Date: Tue Feb 27 07:21:00 2018 +0200 Fix typo commit 40e73e258671f21d2b2205509e9cae1f50294752 Author: Dimitris Apostolou Date: Tue Feb 27 07:14:21 2018 +0200 Fix typo commit 4567667fcc8b4197dfd51da34fe82b0f2fb78127 Author: Dimitris Apostolou Date: Tue Feb 27 06:44:40 2018 +0200 Fix typos commit 4aeaa3a3d6335302c53c0f5f4ef81de05e266479 Author: Dimitris Apostolou Date: Tue Feb 27 05:55:25 2018 +0200 Fix typo commit 5cdd1b29b4c90492aa15fed7940984e1d675052f Author: Dimitris Apostolou Date: Tue Feb 27 05:36:46 2018 +0200 Fix typo commit 70130d05f1646c8b9fb1f33c4efbe2a5fcf7138b Author: Dimitris Apostolou Date: Tue Feb 27 05:28:21 2018 +0200 Fix typos commit 33774261b1c63e5640aa1dd251edb67892ed7a5b Author: Dimitris Apostolou Date: Tue Feb 27 05:00:56 2018 +0200 Fix typo commit 40643ebfcd85ee257a4576e85d2fb6c73dad17b5 Author: Dimitris Apostolou Date: Tue Feb 27 04:51:57 2018 +0200 Fix typo commit 23ead80e05116ebfeaac0a00d5bd4a158fbeb54e Author: Dimitris Apostolou Date: Tue Feb 27 04:29:53 2018 +0200 Fix typo commit 3612eaba2dcf273e94cac9ad889723776ce55108 Author: Dimitris Apostolou Date: Tue Feb 27 04:19:36 2018 +0200 Fix typos commit 5c3177f5d191d1f4e4d9f78ae4b75381010f7768 Author: Dimitris Apostolou Date: Tue Feb 27 04:13:03 2018 +0200 Fix typo commit 60026efe27a39300e428879ad8dba94f19934870 Author: Dimitris Apostolou Date: Tue Feb 27 04:08:09 2018 +0200 Fix typo commit f979c0074efd66804f229c8b3cc6e812d7f26406 Author: Dimitris Apostolou Date: Tue Feb 27 04:01:44 2018 +0200 Fix typo commit c9007220a8a727c1cfe3b25b453c178eacd431f3 Author: Dimitris Apostolou Date: Tue Feb 27 03:52:33 2018 +0200 Fix typo commit 1027543bd30701c4b09aa66226281a10563db910 Author: Dimitris Apostolou Date: Tue Feb 27 03:36:19 2018 +0200 Fix typo commit f3fa89bcd30e0cb45ff4391e78d02452c9227be0 Author: Dimitris Apostolou Date: Tue Feb 27 03:34:37 2018 +0200 Fix typo commit 2699eca938f1e413a29d4408a271aaafd27969cc Author: Dimitris Apostolou Date: Tue Feb 27 03:30:29 2018 +0200 Fix typo commit f02ef2e495fe43142d305f5c4f40dcfa3d2cb423 Author: Dimitris Apostolou Date: Tue Feb 27 03:22:36 2018 +0200 Fix typos commit 6485c908433bb91fd70d7e18cf3611c9a96115a7 Author: Dimitris Apostolou Date: Tue Feb 27 03:10:06 2018 +0200 Fix typo commit fcc082850564b14b86b1932dfc5a099816c72ef1 Author: Dimitris Apostolou Date: Tue Feb 27 03:06:26 2018 +0200 Fix typo commit 8a688ff7405d67bd4c77b0aa0ebdd4b4a8a9a6a7 Author: Dimitris Apostolou Date: Tue Feb 27 03:02:50 2018 +0200 Fix typo commit bb60b83853ed0a82ca47dd58d55f1849ddcf23ab Author: Dimitris Apostolou Date: Tue Feb 27 02:59:25 2018 +0200 Fix typos commit 53539bb720c7676b9d37e25dde3423db3aa7bfa1 Author: Dimitris Apostolou Date: Tue Feb 27 02:50:55 2018 +0200 Fix typos commit 080844581d6488ab797ac188acae9c4b2e1d0c59 Author: Dimitris Apostolou Date: Tue Feb 27 01:05:54 2018 +0200 Fix typo commit 7a4f0649ac5e71f39f0bef7f2e1fcb6fafad0291 Author: Dimitris Apostolou Date: Tue Feb 27 00:16:31 2018 +0200 Fix typo commit 48c33fb3f9ab1ad287987d147ee4bbe186f7ade1 Author: Dimitris Apostolou Date: Tue Feb 27 00:07:42 2018 +0200 Fix typo commit 809f01ca4f785a7b5bc9cc2c388e0ae814ecaa95 Author: Dimitris Apostolou Date: Tue Feb 27 00:02:34 2018 +0200 Fix typo commit fec279cac89aa917be929447c81177811728361a Author: Dimitris Apostolou Date: Mon Feb 26 23:55:27 2018 +0200 Fix typo commit cf81b4e12399570545372d4c9daceca8e70142d5 Author: Dimitris Apostolou Date: Mon Feb 26 23:48:43 2018 +0200 Fix typo commit 3bbcc3d9986caf8df99bec5d8a18d0f0c8990e06 Author: Dimitris Apostolou Date: Mon Feb 26 23:28:52 2018 +0200 Fix typo commit f639727525dbd23f5f2d0f89e7be13d868e984c3 Author: Dimitris Apostolou Date: Mon Feb 26 23:13:12 2018 +0200 Fix typos commit 55262fe9c5e1e127c6b817a0c2ab3f9db3ac35b9 Author: Dimitris Apostolou Date: Mon Feb 26 22:46:52 2018 +0200 Remove space for word "backup" commit 61d52797d4d26a90dcc15e2bcd6f19a5f36faac3 Author: Dimitris Apostolou Date: Mon Feb 26 22:23:31 2018 +0200 Fix typos in zmq.md commit f2ce50f10e67b4265e559a432681bc44828ae59b Author: Dimitris Apostolou Date: Mon Feb 26 22:12:58 2018 +0200 Fix typo in security-warnings.md commit af7dfe046c12109e44ddc18dff07ede8755cf4f9 Author: Dimitris Apostolou Date: Mon Feb 26 21:59:24 2018 +0200 Fix typos Signed-off-by: Daira Hopwood --- .github/ISSUE_TEMPLATE.md | 2 +- doc/payment-api.md | 6 +++--- doc/security-warnings.md | 2 +- doc/zmq.md | 6 +++--- src/addrman.h | 2 +- src/asyncrpcoperation.h | 2 +- src/base58.h | 2 +- src/coins.h | 2 +- src/consensus/params.h | 2 +- src/gtest/test_mempool.cpp | 2 +- src/httprpc.cpp | 2 +- src/init.cpp | 2 +- src/main.cpp | 4 ++-- src/merkleblock.cpp | 4 ++-- src/merkleblock.h | 2 +- src/miner.cpp | 2 +- src/net.cpp | 2 +- src/netbase.cpp | 2 +- src/netbase.h | 2 +- src/policy/fees.h | 8 ++++---- src/pow/tromp/equi_miner.h | 2 +- src/rest.cpp | 4 ++-- src/rpcblockchain.cpp | 4 ++-- src/rpcnet.cpp | 2 +- src/rpcrawtransaction.cpp | 2 +- src/script/interpreter.cpp | 2 +- src/script/script.cpp | 2 +- src/script/sigcache.cpp | 2 +- src/script/sign.h | 2 +- src/snark/README.md | 8 ++++---- .../evaluation_domain/evaluation_domain.hpp | 4 ++-- src/snark/libsnark/algebra/fields/bigint.hpp | 2 +- src/snark/libsnark/algebra/fields/bigint.tcc | 2 +- src/snark/libsnark/algebra/fields/fp.hpp | 2 +- .../algebra/scalar_multiplication/kc_multiexp.hpp | 6 +++--- .../common/data_structures/sparse_vector.hpp | 2 +- src/snark/libsnark/common/profiling.cpp | 2 +- src/snark/libsnark/common/serialization.hpp | 2 +- .../reductions/r1cs_to_qap/r1cs_to_qap.hpp | 2 +- src/snark/libsnark/relations/variable.hpp | 2 +- .../ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.hpp | 2 +- .../ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.tcc | 2 +- src/support/pagelocker.h | 4 ++-- src/test/addrman_tests.cpp | 4 ++-- src/test/miner_tests.cpp | 2 +- src/test/rpc_tests.cpp | 2 +- src/tinyformat.h | 4 ++-- src/torcontrol.cpp | 2 +- src/univalue/lib/univalue.cpp | 4 ++-- src/wallet/asyncrpcoperation_sendmany.cpp | 2 +- src/wallet/gtest/test_wallet.cpp | 2 +- src/wallet/rpcwallet.cpp | 14 +++++++------- src/wallet/wallet.h | 2 +- 53 files changed, 80 insertions(+), 80 deletions(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 7cec0d649..a025e66ac 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -37,6 +37,6 @@ Run `zcashd --version` to find out This includes the relevant contents of `~/.zcash/debug.log`. You can paste raw text, attach the file directly in the issue or link to the text via a pastebin type site. Please also include any non-standard things you did during compilation (extra flags, dependency version changes etc.) if applicable. -### Do you have a back up of `~/.zcash` directory and/or take a VM snapshot? +### Do you have a backup of `~/.zcash` directory and/or take a VM snapshot? - Backing up / making a copy of the `~/.zcash` directory might help make the problem reproducible. Please redact appropriately. - Taking a VM snapshot is really helpful for interactively testing fixes diff --git a/doc/payment-api.md b/doc/payment-api.md index 1582255bb..7408ecba1 100644 --- a/doc/payment-api.md +++ b/doc/payment-api.md @@ -46,7 +46,7 @@ RPC parameter conventions: Command | Parameters | Description --- | --- | --- -z_getbalance
| address [minconf=1] | Returns the balance of a taddr or zaddr belonging to the node’s wallet.

Optionally set the minimum number of confirmations a private or transaction transaction must have in order to be included in the balance. Use 0 to count unconfirmed transactions. +z_getbalance
| address [minconf=1] | Returns the balance of a taddr or zaddr belonging to the node’s wallet.

Optionally set the minimum number of confirmations a private or transparent transaction must have in order to be included in the balance. Use 0 to count unconfirmed transactions. z_gettotalbalance
| [minconf=1] | Return the total value of funds stored in the node’s wallet.

Optionally set the minimum number of confirmations a private or transparent transaction must have in order to be included in the balance. Use 0 to count unconfirmed transactions.

Output:
{
"transparent" : 1.23,
"private" : 4.56,
"total" : 5.79} ### Addresses @@ -72,7 +72,7 @@ Command | Parameters | Description --- | --- | --- z_listreceivedbyaddress
| zaddr [minconf=1] | Return a list of amounts received by a zaddr belonging to the node’s wallet.

Optionally set the minimum number of confirmations which a received amount must have in order to be included in the result. Use 0 to count unconfirmed transactions.

Output:
[{
“txid”: “4a0f…”,
“amount”: 0.54,
“memo”:”F0FF…”,}, {...}, {...}
] z_sendmany
| fromaddress amounts [minconf=1] [fee=0.0001] | _This is an Asynchronous RPC call_

Send funds from an address to multiple outputs. The address can be either a taddr or a zaddr.

Amounts is a list containing key/value pairs corresponding to the addresses and amount to pay. Each output address can be in taddr or zaddr format.

When sending to a zaddr, you also have the option of attaching a memo in hexadecimal format.

**NOTE:**When sending coinbase funds to a zaddr, the node's wallet does not allow any change. Put another way, spending a partial amount of a coinbase utxo is not allowed. This is not a consensus rule but a local wallet rule due to the current implementation of z_sendmany. In future, this rule may be removed.

Example of Outputs parameter:
[{“address”:”t123…”, “amount”:0.005},
,{“address”:”z010…”,”amount”:0.03, “memo”:”f508af…”}]

Optionally set the minimum number of confirmations which a private or transparent transaction must have in order to be used as an input. When sending from a zaddr, minconf must be greater than zero.

Optionally set a transaction fee, which by default is 0.0001 ZEC.

Any transparent change will be sent to a new transparent address. Any private change will be sent back to the zaddr being used as the source of funds.

Returns an operationid. You use the operationid value with z_getoperationstatus and z_getoperationresult to obtain the result of sending funds, which if successful, will be a txid. -z_shieldcoinbase
| fromaddress toaddress [fee=0.0001] [limit=50] | _This is an Asynchronous RPC call_

Shield transparent coinbase funds by sending to a shielded z address. Utxos selected for shielding will be locked. If there is an error, they are unlocked. The RPC call `listlockunspent` can be used to return a list of locked utxos.

The number of coinbase utxos selected for shielding can be set with the limit parameter, which has a default value of 50. If the parameter is set to 0, the number of utxos selected is limited by the `-mempooltxinputlimit` option. Any limit is constrained by a consensus rule defining a maximum transaction size of 100000 bytes.

The from address is a taddr or "*" for all taddrs belonging to the wallet. The to address is a zaddr. The default fee is 0.0001.

Returns an object containing an operationid which can be used with z_getoperationstatus and z_getoperationresult, along with key-value pairs regarding how many utxos are being shielded in this trasaction and what remains to be shielded. +z_shieldcoinbase
| fromaddress toaddress [fee=0.0001] [limit=50] | _This is an Asynchronous RPC call_

Shield transparent coinbase funds by sending to a shielded z address. Utxos selected for shielding will be locked. If there is an error, they are unlocked. The RPC call `listlockunspent` can be used to return a list of locked utxos.

The number of coinbase utxos selected for shielding can be set with the limit parameter, which has a default value of 50. If the parameter is set to 0, the number of utxos selected is limited by the `-mempooltxinputlimit` option. Any limit is constrained by a consensus rule defining a maximum transaction size of 100000 bytes.

The from address is a taddr or "*" for all taddrs belonging to the wallet. The to address is a zaddr. The default fee is 0.0001.

Returns an object containing an operationid which can be used with z_getoperationstatus and z_getoperationresult, along with key-value pairs regarding how many utxos are being shielded in this transaction and what remains to be shielded. ### Operations @@ -159,7 +159,7 @@ RPC_WALLET_ERROR (-4) | _Unspecified problem with wallet_ "Could not find previous JoinSplit anchor" | Try restarting node with `-reindex`. "Error decrypting output note of previous JoinSplit: __" | "Could not find witness for note commitment" | Try restarting node with `-rescan`. -"Witness for note commitment is null" | Missing witness for note commitement. +"Witness for note commitment is null" | Missing witness for note commitment. "Witness for spendable note does not have same anchor as change input" | Invalid anchor for spendable note witness. "Not enough funds to pay miners fee" | Retry with sufficient funds. "Missing hex data for raw transaction" | Raw transaction data is null. diff --git a/doc/security-warnings.md b/doc/security-warnings.md index ab14b9b44..556a55c4a 100644 --- a/doc/security-warnings.md +++ b/doc/security-warnings.md @@ -42,7 +42,7 @@ Wallet encryption is disabled, for several reasons: You should use full-disk encryption (or encryption of your home directory) to protect your wallet at rest, and should assume (even unprivileged) users who are -runnng on your OS can read your wallet.dat file. +running on your OS can read your wallet.dat file. Side-Channel Attacks -------------------- diff --git a/doc/zmq.md b/doc/zmq.md index e23c0937c..ffc4a6297 100644 --- a/doc/zmq.md +++ b/doc/zmq.md @@ -2,11 +2,11 @@ [ZeroMQ](http://zeromq.org/) is a lightweight wrapper around TCP connections, inter-process communication, and shared-memory, -providing various message-oriented semantics such as publish/subcribe, +providing various message-oriented semantics such as publish/subscribe, request/reply, and push/pull. The Zcash daemon can be configured to act as a trusted "border -router", implementing the zcash wire protocol and relay, making +router", implementing the Zcash wire protocol and relay, making consensus decisions, maintaining the local blockchain database, broadcasting locally generated transactions into the network, and providing a queryable RPC interface to interact on a polled basis for @@ -102,6 +102,6 @@ and just the tip will be notified. It is up to the subscriber to retrieve the chain from the last known block to the new tip. There are several possibilities that ZMQ notification can get lost -during transmission depending on the communication type your are +during transmission depending on the communication type you are using. Zcashd appends an up-counting sequence number to each notification which allows listeners to detect lost notifications. diff --git a/src/addrman.h b/src/addrman.h index 2a08076b7..0483e8bdb 100644 --- a/src/addrman.h +++ b/src/addrman.h @@ -234,7 +234,7 @@ protected: //! Select an address to connect to, if newOnly is set to true, only the new table is selected from. CAddrInfo Select_(bool newOnly); - //! Wraps GetRandInt to allow tests to override RandomInt and make it determinismistic. + //! Wraps GetRandInt to allow tests to override RandomInt and make it deterministic. virtual int RandomInt(int nMax); #ifdef DEBUG_ADDRMAN diff --git a/src/asyncrpcoperation.h b/src/asyncrpcoperation.h index 5475102a5..2b821e256 100644 --- a/src/asyncrpcoperation.h +++ b/src/asyncrpcoperation.h @@ -24,7 +24,7 @@ using namespace std; * * To subclass AsyncRPCOperation, implement the main() method. * Update the operation status as work is underway and completes. - * If main() can be interrupted, inmplement the cancel() method. + * If main() can be interrupted, implement the cancel() method. */ typedef std::string AsyncRPCOperationId; diff --git a/src/base58.h b/src/base58.h index c65f89b0c..24e7abfc8 100644 --- a/src/base58.h +++ b/src/base58.h @@ -194,7 +194,7 @@ public: K GetKey() { K ret; if (vchData.size() == Size) { - //if base58 encouded data not holds a ext key, return a !IsValid() key + //if base58 encoded data not holds a ext key, return a !IsValid() key ret.Decode(&vchData[0]); } return ret; diff --git a/src/coins.h b/src/coins.h index ebc86188f..a2bd78893 100644 --- a/src/coins.h +++ b/src/coins.h @@ -167,7 +167,7 @@ public: nSize += ::GetSerializeSize(VARINT(nCode), nType, nVersion); // spentness bitmask nSize += nMaskSize; - // txouts themself + // txouts for (unsigned int i = 0; i < vout.size(); i++) if (!vout[i].IsNull()) nSize += ::GetSerializeSize(CTxOutCompressor(REF(vout[i])), nType, nVersion); diff --git a/src/consensus/params.h b/src/consensus/params.h index 11504dbc8..233d9d391 100644 --- a/src/consensus/params.h +++ b/src/consensus/params.h @@ -16,7 +16,7 @@ namespace Consensus { * Being array indices, these MUST be numbered consecutively. * * The order of these indices MUST match the order of the upgrades on-chain, as - * several functions depends on the enum being sorted. + * several functions depend on the enum being sorted. */ enum UpgradeIndex { // Sprout must be first diff --git a/src/gtest/test_mempool.cpp b/src/gtest/test_mempool.cpp index 30203aa41..9256f196a 100644 --- a/src/gtest/test_mempool.cpp +++ b/src/gtest/test_mempool.cpp @@ -118,7 +118,7 @@ TEST(Mempool, TxInputLimit) { // Set a limit mapArgs["-mempooltxinputlimit"] = "10"; - // Check it stil fails as expected + // Check it still fails as expected CValidationState state2; EXPECT_FALSE(AcceptToMemoryPool(pool, state2, tx1, false, &missingInputs)); EXPECT_EQ(state2.GetRejectReason(), "bad-txns-version-too-low"); diff --git a/src/httprpc.cpp b/src/httprpc.cpp index cdce110c5..6d37fdfac 100644 --- a/src/httprpc.cpp +++ b/src/httprpc.cpp @@ -17,7 +17,7 @@ static const char* WWW_AUTH_HEADER_DATA = "Basic realm=\"jsonrpc\""; /** Simple one-shot callback timer to be used by the RPC mechanism to e.g. - * re-lock the wellet. + * re-lock the wallet. */ class HTTPRPCTimer : public RPCTimerBase { diff --git a/src/init.cpp b/src/init.cpp index 85507f9a3..8c4a320cb 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -332,7 +332,7 @@ std::string HelpMessage(HelpMessageMode mode) const bool showDebug = GetBoolArg("-help-debug", false); // When adding new options to the categories, please keep and ensure alphabetical ordering. - // Do not translate _(...) -help-debug options, Many technical terms, and only a very small audience, so is unnecessary stress to translators + // Do not translate _(...) -help-debug options, many technical terms, and only a very small audience, so is unnecessary stress to translators string strUsage = HelpMessageGroup(_("Options:")); strUsage += HelpMessageOpt("-?", _("This help message")); diff --git a/src/main.cpp b/src/main.cpp index aed9f5062..eb2aacc78 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -468,7 +468,7 @@ void FindNextBlocksToDownload(NodeId nodeid, unsigned int count, std::vectorGetBlockTime() >= startTime) { ++nBlocks; i = i->pprev; - if (i == NULL) return; // Ran out of chain, we must not be fully sync'ed + if (i == NULL) return; // Ran out of chain, we must not be fully synced } // How likely is it to find that many by chance? diff --git a/src/merkleblock.cpp b/src/merkleblock.cpp index f8e877df2..a368b31ad 100644 --- a/src/merkleblock.cpp +++ b/src/merkleblock.cpp @@ -62,12 +62,12 @@ CMerkleBlock::CMerkleBlock(const CBlock& block, const std::set& txids) uint256 CPartialMerkleTree::CalcHash(int height, unsigned int pos, const std::vector &vTxid) { if (height == 0) { - // hash at height 0 is the txids themself + // hash at height 0 is the txid itself return vTxid[pos]; } else { // calculate left hash uint256 left = CalcHash(height-1, pos*2, vTxid), right; - // calculate right hash if not beyond the end of the array - copy left hash otherwise1 + // calculate right hash if not beyond the end of the array - copy left hash otherwise if (pos*2+1 < CalcTreeWidth(height-1)) right = CalcHash(height-1, pos*2+1, vTxid); else diff --git a/src/merkleblock.h b/src/merkleblock.h index 904c22abc..0181723af 100644 --- a/src/merkleblock.h +++ b/src/merkleblock.h @@ -67,7 +67,7 @@ protected: return (nTransactions+(1 << height)-1) >> height; } - /** calculate the hash of a node in the merkle tree (at leaf level: the txid's themselves) */ + /** calculate the hash of a node in the merkle tree (at leaf level: the txid itself) */ uint256 CalcHash(int height, unsigned int pos, const std::vector &vTxid); /** recursive function that traverses tree nodes, storing the data as bits and hashes */ diff --git a/src/miner.cpp b/src/miner.cpp index ccbee75ab..bff90928e 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -658,7 +658,7 @@ void static BitcoinMiner() equi eq(1); eq.setstate(&curr_state); - // Intialization done, start algo driver. + // Initialization done, start algo driver. eq.digit0(0); eq.xfull = eq.bfull = eq.hfull = 0; eq.showbsizes(0); diff --git a/src/net.cpp b/src/net.cpp index 72ef82d5a..f2f231b9f 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -1074,7 +1074,7 @@ void ThreadSocketHandler() // happens when optimistic write failed, we choose to first drain the // write buffer in this case before receiving more. This avoids // needlessly queueing received data, if the remote peer is not themselves - // receiving data. This means properly utilizing TCP flow control signalling. + // receiving data. This means properly utilizing TCP flow control signaling. // * Otherwise, if there is no (complete) message in the receive buffer, // or there is space left in the buffer, select() for receiving data. // * (if neither of the above applies, there is certainly one message diff --git a/src/netbase.cpp b/src/netbase.cpp index c88a227fd..289b62361 100644 --- a/src/netbase.cpp +++ b/src/netbase.cpp @@ -140,7 +140,7 @@ bool static LookupIntern(const char *pszName, std::vector& vIP, unsign return false; do { - // Should set the timeout limit to a resonable value to avoid + // Should set the timeout limit to a reasonable value to avoid // generating unnecessary checking call during the polling loop, // while it can still response to stop request quick enough. // 2 seconds looks fine in our situation. diff --git a/src/netbase.h b/src/netbase.h index 21ac0aa4c..8f02fa025 100644 --- a/src/netbase.h +++ b/src/netbase.h @@ -61,7 +61,7 @@ class CNetAddr bool IsIPv4() const; // IPv4 mapped address (::FFFF:0:0/96, 0.0.0.0/0) bool IsIPv6() const; // IPv6 address (not mapped IPv4, not Tor) bool IsRFC1918() const; // IPv4 private networks (10.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12) - bool IsRFC2544() const; // IPv4 inter-network communcations (192.18.0.0/15) + bool IsRFC2544() const; // IPv4 inter-network communications (192.18.0.0/15) bool IsRFC6598() const; // IPv4 ISP-level NAT (100.64.0.0/10) bool IsRFC5737() const; // IPv4 documentation addresses (192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24) bool IsRFC3849() const; // IPv6 documentation address (2001:0DB8::/32) diff --git a/src/policy/fees.h b/src/policy/fees.h index d990442ae..ee865c679 100644 --- a/src/policy/fees.h +++ b/src/policy/fees.h @@ -28,7 +28,7 @@ class CTxMemPoolEntry; * included in blocks before transactions of lower fee/priority. So for * example if you wanted to know what fee you should put on a transaction to * be included in a block within the next 5 blocks, you would start by looking - * at the bucket with with the highest fee transactions and verifying that a + * at the bucket with the highest fee transactions and verifying that a * sufficiently high percentage of them were confirmed within 5 blocks and * then you would look at the next highest fee bucket, and so on, stopping at * the last bucket to pass the test. The average fee of transactions in this @@ -71,7 +71,7 @@ static const double DEFAULT_DECAY = .998; /** * We will instantiate two instances of this class, one to track transactions - * that were included in a block due to fee, and one for tx's included due to + * that were included in a block due to fee, and one for txs included due to * priority. We will lump transactions into a bucket according to their approximate * fee or priority and then track how long it took for those txs to be included * in a block. There is always a bucket into which any given double value @@ -100,7 +100,7 @@ private: // and calcuate the totals for the current block to update the moving averages std::vector > curBlockConf; // curBlockConf[Y][X] - // Sum the total priority/fee of all tx's in each bucket + // Sum the total priority/fee of all txs in each bucket // Track the historical moving average of this total over blocks std::vector avg; // and calculate the total for the current block to update the moving average @@ -217,7 +217,7 @@ static const double FEE_SPACING = 1.1; static const double PRI_SPACING = 2; /** - * We want to be able to estimate fees or priorities that are needed on tx's to be included in + * We want to be able to estimate fees or priorities that are needed on txs to be included in * a certain number of blocks. Every time a block is added to the best chain, this class records * stats on the transactions included in that block */ diff --git a/src/pow/tromp/equi_miner.h b/src/pow/tromp/equi_miner.h index 9559c178e..ae527827a 100644 --- a/src/pow/tromp/equi_miner.h +++ b/src/pow/tromp/equi_miner.h @@ -3,7 +3,7 @@ // Fix N, K, such that n = N/(k+1) is integer // Fix M = 2^{n+1} hashes each of length N bits, -// H_0, ... , H_{M-1}, generated fom (n+1)-bit indices. +// H_0, ... , H_{M-1}, generated from (n+1)-bit indices. // Problem: find binary tree on 2^K distinct indices, // for which the exclusive-or of leaf hashes is all 0s. // Additionally, it should satisfy the Wagner conditions: diff --git a/src/rest.cpp b/src/rest.cpp index b8cc5462b..813850b4a 100644 --- a/src/rest.cpp +++ b/src/rest.cpp @@ -405,7 +405,7 @@ static bool rest_getutxos(HTTPRequest* req, const std::string& strURIPart) boost::split(uriParts, strUriParams, boost::is_any_of("/")); } - // throw exception in case of a empty request + // throw exception in case of an empty request std::string strRequestMutable = req->ReadBody(); if (strRequestMutable.length() == 0 && uriParts.size() == 0) return RESTERR(req, HTTP_INTERNAL_SERVER_ERROR, "Error: empty request"); @@ -485,7 +485,7 @@ static bool rest_getutxos(HTTPRequest* req, const std::string& strURIPart) if (vOutPoints.size() > MAX_GETUTXOS_OUTPOINTS) return RESTERR(req, HTTP_INTERNAL_SERVER_ERROR, strprintf("Error: max outpoints exceeded (max: %d, tried: %d)", MAX_GETUTXOS_OUTPOINTS, vOutPoints.size())); - // check spentness and form a bitmap (as well as a JSON capable human-readble string representation) + // check spentness and form a bitmap (as well as a JSON capable human-readable string representation) vector bitmap; vector outs; std::string bitmapStringRepresentation; diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 626c4724f..1c6c78bc2 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -174,7 +174,7 @@ UniValue getblockcount(const UniValue& params, bool fHelp) if (fHelp || params.size() != 0) throw runtime_error( "getblockcount\n" - "\nReturns the number of blocks in the longest block chain.\n" + "\nReturns the number of blocks in the best valid block chain.\n" "\nResult:\n" "n (numeric) The current block count\n" "\nExamples:\n" @@ -530,7 +530,7 @@ UniValue gettxout(const UniValue& params, bool fHelp) "\nArguments:\n" "1. \"txid\" (string, required) The transaction id\n" "2. n (numeric, required) vout value\n" - "3. includemempool (boolean, optional) Whether to included the mem pool\n" + "3. includemempool (boolean, optional) Whether to include the mempool\n" "\nResult:\n" "{\n" " \"bestblock\" : \"hash\", (string) the block hash\n" diff --git a/src/rpcnet.cpp b/src/rpcnet.cpp index 6f908516d..95fc8ff31 100644 --- a/src/rpcnet.cpp +++ b/src/rpcnet.cpp @@ -142,7 +142,7 @@ UniValue getpeerinfo(const UniValue& params, bool fHelp) obj.push_back(Pair("pingwait", stats.dPingWait)); obj.push_back(Pair("version", stats.nVersion)); // Use the sanitized form of subver here, to avoid tricksy remote peers from - // corrupting or modifiying the JSON output by putting special characters in + // corrupting or modifying the JSON output by putting special characters in // their ver message. obj.push_back(Pair("subver", stats.cleanSubVer)); obj.push_back(Pair("inbound", stats.fInbound)); diff --git a/src/rpcrawtransaction.cpp b/src/rpcrawtransaction.cpp index f28066300..1f2a6ad12 100644 --- a/src/rpcrawtransaction.cpp +++ b/src/rpcrawtransaction.cpp @@ -426,7 +426,7 @@ UniValue createrawtransaction(const UniValue& params, bool fHelp) " ]\n" "2. \"addresses\" (string, required) a json object with addresses as keys and amounts as values\n" " {\n" - " \"address\": x.xxx (numeric, required) The key is the zcash address, the value is the " + CURRENCY_UNIT + " amount\n" + " \"address\": x.xxx (numeric, required) The key is the Zcash address, the value is the " + CURRENCY_UNIT + " amount\n" " ,...\n" " }\n" diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 66153477e..a8a026aef 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -102,7 +102,7 @@ bool static IsValidSignatureEncoding(const std::vector &sig) { // excluding the sighash byte. // * R-length: 1-byte length descriptor of the R value that follows. // * R: arbitrary-length big-endian encoded R value. It must use the shortest - // possible encoding for a positive integers (which means no null bytes at + // possible encoding for a positive integer (which means no null bytes at // the start, except a single one when the next byte has its highest bit set). // * S-length: 1-byte length descriptor of the S value that follows. // * S: arbitrary-length big-endian encoded S value. The same rules apply. diff --git a/src/script/script.cpp b/src/script/script.cpp index fd3392473..24a73d637 100644 --- a/src/script/script.cpp +++ b/src/script/script.cpp @@ -139,7 +139,7 @@ const char* GetOpName(opcodetype opcode) case OP_CHECKMULTISIG : return "OP_CHECKMULTISIG"; case OP_CHECKMULTISIGVERIFY : return "OP_CHECKMULTISIGVERIFY"; - // expanson + // expansion case OP_NOP1 : return "OP_NOP1"; case OP_NOP2 : return "OP_NOP2"; case OP_NOP3 : return "OP_NOP3"; diff --git a/src/script/sigcache.cpp b/src/script/sigcache.cpp index 099b4ad0e..35b9f0e03 100644 --- a/src/script/sigcache.cpp +++ b/src/script/sigcache.cpp @@ -45,7 +45,7 @@ public: { // DoS prevention: limit cache size to less than 10MB // (~200 bytes per cache entry times 50,000 entries) - // Since there are a maximum of 20,000 signature operations per block + // Since there can be no more than 20,000 signature operations per block // 50,000 is a reasonable default. int64_t nMaxCacheSize = GetArg("-maxsigcachesize", 50000); if (nMaxCacheSize <= 0) return; diff --git a/src/script/sign.h b/src/script/sign.h index edd913d7f..f531ad0d8 100644 --- a/src/script/sign.h +++ b/src/script/sign.h @@ -51,7 +51,7 @@ public: MutableTransactionSignatureCreator(const CKeyStore* keystoreIn, const CMutableTransaction* txToIn, unsigned int nInIn, const CAmount& amount, int nHashTypeIn) : TransactionSignatureCreator(keystoreIn, &tx, nInIn, amount, nHashTypeIn), tx(*txToIn) {} }; -/** A signature creator that just produces 72-byte empty signatyres. */ +/** A signature creator that just produces 72-byte empty signatures. */ class DummySignatureCreator : public BaseSignatureCreator { public: DummySignatureCreator(const CKeyStore* keystoreIn) : BaseSignatureCreator(keystoreIn) {} diff --git a/src/snark/README.md b/src/snark/README.md index d5aa34006..89183b43a 100644 --- a/src/snark/README.md +++ b/src/snark/README.md @@ -14,7 +14,7 @@ Copyright (c) 2012-2014 SCIPR Lab and contributors (see [AUTHORS] file). [TOC] " + * ^- chunk_buf position. + */ + return chunk_size; + } + /* + * Decoding was done once already. Prohibit doing it again. + */ + return -1; + } + + if(!have_more) { + /* + * If we've received something like "1", we can't really + * tell whether it is really `1` or `123`, until we know + * that there is no more data coming. + * The have_more argument will be set to 1 once something + * like this is available to the caller of this callback: + * "1want_more = 1; + return -1; + } + + lead_wsp_size = xer_whitespace_span(chunk_buf, chunk_size); + chunk_buf = (const char *)chunk_buf + lead_wsp_size; + chunk_size -= lead_wsp_size; + + bret = arg->prim_body_decoder(arg->type_descriptor, + arg->struct_key, chunk_buf, chunk_size); + switch(bret) { + case XPBD_SYSTEM_FAILURE: + case XPBD_DECODER_LIMIT: + case XPBD_BROKEN_ENCODING: + break; + case XPBD_BODY_CONSUMED: + /* Tag decoded successfully */ + arg->decoded_something = 1; + /* Fall through */ + case XPBD_NOT_BODY_IGNORE: /* Safe to proceed further */ + return lead_wsp_size + chunk_size; + } + + return -1; +} + + +asn_dec_rval_t +xer_decode_primitive(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, + void **sptr, + size_t struct_size, + const char *opt_mname, + const void *buf_ptr, size_t size, + xer_primitive_body_decoder_f *prim_body_decoder +) { + const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; + asn_struct_ctx_t s_ctx; + struct xdp_arg_s s_arg; + asn_dec_rval_t rc; + + /* + * Create the structure if does not exist. + */ + if(!*sptr) { + *sptr = CALLOC(1, struct_size); + if(!*sptr) ASN__DECODE_FAILED; + } + + memset(&s_ctx, 0, sizeof(s_ctx)); + s_arg.type_descriptor = td; + s_arg.struct_key = *sptr; + s_arg.prim_body_decoder = prim_body_decoder; + s_arg.decoded_something = 0; + s_arg.want_more = 0; + + rc = xer_decode_general(opt_codec_ctx, &s_ctx, &s_arg, + xml_tag, buf_ptr, size, + xer_decode__unexpected_tag, xer_decode__primitive_body); + switch(rc.code) { + case RC_OK: + if(!s_arg.decoded_something) { + char ch; + ASN_DEBUG("Primitive body is not recognized, " + "supplying empty one"); + /* + * Decoding opportunity has come and gone. + * Where's the result? + * Try to feed with empty body, see if it eats it. + */ + if(prim_body_decoder(s_arg.type_descriptor, + s_arg.struct_key, &ch, 0) + != XPBD_BODY_CONSUMED) { + /* + * This decoder does not like empty stuff. + */ + ASN__DECODE_FAILED; + } + } + break; + case RC_WMORE: + /* + * Redo the whole thing later. + * We don't have a context to save intermediate parsing state. + */ + rc.consumed = 0; + break; + case RC_FAIL: + rc.consumed = 0; + if(s_arg.want_more) + rc.code = RC_WMORE; + else + ASN__DECODE_FAILED; + break; + } + return rc; +} + diff --git a/src/cryptoconditions/src/asn/asn_codecs_prim.h b/src/cryptoconditions/src/asn/asn_codecs_prim.h new file mode 100644 index 000000000..0f683fdd0 --- /dev/null +++ b/src/cryptoconditions/src/asn/asn_codecs_prim.h @@ -0,0 +1,53 @@ +/*- + * Copyright (c) 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN_CODECS_PRIM_H +#define ASN_CODECS_PRIM_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct ASN__PRIMITIVE_TYPE_s { + uint8_t *buf; /* Buffer with consecutive primitive encoding bytes */ + int size; /* Size of the buffer */ +} ASN__PRIMITIVE_TYPE_t; /* Do not use this type directly! */ + +asn_struct_free_f ASN__PRIMITIVE_TYPE_free; +ber_type_decoder_f ber_decode_primitive; +der_type_encoder_f der_encode_primitive; + +/* + * A callback specification for the xer_decode_primitive() function below. + */ +enum xer_pbd_rval { + XPBD_SYSTEM_FAILURE, /* System failure (memory shortage, etc) */ + XPBD_DECODER_LIMIT, /* Hit some decoder limitation or deficiency */ + XPBD_BROKEN_ENCODING, /* Encoding of a primitive body is broken */ + XPBD_NOT_BODY_IGNORE, /* Not a body format, but safe to ignore */ + XPBD_BODY_CONSUMED /* Body is recognized and consumed */ +}; +typedef enum xer_pbd_rval (xer_primitive_body_decoder_f) + (asn_TYPE_descriptor_t *td, void *struct_ptr, + const void *chunk_buf, size_t chunk_size); + +/* + * Specific function to decode simple primitive types. + * Also see xer_decode_general() in xer_decoder.h + */ +asn_dec_rval_t xer_decode_primitive(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *type_descriptor, + void **struct_ptr, size_t struct_size, + const char *opt_mname, + const void *buf_ptr, size_t size, + xer_primitive_body_decoder_f *prim_body_decoder +); + +#ifdef __cplusplus +} +#endif + +#endif /* ASN_CODECS_PRIM_H */ diff --git a/src/cryptoconditions/src/asn/asn_internal.h b/src/cryptoconditions/src/asn/asn_internal.h new file mode 100644 index 000000000..9c94ca6c3 --- /dev/null +++ b/src/cryptoconditions/src/asn/asn_internal.h @@ -0,0 +1,128 @@ +/*- + * Copyright (c) 2003, 2004, 2005, 2007 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * Declarations internally useful for the ASN.1 support code. + */ +#ifndef ASN_INTERNAL_H +#define ASN_INTERNAL_H + +#include "asn_application.h" /* Application-visible API */ + +#ifndef __NO_ASSERT_H__ /* Include assert.h only for internal use. */ +#include /* for assert() macro */ +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Environment version might be used to avoid running with the old library */ +#define ASN1C_ENVIRONMENT_VERSION 923 /* Compile-time version */ +int get_asn1c_environment_version(void); /* Run-time version */ + +#define CALLOC(nmemb, size) calloc(nmemb, size) +#define MALLOC(size) malloc(size) +#define REALLOC(oldptr, size) realloc(oldptr, size) +#define FREEMEM(ptr) free(ptr) + +#define asn_debug_indent 0 +#define ASN_DEBUG_INDENT_ADD(i) do{}while(0) + +/* + * A macro for debugging the ASN.1 internals. + * You may enable or override it. + */ +#ifndef ASN_DEBUG /* If debugging code is not defined elsewhere... */ +#if EMIT_ASN_DEBUG == 1 /* And it was asked to emit this code... */ +#ifdef __GNUC__ +#ifdef ASN_THREAD_SAFE +/* Thread safety requires sacrifice in output indentation: + * Retain empty definition of ASN_DEBUG_INDENT_ADD. */ +#else /* !ASN_THREAD_SAFE */ +#undef ASN_DEBUG_INDENT_ADD +#undef asn_debug_indent +int asn_debug_indent; +#define ASN_DEBUG_INDENT_ADD(i) do { asn_debug_indent += i; } while(0) +#endif /* ASN_THREAD_SAFE */ +#define ASN_DEBUG(fmt, args...) do { \ + int adi = asn_debug_indent; \ + while(adi--) fprintf(stderr, " "); \ + fprintf(stderr, fmt, ##args); \ + fprintf(stderr, " (%s:%d)\n", \ + __FILE__, __LINE__); \ + } while(0) +#else /* !__GNUC__ */ +void ASN_DEBUG_f(const char *fmt, ...); +#define ASN_DEBUG ASN_DEBUG_f +#endif /* __GNUC__ */ +#else /* EMIT_ASN_DEBUG != 1 */ +static void ASN_DEBUG(const char *fmt, ...) { (void)fmt; } +#endif /* EMIT_ASN_DEBUG */ +#endif /* ASN_DEBUG */ + +/* + * Invoke the application-supplied callback and fail, if something is wrong. + */ +#define ASN__E_cbc(buf, size) (cb((buf), (size), app_key) < 0) +#define ASN__E_CALLBACK(foo) do { \ + if(foo) goto cb_failed; \ + } while(0) +#define ASN__CALLBACK(buf, size) \ + ASN__E_CALLBACK(ASN__E_cbc(buf, size)) +#define ASN__CALLBACK2(buf1, size1, buf2, size2) \ + ASN__E_CALLBACK(ASN__E_cbc(buf1, size1) || ASN__E_cbc(buf2, size2)) +#define ASN__CALLBACK3(buf1, size1, buf2, size2, buf3, size3) \ + ASN__E_CALLBACK(ASN__E_cbc(buf1, size1) \ + || ASN__E_cbc(buf2, size2) \ + || ASN__E_cbc(buf3, size3)) + +#define ASN__TEXT_INDENT(nl, level) do { \ + int tmp_level = (level); \ + int tmp_nl = ((nl) != 0); \ + int tmp_i; \ + if(tmp_nl) ASN__CALLBACK("\n", 1); \ + if(tmp_level < 0) tmp_level = 0; \ + for(tmp_i = 0; tmp_i < tmp_level; tmp_i++) \ + ASN__CALLBACK(" ", 4); \ + er.encoded += tmp_nl + 4 * tmp_level; \ + } while(0) + +#define _i_INDENT(nl) do { \ + int tmp_i; \ + if((nl) && cb("\n", 1, app_key) < 0) \ + return -1; \ + for(tmp_i = 0; tmp_i < ilevel; tmp_i++) \ + if(cb(" ", 4, app_key) < 0) \ + return -1; \ + } while(0) + +/* + * Check stack against overflow, if limit is set. + */ +#define ASN__DEFAULT_STACK_MAX (30000) +static int __attribute__((unused)) +ASN__STACK_OVERFLOW_CHECK(asn_codec_ctx_t *ctx) { + if(ctx && ctx->max_stack_size) { + + /* ctx MUST be allocated on the stack */ + ptrdiff_t usedstack = ((char *)ctx - (char *)&ctx); + if(usedstack > 0) usedstack = -usedstack; /* grows up! */ + + /* double negative required to avoid int wrap-around */ + if(usedstack < -(ptrdiff_t)ctx->max_stack_size) { + ASN_DEBUG("Stack limit %ld reached", + (long)ctx->max_stack_size); + return -1; + } + } + return 0; +} + +#ifdef __cplusplus +} +#endif + +#endif /* ASN_INTERNAL_H */ diff --git a/src/cryptoconditions/src/asn/asn_system.h b/src/cryptoconditions/src/asn/asn_system.h new file mode 100644 index 000000000..71596fc34 --- /dev/null +++ b/src/cryptoconditions/src/asn/asn_system.h @@ -0,0 +1,138 @@ +/*- + * Copyright (c) 2003, 2004, 2007 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * Miscellaneous system-dependent types. + */ +#ifndef ASN_SYSTEM_H +#define ASN_SYSTEM_H + +#ifdef CRYPTOCONDITIONS_HAVE_CONFIG_H +#include "cryptoconditions-config.h" +#endif + +#ifndef _BSD_SOURCE +#define _BSD_SOURCE /* for snprintf() on some linux systems */ +#endif + +#include /* For snprintf(3) */ +#include /* For *alloc(3) */ +#include /* For memcpy(3) */ +#include /* For size_t */ +#include /* For LONG_MAX */ +#include /* For va_start */ +#include /* for offsetof and ptrdiff_t */ + +#ifdef HAVE_ALLOCA_H +#include /* For alloca(3) */ +#endif + +#ifdef _WIN32 + +#include +#define snprintf _snprintf +#define vsnprintf _vsnprintf + +/* To avoid linking with ws2_32.lib, here's the definition of ntohl() */ +#define sys_ntohl(l) ((((l) << 24) & 0xff000000) \ + | (((l) << 8) & 0xff0000) \ + | (((l) >> 8) & 0xff00) \ + | ((l >> 24) & 0xff)) + +#ifdef _MSC_VER /* MSVS.Net */ +#ifndef __cplusplus +#define inline __inline +#endif +#ifndef ASSUMESTDTYPES /* Standard types have been defined elsewhere */ +#define ssize_t SSIZE_T +typedef char int8_t; +typedef short int16_t; +typedef int int32_t; +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +#endif /* ASSUMESTDTYPES */ +#define WIN32_LEAN_AND_MEAN +#include +#include +#define isnan _isnan +#define finite _finite +#define copysign _copysign +#define ilogb _logb +#else /* !_MSC_VER */ +#include +#endif /* _MSC_VER */ + +#else /* !_WIN32 */ + +#if defined(__vxworks) +#include +#else /* !defined(__vxworks) */ + +#include /* C99 specifies this file */ +/* + * 1. Earlier FreeBSD version didn't have , + * but was present. + * 2. Sun Solaris requires for alloca(3), + * but does not have . + */ +#if (!defined(__FreeBSD__) || !defined(_SYS_INTTYPES_H_)) +#if defined(sun) +#include /* For alloca(3) */ +#include /* for finite(3) */ +#elif defined(__hpux) +#ifdef __GNUC__ +#include /* For alloca(3) */ +#else /* !__GNUC__ */ +#define inline +#endif /* __GNUC__ */ +#else +#include /* SUSv2+ and C99 specify this file, for uintXX_t */ +#endif /* defined(sun) */ +#endif + +#include /* for ntohl() */ +#define sys_ntohl(foo) ntohl(foo) + +#endif /* defined(__vxworks) */ + +#endif /* _WIN32 */ + +#if __GNUC__ >= 3 +#ifndef GCC_PRINTFLIKE +#define GCC_PRINTFLIKE(fmt,var) __attribute__((format(printf,fmt,var))) +#endif +#ifndef GCC_NOTUSED +#define GCC_NOTUSED __attribute__((unused)) +#endif +#else +#ifndef GCC_PRINTFLIKE +#define GCC_PRINTFLIKE(fmt,var) /* nothing */ +#endif +#ifndef GCC_NOTUSED +#define GCC_NOTUSED +#endif +#endif + +/* Figure out if thread safety is requested */ +#if !defined(ASN_THREAD_SAFE) && (defined(THREAD_SAFE) || defined(_REENTRANT)) +#define ASN_THREAD_SAFE +#endif /* Thread safety */ + +#ifndef offsetof /* If not defined by */ +#define offsetof(s, m) ((ptrdiff_t)&(((s *)0)->m) - (ptrdiff_t)((s *)0)) +#endif /* offsetof */ + + +//#ifndef MIN /* Suitable for comparing primitive types (integers) */ +//#if defined(__GNUC__) +//#define MIN(a,b) ({ __typeof a _a = a; __typeof b _b = b; \ +// ((_a)<(_b)?(_a):(_b)); }) +//#else /* !__GNUC__ */ +//#define MIN(a,b) ((a)<(b)?(a):(b)) /* Unsafe variant */ +//#endif /* __GNUC__ */ +//#endif /* MIN */ + +#endif /* ASN_SYSTEM_H */ diff --git a/src/cryptoconditions/src/asn/ber_decoder.c b/src/cryptoconditions/src/asn/ber_decoder.c new file mode 100644 index 000000000..b3a6329e0 --- /dev/null +++ b/src/cryptoconditions/src/asn/ber_decoder.c @@ -0,0 +1,283 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include + +#undef ADVANCE +#define ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + ptr = ((const char *)ptr) + num; \ + size -= num; \ + consumed_myself += num; \ + } while(0) +#undef RETURN +#define RETURN(_code) do { \ + asn_dec_rval_t rval; \ + rval.code = _code; \ + if(opt_ctx) opt_ctx->step = step; /* Save context */ \ + if(_code == RC_OK || opt_ctx) \ + rval.consumed = consumed_myself; \ + else \ + rval.consumed = 0; /* Context-free */ \ + return rval; \ + } while(0) + +/* + * The BER decoder of any type. + */ +asn_dec_rval_t +ber_decode(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *type_descriptor, + void **struct_ptr, const void *ptr, size_t size) { + asn_codec_ctx_t s_codec_ctx; + + /* + * Stack checker requires that the codec context + * must be allocated on the stack. + */ + if(opt_codec_ctx) { + if(opt_codec_ctx->max_stack_size) { + s_codec_ctx = *opt_codec_ctx; + opt_codec_ctx = &s_codec_ctx; + } + } else { + /* If context is not given, be security-conscious anyway */ + memset(&s_codec_ctx, 0, sizeof(s_codec_ctx)); + s_codec_ctx.max_stack_size = ASN__DEFAULT_STACK_MAX; + opt_codec_ctx = &s_codec_ctx; + } + + /* + * Invoke type-specific decoder. + */ + return type_descriptor->ber_decoder(opt_codec_ctx, type_descriptor, + struct_ptr, /* Pointer to the destination structure */ + ptr, size, /* Buffer and its size */ + 0 /* Default tag mode is 0 */ + ); +} + +/* + * Check the set of >> tags matches the definition. + */ +asn_dec_rval_t +ber_check_tags(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, asn_struct_ctx_t *opt_ctx, + const void *ptr, size_t size, int tag_mode, int last_tag_form, + ber_tlv_len_t *last_length, int *opt_tlv_form) { + ssize_t consumed_myself = 0; + ssize_t tag_len; + ssize_t len_len; + ber_tlv_tag_t tlv_tag; + ber_tlv_len_t tlv_len; + ber_tlv_len_t limit_len = -1; + int expect_00_terminators = 0; + int tlv_constr = -1; /* If CHOICE, opt_tlv_form is not given */ + int step = opt_ctx ? opt_ctx->step : 0; /* Where we left previously */ + int tagno; + + /* + * Make sure we didn't exceed the maximum stack size. + */ + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + RETURN(RC_FAIL); + + /* + * So what does all this implicit skip stuff mean? + * Imagine two types, + * A ::= [5] IMPLICIT T + * B ::= [2] EXPLICIT T + * Where T is defined as + * T ::= [4] IMPLICIT SEQUENCE { ... } + * + * Let's say, we are starting to decode type A, given the + * following TLV stream: <5> <0>. What does this mean? + * It means that the type A contains type T which is, + * in turn, empty. + * Remember though, that we are still in A. We cannot + * just pass control to the type T decoder. Why? Because + * the type T decoder expects <4> <0>, not <5> <0>. + * So, we must make sure we are going to receive <5> while + * still in A, then pass control to the T decoder, indicating + * that the tag <4> was implicitly skipped. The decoder of T + * hence will be prepared to treat <4> as valid tag, and decode + * it appropriately. + */ + + tagno = step /* Continuing where left previously */ + + (tag_mode==1?-1:0) + ; + ASN_DEBUG("ber_check_tags(%s, size=%ld, tm=%d, step=%d, tagno=%d)", + td->name, (long)size, tag_mode, step, tagno); + /* assert(td->tags_count >= 1) May not be the case for CHOICE or ANY */ + + if(tag_mode == 0 && tagno == td->tags_count) { + /* + * This must be the _untagged_ ANY type, + * which outermost tag isn't known in advance. + * Fetch the tag and length separately. + */ + tag_len = ber_fetch_tag(ptr, size, &tlv_tag); + switch(tag_len) { + case -1: RETURN(RC_FAIL); + case 0: RETURN(RC_WMORE); + } + tlv_constr = BER_TLV_CONSTRUCTED(ptr); + len_len = ber_fetch_length(tlv_constr, + (const char *)ptr + tag_len, size - tag_len, &tlv_len); + switch(len_len) { + case -1: RETURN(RC_FAIL); + case 0: RETURN(RC_WMORE); + } + ASN_DEBUG("Advancing %ld in ANY case", + (long)(tag_len + len_len)); + ADVANCE(tag_len + len_len); + } else { + assert(tagno < td->tags_count); /* At least one loop */ + } + for((void)tagno; tagno < td->tags_count; tagno++, step++) { + + /* + * Fetch and process T from TLV. + */ + tag_len = ber_fetch_tag(ptr, size, &tlv_tag); + ASN_DEBUG("Fetching tag from {%p,%ld}: " + "len %ld, step %d, tagno %d got %s", + ptr, (long)size, + (long)tag_len, step, tagno, + ber_tlv_tag_string(tlv_tag)); + switch(tag_len) { + case -1: RETURN(RC_FAIL); + case 0: RETURN(RC_WMORE); + } + + tlv_constr = BER_TLV_CONSTRUCTED(ptr); + + /* + * If {I}, don't check anything. + * If {I,B,C}, check B and C unless we're at I. + */ + if(tag_mode != 0 && step == 0) { + /* + * We don't expect tag to match here. + * It's just because we don't know how the tag + * is supposed to look like. + */ + } else { + assert(tagno >= 0); /* Guaranteed by the code above */ + if(tlv_tag != td->tags[tagno]) { + /* + * Unexpected tag. Too bad. + */ + ASN_DEBUG("Expected: %s, " + "expectation failed (tn=%d, tm=%d)", + ber_tlv_tag_string(td->tags[tagno]), + tagno, tag_mode + ); + RETURN(RC_FAIL); + } + } + + /* + * Attention: if there are more tags expected, + * ensure that the current tag is presented + * in constructed form (it contains other tags!). + * If this one is the last one, check that the tag form + * matches the one given in descriptor. + */ + if(tagno < (td->tags_count - 1)) { + if(tlv_constr == 0) { + ASN_DEBUG("tlv_constr = %d, expfail", + tlv_constr); + RETURN(RC_FAIL); + } + } else { + if(last_tag_form != tlv_constr + && last_tag_form != -1) { + ASN_DEBUG("last_tag_form %d != %d", + last_tag_form, tlv_constr); + RETURN(RC_FAIL); + } + } + + /* + * Fetch and process L from TLV. + */ + len_len = ber_fetch_length(tlv_constr, + (const char *)ptr + tag_len, size - tag_len, &tlv_len); + ASN_DEBUG("Fetching len = %ld", (long)len_len); + switch(len_len) { + case -1: RETURN(RC_FAIL); + case 0: RETURN(RC_WMORE); + } + + /* + * FIXME + * As of today, the chain of tags + * must either contain several indefinite length TLVs, + * or several definite length ones. + * No mixing is allowed. + */ + if(tlv_len == -1) { + /* + * Indefinite length. + */ + if(limit_len == -1) { + expect_00_terminators++; + } else { + ASN_DEBUG("Unexpected indefinite length " + "in a chain of definite lengths"); + RETURN(RC_FAIL); + } + ADVANCE(tag_len + len_len); + continue; + } else { + if(expect_00_terminators) { + ASN_DEBUG("Unexpected definite length " + "in a chain of indefinite lengths"); + RETURN(RC_FAIL); + } + } + + /* + * Check that multiple TLVs specify ever decreasing length, + * which is consistent. + */ + if(limit_len == -1) { + limit_len = tlv_len + tag_len + len_len; + if(limit_len < 0) { + /* Too great tlv_len value? */ + RETURN(RC_FAIL); + } + } else if(limit_len != tlv_len + tag_len + len_len) { + /* + * Inner TLV specifies length which is inconsistent + * with the outer TLV's length value. + */ + ASN_DEBUG("Outer TLV is %ld and inner is %ld", + (long)limit_len, (long)tlv_len); + RETURN(RC_FAIL); + } + + ADVANCE(tag_len + len_len); + + limit_len -= (tag_len + len_len); + if((ssize_t)size > limit_len) { + /* + * Make sure that we won't consume more bytes + * from the parent frame than the inferred limit. + */ + size = limit_len; + } + } + + if(opt_tlv_form) + *opt_tlv_form = tlv_constr; + if(expect_00_terminators) + *last_length = -expect_00_terminators; + else + *last_length = tlv_len; + + RETURN(RC_OK); +} diff --git a/src/cryptoconditions/src/asn/ber_decoder.h b/src/cryptoconditions/src/asn/ber_decoder.h new file mode 100644 index 000000000..9fe2e895d --- /dev/null +++ b/src/cryptoconditions/src/asn/ber_decoder.h @@ -0,0 +1,64 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _BER_DECODER_H_ +#define _BER_DECODER_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ +struct asn_codec_ctx_s; /* Forward declaration */ + +/* + * The BER decoder of any type. + * This function may be invoked directly from the application. + * The der_encode() function (der_encoder.h) is an opposite to ber_decode(). + */ +asn_dec_rval_t ber_decode(struct asn_codec_ctx_s *opt_codec_ctx, + struct asn_TYPE_descriptor_s *type_descriptor, + void **struct_ptr, /* Pointer to a target structure's pointer */ + const void *buffer, /* Data to be decoded */ + size_t size /* Size of that buffer */ + ); + +/* + * Type of generic function which decodes the byte stream into the structure. + */ +typedef asn_dec_rval_t (ber_type_decoder_f)( + struct asn_codec_ctx_s *opt_codec_ctx, + struct asn_TYPE_descriptor_s *type_descriptor, + void **struct_ptr, const void *buf_ptr, size_t size, + int tag_mode); + +/******************************* + * INTERNALLY USEFUL FUNCTIONS * + *******************************/ + +/* + * Check that all tags correspond to the type definition (as given in head). + * On return, last_length would contain either a non-negative length of the + * value part of the last TLV, or the negative number of expected + * "end of content" sequences. The number may only be negative if the + * head->last_tag_form is non-zero. + */ +asn_dec_rval_t ber_check_tags( + struct asn_codec_ctx_s *opt_codec_ctx, /* codec options */ + struct asn_TYPE_descriptor_s *type_descriptor, + asn_struct_ctx_t *opt_ctx, /* saved decoding context */ + const void *ptr, size_t size, + int tag_mode, /* {-1,0,1}: IMPLICIT, no, EXPLICIT */ + int last_tag_form, /* {-1,0:1}: any, primitive, constr */ + ber_tlv_len_t *last_length, + int *opt_tlv_form /* optional tag form */ + ); + +#ifdef __cplusplus +} +#endif + +#endif /* _BER_DECODER_H_ */ diff --git a/src/cryptoconditions/src/asn/ber_tlv_length.c b/src/cryptoconditions/src/asn/ber_tlv_length.c new file mode 100644 index 000000000..4c2f1e5fd --- /dev/null +++ b/src/cryptoconditions/src/asn/ber_tlv_length.c @@ -0,0 +1,178 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +ssize_t +ber_fetch_length(int _is_constructed, const void *bufptr, size_t size, + ber_tlv_len_t *len_r) { + const uint8_t *buf = (const uint8_t *)bufptr; + unsigned oct; + + if(size == 0) + return 0; /* Want more */ + + oct = *(const uint8_t *)buf; + if((oct & 0x80) == 0) { + /* + * Short definite length. + */ + *len_r = oct; /* & 0x7F */ + return 1; + } else { + ber_tlv_len_t len; + size_t skipped; + + if(_is_constructed && oct == 0x80) { + *len_r = -1; /* Indefinite length */ + return 1; + } + + if(oct == 0xff) { + /* Reserved in standard for future use. */ + return -1; + } + + oct &= 0x7F; /* Leave only the 7 LS bits */ + for(len = 0, buf++, skipped = 1; + oct && (++skipped <= size); buf++, oct--) { + + len = (len << 8) | *buf; + if(len < 0 + || (len >> ((8 * sizeof(len)) - 8) && oct > 1)) { + /* + * Too large length value. + */ + return -1; + } + } + + if(oct == 0) { + ber_tlv_len_t lenplusepsilon = (size_t)len + 1024; + /* + * Here length may be very close or equal to 2G. + * However, the arithmetics used in some decoders + * may add some (small) quantities to the length, + * to check the resulting value against some limits. + * This may result in integer wrap-around, which + * we try to avoid by checking it earlier here. + */ + if(lenplusepsilon < 0) { + /* Too large length value */ + return -1; + } + + *len_r = len; + return skipped; + } + + return 0; /* Want more */ + } + +} + +ssize_t +ber_skip_length(asn_codec_ctx_t *opt_codec_ctx, + int _is_constructed, const void *ptr, size_t size) { + ber_tlv_len_t vlen; /* Length of V in TLV */ + ssize_t tl; /* Length of L in TLV */ + ssize_t ll; /* Length of L in TLV */ + size_t skip; + + /* + * Make sure we didn't exceed the maximum stack size. + */ + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + return -1; + + /* + * Determine the size of L in TLV. + */ + ll = ber_fetch_length(_is_constructed, ptr, size, &vlen); + if(ll <= 0) return ll; + + /* + * Definite length. + */ + if(vlen >= 0) { + skip = ll + vlen; + if(skip > size) + return 0; /* Want more */ + return skip; + } + + /* + * Indefinite length! + */ + ASN_DEBUG("Skipping indefinite length"); + for(skip = ll, ptr = ((const char *)ptr) + ll, size -= ll;;) { + ber_tlv_tag_t tag; + + /* Fetch the tag */ + tl = ber_fetch_tag(ptr, size, &tag); + if(tl <= 0) return tl; + + ll = ber_skip_length(opt_codec_ctx, + BER_TLV_CONSTRUCTED(ptr), + ((const char *)ptr) + tl, size - tl); + if(ll <= 0) return ll; + + skip += tl + ll; + + /* + * This may be the end of the indefinite length structure, + * two consecutive 0 octets. + * Check if it is true. + */ + if(((const uint8_t *)ptr)[0] == 0 + && ((const uint8_t *)ptr)[1] == 0) + return skip; + + ptr = ((const char *)ptr) + tl + ll; + size -= tl + ll; + } + + /* UNREACHABLE */ +} + +size_t +der_tlv_length_serialize(ber_tlv_len_t len, void *bufp, size_t size) { + size_t required_size; /* Size of len encoding */ + uint8_t *buf = (uint8_t *)bufp; + uint8_t *end; + size_t i; + + if(len <= 127) { + /* Encoded in 1 octet */ + if(size) *buf = (uint8_t)len; + return 1; + } + + /* + * Compute the size of the subsequent bytes. + */ + for(required_size = 1, i = 8; i < 8 * sizeof(len); i += 8) { + if(len >> i) + required_size++; + else + break; + } + + if(size <= required_size) + return required_size + 1; + + *buf++ = (uint8_t)(0x80 | required_size); /* Length of the encoding */ + + /* + * Produce the len encoding, space permitting. + */ + end = buf + required_size; + for(i -= 8; buf < end; i -= 8, buf++) + *buf = (uint8_t)(len >> i); + + return required_size + 1; +} + diff --git a/src/cryptoconditions/src/asn/ber_tlv_length.h b/src/cryptoconditions/src/asn/ber_tlv_length.h new file mode 100644 index 000000000..349680224 --- /dev/null +++ b/src/cryptoconditions/src/asn/ber_tlv_length.h @@ -0,0 +1,50 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _BER_TLV_LENGTH_H_ +#define _BER_TLV_LENGTH_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef ssize_t ber_tlv_len_t; + +/* + * This function tries to fetch the length of the BER TLV value and place it + * in *len_r. + * RETURN VALUES: + * 0: More data expected than bufptr contains. + * -1: Fatal error deciphering length. + * >0: Number of bytes used from bufptr. + * On return with >0, len_r is constrained as -1..MAX, where -1 mean + * that the value is of indefinite length. + */ +ssize_t ber_fetch_length(int _is_constructed, const void *bufptr, size_t size, + ber_tlv_len_t *len_r); + +/* + * This function expects bufptr to be positioned over L in TLV. + * It returns number of bytes occupied by L and V together, suitable + * for skipping. The function properly handles indefinite length. + * RETURN VALUES: + * Standard {-1,0,>0} convention. + */ +ssize_t ber_skip_length( + struct asn_codec_ctx_s *opt_codec_ctx, /* optional context */ + int _is_constructed, const void *bufptr, size_t size); + +/* + * This function serializes the length (L from TLV) in DER format. + * It always returns number of bytes necessary to represent the length, + * it is a caller's responsibility to check the return value + * against the supplied buffer's size. + */ +size_t der_tlv_length_serialize(ber_tlv_len_t len, void *bufptr, size_t size); + +#ifdef __cplusplus +} +#endif + +#endif /* _BER_TLV_LENGTH_H_ */ diff --git a/src/cryptoconditions/src/asn/ber_tlv_tag.c b/src/cryptoconditions/src/asn/ber_tlv_tag.c new file mode 100644 index 000000000..42708760e --- /dev/null +++ b/src/cryptoconditions/src/asn/ber_tlv_tag.c @@ -0,0 +1,144 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +ssize_t +ber_fetch_tag(const void *ptr, size_t size, ber_tlv_tag_t *tag_r) { + ber_tlv_tag_t val; + ber_tlv_tag_t tclass; + size_t skipped; + + if(size == 0) + return 0; + + val = *(const uint8_t *)ptr; + tclass = (val >> 6); + if((val &= 0x1F) != 0x1F) { + /* + * Simple form: everything encoded in a single octet. + * Tag Class is encoded using two least significant bits. + */ + *tag_r = (val << 2) | tclass; + return 1; + } + + /* + * Each octet contains 7 bits of useful information. + * The MSB is 0 if it is the last octet of the tag. + */ + for(val = 0, ptr = ((const char *)ptr) + 1, skipped = 2; + skipped <= size; + ptr = ((const char *)ptr) + 1, skipped++) { + unsigned int oct = *(const uint8_t *)ptr; + if(oct & 0x80) { + val = (val << 7) | (oct & 0x7F); + /* + * Make sure there are at least 9 bits spare + * at the MS side of a value. + */ + if(val >> ((8 * sizeof(val)) - 9)) { + /* + * We would not be able to accomodate + * any more tag bits. + */ + return -1; + } + } else { + val = (val << 7) | oct; + *tag_r = (val << 2) | tclass; + return skipped; + } + } + + return 0; /* Want more */ +} + + +ssize_t +ber_tlv_tag_fwrite(ber_tlv_tag_t tag, FILE *f) { + char buf[sizeof("[APPLICATION ]") + 32]; + ssize_t ret; + + ret = ber_tlv_tag_snprint(tag, buf, sizeof(buf)); + if(ret >= (ssize_t)sizeof(buf) || ret < 2) { + errno = EPERM; + return -1; + } + + return fwrite(buf, 1, ret, f); +} + +ssize_t +ber_tlv_tag_snprint(ber_tlv_tag_t tag, char *buf, size_t size) { + char *type = 0; + int ret; + + switch(tag & 0x3) { + case ASN_TAG_CLASS_UNIVERSAL: type = "UNIVERSAL "; break; + case ASN_TAG_CLASS_APPLICATION: type = "APPLICATION "; break; + case ASN_TAG_CLASS_CONTEXT: type = ""; break; + case ASN_TAG_CLASS_PRIVATE: type = "PRIVATE "; break; + } + + ret = snprintf(buf, size, "[%s%u]", type, ((unsigned)tag) >> 2); + if(ret <= 0 && size) buf[0] = '\0'; /* against broken libc's */ + + return ret; +} + +char * +ber_tlv_tag_string(ber_tlv_tag_t tag) { + static char buf[sizeof("[APPLICATION ]") + 32]; + + (void)ber_tlv_tag_snprint(tag, buf, sizeof(buf)); + + return buf; +} + + +size_t +ber_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufp, size_t size) { + int tclass = BER_TAG_CLASS(tag); + ber_tlv_tag_t tval = BER_TAG_VALUE(tag); + uint8_t *buf = (uint8_t *)bufp; + uint8_t *end; + size_t required_size; + size_t i; + + if(tval <= 30) { + /* Encoded in 1 octet */ + if(size) buf[0] = (tclass << 6) | tval; + return 1; + } else if(size) { + *buf++ = (tclass << 6) | 0x1F; + size--; + } + + /* + * Compute the size of the subsequent bytes. + */ + for(required_size = 1, i = 7; i < 8 * sizeof(tval); i += 7) { + if(tval >> i) + required_size++; + else + break; + } + + if(size < required_size) + return required_size + 1; + + /* + * Fill in the buffer, space permitting. + */ + end = buf + required_size - 1; + for(i -= 7; buf < end; i -= 7, buf++) + *buf = 0x80 | ((tval >> i) & 0x7F); + *buf = (tval & 0x7F); /* Last octet without high bit */ + + return required_size + 1; +} + diff --git a/src/cryptoconditions/src/asn/ber_tlv_tag.h b/src/cryptoconditions/src/asn/ber_tlv_tag.h new file mode 100644 index 000000000..60e866861 --- /dev/null +++ b/src/cryptoconditions/src/asn/ber_tlv_tag.h @@ -0,0 +1,60 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _BER_TLV_TAG_H_ +#define _BER_TLV_TAG_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +enum asn_tag_class { + ASN_TAG_CLASS_UNIVERSAL = 0, /* 0b00 */ + ASN_TAG_CLASS_APPLICATION = 1, /* 0b01 */ + ASN_TAG_CLASS_CONTEXT = 2, /* 0b10 */ + ASN_TAG_CLASS_PRIVATE = 3 /* 0b11 */ +}; +typedef unsigned ber_tlv_tag_t; /* BER TAG from Tag-Length-Value */ + +/* + * Tag class is encoded together with tag value for optimization purposes. + */ +#define BER_TAG_CLASS(tag) ((tag) & 0x3) +#define BER_TAG_VALUE(tag) ((tag) >> 2) +#define BER_TLV_CONSTRUCTED(tagptr) (((*(const uint8_t *)tagptr)&0x20)?1:0) + +#define BER_TAGS_EQUAL(tag1, tag2) ((tag1) == (tag2)) + +/* + * Several functions for printing the TAG in the canonical form + * (i.e. "[PRIVATE 0]"). + * Return values correspond to their libc counterparts (if any). + */ +ssize_t ber_tlv_tag_snprint(ber_tlv_tag_t tag, char *buf, size_t buflen); +ssize_t ber_tlv_tag_fwrite(ber_tlv_tag_t tag, FILE *); +char *ber_tlv_tag_string(ber_tlv_tag_t tag); + + +/* + * This function tries to fetch the tag from the input stream. + * RETURN VALUES: + * 0: More data expected than bufptr contains. + * -1: Fatal error deciphering tag. + * >0: Number of bytes used from bufptr. tag_r will contain the tag. + */ +ssize_t ber_fetch_tag(const void *bufptr, size_t size, ber_tlv_tag_t *tag_r); + +/* + * This function serializes the tag (T from TLV) in BER format. + * It always returns number of bytes necessary to represent the tag, + * it is a caller's responsibility to check the return value + * against the supplied buffer's size. + */ +size_t ber_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufptr, size_t size); + +#ifdef __cplusplus +} +#endif + +#endif /* _BER_TLV_TAG_H_ */ diff --git a/src/cryptoconditions/src/asn/constr_CHOICE.c b/src/cryptoconditions/src/asn/constr_CHOICE.c new file mode 100644 index 000000000..6116e6a6b --- /dev/null +++ b/src/cryptoconditions/src/asn/constr_CHOICE.c @@ -0,0 +1,1114 @@ +/* + * Copyright (c) 2003, 2004, 2005, 2006, 2007 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * Number of bytes left for this structure. + * (ctx->left) indicates the number of bytes _transferred_ for the structure. + * (size) contains the number of bytes in the buffer passed. + */ +#define LEFT ((size<(size_t)ctx->left)?size:(size_t)ctx->left) + +/* + * If the subprocessor function returns with an indication that it wants + * more data, it may well be a fatal decoding problem, because the + * size is constrained by the 's L, even if the buffer size allows + * reading more data. + * For example, consider the buffer containing the following TLVs: + * ... + * The TLV length clearly indicates that one byte is expected in V, but + * if the V processor returns with "want more data" even if the buffer + * contains way more data than the V processor have seen. + */ +#define SIZE_VIOLATION (ctx->left >= 0 && (size_t)ctx->left <= size) + +/* + * This macro "eats" the part of the buffer which is definitely "consumed", + * i.e. was correctly converted into local representation or rightfully skipped. + */ +#undef ADVANCE +#define ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + ptr = ((const char *)ptr) + num;\ + size -= num; \ + if(ctx->left >= 0) \ + ctx->left -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Switch to the next phase of parsing. + */ +#undef NEXT_PHASE +#define NEXT_PHASE(ctx) do { \ + ctx->phase++; \ + ctx->step = 0; \ + } while(0) + +/* + * Return a standardized complex structure. + */ +#undef RETURN +#define RETURN(_code) do { \ + rval.code = _code; \ + rval.consumed = consumed_myself;\ + return rval; \ + } while(0) + +/* + * See the definitions. + */ +static int _fetch_present_idx(const void *struct_ptr, int off, int size); +static void _set_present_idx(void *sptr, int offset, int size, int pres); + +/* + * Tags are canonically sorted in the tag to member table. + */ +static int +_search4tag(const void *ap, const void *bp) { + const asn_TYPE_tag2member_t *a = (const asn_TYPE_tag2member_t *)ap; + const asn_TYPE_tag2member_t *b = (const asn_TYPE_tag2member_t *)bp; + + int a_class = BER_TAG_CLASS(a->el_tag); + int b_class = BER_TAG_CLASS(b->el_tag); + + if(a_class == b_class) { + ber_tlv_tag_t a_value = BER_TAG_VALUE(a->el_tag); + ber_tlv_tag_t b_value = BER_TAG_VALUE(b->el_tag); + + if(a_value == b_value) + return 0; + else if(a_value < b_value) + return -1; + else + return 1; + } else if(a_class < b_class) { + return -1; + } else { + return 1; + } +} + +/* + * The decoder of the CHOICE type. + */ +asn_dec_rval_t +CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **struct_ptr, const void *ptr, size_t size, int tag_mode) { + /* + * Bring closer parts of structure description. + */ + asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; + asn_TYPE_member_t *elements = td->elements; + + /* + * Parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + asn_struct_ctx_t *ctx; /* Decoder context */ + + ber_tlv_tag_t tlv_tag; /* T from TLV */ + ssize_t tag_len; /* Length of TLV's T */ + asn_dec_rval_t rval; /* Return code from subparsers */ + + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + + ASN_DEBUG("Decoding %s as CHOICE", td->name); + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) { + RETURN(RC_FAIL); + } + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + /* + * Start to parse where left previously + */ + switch(ctx->phase) { + case 0: + /* + * PHASE 0. + * Check that the set of tags associated with given structure + * perfectly fits our expectations. + */ + + if(tag_mode || td->tags_count) { + rval = ber_check_tags(opt_codec_ctx, td, ctx, ptr, size, + tag_mode, -1, &ctx->left, 0); + if(rval.code != RC_OK) { + ASN_DEBUG("%s tagging check failed: %d", + td->name, rval.code); + return rval; + } + + if(ctx->left >= 0) { + /* ?Substracted below! */ + ctx->left += rval.consumed; + } + ADVANCE(rval.consumed); + } else { + ctx->left = -1; + } + + NEXT_PHASE(ctx); + + ASN_DEBUG("Structure consumes %ld bytes, buffer %ld", + (long)ctx->left, (long)size); + + /* Fall through */ + case 1: + /* + * Fetch the T from TLV. + */ + tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag); + ASN_DEBUG("In %s CHOICE tag length %d", td->name, (int)tag_len); + switch(tag_len) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + do { + const asn_TYPE_tag2member_t *t2m; + asn_TYPE_tag2member_t key; + + key.el_tag = tlv_tag; + t2m = (const asn_TYPE_tag2member_t *)bsearch(&key, + specs->tag2el, specs->tag2el_count, + sizeof(specs->tag2el[0]), _search4tag); + if(t2m) { + /* + * Found the element corresponding to the tag. + */ + NEXT_PHASE(ctx); + ctx->step = t2m->el_no; + break; + } else if(specs->ext_start == -1) { + ASN_DEBUG("Unexpected tag %s " + "in non-extensible CHOICE %s", + ber_tlv_tag_string(tlv_tag), td->name); + RETURN(RC_FAIL); + } else { + /* Skip this tag */ + ssize_t skip; + + ASN_DEBUG("Skipping unknown tag %s", + ber_tlv_tag_string(tlv_tag)); + + skip = ber_skip_length(opt_codec_ctx, + BER_TLV_CONSTRUCTED(ptr), + (const char *)ptr + tag_len, + LEFT - tag_len); + + switch(skip) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + ADVANCE(skip + tag_len); + RETURN(RC_OK); + } + } while(0); + + case 2: + /* + * PHASE 2. + * Read in the element. + */ + do { + asn_TYPE_member_t *elm;/* CHOICE's element */ + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + + elm = &elements[ctx->step]; + + /* + * Compute the position of the member inside a structure, + * and also a type of containment (it may be contained + * as pointer or using inline inclusion). + */ + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + /* + * A pointer to a pointer + * holding the start of the structure + */ + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + /* Set presence to be able to free it properly at any time */ + _set_present_idx(st, specs->pres_offset, + specs->pres_size, ctx->step + 1); + /* + * Invoke the member fetch routine according to member's type + */ + rval = elm->type->ber_decoder(opt_codec_ctx, elm->type, + memb_ptr2, ptr, LEFT, elm->tag_mode); + switch(rval.code) { + case RC_OK: + break; + case RC_WMORE: /* More data expected */ + if(!SIZE_VIOLATION) { + ADVANCE(rval.consumed); + RETURN(RC_WMORE); + } + RETURN(RC_FAIL); + case RC_FAIL: /* Fatal error */ + RETURN(rval.code); + } /* switch(rval) */ + + ADVANCE(rval.consumed); + } while(0); + + NEXT_PHASE(ctx); + + /* Fall through */ + case 3: + ASN_DEBUG("CHOICE %s Leftover: %ld, size = %ld, tm=%d, tc=%d", + td->name, (long)ctx->left, (long)size, + tag_mode, td->tags_count); + + if(ctx->left > 0) { + /* + * The type must be fully decoded + * by the CHOICE member-specific decoder. + */ + RETURN(RC_FAIL); + } + + if(ctx->left == -1 + && !(tag_mode || td->tags_count)) { + /* + * This is an untagged CHOICE. + * It doesn't contain nothing + * except for the member itself, including all its tags. + * The decoding is completed. + */ + NEXT_PHASE(ctx); + break; + } + + /* + * Read in the "end of data chunks"'s. + */ + while(ctx->left < 0) { + ssize_t tl; + + tl = ber_fetch_tag(ptr, LEFT, &tlv_tag); + switch(tl) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + /* + * Expected <0><0>... + */ + if(((const uint8_t *)ptr)[0] == 0) { + if(LEFT < 2) { + if(SIZE_VIOLATION) + RETURN(RC_FAIL); + else + RETURN(RC_WMORE); + } else if(((const uint8_t *)ptr)[1] == 0) { + /* + * Correctly finished with <0><0>. + */ + ADVANCE(2); + ctx->left++; + continue; + } + } else { + ASN_DEBUG("Unexpected continuation in %s", + td->name); + RETURN(RC_FAIL); + } + + /* UNREACHABLE */ + } + + NEXT_PHASE(ctx); + case 4: + /* No meaningful work here */ + break; + } + + RETURN(RC_OK); +} + +asn_enc_rval_t +CHOICE_encode_der(asn_TYPE_descriptor_t *td, void *sptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; + asn_TYPE_member_t *elm; /* CHOICE element */ + asn_enc_rval_t erval; + void *memb_ptr; + size_t computed_size = 0; + int present; + + if(!sptr) ASN__ENCODE_FAILED; + + ASN_DEBUG("%s %s as CHOICE", + cb?"Encoding":"Estimating", td->name); + + present = _fetch_present_idx(sptr, + specs->pres_offset, specs->pres_size); + + /* + * If the structure was not initialized, it cannot be encoded: + * can't deduce what to encode in the choice type. + */ + if(present <= 0 || present > td->elements_count) { + if(present == 0 && td->elements_count == 0) { + /* The CHOICE is empty?! */ + erval.encoded = 0; + ASN__ENCODED_OK(erval); + } + ASN__ENCODE_FAILED; + } + + /* + * Seek over the present member of the structure. + */ + elm = &td->elements[present-1]; + if(elm->flags & ATF_POINTER) { + memb_ptr = *(void **)((char *)sptr + elm->memb_offset); + if(memb_ptr == 0) { + if(elm->optional) { + erval.encoded = 0; + ASN__ENCODED_OK(erval); + } + /* Mandatory element absent */ + ASN__ENCODE_FAILED; + } + } else { + memb_ptr = (void *)((char *)sptr + elm->memb_offset); + } + + /* + * If the CHOICE itself is tagged EXPLICIT: + * T ::= [2] EXPLICIT CHOICE { ... } + * Then emit the appropriate tags. + */ + if(tag_mode == 1 || td->tags_count) { + /* + * For this, we need to pre-compute the member. + */ + ssize_t ret; + + /* Encode member with its tag */ + erval = elm->type->der_encoder(elm->type, memb_ptr, + elm->tag_mode, elm->tag, 0, 0); + if(erval.encoded == -1) + return erval; + + /* Encode CHOICE with parent or my own tag */ + ret = der_write_tags(td, erval.encoded, tag_mode, 1, tag, + cb, app_key); + if(ret == -1) + ASN__ENCODE_FAILED; + computed_size += ret; + } + + /* + * Encode the single underlying member. + */ + erval = elm->type->der_encoder(elm->type, memb_ptr, + elm->tag_mode, elm->tag, cb, app_key); + if(erval.encoded == -1) + return erval; + + ASN_DEBUG("Encoded CHOICE member in %ld bytes (+%ld)", + (long)erval.encoded, (long)computed_size); + + erval.encoded += computed_size; + + return erval; +} + +ber_tlv_tag_t +CHOICE_outmost_tag(const asn_TYPE_descriptor_t *td, const void *ptr, int tag_mode, ber_tlv_tag_t tag) { + asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; + int present; + + assert(tag_mode == 0); (void)tag_mode; + assert(tag == 0); (void)tag; + + /* + * Figure out which CHOICE element is encoded. + */ + present = _fetch_present_idx(ptr, specs->pres_offset, specs->pres_size); + + if(present > 0 || present <= td->elements_count) { + const asn_TYPE_member_t *elm = &td->elements[present-1]; + const void *memb_ptr; + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(const void * const *) + ((const char *)ptr + elm->memb_offset); + } else { + memb_ptr = (const void *) + ((const char *)ptr + elm->memb_offset); + } + + return asn_TYPE_outmost_tag(elm->type, memb_ptr, + elm->tag_mode, elm->tag); + } else { + return (ber_tlv_tag_t)-1; + } +} + +int +CHOICE_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; + int present; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + /* + * Figure out which CHOICE element is encoded. + */ + present = _fetch_present_idx(sptr, specs->pres_offset,specs->pres_size); + if(present > 0 && present <= td->elements_count) { + asn_TYPE_member_t *elm = &td->elements[present-1]; + const void *memb_ptr; + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) { + if(elm->optional) + return 0; + ASN__CTFAIL(app_key, td, sptr, + "%s: mandatory CHOICE element %s absent (%s:%d)", + td->name, elm->name, __FILE__, __LINE__); + return -1; + } + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + if(elm->memb_constraints) { + return elm->memb_constraints(elm->type, memb_ptr, + ctfailcb, app_key); + } else { + int ret = elm->type->check_constraints(elm->type, + memb_ptr, ctfailcb, app_key); + /* + * Cannot inherit it eralier: + * need to make sure we get the updated version. + */ + elm->memb_constraints = elm->type->check_constraints; + return ret; + } + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: no CHOICE element given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +#undef XER_ADVANCE +#define XER_ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + buf_ptr = (const void *)(((const char *)buf_ptr) + num); \ + size -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Decode the XER (XML) data. + */ +asn_dec_rval_t +CHOICE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **struct_ptr, const char *opt_mname, + const void *buf_ptr, size_t size) { + /* + * Bring closer parts of structure description. + */ + asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; + const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; + + /* + * Parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + asn_struct_ctx_t *ctx; /* Decoder context */ + + asn_dec_rval_t rval; /* Return value of a decoder */ + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + int edx; /* Element index */ + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) RETURN(RC_FAIL); + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + if(ctx->phase == 0 && !*xml_tag) + ctx->phase = 1; /* Skip the outer tag checking phase */ + + /* + * Phases of XER/XML processing: + * Phase 0: Check that the opening tag matches our expectations. + * Phase 1: Processing body and reacting on closing tag. + * Phase 2: Processing inner type. + * Phase 3: Only waiting for closing tag. + * Phase 4: Skipping unknown extensions. + * Phase 5: PHASED OUT + */ + for(edx = ctx->step; ctx->phase <= 4;) { + pxer_chunk_type_e ch_type; /* XER chunk type */ + ssize_t ch_size; /* Chunk size */ + xer_check_tag_e tcv; /* Tag check value */ + asn_TYPE_member_t *elm; + + /* + * Go inside the member. + */ + if(ctx->phase == 2) { + asn_dec_rval_t tmprval; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + + elm = &td->elements[edx]; + + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + + /* Start/Continue decoding the inner member */ + tmprval = elm->type->xer_decoder(opt_codec_ctx, + elm->type, memb_ptr2, elm->name, + buf_ptr, size); + XER_ADVANCE(tmprval.consumed); + ASN_DEBUG("XER/CHOICE: itdf: [%s] code=%d", + elm->type->name, tmprval.code); + if(tmprval.code != RC_OK) + RETURN(tmprval.code); + assert(_fetch_present_idx(st, + specs->pres_offset, specs->pres_size) == 0); + /* Record what we've got */ + _set_present_idx(st, + specs->pres_offset, specs->pres_size, edx + 1); + ctx->phase = 3; + /* Fall through */ + } + + /* No need to wait for closing tag; special mode. */ + if(ctx->phase == 3 && !*xml_tag) { + ctx->phase = 5; /* Phase out */ + RETURN(RC_OK); + } + + /* + * Get the next part of the XML stream. + */ + ch_size = xer_next_token(&ctx->context, buf_ptr, size, &ch_type); + if(ch_size == -1) { + RETURN(RC_FAIL); + } else { + switch(ch_type) { + case PXER_WMORE: + RETURN(RC_WMORE); + case PXER_COMMENT: /* Got XML comment */ + case PXER_TEXT: /* Ignore free-standing text */ + XER_ADVANCE(ch_size); /* Skip silently */ + continue; + case PXER_TAG: + break; /* Check the rest down there */ + } + } + + tcv = xer_check_tag(buf_ptr, ch_size, xml_tag); + ASN_DEBUG("XER/CHOICE checked [%c%c%c%c] vs [%s], tcv=%d", + ch_size>0?((const uint8_t *)buf_ptr)[0]:'?', + ch_size>1?((const uint8_t *)buf_ptr)[1]:'?', + ch_size>2?((const uint8_t *)buf_ptr)[2]:'?', + ch_size>3?((const uint8_t *)buf_ptr)[3]:'?', + xml_tag, tcv); + + /* Skip the extensions section */ + if(ctx->phase == 4) { + ASN_DEBUG("skip_unknown(%d, %ld)", + tcv, (long)ctx->left); + switch(xer_skip_unknown(tcv, &ctx->left)) { + case -1: + ctx->phase = 5; + RETURN(RC_FAIL); + continue; + case 1: + ctx->phase = 3; + /* Fall through */ + case 0: + XER_ADVANCE(ch_size); + continue; + case 2: + ctx->phase = 3; + break; + } + } + + switch(tcv) { + case XCT_BOTH: + break; /* No CHOICE? */ + case XCT_CLOSING: + if(ctx->phase != 3) + break; + XER_ADVANCE(ch_size); + ctx->phase = 5; /* Phase out */ + RETURN(RC_OK); + case XCT_OPENING: + if(ctx->phase == 0) { + XER_ADVANCE(ch_size); + ctx->phase = 1; /* Processing body phase */ + continue; + } + /* Fall through */ + case XCT_UNKNOWN_OP: + case XCT_UNKNOWN_BO: + + if(ctx->phase != 1) + break; /* Really unexpected */ + + /* + * Search which inner member corresponds to this tag. + */ + for(edx = 0; edx < td->elements_count; edx++) { + elm = &td->elements[edx]; + tcv = xer_check_tag(buf_ptr,ch_size,elm->name); + switch(tcv) { + case XCT_BOTH: + case XCT_OPENING: + /* + * Process this member. + */ + ctx->step = edx; + ctx->phase = 2; + break; + case XCT_UNKNOWN_OP: + case XCT_UNKNOWN_BO: + continue; + default: + edx = td->elements_count; + break; /* Phase out */ + } + break; + } + if(edx != td->elements_count) + continue; + + /* It is expected extension */ + if(specs->ext_start != -1) { + ASN_DEBUG("Got anticipated extension"); + /* + * Check for (XCT_BOTH or XCT_UNKNOWN_BO) + * By using a mask. Only record a pure + * tags. + */ + if(tcv & XCT_CLOSING) { + /* Found without body */ + ctx->phase = 3; /* Terminating */ + } else { + ctx->left = 1; + ctx->phase = 4; /* Skip ...'s */ + } + XER_ADVANCE(ch_size); + continue; + } + + /* Fall through */ + default: + break; + } + + ASN_DEBUG("Unexpected XML tag [%c%c%c%c] in CHOICE [%s]" + " (ph=%d, tag=%s)", + ch_size>0?((const uint8_t *)buf_ptr)[0]:'?', + ch_size>1?((const uint8_t *)buf_ptr)[1]:'?', + ch_size>2?((const uint8_t *)buf_ptr)[2]:'?', + ch_size>3?((const uint8_t *)buf_ptr)[3]:'?', + td->name, ctx->phase, xml_tag); + break; + } + + ctx->phase = 5; /* Phase out, just in case */ + RETURN(RC_FAIL); +} + + +asn_enc_rval_t +CHOICE_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_CHOICE_specifics_t *specs=(asn_CHOICE_specifics_t *)td->specifics; + asn_enc_rval_t er; + int present; + + if(!sptr) + ASN__ENCODE_FAILED; + + /* + * Figure out which CHOICE element is encoded. + */ + present = _fetch_present_idx(sptr, specs->pres_offset,specs->pres_size); + + if(present <= 0 || present > td->elements_count) { + ASN__ENCODE_FAILED; + } else { + asn_enc_rval_t tmper; + asn_TYPE_member_t *elm = &td->elements[present-1]; + void *memb_ptr; + const char *mname = elm->name; + unsigned int mlen = strlen(mname); + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(void **)((char *)sptr + elm->memb_offset); + if(!memb_ptr) ASN__ENCODE_FAILED; + } else { + memb_ptr = (void *)((char *)sptr + elm->memb_offset); + } + + er.encoded = 0; + + if(!(flags & XER_F_CANONICAL)) ASN__TEXT_INDENT(1, ilevel); + ASN__CALLBACK3("<", 1, mname, mlen, ">", 1); + + tmper = elm->type->xer_encoder(elm->type, memb_ptr, + ilevel + 1, flags, cb, app_key); + if(tmper.encoded == -1) return tmper; + + ASN__CALLBACK3("", 1); + + er.encoded += 5 + (2 * mlen) + tmper.encoded; + } + + if(!(flags & XER_F_CANONICAL)) ASN__TEXT_INDENT(1, ilevel - 1); + + ASN__ENCODED_OK(er); +cb_failed: + ASN__ENCODE_FAILED; +} + +asn_dec_rval_t +CHOICE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; + asn_dec_rval_t rv; + asn_per_constraint_t *ct; + asn_TYPE_member_t *elm; /* CHOICE's element */ + void *memb_ptr; + void **memb_ptr2; + void *st = *sptr; + int value; + + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + ASN__DECODE_FAILED; + + /* + * Create the target structure if it is not present already. + */ + if(!st) { + st = *sptr = CALLOC(1, specs->struct_size); + if(!st) ASN__DECODE_FAILED; + } + + if(constraints) ct = &constraints->value; + else if(td->per_constraints) ct = &td->per_constraints->value; + else ct = 0; + + if(ct && ct->flags & APC_EXTENSIBLE) { + value = per_get_few_bits(pd, 1); + if(value < 0) ASN__DECODE_STARVED; + if(value) ct = 0; /* Not restricted */ + } + + if(ct && ct->range_bits >= 0) { + value = per_get_few_bits(pd, ct->range_bits); + if(value < 0) ASN__DECODE_STARVED; + ASN_DEBUG("CHOICE %s got index %d in range %d", + td->name, value, ct->range_bits); + if(value > ct->upper_bound) + ASN__DECODE_FAILED; + } else { + if(specs->ext_start == -1) + ASN__DECODE_FAILED; + value = uper_get_nsnnwn(pd); + if(value < 0) ASN__DECODE_STARVED; + value += specs->ext_start; + if(value >= td->elements_count) + ASN__DECODE_FAILED; + } + + /* Adjust if canonical order is different from natural order */ + if(specs->canonical_order) + value = specs->canonical_order[value]; + + /* Set presence to be able to free it later */ + _set_present_idx(st, specs->pres_offset, specs->pres_size, value + 1); + + elm = &td->elements[value]; + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + ASN_DEBUG("Discovered CHOICE %s encodes %s", td->name, elm->name); + + if(ct && ct->range_bits >= 0) { + rv = elm->type->uper_decoder(opt_codec_ctx, elm->type, + elm->per_constraints, memb_ptr2, pd); + } else { + rv = uper_open_type_get(opt_codec_ctx, elm->type, + elm->per_constraints, memb_ptr2, pd); + } + + if(rv.code != RC_OK) + ASN_DEBUG("Failed to decode %s in %s (CHOICE) %d", + elm->name, td->name, rv.code); + return rv; +} + +asn_enc_rval_t +CHOICE_encode_uper(asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { + asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; + asn_TYPE_member_t *elm; /* CHOICE's element */ + asn_per_constraint_t *ct; + void *memb_ptr; + int present; + int present_enc; + + if(!sptr) ASN__ENCODE_FAILED; + + ASN_DEBUG("Encoding %s as CHOICE", td->name); + + if(constraints) ct = &constraints->value; + else if(td->per_constraints) ct = &td->per_constraints->value; + else ct = 0; + + present = _fetch_present_idx(sptr, + specs->pres_offset, specs->pres_size); + + /* + * If the structure was not initialized properly, it cannot be encoded: + * can't deduce what to encode in the choice type. + */ + if(present <= 0 || present > td->elements_count) + ASN__ENCODE_FAILED; + else + present--; + + ASN_DEBUG("Encoding %s CHOICE element %d", td->name, present); + + /* Adjust if canonical order is different from natural order */ + if(specs->canonical_order) + present_enc = specs->canonical_order[present]; + else + present_enc = present; + + if(ct && ct->range_bits >= 0) { + if(present_enc < ct->lower_bound + || present_enc > ct->upper_bound) { + if(ct->flags & APC_EXTENSIBLE) { + if(per_put_few_bits(po, 1, 1)) + ASN__ENCODE_FAILED; + } else { + ASN__ENCODE_FAILED; + } + ct = 0; + } + } + if(ct && ct->flags & APC_EXTENSIBLE) + if(per_put_few_bits(po, 0, 1)) + ASN__ENCODE_FAILED; + + elm = &td->elements[present]; + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr = *(void **)((char *)sptr + elm->memb_offset); + if(!memb_ptr) ASN__ENCODE_FAILED; + } else { + memb_ptr = (char *)sptr + elm->memb_offset; + } + + if(ct && ct->range_bits >= 0) { + if(per_put_few_bits(po, present_enc, ct->range_bits)) + ASN__ENCODE_FAILED; + + return elm->type->uper_encoder(elm->type, elm->per_constraints, + memb_ptr, po); + } else { + asn_enc_rval_t rval; + if(specs->ext_start == -1) + ASN__ENCODE_FAILED; + if(uper_put_nsnnwn(po, present_enc - specs->ext_start)) + ASN__ENCODE_FAILED; + if(uper_open_type_put(elm->type, elm->per_constraints, + memb_ptr, po)) + ASN__ENCODE_FAILED; + rval.encoded = 0; + ASN__ENCODED_OK(rval); + } +} + + +int +CHOICE_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; + int present; + + if(!sptr) return (cb("", 8, app_key) < 0) ? -1 : 0; + + /* + * Figure out which CHOICE element is encoded. + */ + present = _fetch_present_idx(sptr, specs->pres_offset,specs->pres_size); + + /* + * Print that element. + */ + if(present > 0 && present <= td->elements_count) { + asn_TYPE_member_t *elm = &td->elements[present-1]; + const void *memb_ptr; + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) return (cb("", 8, app_key) < 0) ? -1 : 0; + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + /* Print member's name and stuff */ + if(0) { + if(cb(elm->name, strlen(elm->name), app_key) < 0 + || cb(": ", 2, app_key) < 0) + return -1; + } + + return elm->type->print_struct(elm->type, memb_ptr, ilevel, + cb, app_key); + } else { + return (cb("", 8, app_key) < 0) ? -1 : 0; + } +} + +void +CHOICE_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) { + asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; + int present; + + if(!td || !ptr) + return; + + ASN_DEBUG("Freeing %s as CHOICE", td->name); + + /* + * Figure out which CHOICE element is encoded. + */ + present = _fetch_present_idx(ptr, specs->pres_offset, specs->pres_size); + + /* + * Free that element. + */ + if(present > 0 && present <= td->elements_count) { + asn_TYPE_member_t *elm = &td->elements[present-1]; + void *memb_ptr; + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(void **)((char *)ptr + elm->memb_offset); + if(memb_ptr) + ASN_STRUCT_FREE(*elm->type, memb_ptr); + } else { + memb_ptr = (void *)((char *)ptr + elm->memb_offset); + ASN_STRUCT_FREE_CONTENTS_ONLY(*elm->type, memb_ptr); + } + } + + if(!contents_only) { + FREEMEM(ptr); + } +} + + +/* + * The following functions functions offer protection against -fshort-enums, + * compatible with little- and big-endian machines. + * If assertion is triggered, either disable -fshort-enums, or add an entry + * here with the ->pres_size of your target stracture. + * Unless the target structure is packed, the ".present" member + * is guaranteed to be aligned properly. ASN.1 compiler itself does not + * produce packed code. + */ +static int +_fetch_present_idx(const void *struct_ptr, int pres_offset, int pres_size) { + const void *present_ptr; + int present; + + present_ptr = ((const char *)struct_ptr) + pres_offset; + + switch(pres_size) { + case sizeof(int): present = *(const int *)present_ptr; break; + case sizeof(short): present = *(const short *)present_ptr; break; + case sizeof(char): present = *(const char *)present_ptr; break; + default: + /* ANSI C mandates enum to be equivalent to integer */ + assert(pres_size != sizeof(int)); + return 0; /* If not aborted, pass back safe value */ + } + + return present; +} + +static void +_set_present_idx(void *struct_ptr, int pres_offset, int pres_size, int present) { + void *present_ptr; + present_ptr = ((char *)struct_ptr) + pres_offset; + + switch(pres_size) { + case sizeof(int): *(int *)present_ptr = present; break; + case sizeof(short): *(short *)present_ptr = present; break; + case sizeof(char): *(char *)present_ptr = present; break; + default: + /* ANSI C mandates enum to be equivalent to integer */ + assert(pres_size != sizeof(int)); + } +} diff --git a/src/cryptoconditions/src/asn/constr_CHOICE.h b/src/cryptoconditions/src/asn/constr_CHOICE.h new file mode 100644 index 000000000..e824a2206 --- /dev/null +++ b/src/cryptoconditions/src/asn/constr_CHOICE.h @@ -0,0 +1,57 @@ +/*- + * Copyright (c) 2003, 2004, 2005 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _CONSTR_CHOICE_H_ +#define _CONSTR_CHOICE_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef const struct asn_CHOICE_specifics_s { + /* + * Target structure description. + */ + int struct_size; /* Size of the target structure. */ + int ctx_offset; /* Offset of the asn_codec_ctx_t member */ + int pres_offset; /* Identifier of the present member */ + int pres_size; /* Size of the identifier (enum) */ + + /* + * Tags to members mapping table. + */ + const asn_TYPE_tag2member_t *tag2el; + int tag2el_count; + + /* Canonical ordering of CHOICE elements, for PER */ + int *canonical_order; + + /* + * Extensions-related stuff. + */ + int ext_start; /* First member of extensions, or -1 */ +} asn_CHOICE_specifics_t; + +/* + * A set specialized functions dealing with the CHOICE type. + */ +asn_struct_free_f CHOICE_free; +asn_struct_print_f CHOICE_print; +asn_constr_check_f CHOICE_constraint; +ber_type_decoder_f CHOICE_decode_ber; +der_type_encoder_f CHOICE_encode_der; +xer_type_decoder_f CHOICE_decode_xer; +xer_type_encoder_f CHOICE_encode_xer; +per_type_decoder_f CHOICE_decode_uper; +per_type_encoder_f CHOICE_encode_uper; +asn_outmost_tag_f CHOICE_outmost_tag; + +#ifdef __cplusplus +} +#endif + +#endif /* _CONSTR_CHOICE_H_ */ diff --git a/src/cryptoconditions/src/asn/constr_SEQUENCE.c b/src/cryptoconditions/src/asn/constr_SEQUENCE.c new file mode 100644 index 000000000..5923023de --- /dev/null +++ b/src/cryptoconditions/src/asn/constr_SEQUENCE.c @@ -0,0 +1,1425 @@ +/*- + * Copyright (c) 2003, 2004, 2005, 2006, 2007 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * Number of bytes left for this structure. + * (ctx->left) indicates the number of bytes _transferred_ for the structure. + * (size) contains the number of bytes in the buffer passed. + */ +#define LEFT ((size<(size_t)ctx->left)?size:(size_t)ctx->left) + +/* + * If the subprocessor function returns with an indication that it wants + * more data, it may well be a fatal decoding problem, because the + * size is constrained by the 's L, even if the buffer size allows + * reading more data. + * For example, consider the buffer containing the following TLVs: + * ... + * The TLV length clearly indicates that one byte is expected in V, but + * if the V processor returns with "want more data" even if the buffer + * contains way more data than the V processor have seen. + */ +#define SIZE_VIOLATION (ctx->left >= 0 && (size_t)ctx->left <= size) + +/* + * This macro "eats" the part of the buffer which is definitely "consumed", + * i.e. was correctly converted into local representation or rightfully skipped. + */ +#undef ADVANCE +#define ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + ptr = ((const char *)ptr) + num; \ + size -= num; \ + if(ctx->left >= 0) \ + ctx->left -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Switch to the next phase of parsing. + */ +#undef NEXT_PHASE +#undef PHASE_OUT +#define NEXT_PHASE(ctx) do { \ + ctx->phase++; \ + ctx->step = 0; \ + } while(0) +#define PHASE_OUT(ctx) do { ctx->phase = 10; } while(0) + +/* + * Return a standardized complex structure. + */ +#undef RETURN +#define RETURN(_code) do { \ + rval.code = _code; \ + rval.consumed = consumed_myself;\ + return rval; \ + } while(0) + +/* + * Check whether we are inside the extensions group. + */ +#define IN_EXTENSION_GROUP(specs, memb_idx) \ + ( ((memb_idx) > (specs)->ext_after) \ + &&((memb_idx) < (specs)->ext_before)) + + +/* + * Tags are canonically sorted in the tag2element map. + */ +static int +_t2e_cmp(const void *ap, const void *bp) { + const asn_TYPE_tag2member_t *a = (const asn_TYPE_tag2member_t *)ap; + const asn_TYPE_tag2member_t *b = (const asn_TYPE_tag2member_t *)bp; + + int a_class = BER_TAG_CLASS(a->el_tag); + int b_class = BER_TAG_CLASS(b->el_tag); + + if(a_class == b_class) { + ber_tlv_tag_t a_value = BER_TAG_VALUE(a->el_tag); + ber_tlv_tag_t b_value = BER_TAG_VALUE(b->el_tag); + + if(a_value == b_value) { + if(a->el_no > b->el_no) + return 1; + /* + * Important: we do not check + * for a->el_no <= b->el_no! + */ + return 0; + } else if(a_value < b_value) + return -1; + else + return 1; + } else if(a_class < b_class) { + return -1; + } else { + return 1; + } +} + + +/* + * The decoder of the SEQUENCE type. + */ +asn_dec_rval_t +SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **struct_ptr, const void *ptr, size_t size, int tag_mode) { + /* + * Bring closer parts of structure description. + */ + asn_SEQUENCE_specifics_t *specs = (asn_SEQUENCE_specifics_t *)td->specifics; + asn_TYPE_member_t *elements = td->elements; + + /* + * Parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + asn_struct_ctx_t *ctx; /* Decoder context */ + + ber_tlv_tag_t tlv_tag; /* T from TLV */ + asn_dec_rval_t rval; /* Return code from subparsers */ + + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + int edx; /* SEQUENCE element's index */ + + ASN_DEBUG("Decoding %s as SEQUENCE", td->name); + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) { + RETURN(RC_FAIL); + } + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + /* + * Start to parse where left previously + */ + switch(ctx->phase) { + case 0: + /* + * PHASE 0. + * Check that the set of tags associated with given structure + * perfectly fits our expectations. + */ + + rval = ber_check_tags(opt_codec_ctx, td, ctx, ptr, size, + tag_mode, 1, &ctx->left, 0); + if(rval.code != RC_OK) { + ASN_DEBUG("%s tagging check failed: %d", + td->name, rval.code); + return rval; + } + + if(ctx->left >= 0) + ctx->left += rval.consumed; /* ?Substracted below! */ + ADVANCE(rval.consumed); + + NEXT_PHASE(ctx); + + ASN_DEBUG("Structure consumes %ld bytes, buffer %ld", + (long)ctx->left, (long)size); + + /* Fall through */ + case 1: + /* + * PHASE 1. + * From the place where we've left it previously, + * try to decode the next member from the list of + * this structure's elements. + * (ctx->step) stores the member being processed + * between invocations and the microphase {0,1} of parsing + * that member: + * step = ( * 2 + ). + */ + for(edx = (ctx->step >> 1); edx < td->elements_count; + edx++, ctx->step = (ctx->step & ~1) + 2) { + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + ssize_t tag_len; /* Length of TLV's T */ + int opt_edx_end; /* Next non-optional element */ + int use_bsearch; + int n; + + if(ctx->step & 1) + goto microphase2; + + /* + * MICROPHASE 1: Synchronize decoding. + */ + ASN_DEBUG("In %s SEQUENCE left %d, edx=%d flags=%d" + " opt=%d ec=%d", + td->name, (int)ctx->left, edx, + elements[edx].flags, elements[edx].optional, + td->elements_count); + + if(ctx->left == 0 /* No more stuff is expected */ + && ( + /* Explicit OPTIONAL specification reaches the end */ + (edx + elements[edx].optional + == td->elements_count) + || + /* All extensions are optional */ + (IN_EXTENSION_GROUP(specs, edx) + && specs->ext_before > td->elements_count) + ) + ) { + ASN_DEBUG("End of SEQUENCE %s", td->name); + /* + * Found the legitimate end of the structure. + */ + PHASE_OUT(ctx); + RETURN(RC_OK); + } + + /* + * Fetch the T from TLV. + */ + tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag); + ASN_DEBUG("Current tag in %s SEQUENCE for element %d " + "(%s) is %s encoded in %d bytes, of frame %ld", + td->name, edx, elements[edx].name, + ber_tlv_tag_string(tlv_tag), (int)tag_len, (long)LEFT); + switch(tag_len) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + if(ctx->left < 0 && ((const uint8_t *)ptr)[0] == 0) { + if(LEFT < 2) { + if(SIZE_VIOLATION) + RETURN(RC_FAIL); + else + RETURN(RC_WMORE); + } else if(((const uint8_t *)ptr)[1] == 0) { + ASN_DEBUG("edx = %d, opt = %d, ec=%d", + edx, elements[edx].optional, + td->elements_count); + if((edx + elements[edx].optional + == td->elements_count) + || (IN_EXTENSION_GROUP(specs, edx) + && specs->ext_before + > td->elements_count)) { + /* + * Yeah, baby! Found the terminator + * of the indefinite length structure. + */ + /* + * Proceed to the canonical + * finalization function. + * No advancing is necessary. + */ + goto phase3; + } + } + } + + /* + * Find the next available type with this tag. + */ + use_bsearch = 0; + opt_edx_end = edx + elements[edx].optional + 1; + if(opt_edx_end > td->elements_count) + opt_edx_end = td->elements_count; /* Cap */ + else if(opt_edx_end - edx > 8) { + /* Limit the scope of linear search... */ + opt_edx_end = edx + 8; + use_bsearch = 1; + /* ... and resort to bsearch() */ + } + for(n = edx; n < opt_edx_end; n++) { + if(BER_TAGS_EQUAL(tlv_tag, elements[n].tag)) { + /* + * Found element corresponding to the tag + * being looked at. + * Reposition over the right element. + */ + edx = n; + ctx->step = 1 + 2 * edx; /* Remember! */ + goto microphase2; + } else if(elements[n].flags & ATF_OPEN_TYPE) { + /* + * This is the ANY type, which may bear + * any flag whatsoever. + */ + edx = n; + ctx->step = 1 + 2 * edx; /* Remember! */ + goto microphase2; + } else if(elements[n].tag == (ber_tlv_tag_t)-1) { + use_bsearch = 1; + break; + } + } + if(use_bsearch) { + /* + * Resort to a binary search over + * sorted array of tags. + */ + const asn_TYPE_tag2member_t *t2m; + asn_TYPE_tag2member_t key; + key.el_tag = tlv_tag; + key.el_no = edx; + t2m = (const asn_TYPE_tag2member_t *)bsearch(&key, + specs->tag2el, specs->tag2el_count, + sizeof(specs->tag2el[0]), _t2e_cmp); + if(t2m) { + const asn_TYPE_tag2member_t *best = 0; + const asn_TYPE_tag2member_t *t2m_f, *t2m_l; + int edx_max = edx + elements[edx].optional; + /* + * Rewind to the first element with that tag, + * `cause bsearch() does not guarantee order. + */ + t2m_f = t2m + t2m->toff_first; + t2m_l = t2m + t2m->toff_last; + for(t2m = t2m_f; t2m <= t2m_l; t2m++) { + if(t2m->el_no > edx_max) break; + if(t2m->el_no < edx) continue; + best = t2m; + } + if(best) { + edx = best->el_no; + ctx->step = 1 + 2 * edx; + goto microphase2; + } + } + n = opt_edx_end; + } + if(n == opt_edx_end) { + /* + * If tag is unknown, it may be either + * an unknown (thus, incorrect) tag, + * or an extension (...), + * or an end of the indefinite-length structure. + */ + if(!IN_EXTENSION_GROUP(specs, + edx + elements[edx].optional)) { + ASN_DEBUG("Unexpected tag %s (at %d)", + ber_tlv_tag_string(tlv_tag), edx); + ASN_DEBUG("Expected tag %s (%s)%s", + ber_tlv_tag_string(elements[edx].tag), + elements[edx].name, + elements[edx].optional + ?" or alternatives":""); + RETURN(RC_FAIL); + } else { + /* Skip this tag */ + ssize_t skip; + edx += elements[edx].optional; + + ASN_DEBUG("Skipping unexpected %s (at %d)", + ber_tlv_tag_string(tlv_tag), edx); + skip = ber_skip_length(opt_codec_ctx, + BER_TLV_CONSTRUCTED(ptr), + (const char *)ptr + tag_len, + LEFT - tag_len); + ASN_DEBUG("Skip length %d in %s", + (int)skip, td->name); + switch(skip) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + ADVANCE(skip + tag_len); + ctx->step -= 2; + edx--; + continue; /* Try again with the next tag */ + } + } + + /* + * MICROPHASE 2: Invoke the member-specific decoder. + */ + ctx->step |= 1; /* Confirm entering next microphase */ + microphase2: + ASN_DEBUG("Inside SEQUENCE %s MF2", td->name); + + /* + * Compute the position of the member inside a structure, + * and also a type of containment (it may be contained + * as pointer or using inline inclusion). + */ + if(elements[edx].flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + elements[edx].memb_offset); + } else { + /* + * A pointer to a pointer + * holding the start of the structure + */ + memb_ptr = (char *)st + elements[edx].memb_offset; + memb_ptr2 = &memb_ptr; + } + /* + * Invoke the member fetch routine according to member's type + */ + rval = elements[edx].type->ber_decoder(opt_codec_ctx, + elements[edx].type, + memb_ptr2, ptr, LEFT, + elements[edx].tag_mode); + ASN_DEBUG("In %s SEQUENCE decoded %d %s of %d " + "in %d bytes rval.code %d, size=%d", + td->name, edx, elements[edx].type->name, + (int)LEFT, (int)rval.consumed, rval.code, (int)size); + switch(rval.code) { + case RC_OK: + break; + case RC_WMORE: /* More data expected */ + if(!SIZE_VIOLATION) { + ADVANCE(rval.consumed); + RETURN(RC_WMORE); + } + ASN_DEBUG("Size violation (c->l=%ld <= s=%ld)", + (long)ctx->left, (long)size); + /* Fall through */ + case RC_FAIL: /* Fatal error */ + RETURN(RC_FAIL); + } /* switch(rval) */ + + ADVANCE(rval.consumed); + } /* for(all structure members) */ + + phase3: + ctx->phase = 3; + case 3: /* 00 and other tags expected */ + case 4: /* only 00's expected */ + + ASN_DEBUG("SEQUENCE %s Leftover: %ld, size = %ld", + td->name, (long)ctx->left, (long)size); + + /* + * Skip everything until the end of the SEQUENCE. + */ + while(ctx->left) { + ssize_t tl, ll; + + tl = ber_fetch_tag(ptr, LEFT, &tlv_tag); + switch(tl) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + /* + * If expected <0><0>... + */ + if(ctx->left < 0 + && ((const uint8_t *)ptr)[0] == 0) { + if(LEFT < 2) { + if(SIZE_VIOLATION) + RETURN(RC_FAIL); + else + RETURN(RC_WMORE); + } else if(((const uint8_t *)ptr)[1] == 0) { + /* + * Correctly finished with <0><0>. + */ + ADVANCE(2); + ctx->left++; + ctx->phase = 4; + continue; + } + } + + if(!IN_EXTENSION_GROUP(specs, td->elements_count) + || ctx->phase == 4) { + ASN_DEBUG("Unexpected continuation " + "of a non-extensible type " + "%s (SEQUENCE): %s", + td->name, + ber_tlv_tag_string(tlv_tag)); + RETURN(RC_FAIL); + } + + ll = ber_skip_length(opt_codec_ctx, + BER_TLV_CONSTRUCTED(ptr), + (const char *)ptr + tl, LEFT - tl); + switch(ll) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + ADVANCE(tl + ll); + } + + PHASE_OUT(ctx); + } + + RETURN(RC_OK); +} + + +/* + * The DER encoder of the SEQUENCE type. + */ +asn_enc_rval_t +SEQUENCE_encode_der(asn_TYPE_descriptor_t *td, + void *sptr, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + size_t computed_size = 0; + asn_enc_rval_t erval; + ssize_t ret; + int edx; + + ASN_DEBUG("%s %s as SEQUENCE", + cb?"Encoding":"Estimating", td->name); + + /* + * Gather the length of the underlying members sequence. + */ + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; + if(elm->flags & ATF_POINTER) { + memb_ptr = *(void **)((char *)sptr + elm->memb_offset); + if(!memb_ptr) { + if(elm->optional) continue; + /* Mandatory element is missing */ + ASN__ENCODE_FAILED; + } + } else { + memb_ptr = (void *)((char *)sptr + elm->memb_offset); + } + erval = elm->type->der_encoder(elm->type, memb_ptr, + elm->tag_mode, elm->tag, + 0, 0); + if(erval.encoded == -1) + return erval; + computed_size += erval.encoded; + ASN_DEBUG("Member %d %s estimated %ld bytes", + edx, elm->name, (long)erval.encoded); + } + + /* + * Encode the TLV for the sequence itself. + */ + ret = der_write_tags(td, computed_size, tag_mode, 1, tag, cb, app_key); + ASN_DEBUG("Wrote tags: %ld (+%ld)", (long)ret, (long)computed_size); + if(ret == -1) + ASN__ENCODE_FAILED; + erval.encoded = computed_size + ret; + + if(!cb) ASN__ENCODED_OK(erval); + + /* + * Encode all members. + */ + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + asn_enc_rval_t tmperval; + void *memb_ptr; + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(void **)((char *)sptr + elm->memb_offset); + if(!memb_ptr) continue; + } else { + memb_ptr = (void *)((char *)sptr + elm->memb_offset); + } + tmperval = elm->type->der_encoder(elm->type, memb_ptr, + elm->tag_mode, elm->tag, + cb, app_key); + if(tmperval.encoded == -1) + return tmperval; + computed_size -= tmperval.encoded; + ASN_DEBUG("Member %d %s of SEQUENCE %s encoded in %ld bytes", + edx, elm->name, td->name, (long)tmperval.encoded); + } + + if(computed_size != 0) + /* + * Encoded size is not equal to the computed size. + */ + ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(erval); +} + + +#undef XER_ADVANCE +#define XER_ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + buf_ptr = ((const char *)buf_ptr) + num;\ + size -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Decode the XER (XML) data. + */ +asn_dec_rval_t +SEQUENCE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **struct_ptr, const char *opt_mname, + const void *buf_ptr, size_t size) { + /* + * Bring closer parts of structure description. + */ + asn_SEQUENCE_specifics_t *specs + = (asn_SEQUENCE_specifics_t *)td->specifics; + asn_TYPE_member_t *elements = td->elements; + const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; + + /* + * ... and parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + asn_struct_ctx_t *ctx; /* Decoder context */ + + asn_dec_rval_t rval; /* Return value from a decoder */ + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + int edx; /* Element index */ + int edx_end; + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) RETURN(RC_FAIL); + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + + /* + * Phases of XER/XML processing: + * Phase 0: Check that the opening tag matches our expectations. + * Phase 1: Processing body and reacting on closing tag. + * Phase 2: Processing inner type. + * Phase 3: Skipping unknown extensions. + * Phase 4: PHASED OUT + */ + for(edx = ctx->step; ctx->phase <= 3;) { + pxer_chunk_type_e ch_type; /* XER chunk type */ + ssize_t ch_size; /* Chunk size */ + xer_check_tag_e tcv; /* Tag check value */ + asn_TYPE_member_t *elm; + int n; + + /* + * Go inside the inner member of a sequence. + */ + if(ctx->phase == 2) { + asn_dec_rval_t tmprval; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + + elm = &td->elements[edx]; + + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + + /* Invoke the inner type decoder, m.b. multiple times */ + tmprval = elm->type->xer_decoder(opt_codec_ctx, + elm->type, memb_ptr2, elm->name, + buf_ptr, size); + XER_ADVANCE(tmprval.consumed); + if(tmprval.code != RC_OK) + RETURN(tmprval.code); + ctx->phase = 1; /* Back to body processing */ + ctx->step = ++edx; + ASN_DEBUG("XER/SEQUENCE phase => %d, step => %d", + ctx->phase, ctx->step); + /* Fall through */ + } + + /* + * Get the next part of the XML stream. + */ + ch_size = xer_next_token(&ctx->context, buf_ptr, size, + &ch_type); + if(ch_size == -1) { + RETURN(RC_FAIL); + } else { + switch(ch_type) { + case PXER_WMORE: + RETURN(RC_WMORE); + case PXER_COMMENT: /* Got XML comment */ + case PXER_TEXT: /* Ignore free-standing text */ + XER_ADVANCE(ch_size); /* Skip silently */ + continue; + case PXER_TAG: + break; /* Check the rest down there */ + } + } + + tcv = xer_check_tag(buf_ptr, ch_size, xml_tag); + ASN_DEBUG("XER/SEQUENCE: tcv = %d, ph=%d [%s]", + tcv, ctx->phase, xml_tag); + + /* Skip the extensions section */ + if(ctx->phase == 3) { + switch(xer_skip_unknown(tcv, &ctx->left)) { + case -1: + ctx->phase = 4; + RETURN(RC_FAIL); + case 0: + XER_ADVANCE(ch_size); + continue; + case 1: + XER_ADVANCE(ch_size); + ctx->phase = 1; + continue; + case 2: + ctx->phase = 1; + break; + } + } + + switch(tcv) { + case XCT_CLOSING: + if(ctx->phase == 0) break; + ctx->phase = 0; + /* Fall through */ + case XCT_BOTH: + if(ctx->phase == 0) { + if(edx >= td->elements_count + || + /* Explicit OPTIONAL specs reaches the end */ + (edx + elements[edx].optional + == td->elements_count) + || + /* All extensions are optional */ + (IN_EXTENSION_GROUP(specs, edx) + && specs->ext_before + > td->elements_count) + ) { + XER_ADVANCE(ch_size); + ctx->phase = 4; /* Phase out */ + RETURN(RC_OK); + } else { + ASN_DEBUG("Premature end of XER SEQUENCE"); + RETURN(RC_FAIL); + } + } + /* Fall through */ + case XCT_OPENING: + if(ctx->phase == 0) { + XER_ADVANCE(ch_size); + ctx->phase = 1; /* Processing body phase */ + continue; + } + /* Fall through */ + case XCT_UNKNOWN_OP: + case XCT_UNKNOWN_BO: + + ASN_DEBUG("XER/SEQUENCE: tcv=%d, ph=%d, edx=%d", + tcv, ctx->phase, edx); + if(ctx->phase != 1) { + break; /* Really unexpected */ + } + + if(edx < td->elements_count) { + /* + * Search which member corresponds to this tag. + */ + edx_end = edx + elements[edx].optional + 1; + if(edx_end > td->elements_count) + edx_end = td->elements_count; + for(n = edx; n < edx_end; n++) { + elm = &td->elements[n]; + tcv = xer_check_tag(buf_ptr, + ch_size, elm->name); + switch(tcv) { + case XCT_BOTH: + case XCT_OPENING: + /* + * Process this member. + */ + ctx->step = edx = n; + ctx->phase = 2; + break; + case XCT_UNKNOWN_OP: + case XCT_UNKNOWN_BO: + continue; + default: + n = edx_end; + break; /* Phase out */ + } + break; + } + if(n != edx_end) + continue; + } else { + ASN_DEBUG("Out of defined members: %d/%d", + edx, td->elements_count); + } + + /* It is expected extension */ + if(IN_EXTENSION_GROUP(specs, + edx + (edx < td->elements_count + ? elements[edx].optional : 0))) { + ASN_DEBUG("Got anticipated extension at %d", + edx); + /* + * Check for (XCT_BOTH or XCT_UNKNOWN_BO) + * By using a mask. Only record a pure + * tags. + */ + if(tcv & XCT_CLOSING) { + /* Found without body */ + } else { + ctx->left = 1; + ctx->phase = 3; /* Skip ...'s */ + } + XER_ADVANCE(ch_size); + continue; + } + + /* Fall through */ + default: + break; + } + + ASN_DEBUG("Unexpected XML tag in SEQUENCE [%c%c%c%c%c%c]", + size>0?((const char *)buf_ptr)[0]:'.', + size>1?((const char *)buf_ptr)[1]:'.', + size>2?((const char *)buf_ptr)[2]:'.', + size>3?((const char *)buf_ptr)[3]:'.', + size>4?((const char *)buf_ptr)[4]:'.', + size>5?((const char *)buf_ptr)[5]:'.'); + break; + } + + ctx->phase = 4; /* "Phase out" on hard failure */ + RETURN(RC_FAIL); +} + +asn_enc_rval_t +SEQUENCE_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t er; + int xcan = (flags & XER_F_CANONICAL); + int edx; + + if(!sptr) + ASN__ENCODE_FAILED; + + er.encoded = 0; + + for(edx = 0; edx < td->elements_count; edx++) { + asn_enc_rval_t tmper; + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; + const char *mname = elm->name; + unsigned int mlen = strlen(mname); + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(void **)((char *)sptr + elm->memb_offset); + if(!memb_ptr) { + if(elm->optional) + continue; + /* Mandatory element is missing */ + ASN__ENCODE_FAILED; + } + } else { + memb_ptr = (void *)((char *)sptr + elm->memb_offset); + } + + if(!xcan) ASN__TEXT_INDENT(1, ilevel); + ASN__CALLBACK3("<", 1, mname, mlen, ">", 1); + + /* Print the member itself */ + tmper = elm->type->xer_encoder(elm->type, memb_ptr, + ilevel + 1, flags, cb, app_key); + if(tmper.encoded == -1) return tmper; + + ASN__CALLBACK3("", 1); + er.encoded += 5 + (2 * mlen) + tmper.encoded; + } + + if(!xcan) ASN__TEXT_INDENT(1, ilevel - 1); + + ASN__ENCODED_OK(er); +cb_failed: + ASN__ENCODE_FAILED; +} + +int +SEQUENCE_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + int edx; + int ret; + + if(!sptr) return (cb("", 8, app_key) < 0) ? -1 : 0; + + /* Dump preamble */ + if(cb(td->name, strlen(td->name), app_key) < 0 + || cb(" ::= {", 6, app_key) < 0) + return -1; + + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *memb_ptr; + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) { + if(elm->optional) continue; + /* Print line */ + /* Fall through */ + } + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + /* Indentation */ + _i_INDENT(1); + + /* Print the member's name and stuff */ + if(cb(elm->name, strlen(elm->name), app_key) < 0 + || cb(": ", 2, app_key) < 0) + return -1; + + /* Print the member itself */ + ret = elm->type->print_struct(elm->type, memb_ptr, ilevel + 1, + cb, app_key); + if(ret) return ret; + } + + ilevel--; + _i_INDENT(1); + + return (cb("}", 1, app_key) < 0) ? -1 : 0; +} + +void +SEQUENCE_free(asn_TYPE_descriptor_t *td, void *sptr, int contents_only) { + int edx; + + if(!td || !sptr) + return; + + ASN_DEBUG("Freeing %s as SEQUENCE", td->name); + + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; + if(elm->flags & ATF_POINTER) { + memb_ptr = *(void **)((char *)sptr + elm->memb_offset); + if(memb_ptr) + ASN_STRUCT_FREE(*elm->type, memb_ptr); + } else { + memb_ptr = (void *)((char *)sptr + elm->memb_offset); + ASN_STRUCT_FREE_CONTENTS_ONLY(*elm->type, memb_ptr); + } + } + + if(!contents_only) { + FREEMEM(sptr); + } +} + +int +SEQUENCE_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + int edx; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + /* + * Iterate over structure members and check their validity. + */ + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *memb_ptr; + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) { + if(elm->optional) + continue; + ASN__CTFAIL(app_key, td, sptr, + "%s: mandatory element %s absent (%s:%d)", + td->name, elm->name, __FILE__, __LINE__); + return -1; + } + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + if(elm->memb_constraints) { + int ret = elm->memb_constraints(elm->type, memb_ptr, + ctfailcb, app_key); + if(ret) return ret; + } else { + int ret = elm->type->check_constraints(elm->type, + memb_ptr, ctfailcb, app_key); + if(ret) return ret; + /* + * Cannot inherit it earlier: + * need to make sure we get the updated version. + */ + elm->memb_constraints = elm->type->check_constraints; + } + } + + return 0; +} + +asn_dec_rval_t +SEQUENCE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + asn_SEQUENCE_specifics_t *specs = (asn_SEQUENCE_specifics_t *)td->specifics; + void *st = *sptr; /* Target structure. */ + int extpresent; /* Extension additions are present */ + uint8_t *opres; /* Presence of optional root members */ + asn_per_data_t opmd; + asn_dec_rval_t rv; + int edx; + + (void)constraints; + + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + ASN__DECODE_FAILED; + + if(!st) { + st = *sptr = CALLOC(1, specs->struct_size); + if(!st) ASN__DECODE_FAILED; + } + + ASN_DEBUG("Decoding %s as SEQUENCE (UPER)", td->name); + + /* Handle extensions */ + if(specs->ext_before >= 0) { + extpresent = per_get_few_bits(pd, 1); + if(extpresent < 0) ASN__DECODE_STARVED; + } else { + extpresent = 0; + } + + /* Prepare a place and read-in the presence bitmap */ + memset(&opmd, 0, sizeof(opmd)); + if(specs->roms_count) { + opres = (uint8_t *)MALLOC(((specs->roms_count + 7) >> 3) + 1); + if(!opres) ASN__DECODE_FAILED; + /* Get the presence map */ + if(per_get_many_bits(pd, opres, 0, specs->roms_count)) { + FREEMEM(opres); + ASN__DECODE_STARVED; + } + opmd.buffer = opres; + opmd.nbits = specs->roms_count; + ASN_DEBUG("Read in presence bitmap for %s of %d bits (%x..)", + td->name, specs->roms_count, *opres); + } else { + opres = 0; + } + + /* + * Get the sequence ROOT elements. + */ + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + + if(IN_EXTENSION_GROUP(specs, edx)) + continue; + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + + /* Deal with optionality */ + if(elm->optional) { + int present = per_get_few_bits(&opmd, 1); + ASN_DEBUG("Member %s->%s is optional, p=%d (%d->%d)", + td->name, elm->name, present, + (int)opmd.nboff, (int)opmd.nbits); + if(present == 0) { + /* This element is not present */ + if(elm->default_value) { + /* Fill-in DEFAULT */ + if(elm->default_value(1, memb_ptr2)) { + FREEMEM(opres); + ASN__DECODE_FAILED; + } + ASN_DEBUG("Filled-in default"); + } + /* The member is just not present */ + continue; + } + /* Fall through */ + } + + /* Fetch the member from the stream */ + ASN_DEBUG("Decoding member %s in %s", elm->name, td->name); + rv = elm->type->uper_decoder(opt_codec_ctx, elm->type, + elm->per_constraints, memb_ptr2, pd); + if(rv.code != RC_OK) { + ASN_DEBUG("Failed decode %s in %s", + elm->name, td->name); + FREEMEM(opres); + return rv; + } + } + + /* Optionality map is not needed anymore */ + FREEMEM(opres); + + /* + * Deal with extensions. + */ + if(extpresent) { + ssize_t bmlength; + uint8_t *epres; /* Presence of extension members */ + asn_per_data_t epmd; + + bmlength = uper_get_nslength(pd); + if(bmlength < 0) ASN__DECODE_STARVED; + + ASN_DEBUG("Extensions %ld present in %s", (long)bmlength, td->name); + + epres = (uint8_t *)MALLOC((bmlength + 15) >> 3); + if(!epres) ASN__DECODE_STARVED; + + /* Get the extensions map */ + if(per_get_many_bits(pd, epres, 0, bmlength)) { + FREEMEM(epres); + ASN__DECODE_STARVED; + } + + memset(&epmd, 0, sizeof(epmd)); + epmd.buffer = epres; + epmd.nbits = bmlength; + ASN_DEBUG("Read in extensions bitmap for %s of %ld bits (%x..)", + td->name, (long)bmlength, *epres); + + /* Go over extensions and read them in */ + for(edx = specs->ext_after + 1; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + int present; + + if(!IN_EXTENSION_GROUP(specs, edx)) { + ASN_DEBUG("%d is not extension", edx); + continue; + } + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (void *)((char *)st + elm->memb_offset); + memb_ptr2 = &memb_ptr; + } + + present = per_get_few_bits(&epmd, 1); + if(present <= 0) { + if(present < 0) break; /* No more extensions */ + continue; + } + + ASN_DEBUG("Decoding member %s in %s %p", elm->name, td->name, *memb_ptr2); + rv = uper_open_type_get(opt_codec_ctx, elm->type, + elm->per_constraints, memb_ptr2, pd); + if(rv.code != RC_OK) { + FREEMEM(epres); + return rv; + } + } + + /* Skip over overflow extensions which aren't present + * in this system's version of the protocol */ + for(;;) { + ASN_DEBUG("Getting overflow extensions"); + switch(per_get_few_bits(&epmd, 1)) { + case -1: break; + case 0: continue; + default: + if(uper_open_type_skip(opt_codec_ctx, pd)) { + FREEMEM(epres); + ASN__DECODE_STARVED; + } + } + break; + } + + FREEMEM(epres); + } + + /* Fill DEFAULT members in extensions */ + for(edx = specs->roms_count; edx < specs->roms_count + + specs->aoms_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void **memb_ptr2; /* Pointer to member pointer */ + + if(!elm->default_value) continue; + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)st + + elm->memb_offset); + if(*memb_ptr2) continue; + } else { + continue; /* Extensions are all optionals */ + } + + /* Set default value */ + if(elm->default_value(1, memb_ptr2)) { + ASN__DECODE_FAILED; + } + } + + rv.consumed = 0; + rv.code = RC_OK; + return rv; +} + +static int +SEQUENCE_handle_extensions(asn_TYPE_descriptor_t *td, void *sptr, + asn_per_outp_t *po1, asn_per_outp_t *po2) { + asn_SEQUENCE_specifics_t *specs + = (asn_SEQUENCE_specifics_t *)td->specifics; + int exts_present = 0; + int exts_count = 0; + int edx; + + if(specs->ext_before < 0) + return 0; + + /* Find out which extensions are present */ + for(edx = specs->ext_after + 1; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + int present; + + if(!IN_EXTENSION_GROUP(specs, edx)) { + ASN_DEBUG("%s (@%d) is not extension", elm->type->name, edx); + continue; + } + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)sptr + elm->memb_offset); + present = (*memb_ptr2 != 0); + } else { + memb_ptr = (void *)((char *)sptr + elm->memb_offset); + memb_ptr2 = &memb_ptr; + present = 1; + } + + ASN_DEBUG("checking %s (@%d) present => %d", + elm->type->name, edx, present); + exts_count++; + exts_present += present; + + /* Encode as presence marker */ + if(po1 && per_put_few_bits(po1, present, 1)) + return -1; + /* Encode as open type field */ + if(po2 && present && uper_open_type_put(elm->type, + elm->per_constraints, *memb_ptr2, po2)) + return -1; + + } + + return exts_present ? exts_count : 0; +} + +asn_enc_rval_t +SEQUENCE_encode_uper(asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { + asn_SEQUENCE_specifics_t *specs + = (asn_SEQUENCE_specifics_t *)td->specifics; + asn_enc_rval_t er; + int n_extensions; + int edx; + int i; + + (void)constraints; + + if(!sptr) + ASN__ENCODE_FAILED; + + er.encoded = 0; + + ASN_DEBUG("Encoding %s as SEQUENCE (UPER)", td->name); + + + /* + * X.691#18.1 Whether structure is extensible + * and whether to encode extensions + */ + if(specs->ext_before >= 0) { + n_extensions = SEQUENCE_handle_extensions(td, sptr, 0, 0); + per_put_few_bits(po, n_extensions ? 1 : 0, 1); + } else { + n_extensions = 0; /* There are no extensions to encode */ + } + + /* Encode a presence bitmap */ + for(i = 0; i < specs->roms_count; i++) { + asn_TYPE_member_t *elm; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + int present; + + edx = specs->oms[i]; + elm = &td->elements[edx]; + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)sptr + elm->memb_offset); + present = (*memb_ptr2 != 0); + } else { + memb_ptr = (void *)((char *)sptr + elm->memb_offset); + memb_ptr2 = &memb_ptr; + present = 1; + } + + /* Eliminate default values */ + if(present && elm->default_value + && elm->default_value(0, memb_ptr2) == 1) + present = 0; + + ASN_DEBUG("Element %s %s %s->%s is %s", + elm->flags & ATF_POINTER ? "ptr" : "inline", + elm->default_value ? "def" : "wtv", + td->name, elm->name, present ? "present" : "absent"); + if(per_put_few_bits(po, present, 1)) + ASN__ENCODE_FAILED; + } + + /* + * Encode the sequence ROOT elements. + */ + ASN_DEBUG("ext_after = %d, ec = %d, eb = %d", specs->ext_after, td->elements_count, specs->ext_before); + for(edx = 0; edx < ((specs->ext_after < 0) + ? td->elements_count : specs->ext_before - 1); edx++) { + + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + + if(IN_EXTENSION_GROUP(specs, edx)) + continue; + + ASN_DEBUG("About to encode %s", elm->type->name); + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)sptr + elm->memb_offset); + if(!*memb_ptr2) { + ASN_DEBUG("Element %s %d not present", + elm->name, edx); + if(elm->optional) + continue; + /* Mandatory element is missing */ + ASN__ENCODE_FAILED; + } + } else { + memb_ptr = (void *)((char *)sptr + elm->memb_offset); + memb_ptr2 = &memb_ptr; + } + + /* Eliminate default values */ + if(elm->default_value && elm->default_value(0, memb_ptr2) == 1) + continue; + + ASN_DEBUG("Encoding %s->%s", td->name, elm->name); + er = elm->type->uper_encoder(elm->type, elm->per_constraints, + *memb_ptr2, po); + if(er.encoded == -1) + return er; + } + + /* No extensions to encode */ + if(!n_extensions) ASN__ENCODED_OK(er); + + ASN_DEBUG("Length of %d bit-map", n_extensions); + /* #18.8. Write down the presence bit-map length. */ + if(uper_put_nslength(po, n_extensions)) + ASN__ENCODE_FAILED; + + ASN_DEBUG("Bit-map of %d elements", n_extensions); + /* #18.7. Encoding the extensions presence bit-map. */ + /* TODO: act upon NOTE in #18.7 for canonical PER */ + if(SEQUENCE_handle_extensions(td, sptr, po, 0) != n_extensions) + ASN__ENCODE_FAILED; + + ASN_DEBUG("Writing %d extensions", n_extensions); + /* #18.9. Encode extensions as open type fields. */ + if(SEQUENCE_handle_extensions(td, sptr, 0, po) != n_extensions) + ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(er); +} + diff --git a/src/cryptoconditions/src/asn/constr_SEQUENCE.h b/src/cryptoconditions/src/asn/constr_SEQUENCE.h new file mode 100644 index 000000000..c2aeb6676 --- /dev/null +++ b/src/cryptoconditions/src/asn/constr_SEQUENCE.h @@ -0,0 +1,60 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _CONSTR_SEQUENCE_H_ +#define _CONSTR_SEQUENCE_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef const struct asn_SEQUENCE_specifics_s { + /* + * Target structure description. + */ + int struct_size; /* Size of the target structure. */ + int ctx_offset; /* Offset of the asn_struct_ctx_t member */ + + /* + * Tags to members mapping table (sorted). + */ + const asn_TYPE_tag2member_t *tag2el; + int tag2el_count; + + /* + * Optional members of the extensions root (roms) or additions (aoms). + * Meaningful for PER. + */ + const int *oms; /* Optional MemberS */ + int roms_count; /* Root optional members count */ + int aoms_count; /* Additions optional members count */ + + /* + * Description of an extensions group. + */ + int ext_after; /* Extensions start after this member */ + int ext_before; /* Extensions stop before this member */ +} asn_SEQUENCE_specifics_t; + + +/* + * A set specialized functions dealing with the SEQUENCE type. + */ +asn_struct_free_f SEQUENCE_free; +asn_struct_print_f SEQUENCE_print; +asn_constr_check_f SEQUENCE_constraint; +ber_type_decoder_f SEQUENCE_decode_ber; +der_type_encoder_f SEQUENCE_encode_der; +xer_type_decoder_f SEQUENCE_decode_xer; +xer_type_encoder_f SEQUENCE_encode_xer; +per_type_decoder_f SEQUENCE_decode_uper; +per_type_encoder_f SEQUENCE_encode_uper; + +#ifdef __cplusplus +} +#endif + +#endif /* _CONSTR_SEQUENCE_H_ */ diff --git a/src/cryptoconditions/src/asn/constr_SET_OF.c b/src/cryptoconditions/src/asn/constr_SET_OF.c new file mode 100644 index 000000000..2dbc6e518 --- /dev/null +++ b/src/cryptoconditions/src/asn/constr_SET_OF.c @@ -0,0 +1,954 @@ +/*- + * Copyright (c) 2003, 2004, 2005 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * Number of bytes left for this structure. + * (ctx->left) indicates the number of bytes _transferred_ for the structure. + * (size) contains the number of bytes in the buffer passed. + */ +#define LEFT ((size<(size_t)ctx->left)?size:(size_t)ctx->left) + +/* + * If the subprocessor function returns with an indication that it wants + * more data, it may well be a fatal decoding problem, because the + * size is constrained by the 's L, even if the buffer size allows + * reading more data. + * For example, consider the buffer containing the following TLVs: + * ... + * The TLV length clearly indicates that one byte is expected in V, but + * if the V processor returns with "want more data" even if the buffer + * contains way more data than the V processor have seen. + */ +#define SIZE_VIOLATION (ctx->left >= 0 && (size_t)ctx->left <= size) + +/* + * This macro "eats" the part of the buffer which is definitely "consumed", + * i.e. was correctly converted into local representation or rightfully skipped. + */ +#undef ADVANCE +#define ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + ptr = ((const char *)ptr) + num;\ + size -= num; \ + if(ctx->left >= 0) \ + ctx->left -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Switch to the next phase of parsing. + */ +#undef NEXT_PHASE +#undef PHASE_OUT +#define NEXT_PHASE(ctx) do { \ + ctx->phase++; \ + ctx->step = 0; \ + } while(0) +#define PHASE_OUT(ctx) do { ctx->phase = 10; } while(0) + +/* + * Return a standardized complex structure. + */ +#undef RETURN +#define RETURN(_code) do { \ + rval.code = _code; \ + rval.consumed = consumed_myself;\ + return rval; \ + } while(0) + +/* + * The decoder of the SET OF type. + */ +asn_dec_rval_t +SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **struct_ptr, const void *ptr, size_t size, int tag_mode) { + /* + * Bring closer parts of structure description. + */ + asn_SET_OF_specifics_t *specs = (asn_SET_OF_specifics_t *)td->specifics; + asn_TYPE_member_t *elm = td->elements; /* Single one */ + + /* + * Parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + asn_struct_ctx_t *ctx; /* Decoder context */ + + ber_tlv_tag_t tlv_tag; /* T from TLV */ + asn_dec_rval_t rval; /* Return code from subparsers */ + + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + + ASN_DEBUG("Decoding %s as SET OF", td->name); + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) { + RETURN(RC_FAIL); + } + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + /* + * Start to parse where left previously + */ + switch(ctx->phase) { + case 0: + /* + * PHASE 0. + * Check that the set of tags associated with given structure + * perfectly fits our expectations. + */ + + rval = ber_check_tags(opt_codec_ctx, td, ctx, ptr, size, + tag_mode, 1, &ctx->left, 0); + if(rval.code != RC_OK) { + ASN_DEBUG("%s tagging check failed: %d", + td->name, rval.code); + return rval; + } + + if(ctx->left >= 0) + ctx->left += rval.consumed; /* ?Substracted below! */ + ADVANCE(rval.consumed); + + ASN_DEBUG("Structure consumes %ld bytes, " + "buffer %ld", (long)ctx->left, (long)size); + + NEXT_PHASE(ctx); + /* Fall through */ + case 1: + /* + * PHASE 1. + * From the place where we've left it previously, + * try to decode the next item. + */ + for(;; ctx->step = 0) { + ssize_t tag_len; /* Length of TLV's T */ + + if(ctx->step & 1) + goto microphase2; + + /* + * MICROPHASE 1: Synchronize decoding. + */ + + if(ctx->left == 0) { + ASN_DEBUG("End of SET OF %s", td->name); + /* + * No more things to decode. + * Exit out of here. + */ + PHASE_OUT(ctx); + RETURN(RC_OK); + } + + /* + * Fetch the T from TLV. + */ + tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag); + switch(tag_len) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + if(ctx->left < 0 && ((const uint8_t *)ptr)[0] == 0) { + if(LEFT < 2) { + if(SIZE_VIOLATION) + RETURN(RC_FAIL); + else + RETURN(RC_WMORE); + } else if(((const uint8_t *)ptr)[1] == 0) { + /* + * Found the terminator of the + * indefinite length structure. + */ + break; + } + } + + /* Outmost tag may be unknown and cannot be fetched/compared */ + if(elm->tag != (ber_tlv_tag_t)-1) { + if(BER_TAGS_EQUAL(tlv_tag, elm->tag)) { + /* + * The new list member of expected type has arrived. + */ + } else { + ASN_DEBUG("Unexpected tag %s fixed SET OF %s", + ber_tlv_tag_string(tlv_tag), td->name); + ASN_DEBUG("%s SET OF has tag %s", + td->name, ber_tlv_tag_string(elm->tag)); + RETURN(RC_FAIL); + } + } + + /* + * MICROPHASE 2: Invoke the member-specific decoder. + */ + ctx->step |= 1; /* Confirm entering next microphase */ + microphase2: + + /* + * Invoke the member fetch routine according to member's type + */ + rval = elm->type->ber_decoder(opt_codec_ctx, + elm->type, &ctx->ptr, ptr, LEFT, 0); + ASN_DEBUG("In %s SET OF %s code %d consumed %d", + td->name, elm->type->name, + rval.code, (int)rval.consumed); + switch(rval.code) { + case RC_OK: + { + asn_anonymous_set_ *list = _A_SET_FROM_VOID(st); + if(ASN_SET_ADD(list, ctx->ptr) != 0) + RETURN(RC_FAIL); + else + ctx->ptr = 0; + } + break; + case RC_WMORE: /* More data expected */ + if(!SIZE_VIOLATION) { + ADVANCE(rval.consumed); + RETURN(RC_WMORE); + } + /* Fall through */ + case RC_FAIL: /* Fatal error */ + ASN_STRUCT_FREE(*elm->type, ctx->ptr); + ctx->ptr = 0; + RETURN(RC_FAIL); + } /* switch(rval) */ + + ADVANCE(rval.consumed); + } /* for(all list members) */ + + NEXT_PHASE(ctx); + case 2: + /* + * Read in all "end of content" TLVs. + */ + while(ctx->left < 0) { + if(LEFT < 2) { + if(LEFT > 0 && ((const char *)ptr)[0] != 0) { + /* Unexpected tag */ + RETURN(RC_FAIL); + } else { + RETURN(RC_WMORE); + } + } + if(((const char *)ptr)[0] == 0 + && ((const char *)ptr)[1] == 0) { + ADVANCE(2); + ctx->left++; + } else { + RETURN(RC_FAIL); + } + } + + PHASE_OUT(ctx); + } + + RETURN(RC_OK); +} + +/* + * Internally visible buffer holding a single encoded element. + */ +struct _el_buffer { + uint8_t *buf; + size_t length; + size_t size; +}; +/* Append bytes to the above structure */ +static int _el_addbytes(const void *buffer, size_t size, void *el_buf_ptr) { + struct _el_buffer *el_buf = (struct _el_buffer *)el_buf_ptr; + + if(el_buf->length + size > el_buf->size) + return -1; + + memcpy(el_buf->buf + el_buf->length, buffer, size); + + el_buf->length += size; + return 0; +} +static int _el_buf_cmp(const void *ap, const void *bp) { + const struct _el_buffer *a = (const struct _el_buffer *)ap; + const struct _el_buffer *b = (const struct _el_buffer *)bp; + int ret; + size_t common_len; + + if(a->length < b->length) + common_len = a->length; + else + common_len = b->length; + + ret = memcmp(a->buf, b->buf, common_len); + if(ret == 0) { + if(a->length < b->length) + ret = -1; + else if(a->length > b->length) + ret = 1; + } + + return ret; +} + +/* + * The DER encoder of the SET OF type. + */ +asn_enc_rval_t +SET_OF_encode_der(asn_TYPE_descriptor_t *td, void *ptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_TYPE_member_t *elm = td->elements; + asn_TYPE_descriptor_t *elm_type = elm->type; + der_type_encoder_f *der_encoder = elm_type->der_encoder; + asn_anonymous_set_ *list = _A_SET_FROM_VOID(ptr); + size_t computed_size = 0; + ssize_t encoding_size = 0; + struct _el_buffer *encoded_els; + ssize_t eels_count = 0; + size_t max_encoded_len = 1; + asn_enc_rval_t erval; + int ret; + int edx; + + ASN_DEBUG("Estimating size for SET OF %s", td->name); + + /* + * Gather the length of the underlying members sequence. + */ + for(edx = 0; edx < list->count; edx++) { + void *memb_ptr = list->array[edx]; + if(!memb_ptr) continue; + erval = der_encoder(elm_type, memb_ptr, 0, elm->tag, 0, 0); + if(erval.encoded == -1) + return erval; + computed_size += erval.encoded; + + /* Compute maximum encoding's size */ + if(max_encoded_len < (size_t)erval.encoded) + max_encoded_len = erval.encoded; + } + + /* + * Encode the TLV for the sequence itself. + */ + encoding_size = der_write_tags(td, computed_size, tag_mode, 1, tag, + cb, app_key); + if(encoding_size == -1) { + erval.encoded = -1; + erval.failed_type = td; + erval.structure_ptr = ptr; + return erval; + } + computed_size += encoding_size; + + if(!cb || list->count == 0) { + erval.encoded = computed_size; + ASN__ENCODED_OK(erval); + } + + /* + * DER mandates dynamic sorting of the SET OF elements + * according to their encodings. Build an array of the + * encoded elements. + */ + encoded_els = (struct _el_buffer *)MALLOC( + list->count * sizeof(encoded_els[0])); + if(encoded_els == NULL) { + erval.encoded = -1; + erval.failed_type = td; + erval.structure_ptr = ptr; + return erval; + } + + ASN_DEBUG("Encoding members of %s SET OF", td->name); + + /* + * Encode all members. + */ + for(edx = 0; edx < list->count; edx++) { + void *memb_ptr = list->array[edx]; + struct _el_buffer *encoded_el = &encoded_els[eels_count]; + + if(!memb_ptr) continue; + + /* + * Prepare space for encoding. + */ + encoded_el->buf = (uint8_t *)MALLOC(max_encoded_len); + if(encoded_el->buf) { + encoded_el->length = 0; + encoded_el->size = max_encoded_len; + } else { + for(edx--; edx >= 0; edx--) + FREEMEM(encoded_els[edx].buf); + FREEMEM(encoded_els); + erval.encoded = -1; + erval.failed_type = td; + erval.structure_ptr = ptr; + return erval; + } + + /* + * Encode the member into the prepared space. + */ + erval = der_encoder(elm_type, memb_ptr, 0, elm->tag, + _el_addbytes, encoded_el); + if(erval.encoded == -1) { + for(; edx >= 0; edx--) + FREEMEM(encoded_els[edx].buf); + FREEMEM(encoded_els); + return erval; + } + encoding_size += erval.encoded; + eels_count++; + } + + /* + * Sort the encoded elements according to their encoding. + */ + qsort(encoded_els, eels_count, sizeof(encoded_els[0]), _el_buf_cmp); + + /* + * Report encoded elements to the application. + * Dispose of temporary sorted members table. + */ + ret = 0; + for(edx = 0; edx < eels_count; edx++) { + struct _el_buffer *encoded_el = &encoded_els[edx]; + /* Report encoded chunks to the application */ + if(ret == 0 + && cb(encoded_el->buf, encoded_el->length, app_key) < 0) + ret = -1; + FREEMEM(encoded_el->buf); + } + FREEMEM(encoded_els); + + if(ret || computed_size != (size_t)encoding_size) { + /* + * Standard callback failed, or + * encoded size is not equal to the computed size. + */ + erval.encoded = -1; + erval.failed_type = td; + erval.structure_ptr = ptr; + } else { + erval.encoded = computed_size; + } + + ASN__ENCODED_OK(erval); +} + +#undef XER_ADVANCE +#define XER_ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + buf_ptr = ((const char *)buf_ptr) + num;\ + size -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Decode the XER (XML) data. + */ +asn_dec_rval_t +SET_OF_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **struct_ptr, const char *opt_mname, + const void *buf_ptr, size_t size) { + /* + * Bring closer parts of structure description. + */ + asn_SET_OF_specifics_t *specs = (asn_SET_OF_specifics_t *)td->specifics; + asn_TYPE_member_t *element = td->elements; + const char *elm_tag; + const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; + + /* + * ... and parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + asn_struct_ctx_t *ctx; /* Decoder context */ + + asn_dec_rval_t rval; /* Return value from a decoder */ + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) RETURN(RC_FAIL); + } + + /* Which tag is expected for the downstream */ + if(specs->as_XMLValueList) { + elm_tag = (specs->as_XMLValueList == 1) ? 0 : ""; + } else { + elm_tag = (*element->name) + ? element->name : element->type->xml_tag; + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + /* + * Phases of XER/XML processing: + * Phase 0: Check that the opening tag matches our expectations. + * Phase 1: Processing body and reacting on closing tag. + * Phase 2: Processing inner type. + */ + for(; ctx->phase <= 2;) { + pxer_chunk_type_e ch_type; /* XER chunk type */ + ssize_t ch_size; /* Chunk size */ + xer_check_tag_e tcv; /* Tag check value */ + + /* + * Go inside the inner member of a set. + */ + if(ctx->phase == 2) { + asn_dec_rval_t tmprval; + + /* Invoke the inner type decoder, m.b. multiple times */ + ASN_DEBUG("XER/SET OF element [%s]", elm_tag); + tmprval = element->type->xer_decoder(opt_codec_ctx, + element->type, &ctx->ptr, elm_tag, + buf_ptr, size); + if(tmprval.code == RC_OK) { + asn_anonymous_set_ *list = _A_SET_FROM_VOID(st); + if(ASN_SET_ADD(list, ctx->ptr) != 0) + RETURN(RC_FAIL); + ctx->ptr = 0; + XER_ADVANCE(tmprval.consumed); + } else { + XER_ADVANCE(tmprval.consumed); + RETURN(tmprval.code); + } + ctx->phase = 1; /* Back to body processing */ + ASN_DEBUG("XER/SET OF phase => %d", ctx->phase); + /* Fall through */ + } + + /* + * Get the next part of the XML stream. + */ + ch_size = xer_next_token(&ctx->context, + buf_ptr, size, &ch_type); + if(ch_size == -1) { + RETURN(RC_FAIL); + } else { + switch(ch_type) { + case PXER_WMORE: + RETURN(RC_WMORE); + case PXER_COMMENT: /* Got XML comment */ + case PXER_TEXT: /* Ignore free-standing text */ + XER_ADVANCE(ch_size); /* Skip silently */ + continue; + case PXER_TAG: + break; /* Check the rest down there */ + } + } + + tcv = xer_check_tag(buf_ptr, ch_size, xml_tag); + ASN_DEBUG("XER/SET OF: tcv = %d, ph=%d t=%s", + tcv, ctx->phase, xml_tag); + switch(tcv) { + case XCT_CLOSING: + if(ctx->phase == 0) break; + ctx->phase = 0; + /* Fall through */ + case XCT_BOTH: + if(ctx->phase == 0) { + /* No more things to decode */ + XER_ADVANCE(ch_size); + ctx->phase = 3; /* Phase out */ + RETURN(RC_OK); + } + /* Fall through */ + case XCT_OPENING: + if(ctx->phase == 0) { + XER_ADVANCE(ch_size); + ctx->phase = 1; /* Processing body phase */ + continue; + } + /* Fall through */ + case XCT_UNKNOWN_OP: + case XCT_UNKNOWN_BO: + + ASN_DEBUG("XER/SET OF: tcv=%d, ph=%d", tcv, ctx->phase); + if(ctx->phase == 1) { + /* + * Process a single possible member. + */ + ctx->phase = 2; + continue; + } + /* Fall through */ + default: + break; + } + + ASN_DEBUG("Unexpected XML tag in SET OF"); + break; + } + + ctx->phase = 3; /* "Phase out" on hard failure */ + RETURN(RC_FAIL); +} + + + +typedef struct xer_tmp_enc_s { + void *buffer; + size_t offset; + size_t size; +} xer_tmp_enc_t; +static int +SET_OF_encode_xer_callback(const void *buffer, size_t size, void *key) { + xer_tmp_enc_t *t = (xer_tmp_enc_t *)key; + if(t->offset + size >= t->size) { + size_t newsize = (t->size << 2) + size; + void *p = REALLOC(t->buffer, newsize); + if(!p) return -1; + t->buffer = p; + t->size = newsize; + } + memcpy((char *)t->buffer + t->offset, buffer, size); + t->offset += size; + return 0; +} +static int +SET_OF_xer_order(const void *aptr, const void *bptr) { + const xer_tmp_enc_t *a = (const xer_tmp_enc_t *)aptr; + const xer_tmp_enc_t *b = (const xer_tmp_enc_t *)bptr; + size_t minlen = a->offset; + int ret; + if(b->offset < minlen) minlen = b->offset; + /* Well-formed UTF-8 has this nice lexicographical property... */ + ret = memcmp(a->buffer, b->buffer, minlen); + if(ret != 0) return ret; + if(a->offset == b->offset) + return 0; + if(a->offset == minlen) + return -1; + return 1; +} + + +asn_enc_rval_t +SET_OF_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t er; + asn_SET_OF_specifics_t *specs = (asn_SET_OF_specifics_t *)td->specifics; + asn_TYPE_member_t *elm = td->elements; + asn_anonymous_set_ *list = _A_SET_FROM_VOID(sptr); + const char *mname = specs->as_XMLValueList + ? 0 : ((*elm->name) ? elm->name : elm->type->xml_tag); + size_t mlen = mname ? strlen(mname) : 0; + int xcan = (flags & XER_F_CANONICAL); + xer_tmp_enc_t *encs = 0; + size_t encs_count = 0; + void *original_app_key = app_key; + asn_app_consume_bytes_f *original_cb = cb; + int i; + + if(!sptr) ASN__ENCODE_FAILED; + + if(xcan) { + encs = (xer_tmp_enc_t *)MALLOC(list->count * sizeof(encs[0])); + if(!encs) ASN__ENCODE_FAILED; + cb = SET_OF_encode_xer_callback; + } + + er.encoded = 0; + + for(i = 0; i < list->count; i++) { + asn_enc_rval_t tmper; + + void *memb_ptr = list->array[i]; + if(!memb_ptr) continue; + + if(encs) { + memset(&encs[encs_count], 0, sizeof(encs[0])); + app_key = &encs[encs_count]; + encs_count++; + } + + if(mname) { + if(!xcan) ASN__TEXT_INDENT(1, ilevel); + ASN__CALLBACK3("<", 1, mname, mlen, ">", 1); + } + + if(!xcan && specs->as_XMLValueList == 1) + ASN__TEXT_INDENT(1, ilevel + 1); + tmper = elm->type->xer_encoder(elm->type, memb_ptr, + ilevel + (specs->as_XMLValueList != 2), + flags, cb, app_key); + if(tmper.encoded == -1) { + td = tmper.failed_type; + sptr = tmper.structure_ptr; + goto cb_failed; + } + if(tmper.encoded == 0 && specs->as_XMLValueList) { + const char *name = elm->type->xml_tag; + size_t len = strlen(name); + ASN__CALLBACK3("<", 1, name, len, "/>", 2); + } + + if(mname) { + ASN__CALLBACK3("", 1); + er.encoded += 5; + } + + er.encoded += (2 * mlen) + tmper.encoded; + } + + if(!xcan) ASN__TEXT_INDENT(1, ilevel - 1); + + if(encs) { + xer_tmp_enc_t *enc = encs; + xer_tmp_enc_t *end = encs + encs_count; + ssize_t control_size = 0; + + cb = original_cb; + app_key = original_app_key; + qsort(encs, encs_count, sizeof(encs[0]), SET_OF_xer_order); + + for(; enc < end; enc++) { + ASN__CALLBACK(enc->buffer, enc->offset); + FREEMEM(enc->buffer); + enc->buffer = 0; + control_size += enc->offset; + } + assert(control_size == er.encoded); + } + + goto cleanup; +cb_failed: + er.encoded = -1; + er.failed_type = td; + er.structure_ptr = sptr; +cleanup: + if(encs) { + while(encs_count-- > 0) { + if(encs[encs_count].buffer) + FREEMEM(encs[encs_count].buffer); + } + FREEMEM(encs); + } + ASN__ENCODED_OK(er); +} + +int +SET_OF_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_TYPE_member_t *elm = td->elements; + const asn_anonymous_set_ *list = _A_CSET_FROM_VOID(sptr); + int ret; + int i; + + if(!sptr) return (cb("", 8, app_key) < 0) ? -1 : 0; + + /* Dump preamble */ + if(cb(td->name, strlen(td->name), app_key) < 0 + || cb(" ::= {", 6, app_key) < 0) + return -1; + + for(i = 0; i < list->count; i++) { + const void *memb_ptr = list->array[i]; + if(!memb_ptr) continue; + + _i_INDENT(1); + + ret = elm->type->print_struct(elm->type, memb_ptr, + ilevel + 1, cb, app_key); + if(ret) return ret; + } + + ilevel--; + _i_INDENT(1); + + return (cb("}", 1, app_key) < 0) ? -1 : 0; +} + +void +SET_OF_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) { + if(td && ptr) { + asn_SET_OF_specifics_t *specs; + asn_TYPE_member_t *elm = td->elements; + asn_anonymous_set_ *list = _A_SET_FROM_VOID(ptr); + asn_struct_ctx_t *ctx; /* Decoder context */ + int i; + + /* + * Could not use set_of_empty() because of (*free) + * incompatibility. + */ + for(i = 0; i < list->count; i++) { + void *memb_ptr = list->array[i]; + if(memb_ptr) + ASN_STRUCT_FREE(*elm->type, memb_ptr); + } + list->count = 0; /* No meaningful elements left */ + + asn_set_empty(list); /* Remove (list->array) */ + + specs = (asn_SET_OF_specifics_t *)td->specifics; + ctx = (asn_struct_ctx_t *)((char *)ptr + specs->ctx_offset); + if(ctx->ptr) { + ASN_STRUCT_FREE(*elm->type, ctx->ptr); + ctx->ptr = 0; + } + + if(!contents_only) { + FREEMEM(ptr); + } + } +} + +int +SET_OF_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + asn_TYPE_member_t *elm = td->elements; + asn_constr_check_f *constr; + const asn_anonymous_set_ *list = _A_CSET_FROM_VOID(sptr); + int i; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + constr = elm->memb_constraints; + if(!constr) constr = elm->type->check_constraints; + + /* + * Iterate over the members of an array. + * Validate each in turn, until one fails. + */ + for(i = 0; i < list->count; i++) { + const void *memb_ptr = list->array[i]; + int ret; + + if(!memb_ptr) continue; + + ret = constr(elm->type, memb_ptr, ctfailcb, app_key); + if(ret) return ret; + } + + /* + * Cannot inherit it eralier: + * need to make sure we get the updated version. + */ + if(!elm->memb_constraints) + elm->memb_constraints = elm->type->check_constraints; + + return 0; +} + +asn_dec_rval_t +SET_OF_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + asn_dec_rval_t rv; + asn_SET_OF_specifics_t *specs = (asn_SET_OF_specifics_t *)td->specifics; + asn_TYPE_member_t *elm = td->elements; /* Single one */ + void *st = *sptr; + asn_anonymous_set_ *list; + asn_per_constraint_t *ct; + int repeat = 0; + ssize_t nelems; + + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + ASN__DECODE_FAILED; + + /* + * Create the target structure if it is not present already. + */ + if(!st) { + st = *sptr = CALLOC(1, specs->struct_size); + if(!st) ASN__DECODE_FAILED; + } + list = _A_SET_FROM_VOID(st); + + /* Figure out which constraints to use */ + if(constraints) ct = &constraints->size; + else if(td->per_constraints) ct = &td->per_constraints->size; + else ct = 0; + + if(ct && ct->flags & APC_EXTENSIBLE) { + int value = per_get_few_bits(pd, 1); + if(value < 0) ASN__DECODE_STARVED; + if(value) ct = 0; /* Not restricted! */ + } + + if(ct && ct->effective_bits >= 0) { + /* X.691, #19.5: No length determinant */ + nelems = per_get_few_bits(pd, ct->effective_bits); + ASN_DEBUG("Preparing to fetch %ld+%ld elements from %s", + (long)nelems, ct->lower_bound, td->name); + if(nelems < 0) ASN__DECODE_STARVED; + nelems += ct->lower_bound; + } else { + nelems = -1; + } + + do { + int i; + if(nelems < 0) { + nelems = uper_get_length(pd, + ct ? ct->effective_bits : -1, &repeat); + ASN_DEBUG("Got to decode %d elements (eff %d)", + (int)nelems, (int)(ct ? ct->effective_bits : -1)); + if(nelems < 0) ASN__DECODE_STARVED; + } + + for(i = 0; i < nelems; i++) { + void *ptr = 0; + ASN_DEBUG("SET OF %s decoding", elm->type->name); + rv = elm->type->uper_decoder(opt_codec_ctx, elm->type, + elm->per_constraints, &ptr, pd); + ASN_DEBUG("%s SET OF %s decoded %d, %p", + td->name, elm->type->name, rv.code, ptr); + if(rv.code == RC_OK) { + if(ASN_SET_ADD(list, ptr) == 0) + continue; + ASN_DEBUG("Failed to add element into %s", + td->name); + /* Fall through */ + rv.code = RC_FAIL; + } else { + ASN_DEBUG("Failed decoding %s of %s (SET OF)", + elm->type->name, td->name); + } + if(ptr) ASN_STRUCT_FREE(*elm->type, ptr); + return rv; + } + + nelems = -1; /* Allow uper_get_length() */ + } while(repeat); + + ASN_DEBUG("Decoded %s as SET OF", td->name); + + rv.code = RC_OK; + rv.consumed = 0; + return rv; +} + diff --git a/src/cryptoconditions/src/asn/constr_SET_OF.h b/src/cryptoconditions/src/asn/constr_SET_OF.h new file mode 100644 index 000000000..75e18cfa0 --- /dev/null +++ b/src/cryptoconditions/src/asn/constr_SET_OF.h @@ -0,0 +1,42 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _CONSTR_SET_OF_H_ +#define _CONSTR_SET_OF_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef const struct asn_SET_OF_specifics_s { + /* + * Target structure description. + */ + int struct_size; /* Size of the target structure. */ + int ctx_offset; /* Offset of the asn_struct_ctx_t member */ + + /* XER-specific stuff */ + int as_XMLValueList; /* The member type must be encoded like this */ +} asn_SET_OF_specifics_t; + +/* + * A set specialized functions dealing with the SET OF type. + */ +asn_struct_free_f SET_OF_free; +asn_struct_print_f SET_OF_print; +asn_constr_check_f SET_OF_constraint; +ber_type_decoder_f SET_OF_decode_ber; +der_type_encoder_f SET_OF_encode_der; +xer_type_decoder_f SET_OF_decode_xer; +xer_type_encoder_f SET_OF_encode_xer; +per_type_decoder_f SET_OF_decode_uper; +per_type_encoder_f SET_OF_encode_uper; + +#ifdef __cplusplus +} +#endif + +#endif /* _CONSTR_SET_OF_H_ */ diff --git a/src/cryptoconditions/src/asn/constr_TYPE.c b/src/cryptoconditions/src/asn/constr_TYPE.c new file mode 100644 index 000000000..322f68c86 --- /dev/null +++ b/src/cryptoconditions/src/asn/constr_TYPE.c @@ -0,0 +1,77 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * Version of the ASN.1 infrastructure shipped with compiler. + */ +int get_asn1c_environment_version() { return ASN1C_ENVIRONMENT_VERSION; } + +static asn_app_consume_bytes_f _print2fp; + +/* + * Return the outmost tag of the type. + */ +ber_tlv_tag_t +asn_TYPE_outmost_tag(const asn_TYPE_descriptor_t *type_descriptor, + const void *struct_ptr, int tag_mode, ber_tlv_tag_t tag) { + + if(tag_mode) + return tag; + + if(type_descriptor->tags_count) + return type_descriptor->tags[0]; + + return type_descriptor->outmost_tag(type_descriptor, struct_ptr, 0, 0); +} + +/* + * Print the target language's structure in human readable form. + */ +int +asn_fprint(FILE *stream, asn_TYPE_descriptor_t *td, const void *struct_ptr) { + if(!stream) stream = stdout; + if(!td || !struct_ptr) { + errno = EINVAL; + return -1; + } + + /* Invoke type-specific printer */ + if(td->print_struct(td, struct_ptr, 1, _print2fp, stream)) + return -1; + + /* Terminate the output */ + if(_print2fp("\n", 1, stream)) + return -1; + + return fflush(stream); +} + +/* Dump the data into the specified stdio stream */ +static int +_print2fp(const void *buffer, size_t size, void *app_key) { + FILE *stream = (FILE *)app_key; + + if(fwrite(buffer, 1, size, stream) != size) + return -1; + + return 0; +} + + +/* + * Some compilers do not support variable args macros. + * This function is a replacement of ASN_DEBUG() macro. + */ +void ASN_DEBUG_f(const char *fmt, ...); +void ASN_DEBUG_f(const char *fmt, ...) { + va_list ap; + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + va_end(ap); +} diff --git a/src/cryptoconditions/src/asn/constr_TYPE.h b/src/cryptoconditions/src/asn/constr_TYPE.h new file mode 100644 index 000000000..a9cd86dc3 --- /dev/null +++ b/src/cryptoconditions/src/asn/constr_TYPE.h @@ -0,0 +1,180 @@ +/*- + * Copyright (c) 2003, 2004, 2005, 2006 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * This file contains the declaration structure called "ASN.1 Type Definition", + * which holds all information necessary for encoding and decoding routines. + * This structure even contains pointer to these encoding and decoding routines + * for each defined ASN.1 type. + */ +#ifndef _CONSTR_TYPE_H_ +#define _CONSTR_TYPE_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ +struct asn_TYPE_member_s; /* Forward declaration */ + +/* + * This type provides the context information for various ASN.1 routines, + * primarily ones doing decoding. A member _asn_ctx of this type must be + * included into certain target language's structures, such as compound types. + */ +typedef struct asn_struct_ctx_s { + short phase; /* Decoding phase */ + short step; /* Elementary step of a phase */ + int context; /* Other context information */ + void *ptr; /* Decoder-specific stuff (stack elements) */ + ber_tlv_len_t left; /* Number of bytes left, -1 for indefinite */ +} asn_struct_ctx_t; + +#include /* Basic Encoding Rules decoder */ +#include /* Distinguished Encoding Rules encoder */ +#include /* Decoder of XER (XML, text) */ +#include /* Encoder into XER (XML, text) */ +#include /* Packet Encoding Rules decoder */ +#include /* Packet Encoding Rules encoder */ +#include /* Subtype constraints support */ + +/* + * Free the structure according to its specification. + * If (free_contents_only) is set, the wrapper structure itself (struct_ptr) + * will not be freed. (It may be useful in case the structure is allocated + * statically or arranged on the stack, yet its elements are allocated + * dynamically.) + */ +typedef void (asn_struct_free_f)( + struct asn_TYPE_descriptor_s *type_descriptor, + void *struct_ptr, int free_contents_only); +#define ASN_STRUCT_FREE(asn_DEF, ptr) (asn_DEF).free_struct(&(asn_DEF),ptr,0) +#define ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF, ptr) \ + (asn_DEF).free_struct(&(asn_DEF),ptr,1) + +/* + * Print the structure according to its specification. + */ +typedef int (asn_struct_print_f)( + struct asn_TYPE_descriptor_s *type_descriptor, + const void *struct_ptr, + int level, /* Indentation level */ + asn_app_consume_bytes_f *callback, void *app_key); + +/* + * Return the outmost tag of the type. + * If the type is untagged CHOICE, the dynamic operation is performed. + * NOTE: This function pointer type is only useful internally. + * Do not use it in your application. + */ +typedef ber_tlv_tag_t (asn_outmost_tag_f)( + const struct asn_TYPE_descriptor_s *type_descriptor, + const void *struct_ptr, int tag_mode, ber_tlv_tag_t tag); +/* The instance of the above function type; used internally. */ +asn_outmost_tag_f asn_TYPE_outmost_tag; + + +/* + * The definitive description of the destination language's structure. + */ +typedef struct asn_TYPE_descriptor_s { + const char *name; /* A name of the ASN.1 type. "" in some cases. */ + const char *xml_tag; /* Name used in XML tag */ + + /* + * Generalized functions for dealing with the specific type. + * May be directly invoked by applications. + */ + asn_struct_free_f *free_struct; /* Free the structure */ + asn_struct_print_f *print_struct; /* Human readable output */ + asn_constr_check_f *check_constraints; /* Constraints validator */ + ber_type_decoder_f *ber_decoder; /* Generic BER decoder */ + der_type_encoder_f *der_encoder; /* Canonical DER encoder */ + xer_type_decoder_f *xer_decoder; /* Generic XER decoder */ + xer_type_encoder_f *xer_encoder; /* [Canonical] XER encoder */ + per_type_decoder_f *uper_decoder; /* Unaligned PER decoder */ + per_type_encoder_f *uper_encoder; /* Unaligned PER encoder */ + + /*********************************************************************** + * Internally useful members. Not to be used by applications directly. * + **********************************************************************/ + + /* + * Tags that are expected to occur. + */ + asn_outmost_tag_f *outmost_tag; /* */ + const ber_tlv_tag_t *tags; /* Effective tags sequence for this type */ + int tags_count; /* Number of tags which are expected */ + const ber_tlv_tag_t *all_tags; /* Every tag for BER/containment */ + int all_tags_count; /* Number of tags */ + + asn_per_constraints_t *per_constraints; /* PER compiled constraints */ + + /* + * An ASN.1 production type members (members of SEQUENCE, SET, CHOICE). + */ + struct asn_TYPE_member_s *elements; + int elements_count; + + /* + * Additional information describing the type, used by appropriate + * functions above. + */ + const void *specifics; +} asn_TYPE_descriptor_t; + +/* + * This type describes an element of the constructed type, + * i.e. SEQUENCE, SET, CHOICE, etc. + */ + enum asn_TYPE_flags_e { + ATF_NOFLAGS, + ATF_POINTER = 0x01, /* Represented by the pointer */ + ATF_OPEN_TYPE = 0x02 /* ANY type, without meaningful tag */ + }; +typedef struct asn_TYPE_member_s { + enum asn_TYPE_flags_e flags; /* Element's presentation flags */ + int optional; /* Following optional members, including current */ + int memb_offset; /* Offset of the element */ + ber_tlv_tag_t tag; /* Outmost (most immediate) tag */ + int tag_mode; /* IMPLICIT/no/EXPLICIT tag at current level */ + asn_TYPE_descriptor_t *type; /* Member type descriptor */ + asn_constr_check_f *memb_constraints; /* Constraints validator */ + asn_per_constraints_t *per_constraints; /* PER compiled constraints */ + int (*default_value)(int setval, void **sptr); /* DEFAULT */ + const char *name; /* ASN.1 identifier of the element */ +} asn_TYPE_member_t; + +/* + * BER tag to element number mapping. + */ +typedef struct asn_TYPE_tag2member_s { + ber_tlv_tag_t el_tag; /* Outmost tag of the member */ + int el_no; /* Index of the associated member, base 0 */ + int toff_first; /* First occurence of the el_tag, relative */ + int toff_last; /* Last occurence of the el_tag, relatvie */ +} asn_TYPE_tag2member_t; + +/* + * This function is a wrapper around (td)->print_struct, which prints out + * the contents of the target language's structure (struct_ptr) into the + * file pointer (stream) in human readable form. + * RETURN VALUES: + * 0: The structure is printed. + * -1: Problem dumping the structure. + * (See also xer_fprint() in xer_encoder.h) + */ +int asn_fprint(FILE *stream, /* Destination stream descriptor */ + asn_TYPE_descriptor_t *td, /* ASN.1 type descriptor */ + const void *struct_ptr); /* Structure to be printed */ + +#ifdef __cplusplus +} +#endif + +#endif /* _CONSTR_TYPE_H_ */ diff --git a/src/cryptoconditions/src/asn/constraints.c b/src/cryptoconditions/src/asn/constraints.c new file mode 100644 index 000000000..1bdda73e5 --- /dev/null +++ b/src/cryptoconditions/src/asn/constraints.c @@ -0,0 +1,93 @@ +#include "asn_internal.h" +#include "constraints.h" + +int +asn_generic_no_constraint(asn_TYPE_descriptor_t *type_descriptor, + const void *struct_ptr, asn_app_constraint_failed_f *cb, void *key) { + + (void)type_descriptor; /* Unused argument */ + (void)struct_ptr; /* Unused argument */ + (void)cb; /* Unused argument */ + (void)key; /* Unused argument */ + + /* Nothing to check */ + return 0; +} + +int +asn_generic_unknown_constraint(asn_TYPE_descriptor_t *type_descriptor, + const void *struct_ptr, asn_app_constraint_failed_f *cb, void *key) { + + (void)type_descriptor; /* Unused argument */ + (void)struct_ptr; /* Unused argument */ + (void)cb; /* Unused argument */ + (void)key; /* Unused argument */ + + /* Unknown how to check */ + return 0; +} + +struct errbufDesc { + asn_TYPE_descriptor_t *failed_type; + const void *failed_struct_ptr; + char *errbuf; + size_t errlen; +}; + +static void +_asn_i_ctfailcb(void *key, asn_TYPE_descriptor_t *td, const void *sptr, const char *fmt, ...) { + struct errbufDesc *arg = key; + va_list ap; + ssize_t vlen; + ssize_t maxlen; + + arg->failed_type = td; + arg->failed_struct_ptr = sptr; + + maxlen = arg->errlen; + if(maxlen <= 0) + return; + + va_start(ap, fmt); + vlen = vsnprintf(arg->errbuf, maxlen, fmt, ap); + va_end(ap); + if(vlen >= maxlen) { + arg->errbuf[maxlen-1] = '\0'; /* Ensuring libc correctness */ + arg->errlen = maxlen - 1; /* Not counting termination */ + return; + } else if(vlen >= 0) { + arg->errbuf[vlen] = '\0'; /* Ensuring libc correctness */ + arg->errlen = vlen; /* Not counting termination */ + } else { + /* + * The libc on this system is broken. + */ + vlen = sizeof("") - 1; + maxlen--; + arg->errlen = vlen < maxlen ? vlen : maxlen; + memcpy(arg->errbuf, "", arg->errlen); + arg->errbuf[arg->errlen] = 0; + } + + return; +} + +int +asn_check_constraints(asn_TYPE_descriptor_t *type_descriptor, + const void *struct_ptr, char *errbuf, size_t *errlen) { + struct errbufDesc arg; + int ret; + + arg.failed_type = 0; + arg.failed_struct_ptr = 0; + arg.errbuf = errbuf; + arg.errlen = errlen ? *errlen : 0; + + ret = type_descriptor->check_constraints(type_descriptor, + struct_ptr, _asn_i_ctfailcb, &arg); + if(ret == -1 && errlen) + *errlen = arg.errlen; + + return ret; +} + diff --git a/src/cryptoconditions/src/asn/constraints.h b/src/cryptoconditions/src/asn/constraints.h new file mode 100644 index 000000000..48d49e246 --- /dev/null +++ b/src/cryptoconditions/src/asn/constraints.h @@ -0,0 +1,63 @@ +/*- + * Copyright (c) 2004, 2006 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN1_CONSTRAINTS_VALIDATOR_H +#define ASN1_CONSTRAINTS_VALIDATOR_H + +#include /* Platform-dependent types */ + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + +/* + * Validate the structure according to the ASN.1 constraints. + * If errbuf and errlen are given, they shall be pointing to the appropriate + * buffer space and its length before calling this function. Alternatively, + * they could be passed as NULL's. If constraints validation fails, + * errlen will contain the actual number of bytes taken from the errbuf + * to encode an error message (properly 0-terminated). + * + * RETURN VALUES: + * This function returns 0 in case all ASN.1 constraints are met + * and -1 if one or more constraints were failed. + */ +int +asn_check_constraints(struct asn_TYPE_descriptor_s *type_descriptor, + const void *struct_ptr, /* Target language's structure */ + char *errbuf, /* Returned error description */ + size_t *errlen /* Length of the error description */ + ); + + +/* + * Generic type for constraint checking callback, + * associated with every type descriptor. + */ +typedef int (asn_constr_check_f)( + struct asn_TYPE_descriptor_s *type_descriptor, + const void *struct_ptr, + asn_app_constraint_failed_f *optional_callback, /* Log the error */ + void *optional_app_key /* Opaque key passed to a callback */ + ); + +/******************************* + * INTERNALLY USEFUL FUNCTIONS * + *******************************/ + +asn_constr_check_f asn_generic_no_constraint; /* No constraint whatsoever */ +asn_constr_check_f asn_generic_unknown_constraint; /* Not fully supported */ + +/* + * Invoke the callback with a complete error message. + */ +#define ASN__CTFAIL if(ctfailcb) ctfailcb + +#ifdef __cplusplus +} +#endif + +#endif /* ASN1_CONSTRAINTS_VALIDATOR_H */ diff --git a/src/cryptoconditions/src/asn/der_encoder.c b/src/cryptoconditions/src/asn/der_encoder.c new file mode 100644 index 000000000..1c014802a --- /dev/null +++ b/src/cryptoconditions/src/asn/der_encoder.c @@ -0,0 +1,201 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +static ssize_t der_write_TL(ber_tlv_tag_t tag, ber_tlv_len_t len, + asn_app_consume_bytes_f *cb, void *app_key, int constructed); + +/* + * The DER encoder of any type. + */ +asn_enc_rval_t +der_encode(asn_TYPE_descriptor_t *type_descriptor, void *struct_ptr, + asn_app_consume_bytes_f *consume_bytes, void *app_key) { + + ASN_DEBUG("DER encoder invoked for %s", + type_descriptor->name); + + /* + * Invoke type-specific encoder. + */ + return type_descriptor->der_encoder(type_descriptor, + struct_ptr, /* Pointer to the destination structure */ + 0, 0, + consume_bytes, app_key); +} + +/* + * Argument type and callback necessary for der_encode_to_buffer(). + */ +typedef struct enc_to_buf_arg { + void *buffer; + size_t left; +} enc_to_buf_arg; +static int encode_to_buffer_cb(const void *buffer, size_t size, void *key) { + enc_to_buf_arg *arg = (enc_to_buf_arg *)key; + + if(arg->left < size) + return -1; /* Data exceeds the available buffer size */ + + memcpy(arg->buffer, buffer, size); + arg->buffer = ((char *)arg->buffer) + size; + arg->left -= size; + + return 0; +} + +/* + * A variant of the der_encode() which encodes the data into the provided buffer + */ +asn_enc_rval_t +der_encode_to_buffer(asn_TYPE_descriptor_t *type_descriptor, void *struct_ptr, + void *buffer, size_t buffer_size) { + enc_to_buf_arg arg; + asn_enc_rval_t ec; + + arg.buffer = buffer; + arg.left = buffer_size; + + ec = type_descriptor->der_encoder(type_descriptor, + struct_ptr, /* Pointer to the destination structure */ + 0, 0, encode_to_buffer_cb, &arg); + if(ec.encoded != -1) { + assert(ec.encoded == (ssize_t)(buffer_size - arg.left)); + /* Return the encoded contents size */ + } + return ec; +} + + +/* + * Write out leading TL[v] sequence according to the type definition. + */ +ssize_t +der_write_tags(asn_TYPE_descriptor_t *sd, + size_t struct_length, + int tag_mode, int last_tag_form, + ber_tlv_tag_t tag, /* EXPLICIT or IMPLICIT tag */ + asn_app_consume_bytes_f *cb, + void *app_key) { + const ber_tlv_tag_t *tags; /* Copy of tags stream */ + int tags_count; /* Number of tags */ + size_t overall_length; + ssize_t *lens; + int i; + + ASN_DEBUG("Writing tags (%s, tm=%d, tc=%d, tag=%s, mtc=%d)", + sd->name, tag_mode, sd->tags_count, + ber_tlv_tag_string(tag), + tag_mode + ?(sd->tags_count+1 + -((tag_mode == -1) && sd->tags_count)) + :sd->tags_count + ); + + if(tag_mode) { + /* + * Instead of doing shaman dance like we do in ber_check_tags(), + * allocate a small array on the stack + * and initialize it appropriately. + */ + int stag_offset; + ber_tlv_tag_t *tags_buf; + tags_buf = (ber_tlv_tag_t *)alloca((sd->tags_count + 1) * sizeof(ber_tlv_tag_t)); + if(!tags_buf) { /* Can fail on !x86 */ + errno = ENOMEM; + return -1; + } + tags_count = sd->tags_count + + 1 /* EXPLICIT or IMPLICIT tag is given */ + - ((tag_mode == -1) && sd->tags_count); + /* Copy tags over */ + tags_buf[0] = tag; + stag_offset = -1 + ((tag_mode == -1) && sd->tags_count); + for(i = 1; i < tags_count; i++) + tags_buf[i] = sd->tags[i + stag_offset]; + tags = tags_buf; + } else { + tags = sd->tags; + tags_count = sd->tags_count; + } + + /* No tags to write */ + if(tags_count == 0) + return 0; + + lens = (ssize_t *)alloca(tags_count * sizeof(lens[0])); + if(!lens) { + errno = ENOMEM; + return -1; + } + + /* + * Array of tags is initialized. + * Now, compute the size of the TLV pairs, from right to left. + */ + overall_length = struct_length; + for(i = tags_count - 1; i >= 0; --i) { + lens[i] = der_write_TL(tags[i], overall_length, 0, 0, 0); + if(lens[i] == -1) return -1; + overall_length += lens[i]; + lens[i] = overall_length - lens[i]; + } + + if(!cb) return overall_length - struct_length; + + ASN_DEBUG("%s %s TL sequence (%d elements)", + cb?"Encoding":"Estimating", sd->name, tags_count); + + /* + * Encode the TL sequence for real. + */ + for(i = 0; i < tags_count; i++) { + ssize_t len; + int _constr; + + /* Check if this tag happens to be constructed */ + _constr = (last_tag_form || i < (tags_count - 1)); + + len = der_write_TL(tags[i], lens[i], cb, app_key, _constr); + if(len == -1) return -1; + } + + return overall_length - struct_length; +} + +static ssize_t +der_write_TL(ber_tlv_tag_t tag, ber_tlv_len_t len, + asn_app_consume_bytes_f *cb, void *app_key, + int constructed) { + uint8_t buf[32]; + size_t size = 0; + int buf_size = cb?sizeof(buf):0; + ssize_t tmp; + + /* Serialize tag (T from TLV) into possibly zero-length buffer */ + tmp = ber_tlv_tag_serialize(tag, buf, buf_size); + if(tmp == -1 || tmp > (ssize_t)sizeof(buf)) return -1; + size += tmp; + + /* Serialize length (L from TLV) into possibly zero-length buffer */ + tmp = der_tlv_length_serialize(len, buf+size, buf_size?buf_size-size:0); + if(tmp == -1) return -1; + size += tmp; + + if(size > sizeof(buf)) + return -1; + + /* + * If callback is specified, invoke it, and check its return value. + */ + if(cb) { + if(constructed) *buf |= 0x20; + if(cb(buf, size, app_key) < 0) + return -1; + } + + return size; +} diff --git a/src/cryptoconditions/src/asn/der_encoder.h b/src/cryptoconditions/src/asn/der_encoder.h new file mode 100644 index 000000000..61431c6db --- /dev/null +++ b/src/cryptoconditions/src/asn/der_encoder.h @@ -0,0 +1,68 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _DER_ENCODER_H_ +#define _DER_ENCODER_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + +/* + * The DER encoder of any type. May be invoked by the application. + * The ber_decode() function (ber_decoder.h) is an opposite of der_encode(). + */ +asn_enc_rval_t der_encode(struct asn_TYPE_descriptor_s *type_descriptor, + void *struct_ptr, /* Structure to be encoded */ + asn_app_consume_bytes_f *consume_bytes_cb, + void *app_key /* Arbitrary callback argument */ + ); + +/* A variant of der_encode() which encodes data into the pre-allocated buffer */ +asn_enc_rval_t der_encode_to_buffer( + struct asn_TYPE_descriptor_s *type_descriptor, + void *struct_ptr, /* Structure to be encoded */ + void *buffer, /* Pre-allocated buffer */ + size_t buffer_size /* Initial buffer size (maximum) */ + ); + +/* + * Type of the generic DER encoder. + */ +typedef asn_enc_rval_t (der_type_encoder_f)( + struct asn_TYPE_descriptor_s *type_descriptor, + void *struct_ptr, /* Structure to be encoded */ + int tag_mode, /* {-1,0,1}: IMPLICIT, no, EXPLICIT */ + ber_tlv_tag_t tag, + asn_app_consume_bytes_f *consume_bytes_cb, /* Callback */ + void *app_key /* Arbitrary callback argument */ + ); + + +/******************************* + * INTERNALLY USEFUL FUNCTIONS * + *******************************/ + +/* + * Write out leading TL[v] sequence according to the type definition. + */ +ssize_t der_write_tags( + struct asn_TYPE_descriptor_s *type_descriptor, + size_t struct_length, + int tag_mode, /* {-1,0,1}: IMPLICIT, no, EXPLICIT */ + int last_tag_form, /* {0,!0}: prim, constructed */ + ber_tlv_tag_t tag, + asn_app_consume_bytes_f *consume_bytes_cb, + void *app_key + ); + +#ifdef __cplusplus +} +#endif + +#endif /* _DER_ENCODER_H_ */ diff --git a/src/cryptoconditions/src/asn/per_decoder.c b/src/cryptoconditions/src/asn/per_decoder.c new file mode 100644 index 000000000..461b7262f --- /dev/null +++ b/src/cryptoconditions/src/asn/per_decoder.c @@ -0,0 +1,93 @@ +#include +#include +#include + +/* + * Decode a "Production of a complete encoding", X.691#10.1. + * The complete encoding contains at least one byte, and is an integral + * multiple of 8 bytes. + */ +asn_dec_rval_t +uper_decode_complete(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const void *buffer, size_t size) { + asn_dec_rval_t rval; + + rval = uper_decode(opt_codec_ctx, td, sptr, buffer, size, 0, 0); + if(rval.consumed) { + /* + * We've always given 8-aligned data, + * so convert bits to integral bytes. + */ + rval.consumed += 7; + rval.consumed >>= 3; + } else if(rval.code == RC_OK) { + if(size) { + if(((const uint8_t *)buffer)[0] == 0) { + rval.consumed = 1; /* 1 byte */ + } else { + ASN_DEBUG("Expecting single zeroed byte"); + rval.code = RC_FAIL; + } + } else { + /* Must contain at least 8 bits. */ + rval.code = RC_WMORE; + } + } + + return rval; +} + +asn_dec_rval_t +uper_decode(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const void *buffer, size_t size, int skip_bits, int unused_bits) { + asn_codec_ctx_t s_codec_ctx; + asn_dec_rval_t rval; + asn_per_data_t pd; + + if(skip_bits < 0 || skip_bits > 7 + || unused_bits < 0 || unused_bits > 7 + || (unused_bits > 0 && !size)) + ASN__DECODE_FAILED; + + /* + * Stack checker requires that the codec context + * must be allocated on the stack. + */ + if(opt_codec_ctx) { + if(opt_codec_ctx->max_stack_size) { + s_codec_ctx = *opt_codec_ctx; + opt_codec_ctx = &s_codec_ctx; + } + } else { + /* If context is not given, be security-conscious anyway */ + memset(&s_codec_ctx, 0, sizeof(s_codec_ctx)); + s_codec_ctx.max_stack_size = ASN__DEFAULT_STACK_MAX; + opt_codec_ctx = &s_codec_ctx; + } + + /* Fill in the position indicator */ + memset(&pd, 0, sizeof(pd)); + pd.buffer = (const uint8_t *)buffer; + pd.nboff = skip_bits; + pd.nbits = 8 * size - unused_bits; /* 8 is CHAR_BIT from */ + if(pd.nboff > pd.nbits) + ASN__DECODE_FAILED; + + /* + * Invoke type-specific decoder. + */ + if(!td->uper_decoder) + ASN__DECODE_FAILED; /* PER is not compiled in */ + rval = td->uper_decoder(opt_codec_ctx, td, 0, sptr, &pd); + if(rval.code == RC_OK) { + /* Return the number of consumed bits */ + rval.consumed = ((pd.buffer - (const uint8_t *)buffer) << 3) + + pd.nboff - skip_bits; + ASN_DEBUG("PER decoding consumed %ld, counted %ld", + (long)rval.consumed, (long)pd.moved); + assert(rval.consumed == pd.moved); + } else { + /* PER codec is not a restartable */ + rval.consumed = 0; + } + return rval; +} + diff --git a/src/cryptoconditions/src/asn/per_decoder.h b/src/cryptoconditions/src/asn/per_decoder.h new file mode 100644 index 000000000..8397a545f --- /dev/null +++ b/src/cryptoconditions/src/asn/per_decoder.h @@ -0,0 +1,56 @@ +/*- + * Copyright (c) 2005, 2007 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _PER_DECODER_H_ +#define _PER_DECODER_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + +/* + * Unaligned PER decoder of a "complete encoding" as per X.691#10.1. + * On success, this call always returns (.consumed >= 1), as per X.691#10.1.3. + */ +asn_dec_rval_t uper_decode_complete(struct asn_codec_ctx_s *opt_codec_ctx, + struct asn_TYPE_descriptor_s *type_descriptor, /* Type to decode */ + void **struct_ptr, /* Pointer to a target structure's pointer */ + const void *buffer, /* Data to be decoded */ + size_t size /* Size of data buffer */ + ); + +/* + * Unaligned PER decoder of any ASN.1 type. May be invoked by the application. + * WARNING: This call returns the number of BITS read from the stream. Beware. + */ +asn_dec_rval_t uper_decode(struct asn_codec_ctx_s *opt_codec_ctx, + struct asn_TYPE_descriptor_s *type_descriptor, /* Type to decode */ + void **struct_ptr, /* Pointer to a target structure's pointer */ + const void *buffer, /* Data to be decoded */ + size_t size, /* Size of data buffer */ + int skip_bits, /* Number of unused leading bits, 0..7 */ + int unused_bits /* Number of unused tailing bits, 0..7 */ + ); + + +/* + * Type of the type-specific PER decoder function. + */ +typedef asn_dec_rval_t (per_type_decoder_f)(asn_codec_ctx_t *opt_codec_ctx, + struct asn_TYPE_descriptor_s *type_descriptor, + asn_per_constraints_t *constraints, + void **struct_ptr, + asn_per_data_t *per_data + ); + +#ifdef __cplusplus +} +#endif + +#endif /* _PER_DECODER_H_ */ diff --git a/src/cryptoconditions/src/asn/per_encoder.c b/src/cryptoconditions/src/asn/per_encoder.c new file mode 100644 index 000000000..47f3c916d --- /dev/null +++ b/src/cryptoconditions/src/asn/per_encoder.c @@ -0,0 +1,151 @@ +#include +#include +#include + +static asn_enc_rval_t uper_encode_internal(asn_TYPE_descriptor_t *td, asn_per_constraints_t *, void *sptr, asn_app_consume_bytes_f *cb, void *app_key); + +asn_enc_rval_t +uper_encode(asn_TYPE_descriptor_t *td, void *sptr, asn_app_consume_bytes_f *cb, void *app_key) { + return uper_encode_internal(td, 0, sptr, cb, app_key); +} + +/* + * Argument type and callback necessary for uper_encode_to_buffer(). + */ +typedef struct enc_to_buf_arg { + void *buffer; + size_t left; +} enc_to_buf_arg; +static int encode_to_buffer_cb(const void *buffer, size_t size, void *key) { + enc_to_buf_arg *arg = (enc_to_buf_arg *)key; + + if(arg->left < size) + return -1; /* Data exceeds the available buffer size */ + + memcpy(arg->buffer, buffer, size); + arg->buffer = ((char *)arg->buffer) + size; + arg->left -= size; + + return 0; +} + +asn_enc_rval_t +uper_encode_to_buffer(asn_TYPE_descriptor_t *td, void *sptr, void *buffer, size_t buffer_size) { + enc_to_buf_arg key; + + key.buffer = buffer; + key.left = buffer_size; + + if(td) ASN_DEBUG("Encoding \"%s\" using UNALIGNED PER", td->name); + + return uper_encode_internal(td, 0, sptr, encode_to_buffer_cb, &key); +} + +typedef struct enc_dyn_arg { + void *buffer; + size_t length; + size_t allocated; +} enc_dyn_arg; +static int +encode_dyn_cb(const void *buffer, size_t size, void *key) { + enc_dyn_arg *arg = key; + if(arg->length + size >= arg->allocated) { + void *p; + arg->allocated = arg->allocated ? (arg->allocated << 2) : size; + p = REALLOC(arg->buffer, arg->allocated); + if(!p) { + FREEMEM(arg->buffer); + memset(arg, 0, sizeof(*arg)); + return -1; + } + arg->buffer = p; + } + memcpy(((char *)arg->buffer) + arg->length, buffer, size); + arg->length += size; + return 0; +} +ssize_t +uper_encode_to_new_buffer(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, void **buffer_r) { + asn_enc_rval_t er; + enc_dyn_arg key; + + memset(&key, 0, sizeof(key)); + + er = uper_encode_internal(td, constraints, sptr, encode_dyn_cb, &key); + switch(er.encoded) { + case -1: + FREEMEM(key.buffer); + return -1; + case 0: + FREEMEM(key.buffer); + key.buffer = MALLOC(1); + if(key.buffer) { + *(char *)key.buffer = '\0'; + *buffer_r = key.buffer; + return 1; + } else { + return -1; + } + default: + *buffer_r = key.buffer; + ASN_DEBUG("Complete encoded in %ld bits", (long)er.encoded); + return ((er.encoded + 7) >> 3); + } +} + +/* + * Internally useful functions. + */ + +/* Flush partially filled buffer */ +static int +_uper_encode_flush_outp(asn_per_outp_t *po) { + uint8_t *buf; + + if(po->nboff == 0 && po->buffer == po->tmpspace) + return 0; + + buf = po->buffer + (po->nboff >> 3); + /* Make sure we account for the last, partially filled */ + if(po->nboff & 0x07) { + buf[0] &= 0xff << (8 - (po->nboff & 0x07)); + buf++; + } + + return po->outper(po->tmpspace, buf - po->tmpspace, po->op_key); +} + +static asn_enc_rval_t +uper_encode_internal(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_app_consume_bytes_f *cb, void *app_key) { + asn_per_outp_t po; + asn_enc_rval_t er; + + /* + * Invoke type-specific encoder. + */ + if(!td || !td->uper_encoder) + ASN__ENCODE_FAILED; /* PER is not compiled in */ + + po.buffer = po.tmpspace; + po.nboff = 0; + po.nbits = 8 * sizeof(po.tmpspace); + po.outper = cb; + po.op_key = app_key; + po.flushed_bytes = 0; + + er = td->uper_encoder(td, constraints, sptr, &po); + if(er.encoded != -1) { + size_t bits_to_flush; + + bits_to_flush = ((po.buffer - po.tmpspace) << 3) + po.nboff; + + /* Set number of bits encoded to a firm value */ + er.encoded = (po.flushed_bytes << 3) + bits_to_flush; + + if(_uper_encode_flush_outp(&po)) + ASN__ENCODE_FAILED; + } + + return er; +} + diff --git a/src/cryptoconditions/src/asn/per_encoder.h b/src/cryptoconditions/src/asn/per_encoder.h new file mode 100644 index 000000000..95a6506e4 --- /dev/null +++ b/src/cryptoconditions/src/asn/per_encoder.h @@ -0,0 +1,69 @@ +/*- + * Copyright (c) 2006, 2007 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _PER_ENCODER_H_ +#define _PER_ENCODER_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + +/* + * Unaligned PER encoder of any ASN.1 type. May be invoked by the application. + * WARNING: This function returns the number of encoded bits in the .encoded + * field of the return value. Use the following formula to convert to bytes: + * bytes = ((.encoded + 7) / 8) + */ +asn_enc_rval_t uper_encode(struct asn_TYPE_descriptor_s *type_descriptor, + void *struct_ptr, /* Structure to be encoded */ + asn_app_consume_bytes_f *consume_bytes_cb, /* Data collector */ + void *app_key /* Arbitrary callback argument */ +); + +/* + * A variant of uper_encode() which encodes data into the existing buffer + * WARNING: This function returns the number of encoded bits in the .encoded + * field of the return value. + */ +asn_enc_rval_t uper_encode_to_buffer( + struct asn_TYPE_descriptor_s *type_descriptor, + void *struct_ptr, /* Structure to be encoded */ + void *buffer, /* Pre-allocated buffer */ + size_t buffer_size /* Initial buffer size (max) */ +); + +/* + * A variant of uper_encode_to_buffer() which allocates buffer itself. + * Returns the number of bytes in the buffer or -1 in case of failure. + * WARNING: This function produces a "Production of the complete encoding", + * with length of at least one octet. Contrast this to precise bit-packing + * encoding of uper_encode() and uper_encode_to_buffer(). + */ +ssize_t uper_encode_to_new_buffer( + struct asn_TYPE_descriptor_s *type_descriptor, + asn_per_constraints_t *constraints, + void *struct_ptr, /* Structure to be encoded */ + void **buffer_r /* Buffer allocated and returned */ +); + +/* + * Type of the generic PER encoder function. + */ +typedef asn_enc_rval_t (per_type_encoder_f)( + struct asn_TYPE_descriptor_s *type_descriptor, + asn_per_constraints_t *constraints, + void *struct_ptr, + asn_per_outp_t *per_output +); + +#ifdef __cplusplus +} +#endif + +#endif /* _PER_ENCODER_H_ */ diff --git a/src/cryptoconditions/src/asn/per_opentype.c b/src/cryptoconditions/src/asn/per_opentype.c new file mode 100644 index 000000000..404aa7264 --- /dev/null +++ b/src/cryptoconditions/src/asn/per_opentype.c @@ -0,0 +1,378 @@ +/* + * Copyright (c) 2007 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include +#include + +typedef struct uper_ugot_key { + asn_per_data_t oldpd; /* Old per data source */ + size_t unclaimed; + size_t ot_moved; /* Number of bits moved by OT processing */ + int repeat; +} uper_ugot_key; + +static int uper_ugot_refill(asn_per_data_t *pd); +static int per_skip_bits(asn_per_data_t *pd, int skip_nbits); +static asn_dec_rval_t uper_sot_suck(asn_codec_ctx_t *, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd); + +/* + * Encode an "open type field". + * #10.1, #10.2 + */ +int +uper_open_type_put(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { + void *buf; + void *bptr; + ssize_t size; + size_t toGo; + + ASN_DEBUG("Open type put %s ...", td->name); + + size = uper_encode_to_new_buffer(td, constraints, sptr, &buf); + if(size <= 0) return -1; + + for(bptr = buf, toGo = size; toGo;) { + ssize_t maySave = uper_put_length(po, toGo); + ASN_DEBUG("Prepending length %d to %s and allowing to save %d", + (int)size, td->name, (int)maySave); + if(maySave < 0) break; + if(per_put_many_bits(po, bptr, maySave * 8)) break; + bptr = (char *)bptr + maySave; + toGo -= maySave; + } + + FREEMEM(buf); + if(toGo) return -1; + + ASN_DEBUG("Open type put %s of length %ld + overhead (1byte?)", + td->name, (long)size); + + return 0; +} + +static asn_dec_rval_t +uper_open_type_get_simple(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + asn_dec_rval_t rv; + ssize_t chunk_bytes; + int repeat; + uint8_t *buf = 0; + size_t bufLen = 0; + size_t bufSize = 0; + asn_per_data_t spd; + size_t padding; + + ASN__STACK_OVERFLOW_CHECK(ctx); + + ASN_DEBUG("Getting open type %s...", td->name); + + do { + chunk_bytes = uper_get_length(pd, -1, &repeat); + if(chunk_bytes < 0) { + FREEMEM(buf); + ASN__DECODE_STARVED; + } + if(bufLen + chunk_bytes > bufSize) { + void *ptr; + bufSize = chunk_bytes + (bufSize << 2); + ptr = REALLOC(buf, bufSize); + if(!ptr) { + FREEMEM(buf); + ASN__DECODE_FAILED; + } + buf = ptr; + } + if(per_get_many_bits(pd, buf + bufLen, 0, chunk_bytes << 3)) { + FREEMEM(buf); + ASN__DECODE_STARVED; + } + bufLen += chunk_bytes; + } while(repeat); + + ASN_DEBUG("Getting open type %s encoded in %ld bytes", td->name, + (long)bufLen); + + memset(&spd, 0, sizeof(spd)); + spd.buffer = buf; + spd.nbits = bufLen << 3; + + ASN_DEBUG_INDENT_ADD(+4); + rv = td->uper_decoder(ctx, td, constraints, sptr, &spd); + ASN_DEBUG_INDENT_ADD(-4); + + if(rv.code == RC_OK) { + /* Check padding validity */ + padding = spd.nbits - spd.nboff; + if ((padding < 8 || + /* X.691#10.1.3 */ + (spd.nboff == 0 && spd.nbits == 8 && spd.buffer == buf)) && + per_get_few_bits(&spd, padding) == 0) { + /* Everything is cool */ + FREEMEM(buf); + return rv; + } + FREEMEM(buf); + if(padding >= 8) { + ASN_DEBUG("Too large padding %d in open type", (int)padding); + ASN__DECODE_FAILED; + } else { + ASN_DEBUG("Non-zero padding"); + ASN__DECODE_FAILED; + } + } else { + FREEMEM(buf); + /* rv.code could be RC_WMORE, nonsense in this context */ + rv.code = RC_FAIL; /* Noone would give us more */ + } + + return rv; +} + +static asn_dec_rval_t GCC_NOTUSED +uper_open_type_get_complex(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + uper_ugot_key arg; + asn_dec_rval_t rv; + ssize_t padding; + + ASN__STACK_OVERFLOW_CHECK(ctx); + + ASN_DEBUG("Getting open type %s from %s", td->name, + per_data_string(pd)); + arg.oldpd = *pd; + arg.unclaimed = 0; + arg.ot_moved = 0; + arg.repeat = 1; + pd->refill = uper_ugot_refill; + pd->refill_key = &arg; + pd->nbits = pd->nboff; /* 0 good bits at this point, will refill */ + pd->moved = 0; /* This now counts the open type size in bits */ + + ASN_DEBUG_INDENT_ADD(+4); + rv = td->uper_decoder(ctx, td, constraints, sptr, pd); + ASN_DEBUG_INDENT_ADD(-4); + +#define UPDRESTOREPD do { \ + /* buffer and nboff are valid, preserve them. */ \ + pd->nbits = arg.oldpd.nbits - (pd->moved - arg.ot_moved); \ + pd->moved = arg.oldpd.moved + (pd->moved - arg.ot_moved); \ + pd->refill = arg.oldpd.refill; \ + pd->refill_key = arg.oldpd.refill_key; \ + } while(0) + + if(rv.code != RC_OK) { + UPDRESTOREPD; + return rv; + } + + ASN_DEBUG("OpenType %s pd%s old%s unclaimed=%d, repeat=%d", td->name, + per_data_string(pd), + per_data_string(&arg.oldpd), + (int)arg.unclaimed, (int)arg.repeat); + + padding = pd->moved % 8; + if(padding) { + int32_t pvalue; + if(padding > 7) { + ASN_DEBUG("Too large padding %d in open type", + (int)padding); + rv.code = RC_FAIL; + UPDRESTOREPD; + return rv; + } + padding = 8 - padding; + ASN_DEBUG("Getting padding of %d bits", (int)padding); + pvalue = per_get_few_bits(pd, padding); + switch(pvalue) { + case -1: + ASN_DEBUG("Padding skip failed"); + UPDRESTOREPD; + ASN__DECODE_STARVED; + case 0: break; + default: + ASN_DEBUG("Non-blank padding (%d bits 0x%02x)", + (int)padding, (int)pvalue); + UPDRESTOREPD; + ASN__DECODE_FAILED; + } + } + if(pd->nboff != pd->nbits) { + ASN_DEBUG("Open type %s overhead pd%s old%s", td->name, + per_data_string(pd), per_data_string(&arg.oldpd)); + if(1) { + UPDRESTOREPD; + ASN__DECODE_FAILED; + } else { + arg.unclaimed += pd->nbits - pd->nboff; + } + } + + /* Adjust pd back so it points to original data */ + UPDRESTOREPD; + + /* Skip data not consumed by the decoder */ + if(arg.unclaimed) { + ASN_DEBUG("Getting unclaimed %d", (int)arg.unclaimed); + switch(per_skip_bits(pd, arg.unclaimed)) { + case -1: + ASN_DEBUG("Claim of %d failed", (int)arg.unclaimed); + ASN__DECODE_STARVED; + case 0: + ASN_DEBUG("Got claim of %d", (int)arg.unclaimed); + break; + default: + /* Padding must be blank */ + ASN_DEBUG("Non-blank unconsumed padding"); + ASN__DECODE_FAILED; + } + arg.unclaimed = 0; + } + + if(arg.repeat) { + ASN_DEBUG("Not consumed the whole thing"); + rv.code = RC_FAIL; + return rv; + } + + return rv; +} + + +asn_dec_rval_t +uper_open_type_get(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + + return uper_open_type_get_simple(ctx, td, constraints, sptr, pd); +} + +int +uper_open_type_skip(asn_codec_ctx_t *ctx, asn_per_data_t *pd) { + asn_TYPE_descriptor_t s_td; + asn_dec_rval_t rv; + + s_td.name = ""; + s_td.uper_decoder = uper_sot_suck; + + rv = uper_open_type_get(ctx, &s_td, 0, 0, pd); + if(rv.code != RC_OK) + return -1; + else + return 0; +} + +/* + * Internal functions. + */ + +static asn_dec_rval_t +uper_sot_suck(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + asn_dec_rval_t rv; + + (void)ctx; + (void)td; + (void)constraints; + (void)sptr; + + while(per_get_few_bits(pd, 24) >= 0); + + rv.code = RC_OK; + rv.consumed = pd->moved; + + return rv; +} + +static int +uper_ugot_refill(asn_per_data_t *pd) { + uper_ugot_key *arg = pd->refill_key; + ssize_t next_chunk_bytes, next_chunk_bits; + ssize_t avail; + + asn_per_data_t *oldpd = &arg->oldpd; + + ASN_DEBUG("REFILLING pd->moved=%ld, oldpd->moved=%ld", + (long)pd->moved, (long)oldpd->moved); + + /* Advance our position to where pd is */ + oldpd->buffer = pd->buffer; + oldpd->nboff = pd->nboff; + oldpd->nbits -= pd->moved - arg->ot_moved; + oldpd->moved += pd->moved - arg->ot_moved; + arg->ot_moved = pd->moved; + + if(arg->unclaimed) { + /* Refill the container */ + if(per_get_few_bits(oldpd, 1)) + return -1; + if(oldpd->nboff == 0) { + assert(0); + return -1; + } + pd->buffer = oldpd->buffer; + pd->nboff = oldpd->nboff - 1; + pd->nbits = oldpd->nbits; + ASN_DEBUG("UNCLAIMED <- return from (pd->moved=%ld)", + (long)pd->moved); + return 0; + } + + if(!arg->repeat) { + ASN_DEBUG("Want more but refill doesn't have it"); + return -1; + } + + next_chunk_bytes = uper_get_length(oldpd, -1, &arg->repeat); + ASN_DEBUG("Open type LENGTH %ld bytes at off %ld, repeat %ld", + (long)next_chunk_bytes, (long)oldpd->moved, (long)arg->repeat); + if(next_chunk_bytes < 0) return -1; + if(next_chunk_bytes == 0) { + pd->refill = 0; /* No more refills, naturally */ + assert(!arg->repeat); /* Implementation guarantee */ + } + next_chunk_bits = next_chunk_bytes << 3; + avail = oldpd->nbits - oldpd->nboff; + if(avail >= next_chunk_bits) { + pd->nbits = oldpd->nboff + next_chunk_bits; + arg->unclaimed = 0; + ASN_DEBUG("!+Parent frame %ld bits, alloting %ld [%ld..%ld] (%ld)", + (long)next_chunk_bits, (long)oldpd->moved, + (long)oldpd->nboff, (long)oldpd->nbits, + (long)(oldpd->nbits - oldpd->nboff)); + } else { + pd->nbits = oldpd->nbits; + arg->unclaimed = next_chunk_bits - avail; + ASN_DEBUG("!-Parent frame %ld, require %ld, will claim %ld", + (long)avail, (long)next_chunk_bits, + (long)arg->unclaimed); + } + pd->buffer = oldpd->buffer; + pd->nboff = oldpd->nboff; + ASN_DEBUG("Refilled pd%s old%s", + per_data_string(pd), per_data_string(oldpd)); + return 0; +} + +static int +per_skip_bits(asn_per_data_t *pd, int skip_nbits) { + int hasNonZeroBits = 0; + while(skip_nbits > 0) { + int skip; + + /* per_get_few_bits() is more efficient when nbits <= 24 */ + if(skip_nbits < 24) + skip = skip_nbits; + else + skip = 24; + skip_nbits -= skip; + + switch(per_get_few_bits(pd, skip)) { + case -1: return -1; /* Starving */ + case 0: continue; /* Skipped empty space */ + default: hasNonZeroBits = 1; continue; + } + } + return hasNonZeroBits; +} diff --git a/src/cryptoconditions/src/asn/per_opentype.h b/src/cryptoconditions/src/asn/per_opentype.h new file mode 100644 index 000000000..facfaa637 --- /dev/null +++ b/src/cryptoconditions/src/asn/per_opentype.h @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2007 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _PER_OPENTYPE_H_ +#define _PER_OPENTYPE_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +asn_dec_rval_t uper_open_type_get(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd); + +int uper_open_type_skip(asn_codec_ctx_t *opt_codec_ctx, asn_per_data_t *pd); + +int uper_open_type_put(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po); + +#ifdef __cplusplus +} +#endif + +#endif /* _PER_OPENTYPE_H_ */ diff --git a/src/cryptoconditions/src/asn/per_support.c b/src/cryptoconditions/src/asn/per_support.c new file mode 100644 index 000000000..14b4c4c76 --- /dev/null +++ b/src/cryptoconditions/src/asn/per_support.c @@ -0,0 +1,483 @@ +/* + * Copyright (c) 2005-2014 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +char * +per_data_string(asn_per_data_t *pd) { + static char buf[2][32]; + static int n; + n = (n+1) % 2; + snprintf(buf[n], sizeof(buf[n]), + "{m=%ld span %+ld[%d..%d] (%d)}", + (long)pd->moved, + (((long)pd->buffer) & 0xf), + (int)pd->nboff, (int)pd->nbits, + (int)(pd->nbits - pd->nboff)); + return buf[n]; +} + +void +per_get_undo(asn_per_data_t *pd, int nbits) { + if((ssize_t)pd->nboff < nbits) { + assert((ssize_t)pd->nboff < nbits); + } else { + pd->nboff -= nbits; + pd->moved -= nbits; + } +} + +/* + * Extract a small number of bits (<= 31) from the specified PER data pointer. + */ +int32_t +per_get_few_bits(asn_per_data_t *pd, int nbits) { + size_t off; /* Next after last bit offset */ + ssize_t nleft; /* Number of bits left in this stream */ + uint32_t accum; + const uint8_t *buf; + + if(nbits < 0) + return -1; + + nleft = pd->nbits - pd->nboff; + if(nbits > nleft) { + int32_t tailv, vhead; + if(!pd->refill || nbits > 31) return -1; + /* Accumulate unused bytes before refill */ + ASN_DEBUG("Obtain the rest %d bits (want %d)", + (int)nleft, (int)nbits); + tailv = per_get_few_bits(pd, nleft); + if(tailv < 0) return -1; + /* Refill (replace pd contents with new data) */ + if(pd->refill(pd)) + return -1; + nbits -= nleft; + vhead = per_get_few_bits(pd, nbits); + /* Combine the rest of previous pd with the head of new one */ + tailv = (tailv << nbits) | vhead; /* Could == -1 */ + return tailv; + } + + /* + * Normalize position indicator. + */ + if(pd->nboff >= 8) { + pd->buffer += (pd->nboff >> 3); + pd->nbits -= (pd->nboff & ~0x07); + pd->nboff &= 0x07; + } + pd->moved += nbits; + pd->nboff += nbits; + off = pd->nboff; + buf = pd->buffer; + + /* + * Extract specified number of bits. + */ + if(off <= 8) + accum = nbits ? (buf[0]) >> (8 - off) : 0; + else if(off <= 16) + accum = ((buf[0] << 8) + buf[1]) >> (16 - off); + else if(off <= 24) + accum = ((buf[0] << 16) + (buf[1] << 8) + buf[2]) >> (24 - off); + else if(off <= 31) + accum = ((buf[0] << 24) + (buf[1] << 16) + + (buf[2] << 8) + (buf[3])) >> (32 - off); + else if(nbits <= 31) { + asn_per_data_t tpd = *pd; + /* Here are we with our 31-bits limit plus 1..7 bits offset. */ + per_get_undo(&tpd, nbits); + /* The number of available bits in the stream allow + * for the following operations to take place without + * invoking the ->refill() function */ + accum = per_get_few_bits(&tpd, nbits - 24) << 24; + accum |= per_get_few_bits(&tpd, 24); + } else { + per_get_undo(pd, nbits); + return -1; + } + + accum &= (((uint32_t)1 << nbits) - 1); + + ASN_DEBUG(" [PER got %2d<=%2d bits => span %d %+ld[%d..%d]:%02x (%d) => 0x%x]", + (int)nbits, (int)nleft, + (int)pd->moved, + (((long)pd->buffer) & 0xf), + (int)pd->nboff, (int)pd->nbits, + ((pd->buffer != NULL)?pd->buffer[0]:0), + (int)(pd->nbits - pd->nboff), + (int)accum); + + return accum; +} + +/* + * Extract a large number of bits from the specified PER data pointer. + */ +int +per_get_many_bits(asn_per_data_t *pd, uint8_t *dst, int alright, int nbits) { + int32_t value; + + if(alright && (nbits & 7)) { + /* Perform right alignment of a first few bits */ + value = per_get_few_bits(pd, nbits & 0x07); + if(value < 0) return -1; + *dst++ = value; /* value is already right-aligned */ + nbits &= ~7; + } + + while(nbits) { + if(nbits >= 24) { + value = per_get_few_bits(pd, 24); + if(value < 0) return -1; + *(dst++) = value >> 16; + *(dst++) = value >> 8; + *(dst++) = value; + nbits -= 24; + } else { + value = per_get_few_bits(pd, nbits); + if(value < 0) return -1; + if(nbits & 7) { /* implies left alignment */ + value <<= 8 - (nbits & 7), + nbits += 8 - (nbits & 7); + if(nbits > 24) + *dst++ = value >> 24; + } + if(nbits > 16) + *dst++ = value >> 16; + if(nbits > 8) + *dst++ = value >> 8; + *dst++ = value; + break; + } + } + + return 0; +} + +/* + * Get the length "n" from the stream. + */ +ssize_t +uper_get_length(asn_per_data_t *pd, int ebits, int *repeat) { + ssize_t value; + + *repeat = 0; + + if(ebits >= 0) return per_get_few_bits(pd, ebits); + + value = per_get_few_bits(pd, 8); + if(value < 0) return -1; + if((value & 128) == 0) /* #10.9.3.6 */ + return (value & 0x7F); + if((value & 64) == 0) { /* #10.9.3.7 */ + value = ((value & 63) << 8) | per_get_few_bits(pd, 8); + if(value < 0) return -1; + return value; + } + value &= 63; /* this is "m" from X.691, #10.9.3.8 */ + if(value < 1 || value > 4) + return -1; + *repeat = 1; + return (16384 * value); +} + +/* + * Get the normally small length "n". + * This procedure used to decode length of extensions bit-maps + * for SET and SEQUENCE types. + */ +ssize_t +uper_get_nslength(asn_per_data_t *pd) { + ssize_t length; + + ASN_DEBUG("Getting normally small length"); + + if(per_get_few_bits(pd, 1) == 0) { + length = per_get_few_bits(pd, 6) + 1; + if(length <= 0) return -1; + ASN_DEBUG("l=%d", (int)length); + return length; + } else { + int repeat; + length = uper_get_length(pd, -1, &repeat); + if(length >= 0 && !repeat) return length; + return -1; /* Error, or do not support >16K extensions */ + } +} + +/* + * Get the normally small non-negative whole number. + * X.691, #10.6 + */ +ssize_t +uper_get_nsnnwn(asn_per_data_t *pd) { + ssize_t value; + + value = per_get_few_bits(pd, 7); + if(value & 64) { /* implicit (value < 0) */ + value &= 63; + value <<= 2; + value |= per_get_few_bits(pd, 2); + if(value & 128) /* implicit (value < 0) */ + return -1; + if(value == 0) + return 0; + if(value >= 3) + return -1; + value = per_get_few_bits(pd, 8 * value); + return value; + } + + return value; +} + +/* + * X.691-11/2008, #11.6 + * Encoding of a normally small non-negative whole number + */ +int +uper_put_nsnnwn(asn_per_outp_t *po, int n) { + int bytes; + + if(n <= 63) { + if(n < 0) return -1; + return per_put_few_bits(po, n, 7); + } + if(n < 256) + bytes = 1; + else if(n < 65536) + bytes = 2; + else if(n < 256 * 65536) + bytes = 3; + else + return -1; /* This is not a "normally small" value */ + if(per_put_few_bits(po, bytes, 8)) + return -1; + + return per_put_few_bits(po, n, 8 * bytes); +} + + +/* X.691-2008/11, #11.5.6 -> #11.3 */ +int uper_get_constrained_whole_number(asn_per_data_t *pd, unsigned long *out_value, int nbits) { + unsigned long lhalf; /* Lower half of the number*/ + long half; + + if(nbits <= 31) { + half = per_get_few_bits(pd, nbits); + if(half < 0) return -1; + *out_value = half; + return 0; + } + + if((size_t)nbits > 8 * sizeof(*out_value)) + return -1; /* RANGE */ + + half = per_get_few_bits(pd, 31); + if(half < 0) return -1; + + if(uper_get_constrained_whole_number(pd, &lhalf, nbits - 31)) + return -1; + + *out_value = ((unsigned long)half << (nbits - 31)) | lhalf; + return 0; +} + + +/* X.691-2008/11, #11.5.6 -> #11.3 */ +int uper_put_constrained_whole_number_s(asn_per_outp_t *po, long v, int nbits) { + /* + * Assume signed number can be safely coerced into + * unsigned of the same range. + * The following testing code will likely be optimized out + * by compiler if it is true. + */ + unsigned long uvalue1 = ULONG_MAX; + long svalue = uvalue1; + unsigned long uvalue2 = svalue; + assert(uvalue1 == uvalue2); + return uper_put_constrained_whole_number_u(po, v, nbits); +} + +int uper_put_constrained_whole_number_u(asn_per_outp_t *po, unsigned long v, int nbits) { + if(nbits <= 31) { + return per_put_few_bits(po, v, nbits); + } else { + /* Put higher portion first, followed by lower 31-bit */ + if(uper_put_constrained_whole_number_u(po, v >> 31, nbits - 31)) + return -1; + return per_put_few_bits(po, v, 31); + } +} + +/* + * Put a small number of bits (<= 31). + */ +int +per_put_few_bits(asn_per_outp_t *po, uint32_t bits, int obits) { + size_t off; /* Next after last bit offset */ + size_t omsk; /* Existing last byte meaningful bits mask */ + uint8_t *buf; + + if(obits <= 0 || obits >= 32) return obits ? -1 : 0; + + ASN_DEBUG("[PER put %d bits %x to %p+%d bits]", + obits, (int)bits, po->buffer, (int)po->nboff); + + /* + * Normalize position indicator. + */ + if(po->nboff >= 8) { + po->buffer += (po->nboff >> 3); + po->nbits -= (po->nboff & ~0x07); + po->nboff &= 0x07; + } + + /* + * Flush whole-bytes output, if necessary. + */ + if(po->nboff + obits > po->nbits) { + int complete_bytes = (po->buffer - po->tmpspace); + ASN_DEBUG("[PER output %ld complete + %ld]", + (long)complete_bytes, (long)po->flushed_bytes); + if(po->outper(po->tmpspace, complete_bytes, po->op_key) < 0) + return -1; + if(po->nboff) + po->tmpspace[0] = po->buffer[0]; + po->buffer = po->tmpspace; + po->nbits = 8 * sizeof(po->tmpspace); + po->flushed_bytes += complete_bytes; + } + + /* + * Now, due to sizeof(tmpspace), we are guaranteed large enough space. + */ + buf = po->buffer; + omsk = ~((1 << (8 - po->nboff)) - 1); + off = (po->nboff + obits); + + /* Clear data of debris before meaningful bits */ + bits &= (((uint32_t)1 << obits) - 1); + + ASN_DEBUG("[PER out %d %u/%x (t=%d,o=%d) %x&%x=%x]", obits, + (int)bits, (int)bits, + (int)po->nboff, (int)off, + buf[0], (int)(omsk&0xff), + (int)(buf[0] & omsk)); + + if(off <= 8) /* Completely within 1 byte */ + po->nboff = off, + bits <<= (8 - off), + buf[0] = (buf[0] & omsk) | bits; + else if(off <= 16) + po->nboff = off, + bits <<= (16 - off), + buf[0] = (buf[0] & omsk) | (bits >> 8), + buf[1] = bits; + else if(off <= 24) + po->nboff = off, + bits <<= (24 - off), + buf[0] = (buf[0] & omsk) | (bits >> 16), + buf[1] = bits >> 8, + buf[2] = bits; + else if(off <= 31) + po->nboff = off, + bits <<= (32 - off), + buf[0] = (buf[0] & omsk) | (bits >> 24), + buf[1] = bits >> 16, + buf[2] = bits >> 8, + buf[3] = bits; + else { + per_put_few_bits(po, bits >> (obits - 24), 24); + per_put_few_bits(po, bits, obits - 24); + } + + ASN_DEBUG("[PER out %u/%x => %02x buf+%ld]", + (int)bits, (int)bits, buf[0], + (long)(po->buffer - po->tmpspace)); + + return 0; +} + + +/* + * Output a large number of bits. + */ +int +per_put_many_bits(asn_per_outp_t *po, const uint8_t *src, int nbits) { + + while(nbits) { + uint32_t value; + + if(nbits >= 24) { + value = (src[0] << 16) | (src[1] << 8) | src[2]; + src += 3; + nbits -= 24; + if(per_put_few_bits(po, value, 24)) + return -1; + } else { + value = src[0]; + if(nbits > 8) + value = (value << 8) | src[1]; + if(nbits > 16) + value = (value << 8) | src[2]; + if(nbits & 0x07) + value >>= (8 - (nbits & 0x07)); + if(per_put_few_bits(po, value, nbits)) + return -1; + break; + } + } + + return 0; +} + +/* + * Put the length "n" (or part of it) into the stream. + */ +ssize_t +uper_put_length(asn_per_outp_t *po, size_t length) { + + if(length <= 127) /* #10.9.3.6 */ + return per_put_few_bits(po, length, 8) + ? -1 : (ssize_t)length; + else if(length < 16384) /* #10.9.3.7 */ + return per_put_few_bits(po, length|0x8000, 16) + ? -1 : (ssize_t)length; + + length >>= 14; + if(length > 4) length = 4; + + return per_put_few_bits(po, 0xC0 | length, 8) + ? -1 : (ssize_t)(length << 14); +} + + +/* + * Put the normally small length "n" into the stream. + * This procedure used to encode length of extensions bit-maps + * for SET and SEQUENCE types. + */ +int +uper_put_nslength(asn_per_outp_t *po, size_t length) { + + if(length <= 64) { + /* #10.9.3.4 */ + if(length == 0) return -1; + return per_put_few_bits(po, length-1, 7) ? -1 : 0; + } else { + if(uper_put_length(po, length) != (ssize_t)length) { + /* This might happen in case of >16K extensions */ + return -1; + } + } + + return 0; +} + diff --git a/src/cryptoconditions/src/asn/per_support.h b/src/cryptoconditions/src/asn/per_support.h new file mode 100644 index 000000000..a75ac94fc --- /dev/null +++ b/src/cryptoconditions/src/asn/per_support.h @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2005-2014 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _PER_SUPPORT_H_ +#define _PER_SUPPORT_H_ + +#include /* Platform-specific types */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Pre-computed PER constraints. + */ +typedef const struct asn_per_constraint_s { + enum asn_per_constraint_flags { + APC_UNCONSTRAINED = 0x0, /* No PER visible constraints */ + APC_SEMI_CONSTRAINED = 0x1, /* Constrained at "lb" */ + APC_CONSTRAINED = 0x2, /* Fully constrained */ + APC_EXTENSIBLE = 0x4 /* May have extension */ + } flags; + int range_bits; /* Full number of bits in the range */ + int effective_bits; /* Effective bits */ + long lower_bound; /* "lb" value */ + long upper_bound; /* "ub" value */ +} asn_per_constraint_t; +typedef const struct asn_per_constraints_s { + struct asn_per_constraint_s value; + struct asn_per_constraint_s size; + int (*value2code)(unsigned int value); + int (*code2value)(unsigned int code); +} asn_per_constraints_t; + +/* + * This structure describes a position inside an incoming PER bit stream. + */ +typedef struct asn_per_data_s { + const uint8_t *buffer; /* Pointer to the octet stream */ + size_t nboff; /* Bit offset to the meaningful bit */ + size_t nbits; /* Number of bits in the stream */ + size_t moved; /* Number of bits moved through this bit stream */ + int (*refill)(struct asn_per_data_s *); + void *refill_key; +} asn_per_data_t; + +/* + * Extract a small number of bits (<= 31) from the specified PER data pointer. + * This function returns -1 if the specified number of bits could not be + * extracted due to EOD or other conditions. + */ +int32_t per_get_few_bits(asn_per_data_t *per_data, int get_nbits); + +/* Undo the immediately preceeding "get_few_bits" operation */ +void per_get_undo(asn_per_data_t *per_data, int get_nbits); + +/* + * Extract a large number of bits from the specified PER data pointer. + * This function returns -1 if the specified number of bits could not be + * extracted due to EOD or other conditions. + */ +int per_get_many_bits(asn_per_data_t *pd, uint8_t *dst, int right_align, + int get_nbits); + +/* + * Get the length "n" from the Unaligned PER stream. + */ +ssize_t uper_get_length(asn_per_data_t *pd, + int effective_bound_bits, + int *repeat); + +/* + * Get the normally small length "n". + */ +ssize_t uper_get_nslength(asn_per_data_t *pd); + +/* + * Get the normally small non-negative whole number. + */ +ssize_t uper_get_nsnnwn(asn_per_data_t *pd); + +/* X.691-2008/11, #11.5.6 */ +int uper_get_constrained_whole_number(asn_per_data_t *pd, unsigned long *v, int nbits); + +/* Non-thread-safe debugging function, don't use it */ +char *per_data_string(asn_per_data_t *pd); + +/* + * This structure supports forming PER output. + */ +typedef struct asn_per_outp_s { + uint8_t *buffer; /* Pointer into the (tmpspace) */ + size_t nboff; /* Bit offset to the meaningful bit */ + size_t nbits; /* Number of bits left in (tmpspace) */ + uint8_t tmpspace[32]; /* Preliminary storage to hold data */ + int (*outper)(const void *data, size_t size, void *op_key); + void *op_key; /* Key for (outper) data callback */ + size_t flushed_bytes; /* Bytes already flushed through (outper) */ +} asn_per_outp_t; + +/* Output a small number of bits (<= 31) */ +int per_put_few_bits(asn_per_outp_t *per_data, uint32_t bits, int obits); + +/* Output a large number of bits */ +int per_put_many_bits(asn_per_outp_t *po, const uint8_t *src, int put_nbits); + +/* X.691-2008/11, #11.5 */ +int uper_put_constrained_whole_number_s(asn_per_outp_t *po, long v, int nbits); +int uper_put_constrained_whole_number_u(asn_per_outp_t *po, unsigned long v, int nbits); + +/* + * Put the length "n" to the Unaligned PER stream. + * This function returns the number of units which may be flushed + * in the next units saving iteration. + */ +ssize_t uper_put_length(asn_per_outp_t *po, size_t whole_length); + +/* + * Put the normally small length "n" to the Unaligned PER stream. + * Returns 0 or -1. + */ +int uper_put_nslength(asn_per_outp_t *po, size_t length); + +/* + * Put the normally small non-negative whole number. + */ +int uper_put_nsnnwn(asn_per_outp_t *po, int n); + +#ifdef __cplusplus +} +#endif + +#endif /* _PER_SUPPORT_H_ */ diff --git a/src/cryptoconditions/src/asn/xer_decoder.c b/src/cryptoconditions/src/asn/xer_decoder.c new file mode 100644 index 000000000..299a7c1ee --- /dev/null +++ b/src/cryptoconditions/src/asn/xer_decoder.c @@ -0,0 +1,368 @@ +/* + * Copyright (c) 2004, 2005 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include /* XER/XML parsing support */ + + +/* + * Decode the XER encoding of a given type. + */ +asn_dec_rval_t +xer_decode(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **struct_ptr, const void *buffer, size_t size) { + asn_codec_ctx_t s_codec_ctx; + + /* + * Stack checker requires that the codec context + * must be allocated on the stack. + */ + if(opt_codec_ctx) { + if(opt_codec_ctx->max_stack_size) { + s_codec_ctx = *opt_codec_ctx; + opt_codec_ctx = &s_codec_ctx; + } + } else { + /* If context is not given, be security-conscious anyway */ + memset(&s_codec_ctx, 0, sizeof(s_codec_ctx)); + s_codec_ctx.max_stack_size = ASN__DEFAULT_STACK_MAX; + opt_codec_ctx = &s_codec_ctx; + } + + /* + * Invoke type-specific decoder. + */ + return td->xer_decoder(opt_codec_ctx, td, struct_ptr, 0, buffer, size); +} + + + +struct xer__cb_arg { + pxml_chunk_type_e chunk_type; + size_t chunk_size; + const void *chunk_buf; + int callback_not_invoked; +}; + +static int +xer__token_cb(pxml_chunk_type_e type, const void *_chunk_data, size_t _chunk_size, void *key) { + struct xer__cb_arg *arg = (struct xer__cb_arg *)key; + arg->chunk_type = type; + arg->chunk_size = _chunk_size; + arg->chunk_buf = _chunk_data; + arg->callback_not_invoked = 0; + return -1; /* Terminate the XML parsing */ +} + +/* + * Fetch the next token from the XER/XML stream. + */ +ssize_t +xer_next_token(int *stateContext, const void *buffer, size_t size, pxer_chunk_type_e *ch_type) { + struct xer__cb_arg arg; + int new_stateContext = *stateContext; + ssize_t ret; + + arg.callback_not_invoked = 1; + ret = pxml_parse(&new_stateContext, buffer, size, xer__token_cb, &arg); + if(ret < 0) return -1; + if(arg.callback_not_invoked) { + assert(ret == 0); /* No data was consumed */ + *ch_type = PXER_WMORE; + return 0; /* Try again with more data */ + } else { + assert(arg.chunk_size); + assert(arg.chunk_buf == buffer); + } + + /* + * Translate the XML chunk types into more convenient ones. + */ + switch(arg.chunk_type) { + case PXML_TEXT: + *ch_type = PXER_TEXT; + break; + case PXML_TAG: + *ch_type = PXER_WMORE; + return 0; /* Want more */ + case PXML_TAG_END: + *ch_type = PXER_TAG; + break; + case PXML_COMMENT: + case PXML_COMMENT_END: + *ch_type = PXER_COMMENT; + break; + } + + *stateContext = new_stateContext; + return arg.chunk_size; +} + +#define CSLASH 0x2f /* '/' */ +#define LANGLE 0x3c /* '<' */ +#define RANGLE 0x3e /* '>' */ + +xer_check_tag_e +xer_check_tag(const void *buf_ptr, int size, const char *need_tag) { + const char *buf = (const char *)buf_ptr; + const char *end; + xer_check_tag_e ct = XCT_OPENING; + + if(size < 2 || buf[0] != LANGLE || buf[size-1] != RANGLE) { + if(size >= 2) + ASN_DEBUG("Broken XML tag: \"%c...%c\"", + buf[0], buf[size - 1]); + return XCT_BROKEN; + } + + /* + * Determine the tag class. + */ + if(buf[1] == CSLASH) { + buf += 2; /* advance past "" */ + ct = XCT_CLOSING; + if(size > 0 && buf[size-1] == CSLASH) + return XCT_BROKEN; /* */ + } else { + buf++; /* advance past "<" */ + size -= 2; /* strip "<" and ">" */ + if(size > 0 && buf[size-1] == CSLASH) { + ct = XCT_BOTH; + size--; /* One more, for "/" */ + } + } + + /* Sometimes we don't care about the tag */ + if(!need_tag || !*need_tag) + return (xer_check_tag_e)(XCT__UNK__MASK | ct); + + /* + * Determine the tag name. + */ + for(end = buf + size; buf < end; buf++, need_tag++) { + int b = *buf, n = *need_tag; + if(b != n) { + if(n == 0) { + switch(b) { + case 0x09: case 0x0a: case 0x0c: case 0x0d: + case 0x20: + /* "": whitespace is normal */ + return ct; + } + } + return (xer_check_tag_e)(XCT__UNK__MASK | ct); + } + if(b == 0) + return XCT_BROKEN; /* Embedded 0 in buf?! */ + } + if(*need_tag) + return (xer_check_tag_e)(XCT__UNK__MASK | ct); + + return ct; +} + + +#undef ADVANCE +#define ADVANCE(num_bytes) do { \ + size_t num = (num_bytes); \ + buf_ptr = ((const char *)buf_ptr) + num; \ + size -= num; \ + consumed_myself += num; \ + } while(0) + +#undef RETURN +#define RETURN(_code) do { \ + rval.code = _code; \ + rval.consumed = consumed_myself; \ + if(rval.code != RC_OK) \ + ASN_DEBUG("Failed with %d", rval.code); \ + return rval; \ + } while(0) + +#define XER_GOT_BODY(chunk_buf, chunk_size, size) do { \ + ssize_t converted_size = body_receiver \ + (struct_key, chunk_buf, chunk_size, \ + (size_t)chunk_size < size); \ + if(converted_size == -1) RETURN(RC_FAIL); \ + if(converted_size == 0 \ + && size == (size_t)chunk_size) \ + RETURN(RC_WMORE); \ + chunk_size = converted_size; \ + } while(0) +#define XER_GOT_EMPTY() do { \ + if(body_receiver(struct_key, 0, 0, size > 0) == -1) \ + RETURN(RC_FAIL); \ + } while(0) + +/* + * Generalized function for decoding the primitive values. + */ +asn_dec_rval_t +xer_decode_general(asn_codec_ctx_t *opt_codec_ctx, + asn_struct_ctx_t *ctx, /* Type decoder context */ + void *struct_key, + const char *xml_tag, /* Expected XML tag */ + const void *buf_ptr, size_t size, + int (*opt_unexpected_tag_decoder) + (void *struct_key, const void *chunk_buf, size_t chunk_size), + ssize_t (*body_receiver) + (void *struct_key, const void *chunk_buf, size_t chunk_size, + int have_more) + ) { + + asn_dec_rval_t rval; + ssize_t consumed_myself = 0; + + (void)opt_codec_ctx; + + /* + * Phases of XER/XML processing: + * Phase 0: Check that the opening tag matches our expectations. + * Phase 1: Processing body and reacting on closing tag. + */ + if(ctx->phase > 1) RETURN(RC_FAIL); + for(;;) { + pxer_chunk_type_e ch_type; /* XER chunk type */ + ssize_t ch_size; /* Chunk size */ + xer_check_tag_e tcv; /* Tag check value */ + + /* + * Get the next part of the XML stream. + */ + ch_size = xer_next_token(&ctx->context, buf_ptr, size, + &ch_type); + if(ch_size == -1) { + RETURN(RC_FAIL); + } else { + switch(ch_type) { + case PXER_WMORE: + RETURN(RC_WMORE); + case PXER_COMMENT: /* Got XML comment */ + ADVANCE(ch_size); /* Skip silently */ + continue; + case PXER_TEXT: + if(ctx->phase == 0) { + /* + * We have to ignore whitespace here, + * but in order to be forward compatible + * with EXTENDED-XER (EMBED-VALUES, #25) + * any text is just ignored here. + */ + } else { + XER_GOT_BODY(buf_ptr, ch_size, size); + } + ADVANCE(ch_size); + continue; + case PXER_TAG: + break; /* Check the rest down there */ + } + } + + assert(ch_type == PXER_TAG && size); + + tcv = xer_check_tag(buf_ptr, ch_size, xml_tag); + /* + * Phase 0: + * Expecting the opening tag + * for the type being processed. + * Phase 1: + * Waiting for the closing XML tag. + */ + switch(tcv) { + case XCT_BOTH: + if(ctx->phase) break; + /* Finished decoding of an empty element */ + XER_GOT_EMPTY(); + ADVANCE(ch_size); + ctx->phase = 2; /* Phase out */ + RETURN(RC_OK); + case XCT_OPENING: + if(ctx->phase) break; + ADVANCE(ch_size); + ctx->phase = 1; /* Processing body phase */ + continue; + case XCT_CLOSING: + if(!ctx->phase) break; + ADVANCE(ch_size); + ctx->phase = 2; /* Phase out */ + RETURN(RC_OK); + case XCT_UNKNOWN_BO: + /* + * Certain tags in the body may be expected. + */ + if(opt_unexpected_tag_decoder + && opt_unexpected_tag_decoder(struct_key, + buf_ptr, ch_size) >= 0) { + /* Tag's processed fine */ + ADVANCE(ch_size); + if(!ctx->phase) { + /* We are not expecting + * the closing tag anymore. */ + ctx->phase = 2; /* Phase out */ + RETURN(RC_OK); + } + continue; + } + /* Fall through */ + default: + break; /* Unexpected tag */ + } + + ASN_DEBUG("Unexpected XML tag (expected \"%s\")", xml_tag); + break; /* Dark and mysterious things have just happened */ + } + + RETURN(RC_FAIL); +} + + +size_t +xer_whitespace_span(const void *chunk_buf, size_t chunk_size) { + const char *p = (const char *)chunk_buf; + const char *pend = p + chunk_size; + + for(; p < pend; p++) { + switch(*p) { + /* X.693, #8.1.4 + * HORISONTAL TAB (9) + * LINE FEED (10) + * CARRIAGE RETURN (13) + * SPACE (32) + */ + case 0x09: case 0x0a: case 0x0d: case 0x20: + continue; + default: + break; + } + break; + } + return (p - (const char *)chunk_buf); +} + +/* + * This is a vastly simplified, non-validating XML tree skipper. + */ +int +xer_skip_unknown(xer_check_tag_e tcv, ber_tlv_len_t *depth) { + assert(*depth > 0); + switch(tcv) { + case XCT_BOTH: + case XCT_UNKNOWN_BO: + /* These negate each other. */ + return 0; + case XCT_OPENING: + case XCT_UNKNOWN_OP: + ++(*depth); + return 0; + case XCT_CLOSING: + case XCT_UNKNOWN_CL: + if(--(*depth) == 0) + return (tcv == XCT_CLOSING) ? 2 : 1; + return 0; + default: + return -1; + } +} diff --git a/src/cryptoconditions/src/asn/xer_decoder.h b/src/cryptoconditions/src/asn/xer_decoder.h new file mode 100644 index 000000000..301b613cf --- /dev/null +++ b/src/cryptoconditions/src/asn/xer_decoder.h @@ -0,0 +1,106 @@ +/*- + * Copyright (c) 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _XER_DECODER_H_ +#define _XER_DECODER_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + +/* + * The XER decoder of any ASN.1 type. May be invoked by the application. + */ +asn_dec_rval_t xer_decode(struct asn_codec_ctx_s *opt_codec_ctx, + struct asn_TYPE_descriptor_s *type_descriptor, + void **struct_ptr, /* Pointer to a target structure's pointer */ + const void *buffer, /* Data to be decoded */ + size_t size /* Size of data buffer */ + ); + +/* + * Type of the type-specific XER decoder function. + */ +typedef asn_dec_rval_t (xer_type_decoder_f)(asn_codec_ctx_t *opt_codec_ctx, + struct asn_TYPE_descriptor_s *type_descriptor, + void **struct_ptr, + const char *opt_mname, /* Member name */ + const void *buf_ptr, size_t size + ); + +/******************************* + * INTERNALLY USEFUL FUNCTIONS * + *******************************/ + +/* + * Generalized function for decoding the primitive values. + * Used by more specialized functions, such as OCTET_STRING_decode_xer_utf8 + * and others. This function should not be used by applications, as its API + * is subject to changes. + */ +asn_dec_rval_t xer_decode_general(asn_codec_ctx_t *opt_codec_ctx, + asn_struct_ctx_t *ctx, /* Type decoder context */ + void *struct_key, /* Treated as opaque pointer */ + const char *xml_tag, /* Expected XML tag name */ + const void *buf_ptr, size_t size, + int (*opt_unexpected_tag_decoder) + (void *struct_key, const void *chunk_buf, size_t chunk_size), + ssize_t (*body_receiver) + (void *struct_key, const void *chunk_buf, size_t chunk_size, + int have_more) + ); + + +/* + * Fetch the next XER (XML) token from the stream. + * The function returns the number of bytes occupied by the chunk type, + * returned in the _ch_type. The _ch_type is only set (and valid) when + * the return value is >= 0. + */ + typedef enum pxer_chunk_type { + PXER_WMORE, /* Chunk type is not clear, more data expected. */ + PXER_TAG, /* Complete XER tag */ + PXER_TEXT, /* Plain text between XER tags */ + PXER_COMMENT /* A comment, may be part of */ + } pxer_chunk_type_e; +ssize_t xer_next_token(int *stateContext, + const void *buffer, size_t size, pxer_chunk_type_e *_ch_type); + +/* + * This function checks the buffer against the tag name is expected to occur. + */ + typedef enum xer_check_tag { + XCT_BROKEN = 0, /* The tag is broken */ + XCT_OPENING = 1, /* This is the tag */ + XCT_CLOSING = 2, /* This is the tag */ + XCT_BOTH = 3, /* This is the tag */ + XCT__UNK__MASK = 4, /* Mask of everything unexpected */ + XCT_UNKNOWN_OP = 5, /* Unexpected tag */ + XCT_UNKNOWN_CL = 6, /* Unexpected tag */ + XCT_UNKNOWN_BO = 7 /* Unexpected tag */ + } xer_check_tag_e; +xer_check_tag_e xer_check_tag(const void *buf_ptr, int size, + const char *need_tag); + +/* + * Get the number of bytes consisting entirely of XER whitespace characters. + * RETURN VALUES: + * >=0: Number of whitespace characters in the string. + */ +size_t xer_whitespace_span(const void *chunk_buf, size_t chunk_size); + +/* + * Skip the series of anticipated extensions. + */ +int xer_skip_unknown(xer_check_tag_e tcv, ber_tlv_len_t *depth); + +#ifdef __cplusplus +} +#endif + +#endif /* _XER_DECODER_H_ */ diff --git a/src/cryptoconditions/src/asn/xer_encoder.c b/src/cryptoconditions/src/asn/xer_encoder.c new file mode 100644 index 000000000..460657580 --- /dev/null +++ b/src/cryptoconditions/src/asn/xer_encoder.c @@ -0,0 +1,67 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * The XER encoder of any type. May be invoked by the application. + */ +asn_enc_rval_t +xer_encode(asn_TYPE_descriptor_t *td, void *sptr, + enum xer_encoder_flags_e xer_flags, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t er, tmper; + const char *mname; + size_t mlen; + int xcan = (xer_flags & XER_F_CANONICAL) ? 1 : 2; + + if(!td || !sptr) goto cb_failed; + + mname = td->xml_tag; + mlen = strlen(mname); + + ASN__CALLBACK3("<", 1, mname, mlen, ">", 1); + + tmper = td->xer_encoder(td, sptr, 1, xer_flags, cb, app_key); + if(tmper.encoded == -1) return tmper; + + ASN__CALLBACK3("\n", xcan); + + er.encoded = 4 + xcan + (2 * mlen) + tmper.encoded; + + ASN__ENCODED_OK(er); +cb_failed: + ASN__ENCODE_FAILED; +} + +/* + * This is a helper function for xer_fprint, which directs all incoming data + * into the provided file descriptor. + */ +static int +xer__print2fp(const void *buffer, size_t size, void *app_key) { + FILE *stream = (FILE *)app_key; + + if(fwrite(buffer, 1, size, stream) != size) + return -1; + + return 0; +} + +int +xer_fprint(FILE *stream, asn_TYPE_descriptor_t *td, void *sptr) { + asn_enc_rval_t er; + + if(!stream) stream = stdout; + if(!td || !sptr) + return -1; + + er = xer_encode(td, sptr, XER_F_BASIC, xer__print2fp, stream); + if(er.encoded == -1) + return -1; + + return fflush(stream); +} diff --git a/src/cryptoconditions/src/asn/xer_encoder.h b/src/cryptoconditions/src/asn/xer_encoder.h new file mode 100644 index 000000000..055e73c0c --- /dev/null +++ b/src/cryptoconditions/src/asn/xer_encoder.h @@ -0,0 +1,59 @@ +/*- + * Copyright (c) 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _XER_ENCODER_H_ +#define _XER_ENCODER_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + +/* Flags used by the xer_encode() and (*xer_type_encoder_f), defined below */ +enum xer_encoder_flags_e { + /* Mode of encoding */ + XER_F_BASIC = 0x01, /* BASIC-XER (pretty-printing) */ + XER_F_CANONICAL = 0x02 /* Canonical XER (strict rules) */ +}; + +/* + * The XER encoder of any type. May be invoked by the application. + */ +asn_enc_rval_t xer_encode(struct asn_TYPE_descriptor_s *type_descriptor, + void *struct_ptr, /* Structure to be encoded */ + enum xer_encoder_flags_e xer_flags, + asn_app_consume_bytes_f *consume_bytes_cb, + void *app_key /* Arbitrary callback argument */ + ); + +/* + * The variant of the above function which dumps the BASIC-XER (XER_F_BASIC) + * output into the chosen file pointer. + * RETURN VALUES: + * 0: The structure is printed. + * -1: Problem printing the structure. + * WARNING: No sensible errno value is returned. + */ +int xer_fprint(FILE *stream, struct asn_TYPE_descriptor_s *td, void *sptr); + +/* + * Type of the generic XER encoder. + */ +typedef asn_enc_rval_t (xer_type_encoder_f)( + struct asn_TYPE_descriptor_s *type_descriptor, + void *struct_ptr, /* Structure to be encoded */ + int ilevel, /* Level of indentation */ + enum xer_encoder_flags_e xer_flags, + asn_app_consume_bytes_f *consume_bytes_cb, /* Callback */ + void *app_key /* Arbitrary callback argument */ + ); + +#ifdef __cplusplus +} +#endif + +#endif /* _XER_ENCODER_H_ */ diff --git a/src/cryptoconditions/src/asn/xer_support.c b/src/cryptoconditions/src/asn/xer_support.c new file mode 100644 index 000000000..36b4bfbfc --- /dev/null +++ b/src/cryptoconditions/src/asn/xer_support.c @@ -0,0 +1,227 @@ +/* + * Copyright (c) 2003, 2004 X/IO Labs, xiolabs.com. + * Copyright (c) 2003, 2004, 2005 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* Parser states */ +typedef enum { + ST_TEXT, + ST_TAG_START, + ST_TAG_BODY, + ST_TAG_QUOTE_WAIT, + ST_TAG_QUOTED_STRING, + ST_TAG_UNQUOTED_STRING, + ST_COMMENT_WAIT_DASH1, /* ""[0] */ + ST_COMMENT_CLO_RT /* "-->"[1] */ +} pstate_e; + +static const int +_charclass[256] = { + 0,0,0,0,0,0,0,0, 0,1,1,0,1,1,0,0, + 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + 1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2, 2,2,0,0,0,0,0,0, /* 01234567 89 */ + 0,3,3,3,3,3,3,3, 3,3,3,3,3,3,3,3, /* ABCDEFG HIJKLMNO */ + 3,3,3,3,3,3,3,3, 3,3,3,0,0,0,0,0, /* PQRSTUVW XYZ */ + 0,3,3,3,3,3,3,3, 3,3,3,3,3,3,3,3, /* abcdefg hijklmno */ + 3,3,3,3,3,3,3,3, 3,3,3,0,0,0,0,0 /* pqrstuvw xyz */ +}; +#define WHITESPACE(c) (_charclass[(unsigned char)(c)] == 1) +#define ALNUM(c) (_charclass[(unsigned char)(c)] >= 2) +#define ALPHA(c) (_charclass[(unsigned char)(c)] == 3) + +/* Aliases for characters, ASCII/UTF-8 */ +#define EXCLAM 0x21 /* '!' */ +#define CQUOTE 0x22 /* '"' */ +#define CDASH 0x2d /* '-' */ +#define CSLASH 0x2f /* '/' */ +#define LANGLE 0x3c /* '<' */ +#define CEQUAL 0x3d /* '=' */ +#define RANGLE 0x3e /* '>' */ +#define CQUEST 0x3f /* '?' */ + +/* Invoke token callback */ +#define TOKEN_CB_CALL(type, _ns, _current_too, _final) do { \ + int _ret; \ + pstate_e ns = _ns; \ + ssize_t _sz = (p - chunk_start) + _current_too; \ + if (!_sz) { \ + /* Shortcut */ \ + state = _ns; \ + break; \ + } \ + _ret = cb(type, chunk_start, _sz, key); \ + if(_ret < _sz) { \ + if(_current_too && _ret == -1) \ + state = ns; \ + goto finish; \ + } \ + chunk_start = p + _current_too; \ + state = ns; \ + } while(0) + +#define TOKEN_CB(_type, _ns, _current_too) \ + TOKEN_CB_CALL(_type, _ns, _current_too, 0) + +#define PXML_TAG_FINAL_CHUNK_TYPE PXML_TAG_END +#define PXML_COMMENT_FINAL_CHUNK_TYPE PXML_COMMENT_END + +#define TOKEN_CB_FINAL(_type, _ns, _current_too) \ + TOKEN_CB_CALL( _type ## _FINAL_CHUNK_TYPE , _ns, _current_too, 1) + +/* + * Parser itself + */ +ssize_t pxml_parse(int *stateContext, const void *xmlbuf, size_t size, pxml_callback_f *cb, void *key) { + pstate_e state = (pstate_e)*stateContext; + const char *chunk_start = (const char *)xmlbuf; + const char *p = chunk_start; + const char *end = p + size; + + for(; p < end; p++) { + int C = *(const unsigned char *)p; + switch(state) { + case ST_TEXT: + /* + * Initial state: we're in the middle of some text, + * or just have started. + */ + if (C == LANGLE) + /* We're now in the tag, probably */ + TOKEN_CB(PXML_TEXT, ST_TAG_START, 0); + break; + case ST_TAG_START: + if (ALPHA(C) || (C == CSLASH)) + state = ST_TAG_BODY; + else if (C == EXCLAM) + state = ST_COMMENT_WAIT_DASH1; + else + /* + * Not characters and not whitespace. + * Must be something like "3 < 4". + */ + TOKEN_CB(PXML_TEXT, ST_TEXT, 1);/* Flush as data */ + break; + case ST_TAG_BODY: + switch(C) { + case RANGLE: + /* End of the tag */ + TOKEN_CB_FINAL(PXML_TAG, ST_TEXT, 1); + break; + case LANGLE: + /* + * The previous tag wasn't completed, but still + * recognized as valid. (Mozilla-compatible) + */ + TOKEN_CB_FINAL(PXML_TAG, ST_TAG_START, 0); + break; + case CEQUAL: + state = ST_TAG_QUOTE_WAIT; + break; + } + break; + case ST_TAG_QUOTE_WAIT: + /* + * State after the equal sign ("=") in the tag. + */ + switch(C) { + case CQUOTE: + state = ST_TAG_QUOTED_STRING; + break; + case RANGLE: + /* End of the tag */ + TOKEN_CB_FINAL(PXML_TAG, ST_TEXT, 1); + break; + default: + if(!WHITESPACE(C)) + /* Unquoted string value */ + state = ST_TAG_UNQUOTED_STRING; + } + break; + case ST_TAG_QUOTED_STRING: + /* + * Tag attribute's string value in quotes. + */ + if(C == CQUOTE) { + /* Return back to the tag state */ + state = ST_TAG_BODY; + } + break; + case ST_TAG_UNQUOTED_STRING: + if(C == RANGLE) { + /* End of the tag */ + TOKEN_CB_FINAL(PXML_TAG, ST_TEXT, 1); + } else if(WHITESPACE(C)) { + /* Return back to the tag state */ + state = ST_TAG_BODY; + } + break; + case ST_COMMENT_WAIT_DASH1: + if(C == CDASH) { + state = ST_COMMENT_WAIT_DASH2; + } else { + /* Some ordinary tag. */ + state = ST_TAG_BODY; + } + break; + case ST_COMMENT_WAIT_DASH2: + if(C == CDASH) { + /* Seen "<--" */ + state = ST_COMMENT; + } else { + /* Some ordinary tag */ + state = ST_TAG_BODY; + } + break; + case ST_COMMENT: + if(C == CDASH) { + state = ST_COMMENT_CLO_DASH2; + } + break; + case ST_COMMENT_CLO_DASH2: + if(C == CDASH) { + state = ST_COMMENT_CLO_RT; + } else { + /* This is not an end of a comment */ + state = ST_COMMENT; + } + break; + case ST_COMMENT_CLO_RT: + if(C == RANGLE) { + TOKEN_CB_FINAL(PXML_COMMENT, ST_TEXT, 1); + } else if(C == CDASH) { + /* Maintain current state, still waiting for '>' */ + } else { + state = ST_COMMENT; + } + break; + } /* switch(*ptr) */ + } /* for() */ + + /* + * Flush the partially processed chunk, state permitting. + */ + if(p - chunk_start) { + switch (state) { + case ST_COMMENT: + TOKEN_CB(PXML_COMMENT, state, 0); + break; + case ST_TEXT: + TOKEN_CB(PXML_TEXT, state, 0); + break; + default: break; /* a no-op */ + } + } + +finish: + *stateContext = (int)state; + return chunk_start - (const char *)xmlbuf; +} + diff --git a/src/cryptoconditions/src/asn/xer_support.h b/src/cryptoconditions/src/asn/xer_support.h new file mode 100644 index 000000000..8b01944ab --- /dev/null +++ b/src/cryptoconditions/src/asn/xer_support.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2003, 2004 X/IO Labs, xiolabs.com. + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _XER_SUPPORT_H_ +#define _XER_SUPPORT_H_ + +#include /* Platform-specific types */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Types of data transferred to the application. + */ +typedef enum { + PXML_TEXT, /* Plain text between XML tags. */ + PXML_TAG, /* A tag, starting with '<'. */ + PXML_COMMENT, /* An XML comment, including "". */ + /* + * The following chunk types are reported if the chunk + * terminates the specified XML element. + */ + PXML_TAG_END, /* Tag ended */ + PXML_COMMENT_END /* Comment ended */ +} pxml_chunk_type_e; + +/* + * Callback function that is called by the parser when parsed data is + * available. The _opaque is the pointer to a field containing opaque user + * data specified in pxml_create() call. The chunk type is _type and the text + * data is the piece of buffer identified by _bufid (as supplied to + * pxml_feed() call) starting at offset _offset and of _size bytes size. + * The chunk is NOT '\0'-terminated. + */ +typedef int (pxml_callback_f)(pxml_chunk_type_e _type, + const void *_chunk_data, size_t _chunk_size, void *_key); + +/* + * Parse the given buffer as it were a chunk of XML data. + * Invoke the specified callback each time the meaninful data is found. + * This function returns number of bytes consumed from the bufer. + * It will always be lesser than or equal to the specified _size. + * The next invocation of this function must account the difference. + */ +ssize_t pxml_parse(int *_stateContext, const void *_buf, size_t _size, + pxml_callback_f *cb, void *_key); + +#ifdef __cplusplus +} +#endif + +#endif /* _XER_SUPPORT_H_ */ diff --git a/src/cryptoconditions/src/cryptoconditions-config.h.in b/src/cryptoconditions/src/cryptoconditions-config.h.in new file mode 100644 index 000000000..72f0d216b --- /dev/null +++ b/src/cryptoconditions/src/cryptoconditions-config.h.in @@ -0,0 +1,176 @@ +/* src/cryptoconditions-config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. + */ +#undef CRAY_STACKSEG_END + +/* Define to 1 if using `alloca.c'. */ +#undef C_ALLOCA + +/* Define to 1 if you have `alloca', as a function or macro. */ +#undef HAVE_ALLOCA + +/* Define to 1 if you have and it should be used (not on Ultrix). + */ +#undef HAVE_ALLOCA_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_ARPA_INET_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_FLOAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIMITS_H + +/* Define to 1 if you have the `localeconv' function. */ +#undef HAVE_LOCALECONV + +/* Define to 1 if you have the header file. */ +#undef HAVE_LOCALE_H + +/* Define to 1 if your system has a GNU libc compatible `malloc' function, and + to 0 otherwise. */ +#undef HAVE_MALLOC + +/* Define to 1 if you have the header file. */ +#undef HAVE_MALLOC_H + +/* Define to 1 if you have the `memchr' function. */ +#undef HAVE_MEMCHR + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `memset' function. */ +#undef HAVE_MEMSET + +/* Define to 1 if you have the header file. */ +#undef HAVE_NETINET_IN_H + +/* Define to 1 if the system has the type `ptrdiff_t'. */ +#undef HAVE_PTRDIFF_T + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDDEF_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if the system has the type `_Bool'. */ +#undef HAVE__BOOL + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +#undef LT_OBJDIR + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at runtime. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +#undef STACK_DIRECTION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Version number of package */ +#undef VERSION + +/* Define for Solaris 2.5.1 so the uint32_t typedef from , + , or is not used. If the typedef were allowed, the + #define below would cause a syntax error. */ +#undef _UINT32_T + +/* Define for Solaris 2.5.1 so the uint64_t typedef from , + , or is not used. If the typedef were allowed, the + #define below would cause a syntax error. */ +#undef _UINT64_T + +/* Define for Solaris 2.5.1 so the uint8_t typedef from , + , or is not used. If the typedef were allowed, the + #define below would cause a syntax error. */ +#undef _UINT8_T + +/* Define to the type of a signed integer type of width exactly 16 bits if + such a type exists and the standard includes do not define it. */ +#undef int16_t + +/* Define to the type of a signed integer type of width exactly 32 bits if + such a type exists and the standard includes do not define it. */ +#undef int32_t + +/* Define to the type of a signed integer type of width exactly 8 bits if such + a type exists and the standard includes do not define it. */ +#undef int8_t + +/* Define to rpl_malloc if the replacement function should be used. */ +#undef malloc + +/* Define to `unsigned int' if does not define. */ +#undef size_t + +/* Define to `int' if does not define. */ +#undef ssize_t + +/* Define to the type of an unsigned integer type of width exactly 16 bits if + such a type exists and the standard includes do not define it. */ +#undef uint16_t + +/* Define to the type of an unsigned integer type of width exactly 32 bits if + such a type exists and the standard includes do not define it. */ +#undef uint32_t + +/* Define to the type of an unsigned integer type of width exactly 64 bits if + such a type exists and the standard includes do not define it. */ +#undef uint64_t + +/* Define to the type of an unsigned integer type of width exactly 8 bits if + such a type exists and the standard includes do not define it. */ +#undef uint8_t diff --git a/src/cryptoconditions/src/cryptoconditions.c b/src/cryptoconditions/src/cryptoconditions.c new file mode 100644 index 000000000..147cbb334 --- /dev/null +++ b/src/cryptoconditions/src/cryptoconditions.c @@ -0,0 +1,267 @@ +#include "strings.h" +#include "asn/Condition.h" +#include "asn/Fulfillment.h" +#include "asn/OCTET_STRING.h" +#include "cryptoconditions.h" +#include "src/internal.h" +#include "src/threshold.c" +#include "src/prefix.c" +#include "src/preimage.c" +#include "src/ed25519.c" +#include "src/secp256k1.c" +#include "src/anon.c" +#include "src/eval.c" +#include "src/json_rpc.c" +#include "src/utils.c" +#include +#include + + +static struct CCType *typeRegistry[] = { + &cc_preimageType, + &cc_prefixType, + &cc_thresholdType, + NULL, /* &cc_rsaType */ + &cc_ed25519Type, + &cc_secp256k1Type, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 6-14 unused */ + &cc_evalType +}; + + +static int typeRegistryLength = sizeof(typeRegistry) / sizeof(typeRegistry[0]); + + +void appendUriSubtypes(uint32_t mask, unsigned char *buf) { + int append = 0; + for (int i=0; i<32; i++) { + if (mask & 1 << i) { + if (append) { + strcat(buf, ","); + strcat(buf, typeRegistry[i]->name); + } else { + strcat(buf, "&subtypes="); + strcat(buf, typeRegistry[i]->name); + } + append = 1; + } + } +} + + +unsigned char *cc_conditionUri(const CC *cond) { + unsigned char *fp = cond->type->fingerprint(cond); + if (!fp) return NULL; + + unsigned char *encoded = base64_encode(fp, 32); + + unsigned char *out = calloc(1, 1000); + sprintf(out, "ni:///sha-256;%s?fpt=%s&cost=%lu", + encoded, cond->type->name, cc_getCost(cond)); + + if (cond->type->hasSubtypes) { + appendUriSubtypes(cond->type->getSubtypes(cond), out); + } + + free(fp); + free(encoded); + + return out; +} + + +static uint32_t getSubtypes(CC *cond) { + uint32_t mask = 1 << cond->type->typeId; + if (cond->type->hasSubtypes) { + mask |= cond->type->getSubtypes(cond); + } + return mask; +} + + +static ConditionTypes_t asnSubtypes(uint32_t mask) { + ConditionTypes_t types; + uint8_t buf[4] = {0,0,0,0}; + int maxId = 0; + + for (int i=0; i<32; i++) { + if (mask & (1<> 3] |= 1 << (7 - i % 8); + } + } + + types.size = 1 + (maxId >> 3); + types.buf = calloc(1, types.size); + memcpy(types.buf, &buf, types.size); + types.bits_unused = 7 - maxId % 8; + return types; +} + + +static uint32_t fromAsnSubtypes(const ConditionTypes_t types) { + uint32_t mask = 0; + for (int i=0; i> 3] & (1 << (7 - i % 8))) { + mask |= 1 << i; + } + } + return mask; +} + + +size_t cc_conditionBinary(const CC *cond, unsigned char *buf) { + Condition_t *asn = calloc(1, sizeof(Condition_t)); + asnCondition(cond, asn); + asn_enc_rval_t rc = der_encode_to_buffer(&asn_DEF_Condition, asn, buf, 1000); + if (rc.encoded == -1) { + printf("CONDITION NOT ENCODED\n"); + return 0; + } + ASN_STRUCT_FREE(asn_DEF_Condition, asn); + return rc.encoded; +} + + +size_t cc_fulfillmentBinary(const CC *cond, unsigned char *buf, size_t length) { + Fulfillment_t *ffill = asnFulfillmentNew(cond); + asn_enc_rval_t rc = der_encode_to_buffer(&asn_DEF_Fulfillment, ffill, buf, length); + if (rc.encoded == -1) { + printf("FULFILLMENT NOT ENCODED\n"); + return 0; + } + ASN_STRUCT_FREE(asn_DEF_Fulfillment, ffill); + return rc.encoded; +} + + +static void asnCondition(const CC *cond, Condition_t *asn) { + asn->present = cond->type->asnType; + + // This may look a little weird - we dont have a reference here to the correct + // union choice for the condition type, so we just assign everything to the threshold + // type. This works out nicely since the union choices have the same binary interface. + + CompoundSha256Condition_t *choice = &asn->choice.thresholdSha256; + choice->cost = cc_getCost(cond); + choice->fingerprint.buf = cond->type->fingerprint(cond); + choice->fingerprint.size = 32; + choice->subtypes = asnSubtypes(cond->type->getSubtypes(cond)); +} + + +static Condition_t *asnConditionNew(const CC *cond) { + Condition_t *asn = calloc(1, sizeof(Condition_t)); + asnCondition(cond, asn); + return asn; +} + + +static Fulfillment_t *asnFulfillmentNew(const CC *cond) { + return cond->type->toFulfillment(cond); +} + + +unsigned long cc_getCost(const CC *cond) { + return cond->type->getCost(cond); +} + + +CCType *getTypeByAsnEnum(Condition_PR present) { + for (int i=0; iasnType == present) { + return typeRegistry[i]; + } + } + return NULL; +} + + +static CC *fulfillmentToCC(Fulfillment_t *ffill) { + CCType *type = getTypeByAsnEnum(ffill->present); + if (!type) { + fprintf(stderr, "Unknown fulfillment type: %i\n", ffill->present); + return 0; + } + return type->fromFulfillment(ffill); +} + + +CC *cc_readFulfillmentBinary(unsigned char *ffill_bin, size_t ffill_bin_len) { + Fulfillment_t *ffill = 0; + CC *cond = 0; + asn_dec_rval_t rval = ber_decode(0, &asn_DEF_Fulfillment, (void **)&ffill, ffill_bin, ffill_bin_len); + if (rval.code == RC_OK) { + cond = fulfillmentToCC(ffill); + ASN_STRUCT_FREE(asn_DEF_Fulfillment, ffill); + } + return cond; +} + + +int cc_visit(CC *cond, CCVisitor visitor) { + int out = visitor.visit(cond, visitor); + if (out && cond->type->visitChildren) { + out = cond->type->visitChildren(cond, visitor); + } + return out; +} + + +int cc_verify(const struct CC *cond, const unsigned char *msg, size_t msgLength, int doHashMsg, + const unsigned char *condBin, size_t condBinLength, + VerifyEval verifyEval, void *evalContext) { + unsigned char targetBinary[1000]; + const size_t binLength = cc_conditionBinary(cond, targetBinary); + if (0 != memcmp(condBin, targetBinary, binLength)) { + return 0; + } + + if (!cc_ed25519VerifyTree(cond, msg, msgLength)) { + return 0; + } + + unsigned char msgHash[32]; + if (doHashMsg) sha256(msg, msgLength, msgHash); + else memcpy(msgHash, msg, 32); + if (!cc_secp256k1VerifyTreeMsg32(cond, msgHash)) { + return 0; + } + + if (!cc_verifyEval(cond, verifyEval, evalContext)) { + return 0; + } + return 1; +} + + +CC *cc_readConditionBinary(unsigned char *cond_bin, size_t length) { + Condition_t *asnCond = 0; + asn_dec_rval_t rval; + rval = ber_decode(0, &asn_DEF_Condition, (void **)&asnCond, cond_bin, length); + if (rval.code != RC_OK) { + printf("Failed reading condition binary\n"); + return NULL; + } + CC *cond = mkAnon(asnCond); + ASN_STRUCT_FREE(asn_DEF_Condition, asnCond); + return cond; +} + + +enum CCTypeId cc_typeId(const CC *cond) { + return cond->type->typeId; +} + + +int cc_isFulfilled(const CC *cond) { + return cond->type->isFulfilled(cond); +} + + +void cc_free(CC *cond) { + if (cond) + cond->type->free(cond); +} + + diff --git a/src/cryptoconditions/src/ed25519.c b/src/cryptoconditions/src/ed25519.c new file mode 100644 index 000000000..85655c2dc --- /dev/null +++ b/src/cryptoconditions/src/ed25519.c @@ -0,0 +1,170 @@ +#include "asn/Condition.h" +#include "asn/Fulfillment.h" +#include "asn/Ed25519FingerprintContents.h" +#include "asn/OCTET_STRING.h" +#include "include/cJSON.h" +#include "include/ed25519/src/ed25519.h" +#include "cryptoconditions.h" + + +struct CCType cc_ed25519Type; + + +static unsigned char *ed25519Fingerprint(const CC *cond) { + Ed25519FingerprintContents_t *fp = calloc(1, sizeof(Ed25519FingerprintContents_t)); + OCTET_STRING_fromBuf(&fp->publicKey, cond->publicKey, 32); + return hashFingerprintContents(&asn_DEF_Ed25519FingerprintContents, fp); +} + + +int ed25519Verify(CC *cond, CCVisitor visitor) { + if (cond->type->typeId != cc_ed25519Type.typeId) return 1; + // TODO: test failure mode: empty sig / null pointer + return ed25519_verify(cond->signature, visitor.msg, visitor.msgLength, cond->publicKey); +} + + +static int cc_ed25519VerifyTree(const CC *cond, const unsigned char *msg, size_t msgLength) { + CCVisitor visitor = {&ed25519Verify, msg, msgLength, NULL}; + return cc_visit((CC*) cond, visitor); +} + + +/* + * Signing data + */ +typedef struct CCEd25519SigningData { + unsigned char *pk; + unsigned char *skpk; + int nSigned; +} CCEd25519SigningData; + + +/* + * Visitor that signs an ed25519 condition if it has a matching public key + */ +static int ed25519Sign(CC *cond, CCVisitor visitor) { + if (cond->type->typeId != cc_ed25519Type.typeId) return 1; + CCEd25519SigningData *signing = (CCEd25519SigningData*) visitor.context; + if (0 != memcmp(cond->publicKey, signing->pk, 32)) return 1; + if (!cond->signature) cond->signature = malloc(64); + ed25519_sign(cond->signature, visitor.msg, visitor.msgLength, + signing->pk, signing->skpk); + signing->nSigned++; + return 1; +} + + +/* + * Sign ed25519 conditions in a tree + */ +int cc_signTreeEd25519(CC *cond, const unsigned char *privateKey, const unsigned char *msg, size_t msgLength) { + unsigned char pk[32], skpk[64]; + ed25519_create_keypair(pk, skpk, privateKey); + + CCEd25519SigningData signing = {pk, skpk, 0}; + CCVisitor visitor = {&ed25519Sign, (unsigned char*)msg, msgLength, &signing}; + cc_visit(cond, visitor); + return signing.nSigned; +} + + +static unsigned long ed25519Cost(const CC *cond) { + return 131072; +} + + +static CC *ed25519FromJSON(const cJSON *params, unsigned char *err) { + size_t binsz; + + cJSON *pk_item = cJSON_GetObjectItem(params, "publicKey"); + if (!cJSON_IsString(pk_item)) { + strcpy(err, "publicKey must be a string"); + return NULL; + } + unsigned char *pk = base64_decode(pk_item->valuestring, &binsz); + if (32 != binsz) { + strcpy(err, "publicKey has incorrect length"); + free(pk); + return NULL; + } + + cJSON *signature_item = cJSON_GetObjectItem(params, "signature"); + unsigned char *sig = NULL; + if (signature_item && !cJSON_IsNull(signature_item)) { + if (!cJSON_IsString(signature_item)) { + strcpy(err, "signature must be null or a string"); + return NULL; + } + sig = base64_decode(signature_item->valuestring, &binsz); + if (64 != binsz) { + strcpy(err, "signature has incorrect length"); + free(sig); + return NULL; + } + } + + CC *cond = calloc(1, sizeof(CC)); + cond->type = &cc_ed25519Type; + cond->publicKey = pk; + cond->signature = sig; + return cond; +} + + +static void ed25519ToJSON(const CC *cond, cJSON *params) { + unsigned char *b64 = base64_encode(cond->publicKey, 32); + cJSON_AddItemToObject(params, "publicKey", cJSON_CreateString(b64)); + free(b64); + if (cond->signature) { + b64 = base64_encode(cond->signature, 64); + cJSON_AddItemToObject(params, "signature", cJSON_CreateString(b64)); + free(b64); + } +} + + +static CC *ed25519FromFulfillment(const Fulfillment_t *ffill) { + CC *cond = calloc(1, sizeof(CC)); + cond->type = &cc_ed25519Type; + cond->publicKey = malloc(32); + memcpy(cond->publicKey, ffill->choice.ed25519Sha256.publicKey.buf, 32); + cond->signature = malloc(64); + memcpy(cond->signature, ffill->choice.ed25519Sha256.signature.buf, 64); + return cond; +} + + +static Fulfillment_t *ed25519ToFulfillment(const CC *cond) { + if (!cond->signature) { + return NULL; + } + Fulfillment_t *ffill = calloc(1, sizeof(Fulfillment_t)); + ffill->present = Fulfillment_PR_ed25519Sha256; + Ed25519Sha512Fulfillment_t *ed2 = &ffill->choice.ed25519Sha256; + OCTET_STRING_fromBuf(&ed2->publicKey, cond->publicKey, 32); + OCTET_STRING_fromBuf(&ed2->signature, cond->signature, 64); + return ffill; +} + + +int ed25519IsFulfilled(const CC *cond) { + return cond->signature > 0; +} + + +static void ed25519Free(CC *cond) { + free(cond->publicKey); + if (cond->signature) { + free(cond->signature); + } + free(cond); +} + + +static uint32_t ed25519Subtypes(const CC *cond) { + return 0; +} + + +struct CCType cc_ed25519Type = { 4, "ed25519-sha-256", Condition_PR_ed25519Sha256, 0, 0, &ed25519Fingerprint, &ed25519Cost, &ed25519Subtypes, &ed25519FromJSON, &ed25519ToJSON, &ed25519FromFulfillment, &ed25519ToFulfillment, &ed25519IsFulfilled, &ed25519Free }; diff --git a/src/cryptoconditions/src/eval.c b/src/cryptoconditions/src/eval.c new file mode 100644 index 000000000..976af32d7 --- /dev/null +++ b/src/cryptoconditions/src/eval.c @@ -0,0 +1,142 @@ +#include "asn/Condition.h" +#include "asn/Fulfillment.h" +#include "asn/EvalFulfillment.h" +#include "asn/EvalFingerprintContents.h" +#include "asn/OCTET_STRING.h" +#include "cryptoconditions.h" +#include "internal.h" +#include "include/cJSON.h" + + +struct CCType cc_evalType; + + +static unsigned char *evalFingerprint(const CC *cond) { + EvalFingerprintContents_t *fp = calloc(1, sizeof(EvalFingerprintContents_t)); + OCTET_STRING_fromBuf(&fp->method, cond->method, strlen(cond->method)); + OCTET_STRING_fromBuf(&fp->paramsBin, cond->paramsBin, cond->paramsBinLength); + return hashFingerprintContents(&asn_DEF_EvalFingerprintContents, fp); +} + + +static unsigned long evalCost(const CC *cond) { + return 1048576; // Pretty high +} + + +static CC *evalFromJSON(const cJSON *params, unsigned char *err) { + size_t paramsBinLength; + unsigned char *paramsBin = 0; + + cJSON *method_item = cJSON_GetObjectItem(params, "method"); + if (!checkString(method_item, "method", err)) { + return NULL; + } + + if (strlen(method_item->valuestring) > 64) { + strcpy(err, "method must be less than or equal to 64 bytes"); + return NULL; + } + + if (!jsonGetBase64(params, "params", err, ¶msBin, ¶msBinLength)) { + return NULL; + } + + CC *cond = calloc(1, sizeof(CC)); + strcpy(cond->method, method_item->valuestring); + cond->paramsBin = paramsBin; + cond->paramsBinLength = paramsBinLength; + cond->type = &cc_evalType; + return cond; +} + + +static void evalToJSON(const CC *cond, cJSON *params) { + + // add method + cJSON_AddItemToObject(params, "method", cJSON_CreateString(cond->method)); + + // add params + unsigned char *b64 = base64_encode(cond->paramsBin, cond->paramsBinLength); + cJSON_AddItemToObject(params, "params", cJSON_CreateString(b64)); + free(b64); +} + + +static CC *evalFromFulfillment(const Fulfillment_t *ffill) { + CC *cond = calloc(1, sizeof(CC)); + cond->type = &cc_evalType; + + EvalFulfillment_t *eval = &ffill->choice.evalSha256; + + memcpy(cond->method, eval->method.buf, eval->method.size); + cond->method[eval->method.size] = 0; + + OCTET_STRING_t octets = eval->paramsBin; + cond->paramsBinLength = octets.size; + cond->paramsBin = malloc(octets.size); + memcpy(cond->paramsBin, octets.buf, octets.size); + + return cond; +} + + +static Fulfillment_t *evalToFulfillment(const CC *cond) { + Fulfillment_t *ffill = calloc(1, sizeof(Fulfillment_t)); + ffill->present = Fulfillment_PR_evalSha256; + EvalFulfillment_t *eval = &ffill->choice.evalSha256; + OCTET_STRING_fromBuf(&eval->method, cond->method, strlen(cond->method)); + OCTET_STRING_fromBuf(&eval->paramsBin, cond->paramsBin, cond->paramsBinLength); + return ffill; +} + + +int evalIsFulfilled(const CC *cond) { + return 1; +} + + +static void evalFree(CC *cond) { + free(cond->paramsBin); + free(cond); +} + + +static uint32_t evalSubtypes(const CC *cond) { + return 0; +} + + +/* + * The JSON api doesn't contain custom verifiers, so a stub method is provided suitable for testing + */ +int jsonVerifyEval(CC *cond, void *context) { + if (strcmp(cond->method, "testEval") == 0) { + return memcmp(cond->paramsBin, "testEval", cond->paramsBinLength) == 0; + } + fprintf(stderr, "Cannot verify eval; user function unknown\n"); + return 0; +} + + +typedef struct CCEvalVerifyData { + VerifyEval verify; + void *context; +} CCEvalVerifyData; + + +int evalVisit(CC *cond, CCVisitor visitor) { + if (cond->type->typeId != cc_evalType.typeId) return 1; + CCEvalVerifyData *evalData = visitor.context; + return evalData->verify(cond, evalData->context); +} + + +int cc_verifyEval(const CC *cond, VerifyEval verify, void *context) { + CCEvalVerifyData evalData = {verify, context}; + CCVisitor visitor = {&evalVisit, "", 0, &evalData}; + return cc_visit(cond, visitor); +} + + +struct CCType cc_evalType = { 15, "eval-sha-256", Condition_PR_evalSha256, 0, 0, &evalFingerprint, &evalCost, &evalSubtypes, &evalFromJSON, &evalToJSON, &evalFromFulfillment, &evalToFulfillment, &evalIsFulfilled, &evalFree }; diff --git a/src/cryptoconditions/src/include/cJSON.c b/src/cryptoconditions/src/include/cJSON.c new file mode 100644 index 000000000..306bb5b0d --- /dev/null +++ b/src/cryptoconditions/src/include/cJSON.c @@ -0,0 +1,2699 @@ +/* + Copyright (c) 2009-2017 Dave Gamble and cJSON contributors + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +/* cJSON */ +/* JSON parser in C. */ + +#ifdef __GNUC__ +#pragma GCC visibility push(default) +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef __GNUC__ +#pragma GCC visibility pop +#endif + +#include "cJSON.h" + +/* define our own boolean type */ +#define true ((cJSON_bool)1) +#define false ((cJSON_bool)0) + +typedef struct { + const unsigned char *json; + size_t position; +} error; +static error global_error = { NULL, 0 }; + +CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void) +{ + return (const char*) (global_error.json + global_error.position); +} + +/* This is a safeguard to prevent copy-pasters from using incompatible C and header files */ +#if (CJSON_VERSION_MAJOR != 1) || (CJSON_VERSION_MINOR != 5) || (CJSON_VERSION_PATCH != 9) + #error cJSON.h and cJSON.c have different versions. Make sure that both have the same. +#endif + +CJSON_PUBLIC(const char*) cJSON_Version(void) +{ + static char version[15]; + sprintf(version, "%i.%i.%i", CJSON_VERSION_MAJOR, CJSON_VERSION_MINOR, CJSON_VERSION_PATCH); + + return version; +} + +/* Case insensitive string comparison, doesn't consider two NULL pointers equal though */ +static int case_insensitive_strcmp(const unsigned char *string1, const unsigned char *string2) +{ + if ((string1 == NULL) || (string2 == NULL)) + { + return 1; + } + + if (string1 == string2) + { + return 0; + } + + for(; tolower(*string1) == tolower(*string2); (void)string1++, string2++) + { + if (*string1 == '\0') + { + return 0; + } + } + + return tolower(*string1) - tolower(*string2); +} + +typedef struct internal_hooks +{ + void *(*allocate)(size_t size); + void (*deallocate)(void *pointer); + void *(*reallocate)(void *pointer, size_t size); +} internal_hooks; + +static internal_hooks global_hooks = { malloc, free, realloc }; + +static unsigned char* cJSON_strdup(const unsigned char* string, const internal_hooks * const hooks) +{ + size_t length = 0; + unsigned char *copy = NULL; + + if (string == NULL) + { + return NULL; + } + + length = strlen((const char*)string) + sizeof(""); + if (!(copy = (unsigned char*)hooks->allocate(length))) + { + return NULL; + } + memcpy(copy, string, length); + + return copy; +} + +CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks) +{ + if (hooks == NULL) + { + /* Reset hooks */ + global_hooks.allocate = malloc; + global_hooks.deallocate = free; + global_hooks.reallocate = realloc; + return; + } + + global_hooks.allocate = malloc; + if (hooks->malloc_fn != NULL) + { + global_hooks.allocate = hooks->malloc_fn; + } + + global_hooks.deallocate = free; + if (hooks->free_fn != NULL) + { + global_hooks.deallocate = hooks->free_fn; + } + + /* use realloc only if both free and malloc are used */ + global_hooks.reallocate = NULL; + if ((global_hooks.allocate == malloc) && (global_hooks.deallocate == free)) + { + global_hooks.reallocate = realloc; + } +} + +/* Internal constructor. */ +static cJSON *cJSON_New_Item(const internal_hooks * const hooks) +{ + cJSON* node = (cJSON*)hooks->allocate(sizeof(cJSON)); + if (node) + { + memset(node, '\0', sizeof(cJSON)); + } + + return node; +} + +/* Delete a cJSON structure. */ +CJSON_PUBLIC(void) cJSON_Delete(cJSON *item) +{ + cJSON *next = NULL; + while (item != NULL) + { + next = item->next; + if (!(item->type & cJSON_IsReference) && (item->child != NULL)) + { + cJSON_Delete(item->child); + } + if (!(item->type & cJSON_IsReference) && (item->valuestring != NULL)) + { + global_hooks.deallocate(item->valuestring); + } + if (!(item->type & cJSON_StringIsConst) && (item->string != NULL)) + { + global_hooks.deallocate(item->string); + } + global_hooks.deallocate(item); + item = next; + } +} + +/* get the decimal point character of the current locale */ +static unsigned char get_decimal_point(void) +{ + struct lconv *lconv = localeconv(); + return (unsigned char) lconv->decimal_point[0]; +} + +typedef struct +{ + const unsigned char *content; + size_t length; + size_t offset; + size_t depth; /* How deeply nested (in arrays/objects) is the input at the current offset. */ + internal_hooks hooks; +} parse_buffer; + +/* check if the given size is left to read in a given parse buffer (starting with 1) */ +#define can_read(buffer, size) ((buffer != NULL) && (((buffer)->offset + size) <= (buffer)->length)) +#define cannot_read(buffer, size) (!can_read(buffer, size)) +/* check if the buffer can be accessed at the given index (starting with 0) */ +#define can_access_at_index(buffer, index) ((buffer != NULL) && (((buffer)->offset + index) < (buffer)->length)) +#define cannot_access_at_index(buffer, index) (!can_access_at_index(buffer, index)) +/* get a pointer to the buffer at the position */ +#define buffer_at_offset(buffer) ((buffer)->content + (buffer)->offset) + +/* Parse the input text to generate a number, and populate the result into item. */ +static cJSON_bool parse_number(cJSON * const item, parse_buffer * const input_buffer) +{ + double number = 0; + unsigned char *after_end = NULL; + unsigned char number_c_string[64]; + unsigned char decimal_point = get_decimal_point(); + size_t i = 0; + + if ((input_buffer == NULL) || (input_buffer->content == NULL)) + { + return false; + } + + /* copy the number into a temporary buffer and replace '.' with the decimal point + * of the current locale (for strtod) + * This also takes care of '\0' not necessarily being available for marking the end of the input */ + for (i = 0; (i < (sizeof(number_c_string) - 1)) && can_access_at_index(input_buffer, i); i++) + { + switch (buffer_at_offset(input_buffer)[i]) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '+': + case '-': + case 'e': + case 'E': + number_c_string[i] = buffer_at_offset(input_buffer)[i]; + break; + + case '.': + number_c_string[i] = decimal_point; + break; + + default: + goto loop_end; + } + } +loop_end: + number_c_string[i] = '\0'; + + number = strtod((const char*)number_c_string, (char**)&after_end); + if (number_c_string == after_end) + { + return false; /* parse_error */ + } + + item->valuedouble = number; + + /* use saturation in case of overflow */ + if (number >= INT_MAX) + { + item->valueint = INT_MAX; + } + else if (number <= INT_MIN) + { + item->valueint = INT_MIN; + } + else + { + item->valueint = (int)number; + } + + item->type = cJSON_Number; + + input_buffer->offset += (size_t)(after_end - number_c_string); + return true; +} + +/* don't ask me, but the original cJSON_SetNumberValue returns an integer or double */ +CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number) +{ + if (number >= INT_MAX) + { + object->valueint = INT_MAX; + } + else if (number <= INT_MIN) + { + object->valueint = INT_MIN; + } + else + { + object->valueint = (int)number; + } + + return object->valuedouble = number; +} + +typedef struct +{ + unsigned char *buffer; + size_t length; + size_t offset; + size_t depth; /* current nesting depth (for formatted printing) */ + cJSON_bool noalloc; + cJSON_bool format; /* is this print a formatted print */ + internal_hooks hooks; +} printbuffer; + +/* realloc printbuffer if necessary to have at least "needed" bytes more */ +static unsigned char* ensure(printbuffer * const p, size_t needed) +{ + unsigned char *newbuffer = NULL; + size_t newsize = 0; + + if ((p == NULL) || (p->buffer == NULL)) + { + return NULL; + } + + if ((p->length > 0) && (p->offset >= p->length)) + { + /* make sure that offset is valid */ + return NULL; + } + + if (needed > INT_MAX) + { + /* sizes bigger than INT_MAX are currently not supported */ + return NULL; + } + + needed += p->offset + 1; + if (needed <= p->length) + { + return p->buffer + p->offset; + } + + if (p->noalloc) { + return NULL; + } + + /* calculate new buffer size */ + if (needed > (INT_MAX / 2)) + { + /* overflow of int, use INT_MAX if possible */ + if (needed <= INT_MAX) + { + newsize = INT_MAX; + } + else + { + return NULL; + } + } + else + { + newsize = needed * 2; + } + + if (p->hooks.reallocate != NULL) + { + /* reallocate with realloc if available */ + newbuffer = (unsigned char*)p->hooks.reallocate(p->buffer, newsize); + if (newbuffer == NULL) + { + p->hooks.deallocate(p->buffer); + p->length = 0; + p->buffer = NULL; + + return NULL; + } + } + else + { + /* otherwise reallocate manually */ + newbuffer = (unsigned char*)p->hooks.allocate(newsize); + if (!newbuffer) + { + p->hooks.deallocate(p->buffer); + p->length = 0; + p->buffer = NULL; + + return NULL; + } + if (newbuffer) + { + memcpy(newbuffer, p->buffer, p->offset + 1); + } + p->hooks.deallocate(p->buffer); + } + p->length = newsize; + p->buffer = newbuffer; + + return newbuffer + p->offset; +} + +/* calculate the new length of the string in a printbuffer and update the offset */ +static void update_offset(printbuffer * const buffer) +{ + const unsigned char *buffer_pointer = NULL; + if ((buffer == NULL) || (buffer->buffer == NULL)) + { + return; + } + buffer_pointer = buffer->buffer + buffer->offset; + + buffer->offset += strlen((const char*)buffer_pointer); +} + +/* Render the number nicely from the given item into a string. */ +static cJSON_bool print_number(const cJSON * const item, printbuffer * const output_buffer) +{ + unsigned char *output_pointer = NULL; + double d = item->valuedouble; + int length = 0; + size_t i = 0; + unsigned char number_buffer[26]; /* temporary buffer to print the number into */ + unsigned char decimal_point = get_decimal_point(); + double test; + + if (output_buffer == NULL) + { + return false; + } + + /* This checks for NaN and Infinity */ + if ((d * 0) != 0) + { + length = sprintf((char*)number_buffer, "null"); + } + else + { + /* Try 15 decimal places of precision to avoid nonsignificant nonzero digits */ + length = sprintf((char*)number_buffer, "%1.15g", d); + + /* Check whether the original double can be recovered */ + if ((sscanf((char*)number_buffer, "%lg", &test) != 1) || ((double)test != d)) + { + /* If not, print with 17 decimal places of precision */ + length = sprintf((char*)number_buffer, "%1.17g", d); + } + } + + /* sprintf failed or buffer overrun occured */ + if ((length < 0) || (length > (int)(sizeof(number_buffer) - 1))) + { + return false; + } + + /* reserve appropriate space in the output */ + output_pointer = ensure(output_buffer, (size_t)length); + if (output_pointer == NULL) + { + return false; + } + + /* copy the printed number to the output and replace locale + * dependent decimal point with '.' */ + for (i = 0; i < ((size_t)length); i++) + { + if (number_buffer[i] == decimal_point) + { + output_pointer[i] = '.'; + continue; + } + + output_pointer[i] = number_buffer[i]; + } + output_pointer[i] = '\0'; + + output_buffer->offset += (size_t)length; + + return true; +} + +/* parse 4 digit hexadecimal number */ +static unsigned parse_hex4(const unsigned char * const input) +{ + unsigned int h = 0; + size_t i = 0; + + for (i = 0; i < 4; i++) + { + /* parse digit */ + if ((input[i] >= '0') && (input[i] <= '9')) + { + h += (unsigned int) input[i] - '0'; + } + else if ((input[i] >= 'A') && (input[i] <= 'F')) + { + h += (unsigned int) 10 + input[i] - 'A'; + } + else if ((input[i] >= 'a') && (input[i] <= 'f')) + { + h += (unsigned int) 10 + input[i] - 'a'; + } + else /* invalid */ + { + return 0; + } + + if (i < 3) + { + /* shift left to make place for the next nibble */ + h = h << 4; + } + } + + return h; +} + +/* converts a UTF-16 literal to UTF-8 + * A literal can be one or two sequences of the form \uXXXX */ +static unsigned char utf16_literal_to_utf8(const unsigned char * const input_pointer, const unsigned char * const input_end, unsigned char **output_pointer) +{ + long unsigned int codepoint = 0; + unsigned int first_code = 0; + const unsigned char *first_sequence = input_pointer; + unsigned char utf8_length = 0; + unsigned char utf8_position = 0; + unsigned char sequence_length = 0; + unsigned char first_byte_mark = 0; + + if ((input_end - first_sequence) < 6) + { + /* input ends unexpectedly */ + goto fail; + } + + /* get the first utf16 sequence */ + first_code = parse_hex4(first_sequence + 2); + + /* check that the code is valid */ + if (((first_code >= 0xDC00) && (first_code <= 0xDFFF))) + { + goto fail; + } + + /* UTF16 surrogate pair */ + if ((first_code >= 0xD800) && (first_code <= 0xDBFF)) + { + const unsigned char *second_sequence = first_sequence + 6; + unsigned int second_code = 0; + sequence_length = 12; /* \uXXXX\uXXXX */ + + if ((input_end - second_sequence) < 6) + { + /* input ends unexpectedly */ + goto fail; + } + + if ((second_sequence[0] != '\\') || (second_sequence[1] != 'u')) + { + /* missing second half of the surrogate pair */ + goto fail; + } + + /* get the second utf16 sequence */ + second_code = parse_hex4(second_sequence + 2); + /* check that the code is valid */ + if ((second_code < 0xDC00) || (second_code > 0xDFFF)) + { + /* invalid second half of the surrogate pair */ + goto fail; + } + + + /* calculate the unicode codepoint from the surrogate pair */ + codepoint = 0x10000 + (((first_code & 0x3FF) << 10) | (second_code & 0x3FF)); + } + else + { + sequence_length = 6; /* \uXXXX */ + codepoint = first_code; + } + + /* encode as UTF-8 + * takes at maximum 4 bytes to encode: + * 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ + if (codepoint < 0x80) + { + /* normal ascii, encoding 0xxxxxxx */ + utf8_length = 1; + } + else if (codepoint < 0x800) + { + /* two bytes, encoding 110xxxxx 10xxxxxx */ + utf8_length = 2; + first_byte_mark = 0xC0; /* 11000000 */ + } + else if (codepoint < 0x10000) + { + /* three bytes, encoding 1110xxxx 10xxxxxx 10xxxxxx */ + utf8_length = 3; + first_byte_mark = 0xE0; /* 11100000 */ + } + else if (codepoint <= 0x10FFFF) + { + /* four bytes, encoding 1110xxxx 10xxxxxx 10xxxxxx 10xxxxxx */ + utf8_length = 4; + first_byte_mark = 0xF0; /* 11110000 */ + } + else + { + /* invalid unicode codepoint */ + goto fail; + } + + /* encode as utf8 */ + for (utf8_position = (unsigned char)(utf8_length - 1); utf8_position > 0; utf8_position--) + { + /* 10xxxxxx */ + (*output_pointer)[utf8_position] = (unsigned char)((codepoint | 0x80) & 0xBF); + codepoint >>= 6; + } + /* encode first byte */ + if (utf8_length > 1) + { + (*output_pointer)[0] = (unsigned char)((codepoint | first_byte_mark) & 0xFF); + } + else + { + (*output_pointer)[0] = (unsigned char)(codepoint & 0x7F); + } + + *output_pointer += utf8_length; + + return sequence_length; + +fail: + return 0; +} + +/* Parse the input text into an unescaped cinput, and populate item. */ +static cJSON_bool parse_string(cJSON * const item, parse_buffer * const input_buffer) +{ + const unsigned char *input_pointer = buffer_at_offset(input_buffer) + 1; + const unsigned char *input_end = buffer_at_offset(input_buffer) + 1; + unsigned char *output_pointer = NULL; + unsigned char *output = NULL; + + /* not a string */ + if (buffer_at_offset(input_buffer)[0] != '\"') + { + goto fail; + } + + { + /* calculate approximate size of the output (overestimate) */ + size_t allocation_length = 0; + size_t skipped_bytes = 0; + while (((size_t)(input_end - input_buffer->content) < input_buffer->length) && (*input_end != '\"')) + { + /* is escape sequence */ + if (input_end[0] == '\\') + { + if ((size_t)(input_end + 1 - input_buffer->content) >= input_buffer->length) + { + /* prevent buffer overflow when last input character is a backslash */ + goto fail; + } + skipped_bytes++; + input_end++; + } + input_end++; + } + if (((size_t)(input_end - input_buffer->content) >= input_buffer->length) || (*input_end != '\"')) + { + goto fail; /* string ended unexpectedly */ + } + + /* This is at most how much we need for the output */ + allocation_length = (size_t) (input_end - buffer_at_offset(input_buffer)) - skipped_bytes; + output = (unsigned char*)input_buffer->hooks.allocate(allocation_length + sizeof("")); + if (output == NULL) + { + goto fail; /* allocation failure */ + } + } + + output_pointer = output; + /* loop through the string literal */ + while (input_pointer < input_end) + { + if (*input_pointer != '\\') + { + *output_pointer++ = *input_pointer++; + } + /* escape sequence */ + else + { + unsigned char sequence_length = 2; + if ((input_end - input_pointer) < 1) + { + goto fail; + } + + switch (input_pointer[1]) + { + case 'b': + *output_pointer++ = '\b'; + break; + case 'f': + *output_pointer++ = '\f'; + break; + case 'n': + *output_pointer++ = '\n'; + break; + case 'r': + *output_pointer++ = '\r'; + break; + case 't': + *output_pointer++ = '\t'; + break; + case '\"': + case '\\': + case '/': + *output_pointer++ = input_pointer[1]; + break; + + /* UTF-16 literal */ + case 'u': + sequence_length = utf16_literal_to_utf8(input_pointer, input_end, &output_pointer); + if (sequence_length == 0) + { + /* failed to convert UTF16-literal to UTF-8 */ + goto fail; + } + break; + + default: + goto fail; + } + input_pointer += sequence_length; + } + } + + /* zero terminate the output */ + *output_pointer = '\0'; + + item->type = cJSON_String; + item->valuestring = (char*)output; + + input_buffer->offset = (size_t) (input_end - input_buffer->content); + input_buffer->offset++; + + return true; + +fail: + if (output != NULL) + { + input_buffer->hooks.deallocate(output); + } + + if (input_pointer != NULL) + { + input_buffer->offset = (size_t)(input_pointer - input_buffer->content); + } + + return false; +} + +/* Render the cstring provided to an escaped version that can be printed. */ +static cJSON_bool print_string_ptr(const unsigned char * const input, printbuffer * const output_buffer) +{ + const unsigned char *input_pointer = NULL; + unsigned char *output = NULL; + unsigned char *output_pointer = NULL; + size_t output_length = 0; + /* numbers of additional characters needed for escaping */ + size_t escape_characters = 0; + + if (output_buffer == NULL) + { + return false; + } + + /* empty string */ + if (input == NULL) + { + output = ensure(output_buffer, sizeof("\"\"")); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "\"\""); + + return true; + } + + /* set "flag" to 1 if something needs to be escaped */ + for (input_pointer = input; *input_pointer; input_pointer++) + { + switch (*input_pointer) + { + case '\"': + case '\\': + case '\b': + case '\f': + case '\n': + case '\r': + case '\t': + /* one character escape sequence */ + escape_characters++; + break; + default: + if (*input_pointer < 32) + { + /* UTF-16 escape sequence uXXXX */ + escape_characters += 5; + } + break; + } + } + output_length = (size_t)(input_pointer - input) + escape_characters; + + output = ensure(output_buffer, output_length + sizeof("\"\"")); + if (output == NULL) + { + return false; + } + + /* no characters have to be escaped */ + if (escape_characters == 0) + { + output[0] = '\"'; + memcpy(output + 1, input, output_length); + output[output_length + 1] = '\"'; + output[output_length + 2] = '\0'; + + return true; + } + + output[0] = '\"'; + output_pointer = output + 1; + /* copy the string */ + for (input_pointer = input; *input_pointer != '\0'; (void)input_pointer++, output_pointer++) + { + if ((*input_pointer > 31) && (*input_pointer != '\"') && (*input_pointer != '\\')) + { + /* normal character, copy */ + *output_pointer = *input_pointer; + } + else + { + /* character needs to be escaped */ + *output_pointer++ = '\\'; + switch (*input_pointer) + { + case '\\': + *output_pointer = '\\'; + break; + case '\"': + *output_pointer = '\"'; + break; + case '\b': + *output_pointer = 'b'; + break; + case '\f': + *output_pointer = 'f'; + break; + case '\n': + *output_pointer = 'n'; + break; + case '\r': + *output_pointer = 'r'; + break; + case '\t': + *output_pointer = 't'; + break; + default: + /* escape and print as unicode codepoint */ + sprintf((char*)output_pointer, "u%04x", *input_pointer); + output_pointer += 4; + break; + } + } + } + output[output_length + 1] = '\"'; + output[output_length + 2] = '\0'; + + return true; +} + +/* Invoke print_string_ptr (which is useful) on an item. */ +static cJSON_bool print_string(const cJSON * const item, printbuffer * const p) +{ + return print_string_ptr((unsigned char*)item->valuestring, p); +} + +/* Predeclare these prototypes. */ +static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer); +static cJSON_bool print_value(const cJSON * const item, printbuffer * const output_buffer); +static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer); +static cJSON_bool print_array(const cJSON * const item, printbuffer * const output_buffer); +static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer); +static cJSON_bool print_object(const cJSON * const item, printbuffer * const output_buffer); + +/* Utility to jump whitespace and cr/lf */ +static parse_buffer *buffer_skip_whitespace(parse_buffer * const buffer) +{ + if ((buffer == NULL) || (buffer->content == NULL)) + { + return NULL; + } + + while (can_access_at_index(buffer, 0) && (buffer_at_offset(buffer)[0] <= 32)) + { + buffer->offset++; + } + + if (buffer->offset == buffer->length) + { + buffer->offset--; + } + + return buffer; +} + +/* Parse an object - create a new root, and populate. */ +CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated) +{ + parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } }; + cJSON *item = NULL; + + /* reset error position */ + global_error.json = NULL; + global_error.position = 0; + + if (value == NULL) + { + goto fail; + } + + buffer.content = (const unsigned char*)value; + buffer.length = strlen((const char*)value) + sizeof(""); + buffer.offset = 0; + buffer.hooks = global_hooks; + + item = cJSON_New_Item(&global_hooks); + if (item == NULL) /* memory fail */ + { + goto fail; + } + + if (!parse_value(item, buffer_skip_whitespace(&buffer))) + { + /* parse failure. ep is set. */ + goto fail; + } + + /* if we require null-terminated JSON without appended garbage, skip and then check for a null terminator */ + if (require_null_terminated) + { + buffer_skip_whitespace(&buffer); + if ((buffer.offset >= buffer.length) || buffer_at_offset(&buffer)[0] != '\0') + { + goto fail; + } + } + if (return_parse_end) + { + *return_parse_end = (const char*)buffer_at_offset(&buffer); + } + + return item; + +fail: + if (item != NULL) + { + cJSON_Delete(item); + } + + if (value != NULL) + { + error local_error; + local_error.json = (const unsigned char*)value; + local_error.position = 0; + + if (buffer.offset < buffer.length) + { + local_error.position = buffer.offset; + } + else if (buffer.length > 0) + { + local_error.position = buffer.length - 1; + } + + if (return_parse_end != NULL) + { + *return_parse_end = (const char*)local_error.json + local_error.position; + } + + global_error = local_error; + } + + return NULL; +} + +/* Default options for cJSON_Parse */ +CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value) +{ + return cJSON_ParseWithOpts(value, 0, 0); +} + +#define cjson_min(a, b) ((a < b) ? a : b) + +static unsigned char *print(const cJSON * const item, cJSON_bool format, const internal_hooks * const hooks) +{ + printbuffer buffer[1]; + unsigned char *printed = NULL; + + memset(buffer, 0, sizeof(buffer)); + + /* create buffer */ + buffer->buffer = (unsigned char*) hooks->allocate(256); + buffer->format = format; + buffer->hooks = *hooks; + if (buffer->buffer == NULL) + { + goto fail; + } + + /* print the value */ + if (!print_value(item, buffer)) + { + goto fail; + } + update_offset(buffer); + + /* check if reallocate is available */ + if (hooks->reallocate != NULL) + { + printed = (unsigned char*) hooks->reallocate(buffer->buffer, buffer->length); + buffer->buffer = NULL; + if (printed == NULL) { + goto fail; + } + } + else /* otherwise copy the JSON over to a new buffer */ + { + printed = (unsigned char*) hooks->allocate(buffer->offset + 1); + if (printed == NULL) + { + goto fail; + } + memcpy(printed, buffer->buffer, cjson_min(buffer->length, buffer->offset + 1)); + printed[buffer->offset] = '\0'; /* just to be sure */ + + /* free the buffer */ + hooks->deallocate(buffer->buffer); + } + + return printed; + +fail: + if (buffer->buffer != NULL) + { + hooks->deallocate(buffer->buffer); + } + + if (printed != NULL) + { + hooks->deallocate(printed); + } + + return NULL; +} + +/* Render a cJSON item/entity/structure to text. */ +CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item) +{ + return (char*)print(item, true, &global_hooks); +} + +CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item) +{ + return (char*)print(item, false, &global_hooks); +} + +CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt) +{ + printbuffer p = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } }; + + if (prebuffer < 0) + { + return NULL; + } + + p.buffer = (unsigned char*)global_hooks.allocate((size_t)prebuffer); + if (!p.buffer) + { + return NULL; + } + + p.length = (size_t)prebuffer; + p.offset = 0; + p.noalloc = false; + p.format = fmt; + p.hooks = global_hooks; + + if (!print_value(item, &p)) + { + global_hooks.deallocate(p.buffer); + return NULL; + } + + return (char*)p.buffer; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buf, const int len, const cJSON_bool fmt) +{ + printbuffer p = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } }; + + if ((len < 0) || (buf == NULL)) + { + return false; + } + + p.buffer = (unsigned char*)buf; + p.length = (size_t)len; + p.offset = 0; + p.noalloc = true; + p.format = fmt; + p.hooks = global_hooks; + + return print_value(item, &p); +} + +/* Parser core - when encountering text, process appropriately. */ +static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer) +{ + if ((input_buffer == NULL) || (input_buffer->content == NULL)) + { + return false; /* no input */ + } + + /* parse the different types of values */ + /* null */ + if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "null", 4) == 0)) + { + item->type = cJSON_NULL; + input_buffer->offset += 4; + return true; + } + /* false */ + if (can_read(input_buffer, 5) && (strncmp((const char*)buffer_at_offset(input_buffer), "false", 5) == 0)) + { + item->type = cJSON_False; + input_buffer->offset += 5; + return true; + } + /* true */ + if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "true", 4) == 0)) + { + item->type = cJSON_True; + item->valueint = 1; + input_buffer->offset += 4; + return true; + } + /* string */ + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '\"')) + { + return parse_string(item, input_buffer); + } + /* number */ + if (can_access_at_index(input_buffer, 0) && ((buffer_at_offset(input_buffer)[0] == '-') || ((buffer_at_offset(input_buffer)[0] >= '0') && (buffer_at_offset(input_buffer)[0] <= '9')))) + { + return parse_number(item, input_buffer); + } + /* array */ + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '[')) + { + return parse_array(item, input_buffer); + } + /* object */ + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '{')) + { + return parse_object(item, input_buffer); + } + + + return false; +} + +/* Render a value to text. */ +static cJSON_bool print_value(const cJSON * const item, printbuffer * const output_buffer) +{ + unsigned char *output = NULL; + + if ((item == NULL) || (output_buffer == NULL)) + { + return false; + } + + switch ((item->type) & 0xFF) + { + case cJSON_NULL: + output = ensure(output_buffer, 5); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "null"); + return true; + + case cJSON_False: + output = ensure(output_buffer, 6); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "false"); + return true; + + case cJSON_True: + output = ensure(output_buffer, 5); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "true"); + return true; + + case cJSON_Number: + return print_number(item, output_buffer); + + case cJSON_Raw: + { + size_t raw_length = 0; + if (item->valuestring == NULL) + { + if (!output_buffer->noalloc) + { + output_buffer->hooks.deallocate(output_buffer->buffer); + } + return false; + } + + raw_length = strlen(item->valuestring) + sizeof(""); + output = ensure(output_buffer, raw_length); + if (output == NULL) + { + return false; + } + memcpy(output, item->valuestring, raw_length); + return true; + } + + case cJSON_String: + return print_string(item, output_buffer); + + case cJSON_Array: + return print_array(item, output_buffer); + + case cJSON_Object: + return print_object(item, output_buffer); + + default: + return false; + } +} + +/* Build an array from input text. */ +static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer) +{ + cJSON *head = NULL; /* head of the linked list */ + cJSON *current_item = NULL; + + if (input_buffer->depth >= CJSON_NESTING_LIMIT) + { + return false; /* to deeply nested */ + } + input_buffer->depth++; + + if (buffer_at_offset(input_buffer)[0] != '[') + { + /* not an array */ + goto fail; + } + + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ']')) + { + /* empty array */ + goto success; + } + + /* check if we skipped to the end of the buffer */ + if (cannot_access_at_index(input_buffer, 0)) + { + input_buffer->offset--; + goto fail; + } + + /* step back to character in front of the first element */ + input_buffer->offset--; + /* loop through the comma separated array elements */ + do + { + /* allocate next item */ + cJSON *new_item = cJSON_New_Item(&(input_buffer->hooks)); + if (new_item == NULL) + { + goto fail; /* allocation failure */ + } + + /* attach next item to list */ + if (head == NULL) + { + /* start the linked list */ + current_item = head = new_item; + } + else + { + /* add to the end and advance */ + current_item->next = new_item; + new_item->prev = current_item; + current_item = new_item; + } + + /* parse next value */ + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (!parse_value(current_item, input_buffer)) + { + goto fail; /* failed to parse value */ + } + buffer_skip_whitespace(input_buffer); + } + while (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ',')); + + if (cannot_access_at_index(input_buffer, 0) || buffer_at_offset(input_buffer)[0] != ']') + { + goto fail; /* expected end of array */ + } + +success: + input_buffer->depth--; + + item->type = cJSON_Array; + item->child = head; + + input_buffer->offset++; + + return true; + +fail: + if (head != NULL) + { + cJSON_Delete(head); + } + + return false; +} + +/* Render an array to text */ +static cJSON_bool print_array(const cJSON * const item, printbuffer * const output_buffer) +{ + unsigned char *output_pointer = NULL; + size_t length = 0; + cJSON *current_element = item->child; + + if (output_buffer == NULL) + { + return false; + } + + /* Compose the output array. */ + /* opening square bracket */ + output_pointer = ensure(output_buffer, 1); + if (output_pointer == NULL) + { + return false; + } + + *output_pointer = '['; + output_buffer->offset++; + output_buffer->depth++; + + while (current_element != NULL) + { + if (!print_value(current_element, output_buffer)) + { + return false; + } + update_offset(output_buffer); + if (current_element->next) + { + length = (size_t) (output_buffer->format ? 2 : 1); + output_pointer = ensure(output_buffer, length + 1); + if (output_pointer == NULL) + { + return false; + } + *output_pointer++ = ','; + if(output_buffer->format) + { + *output_pointer++ = ' '; + } + *output_pointer = '\0'; + output_buffer->offset += length; + } + current_element = current_element->next; + } + + output_pointer = ensure(output_buffer, 2); + if (output_pointer == NULL) + { + return false; + } + *output_pointer++ = ']'; + *output_pointer = '\0'; + output_buffer->depth--; + + return true; +} + +/* Build an object from the text. */ +static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer) +{ + cJSON *head = NULL; /* linked list head */ + cJSON *current_item = NULL; + + if (input_buffer->depth >= CJSON_NESTING_LIMIT) + { + return false; /* to deeply nested */ + } + input_buffer->depth++; + + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '{')) + { + goto fail; /* not an object */ + } + + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '}')) + { + goto success; /* empty object */ + } + + /* check if we skipped to the end of the buffer */ + if (cannot_access_at_index(input_buffer, 0)) + { + input_buffer->offset--; + goto fail; + } + + /* step back to character in front of the first element */ + input_buffer->offset--; + /* loop through the comma separated array elements */ + do + { + /* allocate next item */ + cJSON *new_item = cJSON_New_Item(&(input_buffer->hooks)); + if (new_item == NULL) + { + goto fail; /* allocation failure */ + } + + /* attach next item to list */ + if (head == NULL) + { + /* start the linked list */ + current_item = head = new_item; + } + else + { + /* add to the end and advance */ + current_item->next = new_item; + new_item->prev = current_item; + current_item = new_item; + } + + /* parse the name of the child */ + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (!parse_string(current_item, input_buffer)) + { + goto fail; /* faile to parse name */ + } + buffer_skip_whitespace(input_buffer); + + /* swap valuestring and string, because we parsed the name */ + current_item->string = current_item->valuestring; + current_item->valuestring = NULL; + + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != ':')) + { + goto fail; /* invalid object */ + } + + /* parse the value */ + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (!parse_value(current_item, input_buffer)) + { + goto fail; /* failed to parse value */ + } + buffer_skip_whitespace(input_buffer); + } + while (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ',')); + + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '}')) + { + goto fail; /* expected end of object */ + } + +success: + input_buffer->depth--; + + item->type = cJSON_Object; + item->child = head; + + input_buffer->offset++; + return true; + +fail: + if (head != NULL) + { + cJSON_Delete(head); + } + + return false; +} + +/* Render an object to text. */ +static cJSON_bool print_object(const cJSON * const item, printbuffer * const output_buffer) +{ + unsigned char *output_pointer = NULL; + size_t length = 0; + cJSON *current_item = item->child; + + if (output_buffer == NULL) + { + return false; + } + + /* Compose the output: */ + length = (size_t) (output_buffer->format ? 2 : 1); /* fmt: {\n */ + output_pointer = ensure(output_buffer, length + 1); + if (output_pointer == NULL) + { + return false; + } + + *output_pointer++ = '{'; + output_buffer->depth++; + if (output_buffer->format) + { + *output_pointer++ = '\n'; + } + output_buffer->offset += length; + + while (current_item) + { + if (output_buffer->format) + { + size_t i; + output_pointer = ensure(output_buffer, output_buffer->depth); + if (output_pointer == NULL) + { + return false; + } + for (i = 0; i < output_buffer->depth; i++) + { + *output_pointer++ = '\t'; + } + output_buffer->offset += output_buffer->depth; + } + + /* print key */ + if (!print_string_ptr((unsigned char*)current_item->string, output_buffer)) + { + return false; + } + update_offset(output_buffer); + + length = (size_t) (output_buffer->format ? 2 : 1); + output_pointer = ensure(output_buffer, length); + if (output_pointer == NULL) + { + return false; + } + *output_pointer++ = ':'; + if (output_buffer->format) + { + *output_pointer++ = '\t'; + } + output_buffer->offset += length; + + /* print value */ + if (!print_value(current_item, output_buffer)) + { + return false; + } + update_offset(output_buffer); + + /* print comma if not last */ + length = (size_t) ((output_buffer->format ? 1 : 0) + (current_item->next ? 1 : 0)); + output_pointer = ensure(output_buffer, length + 1); + if (output_pointer == NULL) + { + return false; + } + if (current_item->next) + { + *output_pointer++ = ','; + } + + if (output_buffer->format) + { + *output_pointer++ = '\n'; + } + *output_pointer = '\0'; + output_buffer->offset += length; + + current_item = current_item->next; + } + + output_pointer = ensure(output_buffer, output_buffer->format ? (output_buffer->depth + 1) : 2); + if (output_pointer == NULL) + { + return false; + } + if (output_buffer->format) + { + size_t i; + for (i = 0; i < (output_buffer->depth - 1); i++) + { + *output_pointer++ = '\t'; + } + } + *output_pointer++ = '}'; + *output_pointer = '\0'; + output_buffer->depth--; + + return true; +} + +/* Get Array size/item / object item. */ +CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array) +{ + cJSON *child = NULL; + size_t size = 0; + + if (array == NULL) + { + return 0; + } + + child = array->child; + + while(child != NULL) + { + size++; + child = child->next; + } + + /* FIXME: Can overflow here. Cannot be fixed without breaking the API */ + + return (int)size; +} + +static cJSON* get_array_item(const cJSON *array, size_t index) +{ + cJSON *current_child = NULL; + + if (array == NULL) + { + return NULL; + } + + current_child = array->child; + while ((current_child != NULL) && (index > 0)) + { + index--; + current_child = current_child->next; + } + + return current_child; +} + +CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index) +{ + if (index < 0) + { + return NULL; + } + + return get_array_item(array, (size_t)index); +} + +static cJSON *get_object_item(const cJSON * const object, const char * const name, const cJSON_bool case_sensitive) +{ + cJSON *current_element = NULL; + + if ((object == NULL) || (name == NULL)) + { + return NULL; + } + + current_element = object->child; + if (case_sensitive) + { + while ((current_element != NULL) && (strcmp(name, current_element->string) != 0)) + { + current_element = current_element->next; + } + } + else + { + while ((current_element != NULL) && (case_insensitive_strcmp((const unsigned char*)name, (const unsigned char*)(current_element->string)) != 0)) + { + current_element = current_element->next; + } + } + + return current_element; +} + +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string) +{ + return get_object_item(object, string, false); +} + +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string) +{ + return get_object_item(object, string, true); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string) +{ + return cJSON_GetObjectItem(object, string) ? 1 : 0; +} + +/* Utility for array list handling. */ +static void suffix_object(cJSON *prev, cJSON *item) +{ + prev->next = item; + item->prev = prev; +} + +/* Utility for handling references. */ +static cJSON *create_reference(const cJSON *item, const internal_hooks * const hooks) +{ + cJSON *reference = NULL; + if (item == NULL) + { + return NULL; + } + + reference = cJSON_New_Item(hooks); + if (reference == NULL) + { + return NULL; + } + + memcpy(reference, item, sizeof(cJSON)); + reference->string = NULL; + reference->type |= cJSON_IsReference; + reference->next = reference->prev = NULL; + return reference; +} + +/* Add item to array/object. */ +CJSON_PUBLIC(void) cJSON_AddItemToArray(cJSON *array, cJSON *item) +{ + cJSON *child = NULL; + + if ((item == NULL) || (array == NULL)) + { + return; + } + + child = array->child; + + if (child == NULL) + { + /* list is empty, start new one */ + array->child = item; + } + else + { + /* append to the end */ + while (child->next) + { + child = child->next; + } + suffix_object(child, item); + } +} + +CJSON_PUBLIC(void) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item) +{ + if (item == NULL) + { + return; + } + + /* call cJSON_AddItemToObjectCS for code reuse */ + cJSON_AddItemToObjectCS(object, (char*)cJSON_strdup((const unsigned char*)string, &global_hooks), item); + /* remove cJSON_StringIsConst flag */ + item->type &= ~cJSON_StringIsConst; +} + +#if defined (__clang__) || ((__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))) + #pragma GCC diagnostic push +#endif +#ifdef __GNUC__ +#pragma GCC diagnostic ignored "-Wcast-qual" +#endif + +/* Add an item to an object with constant string as key */ +CJSON_PUBLIC(void) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item) +{ + if ((item == NULL) || (string == NULL)) + { + return; + } + if (!(item->type & cJSON_StringIsConst) && item->string) + { + global_hooks.deallocate(item->string); + } + item->string = (char*)string; + item->type |= cJSON_StringIsConst; + cJSON_AddItemToArray(object, item); +} +#if defined (__clang__) || ((__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))) + #pragma GCC diagnostic pop +#endif + +CJSON_PUBLIC(void) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item) +{ + if (array == NULL) + { + return; + } + + cJSON_AddItemToArray(array, create_reference(item, &global_hooks)); +} + +CJSON_PUBLIC(void) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item) +{ + if ((object == NULL) || (string == NULL)) + { + return; + } + + cJSON_AddItemToObject(object, string, create_reference(item, &global_hooks)); +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item) +{ + if ((parent == NULL) || (item == NULL)) + { + return NULL; + } + + if (item->prev != NULL) + { + /* not the first element */ + item->prev->next = item->next; + } + if (item->next != NULL) + { + /* not the last element */ + item->next->prev = item->prev; + } + + if (item == parent->child) + { + /* first element */ + parent->child = item->next; + } + /* make sure the detached item doesn't point anywhere anymore */ + item->prev = NULL; + item->next = NULL; + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which) +{ + if (which < 0) + { + return NULL; + } + + return cJSON_DetachItemViaPointer(array, get_array_item(array, (size_t)which)); +} + +CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which) +{ + cJSON_Delete(cJSON_DetachItemFromArray(array, which)); +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string) +{ + cJSON *to_detach = cJSON_GetObjectItem(object, string); + + return cJSON_DetachItemViaPointer(object, to_detach); +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string) +{ + cJSON *to_detach = cJSON_GetObjectItemCaseSensitive(object, string); + + return cJSON_DetachItemViaPointer(object, to_detach); +} + +CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string) +{ + cJSON_Delete(cJSON_DetachItemFromObject(object, string)); +} + +CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string) +{ + cJSON_Delete(cJSON_DetachItemFromObjectCaseSensitive(object, string)); +} + +/* Replace array/object items with new ones. */ +CJSON_PUBLIC(void) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem) +{ + cJSON *after_inserted = NULL; + + if (which < 0) + { + return; + } + + after_inserted = get_array_item(array, (size_t)which); + if (after_inserted == NULL) + { + cJSON_AddItemToArray(array, newitem); + return; + } + + newitem->next = after_inserted; + newitem->prev = after_inserted->prev; + after_inserted->prev = newitem; + if (after_inserted == array->child) + { + array->child = newitem; + } + else + { + newitem->prev->next = newitem; + } +} + +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement) +{ + if ((parent == NULL) || (replacement == NULL) || (item == NULL)) + { + return false; + } + + if (replacement == item) + { + return true; + } + + replacement->next = item->next; + replacement->prev = item->prev; + + if (replacement->next != NULL) + { + replacement->next->prev = replacement; + } + if (replacement->prev != NULL) + { + replacement->prev->next = replacement; + } + if (parent->child == item) + { + parent->child = replacement; + } + + item->next = NULL; + item->prev = NULL; + cJSON_Delete(item); + + return true; +} + +CJSON_PUBLIC(void) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem) +{ + if (which < 0) + { + return; + } + + cJSON_ReplaceItemViaPointer(array, get_array_item(array, (size_t)which), newitem); +} + +static cJSON_bool replace_item_in_object(cJSON *object, const char *string, cJSON *replacement, cJSON_bool case_sensitive) +{ + if ((replacement == NULL) || (string == NULL)) + { + return false; + } + + /* replace the name in the replacement */ + if (!(replacement->type & cJSON_StringIsConst) && (replacement->string != NULL)) + { + cJSON_free(replacement->string); + } + replacement->string = (char*)cJSON_strdup((const unsigned char*)string, &global_hooks); + replacement->type &= ~cJSON_StringIsConst; + + cJSON_ReplaceItemViaPointer(object, get_object_item(object, string, case_sensitive), replacement); + + return true; +} + +CJSON_PUBLIC(void) cJSON_ReplaceItemInObject(cJSON *object, const char *string, cJSON *newitem) +{ + replace_item_in_object(object, string, newitem, false); +} + +CJSON_PUBLIC(void) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object, const char *string, cJSON *newitem) +{ + replace_item_in_object(object, string, newitem, true); +} + +/* Create basic types: */ +CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_NULL; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_True; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_False; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool b) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = b ? cJSON_True : cJSON_False; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_Number; + item->valuedouble = num; + + /* use saturation in case of overflow */ + if (num >= INT_MAX) + { + item->valueint = INT_MAX; + } + else if (num <= INT_MIN) + { + item->valueint = INT_MIN; + } + else + { + item->valueint = (int)num; + } + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_String; + item->valuestring = (char*)cJSON_strdup((const unsigned char*)string, &global_hooks); + if(!item->valuestring) + { + cJSON_Delete(item); + return NULL; + } + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_Raw; + item->valuestring = (char*)cJSON_strdup((const unsigned char*)raw, &global_hooks); + if(!item->valuestring) + { + cJSON_Delete(item); + return NULL; + } + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type=cJSON_Array; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if (item) + { + item->type = cJSON_Object; + } + + return item; +} + +/* Create Arrays: */ +CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count) +{ + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; + + if ((count < 0) || (numbers == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + for(i = 0; a && (i < (size_t)count); i++) + { + n = cJSON_CreateNumber(numbers[i]); + if (!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else + { + suffix_object(p, n); + } + p = n; + } + + return a; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count) +{ + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; + + if ((count < 0) || (numbers == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + + for(i = 0; a && (i < (size_t)count); i++) + { + n = cJSON_CreateNumber((double)numbers[i]); + if(!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else + { + suffix_object(p, n); + } + p = n; + } + + return a; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count) +{ + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; + + if ((count < 0) || (numbers == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + + for(i = 0;a && (i < (size_t)count); i++) + { + n = cJSON_CreateNumber(numbers[i]); + if(!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else + { + suffix_object(p, n); + } + p = n; + } + + return a; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char **strings, int count) +{ + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; + + if ((count < 0) || (strings == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + + for (i = 0; a && (i < (size_t)count); i++) + { + n = cJSON_CreateString(strings[i]); + if(!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else + { + suffix_object(p,n); + } + p = n; + } + + return a; +} + +/* Duplication */ +CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse) +{ + cJSON *newitem = NULL; + cJSON *child = NULL; + cJSON *next = NULL; + cJSON *newchild = NULL; + + /* Bail on bad ptr */ + if (!item) + { + goto fail; + } + /* Create new item */ + newitem = cJSON_New_Item(&global_hooks); + if (!newitem) + { + goto fail; + } + /* Copy over all vars */ + newitem->type = item->type & (~cJSON_IsReference); + newitem->valueint = item->valueint; + newitem->valuedouble = item->valuedouble; + if (item->valuestring) + { + newitem->valuestring = (char*)cJSON_strdup((unsigned char*)item->valuestring, &global_hooks); + if (!newitem->valuestring) + { + goto fail; + } + } + if (item->string) + { + newitem->string = (item->type&cJSON_StringIsConst) ? item->string : (char*)cJSON_strdup((unsigned char*)item->string, &global_hooks); + if (!newitem->string) + { + goto fail; + } + } + /* If non-recursive, then we're done! */ + if (!recurse) + { + return newitem; + } + /* Walk the ->next chain for the child. */ + child = item->child; + while (child != NULL) + { + newchild = cJSON_Duplicate(child, true); /* Duplicate (with recurse) each item in the ->next chain */ + if (!newchild) + { + goto fail; + } + if (next != NULL) + { + /* If newitem->child already set, then crosswire ->prev and ->next and move on */ + next->next = newchild; + newchild->prev = next; + next = newchild; + } + else + { + /* Set newitem->child and move to it */ + newitem->child = newchild; + next = newchild; + } + child = child->next; + } + + return newitem; + +fail: + if (newitem != NULL) + { + cJSON_Delete(newitem); + } + + return NULL; +} + +CJSON_PUBLIC(void) cJSON_Minify(char *json) +{ + unsigned char *into = (unsigned char*)json; + + if (json == NULL) + { + return; + } + + while (*json) + { + if (*json == ' ') + { + json++; + } + else if (*json == '\t') + { + /* Whitespace characters. */ + json++; + } + else if (*json == '\r') + { + json++; + } + else if (*json=='\n') + { + json++; + } + else if ((*json == '/') && (json[1] == '/')) + { + /* double-slash comments, to end of line. */ + while (*json && (*json != '\n')) + { + json++; + } + } + else if ((*json == '/') && (json[1] == '*')) + { + /* multiline comments. */ + while (*json && !((*json == '*') && (json[1] == '/'))) + { + json++; + } + json += 2; + } + else if (*json == '\"') + { + /* string literals, which are \" sensitive. */ + *into++ = (unsigned char)*json++; + while (*json && (*json != '\"')) + { + if (*json == '\\') + { + *into++ = (unsigned char)*json++; + } + *into++ = (unsigned char)*json++; + } + *into++ = (unsigned char)*json++; + } + else + { + /* All other characters. */ + *into++ = (unsigned char)*json++; + } + } + + /* and null-terminate. */ + *into = '\0'; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Invalid; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_False; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xff) == cJSON_True; +} + + +CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & (cJSON_True | cJSON_False)) != 0; +} +CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_NULL; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Number; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_String; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Array; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Object; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Raw; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive) +{ + if ((a == NULL) || (b == NULL) || ((a->type & 0xFF) != (b->type & 0xFF)) || cJSON_IsInvalid(a)) + { + return false; + } + + /* check if type is valid */ + switch (a->type & 0xFF) + { + case cJSON_False: + case cJSON_True: + case cJSON_NULL: + case cJSON_Number: + case cJSON_String: + case cJSON_Raw: + case cJSON_Array: + case cJSON_Object: + break; + + default: + return false; + } + + /* identical objects are equal */ + if (a == b) + { + return true; + } + + switch (a->type & 0xFF) + { + /* in these cases and equal type is enough */ + case cJSON_False: + case cJSON_True: + case cJSON_NULL: + return true; + + case cJSON_Number: + if (a->valuedouble == b->valuedouble) + { + return true; + } + return false; + + case cJSON_String: + case cJSON_Raw: + if ((a->valuestring == NULL) || (b->valuestring == NULL)) + { + return false; + } + if (strcmp(a->valuestring, b->valuestring) == 0) + { + return true; + } + + return false; + + case cJSON_Array: + { + cJSON *a_element = a->child; + cJSON *b_element = b->child; + + for (; (a_element != NULL) && (b_element != NULL);) + { + if (!cJSON_Compare(a_element, b_element, case_sensitive)) + { + return false; + } + + a_element = a_element->next; + b_element = b_element->next; + } + + /* one of the arrays is longer than the other */ + if (a_element != b_element) { + return false; + } + + return true; + } + + case cJSON_Object: + { + cJSON *a_element = NULL; + cJSON *b_element = NULL; + cJSON_ArrayForEach(a_element, a) + { + /* TODO This has O(n^2) runtime, which is horrible! */ + b_element = get_object_item(b, a_element->string, case_sensitive); + if (b_element == NULL) + { + return false; + } + + if (!cJSON_Compare(a_element, b_element, case_sensitive)) + { + return false; + } + } + + /* doing this twice, once on a and b to prevent true comparison if a subset of b + * TODO: Do this the proper way, this is just a fix for now */ + cJSON_ArrayForEach(b_element, b) + { + a_element = get_object_item(a, b_element->string, case_sensitive); + if (a_element == NULL) + { + return false; + } + + if (!cJSON_Compare(b_element, a_element, case_sensitive)) + { + return false; + } + } + + return true; + } + + default: + return false; + } +} + +CJSON_PUBLIC(void *) cJSON_malloc(size_t size) +{ + return global_hooks.allocate(size); +} + +CJSON_PUBLIC(void) cJSON_free(void *object) +{ + global_hooks.deallocate(object); +} diff --git a/src/cryptoconditions/src/include/cJSON.h b/src/cryptoconditions/src/include/cJSON.h new file mode 100644 index 000000000..1e388137e --- /dev/null +++ b/src/cryptoconditions/src/include/cJSON.h @@ -0,0 +1,263 @@ +/* + Copyright (c) 2009-2017 Dave Gamble and cJSON contributors + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +#ifndef cJSON__h +#define cJSON__h + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* project version */ +#define CJSON_VERSION_MAJOR 1 +#define CJSON_VERSION_MINOR 5 +#define CJSON_VERSION_PATCH 9 + +#include + +/* cJSON Types: */ +#define cJSON_Invalid (0) +#define cJSON_False (1 << 0) +#define cJSON_True (1 << 1) +#define cJSON_NULL (1 << 2) +#define cJSON_Number (1 << 3) +#define cJSON_String (1 << 4) +#define cJSON_Array (1 << 5) +#define cJSON_Object (1 << 6) +#define cJSON_Raw (1 << 7) /* raw json */ + +#define cJSON_IsReference 256 +#define cJSON_StringIsConst 512 + +/* The cJSON structure: */ +typedef struct cJSON +{ + /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */ + struct cJSON *next; + struct cJSON *prev; + /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */ + struct cJSON *child; + + /* The type of the item, as above. */ + int type; + + /* The item's string, if type==cJSON_String and type == cJSON_Raw */ + char *valuestring; + /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */ + int valueint; + /* The item's number, if type==cJSON_Number */ + double valuedouble; + + /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */ + char *string; +} cJSON; + +typedef struct cJSON_Hooks +{ + void *(*malloc_fn)(size_t sz); + void (*free_fn)(void *ptr); +} cJSON_Hooks; + +typedef int cJSON_bool; + +#if !defined(__WINDOWS__) && (defined(WIN32) || defined(WIN64) || defined(_MSC_VER) || defined(_WIN32)) +#define __WINDOWS__ +#endif +#ifdef __WINDOWS__ + +/* When compiling for windows, we specify a specific calling convention to avoid issues where we are being called from a project with a different default calling convention. For windows you have 2 define options: + +CJSON_HIDE_SYMBOLS - Define this in the case where you don't want to ever dllexport symbols +CJSON_EXPORT_SYMBOLS - Define this on library build when you want to dllexport symbols (default) +CJSON_IMPORT_SYMBOLS - Define this if you want to dllimport symbol + +For *nix builds that support visibility attribute, you can define similar behavior by + +setting default visibility to hidden by adding +-fvisibility=hidden (for gcc) +or +-xldscope=hidden (for sun cc) +to CFLAGS + +then using the CJSON_API_VISIBILITY flag to "export" the same symbols the way CJSON_EXPORT_SYMBOLS does + +*/ + +/* export symbols by default, this is necessary for copy pasting the C and header file */ +#if !defined(CJSON_HIDE_SYMBOLS) && !defined(CJSON_IMPORT_SYMBOLS) && !defined(CJSON_EXPORT_SYMBOLS) +#define CJSON_EXPORT_SYMBOLS +#endif + +#if defined(CJSON_HIDE_SYMBOLS) +#define CJSON_PUBLIC(type) type __stdcall +#elif defined(CJSON_EXPORT_SYMBOLS) +#define CJSON_PUBLIC(type) __declspec(dllexport) type __stdcall +#elif defined(CJSON_IMPORT_SYMBOLS) +#define CJSON_PUBLIC(type) __declspec(dllimport) type __stdcall +#endif +#else /* !WIN32 */ +#if (defined(__GNUC__) || defined(__SUNPRO_CC) || defined (__SUNPRO_C)) && defined(CJSON_API_VISIBILITY) +#define CJSON_PUBLIC(type) __attribute__((visibility("default"))) type +#else +#define CJSON_PUBLIC(type) type +#endif +#endif + +/* Limits how deeply nested arrays/objects can be before cJSON rejects to parse them. + * This is to prevent stack overflows. */ +#ifndef CJSON_NESTING_LIMIT +#define CJSON_NESTING_LIMIT 1000 +#endif + +/* returns the version of cJSON as a string */ +CJSON_PUBLIC(const char*) cJSON_Version(void); + +/* Supply malloc, realloc and free functions to cJSON */ +CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks); + +/* Memory Management: the caller is always responsible to free the results from all variants of cJSON_Parse (with cJSON_Delete) and cJSON_Print (with stdlib free, cJSON_Hooks.free_fn, or cJSON_free as appropriate). The exception is cJSON_PrintPreallocated, where the caller has full responsibility of the buffer. */ +/* Supply a block of JSON, and this returns a cJSON object you can interrogate. */ +CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value); +/* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */ +/* If you supply a ptr in return_parse_end and parsing fails, then return_parse_end will contain a pointer to the error so will match cJSON_GetErrorPtr(). */ +CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated); + +/* Render a cJSON entity to text for transfer/storage. */ +CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item); +/* Render a cJSON entity to text for transfer/storage without any formatting. */ +CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item); +/* Render a cJSON entity to text using a buffered strategy. prebuffer is a guess at the final size. guessing well reduces reallocation. fmt=0 gives unformatted, =1 gives formatted */ +CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt); +/* Render a cJSON entity to text using a buffer already allocated in memory with given length. Returns 1 on success and 0 on failure. */ +/* NOTE: cJSON is not always 100% accurate in estimating how much memory it will use, so to be safe allocate 5 bytes more than you actually need */ +CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buffer, const int length, const cJSON_bool format); +/* Delete a cJSON entity and all subentities. */ +CJSON_PUBLIC(void) cJSON_Delete(cJSON *c); + +/* Returns the number of items in an array (or object). */ +CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array); +/* Retrieve item number "item" from array "array". Returns NULL if unsuccessful. */ +CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index); +/* Get item "string" from object. Case insensitive. */ +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string); +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string); +CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string); +/* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */ +CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void); + +/* These functions check the type of an item */ +CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item); + +/* These calls create a cJSON item of the appropriate type. */ +CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool boolean); +CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num); +CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string); +/* raw json */ +CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw); +CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void); + +/* These utilities create an Array of count items. */ +CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count); +CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count); +CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count); +CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char **strings, int count); + +/* Append item to the specified array/object. */ +CJSON_PUBLIC(void) cJSON_AddItemToArray(cJSON *array, cJSON *item); +CJSON_PUBLIC(void) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item); +/* Use this when string is definitely const (i.e. a literal, or as good as), and will definitely survive the cJSON object. + * WARNING: When this function was used, make sure to always check that (item->type & cJSON_StringIsConst) is zero before + * writing to `item->string` */ +CJSON_PUBLIC(void) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item); +/* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but don't want to corrupt your existing cJSON. */ +CJSON_PUBLIC(void) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item); +CJSON_PUBLIC(void) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item); + +/* Remove/Detatch items from Arrays/Objects. */ +CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item); +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which); +CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which); +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string); +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string); +CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string); +CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string); + +/* Update array items. */ +CJSON_PUBLIC(void) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem); /* Shifts pre-existing items to the right. */ +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement); +CJSON_PUBLIC(void) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem); +CJSON_PUBLIC(void) cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem); +CJSON_PUBLIC(void) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object,const char *string,cJSON *newitem); + +/* Duplicate a cJSON item */ +CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse); +/* Duplicate will create a new, identical cJSON item to the one you pass, in new memory that will +need to be released. With recurse!=0, it will duplicate any children connected to the item. +The item->next and ->prev pointers are always zero on return from Duplicate. */ +/* Recursively compare two cJSON items for equality. If either a or b is NULL or invalid, they will be considered unequal. + * case_sensitive determines if object keys are treated case sensitive (1) or case insensitive (0) */ +CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive); + + +CJSON_PUBLIC(void) cJSON_Minify(char *json); + +/* Macros for creating things quickly. */ +#define cJSON_AddNullToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateNull()) +#define cJSON_AddTrueToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateTrue()) +#define cJSON_AddFalseToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateFalse()) +#define cJSON_AddBoolToObject(object,name,b) cJSON_AddItemToObject(object, name, cJSON_CreateBool(b)) +#define cJSON_AddNumberToObject(object,name,n) cJSON_AddItemToObject(object, name, cJSON_CreateNumber(n)) +#define cJSON_AddStringToObject(object,name,s) cJSON_AddItemToObject(object, name, cJSON_CreateString(s)) +#define cJSON_AddRawToObject(object,name,s) cJSON_AddItemToObject(object, name, cJSON_CreateRaw(s)) + +/* When assigning an integer value, it needs to be propagated to valuedouble too. */ +#define cJSON_SetIntValue(object, number) ((object) ? (object)->valueint = (object)->valuedouble = (number) : (number)) +/* helper for the cJSON_SetNumberValue macro */ +CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number); +#define cJSON_SetNumberValue(object, number) ((object != NULL) ? cJSON_SetNumberHelper(object, (double)number) : (number)) + +/* Macro for iterating over an array or object */ +#define cJSON_ArrayForEach(element, array) for(element = (array != NULL) ? (array)->child : NULL; element != NULL; element = element->next) + +/* malloc/free objects using the malloc/free functions that have been set with cJSON_InitHooks */ +CJSON_PUBLIC(void *) cJSON_malloc(size_t size); +CJSON_PUBLIC(void) cJSON_free(void *object); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/cryptoconditions/src/include/ed25519/license.txt b/src/cryptoconditions/src/include/ed25519/license.txt new file mode 100644 index 000000000..c1503f912 --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/license.txt @@ -0,0 +1,16 @@ +Copyright (c) 2015 Orson Peters + +This software is provided 'as-is', without any express or implied warranty. In no event will the +authors be held liable for any damages arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, including commercial +applications, and to alter it and redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the + original software. If you use this software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and must not be misrepresented as + being the original software. + +3. This notice may not be removed or altered from any source distribution. diff --git a/src/cryptoconditions/src/include/ed25519/readme.md b/src/cryptoconditions/src/include/ed25519/readme.md new file mode 100644 index 000000000..89329bbe4 --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/readme.md @@ -0,0 +1,166 @@ +Ed25519 +======= + +This is a portable implementation of [Ed25519](http://ed25519.cr.yp.to/) based +on the SUPERCOP "ref10" implementation. Additionally there is key exchanging +and scalar addition included to further aid building a PKI using Ed25519. All +code is licensed under the permissive zlib license. + +All code is pure ANSI C without any dependencies, except for the random seed +generation which uses standard OS cryptography APIs (`CryptGenRandom` on +Windows, `/dev/urandom` on nix). If you wish to be entirely portable define +`ED25519_NO_SEED`. This disables the `ed25519_create_seed` function, so if your +application requires key generation you must supply your own seeding function +(which is simply a 256 bit (32 byte) cryptographic random number generator). + + +Performance +----------- + +On a Windows machine with an Intel Pentium B970 @ 2.3GHz I got the following +speeds (running on only one a single core): + + Seed generation: 64us (15625 per second) + Key generation: 88us (11364 per second) + Message signing (short message): 87us (11494 per second) + Message verifying (short message): 228us (4386 per second) + Scalar addition: 100us (10000 per second) + Key exchange: 220us (4545 per second) + +The speeds on other machines may vary. Sign/verify times will be higher with +longer messages. The implementation significantly benefits from 64 bit +architectures, if possible compile as 64 bit. + + +Usage +----- + +Simply add all .c and .h files in the `src/` folder to your project and include +`ed25519.h` in any file you want to use the API. If you prefer to use a shared +library, only copy `ed25519.h` and define `ED25519_DLL` before importing. A +windows DLL is pre-built. + +There are no defined types for seeds, private keys, public keys, shared secrets +or signatures. Instead simple `unsigned char` buffers are used with the +following sizes: + +```c +unsigned char seed[32]; +unsigned char signature[64]; +unsigned char public_key[32]; +unsigned char private_key[64]; +unsigned char scalar[32]; +unsigned char shared_secret[32]; +``` + +API +--- + +```c +int ed25519_create_seed(unsigned char *seed); +``` + +Creates a 32 byte random seed in `seed` for key generation. `seed` must be a +writable 32 byte buffer. Returns 0 on success, and nonzero on failure. + +```c +void ed25519_create_keypair(unsigned char *public_key, unsigned char *private_key, + const unsigned char *seed); +``` + +Creates a new key pair from the given seed. `public_key` must be a writable 32 +byte buffer, `private_key` must be a writable 64 byte buffer and `seed` must be +a 32 byte buffer. + +```c +void ed25519_sign(unsigned char *signature, + const unsigned char *message, size_t message_len, + const unsigned char *public_key, const unsigned char *private_key); +``` + +Creates a signature of the given message with the given key pair. `signature` +must be a writable 64 byte buffer. `message` must have at least `message_len` +bytes to be read. + +```c +int ed25519_verify(const unsigned char *signature, + const unsigned char *message, size_t message_len, + const unsigned char *public_key); +``` + +Verifies the signature on the given message using `public_key`. `signature` +must be a readable 64 byte buffer. `message` must have at least `message_len` +bytes to be read. Returns 1 if the signature matches, 0 otherwise. + +```c +void ed25519_add_scalar(unsigned char *public_key, unsigned char *private_key, + const unsigned char *scalar); +``` + +Adds `scalar` to the given key pair where scalar is a 32 byte buffer (possibly +generated with `ed25519_create_seed`), generating a new key pair. You can +calculate the public key sum without knowing the private key and vice versa by +passing in `NULL` for the key you don't know. This is useful for enforcing +randomness on a key pair by a third party while only knowing the public key, +among other things. Warning: the last bit of the scalar is ignored - if +comparing scalars make sure to clear it with `scalar[31] &= 127`. + + +```c +void ed25519_key_exchange(unsigned char *shared_secret, + const unsigned char *public_key, const unsigned char *private_key); +``` + +Performs a key exchange on the given public key and private key, producing a +shared secret. It is recommended to hash the shared secret before using it. +`shared_secret` must be a 32 byte writable buffer where the shared secret will +be stored. + +Example +------- + +```c +unsigned char seed[32], public_key[32], private_key[64], signature[64]; +unsigned char other_public_key[32], other_private_key[64], shared_secret[32]; +const unsigned char message[] = "TEST MESSAGE"; + +/* create a random seed, and a key pair out of that seed */ +if (ed25519_create_seed(seed)) { + printf("error while generating seed\n"); + exit(1); +} + +ed25519_create_keypair(public_key, private_key, seed); + +/* create signature on the message with the key pair */ +ed25519_sign(signature, message, strlen(message), public_key, private_key); + +/* verify the signature */ +if (ed25519_verify(signature, message, strlen(message), public_key)) { + printf("valid signature\n"); +} else { + printf("invalid signature\n"); +} + +/* create a dummy keypair to use for a key exchange, normally you'd only have +the public key and receive it through some communication channel */ +if (ed25519_create_seed(seed)) { + printf("error while generating seed\n"); + exit(1); +} + +ed25519_create_keypair(other_public_key, other_private_key, seed); + +/* do a key exchange with other_public_key */ +ed25519_key_exchange(shared_secret, other_public_key, private_key); + +/* + the magic here is that ed25519_key_exchange(shared_secret, public_key, + other_private_key); would result in the same shared_secret +*/ + +``` + +License +------- +All code is released under the zlib license. See license.txt for details. diff --git a/src/cryptoconditions/src/include/ed25519/src/add_scalar.c b/src/cryptoconditions/src/include/ed25519/src/add_scalar.c new file mode 100644 index 000000000..7528a7a4a --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/src/add_scalar.c @@ -0,0 +1,69 @@ +#include "ed25519.h" +#include "ge.h" +#include "sc.h" +#include "sha512.h" + + +/* see http://crypto.stackexchange.com/a/6215/4697 */ +void ed25519_add_scalar(unsigned char *public_key, unsigned char *private_key, const unsigned char *scalar) { + const unsigned char SC_1[32] = {1}; /* scalar with value 1 */ + + unsigned char n[32]; + ge_p3 nB; + ge_p1p1 A_p1p1; + ge_p3 A; + ge_p3 public_key_unpacked; + ge_cached T; + + sha512_context hash; + unsigned char hashbuf[64]; + + int i; + + /* copy the scalar and clear highest bit */ + for (i = 0; i < 31; ++i) { + n[i] = scalar[i]; + } + n[31] = scalar[31] & 127; + + /* private key: a = n + t */ + if (private_key) { + sc_muladd(private_key, SC_1, n, private_key); + + // https://github.com/orlp/ed25519/issues/3 + sha512_init(&hash); + sha512_update(&hash, private_key + 32, 32); + sha512_update(&hash, scalar, 32); + sha512_final(&hash, hashbuf); + for (i = 0; i < 32; ++i) { + private_key[32 + i] = hashbuf[i]; + } + } + + /* public key: A = nB + T */ + if (public_key) { + /* if we know the private key we don't need a point addition, which is faster */ + /* using a "timing attack" you could find out wether or not we know the private + key, but this information seems rather useless - if this is important pass + public_key and private_key seperately in 2 function calls */ + if (private_key) { + ge_scalarmult_base(&A, private_key); + } else { + /* unpack public key into T */ + ge_frombytes_negate_vartime(&public_key_unpacked, public_key); + fe_neg(public_key_unpacked.X, public_key_unpacked.X); /* undo negate */ + fe_neg(public_key_unpacked.T, public_key_unpacked.T); /* undo negate */ + ge_p3_to_cached(&T, &public_key_unpacked); + + /* calculate n*B */ + ge_scalarmult_base(&nB, n); + + /* A = n*B + T */ + ge_add(&A_p1p1, &nB, &T); + ge_p1p1_to_p3(&A, &A_p1p1); + } + + /* pack public key */ + ge_p3_tobytes(public_key, &A); + } +} diff --git a/src/cryptoconditions/src/include/ed25519/src/ed25519.h b/src/cryptoconditions/src/include/ed25519/src/ed25519.h new file mode 100644 index 000000000..8924659fa --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/src/ed25519.h @@ -0,0 +1,38 @@ +#ifndef ED25519_H +#define ED25519_H + +#include + +#if defined(_WIN32) + #if defined(ED25519_BUILD_DLL) + #define ED25519_DECLSPEC __declspec(dllexport) + #elif defined(ED25519_DLL) + #define ED25519_DECLSPEC __declspec(dllimport) + #else + #define ED25519_DECLSPEC + #endif +#else + #define ED25519_DECLSPEC +#endif + + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef ED25519_NO_SEED +int ED25519_DECLSPEC ed25519_create_seed(unsigned char *seed); +#endif + +void ED25519_DECLSPEC ed25519_create_keypair(unsigned char *public_key, unsigned char *private_key, const unsigned char *seed); +void ED25519_DECLSPEC ed25519_sign(unsigned char *signature, const unsigned char *message, size_t message_len, const unsigned char *public_key, const unsigned char *private_key); +int ED25519_DECLSPEC ed25519_verify(const unsigned char *signature, const unsigned char *message, size_t message_len, const unsigned char *public_key); +void ED25519_DECLSPEC ed25519_add_scalar(unsigned char *public_key, unsigned char *private_key, const unsigned char *scalar); +void ED25519_DECLSPEC ed25519_key_exchange(unsigned char *shared_secret, const unsigned char *public_key, const unsigned char *private_key); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/cryptoconditions/src/include/ed25519/src/fe.c b/src/cryptoconditions/src/include/ed25519/src/fe.c new file mode 100644 index 000000000..2105eb7b2 --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/src/fe.c @@ -0,0 +1,1491 @@ +#include "fixedint.h" +#include "fe.h" + + +/* + helper functions +*/ +static uint64_t load_3(const unsigned char *in) { + uint64_t result; + + result = (uint64_t) in[0]; + result |= ((uint64_t) in[1]) << 8; + result |= ((uint64_t) in[2]) << 16; + + return result; +} + +static uint64_t load_4(const unsigned char *in) { + uint64_t result; + + result = (uint64_t) in[0]; + result |= ((uint64_t) in[1]) << 8; + result |= ((uint64_t) in[2]) << 16; + result |= ((uint64_t) in[3]) << 24; + + return result; +} + + + +/* + h = 0 +*/ + +void fe_0(fe h) { + h[0] = 0; + h[1] = 0; + h[2] = 0; + h[3] = 0; + h[4] = 0; + h[5] = 0; + h[6] = 0; + h[7] = 0; + h[8] = 0; + h[9] = 0; +} + + + +/* + h = 1 +*/ + +void fe_1(fe h) { + h[0] = 1; + h[1] = 0; + h[2] = 0; + h[3] = 0; + h[4] = 0; + h[5] = 0; + h[6] = 0; + h[7] = 0; + h[8] = 0; + h[9] = 0; +} + + + +/* + h = f + g + Can overlap h with f or g. + + Preconditions: + |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + + Postconditions: + |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +*/ + +void fe_add(fe h, const fe f, const fe g) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + int32_t g0 = g[0]; + int32_t g1 = g[1]; + int32_t g2 = g[2]; + int32_t g3 = g[3]; + int32_t g4 = g[4]; + int32_t g5 = g[5]; + int32_t g6 = g[6]; + int32_t g7 = g[7]; + int32_t g8 = g[8]; + int32_t g9 = g[9]; + int32_t h0 = f0 + g0; + int32_t h1 = f1 + g1; + int32_t h2 = f2 + g2; + int32_t h3 = f3 + g3; + int32_t h4 = f4 + g4; + int32_t h5 = f5 + g5; + int32_t h6 = f6 + g6; + int32_t h7 = f7 + g7; + int32_t h8 = f8 + g8; + int32_t h9 = f9 + g9; + + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; +} + + + +/* + Replace (f,g) with (g,g) if b == 1; + replace (f,g) with (f,g) if b == 0. + + Preconditions: b in {0,1}. +*/ + +void fe_cmov(fe f, const fe g, unsigned int b) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + int32_t g0 = g[0]; + int32_t g1 = g[1]; + int32_t g2 = g[2]; + int32_t g3 = g[3]; + int32_t g4 = g[4]; + int32_t g5 = g[5]; + int32_t g6 = g[6]; + int32_t g7 = g[7]; + int32_t g8 = g[8]; + int32_t g9 = g[9]; + int32_t x0 = f0 ^ g0; + int32_t x1 = f1 ^ g1; + int32_t x2 = f2 ^ g2; + int32_t x3 = f3 ^ g3; + int32_t x4 = f4 ^ g4; + int32_t x5 = f5 ^ g5; + int32_t x6 = f6 ^ g6; + int32_t x7 = f7 ^ g7; + int32_t x8 = f8 ^ g8; + int32_t x9 = f9 ^ g9; + + b = (unsigned int) (- (int) b); /* silence warning */ + x0 &= b; + x1 &= b; + x2 &= b; + x3 &= b; + x4 &= b; + x5 &= b; + x6 &= b; + x7 &= b; + x8 &= b; + x9 &= b; + + f[0] = f0 ^ x0; + f[1] = f1 ^ x1; + f[2] = f2 ^ x2; + f[3] = f3 ^ x3; + f[4] = f4 ^ x4; + f[5] = f5 ^ x5; + f[6] = f6 ^ x6; + f[7] = f7 ^ x7; + f[8] = f8 ^ x8; + f[9] = f9 ^ x9; +} + +/* + Replace (f,g) with (g,f) if b == 1; + replace (f,g) with (f,g) if b == 0. + + Preconditions: b in {0,1}. +*/ + +void fe_cswap(fe f,fe g,unsigned int b) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + int32_t g0 = g[0]; + int32_t g1 = g[1]; + int32_t g2 = g[2]; + int32_t g3 = g[3]; + int32_t g4 = g[4]; + int32_t g5 = g[5]; + int32_t g6 = g[6]; + int32_t g7 = g[7]; + int32_t g8 = g[8]; + int32_t g9 = g[9]; + int32_t x0 = f0 ^ g0; + int32_t x1 = f1 ^ g1; + int32_t x2 = f2 ^ g2; + int32_t x3 = f3 ^ g3; + int32_t x4 = f4 ^ g4; + int32_t x5 = f5 ^ g5; + int32_t x6 = f6 ^ g6; + int32_t x7 = f7 ^ g7; + int32_t x8 = f8 ^ g8; + int32_t x9 = f9 ^ g9; + b = (unsigned int) (- (int) b); /* silence warning */ + x0 &= b; + x1 &= b; + x2 &= b; + x3 &= b; + x4 &= b; + x5 &= b; + x6 &= b; + x7 &= b; + x8 &= b; + x9 &= b; + f[0] = f0 ^ x0; + f[1] = f1 ^ x1; + f[2] = f2 ^ x2; + f[3] = f3 ^ x3; + f[4] = f4 ^ x4; + f[5] = f5 ^ x5; + f[6] = f6 ^ x6; + f[7] = f7 ^ x7; + f[8] = f8 ^ x8; + f[9] = f9 ^ x9; + g[0] = g0 ^ x0; + g[1] = g1 ^ x1; + g[2] = g2 ^ x2; + g[3] = g3 ^ x3; + g[4] = g4 ^ x4; + g[5] = g5 ^ x5; + g[6] = g6 ^ x6; + g[7] = g7 ^ x7; + g[8] = g8 ^ x8; + g[9] = g9 ^ x9; +} + + + +/* + h = f +*/ + +void fe_copy(fe h, const fe f) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + + h[0] = f0; + h[1] = f1; + h[2] = f2; + h[3] = f3; + h[4] = f4; + h[5] = f5; + h[6] = f6; + h[7] = f7; + h[8] = f8; + h[9] = f9; +} + + + +/* + Ignores top bit of h. +*/ + +void fe_frombytes(fe h, const unsigned char *s) { + int64_t h0 = load_4(s); + int64_t h1 = load_3(s + 4) << 6; + int64_t h2 = load_3(s + 7) << 5; + int64_t h3 = load_3(s + 10) << 3; + int64_t h4 = load_3(s + 13) << 2; + int64_t h5 = load_4(s + 16); + int64_t h6 = load_3(s + 20) << 7; + int64_t h7 = load_3(s + 23) << 5; + int64_t h8 = load_3(s + 26) << 4; + int64_t h9 = (load_3(s + 29) & 8388607) << 2; + int64_t carry0; + int64_t carry1; + int64_t carry2; + int64_t carry3; + int64_t carry4; + int64_t carry5; + int64_t carry6; + int64_t carry7; + int64_t carry8; + int64_t carry9; + + carry9 = (h9 + (int64_t) (1 << 24)) >> 25; + h0 += carry9 * 19; + h9 -= carry9 << 25; + carry1 = (h1 + (int64_t) (1 << 24)) >> 25; + h2 += carry1; + h1 -= carry1 << 25; + carry3 = (h3 + (int64_t) (1 << 24)) >> 25; + h4 += carry3; + h3 -= carry3 << 25; + carry5 = (h5 + (int64_t) (1 << 24)) >> 25; + h6 += carry5; + h5 -= carry5 << 25; + carry7 = (h7 + (int64_t) (1 << 24)) >> 25; + h8 += carry7; + h7 -= carry7 << 25; + carry0 = (h0 + (int64_t) (1 << 25)) >> 26; + h1 += carry0; + h0 -= carry0 << 26; + carry2 = (h2 + (int64_t) (1 << 25)) >> 26; + h3 += carry2; + h2 -= carry2 << 26; + carry4 = (h4 + (int64_t) (1 << 25)) >> 26; + h5 += carry4; + h4 -= carry4 << 26; + carry6 = (h6 + (int64_t) (1 << 25)) >> 26; + h7 += carry6; + h6 -= carry6 << 26; + carry8 = (h8 + (int64_t) (1 << 25)) >> 26; + h9 += carry8; + h8 -= carry8 << 26; + + h[0] = (int32_t) h0; + h[1] = (int32_t) h1; + h[2] = (int32_t) h2; + h[3] = (int32_t) h3; + h[4] = (int32_t) h4; + h[5] = (int32_t) h5; + h[6] = (int32_t) h6; + h[7] = (int32_t) h7; + h[8] = (int32_t) h8; + h[9] = (int32_t) h9; +} + + + +void fe_invert(fe out, const fe z) { + fe t0; + fe t1; + fe t2; + fe t3; + int i; + + fe_sq(t0, z); + + for (i = 1; i < 1; ++i) { + fe_sq(t0, t0); + } + + fe_sq(t1, t0); + + for (i = 1; i < 2; ++i) { + fe_sq(t1, t1); + } + + fe_mul(t1, z, t1); + fe_mul(t0, t0, t1); + fe_sq(t2, t0); + + for (i = 1; i < 1; ++i) { + fe_sq(t2, t2); + } + + fe_mul(t1, t1, t2); + fe_sq(t2, t1); + + for (i = 1; i < 5; ++i) { + fe_sq(t2, t2); + } + + fe_mul(t1, t2, t1); + fe_sq(t2, t1); + + for (i = 1; i < 10; ++i) { + fe_sq(t2, t2); + } + + fe_mul(t2, t2, t1); + fe_sq(t3, t2); + + for (i = 1; i < 20; ++i) { + fe_sq(t3, t3); + } + + fe_mul(t2, t3, t2); + fe_sq(t2, t2); + + for (i = 1; i < 10; ++i) { + fe_sq(t2, t2); + } + + fe_mul(t1, t2, t1); + fe_sq(t2, t1); + + for (i = 1; i < 50; ++i) { + fe_sq(t2, t2); + } + + fe_mul(t2, t2, t1); + fe_sq(t3, t2); + + for (i = 1; i < 100; ++i) { + fe_sq(t3, t3); + } + + fe_mul(t2, t3, t2); + fe_sq(t2, t2); + + for (i = 1; i < 50; ++i) { + fe_sq(t2, t2); + } + + fe_mul(t1, t2, t1); + fe_sq(t1, t1); + + for (i = 1; i < 5; ++i) { + fe_sq(t1, t1); + } + + fe_mul(out, t1, t0); +} + + + +/* + return 1 if f is in {1,3,5,...,q-2} + return 0 if f is in {0,2,4,...,q-1} + + Preconditions: + |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +*/ + +int fe_isnegative(const fe f) { + unsigned char s[32]; + + fe_tobytes(s, f); + + return s[0] & 1; +} + + + +/* + return 1 if f == 0 + return 0 if f != 0 + + Preconditions: + |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +*/ + +int fe_isnonzero(const fe f) { + unsigned char s[32]; + unsigned char r; + + fe_tobytes(s, f); + + r = s[0]; + #define F(i) r |= s[i] + F(1); + F(2); + F(3); + F(4); + F(5); + F(6); + F(7); + F(8); + F(9); + F(10); + F(11); + F(12); + F(13); + F(14); + F(15); + F(16); + F(17); + F(18); + F(19); + F(20); + F(21); + F(22); + F(23); + F(24); + F(25); + F(26); + F(27); + F(28); + F(29); + F(30); + F(31); + #undef F + + return r != 0; +} + + + +/* + h = f * g + Can overlap h with f or g. + + Preconditions: + |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. + |g| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. + + Postconditions: + |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. + */ + + /* + Notes on implementation strategy: + + Using schoolbook multiplication. + Karatsuba would save a little in some cost models. + + Most multiplications by 2 and 19 are 32-bit precomputations; + cheaper than 64-bit postcomputations. + + There is one remaining multiplication by 19 in the carry chain; + one *19 precomputation can be merged into this, + but the resulting data flow is considerably less clean. + + There are 12 carries below. + 10 of them are 2-way parallelizable and vectorizable. + Can get away with 11 carries, but then data flow is much deeper. + + With tighter constraints on inputs can squeeze carries into int32. +*/ + +void fe_mul(fe h, const fe f, const fe g) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + int32_t g0 = g[0]; + int32_t g1 = g[1]; + int32_t g2 = g[2]; + int32_t g3 = g[3]; + int32_t g4 = g[4]; + int32_t g5 = g[5]; + int32_t g6 = g[6]; + int32_t g7 = g[7]; + int32_t g8 = g[8]; + int32_t g9 = g[9]; + int32_t g1_19 = 19 * g1; /* 1.959375*2^29 */ + int32_t g2_19 = 19 * g2; /* 1.959375*2^30; still ok */ + int32_t g3_19 = 19 * g3; + int32_t g4_19 = 19 * g4; + int32_t g5_19 = 19 * g5; + int32_t g6_19 = 19 * g6; + int32_t g7_19 = 19 * g7; + int32_t g8_19 = 19 * g8; + int32_t g9_19 = 19 * g9; + int32_t f1_2 = 2 * f1; + int32_t f3_2 = 2 * f3; + int32_t f5_2 = 2 * f5; + int32_t f7_2 = 2 * f7; + int32_t f9_2 = 2 * f9; + int64_t f0g0 = f0 * (int64_t) g0; + int64_t f0g1 = f0 * (int64_t) g1; + int64_t f0g2 = f0 * (int64_t) g2; + int64_t f0g3 = f0 * (int64_t) g3; + int64_t f0g4 = f0 * (int64_t) g4; + int64_t f0g5 = f0 * (int64_t) g5; + int64_t f0g6 = f0 * (int64_t) g6; + int64_t f0g7 = f0 * (int64_t) g7; + int64_t f0g8 = f0 * (int64_t) g8; + int64_t f0g9 = f0 * (int64_t) g9; + int64_t f1g0 = f1 * (int64_t) g0; + int64_t f1g1_2 = f1_2 * (int64_t) g1; + int64_t f1g2 = f1 * (int64_t) g2; + int64_t f1g3_2 = f1_2 * (int64_t) g3; + int64_t f1g4 = f1 * (int64_t) g4; + int64_t f1g5_2 = f1_2 * (int64_t) g5; + int64_t f1g6 = f1 * (int64_t) g6; + int64_t f1g7_2 = f1_2 * (int64_t) g7; + int64_t f1g8 = f1 * (int64_t) g8; + int64_t f1g9_38 = f1_2 * (int64_t) g9_19; + int64_t f2g0 = f2 * (int64_t) g0; + int64_t f2g1 = f2 * (int64_t) g1; + int64_t f2g2 = f2 * (int64_t) g2; + int64_t f2g3 = f2 * (int64_t) g3; + int64_t f2g4 = f2 * (int64_t) g4; + int64_t f2g5 = f2 * (int64_t) g5; + int64_t f2g6 = f2 * (int64_t) g6; + int64_t f2g7 = f2 * (int64_t) g7; + int64_t f2g8_19 = f2 * (int64_t) g8_19; + int64_t f2g9_19 = f2 * (int64_t) g9_19; + int64_t f3g0 = f3 * (int64_t) g0; + int64_t f3g1_2 = f3_2 * (int64_t) g1; + int64_t f3g2 = f3 * (int64_t) g2; + int64_t f3g3_2 = f3_2 * (int64_t) g3; + int64_t f3g4 = f3 * (int64_t) g4; + int64_t f3g5_2 = f3_2 * (int64_t) g5; + int64_t f3g6 = f3 * (int64_t) g6; + int64_t f3g7_38 = f3_2 * (int64_t) g7_19; + int64_t f3g8_19 = f3 * (int64_t) g8_19; + int64_t f3g9_38 = f3_2 * (int64_t) g9_19; + int64_t f4g0 = f4 * (int64_t) g0; + int64_t f4g1 = f4 * (int64_t) g1; + int64_t f4g2 = f4 * (int64_t) g2; + int64_t f4g3 = f4 * (int64_t) g3; + int64_t f4g4 = f4 * (int64_t) g4; + int64_t f4g5 = f4 * (int64_t) g5; + int64_t f4g6_19 = f4 * (int64_t) g6_19; + int64_t f4g7_19 = f4 * (int64_t) g7_19; + int64_t f4g8_19 = f4 * (int64_t) g8_19; + int64_t f4g9_19 = f4 * (int64_t) g9_19; + int64_t f5g0 = f5 * (int64_t) g0; + int64_t f5g1_2 = f5_2 * (int64_t) g1; + int64_t f5g2 = f5 * (int64_t) g2; + int64_t f5g3_2 = f5_2 * (int64_t) g3; + int64_t f5g4 = f5 * (int64_t) g4; + int64_t f5g5_38 = f5_2 * (int64_t) g5_19; + int64_t f5g6_19 = f5 * (int64_t) g6_19; + int64_t f5g7_38 = f5_2 * (int64_t) g7_19; + int64_t f5g8_19 = f5 * (int64_t) g8_19; + int64_t f5g9_38 = f5_2 * (int64_t) g9_19; + int64_t f6g0 = f6 * (int64_t) g0; + int64_t f6g1 = f6 * (int64_t) g1; + int64_t f6g2 = f6 * (int64_t) g2; + int64_t f6g3 = f6 * (int64_t) g3; + int64_t f6g4_19 = f6 * (int64_t) g4_19; + int64_t f6g5_19 = f6 * (int64_t) g5_19; + int64_t f6g6_19 = f6 * (int64_t) g6_19; + int64_t f6g7_19 = f6 * (int64_t) g7_19; + int64_t f6g8_19 = f6 * (int64_t) g8_19; + int64_t f6g9_19 = f6 * (int64_t) g9_19; + int64_t f7g0 = f7 * (int64_t) g0; + int64_t f7g1_2 = f7_2 * (int64_t) g1; + int64_t f7g2 = f7 * (int64_t) g2; + int64_t f7g3_38 = f7_2 * (int64_t) g3_19; + int64_t f7g4_19 = f7 * (int64_t) g4_19; + int64_t f7g5_38 = f7_2 * (int64_t) g5_19; + int64_t f7g6_19 = f7 * (int64_t) g6_19; + int64_t f7g7_38 = f7_2 * (int64_t) g7_19; + int64_t f7g8_19 = f7 * (int64_t) g8_19; + int64_t f7g9_38 = f7_2 * (int64_t) g9_19; + int64_t f8g0 = f8 * (int64_t) g0; + int64_t f8g1 = f8 * (int64_t) g1; + int64_t f8g2_19 = f8 * (int64_t) g2_19; + int64_t f8g3_19 = f8 * (int64_t) g3_19; + int64_t f8g4_19 = f8 * (int64_t) g4_19; + int64_t f8g5_19 = f8 * (int64_t) g5_19; + int64_t f8g6_19 = f8 * (int64_t) g6_19; + int64_t f8g7_19 = f8 * (int64_t) g7_19; + int64_t f8g8_19 = f8 * (int64_t) g8_19; + int64_t f8g9_19 = f8 * (int64_t) g9_19; + int64_t f9g0 = f9 * (int64_t) g0; + int64_t f9g1_38 = f9_2 * (int64_t) g1_19; + int64_t f9g2_19 = f9 * (int64_t) g2_19; + int64_t f9g3_38 = f9_2 * (int64_t) g3_19; + int64_t f9g4_19 = f9 * (int64_t) g4_19; + int64_t f9g5_38 = f9_2 * (int64_t) g5_19; + int64_t f9g6_19 = f9 * (int64_t) g6_19; + int64_t f9g7_38 = f9_2 * (int64_t) g7_19; + int64_t f9g8_19 = f9 * (int64_t) g8_19; + int64_t f9g9_38 = f9_2 * (int64_t) g9_19; + int64_t h0 = f0g0 + f1g9_38 + f2g8_19 + f3g7_38 + f4g6_19 + f5g5_38 + f6g4_19 + f7g3_38 + f8g2_19 + f9g1_38; + int64_t h1 = f0g1 + f1g0 + f2g9_19 + f3g8_19 + f4g7_19 + f5g6_19 + f6g5_19 + f7g4_19 + f8g3_19 + f9g2_19; + int64_t h2 = f0g2 + f1g1_2 + f2g0 + f3g9_38 + f4g8_19 + f5g7_38 + f6g6_19 + f7g5_38 + f8g4_19 + f9g3_38; + int64_t h3 = f0g3 + f1g2 + f2g1 + f3g0 + f4g9_19 + f5g8_19 + f6g7_19 + f7g6_19 + f8g5_19 + f9g4_19; + int64_t h4 = f0g4 + f1g3_2 + f2g2 + f3g1_2 + f4g0 + f5g9_38 + f6g8_19 + f7g7_38 + f8g6_19 + f9g5_38; + int64_t h5 = f0g5 + f1g4 + f2g3 + f3g2 + f4g1 + f5g0 + f6g9_19 + f7g8_19 + f8g7_19 + f9g6_19; + int64_t h6 = f0g6 + f1g5_2 + f2g4 + f3g3_2 + f4g2 + f5g1_2 + f6g0 + f7g9_38 + f8g8_19 + f9g7_38; + int64_t h7 = f0g7 + f1g6 + f2g5 + f3g4 + f4g3 + f5g2 + f6g1 + f7g0 + f8g9_19 + f9g8_19; + int64_t h8 = f0g8 + f1g7_2 + f2g6 + f3g5_2 + f4g4 + f5g3_2 + f6g2 + f7g1_2 + f8g0 + f9g9_38; + int64_t h9 = f0g9 + f1g8 + f2g7 + f3g6 + f4g5 + f5g4 + f6g3 + f7g2 + f8g1 + f9g0 ; + int64_t carry0; + int64_t carry1; + int64_t carry2; + int64_t carry3; + int64_t carry4; + int64_t carry5; + int64_t carry6; + int64_t carry7; + int64_t carry8; + int64_t carry9; + + carry0 = (h0 + (int64_t) (1 << 25)) >> 26; + h1 += carry0; + h0 -= carry0 << 26; + carry4 = (h4 + (int64_t) (1 << 25)) >> 26; + h5 += carry4; + h4 -= carry4 << 26; + + carry1 = (h1 + (int64_t) (1 << 24)) >> 25; + h2 += carry1; + h1 -= carry1 << 25; + carry5 = (h5 + (int64_t) (1 << 24)) >> 25; + h6 += carry5; + h5 -= carry5 << 25; + + carry2 = (h2 + (int64_t) (1 << 25)) >> 26; + h3 += carry2; + h2 -= carry2 << 26; + carry6 = (h6 + (int64_t) (1 << 25)) >> 26; + h7 += carry6; + h6 -= carry6 << 26; + + carry3 = (h3 + (int64_t) (1 << 24)) >> 25; + h4 += carry3; + h3 -= carry3 << 25; + carry7 = (h7 + (int64_t) (1 << 24)) >> 25; + h8 += carry7; + h7 -= carry7 << 25; + + carry4 = (h4 + (int64_t) (1 << 25)) >> 26; + h5 += carry4; + h4 -= carry4 << 26; + carry8 = (h8 + (int64_t) (1 << 25)) >> 26; + h9 += carry8; + h8 -= carry8 << 26; + + carry9 = (h9 + (int64_t) (1 << 24)) >> 25; + h0 += carry9 * 19; + h9 -= carry9 << 25; + + carry0 = (h0 + (int64_t) (1 << 25)) >> 26; + h1 += carry0; + h0 -= carry0 << 26; + + h[0] = (int32_t) h0; + h[1] = (int32_t) h1; + h[2] = (int32_t) h2; + h[3] = (int32_t) h3; + h[4] = (int32_t) h4; + h[5] = (int32_t) h5; + h[6] = (int32_t) h6; + h[7] = (int32_t) h7; + h[8] = (int32_t) h8; + h[9] = (int32_t) h9; +} + + +/* +h = f * 121666 +Can overlap h with f. + +Preconditions: + |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. + +Postconditions: + |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. +*/ + +void fe_mul121666(fe h, fe f) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + int64_t h0 = f0 * (int64_t) 121666; + int64_t h1 = f1 * (int64_t) 121666; + int64_t h2 = f2 * (int64_t) 121666; + int64_t h3 = f3 * (int64_t) 121666; + int64_t h4 = f4 * (int64_t) 121666; + int64_t h5 = f5 * (int64_t) 121666; + int64_t h6 = f6 * (int64_t) 121666; + int64_t h7 = f7 * (int64_t) 121666; + int64_t h8 = f8 * (int64_t) 121666; + int64_t h9 = f9 * (int64_t) 121666; + int64_t carry0; + int64_t carry1; + int64_t carry2; + int64_t carry3; + int64_t carry4; + int64_t carry5; + int64_t carry6; + int64_t carry7; + int64_t carry8; + int64_t carry9; + + carry9 = (h9 + (int64_t) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25; + carry1 = (h1 + (int64_t) (1<<24)) >> 25; h2 += carry1; h1 -= carry1 << 25; + carry3 = (h3 + (int64_t) (1<<24)) >> 25; h4 += carry3; h3 -= carry3 << 25; + carry5 = (h5 + (int64_t) (1<<24)) >> 25; h6 += carry5; h5 -= carry5 << 25; + carry7 = (h7 + (int64_t) (1<<24)) >> 25; h8 += carry7; h7 -= carry7 << 25; + + carry0 = (h0 + (int64_t) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; + carry2 = (h2 + (int64_t) (1<<25)) >> 26; h3 += carry2; h2 -= carry2 << 26; + carry4 = (h4 + (int64_t) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; + carry6 = (h6 + (int64_t) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26; + carry8 = (h8 + (int64_t) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26; + + h[0] = (int32_t) h0; + h[1] = (int32_t) h1; + h[2] = (int32_t) h2; + h[3] = (int32_t) h3; + h[4] = (int32_t) h4; + h[5] = (int32_t) h5; + h[6] = (int32_t) h6; + h[7] = (int32_t) h7; + h[8] = (int32_t) h8; + h[9] = (int32_t) h9; +} + + +/* +h = -f + +Preconditions: + |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + +Postconditions: + |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. +*/ + +void fe_neg(fe h, const fe f) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + int32_t h0 = -f0; + int32_t h1 = -f1; + int32_t h2 = -f2; + int32_t h3 = -f3; + int32_t h4 = -f4; + int32_t h5 = -f5; + int32_t h6 = -f6; + int32_t h7 = -f7; + int32_t h8 = -f8; + int32_t h9 = -f9; + + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; +} + + +void fe_pow22523(fe out, const fe z) { + fe t0; + fe t1; + fe t2; + int i; + fe_sq(t0, z); + + for (i = 1; i < 1; ++i) { + fe_sq(t0, t0); + } + + fe_sq(t1, t0); + + for (i = 1; i < 2; ++i) { + fe_sq(t1, t1); + } + + fe_mul(t1, z, t1); + fe_mul(t0, t0, t1); + fe_sq(t0, t0); + + for (i = 1; i < 1; ++i) { + fe_sq(t0, t0); + } + + fe_mul(t0, t1, t0); + fe_sq(t1, t0); + + for (i = 1; i < 5; ++i) { + fe_sq(t1, t1); + } + + fe_mul(t0, t1, t0); + fe_sq(t1, t0); + + for (i = 1; i < 10; ++i) { + fe_sq(t1, t1); + } + + fe_mul(t1, t1, t0); + fe_sq(t2, t1); + + for (i = 1; i < 20; ++i) { + fe_sq(t2, t2); + } + + fe_mul(t1, t2, t1); + fe_sq(t1, t1); + + for (i = 1; i < 10; ++i) { + fe_sq(t1, t1); + } + + fe_mul(t0, t1, t0); + fe_sq(t1, t0); + + for (i = 1; i < 50; ++i) { + fe_sq(t1, t1); + } + + fe_mul(t1, t1, t0); + fe_sq(t2, t1); + + for (i = 1; i < 100; ++i) { + fe_sq(t2, t2); + } + + fe_mul(t1, t2, t1); + fe_sq(t1, t1); + + for (i = 1; i < 50; ++i) { + fe_sq(t1, t1); + } + + fe_mul(t0, t1, t0); + fe_sq(t0, t0); + + for (i = 1; i < 2; ++i) { + fe_sq(t0, t0); + } + + fe_mul(out, t0, z); + return; +} + + +/* +h = f * f +Can overlap h with f. + +Preconditions: + |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. + +Postconditions: + |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. +*/ + +/* +See fe_mul.c for discussion of implementation strategy. +*/ + +void fe_sq(fe h, const fe f) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + int32_t f0_2 = 2 * f0; + int32_t f1_2 = 2 * f1; + int32_t f2_2 = 2 * f2; + int32_t f3_2 = 2 * f3; + int32_t f4_2 = 2 * f4; + int32_t f5_2 = 2 * f5; + int32_t f6_2 = 2 * f6; + int32_t f7_2 = 2 * f7; + int32_t f5_38 = 38 * f5; /* 1.959375*2^30 */ + int32_t f6_19 = 19 * f6; /* 1.959375*2^30 */ + int32_t f7_38 = 38 * f7; /* 1.959375*2^30 */ + int32_t f8_19 = 19 * f8; /* 1.959375*2^30 */ + int32_t f9_38 = 38 * f9; /* 1.959375*2^30 */ + int64_t f0f0 = f0 * (int64_t) f0; + int64_t f0f1_2 = f0_2 * (int64_t) f1; + int64_t f0f2_2 = f0_2 * (int64_t) f2; + int64_t f0f3_2 = f0_2 * (int64_t) f3; + int64_t f0f4_2 = f0_2 * (int64_t) f4; + int64_t f0f5_2 = f0_2 * (int64_t) f5; + int64_t f0f6_2 = f0_2 * (int64_t) f6; + int64_t f0f7_2 = f0_2 * (int64_t) f7; + int64_t f0f8_2 = f0_2 * (int64_t) f8; + int64_t f0f9_2 = f0_2 * (int64_t) f9; + int64_t f1f1_2 = f1_2 * (int64_t) f1; + int64_t f1f2_2 = f1_2 * (int64_t) f2; + int64_t f1f3_4 = f1_2 * (int64_t) f3_2; + int64_t f1f4_2 = f1_2 * (int64_t) f4; + int64_t f1f5_4 = f1_2 * (int64_t) f5_2; + int64_t f1f6_2 = f1_2 * (int64_t) f6; + int64_t f1f7_4 = f1_2 * (int64_t) f7_2; + int64_t f1f8_2 = f1_2 * (int64_t) f8; + int64_t f1f9_76 = f1_2 * (int64_t) f9_38; + int64_t f2f2 = f2 * (int64_t) f2; + int64_t f2f3_2 = f2_2 * (int64_t) f3; + int64_t f2f4_2 = f2_2 * (int64_t) f4; + int64_t f2f5_2 = f2_2 * (int64_t) f5; + int64_t f2f6_2 = f2_2 * (int64_t) f6; + int64_t f2f7_2 = f2_2 * (int64_t) f7; + int64_t f2f8_38 = f2_2 * (int64_t) f8_19; + int64_t f2f9_38 = f2 * (int64_t) f9_38; + int64_t f3f3_2 = f3_2 * (int64_t) f3; + int64_t f3f4_2 = f3_2 * (int64_t) f4; + int64_t f3f5_4 = f3_2 * (int64_t) f5_2; + int64_t f3f6_2 = f3_2 * (int64_t) f6; + int64_t f3f7_76 = f3_2 * (int64_t) f7_38; + int64_t f3f8_38 = f3_2 * (int64_t) f8_19; + int64_t f3f9_76 = f3_2 * (int64_t) f9_38; + int64_t f4f4 = f4 * (int64_t) f4; + int64_t f4f5_2 = f4_2 * (int64_t) f5; + int64_t f4f6_38 = f4_2 * (int64_t) f6_19; + int64_t f4f7_38 = f4 * (int64_t) f7_38; + int64_t f4f8_38 = f4_2 * (int64_t) f8_19; + int64_t f4f9_38 = f4 * (int64_t) f9_38; + int64_t f5f5_38 = f5 * (int64_t) f5_38; + int64_t f5f6_38 = f5_2 * (int64_t) f6_19; + int64_t f5f7_76 = f5_2 * (int64_t) f7_38; + int64_t f5f8_38 = f5_2 * (int64_t) f8_19; + int64_t f5f9_76 = f5_2 * (int64_t) f9_38; + int64_t f6f6_19 = f6 * (int64_t) f6_19; + int64_t f6f7_38 = f6 * (int64_t) f7_38; + int64_t f6f8_38 = f6_2 * (int64_t) f8_19; + int64_t f6f9_38 = f6 * (int64_t) f9_38; + int64_t f7f7_38 = f7 * (int64_t) f7_38; + int64_t f7f8_38 = f7_2 * (int64_t) f8_19; + int64_t f7f9_76 = f7_2 * (int64_t) f9_38; + int64_t f8f8_19 = f8 * (int64_t) f8_19; + int64_t f8f9_38 = f8 * (int64_t) f9_38; + int64_t f9f9_38 = f9 * (int64_t) f9_38; + int64_t h0 = f0f0 + f1f9_76 + f2f8_38 + f3f7_76 + f4f6_38 + f5f5_38; + int64_t h1 = f0f1_2 + f2f9_38 + f3f8_38 + f4f7_38 + f5f6_38; + int64_t h2 = f0f2_2 + f1f1_2 + f3f9_76 + f4f8_38 + f5f7_76 + f6f6_19; + int64_t h3 = f0f3_2 + f1f2_2 + f4f9_38 + f5f8_38 + f6f7_38; + int64_t h4 = f0f4_2 + f1f3_4 + f2f2 + f5f9_76 + f6f8_38 + f7f7_38; + int64_t h5 = f0f5_2 + f1f4_2 + f2f3_2 + f6f9_38 + f7f8_38; + int64_t h6 = f0f6_2 + f1f5_4 + f2f4_2 + f3f3_2 + f7f9_76 + f8f8_19; + int64_t h7 = f0f7_2 + f1f6_2 + f2f5_2 + f3f4_2 + f8f9_38; + int64_t h8 = f0f8_2 + f1f7_4 + f2f6_2 + f3f5_4 + f4f4 + f9f9_38; + int64_t h9 = f0f9_2 + f1f8_2 + f2f7_2 + f3f6_2 + f4f5_2; + int64_t carry0; + int64_t carry1; + int64_t carry2; + int64_t carry3; + int64_t carry4; + int64_t carry5; + int64_t carry6; + int64_t carry7; + int64_t carry8; + int64_t carry9; + carry0 = (h0 + (int64_t) (1 << 25)) >> 26; + h1 += carry0; + h0 -= carry0 << 26; + carry4 = (h4 + (int64_t) (1 << 25)) >> 26; + h5 += carry4; + h4 -= carry4 << 26; + carry1 = (h1 + (int64_t) (1 << 24)) >> 25; + h2 += carry1; + h1 -= carry1 << 25; + carry5 = (h5 + (int64_t) (1 << 24)) >> 25; + h6 += carry5; + h5 -= carry5 << 25; + carry2 = (h2 + (int64_t) (1 << 25)) >> 26; + h3 += carry2; + h2 -= carry2 << 26; + carry6 = (h6 + (int64_t) (1 << 25)) >> 26; + h7 += carry6; + h6 -= carry6 << 26; + carry3 = (h3 + (int64_t) (1 << 24)) >> 25; + h4 += carry3; + h3 -= carry3 << 25; + carry7 = (h7 + (int64_t) (1 << 24)) >> 25; + h8 += carry7; + h7 -= carry7 << 25; + carry4 = (h4 + (int64_t) (1 << 25)) >> 26; + h5 += carry4; + h4 -= carry4 << 26; + carry8 = (h8 + (int64_t) (1 << 25)) >> 26; + h9 += carry8; + h8 -= carry8 << 26; + carry9 = (h9 + (int64_t) (1 << 24)) >> 25; + h0 += carry9 * 19; + h9 -= carry9 << 25; + carry0 = (h0 + (int64_t) (1 << 25)) >> 26; + h1 += carry0; + h0 -= carry0 << 26; + h[0] = (int32_t) h0; + h[1] = (int32_t) h1; + h[2] = (int32_t) h2; + h[3] = (int32_t) h3; + h[4] = (int32_t) h4; + h[5] = (int32_t) h5; + h[6] = (int32_t) h6; + h[7] = (int32_t) h7; + h[8] = (int32_t) h8; + h[9] = (int32_t) h9; +} + + +/* +h = 2 * f * f +Can overlap h with f. + +Preconditions: + |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. + +Postconditions: + |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. +*/ + +/* +See fe_mul.c for discussion of implementation strategy. +*/ + +void fe_sq2(fe h, const fe f) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + int32_t f0_2 = 2 * f0; + int32_t f1_2 = 2 * f1; + int32_t f2_2 = 2 * f2; + int32_t f3_2 = 2 * f3; + int32_t f4_2 = 2 * f4; + int32_t f5_2 = 2 * f5; + int32_t f6_2 = 2 * f6; + int32_t f7_2 = 2 * f7; + int32_t f5_38 = 38 * f5; /* 1.959375*2^30 */ + int32_t f6_19 = 19 * f6; /* 1.959375*2^30 */ + int32_t f7_38 = 38 * f7; /* 1.959375*2^30 */ + int32_t f8_19 = 19 * f8; /* 1.959375*2^30 */ + int32_t f9_38 = 38 * f9; /* 1.959375*2^30 */ + int64_t f0f0 = f0 * (int64_t) f0; + int64_t f0f1_2 = f0_2 * (int64_t) f1; + int64_t f0f2_2 = f0_2 * (int64_t) f2; + int64_t f0f3_2 = f0_2 * (int64_t) f3; + int64_t f0f4_2 = f0_2 * (int64_t) f4; + int64_t f0f5_2 = f0_2 * (int64_t) f5; + int64_t f0f6_2 = f0_2 * (int64_t) f6; + int64_t f0f7_2 = f0_2 * (int64_t) f7; + int64_t f0f8_2 = f0_2 * (int64_t) f8; + int64_t f0f9_2 = f0_2 * (int64_t) f9; + int64_t f1f1_2 = f1_2 * (int64_t) f1; + int64_t f1f2_2 = f1_2 * (int64_t) f2; + int64_t f1f3_4 = f1_2 * (int64_t) f3_2; + int64_t f1f4_2 = f1_2 * (int64_t) f4; + int64_t f1f5_4 = f1_2 * (int64_t) f5_2; + int64_t f1f6_2 = f1_2 * (int64_t) f6; + int64_t f1f7_4 = f1_2 * (int64_t) f7_2; + int64_t f1f8_2 = f1_2 * (int64_t) f8; + int64_t f1f9_76 = f1_2 * (int64_t) f9_38; + int64_t f2f2 = f2 * (int64_t) f2; + int64_t f2f3_2 = f2_2 * (int64_t) f3; + int64_t f2f4_2 = f2_2 * (int64_t) f4; + int64_t f2f5_2 = f2_2 * (int64_t) f5; + int64_t f2f6_2 = f2_2 * (int64_t) f6; + int64_t f2f7_2 = f2_2 * (int64_t) f7; + int64_t f2f8_38 = f2_2 * (int64_t) f8_19; + int64_t f2f9_38 = f2 * (int64_t) f9_38; + int64_t f3f3_2 = f3_2 * (int64_t) f3; + int64_t f3f4_2 = f3_2 * (int64_t) f4; + int64_t f3f5_4 = f3_2 * (int64_t) f5_2; + int64_t f3f6_2 = f3_2 * (int64_t) f6; + int64_t f3f7_76 = f3_2 * (int64_t) f7_38; + int64_t f3f8_38 = f3_2 * (int64_t) f8_19; + int64_t f3f9_76 = f3_2 * (int64_t) f9_38; + int64_t f4f4 = f4 * (int64_t) f4; + int64_t f4f5_2 = f4_2 * (int64_t) f5; + int64_t f4f6_38 = f4_2 * (int64_t) f6_19; + int64_t f4f7_38 = f4 * (int64_t) f7_38; + int64_t f4f8_38 = f4_2 * (int64_t) f8_19; + int64_t f4f9_38 = f4 * (int64_t) f9_38; + int64_t f5f5_38 = f5 * (int64_t) f5_38; + int64_t f5f6_38 = f5_2 * (int64_t) f6_19; + int64_t f5f7_76 = f5_2 * (int64_t) f7_38; + int64_t f5f8_38 = f5_2 * (int64_t) f8_19; + int64_t f5f9_76 = f5_2 * (int64_t) f9_38; + int64_t f6f6_19 = f6 * (int64_t) f6_19; + int64_t f6f7_38 = f6 * (int64_t) f7_38; + int64_t f6f8_38 = f6_2 * (int64_t) f8_19; + int64_t f6f9_38 = f6 * (int64_t) f9_38; + int64_t f7f7_38 = f7 * (int64_t) f7_38; + int64_t f7f8_38 = f7_2 * (int64_t) f8_19; + int64_t f7f9_76 = f7_2 * (int64_t) f9_38; + int64_t f8f8_19 = f8 * (int64_t) f8_19; + int64_t f8f9_38 = f8 * (int64_t) f9_38; + int64_t f9f9_38 = f9 * (int64_t) f9_38; + int64_t h0 = f0f0 + f1f9_76 + f2f8_38 + f3f7_76 + f4f6_38 + f5f5_38; + int64_t h1 = f0f1_2 + f2f9_38 + f3f8_38 + f4f7_38 + f5f6_38; + int64_t h2 = f0f2_2 + f1f1_2 + f3f9_76 + f4f8_38 + f5f7_76 + f6f6_19; + int64_t h3 = f0f3_2 + f1f2_2 + f4f9_38 + f5f8_38 + f6f7_38; + int64_t h4 = f0f4_2 + f1f3_4 + f2f2 + f5f9_76 + f6f8_38 + f7f7_38; + int64_t h5 = f0f5_2 + f1f4_2 + f2f3_2 + f6f9_38 + f7f8_38; + int64_t h6 = f0f6_2 + f1f5_4 + f2f4_2 + f3f3_2 + f7f9_76 + f8f8_19; + int64_t h7 = f0f7_2 + f1f6_2 + f2f5_2 + f3f4_2 + f8f9_38; + int64_t h8 = f0f8_2 + f1f7_4 + f2f6_2 + f3f5_4 + f4f4 + f9f9_38; + int64_t h9 = f0f9_2 + f1f8_2 + f2f7_2 + f3f6_2 + f4f5_2; + int64_t carry0; + int64_t carry1; + int64_t carry2; + int64_t carry3; + int64_t carry4; + int64_t carry5; + int64_t carry6; + int64_t carry7; + int64_t carry8; + int64_t carry9; + h0 += h0; + h1 += h1; + h2 += h2; + h3 += h3; + h4 += h4; + h5 += h5; + h6 += h6; + h7 += h7; + h8 += h8; + h9 += h9; + carry0 = (h0 + (int64_t) (1 << 25)) >> 26; + h1 += carry0; + h0 -= carry0 << 26; + carry4 = (h4 + (int64_t) (1 << 25)) >> 26; + h5 += carry4; + h4 -= carry4 << 26; + carry1 = (h1 + (int64_t) (1 << 24)) >> 25; + h2 += carry1; + h1 -= carry1 << 25; + carry5 = (h5 + (int64_t) (1 << 24)) >> 25; + h6 += carry5; + h5 -= carry5 << 25; + carry2 = (h2 + (int64_t) (1 << 25)) >> 26; + h3 += carry2; + h2 -= carry2 << 26; + carry6 = (h6 + (int64_t) (1 << 25)) >> 26; + h7 += carry6; + h6 -= carry6 << 26; + carry3 = (h3 + (int64_t) (1 << 24)) >> 25; + h4 += carry3; + h3 -= carry3 << 25; + carry7 = (h7 + (int64_t) (1 << 24)) >> 25; + h8 += carry7; + h7 -= carry7 << 25; + carry4 = (h4 + (int64_t) (1 << 25)) >> 26; + h5 += carry4; + h4 -= carry4 << 26; + carry8 = (h8 + (int64_t) (1 << 25)) >> 26; + h9 += carry8; + h8 -= carry8 << 26; + carry9 = (h9 + (int64_t) (1 << 24)) >> 25; + h0 += carry9 * 19; + h9 -= carry9 << 25; + carry0 = (h0 + (int64_t) (1 << 25)) >> 26; + h1 += carry0; + h0 -= carry0 << 26; + h[0] = (int32_t) h0; + h[1] = (int32_t) h1; + h[2] = (int32_t) h2; + h[3] = (int32_t) h3; + h[4] = (int32_t) h4; + h[5] = (int32_t) h5; + h[6] = (int32_t) h6; + h[7] = (int32_t) h7; + h[8] = (int32_t) h8; + h[9] = (int32_t) h9; +} + + +/* +h = f - g +Can overlap h with f or g. + +Preconditions: + |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + +Postconditions: + |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +*/ + +void fe_sub(fe h, const fe f, const fe g) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + int32_t g0 = g[0]; + int32_t g1 = g[1]; + int32_t g2 = g[2]; + int32_t g3 = g[3]; + int32_t g4 = g[4]; + int32_t g5 = g[5]; + int32_t g6 = g[6]; + int32_t g7 = g[7]; + int32_t g8 = g[8]; + int32_t g9 = g[9]; + int32_t h0 = f0 - g0; + int32_t h1 = f1 - g1; + int32_t h2 = f2 - g2; + int32_t h3 = f3 - g3; + int32_t h4 = f4 - g4; + int32_t h5 = f5 - g5; + int32_t h6 = f6 - g6; + int32_t h7 = f7 - g7; + int32_t h8 = f8 - g8; + int32_t h9 = f9 - g9; + + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; +} + + + +/* +Preconditions: + |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. + +Write p=2^255-19; q=floor(h/p). +Basic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))). + +Proof: + Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4. + Also have |h-2^230 h9|<2^231 so |19 2^(-255)(h-2^230 h9)|<1/4. + + Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9). + Then 0> 25; + q = (h0 + q) >> 26; + q = (h1 + q) >> 25; + q = (h2 + q) >> 26; + q = (h3 + q) >> 25; + q = (h4 + q) >> 26; + q = (h5 + q) >> 25; + q = (h6 + q) >> 26; + q = (h7 + q) >> 25; + q = (h8 + q) >> 26; + q = (h9 + q) >> 25; + /* Goal: Output h-(2^255-19)q, which is between 0 and 2^255-20. */ + h0 += 19 * q; + /* Goal: Output h-2^255 q, which is between 0 and 2^255-20. */ + carry0 = h0 >> 26; + h1 += carry0; + h0 -= carry0 << 26; + carry1 = h1 >> 25; + h2 += carry1; + h1 -= carry1 << 25; + carry2 = h2 >> 26; + h3 += carry2; + h2 -= carry2 << 26; + carry3 = h3 >> 25; + h4 += carry3; + h3 -= carry3 << 25; + carry4 = h4 >> 26; + h5 += carry4; + h4 -= carry4 << 26; + carry5 = h5 >> 25; + h6 += carry5; + h5 -= carry5 << 25; + carry6 = h6 >> 26; + h7 += carry6; + h6 -= carry6 << 26; + carry7 = h7 >> 25; + h8 += carry7; + h7 -= carry7 << 25; + carry8 = h8 >> 26; + h9 += carry8; + h8 -= carry8 << 26; + carry9 = h9 >> 25; + h9 -= carry9 << 25; + + /* h10 = carry9 */ + /* + Goal: Output h0+...+2^255 h10-2^255 q, which is between 0 and 2^255-20. + Have h0+...+2^230 h9 between 0 and 2^255-1; + evidently 2^255 h10-2^255 q = 0. + Goal: Output h0+...+2^230 h9. + */ + s[0] = (unsigned char) (h0 >> 0); + s[1] = (unsigned char) (h0 >> 8); + s[2] = (unsigned char) (h0 >> 16); + s[3] = (unsigned char) ((h0 >> 24) | (h1 << 2)); + s[4] = (unsigned char) (h1 >> 6); + s[5] = (unsigned char) (h1 >> 14); + s[6] = (unsigned char) ((h1 >> 22) | (h2 << 3)); + s[7] = (unsigned char) (h2 >> 5); + s[8] = (unsigned char) (h2 >> 13); + s[9] = (unsigned char) ((h2 >> 21) | (h3 << 5)); + s[10] = (unsigned char) (h3 >> 3); + s[11] = (unsigned char) (h3 >> 11); + s[12] = (unsigned char) ((h3 >> 19) | (h4 << 6)); + s[13] = (unsigned char) (h4 >> 2); + s[14] = (unsigned char) (h4 >> 10); + s[15] = (unsigned char) (h4 >> 18); + s[16] = (unsigned char) (h5 >> 0); + s[17] = (unsigned char) (h5 >> 8); + s[18] = (unsigned char) (h5 >> 16); + s[19] = (unsigned char) ((h5 >> 24) | (h6 << 1)); + s[20] = (unsigned char) (h6 >> 7); + s[21] = (unsigned char) (h6 >> 15); + s[22] = (unsigned char) ((h6 >> 23) | (h7 << 3)); + s[23] = (unsigned char) (h7 >> 5); + s[24] = (unsigned char) (h7 >> 13); + s[25] = (unsigned char) ((h7 >> 21) | (h8 << 4)); + s[26] = (unsigned char) (h8 >> 4); + s[27] = (unsigned char) (h8 >> 12); + s[28] = (unsigned char) ((h8 >> 20) | (h9 << 6)); + s[29] = (unsigned char) (h9 >> 2); + s[30] = (unsigned char) (h9 >> 10); + s[31] = (unsigned char) (h9 >> 18); +} diff --git a/src/cryptoconditions/src/include/ed25519/src/fe.h b/src/cryptoconditions/src/include/ed25519/src/fe.h new file mode 100644 index 000000000..b4b62d282 --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/src/fe.h @@ -0,0 +1,41 @@ +#ifndef FE_H +#define FE_H + +#include "fixedint.h" + + +/* + fe means field element. + Here the field is \Z/(2^255-19). + An element t, entries t[0]...t[9], represents the integer + t[0]+2^26 t[1]+2^51 t[2]+2^77 t[3]+2^102 t[4]+...+2^230 t[9]. + Bounds on each t[i] vary depending on context. +*/ + + +typedef int32_t fe[10]; + + +void fe_0(fe h); +void fe_1(fe h); + +void fe_frombytes(fe h, const unsigned char *s); +void fe_tobytes(unsigned char *s, const fe h); + +void fe_copy(fe h, const fe f); +int fe_isnegative(const fe f); +int fe_isnonzero(const fe f); +void fe_cmov(fe f, const fe g, unsigned int b); +void fe_cswap(fe f, fe g, unsigned int b); + +void fe_neg(fe h, const fe f); +void fe_add(fe h, const fe f, const fe g); +void fe_invert(fe out, const fe z); +void fe_sq(fe h, const fe f); +void fe_sq2(fe h, const fe f); +void fe_mul(fe h, const fe f, const fe g); +void fe_mul121666(fe h, fe f); +void fe_pow22523(fe out, const fe z); +void fe_sub(fe h, const fe f, const fe g); + +#endif diff --git a/src/cryptoconditions/src/include/ed25519/src/fixedint.h b/src/cryptoconditions/src/include/ed25519/src/fixedint.h new file mode 100644 index 000000000..1a8745b1e --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/src/fixedint.h @@ -0,0 +1,72 @@ +/* + Portable header to provide the 32 and 64 bits type. + + Not a compatible replacement for , do not blindly use it as such. +*/ + +#if ((defined(__STDC__) && __STDC__ && __STDC_VERSION__ >= 199901L) || (defined(__WATCOMC__) && (defined(_STDINT_H_INCLUDED) || __WATCOMC__ >= 1250)) || (defined(__GNUC__) && (defined(_STDINT_H) || defined(_STDINT_H_) || defined(__UINT_FAST64_TYPE__)) )) && !defined(FIXEDINT_H_INCLUDED) + #include + #define FIXEDINT_H_INCLUDED + + #if defined(__WATCOMC__) && __WATCOMC__ >= 1250 && !defined(UINT64_C) + #include + #define UINT64_C(x) (x + (UINT64_MAX - UINT64_MAX)) + #endif +#endif + + +#ifndef FIXEDINT_H_INCLUDED + #define FIXEDINT_H_INCLUDED + + #include + + /* (u)int32_t */ + #ifndef uint32_t + #if (ULONG_MAX == 0xffffffffUL) + typedef unsigned long uint32_t; + #elif (UINT_MAX == 0xffffffffUL) + typedef unsigned int uint32_t; + #elif (USHRT_MAX == 0xffffffffUL) + typedef unsigned short uint32_t; + #endif + #endif + + + #ifndef int32_t + #if (LONG_MAX == 0x7fffffffL) + typedef signed long int32_t; + #elif (INT_MAX == 0x7fffffffL) + typedef signed int int32_t; + #elif (SHRT_MAX == 0x7fffffffL) + typedef signed short int32_t; + #endif + #endif + + + /* (u)int64_t */ + #if (defined(__STDC__) && defined(__STDC_VERSION__) && __STDC__ && __STDC_VERSION__ >= 199901L) + typedef long long int64_t; + typedef unsigned long long uint64_t; + + #define UINT64_C(v) v ##ULL + #define INT64_C(v) v ##LL + #elif defined(__GNUC__) + __extension__ typedef long long int64_t; + __extension__ typedef unsigned long long uint64_t; + + #define UINT64_C(v) v ##ULL + #define INT64_C(v) v ##LL + #elif defined(__MWERKS__) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) || defined(__APPLE_CC__) || defined(_LONG_LONG) || defined(_CRAYC) + typedef long long int64_t; + typedef unsigned long long uint64_t; + + #define UINT64_C(v) v ##ULL + #define INT64_C(v) v ##LL + #elif (defined(__WATCOMC__) && defined(__WATCOM_INT64__)) || (defined(_MSC_VER) && _INTEGRAL_MAX_BITS >= 64) || (defined(__BORLANDC__) && __BORLANDC__ > 0x460) || defined(__alpha) || defined(__DECC) + typedef __int64 int64_t; + typedef unsigned __int64 uint64_t; + + #define UINT64_C(v) v ##UI64 + #define INT64_C(v) v ##I64 + #endif +#endif diff --git a/src/cryptoconditions/src/include/ed25519/src/ge.c b/src/cryptoconditions/src/include/ed25519/src/ge.c new file mode 100644 index 000000000..87c691bff --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/src/ge.c @@ -0,0 +1,467 @@ +#include "ge.h" +#include "precomp_data.h" + + +/* +r = p + q +*/ + +void ge_add(ge_p1p1 *r, const ge_p3 *p, const ge_cached *q) { + fe t0; + fe_add(r->X, p->Y, p->X); + fe_sub(r->Y, p->Y, p->X); + fe_mul(r->Z, r->X, q->YplusX); + fe_mul(r->Y, r->Y, q->YminusX); + fe_mul(r->T, q->T2d, p->T); + fe_mul(r->X, p->Z, q->Z); + fe_add(t0, r->X, r->X); + fe_sub(r->X, r->Z, r->Y); + fe_add(r->Y, r->Z, r->Y); + fe_add(r->Z, t0, r->T); + fe_sub(r->T, t0, r->T); +} + + +static void slide(signed char *r, const unsigned char *a) { + int i; + int b; + int k; + + for (i = 0; i < 256; ++i) { + r[i] = 1 & (a[i >> 3] >> (i & 7)); + } + + for (i = 0; i < 256; ++i) + if (r[i]) { + for (b = 1; b <= 6 && i + b < 256; ++b) { + if (r[i + b]) { + if (r[i] + (r[i + b] << b) <= 15) { + r[i] += r[i + b] << b; + r[i + b] = 0; + } else if (r[i] - (r[i + b] << b) >= -15) { + r[i] -= r[i + b] << b; + + for (k = i + b; k < 256; ++k) { + if (!r[k]) { + r[k] = 1; + break; + } + + r[k] = 0; + } + } else { + break; + } + } + } + } +} + +/* +r = a * A + b * B +where a = a[0]+256*a[1]+...+256^31 a[31]. +and b = b[0]+256*b[1]+...+256^31 b[31]. +B is the Ed25519 base point (x,4/5) with x positive. +*/ + +void ge_double_scalarmult_vartime(ge_p2 *r, const unsigned char *a, const ge_p3 *A, const unsigned char *b) { + signed char aslide[256]; + signed char bslide[256]; + ge_cached Ai[8]; /* A,3A,5A,7A,9A,11A,13A,15A */ + ge_p1p1 t; + ge_p3 u; + ge_p3 A2; + int i; + slide(aslide, a); + slide(bslide, b); + ge_p3_to_cached(&Ai[0], A); + ge_p3_dbl(&t, A); + ge_p1p1_to_p3(&A2, &t); + ge_add(&t, &A2, &Ai[0]); + ge_p1p1_to_p3(&u, &t); + ge_p3_to_cached(&Ai[1], &u); + ge_add(&t, &A2, &Ai[1]); + ge_p1p1_to_p3(&u, &t); + ge_p3_to_cached(&Ai[2], &u); + ge_add(&t, &A2, &Ai[2]); + ge_p1p1_to_p3(&u, &t); + ge_p3_to_cached(&Ai[3], &u); + ge_add(&t, &A2, &Ai[3]); + ge_p1p1_to_p3(&u, &t); + ge_p3_to_cached(&Ai[4], &u); + ge_add(&t, &A2, &Ai[4]); + ge_p1p1_to_p3(&u, &t); + ge_p3_to_cached(&Ai[5], &u); + ge_add(&t, &A2, &Ai[5]); + ge_p1p1_to_p3(&u, &t); + ge_p3_to_cached(&Ai[6], &u); + ge_add(&t, &A2, &Ai[6]); + ge_p1p1_to_p3(&u, &t); + ge_p3_to_cached(&Ai[7], &u); + ge_p2_0(r); + + for (i = 255; i >= 0; --i) { + if (aslide[i] || bslide[i]) { + break; + } + } + + for (; i >= 0; --i) { + ge_p2_dbl(&t, r); + + if (aslide[i] > 0) { + ge_p1p1_to_p3(&u, &t); + ge_add(&t, &u, &Ai[aslide[i] / 2]); + } else if (aslide[i] < 0) { + ge_p1p1_to_p3(&u, &t); + ge_sub(&t, &u, &Ai[(-aslide[i]) / 2]); + } + + if (bslide[i] > 0) { + ge_p1p1_to_p3(&u, &t); + ge_madd(&t, &u, &Bi[bslide[i] / 2]); + } else if (bslide[i] < 0) { + ge_p1p1_to_p3(&u, &t); + ge_msub(&t, &u, &Bi[(-bslide[i]) / 2]); + } + + ge_p1p1_to_p2(r, &t); + } +} + + +static const fe d = { + -10913610, 13857413, -15372611, 6949391, 114729, -8787816, -6275908, -3247719, -18696448, -12055116 +}; + +static const fe sqrtm1 = { + -32595792, -7943725, 9377950, 3500415, 12389472, -272473, -25146209, -2005654, 326686, 11406482 +}; + +int ge_frombytes_negate_vartime(ge_p3 *h, const unsigned char *s) { + fe u; + fe v; + fe v3; + fe vxx; + fe check; + fe_frombytes(h->Y, s); + fe_1(h->Z); + fe_sq(u, h->Y); + fe_mul(v, u, d); + fe_sub(u, u, h->Z); /* u = y^2-1 */ + fe_add(v, v, h->Z); /* v = dy^2+1 */ + fe_sq(v3, v); + fe_mul(v3, v3, v); /* v3 = v^3 */ + fe_sq(h->X, v3); + fe_mul(h->X, h->X, v); + fe_mul(h->X, h->X, u); /* x = uv^7 */ + fe_pow22523(h->X, h->X); /* x = (uv^7)^((q-5)/8) */ + fe_mul(h->X, h->X, v3); + fe_mul(h->X, h->X, u); /* x = uv^3(uv^7)^((q-5)/8) */ + fe_sq(vxx, h->X); + fe_mul(vxx, vxx, v); + fe_sub(check, vxx, u); /* vx^2-u */ + + if (fe_isnonzero(check)) { + fe_add(check, vxx, u); /* vx^2+u */ + + if (fe_isnonzero(check)) { + return -1; + } + + fe_mul(h->X, h->X, sqrtm1); + } + + if (fe_isnegative(h->X) == (s[31] >> 7)) { + fe_neg(h->X, h->X); + } + + fe_mul(h->T, h->X, h->Y); + return 0; +} + + +/* +r = p + q +*/ + +void ge_madd(ge_p1p1 *r, const ge_p3 *p, const ge_precomp *q) { + fe t0; + fe_add(r->X, p->Y, p->X); + fe_sub(r->Y, p->Y, p->X); + fe_mul(r->Z, r->X, q->yplusx); + fe_mul(r->Y, r->Y, q->yminusx); + fe_mul(r->T, q->xy2d, p->T); + fe_add(t0, p->Z, p->Z); + fe_sub(r->X, r->Z, r->Y); + fe_add(r->Y, r->Z, r->Y); + fe_add(r->Z, t0, r->T); + fe_sub(r->T, t0, r->T); +} + + +/* +r = p - q +*/ + +void ge_msub(ge_p1p1 *r, const ge_p3 *p, const ge_precomp *q) { + fe t0; + + fe_add(r->X, p->Y, p->X); + fe_sub(r->Y, p->Y, p->X); + fe_mul(r->Z, r->X, q->yminusx); + fe_mul(r->Y, r->Y, q->yplusx); + fe_mul(r->T, q->xy2d, p->T); + fe_add(t0, p->Z, p->Z); + fe_sub(r->X, r->Z, r->Y); + fe_add(r->Y, r->Z, r->Y); + fe_sub(r->Z, t0, r->T); + fe_add(r->T, t0, r->T); +} + + +/* +r = p +*/ + +void ge_p1p1_to_p2(ge_p2 *r, const ge_p1p1 *p) { + fe_mul(r->X, p->X, p->T); + fe_mul(r->Y, p->Y, p->Z); + fe_mul(r->Z, p->Z, p->T); +} + + + +/* +r = p +*/ + +void ge_p1p1_to_p3(ge_p3 *r, const ge_p1p1 *p) { + fe_mul(r->X, p->X, p->T); + fe_mul(r->Y, p->Y, p->Z); + fe_mul(r->Z, p->Z, p->T); + fe_mul(r->T, p->X, p->Y); +} + + +void ge_p2_0(ge_p2 *h) { + fe_0(h->X); + fe_1(h->Y); + fe_1(h->Z); +} + + + +/* +r = 2 * p +*/ + +void ge_p2_dbl(ge_p1p1 *r, const ge_p2 *p) { + fe t0; + + fe_sq(r->X, p->X); + fe_sq(r->Z, p->Y); + fe_sq2(r->T, p->Z); + fe_add(r->Y, p->X, p->Y); + fe_sq(t0, r->Y); + fe_add(r->Y, r->Z, r->X); + fe_sub(r->Z, r->Z, r->X); + fe_sub(r->X, t0, r->Y); + fe_sub(r->T, r->T, r->Z); +} + + +void ge_p3_0(ge_p3 *h) { + fe_0(h->X); + fe_1(h->Y); + fe_1(h->Z); + fe_0(h->T); +} + + +/* +r = 2 * p +*/ + +void ge_p3_dbl(ge_p1p1 *r, const ge_p3 *p) { + ge_p2 q; + ge_p3_to_p2(&q, p); + ge_p2_dbl(r, &q); +} + + + +/* +r = p +*/ + +static const fe d2 = { + -21827239, -5839606, -30745221, 13898782, 229458, 15978800, -12551817, -6495438, 29715968, 9444199 +}; + +void ge_p3_to_cached(ge_cached *r, const ge_p3 *p) { + fe_add(r->YplusX, p->Y, p->X); + fe_sub(r->YminusX, p->Y, p->X); + fe_copy(r->Z, p->Z); + fe_mul(r->T2d, p->T, d2); +} + + +/* +r = p +*/ + +void ge_p3_to_p2(ge_p2 *r, const ge_p3 *p) { + fe_copy(r->X, p->X); + fe_copy(r->Y, p->Y); + fe_copy(r->Z, p->Z); +} + + +void ge_p3_tobytes(unsigned char *s, const ge_p3 *h) { + fe recip; + fe x; + fe y; + fe_invert(recip, h->Z); + fe_mul(x, h->X, recip); + fe_mul(y, h->Y, recip); + fe_tobytes(s, y); + s[31] ^= fe_isnegative(x) << 7; +} + + +static unsigned char equal(signed char b, signed char c) { + unsigned char ub = b; + unsigned char uc = c; + unsigned char x = ub ^ uc; /* 0: yes; 1..255: no */ + uint64_t y = x; /* 0: yes; 1..255: no */ + y -= 1; /* large: yes; 0..254: no */ + y >>= 63; /* 1: yes; 0: no */ + return (unsigned char) y; +} + +static unsigned char negative(signed char b) { + uint64_t x = b; /* 18446744073709551361..18446744073709551615: yes; 0..255: no */ + x >>= 63; /* 1: yes; 0: no */ + return (unsigned char) x; +} + +static void cmov(ge_precomp *t, const ge_precomp *u, unsigned char b) { + fe_cmov(t->yplusx, u->yplusx, b); + fe_cmov(t->yminusx, u->yminusx, b); + fe_cmov(t->xy2d, u->xy2d, b); +} + + +static void select(ge_precomp *t, int pos, signed char b) { + ge_precomp minust; + unsigned char bnegative = negative(b); + unsigned char babs = b - (((-bnegative) & b) << 1); + fe_1(t->yplusx); + fe_1(t->yminusx); + fe_0(t->xy2d); + cmov(t, &base[pos][0], equal(babs, 1)); + cmov(t, &base[pos][1], equal(babs, 2)); + cmov(t, &base[pos][2], equal(babs, 3)); + cmov(t, &base[pos][3], equal(babs, 4)); + cmov(t, &base[pos][4], equal(babs, 5)); + cmov(t, &base[pos][5], equal(babs, 6)); + cmov(t, &base[pos][6], equal(babs, 7)); + cmov(t, &base[pos][7], equal(babs, 8)); + fe_copy(minust.yplusx, t->yminusx); + fe_copy(minust.yminusx, t->yplusx); + fe_neg(minust.xy2d, t->xy2d); + cmov(t, &minust, bnegative); +} + +/* +h = a * B +where a = a[0]+256*a[1]+...+256^31 a[31] +B is the Ed25519 base point (x,4/5) with x positive. + +Preconditions: + a[31] <= 127 +*/ + +void ge_scalarmult_base(ge_p3 *h, const unsigned char *a) { + signed char e[64]; + signed char carry; + ge_p1p1 r; + ge_p2 s; + ge_precomp t; + int i; + + for (i = 0; i < 32; ++i) { + e[2 * i + 0] = (a[i] >> 0) & 15; + e[2 * i + 1] = (a[i] >> 4) & 15; + } + + /* each e[i] is between 0 and 15 */ + /* e[63] is between 0 and 7 */ + carry = 0; + + for (i = 0; i < 63; ++i) { + e[i] += carry; + carry = e[i] + 8; + carry >>= 4; + e[i] -= carry << 4; + } + + e[63] += carry; + /* each e[i] is between -8 and 8 */ + ge_p3_0(h); + + for (i = 1; i < 64; i += 2) { + select(&t, i / 2, e[i]); + ge_madd(&r, h, &t); + ge_p1p1_to_p3(h, &r); + } + + ge_p3_dbl(&r, h); + ge_p1p1_to_p2(&s, &r); + ge_p2_dbl(&r, &s); + ge_p1p1_to_p2(&s, &r); + ge_p2_dbl(&r, &s); + ge_p1p1_to_p2(&s, &r); + ge_p2_dbl(&r, &s); + ge_p1p1_to_p3(h, &r); + + for (i = 0; i < 64; i += 2) { + select(&t, i / 2, e[i]); + ge_madd(&r, h, &t); + ge_p1p1_to_p3(h, &r); + } +} + + +/* +r = p - q +*/ + +void ge_sub(ge_p1p1 *r, const ge_p3 *p, const ge_cached *q) { + fe t0; + + fe_add(r->X, p->Y, p->X); + fe_sub(r->Y, p->Y, p->X); + fe_mul(r->Z, r->X, q->YminusX); + fe_mul(r->Y, r->Y, q->YplusX); + fe_mul(r->T, q->T2d, p->T); + fe_mul(r->X, p->Z, q->Z); + fe_add(t0, r->X, r->X); + fe_sub(r->X, r->Z, r->Y); + fe_add(r->Y, r->Z, r->Y); + fe_sub(r->Z, t0, r->T); + fe_add(r->T, t0, r->T); +} + + +void ge_tobytes(unsigned char *s, const ge_p2 *h) { + fe recip; + fe x; + fe y; + fe_invert(recip, h->Z); + fe_mul(x, h->X, recip); + fe_mul(y, h->Y, recip); + fe_tobytes(s, y); + s[31] ^= fe_isnegative(x) << 7; +} diff --git a/src/cryptoconditions/src/include/ed25519/src/ge.h b/src/cryptoconditions/src/include/ed25519/src/ge.h new file mode 100644 index 000000000..17fde2df1 --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/src/ge.h @@ -0,0 +1,74 @@ +#ifndef GE_H +#define GE_H + +#include "fe.h" + + +/* +ge means group element. + +Here the group is the set of pairs (x,y) of field elements (see fe.h) +satisfying -x^2 + y^2 = 1 + d x^2y^2 +where d = -121665/121666. + +Representations: + ge_p2 (projective): (X:Y:Z) satisfying x=X/Z, y=Y/Z + ge_p3 (extended): (X:Y:Z:T) satisfying x=X/Z, y=Y/Z, XY=ZT + ge_p1p1 (completed): ((X:Z),(Y:T)) satisfying x=X/Z, y=Y/T + ge_precomp (Duif): (y+x,y-x,2dxy) +*/ + +typedef struct { + fe X; + fe Y; + fe Z; +} ge_p2; + +typedef struct { + fe X; + fe Y; + fe Z; + fe T; +} ge_p3; + +typedef struct { + fe X; + fe Y; + fe Z; + fe T; +} ge_p1p1; + +typedef struct { + fe yplusx; + fe yminusx; + fe xy2d; +} ge_precomp; + +typedef struct { + fe YplusX; + fe YminusX; + fe Z; + fe T2d; +} ge_cached; + +void ge_p3_tobytes(unsigned char *s, const ge_p3 *h); +void ge_tobytes(unsigned char *s, const ge_p2 *h); +int ge_frombytes_negate_vartime(ge_p3 *h, const unsigned char *s); + +void ge_add(ge_p1p1 *r, const ge_p3 *p, const ge_cached *q); +void ge_sub(ge_p1p1 *r, const ge_p3 *p, const ge_cached *q); +void ge_double_scalarmult_vartime(ge_p2 *r, const unsigned char *a, const ge_p3 *A, const unsigned char *b); +void ge_madd(ge_p1p1 *r, const ge_p3 *p, const ge_precomp *q); +void ge_msub(ge_p1p1 *r, const ge_p3 *p, const ge_precomp *q); +void ge_scalarmult_base(ge_p3 *h, const unsigned char *a); + +void ge_p1p1_to_p2(ge_p2 *r, const ge_p1p1 *p); +void ge_p1p1_to_p3(ge_p3 *r, const ge_p1p1 *p); +void ge_p2_0(ge_p2 *h); +void ge_p2_dbl(ge_p1p1 *r, const ge_p2 *p); +void ge_p3_0(ge_p3 *h); +void ge_p3_dbl(ge_p1p1 *r, const ge_p3 *p); +void ge_p3_to_cached(ge_cached *r, const ge_p3 *p); +void ge_p3_to_p2(ge_p2 *r, const ge_p3 *p); + +#endif diff --git a/src/cryptoconditions/src/include/ed25519/src/key_exchange.c b/src/cryptoconditions/src/include/ed25519/src/key_exchange.c new file mode 100644 index 000000000..abd75da2c --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/src/key_exchange.c @@ -0,0 +1,79 @@ +#include "ed25519.h" +#include "fe.h" + +void ed25519_key_exchange(unsigned char *shared_secret, const unsigned char *public_key, const unsigned char *private_key) { + unsigned char e[32]; + unsigned int i; + + fe x1; + fe x2; + fe z2; + fe x3; + fe z3; + fe tmp0; + fe tmp1; + + int pos; + unsigned int swap; + unsigned int b; + + /* copy the private key and make sure it's valid */ + for (i = 0; i < 32; ++i) { + e[i] = private_key[i]; + } + + e[0] &= 248; + e[31] &= 63; + e[31] |= 64; + + /* unpack the public key and convert edwards to montgomery */ + /* due to CodesInChaos: montgomeryX = (edwardsY + 1)*inverse(1 - edwardsY) mod p */ + fe_frombytes(x1, public_key); + fe_1(tmp1); + fe_add(tmp0, x1, tmp1); + fe_sub(tmp1, tmp1, x1); + fe_invert(tmp1, tmp1); + fe_mul(x1, tmp0, tmp1); + + fe_1(x2); + fe_0(z2); + fe_copy(x3, x1); + fe_1(z3); + + swap = 0; + for (pos = 254; pos >= 0; --pos) { + b = e[pos / 8] >> (pos & 7); + b &= 1; + swap ^= b; + fe_cswap(x2, x3, swap); + fe_cswap(z2, z3, swap); + swap = b; + + /* from montgomery.h */ + fe_sub(tmp0, x3, z3); + fe_sub(tmp1, x2, z2); + fe_add(x2, x2, z2); + fe_add(z2, x3, z3); + fe_mul(z3, tmp0, x2); + fe_mul(z2, z2, tmp1); + fe_sq(tmp0, tmp1); + fe_sq(tmp1, x2); + fe_add(x3, z3, z2); + fe_sub(z2, z3, z2); + fe_mul(x2, tmp1, tmp0); + fe_sub(tmp1, tmp1, tmp0); + fe_sq(z2, z2); + fe_mul121666(z3, tmp1); + fe_sq(x3, x3); + fe_add(tmp0, tmp0, z3); + fe_mul(z3, x1, z2); + fe_mul(z2, tmp1, tmp0); + } + + fe_cswap(x2, x3, swap); + fe_cswap(z2, z3, swap); + + fe_invert(z2, z2); + fe_mul(x2, x2, z2); + fe_tobytes(shared_secret, x2); +} diff --git a/src/cryptoconditions/src/include/ed25519/src/keypair.c b/src/cryptoconditions/src/include/ed25519/src/keypair.c new file mode 100644 index 000000000..dc1b8eccc --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/src/keypair.c @@ -0,0 +1,16 @@ +#include "ed25519.h" +#include "sha512.h" +#include "ge.h" + + +void ed25519_create_keypair(unsigned char *public_key, unsigned char *private_key, const unsigned char *seed) { + ge_p3 A; + + sha512(seed, 32, private_key); + private_key[0] &= 248; + private_key[31] &= 63; + private_key[31] |= 64; + + ge_scalarmult_base(&A, private_key); + ge_p3_tobytes(public_key, &A); +} diff --git a/src/cryptoconditions/src/include/ed25519/src/precomp_data.h b/src/cryptoconditions/src/include/ed25519/src/precomp_data.h new file mode 100644 index 000000000..ff23986c3 --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/src/precomp_data.h @@ -0,0 +1,1391 @@ +static const ge_precomp Bi[8] = { + { + { 25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605 }, + { -12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378 }, + { -8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546 }, + }, + { + { 15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024 }, + { 16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574 }, + { 30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357 }, + }, + { + { 10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380 }, + { 4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306 }, + { 19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942 }, + }, + { + { 5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766 }, + { -30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701 }, + { 28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300 }, + }, + { + { -22518993, -6692182, 14201702, -8745502, -23510406, 8844726, 18474211, -1361450, -13062696, 13821877 }, + { -6455177, -7839871, 3374702, -4740862, -27098617, -10571707, 31655028, -7212327, 18853322, -14220951 }, + { 4566830, -12963868, -28974889, -12240689, -7602672, -2830569, -8514358, -10431137, 2207753, -3209784 }, + }, + { + { -25154831, -4185821, 29681144, 7868801, -6854661, -9423865, -12437364, -663000, -31111463, -16132436 }, + { 25576264, -2703214, 7349804, -11814844, 16472782, 9300885, 3844789, 15725684, 171356, 6466918 }, + { 23103977, 13316479, 9739013, -16149481, 817875, -15038942, 8965339, -14088058, -30714912, 16193877 }, + }, + { + { -33521811, 3180713, -2394130, 14003687, -16903474, -16270840, 17238398, 4729455, -18074513, 9256800 }, + { -25182317, -4174131, 32336398, 5036987, -21236817, 11360617, 22616405, 9761698, -19827198, 630305 }, + { -13720693, 2639453, -24237460, -7406481, 9494427, -5774029, -6554551, -15960994, -2449256, -14291300 }, + }, + { + { -3151181, -5046075, 9282714, 6866145, -31907062, -863023, -18940575, 15033784, 25105118, -7894876 }, + { -24326370, 15950226, -31801215, -14592823, -11662737, -5090925, 1573892, -2625887, 2198790, -15804619 }, + { -3099351, 10324967, -2241613, 7453183, -5446979, -2735503, -13812022, -16236442, -32461234, -12290683 }, + }, +}; + + +/* base[i][j] = (j+1)*256^i*B */ +static const ge_precomp base[32][8] = { + { + { + { 25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605 }, + { -12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378 }, + { -8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546 }, + }, + { + { -12815894, -12976347, -21581243, 11784320, -25355658, -2750717, -11717903, -3814571, -358445, -10211303 }, + { -21703237, 6903825, 27185491, 6451973, -29577724, -9554005, -15616551, 11189268, -26829678, -5319081 }, + { 26966642, 11152617, 32442495, 15396054, 14353839, -12752335, -3128826, -9541118, -15472047, -4166697 }, + }, + { + { 15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024 }, + { 16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574 }, + { 30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357 }, + }, + { + { -17036878, 13921892, 10945806, -6033431, 27105052, -16084379, -28926210, 15006023, 3284568, -6276540 }, + { 23599295, -8306047, -11193664, -7687416, 13236774, 10506355, 7464579, 9656445, 13059162, 10374397 }, + { 7798556, 16710257, 3033922, 2874086, 28997861, 2835604, 32406664, -3839045, -641708, -101325 }, + }, + { + { 10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380 }, + { 4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306 }, + { 19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942 }, + }, + { + { -15371964, -12862754, 32573250, 4720197, -26436522, 5875511, -19188627, -15224819, -9818940, -12085777 }, + { -8549212, 109983, 15149363, 2178705, 22900618, 4543417, 3044240, -15689887, 1762328, 14866737 }, + { -18199695, -15951423, -10473290, 1707278, -17185920, 3916101, -28236412, 3959421, 27914454, 4383652 }, + }, + { + { 5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766 }, + { -30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701 }, + { 28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300 }, + }, + { + { 14499471, -2729599, -33191113, -4254652, 28494862, 14271267, 30290735, 10876454, -33154098, 2381726 }, + { -7195431, -2655363, -14730155, 462251, -27724326, 3941372, -6236617, 3696005, -32300832, 15351955 }, + { 27431194, 8222322, 16448760, -3907995, -18707002, 11938355, -32961401, -2970515, 29551813, 10109425 }, + }, + }, + { + { + { -13657040, -13155431, -31283750, 11777098, 21447386, 6519384, -2378284, -1627556, 10092783, -4764171 }, + { 27939166, 14210322, 4677035, 16277044, -22964462, -12398139, -32508754, 12005538, -17810127, 12803510 }, + { 17228999, -15661624, -1233527, 300140, -1224870, -11714777, 30364213, -9038194, 18016357, 4397660 }, + }, + { + { -10958843, -7690207, 4776341, -14954238, 27850028, -15602212, -26619106, 14544525, -17477504, 982639 }, + { 29253598, 15796703, -2863982, -9908884, 10057023, 3163536, 7332899, -4120128, -21047696, 9934963 }, + { 5793303, 16271923, -24131614, -10116404, 29188560, 1206517, -14747930, 4559895, -30123922, -10897950 }, + }, + { + { -27643952, -11493006, 16282657, -11036493, 28414021, -15012264, 24191034, 4541697, -13338309, 5500568 }, + { 12650548, -1497113, 9052871, 11355358, -17680037, -8400164, -17430592, 12264343, 10874051, 13524335 }, + { 25556948, -3045990, 714651, 2510400, 23394682, -10415330, 33119038, 5080568, -22528059, 5376628 }, + }, + { + { -26088264, -4011052, -17013699, -3537628, -6726793, 1920897, -22321305, -9447443, 4535768, 1569007 }, + { -2255422, 14606630, -21692440, -8039818, 28430649, 8775819, -30494562, 3044290, 31848280, 12543772 }, + { -22028579, 2943893, -31857513, 6777306, 13784462, -4292203, -27377195, -2062731, 7718482, 14474653 }, + }, + { + { 2385315, 2454213, -22631320, 46603, -4437935, -15680415, 656965, -7236665, 24316168, -5253567 }, + { 13741529, 10911568, -33233417, -8603737, -20177830, -1033297, 33040651, -13424532, -20729456, 8321686 }, + { 21060490, -2212744, 15712757, -4336099, 1639040, 10656336, 23845965, -11874838, -9984458, 608372 }, + }, + { + { -13672732, -15087586, -10889693, -7557059, -6036909, 11305547, 1123968, -6780577, 27229399, 23887 }, + { -23244140, -294205, -11744728, 14712571, -29465699, -2029617, 12797024, -6440308, -1633405, 16678954 }, + { -29500620, 4770662, -16054387, 14001338, 7830047, 9564805, -1508144, -4795045, -17169265, 4904953 }, + }, + { + { 24059557, 14617003, 19037157, -15039908, 19766093, -14906429, 5169211, 16191880, 2128236, -4326833 }, + { -16981152, 4124966, -8540610, -10653797, 30336522, -14105247, -29806336, 916033, -6882542, -2986532 }, + { -22630907, 12419372, -7134229, -7473371, -16478904, 16739175, 285431, 2763829, 15736322, 4143876 }, + }, + { + { 2379352, 11839345, -4110402, -5988665, 11274298, 794957, 212801, -14594663, 23527084, -16458268 }, + { 33431127, -11130478, -17838966, -15626900, 8909499, 8376530, -32625340, 4087881, -15188911, -14416214 }, + { 1767683, 7197987, -13205226, -2022635, -13091350, 448826, 5799055, 4357868, -4774191, -16323038 }, + }, + }, + { + { + { 6721966, 13833823, -23523388, -1551314, 26354293, -11863321, 23365147, -3949732, 7390890, 2759800 }, + { 4409041, 2052381, 23373853, 10530217, 7676779, -12885954, 21302353, -4264057, 1244380, -12919645 }, + { -4421239, 7169619, 4982368, -2957590, 30256825, -2777540, 14086413, 9208236, 15886429, 16489664 }, + }, + { + { 1996075, 10375649, 14346367, 13311202, -6874135, -16438411, -13693198, 398369, -30606455, -712933 }, + { -25307465, 9795880, -2777414, 14878809, -33531835, 14780363, 13348553, 12076947, -30836462, 5113182 }, + { -17770784, 11797796, 31950843, 13929123, -25888302, 12288344, -30341101, -7336386, 13847711, 5387222 }, + }, + { + { -18582163, -3416217, 17824843, -2340966, 22744343, -10442611, 8763061, 3617786, -19600662, 10370991 }, + { 20246567, -14369378, 22358229, -543712, 18507283, -10413996, 14554437, -8746092, 32232924, 16763880 }, + { 9648505, 10094563, 26416693, 14745928, -30374318, -6472621, 11094161, 15689506, 3140038, -16510092 }, + }, + { + { -16160072, 5472695, 31895588, 4744994, 8823515, 10365685, -27224800, 9448613, -28774454, 366295 }, + { 19153450, 11523972, -11096490, -6503142, -24647631, 5420647, 28344573, 8041113, 719605, 11671788 }, + { 8678025, 2694440, -6808014, 2517372, 4964326, 11152271, -15432916, -15266516, 27000813, -10195553 }, + }, + { + { -15157904, 7134312, 8639287, -2814877, -7235688, 10421742, 564065, 5336097, 6750977, -14521026 }, + { 11836410, -3979488, 26297894, 16080799, 23455045, 15735944, 1695823, -8819122, 8169720, 16220347 }, + { -18115838, 8653647, 17578566, -6092619, -8025777, -16012763, -11144307, -2627664, -5990708, -14166033 }, + }, + { + { -23308498, -10968312, 15213228, -10081214, -30853605, -11050004, 27884329, 2847284, 2655861, 1738395 }, + { -27537433, -14253021, -25336301, -8002780, -9370762, 8129821, 21651608, -3239336, -19087449, -11005278 }, + { 1533110, 3437855, 23735889, 459276, 29970501, 11335377, 26030092, 5821408, 10478196, 8544890 }, + }, + { + { 32173121, -16129311, 24896207, 3921497, 22579056, -3410854, 19270449, 12217473, 17789017, -3395995 }, + { -30552961, -2228401, -15578829, -10147201, 13243889, 517024, 15479401, -3853233, 30460520, 1052596 }, + { -11614875, 13323618, 32618793, 8175907, -15230173, 12596687, 27491595, -4612359, 3179268, -9478891 }, + }, + { + { 31947069, -14366651, -4640583, -15339921, -15125977, -6039709, -14756777, -16411740, 19072640, -9511060 }, + { 11685058, 11822410, 3158003, -13952594, 33402194, -4165066, 5977896, -5215017, 473099, 5040608 }, + { -20290863, 8198642, -27410132, 11602123, 1290375, -2799760, 28326862, 1721092, -19558642, -3131606 }, + }, + }, + { + { + { 7881532, 10687937, 7578723, 7738378, -18951012, -2553952, 21820786, 8076149, -27868496, 11538389 }, + { -19935666, 3899861, 18283497, -6801568, -15728660, -11249211, 8754525, 7446702, -5676054, 5797016 }, + { -11295600, -3793569, -15782110, -7964573, 12708869, -8456199, 2014099, -9050574, -2369172, -5877341 }, + }, + { + { -22472376, -11568741, -27682020, 1146375, 18956691, 16640559, 1192730, -3714199, 15123619, 10811505 }, + { 14352098, -3419715, -18942044, 10822655, 32750596, 4699007, -70363, 15776356, -28886779, -11974553 }, + { -28241164, -8072475, -4978962, -5315317, 29416931, 1847569, -20654173, -16484855, 4714547, -9600655 }, + }, + { + { 15200332, 8368572, 19679101, 15970074, -31872674, 1959451, 24611599, -4543832, -11745876, 12340220 }, + { 12876937, -10480056, 33134381, 6590940, -6307776, 14872440, 9613953, 8241152, 15370987, 9608631 }, + { -4143277, -12014408, 8446281, -391603, 4407738, 13629032, -7724868, 15866074, -28210621, -8814099 }, + }, + { + { 26660628, -15677655, 8393734, 358047, -7401291, 992988, -23904233, 858697, 20571223, 8420556 }, + { 14620715, 13067227, -15447274, 8264467, 14106269, 15080814, 33531827, 12516406, -21574435, -12476749 }, + { 236881, 10476226, 57258, -14677024, 6472998, 2466984, 17258519, 7256740, 8791136, 15069930 }, + }, + { + { 1276410, -9371918, 22949635, -16322807, -23493039, -5702186, 14711875, 4874229, -30663140, -2331391 }, + { 5855666, 4990204, -13711848, 7294284, -7804282, 1924647, -1423175, -7912378, -33069337, 9234253 }, + { 20590503, -9018988, 31529744, -7352666, -2706834, 10650548, 31559055, -11609587, 18979186, 13396066 }, + }, + { + { 24474287, 4968103, 22267082, 4407354, 24063882, -8325180, -18816887, 13594782, 33514650, 7021958 }, + { -11566906, -6565505, -21365085, 15928892, -26158305, 4315421, -25948728, -3916677, -21480480, 12868082 }, + { -28635013, 13504661, 19988037, -2132761, 21078225, 6443208, -21446107, 2244500, -12455797, -8089383 }, + }, + { + { -30595528, 13793479, -5852820, 319136, -25723172, -6263899, 33086546, 8957937, -15233648, 5540521 }, + { -11630176, -11503902, -8119500, -7643073, 2620056, 1022908, -23710744, -1568984, -16128528, -14962807 }, + { 23152971, 775386, 27395463, 14006635, -9701118, 4649512, 1689819, 892185, -11513277, -15205948 }, + }, + { + { 9770129, 9586738, 26496094, 4324120, 1556511, -3550024, 27453819, 4763127, -19179614, 5867134 }, + { -32765025, 1927590, 31726409, -4753295, 23962434, -16019500, 27846559, 5931263, -29749703, -16108455 }, + { 27461885, -2977536, 22380810, 1815854, -23033753, -3031938, 7283490, -15148073, -19526700, 7734629 }, + }, + }, + { + { + { -8010264, -9590817, -11120403, 6196038, 29344158, -13430885, 7585295, -3176626, 18549497, 15302069 }, + { -32658337, -6171222, -7672793, -11051681, 6258878, 13504381, 10458790, -6418461, -8872242, 8424746 }, + { 24687205, 8613276, -30667046, -3233545, 1863892, -1830544, 19206234, 7134917, -11284482, -828919 }, + }, + { + { 11334899, -9218022, 8025293, 12707519, 17523892, -10476071, 10243738, -14685461, -5066034, 16498837 }, + { 8911542, 6887158, -9584260, -6958590, 11145641, -9543680, 17303925, -14124238, 6536641, 10543906 }, + { -28946384, 15479763, -17466835, 568876, -1497683, 11223454, -2669190, -16625574, -27235709, 8876771 }, + }, + { + { -25742899, -12566864, -15649966, -846607, -33026686, -796288, -33481822, 15824474, -604426, -9039817 }, + { 10330056, 70051, 7957388, -9002667, 9764902, 15609756, 27698697, -4890037, 1657394, 3084098 }, + { 10477963, -7470260, 12119566, -13250805, 29016247, -5365589, 31280319, 14396151, -30233575, 15272409 }, + }, + { + { -12288309, 3169463, 28813183, 16658753, 25116432, -5630466, -25173957, -12636138, -25014757, 1950504 }, + { -26180358, 9489187, 11053416, -14746161, -31053720, 5825630, -8384306, -8767532, 15341279, 8373727 }, + { 28685821, 7759505, -14378516, -12002860, -31971820, 4079242, 298136, -10232602, -2878207, 15190420 }, + }, + { + { -32932876, 13806336, -14337485, -15794431, -24004620, 10940928, 8669718, 2742393, -26033313, -6875003 }, + { -1580388, -11729417, -25979658, -11445023, -17411874, -10912854, 9291594, -16247779, -12154742, 6048605 }, + { -30305315, 14843444, 1539301, 11864366, 20201677, 1900163, 13934231, 5128323, 11213262, 9168384 }, + }, + { + { -26280513, 11007847, 19408960, -940758, -18592965, -4328580, -5088060, -11105150, 20470157, -16398701 }, + { -23136053, 9282192, 14855179, -15390078, -7362815, -14408560, -22783952, 14461608, 14042978, 5230683 }, + { 29969567, -2741594, -16711867, -8552442, 9175486, -2468974, 21556951, 3506042, -5933891, -12449708 }, + }, + { + { -3144746, 8744661, 19704003, 4581278, -20430686, 6830683, -21284170, 8971513, -28539189, 15326563 }, + { -19464629, 10110288, -17262528, -3503892, -23500387, 1355669, -15523050, 15300988, -20514118, 9168260 }, + { -5353335, 4488613, -23803248, 16314347, 7780487, -15638939, -28948358, 9601605, 33087103, -9011387 }, + }, + { + { -19443170, -15512900, -20797467, -12445323, -29824447, 10229461, -27444329, -15000531, -5996870, 15664672 }, + { 23294591, -16632613, -22650781, -8470978, 27844204, 11461195, 13099750, -2460356, 18151676, 13417686 }, + { -24722913, -4176517, -31150679, 5988919, -26858785, 6685065, 1661597, -12551441, 15271676, -15452665 }, + }, + }, + { + { + { 11433042, -13228665, 8239631, -5279517, -1985436, -725718, -18698764, 2167544, -6921301, -13440182 }, + { -31436171, 15575146, 30436815, 12192228, -22463353, 9395379, -9917708, -8638997, 12215110, 12028277 }, + { 14098400, 6555944, 23007258, 5757252, -15427832, -12950502, 30123440, 4617780, -16900089, -655628 }, + }, + { + { -4026201, -15240835, 11893168, 13718664, -14809462, 1847385, -15819999, 10154009, 23973261, -12684474 }, + { -26531820, -3695990, -1908898, 2534301, -31870557, -16550355, 18341390, -11419951, 32013174, -10103539 }, + { -25479301, 10876443, -11771086, -14625140, -12369567, 1838104, 21911214, 6354752, 4425632, -837822 }, + }, + { + { -10433389, -14612966, 22229858, -3091047, -13191166, 776729, -17415375, -12020462, 4725005, 14044970 }, + { 19268650, -7304421, 1555349, 8692754, -21474059, -9910664, 6347390, -1411784, -19522291, -16109756 }, + { -24864089, 12986008, -10898878, -5558584, -11312371, -148526, 19541418, 8180106, 9282262, 10282508 }, + }, + { + { -26205082, 4428547, -8661196, -13194263, 4098402, -14165257, 15522535, 8372215, 5542595, -10702683 }, + { -10562541, 14895633, 26814552, -16673850, -17480754, -2489360, -2781891, 6993761, -18093885, 10114655 }, + { -20107055, -929418, 31422704, 10427861, -7110749, 6150669, -29091755, -11529146, 25953725, -106158 }, + }, + { + { -4234397, -8039292, -9119125, 3046000, 2101609, -12607294, 19390020, 6094296, -3315279, 12831125 }, + { -15998678, 7578152, 5310217, 14408357, -33548620, -224739, 31575954, 6326196, 7381791, -2421839 }, + { -20902779, 3296811, 24736065, -16328389, 18374254, 7318640, 6295303, 8082724, -15362489, 12339664 }, + }, + { + { 27724736, 2291157, 6088201, -14184798, 1792727, 5857634, 13848414, 15768922, 25091167, 14856294 }, + { -18866652, 8331043, 24373479, 8541013, -701998, -9269457, 12927300, -12695493, -22182473, -9012899 }, + { -11423429, -5421590, 11632845, 3405020, 30536730, -11674039, -27260765, 13866390, 30146206, 9142070 }, + }, + { + { 3924129, -15307516, -13817122, -10054960, 12291820, -668366, -27702774, 9326384, -8237858, 4171294 }, + { -15921940, 16037937, 6713787, 16606682, -21612135, 2790944, 26396185, 3731949, 345228, -5462949 }, + { -21327538, 13448259, 25284571, 1143661, 20614966, -8849387, 2031539, -12391231, -16253183, -13582083 }, + }, + { + { 31016211, -16722429, 26371392, -14451233, -5027349, 14854137, 17477601, 3842657, 28012650, -16405420 }, + { -5075835, 9368966, -8562079, -4600902, -15249953, 6970560, -9189873, 16292057, -8867157, 3507940 }, + { 29439664, 3537914, 23333589, 6997794, -17555561, -11018068, -15209202, -15051267, -9164929, 6580396 }, + }, + }, + { + { + { -12185861, -7679788, 16438269, 10826160, -8696817, -6235611, 17860444, -9273846, -2095802, 9304567 }, + { 20714564, -4336911, 29088195, 7406487, 11426967, -5095705, 14792667, -14608617, 5289421, -477127 }, + { -16665533, -10650790, -6160345, -13305760, 9192020, -1802462, 17271490, 12349094, 26939669, -3752294 }, + }, + { + { -12889898, 9373458, 31595848, 16374215, 21471720, 13221525, -27283495, -12348559, -3698806, 117887 }, + { 22263325, -6560050, 3984570, -11174646, -15114008, -566785, 28311253, 5358056, -23319780, 541964 }, + { 16259219, 3261970, 2309254, -15534474, -16885711, -4581916, 24134070, -16705829, -13337066, -13552195 }, + }, + { + { 9378160, -13140186, -22845982, -12745264, 28198281, -7244098, -2399684, -717351, 690426, 14876244 }, + { 24977353, -314384, -8223969, -13465086, 28432343, -1176353, -13068804, -12297348, -22380984, 6618999 }, + { -1538174, 11685646, 12944378, 13682314, -24389511, -14413193, 8044829, -13817328, 32239829, -5652762 }, + }, + { + { -18603066, 4762990, -926250, 8885304, -28412480, -3187315, 9781647, -10350059, 32779359, 5095274 }, + { -33008130, -5214506, -32264887, -3685216, 9460461, -9327423, -24601656, 14506724, 21639561, -2630236 }, + { -16400943, -13112215, 25239338, 15531969, 3987758, -4499318, -1289502, -6863535, 17874574, 558605 }, + }, + { + { -13600129, 10240081, 9171883, 16131053, -20869254, 9599700, 33499487, 5080151, 2085892, 5119761 }, + { -22205145, -2519528, -16381601, 414691, -25019550, 2170430, 30634760, -8363614, -31999993, -5759884 }, + { -6845704, 15791202, 8550074, -1312654, 29928809, -12092256, 27534430, -7192145, -22351378, 12961482 }, + }, + { + { -24492060, -9570771, 10368194, 11582341, -23397293, -2245287, 16533930, 8206996, -30194652, -5159638 }, + { -11121496, -3382234, 2307366, 6362031, -135455, 8868177, -16835630, 7031275, 7589640, 8945490 }, + { -32152748, 8917967, 6661220, -11677616, -1192060, -15793393, 7251489, -11182180, 24099109, -14456170 }, + }, + { + { 5019558, -7907470, 4244127, -14714356, -26933272, 6453165, -19118182, -13289025, -6231896, -10280736 }, + { 10853594, 10721687, 26480089, 5861829, -22995819, 1972175, -1866647, -10557898, -3363451, -6441124 }, + { -17002408, 5906790, 221599, -6563147, 7828208, -13248918, 24362661, -2008168, -13866408, 7421392 }, + }, + { + { 8139927, -6546497, 32257646, -5890546, 30375719, 1886181, -21175108, 15441252, 28826358, -4123029 }, + { 6267086, 9695052, 7709135, -16603597, -32869068, -1886135, 14795160, -7840124, 13746021, -1742048 }, + { 28584902, 7787108, -6732942, -15050729, 22846041, -7571236, -3181936, -363524, 4771362, -8419958 }, + }, + }, + { + { + { 24949256, 6376279, -27466481, -8174608, -18646154, -9930606, 33543569, -12141695, 3569627, 11342593 }, + { 26514989, 4740088, 27912651, 3697550, 19331575, -11472339, 6809886, 4608608, 7325975, -14801071 }, + { -11618399, -14554430, -24321212, 7655128, -1369274, 5214312, -27400540, 10258390, -17646694, -8186692 }, + }, + { + { 11431204, 15823007, 26570245, 14329124, 18029990, 4796082, -31446179, 15580664, 9280358, -3973687 }, + { -160783, -10326257, -22855316, -4304997, -20861367, -13621002, -32810901, -11181622, -15545091, 4387441 }, + { -20799378, 12194512, 3937617, -5805892, -27154820, 9340370, -24513992, 8548137, 20617071, -7482001 }, + }, + { + { -938825, -3930586, -8714311, 16124718, 24603125, -6225393, -13775352, -11875822, 24345683, 10325460 }, + { -19855277, -1568885, -22202708, 8714034, 14007766, 6928528, 16318175, -1010689, 4766743, 3552007 }, + { -21751364, -16730916, 1351763, -803421, -4009670, 3950935, 3217514, 14481909, 10988822, -3994762 }, + }, + { + { 15564307, -14311570, 3101243, 5684148, 30446780, -8051356, 12677127, -6505343, -8295852, 13296005 }, + { -9442290, 6624296, -30298964, -11913677, -4670981, -2057379, 31521204, 9614054, -30000824, 12074674 }, + { 4771191, -135239, 14290749, -13089852, 27992298, 14998318, -1413936, -1556716, 29832613, -16391035 }, + }, + { + { 7064884, -7541174, -19161962, -5067537, -18891269, -2912736, 25825242, 5293297, -27122660, 13101590 }, + { -2298563, 2439670, -7466610, 1719965, -27267541, -16328445, 32512469, -5317593, -30356070, -4190957 }, + { -30006540, 10162316, -33180176, 3981723, -16482138, -13070044, 14413974, 9515896, 19568978, 9628812 }, + }, + { + { 33053803, 199357, 15894591, 1583059, 27380243, -4580435, -17838894, -6106839, -6291786, 3437740 }, + { -18978877, 3884493, 19469877, 12726490, 15913552, 13614290, -22961733, 70104, 7463304, 4176122 }, + { -27124001, 10659917, 11482427, -16070381, 12771467, -6635117, -32719404, -5322751, 24216882, 5944158 }, + }, + { + { 8894125, 7450974, -2664149, -9765752, -28080517, -12389115, 19345746, 14680796, 11632993, 5847885 }, + { 26942781, -2315317, 9129564, -4906607, 26024105, 11769399, -11518837, 6367194, -9727230, 4782140 }, + { 19916461, -4828410, -22910704, -11414391, 25606324, -5972441, 33253853, 8220911, 6358847, -1873857 }, + }, + { + { 801428, -2081702, 16569428, 11065167, 29875704, 96627, 7908388, -4480480, -13538503, 1387155 }, + { 19646058, 5720633, -11416706, 12814209, 11607948, 12749789, 14147075, 15156355, -21866831, 11835260 }, + { 19299512, 1155910, 28703737, 14890794, 2925026, 7269399, 26121523, 15467869, -26560550, 5052483 }, + }, + }, + { + { + { -3017432, 10058206, 1980837, 3964243, 22160966, 12322533, -6431123, -12618185, 12228557, -7003677 }, + { 32944382, 14922211, -22844894, 5188528, 21913450, -8719943, 4001465, 13238564, -6114803, 8653815 }, + { 22865569, -4652735, 27603668, -12545395, 14348958, 8234005, 24808405, 5719875, 28483275, 2841751 }, + }, + { + { -16420968, -1113305, -327719, -12107856, 21886282, -15552774, -1887966, -315658, 19932058, -12739203 }, + { -11656086, 10087521, -8864888, -5536143, -19278573, -3055912, 3999228, 13239134, -4777469, -13910208 }, + { 1382174, -11694719, 17266790, 9194690, -13324356, 9720081, 20403944, 11284705, -14013818, 3093230 }, + }, + { + { 16650921, -11037932, -1064178, 1570629, -8329746, 7352753, -302424, 16271225, -24049421, -6691850 }, + { -21911077, -5927941, -4611316, -5560156, -31744103, -10785293, 24123614, 15193618, -21652117, -16739389 }, + { -9935934, -4289447, -25279823, 4372842, 2087473, 10399484, 31870908, 14690798, 17361620, 11864968 }, + }, + { + { -11307610, 6210372, 13206574, 5806320, -29017692, -13967200, -12331205, -7486601, -25578460, -16240689 }, + { 14668462, -12270235, 26039039, 15305210, 25515617, 4542480, 10453892, 6577524, 9145645, -6443880 }, + { 5974874, 3053895, -9433049, -10385191, -31865124, 3225009, -7972642, 3936128, -5652273, -3050304 }, + }, + { + { 30625386, -4729400, -25555961, -12792866, -20484575, 7695099, 17097188, -16303496, -27999779, 1803632 }, + { -3553091, 9865099, -5228566, 4272701, -5673832, -16689700, 14911344, 12196514, -21405489, 7047412 }, + { 20093277, 9920966, -11138194, -5343857, 13161587, 12044805, -32856851, 4124601, -32343828, -10257566 }, + }, + { + { -20788824, 14084654, -13531713, 7842147, 19119038, -13822605, 4752377, -8714640, -21679658, 2288038 }, + { -26819236, -3283715, 29965059, 3039786, -14473765, 2540457, 29457502, 14625692, -24819617, 12570232 }, + { -1063558, -11551823, 16920318, 12494842, 1278292, -5869109, -21159943, -3498680, -11974704, 4724943 }, + }, + { + { 17960970, -11775534, -4140968, -9702530, -8876562, -1410617, -12907383, -8659932, -29576300, 1903856 }, + { 23134274, -14279132, -10681997, -1611936, 20684485, 15770816, -12989750, 3190296, 26955097, 14109738 }, + { 15308788, 5320727, -30113809, -14318877, 22902008, 7767164, 29425325, -11277562, 31960942, 11934971 }, + }, + { + { -27395711, 8435796, 4109644, 12222639, -24627868, 14818669, 20638173, 4875028, 10491392, 1379718 }, + { -13159415, 9197841, 3875503, -8936108, -1383712, -5879801, 33518459, 16176658, 21432314, 12180697 }, + { -11787308, 11500838, 13787581, -13832590, -22430679, 10140205, 1465425, 12689540, -10301319, -13872883 }, + }, + }, + { + { + { 5414091, -15386041, -21007664, 9643570, 12834970, 1186149, -2622916, -1342231, 26128231, 6032912 }, + { -26337395, -13766162, 32496025, -13653919, 17847801, -12669156, 3604025, 8316894, -25875034, -10437358 }, + { 3296484, 6223048, 24680646, -12246460, -23052020, 5903205, -8862297, -4639164, 12376617, 3188849 }, + }, + { + { 29190488, -14659046, 27549113, -1183516, 3520066, -10697301, 32049515, -7309113, -16109234, -9852307 }, + { -14744486, -9309156, 735818, -598978, -20407687, -5057904, 25246078, -15795669, 18640741, -960977 }, + { -6928835, -16430795, 10361374, 5642961, 4910474, 12345252, -31638386, -494430, 10530747, 1053335 }, + }, + { + { -29265967, -14186805, -13538216, -12117373, -19457059, -10655384, -31462369, -2948985, 24018831, 15026644 }, + { -22592535, -3145277, -2289276, 5953843, -13440189, 9425631, 25310643, 13003497, -2314791, -15145616 }, + { -27419985, -603321, -8043984, -1669117, -26092265, 13987819, -27297622, 187899, -23166419, -2531735 }, + }, + { + { -21744398, -13810475, 1844840, 5021428, -10434399, -15911473, 9716667, 16266922, -5070217, 726099 }, + { 29370922, -6053998, 7334071, -15342259, 9385287, 2247707, -13661962, -4839461, 30007388, -15823341 }, + { -936379, 16086691, 23751945, -543318, -1167538, -5189036, 9137109, 730663, 9835848, 4555336 }, + }, + { + { -23376435, 1410446, -22253753, -12899614, 30867635, 15826977, 17693930, 544696, -11985298, 12422646 }, + { 31117226, -12215734, -13502838, 6561947, -9876867, -12757670, -5118685, -4096706, 29120153, 13924425 }, + { -17400879, -14233209, 19675799, -2734756, -11006962, -5858820, -9383939, -11317700, 7240931, -237388 }, + }, + { + { -31361739, -11346780, -15007447, -5856218, -22453340, -12152771, 1222336, 4389483, 3293637, -15551743 }, + { -16684801, -14444245, 11038544, 11054958, -13801175, -3338533, -24319580, 7733547, 12796905, -6335822 }, + { -8759414, -10817836, -25418864, 10783769, -30615557, -9746811, -28253339, 3647836, 3222231, -11160462 }, + }, + { + { 18606113, 1693100, -25448386, -15170272, 4112353, 10045021, 23603893, -2048234, -7550776, 2484985 }, + { 9255317, -3131197, -12156162, -1004256, 13098013, -9214866, 16377220, -2102812, -19802075, -3034702 }, + { -22729289, 7496160, -5742199, 11329249, 19991973, -3347502, -31718148, 9936966, -30097688, -10618797 }, + }, + { + { 21878590, -5001297, 4338336, 13643897, -3036865, 13160960, 19708896, 5415497, -7360503, -4109293 }, + { 27736861, 10103576, 12500508, 8502413, -3413016, -9633558, 10436918, -1550276, -23659143, -8132100 }, + { 19492550, -12104365, -29681976, -852630, -3208171, 12403437, 30066266, 8367329, 13243957, 8709688 }, + }, + }, + { + { + { 12015105, 2801261, 28198131, 10151021, 24818120, -4743133, -11194191, -5645734, 5150968, 7274186 }, + { 2831366, -12492146, 1478975, 6122054, 23825128, -12733586, 31097299, 6083058, 31021603, -9793610 }, + { -2529932, -2229646, 445613, 10720828, -13849527, -11505937, -23507731, 16354465, 15067285, -14147707 }, + }, + { + { 7840942, 14037873, -33364863, 15934016, -728213, -3642706, 21403988, 1057586, -19379462, -12403220 }, + { 915865, -16469274, 15608285, -8789130, -24357026, 6060030, -17371319, 8410997, -7220461, 16527025 }, + { 32922597, -556987, 20336074, -16184568, 10903705, -5384487, 16957574, 52992, 23834301, 6588044 }, + }, + { + { 32752030, 11232950, 3381995, -8714866, 22652988, -10744103, 17159699, 16689107, -20314580, -1305992 }, + { -4689649, 9166776, -25710296, -10847306, 11576752, 12733943, 7924251, -2752281, 1976123, -7249027 }, + { 21251222, 16309901, -2983015, -6783122, 30810597, 12967303, 156041, -3371252, 12331345, -8237197 }, + }, + { + { 8651614, -4477032, -16085636, -4996994, 13002507, 2950805, 29054427, -5106970, 10008136, -4667901 }, + { 31486080, 15114593, -14261250, 12951354, 14369431, -7387845, 16347321, -13662089, 8684155, -10532952 }, + { 19443825, 11385320, 24468943, -9659068, -23919258, 2187569, -26263207, -6086921, 31316348, 14219878 }, + }, + { + { -28594490, 1193785, 32245219, 11392485, 31092169, 15722801, 27146014, 6992409, 29126555, 9207390 }, + { 32382935, 1110093, 18477781, 11028262, -27411763, -7548111, -4980517, 10843782, -7957600, -14435730 }, + { 2814918, 7836403, 27519878, -7868156, -20894015, -11553689, -21494559, 8550130, 28346258, 1994730 }, + }, + { + { -19578299, 8085545, -14000519, -3948622, 2785838, -16231307, -19516951, 7174894, 22628102, 8115180 }, + { -30405132, 955511, -11133838, -15078069, -32447087, -13278079, -25651578, 3317160, -9943017, 930272 }, + { -15303681, -6833769, 28856490, 1357446, 23421993, 1057177, 24091212, -1388970, -22765376, -10650715 }, + }, + { + { -22751231, -5303997, -12907607, -12768866, -15811511, -7797053, -14839018, -16554220, -1867018, 8398970 }, + { -31969310, 2106403, -4736360, 1362501, 12813763, 16200670, 22981545, -6291273, 18009408, -15772772 }, + { -17220923, -9545221, -27784654, 14166835, 29815394, 7444469, 29551787, -3727419, 19288549, 1325865 }, + }, + { + { 15100157, -15835752, -23923978, -1005098, -26450192, 15509408, 12376730, -3479146, 33166107, -8042750 }, + { 20909231, 13023121, -9209752, 16251778, -5778415, -8094914, 12412151, 10018715, 2213263, -13878373 }, + { 32529814, -11074689, 30361439, -16689753, -9135940, 1513226, 22922121, 6382134, -5766928, 8371348 }, + }, + }, + { + { + { 9923462, 11271500, 12616794, 3544722, -29998368, -1721626, 12891687, -8193132, -26442943, 10486144 }, + { -22597207, -7012665, 8587003, -8257861, 4084309, -12970062, 361726, 2610596, -23921530, -11455195 }, + { 5408411, -1136691, -4969122, 10561668, 24145918, 14240566, 31319731, -4235541, 19985175, -3436086 }, + }, + { + { -13994457, 16616821, 14549246, 3341099, 32155958, 13648976, -17577068, 8849297, 65030, 8370684 }, + { -8320926, -12049626, 31204563, 5839400, -20627288, -1057277, -19442942, 6922164, 12743482, -9800518 }, + { -2361371, 12678785, 28815050, 4759974, -23893047, 4884717, 23783145, 11038569, 18800704, 255233 }, + }, + { + { -5269658, -1773886, 13957886, 7990715, 23132995, 728773, 13393847, 9066957, 19258688, -14753793 }, + { -2936654, -10827535, -10432089, 14516793, -3640786, 4372541, -31934921, 2209390, -1524053, 2055794 }, + { 580882, 16705327, 5468415, -2683018, -30926419, -14696000, -7203346, -8994389, -30021019, 7394435 }, + }, + { + { 23838809, 1822728, -15738443, 15242727, 8318092, -3733104, -21672180, -3492205, -4821741, 14799921 }, + { 13345610, 9759151, 3371034, -16137791, 16353039, 8577942, 31129804, 13496856, -9056018, 7402518 }, + { 2286874, -4435931, -20042458, -2008336, -13696227, 5038122, 11006906, -15760352, 8205061, 1607563 }, + }, + { + { 14414086, -8002132, 3331830, -3208217, 22249151, -5594188, 18364661, -2906958, 30019587, -9029278 }, + { -27688051, 1585953, -10775053, 931069, -29120221, -11002319, -14410829, 12029093, 9944378, 8024 }, + { 4368715, -3709630, 29874200, -15022983, -20230386, -11410704, -16114594, -999085, -8142388, 5640030 }, + }, + { + { 10299610, 13746483, 11661824, 16234854, 7630238, 5998374, 9809887, -16694564, 15219798, -14327783 }, + { 27425505, -5719081, 3055006, 10660664, 23458024, 595578, -15398605, -1173195, -18342183, 9742717 }, + { 6744077, 2427284, 26042789, 2720740, -847906, 1118974, 32324614, 7406442, 12420155, 1994844 }, + }, + { + { 14012521, -5024720, -18384453, -9578469, -26485342, -3936439, -13033478, -10909803, 24319929, -6446333 }, + { 16412690, -4507367, 10772641, 15929391, -17068788, -4658621, 10555945, -10484049, -30102368, -4739048 }, + { 22397382, -7767684, -9293161, -12792868, 17166287, -9755136, -27333065, 6199366, 21880021, -12250760 }, + }, + { + { -4283307, 5368523, -31117018, 8163389, -30323063, 3209128, 16557151, 8890729, 8840445, 4957760 }, + { -15447727, 709327, -6919446, -10870178, -29777922, 6522332, -21720181, 12130072, -14796503, 5005757 }, + { -2114751, -14308128, 23019042, 15765735, -25269683, 6002752, 10183197, -13239326, -16395286, -2176112 }, + }, + }, + { + { + { -19025756, 1632005, 13466291, -7995100, -23640451, 16573537, -32013908, -3057104, 22208662, 2000468 }, + { 3065073, -1412761, -25598674, -361432, -17683065, -5703415, -8164212, 11248527, -3691214, -7414184 }, + { 10379208, -6045554, 8877319, 1473647, -29291284, -12507580, 16690915, 2553332, -3132688, 16400289 }, + }, + { + { 15716668, 1254266, -18472690, 7446274, -8448918, 6344164, -22097271, -7285580, 26894937, 9132066 }, + { 24158887, 12938817, 11085297, -8177598, -28063478, -4457083, -30576463, 64452, -6817084, -2692882 }, + { 13488534, 7794716, 22236231, 5989356, 25426474, -12578208, 2350710, -3418511, -4688006, 2364226 }, + }, + { + { 16335052, 9132434, 25640582, 6678888, 1725628, 8517937, -11807024, -11697457, 15445875, -7798101 }, + { 29004207, -7867081, 28661402, -640412, -12794003, -7943086, 31863255, -4135540, -278050, -15759279 }, + { -6122061, -14866665, -28614905, 14569919, -10857999, -3591829, 10343412, -6976290, -29828287, -10815811 }, + }, + { + { 27081650, 3463984, 14099042, -4517604, 1616303, -6205604, 29542636, 15372179, 17293797, 960709 }, + { 20263915, 11434237, -5765435, 11236810, 13505955, -10857102, -16111345, 6493122, -19384511, 7639714 }, + { -2830798, -14839232, 25403038, -8215196, -8317012, -16173699, 18006287, -16043750, 29994677, -15808121 }, + }, + { + { 9769828, 5202651, -24157398, -13631392, -28051003, -11561624, -24613141, -13860782, -31184575, 709464 }, + { 12286395, 13076066, -21775189, -1176622, -25003198, 4057652, -32018128, -8890874, 16102007, 13205847 }, + { 13733362, 5599946, 10557076, 3195751, -5557991, 8536970, -25540170, 8525972, 10151379, 10394400 }, + }, + { + { 4024660, -16137551, 22436262, 12276534, -9099015, -2686099, 19698229, 11743039, -33302334, 8934414 }, + { -15879800, -4525240, -8580747, -2934061, 14634845, -698278, -9449077, 3137094, -11536886, 11721158 }, + { 17555939, -5013938, 8268606, 2331751, -22738815, 9761013, 9319229, 8835153, -9205489, -1280045 }, + }, + { + { -461409, -7830014, 20614118, 16688288, -7514766, -4807119, 22300304, 505429, 6108462, -6183415 }, + { -5070281, 12367917, -30663534, 3234473, 32617080, -8422642, 29880583, -13483331, -26898490, -7867459 }, + { -31975283, 5726539, 26934134, 10237677, -3173717, -605053, 24199304, 3795095, 7592688, -14992079 }, + }, + { + { 21594432, -14964228, 17466408, -4077222, 32537084, 2739898, 6407723, 12018833, -28256052, 4298412 }, + { -20650503, -11961496, -27236275, 570498, 3767144, -1717540, 13891942, -1569194, 13717174, 10805743 }, + { -14676630, -15644296, 15287174, 11927123, 24177847, -8175568, -796431, 14860609, -26938930, -5863836 }, + }, + }, + { + { + { 12962541, 5311799, -10060768, 11658280, 18855286, -7954201, 13286263, -12808704, -4381056, 9882022 }, + { 18512079, 11319350, -20123124, 15090309, 18818594, 5271736, -22727904, 3666879, -23967430, -3299429 }, + { -6789020, -3146043, 16192429, 13241070, 15898607, -14206114, -10084880, -6661110, -2403099, 5276065 }, + }, + { + { 30169808, -5317648, 26306206, -11750859, 27814964, 7069267, 7152851, 3684982, 1449224, 13082861 }, + { 10342826, 3098505, 2119311, 193222, 25702612, 12233820, 23697382, 15056736, -21016438, -8202000 }, + { -33150110, 3261608, 22745853, 7948688, 19370557, -15177665, -26171976, 6482814, -10300080, -11060101 }, + }, + { + { 32869458, -5408545, 25609743, 15678670, -10687769, -15471071, 26112421, 2521008, -22664288, 6904815 }, + { 29506923, 4457497, 3377935, -9796444, -30510046, 12935080, 1561737, 3841096, -29003639, -6657642 }, + { 10340844, -6630377, -18656632, -2278430, 12621151, -13339055, 30878497, -11824370, -25584551, 5181966 }, + }, + { + { 25940115, -12658025, 17324188, -10307374, -8671468, 15029094, 24396252, -16450922, -2322852, -12388574 }, + { -21765684, 9916823, -1300409, 4079498, -1028346, 11909559, 1782390, 12641087, 20603771, -6561742 }, + { -18882287, -11673380, 24849422, 11501709, 13161720, -4768874, 1925523, 11914390, 4662781, 7820689 }, + }, + { + { 12241050, -425982, 8132691, 9393934, 32846760, -1599620, 29749456, 12172924, 16136752, 15264020 }, + { -10349955, -14680563, -8211979, 2330220, -17662549, -14545780, 10658213, 6671822, 19012087, 3772772 }, + { 3753511, -3421066, 10617074, 2028709, 14841030, -6721664, 28718732, -15762884, 20527771, 12988982 }, + }, + { + { -14822485, -5797269, -3707987, 12689773, -898983, -10914866, -24183046, -10564943, 3299665, -12424953 }, + { -16777703, -15253301, -9642417, 4978983, 3308785, 8755439, 6943197, 6461331, -25583147, 8991218 }, + { -17226263, 1816362, -1673288, -6086439, 31783888, -8175991, -32948145, 7417950, -30242287, 1507265 }, + }, + { + { 29692663, 6829891, -10498800, 4334896, 20945975, -11906496, -28887608, 8209391, 14606362, -10647073 }, + { -3481570, 8707081, 32188102, 5672294, 22096700, 1711240, -33020695, 9761487, 4170404, -2085325 }, + { -11587470, 14855945, -4127778, -1531857, -26649089, 15084046, 22186522, 16002000, -14276837, -8400798 }, + }, + { + { -4811456, 13761029, -31703877, -2483919, -3312471, 7869047, -7113572, -9620092, 13240845, 10965870 }, + { -7742563, -8256762, -14768334, -13656260, -23232383, 12387166, 4498947, 14147411, 29514390, 4302863 }, + { -13413405, -12407859, 20757302, -13801832, 14785143, 8976368, -5061276, -2144373, 17846988, -13971927 }, + }, + }, + { + { + { -2244452, -754728, -4597030, -1066309, -6247172, 1455299, -21647728, -9214789, -5222701, 12650267 }, + { -9906797, -16070310, 21134160, 12198166, -27064575, 708126, 387813, 13770293, -19134326, 10958663 }, + { 22470984, 12369526, 23446014, -5441109, -21520802, -9698723, -11772496, -11574455, -25083830, 4271862 }, + }, + { + { -25169565, -10053642, -19909332, 15361595, -5984358, 2159192, 75375, -4278529, -32526221, 8469673 }, + { 15854970, 4148314, -8893890, 7259002, 11666551, 13824734, -30531198, 2697372, 24154791, -9460943 }, + { 15446137, -15806644, 29759747, 14019369, 30811221, -9610191, -31582008, 12840104, 24913809, 9815020 }, + }, + { + { -4709286, -5614269, -31841498, -12288893, -14443537, 10799414, -9103676, 13438769, 18735128, 9466238 }, + { 11933045, 9281483, 5081055, -5183824, -2628162, -4905629, -7727821, -10896103, -22728655, 16199064 }, + { 14576810, 379472, -26786533, -8317236, -29426508, -10812974, -102766, 1876699, 30801119, 2164795 }, + }, + { + { 15995086, 3199873, 13672555, 13712240, -19378835, -4647646, -13081610, -15496269, -13492807, 1268052 }, + { -10290614, -3659039, -3286592, 10948818, 23037027, 3794475, -3470338, -12600221, -17055369, 3565904 }, + { 29210088, -9419337, -5919792, -4952785, 10834811, -13327726, -16512102, -10820713, -27162222, -14030531 }, + }, + { + { -13161890, 15508588, 16663704, -8156150, -28349942, 9019123, -29183421, -3769423, 2244111, -14001979 }, + { -5152875, -3800936, -9306475, -6071583, 16243069, 14684434, -25673088, -16180800, 13491506, 4641841 }, + { 10813417, 643330, -19188515, -728916, 30292062, -16600078, 27548447, -7721242, 14476989, -12767431 }, + }, + { + { 10292079, 9984945, 6481436, 8279905, -7251514, 7032743, 27282937, -1644259, -27912810, 12651324 }, + { -31185513, -813383, 22271204, 11835308, 10201545, 15351028, 17099662, 3988035, 21721536, -3148940 }, + { 10202177, -6545839, -31373232, -9574638, -32150642, -8119683, -12906320, 3852694, 13216206, 14842320 }, + }, + { + { -15815640, -10601066, -6538952, -7258995, -6984659, -6581778, -31500847, 13765824, -27434397, 9900184 }, + { 14465505, -13833331, -32133984, -14738873, -27443187, 12990492, 33046193, 15796406, -7051866, -8040114 }, + { 30924417, -8279620, 6359016, -12816335, 16508377, 9071735, -25488601, 15413635, 9524356, -7018878 }, + }, + { + { 12274201, -13175547, 32627641, -1785326, 6736625, 13267305, 5237659, -5109483, 15663516, 4035784 }, + { -2951309, 8903985, 17349946, 601635, -16432815, -4612556, -13732739, -15889334, -22258478, 4659091 }, + { -16916263, -4952973, -30393711, -15158821, 20774812, 15897498, 5736189, 15026997, -2178256, -13455585 }, + }, + }, + { + { + { -8858980, -2219056, 28571666, -10155518, -474467, -10105698, -3801496, 278095, 23440562, -290208 }, + { 10226241, -5928702, 15139956, 120818, -14867693, 5218603, 32937275, 11551483, -16571960, -7442864 }, + { 17932739, -12437276, -24039557, 10749060, 11316803, 7535897, 22503767, 5561594, -3646624, 3898661 }, + }, + { + { 7749907, -969567, -16339731, -16464, -25018111, 15122143, -1573531, 7152530, 21831162, 1245233 }, + { 26958459, -14658026, 4314586, 8346991, -5677764, 11960072, -32589295, -620035, -30402091, -16716212 }, + { -12165896, 9166947, 33491384, 13673479, 29787085, 13096535, 6280834, 14587357, -22338025, 13987525 }, + }, + { + { -24349909, 7778775, 21116000, 15572597, -4833266, -5357778, -4300898, -5124639, -7469781, -2858068 }, + { 9681908, -6737123, -31951644, 13591838, -6883821, 386950, 31622781, 6439245, -14581012, 4091397 }, + { -8426427, 1470727, -28109679, -1596990, 3978627, -5123623, -19622683, 12092163, 29077877, -14741988 }, + }, + { + { 5269168, -6859726, -13230211, -8020715, 25932563, 1763552, -5606110, -5505881, -20017847, 2357889 }, + { 32264008, -15407652, -5387735, -1160093, -2091322, -3946900, 23104804, -12869908, 5727338, 189038 }, + { 14609123, -8954470, -6000566, -16622781, -14577387, -7743898, -26745169, 10942115, -25888931, -14884697 }, + }, + { + { 20513500, 5557931, -15604613, 7829531, 26413943, -2019404, -21378968, 7471781, 13913677, -5137875 }, + { -25574376, 11967826, 29233242, 12948236, -6754465, 4713227, -8940970, 14059180, 12878652, 8511905 }, + { -25656801, 3393631, -2955415, -7075526, -2250709, 9366908, -30223418, 6812974, 5568676, -3127656 }, + }, + { + { 11630004, 12144454, 2116339, 13606037, 27378885, 15676917, -17408753, -13504373, -14395196, 8070818 }, + { 27117696, -10007378, -31282771, -5570088, 1127282, 12772488, -29845906, 10483306, -11552749, -1028714 }, + { 10637467, -5688064, 5674781, 1072708, -26343588, -6982302, -1683975, 9177853, -27493162, 15431203 }, + }, + { + { 20525145, 10892566, -12742472, 12779443, -29493034, 16150075, -28240519, 14943142, -15056790, -7935931 }, + { -30024462, 5626926, -551567, -9981087, 753598, 11981191, 25244767, -3239766, -3356550, 9594024 }, + { -23752644, 2636870, -5163910, -10103818, 585134, 7877383, 11345683, -6492290, 13352335, -10977084 }, + }, + { + { -1931799, -5407458, 3304649, -12884869, 17015806, -4877091, -29783850, -7752482, -13215537, -319204 }, + { 20239939, 6607058, 6203985, 3483793, -18386976, -779229, -20723742, 15077870, -22750759, 14523817 }, + { 27406042, -6041657, 27423596, -4497394, 4996214, 10002360, -28842031, -4545494, -30172742, -4805667 }, + }, + }, + { + { + { 11374242, 12660715, 17861383, -12540833, 10935568, 1099227, -13886076, -9091740, -27727044, 11358504 }, + { -12730809, 10311867, 1510375, 10778093, -2119455, -9145702, 32676003, 11149336, -26123651, 4985768 }, + { -19096303, 341147, -6197485, -239033, 15756973, -8796662, -983043, 13794114, -19414307, -15621255 }, + }, + { + { 6490081, 11940286, 25495923, -7726360, 8668373, -8751316, 3367603, 6970005, -1691065, -9004790 }, + { 1656497, 13457317, 15370807, 6364910, 13605745, 8362338, -19174622, -5475723, -16796596, -5031438 }, + { -22273315, -13524424, -64685, -4334223, -18605636, -10921968, -20571065, -7007978, -99853, -10237333 }, + }, + { + { 17747465, 10039260, 19368299, -4050591, -20630635, -16041286, 31992683, -15857976, -29260363, -5511971 }, + { 31932027, -4986141, -19612382, 16366580, 22023614, 88450, 11371999, -3744247, 4882242, -10626905 }, + { 29796507, 37186, 19818052, 10115756, -11829032, 3352736, 18551198, 3272828, -5190932, -4162409 }, + }, + { + { 12501286, 4044383, -8612957, -13392385, -32430052, 5136599, -19230378, -3529697, 330070, -3659409 }, + { 6384877, 2899513, 17807477, 7663917, -2358888, 12363165, 25366522, -8573892, -271295, 12071499 }, + { -8365515, -4042521, 25133448, -4517355, -6211027, 2265927, -32769618, 1936675, -5159697, 3829363 }, + }, + { + { 28425966, -5835433, -577090, -4697198, -14217555, 6870930, 7921550, -6567787, 26333140, 14267664 }, + { -11067219, 11871231, 27385719, -10559544, -4585914, -11189312, 10004786, -8709488, -21761224, 8930324 }, + { -21197785, -16396035, 25654216, -1725397, 12282012, 11008919, 1541940, 4757911, -26491501, -16408940 }, + }, + { + { 13537262, -7759490, -20604840, 10961927, -5922820, -13218065, -13156584, 6217254, -15943699, 13814990 }, + { -17422573, 15157790, 18705543, 29619, 24409717, -260476, 27361681, 9257833, -1956526, -1776914 }, + { -25045300, -10191966, 15366585, 15166509, -13105086, 8423556, -29171540, 12361135, -18685978, 4578290 }, + }, + { + { 24579768, 3711570, 1342322, -11180126, -27005135, 14124956, -22544529, 14074919, 21964432, 8235257 }, + { -6528613, -2411497, 9442966, -5925588, 12025640, -1487420, -2981514, -1669206, 13006806, 2355433 }, + { -16304899, -13605259, -6632427, -5142349, 16974359, -10911083, 27202044, 1719366, 1141648, -12796236 }, + }, + { + { -12863944, -13219986, -8318266, -11018091, -6810145, -4843894, 13475066, -3133972, 32674895, 13715045 }, + { 11423335, -5468059, 32344216, 8962751, 24989809, 9241752, -13265253, 16086212, -28740881, -15642093 }, + { -1409668, 12530728, -6368726, 10847387, 19531186, -14132160, -11709148, 7791794, -27245943, 4383347 }, + }, + }, + { + { + { -28970898, 5271447, -1266009, -9736989, -12455236, 16732599, -4862407, -4906449, 27193557, 6245191 }, + { -15193956, 5362278, -1783893, 2695834, 4960227, 12840725, 23061898, 3260492, 22510453, 8577507 }, + { -12632451, 11257346, -32692994, 13548177, -721004, 10879011, 31168030, 13952092, -29571492, -3635906 }, + }, + { + { 3877321, -9572739, 32416692, 5405324, -11004407, -13656635, 3759769, 11935320, 5611860, 8164018 }, + { -16275802, 14667797, 15906460, 12155291, -22111149, -9039718, 32003002, -8832289, 5773085, -8422109 }, + { -23788118, -8254300, 1950875, 8937633, 18686727, 16459170, -905725, 12376320, 31632953, 190926 }, + }, + { + { -24593607, -16138885, -8423991, 13378746, 14162407, 6901328, -8288749, 4508564, -25341555, -3627528 }, + { 8884438, -5884009, 6023974, 10104341, -6881569, -4941533, 18722941, -14786005, -1672488, 827625 }, + { -32720583, -16289296, -32503547, 7101210, 13354605, 2659080, -1800575, -14108036, -24878478, 1541286 }, + }, + { + { 2901347, -1117687, 3880376, -10059388, -17620940, -3612781, -21802117, -3567481, 20456845, -1885033 }, + { 27019610, 12299467, -13658288, -1603234, -12861660, -4861471, -19540150, -5016058, 29439641, 15138866 }, + { 21536104, -6626420, -32447818, -10690208, -22408077, 5175814, -5420040, -16361163, 7779328, 109896 }, + }, + { + { 30279744, 14648750, -8044871, 6425558, 13639621, -743509, 28698390, 12180118, 23177719, -554075 }, + { 26572847, 3405927, -31701700, 12890905, -19265668, 5335866, -6493768, 2378492, 4439158, -13279347 }, + { -22716706, 3489070, -9225266, -332753, 18875722, -1140095, 14819434, -12731527, -17717757, -5461437 }, + }, + { + { -5056483, 16566551, 15953661, 3767752, -10436499, 15627060, -820954, 2177225, 8550082, -15114165 }, + { -18473302, 16596775, -381660, 15663611, 22860960, 15585581, -27844109, -3582739, -23260460, -8428588 }, + { -32480551, 15707275, -8205912, -5652081, 29464558, 2713815, -22725137, 15860482, -21902570, 1494193 }, + }, + { + { -19562091, -14087393, -25583872, -9299552, 13127842, 759709, 21923482, 16529112, 8742704, 12967017 }, + { -28464899, 1553205, 32536856, -10473729, -24691605, -406174, -8914625, -2933896, -29903758, 15553883 }, + { 21877909, 3230008, 9881174, 10539357, -4797115, 2841332, 11543572, 14513274, 19375923, -12647961 }, + }, + { + { 8832269, -14495485, 13253511, 5137575, 5037871, 4078777, 24880818, -6222716, 2862653, 9455043 }, + { 29306751, 5123106, 20245049, -14149889, 9592566, 8447059, -2077124, -2990080, 15511449, 4789663 }, + { -20679756, 7004547, 8824831, -9434977, -4045704, -3750736, -5754762, 108893, 23513200, 16652362 }, + }, + }, + { + { + { -33256173, 4144782, -4476029, -6579123, 10770039, -7155542, -6650416, -12936300, -18319198, 10212860 }, + { 2756081, 8598110, 7383731, -6859892, 22312759, -1105012, 21179801, 2600940, -9988298, -12506466 }, + { -24645692, 13317462, -30449259, -15653928, 21365574, -10869657, 11344424, 864440, -2499677, -16710063 }, + }, + { + { -26432803, 6148329, -17184412, -14474154, 18782929, -275997, -22561534, 211300, 2719757, 4940997 }, + { -1323882, 3911313, -6948744, 14759765, -30027150, 7851207, 21690126, 8518463, 26699843, 5276295 }, + { -13149873, -6429067, 9396249, 365013, 24703301, -10488939, 1321586, 149635, -15452774, 7159369 }, + }, + { + { 9987780, -3404759, 17507962, 9505530, 9731535, -2165514, 22356009, 8312176, 22477218, -8403385 }, + { 18155857, -16504990, 19744716, 9006923, 15154154, -10538976, 24256460, -4864995, -22548173, 9334109 }, + { 2986088, -4911893, 10776628, -3473844, 10620590, -7083203, -21413845, 14253545, -22587149, 536906 }, + }, + { + { 4377756, 8115836, 24567078, 15495314, 11625074, 13064599, 7390551, 10589625, 10838060, -15420424 }, + { -19342404, 867880, 9277171, -3218459, -14431572, -1986443, 19295826, -15796950, 6378260, 699185 }, + { 7895026, 4057113, -7081772, -13077756, -17886831, -323126, -716039, 15693155, -5045064, -13373962 }, + }, + { + { -7737563, -5869402, -14566319, -7406919, 11385654, 13201616, 31730678, -10962840, -3918636, -9669325 }, + { 10188286, -15770834, -7336361, 13427543, 22223443, 14896287, 30743455, 7116568, -21786507, 5427593 }, + { 696102, 13206899, 27047647, -10632082, 15285305, -9853179, 10798490, -4578720, 19236243, 12477404 }, + }, + { + { -11229439, 11243796, -17054270, -8040865, -788228, -8167967, -3897669, 11180504, -23169516, 7733644 }, + { 17800790, -14036179, -27000429, -11766671, 23887827, 3149671, 23466177, -10538171, 10322027, 15313801 }, + { 26246234, 11968874, 32263343, -5468728, 6830755, -13323031, -15794704, -101982, -24449242, 10890804 }, + }, + { + { -31365647, 10271363, -12660625, -6267268, 16690207, -13062544, -14982212, 16484931, 25180797, -5334884 }, + { -586574, 10376444, -32586414, -11286356, 19801893, 10997610, 2276632, 9482883, 316878, 13820577 }, + { -9882808, -4510367, -2115506, 16457136, -11100081, 11674996, 30756178, -7515054, 30696930, -3712849 }, + }, + { + { 32988917, -9603412, 12499366, 7910787, -10617257, -11931514, -7342816, -9985397, -32349517, 7392473 }, + { -8855661, 15927861, 9866406, -3649411, -2396914, -16655781, -30409476, -9134995, 25112947, -2926644 }, + { -2504044, -436966, 25621774, -5678772, 15085042, -5479877, -24884878, -13526194, 5537438, -13914319 }, + }, + }, + { + { + { -11225584, 2320285, -9584280, 10149187, -33444663, 5808648, -14876251, -1729667, 31234590, 6090599 }, + { -9633316, 116426, 26083934, 2897444, -6364437, -2688086, 609721, 15878753, -6970405, -9034768 }, + { -27757857, 247744, -15194774, -9002551, 23288161, -10011936, -23869595, 6503646, 20650474, 1804084 }, + }, + { + { -27589786, 15456424, 8972517, 8469608, 15640622, 4439847, 3121995, -10329713, 27842616, -202328 }, + { -15306973, 2839644, 22530074, 10026331, 4602058, 5048462, 28248656, 5031932, -11375082, 12714369 }, + { 20807691, -7270825, 29286141, 11421711, -27876523, -13868230, -21227475, 1035546, -19733229, 12796920 }, + }, + { + { 12076899, -14301286, -8785001, -11848922, -25012791, 16400684, -17591495, -12899438, 3480665, -15182815 }, + { -32361549, 5457597, 28548107, 7833186, 7303070, -11953545, -24363064, -15921875, -33374054, 2771025 }, + { -21389266, 421932, 26597266, 6860826, 22486084, -6737172, -17137485, -4210226, -24552282, 15673397 }, + }, + { + { -20184622, 2338216, 19788685, -9620956, -4001265, -8740893, -20271184, 4733254, 3727144, -12934448 }, + { 6120119, 814863, -11794402, -622716, 6812205, -15747771, 2019594, 7975683, 31123697, -10958981 }, + { 30069250, -11435332, 30434654, 2958439, 18399564, -976289, 12296869, 9204260, -16432438, 9648165 }, + }, + { + { 32705432, -1550977, 30705658, 7451065, -11805606, 9631813, 3305266, 5248604, -26008332, -11377501 }, + { 17219865, 2375039, -31570947, -5575615, -19459679, 9219903, 294711, 15298639, 2662509, -16297073 }, + { -1172927, -7558695, -4366770, -4287744, -21346413, -8434326, 32087529, -1222777, 32247248, -14389861 }, + }, + { + { 14312628, 1221556, 17395390, -8700143, -4945741, -8684635, -28197744, -9637817, -16027623, -13378845 }, + { -1428825, -9678990, -9235681, 6549687, -7383069, -468664, 23046502, 9803137, 17597934, 2346211 }, + { 18510800, 15337574, 26171504, 981392, -22241552, 7827556, -23491134, -11323352, 3059833, -11782870 }, + }, + { + { 10141598, 6082907, 17829293, -1947643, 9830092, 13613136, -25556636, -5544586, -33502212, 3592096 }, + { 33114168, -15889352, -26525686, -13343397, 33076705, 8716171, 1151462, 1521897, -982665, -6837803 }, + { -32939165, -4255815, 23947181, -324178, -33072974, -12305637, -16637686, 3891704, 26353178, 693168 }, + }, + { + { 30374239, 1595580, -16884039, 13186931, 4600344, 406904, 9585294, -400668, 31375464, 14369965 }, + { -14370654, -7772529, 1510301, 6434173, -18784789, -6262728, 32732230, -13108839, 17901441, 16011505 }, + { 18171223, -11934626, -12500402, 15197122, -11038147, -15230035, -19172240, -16046376, 8764035, 12309598 }, + }, + }, + { + { + { 5975908, -5243188, -19459362, -9681747, -11541277, 14015782, -23665757, 1228319, 17544096, -10593782 }, + { 5811932, -1715293, 3442887, -2269310, -18367348, -8359541, -18044043, -15410127, -5565381, 12348900 }, + { -31399660, 11407555, 25755363, 6891399, -3256938, 14872274, -24849353, 8141295, -10632534, -585479 }, + }, + { + { -12675304, 694026, -5076145, 13300344, 14015258, -14451394, -9698672, -11329050, 30944593, 1130208 }, + { 8247766, -6710942, -26562381, -7709309, -14401939, -14648910, 4652152, 2488540, 23550156, -271232 }, + { 17294316, -3788438, 7026748, 15626851, 22990044, 113481, 2267737, -5908146, -408818, -137719 }, + }, + { + { 16091085, -16253926, 18599252, 7340678, 2137637, -1221657, -3364161, 14550936, 3260525, -7166271 }, + { -4910104, -13332887, 18550887, 10864893, -16459325, -7291596, -23028869, -13204905, -12748722, 2701326 }, + { -8574695, 16099415, 4629974, -16340524, -20786213, -6005432, -10018363, 9276971, 11329923, 1862132 }, + }, + { + { 14763076, -15903608, -30918270, 3689867, 3511892, 10313526, -21951088, 12219231, -9037963, -940300 }, + { 8894987, -3446094, 6150753, 3013931, 301220, 15693451, -31981216, -2909717, -15438168, 11595570 }, + { 15214962, 3537601, -26238722, -14058872, 4418657, -15230761, 13947276, 10730794, -13489462, -4363670 }, + }, + { + { -2538306, 7682793, 32759013, 263109, -29984731, -7955452, -22332124, -10188635, 977108, 699994 }, + { -12466472, 4195084, -9211532, 550904, -15565337, 12917920, 19118110, -439841, -30534533, -14337913 }, + { 31788461, -14507657, 4799989, 7372237, 8808585, -14747943, 9408237, -10051775, 12493932, -5409317 }, + }, + { + { -25680606, 5260744, -19235809, -6284470, -3695942, 16566087, 27218280, 2607121, 29375955, 6024730 }, + { 842132, -2794693, -4763381, -8722815, 26332018, -12405641, 11831880, 6985184, -9940361, 2854096 }, + { -4847262, -7969331, 2516242, -5847713, 9695691, -7221186, 16512645, 960770, 12121869, 16648078 }, + }, + { + { -15218652, 14667096, -13336229, 2013717, 30598287, -464137, -31504922, -7882064, 20237806, 2838411 }, + { -19288047, 4453152, 15298546, -16178388, 22115043, -15972604, 12544294, -13470457, 1068881, -12499905 }, + { -9558883, -16518835, 33238498, 13506958, 30505848, -1114596, -8486907, -2630053, 12521378, 4845654 }, + }, + { + { -28198521, 10744108, -2958380, 10199664, 7759311, -13088600, 3409348, -873400, -6482306, -12885870 }, + { -23561822, 6230156, -20382013, 10655314, -24040585, -11621172, 10477734, -1240216, -3113227, 13974498 }, + { 12966261, 15550616, -32038948, -1615346, 21025980, -629444, 5642325, 7188737, 18895762, 12629579 }, + }, + }, + { + { + { 14741879, -14946887, 22177208, -11721237, 1279741, 8058600, 11758140, 789443, 32195181, 3895677 }, + { 10758205, 15755439, -4509950, 9243698, -4879422, 6879879, -2204575, -3566119, -8982069, 4429647 }, + { -2453894, 15725973, -20436342, -10410672, -5803908, -11040220, -7135870, -11642895, 18047436, -15281743 }, + }, + { + { -25173001, -11307165, 29759956, 11776784, -22262383, -15820455, 10993114, -12850837, -17620701, -9408468 }, + { 21987233, 700364, -24505048, 14972008, -7774265, -5718395, 32155026, 2581431, -29958985, 8773375 }, + { -25568350, 454463, -13211935, 16126715, 25240068, 8594567, 20656846, 12017935, -7874389, -13920155 }, + }, + { + { 6028182, 6263078, -31011806, -11301710, -818919, 2461772, -31841174, -5468042, -1721788, -2776725 }, + { -12278994, 16624277, 987579, -5922598, 32908203, 1248608, 7719845, -4166698, 28408820, 6816612 }, + { -10358094, -8237829, 19549651, -12169222, 22082623, 16147817, 20613181, 13982702, -10339570, 5067943 }, + }, + { + { -30505967, -3821767, 12074681, 13582412, -19877972, 2443951, -19719286, 12746132, 5331210, -10105944 }, + { 30528811, 3601899, -1957090, 4619785, -27361822, -15436388, 24180793, -12570394, 27679908, -1648928 }, + { 9402404, -13957065, 32834043, 10838634, -26580150, -13237195, 26653274, -8685565, 22611444, -12715406 }, + }, + { + { 22190590, 1118029, 22736441, 15130463, -30460692, -5991321, 19189625, -4648942, 4854859, 6622139 }, + { -8310738, -2953450, -8262579, -3388049, -10401731, -271929, 13424426, -3567227, 26404409, 13001963 }, + { -31241838, -15415700, -2994250, 8939346, 11562230, -12840670, -26064365, -11621720, -15405155, 11020693 }, + }, + { + { 1866042, -7949489, -7898649, -10301010, 12483315, 13477547, 3175636, -12424163, 28761762, 1406734 }, + { -448555, -1777666, 13018551, 3194501, -9580420, -11161737, 24760585, -4347088, 25577411, -13378680 }, + { -24290378, 4759345, -690653, -1852816, 2066747, 10693769, -29595790, 9884936, -9368926, 4745410 }, + }, + { + { -9141284, 6049714, -19531061, -4341411, -31260798, 9944276, -15462008, -11311852, 10931924, -11931931 }, + { -16561513, 14112680, -8012645, 4817318, -8040464, -11414606, -22853429, 10856641, -20470770, 13434654 }, + { 22759489, -10073434, -16766264, -1871422, 13637442, -10168091, 1765144, -12654326, 28445307, -5364710 }, + }, + { + { 29875063, 12493613, 2795536, -3786330, 1710620, 15181182, -10195717, -8788675, 9074234, 1167180 }, + { -26205683, 11014233, -9842651, -2635485, -26908120, 7532294, -18716888, -9535498, 3843903, 9367684 }, + { -10969595, -6403711, 9591134, 9582310, 11349256, 108879, 16235123, 8601684, -139197, 4242895 }, + }, + }, + { + { + { 22092954, -13191123, -2042793, -11968512, 32186753, -11517388, -6574341, 2470660, -27417366, 16625501 }, + { -11057722, 3042016, 13770083, -9257922, 584236, -544855, -7770857, 2602725, -27351616, 14247413 }, + { 6314175, -10264892, -32772502, 15957557, -10157730, 168750, -8618807, 14290061, 27108877, -1180880 }, + }, + { + { -8586597, -7170966, 13241782, 10960156, -32991015, -13794596, 33547976, -11058889, -27148451, 981874 }, + { 22833440, 9293594, -32649448, -13618667, -9136966, 14756819, -22928859, -13970780, -10479804, -16197962 }, + { -7768587, 3326786, -28111797, 10783824, 19178761, 14905060, 22680049, 13906969, -15933690, 3797899 }, + }, + { + { 21721356, -4212746, -12206123, 9310182, -3882239, -13653110, 23740224, -2709232, 20491983, -8042152 }, + { 9209270, -15135055, -13256557, -6167798, -731016, 15289673, 25947805, 15286587, 30997318, -6703063 }, + { 7392032, 16618386, 23946583, -8039892, -13265164, -1533858, -14197445, -2321576, 17649998, -250080 }, + }, + { + { -9301088, -14193827, 30609526, -3049543, -25175069, -1283752, -15241566, -9525724, -2233253, 7662146 }, + { -17558673, 1763594, -33114336, 15908610, -30040870, -12174295, 7335080, -8472199, -3174674, 3440183 }, + { -19889700, -5977008, -24111293, -9688870, 10799743, -16571957, 40450, -4431835, 4862400, 1133 }, + }, + { + { -32856209, -7873957, -5422389, 14860950, -16319031, 7956142, 7258061, 311861, -30594991, -7379421 }, + { -3773428, -1565936, 28985340, 7499440, 24445838, 9325937, 29727763, 16527196, 18278453, 15405622 }, + { -4381906, 8508652, -19898366, -3674424, -5984453, 15149970, -13313598, 843523, -21875062, 13626197 }, + }, + { + { 2281448, -13487055, -10915418, -2609910, 1879358, 16164207, -10783882, 3953792, 13340839, 15928663 }, + { 31727126, -7179855, -18437503, -8283652, 2875793, -16390330, -25269894, -7014826, -23452306, 5964753 }, + { 4100420, -5959452, -17179337, 6017714, -18705837, 12227141, -26684835, 11344144, 2538215, -7570755 }, + }, + { + { -9433605, 6123113, 11159803, -2156608, 30016280, 14966241, -20474983, 1485421, -629256, -15958862 }, + { -26804558, 4260919, 11851389, 9658551, -32017107, 16367492, -20205425, -13191288, 11659922, -11115118 }, + { 26180396, 10015009, -30844224, -8581293, 5418197, 9480663, 2231568, -10170080, 33100372, -1306171 }, + }, + { + { 15121113, -5201871, -10389905, 15427821, -27509937, -15992507, 21670947, 4486675, -5931810, -14466380 }, + { 16166486, -9483733, -11104130, 6023908, -31926798, -1364923, 2340060, -16254968, -10735770, -10039824 }, + { 28042865, -3557089, -12126526, 12259706, -3717498, -6945899, 6766453, -8689599, 18036436, 5803270 }, + }, + }, + { + { + { -817581, 6763912, 11803561, 1585585, 10958447, -2671165, 23855391, 4598332, -6159431, -14117438 }, + { -31031306, -14256194, 17332029, -2383520, 31312682, -5967183, 696309, 50292, -20095739, 11763584 }, + { -594563, -2514283, -32234153, 12643980, 12650761, 14811489, 665117, -12613632, -19773211, -10713562 }, + }, + { + { 30464590, -11262872, -4127476, -12734478, 19835327, -7105613, -24396175, 2075773, -17020157, 992471 }, + { 18357185, -6994433, 7766382, 16342475, -29324918, 411174, 14578841, 8080033, -11574335, -10601610 }, + { 19598397, 10334610, 12555054, 2555664, 18821899, -10339780, 21873263, 16014234, 26224780, 16452269 }, + }, + { + { -30223925, 5145196, 5944548, 16385966, 3976735, 2009897, -11377804, -7618186, -20533829, 3698650 }, + { 14187449, 3448569, -10636236, -10810935, -22663880, -3433596, 7268410, -10890444, 27394301, 12015369 }, + { 19695761, 16087646, 28032085, 12999827, 6817792, 11427614, 20244189, -1312777, -13259127, -3402461 }, + }, + { + { 30860103, 12735208, -1888245, -4699734, -16974906, 2256940, -8166013, 12298312, -8550524, -10393462 }, + { -5719826, -11245325, -1910649, 15569035, 26642876, -7587760, -5789354, -15118654, -4976164, 12651793 }, + { -2848395, 9953421, 11531313, -5282879, 26895123, -12697089, -13118820, -16517902, 9768698, -2533218 }, + }, + { + { -24719459, 1894651, -287698, -4704085, 15348719, -8156530, 32767513, 12765450, 4940095, 10678226 }, + { 18860224, 15980149, -18987240, -1562570, -26233012, -11071856, -7843882, 13944024, -24372348, 16582019 }, + { -15504260, 4970268, -29893044, 4175593, -20993212, -2199756, -11704054, 15444560, -11003761, 7989037 }, + }, + { + { 31490452, 5568061, -2412803, 2182383, -32336847, 4531686, -32078269, 6200206, -19686113, -14800171 }, + { -17308668, -15879940, -31522777, -2831, -32887382, 16375549, 8680158, -16371713, 28550068, -6857132 }, + { -28126887, -5688091, 16837845, -1820458, -6850681, 12700016, -30039981, 4364038, 1155602, 5988841 }, + }, + { + { 21890435, -13272907, -12624011, 12154349, -7831873, 15300496, 23148983, -4470481, 24618407, 8283181 }, + { -33136107, -10512751, 9975416, 6841041, -31559793, 16356536, 3070187, -7025928, 1466169, 10740210 }, + { -1509399, -15488185, -13503385, -10655916, 32799044, 909394, -13938903, -5779719, -32164649, -15327040 }, + }, + { + { 3960823, -14267803, -28026090, -15918051, -19404858, 13146868, 15567327, 951507, -3260321, -573935 }, + { 24740841, 5052253, -30094131, 8961361, 25877428, 6165135, -24368180, 14397372, -7380369, -6144105 }, + { -28888365, 3510803, -28103278, -1158478, -11238128, -10631454, -15441463, -14453128, -1625486, -6494814 }, + }, + }, + { + { + { 793299, -9230478, 8836302, -6235707, -27360908, -2369593, 33152843, -4885251, -9906200, -621852 }, + { 5666233, 525582, 20782575, -8038419, -24538499, 14657740, 16099374, 1468826, -6171428, -15186581 }, + { -4859255, -3779343, -2917758, -6748019, 7778750, 11688288, -30404353, -9871238, -1558923, -9863646 }, + }, + { + { 10896332, -7719704, 824275, 472601, -19460308, 3009587, 25248958, 14783338, -30581476, -15757844 }, + { 10566929, 12612572, -31944212, 11118703, -12633376, 12362879, 21752402, 8822496, 24003793, 14264025 }, + { 27713862, -7355973, -11008240, 9227530, 27050101, 2504721, 23886875, -13117525, 13958495, -5732453 }, + }, + { + { -23481610, 4867226, -27247128, 3900521, 29838369, -8212291, -31889399, -10041781, 7340521, -15410068 }, + { 4646514, -8011124, -22766023, -11532654, 23184553, 8566613, 31366726, -1381061, -15066784, -10375192 }, + { -17270517, 12723032, -16993061, 14878794, 21619651, -6197576, 27584817, 3093888, -8843694, 3849921 }, + }, + { + { -9064912, 2103172, 25561640, -15125738, -5239824, 9582958, 32477045, -9017955, 5002294, -15550259 }, + { -12057553, -11177906, 21115585, -13365155, 8808712, -12030708, 16489530, 13378448, -25845716, 12741426 }, + { -5946367, 10645103, -30911586, 15390284, -3286982, -7118677, 24306472, 15852464, 28834118, -7646072 }, + }, + { + { -17335748, -9107057, -24531279, 9434953, -8472084, -583362, -13090771, 455841, 20461858, 5491305 }, + { 13669248, -16095482, -12481974, -10203039, -14569770, -11893198, -24995986, 11293807, -28588204, -9421832 }, + { 28497928, 6272777, -33022994, 14470570, 8906179, -1225630, 18504674, -14165166, 29867745, -8795943 }, + }, + { + { -16207023, 13517196, -27799630, -13697798, 24009064, -6373891, -6367600, -13175392, 22853429, -4012011 }, + { 24191378, 16712145, -13931797, 15217831, 14542237, 1646131, 18603514, -11037887, 12876623, -2112447 }, + { 17902668, 4518229, -411702, -2829247, 26878217, 5258055, -12860753, 608397, 16031844, 3723494 }, + }, + { + { -28632773, 12763728, -20446446, 7577504, 33001348, -13017745, 17558842, -7872890, 23896954, -4314245 }, + { -20005381, -12011952, 31520464, 605201, 2543521, 5991821, -2945064, 7229064, -9919646, -8826859 }, + { 28816045, 298879, -28165016, -15920938, 19000928, -1665890, -12680833, -2949325, -18051778, -2082915 }, + }, + { + { 16000882, -344896, 3493092, -11447198, -29504595, -13159789, 12577740, 16041268, -19715240, 7847707 }, + { 10151868, 10572098, 27312476, 7922682, 14825339, 4723128, -32855931, -6519018, -10020567, 3852848 }, + { -11430470, 15697596, -21121557, -4420647, 5386314, 15063598, 16514493, -15932110, 29330899, -15076224 }, + }, + }, + { + { + { -25499735, -4378794, -15222908, -6901211, 16615731, 2051784, 3303702, 15490, -27548796, 12314391 }, + { 15683520, -6003043, 18109120, -9980648, 15337968, -5997823, -16717435, 15921866, 16103996, -3731215 }, + { -23169824, -10781249, 13588192, -1628807, -3798557, -1074929, -19273607, 5402699, -29815713, -9841101 }, + }, + { + { 23190676, 2384583, -32714340, 3462154, -29903655, -1529132, -11266856, 8911517, -25205859, 2739713 }, + { 21374101, -3554250, -33524649, 9874411, 15377179, 11831242, -33529904, 6134907, 4931255, 11987849 }, + { -7732, -2978858, -16223486, 7277597, 105524, -322051, -31480539, 13861388, -30076310, 10117930 }, + }, + { + { -29501170, -10744872, -26163768, 13051539, -25625564, 5089643, -6325503, 6704079, 12890019, 15728940 }, + { -21972360, -11771379, -951059, -4418840, 14704840, 2695116, 903376, -10428139, 12885167, 8311031 }, + { -17516482, 5352194, 10384213, -13811658, 7506451, 13453191, 26423267, 4384730, 1888765, -5435404 }, + }, + { + { -25817338, -3107312, -13494599, -3182506, 30896459, -13921729, -32251644, -12707869, -19464434, -3340243 }, + { -23607977, -2665774, -526091, 4651136, 5765089, 4618330, 6092245, 14845197, 17151279, -9854116 }, + { -24830458, -12733720, -15165978, 10367250, -29530908, -265356, 22825805, -7087279, -16866484, 16176525 }, + }, + { + { -23583256, 6564961, 20063689, 3798228, -4740178, 7359225, 2006182, -10363426, -28746253, -10197509 }, + { -10626600, -4486402, -13320562, -5125317, 3432136, -6393229, 23632037, -1940610, 32808310, 1099883 }, + { 15030977, 5768825, -27451236, -2887299, -6427378, -15361371, -15277896, -6809350, 2051441, -15225865 }, + }, + { + { -3362323, -7239372, 7517890, 9824992, 23555850, 295369, 5148398, -14154188, -22686354, 16633660 }, + { 4577086, -16752288, 13249841, -15304328, 19958763, -14537274, 18559670, -10759549, 8402478, -9864273 }, + { -28406330, -1051581, -26790155, -907698, -17212414, -11030789, 9453451, -14980072, 17983010, 9967138 }, + }, + { + { -25762494, 6524722, 26585488, 9969270, 24709298, 1220360, -1677990, 7806337, 17507396, 3651560 }, + { -10420457, -4118111, 14584639, 15971087, -15768321, 8861010, 26556809, -5574557, -18553322, -11357135 }, + { 2839101, 14284142, 4029895, 3472686, 14402957, 12689363, -26642121, 8459447, -5605463, -7621941 }, + }, + { + { -4839289, -3535444, 9744961, 2871048, 25113978, 3187018, -25110813, -849066, 17258084, -7977739 }, + { 18164541, -10595176, -17154882, -1542417, 19237078, -9745295, 23357533, -15217008, 26908270, 12150756 }, + { -30264870, -7647865, 5112249, -7036672, -1499807, -6974257, 43168, -5537701, -32302074, 16215819 }, + }, + }, + { + { + { -6898905, 9824394, -12304779, -4401089, -31397141, -6276835, 32574489, 12532905, -7503072, -8675347 }, + { -27343522, -16515468, -27151524, -10722951, 946346, 16291093, 254968, 7168080, 21676107, -1943028 }, + { 21260961, -8424752, -16831886, -11920822, -23677961, 3968121, -3651949, -6215466, -3556191, -7913075 }, + }, + { + { 16544754, 13250366, -16804428, 15546242, -4583003, 12757258, -2462308, -8680336, -18907032, -9662799 }, + { -2415239, -15577728, 18312303, 4964443, -15272530, -12653564, 26820651, 16690659, 25459437, -4564609 }, + { -25144690, 11425020, 28423002, -11020557, -6144921, -15826224, 9142795, -2391602, -6432418, -1644817 }, + }, + { + { -23104652, 6253476, 16964147, -3768872, -25113972, -12296437, -27457225, -16344658, 6335692, 7249989 }, + { -30333227, 13979675, 7503222, -12368314, -11956721, -4621693, -30272269, 2682242, 25993170, -12478523 }, + { 4364628, 5930691, 32304656, -10044554, -8054781, 15091131, 22857016, -10598955, 31820368, 15075278 }, + }, + { + { 31879134, -8918693, 17258761, 90626, -8041836, -4917709, 24162788, -9650886, -17970238, 12833045 }, + { 19073683, 14851414, -24403169, -11860168, 7625278, 11091125, -19619190, 2074449, -9413939, 14905377 }, + { 24483667, -11935567, -2518866, -11547418, -1553130, 15355506, -25282080, 9253129, 27628530, -7555480 }, + }, + { + { 17597607, 8340603, 19355617, 552187, 26198470, -3176583, 4593324, -9157582, -14110875, 15297016 }, + { 510886, 14337390, -31785257, 16638632, 6328095, 2713355, -20217417, -11864220, 8683221, 2921426 }, + { 18606791, 11874196, 27155355, -5281482, -24031742, 6265446, -25178240, -1278924, 4674690, 13890525 }, + }, + { + { 13609624, 13069022, -27372361, -13055908, 24360586, 9592974, 14977157, 9835105, 4389687, 288396 }, + { 9922506, -519394, 13613107, 5883594, -18758345, -434263, -12304062, 8317628, 23388070, 16052080 }, + { 12720016, 11937594, -31970060, -5028689, 26900120, 8561328, -20155687, -11632979, -14754271, -10812892 }, + }, + { + { 15961858, 14150409, 26716931, -665832, -22794328, 13603569, 11829573, 7467844, -28822128, 929275 }, + { 11038231, -11582396, -27310482, -7316562, -10498527, -16307831, -23479533, -9371869, -21393143, 2465074 }, + { 20017163, -4323226, 27915242, 1529148, 12396362, 15675764, 13817261, -9658066, 2463391, -4622140 }, + }, + { + { -16358878, -12663911, -12065183, 4996454, -1256422, 1073572, 9583558, 12851107, 4003896, 12673717 }, + { -1731589, -15155870, -3262930, 16143082, 19294135, 13385325, 14741514, -9103726, 7903886, 2348101 }, + { 24536016, -16515207, 12715592, -3862155, 1511293, 10047386, -3842346, -7129159, -28377538, 10048127 }, + }, + }, + { + { + { -12622226, -6204820, 30718825, 2591312, -10617028, 12192840, 18873298, -7297090, -32297756, 15221632 }, + { -26478122, -11103864, 11546244, -1852483, 9180880, 7656409, -21343950, 2095755, 29769758, 6593415 }, + { -31994208, -2907461, 4176912, 3264766, 12538965, -868111, 26312345, -6118678, 30958054, 8292160 }, + }, + { + { 31429822, -13959116, 29173532, 15632448, 12174511, -2760094, 32808831, 3977186, 26143136, -3148876 }, + { 22648901, 1402143, -22799984, 13746059, 7936347, 365344, -8668633, -1674433, -3758243, -2304625 }, + { -15491917, 8012313, -2514730, -12702462, -23965846, -10254029, -1612713, -1535569, -16664475, 8194478 }, + }, + { + { 27338066, -7507420, -7414224, 10140405, -19026427, -6589889, 27277191, 8855376, 28572286, 3005164 }, + { 26287124, 4821776, 25476601, -4145903, -3764513, -15788984, -18008582, 1182479, -26094821, -13079595 }, + { -7171154, 3178080, 23970071, 6201893, -17195577, -4489192, -21876275, -13982627, 32208683, -1198248 }, + }, + { + { -16657702, 2817643, -10286362, 14811298, 6024667, 13349505, -27315504, -10497842, -27672585, -11539858 }, + { 15941029, -9405932, -21367050, 8062055, 31876073, -238629, -15278393, -1444429, 15397331, -4130193 }, + { 8934485, -13485467, -23286397, -13423241, -32446090, 14047986, 31170398, -1441021, -27505566, 15087184 }, + }, + { + { -18357243, -2156491, 24524913, -16677868, 15520427, -6360776, -15502406, 11461896, 16788528, -5868942 }, + { -1947386, 16013773, 21750665, 3714552, -17401782, -16055433, -3770287, -10323320, 31322514, -11615635 }, + { 21426655, -5650218, -13648287, -5347537, -28812189, -4920970, -18275391, -14621414, 13040862, -12112948 }, + }, + { + { 11293895, 12478086, -27136401, 15083750, -29307421, 14748872, 14555558, -13417103, 1613711, 4896935 }, + { -25894883, 15323294, -8489791, -8057900, 25967126, -13425460, 2825960, -4897045, -23971776, -11267415 }, + { -15924766, -5229880, -17443532, 6410664, 3622847, 10243618, 20615400, 12405433, -23753030, -8436416 }, + }, + { + { -7091295, 12556208, -20191352, 9025187, -17072479, 4333801, 4378436, 2432030, 23097949, -566018 }, + { 4565804, -16025654, 20084412, -7842817, 1724999, 189254, 24767264, 10103221, -18512313, 2424778 }, + { 366633, -11976806, 8173090, -6890119, 30788634, 5745705, -7168678, 1344109, -3642553, 12412659 }, + }, + { + { -24001791, 7690286, 14929416, -168257, -32210835, -13412986, 24162697, -15326504, -3141501, 11179385 }, + { 18289522, -14724954, 8056945, 16430056, -21729724, 7842514, -6001441, -1486897, -18684645, -11443503 }, + { 476239, 6601091, -6152790, -9723375, 17503545, -4863900, 27672959, 13403813, 11052904, 5219329 }, + }, + }, + { + { + { 20678546, -8375738, -32671898, 8849123, -5009758, 14574752, 31186971, -3973730, 9014762, -8579056 }, + { -13644050, -10350239, -15962508, 5075808, -1514661, -11534600, -33102500, 9160280, 8473550, -3256838 }, + { 24900749, 14435722, 17209120, -15292541, -22592275, 9878983, -7689309, -16335821, -24568481, 11788948 }, + }, + { + { -3118155, -11395194, -13802089, 14797441, 9652448, -6845904, -20037437, 10410733, -24568470, -1458691 }, + { -15659161, 16736706, -22467150, 10215878, -9097177, 7563911, 11871841, -12505194, -18513325, 8464118 }, + { -23400612, 8348507, -14585951, -861714, -3950205, -6373419, 14325289, 8628612, 33313881, -8370517 }, + }, + { + { -20186973, -4967935, 22367356, 5271547, -1097117, -4788838, -24805667, -10236854, -8940735, -5818269 }, + { -6948785, -1795212, -32625683, -16021179, 32635414, -7374245, 15989197, -12838188, 28358192, -4253904 }, + { -23561781, -2799059, -32351682, -1661963, -9147719, 10429267, -16637684, 4072016, -5351664, 5596589 }, + }, + { + { -28236598, -3390048, 12312896, 6213178, 3117142, 16078565, 29266239, 2557221, 1768301, 15373193 }, + { -7243358, -3246960, -4593467, -7553353, -127927, -912245, -1090902, -4504991, -24660491, 3442910 }, + { -30210571, 5124043, 14181784, 8197961, 18964734, -11939093, 22597931, 7176455, -18585478, 13365930 }, + }, + { + { -7877390, -1499958, 8324673, 4690079, 6261860, 890446, 24538107, -8570186, -9689599, -3031667 }, + { 25008904, -10771599, -4305031, -9638010, 16265036, 15721635, 683793, -11823784, 15723479, -15163481 }, + { -9660625, 12374379, -27006999, -7026148, -7724114, -12314514, 11879682, 5400171, 519526, -1235876 }, + }, + { + { 22258397, -16332233, -7869817, 14613016, -22520255, -2950923, -20353881, 7315967, 16648397, 7605640 }, + { -8081308, -8464597, -8223311, 9719710, 19259459, -15348212, 23994942, -5281555, -9468848, 4763278 }, + { -21699244, 9220969, -15730624, 1084137, -25476107, -2852390, 31088447, -7764523, -11356529, 728112 }, + }, + { + { 26047220, -11751471, -6900323, -16521798, 24092068, 9158119, -4273545, -12555558, -29365436, -5498272 }, + { 17510331, -322857, 5854289, 8403524, 17133918, -3112612, -28111007, 12327945, 10750447, 10014012 }, + { -10312768, 3936952, 9156313, -8897683, 16498692, -994647, -27481051, -666732, 3424691, 7540221 }, + }, + { + { 30322361, -6964110, 11361005, -4143317, 7433304, 4989748, -7071422, -16317219, -9244265, 15258046 }, + { 13054562, -2779497, 19155474, 469045, -12482797, 4566042, 5631406, 2711395, 1062915, -5136345 }, + { -19240248, -11254599, -29509029, -7499965, -5835763, 13005411, -6066489, 12194497, 32960380, 1459310 }, + }, + }, + { + { + { 19852034, 7027924, 23669353, 10020366, 8586503, -6657907, 394197, -6101885, 18638003, -11174937 }, + { 31395534, 15098109, 26581030, 8030562, -16527914, -5007134, 9012486, -7584354, -6643087, -5442636 }, + { -9192165, -2347377, -1997099, 4529534, 25766844, 607986, -13222, 9677543, -32294889, -6456008 }, + }, + { + { -2444496, -149937, 29348902, 8186665, 1873760, 12489863, -30934579, -7839692, -7852844, -8138429 }, + { -15236356, -15433509, 7766470, 746860, 26346930, -10221762, -27333451, 10754588, -9431476, 5203576 }, + { 31834314, 14135496, -770007, 5159118, 20917671, -16768096, -7467973, -7337524, 31809243, 7347066 }, + }, + { + { -9606723, -11874240, 20414459, 13033986, 13716524, -11691881, 19797970, -12211255, 15192876, -2087490 }, + { -12663563, -2181719, 1168162, -3804809, 26747877, -14138091, 10609330, 12694420, 33473243, -13382104 }, + { 33184999, 11180355, 15832085, -11385430, -1633671, 225884, 15089336, -11023903, -6135662, 14480053 }, + }, + { + { 31308717, -5619998, 31030840, -1897099, 15674547, -6582883, 5496208, 13685227, 27595050, 8737275 }, + { -20318852, -15150239, 10933843, -16178022, 8335352, -7546022, -31008351, -12610604, 26498114, 66511 }, + { 22644454, -8761729, -16671776, 4884562, -3105614, -13559366, 30540766, -4286747, -13327787, -7515095 }, + }, + { + { -28017847, 9834845, 18617207, -2681312, -3401956, -13307506, 8205540, 13585437, -17127465, 15115439 }, + { 23711543, -672915, 31206561, -8362711, 6164647, -9709987, -33535882, -1426096, 8236921, 16492939 }, + { -23910559, -13515526, -26299483, -4503841, 25005590, -7687270, 19574902, 10071562, 6708380, -6222424 }, + }, + { + { 2101391, -4930054, 19702731, 2367575, -15427167, 1047675, 5301017, 9328700, 29955601, -11678310 }, + { 3096359, 9271816, -21620864, -15521844, -14847996, -7592937, -25892142, -12635595, -9917575, 6216608 }, + { -32615849, 338663, -25195611, 2510422, -29213566, -13820213, 24822830, -6146567, -26767480, 7525079 }, + }, + { + { -23066649, -13985623, 16133487, -7896178, -3389565, 778788, -910336, -2782495, -19386633, 11994101 }, + { 21691500, -13624626, -641331, -14367021, 3285881, -3483596, -25064666, 9718258, -7477437, 13381418 }, + { 18445390, -4202236, 14979846, 11622458, -1727110, -3582980, 23111648, -6375247, 28535282, 15779576 }, + }, + { + { 30098053, 3089662, -9234387, 16662135, -21306940, 11308411, -14068454, 12021730, 9955285, -16303356 }, + { 9734894, -14576830, -7473633, -9138735, 2060392, 11313496, -18426029, 9924399, 20194861, 13380996 }, + { -26378102, -7965207, -22167821, 15789297, -18055342, -6168792, -1984914, 15707771, 26342023, 10146099 }, + }, + }, + { + { + { -26016874, -219943, 21339191, -41388, 19745256, -2878700, -29637280, 2227040, 21612326, -545728 }, + { -13077387, 1184228, 23562814, -5970442, -20351244, -6348714, 25764461, 12243797, -20856566, 11649658 }, + { -10031494, 11262626, 27384172, 2271902, 26947504, -15997771, 39944, 6114064, 33514190, 2333242 }, + }, + { + { -21433588, -12421821, 8119782, 7219913, -21830522, -9016134, -6679750, -12670638, 24350578, -13450001 }, + { -4116307, -11271533, -23886186, 4843615, -30088339, 690623, -31536088, -10406836, 8317860, 12352766 }, + { 18200138, -14475911, -33087759, -2696619, -23702521, -9102511, -23552096, -2287550, 20712163, 6719373 }, + }, + { + { 26656208, 6075253, -7858556, 1886072, -28344043, 4262326, 11117530, -3763210, 26224235, -3297458 }, + { -17168938, -14854097, -3395676, -16369877, -19954045, 14050420, 21728352, 9493610, 18620611, -16428628 }, + { -13323321, 13325349, 11432106, 5964811, 18609221, 6062965, -5269471, -9725556, -30701573, -16479657 }, + }, + { + { -23860538, -11233159, 26961357, 1640861, -32413112, -16737940, 12248509, -5240639, 13735342, 1934062 }, + { 25089769, 6742589, 17081145, -13406266, 21909293, -16067981, -15136294, -3765346, -21277997, 5473616 }, + { 31883677, -7961101, 1083432, -11572403, 22828471, 13290673, -7125085, 12469656, 29111212, -5451014 }, + }, + { + { 24244947, -15050407, -26262976, 2791540, -14997599, 16666678, 24367466, 6388839, -10295587, 452383 }, + { -25640782, -3417841, 5217916, 16224624, 19987036, -4082269, -24236251, -5915248, 15766062, 8407814 }, + { -20406999, 13990231, 15495425, 16395525, 5377168, 15166495, -8917023, -4388953, -8067909, 2276718 }, + }, + { + { 30157918, 12924066, -17712050, 9245753, 19895028, 3368142, -23827587, 5096219, 22740376, -7303417 }, + { 2041139, -14256350, 7783687, 13876377, -25946985, -13352459, 24051124, 13742383, -15637599, 13295222 }, + { 33338237, -8505733, 12532113, 7977527, 9106186, -1715251, -17720195, -4612972, -4451357, -14669444 }, + }, + { + { -20045281, 5454097, -14346548, 6447146, 28862071, 1883651, -2469266, -4141880, 7770569, 9620597 }, + { 23208068, 7979712, 33071466, 8149229, 1758231, -10834995, 30945528, -1694323, -33502340, -14767970 }, + { 1439958, -16270480, -1079989, -793782, 4625402, 10647766, -5043801, 1220118, 30494170, -11440799 }, + }, + { + { -5037580, -13028295, -2970559, -3061767, 15640974, -6701666, -26739026, 926050, -1684339, -13333647 }, + { 13908495, -3549272, 30919928, -6273825, -21521863, 7989039, 9021034, 9078865, 3353509, 4033511 }, + { -29663431, -15113610, 32259991, -344482, 24295849, -12912123, 23161163, 8839127, 27485041, 7356032 }, + }, + }, + { + { + { 9661027, 705443, 11980065, -5370154, -1628543, 14661173, -6346142, 2625015, 28431036, -16771834 }, + { -23839233, -8311415, -25945511, 7480958, -17681669, -8354183, -22545972, 14150565, 15970762, 4099461 }, + { 29262576, 16756590, 26350592, -8793563, 8529671, -11208050, 13617293, -9937143, 11465739, 8317062 }, + }, + { + { -25493081, -6962928, 32500200, -9419051, -23038724, -2302222, 14898637, 3848455, 20969334, -5157516 }, + { -20384450, -14347713, -18336405, 13884722, -33039454, 2842114, -21610826, -3649888, 11177095, 14989547 }, + { -24496721, -11716016, 16959896, 2278463, 12066309, 10137771, 13515641, 2581286, -28487508, 9930240 }, + }, + { + { -17751622, -2097826, 16544300, -13009300, -15914807, -14949081, 18345767, -13403753, 16291481, -5314038 }, + { -33229194, 2553288, 32678213, 9875984, 8534129, 6889387, -9676774, 6957617, 4368891, 9788741 }, + { 16660756, 7281060, -10830758, 12911820, 20108584, -8101676, -21722536, -8613148, 16250552, -11111103 }, + }, + { + { -19765507, 2390526, -16551031, 14161980, 1905286, 6414907, 4689584, 10604807, -30190403, 4782747 }, + { -1354539, 14736941, -7367442, -13292886, 7710542, -14155590, -9981571, 4383045, 22546403, 437323 }, + { 31665577, -12180464, -16186830, 1491339, -18368625, 3294682, 27343084, 2786261, -30633590, -14097016 }, + }, + { + { -14467279, -683715, -33374107, 7448552, 19294360, 14334329, -19690631, 2355319, -19284671, -6114373 }, + { 15121312, -15796162, 6377020, -6031361, -10798111, -12957845, 18952177, 15496498, -29380133, 11754228 }, + { -2637277, -13483075, 8488727, -14303896, 12728761, -1622493, 7141596, 11724556, 22761615, -10134141 }, + }, + { + { 16918416, 11729663, -18083579, 3022987, -31015732, -13339659, -28741185, -12227393, 32851222, 11717399 }, + { 11166634, 7338049, -6722523, 4531520, -29468672, -7302055, 31474879, 3483633, -1193175, -4030831 }, + { -185635, 9921305, 31456609, -13536438, -12013818, 13348923, 33142652, 6546660, -19985279, -3948376 }, + }, + { + { -32460596, 11266712, -11197107, -7899103, 31703694, 3855903, -8537131, -12833048, -30772034, -15486313 }, + { -18006477, 12709068, 3991746, -6479188, -21491523, -10550425, -31135347, -16049879, 10928917, 3011958 }, + { -6957757, -15594337, 31696059, 334240, 29576716, 14796075, -30831056, -12805180, 18008031, 10258577 }, + }, + { + { -22448644, 15655569, 7018479, -4410003, -30314266, -1201591, -1853465, 1367120, 25127874, 6671743 }, + { 29701166, -14373934, -10878120, 9279288, -17568, 13127210, 21382910, 11042292, 25838796, 4642684 }, + { -20430234, 14955537, -24126347, 8124619, -5369288, -5990470, 30468147, -13900640, 18423289, 4177476 }, + }, + }, +}; diff --git a/src/cryptoconditions/src/include/ed25519/src/sc.c b/src/cryptoconditions/src/include/ed25519/src/sc.c new file mode 100644 index 000000000..ca5bad2ca --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/src/sc.c @@ -0,0 +1,809 @@ +#include "fixedint.h" +#include "sc.h" + +static uint64_t load_3(const unsigned char *in) { + uint64_t result; + + result = (uint64_t) in[0]; + result |= ((uint64_t) in[1]) << 8; + result |= ((uint64_t) in[2]) << 16; + + return result; +} + +static uint64_t load_4(const unsigned char *in) { + uint64_t result; + + result = (uint64_t) in[0]; + result |= ((uint64_t) in[1]) << 8; + result |= ((uint64_t) in[2]) << 16; + result |= ((uint64_t) in[3]) << 24; + + return result; +} + +/* +Input: + s[0]+256*s[1]+...+256^63*s[63] = s + +Output: + s[0]+256*s[1]+...+256^31*s[31] = s mod l + where l = 2^252 + 27742317777372353535851937790883648493. + Overwrites s in place. +*/ + +void sc_reduce(unsigned char *s) { + int64_t s0 = 2097151 & load_3(s); + int64_t s1 = 2097151 & (load_4(s + 2) >> 5); + int64_t s2 = 2097151 & (load_3(s + 5) >> 2); + int64_t s3 = 2097151 & (load_4(s + 7) >> 7); + int64_t s4 = 2097151 & (load_4(s + 10) >> 4); + int64_t s5 = 2097151 & (load_3(s + 13) >> 1); + int64_t s6 = 2097151 & (load_4(s + 15) >> 6); + int64_t s7 = 2097151 & (load_3(s + 18) >> 3); + int64_t s8 = 2097151 & load_3(s + 21); + int64_t s9 = 2097151 & (load_4(s + 23) >> 5); + int64_t s10 = 2097151 & (load_3(s + 26) >> 2); + int64_t s11 = 2097151 & (load_4(s + 28) >> 7); + int64_t s12 = 2097151 & (load_4(s + 31) >> 4); + int64_t s13 = 2097151 & (load_3(s + 34) >> 1); + int64_t s14 = 2097151 & (load_4(s + 36) >> 6); + int64_t s15 = 2097151 & (load_3(s + 39) >> 3); + int64_t s16 = 2097151 & load_3(s + 42); + int64_t s17 = 2097151 & (load_4(s + 44) >> 5); + int64_t s18 = 2097151 & (load_3(s + 47) >> 2); + int64_t s19 = 2097151 & (load_4(s + 49) >> 7); + int64_t s20 = 2097151 & (load_4(s + 52) >> 4); + int64_t s21 = 2097151 & (load_3(s + 55) >> 1); + int64_t s22 = 2097151 & (load_4(s + 57) >> 6); + int64_t s23 = (load_4(s + 60) >> 3); + int64_t carry0; + int64_t carry1; + int64_t carry2; + int64_t carry3; + int64_t carry4; + int64_t carry5; + int64_t carry6; + int64_t carry7; + int64_t carry8; + int64_t carry9; + int64_t carry10; + int64_t carry11; + int64_t carry12; + int64_t carry13; + int64_t carry14; + int64_t carry15; + int64_t carry16; + + s11 += s23 * 666643; + s12 += s23 * 470296; + s13 += s23 * 654183; + s14 -= s23 * 997805; + s15 += s23 * 136657; + s16 -= s23 * 683901; + s23 = 0; + s10 += s22 * 666643; + s11 += s22 * 470296; + s12 += s22 * 654183; + s13 -= s22 * 997805; + s14 += s22 * 136657; + s15 -= s22 * 683901; + s22 = 0; + s9 += s21 * 666643; + s10 += s21 * 470296; + s11 += s21 * 654183; + s12 -= s21 * 997805; + s13 += s21 * 136657; + s14 -= s21 * 683901; + s21 = 0; + s8 += s20 * 666643; + s9 += s20 * 470296; + s10 += s20 * 654183; + s11 -= s20 * 997805; + s12 += s20 * 136657; + s13 -= s20 * 683901; + s20 = 0; + s7 += s19 * 666643; + s8 += s19 * 470296; + s9 += s19 * 654183; + s10 -= s19 * 997805; + s11 += s19 * 136657; + s12 -= s19 * 683901; + s19 = 0; + s6 += s18 * 666643; + s7 += s18 * 470296; + s8 += s18 * 654183; + s9 -= s18 * 997805; + s10 += s18 * 136657; + s11 -= s18 * 683901; + s18 = 0; + carry6 = (s6 + (1 << 20)) >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry8 = (s8 + (1 << 20)) >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry10 = (s10 + (1 << 20)) >> 21; + s11 += carry10; + s10 -= carry10 << 21; + carry12 = (s12 + (1 << 20)) >> 21; + s13 += carry12; + s12 -= carry12 << 21; + carry14 = (s14 + (1 << 20)) >> 21; + s15 += carry14; + s14 -= carry14 << 21; + carry16 = (s16 + (1 << 20)) >> 21; + s17 += carry16; + s16 -= carry16 << 21; + carry7 = (s7 + (1 << 20)) >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry9 = (s9 + (1 << 20)) >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry11 = (s11 + (1 << 20)) >> 21; + s12 += carry11; + s11 -= carry11 << 21; + carry13 = (s13 + (1 << 20)) >> 21; + s14 += carry13; + s13 -= carry13 << 21; + carry15 = (s15 + (1 << 20)) >> 21; + s16 += carry15; + s15 -= carry15 << 21; + s5 += s17 * 666643; + s6 += s17 * 470296; + s7 += s17 * 654183; + s8 -= s17 * 997805; + s9 += s17 * 136657; + s10 -= s17 * 683901; + s17 = 0; + s4 += s16 * 666643; + s5 += s16 * 470296; + s6 += s16 * 654183; + s7 -= s16 * 997805; + s8 += s16 * 136657; + s9 -= s16 * 683901; + s16 = 0; + s3 += s15 * 666643; + s4 += s15 * 470296; + s5 += s15 * 654183; + s6 -= s15 * 997805; + s7 += s15 * 136657; + s8 -= s15 * 683901; + s15 = 0; + s2 += s14 * 666643; + s3 += s14 * 470296; + s4 += s14 * 654183; + s5 -= s14 * 997805; + s6 += s14 * 136657; + s7 -= s14 * 683901; + s14 = 0; + s1 += s13 * 666643; + s2 += s13 * 470296; + s3 += s13 * 654183; + s4 -= s13 * 997805; + s5 += s13 * 136657; + s6 -= s13 * 683901; + s13 = 0; + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + carry0 = (s0 + (1 << 20)) >> 21; + s1 += carry0; + s0 -= carry0 << 21; + carry2 = (s2 + (1 << 20)) >> 21; + s3 += carry2; + s2 -= carry2 << 21; + carry4 = (s4 + (1 << 20)) >> 21; + s5 += carry4; + s4 -= carry4 << 21; + carry6 = (s6 + (1 << 20)) >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry8 = (s8 + (1 << 20)) >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry10 = (s10 + (1 << 20)) >> 21; + s11 += carry10; + s10 -= carry10 << 21; + carry1 = (s1 + (1 << 20)) >> 21; + s2 += carry1; + s1 -= carry1 << 21; + carry3 = (s3 + (1 << 20)) >> 21; + s4 += carry3; + s3 -= carry3 << 21; + carry5 = (s5 + (1 << 20)) >> 21; + s6 += carry5; + s5 -= carry5 << 21; + carry7 = (s7 + (1 << 20)) >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry9 = (s9 + (1 << 20)) >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry11 = (s11 + (1 << 20)) >> 21; + s12 += carry11; + s11 -= carry11 << 21; + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + carry0 = s0 >> 21; + s1 += carry0; + s0 -= carry0 << 21; + carry1 = s1 >> 21; + s2 += carry1; + s1 -= carry1 << 21; + carry2 = s2 >> 21; + s3 += carry2; + s2 -= carry2 << 21; + carry3 = s3 >> 21; + s4 += carry3; + s3 -= carry3 << 21; + carry4 = s4 >> 21; + s5 += carry4; + s4 -= carry4 << 21; + carry5 = s5 >> 21; + s6 += carry5; + s5 -= carry5 << 21; + carry6 = s6 >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry7 = s7 >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry8 = s8 >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry9 = s9 >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry10 = s10 >> 21; + s11 += carry10; + s10 -= carry10 << 21; + carry11 = s11 >> 21; + s12 += carry11; + s11 -= carry11 << 21; + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + carry0 = s0 >> 21; + s1 += carry0; + s0 -= carry0 << 21; + carry1 = s1 >> 21; + s2 += carry1; + s1 -= carry1 << 21; + carry2 = s2 >> 21; + s3 += carry2; + s2 -= carry2 << 21; + carry3 = s3 >> 21; + s4 += carry3; + s3 -= carry3 << 21; + carry4 = s4 >> 21; + s5 += carry4; + s4 -= carry4 << 21; + carry5 = s5 >> 21; + s6 += carry5; + s5 -= carry5 << 21; + carry6 = s6 >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry7 = s7 >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry8 = s8 >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry9 = s9 >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry10 = s10 >> 21; + s11 += carry10; + s10 -= carry10 << 21; + + s[0] = (unsigned char) (s0 >> 0); + s[1] = (unsigned char) (s0 >> 8); + s[2] = (unsigned char) ((s0 >> 16) | (s1 << 5)); + s[3] = (unsigned char) (s1 >> 3); + s[4] = (unsigned char) (s1 >> 11); + s[5] = (unsigned char) ((s1 >> 19) | (s2 << 2)); + s[6] = (unsigned char) (s2 >> 6); + s[7] = (unsigned char) ((s2 >> 14) | (s3 << 7)); + s[8] = (unsigned char) (s3 >> 1); + s[9] = (unsigned char) (s3 >> 9); + s[10] = (unsigned char) ((s3 >> 17) | (s4 << 4)); + s[11] = (unsigned char) (s4 >> 4); + s[12] = (unsigned char) (s4 >> 12); + s[13] = (unsigned char) ((s4 >> 20) | (s5 << 1)); + s[14] = (unsigned char) (s5 >> 7); + s[15] = (unsigned char) ((s5 >> 15) | (s6 << 6)); + s[16] = (unsigned char) (s6 >> 2); + s[17] = (unsigned char) (s6 >> 10); + s[18] = (unsigned char) ((s6 >> 18) | (s7 << 3)); + s[19] = (unsigned char) (s7 >> 5); + s[20] = (unsigned char) (s7 >> 13); + s[21] = (unsigned char) (s8 >> 0); + s[22] = (unsigned char) (s8 >> 8); + s[23] = (unsigned char) ((s8 >> 16) | (s9 << 5)); + s[24] = (unsigned char) (s9 >> 3); + s[25] = (unsigned char) (s9 >> 11); + s[26] = (unsigned char) ((s9 >> 19) | (s10 << 2)); + s[27] = (unsigned char) (s10 >> 6); + s[28] = (unsigned char) ((s10 >> 14) | (s11 << 7)); + s[29] = (unsigned char) (s11 >> 1); + s[30] = (unsigned char) (s11 >> 9); + s[31] = (unsigned char) (s11 >> 17); +} + + + +/* +Input: + a[0]+256*a[1]+...+256^31*a[31] = a + b[0]+256*b[1]+...+256^31*b[31] = b + c[0]+256*c[1]+...+256^31*c[31] = c + +Output: + s[0]+256*s[1]+...+256^31*s[31] = (ab+c) mod l + where l = 2^252 + 27742317777372353535851937790883648493. +*/ + +void sc_muladd(unsigned char *s, const unsigned char *a, const unsigned char *b, const unsigned char *c) { + int64_t a0 = 2097151 & load_3(a); + int64_t a1 = 2097151 & (load_4(a + 2) >> 5); + int64_t a2 = 2097151 & (load_3(a + 5) >> 2); + int64_t a3 = 2097151 & (load_4(a + 7) >> 7); + int64_t a4 = 2097151 & (load_4(a + 10) >> 4); + int64_t a5 = 2097151 & (load_3(a + 13) >> 1); + int64_t a6 = 2097151 & (load_4(a + 15) >> 6); + int64_t a7 = 2097151 & (load_3(a + 18) >> 3); + int64_t a8 = 2097151 & load_3(a + 21); + int64_t a9 = 2097151 & (load_4(a + 23) >> 5); + int64_t a10 = 2097151 & (load_3(a + 26) >> 2); + int64_t a11 = (load_4(a + 28) >> 7); + int64_t b0 = 2097151 & load_3(b); + int64_t b1 = 2097151 & (load_4(b + 2) >> 5); + int64_t b2 = 2097151 & (load_3(b + 5) >> 2); + int64_t b3 = 2097151 & (load_4(b + 7) >> 7); + int64_t b4 = 2097151 & (load_4(b + 10) >> 4); + int64_t b5 = 2097151 & (load_3(b + 13) >> 1); + int64_t b6 = 2097151 & (load_4(b + 15) >> 6); + int64_t b7 = 2097151 & (load_3(b + 18) >> 3); + int64_t b8 = 2097151 & load_3(b + 21); + int64_t b9 = 2097151 & (load_4(b + 23) >> 5); + int64_t b10 = 2097151 & (load_3(b + 26) >> 2); + int64_t b11 = (load_4(b + 28) >> 7); + int64_t c0 = 2097151 & load_3(c); + int64_t c1 = 2097151 & (load_4(c + 2) >> 5); + int64_t c2 = 2097151 & (load_3(c + 5) >> 2); + int64_t c3 = 2097151 & (load_4(c + 7) >> 7); + int64_t c4 = 2097151 & (load_4(c + 10) >> 4); + int64_t c5 = 2097151 & (load_3(c + 13) >> 1); + int64_t c6 = 2097151 & (load_4(c + 15) >> 6); + int64_t c7 = 2097151 & (load_3(c + 18) >> 3); + int64_t c8 = 2097151 & load_3(c + 21); + int64_t c9 = 2097151 & (load_4(c + 23) >> 5); + int64_t c10 = 2097151 & (load_3(c + 26) >> 2); + int64_t c11 = (load_4(c + 28) >> 7); + int64_t s0; + int64_t s1; + int64_t s2; + int64_t s3; + int64_t s4; + int64_t s5; + int64_t s6; + int64_t s7; + int64_t s8; + int64_t s9; + int64_t s10; + int64_t s11; + int64_t s12; + int64_t s13; + int64_t s14; + int64_t s15; + int64_t s16; + int64_t s17; + int64_t s18; + int64_t s19; + int64_t s20; + int64_t s21; + int64_t s22; + int64_t s23; + int64_t carry0; + int64_t carry1; + int64_t carry2; + int64_t carry3; + int64_t carry4; + int64_t carry5; + int64_t carry6; + int64_t carry7; + int64_t carry8; + int64_t carry9; + int64_t carry10; + int64_t carry11; + int64_t carry12; + int64_t carry13; + int64_t carry14; + int64_t carry15; + int64_t carry16; + int64_t carry17; + int64_t carry18; + int64_t carry19; + int64_t carry20; + int64_t carry21; + int64_t carry22; + + s0 = c0 + a0 * b0; + s1 = c1 + a0 * b1 + a1 * b0; + s2 = c2 + a0 * b2 + a1 * b1 + a2 * b0; + s3 = c3 + a0 * b3 + a1 * b2 + a2 * b1 + a3 * b0; + s4 = c4 + a0 * b4 + a1 * b3 + a2 * b2 + a3 * b1 + a4 * b0; + s5 = c5 + a0 * b5 + a1 * b4 + a2 * b3 + a3 * b2 + a4 * b1 + a5 * b0; + s6 = c6 + a0 * b6 + a1 * b5 + a2 * b4 + a3 * b3 + a4 * b2 + a5 * b1 + a6 * b0; + s7 = c7 + a0 * b7 + a1 * b6 + a2 * b5 + a3 * b4 + a4 * b3 + a5 * b2 + a6 * b1 + a7 * b0; + s8 = c8 + a0 * b8 + a1 * b7 + a2 * b6 + a3 * b5 + a4 * b4 + a5 * b3 + a6 * b2 + a7 * b1 + a8 * b0; + s9 = c9 + a0 * b9 + a1 * b8 + a2 * b7 + a3 * b6 + a4 * b5 + a5 * b4 + a6 * b3 + a7 * b2 + a8 * b1 + a9 * b0; + s10 = c10 + a0 * b10 + a1 * b9 + a2 * b8 + a3 * b7 + a4 * b6 + a5 * b5 + a6 * b4 + a7 * b3 + a8 * b2 + a9 * b1 + a10 * b0; + s11 = c11 + a0 * b11 + a1 * b10 + a2 * b9 + a3 * b8 + a4 * b7 + a5 * b6 + a6 * b5 + a7 * b4 + a8 * b3 + a9 * b2 + a10 * b1 + a11 * b0; + s12 = a1 * b11 + a2 * b10 + a3 * b9 + a4 * b8 + a5 * b7 + a6 * b6 + a7 * b5 + a8 * b4 + a9 * b3 + a10 * b2 + a11 * b1; + s13 = a2 * b11 + a3 * b10 + a4 * b9 + a5 * b8 + a6 * b7 + a7 * b6 + a8 * b5 + a9 * b4 + a10 * b3 + a11 * b2; + s14 = a3 * b11 + a4 * b10 + a5 * b9 + a6 * b8 + a7 * b7 + a8 * b6 + a9 * b5 + a10 * b4 + a11 * b3; + s15 = a4 * b11 + a5 * b10 + a6 * b9 + a7 * b8 + a8 * b7 + a9 * b6 + a10 * b5 + a11 * b4; + s16 = a5 * b11 + a6 * b10 + a7 * b9 + a8 * b8 + a9 * b7 + a10 * b6 + a11 * b5; + s17 = a6 * b11 + a7 * b10 + a8 * b9 + a9 * b8 + a10 * b7 + a11 * b6; + s18 = a7 * b11 + a8 * b10 + a9 * b9 + a10 * b8 + a11 * b7; + s19 = a8 * b11 + a9 * b10 + a10 * b9 + a11 * b8; + s20 = a9 * b11 + a10 * b10 + a11 * b9; + s21 = a10 * b11 + a11 * b10; + s22 = a11 * b11; + s23 = 0; + carry0 = (s0 + (1 << 20)) >> 21; + s1 += carry0; + s0 -= carry0 << 21; + carry2 = (s2 + (1 << 20)) >> 21; + s3 += carry2; + s2 -= carry2 << 21; + carry4 = (s4 + (1 << 20)) >> 21; + s5 += carry4; + s4 -= carry4 << 21; + carry6 = (s6 + (1 << 20)) >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry8 = (s8 + (1 << 20)) >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry10 = (s10 + (1 << 20)) >> 21; + s11 += carry10; + s10 -= carry10 << 21; + carry12 = (s12 + (1 << 20)) >> 21; + s13 += carry12; + s12 -= carry12 << 21; + carry14 = (s14 + (1 << 20)) >> 21; + s15 += carry14; + s14 -= carry14 << 21; + carry16 = (s16 + (1 << 20)) >> 21; + s17 += carry16; + s16 -= carry16 << 21; + carry18 = (s18 + (1 << 20)) >> 21; + s19 += carry18; + s18 -= carry18 << 21; + carry20 = (s20 + (1 << 20)) >> 21; + s21 += carry20; + s20 -= carry20 << 21; + carry22 = (s22 + (1 << 20)) >> 21; + s23 += carry22; + s22 -= carry22 << 21; + carry1 = (s1 + (1 << 20)) >> 21; + s2 += carry1; + s1 -= carry1 << 21; + carry3 = (s3 + (1 << 20)) >> 21; + s4 += carry3; + s3 -= carry3 << 21; + carry5 = (s5 + (1 << 20)) >> 21; + s6 += carry5; + s5 -= carry5 << 21; + carry7 = (s7 + (1 << 20)) >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry9 = (s9 + (1 << 20)) >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry11 = (s11 + (1 << 20)) >> 21; + s12 += carry11; + s11 -= carry11 << 21; + carry13 = (s13 + (1 << 20)) >> 21; + s14 += carry13; + s13 -= carry13 << 21; + carry15 = (s15 + (1 << 20)) >> 21; + s16 += carry15; + s15 -= carry15 << 21; + carry17 = (s17 + (1 << 20)) >> 21; + s18 += carry17; + s17 -= carry17 << 21; + carry19 = (s19 + (1 << 20)) >> 21; + s20 += carry19; + s19 -= carry19 << 21; + carry21 = (s21 + (1 << 20)) >> 21; + s22 += carry21; + s21 -= carry21 << 21; + s11 += s23 * 666643; + s12 += s23 * 470296; + s13 += s23 * 654183; + s14 -= s23 * 997805; + s15 += s23 * 136657; + s16 -= s23 * 683901; + s23 = 0; + s10 += s22 * 666643; + s11 += s22 * 470296; + s12 += s22 * 654183; + s13 -= s22 * 997805; + s14 += s22 * 136657; + s15 -= s22 * 683901; + s22 = 0; + s9 += s21 * 666643; + s10 += s21 * 470296; + s11 += s21 * 654183; + s12 -= s21 * 997805; + s13 += s21 * 136657; + s14 -= s21 * 683901; + s21 = 0; + s8 += s20 * 666643; + s9 += s20 * 470296; + s10 += s20 * 654183; + s11 -= s20 * 997805; + s12 += s20 * 136657; + s13 -= s20 * 683901; + s20 = 0; + s7 += s19 * 666643; + s8 += s19 * 470296; + s9 += s19 * 654183; + s10 -= s19 * 997805; + s11 += s19 * 136657; + s12 -= s19 * 683901; + s19 = 0; + s6 += s18 * 666643; + s7 += s18 * 470296; + s8 += s18 * 654183; + s9 -= s18 * 997805; + s10 += s18 * 136657; + s11 -= s18 * 683901; + s18 = 0; + carry6 = (s6 + (1 << 20)) >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry8 = (s8 + (1 << 20)) >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry10 = (s10 + (1 << 20)) >> 21; + s11 += carry10; + s10 -= carry10 << 21; + carry12 = (s12 + (1 << 20)) >> 21; + s13 += carry12; + s12 -= carry12 << 21; + carry14 = (s14 + (1 << 20)) >> 21; + s15 += carry14; + s14 -= carry14 << 21; + carry16 = (s16 + (1 << 20)) >> 21; + s17 += carry16; + s16 -= carry16 << 21; + carry7 = (s7 + (1 << 20)) >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry9 = (s9 + (1 << 20)) >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry11 = (s11 + (1 << 20)) >> 21; + s12 += carry11; + s11 -= carry11 << 21; + carry13 = (s13 + (1 << 20)) >> 21; + s14 += carry13; + s13 -= carry13 << 21; + carry15 = (s15 + (1 << 20)) >> 21; + s16 += carry15; + s15 -= carry15 << 21; + s5 += s17 * 666643; + s6 += s17 * 470296; + s7 += s17 * 654183; + s8 -= s17 * 997805; + s9 += s17 * 136657; + s10 -= s17 * 683901; + s17 = 0; + s4 += s16 * 666643; + s5 += s16 * 470296; + s6 += s16 * 654183; + s7 -= s16 * 997805; + s8 += s16 * 136657; + s9 -= s16 * 683901; + s16 = 0; + s3 += s15 * 666643; + s4 += s15 * 470296; + s5 += s15 * 654183; + s6 -= s15 * 997805; + s7 += s15 * 136657; + s8 -= s15 * 683901; + s15 = 0; + s2 += s14 * 666643; + s3 += s14 * 470296; + s4 += s14 * 654183; + s5 -= s14 * 997805; + s6 += s14 * 136657; + s7 -= s14 * 683901; + s14 = 0; + s1 += s13 * 666643; + s2 += s13 * 470296; + s3 += s13 * 654183; + s4 -= s13 * 997805; + s5 += s13 * 136657; + s6 -= s13 * 683901; + s13 = 0; + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + carry0 = (s0 + (1 << 20)) >> 21; + s1 += carry0; + s0 -= carry0 << 21; + carry2 = (s2 + (1 << 20)) >> 21; + s3 += carry2; + s2 -= carry2 << 21; + carry4 = (s4 + (1 << 20)) >> 21; + s5 += carry4; + s4 -= carry4 << 21; + carry6 = (s6 + (1 << 20)) >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry8 = (s8 + (1 << 20)) >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry10 = (s10 + (1 << 20)) >> 21; + s11 += carry10; + s10 -= carry10 << 21; + carry1 = (s1 + (1 << 20)) >> 21; + s2 += carry1; + s1 -= carry1 << 21; + carry3 = (s3 + (1 << 20)) >> 21; + s4 += carry3; + s3 -= carry3 << 21; + carry5 = (s5 + (1 << 20)) >> 21; + s6 += carry5; + s5 -= carry5 << 21; + carry7 = (s7 + (1 << 20)) >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry9 = (s9 + (1 << 20)) >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry11 = (s11 + (1 << 20)) >> 21; + s12 += carry11; + s11 -= carry11 << 21; + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + carry0 = s0 >> 21; + s1 += carry0; + s0 -= carry0 << 21; + carry1 = s1 >> 21; + s2 += carry1; + s1 -= carry1 << 21; + carry2 = s2 >> 21; + s3 += carry2; + s2 -= carry2 << 21; + carry3 = s3 >> 21; + s4 += carry3; + s3 -= carry3 << 21; + carry4 = s4 >> 21; + s5 += carry4; + s4 -= carry4 << 21; + carry5 = s5 >> 21; + s6 += carry5; + s5 -= carry5 << 21; + carry6 = s6 >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry7 = s7 >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry8 = s8 >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry9 = s9 >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry10 = s10 >> 21; + s11 += carry10; + s10 -= carry10 << 21; + carry11 = s11 >> 21; + s12 += carry11; + s11 -= carry11 << 21; + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + carry0 = s0 >> 21; + s1 += carry0; + s0 -= carry0 << 21; + carry1 = s1 >> 21; + s2 += carry1; + s1 -= carry1 << 21; + carry2 = s2 >> 21; + s3 += carry2; + s2 -= carry2 << 21; + carry3 = s3 >> 21; + s4 += carry3; + s3 -= carry3 << 21; + carry4 = s4 >> 21; + s5 += carry4; + s4 -= carry4 << 21; + carry5 = s5 >> 21; + s6 += carry5; + s5 -= carry5 << 21; + carry6 = s6 >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry7 = s7 >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry8 = s8 >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry9 = s9 >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry10 = s10 >> 21; + s11 += carry10; + s10 -= carry10 << 21; + + s[0] = (unsigned char) (s0 >> 0); + s[1] = (unsigned char) (s0 >> 8); + s[2] = (unsigned char) ((s0 >> 16) | (s1 << 5)); + s[3] = (unsigned char) (s1 >> 3); + s[4] = (unsigned char) (s1 >> 11); + s[5] = (unsigned char) ((s1 >> 19) | (s2 << 2)); + s[6] = (unsigned char) (s2 >> 6); + s[7] = (unsigned char) ((s2 >> 14) | (s3 << 7)); + s[8] = (unsigned char) (s3 >> 1); + s[9] = (unsigned char) (s3 >> 9); + s[10] = (unsigned char) ((s3 >> 17) | (s4 << 4)); + s[11] = (unsigned char) (s4 >> 4); + s[12] = (unsigned char) (s4 >> 12); + s[13] = (unsigned char) ((s4 >> 20) | (s5 << 1)); + s[14] = (unsigned char) (s5 >> 7); + s[15] = (unsigned char) ((s5 >> 15) | (s6 << 6)); + s[16] = (unsigned char) (s6 >> 2); + s[17] = (unsigned char) (s6 >> 10); + s[18] = (unsigned char) ((s6 >> 18) | (s7 << 3)); + s[19] = (unsigned char) (s7 >> 5); + s[20] = (unsigned char) (s7 >> 13); + s[21] = (unsigned char) (s8 >> 0); + s[22] = (unsigned char) (s8 >> 8); + s[23] = (unsigned char) ((s8 >> 16) | (s9 << 5)); + s[24] = (unsigned char) (s9 >> 3); + s[25] = (unsigned char) (s9 >> 11); + s[26] = (unsigned char) ((s9 >> 19) | (s10 << 2)); + s[27] = (unsigned char) (s10 >> 6); + s[28] = (unsigned char) ((s10 >> 14) | (s11 << 7)); + s[29] = (unsigned char) (s11 >> 1); + s[30] = (unsigned char) (s11 >> 9); + s[31] = (unsigned char) (s11 >> 17); +} diff --git a/src/cryptoconditions/src/include/ed25519/src/sc.h b/src/cryptoconditions/src/include/ed25519/src/sc.h new file mode 100644 index 000000000..e29e7fa5a --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/src/sc.h @@ -0,0 +1,12 @@ +#ifndef SC_H +#define SC_H + +/* +The set of scalars is \Z/l +where l = 2^252 + 27742317777372353535851937790883648493. +*/ + +void sc_reduce(unsigned char *s); +void sc_muladd(unsigned char *s, const unsigned char *a, const unsigned char *b, const unsigned char *c); + +#endif diff --git a/src/cryptoconditions/src/include/ed25519/src/seed.c b/src/cryptoconditions/src/include/ed25519/src/seed.c new file mode 100644 index 000000000..11a2e3ec4 --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/src/seed.c @@ -0,0 +1,40 @@ +#include "ed25519.h" + +#ifndef ED25519_NO_SEED + +#ifdef _WIN32 +#include +#include +#else +#include +#endif + +int ed25519_create_seed(unsigned char *seed) { +#ifdef _WIN32 + HCRYPTPROV prov; + + if (!CryptAcquireContext(&prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { + return 1; + } + + if (!CryptGenRandom(prov, 32, seed)) { + CryptReleaseContext(prov, 0); + return 1; + } + + CryptReleaseContext(prov, 0); +#else + FILE *f = fopen("/dev/urandom", "rb"); + + if (f == NULL) { + return 1; + } + + fread(seed, 1, 32, f); + fclose(f); +#endif + + return 0; +} + +#endif diff --git a/src/cryptoconditions/src/include/ed25519/src/sha512.c b/src/cryptoconditions/src/include/ed25519/src/sha512.c new file mode 100644 index 000000000..cb8ae7175 --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/src/sha512.c @@ -0,0 +1,275 @@ +/* LibTomCrypt, modular cryptographic library -- Tom St Denis + * + * LibTomCrypt is a library that provides various cryptographic + * algorithms in a highly modular and flexible manner. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +#include "fixedint.h" +#include "sha512.h" + +/* the K array */ +static const uint64_t K[80] = { + UINT64_C(0x428a2f98d728ae22), UINT64_C(0x7137449123ef65cd), + UINT64_C(0xb5c0fbcfec4d3b2f), UINT64_C(0xe9b5dba58189dbbc), + UINT64_C(0x3956c25bf348b538), UINT64_C(0x59f111f1b605d019), + UINT64_C(0x923f82a4af194f9b), UINT64_C(0xab1c5ed5da6d8118), + UINT64_C(0xd807aa98a3030242), UINT64_C(0x12835b0145706fbe), + UINT64_C(0x243185be4ee4b28c), UINT64_C(0x550c7dc3d5ffb4e2), + UINT64_C(0x72be5d74f27b896f), UINT64_C(0x80deb1fe3b1696b1), + UINT64_C(0x9bdc06a725c71235), UINT64_C(0xc19bf174cf692694), + UINT64_C(0xe49b69c19ef14ad2), UINT64_C(0xefbe4786384f25e3), + UINT64_C(0x0fc19dc68b8cd5b5), UINT64_C(0x240ca1cc77ac9c65), + UINT64_C(0x2de92c6f592b0275), UINT64_C(0x4a7484aa6ea6e483), + UINT64_C(0x5cb0a9dcbd41fbd4), UINT64_C(0x76f988da831153b5), + UINT64_C(0x983e5152ee66dfab), UINT64_C(0xa831c66d2db43210), + UINT64_C(0xb00327c898fb213f), UINT64_C(0xbf597fc7beef0ee4), + UINT64_C(0xc6e00bf33da88fc2), UINT64_C(0xd5a79147930aa725), + UINT64_C(0x06ca6351e003826f), UINT64_C(0x142929670a0e6e70), + UINT64_C(0x27b70a8546d22ffc), UINT64_C(0x2e1b21385c26c926), + UINT64_C(0x4d2c6dfc5ac42aed), UINT64_C(0x53380d139d95b3df), + UINT64_C(0x650a73548baf63de), UINT64_C(0x766a0abb3c77b2a8), + UINT64_C(0x81c2c92e47edaee6), UINT64_C(0x92722c851482353b), + UINT64_C(0xa2bfe8a14cf10364), UINT64_C(0xa81a664bbc423001), + UINT64_C(0xc24b8b70d0f89791), UINT64_C(0xc76c51a30654be30), + UINT64_C(0xd192e819d6ef5218), UINT64_C(0xd69906245565a910), + UINT64_C(0xf40e35855771202a), UINT64_C(0x106aa07032bbd1b8), + UINT64_C(0x19a4c116b8d2d0c8), UINT64_C(0x1e376c085141ab53), + UINT64_C(0x2748774cdf8eeb99), UINT64_C(0x34b0bcb5e19b48a8), + UINT64_C(0x391c0cb3c5c95a63), UINT64_C(0x4ed8aa4ae3418acb), + UINT64_C(0x5b9cca4f7763e373), UINT64_C(0x682e6ff3d6b2b8a3), + UINT64_C(0x748f82ee5defb2fc), UINT64_C(0x78a5636f43172f60), + UINT64_C(0x84c87814a1f0ab72), UINT64_C(0x8cc702081a6439ec), + UINT64_C(0x90befffa23631e28), UINT64_C(0xa4506cebde82bde9), + UINT64_C(0xbef9a3f7b2c67915), UINT64_C(0xc67178f2e372532b), + UINT64_C(0xca273eceea26619c), UINT64_C(0xd186b8c721c0c207), + UINT64_C(0xeada7dd6cde0eb1e), UINT64_C(0xf57d4f7fee6ed178), + UINT64_C(0x06f067aa72176fba), UINT64_C(0x0a637dc5a2c898a6), + UINT64_C(0x113f9804bef90dae), UINT64_C(0x1b710b35131c471b), + UINT64_C(0x28db77f523047d84), UINT64_C(0x32caab7b40c72493), + UINT64_C(0x3c9ebe0a15c9bebc), UINT64_C(0x431d67c49c100d4c), + UINT64_C(0x4cc5d4becb3e42b6), UINT64_C(0x597f299cfc657e2a), + UINT64_C(0x5fcb6fab3ad6faec), UINT64_C(0x6c44198c4a475817) +}; + +/* Various logical functions */ + +#define ROR64c(x, y) \ + ( ((((x)&UINT64_C(0xFFFFFFFFFFFFFFFF))>>((uint64_t)(y)&UINT64_C(63))) | \ + ((x)<<((uint64_t)(64-((y)&UINT64_C(63)))))) & UINT64_C(0xFFFFFFFFFFFFFFFF)) + +#define STORE64H(x, y) \ + { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \ + (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \ + (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \ + (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); } + +#define LOAD64H(x, y) \ + { x = (((uint64_t)((y)[0] & 255))<<56)|(((uint64_t)((y)[1] & 255))<<48) | \ + (((uint64_t)((y)[2] & 255))<<40)|(((uint64_t)((y)[3] & 255))<<32) | \ + (((uint64_t)((y)[4] & 255))<<24)|(((uint64_t)((y)[5] & 255))<<16) | \ + (((uint64_t)((y)[6] & 255))<<8)|(((uint64_t)((y)[7] & 255))); } + + +#define Ch(x,y,z) (z ^ (x & (y ^ z))) +#define Maj(x,y,z) (((x | y) & z) | (x & y)) +#define S(x, n) ROR64c(x, n) +#define R(x, n) (((x) &UINT64_C(0xFFFFFFFFFFFFFFFF))>>((uint64_t)n)) +#define Sigma0(x) (S(x, 28) ^ S(x, 34) ^ S(x, 39)) +#define Sigma1(x) (S(x, 14) ^ S(x, 18) ^ S(x, 41)) +#define Gamma0(x) (S(x, 1) ^ S(x, 8) ^ R(x, 7)) +#define Gamma1(x) (S(x, 19) ^ S(x, 61) ^ R(x, 6)) +#ifndef MIN + #define MIN(x, y) ( ((x)<(y))?(x):(y) ) +#endif + +/* compress 1024-bits */ +static int sha512_compress(sha512_context *md, unsigned char *buf) +{ + uint64_t S[8], W[80], t0, t1; + int i; + + /* copy state into S */ + for (i = 0; i < 8; i++) { + S[i] = md->state[i]; + } + + /* copy the state into 1024-bits into W[0..15] */ + for (i = 0; i < 16; i++) { + LOAD64H(W[i], buf + (8*i)); + } + + /* fill W[16..79] */ + for (i = 16; i < 80; i++) { + W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16]; + } + +/* Compress */ + #define RND(a,b,c,d,e,f,g,h,i) \ + t0 = h + Sigma1(e) + Ch(e, f, g) + K[i] + W[i]; \ + t1 = Sigma0(a) + Maj(a, b, c);\ + d += t0; \ + h = t0 + t1; + + for (i = 0; i < 80; i += 8) { + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],i+0); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],i+1); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],i+2); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],i+3); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],i+4); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],i+5); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],i+6); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],i+7); + } + + #undef RND + + + + /* feedback */ + for (i = 0; i < 8; i++) { + md->state[i] = md->state[i] + S[i]; + } + + return 0; +} + + +/** + Initialize the hash state + @param md The hash state you wish to initialize + @return 0 if successful +*/ +int sha512_init(sha512_context * md) { + if (md == NULL) return 1; + + md->curlen = 0; + md->length = 0; + md->state[0] = UINT64_C(0x6a09e667f3bcc908); + md->state[1] = UINT64_C(0xbb67ae8584caa73b); + md->state[2] = UINT64_C(0x3c6ef372fe94f82b); + md->state[3] = UINT64_C(0xa54ff53a5f1d36f1); + md->state[4] = UINT64_C(0x510e527fade682d1); + md->state[5] = UINT64_C(0x9b05688c2b3e6c1f); + md->state[6] = UINT64_C(0x1f83d9abfb41bd6b); + md->state[7] = UINT64_C(0x5be0cd19137e2179); + + return 0; +} + +/** + Process a block of memory though the hash + @param md The hash state + @param in The data to hash + @param inlen The length of the data (octets) + @return 0 if successful +*/ +int sha512_update (sha512_context * md, const unsigned char *in, size_t inlen) +{ + size_t n; + size_t i; + int err; + if (md == NULL) return 1; + if (in == NULL) return 1; + if (md->curlen > sizeof(md->buf)) { + return 1; + } + while (inlen > 0) { + if (md->curlen == 0 && inlen >= 128) { + if ((err = sha512_compress (md, (unsigned char *)in)) != 0) { + return err; + } + md->length += 128 * 8; + in += 128; + inlen -= 128; + } else { + n = MIN(inlen, (128 - md->curlen)); + + for (i = 0; i < n; i++) { + md->buf[i + md->curlen] = in[i]; + } + + + md->curlen += n; + in += n; + inlen -= n; + if (md->curlen == 128) { + if ((err = sha512_compress (md, md->buf)) != 0) { + return err; + } + md->length += 8*128; + md->curlen = 0; + } + } + } + return 0; +} + +/** + Terminate the hash to get the digest + @param md The hash state + @param out [out] The destination of the hash (64 bytes) + @return 0 if successful +*/ + int sha512_final(sha512_context * md, unsigned char *out) + { + int i; + + if (md == NULL) return 1; + if (out == NULL) return 1; + + if (md->curlen >= sizeof(md->buf)) { + return 1; + } + + /* increase the length of the message */ + md->length += md->curlen * UINT64_C(8); + + /* append the '1' bit */ + md->buf[md->curlen++] = (unsigned char)0x80; + + /* if the length is currently above 112 bytes we append zeros + * then compress. Then we can fall back to padding zeros and length + * encoding like normal. + */ + if (md->curlen > 112) { + while (md->curlen < 128) { + md->buf[md->curlen++] = (unsigned char)0; + } + sha512_compress(md, md->buf); + md->curlen = 0; + } + + /* pad upto 120 bytes of zeroes + * note: that from 112 to 120 is the 64 MSB of the length. We assume that you won't hash + * > 2^64 bits of data... :-) + */ +while (md->curlen < 120) { + md->buf[md->curlen++] = (unsigned char)0; +} + + /* store length */ +STORE64H(md->length, md->buf+120); +sha512_compress(md, md->buf); + + /* copy output */ +for (i = 0; i < 8; i++) { + STORE64H(md->state[i], out+(8*i)); +} + +return 0; +} + +int sha512(const unsigned char *message, size_t message_len, unsigned char *out) +{ + sha512_context ctx; + int ret; + if ((ret = sha512_init(&ctx))) return ret; + if ((ret = sha512_update(&ctx, message, message_len))) return ret; + if ((ret = sha512_final(&ctx, out))) return ret; + return 0; +} diff --git a/src/cryptoconditions/src/include/ed25519/src/sha512.h b/src/cryptoconditions/src/include/ed25519/src/sha512.h new file mode 100644 index 000000000..a34dd5e42 --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/src/sha512.h @@ -0,0 +1,21 @@ +#ifndef SHA512_H +#define SHA512_H + +#include + +#include "fixedint.h" + +/* state */ +typedef struct sha512_context_ { + uint64_t length, state[8]; + size_t curlen; + unsigned char buf[128]; +} sha512_context; + + +int sha512_init(sha512_context * md); +int sha512_final(sha512_context * md, unsigned char *out); +int sha512_update(sha512_context * md, const unsigned char *in, size_t inlen); +int sha512(const unsigned char *message, size_t message_len, unsigned char *out); + +#endif diff --git a/src/cryptoconditions/src/include/ed25519/src/sign.c b/src/cryptoconditions/src/include/ed25519/src/sign.c new file mode 100644 index 000000000..199a8393b --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/src/sign.c @@ -0,0 +1,31 @@ +#include "ed25519.h" +#include "sha512.h" +#include "ge.h" +#include "sc.h" + + +void ed25519_sign(unsigned char *signature, const unsigned char *message, size_t message_len, const unsigned char *public_key, const unsigned char *private_key) { + sha512_context hash; + unsigned char hram[64]; + unsigned char r[64]; + ge_p3 R; + + + sha512_init(&hash); + sha512_update(&hash, private_key + 32, 32); + sha512_update(&hash, message, message_len); + sha512_final(&hash, r); + + sc_reduce(r); + ge_scalarmult_base(&R, r); + ge_p3_tobytes(signature, &R); + + sha512_init(&hash); + sha512_update(&hash, signature, 32); + sha512_update(&hash, public_key, 32); + sha512_update(&hash, message, message_len); + sha512_final(&hash, hram); + + sc_reduce(hram); + sc_muladd(signature + 32, hram, private_key, r); +} diff --git a/src/cryptoconditions/src/include/ed25519/src/verify.c b/src/cryptoconditions/src/include/ed25519/src/verify.c new file mode 100644 index 000000000..32f988edc --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/src/verify.c @@ -0,0 +1,77 @@ +#include "ed25519.h" +#include "sha512.h" +#include "ge.h" +#include "sc.h" + +static int consttime_equal(const unsigned char *x, const unsigned char *y) { + unsigned char r = 0; + + r = x[0] ^ y[0]; + #define F(i) r |= x[i] ^ y[i] + F(1); + F(2); + F(3); + F(4); + F(5); + F(6); + F(7); + F(8); + F(9); + F(10); + F(11); + F(12); + F(13); + F(14); + F(15); + F(16); + F(17); + F(18); + F(19); + F(20); + F(21); + F(22); + F(23); + F(24); + F(25); + F(26); + F(27); + F(28); + F(29); + F(30); + F(31); + #undef F + + return !r; +} + +int ed25519_verify(const unsigned char *signature, const unsigned char *message, size_t message_len, const unsigned char *public_key) { + unsigned char h[64]; + unsigned char checker[32]; + sha512_context hash; + ge_p3 A; + ge_p2 R; + + if (signature[63] & 224) { + return 0; + } + + if (ge_frombytes_negate_vartime(&A, public_key) != 0) { + return 0; + } + + sha512_init(&hash); + sha512_update(&hash, signature, 32); + sha512_update(&hash, public_key, 32); + sha512_update(&hash, message, message_len); + sha512_final(&hash, h); + + sc_reduce(h); + ge_double_scalarmult_vartime(&R, h, &A, signature + 32); + ge_tobytes(checker, &R); + + if (!consttime_equal(checker, signature)) { + return 0; + } + + return 1; +} diff --git a/src/cryptoconditions/src/include/ed25519/test.c b/src/cryptoconditions/src/include/ed25519/test.c new file mode 100644 index 000000000..e2159a9af --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/test.c @@ -0,0 +1,150 @@ +#include +#include +#include +#include + +/* #define ED25519_DLL */ +#include "src/ed25519.h" + +#include "src/ge.h" +#include "src/sc.h" + + +int main() { + unsigned char public_key[32], private_key[64], seed[32], scalar[32]; + unsigned char other_public_key[32], other_private_key[64]; + unsigned char shared_secret[32], other_shared_secret[32]; + unsigned char signature[64]; + + clock_t start; + clock_t end; + int i; + + const unsigned char message[] = "Hello, world!"; + const int message_len = strlen((char*) message); + + /* create a random seed, and a keypair out of that seed */ + ed25519_create_seed(seed); + ed25519_create_keypair(public_key, private_key, seed); + + /* create signature on the message with the keypair */ + ed25519_sign(signature, message, message_len, public_key, private_key); + + /* verify the signature */ + if (ed25519_verify(signature, message, message_len, public_key)) { + printf("valid signature\n"); + } else { + printf("invalid signature\n"); + } + + /* create scalar and add it to the keypair */ + ed25519_create_seed(scalar); + ed25519_add_scalar(public_key, private_key, scalar); + + /* create signature with the new keypair */ + ed25519_sign(signature, message, message_len, public_key, private_key); + + /* verify the signature with the new keypair */ + if (ed25519_verify(signature, message, message_len, public_key)) { + printf("valid signature\n"); + } else { + printf("invalid signature\n"); + } + + /* make a slight adjustment and verify again */ + signature[44] ^= 0x10; + if (ed25519_verify(signature, message, message_len, public_key)) { + printf("did not detect signature change\n"); + } else { + printf("correctly detected signature change\n"); + } + + /* generate two keypairs for testing key exchange */ + ed25519_create_seed(seed); + ed25519_create_keypair(public_key, private_key, seed); + ed25519_create_seed(seed); + ed25519_create_keypair(other_public_key, other_private_key, seed); + + /* create two shared secrets - from both perspectives - and check if they're equal */ + ed25519_key_exchange(shared_secret, other_public_key, private_key); + ed25519_key_exchange(other_shared_secret, public_key, other_private_key); + + for (i = 0; i < 32; ++i) { + if (shared_secret[i] != other_shared_secret[i]) { + printf("key exchange was incorrect\n"); + break; + } + } + + if (i == 32) { + printf("key exchange was correct\n"); + } + + /* test performance */ + printf("testing seed generation performance: "); + start = clock(); + for (i = 0; i < 10000; ++i) { + ed25519_create_seed(seed); + } + end = clock(); + + printf("%fus per seed\n", ((double) ((end - start) * 1000)) / CLOCKS_PER_SEC / i * 1000); + + + printf("testing key generation performance: "); + start = clock(); + for (i = 0; i < 10000; ++i) { + ed25519_create_keypair(public_key, private_key, seed); + } + end = clock(); + + printf("%fus per keypair\n", ((double) ((end - start) * 1000)) / CLOCKS_PER_SEC / i * 1000); + + printf("testing sign performance: "); + start = clock(); + for (i = 0; i < 10000; ++i) { + ed25519_sign(signature, message, message_len, public_key, private_key); + } + end = clock(); + + printf("%fus per signature\n", ((double) ((end - start) * 1000)) / CLOCKS_PER_SEC / i * 1000); + + printf("testing verify performance: "); + start = clock(); + for (i = 0; i < 10000; ++i) { + ed25519_verify(signature, message, message_len, public_key); + } + end = clock(); + + printf("%fus per signature\n", ((double) ((end - start) * 1000)) / CLOCKS_PER_SEC / i * 1000); + + + printf("testing keypair scalar addition performance: "); + start = clock(); + for (i = 0; i < 10000; ++i) { + ed25519_add_scalar(public_key, private_key, scalar); + } + end = clock(); + + printf("%fus per keypair\n", ((double) ((end - start) * 1000)) / CLOCKS_PER_SEC / i * 1000); + + printf("testing public key scalar addition performance: "); + start = clock(); + for (i = 0; i < 10000; ++i) { + ed25519_add_scalar(public_key, NULL, scalar); + } + end = clock(); + + printf("%fus per key\n", ((double) ((end - start) * 1000)) / CLOCKS_PER_SEC / i * 1000); + + printf("testing key exchange performance: "); + start = clock(); + for (i = 0; i < 10000; ++i) { + ed25519_key_exchange(shared_secret, other_public_key, private_key); + } + end = clock(); + + printf("%fus per shared secret\n", ((double) ((end - start) * 1000)) / CLOCKS_PER_SEC / i * 1000); + + return 0; +} diff --git a/src/cryptoconditions/src/include/libbase58.h b/src/cryptoconditions/src/include/libbase58.h new file mode 100644 index 000000000..fafe6539f --- /dev/null +++ b/src/cryptoconditions/src/include/libbase58.h @@ -0,0 +1,23 @@ +#ifndef LIBBASE58_H +#define LIBBASE58_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern bool (*b58_sha256_impl)(void *, const void *, size_t); + +extern bool b58tobin(void *bin, size_t *binsz, const char *b58, size_t b58sz); +extern int b58check(const void *bin, size_t binsz, const char *b58, size_t b58sz); + +extern bool b58enc(char *b58, size_t *b58sz, const void *bin, size_t binsz); +extern bool b58check_enc(char *b58c, size_t *b58c_sz, uint8_t ver, const void *data, size_t datasz); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/.gitignore b/src/cryptoconditions/src/include/secp256k1/.gitignore new file mode 100644 index 000000000..076ff1295 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/.gitignore @@ -0,0 +1,37 @@ +bench_inv +bench_sign +bench_verify +bench_recover +bench_internal +tests +*.exe +*.so +*.a +!.gitignore + +Makefile +configure +.libs/ +Makefile.in +aclocal.m4 +autom4te.cache/ +config.log +config.status +*.tar.gz +*.la +libtool +.deps/ +.dirstamp +build-aux/ +*.lo +*.o +*~ +src/libsecp256k1-config.h +src/libsecp256k1-config.h.in +m4/libtool.m4 +m4/ltoptions.m4 +m4/ltsugar.m4 +m4/ltversion.m4 +m4/lt~obsolete.m4 +src/stamp-h1 +libsecp256k1.pc diff --git a/src/cryptoconditions/src/include/secp256k1/.travis.yml b/src/cryptoconditions/src/include/secp256k1/.travis.yml new file mode 100644 index 000000000..0d8089cfe --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/.travis.yml @@ -0,0 +1,59 @@ +language: c +sudo: false +addons: + apt: + packages: libgmp-dev +compiler: + - clang + - gcc +env: + global: + - FIELD=auto BIGNUM=auto SCALAR=auto ENDOMORPHISM=no ASM=no BUILD=check EXTRAFLAGS= HOST= + matrix: + - SCALAR=32bit + - SCALAR=64bit + - FIELD=64bit + - FIELD=64bit ENDOMORPHISM=yes + - FIELD=64bit ASM=x86_64 + - FIELD=64bit ENDOMORPHISM=yes ASM=x86_64 + - FIELD=32bit + - FIELD=32bit ENDOMORPHISM=yes + - BIGNUM=no + - BIGNUM=no ENDOMORPHISM=yes + - BUILD=distcheck + - EXTRAFLAGS=CFLAGS=-DDETERMINISTIC +matrix: + fast_finish: true + include: + - compiler: clang + env: HOST=i686-linux-gnu ENDOMORPHISM=yes + addons: + apt: + packages: + - gcc-multilib + - libgmp-dev:i386 + - compiler: clang + env: HOST=i686-linux-gnu + addons: + apt: + packages: + - gcc-multilib + - compiler: gcc + env: HOST=i686-linux-gnu ENDOMORPHISM=yes + addons: + apt: + packages: + - gcc-multilib + - compiler: gcc + env: HOST=i686-linux-gnu + addons: + apt: + packages: + - gcc-multilib + - libgmp-dev:i386 +before_script: ./autogen.sh +script: + - if [ -n "$HOST" ]; then export USE_HOST="--host=$HOST"; fi + - if [ "x$HOST" = "xi686-linux-gnu" ]; then export CC="$CC -m32"; fi + - ./configure --enable-endomorphism=$ENDOMORPHISM --with-field=$FIELD --with-bignum=$BIGNUM --with-scalar=$SCALAR $EXTRAFLAGS $USE_HOST && make -j2 $BUILD +os: linux diff --git a/src/cryptoconditions/src/include/secp256k1/COPYING b/src/cryptoconditions/src/include/secp256k1/COPYING new file mode 100644 index 000000000..4522a5990 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/COPYING @@ -0,0 +1,19 @@ +Copyright (c) 2013 Pieter Wuille + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/src/cryptoconditions/src/include/secp256k1/Makefile.am b/src/cryptoconditions/src/include/secp256k1/Makefile.am new file mode 100644 index 000000000..5f388f3fd --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/Makefile.am @@ -0,0 +1,77 @@ +ACLOCAL_AMFLAGS = -I build-aux/m4 + +lib_LTLIBRARIES = libsecp256k1.la +include_HEADERS = include/secp256k1.h +noinst_HEADERS = +noinst_HEADERS += src/scalar.h +noinst_HEADERS += src/scalar_4x64.h +noinst_HEADERS += src/scalar_8x32.h +noinst_HEADERS += src/scalar_impl.h +noinst_HEADERS += src/scalar_4x64_impl.h +noinst_HEADERS += src/scalar_8x32_impl.h +noinst_HEADERS += src/group.h +noinst_HEADERS += src/group_impl.h +noinst_HEADERS += src/num_gmp.h +noinst_HEADERS += src/num_gmp_impl.h +noinst_HEADERS += src/ecdsa.h +noinst_HEADERS += src/ecdsa_impl.h +noinst_HEADERS += src/eckey.h +noinst_HEADERS += src/eckey_impl.h +noinst_HEADERS += src/ecmult.h +noinst_HEADERS += src/ecmult_impl.h +noinst_HEADERS += src/ecmult_gen.h +noinst_HEADERS += src/ecmult_gen_impl.h +noinst_HEADERS += src/num.h +noinst_HEADERS += src/num_impl.h +noinst_HEADERS += src/field_10x26.h +noinst_HEADERS += src/field_10x26_impl.h +noinst_HEADERS += src/field_5x52.h +noinst_HEADERS += src/field_5x52_impl.h +noinst_HEADERS += src/field_5x52_int128_impl.h +noinst_HEADERS += src/field_5x52_asm_impl.h +noinst_HEADERS += src/java/org_bitcoin_NativeSecp256k1.h +noinst_HEADERS += src/util.h +noinst_HEADERS += src/testrand.h +noinst_HEADERS += src/testrand_impl.h +noinst_HEADERS += src/hash.h +noinst_HEADERS += src/hash_impl.h +noinst_HEADERS += src/field.h +noinst_HEADERS += src/field_impl.h +noinst_HEADERS += src/bench.h + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = libsecp256k1.pc + +libsecp256k1_la_SOURCES = src/secp256k1.c +libsecp256k1_la_CPPFLAGS = -I$(top_srcdir)/include $(SECP_INCLUDES) +libsecp256k1_la_LIBADD = $(SECP_LIBS) + + +noinst_PROGRAMS = +if USE_BENCHMARK +noinst_PROGRAMS += bench_verify bench_recover bench_sign bench_internal +bench_verify_SOURCES = src/bench_verify.c +bench_verify_LDADD = libsecp256k1.la $(SECP_LIBS) +bench_verify_LDFLAGS = -static +bench_recover_SOURCES = src/bench_recover.c +bench_recover_LDADD = libsecp256k1.la $(SECP_LIBS) +bench_recover_LDFLAGS = -static +bench_sign_SOURCES = src/bench_sign.c +bench_sign_LDADD = libsecp256k1.la $(SECP_LIBS) +bench_sign_LDFLAGS = -static +bench_internal_SOURCES = src/bench_internal.c +bench_internal_LDADD = $(SECP_LIBS) +bench_internal_LDFLAGS = -static +bench_internal_CPPFLAGS = $(SECP_INCLUDES) +endif + +if USE_TESTS +noinst_PROGRAMS += tests +tests_SOURCES = src/tests.c +tests_CPPFLAGS = -DVERIFY $(SECP_INCLUDES) $(SECP_TEST_INCLUDES) +tests_LDADD = $(SECP_LIBS) $(SECP_TEST_LIBS) +tests_LDFLAGS = -static -pthread +TESTS = tests +endif + +EXTRA_DIST = autogen.sh diff --git a/src/cryptoconditions/src/include/secp256k1/README.md b/src/cryptoconditions/src/include/secp256k1/README.md new file mode 100644 index 000000000..6095db422 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/README.md @@ -0,0 +1,61 @@ +libsecp256k1 +============ + +[![Build Status](https://travis-ci.org/bitcoin/secp256k1.svg?branch=master)](https://travis-ci.org/bitcoin/secp256k1) + +Optimized C library for EC operations on curve secp256k1. + +This library is a work in progress and is being used to research best practices. Use at your own risk. + +Features: +* secp256k1 ECDSA signing/verification and key generation. +* Adding/multiplying private/public keys. +* Serialization/parsing of private keys, public keys, signatures. +* Constant time, constant memory access signing and pubkey generation. +* Derandomized DSA (via RFC6979 or with a caller provided function.) +* Very efficient implementation. + +Implementation details +---------------------- + +* General + * No runtime heap allocation. + * Extensive testing infrastructure. + * Structured to facilitate review and analysis. + * Intended to be portable to any system with a C89 compiler and uint64_t support. + * Expose only higher level interfaces to minimize the API surface and improve application security. ("Be difficult to use insecurely.") +* Field operations + * Optimized implementation of arithmetic modulo the curve's field size (2^256 - 0x1000003D1). + * Using 5 52-bit limbs (including hand-optimized assembly for x86_64, by Diederik Huys). + * Using 10 26-bit limbs. + * Field inverses and square roots using a sliding window over blocks of 1s (by Peter Dettman). +* Scalar operations + * Optimized implementation without data-dependent branches of arithmetic modulo the curve's order. + * Using 4 64-bit limbs (relying on __int128 support in the compiler). + * Using 8 32-bit limbs. +* Group operations + * Point addition formula specifically simplified for the curve equation (y^2 = x^3 + 7). + * Use addition between points in Jacobian and affine coordinates where possible. + * Use a unified addition/doubling formula where necessary to avoid data-dependent branches. + * Point/x comparison without a field inversion by comparison in the Jacobian coordinate space. +* Point multiplication for verification (a*P + b*G). + * Use wNAF notation for point multiplicands. + * Use a much larger window for multiples of G, using precomputed multiples. + * Use Shamir's trick to do the multiplication with the public key and the generator simultaneously. + * Optionally (off by default) use secp256k1's efficiently-computable endomorphism to split the P multiplicand into 2 half-sized ones. +* Point multiplication for signing + * Use a precomputed table of multiples of powers of 16 multiplied with the generator, so general multiplication becomes a series of additions. + * Access the table with branch-free conditional moves so memory access is uniform. + * No data-dependent branches + * The precomputed tables add and eventually subtract points for which no known scalar (private key) is known, preventing even an attacker with control over the private key used to control the data internally. + +Build steps +----------- + +libsecp256k1 is built using autotools: + + $ ./autogen.sh + $ ./configure + $ make + $ ./tests + $ sudo make install # optional diff --git a/src/cryptoconditions/src/include/secp256k1/TODO b/src/cryptoconditions/src/include/secp256k1/TODO new file mode 100644 index 000000000..a300e1c5e --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/TODO @@ -0,0 +1,3 @@ +* Unit tests for fieldelem/groupelem, including ones intended to + trigger fieldelem's boundary cases. +* Complete constant-time operations for signing/keygen diff --git a/src/cryptoconditions/src/include/secp256k1/autogen.sh b/src/cryptoconditions/src/include/secp256k1/autogen.sh new file mode 100755 index 000000000..65286b935 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/autogen.sh @@ -0,0 +1,3 @@ +#!/bin/sh +set -e +autoreconf -if --warnings=all diff --git a/src/cryptoconditions/src/include/secp256k1/configure.ac b/src/cryptoconditions/src/include/secp256k1/configure.ac new file mode 100644 index 000000000..3dc182951 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/configure.ac @@ -0,0 +1,330 @@ +AC_PREREQ([2.60]) +AC_INIT([libsecp256k1],[0.1]) +AC_CONFIG_AUX_DIR([build-aux]) +AC_CONFIG_MACRO_DIR([build-aux/m4]) +AC_CANONICAL_HOST +AH_TOP([#ifndef LIBSECP256K1_CONFIG_H]) +AH_TOP([#define LIBSECP256K1_CONFIG_H]) +AH_BOTTOM([#endif /*LIBSECP256K1_CONFIG_H*/]) +AM_INIT_AUTOMAKE([foreign subdir-objects]) +LT_INIT + +dnl make the compilation flags quiet unless V=1 is used +m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) + +PKG_PROG_PKG_CONFIG + +AC_PATH_TOOL(AR, ar) +AC_PATH_TOOL(RANLIB, ranlib) +AC_PATH_TOOL(STRIP, strip) + +if test "x$CFLAGS" = "x"; then + CFLAGS="-O3 -g" +fi + +AC_PROG_CC_C89 +if test x"$ac_cv_prog_cc_c89" = x"no"; then + AC_MSG_ERROR([c89 compiler support required]) +fi + +case $host in + *mingw*) + use_pkgconfig=no + ;; + *) + use_pkgconfig=yes + ;; +esac + +case $host_os in + *darwin*) + if test x$cross_compiling != xyes; then + AC_PATH_PROG([BREW],brew,) + if test x$BREW != x; then + dnl These Homebrew packages may be keg-only, meaning that they won't be found + dnl in expected paths because they may conflict with system files. Ask + dnl Homebrew where each one is located, then adjust paths accordingly. + + openssl_prefix=`$BREW --prefix openssl 2>/dev/null` + gmp_prefix=`$BREW --prefix gmp 2>/dev/null` + if test x$openssl_prefix != x; then + PKG_CONFIG_PATH="$openssl_prefix/lib/pkgconfig:$PKG_CONFIG_PATH" + export PKG_CONFIG_PATH + fi + if test x$gmp_prefix != x; then + GMP_CPPFLAGS="-I$gmp_prefix/include" + GMP_LIBS="-L$gmp_prefix/lib" + fi + else + AC_PATH_PROG([PORT],port,) + dnl if homebrew isn't installed and macports is, add the macports default paths + dnl as a last resort. + if test x$PORT != x; then + CPPFLAGS="$CPPFLAGS -isystem /opt/local/include" + LDFLAGS="$LDFLAGS -L/opt/local/lib" + fi + fi + fi + ;; +esac + +CFLAGS="$CFLAGS -W" + +warn_CFLAGS="-std=c89 -pedantic -Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes -Wno-unused-function -Wno-long-long -Wno-overlength-strings" +saved_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $warn_CFLAGS" +AC_MSG_CHECKING([if ${CC} supports ${warn_CFLAGS}]) +AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])], + [ AC_MSG_RESULT([yes]) ], + [ AC_MSG_RESULT([no]) + CFLAGS="$saved_CFLAGS" + ]) + + +AC_ARG_ENABLE(benchmark, + AS_HELP_STRING([--enable-benchmark],[compile benchmark (default is no)]), + [use_benchmark=$enableval], + [use_benchmark=no]) + +AC_ARG_ENABLE(tests, + AS_HELP_STRING([--enable-tests],[compile tests (default is yes)]), + [use_tests=$enableval], + [use_tests=yes]) + +AC_ARG_ENABLE(endomorphism, + AS_HELP_STRING([--enable-endomorphism],[enable endomorphism (default is no)]), + [use_endomorphism=$enableval], + [use_endomorphism=no]) + +AC_ARG_WITH([field], [AS_HELP_STRING([--with-field=64bit|32bit|auto], +[Specify Field Implementation. Default is auto])],[req_field=$withval], [req_field=auto]) + +AC_ARG_WITH([bignum], [AS_HELP_STRING([--with-bignum=gmp|no|auto], +[Specify Bignum Implementation. Default is auto])],[req_bignum=$withval], [req_bignum=auto]) + +AC_ARG_WITH([scalar], [AS_HELP_STRING([--with-scalar=64bit|32bit|auto], +[Specify scalar implementation. Default is auto])],[req_scalar=$withval], [req_scalar=auto]) + +AC_ARG_WITH([asm], [AS_HELP_STRING([--with-asm=x86_64|no|auto] +[Specify assembly optimizations to use. Default is auto])],[req_asm=$withval], [req_asm=auto]) + +AC_CHECK_TYPES([__int128]) + +AC_MSG_CHECKING([for __builtin_expect]) +AC_COMPILE_IFELSE([AC_LANG_SOURCE([[void myfunc() {__builtin_expect(0,0);}]])], + [ AC_MSG_RESULT([yes]);AC_DEFINE(HAVE_BUILTIN_EXPECT,1,[Define this symbol if __builtin_expect is available]) ], + [ AC_MSG_RESULT([no]) + ]) + +if test x"$req_asm" = x"auto"; then + SECP_64BIT_ASM_CHECK + if test x"$has_64bit_asm" = x"yes"; then + set_asm=x86_64 + fi + if test x"$set_asm" = x; then + set_asm=no + fi +else + set_asm=$req_asm + case $set_asm in + x86_64) + SECP_64BIT_ASM_CHECK + if test x"$has_64bit_asm" != x"yes"; then + AC_MSG_ERROR([x86_64 assembly optimization requested but not available]) + fi + ;; + no) + ;; + *) + AC_MSG_ERROR([invalid assembly optimization selection]) + ;; + esac +fi + +if test x"$req_field" = x"auto"; then + if test x"set_asm" = x"x86_64"; then + set_field=64bit + fi + if test x"$set_field" = x; then + SECP_INT128_CHECK + if test x"$has_int128" = x"yes"; then + set_field=64bit + fi + fi + if test x"$set_field" = x; then + set_field=32bit + fi +else + set_field=$req_field + case $set_field in + 64bit) + if test x"$set_asm" != x"x86_64"; then + SECP_INT128_CHECK + if test x"$has_int128" != x"yes"; then + AC_MSG_ERROR([64bit field explicitly requested but neither __int128 support or x86_64 assembly available]) + fi + fi + ;; + 32bit) + ;; + *) + AC_MSG_ERROR([invalid field implementation selection]) + ;; + esac +fi + +if test x"$req_scalar" = x"auto"; then + SECP_INT128_CHECK + if test x"$has_int128" = x"yes"; then + set_scalar=64bit + fi + if test x"$set_scalar" = x; then + set_scalar=32bit + fi +else + set_scalar=$req_scalar + case $set_scalar in + 64bit) + SECP_INT128_CHECK + if test x"$has_int128" != x"yes"; then + AC_MSG_ERROR([64bit scalar explicitly requested but __int128 support not available]) + fi + ;; + 32bit) + ;; + *) + AC_MSG_ERROR([invalid scalar implementation selected]) + ;; + esac +fi + +if test x"$req_bignum" = x"auto"; then + SECP_GMP_CHECK + if test x"$has_gmp" = x"yes"; then + set_bignum=gmp + fi + + if test x"$set_bignum" = x; then + set_bignum=no + fi +else + set_bignum=$req_bignum + case $set_bignum in + gmp) + SECP_GMP_CHECK + if test x"$has_gmp" != x"yes"; then + AC_MSG_ERROR([gmp bignum explicitly requested but libgmp not available]) + fi + ;; + no) + ;; + *) + AC_MSG_ERROR([invalid bignum implementation selection]) + ;; + esac +fi + +# select assembly optimization +case $set_asm in +x86_64) + AC_DEFINE(USE_ASM_X86_64, 1, [Define this symbol to enable x86_64 assembly optimizations]) + ;; +no) + ;; +*) + AC_MSG_ERROR([invalid assembly optimizations]) + ;; +esac + +# select field implementation +case $set_field in +64bit) + AC_DEFINE(USE_FIELD_5X52, 1, [Define this symbol to use the FIELD_5X52 implementation]) + ;; +32bit) + AC_DEFINE(USE_FIELD_10X26, 1, [Define this symbol to use the FIELD_10X26 implementation]) + ;; +*) + AC_MSG_ERROR([invalid field implementation]) + ;; +esac + +# select bignum implementation +case $set_bignum in +gmp) + AC_DEFINE(HAVE_LIBGMP, 1, [Define this symbol if libgmp is installed]) + AC_DEFINE(USE_NUM_GMP, 1, [Define this symbol to use the gmp implementation for num]) + AC_DEFINE(USE_FIELD_INV_NUM, 1, [Define this symbol to use the num-based field inverse implementation]) + AC_DEFINE(USE_SCALAR_INV_NUM, 1, [Define this symbol to use the num-based scalar inverse implementation]) + ;; +no) + AC_DEFINE(USE_NUM_NONE, 1, [Define this symbol to use no num implementation]) + AC_DEFINE(USE_FIELD_INV_BUILTIN, 1, [Define this symbol to use the native field inverse implementation]) + AC_DEFINE(USE_SCALAR_INV_BUILTIN, 1, [Define this symbol to use the native scalar inverse implementation]) + ;; +*) + AC_MSG_ERROR([invalid bignum implementation]) + ;; +esac + +#select scalar implementation +case $set_scalar in +64bit) + AC_DEFINE(USE_SCALAR_4X64, 1, [Define this symbol to use the 4x64 scalar implementation]) + ;; +32bit) + AC_DEFINE(USE_SCALAR_8X32, 1, [Define this symbol to use the 8x32 scalar implementation]) + ;; +*) + AC_MSG_ERROR([invalid scalar implementation]) + ;; +esac + +if test x"$use_tests" = x"yes"; then + SECP_OPENSSL_CHECK + if test x"$has_openssl_ec" = x"yes"; then + AC_DEFINE(ENABLE_OPENSSL_TESTS, 1, [Define this symbol if OpenSSL EC functions are available]) + SECP_TEST_INCLUDES="$SSL_CFLAGS $CRYPTO_CFLAGS" + SECP_TEST_LIBS="$CRYPTO_LIBS" + + case $host in + *mingw*) + SECP_TEST_LIBS="$SECP_TEST_LIBS -lgdi32" + ;; + esac + + fi +fi + +if test x"$set_bignum" = x"gmp"; then + SECP_LIBS="$SECP_LIBS $GMP_LIBS" + SECP_INCLUDES="$SECP_INCLUDES $GMP_CPPFLAGS" +fi + +if test x"$use_endomorphism" = x"yes"; then + AC_DEFINE(USE_ENDOMORPHISM, 1, [Define this symbol to use endomorphism optimization]) +fi + +AC_C_BIGENDIAN() + +AC_MSG_NOTICE([Using assembly optimizations: $set_asm]) +AC_MSG_NOTICE([Using field implementation: $set_field]) +AC_MSG_NOTICE([Using bignum implementation: $set_bignum]) +AC_MSG_NOTICE([Using scalar implementation: $set_scalar]) +AC_MSG_NOTICE([Using endomorphism optimizations: $use_endomorphism]) + +AC_CONFIG_HEADERS([src/libsecp256k1-config.h]) +AC_CONFIG_FILES([Makefile libsecp256k1.pc]) +AC_SUBST(SECP_INCLUDES) +AC_SUBST(SECP_LIBS) +AC_SUBST(SECP_TEST_LIBS) +AC_SUBST(SECP_TEST_INCLUDES) +AM_CONDITIONAL([USE_TESTS], [test x"$use_tests" != x"no"]) +AM_CONDITIONAL([USE_BENCHMARK], [test x"$use_benchmark" = x"yes"]) + +dnl make sure nothing new is exported so that we don't break the cache +PKGCONFIG_PATH_TEMP="$PKG_CONFIG_PATH" +unset PKG_CONFIG_PATH +PKG_CONFIG_PATH="$PKGCONFIG_PATH_TEMP" + +AC_OUTPUT diff --git a/src/cryptoconditions/src/include/secp256k1/include/secp256k1.h b/src/cryptoconditions/src/include/secp256k1/include/secp256k1.h new file mode 100644 index 000000000..06afd4c65 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/include/secp256k1.h @@ -0,0 +1,347 @@ +#ifndef _SECP256K1_ +# define _SECP256K1_ + +# ifdef __cplusplus +extern "C" { +# endif + +# if !defined(SECP256K1_GNUC_PREREQ) +# if defined(__GNUC__)&&defined(__GNUC_MINOR__) +# define SECP256K1_GNUC_PREREQ(_maj,_min) \ + ((__GNUC__<<16)+__GNUC_MINOR__>=((_maj)<<16)+(_min)) +# else +# define SECP256K1_GNUC_PREREQ(_maj,_min) 0 +# endif +# endif + +# if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) ) +# if SECP256K1_GNUC_PREREQ(2,7) +# define SECP256K1_INLINE __inline__ +# elif (defined(_MSC_VER)) +# define SECP256K1_INLINE __inline +# else +# define SECP256K1_INLINE +# endif +# else +# define SECP256K1_INLINE inline +# endif + +/**Warning attributes + * NONNULL is not used if SECP256K1_BUILD is set to avoid the compiler optimizing out + * some paranoid null checks. */ +# if defined(__GNUC__) && SECP256K1_GNUC_PREREQ(3, 4) +# define SECP256K1_WARN_UNUSED_RESULT __attribute__ ((__warn_unused_result__)) +# else +# define SECP256K1_WARN_UNUSED_RESULT +# endif +# if !defined(SECP256K1_BUILD) && defined(__GNUC__) && SECP256K1_GNUC_PREREQ(3, 4) +# define SECP256K1_ARG_NONNULL(_x) __attribute__ ((__nonnull__(_x))) +# else +# define SECP256K1_ARG_NONNULL(_x) +# endif + +/** Opaque data structure that holds context information (precomputed tables etc.). + * Only functions that take a pointer to a non-const context require exclusive + * access to it. Multiple functions that take a pointer to a const context may + * run simultaneously. + */ +typedef struct secp256k1_context_struct secp256k1_context_t; + +/** Flags to pass to secp256k1_context_create. */ +# define SECP256K1_CONTEXT_VERIFY (1 << 0) +# define SECP256K1_CONTEXT_SIGN (1 << 1) + +/** Create a secp256k1 context object. + * Returns: a newly created context object. + * In: flags: which parts of the context to initialize. + */ +secp256k1_context_t* secp256k1_context_create( + int flags +) SECP256K1_WARN_UNUSED_RESULT; + +/** Copies a secp256k1 context object. + * Returns: a newly created context object. + * In: ctx: an existing context to copy + */ +secp256k1_context_t* secp256k1_context_clone( + const secp256k1_context_t* ctx +) SECP256K1_WARN_UNUSED_RESULT; + +/** Destroy a secp256k1 context object. + * The context pointer may not be used afterwards. + */ +void secp256k1_context_destroy( + secp256k1_context_t* ctx +) SECP256K1_ARG_NONNULL(1); + +/** Verify an ECDSA signature. + * Returns: 1: correct signature + * 0: incorrect signature + * -1: invalid public key + * -2: invalid signature + * In: ctx: a secp256k1 context object, initialized for verification. + * msg32: the 32-byte message hash being verified (cannot be NULL) + * sig: the signature being verified (cannot be NULL) + * siglen: the length of the signature + * pubkey: the public key to verify with (cannot be NULL) + * pubkeylen: the length of pubkey + */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_verify( + const secp256k1_context_t* ctx, + const unsigned char *msg32, + const unsigned char *sig, + int siglen, + const unsigned char *pubkey, + int pubkeylen +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(5); + +/** A pointer to a function to deterministically generate a nonce. + * Returns: 1 if a nonce was successfully generated. 0 will cause signing to fail. + * In: msg32: the 32-byte message hash being verified (will not be NULL) + * key32: pointer to a 32-byte secret key (will not be NULL) + * attempt: how many iterations we have tried to find a nonce. + * This will almost always be 0, but different attempt values + * are required to result in a different nonce. + * data: Arbitrary data pointer that is passed through. + * Out: nonce32: pointer to a 32-byte array to be filled by the function. + * Except for test cases, this function should compute some cryptographic hash of + * the message, the key and the attempt. + */ +typedef int (*secp256k1_nonce_function_t)( + unsigned char *nonce32, + const unsigned char *msg32, + const unsigned char *key32, + unsigned int attempt, + const void *data +); + +/** An implementation of RFC6979 (using HMAC-SHA256) as nonce generation function. + * If a data pointer is passed, it is assumed to be a pointer to 32 bytes of + * extra entropy. + */ +extern const secp256k1_nonce_function_t secp256k1_nonce_function_rfc6979; + +/** A default safe nonce generation function (currently equal to secp256k1_nonce_function_rfc6979). */ +extern const secp256k1_nonce_function_t secp256k1_nonce_function_default; + + +/** Create an ECDSA signature. + * Returns: 1: signature created + * 0: the nonce generation function failed, the private key was invalid, or there is not + * enough space in the signature (as indicated by siglen). + * In: ctx: pointer to a context object, initialized for signing (cannot be NULL) + * msg32: the 32-byte message hash being signed (cannot be NULL) + * seckey: pointer to a 32-byte secret key (cannot be NULL) + * noncefp:pointer to a nonce generation function. If NULL, secp256k1_nonce_function_default is used + * ndata: pointer to arbitrary data used by the nonce generation function (can be NULL) + * Out: sig: pointer to an array where the signature will be placed (cannot be NULL) + * In/Out: siglen: pointer to an int with the length of sig, which will be updated + * to contain the actual signature length (<=72). + * + * The sig always has an s value in the lower half of the range (From 0x1 + * to 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, + * inclusive), unlike many other implementations. + * With ECDSA a third-party can can forge a second distinct signature + * of the same message given a single initial signature without knowing + * the key by setting s to its additive inverse mod-order, 'flipping' the + * sign of the random point R which is not included in the signature. + * Since the forgery is of the same message this isn't universally + * problematic, but in systems where message malleability or uniqueness + * of signatures is important this can cause issues. This forgery can be + * blocked by all verifiers forcing signers to use a canonical form. The + * lower-S form reduces the size of signatures slightly on average when + * variable length encodings (such as DER) are used and is cheap to + * verify, making it a good choice. Security of always using lower-S is + * assured because anyone can trivially modify a signature after the + * fact to enforce this property. Adjusting it inside the signing + * function avoids the need to re-serialize or have curve specific + * constants outside of the library. By always using a canonical form + * even in applications where it isn't needed it becomes possible to + * impose a requirement later if a need is discovered. + * No other forms of ECDSA malleability are known and none seem likely, + * but there is no formal proof that ECDSA, even with this additional + * restriction, is free of other malleability. Commonly used serialization + * schemes will also accept various non-unique encodings, so care should + * be taken when this property is required for an application. + */ +int secp256k1_ecdsa_sign( + const secp256k1_context_t* ctx, + const unsigned char *msg32, + unsigned char *sig, + int *siglen, + const unsigned char *seckey, + secp256k1_nonce_function_t noncefp, + const void *ndata +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4) SECP256K1_ARG_NONNULL(5); + +/** Create a compact ECDSA signature (64 byte + recovery id). + * Returns: 1: signature created + * 0: the nonce generation function failed, or the secret key was invalid. + * In: ctx: pointer to a context object, initialized for signing (cannot be NULL) + * msg32: the 32-byte message hash being signed (cannot be NULL) + * seckey: pointer to a 32-byte secret key (cannot be NULL) + * noncefp:pointer to a nonce generation function. If NULL, secp256k1_nonce_function_default is used + * ndata: pointer to arbitrary data used by the nonce generation function (can be NULL) + * Out: sig: pointer to a 64-byte array where the signature will be placed (cannot be NULL) + * In case 0 is returned, the returned signature length will be zero. + * recid: pointer to an int, which will be updated to contain the recovery id (can be NULL) + */ +int secp256k1_ecdsa_sign_compact( + const secp256k1_context_t* ctx, + const unsigned char *msg32, + unsigned char *sig64, + const unsigned char *seckey, + secp256k1_nonce_function_t noncefp, + const void *ndata, + int *recid +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); + +/** Recover an ECDSA public key from a compact signature. + * Returns: 1: public key successfully recovered (which guarantees a correct signature). + * 0: otherwise. + * In: ctx: pointer to a context object, initialized for verification (cannot be NULL) + * msg32: the 32-byte message hash assumed to be signed (cannot be NULL) + * sig64: signature as 64 byte array (cannot be NULL) + * compressed: whether to recover a compressed or uncompressed pubkey + * recid: the recovery id (0-3, as returned by ecdsa_sign_compact) + * Out: pubkey: pointer to a 33 or 65 byte array to put the pubkey (cannot be NULL) + * pubkeylen: pointer to an int that will contain the pubkey length (cannot be NULL) + */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_recover_compact( + const secp256k1_context_t* ctx, + const unsigned char *msg32, + const unsigned char *sig64, + unsigned char *pubkey, + int *pubkeylen, + int compressed, + int recid +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4) SECP256K1_ARG_NONNULL(5); + +/** Verify an ECDSA secret key. + * Returns: 1: secret key is valid + * 0: secret key is invalid + * In: ctx: pointer to a context object (cannot be NULL) + * seckey: pointer to a 32-byte secret key (cannot be NULL) + */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_seckey_verify( + const secp256k1_context_t* ctx, + const unsigned char *seckey +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2); + +/** Just validate a public key. + * Returns: 1: public key is valid + * 0: public key is invalid + * In: ctx: pointer to a context object (cannot be NULL) + * pubkey: pointer to a 33-byte or 65-byte public key (cannot be NULL). + * pubkeylen: length of pubkey + */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_verify( + const secp256k1_context_t* ctx, + const unsigned char *pubkey, + int pubkeylen +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2); + +/** Compute the public key for a secret key. + * In: ctx: pointer to a context object, initialized for signing (cannot be NULL) + * compressed: whether the computed public key should be compressed + * seckey: pointer to a 32-byte private key (cannot be NULL) + * Out: pubkey: pointer to a 33-byte (if compressed) or 65-byte (if uncompressed) + * area to store the public key (cannot be NULL) + * pubkeylen: pointer to int that will be updated to contains the pubkey's + * length (cannot be NULL) + * Returns: 1: secret was valid, public key stores + * 0: secret was invalid, try again + */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_create( + const secp256k1_context_t* ctx, + unsigned char *pubkey, + int *pubkeylen, + const unsigned char *seckey, + int compressed +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); + +/** Decompress a public key. + * In: ctx: pointer to a context object (cannot be NULL) + * In/Out: pubkey: pointer to a 65-byte array to put the decompressed public key. + * It must contain a 33-byte or 65-byte public key already (cannot be NULL) + * pubkeylen: pointer to the size of the public key pointed to by pubkey (cannot be NULL) + * It will be updated to reflect the new size. + * Returns: 0: pubkey was invalid + * 1: pubkey was valid, and was replaced with its decompressed version + */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_decompress( + const secp256k1_context_t* ctx, + unsigned char *pubkey, + int *pubkeylen +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +/** Export a private key in DER format. + * In: ctx: pointer to a context object, initialized for signing (cannot be NULL) + */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_export( + const secp256k1_context_t* ctx, + const unsigned char *seckey, + unsigned char *privkey, + int *privkeylen, + int compressed +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); + +/** Import a private key in DER format. */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_import( + const secp256k1_context_t* ctx, + unsigned char *seckey, + const unsigned char *privkey, + int privkeylen +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +/** Tweak a private key by adding tweak to it. */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_add( + const secp256k1_context_t* ctx, + unsigned char *seckey, + const unsigned char *tweak +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +/** Tweak a public key by adding tweak times the generator to it. + * In: ctx: pointer to a context object, initialized for verification (cannot be NULL) + */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_add( + const secp256k1_context_t* ctx, + unsigned char *pubkey, + int pubkeylen, + const unsigned char *tweak +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(4); + +/** Tweak a private key by multiplying it with tweak. */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_mul( + const secp256k1_context_t* ctx, + unsigned char *seckey, + const unsigned char *tweak +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +/** Tweak a public key by multiplying it with tweak. + * In: ctx: pointer to a context object, initialized for verification (cannot be NULL) + */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_mul( + const secp256k1_context_t* ctx, + unsigned char *pubkey, + int pubkeylen, + const unsigned char *tweak +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(4); + +/** Updates the context randomization. + * Returns: 1: randomization successfully updated + * 0: error + * In: ctx: pointer to a context object (cannot be NULL) + * seed32: pointer to a 32-byte random seed (NULL resets to initial state) + */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_context_randomize( + secp256k1_context_t* ctx, + const unsigned char *seed32 +) SECP256K1_ARG_NONNULL(1); + + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/libsecp256k1.pc.in b/src/cryptoconditions/src/include/secp256k1/libsecp256k1.pc.in new file mode 100644 index 000000000..1c72dd000 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/libsecp256k1.pc.in @@ -0,0 +1,13 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: libsecp256k1 +Description: Optimized C library for EC operations on curve secp256k1 +URL: https://github.com/bitcoin/secp256k1 +Version: @PACKAGE_VERSION@ +Cflags: -I${includedir} +Libs.private: @SECP_LIBS@ +Libs: -L${libdir} -lsecp256k1 + diff --git a/src/cryptoconditions/src/include/secp256k1/obj/.gitignore b/src/cryptoconditions/src/include/secp256k1/obj/.gitignore new file mode 100644 index 000000000..e69de29bb diff --git a/src/cryptoconditions/src/include/secp256k1/src/bench.h b/src/cryptoconditions/src/include/secp256k1/src/bench.h new file mode 100644 index 000000000..db5f68cee --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/bench.h @@ -0,0 +1,56 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_BENCH_H_ +#define _SECP256K1_BENCH_H_ + +#include +#include +#include "sys/time.h" + +static double gettimedouble(void) { + struct timeval tv; + gettimeofday(&tv, NULL); + return tv.tv_usec * 0.000001 + tv.tv_sec; +} + +void print_number(double x) { + double y = x; + int c = 0; + if (y < 0.0) y = -y; + while (y < 100.0) { + y *= 10.0; + c++; + } + printf("%.*f", c, x); +} + +void run_benchmark(char *name, void (*benchmark)(void*), void (*setup)(void*), void (*teardown)(void*), void* data, int count, int iter) { + int i; + double min = HUGE_VAL; + double sum = 0.0; + double max = 0.0; + for (i = 0; i < count; i++) { + double begin, total; + if (setup) setup(data); + begin = gettimedouble(); + benchmark(data); + total = gettimedouble() - begin; + if (teardown) teardown(data); + if (total < min) min = total; + if (total > max) max = total; + sum += total; + } + printf("%s: min ", name); + print_number(min * 1000000.0 / iter); + printf("us / avg "); + print_number((sum / count) * 1000000.0 / iter); + printf("us / max "); + print_number(max * 1000000.0 / iter); + printf("us\n"); +} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/bench_internal.c b/src/cryptoconditions/src/include/secp256k1/src/bench_internal.c new file mode 100644 index 000000000..a960549b9 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/bench_internal.c @@ -0,0 +1,318 @@ +/********************************************************************** + * Copyright (c) 2014-2015 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ +#include + +#include "include/secp256k1.h" + +#include "util.h" +#include "hash_impl.h" +#include "num_impl.h" +#include "field_impl.h" +#include "group_impl.h" +#include "scalar_impl.h" +#include "ecmult_impl.h" +#include "bench.h" + +typedef struct { + secp256k1_scalar_t scalar_x, scalar_y; + secp256k1_fe_t fe_x, fe_y; + secp256k1_ge_t ge_x, ge_y; + secp256k1_gej_t gej_x, gej_y; + unsigned char data[32]; + int wnaf[256]; +} bench_inv_t; + +void bench_setup(void* arg) { + bench_inv_t *data = (bench_inv_t*)arg; + + static const unsigned char init_x[32] = { + 0x02, 0x03, 0x05, 0x07, 0x0b, 0x0d, 0x11, 0x13, + 0x17, 0x1d, 0x1f, 0x25, 0x29, 0x2b, 0x2f, 0x35, + 0x3b, 0x3d, 0x43, 0x47, 0x49, 0x4f, 0x53, 0x59, + 0x61, 0x65, 0x67, 0x6b, 0x6d, 0x71, 0x7f, 0x83 + }; + + static const unsigned char init_y[32] = { + 0x82, 0x83, 0x85, 0x87, 0x8b, 0x8d, 0x81, 0x83, + 0x97, 0xad, 0xaf, 0xb5, 0xb9, 0xbb, 0xbf, 0xc5, + 0xdb, 0xdd, 0xe3, 0xe7, 0xe9, 0xef, 0xf3, 0xf9, + 0x11, 0x15, 0x17, 0x1b, 0x1d, 0xb1, 0xbf, 0xd3 + }; + + secp256k1_scalar_set_b32(&data->scalar_x, init_x, NULL); + secp256k1_scalar_set_b32(&data->scalar_y, init_y, NULL); + secp256k1_fe_set_b32(&data->fe_x, init_x); + secp256k1_fe_set_b32(&data->fe_y, init_y); + CHECK(secp256k1_ge_set_xo_var(&data->ge_x, &data->fe_x, 0)); + CHECK(secp256k1_ge_set_xo_var(&data->ge_y, &data->fe_y, 1)); + secp256k1_gej_set_ge(&data->gej_x, &data->ge_x); + secp256k1_gej_set_ge(&data->gej_y, &data->ge_y); + memcpy(data->data, init_x, 32); +} + +void bench_scalar_add(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 2000000; i++) { + secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); + } +} + +void bench_scalar_negate(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 2000000; i++) { + secp256k1_scalar_negate(&data->scalar_x, &data->scalar_x); + } +} + +void bench_scalar_sqr(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 200000; i++) { + secp256k1_scalar_sqr(&data->scalar_x, &data->scalar_x); + } +} + +void bench_scalar_mul(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 200000; i++) { + secp256k1_scalar_mul(&data->scalar_x, &data->scalar_x, &data->scalar_y); + } +} + +#ifdef USE_ENDOMORPHISM +void bench_scalar_split(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 20000; i++) { + secp256k1_scalar_t l, r; + secp256k1_scalar_split_lambda_var(&l, &r, &data->scalar_x); + secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); + } +} +#endif + +void bench_scalar_inverse(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 2000; i++) { + secp256k1_scalar_inverse(&data->scalar_x, &data->scalar_x); + secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); + } +} + +void bench_scalar_inverse_var(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 2000; i++) { + secp256k1_scalar_inverse_var(&data->scalar_x, &data->scalar_x); + secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); + } +} + +void bench_field_normalize(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 2000000; i++) { + secp256k1_fe_normalize(&data->fe_x); + } +} + +void bench_field_normalize_weak(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 2000000; i++) { + secp256k1_fe_normalize_weak(&data->fe_x); + } +} + +void bench_field_mul(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 200000; i++) { + secp256k1_fe_mul(&data->fe_x, &data->fe_x, &data->fe_y); + } +} + +void bench_field_sqr(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 200000; i++) { + secp256k1_fe_sqr(&data->fe_x, &data->fe_x); + } +} + +void bench_field_inverse(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 20000; i++) { + secp256k1_fe_inv(&data->fe_x, &data->fe_x); + secp256k1_fe_add(&data->fe_x, &data->fe_y); + } +} + +void bench_field_inverse_var(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 20000; i++) { + secp256k1_fe_inv_var(&data->fe_x, &data->fe_x); + secp256k1_fe_add(&data->fe_x, &data->fe_y); + } +} + +void bench_field_sqrt_var(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 20000; i++) { + secp256k1_fe_sqrt_var(&data->fe_x, &data->fe_x); + secp256k1_fe_add(&data->fe_x, &data->fe_y); + } +} + +void bench_group_double_var(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 200000; i++) { + secp256k1_gej_double_var(&data->gej_x, &data->gej_x); + } +} + +void bench_group_add_var(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 200000; i++) { + secp256k1_gej_add_var(&data->gej_x, &data->gej_x, &data->gej_y); + } +} + +void bench_group_add_affine(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 200000; i++) { + secp256k1_gej_add_ge(&data->gej_x, &data->gej_x, &data->ge_y); + } +} + +void bench_group_add_affine_var(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 200000; i++) { + secp256k1_gej_add_ge_var(&data->gej_x, &data->gej_x, &data->ge_y); + } +} + +void bench_ecmult_wnaf(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 20000; i++) { + secp256k1_ecmult_wnaf(data->wnaf, &data->scalar_x, WINDOW_A); + secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); + } +} + + +void bench_sha256(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + secp256k1_sha256_t sha; + + for (i = 0; i < 20000; i++) { + secp256k1_sha256_initialize(&sha); + secp256k1_sha256_write(&sha, data->data, 32); + secp256k1_sha256_finalize(&sha, data->data); + } +} + +void bench_hmac_sha256(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + secp256k1_hmac_sha256_t hmac; + + for (i = 0; i < 20000; i++) { + secp256k1_hmac_sha256_initialize(&hmac, data->data, 32); + secp256k1_hmac_sha256_write(&hmac, data->data, 32); + secp256k1_hmac_sha256_finalize(&hmac, data->data); + } +} + +void bench_rfc6979_hmac_sha256(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + secp256k1_rfc6979_hmac_sha256_t rng; + + for (i = 0; i < 20000; i++) { + secp256k1_rfc6979_hmac_sha256_initialize(&rng, data->data, 32, data->data, 32, NULL, 0); + secp256k1_rfc6979_hmac_sha256_generate(&rng, data->data, 32); + } +} + + +int have_flag(int argc, char** argv, char *flag) { + char** argm = argv + argc; + argv++; + if (argv == argm) { + return 1; + } + while (argv != NULL && argv != argm) { + if (strcmp(*argv, flag) == 0) return 1; + argv++; + } + return 0; +} + +int main(int argc, char **argv) { + bench_inv_t data; + if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "add")) run_benchmark("scalar_add", bench_scalar_add, bench_setup, NULL, &data, 10, 2000000); + if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "negate")) run_benchmark("scalar_negate", bench_scalar_negate, bench_setup, NULL, &data, 10, 2000000); + if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "sqr")) run_benchmark("scalar_sqr", bench_scalar_sqr, bench_setup, NULL, &data, 10, 200000); + if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "mul")) run_benchmark("scalar_mul", bench_scalar_mul, bench_setup, NULL, &data, 10, 200000); +#ifdef USE_ENDOMORPHISM + if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "split")) run_benchmark("scalar_split", bench_scalar_split, bench_setup, NULL, &data, 10, 20000); +#endif + if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "inverse")) run_benchmark("scalar_inverse", bench_scalar_inverse, bench_setup, NULL, &data, 10, 2000); + if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "inverse")) run_benchmark("scalar_inverse_var", bench_scalar_inverse_var, bench_setup, NULL, &data, 10, 2000); + + if (have_flag(argc, argv, "field") || have_flag(argc, argv, "normalize")) run_benchmark("field_normalize", bench_field_normalize, bench_setup, NULL, &data, 10, 2000000); + if (have_flag(argc, argv, "field") || have_flag(argc, argv, "normalize")) run_benchmark("field_normalize_weak", bench_field_normalize_weak, bench_setup, NULL, &data, 10, 2000000); + if (have_flag(argc, argv, "field") || have_flag(argc, argv, "sqr")) run_benchmark("field_sqr", bench_field_sqr, bench_setup, NULL, &data, 10, 200000); + if (have_flag(argc, argv, "field") || have_flag(argc, argv, "mul")) run_benchmark("field_mul", bench_field_mul, bench_setup, NULL, &data, 10, 200000); + if (have_flag(argc, argv, "field") || have_flag(argc, argv, "inverse")) run_benchmark("field_inverse", bench_field_inverse, bench_setup, NULL, &data, 10, 20000); + if (have_flag(argc, argv, "field") || have_flag(argc, argv, "inverse")) run_benchmark("field_inverse_var", bench_field_inverse_var, bench_setup, NULL, &data, 10, 20000); + if (have_flag(argc, argv, "field") || have_flag(argc, argv, "sqrt")) run_benchmark("field_sqrt_var", bench_field_sqrt_var, bench_setup, NULL, &data, 10, 20000); + + if (have_flag(argc, argv, "group") || have_flag(argc, argv, "double")) run_benchmark("group_double_var", bench_group_double_var, bench_setup, NULL, &data, 10, 200000); + if (have_flag(argc, argv, "group") || have_flag(argc, argv, "add")) run_benchmark("group_add_var", bench_group_add_var, bench_setup, NULL, &data, 10, 200000); + if (have_flag(argc, argv, "group") || have_flag(argc, argv, "add")) run_benchmark("group_add_affine", bench_group_add_affine, bench_setup, NULL, &data, 10, 200000); + if (have_flag(argc, argv, "group") || have_flag(argc, argv, "add")) run_benchmark("group_add_affine_var", bench_group_add_affine_var, bench_setup, NULL, &data, 10, 200000); + + if (have_flag(argc, argv, "ecmult") || have_flag(argc, argv, "wnaf")) run_benchmark("ecmult_wnaf", bench_ecmult_wnaf, bench_setup, NULL, &data, 10, 20000); + + if (have_flag(argc, argv, "hash") || have_flag(argc, argv, "sha256")) run_benchmark("hash_sha256", bench_sha256, bench_setup, NULL, &data, 10, 20000); + if (have_flag(argc, argv, "hash") || have_flag(argc, argv, "hmac")) run_benchmark("hash_hmac_sha256", bench_hmac_sha256, bench_setup, NULL, &data, 10, 20000); + if (have_flag(argc, argv, "hash") || have_flag(argc, argv, "rng6979")) run_benchmark("hash_rfc6979_hmac_sha256", bench_rfc6979_hmac_sha256, bench_setup, NULL, &data, 10, 20000); + return 0; +} diff --git a/src/cryptoconditions/src/include/secp256k1/src/bench_recover.c b/src/cryptoconditions/src/include/secp256k1/src/bench_recover.c new file mode 100644 index 000000000..56faed11a --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/bench_recover.c @@ -0,0 +1,51 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#include "include/secp256k1.h" +#include "util.h" +#include "bench.h" + +typedef struct { + secp256k1_context_t *ctx; + unsigned char msg[32]; + unsigned char sig[64]; +} bench_recover_t; + +void bench_recover(void* arg) { + int i; + bench_recover_t *data = (bench_recover_t*)arg; + unsigned char pubkey[33]; + + for (i = 0; i < 20000; i++) { + int j; + int pubkeylen = 33; + CHECK(secp256k1_ecdsa_recover_compact(data->ctx, data->msg, data->sig, pubkey, &pubkeylen, 1, i % 2)); + for (j = 0; j < 32; j++) { + data->sig[j + 32] = data->msg[j]; /* Move former message to S. */ + data->msg[j] = data->sig[j]; /* Move former R to message. */ + data->sig[j] = pubkey[j + 1]; /* Move recovered pubkey X coordinate to R (which must be a valid X coordinate). */ + } + } +} + +void bench_recover_setup(void* arg) { + int i; + bench_recover_t *data = (bench_recover_t*)arg; + + for (i = 0; i < 32; i++) data->msg[i] = 1 + i; + for (i = 0; i < 64; i++) data->sig[i] = 65 + i; +} + +int main(void) { + bench_recover_t data; + + data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY); + + run_benchmark("ecdsa_recover", bench_recover, bench_recover_setup, NULL, &data, 10, 20000); + + secp256k1_context_destroy(data.ctx); + return 0; +} diff --git a/src/cryptoconditions/src/include/secp256k1/src/bench_sign.c b/src/cryptoconditions/src/include/secp256k1/src/bench_sign.c new file mode 100644 index 000000000..072a37af5 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/bench_sign.c @@ -0,0 +1,50 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#include "include/secp256k1.h" +#include "util.h" +#include "bench.h" + +typedef struct { + secp256k1_context_t* ctx; + unsigned char msg[32]; + unsigned char key[32]; +} bench_sign_t; + +static void bench_sign_setup(void* arg) { + int i; + bench_sign_t *data = (bench_sign_t*)arg; + + for (i = 0; i < 32; i++) data->msg[i] = i + 1; + for (i = 0; i < 32; i++) data->key[i] = i + 65; +} + +static void bench_sign(void* arg) { + int i; + bench_sign_t *data = (bench_sign_t*)arg; + + unsigned char sig[64]; + for (i = 0; i < 20000; i++) { + int j; + int recid = 0; + CHECK(secp256k1_ecdsa_sign_compact(data->ctx, data->msg, sig, data->key, NULL, NULL, &recid)); + for (j = 0; j < 32; j++) { + data->msg[j] = sig[j]; /* Move former R to message. */ + data->key[j] = sig[j + 32]; /* Move former S to key. */ + } + } +} + +int main(void) { + bench_sign_t data; + + data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN); + + run_benchmark("ecdsa_sign", bench_sign, bench_sign_setup, NULL, &data, 10, 20000); + + secp256k1_context_destroy(data.ctx); + return 0; +} diff --git a/src/cryptoconditions/src/include/secp256k1/src/bench_verify.c b/src/cryptoconditions/src/include/secp256k1/src/bench_verify.c new file mode 100644 index 000000000..c8c82752c --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/bench_verify.c @@ -0,0 +1,56 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#include +#include + +#include "include/secp256k1.h" +#include "util.h" +#include "bench.h" + +typedef struct { + secp256k1_context_t *ctx; + unsigned char msg[32]; + unsigned char key[32]; + unsigned char sig[72]; + int siglen; + unsigned char pubkey[33]; + int pubkeylen; +} benchmark_verify_t; + +static void benchmark_verify(void* arg) { + int i; + benchmark_verify_t* data = (benchmark_verify_t*)arg; + + for (i = 0; i < 20000; i++) { + data->sig[data->siglen - 1] ^= (i & 0xFF); + data->sig[data->siglen - 2] ^= ((i >> 8) & 0xFF); + data->sig[data->siglen - 3] ^= ((i >> 16) & 0xFF); + CHECK(secp256k1_ecdsa_verify(data->ctx, data->msg, data->sig, data->siglen, data->pubkey, data->pubkeylen) == (i == 0)); + data->sig[data->siglen - 1] ^= (i & 0xFF); + data->sig[data->siglen - 2] ^= ((i >> 8) & 0xFF); + data->sig[data->siglen - 3] ^= ((i >> 16) & 0xFF); + } +} + +int main(void) { + int i; + benchmark_verify_t data; + + data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); + + for (i = 0; i < 32; i++) data.msg[i] = 1 + i; + for (i = 0; i < 32; i++) data.key[i] = 33 + i; + data.siglen = 72; + secp256k1_ecdsa_sign(data.ctx, data.msg, data.sig, &data.siglen, data.key, NULL, NULL); + data.pubkeylen = 33; + CHECK(secp256k1_ec_pubkey_create(data.ctx, data.pubkey, &data.pubkeylen, data.key, 1)); + + run_benchmark("ecdsa_verify", benchmark_verify, NULL, NULL, &data, 10, 20000); + + secp256k1_context_destroy(data.ctx); + return 0; +} diff --git a/src/cryptoconditions/src/include/secp256k1/src/ecdsa.h b/src/cryptoconditions/src/include/secp256k1/src/ecdsa.h new file mode 100644 index 000000000..4ef78e8af --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/ecdsa.h @@ -0,0 +1,24 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_ECDSA_ +#define _SECP256K1_ECDSA_ + +#include "scalar.h" +#include "group.h" +#include "ecmult.h" + +typedef struct { + secp256k1_scalar_t r, s; +} secp256k1_ecdsa_sig_t; + +static int secp256k1_ecdsa_sig_parse(secp256k1_ecdsa_sig_t *r, const unsigned char *sig, int size); +static int secp256k1_ecdsa_sig_serialize(unsigned char *sig, int *size, const secp256k1_ecdsa_sig_t *a); +static int secp256k1_ecdsa_sig_verify(const secp256k1_ecmult_context_t *ctx, const secp256k1_ecdsa_sig_t *sig, const secp256k1_ge_t *pubkey, const secp256k1_scalar_t *message); +static int secp256k1_ecdsa_sig_sign(const secp256k1_ecmult_gen_context_t *ctx, secp256k1_ecdsa_sig_t *sig, const secp256k1_scalar_t *seckey, const secp256k1_scalar_t *message, const secp256k1_scalar_t *nonce, int *recid); +static int secp256k1_ecdsa_sig_recover(const secp256k1_ecmult_context_t *ctx, const secp256k1_ecdsa_sig_t *sig, secp256k1_ge_t *pubkey, const secp256k1_scalar_t *message, int recid); + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/ecdsa_impl.h b/src/cryptoconditions/src/include/secp256k1/src/ecdsa_impl.h new file mode 100644 index 000000000..8d97db946 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/ecdsa_impl.h @@ -0,0 +1,271 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + + +#ifndef _SECP256K1_ECDSA_IMPL_H_ +#define _SECP256K1_ECDSA_IMPL_H_ + +#include "scalar.h" +#include "field.h" +#include "group.h" +#include "ecmult.h" +#include "ecmult_gen.h" +#include "ecdsa.h" + +/** Group order for secp256k1 defined as 'n' in "Standards for Efficient Cryptography" (SEC2) 2.7.1 + * sage: for t in xrange(1023, -1, -1): + * .. p = 2**256 - 2**32 - t + * .. if p.is_prime(): + * .. print '%x'%p + * .. break + * 'fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f' + * sage: a = 0 + * sage: b = 7 + * sage: F = FiniteField (p) + * sage: '%x' % (EllipticCurve ([F (a), F (b)]).order()) + * 'fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141' + */ +static const secp256k1_fe_t secp256k1_ecdsa_const_order_as_fe = SECP256K1_FE_CONST( + 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFEUL, + 0xBAAEDCE6UL, 0xAF48A03BUL, 0xBFD25E8CUL, 0xD0364141UL +); + +/** Difference between field and order, values 'p' and 'n' values defined in + * "Standards for Efficient Cryptography" (SEC2) 2.7.1. + * sage: p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F + * sage: a = 0 + * sage: b = 7 + * sage: F = FiniteField (p) + * sage: '%x' % (p - EllipticCurve ([F (a), F (b)]).order()) + * '14551231950b75fc4402da1722fc9baee' + */ +static const secp256k1_fe_t secp256k1_ecdsa_const_p_minus_order = SECP256K1_FE_CONST( + 0, 0, 0, 1, 0x45512319UL, 0x50B75FC4UL, 0x402DA172UL, 0x2FC9BAEEUL +); + +static int secp256k1_ecdsa_sig_parse(secp256k1_ecdsa_sig_t *r, const unsigned char *sig, int size) { + + /* libscott had to add this to get this version of the library to read compact sigs */ + int overflow = 0; + if (size == 64) { + secp256k1_scalar_set_b32(&r->r, sig, &overflow); + secp256k1_scalar_set_b32(&r->s, sig+32, &overflow); + return 1; + } + + unsigned char ra[32] = {0}, sa[32] = {0}; + const unsigned char *rp; + const unsigned char *sp; + int lenr; + int lens; + if (sig[0] != 0x30) { + return 0; + } + lenr = sig[3]; + if (5+lenr >= size) { + return 0; + } + lens = sig[lenr+5]; + if (sig[1] != lenr+lens+4) { + return 0; + } + if (lenr+lens+6 > size) { + return 0; + } + if (sig[2] != 0x02) { + return 0; + } + if (lenr == 0) { + return 0; + } + if (sig[lenr+4] != 0x02) { + return 0; + } + if (lens == 0) { + return 0; + } + sp = sig + 6 + lenr; + while (lens > 0 && sp[0] == 0) { + lens--; + sp++; + } + if (lens > 32) { + return 0; + } + rp = sig + 4; + while (lenr > 0 && rp[0] == 0) { + lenr--; + rp++; + } + if (lenr > 32) { + return 0; + } + memcpy(ra + 32 - lenr, rp, lenr); + memcpy(sa + 32 - lens, sp, lens); + overflow = 0; + secp256k1_scalar_set_b32(&r->r, ra, &overflow); + if (overflow) { + return 0; + } + secp256k1_scalar_set_b32(&r->s, sa, &overflow); + if (overflow) { + return 0; + } + return 1; +} + +static int secp256k1_ecdsa_sig_serialize(unsigned char *sig, int *size, const secp256k1_ecdsa_sig_t *a) { + unsigned char r[33] = {0}, s[33] = {0}; + unsigned char *rp = r, *sp = s; + int lenR = 33, lenS = 33; + secp256k1_scalar_get_b32(&r[1], &a->r); + secp256k1_scalar_get_b32(&s[1], &a->s); + while (lenR > 1 && rp[0] == 0 && rp[1] < 0x80) { lenR--; rp++; } + while (lenS > 1 && sp[0] == 0 && sp[1] < 0x80) { lenS--; sp++; } + if (*size < 6+lenS+lenR) { + return 0; + } + *size = 6 + lenS + lenR; + sig[0] = 0x30; + sig[1] = 4 + lenS + lenR; + sig[2] = 0x02; + sig[3] = lenR; + memcpy(sig+4, rp, lenR); + sig[4+lenR] = 0x02; + sig[5+lenR] = lenS; + memcpy(sig+lenR+6, sp, lenS); + return 1; +} + +static int secp256k1_ecdsa_sig_verify(const secp256k1_ecmult_context_t *ctx, const secp256k1_ecdsa_sig_t *sig, const secp256k1_ge_t *pubkey, const secp256k1_scalar_t *message) { + unsigned char c[32]; + secp256k1_scalar_t sn, u1, u2; + secp256k1_fe_t xr; + secp256k1_gej_t pubkeyj; + secp256k1_gej_t pr; + + if (secp256k1_scalar_is_zero(&sig->r) || secp256k1_scalar_is_zero(&sig->s)) { + return 0; + } + + secp256k1_scalar_inverse_var(&sn, &sig->s); + secp256k1_scalar_mul(&u1, &sn, message); + secp256k1_scalar_mul(&u2, &sn, &sig->r); + secp256k1_gej_set_ge(&pubkeyj, pubkey); + secp256k1_ecmult(ctx, &pr, &pubkeyj, &u2, &u1); + if (secp256k1_gej_is_infinity(&pr)) { + return 0; + } + secp256k1_scalar_get_b32(c, &sig->r); + secp256k1_fe_set_b32(&xr, c); + + /** We now have the recomputed R point in pr, and its claimed x coordinate (modulo n) + * in xr. Naively, we would extract the x coordinate from pr (requiring a inversion modulo p), + * compute the remainder modulo n, and compare it to xr. However: + * + * xr == X(pr) mod n + * <=> exists h. (xr + h * n < p && xr + h * n == X(pr)) + * [Since 2 * n > p, h can only be 0 or 1] + * <=> (xr == X(pr)) || (xr + n < p && xr + n == X(pr)) + * [In Jacobian coordinates, X(pr) is pr.x / pr.z^2 mod p] + * <=> (xr == pr.x / pr.z^2 mod p) || (xr + n < p && xr + n == pr.x / pr.z^2 mod p) + * [Multiplying both sides of the equations by pr.z^2 mod p] + * <=> (xr * pr.z^2 mod p == pr.x) || (xr + n < p && (xr + n) * pr.z^2 mod p == pr.x) + * + * Thus, we can avoid the inversion, but we have to check both cases separately. + * secp256k1_gej_eq_x implements the (xr * pr.z^2 mod p == pr.x) test. + */ + if (secp256k1_gej_eq_x_var(&xr, &pr)) { + /* xr.x == xr * xr.z^2 mod p, so the signature is valid. */ + return 1; + } + if (secp256k1_fe_cmp_var(&xr, &secp256k1_ecdsa_const_p_minus_order) >= 0) { + /* xr + p >= n, so we can skip testing the second case. */ + return 0; + } + secp256k1_fe_add(&xr, &secp256k1_ecdsa_const_order_as_fe); + if (secp256k1_gej_eq_x_var(&xr, &pr)) { + /* (xr + n) * pr.z^2 mod p == pr.x, so the signature is valid. */ + return 1; + } + return 0; +} + +static int secp256k1_ecdsa_sig_recover(const secp256k1_ecmult_context_t *ctx, const secp256k1_ecdsa_sig_t *sig, secp256k1_ge_t *pubkey, const secp256k1_scalar_t *message, int recid) { + unsigned char brx[32]; + secp256k1_fe_t fx; + secp256k1_ge_t x; + secp256k1_gej_t xj; + secp256k1_scalar_t rn, u1, u2; + secp256k1_gej_t qj; + + if (secp256k1_scalar_is_zero(&sig->r) || secp256k1_scalar_is_zero(&sig->s)) { + return 0; + } + + secp256k1_scalar_get_b32(brx, &sig->r); + VERIFY_CHECK(secp256k1_fe_set_b32(&fx, brx)); /* brx comes from a scalar, so is less than the order; certainly less than p */ + if (recid & 2) { + if (secp256k1_fe_cmp_var(&fx, &secp256k1_ecdsa_const_p_minus_order) >= 0) { + return 0; + } + secp256k1_fe_add(&fx, &secp256k1_ecdsa_const_order_as_fe); + } + if (!secp256k1_ge_set_xo_var(&x, &fx, recid & 1)) { + return 0; + } + secp256k1_gej_set_ge(&xj, &x); + secp256k1_scalar_inverse_var(&rn, &sig->r); + secp256k1_scalar_mul(&u1, &rn, message); + secp256k1_scalar_negate(&u1, &u1); + secp256k1_scalar_mul(&u2, &rn, &sig->s); + secp256k1_ecmult(ctx, &qj, &xj, &u2, &u1); + secp256k1_ge_set_gej_var(pubkey, &qj); + return !secp256k1_gej_is_infinity(&qj); +} + +static int secp256k1_ecdsa_sig_sign(const secp256k1_ecmult_gen_context_t *ctx, secp256k1_ecdsa_sig_t *sig, const secp256k1_scalar_t *seckey, const secp256k1_scalar_t *message, const secp256k1_scalar_t *nonce, int *recid) { + unsigned char b[32]; + secp256k1_gej_t rp; + secp256k1_ge_t r; + secp256k1_scalar_t n; + int overflow = 0; + + secp256k1_ecmult_gen(ctx, &rp, nonce); + secp256k1_ge_set_gej(&r, &rp); + secp256k1_fe_normalize(&r.x); + secp256k1_fe_normalize(&r.y); + secp256k1_fe_get_b32(b, &r.x); + secp256k1_scalar_set_b32(&sig->r, b, &overflow); + if (secp256k1_scalar_is_zero(&sig->r)) { + /* P.x = order is on the curve, so technically sig->r could end up zero, which would be an invalid signature. */ + secp256k1_gej_clear(&rp); + secp256k1_ge_clear(&r); + return 0; + } + if (recid) { + *recid = (overflow ? 2 : 0) | (secp256k1_fe_is_odd(&r.y) ? 1 : 0); + } + secp256k1_scalar_mul(&n, &sig->r, seckey); + secp256k1_scalar_add(&n, &n, message); + secp256k1_scalar_inverse(&sig->s, nonce); + secp256k1_scalar_mul(&sig->s, &sig->s, &n); + secp256k1_scalar_clear(&n); + secp256k1_gej_clear(&rp); + secp256k1_ge_clear(&r); + if (secp256k1_scalar_is_zero(&sig->s)) { + return 0; + } + if (secp256k1_scalar_is_high(&sig->s)) { + secp256k1_scalar_negate(&sig->s, &sig->s); + if (recid) { + *recid ^= 1; + } + } + return 1; +} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/eckey.h b/src/cryptoconditions/src/include/secp256k1/src/eckey.h new file mode 100644 index 000000000..53b818485 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/eckey.h @@ -0,0 +1,26 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_ECKEY_ +#define _SECP256K1_ECKEY_ + +#include "group.h" +#include "scalar.h" +#include "ecmult.h" +#include "ecmult_gen.h" + +static int secp256k1_eckey_pubkey_parse(secp256k1_ge_t *elem, const unsigned char *pub, int size); +static int secp256k1_eckey_pubkey_serialize(secp256k1_ge_t *elem, unsigned char *pub, int *size, int compressed); + +static int secp256k1_eckey_privkey_parse(secp256k1_scalar_t *key, const unsigned char *privkey, int privkeylen); +static int secp256k1_eckey_privkey_serialize(const secp256k1_ecmult_gen_context_t *ctx, unsigned char *privkey, int *privkeylen, const secp256k1_scalar_t *key, int compressed); + +static int secp256k1_eckey_privkey_tweak_add(secp256k1_scalar_t *key, const secp256k1_scalar_t *tweak); +static int secp256k1_eckey_pubkey_tweak_add(const secp256k1_ecmult_context_t *ctx, secp256k1_ge_t *key, const secp256k1_scalar_t *tweak); +static int secp256k1_eckey_privkey_tweak_mul(secp256k1_scalar_t *key, const secp256k1_scalar_t *tweak); +static int secp256k1_eckey_pubkey_tweak_mul(const secp256k1_ecmult_context_t *ctx, secp256k1_ge_t *key, const secp256k1_scalar_t *tweak); + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/eckey_impl.h b/src/cryptoconditions/src/include/secp256k1/src/eckey_impl.h new file mode 100644 index 000000000..a332bd34e --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/eckey_impl.h @@ -0,0 +1,202 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_ECKEY_IMPL_H_ +#define _SECP256K1_ECKEY_IMPL_H_ + +#include "eckey.h" + +#include "scalar.h" +#include "field.h" +#include "group.h" +#include "ecmult_gen.h" + +static int secp256k1_eckey_pubkey_parse(secp256k1_ge_t *elem, const unsigned char *pub, int size) { + if (size == 33 && (pub[0] == 0x02 || pub[0] == 0x03)) { + secp256k1_fe_t x; + return secp256k1_fe_set_b32(&x, pub+1) && secp256k1_ge_set_xo_var(elem, &x, pub[0] == 0x03); + } else if (size == 65 && (pub[0] == 0x04 || pub[0] == 0x06 || pub[0] == 0x07)) { + secp256k1_fe_t x, y; + if (!secp256k1_fe_set_b32(&x, pub+1) || !secp256k1_fe_set_b32(&y, pub+33)) { + return 0; + } + secp256k1_ge_set_xy(elem, &x, &y); + if ((pub[0] == 0x06 || pub[0] == 0x07) && secp256k1_fe_is_odd(&y) != (pub[0] == 0x07)) { + return 0; + } + return secp256k1_ge_is_valid_var(elem); + } else { + return 0; + } +} + +static int secp256k1_eckey_pubkey_serialize(secp256k1_ge_t *elem, unsigned char *pub, int *size, int compressed) { + if (secp256k1_ge_is_infinity(elem)) { + return 0; + } + secp256k1_fe_normalize_var(&elem->x); + secp256k1_fe_normalize_var(&elem->y); + secp256k1_fe_get_b32(&pub[1], &elem->x); + if (compressed) { + *size = 33; + pub[0] = 0x02 | (secp256k1_fe_is_odd(&elem->y) ? 0x01 : 0x00); + } else { + *size = 65; + pub[0] = 0x04; + secp256k1_fe_get_b32(&pub[33], &elem->y); + } + return 1; +} + +static int secp256k1_eckey_privkey_parse(secp256k1_scalar_t *key, const unsigned char *privkey, int privkeylen) { + unsigned char c[32] = {0}; + const unsigned char *end = privkey + privkeylen; + int lenb = 0; + int len = 0; + int overflow = 0; + /* sequence header */ + if (end < privkey+1 || *privkey != 0x30) { + return 0; + } + privkey++; + /* sequence length constructor */ + if (end < privkey+1 || !(*privkey & 0x80)) { + return 0; + } + lenb = *privkey & ~0x80; privkey++; + if (lenb < 1 || lenb > 2) { + return 0; + } + if (end < privkey+lenb) { + return 0; + } + /* sequence length */ + len = privkey[lenb-1] | (lenb > 1 ? privkey[lenb-2] << 8 : 0); + privkey += lenb; + if (end < privkey+len) { + return 0; + } + /* sequence element 0: version number (=1) */ + if (end < privkey+3 || privkey[0] != 0x02 || privkey[1] != 0x01 || privkey[2] != 0x01) { + return 0; + } + privkey += 3; + /* sequence element 1: octet string, up to 32 bytes */ + if (end < privkey+2 || privkey[0] != 0x04 || privkey[1] > 0x20 || end < privkey+2+privkey[1]) { + return 0; + } + memcpy(c + 32 - privkey[1], privkey + 2, privkey[1]); + secp256k1_scalar_set_b32(key, c, &overflow); + memset(c, 0, 32); + return !overflow; +} + +static int secp256k1_eckey_privkey_serialize(const secp256k1_ecmult_gen_context_t *ctx, unsigned char *privkey, int *privkeylen, const secp256k1_scalar_t *key, int compressed) { + secp256k1_gej_t rp; + secp256k1_ge_t r; + int pubkeylen = 0; + secp256k1_ecmult_gen(ctx, &rp, key); + secp256k1_ge_set_gej(&r, &rp); + if (compressed) { + static const unsigned char begin[] = { + 0x30,0x81,0xD3,0x02,0x01,0x01,0x04,0x20 + }; + static const unsigned char middle[] = { + 0xA0,0x81,0x85,0x30,0x81,0x82,0x02,0x01,0x01,0x30,0x2C,0x06,0x07,0x2A,0x86,0x48, + 0xCE,0x3D,0x01,0x01,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F,0x30,0x06,0x04,0x01,0x00,0x04,0x01,0x07,0x04, + 0x21,0x02,0x79,0xBE,0x66,0x7E,0xF9,0xDC,0xBB,0xAC,0x55,0xA0,0x62,0x95,0xCE,0x87, + 0x0B,0x07,0x02,0x9B,0xFC,0xDB,0x2D,0xCE,0x28,0xD9,0x59,0xF2,0x81,0x5B,0x16,0xF8, + 0x17,0x98,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,0xBF,0xD2,0x5E, + 0x8C,0xD0,0x36,0x41,0x41,0x02,0x01,0x01,0xA1,0x24,0x03,0x22,0x00 + }; + unsigned char *ptr = privkey; + memcpy(ptr, begin, sizeof(begin)); ptr += sizeof(begin); + secp256k1_scalar_get_b32(ptr, key); ptr += 32; + memcpy(ptr, middle, sizeof(middle)); ptr += sizeof(middle); + if (!secp256k1_eckey_pubkey_serialize(&r, ptr, &pubkeylen, 1)) { + return 0; + } + ptr += pubkeylen; + *privkeylen = ptr - privkey; + } else { + static const unsigned char begin[] = { + 0x30,0x82,0x01,0x13,0x02,0x01,0x01,0x04,0x20 + }; + static const unsigned char middle[] = { + 0xA0,0x81,0xA5,0x30,0x81,0xA2,0x02,0x01,0x01,0x30,0x2C,0x06,0x07,0x2A,0x86,0x48, + 0xCE,0x3D,0x01,0x01,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F,0x30,0x06,0x04,0x01,0x00,0x04,0x01,0x07,0x04, + 0x41,0x04,0x79,0xBE,0x66,0x7E,0xF9,0xDC,0xBB,0xAC,0x55,0xA0,0x62,0x95,0xCE,0x87, + 0x0B,0x07,0x02,0x9B,0xFC,0xDB,0x2D,0xCE,0x28,0xD9,0x59,0xF2,0x81,0x5B,0x16,0xF8, + 0x17,0x98,0x48,0x3A,0xDA,0x77,0x26,0xA3,0xC4,0x65,0x5D,0xA4,0xFB,0xFC,0x0E,0x11, + 0x08,0xA8,0xFD,0x17,0xB4,0x48,0xA6,0x85,0x54,0x19,0x9C,0x47,0xD0,0x8F,0xFB,0x10, + 0xD4,0xB8,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,0xBF,0xD2,0x5E, + 0x8C,0xD0,0x36,0x41,0x41,0x02,0x01,0x01,0xA1,0x44,0x03,0x42,0x00 + }; + unsigned char *ptr = privkey; + memcpy(ptr, begin, sizeof(begin)); ptr += sizeof(begin); + secp256k1_scalar_get_b32(ptr, key); ptr += 32; + memcpy(ptr, middle, sizeof(middle)); ptr += sizeof(middle); + if (!secp256k1_eckey_pubkey_serialize(&r, ptr, &pubkeylen, 0)) { + return 0; + } + ptr += pubkeylen; + *privkeylen = ptr - privkey; + } + return 1; +} + +static int secp256k1_eckey_privkey_tweak_add(secp256k1_scalar_t *key, const secp256k1_scalar_t *tweak) { + secp256k1_scalar_add(key, key, tweak); + if (secp256k1_scalar_is_zero(key)) { + return 0; + } + return 1; +} + +static int secp256k1_eckey_pubkey_tweak_add(const secp256k1_ecmult_context_t *ctx, secp256k1_ge_t *key, const secp256k1_scalar_t *tweak) { + secp256k1_gej_t pt; + secp256k1_scalar_t one; + secp256k1_gej_set_ge(&pt, key); + secp256k1_scalar_set_int(&one, 1); + secp256k1_ecmult(ctx, &pt, &pt, &one, tweak); + + if (secp256k1_gej_is_infinity(&pt)) { + return 0; + } + secp256k1_ge_set_gej(key, &pt); + return 1; +} + +static int secp256k1_eckey_privkey_tweak_mul(secp256k1_scalar_t *key, const secp256k1_scalar_t *tweak) { + if (secp256k1_scalar_is_zero(tweak)) { + return 0; + } + + secp256k1_scalar_mul(key, key, tweak); + return 1; +} + +static int secp256k1_eckey_pubkey_tweak_mul(const secp256k1_ecmult_context_t *ctx, secp256k1_ge_t *key, const secp256k1_scalar_t *tweak) { + secp256k1_scalar_t zero; + secp256k1_gej_t pt; + if (secp256k1_scalar_is_zero(tweak)) { + return 0; + } + + secp256k1_scalar_set_int(&zero, 0); + secp256k1_gej_set_ge(&pt, key); + secp256k1_ecmult(ctx, &pt, &pt, tweak, &zero); + secp256k1_ge_set_gej(key, &pt); + return 1; +} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/ecmult.h b/src/cryptoconditions/src/include/secp256k1/src/ecmult.h new file mode 100644 index 000000000..bab9e4ef5 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/ecmult.h @@ -0,0 +1,31 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_ECMULT_ +#define _SECP256K1_ECMULT_ + +#include "num.h" +#include "group.h" + +typedef struct { + /* For accelerating the computation of a*P + b*G: */ + secp256k1_ge_storage_t (*pre_g)[]; /* odd multiples of the generator */ +#ifdef USE_ENDOMORPHISM + secp256k1_ge_storage_t (*pre_g_128)[]; /* odd multiples of 2^128*generator */ +#endif +} secp256k1_ecmult_context_t; + +static void secp256k1_ecmult_context_init(secp256k1_ecmult_context_t *ctx); +static void secp256k1_ecmult_context_build(secp256k1_ecmult_context_t *ctx); +static void secp256k1_ecmult_context_clone(secp256k1_ecmult_context_t *dst, + const secp256k1_ecmult_context_t *src); +static void secp256k1_ecmult_context_clear(secp256k1_ecmult_context_t *ctx); +static int secp256k1_ecmult_context_is_built(const secp256k1_ecmult_context_t *ctx); + +/** Double multiply: R = na*A + ng*G */ +static void secp256k1_ecmult(const secp256k1_ecmult_context_t *ctx, secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_scalar_t *na, const secp256k1_scalar_t *ng); + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/ecmult_gen.h b/src/cryptoconditions/src/include/secp256k1/src/ecmult_gen.h new file mode 100644 index 000000000..3745633c4 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/ecmult_gen.h @@ -0,0 +1,43 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_ECMULT_GEN_ +#define _SECP256K1_ECMULT_GEN_ + +#include "scalar.h" +#include "group.h" + +typedef struct { + /* For accelerating the computation of a*G: + * To harden against timing attacks, use the following mechanism: + * * Break up the multiplicand into groups of 4 bits, called n_0, n_1, n_2, ..., n_63. + * * Compute sum(n_i * 16^i * G + U_i, i=0..63), where: + * * U_i = U * 2^i (for i=0..62) + * * U_i = U * (1-2^63) (for i=63) + * where U is a point with no known corresponding scalar. Note that sum(U_i, i=0..63) = 0. + * For each i, and each of the 16 possible values of n_i, (n_i * 16^i * G + U_i) is + * precomputed (call it prec(i, n_i)). The formula now becomes sum(prec(i, n_i), i=0..63). + * None of the resulting prec group elements have a known scalar, and neither do any of + * the intermediate sums while computing a*G. + */ + secp256k1_ge_storage_t (*prec)[64][16]; /* prec[j][i] = 16^j * i * G + U_i */ + secp256k1_scalar_t blind; + secp256k1_gej_t initial; +} secp256k1_ecmult_gen_context_t; + +static void secp256k1_ecmult_gen_context_init(secp256k1_ecmult_gen_context_t* ctx); +static void secp256k1_ecmult_gen_context_build(secp256k1_ecmult_gen_context_t* ctx); +static void secp256k1_ecmult_gen_context_clone(secp256k1_ecmult_gen_context_t *dst, + const secp256k1_ecmult_gen_context_t* src); +static void secp256k1_ecmult_gen_context_clear(secp256k1_ecmult_gen_context_t* ctx); +static int secp256k1_ecmult_gen_context_is_built(const secp256k1_ecmult_gen_context_t* ctx); + +/** Multiply with the generator: R = a*G */ +static void secp256k1_ecmult_gen(const secp256k1_ecmult_gen_context_t* ctx, secp256k1_gej_t *r, const secp256k1_scalar_t *a); + +static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context_t *ctx, const unsigned char *seed32); + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/ecmult_gen_impl.h b/src/cryptoconditions/src/include/secp256k1/src/ecmult_gen_impl.h new file mode 100644 index 000000000..4697753ac --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/ecmult_gen_impl.h @@ -0,0 +1,184 @@ +/********************************************************************** + * Copyright (c) 2013, 2014, 2015 Pieter Wuille, Gregory Maxwell * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_ECMULT_GEN_IMPL_H_ +#define _SECP256K1_ECMULT_GEN_IMPL_H_ + +#include "scalar.h" +#include "group.h" +#include "ecmult_gen.h" +#include "hash_impl.h" + +static void secp256k1_ecmult_gen_context_init(secp256k1_ecmult_gen_context_t *ctx) { + ctx->prec = NULL; +} + +static void secp256k1_ecmult_gen_context_build(secp256k1_ecmult_gen_context_t *ctx) { + secp256k1_ge_t prec[1024]; + secp256k1_gej_t gj; + secp256k1_gej_t nums_gej; + int i, j; + + if (ctx->prec != NULL) { + return; + } + + ctx->prec = (secp256k1_ge_storage_t (*)[64][16])checked_malloc(sizeof(*ctx->prec)); + + /* get the generator */ + secp256k1_gej_set_ge(&gj, &secp256k1_ge_const_g); + + /* Construct a group element with no known corresponding scalar (nothing up my sleeve). */ + { + static const unsigned char nums_b32[33] = "The scalar for this x is unknown"; + secp256k1_fe_t nums_x; + secp256k1_ge_t nums_ge; + VERIFY_CHECK(secp256k1_fe_set_b32(&nums_x, nums_b32)); + VERIFY_CHECK(secp256k1_ge_set_xo_var(&nums_ge, &nums_x, 0)); + secp256k1_gej_set_ge(&nums_gej, &nums_ge); + /* Add G to make the bits in x uniformly distributed. */ + secp256k1_gej_add_ge_var(&nums_gej, &nums_gej, &secp256k1_ge_const_g); + } + + /* compute prec. */ + { + secp256k1_gej_t precj[1024]; /* Jacobian versions of prec. */ + secp256k1_gej_t gbase; + secp256k1_gej_t numsbase; + gbase = gj; /* 16^j * G */ + numsbase = nums_gej; /* 2^j * nums. */ + for (j = 0; j < 64; j++) { + /* Set precj[j*16 .. j*16+15] to (numsbase, numsbase + gbase, ..., numsbase + 15*gbase). */ + precj[j*16] = numsbase; + for (i = 1; i < 16; i++) { + secp256k1_gej_add_var(&precj[j*16 + i], &precj[j*16 + i - 1], &gbase); + } + /* Multiply gbase by 16. */ + for (i = 0; i < 4; i++) { + secp256k1_gej_double_var(&gbase, &gbase); + } + /* Multiply numbase by 2. */ + secp256k1_gej_double_var(&numsbase, &numsbase); + if (j == 62) { + /* In the last iteration, numsbase is (1 - 2^j) * nums instead. */ + secp256k1_gej_neg(&numsbase, &numsbase); + secp256k1_gej_add_var(&numsbase, &numsbase, &nums_gej); + } + } + secp256k1_ge_set_all_gej_var(1024, prec, precj); + } + for (j = 0; j < 64; j++) { + for (i = 0; i < 16; i++) { + secp256k1_ge_to_storage(&(*ctx->prec)[j][i], &prec[j*16 + i]); + } + } + secp256k1_ecmult_gen_blind(ctx, NULL); +} + +static int secp256k1_ecmult_gen_context_is_built(const secp256k1_ecmult_gen_context_t* ctx) { + return ctx->prec != NULL; +} + +static void secp256k1_ecmult_gen_context_clone(secp256k1_ecmult_gen_context_t *dst, + const secp256k1_ecmult_gen_context_t *src) { + if (src->prec == NULL) { + dst->prec = NULL; + } else { + dst->prec = (secp256k1_ge_storage_t (*)[64][16])checked_malloc(sizeof(*dst->prec)); + memcpy(dst->prec, src->prec, sizeof(*dst->prec)); + dst->initial = src->initial; + dst->blind = src->blind; + } +} + +static void secp256k1_ecmult_gen_context_clear(secp256k1_ecmult_gen_context_t *ctx) { + free(ctx->prec); + secp256k1_scalar_clear(&ctx->blind); + secp256k1_gej_clear(&ctx->initial); + ctx->prec = NULL; +} + +static void secp256k1_ecmult_gen(const secp256k1_ecmult_gen_context_t *ctx, secp256k1_gej_t *r, const secp256k1_scalar_t *gn) { + secp256k1_ge_t add; + secp256k1_ge_storage_t adds; + secp256k1_scalar_t gnb; + int bits; + int i, j; + memset(&adds, 0, sizeof(adds)); + *r = ctx->initial; + /* Blind scalar/point multiplication by computing (n-b)G + bG instead of nG. */ + secp256k1_scalar_add(&gnb, gn, &ctx->blind); + add.infinity = 0; + for (j = 0; j < 64; j++) { + bits = secp256k1_scalar_get_bits(&gnb, j * 4, 4); + for (i = 0; i < 16; i++) { + /** This uses a conditional move to avoid any secret data in array indexes. + * _Any_ use of secret indexes has been demonstrated to result in timing + * sidechannels, even when the cache-line access patterns are uniform. + * See also: + * "A word of warning", CHES 2013 Rump Session, by Daniel J. Bernstein and Peter Schwabe + * (https://cryptojedi.org/peter/data/chesrump-20130822.pdf) and + * "Cache Attacks and Countermeasures: the Case of AES", RSA 2006, + * by Dag Arne Osvik, Adi Shamir, and Eran Tromer + * (http://www.tau.ac.il/~tromer/papers/cache.pdf) + */ + secp256k1_ge_storage_cmov(&adds, &(*ctx->prec)[j][i], i == bits); + } + secp256k1_ge_from_storage(&add, &adds); + secp256k1_gej_add_ge(r, r, &add); + } + bits = 0; + secp256k1_ge_clear(&add); + secp256k1_scalar_clear(&gnb); +} + +/* Setup blinding values for secp256k1_ecmult_gen. */ +static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context_t *ctx, const unsigned char *seed32) { + secp256k1_scalar_t b; + secp256k1_gej_t gb; + secp256k1_fe_t s; + unsigned char nonce32[32]; + secp256k1_rfc6979_hmac_sha256_t rng; + int retry; + if (!seed32) { + /* When seed is NULL, reset the initial point and blinding value. */ + secp256k1_gej_set_ge(&ctx->initial, &secp256k1_ge_const_g); + secp256k1_gej_neg(&ctx->initial, &ctx->initial); + secp256k1_scalar_set_int(&ctx->blind, 1); + } + /* The prior blinding value (if not reset) is chained forward by including it in the hash. */ + secp256k1_scalar_get_b32(nonce32, &ctx->blind); + /** Using a CSPRNG allows a failure free interface, avoids needing large amounts of random data, + * and guards against weak or adversarial seeds. This is a simpler and safer interface than + * asking the caller for blinding values directly and expecting them to retry on failure. + */ + secp256k1_rfc6979_hmac_sha256_initialize(&rng, seed32 ? seed32 : nonce32, 32, nonce32, 32, NULL, 0); + /* Retry for out of range results to achieve uniformity. */ + do { + secp256k1_rfc6979_hmac_sha256_generate(&rng, nonce32, 32); + retry = !secp256k1_fe_set_b32(&s, nonce32); + retry |= secp256k1_fe_is_zero(&s); + } while (retry); + /* Randomize the projection to defend against multiplier sidechannels. */ + secp256k1_gej_rescale(&ctx->initial, &s); + secp256k1_fe_clear(&s); + do { + secp256k1_rfc6979_hmac_sha256_generate(&rng, nonce32, 32); + secp256k1_scalar_set_b32(&b, nonce32, &retry); + /* A blinding value of 0 works, but would undermine the projection hardening. */ + retry |= secp256k1_scalar_is_zero(&b); + } while (retry); + secp256k1_rfc6979_hmac_sha256_finalize(&rng); + memset(nonce32, 0, 32); + secp256k1_ecmult_gen(ctx, &gb, &b); + secp256k1_scalar_negate(&b, &b); + ctx->blind = b; + ctx->initial = gb; + secp256k1_scalar_clear(&b); + secp256k1_gej_clear(&gb); +} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/ecmult_impl.h b/src/cryptoconditions/src/include/secp256k1/src/ecmult_impl.h new file mode 100644 index 000000000..1b2856f83 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/ecmult_impl.h @@ -0,0 +1,317 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_ECMULT_IMPL_H_ +#define _SECP256K1_ECMULT_IMPL_H_ + +#include "group.h" +#include "scalar.h" +#include "ecmult.h" + +/* optimal for 128-bit and 256-bit exponents. */ +#define WINDOW_A 5 + +/** larger numbers may result in slightly better performance, at the cost of + exponentially larger precomputed tables. */ +#ifdef USE_ENDOMORPHISM +/** Two tables for window size 15: 1.375 MiB. */ +#define WINDOW_G 15 +#else +/** One table for window size 16: 1.375 MiB. */ +#define WINDOW_G 16 +#endif + +/** Fill a table 'pre' with precomputed odd multiples of a. W determines the size of the table. + * pre will contains the values [1*a,3*a,5*a,...,(2^(w-1)-1)*a], so it needs place for + * 2^(w-2) entries. + * + * There are two versions of this function: + * - secp256k1_ecmult_precomp_wnaf_gej, which operates on group elements in jacobian notation, + * fast to precompute, but slower to use in later additions. + * - secp256k1_ecmult_precomp_wnaf_ge, which operates on group elements in affine notations, + * (much) slower to precompute, but a bit faster to use in later additions. + * To compute a*P + b*G, we use the jacobian version for P, and the affine version for G, as + * G is constant, so it only needs to be done once in advance. + */ +static void secp256k1_ecmult_table_precomp_gej_var(secp256k1_gej_t *pre, const secp256k1_gej_t *a, int w) { + secp256k1_gej_t d; + int i; + pre[0] = *a; + secp256k1_gej_double_var(&d, &pre[0]); + for (i = 1; i < (1 << (w-2)); i++) { + secp256k1_gej_add_var(&pre[i], &d, &pre[i-1]); + } +} + +static void secp256k1_ecmult_table_precomp_ge_storage_var(secp256k1_ge_storage_t *pre, const secp256k1_gej_t *a, int w) { + secp256k1_gej_t d; + int i; + const int table_size = 1 << (w-2); + secp256k1_gej_t *prej = (secp256k1_gej_t *)checked_malloc(sizeof(secp256k1_gej_t) * table_size); + secp256k1_ge_t *prea = (secp256k1_ge_t *)checked_malloc(sizeof(secp256k1_ge_t) * table_size); + prej[0] = *a; + secp256k1_gej_double_var(&d, a); + for (i = 1; i < table_size; i++) { + secp256k1_gej_add_var(&prej[i], &d, &prej[i-1]); + } + secp256k1_ge_set_all_gej_var(table_size, prea, prej); + for (i = 0; i < table_size; i++) { + secp256k1_ge_to_storage(&pre[i], &prea[i]); + } + free(prej); + free(prea); +} + +/** The number of entries a table with precomputed multiples needs to have. */ +#define ECMULT_TABLE_SIZE(w) (1 << ((w)-2)) + +/** The following two macro retrieves a particular odd multiple from a table + * of precomputed multiples. */ +#define ECMULT_TABLE_GET_GEJ(r,pre,n,w) do { \ + VERIFY_CHECK(((n) & 1) == 1); \ + VERIFY_CHECK((n) >= -((1 << ((w)-1)) - 1)); \ + VERIFY_CHECK((n) <= ((1 << ((w)-1)) - 1)); \ + if ((n) > 0) { \ + *(r) = (pre)[((n)-1)/2]; \ + } else { \ + secp256k1_gej_neg((r), &(pre)[(-(n)-1)/2]); \ + } \ +} while(0) +#define ECMULT_TABLE_GET_GE_STORAGE(r,pre,n,w) do { \ + VERIFY_CHECK(((n) & 1) == 1); \ + VERIFY_CHECK((n) >= -((1 << ((w)-1)) - 1)); \ + VERIFY_CHECK((n) <= ((1 << ((w)-1)) - 1)); \ + if ((n) > 0) { \ + secp256k1_ge_from_storage((r), &(pre)[((n)-1)/2]); \ + } else { \ + secp256k1_ge_from_storage((r), &(pre)[(-(n)-1)/2]); \ + secp256k1_ge_neg((r), (r)); \ + } \ +} while(0) + +static void secp256k1_ecmult_context_init(secp256k1_ecmult_context_t *ctx) { + ctx->pre_g = NULL; +#ifdef USE_ENDOMORPHISM + ctx->pre_g_128 = NULL; +#endif +} + +static void secp256k1_ecmult_context_build(secp256k1_ecmult_context_t *ctx) { + secp256k1_gej_t gj; + + if (ctx->pre_g != NULL) { + return; + } + + /* get the generator */ + secp256k1_gej_set_ge(&gj, &secp256k1_ge_const_g); + + ctx->pre_g = (secp256k1_ge_storage_t (*)[])checked_malloc(sizeof((*ctx->pre_g)[0]) * ECMULT_TABLE_SIZE(WINDOW_G)); + + /* precompute the tables with odd multiples */ + secp256k1_ecmult_table_precomp_ge_storage_var(*ctx->pre_g, &gj, WINDOW_G); + +#ifdef USE_ENDOMORPHISM + { + secp256k1_gej_t g_128j; + int i; + + ctx->pre_g_128 = (secp256k1_ge_storage_t (*)[])checked_malloc(sizeof((*ctx->pre_g_128)[0]) * ECMULT_TABLE_SIZE(WINDOW_G)); + + /* calculate 2^128*generator */ + g_128j = gj; + for (i = 0; i < 128; i++) { + secp256k1_gej_double_var(&g_128j, &g_128j); + } + secp256k1_ecmult_table_precomp_ge_storage_var(*ctx->pre_g_128, &g_128j, WINDOW_G); + } +#endif +} + +static void secp256k1_ecmult_context_clone(secp256k1_ecmult_context_t *dst, + const secp256k1_ecmult_context_t *src) { + if (src->pre_g == NULL) { + dst->pre_g = NULL; + } else { + size_t size = sizeof((*dst->pre_g)[0]) * ECMULT_TABLE_SIZE(WINDOW_G); + dst->pre_g = (secp256k1_ge_storage_t (*)[])checked_malloc(size); + memcpy(dst->pre_g, src->pre_g, size); + } +#ifdef USE_ENDOMORPHISM + if (src->pre_g_128 == NULL) { + dst->pre_g_128 = NULL; + } else { + size_t size = sizeof((*dst->pre_g_128)[0]) * ECMULT_TABLE_SIZE(WINDOW_G); + dst->pre_g_128 = (secp256k1_ge_storage_t (*)[])checked_malloc(size); + memcpy(dst->pre_g_128, src->pre_g_128, size); + } +#endif +} + +static int secp256k1_ecmult_context_is_built(const secp256k1_ecmult_context_t *ctx) { + return ctx->pre_g != NULL; +} + +static void secp256k1_ecmult_context_clear(secp256k1_ecmult_context_t *ctx) { + free(ctx->pre_g); +#ifdef USE_ENDOMORPHISM + free(ctx->pre_g_128); +#endif + secp256k1_ecmult_context_init(ctx); +} + +/** Convert a number to WNAF notation. The number becomes represented by sum(2^i * wnaf[i], i=0..bits), + * with the following guarantees: + * - each wnaf[i] is either 0, or an odd integer between -(1<<(w-1) - 1) and (1<<(w-1) - 1) + * - two non-zero entries in wnaf are separated by at least w-1 zeroes. + * - the number of set values in wnaf is returned. This number is at most 256, and at most one more + * - than the number of bits in the (absolute value) of the input. + */ +static int secp256k1_ecmult_wnaf(int *wnaf, const secp256k1_scalar_t *a, int w) { + secp256k1_scalar_t s = *a; + int set_bits = 0; + int bit = 0; + int sign = 1; + + if (secp256k1_scalar_get_bits(&s, 255, 1)) { + secp256k1_scalar_negate(&s, &s); + sign = -1; + } + + while (bit < 256) { + int now; + int word; + if (secp256k1_scalar_get_bits(&s, bit, 1) == 0) { + bit++; + continue; + } + while (set_bits < bit) { + wnaf[set_bits++] = 0; + } + now = w; + if (bit + now > 256) { + now = 256 - bit; + } + word = secp256k1_scalar_get_bits_var(&s, bit, now); + if (word & (1 << (w-1))) { + secp256k1_scalar_add_bit(&s, bit + w); + wnaf[set_bits++] = sign * (word - (1 << w)); + } else { + wnaf[set_bits++] = sign * word; + } + bit += now; + } + return set_bits; +} + +static void secp256k1_ecmult(const secp256k1_ecmult_context_t *ctx, secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_scalar_t *na, const secp256k1_scalar_t *ng) { + secp256k1_gej_t tmpj; + secp256k1_gej_t pre_a[ECMULT_TABLE_SIZE(WINDOW_A)]; + secp256k1_ge_t tmpa; +#ifdef USE_ENDOMORPHISM + secp256k1_gej_t pre_a_lam[ECMULT_TABLE_SIZE(WINDOW_A)]; + secp256k1_scalar_t na_1, na_lam; + /* Splitted G factors. */ + secp256k1_scalar_t ng_1, ng_128; + int wnaf_na_1[130]; + int wnaf_na_lam[130]; + int bits_na_1; + int bits_na_lam; + int wnaf_ng_1[129]; + int bits_ng_1; + int wnaf_ng_128[129]; + int bits_ng_128; +#else + int wnaf_na[256]; + int bits_na; + int wnaf_ng[257]; + int bits_ng; +#endif + int i; + int bits; + +#ifdef USE_ENDOMORPHISM + /* split na into na_1 and na_lam (where na = na_1 + na_lam*lambda, and na_1 and na_lam are ~128 bit) */ + secp256k1_scalar_split_lambda_var(&na_1, &na_lam, na); + + /* build wnaf representation for na_1 and na_lam. */ + bits_na_1 = secp256k1_ecmult_wnaf(wnaf_na_1, &na_1, WINDOW_A); + bits_na_lam = secp256k1_ecmult_wnaf(wnaf_na_lam, &na_lam, WINDOW_A); + VERIFY_CHECK(bits_na_1 <= 130); + VERIFY_CHECK(bits_na_lam <= 130); + bits = bits_na_1; + if (bits_na_lam > bits) { + bits = bits_na_lam; + } +#else + /* build wnaf representation for na. */ + bits_na = secp256k1_ecmult_wnaf(wnaf_na, na, WINDOW_A); + bits = bits_na; +#endif + + /* calculate odd multiples of a */ + secp256k1_ecmult_table_precomp_gej_var(pre_a, a, WINDOW_A); + +#ifdef USE_ENDOMORPHISM + for (i = 0; i < ECMULT_TABLE_SIZE(WINDOW_A); i++) { + secp256k1_gej_mul_lambda(&pre_a_lam[i], &pre_a[i]); + } + + /* split ng into ng_1 and ng_128 (where gn = gn_1 + gn_128*2^128, and gn_1 and gn_128 are ~128 bit) */ + secp256k1_scalar_split_128(&ng_1, &ng_128, ng); + + /* Build wnaf representation for ng_1 and ng_128 */ + bits_ng_1 = secp256k1_ecmult_wnaf(wnaf_ng_1, &ng_1, WINDOW_G); + bits_ng_128 = secp256k1_ecmult_wnaf(wnaf_ng_128, &ng_128, WINDOW_G); + if (bits_ng_1 > bits) { + bits = bits_ng_1; + } + if (bits_ng_128 > bits) { + bits = bits_ng_128; + } +#else + bits_ng = secp256k1_ecmult_wnaf(wnaf_ng, ng, WINDOW_G); + if (bits_ng > bits) { + bits = bits_ng; + } +#endif + + secp256k1_gej_set_infinity(r); + + for (i = bits-1; i >= 0; i--) { + int n; + secp256k1_gej_double_var(r, r); +#ifdef USE_ENDOMORPHISM + if (i < bits_na_1 && (n = wnaf_na_1[i])) { + ECMULT_TABLE_GET_GEJ(&tmpj, pre_a, n, WINDOW_A); + secp256k1_gej_add_var(r, r, &tmpj); + } + if (i < bits_na_lam && (n = wnaf_na_lam[i])) { + ECMULT_TABLE_GET_GEJ(&tmpj, pre_a_lam, n, WINDOW_A); + secp256k1_gej_add_var(r, r, &tmpj); + } + if (i < bits_ng_1 && (n = wnaf_ng_1[i])) { + ECMULT_TABLE_GET_GE_STORAGE(&tmpa, *ctx->pre_g, n, WINDOW_G); + secp256k1_gej_add_ge_var(r, r, &tmpa); + } + if (i < bits_ng_128 && (n = wnaf_ng_128[i])) { + ECMULT_TABLE_GET_GE_STORAGE(&tmpa, *ctx->pre_g_128, n, WINDOW_G); + secp256k1_gej_add_ge_var(r, r, &tmpa); + } +#else + if (i < bits_na && (n = wnaf_na[i])) { + ECMULT_TABLE_GET_GEJ(&tmpj, pre_a, n, WINDOW_A); + secp256k1_gej_add_var(r, r, &tmpj); + } + if (i < bits_ng && (n = wnaf_ng[i])) { + ECMULT_TABLE_GET_GE_STORAGE(&tmpa, *ctx->pre_g, n, WINDOW_G); + secp256k1_gej_add_ge_var(r, r, &tmpa); + } +#endif + } +} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/field.h b/src/cryptoconditions/src/include/secp256k1/src/field.h new file mode 100644 index 000000000..41b280892 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/field.h @@ -0,0 +1,119 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_FIELD_ +#define _SECP256K1_FIELD_ + +/** Field element module. + * + * Field elements can be represented in several ways, but code accessing + * it (and implementations) need to take certain properaties into account: + * - Each field element can be normalized or not. + * - Each field element has a magnitude, which represents how far away + * its representation is away from normalization. Normalized elements + * always have a magnitude of 1, but a magnitude of 1 doesn't imply + * normality. + */ + +#if defined HAVE_CONFIG_H +#include "libsecp256k1-config.h" +#endif + +#if defined(USE_FIELD_10X26) +#include "field_10x26.h" +#elif defined(USE_FIELD_5X52) +#include "field_5x52.h" +#else +#error "Please select field implementation" +#endif + +/** Normalize a field element. */ +static void secp256k1_fe_normalize(secp256k1_fe_t *r); + +/** Weakly normalize a field element: reduce it magnitude to 1, but don't fully normalize. */ +static void secp256k1_fe_normalize_weak(secp256k1_fe_t *r); + +/** Normalize a field element, without constant-time guarantee. */ +static void secp256k1_fe_normalize_var(secp256k1_fe_t *r); + +/** Verify whether a field element represents zero i.e. would normalize to a zero value. The field + * implementation may optionally normalize the input, but this should not be relied upon. */ +static int secp256k1_fe_normalizes_to_zero(secp256k1_fe_t *r); + +/** Verify whether a field element represents zero i.e. would normalize to a zero value. The field + * implementation may optionally normalize the input, but this should not be relied upon. */ +static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe_t *r); + +/** Set a field element equal to a small integer. Resulting field element is normalized. */ +static void secp256k1_fe_set_int(secp256k1_fe_t *r, int a); + +/** Verify whether a field element is zero. Requires the input to be normalized. */ +static int secp256k1_fe_is_zero(const secp256k1_fe_t *a); + +/** Check the "oddness" of a field element. Requires the input to be normalized. */ +static int secp256k1_fe_is_odd(const secp256k1_fe_t *a); + +/** Compare two field elements. Requires magnitude-1 inputs. */ +static int secp256k1_fe_equal_var(const secp256k1_fe_t *a, const secp256k1_fe_t *b); + +/** Compare two field elements. Requires both inputs to be normalized */ +static int secp256k1_fe_cmp_var(const secp256k1_fe_t *a, const secp256k1_fe_t *b); + +/** Set a field element equal to 32-byte big endian value. If succesful, the resulting field element is normalized. */ +static int secp256k1_fe_set_b32(secp256k1_fe_t *r, const unsigned char *a); + +/** Convert a field element to a 32-byte big endian value. Requires the input to be normalized */ +static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe_t *a); + +/** Set a field element equal to the additive inverse of another. Takes a maximum magnitude of the input + * as an argument. The magnitude of the output is one higher. */ +static void secp256k1_fe_negate(secp256k1_fe_t *r, const secp256k1_fe_t *a, int m); + +/** Multiplies the passed field element with a small integer constant. Multiplies the magnitude by that + * small integer. */ +static void secp256k1_fe_mul_int(secp256k1_fe_t *r, int a); + +/** Adds a field element to another. The result has the sum of the inputs' magnitudes as magnitude. */ +static void secp256k1_fe_add(secp256k1_fe_t *r, const secp256k1_fe_t *a); + +/** Sets a field element to be the product of two others. Requires the inputs' magnitudes to be at most 8. + * The output magnitude is 1 (but not guaranteed to be normalized). */ +static void secp256k1_fe_mul(secp256k1_fe_t *r, const secp256k1_fe_t *a, const secp256k1_fe_t * SECP256K1_RESTRICT b); + +/** Sets a field element to be the square of another. Requires the input's magnitude to be at most 8. + * The output magnitude is 1 (but not guaranteed to be normalized). */ +static void secp256k1_fe_sqr(secp256k1_fe_t *r, const secp256k1_fe_t *a); + +/** Sets a field element to be the (modular) square root (if any exist) of another. Requires the + * input's magnitude to be at most 8. The output magnitude is 1 (but not guaranteed to be + * normalized). Return value indicates whether a square root was found. */ +static int secp256k1_fe_sqrt_var(secp256k1_fe_t *r, const secp256k1_fe_t *a); + +/** Sets a field element to be the (modular) inverse of another. Requires the input's magnitude to be + * at most 8. The output magnitude is 1 (but not guaranteed to be normalized). */ +static void secp256k1_fe_inv(secp256k1_fe_t *r, const secp256k1_fe_t *a); + +/** Potentially faster version of secp256k1_fe_inv, without constant-time guarantee. */ +static void secp256k1_fe_inv_var(secp256k1_fe_t *r, const secp256k1_fe_t *a); + +/** Calculate the (modular) inverses of a batch of field elements. Requires the inputs' magnitudes to be + * at most 8. The output magnitudes are 1 (but not guaranteed to be normalized). The inputs and + * outputs must not overlap in memory. */ +static void secp256k1_fe_inv_all_var(size_t len, secp256k1_fe_t *r, const secp256k1_fe_t *a); + +/** Convert a field element to the storage type. */ +static void secp256k1_fe_to_storage(secp256k1_fe_storage_t *r, const secp256k1_fe_t*); + +/** Convert a field element back from the storage type. */ +static void secp256k1_fe_from_storage(secp256k1_fe_t *r, const secp256k1_fe_storage_t*); + +/** If flag is true, set *r equal to *a; otherwise leave it. Constant-time. */ +static void secp256k1_fe_storage_cmov(secp256k1_fe_storage_t *r, const secp256k1_fe_storage_t *a, int flag); + +/** If flag is true, set *r equal to *a; otherwise leave it. Constant-time. */ +static void secp256k1_fe_cmov(secp256k1_fe_t *r, const secp256k1_fe_t *a, int flag); + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/field_10x26.h b/src/cryptoconditions/src/include/secp256k1/src/field_10x26.h new file mode 100644 index 000000000..44bce6525 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/field_10x26.h @@ -0,0 +1,47 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_FIELD_REPR_ +#define _SECP256K1_FIELD_REPR_ + +#include + +typedef struct { + /* X = sum(i=0..9, elem[i]*2^26) mod n */ + uint32_t n[10]; +#ifdef VERIFY + int magnitude; + int normalized; +#endif +} secp256k1_fe_t; + +/* Unpacks a constant into a overlapping multi-limbed FE element. */ +#define SECP256K1_FE_CONST_INNER(d7, d6, d5, d4, d3, d2, d1, d0) { \ + (d0) & 0x3FFFFFFUL, \ + ((d0) >> 26) | ((d1) & 0xFFFFFUL) << 6, \ + ((d1) >> 20) | ((d2) & 0x3FFFUL) << 12, \ + ((d2) >> 14) | ((d3) & 0xFFUL) << 18, \ + ((d3) >> 8) | ((d4) & 0x3) << 24, \ + ((d4) >> 2) & 0x3FFFFFFUL, \ + ((d4) >> 28) | ((d5) & 0x3FFFFFUL) << 4, \ + ((d5) >> 22) | ((d6) & 0xFFFF) << 10, \ + ((d6) >> 16) | ((d7) & 0x3FF) << 16, \ + ((d7) >> 10) \ +} + +#ifdef VERIFY +#define SECP256K1_FE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {SECP256K1_FE_CONST_INNER((d7), (d6), (d5), (d4), (d3), (d2), (d1), (d0)), 1, 1} +#else +#define SECP256K1_FE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {SECP256K1_FE_CONST_INNER((d7), (d6), (d5), (d4), (d3), (d2), (d1), (d0))} +#endif + +typedef struct { + uint32_t n[8]; +} secp256k1_fe_storage_t; + +#define SECP256K1_FE_STORAGE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{ (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7) }} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/field_10x26_impl.h b/src/cryptoconditions/src/include/secp256k1/src/field_10x26_impl.h new file mode 100644 index 000000000..871b91f91 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/field_10x26_impl.h @@ -0,0 +1,1136 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_FIELD_REPR_IMPL_H_ +#define _SECP256K1_FIELD_REPR_IMPL_H_ + +#include +#include +#include "util.h" +#include "num.h" +#include "field.h" + +#ifdef VERIFY +static void secp256k1_fe_verify(const secp256k1_fe_t *a) { + const uint32_t *d = a->n; + int m = a->normalized ? 1 : 2 * a->magnitude, r = 1; + r &= (d[0] <= 0x3FFFFFFUL * m); + r &= (d[1] <= 0x3FFFFFFUL * m); + r &= (d[2] <= 0x3FFFFFFUL * m); + r &= (d[3] <= 0x3FFFFFFUL * m); + r &= (d[4] <= 0x3FFFFFFUL * m); + r &= (d[5] <= 0x3FFFFFFUL * m); + r &= (d[6] <= 0x3FFFFFFUL * m); + r &= (d[7] <= 0x3FFFFFFUL * m); + r &= (d[8] <= 0x3FFFFFFUL * m); + r &= (d[9] <= 0x03FFFFFUL * m); + r &= (a->magnitude >= 0); + r &= (a->magnitude <= 32); + if (a->normalized) { + r &= (a->magnitude <= 1); + if (r && (d[9] == 0x03FFFFFUL)) { + uint32_t mid = d[8] & d[7] & d[6] & d[5] & d[4] & d[3] & d[2]; + if (mid == 0x3FFFFFFUL) { + r &= ((d[1] + 0x40UL + ((d[0] + 0x3D1UL) >> 26)) <= 0x3FFFFFFUL); + } + } + } + VERIFY_CHECK(r == 1); +} +#else +static void secp256k1_fe_verify(const secp256k1_fe_t *a) { + (void)a; +} +#endif + +static void secp256k1_fe_normalize(secp256k1_fe_t *r) { + uint32_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4], + t5 = r->n[5], t6 = r->n[6], t7 = r->n[7], t8 = r->n[8], t9 = r->n[9]; + + /* Reduce t9 at the start so there will be at most a single carry from the first pass */ + uint32_t m; + uint32_t x = t9 >> 22; t9 &= 0x03FFFFFUL; + + /* The first pass ensures the magnitude is 1, ... */ + t0 += x * 0x3D1UL; t1 += (x << 6); + t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL; + t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; + t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; m = t2; + t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; m &= t3; + t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; m &= t4; + t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; m &= t5; + t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; m &= t6; + t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; m &= t7; + t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; m &= t8; + + /* ... except for a possible carry at bit 22 of t9 (i.e. bit 256 of the field element) */ + VERIFY_CHECK(t9 >> 23 == 0); + + /* At most a single final reduction is needed; check if the value is >= the field characteristic */ + x = (t9 >> 22) | ((t9 == 0x03FFFFFUL) & (m == 0x3FFFFFFUL) + & ((t1 + 0x40UL + ((t0 + 0x3D1UL) >> 26)) > 0x3FFFFFFUL)); + + /* Apply the final reduction (for constant-time behaviour, we do it always) */ + t0 += x * 0x3D1UL; t1 += (x << 6); + t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL; + t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; + t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; + t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; + t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; + t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; + t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; + t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; + t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; + + /* If t9 didn't carry to bit 22 already, then it should have after any final reduction */ + VERIFY_CHECK(t9 >> 22 == x); + + /* Mask off the possible multiple of 2^256 from the final reduction */ + t9 &= 0x03FFFFFUL; + + r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4; + r->n[5] = t5; r->n[6] = t6; r->n[7] = t7; r->n[8] = t8; r->n[9] = t9; + +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; + secp256k1_fe_verify(r); +#endif +} + +static void secp256k1_fe_normalize_weak(secp256k1_fe_t *r) { + uint32_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4], + t5 = r->n[5], t6 = r->n[6], t7 = r->n[7], t8 = r->n[8], t9 = r->n[9]; + + /* Reduce t9 at the start so there will be at most a single carry from the first pass */ + uint32_t x = t9 >> 22; t9 &= 0x03FFFFFUL; + + /* The first pass ensures the magnitude is 1, ... */ + t0 += x * 0x3D1UL; t1 += (x << 6); + t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL; + t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; + t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; + t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; + t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; + t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; + t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; + t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; + t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; + + /* ... except for a possible carry at bit 22 of t9 (i.e. bit 256 of the field element) */ + VERIFY_CHECK(t9 >> 23 == 0); + + r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4; + r->n[5] = t5; r->n[6] = t6; r->n[7] = t7; r->n[8] = t8; r->n[9] = t9; + +#ifdef VERIFY + r->magnitude = 1; + secp256k1_fe_verify(r); +#endif +} + +static void secp256k1_fe_normalize_var(secp256k1_fe_t *r) { + uint32_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4], + t5 = r->n[5], t6 = r->n[6], t7 = r->n[7], t8 = r->n[8], t9 = r->n[9]; + + /* Reduce t9 at the start so there will be at most a single carry from the first pass */ + uint32_t m; + uint32_t x = t9 >> 22; t9 &= 0x03FFFFFUL; + + /* The first pass ensures the magnitude is 1, ... */ + t0 += x * 0x3D1UL; t1 += (x << 6); + t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL; + t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; + t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; m = t2; + t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; m &= t3; + t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; m &= t4; + t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; m &= t5; + t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; m &= t6; + t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; m &= t7; + t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; m &= t8; + + /* ... except for a possible carry at bit 22 of t9 (i.e. bit 256 of the field element) */ + VERIFY_CHECK(t9 >> 23 == 0); + + /* At most a single final reduction is needed; check if the value is >= the field characteristic */ + x = (t9 >> 22) | ((t9 == 0x03FFFFFUL) & (m == 0x3FFFFFFUL) + & ((t1 + 0x40UL + ((t0 + 0x3D1UL) >> 26)) > 0x3FFFFFFUL)); + + if (x) { + t0 += 0x3D1UL; t1 += (x << 6); + t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL; + t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; + t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; + t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; + t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; + t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; + t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; + t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; + t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; + + /* If t9 didn't carry to bit 22 already, then it should have after any final reduction */ + VERIFY_CHECK(t9 >> 22 == x); + + /* Mask off the possible multiple of 2^256 from the final reduction */ + t9 &= 0x03FFFFFUL; + } + + r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4; + r->n[5] = t5; r->n[6] = t6; r->n[7] = t7; r->n[8] = t8; r->n[9] = t9; + +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; + secp256k1_fe_verify(r); +#endif +} + +static int secp256k1_fe_normalizes_to_zero(secp256k1_fe_t *r) { + uint32_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4], + t5 = r->n[5], t6 = r->n[6], t7 = r->n[7], t8 = r->n[8], t9 = r->n[9]; + + /* z0 tracks a possible raw value of 0, z1 tracks a possible raw value of P */ + uint32_t z0, z1; + + /* Reduce t9 at the start so there will be at most a single carry from the first pass */ + uint32_t x = t9 >> 22; t9 &= 0x03FFFFFUL; + + /* The first pass ensures the magnitude is 1, ... */ + t0 += x * 0x3D1UL; t1 += (x << 6); + t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL; z0 = t0; z1 = t0 ^ 0x3D0UL; + t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; z0 |= t1; z1 &= t1 ^ 0x40UL; + t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; z0 |= t2; z1 &= t2; + t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; z0 |= t3; z1 &= t3; + t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; z0 |= t4; z1 &= t4; + t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; z0 |= t5; z1 &= t5; + t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; z0 |= t6; z1 &= t6; + t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; z0 |= t7; z1 &= t7; + t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; z0 |= t8; z1 &= t8; + z0 |= t9; z1 &= t9 ^ 0x3C00000UL; + + /* ... except for a possible carry at bit 22 of t9 (i.e. bit 256 of the field element) */ + VERIFY_CHECK(t9 >> 23 == 0); + + return (z0 == 0) | (z1 == 0x3FFFFFFUL); +} + +static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe_t *r) { + uint32_t t0, t1, t2, t3, t4, t5, t6, t7, t8, t9; + uint32_t z0, z1; + uint32_t x; + + t0 = r->n[0]; + t9 = r->n[9]; + + /* Reduce t9 at the start so there will be at most a single carry from the first pass */ + x = t9 >> 22; + + /* The first pass ensures the magnitude is 1, ... */ + t0 += x * 0x3D1UL; + + /* z0 tracks a possible raw value of 0, z1 tracks a possible raw value of P */ + z0 = t0 & 0x3FFFFFFUL; + z1 = z0 ^ 0x3D0UL; + + /* Fast return path should catch the majority of cases */ + if ((z0 != 0UL) & (z1 != 0x3FFFFFFUL)) { + return 0; + } + + t1 = r->n[1]; + t2 = r->n[2]; + t3 = r->n[3]; + t4 = r->n[4]; + t5 = r->n[5]; + t6 = r->n[6]; + t7 = r->n[7]; + t8 = r->n[8]; + + t9 &= 0x03FFFFFUL; + t1 += (x << 6); + + t1 += (t0 >> 26); t0 = z0; + t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; z0 |= t1; z1 &= t1 ^ 0x40UL; + t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; z0 |= t2; z1 &= t2; + t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; z0 |= t3; z1 &= t3; + t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; z0 |= t4; z1 &= t4; + t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; z0 |= t5; z1 &= t5; + t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; z0 |= t6; z1 &= t6; + t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; z0 |= t7; z1 &= t7; + t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; z0 |= t8; z1 &= t8; + z0 |= t9; z1 &= t9 ^ 0x3C00000UL; + + /* ... except for a possible carry at bit 22 of t9 (i.e. bit 256 of the field element) */ + VERIFY_CHECK(t9 >> 23 == 0); + + return (z0 == 0) | (z1 == 0x3FFFFFFUL); +} + +SECP256K1_INLINE static void secp256k1_fe_set_int(secp256k1_fe_t *r, int a) { + r->n[0] = a; + r->n[1] = r->n[2] = r->n[3] = r->n[4] = r->n[5] = r->n[6] = r->n[7] = r->n[8] = r->n[9] = 0; +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; + secp256k1_fe_verify(r); +#endif +} + +SECP256K1_INLINE static int secp256k1_fe_is_zero(const secp256k1_fe_t *a) { + const uint32_t *t = a->n; +#ifdef VERIFY + VERIFY_CHECK(a->normalized); + secp256k1_fe_verify(a); +#endif + return (t[0] | t[1] | t[2] | t[3] | t[4] | t[5] | t[6] | t[7] | t[8] | t[9]) == 0; +} + +SECP256K1_INLINE static int secp256k1_fe_is_odd(const secp256k1_fe_t *a) { +#ifdef VERIFY + VERIFY_CHECK(a->normalized); + secp256k1_fe_verify(a); +#endif + return a->n[0] & 1; +} + +SECP256K1_INLINE static void secp256k1_fe_clear(secp256k1_fe_t *a) { + int i; +#ifdef VERIFY + a->magnitude = 0; + a->normalized = 1; +#endif + for (i=0; i<10; i++) { + a->n[i] = 0; + } +} + +static int secp256k1_fe_cmp_var(const secp256k1_fe_t *a, const secp256k1_fe_t *b) { + int i; +#ifdef VERIFY + VERIFY_CHECK(a->normalized); + VERIFY_CHECK(b->normalized); + secp256k1_fe_verify(a); + secp256k1_fe_verify(b); +#endif + for (i = 9; i >= 0; i--) { + if (a->n[i] > b->n[i]) { + return 1; + } + if (a->n[i] < b->n[i]) { + return -1; + } + } + return 0; +} + +static int secp256k1_fe_set_b32(secp256k1_fe_t *r, const unsigned char *a) { + int i; + r->n[0] = r->n[1] = r->n[2] = r->n[3] = r->n[4] = 0; + r->n[5] = r->n[6] = r->n[7] = r->n[8] = r->n[9] = 0; + for (i=0; i<32; i++) { + int j; + for (j=0; j<4; j++) { + int limb = (8*i+2*j)/26; + int shift = (8*i+2*j)%26; + r->n[limb] |= (uint32_t)((a[31-i] >> (2*j)) & 0x3) << shift; + } + } + if (r->n[9] == 0x3FFFFFUL && (r->n[8] & r->n[7] & r->n[6] & r->n[5] & r->n[4] & r->n[3] & r->n[2]) == 0x3FFFFFFUL && (r->n[1] + 0x40UL + ((r->n[0] + 0x3D1UL) >> 26)) > 0x3FFFFFFUL) { + return 0; + } +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; + secp256k1_fe_verify(r); +#endif + return 1; +} + +/** Convert a field element to a 32-byte big endian value. Requires the input to be normalized */ +static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe_t *a) { + int i; +#ifdef VERIFY + VERIFY_CHECK(a->normalized); + secp256k1_fe_verify(a); +#endif + for (i=0; i<32; i++) { + int j; + int c = 0; + for (j=0; j<4; j++) { + int limb = (8*i+2*j)/26; + int shift = (8*i+2*j)%26; + c |= ((a->n[limb] >> shift) & 0x3) << (2 * j); + } + r[31-i] = c; + } +} + +SECP256K1_INLINE static void secp256k1_fe_negate(secp256k1_fe_t *r, const secp256k1_fe_t *a, int m) { +#ifdef VERIFY + VERIFY_CHECK(a->magnitude <= m); + secp256k1_fe_verify(a); +#endif + r->n[0] = 0x3FFFC2FUL * 2 * (m + 1) - a->n[0]; + r->n[1] = 0x3FFFFBFUL * 2 * (m + 1) - a->n[1]; + r->n[2] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[2]; + r->n[3] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[3]; + r->n[4] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[4]; + r->n[5] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[5]; + r->n[6] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[6]; + r->n[7] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[7]; + r->n[8] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[8]; + r->n[9] = 0x03FFFFFUL * 2 * (m + 1) - a->n[9]; +#ifdef VERIFY + r->magnitude = m + 1; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +SECP256K1_INLINE static void secp256k1_fe_mul_int(secp256k1_fe_t *r, int a) { + r->n[0] *= a; + r->n[1] *= a; + r->n[2] *= a; + r->n[3] *= a; + r->n[4] *= a; + r->n[5] *= a; + r->n[6] *= a; + r->n[7] *= a; + r->n[8] *= a; + r->n[9] *= a; +#ifdef VERIFY + r->magnitude *= a; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +SECP256K1_INLINE static void secp256k1_fe_add(secp256k1_fe_t *r, const secp256k1_fe_t *a) { +#ifdef VERIFY + secp256k1_fe_verify(a); +#endif + r->n[0] += a->n[0]; + r->n[1] += a->n[1]; + r->n[2] += a->n[2]; + r->n[3] += a->n[3]; + r->n[4] += a->n[4]; + r->n[5] += a->n[5]; + r->n[6] += a->n[6]; + r->n[7] += a->n[7]; + r->n[8] += a->n[8]; + r->n[9] += a->n[9]; +#ifdef VERIFY + r->magnitude += a->magnitude; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +#ifdef VERIFY +#define VERIFY_BITS(x, n) VERIFY_CHECK(((x) >> (n)) == 0) +#else +#define VERIFY_BITS(x, n) do { } while(0) +#endif + +SECP256K1_INLINE static void secp256k1_fe_mul_inner(uint32_t *r, const uint32_t *a, const uint32_t * SECP256K1_RESTRICT b) { + uint64_t c, d; + uint64_t u0, u1, u2, u3, u4, u5, u6, u7, u8; + uint32_t t9, t1, t0, t2, t3, t4, t5, t6, t7; + const uint32_t M = 0x3FFFFFFUL, R0 = 0x3D10UL, R1 = 0x400UL; + + VERIFY_BITS(a[0], 30); + VERIFY_BITS(a[1], 30); + VERIFY_BITS(a[2], 30); + VERIFY_BITS(a[3], 30); + VERIFY_BITS(a[4], 30); + VERIFY_BITS(a[5], 30); + VERIFY_BITS(a[6], 30); + VERIFY_BITS(a[7], 30); + VERIFY_BITS(a[8], 30); + VERIFY_BITS(a[9], 26); + VERIFY_BITS(b[0], 30); + VERIFY_BITS(b[1], 30); + VERIFY_BITS(b[2], 30); + VERIFY_BITS(b[3], 30); + VERIFY_BITS(b[4], 30); + VERIFY_BITS(b[5], 30); + VERIFY_BITS(b[6], 30); + VERIFY_BITS(b[7], 30); + VERIFY_BITS(b[8], 30); + VERIFY_BITS(b[9], 26); + + /** [... a b c] is a shorthand for ... + a<<52 + b<<26 + c<<0 mod n. + * px is a shorthand for sum(a[i]*b[x-i], i=0..x). + * Note that [x 0 0 0 0 0 0 0 0 0 0] = [x*R1 x*R0]. + */ + + d = (uint64_t)a[0] * b[9] + + (uint64_t)a[1] * b[8] + + (uint64_t)a[2] * b[7] + + (uint64_t)a[3] * b[6] + + (uint64_t)a[4] * b[5] + + (uint64_t)a[5] * b[4] + + (uint64_t)a[6] * b[3] + + (uint64_t)a[7] * b[2] + + (uint64_t)a[8] * b[1] + + (uint64_t)a[9] * b[0]; + /* VERIFY_BITS(d, 64); */ + /* [d 0 0 0 0 0 0 0 0 0] = [p9 0 0 0 0 0 0 0 0 0] */ + t9 = d & M; d >>= 26; + VERIFY_BITS(t9, 26); + VERIFY_BITS(d, 38); + /* [d t9 0 0 0 0 0 0 0 0 0] = [p9 0 0 0 0 0 0 0 0 0] */ + + c = (uint64_t)a[0] * b[0]; + VERIFY_BITS(c, 60); + /* [d t9 0 0 0 0 0 0 0 0 c] = [p9 0 0 0 0 0 0 0 0 p0] */ + d += (uint64_t)a[1] * b[9] + + (uint64_t)a[2] * b[8] + + (uint64_t)a[3] * b[7] + + (uint64_t)a[4] * b[6] + + (uint64_t)a[5] * b[5] + + (uint64_t)a[6] * b[4] + + (uint64_t)a[7] * b[3] + + (uint64_t)a[8] * b[2] + + (uint64_t)a[9] * b[1]; + VERIFY_BITS(d, 63); + /* [d t9 0 0 0 0 0 0 0 0 c] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ + u0 = d & M; d >>= 26; c += u0 * R0; + VERIFY_BITS(u0, 26); + VERIFY_BITS(d, 37); + VERIFY_BITS(c, 61); + /* [d u0 t9 0 0 0 0 0 0 0 0 c-u0*R0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ + t0 = c & M; c >>= 26; c += u0 * R1; + VERIFY_BITS(t0, 26); + VERIFY_BITS(c, 37); + /* [d u0 t9 0 0 0 0 0 0 0 c-u0*R1 t0-u0*R0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ + /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ + + c += (uint64_t)a[0] * b[1] + + (uint64_t)a[1] * b[0]; + VERIFY_BITS(c, 62); + /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p10 p9 0 0 0 0 0 0 0 p1 p0] */ + d += (uint64_t)a[2] * b[9] + + (uint64_t)a[3] * b[8] + + (uint64_t)a[4] * b[7] + + (uint64_t)a[5] * b[6] + + (uint64_t)a[6] * b[5] + + (uint64_t)a[7] * b[4] + + (uint64_t)a[8] * b[3] + + (uint64_t)a[9] * b[2]; + VERIFY_BITS(d, 63); + /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ + u1 = d & M; d >>= 26; c += u1 * R0; + VERIFY_BITS(u1, 26); + VERIFY_BITS(d, 37); + VERIFY_BITS(c, 63); + /* [d u1 0 t9 0 0 0 0 0 0 0 c-u1*R0 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ + t1 = c & M; c >>= 26; c += u1 * R1; + VERIFY_BITS(t1, 26); + VERIFY_BITS(c, 38); + /* [d u1 0 t9 0 0 0 0 0 0 c-u1*R1 t1-u1*R0 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ + /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ + + c += (uint64_t)a[0] * b[2] + + (uint64_t)a[1] * b[1] + + (uint64_t)a[2] * b[0]; + VERIFY_BITS(c, 62); + /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + d += (uint64_t)a[3] * b[9] + + (uint64_t)a[4] * b[8] + + (uint64_t)a[5] * b[7] + + (uint64_t)a[6] * b[6] + + (uint64_t)a[7] * b[5] + + (uint64_t)a[8] * b[4] + + (uint64_t)a[9] * b[3]; + VERIFY_BITS(d, 63); + /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + u2 = d & M; d >>= 26; c += u2 * R0; + VERIFY_BITS(u2, 26); + VERIFY_BITS(d, 37); + VERIFY_BITS(c, 63); + /* [d u2 0 0 t9 0 0 0 0 0 0 c-u2*R0 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + t2 = c & M; c >>= 26; c += u2 * R1; + VERIFY_BITS(t2, 26); + VERIFY_BITS(c, 38); + /* [d u2 0 0 t9 0 0 0 0 0 c-u2*R1 t2-u2*R0 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + + c += (uint64_t)a[0] * b[3] + + (uint64_t)a[1] * b[2] + + (uint64_t)a[2] * b[1] + + (uint64_t)a[3] * b[0]; + VERIFY_BITS(c, 63); + /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + d += (uint64_t)a[4] * b[9] + + (uint64_t)a[5] * b[8] + + (uint64_t)a[6] * b[7] + + (uint64_t)a[7] * b[6] + + (uint64_t)a[8] * b[5] + + (uint64_t)a[9] * b[4]; + VERIFY_BITS(d, 63); + /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + u3 = d & M; d >>= 26; c += u3 * R0; + VERIFY_BITS(u3, 26); + VERIFY_BITS(d, 37); + /* VERIFY_BITS(c, 64); */ + /* [d u3 0 0 0 t9 0 0 0 0 0 c-u3*R0 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + t3 = c & M; c >>= 26; c += u3 * R1; + VERIFY_BITS(t3, 26); + VERIFY_BITS(c, 39); + /* [d u3 0 0 0 t9 0 0 0 0 c-u3*R1 t3-u3*R0 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + + c += (uint64_t)a[0] * b[4] + + (uint64_t)a[1] * b[3] + + (uint64_t)a[2] * b[2] + + (uint64_t)a[3] * b[1] + + (uint64_t)a[4] * b[0]; + VERIFY_BITS(c, 63); + /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + d += (uint64_t)a[5] * b[9] + + (uint64_t)a[6] * b[8] + + (uint64_t)a[7] * b[7] + + (uint64_t)a[8] * b[6] + + (uint64_t)a[9] * b[5]; + VERIFY_BITS(d, 62); + /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + u4 = d & M; d >>= 26; c += u4 * R0; + VERIFY_BITS(u4, 26); + VERIFY_BITS(d, 36); + /* VERIFY_BITS(c, 64); */ + /* [d u4 0 0 0 0 t9 0 0 0 0 c-u4*R0 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + t4 = c & M; c >>= 26; c += u4 * R1; + VERIFY_BITS(t4, 26); + VERIFY_BITS(c, 39); + /* [d u4 0 0 0 0 t9 0 0 0 c-u4*R1 t4-u4*R0 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + + c += (uint64_t)a[0] * b[5] + + (uint64_t)a[1] * b[4] + + (uint64_t)a[2] * b[3] + + (uint64_t)a[3] * b[2] + + (uint64_t)a[4] * b[1] + + (uint64_t)a[5] * b[0]; + VERIFY_BITS(c, 63); + /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + d += (uint64_t)a[6] * b[9] + + (uint64_t)a[7] * b[8] + + (uint64_t)a[8] * b[7] + + (uint64_t)a[9] * b[6]; + VERIFY_BITS(d, 62); + /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + u5 = d & M; d >>= 26; c += u5 * R0; + VERIFY_BITS(u5, 26); + VERIFY_BITS(d, 36); + /* VERIFY_BITS(c, 64); */ + /* [d u5 0 0 0 0 0 t9 0 0 0 c-u5*R0 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + t5 = c & M; c >>= 26; c += u5 * R1; + VERIFY_BITS(t5, 26); + VERIFY_BITS(c, 39); + /* [d u5 0 0 0 0 0 t9 0 0 c-u5*R1 t5-u5*R0 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + + c += (uint64_t)a[0] * b[6] + + (uint64_t)a[1] * b[5] + + (uint64_t)a[2] * b[4] + + (uint64_t)a[3] * b[3] + + (uint64_t)a[4] * b[2] + + (uint64_t)a[5] * b[1] + + (uint64_t)a[6] * b[0]; + VERIFY_BITS(c, 63); + /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + d += (uint64_t)a[7] * b[9] + + (uint64_t)a[8] * b[8] + + (uint64_t)a[9] * b[7]; + VERIFY_BITS(d, 61); + /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + u6 = d & M; d >>= 26; c += u6 * R0; + VERIFY_BITS(u6, 26); + VERIFY_BITS(d, 35); + /* VERIFY_BITS(c, 64); */ + /* [d u6 0 0 0 0 0 0 t9 0 0 c-u6*R0 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + t6 = c & M; c >>= 26; c += u6 * R1; + VERIFY_BITS(t6, 26); + VERIFY_BITS(c, 39); + /* [d u6 0 0 0 0 0 0 t9 0 c-u6*R1 t6-u6*R0 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + + c += (uint64_t)a[0] * b[7] + + (uint64_t)a[1] * b[6] + + (uint64_t)a[2] * b[5] + + (uint64_t)a[3] * b[4] + + (uint64_t)a[4] * b[3] + + (uint64_t)a[5] * b[2] + + (uint64_t)a[6] * b[1] + + (uint64_t)a[7] * b[0]; + /* VERIFY_BITS(c, 64); */ + VERIFY_CHECK(c <= 0x8000007C00000007ULL); + /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + d += (uint64_t)a[8] * b[9] + + (uint64_t)a[9] * b[8]; + VERIFY_BITS(d, 58); + /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + u7 = d & M; d >>= 26; c += u7 * R0; + VERIFY_BITS(u7, 26); + VERIFY_BITS(d, 32); + /* VERIFY_BITS(c, 64); */ + VERIFY_CHECK(c <= 0x800001703FFFC2F7ULL); + /* [d u7 0 0 0 0 0 0 0 t9 0 c-u7*R0 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + t7 = c & M; c >>= 26; c += u7 * R1; + VERIFY_BITS(t7, 26); + VERIFY_BITS(c, 38); + /* [d u7 0 0 0 0 0 0 0 t9 c-u7*R1 t7-u7*R0 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + + c += (uint64_t)a[0] * b[8] + + (uint64_t)a[1] * b[7] + + (uint64_t)a[2] * b[6] + + (uint64_t)a[3] * b[5] + + (uint64_t)a[4] * b[4] + + (uint64_t)a[5] * b[3] + + (uint64_t)a[6] * b[2] + + (uint64_t)a[7] * b[1] + + (uint64_t)a[8] * b[0]; + /* VERIFY_BITS(c, 64); */ + VERIFY_CHECK(c <= 0x9000007B80000008ULL); + /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + d += (uint64_t)a[9] * b[9]; + VERIFY_BITS(d, 57); + /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + u8 = d & M; d >>= 26; c += u8 * R0; + VERIFY_BITS(u8, 26); + VERIFY_BITS(d, 31); + /* VERIFY_BITS(c, 64); */ + VERIFY_CHECK(c <= 0x9000016FBFFFC2F8ULL); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 t4 t3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + + r[3] = t3; + VERIFY_BITS(r[3], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 t4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[4] = t4; + VERIFY_BITS(r[4], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[5] = t5; + VERIFY_BITS(r[5], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[6] = t6; + VERIFY_BITS(r[6], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[7] = t7; + VERIFY_BITS(r[7], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + + r[8] = c & M; c >>= 26; c += u8 * R1; + VERIFY_BITS(r[8], 26); + VERIFY_BITS(c, 39); + /* [d u8 0 0 0 0 0 0 0 0 t9+c-u8*R1 r8-u8*R0 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 0 0 0 t9+c r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + c += d * R0 + t9; + VERIFY_BITS(c, 45); + /* [d 0 0 0 0 0 0 0 0 0 c-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[9] = c & (M >> 4); c >>= 22; c += d * (R1 << 4); + VERIFY_BITS(r[9], 22); + VERIFY_BITS(c, 46); + /* [d 0 0 0 0 0 0 0 0 r9+((c-d*R1<<4)<<22)-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 0 -d*R1 r9+(c<<22)-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + + d = c * (R0 >> 4) + t0; + VERIFY_BITS(d, 56); + /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1 d-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[0] = d & M; d >>= 26; + VERIFY_BITS(r[0], 26); + VERIFY_BITS(d, 30); + /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1+d r0-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + d += c * (R1 >> 4) + t1; + VERIFY_BITS(d, 53); + VERIFY_CHECK(d <= 0x10000003FFFFBFULL); + /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 d-c*R1>>4 r0-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [r9 r8 r7 r6 r5 r4 r3 t2 d r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[1] = d & M; d >>= 26; + VERIFY_BITS(r[1], 26); + VERIFY_BITS(d, 27); + VERIFY_CHECK(d <= 0x4000000ULL); + /* [r9 r8 r7 r6 r5 r4 r3 t2+d r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + d += t2; + VERIFY_BITS(d, 27); + /* [r9 r8 r7 r6 r5 r4 r3 d r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[2] = d; + VERIFY_BITS(r[2], 27); + /* [r9 r8 r7 r6 r5 r4 r3 r2 r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ +} + +SECP256K1_INLINE static void secp256k1_fe_sqr_inner(uint32_t *r, const uint32_t *a) { + uint64_t c, d; + uint64_t u0, u1, u2, u3, u4, u5, u6, u7, u8; + uint32_t t9, t0, t1, t2, t3, t4, t5, t6, t7; + const uint32_t M = 0x3FFFFFFUL, R0 = 0x3D10UL, R1 = 0x400UL; + + VERIFY_BITS(a[0], 30); + VERIFY_BITS(a[1], 30); + VERIFY_BITS(a[2], 30); + VERIFY_BITS(a[3], 30); + VERIFY_BITS(a[4], 30); + VERIFY_BITS(a[5], 30); + VERIFY_BITS(a[6], 30); + VERIFY_BITS(a[7], 30); + VERIFY_BITS(a[8], 30); + VERIFY_BITS(a[9], 26); + + /** [... a b c] is a shorthand for ... + a<<52 + b<<26 + c<<0 mod n. + * px is a shorthand for sum(a[i]*a[x-i], i=0..x). + * Note that [x 0 0 0 0 0 0 0 0 0 0] = [x*R1 x*R0]. + */ + + d = (uint64_t)(a[0]*2) * a[9] + + (uint64_t)(a[1]*2) * a[8] + + (uint64_t)(a[2]*2) * a[7] + + (uint64_t)(a[3]*2) * a[6] + + (uint64_t)(a[4]*2) * a[5]; + /* VERIFY_BITS(d, 64); */ + /* [d 0 0 0 0 0 0 0 0 0] = [p9 0 0 0 0 0 0 0 0 0] */ + t9 = d & M; d >>= 26; + VERIFY_BITS(t9, 26); + VERIFY_BITS(d, 38); + /* [d t9 0 0 0 0 0 0 0 0 0] = [p9 0 0 0 0 0 0 0 0 0] */ + + c = (uint64_t)a[0] * a[0]; + VERIFY_BITS(c, 60); + /* [d t9 0 0 0 0 0 0 0 0 c] = [p9 0 0 0 0 0 0 0 0 p0] */ + d += (uint64_t)(a[1]*2) * a[9] + + (uint64_t)(a[2]*2) * a[8] + + (uint64_t)(a[3]*2) * a[7] + + (uint64_t)(a[4]*2) * a[6] + + (uint64_t)a[5] * a[5]; + VERIFY_BITS(d, 63); + /* [d t9 0 0 0 0 0 0 0 0 c] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ + u0 = d & M; d >>= 26; c += u0 * R0; + VERIFY_BITS(u0, 26); + VERIFY_BITS(d, 37); + VERIFY_BITS(c, 61); + /* [d u0 t9 0 0 0 0 0 0 0 0 c-u0*R0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ + t0 = c & M; c >>= 26; c += u0 * R1; + VERIFY_BITS(t0, 26); + VERIFY_BITS(c, 37); + /* [d u0 t9 0 0 0 0 0 0 0 c-u0*R1 t0-u0*R0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ + /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ + + c += (uint64_t)(a[0]*2) * a[1]; + VERIFY_BITS(c, 62); + /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p10 p9 0 0 0 0 0 0 0 p1 p0] */ + d += (uint64_t)(a[2]*2) * a[9] + + (uint64_t)(a[3]*2) * a[8] + + (uint64_t)(a[4]*2) * a[7] + + (uint64_t)(a[5]*2) * a[6]; + VERIFY_BITS(d, 63); + /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ + u1 = d & M; d >>= 26; c += u1 * R0; + VERIFY_BITS(u1, 26); + VERIFY_BITS(d, 37); + VERIFY_BITS(c, 63); + /* [d u1 0 t9 0 0 0 0 0 0 0 c-u1*R0 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ + t1 = c & M; c >>= 26; c += u1 * R1; + VERIFY_BITS(t1, 26); + VERIFY_BITS(c, 38); + /* [d u1 0 t9 0 0 0 0 0 0 c-u1*R1 t1-u1*R0 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ + /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ + + c += (uint64_t)(a[0]*2) * a[2] + + (uint64_t)a[1] * a[1]; + VERIFY_BITS(c, 62); + /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + d += (uint64_t)(a[3]*2) * a[9] + + (uint64_t)(a[4]*2) * a[8] + + (uint64_t)(a[5]*2) * a[7] + + (uint64_t)a[6] * a[6]; + VERIFY_BITS(d, 63); + /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + u2 = d & M; d >>= 26; c += u2 * R0; + VERIFY_BITS(u2, 26); + VERIFY_BITS(d, 37); + VERIFY_BITS(c, 63); + /* [d u2 0 0 t9 0 0 0 0 0 0 c-u2*R0 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + t2 = c & M; c >>= 26; c += u2 * R1; + VERIFY_BITS(t2, 26); + VERIFY_BITS(c, 38); + /* [d u2 0 0 t9 0 0 0 0 0 c-u2*R1 t2-u2*R0 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + + c += (uint64_t)(a[0]*2) * a[3] + + (uint64_t)(a[1]*2) * a[2]; + VERIFY_BITS(c, 63); + /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + d += (uint64_t)(a[4]*2) * a[9] + + (uint64_t)(a[5]*2) * a[8] + + (uint64_t)(a[6]*2) * a[7]; + VERIFY_BITS(d, 63); + /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + u3 = d & M; d >>= 26; c += u3 * R0; + VERIFY_BITS(u3, 26); + VERIFY_BITS(d, 37); + /* VERIFY_BITS(c, 64); */ + /* [d u3 0 0 0 t9 0 0 0 0 0 c-u3*R0 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + t3 = c & M; c >>= 26; c += u3 * R1; + VERIFY_BITS(t3, 26); + VERIFY_BITS(c, 39); + /* [d u3 0 0 0 t9 0 0 0 0 c-u3*R1 t3-u3*R0 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + + c += (uint64_t)(a[0]*2) * a[4] + + (uint64_t)(a[1]*2) * a[3] + + (uint64_t)a[2] * a[2]; + VERIFY_BITS(c, 63); + /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + d += (uint64_t)(a[5]*2) * a[9] + + (uint64_t)(a[6]*2) * a[8] + + (uint64_t)a[7] * a[7]; + VERIFY_BITS(d, 62); + /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + u4 = d & M; d >>= 26; c += u4 * R0; + VERIFY_BITS(u4, 26); + VERIFY_BITS(d, 36); + /* VERIFY_BITS(c, 64); */ + /* [d u4 0 0 0 0 t9 0 0 0 0 c-u4*R0 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + t4 = c & M; c >>= 26; c += u4 * R1; + VERIFY_BITS(t4, 26); + VERIFY_BITS(c, 39); + /* [d u4 0 0 0 0 t9 0 0 0 c-u4*R1 t4-u4*R0 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + + c += (uint64_t)(a[0]*2) * a[5] + + (uint64_t)(a[1]*2) * a[4] + + (uint64_t)(a[2]*2) * a[3]; + VERIFY_BITS(c, 63); + /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + d += (uint64_t)(a[6]*2) * a[9] + + (uint64_t)(a[7]*2) * a[8]; + VERIFY_BITS(d, 62); + /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + u5 = d & M; d >>= 26; c += u5 * R0; + VERIFY_BITS(u5, 26); + VERIFY_BITS(d, 36); + /* VERIFY_BITS(c, 64); */ + /* [d u5 0 0 0 0 0 t9 0 0 0 c-u5*R0 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + t5 = c & M; c >>= 26; c += u5 * R1; + VERIFY_BITS(t5, 26); + VERIFY_BITS(c, 39); + /* [d u5 0 0 0 0 0 t9 0 0 c-u5*R1 t5-u5*R0 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + + c += (uint64_t)(a[0]*2) * a[6] + + (uint64_t)(a[1]*2) * a[5] + + (uint64_t)(a[2]*2) * a[4] + + (uint64_t)a[3] * a[3]; + VERIFY_BITS(c, 63); + /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + d += (uint64_t)(a[7]*2) * a[9] + + (uint64_t)a[8] * a[8]; + VERIFY_BITS(d, 61); + /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + u6 = d & M; d >>= 26; c += u6 * R0; + VERIFY_BITS(u6, 26); + VERIFY_BITS(d, 35); + /* VERIFY_BITS(c, 64); */ + /* [d u6 0 0 0 0 0 0 t9 0 0 c-u6*R0 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + t6 = c & M; c >>= 26; c += u6 * R1; + VERIFY_BITS(t6, 26); + VERIFY_BITS(c, 39); + /* [d u6 0 0 0 0 0 0 t9 0 c-u6*R1 t6-u6*R0 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + + c += (uint64_t)(a[0]*2) * a[7] + + (uint64_t)(a[1]*2) * a[6] + + (uint64_t)(a[2]*2) * a[5] + + (uint64_t)(a[3]*2) * a[4]; + /* VERIFY_BITS(c, 64); */ + VERIFY_CHECK(c <= 0x8000007C00000007ULL); + /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + d += (uint64_t)(a[8]*2) * a[9]; + VERIFY_BITS(d, 58); + /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + u7 = d & M; d >>= 26; c += u7 * R0; + VERIFY_BITS(u7, 26); + VERIFY_BITS(d, 32); + /* VERIFY_BITS(c, 64); */ + VERIFY_CHECK(c <= 0x800001703FFFC2F7ULL); + /* [d u7 0 0 0 0 0 0 0 t9 0 c-u7*R0 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + t7 = c & M; c >>= 26; c += u7 * R1; + VERIFY_BITS(t7, 26); + VERIFY_BITS(c, 38); + /* [d u7 0 0 0 0 0 0 0 t9 c-u7*R1 t7-u7*R0 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + + c += (uint64_t)(a[0]*2) * a[8] + + (uint64_t)(a[1]*2) * a[7] + + (uint64_t)(a[2]*2) * a[6] + + (uint64_t)(a[3]*2) * a[5] + + (uint64_t)a[4] * a[4]; + /* VERIFY_BITS(c, 64); */ + VERIFY_CHECK(c <= 0x9000007B80000008ULL); + /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + d += (uint64_t)a[9] * a[9]; + VERIFY_BITS(d, 57); + /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + u8 = d & M; d >>= 26; c += u8 * R0; + VERIFY_BITS(u8, 26); + VERIFY_BITS(d, 31); + /* VERIFY_BITS(c, 64); */ + VERIFY_CHECK(c <= 0x9000016FBFFFC2F8ULL); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 t4 t3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + + r[3] = t3; + VERIFY_BITS(r[3], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 t4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[4] = t4; + VERIFY_BITS(r[4], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[5] = t5; + VERIFY_BITS(r[5], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[6] = t6; + VERIFY_BITS(r[6], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[7] = t7; + VERIFY_BITS(r[7], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + + r[8] = c & M; c >>= 26; c += u8 * R1; + VERIFY_BITS(r[8], 26); + VERIFY_BITS(c, 39); + /* [d u8 0 0 0 0 0 0 0 0 t9+c-u8*R1 r8-u8*R0 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 0 0 0 t9+c r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + c += d * R0 + t9; + VERIFY_BITS(c, 45); + /* [d 0 0 0 0 0 0 0 0 0 c-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[9] = c & (M >> 4); c >>= 22; c += d * (R1 << 4); + VERIFY_BITS(r[9], 22); + VERIFY_BITS(c, 46); + /* [d 0 0 0 0 0 0 0 0 r9+((c-d*R1<<4)<<22)-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 0 -d*R1 r9+(c<<22)-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + + d = c * (R0 >> 4) + t0; + VERIFY_BITS(d, 56); + /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1 d-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[0] = d & M; d >>= 26; + VERIFY_BITS(r[0], 26); + VERIFY_BITS(d, 30); + /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1+d r0-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + d += c * (R1 >> 4) + t1; + VERIFY_BITS(d, 53); + VERIFY_CHECK(d <= 0x10000003FFFFBFULL); + /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 d-c*R1>>4 r0-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [r9 r8 r7 r6 r5 r4 r3 t2 d r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[1] = d & M; d >>= 26; + VERIFY_BITS(r[1], 26); + VERIFY_BITS(d, 27); + VERIFY_CHECK(d <= 0x4000000ULL); + /* [r9 r8 r7 r6 r5 r4 r3 t2+d r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + d += t2; + VERIFY_BITS(d, 27); + /* [r9 r8 r7 r6 r5 r4 r3 d r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[2] = d; + VERIFY_BITS(r[2], 27); + /* [r9 r8 r7 r6 r5 r4 r3 r2 r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ +} + + +static void secp256k1_fe_mul(secp256k1_fe_t *r, const secp256k1_fe_t *a, const secp256k1_fe_t * SECP256K1_RESTRICT b) { +#ifdef VERIFY + VERIFY_CHECK(a->magnitude <= 8); + VERIFY_CHECK(b->magnitude <= 8); + secp256k1_fe_verify(a); + secp256k1_fe_verify(b); + VERIFY_CHECK(r != b); +#endif + secp256k1_fe_mul_inner(r->n, a->n, b->n); +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +static void secp256k1_fe_sqr(secp256k1_fe_t *r, const secp256k1_fe_t *a) { +#ifdef VERIFY + VERIFY_CHECK(a->magnitude <= 8); + secp256k1_fe_verify(a); +#endif + secp256k1_fe_sqr_inner(r->n, a->n); +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +static SECP256K1_INLINE void secp256k1_fe_cmov(secp256k1_fe_t *r, const secp256k1_fe_t *a, int flag) { + uint32_t mask0, mask1; + mask0 = flag + ~((uint32_t)0); + mask1 = ~mask0; + r->n[0] = (r->n[0] & mask0) | (a->n[0] & mask1); + r->n[1] = (r->n[1] & mask0) | (a->n[1] & mask1); + r->n[2] = (r->n[2] & mask0) | (a->n[2] & mask1); + r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1); + r->n[4] = (r->n[4] & mask0) | (a->n[4] & mask1); + r->n[5] = (r->n[5] & mask0) | (a->n[5] & mask1); + r->n[6] = (r->n[6] & mask0) | (a->n[6] & mask1); + r->n[7] = (r->n[7] & mask0) | (a->n[7] & mask1); + r->n[8] = (r->n[8] & mask0) | (a->n[8] & mask1); + r->n[9] = (r->n[9] & mask0) | (a->n[9] & mask1); +#ifdef VERIFY + r->magnitude = (r->magnitude & mask0) | (a->magnitude & mask1); + r->normalized = (r->normalized & mask0) | (a->normalized & mask1); +#endif +} + +static SECP256K1_INLINE void secp256k1_fe_storage_cmov(secp256k1_fe_storage_t *r, const secp256k1_fe_storage_t *a, int flag) { + uint32_t mask0, mask1; + mask0 = flag + ~((uint32_t)0); + mask1 = ~mask0; + r->n[0] = (r->n[0] & mask0) | (a->n[0] & mask1); + r->n[1] = (r->n[1] & mask0) | (a->n[1] & mask1); + r->n[2] = (r->n[2] & mask0) | (a->n[2] & mask1); + r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1); + r->n[4] = (r->n[4] & mask0) | (a->n[4] & mask1); + r->n[5] = (r->n[5] & mask0) | (a->n[5] & mask1); + r->n[6] = (r->n[6] & mask0) | (a->n[6] & mask1); + r->n[7] = (r->n[7] & mask0) | (a->n[7] & mask1); +} + +static void secp256k1_fe_to_storage(secp256k1_fe_storage_t *r, const secp256k1_fe_t *a) { +#ifdef VERIFY + VERIFY_CHECK(a->normalized); +#endif + r->n[0] = a->n[0] | a->n[1] << 26; + r->n[1] = a->n[1] >> 6 | a->n[2] << 20; + r->n[2] = a->n[2] >> 12 | a->n[3] << 14; + r->n[3] = a->n[3] >> 18 | a->n[4] << 8; + r->n[4] = a->n[4] >> 24 | a->n[5] << 2 | a->n[6] << 28; + r->n[5] = a->n[6] >> 4 | a->n[7] << 22; + r->n[6] = a->n[7] >> 10 | a->n[8] << 16; + r->n[7] = a->n[8] >> 16 | a->n[9] << 10; +} + +static SECP256K1_INLINE void secp256k1_fe_from_storage(secp256k1_fe_t *r, const secp256k1_fe_storage_t *a) { + r->n[0] = a->n[0] & 0x3FFFFFFUL; + r->n[1] = a->n[0] >> 26 | ((a->n[1] << 6) & 0x3FFFFFFUL); + r->n[2] = a->n[1] >> 20 | ((a->n[2] << 12) & 0x3FFFFFFUL); + r->n[3] = a->n[2] >> 14 | ((a->n[3] << 18) & 0x3FFFFFFUL); + r->n[4] = a->n[3] >> 8 | ((a->n[4] << 24) & 0x3FFFFFFUL); + r->n[5] = (a->n[4] >> 2) & 0x3FFFFFFUL; + r->n[6] = a->n[4] >> 28 | ((a->n[5] << 4) & 0x3FFFFFFUL); + r->n[7] = a->n[5] >> 22 | ((a->n[6] << 10) & 0x3FFFFFFUL); + r->n[8] = a->n[6] >> 16 | ((a->n[7] << 16) & 0x3FFFFFFUL); + r->n[9] = a->n[7] >> 10; +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; +#endif +} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/field_5x52.h b/src/cryptoconditions/src/include/secp256k1/src/field_5x52.h new file mode 100644 index 000000000..4513d36f4 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/field_5x52.h @@ -0,0 +1,47 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_FIELD_REPR_ +#define _SECP256K1_FIELD_REPR_ + +#include + +typedef struct { + /* X = sum(i=0..4, elem[i]*2^52) mod n */ + uint64_t n[5]; +#ifdef VERIFY + int magnitude; + int normalized; +#endif +} secp256k1_fe_t; + +/* Unpacks a constant into a overlapping multi-limbed FE element. */ +#define SECP256K1_FE_CONST_INNER(d7, d6, d5, d4, d3, d2, d1, d0) { \ + (d0) | ((uint64_t)(d1) & 0xFFFFFUL) << 32, \ + ((d1) >> 20) | ((uint64_t)(d2)) << 12 | ((uint64_t)(d3) & 0xFFUL) << 44, \ + ((d3) >> 8) | ((uint64_t)(d4) & 0xFFFFFFFUL) << 24, \ + ((d4) >> 28) | ((uint64_t)(d5)) << 4 | ((uint64_t)(d6) & 0xFFFFUL) << 36, \ + ((d6) >> 16) | ((uint64_t)(d7)) << 16 \ +} + +#ifdef VERIFY +#define SECP256K1_FE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {SECP256K1_FE_CONST_INNER((d7), (d6), (d5), (d4), (d3), (d2), (d1), (d0)), 1, 1} +#else +#define SECP256K1_FE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {SECP256K1_FE_CONST_INNER((d7), (d6), (d5), (d4), (d3), (d2), (d1), (d0))} +#endif + +typedef struct { + uint64_t n[4]; +} secp256k1_fe_storage_t; + +#define SECP256K1_FE_STORAGE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{ \ + (d0) | ((uint64_t)(d1)) << 32, \ + (d2) | ((uint64_t)(d3)) << 32, \ + (d4) | ((uint64_t)(d5)) << 32, \ + (d6) | ((uint64_t)(d7)) << 32 \ +}} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/field_5x52_asm_impl.h b/src/cryptoconditions/src/include/secp256k1/src/field_5x52_asm_impl.h new file mode 100644 index 000000000..98cc004bf --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/field_5x52_asm_impl.h @@ -0,0 +1,502 @@ +/********************************************************************** + * Copyright (c) 2013-2014 Diederik Huys, Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +/** + * Changelog: + * - March 2013, Diederik Huys: original version + * - November 2014, Pieter Wuille: updated to use Peter Dettman's parallel multiplication algorithm + * - December 2014, Pieter Wuille: converted from YASM to GCC inline assembly + */ + +#ifndef _SECP256K1_FIELD_INNER5X52_IMPL_H_ +#define _SECP256K1_FIELD_INNER5X52_IMPL_H_ + +SECP256K1_INLINE static void secp256k1_fe_mul_inner(uint64_t *r, const uint64_t *a, const uint64_t * SECP256K1_RESTRICT b) { +/** + * Registers: rdx:rax = multiplication accumulator + * r9:r8 = c + * r15:rcx = d + * r10-r14 = a0-a4 + * rbx = b + * rdi = r + * rsi = a / t? + */ + uint64_t tmp1, tmp2, tmp3; +__asm__ __volatile__( + "movq 0(%%rsi),%%r10\n" + "movq 8(%%rsi),%%r11\n" + "movq 16(%%rsi),%%r12\n" + "movq 24(%%rsi),%%r13\n" + "movq 32(%%rsi),%%r14\n" + + /* d += a3 * b0 */ + "movq 0(%%rbx),%%rax\n" + "mulq %%r13\n" + "movq %%rax,%%rcx\n" + "movq %%rdx,%%r15\n" + /* d += a2 * b1 */ + "movq 8(%%rbx),%%rax\n" + "mulq %%r12\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += a1 * b2 */ + "movq 16(%%rbx),%%rax\n" + "mulq %%r11\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d = a0 * b3 */ + "movq 24(%%rbx),%%rax\n" + "mulq %%r10\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* c = a4 * b4 */ + "movq 32(%%rbx),%%rax\n" + "mulq %%r14\n" + "movq %%rax,%%r8\n" + "movq %%rdx,%%r9\n" + /* d += (c & M) * R */ + "movq $0xfffffffffffff,%%rdx\n" + "andq %%rdx,%%rax\n" + "movq $0x1000003d10,%%rdx\n" + "mulq %%rdx\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* c >>= 52 (%%r8 only) */ + "shrdq $52,%%r9,%%r8\n" + /* t3 (tmp1) = d & M */ + "movq %%rcx,%%rsi\n" + "movq $0xfffffffffffff,%%rdx\n" + "andq %%rdx,%%rsi\n" + "movq %%rsi,%q1\n" + /* d >>= 52 */ + "shrdq $52,%%r15,%%rcx\n" + "xorq %%r15,%%r15\n" + /* d += a4 * b0 */ + "movq 0(%%rbx),%%rax\n" + "mulq %%r14\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += a3 * b1 */ + "movq 8(%%rbx),%%rax\n" + "mulq %%r13\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += a2 * b2 */ + "movq 16(%%rbx),%%rax\n" + "mulq %%r12\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += a1 * b3 */ + "movq 24(%%rbx),%%rax\n" + "mulq %%r11\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += a0 * b4 */ + "movq 32(%%rbx),%%rax\n" + "mulq %%r10\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += c * R */ + "movq %%r8,%%rax\n" + "movq $0x1000003d10,%%rdx\n" + "mulq %%rdx\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* t4 = d & M (%%rsi) */ + "movq %%rcx,%%rsi\n" + "movq $0xfffffffffffff,%%rdx\n" + "andq %%rdx,%%rsi\n" + /* d >>= 52 */ + "shrdq $52,%%r15,%%rcx\n" + "xorq %%r15,%%r15\n" + /* tx = t4 >> 48 (tmp3) */ + "movq %%rsi,%%rax\n" + "shrq $48,%%rax\n" + "movq %%rax,%q3\n" + /* t4 &= (M >> 4) (tmp2) */ + "movq $0xffffffffffff,%%rax\n" + "andq %%rax,%%rsi\n" + "movq %%rsi,%q2\n" + /* c = a0 * b0 */ + "movq 0(%%rbx),%%rax\n" + "mulq %%r10\n" + "movq %%rax,%%r8\n" + "movq %%rdx,%%r9\n" + /* d += a4 * b1 */ + "movq 8(%%rbx),%%rax\n" + "mulq %%r14\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += a3 * b2 */ + "movq 16(%%rbx),%%rax\n" + "mulq %%r13\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += a2 * b3 */ + "movq 24(%%rbx),%%rax\n" + "mulq %%r12\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += a1 * b4 */ + "movq 32(%%rbx),%%rax\n" + "mulq %%r11\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* u0 = d & M (%%rsi) */ + "movq %%rcx,%%rsi\n" + "movq $0xfffffffffffff,%%rdx\n" + "andq %%rdx,%%rsi\n" + /* d >>= 52 */ + "shrdq $52,%%r15,%%rcx\n" + "xorq %%r15,%%r15\n" + /* u0 = (u0 << 4) | tx (%%rsi) */ + "shlq $4,%%rsi\n" + "movq %q3,%%rax\n" + "orq %%rax,%%rsi\n" + /* c += u0 * (R >> 4) */ + "movq $0x1000003d1,%%rax\n" + "mulq %%rsi\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* r[0] = c & M */ + "movq %%r8,%%rax\n" + "movq $0xfffffffffffff,%%rdx\n" + "andq %%rdx,%%rax\n" + "movq %%rax,0(%%rdi)\n" + /* c >>= 52 */ + "shrdq $52,%%r9,%%r8\n" + "xorq %%r9,%%r9\n" + /* c += a1 * b0 */ + "movq 0(%%rbx),%%rax\n" + "mulq %%r11\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* c += a0 * b1 */ + "movq 8(%%rbx),%%rax\n" + "mulq %%r10\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* d += a4 * b2 */ + "movq 16(%%rbx),%%rax\n" + "mulq %%r14\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += a3 * b3 */ + "movq 24(%%rbx),%%rax\n" + "mulq %%r13\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += a2 * b4 */ + "movq 32(%%rbx),%%rax\n" + "mulq %%r12\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* c += (d & M) * R */ + "movq %%rcx,%%rax\n" + "movq $0xfffffffffffff,%%rdx\n" + "andq %%rdx,%%rax\n" + "movq $0x1000003d10,%%rdx\n" + "mulq %%rdx\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* d >>= 52 */ + "shrdq $52,%%r15,%%rcx\n" + "xorq %%r15,%%r15\n" + /* r[1] = c & M */ + "movq %%r8,%%rax\n" + "movq $0xfffffffffffff,%%rdx\n" + "andq %%rdx,%%rax\n" + "movq %%rax,8(%%rdi)\n" + /* c >>= 52 */ + "shrdq $52,%%r9,%%r8\n" + "xorq %%r9,%%r9\n" + /* c += a2 * b0 */ + "movq 0(%%rbx),%%rax\n" + "mulq %%r12\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* c += a1 * b1 */ + "movq 8(%%rbx),%%rax\n" + "mulq %%r11\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* c += a0 * b2 (last use of %%r10 = a0) */ + "movq 16(%%rbx),%%rax\n" + "mulq %%r10\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* fetch t3 (%%r10, overwrites a0), t4 (%%rsi) */ + "movq %q2,%%rsi\n" + "movq %q1,%%r10\n" + /* d += a4 * b3 */ + "movq 24(%%rbx),%%rax\n" + "mulq %%r14\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += a3 * b4 */ + "movq 32(%%rbx),%%rax\n" + "mulq %%r13\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* c += (d & M) * R */ + "movq %%rcx,%%rax\n" + "movq $0xfffffffffffff,%%rdx\n" + "andq %%rdx,%%rax\n" + "movq $0x1000003d10,%%rdx\n" + "mulq %%rdx\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* d >>= 52 (%%rcx only) */ + "shrdq $52,%%r15,%%rcx\n" + /* r[2] = c & M */ + "movq %%r8,%%rax\n" + "movq $0xfffffffffffff,%%rdx\n" + "andq %%rdx,%%rax\n" + "movq %%rax,16(%%rdi)\n" + /* c >>= 52 */ + "shrdq $52,%%r9,%%r8\n" + "xorq %%r9,%%r9\n" + /* c += t3 */ + "addq %%r10,%%r8\n" + /* c += d * R */ + "movq %%rcx,%%rax\n" + "movq $0x1000003d10,%%rdx\n" + "mulq %%rdx\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* r[3] = c & M */ + "movq %%r8,%%rax\n" + "movq $0xfffffffffffff,%%rdx\n" + "andq %%rdx,%%rax\n" + "movq %%rax,24(%%rdi)\n" + /* c >>= 52 (%%r8 only) */ + "shrdq $52,%%r9,%%r8\n" + /* c += t4 (%%r8 only) */ + "addq %%rsi,%%r8\n" + /* r[4] = c */ + "movq %%r8,32(%%rdi)\n" +: "+S"(a), "=m"(tmp1), "=m"(tmp2), "=m"(tmp3) +: "b"(b), "D"(r) +: "%rax", "%rcx", "%rdx", "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15", "cc", "memory" +); +} + +SECP256K1_INLINE static void secp256k1_fe_sqr_inner(uint64_t *r, const uint64_t *a) { +/** + * Registers: rdx:rax = multiplication accumulator + * r9:r8 = c + * rcx:rbx = d + * r10-r14 = a0-a4 + * r15 = M (0xfffffffffffff) + * rdi = r + * rsi = a / t? + */ + uint64_t tmp1, tmp2, tmp3; +__asm__ __volatile__( + "movq 0(%%rsi),%%r10\n" + "movq 8(%%rsi),%%r11\n" + "movq 16(%%rsi),%%r12\n" + "movq 24(%%rsi),%%r13\n" + "movq 32(%%rsi),%%r14\n" + "movq $0xfffffffffffff,%%r15\n" + + /* d = (a0*2) * a3 */ + "leaq (%%r10,%%r10,1),%%rax\n" + "mulq %%r13\n" + "movq %%rax,%%rbx\n" + "movq %%rdx,%%rcx\n" + /* d += (a1*2) * a2 */ + "leaq (%%r11,%%r11,1),%%rax\n" + "mulq %%r12\n" + "addq %%rax,%%rbx\n" + "adcq %%rdx,%%rcx\n" + /* c = a4 * a4 */ + "movq %%r14,%%rax\n" + "mulq %%r14\n" + "movq %%rax,%%r8\n" + "movq %%rdx,%%r9\n" + /* d += (c & M) * R */ + "andq %%r15,%%rax\n" + "movq $0x1000003d10,%%rdx\n" + "mulq %%rdx\n" + "addq %%rax,%%rbx\n" + "adcq %%rdx,%%rcx\n" + /* c >>= 52 (%%r8 only) */ + "shrdq $52,%%r9,%%r8\n" + /* t3 (tmp1) = d & M */ + "movq %%rbx,%%rsi\n" + "andq %%r15,%%rsi\n" + "movq %%rsi,%q1\n" + /* d >>= 52 */ + "shrdq $52,%%rcx,%%rbx\n" + "xorq %%rcx,%%rcx\n" + /* a4 *= 2 */ + "addq %%r14,%%r14\n" + /* d += a0 * a4 */ + "movq %%r10,%%rax\n" + "mulq %%r14\n" + "addq %%rax,%%rbx\n" + "adcq %%rdx,%%rcx\n" + /* d+= (a1*2) * a3 */ + "leaq (%%r11,%%r11,1),%%rax\n" + "mulq %%r13\n" + "addq %%rax,%%rbx\n" + "adcq %%rdx,%%rcx\n" + /* d += a2 * a2 */ + "movq %%r12,%%rax\n" + "mulq %%r12\n" + "addq %%rax,%%rbx\n" + "adcq %%rdx,%%rcx\n" + /* d += c * R */ + "movq %%r8,%%rax\n" + "movq $0x1000003d10,%%rdx\n" + "mulq %%rdx\n" + "addq %%rax,%%rbx\n" + "adcq %%rdx,%%rcx\n" + /* t4 = d & M (%%rsi) */ + "movq %%rbx,%%rsi\n" + "andq %%r15,%%rsi\n" + /* d >>= 52 */ + "shrdq $52,%%rcx,%%rbx\n" + "xorq %%rcx,%%rcx\n" + /* tx = t4 >> 48 (tmp3) */ + "movq %%rsi,%%rax\n" + "shrq $48,%%rax\n" + "movq %%rax,%q3\n" + /* t4 &= (M >> 4) (tmp2) */ + "movq $0xffffffffffff,%%rax\n" + "andq %%rax,%%rsi\n" + "movq %%rsi,%q2\n" + /* c = a0 * a0 */ + "movq %%r10,%%rax\n" + "mulq %%r10\n" + "movq %%rax,%%r8\n" + "movq %%rdx,%%r9\n" + /* d += a1 * a4 */ + "movq %%r11,%%rax\n" + "mulq %%r14\n" + "addq %%rax,%%rbx\n" + "adcq %%rdx,%%rcx\n" + /* d += (a2*2) * a3 */ + "leaq (%%r12,%%r12,1),%%rax\n" + "mulq %%r13\n" + "addq %%rax,%%rbx\n" + "adcq %%rdx,%%rcx\n" + /* u0 = d & M (%%rsi) */ + "movq %%rbx,%%rsi\n" + "andq %%r15,%%rsi\n" + /* d >>= 52 */ + "shrdq $52,%%rcx,%%rbx\n" + "xorq %%rcx,%%rcx\n" + /* u0 = (u0 << 4) | tx (%%rsi) */ + "shlq $4,%%rsi\n" + "movq %q3,%%rax\n" + "orq %%rax,%%rsi\n" + /* c += u0 * (R >> 4) */ + "movq $0x1000003d1,%%rax\n" + "mulq %%rsi\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* r[0] = c & M */ + "movq %%r8,%%rax\n" + "andq %%r15,%%rax\n" + "movq %%rax,0(%%rdi)\n" + /* c >>= 52 */ + "shrdq $52,%%r9,%%r8\n" + "xorq %%r9,%%r9\n" + /* a0 *= 2 */ + "addq %%r10,%%r10\n" + /* c += a0 * a1 */ + "movq %%r10,%%rax\n" + "mulq %%r11\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* d += a2 * a4 */ + "movq %%r12,%%rax\n" + "mulq %%r14\n" + "addq %%rax,%%rbx\n" + "adcq %%rdx,%%rcx\n" + /* d += a3 * a3 */ + "movq %%r13,%%rax\n" + "mulq %%r13\n" + "addq %%rax,%%rbx\n" + "adcq %%rdx,%%rcx\n" + /* c += (d & M) * R */ + "movq %%rbx,%%rax\n" + "andq %%r15,%%rax\n" + "movq $0x1000003d10,%%rdx\n" + "mulq %%rdx\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* d >>= 52 */ + "shrdq $52,%%rcx,%%rbx\n" + "xorq %%rcx,%%rcx\n" + /* r[1] = c & M */ + "movq %%r8,%%rax\n" + "andq %%r15,%%rax\n" + "movq %%rax,8(%%rdi)\n" + /* c >>= 52 */ + "shrdq $52,%%r9,%%r8\n" + "xorq %%r9,%%r9\n" + /* c += a0 * a2 (last use of %%r10) */ + "movq %%r10,%%rax\n" + "mulq %%r12\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* fetch t3 (%%r10, overwrites a0),t4 (%%rsi) */ + "movq %q2,%%rsi\n" + "movq %q1,%%r10\n" + /* c += a1 * a1 */ + "movq %%r11,%%rax\n" + "mulq %%r11\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* d += a3 * a4 */ + "movq %%r13,%%rax\n" + "mulq %%r14\n" + "addq %%rax,%%rbx\n" + "adcq %%rdx,%%rcx\n" + /* c += (d & M) * R */ + "movq %%rbx,%%rax\n" + "andq %%r15,%%rax\n" + "movq $0x1000003d10,%%rdx\n" + "mulq %%rdx\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* d >>= 52 (%%rbx only) */ + "shrdq $52,%%rcx,%%rbx\n" + /* r[2] = c & M */ + "movq %%r8,%%rax\n" + "andq %%r15,%%rax\n" + "movq %%rax,16(%%rdi)\n" + /* c >>= 52 */ + "shrdq $52,%%r9,%%r8\n" + "xorq %%r9,%%r9\n" + /* c += t3 */ + "addq %%r10,%%r8\n" + /* c += d * R */ + "movq %%rbx,%%rax\n" + "movq $0x1000003d10,%%rdx\n" + "mulq %%rdx\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* r[3] = c & M */ + "movq %%r8,%%rax\n" + "andq %%r15,%%rax\n" + "movq %%rax,24(%%rdi)\n" + /* c >>= 52 (%%r8 only) */ + "shrdq $52,%%r9,%%r8\n" + /* c += t4 (%%r8 only) */ + "addq %%rsi,%%r8\n" + /* r[4] = c */ + "movq %%r8,32(%%rdi)\n" +: "+S"(a), "=m"(tmp1), "=m"(tmp2), "=m"(tmp3) +: "D"(r) +: "%rax", "%rbx", "%rcx", "%rdx", "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15", "cc", "memory" +); +} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/field_5x52_impl.h b/src/cryptoconditions/src/include/secp256k1/src/field_5x52_impl.h new file mode 100644 index 000000000..bda4c3dfc --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/field_5x52_impl.h @@ -0,0 +1,454 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_FIELD_REPR_IMPL_H_ +#define _SECP256K1_FIELD_REPR_IMPL_H_ + +#if defined HAVE_CONFIG_H +#include "libsecp256k1-config.h" +#endif + +#include +#include "util.h" +#include "num.h" +#include "field.h" + +#if defined(USE_ASM_X86_64) +#include "field_5x52_asm_impl.h" +#else +#include "field_5x52_int128_impl.h" +#endif + +/** Implements arithmetic modulo FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFFC2F, + * represented as 5 uint64_t's in base 2^52. The values are allowed to contain >52 each. In particular, + * each FieldElem has a 'magnitude' associated with it. Internally, a magnitude M means each element + * is at most M*(2^53-1), except the most significant one, which is limited to M*(2^49-1). All operations + * accept any input with magnitude at most M, and have different rules for propagating magnitude to their + * output. + */ + +#ifdef VERIFY +static void secp256k1_fe_verify(const secp256k1_fe_t *a) { + const uint64_t *d = a->n; + int m = a->normalized ? 1 : 2 * a->magnitude, r = 1; + /* secp256k1 'p' value defined in "Standards for Efficient Cryptography" (SEC2) 2.7.1. */ + r &= (d[0] <= 0xFFFFFFFFFFFFFULL * m); + r &= (d[1] <= 0xFFFFFFFFFFFFFULL * m); + r &= (d[2] <= 0xFFFFFFFFFFFFFULL * m); + r &= (d[3] <= 0xFFFFFFFFFFFFFULL * m); + r &= (d[4] <= 0x0FFFFFFFFFFFFULL * m); + r &= (a->magnitude >= 0); + r &= (a->magnitude <= 2048); + if (a->normalized) { + r &= (a->magnitude <= 1); + if (r && (d[4] == 0x0FFFFFFFFFFFFULL) && ((d[3] & d[2] & d[1]) == 0xFFFFFFFFFFFFFULL)) { + r &= (d[0] < 0xFFFFEFFFFFC2FULL); + } + } + VERIFY_CHECK(r == 1); +} +#else +static void secp256k1_fe_verify(const secp256k1_fe_t *a) { + (void)a; +} +#endif + +static void secp256k1_fe_normalize(secp256k1_fe_t *r) { + uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4]; + + /* Reduce t4 at the start so there will be at most a single carry from the first pass */ + uint64_t m; + uint64_t x = t4 >> 48; t4 &= 0x0FFFFFFFFFFFFULL; + + /* The first pass ensures the magnitude is 1, ... */ + t0 += x * 0x1000003D1ULL; + t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL; + t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; m = t1; + t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; m &= t2; + t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; m &= t3; + + /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */ + VERIFY_CHECK(t4 >> 49 == 0); + + /* At most a single final reduction is needed; check if the value is >= the field characteristic */ + x = (t4 >> 48) | ((t4 == 0x0FFFFFFFFFFFFULL) & (m == 0xFFFFFFFFFFFFFULL) + & (t0 >= 0xFFFFEFFFFFC2FULL)); + + /* Apply the final reduction (for constant-time behaviour, we do it always) */ + t0 += x * 0x1000003D1ULL; + t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL; + t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; + t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; + t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; + + /* If t4 didn't carry to bit 48 already, then it should have after any final reduction */ + VERIFY_CHECK(t4 >> 48 == x); + + /* Mask off the possible multiple of 2^256 from the final reduction */ + t4 &= 0x0FFFFFFFFFFFFULL; + + r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4; + +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; + secp256k1_fe_verify(r); +#endif +} + +static void secp256k1_fe_normalize_weak(secp256k1_fe_t *r) { + uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4]; + + /* Reduce t4 at the start so there will be at most a single carry from the first pass */ + uint64_t x = t4 >> 48; t4 &= 0x0FFFFFFFFFFFFULL; + + /* The first pass ensures the magnitude is 1, ... */ + t0 += x * 0x1000003D1ULL; + t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL; + t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; + t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; + t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; + + /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */ + VERIFY_CHECK(t4 >> 49 == 0); + + r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4; + +#ifdef VERIFY + r->magnitude = 1; + secp256k1_fe_verify(r); +#endif +} + +static void secp256k1_fe_normalize_var(secp256k1_fe_t *r) { + uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4]; + + /* Reduce t4 at the start so there will be at most a single carry from the first pass */ + uint64_t m; + uint64_t x = t4 >> 48; t4 &= 0x0FFFFFFFFFFFFULL; + + /* The first pass ensures the magnitude is 1, ... */ + t0 += x * 0x1000003D1ULL; + t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL; + t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; m = t1; + t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; m &= t2; + t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; m &= t3; + + /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */ + VERIFY_CHECK(t4 >> 49 == 0); + + /* At most a single final reduction is needed; check if the value is >= the field characteristic */ + x = (t4 >> 48) | ((t4 == 0x0FFFFFFFFFFFFULL) & (m == 0xFFFFFFFFFFFFFULL) + & (t0 >= 0xFFFFEFFFFFC2FULL)); + + if (x) { + t0 += 0x1000003D1ULL; + t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL; + t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; + t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; + t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; + + /* If t4 didn't carry to bit 48 already, then it should have after any final reduction */ + VERIFY_CHECK(t4 >> 48 == x); + + /* Mask off the possible multiple of 2^256 from the final reduction */ + t4 &= 0x0FFFFFFFFFFFFULL; + } + + r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4; + +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; + secp256k1_fe_verify(r); +#endif +} + +static int secp256k1_fe_normalizes_to_zero(secp256k1_fe_t *r) { + uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4]; + + /* z0 tracks a possible raw value of 0, z1 tracks a possible raw value of P */ + uint64_t z0, z1; + + /* Reduce t4 at the start so there will be at most a single carry from the first pass */ + uint64_t x = t4 >> 48; t4 &= 0x0FFFFFFFFFFFFULL; + + /* The first pass ensures the magnitude is 1, ... */ + t0 += x * 0x1000003D1ULL; + t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL; z0 = t0; z1 = t0 ^ 0x1000003D0ULL; + t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; z0 |= t1; z1 &= t1; + t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; z0 |= t2; z1 &= t2; + t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; z0 |= t3; z1 &= t3; + z0 |= t4; z1 &= t4 ^ 0xF000000000000ULL; + + /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */ + VERIFY_CHECK(t4 >> 49 == 0); + + return (z0 == 0) | (z1 == 0xFFFFFFFFFFFFFULL); +} + +static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe_t *r) { + uint64_t t0, t1, t2, t3, t4; + uint64_t z0, z1; + uint64_t x; + + t0 = r->n[0]; + t4 = r->n[4]; + + /* Reduce t4 at the start so there will be at most a single carry from the first pass */ + x = t4 >> 48; + + /* The first pass ensures the magnitude is 1, ... */ + t0 += x * 0x1000003D1ULL; + + /* z0 tracks a possible raw value of 0, z1 tracks a possible raw value of P */ + z0 = t0 & 0xFFFFFFFFFFFFFULL; + z1 = z0 ^ 0x1000003D0ULL; + + /* Fast return path should catch the majority of cases */ + if ((z0 != 0ULL) & (z1 != 0xFFFFFFFFFFFFFULL)) { + return 0; + } + + t1 = r->n[1]; + t2 = r->n[2]; + t3 = r->n[3]; + + t4 &= 0x0FFFFFFFFFFFFULL; + + t1 += (t0 >> 52); t0 = z0; + t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; z0 |= t1; z1 &= t1; + t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; z0 |= t2; z1 &= t2; + t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; z0 |= t3; z1 &= t3; + z0 |= t4; z1 &= t4 ^ 0xF000000000000ULL; + + /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */ + VERIFY_CHECK(t4 >> 49 == 0); + + return (z0 == 0) | (z1 == 0xFFFFFFFFFFFFFULL); +} + +SECP256K1_INLINE static void secp256k1_fe_set_int(secp256k1_fe_t *r, int a) { + r->n[0] = a; + r->n[1] = r->n[2] = r->n[3] = r->n[4] = 0; +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; + secp256k1_fe_verify(r); +#endif +} + +SECP256K1_INLINE static int secp256k1_fe_is_zero(const secp256k1_fe_t *a) { + const uint64_t *t = a->n; +#ifdef VERIFY + VERIFY_CHECK(a->normalized); + secp256k1_fe_verify(a); +#endif + return (t[0] | t[1] | t[2] | t[3] | t[4]) == 0; +} + +SECP256K1_INLINE static int secp256k1_fe_is_odd(const secp256k1_fe_t *a) { +#ifdef VERIFY + VERIFY_CHECK(a->normalized); + secp256k1_fe_verify(a); +#endif + return a->n[0] & 1; +} + +SECP256K1_INLINE static void secp256k1_fe_clear(secp256k1_fe_t *a) { + int i; +#ifdef VERIFY + a->magnitude = 0; + a->normalized = 1; +#endif + for (i=0; i<5; i++) { + a->n[i] = 0; + } +} + +static int secp256k1_fe_cmp_var(const secp256k1_fe_t *a, const secp256k1_fe_t *b) { + int i; +#ifdef VERIFY + VERIFY_CHECK(a->normalized); + VERIFY_CHECK(b->normalized); + secp256k1_fe_verify(a); + secp256k1_fe_verify(b); +#endif + for (i = 4; i >= 0; i--) { + if (a->n[i] > b->n[i]) { + return 1; + } + if (a->n[i] < b->n[i]) { + return -1; + } + } + return 0; +} + +static int secp256k1_fe_set_b32(secp256k1_fe_t *r, const unsigned char *a) { + int i; + r->n[0] = r->n[1] = r->n[2] = r->n[3] = r->n[4] = 0; + for (i=0; i<32; i++) { + int j; + for (j=0; j<2; j++) { + int limb = (8*i+4*j)/52; + int shift = (8*i+4*j)%52; + r->n[limb] |= (uint64_t)((a[31-i] >> (4*j)) & 0xF) << shift; + } + } + if (r->n[4] == 0x0FFFFFFFFFFFFULL && (r->n[3] & r->n[2] & r->n[1]) == 0xFFFFFFFFFFFFFULL && r->n[0] >= 0xFFFFEFFFFFC2FULL) { + return 0; + } +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; + secp256k1_fe_verify(r); +#endif + return 1; +} + +/** Convert a field element to a 32-byte big endian value. Requires the input to be normalized */ +static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe_t *a) { + int i; +#ifdef VERIFY + VERIFY_CHECK(a->normalized); + secp256k1_fe_verify(a); +#endif + for (i=0; i<32; i++) { + int j; + int c = 0; + for (j=0; j<2; j++) { + int limb = (8*i+4*j)/52; + int shift = (8*i+4*j)%52; + c |= ((a->n[limb] >> shift) & 0xF) << (4 * j); + } + r[31-i] = c; + } +} + +SECP256K1_INLINE static void secp256k1_fe_negate(secp256k1_fe_t *r, const secp256k1_fe_t *a, int m) { +#ifdef VERIFY + VERIFY_CHECK(a->magnitude <= m); + secp256k1_fe_verify(a); +#endif + r->n[0] = 0xFFFFEFFFFFC2FULL * 2 * (m + 1) - a->n[0]; + r->n[1] = 0xFFFFFFFFFFFFFULL * 2 * (m + 1) - a->n[1]; + r->n[2] = 0xFFFFFFFFFFFFFULL * 2 * (m + 1) - a->n[2]; + r->n[3] = 0xFFFFFFFFFFFFFULL * 2 * (m + 1) - a->n[3]; + r->n[4] = 0x0FFFFFFFFFFFFULL * 2 * (m + 1) - a->n[4]; +#ifdef VERIFY + r->magnitude = m + 1; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +SECP256K1_INLINE static void secp256k1_fe_mul_int(secp256k1_fe_t *r, int a) { + r->n[0] *= a; + r->n[1] *= a; + r->n[2] *= a; + r->n[3] *= a; + r->n[4] *= a; +#ifdef VERIFY + r->magnitude *= a; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +SECP256K1_INLINE static void secp256k1_fe_add(secp256k1_fe_t *r, const secp256k1_fe_t *a) { +#ifdef VERIFY + secp256k1_fe_verify(a); +#endif + r->n[0] += a->n[0]; + r->n[1] += a->n[1]; + r->n[2] += a->n[2]; + r->n[3] += a->n[3]; + r->n[4] += a->n[4]; +#ifdef VERIFY + r->magnitude += a->magnitude; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +static void secp256k1_fe_mul(secp256k1_fe_t *r, const secp256k1_fe_t *a, const secp256k1_fe_t * SECP256K1_RESTRICT b) { +#ifdef VERIFY + VERIFY_CHECK(a->magnitude <= 8); + VERIFY_CHECK(b->magnitude <= 8); + secp256k1_fe_verify(a); + secp256k1_fe_verify(b); + VERIFY_CHECK(r != b); +#endif + secp256k1_fe_mul_inner(r->n, a->n, b->n); +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +static void secp256k1_fe_sqr(secp256k1_fe_t *r, const secp256k1_fe_t *a) { +#ifdef VERIFY + VERIFY_CHECK(a->magnitude <= 8); + secp256k1_fe_verify(a); +#endif + secp256k1_fe_sqr_inner(r->n, a->n); +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +static SECP256K1_INLINE void secp256k1_fe_cmov(secp256k1_fe_t *r, const secp256k1_fe_t *a, int flag) { + uint64_t mask0, mask1; + mask0 = flag + ~((uint64_t)0); + mask1 = ~mask0; + r->n[0] = (r->n[0] & mask0) | (a->n[0] & mask1); + r->n[1] = (r->n[1] & mask0) | (a->n[1] & mask1); + r->n[2] = (r->n[2] & mask0) | (a->n[2] & mask1); + r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1); + r->n[4] = (r->n[4] & mask0) | (a->n[4] & mask1); +#ifdef VERIFY + r->magnitude = (r->magnitude & mask0) | (a->magnitude & mask1); + r->normalized = (r->normalized & mask0) | (a->normalized & mask1); +#endif +} + +static SECP256K1_INLINE void secp256k1_fe_storage_cmov(secp256k1_fe_storage_t *r, const secp256k1_fe_storage_t *a, int flag) { + uint64_t mask0, mask1; + mask0 = flag + ~((uint64_t)0); + mask1 = ~mask0; + r->n[0] = (r->n[0] & mask0) | (a->n[0] & mask1); + r->n[1] = (r->n[1] & mask0) | (a->n[1] & mask1); + r->n[2] = (r->n[2] & mask0) | (a->n[2] & mask1); + r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1); +} + +static void secp256k1_fe_to_storage(secp256k1_fe_storage_t *r, const secp256k1_fe_t *a) { +#ifdef VERIFY + VERIFY_CHECK(a->normalized); +#endif + r->n[0] = a->n[0] | a->n[1] << 52; + r->n[1] = a->n[1] >> 12 | a->n[2] << 40; + r->n[2] = a->n[2] >> 24 | a->n[3] << 28; + r->n[3] = a->n[3] >> 36 | a->n[4] << 16; +} + +static SECP256K1_INLINE void secp256k1_fe_from_storage(secp256k1_fe_t *r, const secp256k1_fe_storage_t *a) { + r->n[0] = a->n[0] & 0xFFFFFFFFFFFFFULL; + r->n[1] = a->n[0] >> 52 | ((a->n[1] << 12) & 0xFFFFFFFFFFFFFULL); + r->n[2] = a->n[1] >> 40 | ((a->n[2] << 24) & 0xFFFFFFFFFFFFFULL); + r->n[3] = a->n[2] >> 28 | ((a->n[3] << 36) & 0xFFFFFFFFFFFFFULL); + r->n[4] = a->n[3] >> 16; +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; +#endif +} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/field_5x52_int128_impl.h b/src/cryptoconditions/src/include/secp256k1/src/field_5x52_int128_impl.h new file mode 100644 index 000000000..9280bb5ea --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/field_5x52_int128_impl.h @@ -0,0 +1,277 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_FIELD_INNER5X52_IMPL_H_ +#define _SECP256K1_FIELD_INNER5X52_IMPL_H_ + +#include + +#ifdef VERIFY +#define VERIFY_BITS(x, n) VERIFY_CHECK(((x) >> (n)) == 0) +#else +#define VERIFY_BITS(x, n) do { } while(0) +#endif + +SECP256K1_INLINE static void secp256k1_fe_mul_inner(uint64_t *r, const uint64_t *a, const uint64_t * SECP256K1_RESTRICT b) { + uint128_t c, d; + uint64_t t3, t4, tx, u0; + uint64_t a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4]; + const uint64_t M = 0xFFFFFFFFFFFFFULL, R = 0x1000003D10ULL; + + VERIFY_BITS(a[0], 56); + VERIFY_BITS(a[1], 56); + VERIFY_BITS(a[2], 56); + VERIFY_BITS(a[3], 56); + VERIFY_BITS(a[4], 52); + VERIFY_BITS(b[0], 56); + VERIFY_BITS(b[1], 56); + VERIFY_BITS(b[2], 56); + VERIFY_BITS(b[3], 56); + VERIFY_BITS(b[4], 52); + VERIFY_CHECK(r != b); + + /* [... a b c] is a shorthand for ... + a<<104 + b<<52 + c<<0 mod n. + * px is a shorthand for sum(a[i]*b[x-i], i=0..x). + * Note that [x 0 0 0 0 0] = [x*R]. + */ + + d = (uint128_t)a0 * b[3] + + (uint128_t)a1 * b[2] + + (uint128_t)a2 * b[1] + + (uint128_t)a3 * b[0]; + VERIFY_BITS(d, 114); + /* [d 0 0 0] = [p3 0 0 0] */ + c = (uint128_t)a4 * b[4]; + VERIFY_BITS(c, 112); + /* [c 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ + d += (c & M) * R; c >>= 52; + VERIFY_BITS(d, 115); + VERIFY_BITS(c, 60); + /* [c 0 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ + t3 = d & M; d >>= 52; + VERIFY_BITS(t3, 52); + VERIFY_BITS(d, 63); + /* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ + + d += (uint128_t)a0 * b[4] + + (uint128_t)a1 * b[3] + + (uint128_t)a2 * b[2] + + (uint128_t)a3 * b[1] + + (uint128_t)a4 * b[0]; + VERIFY_BITS(d, 115); + /* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ + d += c * R; + VERIFY_BITS(d, 116); + /* [d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ + t4 = d & M; d >>= 52; + VERIFY_BITS(t4, 52); + VERIFY_BITS(d, 64); + /* [d t4 t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ + tx = (t4 >> 48); t4 &= (M >> 4); + VERIFY_BITS(tx, 4); + VERIFY_BITS(t4, 48); + /* [d t4+(tx<<48) t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ + + c = (uint128_t)a0 * b[0]; + VERIFY_BITS(c, 112); + /* [d t4+(tx<<48) t3 0 0 c] = [p8 0 0 0 p4 p3 0 0 p0] */ + d += (uint128_t)a1 * b[4] + + (uint128_t)a2 * b[3] + + (uint128_t)a3 * b[2] + + (uint128_t)a4 * b[1]; + VERIFY_BITS(d, 115); + /* [d t4+(tx<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + u0 = d & M; d >>= 52; + VERIFY_BITS(u0, 52); + VERIFY_BITS(d, 63); + /* [d u0 t4+(tx<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + /* [d 0 t4+(tx<<48)+(u0<<52) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + u0 = (u0 << 4) | tx; + VERIFY_BITS(u0, 56); + /* [d 0 t4+(u0<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + c += (uint128_t)u0 * (R >> 4); + VERIFY_BITS(c, 115); + /* [d 0 t4 t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + r[0] = c & M; c >>= 52; + VERIFY_BITS(r[0], 52); + VERIFY_BITS(c, 61); + /* [d 0 t4 t3 0 c r0] = [p8 0 0 p5 p4 p3 0 0 p0] */ + + c += (uint128_t)a0 * b[1] + + (uint128_t)a1 * b[0]; + VERIFY_BITS(c, 114); + /* [d 0 t4 t3 0 c r0] = [p8 0 0 p5 p4 p3 0 p1 p0] */ + d += (uint128_t)a2 * b[4] + + (uint128_t)a3 * b[3] + + (uint128_t)a4 * b[2]; + VERIFY_BITS(d, 114); + /* [d 0 t4 t3 0 c r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ + c += (d & M) * R; d >>= 52; + VERIFY_BITS(c, 115); + VERIFY_BITS(d, 62); + /* [d 0 0 t4 t3 0 c r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ + r[1] = c & M; c >>= 52; + VERIFY_BITS(r[1], 52); + VERIFY_BITS(c, 63); + /* [d 0 0 t4 t3 c r1 r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ + + c += (uint128_t)a0 * b[2] + + (uint128_t)a1 * b[1] + + (uint128_t)a2 * b[0]; + VERIFY_BITS(c, 114); + /* [d 0 0 t4 t3 c r1 r0] = [p8 0 p6 p5 p4 p3 p2 p1 p0] */ + d += (uint128_t)a3 * b[4] + + (uint128_t)a4 * b[3]; + VERIFY_BITS(d, 114); + /* [d 0 0 t4 t3 c t1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + c += (d & M) * R; d >>= 52; + VERIFY_BITS(c, 115); + VERIFY_BITS(d, 62); + /* [d 0 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + + /* [d 0 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[2] = c & M; c >>= 52; + VERIFY_BITS(r[2], 52); + VERIFY_BITS(c, 63); + /* [d 0 0 0 t4 t3+c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + c += d * R + t3;; + VERIFY_BITS(c, 100); + /* [t4 c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[3] = c & M; c >>= 52; + VERIFY_BITS(r[3], 52); + VERIFY_BITS(c, 48); + /* [t4+c r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + c += t4; + VERIFY_BITS(c, 49); + /* [c r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[4] = c; + VERIFY_BITS(r[4], 49); + /* [r4 r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ +} + +SECP256K1_INLINE static void secp256k1_fe_sqr_inner(uint64_t *r, const uint64_t *a) { + uint128_t c, d; + uint64_t a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4]; + int64_t t3, t4, tx, u0; + const uint64_t M = 0xFFFFFFFFFFFFFULL, R = 0x1000003D10ULL; + + VERIFY_BITS(a[0], 56); + VERIFY_BITS(a[1], 56); + VERIFY_BITS(a[2], 56); + VERIFY_BITS(a[3], 56); + VERIFY_BITS(a[4], 52); + + /** [... a b c] is a shorthand for ... + a<<104 + b<<52 + c<<0 mod n. + * px is a shorthand for sum(a[i]*a[x-i], i=0..x). + * Note that [x 0 0 0 0 0] = [x*R]. + */ + + d = (uint128_t)(a0*2) * a3 + + (uint128_t)(a1*2) * a2; + VERIFY_BITS(d, 114); + /* [d 0 0 0] = [p3 0 0 0] */ + c = (uint128_t)a4 * a4; + VERIFY_BITS(c, 112); + /* [c 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ + d += (c & M) * R; c >>= 52; + VERIFY_BITS(d, 115); + VERIFY_BITS(c, 60); + /* [c 0 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ + t3 = d & M; d >>= 52; + VERIFY_BITS(t3, 52); + VERIFY_BITS(d, 63); + /* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ + + a4 *= 2; + d += (uint128_t)a0 * a4 + + (uint128_t)(a1*2) * a3 + + (uint128_t)a2 * a2; + VERIFY_BITS(d, 115); + /* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ + d += c * R; + VERIFY_BITS(d, 116); + /* [d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ + t4 = d & M; d >>= 52; + VERIFY_BITS(t4, 52); + VERIFY_BITS(d, 64); + /* [d t4 t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ + tx = (t4 >> 48); t4 &= (M >> 4); + VERIFY_BITS(tx, 4); + VERIFY_BITS(t4, 48); + /* [d t4+(tx<<48) t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ + + c = (uint128_t)a0 * a0; + VERIFY_BITS(c, 112); + /* [d t4+(tx<<48) t3 0 0 c] = [p8 0 0 0 p4 p3 0 0 p0] */ + d += (uint128_t)a1 * a4 + + (uint128_t)(a2*2) * a3; + VERIFY_BITS(d, 114); + /* [d t4+(tx<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + u0 = d & M; d >>= 52; + VERIFY_BITS(u0, 52); + VERIFY_BITS(d, 62); + /* [d u0 t4+(tx<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + /* [d 0 t4+(tx<<48)+(u0<<52) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + u0 = (u0 << 4) | tx; + VERIFY_BITS(u0, 56); + /* [d 0 t4+(u0<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + c += (uint128_t)u0 * (R >> 4); + VERIFY_BITS(c, 113); + /* [d 0 t4 t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + r[0] = c & M; c >>= 52; + VERIFY_BITS(r[0], 52); + VERIFY_BITS(c, 61); + /* [d 0 t4 t3 0 c r0] = [p8 0 0 p5 p4 p3 0 0 p0] */ + + a0 *= 2; + c += (uint128_t)a0 * a1; + VERIFY_BITS(c, 114); + /* [d 0 t4 t3 0 c r0] = [p8 0 0 p5 p4 p3 0 p1 p0] */ + d += (uint128_t)a2 * a4 + + (uint128_t)a3 * a3; + VERIFY_BITS(d, 114); + /* [d 0 t4 t3 0 c r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ + c += (d & M) * R; d >>= 52; + VERIFY_BITS(c, 115); + VERIFY_BITS(d, 62); + /* [d 0 0 t4 t3 0 c r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ + r[1] = c & M; c >>= 52; + VERIFY_BITS(r[1], 52); + VERIFY_BITS(c, 63); + /* [d 0 0 t4 t3 c r1 r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ + + c += (uint128_t)a0 * a2 + + (uint128_t)a1 * a1; + VERIFY_BITS(c, 114); + /* [d 0 0 t4 t3 c r1 r0] = [p8 0 p6 p5 p4 p3 p2 p1 p0] */ + d += (uint128_t)a3 * a4; + VERIFY_BITS(d, 114); + /* [d 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + c += (d & M) * R; d >>= 52; + VERIFY_BITS(c, 115); + VERIFY_BITS(d, 62); + /* [d 0 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[2] = c & M; c >>= 52; + VERIFY_BITS(r[2], 52); + VERIFY_BITS(c, 63); + /* [d 0 0 0 t4 t3+c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + + c += d * R + t3;; + VERIFY_BITS(c, 100); + /* [t4 c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[3] = c & M; c >>= 52; + VERIFY_BITS(r[3], 52); + VERIFY_BITS(c, 48); + /* [t4+c r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + c += t4; + VERIFY_BITS(c, 49); + /* [c r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[4] = c; + VERIFY_BITS(r[4], 49); + /* [r4 r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ +} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/field_impl.h b/src/cryptoconditions/src/include/secp256k1/src/field_impl.h new file mode 100644 index 000000000..e6ec11e8f --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/field_impl.h @@ -0,0 +1,263 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_FIELD_IMPL_H_ +#define _SECP256K1_FIELD_IMPL_H_ + +#if defined HAVE_CONFIG_H +#include "libsecp256k1-config.h" +#endif + +#include "util.h" + +#if defined(USE_FIELD_10X26) +#include "field_10x26_impl.h" +#elif defined(USE_FIELD_5X52) +#include "field_5x52_impl.h" +#else +#error "Please select field implementation" +#endif + +SECP256K1_INLINE static int secp256k1_fe_equal_var(const secp256k1_fe_t *a, const secp256k1_fe_t *b) { + secp256k1_fe_t na; + secp256k1_fe_negate(&na, a, 1); + secp256k1_fe_add(&na, b); + return secp256k1_fe_normalizes_to_zero_var(&na); +} + +static int secp256k1_fe_sqrt_var(secp256k1_fe_t *r, const secp256k1_fe_t *a) { + secp256k1_fe_t x2, x3, x6, x9, x11, x22, x44, x88, x176, x220, x223, t1; + int j; + + /** The binary representation of (p + 1)/4 has 3 blocks of 1s, with lengths in + * { 2, 22, 223 }. Use an addition chain to calculate 2^n - 1 for each block: + * 1, [2], 3, 6, 9, 11, [22], 44, 88, 176, 220, [223] + */ + + secp256k1_fe_sqr(&x2, a); + secp256k1_fe_mul(&x2, &x2, a); + + secp256k1_fe_sqr(&x3, &x2); + secp256k1_fe_mul(&x3, &x3, a); + + x6 = x3; + for (j=0; j<3; j++) { + secp256k1_fe_sqr(&x6, &x6); + } + secp256k1_fe_mul(&x6, &x6, &x3); + + x9 = x6; + for (j=0; j<3; j++) { + secp256k1_fe_sqr(&x9, &x9); + } + secp256k1_fe_mul(&x9, &x9, &x3); + + x11 = x9; + for (j=0; j<2; j++) { + secp256k1_fe_sqr(&x11, &x11); + } + secp256k1_fe_mul(&x11, &x11, &x2); + + x22 = x11; + for (j=0; j<11; j++) { + secp256k1_fe_sqr(&x22, &x22); + } + secp256k1_fe_mul(&x22, &x22, &x11); + + x44 = x22; + for (j=0; j<22; j++) { + secp256k1_fe_sqr(&x44, &x44); + } + secp256k1_fe_mul(&x44, &x44, &x22); + + x88 = x44; + for (j=0; j<44; j++) { + secp256k1_fe_sqr(&x88, &x88); + } + secp256k1_fe_mul(&x88, &x88, &x44); + + x176 = x88; + for (j=0; j<88; j++) { + secp256k1_fe_sqr(&x176, &x176); + } + secp256k1_fe_mul(&x176, &x176, &x88); + + x220 = x176; + for (j=0; j<44; j++) { + secp256k1_fe_sqr(&x220, &x220); + } + secp256k1_fe_mul(&x220, &x220, &x44); + + x223 = x220; + for (j=0; j<3; j++) { + secp256k1_fe_sqr(&x223, &x223); + } + secp256k1_fe_mul(&x223, &x223, &x3); + + /* The final result is then assembled using a sliding window over the blocks. */ + + t1 = x223; + for (j=0; j<23; j++) { + secp256k1_fe_sqr(&t1, &t1); + } + secp256k1_fe_mul(&t1, &t1, &x22); + for (j=0; j<6; j++) { + secp256k1_fe_sqr(&t1, &t1); + } + secp256k1_fe_mul(&t1, &t1, &x2); + secp256k1_fe_sqr(&t1, &t1); + secp256k1_fe_sqr(r, &t1); + + /* Check that a square root was actually calculated */ + + secp256k1_fe_sqr(&t1, r); + return secp256k1_fe_equal_var(&t1, a); +} + +static void secp256k1_fe_inv(secp256k1_fe_t *r, const secp256k1_fe_t *a) { + secp256k1_fe_t x2, x3, x6, x9, x11, x22, x44, x88, x176, x220, x223, t1; + int j; + + /** The binary representation of (p - 2) has 5 blocks of 1s, with lengths in + * { 1, 2, 22, 223 }. Use an addition chain to calculate 2^n - 1 for each block: + * [1], [2], 3, 6, 9, 11, [22], 44, 88, 176, 220, [223] + */ + + secp256k1_fe_sqr(&x2, a); + secp256k1_fe_mul(&x2, &x2, a); + + secp256k1_fe_sqr(&x3, &x2); + secp256k1_fe_mul(&x3, &x3, a); + + x6 = x3; + for (j=0; j<3; j++) { + secp256k1_fe_sqr(&x6, &x6); + } + secp256k1_fe_mul(&x6, &x6, &x3); + + x9 = x6; + for (j=0; j<3; j++) { + secp256k1_fe_sqr(&x9, &x9); + } + secp256k1_fe_mul(&x9, &x9, &x3); + + x11 = x9; + for (j=0; j<2; j++) { + secp256k1_fe_sqr(&x11, &x11); + } + secp256k1_fe_mul(&x11, &x11, &x2); + + x22 = x11; + for (j=0; j<11; j++) { + secp256k1_fe_sqr(&x22, &x22); + } + secp256k1_fe_mul(&x22, &x22, &x11); + + x44 = x22; + for (j=0; j<22; j++) { + secp256k1_fe_sqr(&x44, &x44); + } + secp256k1_fe_mul(&x44, &x44, &x22); + + x88 = x44; + for (j=0; j<44; j++) { + secp256k1_fe_sqr(&x88, &x88); + } + secp256k1_fe_mul(&x88, &x88, &x44); + + x176 = x88; + for (j=0; j<88; j++) { + secp256k1_fe_sqr(&x176, &x176); + } + secp256k1_fe_mul(&x176, &x176, &x88); + + x220 = x176; + for (j=0; j<44; j++) { + secp256k1_fe_sqr(&x220, &x220); + } + secp256k1_fe_mul(&x220, &x220, &x44); + + x223 = x220; + for (j=0; j<3; j++) { + secp256k1_fe_sqr(&x223, &x223); + } + secp256k1_fe_mul(&x223, &x223, &x3); + + /* The final result is then assembled using a sliding window over the blocks. */ + + t1 = x223; + for (j=0; j<23; j++) { + secp256k1_fe_sqr(&t1, &t1); + } + secp256k1_fe_mul(&t1, &t1, &x22); + for (j=0; j<5; j++) { + secp256k1_fe_sqr(&t1, &t1); + } + secp256k1_fe_mul(&t1, &t1, a); + for (j=0; j<3; j++) { + secp256k1_fe_sqr(&t1, &t1); + } + secp256k1_fe_mul(&t1, &t1, &x2); + for (j=0; j<2; j++) { + secp256k1_fe_sqr(&t1, &t1); + } + secp256k1_fe_mul(r, a, &t1); +} + +static void secp256k1_fe_inv_var(secp256k1_fe_t *r, const secp256k1_fe_t *a) { +#if defined(USE_FIELD_INV_BUILTIN) + secp256k1_fe_inv(r, a); +#elif defined(USE_FIELD_INV_NUM) + secp256k1_num_t n, m; + /* secp256k1 field prime, value p defined in "Standards for Efficient Cryptography" (SEC2) 2.7.1. */ + static const unsigned char prime[32] = { + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F + }; + unsigned char b[32]; + secp256k1_fe_t c = *a; + secp256k1_fe_normalize_var(&c); + secp256k1_fe_get_b32(b, &c); + secp256k1_num_set_bin(&n, b, 32); + secp256k1_num_set_bin(&m, prime, 32); + secp256k1_num_mod_inverse(&n, &n, &m); + secp256k1_num_get_bin(b, 32, &n); + VERIFY_CHECK(secp256k1_fe_set_b32(r, b)); +#else +#error "Please select field inverse implementation" +#endif +} + +static void secp256k1_fe_inv_all_var(size_t len, secp256k1_fe_t *r, const secp256k1_fe_t *a) { + secp256k1_fe_t u; + size_t i; + if (len < 1) { + return; + } + + VERIFY_CHECK((r + len <= a) || (a + len <= r)); + + r[0] = a[0]; + + i = 0; + while (++i < len) { + secp256k1_fe_mul(&r[i], &r[i - 1], &a[i]); + } + + secp256k1_fe_inv_var(&u, &r[--i]); + + while (i > 0) { + int j = i--; + secp256k1_fe_mul(&r[j], &r[i], &u); + secp256k1_fe_mul(&u, &u, &a[j]); + } + + r[0] = u; +} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/group.h b/src/cryptoconditions/src/include/secp256k1/src/group.h new file mode 100644 index 000000000..0b08b3b99 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/group.h @@ -0,0 +1,121 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_GROUP_ +#define _SECP256K1_GROUP_ + +#include "num.h" +#include "field.h" + +/** A group element of the secp256k1 curve, in affine coordinates. */ +typedef struct { + secp256k1_fe_t x; + secp256k1_fe_t y; + int infinity; /* whether this represents the point at infinity */ +} secp256k1_ge_t; + +#define SECP256K1_GE_CONST(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) {SECP256K1_FE_CONST((a),(b),(c),(d),(e),(f),(g),(h)), SECP256K1_FE_CONST((i),(j),(k),(l),(m),(n),(o),(p)), 0} +#define SECP256K1_GE_CONST_INFINITY {SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), 1} + +/** A group element of the secp256k1 curve, in jacobian coordinates. */ +typedef struct { + secp256k1_fe_t x; /* actual X: x/z^2 */ + secp256k1_fe_t y; /* actual Y: y/z^3 */ + secp256k1_fe_t z; + int infinity; /* whether this represents the point at infinity */ +} secp256k1_gej_t; + +#define SECP256K1_GEJ_CONST(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) {SECP256K1_FE_CONST((a),(b),(c),(d),(e),(f),(g),(h)), SECP256K1_FE_CONST((i),(j),(k),(l),(m),(n),(o),(p)), SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1), 0} +#define SECP256K1_GEJ_CONST_INFINITY {SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), 1} + +typedef struct { + secp256k1_fe_storage_t x; + secp256k1_fe_storage_t y; +} secp256k1_ge_storage_t; + +#define SECP256K1_GE_STORAGE_CONST(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) {SECP256K1_FE_STORAGE_CONST((a),(b),(c),(d),(e),(f),(g),(h)), SECP256K1_FE_STORAGE_CONST((i),(j),(k),(l),(m),(n),(o),(p))} + +/** Set a group element equal to the point at infinity */ +static void secp256k1_ge_set_infinity(secp256k1_ge_t *r); + +/** Set a group element equal to the point with given X and Y coordinates */ +static void secp256k1_ge_set_xy(secp256k1_ge_t *r, const secp256k1_fe_t *x, const secp256k1_fe_t *y); + +/** Set a group element (affine) equal to the point with the given X coordinate, and given oddness + * for Y. Return value indicates whether the result is valid. */ +static int secp256k1_ge_set_xo_var(secp256k1_ge_t *r, const secp256k1_fe_t *x, int odd); + +/** Check whether a group element is the point at infinity. */ +static int secp256k1_ge_is_infinity(const secp256k1_ge_t *a); + +/** Check whether a group element is valid (i.e., on the curve). */ +static int secp256k1_ge_is_valid_var(const secp256k1_ge_t *a); + +static void secp256k1_ge_neg(secp256k1_ge_t *r, const secp256k1_ge_t *a); + +/** Set a group element equal to another which is given in jacobian coordinates */ +static void secp256k1_ge_set_gej(secp256k1_ge_t *r, secp256k1_gej_t *a); + +/** Set a batch of group elements equal to the inputs given in jacobian coordinates */ +static void secp256k1_ge_set_all_gej_var(size_t len, secp256k1_ge_t *r, const secp256k1_gej_t *a); + + +/** Set a group element (jacobian) equal to the point at infinity. */ +static void secp256k1_gej_set_infinity(secp256k1_gej_t *r); + +/** Set a group element (jacobian) equal to the point with given X and Y coordinates. */ +static void secp256k1_gej_set_xy(secp256k1_gej_t *r, const secp256k1_fe_t *x, const secp256k1_fe_t *y); + +/** Set a group element (jacobian) equal to another which is given in affine coordinates. */ +static void secp256k1_gej_set_ge(secp256k1_gej_t *r, const secp256k1_ge_t *a); + +/** Compare the X coordinate of a group element (jacobian). */ +static int secp256k1_gej_eq_x_var(const secp256k1_fe_t *x, const secp256k1_gej_t *a); + +/** Set r equal to the inverse of a (i.e., mirrored around the X axis) */ +static void secp256k1_gej_neg(secp256k1_gej_t *r, const secp256k1_gej_t *a); + +/** Check whether a group element is the point at infinity. */ +static int secp256k1_gej_is_infinity(const secp256k1_gej_t *a); + +/** Set r equal to the double of a. */ +static void secp256k1_gej_double_var(secp256k1_gej_t *r, const secp256k1_gej_t *a); + +/** Set r equal to the sum of a and b. */ +static void secp256k1_gej_add_var(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_gej_t *b); + +/** Set r equal to the sum of a and b (with b given in affine coordinates, and not infinity). */ +static void secp256k1_gej_add_ge(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_ge_t *b); + +/** Set r equal to the sum of a and b (with b given in affine coordinates). This is more efficient + than secp256k1_gej_add_var. It is identical to secp256k1_gej_add_ge but without constant-time + guarantee, and b is allowed to be infinity. */ +static void secp256k1_gej_add_ge_var(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_ge_t *b); + +#ifdef USE_ENDOMORPHISM +/** Set r to be equal to lambda times a, where lambda is chosen in a way such that this is very fast. */ +static void secp256k1_gej_mul_lambda(secp256k1_gej_t *r, const secp256k1_gej_t *a); +#endif + +/** Clear a secp256k1_gej_t to prevent leaking sensitive information. */ +static void secp256k1_gej_clear(secp256k1_gej_t *r); + +/** Clear a secp256k1_ge_t to prevent leaking sensitive information. */ +static void secp256k1_ge_clear(secp256k1_ge_t *r); + +/** Convert a group element to the storage type. */ +static void secp256k1_ge_to_storage(secp256k1_ge_storage_t *r, const secp256k1_ge_t*); + +/** Convert a group element back from the storage type. */ +static void secp256k1_ge_from_storage(secp256k1_ge_t *r, const secp256k1_ge_storage_t*); + +/** If flag is true, set *r equal to *a; otherwise leave it. Constant-time. */ +static void secp256k1_ge_storage_cmov(secp256k1_ge_storage_t *r, const secp256k1_ge_storage_t *a, int flag); + +/** Rescale a jacobian point by b which must be non-zero. Constant-time. */ +static void secp256k1_gej_rescale(secp256k1_gej_t *r, const secp256k1_fe_t *b); + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/group_impl.h b/src/cryptoconditions/src/include/secp256k1/src/group_impl.h new file mode 100644 index 000000000..0f64576fb --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/group_impl.h @@ -0,0 +1,443 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_GROUP_IMPL_H_ +#define _SECP256K1_GROUP_IMPL_H_ + +#include + +#include "num.h" +#include "field.h" +#include "group.h" + +/** Generator for secp256k1, value 'g' defined in + * "Standards for Efficient Cryptography" (SEC2) 2.7.1. + */ +static const secp256k1_ge_t secp256k1_ge_const_g = SECP256K1_GE_CONST( + 0x79BE667EUL, 0xF9DCBBACUL, 0x55A06295UL, 0xCE870B07UL, + 0x029BFCDBUL, 0x2DCE28D9UL, 0x59F2815BUL, 0x16F81798UL, + 0x483ADA77UL, 0x26A3C465UL, 0x5DA4FBFCUL, 0x0E1108A8UL, + 0xFD17B448UL, 0xA6855419UL, 0x9C47D08FUL, 0xFB10D4B8UL +); + +static void secp256k1_ge_set_infinity(secp256k1_ge_t *r) { + r->infinity = 1; +} + +static void secp256k1_ge_set_xy(secp256k1_ge_t *r, const secp256k1_fe_t *x, const secp256k1_fe_t *y) { + r->infinity = 0; + r->x = *x; + r->y = *y; +} + +static int secp256k1_ge_is_infinity(const secp256k1_ge_t *a) { + return a->infinity; +} + +static void secp256k1_ge_neg(secp256k1_ge_t *r, const secp256k1_ge_t *a) { + *r = *a; + secp256k1_fe_normalize_weak(&r->y); + secp256k1_fe_negate(&r->y, &r->y, 1); +} + +static void secp256k1_ge_set_gej(secp256k1_ge_t *r, secp256k1_gej_t *a) { + secp256k1_fe_t z2, z3; + r->infinity = a->infinity; + secp256k1_fe_inv(&a->z, &a->z); + secp256k1_fe_sqr(&z2, &a->z); + secp256k1_fe_mul(&z3, &a->z, &z2); + secp256k1_fe_mul(&a->x, &a->x, &z2); + secp256k1_fe_mul(&a->y, &a->y, &z3); + secp256k1_fe_set_int(&a->z, 1); + r->x = a->x; + r->y = a->y; +} + +static void secp256k1_ge_set_gej_var(secp256k1_ge_t *r, secp256k1_gej_t *a) { + secp256k1_fe_t z2, z3; + r->infinity = a->infinity; + if (a->infinity) { + return; + } + secp256k1_fe_inv_var(&a->z, &a->z); + secp256k1_fe_sqr(&z2, &a->z); + secp256k1_fe_mul(&z3, &a->z, &z2); + secp256k1_fe_mul(&a->x, &a->x, &z2); + secp256k1_fe_mul(&a->y, &a->y, &z3); + secp256k1_fe_set_int(&a->z, 1); + r->x = a->x; + r->y = a->y; +} + +static void secp256k1_ge_set_all_gej_var(size_t len, secp256k1_ge_t *r, const secp256k1_gej_t *a) { + secp256k1_fe_t *az; + secp256k1_fe_t *azi; + size_t i; + size_t count = 0; + az = (secp256k1_fe_t *)checked_malloc(sizeof(secp256k1_fe_t) * len); + for (i = 0; i < len; i++) { + if (!a[i].infinity) { + az[count++] = a[i].z; + } + } + + azi = (secp256k1_fe_t *)checked_malloc(sizeof(secp256k1_fe_t) * count); + secp256k1_fe_inv_all_var(count, azi, az); + free(az); + + count = 0; + for (i = 0; i < len; i++) { + r[i].infinity = a[i].infinity; + if (!a[i].infinity) { + secp256k1_fe_t zi2, zi3; + secp256k1_fe_t *zi = &azi[count++]; + secp256k1_fe_sqr(&zi2, zi); + secp256k1_fe_mul(&zi3, &zi2, zi); + secp256k1_fe_mul(&r[i].x, &a[i].x, &zi2); + secp256k1_fe_mul(&r[i].y, &a[i].y, &zi3); + } + } + free(azi); +} + +static void secp256k1_gej_set_infinity(secp256k1_gej_t *r) { + r->infinity = 1; + secp256k1_fe_set_int(&r->x, 0); + secp256k1_fe_set_int(&r->y, 0); + secp256k1_fe_set_int(&r->z, 0); +} + +static void secp256k1_gej_set_xy(secp256k1_gej_t *r, const secp256k1_fe_t *x, const secp256k1_fe_t *y) { + r->infinity = 0; + r->x = *x; + r->y = *y; + secp256k1_fe_set_int(&r->z, 1); +} + +static void secp256k1_gej_clear(secp256k1_gej_t *r) { + r->infinity = 0; + secp256k1_fe_clear(&r->x); + secp256k1_fe_clear(&r->y); + secp256k1_fe_clear(&r->z); +} + +static void secp256k1_ge_clear(secp256k1_ge_t *r) { + r->infinity = 0; + secp256k1_fe_clear(&r->x); + secp256k1_fe_clear(&r->y); +} + +static int secp256k1_ge_set_xo_var(secp256k1_ge_t *r, const secp256k1_fe_t *x, int odd) { + secp256k1_fe_t x2, x3, c; + r->x = *x; + secp256k1_fe_sqr(&x2, x); + secp256k1_fe_mul(&x3, x, &x2); + r->infinity = 0; + secp256k1_fe_set_int(&c, 7); + secp256k1_fe_add(&c, &x3); + if (!secp256k1_fe_sqrt_var(&r->y, &c)) { + return 0; + } + secp256k1_fe_normalize_var(&r->y); + if (secp256k1_fe_is_odd(&r->y) != odd) { + secp256k1_fe_negate(&r->y, &r->y, 1); + } + return 1; +} + +static void secp256k1_gej_set_ge(secp256k1_gej_t *r, const secp256k1_ge_t *a) { + r->infinity = a->infinity; + r->x = a->x; + r->y = a->y; + secp256k1_fe_set_int(&r->z, 1); +} + +static int secp256k1_gej_eq_x_var(const secp256k1_fe_t *x, const secp256k1_gej_t *a) { + secp256k1_fe_t r, r2; + VERIFY_CHECK(!a->infinity); + secp256k1_fe_sqr(&r, &a->z); secp256k1_fe_mul(&r, &r, x); + r2 = a->x; secp256k1_fe_normalize_weak(&r2); + return secp256k1_fe_equal_var(&r, &r2); +} + +static void secp256k1_gej_neg(secp256k1_gej_t *r, const secp256k1_gej_t *a) { + r->infinity = a->infinity; + r->x = a->x; + r->y = a->y; + r->z = a->z; + secp256k1_fe_normalize_weak(&r->y); + secp256k1_fe_negate(&r->y, &r->y, 1); +} + +static int secp256k1_gej_is_infinity(const secp256k1_gej_t *a) { + return a->infinity; +} + +static int secp256k1_gej_is_valid_var(const secp256k1_gej_t *a) { + secp256k1_fe_t y2, x3, z2, z6; + if (a->infinity) { + return 0; + } + /** y^2 = x^3 + 7 + * (Y/Z^3)^2 = (X/Z^2)^3 + 7 + * Y^2 / Z^6 = X^3 / Z^6 + 7 + * Y^2 = X^3 + 7*Z^6 + */ + secp256k1_fe_sqr(&y2, &a->y); + secp256k1_fe_sqr(&x3, &a->x); secp256k1_fe_mul(&x3, &x3, &a->x); + secp256k1_fe_sqr(&z2, &a->z); + secp256k1_fe_sqr(&z6, &z2); secp256k1_fe_mul(&z6, &z6, &z2); + secp256k1_fe_mul_int(&z6, 7); + secp256k1_fe_add(&x3, &z6); + secp256k1_fe_normalize_weak(&x3); + return secp256k1_fe_equal_var(&y2, &x3); +} + +static int secp256k1_ge_is_valid_var(const secp256k1_ge_t *a) { + secp256k1_fe_t y2, x3, c; + if (a->infinity) { + return 0; + } + /* y^2 = x^3 + 7 */ + secp256k1_fe_sqr(&y2, &a->y); + secp256k1_fe_sqr(&x3, &a->x); secp256k1_fe_mul(&x3, &x3, &a->x); + secp256k1_fe_set_int(&c, 7); + secp256k1_fe_add(&x3, &c); + secp256k1_fe_normalize_weak(&x3); + return secp256k1_fe_equal_var(&y2, &x3); +} + +static void secp256k1_gej_double_var(secp256k1_gej_t *r, const secp256k1_gej_t *a) { + /* Operations: 3 mul, 4 sqr, 0 normalize, 12 mul_int/add/negate */ + secp256k1_fe_t t1,t2,t3,t4; + /** For secp256k1, 2Q is infinity if and only if Q is infinity. This is because if 2Q = infinity, + * Q must equal -Q, or that Q.y == -(Q.y), or Q.y is 0. For a point on y^2 = x^3 + 7 to have + * y=0, x^3 must be -7 mod p. However, -7 has no cube root mod p. + */ + r->infinity = a->infinity; + if (r->infinity) { + return; + } + + secp256k1_fe_mul(&r->z, &a->z, &a->y); + secp256k1_fe_mul_int(&r->z, 2); /* Z' = 2*Y*Z (2) */ + secp256k1_fe_sqr(&t1, &a->x); + secp256k1_fe_mul_int(&t1, 3); /* T1 = 3*X^2 (3) */ + secp256k1_fe_sqr(&t2, &t1); /* T2 = 9*X^4 (1) */ + secp256k1_fe_sqr(&t3, &a->y); + secp256k1_fe_mul_int(&t3, 2); /* T3 = 2*Y^2 (2) */ + secp256k1_fe_sqr(&t4, &t3); + secp256k1_fe_mul_int(&t4, 2); /* T4 = 8*Y^4 (2) */ + secp256k1_fe_mul(&t3, &t3, &a->x); /* T3 = 2*X*Y^2 (1) */ + r->x = t3; + secp256k1_fe_mul_int(&r->x, 4); /* X' = 8*X*Y^2 (4) */ + secp256k1_fe_negate(&r->x, &r->x, 4); /* X' = -8*X*Y^2 (5) */ + secp256k1_fe_add(&r->x, &t2); /* X' = 9*X^4 - 8*X*Y^2 (6) */ + secp256k1_fe_negate(&t2, &t2, 1); /* T2 = -9*X^4 (2) */ + secp256k1_fe_mul_int(&t3, 6); /* T3 = 12*X*Y^2 (6) */ + secp256k1_fe_add(&t3, &t2); /* T3 = 12*X*Y^2 - 9*X^4 (8) */ + secp256k1_fe_mul(&r->y, &t1, &t3); /* Y' = 36*X^3*Y^2 - 27*X^6 (1) */ + secp256k1_fe_negate(&t2, &t4, 2); /* T2 = -8*Y^4 (3) */ + secp256k1_fe_add(&r->y, &t2); /* Y' = 36*X^3*Y^2 - 27*X^6 - 8*Y^4 (4) */ +} + +static void secp256k1_gej_add_var(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_gej_t *b) { + /* Operations: 12 mul, 4 sqr, 2 normalize, 12 mul_int/add/negate */ + secp256k1_fe_t z22, z12, u1, u2, s1, s2, h, i, i2, h2, h3, t; + if (a->infinity) { + *r = *b; + return; + } + if (b->infinity) { + *r = *a; + return; + } + r->infinity = 0; + secp256k1_fe_sqr(&z22, &b->z); + secp256k1_fe_sqr(&z12, &a->z); + secp256k1_fe_mul(&u1, &a->x, &z22); + secp256k1_fe_mul(&u2, &b->x, &z12); + secp256k1_fe_mul(&s1, &a->y, &z22); secp256k1_fe_mul(&s1, &s1, &b->z); + secp256k1_fe_mul(&s2, &b->y, &z12); secp256k1_fe_mul(&s2, &s2, &a->z); + secp256k1_fe_negate(&h, &u1, 1); secp256k1_fe_add(&h, &u2); + secp256k1_fe_negate(&i, &s1, 1); secp256k1_fe_add(&i, &s2); + if (secp256k1_fe_normalizes_to_zero_var(&h)) { + if (secp256k1_fe_normalizes_to_zero_var(&i)) { + secp256k1_gej_double_var(r, a); + } else { + r->infinity = 1; + } + return; + } + secp256k1_fe_sqr(&i2, &i); + secp256k1_fe_sqr(&h2, &h); + secp256k1_fe_mul(&h3, &h, &h2); + secp256k1_fe_mul(&r->z, &a->z, &b->z); secp256k1_fe_mul(&r->z, &r->z, &h); + secp256k1_fe_mul(&t, &u1, &h2); + r->x = t; secp256k1_fe_mul_int(&r->x, 2); secp256k1_fe_add(&r->x, &h3); secp256k1_fe_negate(&r->x, &r->x, 3); secp256k1_fe_add(&r->x, &i2); + secp256k1_fe_negate(&r->y, &r->x, 5); secp256k1_fe_add(&r->y, &t); secp256k1_fe_mul(&r->y, &r->y, &i); + secp256k1_fe_mul(&h3, &h3, &s1); secp256k1_fe_negate(&h3, &h3, 1); + secp256k1_fe_add(&r->y, &h3); +} + +static void secp256k1_gej_add_ge_var(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_ge_t *b) { + /* 8 mul, 3 sqr, 4 normalize, 12 mul_int/add/negate */ + secp256k1_fe_t z12, u1, u2, s1, s2, h, i, i2, h2, h3, t; + if (a->infinity) { + r->infinity = b->infinity; + r->x = b->x; + r->y = b->y; + secp256k1_fe_set_int(&r->z, 1); + return; + } + if (b->infinity) { + *r = *a; + return; + } + r->infinity = 0; + secp256k1_fe_sqr(&z12, &a->z); + u1 = a->x; secp256k1_fe_normalize_weak(&u1); + secp256k1_fe_mul(&u2, &b->x, &z12); + s1 = a->y; secp256k1_fe_normalize_weak(&s1); + secp256k1_fe_mul(&s2, &b->y, &z12); secp256k1_fe_mul(&s2, &s2, &a->z); + secp256k1_fe_negate(&h, &u1, 1); secp256k1_fe_add(&h, &u2); + secp256k1_fe_negate(&i, &s1, 1); secp256k1_fe_add(&i, &s2); + if (secp256k1_fe_normalizes_to_zero_var(&h)) { + if (secp256k1_fe_normalizes_to_zero_var(&i)) { + secp256k1_gej_double_var(r, a); + } else { + r->infinity = 1; + } + return; + } + secp256k1_fe_sqr(&i2, &i); + secp256k1_fe_sqr(&h2, &h); + secp256k1_fe_mul(&h3, &h, &h2); + r->z = a->z; secp256k1_fe_mul(&r->z, &r->z, &h); + secp256k1_fe_mul(&t, &u1, &h2); + r->x = t; secp256k1_fe_mul_int(&r->x, 2); secp256k1_fe_add(&r->x, &h3); secp256k1_fe_negate(&r->x, &r->x, 3); secp256k1_fe_add(&r->x, &i2); + secp256k1_fe_negate(&r->y, &r->x, 5); secp256k1_fe_add(&r->y, &t); secp256k1_fe_mul(&r->y, &r->y, &i); + secp256k1_fe_mul(&h3, &h3, &s1); secp256k1_fe_negate(&h3, &h3, 1); + secp256k1_fe_add(&r->y, &h3); +} + +static void secp256k1_gej_add_ge(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_ge_t *b) { + /* Operations: 7 mul, 5 sqr, 5 normalize, 17 mul_int/add/negate/cmov */ + static const secp256k1_fe_t fe_1 = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1); + secp256k1_fe_t zz, u1, u2, s1, s2, z, t, m, n, q, rr; + int infinity; + VERIFY_CHECK(!b->infinity); + VERIFY_CHECK(a->infinity == 0 || a->infinity == 1); + + /** In: + * Eric Brier and Marc Joye, Weierstrass Elliptic Curves and Side-Channel Attacks. + * In D. Naccache and P. Paillier, Eds., Public Key Cryptography, vol. 2274 of Lecture Notes in Computer Science, pages 335-345. Springer-Verlag, 2002. + * we find as solution for a unified addition/doubling formula: + * lambda = ((x1 + x2)^2 - x1 * x2 + a) / (y1 + y2), with a = 0 for secp256k1's curve equation. + * x3 = lambda^2 - (x1 + x2) + * 2*y3 = lambda * (x1 + x2 - 2 * x3) - (y1 + y2). + * + * Substituting x_i = Xi / Zi^2 and yi = Yi / Zi^3, for i=1,2,3, gives: + * U1 = X1*Z2^2, U2 = X2*Z1^2 + * S1 = Y1*Z2^3, S2 = Y2*Z1^3 + * Z = Z1*Z2 + * T = U1+U2 + * M = S1+S2 + * Q = T*M^2 + * R = T^2-U1*U2 + * X3 = 4*(R^2-Q) + * Y3 = 4*(R*(3*Q-2*R^2)-M^4) + * Z3 = 2*M*Z + * (Note that the paper uses xi = Xi / Zi and yi = Yi / Zi instead.) + */ + + secp256k1_fe_sqr(&zz, &a->z); /* z = Z1^2 */ + u1 = a->x; secp256k1_fe_normalize_weak(&u1); /* u1 = U1 = X1*Z2^2 (1) */ + secp256k1_fe_mul(&u2, &b->x, &zz); /* u2 = U2 = X2*Z1^2 (1) */ + s1 = a->y; secp256k1_fe_normalize_weak(&s1); /* s1 = S1 = Y1*Z2^3 (1) */ + secp256k1_fe_mul(&s2, &b->y, &zz); /* s2 = Y2*Z2^2 (1) */ + secp256k1_fe_mul(&s2, &s2, &a->z); /* s2 = S2 = Y2*Z1^3 (1) */ + z = a->z; /* z = Z = Z1*Z2 (8) */ + t = u1; secp256k1_fe_add(&t, &u2); /* t = T = U1+U2 (2) */ + m = s1; secp256k1_fe_add(&m, &s2); /* m = M = S1+S2 (2) */ + secp256k1_fe_sqr(&n, &m); /* n = M^2 (1) */ + secp256k1_fe_mul(&q, &n, &t); /* q = Q = T*M^2 (1) */ + secp256k1_fe_sqr(&n, &n); /* n = M^4 (1) */ + secp256k1_fe_sqr(&rr, &t); /* rr = T^2 (1) */ + secp256k1_fe_mul(&t, &u1, &u2); secp256k1_fe_negate(&t, &t, 1); /* t = -U1*U2 (2) */ + secp256k1_fe_add(&rr, &t); /* rr = R = T^2-U1*U2 (3) */ + secp256k1_fe_sqr(&t, &rr); /* t = R^2 (1) */ + secp256k1_fe_mul(&r->z, &m, &z); /* r->z = M*Z (1) */ + infinity = secp256k1_fe_normalizes_to_zero(&r->z) * (1 - a->infinity); + secp256k1_fe_mul_int(&r->z, 2 * (1 - a->infinity)); /* r->z = Z3 = 2*M*Z (2) */ + r->x = t; /* r->x = R^2 (1) */ + secp256k1_fe_negate(&q, &q, 1); /* q = -Q (2) */ + secp256k1_fe_add(&r->x, &q); /* r->x = R^2-Q (3) */ + secp256k1_fe_normalize(&r->x); + secp256k1_fe_mul_int(&q, 3); /* q = -3*Q (6) */ + secp256k1_fe_mul_int(&t, 2); /* t = 2*R^2 (2) */ + secp256k1_fe_add(&t, &q); /* t = 2*R^2-3*Q (8) */ + secp256k1_fe_mul(&t, &t, &rr); /* t = R*(2*R^2-3*Q) (1) */ + secp256k1_fe_add(&t, &n); /* t = R*(2*R^2-3*Q)+M^4 (2) */ + secp256k1_fe_negate(&r->y, &t, 2); /* r->y = R*(3*Q-2*R^2)-M^4 (3) */ + secp256k1_fe_normalize_weak(&r->y); + secp256k1_fe_mul_int(&r->x, 4 * (1 - a->infinity)); /* r->x = X3 = 4*(R^2-Q) */ + secp256k1_fe_mul_int(&r->y, 4 * (1 - a->infinity)); /* r->y = Y3 = 4*R*(3*Q-2*R^2)-4*M^4 (4) */ + + /** In case a->infinity == 1, the above code results in r->x, r->y, and r->z all equal to 0. + * Replace r with b->x, b->y, 1 in that case. + */ + secp256k1_fe_cmov(&r->x, &b->x, a->infinity); + secp256k1_fe_cmov(&r->y, &b->y, a->infinity); + secp256k1_fe_cmov(&r->z, &fe_1, a->infinity); + r->infinity = infinity; +} + +static void secp256k1_gej_rescale(secp256k1_gej_t *r, const secp256k1_fe_t *s) { + /* Operations: 4 mul, 1 sqr */ + secp256k1_fe_t zz; + VERIFY_CHECK(!secp256k1_fe_is_zero(s)); + secp256k1_fe_sqr(&zz, s); + secp256k1_fe_mul(&r->x, &r->x, &zz); /* r->x *= s^2 */ + secp256k1_fe_mul(&r->y, &r->y, &zz); + secp256k1_fe_mul(&r->y, &r->y, s); /* r->y *= s^3 */ + secp256k1_fe_mul(&r->z, &r->z, s); /* r->z *= s */ +} + +static void secp256k1_ge_to_storage(secp256k1_ge_storage_t *r, const secp256k1_ge_t *a) { + secp256k1_fe_t x, y; + VERIFY_CHECK(!a->infinity); + x = a->x; + secp256k1_fe_normalize(&x); + y = a->y; + secp256k1_fe_normalize(&y); + secp256k1_fe_to_storage(&r->x, &x); + secp256k1_fe_to_storage(&r->y, &y); +} + +static void secp256k1_ge_from_storage(secp256k1_ge_t *r, const secp256k1_ge_storage_t *a) { + secp256k1_fe_from_storage(&r->x, &a->x); + secp256k1_fe_from_storage(&r->y, &a->y); + r->infinity = 0; +} + +static SECP256K1_INLINE void secp256k1_ge_storage_cmov(secp256k1_ge_storage_t *r, const secp256k1_ge_storage_t *a, int flag) { + secp256k1_fe_storage_cmov(&r->x, &a->x, flag); + secp256k1_fe_storage_cmov(&r->y, &a->y, flag); +} + +#ifdef USE_ENDOMORPHISM +static void secp256k1_gej_mul_lambda(secp256k1_gej_t *r, const secp256k1_gej_t *a) { + static const secp256k1_fe_t beta = SECP256K1_FE_CONST( + 0x7ae96a2bul, 0x657c0710ul, 0x6e64479eul, 0xac3434e9ul, + 0x9cf04975ul, 0x12f58995ul, 0xc1396c28ul, 0x719501eeul + ); + *r = *a; + secp256k1_fe_mul(&r->x, &r->x, &beta); +} +#endif + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/hash.h b/src/cryptoconditions/src/include/secp256k1/src/hash.h new file mode 100644 index 000000000..843423d7f --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/hash.h @@ -0,0 +1,41 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_HASH_ +#define _SECP256K1_HASH_ + +#include +#include + +typedef struct { + uint32_t s[32]; + uint32_t buf[16]; /* In big endian */ + size_t bytes; +} secp256k1_sha256_t; + +static void secp256k1_sha256_initialize(secp256k1_sha256_t *hash); +static void secp256k1_sha256_write(secp256k1_sha256_t *hash, const unsigned char *data, size_t size); +static void secp256k1_sha256_finalize(secp256k1_sha256_t *hash, unsigned char *out32); + +typedef struct { + secp256k1_sha256_t inner, outer; +} secp256k1_hmac_sha256_t; + +static void secp256k1_hmac_sha256_initialize(secp256k1_hmac_sha256_t *hash, const unsigned char *key, size_t size); +static void secp256k1_hmac_sha256_write(secp256k1_hmac_sha256_t *hash, const unsigned char *data, size_t size); +static void secp256k1_hmac_sha256_finalize(secp256k1_hmac_sha256_t *hash, unsigned char *out32); + +typedef struct { + unsigned char v[32]; + unsigned char k[32]; + int retry; +} secp256k1_rfc6979_hmac_sha256_t; + +static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha256_t *rng, const unsigned char *key, size_t keylen, const unsigned char *msg, size_t msglen, const unsigned char *rnd, size_t rndlen); +static void secp256k1_rfc6979_hmac_sha256_generate(secp256k1_rfc6979_hmac_sha256_t *rng, unsigned char *out, size_t outlen); +static void secp256k1_rfc6979_hmac_sha256_finalize(secp256k1_rfc6979_hmac_sha256_t *rng); + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/hash_impl.h b/src/cryptoconditions/src/include/secp256k1/src/hash_impl.h new file mode 100644 index 000000000..9828827bc --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/hash_impl.h @@ -0,0 +1,293 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_HASH_IMPL_H_ +#define _SECP256K1_HASH_IMPL_H_ + +#include "hash.h" + +#include +#include +#include + +#define Ch(x,y,z) ((z) ^ ((x) & ((y) ^ (z)))) +#define Maj(x,y,z) (((x) & (y)) | ((z) & ((x) | (y)))) +#define Sigma0(x) (((x) >> 2 | (x) << 30) ^ ((x) >> 13 | (x) << 19) ^ ((x) >> 22 | (x) << 10)) +#define Sigma1(x) (((x) >> 6 | (x) << 26) ^ ((x) >> 11 | (x) << 21) ^ ((x) >> 25 | (x) << 7)) +#define sigma0(x) (((x) >> 7 | (x) << 25) ^ ((x) >> 18 | (x) << 14) ^ ((x) >> 3)) +#define sigma1(x) (((x) >> 17 | (x) << 15) ^ ((x) >> 19 | (x) << 13) ^ ((x) >> 10)) + +#define Round(a,b,c,d,e,f,g,h,k,w) do { \ + uint32_t t1 = (h) + Sigma1(e) + Ch((e), (f), (g)) + (k) + (w); \ + uint32_t t2 = Sigma0(a) + Maj((a), (b), (c)); \ + (d) += t1; \ + (h) = t1 + t2; \ +} while(0) + +#ifdef WORDS_BIGENDIAN +#define BE32(x) (x) +#else +#define BE32(p) ((((p) & 0xFF) << 24) | (((p) & 0xFF00) << 8) | (((p) & 0xFF0000) >> 8) | (((p) & 0xFF000000) >> 24)) +#endif + +static void secp256k1_sha256_initialize(secp256k1_sha256_t *hash) { + hash->s[0] = 0x6a09e667ul; + hash->s[1] = 0xbb67ae85ul; + hash->s[2] = 0x3c6ef372ul; + hash->s[3] = 0xa54ff53aul; + hash->s[4] = 0x510e527ful; + hash->s[5] = 0x9b05688cul; + hash->s[6] = 0x1f83d9abul; + hash->s[7] = 0x5be0cd19ul; + hash->bytes = 0; +} + +/** Perform one SHA-256 transformation, processing 16 big endian 32-bit words. */ +static void secp256k1_sha256_transform(uint32_t* s, const uint32_t* chunk) { + uint32_t a = s[0], b = s[1], c = s[2], d = s[3], e = s[4], f = s[5], g = s[6], h = s[7]; + uint32_t w0, w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11, w12, w13, w14, w15; + + Round(a, b, c, d, e, f, g, h, 0x428a2f98, w0 = BE32(chunk[0])); + Round(h, a, b, c, d, e, f, g, 0x71374491, w1 = BE32(chunk[1])); + Round(g, h, a, b, c, d, e, f, 0xb5c0fbcf, w2 = BE32(chunk[2])); + Round(f, g, h, a, b, c, d, e, 0xe9b5dba5, w3 = BE32(chunk[3])); + Round(e, f, g, h, a, b, c, d, 0x3956c25b, w4 = BE32(chunk[4])); + Round(d, e, f, g, h, a, b, c, 0x59f111f1, w5 = BE32(chunk[5])); + Round(c, d, e, f, g, h, a, b, 0x923f82a4, w6 = BE32(chunk[6])); + Round(b, c, d, e, f, g, h, a, 0xab1c5ed5, w7 = BE32(chunk[7])); + Round(a, b, c, d, e, f, g, h, 0xd807aa98, w8 = BE32(chunk[8])); + Round(h, a, b, c, d, e, f, g, 0x12835b01, w9 = BE32(chunk[9])); + Round(g, h, a, b, c, d, e, f, 0x243185be, w10 = BE32(chunk[10])); + Round(f, g, h, a, b, c, d, e, 0x550c7dc3, w11 = BE32(chunk[11])); + Round(e, f, g, h, a, b, c, d, 0x72be5d74, w12 = BE32(chunk[12])); + Round(d, e, f, g, h, a, b, c, 0x80deb1fe, w13 = BE32(chunk[13])); + Round(c, d, e, f, g, h, a, b, 0x9bdc06a7, w14 = BE32(chunk[14])); + Round(b, c, d, e, f, g, h, a, 0xc19bf174, w15 = BE32(chunk[15])); + + Round(a, b, c, d, e, f, g, h, 0xe49b69c1, w0 += sigma1(w14) + w9 + sigma0(w1)); + Round(h, a, b, c, d, e, f, g, 0xefbe4786, w1 += sigma1(w15) + w10 + sigma0(w2)); + Round(g, h, a, b, c, d, e, f, 0x0fc19dc6, w2 += sigma1(w0) + w11 + sigma0(w3)); + Round(f, g, h, a, b, c, d, e, 0x240ca1cc, w3 += sigma1(w1) + w12 + sigma0(w4)); + Round(e, f, g, h, a, b, c, d, 0x2de92c6f, w4 += sigma1(w2) + w13 + sigma0(w5)); + Round(d, e, f, g, h, a, b, c, 0x4a7484aa, w5 += sigma1(w3) + w14 + sigma0(w6)); + Round(c, d, e, f, g, h, a, b, 0x5cb0a9dc, w6 += sigma1(w4) + w15 + sigma0(w7)); + Round(b, c, d, e, f, g, h, a, 0x76f988da, w7 += sigma1(w5) + w0 + sigma0(w8)); + Round(a, b, c, d, e, f, g, h, 0x983e5152, w8 += sigma1(w6) + w1 + sigma0(w9)); + Round(h, a, b, c, d, e, f, g, 0xa831c66d, w9 += sigma1(w7) + w2 + sigma0(w10)); + Round(g, h, a, b, c, d, e, f, 0xb00327c8, w10 += sigma1(w8) + w3 + sigma0(w11)); + Round(f, g, h, a, b, c, d, e, 0xbf597fc7, w11 += sigma1(w9) + w4 + sigma0(w12)); + Round(e, f, g, h, a, b, c, d, 0xc6e00bf3, w12 += sigma1(w10) + w5 + sigma0(w13)); + Round(d, e, f, g, h, a, b, c, 0xd5a79147, w13 += sigma1(w11) + w6 + sigma0(w14)); + Round(c, d, e, f, g, h, a, b, 0x06ca6351, w14 += sigma1(w12) + w7 + sigma0(w15)); + Round(b, c, d, e, f, g, h, a, 0x14292967, w15 += sigma1(w13) + w8 + sigma0(w0)); + + Round(a, b, c, d, e, f, g, h, 0x27b70a85, w0 += sigma1(w14) + w9 + sigma0(w1)); + Round(h, a, b, c, d, e, f, g, 0x2e1b2138, w1 += sigma1(w15) + w10 + sigma0(w2)); + Round(g, h, a, b, c, d, e, f, 0x4d2c6dfc, w2 += sigma1(w0) + w11 + sigma0(w3)); + Round(f, g, h, a, b, c, d, e, 0x53380d13, w3 += sigma1(w1) + w12 + sigma0(w4)); + Round(e, f, g, h, a, b, c, d, 0x650a7354, w4 += sigma1(w2) + w13 + sigma0(w5)); + Round(d, e, f, g, h, a, b, c, 0x766a0abb, w5 += sigma1(w3) + w14 + sigma0(w6)); + Round(c, d, e, f, g, h, a, b, 0x81c2c92e, w6 += sigma1(w4) + w15 + sigma0(w7)); + Round(b, c, d, e, f, g, h, a, 0x92722c85, w7 += sigma1(w5) + w0 + sigma0(w8)); + Round(a, b, c, d, e, f, g, h, 0xa2bfe8a1, w8 += sigma1(w6) + w1 + sigma0(w9)); + Round(h, a, b, c, d, e, f, g, 0xa81a664b, w9 += sigma1(w7) + w2 + sigma0(w10)); + Round(g, h, a, b, c, d, e, f, 0xc24b8b70, w10 += sigma1(w8) + w3 + sigma0(w11)); + Round(f, g, h, a, b, c, d, e, 0xc76c51a3, w11 += sigma1(w9) + w4 + sigma0(w12)); + Round(e, f, g, h, a, b, c, d, 0xd192e819, w12 += sigma1(w10) + w5 + sigma0(w13)); + Round(d, e, f, g, h, a, b, c, 0xd6990624, w13 += sigma1(w11) + w6 + sigma0(w14)); + Round(c, d, e, f, g, h, a, b, 0xf40e3585, w14 += sigma1(w12) + w7 + sigma0(w15)); + Round(b, c, d, e, f, g, h, a, 0x106aa070, w15 += sigma1(w13) + w8 + sigma0(w0)); + + Round(a, b, c, d, e, f, g, h, 0x19a4c116, w0 += sigma1(w14) + w9 + sigma0(w1)); + Round(h, a, b, c, d, e, f, g, 0x1e376c08, w1 += sigma1(w15) + w10 + sigma0(w2)); + Round(g, h, a, b, c, d, e, f, 0x2748774c, w2 += sigma1(w0) + w11 + sigma0(w3)); + Round(f, g, h, a, b, c, d, e, 0x34b0bcb5, w3 += sigma1(w1) + w12 + sigma0(w4)); + Round(e, f, g, h, a, b, c, d, 0x391c0cb3, w4 += sigma1(w2) + w13 + sigma0(w5)); + Round(d, e, f, g, h, a, b, c, 0x4ed8aa4a, w5 += sigma1(w3) + w14 + sigma0(w6)); + Round(c, d, e, f, g, h, a, b, 0x5b9cca4f, w6 += sigma1(w4) + w15 + sigma0(w7)); + Round(b, c, d, e, f, g, h, a, 0x682e6ff3, w7 += sigma1(w5) + w0 + sigma0(w8)); + Round(a, b, c, d, e, f, g, h, 0x748f82ee, w8 += sigma1(w6) + w1 + sigma0(w9)); + Round(h, a, b, c, d, e, f, g, 0x78a5636f, w9 += sigma1(w7) + w2 + sigma0(w10)); + Round(g, h, a, b, c, d, e, f, 0x84c87814, w10 += sigma1(w8) + w3 + sigma0(w11)); + Round(f, g, h, a, b, c, d, e, 0x8cc70208, w11 += sigma1(w9) + w4 + sigma0(w12)); + Round(e, f, g, h, a, b, c, d, 0x90befffa, w12 += sigma1(w10) + w5 + sigma0(w13)); + Round(d, e, f, g, h, a, b, c, 0xa4506ceb, w13 += sigma1(w11) + w6 + sigma0(w14)); + Round(c, d, e, f, g, h, a, b, 0xbef9a3f7, w14 + sigma1(w12) + w7 + sigma0(w15)); + Round(b, c, d, e, f, g, h, a, 0xc67178f2, w15 + sigma1(w13) + w8 + sigma0(w0)); + + s[0] += a; + s[1] += b; + s[2] += c; + s[3] += d; + s[4] += e; + s[5] += f; + s[6] += g; + s[7] += h; +} + +static void secp256k1_sha256_write(secp256k1_sha256_t *hash, const unsigned char *data, size_t len) { + size_t bufsize = hash->bytes & 0x3F; + hash->bytes += len; + while (bufsize + len >= 64) { + /* Fill the buffer, and process it. */ + memcpy(((unsigned char*)hash->buf) + bufsize, data, 64 - bufsize); + data += 64 - bufsize; + len -= 64 - bufsize; + secp256k1_sha256_transform(hash->s, hash->buf); + bufsize = 0; + } + if (len) { + /* Fill the buffer with what remains. */ + memcpy(((unsigned char*)hash->buf) + bufsize, data, len); + } +} + +static void secp256k1_sha256_finalize(secp256k1_sha256_t *hash, unsigned char *out32) { + static const unsigned char pad[64] = {0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + uint32_t sizedesc[2]; + uint32_t out[8]; + int i = 0; + sizedesc[0] = BE32(hash->bytes >> 29); + sizedesc[1] = BE32(hash->bytes << 3); + secp256k1_sha256_write(hash, pad, 1 + ((119 - (hash->bytes % 64)) % 64)); + secp256k1_sha256_write(hash, (const unsigned char*)sizedesc, 8); + for (i = 0; i < 8; i++) { + out[i] = BE32(hash->s[i]); + hash->s[i] = 0; + } + memcpy(out32, (const unsigned char*)out, 32); +} + +static void secp256k1_hmac_sha256_initialize(secp256k1_hmac_sha256_t *hash, const unsigned char *key, size_t keylen) { + int n; + unsigned char rkey[64]; + if (keylen <= 64) { + memcpy(rkey, key, keylen); + memset(rkey + keylen, 0, 64 - keylen); + } else { + secp256k1_sha256_t sha256; + secp256k1_sha256_initialize(&sha256); + secp256k1_sha256_write(&sha256, key, keylen); + secp256k1_sha256_finalize(&sha256, rkey); + memset(rkey + 32, 0, 32); + } + + secp256k1_sha256_initialize(&hash->outer); + for (n = 0; n < 64; n++) { + rkey[n] ^= 0x5c; + } + secp256k1_sha256_write(&hash->outer, rkey, 64); + + secp256k1_sha256_initialize(&hash->inner); + for (n = 0; n < 64; n++) { + rkey[n] ^= 0x5c ^ 0x36; + } + secp256k1_sha256_write(&hash->inner, rkey, 64); + memset(rkey, 0, 64); +} + +static void secp256k1_hmac_sha256_write(secp256k1_hmac_sha256_t *hash, const unsigned char *data, size_t size) { + secp256k1_sha256_write(&hash->inner, data, size); +} + +static void secp256k1_hmac_sha256_finalize(secp256k1_hmac_sha256_t *hash, unsigned char *out32) { + unsigned char temp[32]; + secp256k1_sha256_finalize(&hash->inner, temp); + secp256k1_sha256_write(&hash->outer, temp, 32); + memset(temp, 0, 32); + secp256k1_sha256_finalize(&hash->outer, out32); +} + + +static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha256_t *rng, const unsigned char *key, size_t keylen, const unsigned char *msg, size_t msglen, const unsigned char *rnd, size_t rndlen) { + secp256k1_hmac_sha256_t hmac; + static const unsigned char zero[1] = {0x00}; + static const unsigned char one[1] = {0x01}; + + memset(rng->v, 0x01, 32); /* RFC6979 3.2.b. */ + memset(rng->k, 0x00, 32); /* RFC6979 3.2.c. */ + + /* RFC6979 3.2.d. */ + secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); + secp256k1_hmac_sha256_write(&hmac, rng->v, 32); + secp256k1_hmac_sha256_write(&hmac, zero, 1); + secp256k1_hmac_sha256_write(&hmac, key, keylen); + secp256k1_hmac_sha256_write(&hmac, msg, msglen); + if (rnd && rndlen) { + /* RFC6979 3.6 "Additional data". */ + secp256k1_hmac_sha256_write(&hmac, rnd, rndlen); + } + secp256k1_hmac_sha256_finalize(&hmac, rng->k); + secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); + secp256k1_hmac_sha256_write(&hmac, rng->v, 32); + secp256k1_hmac_sha256_finalize(&hmac, rng->v); + + /* RFC6979 3.2.f. */ + secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); + secp256k1_hmac_sha256_write(&hmac, rng->v, 32); + secp256k1_hmac_sha256_write(&hmac, one, 1); + secp256k1_hmac_sha256_write(&hmac, key, keylen); + secp256k1_hmac_sha256_write(&hmac, msg, msglen); + if (rnd && rndlen) { + /* RFC6979 3.6 "Additional data". */ + secp256k1_hmac_sha256_write(&hmac, rnd, rndlen); + } + secp256k1_hmac_sha256_finalize(&hmac, rng->k); + secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); + secp256k1_hmac_sha256_write(&hmac, rng->v, 32); + secp256k1_hmac_sha256_finalize(&hmac, rng->v); + rng->retry = 0; +} + +static void secp256k1_rfc6979_hmac_sha256_generate(secp256k1_rfc6979_hmac_sha256_t *rng, unsigned char *out, size_t outlen) { + /* RFC6979 3.2.h. */ + static const unsigned char zero[1] = {0x00}; + if (rng->retry) { + secp256k1_hmac_sha256_t hmac; + secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); + secp256k1_hmac_sha256_write(&hmac, rng->v, 32); + secp256k1_hmac_sha256_write(&hmac, zero, 1); + secp256k1_hmac_sha256_finalize(&hmac, rng->k); + secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); + secp256k1_hmac_sha256_write(&hmac, rng->v, 32); + secp256k1_hmac_sha256_finalize(&hmac, rng->v); + } + + while (outlen > 0) { + secp256k1_hmac_sha256_t hmac; + int now = outlen; + secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); + secp256k1_hmac_sha256_write(&hmac, rng->v, 32); + secp256k1_hmac_sha256_finalize(&hmac, rng->v); + if (now > 32) { + now = 32; + } + memcpy(out, rng->v, now); + out += now; + outlen -= now; + } + + rng->retry = 1; +} + +static void secp256k1_rfc6979_hmac_sha256_finalize(secp256k1_rfc6979_hmac_sha256_t *rng) { + memset(rng->k, 0, 32); + memset(rng->v, 0, 32); + rng->retry = 0; +} + + +#undef Round +#undef sigma0 +#undef sigma1 +#undef Sigma0 +#undef Sigma1 +#undef Ch +#undef Maj +#undef ReadBE32 +#undef WriteBE32 + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/java/org/bitcoin/NativeSecp256k1.java b/src/cryptoconditions/src/include/secp256k1/src/java/org/bitcoin/NativeSecp256k1.java new file mode 100644 index 000000000..90a498eaa --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/java/org/bitcoin/NativeSecp256k1.java @@ -0,0 +1,60 @@ +package org.bitcoin; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import com.google.common.base.Preconditions; + + +/** + * This class holds native methods to handle ECDSA verification. + * You can find an example library that can be used for this at + * https://github.com/sipa/secp256k1 + */ +public class NativeSecp256k1 { + public static final boolean enabled; + static { + boolean isEnabled = true; + try { + System.loadLibrary("javasecp256k1"); + } catch (UnsatisfiedLinkError e) { + isEnabled = false; + } + enabled = isEnabled; + } + + private static ThreadLocal nativeECDSABuffer = new ThreadLocal(); + /** + * Verifies the given secp256k1 signature in native code. + * Calling when enabled == false is undefined (probably library not loaded) + * + * @param data The data which was signed, must be exactly 32 bytes + * @param signature The signature + * @param pub The public key which did the signing + */ + public static boolean verify(byte[] data, byte[] signature, byte[] pub) { + Preconditions.checkArgument(data.length == 32 && signature.length <= 520 && pub.length <= 520); + + ByteBuffer byteBuff = nativeECDSABuffer.get(); + if (byteBuff == null) { + byteBuff = ByteBuffer.allocateDirect(32 + 8 + 520 + 520); + byteBuff.order(ByteOrder.nativeOrder()); + nativeECDSABuffer.set(byteBuff); + } + byteBuff.rewind(); + byteBuff.put(data); + byteBuff.putInt(signature.length); + byteBuff.putInt(pub.length); + byteBuff.put(signature); + byteBuff.put(pub); + return secp256k1_ecdsa_verify(byteBuff) == 1; + } + + /** + * @param byteBuff signature format is byte[32] data, + * native-endian int signatureLength, native-endian int pubkeyLength, + * byte[signatureLength] signature, byte[pubkeyLength] pub + * @returns 1 for valid signature, anything else for invalid + */ + private static native int secp256k1_ecdsa_verify(ByteBuffer byteBuff); +} diff --git a/src/cryptoconditions/src/include/secp256k1/src/java/org_bitcoin_NativeSecp256k1.c b/src/cryptoconditions/src/include/secp256k1/src/java/org_bitcoin_NativeSecp256k1.c new file mode 100644 index 000000000..bb4cd7072 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/java/org_bitcoin_NativeSecp256k1.c @@ -0,0 +1,23 @@ +#include "org_bitcoin_NativeSecp256k1.h" +#include "include/secp256k1.h" + +JNIEXPORT jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1verify + (JNIEnv* env, jclass classObject, jobject byteBufferObject) +{ + unsigned char* data = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); + int sigLen = *((int*)(data + 32)); + int pubLen = *((int*)(data + 32 + 4)); + + return secp256k1_ecdsa_verify(data, 32, data+32+8, sigLen, data+32+8+sigLen, pubLen); +} + +static void __javasecp256k1_attach(void) __attribute__((constructor)); +static void __javasecp256k1_detach(void) __attribute__((destructor)); + +static void __javasecp256k1_attach(void) { + secp256k1_start(SECP256K1_START_VERIFY); +} + +static void __javasecp256k1_detach(void) { + secp256k1_stop(); +} diff --git a/src/cryptoconditions/src/include/secp256k1/src/java/org_bitcoin_NativeSecp256k1.h b/src/cryptoconditions/src/include/secp256k1/src/java/org_bitcoin_NativeSecp256k1.h new file mode 100644 index 000000000..d7fb004fa --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/java/org_bitcoin_NativeSecp256k1.h @@ -0,0 +1,21 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class org_bitcoin_NativeSecp256k1 */ + +#ifndef _Included_org_bitcoin_NativeSecp256k1 +#define _Included_org_bitcoin_NativeSecp256k1 +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_ecdsa_verify + * Signature: (Ljava/nio/ByteBuffer;)I + */ +JNIEXPORT jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1verify + (JNIEnv *, jclass, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/num.h b/src/cryptoconditions/src/include/secp256k1/src/num.h new file mode 100644 index 000000000..339b6bb6e --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/num.h @@ -0,0 +1,68 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_NUM_ +#define _SECP256K1_NUM_ + +#ifndef USE_NUM_NONE + +#if defined HAVE_CONFIG_H +#include "libsecp256k1-config.h" +#endif + +#if defined(USE_NUM_GMP) +#include "num_gmp.h" +#else +#error "Please select num implementation" +#endif + +/** Copy a number. */ +static void secp256k1_num_copy(secp256k1_num_t *r, const secp256k1_num_t *a); + +/** Convert a number's absolute value to a binary big-endian string. + * There must be enough place. */ +static void secp256k1_num_get_bin(unsigned char *r, unsigned int rlen, const secp256k1_num_t *a); + +/** Set a number to the value of a binary big-endian string. */ +static void secp256k1_num_set_bin(secp256k1_num_t *r, const unsigned char *a, unsigned int alen); + +/** Compute a modular inverse. The input must be less than the modulus. */ +static void secp256k1_num_mod_inverse(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *m); + +/** Compare the absolute value of two numbers. */ +static int secp256k1_num_cmp(const secp256k1_num_t *a, const secp256k1_num_t *b); + +/** Test whether two number are equal (including sign). */ +static int secp256k1_num_eq(const secp256k1_num_t *a, const secp256k1_num_t *b); + +/** Add two (signed) numbers. */ +static void secp256k1_num_add(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b); + +/** Subtract two (signed) numbers. */ +static void secp256k1_num_sub(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b); + +/** Multiply two (signed) numbers. */ +static void secp256k1_num_mul(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b); + +/** Replace a number by its remainder modulo m. M's sign is ignored. The result is a number between 0 and m-1, + even if r was negative. */ +static void secp256k1_num_mod(secp256k1_num_t *r, const secp256k1_num_t *m); + +/** Right-shift the passed number by bits bits. */ +static void secp256k1_num_shift(secp256k1_num_t *r, int bits); + +/** Check whether a number is zero. */ +static int secp256k1_num_is_zero(const secp256k1_num_t *a); + +/** Check whether a number is strictly negative. */ +static int secp256k1_num_is_neg(const secp256k1_num_t *a); + +/** Change a number's sign. */ +static void secp256k1_num_negate(secp256k1_num_t *r); + +#endif + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/num_gmp.h b/src/cryptoconditions/src/include/secp256k1/src/num_gmp.h new file mode 100644 index 000000000..baa1f2bf2 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/num_gmp.h @@ -0,0 +1,20 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_NUM_REPR_ +#define _SECP256K1_NUM_REPR_ + +#include + +#define NUM_LIMBS ((256+GMP_NUMB_BITS-1)/GMP_NUMB_BITS) + +typedef struct { + mp_limb_t data[2*NUM_LIMBS]; + int neg; + int limbs; +} secp256k1_num_t; + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/num_gmp_impl.h b/src/cryptoconditions/src/include/secp256k1/src/num_gmp_impl.h new file mode 100644 index 000000000..dbbc458d5 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/num_gmp_impl.h @@ -0,0 +1,260 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_NUM_REPR_IMPL_H_ +#define _SECP256K1_NUM_REPR_IMPL_H_ + +#include +#include +#include + +#include "util.h" +#include "num.h" + +#ifdef VERIFY +static void secp256k1_num_sanity(const secp256k1_num_t *a) { + VERIFY_CHECK(a->limbs == 1 || (a->limbs > 1 && a->data[a->limbs-1] != 0)); +} +#else +#define secp256k1_num_sanity(a) do { } while(0) +#endif + +static void secp256k1_num_copy(secp256k1_num_t *r, const secp256k1_num_t *a) { + *r = *a; +} + +static void secp256k1_num_get_bin(unsigned char *r, unsigned int rlen, const secp256k1_num_t *a) { + unsigned char tmp[65]; + int len = 0; + int shift = 0; + if (a->limbs>1 || a->data[0] != 0) { + len = mpn_get_str(tmp, 256, (mp_limb_t*)a->data, a->limbs); + } + while (shift < len && tmp[shift] == 0) shift++; + VERIFY_CHECK(len-shift <= (int)rlen); + memset(r, 0, rlen - len + shift); + if (len > shift) { + memcpy(r + rlen - len + shift, tmp + shift, len - shift); + } + memset(tmp, 0, sizeof(tmp)); +} + +static void secp256k1_num_set_bin(secp256k1_num_t *r, const unsigned char *a, unsigned int alen) { + int len; + VERIFY_CHECK(alen > 0); + VERIFY_CHECK(alen <= 64); + len = mpn_set_str(r->data, a, alen, 256); + if (len == 0) { + r->data[0] = 0; + len = 1; + } + VERIFY_CHECK(len <= NUM_LIMBS*2); + r->limbs = len; + r->neg = 0; + while (r->limbs > 1 && r->data[r->limbs-1]==0) { + r->limbs--; + } +} + +static void secp256k1_num_add_abs(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b) { + mp_limb_t c = mpn_add(r->data, a->data, a->limbs, b->data, b->limbs); + r->limbs = a->limbs; + if (c != 0) { + VERIFY_CHECK(r->limbs < 2*NUM_LIMBS); + r->data[r->limbs++] = c; + } +} + +static void secp256k1_num_sub_abs(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b) { + mp_limb_t c = mpn_sub(r->data, a->data, a->limbs, b->data, b->limbs); + VERIFY_CHECK(c == 0); + r->limbs = a->limbs; + while (r->limbs > 1 && r->data[r->limbs-1]==0) { + r->limbs--; + } +} + +static void secp256k1_num_mod(secp256k1_num_t *r, const secp256k1_num_t *m) { + secp256k1_num_sanity(r); + secp256k1_num_sanity(m); + + if (r->limbs >= m->limbs) { + mp_limb_t t[2*NUM_LIMBS]; + mpn_tdiv_qr(t, r->data, 0, r->data, r->limbs, m->data, m->limbs); + memset(t, 0, sizeof(t)); + r->limbs = m->limbs; + while (r->limbs > 1 && r->data[r->limbs-1]==0) { + r->limbs--; + } + } + + if (r->neg && (r->limbs > 1 || r->data[0] != 0)) { + secp256k1_num_sub_abs(r, m, r); + r->neg = 0; + } +} + +static void secp256k1_num_mod_inverse(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *m) { + int i; + mp_limb_t g[NUM_LIMBS+1]; + mp_limb_t u[NUM_LIMBS+1]; + mp_limb_t v[NUM_LIMBS+1]; + mp_size_t sn; + mp_size_t gn; + secp256k1_num_sanity(a); + secp256k1_num_sanity(m); + + /** mpn_gcdext computes: (G,S) = gcdext(U,V), where + * * G = gcd(U,V) + * * G = U*S + V*T + * * U has equal or more limbs than V, and V has no padding + * If we set U to be (a padded version of) a, and V = m: + * G = a*S + m*T + * G = a*S mod m + * Assuming G=1: + * S = 1/a mod m + */ + VERIFY_CHECK(m->limbs <= NUM_LIMBS); + VERIFY_CHECK(m->data[m->limbs-1] != 0); + for (i = 0; i < m->limbs; i++) { + u[i] = (i < a->limbs) ? a->data[i] : 0; + v[i] = m->data[i]; + } + sn = NUM_LIMBS+1; + gn = mpn_gcdext(g, r->data, &sn, u, m->limbs, v, m->limbs); + VERIFY_CHECK(gn == 1); + VERIFY_CHECK(g[0] == 1); + r->neg = a->neg ^ m->neg; + if (sn < 0) { + mpn_sub(r->data, m->data, m->limbs, r->data, -sn); + r->limbs = m->limbs; + while (r->limbs > 1 && r->data[r->limbs-1]==0) { + r->limbs--; + } + } else { + r->limbs = sn; + } + memset(g, 0, sizeof(g)); + memset(u, 0, sizeof(u)); + memset(v, 0, sizeof(v)); +} + +static int secp256k1_num_is_zero(const secp256k1_num_t *a) { + return (a->limbs == 1 && a->data[0] == 0); +} + +static int secp256k1_num_is_neg(const secp256k1_num_t *a) { + return (a->limbs > 1 || a->data[0] != 0) && a->neg; +} + +static int secp256k1_num_cmp(const secp256k1_num_t *a, const secp256k1_num_t *b) { + if (a->limbs > b->limbs) { + return 1; + } + if (a->limbs < b->limbs) { + return -1; + } + return mpn_cmp(a->data, b->data, a->limbs); +} + +static int secp256k1_num_eq(const secp256k1_num_t *a, const secp256k1_num_t *b) { + if (a->limbs > b->limbs) { + return 0; + } + if (a->limbs < b->limbs) { + return 0; + } + if ((a->neg && !secp256k1_num_is_zero(a)) != (b->neg && !secp256k1_num_is_zero(b))) { + return 0; + } + return mpn_cmp(a->data, b->data, a->limbs) == 0; +} + +static void secp256k1_num_subadd(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b, int bneg) { + if (!(b->neg ^ bneg ^ a->neg)) { /* a and b have the same sign */ + r->neg = a->neg; + if (a->limbs >= b->limbs) { + secp256k1_num_add_abs(r, a, b); + } else { + secp256k1_num_add_abs(r, b, a); + } + } else { + if (secp256k1_num_cmp(a, b) > 0) { + r->neg = a->neg; + secp256k1_num_sub_abs(r, a, b); + } else { + r->neg = b->neg ^ bneg; + secp256k1_num_sub_abs(r, b, a); + } + } +} + +static void secp256k1_num_add(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b) { + secp256k1_num_sanity(a); + secp256k1_num_sanity(b); + secp256k1_num_subadd(r, a, b, 0); +} + +static void secp256k1_num_sub(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b) { + secp256k1_num_sanity(a); + secp256k1_num_sanity(b); + secp256k1_num_subadd(r, a, b, 1); +} + +static void secp256k1_num_mul(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b) { + mp_limb_t tmp[2*NUM_LIMBS+1]; + secp256k1_num_sanity(a); + secp256k1_num_sanity(b); + + VERIFY_CHECK(a->limbs + b->limbs <= 2*NUM_LIMBS+1); + if ((a->limbs==1 && a->data[0]==0) || (b->limbs==1 && b->data[0]==0)) { + r->limbs = 1; + r->neg = 0; + r->data[0] = 0; + return; + } + if (a->limbs >= b->limbs) { + mpn_mul(tmp, a->data, a->limbs, b->data, b->limbs); + } else { + mpn_mul(tmp, b->data, b->limbs, a->data, a->limbs); + } + r->limbs = a->limbs + b->limbs; + if (r->limbs > 1 && tmp[r->limbs - 1]==0) { + r->limbs--; + } + VERIFY_CHECK(r->limbs <= 2*NUM_LIMBS); + mpn_copyi(r->data, tmp, r->limbs); + r->neg = a->neg ^ b->neg; + memset(tmp, 0, sizeof(tmp)); +} + +static void secp256k1_num_shift(secp256k1_num_t *r, int bits) { + int i; + if (bits % GMP_NUMB_BITS) { + /* Shift within limbs. */ + mpn_rshift(r->data, r->data, r->limbs, bits % GMP_NUMB_BITS); + } + if (bits >= GMP_NUMB_BITS) { + /* Shift full limbs. */ + for (i = 0; i < r->limbs; i++) { + int index = i + (bits / GMP_NUMB_BITS); + if (index < r->limbs && index < 2*NUM_LIMBS) { + r->data[i] = r->data[index]; + } else { + r->data[i] = 0; + } + } + } + while (r->limbs>1 && r->data[r->limbs-1]==0) { + r->limbs--; + } +} + +static void secp256k1_num_negate(secp256k1_num_t *r) { + r->neg ^= 1; +} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/num_impl.h b/src/cryptoconditions/src/include/secp256k1/src/num_impl.h new file mode 100644 index 000000000..0b0e3a072 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/num_impl.h @@ -0,0 +1,24 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_NUM_IMPL_H_ +#define _SECP256K1_NUM_IMPL_H_ + +#if defined HAVE_CONFIG_H +#include "libsecp256k1-config.h" +#endif + +#include "num.h" + +#if defined(USE_NUM_GMP) +#include "num_gmp_impl.h" +#elif defined(USE_NUM_NONE) +/* Nothing. */ +#else +#error "Please select num implementation" +#endif + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/scalar.h b/src/cryptoconditions/src/include/secp256k1/src/scalar.h new file mode 100644 index 000000000..f5d09f8d4 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/scalar.h @@ -0,0 +1,93 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_SCALAR_ +#define _SECP256K1_SCALAR_ + +#include "num.h" + +#if defined HAVE_CONFIG_H +#include "libsecp256k1-config.h" +#endif + +#if defined(USE_SCALAR_4X64) +#include "scalar_4x64.h" +#elif defined(USE_SCALAR_8X32) +#include "scalar_8x32.h" +#else +#error "Please select scalar implementation" +#endif + +/** Clear a scalar to prevent the leak of sensitive data. */ +static void secp256k1_scalar_clear(secp256k1_scalar_t *r); + +/** Access bits from a scalar. All requested bits must belong to the same 32-bit limb. */ +static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar_t *a, unsigned int offset, unsigned int count); + +/** Access bits from a scalar. Not constant time. */ +static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar_t *a, unsigned int offset, unsigned int count); + +/** Set a scalar from a big endian byte array. */ +static void secp256k1_scalar_set_b32(secp256k1_scalar_t *r, const unsigned char *bin, int *overflow); + +/** Set a scalar to an unsigned integer. */ +static void secp256k1_scalar_set_int(secp256k1_scalar_t *r, unsigned int v); + +/** Convert a scalar to a byte array. */ +static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar_t* a); + +/** Add two scalars together (modulo the group order). Returns whether it overflowed. */ +static int secp256k1_scalar_add(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b); + +/** Add a power of two to a scalar. The result is not allowed to overflow. */ +static void secp256k1_scalar_add_bit(secp256k1_scalar_t *r, unsigned int bit); + +/** Multiply two scalars (modulo the group order). */ +static void secp256k1_scalar_mul(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b); + +/** Compute the square of a scalar (modulo the group order). */ +static void secp256k1_scalar_sqr(secp256k1_scalar_t *r, const secp256k1_scalar_t *a); + +/** Compute the inverse of a scalar (modulo the group order). */ +static void secp256k1_scalar_inverse(secp256k1_scalar_t *r, const secp256k1_scalar_t *a); + +/** Compute the inverse of a scalar (modulo the group order), without constant-time guarantee. */ +static void secp256k1_scalar_inverse_var(secp256k1_scalar_t *r, const secp256k1_scalar_t *a); + +/** Compute the complement of a scalar (modulo the group order). */ +static void secp256k1_scalar_negate(secp256k1_scalar_t *r, const secp256k1_scalar_t *a); + +/** Check whether a scalar equals zero. */ +static int secp256k1_scalar_is_zero(const secp256k1_scalar_t *a); + +/** Check whether a scalar equals one. */ +static int secp256k1_scalar_is_one(const secp256k1_scalar_t *a); + +/** Check whether a scalar is higher than the group order divided by 2. */ +static int secp256k1_scalar_is_high(const secp256k1_scalar_t *a); + +#ifndef USE_NUM_NONE +/** Convert a scalar to a number. */ +static void secp256k1_scalar_get_num(secp256k1_num_t *r, const secp256k1_scalar_t *a); + +/** Get the order of the group as a number. */ +static void secp256k1_scalar_order_get_num(secp256k1_num_t *r); +#endif + +/** Compare two scalars. */ +static int secp256k1_scalar_eq(const secp256k1_scalar_t *a, const secp256k1_scalar_t *b); + +#ifdef USE_ENDOMORPHISM +/** Find r1 and r2 such that r1+r2*2^128 = a. */ +static void secp256k1_scalar_split_128(secp256k1_scalar_t *r1, secp256k1_scalar_t *r2, const secp256k1_scalar_t *a); +/** Find r1 and r2 such that r1+r2*lambda = a, and r1 and r2 are maximum 128 bits long (see secp256k1_gej_mul_lambda). */ +static void secp256k1_scalar_split_lambda_var(secp256k1_scalar_t *r1, secp256k1_scalar_t *r2, const secp256k1_scalar_t *a); +#endif + +/** Multiply a and b (without taking the modulus!), divide by 2**shift, and round to the nearest integer. Shift must be at least 256. */ +static void secp256k1_scalar_mul_shift_var(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b, unsigned int shift); + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/scalar_4x64.h b/src/cryptoconditions/src/include/secp256k1/src/scalar_4x64.h new file mode 100644 index 000000000..82899aa7b --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/scalar_4x64.h @@ -0,0 +1,19 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_SCALAR_REPR_ +#define _SECP256K1_SCALAR_REPR_ + +#include + +/** A scalar modulo the group order of the secp256k1 curve. */ +typedef struct { + uint64_t d[4]; +} secp256k1_scalar_t; + +#define SECP256K1_SCALAR_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{((uint64_t)(d1)) << 32 | (d0), ((uint64_t)(d3)) << 32 | (d2), ((uint64_t)(d5)) << 32 | (d4), ((uint64_t)(d7)) << 32 | (d6)}} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/scalar_4x64_impl.h b/src/cryptoconditions/src/include/secp256k1/src/scalar_4x64_impl.h new file mode 100644 index 000000000..ff365292f --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/scalar_4x64_impl.h @@ -0,0 +1,920 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_SCALAR_REPR_IMPL_H_ +#define _SECP256K1_SCALAR_REPR_IMPL_H_ + +/* Limbs of the secp256k1 order. */ +#define SECP256K1_N_0 ((uint64_t)0xBFD25E8CD0364141ULL) +#define SECP256K1_N_1 ((uint64_t)0xBAAEDCE6AF48A03BULL) +#define SECP256K1_N_2 ((uint64_t)0xFFFFFFFFFFFFFFFEULL) +#define SECP256K1_N_3 ((uint64_t)0xFFFFFFFFFFFFFFFFULL) + +/* Limbs of 2^256 minus the secp256k1 order. */ +#define SECP256K1_N_C_0 (~SECP256K1_N_0 + 1) +#define SECP256K1_N_C_1 (~SECP256K1_N_1) +#define SECP256K1_N_C_2 (1) + +/* Limbs of half the secp256k1 order. */ +#define SECP256K1_N_H_0 ((uint64_t)0xDFE92F46681B20A0ULL) +#define SECP256K1_N_H_1 ((uint64_t)0x5D576E7357A4501DULL) +#define SECP256K1_N_H_2 ((uint64_t)0xFFFFFFFFFFFFFFFFULL) +#define SECP256K1_N_H_3 ((uint64_t)0x7FFFFFFFFFFFFFFFULL) + +SECP256K1_INLINE static void secp256k1_scalar_clear(secp256k1_scalar_t *r) { + r->d[0] = 0; + r->d[1] = 0; + r->d[2] = 0; + r->d[3] = 0; +} + +SECP256K1_INLINE static void secp256k1_scalar_set_int(secp256k1_scalar_t *r, unsigned int v) { + r->d[0] = v; + r->d[1] = 0; + r->d[2] = 0; + r->d[3] = 0; +} + +SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar_t *a, unsigned int offset, unsigned int count) { + VERIFY_CHECK((offset + count - 1) >> 6 == offset >> 6); + return (a->d[offset >> 6] >> (offset & 0x3F)) & ((((uint64_t)1) << count) - 1); +} + +SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar_t *a, unsigned int offset, unsigned int count) { + VERIFY_CHECK(count < 32); + VERIFY_CHECK(offset + count <= 256); + if ((offset + count - 1) >> 6 == offset >> 6) { + return secp256k1_scalar_get_bits(a, offset, count); + } else { + VERIFY_CHECK((offset >> 6) + 1 < 4); + return ((a->d[offset >> 6] >> (offset & 0x3F)) | (a->d[(offset >> 6) + 1] << (64 - (offset & 0x3F)))) & ((((uint64_t)1) << count) - 1); + } +} + +SECP256K1_INLINE static int secp256k1_scalar_check_overflow(const secp256k1_scalar_t *a) { + int yes = 0; + int no = 0; + no |= (a->d[3] < SECP256K1_N_3); /* No need for a > check. */ + no |= (a->d[2] < SECP256K1_N_2); + yes |= (a->d[2] > SECP256K1_N_2) & ~no; + no |= (a->d[1] < SECP256K1_N_1); + yes |= (a->d[1] > SECP256K1_N_1) & ~no; + yes |= (a->d[0] >= SECP256K1_N_0) & ~no; + return yes; +} + +SECP256K1_INLINE static int secp256k1_scalar_reduce(secp256k1_scalar_t *r, unsigned int overflow) { + uint128_t t; + VERIFY_CHECK(overflow <= 1); + t = (uint128_t)r->d[0] + overflow * SECP256K1_N_C_0; + r->d[0] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + t += (uint128_t)r->d[1] + overflow * SECP256K1_N_C_1; + r->d[1] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + t += (uint128_t)r->d[2] + overflow * SECP256K1_N_C_2; + r->d[2] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + t += (uint64_t)r->d[3]; + r->d[3] = t & 0xFFFFFFFFFFFFFFFFULL; + return overflow; +} + +static int secp256k1_scalar_add(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { + int overflow; + uint128_t t = (uint128_t)a->d[0] + b->d[0]; + r->d[0] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + t += (uint128_t)a->d[1] + b->d[1]; + r->d[1] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + t += (uint128_t)a->d[2] + b->d[2]; + r->d[2] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + t += (uint128_t)a->d[3] + b->d[3]; + r->d[3] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + overflow = t + secp256k1_scalar_check_overflow(r); + VERIFY_CHECK(overflow == 0 || overflow == 1); + secp256k1_scalar_reduce(r, overflow); + return overflow; +} + +static void secp256k1_scalar_add_bit(secp256k1_scalar_t *r, unsigned int bit) { + uint128_t t; + VERIFY_CHECK(bit < 256); + t = (uint128_t)r->d[0] + (((uint64_t)((bit >> 6) == 0)) << (bit & 0x3F)); + r->d[0] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + t += (uint128_t)r->d[1] + (((uint64_t)((bit >> 6) == 1)) << (bit & 0x3F)); + r->d[1] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + t += (uint128_t)r->d[2] + (((uint64_t)((bit >> 6) == 2)) << (bit & 0x3F)); + r->d[2] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + t += (uint128_t)r->d[3] + (((uint64_t)((bit >> 6) == 3)) << (bit & 0x3F)); + r->d[3] = t & 0xFFFFFFFFFFFFFFFFULL; +#ifdef VERIFY + VERIFY_CHECK((t >> 64) == 0); + VERIFY_CHECK(secp256k1_scalar_check_overflow(r) == 0); +#endif +} + +static void secp256k1_scalar_set_b32(secp256k1_scalar_t *r, const unsigned char *b32, int *overflow) { + int over; + r->d[0] = (uint64_t)b32[31] | (uint64_t)b32[30] << 8 | (uint64_t)b32[29] << 16 | (uint64_t)b32[28] << 24 | (uint64_t)b32[27] << 32 | (uint64_t)b32[26] << 40 | (uint64_t)b32[25] << 48 | (uint64_t)b32[24] << 56; + r->d[1] = (uint64_t)b32[23] | (uint64_t)b32[22] << 8 | (uint64_t)b32[21] << 16 | (uint64_t)b32[20] << 24 | (uint64_t)b32[19] << 32 | (uint64_t)b32[18] << 40 | (uint64_t)b32[17] << 48 | (uint64_t)b32[16] << 56; + r->d[2] = (uint64_t)b32[15] | (uint64_t)b32[14] << 8 | (uint64_t)b32[13] << 16 | (uint64_t)b32[12] << 24 | (uint64_t)b32[11] << 32 | (uint64_t)b32[10] << 40 | (uint64_t)b32[9] << 48 | (uint64_t)b32[8] << 56; + r->d[3] = (uint64_t)b32[7] | (uint64_t)b32[6] << 8 | (uint64_t)b32[5] << 16 | (uint64_t)b32[4] << 24 | (uint64_t)b32[3] << 32 | (uint64_t)b32[2] << 40 | (uint64_t)b32[1] << 48 | (uint64_t)b32[0] << 56; + over = secp256k1_scalar_reduce(r, secp256k1_scalar_check_overflow(r)); + if (overflow) { + *overflow = over; + } +} + +static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar_t* a) { + bin[0] = a->d[3] >> 56; bin[1] = a->d[3] >> 48; bin[2] = a->d[3] >> 40; bin[3] = a->d[3] >> 32; bin[4] = a->d[3] >> 24; bin[5] = a->d[3] >> 16; bin[6] = a->d[3] >> 8; bin[7] = a->d[3]; + bin[8] = a->d[2] >> 56; bin[9] = a->d[2] >> 48; bin[10] = a->d[2] >> 40; bin[11] = a->d[2] >> 32; bin[12] = a->d[2] >> 24; bin[13] = a->d[2] >> 16; bin[14] = a->d[2] >> 8; bin[15] = a->d[2]; + bin[16] = a->d[1] >> 56; bin[17] = a->d[1] >> 48; bin[18] = a->d[1] >> 40; bin[19] = a->d[1] >> 32; bin[20] = a->d[1] >> 24; bin[21] = a->d[1] >> 16; bin[22] = a->d[1] >> 8; bin[23] = a->d[1]; + bin[24] = a->d[0] >> 56; bin[25] = a->d[0] >> 48; bin[26] = a->d[0] >> 40; bin[27] = a->d[0] >> 32; bin[28] = a->d[0] >> 24; bin[29] = a->d[0] >> 16; bin[30] = a->d[0] >> 8; bin[31] = a->d[0]; +} + +SECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar_t *a) { + return (a->d[0] | a->d[1] | a->d[2] | a->d[3]) == 0; +} + +static void secp256k1_scalar_negate(secp256k1_scalar_t *r, const secp256k1_scalar_t *a) { + uint64_t nonzero = 0xFFFFFFFFFFFFFFFFULL * (secp256k1_scalar_is_zero(a) == 0); + uint128_t t = (uint128_t)(~a->d[0]) + SECP256K1_N_0 + 1; + r->d[0] = t & nonzero; t >>= 64; + t += (uint128_t)(~a->d[1]) + SECP256K1_N_1; + r->d[1] = t & nonzero; t >>= 64; + t += (uint128_t)(~a->d[2]) + SECP256K1_N_2; + r->d[2] = t & nonzero; t >>= 64; + t += (uint128_t)(~a->d[3]) + SECP256K1_N_3; + r->d[3] = t & nonzero; +} + +SECP256K1_INLINE static int secp256k1_scalar_is_one(const secp256k1_scalar_t *a) { + return ((a->d[0] ^ 1) | a->d[1] | a->d[2] | a->d[3]) == 0; +} + +static int secp256k1_scalar_is_high(const secp256k1_scalar_t *a) { + int yes = 0; + int no = 0; + no |= (a->d[3] < SECP256K1_N_H_3); + yes |= (a->d[3] > SECP256K1_N_H_3) & ~no; + no |= (a->d[2] < SECP256K1_N_H_2) & ~yes; /* No need for a > check. */ + no |= (a->d[1] < SECP256K1_N_H_1) & ~yes; + yes |= (a->d[1] > SECP256K1_N_H_1) & ~no; + yes |= (a->d[0] > SECP256K1_N_H_0) & ~no; + return yes; +} + +/* Inspired by the macros in OpenSSL's crypto/bn/asm/x86_64-gcc.c. */ + +/** Add a*b to the number defined by (c0,c1,c2). c2 must never overflow. */ +#define muladd(a,b) { \ + uint64_t tl, th; \ + { \ + uint128_t t = (uint128_t)a * b; \ + th = t >> 64; /* at most 0xFFFFFFFFFFFFFFFE */ \ + tl = t; \ + } \ + c0 += tl; /* overflow is handled on the next line */ \ + th += (c0 < tl) ? 1 : 0; /* at most 0xFFFFFFFFFFFFFFFF */ \ + c1 += th; /* overflow is handled on the next line */ \ + c2 += (c1 < th) ? 1 : 0; /* never overflows by contract (verified in the next line) */ \ + VERIFY_CHECK((c1 >= th) || (c2 != 0)); \ +} + +/** Add a*b to the number defined by (c0,c1). c1 must never overflow. */ +#define muladd_fast(a,b) { \ + uint64_t tl, th; \ + { \ + uint128_t t = (uint128_t)a * b; \ + th = t >> 64; /* at most 0xFFFFFFFFFFFFFFFE */ \ + tl = t; \ + } \ + c0 += tl; /* overflow is handled on the next line */ \ + th += (c0 < tl) ? 1 : 0; /* at most 0xFFFFFFFFFFFFFFFF */ \ + c1 += th; /* never overflows by contract (verified in the next line) */ \ + VERIFY_CHECK(c1 >= th); \ +} + +/** Add 2*a*b to the number defined by (c0,c1,c2). c2 must never overflow. */ +#define muladd2(a,b) { \ + uint64_t tl, th, th2, tl2; \ + { \ + uint128_t t = (uint128_t)a * b; \ + th = t >> 64; /* at most 0xFFFFFFFFFFFFFFFE */ \ + tl = t; \ + } \ + th2 = th + th; /* at most 0xFFFFFFFFFFFFFFFE (in case th was 0x7FFFFFFFFFFFFFFF) */ \ + c2 += (th2 < th) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ + VERIFY_CHECK((th2 >= th) || (c2 != 0)); \ + tl2 = tl + tl; /* at most 0xFFFFFFFFFFFFFFFE (in case the lowest 63 bits of tl were 0x7FFFFFFFFFFFFFFF) */ \ + th2 += (tl2 < tl) ? 1 : 0; /* at most 0xFFFFFFFFFFFFFFFF */ \ + c0 += tl2; /* overflow is handled on the next line */ \ + th2 += (c0 < tl2) ? 1 : 0; /* second overflow is handled on the next line */ \ + c2 += (c0 < tl2) & (th2 == 0); /* never overflows by contract (verified the next line) */ \ + VERIFY_CHECK((c0 >= tl2) || (th2 != 0) || (c2 != 0)); \ + c1 += th2; /* overflow is handled on the next line */ \ + c2 += (c1 < th2) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ + VERIFY_CHECK((c1 >= th2) || (c2 != 0)); \ +} + +/** Add a to the number defined by (c0,c1,c2). c2 must never overflow. */ +#define sumadd(a) { \ + unsigned int over; \ + c0 += (a); /* overflow is handled on the next line */ \ + over = (c0 < (a)) ? 1 : 0; \ + c1 += over; /* overflow is handled on the next line */ \ + c2 += (c1 < over) ? 1 : 0; /* never overflows by contract */ \ +} + +/** Add a to the number defined by (c0,c1). c1 must never overflow, c2 must be zero. */ +#define sumadd_fast(a) { \ + c0 += (a); /* overflow is handled on the next line */ \ + c1 += (c0 < (a)) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ + VERIFY_CHECK((c1 != 0) | (c0 >= (a))); \ + VERIFY_CHECK(c2 == 0); \ +} + +/** Extract the lowest 64 bits of (c0,c1,c2) into n, and left shift the number 64 bits. */ +#define extract(n) { \ + (n) = c0; \ + c0 = c1; \ + c1 = c2; \ + c2 = 0; \ +} + +/** Extract the lowest 64 bits of (c0,c1,c2) into n, and left shift the number 64 bits. c2 is required to be zero. */ +#define extract_fast(n) { \ + (n) = c0; \ + c0 = c1; \ + c1 = 0; \ + VERIFY_CHECK(c2 == 0); \ +} + +static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint64_t *l) { +#ifdef USE_ASM_X86_64 + /* Reduce 512 bits into 385. */ + uint64_t m0, m1, m2, m3, m4, m5, m6; + uint64_t p0, p1, p2, p3, p4; + uint64_t c; + + __asm__ __volatile__( + /* Preload. */ + "movq 32(%%rsi), %%r11\n" + "movq 40(%%rsi), %%r12\n" + "movq 48(%%rsi), %%r13\n" + "movq 56(%%rsi), %%r14\n" + /* Initialize r8,r9,r10 */ + "movq 0(%%rsi), %%r8\n" + "movq $0, %%r9\n" + "movq $0, %%r10\n" + /* (r8,r9) += n0 * c0 */ + "movq %8, %%rax\n" + "mulq %%r11\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + /* extract m0 */ + "movq %%r8, %q0\n" + "movq $0, %%r8\n" + /* (r9,r10) += l1 */ + "addq 8(%%rsi), %%r9\n" + "adcq $0, %%r10\n" + /* (r9,r10,r8) += n1 * c0 */ + "movq %8, %%rax\n" + "mulq %%r12\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* (r9,r10,r8) += n0 * c1 */ + "movq %9, %%rax\n" + "mulq %%r11\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* extract m1 */ + "movq %%r9, %q1\n" + "movq $0, %%r9\n" + /* (r10,r8,r9) += l2 */ + "addq 16(%%rsi), %%r10\n" + "adcq $0, %%r8\n" + "adcq $0, %%r9\n" + /* (r10,r8,r9) += n2 * c0 */ + "movq %8, %%rax\n" + "mulq %%r13\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + /* (r10,r8,r9) += n1 * c1 */ + "movq %9, %%rax\n" + "mulq %%r12\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + /* (r10,r8,r9) += n0 */ + "addq %%r11, %%r10\n" + "adcq $0, %%r8\n" + "adcq $0, %%r9\n" + /* extract m2 */ + "movq %%r10, %q2\n" + "movq $0, %%r10\n" + /* (r8,r9,r10) += l3 */ + "addq 24(%%rsi), %%r8\n" + "adcq $0, %%r9\n" + "adcq $0, %%r10\n" + /* (r8,r9,r10) += n3 * c0 */ + "movq %8, %%rax\n" + "mulq %%r14\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + /* (r8,r9,r10) += n2 * c1 */ + "movq %9, %%rax\n" + "mulq %%r13\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + /* (r8,r9,r10) += n1 */ + "addq %%r12, %%r8\n" + "adcq $0, %%r9\n" + "adcq $0, %%r10\n" + /* extract m3 */ + "movq %%r8, %q3\n" + "movq $0, %%r8\n" + /* (r9,r10,r8) += n3 * c1 */ + "movq %9, %%rax\n" + "mulq %%r14\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* (r9,r10,r8) += n2 */ + "addq %%r13, %%r9\n" + "adcq $0, %%r10\n" + "adcq $0, %%r8\n" + /* extract m4 */ + "movq %%r9, %q4\n" + /* (r10,r8) += n3 */ + "addq %%r14, %%r10\n" + "adcq $0, %%r8\n" + /* extract m5 */ + "movq %%r10, %q5\n" + /* extract m6 */ + "movq %%r8, %q6\n" + : "=g"(m0), "=g"(m1), "=g"(m2), "=g"(m3), "=g"(m4), "=g"(m5), "=g"(m6) + : "S"(l), "n"(SECP256K1_N_C_0), "n"(SECP256K1_N_C_1) + : "rax", "rdx", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "cc"); + + /* Reduce 385 bits into 258. */ + __asm__ __volatile__( + /* Preload */ + "movq %q9, %%r11\n" + "movq %q10, %%r12\n" + "movq %q11, %%r13\n" + /* Initialize (r8,r9,r10) */ + "movq %q5, %%r8\n" + "movq $0, %%r9\n" + "movq $0, %%r10\n" + /* (r8,r9) += m4 * c0 */ + "movq %12, %%rax\n" + "mulq %%r11\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + /* extract p0 */ + "movq %%r8, %q0\n" + "movq $0, %%r8\n" + /* (r9,r10) += m1 */ + "addq %q6, %%r9\n" + "adcq $0, %%r10\n" + /* (r9,r10,r8) += m5 * c0 */ + "movq %12, %%rax\n" + "mulq %%r12\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* (r9,r10,r8) += m4 * c1 */ + "movq %13, %%rax\n" + "mulq %%r11\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* extract p1 */ + "movq %%r9, %q1\n" + "movq $0, %%r9\n" + /* (r10,r8,r9) += m2 */ + "addq %q7, %%r10\n" + "adcq $0, %%r8\n" + "adcq $0, %%r9\n" + /* (r10,r8,r9) += m6 * c0 */ + "movq %12, %%rax\n" + "mulq %%r13\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + /* (r10,r8,r9) += m5 * c1 */ + "movq %13, %%rax\n" + "mulq %%r12\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + /* (r10,r8,r9) += m4 */ + "addq %%r11, %%r10\n" + "adcq $0, %%r8\n" + "adcq $0, %%r9\n" + /* extract p2 */ + "movq %%r10, %q2\n" + /* (r8,r9) += m3 */ + "addq %q8, %%r8\n" + "adcq $0, %%r9\n" + /* (r8,r9) += m6 * c1 */ + "movq %13, %%rax\n" + "mulq %%r13\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + /* (r8,r9) += m5 */ + "addq %%r12, %%r8\n" + "adcq $0, %%r9\n" + /* extract p3 */ + "movq %%r8, %q3\n" + /* (r9) += m6 */ + "addq %%r13, %%r9\n" + /* extract p4 */ + "movq %%r9, %q4\n" + : "=&g"(p0), "=&g"(p1), "=&g"(p2), "=g"(p3), "=g"(p4) + : "g"(m0), "g"(m1), "g"(m2), "g"(m3), "g"(m4), "g"(m5), "g"(m6), "n"(SECP256K1_N_C_0), "n"(SECP256K1_N_C_1) + : "rax", "rdx", "r8", "r9", "r10", "r11", "r12", "r13", "cc"); + + /* Reduce 258 bits into 256. */ + __asm__ __volatile__( + /* Preload */ + "movq %q5, %%r10\n" + /* (rax,rdx) = p4 * c0 */ + "movq %7, %%rax\n" + "mulq %%r10\n" + /* (rax,rdx) += p0 */ + "addq %q1, %%rax\n" + "adcq $0, %%rdx\n" + /* extract r0 */ + "movq %%rax, 0(%q6)\n" + /* Move to (r8,r9) */ + "movq %%rdx, %%r8\n" + "movq $0, %%r9\n" + /* (r8,r9) += p1 */ + "addq %q2, %%r8\n" + "adcq $0, %%r9\n" + /* (r8,r9) += p4 * c1 */ + "movq %8, %%rax\n" + "mulq %%r10\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + /* Extract r1 */ + "movq %%r8, 8(%q6)\n" + "movq $0, %%r8\n" + /* (r9,r8) += p4 */ + "addq %%r10, %%r9\n" + "adcq $0, %%r8\n" + /* (r9,r8) += p2 */ + "addq %q3, %%r9\n" + "adcq $0, %%r8\n" + /* Extract r2 */ + "movq %%r9, 16(%q6)\n" + "movq $0, %%r9\n" + /* (r8,r9) += p3 */ + "addq %q4, %%r8\n" + "adcq $0, %%r9\n" + /* Extract r3 */ + "movq %%r8, 24(%q6)\n" + /* Extract c */ + "movq %%r9, %q0\n" + : "=g"(c) + : "g"(p0), "g"(p1), "g"(p2), "g"(p3), "g"(p4), "D"(r), "n"(SECP256K1_N_C_0), "n"(SECP256K1_N_C_1) + : "rax", "rdx", "r8", "r9", "r10", "cc", "memory"); +#else + uint128_t c; + uint64_t c0, c1, c2; + uint64_t n0 = l[4], n1 = l[5], n2 = l[6], n3 = l[7]; + uint64_t m0, m1, m2, m3, m4, m5; + uint32_t m6; + uint64_t p0, p1, p2, p3; + uint32_t p4; + + /* Reduce 512 bits into 385. */ + /* m[0..6] = l[0..3] + n[0..3] * SECP256K1_N_C. */ + c0 = l[0]; c1 = 0; c2 = 0; + muladd_fast(n0, SECP256K1_N_C_0); + extract_fast(m0); + sumadd_fast(l[1]); + muladd(n1, SECP256K1_N_C_0); + muladd(n0, SECP256K1_N_C_1); + extract(m1); + sumadd(l[2]); + muladd(n2, SECP256K1_N_C_0); + muladd(n1, SECP256K1_N_C_1); + sumadd(n0); + extract(m2); + sumadd(l[3]); + muladd(n3, SECP256K1_N_C_0); + muladd(n2, SECP256K1_N_C_1); + sumadd(n1); + extract(m3); + muladd(n3, SECP256K1_N_C_1); + sumadd(n2); + extract(m4); + sumadd_fast(n3); + extract_fast(m5); + VERIFY_CHECK(c0 <= 1); + m6 = c0; + + /* Reduce 385 bits into 258. */ + /* p[0..4] = m[0..3] + m[4..6] * SECP256K1_N_C. */ + c0 = m0; c1 = 0; c2 = 0; + muladd_fast(m4, SECP256K1_N_C_0); + extract_fast(p0); + sumadd_fast(m1); + muladd(m5, SECP256K1_N_C_0); + muladd(m4, SECP256K1_N_C_1); + extract(p1); + sumadd(m2); + muladd(m6, SECP256K1_N_C_0); + muladd(m5, SECP256K1_N_C_1); + sumadd(m4); + extract(p2); + sumadd_fast(m3); + muladd_fast(m6, SECP256K1_N_C_1); + sumadd_fast(m5); + extract_fast(p3); + p4 = c0 + m6; + VERIFY_CHECK(p4 <= 2); + + /* Reduce 258 bits into 256. */ + /* r[0..3] = p[0..3] + p[4] * SECP256K1_N_C. */ + c = p0 + (uint128_t)SECP256K1_N_C_0 * p4; + r->d[0] = c & 0xFFFFFFFFFFFFFFFFULL; c >>= 64; + c += p1 + (uint128_t)SECP256K1_N_C_1 * p4; + r->d[1] = c & 0xFFFFFFFFFFFFFFFFULL; c >>= 64; + c += p2 + (uint128_t)p4; + r->d[2] = c & 0xFFFFFFFFFFFFFFFFULL; c >>= 64; + c += p3; + r->d[3] = c & 0xFFFFFFFFFFFFFFFFULL; c >>= 64; +#endif + + /* Final reduction of r. */ + secp256k1_scalar_reduce(r, c + secp256k1_scalar_check_overflow(r)); +} + +static void secp256k1_scalar_mul_512(uint64_t l[8], const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { +#ifdef USE_ASM_X86_64 + const uint64_t *pb = b->d; + __asm__ __volatile__( + /* Preload */ + "movq 0(%%rdi), %%r15\n" + "movq 8(%%rdi), %%rbx\n" + "movq 16(%%rdi), %%rcx\n" + "movq 0(%%rdx), %%r11\n" + "movq 8(%%rdx), %%r12\n" + "movq 16(%%rdx), %%r13\n" + "movq 24(%%rdx), %%r14\n" + /* (rax,rdx) = a0 * b0 */ + "movq %%r15, %%rax\n" + "mulq %%r11\n" + /* Extract l0 */ + "movq %%rax, 0(%%rsi)\n" + /* (r8,r9,r10) = (rdx) */ + "movq %%rdx, %%r8\n" + "xorq %%r9, %%r9\n" + "xorq %%r10, %%r10\n" + /* (r8,r9,r10) += a0 * b1 */ + "movq %%r15, %%rax\n" + "mulq %%r12\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + /* (r8,r9,r10) += a1 * b0 */ + "movq %%rbx, %%rax\n" + "mulq %%r11\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + /* Extract l1 */ + "movq %%r8, 8(%%rsi)\n" + "xorq %%r8, %%r8\n" + /* (r9,r10,r8) += a0 * b2 */ + "movq %%r15, %%rax\n" + "mulq %%r13\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* (r9,r10,r8) += a1 * b1 */ + "movq %%rbx, %%rax\n" + "mulq %%r12\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* (r9,r10,r8) += a2 * b0 */ + "movq %%rcx, %%rax\n" + "mulq %%r11\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* Extract l2 */ + "movq %%r9, 16(%%rsi)\n" + "xorq %%r9, %%r9\n" + /* (r10,r8,r9) += a0 * b3 */ + "movq %%r15, %%rax\n" + "mulq %%r14\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + /* Preload a3 */ + "movq 24(%%rdi), %%r15\n" + /* (r10,r8,r9) += a1 * b2 */ + "movq %%rbx, %%rax\n" + "mulq %%r13\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + /* (r10,r8,r9) += a2 * b1 */ + "movq %%rcx, %%rax\n" + "mulq %%r12\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + /* (r10,r8,r9) += a3 * b0 */ + "movq %%r15, %%rax\n" + "mulq %%r11\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + /* Extract l3 */ + "movq %%r10, 24(%%rsi)\n" + "xorq %%r10, %%r10\n" + /* (r8,r9,r10) += a1 * b3 */ + "movq %%rbx, %%rax\n" + "mulq %%r14\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + /* (r8,r9,r10) += a2 * b2 */ + "movq %%rcx, %%rax\n" + "mulq %%r13\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + /* (r8,r9,r10) += a3 * b1 */ + "movq %%r15, %%rax\n" + "mulq %%r12\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + /* Extract l4 */ + "movq %%r8, 32(%%rsi)\n" + "xorq %%r8, %%r8\n" + /* (r9,r10,r8) += a2 * b3 */ + "movq %%rcx, %%rax\n" + "mulq %%r14\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* (r9,r10,r8) += a3 * b2 */ + "movq %%r15, %%rax\n" + "mulq %%r13\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* Extract l5 */ + "movq %%r9, 40(%%rsi)\n" + /* (r10,r8) += a3 * b3 */ + "movq %%r15, %%rax\n" + "mulq %%r14\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + /* Extract l6 */ + "movq %%r10, 48(%%rsi)\n" + /* Extract l7 */ + "movq %%r8, 56(%%rsi)\n" + : "+d"(pb) + : "S"(l), "D"(a->d) + : "rax", "rbx", "rcx", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", "cc", "memory"); +#else + /* 160 bit accumulator. */ + uint64_t c0 = 0, c1 = 0; + uint32_t c2 = 0; + + /* l[0..7] = a[0..3] * b[0..3]. */ + muladd_fast(a->d[0], b->d[0]); + extract_fast(l[0]); + muladd(a->d[0], b->d[1]); + muladd(a->d[1], b->d[0]); + extract(l[1]); + muladd(a->d[0], b->d[2]); + muladd(a->d[1], b->d[1]); + muladd(a->d[2], b->d[0]); + extract(l[2]); + muladd(a->d[0], b->d[3]); + muladd(a->d[1], b->d[2]); + muladd(a->d[2], b->d[1]); + muladd(a->d[3], b->d[0]); + extract(l[3]); + muladd(a->d[1], b->d[3]); + muladd(a->d[2], b->d[2]); + muladd(a->d[3], b->d[1]); + extract(l[4]); + muladd(a->d[2], b->d[3]); + muladd(a->d[3], b->d[2]); + extract(l[5]); + muladd_fast(a->d[3], b->d[3]); + extract_fast(l[6]); + VERIFY_CHECK(c1 <= 0); + l[7] = c0; +#endif +} + +static void secp256k1_scalar_sqr_512(uint64_t l[8], const secp256k1_scalar_t *a) { +#ifdef USE_ASM_X86_64 + __asm__ __volatile__( + /* Preload */ + "movq 0(%%rdi), %%r11\n" + "movq 8(%%rdi), %%r12\n" + "movq 16(%%rdi), %%r13\n" + "movq 24(%%rdi), %%r14\n" + /* (rax,rdx) = a0 * a0 */ + "movq %%r11, %%rax\n" + "mulq %%r11\n" + /* Extract l0 */ + "movq %%rax, 0(%%rsi)\n" + /* (r8,r9,r10) = (rdx,0) */ + "movq %%rdx, %%r8\n" + "xorq %%r9, %%r9\n" + "xorq %%r10, %%r10\n" + /* (r8,r9,r10) += 2 * a0 * a1 */ + "movq %%r11, %%rax\n" + "mulq %%r12\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + /* Extract l1 */ + "movq %%r8, 8(%%rsi)\n" + "xorq %%r8, %%r8\n" + /* (r9,r10,r8) += 2 * a0 * a2 */ + "movq %%r11, %%rax\n" + "mulq %%r13\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* (r9,r10,r8) += a1 * a1 */ + "movq %%r12, %%rax\n" + "mulq %%r12\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* Extract l2 */ + "movq %%r9, 16(%%rsi)\n" + "xorq %%r9, %%r9\n" + /* (r10,r8,r9) += 2 * a0 * a3 */ + "movq %%r11, %%rax\n" + "mulq %%r14\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + /* (r10,r8,r9) += 2 * a1 * a2 */ + "movq %%r12, %%rax\n" + "mulq %%r13\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + /* Extract l3 */ + "movq %%r10, 24(%%rsi)\n" + "xorq %%r10, %%r10\n" + /* (r8,r9,r10) += 2 * a1 * a3 */ + "movq %%r12, %%rax\n" + "mulq %%r14\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + /* (r8,r9,r10) += a2 * a2 */ + "movq %%r13, %%rax\n" + "mulq %%r13\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + /* Extract l4 */ + "movq %%r8, 32(%%rsi)\n" + "xorq %%r8, %%r8\n" + /* (r9,r10,r8) += 2 * a2 * a3 */ + "movq %%r13, %%rax\n" + "mulq %%r14\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* Extract l5 */ + "movq %%r9, 40(%%rsi)\n" + /* (r10,r8) += a3 * a3 */ + "movq %%r14, %%rax\n" + "mulq %%r14\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + /* Extract l6 */ + "movq %%r10, 48(%%rsi)\n" + /* Extract l7 */ + "movq %%r8, 56(%%rsi)\n" + : + : "S"(l), "D"(a->d) + : "rax", "rdx", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "cc", "memory"); +#else + /* 160 bit accumulator. */ + uint64_t c0 = 0, c1 = 0; + uint32_t c2 = 0; + + /* l[0..7] = a[0..3] * b[0..3]. */ + muladd_fast(a->d[0], a->d[0]); + extract_fast(l[0]); + muladd2(a->d[0], a->d[1]); + extract(l[1]); + muladd2(a->d[0], a->d[2]); + muladd(a->d[1], a->d[1]); + extract(l[2]); + muladd2(a->d[0], a->d[3]); + muladd2(a->d[1], a->d[2]); + extract(l[3]); + muladd2(a->d[1], a->d[3]); + muladd(a->d[2], a->d[2]); + extract(l[4]); + muladd2(a->d[2], a->d[3]); + extract(l[5]); + muladd_fast(a->d[3], a->d[3]); + extract_fast(l[6]); + VERIFY_CHECK(c1 == 0); + l[7] = c0; +#endif +} + +#undef sumadd +#undef sumadd_fast +#undef muladd +#undef muladd_fast +#undef muladd2 +#undef extract +#undef extract_fast + +static void secp256k1_scalar_mul(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { + uint64_t l[8]; + secp256k1_scalar_mul_512(l, a, b); + secp256k1_scalar_reduce_512(r, l); +} + +static void secp256k1_scalar_sqr(secp256k1_scalar_t *r, const secp256k1_scalar_t *a) { + uint64_t l[8]; + secp256k1_scalar_sqr_512(l, a); + secp256k1_scalar_reduce_512(r, l); +} + +static void secp256k1_scalar_split_128(secp256k1_scalar_t *r1, secp256k1_scalar_t *r2, const secp256k1_scalar_t *a) { + r1->d[0] = a->d[0]; + r1->d[1] = a->d[1]; + r1->d[2] = 0; + r1->d[3] = 0; + r2->d[0] = a->d[2]; + r2->d[1] = a->d[3]; + r2->d[2] = 0; + r2->d[3] = 0; +} + +SECP256K1_INLINE static int secp256k1_scalar_eq(const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { + return ((a->d[0] ^ b->d[0]) | (a->d[1] ^ b->d[1]) | (a->d[2] ^ b->d[2]) | (a->d[3] ^ b->d[3])) == 0; +} + +SECP256K1_INLINE static void secp256k1_scalar_mul_shift_var(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b, unsigned int shift) { + uint64_t l[8]; + unsigned int shiftlimbs; + unsigned int shiftlow; + unsigned int shifthigh; + VERIFY_CHECK(shift >= 256); + secp256k1_scalar_mul_512(l, a, b); + shiftlimbs = shift >> 6; + shiftlow = shift & 0x3F; + shifthigh = 64 - shiftlow; + r->d[0] = shift < 512 ? (l[0 + shiftlimbs] >> shiftlow | (shift < 448 && shiftlow ? (l[1 + shiftlimbs] << shifthigh) : 0)) : 0; + r->d[1] = shift < 448 ? (l[1 + shiftlimbs] >> shiftlow | (shift < 384 && shiftlow ? (l[2 + shiftlimbs] << shifthigh) : 0)) : 0; + r->d[2] = shift < 384 ? (l[2 + shiftlimbs] >> shiftlow | (shift < 320 && shiftlow ? (l[3 + shiftlimbs] << shifthigh) : 0)) : 0; + r->d[3] = shift < 320 ? (l[3 + shiftlimbs] >> shiftlow) : 0; + if ((l[(shift - 1) >> 6] >> ((shift - 1) & 0x3f)) & 1) { + secp256k1_scalar_add_bit(r, 0); + } +} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/scalar_8x32.h b/src/cryptoconditions/src/include/secp256k1/src/scalar_8x32.h new file mode 100644 index 000000000..f17017e24 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/scalar_8x32.h @@ -0,0 +1,19 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_SCALAR_REPR_ +#define _SECP256K1_SCALAR_REPR_ + +#include + +/** A scalar modulo the group order of the secp256k1 curve. */ +typedef struct { + uint32_t d[8]; +} secp256k1_scalar_t; + +#define SECP256K1_SCALAR_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{(d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7)}} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/scalar_8x32_impl.h b/src/cryptoconditions/src/include/secp256k1/src/scalar_8x32_impl.h new file mode 100644 index 000000000..22b31d411 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/scalar_8x32_impl.h @@ -0,0 +1,681 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_SCALAR_REPR_IMPL_H_ +#define _SECP256K1_SCALAR_REPR_IMPL_H_ + +/* Limbs of the secp256k1 order. */ +#define SECP256K1_N_0 ((uint32_t)0xD0364141UL) +#define SECP256K1_N_1 ((uint32_t)0xBFD25E8CUL) +#define SECP256K1_N_2 ((uint32_t)0xAF48A03BUL) +#define SECP256K1_N_3 ((uint32_t)0xBAAEDCE6UL) +#define SECP256K1_N_4 ((uint32_t)0xFFFFFFFEUL) +#define SECP256K1_N_5 ((uint32_t)0xFFFFFFFFUL) +#define SECP256K1_N_6 ((uint32_t)0xFFFFFFFFUL) +#define SECP256K1_N_7 ((uint32_t)0xFFFFFFFFUL) + +/* Limbs of 2^256 minus the secp256k1 order. */ +#define SECP256K1_N_C_0 (~SECP256K1_N_0 + 1) +#define SECP256K1_N_C_1 (~SECP256K1_N_1) +#define SECP256K1_N_C_2 (~SECP256K1_N_2) +#define SECP256K1_N_C_3 (~SECP256K1_N_3) +#define SECP256K1_N_C_4 (1) + +/* Limbs of half the secp256k1 order. */ +#define SECP256K1_N_H_0 ((uint32_t)0x681B20A0UL) +#define SECP256K1_N_H_1 ((uint32_t)0xDFE92F46UL) +#define SECP256K1_N_H_2 ((uint32_t)0x57A4501DUL) +#define SECP256K1_N_H_3 ((uint32_t)0x5D576E73UL) +#define SECP256K1_N_H_4 ((uint32_t)0xFFFFFFFFUL) +#define SECP256K1_N_H_5 ((uint32_t)0xFFFFFFFFUL) +#define SECP256K1_N_H_6 ((uint32_t)0xFFFFFFFFUL) +#define SECP256K1_N_H_7 ((uint32_t)0x7FFFFFFFUL) + +SECP256K1_INLINE static void secp256k1_scalar_clear(secp256k1_scalar_t *r) { + r->d[0] = 0; + r->d[1] = 0; + r->d[2] = 0; + r->d[3] = 0; + r->d[4] = 0; + r->d[5] = 0; + r->d[6] = 0; + r->d[7] = 0; +} + +SECP256K1_INLINE static void secp256k1_scalar_set_int(secp256k1_scalar_t *r, unsigned int v) { + r->d[0] = v; + r->d[1] = 0; + r->d[2] = 0; + r->d[3] = 0; + r->d[4] = 0; + r->d[5] = 0; + r->d[6] = 0; + r->d[7] = 0; +} + +SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar_t *a, unsigned int offset, unsigned int count) { + VERIFY_CHECK((offset + count - 1) >> 5 == offset >> 5); + return (a->d[offset >> 5] >> (offset & 0x1F)) & ((1 << count) - 1); +} + +SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar_t *a, unsigned int offset, unsigned int count) { + VERIFY_CHECK(count < 32); + VERIFY_CHECK(offset + count <= 256); + if ((offset + count - 1) >> 5 == offset >> 5) { + return secp256k1_scalar_get_bits(a, offset, count); + } else { + VERIFY_CHECK((offset >> 5) + 1 < 8); + return ((a->d[offset >> 5] >> (offset & 0x1F)) | (a->d[(offset >> 5) + 1] << (32 - (offset & 0x1F)))) & ((((uint32_t)1) << count) - 1); + } +} + +SECP256K1_INLINE static int secp256k1_scalar_check_overflow(const secp256k1_scalar_t *a) { + int yes = 0; + int no = 0; + no |= (a->d[7] < SECP256K1_N_7); /* No need for a > check. */ + no |= (a->d[6] < SECP256K1_N_6); /* No need for a > check. */ + no |= (a->d[5] < SECP256K1_N_5); /* No need for a > check. */ + no |= (a->d[4] < SECP256K1_N_4); + yes |= (a->d[4] > SECP256K1_N_4) & ~no; + no |= (a->d[3] < SECP256K1_N_3) & ~yes; + yes |= (a->d[3] > SECP256K1_N_3) & ~no; + no |= (a->d[2] < SECP256K1_N_2) & ~yes; + yes |= (a->d[2] > SECP256K1_N_2) & ~no; + no |= (a->d[1] < SECP256K1_N_1) & ~yes; + yes |= (a->d[1] > SECP256K1_N_1) & ~no; + yes |= (a->d[0] >= SECP256K1_N_0) & ~no; + return yes; +} + +SECP256K1_INLINE static int secp256k1_scalar_reduce(secp256k1_scalar_t *r, uint32_t overflow) { + uint64_t t; + VERIFY_CHECK(overflow <= 1); + t = (uint64_t)r->d[0] + overflow * SECP256K1_N_C_0; + r->d[0] = t & 0xFFFFFFFFUL; t >>= 32; + t += (uint64_t)r->d[1] + overflow * SECP256K1_N_C_1; + r->d[1] = t & 0xFFFFFFFFUL; t >>= 32; + t += (uint64_t)r->d[2] + overflow * SECP256K1_N_C_2; + r->d[2] = t & 0xFFFFFFFFUL; t >>= 32; + t += (uint64_t)r->d[3] + overflow * SECP256K1_N_C_3; + r->d[3] = t & 0xFFFFFFFFUL; t >>= 32; + t += (uint64_t)r->d[4] + overflow * SECP256K1_N_C_4; + r->d[4] = t & 0xFFFFFFFFUL; t >>= 32; + t += (uint64_t)r->d[5]; + r->d[5] = t & 0xFFFFFFFFUL; t >>= 32; + t += (uint64_t)r->d[6]; + r->d[6] = t & 0xFFFFFFFFUL; t >>= 32; + t += (uint64_t)r->d[7]; + r->d[7] = t & 0xFFFFFFFFUL; + return overflow; +} + +static int secp256k1_scalar_add(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { + int overflow; + uint64_t t = (uint64_t)a->d[0] + b->d[0]; + r->d[0] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)a->d[1] + b->d[1]; + r->d[1] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)a->d[2] + b->d[2]; + r->d[2] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)a->d[3] + b->d[3]; + r->d[3] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)a->d[4] + b->d[4]; + r->d[4] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)a->d[5] + b->d[5]; + r->d[5] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)a->d[6] + b->d[6]; + r->d[6] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)a->d[7] + b->d[7]; + r->d[7] = t & 0xFFFFFFFFULL; t >>= 32; + overflow = t + secp256k1_scalar_check_overflow(r); + VERIFY_CHECK(overflow == 0 || overflow == 1); + secp256k1_scalar_reduce(r, overflow); + return overflow; +} + +static void secp256k1_scalar_add_bit(secp256k1_scalar_t *r, unsigned int bit) { + uint64_t t; + VERIFY_CHECK(bit < 256); + t = (uint64_t)r->d[0] + (((uint32_t)((bit >> 5) == 0)) << (bit & 0x1F)); + r->d[0] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)r->d[1] + (((uint32_t)((bit >> 5) == 1)) << (bit & 0x1F)); + r->d[1] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)r->d[2] + (((uint32_t)((bit >> 5) == 2)) << (bit & 0x1F)); + r->d[2] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)r->d[3] + (((uint32_t)((bit >> 5) == 3)) << (bit & 0x1F)); + r->d[3] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)r->d[4] + (((uint32_t)((bit >> 5) == 4)) << (bit & 0x1F)); + r->d[4] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)r->d[5] + (((uint32_t)((bit >> 5) == 5)) << (bit & 0x1F)); + r->d[5] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)r->d[6] + (((uint32_t)((bit >> 5) == 6)) << (bit & 0x1F)); + r->d[6] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)r->d[7] + (((uint32_t)((bit >> 5) == 7)) << (bit & 0x1F)); + r->d[7] = t & 0xFFFFFFFFULL; +#ifdef VERIFY + VERIFY_CHECK((t >> 32) == 0); + VERIFY_CHECK(secp256k1_scalar_check_overflow(r) == 0); +#endif +} + +static void secp256k1_scalar_set_b32(secp256k1_scalar_t *r, const unsigned char *b32, int *overflow) { + int over; + r->d[0] = (uint32_t)b32[31] | (uint32_t)b32[30] << 8 | (uint32_t)b32[29] << 16 | (uint32_t)b32[28] << 24; + r->d[1] = (uint32_t)b32[27] | (uint32_t)b32[26] << 8 | (uint32_t)b32[25] << 16 | (uint32_t)b32[24] << 24; + r->d[2] = (uint32_t)b32[23] | (uint32_t)b32[22] << 8 | (uint32_t)b32[21] << 16 | (uint32_t)b32[20] << 24; + r->d[3] = (uint32_t)b32[19] | (uint32_t)b32[18] << 8 | (uint32_t)b32[17] << 16 | (uint32_t)b32[16] << 24; + r->d[4] = (uint32_t)b32[15] | (uint32_t)b32[14] << 8 | (uint32_t)b32[13] << 16 | (uint32_t)b32[12] << 24; + r->d[5] = (uint32_t)b32[11] | (uint32_t)b32[10] << 8 | (uint32_t)b32[9] << 16 | (uint32_t)b32[8] << 24; + r->d[6] = (uint32_t)b32[7] | (uint32_t)b32[6] << 8 | (uint32_t)b32[5] << 16 | (uint32_t)b32[4] << 24; + r->d[7] = (uint32_t)b32[3] | (uint32_t)b32[2] << 8 | (uint32_t)b32[1] << 16 | (uint32_t)b32[0] << 24; + over = secp256k1_scalar_reduce(r, secp256k1_scalar_check_overflow(r)); + if (overflow) { + *overflow = over; + } +} + +static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar_t* a) { + bin[0] = a->d[7] >> 24; bin[1] = a->d[7] >> 16; bin[2] = a->d[7] >> 8; bin[3] = a->d[7]; + bin[4] = a->d[6] >> 24; bin[5] = a->d[6] >> 16; bin[6] = a->d[6] >> 8; bin[7] = a->d[6]; + bin[8] = a->d[5] >> 24; bin[9] = a->d[5] >> 16; bin[10] = a->d[5] >> 8; bin[11] = a->d[5]; + bin[12] = a->d[4] >> 24; bin[13] = a->d[4] >> 16; bin[14] = a->d[4] >> 8; bin[15] = a->d[4]; + bin[16] = a->d[3] >> 24; bin[17] = a->d[3] >> 16; bin[18] = a->d[3] >> 8; bin[19] = a->d[3]; + bin[20] = a->d[2] >> 24; bin[21] = a->d[2] >> 16; bin[22] = a->d[2] >> 8; bin[23] = a->d[2]; + bin[24] = a->d[1] >> 24; bin[25] = a->d[1] >> 16; bin[26] = a->d[1] >> 8; bin[27] = a->d[1]; + bin[28] = a->d[0] >> 24; bin[29] = a->d[0] >> 16; bin[30] = a->d[0] >> 8; bin[31] = a->d[0]; +} + +SECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar_t *a) { + return (a->d[0] | a->d[1] | a->d[2] | a->d[3] | a->d[4] | a->d[5] | a->d[6] | a->d[7]) == 0; +} + +static void secp256k1_scalar_negate(secp256k1_scalar_t *r, const secp256k1_scalar_t *a) { + uint32_t nonzero = 0xFFFFFFFFUL * (secp256k1_scalar_is_zero(a) == 0); + uint64_t t = (uint64_t)(~a->d[0]) + SECP256K1_N_0 + 1; + r->d[0] = t & nonzero; t >>= 32; + t += (uint64_t)(~a->d[1]) + SECP256K1_N_1; + r->d[1] = t & nonzero; t >>= 32; + t += (uint64_t)(~a->d[2]) + SECP256K1_N_2; + r->d[2] = t & nonzero; t >>= 32; + t += (uint64_t)(~a->d[3]) + SECP256K1_N_3; + r->d[3] = t & nonzero; t >>= 32; + t += (uint64_t)(~a->d[4]) + SECP256K1_N_4; + r->d[4] = t & nonzero; t >>= 32; + t += (uint64_t)(~a->d[5]) + SECP256K1_N_5; + r->d[5] = t & nonzero; t >>= 32; + t += (uint64_t)(~a->d[6]) + SECP256K1_N_6; + r->d[6] = t & nonzero; t >>= 32; + t += (uint64_t)(~a->d[7]) + SECP256K1_N_7; + r->d[7] = t & nonzero; +} + +SECP256K1_INLINE static int secp256k1_scalar_is_one(const secp256k1_scalar_t *a) { + return ((a->d[0] ^ 1) | a->d[1] | a->d[2] | a->d[3] | a->d[4] | a->d[5] | a->d[6] | a->d[7]) == 0; +} + +static int secp256k1_scalar_is_high(const secp256k1_scalar_t *a) { + int yes = 0; + int no = 0; + no |= (a->d[7] < SECP256K1_N_H_7); + yes |= (a->d[7] > SECP256K1_N_H_7) & ~no; + no |= (a->d[6] < SECP256K1_N_H_6) & ~yes; /* No need for a > check. */ + no |= (a->d[5] < SECP256K1_N_H_5) & ~yes; /* No need for a > check. */ + no |= (a->d[4] < SECP256K1_N_H_4) & ~yes; /* No need for a > check. */ + no |= (a->d[3] < SECP256K1_N_H_3) & ~yes; + yes |= (a->d[3] > SECP256K1_N_H_3) & ~no; + no |= (a->d[2] < SECP256K1_N_H_2) & ~yes; + yes |= (a->d[2] > SECP256K1_N_H_2) & ~no; + no |= (a->d[1] < SECP256K1_N_H_1) & ~yes; + yes |= (a->d[1] > SECP256K1_N_H_1) & ~no; + yes |= (a->d[0] > SECP256K1_N_H_0) & ~no; + return yes; +} + +/* Inspired by the macros in OpenSSL's crypto/bn/asm/x86_64-gcc.c. */ + +/** Add a*b to the number defined by (c0,c1,c2). c2 must never overflow. */ +#define muladd(a,b) { \ + uint32_t tl, th; \ + { \ + uint64_t t = (uint64_t)a * b; \ + th = t >> 32; /* at most 0xFFFFFFFE */ \ + tl = t; \ + } \ + c0 += tl; /* overflow is handled on the next line */ \ + th += (c0 < tl) ? 1 : 0; /* at most 0xFFFFFFFF */ \ + c1 += th; /* overflow is handled on the next line */ \ + c2 += (c1 < th) ? 1 : 0; /* never overflows by contract (verified in the next line) */ \ + VERIFY_CHECK((c1 >= th) || (c2 != 0)); \ +} + +/** Add a*b to the number defined by (c0,c1). c1 must never overflow. */ +#define muladd_fast(a,b) { \ + uint32_t tl, th; \ + { \ + uint64_t t = (uint64_t)a * b; \ + th = t >> 32; /* at most 0xFFFFFFFE */ \ + tl = t; \ + } \ + c0 += tl; /* overflow is handled on the next line */ \ + th += (c0 < tl) ? 1 : 0; /* at most 0xFFFFFFFF */ \ + c1 += th; /* never overflows by contract (verified in the next line) */ \ + VERIFY_CHECK(c1 >= th); \ +} + +/** Add 2*a*b to the number defined by (c0,c1,c2). c2 must never overflow. */ +#define muladd2(a,b) { \ + uint32_t tl, th, th2, tl2; \ + { \ + uint64_t t = (uint64_t)a * b; \ + th = t >> 32; /* at most 0xFFFFFFFE */ \ + tl = t; \ + } \ + th2 = th + th; /* at most 0xFFFFFFFE (in case th was 0x7FFFFFFF) */ \ + c2 += (th2 < th) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ + VERIFY_CHECK((th2 >= th) || (c2 != 0)); \ + tl2 = tl + tl; /* at most 0xFFFFFFFE (in case the lowest 63 bits of tl were 0x7FFFFFFF) */ \ + th2 += (tl2 < tl) ? 1 : 0; /* at most 0xFFFFFFFF */ \ + c0 += tl2; /* overflow is handled on the next line */ \ + th2 += (c0 < tl2) ? 1 : 0; /* second overflow is handled on the next line */ \ + c2 += (c0 < tl2) & (th2 == 0); /* never overflows by contract (verified the next line) */ \ + VERIFY_CHECK((c0 >= tl2) || (th2 != 0) || (c2 != 0)); \ + c1 += th2; /* overflow is handled on the next line */ \ + c2 += (c1 < th2) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ + VERIFY_CHECK((c1 >= th2) || (c2 != 0)); \ +} + +/** Add a to the number defined by (c0,c1,c2). c2 must never overflow. */ +#define sumadd(a) { \ + unsigned int over; \ + c0 += (a); /* overflow is handled on the next line */ \ + over = (c0 < (a)) ? 1 : 0; \ + c1 += over; /* overflow is handled on the next line */ \ + c2 += (c1 < over) ? 1 : 0; /* never overflows by contract */ \ +} + +/** Add a to the number defined by (c0,c1). c1 must never overflow, c2 must be zero. */ +#define sumadd_fast(a) { \ + c0 += (a); /* overflow is handled on the next line */ \ + c1 += (c0 < (a)) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ + VERIFY_CHECK((c1 != 0) | (c0 >= (a))); \ + VERIFY_CHECK(c2 == 0); \ +} + +/** Extract the lowest 32 bits of (c0,c1,c2) into n, and left shift the number 32 bits. */ +#define extract(n) { \ + (n) = c0; \ + c0 = c1; \ + c1 = c2; \ + c2 = 0; \ +} + +/** Extract the lowest 32 bits of (c0,c1,c2) into n, and left shift the number 32 bits. c2 is required to be zero. */ +#define extract_fast(n) { \ + (n) = c0; \ + c0 = c1; \ + c1 = 0; \ + VERIFY_CHECK(c2 == 0); \ +} + +static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint32_t *l) { + uint64_t c; + uint32_t n0 = l[8], n1 = l[9], n2 = l[10], n3 = l[11], n4 = l[12], n5 = l[13], n6 = l[14], n7 = l[15]; + uint32_t m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12; + uint32_t p0, p1, p2, p3, p4, p5, p6, p7, p8; + + /* 96 bit accumulator. */ + uint32_t c0, c1, c2; + + /* Reduce 512 bits into 385. */ + /* m[0..12] = l[0..7] + n[0..7] * SECP256K1_N_C. */ + c0 = l[0]; c1 = 0; c2 = 0; + muladd_fast(n0, SECP256K1_N_C_0); + extract_fast(m0); + sumadd_fast(l[1]); + muladd(n1, SECP256K1_N_C_0); + muladd(n0, SECP256K1_N_C_1); + extract(m1); + sumadd(l[2]); + muladd(n2, SECP256K1_N_C_0); + muladd(n1, SECP256K1_N_C_1); + muladd(n0, SECP256K1_N_C_2); + extract(m2); + sumadd(l[3]); + muladd(n3, SECP256K1_N_C_0); + muladd(n2, SECP256K1_N_C_1); + muladd(n1, SECP256K1_N_C_2); + muladd(n0, SECP256K1_N_C_3); + extract(m3); + sumadd(l[4]); + muladd(n4, SECP256K1_N_C_0); + muladd(n3, SECP256K1_N_C_1); + muladd(n2, SECP256K1_N_C_2); + muladd(n1, SECP256K1_N_C_3); + sumadd(n0); + extract(m4); + sumadd(l[5]); + muladd(n5, SECP256K1_N_C_0); + muladd(n4, SECP256K1_N_C_1); + muladd(n3, SECP256K1_N_C_2); + muladd(n2, SECP256K1_N_C_3); + sumadd(n1); + extract(m5); + sumadd(l[6]); + muladd(n6, SECP256K1_N_C_0); + muladd(n5, SECP256K1_N_C_1); + muladd(n4, SECP256K1_N_C_2); + muladd(n3, SECP256K1_N_C_3); + sumadd(n2); + extract(m6); + sumadd(l[7]); + muladd(n7, SECP256K1_N_C_0); + muladd(n6, SECP256K1_N_C_1); + muladd(n5, SECP256K1_N_C_2); + muladd(n4, SECP256K1_N_C_3); + sumadd(n3); + extract(m7); + muladd(n7, SECP256K1_N_C_1); + muladd(n6, SECP256K1_N_C_2); + muladd(n5, SECP256K1_N_C_3); + sumadd(n4); + extract(m8); + muladd(n7, SECP256K1_N_C_2); + muladd(n6, SECP256K1_N_C_3); + sumadd(n5); + extract(m9); + muladd(n7, SECP256K1_N_C_3); + sumadd(n6); + extract(m10); + sumadd_fast(n7); + extract_fast(m11); + VERIFY_CHECK(c0 <= 1); + m12 = c0; + + /* Reduce 385 bits into 258. */ + /* p[0..8] = m[0..7] + m[8..12] * SECP256K1_N_C. */ + c0 = m0; c1 = 0; c2 = 0; + muladd_fast(m8, SECP256K1_N_C_0); + extract_fast(p0); + sumadd_fast(m1); + muladd(m9, SECP256K1_N_C_0); + muladd(m8, SECP256K1_N_C_1); + extract(p1); + sumadd(m2); + muladd(m10, SECP256K1_N_C_0); + muladd(m9, SECP256K1_N_C_1); + muladd(m8, SECP256K1_N_C_2); + extract(p2); + sumadd(m3); + muladd(m11, SECP256K1_N_C_0); + muladd(m10, SECP256K1_N_C_1); + muladd(m9, SECP256K1_N_C_2); + muladd(m8, SECP256K1_N_C_3); + extract(p3); + sumadd(m4); + muladd(m12, SECP256K1_N_C_0); + muladd(m11, SECP256K1_N_C_1); + muladd(m10, SECP256K1_N_C_2); + muladd(m9, SECP256K1_N_C_3); + sumadd(m8); + extract(p4); + sumadd(m5); + muladd(m12, SECP256K1_N_C_1); + muladd(m11, SECP256K1_N_C_2); + muladd(m10, SECP256K1_N_C_3); + sumadd(m9); + extract(p5); + sumadd(m6); + muladd(m12, SECP256K1_N_C_2); + muladd(m11, SECP256K1_N_C_3); + sumadd(m10); + extract(p6); + sumadd_fast(m7); + muladd_fast(m12, SECP256K1_N_C_3); + sumadd_fast(m11); + extract_fast(p7); + p8 = c0 + m12; + VERIFY_CHECK(p8 <= 2); + + /* Reduce 258 bits into 256. */ + /* r[0..7] = p[0..7] + p[8] * SECP256K1_N_C. */ + c = p0 + (uint64_t)SECP256K1_N_C_0 * p8; + r->d[0] = c & 0xFFFFFFFFUL; c >>= 32; + c += p1 + (uint64_t)SECP256K1_N_C_1 * p8; + r->d[1] = c & 0xFFFFFFFFUL; c >>= 32; + c += p2 + (uint64_t)SECP256K1_N_C_2 * p8; + r->d[2] = c & 0xFFFFFFFFUL; c >>= 32; + c += p3 + (uint64_t)SECP256K1_N_C_3 * p8; + r->d[3] = c & 0xFFFFFFFFUL; c >>= 32; + c += p4 + (uint64_t)p8; + r->d[4] = c & 0xFFFFFFFFUL; c >>= 32; + c += p5; + r->d[5] = c & 0xFFFFFFFFUL; c >>= 32; + c += p6; + r->d[6] = c & 0xFFFFFFFFUL; c >>= 32; + c += p7; + r->d[7] = c & 0xFFFFFFFFUL; c >>= 32; + + /* Final reduction of r. */ + secp256k1_scalar_reduce(r, c + secp256k1_scalar_check_overflow(r)); +} + +static void secp256k1_scalar_mul_512(uint32_t *l, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { + /* 96 bit accumulator. */ + uint32_t c0 = 0, c1 = 0, c2 = 0; + + /* l[0..15] = a[0..7] * b[0..7]. */ + muladd_fast(a->d[0], b->d[0]); + extract_fast(l[0]); + muladd(a->d[0], b->d[1]); + muladd(a->d[1], b->d[0]); + extract(l[1]); + muladd(a->d[0], b->d[2]); + muladd(a->d[1], b->d[1]); + muladd(a->d[2], b->d[0]); + extract(l[2]); + muladd(a->d[0], b->d[3]); + muladd(a->d[1], b->d[2]); + muladd(a->d[2], b->d[1]); + muladd(a->d[3], b->d[0]); + extract(l[3]); + muladd(a->d[0], b->d[4]); + muladd(a->d[1], b->d[3]); + muladd(a->d[2], b->d[2]); + muladd(a->d[3], b->d[1]); + muladd(a->d[4], b->d[0]); + extract(l[4]); + muladd(a->d[0], b->d[5]); + muladd(a->d[1], b->d[4]); + muladd(a->d[2], b->d[3]); + muladd(a->d[3], b->d[2]); + muladd(a->d[4], b->d[1]); + muladd(a->d[5], b->d[0]); + extract(l[5]); + muladd(a->d[0], b->d[6]); + muladd(a->d[1], b->d[5]); + muladd(a->d[2], b->d[4]); + muladd(a->d[3], b->d[3]); + muladd(a->d[4], b->d[2]); + muladd(a->d[5], b->d[1]); + muladd(a->d[6], b->d[0]); + extract(l[6]); + muladd(a->d[0], b->d[7]); + muladd(a->d[1], b->d[6]); + muladd(a->d[2], b->d[5]); + muladd(a->d[3], b->d[4]); + muladd(a->d[4], b->d[3]); + muladd(a->d[5], b->d[2]); + muladd(a->d[6], b->d[1]); + muladd(a->d[7], b->d[0]); + extract(l[7]); + muladd(a->d[1], b->d[7]); + muladd(a->d[2], b->d[6]); + muladd(a->d[3], b->d[5]); + muladd(a->d[4], b->d[4]); + muladd(a->d[5], b->d[3]); + muladd(a->d[6], b->d[2]); + muladd(a->d[7], b->d[1]); + extract(l[8]); + muladd(a->d[2], b->d[7]); + muladd(a->d[3], b->d[6]); + muladd(a->d[4], b->d[5]); + muladd(a->d[5], b->d[4]); + muladd(a->d[6], b->d[3]); + muladd(a->d[7], b->d[2]); + extract(l[9]); + muladd(a->d[3], b->d[7]); + muladd(a->d[4], b->d[6]); + muladd(a->d[5], b->d[5]); + muladd(a->d[6], b->d[4]); + muladd(a->d[7], b->d[3]); + extract(l[10]); + muladd(a->d[4], b->d[7]); + muladd(a->d[5], b->d[6]); + muladd(a->d[6], b->d[5]); + muladd(a->d[7], b->d[4]); + extract(l[11]); + muladd(a->d[5], b->d[7]); + muladd(a->d[6], b->d[6]); + muladd(a->d[7], b->d[5]); + extract(l[12]); + muladd(a->d[6], b->d[7]); + muladd(a->d[7], b->d[6]); + extract(l[13]); + muladd_fast(a->d[7], b->d[7]); + extract_fast(l[14]); + VERIFY_CHECK(c1 == 0); + l[15] = c0; +} + +static void secp256k1_scalar_sqr_512(uint32_t *l, const secp256k1_scalar_t *a) { + /* 96 bit accumulator. */ + uint32_t c0 = 0, c1 = 0, c2 = 0; + + /* l[0..15] = a[0..7]^2. */ + muladd_fast(a->d[0], a->d[0]); + extract_fast(l[0]); + muladd2(a->d[0], a->d[1]); + extract(l[1]); + muladd2(a->d[0], a->d[2]); + muladd(a->d[1], a->d[1]); + extract(l[2]); + muladd2(a->d[0], a->d[3]); + muladd2(a->d[1], a->d[2]); + extract(l[3]); + muladd2(a->d[0], a->d[4]); + muladd2(a->d[1], a->d[3]); + muladd(a->d[2], a->d[2]); + extract(l[4]); + muladd2(a->d[0], a->d[5]); + muladd2(a->d[1], a->d[4]); + muladd2(a->d[2], a->d[3]); + extract(l[5]); + muladd2(a->d[0], a->d[6]); + muladd2(a->d[1], a->d[5]); + muladd2(a->d[2], a->d[4]); + muladd(a->d[3], a->d[3]); + extract(l[6]); + muladd2(a->d[0], a->d[7]); + muladd2(a->d[1], a->d[6]); + muladd2(a->d[2], a->d[5]); + muladd2(a->d[3], a->d[4]); + extract(l[7]); + muladd2(a->d[1], a->d[7]); + muladd2(a->d[2], a->d[6]); + muladd2(a->d[3], a->d[5]); + muladd(a->d[4], a->d[4]); + extract(l[8]); + muladd2(a->d[2], a->d[7]); + muladd2(a->d[3], a->d[6]); + muladd2(a->d[4], a->d[5]); + extract(l[9]); + muladd2(a->d[3], a->d[7]); + muladd2(a->d[4], a->d[6]); + muladd(a->d[5], a->d[5]); + extract(l[10]); + muladd2(a->d[4], a->d[7]); + muladd2(a->d[5], a->d[6]); + extract(l[11]); + muladd2(a->d[5], a->d[7]); + muladd(a->d[6], a->d[6]); + extract(l[12]); + muladd2(a->d[6], a->d[7]); + extract(l[13]); + muladd_fast(a->d[7], a->d[7]); + extract_fast(l[14]); + VERIFY_CHECK(c1 == 0); + l[15] = c0; +} + +#undef sumadd +#undef sumadd_fast +#undef muladd +#undef muladd_fast +#undef muladd2 +#undef extract +#undef extract_fast + +static void secp256k1_scalar_mul(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { + uint32_t l[16]; + secp256k1_scalar_mul_512(l, a, b); + secp256k1_scalar_reduce_512(r, l); +} + +static void secp256k1_scalar_sqr(secp256k1_scalar_t *r, const secp256k1_scalar_t *a) { + uint32_t l[16]; + secp256k1_scalar_sqr_512(l, a); + secp256k1_scalar_reduce_512(r, l); +} + +#ifdef USE_ENDOMORPHISM +static void secp256k1_scalar_split_128(secp256k1_scalar_t *r1, secp256k1_scalar_t *r2, const secp256k1_scalar_t *a) { + r1->d[0] = a->d[0]; + r1->d[1] = a->d[1]; + r1->d[2] = a->d[2]; + r1->d[3] = a->d[3]; + r1->d[4] = 0; + r1->d[5] = 0; + r1->d[6] = 0; + r1->d[7] = 0; + r2->d[0] = a->d[4]; + r2->d[1] = a->d[5]; + r2->d[2] = a->d[6]; + r2->d[3] = a->d[7]; + r2->d[4] = 0; + r2->d[5] = 0; + r2->d[6] = 0; + r2->d[7] = 0; +} +#endif + +SECP256K1_INLINE static int secp256k1_scalar_eq(const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { + return ((a->d[0] ^ b->d[0]) | (a->d[1] ^ b->d[1]) | (a->d[2] ^ b->d[2]) | (a->d[3] ^ b->d[3]) | (a->d[4] ^ b->d[4]) | (a->d[5] ^ b->d[5]) | (a->d[6] ^ b->d[6]) | (a->d[7] ^ b->d[7])) == 0; +} + +SECP256K1_INLINE static void secp256k1_scalar_mul_shift_var(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b, unsigned int shift) { + uint32_t l[16]; + unsigned int shiftlimbs; + unsigned int shiftlow; + unsigned int shifthigh; + VERIFY_CHECK(shift >= 256); + secp256k1_scalar_mul_512(l, a, b); + shiftlimbs = shift >> 5; + shiftlow = shift & 0x1F; + shifthigh = 32 - shiftlow; + r->d[0] = shift < 512 ? (l[0 + shiftlimbs] >> shiftlow | (shift < 480 && shiftlow ? (l[1 + shiftlimbs] << shifthigh) : 0)) : 0; + r->d[1] = shift < 480 ? (l[1 + shiftlimbs] >> shiftlow | (shift < 448 && shiftlow ? (l[2 + shiftlimbs] << shifthigh) : 0)) : 0; + r->d[2] = shift < 448 ? (l[2 + shiftlimbs] >> shiftlow | (shift < 416 && shiftlow ? (l[3 + shiftlimbs] << shifthigh) : 0)) : 0; + r->d[3] = shift < 416 ? (l[3 + shiftlimbs] >> shiftlow | (shift < 384 && shiftlow ? (l[4 + shiftlimbs] << shifthigh) : 0)) : 0; + r->d[4] = shift < 384 ? (l[4 + shiftlimbs] >> shiftlow | (shift < 352 && shiftlow ? (l[5 + shiftlimbs] << shifthigh) : 0)) : 0; + r->d[5] = shift < 352 ? (l[5 + shiftlimbs] >> shiftlow | (shift < 320 && shiftlow ? (l[6 + shiftlimbs] << shifthigh) : 0)) : 0; + r->d[6] = shift < 320 ? (l[6 + shiftlimbs] >> shiftlow | (shift < 288 && shiftlow ? (l[7 + shiftlimbs] << shifthigh) : 0)) : 0; + r->d[7] = shift < 288 ? (l[7 + shiftlimbs] >> shiftlow) : 0; + if ((l[(shift - 1) >> 5] >> ((shift - 1) & 0x1f)) & 1) { + secp256k1_scalar_add_bit(r, 0); + } +} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/scalar_impl.h b/src/cryptoconditions/src/include/secp256k1/src/scalar_impl.h new file mode 100644 index 000000000..33824983e --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/scalar_impl.h @@ -0,0 +1,327 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_SCALAR_IMPL_H_ +#define _SECP256K1_SCALAR_IMPL_H_ + +#include + +#include "group.h" +#include "scalar.h" + +#if defined HAVE_CONFIG_H +#include "libsecp256k1-config.h" +#endif + +#if defined(USE_SCALAR_4X64) +#include "scalar_4x64_impl.h" +#elif defined(USE_SCALAR_8X32) +#include "scalar_8x32_impl.h" +#else +#error "Please select scalar implementation" +#endif + +#ifndef USE_NUM_NONE +static void secp256k1_scalar_get_num(secp256k1_num_t *r, const secp256k1_scalar_t *a) { + unsigned char c[32]; + secp256k1_scalar_get_b32(c, a); + secp256k1_num_set_bin(r, c, 32); +} + +/** secp256k1 curve order, see secp256k1_ecdsa_const_order_as_fe in ecdsa_impl.h */ +static void secp256k1_scalar_order_get_num(secp256k1_num_t *r) { + static const unsigned char order[32] = { + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B, + 0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x41 + }; + secp256k1_num_set_bin(r, order, 32); +} +#endif + +static void secp256k1_scalar_inverse(secp256k1_scalar_t *r, const secp256k1_scalar_t *x) { + secp256k1_scalar_t *t; + int i; + /* First compute x ^ (2^N - 1) for some values of N. */ + secp256k1_scalar_t x2, x3, x4, x6, x7, x8, x15, x30, x60, x120, x127; + + secp256k1_scalar_sqr(&x2, x); + secp256k1_scalar_mul(&x2, &x2, x); + + secp256k1_scalar_sqr(&x3, &x2); + secp256k1_scalar_mul(&x3, &x3, x); + + secp256k1_scalar_sqr(&x4, &x3); + secp256k1_scalar_mul(&x4, &x4, x); + + secp256k1_scalar_sqr(&x6, &x4); + secp256k1_scalar_sqr(&x6, &x6); + secp256k1_scalar_mul(&x6, &x6, &x2); + + secp256k1_scalar_sqr(&x7, &x6); + secp256k1_scalar_mul(&x7, &x7, x); + + secp256k1_scalar_sqr(&x8, &x7); + secp256k1_scalar_mul(&x8, &x8, x); + + secp256k1_scalar_sqr(&x15, &x8); + for (i = 0; i < 6; i++) { + secp256k1_scalar_sqr(&x15, &x15); + } + secp256k1_scalar_mul(&x15, &x15, &x7); + + secp256k1_scalar_sqr(&x30, &x15); + for (i = 0; i < 14; i++) { + secp256k1_scalar_sqr(&x30, &x30); + } + secp256k1_scalar_mul(&x30, &x30, &x15); + + secp256k1_scalar_sqr(&x60, &x30); + for (i = 0; i < 29; i++) { + secp256k1_scalar_sqr(&x60, &x60); + } + secp256k1_scalar_mul(&x60, &x60, &x30); + + secp256k1_scalar_sqr(&x120, &x60); + for (i = 0; i < 59; i++) { + secp256k1_scalar_sqr(&x120, &x120); + } + secp256k1_scalar_mul(&x120, &x120, &x60); + + secp256k1_scalar_sqr(&x127, &x120); + for (i = 0; i < 6; i++) { + secp256k1_scalar_sqr(&x127, &x127); + } + secp256k1_scalar_mul(&x127, &x127, &x7); + + /* Then accumulate the final result (t starts at x127). */ + t = &x127; + for (i = 0; i < 2; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (i = 0; i < 4; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x3); /* 111 */ + for (i = 0; i < 2; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (i = 0; i < 2; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (i = 0; i < 2; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (i = 0; i < 4; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x3); /* 111 */ + for (i = 0; i < 3; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x2); /* 11 */ + for (i = 0; i < 4; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x3); /* 111 */ + for (i = 0; i < 5; i++) { /* 00 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x3); /* 111 */ + for (i = 0; i < 4; i++) { /* 00 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x2); /* 11 */ + for (i = 0; i < 2; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (i = 0; i < 2; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (i = 0; i < 5; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x4); /* 1111 */ + for (i = 0; i < 2; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (i = 0; i < 3; i++) { /* 00 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (i = 0; i < 4; i++) { /* 000 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (i = 0; i < 2; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (i = 0; i < 10; i++) { /* 0000000 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x3); /* 111 */ + for (i = 0; i < 4; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x3); /* 111 */ + for (i = 0; i < 9; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x8); /* 11111111 */ + for (i = 0; i < 2; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (i = 0; i < 3; i++) { /* 00 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (i = 0; i < 3; i++) { /* 00 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (i = 0; i < 5; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x4); /* 1111 */ + for (i = 0; i < 2; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (i = 0; i < 5; i++) { /* 000 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x2); /* 11 */ + for (i = 0; i < 4; i++) { /* 00 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x2); /* 11 */ + for (i = 0; i < 2; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (i = 0; i < 8; i++) { /* 000000 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x2); /* 11 */ + for (i = 0; i < 3; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x2); /* 11 */ + for (i = 0; i < 3; i++) { /* 00 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (i = 0; i < 6; i++) { /* 00000 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (i = 0; i < 8; i++) { /* 00 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(r, t, &x6); /* 111111 */ +} + +static void secp256k1_scalar_inverse_var(secp256k1_scalar_t *r, const secp256k1_scalar_t *x) { +#if defined(USE_SCALAR_INV_BUILTIN) + secp256k1_scalar_inverse(r, x); +#elif defined(USE_SCALAR_INV_NUM) + unsigned char b[32]; + secp256k1_num_t n, m; + secp256k1_scalar_get_b32(b, x); + secp256k1_num_set_bin(&n, b, 32); + secp256k1_scalar_order_get_num(&m); + secp256k1_num_mod_inverse(&n, &n, &m); + secp256k1_num_get_bin(b, 32, &n); + secp256k1_scalar_set_b32(r, b, NULL); +#else +#error "Please select scalar inverse implementation" +#endif +} + +#ifdef USE_ENDOMORPHISM +/** + * The Secp256k1 curve has an endomorphism, where lambda * (x, y) = (beta * x, y), where + * lambda is {0x53,0x63,0xad,0x4c,0xc0,0x5c,0x30,0xe0,0xa5,0x26,0x1c,0x02,0x88,0x12,0x64,0x5a, + * 0x12,0x2e,0x22,0xea,0x20,0x81,0x66,0x78,0xdf,0x02,0x96,0x7c,0x1b,0x23,0xbd,0x72} + * + * "Guide to Elliptic Curve Cryptography" (Hankerson, Menezes, Vanstone) gives an algorithm + * (algorithm 3.74) to find k1 and k2 given k, such that k1 + k2 * lambda == k mod n, and k1 + * and k2 have a small size. + * It relies on constants a1, b1, a2, b2. These constants for the value of lambda above are: + * + * - a1 = {0x30,0x86,0xd2,0x21,0xa7,0xd4,0x6b,0xcd,0xe8,0x6c,0x90,0xe4,0x92,0x84,0xeb,0x15} + * - b1 = -{0xe4,0x43,0x7e,0xd6,0x01,0x0e,0x88,0x28,0x6f,0x54,0x7f,0xa9,0x0a,0xbf,0xe4,0xc3} + * - a2 = {0x01,0x14,0xca,0x50,0xf7,0xa8,0xe2,0xf3,0xf6,0x57,0xc1,0x10,0x8d,0x9d,0x44,0xcf,0xd8} + * - b2 = {0x30,0x86,0xd2,0x21,0xa7,0xd4,0x6b,0xcd,0xe8,0x6c,0x90,0xe4,0x92,0x84,0xeb,0x15} + * + * The algorithm then computes c1 = round(b1 * k / n) and c2 = round(b2 * k / n), and gives + * k1 = k - (c1*a1 + c2*a2) and k2 = -(c1*b1 + c2*b2). Instead, we use modular arithmetic, and + * compute k1 as k - k2 * lambda, avoiding the need for constants a1 and a2. + * + * g1, g2 are precomputed constants used to replace division with a rounded multiplication + * when decomposing the scalar for an endomorphism-based point multiplication. + * + * The possibility of using precomputed estimates is mentioned in "Guide to Elliptic Curve + * Cryptography" (Hankerson, Menezes, Vanstone) in section 3.5. + * + * The derivation is described in the paper "Efficient Software Implementation of Public-Key + * Cryptography on Sensor Networks Using the MSP430X Microcontroller" (Gouvea, Oliveira, Lopez), + * Section 4.3 (here we use a somewhat higher-precision estimate): + * d = a1*b2 - b1*a2 + * g1 = round((2^272)*b2/d) + * g2 = round((2^272)*b1/d) + * + * (Note that 'd' is also equal to the curve order here because [a1,b1] and [a2,b2] are found + * as outputs of the Extended Euclidean Algorithm on inputs 'order' and 'lambda'). + * + * The function below splits a in r1 and r2, such that r1 + lambda * r2 == a (mod order). + */ + +static void secp256k1_scalar_split_lambda_var(secp256k1_scalar_t *r1, secp256k1_scalar_t *r2, const secp256k1_scalar_t *a) { + secp256k1_scalar_t c1, c2; + static const secp256k1_scalar_t minus_lambda = SECP256K1_SCALAR_CONST( + 0xAC9C52B3UL, 0x3FA3CF1FUL, 0x5AD9E3FDUL, 0x77ED9BA4UL, + 0xA880B9FCUL, 0x8EC739C2UL, 0xE0CFC810UL, 0xB51283CFUL + ); + static const secp256k1_scalar_t minus_b1 = SECP256K1_SCALAR_CONST( + 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, + 0xE4437ED6UL, 0x010E8828UL, 0x6F547FA9UL, 0x0ABFE4C3UL + ); + static const secp256k1_scalar_t minus_b2 = SECP256K1_SCALAR_CONST( + 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFEUL, + 0x8A280AC5UL, 0x0774346DUL, 0xD765CDA8UL, 0x3DB1562CUL + ); + static const secp256k1_scalar_t g1 = SECP256K1_SCALAR_CONST( + 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00003086UL, + 0xD221A7D4UL, 0x6BCDE86CUL, 0x90E49284UL, 0xEB153DABUL + ); + static const secp256k1_scalar_t g2 = SECP256K1_SCALAR_CONST( + 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x0000E443UL, + 0x7ED6010EUL, 0x88286F54UL, 0x7FA90ABFUL, 0xE4C42212UL + ); + VERIFY_CHECK(r1 != a); + VERIFY_CHECK(r2 != a); + secp256k1_scalar_mul_shift_var(&c1, a, &g1, 272); + secp256k1_scalar_mul_shift_var(&c2, a, &g2, 272); + secp256k1_scalar_mul(&c1, &c1, &minus_b1); + secp256k1_scalar_mul(&c2, &c2, &minus_b2); + secp256k1_scalar_add(r2, &c1, &c2); + secp256k1_scalar_mul(r1, r2, &minus_lambda); + secp256k1_scalar_add(r1, r1, a); +} +#endif + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/secp256k1.c b/src/cryptoconditions/src/include/secp256k1/src/secp256k1.c new file mode 100644 index 000000000..d6192dc4e --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/secp256k1.c @@ -0,0 +1,419 @@ +/********************************************************************** + * Copyright (c) 2013-2015 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#define SECP256K1_BUILD (1) + +#include "include/secp256k1.h" + +#include "util.h" +#include "num_impl.h" +#include "field_impl.h" +#include "scalar_impl.h" +#include "group_impl.h" +#include "ecmult_impl.h" +#include "ecmult_gen_impl.h" +#include "ecdsa_impl.h" +#include "eckey_impl.h" +#include "hash_impl.h" + +struct secp256k1_context_struct { + secp256k1_ecmult_context_t ecmult_ctx; + secp256k1_ecmult_gen_context_t ecmult_gen_ctx; +}; + +secp256k1_context_t* secp256k1_context_create(int flags) { + secp256k1_context_t* ret = (secp256k1_context_t*)checked_malloc(sizeof(secp256k1_context_t)); + + secp256k1_ecmult_context_init(&ret->ecmult_ctx); + secp256k1_ecmult_gen_context_init(&ret->ecmult_gen_ctx); + + if (flags & SECP256K1_CONTEXT_SIGN) { + secp256k1_ecmult_gen_context_build(&ret->ecmult_gen_ctx); + } + if (flags & SECP256K1_CONTEXT_VERIFY) { + secp256k1_ecmult_context_build(&ret->ecmult_ctx); + } + + return ret; +} + +secp256k1_context_t* secp256k1_context_clone(const secp256k1_context_t* ctx) { + secp256k1_context_t* ret = (secp256k1_context_t*)checked_malloc(sizeof(secp256k1_context_t)); + secp256k1_ecmult_context_clone(&ret->ecmult_ctx, &ctx->ecmult_ctx); + secp256k1_ecmult_gen_context_clone(&ret->ecmult_gen_ctx, &ctx->ecmult_gen_ctx); + return ret; +} + +void secp256k1_context_destroy(secp256k1_context_t* ctx) { + secp256k1_ecmult_context_clear(&ctx->ecmult_ctx); + secp256k1_ecmult_gen_context_clear(&ctx->ecmult_gen_ctx); + + free(ctx); +} + +int secp256k1_ecdsa_verify(const secp256k1_context_t* ctx, const unsigned char *msg32, const unsigned char *sig, int siglen, const unsigned char *pubkey, int pubkeylen) { + secp256k1_ge_t q; + secp256k1_ecdsa_sig_t s; + secp256k1_scalar_t m; + int ret = -3; + DEBUG_CHECK(ctx != NULL); + DEBUG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); + DEBUG_CHECK(msg32 != NULL); + DEBUG_CHECK(sig != NULL); + DEBUG_CHECK(pubkey != NULL); + + secp256k1_scalar_set_b32(&m, msg32, NULL); + + if (secp256k1_eckey_pubkey_parse(&q, pubkey, pubkeylen)) { + if (secp256k1_ecdsa_sig_parse(&s, sig, siglen)) { + if (secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &s, &q, &m)) { + /* success is 1, all other values are fail */ + ret = 1; + } else { + ret = 0; + } + } else { + ret = -2; + } + } else { + ret = -1; + } + + return ret; +} + +static int nonce_function_rfc6979(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, unsigned int counter, const void *data) { + secp256k1_rfc6979_hmac_sha256_t rng; + unsigned int i; + secp256k1_rfc6979_hmac_sha256_initialize(&rng, key32, 32, msg32, 32, (const unsigned char*)data, data != NULL ? 32 : 0); + for (i = 0; i <= counter; i++) { + secp256k1_rfc6979_hmac_sha256_generate(&rng, nonce32, 32); + } + secp256k1_rfc6979_hmac_sha256_finalize(&rng); + return 1; +} + +const secp256k1_nonce_function_t secp256k1_nonce_function_rfc6979 = nonce_function_rfc6979; +const secp256k1_nonce_function_t secp256k1_nonce_function_default = nonce_function_rfc6979; + +int secp256k1_ecdsa_sign(const secp256k1_context_t* ctx, const unsigned char *msg32, unsigned char *signature, int *signaturelen, const unsigned char *seckey, secp256k1_nonce_function_t noncefp, const void* noncedata) { + secp256k1_ecdsa_sig_t sig; + secp256k1_scalar_t sec, non, msg; + int ret = 0; + int overflow = 0; + unsigned int count = 0; + DEBUG_CHECK(ctx != NULL); + DEBUG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); + DEBUG_CHECK(msg32 != NULL); + DEBUG_CHECK(signature != NULL); + DEBUG_CHECK(signaturelen != NULL); + DEBUG_CHECK(seckey != NULL); + if (noncefp == NULL) { + noncefp = secp256k1_nonce_function_default; + } + + secp256k1_scalar_set_b32(&sec, seckey, &overflow); + /* Fail if the secret key is invalid. */ + if (!overflow && !secp256k1_scalar_is_zero(&sec)) { + secp256k1_scalar_set_b32(&msg, msg32, NULL); + while (1) { + unsigned char nonce32[32]; + ret = noncefp(nonce32, msg32, seckey, count, noncedata); + if (!ret) { + break; + } + secp256k1_scalar_set_b32(&non, nonce32, &overflow); + memset(nonce32, 0, 32); + if (!secp256k1_scalar_is_zero(&non) && !overflow) { + if (secp256k1_ecdsa_sig_sign(&ctx->ecmult_gen_ctx, &sig, &sec, &msg, &non, NULL)) { + break; + } + } + count++; + } + if (ret) { + ret = secp256k1_ecdsa_sig_serialize(signature, signaturelen, &sig); + } + secp256k1_scalar_clear(&msg); + secp256k1_scalar_clear(&non); + secp256k1_scalar_clear(&sec); + } + if (!ret) { + *signaturelen = 0; + } + return ret; +} + +int secp256k1_ecdsa_sign_compact(const secp256k1_context_t* ctx, const unsigned char *msg32, unsigned char *sig64, const unsigned char *seckey, secp256k1_nonce_function_t noncefp, const void* noncedata, int *recid) { + secp256k1_ecdsa_sig_t sig; + secp256k1_scalar_t sec, non, msg; + int ret = 0; + int overflow = 0; + unsigned int count = 0; + DEBUG_CHECK(ctx != NULL); + DEBUG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); + DEBUG_CHECK(msg32 != NULL); + DEBUG_CHECK(sig64 != NULL); + DEBUG_CHECK(seckey != NULL); + if (noncefp == NULL) { + noncefp = secp256k1_nonce_function_default; + } + + secp256k1_scalar_set_b32(&sec, seckey, &overflow); + /* Fail if the secret key is invalid. */ + if (!overflow && !secp256k1_scalar_is_zero(&sec)) { + secp256k1_scalar_set_b32(&msg, msg32, NULL); + while (1) { + unsigned char nonce32[32]; + ret = noncefp(nonce32, msg32, seckey, count, noncedata); + if (!ret) { + break; + } + secp256k1_scalar_set_b32(&non, nonce32, &overflow); + memset(nonce32, 0, 32); + if (!secp256k1_scalar_is_zero(&non) && !overflow) { + if (secp256k1_ecdsa_sig_sign(&ctx->ecmult_gen_ctx, &sig, &sec, &msg, &non, recid)) { + break; + } + } + count++; + } + if (ret) { + secp256k1_scalar_get_b32(sig64, &sig.r); + secp256k1_scalar_get_b32(sig64 + 32, &sig.s); + } + secp256k1_scalar_clear(&msg); + secp256k1_scalar_clear(&non); + secp256k1_scalar_clear(&sec); + } + if (!ret) { + memset(sig64, 0, 64); + } + return ret; +} + +int secp256k1_ecdsa_recover_compact(const secp256k1_context_t* ctx, const unsigned char *msg32, const unsigned char *sig64, unsigned char *pubkey, int *pubkeylen, int compressed, int recid) { + secp256k1_ge_t q; + secp256k1_ecdsa_sig_t sig; + secp256k1_scalar_t m; + int ret = 0; + int overflow = 0; + DEBUG_CHECK(ctx != NULL); + DEBUG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); + DEBUG_CHECK(msg32 != NULL); + DEBUG_CHECK(sig64 != NULL); + DEBUG_CHECK(pubkey != NULL); + DEBUG_CHECK(pubkeylen != NULL); + DEBUG_CHECK(recid >= 0 && recid <= 3); + + secp256k1_scalar_set_b32(&sig.r, sig64, &overflow); + if (!overflow) { + secp256k1_scalar_set_b32(&sig.s, sig64 + 32, &overflow); + if (!overflow) { + secp256k1_scalar_set_b32(&m, msg32, NULL); + + if (secp256k1_ecdsa_sig_recover(&ctx->ecmult_ctx, &sig, &q, &m, recid)) { + ret = secp256k1_eckey_pubkey_serialize(&q, pubkey, pubkeylen, compressed); + } + } + } + return ret; +} + +int secp256k1_ec_seckey_verify(const secp256k1_context_t* ctx, const unsigned char *seckey) { + secp256k1_scalar_t sec; + int ret; + int overflow; + DEBUG_CHECK(ctx != NULL); + DEBUG_CHECK(seckey != NULL); + (void)ctx; + + secp256k1_scalar_set_b32(&sec, seckey, &overflow); + ret = !secp256k1_scalar_is_zero(&sec) && !overflow; + secp256k1_scalar_clear(&sec); + return ret; +} + +int secp256k1_ec_pubkey_verify(const secp256k1_context_t* ctx, const unsigned char *pubkey, int pubkeylen) { + secp256k1_ge_t q; + DEBUG_CHECK(ctx != NULL); + DEBUG_CHECK(pubkey != NULL); + (void)ctx; + + return secp256k1_eckey_pubkey_parse(&q, pubkey, pubkeylen); +} + +int secp256k1_ec_pubkey_create(const secp256k1_context_t* ctx, unsigned char *pubkey, int *pubkeylen, const unsigned char *seckey, int compressed) { + secp256k1_gej_t pj; + secp256k1_ge_t p; + secp256k1_scalar_t sec; + int overflow; + int ret = 0; + DEBUG_CHECK(ctx != NULL); + DEBUG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); + DEBUG_CHECK(pubkey != NULL); + DEBUG_CHECK(pubkeylen != NULL); + DEBUG_CHECK(seckey != NULL); + + secp256k1_scalar_set_b32(&sec, seckey, &overflow); + if (!overflow) { + secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pj, &sec); + secp256k1_scalar_clear(&sec); + secp256k1_ge_set_gej(&p, &pj); + ret = secp256k1_eckey_pubkey_serialize(&p, pubkey, pubkeylen, compressed); + } + if (!ret) { + *pubkeylen = 0; + } + return ret; +} + +int secp256k1_ec_pubkey_decompress(const secp256k1_context_t* ctx, unsigned char *pubkey, int *pubkeylen) { + secp256k1_ge_t p; + int ret = 0; + DEBUG_CHECK(pubkey != NULL); + DEBUG_CHECK(pubkeylen != NULL); + (void)ctx; + + if (secp256k1_eckey_pubkey_parse(&p, pubkey, *pubkeylen)) { + ret = secp256k1_eckey_pubkey_serialize(&p, pubkey, pubkeylen, 0); + } + return ret; +} + +int secp256k1_ec_privkey_tweak_add(const secp256k1_context_t* ctx, unsigned char *seckey, const unsigned char *tweak) { + secp256k1_scalar_t term; + secp256k1_scalar_t sec; + int ret = 0; + int overflow = 0; + DEBUG_CHECK(ctx != NULL); + DEBUG_CHECK(seckey != NULL); + DEBUG_CHECK(tweak != NULL); + (void)ctx; + + secp256k1_scalar_set_b32(&term, tweak, &overflow); + secp256k1_scalar_set_b32(&sec, seckey, NULL); + + ret = secp256k1_eckey_privkey_tweak_add(&sec, &term) && !overflow; + if (ret) { + secp256k1_scalar_get_b32(seckey, &sec); + } + + secp256k1_scalar_clear(&sec); + secp256k1_scalar_clear(&term); + return ret; +} + +int secp256k1_ec_pubkey_tweak_add(const secp256k1_context_t* ctx, unsigned char *pubkey, int pubkeylen, const unsigned char *tweak) { + secp256k1_ge_t p; + secp256k1_scalar_t term; + int ret = 0; + int overflow = 0; + DEBUG_CHECK(ctx != NULL); + DEBUG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); + DEBUG_CHECK(pubkey != NULL); + DEBUG_CHECK(tweak != NULL); + + secp256k1_scalar_set_b32(&term, tweak, &overflow); + if (!overflow) { + ret = secp256k1_eckey_pubkey_parse(&p, pubkey, pubkeylen); + if (ret) { + ret = secp256k1_eckey_pubkey_tweak_add(&ctx->ecmult_ctx, &p, &term); + } + if (ret) { + int oldlen = pubkeylen; + ret = secp256k1_eckey_pubkey_serialize(&p, pubkey, &pubkeylen, oldlen <= 33); + VERIFY_CHECK(pubkeylen == oldlen); + } + } + + return ret; +} + +int secp256k1_ec_privkey_tweak_mul(const secp256k1_context_t* ctx, unsigned char *seckey, const unsigned char *tweak) { + secp256k1_scalar_t factor; + secp256k1_scalar_t sec; + int ret = 0; + int overflow = 0; + DEBUG_CHECK(ctx != NULL); + DEBUG_CHECK(seckey != NULL); + DEBUG_CHECK(tweak != NULL); + (void)ctx; + + secp256k1_scalar_set_b32(&factor, tweak, &overflow); + secp256k1_scalar_set_b32(&sec, seckey, NULL); + ret = secp256k1_eckey_privkey_tweak_mul(&sec, &factor) && !overflow; + if (ret) { + secp256k1_scalar_get_b32(seckey, &sec); + } + + secp256k1_scalar_clear(&sec); + secp256k1_scalar_clear(&factor); + return ret; +} + +int secp256k1_ec_pubkey_tweak_mul(const secp256k1_context_t* ctx, unsigned char *pubkey, int pubkeylen, const unsigned char *tweak) { + secp256k1_ge_t p; + secp256k1_scalar_t factor; + int ret = 0; + int overflow = 0; + DEBUG_CHECK(ctx != NULL); + DEBUG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); + DEBUG_CHECK(pubkey != NULL); + DEBUG_CHECK(tweak != NULL); + + secp256k1_scalar_set_b32(&factor, tweak, &overflow); + if (!overflow) { + ret = secp256k1_eckey_pubkey_parse(&p, pubkey, pubkeylen); + if (ret) { + ret = secp256k1_eckey_pubkey_tweak_mul(&ctx->ecmult_ctx, &p, &factor); + } + if (ret) { + int oldlen = pubkeylen; + ret = secp256k1_eckey_pubkey_serialize(&p, pubkey, &pubkeylen, oldlen <= 33); + VERIFY_CHECK(pubkeylen == oldlen); + } + } + + return ret; +} + +int secp256k1_ec_privkey_export(const secp256k1_context_t* ctx, const unsigned char *seckey, unsigned char *privkey, int *privkeylen, int compressed) { + secp256k1_scalar_t key; + int ret = 0; + DEBUG_CHECK(seckey != NULL); + DEBUG_CHECK(privkey != NULL); + DEBUG_CHECK(privkeylen != NULL); + DEBUG_CHECK(ctx != NULL); + DEBUG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); + + secp256k1_scalar_set_b32(&key, seckey, NULL); + ret = secp256k1_eckey_privkey_serialize(&ctx->ecmult_gen_ctx, privkey, privkeylen, &key, compressed); + secp256k1_scalar_clear(&key); + return ret; +} + +int secp256k1_ec_privkey_import(const secp256k1_context_t* ctx, unsigned char *seckey, const unsigned char *privkey, int privkeylen) { + secp256k1_scalar_t key; + int ret = 0; + DEBUG_CHECK(seckey != NULL); + DEBUG_CHECK(privkey != NULL); + (void)ctx; + + ret = secp256k1_eckey_privkey_parse(&key, privkey, privkeylen); + if (ret) { + secp256k1_scalar_get_b32(seckey, &key); + } + secp256k1_scalar_clear(&key); + return ret; +} + +int secp256k1_context_randomize(secp256k1_context_t* ctx, const unsigned char *seed32) { + DEBUG_CHECK(ctx != NULL); + DEBUG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); + secp256k1_ecmult_gen_blind(&ctx->ecmult_gen_ctx, seed32); + return 1; +} diff --git a/src/cryptoconditions/src/include/secp256k1/src/testrand.h b/src/cryptoconditions/src/include/secp256k1/src/testrand.h new file mode 100644 index 000000000..041bb92c4 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/testrand.h @@ -0,0 +1,28 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_TESTRAND_H_ +#define _SECP256K1_TESTRAND_H_ + +#if defined HAVE_CONFIG_H +#include "libsecp256k1-config.h" +#endif + +/* A non-cryptographic RNG used only for test infrastructure. */ + +/** Seed the pseudorandom number generator for testing. */ +SECP256K1_INLINE static void secp256k1_rand_seed(const unsigned char *seed16); + +/** Generate a pseudorandom 32-bit number. */ +static uint32_t secp256k1_rand32(void); + +/** Generate a pseudorandom 32-byte array. */ +static void secp256k1_rand256(unsigned char *b32); + +/** Generate a pseudorandom 32-byte array with long sequences of zero and one bits. */ +static void secp256k1_rand256_test(unsigned char *b32); + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/testrand_impl.h b/src/cryptoconditions/src/include/secp256k1/src/testrand_impl.h new file mode 100644 index 000000000..21c69f1c5 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/testrand_impl.h @@ -0,0 +1,60 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_TESTRAND_IMPL_H_ +#define _SECP256K1_TESTRAND_IMPL_H_ + +#include +#include + +#include "testrand.h" +#include "hash.h" + +static secp256k1_rfc6979_hmac_sha256_t secp256k1_test_rng; +static uint32_t secp256k1_test_rng_precomputed[8]; +static int secp256k1_test_rng_precomputed_used = 8; + +SECP256K1_INLINE static void secp256k1_rand_seed(const unsigned char *seed16) { + secp256k1_rfc6979_hmac_sha256_initialize(&secp256k1_test_rng, (const unsigned char*)"TestRNG", 7, seed16, 16, NULL, 0); +} + +SECP256K1_INLINE static uint32_t secp256k1_rand32(void) { + if (secp256k1_test_rng_precomputed_used == 8) { + secp256k1_rfc6979_hmac_sha256_generate(&secp256k1_test_rng, (unsigned char*)(&secp256k1_test_rng_precomputed[0]), sizeof(secp256k1_test_rng_precomputed)); + secp256k1_test_rng_precomputed_used = 0; + } + return secp256k1_test_rng_precomputed[secp256k1_test_rng_precomputed_used++]; +} + +static void secp256k1_rand256(unsigned char *b32) { + secp256k1_rfc6979_hmac_sha256_generate(&secp256k1_test_rng, b32, 32); +} + +static void secp256k1_rand256_test(unsigned char *b32) { + int bits=0; + uint64_t ent = 0; + int entleft = 0; + memset(b32, 0, 32); + while (bits < 256) { + int now; + uint32_t val; + if (entleft < 12) { + ent |= ((uint64_t)secp256k1_rand32()) << entleft; + entleft += 32; + } + now = 1 + ((ent % 64)*((ent >> 6) % 32)+16)/31; + val = 1 & (ent >> 11); + ent >>= 12; + entleft -= 12; + while (now > 0 && bits < 256) { + b32[bits / 8] |= val << (bits % 8); + now--; + bits++; + } + } +} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/tests.c b/src/cryptoconditions/src/include/secp256k1/src/tests.c new file mode 100644 index 000000000..d0e05057f --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/tests.c @@ -0,0 +1,2083 @@ +/********************************************************************** + * Copyright (c) 2013, 2014, 2015 Pieter Wuille, Gregory Maxwell * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#if defined HAVE_CONFIG_H +#include "libsecp256k1-config.h" +#endif + +#include +#include + +#include + +#include "secp256k1.c" +#include "testrand_impl.h" + +#ifdef ENABLE_OPENSSL_TESTS +#include "openssl/bn.h" +#include "openssl/ec.h" +#include "openssl/ecdsa.h" +#include "openssl/obj_mac.h" +#endif + +static int count = 64; +static secp256k1_context_t *ctx = NULL; + +void random_field_element_test(secp256k1_fe_t *fe) { + do { + unsigned char b32[32]; + secp256k1_rand256_test(b32); + if (secp256k1_fe_set_b32(fe, b32)) { + break; + } + } while(1); +} + +void random_field_element_magnitude(secp256k1_fe_t *fe) { + secp256k1_fe_t zero; + int n = secp256k1_rand32() % 9; + secp256k1_fe_normalize(fe); + if (n == 0) { + return; + } + secp256k1_fe_clear(&zero); + secp256k1_fe_negate(&zero, &zero, 0); + secp256k1_fe_mul_int(&zero, n - 1); + secp256k1_fe_add(fe, &zero); +#ifdef VERIFY + CHECK(fe->magnitude == n); +#endif +} + +void random_group_element_test(secp256k1_ge_t *ge) { + secp256k1_fe_t fe; + do { + random_field_element_test(&fe); + if (secp256k1_ge_set_xo_var(ge, &fe, secp256k1_rand32() & 1)) { + break; + } + } while(1); +} + +void random_group_element_jacobian_test(secp256k1_gej_t *gej, const secp256k1_ge_t *ge) { + secp256k1_fe_t z2, z3; + do { + random_field_element_test(&gej->z); + if (!secp256k1_fe_is_zero(&gej->z)) { + break; + } + } while(1); + secp256k1_fe_sqr(&z2, &gej->z); + secp256k1_fe_mul(&z3, &z2, &gej->z); + secp256k1_fe_mul(&gej->x, &ge->x, &z2); + secp256k1_fe_mul(&gej->y, &ge->y, &z3); + gej->infinity = ge->infinity; +} + +void random_scalar_order_test(secp256k1_scalar_t *num) { + do { + unsigned char b32[32]; + int overflow = 0; + secp256k1_rand256_test(b32); + secp256k1_scalar_set_b32(num, b32, &overflow); + if (overflow || secp256k1_scalar_is_zero(num)) { + continue; + } + break; + } while(1); +} + +void random_scalar_order(secp256k1_scalar_t *num) { + do { + unsigned char b32[32]; + int overflow = 0; + secp256k1_rand256(b32); + secp256k1_scalar_set_b32(num, b32, &overflow); + if (overflow || secp256k1_scalar_is_zero(num)) { + continue; + } + break; + } while(1); +} + +void run_context_tests(void) { + secp256k1_context_t *none = secp256k1_context_create(0); + secp256k1_context_t *sign = secp256k1_context_create(SECP256K1_CONTEXT_SIGN); + secp256k1_context_t *vrfy = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY); + secp256k1_context_t *both = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); + + secp256k1_gej_t pubj; + secp256k1_ge_t pub; + secp256k1_scalar_t msg, key, nonce; + secp256k1_ecdsa_sig_t sig; + + /*** clone and destroy all of them to make sure cloning was complete ***/ + { + secp256k1_context_t *ctx_tmp; + + ctx_tmp = none; none = secp256k1_context_clone(none); secp256k1_context_destroy(ctx_tmp); + ctx_tmp = sign; sign = secp256k1_context_clone(sign); secp256k1_context_destroy(ctx_tmp); + ctx_tmp = vrfy; vrfy = secp256k1_context_clone(vrfy); secp256k1_context_destroy(ctx_tmp); + ctx_tmp = both; both = secp256k1_context_clone(both); secp256k1_context_destroy(ctx_tmp); + } + + /*** attempt to use them ***/ + random_scalar_order_test(&msg); + random_scalar_order_test(&key); + secp256k1_ecmult_gen(&both->ecmult_gen_ctx, &pubj, &key); + secp256k1_ge_set_gej(&pub, &pubj); + + /* obtain a working nonce */ + do { + random_scalar_order_test(&nonce); + } while(!secp256k1_ecdsa_sig_sign(&both->ecmult_gen_ctx, &sig, &key, &msg, &nonce, NULL)); + + /* try signing */ + CHECK(secp256k1_ecdsa_sig_sign(&sign->ecmult_gen_ctx, &sig, &key, &msg, &nonce, NULL)); + CHECK(secp256k1_ecdsa_sig_sign(&both->ecmult_gen_ctx, &sig, &key, &msg, &nonce, NULL)); + + /* try verifying */ + CHECK(secp256k1_ecdsa_sig_verify(&vrfy->ecmult_ctx, &sig, &pub, &msg)); + CHECK(secp256k1_ecdsa_sig_verify(&both->ecmult_ctx, &sig, &pub, &msg)); + + /* cleanup */ + secp256k1_context_destroy(none); + secp256k1_context_destroy(sign); + secp256k1_context_destroy(vrfy); + secp256k1_context_destroy(both); +} + +/***** HASH TESTS *****/ + +void run_sha256_tests(void) { + static const char *inputs[8] = { + "", "abc", "message digest", "secure hash algorithm", "SHA256 is considered to be safe", + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", + "For this sample, this 63-byte string will be used as input data", + "This is exactly 64 bytes long, not counting the terminating byte" + }; + static const unsigned char outputs[8][32] = { + {0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c, 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55}, + {0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23, 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c, 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad}, + {0xf7, 0x84, 0x6f, 0x55, 0xcf, 0x23, 0xe1, 0x4e, 0xeb, 0xea, 0xb5, 0xb4, 0xe1, 0x55, 0x0c, 0xad, 0x5b, 0x50, 0x9e, 0x33, 0x48, 0xfb, 0xc4, 0xef, 0xa3, 0xa1, 0x41, 0x3d, 0x39, 0x3c, 0xb6, 0x50}, + {0xf3, 0x0c, 0xeb, 0x2b, 0xb2, 0x82, 0x9e, 0x79, 0xe4, 0xca, 0x97, 0x53, 0xd3, 0x5a, 0x8e, 0xcc, 0x00, 0x26, 0x2d, 0x16, 0x4c, 0xc0, 0x77, 0x08, 0x02, 0x95, 0x38, 0x1c, 0xbd, 0x64, 0x3f, 0x0d}, + {0x68, 0x19, 0xd9, 0x15, 0xc7, 0x3f, 0x4d, 0x1e, 0x77, 0xe4, 0xe1, 0xb5, 0x2d, 0x1f, 0xa0, 0xf9, 0xcf, 0x9b, 0xea, 0xea, 0xd3, 0x93, 0x9f, 0x15, 0x87, 0x4b, 0xd9, 0x88, 0xe2, 0xa2, 0x36, 0x30}, + {0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06, 0x38, 0xb8, 0xe5, 0xc0, 0x26, 0x93, 0x0c, 0x3e, 0x60, 0x39, 0xa3, 0x3c, 0xe4, 0x59, 0x64, 0xff, 0x21, 0x67, 0xf6, 0xec, 0xed, 0xd4, 0x19, 0xdb, 0x06, 0xc1}, + {0xf0, 0x8a, 0x78, 0xcb, 0xba, 0xee, 0x08, 0x2b, 0x05, 0x2a, 0xe0, 0x70, 0x8f, 0x32, 0xfa, 0x1e, 0x50, 0xc5, 0xc4, 0x21, 0xaa, 0x77, 0x2b, 0xa5, 0xdb, 0xb4, 0x06, 0xa2, 0xea, 0x6b, 0xe3, 0x42}, + {0xab, 0x64, 0xef, 0xf7, 0xe8, 0x8e, 0x2e, 0x46, 0x16, 0x5e, 0x29, 0xf2, 0xbc, 0xe4, 0x18, 0x26, 0xbd, 0x4c, 0x7b, 0x35, 0x52, 0xf6, 0xb3, 0x82, 0xa9, 0xe7, 0xd3, 0xaf, 0x47, 0xc2, 0x45, 0xf8} + }; + int i; + for (i = 0; i < 8; i++) { + unsigned char out[32]; + secp256k1_sha256_t hasher; + secp256k1_sha256_initialize(&hasher); + secp256k1_sha256_write(&hasher, (const unsigned char*)(inputs[i]), strlen(inputs[i])); + secp256k1_sha256_finalize(&hasher, out); + CHECK(memcmp(out, outputs[i], 32) == 0); + if (strlen(inputs[i]) > 0) { + int split = secp256k1_rand32() % strlen(inputs[i]); + secp256k1_sha256_initialize(&hasher); + secp256k1_sha256_write(&hasher, (const unsigned char*)(inputs[i]), split); + secp256k1_sha256_write(&hasher, (const unsigned char*)(inputs[i] + split), strlen(inputs[i]) - split); + secp256k1_sha256_finalize(&hasher, out); + CHECK(memcmp(out, outputs[i], 32) == 0); + } + } +} + +void run_hmac_sha256_tests(void) { + static const char *keys[6] = { + "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b", + "\x4a\x65\x66\x65", + "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", + "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19", + "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", + "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa" + }; + static const char *inputs[6] = { + "\x48\x69\x20\x54\x68\x65\x72\x65", + "\x77\x68\x61\x74\x20\x64\x6f\x20\x79\x61\x20\x77\x61\x6e\x74\x20\x66\x6f\x72\x20\x6e\x6f\x74\x68\x69\x6e\x67\x3f", + "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd", + "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd", + "\x54\x65\x73\x74\x20\x55\x73\x69\x6e\x67\x20\x4c\x61\x72\x67\x65\x72\x20\x54\x68\x61\x6e\x20\x42\x6c\x6f\x63\x6b\x2d\x53\x69\x7a\x65\x20\x4b\x65\x79\x20\x2d\x20\x48\x61\x73\x68\x20\x4b\x65\x79\x20\x46\x69\x72\x73\x74", + "\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20\x74\x65\x73\x74\x20\x75\x73\x69\x6e\x67\x20\x61\x20\x6c\x61\x72\x67\x65\x72\x20\x74\x68\x61\x6e\x20\x62\x6c\x6f\x63\x6b\x2d\x73\x69\x7a\x65\x20\x6b\x65\x79\x20\x61\x6e\x64\x20\x61\x20\x6c\x61\x72\x67\x65\x72\x20\x74\x68\x61\x6e\x20\x62\x6c\x6f\x63\x6b\x2d\x73\x69\x7a\x65\x20\x64\x61\x74\x61\x2e\x20\x54\x68\x65\x20\x6b\x65\x79\x20\x6e\x65\x65\x64\x73\x20\x74\x6f\x20\x62\x65\x20\x68\x61\x73\x68\x65\x64\x20\x62\x65\x66\x6f\x72\x65\x20\x62\x65\x69\x6e\x67\x20\x75\x73\x65\x64\x20\x62\x79\x20\x74\x68\x65\x20\x48\x4d\x41\x43\x20\x61\x6c\x67\x6f\x72\x69\x74\x68\x6d\x2e" + }; + static const unsigned char outputs[6][32] = { + {0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf, 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83, 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7}, + {0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24, 0x26, 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27, 0x39, 0x83, 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43}, + {0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8, 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8, 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe}, + {0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81, 0x98, 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78, 0xf8, 0x07, 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b}, + {0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26, 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28, 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54}, + {0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f, 0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07, 0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2} + }; + int i; + for (i = 0; i < 6; i++) { + secp256k1_hmac_sha256_t hasher; + unsigned char out[32]; + secp256k1_hmac_sha256_initialize(&hasher, (const unsigned char*)(keys[i]), strlen(keys[i])); + secp256k1_hmac_sha256_write(&hasher, (const unsigned char*)(inputs[i]), strlen(inputs[i])); + secp256k1_hmac_sha256_finalize(&hasher, out); + CHECK(memcmp(out, outputs[i], 32) == 0); + if (strlen(inputs[i]) > 0) { + int split = secp256k1_rand32() % strlen(inputs[i]); + secp256k1_hmac_sha256_initialize(&hasher, (const unsigned char*)(keys[i]), strlen(keys[i])); + secp256k1_hmac_sha256_write(&hasher, (const unsigned char*)(inputs[i]), split); + secp256k1_hmac_sha256_write(&hasher, (const unsigned char*)(inputs[i] + split), strlen(inputs[i]) - split); + secp256k1_hmac_sha256_finalize(&hasher, out); + CHECK(memcmp(out, outputs[i], 32) == 0); + } + } +} + +void run_rfc6979_hmac_sha256_tests(void) { + static const unsigned char key1[32] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x00}; + static const unsigned char msg1[32] = {0x4b, 0xf5, 0x12, 0x2f, 0x34, 0x45, 0x54, 0xc5, 0x3b, 0xde, 0x2e, 0xbb, 0x8c, 0xd2, 0xb7, 0xe3, 0xd1, 0x60, 0x0a, 0xd6, 0x31, 0xc3, 0x85, 0xa5, 0xd7, 0xcc, 0xe2, 0x3c, 0x77, 0x85, 0x45, 0x9a}; + static const unsigned char out1[3][32] = { + {0x4f, 0xe2, 0x95, 0x25, 0xb2, 0x08, 0x68, 0x09, 0x15, 0x9a, 0xcd, 0xf0, 0x50, 0x6e, 0xfb, 0x86, 0xb0, 0xec, 0x93, 0x2c, 0x7b, 0xa4, 0x42, 0x56, 0xab, 0x32, 0x1e, 0x42, 0x1e, 0x67, 0xe9, 0xfb}, + {0x2b, 0xf0, 0xff, 0xf1, 0xd3, 0xc3, 0x78, 0xa2, 0x2d, 0xc5, 0xde, 0x1d, 0x85, 0x65, 0x22, 0x32, 0x5c, 0x65, 0xb5, 0x04, 0x49, 0x1a, 0x0c, 0xbd, 0x01, 0xcb, 0x8f, 0x3a, 0xa6, 0x7f, 0xfd, 0x4a}, + {0xf5, 0x28, 0xb4, 0x10, 0xcb, 0x54, 0x1f, 0x77, 0x00, 0x0d, 0x7a, 0xfb, 0x6c, 0x5b, 0x53, 0xc5, 0xc4, 0x71, 0xea, 0xb4, 0x3e, 0x46, 0x6d, 0x9a, 0xc5, 0x19, 0x0c, 0x39, 0xc8, 0x2f, 0xd8, 0x2e} + }; + + static const unsigned char key2[32] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + static const unsigned char msg2[32] = {0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c, 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55}; + static const unsigned char out2[3][32] = { + {0x9c, 0x23, 0x6c, 0x16, 0x5b, 0x82, 0xae, 0x0c, 0xd5, 0x90, 0x65, 0x9e, 0x10, 0x0b, 0x6b, 0xab, 0x30, 0x36, 0xe7, 0xba, 0x8b, 0x06, 0x74, 0x9b, 0xaf, 0x69, 0x81, 0xe1, 0x6f, 0x1a, 0x2b, 0x95}, + {0xdf, 0x47, 0x10, 0x61, 0x62, 0x5b, 0xc0, 0xea, 0x14, 0xb6, 0x82, 0xfe, 0xee, 0x2c, 0x9c, 0x02, 0xf2, 0x35, 0xda, 0x04, 0x20, 0x4c, 0x1d, 0x62, 0xa1, 0x53, 0x6c, 0x6e, 0x17, 0xae, 0xd7, 0xa9}, + {0x75, 0x97, 0x88, 0x7c, 0xbd, 0x76, 0x32, 0x1f, 0x32, 0xe3, 0x04, 0x40, 0x67, 0x9a, 0x22, 0xcf, 0x7f, 0x8d, 0x9d, 0x2e, 0xac, 0x39, 0x0e, 0x58, 0x1f, 0xea, 0x09, 0x1c, 0xe2, 0x02, 0xba, 0x94} + }; + + secp256k1_rfc6979_hmac_sha256_t rng; + unsigned char out[32]; + unsigned char zero[1] = {0}; + int i; + + secp256k1_rfc6979_hmac_sha256_initialize(&rng, key1, 32, msg1, 32, NULL, 1); + for (i = 0; i < 3; i++) { + secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32); + CHECK(memcmp(out, out1[i], 32) == 0); + } + secp256k1_rfc6979_hmac_sha256_finalize(&rng); + + secp256k1_rfc6979_hmac_sha256_initialize(&rng, key1, 32, msg1, 32, zero, 1); + for (i = 0; i < 3; i++) { + secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32); + CHECK(memcmp(out, out1[i], 32) != 0); + } + secp256k1_rfc6979_hmac_sha256_finalize(&rng); + + secp256k1_rfc6979_hmac_sha256_initialize(&rng, key2, 32, msg2, 32, zero, 0); + for (i = 0; i < 3; i++) { + secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32); + CHECK(memcmp(out, out2[i], 32) == 0); + } + secp256k1_rfc6979_hmac_sha256_finalize(&rng); +} + +/***** NUM TESTS *****/ + +#ifndef USE_NUM_NONE +void random_num_negate(secp256k1_num_t *num) { + if (secp256k1_rand32() & 1) { + secp256k1_num_negate(num); + } +} + +void random_num_order_test(secp256k1_num_t *num) { + secp256k1_scalar_t sc; + random_scalar_order_test(&sc); + secp256k1_scalar_get_num(num, &sc); +} + +void random_num_order(secp256k1_num_t *num) { + secp256k1_scalar_t sc; + random_scalar_order(&sc); + secp256k1_scalar_get_num(num, &sc); +} + +void test_num_negate(void) { + secp256k1_num_t n1; + secp256k1_num_t n2; + random_num_order_test(&n1); /* n1 = R */ + random_num_negate(&n1); + secp256k1_num_copy(&n2, &n1); /* n2 = R */ + secp256k1_num_sub(&n1, &n2, &n1); /* n1 = n2-n1 = 0 */ + CHECK(secp256k1_num_is_zero(&n1)); + secp256k1_num_copy(&n1, &n2); /* n1 = R */ + secp256k1_num_negate(&n1); /* n1 = -R */ + CHECK(!secp256k1_num_is_zero(&n1)); + secp256k1_num_add(&n1, &n2, &n1); /* n1 = n2+n1 = 0 */ + CHECK(secp256k1_num_is_zero(&n1)); + secp256k1_num_copy(&n1, &n2); /* n1 = R */ + secp256k1_num_negate(&n1); /* n1 = -R */ + CHECK(secp256k1_num_is_neg(&n1) != secp256k1_num_is_neg(&n2)); + secp256k1_num_negate(&n1); /* n1 = R */ + CHECK(secp256k1_num_eq(&n1, &n2)); +} + +void test_num_add_sub(void) { + secp256k1_num_t n1; + secp256k1_num_t n2; + secp256k1_num_t n1p2, n2p1, n1m2, n2m1; + int r = secp256k1_rand32(); + random_num_order_test(&n1); /* n1 = R1 */ + if (r & 1) { + random_num_negate(&n1); + } + random_num_order_test(&n2); /* n2 = R2 */ + if (r & 2) { + random_num_negate(&n2); + } + secp256k1_num_add(&n1p2, &n1, &n2); /* n1p2 = R1 + R2 */ + secp256k1_num_add(&n2p1, &n2, &n1); /* n2p1 = R2 + R1 */ + secp256k1_num_sub(&n1m2, &n1, &n2); /* n1m2 = R1 - R2 */ + secp256k1_num_sub(&n2m1, &n2, &n1); /* n2m1 = R2 - R1 */ + CHECK(secp256k1_num_eq(&n1p2, &n2p1)); + CHECK(!secp256k1_num_eq(&n1p2, &n1m2)); + secp256k1_num_negate(&n2m1); /* n2m1 = -R2 + R1 */ + CHECK(secp256k1_num_eq(&n2m1, &n1m2)); + CHECK(!secp256k1_num_eq(&n2m1, &n1)); + secp256k1_num_add(&n2m1, &n2m1, &n2); /* n2m1 = -R2 + R1 + R2 = R1 */ + CHECK(secp256k1_num_eq(&n2m1, &n1)); + CHECK(!secp256k1_num_eq(&n2p1, &n1)); + secp256k1_num_sub(&n2p1, &n2p1, &n2); /* n2p1 = R2 + R1 - R2 = R1 */ + CHECK(secp256k1_num_eq(&n2p1, &n1)); +} + +void run_num_smalltests(void) { + int i; + for (i = 0; i < 100*count; i++) { + test_num_negate(); + test_num_add_sub(); + } +} +#endif + +/***** SCALAR TESTS *****/ + +void scalar_test(void) { + secp256k1_scalar_t s; + secp256k1_scalar_t s1; + secp256k1_scalar_t s2; +#ifndef USE_NUM_NONE + secp256k1_num_t snum, s1num, s2num; + secp256k1_num_t order, half_order; +#endif + unsigned char c[32]; + + /* Set 's' to a random scalar, with value 'snum'. */ + random_scalar_order_test(&s); + + /* Set 's1' to a random scalar, with value 's1num'. */ + random_scalar_order_test(&s1); + + /* Set 's2' to a random scalar, with value 'snum2', and byte array representation 'c'. */ + random_scalar_order_test(&s2); + secp256k1_scalar_get_b32(c, &s2); + +#ifndef USE_NUM_NONE + secp256k1_scalar_get_num(&snum, &s); + secp256k1_scalar_get_num(&s1num, &s1); + secp256k1_scalar_get_num(&s2num, &s2); + + secp256k1_scalar_order_get_num(&order); + half_order = order; + secp256k1_num_shift(&half_order, 1); +#endif + + { + int i; + /* Test that fetching groups of 4 bits from a scalar and recursing n(i)=16*n(i-1)+p(i) reconstructs it. */ + secp256k1_scalar_t n; + secp256k1_scalar_set_int(&n, 0); + for (i = 0; i < 256; i += 4) { + secp256k1_scalar_t t; + int j; + secp256k1_scalar_set_int(&t, secp256k1_scalar_get_bits(&s, 256 - 4 - i, 4)); + for (j = 0; j < 4; j++) { + secp256k1_scalar_add(&n, &n, &n); + } + secp256k1_scalar_add(&n, &n, &t); + } + CHECK(secp256k1_scalar_eq(&n, &s)); + } + + { + /* Test that fetching groups of randomly-sized bits from a scalar and recursing n(i)=b*n(i-1)+p(i) reconstructs it. */ + secp256k1_scalar_t n; + int i = 0; + secp256k1_scalar_set_int(&n, 0); + while (i < 256) { + secp256k1_scalar_t t; + int j; + int now = (secp256k1_rand32() % 15) + 1; + if (now + i > 256) { + now = 256 - i; + } + secp256k1_scalar_set_int(&t, secp256k1_scalar_get_bits_var(&s, 256 - now - i, now)); + for (j = 0; j < now; j++) { + secp256k1_scalar_add(&n, &n, &n); + } + secp256k1_scalar_add(&n, &n, &t); + i += now; + } + CHECK(secp256k1_scalar_eq(&n, &s)); + } + +#ifndef USE_NUM_NONE + { + /* Test that adding the scalars together is equal to adding their numbers together modulo the order. */ + secp256k1_num_t rnum; + secp256k1_num_t r2num; + secp256k1_scalar_t r; + secp256k1_num_add(&rnum, &snum, &s2num); + secp256k1_num_mod(&rnum, &order); + secp256k1_scalar_add(&r, &s, &s2); + secp256k1_scalar_get_num(&r2num, &r); + CHECK(secp256k1_num_eq(&rnum, &r2num)); + } + + { + /* Test that multipying the scalars is equal to multiplying their numbers modulo the order. */ + secp256k1_scalar_t r; + secp256k1_num_t r2num; + secp256k1_num_t rnum; + secp256k1_num_mul(&rnum, &snum, &s2num); + secp256k1_num_mod(&rnum, &order); + secp256k1_scalar_mul(&r, &s, &s2); + secp256k1_scalar_get_num(&r2num, &r); + CHECK(secp256k1_num_eq(&rnum, &r2num)); + /* The result can only be zero if at least one of the factors was zero. */ + CHECK(secp256k1_scalar_is_zero(&r) == (secp256k1_scalar_is_zero(&s) || secp256k1_scalar_is_zero(&s2))); + /* The results can only be equal to one of the factors if that factor was zero, or the other factor was one. */ + CHECK(secp256k1_num_eq(&rnum, &snum) == (secp256k1_scalar_is_zero(&s) || secp256k1_scalar_is_one(&s2))); + CHECK(secp256k1_num_eq(&rnum, &s2num) == (secp256k1_scalar_is_zero(&s2) || secp256k1_scalar_is_one(&s))); + } + + { + secp256k1_scalar_t neg; + secp256k1_num_t negnum; + secp256k1_num_t negnum2; + /* Check that comparison with zero matches comparison with zero on the number. */ + CHECK(secp256k1_num_is_zero(&snum) == secp256k1_scalar_is_zero(&s)); + /* Check that comparison with the half order is equal to testing for high scalar. */ + CHECK(secp256k1_scalar_is_high(&s) == (secp256k1_num_cmp(&snum, &half_order) > 0)); + secp256k1_scalar_negate(&neg, &s); + secp256k1_num_sub(&negnum, &order, &snum); + secp256k1_num_mod(&negnum, &order); + /* Check that comparison with the half order is equal to testing for high scalar after negation. */ + CHECK(secp256k1_scalar_is_high(&neg) == (secp256k1_num_cmp(&negnum, &half_order) > 0)); + /* Negating should change the high property, unless the value was already zero. */ + CHECK((secp256k1_scalar_is_high(&s) == secp256k1_scalar_is_high(&neg)) == secp256k1_scalar_is_zero(&s)); + secp256k1_scalar_get_num(&negnum2, &neg); + /* Negating a scalar should be equal to (order - n) mod order on the number. */ + CHECK(secp256k1_num_eq(&negnum, &negnum2)); + secp256k1_scalar_add(&neg, &neg, &s); + /* Adding a number to its negation should result in zero. */ + CHECK(secp256k1_scalar_is_zero(&neg)); + secp256k1_scalar_negate(&neg, &neg); + /* Negating zero should still result in zero. */ + CHECK(secp256k1_scalar_is_zero(&neg)); + } + + { + /* Test secp256k1_scalar_mul_shift_var. */ + secp256k1_scalar_t r; + secp256k1_num_t one; + secp256k1_num_t rnum; + secp256k1_num_t rnum2; + unsigned char cone[1] = {0x01}; + unsigned int shift = 256 + (secp256k1_rand32() % 257); + secp256k1_scalar_mul_shift_var(&r, &s1, &s2, shift); + secp256k1_num_mul(&rnum, &s1num, &s2num); + secp256k1_num_shift(&rnum, shift - 1); + secp256k1_num_set_bin(&one, cone, 1); + secp256k1_num_add(&rnum, &rnum, &one); + secp256k1_num_shift(&rnum, 1); + secp256k1_scalar_get_num(&rnum2, &r); + CHECK(secp256k1_num_eq(&rnum, &rnum2)); + } +#endif + + { + /* Test that scalar inverses are equal to the inverse of their number modulo the order. */ + if (!secp256k1_scalar_is_zero(&s)) { + secp256k1_scalar_t inv; +#ifndef USE_NUM_NONE + secp256k1_num_t invnum; + secp256k1_num_t invnum2; +#endif + secp256k1_scalar_inverse(&inv, &s); +#ifndef USE_NUM_NONE + secp256k1_num_mod_inverse(&invnum, &snum, &order); + secp256k1_scalar_get_num(&invnum2, &inv); + CHECK(secp256k1_num_eq(&invnum, &invnum2)); +#endif + secp256k1_scalar_mul(&inv, &inv, &s); + /* Multiplying a scalar with its inverse must result in one. */ + CHECK(secp256k1_scalar_is_one(&inv)); + secp256k1_scalar_inverse(&inv, &inv); + /* Inverting one must result in one. */ + CHECK(secp256k1_scalar_is_one(&inv)); + } + } + + { + /* Test commutativity of add. */ + secp256k1_scalar_t r1, r2; + secp256k1_scalar_add(&r1, &s1, &s2); + secp256k1_scalar_add(&r2, &s2, &s1); + CHECK(secp256k1_scalar_eq(&r1, &r2)); + } + + { + secp256k1_scalar_t r1, r2; + secp256k1_scalar_t b; + int i; + /* Test add_bit. */ + int bit = secp256k1_rand32() % 256; + secp256k1_scalar_set_int(&b, 1); + CHECK(secp256k1_scalar_is_one(&b)); + for (i = 0; i < bit; i++) { + secp256k1_scalar_add(&b, &b, &b); + } + r1 = s1; + r2 = s1; + if (!secp256k1_scalar_add(&r1, &r1, &b)) { + /* No overflow happened. */ + secp256k1_scalar_add_bit(&r2, bit); + CHECK(secp256k1_scalar_eq(&r1, &r2)); + } + } + + { + /* Test commutativity of mul. */ + secp256k1_scalar_t r1, r2; + secp256k1_scalar_mul(&r1, &s1, &s2); + secp256k1_scalar_mul(&r2, &s2, &s1); + CHECK(secp256k1_scalar_eq(&r1, &r2)); + } + + { + /* Test associativity of add. */ + secp256k1_scalar_t r1, r2; + secp256k1_scalar_add(&r1, &s1, &s2); + secp256k1_scalar_add(&r1, &r1, &s); + secp256k1_scalar_add(&r2, &s2, &s); + secp256k1_scalar_add(&r2, &s1, &r2); + CHECK(secp256k1_scalar_eq(&r1, &r2)); + } + + { + /* Test associativity of mul. */ + secp256k1_scalar_t r1, r2; + secp256k1_scalar_mul(&r1, &s1, &s2); + secp256k1_scalar_mul(&r1, &r1, &s); + secp256k1_scalar_mul(&r2, &s2, &s); + secp256k1_scalar_mul(&r2, &s1, &r2); + CHECK(secp256k1_scalar_eq(&r1, &r2)); + } + + { + /* Test distributitivity of mul over add. */ + secp256k1_scalar_t r1, r2, t; + secp256k1_scalar_add(&r1, &s1, &s2); + secp256k1_scalar_mul(&r1, &r1, &s); + secp256k1_scalar_mul(&r2, &s1, &s); + secp256k1_scalar_mul(&t, &s2, &s); + secp256k1_scalar_add(&r2, &r2, &t); + CHECK(secp256k1_scalar_eq(&r1, &r2)); + } + + { + /* Test square. */ + secp256k1_scalar_t r1, r2; + secp256k1_scalar_sqr(&r1, &s1); + secp256k1_scalar_mul(&r2, &s1, &s1); + CHECK(secp256k1_scalar_eq(&r1, &r2)); + } + + { + /* Test multiplicative identity. */ + secp256k1_scalar_t r1, v1; + secp256k1_scalar_set_int(&v1,1); + secp256k1_scalar_mul(&r1, &s1, &v1); + CHECK(secp256k1_scalar_eq(&r1, &s1)); + } + + { + /* Test additive identity. */ + secp256k1_scalar_t r1, v0; + secp256k1_scalar_set_int(&v0,0); + secp256k1_scalar_add(&r1, &s1, &v0); + CHECK(secp256k1_scalar_eq(&r1, &s1)); + } + + { + /* Test zero product property. */ + secp256k1_scalar_t r1, v0; + secp256k1_scalar_set_int(&v0,0); + secp256k1_scalar_mul(&r1, &s1, &v0); + CHECK(secp256k1_scalar_eq(&r1, &v0)); + } + +} + +void run_scalar_tests(void) { + int i; + for (i = 0; i < 128 * count; i++) { + scalar_test(); + } + + { + /* (-1)+1 should be zero. */ + secp256k1_scalar_t s, o; + secp256k1_scalar_set_int(&s, 1); + CHECK(secp256k1_scalar_is_one(&s)); + secp256k1_scalar_negate(&o, &s); + secp256k1_scalar_add(&o, &o, &s); + CHECK(secp256k1_scalar_is_zero(&o)); + secp256k1_scalar_negate(&o, &o); + CHECK(secp256k1_scalar_is_zero(&o)); + } + +#ifndef USE_NUM_NONE + { + /* A scalar with value of the curve order should be 0. */ + secp256k1_num_t order; + secp256k1_scalar_t zero; + unsigned char bin[32]; + int overflow = 0; + secp256k1_scalar_order_get_num(&order); + secp256k1_num_get_bin(bin, 32, &order); + secp256k1_scalar_set_b32(&zero, bin, &overflow); + CHECK(overflow == 1); + CHECK(secp256k1_scalar_is_zero(&zero)); + } +#endif +} + +/***** FIELD TESTS *****/ + +void random_fe(secp256k1_fe_t *x) { + unsigned char bin[32]; + do { + secp256k1_rand256(bin); + if (secp256k1_fe_set_b32(x, bin)) { + return; + } + } while(1); +} + +void random_fe_non_zero(secp256k1_fe_t *nz) { + int tries = 10; + while (--tries >= 0) { + random_fe(nz); + secp256k1_fe_normalize(nz); + if (!secp256k1_fe_is_zero(nz)) { + break; + } + } + /* Infinitesimal probability of spurious failure here */ + CHECK(tries >= 0); +} + +void random_fe_non_square(secp256k1_fe_t *ns) { + secp256k1_fe_t r; + random_fe_non_zero(ns); + if (secp256k1_fe_sqrt_var(&r, ns)) { + secp256k1_fe_negate(ns, ns, 1); + } +} + +int check_fe_equal(const secp256k1_fe_t *a, const secp256k1_fe_t *b) { + secp256k1_fe_t an = *a; + secp256k1_fe_t bn = *b; + secp256k1_fe_normalize_weak(&an); + secp256k1_fe_normalize_var(&bn); + return secp256k1_fe_equal_var(&an, &bn); +} + +int check_fe_inverse(const secp256k1_fe_t *a, const secp256k1_fe_t *ai) { + secp256k1_fe_t x; + secp256k1_fe_t one = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1); + secp256k1_fe_mul(&x, a, ai); + return check_fe_equal(&x, &one); +} + +void run_field_convert(void) { + static const unsigned char b32[32] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, + 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, + 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x40 + }; + static const secp256k1_fe_storage_t fes = SECP256K1_FE_STORAGE_CONST( + 0x00010203UL, 0x04050607UL, 0x11121314UL, 0x15161718UL, + 0x22232425UL, 0x26272829UL, 0x33343536UL, 0x37383940UL + ); + static const secp256k1_fe_t fe = SECP256K1_FE_CONST( + 0x00010203UL, 0x04050607UL, 0x11121314UL, 0x15161718UL, + 0x22232425UL, 0x26272829UL, 0x33343536UL, 0x37383940UL + ); + secp256k1_fe_t fe2; + unsigned char b322[32]; + secp256k1_fe_storage_t fes2; + /* Check conversions to fe. */ + CHECK(secp256k1_fe_set_b32(&fe2, b32)); + CHECK(secp256k1_fe_equal_var(&fe, &fe2)); + secp256k1_fe_from_storage(&fe2, &fes); + CHECK(secp256k1_fe_equal_var(&fe, &fe2)); + /* Check conversion from fe. */ + secp256k1_fe_get_b32(b322, &fe); + CHECK(memcmp(b322, b32, 32) == 0); + secp256k1_fe_to_storage(&fes2, &fe); + CHECK(memcmp(&fes2, &fes, sizeof(fes)) == 0); +} + +void run_field_misc(void) { + secp256k1_fe_t x; + secp256k1_fe_t y; + secp256k1_fe_t z; + secp256k1_fe_t q; + secp256k1_fe_t fe5 = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 5); + int i; + for (i = 0; i < 5*count; i++) { + secp256k1_fe_storage_t xs, ys, zs; + random_fe(&x); + random_fe_non_zero(&y); + /* Test the fe equality and comparison operations. */ + CHECK(secp256k1_fe_cmp_var(&x, &x) == 0); + CHECK(secp256k1_fe_equal_var(&x, &x)); + z = x; + secp256k1_fe_add(&z,&y); + /* Test fe conditional move; z is not normalized here. */ + q = x; + secp256k1_fe_cmov(&x, &z, 0); + secp256k1_fe_cmov(&x, &x, 1); + CHECK(memcmp(&x, &z, sizeof(x)) != 0); + CHECK(memcmp(&x, &q, sizeof(x)) == 0); + secp256k1_fe_cmov(&q, &z, 1); + CHECK(memcmp(&q, &z, sizeof(q)) == 0); + /* Test storage conversion and conditional moves. */ + secp256k1_fe_normalize(&z); + CHECK(!secp256k1_fe_equal_var(&x, &z)); + secp256k1_fe_to_storage(&xs, &x); + secp256k1_fe_to_storage(&ys, &y); + secp256k1_fe_to_storage(&zs, &z); + secp256k1_fe_storage_cmov(&zs, &xs, 0); + secp256k1_fe_storage_cmov(&zs, &zs, 1); + CHECK(memcmp(&xs, &zs, sizeof(xs)) != 0); + secp256k1_fe_storage_cmov(&ys, &xs, 1); + CHECK(memcmp(&xs, &ys, sizeof(xs)) == 0); + secp256k1_fe_from_storage(&x, &xs); + secp256k1_fe_from_storage(&y, &ys); + secp256k1_fe_from_storage(&z, &zs); + /* Test that mul_int, mul, and add agree. */ + secp256k1_fe_add(&y, &x); + secp256k1_fe_add(&y, &x); + z = x; + secp256k1_fe_mul_int(&z, 3); + CHECK(check_fe_equal(&y, &z)); + secp256k1_fe_add(&y, &x); + secp256k1_fe_add(&z, &x); + CHECK(check_fe_equal(&z, &y)); + z = x; + secp256k1_fe_mul_int(&z, 5); + secp256k1_fe_mul(&q, &x, &fe5); + CHECK(check_fe_equal(&z, &q)); + secp256k1_fe_negate(&x, &x, 1); + secp256k1_fe_add(&z, &x); + secp256k1_fe_add(&q, &x); + CHECK(check_fe_equal(&y, &z)); + CHECK(check_fe_equal(&q, &y)); + } +} + +void run_field_inv(void) { + secp256k1_fe_t x, xi, xii; + int i; + for (i = 0; i < 10*count; i++) { + random_fe_non_zero(&x); + secp256k1_fe_inv(&xi, &x); + CHECK(check_fe_inverse(&x, &xi)); + secp256k1_fe_inv(&xii, &xi); + CHECK(check_fe_equal(&x, &xii)); + } +} + +void run_field_inv_var(void) { + secp256k1_fe_t x, xi, xii; + int i; + for (i = 0; i < 10*count; i++) { + random_fe_non_zero(&x); + secp256k1_fe_inv_var(&xi, &x); + CHECK(check_fe_inverse(&x, &xi)); + secp256k1_fe_inv_var(&xii, &xi); + CHECK(check_fe_equal(&x, &xii)); + } +} + +void run_field_inv_all_var(void) { + secp256k1_fe_t x[16], xi[16], xii[16]; + int i; + /* Check it's safe to call for 0 elements */ + secp256k1_fe_inv_all_var(0, xi, x); + for (i = 0; i < count; i++) { + size_t j; + size_t len = (secp256k1_rand32() & 15) + 1; + for (j = 0; j < len; j++) { + random_fe_non_zero(&x[j]); + } + secp256k1_fe_inv_all_var(len, xi, x); + for (j = 0; j < len; j++) { + CHECK(check_fe_inverse(&x[j], &xi[j])); + } + secp256k1_fe_inv_all_var(len, xii, xi); + for (j = 0; j < len; j++) { + CHECK(check_fe_equal(&x[j], &xii[j])); + } + } +} + +void run_sqr(void) { + secp256k1_fe_t x, s; + + { + int i; + secp256k1_fe_set_int(&x, 1); + secp256k1_fe_negate(&x, &x, 1); + + for (i = 1; i <= 512; ++i) { + secp256k1_fe_mul_int(&x, 2); + secp256k1_fe_normalize(&x); + secp256k1_fe_sqr(&s, &x); + } + } +} + +void test_sqrt(const secp256k1_fe_t *a, const secp256k1_fe_t *k) { + secp256k1_fe_t r1, r2; + int v = secp256k1_fe_sqrt_var(&r1, a); + CHECK((v == 0) == (k == NULL)); + + if (k != NULL) { + /* Check that the returned root is +/- the given known answer */ + secp256k1_fe_negate(&r2, &r1, 1); + secp256k1_fe_add(&r1, k); secp256k1_fe_add(&r2, k); + secp256k1_fe_normalize(&r1); secp256k1_fe_normalize(&r2); + CHECK(secp256k1_fe_is_zero(&r1) || secp256k1_fe_is_zero(&r2)); + } +} + +void run_sqrt(void) { + secp256k1_fe_t ns, x, s, t; + int i; + + /* Check sqrt(0) is 0 */ + secp256k1_fe_set_int(&x, 0); + secp256k1_fe_sqr(&s, &x); + test_sqrt(&s, &x); + + /* Check sqrt of small squares (and their negatives) */ + for (i = 1; i <= 100; i++) { + secp256k1_fe_set_int(&x, i); + secp256k1_fe_sqr(&s, &x); + test_sqrt(&s, &x); + secp256k1_fe_negate(&t, &s, 1); + test_sqrt(&t, NULL); + } + + /* Consistency checks for large random values */ + for (i = 0; i < 10; i++) { + int j; + random_fe_non_square(&ns); + for (j = 0; j < count; j++) { + random_fe(&x); + secp256k1_fe_sqr(&s, &x); + test_sqrt(&s, &x); + secp256k1_fe_negate(&t, &s, 1); + test_sqrt(&t, NULL); + secp256k1_fe_mul(&t, &s, &ns); + test_sqrt(&t, NULL); + } + } +} + +/***** GROUP TESTS *****/ + +void ge_equals_ge(const secp256k1_ge_t *a, const secp256k1_ge_t *b) { + CHECK(a->infinity == b->infinity); + if (a->infinity) { + return; + } + CHECK(secp256k1_fe_equal_var(&a->x, &b->x)); + CHECK(secp256k1_fe_equal_var(&b->y, &b->y)); +} + +/* This compares jacobian points including their Z, not just their geometric meaning. */ +int gej_xyz_equals_gej(const secp256k1_gej_t *a, const secp256k1_gej_t *b) { + secp256k1_gej_t a2; + secp256k1_gej_t b2; + int ret = 1; + ret &= a->infinity == b->infinity; + if (ret && !a->infinity) { + a2 = *a; + b2 = *b; + secp256k1_fe_normalize(&a2.x); + secp256k1_fe_normalize(&a2.y); + secp256k1_fe_normalize(&a2.z); + secp256k1_fe_normalize(&b2.x); + secp256k1_fe_normalize(&b2.y); + secp256k1_fe_normalize(&b2.z); + ret &= secp256k1_fe_cmp_var(&a2.x, &b2.x) == 0; + ret &= secp256k1_fe_cmp_var(&a2.y, &b2.y) == 0; + ret &= secp256k1_fe_cmp_var(&a2.z, &b2.z) == 0; + } + return ret; +} + +void ge_equals_gej(const secp256k1_ge_t *a, const secp256k1_gej_t *b) { + secp256k1_fe_t z2s; + secp256k1_fe_t u1, u2, s1, s2; + CHECK(a->infinity == b->infinity); + if (a->infinity) { + return; + } + /* Check a.x * b.z^2 == b.x && a.y * b.z^3 == b.y, to avoid inverses. */ + secp256k1_fe_sqr(&z2s, &b->z); + secp256k1_fe_mul(&u1, &a->x, &z2s); + u2 = b->x; secp256k1_fe_normalize_weak(&u2); + secp256k1_fe_mul(&s1, &a->y, &z2s); secp256k1_fe_mul(&s1, &s1, &b->z); + s2 = b->y; secp256k1_fe_normalize_weak(&s2); + CHECK(secp256k1_fe_equal_var(&u1, &u2)); + CHECK(secp256k1_fe_equal_var(&s1, &s2)); +} + +void test_ge(void) { + int i, i1; + int runs = 4; + /* Points: (infinity, p1, p1, -p1, -p1, p2, p2, -p2, -p2, p3, p3, -p3, -p3, p4, p4, -p4, -p4). + * The second in each pair of identical points uses a random Z coordinate in the Jacobian form. + * All magnitudes are randomized. + * All 17*17 combinations of points are added to eachother, using all applicable methods. + */ + secp256k1_ge_t *ge = (secp256k1_ge_t *)malloc(sizeof(secp256k1_ge_t) * (1 + 4 * runs)); + secp256k1_gej_t *gej = (secp256k1_gej_t *)malloc(sizeof(secp256k1_gej_t) * (1 + 4 * runs)); + secp256k1_gej_set_infinity(&gej[0]); + secp256k1_ge_clear(&ge[0]); + secp256k1_ge_set_gej_var(&ge[0], &gej[0]); + for (i = 0; i < runs; i++) { + int j; + secp256k1_ge_t g; + random_group_element_test(&g); + ge[1 + 4 * i] = g; + ge[2 + 4 * i] = g; + secp256k1_ge_neg(&ge[3 + 4 * i], &g); + secp256k1_ge_neg(&ge[4 + 4 * i], &g); + secp256k1_gej_set_ge(&gej[1 + 4 * i], &ge[1 + 4 * i]); + random_group_element_jacobian_test(&gej[2 + 4 * i], &ge[2 + 4 * i]); + secp256k1_gej_set_ge(&gej[3 + 4 * i], &ge[3 + 4 * i]); + random_group_element_jacobian_test(&gej[4 + 4 * i], &ge[4 + 4 * i]); + for (j = 0; j < 4; j++) { + random_field_element_magnitude(&ge[1 + j + 4 * i].x); + random_field_element_magnitude(&ge[1 + j + 4 * i].y); + random_field_element_magnitude(&gej[1 + j + 4 * i].x); + random_field_element_magnitude(&gej[1 + j + 4 * i].y); + random_field_element_magnitude(&gej[1 + j + 4 * i].z); + } + } + + for (i1 = 0; i1 < 1 + 4 * runs; i1++) { + int i2; + for (i2 = 0; i2 < 1 + 4 * runs; i2++) { + /* Compute reference result using gej + gej (var). */ + secp256k1_gej_t refj, resj; + secp256k1_ge_t ref; + secp256k1_gej_add_var(&refj, &gej[i1], &gej[i2]); + secp256k1_ge_set_gej_var(&ref, &refj); + + /* Test gej + ge (var). */ + secp256k1_gej_add_ge_var(&resj, &gej[i1], &ge[i2]); + ge_equals_gej(&ref, &resj); + + /* Test gej + ge (const). */ + if (i2 != 0) { + /* secp256k1_gej_add_ge does not support its second argument being infinity. */ + secp256k1_gej_add_ge(&resj, &gej[i1], &ge[i2]); + ge_equals_gej(&ref, &resj); + } + + /* Test doubling (var). */ + if ((i1 == 0 && i2 == 0) || ((i1 + 3)/4 == (i2 + 3)/4 && ((i1 + 3)%4)/2 == ((i2 + 3)%4)/2)) { + /* Normal doubling. */ + secp256k1_gej_double_var(&resj, &gej[i1]); + ge_equals_gej(&ref, &resj); + secp256k1_gej_double_var(&resj, &gej[i2]); + ge_equals_gej(&ref, &resj); + } + + /* Test adding opposites. */ + if ((i1 == 0 && i2 == 0) || ((i1 + 3)/4 == (i2 + 3)/4 && ((i1 + 3)%4)/2 != ((i2 + 3)%4)/2)) { + CHECK(secp256k1_ge_is_infinity(&ref)); + } + + /* Test adding infinity. */ + if (i1 == 0) { + CHECK(secp256k1_ge_is_infinity(&ge[i1])); + CHECK(secp256k1_gej_is_infinity(&gej[i1])); + ge_equals_gej(&ref, &gej[i2]); + } + if (i2 == 0) { + CHECK(secp256k1_ge_is_infinity(&ge[i2])); + CHECK(secp256k1_gej_is_infinity(&gej[i2])); + ge_equals_gej(&ref, &gej[i1]); + } + } + } + + /* Test adding all points together in random order equals infinity. */ + { + secp256k1_gej_t sum = SECP256K1_GEJ_CONST_INFINITY; + secp256k1_gej_t *gej_shuffled = (secp256k1_gej_t *)malloc((4 * runs + 1) * sizeof(secp256k1_gej_t)); + for (i = 0; i < 4 * runs + 1; i++) { + gej_shuffled[i] = gej[i]; + } + for (i = 0; i < 4 * runs + 1; i++) { + int swap = i + secp256k1_rand32() % (4 * runs + 1 - i); + if (swap != i) { + secp256k1_gej_t t = gej_shuffled[i]; + gej_shuffled[i] = gej_shuffled[swap]; + gej_shuffled[swap] = t; + } + } + for (i = 0; i < 4 * runs + 1; i++) { + secp256k1_gej_add_var(&sum, &sum, &gej_shuffled[i]); + } + CHECK(secp256k1_gej_is_infinity(&sum)); + free(gej_shuffled); + } + + /* Test batch gej -> ge conversion. */ + { + secp256k1_ge_t *ge_set_all = (secp256k1_ge_t *)malloc((4 * runs + 1) * sizeof(secp256k1_ge_t)); + secp256k1_ge_set_all_gej_var(4 * runs + 1, ge_set_all, gej); + for (i = 0; i < 4 * runs + 1; i++) { + secp256k1_fe_t s; + random_fe_non_zero(&s); + secp256k1_gej_rescale(&gej[i], &s); + ge_equals_gej(&ge_set_all[i], &gej[i]); + } + free(ge_set_all); + } + + free(ge); + free(gej); +} + +void run_ge(void) { + int i; + for (i = 0; i < count * 32; i++) { + test_ge(); + } +} + +/***** ECMULT TESTS *****/ + +void run_ecmult_chain(void) { + /* random starting point A (on the curve) */ + secp256k1_gej_t a = SECP256K1_GEJ_CONST( + 0x8b30bbe9, 0xae2a9906, 0x96b22f67, 0x0709dff3, + 0x727fd8bc, 0x04d3362c, 0x6c7bf458, 0xe2846004, + 0xa357ae91, 0x5c4a6528, 0x1309edf2, 0x0504740f, + 0x0eb33439, 0x90216b4f, 0x81063cb6, 0x5f2f7e0f + ); + /* two random initial factors xn and gn */ + secp256k1_scalar_t xn = SECP256K1_SCALAR_CONST( + 0x84cc5452, 0xf7fde1ed, 0xb4d38a8c, 0xe9b1b84c, + 0xcef31f14, 0x6e569be9, 0x705d357a, 0x42985407 + ); + secp256k1_scalar_t gn = SECP256K1_SCALAR_CONST( + 0xa1e58d22, 0x553dcd42, 0xb2398062, 0x5d4c57a9, + 0x6e9323d4, 0x2b3152e5, 0xca2c3990, 0xedc7c9de + ); + /* two small multipliers to be applied to xn and gn in every iteration: */ + static const secp256k1_scalar_t xf = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0x1337); + static const secp256k1_scalar_t gf = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0x7113); + /* accumulators with the resulting coefficients to A and G */ + secp256k1_scalar_t ae = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1); + secp256k1_scalar_t ge = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0); + /* actual points */ + secp256k1_gej_t x = a; + secp256k1_gej_t x2; + int i; + + /* the point being computed */ + x = a; + for (i = 0; i < 200*count; i++) { + /* in each iteration, compute X = xn*X + gn*G; */ + secp256k1_ecmult(&ctx->ecmult_ctx, &x, &x, &xn, &gn); + /* also compute ae and ge: the actual accumulated factors for A and G */ + /* if X was (ae*A+ge*G), xn*X + gn*G results in (xn*ae*A + (xn*ge+gn)*G) */ + secp256k1_scalar_mul(&ae, &ae, &xn); + secp256k1_scalar_mul(&ge, &ge, &xn); + secp256k1_scalar_add(&ge, &ge, &gn); + /* modify xn and gn */ + secp256k1_scalar_mul(&xn, &xn, &xf); + secp256k1_scalar_mul(&gn, &gn, &gf); + + /* verify */ + if (i == 19999) { + /* expected result after 19999 iterations */ + secp256k1_gej_t rp = SECP256K1_GEJ_CONST( + 0xD6E96687, 0xF9B10D09, 0x2A6F3543, 0x9D86CEBE, + 0xA4535D0D, 0x409F5358, 0x6440BD74, 0xB933E830, + 0xB95CBCA2, 0xC77DA786, 0x539BE8FD, 0x53354D2D, + 0x3B4F566A, 0xE6580454, 0x07ED6015, 0xEE1B2A88 + ); + + secp256k1_gej_neg(&rp, &rp); + secp256k1_gej_add_var(&rp, &rp, &x); + CHECK(secp256k1_gej_is_infinity(&rp)); + } + } + /* redo the computation, but directly with the resulting ae and ge coefficients: */ + secp256k1_ecmult(&ctx->ecmult_ctx, &x2, &a, &ae, &ge); + secp256k1_gej_neg(&x2, &x2); + secp256k1_gej_add_var(&x2, &x2, &x); + CHECK(secp256k1_gej_is_infinity(&x2)); +} + +void test_point_times_order(const secp256k1_gej_t *point) { + /* X * (point + G) + (order-X) * (pointer + G) = 0 */ + secp256k1_scalar_t x; + secp256k1_scalar_t nx; + secp256k1_gej_t res1, res2; + secp256k1_ge_t res3; + unsigned char pub[65]; + int psize = 65; + random_scalar_order_test(&x); + secp256k1_scalar_negate(&nx, &x); + secp256k1_ecmult(&ctx->ecmult_ctx, &res1, point, &x, &x); /* calc res1 = x * point + x * G; */ + secp256k1_ecmult(&ctx->ecmult_ctx, &res2, point, &nx, &nx); /* calc res2 = (order - x) * point + (order - x) * G; */ + secp256k1_gej_add_var(&res1, &res1, &res2); + CHECK(secp256k1_gej_is_infinity(&res1)); + CHECK(secp256k1_gej_is_valid_var(&res1) == 0); + secp256k1_ge_set_gej(&res3, &res1); + CHECK(secp256k1_ge_is_infinity(&res3)); + CHECK(secp256k1_ge_is_valid_var(&res3) == 0); + CHECK(secp256k1_eckey_pubkey_serialize(&res3, pub, &psize, 0) == 0); + psize = 65; + CHECK(secp256k1_eckey_pubkey_serialize(&res3, pub, &psize, 1) == 0); +} + +void run_point_times_order(void) { + int i; + secp256k1_fe_t x = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 2); + static const secp256k1_fe_t xr = SECP256K1_FE_CONST( + 0x7603CB59, 0xB0EF6C63, 0xFE608479, 0x2A0C378C, + 0xDB3233A8, 0x0F8A9A09, 0xA877DEAD, 0x31B38C45 + ); + for (i = 0; i < 500; i++) { + secp256k1_ge_t p; + if (secp256k1_ge_set_xo_var(&p, &x, 1)) { + secp256k1_gej_t j; + CHECK(secp256k1_ge_is_valid_var(&p)); + secp256k1_gej_set_ge(&j, &p); + CHECK(secp256k1_gej_is_valid_var(&j)); + test_point_times_order(&j); + } + secp256k1_fe_sqr(&x, &x); + } + secp256k1_fe_normalize_var(&x); + CHECK(secp256k1_fe_equal_var(&x, &xr)); +} + +void test_wnaf(const secp256k1_scalar_t *number, int w) { + secp256k1_scalar_t x, two, t; + int wnaf[256]; + int zeroes = -1; + int i; + int bits; + secp256k1_scalar_set_int(&x, 0); + secp256k1_scalar_set_int(&two, 2); + bits = secp256k1_ecmult_wnaf(wnaf, number, w); + CHECK(bits <= 256); + for (i = bits-1; i >= 0; i--) { + int v = wnaf[i]; + secp256k1_scalar_mul(&x, &x, &two); + if (v) { + CHECK(zeroes == -1 || zeroes >= w-1); /* check that distance between non-zero elements is at least w-1 */ + zeroes=0; + CHECK((v & 1) == 1); /* check non-zero elements are odd */ + CHECK(v <= (1 << (w-1)) - 1); /* check range below */ + CHECK(v >= -(1 << (w-1)) - 1); /* check range above */ + } else { + CHECK(zeroes != -1); /* check that no unnecessary zero padding exists */ + zeroes++; + } + if (v >= 0) { + secp256k1_scalar_set_int(&t, v); + } else { + secp256k1_scalar_set_int(&t, -v); + secp256k1_scalar_negate(&t, &t); + } + secp256k1_scalar_add(&x, &x, &t); + } + CHECK(secp256k1_scalar_eq(&x, number)); /* check that wnaf represents number */ +} + +void run_wnaf(void) { + int i; + secp256k1_scalar_t n; + for (i = 0; i < count; i++) { + random_scalar_order(&n); + test_wnaf(&n, 4+(i%10)); + } +} + +void test_ecmult_constants(void) { + /* Test ecmult_gen() for [0..36) and [order-36..0). */ + secp256k1_scalar_t x; + secp256k1_gej_t r; + secp256k1_ge_t ng; + int i; + int j; + secp256k1_ge_neg(&ng, &secp256k1_ge_const_g); + for (i = 0; i < 36; i++ ) { + secp256k1_scalar_set_int(&x, i); + secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &r, &x); + for (j = 0; j < i; j++) { + if (j == i - 1) { + ge_equals_gej(&secp256k1_ge_const_g, &r); + } + secp256k1_gej_add_ge(&r, &r, &ng); + } + CHECK(secp256k1_gej_is_infinity(&r)); + } + for (i = 1; i <= 36; i++ ) { + secp256k1_scalar_set_int(&x, i); + secp256k1_scalar_negate(&x, &x); + secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &r, &x); + for (j = 0; j < i; j++) { + if (j == i - 1) { + ge_equals_gej(&ng, &r); + } + secp256k1_gej_add_ge(&r, &r, &secp256k1_ge_const_g); + } + CHECK(secp256k1_gej_is_infinity(&r)); + } +} + +void run_ecmult_constants(void) { + test_ecmult_constants(); +} + +void test_ecmult_gen_blind(void) { + /* Test ecmult_gen() blinding and confirm that the blinding changes, the affline points match, and the z's don't match. */ + secp256k1_scalar_t key; + secp256k1_scalar_t b; + unsigned char seed32[32]; + secp256k1_gej_t pgej; + secp256k1_gej_t pgej2; + secp256k1_gej_t i; + secp256k1_ge_t pge; + random_scalar_order_test(&key); + secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pgej, &key); + secp256k1_rand256(seed32); + b = ctx->ecmult_gen_ctx.blind; + i = ctx->ecmult_gen_ctx.initial; + secp256k1_ecmult_gen_blind(&ctx->ecmult_gen_ctx, seed32); + CHECK(!secp256k1_scalar_eq(&b, &ctx->ecmult_gen_ctx.blind)); + secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pgej2, &key); + CHECK(!gej_xyz_equals_gej(&pgej, &pgej2)); + CHECK(!gej_xyz_equals_gej(&i, &ctx->ecmult_gen_ctx.initial)); + secp256k1_ge_set_gej(&pge, &pgej); + ge_equals_gej(&pge, &pgej2); +} + +void test_ecmult_gen_blind_reset(void) { + /* Test ecmult_gen() blinding reset and confirm that the blinding is consistent. */ + secp256k1_scalar_t b; + secp256k1_gej_t initial; + secp256k1_ecmult_gen_blind(&ctx->ecmult_gen_ctx, 0); + b = ctx->ecmult_gen_ctx.blind; + initial = ctx->ecmult_gen_ctx.initial; + secp256k1_ecmult_gen_blind(&ctx->ecmult_gen_ctx, 0); + CHECK(secp256k1_scalar_eq(&b, &ctx->ecmult_gen_ctx.blind)); + CHECK(gej_xyz_equals_gej(&initial, &ctx->ecmult_gen_ctx.initial)); +} + +void run_ecmult_gen_blind(void) { + int i; + test_ecmult_gen_blind_reset(); + for (i = 0; i < 10; i++) { + test_ecmult_gen_blind(); + } +} + + +void random_sign(secp256k1_ecdsa_sig_t *sig, const secp256k1_scalar_t *key, const secp256k1_scalar_t *msg, int *recid) { + secp256k1_scalar_t nonce; + do { + random_scalar_order_test(&nonce); + } while(!secp256k1_ecdsa_sig_sign(&ctx->ecmult_gen_ctx, sig, key, msg, &nonce, recid)); +} + +void test_ecdsa_sign_verify(void) { + secp256k1_gej_t pubj; + secp256k1_ge_t pub; + secp256k1_scalar_t one; + secp256k1_scalar_t msg, key; + secp256k1_ecdsa_sig_t sig; + int recid; + int getrec; + random_scalar_order_test(&msg); + random_scalar_order_test(&key); + secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pubj, &key); + secp256k1_ge_set_gej(&pub, &pubj); + getrec = secp256k1_rand32()&1; + random_sign(&sig, &key, &msg, getrec?&recid:NULL); + if (getrec) { + CHECK(recid >= 0 && recid < 4); + } + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sig, &pub, &msg)); + secp256k1_scalar_set_int(&one, 1); + secp256k1_scalar_add(&msg, &msg, &one); + CHECK(!secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sig, &pub, &msg)); +} + +void run_ecdsa_sign_verify(void) { + int i; + for (i = 0; i < 10*count; i++) { + test_ecdsa_sign_verify(); + } +} + +/** Dummy nonce generation function that just uses a precomputed nonce, and fails if it is not accepted. Use only for testing. */ +static int precomputed_nonce_function(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, unsigned int counter, const void *data) { + (void)msg32; + (void)key32; + memcpy(nonce32, data, 32); + return (counter == 0); +} + +static int nonce_function_test_fail(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, unsigned int counter, const void *data) { + /* Dummy nonce generator that has a fatal error on the first counter value. */ + if (counter == 0) { + return 0; + } + return nonce_function_rfc6979(nonce32, msg32, key32, counter - 1, data); +} + +static int nonce_function_test_retry(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, unsigned int counter, const void *data) { + /* Dummy nonce generator that produces unacceptable nonces for the first several counter values. */ + if (counter < 3) { + memset(nonce32, counter==0 ? 0 : 255, 32); + if (counter == 2) { + nonce32[31]--; + } + return 1; + } + if (counter < 5) { + static const unsigned char order[] = { + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B, + 0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x41 + }; + memcpy(nonce32, order, 32); + if (counter == 4) { + nonce32[31]++; + } + return 1; + } + /* Retry rate of 6979 is negligible esp. as we only call this in determinstic tests. */ + /* If someone does fine a case where it retries for secp256k1, we'd like to know. */ + if (counter > 5) { + return 0; + } + return nonce_function_rfc6979(nonce32, msg32, key32, counter - 5, data); +} + +int is_empty_compact_signature(const unsigned char *sig64) { + static const unsigned char res[64] = {0}; + return memcmp(sig64, res, 64) == 0; +} + +void test_ecdsa_end_to_end(void) { + unsigned char extra[32] = {0x00}; + unsigned char privkey[32]; + unsigned char message[32]; + unsigned char privkey2[32]; + unsigned char csignature[64]; + unsigned char signature[72]; + unsigned char signature2[72]; + unsigned char signature3[72]; + unsigned char signature4[72]; + unsigned char pubkey[65]; + unsigned char recpubkey[65]; + unsigned char seckey[300]; + int signaturelen = 72; + int signaturelen2 = 72; + int signaturelen3 = 72; + int signaturelen4 = 72; + int recid = 0; + int recpubkeylen = 0; + int pubkeylen = 65; + int seckeylen = 300; + + /* Generate a random key and message. */ + { + secp256k1_scalar_t msg, key; + random_scalar_order_test(&msg); + random_scalar_order_test(&key); + secp256k1_scalar_get_b32(privkey, &key); + secp256k1_scalar_get_b32(message, &msg); + } + + /* Construct and verify corresponding public key. */ + CHECK(secp256k1_ec_seckey_verify(ctx, privkey) == 1); + CHECK(secp256k1_ec_pubkey_create(ctx, pubkey, &pubkeylen, privkey, (secp256k1_rand32() & 3) != 0) == 1); + if (secp256k1_rand32() & 1) { + CHECK(secp256k1_ec_pubkey_decompress(ctx, pubkey, &pubkeylen)); + } + CHECK(secp256k1_ec_pubkey_verify(ctx, pubkey, pubkeylen)); + + /* Verify private key import and export. */ + CHECK(secp256k1_ec_privkey_export(ctx, privkey, seckey, &seckeylen, secp256k1_rand32() % 2) == 1); + CHECK(secp256k1_ec_privkey_import(ctx, privkey2, seckey, seckeylen) == 1); + CHECK(memcmp(privkey, privkey2, 32) == 0); + + /* Optionally tweak the keys using addition. */ + if (secp256k1_rand32() % 3 == 0) { + int ret1; + int ret2; + unsigned char rnd[32]; + unsigned char pubkey2[65]; + int pubkeylen2 = 65; + secp256k1_rand256_test(rnd); + ret1 = secp256k1_ec_privkey_tweak_add(ctx, privkey, rnd); + ret2 = secp256k1_ec_pubkey_tweak_add(ctx, pubkey, pubkeylen, rnd); + CHECK(ret1 == ret2); + if (ret1 == 0) { + return; + } + CHECK(secp256k1_ec_pubkey_create(ctx, pubkey2, &pubkeylen2, privkey, pubkeylen == 33) == 1); + CHECK(memcmp(pubkey, pubkey2, pubkeylen) == 0); + } + + /* Optionally tweak the keys using multiplication. */ + if (secp256k1_rand32() % 3 == 0) { + int ret1; + int ret2; + unsigned char rnd[32]; + unsigned char pubkey2[65]; + int pubkeylen2 = 65; + secp256k1_rand256_test(rnd); + ret1 = secp256k1_ec_privkey_tweak_mul(ctx, privkey, rnd); + ret2 = secp256k1_ec_pubkey_tweak_mul(ctx, pubkey, pubkeylen, rnd); + CHECK(ret1 == ret2); + if (ret1 == 0) { + return; + } + CHECK(secp256k1_ec_pubkey_create(ctx, pubkey2, &pubkeylen2, privkey, pubkeylen == 33) == 1); + CHECK(memcmp(pubkey, pubkey2, pubkeylen) == 0); + } + + /* Sign. */ + CHECK(secp256k1_ecdsa_sign(ctx, message, signature, &signaturelen, privkey, NULL, NULL) == 1); + CHECK(signaturelen > 0); + CHECK(secp256k1_ecdsa_sign(ctx, message, signature2, &signaturelen2, privkey, NULL, extra) == 1); + CHECK(signaturelen2 > 0); + extra[31] = 1; + CHECK(secp256k1_ecdsa_sign(ctx, message, signature3, &signaturelen3, privkey, NULL, extra) == 1); + CHECK(signaturelen3 > 0); + extra[31] = 0; + extra[0] = 1; + CHECK(secp256k1_ecdsa_sign(ctx, message, signature4, &signaturelen4, privkey, NULL, extra) == 1); + CHECK(signaturelen3 > 0); + CHECK((signaturelen != signaturelen2) || (memcmp(signature, signature2, signaturelen) != 0)); + CHECK((signaturelen != signaturelen3) || (memcmp(signature, signature3, signaturelen) != 0)); + CHECK((signaturelen3 != signaturelen2) || (memcmp(signature3, signature2, signaturelen3) != 0)); + CHECK((signaturelen4 != signaturelen3) || (memcmp(signature4, signature3, signaturelen4) != 0)); + CHECK((signaturelen4 != signaturelen2) || (memcmp(signature4, signature2, signaturelen4) != 0)); + CHECK((signaturelen4 != signaturelen) || (memcmp(signature4, signature, signaturelen4) != 0)); + /* Verify. */ + CHECK(secp256k1_ecdsa_verify(ctx, message, signature, signaturelen, pubkey, pubkeylen) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, message, signature2, signaturelen2, pubkey, pubkeylen) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, message, signature3, signaturelen3, pubkey, pubkeylen) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, message, signature4, signaturelen4, pubkey, pubkeylen) == 1); + /* Destroy signature and verify again. */ + signature[signaturelen - 1 - secp256k1_rand32() % 20] += 1 + (secp256k1_rand32() % 255); + CHECK(secp256k1_ecdsa_verify(ctx, message, signature, signaturelen, pubkey, pubkeylen) != 1); + + /* Compact sign. */ + CHECK(secp256k1_ecdsa_sign_compact(ctx, message, csignature, privkey, NULL, NULL, &recid) == 1); + CHECK(!is_empty_compact_signature(csignature)); + /* Recover. */ + CHECK(secp256k1_ecdsa_recover_compact(ctx, message, csignature, recpubkey, &recpubkeylen, pubkeylen == 33, recid) == 1); + CHECK(recpubkeylen == pubkeylen); + CHECK(memcmp(pubkey, recpubkey, pubkeylen) == 0); + /* Destroy signature and verify again. */ + csignature[secp256k1_rand32() % 64] += 1 + (secp256k1_rand32() % 255); + CHECK(secp256k1_ecdsa_recover_compact(ctx, message, csignature, recpubkey, &recpubkeylen, pubkeylen == 33, recid) != 1 || + memcmp(pubkey, recpubkey, pubkeylen) != 0); + CHECK(recpubkeylen == pubkeylen); + +} + +void test_random_pubkeys(void) { + secp256k1_ge_t elem; + secp256k1_ge_t elem2; + unsigned char in[65]; + /* Generate some randomly sized pubkeys. */ + uint32_t r = secp256k1_rand32(); + int len = (r & 3) == 0 ? 65 : 33; + r>>=2; + if ((r & 3) == 0) { + len = (r & 252) >> 3; + } + r>>=8; + if (len == 65) { + in[0] = (r & 2) ? 4 : (r & 1? 6 : 7); + } else { + in[0] = (r & 1) ? 2 : 3; + } + r>>=2; + if ((r & 7) == 0) { + in[0] = (r & 2040) >> 3; + } + r>>=11; + if (len > 1) { + secp256k1_rand256(&in[1]); + } + if (len > 33) { + secp256k1_rand256(&in[33]); + } + if (secp256k1_eckey_pubkey_parse(&elem, in, len)) { + unsigned char out[65]; + unsigned char firstb; + int res; + int size = len; + firstb = in[0]; + /* If the pubkey can be parsed, it should round-trip... */ + CHECK(secp256k1_eckey_pubkey_serialize(&elem, out, &size, len == 33)); + CHECK(size == len); + CHECK(memcmp(&in[1], &out[1], len-1) == 0); + /* ... except for the type of hybrid inputs. */ + if ((in[0] != 6) && (in[0] != 7)) { + CHECK(in[0] == out[0]); + } + size = 65; + CHECK(secp256k1_eckey_pubkey_serialize(&elem, in, &size, 0)); + CHECK(size == 65); + CHECK(secp256k1_eckey_pubkey_parse(&elem2, in, size)); + ge_equals_ge(&elem,&elem2); + /* Check that the X9.62 hybrid type is checked. */ + in[0] = (r & 1) ? 6 : 7; + res = secp256k1_eckey_pubkey_parse(&elem2, in, size); + if (firstb == 2 || firstb == 3) { + if (in[0] == firstb + 4) { + CHECK(res); + } else { + CHECK(!res); + } + } + if (res) { + ge_equals_ge(&elem,&elem2); + CHECK(secp256k1_eckey_pubkey_serialize(&elem, out, &size, 0)); + CHECK(memcmp(&in[1], &out[1], 64) == 0); + } + } +} + +void run_random_pubkeys(void) { + int i; + for (i = 0; i < 10*count; i++) { + test_random_pubkeys(); + } +} + +void run_ecdsa_end_to_end(void) { + int i; + for (i = 0; i < 64*count; i++) { + test_ecdsa_end_to_end(); + } +} + +/* Tests several edge cases. */ +void test_ecdsa_edge_cases(void) { + const unsigned char msg32[32] = { + 'T', 'h', 'i', 's', ' ', 'i', 's', ' ', + 'a', ' ', 'v', 'e', 'r', 'y', ' ', 's', + 'e', 'c', 'r', 'e', 't', ' ', 'm', 'e', + 's', 's', 'a', 'g', 'e', '.', '.', '.' + }; + const unsigned char sig64[64] = { + /* Generated by signing the above message with nonce 'This is the nonce we will use...' + * and secret key 0 (which is not valid), resulting in recid 0. */ + 0x67, 0xCB, 0x28, 0x5F, 0x9C, 0xD1, 0x94, 0xE8, + 0x40, 0xD6, 0x29, 0x39, 0x7A, 0xF5, 0x56, 0x96, + 0x62, 0xFD, 0xE4, 0x46, 0x49, 0x99, 0x59, 0x63, + 0x17, 0x9A, 0x7D, 0xD1, 0x7B, 0xD2, 0x35, 0x32, + 0x4B, 0x1B, 0x7D, 0xF3, 0x4C, 0xE1, 0xF6, 0x8E, + 0x69, 0x4F, 0xF6, 0xF1, 0x1A, 0xC7, 0x51, 0xDD, + 0x7D, 0xD7, 0x3E, 0x38, 0x7E, 0xE4, 0xFC, 0x86, + 0x6E, 0x1B, 0xE8, 0xEC, 0xC7, 0xDD, 0x95, 0x57 + }; + unsigned char pubkey[65]; + int t; + int pubkeylen = 65; + /* signature (r,s) = (4,4), which can be recovered with all 4 recids. */ + const unsigned char sigb64[64] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + }; + unsigned char pubkeyb[33]; + int pubkeyblen = 33; + int recid; + + CHECK(!secp256k1_ecdsa_recover_compact(ctx, msg32, sig64, pubkey, &pubkeylen, 0, 0)); + CHECK(secp256k1_ecdsa_recover_compact(ctx, msg32, sig64, pubkey, &pubkeylen, 0, 1)); + CHECK(!secp256k1_ecdsa_recover_compact(ctx, msg32, sig64, pubkey, &pubkeylen, 0, 2)); + CHECK(!secp256k1_ecdsa_recover_compact(ctx, msg32, sig64, pubkey, &pubkeylen, 0, 3)); + + for (recid = 0; recid < 4; recid++) { + int i; + int recid2; + /* (4,4) encoded in DER. */ + unsigned char sigbder[8] = {0x30, 0x06, 0x02, 0x01, 0x04, 0x02, 0x01, 0x04}; + unsigned char sigcder_zr[7] = {0x30, 0x05, 0x02, 0x00, 0x02, 0x01, 0x01}; + unsigned char sigcder_zs[7] = {0x30, 0x05, 0x02, 0x01, 0x01, 0x02, 0x00}; + unsigned char sigbderalt1[39] = { + 0x30, 0x25, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0x04, + }; + unsigned char sigbderalt2[39] = { + 0x30, 0x25, 0x02, 0x01, 0x04, 0x02, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + }; + unsigned char sigbderalt3[40] = { + 0x30, 0x26, 0x02, 0x21, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0x04, + }; + unsigned char sigbderalt4[40] = { + 0x30, 0x26, 0x02, 0x01, 0x04, 0x02, 0x21, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + }; + /* (order + r,4) encoded in DER. */ + unsigned char sigbderlong[40] = { + 0x30, 0x26, 0x02, 0x21, 0x00, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xBA, 0xAE, 0xDC, + 0xE6, 0xAF, 0x48, 0xA0, 0x3B, 0xBF, 0xD2, 0x5E, + 0x8C, 0xD0, 0x36, 0x41, 0x45, 0x02, 0x01, 0x04 + }; + CHECK(secp256k1_ecdsa_recover_compact(ctx, msg32, sigb64, pubkeyb, &pubkeyblen, 1, recid)); + CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbder, sizeof(sigbder), pubkeyb, pubkeyblen) == 1); + for (recid2 = 0; recid2 < 4; recid2++) { + unsigned char pubkey2b[33]; + int pubkey2blen = 33; + CHECK(secp256k1_ecdsa_recover_compact(ctx, msg32, sigb64, pubkey2b, &pubkey2blen, 1, recid2)); + /* Verifying with (order + r,4) should always fail. */ + CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbderlong, sizeof(sigbderlong), pubkey2b, pubkey2blen) != 1); + } + /* DER parsing tests. */ + /* Zero length r/s. */ + CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigcder_zr, sizeof(sigcder_zr), pubkeyb, pubkeyblen) == -2); + CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigcder_zs, sizeof(sigcder_zs), pubkeyb, pubkeyblen) == -2); + /* Leading zeros. */ + CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbderalt1, sizeof(sigbderalt1), pubkeyb, pubkeyblen) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbderalt2, sizeof(sigbderalt2), pubkeyb, pubkeyblen) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbderalt3, sizeof(sigbderalt3), pubkeyb, pubkeyblen) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbderalt4, sizeof(sigbderalt4), pubkeyb, pubkeyblen) == 1); + sigbderalt3[4] = 1; + CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbderalt3, sizeof(sigbderalt3), pubkeyb, pubkeyblen) == -2); + sigbderalt4[7] = 1; + CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbderalt4, sizeof(sigbderalt4), pubkeyb, pubkeyblen) == -2); + /* Damage signature. */ + sigbder[7]++; + CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbder, sizeof(sigbder), pubkeyb, pubkeyblen) == 0); + sigbder[7]--; + CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbder, 6, pubkeyb, pubkeyblen) == -2); + CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbder, sizeof(sigbder)-1, pubkeyb, pubkeyblen) == -2); + for(i = 0; i < 8; i++) { + int c; + unsigned char orig = sigbder[i]; + /*Try every single-byte change.*/ + for (c = 0; c < 256; c++) { + if (c == orig ) { + continue; + } + sigbder[i] = c; + CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbder, sizeof(sigbder), pubkeyb, pubkeyblen) == + (i==4 || i==7) ? 0 : -2 ); + } + sigbder[i] = orig; + } + } + + /* Test the case where ECDSA recomputes a point that is infinity. */ + { + secp256k1_gej_t keyj; + secp256k1_ge_t key; + secp256k1_scalar_t msg; + secp256k1_ecdsa_sig_t sig; + secp256k1_scalar_set_int(&sig.s, 1); + secp256k1_scalar_negate(&sig.s, &sig.s); + secp256k1_scalar_inverse(&sig.s, &sig.s); + secp256k1_scalar_set_int(&sig.r, 1); + secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &keyj, &sig.r); + secp256k1_ge_set_gej(&key, &keyj); + msg = sig.s; + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sig, &key, &msg) == 0); + } + + /* Test r/s equal to zero */ + { + /* (1,1) encoded in DER. */ + unsigned char sigcder[8] = {0x30, 0x06, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01}; + unsigned char sigc64[64] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + }; + unsigned char pubkeyc[65]; + int pubkeyclen = 65; + CHECK(secp256k1_ecdsa_recover_compact(ctx, msg32, sigc64, pubkeyc, &pubkeyclen, 0, 0) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigcder, sizeof(sigcder), pubkeyc, pubkeyclen) == 1); + sigcder[4] = 0; + sigc64[31] = 0; + CHECK(secp256k1_ecdsa_recover_compact(ctx, msg32, sigc64, pubkeyb, &pubkeyblen, 1, 0) == 0); + CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigcder, sizeof(sigcder), pubkeyc, pubkeyclen) == 0); + sigcder[4] = 1; + sigcder[7] = 0; + sigc64[31] = 1; + sigc64[63] = 0; + CHECK(secp256k1_ecdsa_recover_compact(ctx, msg32, sigc64, pubkeyb, &pubkeyblen, 1, 0) == 0); + CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigcder, sizeof(sigcder), pubkeyc, pubkeyclen) == 0); + } + + /*Signature where s would be zero.*/ + { + const unsigned char nonce[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + }; + static const unsigned char nonce2[32] = { + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B, + 0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x40 + }; + const unsigned char key[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + }; + unsigned char msg[32] = { + 0x86, 0x41, 0x99, 0x81, 0x06, 0x23, 0x44, 0x53, + 0xaa, 0x5f, 0x9d, 0x6a, 0x31, 0x78, 0xf4, 0xf7, + 0xb8, 0x12, 0xe0, 0x0b, 0x81, 0x7a, 0x77, 0x62, + 0x65, 0xdf, 0xdd, 0x31, 0xb9, 0x3e, 0x29, 0xa9, + }; + unsigned char sig[72]; + int siglen = 72; + CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, precomputed_nonce_function, nonce) == 0); + CHECK(siglen == 0); + CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, precomputed_nonce_function, nonce2) == 0); + CHECK(siglen == 0); + msg[31] = 0xaa; + siglen = 72; + CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, precomputed_nonce_function, nonce) == 1); + CHECK(siglen > 0); + CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, precomputed_nonce_function, nonce2) == 1); + CHECK(siglen > 0); + siglen = 10; + CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, precomputed_nonce_function, nonce) != 1); + CHECK(siglen == 0); + } + + /* Nonce function corner cases. */ + for (t = 0; t < 2; t++) { + static const unsigned char zero[32] = {0x00}; + int i; + unsigned char key[32]; + unsigned char msg[32]; + unsigned char sig[72]; + unsigned char sig2[72]; + secp256k1_ecdsa_sig_t s[512]; + int siglen = 72; + int siglen2 = 72; + int recid2; + const unsigned char *extra; + extra = t == 0 ? NULL : zero; + memset(msg, 0, 32); + msg[31] = 1; + /* High key results in signature failure. */ + memset(key, 0xFF, 32); + CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, NULL, extra) == 0); + CHECK(siglen == 0); + /* Zero key results in signature failure. */ + memset(key, 0, 32); + CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, NULL, extra) == 0); + CHECK(siglen == 0); + /* Nonce function failure results in signature failure. */ + key[31] = 1; + CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, nonce_function_test_fail, extra) == 0); + CHECK(siglen == 0); + CHECK(secp256k1_ecdsa_sign_compact(ctx, msg, sig, key, nonce_function_test_fail, extra, &recid) == 0); + CHECK(is_empty_compact_signature(sig)); + /* The retry loop successfully makes its way to the first good value. */ + siglen = 72; + CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, nonce_function_test_retry, extra) == 1); + CHECK(siglen > 0); + CHECK(secp256k1_ecdsa_sign(ctx, msg, sig2, &siglen2, key, nonce_function_rfc6979, extra) == 1); + CHECK(siglen > 0); + CHECK((siglen == siglen2) && (memcmp(sig, sig2, siglen) == 0)); + CHECK(secp256k1_ecdsa_sign_compact(ctx, msg, sig, key, nonce_function_test_retry, extra, &recid) == 1); + CHECK(!is_empty_compact_signature(sig)); + CHECK(secp256k1_ecdsa_sign_compact(ctx, msg, sig2, key, nonce_function_rfc6979, extra, &recid2) == 1); + CHECK(!is_empty_compact_signature(sig2)); + CHECK((recid == recid2) && (memcmp(sig, sig2, 64) == 0)); + /* The default nonce function is determinstic. */ + siglen = 72; + siglen2 = 72; + CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, NULL, extra) == 1); + CHECK(siglen > 0); + CHECK(secp256k1_ecdsa_sign(ctx, msg, sig2, &siglen2, key, NULL, extra) == 1); + CHECK(siglen2 > 0); + CHECK((siglen == siglen2) && (memcmp(sig, sig2, siglen) == 0)); + CHECK(secp256k1_ecdsa_sign_compact(ctx, msg, sig, key, NULL, extra, &recid) == 1); + CHECK(!is_empty_compact_signature(sig)); + CHECK(secp256k1_ecdsa_sign_compact(ctx, msg, sig2, key, NULL, extra, &recid2) == 1); + CHECK(!is_empty_compact_signature(sig)); + CHECK((recid == recid2) && (memcmp(sig, sig2, 64) == 0)); + /* The default nonce function changes output with different messages. */ + for(i = 0; i < 256; i++) { + int j; + siglen2 = 72; + msg[0] = i; + CHECK(secp256k1_ecdsa_sign(ctx, msg, sig2, &siglen2, key, NULL, extra) == 1); + CHECK(!is_empty_compact_signature(sig)); + CHECK(secp256k1_ecdsa_sig_parse(&s[i], sig2, siglen2)); + for (j = 0; j < i; j++) { + CHECK(!secp256k1_scalar_eq(&s[i].r, &s[j].r)); + } + } + msg[0] = 0; + msg[31] = 2; + /* The default nonce function changes output with different keys. */ + for(i = 256; i < 512; i++) { + int j; + siglen2 = 72; + key[0] = i - 256; + CHECK(secp256k1_ecdsa_sign(ctx, msg, sig2, &siglen2, key, NULL, extra) == 1); + CHECK(secp256k1_ecdsa_sig_parse(&s[i], sig2, siglen2)); + for (j = 0; j < i; j++) { + CHECK(!secp256k1_scalar_eq(&s[i].r, &s[j].r)); + } + } + key[0] = 0; + } + + /* Privkey export where pubkey is the point at infinity. */ + { + unsigned char privkey[300]; + unsigned char seckey[32] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, + 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41, + }; + int outlen = 300; + CHECK(!secp256k1_ec_privkey_export(ctx, seckey, privkey, &outlen, 0)); + CHECK(!secp256k1_ec_privkey_export(ctx, seckey, privkey, &outlen, 1)); + } +} + +void run_ecdsa_edge_cases(void) { + test_ecdsa_edge_cases(); +} + +#ifdef ENABLE_OPENSSL_TESTS +EC_KEY *get_openssl_key(const secp256k1_scalar_t *key) { + unsigned char privkey[300]; + int privkeylen; + const unsigned char* pbegin = privkey; + int compr = secp256k1_rand32() & 1; + EC_KEY *ec_key = EC_KEY_new_by_curve_name(NID_secp256k1); + CHECK(secp256k1_eckey_privkey_serialize(&ctx->ecmult_gen_ctx, privkey, &privkeylen, key, compr)); + CHECK(d2i_ECPrivateKey(&ec_key, &pbegin, privkeylen)); + CHECK(EC_KEY_check_key(ec_key)); + return ec_key; +} + +void test_ecdsa_openssl(void) { + secp256k1_gej_t qj; + secp256k1_ge_t q; + secp256k1_ecdsa_sig_t sig; + secp256k1_scalar_t one; + secp256k1_scalar_t msg2; + secp256k1_scalar_t key, msg; + EC_KEY *ec_key; + unsigned int sigsize = 80; + int secp_sigsize = 80; + unsigned char message[32]; + unsigned char signature[80]; + secp256k1_rand256_test(message); + secp256k1_scalar_set_b32(&msg, message, NULL); + random_scalar_order_test(&key); + secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &qj, &key); + secp256k1_ge_set_gej(&q, &qj); + ec_key = get_openssl_key(&key); + CHECK(ec_key); + CHECK(ECDSA_sign(0, message, sizeof(message), signature, &sigsize, ec_key)); + CHECK(secp256k1_ecdsa_sig_parse(&sig, signature, sigsize)); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sig, &q, &msg)); + secp256k1_scalar_set_int(&one, 1); + secp256k1_scalar_add(&msg2, &msg, &one); + CHECK(!secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sig, &q, &msg2)); + + random_sign(&sig, &key, &msg, NULL); + CHECK(secp256k1_ecdsa_sig_serialize(signature, &secp_sigsize, &sig)); + CHECK(ECDSA_verify(0, message, sizeof(message), signature, secp_sigsize, ec_key) == 1); + + EC_KEY_free(ec_key); +} + +void run_ecdsa_openssl(void) { + int i; + for (i = 0; i < 10*count; i++) { + test_ecdsa_openssl(); + } +} +#endif + +int main(int argc, char **argv) { + unsigned char seed16[16] = {0}; + unsigned char run32[32] = {0}; + /* find iteration count */ + if (argc > 1) { + count = strtol(argv[1], NULL, 0); + } + + /* find random seed */ + if (argc > 2) { + int pos = 0; + const char* ch = argv[2]; + while (pos < 16 && ch[0] != 0 && ch[1] != 0) { + unsigned short sh; + if (sscanf(ch, "%2hx", &sh)) { + seed16[pos] = sh; + } else { + break; + } + ch += 2; + pos++; + } + } else { + FILE *frand = fopen("/dev/urandom", "r"); + if (!frand || !fread(&seed16, sizeof(seed16), 1, frand)) { + uint64_t t = time(NULL) * (uint64_t)1337; + seed16[0] ^= t; + seed16[1] ^= t >> 8; + seed16[2] ^= t >> 16; + seed16[3] ^= t >> 24; + seed16[4] ^= t >> 32; + seed16[5] ^= t >> 40; + seed16[6] ^= t >> 48; + seed16[7] ^= t >> 56; + } + fclose(frand); + } + secp256k1_rand_seed(seed16); + + printf("test count = %i\n", count); + printf("random seed = %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n", seed16[0], seed16[1], seed16[2], seed16[3], seed16[4], seed16[5], seed16[6], seed16[7], seed16[8], seed16[9], seed16[10], seed16[11], seed16[12], seed16[13], seed16[14], seed16[15]); + + /* initialize */ + run_context_tests(); + ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); + + if (secp256k1_rand32() & 1) { + secp256k1_rand256(run32); + CHECK(secp256k1_context_randomize(ctx, secp256k1_rand32() & 1 ? run32 : NULL)); + } + + run_sha256_tests(); + run_hmac_sha256_tests(); + run_rfc6979_hmac_sha256_tests(); + +#ifndef USE_NUM_NONE + /* num tests */ + run_num_smalltests(); +#endif + + /* scalar tests */ + run_scalar_tests(); + + /* field tests */ + run_field_inv(); + run_field_inv_var(); + run_field_inv_all_var(); + run_field_misc(); + run_field_convert(); + run_sqr(); + run_sqrt(); + + /* group tests */ + run_ge(); + + /* ecmult tests */ + run_wnaf(); + run_point_times_order(); + run_ecmult_chain(); + run_ecmult_constants(); + run_ecmult_gen_blind(); + + /* ecdsa tests */ + run_random_pubkeys(); + run_ecdsa_sign_verify(); + run_ecdsa_end_to_end(); + run_ecdsa_edge_cases(); +#ifdef ENABLE_OPENSSL_TESTS + run_ecdsa_openssl(); +#endif + + secp256k1_rand256(run32); + printf("random run = %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n", run32[0], run32[1], run32[2], run32[3], run32[4], run32[5], run32[6], run32[7], run32[8], run32[9], run32[10], run32[11], run32[12], run32[13], run32[14], run32[15]); + + /* shutdown */ + secp256k1_context_destroy(ctx); + return 0; +} diff --git a/src/cryptoconditions/src/include/secp256k1/src/util.h b/src/cryptoconditions/src/include/secp256k1/src/util.h new file mode 100644 index 000000000..ae98639f7 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/util.h @@ -0,0 +1,104 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_UTIL_H_ +#define _SECP256K1_UTIL_H_ + +#if defined HAVE_CONFIG_H +#include "libsecp256k1-config.h" +#endif + +#include +#include +#include + +#ifdef DETERMINISTIC +#define TEST_FAILURE(msg) do { \ + fprintf(stderr, "%s\n", msg); \ + abort(); \ +} while(0); +#else +#define TEST_FAILURE(msg) do { \ + fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, msg); \ + abort(); \ +} while(0) +#endif + +#ifdef HAVE_BUILTIN_EXPECT +#define EXPECT(x,c) __builtin_expect((x),(c)) +#else +#define EXPECT(x,c) (x) +#endif + +#ifdef DETERMINISTIC +#define CHECK(cond) do { \ + if (EXPECT(!(cond), 0)) { \ + TEST_FAILURE("test condition failed"); \ + } \ +} while(0) +#else +#define CHECK(cond) do { \ + if (EXPECT(!(cond), 0)) { \ + TEST_FAILURE("test condition failed: " #cond); \ + } \ +} while(0) +#endif + +/* Like assert(), but safe to use on expressions with side effects. */ +#ifndef NDEBUG +#define DEBUG_CHECK CHECK +#else +#define DEBUG_CHECK(cond) do { (void)(cond); } while(0) +#endif + +/* Like DEBUG_CHECK(), but when VERIFY is defined instead of NDEBUG not defined. */ +#ifdef VERIFY +#define VERIFY_CHECK CHECK +#else +#define VERIFY_CHECK(cond) do { (void)(cond); } while(0) +#endif + +static SECP256K1_INLINE void *checked_malloc(size_t size) { + void *ret = malloc(size); + CHECK(ret != NULL); + return ret; +} + +/* Macro for restrict, when available and not in a VERIFY build. */ +#if defined(SECP256K1_BUILD) && defined(VERIFY) +# define SECP256K1_RESTRICT +#else +# if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) ) +# if SECP256K1_GNUC_PREREQ(3,0) +# define SECP256K1_RESTRICT __restrict__ +# elif (defined(_MSC_VER) && _MSC_VER >= 1400) +# define SECP256K1_RESTRICT __restrict +# else +# define SECP256K1_RESTRICT +# endif +# else +# define SECP256K1_RESTRICT restrict +# endif +#endif + +#if defined(_WIN32) +# define I64FORMAT "I64d" +# define I64uFORMAT "I64u" +#else +# define I64FORMAT "lld" +# define I64uFORMAT "llu" +#endif + +#if defined(HAVE___INT128) +# if defined(__GNUC__) +# define SECP256K1_GNUC_EXT __extension__ +# else +# define SECP256K1_GNUC_EXT +# endif +SECP256K1_GNUC_EXT typedef unsigned __int128 uint128_t; +#endif + +#endif diff --git a/src/cryptoconditions/src/include/sha256.c b/src/cryptoconditions/src/include/sha256.c new file mode 100644 index 000000000..e273836ce --- /dev/null +++ b/src/cryptoconditions/src/include/sha256.c @@ -0,0 +1,264 @@ +/*- + * Copyright 2005 Colin Percival + * Copyright 2013 Christian Mehlis & René Kijewski + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: src/lib/libmd/sha256c.c,v 1.2 2006/01/17 15:35:56 phk Exp $ + */ + +/** + * @ingroup sys_crypto + * @{ + * + * @file sha256.c + * @brief SHA256 hash function implementation + * + * @author Colin Percival + * @author Christian Mehlis + * @author Rene Kijewski + * + * @} + */ + +#include "sha256.h" + +#define memcpy __builtin_memcpy +#define memset __builtin_memset + +#ifdef __BIG_ENDIAN__ +/* Copy a vector of big-endian uint32_t into a vector of bytes */ +#define be32enc_vect memcpy + +/* Copy a vector of bytes into a vector of big-endian uint32_t */ +#define be32dec_vect memcpy + +#else /* !__BIG_ENDIAN__ */ + +/* + * Encode a length len/4 vector of (uint32_t) into a length len vector of + * (unsigned char) in big-endian form. Assumes len is a multiple of 4. + */ +static void be32enc_vect(void *dst_, const void *src_, size_t len) +{ + uint32_t *dst = dst_; + const uint32_t *src = src_; + size_t i; + + for (i = 0; i < len / 4; i++) { + dst[i] = __builtin_bswap32(src[i]); + } +} + +/* + * Decode a big-endian length len vector of (unsigned char) into a length + * len/4 vector of (uint32_t). Assumes len is a multiple of 4. + */ +#define be32dec_vect be32enc_vect + +#endif /* __BYTE_ORDER__ != __ORDER_BIG_ENDIAN__ */ + +/* Elementary functions used by SHA256 */ +#define Ch(x, y, z) ((x & (y ^ z)) ^ z) +#define Maj(x, y, z) ((x & (y | z)) | (y & z)) +#define SHR(x, n) (x >> n) +#define ROTR(x, n) ((x >> n) | (x << (32 - n))) +#define S0(x) (ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22)) +#define S1(x) (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25)) +#define s0(x) (ROTR(x, 7) ^ ROTR(x, 18) ^ SHR(x, 3)) +#define s1(x) (ROTR(x, 17) ^ ROTR(x, 19) ^ SHR(x, 10)) + +static const uint32_t K[64] = { + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, + 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, + 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, + 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2, +}; + +/* + * SHA256 block compression function. The 256-bit state is transformed via + * the 512-bit input block to produce a new state. + */ +static void sha256_transform(uint32_t *state, const unsigned char block[64]) +{ + uint32_t W[64]; + uint32_t S[8]; + int i; + + /* 1. Prepare message schedule W. */ + be32dec_vect(W, block, 64); + for (i = 16; i < 64; i++) { + W[i] = s1(W[i - 2]) + W[i - 7] + s0(W[i - 15]) + W[i - 16]; + } + + /* 2. Initialize working variables. */ + memcpy(S, state, 32); + + /* 3. Mix. */ + for (i = 0; i < 64; ++i) { + uint32_t e = S[(68 - i) % 8], f = S[(69 - i) % 8]; + uint32_t g = S[(70 - i) % 8], h = S[(71 - i) % 8]; + uint32_t t0 = h + S1(e) + Ch(e, f, g) + W[i] + K[i]; + + uint32_t a = S[(64 - i) % 8], b = S[(65 - i) % 8]; + uint32_t c = S[(66 - i) % 8], d = S[(67 - i) % 8]; + uint32_t t1 = S0(a) + Maj(a, b, c); + + S[(67 - i) % 8] = d + t0; + S[(71 - i) % 8] = t0 + t1; + } + + /* 4. Mix local working variables into global state */ + for (i = 0; i < 8; i++) { + state[i] += S[i]; + } +} + +/* Add padding and terminating bit-count. */ +static void sha256_pad(sha256_context_t *ctx) +{ + + const unsigned char PAD[64] = { + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + /* + * Convert length to a vector of bytes -- we do this now rather + * than later because the length will change after we pad. + */ + unsigned char len[8]; + be32enc_vect(len, ctx->count, 8); + + /* Add 1--64 bytes so that the resulting length is 56 mod 64 */ + uint32_t r = (ctx->count[1] >> 3) & 0x3f; + uint32_t plen = (r < 56) ? (56 - r) : (120 - r); + sha256_update(ctx, PAD, (size_t) plen); + + /* Add the terminating bit-count */ + sha256_update(ctx, len, 8); +} + +/* SHA-256 initialization. Begins a SHA-256 operation. */ +void sha256_init(sha256_context_t *ctx) +{ + /* Zero bits processed so far */ + ctx->count[0] = ctx->count[1] = 0; + + /* Magic initialization constants */ + ctx->state[0] = 0x6A09E667; + ctx->state[1] = 0xBB67AE85; + ctx->state[2] = 0x3C6EF372; + ctx->state[3] = 0xA54FF53A; + ctx->state[4] = 0x510E527F; + ctx->state[5] = 0x9B05688C; + ctx->state[6] = 0x1F83D9AB; + ctx->state[7] = 0x5BE0CD19; +} + +/* Add bytes into the hash */ +void sha256_update(sha256_context_t *ctx, const void *in, size_t len) +{ + /* Number of bytes left in the buffer from previous updates */ + uint32_t r = (ctx->count[1] >> 3) & 0x3f; + + /* Convert the length into a number of bits */ + uint32_t bitlen1 = ((uint32_t) len) << 3; + uint32_t bitlen0 = ((uint32_t) len) >> 29; + + /* Update number of bits */ + if ((ctx->count[1] += bitlen1) < bitlen1) { + ctx->count[0]++; + } + + ctx->count[0] += bitlen0; + + /* Handle the case where we don't need to perform any transforms */ + if (len < 64 - r) { + memcpy(&ctx->buf[r], in, len); + return; + } + + /* Finish the current block */ + const unsigned char *src = in; + + memcpy(&ctx->buf[r], src, 64 - r); + sha256_transform(ctx->state, ctx->buf); + src += 64 - r; + len -= 64 - r; + + /* Perform complete blocks */ + while (len >= 64) { + sha256_transform(ctx->state, src); + src += 64; + len -= 64; + } + + /* Copy left over data into buffer */ + memcpy(ctx->buf, src, len); +} + +/* + * SHA-256 finalization. Pads the input data, exports the hash value, + * and clears the context state. + */ +void sha256_final(unsigned char digest[32], sha256_context_t *ctx) +{ + /* Add padding */ + sha256_pad(ctx); + + /* Write the hash */ + be32enc_vect(digest, ctx->state, 32); + + /* Clear the context state */ + memset((void *) ctx, 0, sizeof(*ctx)); +} + +unsigned char *sha256(const unsigned char *d, size_t n, unsigned char *md) +{ + sha256_context_t c __attribute__((aligned(4))); + static unsigned char m[SHA256_DIGEST_LENGTH] __attribute__((aligned(4))); + + if (md == NULL) { + md = m; + } + + sha256_init(&c); + sha256_update(&c, d, n); + sha256_final(md, &c); + + return md; +} diff --git a/src/cryptoconditions/src/include/sha256.h b/src/cryptoconditions/src/include/sha256.h new file mode 100644 index 000000000..7bbf3f43a --- /dev/null +++ b/src/cryptoconditions/src/include/sha256.h @@ -0,0 +1,114 @@ +/*- + * Copyright 2005 Colin Percival + * Copyright 2013 Christian Mehlis & René Kijewski + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: src/lib/libmd/sha256.h,v 1.1.2.1 2005/06/24 13:32:25 cperciva Exp $ + */ + +/** + * @defgroup sys_sha256 SHA264 + * @ingroup sys + * @brief SHA264 hash generator + */ + +/** + * @ingroup sys_crypto + * @{ + * + * @file sha256.h + * @brief Header definitions for the SHA256 hash function + * + * @author Colin Percival + * @author Christian Mehlis + * @author Rene Kijewski + */ + +#ifndef _SHA256_H_ +#define _SHA256_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define SHA256_DIGEST_LENGTH 32 + +/** + * @brief Context for ciper operatins based on sha256 + */ +typedef struct { + /** global state */ + uint32_t state[8]; + /** processed bytes counter */ + uint32_t count[2]; + /** data buffer */ + unsigned char buf[64]; +} sha256_context_t; + +/** + * @brief SHA-256 initialization. Begins a SHA-256 operation. + * + * @param ctx sha256_context_t handle to init + */ +void sha256_init(sha256_context_t *ctx); + +/** + * @brief Add bytes into the hash + * + * @param ctx sha256_context_t handle to use + * @param in pointer to the input buffer + * @param len length of the buffer + */ +void sha256_update(sha256_context_t *ctx, const void *in, size_t len); + +/** + * @brief SHA-256 finalization. Pads the input data, exports the hash value, + * and clears the context state. + * + * @param digest resulting digest, this is the hash of all the bytes + * @param ctx sha256_context_t handle to use + */ +void sha256_final(unsigned char digest[32], sha256_context_t *ctx); + +/** + * @brief A wrapper function to simplify the generation of a hash, this is + * usefull for generating sha256 for one buffer + * + * @param d pointer to the buffer to generate hash from + * @param n length of the buffer + * @param md optional pointer to an array for the result, length must be + * SHA256_DIGEST_LENGTH + * if md == NULL, one static buffer is used + */ +unsigned char *sha256(const unsigned char *d, size_t n, unsigned char *md); + +#ifdef __cplusplus +} +#endif + +/** @} */ +#endif /* _SHA256_H_ */ diff --git a/src/cryptoconditions/src/include/tweetnacl.c b/src/cryptoconditions/src/include/tweetnacl.c new file mode 100644 index 000000000..8ac0a1806 --- /dev/null +++ b/src/cryptoconditions/src/include/tweetnacl.c @@ -0,0 +1,809 @@ +#include "tweetnacl.h" +#define FOR(i,n) for (i = 0;i < n;++i) +#define sv static void + +typedef unsigned char u8; +typedef unsigned long u32; +typedef unsigned long long u64; +typedef long long i64; +typedef i64 gf[16]; +extern void randombytes(u8 *,u64); + +static const u8 + _0[16], + _9[32] = {9}; +static const gf + gf0, + gf1 = {1}, + _121665 = {0xDB41,1}, + D = {0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203}, + D2 = {0xf159, 0x26b2, 0x9b94, 0xebd6, 0xb156, 0x8283, 0x149a, 0x00e0, 0xd130, 0xeef3, 0x80f2, 0x198e, 0xfce7, 0x56df, 0xd9dc, 0x2406}, + X = {0xd51a, 0x8f25, 0x2d60, 0xc956, 0xa7b2, 0x9525, 0xc760, 0x692c, 0xdc5c, 0xfdd6, 0xe231, 0xc0a4, 0x53fe, 0xcd6e, 0x36d3, 0x2169}, + Y = {0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666}, + I = {0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83}; + +static u32 L32(u32 x,int c) { return (x << c) | ((x&0xffffffff) >> (32 - c)); } + +static u32 ld32(const u8 *x) +{ + u32 u = x[3]; + u = (u<<8)|x[2]; + u = (u<<8)|x[1]; + return (u<<8)|x[0]; +} + +static u64 dl64(const u8 *x) +{ + u64 i,u=0; + FOR(i,8) u=(u<<8)|x[i]; + return u; +} + +sv st32(u8 *x,u32 u) +{ + int i; + FOR(i,4) { x[i] = u; u >>= 8; } +} + +sv ts64(u8 *x,u64 u) +{ + int i; + for (i = 7;i >= 0;--i) { x[i] = u; u >>= 8; } +} + +static int vn(const u8 *x,const u8 *y,int n) +{ + u32 i,d = 0; + FOR(i,n) d |= x[i]^y[i]; + return (1 & ((d - 1) >> 8)) - 1; +} + +int crypto_verify_16(const u8 *x,const u8 *y) +{ + return vn(x,y,16); +} + +int crypto_verify_32(const u8 *x,const u8 *y) +{ + return vn(x,y,32); +} + +sv core(u8 *out,const u8 *in,const u8 *k,const u8 *c,int h) +{ + u32 w[16],x[16],y[16],t[4]; + int i,j,m; + + FOR(i,4) { + x[5*i] = ld32(c+4*i); + x[1+i] = ld32(k+4*i); + x[6+i] = ld32(in+4*i); + x[11+i] = ld32(k+16+4*i); + } + + FOR(i,16) y[i] = x[i]; + + FOR(i,20) { + FOR(j,4) { + FOR(m,4) t[m] = x[(5*j+4*m)%16]; + t[1] ^= L32(t[0]+t[3], 7); + t[2] ^= L32(t[1]+t[0], 9); + t[3] ^= L32(t[2]+t[1],13); + t[0] ^= L32(t[3]+t[2],18); + FOR(m,4) w[4*j+(j+m)%4] = t[m]; + } + FOR(m,16) x[m] = w[m]; + } + + if (h) { + FOR(i,16) x[i] += y[i]; + FOR(i,4) { + x[5*i] -= ld32(c+4*i); + x[6+i] -= ld32(in+4*i); + } + FOR(i,4) { + st32(out+4*i,x[5*i]); + st32(out+16+4*i,x[6+i]); + } + } else + FOR(i,16) st32(out + 4 * i,x[i] + y[i]); +} + +int crypto_core_salsa20(u8 *out,const u8 *in,const u8 *k,const u8 *c) +{ + core(out,in,k,c,0); + return 0; +} + +int crypto_core_hsalsa20(u8 *out,const u8 *in,const u8 *k,const u8 *c) +{ + core(out,in,k,c,1); + return 0; +} + +static const u8 sigma[16] = "expand 32-byte k"; + +int crypto_stream_salsa20_xor(u8 *c,const u8 *m,u64 b,const u8 *n,const u8 *k) +{ + u8 z[16],x[64]; + u32 u,i; + if (!b) return 0; + FOR(i,16) z[i] = 0; + FOR(i,8) z[i] = n[i]; + while (b >= 64) { + crypto_core_salsa20(x,z,k,sigma); + FOR(i,64) c[i] = (m?m[i]:0) ^ x[i]; + u = 1; + for (i = 8;i < 16;++i) { + u += (u32) z[i]; + z[i] = u; + u >>= 8; + } + b -= 64; + c += 64; + if (m) m += 64; + } + if (b) { + crypto_core_salsa20(x,z,k,sigma); + FOR(i,b) c[i] = (m?m[i]:0) ^ x[i]; + } + return 0; +} + +int crypto_stream_salsa20(u8 *c,u64 d,const u8 *n,const u8 *k) +{ + return crypto_stream_salsa20_xor(c,0,d,n,k); +} + +int crypto_stream(u8 *c,u64 d,const u8 *n,const u8 *k) +{ + u8 s[32]; + crypto_core_hsalsa20(s,n,k,sigma); + return crypto_stream_salsa20(c,d,n+16,s); +} + +int crypto_stream_xor(u8 *c,const u8 *m,u64 d,const u8 *n,const u8 *k) +{ + u8 s[32]; + crypto_core_hsalsa20(s,n,k,sigma); + return crypto_stream_salsa20_xor(c,m,d,n+16,s); +} + +sv add1305(u32 *h,const u32 *c) +{ + u32 j,u = 0; + FOR(j,17) { + u += h[j] + c[j]; + h[j] = u & 255; + u >>= 8; + } +} + +static const u32 minusp[17] = { + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252 +} ; + +int crypto_onetimeauth(u8 *out,const u8 *m,u64 n,const u8 *k) +{ + u32 s,i,j,u,x[17],r[17],h[17],c[17],g[17]; + + FOR(j,17) r[j]=h[j]=0; + FOR(j,16) r[j]=k[j]; + r[3]&=15; + r[4]&=252; + r[7]&=15; + r[8]&=252; + r[11]&=15; + r[12]&=252; + r[15]&=15; + + while (n > 0) { + FOR(j,17) c[j] = 0; + for (j = 0;(j < 16) && (j < n);++j) c[j] = m[j]; + c[j] = 1; + m += j; n -= j; + add1305(h,c); + FOR(i,17) { + x[i] = 0; + FOR(j,17) x[i] += h[j] * ((j <= i) ? r[i - j] : 320 * r[i + 17 - j]); + } + FOR(i,17) h[i] = x[i]; + u = 0; + FOR(j,16) { + u += h[j]; + h[j] = u & 255; + u >>= 8; + } + u += h[16]; h[16] = u & 3; + u = 5 * (u >> 2); + FOR(j,16) { + u += h[j]; + h[j] = u & 255; + u >>= 8; + } + u += h[16]; h[16] = u; + } + + FOR(j,17) g[j] = h[j]; + add1305(h,minusp); + s = -(h[16] >> 7); + FOR(j,17) h[j] ^= s & (g[j] ^ h[j]); + + FOR(j,16) c[j] = k[j + 16]; + c[16] = 0; + add1305(h,c); + FOR(j,16) out[j] = h[j]; + return 0; +} + +int crypto_onetimeauth_verify(const u8 *h,const u8 *m,u64 n,const u8 *k) +{ + u8 x[16]; + crypto_onetimeauth(x,m,n,k); + return crypto_verify_16(h,x); +} + +int crypto_secretbox(u8 *c,const u8 *m,u64 d,const u8 *n,const u8 *k) +{ + int i; + if (d < 32) return -1; + crypto_stream_xor(c,m,d,n,k); + crypto_onetimeauth(c + 16,c + 32,d - 32,c); + FOR(i,16) c[i] = 0; + return 0; +} + +int crypto_secretbox_open(u8 *m,const u8 *c,u64 d,const u8 *n,const u8 *k) +{ + int i; + u8 x[32]; + if (d < 32) return -1; + crypto_stream(x,32,n,k); + if (crypto_onetimeauth_verify(c + 16,c + 32,d - 32,x) != 0) return -1; + crypto_stream_xor(m,c,d,n,k); + FOR(i,32) m[i] = 0; + return 0; +} + +sv set25519(gf r, const gf a) +{ + int i; + FOR(i,16) r[i]=a[i]; +} + +sv car25519(gf o) +{ + int i; + i64 c; + FOR(i,16) { + o[i]+=(1LL<<16); + c=o[i]>>16; + o[(i+1)*(i<15)]+=c-1+37*(c-1)*(i==15); + o[i]-=c<<16; + } +} + +sv sel25519(gf p,gf q,int b) +{ + i64 t,i,c=~(b-1); + FOR(i,16) { + t= c&(p[i]^q[i]); + p[i]^=t; + q[i]^=t; + } +} + +sv pack25519(u8 *o,const gf n) +{ + int i,j,b; + gf m,t; + FOR(i,16) t[i]=n[i]; + car25519(t); + car25519(t); + car25519(t); + FOR(j,2) { + m[0]=t[0]-0xffed; + for(i=1;i<15;i++) { + m[i]=t[i]-0xffff-((m[i-1]>>16)&1); + m[i-1]&=0xffff; + } + m[15]=t[15]-0x7fff-((m[14]>>16)&1); + b=(m[15]>>16)&1; + m[14]&=0xffff; + sel25519(t,m,1-b); + } + FOR(i,16) { + o[2*i]=t[i]&0xff; + o[2*i+1]=t[i]>>8; + } +} + +static int neq25519(const gf a, const gf b) +{ + u8 c[32],d[32]; + pack25519(c,a); + pack25519(d,b); + return crypto_verify_32(c,d); +} + +static u8 par25519(const gf a) +{ + u8 d[32]; + pack25519(d,a); + return d[0]&1; +} + +sv unpack25519(gf o, const u8 *n) +{ + int i; + FOR(i,16) o[i]=n[2*i]+((i64)n[2*i+1]<<8); + o[15]&=0x7fff; +} + +sv A(gf o,const gf a,const gf b) +{ + int i; + FOR(i,16) o[i]=a[i]+b[i]; +} + +sv Z(gf o,const gf a,const gf b) +{ + int i; + FOR(i,16) o[i]=a[i]-b[i]; +} + +sv M(gf o,const gf a,const gf b) +{ + i64 i,j,t[31]; + FOR(i,31) t[i]=0; + FOR(i,16) FOR(j,16) t[i+j]+=a[i]*b[j]; + FOR(i,15) t[i]+=38*t[i+16]; + FOR(i,16) o[i]=t[i]; + car25519(o); + car25519(o); +} + +sv S(gf o,const gf a) +{ + M(o,a,a); +} + +sv inv25519(gf o,const gf i) +{ + gf c; + int a; + FOR(a,16) c[a]=i[a]; + for(a=253;a>=0;a--) { + S(c,c); + if(a!=2&&a!=4) M(c,c,i); + } + FOR(a,16) o[a]=c[a]; +} + +sv pow2523(gf o,const gf i) +{ + gf c; + int a; + FOR(a,16) c[a]=i[a]; + for(a=250;a>=0;a--) { + S(c,c); + if(a!=1) M(c,c,i); + } + FOR(a,16) o[a]=c[a]; +} + +int crypto_scalarmult(u8 *q,const u8 *n,const u8 *p) +{ + u8 z[32]; + i64 x[80],r,i; + gf a,b,c,d,e,f; + FOR(i,31) z[i]=n[i]; + z[31]=(n[31]&127)|64; + z[0]&=248; + unpack25519(x,p); + FOR(i,16) { + b[i]=x[i]; + d[i]=a[i]=c[i]=0; + } + a[0]=d[0]=1; + for(i=254;i>=0;--i) { + r=(z[i>>3]>>(i&7))&1; + sel25519(a,b,r); + sel25519(c,d,r); + A(e,a,c); + Z(a,a,c); + A(c,b,d); + Z(b,b,d); + S(d,e); + S(f,a); + M(a,c,a); + M(c,b,e); + A(e,a,c); + Z(a,a,c); + S(b,a); + Z(c,d,f); + M(a,c,_121665); + A(a,a,d); + M(c,c,a); + M(a,d,f); + M(d,b,x); + S(b,e); + sel25519(a,b,r); + sel25519(c,d,r); + } + FOR(i,16) { + x[i+16]=a[i]; + x[i+32]=c[i]; + x[i+48]=b[i]; + x[i+64]=d[i]; + } + inv25519(x+32,x+32); + M(x+16,x+16,x+32); + pack25519(q,x+16); + return 0; +} + +int crypto_scalarmult_base(u8 *q,const u8 *n) +{ + return crypto_scalarmult(q,n,_9); +} + +int crypto_box_keypair(u8 *y,u8 *x) +{ + randombytes(x,32); + return crypto_scalarmult_base(y,x); +} + +int crypto_box_beforenm(u8 *k,const u8 *y,const u8 *x) +{ + u8 s[32]; + crypto_scalarmult(s,x,y); + return crypto_core_hsalsa20(k,_0,s,sigma); +} + +int crypto_box_afternm(u8 *c,const u8 *m,u64 d,const u8 *n,const u8 *k) +{ + return crypto_secretbox(c,m,d,n,k); +} + +int crypto_box_open_afternm(u8 *m,const u8 *c,u64 d,const u8 *n,const u8 *k) +{ + return crypto_secretbox_open(m,c,d,n,k); +} + +int crypto_box(u8 *c,const u8 *m,u64 d,const u8 *n,const u8 *y,const u8 *x) +{ + u8 k[32]; + crypto_box_beforenm(k,y,x); + return crypto_box_afternm(c,m,d,n,k); +} + +int crypto_box_open(u8 *m,const u8 *c,u64 d,const u8 *n,const u8 *y,const u8 *x) +{ + u8 k[32]; + crypto_box_beforenm(k,y,x); + return crypto_box_open_afternm(m,c,d,n,k); +} + +static u64 R(u64 x,int c) { return (x >> c) | (x << (64 - c)); } +static u64 Ch(u64 x,u64 y,u64 z) { return (x & y) ^ (~x & z); } +static u64 Maj(u64 x,u64 y,u64 z) { return (x & y) ^ (x & z) ^ (y & z); } +static u64 Sigma0(u64 x) { return R(x,28) ^ R(x,34) ^ R(x,39); } +static u64 Sigma1(u64 x) { return R(x,14) ^ R(x,18) ^ R(x,41); } +static u64 sigma0(u64 x) { return R(x, 1) ^ R(x, 8) ^ (x >> 7); } +static u64 sigma1(u64 x) { return R(x,19) ^ R(x,61) ^ (x >> 6); } + +static const u64 K[80] = +{ + 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, 0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL, + 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL, 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL, + 0xd807aa98a3030242ULL, 0x12835b0145706fbeULL, 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL, + 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL, 0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL, + 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL, 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL, + 0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL, 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL, + 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL, 0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL, + 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL, 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL, + 0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL, 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL, + 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL, 0x81c2c92e47edaee6ULL, 0x92722c851482353bULL, + 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL, 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL, + 0xd192e819d6ef5218ULL, 0xd69906245565a910ULL, 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL, + 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL, 0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL, + 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL, 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL, + 0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL, 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL, + 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL, 0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL, + 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL, 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL, + 0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL, 0x113f9804bef90daeULL, 0x1b710b35131c471bULL, + 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL, 0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL, + 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL, 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL +}; + +int crypto_hashblocks(u8 *x,const u8 *m,u64 n) +{ + u64 z[8],b[8],a[8],w[16],t; + int i,j; + + FOR(i,8) z[i] = a[i] = dl64(x + 8 * i); + + while (n >= 128) { + FOR(i,16) w[i] = dl64(m + 8 * i); + + FOR(i,80) { + FOR(j,8) b[j] = a[j]; + t = a[7] + Sigma1(a[4]) + Ch(a[4],a[5],a[6]) + K[i] + w[i%16]; + b[7] = t + Sigma0(a[0]) + Maj(a[0],a[1],a[2]); + b[3] += t; + FOR(j,8) a[(j+1)%8] = b[j]; + if (i%16 == 15) + FOR(j,16) + w[j] += w[(j+9)%16] + sigma0(w[(j+1)%16]) + sigma1(w[(j+14)%16]); + } + + FOR(i,8) { a[i] += z[i]; z[i] = a[i]; } + + m += 128; + n -= 128; + } + + FOR(i,8) ts64(x+8*i,z[i]); + + return n; +} + +static const u8 iv[64] = { + 0x6a,0x09,0xe6,0x67,0xf3,0xbc,0xc9,0x08, + 0xbb,0x67,0xae,0x85,0x84,0xca,0xa7,0x3b, + 0x3c,0x6e,0xf3,0x72,0xfe,0x94,0xf8,0x2b, + 0xa5,0x4f,0xf5,0x3a,0x5f,0x1d,0x36,0xf1, + 0x51,0x0e,0x52,0x7f,0xad,0xe6,0x82,0xd1, + 0x9b,0x05,0x68,0x8c,0x2b,0x3e,0x6c,0x1f, + 0x1f,0x83,0xd9,0xab,0xfb,0x41,0xbd,0x6b, + 0x5b,0xe0,0xcd,0x19,0x13,0x7e,0x21,0x79 +} ; + +int crypto_hash(u8 *out,const u8 *m,u64 n) +{ + u8 h[64],x[256]; + u64 i,b = n; + + FOR(i,64) h[i] = iv[i]; + + crypto_hashblocks(h,m,n); + m += n; + n &= 127; + m -= n; + + FOR(i,256) x[i] = 0; + FOR(i,n) x[i] = m[i]; + x[n] = 128; + + n = 256-128*(n<112); + x[n-9] = b >> 61; + ts64(x+n-8,b<<3); + crypto_hashblocks(h,x,n); + + FOR(i,64) out[i] = h[i]; + + return 0; +} + +sv add(gf p[4],gf q[4]) +{ + gf a,b,c,d,t,e,f,g,h; + + Z(a, p[1], p[0]); + Z(t, q[1], q[0]); + M(a, a, t); + A(b, p[0], p[1]); + A(t, q[0], q[1]); + M(b, b, t); + M(c, p[3], q[3]); + M(c, c, D2); + M(d, p[2], q[2]); + A(d, d, d); + Z(e, b, a); + Z(f, d, c); + A(g, d, c); + A(h, b, a); + + M(p[0], e, f); + M(p[1], h, g); + M(p[2], g, f); + M(p[3], e, h); +} + +sv cswap(gf p[4],gf q[4],u8 b) +{ + int i; + FOR(i,4) + sel25519(p[i],q[i],b); +} + +sv pack(u8 *r,gf p[4]) +{ + gf tx, ty, zi; + inv25519(zi, p[2]); + M(tx, p[0], zi); + M(ty, p[1], zi); + pack25519(r, ty); + r[31] ^= par25519(tx) << 7; +} + +sv scalarmult(gf p[4],gf q[4],const u8 *s) +{ + int i; + set25519(p[0],gf0); + set25519(p[1],gf1); + set25519(p[2],gf1); + set25519(p[3],gf0); + for (i = 255;i >= 0;--i) { + u8 b = (s[i/8]>>(i&7))&1; + cswap(p,q,b); + add(q,p); + add(p,p); + cswap(p,q,b); + } +} + +sv scalarbase(gf p[4],const u8 *s) +{ + gf q[4]; + set25519(q[0],X); + set25519(q[1],Y); + set25519(q[2],gf1); + M(q[3],X,Y); + scalarmult(p,q,s); +} + +int crypto_sign_keypair(u8 *pk, u8 *sk) +{ + u8 d[64]; + gf p[4]; + int i; + + randombytes(sk, 32); + crypto_hash(d, sk, 32); + d[0] &= 248; + d[31] &= 127; + d[31] |= 64; + + scalarbase(p,d); + pack(pk,p); + + FOR(i,32) sk[32 + i] = pk[i]; + return 0; +} + +static const u64 L[32] = {0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10}; + +sv modL(u8 *r,i64 x[64]) +{ + i64 carry,i,j; + for (i = 63;i >= 32;--i) { + carry = 0; + for (j = i - 32;j < i - 12;++j) { + x[j] += carry - 16 * x[i] * L[j - (i - 32)]; + carry = (x[j] + 128) >> 8; + x[j] -= carry << 8; + } + x[j] += carry; + x[i] = 0; + } + carry = 0; + FOR(j,32) { + x[j] += carry - (x[31] >> 4) * L[j]; + carry = x[j] >> 8; + x[j] &= 255; + } + FOR(j,32) x[j] -= carry * L[j]; + FOR(i,32) { + x[i+1] += x[i] >> 8; + r[i] = x[i] & 255; + } +} + +sv reduce(u8 *r) +{ + i64 x[64],i; + FOR(i,64) x[i] = (u64) r[i]; + FOR(i,64) r[i] = 0; + modL(r,x); +} + +int crypto_sign(u8 *sm,u64 *smlen,const u8 *m,u64 n,const u8 *sk) +{ + u8 d[64],h[64],r[64]; + i64 i,j,x[64]; + gf p[4]; + + crypto_hash(d, sk, 32); + d[0] &= 248; + d[31] &= 127; + d[31] |= 64; + + *smlen = n+64; + FOR(i,n) sm[64 + i] = m[i]; + FOR(i,32) sm[32 + i] = d[32 + i]; + + crypto_hash(r, sm+32, n+32); + reduce(r); + scalarbase(p,r); + pack(sm,p); + + FOR(i,32) sm[i+32] = sk[i+32]; + crypto_hash(h,sm,n + 64); + reduce(h); + + FOR(i,64) x[i] = 0; + FOR(i,32) x[i] = (u64) r[i]; + FOR(i,32) FOR(j,32) x[i+j] += h[i] * (u64) d[j]; + modL(sm + 32,x); + + return 0; +} + +static int unpackneg(gf r[4],const u8 p[32]) +{ + gf t, chk, num, den, den2, den4, den6; + set25519(r[2],gf1); + unpack25519(r[1],p); + S(num,r[1]); + M(den,num,D); + Z(num,num,r[2]); + A(den,r[2],den); + + S(den2,den); + S(den4,den2); + M(den6,den4,den2); + M(t,den6,num); + M(t,t,den); + + pow2523(t,t); + M(t,t,num); + M(t,t,den); + M(t,t,den); + M(r[0],t,den); + + S(chk,r[0]); + M(chk,chk,den); + if (neq25519(chk, num)) M(r[0],r[0],I); + + S(chk,r[0]); + M(chk,chk,den); + if (neq25519(chk, num)) return -1; + + if (par25519(r[0]) == (p[31]>>7)) Z(r[0],gf0,r[0]); + + M(r[3],r[0],r[1]); + return 0; +} + +int crypto_sign_open(u8 *m,u64 *mlen,const u8 *sm,u64 n,const u8 *pk) +{ + int i; + u8 t[32],h[64]; + gf p[4],q[4]; + + *mlen = -1; + if (n < 64) return -1; + + if (unpackneg(q,pk)) return -1; + + FOR(i,n) m[i] = sm[i]; + FOR(i,32) m[i+32] = pk[i]; + crypto_hash(h,m,n); + reduce(h); + scalarmult(p,q,h); + + scalarbase(q,sm + 32); + add(p,q); + pack(t,p); + + n -= 64; + if (crypto_verify_32(sm, t)) { + FOR(i,n) m[i] = 0; + return -1; + } + + FOR(i,n) m[i] = sm[i + 64]; + *mlen = n; + return 0; +} diff --git a/src/cryptoconditions/src/include/tweetnacl.h b/src/cryptoconditions/src/include/tweetnacl.h new file mode 100644 index 000000000..9277fbf8f --- /dev/null +++ b/src/cryptoconditions/src/include/tweetnacl.h @@ -0,0 +1,272 @@ +#ifndef TWEETNACL_H +#define TWEETNACL_H +#define crypto_auth_PRIMITIVE "hmacsha512256" +#define crypto_auth crypto_auth_hmacsha512256 +#define crypto_auth_verify crypto_auth_hmacsha512256_verify +#define crypto_auth_BYTES crypto_auth_hmacsha512256_BYTES +#define crypto_auth_KEYBYTES crypto_auth_hmacsha512256_KEYBYTES +#define crypto_auth_IMPLEMENTATION crypto_auth_hmacsha512256_IMPLEMENTATION +#define crypto_auth_VERSION crypto_auth_hmacsha512256_VERSION +#define crypto_auth_hmacsha512256_tweet_BYTES 32 +#define crypto_auth_hmacsha512256_tweet_KEYBYTES 32 +extern int crypto_auth_hmacsha512256_tweet(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *); +extern int crypto_auth_hmacsha512256_tweet_verify(const unsigned char *,const unsigned char *,unsigned long long,const unsigned char *); +#define crypto_auth_hmacsha512256_tweet_VERSION "-" +#define crypto_auth_hmacsha512256 crypto_auth_hmacsha512256_tweet +#define crypto_auth_hmacsha512256_verify crypto_auth_hmacsha512256_tweet_verify +#define crypto_auth_hmacsha512256_BYTES crypto_auth_hmacsha512256_tweet_BYTES +#define crypto_auth_hmacsha512256_KEYBYTES crypto_auth_hmacsha512256_tweet_KEYBYTES +#define crypto_auth_hmacsha512256_VERSION crypto_auth_hmacsha512256_tweet_VERSION +#define crypto_auth_hmacsha512256_IMPLEMENTATION "crypto_auth/hmacsha512256/tweet" +#define crypto_box_PRIMITIVE "curve25519xsalsa20poly1305" +#define crypto_box crypto_box_curve25519xsalsa20poly1305 +#define crypto_box_open crypto_box_curve25519xsalsa20poly1305_open +#define crypto_box_keypair crypto_box_curve25519xsalsa20poly1305_keypair +#define crypto_box_beforenm crypto_box_curve25519xsalsa20poly1305_beforenm +#define crypto_box_afternm crypto_box_curve25519xsalsa20poly1305_afternm +#define crypto_box_open_afternm crypto_box_curve25519xsalsa20poly1305_open_afternm +#define crypto_box_PUBLICKEYBYTES crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES +#define crypto_box_SECRETKEYBYTES crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES +#define crypto_box_BEFORENMBYTES crypto_box_curve25519xsalsa20poly1305_BEFORENMBYTES +#define crypto_box_NONCEBYTES crypto_box_curve25519xsalsa20poly1305_NONCEBYTES +#define crypto_box_ZEROBYTES crypto_box_curve25519xsalsa20poly1305_ZEROBYTES +#define crypto_box_BOXZEROBYTES crypto_box_curve25519xsalsa20poly1305_BOXZEROBYTES +#define crypto_box_IMPLEMENTATION crypto_box_curve25519xsalsa20poly1305_IMPLEMENTATION +#define crypto_box_VERSION crypto_box_curve25519xsalsa20poly1305_VERSION +#define crypto_box_curve25519xsalsa20poly1305_tweet_PUBLICKEYBYTES 32 +#define crypto_box_curve25519xsalsa20poly1305_tweet_SECRETKEYBYTES 32 +#define crypto_box_curve25519xsalsa20poly1305_tweet_BEFORENMBYTES 32 +#define crypto_box_curve25519xsalsa20poly1305_tweet_NONCEBYTES 24 +#define crypto_box_curve25519xsalsa20poly1305_tweet_ZEROBYTES 32 +#define crypto_box_curve25519xsalsa20poly1305_tweet_BOXZEROBYTES 16 +extern int crypto_box_curve25519xsalsa20poly1305_tweet(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *,const unsigned char *,const unsigned char *); +extern int crypto_box_curve25519xsalsa20poly1305_tweet_open(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *,const unsigned char *,const unsigned char *); +extern int crypto_box_curve25519xsalsa20poly1305_tweet_keypair(unsigned char *,unsigned char *); +extern int crypto_box_curve25519xsalsa20poly1305_tweet_beforenm(unsigned char *,const unsigned char *,const unsigned char *); +extern int crypto_box_curve25519xsalsa20poly1305_tweet_afternm(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *,const unsigned char *); +extern int crypto_box_curve25519xsalsa20poly1305_tweet_open_afternm(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *,const unsigned char *); +#define crypto_box_curve25519xsalsa20poly1305_tweet_VERSION "-" +#define crypto_box_curve25519xsalsa20poly1305 crypto_box_curve25519xsalsa20poly1305_tweet +#define crypto_box_curve25519xsalsa20poly1305_open crypto_box_curve25519xsalsa20poly1305_tweet_open +#define crypto_box_curve25519xsalsa20poly1305_keypair crypto_box_curve25519xsalsa20poly1305_tweet_keypair +#define crypto_box_curve25519xsalsa20poly1305_beforenm crypto_box_curve25519xsalsa20poly1305_tweet_beforenm +#define crypto_box_curve25519xsalsa20poly1305_afternm crypto_box_curve25519xsalsa20poly1305_tweet_afternm +#define crypto_box_curve25519xsalsa20poly1305_open_afternm crypto_box_curve25519xsalsa20poly1305_tweet_open_afternm +#define crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES crypto_box_curve25519xsalsa20poly1305_tweet_PUBLICKEYBYTES +#define crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES crypto_box_curve25519xsalsa20poly1305_tweet_SECRETKEYBYTES +#define crypto_box_curve25519xsalsa20poly1305_BEFORENMBYTES crypto_box_curve25519xsalsa20poly1305_tweet_BEFORENMBYTES +#define crypto_box_curve25519xsalsa20poly1305_NONCEBYTES crypto_box_curve25519xsalsa20poly1305_tweet_NONCEBYTES +#define crypto_box_curve25519xsalsa20poly1305_ZEROBYTES crypto_box_curve25519xsalsa20poly1305_tweet_ZEROBYTES +#define crypto_box_curve25519xsalsa20poly1305_BOXZEROBYTES crypto_box_curve25519xsalsa20poly1305_tweet_BOXZEROBYTES +#define crypto_box_curve25519xsalsa20poly1305_VERSION crypto_box_curve25519xsalsa20poly1305_tweet_VERSION +#define crypto_box_curve25519xsalsa20poly1305_IMPLEMENTATION "crypto_box/curve25519xsalsa20poly1305/tweet" +#define crypto_core_PRIMITIVE "salsa20" +#define crypto_core crypto_core_salsa20 +#define crypto_core_OUTPUTBYTES crypto_core_salsa20_OUTPUTBYTES +#define crypto_core_INPUTBYTES crypto_core_salsa20_INPUTBYTES +#define crypto_core_KEYBYTES crypto_core_salsa20_KEYBYTES +#define crypto_core_CONSTBYTES crypto_core_salsa20_CONSTBYTES +#define crypto_core_IMPLEMENTATION crypto_core_salsa20_IMPLEMENTATION +#define crypto_core_VERSION crypto_core_salsa20_VERSION +#define crypto_core_salsa20_tweet_OUTPUTBYTES 64 +#define crypto_core_salsa20_tweet_INPUTBYTES 16 +#define crypto_core_salsa20_tweet_KEYBYTES 32 +#define crypto_core_salsa20_tweet_CONSTBYTES 16 +extern int crypto_core_salsa20_tweet(unsigned char *,const unsigned char *,const unsigned char *,const unsigned char *); +#define crypto_core_salsa20_tweet_VERSION "-" +#define crypto_core_salsa20 crypto_core_salsa20_tweet +#define crypto_core_salsa20_OUTPUTBYTES crypto_core_salsa20_tweet_OUTPUTBYTES +#define crypto_core_salsa20_INPUTBYTES crypto_core_salsa20_tweet_INPUTBYTES +#define crypto_core_salsa20_KEYBYTES crypto_core_salsa20_tweet_KEYBYTES +#define crypto_core_salsa20_CONSTBYTES crypto_core_salsa20_tweet_CONSTBYTES +#define crypto_core_salsa20_VERSION crypto_core_salsa20_tweet_VERSION +#define crypto_core_salsa20_IMPLEMENTATION "crypto_core/salsa20/tweet" +#define crypto_core_hsalsa20_tweet_OUTPUTBYTES 32 +#define crypto_core_hsalsa20_tweet_INPUTBYTES 16 +#define crypto_core_hsalsa20_tweet_KEYBYTES 32 +#define crypto_core_hsalsa20_tweet_CONSTBYTES 16 +extern int crypto_core_hsalsa20_tweet(unsigned char *,const unsigned char *,const unsigned char *,const unsigned char *); +#define crypto_core_hsalsa20_tweet_VERSION "-" +#define crypto_core_hsalsa20 crypto_core_hsalsa20_tweet +#define crypto_core_hsalsa20_OUTPUTBYTES crypto_core_hsalsa20_tweet_OUTPUTBYTES +#define crypto_core_hsalsa20_INPUTBYTES crypto_core_hsalsa20_tweet_INPUTBYTES +#define crypto_core_hsalsa20_KEYBYTES crypto_core_hsalsa20_tweet_KEYBYTES +#define crypto_core_hsalsa20_CONSTBYTES crypto_core_hsalsa20_tweet_CONSTBYTES +#define crypto_core_hsalsa20_VERSION crypto_core_hsalsa20_tweet_VERSION +#define crypto_core_hsalsa20_IMPLEMENTATION "crypto_core/hsalsa20/tweet" +#define crypto_hashblocks_PRIMITIVE "sha512" +#define crypto_hashblocks crypto_hashblocks_sha512 +#define crypto_hashblocks_STATEBYTES crypto_hashblocks_sha512_STATEBYTES +#define crypto_hashblocks_BLOCKBYTES crypto_hashblocks_sha512_BLOCKBYTES +#define crypto_hashblocks_IMPLEMENTATION crypto_hashblocks_sha512_IMPLEMENTATION +#define crypto_hashblocks_VERSION crypto_hashblocks_sha512_VERSION +#define crypto_hashblocks_sha512_tweet_STATEBYTES 64 +#define crypto_hashblocks_sha512_tweet_BLOCKBYTES 128 +extern int crypto_hashblocks_sha512_tweet(unsigned char *,const unsigned char *,unsigned long long); +#define crypto_hashblocks_sha512_tweet_VERSION "-" +#define crypto_hashblocks_sha512 crypto_hashblocks_sha512_tweet +#define crypto_hashblocks_sha512_STATEBYTES crypto_hashblocks_sha512_tweet_STATEBYTES +#define crypto_hashblocks_sha512_BLOCKBYTES crypto_hashblocks_sha512_tweet_BLOCKBYTES +#define crypto_hashblocks_sha512_VERSION crypto_hashblocks_sha512_tweet_VERSION +#define crypto_hashblocks_sha512_IMPLEMENTATION "crypto_hashblocks/sha512/tweet" +#define crypto_hashblocks_sha256_tweet_STATEBYTES 32 +#define crypto_hashblocks_sha256_tweet_BLOCKBYTES 64 +extern int crypto_hashblocks_sha256_tweet(unsigned char *,const unsigned char *,unsigned long long); +#define crypto_hashblocks_sha256_tweet_VERSION "-" +#define crypto_hashblocks_sha256 crypto_hashblocks_sha256_tweet +#define crypto_hashblocks_sha256_STATEBYTES crypto_hashblocks_sha256_tweet_STATEBYTES +#define crypto_hashblocks_sha256_BLOCKBYTES crypto_hashblocks_sha256_tweet_BLOCKBYTES +#define crypto_hashblocks_sha256_VERSION crypto_hashblocks_sha256_tweet_VERSION +#define crypto_hashblocks_sha256_IMPLEMENTATION "crypto_hashblocks/sha256/tweet" +#define crypto_hash_PRIMITIVE "sha512" +#define crypto_hash crypto_hash_sha512 +#define crypto_hash_BYTES crypto_hash_sha512_BYTES +#define crypto_hash_IMPLEMENTATION crypto_hash_sha512_IMPLEMENTATION +#define crypto_hash_VERSION crypto_hash_sha512_VERSION +#define crypto_hash_sha512_tweet_BYTES 64 +extern int crypto_hash_sha512_tweet(unsigned char *,const unsigned char *,unsigned long long); +#define crypto_hash_sha512_tweet_VERSION "-" +#define crypto_hash_sha512 crypto_hash_sha512_tweet +#define crypto_hash_sha512_BYTES crypto_hash_sha512_tweet_BYTES +#define crypto_hash_sha512_VERSION crypto_hash_sha512_tweet_VERSION +#define crypto_hash_sha512_IMPLEMENTATION "crypto_hash/sha512/tweet" +#define crypto_hash_sha256_tweet_BYTES 32 +extern int crypto_hash_sha256_tweet(unsigned char *,const unsigned char *,unsigned long long); +#define crypto_hash_sha256_tweet_VERSION "-" +#define crypto_hash_sha256 crypto_hash_sha256_tweet +#define crypto_hash_sha256_BYTES crypto_hash_sha256_tweet_BYTES +#define crypto_hash_sha256_VERSION crypto_hash_sha256_tweet_VERSION +#define crypto_hash_sha256_IMPLEMENTATION "crypto_hash/sha256/tweet" +#define crypto_onetimeauth_PRIMITIVE "poly1305" +#define crypto_onetimeauth crypto_onetimeauth_poly1305 +#define crypto_onetimeauth_verify crypto_onetimeauth_poly1305_verify +#define crypto_onetimeauth_BYTES crypto_onetimeauth_poly1305_BYTES +#define crypto_onetimeauth_KEYBYTES crypto_onetimeauth_poly1305_KEYBYTES +#define crypto_onetimeauth_IMPLEMENTATION crypto_onetimeauth_poly1305_IMPLEMENTATION +#define crypto_onetimeauth_VERSION crypto_onetimeauth_poly1305_VERSION +#define crypto_onetimeauth_poly1305_tweet_BYTES 16 +#define crypto_onetimeauth_poly1305_tweet_KEYBYTES 32 +extern int crypto_onetimeauth_poly1305_tweet(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *); +extern int crypto_onetimeauth_poly1305_tweet_verify(const unsigned char *,const unsigned char *,unsigned long long,const unsigned char *); +#define crypto_onetimeauth_poly1305_tweet_VERSION "-" +#define crypto_onetimeauth_poly1305 crypto_onetimeauth_poly1305_tweet +#define crypto_onetimeauth_poly1305_verify crypto_onetimeauth_poly1305_tweet_verify +#define crypto_onetimeauth_poly1305_BYTES crypto_onetimeauth_poly1305_tweet_BYTES +#define crypto_onetimeauth_poly1305_KEYBYTES crypto_onetimeauth_poly1305_tweet_KEYBYTES +#define crypto_onetimeauth_poly1305_VERSION crypto_onetimeauth_poly1305_tweet_VERSION +#define crypto_onetimeauth_poly1305_IMPLEMENTATION "crypto_onetimeauth/poly1305/tweet" +#define crypto_scalarmult_PRIMITIVE "curve25519" +#define crypto_scalarmult crypto_scalarmult_curve25519 +#define crypto_scalarmult_base crypto_scalarmult_curve25519_base +#define crypto_scalarmult_BYTES crypto_scalarmult_curve25519_BYTES +#define crypto_scalarmult_SCALARBYTES crypto_scalarmult_curve25519_SCALARBYTES +#define crypto_scalarmult_IMPLEMENTATION crypto_scalarmult_curve25519_IMPLEMENTATION +#define crypto_scalarmult_VERSION crypto_scalarmult_curve25519_VERSION +#define crypto_scalarmult_curve25519_tweet_BYTES 32 +#define crypto_scalarmult_curve25519_tweet_SCALARBYTES 32 +extern int crypto_scalarmult_curve25519_tweet(unsigned char *,const unsigned char *,const unsigned char *); +extern int crypto_scalarmult_curve25519_tweet_base(unsigned char *,const unsigned char *); +#define crypto_scalarmult_curve25519_tweet_VERSION "-" +#define crypto_scalarmult_curve25519 crypto_scalarmult_curve25519_tweet +#define crypto_scalarmult_curve25519_base crypto_scalarmult_curve25519_tweet_base +#define crypto_scalarmult_curve25519_BYTES crypto_scalarmult_curve25519_tweet_BYTES +#define crypto_scalarmult_curve25519_SCALARBYTES crypto_scalarmult_curve25519_tweet_SCALARBYTES +#define crypto_scalarmult_curve25519_VERSION crypto_scalarmult_curve25519_tweet_VERSION +#define crypto_scalarmult_curve25519_IMPLEMENTATION "crypto_scalarmult/curve25519/tweet" +#define crypto_secretbox_PRIMITIVE "xsalsa20poly1305" +#define crypto_secretbox crypto_secretbox_xsalsa20poly1305 +#define crypto_secretbox_open crypto_secretbox_xsalsa20poly1305_open +#define crypto_secretbox_KEYBYTES crypto_secretbox_xsalsa20poly1305_KEYBYTES +#define crypto_secretbox_NONCEBYTES crypto_secretbox_xsalsa20poly1305_NONCEBYTES +#define crypto_secretbox_ZEROBYTES crypto_secretbox_xsalsa20poly1305_ZEROBYTES +#define crypto_secretbox_BOXZEROBYTES crypto_secretbox_xsalsa20poly1305_BOXZEROBYTES +#define crypto_secretbox_IMPLEMENTATION crypto_secretbox_xsalsa20poly1305_IMPLEMENTATION +#define crypto_secretbox_VERSION crypto_secretbox_xsalsa20poly1305_VERSION +#define crypto_secretbox_xsalsa20poly1305_tweet_KEYBYTES 32 +#define crypto_secretbox_xsalsa20poly1305_tweet_NONCEBYTES 24 +#define crypto_secretbox_xsalsa20poly1305_tweet_ZEROBYTES 32 +#define crypto_secretbox_xsalsa20poly1305_tweet_BOXZEROBYTES 16 +extern int crypto_secretbox_xsalsa20poly1305_tweet(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *,const unsigned char *); +extern int crypto_secretbox_xsalsa20poly1305_tweet_open(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *,const unsigned char *); +#define crypto_secretbox_xsalsa20poly1305_tweet_VERSION "-" +#define crypto_secretbox_xsalsa20poly1305 crypto_secretbox_xsalsa20poly1305_tweet +#define crypto_secretbox_xsalsa20poly1305_open crypto_secretbox_xsalsa20poly1305_tweet_open +#define crypto_secretbox_xsalsa20poly1305_KEYBYTES crypto_secretbox_xsalsa20poly1305_tweet_KEYBYTES +#define crypto_secretbox_xsalsa20poly1305_NONCEBYTES crypto_secretbox_xsalsa20poly1305_tweet_NONCEBYTES +#define crypto_secretbox_xsalsa20poly1305_ZEROBYTES crypto_secretbox_xsalsa20poly1305_tweet_ZEROBYTES +#define crypto_secretbox_xsalsa20poly1305_BOXZEROBYTES crypto_secretbox_xsalsa20poly1305_tweet_BOXZEROBYTES +#define crypto_secretbox_xsalsa20poly1305_VERSION crypto_secretbox_xsalsa20poly1305_tweet_VERSION +#define crypto_secretbox_xsalsa20poly1305_IMPLEMENTATION "crypto_secretbox/xsalsa20poly1305/tweet" +#define crypto_sign_PRIMITIVE "ed25519" +#define crypto_sign crypto_sign_ed25519 +#define crypto_sign_open crypto_sign_ed25519_open +#define crypto_sign_keypair crypto_sign_ed25519_keypair +#define crypto_sign_BYTES crypto_sign_ed25519_BYTES +#define crypto_sign_PUBLICKEYBYTES crypto_sign_ed25519_PUBLICKEYBYTES +#define crypto_sign_SECRETKEYBYTES crypto_sign_ed25519_SECRETKEYBYTES +#define crypto_sign_IMPLEMENTATION crypto_sign_ed25519_IMPLEMENTATION +#define crypto_sign_VERSION crypto_sign_ed25519_VERSION +#define crypto_sign_ed25519_tweet_BYTES 64 +#define crypto_sign_ed25519_tweet_PUBLICKEYBYTES 32 +#define crypto_sign_ed25519_tweet_SECRETKEYBYTES 64 +extern int crypto_sign_ed25519_tweet(unsigned char *,unsigned long long *,const unsigned char *,unsigned long long,const unsigned char *); +extern int crypto_sign_ed25519_tweet_open(unsigned char *,unsigned long long *,const unsigned char *,unsigned long long,const unsigned char *); +extern int crypto_sign_ed25519_tweet_keypair(unsigned char *,unsigned char *); +#define crypto_sign_ed25519_tweet_VERSION "-" +#define crypto_sign_ed25519 crypto_sign_ed25519_tweet +#define crypto_sign_ed25519_open crypto_sign_ed25519_tweet_open +#define crypto_sign_ed25519_keypair crypto_sign_ed25519_tweet_keypair +#define crypto_sign_ed25519_BYTES crypto_sign_ed25519_tweet_BYTES +#define crypto_sign_ed25519_PUBLICKEYBYTES crypto_sign_ed25519_tweet_PUBLICKEYBYTES +#define crypto_sign_ed25519_SECRETKEYBYTES crypto_sign_ed25519_tweet_SECRETKEYBYTES +#define crypto_sign_ed25519_VERSION crypto_sign_ed25519_tweet_VERSION +#define crypto_sign_ed25519_IMPLEMENTATION "crypto_sign/ed25519/tweet" +#define crypto_stream_PRIMITIVE "xsalsa20" +#define crypto_stream crypto_stream_xsalsa20 +#define crypto_stream_xor crypto_stream_xsalsa20_xor +#define crypto_stream_KEYBYTES crypto_stream_xsalsa20_KEYBYTES +#define crypto_stream_NONCEBYTES crypto_stream_xsalsa20_NONCEBYTES +#define crypto_stream_IMPLEMENTATION crypto_stream_xsalsa20_IMPLEMENTATION +#define crypto_stream_VERSION crypto_stream_xsalsa20_VERSION +#define crypto_stream_xsalsa20_tweet_KEYBYTES 32 +#define crypto_stream_xsalsa20_tweet_NONCEBYTES 24 +extern int crypto_stream_xsalsa20_tweet(unsigned char *,unsigned long long,const unsigned char *,const unsigned char *); +extern int crypto_stream_xsalsa20_tweet_xor(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *,const unsigned char *); +#define crypto_stream_xsalsa20_tweet_VERSION "-" +#define crypto_stream_xsalsa20 crypto_stream_xsalsa20_tweet +#define crypto_stream_xsalsa20_xor crypto_stream_xsalsa20_tweet_xor +#define crypto_stream_xsalsa20_KEYBYTES crypto_stream_xsalsa20_tweet_KEYBYTES +#define crypto_stream_xsalsa20_NONCEBYTES crypto_stream_xsalsa20_tweet_NONCEBYTES +#define crypto_stream_xsalsa20_VERSION crypto_stream_xsalsa20_tweet_VERSION +#define crypto_stream_xsalsa20_IMPLEMENTATION "crypto_stream/xsalsa20/tweet" +#define crypto_stream_salsa20_tweet_KEYBYTES 32 +#define crypto_stream_salsa20_tweet_NONCEBYTES 8 +extern int crypto_stream_salsa20_tweet(unsigned char *,unsigned long long,const unsigned char *,const unsigned char *); +extern int crypto_stream_salsa20_tweet_xor(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *,const unsigned char *); +#define crypto_stream_salsa20_tweet_VERSION "-" +#define crypto_stream_salsa20 crypto_stream_salsa20_tweet +#define crypto_stream_salsa20_xor crypto_stream_salsa20_tweet_xor +#define crypto_stream_salsa20_KEYBYTES crypto_stream_salsa20_tweet_KEYBYTES +#define crypto_stream_salsa20_NONCEBYTES crypto_stream_salsa20_tweet_NONCEBYTES +#define crypto_stream_salsa20_VERSION crypto_stream_salsa20_tweet_VERSION +#define crypto_stream_salsa20_IMPLEMENTATION "crypto_stream/salsa20/tweet" +#define crypto_verify_PRIMITIVE "16" +#define crypto_verify crypto_verify_16 +#define crypto_verify_BYTES crypto_verify_16_BYTES +#define crypto_verify_IMPLEMENTATION crypto_verify_16_IMPLEMENTATION +#define crypto_verify_VERSION crypto_verify_16_VERSION +#define crypto_verify_16_tweet_BYTES 16 +extern int crypto_verify_16_tweet(const unsigned char *,const unsigned char *); +#define crypto_verify_16_tweet_VERSION "-" +#define crypto_verify_16 crypto_verify_16_tweet +#define crypto_verify_16_BYTES crypto_verify_16_tweet_BYTES +#define crypto_verify_16_VERSION crypto_verify_16_tweet_VERSION +#define crypto_verify_16_IMPLEMENTATION "crypto_verify/16/tweet" +#define crypto_verify_32_tweet_BYTES 32 +extern int crypto_verify_32_tweet(const unsigned char *,const unsigned char *); +#define crypto_verify_32_tweet_VERSION "-" +#define crypto_verify_32 crypto_verify_32_tweet +#define crypto_verify_32_BYTES crypto_verify_32_tweet_BYTES +#define crypto_verify_32_VERSION crypto_verify_32_tweet_VERSION +#define crypto_verify_32_IMPLEMENTATION "crypto_verify/32/tweet" +#endif diff --git a/src/cryptoconditions/src/internal.h b/src/cryptoconditions/src/internal.h new file mode 100644 index 000000000..bd0e6376a --- /dev/null +++ b/src/cryptoconditions/src/internal.h @@ -0,0 +1,76 @@ +#include "include/cJSON.h" +#include "asn/asn_application.h" +#include "cryptoconditions.h" + +#ifndef INTERNAL_H +#define INTERNAL_H + + +#ifdef __cplusplus +extern "C" { +#endif + + +#define BUF_SIZE 1024 * 1024 + + +/* + * Condition Type */ +typedef struct CCType { + uint8_t typeId; + unsigned char name[100]; + Condition_PR asnType; + int hasSubtypes; + int (*visitChildren)(CC *cond, CCVisitor visitor); + unsigned char *(*fingerprint)(const CC *cond); + unsigned long (*getCost)(const CC *cond); + uint32_t (*getSubtypes)(const CC *cond); + CC *(*fromJSON)(const cJSON *params, unsigned char *err); + void (*toJSON)(const CC *cond, cJSON *params); + CC *(*fromFulfillment)(const Fulfillment_t *ffill); + Fulfillment_t *(*toFulfillment)(const CC *cond); + int (*isFulfilled)(const CC *cond); + void (*free)(struct CC *cond); +} CCType; + + +/* + * Globals + */ +static struct CCType *typeRegistry[]; +static int typeRegistryLength; + + +/* + * Internal API + */ +static uint32_t fromAsnSubtypes(ConditionTypes_t types); +static CC *mkAnon(const Condition_t *asnCond); +static void asnCondition(const CC *cond, Condition_t *asn); +static Condition_t *asnConditionNew(const CC *cond); +static Fulfillment_t *asnFulfillmentNew(const CC *cond); +static uint32_t getSubtypes(CC *cond); +static cJSON *jsonEncodeCondition(cJSON *params, unsigned char *err); +static struct CC *fulfillmentToCC(Fulfillment_t *ffill); +static struct CCType *getTypeByAsnEnum(Condition_PR present); + + +/* + * Utility functions + */ +unsigned char *base64_encode(const unsigned char *data, size_t input_length); +unsigned char *base64_decode(const unsigned char *data_, size_t *output_length); +unsigned char *hashFingerprintContents(asn_TYPE_descriptor_t *asnType, void *fp); +void dumpStr(unsigned char *str, size_t len); +int checkString(const cJSON *value, unsigned char *key, unsigned char *err); +int checkDecodeBase64(const cJSON *value, unsigned char *key, unsigned char *err, unsigned char **data, size_t *size); +int jsonGetBase64(const cJSON *params, unsigned char *key, unsigned char *err, unsigned char **data, size_t *size); +int jsonGetBase64Optional(const cJSON *params, unsigned char *key, unsigned char *err, unsigned char **data, size_t *size); +void jsonAddBase64(cJSON *params, unsigned char *key, unsigned char *bin, size_t size); + + +#ifdef __cplusplus +} +#endif + +#endif /* INTERNAL_H */ diff --git a/src/cryptoconditions/src/json_rpc.c b/src/cryptoconditions/src/json_rpc.c new file mode 100644 index 000000000..8fcf47fdb --- /dev/null +++ b/src/cryptoconditions/src/json_rpc.c @@ -0,0 +1,332 @@ +#include "cryptoconditions.h" +#include "internal.h" +#include +#include + + +static cJSON *jsonCondition(CC *cond) { + unsigned char buf[1000]; + size_t conditionBinLength = cc_conditionBinary(cond, buf); + + cJSON *root = cJSON_CreateObject(); + unsigned char *uri = cc_conditionUri(cond); + cJSON_AddItemToObject(root, "uri", cJSON_CreateString(uri)); + free(uri); + + unsigned char *b64 = base64_encode(buf, conditionBinLength); + cJSON_AddItemToObject(root, "bin", cJSON_CreateString(b64)); + free(b64); + + return root; +} + + +static cJSON *jsonFulfillment(CC *cond) { + unsigned char buf[1000000]; + size_t fulfillmentBinLength = cc_fulfillmentBinary(cond, buf, 1000000); + + cJSON *root = cJSON_CreateObject(); + unsigned char *b64 = base64_encode(buf, fulfillmentBinLength); + cJSON_AddItemToObject(root, "fulfillment", cJSON_CreateString(b64)); + free(b64); + + return root; +} + + +CC *cc_conditionFromJSON(cJSON *params, unsigned char *err) { + if (!params || !cJSON_IsObject(params)) { + strcpy(err, "Condition params must be an object"); + return NULL; + } + cJSON *typeName = cJSON_GetObjectItem(params, "type"); + if (!typeName || !cJSON_IsString(typeName)) { + strcpy(err, "\"type\" must be a string"); + return NULL; + } + for (int i=0; ivaluestring, typeRegistry[i]->name)) { + return typeRegistry[i]->fromJSON(params, err); + } + } + } + strcpy(err, "cannot detect type of condition"); + return NULL; +} + + +CC *cc_conditionFromJSONString(const unsigned char *data, unsigned char *err) { + cJSON *params = cJSON_Parse(data); + CC *out = cc_conditionFromJSON(params, err); + cJSON_Delete(params); + return out; +} + + +static cJSON *jsonEncodeCondition(cJSON *params, unsigned char *err) { + CC *cond = cc_conditionFromJSON(params, err); + cJSON *out = NULL; + if (cond != NULL) { + out = jsonCondition(cond); + cc_free(cond); + } + return out; +} + + +static cJSON *jsonEncodeFulfillment(cJSON *params, unsigned char *err) { + CC *cond = cc_conditionFromJSON(params, err); + cJSON *out = NULL; + if (cond != NULL) { + out = jsonFulfillment(cond); + cc_free(cond); + } + return out; +} + + +static cJSON *jsonErr(unsigned char *err) { + cJSON *out = cJSON_CreateObject(); + cJSON_AddItemToObject(out, "error", cJSON_CreateString(err)); + return out; +} + + +static cJSON *jsonVerifyFulfillment(cJSON *params, unsigned char *err) { + unsigned char *ffill_bin = 0, *msg = 0, *cond_bin = 0; + size_t ffill_bin_len, msg_len, cond_bin_len; + cJSON *out = 0; + + if (!(jsonGetBase64(params, "fulfillment", err, &ffill_bin, &ffill_bin_len) && + jsonGetBase64(params, "message", err, &msg, &msg_len) && + jsonGetBase64(params, "condition", err, &cond_bin, &cond_bin_len))) + goto END; + + CC *cond = cc_readFulfillmentBinary(ffill_bin, ffill_bin_len); + + if (!cond) { + strcpy(err, "Invalid fulfillment payload"); + goto END; + } + + int valid = cc_verify(cond, msg, msg_len, 1, cond_bin, cond_bin_len, &jsonVerifyEval, NULL); + cc_free(cond); + out = cJSON_CreateObject(); + cJSON_AddItemToObject(out, "valid", cJSON_CreateBool(valid)); + +END: + free(ffill_bin); free(msg); free(cond_bin); + return out; +} + + +static cJSON *jsonDecodeFulfillment(cJSON *params, unsigned char *err) { + size_t ffill_bin_len; + unsigned char *ffill_bin; + if (!jsonGetBase64(params, "fulfillment", err, &ffill_bin, &ffill_bin_len)) + return NULL; + + CC *cond = cc_readFulfillmentBinary(ffill_bin, ffill_bin_len); + free(ffill_bin); + if (!cond) { + strcpy(err, "Invalid fulfillment payload"); + return NULL; + } + cJSON *out = jsonCondition(cond); + cc_free(cond); + return out; +} + + +static cJSON *jsonDecodeCondition(cJSON *params, unsigned char *err) { + size_t cond_bin_len; + unsigned char *cond_bin; + if (!jsonGetBase64(params, "bin", err, &cond_bin, &cond_bin_len)) + return NULL; + + CC *cond = cc_readConditionBinary(cond_bin, cond_bin_len); + free(cond_bin); + + if (!cond) { + strcpy(err, "Invalid condition payload"); + return NULL; + } + + cJSON *out = jsonCondition(cond); + cJSON_AddItemToObject(out, "condition", cc_conditionToJSON(cond)); + cc_free(cond); + return out; +} + + +static cJSON *jsonSignTreeEd25519(cJSON *params, unsigned char *err) { + cJSON *out = 0; + unsigned char *msg = 0, *sk = 0; + + cJSON *condition_item = cJSON_GetObjectItem(params, "condition"); + CC *cond = cc_conditionFromJSON(condition_item, err); + if (cond == NULL) { + goto END; + } + + size_t skLength; + if (!jsonGetBase64(params, "privateKey", err, &sk, &skLength)) { + goto END; + } + + if (skLength != 32) { + strcpy(err, "privateKey wrong length"); + } + + size_t msgLength; + if (!jsonGetBase64(params, "message", err, &msg, &msgLength)) { + goto END; + } + + int nSigned = cc_signTreeEd25519(cond, sk, msg, msgLength); + out = cJSON_CreateObject(); + cJSON_AddItemToObject(out, "num_signed", cJSON_CreateNumber(nSigned)); + cJSON_AddItemToObject(out, "condition", cc_conditionToJSON(cond)); + +END: + cc_free(cond); + free(msg); + free(sk); + return out; +} + + +static cJSON *jsonSignTreeSecp256k1(cJSON *params, unsigned char *err) { + cJSON *out = 0; + unsigned char *msg = 0, *sk = 0; + + cJSON *condition_item = cJSON_GetObjectItem(params, "condition"); + CC *cond = cc_conditionFromJSON(condition_item, err); + if (cond == NULL) { + goto END; + } + + size_t skLength; + if (!jsonGetBase64(params, "privateKey", err, &sk, &skLength)) { + goto END; + } + + if (skLength != SECP256K1_SK_SIZE) { + strcpy(err, "privateKey wrong length"); + } + + size_t msgLength; + if (!jsonGetBase64(params, "message", err, &msg, &msgLength)) { + goto END; + } + + char msgHash[32]; + sha256(msg, msgLength, msgHash); + int nSigned = cc_signTreeSecp256k1Msg32(cond, sk, msgHash); + out = cJSON_CreateObject(); + cJSON_AddItemToObject(out, "num_signed", cJSON_CreateNumber(nSigned)); + cJSON_AddItemToObject(out, "condition", cc_conditionToJSON(cond)); + +END: + cc_free(cond); + free(msg); + free(sk); + return out; +} + + +cJSON *cc_conditionToJSON(const CC *cond) { + cJSON *params = cJSON_CreateObject(); + cJSON_AddItemToObject(params, "type", cJSON_CreateString(cond->type->name)); + cond->type->toJSON(cond, params); + return params; +} + + +unsigned char *cc_conditionToJSONString(const CC *cond) { + assert(cond != NULL); + cJSON *params = cc_conditionToJSON(cond); + unsigned char *out = cJSON_Print(params); + cJSON_Delete(params); + return out; +} + + +static cJSON *jsonListMethods(cJSON *params, unsigned char *err); + + +typedef struct JsonMethod { + unsigned char *name; + cJSON* (*method)(cJSON *params, unsigned char *err); + unsigned char *description; +} JsonMethod; + + +static JsonMethod cc_jsonMethods[] = { + {"encodeCondition", &jsonEncodeCondition, "Encode a JSON condition to binary"}, + {"decodeCondition", &jsonDecodeCondition, "Decode a binary condition"}, + {"encodeFulfillment", &jsonEncodeFulfillment, "Encode a JSON condition to a fulfillment"}, + {"decodeFulfillment", &jsonDecodeFulfillment, "Decode a binary fulfillment"}, + {"verifyFulfillment", &jsonVerifyFulfillment, "Verify a fulfillment"}, + {"signTreeEd25519", &jsonSignTreeEd25519, "Sign ed25519 condition nodes"}, + {"signTreeSecp256k1", &jsonSignTreeSecp256k1, "Sign secp256k1 condition nodes"}, + {"listMethods", &jsonListMethods, "List available methods"} +}; + + +static int nJsonMethods = sizeof(cc_jsonMethods) / sizeof(*cc_jsonMethods); + + +static cJSON *jsonListMethods(cJSON *params, unsigned char *err) { + cJSON *list = cJSON_CreateArray(); + for (int i=0; ivaluestring)) { + return method.method(params, err); + } + } + + return jsonErr("invalid method"); +} + + +unsigned char *cc_jsonRPC(unsigned char* input) { + unsigned char err[1000] = "\0"; + cJSON *out; + cJSON *root = cJSON_Parse(input); + if (!root) out = jsonErr("Error parsing JSON request"); + else { + out = execJsonRPC(root, err); + if (NULL == out) out = jsonErr(err); + } + unsigned char *res = cJSON_Print(out); + cJSON_Delete(out); + cJSON_Delete(root); + return res; +} diff --git a/src/cryptoconditions/src/prefix.c b/src/cryptoconditions/src/prefix.c new file mode 100644 index 000000000..8fdd0a483 --- /dev/null +++ b/src/cryptoconditions/src/prefix.c @@ -0,0 +1,126 @@ + +#include "asn/Condition.h" +#include "asn/Fulfillment.h" +#include "asn/PrefixFingerprintContents.h" +#include "asn/OCTET_STRING.h" +#include "include/cJSON.h" +#include "cryptoconditions.h" + + +struct CCType cc_prefixType; + + +static int prefixVisitChildren(CC *cond, CCVisitor visitor) { + size_t prefixedLength = cond->prefixLength + visitor.msgLength; + unsigned char *prefixed = malloc(prefixedLength); + memcpy(prefixed, cond->prefix, cond->prefixLength); + memcpy(prefixed + cond->prefixLength, visitor.msg, visitor.msgLength); + visitor.msg = prefixed; + visitor.msgLength = prefixedLength; + int res = cc_visit(cond->subcondition, visitor); + free(prefixed); + return res; +} + + +static unsigned char *prefixFingerprint(const CC *cond) { + PrefixFingerprintContents_t *fp = calloc(1, sizeof(PrefixFingerprintContents_t)); + asnCondition(cond->subcondition, &fp->subcondition); // TODO: check asnCondition for safety + fp->maxMessageLength = cond->maxMessageLength; + OCTET_STRING_fromBuf(&fp->prefix, cond->prefix, cond->prefixLength); + return hashFingerprintContents(&asn_DEF_PrefixFingerprintContents, fp); +} + + +static unsigned long prefixCost(const CC *cond) { + return 1024 + cond->prefixLength + cond->maxMessageLength + + cond->subcondition->type->getCost(cond->subcondition); +} + + +static CC *prefixFromFulfillment(const Fulfillment_t *ffill) { + PrefixFulfillment_t *p = ffill->choice.prefixSha256; + CC *sub = fulfillmentToCC(p->subfulfillment); + if (!sub) return 0; + CC *cond = calloc(1, sizeof(CC)); + cond->type = &cc_prefixType; + cond->maxMessageLength = p->maxMessageLength; + cond->prefix = calloc(1, p->prefix.size); + memcpy(cond->prefix, p->prefix.buf, p->prefix.size); + cond->prefixLength = p->prefix.size; + cond->subcondition = sub; + return cond; +} + + +static Fulfillment_t *prefixToFulfillment(const CC *cond) { + Fulfillment_t *ffill = asnFulfillmentNew(cond->subcondition); + if (!ffill) { + return NULL; + } + PrefixFulfillment_t *pf = calloc(1, sizeof(PrefixFulfillment_t)); + OCTET_STRING_fromBuf(&pf->prefix, cond->prefix, cond->prefixLength); + pf->maxMessageLength = cond->maxMessageLength; + pf->subfulfillment = ffill; + + ffill = calloc(1, sizeof(Fulfillment_t)); + ffill->present = Fulfillment_PR_prefixSha256; + ffill->choice.prefixSha256 = pf; + return ffill; +} + + +static uint32_t prefixSubtypes(const CC *cond) { + return getSubtypes(cond->subcondition) & ~(1 << cc_prefixType.typeId); +} + + +static CC *prefixFromJSON(const cJSON *params, unsigned char *err) { + cJSON *mml_item = cJSON_GetObjectItem(params, "maxMessageLength"); + if (!cJSON_IsNumber(mml_item)) { + strcpy(err, "maxMessageLength must be a number"); + return NULL; + } + + cJSON *subcond_item = cJSON_GetObjectItem(params, "subfulfillment"); + CC *sub = cc_conditionFromJSON(subcond_item, err); + if (!sub) { + return NULL; + } + + CC *cond = calloc(1, sizeof(CC)); + cond->type = &cc_prefixType; + cond->maxMessageLength = (unsigned long) mml_item->valuedouble; + cond->subcondition = sub; + + if (!jsonGetBase64(params, "prefix", err, &cond->prefix, &cond->prefixLength)) { + cc_free(cond); + return NULL; + } + + return cond; +} + + +static void prefixToJSON(const CC *cond, cJSON *params) { + cJSON_AddNumberToObject(params, "maxMessageLength", (double)cond->maxMessageLength); + unsigned char *b64 = base64_encode(cond->prefix, cond->prefixLength); + cJSON_AddStringToObject(params, "prefix", b64); + free(b64); + cJSON_AddItemToObject(params, "subfulfillment", cc_conditionToJSON(cond->subcondition)); +} + + +int prefixIsFulfilled(const CC *cond) { + return cc_isFulfilled(cond->subcondition); +} + + +static void prefixFree(CC *cond) { + free(cond->prefix); + cc_free(cond->subcondition); + free(cond); +} + + +struct CCType cc_prefixType = { 1, "prefix-sha-256", Condition_PR_prefixSha256, 1, &prefixVisitChildren, &prefixFingerprint, &prefixCost, &prefixSubtypes, &prefixFromJSON, &prefixToJSON, &prefixFromFulfillment, &prefixToFulfillment, &prefixIsFulfilled, &prefixFree }; diff --git a/src/cryptoconditions/src/preimage.c b/src/cryptoconditions/src/preimage.c new file mode 100644 index 000000000..71d3b2e89 --- /dev/null +++ b/src/cryptoconditions/src/preimage.c @@ -0,0 +1,83 @@ + +#include "asn/Condition.h" +#include "asn/Fulfillment.h" +#include "asn/OCTET_STRING.h" +#include "include/cJSON.h" +#include "include/sha256.h" +#include "cryptoconditions.h" + + +struct CCType cc_preimageType; + + +static CC *preimageFromJSON(const cJSON *params, unsigned char *err) { + cJSON *preimage_item = cJSON_GetObjectItem(params, "preimage"); + if (!cJSON_IsString(preimage_item)) { + strcpy(err, "preimage must be a string"); + return NULL; + } + unsigned char *preimage_b64 = preimage_item->valuestring; + + CC *cond = calloc(1, sizeof(CC)); + cond->type = &cc_preimageType; + cond->preimage = base64_decode(preimage_b64, &cond->preimageLength); + return cond; +} + + +static void preimageToJSON(const CC *cond, cJSON *params) { + unsigned char *encoded = base64_encode(cond->preimage, cond->preimageLength); + cJSON_AddStringToObject(params, "preimage", encoded); + free(encoded); +} + + +static unsigned long preimageCost(const CC *cond) { + return (unsigned long) cond->preimageLength; +} + + +static unsigned char *preimageFingerprint(const CC *cond) { + unsigned char *hash = calloc(1, 32); + sha256(cond->preimage, cond->preimageLength, hash); + return hash; +} + + +static CC *preimageFromFulfillment(const Fulfillment_t *ffill) { + CC *cond = calloc(1, sizeof(CC)); + cond->type = &cc_preimageType; + PreimageFulfillment_t p = ffill->choice.preimageSha256; + cond->preimage = calloc(1, p.preimage.size); + memcpy(cond->preimage, p.preimage.buf, p.preimage.size); + cond->preimageLength = p.preimage.size; + return cond; +} + + +static Fulfillment_t *preimageToFulfillment(const CC *cond) { + Fulfillment_t *ffill = calloc(1, sizeof(Fulfillment_t)); + ffill->present = Fulfillment_PR_preimageSha256; + PreimageFulfillment_t *pf = &ffill->choice.preimageSha256; + OCTET_STRING_fromBuf(&pf->preimage, cond->preimage, cond->preimageLength); + return ffill; +} + + +int preimageIsFulfilled(const CC *cond) { + return 1; +} + + +static void preimageFree(CC *cond) { + free(cond->preimage); + free(cond); +} + + +static uint32_t preimageSubtypes(const CC *cond) { + return 0; +} + + +struct CCType cc_preimageType = { 0, "preimage-sha-256", Condition_PR_preimageSha256, 0, 0, &preimageFingerprint, &preimageCost, &preimageSubtypes, &preimageFromJSON, &preimageToJSON, &preimageFromFulfillment, &preimageToFulfillment, &preimageIsFulfilled, &preimageFree }; diff --git a/src/cryptoconditions/src/secp256k1.c b/src/cryptoconditions/src/secp256k1.c new file mode 100644 index 000000000..507c9c84f --- /dev/null +++ b/src/cryptoconditions/src/secp256k1.c @@ -0,0 +1,253 @@ +#define _GNU_SOURCE 1 + +#include +#include +#include + +#include "asn/Condition.h" +#include "asn/Fulfillment.h" +#include "asn/Secp256k1Fulfillment.h" +#include "asn/Secp256k1FingerprintContents.h" +#include "asn/OCTET_STRING.h" +#include "include/cJSON.h" +#include "include/secp256k1/include/secp256k1.h" +#include "cryptoconditions.h" +#include "internal.h" + + +struct CCType cc_secp256k1Type; + + +static const size_t SECP256K1_PK_SIZE = 33; +static const size_t SECP256K1_SK_SIZE = 32; +static const size_t SECP256K1_SIG_SIZE = 64; + + +secp256k1_context_t *ec_ctx_sign = 0, *ec_ctx_verify = 0; +pthread_mutex_t cc_secp256k1ContextLock = PTHREAD_MUTEX_INITIALIZER; + + +void lockSign() { + pthread_mutex_lock(&cc_secp256k1ContextLock); + if (!ec_ctx_sign) { + ec_ctx_sign = secp256k1_context_create(SECP256K1_CONTEXT_SIGN); + } + unsigned char ent[32]; +#ifdef SYS_getrandom + int read = syscall(SYS_getrandom, ent, 32, 0); +#else + FILE *fp = fopen("/dev/urandom", "r"); + int read = (int) fread(&ent, 1, 32, fp); + fclose(fp); +#endif + if (read != 32) { + fprintf(stderr, "Could not read 32 bytes entropy from system\n"); + exit(1); + } + if (!secp256k1_context_randomize(ec_ctx_sign, ent)) { + fprintf(stderr, "Could not randomize secp256k1 context\n"); + exit(1); + } +} + + +void unlockSign() { + pthread_mutex_unlock(&cc_secp256k1ContextLock); +} + + +void initVerify() { + if (!ec_ctx_verify) { + pthread_mutex_lock(&cc_secp256k1ContextLock); + if (!ec_ctx_verify) + ec_ctx_verify = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY); + pthread_mutex_unlock(&cc_secp256k1ContextLock); + } +} + + +static unsigned char *secp256k1Fingerprint(const CC *cond) { + Secp256k1FingerprintContents_t *fp = calloc(1, sizeof(Secp256k1FingerprintContents_t)); + OCTET_STRING_fromBuf(&fp->publicKey, cond->publicKey, SECP256K1_PK_SIZE); + return hashFingerprintContents(&asn_DEF_Secp256k1FingerprintContents, fp); +} + + +int secp256k1Verify(CC *cond, CCVisitor visitor) { + if (cond->type->typeId != cc_secp256k1Type.typeId) return 1; + // TODO: test failure mode: empty sig / null pointer + initVerify(); + int rc = secp256k1_ecdsa_verify(ec_ctx_verify, visitor.msg, cond->signature, SECP256K1_SIG_SIZE, + cond->publicKey, SECP256K1_PK_SIZE); + return rc == 1; +} + + +static int cc_secp256k1VerifyTreeMsg32(const CC *cond, const unsigned char *msg32) { + int subtypes = getSubtypes(cond); + if (subtypes & (1 << cc_prefixType.typeId) && + subtypes & (1 << cc_secp256k1Type.typeId)) { + // No support for prefix currently, due to pending protocol decision on + // how to combine message and prefix into 32 byte hash + return 0; + } + CCVisitor visitor = {&secp256k1Verify, msg32, 0, NULL}; + int out = cc_visit(cond, visitor); + return out; +} + + +/* + * Signing data + */ +typedef struct CCSecp256k1SigningData { + const unsigned char *pk; + const unsigned char *sk; + int nSigned; +} CCSecp256k1SigningData; + + +/* + * Visitor that signs an secp256k1 condition if it has a matching public key + */ +static int secp256k1Sign(CC *cond, CCVisitor visitor) { + if (cond->type->typeId != cc_secp256k1Type.typeId) return 1; + CCSecp256k1SigningData *signing = (CCSecp256k1SigningData*) visitor.context; + if (0 != memcmp(cond->publicKey, signing->pk, SECP256K1_PK_SIZE)) return 1; + if (!cond->signature) cond->signature = calloc(1, SECP256K1_SIG_SIZE); + lockSign(); + int rc = secp256k1_ecdsa_sign_compact(ec_ctx_sign, visitor.msg, cond->signature, signing->sk, NULL, NULL, NULL); + unlockSign(); + if (rc) { + signing->nSigned++; + return 1; + } + return 0; +} + + +/* + * Sign secp256k1 conditions in a tree + */ +int cc_signTreeSecp256k1Msg32(CC *cond, const unsigned char *privateKey, const unsigned char *msg32) { + if (getSubtypes(cond) & (1 << cc_preimageType.typeId)) { + // No support for prefix currently, due to pending protocol decision on + // how to combine message and prefix into 32 byte hash + return 0; + } + unsigned char *publicKey = calloc(1, SECP256K1_PK_SIZE); + CCSecp256k1SigningData signing = {publicKey, privateKey, 0}; + CCVisitor visitor = {&secp256k1Sign, msg32, 32, &signing}; + int ol = 0; + lockSign(); + int rc = secp256k1_ec_pubkey_create(ec_ctx_sign, publicKey, &ol, privateKey, 1); + unlockSign(); + if (rc) cc_visit(cond, visitor); + free(publicKey); + return signing.nSigned; +} + + +static unsigned long secp256k1Cost(const CC *cond) { + return 131072; +} + + +static CC *cc_secp256k1Condition(const unsigned char *publicKey, const unsigned char *signature) { + unsigned char *pk = 0, *sig = 0; + + + initVerify(); + int rc = secp256k1_ec_pubkey_verify(ec_ctx_verify, publicKey, SECP256K1_PK_SIZE); + if (!rc) { + return NULL; + } + + pk = calloc(1, SECP256K1_PK_SIZE); + memcpy(pk, publicKey, SECP256K1_PK_SIZE); + if (signature) { + sig = calloc(1, SECP256K1_SIG_SIZE); + memcpy(sig, signature, SECP256K1_SIG_SIZE); + } + + CC *cond = calloc(1, sizeof(CC)); + cond->type = &cc_secp256k1Type; + cond->publicKey = pk; + cond->signature = sig; + return cond; +} + + +static CC *secp256k1FromJSON(const cJSON *params, unsigned char *err) { + CC *cond = 0; + unsigned char *pk = 0, *sig = 0; + size_t pkSize, sigSize; + + if (!jsonGetBase64(params, "publicKey", err, &pk, &pkSize)) goto END; + + if (!jsonGetBase64Optional(params, "signature", err, &sig, &sigSize)) goto END; + if (sig && SECP256K1_SIG_SIZE != sigSize) { + strcpy(err, "signature has incorrect length"); + goto END; + } + + cond = cc_secp256k1Condition(pk, sig); + if (!cond) { + strcpy(err, "invalid public key"); + } +END: + free(pk); + free(sig); + return cond; +} + + +static void secp256k1ToJSON(const CC *cond, cJSON *params) { + jsonAddBase64(params, "publicKey", cond->publicKey, SECP256K1_PK_SIZE); + if (cond->signature) { + jsonAddBase64(params, "signature", cond->signature, SECP256K1_SIG_SIZE); + } +} + + +static CC *secp256k1FromFulfillment(const Fulfillment_t *ffill) { + return cc_secp256k1Condition(ffill->choice.secp256k1Sha256.publicKey.buf, + ffill->choice.secp256k1Sha256.signature.buf); +} + + +static Fulfillment_t *secp256k1ToFulfillment(const CC *cond) { + if (!cond->signature) { + return NULL; + } + + Fulfillment_t *ffill = calloc(1, sizeof(Fulfillment_t)); + ffill->present = Fulfillment_PR_secp256k1Sha256; + Secp256k1Fulfillment_t *sec = &ffill->choice.secp256k1Sha256; + + OCTET_STRING_fromBuf(&sec->publicKey, cond->publicKey, SECP256K1_PK_SIZE); + OCTET_STRING_fromBuf(&sec->signature, cond->signature, SECP256K1_SIG_SIZE); + return ffill; +} + + +int secp256k1IsFulfilled(const CC *cond) { + return cond->signature > 0; +} + + +static void secp256k1Free(CC *cond) { + free(cond->publicKey); + if (cond->signature) { + free(cond->signature); + } + free(cond); +} + + +static uint32_t secp256k1Subtypes(const CC *cond) { + return 0; +} + + +struct CCType cc_secp256k1Type = { 5, "secp256k1-sha-256", Condition_PR_secp256k1Sha256, 0, 0, &secp256k1Fingerprint, &secp256k1Cost, &secp256k1Subtypes, &secp256k1FromJSON, &secp256k1ToJSON, &secp256k1FromFulfillment, &secp256k1ToFulfillment, &secp256k1IsFulfilled, &secp256k1Free }; diff --git a/src/cryptoconditions/src/stamp-h1 b/src/cryptoconditions/src/stamp-h1 new file mode 100644 index 000000000..8f14c586a --- /dev/null +++ b/src/cryptoconditions/src/stamp-h1 @@ -0,0 +1 @@ +timestamp for src/cryptoconditions-config.h diff --git a/src/cryptoconditions/src/threshold.c b/src/cryptoconditions/src/threshold.c new file mode 100644 index 000000000..68f4c557d --- /dev/null +++ b/src/cryptoconditions/src/threshold.c @@ -0,0 +1,206 @@ + +#include "asn/Condition.h" +#include "asn/Fulfillment.h" +#include "asn/ThresholdFingerprintContents.h" +#include "asn/OCTET_STRING.h" +#include "include/cJSON.h" +#include "cryptoconditions.h" +#include "internal.h" + + +struct CCType cc_thresholdType; + + +static uint32_t thresholdSubtypes(const CC *cond) { + uint32_t mask = 0; + for (int i=0; isize; i++) { + mask |= getSubtypes(cond->subconditions[i]); + } + mask &= ~(1 << cc_thresholdType.typeId); + return mask; +} + + +static int cmpCostDesc(const void *a, const void *b) { + return (int) ( *(unsigned long*)b - *(unsigned long*)a ); +} + + +static unsigned long thresholdCost(const CC *cond) { + CC *sub; + unsigned long *costs = calloc(1, cond->size * sizeof(unsigned long)); + for (int i=0; isize; i++) { + sub = cond->subconditions[i]; + costs[i] = cc_getCost(sub); + } + qsort(costs, cond->size, sizeof(unsigned long), cmpCostDesc); + unsigned long cost = 0; + for (int i=0; ithreshold; i++) { + cost += costs[i]; + } + free(costs); + return cost + 1024 * cond->size; +} + + +static int thresholdVisitChildren(CC *cond, CCVisitor visitor) { + for (int i=0; ithreshold; i++) { + if (!cc_visit(cond->subconditions[i], visitor)) { + return 0; + } + } + return 1; +} + + +static int cmpConditions(const void *a, const void *b) { + /* Compare conditions by their ASN binary representation */ + unsigned char bufa[BUF_SIZE], bufb[BUF_SIZE]; + asn_enc_rval_t r0 = der_encode_to_buffer(&asn_DEF_Condition, *(Condition_t**)a, bufa, BUF_SIZE); + asn_enc_rval_t r1 = der_encode_to_buffer(&asn_DEF_Condition, *(Condition_t**)b, bufb, BUF_SIZE); + int diff = r0.encoded - r1.encoded; + return diff != 0 ? diff : strcmp(bufa, bufb); +} + + +static unsigned char *thresholdFingerprint(const CC *cond) { + /* Create fingerprint */ + ThresholdFingerprintContents_t *fp = calloc(1, sizeof(ThresholdFingerprintContents_t)); + fp->threshold = cond->threshold; + for (int i=0; isize; i++) { + asn_set_add(&fp->subconditions2, asnConditionNew(cond->subconditions[i])); + } + qsort(fp->subconditions2.list.array, cond->size, sizeof(Condition_t*), cmpConditions); + return hashFingerprintContents(&asn_DEF_ThresholdFingerprintContents, fp); +} + + +static CC *thresholdFromFulfillment(const Fulfillment_t *ffill) { + ThresholdFulfillment_t *t = ffill->choice.thresholdSha256; + int threshold = t->subfulfillments.list.count; + int size = threshold + t->subconditions.list.count; + + CC **subconditions = calloc(size, sizeof(CC*)); + + for (int i=0; isubfulfillments.list.array[i]) : + mkAnon(t->subconditions.list.array[i-threshold]); + + if (!subconditions[i]) { + for (int j=0; jtype = &cc_thresholdType; + cond->threshold = threshold; + cond->size = size; + cond->subconditions = subconditions; + return cond; +} + + +static int cmpByCostDesc(const void *c1, const void *c2) { + return cc_getCost(*((CC**)c1)) - cc_getCost(*((CC**)c2)); +} + + +static Fulfillment_t *thresholdToFulfillment(const CC *cond) { + CC *sub; + Fulfillment_t *fulfillment; + + qsort(cond->subconditions, cond->size, sizeof(CC*), cmpByCostDesc); + + ThresholdFulfillment_t *tf = calloc(1, sizeof(ThresholdFulfillment_t)); + + int needed = cond->threshold; + + for (int i=0; isize; i++) { + sub = cond->subconditions[i]; + if (needed && (fulfillment = asnFulfillmentNew(sub))) { + asn_set_add(&tf->subfulfillments, fulfillment); + needed--; + } else { + asn_set_add(&tf->subconditions, asnConditionNew(cond->subconditions[i])); + } + } + + if (needed) { + ASN_STRUCT_FREE(asn_DEF_ThresholdFulfillment, tf); + return NULL; + } + + fulfillment = calloc(1, sizeof(Fulfillment_t)); + fulfillment->present = Fulfillment_PR_thresholdSha256; + fulfillment->choice.thresholdSha256 = tf; + return fulfillment; +} + + +static CC *thresholdFromJSON(const cJSON *params, unsigned char *err) { + cJSON *threshold_item = cJSON_GetObjectItem(params, "threshold"); + if (!cJSON_IsNumber(threshold_item)) { + strcpy(err, "threshold must be a number"); + return NULL; + } + + cJSON *subfulfillments_item = cJSON_GetObjectItem(params, "subfulfillments"); + if (!cJSON_IsArray(subfulfillments_item)) { + strcpy(err, "subfulfullments must be an array"); + return NULL; + } + + CC *cond = calloc(1, sizeof(CC)); + cond->type = &cc_thresholdType; + cond->threshold = (long) threshold_item->valuedouble; + cond->size = cJSON_GetArraySize(subfulfillments_item); + cond->subconditions = calloc(cond->size, sizeof(CC*)); + + cJSON *sub; + for (int i=0; isize; i++) { + sub = cJSON_GetArrayItem(subfulfillments_item, i); + cond->subconditions[i] = cc_conditionFromJSON(sub, err); + if (err[0]) return NULL; + } + + return cond; +} + + +static void thresholdToJSON(const CC *cond, cJSON *params) { + cJSON *subs = cJSON_CreateArray(); + cJSON_AddNumberToObject(params, "threshold", cond->threshold); + for (int i=0; isize; i++) { + cJSON_AddItemToArray(subs, cc_conditionToJSON(cond->subconditions[i])); + } + cJSON_AddItemToObject(params, "subfulfillments", subs); +} + + +static int thresholdIsFulfilled(const CC *cond) { + int nFulfilled = 0; + for (int i=0; ithreshold; i++) { + if (!cc_isFulfilled(cond->subconditions[i])) { + nFulfilled++; + } + if (nFulfilled == cond->threshold) { + return 1; + } + } + return 0; +} + + +static void thresholdFree(CC *cond) { + for (int i=0; isize; i++) { + cc_free(cond->subconditions[i]); + } + free(cond->subconditions); + free(cond); +} + + +struct CCType cc_thresholdType = { 2, "threshold-sha-256", Condition_PR_thresholdSha256, 1, &thresholdVisitChildren, &thresholdFingerprint, &thresholdCost, &thresholdSubtypes, &thresholdFromJSON, &thresholdToJSON, &thresholdFromFulfillment, &thresholdToFulfillment, &thresholdIsFulfilled, &thresholdFree }; diff --git a/src/cryptoconditions/src/utils.c b/src/cryptoconditions/src/utils.c new file mode 100644 index 000000000..d1e63629f --- /dev/null +++ b/src/cryptoconditions/src/utils.c @@ -0,0 +1,208 @@ +#include +#include +#include +#include +#include + +#include "include/cJSON.h" +#include "include/sha256.h" +#include "asn/asn_application.h" +#include "cryptoconditions.h" +#include "internal.h" + + +static unsigned char encoding_table[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', + 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', + 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', + 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', + 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', + 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', + 'w', 'x', 'y', 'z', '0', '1', '2', '3', + '4', '5', '6', '7', '8', '9', '+', '/'}; +static unsigned char *decoding_table = NULL; +static int mod_table[] = {0, 2, 1}; + + +void build_decoding_table() { + decoding_table = malloc(256); + for (int i = 0; i < 64; i++) + decoding_table[(unsigned char) encoding_table[i]] = i; +} + + +unsigned char *base64_encode(const unsigned char *data, size_t input_length) { + + size_t output_length = 4 * ((input_length + 2) / 3); + + unsigned char *encoded_data = malloc(output_length + 1); + if (encoded_data == NULL) return NULL; + + for (int i = 0, j = 0; i < input_length;) { + + uint32_t octet_a = i < input_length ? (unsigned char)data[i++] : 0; + uint32_t octet_b = i < input_length ? (unsigned char)data[i++] : 0; + uint32_t octet_c = i < input_length ? (unsigned char)data[i++] : 0; + + uint32_t triple = (octet_a << 0x10) + (octet_b << 0x08) + octet_c; + + encoded_data[j++] = encoding_table[(triple >> 3 * 6) & 0x3F]; + encoded_data[j++] = encoding_table[(triple >> 2 * 6) & 0x3F]; + encoded_data[j++] = encoding_table[(triple >> 1 * 6) & 0x3F]; + encoded_data[j++] = encoding_table[(triple >> 0 * 6) & 0x3F]; + } + + int strip = mod_table[input_length % 3]; + for (int i = 0; i < strip; i++) + encoded_data[output_length - 1 - i] = '\0'; + // make sure there's a null termination for string protocol + encoded_data[output_length] = '\0'; + + + // url safe + for (int i=0; i> 2 * 8) & 0xFF; + if (j < *output_length) decoded_data[j++] = (triple >> 1 * 8) & 0xFF; + if (j < *output_length) decoded_data[j++] = (triple >> 0 * 8) & 0xFF; + } + + return decoded_data; +} + + +void base64_cleanup() { + free(decoding_table); +} + + +void dumpStr(unsigned char *str, size_t len) { + if (-1 == len) len = strlen(str); + fprintf(stderr, "len:%i ", (int)len); + for (int i=0; ivaluestring, size); + if (!*data) { + sprintf(err, "%s must be valid base64 string", key); + return 0; + } + return 1; +} + + +int jsonGetBase64(const cJSON *params, unsigned char *key, unsigned char *err, unsigned char **data, size_t *size) +{ + cJSON *item = cJSON_GetObjectItem(params, key); + if (!item) { + sprintf(err, "%s is required", key); + return 0; + } + return checkDecodeBase64(item, key, err, data, size); +} + + +int jsonGetBase64Optional(const cJSON *params, unsigned char *key, unsigned char *err, unsigned char **data, size_t *size) { + cJSON *item = cJSON_GetObjectItem(params, key); + if (!item) { + return 1; + } + return checkDecodeBase64(item, key, err, data, size); +} + +void jsonAddBase64(cJSON *params, unsigned char *key, unsigned char *bin, size_t size) { + unsigned char *b64 = base64_encode(bin, size); + cJSON_AddItemToObject(params, key, cJSON_CreateString(b64)); + free(b64); +} + + +unsigned char *hashFingerprintContents(asn_TYPE_descriptor_t *asnType, void *fp) { + unsigned char buf[BUF_SIZE]; + asn_enc_rval_t rc = der_encode_to_buffer(asnType, fp, buf, BUF_SIZE); + ASN_STRUCT_FREE(*asnType, fp); + if (rc.encoded < 1) { + printf("Encoding fingerprint failed\n"); + return 0; + } + unsigned char *hash = malloc(32); + sha256(buf, rc.encoded, hash); + return hash; +} diff --git a/src/cryptoconditions/test-requirements.txt b/src/cryptoconditions/test-requirements.txt new file mode 100644 index 000000000..2858c9ae3 --- /dev/null +++ b/src/cryptoconditions/test-requirements.txt @@ -0,0 +1,3 @@ +nose +base58==0.2.5 +secp256k1 diff --git a/src/cryptoconditions/tests/__init__.py b/src/cryptoconditions/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/cryptoconditions/tests/custom-vectors/1000_test-minimal-eval.json b/src/cryptoconditions/tests/custom-vectors/1000_test-minimal-eval.json new file mode 100644 index 000000000..14ab8ca49 --- /dev/null +++ b/src/cryptoconditions/tests/custom-vectors/1000_test-minimal-eval.json @@ -0,0 +1,14 @@ +{ + "json": { + "type": "eval-sha-256", + "method": "testEval", + "params": "dGVzdEV2YWw" + }, + "cost": 131072, + "subtypes": [], + "fingerprintContents": "", + "fulfillment": "AF148008746573744576616C8108746573744576616C", + "conditionBinary": "AF27802062CC11575F91E1611379B5A0B53678805FC03858544FC28E72BB66A14629C08F8103100000", + "conditionUri": "ni:///sha-256;YswRV1-R4WETebWgtTZ4gF_AOFhUT8KOcrtmoUYpwI8?fpt=eval-sha-256&cost=1048576", + "message": "" +} diff --git a/src/cryptoconditions/tests/custom-vectors/1001_test-minimal-secp256k1.json b/src/cryptoconditions/tests/custom-vectors/1001_test-minimal-secp256k1.json new file mode 100644 index 000000000..d34de80fa --- /dev/null +++ b/src/cryptoconditions/tests/custom-vectors/1001_test-minimal-secp256k1.json @@ -0,0 +1,14 @@ +{ + "json": { + "type": "secp256k1-sha-256", + "publicKey": "AtXZaTBVNawpp3B5wR1PDdQGYc-W4E6XSl6NfjdO4iWq", + "signature": "nC1v8580C7r2XohL3_rnQ2p7dWiDnFuhF_poGCRfudo83sfP1NPfcZG9siY4_Ybz2aO4yyV_z5tU0JMcTQGV0w" + }, + "cost": 131072, + "subtypes": [], + "fingerprintContents": "", + "fulfillment": "A565802102D5D969305535AC29A77079C11D4F0DD40661CF96E04E974A5E8D7E374EE225AA81409C2D6FF39F340BBAF65E884BDFFAE7436A7B7568839C5BA117FA6818245FB9DA3CDEC7CFD4D3DF7191BDB22638FD86F3D9A3B8CB257FCF9B54D0931C4D0195D3", + "conditionBinary": "A52780209C2850F5147E9903DD317C650AC1D6E80E695280789887F2E3179E5C65C9DF3A8103020000", + "conditionUri": "ni:///sha-256;nChQ9RR-mQPdMXxlCsHW6A5pUoB4mIfy4xeeXGXJ3zo?fpt=secp256k1-sha-256&cost=131072", + "message": "" +} diff --git a/src/cryptoconditions/tests/test_ed25519.py b/src/cryptoconditions/tests/test_ed25519.py new file mode 100644 index 000000000..081a7efd5 --- /dev/null +++ b/src/cryptoconditions/tests/test_ed25519.py @@ -0,0 +1,73 @@ +import json +import base64 +from test_vectors import jsonRPC + + +def test_sign_ed25519_pass_simple(): + res = jsonRPC('signTreeEd25519', { + 'condition': { + 'type': 'ed25519-sha-256', + 'publicKey': "E0x0Ws4GhWhO_zBoUyaLbuqCz6hDdq11Ft1Dgbe9y9k", + }, + 'privateKey': '11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo', + 'message': '', + }) + + assert res == { + "num_signed": 1, + "condition": { + "type": "ed25519-sha-256", + "publicKey": "E0x0Ws4GhWhO_zBoUyaLbuqCz6hDdq11Ft1Dgbe9y9k", + "signature": "jcuovSRpHwqiC781KzSM1Jd0Qtyfge0cMGttUdLOVdjJlSBFLTtgpinASOaJpd-VGjhSGWkp1hPWuMAAZq6pAg" + } + } + + +def test_sign_ed25519_pass_prefix(): + res = jsonRPC('signTreeEd25519', { + 'condition': { + 'type': 'prefix-sha-256', + 'prefix': 'YmJi', + 'maxMessageLength': 3, + 'subfulfillment': { + 'type': 'ed25519-sha-256', + 'publicKey': "E0x0Ws4GhWhO_zBoUyaLbuqCz6hDdq11Ft1Dgbe9y9k", + } + }, + 'privateKey': '11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo', + 'message': '', + }) + + assert res == { + "num_signed": 1, + 'condition': { + 'type': 'prefix-sha-256', + 'prefix': 'YmJi', + 'maxMessageLength': 3, + 'subfulfillment': { + 'type': 'ed25519-sha-256', + 'publicKey': "E0x0Ws4GhWhO_zBoUyaLbuqCz6hDdq11Ft1Dgbe9y9k", + 'signature': '4Y6keUFEl4KgIum9e3MBdlhlp32FRas-1N1vhtdy5q3JEPdqMvmXo2Rb99fC6j_3vflh8_QtOEW5rj4utjMOBg', + } + }, + } + + +def test_sign_ed25519_fail(): + # privateKey doesnt match publicKey + res = jsonRPC('signTreeEd25519', { + 'condition': { + 'type': 'ed25519-sha-256', + 'publicKey': "E0x0Ws4GhWhO_zBoUyaLbuqCz6hDdq11Ft1Dgbe9y9k", + }, + 'privateKey': '22qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo', + 'message': '', + }) + + assert res == { + "num_signed": 0, + "condition": { + "type": "ed25519-sha-256", + "publicKey": "E0x0Ws4GhWhO_zBoUyaLbuqCz6hDdq11Ft1Dgbe9y9k", + } + } diff --git a/src/cryptoconditions/tests/test_failure_modes.py b/src/cryptoconditions/tests/test_failure_modes.py new file mode 100644 index 000000000..b95c8527e --- /dev/null +++ b/src/cryptoconditions/tests/test_failure_modes.py @@ -0,0 +1,63 @@ +import json +import ctypes +import base64 +from test_vectors import jsonRPC, so, decode_base64 as d64 + + +''' +These tests are aimed at edge cases of serverside deployment. + +As such, the main functions to test are decoding and verifying fulfillment payloads. +''' + + +cc_rfb = lambda f: so.cc_readFulfillmentBinary(f, len(f)) +cc_rcb = lambda f: so.cc_readConditionBinary(f, len(f)) + +unhex = lambda s: base64.b16decode(s.upper()) + + +def test_decode_valid_fulfillment(): + f = unhex('a42480206ee12ed43d7dce6fc0b2be20e6808380baafc03d400404bbf95165d7527b373a8100') + assert cc_rfb(f) + + +def test_decode_invalid_fulfillment(): + # This fulfillment payload has an invalid type ID but is otherwise valid + invalid_type_id = unhex('bf632480206ee12ed43d7dce6fc0b2be20e6808380baafc03d400404bbf95165d7527b373a8100') + assert cc_rfb(invalid_type_id) == 0 + assert cc_rfb('\0') == 0 + assert cc_rfb('') == 0 + + +def test_large_fulfillment(): + # This payload is valid and very large + f = unhex("a1839896b28083989680") + 10000000 * b'e' + \ + unhex("81030186a0a226a42480206ee12ed43d7dce6fc0b2be20e68083" + "80baafc03d400404bbf95165d7527b373a8100") + cond = cc_rfb(f) + buflen = len(f) + 1000 # Wiggle room + buf = ctypes.create_string_buffer(buflen) + assert so.cc_fulfillmentBinary(cond, buf, buflen) + so.cc_free(cond) + + +def test_decode_valid_condition(): + # Valid preimage + assert cc_rcb(d64('oCWAIMqXgRLKG73K-sIxs5oj3E2nhu_4FHxOcrmAd4Wv7ki7gQEB')) + + # Somewhat bogus condition (prefix with no subtypes) but nonetheless valid structure + assert cc_rcb(unhex("a10a8001618101ff82020700")) + + +def test_decode_invalid_condition(): + assert 0 == cc_rcb("") + assert 0 == cc_rcb("\0") + + # Bogus type ID + assert 0 == cc_rcb(unhex('bf630c80016181030186a082020700')) + + +def test_validate_empty_sigs(): + #// TODO: test failure mode: empty sig / null pointer + pass diff --git a/src/cryptoconditions/tests/test_secp256k1.py b/src/cryptoconditions/tests/test_secp256k1.py new file mode 100644 index 000000000..db36da218 --- /dev/null +++ b/src/cryptoconditions/tests/test_secp256k1.py @@ -0,0 +1,62 @@ +import json +import base64 +import hashlib +import secp256k1 +from test_vectors import jsonRPC, encode_base64, decode_base64 + + +key = secp256k1.PrivateKey() + + +def test_sign_secp256k1_pass_simple(): + pubkey = encode_base64(key.pubkey.serialize()) + msg = '' + res = jsonRPC('signTreeSecp256k1', { + 'condition': { + 'type': 'secp256k1-sha-256', + 'publicKey': pubkey, + }, + 'privateKey': encode_base64(key.private_key), + 'message': msg, + }) + + sig = encode_base64(key.ecdsa_serialize_compact(key.ecdsa_sign(msg))) + + assert res == { + "num_signed": 1, + "condition": { + "type": "secp256k1-sha-256", + "publicKey": pubkey, + "signature": sig + } + } + cond_bin = jsonRPC('encodeCondition', res['condition'])['bin'] + ffill_bin = jsonRPC('encodeFulfillment', res['condition'])['fulfillment'] + assert jsonRPC('verifyFulfillment', { + 'fulfillment': ffill_bin, + 'message': msg, + 'condition': cond_bin + }) == {'valid': True} + + + +def test_sign_secp256k1_fail(): + # privateKey doesnt match publicKey + pubkey = encode_base64(key.pubkey.serialize()) + msg = '' + res = jsonRPC('signTreeSecp256k1', { + 'condition': { + 'type': 'secp256k1-sha-256', + 'publicKey': pubkey, + }, + 'privateKey': encode_base64('0' * 32), + 'message': msg, + }) + + assert res == { + "num_signed": 0, + "condition": { + "type": "secp256k1-sha-256", + "publicKey": pubkey, + } + } diff --git a/src/cryptoconditions/tests/test_vectors.py b/src/cryptoconditions/tests/test_vectors.py new file mode 100644 index 000000000..b94ed9461 --- /dev/null +++ b/src/cryptoconditions/tests/test_vectors.py @@ -0,0 +1,149 @@ +import json +import ctypes +import base64 +import pytest +import os.path +from ctypes import * + + +v0000 = '0000_test-minimal-preimage' +v0001 = '0001_test-minimal-prefix' +v0002 = '0002_test-minimal-threshold' +v0003 = '0003_test-minimal-rsa' +v0004 = '0004_test-minimal-ed25519' +v0005 = '0005_test-basic-preimage' +v0006 = '0006_test-basic-prefix' +v0007 = '0007_test-basic-prefix-two-levels-deep' +v0010 = '0010_test-basic-threshold-same-fulfillment-twice' +v0015 = '0015_test-basic-ed25519' +v0016 = '0016_test-advanced-notarized-receipt' +v0017 = '0017_test-advanced-notarized-receipt-multiple-notaries' + +# These contain RSA conditions which are not implemented yet +#v0008 = '0008_test-basic-threshold' +#v0009 = '0009_test-basic-threshold-same-condition-twice' +#v0011 = '0011_test-basic-threshold-two-levels-deep' +#v0012 = '0012_test-basic-threshold-schroedinger' +#v0013 = '0013_test-basic-rsa' +#v0014 = '0014_test-basic-rsa4096' + +# Custom test vectors +v1000 = '1000_test-minimal-eval' +v1001 = '1001_test-minimal-secp256k1' + + +all_vectors = {v0000, v0001, v0002, v0004, v0005, v0006, v0007, v0010, + v0015, v0016, v0017, v1000, v1001} + + +@pytest.mark.parametrize('vectors_file', all_vectors) +def test_encodeCondition(vectors_file): + vectors = _read_vectors(vectors_file) + response = jsonRPC('encodeCondition', vectors['json']) + assert response == { + 'uri': vectors['conditionUri'], + 'bin': vectors['conditionBinary'], + } + + +@pytest.mark.parametrize('vectors_file', all_vectors) +def test_encodeFulfillment(vectors_file): + vectors = _read_vectors(vectors_file) + response = jsonRPC('encodeFulfillment', vectors['json']) + assert response == { + 'fulfillment': vectors['fulfillment'], + } + + +@pytest.mark.parametrize('vectors_file', all_vectors) +def test_verifyFulfillment(vectors_file): + vectors = _read_vectors(vectors_file) + req = { + 'fulfillment': vectors['fulfillment'], + 'message': vectors['message'], + 'condition': vectors['conditionBinary'], + } + assert jsonRPC('verifyFulfillment', req) == {'valid': True} + + +@pytest.mark.parametrize('vectors_file', all_vectors) +def test_decodeFulfillment(vectors_file): + vectors = _read_vectors(vectors_file) + response = jsonRPC('decodeFulfillment', { + 'fulfillment': vectors['fulfillment'], + }) + assert response == { + 'uri': vectors['conditionUri'], + 'bin': vectors['conditionBinary'], + } + + +@pytest.mark.parametrize('vectors_file', all_vectors) +def test_decodeCondition(vectors_file): + vectors = _read_vectors(vectors_file) + response = jsonRPC('decodeCondition', { + 'bin': vectors['conditionBinary'], + }) + assert response['uri'] == vectors['conditionUri'] + + +@pytest.mark.parametrize('vectors_file', all_vectors) +def test_json_condition_json_parse(vectors_file): + vectors = _read_vectors(vectors_file) + err = ctypes.create_string_buffer(100) + cc = so.cc_conditionFromJSONString(json.dumps(vectors['json']).encode(), err) + out_ptr = so.cc_conditionToJSONString(cc) + out = ctypes.cast(out_ptr, c_char_p).value.decode() + assert json.loads(out) == vectors['json'] + + +def b16_to_b64(b16): + return base64.urlsafe_b64encode(base64.b16decode(b16)).rstrip('=') + + +def decode_base64(data): + """Decode base64, padding being optional. + + :param data: Base64 data as an ASCII byte string + :returns: The decoded byte string. + """ + missing_padding = len(data) % 4 + if missing_padding: + data += '=' * (4 - missing_padding) + return base64.urlsafe_b64decode(data) + + +def encode_base64(data): + return base64.urlsafe_b64encode(data).rstrip(b'=') + + +def b16_to_b64(b16): + return encode_base64(base64.b16decode(b16)).decode() + + +def _read_vectors(name): + paths = ['ext/crypto-conditions/test-vectors/valid/%s.json', + 'tests/custom-vectors/%s.json'] + for fmt in paths: + path = fmt % name + if os.path.isfile(path): + vectors = json.load(open(path)) + break + else: + raise IOError("Vectors file not found: %s.json" % name) + for key in ['conditionBinary', 'fulfillment', 'message']: + vectors[key] = b16_to_b64(vectors[key]) + return vectors + + +so = cdll.LoadLibrary('.libs/libcryptoconditions.so') +so.cc_jsonRPC.restype = c_char_p + + +def jsonRPC(method, params): + req = json.dumps({ + 'method': method, + 'params': params, + }) + out = so.cc_jsonRPC(req.encode()) + return json.loads(out.decode()) From 91fe980a98e198564a3af89686c4ed50d0538230 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Mon, 12 Mar 2018 18:22:38 -0300 Subject: [PATCH 0612/1062] fix cryptoconditions qa --- qa/cryptoconditions/test_integration.py | 94 ------------------------- qa/cryptoconditions/testsupport.py | 4 +- 2 files changed, 2 insertions(+), 96 deletions(-) diff --git a/qa/cryptoconditions/test_integration.py b/qa/cryptoconditions/test_integration.py index 1f6746b69..16b5f93a6 100644 --- a/qa/cryptoconditions/test_integration.py +++ b/qa/cryptoconditions/test_integration.py @@ -91,45 +91,6 @@ def test_oversize_fulfillment(inp): assert 'scriptsig-size' in str(e), str(e) -@fanout_input(6) -def test_eval_basic(inp): - eval_cond = { - 'type': 'eval-sha-256', - 'method': 'testEval', - 'params': encode_base64('testEval') - } - - # Setup some eval outputs - spend0 = { - 'inputs': [inp], - 'outputs': [ - {'amount': 500, 'script': {'condition': eval_cond}}, - {'amount': 500, 'script': {'condition': eval_cond}} - ] - } - spend0_txid = submit(sign(spend0)) - assert rpc.getrawtransaction(spend0_txid) - - # Test a good fulfillment - spend1 = { - 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {'fulfillment': eval_cond}}], - 'outputs': [{'amount': 500, 'script': {'condition': eval_cond}}] - } - spend1_txid = submit(sign(spend1)) - assert rpc.getrawtransaction(spend1_txid) - - # Test a bad fulfillment - eval_cond['params'] = '' - spend2 = { - 'inputs': [{'txid': spend0_txid, 'idx': 1, 'script': {'fulfillment': eval_cond}}], - 'outputs': [{'amount': 500, 'script': {'condition': eval_cond}}] - } - try: - assert not submit(sign(spend2)), 'should raise an error' - except RPCError as e: - assert SCRIPT_FALSE in str(e), str(e) - - @fanout_input(7) def test_secp256k1_condition(inp): ec_cond = { @@ -169,61 +130,6 @@ def test_secp256k1_condition(inp): except RPCError as e: assert SCRIPT_FALSE in str(e), str(e) - -@fanout_input(20) -def test_eval_replacement(inp): - eval_cond = { - 'type': 'eval-sha-256', - 'method': 'testReplace', - 'params': '', - } - - # Setup replaceable output - spend0 = { - 'inputs': [inp], - 'outputs': [ - {'amount': 1000, 'script': {'condition': eval_cond}}, - ] - } - spend0_txid = submit(sign(spend0)) - assert rpc.getrawtransaction(spend0_txid) - - b64_1 = 'AQ==' - spend1 = { - 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {'fulfillment': eval_cond}}], - 'outputs': [{'amount': 1000, 'script': {'op_return': b64_1}}] - } - - b64_2 = 'Ag==' - spend2 = { - 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {'fulfillment': eval_cond}}], - 'outputs': [{'amount': 1000, 'script': {'op_return': b64_2}}] - } - - # If spend2 is already registered, return true, as this test has already been performed - spend2_txid = hoek.encodeTx(sign(spend2))['txid'] - try: - rpc.getrawtransaction(spend2_txid) - return - except RPCError: - pass - - # Send replaceable - spend1_txid = submit(sign(spend1)) - assert rpc.getrawtransaction(spend1_txid) - - - # Send replacement (higher OP_RETURN data) - spend2_txid = submit(sign(spend2)) - assert rpc.getrawtransaction(spend2_txid) - - # Now the first transaction has gone - try: - assert not rpc.getrawtransaction(spend1_txid), "should raise an error" - except RPCError as e: - assert 'No information available about transaction' in str(e), str(e) - - if __name__ == '__main__': logging.basicConfig(level=logging.INFO) for name, f in globals().items(): diff --git a/qa/cryptoconditions/testsupport.py b/qa/cryptoconditions/testsupport.py index a127379f6..055f4cc30 100644 --- a/qa/cryptoconditions/testsupport.py +++ b/qa/cryptoconditions/testsupport.py @@ -32,7 +32,7 @@ class JsonClient(object): def run_cmd(cmd): proc = subprocess.Popen(cmd, stdout=subprocess.PIPE) - assert proc.wait() == 0 + assert proc.wait() == 0, cmd return proc.stdout.read() @@ -68,7 +68,7 @@ def wait_for_block(height): try: return rpc.getblock(str(height)) except RPCError as e: - time.sleep(3) + time.sleep(1) raise Exception('Time out waiting for block at height %s' % height) From 132a25500027b3c184604b869169efc888d2747c Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 13 Mar 2018 00:47:10 +0000 Subject: [PATCH 0613/1062] Add link to Overwinter info page --- src/consensus/upgrades.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/consensus/upgrades.cpp b/src/consensus/upgrades.cpp index 17606bc63..eaf8fad8b 100644 --- a/src/consensus/upgrades.cpp +++ b/src/consensus/upgrades.cpp @@ -22,7 +22,7 @@ const struct NUInfo NetworkUpgradeInfo[Consensus::MAX_NETWORK_UPGRADES] = { { /*.nBranchId =*/ 0x5ba81b19, /*.strName =*/ "Overwinter", - /*.strInfo =*/ "TBD", + /*.strInfo =*/ "See https://z.cash/upgrade/overwinter.html for details.", } }; From 5298d41fae3be91ad831241ae066a4ec623cef29 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Mar 2018 21:33:11 +0200 Subject: [PATCH 0614/1062] Make sure pindexWalk is non-null --- src/chain.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/chain.cpp b/src/chain.cpp index 9cd13d997..7bb72d5d3 100644 --- a/src/chain.cpp +++ b/src/chain.cpp @@ -81,7 +81,8 @@ CBlockIndex* CBlockIndex::GetAncestor(int height) CBlockIndex* pindexWalk = this; int heightWalk = nHeight; - while (heightWalk > height) { + while ( heightWalk > height && pindexWalk != 0 ) + { int heightSkip = GetSkipHeight(heightWalk); int heightSkipPrev = GetSkipHeight(heightWalk - 1); if (pindexWalk->pskip != NULL && From a510b4752d1c380d6a446e876491d5e249a76724 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 16 Mar 2018 11:45:45 -0700 Subject: [PATCH 0615/1062] Enable mempool logging in tx expiry QA test. --- qa/rpc-tests/mempool_tx_expiry.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qa/rpc-tests/mempool_tx_expiry.py b/qa/rpc-tests/mempool_tx_expiry.py index d0f8073a4..9edf156d2 100755 --- a/qa/rpc-tests/mempool_tx_expiry.py +++ b/qa/rpc-tests/mempool_tx_expiry.py @@ -17,7 +17,7 @@ from decimal import Decimal class MempoolTxExpiryTest(BitcoinTestFramework): def setup_nodes(self): - return start_nodes(4, self.options.tmpdir, [["-nuparams=5ba81b19:205", "-txexpirydelta=4"]] * 4) + return start_nodes(4, self.options.tmpdir, [["-nuparams=5ba81b19:205", "-txexpirydelta=4", "-debug=mempool"]] * 4) # Test before, at, and after expiry block # TODO: Test case of dependent txs in reorgs From eb138626676880602e262291770f70f8cdc770ce Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 16 Mar 2018 11:46:39 -0700 Subject: [PATCH 0616/1062] Closes #3084. Log txid when removing expired txs from mempool. --- src/txmempool.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/txmempool.cpp b/src/txmempool.cpp index acb671ec2..650239e89 100644 --- a/src/txmempool.cpp +++ b/src/txmempool.cpp @@ -271,6 +271,7 @@ void CTxMemPool::removeExpired(unsigned int nBlockHeight) for (const CTransaction& tx : transactionsToRemove) { list removed; remove(tx, removed, true); + LogPrint("mempool", "Removing expired txid: %s\n", tx.GetHash().ToString()); } } From 2f761371d2099957b5bbdb4884169d41e3e6ded4 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 16 Mar 2018 15:18:34 -0700 Subject: [PATCH 0617/1062] Add qa test for cache invalidation bug found in v1.0.0 to v1.0.3. --- qa/pull-tester/rpc-tests.sh | 1 + qa/rpc-tests/wallet_anchorfork.py | 112 ++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100755 qa/rpc-tests/wallet_anchorfork.py diff --git a/qa/pull-tester/rpc-tests.sh b/qa/pull-tester/rpc-tests.sh index 92db2606f..0ed693951 100755 --- a/qa/pull-tester/rpc-tests.sh +++ b/qa/pull-tester/rpc-tests.sh @@ -14,6 +14,7 @@ testScripts=( 'paymentdisclosure.py' 'prioritisetransaction.py' 'wallet_treestate.py' + 'wallet_anchorfork.py' 'wallet_protectcoinbase.py' 'wallet_shieldcoinbase.py' 'wallet_mergetoaddress.py' diff --git a/qa/rpc-tests/wallet_anchorfork.py b/qa/rpc-tests/wallet_anchorfork.py new file mode 100755 index 000000000..a4df66daf --- /dev/null +++ b/qa/rpc-tests/wallet_anchorfork.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python2 +# Copyright (c) 2018 The Zcash developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +from test_framework.test_framework import BitcoinTestFramework +from test_framework.authproxy import JSONRPCException +from test_framework.util import assert_equal, initialize_chain_clean, \ + start_nodes, stop_nodes, connect_nodes_bi, \ + wait_and_assert_operationid_status, wait_bitcoinds +from decimal import Decimal + +class WalletAnchorForkTest (BitcoinTestFramework): + + def setup_chain(self): + print("Initializing test directory "+self.options.tmpdir) + initialize_chain_clean(self.options.tmpdir, 4) + + # Start nodes with -regtestprotectcoinbase to set fCoinbaseMustBeProtected to true. + def setup_network(self, split=False): + self.nodes = start_nodes(3, self.options.tmpdir, extra_args=[['-regtestprotectcoinbase', '-debug=zrpc']] * 3 ) + connect_nodes_bi(self.nodes,0,1) + connect_nodes_bi(self.nodes,1,2) + connect_nodes_bi(self.nodes,0,2) + self.is_network_split=False + self.sync_all() + + def run_test (self): + print "Mining blocks..." + self.nodes[0].generate(4) + + walletinfo = self.nodes[0].getwalletinfo() + assert_equal(walletinfo['immature_balance'], 40) + assert_equal(walletinfo['balance'], 0) + + self.sync_all() + self.nodes[1].generate(102) + self.sync_all() + + assert_equal(self.nodes[0].getbalance(), 40) + assert_equal(self.nodes[1].getbalance(), 20) + assert_equal(self.nodes[2].getbalance(), 0) + + # At this point in time, commitment tree is the empty root + + # Node 0 creates a joinsplit transaction + mytaddr0 = self.nodes[0].getnewaddress() + myzaddr0 = self.nodes[0].z_getnewaddress() + recipients = [] + recipients.append({"address":myzaddr0, "amount": Decimal('10.0') - Decimal('0.0001')}) + myopid = self.nodes[0].z_sendmany(mytaddr0, recipients) + wait_and_assert_operationid_status(self.nodes[0], myopid) + + # Sync up mempools and mine the transaction. All nodes have the same anchor. + self.sync_all() + self.nodes[0].generate(1) + self.sync_all() + + # Stop nodes. + stop_nodes(self.nodes) + wait_bitcoinds() + + # Relaunch nodes and partition network into two: + # A: node 0 + # B: node 1, 2 + self.nodes = start_nodes(3, self.options.tmpdir, extra_args=[['-regtestprotectcoinbase', '-debug=zrpc']] * 3 ) + connect_nodes_bi(self.nodes,1,2) + + # Partition B, node 1 mines an empty block + self.nodes[1].generate(1) + + # Partition A, node 0 creates a joinsplit transaction + recipients = [] + recipients.append({"address":myzaddr0, "amount": Decimal('10.0') - Decimal('0.0001')}) + myopid = self.nodes[0].z_sendmany(mytaddr0, recipients) + txid = wait_and_assert_operationid_status(self.nodes[0], myopid) + rawhex = self.nodes[0].getrawtransaction(txid) + + # Partition A, node 0 mines a block with the transaction + self.nodes[0].generate(1) + + # Partition B, node 1 mines the same joinsplit transaction + txid2 = self.nodes[1].sendrawtransaction(rawhex) + assert_equal(txid, txid2) + self.nodes[1].generate(1) + + # Check that Partition B is one block ahead and that they have different tips + assert_equal(self.nodes[0].getblockcount() + 1, self.nodes[1].getblockcount()) + assert( self.nodes[0].getbestblockhash() != self.nodes[1].getbestblockhash()) + + # Shut down all nodes so any in-memory state is saved to disk + stop_nodes(self.nodes) + wait_bitcoinds() + + # Relaunch nodes and reconnect the entire network + self.nodes = start_nodes(3, self.options.tmpdir, extra_args=[['-regtestprotectcoinbase', '-debug=zrpc']] * 3 ) + connect_nodes_bi(self.nodes,0, 1) + connect_nodes_bi(self.nodes,1, 2) + connect_nodes_bi(self.nodes,0, 2) + + # Mine a new block and let it propagate + self.nodes[1].generate(1) + + # Due to a bug in v1.0.0-1.0.3, node 0 will die with a tree root assertion, so sync_all() will throw an exception. + self.sync_all() + + # v1.0.4 will reach here safely + assert_equal( self.nodes[0].getbestblockhash(), self.nodes[1].getbestblockhash()) + assert_equal( self.nodes[1].getbestblockhash(), self.nodes[2].getbestblockhash()) + +if __name__ == '__main__': + WalletAnchorForkTest().main() From b740a990797a9e4002d2897b1cdb67d73673aff5 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 16 Mar 2018 17:16:22 -0700 Subject: [PATCH 0618/1062] Remove local function wait_and_assert_operationid_status which is now defined in the test framework for shared usage. --- qa/rpc-tests/wallet_protectcoinbase.py | 28 ------------------- qa/rpc-tests/zkey_import_export.py | 37 +++----------------------- 2 files changed, 4 insertions(+), 61 deletions(-) diff --git a/qa/rpc-tests/wallet_protectcoinbase.py b/qa/rpc-tests/wallet_protectcoinbase.py index b32da1dd1..afe851a16 100755 --- a/qa/rpc-tests/wallet_protectcoinbase.py +++ b/qa/rpc-tests/wallet_protectcoinbase.py @@ -42,34 +42,6 @@ class WalletProtectCoinbaseTest (BitcoinTestFramework): self.is_network_split=False self.sync_all() - # Returns txid if operation was a success or None - def wait_and_assert_operationid_status(self, myopid, in_status='success', in_errormsg=None): - print('waiting for async operation {}'.format(myopid)) - opids = [] - opids.append(myopid) - timeout = 300 - status = None - errormsg = None - txid = None - for x in xrange(1, timeout): - results = self.nodes[0].z_getoperationresult(opids) - if len(results)==0: - time.sleep(1) - else: - status = results[0]["status"] - if status == "failed": - errormsg = results[0]['error']['message'] - elif status == "success": - txid = results[0]['result']['txid'] - break - print('...returned status: {}'.format(status)) - assert_equal(in_status, status) - if errormsg is not None: - assert(in_errormsg is not None) - assert_equal(in_errormsg in errormsg, True) - print('...returned error: {}'.format(errormsg)) - return txid - def run_test (self): print "Mining blocks..." diff --git a/qa/rpc-tests/zkey_import_export.py b/qa/rpc-tests/zkey_import_export.py index 243ca3909..323debe31 100755 --- a/qa/rpc-tests/zkey_import_export.py +++ b/qa/rpc-tests/zkey_import_export.py @@ -5,7 +5,8 @@ from decimal import Decimal from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import assert_equal, assert_greater_than, start_nodes, initialize_chain_clean, connect_nodes_bi +from test_framework.util import assert_equal, assert_greater_than, start_nodes,\ + initialize_chain_clean, connect_nodes_bi, wait_and_assert_operationid_status import logging import time @@ -30,42 +31,12 @@ class ZkeyImportExportTest (BitcoinTestFramework): self.is_network_split=False self.sync_all() - # TODO: Refactor in z_addr test_framework file - # Returns txid if operation was a success or None - def wait_and_assert_operationid_status(self, node, myopid, in_status='success', in_errormsg=None): - print('waiting for async operation {}'.format(myopid)) - opids = [] - opids.append(myopid) - timeout = 300 - status = None - errormsg = None - txid = None - for x in xrange(1, timeout): - results = node.z_getoperationresult(opids) - if len(results)==0: - time.sleep(1) - else: - print("Results", results[0]) - status = results[0]["status"] - if status == "failed": - errormsg = results[0]['error']['message'] - elif status == "success": - txid = results[0]['result']['txid'] - break - print('...returned status: {}'.format(status)) - assert_equal(in_status, status) - if errormsg is not None: - assert(in_errormsg is not None) - assert_equal(in_errormsg in errormsg, True) - print('...returned error: {}'.format(errormsg)) - return txid - def run_test(self): [alice, bob, charlie, david, miner] = self.nodes def z_send(from_node, from_addr, to_addr, amount): opid = from_node.z_sendmany(from_addr, [{"address": to_addr, "amount": Decimal(amount)}]) - self.wait_and_assert_operationid_status(from_node, opid) + wait_and_assert_operationid_status(from_node, opid) self.sync_all() miner.generate(1) self.sync_all() @@ -112,7 +83,7 @@ class ZkeyImportExportTest (BitcoinTestFramework): # Shield Alice's coinbase funds to her zaddr alice_zaddr = alice.z_getnewaddress() res = alice.z_shieldcoinbase("*", alice_zaddr) - self.wait_and_assert_operationid_status(alice, res['opid']) + wait_and_assert_operationid_status(alice, res['opid']) self.sync_all() miner.generate(1) self.sync_all() From aaff5dd10cdb03f31afe291d48f063bab969de31 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Sat, 17 Mar 2018 15:13:10 -0300 Subject: [PATCH 0619/1062] explicitly disable replacementpool if cryptoconditions is not enabled --- src/main.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main.cpp b/src/main.cpp index 62fa0c726..fa366964f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1116,6 +1116,11 @@ CAmount GetMinRelayFee(const CTransaction& tx, unsigned int nBytes, bool fAllowF */ bool AcceptToReplacementPool(const CTransaction &tx, CValidationState &state) { + // This is not actually required; if crypto-conditions is disabled, then transactions + // with replaceable outputs will not be accepted as standard. However, just to be a + // bit more explicit. + if (!IsCryptoConditionsEnabled()) return false; + CTxReplacementPoolItem item(tx, GetHeight()); if (!SetReplacementParams(item)) return false; From 49cd4daab29186139ef18b35340cd3552f36144f Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Sat, 17 Mar 2018 23:09:14 -0300 Subject: [PATCH 0620/1062] cryptoconditions secp256k1 tests canonical signature --- .../src/include/secp256k1/include/secp256k1.h | 12 ++++++++++++ .../src/include/secp256k1/src/secp256k1.c | 8 ++++++++ src/cryptoconditions/src/secp256k1.c | 7 ++++++- src/cryptoconditions/tests/test_failure_modes.py | 15 +++++++++++++++ 4 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/cryptoconditions/src/include/secp256k1/include/secp256k1.h b/src/cryptoconditions/src/include/secp256k1/include/secp256k1.h index 06afd4c65..9db5cf3a8 100644 --- a/src/cryptoconditions/src/include/secp256k1/include/secp256k1.h +++ b/src/cryptoconditions/src/include/secp256k1/include/secp256k1.h @@ -95,6 +95,18 @@ SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_verify( int pubkeylen ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(5); +/** Check that signature is in canonical form + * Returns: 1: In canonical form + * 0: Non canonical + * -1: invalid signature + * In: sig: the signature being verified (cannot be NULL) + * siglen: the length of the signature + */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_check_canonical_sig( + const unsigned char *sig, + int siglen +) SECP256K1_ARG_NONNULL(1); + /** A pointer to a function to deterministically generate a nonce. * Returns: 1 if a nonce was successfully generated. 0 will cause signing to fail. * In: msg32: the 32-byte message hash being verified (will not be NULL) diff --git a/src/cryptoconditions/src/include/secp256k1/src/secp256k1.c b/src/cryptoconditions/src/include/secp256k1/src/secp256k1.c index d6192dc4e..48569ad9e 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/secp256k1.c +++ b/src/cryptoconditions/src/include/secp256k1/src/secp256k1.c @@ -85,6 +85,14 @@ int secp256k1_ecdsa_verify(const secp256k1_context_t* ctx, const unsigned char * return ret; } + +int secp256k1_ecdsa_check_canonical_sig(const unsigned char *sig, int siglen) { + secp256k1_ecdsa_sig_t s; + if (!secp256k1_ecdsa_sig_parse(&s, sig, siglen)) return -1; + return !secp256k1_scalar_is_high(&s.s); +} + + static int nonce_function_rfc6979(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, unsigned int counter, const void *data) { secp256k1_rfc6979_hmac_sha256_t rng; unsigned int i; diff --git a/src/cryptoconditions/src/secp256k1.c b/src/cryptoconditions/src/secp256k1.c index 507c9c84f..9e09cabe5 100644 --- a/src/cryptoconditions/src/secp256k1.c +++ b/src/cryptoconditions/src/secp256k1.c @@ -77,7 +77,12 @@ int secp256k1Verify(CC *cond, CCVisitor visitor) { if (cond->type->typeId != cc_secp256k1Type.typeId) return 1; // TODO: test failure mode: empty sig / null pointer initVerify(); - int rc = secp256k1_ecdsa_verify(ec_ctx_verify, visitor.msg, cond->signature, SECP256K1_SIG_SIZE, + + // Test for non canonical S + int rc = secp256k1_ecdsa_check_canonical_sig(cond->signature, SECP256K1_SIG_SIZE); + if (rc == 1) + // Test for correct sig + rc = secp256k1_ecdsa_verify(ec_ctx_verify, visitor.msg, cond->signature, SECP256K1_SIG_SIZE, cond->publicKey, SECP256K1_PK_SIZE); return rc == 1; } diff --git a/src/cryptoconditions/tests/test_failure_modes.py b/src/cryptoconditions/tests/test_failure_modes.py index b95c8527e..4e252424f 100644 --- a/src/cryptoconditions/tests/test_failure_modes.py +++ b/src/cryptoconditions/tests/test_failure_modes.py @@ -61,3 +61,18 @@ def test_decode_invalid_condition(): def test_validate_empty_sigs(): #// TODO: test failure mode: empty sig / null pointer pass + + +def test_non_canonical_secp256k1(): + cond = { + "type": "secp256k1-sha-256", + "publicKey": "AtXZaTBVNawpp3B5wR1PDdQGYc-W4E6XSl6NfjdO4iWq", + # Signature is correct, but non canonical; validation should fail + "signature": "nC1v8580C7r2XohL3_rnQ2p7dWiDnFuhF_poGCRfudrDITgwKywgjm5CTdnHAnkK4QskG4nI0KBrActwgzSrbg" + } + res = jsonRPC('verifyFulfillment', { + 'fulfillment': jsonRPC('encodeFulfillment', cond)['fulfillment'], + 'condition': jsonRPC('encodeCondition', cond)['bin'], + 'message': '' + }) + assert res['valid'] == False From 18c6cfce1d1a1d37606a4c6d2fafc805ac0ca4d1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Mar 2018 14:21:00 +0200 Subject: [PATCH 0621/1062] MoM support --- src/komodo.h | 86 +++++++++++++++++++++++++++++++++---------- src/komodo_events.h | 6 ++- src/komodo_notary.h | 4 +- src/komodo_structs.h | 10 +++-- src/wallet/wallet.cpp | 3 +- 5 files changed, 81 insertions(+), 28 deletions(-) diff --git a/src/komodo.h b/src/komodo.h index 129ea3b5f..b655ab8dc 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -73,7 +73,7 @@ int32_t komodo_currentheight() int32_t komodo_parsestatefile(struct komodo_state *sp,FILE *fp,char *symbol,char *dest) { static int32_t errs; - int32_t func,ht,notarized_height,num,matched=0; uint256 notarized_hash,notarized_desttxid; uint8_t pubkeys[64][33]; + int32_t func,ht,notarized_height,num,matched=0,MoMdepth; uint256 MoM,notarized_hash,notarized_desttxid; uint8_t pubkeys[64][33]; if ( (func= fgetc(fp)) != EOF ) { if ( ASSETCHAINS_SYMBOL[0] == 0 && strcmp(symbol,"KMD") == 0 ) @@ -97,7 +97,7 @@ int32_t komodo_parsestatefile(struct komodo_state *sp,FILE *fp,char *symbol,char } } else printf("illegal num.%d\n",num); } - else if ( func == 'N' ) + else if ( func == 'N' || func == 'M' ) { if ( fread(¬arized_height,1,sizeof(notarized_height),fp) != sizeof(notarized_height) ) errs++; @@ -105,10 +105,22 @@ int32_t komodo_parsestatefile(struct komodo_state *sp,FILE *fp,char *symbol,char errs++; if ( fread(¬arized_desttxid,1,sizeof(notarized_desttxid),fp) != sizeof(notarized_desttxid) ) errs++; - if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 && sp != 0 ) - printf("%s load[%s.%d -> %s] NOTARIZED %d %s\n",ASSETCHAINS_SYMBOL,symbol,sp->NUM_NPOINTS,dest,notarized_height,notarized_hash.ToString().c_str()); + if ( func == 'M' ) + { + if ( fread(&MoM,1,sizeof(MoM),fp) != sizeof(MoM) ) + errs++; + if ( fread(&MoMdepth,1,sizeof(MoMdepth),fp) != sizeof(MoMdepth) ) + errs++; + if ( 1 && ASSETCHAINS_SYMBOL[0] != 0 && sp != 0 ) + printf("%s load[%s.%d -> %s] NOTARIZED %d %s MoM.%s %d\n",ASSETCHAINS_SYMBOL,symbol,sp->NUM_NPOINTS,dest,notarized_height,notarized_hash.ToString().c_str(),MoM.ToString().c_str(),MoMdepth); + } + else + { + memset(&MoM,0,sizeof(MoM)); + MoMdepth = 0; + } //if ( matched != 0 ) global independent states -> inside *sp - komodo_eventadd_notarized(sp,symbol,ht,dest,notarized_hash,notarized_desttxid,notarized_height); + komodo_eventadd_notarized(sp,symbol,ht,dest,notarized_hash,notarized_desttxid,notarized_height,MoM,MoMdepth); } else if ( func == 'U' ) // deprecated { @@ -208,7 +220,7 @@ int32_t memread(void *dest,int32_t size,uint8_t *filedata,long *fposp,long datal int32_t komodo_parsestatefiledata(struct komodo_state *sp,uint8_t *filedata,long *fposp,long datalen,char *symbol,char *dest) { static int32_t errs; - int32_t func= -1,ht,notarized_height,num,matched=0; uint256 notarized_hash,notarized_desttxid; uint8_t pubkeys[64][33]; long fpos = *fposp; + int32_t func= -1,ht,notarized_height,MoMdepth,num,matched=0; uint256 MoM,notarized_hash,notarized_desttxid; uint8_t pubkeys[64][33]; long fpos = *fposp; if ( fpos < datalen ) { func = filedata[fpos++]; @@ -231,7 +243,7 @@ int32_t komodo_parsestatefiledata(struct komodo_state *sp,uint8_t *filedata,long } } else printf("illegal num.%d\n",num); } - else if ( func == 'N' ) + else if ( func == 'N' || func == 'M' ) { if ( memread(¬arized_height,sizeof(notarized_height),filedata,&fpos,datalen) != sizeof(notarized_height) ) errs++; @@ -239,10 +251,21 @@ int32_t komodo_parsestatefiledata(struct komodo_state *sp,uint8_t *filedata,long errs++; if ( memread(¬arized_desttxid,sizeof(notarized_desttxid),filedata,&fpos,datalen) != sizeof(notarized_desttxid) ) errs++; - if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 && sp != 0 ) - printf("%s load[%s.%d -> %s] NOTARIZED %d %s\n",ASSETCHAINS_SYMBOL,symbol,sp->NUM_NPOINTS,dest,notarized_height,notarized_hash.ToString().c_str()); - //if ( matched != 0 ) global independent states -> inside *sp - komodo_eventadd_notarized(sp,symbol,ht,dest,notarized_hash,notarized_desttxid,notarized_height); + if ( func == 'M' ) + { + if ( memread(&MoM,sizeof(MoM),filedata,&fpos,datalen) != sizeof(MoM) ) + errs++; + if ( memread(&MoMdepth,sizeof(MoMdepth),filedata,&fpos,datalen) != sizeof(MoMdepth) ) + errs++; + if ( 1 && ASSETCHAINS_SYMBOL[0] != 0 && sp != 0 ) + printf("%s load[%s.%d -> %s] NOTARIZED %d %s MoM.%s %d\n",ASSETCHAINS_SYMBOL,symbol,sp->NUM_NPOINTS,dest,notarized_height,notarized_hash.ToString().c_str(),MoM.ToString().c_str(),MoMdepth); + } + else + { + memset(&MoM,0,sizeof(MoM)); + MoMdepth = 0; + } + komodo_eventadd_notarized(sp,symbol,ht,dest,notarized_hash,notarized_desttxid,notarized_height,MoM,MoMdepth); } else if ( func == 'U' ) // deprecated { @@ -326,7 +349,7 @@ int32_t komodo_parsestatefiledata(struct komodo_state *sp,uint8_t *filedata,long return(-1); } -void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotaries,uint8_t notaryid,uint256 txhash,uint64_t voutmask,uint8_t numvouts,uint32_t *pvals,uint8_t numpvals,int32_t KMDheight,uint32_t KMDtimestamp,uint64_t opretvalue,uint8_t *opretbuf,uint16_t opretlen,uint16_t vout) +void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotaries,uint8_t notaryid,uint256 txhash,uint64_t voutmask,uint8_t numvouts,uint32_t *pvals,uint8_t numpvals,int32_t KMDheight,uint32_t KMDtimestamp,uint64_t opretvalue,uint8_t *opretbuf,uint16_t opretlen,uint16_t vout,bits256 MoM,int32_t MoMdepth) { static FILE *fp; static int32_t errs,didinit; struct komodo_state *sp; char fname[512],symbol[KOMODO_ASSETCHAIN_MAXLEN],dest[KOMODO_ASSETCHAIN_MAXLEN]; int32_t retval,ht,func; uint8_t num,pubkeys[64][33]; @@ -457,7 +480,9 @@ void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotar //printf("ht.%d func N ht.%d errs.%d\n",height,NOTARIZED_HEIGHT,errs); if ( sp != 0 ) { - fputc('N',fp); + if ( sp->MoMdepth > 0 && bits256_nonz(sp->MoM) != 0 ) + fputc('M',fp); + else fputc('N',fp); if ( fwrite(&height,1,sizeof(height),fp) != sizeof(height) ) errs++; if ( fwrite(&sp->NOTARIZED_HEIGHT,1,sizeof(sp->NOTARIZED_HEIGHT),fp) != sizeof(sp->NOTARIZED_HEIGHT) ) @@ -466,7 +491,14 @@ void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotar errs++; if ( fwrite(&sp->NOTARIZED_DESTTXID,1,sizeof(sp->NOTARIZED_DESTTXID),fp) != sizeof(sp->NOTARIZED_DESTTXID) ) errs++; - komodo_eventadd_notarized(sp,symbol,height,dest,sp->NOTARIZED_HASH,sp->NOTARIZED_DESTTXID,sp->NOTARIZED_HEIGHT); + if ( sp->MoMdepth > 0 && bits256_nonz(sp->MoM) != 0 ) + { + if ( fwrite(&sp->MoM,1,sizeof(sp->MoM),fp) != sizeof(sp->MoM) ) + errs++; + if ( fwrite(&sp->MoMdepth,1,sizeof(sp->MoMdepth),fp) != sizeof(sp->MoMdepth) ) + errs++; + } + komodo_eventadd_notarized(sp,symbol,height,dest,sp->NOTARIZED_HASH,sp->NOTARIZED_DESTTXID,sp->NOTARIZED_HEIGHT,sp->MoM,sp->MoMdepth); } } fflush(fp); @@ -542,7 +574,21 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr sp->NOTARIZED_HEIGHT = *notarizedheightp; sp->NOTARIZED_HASH = kmdtxid; sp->NOTARIZED_DESTTXID = desttxid; - komodo_stateupdate(height,0,0,0,zero,0,0,0,0,0,0,0,0,0,0); + if ( len+36 <= opretlen ) + { + len += iguana_rwbignum(0,&scriptbuf[len],32,(uint8_t *)&sp->MoM); + len += iguana_rwnum(0,&scriptbuf[len],sizeof(*notarizedheightp),(uint8_t *)&sp->MoMdepth); + if ( bits256_nonz(sp->MoM) == 0 || sp->MoMdepth > 1440 || sp->MoMdepth < 0 ) + { + memset(sp->MoM.bytes,0,sizeof(sp->MoM)); + sp->MoMdepth = 0; + } + else + { + printf("%s MoM.%s [%d]\n",ASSETCHAINS_SYMBOL,bits256_str(str,sp->MoM),sp->MMoM,sp->MoMdepth); len += 4; if ( ASSETCHAINS_SYMBOL[0] != 0 ) printf("[%s] ht.%d NOTARIZED.%d %s.%s %sTXID.%s lens.(%d %d)\n",ASSETCHAINS_SYMBOL,height,*notarizedheightp,ASSETCHAINS_SYMBOL[0]==0?"KMD":ASSETCHAINS_SYMBOL,kmdtxid.ToString().c_str(),ASSETCHAINS_SYMBOL[0]==0?"BTC":"KMD",desttxid.ToString().c_str(),opretlen,len); @@ -567,7 +613,7 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr //for (i=0; i= KOMODO_MAINNET_START ) @@ -596,7 +642,7 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr } if ( *isratificationp == 0 && (signedmask != 0 || (scriptbuf[len] != 'X' && scriptbuf[len] != 'A')) ) // && scriptbuf[len] != 'I') - komodo_stateupdate(height,0,0,0,txhash,0,0,0,0,0,0,value,&scriptbuf[len],opretlen,j); + komodo_stateupdate(height,0,0,0,txhash,0,0,0,0,0,0,value,&scriptbuf[len],opretlen,j,zero,0); } } return(notaryid); @@ -655,7 +701,7 @@ void komodo_connectblock(CBlockIndex *pindex,CBlock& block) if ( pindex->nHeight != hwmheight ) printf("%s hwmheight.%d vs pindex->nHeight.%d t.%u reorg.%d\n",ASSETCHAINS_SYMBOL,hwmheight,pindex->nHeight,(uint32_t)pindex->nTime,hwmheight-pindex->nHeight); komodo_event_rewind(sp,symbol,pindex->nHeight); - komodo_stateupdate(pindex->nHeight,0,0,0,zero,0,0,0,0,-pindex->nHeight,pindex->nTime,0,0,0,0); + komodo_stateupdate(pindex->nHeight,0,0,0,zero,0,0,0,0,-pindex->nHeight,pindex->nTime,0,0,0,0,zero,0); } komodo_currentheight_set(chainActive.Tip()->nHeight); if ( pindex != 0 ) @@ -787,7 +833,7 @@ void komodo_connectblock(CBlockIndex *pindex,CBlock& block) if ( ((signedmask & 1) != 0 && numvalid >= KOMODO_MINRATIFY) || bitweight(signedmask) > (numnotaries/3) ) { memset(&txhash,0,sizeof(txhash)); - komodo_stateupdate(height,pubkeys,numvalid,0,txhash,0,0,0,0,0,0,0,0,0,0); + komodo_stateupdate(height,pubkeys,numvalid,0,txhash,0,0,0,0,0,0,0,0,0,0,zero,0); printf("RATIFIED! >>>>>>>>>> new notaries.%d newheight.%d from height.%d\n",numvalid,(((height+KOMODO_ELECTION_GAP/2)/KOMODO_ELECTION_GAP)+1)*KOMODO_ELECTION_GAP,height); } else printf("signedmask.%llx numvalid.%d wt.%d numnotaries.%d\n",(long long)signedmask,numvalid,bitweight(signedmask),numnotaries); } @@ -796,7 +842,7 @@ void komodo_connectblock(CBlockIndex *pindex,CBlock& block) if ( NOTARY_PUBKEY33[0] != 0 && ASSETCHAINS_SYMBOL[0] == 0 ) printf("%s ht.%d\n",ASSETCHAINS_SYMBOL[0] == 0 ? "KMD" : ASSETCHAINS_SYMBOL,height); if ( pindex->nHeight == hwmheight ) - komodo_stateupdate(height,0,0,0,zero,0,0,0,0,height,(uint32_t)pindex->nTime,0,0,0,0); + komodo_stateupdate(height,0,0,0,zero,0,0,0,0,height,(uint32_t)pindex->nTime,0,0,0,0,zero,0); } else fprintf(stderr,"komodo_connectblock: unexpected null pindex\n"); //KOMODO_INITDONE = (uint32_t)time(NULL); //fprintf(stderr,"%s end connect.%d\n",ASSETCHAINS_SYMBOL,pindex->nHeight); diff --git a/src/komodo_events.h b/src/komodo_events.h index ff054c3bb..315a78686 100644 --- a/src/komodo_events.h +++ b/src/komodo_events.h @@ -37,7 +37,7 @@ struct komodo_event *komodo_eventadd(struct komodo_state *sp,int32_t height,char return(ep); } -void komodo_eventadd_notarized(struct komodo_state *sp,char *symbol,int32_t height,char *dest,uint256 notarized_hash,uint256 notarized_desttxid,int32_t notarizedheight) +void komodo_eventadd_notarized(struct komodo_state *sp,char *symbol,int32_t height,char *dest,uint256 notarized_hash,uint256 notarized_desttxid,int32_t notarizedheight,uint256 MoM,int32_t MoMdepth) { struct komodo_event_notarized N; if ( komodo_verifynotarization(symbol,dest,height,notarizedheight,notarized_hash,notarized_desttxid) != 0 ) @@ -53,10 +53,12 @@ void komodo_eventadd_notarized(struct komodo_state *sp,char *symbol,int32_t heig N.blockhash = notarized_hash; N.desttxid = notarized_desttxid; N.notarizedheight = notarizedheight; + N.MoM = MoM; + N.MoMdepth = MoMdepth; strcpy(N.dest,dest); komodo_eventadd(sp,height,symbol,KOMODO_EVENT_NOTARIZED,(uint8_t *)&N,sizeof(N)); if ( sp != 0 ) - komodo_notarized_update(sp,height,notarizedheight,notarized_hash,notarized_desttxid); + komodo_notarized_update(sp,height,notarizedheight,notarized_hash,notarized_desttxid,MoM,MoMdepth); } } diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 438d81809..c82087549 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -357,7 +357,7 @@ int32_t komodo_chosennotary(int32_t *notaryidp,int32_t height,uint8_t *pubkey33, return(modval); } -void komodo_notarized_update(struct komodo_state *sp,int32_t nHeight,int32_t notarized_height,uint256 notarized_hash,uint256 notarized_desttxid) +void komodo_notarized_update(struct komodo_state *sp,int32_t nHeight,int32_t notarized_height,uint256 notarized_hash,uint256 notarized_desttxid,uint256 MoM,int32_t MoMdepth) { struct notarized_checkpoint *np; if ( notarized_height > nHeight ) @@ -375,6 +375,8 @@ void komodo_notarized_update(struct komodo_state *sp,int32_t nHeight,int32_t not sp->NOTARIZED_HEIGHT = np->notarized_height = notarized_height; sp->NOTARIZED_HASH = np->notarized_hash = notarized_hash; sp->NOTARIZED_DESTTXID = np->notarized_desttxid = notarized_desttxid; + sp->MoM = np->MoM = MoM; + sp->MoMdepth = np->MoMdepth = MoMdepth; portable_mutex_unlock(&komodo_mutex); } diff --git a/src/komodo_structs.h b/src/komodo_structs.h index 5c554b9a5..b424d5386 100644 --- a/src/komodo_structs.h +++ b/src/komodo_structs.h @@ -80,12 +80,16 @@ struct pax_transaction struct knotary_entry { UT_hash_handle hh; uint8_t pubkey[33],notaryid; }; struct knotaries_entry { int32_t height,numnotaries; struct knotary_entry *Notaries; }; -struct notarized_checkpoint { uint256 notarized_hash,notarized_desttxid; int32_t nHeight,notarized_height; }; +struct notarized_checkpoint +{ + uint256 notarized_hash,notarized_desttxid,MoM; + int32_t nHeight,notarized_height,MoMdepth; +}; struct komodo_state { - uint256 NOTARIZED_HASH,NOTARIZED_DESTTXID; - int32_t SAVEDHEIGHT,CURRENT_HEIGHT,NOTARIZED_HEIGHT; + uint256 NOTARIZED_HASH,NOTARIZED_DESTTXID,MoM; + int32_t SAVEDHEIGHT,CURRENT_HEIGHT,NOTARIZED_HEIGHT,MoMdepth; uint32_t SAVEDTIMESTAMP; uint64_t deposited,issued,withdrawn,approved,redeemed,shorted; struct notarized_checkpoint *NPOINTS; int32_t NUM_NPOINTS,last_NPOINTSi; diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 9dc96f10c..00def9a0b 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -2779,8 +2779,6 @@ bool CWallet::CreateTransaction(const vector& vecSend, CWalletTx& wt extern int32_t USE_EXTERNAL_PUBKEY; extern std::string NOTARY_PUBKEY; if ( USE_EXTERNAL_PUBKEY == 0 ) { - //fprintf(stderr,"use notary pubkey\n"); - //scriptPubKey = CScript() << ParseHex(NOTARY_PUBKEY) << OP_CHECKSIG; bool ret; ret = reservekey.GetReservedKey(vchPubKey); assert(ret); // should never fail, as we just unlocked @@ -2788,6 +2786,7 @@ bool CWallet::CreateTransaction(const vector& vecSend, CWalletTx& wt } else { + //fprintf(stderr,"use notary pubkey\n"); scriptChange = CScript() << ParseHex(NOTARY_PUBKEY) << OP_CHECKSIG; } } From 582c741ff3ef5b362e90674ff1a2cb9c444aad7a Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Mar 2018 14:43:49 +0200 Subject: [PATCH 0622/1062] Test --- src/komodo.h | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/komodo.h b/src/komodo.h index b655ab8dc..92adc8b9a 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -571,13 +571,15 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr len += iguana_rwbignum(0,&scriptbuf[len],32,(uint8_t *)&desttxid); if ( notarized != 0 && *notarizedheightp > sp->NOTARIZED_HEIGHT && *notarizedheightp < height && (height < sp->CURRENT_HEIGHT-1000 || komodo_verifynotarization(ASSETCHAINS_SYMBOL[0]==0?(char *)"KMD":ASSETCHAINS_SYMBOL,(char *)(ASSETCHAINS_SYMBOL[0] == 0 ? "BTC" : "KMD"),height,*notarizedheightp,kmdtxid,desttxid) == 0) ) { + int32_t nameoffset = (int32_t)strlen(ASSETCHAINS_SYMBOL) + 1; sp->NOTARIZED_HEIGHT = *notarizedheightp; sp->NOTARIZED_HASH = kmdtxid; sp->NOTARIZED_DESTTXID = desttxid; if ( len+36 <= opretlen ) { - len += iguana_rwbignum(0,&scriptbuf[len],32,(uint8_t *)&sp->MoM); - len += iguana_rwnum(0,&scriptbuf[len],sizeof(*notarizedheightp),(uint8_t *)&sp->MoMdepth); + len += iguana_rwbignum(0,&scriptbuf[len+nameoffset],32,(uint8_t *)&sp->MoM); + len += iguana_rwnum(0,&scriptbuf[len+nameoffset],sizeof(*notarizedheightp),(uint8_t *)&sp->MoMdepth); + printf("%s MoM.%s [%d]\n",ASSETCHAINS_SYMBOL,bits256_str(str,sp->MoM),sp->MMoM) == 0 || sp->MoMdepth > 1440 || sp->MoMdepth < 0 ) { memset(sp->MoM.bytes,0,sizeof(sp->MoM)); @@ -585,11 +587,11 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr } else { - printf("%s MoM.%s [%d]\n",ASSETCHAINS_SYMBOL,bits256_str(str,sp->MoM),sp->MMoM),sp->MMoM,sp->MoMdepth); - len += 4; + len += nameoffset; if ( ASSETCHAINS_SYMBOL[0] != 0 ) printf("[%s] ht.%d NOTARIZED.%d %s.%s %sTXID.%s lens.(%d %d)\n",ASSETCHAINS_SYMBOL,height,*notarizedheightp,ASSETCHAINS_SYMBOL[0]==0?"KMD":ASSETCHAINS_SYMBOL,kmdtxid.ToString().c_str(),ASSETCHAINS_SYMBOL[0]==0?"BTC":"KMD",desttxid.ToString().c_str(),opretlen,len); if ( ASSETCHAINS_SYMBOL[0] == 0 ) From 3f41df7562ccac0b550a98fb0bea49f6629610a8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Mar 2018 14:53:30 +0200 Subject: [PATCH 0623/1062] Test --- src/komodo.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo.h b/src/komodo.h index 92adc8b9a..bf36b46fb 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -618,8 +618,8 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr komodo_stateupdate(height,0,0,0,txhash,0,0,0,0,0,0,value,&scriptbuf[len],opretlen-len+4+3+(scriptbuf[1] == 0x4d),j,zero,0); } } - } else if ( height >= KOMODO_MAINNET_START ) - printf("notarized.%d %llx reject ht.%d NOTARIZED.%d prev.%d %s.%s DESTTXID.%s (%s)\n",notarized,(long long)signedmask,height,*notarizedheightp,sp->NOTARIZED_HEIGHT,ASSETCHAINS_SYMBOL[0]==0?"KMD":ASSETCHAINS_SYMBOL,kmdtxid.ToString().c_str(),desttxid.ToString().c_str(),(char *)&scriptbuf[len]); + } //else if ( height >= KOMODO_MAINNET_START ) + printf("notarized.%d %llx reject ht.%d NOTARIZED.%d prev.%d %s.%s DESTTXID.%s (%s) len.%d opretlen.%d\n",notarized,(long long)signedmask,height,*notarizedheightp,sp->NOTARIZED_HEIGHT,ASSETCHAINS_SYMBOL[0]==0?"KMD":ASSETCHAINS_SYMBOL,kmdtxid.ToString().c_str(),desttxid.ToString().c_str(),(char *)&scriptbuf[len],len,opretlen); } else if ( i == 0 && j == 1 && opretlen == 149 ) { From ed7bd562529d35568893aa31bc20ae6708b0ca76 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Mar 2018 14:57:50 +0200 Subject: [PATCH 0624/1062] Test --- src/komodo.h | 6 +++--- src/komodo_structs.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/komodo.h b/src/komodo.h index bf36b46fb..5b5e94eaf 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -480,7 +480,7 @@ void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotar //printf("ht.%d func N ht.%d errs.%d\n",height,NOTARIZED_HEIGHT,errs); if ( sp != 0 ) { - if ( sp->MoMdepth > 0 && bits256_nonz(sp->MoM) != 0 ) + if ( sp->MoMdepth > 0 && sp->MoM != zero ) fputc('M',fp); else fputc('N',fp); if ( fwrite(&height,1,sizeof(height),fp) != sizeof(height) ) @@ -491,7 +491,7 @@ void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotar errs++; if ( fwrite(&sp->NOTARIZED_DESTTXID,1,sizeof(sp->NOTARIZED_DESTTXID),fp) != sizeof(sp->NOTARIZED_DESTTXID) ) errs++; - if ( sp->MoMdepth > 0 && bits256_nonz(sp->MoM) != 0 ) + if ( sp->MoMdepth > 0 && sp->MoM != zero ) { if ( fwrite(&sp->MoM,1,sizeof(sp->MoM),fp) != sizeof(sp->MoM) ) errs++; @@ -580,7 +580,7 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr len += iguana_rwbignum(0,&scriptbuf[len+nameoffset],32,(uint8_t *)&sp->MoM); len += iguana_rwnum(0,&scriptbuf[len+nameoffset],sizeof(*notarizedheightp),(uint8_t *)&sp->MoMdepth); printf("%s MoM.%s [%d]\n",ASSETCHAINS_SYMBOL,bits256_str(str,sp->MoM),sp->MMoM) == 0 || sp->MoMdepth > 1440 || sp->MoMdepth < 0 ) + if ( sp->MoM == zero || sp->MoMdepth > 1440 || sp->MoMdepth < 0 ) { memset(sp->MoM.bytes,0,sizeof(sp->MoM)); sp->MoMdepth = 0; diff --git a/src/komodo_structs.h b/src/komodo_structs.h index b424d5386..e5ec737ee 100644 --- a/src/komodo_structs.h +++ b/src/komodo_structs.h @@ -53,7 +53,7 @@ typedef union _bits320 bits320; struct komodo_kv { UT_hash_handle hh; bits256 pubkey; uint8_t *key,*value; int32_t height; uint32_t flags; uint16_t keylen,valuesize; }; -struct komodo_event_notarized { uint256 blockhash,desttxid; int32_t notarizedheight; char dest[16]; }; +struct komodo_event_notarized { uint256 blockhash,desttxid,MoM; int32_t notarizedheight,MoMdepth; char dest[16]; }; struct komodo_event_pubkeys { uint8_t num; uint8_t pubkeys[64][33]; }; struct komodo_event_opreturn { uint256 txid; uint64_t value; uint16_t vout,oplen; uint8_t opret[]; }; struct komodo_event_pricefeed { uint8_t num; uint32_t prices[35]; }; From c88fa588dec5cc57f1d998d6daf1708b26842cf8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Mar 2018 15:13:15 +0200 Subject: [PATCH 0625/1062] Test --- src/bitcoin-cli.cpp | 2 +- src/komodo.h | 8 ++++---- src/komodo_globals.h | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/bitcoin-cli.cpp b/src/bitcoin-cli.cpp index 253c49366..87c5e6f76 100644 --- a/src/bitcoin-cli.cpp +++ b/src/bitcoin-cli.cpp @@ -76,7 +76,7 @@ public: #include "komodo_cJSON.c" #include "komodo_notary.h" -void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotaries,uint8_t notaryid,uint256 txhash,uint64_t voutmask,uint8_t numvouts,uint32_t *pvals,uint8_t numpvals,int32_t KMDheight,uint32_t KMDtimestamp,uint64_t opretvalue,uint8_t *opretbuf,uint16_t opretlen,uint16_t vout) +void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotaries,uint8_t notaryid,uint256 txhash,uint64_t voutmask,uint8_t numvouts,uint32_t *pvals,uint8_t numpvals,int32_t KMDheight,uint32_t KMDtimestamp,uint64_t opretvalue,uint8_t *opretbuf,uint16_t opretlen,uint16_t vout,uint256 MoM,int32_t MoMdepth) { } diff --git a/src/komodo.h b/src/komodo.h index 5b5e94eaf..9bc8647c6 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -351,7 +351,7 @@ int32_t komodo_parsestatefiledata(struct komodo_state *sp,uint8_t *filedata,long void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotaries,uint8_t notaryid,uint256 txhash,uint64_t voutmask,uint8_t numvouts,uint32_t *pvals,uint8_t numpvals,int32_t KMDheight,uint32_t KMDtimestamp,uint64_t opretvalue,uint8_t *opretbuf,uint16_t opretlen,uint16_t vout,bits256 MoM,int32_t MoMdepth) { - static FILE *fp; static int32_t errs,didinit; + static FILE *fp; static int32_t errs,didinit; static uint256 zero; struct komodo_state *sp; char fname[512],symbol[KOMODO_ASSETCHAIN_MAXLEN],dest[KOMODO_ASSETCHAIN_MAXLEN]; int32_t retval,ht,func; uint8_t num,pubkeys[64][33]; if ( didinit == 0 ) { @@ -579,15 +579,15 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr { len += iguana_rwbignum(0,&scriptbuf[len+nameoffset],32,(uint8_t *)&sp->MoM); len += iguana_rwnum(0,&scriptbuf[len+nameoffset],sizeof(*notarizedheightp),(uint8_t *)&sp->MoMdepth); - printf("%s MoM.%s [%d]\n",ASSETCHAINS_SYMBOL,bits256_str(str,sp->MoM),sp->MMoM.ToString().c_str(),sp->MMoM == zero || sp->MoMdepth > 1440 || sp->MoMdepth < 0 ) { - memset(sp->MoM.bytes,0,sizeof(sp->MoM)); + memset(&sp->MoM,0,sizeof(sp->MoM)); sp->MoMdepth = 0; } else { - printf("VALID %s MoM.%s [%d]\n",ASSETCHAINS_SYMBOL,bits256_str(str,sp->MoM),sp->MMoM.ToString().c_str(),sp->MMoM,sp->MoMdepth); diff --git a/src/komodo_globals.h b/src/komodo_globals.h index 6c2e56f5b..beeb252b0 100644 --- a/src/komodo_globals.h +++ b/src/komodo_globals.h @@ -15,7 +15,7 @@ #include "komodo_defs.h" -void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotaries,uint8_t notaryid,uint256 txhash,uint64_t voutmask,uint8_t numvouts,uint32_t *pvals,uint8_t numpvals,int32_t kheight,uint32_t ktime,uint64_t opretvalue,uint8_t *opretbuf,uint16_t opretlen,uint16_t vout); +void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotaries,uint8_t notaryid,uint256 txhash,uint64_t voutmask,uint8_t numvouts,uint32_t *pvals,uint8_t numpvals,int32_t kheight,uint32_t ktime,uint64_t opretvalue,uint8_t *opretbuf,uint16_t opretlen,uint16_t vout,uint256 MoM,int32_t MoMdepth); void komodo_init(int32_t height); int32_t komodo_notarizeddata(int32_t nHeight,uint256 *notarized_hashp,uint256 *notarized_desttxidp); char *komodo_issuemethod(char *userpass,char *method,char *params,uint16_t port); From 2ff8e0e5d9df48c2dcf442a10f17b645396805ed Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Mar 2018 15:18:58 +0200 Subject: [PATCH 0626/1062] Test --- src/komodo.h | 4 ++-- src/komodo_notary.h | 4 ++-- src/komodo_pax.h | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/komodo.h b/src/komodo.h index 9bc8647c6..d5de6c013 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -579,7 +579,7 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr { len += iguana_rwbignum(0,&scriptbuf[len+nameoffset],32,(uint8_t *)&sp->MoM); len += iguana_rwnum(0,&scriptbuf[len+nameoffset],sizeof(*notarizedheightp),(uint8_t *)&sp->MoMdepth); - printf("%s MoM.%s [%d]\n",ASSETCHAINS_SYMBOL,sp->MoM.ToString().c_str(),sp->MMoM.ToString().c_str(),sp->MoMdepth); if ( sp->MoM == zero || sp->MoMdepth > 1440 || sp->MoMdepth < 0 ) { memset(&sp->MoM,0,sizeof(sp->MoM)); @@ -587,7 +587,7 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr } else { - printf("VALID %s MoM.%s [%d]\n",ASSETCHAINS_SYMBOL,sp->MoM.ToString().c_str(),sp->MMoM.ToString().c_str(),sp->MoMdepth); } } komodo_stateupdate(height,0,0,0,zero,0,0,0,0,0,0,0,0,0,0,sp->MoM,sp->MoMdepth); diff --git a/src/komodo_notary.h b/src/komodo_notary.h index c82087549..f30f388e7 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -459,6 +459,7 @@ void komodo_init(int32_t height) static int didinit; uint256 zero; int32_t k,n; uint8_t pubkeys[64][33]; if ( 0 && height != 0 ) printf("komodo_init ht.%d didinit.%d\n",height,didinit); + memset(&zero,0,sizeof(zero)); if ( didinit == 0 ) { pthread_mutex_init(&komodo_mutex,NULL); @@ -474,7 +475,6 @@ void komodo_init(int32_t height) } komodo_notarysinit(0,pubkeys,k); } - memset(&zero,0,sizeof(zero)); //for (i=0; i Date: Thu, 22 Mar 2018 15:27:45 +0200 Subject: [PATCH 0627/1062] test --- src/komodo.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo.h b/src/komodo.h index d5de6c013..e91cb4753 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -349,7 +349,7 @@ int32_t komodo_parsestatefiledata(struct komodo_state *sp,uint8_t *filedata,long return(-1); } -void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotaries,uint8_t notaryid,uint256 txhash,uint64_t voutmask,uint8_t numvouts,uint32_t *pvals,uint8_t numpvals,int32_t KMDheight,uint32_t KMDtimestamp,uint64_t opretvalue,uint8_t *opretbuf,uint16_t opretlen,uint16_t vout,bits256 MoM,int32_t MoMdepth) +void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotaries,uint8_t notaryid,uint256 txhash,uint64_t voutmask,uint8_t numvouts,uint32_t *pvals,uint8_t numpvals,int32_t KMDheight,uint32_t KMDtimestamp,uint64_t opretvalue,uint8_t *opretbuf,uint16_t opretlen,uint16_t vout,bits256 MoM,int32_t MoMdepth) { static FILE *fp; static int32_t errs,didinit; static uint256 zero; struct komodo_state *sp; char fname[512],symbol[KOMODO_ASSETCHAIN_MAXLEN],dest[KOMODO_ASSETCHAIN_MAXLEN]; int32_t retval,ht,func; uint8_t num,pubkeys[64][33]; From 25bf4d686ed4a1c9499834debf3181fc6ac00a7a Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Mar 2018 15:43:59 +0200 Subject: [PATCH 0628/1062] Test --- src/komodo.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/komodo.h b/src/komodo.h index e91cb4753..aa69646ab 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -349,7 +349,8 @@ int32_t komodo_parsestatefiledata(struct komodo_state *sp,uint8_t *filedata,long return(-1); } -void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotaries,uint8_t notaryid,uint256 txhash,uint64_t voutmask,uint8_t numvouts,uint32_t *pvals,uint8_t numpvals,int32_t KMDheight,uint32_t KMDtimestamp,uint64_t opretvalue,uint8_t *opretbuf,uint16_t opretlen,uint16_t vout,bits256 MoM,int32_t MoMdepth) +//void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotaries,uint8_t notaryid,uint256 txhash,uint64_t voutmask,uint8_t numvouts,uint32_t *pvals,uint8_t numpvals,int32_t KMDheight,uint32_t KMDtimestamp,uint64_t opretvalue,uint8_t *opretbuf,uint16_t opretlen,uint16_t vout,bits256 MoM,int32_t MoMdepth) +void komodo_stateupdate(int, unsigned char (*) [33], unsigned char, unsigned char, uint256, unsigned long, unsigned char, unsigned int*, unsigned char, int, unsigned int, unsigned long, unsigned char*, unsigned short, unsigned short, uint256, int) { static FILE *fp; static int32_t errs,didinit; static uint256 zero; struct komodo_state *sp; char fname[512],symbol[KOMODO_ASSETCHAIN_MAXLEN],dest[KOMODO_ASSETCHAIN_MAXLEN]; int32_t retval,ht,func; uint8_t num,pubkeys[64][33]; From c130fb54bb31036de664d86b4f61ad93e08e2975 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Mar 2018 15:55:15 +0200 Subject: [PATCH 0629/1062] Test --- src/komodo.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/komodo.h b/src/komodo.h index aa69646ab..a933a9eb4 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -349,8 +349,7 @@ int32_t komodo_parsestatefiledata(struct komodo_state *sp,uint8_t *filedata,long return(-1); } -//void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotaries,uint8_t notaryid,uint256 txhash,uint64_t voutmask,uint8_t numvouts,uint32_t *pvals,uint8_t numpvals,int32_t KMDheight,uint32_t KMDtimestamp,uint64_t opretvalue,uint8_t *opretbuf,uint16_t opretlen,uint16_t vout,bits256 MoM,int32_t MoMdepth) -void komodo_stateupdate(int, unsigned char (*) [33], unsigned char, unsigned char, uint256, unsigned long, unsigned char, unsigned int*, unsigned char, int, unsigned int, unsigned long, unsigned char*, unsigned short, unsigned short, uint256, int) +void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotaries,uint8_t notaryid,uint256 txhash,uint64_t voutmask,uint8_t numvouts,uint32_t *pvals,uint8_t numpvals,int32_t KMDheight,uint32_t KMDtimestamp,uint64_t opretvalue,uint8_t *opretbuf,uint16_t opretlen,uint16_t vout,uint256 MoM,int32_t MoMdepth) { static FILE *fp; static int32_t errs,didinit; static uint256 zero; struct komodo_state *sp; char fname[512],symbol[KOMODO_ASSETCHAIN_MAXLEN],dest[KOMODO_ASSETCHAIN_MAXLEN]; int32_t retval,ht,func; uint8_t num,pubkeys[64][33]; @@ -579,7 +578,7 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr if ( len+36 <= opretlen ) { len += iguana_rwbignum(0,&scriptbuf[len+nameoffset],32,(uint8_t *)&sp->MoM); - len += iguana_rwnum(0,&scriptbuf[len+nameoffset],sizeof(*notarizedheightp),(uint8_t *)&sp->MoMdepth); + len += iguana_rwnum(0,&scriptbuf[len+nameoffset],sizeof(sp->MoMdepth),(uint8_t *)&sp->MoMdepth); printf("%s MoM.%s [%d]\n",ASSETCHAINS_SYMBOL,sp->MoM.ToString().c_str(),sp->MoMdepth); if ( sp->MoM == zero || sp->MoMdepth > 1440 || sp->MoMdepth < 0 ) { From e8f0f0d67a4f0982923382583595b9dbeba0dd4b Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Mar 2018 16:13:10 +0200 Subject: [PATCH 0630/1062] Test --- src/komodo_bitcoind.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 76f6765ad..e9f8c3818 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -471,7 +471,7 @@ int32_t komodo_verifynotarization(char *symbol,char *dest,int32_t height,int32_t { if ( (hexstr= jstr(skey,(char *)"hex")) != 0 ) { - //printf("HEX.(%s)\n",hexstr); + printf("HEX.(%s) vs hash.%s\n",hexstr,NOTARIZED_HASH.ToString().c_str()); len = strlen(hexstr) >> 1; decode_hex(script,len,hexstr); retval = komodo_verifynotarizedscript(height,script,len,NOTARIZED_HASH); From 98b7faf6e284bef184183c115087edabfe246e49 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Mar 2018 16:18:04 +0200 Subject: [PATCH 0631/1062] Test --- src/komodo.h | 2 ++ src/komodo_bitcoind.h | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/komodo.h b/src/komodo.h index a933a9eb4..91ab3e815 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -569,6 +569,8 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr len += iguana_rwbignum(0,&scriptbuf[len],32,(uint8_t *)&kmdtxid); len += iguana_rwnum(0,&scriptbuf[len],sizeof(*notarizedheightp),(uint8_t *)notarizedheightp); len += iguana_rwbignum(0,&scriptbuf[len],32,(uint8_t *)&desttxid); + if ( strcmp("PIZZA",ASSETCHAINS_SYMBOL) == 0 && opretlen >= 110 ) + notarized = 1; if ( notarized != 0 && *notarizedheightp > sp->NOTARIZED_HEIGHT && *notarizedheightp < height && (height < sp->CURRENT_HEIGHT-1000 || komodo_verifynotarization(ASSETCHAINS_SYMBOL[0]==0?(char *)"KMD":ASSETCHAINS_SYMBOL,(char *)(ASSETCHAINS_SYMBOL[0] == 0 ? "BTC" : "KMD"),height,*notarizedheightp,kmdtxid,desttxid) == 0) ) { int32_t nameoffset = (int32_t)strlen(ASSETCHAINS_SYMBOL) + 1; diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index e9f8c3818..9f23727a7 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -471,7 +471,7 @@ int32_t komodo_verifynotarization(char *symbol,char *dest,int32_t height,int32_t { if ( (hexstr= jstr(skey,(char *)"hex")) != 0 ) { - printf("HEX.(%s) vs hash.%s\n",hexstr,NOTARIZED_HASH.ToString().c_str()); + //printf("HEX.(%s) vs hash.%s\n",hexstr,NOTARIZED_HASH.ToString().c_str()); len = strlen(hexstr) >> 1; decode_hex(script,len,hexstr); retval = komodo_verifynotarizedscript(height,script,len,NOTARIZED_HASH); From e35bc6fea31bd9834d8430eff72e5d9374a62ceb Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Mar 2018 16:23:32 +0200 Subject: [PATCH 0632/1062] Test --- src/komodo.h | 3 +++ src/komodo_bitcoind.h | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/komodo.h b/src/komodo.h index 91ab3e815..cd2e43cb5 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -570,7 +570,10 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr len += iguana_rwnum(0,&scriptbuf[len],sizeof(*notarizedheightp),(uint8_t *)notarizedheightp); len += iguana_rwbignum(0,&scriptbuf[len],32,(uint8_t *)&desttxid); if ( strcmp("PIZZA",ASSETCHAINS_SYMBOL) == 0 && opretlen >= 110 ) + { notarized = 1; + printf("notht.%d sp.%d ht.%d current.%d\n",*notarizedheightp,sp->NOTARIZED_HEIGHT,height,sp->CURRENT_HEIGHT); + } if ( notarized != 0 && *notarizedheightp > sp->NOTARIZED_HEIGHT && *notarizedheightp < height && (height < sp->CURRENT_HEIGHT-1000 || komodo_verifynotarization(ASSETCHAINS_SYMBOL[0]==0?(char *)"KMD":ASSETCHAINS_SYMBOL,(char *)(ASSETCHAINS_SYMBOL[0] == 0 ? "BTC" : "KMD"),height,*notarizedheightp,kmdtxid,desttxid) == 0) ) { int32_t nameoffset = (int32_t)strlen(ASSETCHAINS_SYMBOL) + 1; diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 9f23727a7..e9f8c3818 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -471,7 +471,7 @@ int32_t komodo_verifynotarization(char *symbol,char *dest,int32_t height,int32_t { if ( (hexstr= jstr(skey,(char *)"hex")) != 0 ) { - //printf("HEX.(%s) vs hash.%s\n",hexstr,NOTARIZED_HASH.ToString().c_str()); + printf("HEX.(%s) vs hash.%s\n",hexstr,NOTARIZED_HASH.ToString().c_str()); len = strlen(hexstr) >> 1; decode_hex(script,len,hexstr); retval = komodo_verifynotarizedscript(height,script,len,NOTARIZED_HASH); From 279fac9187e31b85b66abb5a5ed1ec9900218745 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Mar 2018 16:56:41 +0200 Subject: [PATCH 0633/1062] Test --- src/komodo_bitcoind.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index e9f8c3818..5960862a7 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -474,6 +474,16 @@ int32_t komodo_verifynotarization(char *symbol,char *dest,int32_t height,int32_t printf("HEX.(%s) vs hash.%s\n",hexstr,NOTARIZED_HASH.ToString().c_str()); len = strlen(hexstr) >> 1; decode_hex(script,len,hexstr); + if ( script[1] == 0x4c ) + { + script++; + len--; + } + else if ( script[1] == 0x4d ) + { + script += 2; + len -= 2; + } retval = komodo_verifynotarizedscript(height,script,len,NOTARIZED_HASH); } } From 3da303b505b24f579d271be1108a58e54cb0dbd7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Mar 2018 16:58:48 +0200 Subject: [PATCH 0634/1062] Test --- src/komodo_bitcoind.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 5960862a7..dd0b973c9 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -420,7 +420,8 @@ int32_t komodo_verifynotarizedscript(int32_t height,uint8_t *script,int32_t len, int32_t komodo_verifynotarization(char *symbol,char *dest,int32_t height,int32_t NOTARIZED_HEIGHT,uint256 NOTARIZED_HASH,uint256 NOTARIZED_DESTTXID) { - char params[256],*jsonstr,*hexstr; uint8_t script[8192]; int32_t n,len,retval = -1; cJSON *json,*txjson,*vouts,*vout,*skey; + char params[256],*jsonstr,*hexstr; uint8_t *script,_script[8192]; int32_t n,len,retval = -1; cJSON *json,*txjson,*vouts,*vout,*skey; + script = _script; /*params[0] = '['; params[1] = '"'; for (i=0; i<32; i++) From 895977bf2ec21d32eedc66edc5ccfec5556a66c5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Mar 2018 17:07:27 +0200 Subject: [PATCH 0635/1062] Test --- src/komodo.h | 7 +++---- src/komodo_bitcoind.h | 4 ++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/komodo.h b/src/komodo.h index cd2e43cb5..e1a3da8a9 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -580,11 +580,10 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr sp->NOTARIZED_HEIGHT = *notarizedheightp; sp->NOTARIZED_HASH = kmdtxid; sp->NOTARIZED_DESTTXID = desttxid; - if ( len+36 <= opretlen ) + if ( len+36+nameoffset <= opretlen ) { len += iguana_rwbignum(0,&scriptbuf[len+nameoffset],32,(uint8_t *)&sp->MoM); len += iguana_rwnum(0,&scriptbuf[len+nameoffset],sizeof(sp->MoMdepth),(uint8_t *)&sp->MoMdepth); - printf("%s MoM.%s [%d]\n",ASSETCHAINS_SYMBOL,sp->MoM.ToString().c_str(),sp->MoMdepth); if ( sp->MoM == zero || sp->MoMdepth > 1440 || sp->MoMdepth < 0 ) { memset(&sp->MoM,0,sizeof(sp->MoM)); @@ -598,7 +597,7 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr komodo_stateupdate(height,0,0,0,zero,0,0,0,0,0,0,0,0,0,0,sp->MoM,sp->MoMdepth); len += nameoffset; if ( ASSETCHAINS_SYMBOL[0] != 0 ) - printf("[%s] ht.%d NOTARIZED.%d %s.%s %sTXID.%s lens.(%d %d)\n",ASSETCHAINS_SYMBOL,height,*notarizedheightp,ASSETCHAINS_SYMBOL[0]==0?"KMD":ASSETCHAINS_SYMBOL,kmdtxid.ToString().c_str(),ASSETCHAINS_SYMBOL[0]==0?"BTC":"KMD",desttxid.ToString().c_str(),opretlen,len); + printf("[%s] %s ht.%d NOTARIZED.%d %s.%s %sTXID.%s lens.(%d %d)\n",ASSETCHAINS_SYMBOL,(char *)&scriptbuf[68],height,*notarizedheightp,ASSETCHAINS_SYMBOL[0]==0?"KMD":ASSETCHAINS_SYMBOL,kmdtxid.ToString().c_str(),ASSETCHAINS_SYMBOL[0]==0?"BTC":"KMD",desttxid.ToString().c_str(),opretlen,len); if ( ASSETCHAINS_SYMBOL[0] == 0 ) { if ( signedfp == 0 ) @@ -623,7 +622,7 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr komodo_stateupdate(height,0,0,0,txhash,0,0,0,0,0,0,value,&scriptbuf[len],opretlen-len+4+3+(scriptbuf[1] == 0x4d),j,zero,0); } } - } //else if ( height >= KOMODO_MAINNET_START ) + } else if ( height >= KOMODO_MAINNET_START ) printf("notarized.%d %llx reject ht.%d NOTARIZED.%d prev.%d %s.%s DESTTXID.%s (%s) len.%d opretlen.%d\n",notarized,(long long)signedmask,height,*notarizedheightp,sp->NOTARIZED_HEIGHT,ASSETCHAINS_SYMBOL[0]==0?"KMD":ASSETCHAINS_SYMBOL,kmdtxid.ToString().c_str(),desttxid.ToString().c_str(),(char *)&scriptbuf[len],len,opretlen); } else if ( i == 0 && j == 1 && opretlen == 149 ) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index dd0b973c9..bc5fb1057 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -414,7 +414,7 @@ int32_t komodo_verifynotarizedscript(int32_t height,uint8_t *script,int32_t len, printf(" notarized, "); for (i=0; i<32; i++) printf("%02x",((uint8_t *)&hash)[i]); - printf(" opreturn from [%s] ht.%d\n",ASSETCHAINS_SYMBOL,height); + printf(" opreturn from [%s] ht.%d MISMATCHED\n",ASSETCHAINS_SYMBOL,height); return(-1); } @@ -472,7 +472,7 @@ int32_t komodo_verifynotarization(char *symbol,char *dest,int32_t height,int32_t { if ( (hexstr= jstr(skey,(char *)"hex")) != 0 ) { - printf("HEX.(%s) vs hash.%s\n",hexstr,NOTARIZED_HASH.ToString().c_str()); + //printf("HEX.(%s) vs hash.%s\n",hexstr,NOTARIZED_HASH.ToString().c_str()); len = strlen(hexstr) >> 1; decode_hex(script,len,hexstr); if ( script[1] == 0x4c ) From f1a96e3bbd12723dc401092d41d5e4423f23e193 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Mar 2018 17:11:31 +0200 Subject: [PATCH 0636/1062] Test --- src/komodo.h | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/komodo.h b/src/komodo.h index e1a3da8a9..5d697b28a 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -569,10 +569,9 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr len += iguana_rwbignum(0,&scriptbuf[len],32,(uint8_t *)&kmdtxid); len += iguana_rwnum(0,&scriptbuf[len],sizeof(*notarizedheightp),(uint8_t *)notarizedheightp); len += iguana_rwbignum(0,&scriptbuf[len],32,(uint8_t *)&desttxid); - if ( strcmp("PIZZA",ASSETCHAINS_SYMBOL) == 0 && opretlen >= 110 ) + if ( strcmp("PIZZA",ASSETCHAINS_SYMBOL) == 0 && opretlen == 110 ) { notarized = 1; - printf("notht.%d sp.%d ht.%d current.%d\n",*notarizedheightp,sp->NOTARIZED_HEIGHT,height,sp->CURRENT_HEIGHT); } if ( notarized != 0 && *notarizedheightp > sp->NOTARIZED_HEIGHT && *notarizedheightp < height && (height < sp->CURRENT_HEIGHT-1000 || komodo_verifynotarization(ASSETCHAINS_SYMBOL[0]==0?(char *)"KMD":ASSETCHAINS_SYMBOL,(char *)(ASSETCHAINS_SYMBOL[0] == 0 ? "BTC" : "KMD"),height,*notarizedheightp,kmdtxid,desttxid) == 0) ) { @@ -591,13 +590,13 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr } else { - printf("VALID %s MoM.%s [%d]\n",ASSETCHAINS_SYMBOL,sp->MoM.ToString().c_str(),sp->MoMdepth); + //printf("VALID %s MoM.%s [%d]\n",ASSETCHAINS_SYMBOL,sp->MoM.ToString().c_str(),sp->MoMdepth); } } komodo_stateupdate(height,0,0,0,zero,0,0,0,0,0,0,0,0,0,0,sp->MoM,sp->MoMdepth); len += nameoffset; if ( ASSETCHAINS_SYMBOL[0] != 0 ) - printf("[%s] %s ht.%d NOTARIZED.%d %s.%s %sTXID.%s lens.(%d %d)\n",ASSETCHAINS_SYMBOL,(char *)&scriptbuf[68],height,*notarizedheightp,ASSETCHAINS_SYMBOL[0]==0?"KMD":ASSETCHAINS_SYMBOL,kmdtxid.ToString().c_str(),ASSETCHAINS_SYMBOL[0]==0?"BTC":"KMD",desttxid.ToString().c_str(),opretlen,len); + printf("[%s] ht.%d NOTARIZED.%d %s.%s %sTXID.%s lens.(%d %d) MoM.%s %d\n",ASSETCHAINS_SYMBOL,height,*notarizedheightp,ASSETCHAINS_SYMBOL[0]==0?"KMD":ASSETCHAINS_SYMBOL,kmdtxid.ToString().c_str(),ASSETCHAINS_SYMBOL[0]==0?"BTC":"KMD",desttxid.ToString().c_str(),opretlen,len,sp->MoM.ToString().c_str(),sp->MoMdepth); if ( ASSETCHAINS_SYMBOL[0] == 0 ) { if ( signedfp == 0 ) From 0ab5b335943c2763d021641cf411655267d4e159 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Mar 2018 18:09:08 +0200 Subject: [PATCH 0637/1062] Test --- src/komodo_bitcoind.h | 16 +++++++++++++++- src/komodo_notary.h | 20 ++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index bc5fb1057..0306b434e 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -811,9 +811,23 @@ int32_t komodo_is_special(int32_t height,uint8_t pubkey33[33],uint32_t timestamp return(0); } +int32_t komodo_MoM(int32_t *notarized_heightp,uint256 *MoMp,int32_t nHeight) +{ + int32_t depth,notarized_ht; uint256 MoM; + depth = komodo_MoMdata(¬arized_ht,&MoM,nHeight); + memset(MoMp,0,sizeof(*MoMp)); + *notarized_heightp = 0; + if ( depth > 0 && notarized_ht > 0 && nHeight > notarized_ht-depth && nHeight < notarized_ht ) + { + *MoMp = MoM; + *notarized_heightp = notarized_ht; + } + return(depth); +} + int32_t komodo_checkpoint(int32_t *notarized_heightp,int32_t nHeight,uint256 hash) { - int32_t notarized_height; uint256 notarized_hash,notarized_desttxid; CBlockIndex *notary; CBlockIndex *pindex; + int32_t notarized_height,MoMdepth; uint256 MoM,notarized_hash,notarized_desttxid; CBlockIndex *notary; CBlockIndex *pindex; if ( (pindex= chainActive.Tip()) == 0 ) return(-1); notarized_height = komodo_notarizeddata(pindex->nHeight,¬arized_hash,¬arized_desttxid); diff --git a/src/komodo_notary.h b/src/komodo_notary.h index f30f388e7..1f2f21005 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -398,6 +398,26 @@ int32_t komodo_notarized_height(uint256 *hashp,uint256 *txidp) } } +int32_t komodo_MoMdata(int32_t *notarized_htp,uint256 *MoMp,int32_t nHeight) +{ + struct komodo_state *sp; struct notarized_checkpoint *np = 0; + np = 0; + for (i=sp->NUM_NPOINTS-1; i>=0; i--) + { + np = &sp->NPOINTS[i]; + if ( np->MoMdepth > 0 && nHeight > np->nHeight-np->MoMdepth && nHeight <= np->nHeight ) + { + printf("komodo_MoMdata %d i.%d np->ht %d MoMdepth.%d\n",nHeight,i,np->nHeight,np->MoMdepth); + *notarized_htp = np->nHeight; + *MoMp = np->MoM; + return(np->MoMdepth); + } + } + *notarized_htp = 0; + memset(MoMp,0,sizeof(*MoMp)); + return(0); +} + int32_t komodo_notarizeddata(int32_t nHeight,uint256 *notarized_hashp,uint256 *notarized_desttxidp) { struct notarized_checkpoint *np = 0; int32_t i=0,flag = 0; char symbol[KOMODO_ASSETCHAIN_MAXLEN],dest[KOMODO_ASSETCHAIN_MAXLEN]; struct komodo_state *sp; From c26fb215f4f651085e460f6fc97e8a57b67e4351 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Mar 2018 18:10:32 +0200 Subject: [PATCH 0638/1062] Test --- src/komodo_globals.h | 1 + src/komodo_notary.h | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/komodo_globals.h b/src/komodo_globals.h index beeb252b0..b35a2a8da 100644 --- a/src/komodo_globals.h +++ b/src/komodo_globals.h @@ -17,6 +17,7 @@ void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotaries,uint8_t notaryid,uint256 txhash,uint64_t voutmask,uint8_t numvouts,uint32_t *pvals,uint8_t numpvals,int32_t kheight,uint32_t ktime,uint64_t opretvalue,uint8_t *opretbuf,uint16_t opretlen,uint16_t vout,uint256 MoM,int32_t MoMdepth); void komodo_init(int32_t height); +int32_t komodo_MoMdata(int32_t *notarized_htp,uint256 *MoMp,int32_t nHeight); int32_t komodo_notarizeddata(int32_t nHeight,uint256 *notarized_hashp,uint256 *notarized_desttxidp); char *komodo_issuemethod(char *userpass,char *method,char *params,uint16_t port); void komodo_init(int32_t height); diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 1f2f21005..f7d6982d0 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -400,7 +400,7 @@ int32_t komodo_notarized_height(uint256 *hashp,uint256 *txidp) int32_t komodo_MoMdata(int32_t *notarized_htp,uint256 *MoMp,int32_t nHeight) { - struct komodo_state *sp; struct notarized_checkpoint *np = 0; + int32_t i; struct komodo_state *sp; struct notarized_checkpoint *np = 0; np = 0; for (i=sp->NUM_NPOINTS-1; i>=0; i--) { From f850a97b77ae45c7ede7f8993e6fbbae21808fd9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Mar 2018 18:15:25 +0200 Subject: [PATCH 0639/1062] Test --- src/komodo.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/komodo.h b/src/komodo.h index 5d697b28a..95d3ad0ff 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -579,6 +579,8 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr sp->NOTARIZED_HEIGHT = *notarizedheightp; sp->NOTARIZED_HASH = kmdtxid; sp->NOTARIZED_DESTTXID = desttxid; + memset(&sp->MoM,0,sizeof(sp->MoM)); + sp->MoMdepth = 0; if ( len+36+nameoffset <= opretlen ) { len += iguana_rwbignum(0,&scriptbuf[len+nameoffset],32,(uint8_t *)&sp->MoM); From 617c9c6178c3f7961bb4fcd51723a79ad78396de Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Mar 2018 18:19:13 +0200 Subject: [PATCH 0640/1062] Test --- src/komodo.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo.h b/src/komodo.h index 95d3ad0ff..d45b87859 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -581,7 +581,7 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr sp->NOTARIZED_DESTTXID = desttxid; memset(&sp->MoM,0,sizeof(sp->MoM)); sp->MoMdepth = 0; - if ( len+36+nameoffset <= opretlen ) + if ( len+36 <= opretlen ) { len += iguana_rwbignum(0,&scriptbuf[len+nameoffset],32,(uint8_t *)&sp->MoM); len += iguana_rwnum(0,&scriptbuf[len+nameoffset],sizeof(sp->MoMdepth),(uint8_t *)&sp->MoMdepth); @@ -592,7 +592,7 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr } else { - //printf("VALID %s MoM.%s [%d]\n",ASSETCHAINS_SYMBOL,sp->MoM.ToString().c_str(),sp->MoMdepth); + printf("VALID %s MoM.%s [%d]\n",ASSETCHAINS_SYMBOL,sp->MoM.ToString().c_str(),sp->MoMdepth); } } komodo_stateupdate(height,0,0,0,zero,0,0,0,0,0,0,0,0,0,0,sp->MoM,sp->MoMdepth); From 4329679df7d5d0d2239ddd716b32b3b4bd690d30 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 24 Mar 2018 12:59:36 +0200 Subject: [PATCH 0641/1062] height_MoM rpc --- src/komodo.h | 2 +- src/komodo_notary.h | 4 +- src/rpcblockchain.cpp | 92 +++++++++++++++++++++++++++---------------- src/rpcclient.cpp | 3 +- src/rpcserver.cpp | 1 + src/rpcserver.h | 1 + 6 files changed, 64 insertions(+), 39 deletions(-) diff --git a/src/komodo.h b/src/komodo.h index d45b87859..5a1dc62f8 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -592,7 +592,7 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr } else { - printf("VALID %s MoM.%s [%d]\n",ASSETCHAINS_SYMBOL,sp->MoM.ToString().c_str(),sp->MoMdepth); + //printf("VALID %s MoM.%s [%d]\n",ASSETCHAINS_SYMBOL,sp->MoM.ToString().c_str(),sp->MoMdepth); } } komodo_stateupdate(height,0,0,0,zero,0,0,0,0,0,0,0,0,0,0,sp->MoM,sp->MoMdepth); diff --git a/src/komodo_notary.h b/src/komodo_notary.h index f7d6982d0..e4b2a650e 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -127,12 +127,12 @@ const char *Notaries_elected0[][2] = }; #define KOMODO_NOTARIES_TIMESTAMP1 1600000000 -#define KOMODO_NOTARIES_HEIGHT1 ((800000 / KOMODO_ELECTION_GAP) * KOMODO_ELECTION_GAP) +#define KOMODO_NOTARIES_HEIGHT1 ((900000 / KOMODO_ELECTION_GAP) * KOMODO_ELECTION_GAP) const char *Notaries_elected1[][2] = { - { "0_jl777_testA", "03b7621b44118017a16043f19b30cc8a4cfe068ac4e42417bae16ba460c80f3828" }, { "0_jl777_testB", "02ebfc784a4ba768aad88d44d1045d240d47b26e248cafaf1c5169a42d7a61d344" }, + { "0_jl777_testA", "03b7621b44118017a16043f19b30cc8a4cfe068ac4e42417bae16ba460c80f3828" }, { "0_kolo_testA", "0287aa4b73988ba26cf6565d815786caf0d2c4af704d7883d163ee89cd9977edec" }, { "artik_AR", "029acf1dcd9f5ff9c455f8bb717d4ae0c703e089d16cf8424619c491dff5994c90" }, { "artik_EU", "03f54b2c24f82632e3cdebe4568ba0acf487a80f8a89779173cdb78f74514847ce" }, diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 91f694abb..9961fe4f7 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -527,6 +527,7 @@ char *bitcoin_address(char *coinaddr,uint8_t addrtype,uint8_t *pubkey_or_rmd160, //uint32_t komodo_interest_args(int32_t *txheightp,uint32_t *tiptimep,uint64_t *valuep,uint256 hash,int32_t n); int32_t komodo_minerids(uint8_t *minerids,int32_t height,int32_t width); int32_t komodo_kvsearch(uint256 *refpubkeyp,int32_t current_height,uint32_t *flagsp,int32_t *heightp,uint8_t value[IGUANA_MAXSCRIPTSIZE],uint8_t *key,int32_t keylen); +int32_t komodo_MoMdata(int32_t *notarized_htp,uint256 *MoMp,int32_t nHeight); /*uint64_t conv_NXTpassword(unsigned char *mysecret,unsigned char *mypublic,uint8_t *pass,int32_t passlen); @@ -579,6 +580,28 @@ UniValue kvsearch(const UniValue& params, bool fHelp) return ret; } +UniValue height_MoM(const UniValue& params, bool fHelp) +{ + int32_t height,depth,notarized_height; uint256 MoM; uint32_t timestamp = 0; UniValue ret(UniValue::VOBJ); UniValue a(UniValue::VARR); + if ( fHelp || params.size() != 1 ) + throw runtime_error("height_MoM needs height\n"); + LOCK(cs_main); + height = atoi(params[0].get_str().c_str()); + if ( height <= 0 ) + height = chainActive.Tip()->nHeight; + depth = komodo_MoMdata(¬arized_height,&MoM,height); + ret.push_back(Pair("coin",ASSETCHAINS_SYMBOL[0] == 0 ? "KMD" : ASSSETCHAINS_SYMBOL)); + ret.push_back(Pair("height",height)); + if ( depth > 0 ) + { + ret.push_back(Pair("depth",depth)); + ret.push_back(Pair("notarized_height",notarized_height)); + ret.push_back(Pair("MoM",MoM.GetHex())); + } else ret.push_back(Pair("error",(char *)"no MoM for height")); + + return ret; +} + UniValue minerids(const UniValue& params, bool fHelp) { uint32_t timestamp = 0; UniValue ret(UniValue::VOBJ); UniValue a(UniValue::VARR); uint8_t minerids[2000],pubkeys[65][33]; int32_t i,j,n,numnotaries,tally[129]; @@ -639,57 +662,56 @@ UniValue minerids(const UniValue& params, bool fHelp) UniValue notaries(const UniValue& params, bool fHelp) { UniValue a(UniValue::VARR); uint32_t timestamp=0; UniValue ret(UniValue::VOBJ); int32_t i,j,n,m; char *hexstr; uint8_t pubkeys[64][33]; char btcaddr[64],kmdaddr[64],*ptr; - if ( fHelp || params.size() != 1 ) - throw runtime_error("notaries height\n"); + if ( fHelp || (params.size() != 1 && params.size() != 2) ) + throw runtime_error("notaries height timestamp\n"); LOCK(cs_main); int32_t height = atoi(params[0].get_str().c_str()); + if ( params.size() == 2 ) + timestamp = (uint32_t)atol(params[1].get_str().c_str()); + else timestamp = (uint32_t)time(NULL); if ( height < 0 ) { height = chainActive.Tip()->nHeight; timestamp = chainActive.Tip()->GetBlockTime(); } - else + else if ( params.size() < 2 ) { CBlockIndex *pblockindex = chainActive[height]; if ( pblockindex != 0 ) timestamp = pblockindex->GetBlockTime(); } - //fprintf(stderr,"notaries as of height.%d\n",height); - //if ( height > chainActive.Height()+20000 ) - // throw JSONRPCError(RPC_INVALID_PARAMETER, "Block height out of range"); - //else + if ( (n= komodo_notaries(pubkeys,height,timestamp)) > 0 ) { - if ( (n= komodo_notaries(pubkeys,height,timestamp)) > 0 ) + for (i=0; i Date: Sat, 24 Mar 2018 13:16:16 +0200 Subject: [PATCH 0642/1062] Test --- src/rpcblockchain.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 9961fe4f7..877102c1d 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -590,8 +590,9 @@ UniValue height_MoM(const UniValue& params, bool fHelp) if ( height <= 0 ) height = chainActive.Tip()->nHeight; depth = komodo_MoMdata(¬arized_height,&MoM,height); - ret.push_back(Pair("coin",ASSETCHAINS_SYMBOL[0] == 0 ? "KMD" : ASSSETCHAINS_SYMBOL)); + ret.push_back(Pair("coin",(char *)(ASSETCHAINS_SYMBOL[0] == 0 ? "KMD" : ASSETCHAINS_SYMBOL))); ret.push_back(Pair("height",height)); + ret.push_back(Pair("timestamp",(uint64_t)timestamp)); if ( depth > 0 ) { ret.push_back(Pair("depth",depth)); @@ -711,7 +712,7 @@ UniValue notaries(const UniValue& params, bool fHelp) ret.push_back(Pair("notaries", a)); ret.push_back(Pair("numnotaries", n)); ret.push_back(Pair("height", height)); - ret.push_back(Pair("timestamp", timestamp)); + ret.push_back(Pair("timestamp", (uint64_t)timestamp)); return ret; } From 66b1416d7d52d8ec02ab30bc7d3bb68845a92af9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 24 Mar 2018 14:02:43 +0200 Subject: [PATCH 0643/1062] Fix --- src/komodo_notary.h | 23 ++++++++++++++--------- src/rpcblockchain.cpp | 8 ++++++++ 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index e4b2a650e..deb0dd8f6 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -398,23 +398,28 @@ int32_t komodo_notarized_height(uint256 *hashp,uint256 *txidp) } } -int32_t komodo_MoMdata(int32_t *notarized_htp,uint256 *MoMp,int32_t nHeight) +int32_t komodo_MoMdata(int32_t *notarized_htp,uint256 *MoMp,uint256 *kmdtxidp,int32_t nHeight) { - int32_t i; struct komodo_state *sp; struct notarized_checkpoint *np = 0; + int32_t i; char symbol[KOMODO_ASSETCHAIN_MAXLEN],dest[KOMODO_ASSETCHAIN_MAXLEN]; struct komodo_state *sp; struct notarized_checkpoint *np = 0; np = 0; - for (i=sp->NUM_NPOINTS-1; i>=0; i--) + if ( (sp= komodo_stateptr(symbol,dest)) != 0 ) { - np = &sp->NPOINTS[i]; - if ( np->MoMdepth > 0 && nHeight > np->nHeight-np->MoMdepth && nHeight <= np->nHeight ) + for (i=sp->NUM_NPOINTS-1; i>=0; i--) { - printf("komodo_MoMdata %d i.%d np->ht %d MoMdepth.%d\n",nHeight,i,np->nHeight,np->MoMdepth); - *notarized_htp = np->nHeight; - *MoMp = np->MoM; - return(np->MoMdepth); + np = &sp->NPOINTS[i]; + if ( np->MoMdepth > 0 && nHeight > np->nHeight-np->MoMdepth && nHeight <= np->nHeight ) + { + printf("komodo_MoMdata.(%s -> %s) %d i.%d np->ht %d MoMdepth.%d\n",symbol,dest,nHeight,i,np->nHeight,np->MoMdepth); + *notarized_htp = np->nHeight; + *MoMp = np->MoM; + *kmdtxidp = np->NOTARIZED_DESTTXID; + return(np->MoMdepth); + } } } *notarized_htp = 0; memset(MoMp,0,sizeof(*MoMp)); + memset(kmdtxidp,0,sizeof(*kmdtxidp)); return(0); } diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 877102c1d..4bb4050cc 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -588,7 +588,15 @@ UniValue height_MoM(const UniValue& params, bool fHelp) LOCK(cs_main); height = atoi(params[0].get_str().c_str()); if ( height <= 0 ) + { + if ( chainActive.Tip() == 0 ) + { + ret.push_back(Pair("error",(char *)"no active chain yet")); + return(ret) + } height = chainActive.Tip()->nHeight; + } + fprintf(stderr,"height_MoM height.%d\n",height); depth = komodo_MoMdata(¬arized_height,&MoM,height); ret.push_back(Pair("coin",(char *)(ASSETCHAINS_SYMBOL[0] == 0 ? "KMD" : ASSETCHAINS_SYMBOL))); ret.push_back(Pair("height",height)); From e9115be059c4f1a69c09505fc522a023ae51142c Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 24 Mar 2018 14:04:24 +0200 Subject: [PATCH 0644/1062] Test --- src/komodo_notary.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index deb0dd8f6..1c5e9c9e2 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -412,7 +412,7 @@ int32_t komodo_MoMdata(int32_t *notarized_htp,uint256 *MoMp,uint256 *kmdtxidp,in printf("komodo_MoMdata.(%s -> %s) %d i.%d np->ht %d MoMdepth.%d\n",symbol,dest,nHeight,i,np->nHeight,np->MoMdepth); *notarized_htp = np->nHeight; *MoMp = np->MoM; - *kmdtxidp = np->NOTARIZED_DESTTXID; + *kmdtxidp = np->notarized_desttxid; return(np->MoMdepth); } } From 682ee10f6b4a4f55880a15e7abff92c668d1fd84 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 24 Mar 2018 14:06:20 +0200 Subject: [PATCH 0645/1062] Test --- src/rpcblockchain.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 4bb4050cc..9a6453cb3 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -592,7 +592,7 @@ UniValue height_MoM(const UniValue& params, bool fHelp) if ( chainActive.Tip() == 0 ) { ret.push_back(Pair("error",(char *)"no active chain yet")); - return(ret) + return(ret); } height = chainActive.Tip()->nHeight; } From 8b8c54db0734b90c68e0b6e6bbfe9662245a9a7d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 24 Mar 2018 14:07:49 +0200 Subject: [PATCH 0646/1062] Test --- src/rpcblockchain.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 9a6453cb3..8a9b796eb 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -582,7 +582,7 @@ UniValue kvsearch(const UniValue& params, bool fHelp) UniValue height_MoM(const UniValue& params, bool fHelp) { - int32_t height,depth,notarized_height; uint256 MoM; uint32_t timestamp = 0; UniValue ret(UniValue::VOBJ); UniValue a(UniValue::VARR); + int32_t height,depth,notarized_height; uint256 MoM,kmdtxid; uint32_t timestamp = 0; UniValue ret(UniValue::VOBJ); UniValue a(UniValue::VARR); if ( fHelp || params.size() != 1 ) throw runtime_error("height_MoM needs height\n"); LOCK(cs_main); @@ -597,7 +597,7 @@ UniValue height_MoM(const UniValue& params, bool fHelp) height = chainActive.Tip()->nHeight; } fprintf(stderr,"height_MoM height.%d\n",height); - depth = komodo_MoMdata(¬arized_height,&MoM,height); + depth = komodo_MoMdata(¬arized_height,&MoM,&kmdtxid,height); ret.push_back(Pair("coin",(char *)(ASSETCHAINS_SYMBOL[0] == 0 ? "KMD" : ASSETCHAINS_SYMBOL))); ret.push_back(Pair("height",height)); ret.push_back(Pair("timestamp",(uint64_t)timestamp)); @@ -606,6 +606,7 @@ UniValue height_MoM(const UniValue& params, bool fHelp) ret.push_back(Pair("depth",depth)); ret.push_back(Pair("notarized_height",notarized_height)); ret.push_back(Pair("MoM",MoM.GetHex())); + ret.push_back(Pair("kmdtxid",kmdtxid.GetHex())); } else ret.push_back(Pair("error",(char *)"no MoM for height")); return ret; From 2b7b4c274cc0c1bc545ee74cc7c0f4549aa27ce5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 24 Mar 2018 14:08:45 +0200 Subject: [PATCH 0647/1062] Test --- src/rpcblockchain.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 8a9b796eb..2293e6eb7 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -527,7 +527,7 @@ char *bitcoin_address(char *coinaddr,uint8_t addrtype,uint8_t *pubkey_or_rmd160, //uint32_t komodo_interest_args(int32_t *txheightp,uint32_t *tiptimep,uint64_t *valuep,uint256 hash,int32_t n); int32_t komodo_minerids(uint8_t *minerids,int32_t height,int32_t width); int32_t komodo_kvsearch(uint256 *refpubkeyp,int32_t current_height,uint32_t *flagsp,int32_t *heightp,uint8_t value[IGUANA_MAXSCRIPTSIZE],uint8_t *key,int32_t keylen); -int32_t komodo_MoMdata(int32_t *notarized_htp,uint256 *MoMp,int32_t nHeight); +int32_t komodo_MoMdata(int32_t *notarized_htp,uint256 *MoMp,uint256 *kmdtxidp,int32_t nHeight); /*uint64_t conv_NXTpassword(unsigned char *mysecret,unsigned char *mypublic,uint8_t *pass,int32_t passlen); From aa5ca00101a3967a7b3508ada802bbba279e89e9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 24 Mar 2018 14:10:59 +0200 Subject: [PATCH 0648/1062] Test --- src/komodo_bitcoind.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 0306b434e..535e1ad81 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -811,16 +811,18 @@ int32_t komodo_is_special(int32_t height,uint8_t pubkey33[33],uint32_t timestamp return(0); } -int32_t komodo_MoM(int32_t *notarized_heightp,uint256 *MoMp,int32_t nHeight) +int32_t komodo_MoM(int32_t *notarized_heightp,uint256 *MoMp,uint256 *kmdtxidp,int32_t nHeight) { - int32_t depth,notarized_ht; uint256 MoM; - depth = komodo_MoMdata(¬arized_ht,&MoM,nHeight); + int32_t depth,notarized_ht; uint256 MoM,kmdtxid; + depth = komodo_MoMdata(¬arized_ht,&MoM,&kmdtxid,nHeight); memset(MoMp,0,sizeof(*MoMp)); + memset(*kmdtxidp,0,sizeof(*kmdtxidp)); *notarized_heightp = 0; if ( depth > 0 && notarized_ht > 0 && nHeight > notarized_ht-depth && nHeight < notarized_ht ) { *MoMp = MoM; *notarized_heightp = notarized_ht; + *kmdtxidp = kmdtxid; } return(depth); } From 5473ce392a718f9fb128ec31b01205ea3b1a0355 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 24 Mar 2018 14:11:57 +0200 Subject: [PATCH 0649/1062] Test --- src/rpcblockchain.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 2293e6eb7..888c797f3 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -527,7 +527,7 @@ char *bitcoin_address(char *coinaddr,uint8_t addrtype,uint8_t *pubkey_or_rmd160, //uint32_t komodo_interest_args(int32_t *txheightp,uint32_t *tiptimep,uint64_t *valuep,uint256 hash,int32_t n); int32_t komodo_minerids(uint8_t *minerids,int32_t height,int32_t width); int32_t komodo_kvsearch(uint256 *refpubkeyp,int32_t current_height,uint32_t *flagsp,int32_t *heightp,uint8_t value[IGUANA_MAXSCRIPTSIZE],uint8_t *key,int32_t keylen); -int32_t komodo_MoMdata(int32_t *notarized_htp,uint256 *MoMp,uint256 *kmdtxidp,int32_t nHeight); +int32_t komodo_MoM(int32_t *notarized_htp,uint256 *MoMp,uint256 *kmdtxidp,int32_t nHeight); /*uint64_t conv_NXTpassword(unsigned char *mysecret,unsigned char *mypublic,uint8_t *pass,int32_t passlen); @@ -597,7 +597,7 @@ UniValue height_MoM(const UniValue& params, bool fHelp) height = chainActive.Tip()->nHeight; } fprintf(stderr,"height_MoM height.%d\n",height); - depth = komodo_MoMdata(¬arized_height,&MoM,&kmdtxid,height); + depth = komodo_MoM(¬arized_height,&MoM,&kmdtxid,height); ret.push_back(Pair("coin",(char *)(ASSETCHAINS_SYMBOL[0] == 0 ? "KMD" : ASSETCHAINS_SYMBOL))); ret.push_back(Pair("height",height)); ret.push_back(Pair("timestamp",(uint64_t)timestamp)); From 663304d9634fd3f7efb75260508cdbbb6d74dfe7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 24 Mar 2018 14:12:10 +0200 Subject: [PATCH 0650/1062] Test --- src/rpcblockchain.cpp | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 888c797f3..5075fb200 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -528,22 +528,6 @@ char *bitcoin_address(char *coinaddr,uint8_t addrtype,uint8_t *pubkey_or_rmd160, int32_t komodo_minerids(uint8_t *minerids,int32_t height,int32_t width); int32_t komodo_kvsearch(uint256 *refpubkeyp,int32_t current_height,uint32_t *flagsp,int32_t *heightp,uint8_t value[IGUANA_MAXSCRIPTSIZE],uint8_t *key,int32_t keylen); int32_t komodo_MoM(int32_t *notarized_htp,uint256 *MoMp,uint256 *kmdtxidp,int32_t nHeight); -/*uint64_t conv_NXTpassword(unsigned char *mysecret,unsigned char *mypublic,uint8_t *pass,int32_t passlen); - - -UniValue passphrasewif(const UniValue& params, bool fHelp) -{ - UniValue ret(UniValue::VOBJ); char *passphrase,wifstr[64],coinaddr[64]; uint8_t tmptype,pubkey33[33]; void *ctx; uint256 privkey,pubkey; - passphrase = params[0].get_str().c_str(); - conv_NXTpassword((void *)&privkey,(void *)&pubkey,(uint8_t *)passphrase,(int32_t)strlen(passphrase)); - ctx = bitcoin_ctx(); - bitcoin_priv2pub(ctx,pubkey33,coinaddr,privkey,0,60); - bitcoin_priv2wif(0,wifstr,privkey,188); - free(ctx); - ret.push_back(Pair("address",coinaddr)); - ret.push_back(Pair("wif",wifstr)); - return ret; -}*/ UniValue kvsearch(const UniValue& params, bool fHelp) { From b3548b524daa2875de8f73c5339ec17a139baec5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 24 Mar 2018 14:16:00 +0200 Subject: [PATCH 0651/1062] Test --- src/komodo_bitcoind.h | 2 +- src/komodo_globals.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 535e1ad81..d6e36cfde 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -816,7 +816,7 @@ int32_t komodo_MoM(int32_t *notarized_heightp,uint256 *MoMp,uint256 *kmdtxidp,in int32_t depth,notarized_ht; uint256 MoM,kmdtxid; depth = komodo_MoMdata(¬arized_ht,&MoM,&kmdtxid,nHeight); memset(MoMp,0,sizeof(*MoMp)); - memset(*kmdtxidp,0,sizeof(*kmdtxidp)); + memset(kmdtxidp,0,sizeof(*kmdtxidp)); *notarized_heightp = 0; if ( depth > 0 && notarized_ht > 0 && nHeight > notarized_ht-depth && nHeight < notarized_ht ) { diff --git a/src/komodo_globals.h b/src/komodo_globals.h index b35a2a8da..7c4077d8d 100644 --- a/src/komodo_globals.h +++ b/src/komodo_globals.h @@ -17,7 +17,7 @@ void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotaries,uint8_t notaryid,uint256 txhash,uint64_t voutmask,uint8_t numvouts,uint32_t *pvals,uint8_t numpvals,int32_t kheight,uint32_t ktime,uint64_t opretvalue,uint8_t *opretbuf,uint16_t opretlen,uint16_t vout,uint256 MoM,int32_t MoMdepth); void komodo_init(int32_t height); -int32_t komodo_MoMdata(int32_t *notarized_htp,uint256 *MoMp,int32_t nHeight); +int32_t komodo_MoMdata(int32_t *notarized_htp,uint256 *MoMp,uint256 *kmdtxidp,int32_t nHeight); int32_t komodo_notarizeddata(int32_t nHeight,uint256 *notarized_hashp,uint256 *notarized_desttxidp); char *komodo_issuemethod(char *userpass,char *method,char *params,uint16_t port); void komodo_init(int32_t height); From 16ed777a8c7ae8e3d7605aa555a7781ee7795fd4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 24 Mar 2018 14:28:18 +0200 Subject: [PATCH 0652/1062] Fix off by ones --- src/komodo_bitcoind.h | 2 +- src/komodo_notary.h | 4 ++-- src/rpcblockchain.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index d6e36cfde..3603b4135 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -818,7 +818,7 @@ int32_t komodo_MoM(int32_t *notarized_heightp,uint256 *MoMp,uint256 *kmdtxidp,in memset(MoMp,0,sizeof(*MoMp)); memset(kmdtxidp,0,sizeof(*kmdtxidp)); *notarized_heightp = 0; - if ( depth > 0 && notarized_ht > 0 && nHeight > notarized_ht-depth && nHeight < notarized_ht ) + if ( depth > 0 && notarized_ht > 0 && nHeight > notarized_ht-depth && nHeight <= notarized_ht ) { *MoMp = MoM; *notarized_heightp = notarized_ht; diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 1c5e9c9e2..32a9673f8 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -409,8 +409,8 @@ int32_t komodo_MoMdata(int32_t *notarized_htp,uint256 *MoMp,uint256 *kmdtxidp,in np = &sp->NPOINTS[i]; if ( np->MoMdepth > 0 && nHeight > np->nHeight-np->MoMdepth && nHeight <= np->nHeight ) { - printf("komodo_MoMdata.(%s -> %s) %d i.%d np->ht %d MoMdepth.%d\n",symbol,dest,nHeight,i,np->nHeight,np->MoMdepth); - *notarized_htp = np->nHeight; + //printf("komodo_MoMdata.(%s -> %s) %d i.%d np->ht %d MoMdepth.%d\n",symbol,dest,nHeight,i,np->nHeight,np->MoMdepth); + *notarized_htp = np->notarized_height; *MoMp = np->MoM; *kmdtxidp = np->notarized_desttxid; return(np->MoMdepth); diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 5075fb200..7c167afc4 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -580,7 +580,7 @@ UniValue height_MoM(const UniValue& params, bool fHelp) } height = chainActive.Tip()->nHeight; } - fprintf(stderr,"height_MoM height.%d\n",height); + //fprintf(stderr,"height_MoM height.%d\n",height); depth = komodo_MoM(¬arized_height,&MoM,&kmdtxid,height); ret.push_back(Pair("coin",(char *)(ASSETCHAINS_SYMBOL[0] == 0 ? "KMD" : ASSETCHAINS_SYMBOL))); ret.push_back(Pair("height",height)); From 6bc6362031737b2e420f136db3efbc5ba56db1b4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 24 Mar 2018 14:54:19 +0200 Subject: [PATCH 0653/1062] Test --- src/komodo_notary.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 32a9673f8..9b9515792 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -398,7 +398,7 @@ int32_t komodo_notarized_height(uint256 *hashp,uint256 *txidp) } } -int32_t komodo_MoMdata(int32_t *notarized_htp,uint256 *MoMp,uint256 *kmdtxidp,int32_t nHeight) +int32_t komodo_MoMdata(int32_t *notarized_htp,uint256 *MoMp,uint256 *kmdtxidp,int32_t height) { int32_t i; char symbol[KOMODO_ASSETCHAIN_MAXLEN],dest[KOMODO_ASSETCHAIN_MAXLEN]; struct komodo_state *sp; struct notarized_checkpoint *np = 0; np = 0; @@ -407,9 +407,8 @@ int32_t komodo_MoMdata(int32_t *notarized_htp,uint256 *MoMp,uint256 *kmdtxidp,in for (i=sp->NUM_NPOINTS-1; i>=0; i--) { np = &sp->NPOINTS[i]; - if ( np->MoMdepth > 0 && nHeight > np->nHeight-np->MoMdepth && nHeight <= np->nHeight ) + if ( np->MoMdepth > 0 && height > np->notarized_height-np->MoMdepth && height <= np->notarized_height ) { - //printf("komodo_MoMdata.(%s -> %s) %d i.%d np->ht %d MoMdepth.%d\n",symbol,dest,nHeight,i,np->nHeight,np->MoMdepth); *notarized_htp = np->notarized_height; *MoMp = np->MoM; *kmdtxidp = np->notarized_desttxid; From ecf9c398f9dc2b25d17403f4523f9a0e8a6e1cd2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 24 Mar 2018 15:36:15 +0200 Subject: [PATCH 0654/1062] Test --- src/komodo_notary.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 9b9515792..9d40adf7c 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -207,6 +207,7 @@ int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestam n = (int32_t)(sizeof(Notaries_elected0)/sizeof(*Notaries_elected0)); for (i=0; i Date: Sat, 24 Mar 2018 15:39:49 +0200 Subject: [PATCH 0655/1062] Test --- src/komodo_bitcoind.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 3603b4135..6d52ddbe3 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -727,7 +727,7 @@ int32_t komodo_electednotary(int32_t *numnotariesp,uint8_t *pubkey33,int32_t hei int8_t komodo_minerid(int32_t height,uint8_t *pubkey33) { int32_t num,i,numnotaries; CBlockIndex *pindex; uint32_t timestamp=0; uint8_t _pubkey33[33],pubkeys[64][33]; - if ( pubkey33 == 0 && (pindex= chainActive[height]) != 0 ) + if ( (pindex= chainActive[height]) != 0 ) { timestamp = pindex->GetBlockTime(); if ( pubkey33 == 0 ) From 78f9d61210a59982a66ad92529da33e138561423 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 24 Mar 2018 15:53:08 +0200 Subject: [PATCH 0656/1062] Test --- src/komodo_notary.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 9d40adf7c..a87325d84 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -200,6 +200,12 @@ const char *Notaries_elected1[][2] = int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestamp) { int32_t i,htind,n; uint64_t mask = 0; struct knotary_entry *kp,*tmp; + if ( timestamp == 0 ) + { + CBlockIndex *pblockindex = chainActive[height]; + if ( pblockindex != 0 ) + timestamp = pblockindex->GetBlockTime(); + } if ( height >= KOMODO_NOTARIES_HARDCODED || ASSETCHAINS_SYMBOL[0] != 0 ) { if ( timestamp < KOMODO_NOTARIES_TIMESTAMP1 || height < KOMODO_NOTARIES_HEIGHT1 ) From 1f37849a4c7810ee3e2a8dc6e8944ed3c11eec5b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 24 Mar 2018 15:55:26 +0200 Subject: [PATCH 0657/1062] Test --- src/komodo_notary.h | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index a87325d84..fb7a8f426 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -200,12 +200,8 @@ const char *Notaries_elected1[][2] = int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestamp) { int32_t i,htind,n; uint64_t mask = 0; struct knotary_entry *kp,*tmp; - if ( timestamp == 0 ) - { - CBlockIndex *pblockindex = chainActive[height]; - if ( pblockindex != 0 ) - timestamp = pblockindex->GetBlockTime(); - } + if ( timestamp == 0 && (timestamp= komodo_heightstamp(height)) == 0 ) + timestamp = (uint32_t)time(NULL) - 777; if ( height >= KOMODO_NOTARIES_HARDCODED || ASSETCHAINS_SYMBOL[0] != 0 ) { if ( timestamp < KOMODO_NOTARIES_TIMESTAMP1 || height < KOMODO_NOTARIES_HEIGHT1 ) From 709a9861eedc8e6369073455a51c8f6cba6c8d57 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 24 Mar 2018 15:56:43 +0200 Subject: [PATCH 0658/1062] Test --- src/komodo_globals.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/komodo_globals.h b/src/komodo_globals.h index 7c4077d8d..518d22cbd 100644 --- a/src/komodo_globals.h +++ b/src/komodo_globals.h @@ -15,6 +15,7 @@ #include "komodo_defs.h" +uint32_t komodo_heightstamp(int32_t height); void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotaries,uint8_t notaryid,uint256 txhash,uint64_t voutmask,uint8_t numvouts,uint32_t *pvals,uint8_t numpvals,int32_t kheight,uint32_t ktime,uint64_t opretvalue,uint8_t *opretbuf,uint16_t opretlen,uint16_t vout,uint256 MoM,int32_t MoMdepth); void komodo_init(int32_t height); int32_t komodo_MoMdata(int32_t *notarized_htp,uint256 *MoMp,uint256 *kmdtxidp,int32_t nHeight); From 6e1d2e7dc98c02e724a83770b8189ac9343ca7c2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 24 Mar 2018 15:59:48 +0200 Subject: [PATCH 0659/1062] Test --- src/bitcoin-cli.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/bitcoin-cli.cpp b/src/bitcoin-cli.cpp index 87c5e6f76..178f0baed 100644 --- a/src/bitcoin-cli.cpp +++ b/src/bitcoin-cli.cpp @@ -81,6 +81,11 @@ void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotar } +uint32_t komodo_heightstamp(int32_t height) +{ + return(0); +} + static bool AppInitRPC(int argc, char* argv[]) { // From b91ef9cf13d8a1930e0986bb232eda05b6442e89 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 24 Mar 2018 16:02:25 +0200 Subject: [PATCH 0660/1062] Test --- src/komodo_bitcoind.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 6d52ddbe3..6de981165 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -693,7 +693,7 @@ uint32_t komodo_heightstamp(int32_t height) CBlockIndex *ptr; if ( height > 0 && (ptr= komodo_chainactive(height)) != 0 ) return(ptr->nTime); - else fprintf(stderr,"komodo_heightstamp null ptr for block.%d\n",height); + //else fprintf(stderr,"komodo_heightstamp null ptr for block.%d\n",height); return(0); } From 15280cb441fdc21bb6a48eef59e2b374c737c8cd Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 24 Mar 2018 16:22:18 +0200 Subject: [PATCH 0661/1062] Test --- src/komodo_bitcoind.h | 4 ++-- src/komodo_notary.h | 6 ++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 6de981165..97abb9429 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -621,7 +621,7 @@ int32_t komodo_block2height(CBlock *block) //for (i=0; i<6; i++) // printf("%02x",ptr[i]); n = ptr[0]; - for (i=0; iGetBlockTime(); if ( pubkey33 == 0 ) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index fb7a8f426..9a9073221 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -200,18 +200,16 @@ const char *Notaries_elected1[][2] = int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestamp) { int32_t i,htind,n; uint64_t mask = 0; struct knotary_entry *kp,*tmp; - if ( timestamp == 0 && (timestamp= komodo_heightstamp(height)) == 0 ) - timestamp = (uint32_t)time(NULL) - 777; if ( height >= KOMODO_NOTARIES_HARDCODED || ASSETCHAINS_SYMBOL[0] != 0 ) { - if ( timestamp < KOMODO_NOTARIES_TIMESTAMP1 || height < KOMODO_NOTARIES_HEIGHT1 ) + if ( (timestamp != 0 && timestamp < KOMODO_NOTARIES_TIMESTAMP1) || height < KOMODO_NOTARIES_HEIGHT1 ) { n = (int32_t)(sizeof(Notaries_elected0)/sizeof(*Notaries_elected0)); for (i=0; i Date: Sat, 24 Mar 2018 16:30:46 +0200 Subject: [PATCH 0662/1062] Test --- src/komodo_notary.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 9a9073221..e86be55e2 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -126,8 +126,8 @@ const char *Notaries_elected0[][2] = { "xxspot2_XX", "03d85b221ea72ebcd25373e7961f4983d12add66a92f899deaf07bab1d8b6f5573" } }; -#define KOMODO_NOTARIES_TIMESTAMP1 1600000000 -#define KOMODO_NOTARIES_HEIGHT1 ((900000 / KOMODO_ELECTION_GAP) * KOMODO_ELECTION_GAP) +#define KOMODO_NOTARIES_TIMESTAMP1 1400000000 +#define KOMODO_NOTARIES_HEIGHT1 ((700000 / KOMODO_ELECTION_GAP) * KOMODO_ELECTION_GAP) const char *Notaries_elected1[][2] = { @@ -214,6 +214,7 @@ int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestam n = (int32_t)(sizeof(Notaries_elected1)/sizeof(*Notaries_elected1)); for (i=0; i Date: Sat, 24 Mar 2018 16:38:12 +0200 Subject: [PATCH 0663/1062] Test --- src/komodo_notary.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index e86be55e2..894756802 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -207,14 +207,16 @@ int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestam n = (int32_t)(sizeof(Notaries_elected0)/sizeof(*Notaries_elected0)); for (i=0; inotaryid < n ) From 98598a7094036003c3d65337e3457899af345273 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 24 Mar 2018 16:43:51 +0200 Subject: [PATCH 0664/1062] Test --- src/komodo.h | 4 ++-- src/komodo_notary.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/komodo.h b/src/komodo.h index 5a1dc62f8..ded368381 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -573,7 +573,7 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr { notarized = 1; } - if ( notarized != 0 && *notarizedheightp > sp->NOTARIZED_HEIGHT && *notarizedheightp < height && (height < sp->CURRENT_HEIGHT-1000 || komodo_verifynotarization(ASSETCHAINS_SYMBOL[0]==0?(char *)"KMD":ASSETCHAINS_SYMBOL,(char *)(ASSETCHAINS_SYMBOL[0] == 0 ? "BTC" : "KMD"),height,*notarizedheightp,kmdtxid,desttxid) == 0) ) + if ( notarized != 0 && *notarizedheightp > sp->NOTARIZED_HEIGHT && *notarizedheightp < height && (height < sp->CURRENT_HEIGHT-64 || komodo_verifynotarization(ASSETCHAINS_SYMBOL[0]==0?(char *)"KMD":ASSETCHAINS_SYMBOL,(char *)(ASSETCHAINS_SYMBOL[0] == 0 ? "BTC" : "KMD"),height,*notarizedheightp,kmdtxid,desttxid) == 0) ) { int32_t nameoffset = (int32_t)strlen(ASSETCHAINS_SYMBOL) + 1; sp->NOTARIZED_HEIGHT = *notarizedheightp; @@ -623,7 +623,7 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr komodo_stateupdate(height,0,0,0,txhash,0,0,0,0,0,0,value,&scriptbuf[len],opretlen-len+4+3+(scriptbuf[1] == 0x4d),j,zero,0); } } - } else if ( height >= KOMODO_MAINNET_START ) + } else if ( height >= sp->CURRENT_HEIGHT-64 )//KOMODO_MAINNET_START ) printf("notarized.%d %llx reject ht.%d NOTARIZED.%d prev.%d %s.%s DESTTXID.%s (%s) len.%d opretlen.%d\n",notarized,(long long)signedmask,height,*notarizedheightp,sp->NOTARIZED_HEIGHT,ASSETCHAINS_SYMBOL[0]==0?"KMD":ASSETCHAINS_SYMBOL,kmdtxid.ToString().c_str(),desttxid.ToString().c_str(),(char *)&scriptbuf[len],len,opretlen); } else if ( i == 0 && j == 1 && opretlen == 149 ) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 894756802..cf3038109 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -126,8 +126,8 @@ const char *Notaries_elected0[][2] = { "xxspot2_XX", "03d85b221ea72ebcd25373e7961f4983d12add66a92f899deaf07bab1d8b6f5573" } }; -#define KOMODO_NOTARIES_TIMESTAMP1 1400000000 -#define KOMODO_NOTARIES_HEIGHT1 ((700000 / KOMODO_ELECTION_GAP) * KOMODO_ELECTION_GAP) +#define KOMODO_NOTARIES_TIMESTAMP1 1530921600 // 7/7/2017 +#define KOMODO_NOTARIES_HEIGHT1 ((900000 / KOMODO_ELECTION_GAP) * KOMODO_ELECTION_GAP) const char *Notaries_elected1[][2] = { From a192131ddc7964225e49ed8331b07bd60b8263d4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 24 Mar 2018 16:46:33 +0200 Subject: [PATCH 0665/1062] Test --- src/komodo_notary.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index cf3038109..6bf447ab8 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -126,7 +126,7 @@ const char *Notaries_elected0[][2] = { "xxspot2_XX", "03d85b221ea72ebcd25373e7961f4983d12add66a92f899deaf07bab1d8b6f5573" } }; -#define KOMODO_NOTARIES_TIMESTAMP1 1530921600 // 7/7/2017 +#define KOMODO_NOTARIES_TIMESTAMP1 1521902703 //1530921600 // 7/7/2017 #define KOMODO_NOTARIES_HEIGHT1 ((900000 / KOMODO_ELECTION_GAP) * KOMODO_ELECTION_GAP) const char *Notaries_elected1[][2] = @@ -207,8 +207,8 @@ int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestam n = (int32_t)(sizeof(Notaries_elected0)/sizeof(*Notaries_elected0)); for (i=0; i Date: Sat, 24 Mar 2018 16:51:57 +0200 Subject: [PATCH 0666/1062] Test --- src/komodo_notary.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 6bf447ab8..db58e0784 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -200,6 +200,8 @@ const char *Notaries_elected1[][2] = int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestamp) { int32_t i,htind,n; uint64_t mask = 0; struct knotary_entry *kp,*tmp; + if ( timestamp == 0 && ASSETCHAINS_SYMBOL[0] != 0 ) + timestamp = komodo_heightstamp(height); if ( height >= KOMODO_NOTARIES_HARDCODED || ASSETCHAINS_SYMBOL[0] != 0 ) { if ( (timestamp != 0 && timestamp < KOMODO_NOTARIES_TIMESTAMP1) || height < KOMODO_NOTARIES_HEIGHT1 ) From f99c2ff39e4c10c1bca5eb117266530097ac8200 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 24 Mar 2018 16:53:48 +0200 Subject: [PATCH 0667/1062] Test --- src/komodo_notary.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index db58e0784..c852224db 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -217,7 +217,7 @@ int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestam n = (int32_t)(sizeof(Notaries_elected1)/sizeof(*Notaries_elected1)); for (i=0; i Date: Sat, 24 Mar 2018 16:55:47 +0200 Subject: [PATCH 0668/1062] Test --- src/komodo_notary.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index c852224db..56f0cc19a 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -126,7 +126,7 @@ const char *Notaries_elected0[][2] = { "xxspot2_XX", "03d85b221ea72ebcd25373e7961f4983d12add66a92f899deaf07bab1d8b6f5573" } }; -#define KOMODO_NOTARIES_TIMESTAMP1 1521902703 //1530921600 // 7/7/2017 +#define KOMODO_NOTARIES_TIMESTAMP1 1530921600 // 7/7/2017 #define KOMODO_NOTARIES_HEIGHT1 ((900000 / KOMODO_ELECTION_GAP) * KOMODO_ELECTION_GAP) const char *Notaries_elected1[][2] = From 1d7748b19055d663d7ba46b2d25be81c681e02f0 Mon Sep 17 00:00:00 2001 From: "Jonathan \"Duke\" Leto" Date: Sat, 24 Mar 2018 08:32:25 -0700 Subject: [PATCH 0669/1062] Port bash completion from ZEC 4d6498b900 --- ...h-completion => komodo-cli.bash-completion | 43 +++++++++++-------- ...sh-completion => komodo-tx.bash-completion | 18 ++++---- ...bash-completion => komodod.bash-completion | 18 ++++---- 3 files changed, 42 insertions(+), 37 deletions(-) rename contrib/bitcoin-cli.bash-completion => komodo-cli.bash-completion (80%) rename contrib/bitcoin-tx.bash-completion => komodo-tx.bash-completion (74%) rename contrib/bitcoind.bash-completion => komodod.bash-completion (77%) diff --git a/contrib/bitcoin-cli.bash-completion b/komodo-cli.bash-completion similarity index 80% rename from contrib/bitcoin-cli.bash-completion rename to komodo-cli.bash-completion index f2a44d232..c1a9930ef 100644 --- a/contrib/bitcoin-cli.bash-completion +++ b/komodo-cli.bash-completion @@ -1,10 +1,10 @@ -# bash programmable completion for bitcoin-cli(1) +# bash programmable completion for komodo-cli(1) # Copyright (c) 2012-2016 The Bitcoin Core developers # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. -# call $bitcoin-cli for RPC -_zcash_rpc() { +# call $komodo-cli for RPC +_komodo_rpc() { # determine already specified args necessary for RPC local rpcargs=() for i in ${COMP_LINE}; do @@ -14,25 +14,25 @@ _zcash_rpc() { ;; esac done - $bitcoin_cli "${rpcargs[@]}" "$@" + $komodo_cli "${rpcargs[@]}" "$@" } # Add wallet accounts to COMPREPLY -_zcash_accounts() { +_komodo_accounts() { local accounts - # Accounts are deprecated in Zcash - #accounts=$(_zcash_rpc listaccounts | awk -F '"' '{ print $2 }') + # Accounts are deprecated in komodo + #accounts=$(_komodo_rpc listaccounts | awk -F '"' '{ print $2 }') accounts="\\\"\\\"" COMPREPLY=( "${COMPREPLY[@]}" $( compgen -W "$accounts" -- "$cur" ) ) } -_zcash_cli() { +_komodo_cli() { local cur prev words=() cword - local bitcoin_cli + local komodo_cli - # save and use original argument to invoke bitcoin-cli for -help, help and RPC - # as bitcoin-cli might not be in $PATH - bitcoin_cli="$1" + # save and use original argument to invoke komodo-cli for -help, help and RPC + # as komodo-cli might not be in $PATH + komodo_cli="$1" COMPREPLY=() _get_comp_words_by_ref -n = cur prev words cword @@ -62,7 +62,7 @@ _zcash_cli() { if ((cword > 3)); then case ${words[cword-3]} in addmultisigaddress) - _zcash_accounts + _komodo_accounts return 0 ;; getbalance|gettxout|importaddress|importpubkey|importprivkey|listreceivedbyaccount|listreceivedbyaddress|listsinceblock) @@ -82,12 +82,17 @@ _zcash_cli() { COMPREPLY=( $( compgen -W "add remove" -- "$cur" ) ) return 0 ;; - fundrawtransaction|getblock|getblockheader|getmempoolancestors|getmempooldescendants|getrawtransaction|gettransaction|listaccounts|listreceivedbyaccount|listreceivedbyaddress|sendrawtransaction|z_importkey) + fundrawtransaction|getblock|getblockheader|getmempoolancestors|getmempooldescendants|getrawtransaction|gettransaction|listaccounts|listreceivedbyaccount|listreceivedbyaddress|sendrawtransaction) COMPREPLY=( $( compgen -W "true false" -- "$cur" ) ) return 0 ;; +# KMD does not have viewing keys, yet +# z_importkey|z_importviewingkey) +# COMPREPLY=( $( compgen -W "yes no whenkeyisnew" -- "$cur" ) ) +# return 0 +# ;; move|setaccount) - _zcash_accounts + _komodo_accounts return 0 ;; esac @@ -103,7 +108,7 @@ _zcash_cli() { return 0 ;; getaccountaddress|getaddressesbyaccount|getbalance|getnewaddress|getreceivedbyaccount|listtransactions|move|sendfrom|sendmany) - _zcash_accounts + _komodo_accounts return 0 ;; esac @@ -127,12 +132,12 @@ _zcash_cli() { # only parse -help if senseful if [[ -z "$cur" || "$cur" =~ ^- ]]; then - helpopts=$($bitcoin_cli -help 2>&1 | awk '$1 ~ /^-/ { sub(/=.*/, "="); print $1 }' ) + helpopts=$($komodo_cli -help 2>&1 | awk '$1 ~ /^-/ { sub(/=.*/, "="); print $1 }' ) fi # only parse help if senseful if [[ -z "$cur" || "$cur" =~ ^[a-z] ]]; then - commands=$(_zcash_rpc help 2>/dev/null | awk '$1 ~ /^[a-z]/ { print $1; }') + commands=$(_komodo_rpc help 2>/dev/null | awk '$1 ~ /^[a-z]/ { print $1; }') fi COMPREPLY=( $( compgen -W "$helpopts $commands" -- "$cur" ) ) @@ -145,7 +150,7 @@ _zcash_cli() { ;; esac } && -complete -F _zcash_cli zcash-cli +complete -F _komodo_cli komodo-cli # Local variables: # mode: shell-script diff --git a/contrib/bitcoin-tx.bash-completion b/komodo-tx.bash-completion similarity index 74% rename from contrib/bitcoin-tx.bash-completion rename to komodo-tx.bash-completion index 0206eba74..69e259381 100644 --- a/contrib/bitcoin-tx.bash-completion +++ b/komodo-tx.bash-completion @@ -1,15 +1,15 @@ -# bash programmable completion for bitcoin-tx(1) +# bash programmable completion for komodo-tx(1) # Copyright (c) 2016 The Bitcoin Core developers # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. -_bitcoin_tx() { +_komodo_tx() { local cur prev words=() cword - local bitcoin_tx + local komodo_tx - # save and use original argument to invoke bitcoin-tx for -help + # save and use original argument to invoke komodo-tx for -help # it might not be in $PATH - bitcoin_tx="$1" + komodo_tx="$1" COMPREPLY=() _get_comp_words_by_ref -n =: cur prev words cword @@ -27,15 +27,15 @@ _bitcoin_tx() { if [[ "$cword" == 1 || ( "$prev" != "-create" && "$prev" == -* ) ]]; then # only options (or an uncompletable hex-string) allowed - # parse bitcoin-tx -help for options + # parse komodo-tx -help for options local helpopts - helpopts=$($bitcoin_tx -help | sed -e '/^ -/ p' -e d ) + helpopts=$($komodo_tx -help | sed -e '/^ -/ p' -e d ) COMPREPLY=( $( compgen -W "$helpopts" -- "$cur" ) ) else # only commands are allowed # parse -help for commands local helpcmds - helpcmds=$($bitcoin_tx -help | sed -e '1,/Commands:/d' -e 's/=.*/=/' -e '/^ [a-z]/ p' -e d ) + helpcmds=$($komodo_tx -help | sed -e '1,/Commands:/d' -e 's/=.*/=/' -e '/^ [a-z]/ p' -e d ) COMPREPLY=( $( compgen -W "$helpcmds" -- "$cur" ) ) fi @@ -46,7 +46,7 @@ _bitcoin_tx() { return 0 } && -complete -F _bitcoin_tx zcash-tx +complete -F _komodo_tx komodo-tx # Local variables: # mode: shell-script diff --git a/contrib/bitcoind.bash-completion b/komodod.bash-completion similarity index 77% rename from contrib/bitcoind.bash-completion rename to komodod.bash-completion index 104365024..4c1ec516f 100644 --- a/contrib/bitcoind.bash-completion +++ b/komodod.bash-completion @@ -1,16 +1,16 @@ -# bash programmable completion for zcashd(1) +# bash programmable completion for komodod(1) # Copyright (c) 2012-2017 The Bitcoin Core developers -# Copyright (c) 2016-2017 The Zcash developers +# Copyright (c) 2016-2017 The komodo developers # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. -_zcashd() { +_komodod() { local cur prev words=() cword - local bitcoind + local komodod - # save and use original argument to invoke zcashd for -help + # save and use original argument to invoke komodod for -help # it might not be in $PATH - bitcoind="$1" + komodod="$1" COMPREPLY=() _get_comp_words_by_ref -n = cur prev words cword @@ -21,7 +21,7 @@ _zcashd() { _filedir return 0 ;; - -datadir=*) + -datadir=*|-exportdir=*) cur="${cur#*=}" _filedir -d return 0 @@ -34,7 +34,7 @@ _zcashd() { # only parse -help if senseful if [[ -z "$cur" || "$cur" =~ ^- ]]; then local helpopts - helpopts=$($bitcoind -help 2>&1 | awk '$1 ~ /^-/ { sub(/=.*/, "="); print $1 }' ) + helpopts=$($komodod -help 2>&1 | awk '$1 ~ /^-/ { sub(/=.*/, "="); print $1 }' ) COMPREPLY=( $( compgen -W "$helpopts" -- "$cur" ) ) fi @@ -46,7 +46,7 @@ _zcashd() { ;; esac } && -complete -F _zcashd zcashd +complete -F _komodod komodod # Local variables: # mode: shell-script From 87020d117aa07813567793fd6bb7ed08da8dba3a Mon Sep 17 00:00:00 2001 From: "Jonathan \"Duke\" Leto" Date: Sat, 24 Mar 2018 08:32:25 -0700 Subject: [PATCH 0670/1062] Port bash completion from ZEC 4d6498b900 --- ...-completion => komodo-cli.bash-completion} | 43 +++++++++++-------- ...h-completion => komodo-tx.bash-completion} | 18 ++++---- ...ash-completion => komodod.bash-completion} | 18 ++++---- 3 files changed, 42 insertions(+), 37 deletions(-) rename contrib/{bitcoin-cli.bash-completion => komodo-cli.bash-completion} (80%) rename contrib/{bitcoin-tx.bash-completion => komodo-tx.bash-completion} (74%) rename contrib/{bitcoind.bash-completion => komodod.bash-completion} (77%) diff --git a/contrib/bitcoin-cli.bash-completion b/contrib/komodo-cli.bash-completion similarity index 80% rename from contrib/bitcoin-cli.bash-completion rename to contrib/komodo-cli.bash-completion index f2a44d232..c1a9930ef 100644 --- a/contrib/bitcoin-cli.bash-completion +++ b/contrib/komodo-cli.bash-completion @@ -1,10 +1,10 @@ -# bash programmable completion for bitcoin-cli(1) +# bash programmable completion for komodo-cli(1) # Copyright (c) 2012-2016 The Bitcoin Core developers # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. -# call $bitcoin-cli for RPC -_zcash_rpc() { +# call $komodo-cli for RPC +_komodo_rpc() { # determine already specified args necessary for RPC local rpcargs=() for i in ${COMP_LINE}; do @@ -14,25 +14,25 @@ _zcash_rpc() { ;; esac done - $bitcoin_cli "${rpcargs[@]}" "$@" + $komodo_cli "${rpcargs[@]}" "$@" } # Add wallet accounts to COMPREPLY -_zcash_accounts() { +_komodo_accounts() { local accounts - # Accounts are deprecated in Zcash - #accounts=$(_zcash_rpc listaccounts | awk -F '"' '{ print $2 }') + # Accounts are deprecated in komodo + #accounts=$(_komodo_rpc listaccounts | awk -F '"' '{ print $2 }') accounts="\\\"\\\"" COMPREPLY=( "${COMPREPLY[@]}" $( compgen -W "$accounts" -- "$cur" ) ) } -_zcash_cli() { +_komodo_cli() { local cur prev words=() cword - local bitcoin_cli + local komodo_cli - # save and use original argument to invoke bitcoin-cli for -help, help and RPC - # as bitcoin-cli might not be in $PATH - bitcoin_cli="$1" + # save and use original argument to invoke komodo-cli for -help, help and RPC + # as komodo-cli might not be in $PATH + komodo_cli="$1" COMPREPLY=() _get_comp_words_by_ref -n = cur prev words cword @@ -62,7 +62,7 @@ _zcash_cli() { if ((cword > 3)); then case ${words[cword-3]} in addmultisigaddress) - _zcash_accounts + _komodo_accounts return 0 ;; getbalance|gettxout|importaddress|importpubkey|importprivkey|listreceivedbyaccount|listreceivedbyaddress|listsinceblock) @@ -82,12 +82,17 @@ _zcash_cli() { COMPREPLY=( $( compgen -W "add remove" -- "$cur" ) ) return 0 ;; - fundrawtransaction|getblock|getblockheader|getmempoolancestors|getmempooldescendants|getrawtransaction|gettransaction|listaccounts|listreceivedbyaccount|listreceivedbyaddress|sendrawtransaction|z_importkey) + fundrawtransaction|getblock|getblockheader|getmempoolancestors|getmempooldescendants|getrawtransaction|gettransaction|listaccounts|listreceivedbyaccount|listreceivedbyaddress|sendrawtransaction) COMPREPLY=( $( compgen -W "true false" -- "$cur" ) ) return 0 ;; +# KMD does not have viewing keys, yet +# z_importkey|z_importviewingkey) +# COMPREPLY=( $( compgen -W "yes no whenkeyisnew" -- "$cur" ) ) +# return 0 +# ;; move|setaccount) - _zcash_accounts + _komodo_accounts return 0 ;; esac @@ -103,7 +108,7 @@ _zcash_cli() { return 0 ;; getaccountaddress|getaddressesbyaccount|getbalance|getnewaddress|getreceivedbyaccount|listtransactions|move|sendfrom|sendmany) - _zcash_accounts + _komodo_accounts return 0 ;; esac @@ -127,12 +132,12 @@ _zcash_cli() { # only parse -help if senseful if [[ -z "$cur" || "$cur" =~ ^- ]]; then - helpopts=$($bitcoin_cli -help 2>&1 | awk '$1 ~ /^-/ { sub(/=.*/, "="); print $1 }' ) + helpopts=$($komodo_cli -help 2>&1 | awk '$1 ~ /^-/ { sub(/=.*/, "="); print $1 }' ) fi # only parse help if senseful if [[ -z "$cur" || "$cur" =~ ^[a-z] ]]; then - commands=$(_zcash_rpc help 2>/dev/null | awk '$1 ~ /^[a-z]/ { print $1; }') + commands=$(_komodo_rpc help 2>/dev/null | awk '$1 ~ /^[a-z]/ { print $1; }') fi COMPREPLY=( $( compgen -W "$helpopts $commands" -- "$cur" ) ) @@ -145,7 +150,7 @@ _zcash_cli() { ;; esac } && -complete -F _zcash_cli zcash-cli +complete -F _komodo_cli komodo-cli # Local variables: # mode: shell-script diff --git a/contrib/bitcoin-tx.bash-completion b/contrib/komodo-tx.bash-completion similarity index 74% rename from contrib/bitcoin-tx.bash-completion rename to contrib/komodo-tx.bash-completion index 0206eba74..69e259381 100644 --- a/contrib/bitcoin-tx.bash-completion +++ b/contrib/komodo-tx.bash-completion @@ -1,15 +1,15 @@ -# bash programmable completion for bitcoin-tx(1) +# bash programmable completion for komodo-tx(1) # Copyright (c) 2016 The Bitcoin Core developers # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. -_bitcoin_tx() { +_komodo_tx() { local cur prev words=() cword - local bitcoin_tx + local komodo_tx - # save and use original argument to invoke bitcoin-tx for -help + # save and use original argument to invoke komodo-tx for -help # it might not be in $PATH - bitcoin_tx="$1" + komodo_tx="$1" COMPREPLY=() _get_comp_words_by_ref -n =: cur prev words cword @@ -27,15 +27,15 @@ _bitcoin_tx() { if [[ "$cword" == 1 || ( "$prev" != "-create" && "$prev" == -* ) ]]; then # only options (or an uncompletable hex-string) allowed - # parse bitcoin-tx -help for options + # parse komodo-tx -help for options local helpopts - helpopts=$($bitcoin_tx -help | sed -e '/^ -/ p' -e d ) + helpopts=$($komodo_tx -help | sed -e '/^ -/ p' -e d ) COMPREPLY=( $( compgen -W "$helpopts" -- "$cur" ) ) else # only commands are allowed # parse -help for commands local helpcmds - helpcmds=$($bitcoin_tx -help | sed -e '1,/Commands:/d' -e 's/=.*/=/' -e '/^ [a-z]/ p' -e d ) + helpcmds=$($komodo_tx -help | sed -e '1,/Commands:/d' -e 's/=.*/=/' -e '/^ [a-z]/ p' -e d ) COMPREPLY=( $( compgen -W "$helpcmds" -- "$cur" ) ) fi @@ -46,7 +46,7 @@ _bitcoin_tx() { return 0 } && -complete -F _bitcoin_tx zcash-tx +complete -F _komodo_tx komodo-tx # Local variables: # mode: shell-script diff --git a/contrib/bitcoind.bash-completion b/contrib/komodod.bash-completion similarity index 77% rename from contrib/bitcoind.bash-completion rename to contrib/komodod.bash-completion index 104365024..4c1ec516f 100644 --- a/contrib/bitcoind.bash-completion +++ b/contrib/komodod.bash-completion @@ -1,16 +1,16 @@ -# bash programmable completion for zcashd(1) +# bash programmable completion for komodod(1) # Copyright (c) 2012-2017 The Bitcoin Core developers -# Copyright (c) 2016-2017 The Zcash developers +# Copyright (c) 2016-2017 The komodo developers # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. -_zcashd() { +_komodod() { local cur prev words=() cword - local bitcoind + local komodod - # save and use original argument to invoke zcashd for -help + # save and use original argument to invoke komodod for -help # it might not be in $PATH - bitcoind="$1" + komodod="$1" COMPREPLY=() _get_comp_words_by_ref -n = cur prev words cword @@ -21,7 +21,7 @@ _zcashd() { _filedir return 0 ;; - -datadir=*) + -datadir=*|-exportdir=*) cur="${cur#*=}" _filedir -d return 0 @@ -34,7 +34,7 @@ _zcashd() { # only parse -help if senseful if [[ -z "$cur" || "$cur" =~ ^- ]]; then local helpopts - helpopts=$($bitcoind -help 2>&1 | awk '$1 ~ /^-/ { sub(/=.*/, "="); print $1 }' ) + helpopts=$($komodod -help 2>&1 | awk '$1 ~ /^-/ { sub(/=.*/, "="); print $1 }' ) COMPREPLY=( $( compgen -W "$helpopts" -- "$cur" ) ) fi @@ -46,7 +46,7 @@ _zcashd() { ;; esac } && -complete -F _zcashd zcashd +complete -F _komodod komodod # Local variables: # mode: shell-script From 2f8ffc3443a755276ca8f04429c290af98ad7308 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 24 Mar 2018 21:17:36 +0200 Subject: [PATCH 0671/1062] Fix typo --- src/assetchains.old | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assetchains.old b/src/assetchains.old index 94c0c8e6e..9839c56e6 100755 --- a/src/assetchains.old +++ b/src/assetchains.old @@ -28,7 +28,7 @@ echo $pubkey ./komodod -pubkey=$pubkey -ac_name=BEER -ac_supply=100000000 -addnode=78.47.196.146 & ./komodod -pubkey=$pubkey -ac_name=PIZZA -ac_supply=100000000 -addnode=78.47.196.146 & ./komodod -pubkey=$pubkey -ac_name=NINJA -ac_supply=100000000 -addnode=78.47.196.146 & -./komodod -pubkey=$pubkey -ac_name=OOT -ac_supply=216000000-addnode=174.138.107.226 & +./komodod -pubkey=$pubkey -ac_name=OOT -ac_supply=216000000 -addnode=174.138.107.226 & #sleep $delay #./komodod -pubkey=$pubkey -ac_name=USD -addnode=78.47.196.146 $1 & From 253b35b2edc5170a959f23e95ea46b7d31876084 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 18:48:39 +0300 Subject: [PATCH 0672/1062] Test --- src/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Makefile.am b/src/Makefile.am index 15169e5bd..8028a6d5e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -465,7 +465,7 @@ komodod_LDADD += \ $(LIBZCASH_LIBS) if ENABLE_PROTON -zcashd_LDADD += $(LIBBITCOIN_PROTON) $(PROTON_LIBS) +komodod_LDADD += $(LIBBITCOIN_PROTON) $(PROTON_LIBS) endif # bitcoin-cli binary # From 93c8c79bde8468ffba00bcdad1389d26f0b9c89d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 19:03:22 +0300 Subject: [PATCH 0673/1062] Test --- Makefile.am | 24 ++++-------------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/Makefile.am b/Makefile.am index b06c8874a..143b2cc68 100644 --- a/Makefile.am +++ b/Makefile.am @@ -12,7 +12,7 @@ pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libzcashconsensus.pc endif -<<<<<<< HEAD + BITCOIND_BIN=$(top_builddir)/src/zcashd$(EXEEXT) BITCOIN_CLI_BIN=$(top_builddir)/src/zcash-cli$(EXEEXT) BITCOIN_WIN_INSTALLER=$(PACKAGE)-$(PACKAGE_VERSION)-win$(WINDOWS_BITS)-setup$(EXEEXT) @@ -28,17 +28,13 @@ OSX_INSTALLER_ICONS=$(top_srcdir)/src/qt/res/icons/bitcoin.icns OSX_PLIST=$(top_srcdir)/share/qt/Info.plist #not installed OSX_QT_TRANSLATIONS = da,de,es,hu,ru,uk,zh_CN,zh_TW endif -======= -BITCOIND_BIN=$(top_builddir)/src/$(BITCOIN_DAEMON_NAME)$(EXEEXT) -BITCOIN_CLI_BIN=$(top_builddir)/src/$(BITCOIN_CLI_NAME)$(EXEEXT) ->>>>>>> zcash/master DIST_DOCS = $(wildcard doc/*.md) $(wildcard doc/release-notes/*.md) BIN_CHECKS=$(top_srcdir)/contrib/devtools/symbol-check.py \ $(top_srcdir)/contrib/devtools/security-check.py -<<<<<<< HEAD + WINDOWS_PACKAGING = $(top_srcdir)/share/pixmaps/bitcoin.ico \ $(top_srcdir)/share/pixmaps/nsis-header.bmp \ $(top_srcdir)/share/pixmaps/nsis-wizard.bmp @@ -59,9 +55,6 @@ COVERAGE_INFO = baseline_filtered_combined.info baseline.info block_test.info \ # zcash-gtest.info zcash-gtest_filtered.info zcash-gtest_coverage.info else COVERAGE_INFO = baseline_filtered_combined.info baseline.info block_test.info \ -======= -COVERAGE_INFO = baseline_filtered_combined.info baseline.info \ ->>>>>>> zcash/master leveldb_baseline.info test_bitcoin_filtered.info total_coverage.info \ baseline_filtered.info \ leveldb_baseline_filtered.info test_bitcoin_coverage.info test_bitcoin.info \ @@ -84,7 +77,6 @@ distcleancheck: $(if $(findstring src/,$(MAKECMDGOALS)),$(MAKECMDGOALS), none): FORCE $(MAKE) -C src $(patsubst src/%,%,$@) -<<<<<<< HEAD if TARGET_DARWIN $(OSX_APP)/Contents/PkgInfo: @@ -157,8 +149,6 @@ if TARGET_WINDOWS deploy: $(BITCOIN_WIN_INSTALLER) endif -======= ->>>>>>> zcash/master $(BITCOIND_BIN): FORCE $(MAKE) -C src $(@F) @@ -260,7 +250,7 @@ test_bitcoin_filtered.info: test_bitcoin.info -o $@ endif -<<<<<<< HEAD + block_test.info: test_bitcoin_filtered.info $(MKDIR_P) qa/tmp -@TIMEOUT=15 qa/pull-tester/run-bitcoind-for-test.sh $(JAVA) -jar $(JAVA_COMPARISON_TOOL) qa/tmp/compTool 0 @@ -294,8 +284,7 @@ block_test_filtered.info: block_test.info -o $@ endif -======= ->>>>>>> zcash/master + test_bitcoin_coverage.info: baseline_filtered_combined.info test_bitcoin_filtered.info $(LCOV) -a baseline_filtered.info -a leveldb_baseline_filtered.info -a test_bitcoin_filtered.info -o $@ @@ -304,7 +293,6 @@ zcash-gtest_coverage.info: baseline_filtered_combined.info zcash-gtest_filtered. $(LCOV) -a baseline_filtered.info -a leveldb_baseline_filtered.info -a zcash-gtest_filtered.info -o $@ endif -<<<<<<< HEAD if BUILD_DARWIN total_coverage.info: baseline_filtered_combined.info test_bitcoin_filtered.info zcash-gtest_filtered.info block_test_filtered.info $(LCOV) -a baseline_filtered.info -a leveldb_baseline_filtered.info -a test_bitcoin_filtered.info -a zcash-gtest_filtered.info -a block_test_filtered.info -o $@ | $(GREP) "\%" | $(AWK) '{ print substr($$3,2,50) "/" $$5 }' > coverage_percent.txt @@ -313,10 +301,6 @@ total_coverage.info: baseline_filtered_combined.info test_bitcoin_filtered.info $(LCOV) -a baseline_filtered.info -a leveldb_baseline_filtered.info -a test_bitcoin_filtered.info -a zcash-gtest_filtered.info -a block_test_filtered.info -o $@ | $(GREP) "\%" | $(AWK) '{ print substr($$3,2,50) "/" $$5 }' > coverage_percent.txt endif -======= -total_coverage.info: baseline_filtered_combined.info test_bitcoin_filtered.info zcash-gtest_filtered.info - $(LCOV) -a baseline_filtered.info -a leveldb_baseline_filtered.info -a test_bitcoin_filtered.info -a zcash-gtest_filtered.info -o $@ | $(GREP) "\%" | $(AWK) '{ print substr($$3,2,50) "/" $$5 }' > coverage_percent.txt ->>>>>>> zcash/master test_bitcoin.coverage/.dirstamp: test_bitcoin_coverage.info $(GENHTML) -s $< -o $(@D) From 9f2994ad233860aefcbd9b5eb9a5240c0c9d165b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 19:05:37 +0300 Subject: [PATCH 0674/1062] Test --- configure.ac | 7 ------- 1 file changed, 7 deletions(-) diff --git a/configure.ac b/configure.ac index 8ce20a971..276c603a7 100644 --- a/configure.ac +++ b/configure.ac @@ -507,13 +507,9 @@ if test x$use_hardening != xno; then if test x$TARGET_OS != xwindows; then # All windows code is PIC, forcing it on just adds useless compile warnings -<<<<<<< HEAD AX_CHECK_LINK_FLAG([[-Wl,-z,relro]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,relro"],[AC_MSG_ERROR(Cannot enable RELRO)]) AX_CHECK_LINK_FLAG([[-Wl,-z,now]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,now"],[AC_MSG_ERROR(Cannot enable BIND_NOW)]) AX_CHECK_COMPILE_FLAG([-fPIE],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -fPIE"],[AC_MSG_ERROR(Cannot enable -fPIE)]) -======= - AX_CHECK_COMPILE_FLAG([-fPIE],[PIE_FLAGS="-fPIE"],[AC_MSG_ERROR(Cannot enable -fPIE)]) ->>>>>>> zcash/master AX_CHECK_LINK_FLAG([[-pie]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -pie"],[AC_MSG_ERROR(Cannot enable -pie)]) else # These are only available on Windows. @@ -755,7 +751,6 @@ fi #AC_CHECK_HEADER([gmpxx.h],,AC_MSG_ERROR(libgmpxx headers missing)) #AC_CHECK_LIB([gmpxx],[main],GMPXX_LIBS=-lgmpxx, [AC_MSG_ERROR(libgmpxx missing)]) -<<<<<<< HEAD # libsnark header layout is broken unless cpp's -I is passed with the # libsnark directory, so for now we use this hideous workaround: echo 'Hunting for libsnark include directory...' @@ -776,8 +771,6 @@ fi #AC_CHECK_HEADER([libsnark/gadgetlib1/gadget.hpp],,AC_MSG_ERROR(libsnark headers missing)) #AC_CHECK_LIB([snark],[main],LIBSNARK_LIBS=-lsnark, [AC_MSG_ERROR(libsnark missing)], [-lgmpxx]) -======= ->>>>>>> zcash/master RUST_LIBS="" if test x$enable_rust != xno; then RUST_LIBS="-lrustzcash" From b49b22afd073906d86373b281b1cf07441ed5f2a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 19:08:42 +0300 Subject: [PATCH 0675/1062] Test --- depends/Makefile | 4 ---- depends/funcs.mk | 4 ---- 2 files changed, 8 deletions(-) diff --git a/depends/Makefile b/depends/Makefile index 1c17e08c9..472d87885 100644 --- a/depends/Makefile +++ b/depends/Makefile @@ -4,12 +4,8 @@ SOURCES_PATH ?= $(BASEDIR)/sources BASE_CACHE ?= $(BASEDIR)/built SDK_PATH ?= $(BASEDIR)/SDKs NO_WALLET ?= -<<<<<<< HEAD NO_UPNP ?= FALLBACK_DOWNLOAD_PATH ?= https://supernet/depends-sources -======= -PRIORITY_DOWNLOAD_PATH ?= https://z.cash/depends-sources ->>>>>>> zcash/master BUILD ?= $(shell ./config.guess) HOST ?= $(BUILD) diff --git a/depends/funcs.mk b/depends/funcs.mk index 636ce9f42..df305a74a 100644 --- a/depends/funcs.mk +++ b/depends/funcs.mk @@ -22,12 +22,8 @@ endef define fetch_file (test -f $$($(1)_source_dir)/$(4) || \ ( mkdir -p $$($(1)_download_dir) && echo Fetching $(1)... && \ -<<<<<<< HEAD - ( $(build_DOWNLOAD) "$$($(1)_download_dir)/$(4).temp" "$(2)/$(3)" ) && \ -======= ( $(build_DOWNLOAD) "$$($(1)_download_dir)/$(4).temp" "$(PRIORITY_DOWNLOAD_PATH)/$(4)" || \ $(build_DOWNLOAD) "$$($(1)_download_dir)/$(4).temp" "$(2)/$(3)" ) && \ ->>>>>>> zcash/master echo "$(5) $$($(1)_download_dir)/$(4).temp" > $$($(1)_download_dir)/.$(4).hash && \ $(build_SHA256SUM) -c $$($(1)_download_dir)/.$(4).hash && \ mv $$($(1)_download_dir)/$(4).temp $$($(1)_source_dir)/$(4) && \ From 995fee09af6d45f43464796a818c9cd183d94624 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 19:14:36 +0300 Subject: [PATCH 0676/1062] Test --- depends/packages/googletest.mk | 5 ----- depends/packages/libsodium.mk | 14 +++++++------- depends/packages/packages.mk | 10 ++-------- depends/packages/rust.mk | 26 +++++++++++++------------- 4 files changed, 22 insertions(+), 33 deletions(-) diff --git a/depends/packages/googletest.mk b/depends/packages/googletest.mk index 7a8d6e997..b9fa3e7e8 100644 --- a/depends/packages/googletest.mk +++ b/depends/packages/googletest.mk @@ -25,14 +25,9 @@ endef endif define $(package)_stage_cmds -<<<<<<< HEAD - $($(package)_install) -D ./make/gtest.a $($(package)_staging_dir)$(host_prefix)/lib/libgtest.a && \ - cp -a ./include $($(package)_staging_dir)$(host_prefix)/include -======= mkdir -p $($(package)_staging_dir)$(host_prefix)/lib && \ install ./googlemock/make/gmock.a $($(package)_staging_dir)$(host_prefix)/lib/libgmock.a && \ install ./googletest/make/gtest.a $($(package)_staging_dir)$(host_prefix)/lib/libgtest.a && \ cp -a ./googlemock/include $($(package)_staging_dir)$(host_prefix)/ && \ cp -a ./googletest/include $($(package)_staging_dir)$(host_prefix)/ ->>>>>>> zcash/master endef diff --git a/depends/packages/libsodium.mk b/depends/packages/libsodium.mk index 65731abb9..91e6f27b7 100644 --- a/depends/packages/libsodium.mk +++ b/depends/packages/libsodium.mk @@ -1,15 +1,15 @@ package=libsodium -<<<<<<< HEAD -$(package)_version=1.0.11 -$(package)_download_path=https://supernetorg.bintray.com/misc -$(package)_file_name=libsodium-1.0.11.tar.gz -$(package)_sha256_hash=a14549db3c49f6ae2170cbbf4664bd48ace50681045e8dbea7c8d9fb96f9c765 -======= +#<<<<<<< HEAD +#$(package)_version=1.0.11 +#$(package)_download_path=https://supernetorg.bintray.com/misc +#$(package)_file_name=libsodium-1.0.11.tar.gz +#$(package)_sha256_hash=a14549db3c49f6ae2170cbbf4664bd48ace50681045e8dbea7c8d9fb96f9c765 +#======= $(package)_version=1.0.15 $(package)_download_path=https://download.libsodium.org/libsodium/releases/ $(package)_file_name=$(package)-$($(package)_version).tar.gz $(package)_sha256_hash=fb6a9e879a2f674592e4328c5d9f79f082405ee4bb05cb6e679b90afe9e178f4 ->>>>>>> zcash/master +#>>>>>>> zcash/master $(package)_dependencies= $(package)_config_opts= diff --git a/depends/packages/packages.mk b/depends/packages/packages.mk index d7e17eebc..199c69d0c 100644 --- a/depends/packages/packages.mk +++ b/depends/packages/packages.mk @@ -1,19 +1,13 @@ rust_packages := rust librustzcash -<<<<<<< HEAD -zcash_packages := libsnark libgmp libsodium +proton_packages := proton +zcash_packages := libgmp libsodium ifeq ($(host_os),linux) packages := boost openssl libevent zeromq $(zcash_packages) googletest googlemock else packages := boost openssl libevent zeromq $(zcash_packages) googletest googlemock libcurl endif - -======= -proton_packages := proton -zcash_packages := libgmp libsodium -packages := boost openssl libevent zeromq $(zcash_packages) googletest ->>>>>>> zcash/master native_packages := native_ccache wallet_packages=bdb diff --git a/depends/packages/rust.mk b/depends/packages/rust.mk index a479a91c1..eb28c76d1 100644 --- a/depends/packages/rust.mk +++ b/depends/packages/rust.mk @@ -1,23 +1,23 @@ package=rust $(package)_version=1.16.0 $(package)_download_path=https://static.rust-lang.org/dist -<<<<<<< HEAD -ifeq ($(build_os),darwin) -$(package)_file_name=rust-$($(package)_version)-x86_64-apple-darwin.tar.gz -$(package)_sha256_hash=2d08259ee038d3a2c77a93f1a31fc59e7a1d6d1bbfcba3dba3c8213b2e5d1926 -else ifeq ($(host_os),mingw32) -$(package)_file_name=rust-$($(package)_version)-i686-unknown-linux-gnu.tar.gz -$(package)_sha256_hash=b5859161ebb182d3b75fa14a5741e5de87b088146fb0ef4a30f3b2439c6179c5 -else -$(package)_file_name=rust-$($(package)_version)-x86_64-unknown-linux-gnu.tar.gz -$(package)_sha256_hash=48621912c242753ba37cad5145df375eeba41c81079df46f93ffb4896542e8fd -endif -======= +#<<<<<<< HEAD +#ifeq ($(build_os),darwin) +#$(package)_file_name=rust-$($(package)_version)-x86_64-apple-darwin.tar.gz +#$(package)_sha256_hash=2d08259ee038d3a2c77a93f1a31fc59e7a1d6d1bbfcba3dba3c8213b2e5d1926 +#else ifeq ($(host_os),mingw32) +#$(package)_file_name=rust-$($(package)_version)-i686-unknown-linux-gnu.tar.gz +#$(package)_sha256_hash=b5859161ebb182d3b75fa14a5741e5de87b088146fb0ef4a30f3b2439c6179c5 +#else +#$(package)_file_name=rust-$($(package)_version)-x86_64-unknown-linux-gnu.tar.gz +#$(package)_sha256_hash=48621912c242753ba37cad5145df375eeba41c81079df46f93ffb4896542e8fd +#endif +#======= $(package)_file_name_linux=rust-$($(package)_version)-x86_64-unknown-linux-gnu.tar.gz $(package)_sha256_hash_linux=48621912c242753ba37cad5145df375eeba41c81079df46f93ffb4896542e8fd $(package)_file_name_darwin=rust-$($(package)_version)-x86_64-apple-darwin.tar.gz $(package)_sha256_hash_darwin=2d08259ee038d3a2c77a93f1a31fc59e7a1d6d1bbfcba3dba3c8213b2e5d1926 ->>>>>>> zcash/master +#>>>>>>> zcash/master define $(package)_stage_cmds ./install.sh --destdir=$($(package)_staging_dir) --prefix=$(host_prefix)/native --disable-ldconfig From b380fd632161da6e750e31ca1e5aee17d918adb2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 19:27:12 +0300 Subject: [PATCH 0677/1062] Test --- depends/packages/packages.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/depends/packages/packages.mk b/depends/packages/packages.mk index 199c69d0c..8475ec7d5 100644 --- a/depends/packages/packages.mk +++ b/depends/packages/packages.mk @@ -3,9 +3,9 @@ rust_packages := rust librustzcash proton_packages := proton zcash_packages := libgmp libsodium ifeq ($(host_os),linux) - packages := boost openssl libevent zeromq $(zcash_packages) googletest googlemock + packages := boost openssl libevent zeromq $(zcash_packages) #googletest googlemock else - packages := boost openssl libevent zeromq $(zcash_packages) googletest googlemock libcurl + packages := boost openssl libevent zeromq $(zcash_packages) libcurl # googletest googlemock libcurl endif native_packages := native_ccache From 753997b6de6845d77a416e664ab7b5f668fb4919 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 19:34:35 +0300 Subject: [PATCH 0678/1062] Test --- zcutil/build.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/zcutil/build.sh b/zcutil/build.sh index bd0fa42a3..d40aa47a2 100755 --- a/zcutil/build.sh +++ b/zcutil/build.sh @@ -137,9 +137,9 @@ ld -v HOST="$HOST" BUILD="$BUILD" NO_RUST="$RUST_ARG" NO_PROTON="$PROTON_ARG" "$MAKE" "$@" -C ./depends/ V=1 ./autogen.sh -<<<<<<< HEAD -CC="$CC" CXX="$CXX" ./configure --prefix="${PREFIX}" --host="$HOST" --build="$BUILD" "$RUST_ARG" "$HARDENING_ARG" "$LCOV_ARG" "$TEST_ARG" "$MINING_ARG" CXXFLAGS='-fwrapv -fno-strict-aliasing -g' -======= +#<<<<<<< HEAD +#CC="$CC" CXX="$CXX" ./configure --prefix="${PREFIX}" --host="$HOST" --build="$BUILD" "$RUST_ARG" "$HARDENING_ARG" "$LCOV_ARG" "$TEST_ARG" "$MINING_ARG" CXXFLAGS='-fwrapv -fno-strict-aliasing -g' +#======= CC="$CC" CXX="$CXX" ./configure --prefix="${PREFIX}" --host="$HOST" --build="$BUILD" "$RUST_ARG" "$HARDENING_ARG" "$LCOV_ARG" "$TEST_ARG" "$MINING_ARG" "$PROTON_ARG" "$LIBS_ARG" $CONFIGURE_FLAGS --enable-werror CXXFLAGS='-g' ->>>>>>> zcash/master +#>>>>>>> zcash/master "$MAKE" "$@" V=1 From e9fac08611f63878e7d8f4abfef1b5b8c8e37bae Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 19:48:21 +0300 Subject: [PATCH 0679/1062] Test --- depends/builders/darwin.mk | 12 ++++++------ depends/hosts/darwin.mk | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/depends/builders/darwin.mk b/depends/builders/darwin.mk index a8eaf9675..b986aecec 100644 --- a/depends/builders/darwin.mk +++ b/depends/builders/darwin.mk @@ -7,19 +7,19 @@ build_darwin_OTOOL: = $(shell xcrun -f otool) build_darwin_NM: = $(shell xcrun -f nm) build_darwin_INSTALL_NAME_TOOL:=$(shell xcrun -f install_name_tool) build_darwin_SHA256SUM = shasum -a 256 -<<<<<<< HEAD -build_darwin_DOWNLOAD = curl --connect-timeout $(DOWNLOAD_CONNECT_TIMEOUT) --retry $(DOWNLOAD_RETRIES) -L -f -o +#<<<<<<< HEAD +##build_darwin_DOWNLOAD = curl --connect-timeout $(DOWNLOAD_CONNECT_TIMEOUT) --retry $(DOWNLOAD_RETRIES) -L -f -o #darwin host on darwin builder. overrides darwin host preferences. -darwin_CC= gcc-5 -darwin_CXX= g++-5 -======= +#darwin_CC= gcc-5 +#darwin_CXX= g++-5 +#======= build_darwin_DOWNLOAD = curl --location --fail --connect-timeout $(DOWNLOAD_CONNECT_TIMEOUT) --retry $(DOWNLOAD_RETRIES) -o #darwin host on darwin builder. overrides darwin host preferences. darwin_CC=$(shell xcrun -f clang) -mmacosx-version-min=$(OSX_MIN_VERSION) darwin_CXX:=$(shell xcrun -f clang++) -mmacosx-version-min=$(OSX_MIN_VERSION) -stdlib=libc++ ->>>>>>> zcash/master +#>>>>>>> zcash/master darwin_AR:=$(shell xcrun -f ar) darwin_RANLIB:=$(shell xcrun -f ranlib) darwin_STRIP:=$(shell xcrun -f strip) diff --git a/depends/hosts/darwin.mk b/depends/hosts/darwin.mk index 1294051fa..4f1748657 100644 --- a/depends/hosts/darwin.mk +++ b/depends/hosts/darwin.mk @@ -1,15 +1,15 @@ OSX_MIN_VERSION=10.8 OSX_SDK_VERSION=10.11 OSX_SDK=$(SDK_PATH)/MacOSX$(OSX_SDK_VERSION).sdk -<<<<<<< HEAD -LD64_VERSION=241.9 -darwin_CC=gcc-5 -target $(host) -mmacosx-version-min=$(OSX_MIN_VERSION) --sysroot $(OSX_SDK) -mlinker-version=$(LD64_VERSION) -darwin_CXX=g++-5 -target $(host) -mmacosx-version-min=$(OSX_MIN_VERSION) --sysroot $(OSX_SDK) -mlinker-version=$(LD64_VERSION) -======= +#<<<<<<< HEAD +#LD64_VERSION=241.9 +#darwin_CC=gcc-5 -target $(host) -mmacosx-version-min=$(OSX_MIN_VERSION) --sysroot $(OSX_SDK) -mlinker-version=$(LD64_VERSION) +#darwin_CXX=g++-5 -target $(host) -mmacosx-version-min=$(OSX_MIN_VERSION) --sysroot $(OSX_SDK) -mlinker-version=$(LD64_VERSION) +#======= LD64_VERSION=253.9 darwin_CC=clang -target $(host) -mmacosx-version-min=$(OSX_MIN_VERSION) --sysroot $(OSX_SDK) -mlinker-version=$(LD64_VERSION) darwin_CXX=clang++ -target $(host) -mmacosx-version-min=$(OSX_MIN_VERSION) --sysroot $(OSX_SDK) -mlinker-version=$(LD64_VERSION) -stdlib=libc++ ->>>>>>> zcash/master +#>>>>>>> zcash/master darwin_CFLAGS=-pipe darwin_CXXFLAGS=$(darwin_CFLAGS) From 39b00d05947b6cc361d512b77c5c5daebb8183b9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 19:51:08 +0300 Subject: [PATCH 0680/1062] Test --- configure.ac | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 276c603a7..c3eca0717 100644 --- a/configure.ac +++ b/configure.ac @@ -758,7 +758,8 @@ echo 'Hunting for libsnark include directory...' if test -d "$LIBSNARK_INCDIR"; then echo "Found libsnark include directory: $LIBSNARK_INCDIR" else - AC_MSG_ERROR(libsnark include directory not found) +#AC_MSG_ERROR(libsnark include directory not found) +echo "libsnark include directory not found" fi CPPFLAGS="-I$LIBSNARK_INCDIR $CPPFLAGS" From 2cfe782d699a3d0184ae7a7b419796cbb691e8c2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 19:57:34 +0300 Subject: [PATCH 0681/1062] Test --- src/chainparams.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chainparams.h b/src/chainparams.h index 31711ea6e..959321125 100644 --- a/src/chainparams.h +++ b/src/chainparams.h @@ -93,7 +93,7 @@ public: void SetRegTestCoinbaseMustBeProtected() { consensus.fCoinbaseMustBeProtected = true; } void SetDefaultPort(uint16_t port) { nDefaultPort = port; } - void SetCheckpointData(Checkpoints::CCheckpointData checkpointData); + void SetCheckpointData(CCheckpointData checkpointData); //void setnonce(uint32_t nonce) { memcpy(&genesis.nNonce,&nonce,sizeof(nonce)); } //void settimestamp(uint32_t timestamp) { genesis.nTime = timestamp; } From 9ab007f8494f39e98e80937f2baf8510366d542f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 19:58:04 +0300 Subject: [PATCH 0682/1062] Test --- src/chainparams.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/chainparams.h b/src/chainparams.h index 959321125..6940ed1b1 100644 --- a/src/chainparams.h +++ b/src/chainparams.h @@ -109,7 +109,6 @@ protected: //! Raw pub key bytes for the broadcast alert signing key. std::vector vAlertPubKey; int nMinerThreads = 0; - int nDefaultPort = 0; long nMaxTipAge = 0; uint64_t nPruneAfterHeight = 0; unsigned int nEquihashN = 0; From aef60c21e88cc4cdb27a44b13ad2f31f3c5197bc Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 20:05:02 +0300 Subject: [PATCH 0683/1062] Test --- src/chainparams.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/chainparams.h b/src/chainparams.h index 6940ed1b1..ccb7917c3 100644 --- a/src/chainparams.h +++ b/src/chainparams.h @@ -27,12 +27,6 @@ struct SeedSpec6 { typedef std::map MapCheckpoints; -struct CCheckpointData { - MapCheckpoints mapCheckpoints; - int64_t nTimeLastCheckpoint; - int64_t nTransactionsLastCheckpoint; - double fTransactionsPerDay; -}; /** * CChainParams defines various tweakable parameters of a given instance of the @@ -57,6 +51,12 @@ public: MAX_BASE58_TYPES }; + struct CCheckpointData { + MapCheckpoints mapCheckpoints; + int64_t nTimeLastCheckpoint; + int64_t nTransactionsLastCheckpoint; + double fTransactionsPerDay; + }; const Consensus::Params& GetConsensus() const { return consensus; } const CMessageHeader::MessageStartChars& MessageStart() const { return pchMessageStart; } @@ -93,7 +93,7 @@ public: void SetRegTestCoinbaseMustBeProtected() { consensus.fCoinbaseMustBeProtected = true; } void SetDefaultPort(uint16_t port) { nDefaultPort = port; } - void SetCheckpointData(CCheckpointData checkpointData); + void SetCheckpointData(Checkpoints::CCheckpointData checkpointData); //void setnonce(uint32_t nonce) { memcpy(&genesis.nNonce,&nonce,sizeof(nonce)); } //void settimestamp(uint32_t timestamp) { genesis.nTime = timestamp; } From 41be81695d8cb8bd8c77fc7595fda1c7893cd4f3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 20:07:57 +0300 Subject: [PATCH 0684/1062] Test --- src/chainparams.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chainparams.h b/src/chainparams.h index ccb7917c3..2041b2209 100644 --- a/src/chainparams.h +++ b/src/chainparams.h @@ -93,7 +93,7 @@ public: void SetRegTestCoinbaseMustBeProtected() { consensus.fCoinbaseMustBeProtected = true; } void SetDefaultPort(uint16_t port) { nDefaultPort = port; } - void SetCheckpointData(Checkpoints::CCheckpointData checkpointData); + void SetCheckpointData(CCheckpointData checkpointData); //void setnonce(uint32_t nonce) { memcpy(&genesis.nNonce,&nonce,sizeof(nonce)); } //void settimestamp(uint32_t timestamp) { genesis.nTime = timestamp; } From 60afdb8bbd1ef0ff1bc38981852ffddfbc1e95a4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 20:12:21 +0300 Subject: [PATCH 0685/1062] Test --- src/chainparams.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/chainparams.h b/src/chainparams.h index 2041b2209..079467e7b 100644 --- a/src/chainparams.h +++ b/src/chainparams.h @@ -27,6 +27,12 @@ struct SeedSpec6 { typedef std::map MapCheckpoints; +/*struct CCheckpointData { + MapCheckpoints mapCheckpoints; + int64_t nTimeLastCheckpoint; + int64_t nTransactionsLastCheckpoint; + double fTransactionsPerDay; +};*/ /** * CChainParams defines various tweakable parameters of a given instance of the @@ -51,12 +57,6 @@ public: MAX_BASE58_TYPES }; - struct CCheckpointData { - MapCheckpoints mapCheckpoints; - int64_t nTimeLastCheckpoint; - int64_t nTransactionsLastCheckpoint; - double fTransactionsPerDay; - }; const Consensus::Params& GetConsensus() const { return consensus; } const CMessageHeader::MessageStartChars& MessageStart() const { return pchMessageStart; } @@ -93,7 +93,7 @@ public: void SetRegTestCoinbaseMustBeProtected() { consensus.fCoinbaseMustBeProtected = true; } void SetDefaultPort(uint16_t port) { nDefaultPort = port; } - void SetCheckpointData(CCheckpointData checkpointData); + void SetCheckpointData(Checkpoints::CCheckpointData checkpointData); //void setnonce(uint32_t nonce) { memcpy(&genesis.nNonce,&nonce,sizeof(nonce)); } //void settimestamp(uint32_t timestamp) { genesis.nTime = timestamp; } From 6c09a9538094857cd0120744e1aba2c739c84fe6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 20:17:53 +0300 Subject: [PATCH 0686/1062] Test --- src/chainparams.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chainparams.h b/src/chainparams.h index 079467e7b..553187d29 100644 --- a/src/chainparams.h +++ b/src/chainparams.h @@ -84,7 +84,7 @@ public: const std::vector& DNSSeeds() const { return vSeeds; } const std::vector& Base58Prefix(Base58Type type) const { return base58Prefixes[type]; } const std::vector& FixedSeeds() const { return vFixedSeeds; } - const CCheckpointData& Checkpoints() const { return checkpointData; } + const Checkpoints::CCheckpointData& Checkpoints() const { return checkpointData; } /** Return the founder's reward address and script for a given block height */ std::string GetFoundersRewardAddressAtHeight(int height) const; CScript GetFoundersRewardScriptAtHeight(int height) const; From d0fcb6bcc7c52f1897fb32c21d9a8a8f8f135d6f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 20:19:42 +0300 Subject: [PATCH 0687/1062] Test --- src/chainparams.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/chainparams.h b/src/chainparams.h index 553187d29..f15d6625e 100644 --- a/src/chainparams.h +++ b/src/chainparams.h @@ -27,12 +27,12 @@ struct SeedSpec6 { typedef std::map MapCheckpoints; -/*struct CCheckpointData { +struct CCheckpointData { MapCheckpoints mapCheckpoints; int64_t nTimeLastCheckpoint; int64_t nTransactionsLastCheckpoint; double fTransactionsPerDay; -};*/ +}; /** * CChainParams defines various tweakable parameters of a given instance of the From c08d6c56a6c24f6dd7b2b7d698489d110f7e52f0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 20:21:46 +0300 Subject: [PATCH 0688/1062] Test --- src/chainparams.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/chainparams.h b/src/chainparams.h index f15d6625e..d4b8c74fc 100644 --- a/src/chainparams.h +++ b/src/chainparams.h @@ -10,6 +10,7 @@ #include "consensus/params.h" #include "primitives/block.h" #include "protocol.h" +#include "checkpoints.h" #define KOMODO_MINDIFF_NBITS 0x200f0f0f From f4feb5043eb3f37a4702b709c7d572c1c269dd8b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 20:22:59 +0300 Subject: [PATCH 0689/1062] Test --- src/chainparams.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chainparams.h b/src/chainparams.h index d4b8c74fc..017309a76 100644 --- a/src/chainparams.h +++ b/src/chainparams.h @@ -85,7 +85,7 @@ public: const std::vector& DNSSeeds() const { return vSeeds; } const std::vector& Base58Prefix(Base58Type type) const { return base58Prefixes[type]; } const std::vector& FixedSeeds() const { return vFixedSeeds; } - const Checkpoints::CCheckpointData& Checkpoints() const { return checkpointData; } + const CCheckpointData& Checkpoints() const { return checkpointData; } /** Return the founder's reward address and script for a given block height */ std::string GetFoundersRewardAddressAtHeight(int height) const; CScript GetFoundersRewardScriptAtHeight(int height) const; From 499a7537c1d6e8479d4d02d1f6db77930deecbe5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 20:31:32 +0300 Subject: [PATCH 0690/1062] Test --- src/chainparams.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/chainparams.h b/src/chainparams.h index 017309a76..9c17931b0 100644 --- a/src/chainparams.h +++ b/src/chainparams.h @@ -10,7 +10,6 @@ #include "consensus/params.h" #include "primitives/block.h" #include "protocol.h" -#include "checkpoints.h" #define KOMODO_MINDIFF_NBITS 0x200f0f0f From fe67b7ef430ab431528391dd575fdfb4adb8ebe2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 20:32:35 +0300 Subject: [PATCH 0691/1062] Test --- src/chainparams.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chainparams.h b/src/chainparams.h index 9c17931b0..6940ed1b1 100644 --- a/src/chainparams.h +++ b/src/chainparams.h @@ -93,7 +93,7 @@ public: void SetRegTestCoinbaseMustBeProtected() { consensus.fCoinbaseMustBeProtected = true; } void SetDefaultPort(uint16_t port) { nDefaultPort = port; } - void SetCheckpointData(Checkpoints::CCheckpointData checkpointData); + void SetCheckpointData(CCheckpointData checkpointData); //void setnonce(uint32_t nonce) { memcpy(&genesis.nNonce,&nonce,sizeof(nonce)); } //void settimestamp(uint32_t timestamp) { genesis.nTime = timestamp; } From 4ffda01dbd51e97a644746c1d8f8d45539e49a01 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 20:35:01 +0300 Subject: [PATCH 0692/1062] Test --- src/checkpoints.h | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/checkpoints.h b/src/checkpoints.h index 49aaa66d5..3e2cebf98 100644 --- a/src/checkpoints.h +++ b/src/checkpoints.h @@ -12,6 +12,13 @@ class CBlockIndex; struct CCheckpointData; +struct CCheckpointData { + MapCheckpoints mapCheckpoints; + int64_t nTimeLastCheckpoint; + int64_t nTransactionsLastCheckpoint; + double fTransactionsPerDay; +}; + /** * Block-chain checkpoints are compiled-in sanity checks. * They are updated every release or three. @@ -21,12 +28,6 @@ namespace Checkpoints typedef std::map MapCheckpoints; -struct CCheckpointData { - MapCheckpoints mapCheckpoints; - int64_t nTimeLastCheckpoint; - int64_t nTransactionsLastCheckpoint; - double fTransactionsPerDay; -}; bool CheckBlock(const CCheckpointData& data, int nHeight, const uint256& hash); From c0d53a6eb6cdc034538d216707a6075d0641b6f9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 20:36:24 +0300 Subject: [PATCH 0693/1062] Test --- src/chainparams.h | 12 ++++++------ src/checkpoints.h | 13 ++++++------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/chainparams.h b/src/chainparams.h index 6940ed1b1..2041b2209 100644 --- a/src/chainparams.h +++ b/src/chainparams.h @@ -27,12 +27,6 @@ struct SeedSpec6 { typedef std::map MapCheckpoints; -struct CCheckpointData { - MapCheckpoints mapCheckpoints; - int64_t nTimeLastCheckpoint; - int64_t nTransactionsLastCheckpoint; - double fTransactionsPerDay; -}; /** * CChainParams defines various tweakable parameters of a given instance of the @@ -57,6 +51,12 @@ public: MAX_BASE58_TYPES }; + struct CCheckpointData { + MapCheckpoints mapCheckpoints; + int64_t nTimeLastCheckpoint; + int64_t nTransactionsLastCheckpoint; + double fTransactionsPerDay; + }; const Consensus::Params& GetConsensus() const { return consensus; } const CMessageHeader::MessageStartChars& MessageStart() const { return pchMessageStart; } diff --git a/src/checkpoints.h b/src/checkpoints.h index 3e2cebf98..49aaa66d5 100644 --- a/src/checkpoints.h +++ b/src/checkpoints.h @@ -12,13 +12,6 @@ class CBlockIndex; struct CCheckpointData; -struct CCheckpointData { - MapCheckpoints mapCheckpoints; - int64_t nTimeLastCheckpoint; - int64_t nTransactionsLastCheckpoint; - double fTransactionsPerDay; -}; - /** * Block-chain checkpoints are compiled-in sanity checks. * They are updated every release or three. @@ -28,6 +21,12 @@ namespace Checkpoints typedef std::map MapCheckpoints; +struct CCheckpointData { + MapCheckpoints mapCheckpoints; + int64_t nTimeLastCheckpoint; + int64_t nTransactionsLastCheckpoint; + double fTransactionsPerDay; +}; bool CheckBlock(const CCheckpointData& data, int nHeight, const uint256& hash); From a2dd1d4301ec5b046f684e46715aa272c23594d7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 20:39:58 +0300 Subject: [PATCH 0694/1062] Test --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index c3eca0717..399d5480b 100644 --- a/configure.ac +++ b/configure.ac @@ -759,7 +759,7 @@ if test -d "$LIBSNARK_INCDIR"; then echo "Found libsnark include directory: $LIBSNARK_INCDIR" else #AC_MSG_ERROR(libsnark include directory not found) -echo "libsnark include directory not found" +echo "libsnark include directory not found $LIBSNARK_INCDIR" fi CPPFLAGS="-I$LIBSNARK_INCDIR $CPPFLAGS" From 08211cf05d4ea05694ecac67d18bb4e490536544 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 20:41:58 +0300 Subject: [PATCH 0695/1062] Test --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 399d5480b..a191d35be 100644 --- a/configure.ac +++ b/configure.ac @@ -759,7 +759,7 @@ if test -d "$LIBSNARK_INCDIR"; then echo "Found libsnark include directory: $LIBSNARK_INCDIR" else #AC_MSG_ERROR(libsnark include directory not found) -echo "libsnark include directory not found $LIBSNARK_INCDIR" +echo "libsnark include directory not found ($LIBSNARK_INCDIR)" fi CPPFLAGS="-I$LIBSNARK_INCDIR $CPPFLAGS" From efd0823e78817c231ba45f310f68cf93e138eb2d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 20:54:00 +0300 Subject: [PATCH 0696/1062] Test --- src/checkpoints.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/checkpoints.h b/src/checkpoints.h index 49aaa66d5..215e65c3a 100644 --- a/src/checkpoints.h +++ b/src/checkpoints.h @@ -31,10 +31,10 @@ struct CCheckpointData { //! Return conservative estimate of total number of blocks, 0 if unknown -int GetTotalBlocksEstimate(const CCheckpointData& data); + int GetTotalBlocksEstimate(const CChainParams::CCheckpointData& data); //! Returns last CBlockIndex* in mapBlockIndex that is a checkpoint -CBlockIndex* GetLastCheckpoint(const CCheckpointData& data); + CBlockIndex* GetLastCheckpoint(const CChainParams::CCheckpointData& data); double GuessVerificationProgress(const CCheckpointData& data, CBlockIndex* pindex, bool fSigchecks = true); From 366c88dcd14a37880c6ed1c93532daa0372267eb Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 20:54:53 +0300 Subject: [PATCH 0697/1062] Test --- src/checkpoints.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/checkpoints.h b/src/checkpoints.h index 215e65c3a..a31727ce0 100644 --- a/src/checkpoints.h +++ b/src/checkpoints.h @@ -6,6 +6,7 @@ #define BITCOIN_CHECKPOINTS_H #include "uint256.h" +#include "chainparams.h" #include From 2d9aa109d8a9ba4ee70f7d97294b71b4827e91ed Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 20:58:31 +0300 Subject: [PATCH 0698/1062] Test --- src/checkpoints.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/checkpoints.h b/src/checkpoints.h index a31727ce0..9d9fc6b82 100644 --- a/src/checkpoints.h +++ b/src/checkpoints.h @@ -37,7 +37,7 @@ struct CCheckpointData { //! Returns last CBlockIndex* in mapBlockIndex that is a checkpoint CBlockIndex* GetLastCheckpoint(const CChainParams::CCheckpointData& data); -double GuessVerificationProgress(const CCheckpointData& data, CBlockIndex* pindex, bool fSigchecks = true); +double GuessVerificationProgress(const CChainParams::CCheckpointData& data, CBlockIndex* pindex, bool fSigchecks = true); } //namespace Checkpoints From 269342f8259ed079778b0cc3c2ebb3f7a870c0a6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 20:59:50 +0300 Subject: [PATCH 0699/1062] Test --- src/main.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.h b/src/main.h index b5394a09b..aaf0f794c 100644 --- a/src/main.h +++ b/src/main.h @@ -60,7 +60,7 @@ static const bool DEFAULT_ALERTS = true; /** Minimum alert priority for enabling safe mode. */ static const int ALERT_PRIORITY_SAFE_MODE = 4000; /** Maximum reorg length we will accept before we shut down and alert the user. */ -static const unsigned int MAX_REORG_LENGTH = COINBASE_MATURITY - 1; +static const unsigned int MAX_REORG_LENGTH = _COINBASE_MATURITY - 1; /** Maximum number of signature check operations in an IsStandard() P2SH script */ static const unsigned int MAX_P2SH_SIGOPS = 15; /** The maximum number of sigops we're willing to relay/mine in a single tx */ From 96ac204532da50be092aa6723405498c238c86ce Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 21:00:57 +0300 Subject: [PATCH 0700/1062] Test --- src/main.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main.h b/src/main.h index aaf0f794c..14513b730 100644 --- a/src/main.h +++ b/src/main.h @@ -49,6 +49,7 @@ class PrecomputedTransactionData; struct CNodeStateStats; #define DEFAULT_MEMPOOL_EXPIRY 1 +#define _COINBASE_MATURITY 100 /** Default for -blockmaxsize and -blockminsize, which control the range of sizes the mining code will create **/ static const unsigned int DEFAULT_BLOCK_MAX_SIZE = MAX_BLOCK_SIZE; From 9f8c7135602ec44c7b26ede3db2c92ece9782e09 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 21:03:37 +0300 Subject: [PATCH 0701/1062] Test --- src/checkpoints.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/checkpoints.h b/src/checkpoints.h index 9d9fc6b82..ff3150c5e 100644 --- a/src/checkpoints.h +++ b/src/checkpoints.h @@ -22,13 +22,13 @@ namespace Checkpoints typedef std::map MapCheckpoints; -struct CCheckpointData { +/*struct CCheckpointData { MapCheckpoints mapCheckpoints; int64_t nTimeLastCheckpoint; int64_t nTransactionsLastCheckpoint; double fTransactionsPerDay; -}; - bool CheckBlock(const CCheckpointData& data, int nHeight, const uint256& hash); +};*/ + bool CheckBlock(const CChainParams::CCheckpointData& data, int nHeight, const uint256& hash); //! Return conservative estimate of total number of blocks, 0 if unknown From b929c085eed7e027e604a21614ea87a538196d4c Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 21:04:58 +0300 Subject: [PATCH 0702/1062] Test --- src/checkpoints.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/checkpoints.h b/src/checkpoints.h index ff3150c5e..b75da9ef2 100644 --- a/src/checkpoints.h +++ b/src/checkpoints.h @@ -22,12 +22,12 @@ namespace Checkpoints typedef std::map MapCheckpoints; -/*struct CCheckpointData { +struct CCheckpointData { MapCheckpoints mapCheckpoints; int64_t nTimeLastCheckpoint; int64_t nTransactionsLastCheckpoint; double fTransactionsPerDay; -};*/ +}; bool CheckBlock(const CChainParams::CCheckpointData& data, int nHeight, const uint256& hash); From d7b577307e8572f84d7a0137e6a258d340a31ffc Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 21:08:29 +0300 Subject: [PATCH 0703/1062] Test --- src/consensus/params.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/consensus/params.h b/src/consensus/params.h index 233d9d391..855729ff0 100644 --- a/src/consensus/params.h +++ b/src/consensus/params.h @@ -87,6 +87,7 @@ struct Params { int nMajorityEnforceBlockUpgrade; int nMajorityRejectBlockOutdated; int nMajorityWindow; + int fPowAllowMinDifficultyBlocks; NetworkUpgrade vUpgrades[MAX_NETWORK_UPGRADES]; /** Proof of work parameters */ uint256 powLimit; From d78a07c6452384f06023186b90c22f5a797c712f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 21:15:11 +0300 Subject: [PATCH 0704/1062] Test --- src/chainparams.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 9a2a7b626..ce7da4fe7 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -208,7 +208,7 @@ void CChainParams::SetCheckpointData(Checkpoints::CCheckpointData checkpointData void *chainparams_commandline(void *ptr) { - Checkpoints::CCheckpointData checkpointData; + CChainParams::CCheckpointData checkpointData; while ( ASSETCHAINS_PORT == 0 ) { #ifdef _WIN32 From b35fd600320845ce6d68773fe0a266c71168e89d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 21:16:11 +0300 Subject: [PATCH 0705/1062] Test --- src/chainparams.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index ce7da4fe7..527f0f6d2 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -201,7 +201,7 @@ public: }; static CMainParams mainParams; -void CChainParams::SetCheckpointData(Checkpoints::CCheckpointData checkpointData) +void CChainParams::SetCheckpointData(CChainParams::CCheckpointData checkpointData) { CChainParams::checkpointData = checkpointData; } From aa22b9566ab20859579f6a6798a40989061c9e08 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 21:17:46 +0300 Subject: [PATCH 0706/1062] Test --- src/chainparams.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 527f0f6d2..3bd45bfb7 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -10,6 +10,7 @@ #include "utilstrencodings.h" #include +#include #include From 028a5705768fcf45e94b74b856229eafbe39c814 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 21:18:25 +0300 Subject: [PATCH 0707/1062] Test --- src/chainparams.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 3bd45bfb7..cda82b943 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -10,7 +10,7 @@ #include "utilstrencodings.h" #include -#include +#include #include From 1ade2131001778bfb0fa7e8d7d988011fc5ea97b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 21:20:12 +0300 Subject: [PATCH 0708/1062] Test --- src/chainparams.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index cda82b943..5538e9a20 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -10,7 +10,6 @@ #include "utilstrencodings.h" #include -#include #include @@ -139,7 +138,7 @@ public: CMutableTransaction txNew; txNew.vin.resize(1); txNew.vout.resize(1); - txNew.vin[0].scriptSig = CScript() << 486604799 << CScriptNum(4) << vector((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp)); + txNew.vin[0].scriptSig = CScript() << 486604799 << CScriptNum(4) << std::vector((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp)); txNew.vout[0].nValue = 50 * COIN; txNew.vout[0].scriptPubKey = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG; genesis.vtx.push_back(txNew); From 3fc8685f0e6b64e6403217fa99c4bd99754b0385 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 21:37:22 +0300 Subject: [PATCH 0709/1062] Test --- src/komodo_notary.h | 4 ++-- src/wallet/asyncrpcoperation_sendmany.cpp | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 56f0cc19a..ab51e9c7e 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -204,7 +204,7 @@ int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestam timestamp = komodo_heightstamp(height); if ( height >= KOMODO_NOTARIES_HARDCODED || ASSETCHAINS_SYMBOL[0] != 0 ) { - if ( (timestamp != 0 && timestamp < KOMODO_NOTARIES_TIMESTAMP1) || height < KOMODO_NOTARIES_HEIGHT1 ) + if ( (timestamp != 0 && timestamp <= KOMODO_NOTARIES_TIMESTAMP1) || height <= KOMODO_NOTARIES_HEIGHT1 ) { n = (int32_t)(sizeof(Notaries_elected0)/sizeof(*Notaries_elected0)); for (i=0; i outputs {info.vjsout[0], info.vjsout[1]}; - #ifdef __LP64__ +#ifdef __LP64__ boost::array inputMap; boost::array outputMap; - #else +#else boost::array inputMap; boost::array outputMap; - +#endif uint256 esk; // payment disclosure - secret JSDescription jsdesc = JSDescription::Randomized( From 04824d85efc7e5d21c8ceb12a2d473240ccfdcfd Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 21:42:54 +0300 Subject: [PATCH 0710/1062] Test --- src/checkpoints.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/checkpoints.cpp b/src/checkpoints.cpp index ec1e2a47f..70fd1e8f2 100644 --- a/src/checkpoints.cpp +++ b/src/checkpoints.cpp @@ -23,7 +23,7 @@ namespace Checkpoints { * fast multicore CPU, it won't be much higher than 1. */ static const double SIGCHECK_VERIFICATION_FACTOR = 5.0; - bool CheckBlock(const CCheckpointData& data, int nHeight, const uint256& hash) + bool CheckBlock(const CChainParams::CCheckpointData& data, int nHeight, const uint256& hash) { const MapCheckpoints& checkpoints = data.mapCheckpoints; @@ -33,7 +33,7 @@ namespace Checkpoints { } //! Guess how far we are in the verification process at the given block index - double GuessVerificationProgress(const CCheckpointData& data, CBlockIndex *pindex, bool fSigchecks) { + double GuessVerificationProgress(const CChainParams::CCheckpointData& data, CBlockIndex *pindex, bool fSigchecks) { if (pindex==NULL) return 0.0; @@ -62,7 +62,7 @@ namespace Checkpoints { return fWorkBefore / (fWorkBefore + fWorkAfter); } - int GetTotalBlocksEstimate(const CCheckpointData& data) + int GetTotalBlocksEstimate(const CChainParams::CCheckpointData& data) { const MapCheckpoints& checkpoints = data.mapCheckpoints; @@ -72,7 +72,7 @@ namespace Checkpoints { return checkpoints.rbegin()->first; } - CBlockIndex* GetLastCheckpoint(const CCheckpointData& data) + CBlockIndex* GetLastCheckpoint(const CChainParams::CCheckpointData& data) { const MapCheckpoints& checkpoints = data.mapCheckpoints; From 694e664eb9afdbe32fb0961dd665758c25bf4615 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 21:49:50 +0300 Subject: [PATCH 0711/1062] Test --- src/chainparams.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 5538e9a20..4f93710c0 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -536,7 +536,6 @@ public: genesis.nSolution = ParseHex("0f2a976db4c4263da10fd5d38eb1790469cf19bdb4bf93450e09a72fdff17a3454326399"); consensus.hashGenesisBlock = genesis.GetHash(); nDefaultPort = 17779; - assert(consensus.hashGenesisBlock == uint256S("0x00a215b4fe36f5d2f829d43e587bf10e89e64f9f48a5b6ce18559089e8fd643d")); nPruneAfterHeight = 1000; vFixedSeeds.clear(); //! Regtest mode doesn't have any fixed seeds. From c13f04b795c4efd06e615e7e10d760a01065cb9f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 22:30:52 +0300 Subject: [PATCH 0712/1062] Test --- src/komodo_bitcoind.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 97abb9429..ee9f48c83 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -918,7 +918,7 @@ int32_t komodo_validate_interest(const CTransaction &tx,int32_t txheight,uint32_ { if ( tx.nLockTime != 1477258935 || dispflag != 0 ) { - //fprintf(stderr,"komodo_validate_interest.%d reject.%d [%d] locktime %u cmp2.%u\n",dispflag,txheight,(int32_t)(tx.nLockTime - (cmptime-3600)),(uint32_t)tx.nLockTime,cmptime); + fprintf(stderr,"komodo_validate_interest.%d reject.%d [%d] locktime %u cmp2.%u\n",dispflag,txheight,(int32_t)(tx.nLockTime - (cmptime-3600)),(uint32_t)tx.nLockTime,cmptime); } return(-1); } From e74e837eb999d07bd0b0395b6c741b49e34faa20 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 22:45:32 +0300 Subject: [PATCH 0713/1062] Test --- src/komodo_bitcoind.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index ee9f48c83..b082fe919 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -621,7 +621,7 @@ int32_t komodo_block2height(CBlock *block) //for (i=0; i<6; i++) // printf("%02x",ptr[i]); n = ptr[0]; - for (i=0; i<4; i++) + for (i=n-4-1; i Date: Sun, 25 Mar 2018 22:48:54 +0300 Subject: [PATCH 0714/1062] Test --- src/komodo_bitcoind.h | 4 ++-- src/main.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index b082fe919..6109b09b0 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -621,13 +621,13 @@ int32_t komodo_block2height(CBlock *block) //for (i=0; i<6; i++) // printf("%02x",ptr[i]); n = ptr[0]; - for (i=n-4-1; ivtx[0].vin[0].scriptSig.size(),height); + printf(" <- coinbase.%d ht.%d\n",(int32_t)block->vtx[0].vin[0].scriptSig.size(),height); } //komodo_init(height); } diff --git a/src/main.cpp b/src/main.cpp index 6e85b208a..0cd831b5b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3539,7 +3539,7 @@ bool CheckBlock(int32_t height,CBlockIndex *pindex,const CBlock& block, CValidat // Check transactions BOOST_FOREACH(const CTransaction& tx, block.vtx) { - if ( komodo_validate_interest(tx,komodo_block2height((CBlock *)&block),block.nTime,1) < 0 ) + if ( komodo_validate_interest(tx,height == 0 ? komodo_block2height((CBlock *)&block) : height,block.nTime,1) < 0 ) return error("CheckBlock: komodo_validate_interest failed"); if (!CheckTransaction(tx, state, verifier)) return error("CheckBlock(): CheckTransaction failed"); From 643bc61b9ec541533d7e80b1d47b24f5d6a42aab Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Mar 2018 22:50:36 +0300 Subject: [PATCH 0715/1062] Test --- src/komodo_bitcoind.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 6109b09b0..b2489f814 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -621,13 +621,13 @@ int32_t komodo_block2height(CBlock *block) //for (i=0; i<6; i++) // printf("%02x",ptr[i]); n = ptr[0]; - for (i=0; ivtx[0].vin[0].scriptSig.size(),height); + //printf(" <- coinbase.%d ht.%d\n",(int32_t)block->vtx[0].vin[0].scriptSig.size(),height); } //komodo_init(height); } From 85f05424d3b83a8fa5d6fd3baa965bf56fce6188 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Mar 2018 03:38:47 +0300 Subject: [PATCH 0716/1062] Speed up komodo_notaries --- src/komodo_notary.h | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index ab51e9c7e..88ca567a7 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -199,6 +199,7 @@ const char *Notaries_elected1[][2] = int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestamp) { + static uint8_t elected_pubkeys0[64][33],elected_pubkeys1[64][33],did0,did1; int32_t i,htind,n; uint64_t mask = 0; struct knotary_entry *kp,*tmp; if ( timestamp == 0 && ASSETCHAINS_SYMBOL[0] != 0 ) timestamp = komodo_heightstamp(height); @@ -206,19 +207,29 @@ int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestam { if ( (timestamp != 0 && timestamp <= KOMODO_NOTARIES_TIMESTAMP1) || height <= KOMODO_NOTARIES_HEIGHT1 ) { - n = (int32_t)(sizeof(Notaries_elected0)/sizeof(*Notaries_elected0)); - for (i=0; i Date: Mon, 26 Mar 2018 04:23:57 +0300 Subject: [PATCH 0717/1062] Cache pubkey33 and notary --- src/chain.h | 3 +- src/komodo_bitcoind.h | 64 +++++++++++++++++++++++++++---------------- src/komodo_notary.h | 8 ++---- src/pow.cpp | 2 +- 4 files changed, 46 insertions(+), 31 deletions(-) diff --git a/src/chain.h b/src/chain.h index 937e20bda..d3c46f9d6 100644 --- a/src/chain.h +++ b/src/chain.h @@ -177,7 +177,8 @@ public: //! (memory only) Sequential id assigned to distinguish order in which blocks are received. uint32_t nSequenceId; - + int8_t notaryid; uint8_t pubkey33[33]; + void SetNull() { phashBlock = NULL; diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index b2489f814..2fa18708b 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -585,7 +585,7 @@ void komodo_disconnect(CBlockIndex *pindex,CBlock& block) int32_t komodo_is_notarytx(const CTransaction& tx) { - uint8_t *ptr,crypto777[33]; + uint8_t *ptr; static uint8_t crypto777[33]; if ( tx.vout.size() > 0 ) { #ifdef KOMODO_ZCASH @@ -595,7 +595,8 @@ int32_t komodo_is_notarytx(const CTransaction& tx) #endif if ( ptr != 0 ) { - decode_hex(crypto777,33,(char *)CRYPTO777_PUBSECPSTR); + if ( crypto777[0] == 0 ) + decode_hex(crypto777,33,(char *)CRYPTO777_PUBSECPSTR); if ( memcmp(ptr+1,crypto777,33) == 0 ) { //printf("found notarytx\n"); @@ -704,8 +705,15 @@ void komodo_index2pubkey33(uint8_t *pubkey33,CBlockIndex *pindex,int32_t height) memset(pubkey33,0,33); if ( pindex != 0 ) { - if ( komodo_blockload(block,pindex) == 0 ) - komodo_block2pubkey33(pubkey33,block); + if ( pindex->pubkey33[0] == 0 ) + { + if ( komodo_blockload(block,pindex) == 0 ) + { + komodo_block2pubkey33(pindex->pubkey33,block); + pindex->notaryid = komodo_electednotary(&numnotaries,pindex->pubkey33,height,pindex->nTime); + } + } + memcpy(pubkey33,pindex->pubkey33,33); } else { @@ -714,12 +722,12 @@ void komodo_index2pubkey33(uint8_t *pubkey33,CBlockIndex *pindex,int32_t height) } } -void komodo_connectpindex(CBlockIndex *pindex) +/*void komodo_connectpindex(CBlockIndex *pindex) { CBlock block; if ( komodo_blockload(block,pindex) == 0 ) komodo_connectblock(pindex,block); -} +}*/ int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestamp); int32_t komodo_electednotary(int32_t *numnotariesp,uint8_t *pubkey33,int32_t height,uint32_t timestamp); @@ -727,40 +735,50 @@ int32_t komodo_electednotary(int32_t *numnotariesp,uint8_t *pubkey33,int32_t hei int8_t komodo_minerid(int32_t height,uint8_t *pubkey33) { int32_t num,i,numnotaries; CBlockIndex *pindex; uint32_t timestamp=0; uint8_t _pubkey33[33],pubkeys[64][33]; - if ( pubkey33 == 0 && (pindex= chainActive[height]) != 0 ) + if ( (pindex= chainActive[height]) != 0 ) { - timestamp = pindex->GetBlockTime(); - if ( pubkey33 == 0 ) + if ( pindex->pubkey33[0] == 0 ) { - pubkey33 = _pubkey33; + timestamp = pindex->GetBlockTime(); + if ( pubkey33 == 0 ) + pubkey33 = _pubkey33; komodo_index2pubkey33(pubkey33,pindex,height); + pindex->notaryid = komodo_electednotary(&numnotaries,pindex->pubkey33,height,pindex->nTime); + /*if ( (num= komodo_notaries(pubkeys,height,timestamp)) > 0 ) + { + for (i=0; i 0 ) - { - for (i=0; inotaryid); } return(komodo_electednotary(&numnotaries,pubkey33,height,timestamp)); } int32_t komodo_eligiblenotary(uint8_t pubkeys[66][33],int32_t *mids,int32_t *nonzpkeysp,int32_t height) { - int32_t i,j,duplicate; CBlockIndex *pindex; uint8_t pubkey33[33]; + int32_t i,j,duplicate,numnotaries; CBlockIndex *pindex; uint8_t pubkey33[33]; memset(mids,-1,sizeof(*mids)*66); for (i=duplicate=0; i<66; i++) { if ( (pindex= komodo_chainactive(height-i)) != 0 ) { - komodo_index2pubkey33(pubkey33,pindex,height-i); - for (j=0; j<33; j++) - pubkeys[i][j] = pubkey33[j]; - if ( (mids[i]= komodo_minerid(height-i,pubkey33)) >= 0 ) + if ( pindex->pubkey33[0] == 0 ) { - //mids[i] = *(int32_t *)pubkey33; - (*nonzpkeysp)++; + komodo_index2pubkey33(pubkey33,pindex,height-i); + pindex->notaryid = komodo_electednotary(&numnotaries,pindex->pubkey33,height,pindex->nTime); + //for (j=0; j<33; j++) + // pubkeys[i][j] = pubkey33[j]; + /*if ( (mids[i]= komodo_minerid(height-i,pubkey33)) >= 0 ) + { + //mids[i] = *(int32_t *)pubkey33; + (*nonzpkeysp)++; + }*/ } + memcpy(pubkeys[i],pindex->pubkey33,33); + if ( (mids[i]= pindex->notaryid) >= 0 ) + (*nonzkeysp)++; if ( mids[0] >= 0 && i > 0 && mids[i] == mids[0] ) duplicate++; } diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 88ca567a7..961c1e866 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -257,11 +257,7 @@ int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestam int32_t komodo_electednotary(int32_t *numnotariesp,uint8_t *pubkey33,int32_t height,uint32_t timestamp) { - char pubkeystr[67]; int32_t i,n; uint8_t pubkeys[64][33]; - for (i=0; i<33; i++) - sprintf(&pubkeystr[i*2],"%02x",pubkey33[i]); - pubkeystr[66] = 0; - //printf("%s vs\n",pubkeystr); + int32_t i,n; uint8_t pubkeys[64][33]; n = komodo_notaries(pubkeys,height,timestamp); *numnotariesp = n; for (i=0; i Date: Mon, 26 Mar 2018 04:31:09 +0300 Subject: [PATCH 0718/1062] Test --- src/komodo_bitcoind.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 2fa18708b..6b88758e8 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -700,7 +700,7 @@ uint32_t komodo_heightstamp(int32_t height) void komodo_index2pubkey33(uint8_t *pubkey33,CBlockIndex *pindex,int32_t height) { - CBlock block; + CBlock block; int32_t numnotaries; //komodo_init(height); memset(pubkey33,0,33); if ( pindex != 0 ) @@ -778,7 +778,7 @@ int32_t komodo_eligiblenotary(uint8_t pubkeys[66][33],int32_t *mids,int32_t *non } memcpy(pubkeys[i],pindex->pubkey33,33); if ( (mids[i]= pindex->notaryid) >= 0 ) - (*nonzkeysp)++; + (*nonzpkeysp)++; if ( mids[0] >= 0 && i > 0 && mids[i] == mids[0] ) duplicate++; } From 92fc319628a491e269c695fe94158495e36db25a Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Mar 2018 04:32:21 +0300 Subject: [PATCH 0719/1062] Test --- src/komodo_bitcoind.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 6b88758e8..9f1713584 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -698,6 +698,9 @@ uint32_t komodo_heightstamp(int32_t height) return(0); } +int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestamp); +int32_t komodo_electednotary(int32_t *numnotariesp,uint8_t *pubkey33,int32_t height,uint32_t timestamp); + void komodo_index2pubkey33(uint8_t *pubkey33,CBlockIndex *pindex,int32_t height) { CBlock block; int32_t numnotaries; @@ -729,8 +732,6 @@ void komodo_index2pubkey33(uint8_t *pubkey33,CBlockIndex *pindex,int32_t height) komodo_connectblock(pindex,block); }*/ -int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestamp); -int32_t komodo_electednotary(int32_t *numnotariesp,uint8_t *pubkey33,int32_t height,uint32_t timestamp); int8_t komodo_minerid(int32_t height,uint8_t *pubkey33) { From 70b73d8f2547cf61f878a28f861c8e31877f4c75 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Mar 2018 05:34:22 +0300 Subject: [PATCH 0720/1062] Test --- src/komodo_bitcoind.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 9f1713584..d15082f94 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -736,13 +736,16 @@ void komodo_index2pubkey33(uint8_t *pubkey33,CBlockIndex *pindex,int32_t height) int8_t komodo_minerid(int32_t height,uint8_t *pubkey33) { int32_t num,i,numnotaries; CBlockIndex *pindex; uint32_t timestamp=0; uint8_t _pubkey33[33],pubkeys[64][33]; + if ( pubkey33 == 0 ) + { + pubkey33 = _pubkey33; + memset(pubkey33,0,33); + } if ( (pindex= chainActive[height]) != 0 ) { if ( pindex->pubkey33[0] == 0 ) { timestamp = pindex->GetBlockTime(); - if ( pubkey33 == 0 ) - pubkey33 = _pubkey33; komodo_index2pubkey33(pubkey33,pindex,height); pindex->notaryid = komodo_electednotary(&numnotaries,pindex->pubkey33,height,pindex->nTime); /*if ( (num= komodo_notaries(pubkeys,height,timestamp)) > 0 ) From bc6ba3da300e519a3c8f0c09a7ba8b76a67b970b Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Mar 2018 05:37:15 +0300 Subject: [PATCH 0721/1062] Test --- src/komodo_bitcoind.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index d15082f94..76cb00423 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -708,7 +708,7 @@ void komodo_index2pubkey33(uint8_t *pubkey33,CBlockIndex *pindex,int32_t height) memset(pubkey33,0,33); if ( pindex != 0 ) { - if ( pindex->pubkey33[0] == 0 ) + //if ( pindex->pubkey33[0] == 0 ) { if ( komodo_blockload(block,pindex) == 0 ) { From 6402fab251f08ccdaea880f591ec40e39e366217 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Mar 2018 05:45:25 +0300 Subject: [PATCH 0722/1062] Test --- src/komodo_notary.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 961c1e866..de93f57bd 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -236,6 +236,7 @@ int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestam htind = height / KOMODO_ELECTION_GAP; if ( htind >= KOMODO_MAXBLOCKS / KOMODO_ELECTION_GAP ) htind = (KOMODO_MAXBLOCKS / KOMODO_ELECTION_GAP) - 1; + printf("Pubkeys.%p htind.%d vs max.%d\n",Pubkeys,htind,KOMODO_MAXBLOCKS / KOMODO_ELECTION_GAP); pthread_mutex_lock(&komodo_mutex); n = Pubkeys[htind].numnotaries; if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 ) @@ -288,7 +289,7 @@ void komodo_notarysinit(int32_t origheight,uint8_t pubkeys[64][33],int32_t num) static int32_t hwmheight; int32_t k,i,htind,height; struct knotary_entry *kp; struct knotaries_entry N; if ( Pubkeys == 0 ) - Pubkeys = (struct knotaries_entry *)calloc(KOMODO_MAXBLOCKS / KOMODO_ELECTION_GAP,sizeof(*Pubkeys)); + Pubkeys = (struct knotaries_entry *)calloc(1 + (KOMODO_MAXBLOCKS / KOMODO_ELECTION_GAP),sizeof(*Pubkeys)); memset(&N,0,sizeof(N)); if ( origheight > 0 ) { From db19b2aac5907818171dc9507ed35e5e307c59f3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Mar 2018 05:49:03 +0300 Subject: [PATCH 0723/1062] Test --- src/komodo_notary.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index de93f57bd..1f9fce277 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -237,6 +237,11 @@ int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestam if ( htind >= KOMODO_MAXBLOCKS / KOMODO_ELECTION_GAP ) htind = (KOMODO_MAXBLOCKS / KOMODO_ELECTION_GAP) - 1; printf("Pubkeys.%p htind.%d vs max.%d\n",Pubkeys,htind,KOMODO_MAXBLOCKS / KOMODO_ELECTION_GAP); + if ( Pubkeys == 0 ) + { + komodo_init(height); + printf("Pubkeys.%p htind.%d vs max.%d\n",Pubkeys,htind,KOMODO_MAXBLOCKS / KOMODO_ELECTION_GAP); + } pthread_mutex_lock(&komodo_mutex); n = Pubkeys[htind].numnotaries; if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 ) From bd92bdcdbdc1a7ebad1389a40edeeacdef1c8470 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Mar 2018 05:50:18 +0300 Subject: [PATCH 0724/1062] Test --- src/komodo_notary.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 1f9fce277..4911b21d9 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -236,7 +236,6 @@ int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestam htind = height / KOMODO_ELECTION_GAP; if ( htind >= KOMODO_MAXBLOCKS / KOMODO_ELECTION_GAP ) htind = (KOMODO_MAXBLOCKS / KOMODO_ELECTION_GAP) - 1; - printf("Pubkeys.%p htind.%d vs max.%d\n",Pubkeys,htind,KOMODO_MAXBLOCKS / KOMODO_ELECTION_GAP); if ( Pubkeys == 0 ) { komodo_init(height); From 7c2c1b5af180fcab593ad84242f799c45de8b047 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Mar 2018 05:52:17 +0300 Subject: [PATCH 0725/1062] Test --- src/komodo_bitcoind.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 76cb00423..b54844765 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -743,7 +743,7 @@ int8_t komodo_minerid(int32_t height,uint8_t *pubkey33) } if ( (pindex= chainActive[height]) != 0 ) { - if ( pindex->pubkey33[0] == 0 ) + //if ( pindex->pubkey33[0] == 0 ) { timestamp = pindex->GetBlockTime(); komodo_index2pubkey33(pubkey33,pindex,height); @@ -768,7 +768,7 @@ int32_t komodo_eligiblenotary(uint8_t pubkeys[66][33],int32_t *mids,int32_t *non { if ( (pindex= komodo_chainactive(height-i)) != 0 ) { - if ( pindex->pubkey33[0] == 0 ) + //if ( pindex->pubkey33[0] == 0 ) { komodo_index2pubkey33(pubkey33,pindex,height-i); pindex->notaryid = komodo_electednotary(&numnotaries,pindex->pubkey33,height,pindex->nTime); From 1746e25c183f5a23182a278316177906ec2df044 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Mar 2018 05:57:00 +0300 Subject: [PATCH 0726/1062] Test --- src/komodo_bitcoind.h | 66 +++++++++++++++---------------------------- 1 file changed, 23 insertions(+), 43 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index b54844765..6ce8c5355 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -698,25 +698,15 @@ uint32_t komodo_heightstamp(int32_t height) return(0); } -int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestamp); -int32_t komodo_electednotary(int32_t *numnotariesp,uint8_t *pubkey33,int32_t height,uint32_t timestamp); - void komodo_index2pubkey33(uint8_t *pubkey33,CBlockIndex *pindex,int32_t height) { - CBlock block; int32_t numnotaries; + CBlock block; //komodo_init(height); memset(pubkey33,0,33); if ( pindex != 0 ) { - //if ( pindex->pubkey33[0] == 0 ) - { - if ( komodo_blockload(block,pindex) == 0 ) - { - komodo_block2pubkey33(pindex->pubkey33,block); - pindex->notaryid = komodo_electednotary(&numnotaries,pindex->pubkey33,height,pindex->nTime); - } - } - memcpy(pubkey33,pindex->pubkey33,33); + if ( komodo_blockload(block,pindex) == 0 ) + komodo_block2pubkey33(pubkey33,block); } else { @@ -732,57 +722,47 @@ void komodo_index2pubkey33(uint8_t *pubkey33,CBlockIndex *pindex,int32_t height) komodo_connectblock(pindex,block); }*/ +int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestamp); +int32_t komodo_electednotary(int32_t *numnotariesp,uint8_t *pubkey33,int32_t height,uint32_t timestamp); int8_t komodo_minerid(int32_t height,uint8_t *pubkey33) { int32_t num,i,numnotaries; CBlockIndex *pindex; uint32_t timestamp=0; uint8_t _pubkey33[33],pubkeys[64][33]; - if ( pubkey33 == 0 ) + if ( pubkey33 == 0 && (pindex= chainActive[height]) != 0 ) { - pubkey33 = _pubkey33; - memset(pubkey33,0,33); - } - if ( (pindex= chainActive[height]) != 0 ) - { - //if ( pindex->pubkey33[0] == 0 ) + timestamp = pindex->GetBlockTime(); + if ( pubkey33 == 0 ) { - timestamp = pindex->GetBlockTime(); + pubkey33 = _pubkey33; komodo_index2pubkey33(pubkey33,pindex,height); - pindex->notaryid = komodo_electednotary(&numnotaries,pindex->pubkey33,height,pindex->nTime); - /*if ( (num= komodo_notaries(pubkeys,height,timestamp)) > 0 ) - { - for (i=0; inotaryid); + if ( (num= komodo_notaries(pubkeys,height,timestamp)) > 0 ) + { + for (i=0; ipubkey33[0] == 0 ) + komodo_index2pubkey33(pubkey33,pindex,height-i); + //for (j=0; j<33; j++) + // pubkeys[i][j] = pubkey33[j]; + memcpy(pubkeys[i],pubkey33,33); + if ( (mids[i]= komodo_minerid(height-i,pubkey33)) >= 0 ) { - komodo_index2pubkey33(pubkey33,pindex,height-i); - pindex->notaryid = komodo_electednotary(&numnotaries,pindex->pubkey33,height,pindex->nTime); - //for (j=0; j<33; j++) - // pubkeys[i][j] = pubkey33[j]; - /*if ( (mids[i]= komodo_minerid(height-i,pubkey33)) >= 0 ) - { - //mids[i] = *(int32_t *)pubkey33; - (*nonzpkeysp)++; - }*/ - } - memcpy(pubkeys[i],pindex->pubkey33,33); - if ( (mids[i]= pindex->notaryid) >= 0 ) + //mids[i] = *(int32_t *)pubkey33; (*nonzpkeysp)++; + } if ( mids[0] >= 0 && i > 0 && mids[i] == mids[0] ) duplicate++; } From c6df523fa4c8df404f0c1705bf79fc92057cc6c2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Mar 2018 06:02:32 +0300 Subject: [PATCH 0727/1062] Test --- src/komodo_bitcoind.h | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 6ce8c5355..a94ec3d77 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -730,17 +730,22 @@ int8_t komodo_minerid(int32_t height,uint8_t *pubkey33) int32_t num,i,numnotaries; CBlockIndex *pindex; uint32_t timestamp=0; uint8_t _pubkey33[33],pubkeys[64][33]; if ( pubkey33 == 0 && (pindex= chainActive[height]) != 0 ) { - timestamp = pindex->GetBlockTime(); - if ( pubkey33 == 0 ) + if ( pindex->pubkey33[0] == 0 ) { - pubkey33 = _pubkey33; + pindex->notaryid = -1; + timestamp = pindex->GetBlockTime(); + if ( pubkey33 == 0 ) + pubkey33 = _pubkey33; komodo_index2pubkey33(pubkey33,pindex,height); - } - if ( (num= komodo_notaries(pubkeys,height,timestamp)) > 0 ) - { - for (i=0; i 0 ) + { + for (i=0; inotaryid = i; + return(i); + } + } } } return(komodo_electednotary(&numnotaries,pubkey33,height,timestamp)); @@ -755,8 +760,6 @@ int32_t komodo_eligiblenotary(uint8_t pubkeys[66][33],int32_t *mids,int32_t *non if ( (pindex= komodo_chainactive(height-i)) != 0 ) { komodo_index2pubkey33(pubkey33,pindex,height-i); - //for (j=0; j<33; j++) - // pubkeys[i][j] = pubkey33[j]; memcpy(pubkeys[i],pubkey33,33); if ( (mids[i]= komodo_minerid(height-i,pubkey33)) >= 0 ) { From eb7171f5609479f9f3adcf5e231006f1efe7624c Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Mar 2018 06:05:56 +0300 Subject: [PATCH 0728/1062] Test --- src/komodo_bitcoind.h | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index a94ec3d77..f0b88d065 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -730,22 +730,17 @@ int8_t komodo_minerid(int32_t height,uint8_t *pubkey33) int32_t num,i,numnotaries; CBlockIndex *pindex; uint32_t timestamp=0; uint8_t _pubkey33[33],pubkeys[64][33]; if ( pubkey33 == 0 && (pindex= chainActive[height]) != 0 ) { - if ( pindex->pubkey33[0] == 0 ) + timestamp = pindex->GetBlockTime(); + if ( pubkey33 == 0 ) { - pindex->notaryid = -1; - timestamp = pindex->GetBlockTime(); - if ( pubkey33 == 0 ) - pubkey33 = _pubkey33; + pubkey33 = _pubkey33; komodo_index2pubkey33(pubkey33,pindex,height); - if ( (num= komodo_notaries(pubkeys,height,timestamp)) > 0 ) - { - for (i=0; inotaryid = i; - return(i); - } - } + } + if ( (num= komodo_notaries(pubkeys,height,timestamp)) > 0 ) + { + for (i=0; i Date: Mon, 26 Mar 2018 13:17:49 +0300 Subject: [PATCH 0729/1062] Test --- src/komodo_bitcoind.h | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index f0b88d065..f4a20718d 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -700,13 +700,31 @@ uint32_t komodo_heightstamp(int32_t height) void komodo_index2pubkey33(uint8_t *pubkey33,CBlockIndex *pindex,int32_t height) { - CBlock block; + CBlock block; int32_t num,i; uint8_t pubkeys[64][33]; //komodo_init(height); memset(pubkey33,0,33); if ( pindex != 0 ) { if ( komodo_blockload(block,pindex) == 0 ) + { komodo_block2pubkey33(pubkey33,block); + if ( pubkey33[0] == 2 || pubkey33[0] == 3 ) + { + memcpy(pindex->pubkey33,pubkey33,33); + if ( (num= komodo_notaries(pubkeys,height,timestamp)) > 0 ) + { + pindex->notaryid = -1; + for (i=0; inotaryid = i; + break; + } + } + } + } else pindex->notaryid = -1; + } } else { @@ -740,7 +758,11 @@ int8_t komodo_minerid(int32_t height,uint8_t *pubkey33) { for (i=0; ipubkey33[0] != 0 && (memcmp(pindex->pubkey33,pubkey33,33) != 0 || pindex->notaryid != i) ) + printf("mismatched notaryid.%d\n",pindex->notaryid) return(i); + } } } return(komodo_electednotary(&numnotaries,pubkey33,height,timestamp)); From 35998dd5ae6920fd85d537c864a2eeff304e5dc4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Mar 2018 13:18:44 +0300 Subject: [PATCH 0730/1062] Test --- src/komodo_bitcoind.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index f4a20718d..a5044c003 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -760,7 +760,7 @@ int8_t komodo_minerid(int32_t height,uint8_t *pubkey33) if ( memcmp(pubkeys[i],pubkey33,33) == 0 ) { if ( pindex->pubkey33[0] != 0 && (memcmp(pindex->pubkey33,pubkey33,33) != 0 || pindex->notaryid != i) ) - printf("mismatched notaryid.%d\n",pindex->notaryid) + printf("mismatched notaryid.%d\n",pindex->notaryid); return(i); } } From a142cb4f7cfa730a8b6776302c4f2fa5bb7562c9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Mar 2018 13:20:00 +0300 Subject: [PATCH 0731/1062] Test --- src/komodo_bitcoind.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index a5044c003..19f4be3e5 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -711,7 +711,7 @@ void komodo_index2pubkey33(uint8_t *pubkey33,CBlockIndex *pindex,int32_t height) if ( pubkey33[0] == 2 || pubkey33[0] == 3 ) { memcpy(pindex->pubkey33,pubkey33,33); - if ( (num= komodo_notaries(pubkeys,height,timestamp)) > 0 ) + if ( (num= komodo_notaries(pubkeys,(int32_t)pindex->nHeight,(uint32_t)pindex->nTime)) > 0 ) { pindex->notaryid = -1; for (i=0; i Date: Mon, 26 Mar 2018 13:21:15 +0300 Subject: [PATCH 0732/1062] Test --- src/komodo_bitcoind.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 19f4be3e5..6c9a98840 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -25,6 +25,9 @@ #include "komodo_defs.h" +int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestamp); +int32_t komodo_electednotary(int32_t *numnotariesp,uint8_t *pubkey33,int32_t height,uint32_t timestamp); + //#define issue_curl(cmdstr) bitcoind_RPC(0,(char *)"curl",(char *)"http://127.0.0.1:7776",0,0,(char *)(cmdstr)) struct MemoryStruct { char *memory; size_t size; }; @@ -740,8 +743,6 @@ void komodo_index2pubkey33(uint8_t *pubkey33,CBlockIndex *pindex,int32_t height) komodo_connectblock(pindex,block); }*/ -int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestamp); -int32_t komodo_electednotary(int32_t *numnotariesp,uint8_t *pubkey33,int32_t height,uint32_t timestamp); int8_t komodo_minerid(int32_t height,uint8_t *pubkey33) { From 3e7e31091257107f0fa4ac9c38848f248b1ad43e Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Mar 2018 13:41:46 +0300 Subject: [PATCH 0733/1062] Test --- src/komodo_bitcoind.h | 15 +++++++++++---- src/komodo_notary.h | 3 ++- src/miner.cpp | 9 +-------- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 6c9a98840..62ae3f010 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -708,6 +708,11 @@ void komodo_index2pubkey33(uint8_t *pubkey33,CBlockIndex *pindex,int32_t height) memset(pubkey33,0,33); if ( pindex != 0 ) { + if ( pindex->pubkey33[0] == 2 || pindex->pubkey33[0] == 3 ) + { + memcpy(pubkey33,pindex->pubkey33,33); + return; + } if ( komodo_blockload(block,pindex) == 0 ) { komodo_block2pubkey33(pubkey33,block); @@ -747,7 +752,7 @@ void komodo_index2pubkey33(uint8_t *pubkey33,CBlockIndex *pindex,int32_t height) int8_t komodo_minerid(int32_t height,uint8_t *pubkey33) { int32_t num,i,numnotaries; CBlockIndex *pindex; uint32_t timestamp=0; uint8_t _pubkey33[33],pubkeys[64][33]; - if ( pubkey33 == 0 && (pindex= chainActive[height]) != 0 ) + if ( (pindex= chainActive[height]) != 0 ) { timestamp = pindex->GetBlockTime(); if ( pubkey33 == 0 ) @@ -755,6 +760,8 @@ int8_t komodo_minerid(int32_t height,uint8_t *pubkey33) pubkey33 = _pubkey33; komodo_index2pubkey33(pubkey33,pindex,height); } + if ( pindex->pubkey33[0] == 2 || pindex->pubkey33[0] == 3 ) + return(pindex->notaryid); if ( (num= komodo_notaries(pubkeys,height,timestamp)) > 0 ) { for (i=0; i= 225000 ) - komodo_chosennotary(¬aryid,height,_pubkey33,timestamp); + komodo_chosennotary(¬aryid,height,pubkey33,timestamp); if ( height >= 34000 && notaryid >= 0 ) { if ( height < 79693 ) @@ -819,7 +826,7 @@ int32_t komodo_is_special(int32_t height,uint8_t pubkey33[33],uint32_t timestamp else limit = 66; for (i=1; i 0 ) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 4911b21d9..638327e81 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -339,7 +339,6 @@ int32_t komodo_chosennotary(int32_t *notaryidp,int32_t height,uint8_t *pubkey33, { // -1 if not notary, 0 if notary, 1 if special notary struct knotary_entry *kp; int32_t numnotaries=0,htind,modval = -1; - komodo_init(0); *notaryidp = -1; if ( height < 0 )//|| height >= KOMODO_MAXBLOCKS ) { @@ -356,6 +355,8 @@ int32_t komodo_chosennotary(int32_t *notaryidp,int32_t height,uint8_t *pubkey33, } if ( height >= 250000 ) return(-1); + if ( Pubkeys == 0 ) + komodo_init(0); htind = height / KOMODO_ELECTION_GAP; if ( htind >= KOMODO_MAXBLOCKS / KOMODO_ELECTION_GAP ) htind = (KOMODO_MAXBLOCKS / KOMODO_ELECTION_GAP) - 1; diff --git a/src/miner.cpp b/src/miner.cpp index cc0c2423c..e820c42e5 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -112,7 +112,6 @@ extern std::string NOTARY_PUBKEY; extern uint8_t NOTARY_PUBKEY33[33],ASSETCHAINS_OVERRIDE_PUBKEY33[33]; uint32_t Mining_start,Mining_height; int32_t komodo_chosennotary(int32_t *notaryidp,int32_t height,uint8_t *pubkey33,uint32_t timestamp); -int32_t komodo_is_special(int32_t height,uint8_t pubkey33[33],uint32_t timestamp); int32_t komodo_pax_opreturn(int32_t height,uint8_t *opret,int32_t maxsize); uint64_t komodo_paxtotal(); int32_t komodo_baseid(char *origbase); @@ -549,12 +548,6 @@ CBlockTemplate* CreateNewBlockWithKey(CReserveKey& reservekey) script[34] = OP_CHECKSIG; //scriptPubKey = CScript() << ToByteVector(pubkey) << OP_CHECKSIG; } - if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 ) - { - for (i=0; i<65; i++) - fprintf(stderr,"%d ",komodo_minerid(chainActive.Tip()->nHeight-i,0)); - fprintf(stderr," minerids.special %d from ht.%d\n",komodo_is_special(chainActive.Tip()->nHeight+1,NOTARY_PUBKEY33,chainActive.Tip()->GetBlockTime()),chainActive.Tip()->nHeight); - } return CreateNewBlock(scriptPubKey); } @@ -762,7 +755,7 @@ void static BitcoinMiner() savebits = pblock->nBits; arith_uint256 hashTarget = arith_uint256().SetCompact(pblock->nBits); roundrobin_delay = ROUNDROBIN_DELAY; - if ( ASSETCHAINS_SYMBOL[0] == 0 && notaryid >= 0 )//komodo_is_special(pindexPrev->nHeight+1,NOTARY_PUBKEY33) > 0 ) + if ( ASSETCHAINS_SYMBOL[0] == 0 && notaryid >= 0 ) { j = 65; if ( (Mining_height >= 235300 && Mining_height < 236000) || (Mining_height % KOMODO_ELECTION_GAP) > 64 || (Mining_height % KOMODO_ELECTION_GAP) == 0 ) From 5e0e5f857127fa3cc0a7c1bc0c3a825cd5d43983 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Mar 2018 13:57:33 +0300 Subject: [PATCH 0734/1062] Faster --- src/komodo_bitcoind.h | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 62ae3f010..d7a467b44 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -754,23 +754,20 @@ int8_t komodo_minerid(int32_t height,uint8_t *pubkey33) int32_t num,i,numnotaries; CBlockIndex *pindex; uint32_t timestamp=0; uint8_t _pubkey33[33],pubkeys[64][33]; if ( (pindex= chainActive[height]) != 0 ) { - timestamp = pindex->GetBlockTime(); - if ( pubkey33 == 0 ) - { - pubkey33 = _pubkey33; - komodo_index2pubkey33(pubkey33,pindex,height); - } if ( pindex->pubkey33[0] == 2 || pindex->pubkey33[0] == 3 ) + { + if ( pubkey33 != 0 ) + memcpy(pubkey33,pindex->pubkey33,33); return(pindex->notaryid); + } + if ( pubkey33 != 0 ) + komodo_index2pubkey33(pubkey33,pindex,height); + timestamp = pindex->GetBlockTime(); if ( (num= komodo_notaries(pubkeys,height,timestamp)) > 0 ) { for (i=0; ipubkey33[0] != 0 && (memcmp(pindex->pubkey33,pubkey33,33) != 0 || pindex->notaryid != i) ) - printf("mismatched notaryid.%d\n",pindex->notaryid); return(i); - } } } return(komodo_electednotary(&numnotaries,pubkey33,height,timestamp)); @@ -784,13 +781,22 @@ int32_t komodo_eligiblenotary(uint8_t pubkeys[66][33],int32_t *mids,int32_t *non { if ( (pindex= komodo_chainactive(height-i)) != 0 ) { - komodo_index2pubkey33(pubkey33,pindex,height-i); - memcpy(pubkeys[i],pubkey33,33); - if ( (mids[i]= komodo_minerid(height-i,pubkey33)) >= 0 ) + if ( pindex->notaryid >= 0 && (pindex->pubkey33[0] == 2 || pindex->pubkey33[0] == 3) ) { - //mids[i] = *(int32_t *)pubkey33; + memcpy(pubkeys[i],pindex->pubkey33,33); + mids[i] = pindex->notaryid; (*nonzpkeysp)++; } + else + { + komodo_index2pubkey33(pubkey33,pindex,height-i); + memcpy(pubkeys[i],pubkey33,33); + if ( (mids[i]= komodo_minerid(height-i,pubkey33)) >= 0 ) + { + //mids[i] = *(int32_t *)pubkey33; + (*nonzpkeysp)++; + } + } if ( mids[0] >= 0 && i > 0 && mids[i] == mids[0] ) duplicate++; } From 7890185e9a1505785b9956e4e21621ccbde6c150 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Mar 2018 14:23:46 +0300 Subject: [PATCH 0735/1062] Test --- src/pow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pow.cpp b/src/pow.cpp index 0190ccfb2..4765699d4 100644 --- a/src/pow.cpp +++ b/src/pow.cpp @@ -169,7 +169,7 @@ bool CheckProofOfWork(int32_t height,uint8_t *pubkey33,uint256 hash, unsigned in // Check proof of work matches claimed amount if ( UintToArith256(hash) > bnTarget ) { - if ( (height < 235300 || height >= 236000) && KOMODO_LOADINGBLOCKS == 0 && height > 188000 ) + if ( 0 && (height < 235300 || height >= 236000) && KOMODO_LOADINGBLOCKS == 0 && height > 188000 ) //&& )//186269, 182507&& komodo_chainactive(height) != 0 && nonzpkeys > 0 { for (i=31; i>=0; i--) From 60aee10df5780212e7e4a47bc2b8919aaa8bfea8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Mar 2018 14:40:11 +0300 Subject: [PATCH 0736/1062] Test --- src/main.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 0cd831b5b..8c4d6abd6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -751,7 +751,7 @@ bool IsFinalTx(const CTransaction &tx, int nBlockHeight, int64_t nBlockTime) } else if (!txin.IsFinal()) { - printf("non-final txin seq.%x locktime.%u vs nTime.%u\n",txin.nSequence,(uint32_t)tx.nLockTime,(uint32_t)nBlockTime); + //printf("non-final txin seq.%x locktime.%u vs nTime.%u\n",txin.nSequence,(uint32_t)tx.nLockTime,(uint32_t)nBlockTime); return false; } } @@ -1345,7 +1345,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa // are the joinsplit's requirements met? if (!view.HaveJoinSplitRequirements(tx)) { - fprintf(stderr,"accept failure.2\n"); + //fprintf(stderr,"accept failure.2\n"); return state.Invalid(error("AcceptToMemoryPool: joinsplit requirements not met"),REJECT_DUPLICATE, "bad-txns-joinsplit-requirements-not-met"); } @@ -1455,7 +1455,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa PrecomputedTransactionData txdata(tx); if (!ContextualCheckInputs(tx, state, view, true, STANDARD_SCRIPT_VERIFY_FLAGS, true, txdata, Params().GetConsensus(), consensusBranchId)) { - fprintf(stderr,"accept failure.9\n"); + //fprintf(stderr,"accept failure.9\n"); return error("AcceptToMemoryPool: ConnectInputs failed %s", hash.ToString()); } @@ -1993,7 +1993,7 @@ bool CheckTxInputs(const CTransaction& tx, CValidationState& state, const CCoins int64_t interest; int32_t txheight; uint32_t locktime; if ( (interest= komodo_accrued_interest(&txheight,&locktime,prevout.hash,prevout.n,0,coins->vout[prevout.n].nValue)) != 0 ) { - //fprintf(stderr,"checkResult %.8f += val %.8f interest %.8f ht.%d lock.%u tip.%u\n",(double)nValueIn/COIN,(double)coins->vout[prevout.n].nValue/COIN,(double)interest/COIN,txheight,locktime,chainActive.Tip()->nTime); +fprintf(stderr,"checkResult %.8f += val %.8f interest %.8f ht.%d lock.%u tip.%u\n",(double)nValueIn/COIN,(double)coins->vout[prevout.n].nValue/COIN,(double)interest/COIN,txheight,locktime,chainActive.Tip()->nTime); nValueIn += interest; } } @@ -2011,9 +2011,11 @@ bool CheckTxInputs(const CTransaction& tx, CValidationState& state, const CCoins REJECT_INVALID, "bad-txns-inputvalues-outofrange"); if (nValueIn < tx.GetValueOut()) + { + fprintf(stderr,"valuein %s vs %s error\n",FormatMoney(nValueIn), FormatMoney(tx.GetValueOut())); return state.DoS(100, error("CheckInputs(): %s value in (%s) < value out (%s) diff %.8f", tx.GetHash().ToString(), FormatMoney(nValueIn), FormatMoney(tx.GetValueOut()),((double)nValueIn - tx.GetValueOut())/COIN),REJECT_INVALID, "bad-txns-in-belowout"); - + } // Tally transaction fees CAmount nTxFee = nValueIn - tx.GetValueOut(); if (nTxFee < 0) From 28ee65c78ae47296adc8a96cc9f422fcdf9a3f08 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Mar 2018 14:42:46 +0300 Subject: [PATCH 0737/1062] Test --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 8c4d6abd6..af70ede77 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2012,7 +2012,7 @@ fprintf(stderr,"checkResult %.8f += val %.8f interest %.8f ht.%d lock.%u tip.%u\ if (nValueIn < tx.GetValueOut()) { - fprintf(stderr,"valuein %s vs %s error\n",FormatMoney(nValueIn), FormatMoney(tx.GetValueOut())); + fprintf(stderr,"valuein %s vs %s error\n",FormatMoney(nValueIn).c_str(), FormatMoney(tx.GetValueOut()).c_str()); return state.DoS(100, error("CheckInputs(): %s value in (%s) < value out (%s) diff %.8f", tx.GetHash().ToString(), FormatMoney(nValueIn), FormatMoney(tx.GetValueOut()),((double)nValueIn - tx.GetValueOut())/COIN),REJECT_INVALID, "bad-txns-in-belowout"); } From c60397dd3a9615c17a3ae0d359569e2232efb8fb Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Mar 2018 15:38:49 +0300 Subject: [PATCH 0738/1062] Lagging chaintip fix --- src/coins.cpp | 4 ++-- src/komodo-tx.cpp | 2 +- src/komodo_bitcoind.h | 12 ++++++++---- src/main.cpp | 4 ++-- src/rpcblockchain.cpp | 4 ++-- src/wallet/rpcwallet.cpp | 4 ++-- src/wallet/wallet.cpp | 4 ++-- 7 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/coins.cpp b/src/coins.cpp index 0c527d9a0..bb40af9cc 100644 --- a/src/coins.cpp +++ b/src/coins.cpp @@ -387,7 +387,7 @@ const CScript &CCoinsViewCache::GetSpendFor(const CTxIn& input) const } //uint64_t komodo_interest(int32_t txheight,uint64_t nValue,uint32_t nLockTime,uint32_t tiptime); -uint64_t komodo_accrued_interest(int32_t *txheightp,uint32_t *locktimep,uint256 hash,int32_t n,int32_t checkheight,uint64_t checkvalue); +uint64_t komodo_accrued_interest(int32_t *txheightp,uint32_t *locktimep,uint256 hash,int32_t n,int32_t checkheight,uint64_t checkvalue,int32_t tipheight); extern char ASSETCHAINS_SYMBOL[KOMODO_ASSETCHAIN_MAXLEN]; CAmount CCoinsViewCache::GetValueIn(int32_t nHeight,int64_t *interestp,const CTransaction& tx,uint32_t tiptime) const @@ -407,7 +407,7 @@ CAmount CCoinsViewCache::GetValueIn(int32_t nHeight,int64_t *interestp,const CTr if ( value >= 10*COIN ) { int64_t interest; int32_t txheight; uint32_t locktime; - interest = komodo_accrued_interest(&txheight,&locktime,tx.vin[i].prevout.hash,tx.vin[i].prevout.n,0,value); + interest = komodo_accrued_interest(&txheight,&locktime,tx.vin[i].prevout.hash,tx.vin[i].prevout.n,0,value,(int32_t)nHeight); //printf("nResult %.8f += val %.8f interest %.8f ht.%d lock.%u tip.%u\n",(double)nResult/COIN,(double)value/COIN,(double)interest/COIN,txheight,locktime,tiptime); //fprintf(stderr,"nResult %.8f += val %.8f interest %.8f ht.%d lock.%u tip.%u\n",(double)nResult/COIN,(double)value/COIN,(double)interest/COIN,txheight,locktime,tiptime); nResult += interest; diff --git a/src/komodo-tx.cpp b/src/komodo-tx.cpp index 504296044..da2a9ec2e 100644 --- a/src/komodo-tx.cpp +++ b/src/komodo-tx.cpp @@ -32,7 +32,7 @@ using namespace std; #include "komodo_interest.h" -uint64_t komodo_accrued_interest(int32_t *txheightp,uint32_t *locktimep,uint256 hash,int32_t n,int32_t checkheight,uint64_t checkvalue) +uint64_t komodo_accrued_interest(int32_t *txheightp,uint32_t *locktimep,uint256 hash,int32_t n,int32_t checkheight,uint64_t checkvalue,int32_t tipheight) { return(0); } diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index d7a467b44..bc61bc268 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -903,12 +903,13 @@ uint32_t komodo_interest_args(uint32_t *txheighttimep,int32_t *txheightp,uint32_ uint32_t locktime = 0; if ( n < tx.vout.size() ) { - if ( (pindex= mapBlockIndex[hashBlock]) != 0 && (tipindex= chainActive.Tip()) != 0 ) + if ( (pindex= mapBlockIndex[hashBlock]) != 0 ) { *valuep = tx.vout[n].nValue; *txheightp = pindex->nHeight; *txheighttimep = pindex->nTime; - *tiptimep = tipindex->nTime; + if ( *tiptimep == 0 && (tipindex= chainActive.Tip()) != 0 ) + *tiptimep = (uint32_t)tipindex->nTime; locktime = tx.nLockTime; //fprintf(stderr,"tx locktime.%u %.8f height.%d | tiptime.%u\n",locktime,(double)*valuep/COIN,*txheightp,*tiptimep); } @@ -917,9 +918,12 @@ uint32_t komodo_interest_args(uint32_t *txheighttimep,int32_t *txheightp,uint32_ } uint64_t komodo_interest(int32_t txheight,uint64_t nValue,uint32_t nLockTime,uint32_t tiptime); -uint64_t komodo_accrued_interest(int32_t *txheightp,uint32_t *locktimep,uint256 hash,int32_t n,int32_t checkheight,uint64_t checkvalue) + +uint64_t komodo_accrued_interest(int32_t *txheightp,uint32_t *locktimep,uint256 hash,int32_t n,int32_t checkheight,uint64_t checkvalue,int32_t tipheight) { - uint64_t value; uint32_t tiptime,txheighttimep; + uint64_t value; uint32_t tiptime=0,txheighttimep; CBlockIndex *pindex; + if ( (pindex= chainActive[tipheight]) != 0 ) + tiptime = (uint32_t)pindex->nTime; if ( (*locktimep= komodo_interest_args(&txheighttimep,txheightp,&tiptime,&value,hash,n)) != 0 ) { if ( (checkvalue == 0 || value == checkvalue) && (checkheight == 0 || *txheightp == checkheight) ) diff --git a/src/main.cpp b/src/main.cpp index af70ede77..fa62bdf38 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1986,12 +1986,12 @@ bool CheckTxInputs(const CTransaction& tx, CValidationState& state, const CCoins // Check for negative or overflow input values nValueIn += coins->vout[prevout.n].nValue; #ifdef KOMODO_ENABLE_INTEREST - if ( ASSETCHAINS_SYMBOL[0] == 0 && chainActive.Tip() != 0 && chainActive.Tip()->nHeight >= 60000 ) + if ( ASSETCHAINS_SYMBOL[0] == 0 && nSpendHeight > 60000 )//chainActive.Tip() != 0 && chainActive.Tip()->nHeight >= 60000 ) { if ( coins->vout[prevout.n].nValue >= 10*COIN ) { int64_t interest; int32_t txheight; uint32_t locktime; - if ( (interest= komodo_accrued_interest(&txheight,&locktime,prevout.hash,prevout.n,0,coins->vout[prevout.n].nValue)) != 0 ) + if ( (interest= komodo_accrued_interest(&txheight,&locktime,prevout.hash,prevout.n,0,coins->vout[prevout.n].nValue,(int32_t)nSpendHeight-1)) != 0 ) { fprintf(stderr,"checkResult %.8f += val %.8f interest %.8f ht.%d lock.%u tip.%u\n",(double)nValueIn/COIN,(double)coins->vout[prevout.n].nValue/COIN,(double)interest/COIN,txheight,locktime,chainActive.Tip()->nTime); nValueIn += interest; diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index eef2ab8bf..bb67c7b4d 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -843,7 +843,7 @@ UniValue paxprices(const UniValue& params, bool fHelp) return ret; } -uint64_t komodo_accrued_interest(int32_t *txheightp,uint32_t *locktimep,uint256 hash,int32_t n,int32_t checkheight,uint64_t checkvalue); +uint64_t komodo_accrued_interest(int32_t *txheightp,uint32_t *locktimep,uint256 hash,int32_t n,int32_t checkheight,uint64_t checkvalue,int32_t tipheight); UniValue gettxout(const UniValue& params, bool fHelp) { @@ -916,7 +916,7 @@ UniValue gettxout(const UniValue& params, bool fHelp) else ret.push_back(Pair("confirmations", pindex->nHeight - coins.nHeight + 1)); ret.push_back(Pair("value", ValueFromAmount(coins.vout[n].nValue))); uint64_t interest; int32_t txheight; uint32_t locktime; - if ( (interest= komodo_accrued_interest(&txheight,&locktime,hash,n,coins.nHeight,coins.vout[n].nValue)) != 0 ) + if ( (interest= komodo_accrued_interest(&txheight,&locktime,hash,n,coins.nHeight,coins.vout[n].nValue,(int32_t)pindex->nHeight)) != 0 ) ret.push_back(Pair("interest", ValueFromAmount(interest))); UniValue o(UniValue::VOBJ); ScriptPubKeyToJSON(coins.vout[n].scriptPubKey, o, true); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index bb5869a34..27e94134d 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -75,7 +75,7 @@ void EnsureWalletIsUnlocked() throw JSONRPCError(RPC_WALLET_UNLOCK_NEEDED, "Error: Please enter the wallet passphrase with walletpassphrase first."); } -uint64_t komodo_accrued_interest(int32_t *txheightp,uint32_t *locktimep,uint256 hash,int32_t n,int32_t checkheight,uint64_t checkvalue); +uint64_t komodo_accrued_interest(int32_t *txheightp,uint32_t *locktimep,uint256 hash,int32_t n,int32_t checkheight,uint64_t checkvalue,int32_t tipheight); uint64_t komodo_interest(int32_t txheight,uint64_t nValue,uint32_t nLockTime,uint32_t tiptime); void WalletTxToJSON(const CWalletTx& wtx, UniValue& entry) @@ -2675,9 +2675,9 @@ UniValue listunspent(const UniValue& params, bool fHelp) BlockMap::iterator it = mapBlockIndex.find(pcoinsTip->GetBestBlock()); CBlockIndex *tipindex,*pindex = it->second; uint64_t interest; uint32_t locktime; int32_t txheight; - komodo_accrued_interest(&txheight,&locktime,out.tx->GetHash(),out.i,0,nValue); if ( pindex != 0 && (tipindex= chainActive.Tip()) != 0 ) { + komodo_accrued_interest(&txheight,&locktime,out.tx->GetHash(),out.i,0,nValue,(int32_t)tipindex->nHeight); interest = komodo_interest(txheight,nValue,out.tx->nLockTime,tipindex->nTime); entry.push_back(Pair("interest",ValueFromAmount(interest))); } diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 4b2262851..8172c00e3 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -2247,7 +2247,7 @@ CAmount CWallet::GetImmatureWatchOnlyBalance() const * populate vCoins with vector of available COutputs. */ uint64_t komodo_interestnew(int32_t txheight,uint64_t nValue,uint32_t nLockTime,uint32_t tiptime); -uint64_t komodo_accrued_interest(int32_t *txheightp,uint32_t *locktimep,uint256 hash,int32_t n,int32_t checkheight,uint64_t checkvalue); +uint64_t komodo_accrued_interest(int32_t *txheightp,uint32_t *locktimep,uint256 hash,int32_t n,int32_t checkheight,uint64_t checkvalue,int32_t tipheight); void CWallet::AvailableCoins(vector& vCoins, bool fOnlyConfirmed, const CCoinControl *coinControl, bool fIncludeZeroValue, bool fIncludeCoinBase) const { @@ -2291,9 +2291,9 @@ void CWallet::AvailableCoins(vector& vCoins, bool fOnlyConfirmed, const { if ( pcoin->vout[i].nValue >= 10*COIN ) { - komodo_accrued_interest(&txheight,&locktime,wtxid,i,0,pcoin->vout[i].nValue); if ( (tipindex= chainActive.Tip()) != 0 ) { + komodo_accrued_interest(&txheight,&locktime,wtxid,i,0,pcoin->vout[i].nValue,(int32_t)tipindex->nHeight); interest = komodo_interestnew(txheight,pcoin->vout[i].nValue,locktime,tipindex->nTime); } else interest = 0; //interest = komodo_interestnew(chainActive.Tip()->nHeight+1,pcoin->vout[i].nValue,pcoin->nLockTime,chainActive.Tip()->nTime); From 8b53992182b73330e52044ea998e8ef5f2700e6c Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Mar 2018 15:45:00 +0300 Subject: [PATCH 0739/1062] Test --- src/komodo_bitcoind.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index bc61bc268..d79765e5c 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -924,6 +924,7 @@ uint64_t komodo_accrued_interest(int32_t *txheightp,uint32_t *locktimep,uint256 uint64_t value; uint32_t tiptime=0,txheighttimep; CBlockIndex *pindex; if ( (pindex= chainActive[tipheight]) != 0 ) tiptime = (uint32_t)pindex->nTime; + else printf("cant find height[%d]\n",tipheight); if ( (*locktimep= komodo_interest_args(&txheighttimep,txheightp,&tiptime,&value,hash,n)) != 0 ) { if ( (checkvalue == 0 || value == checkvalue) && (checkheight == 0 || *txheightp == checkheight) ) From 72070c9477017320019edda2581c1a1d3527c7eb Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Mar 2018 15:55:54 +0300 Subject: [PATCH 0740/1062] Test --- src/komodo_bitcoind.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index d79765e5c..34575f35d 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -923,8 +923,11 @@ uint64_t komodo_accrued_interest(int32_t *txheightp,uint32_t *locktimep,uint256 { uint64_t value; uint32_t tiptime=0,txheighttimep; CBlockIndex *pindex; if ( (pindex= chainActive[tipheight]) != 0 ) + { tiptime = (uint32_t)pindex->nTime; - else printf("cant find height[%d]\n",tipheight); + fprintf(stderr,"tipheight.%d -> %u\n",tipheight,tiptime); + } + else fprintf(stderr,"cant find height[%d]\n",tipheight); if ( (*locktimep= komodo_interest_args(&txheighttimep,txheightp,&tiptime,&value,hash,n)) != 0 ) { if ( (checkvalue == 0 || value == checkvalue) && (checkheight == 0 || *txheightp == checkheight) ) From 2da1debd06b5ece46f730ed9315734c40bd2f36f Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Mar 2018 16:10:12 +0300 Subject: [PATCH 0741/1062] Test --- src/komodo_bitcoind.h | 3 --- src/main.cpp | 7 ++++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 34575f35d..3c7003a70 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -923,10 +923,7 @@ uint64_t komodo_accrued_interest(int32_t *txheightp,uint32_t *locktimep,uint256 { uint64_t value; uint32_t tiptime=0,txheighttimep; CBlockIndex *pindex; if ( (pindex= chainActive[tipheight]) != 0 ) - { tiptime = (uint32_t)pindex->nTime; - fprintf(stderr,"tipheight.%d -> %u\n",tipheight,tiptime); - } else fprintf(stderr,"cant find height[%d]\n",tipheight); if ( (*locktimep= komodo_interest_args(&txheighttimep,txheightp,&tiptime,&value,hash,n)) != 0 ) { diff --git a/src/main.cpp b/src/main.cpp index fa62bdf38..45cf3116e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1993,7 +1993,7 @@ bool CheckTxInputs(const CTransaction& tx, CValidationState& state, const CCoins int64_t interest; int32_t txheight; uint32_t locktime; if ( (interest= komodo_accrued_interest(&txheight,&locktime,prevout.hash,prevout.n,0,coins->vout[prevout.n].nValue,(int32_t)nSpendHeight-1)) != 0 ) { -fprintf(stderr,"checkResult %.8f += val %.8f interest %.8f ht.%d lock.%u tip.%u\n",(double)nValueIn/COIN,(double)coins->vout[prevout.n].nValue/COIN,(double)interest/COIN,txheight,locktime,chainActive.Tip()->nTime); +//fprintf(stderr,"checkResult %.8f += val %.8f interest %.8f ht.%d lock.%u tip.%u\n",(double)nValueIn/COIN,(double)coins->vout[prevout.n].nValue/COIN,(double)interest/COIN,txheight,locktime,chainActive.Tip()->nTime); nValueIn += interest; } } @@ -2012,8 +2012,9 @@ fprintf(stderr,"checkResult %.8f += val %.8f interest %.8f ht.%d lock.%u tip.%u\ if (nValueIn < tx.GetValueOut()) { - fprintf(stderr,"valuein %s vs %s error\n",FormatMoney(nValueIn).c_str(), FormatMoney(tx.GetValueOut()).c_str()); - return state.DoS(100, error("CheckInputs(): %s value in (%s) < value out (%s) diff %.8f", + fprintf(stderr,"spentheight.%d valuein %s vs %s error\n",nSpendHeight,FormatMoney(nValueIn).c_str(), FormatMoney(tx.GetValueOut()).c_str()); + if ( nSpendHeight > 300000 ) + return state.DoS(100, error("CheckInputs(): %s value in (%s) < value out (%s) diff %.8f", tx.GetHash().ToString(), FormatMoney(nValueIn), FormatMoney(tx.GetValueOut()),((double)nValueIn - tx.GetValueOut())/COIN),REJECT_INVALID, "bad-txns-in-belowout"); } // Tally transaction fees From b3167f313c080f5becfe1e5c34800ff984f9edf7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Mar 2018 16:15:14 +0300 Subject: [PATCH 0742/1062] Test --- src/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 45cf3116e..e99a73d76 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2019,11 +2019,11 @@ bool CheckTxInputs(const CTransaction& tx, CValidationState& state, const CCoins } // Tally transaction fees CAmount nTxFee = nValueIn - tx.GetValueOut(); - if (nTxFee < 0) + if (nTxFee < 0 && nSpendHeight > 300000 ) return state.DoS(100, error("CheckInputs(): %s nTxFee < 0", tx.GetHash().ToString()), REJECT_INVALID, "bad-txns-fee-negative"); nFees += nTxFee; - if (!MoneyRange(nFees)) + if (!MoneyRange(nFees) && nSpendHeight > 300000 ) return state.DoS(100, error("CheckInputs(): nFees out of range"), REJECT_INVALID, "bad-txns-fee-outofrange"); return true; From f03351d46f30b9908b1df2585bff5fa20502d2c4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Mar 2018 16:22:37 +0300 Subject: [PATCH 0743/1062] Test --- src/komodo_bitcoind.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 3c7003a70..5c41783b4 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -716,7 +716,7 @@ void komodo_index2pubkey33(uint8_t *pubkey33,CBlockIndex *pindex,int32_t height) if ( komodo_blockload(block,pindex) == 0 ) { komodo_block2pubkey33(pubkey33,block); - if ( pubkey33[0] == 2 || pubkey33[0] == 3 ) + if ( 0 && (pubkey33[0] == 2 || pubkey33[0] == 3) ) { memcpy(pindex->pubkey33,pubkey33,33); if ( (num= komodo_notaries(pubkeys,(int32_t)pindex->nHeight,(uint32_t)pindex->nTime)) > 0 ) From 2c0218f0abaf425af694aab3c56677dee2b2f5a7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Mar 2018 16:23:01 +0300 Subject: [PATCH 0744/1062] Test --- src/main.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index e99a73d76..151c42383 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2013,17 +2013,16 @@ bool CheckTxInputs(const CTransaction& tx, CValidationState& state, const CCoins if (nValueIn < tx.GetValueOut()) { fprintf(stderr,"spentheight.%d valuein %s vs %s error\n",nSpendHeight,FormatMoney(nValueIn).c_str(), FormatMoney(tx.GetValueOut()).c_str()); - if ( nSpendHeight > 300000 ) - return state.DoS(100, error("CheckInputs(): %s value in (%s) < value out (%s) diff %.8f", + return state.DoS(100, error("CheckInputs(): %s value in (%s) < value out (%s) diff %.8f", tx.GetHash().ToString(), FormatMoney(nValueIn), FormatMoney(tx.GetValueOut()),((double)nValueIn - tx.GetValueOut())/COIN),REJECT_INVALID, "bad-txns-in-belowout"); } // Tally transaction fees CAmount nTxFee = nValueIn - tx.GetValueOut(); - if (nTxFee < 0 && nSpendHeight > 300000 ) + if (nTxFee < 0) return state.DoS(100, error("CheckInputs(): %s nTxFee < 0", tx.GetHash().ToString()), REJECT_INVALID, "bad-txns-fee-negative"); nFees += nTxFee; - if (!MoneyRange(nFees) && nSpendHeight > 300000 ) + if (!MoneyRange(nFees)) return state.DoS(100, error("CheckInputs(): nFees out of range"), REJECT_INVALID, "bad-txns-fee-outofrange"); return true; From 487f2319cd1d38f2f8a7e04021325c3059f5ac4f Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Mar 2018 18:17:21 +0300 Subject: [PATCH 0745/1062] Try again --- src/komodo_bitcoind.h | 13 +++++++------ src/miner.cpp | 7 ------- src/pow.cpp | 1 - src/rpcblockchain.cpp | 2 +- 4 files changed, 8 insertions(+), 15 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 5c41783b4..0c905e785 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -716,7 +716,7 @@ void komodo_index2pubkey33(uint8_t *pubkey33,CBlockIndex *pindex,int32_t height) if ( komodo_blockload(block,pindex) == 0 ) { komodo_block2pubkey33(pubkey33,block); - if ( 0 && (pubkey33[0] == 2 || pubkey33[0] == 3) ) + if ( (pubkey33[0] == 2 || pubkey33[0] == 3) ) { memcpy(pindex->pubkey33,pubkey33,33); if ( (num= komodo_notaries(pubkeys,(int32_t)pindex->nHeight,(uint32_t)pindex->nTime)) > 0 ) @@ -754,7 +754,7 @@ int8_t komodo_minerid(int32_t height,uint8_t *pubkey33) int32_t num,i,numnotaries; CBlockIndex *pindex; uint32_t timestamp=0; uint8_t _pubkey33[33],pubkeys[64][33]; if ( (pindex= chainActive[height]) != 0 ) { - if ( pindex->pubkey33[0] == 2 || pindex->pubkey33[0] == 3 ) + if ( (pindex->pubkey33[0] == 2 || pindex->pubkey33[0] == 3) ) { if ( pubkey33 != 0 ) memcpy(pubkey33,pindex->pubkey33,33); @@ -806,16 +806,17 @@ int32_t komodo_eligiblenotary(uint8_t pubkeys[66][33],int32_t *mids,int32_t *non else return(0); } -int32_t komodo_minerids(uint8_t *minerids,int32_t height,int32_t width) +int32_t komodo_minerids(uint8_t *minerids,int32_t height,int32_t width) // deprecate { - int32_t i,n=0; + /*int32_t i,n=0; for (i=0; i 0 ) fprintf(stderr,"ht.%d notaryid.%d already mined -i.%d nid.%d\n",height,notaryid,i,nid); diff --git a/src/miner.cpp b/src/miner.cpp index e820c42e5..9a8eb59a5 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -523,7 +523,6 @@ void IncrementExtraNonce(CBlock* pblock, CBlockIndex* pindexPrev, unsigned int& // // Internal miner // -int8_t komodo_minerid(int32_t height,uint8_t *pubkey33); CBlockTemplate* CreateNewBlockWithKey(CReserveKey& reservekey) { @@ -776,12 +775,6 @@ void static BitcoinMiner() break; if ( externalflag == 0 && i != 66 ) printf("VIOLATION at %d\n",i); - for (i=0; i<66; i++) - { break; - for (j=0; j<33; j++) - printf("%02x",pubkeys[i][j]); - printf(" p%d -> %d\n",i,komodo_minerid(pindexPrev->nHeight-i,pubkeys[i])); - } for (j=gpucount=0; j<65; j++) { if ( mids[j] >= 0 || notaryid == 34 ) diff --git a/src/pow.cpp b/src/pow.cpp index 4765699d4..76960933d 100644 --- a/src/pow.cpp +++ b/src/pow.cpp @@ -120,7 +120,6 @@ int32_t komodo_chosennotary(int32_t *notaryidp,int32_t height,uint8_t *pubkey33, int32_t komodo_is_special(int32_t height,uint8_t pubkey33[33],uint32_t timestamp); int32_t komodo_currentheight(); CBlockIndex *komodo_chainactive(int32_t height); -//int8_t komodo_minerid(int32_t height,uint8_t *pubkey33); void komodo_index2pubkey33(uint8_t *pubkey33,CBlockIndex *pindex,int32_t height); extern int32_t KOMODO_CHOSEN_ONE; extern char ASSETCHAINS_SYMBOL[]; diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index bb67c7b4d..1254217ac 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -636,7 +636,7 @@ UniValue minerids(const UniValue& params, bool fHelp) if ( pblockindex != 0 ) timestamp = pblockindex->GetBlockTime(); } - if ( (n= komodo_minerids(minerids,height,(int32_t)(sizeof(minerids)/sizeof(*minerids)))) > 0 ) + if ( 0 && (n= komodo_minerids(minerids,height,(int32_t)(sizeof(minerids)/sizeof(*minerids)))) > 0 ) { memset(tally,0,sizeof(tally)); numnotaries = komodo_notaries(pubkeys,height,timestamp); From 51aad1873397455645fcd188b2ae406fa44c9646 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Mon, 26 Mar 2018 16:21:33 -0300 Subject: [PATCH 0746/1062] remove replacementpool --- qa/cryptoconditions/test_integration.py | 86 +++- qa/cryptoconditions/testsupport.py | 10 +- src/Makefile.am | 9 +- src/Makefile.ktest.include | 16 - src/cryptoconditions/Makefile.am | 16 +- .../include/cryptoconditions.h | 1 + src/komodo_cryptoconditions.cpp | 79 +--- src/komodo_cryptoconditions.h | 7 +- src/main.cpp | 206 +++----- src/main.h | 2 +- src/replacementpool.cpp | 88 ---- src/replacementpool.h | 76 --- src/secp256k1/include/secp256k1.h | 12 + src/secp256k1/src/secp256k1.c | 8 + src/test-komodo/main.cpp | 9 - src/test-komodo/test_replacementpool.cpp | 440 ------------------ 16 files changed, 190 insertions(+), 875 deletions(-) delete mode 100644 src/Makefile.ktest.include delete mode 100644 src/replacementpool.cpp delete mode 100644 src/replacementpool.h delete mode 100644 src/test-komodo/main.cpp delete mode 100644 src/test-komodo/test_replacementpool.cpp diff --git a/qa/cryptoconditions/test_integration.py b/qa/cryptoconditions/test_integration.py index 16b5f93a6..bd72b961d 100644 --- a/qa/cryptoconditions/test_integration.py +++ b/qa/cryptoconditions/test_integration.py @@ -4,7 +4,6 @@ import json import logging import binascii import struct -import base64 from testsupport import * @@ -91,7 +90,91 @@ def test_oversize_fulfillment(inp): assert 'scriptsig-size' in str(e), str(e) +@fanout_input(6) +def test_aux_basic(inp): + aux_cond = { + 'type': 'aux-sha-256', + 'method': 'equals', + 'conditionAux': 'LTE', + 'fulfillmentAux': 'LTE' + } + + # Setup some aux outputs + spend0 = { + 'inputs': [inp], + 'outputs': [ + {'amount': 500, 'script': {'condition': aux_cond}}, + {'amount': 500, 'script': {'condition': aux_cond}} + ] + } + spend0_txid = submit(sign(spend0)) + assert rpc.getrawtransaction(spend0_txid) + + # Test a good fulfillment + spend1 = { + 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {'fulfillment': aux_cond}}], + 'outputs': [{'amount': 500, 'script': {'condition': aux_cond}}] + } + spend1_txid = submit(sign(spend1)) + assert rpc.getrawtransaction(spend1_txid) + + # Test a bad fulfillment + aux_cond['fulfillmentAux'] = 'WYW' + spend2 = { + 'inputs': [{'txid': spend0_txid, 'idx': 1, 'script': {'fulfillment': aux_cond}}], + 'outputs': [{'amount': 500, 'script': {'condition': aux_cond}}] + } + try: + assert not submit(sign(spend2)), 'should raise an error' + except RPCError as e: + assert SCRIPT_FALSE in str(e), str(e) + + @fanout_input(7) +def test_aux_complex(inp): + aux_cond = { + 'type': 'aux-sha-256', + 'method': 'inputIsReturn', + 'conditionAux': '', + 'fulfillmentAux': 'AQ' # \1 (tx.vout[1]) + } + + # Setup some aux outputs + spend0 = { + 'inputs': [inp], + 'outputs': [ + {'amount': 500, 'script': {'condition': aux_cond}}, + {'amount': 500, 'script': {'condition': aux_cond}} + ] + } + spend0_txid = submit(sign(spend0)) + assert rpc.getrawtransaction(spend0_txid) + + # Test a good fulfillment + spend1 = { + 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {'fulfillment': aux_cond}}], + 'outputs': [ + {'amount': 250, 'script': {'condition': aux_cond}}, + {'amount': 250, 'script': "6A0B68656C6C6F207468657265"} # OP_RETURN somedata + ] + } + spend1_txid = submit(sign(spend1)) + assert rpc.getrawtransaction(spend1_txid) + + # Test a bad fulfillment + spend2 = { + 'inputs': [{'txid': spend0_txid, 'idx': 1, 'script': {'fulfillment': aux_cond}}], + 'outputs': [ + {'amount': 500, 'script': "6A0B68656C6C6F207468657265"} # OP_RETURN somedata + ] + } + try: + assert not submit(sign(spend2)), 'should raise an error' + except RPCError as e: + assert SCRIPT_FALSE in str(e), str(e) + + +@fanout_input(8) def test_secp256k1_condition(inp): ec_cond = { 'type': 'secp256k1-sha-256', @@ -130,6 +213,7 @@ def test_secp256k1_condition(inp): except RPCError as e: assert SCRIPT_FALSE in str(e), str(e) + if __name__ == '__main__': logging.basicConfig(level=logging.INFO) for name, f in globals().items(): diff --git a/qa/cryptoconditions/testsupport.py b/qa/cryptoconditions/testsupport.py index 055f4cc30..e22520f3f 100644 --- a/qa/cryptoconditions/testsupport.py +++ b/qa/cryptoconditions/testsupport.py @@ -32,7 +32,7 @@ class JsonClient(object): def run_cmd(cmd): proc = subprocess.Popen(cmd, stdout=subprocess.PIPE) - assert proc.wait() == 0, cmd + assert proc.wait() == 0 return proc.stdout.read() @@ -68,7 +68,7 @@ def wait_for_block(height): try: return rpc.getblock(str(height)) except RPCError as e: - time.sleep(1) + time.sleep(3) raise Exception('Time out waiting for block at height %s' % height) @@ -97,7 +97,7 @@ def get_fanout_txid(): reward_tx = hoek.decodeTx({'hex': reward_tx_raw}) balance = reward_tx['outputs'][0]['amount'] - n_outs = 40 + n_outs = 16 remainder = balance - n_outs * 1000 fanout = { @@ -109,9 +109,7 @@ def get_fanout_txid(): ] + [{"amount": remainder, 'script': {'address': notary_addr}}]) } - txid = submit(sign(fanout)) - rpc.getrawtransaction(txid) - return txid + return submit(sign(fanout)) def fanout_input(n): diff --git a/src/Makefile.am b/src/Makefile.am index 7c0200623..00242776f 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -39,7 +39,7 @@ LIBBITCOIN_CLI=libbitcoin_cli.a LIBBITCOIN_UTIL=libbitcoin_util.a LIBBITCOIN_CRYPTO=crypto/libbitcoin_crypto.a LIBSECP256K1=secp256k1/libsecp256k1.la -LIBCRYPTOCONDITIONS=cryptoconditions/libcryptoconditions.la +LIBCRYPTOCONDITIONS=cryptoconditions/cryptoconditions_core.a LIBUNIVALUE=univalue/libunivalue.la LIBZCASH=libzcash.a -lcurl @@ -156,7 +156,6 @@ BITCOIN_CORE_H = \ protocol.h \ pubkey.h \ random.h \ - replacementpool.h \ reverselock.h \ rpcclient.h \ rpcprotocol.h \ @@ -235,7 +234,6 @@ libbitcoin_server_a_SOURCES = \ noui.cpp \ policy/fees.cpp \ pow.cpp \ - replacementpool.cpp \ rest.cpp \ rpcblockchain.cpp \ rpcmining.cpp \ @@ -562,10 +560,9 @@ endif @test -f $(PROTOC) $(AM_V_GEN) $(PROTOC) --cpp_out=$(@D) --proto_path=$(abspath $( +#include #ifndef CRYPTOCONDITIONS_H diff --git a/src/komodo_cryptoconditions.cpp b/src/komodo_cryptoconditions.cpp index e2695af40..4ebbebbeb 100644 --- a/src/komodo_cryptoconditions.cpp +++ b/src/komodo_cryptoconditions.cpp @@ -1,94 +1,21 @@ - -#include "replacementpool.h" #include "komodo_cryptoconditions.h" #include "cryptoconditions/include/cryptoconditions.h" -bool ASSETCHAINS_CC_TEST = false; - - /* * Evaluate the validity of an Eval node */ bool EvalConditionValidity(const CC *cond, const CTransaction *txTo) { - if (ASSETCHAINS_CC_TEST) { - if (strcmp(cond->method, "testEval") == 0) { - return cond->paramsBinLength == 8 && - memcmp(cond->paramsBin, "testEval", 8) == 0; - } - if (strcmp(cond->method, "testReplace") == 0) { - std::vector data; - auto out = txTo->vout[txTo->vout.size()-1]; // Last output is data - return GetOpReturnData(out.scriptPubKey, data) && data.size() == 2; - } + if (strcmp(cond->method, "testEval") == 0) { + return cond->paramsBinLength == 8 && + memcmp(cond->paramsBin, "testEval", 8) == 0; } fprintf(stderr, "no defined behaviour for method: %s\n", cond->method); return 0; } -/* - * Evaluate the priority of an eval node. - * - * This method should set the ->priority and ->replacementWindow (in blocks) - * of the provided replacement pool item. Priority is a 64 bit unsigned int and - * 0 is invalid. - * - * This method does not need to validate, that is done separately. Actually, - * this method will nearly always be called with the same condition and transaction - * in sequence after EvalConditionValidity. If performance became an issue, a very - * small LRU cache could be used to cache a result. - */ -bool EvalConditionPriority(const CC *cond, CTxReplacementPoolItem *rep) -{ - if (ASSETCHAINS_CC_TEST) { - if (strcmp((const char*)cond->method, "testReplace") == 0) { - std::vector data; - auto out = rep->tx.vout[rep->tx.vout.size()-1]; // Last output is data - if (GetOpReturnData(out.scriptPubKey, data)) { - rep->replacementWindow = (int) data[0]; - rep->priority = (uint64_t) data[1]; - return true; - } - } - } - return false; -} - - -int visitConditionPriority(CC *cond, struct CCVisitor visitor) -{ - auto rep = (CTxReplacementPoolItem*)visitor.context; - // visitor protocol is 1 for continue, 0 for stop - return !(cc_typeId(cond) == CC_Eval && EvalConditionPriority(cond, rep)); -} - - -/* - * Try to get replacement parameters from a transaction in &rep. - */ -bool SetReplacementParams(CTxReplacementPoolItem &rep) -{ - // first, see if we have a cryptocondition - const CScript &sig = rep.tx.vin[0].scriptSig; - if (!sig.IsPushOnly()) return false; - CScript::const_iterator pc = sig.begin(); - std::vector data; - opcodetype opcode; - if (!sig.GetOp(pc, opcode, data)) return false; - CC *cond = cc_readFulfillmentBinary((unsigned char*)data.data(), data.size()); - if (!cond) return false; - - // now, see if it has a replacement node - CC *replacementNode = 0; - CCVisitor visitor = {&visitConditionPriority, (const unsigned char*)"", 0, &rep}; - bool out = cc_visit(cond, visitor); - cc_free(cond); - return !out; -} - - bool GetOpReturnData(const CScript &sig, std::vector &data) { auto pc = sig.begin(); diff --git a/src/komodo_cryptoconditions.h b/src/komodo_cryptoconditions.h index de12140ef..4edc2bedc 100644 --- a/src/komodo_cryptoconditions.h +++ b/src/komodo_cryptoconditions.h @@ -1,24 +1,19 @@ #ifndef KOMODO_CRYPTOCONDITIONS_H #define KOMODO_CRYPTOCONDITIONS_H -#include "replacementpool.h" #include "cryptoconditions/include/cryptoconditions.h" +#include "primitives/transaction.h" #include "script/script.h" extern int32_t ASSETCHAINS_CC; -extern bool ASSETCHAINS_CC_TEST; static bool IsCryptoConditionsEnabled() { return 0 != ASSETCHAINS_CC; } -extern CTxReplacementPool replacementPool; - bool EvalConditionValidity(const CC *cond, const CTransaction *tx); -bool SetReplacementParams(CTxReplacementPoolItem &rep); - bool GetOpReturnData(const CScript &sig, std::vector &data); #endif /* KOMODO_CRYPTOCONDITIONS_H */ diff --git a/src/main.cpp b/src/main.cpp index fa366964f..86b52495a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -21,8 +21,6 @@ #include "pow.h" #include "txdb.h" #include "txmempool.h" -#include "replacementpool.h" -#include "komodo_cryptoconditions.h" #include "ui_interface.h" #include "undo.h" #include "util.h" @@ -55,7 +53,6 @@ extern uint8_t NOTARY_PUBKEY33[33]; BlockMap mapBlockIndex; CChain chainActive; - CBlockIndex *pindexBestHeader = NULL; int64_t nTimeBestReceived = 0; CWaitableCriticalSection csBestBlock; @@ -1110,45 +1107,7 @@ CAmount GetMinRelayFee(const CTransaction& tx, unsigned int nBytes, bool fAllowF } -/* - * This should be called from AcceptToMemoryPool in order - * to perform all validations. - */ -bool AcceptToReplacementPool(const CTransaction &tx, CValidationState &state) -{ - // This is not actually required; if crypto-conditions is disabled, then transactions - // with replaceable outputs will not be accepted as standard. However, just to be a - // bit more explicit. - if (!IsCryptoConditionsEnabled()) return false; - - CTxReplacementPoolItem item(tx, GetHeight()); - if (!SetReplacementParams(item)) return false; - - switch (replacementPool.replace(item)) { - - case RP_Accept: - return true; - - case RP_HaveBetter: - // already have a better one - fprintf(stderr,"accept failure.20\n"); - return state.Invalid(error("AcceptToMemoryPool: Replacement is worse"), - REJECT_HAVEBETTER, "replacement-is-worse"); - - case RP_Invalid: - // Not valid according to replaceability rules - fprintf(stderr,"accept failure.22\n"); - return state.Invalid(error("AcceptToMemoryPool: Replacement has multiple inputs"), - REJECT_INVALID, "replacement-invalid"); - - default: - return false; - } -} - - - -bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree,bool* pfMissingInputs, bool fRejectAbsurdFee, bool fAcceptReplacement) +bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree,bool* pfMissingInputs, bool fRejectAbsurdFee) { AssertLockHeld(cs_main); if (pfMissingInputs) @@ -1372,20 +1331,14 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa return error("AcceptToMemoryPool: BUG! PLEASE REPORT THIS! ConnectInputs failed against MANDATORY but not STANDARD flags %s", hash.ToString()); } + // Store transaction in memory if ( komodo_is_notarytx(tx) == 0 ) KOMODO_ON_DEMAND++; - - if (fAcceptReplacement) - { - if (AcceptToReplacementPool(tx, state)) return true; - if (state.IsInvalid()) return false; - } - - // Store transaction in memory pool.addUnchecked(hash, entry, !IsInitialBlockDownload()); } SyncWithWallets(tx, NULL); + return true; } @@ -1401,12 +1354,6 @@ bool GetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock return true; } - // replacementPool lookup is O(n) since there's no index by txid - if (fAllowSlow && replacementPool.lookup(hash, txOut)) - { - return true; - } - if (fTxIndex) { CDiskTxPos postx; if (pblocktree->ReadTxIndex(hash, postx)) { @@ -1456,21 +1403,6 @@ bool GetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock return false; } - -void ProcessOrphanTransactions(uint256 initialHash); - -void ProcessReplacementPool(int newHeight) -{ - std::vector pending; - replacementPool.removePending(newHeight, pending); - CValidationState stateDummy; - BOOST_FOREACH(CTransaction tx, pending) { - if (AcceptToMemoryPool(mempool, stateDummy, tx, false, NULL, false, false)) - ProcessOrphanTransactions(tx.GetHash()); - // otherwise silently drop. TODO: log - } -} - /*char *komodo_getspendscript(uint256 hash,int32_t n) { CTransaction tx; uint256 hashBlock; @@ -2000,7 +1932,7 @@ bool ContextualCheckInputs(const CTransaction& tx, CValidationState &state, cons // as to the correct behavior - we may want to continue // peering with non-upgraded nodes even after a soft-fork // super-majority vote has passed. - return state.DoS(100, false, REJECT_INVALID, strprintf("mandatory-script-verify-flag-failed (%s)", ScriptErrorString(check.GetScriptError()))); + return state.DoS(100,false, REJECT_INVALID, strprintf("mandatory-script-verify-flag-failed (%s)", ScriptErrorString(check.GetScriptError()))); } } } @@ -2770,13 +2702,6 @@ bool static DisconnectTip(CValidationState &state) { // Update cached incremental witnesses //fprintf(stderr,"chaintip false\n"); GetMainSignals().ChainTip(pindexDelete, &block, newTree, false); - - /* if chain tip disconnects, some transactions may return to the replacementPool - * via AcceptToMemoryPool. - * - * No double send conflicts may result as the winning transaction will be picked. - */ - return true; } @@ -2836,8 +2761,6 @@ bool static ConnectTip(CValidationState &state, CBlockIndex *pindexNew, CBlock * mempool.check(pcoinsTip); // Update chainActive & related variables. UpdateTip(pindexNew); - // Process pending replacements - ProcessReplacementPool(pindexNew->nHeight); // Tell wallet about transactions that went from mempool // to conflicted: BOOST_FOREACH(const CTransaction &tx, txConflicted) { @@ -2847,7 +2770,6 @@ bool static ConnectTip(CValidationState &state, CBlockIndex *pindexNew, CBlock * BOOST_FOREACH(const CTransaction &tx, pblock->vtx) { SyncWithWallets(tx, pblock); } - // Update cached incremental witnesses //fprintf(stderr,"chaintip true\n"); GetMainSignals().ChainTip(pindexNew, pblock, oldTree, true); @@ -4748,70 +4670,6 @@ void static ProcessGetData(CNode* pfrom) } } - -void ProcessOrphanTransactions(uint256 parentHash) -{ - AssertLockHeld(cs_main); - - vector vWorkQueue, vEraseQueue; - // Recursively process any orphan transactions that depended on this one - vWorkQueue.push_back(parentHash); - set setMisbehaving; - - for (unsigned int i = 0; i < vWorkQueue.size(); i++) - { - map >::iterator itByPrev = mapOrphanTransactionsByPrev.find(vWorkQueue[i]); - if (itByPrev == mapOrphanTransactionsByPrev.end()) - continue; - for (set::iterator mi = itByPrev->second.begin(); - mi != itByPrev->second.end(); - ++mi) - { - const uint256& orphanHash = *mi; - const CTransaction& orphanTx = mapOrphanTransactions[orphanHash].tx; - NodeId fromPeer = mapOrphanTransactions[orphanHash].fromPeer; - bool fMissingInputs2 = false; - // Use a dummy CValidationState so someone can't setup nodes to counter-DoS based on orphan - // resolution (that is, feeding people an invalid transaction based on LegitTxX in order to get - // anyone relaying LegitTxX banned) - CValidationState stateDummy; - - - if (setMisbehaving.count(fromPeer)) - continue; - if (AcceptToMemoryPool(mempool, stateDummy, orphanTx, true, &fMissingInputs2)) - { - LogPrint("mempool", " accepted orphan tx %s\n", orphanHash.ToString()); - RelayTransaction(orphanTx); - vWorkQueue.push_back(orphanHash); - vEraseQueue.push_back(orphanHash); - } - else if (!fMissingInputs2) - { - int nDos = 0; - if (stateDummy.IsInvalid(nDos) && nDos > 0) - { - // Punish peer that gave us an invalid orphan tx - Misbehaving(fromPeer, nDos); - setMisbehaving.insert(fromPeer); - LogPrint("mempool", " invalid orphan tx %s\n", orphanHash.ToString()); - } - // Has inputs but not accepted to mempool - // Probably non-standard or insufficient fee/priority - LogPrint("mempool", " removed orphan tx %s\n", orphanHash.ToString()); - vEraseQueue.push_back(orphanHash); - assert(recentRejects); - recentRejects->insert(orphanHash); - } - mempool.check(pcoinsTip); - } - } - - BOOST_FOREACH(uint256 hash, vEraseQueue) - EraseOrphanTx(hash); -} - - bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, int64_t nTimeReceived) { const CChainParams& chainparams = Params(); @@ -5212,6 +5070,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, else if (strCommand == "tx") { + vector vWorkQueue; + vector vEraseQueue; CTransaction tx; vRecv >> tx; @@ -5230,14 +5090,66 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, { mempool.check(pcoinsTip); RelayTransaction(tx); + vWorkQueue.push_back(inv.hash); LogPrint("mempool", "AcceptToMemoryPool: peer=%d %s: accepted %s (poolsz %u)\n", pfrom->id, pfrom->cleanSubVer, tx.GetHash().ToString(), mempool.mapTx.size()); - ProcessOrphanTransactions(inv.hash); + // Recursively process any orphan transactions that depended on this one + set setMisbehaving; + for (unsigned int i = 0; i < vWorkQueue.size(); i++) + { + map >::iterator itByPrev = mapOrphanTransactionsByPrev.find(vWorkQueue[i]); + if (itByPrev == mapOrphanTransactionsByPrev.end()) + continue; + for (set::iterator mi = itByPrev->second.begin(); + mi != itByPrev->second.end(); + ++mi) + { + const uint256& orphanHash = *mi; + const CTransaction& orphanTx = mapOrphanTransactions[orphanHash].tx; + NodeId fromPeer = mapOrphanTransactions[orphanHash].fromPeer; + bool fMissingInputs2 = false; + // Use a dummy CValidationState so someone can't setup nodes to counter-DoS based on orphan + // resolution (that is, feeding people an invalid transaction based on LegitTxX in order to get + // anyone relaying LegitTxX banned) + CValidationState stateDummy; + + if (setMisbehaving.count(fromPeer)) + continue; + if (AcceptToMemoryPool(mempool, stateDummy, orphanTx, true, &fMissingInputs2)) + { + LogPrint("mempool", " accepted orphan tx %s\n", orphanHash.ToString()); + RelayTransaction(orphanTx); + vWorkQueue.push_back(orphanHash); + vEraseQueue.push_back(orphanHash); + } + else if (!fMissingInputs2) + { + int nDos = 0; + if (stateDummy.IsInvalid(nDos) && nDos > 0) + { + // Punish peer that gave us an invalid orphan tx + Misbehaving(fromPeer, nDos); + setMisbehaving.insert(fromPeer); + LogPrint("mempool", " invalid orphan tx %s\n", orphanHash.ToString()); + } + // Has inputs but not accepted to mempool + // Probably non-standard or insufficient fee/priority + LogPrint("mempool", " removed orphan tx %s\n", orphanHash.ToString()); + vEraseQueue.push_back(orphanHash); + assert(recentRejects); + recentRejects->insert(orphanHash); + } + mempool.check(pcoinsTip); + } + } + + BOOST_FOREACH(uint256 hash, vEraseQueue) + EraseOrphanTx(hash); } // TODO: currently, prohibit joinsplits from entering mapOrphans else if (fMissingInputs && tx.vjoinsplit.size() == 0) diff --git a/src/main.h b/src/main.h index 061dcfcc5..bcdd04a5e 100644 --- a/src/main.h +++ b/src/main.h @@ -250,7 +250,7 @@ void PruneAndFlush(); /** (try to) add transaction to memory pool **/ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree, - bool* pfMissingInputs, bool fRejectAbsurdFee=false, bool fAcceptReplacement=true); + bool* pfMissingInputs, bool fRejectAbsurdFee=false); struct CNodeStateStats { diff --git a/src/replacementpool.cpp b/src/replacementpool.cpp deleted file mode 100644 index 168c30b6e..000000000 --- a/src/replacementpool.cpp +++ /dev/null @@ -1,88 +0,0 @@ - -#include "main.h" -#include "replacementpool.h" -#include "sync.h" - - -CTxReplacementPool replacementPool; -CCriticalSection cs_replacementPool; - - -/* - * Validate the item - * - * Compare the item with any current replacement candidate - * - * Ensure that the item is not passed the replacement window - * - * Insert the item into the map - */ -CTxReplacementPoolResult CTxReplacementPool::replace(CTxReplacementPoolItem &item) -{ - LOCK(cs_replacementPool); - - // Replaceable transactions with multiple inputs are disabled - // until someone figures out how they would work. - if (item.tx.vin.size() > 1) return RP_Invalid; - - // replacementWindow of 0 goes direct to mempool - if (item.replacementWindow == 0) - { - // But we also need to remove replacement candidates - replaceMap.erase(item.tx.vin[0].prevout); - return RP_NoReplace; - } - - int startBlock = item.startBlock; - - auto it = replaceMap.find(item.tx.vin[0].prevout); - if (it != replaceMap.end()) - { - if (it->second.replacementWindow <= item.replacementWindow && - it->second.priority >= item.priority) { - return RP_HaveBetter; - } - startBlock = it->second.startBlock; - } - - // This transaction has higher priority - replaceMap[item.tx.vin[0].prevout] = item; - replaceMap[item.tx.vin[0].prevout].startBlock = startBlock; - return RP_Accept; -} - - -/* - * Remove and return any spends that have matured - */ -void CTxReplacementPool::removePending(int height, std::vector &txs) -{ - LOCK(cs_replacementPool); - - for (auto it = replaceMap.begin(); it != replaceMap.end(); /**/) { - CTxReplacementPoolItem &rep = it->second; - - if (rep.GetTargetBlock() <= height) { - txs.push_back(rep.tx); - replaceMap.erase(it++); - } else { - ++it; - } - } -} - - -/* - * O(n) lookup of tx by hash - */ -bool CTxReplacementPool::lookup(uint256 txHash, CTransaction &tx) -{ - LOCK(cs_replacementPool); - for (auto it = replaceMap.begin(); it != replaceMap.end(); it++) { - if (it->second.tx.GetHash() == txHash) { - tx = it->second.tx; - return true; - } - } - return false; -} diff --git a/src/replacementpool.h b/src/replacementpool.h deleted file mode 100644 index d6ab2ed28..000000000 --- a/src/replacementpool.h +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright (c) 2018 The Komodo Developers -// Distributed under the MIT software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. - -#ifndef KOMODO_REPLACEMENTCACHE_H -#define KOMODO_REPLACEMENTCACHE_H - -#include "primitives/transaction.h" - - -// My kingdom for a proper sum type... -enum CTxReplacementPoolResult { - RP_Accept, - RP_HaveBetter, - RP_Invalid, - RP_NoReplace -}; - - -class CTxReplacementPoolItem -{ -public: - CTransaction tx; - int startBlock; - uint64_t priority; - uint32_t replacementWindow; - - CTxReplacementPoolItem() {} - - CTxReplacementPoolItem(const CTransaction &_tx, int _startBlock) { - tx = _tx; - startBlock = _startBlock; - priority = 0; - replacementWindow = 0; - } - - int GetTargetBlock() { return startBlock + replacementWindow; } -}; - -/** - * CTxReplacementPool stores transactions that are valid but held for - * period of time during which they may be replaced. - * - * Transactions are added when they are found to be valid but not added - * to the mempool until a timeout. - * - * Replacement pool is like another mempool before the main mempool. - * - * Transactions in the replacement pool are indexed by the output - * that they are spending. Once a replaceable transaction tries to - * spend an output, a countdown of blocks begins at the current block - * plus a window that is set by "userland" code. If another, better - * transaction replaces the spend that's already pending, the countdown - * start block remains the same. - */ -class CTxReplacementPool -{ -private: - /* Index of spends that may be replaced */ - std::map replaceMap; -public: - /* Try to replace a transaction in the index */ - CTxReplacementPoolResult replace(CTxReplacementPoolItem &item); - - /* Remove and return all transactions up to a given block height */ - void removePending(int height, std::vector &txs); - - /* Find a transaction in the index by it's hash. */ - bool lookup(uint256 txHash, CTransaction &tx); -}; - - -/* Global instance */ -extern CTxReplacementPool replacementPool; - -#endif // KOMODO_REPLACEMENTCACHE_H diff --git a/src/secp256k1/include/secp256k1.h b/src/secp256k1/include/secp256k1.h index 06afd4c65..9db5cf3a8 100644 --- a/src/secp256k1/include/secp256k1.h +++ b/src/secp256k1/include/secp256k1.h @@ -95,6 +95,18 @@ SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_verify( int pubkeylen ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(5); +/** Check that signature is in canonical form + * Returns: 1: In canonical form + * 0: Non canonical + * -1: invalid signature + * In: sig: the signature being verified (cannot be NULL) + * siglen: the length of the signature + */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_check_canonical_sig( + const unsigned char *sig, + int siglen +) SECP256K1_ARG_NONNULL(1); + /** A pointer to a function to deterministically generate a nonce. * Returns: 1 if a nonce was successfully generated. 0 will cause signing to fail. * In: msg32: the 32-byte message hash being verified (will not be NULL) diff --git a/src/secp256k1/src/secp256k1.c b/src/secp256k1/src/secp256k1.c index d6192dc4e..48569ad9e 100644 --- a/src/secp256k1/src/secp256k1.c +++ b/src/secp256k1/src/secp256k1.c @@ -85,6 +85,14 @@ int secp256k1_ecdsa_verify(const secp256k1_context_t* ctx, const unsigned char * return ret; } + +int secp256k1_ecdsa_check_canonical_sig(const unsigned char *sig, int siglen) { + secp256k1_ecdsa_sig_t s; + if (!secp256k1_ecdsa_sig_parse(&s, sig, siglen)) return -1; + return !secp256k1_scalar_is_high(&s.s); +} + + static int nonce_function_rfc6979(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, unsigned int counter, const void *data) { secp256k1_rfc6979_hmac_sha256_t rng; unsigned int i; diff --git a/src/test-komodo/main.cpp b/src/test-komodo/main.cpp deleted file mode 100644 index 7811d5f9a..000000000 --- a/src/test-komodo/main.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include "gtest/gtest.h" -#include "crypto/common.h" - -int main(int argc, char **argv) { - assert(init_and_check_sodium() != -1); - - testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/src/test-komodo/test_replacementpool.cpp b/src/test-komodo/test_replacementpool.cpp deleted file mode 100644 index b0ccc4278..000000000 --- a/src/test-komodo/test_replacementpool.cpp +++ /dev/null @@ -1,440 +0,0 @@ -#include -#include - -#include "base58.h" -#include "core_io.h" -#include "key.h" -#include "komodo_cryptoconditions.h" -#include "main.h" -#include "miner.h" -#include "random.h" -#include "rpcserver.h" -#include "rpcprotocol.h" -#include "replacementpool.h" -#include "txdb.h" -#include "util.h" -#include "utilstrencodings.h" -#include "utiltime.h" -#include "consensus/validation.h" -#include "primitives/transaction.h" -#include "script/interpreter.h" -#include "cryptoconditions/include/cryptoconditions.h" - - -extern int32_t USE_EXTERNAL_PUBKEY; -extern std::string NOTARY_PUBKEY; -std::string _NOTARY_PUBKEY = "0205a8ad0c1dbc515f149af377981aab58b836af008d4d7ab21bd76faf80550b47"; -std::string NOTARY_SECRET = "UxFWWxsf1d7w7K5TvAWSkeX4H95XQKwdwGv49DXwWUTzPTTjHBbU"; -CKey notaryKey; - -#define VCH(a,b) std::vector(a, a + b) - - -/* - * We need to have control of clock, - * otherwise block production can fail. - */ -int64_t nMockTime; - - -void testSetup() -{ - SelectParams(CBaseChainParams::REGTEST); - - // enable CC - ASSETCHAINS_CC = 1; - ASSETCHAINS_CC_TEST = true; - - // Settings to get block reward - NOTARY_PUBKEY = _NOTARY_PUBKEY; - USE_EXTERNAL_PUBKEY = 1; - mapArgs["-mineraddress"] = "bogus"; - COINBASE_MATURITY = 1; - // Global mock time - nMockTime = GetTime(); - - // Init blockchain - ClearDatadirCache(); - auto pathTemp = GetTempPath() / strprintf("test_komodo_%li_%i", GetTime(), GetRand(100000)); - boost::filesystem::create_directories(pathTemp); - mapArgs["-datadir"] = pathTemp.string(); - pblocktree = new CBlockTreeDB(1 << 20, true); - CCoinsViewDB *pcoinsdbview = new CCoinsViewDB(1 << 23, true); - pcoinsTip = new CCoinsViewCache(pcoinsdbview); - InitBlockIndex(); - - // Set address - ECC_Start(); - - // Notary key - CBitcoinSecret vchSecret; - // this returns false due to network prefix mismatch but works anyway - vchSecret.SetString(NOTARY_SECRET); - notaryKey = vchSecret.GetKey(); -} - - -void generateBlock(CBlock *block=NULL) -{ - UniValue params; - params.setArray(); - params.push_back(1); - uint256 blockId; - - SetMockTime(nMockTime++); // CreateNewBlock can fail if not enough time passes - - try { - UniValue out = generate(params, false); - blockId.SetHex(out[0].getValStr()); - } catch (const UniValue& e) { - FAIL() << "failed to create block: " << e.write().data(); - } - if (block) ASSERT_TRUE(ReadBlockFromDisk(*block, mapBlockIndex[blockId])); -} - - -void acceptTx(const CTransaction tx) -{ - CValidationState state; - LOCK(cs_main); - if (!AcceptToMemoryPool(mempool, state, tx, false, NULL)) - FAIL() << state.GetRejectReason(); -} - - -static CMutableTransaction spendTx(const CTransaction &txIn, int nOut=0) -{ - CMutableTransaction mtx; - mtx.vin.resize(1); - mtx.vin[0].prevout.hash = txIn.GetHash(); - mtx.vin[0].prevout.n = nOut; - mtx.vout.resize(1); - mtx.vout[0].nValue = txIn.vout[nOut].nValue - 1000; - return mtx; -} - - -/* - * In order to do tests there needs to be inputs to spend. - * This method creates a block and returns a transaction that spends the coinbase. - */ -void getInputTx(CScript scriptPubKey, CTransaction &txIn) -{ - // Get coinbase - CBlock block; - generateBlock(&block); - CTransaction coinbase = block.vtx[0]; - - // Create tx - auto mtx = spendTx(coinbase); - mtx.vout[0].scriptPubKey = scriptPubKey; - uint256 hash = SignatureHash(coinbase.vout[0].scriptPubKey, mtx, 0, SIGHASH_ALL); - std::vector vchSig; - notaryKey.Sign(hash, vchSig); - vchSig.push_back((unsigned char)SIGHASH_ALL); - mtx.vin[0].scriptSig << vchSig; - - // Accept - acceptTx(mtx); - txIn = CTransaction(mtx); -} - - -std::string HexToB64(std::string hexStr) -{ - auto d = ParseHex(hexStr); - return EncodeBase64(d.data(), d.size()); -} - - -CC *getReplaceCond() -{ - const char *condJsonTpl = R"V0G0N( - { "type": "threshold-sha-256", - "threshold": 2, - "subfulfillments": [ - { "type": "secp256k1-sha-256", "publicKey": "%s"}, - { "type": "eval-sha-256", "method": "testReplace", "params": "" } - ] })V0G0N"; - char condJson[1000]; - sprintf(condJson, condJsonTpl, (char*)HexToB64(NOTARY_PUBKEY).data()); - - unsigned char err[1000] = "\0"; - return cc_conditionFromJSONString((const unsigned char*)condJson, err); - // above could fail -} - -CScript condPK(CC *cond) -{ - unsigned char buf[1000]; - size_t bufLen = cc_conditionBinary(cond, buf); - return CScript() << VCH(buf, bufLen) << OP_CHECKCRYPTOCONDITION; -} - -void setFulfillment(CMutableTransaction &mtx, CC *cond, const CScript &spk, int nIn=0) -{ - uint256 hash = SignatureHash(spk, mtx, nIn, SIGHASH_ALL); - int nSigned = cc_signTreeSecp256k1Msg32(cond, notaryKey.begin(), hash.begin()); - unsigned char buf[1000]; - size_t bufLen = cc_fulfillmentBinary(cond, buf, 1000); - mtx.vin[nIn].scriptSig = CScript() << VCH(buf, bufLen); -} - - -CScript getReplaceOut(unsigned char replacementWindow, unsigned char priority) -{ - std::vector v = {replacementWindow, priority}; - return CScript() << OP_RETURN << v; -} - - -CTransaction _txout; -#define ONLY_REPLACEMENT_POOL(hash) ASSERT_TRUE(replacementPool.lookup(hash, _txout)); \ - ASSERT_FALSE(mempool.lookup(hash, _txout)); -#define ONLY_MEM_POOL(hash) ASSERT_FALSE(replacementPool.lookup(hash, _txout)); \ - ASSERT_TRUE(mempool.lookup(hash, _txout)); - - - -// Setup environment and perform basic spend as test -TEST(replacementpool, 0_setup) -{ - testSetup(); // Only call this method here - - CTransaction txIn; - getInputTx(CScript() << OP_RETURN << VCH("1", 1), txIn); -} - - -// Perform replaceable spend -TEST(replacementpool, basic) -{ - CTransaction txIn; - CC *cond = getReplaceCond(); - getInputTx(condPK(cond), txIn); - - // Spend output to replaceable - auto mtx = spendTx(txIn); - mtx.vout[0].scriptPubKey = getReplaceOut(2, 100); - setFulfillment(mtx, cond, txIn.vout[0].scriptPubKey); - - acceptTx(mtx); - - ONLY_REPLACEMENT_POOL(mtx.GetHash()); - generateBlock(); - ONLY_REPLACEMENT_POOL(mtx.GetHash()); - generateBlock(); - ONLY_MEM_POOL(mtx.GetHash()); -} - - -/* - * replacementWindow is 0, transaction should go direct to mempool - */ -TEST(replacementpool, noWindow) -{ - CTransaction txIn; - CC *cond = getReplaceCond(); - getInputTx(condPK(cond), txIn); - - // First set a tx with a 1 block wait. It should stay in the replacement pool. - auto mtx = spendTx(txIn); - mtx.vout[0].scriptPubKey = getReplaceOut(1, 100); - setFulfillment(mtx, cond, txIn.vout[0].scriptPubKey); - acceptTx(mtx); - ONLY_REPLACEMENT_POOL(mtx.GetHash()); - - // Now set a transaction with a 0 block wait and higher priority. - // It should go direct to the mem pool. - auto mtx2 = spendTx(txIn); - mtx2.vout[0].scriptPubKey = getReplaceOut(0, 101); - setFulfillment(mtx2, cond, txIn.vout[0].scriptPubKey); - acceptTx(mtx2); - ONLY_MEM_POOL(mtx2.GetHash()); - - // Additionally, there should be no replacement remaining for txIn in the mempool - ASSERT_FALSE(replacementPool.lookup(mtx.GetHash(), _txout)); -} - - -/* - * Multiple replaceable transactions dont interfere - */ -TEST(replacementpool, noInterfere) -{ - CTransaction txIn1, txIn2; - CC *cond = getReplaceCond(); - getInputTx(condPK(cond), txIn1); - getInputTx(condPK(cond), txIn2); - - // First set a transaction with a low window - auto mtx = spendTx(txIn1); - mtx.vout[0].scriptPubKey = getReplaceOut(1, 100); - setFulfillment(mtx, cond, txIn1.vout[0].scriptPubKey); - acceptTx(mtx); - ONLY_REPLACEMENT_POOL(mtx.GetHash()); - - // Now, a different spend with a higher window - auto mtx2 = spendTx(txIn2); - mtx2.vout[0].scriptPubKey = getReplaceOut(10, 100); - setFulfillment(mtx2, cond, txIn2.vout[0].scriptPubKey); - acceptTx(mtx2); - ONLY_REPLACEMENT_POOL(mtx2.GetHash()); - - generateBlock(); - - // mtx has gone to mempool - ONLY_MEM_POOL(mtx.GetHash()); - - // mtx2 still in replacementpool - ONLY_REPLACEMENT_POOL(mtx2.GetHash()); - - // But 9 blocks later... - for (int i=0; i<9; i++) - { - generateBlock(); - ASSERT_EQ(i == 8, mempool.lookup(mtx2.GetHash(), _txout)); - } -} - - -/* - * Multiple inputs is invalid - */ -TEST(replacementpool, invalidMultipleInputs) -{ - LOCK(cs_main); - - CTransaction txIn, txIn2; - CC *cond = getReplaceCond(); - getInputTx(condPK(cond), txIn); - getInputTx(condPK(cond), txIn2); - - CMutableTransaction mtx; - mtx.vout.resize(1); - mtx.vout[0].nValue = txIn.vout[0].nValue * 2 - 1000; - mtx.vout[0].scriptPubKey = getReplaceOut(1, 100); - mtx.vin.resize(2); - mtx.vin[0].prevout.hash = txIn.GetHash(); - mtx.vin[0].prevout.n = 0; - mtx.vin[1].prevout.hash = txIn2.GetHash(); - mtx.vin[1].prevout.n = 0; - setFulfillment(mtx, cond, txIn.vout[0].scriptPubKey); - setFulfillment(mtx, cond, txIn2.vout[0].scriptPubKey, 1); - - CValidationState state; - ASSERT_FALSE(AcceptToMemoryPool(mempool, state, mtx, false, NULL)); - ASSERT_EQ("replacement-invalid", state.GetRejectReason()); -} - - -extern bool AddOrphanTx(const CTransaction& tx, NodeId peer); -extern void ProcessOrphanTransactions(uint256 parentHash); -struct COrphanTx { CTransaction tx; NodeId fromPeer; }; -extern std::map mapOrphanTransactions; - -/* - * Orphans are processed - */ -TEST(replacementpool, orphansAreProcessed) -{ - LOCK(cs_main); - - CTransaction txIn; - CC *cond = getReplaceCond(); - getInputTx(condPK(cond), txIn); - - // Make basic replaceable spend and dont submit - auto mtx = spendTx(txIn); - mtx.vout.resize(2); - mtx.vout[0].nValue = txIn.vout[0].nValue - 1000; - mtx.vout[0].scriptPubKey = condPK(cond); - mtx.vout[1].nValue = 1; - mtx.vout[1].scriptPubKey = getReplaceOut(1, 100); - setFulfillment(mtx, cond, txIn.vout[0].scriptPubKey); - - // Make an orphan and add it - auto orphan = spendTx(mtx); - orphan.vout[0].scriptPubKey = getReplaceOut(0, 100); - setFulfillment(orphan, cond, mtx.vout[0].scriptPubKey); - ASSERT_TRUE(AddOrphanTx(orphan, 1001)); - ASSERT_EQ(1, mapOrphanTransactions.count(orphan.GetHash())); - - // parent goes into replacement pool - acceptTx(mtx); - ONLY_REPLACEMENT_POOL(mtx.GetHash()); - - // this should not result in the movement of any orphans - ProcessOrphanTransactions(mtx.GetHash()); - ASSERT_EQ(1, mapOrphanTransactions.count(orphan.GetHash())); - - // Processing of parent transaction also un-orphanises orphan - generateBlock(); - ONLY_MEM_POOL(mtx.GetHash()); - ONLY_MEM_POOL(orphan.GetHash()); - ASSERT_EQ(0, mapOrphanTransactions.count(orphan.GetHash())); -} - - -/* - * Add transaction with lower priority, already have better - */ -TEST(replacementpool, haveBetter) -{ - LOCK(cs_main); - - CTransaction txIn; - CC *cond = getReplaceCond(); - getInputTx(condPK(cond), txIn); - - // A replaceable tx. - auto mtx = spendTx(txIn); - mtx.vout[0].scriptPubKey = getReplaceOut(2, 100); - setFulfillment(mtx, cond, txIn.vout[0].scriptPubKey); - acceptTx(mtx); - ONLY_REPLACEMENT_POOL(mtx.GetHash()); - - // Another one, but not as good. - auto mtx2 = spendTx(txIn); - mtx2.vout[0].scriptPubKey = getReplaceOut(2, 99); - setFulfillment(mtx2, cond, txIn.vout[0].scriptPubKey); - CValidationState state; - ASSERT_FALSE(AcceptToMemoryPool(mempool, state, mtx, false, NULL)); - ASSERT_EQ("replacement-is-worse", state.GetRejectReason()); - ONLY_REPLACEMENT_POOL(mtx.GetHash()); -} - - -/* - * Add transaction with lower priority, but shorter replacementWindow - */ -TEST(replacementpool, shorterReplacementWindow) -{ - LOCK(cs_main); - - CTransaction txIn; - CC *cond = getReplaceCond(); - getInputTx(condPK(cond), txIn); - - // A replaceable tx. - auto mtx = spendTx(txIn); - mtx.vout[0].scriptPubKey = getReplaceOut(2, 100); - setFulfillment(mtx, cond, txIn.vout[0].scriptPubKey); - acceptTx(mtx); - ONLY_REPLACEMENT_POOL(mtx.GetHash()); - - // Another one, lower priority but shorter replacementWindow so wins. - auto mtx2 = spendTx(txIn); - mtx2.vout[0].scriptPubKey = getReplaceOut(1, 99); - setFulfillment(mtx2, cond, txIn.vout[0].scriptPubKey); - acceptTx(mtx2); - ONLY_REPLACEMENT_POOL(mtx2.GetHash()); - ASSERT_FALSE(replacementPool.lookup(mtx.GetHash(), _txout)); - - // Shorter still, in fact direct to mem pool - auto mtx3 = spendTx(txIn); - mtx3.vout[0].scriptPubKey = getReplaceOut(0, 98); - setFulfillment(mtx3, cond, txIn.vout[0].scriptPubKey); - acceptTx(mtx3); - ONLY_MEM_POOL(mtx3.GetHash()); -} From 1328d71427395484e9398aca0f941c1a31144dc0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Mar 2018 14:22:06 +0300 Subject: [PATCH 0747/1062] Remove / from bintray path --- depends/packages/libsnark.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/depends/packages/libsnark.mk b/depends/packages/libsnark.mk index 00c897d73..cb4bc04ca 100644 --- a/depends/packages/libsnark.mk +++ b/depends/packages/libsnark.mk @@ -1,6 +1,6 @@ package=libsnark $(package)_version=0.1 -$(package)_download_path=https://supernetorg.bintray.com/misc/ +$(package)_download_path=https://supernetorg.bintray.com/misc $(package)_file_name=$(package)-$($(package)_git_commit).tar.gz $(package)_download_file=$(package)-$($(package)_git_commit).tar.gz $(package)_sha256_hash=47478adc2ae88c448dc736d59dfe007de6478e41e88d2d4d2ff4135a17ee6f90 From 919fa9f9c3ddb8c417c2b8768130606c3384e7fa Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Mar 2018 16:39:18 +0300 Subject: [PATCH 0748/1062] Add back googlemk --- depends/packages/packages.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/depends/packages/packages.mk b/depends/packages/packages.mk index 8475ec7d5..199c69d0c 100644 --- a/depends/packages/packages.mk +++ b/depends/packages/packages.mk @@ -3,9 +3,9 @@ rust_packages := rust librustzcash proton_packages := proton zcash_packages := libgmp libsodium ifeq ($(host_os),linux) - packages := boost openssl libevent zeromq $(zcash_packages) #googletest googlemock + packages := boost openssl libevent zeromq $(zcash_packages) googletest googlemock else - packages := boost openssl libevent zeromq $(zcash_packages) libcurl # googletest googlemock libcurl + packages := boost openssl libevent zeromq $(zcash_packages) googletest googlemock libcurl endif native_packages := native_ccache From 079de2e5e817a49cf5fc9f94b5cfa593730ad6e4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Mar 2018 16:49:00 +0300 Subject: [PATCH 0749/1062] Test --- depends/packages/googlemock.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/depends/packages/googlemock.mk b/depends/packages/googlemock.mk index 67246ae75..2809fdeb7 100644 --- a/depends/packages/googlemock.mk +++ b/depends/packages/googlemock.mk @@ -4,7 +4,7 @@ package=googlemock $(package)_version=1.7.0 $(package)_dependencies=googletest -$(package)_download_path=https://github.com/google/$(package)/archive/ +$(package)_download_path=https://github.com/google/$(package)/archive $(package)_file_name=$(package)-$($(package)_version).tar.gz $(package)_download_file=release-$($(package)_version).tar.gz $(package)_sha256_hash=3f20b6acb37e5a98e8c4518165711e3e35d47deb6cdb5a4dd4566563b5efd232 From c52074f24851acdff6f211bc61d2b0aa36a571a6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Mar 2018 19:03:55 +0300 Subject: [PATCH 0750/1062] Test alternate block2height --- src/komodo_bitcoind.h | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 0c905e785..97d572e51 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -612,7 +612,9 @@ int32_t komodo_is_notarytx(const CTransaction& tx) int32_t komodo_block2height(CBlock *block) { - int32_t i,n,height = 0; uint8_t *ptr; + int32_t i,n,height2=-1,height = 0; uint8_t *ptr; CBlockIndex *pindex; + if ( (pindex= mapBlockIndex[block->GetHash()]) != 0 ) + height2 = (int32_t)pindex->nHeight; if ( block->vtx[0].vin.size() > 0 ) { #ifdef KOMODO_ZCASH @@ -635,6 +637,13 @@ int32_t komodo_block2height(CBlock *block) } //komodo_init(height); } + if ( height > 0 && height2 >= 0 ) + { + static uint32_t match,mismatch; + if ( height != height2 || ((match+mismatch) % 1000) == 999 ) + mismatch++, printf("block2height height.%d vs height2.%d, match.%d mismatch.%d\n",height,height2,match,mismatch); + else match++; + } return(height); } @@ -866,7 +875,7 @@ int32_t komodo_MoM(int32_t *notarized_heightp,uint256 *MoMp,uint256 *kmdtxidp,in int32_t komodo_checkpoint(int32_t *notarized_heightp,int32_t nHeight,uint256 hash) { - int32_t notarized_height,MoMdepth; uint256 MoM,notarized_hash,notarized_desttxid; CBlockIndex *notary; CBlockIndex *pindex; + int32_t notarized_height,MoMdepth; uint256 MoM,notarized_hash,notarized_desttxid; CBlockIndex *notary,*pindex; if ( (pindex= chainActive.Tip()) == 0 ) return(-1); notarized_height = komodo_notarizeddata(pindex->nHeight,¬arized_hash,¬arized_desttxid); From f9b1c78a0264357cb995c7b895db4aa58a7bbc05 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Mar 2018 19:08:48 +0300 Subject: [PATCH 0751/1062] Test --- src/komodo_bitcoind.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 97d572e51..5e0db61ab 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -641,7 +641,7 @@ int32_t komodo_block2height(CBlock *block) { static uint32_t match,mismatch; if ( height != height2 || ((match+mismatch) % 1000) == 999 ) - mismatch++, printf("block2height height.%d vs height2.%d, match.%d mismatch.%d\n",height,height2,match,mismatch); + mismatch++, fprintf(stderr,"block2height height.%d vs height2.%d, match.%d mismatch.%d\n",height,height2,match,mismatch); else match++; } return(height); From f717835b84984722d4912bd9a339e167ff654cf2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Mar 2018 19:20:06 +0300 Subject: [PATCH 0752/1062] Test --- src/komodo_bitcoind.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 5e0db61ab..e23119eaa 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -640,8 +640,11 @@ int32_t komodo_block2height(CBlock *block) if ( height > 0 && height2 >= 0 ) { static uint32_t match,mismatch; - if ( height != height2 || ((match+mismatch) % 1000) == 999 ) + if ( height != height2 || ((match+mismatch) % 10) == 9 ) + { mismatch++, fprintf(stderr,"block2height height.%d vs height2.%d, match.%d mismatch.%d\n",height,height2,match,mismatch); + height = height2; + } else match++; } return(height); From d4cc6fc35a24da804cdb37b60ae0b1d98c564f92 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Mar 2018 19:29:30 +0300 Subject: [PATCH 0753/1062] Test --- src/komodo_bitcoind.h | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index e23119eaa..8a3577941 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -637,16 +637,14 @@ int32_t komodo_block2height(CBlock *block) } //komodo_init(height); } - if ( height > 0 && height2 >= 0 ) + if ( height != height2 ) { static uint32_t match,mismatch; - if ( height != height2 || ((match+mismatch) % 10) == 9 ) - { - mismatch++, fprintf(stderr,"block2height height.%d vs height2.%d, match.%d mismatch.%d\n",height,height2,match,mismatch); + fprintf(stderr,"block2height height.%d vs height2.%d, match.%d mismatch.%d\n",height,height2,match,mismatch); + mismatch++; + if ( height2 >= 0 ) height = height2; - } - else match++; - } + } else match++; return(height); } From e1501755a4a7976364dce641e3ed617b0ff59b4c Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Mar 2018 19:30:33 +0300 Subject: [PATCH 0754/1062] Test --- src/komodo_bitcoind.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 8a3577941..4edaa76de 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -612,6 +612,7 @@ int32_t komodo_is_notarytx(const CTransaction& tx) int32_t komodo_block2height(CBlock *block) { + static uint32_t match,mismatch; int32_t i,n,height2=-1,height = 0; uint8_t *ptr; CBlockIndex *pindex; if ( (pindex= mapBlockIndex[block->GetHash()]) != 0 ) height2 = (int32_t)pindex->nHeight; @@ -639,7 +640,6 @@ int32_t komodo_block2height(CBlock *block) } if ( height != height2 ) { - static uint32_t match,mismatch; fprintf(stderr,"block2height height.%d vs height2.%d, match.%d mismatch.%d\n",height,height2,match,mismatch); mismatch++; if ( height2 >= 0 ) From 8a0b06f603ad336b5098ea4950a6f15ff02614bf Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Mar 2018 20:22:23 +0300 Subject: [PATCH 0755/1062] Test --- src/komodo_bitcoind.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 4edaa76de..6f8357985 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -615,7 +615,11 @@ int32_t komodo_block2height(CBlock *block) static uint32_t match,mismatch; int32_t i,n,height2=-1,height = 0; uint8_t *ptr; CBlockIndex *pindex; if ( (pindex= mapBlockIndex[block->GetHash()]) != 0 ) + { height2 = (int32_t)pindex->nHeight; + if ( height2 >= 0 ) + return(height2); + } if ( block->vtx[0].vin.size() > 0 ) { #ifdef KOMODO_ZCASH From 1d5c7ffa2925999e314b92b99c25548d5de1f337 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 28 Mar 2018 14:22:39 +0300 Subject: [PATCH 0756/1062] -googlemock --- depends/packages/packages.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/depends/packages/packages.mk b/depends/packages/packages.mk index 199c69d0c..3c9eabc88 100644 --- a/depends/packages/packages.mk +++ b/depends/packages/packages.mk @@ -3,9 +3,9 @@ rust_packages := rust librustzcash proton_packages := proton zcash_packages := libgmp libsodium ifeq ($(host_os),linux) - packages := boost openssl libevent zeromq $(zcash_packages) googletest googlemock + packages := boost openssl libevent zeromq $(zcash_packages) googletest #googlemock else - packages := boost openssl libevent zeromq $(zcash_packages) googletest googlemock libcurl + packages := boost openssl libevent zeromq $(zcash_packages) libcurl googletest #googlemock endif native_packages := native_ccache From 991c422a9d8b156d45710c56f4b7759b55404b71 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Wed, 28 Mar 2018 15:02:20 -0300 Subject: [PATCH 0757/1062] fix CC --- src/cryptoconditions/Makefile.am | 13 +- .../src/include/secp256k1/.gitignore | 24 +- .../src/include/secp256k1/.travis.yml | 24 +- .../src/include/secp256k1/Makefile.am | 138 +- .../src/include/secp256k1/README.md | 2 +- .../build-aux/m4/ax_jni_include_dir.m4 | 140 + .../build-aux/m4/ax_prog_cc_for_build.m4 | 125 + .../secp256k1/build-aux/m4/bitcoin_secp.m4 | 69 + .../src/include/secp256k1/configure.ac | 203 +- .../secp256k1/contrib/lax_der_parsing.c | 150 + .../secp256k1/contrib/lax_der_parsing.h | 91 + .../contrib/lax_der_privatekey_parsing.c | 113 + .../contrib/lax_der_privatekey_parsing.h | 90 + .../src/include/secp256k1/include/secp256k1.h | 760 ++-- .../secp256k1/include/secp256k1_ecdh.h | 31 + .../secp256k1/include/secp256k1_recovery.h | 110 + .../src/include/secp256k1/libsecp256k1.pc.in | 2 +- .../include/secp256k1/sage/group_prover.sage | 322 ++ .../src/include/secp256k1/sage/secp256k1.sage | 306 ++ .../secp256k1/sage/weierstrass_prover.sage | 264 ++ .../secp256k1/src/asm/field_10x26_arm.s | 919 +++++ .../src/include/secp256k1/src/basic-config.h | 33 + .../src/include/secp256k1/src/bench.h | 28 +- .../src/include/secp256k1/src/bench_ecdh.c | 54 + .../include/secp256k1/src/bench_internal.c | 152 +- .../src/include/secp256k1/src/bench_recover.c | 33 +- .../src/include/secp256k1/src/bench_sign.c | 34 +- .../src/include/secp256k1/src/bench_verify.c | 72 +- .../src/include/secp256k1/src/ecdsa.h | 21 +- .../src/include/secp256k1/src/ecdsa_impl.h | 286 +- .../src/include/secp256k1/src/eckey.h | 23 +- .../src/include/secp256k1/src/eckey_impl.h | 144 +- .../src/include/secp256k1/src/ecmult.h | 26 +- .../src/include/secp256k1/src/ecmult_const.h | 15 + .../include/secp256k1/src/ecmult_const_impl.h | 240 ++ .../src/include/secp256k1/src/ecmult_gen.h | 30 +- .../include/secp256k1/src/ecmult_gen_impl.h | 110 +- .../src/include/secp256k1/src/ecmult_impl.h | 309 +- .../src/include/secp256k1/src/field.h | 79 +- .../src/include/secp256k1/src/field_10x26.h | 29 +- .../include/secp256k1/src/field_10x26_impl.h | 139 +- .../src/include/secp256k1/src/field_5x52.h | 28 +- .../secp256k1/src/field_5x52_asm_impl.h | 6 +- .../include/secp256k1/src/field_5x52_impl.h | 150 +- .../secp256k1/src/field_5x52_int128_impl.h | 10 +- .../src/include/secp256k1/src/field_impl.h | 84 +- .../src/include/secp256k1/src/gen_context.c | 74 + .../src/include/secp256k1/src/group.h | 115 +- .../src/include/secp256k1/src/group_impl.h | 475 ++- .../src/include/secp256k1/src/hash.h | 34 +- .../src/include/secp256k1/src/hash_impl.h | 52 +- .../src/java/org/bitcoin/NativeSecp256k1.java | 440 +- .../java/org/bitcoin/NativeSecp256k1Test.java | 226 ++ .../java/org/bitcoin/NativeSecp256k1Util.java | 45 + .../java/org/bitcoin/Secp256k1Context.java | 51 + .../src/java/org_bitcoin_NativeSecp256k1.c | 378 +- .../src/java/org_bitcoin_NativeSecp256k1.h | 106 +- .../src/java/org_bitcoin_Secp256k1Context.c | 15 + .../src/java/org_bitcoin_Secp256k1Context.h | 22 + .../src/modules/ecdh/Makefile.am.include | 8 + .../secp256k1/src/modules/ecdh/main_impl.h | 54 + .../secp256k1/src/modules/ecdh/tests_impl.h | 105 + .../src/modules/recovery/Makefile.am.include | 8 + .../src/modules/recovery/main_impl.h | 193 + .../src/modules/recovery/tests_impl.h | 393 ++ .../src/include/secp256k1/src/num.h | 40 +- .../src/include/secp256k1/src/num_gmp.h | 8 +- .../src/include/secp256k1/src/num_gmp_impl.h | 72 +- .../src/include/secp256k1/src/num_impl.h | 6 +- .../src/include/secp256k1/src/scalar.h | 67 +- .../src/include/secp256k1/src/scalar_4x64.h | 8 +- .../include/secp256k1/src/scalar_4x64_impl.h | 113 +- .../src/include/secp256k1/src/scalar_8x32.h | 8 +- .../include/secp256k1/src/scalar_8x32_impl.h | 96 +- .../src/include/secp256k1/src/scalar_impl.h | 260 +- .../src/include/secp256k1/src/scalar_low.h | 15 + .../include/secp256k1/src/scalar_low_impl.h | 114 + .../src/include/secp256k1/src/secp256k1.c | 705 ++-- .../src/include/secp256k1/src/testrand.h | 18 +- .../src/include/secp256k1/src/testrand_impl.h | 94 +- .../src/include/secp256k1/src/tests.c | 3573 ++++++++++++++--- .../include/secp256k1/src/tests_exhaustive.c | 470 +++ .../src/include/secp256k1/src/util.h | 37 +- src/cryptoconditions/src/secp256k1.c | 74 +- src/cryptoconditions/test-requirements.txt | 2 +- src/cryptoconditions/tests/test_ed25519.py | 2 +- .../tests/test_failure_modes.py | 2 +- src/cryptoconditions/tests/test_secp256k1.py | 4 +- src/cryptoconditions/tests/test_vectors.py | 8 +- src/script/interpreter.cpp | 13 +- src/script/interpreter.h | 4 +- 91 files changed, 12158 insertions(+), 2480 deletions(-) create mode 100644 src/cryptoconditions/src/include/secp256k1/build-aux/m4/ax_jni_include_dir.m4 create mode 100644 src/cryptoconditions/src/include/secp256k1/build-aux/m4/ax_prog_cc_for_build.m4 create mode 100644 src/cryptoconditions/src/include/secp256k1/build-aux/m4/bitcoin_secp.m4 create mode 100644 src/cryptoconditions/src/include/secp256k1/contrib/lax_der_parsing.c create mode 100644 src/cryptoconditions/src/include/secp256k1/contrib/lax_der_parsing.h create mode 100644 src/cryptoconditions/src/include/secp256k1/contrib/lax_der_privatekey_parsing.c create mode 100644 src/cryptoconditions/src/include/secp256k1/contrib/lax_der_privatekey_parsing.h create mode 100644 src/cryptoconditions/src/include/secp256k1/include/secp256k1_ecdh.h create mode 100644 src/cryptoconditions/src/include/secp256k1/include/secp256k1_recovery.h create mode 100644 src/cryptoconditions/src/include/secp256k1/sage/group_prover.sage create mode 100644 src/cryptoconditions/src/include/secp256k1/sage/secp256k1.sage create mode 100644 src/cryptoconditions/src/include/secp256k1/sage/weierstrass_prover.sage create mode 100644 src/cryptoconditions/src/include/secp256k1/src/asm/field_10x26_arm.s create mode 100644 src/cryptoconditions/src/include/secp256k1/src/basic-config.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/bench_ecdh.c create mode 100644 src/cryptoconditions/src/include/secp256k1/src/ecmult_const.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/ecmult_const_impl.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/gen_context.c create mode 100644 src/cryptoconditions/src/include/secp256k1/src/java/org/bitcoin/NativeSecp256k1Test.java create mode 100644 src/cryptoconditions/src/include/secp256k1/src/java/org/bitcoin/NativeSecp256k1Util.java create mode 100644 src/cryptoconditions/src/include/secp256k1/src/java/org/bitcoin/Secp256k1Context.java create mode 100644 src/cryptoconditions/src/include/secp256k1/src/java/org_bitcoin_Secp256k1Context.c create mode 100644 src/cryptoconditions/src/include/secp256k1/src/java/org_bitcoin_Secp256k1Context.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/modules/ecdh/Makefile.am.include create mode 100644 src/cryptoconditions/src/include/secp256k1/src/modules/ecdh/main_impl.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/modules/ecdh/tests_impl.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/modules/recovery/Makefile.am.include create mode 100755 src/cryptoconditions/src/include/secp256k1/src/modules/recovery/main_impl.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/modules/recovery/tests_impl.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/scalar_low.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/scalar_low_impl.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/tests_exhaustive.c diff --git a/src/cryptoconditions/Makefile.am b/src/cryptoconditions/Makefile.am index 9c7af8c03..9469acdbf 100644 --- a/src/cryptoconditions/Makefile.am +++ b/src/cryptoconditions/Makefile.am @@ -1,10 +1,10 @@ lib_LTLIBRARIES=libcryptoconditions.la -noinst_LTLIBRARIES=cryptoconditions_core.a +noinst_LTLIBRARIES=$(CRYPTOCONDITIONS_CORE) SUBDIRS = src/include/secp256k1 # Have a separate build target for cryptoconditions that does not contain secp256k1 -libcryptoconditions_la_SOURCES = +libcryptoconditions_la_SOURCES = include/cryptoconditions.h libcryptoconditions_la_LIBADD = $(CRYPTOCONDITIONS_CORE) $(LIBSECP256K1) AM_CFLAGS = -I$(top_srcdir)/src/asn -I$(top_srcdir)/include -I$(top_srcdir)/src/include \ @@ -15,12 +15,9 @@ LIBSECP256K1=src/include/secp256k1/libsecp256k1.la $(LIBSECP256K1): $(wildcard src/secp256k1/*) $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C $(@D) $(@F) -CRYPTOCONDITIONS_CORE=cryptoconditions_core.a +CRYPTOCONDITIONS_CORE=libcryptoconditions_core.la -# libcryptoconditions_la_SOURCES = \ -cryptoconditions_core_a_CFLAGS = -I$(top_srcdir)/src/asn -I$(top_srcdir)/include -I$(top_srcdir)/src/include \ - -Wall -Wno-pointer-sign -Wno-discarded-qualifiers -cryptoconditions_core_a_SOURCES = \ +libcryptoconditions_core_la_SOURCES = \ src/cryptoconditions.c \ src/include/cJSON.c \ src/include/sha256.c \ @@ -77,7 +74,7 @@ cryptoconditions_core_a_SOURCES = \ src/asn/per_opentype.c test: - bash -c '[ -d .env ] || virtualenv .env' + bash -c '[ -d .env ] || virtualenv .env -p python3' .env/bin/pip install pytest gdb -batch -ex run -ex bt --args .env/bin/python -m pytest -s -x -v 2>&1 | grep -v ^"No stack."$ diff --git a/src/cryptoconditions/src/include/secp256k1/.gitignore b/src/cryptoconditions/src/include/secp256k1/.gitignore index 076ff1295..87fea161b 100644 --- a/src/cryptoconditions/src/include/secp256k1/.gitignore +++ b/src/cryptoconditions/src/include/secp256k1/.gitignore @@ -1,9 +1,13 @@ bench_inv +bench_ecdh bench_sign bench_verify +bench_schnorr_verify bench_recover bench_internal tests +exhaustive_tests +gen_context *.exe *.so *.a @@ -22,16 +26,24 @@ config.status libtool .deps/ .dirstamp -build-aux/ *.lo *.o *~ src/libsecp256k1-config.h src/libsecp256k1-config.h.in -m4/libtool.m4 -m4/ltoptions.m4 -m4/ltsugar.m4 -m4/ltversion.m4 -m4/lt~obsolete.m4 +src/ecmult_static_context.h +build-aux/config.guess +build-aux/config.sub +build-aux/depcomp +build-aux/install-sh +build-aux/ltmain.sh +build-aux/m4/libtool.m4 +build-aux/m4/lt~obsolete.m4 +build-aux/m4/ltoptions.m4 +build-aux/m4/ltsugar.m4 +build-aux/m4/ltversion.m4 +build-aux/missing +build-aux/compile +build-aux/test-driver src/stamp-h1 libsecp256k1.pc diff --git a/src/cryptoconditions/src/include/secp256k1/.travis.yml b/src/cryptoconditions/src/include/secp256k1/.travis.yml index 0d8089cfe..243952924 100644 --- a/src/cryptoconditions/src/include/secp256k1/.travis.yml +++ b/src/cryptoconditions/src/include/secp256k1/.travis.yml @@ -6,22 +6,30 @@ addons: compiler: - clang - gcc +cache: + directories: + - src/java/guava/ env: global: - - FIELD=auto BIGNUM=auto SCALAR=auto ENDOMORPHISM=no ASM=no BUILD=check EXTRAFLAGS= HOST= + - FIELD=auto BIGNUM=auto SCALAR=auto ENDOMORPHISM=no STATICPRECOMPUTATION=yes ASM=no BUILD=check EXTRAFLAGS= HOST= ECDH=no RECOVERY=no EXPERIMENTAL=no + - GUAVA_URL=https://search.maven.org/remotecontent?filepath=com/google/guava/guava/18.0/guava-18.0.jar GUAVA_JAR=src/java/guava/guava-18.0.jar matrix: - - SCALAR=32bit + - SCALAR=32bit RECOVERY=yes + - SCALAR=32bit FIELD=32bit ECDH=yes EXPERIMENTAL=yes - SCALAR=64bit - - FIELD=64bit + - FIELD=64bit RECOVERY=yes - FIELD=64bit ENDOMORPHISM=yes + - FIELD=64bit ENDOMORPHISM=yes ECDH=yes EXPERIMENTAL=yes - FIELD=64bit ASM=x86_64 - FIELD=64bit ENDOMORPHISM=yes ASM=x86_64 - - FIELD=32bit - FIELD=32bit ENDOMORPHISM=yes - BIGNUM=no - - BIGNUM=no ENDOMORPHISM=yes + - BIGNUM=no ENDOMORPHISM=yes RECOVERY=yes EXPERIMENTAL=yes + - BIGNUM=no STATICPRECOMPUTATION=no - BUILD=distcheck - - EXTRAFLAGS=CFLAGS=-DDETERMINISTIC + - EXTRAFLAGS=CPPFLAGS=-DDETERMINISTIC + - EXTRAFLAGS=CFLAGS=-O0 + - BUILD=check-java ECDH=yes EXPERIMENTAL=yes matrix: fast_finish: true include: @@ -51,9 +59,11 @@ matrix: packages: - gcc-multilib - libgmp-dev:i386 +before_install: mkdir -p `dirname $GUAVA_JAR` +install: if [ ! -f $GUAVA_JAR ]; then wget $GUAVA_URL -O $GUAVA_JAR; fi before_script: ./autogen.sh script: - if [ -n "$HOST" ]; then export USE_HOST="--host=$HOST"; fi - if [ "x$HOST" = "xi686-linux-gnu" ]; then export CC="$CC -m32"; fi - - ./configure --enable-endomorphism=$ENDOMORPHISM --with-field=$FIELD --with-bignum=$BIGNUM --with-scalar=$SCALAR $EXTRAFLAGS $USE_HOST && make -j2 $BUILD + - ./configure --enable-experimental=$EXPERIMENTAL --enable-endomorphism=$ENDOMORPHISM --with-field=$FIELD --with-bignum=$BIGNUM --with-scalar=$SCALAR --enable-ecmult-static-precomputation=$STATICPRECOMPUTATION --enable-module-ecdh=$ECDH --enable-module-recovery=$RECOVERY $EXTRAFLAGS $USE_HOST && make -j2 $BUILD os: linux diff --git a/src/cryptoconditions/src/include/secp256k1/Makefile.am b/src/cryptoconditions/src/include/secp256k1/Makefile.am index 5f388f3fd..c071fbe27 100644 --- a/src/cryptoconditions/src/include/secp256k1/Makefile.am +++ b/src/cryptoconditions/src/include/secp256k1/Makefile.am @@ -1,14 +1,22 @@ ACLOCAL_AMFLAGS = -I build-aux/m4 lib_LTLIBRARIES = libsecp256k1.la +if USE_JNI +JNI_LIB = libsecp256k1_jni.la +noinst_LTLIBRARIES = $(JNI_LIB) +else +JNI_LIB = +endif include_HEADERS = include/secp256k1.h noinst_HEADERS = noinst_HEADERS += src/scalar.h noinst_HEADERS += src/scalar_4x64.h noinst_HEADERS += src/scalar_8x32.h +noinst_HEADERS += src/scalar_low.h noinst_HEADERS += src/scalar_impl.h noinst_HEADERS += src/scalar_4x64_impl.h noinst_HEADERS += src/scalar_8x32_impl.h +noinst_HEADERS += src/scalar_low_impl.h noinst_HEADERS += src/group.h noinst_HEADERS += src/group_impl.h noinst_HEADERS += src/num_gmp.h @@ -19,6 +27,8 @@ noinst_HEADERS += src/eckey.h noinst_HEADERS += src/eckey_impl.h noinst_HEADERS += src/ecmult.h noinst_HEADERS += src/ecmult_impl.h +noinst_HEADERS += src/ecmult_const.h +noinst_HEADERS += src/ecmult_const_impl.h noinst_HEADERS += src/ecmult_gen.h noinst_HEADERS += src/ecmult_gen_impl.h noinst_HEADERS += src/num.h @@ -30,6 +40,7 @@ noinst_HEADERS += src/field_5x52_impl.h noinst_HEADERS += src/field_5x52_int128_impl.h noinst_HEADERS += src/field_5x52_asm_impl.h noinst_HEADERS += src/java/org_bitcoin_NativeSecp256k1.h +noinst_HEADERS += src/java/org_bitcoin_Secp256k1Context.h noinst_HEADERS += src/util.h noinst_HEADERS += src/testrand.h noinst_HEADERS += src/testrand_impl.h @@ -38,40 +49,129 @@ noinst_HEADERS += src/hash_impl.h noinst_HEADERS += src/field.h noinst_HEADERS += src/field_impl.h noinst_HEADERS += src/bench.h +noinst_HEADERS += contrib/lax_der_parsing.h +noinst_HEADERS += contrib/lax_der_parsing.c +noinst_HEADERS += contrib/lax_der_privatekey_parsing.h +noinst_HEADERS += contrib/lax_der_privatekey_parsing.c + +if USE_EXTERNAL_ASM +COMMON_LIB = libsecp256k1_common.la +noinst_LTLIBRARIES = $(COMMON_LIB) +else +COMMON_LIB = +endif pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libsecp256k1.pc -libsecp256k1_la_SOURCES = src/secp256k1.c -libsecp256k1_la_CPPFLAGS = -I$(top_srcdir)/include $(SECP_INCLUDES) -libsecp256k1_la_LIBADD = $(SECP_LIBS) +if USE_EXTERNAL_ASM +if USE_ASM_ARM +libsecp256k1_common_la_SOURCES = src/asm/field_10x26_arm.s +endif +endif +libsecp256k1_la_SOURCES = src/secp256k1.c +libsecp256k1_la_CPPFLAGS = -DSECP256K1_BUILD -I$(top_srcdir)/include -I$(top_srcdir)/src $(SECP_INCLUDES) +libsecp256k1_la_LIBADD = $(JNI_LIB) $(SECP_LIBS) $(COMMON_LIB) + +libsecp256k1_jni_la_SOURCES = src/java/org_bitcoin_NativeSecp256k1.c src/java/org_bitcoin_Secp256k1Context.c +libsecp256k1_jni_la_CPPFLAGS = -DSECP256K1_BUILD $(JNI_INCLUDES) noinst_PROGRAMS = if USE_BENCHMARK -noinst_PROGRAMS += bench_verify bench_recover bench_sign bench_internal +noinst_PROGRAMS += bench_verify bench_sign bench_internal bench_verify_SOURCES = src/bench_verify.c -bench_verify_LDADD = libsecp256k1.la $(SECP_LIBS) -bench_verify_LDFLAGS = -static -bench_recover_SOURCES = src/bench_recover.c -bench_recover_LDADD = libsecp256k1.la $(SECP_LIBS) -bench_recover_LDFLAGS = -static +bench_verify_LDADD = libsecp256k1.la $(SECP_LIBS) $(SECP_TEST_LIBS) $(COMMON_LIB) bench_sign_SOURCES = src/bench_sign.c -bench_sign_LDADD = libsecp256k1.la $(SECP_LIBS) -bench_sign_LDFLAGS = -static +bench_sign_LDADD = libsecp256k1.la $(SECP_LIBS) $(SECP_TEST_LIBS) $(COMMON_LIB) bench_internal_SOURCES = src/bench_internal.c -bench_internal_LDADD = $(SECP_LIBS) -bench_internal_LDFLAGS = -static -bench_internal_CPPFLAGS = $(SECP_INCLUDES) +bench_internal_LDADD = $(SECP_LIBS) $(COMMON_LIB) +bench_internal_CPPFLAGS = -DSECP256K1_BUILD $(SECP_INCLUDES) endif +TESTS = if USE_TESTS noinst_PROGRAMS += tests tests_SOURCES = src/tests.c -tests_CPPFLAGS = -DVERIFY $(SECP_INCLUDES) $(SECP_TEST_INCLUDES) -tests_LDADD = $(SECP_LIBS) $(SECP_TEST_LIBS) -tests_LDFLAGS = -static -pthread -TESTS = tests +tests_CPPFLAGS = -DSECP256K1_BUILD -I$(top_srcdir)/src -I$(top_srcdir)/include $(SECP_INCLUDES) $(SECP_TEST_INCLUDES) +if !ENABLE_COVERAGE +tests_CPPFLAGS += -DVERIFY +endif +tests_LDADD = $(SECP_LIBS) $(SECP_TEST_LIBS) $(COMMON_LIB) +tests_LDFLAGS = -static +TESTS += tests endif -EXTRA_DIST = autogen.sh +if USE_EXHAUSTIVE_TESTS +noinst_PROGRAMS += exhaustive_tests +exhaustive_tests_SOURCES = src/tests_exhaustive.c +exhaustive_tests_CPPFLAGS = -DSECP256K1_BUILD -I$(top_srcdir)/src $(SECP_INCLUDES) +if !ENABLE_COVERAGE +exhaustive_tests_CPPFLAGS += -DVERIFY +endif +exhaustive_tests_LDADD = $(SECP_LIBS) +exhaustive_tests_LDFLAGS = -static +TESTS += exhaustive_tests +endif + +JAVAROOT=src/java +JAVAORG=org/bitcoin +JAVA_GUAVA=$(srcdir)/$(JAVAROOT)/guava/guava-18.0.jar +CLASSPATH_ENV=CLASSPATH=$(JAVA_GUAVA) +JAVA_FILES= \ + $(JAVAROOT)/$(JAVAORG)/NativeSecp256k1.java \ + $(JAVAROOT)/$(JAVAORG)/NativeSecp256k1Test.java \ + $(JAVAROOT)/$(JAVAORG)/NativeSecp256k1Util.java \ + $(JAVAROOT)/$(JAVAORG)/Secp256k1Context.java + +if USE_JNI + +$(JAVA_GUAVA): + @echo Guava is missing. Fetch it via: \ + wget https://search.maven.org/remotecontent?filepath=com/google/guava/guava/18.0/guava-18.0.jar -O $(@) + @false + +.stamp-java: $(JAVA_FILES) + @echo Compiling $^ + $(AM_V_at)$(CLASSPATH_ENV) javac $^ + @touch $@ + +if USE_TESTS + +check-java: libsecp256k1.la $(JAVA_GUAVA) .stamp-java + $(AM_V_at)java -Djava.library.path="./:./src:./src/.libs:.libs/" -cp "$(JAVA_GUAVA):$(JAVAROOT)" $(JAVAORG)/NativeSecp256k1Test + +endif +endif + +if USE_ECMULT_STATIC_PRECOMPUTATION +CPPFLAGS_FOR_BUILD +=-I$(top_srcdir) +CFLAGS_FOR_BUILD += -Wall -Wextra -Wno-unused-function + +gen_context_OBJECTS = gen_context.o +gen_context_BIN = gen_context$(BUILD_EXEEXT) +gen_%.o: src/gen_%.c + $(CC_FOR_BUILD) $(CPPFLAGS_FOR_BUILD) $(CFLAGS_FOR_BUILD) -c $< -o $@ + +$(gen_context_BIN): $(gen_context_OBJECTS) + $(CC_FOR_BUILD) $^ -o $@ + +$(libsecp256k1_la_OBJECTS): src/ecmult_static_context.h +$(tests_OBJECTS): src/ecmult_static_context.h +$(bench_internal_OBJECTS): src/ecmult_static_context.h + +src/ecmult_static_context.h: $(gen_context_BIN) + ./$(gen_context_BIN) + +CLEANFILES = $(gen_context_BIN) src/ecmult_static_context.h $(JAVAROOT)/$(JAVAORG)/*.class .stamp-java +endif + +EXTRA_DIST = autogen.sh src/gen_context.c src/basic-config.h $(JAVA_FILES) + +if ENABLE_MODULE_ECDH +include src/modules/ecdh/Makefile.am.include +endif + +if ENABLE_MODULE_RECOVERY +include src/modules/recovery/Makefile.am.include +endif diff --git a/src/cryptoconditions/src/include/secp256k1/README.md b/src/cryptoconditions/src/include/secp256k1/README.md index 6095db422..8cd344ea8 100644 --- a/src/cryptoconditions/src/include/secp256k1/README.md +++ b/src/cryptoconditions/src/include/secp256k1/README.md @@ -1,7 +1,7 @@ libsecp256k1 ============ -[![Build Status](https://travis-ci.org/bitcoin/secp256k1.svg?branch=master)](https://travis-ci.org/bitcoin/secp256k1) +[![Build Status](https://travis-ci.org/bitcoin-core/secp256k1.svg?branch=master)](https://travis-ci.org/bitcoin-core/secp256k1) Optimized C library for EC operations on curve secp256k1. diff --git a/src/cryptoconditions/src/include/secp256k1/build-aux/m4/ax_jni_include_dir.m4 b/src/cryptoconditions/src/include/secp256k1/build-aux/m4/ax_jni_include_dir.m4 new file mode 100644 index 000000000..1fc362761 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/build-aux/m4/ax_jni_include_dir.m4 @@ -0,0 +1,140 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_jni_include_dir.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_JNI_INCLUDE_DIR +# +# DESCRIPTION +# +# AX_JNI_INCLUDE_DIR finds include directories needed for compiling +# programs using the JNI interface. +# +# JNI include directories are usually in the Java distribution. This is +# deduced from the value of $JAVA_HOME, $JAVAC, or the path to "javac", in +# that order. When this macro completes, a list of directories is left in +# the variable JNI_INCLUDE_DIRS. +# +# Example usage follows: +# +# AX_JNI_INCLUDE_DIR +# +# for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS +# do +# CPPFLAGS="$CPPFLAGS -I$JNI_INCLUDE_DIR" +# done +# +# If you want to force a specific compiler: +# +# - at the configure.in level, set JAVAC=yourcompiler before calling +# AX_JNI_INCLUDE_DIR +# +# - at the configure level, setenv JAVAC +# +# Note: This macro can work with the autoconf M4 macros for Java programs. +# This particular macro is not part of the original set of macros. +# +# LICENSE +# +# Copyright (c) 2008 Don Anderson +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 10 + +AU_ALIAS([AC_JNI_INCLUDE_DIR], [AX_JNI_INCLUDE_DIR]) +AC_DEFUN([AX_JNI_INCLUDE_DIR],[ + +JNI_INCLUDE_DIRS="" + +if test "x$JAVA_HOME" != x; then + _JTOPDIR="$JAVA_HOME" +else + if test "x$JAVAC" = x; then + JAVAC=javac + fi + AC_PATH_PROG([_ACJNI_JAVAC], [$JAVAC], [no]) + if test "x$_ACJNI_JAVAC" = xno; then + AC_MSG_WARN([cannot find JDK; try setting \$JAVAC or \$JAVA_HOME]) + fi + _ACJNI_FOLLOW_SYMLINKS("$_ACJNI_JAVAC") + _JTOPDIR=`echo "$_ACJNI_FOLLOWED" | sed -e 's://*:/:g' -e 's:/[[^/]]*$::'` +fi + +case "$host_os" in + darwin*) _JTOPDIR=`echo "$_JTOPDIR" | sed -e 's:/[[^/]]*$::'` + _JINC="$_JTOPDIR/Headers";; + *) _JINC="$_JTOPDIR/include";; +esac +_AS_ECHO_LOG([_JTOPDIR=$_JTOPDIR]) +_AS_ECHO_LOG([_JINC=$_JINC]) + +# On Mac OS X 10.6.4, jni.h is a symlink: +# /System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers/jni.h +# -> ../../CurrentJDK/Headers/jni.h. + +AC_CACHE_CHECK(jni headers, ac_cv_jni_header_path, +[ +if test -f "$_JINC/jni.h"; then + ac_cv_jni_header_path="$_JINC" + JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $ac_cv_jni_header_path" +else + _JTOPDIR=`echo "$_JTOPDIR" | sed -e 's:/[[^/]]*$::'` + if test -f "$_JTOPDIR/include/jni.h"; then + ac_cv_jni_header_path="$_JTOPDIR/include" + JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $ac_cv_jni_header_path" + else + ac_cv_jni_header_path=none + fi +fi +]) + + + +# get the likely subdirectories for system specific java includes +case "$host_os" in +bsdi*) _JNI_INC_SUBDIRS="bsdos";; +darwin*) _JNI_INC_SUBDIRS="darwin";; +freebsd*) _JNI_INC_SUBDIRS="freebsd";; +linux*) _JNI_INC_SUBDIRS="linux genunix";; +osf*) _JNI_INC_SUBDIRS="alpha";; +solaris*) _JNI_INC_SUBDIRS="solaris";; +mingw*) _JNI_INC_SUBDIRS="win32";; +cygwin*) _JNI_INC_SUBDIRS="win32";; +*) _JNI_INC_SUBDIRS="genunix";; +esac + +if test "x$ac_cv_jni_header_path" != "xnone"; then + # add any subdirectories that are present + for JINCSUBDIR in $_JNI_INC_SUBDIRS + do + if test -d "$_JTOPDIR/include/$JINCSUBDIR"; then + JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $_JTOPDIR/include/$JINCSUBDIR" + fi + done +fi +]) + +# _ACJNI_FOLLOW_SYMLINKS +# Follows symbolic links on , +# finally setting variable _ACJNI_FOLLOWED +# ---------------------------------------- +AC_DEFUN([_ACJNI_FOLLOW_SYMLINKS],[ +# find the include directory relative to the javac executable +_cur="$1" +while ls -ld "$_cur" 2>/dev/null | grep " -> " >/dev/null; do + AC_MSG_CHECKING([symlink for $_cur]) + _slink=`ls -ld "$_cur" | sed 's/.* -> //'` + case "$_slink" in + /*) _cur="$_slink";; + # 'X' avoids triggering unwanted echo options. + *) _cur=`echo "X$_cur" | sed -e 's/^X//' -e 's:[[^/]]*$::'`"$_slink";; + esac + AC_MSG_RESULT([$_cur]) +done +_ACJNI_FOLLOWED="$_cur" +])# _ACJNI diff --git a/src/cryptoconditions/src/include/secp256k1/build-aux/m4/ax_prog_cc_for_build.m4 b/src/cryptoconditions/src/include/secp256k1/build-aux/m4/ax_prog_cc_for_build.m4 new file mode 100644 index 000000000..77fd346a7 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/build-aux/m4/ax_prog_cc_for_build.m4 @@ -0,0 +1,125 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_prog_cc_for_build.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_PROG_CC_FOR_BUILD +# +# DESCRIPTION +# +# This macro searches for a C compiler that generates native executables, +# that is a C compiler that surely is not a cross-compiler. This can be +# useful if you have to generate source code at compile-time like for +# example GCC does. +# +# The macro sets the CC_FOR_BUILD and CPP_FOR_BUILD macros to anything +# needed to compile or link (CC_FOR_BUILD) and preprocess (CPP_FOR_BUILD). +# The value of these variables can be overridden by the user by specifying +# a compiler with an environment variable (like you do for standard CC). +# +# It also sets BUILD_EXEEXT and BUILD_OBJEXT to the executable and object +# file extensions for the build platform, and GCC_FOR_BUILD to `yes' if +# the compiler we found is GCC. All these variables but GCC_FOR_BUILD are +# substituted in the Makefile. +# +# LICENSE +# +# Copyright (c) 2008 Paolo Bonzini +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 8 + +AU_ALIAS([AC_PROG_CC_FOR_BUILD], [AX_PROG_CC_FOR_BUILD]) +AC_DEFUN([AX_PROG_CC_FOR_BUILD], [dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_CPP])dnl +AC_REQUIRE([AC_EXEEXT])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl + +dnl Use the standard macros, but make them use other variable names +dnl +pushdef([ac_cv_prog_CPP], ac_cv_build_prog_CPP)dnl +pushdef([ac_cv_prog_gcc], ac_cv_build_prog_gcc)dnl +pushdef([ac_cv_prog_cc_works], ac_cv_build_prog_cc_works)dnl +pushdef([ac_cv_prog_cc_cross], ac_cv_build_prog_cc_cross)dnl +pushdef([ac_cv_prog_cc_g], ac_cv_build_prog_cc_g)dnl +pushdef([ac_cv_exeext], ac_cv_build_exeext)dnl +pushdef([ac_cv_objext], ac_cv_build_objext)dnl +pushdef([ac_exeext], ac_build_exeext)dnl +pushdef([ac_objext], ac_build_objext)dnl +pushdef([CC], CC_FOR_BUILD)dnl +pushdef([CPP], CPP_FOR_BUILD)dnl +pushdef([CFLAGS], CFLAGS_FOR_BUILD)dnl +pushdef([CPPFLAGS], CPPFLAGS_FOR_BUILD)dnl +pushdef([LDFLAGS], LDFLAGS_FOR_BUILD)dnl +pushdef([host], build)dnl +pushdef([host_alias], build_alias)dnl +pushdef([host_cpu], build_cpu)dnl +pushdef([host_vendor], build_vendor)dnl +pushdef([host_os], build_os)dnl +pushdef([ac_cv_host], ac_cv_build)dnl +pushdef([ac_cv_host_alias], ac_cv_build_alias)dnl +pushdef([ac_cv_host_cpu], ac_cv_build_cpu)dnl +pushdef([ac_cv_host_vendor], ac_cv_build_vendor)dnl +pushdef([ac_cv_host_os], ac_cv_build_os)dnl +pushdef([ac_cpp], ac_build_cpp)dnl +pushdef([ac_compile], ac_build_compile)dnl +pushdef([ac_link], ac_build_link)dnl + +save_cross_compiling=$cross_compiling +save_ac_tool_prefix=$ac_tool_prefix +cross_compiling=no +ac_tool_prefix= + +AC_PROG_CC +AC_PROG_CPP +AC_EXEEXT + +ac_tool_prefix=$save_ac_tool_prefix +cross_compiling=$save_cross_compiling + +dnl Restore the old definitions +dnl +popdef([ac_link])dnl +popdef([ac_compile])dnl +popdef([ac_cpp])dnl +popdef([ac_cv_host_os])dnl +popdef([ac_cv_host_vendor])dnl +popdef([ac_cv_host_cpu])dnl +popdef([ac_cv_host_alias])dnl +popdef([ac_cv_host])dnl +popdef([host_os])dnl +popdef([host_vendor])dnl +popdef([host_cpu])dnl +popdef([host_alias])dnl +popdef([host])dnl +popdef([LDFLAGS])dnl +popdef([CPPFLAGS])dnl +popdef([CFLAGS])dnl +popdef([CPP])dnl +popdef([CC])dnl +popdef([ac_objext])dnl +popdef([ac_exeext])dnl +popdef([ac_cv_objext])dnl +popdef([ac_cv_exeext])dnl +popdef([ac_cv_prog_cc_g])dnl +popdef([ac_cv_prog_cc_cross])dnl +popdef([ac_cv_prog_cc_works])dnl +popdef([ac_cv_prog_gcc])dnl +popdef([ac_cv_prog_CPP])dnl + +dnl Finally, set Makefile variables +dnl +BUILD_EXEEXT=$ac_build_exeext +BUILD_OBJEXT=$ac_build_objext +AC_SUBST(BUILD_EXEEXT)dnl +AC_SUBST(BUILD_OBJEXT)dnl +AC_SUBST([CFLAGS_FOR_BUILD])dnl +AC_SUBST([CPPFLAGS_FOR_BUILD])dnl +AC_SUBST([LDFLAGS_FOR_BUILD])dnl +]) diff --git a/src/cryptoconditions/src/include/secp256k1/build-aux/m4/bitcoin_secp.m4 b/src/cryptoconditions/src/include/secp256k1/build-aux/m4/bitcoin_secp.m4 new file mode 100644 index 000000000..b74acb8c1 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/build-aux/m4/bitcoin_secp.m4 @@ -0,0 +1,69 @@ +dnl libsecp25k1 helper checks +AC_DEFUN([SECP_INT128_CHECK],[ +has_int128=$ac_cv_type___int128 +]) + +dnl escape "$0x" below using the m4 quadrigaph @S|@, and escape it again with a \ for the shell. +AC_DEFUN([SECP_64BIT_ASM_CHECK],[ +AC_MSG_CHECKING(for x86_64 assembly availability) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include ]],[[ + uint64_t a = 11, tmp; + __asm__ __volatile__("movq \@S|@0x100000000,%1; mulq %%rsi" : "+a"(a) : "S"(tmp) : "cc", "%rdx"); + ]])],[has_64bit_asm=yes],[has_64bit_asm=no]) +AC_MSG_RESULT([$has_64bit_asm]) +]) + +dnl +AC_DEFUN([SECP_OPENSSL_CHECK],[ + has_libcrypto=no + m4_ifdef([PKG_CHECK_MODULES],[ + PKG_CHECK_MODULES([CRYPTO], [libcrypto], [has_libcrypto=yes],[has_libcrypto=no]) + if test x"$has_libcrypto" = x"yes"; then + TEMP_LIBS="$LIBS" + LIBS="$LIBS $CRYPTO_LIBS" + AC_CHECK_LIB(crypto, main,[AC_DEFINE(HAVE_LIBCRYPTO,1,[Define this symbol if libcrypto is installed])],[has_libcrypto=no]) + LIBS="$TEMP_LIBS" + fi + ]) + if test x$has_libcrypto = xno; then + AC_CHECK_HEADER(openssl/crypto.h,[ + AC_CHECK_LIB(crypto, main,[ + has_libcrypto=yes + CRYPTO_LIBS=-lcrypto + AC_DEFINE(HAVE_LIBCRYPTO,1,[Define this symbol if libcrypto is installed]) + ]) + ]) + LIBS= + fi +if test x"$has_libcrypto" = x"yes" && test x"$has_openssl_ec" = x; then + AC_MSG_CHECKING(for EC functions in libcrypto) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + #include + #include ]],[[ + EC_KEY *eckey = EC_KEY_new_by_curve_name(NID_secp256k1); + ECDSA_sign(0, NULL, 0, NULL, NULL, eckey); + ECDSA_verify(0, NULL, 0, NULL, 0, eckey); + EC_KEY_free(eckey); + ECDSA_SIG *sig_openssl; + sig_openssl = ECDSA_SIG_new(); + (void)sig_openssl->r; + ECDSA_SIG_free(sig_openssl); + ]])],[has_openssl_ec=yes],[has_openssl_ec=no]) + AC_MSG_RESULT([$has_openssl_ec]) +fi +]) + +dnl +AC_DEFUN([SECP_GMP_CHECK],[ +if test x"$has_gmp" != x"yes"; then + CPPFLAGS_TEMP="$CPPFLAGS" + CPPFLAGS="$GMP_CPPFLAGS $CPPFLAGS" + LIBS_TEMP="$LIBS" + LIBS="$GMP_LIBS $LIBS" + AC_CHECK_HEADER(gmp.h,[AC_CHECK_LIB(gmp, __gmpz_init,[has_gmp=yes; GMP_LIBS="$GMP_LIBS -lgmp"; AC_DEFINE(HAVE_LIBGMP,1,[Define this symbol if libgmp is installed])])]) + CPPFLAGS="$CPPFLAGS_TEMP" + LIBS="$LIBS_TEMP" +fi +]) diff --git a/src/cryptoconditions/src/include/secp256k1/configure.ac b/src/cryptoconditions/src/include/secp256k1/configure.ac index 3dc182951..e5fcbcb4e 100644 --- a/src/cryptoconditions/src/include/secp256k1/configure.ac +++ b/src/cryptoconditions/src/include/secp256k1/configure.ac @@ -17,24 +17,19 @@ PKG_PROG_PKG_CONFIG AC_PATH_TOOL(AR, ar) AC_PATH_TOOL(RANLIB, ranlib) AC_PATH_TOOL(STRIP, strip) +AX_PROG_CC_FOR_BUILD if test "x$CFLAGS" = "x"; then - CFLAGS="-O3 -g" + CFLAGS="-g" fi +AM_PROG_CC_C_O + AC_PROG_CC_C89 if test x"$ac_cv_prog_cc_c89" = x"no"; then AC_MSG_ERROR([c89 compiler support required]) fi - -case $host in - *mingw*) - use_pkgconfig=no - ;; - *) - use_pkgconfig=yes - ;; -esac +AM_PROG_AS case $host_os in *darwin*) @@ -80,22 +75,70 @@ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])], CFLAGS="$saved_CFLAGS" ]) +saved_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -fvisibility=hidden" +AC_MSG_CHECKING([if ${CC} supports -fvisibility=hidden]) +AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])], + [ AC_MSG_RESULT([yes]) ], + [ AC_MSG_RESULT([no]) + CFLAGS="$saved_CFLAGS" + ]) AC_ARG_ENABLE(benchmark, AS_HELP_STRING([--enable-benchmark],[compile benchmark (default is no)]), [use_benchmark=$enableval], [use_benchmark=no]) +AC_ARG_ENABLE(coverage, + AS_HELP_STRING([--enable-coverage],[enable compiler flags to support kcov coverage analysis]), + [enable_coverage=$enableval], + [enable_coverage=no]) + AC_ARG_ENABLE(tests, AS_HELP_STRING([--enable-tests],[compile tests (default is yes)]), [use_tests=$enableval], [use_tests=yes]) +AC_ARG_ENABLE(openssl_tests, + AS_HELP_STRING([--enable-openssl-tests],[enable OpenSSL tests, if OpenSSL is available (default is auto)]), + [enable_openssl_tests=$enableval], + [enable_openssl_tests=auto]) + +AC_ARG_ENABLE(experimental, + AS_HELP_STRING([--enable-experimental],[allow experimental configure options (default is no)]), + [use_experimental=$enableval], + [use_experimental=no]) + +AC_ARG_ENABLE(exhaustive_tests, + AS_HELP_STRING([--enable-exhaustive-tests],[compile exhaustive tests (default is yes)]), + [use_exhaustive_tests=$enableval], + [use_exhaustive_tests=yes]) + AC_ARG_ENABLE(endomorphism, AS_HELP_STRING([--enable-endomorphism],[enable endomorphism (default is no)]), [use_endomorphism=$enableval], [use_endomorphism=no]) +AC_ARG_ENABLE(ecmult_static_precomputation, + AS_HELP_STRING([--enable-ecmult-static-precomputation],[enable precomputed ecmult table for signing (default is yes)]), + [use_ecmult_static_precomputation=$enableval], + [use_ecmult_static_precomputation=auto]) + +AC_ARG_ENABLE(module_ecdh, + AS_HELP_STRING([--enable-module-ecdh],[enable ECDH shared secret computation (experimental)]), + [enable_module_ecdh=$enableval], + [enable_module_ecdh=no]) + +AC_ARG_ENABLE(module_recovery, + AS_HELP_STRING([--enable-module-recovery],[enable ECDSA pubkey recovery module (default is no)]), + [enable_module_recovery=$enableval], + [enable_module_recovery=no]) + +AC_ARG_ENABLE(jni, + AS_HELP_STRING([--enable-jni],[enable libsecp256k1_jni (default is auto)]), + [use_jni=$enableval], + [use_jni=auto]) + AC_ARG_WITH([field], [AS_HELP_STRING([--with-field=64bit|32bit|auto], [Specify Field Implementation. Default is auto])],[req_field=$withval], [req_field=auto]) @@ -105,8 +148,8 @@ AC_ARG_WITH([bignum], [AS_HELP_STRING([--with-bignum=gmp|no|auto], AC_ARG_WITH([scalar], [AS_HELP_STRING([--with-scalar=64bit|32bit|auto], [Specify scalar implementation. Default is auto])],[req_scalar=$withval], [req_scalar=auto]) -AC_ARG_WITH([asm], [AS_HELP_STRING([--with-asm=x86_64|no|auto] -[Specify assembly optimizations to use. Default is auto])],[req_asm=$withval], [req_asm=auto]) +AC_ARG_WITH([asm], [AS_HELP_STRING([--with-asm=x86_64|arm|no|auto] +[Specify assembly optimizations to use. Default is auto (experimental: arm)])],[req_asm=$withval], [req_asm=auto]) AC_CHECK_TYPES([__int128]) @@ -116,6 +159,42 @@ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[void myfunc() {__builtin_expect(0,0);}]])], [ AC_MSG_RESULT([no]) ]) +if test x"$enable_coverage" = x"yes"; then + AC_DEFINE(COVERAGE, 1, [Define this symbol to compile out all VERIFY code]) + CFLAGS="$CFLAGS -O0 --coverage" + LDFLAGS="--coverage" +else + CFLAGS="$CFLAGS -O3" +fi + +if test x"$use_ecmult_static_precomputation" != x"no"; then + save_cross_compiling=$cross_compiling + cross_compiling=no + TEMP_CC="$CC" + CC="$CC_FOR_BUILD" + AC_MSG_CHECKING([native compiler: ${CC_FOR_BUILD}]) + AC_RUN_IFELSE( + [AC_LANG_PROGRAM([], [return 0])], + [working_native_cc=yes], + [working_native_cc=no],[dnl]) + CC="$TEMP_CC" + cross_compiling=$save_cross_compiling + + if test x"$working_native_cc" = x"no"; then + set_precomp=no + if test x"$use_ecmult_static_precomputation" = x"yes"; then + AC_MSG_ERROR([${CC_FOR_BUILD} does not produce working binaries. Please set CC_FOR_BUILD]) + else + AC_MSG_RESULT([${CC_FOR_BUILD} does not produce working binaries. Please set CC_FOR_BUILD]) + fi + else + AC_MSG_RESULT([ok]) + set_precomp=yes + fi +else + set_precomp=no +fi + if test x"$req_asm" = x"auto"; then SECP_64BIT_ASM_CHECK if test x"$has_64bit_asm" = x"yes"; then @@ -133,6 +212,8 @@ else AC_MSG_ERROR([x86_64 assembly optimization requested but not available]) fi ;; + arm) + ;; no) ;; *) @@ -225,10 +306,15 @@ else fi # select assembly optimization +use_external_asm=no + case $set_asm in x86_64) AC_DEFINE(USE_ASM_X86_64, 1, [Define this symbol to enable x86_64 assembly optimizations]) ;; +arm) + use_external_asm=yes + ;; no) ;; *) @@ -283,16 +369,48 @@ esac if test x"$use_tests" = x"yes"; then SECP_OPENSSL_CHECK if test x"$has_openssl_ec" = x"yes"; then - AC_DEFINE(ENABLE_OPENSSL_TESTS, 1, [Define this symbol if OpenSSL EC functions are available]) - SECP_TEST_INCLUDES="$SSL_CFLAGS $CRYPTO_CFLAGS" - SECP_TEST_LIBS="$CRYPTO_LIBS" + if test x"$enable_openssl_tests" != x"no"; then + AC_DEFINE(ENABLE_OPENSSL_TESTS, 1, [Define this symbol if OpenSSL EC functions are available]) + SECP_TEST_INCLUDES="$SSL_CFLAGS $CRYPTO_CFLAGS" + SECP_TEST_LIBS="$CRYPTO_LIBS" - case $host in - *mingw*) - SECP_TEST_LIBS="$SECP_TEST_LIBS -lgdi32" - ;; - esac + case $host in + *mingw*) + SECP_TEST_LIBS="$SECP_TEST_LIBS -lgdi32" + ;; + esac + fi + else + if test x"$enable_openssl_tests" = x"yes"; then + AC_MSG_ERROR([OpenSSL tests requested but OpenSSL with EC support is not available]) + fi + fi +else + if test x"$enable_openssl_tests" = x"yes"; then + AC_MSG_ERROR([OpenSSL tests requested but tests are not enabled]) + fi +fi +if test x"$use_jni" != x"no"; then + AX_JNI_INCLUDE_DIR + have_jni_dependencies=yes + if test x"$enable_module_ecdh" = x"no"; then + have_jni_dependencies=no + fi + if test "x$JNI_INCLUDE_DIRS" = "x"; then + have_jni_dependencies=no + fi + if test "x$have_jni_dependencies" = "xno"; then + if test x"$use_jni" = x"yes"; then + AC_MSG_ERROR([jni support explicitly requested but headers/dependencies were not found. Enable ECDH and try again.]) + fi + AC_MSG_WARN([jni headers/dependencies not found. jni support disabled]) + use_jni=no + else + use_jni=yes + for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS; do + JNI_INCLUDES="$JNI_INCLUDES -I$JNI_INCLUDE_DIR" + done fi fi @@ -305,22 +423,67 @@ if test x"$use_endomorphism" = x"yes"; then AC_DEFINE(USE_ENDOMORPHISM, 1, [Define this symbol to use endomorphism optimization]) fi +if test x"$set_precomp" = x"yes"; then + AC_DEFINE(USE_ECMULT_STATIC_PRECOMPUTATION, 1, [Define this symbol to use a statically generated ecmult table]) +fi + +if test x"$enable_module_ecdh" = x"yes"; then + AC_DEFINE(ENABLE_MODULE_ECDH, 1, [Define this symbol to enable the ECDH module]) +fi + +if test x"$enable_module_recovery" = x"yes"; then + AC_DEFINE(ENABLE_MODULE_RECOVERY, 1, [Define this symbol to enable the ECDSA pubkey recovery module]) +fi + AC_C_BIGENDIAN() +if test x"$use_external_asm" = x"yes"; then + AC_DEFINE(USE_EXTERNAL_ASM, 1, [Define this symbol if an external (non-inline) assembly implementation is used]) +fi + +AC_MSG_NOTICE([Using static precomputation: $set_precomp]) AC_MSG_NOTICE([Using assembly optimizations: $set_asm]) AC_MSG_NOTICE([Using field implementation: $set_field]) AC_MSG_NOTICE([Using bignum implementation: $set_bignum]) AC_MSG_NOTICE([Using scalar implementation: $set_scalar]) AC_MSG_NOTICE([Using endomorphism optimizations: $use_endomorphism]) +AC_MSG_NOTICE([Building for coverage analysis: $enable_coverage]) +AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh]) +AC_MSG_NOTICE([Building ECDSA pubkey recovery module: $enable_module_recovery]) +AC_MSG_NOTICE([Using jni: $use_jni]) + +if test x"$enable_experimental" = x"yes"; then + AC_MSG_NOTICE([******]) + AC_MSG_NOTICE([WARNING: experimental build]) + AC_MSG_NOTICE([Experimental features do not have stable APIs or properties, and may not be safe for production use.]) + AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh]) + AC_MSG_NOTICE([******]) +else + if test x"$enable_module_ecdh" = x"yes"; then + AC_MSG_ERROR([ECDH module is experimental. Use --enable-experimental to allow.]) + fi + if test x"$set_asm" = x"arm"; then + AC_MSG_ERROR([ARM assembly optimization is experimental. Use --enable-experimental to allow.]) + fi +fi AC_CONFIG_HEADERS([src/libsecp256k1-config.h]) AC_CONFIG_FILES([Makefile libsecp256k1.pc]) +AC_SUBST(JNI_INCLUDES) AC_SUBST(SECP_INCLUDES) AC_SUBST(SECP_LIBS) AC_SUBST(SECP_TEST_LIBS) AC_SUBST(SECP_TEST_INCLUDES) +AM_CONDITIONAL([ENABLE_COVERAGE], [test x"$enable_coverage" = x"yes"]) AM_CONDITIONAL([USE_TESTS], [test x"$use_tests" != x"no"]) +AM_CONDITIONAL([USE_EXHAUSTIVE_TESTS], [test x"$use_exhaustive_tests" != x"no"]) AM_CONDITIONAL([USE_BENCHMARK], [test x"$use_benchmark" = x"yes"]) +AM_CONDITIONAL([USE_ECMULT_STATIC_PRECOMPUTATION], [test x"$set_precomp" = x"yes"]) +AM_CONDITIONAL([ENABLE_MODULE_ECDH], [test x"$enable_module_ecdh" = x"yes"]) +AM_CONDITIONAL([ENABLE_MODULE_RECOVERY], [test x"$enable_module_recovery" = x"yes"]) +AM_CONDITIONAL([USE_JNI], [test x"$use_jni" == x"yes"]) +AM_CONDITIONAL([USE_EXTERNAL_ASM], [test x"$use_external_asm" = x"yes"]) +AM_CONDITIONAL([USE_ASM_ARM], [test x"$set_asm" = x"arm"]) dnl make sure nothing new is exported so that we don't break the cache PKGCONFIG_PATH_TEMP="$PKG_CONFIG_PATH" diff --git a/src/cryptoconditions/src/include/secp256k1/contrib/lax_der_parsing.c b/src/cryptoconditions/src/include/secp256k1/contrib/lax_der_parsing.c new file mode 100644 index 000000000..5b141a994 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/contrib/lax_der_parsing.c @@ -0,0 +1,150 @@ +/********************************************************************** + * Copyright (c) 2015 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#include +#include + +#include "lax_der_parsing.h" + +int ecdsa_signature_parse_der_lax(const secp256k1_context* ctx, secp256k1_ecdsa_signature* sig, const unsigned char *input, size_t inputlen) { + size_t rpos, rlen, spos, slen; + size_t pos = 0; + size_t lenbyte; + unsigned char tmpsig[64] = {0}; + int overflow = 0; + + /* Hack to initialize sig with a correctly-parsed but invalid signature. */ + secp256k1_ecdsa_signature_parse_compact(ctx, sig, tmpsig); + + /* Sequence tag byte */ + if (pos == inputlen || input[pos] != 0x30) { + return 0; + } + pos++; + + /* Sequence length bytes */ + if (pos == inputlen) { + return 0; + } + lenbyte = input[pos++]; + if (lenbyte & 0x80) { + lenbyte -= 0x80; + if (pos + lenbyte > inputlen) { + return 0; + } + pos += lenbyte; + } + + /* Integer tag byte for R */ + if (pos == inputlen || input[pos] != 0x02) { + return 0; + } + pos++; + + /* Integer length for R */ + if (pos == inputlen) { + return 0; + } + lenbyte = input[pos++]; + if (lenbyte & 0x80) { + lenbyte -= 0x80; + if (pos + lenbyte > inputlen) { + return 0; + } + while (lenbyte > 0 && input[pos] == 0) { + pos++; + lenbyte--; + } + if (lenbyte >= sizeof(size_t)) { + return 0; + } + rlen = 0; + while (lenbyte > 0) { + rlen = (rlen << 8) + input[pos]; + pos++; + lenbyte--; + } + } else { + rlen = lenbyte; + } + if (rlen > inputlen - pos) { + return 0; + } + rpos = pos; + pos += rlen; + + /* Integer tag byte for S */ + if (pos == inputlen || input[pos] != 0x02) { + return 0; + } + pos++; + + /* Integer length for S */ + if (pos == inputlen) { + return 0; + } + lenbyte = input[pos++]; + if (lenbyte & 0x80) { + lenbyte -= 0x80; + if (pos + lenbyte > inputlen) { + return 0; + } + while (lenbyte > 0 && input[pos] == 0) { + pos++; + lenbyte--; + } + if (lenbyte >= sizeof(size_t)) { + return 0; + } + slen = 0; + while (lenbyte > 0) { + slen = (slen << 8) + input[pos]; + pos++; + lenbyte--; + } + } else { + slen = lenbyte; + } + if (slen > inputlen - pos) { + return 0; + } + spos = pos; + pos += slen; + + /* Ignore leading zeroes in R */ + while (rlen > 0 && input[rpos] == 0) { + rlen--; + rpos++; + } + /* Copy R value */ + if (rlen > 32) { + overflow = 1; + } else { + memcpy(tmpsig + 32 - rlen, input + rpos, rlen); + } + + /* Ignore leading zeroes in S */ + while (slen > 0 && input[spos] == 0) { + slen--; + spos++; + } + /* Copy S value */ + if (slen > 32) { + overflow = 1; + } else { + memcpy(tmpsig + 64 - slen, input + spos, slen); + } + + if (!overflow) { + overflow = !secp256k1_ecdsa_signature_parse_compact(ctx, sig, tmpsig); + } + if (overflow) { + memset(tmpsig, 0, 64); + secp256k1_ecdsa_signature_parse_compact(ctx, sig, tmpsig); + } + return 1; +} + diff --git a/src/cryptoconditions/src/include/secp256k1/contrib/lax_der_parsing.h b/src/cryptoconditions/src/include/secp256k1/contrib/lax_der_parsing.h new file mode 100644 index 000000000..7eaf63bf6 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/contrib/lax_der_parsing.h @@ -0,0 +1,91 @@ +/********************************************************************** + * Copyright (c) 2015 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +/**** + * Please do not link this file directly. It is not part of the libsecp256k1 + * project and does not promise any stability in its API, functionality or + * presence. Projects which use this code should instead copy this header + * and its accompanying .c file directly into their codebase. + ****/ + +/* This file defines a function that parses DER with various errors and + * violations. This is not a part of the library itself, because the allowed + * violations are chosen arbitrarily and do not follow or establish any + * standard. + * + * In many places it matters that different implementations do not only accept + * the same set of valid signatures, but also reject the same set of signatures. + * The only means to accomplish that is by strictly obeying a standard, and not + * accepting anything else. + * + * Nonetheless, sometimes there is a need for compatibility with systems that + * use signatures which do not strictly obey DER. The snippet below shows how + * certain violations are easily supported. You may need to adapt it. + * + * Do not use this for new systems. Use well-defined DER or compact signatures + * instead if you have the choice (see secp256k1_ecdsa_signature_parse_der and + * secp256k1_ecdsa_signature_parse_compact). + * + * The supported violations are: + * - All numbers are parsed as nonnegative integers, even though X.609-0207 + * section 8.3.3 specifies that integers are always encoded as two's + * complement. + * - Integers can have length 0, even though section 8.3.1 says they can't. + * - Integers with overly long padding are accepted, violation section + * 8.3.2. + * - 127-byte long length descriptors are accepted, even though section + * 8.1.3.5.c says that they are not. + * - Trailing garbage data inside or after the signature is ignored. + * - The length descriptor of the sequence is ignored. + * + * Compared to for example OpenSSL, many violations are NOT supported: + * - Using overly long tag descriptors for the sequence or integers inside, + * violating section 8.1.2.2. + * - Encoding primitive integers as constructed values, violating section + * 8.3.1. + */ + +#ifndef SECP256K1_CONTRIB_LAX_DER_PARSING_H +#define SECP256K1_CONTRIB_LAX_DER_PARSING_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** Parse a signature in "lax DER" format + * + * Returns: 1 when the signature could be parsed, 0 otherwise. + * Args: ctx: a secp256k1 context object + * Out: sig: a pointer to a signature object + * In: input: a pointer to the signature to be parsed + * inputlen: the length of the array pointed to be input + * + * This function will accept any valid DER encoded signature, even if the + * encoded numbers are out of range. In addition, it will accept signatures + * which violate the DER spec in various ways. Its purpose is to allow + * validation of the Bitcoin blockchain, which includes non-DER signatures + * from before the network rules were updated to enforce DER. Note that + * the set of supported violations is a strict subset of what OpenSSL will + * accept. + * + * After the call, sig will always be initialized. If parsing failed or the + * encoded numbers are out of range, signature validation with it is + * guaranteed to fail for every message and public key. + */ +int ecdsa_signature_parse_der_lax( + const secp256k1_context* ctx, + secp256k1_ecdsa_signature* sig, + const unsigned char *input, + size_t inputlen +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +#ifdef __cplusplus +} +#endif + +#endif /* SECP256K1_CONTRIB_LAX_DER_PARSING_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/contrib/lax_der_privatekey_parsing.c b/src/cryptoconditions/src/include/secp256k1/contrib/lax_der_privatekey_parsing.c new file mode 100644 index 000000000..c2e63b4b8 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/contrib/lax_der_privatekey_parsing.c @@ -0,0 +1,113 @@ +/********************************************************************** + * Copyright (c) 2014, 2015 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#include +#include + +#include "lax_der_privatekey_parsing.h" + +int ec_privkey_import_der(const secp256k1_context* ctx, unsigned char *out32, const unsigned char *privkey, size_t privkeylen) { + const unsigned char *end = privkey + privkeylen; + int lenb = 0; + int len = 0; + memset(out32, 0, 32); + /* sequence header */ + if (end < privkey+1 || *privkey != 0x30) { + return 0; + } + privkey++; + /* sequence length constructor */ + if (end < privkey+1 || !(*privkey & 0x80)) { + return 0; + } + lenb = *privkey & ~0x80; privkey++; + if (lenb < 1 || lenb > 2) { + return 0; + } + if (end < privkey+lenb) { + return 0; + } + /* sequence length */ + len = privkey[lenb-1] | (lenb > 1 ? privkey[lenb-2] << 8 : 0); + privkey += lenb; + if (end < privkey+len) { + return 0; + } + /* sequence element 0: version number (=1) */ + if (end < privkey+3 || privkey[0] != 0x02 || privkey[1] != 0x01 || privkey[2] != 0x01) { + return 0; + } + privkey += 3; + /* sequence element 1: octet string, up to 32 bytes */ + if (end < privkey+2 || privkey[0] != 0x04 || privkey[1] > 0x20 || end < privkey+2+privkey[1]) { + return 0; + } + memcpy(out32 + 32 - privkey[1], privkey + 2, privkey[1]); + if (!secp256k1_ec_seckey_verify(ctx, out32)) { + memset(out32, 0, 32); + return 0; + } + return 1; +} + +int ec_privkey_export_der(const secp256k1_context *ctx, unsigned char *privkey, size_t *privkeylen, const unsigned char *key32, int compressed) { + secp256k1_pubkey pubkey; + size_t pubkeylen = 0; + if (!secp256k1_ec_pubkey_create(ctx, &pubkey, key32)) { + *privkeylen = 0; + return 0; + } + if (compressed) { + static const unsigned char begin[] = { + 0x30,0x81,0xD3,0x02,0x01,0x01,0x04,0x20 + }; + static const unsigned char middle[] = { + 0xA0,0x81,0x85,0x30,0x81,0x82,0x02,0x01,0x01,0x30,0x2C,0x06,0x07,0x2A,0x86,0x48, + 0xCE,0x3D,0x01,0x01,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F,0x30,0x06,0x04,0x01,0x00,0x04,0x01,0x07,0x04, + 0x21,0x02,0x79,0xBE,0x66,0x7E,0xF9,0xDC,0xBB,0xAC,0x55,0xA0,0x62,0x95,0xCE,0x87, + 0x0B,0x07,0x02,0x9B,0xFC,0xDB,0x2D,0xCE,0x28,0xD9,0x59,0xF2,0x81,0x5B,0x16,0xF8, + 0x17,0x98,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,0xBF,0xD2,0x5E, + 0x8C,0xD0,0x36,0x41,0x41,0x02,0x01,0x01,0xA1,0x24,0x03,0x22,0x00 + }; + unsigned char *ptr = privkey; + memcpy(ptr, begin, sizeof(begin)); ptr += sizeof(begin); + memcpy(ptr, key32, 32); ptr += 32; + memcpy(ptr, middle, sizeof(middle)); ptr += sizeof(middle); + pubkeylen = 33; + secp256k1_ec_pubkey_serialize(ctx, ptr, &pubkeylen, &pubkey, SECP256K1_EC_COMPRESSED); + ptr += pubkeylen; + *privkeylen = ptr - privkey; + } else { + static const unsigned char begin[] = { + 0x30,0x82,0x01,0x13,0x02,0x01,0x01,0x04,0x20 + }; + static const unsigned char middle[] = { + 0xA0,0x81,0xA5,0x30,0x81,0xA2,0x02,0x01,0x01,0x30,0x2C,0x06,0x07,0x2A,0x86,0x48, + 0xCE,0x3D,0x01,0x01,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F,0x30,0x06,0x04,0x01,0x00,0x04,0x01,0x07,0x04, + 0x41,0x04,0x79,0xBE,0x66,0x7E,0xF9,0xDC,0xBB,0xAC,0x55,0xA0,0x62,0x95,0xCE,0x87, + 0x0B,0x07,0x02,0x9B,0xFC,0xDB,0x2D,0xCE,0x28,0xD9,0x59,0xF2,0x81,0x5B,0x16,0xF8, + 0x17,0x98,0x48,0x3A,0xDA,0x77,0x26,0xA3,0xC4,0x65,0x5D,0xA4,0xFB,0xFC,0x0E,0x11, + 0x08,0xA8,0xFD,0x17,0xB4,0x48,0xA6,0x85,0x54,0x19,0x9C,0x47,0xD0,0x8F,0xFB,0x10, + 0xD4,0xB8,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,0xBF,0xD2,0x5E, + 0x8C,0xD0,0x36,0x41,0x41,0x02,0x01,0x01,0xA1,0x44,0x03,0x42,0x00 + }; + unsigned char *ptr = privkey; + memcpy(ptr, begin, sizeof(begin)); ptr += sizeof(begin); + memcpy(ptr, key32, 32); ptr += 32; + memcpy(ptr, middle, sizeof(middle)); ptr += sizeof(middle); + pubkeylen = 65; + secp256k1_ec_pubkey_serialize(ctx, ptr, &pubkeylen, &pubkey, SECP256K1_EC_UNCOMPRESSED); + ptr += pubkeylen; + *privkeylen = ptr - privkey; + } + return 1; +} diff --git a/src/cryptoconditions/src/include/secp256k1/contrib/lax_der_privatekey_parsing.h b/src/cryptoconditions/src/include/secp256k1/contrib/lax_der_privatekey_parsing.h new file mode 100644 index 000000000..fece261fb --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/contrib/lax_der_privatekey_parsing.h @@ -0,0 +1,90 @@ +/********************************************************************** + * Copyright (c) 2014, 2015 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +/**** + * Please do not link this file directly. It is not part of the libsecp256k1 + * project and does not promise any stability in its API, functionality or + * presence. Projects which use this code should instead copy this header + * and its accompanying .c file directly into their codebase. + ****/ + +/* This file contains code snippets that parse DER private keys with + * various errors and violations. This is not a part of the library + * itself, because the allowed violations are chosen arbitrarily and + * do not follow or establish any standard. + * + * It also contains code to serialize private keys in a compatible + * manner. + * + * These functions are meant for compatibility with applications + * that require BER encoded keys. When working with secp256k1-specific + * code, the simple 32-byte private keys normally used by the + * library are sufficient. + */ + +#ifndef SECP256K1_CONTRIB_BER_PRIVATEKEY_H +#define SECP256K1_CONTRIB_BER_PRIVATEKEY_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** Export a private key in DER format. + * + * Returns: 1 if the private key was valid. + * Args: ctx: pointer to a context object, initialized for signing (cannot + * be NULL) + * Out: privkey: pointer to an array for storing the private key in BER. + * Should have space for 279 bytes, and cannot be NULL. + * privkeylen: Pointer to an int where the length of the private key in + * privkey will be stored. + * In: seckey: pointer to a 32-byte secret key to export. + * compressed: 1 if the key should be exported in + * compressed format, 0 otherwise + * + * This function is purely meant for compatibility with applications that + * require BER encoded keys. When working with secp256k1-specific code, the + * simple 32-byte private keys are sufficient. + * + * Note that this function does not guarantee correct DER output. It is + * guaranteed to be parsable by secp256k1_ec_privkey_import_der + */ +SECP256K1_WARN_UNUSED_RESULT int ec_privkey_export_der( + const secp256k1_context* ctx, + unsigned char *privkey, + size_t *privkeylen, + const unsigned char *seckey, + int compressed +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); + +/** Import a private key in DER format. + * Returns: 1 if a private key was extracted. + * Args: ctx: pointer to a context object (cannot be NULL). + * Out: seckey: pointer to a 32-byte array for storing the private key. + * (cannot be NULL). + * In: privkey: pointer to a private key in DER format (cannot be NULL). + * privkeylen: length of the DER private key pointed to be privkey. + * + * This function will accept more than just strict DER, and even allow some BER + * violations. The public key stored inside the DER-encoded private key is not + * verified for correctness, nor are the curve parameters. Use this function + * only if you know in advance it is supposed to contain a secp256k1 private + * key. + */ +SECP256K1_WARN_UNUSED_RESULT int ec_privkey_import_der( + const secp256k1_context* ctx, + unsigned char *seckey, + const unsigned char *privkey, + size_t privkeylen +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +#ifdef __cplusplus +} +#endif + +#endif /* SECP256K1_CONTRIB_BER_PRIVATEKEY_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/include/secp256k1.h b/src/cryptoconditions/src/include/secp256k1/include/secp256k1.h index 9db5cf3a8..3e9c098d1 100644 --- a/src/cryptoconditions/src/include/secp256k1/include/secp256k1.h +++ b/src/cryptoconditions/src/include/secp256k1/include/secp256k1.h @@ -1,9 +1,96 @@ -#ifndef _SECP256K1_ -# define _SECP256K1_ +#ifndef SECP256K1_H +#define SECP256K1_H -# ifdef __cplusplus +#ifdef __cplusplus extern "C" { -# endif +#endif + +#include + +/* These rules specify the order of arguments in API calls: + * + * 1. Context pointers go first, followed by output arguments, combined + * output/input arguments, and finally input-only arguments. + * 2. Array lengths always immediately the follow the argument whose length + * they describe, even if this violates rule 1. + * 3. Within the OUT/OUTIN/IN groups, pointers to data that is typically generated + * later go first. This means: signatures, public nonces, private nonces, + * messages, public keys, secret keys, tweaks. + * 4. Arguments that are not data pointers go last, from more complex to less + * complex: function pointers, algorithm names, messages, void pointers, + * counts, flags, booleans. + * 5. Opaque data pointers follow the function pointer they are to be passed to. + */ + +/** Opaque data structure that holds context information (precomputed tables etc.). + * + * The purpose of context structures is to cache large precomputed data tables + * that are expensive to construct, and also to maintain the randomization data + * for blinding. + * + * Do not create a new context object for each operation, as construction is + * far slower than all other API calls (~100 times slower than an ECDSA + * verification). + * + * A constructed context can safely be used from multiple threads + * simultaneously, but API call that take a non-const pointer to a context + * need exclusive access to it. In particular this is the case for + * secp256k1_context_destroy and secp256k1_context_randomize. + * + * Regarding randomization, either do it once at creation time (in which case + * you do not need any locking for the other calls), or use a read-write lock. + */ +typedef struct secp256k1_context_struct secp256k1_context; + +/** Opaque data structure that holds a parsed and valid public key. + * + * The exact representation of data inside is implementation defined and not + * guaranteed to be portable between different platforms or versions. It is + * however guaranteed to be 64 bytes in size, and can be safely copied/moved. + * If you need to convert to a format suitable for storage, transmission, or + * comparison, use secp256k1_ec_pubkey_serialize and secp256k1_ec_pubkey_parse. + */ +typedef struct { + unsigned char data[64]; +} secp256k1_pubkey; + +/** Opaque data structured that holds a parsed ECDSA signature. + * + * The exact representation of data inside is implementation defined and not + * guaranteed to be portable between different platforms or versions. It is + * however guaranteed to be 64 bytes in size, and can be safely copied/moved. + * If you need to convert to a format suitable for storage, transmission, or + * comparison, use the secp256k1_ecdsa_signature_serialize_* and + * secp256k1_ecdsa_signature_parse_* functions. + */ +typedef struct { + unsigned char data[64]; +} secp256k1_ecdsa_signature; + +/** A pointer to a function to deterministically generate a nonce. + * + * Returns: 1 if a nonce was successfully generated. 0 will cause signing to fail. + * Out: nonce32: pointer to a 32-byte array to be filled by the function. + * In: msg32: the 32-byte message hash being verified (will not be NULL) + * key32: pointer to a 32-byte secret key (will not be NULL) + * algo16: pointer to a 16-byte array describing the signature + * algorithm (will be NULL for ECDSA for compatibility). + * data: Arbitrary data pointer that is passed through. + * attempt: how many iterations we have tried to find a nonce. + * This will almost always be 0, but different attempt values + * are required to result in a different nonce. + * + * Except for test cases, this function should compute some cryptographic hash of + * the message, the algorithm, the key and the attempt. + */ +typedef int (*secp256k1_nonce_function)( + unsigned char *nonce32, + const unsigned char *msg32, + const unsigned char *key32, + const unsigned char *algo16, + void *data, + unsigned int attempt +); # if !defined(SECP256K1_GNUC_PREREQ) # if defined(__GNUC__)&&defined(__GNUC_MINOR__) @@ -26,6 +113,20 @@ extern "C" { # define SECP256K1_INLINE inline # endif +#ifndef SECP256K1_API +# if defined(_WIN32) +# ifdef SECP256K1_BUILD +# define SECP256K1_API __declspec(dllexport) +# else +# define SECP256K1_API +# endif +# elif defined(__GNUC__) && defined(SECP256K1_BUILD) +# define SECP256K1_API __attribute__ ((visibility ("default"))) +# else +# define SECP256K1_API +# endif +#endif + /**Warning attributes * NONNULL is not used if SECP256K1_BUILD is set to avoid the compiler optimizing out * some paranoid null checks. */ @@ -40,320 +141,481 @@ extern "C" { # define SECP256K1_ARG_NONNULL(_x) # endif -/** Opaque data structure that holds context information (precomputed tables etc.). - * Only functions that take a pointer to a non-const context require exclusive - * access to it. Multiple functions that take a pointer to a const context may - * run simultaneously. - */ -typedef struct secp256k1_context_struct secp256k1_context_t; +/** All flags' lower 8 bits indicate what they're for. Do not use directly. */ +#define SECP256K1_FLAGS_TYPE_MASK ((1 << 8) - 1) +#define SECP256K1_FLAGS_TYPE_CONTEXT (1 << 0) +#define SECP256K1_FLAGS_TYPE_COMPRESSION (1 << 1) +/** The higher bits contain the actual data. Do not use directly. */ +#define SECP256K1_FLAGS_BIT_CONTEXT_VERIFY (1 << 8) +#define SECP256K1_FLAGS_BIT_CONTEXT_SIGN (1 << 9) +#define SECP256K1_FLAGS_BIT_COMPRESSION (1 << 8) /** Flags to pass to secp256k1_context_create. */ -# define SECP256K1_CONTEXT_VERIFY (1 << 0) -# define SECP256K1_CONTEXT_SIGN (1 << 1) +#define SECP256K1_CONTEXT_VERIFY (SECP256K1_FLAGS_TYPE_CONTEXT | SECP256K1_FLAGS_BIT_CONTEXT_VERIFY) +#define SECP256K1_CONTEXT_SIGN (SECP256K1_FLAGS_TYPE_CONTEXT | SECP256K1_FLAGS_BIT_CONTEXT_SIGN) +#define SECP256K1_CONTEXT_NONE (SECP256K1_FLAGS_TYPE_CONTEXT) + +/** Flag to pass to secp256k1_ec_pubkey_serialize and secp256k1_ec_privkey_export. */ +#define SECP256K1_EC_COMPRESSED (SECP256K1_FLAGS_TYPE_COMPRESSION | SECP256K1_FLAGS_BIT_COMPRESSION) +#define SECP256K1_EC_UNCOMPRESSED (SECP256K1_FLAGS_TYPE_COMPRESSION) + +/** Prefix byte used to tag various encoded curvepoints for specific purposes */ +#define SECP256K1_TAG_PUBKEY_EVEN 0x02 +#define SECP256K1_TAG_PUBKEY_ODD 0x03 +#define SECP256K1_TAG_PUBKEY_UNCOMPRESSED 0x04 +#define SECP256K1_TAG_PUBKEY_HYBRID_EVEN 0x06 +#define SECP256K1_TAG_PUBKEY_HYBRID_ODD 0x07 /** Create a secp256k1 context object. + * * Returns: a newly created context object. * In: flags: which parts of the context to initialize. + * + * See also secp256k1_context_randomize. */ -secp256k1_context_t* secp256k1_context_create( - int flags +SECP256K1_API secp256k1_context* secp256k1_context_create( + unsigned int flags ) SECP256K1_WARN_UNUSED_RESULT; /** Copies a secp256k1 context object. + * * Returns: a newly created context object. - * In: ctx: an existing context to copy + * Args: ctx: an existing context to copy (cannot be NULL) */ -secp256k1_context_t* secp256k1_context_clone( - const secp256k1_context_t* ctx -) SECP256K1_WARN_UNUSED_RESULT; +SECP256K1_API secp256k1_context* secp256k1_context_clone( + const secp256k1_context* ctx +) SECP256K1_ARG_NONNULL(1) SECP256K1_WARN_UNUSED_RESULT; /** Destroy a secp256k1 context object. + * * The context pointer may not be used afterwards. + * Args: ctx: an existing context to destroy (cannot be NULL) */ -void secp256k1_context_destroy( - secp256k1_context_t* ctx +SECP256K1_API void secp256k1_context_destroy( + secp256k1_context* ctx +); + +/** Set a callback function to be called when an illegal argument is passed to + * an API call. It will only trigger for violations that are mentioned + * explicitly in the header. + * + * The philosophy is that these shouldn't be dealt with through a + * specific return value, as calling code should not have branches to deal with + * the case that this code itself is broken. + * + * On the other hand, during debug stage, one would want to be informed about + * such mistakes, and the default (crashing) may be inadvisable. + * When this callback is triggered, the API function called is guaranteed not + * to cause a crash, though its return value and output arguments are + * undefined. + * + * Args: ctx: an existing context object (cannot be NULL) + * In: fun: a pointer to a function to call when an illegal argument is + * passed to the API, taking a message and an opaque pointer + * (NULL restores a default handler that calls abort). + * data: the opaque pointer to pass to fun above. + */ +SECP256K1_API void secp256k1_context_set_illegal_callback( + secp256k1_context* ctx, + void (*fun)(const char* message, void* data), + const void* data ) SECP256K1_ARG_NONNULL(1); +/** Set a callback function to be called when an internal consistency check + * fails. The default is crashing. + * + * This can only trigger in case of a hardware failure, miscompilation, + * memory corruption, serious bug in the library, or other error would can + * otherwise result in undefined behaviour. It will not trigger due to mere + * incorrect usage of the API (see secp256k1_context_set_illegal_callback + * for that). After this callback returns, anything may happen, including + * crashing. + * + * Args: ctx: an existing context object (cannot be NULL) + * In: fun: a pointer to a function to call when an internal error occurs, + * taking a message and an opaque pointer (NULL restores a default + * handler that calls abort). + * data: the opaque pointer to pass to fun above. + */ +SECP256K1_API void secp256k1_context_set_error_callback( + secp256k1_context* ctx, + void (*fun)(const char* message, void* data), + const void* data +) SECP256K1_ARG_NONNULL(1); + +/** Parse a variable-length public key into the pubkey object. + * + * Returns: 1 if the public key was fully valid. + * 0 if the public key could not be parsed or is invalid. + * Args: ctx: a secp256k1 context object. + * Out: pubkey: pointer to a pubkey object. If 1 is returned, it is set to a + * parsed version of input. If not, its value is undefined. + * In: input: pointer to a serialized public key + * inputlen: length of the array pointed to by input + * + * This function supports parsing compressed (33 bytes, header byte 0x02 or + * 0x03), uncompressed (65 bytes, header byte 0x04), or hybrid (65 bytes, header + * byte 0x06 or 0x07) format public keys. + */ +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_parse( + const secp256k1_context* ctx, + secp256k1_pubkey* pubkey, + const unsigned char *input, + size_t inputlen +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +/** Serialize a pubkey object into a serialized byte sequence. + * + * Returns: 1 always. + * Args: ctx: a secp256k1 context object. + * Out: output: a pointer to a 65-byte (if compressed==0) or 33-byte (if + * compressed==1) byte array to place the serialized key + * in. + * In/Out: outputlen: a pointer to an integer which is initially set to the + * size of output, and is overwritten with the written + * size. + * In: pubkey: a pointer to a secp256k1_pubkey containing an + * initialized public key. + * flags: SECP256K1_EC_COMPRESSED if serialization should be in + * compressed format, otherwise SECP256K1_EC_UNCOMPRESSED. + */ +SECP256K1_API int secp256k1_ec_pubkey_serialize( + const secp256k1_context* ctx, + unsigned char *output, + size_t *outputlen, + const secp256k1_pubkey* pubkey, + unsigned int flags +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); + +/** Parse an ECDSA signature in compact (64 bytes) format. + * + * Returns: 1 when the signature could be parsed, 0 otherwise. + * Args: ctx: a secp256k1 context object + * Out: sig: a pointer to a signature object + * In: input64: a pointer to the 64-byte array to parse + * + * The signature must consist of a 32-byte big endian R value, followed by a + * 32-byte big endian S value. If R or S fall outside of [0..order-1], the + * encoding is invalid. R and S with value 0 are allowed in the encoding. + * + * After the call, sig will always be initialized. If parsing failed or R or + * S are zero, the resulting sig value is guaranteed to fail validation for any + * message and public key. + */ +SECP256K1_API int secp256k1_ecdsa_signature_parse_compact( + const secp256k1_context* ctx, + secp256k1_ecdsa_signature* sig, + const unsigned char *input64 +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +/** Parse a DER ECDSA signature. + * + * Returns: 1 when the signature could be parsed, 0 otherwise. + * Args: ctx: a secp256k1 context object + * Out: sig: a pointer to a signature object + * In: input: a pointer to the signature to be parsed + * inputlen: the length of the array pointed to be input + * + * This function will accept any valid DER encoded signature, even if the + * encoded numbers are out of range. + * + * After the call, sig will always be initialized. If parsing failed or the + * encoded numbers are out of range, signature validation with it is + * guaranteed to fail for every message and public key. + */ +SECP256K1_API int secp256k1_ecdsa_signature_parse_der( + const secp256k1_context* ctx, + secp256k1_ecdsa_signature* sig, + const unsigned char *input, + size_t inputlen +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +/** Serialize an ECDSA signature in DER format. + * + * Returns: 1 if enough space was available to serialize, 0 otherwise + * Args: ctx: a secp256k1 context object + * Out: output: a pointer to an array to store the DER serialization + * In/Out: outputlen: a pointer to a length integer. Initially, this integer + * should be set to the length of output. After the call + * it will be set to the length of the serialization (even + * if 0 was returned). + * In: sig: a pointer to an initialized signature object + */ +SECP256K1_API int secp256k1_ecdsa_signature_serialize_der( + const secp256k1_context* ctx, + unsigned char *output, + size_t *outputlen, + const secp256k1_ecdsa_signature* sig +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); + +/** Serialize an ECDSA signature in compact (64 byte) format. + * + * Returns: 1 + * Args: ctx: a secp256k1 context object + * Out: output64: a pointer to a 64-byte array to store the compact serialization + * In: sig: a pointer to an initialized signature object + * + * See secp256k1_ecdsa_signature_parse_compact for details about the encoding. + */ +SECP256K1_API int secp256k1_ecdsa_signature_serialize_compact( + const secp256k1_context* ctx, + unsigned char *output64, + const secp256k1_ecdsa_signature* sig +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + /** Verify an ECDSA signature. + * * Returns: 1: correct signature - * 0: incorrect signature - * -1: invalid public key - * -2: invalid signature - * In: ctx: a secp256k1 context object, initialized for verification. + * 0: incorrect or unparseable signature + * Args: ctx: a secp256k1 context object, initialized for verification. + * In: sig: the signature being verified (cannot be NULL) * msg32: the 32-byte message hash being verified (cannot be NULL) - * sig: the signature being verified (cannot be NULL) - * siglen: the length of the signature - * pubkey: the public key to verify with (cannot be NULL) - * pubkeylen: the length of pubkey + * pubkey: pointer to an initialized public key to verify with (cannot be NULL) + * + * To avoid accepting malleable signatures, only ECDSA signatures in lower-S + * form are accepted. + * + * If you need to accept ECDSA signatures from sources that do not obey this + * rule, apply secp256k1_ecdsa_signature_normalize to the signature prior to + * validation, but be aware that doing so results in malleable signatures. + * + * For details, see the comments for that function. */ -SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_verify( - const secp256k1_context_t* ctx, - const unsigned char *msg32, - const unsigned char *sig, - int siglen, - const unsigned char *pubkey, - int pubkeylen -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(5); +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_verify( + const secp256k1_context* ctx, + const secp256k1_ecdsa_signature *sig, + const unsigned char *msg32, + const secp256k1_pubkey *pubkey +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); -/** Check that signature is in canonical form - * Returns: 1: In canonical form - * 0: Non canonical - * -1: invalid signature - * In: sig: the signature being verified (cannot be NULL) - * siglen: the length of the signature +/** Convert a signature to a normalized lower-S form. + * + * Returns: 1 if sigin was not normalized, 0 if it already was. + * Args: ctx: a secp256k1 context object + * Out: sigout: a pointer to a signature to fill with the normalized form, + * or copy if the input was already normalized. (can be NULL if + * you're only interested in whether the input was already + * normalized). + * In: sigin: a pointer to a signature to check/normalize (cannot be NULL, + * can be identical to sigout) + * + * With ECDSA a third-party can forge a second distinct signature of the same + * message, given a single initial signature, but without knowing the key. This + * is done by negating the S value modulo the order of the curve, 'flipping' + * the sign of the random point R which is not included in the signature. + * + * Forgery of the same message isn't universally problematic, but in systems + * where message malleability or uniqueness of signatures is important this can + * cause issues. This forgery can be blocked by all verifiers forcing signers + * to use a normalized form. + * + * The lower-S form reduces the size of signatures slightly on average when + * variable length encodings (such as DER) are used and is cheap to verify, + * making it a good choice. Security of always using lower-S is assured because + * anyone can trivially modify a signature after the fact to enforce this + * property anyway. + * + * The lower S value is always between 0x1 and + * 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, + * inclusive. + * + * No other forms of ECDSA malleability are known and none seem likely, but + * there is no formal proof that ECDSA, even with this additional restriction, + * is free of other malleability. Commonly used serialization schemes will also + * accept various non-unique encodings, so care should be taken when this + * property is required for an application. + * + * The secp256k1_ecdsa_sign function will by default create signatures in the + * lower-S form, and secp256k1_ecdsa_verify will not accept others. In case + * signatures come from a system that cannot enforce this property, + * secp256k1_ecdsa_signature_normalize must be called before verification. */ -SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_check_canonical_sig( - const unsigned char *sig, - int siglen -) SECP256K1_ARG_NONNULL(1); - -/** A pointer to a function to deterministically generate a nonce. - * Returns: 1 if a nonce was successfully generated. 0 will cause signing to fail. - * In: msg32: the 32-byte message hash being verified (will not be NULL) - * key32: pointer to a 32-byte secret key (will not be NULL) - * attempt: how many iterations we have tried to find a nonce. - * This will almost always be 0, but different attempt values - * are required to result in a different nonce. - * data: Arbitrary data pointer that is passed through. - * Out: nonce32: pointer to a 32-byte array to be filled by the function. - * Except for test cases, this function should compute some cryptographic hash of - * the message, the key and the attempt. - */ -typedef int (*secp256k1_nonce_function_t)( - unsigned char *nonce32, - const unsigned char *msg32, - const unsigned char *key32, - unsigned int attempt, - const void *data -); +SECP256K1_API int secp256k1_ecdsa_signature_normalize( + const secp256k1_context* ctx, + secp256k1_ecdsa_signature *sigout, + const secp256k1_ecdsa_signature *sigin +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(3); /** An implementation of RFC6979 (using HMAC-SHA256) as nonce generation function. * If a data pointer is passed, it is assumed to be a pointer to 32 bytes of * extra entropy. */ -extern const secp256k1_nonce_function_t secp256k1_nonce_function_rfc6979; +SECP256K1_API extern const secp256k1_nonce_function secp256k1_nonce_function_rfc6979; /** A default safe nonce generation function (currently equal to secp256k1_nonce_function_rfc6979). */ -extern const secp256k1_nonce_function_t secp256k1_nonce_function_default; - +SECP256K1_API extern const secp256k1_nonce_function secp256k1_nonce_function_default; /** Create an ECDSA signature. - * Returns: 1: signature created - * 0: the nonce generation function failed, the private key was invalid, or there is not - * enough space in the signature (as indicated by siglen). - * In: ctx: pointer to a context object, initialized for signing (cannot be NULL) - * msg32: the 32-byte message hash being signed (cannot be NULL) - * seckey: pointer to a 32-byte secret key (cannot be NULL) - * noncefp:pointer to a nonce generation function. If NULL, secp256k1_nonce_function_default is used - * ndata: pointer to arbitrary data used by the nonce generation function (can be NULL) - * Out: sig: pointer to an array where the signature will be placed (cannot be NULL) - * In/Out: siglen: pointer to an int with the length of sig, which will be updated - * to contain the actual signature length (<=72). * - * The sig always has an s value in the lower half of the range (From 0x1 - * to 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, - * inclusive), unlike many other implementations. - * With ECDSA a third-party can can forge a second distinct signature - * of the same message given a single initial signature without knowing - * the key by setting s to its additive inverse mod-order, 'flipping' the - * sign of the random point R which is not included in the signature. - * Since the forgery is of the same message this isn't universally - * problematic, but in systems where message malleability or uniqueness - * of signatures is important this can cause issues. This forgery can be - * blocked by all verifiers forcing signers to use a canonical form. The - * lower-S form reduces the size of signatures slightly on average when - * variable length encodings (such as DER) are used and is cheap to - * verify, making it a good choice. Security of always using lower-S is - * assured because anyone can trivially modify a signature after the - * fact to enforce this property. Adjusting it inside the signing - * function avoids the need to re-serialize or have curve specific - * constants outside of the library. By always using a canonical form - * even in applications where it isn't needed it becomes possible to - * impose a requirement later if a need is discovered. - * No other forms of ECDSA malleability are known and none seem likely, - * but there is no formal proof that ECDSA, even with this additional - * restriction, is free of other malleability. Commonly used serialization - * schemes will also accept various non-unique encodings, so care should - * be taken when this property is required for an application. - */ -int secp256k1_ecdsa_sign( - const secp256k1_context_t* ctx, - const unsigned char *msg32, - unsigned char *sig, - int *siglen, - const unsigned char *seckey, - secp256k1_nonce_function_t noncefp, - const void *ndata -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4) SECP256K1_ARG_NONNULL(5); - -/** Create a compact ECDSA signature (64 byte + recovery id). * Returns: 1: signature created - * 0: the nonce generation function failed, or the secret key was invalid. - * In: ctx: pointer to a context object, initialized for signing (cannot be NULL) - * msg32: the 32-byte message hash being signed (cannot be NULL) + * 0: the nonce generation function failed, or the private key was invalid. + * Args: ctx: pointer to a context object, initialized for signing (cannot be NULL) + * Out: sig: pointer to an array where the signature will be placed (cannot be NULL) + * In: msg32: the 32-byte message hash being signed (cannot be NULL) * seckey: pointer to a 32-byte secret key (cannot be NULL) * noncefp:pointer to a nonce generation function. If NULL, secp256k1_nonce_function_default is used * ndata: pointer to arbitrary data used by the nonce generation function (can be NULL) - * Out: sig: pointer to a 64-byte array where the signature will be placed (cannot be NULL) - * In case 0 is returned, the returned signature length will be zero. - * recid: pointer to an int, which will be updated to contain the recovery id (can be NULL) + * + * The created signature is always in lower-S form. See + * secp256k1_ecdsa_signature_normalize for more details. */ -int secp256k1_ecdsa_sign_compact( - const secp256k1_context_t* ctx, - const unsigned char *msg32, - unsigned char *sig64, - const unsigned char *seckey, - secp256k1_nonce_function_t noncefp, - const void *ndata, - int *recid +SECP256K1_API int secp256k1_ecdsa_sign( + const secp256k1_context* ctx, + secp256k1_ecdsa_signature *sig, + const unsigned char *msg32, + const unsigned char *seckey, + secp256k1_nonce_function noncefp, + const void *ndata ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); -/** Recover an ECDSA public key from a compact signature. - * Returns: 1: public key successfully recovered (which guarantees a correct signature). - * 0: otherwise. - * In: ctx: pointer to a context object, initialized for verification (cannot be NULL) - * msg32: the 32-byte message hash assumed to be signed (cannot be NULL) - * sig64: signature as 64 byte array (cannot be NULL) - * compressed: whether to recover a compressed or uncompressed pubkey - * recid: the recovery id (0-3, as returned by ecdsa_sign_compact) - * Out: pubkey: pointer to a 33 or 65 byte array to put the pubkey (cannot be NULL) - * pubkeylen: pointer to an int that will contain the pubkey length (cannot be NULL) - */ -SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_recover_compact( - const secp256k1_context_t* ctx, - const unsigned char *msg32, - const unsigned char *sig64, - unsigned char *pubkey, - int *pubkeylen, - int compressed, - int recid -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4) SECP256K1_ARG_NONNULL(5); - /** Verify an ECDSA secret key. + * * Returns: 1: secret key is valid * 0: secret key is invalid - * In: ctx: pointer to a context object (cannot be NULL) - * seckey: pointer to a 32-byte secret key (cannot be NULL) + * Args: ctx: pointer to a context object (cannot be NULL) + * In: seckey: pointer to a 32-byte secret key (cannot be NULL) */ -SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_seckey_verify( - const secp256k1_context_t* ctx, - const unsigned char *seckey -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2); - -/** Just validate a public key. - * Returns: 1: public key is valid - * 0: public key is invalid - * In: ctx: pointer to a context object (cannot be NULL) - * pubkey: pointer to a 33-byte or 65-byte public key (cannot be NULL). - * pubkeylen: length of pubkey - */ -SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_verify( - const secp256k1_context_t* ctx, - const unsigned char *pubkey, - int pubkeylen +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_seckey_verify( + const secp256k1_context* ctx, + const unsigned char *seckey ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2); /** Compute the public key for a secret key. - * In: ctx: pointer to a context object, initialized for signing (cannot be NULL) - * compressed: whether the computed public key should be compressed - * seckey: pointer to a 32-byte private key (cannot be NULL) - * Out: pubkey: pointer to a 33-byte (if compressed) or 65-byte (if uncompressed) - * area to store the public key (cannot be NULL) - * pubkeylen: pointer to int that will be updated to contains the pubkey's - * length (cannot be NULL) + * * Returns: 1: secret was valid, public key stores * 0: secret was invalid, try again + * Args: ctx: pointer to a context object, initialized for signing (cannot be NULL) + * Out: pubkey: pointer to the created public key (cannot be NULL) + * In: seckey: pointer to a 32-byte private key (cannot be NULL) */ -SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_create( - const secp256k1_context_t* ctx, - unsigned char *pubkey, - int *pubkeylen, - const unsigned char *seckey, - int compressed -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); - -/** Decompress a public key. - * In: ctx: pointer to a context object (cannot be NULL) - * In/Out: pubkey: pointer to a 65-byte array to put the decompressed public key. - * It must contain a 33-byte or 65-byte public key already (cannot be NULL) - * pubkeylen: pointer to the size of the public key pointed to by pubkey (cannot be NULL) - * It will be updated to reflect the new size. - * Returns: 0: pubkey was invalid - * 1: pubkey was valid, and was replaced with its decompressed version - */ -SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_decompress( - const secp256k1_context_t* ctx, - unsigned char *pubkey, - int *pubkeylen +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_create( + const secp256k1_context* ctx, + secp256k1_pubkey *pubkey, + const unsigned char *seckey ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); -/** Export a private key in DER format. - * In: ctx: pointer to a context object, initialized for signing (cannot be NULL) +/** Negates a private key in place. + * + * Returns: 1 always + * Args: ctx: pointer to a context object + * In/Out: pubkey: pointer to the public key to be negated (cannot be NULL) */ -SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_export( - const secp256k1_context_t* ctx, - const unsigned char *seckey, - unsigned char *privkey, - int *privkeylen, - int compressed -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_negate( + const secp256k1_context* ctx, + unsigned char *seckey +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2); -/** Import a private key in DER format. */ -SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_import( - const secp256k1_context_t* ctx, - unsigned char *seckey, - const unsigned char *privkey, - int privkeylen -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); +/** Negates a public key in place. + * + * Returns: 1 always + * Args: ctx: pointer to a context object + * In/Out: pubkey: pointer to the public key to be negated (cannot be NULL) + */ +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_negate( + const secp256k1_context* ctx, + secp256k1_pubkey *pubkey +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2); -/** Tweak a private key by adding tweak to it. */ -SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_add( - const secp256k1_context_t* ctx, - unsigned char *seckey, - const unsigned char *tweak +/** Tweak a private key by adding tweak to it. + * Returns: 0 if the tweak was out of range (chance of around 1 in 2^128 for + * uniformly random 32-byte arrays, or if the resulting private key + * would be invalid (only when the tweak is the complement of the + * private key). 1 otherwise. + * Args: ctx: pointer to a context object (cannot be NULL). + * In/Out: seckey: pointer to a 32-byte private key. + * In: tweak: pointer to a 32-byte tweak. + */ +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_add( + const secp256k1_context* ctx, + unsigned char *seckey, + const unsigned char *tweak ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); /** Tweak a public key by adding tweak times the generator to it. - * In: ctx: pointer to a context object, initialized for verification (cannot be NULL) + * Returns: 0 if the tweak was out of range (chance of around 1 in 2^128 for + * uniformly random 32-byte arrays, or if the resulting public key + * would be invalid (only when the tweak is the complement of the + * corresponding private key). 1 otherwise. + * Args: ctx: pointer to a context object initialized for validation + * (cannot be NULL). + * In/Out: pubkey: pointer to a public key object. + * In: tweak: pointer to a 32-byte tweak. */ -SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_add( - const secp256k1_context_t* ctx, - unsigned char *pubkey, - int pubkeylen, - const unsigned char *tweak -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(4); - -/** Tweak a private key by multiplying it with tweak. */ -SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_mul( - const secp256k1_context_t* ctx, - unsigned char *seckey, - const unsigned char *tweak +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_add( + const secp256k1_context* ctx, + secp256k1_pubkey *pubkey, + const unsigned char *tweak ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); -/** Tweak a public key by multiplying it with tweak. - * In: ctx: pointer to a context object, initialized for verification (cannot be NULL) +/** Tweak a private key by multiplying it by a tweak. + * Returns: 0 if the tweak was out of range (chance of around 1 in 2^128 for + * uniformly random 32-byte arrays, or equal to zero. 1 otherwise. + * Args: ctx: pointer to a context object (cannot be NULL). + * In/Out: seckey: pointer to a 32-byte private key. + * In: tweak: pointer to a 32-byte tweak. */ -SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_mul( - const secp256k1_context_t* ctx, - unsigned char *pubkey, - int pubkeylen, - const unsigned char *tweak -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(4); +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_mul( + const secp256k1_context* ctx, + unsigned char *seckey, + const unsigned char *tweak +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); -/** Updates the context randomization. +/** Tweak a public key by multiplying it by a tweak value. + * Returns: 0 if the tweak was out of range (chance of around 1 in 2^128 for + * uniformly random 32-byte arrays, or equal to zero. 1 otherwise. + * Args: ctx: pointer to a context object initialized for validation + * (cannot be NULL). + * In/Out: pubkey: pointer to a public key obkect. + * In: tweak: pointer to a 32-byte tweak. + */ +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_mul( + const secp256k1_context* ctx, + secp256k1_pubkey *pubkey, + const unsigned char *tweak +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +/** Updates the context randomization to protect against side-channel leakage. * Returns: 1: randomization successfully updated * 0: error - * In: ctx: pointer to a context object (cannot be NULL) - * seed32: pointer to a 32-byte random seed (NULL resets to initial state) + * Args: ctx: pointer to a context object (cannot be NULL) + * In: seed32: pointer to a 32-byte random seed (NULL resets to initial state) + * + * While secp256k1 code is written to be constant-time no matter what secret + * values are, it's possible that a future compiler may output code which isn't, + * and also that the CPU may not emit the same radio frequencies or draw the same + * amount power for all values. + * + * This function provides a seed which is combined into the blinding value: that + * blinding value is added before each multiplication (and removed afterwards) so + * that it does not affect function results, but shields against attacks which + * rely on any input-dependent behaviour. + * + * You should call this after secp256k1_context_create or + * secp256k1_context_clone, and may call this repeatedly afterwards. */ -SECP256K1_WARN_UNUSED_RESULT int secp256k1_context_randomize( - secp256k1_context_t* ctx, - const unsigned char *seed32 +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_context_randomize( + secp256k1_context* ctx, + const unsigned char *seed32 ) SECP256K1_ARG_NONNULL(1); +/** Add a number of public keys together. + * Returns: 1: the sum of the public keys is valid. + * 0: the sum of the public keys is not valid. + * Args: ctx: pointer to a context object + * Out: out: pointer to a public key object for placing the resulting public key + * (cannot be NULL) + * In: ins: pointer to array of pointers to public keys (cannot be NULL) + * n: the number of public keys to add together (must be at least 1) + */ +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_combine( + const secp256k1_context* ctx, + secp256k1_pubkey *out, + const secp256k1_pubkey * const * ins, + size_t n +) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); -# ifdef __cplusplus +#ifdef __cplusplus } -# endif - #endif + +#endif /* SECP256K1_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/include/secp256k1_ecdh.h b/src/cryptoconditions/src/include/secp256k1/include/secp256k1_ecdh.h new file mode 100644 index 000000000..88492dc1a --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/include/secp256k1_ecdh.h @@ -0,0 +1,31 @@ +#ifndef SECP256K1_ECDH_H +#define SECP256K1_ECDH_H + +#include "secp256k1.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** Compute an EC Diffie-Hellman secret in constant time + * Returns: 1: exponentiation was successful + * 0: scalar was invalid (zero or overflow) + * Args: ctx: pointer to a context object (cannot be NULL) + * Out: result: a 32-byte array which will be populated by an ECDH + * secret computed from the point and scalar + * In: pubkey: a pointer to a secp256k1_pubkey containing an + * initialized public key + * privkey: a 32-byte scalar with which to multiply the point + */ +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdh( + const secp256k1_context* ctx, + unsigned char *result, + const secp256k1_pubkey *pubkey, + const unsigned char *privkey +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); + +#ifdef __cplusplus +} +#endif + +#endif /* SECP256K1_ECDH_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/include/secp256k1_recovery.h b/src/cryptoconditions/src/include/secp256k1/include/secp256k1_recovery.h new file mode 100644 index 000000000..cf6c5ed7f --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/include/secp256k1_recovery.h @@ -0,0 +1,110 @@ +#ifndef SECP256K1_RECOVERY_H +#define SECP256K1_RECOVERY_H + +#include "secp256k1.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** Opaque data structured that holds a parsed ECDSA signature, + * supporting pubkey recovery. + * + * The exact representation of data inside is implementation defined and not + * guaranteed to be portable between different platforms or versions. It is + * however guaranteed to be 65 bytes in size, and can be safely copied/moved. + * If you need to convert to a format suitable for storage or transmission, use + * the secp256k1_ecdsa_signature_serialize_* and + * secp256k1_ecdsa_signature_parse_* functions. + * + * Furthermore, it is guaranteed that identical signatures (including their + * recoverability) will have identical representation, so they can be + * memcmp'ed. + */ +typedef struct { + unsigned char data[65]; +} secp256k1_ecdsa_recoverable_signature; + +/** Parse a compact ECDSA signature (64 bytes + recovery id). + * + * Returns: 1 when the signature could be parsed, 0 otherwise + * Args: ctx: a secp256k1 context object + * Out: sig: a pointer to a signature object + * In: input64: a pointer to a 64-byte compact signature + * recid: the recovery id (0, 1, 2 or 3) + */ +SECP256K1_API int secp256k1_ecdsa_recoverable_signature_parse_compact( + const secp256k1_context* ctx, + secp256k1_ecdsa_recoverable_signature* sig, + const unsigned char *input64, + int recid +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +/** Convert a recoverable signature into a normal signature. + * + * Returns: 1 + * Out: sig: a pointer to a normal signature (cannot be NULL). + * In: sigin: a pointer to a recoverable signature (cannot be NULL). + */ +SECP256K1_API int secp256k1_ecdsa_recoverable_signature_convert( + const secp256k1_context* ctx, + secp256k1_ecdsa_signature* sig, + const secp256k1_ecdsa_recoverable_signature* sigin +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +/** Serialize an ECDSA signature in compact format (64 bytes + recovery id). + * + * Returns: 1 + * Args: ctx: a secp256k1 context object + * Out: output64: a pointer to a 64-byte array of the compact signature (cannot be NULL) + * recid: a pointer to an integer to hold the recovery id (can be NULL). + * In: sig: a pointer to an initialized signature object (cannot be NULL) + */ +SECP256K1_API int secp256k1_ecdsa_recoverable_signature_serialize_compact( + const secp256k1_context* ctx, + unsigned char *output64, + int *recid, + const secp256k1_ecdsa_recoverable_signature* sig +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); + +/** Create a recoverable ECDSA signature. + * + * Returns: 1: signature created + * 0: the nonce generation function failed, or the private key was invalid. + * Args: ctx: pointer to a context object, initialized for signing (cannot be NULL) + * Out: sig: pointer to an array where the signature will be placed (cannot be NULL) + * In: msg32: the 32-byte message hash being signed (cannot be NULL) + * seckey: pointer to a 32-byte secret key (cannot be NULL) + * noncefp:pointer to a nonce generation function. If NULL, secp256k1_nonce_function_default is used + * ndata: pointer to arbitrary data used by the nonce generation function (can be NULL) + */ +SECP256K1_API int secp256k1_ecdsa_sign_recoverable( + const secp256k1_context* ctx, + secp256k1_ecdsa_recoverable_signature *sig, + const unsigned char *msg32, + const unsigned char *seckey, + secp256k1_nonce_function noncefp, + const void *ndata +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); + +/** Recover an ECDSA public key from a signature. + * + * Returns: 1: public key successfully recovered (which guarantees a correct signature). + * 0: otherwise. + * Args: ctx: pointer to a context object, initialized for verification (cannot be NULL) + * Out: pubkey: pointer to the recovered public key (cannot be NULL) + * In: sig: pointer to initialized signature that supports pubkey recovery (cannot be NULL) + * msg32: the 32-byte message hash assumed to be signed (cannot be NULL) + */ +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_recover( + const secp256k1_context* ctx, + secp256k1_pubkey *pubkey, + const secp256k1_ecdsa_recoverable_signature *sig, + const unsigned char *msg32 +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); + +#ifdef __cplusplus +} +#endif + +#endif /* SECP256K1_RECOVERY_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/libsecp256k1.pc.in b/src/cryptoconditions/src/include/secp256k1/libsecp256k1.pc.in index 1c72dd000..a0d006f11 100644 --- a/src/cryptoconditions/src/include/secp256k1/libsecp256k1.pc.in +++ b/src/cryptoconditions/src/include/secp256k1/libsecp256k1.pc.in @@ -5,7 +5,7 @@ includedir=@includedir@ Name: libsecp256k1 Description: Optimized C library for EC operations on curve secp256k1 -URL: https://github.com/bitcoin/secp256k1 +URL: https://github.com/bitcoin-core/secp256k1 Version: @PACKAGE_VERSION@ Cflags: -I${includedir} Libs.private: @SECP_LIBS@ diff --git a/src/cryptoconditions/src/include/secp256k1/sage/group_prover.sage b/src/cryptoconditions/src/include/secp256k1/sage/group_prover.sage new file mode 100644 index 000000000..8521f0799 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/sage/group_prover.sage @@ -0,0 +1,322 @@ +# This code supports verifying group implementations which have branches +# or conditional statements (like cmovs), by allowing each execution path +# to independently set assumptions on input or intermediary variables. +# +# The general approach is: +# * A constraint is a tuple of two sets of symbolic expressions: +# the first of which are required to evaluate to zero, the second of which +# are required to evaluate to nonzero. +# - A constraint is said to be conflicting if any of its nonzero expressions +# is in the ideal with basis the zero expressions (in other words: when the +# zero expressions imply that one of the nonzero expressions are zero). +# * There is a list of laws that describe the intended behaviour, including +# laws for addition and doubling. Each law is called with the symbolic point +# coordinates as arguments, and returns: +# - A constraint describing the assumptions under which it is applicable, +# called "assumeLaw" +# - A constraint describing the requirements of the law, called "require" +# * Implementations are transliterated into functions that operate as well on +# algebraic input points, and are called once per combination of branches +# executed. Each execution returns: +# - A constraint describing the assumptions this implementation requires +# (such as Z1=1), called "assumeFormula" +# - A constraint describing the assumptions this specific branch requires, +# but which is by construction guaranteed to cover the entire space by +# merging the results from all branches, called "assumeBranch" +# - The result of the computation +# * All combinations of laws with implementation branches are tried, and: +# - If the combination of assumeLaw, assumeFormula, and assumeBranch results +# in a conflict, it means this law does not apply to this branch, and it is +# skipped. +# - For others, we try to prove the require constraints hold, assuming the +# information in assumeLaw + assumeFormula + assumeBranch, and if this does +# not succeed, we fail. +# + To prove an expression is zero, we check whether it belongs to the +# ideal with the assumed zero expressions as basis. This test is exact. +# + To prove an expression is nonzero, we check whether each of its +# factors is contained in the set of nonzero assumptions' factors. +# This test is not exact, so various combinations of original and +# reduced expressions' factors are tried. +# - If we succeed, we print out the assumptions from assumeFormula that +# weren't implied by assumeLaw already. Those from assumeBranch are skipped, +# as we assume that all constraints in it are complementary with each other. +# +# Based on the sage verification scripts used in the Explicit-Formulas Database +# by Tanja Lange and others, see http://hyperelliptic.org/EFD + +class fastfrac: + """Fractions over rings.""" + + def __init__(self,R,top,bot=1): + """Construct a fractional, given a ring, a numerator, and denominator.""" + self.R = R + if parent(top) == ZZ or parent(top) == R: + self.top = R(top) + self.bot = R(bot) + elif top.__class__ == fastfrac: + self.top = top.top + self.bot = top.bot * bot + else: + self.top = R(numerator(top)) + self.bot = R(denominator(top)) * bot + + def iszero(self,I): + """Return whether this fraction is zero given an ideal.""" + return self.top in I and self.bot not in I + + def reduce(self,assumeZero): + zero = self.R.ideal(map(numerator, assumeZero)) + return fastfrac(self.R, zero.reduce(self.top)) / fastfrac(self.R, zero.reduce(self.bot)) + + def __add__(self,other): + """Add two fractions.""" + if parent(other) == ZZ: + return fastfrac(self.R,self.top + self.bot * other,self.bot) + if other.__class__ == fastfrac: + return fastfrac(self.R,self.top * other.bot + self.bot * other.top,self.bot * other.bot) + return NotImplemented + + def __sub__(self,other): + """Subtract two fractions.""" + if parent(other) == ZZ: + return fastfrac(self.R,self.top - self.bot * other,self.bot) + if other.__class__ == fastfrac: + return fastfrac(self.R,self.top * other.bot - self.bot * other.top,self.bot * other.bot) + return NotImplemented + + def __neg__(self): + """Return the negation of a fraction.""" + return fastfrac(self.R,-self.top,self.bot) + + def __mul__(self,other): + """Multiply two fractions.""" + if parent(other) == ZZ: + return fastfrac(self.R,self.top * other,self.bot) + if other.__class__ == fastfrac: + return fastfrac(self.R,self.top * other.top,self.bot * other.bot) + return NotImplemented + + def __rmul__(self,other): + """Multiply something else with a fraction.""" + return self.__mul__(other) + + def __div__(self,other): + """Divide two fractions.""" + if parent(other) == ZZ: + return fastfrac(self.R,self.top,self.bot * other) + if other.__class__ == fastfrac: + return fastfrac(self.R,self.top * other.bot,self.bot * other.top) + return NotImplemented + + def __pow__(self,other): + """Compute a power of a fraction.""" + if parent(other) == ZZ: + if other < 0: + # Negative powers require flipping top and bottom + return fastfrac(self.R,self.bot ^ (-other),self.top ^ (-other)) + else: + return fastfrac(self.R,self.top ^ other,self.bot ^ other) + return NotImplemented + + def __str__(self): + return "fastfrac((" + str(self.top) + ") / (" + str(self.bot) + "))" + def __repr__(self): + return "%s" % self + + def numerator(self): + return self.top + +class constraints: + """A set of constraints, consisting of zero and nonzero expressions. + + Constraints can either be used to express knowledge or a requirement. + + Both the fields zero and nonzero are maps from expressions to description + strings. The expressions that are the keys in zero are required to be zero, + and the expressions that are the keys in nonzero are required to be nonzero. + + Note that (a != 0) and (b != 0) is the same as (a*b != 0), so all keys in + nonzero could be multiplied into a single key. This is often much less + efficient to work with though, so we keep them separate inside the + constraints. This allows higher-level code to do fast checks on the individual + nonzero elements, or combine them if needed for stronger checks. + + We can't multiply the different zero elements, as it would suffice for one of + the factors to be zero, instead of all of them. Instead, the zero elements are + typically combined into an ideal first. + """ + + def __init__(self, **kwargs): + if 'zero' in kwargs: + self.zero = dict(kwargs['zero']) + else: + self.zero = dict() + if 'nonzero' in kwargs: + self.nonzero = dict(kwargs['nonzero']) + else: + self.nonzero = dict() + + def negate(self): + return constraints(zero=self.nonzero, nonzero=self.zero) + + def __add__(self, other): + zero = self.zero.copy() + zero.update(other.zero) + nonzero = self.nonzero.copy() + nonzero.update(other.nonzero) + return constraints(zero=zero, nonzero=nonzero) + + def __str__(self): + return "constraints(zero=%s,nonzero=%s)" % (self.zero, self.nonzero) + + def __repr__(self): + return "%s" % self + + +def conflicts(R, con): + """Check whether any of the passed non-zero assumptions is implied by the zero assumptions""" + zero = R.ideal(map(numerator, con.zero)) + if 1 in zero: + return True + # First a cheap check whether any of the individual nonzero terms conflict on + # their own. + for nonzero in con.nonzero: + if nonzero.iszero(zero): + return True + # It can be the case that entries in the nonzero set do not individually + # conflict with the zero set, but their combination does. For example, knowing + # that either x or y is zero is equivalent to having x*y in the zero set. + # Having x or y individually in the nonzero set is not a conflict, but both + # simultaneously is, so that is the right thing to check for. + if reduce(lambda a,b: a * b, con.nonzero, fastfrac(R, 1)).iszero(zero): + return True + return False + + +def get_nonzero_set(R, assume): + """Calculate a simple set of nonzero expressions""" + zero = R.ideal(map(numerator, assume.zero)) + nonzero = set() + for nz in map(numerator, assume.nonzero): + for (f,n) in nz.factor(): + nonzero.add(f) + rnz = zero.reduce(nz) + for (f,n) in rnz.factor(): + nonzero.add(f) + return nonzero + + +def prove_nonzero(R, exprs, assume): + """Check whether an expression is provably nonzero, given assumptions""" + zero = R.ideal(map(numerator, assume.zero)) + nonzero = get_nonzero_set(R, assume) + expl = set() + ok = True + for expr in exprs: + if numerator(expr) in zero: + return (False, [exprs[expr]]) + allexprs = reduce(lambda a,b: numerator(a)*numerator(b), exprs, 1) + for (f, n) in allexprs.factor(): + if f not in nonzero: + ok = False + if ok: + return (True, None) + ok = True + for (f, n) in zero.reduce(numerator(allexprs)).factor(): + if f not in nonzero: + ok = False + if ok: + return (True, None) + ok = True + for expr in exprs: + for (f,n) in numerator(expr).factor(): + if f not in nonzero: + ok = False + if ok: + return (True, None) + ok = True + for expr in exprs: + for (f,n) in zero.reduce(numerator(expr)).factor(): + if f not in nonzero: + expl.add(exprs[expr]) + if expl: + return (False, list(expl)) + else: + return (True, None) + + +def prove_zero(R, exprs, assume): + """Check whether all of the passed expressions are provably zero, given assumptions""" + r, e = prove_nonzero(R, dict(map(lambda x: (fastfrac(R, x.bot, 1), exprs[x]), exprs)), assume) + if not r: + return (False, map(lambda x: "Possibly zero denominator: %s" % x, e)) + zero = R.ideal(map(numerator, assume.zero)) + nonzero = prod(x for x in assume.nonzero) + expl = [] + for expr in exprs: + if not expr.iszero(zero): + expl.append(exprs[expr]) + if not expl: + return (True, None) + return (False, expl) + + +def describe_extra(R, assume, assumeExtra): + """Describe what assumptions are added, given existing assumptions""" + zerox = assume.zero.copy() + zerox.update(assumeExtra.zero) + zero = R.ideal(map(numerator, assume.zero)) + zeroextra = R.ideal(map(numerator, zerox)) + nonzero = get_nonzero_set(R, assume) + ret = set() + # Iterate over the extra zero expressions + for base in assumeExtra.zero: + if base not in zero: + add = [] + for (f, n) in numerator(base).factor(): + if f not in nonzero: + add += ["%s" % f] + if add: + ret.add((" * ".join(add)) + " = 0 [%s]" % assumeExtra.zero[base]) + # Iterate over the extra nonzero expressions + for nz in assumeExtra.nonzero: + nzr = zeroextra.reduce(numerator(nz)) + if nzr not in zeroextra: + for (f,n) in nzr.factor(): + if zeroextra.reduce(f) not in nonzero: + ret.add("%s != 0" % zeroextra.reduce(f)) + return ", ".join(x for x in ret) + + +def check_symbolic(R, assumeLaw, assumeAssert, assumeBranch, require): + """Check a set of zero and nonzero requirements, given a set of zero and nonzero assumptions""" + assume = assumeLaw + assumeAssert + assumeBranch + + if conflicts(R, assume): + # This formula does not apply + return None + + describe = describe_extra(R, assumeLaw + assumeBranch, assumeAssert) + + ok, msg = prove_zero(R, require.zero, assume) + if not ok: + return "FAIL, %s fails (assuming %s)" % (str(msg), describe) + + res, expl = prove_nonzero(R, require.nonzero, assume) + if not res: + return "FAIL, %s fails (assuming %s)" % (str(expl), describe) + + if describe != "": + return "OK (assuming %s)" % describe + else: + return "OK" + + +def concrete_verify(c): + for k in c.zero: + if k != 0: + return (False, c.zero[k]) + for k in c.nonzero: + if k == 0: + return (False, c.nonzero[k]) + return (True, None) diff --git a/src/cryptoconditions/src/include/secp256k1/sage/secp256k1.sage b/src/cryptoconditions/src/include/secp256k1/sage/secp256k1.sage new file mode 100644 index 000000000..a97e732f7 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/sage/secp256k1.sage @@ -0,0 +1,306 @@ +# Test libsecp256k1' group operation implementations using prover.sage + +import sys + +load("group_prover.sage") +load("weierstrass_prover.sage") + +def formula_secp256k1_gej_double_var(a): + """libsecp256k1's secp256k1_gej_double_var, used by various addition functions""" + rz = a.Z * a.Y + rz = rz * 2 + t1 = a.X^2 + t1 = t1 * 3 + t2 = t1^2 + t3 = a.Y^2 + t3 = t3 * 2 + t4 = t3^2 + t4 = t4 * 2 + t3 = t3 * a.X + rx = t3 + rx = rx * 4 + rx = -rx + rx = rx + t2 + t2 = -t2 + t3 = t3 * 6 + t3 = t3 + t2 + ry = t1 * t3 + t2 = -t4 + ry = ry + t2 + return jacobianpoint(rx, ry, rz) + +def formula_secp256k1_gej_add_var(branch, a, b): + """libsecp256k1's secp256k1_gej_add_var""" + if branch == 0: + return (constraints(), constraints(nonzero={a.Infinity : 'a_infinite'}), b) + if branch == 1: + return (constraints(), constraints(zero={a.Infinity : 'a_finite'}, nonzero={b.Infinity : 'b_infinite'}), a) + z22 = b.Z^2 + z12 = a.Z^2 + u1 = a.X * z22 + u2 = b.X * z12 + s1 = a.Y * z22 + s1 = s1 * b.Z + s2 = b.Y * z12 + s2 = s2 * a.Z + h = -u1 + h = h + u2 + i = -s1 + i = i + s2 + if branch == 2: + r = formula_secp256k1_gej_double_var(a) + return (constraints(), constraints(zero={h : 'h=0', i : 'i=0', a.Infinity : 'a_finite', b.Infinity : 'b_finite'}), r) + if branch == 3: + return (constraints(), constraints(zero={h : 'h=0', a.Infinity : 'a_finite', b.Infinity : 'b_finite'}, nonzero={i : 'i!=0'}), point_at_infinity()) + i2 = i^2 + h2 = h^2 + h3 = h2 * h + h = h * b.Z + rz = a.Z * h + t = u1 * h2 + rx = t + rx = rx * 2 + rx = rx + h3 + rx = -rx + rx = rx + i2 + ry = -rx + ry = ry + t + ry = ry * i + h3 = h3 * s1 + h3 = -h3 + ry = ry + h3 + return (constraints(), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite'}, nonzero={h : 'h!=0'}), jacobianpoint(rx, ry, rz)) + +def formula_secp256k1_gej_add_ge_var(branch, a, b): + """libsecp256k1's secp256k1_gej_add_ge_var, which assume bz==1""" + if branch == 0: + return (constraints(zero={b.Z - 1 : 'b.z=1'}), constraints(nonzero={a.Infinity : 'a_infinite'}), b) + if branch == 1: + return (constraints(zero={b.Z - 1 : 'b.z=1'}), constraints(zero={a.Infinity : 'a_finite'}, nonzero={b.Infinity : 'b_infinite'}), a) + z12 = a.Z^2 + u1 = a.X + u2 = b.X * z12 + s1 = a.Y + s2 = b.Y * z12 + s2 = s2 * a.Z + h = -u1 + h = h + u2 + i = -s1 + i = i + s2 + if (branch == 2): + r = formula_secp256k1_gej_double_var(a) + return (constraints(zero={b.Z - 1 : 'b.z=1'}), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite', h : 'h=0', i : 'i=0'}), r) + if (branch == 3): + return (constraints(zero={b.Z - 1 : 'b.z=1'}), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite', h : 'h=0'}, nonzero={i : 'i!=0'}), point_at_infinity()) + i2 = i^2 + h2 = h^2 + h3 = h * h2 + rz = a.Z * h + t = u1 * h2 + rx = t + rx = rx * 2 + rx = rx + h3 + rx = -rx + rx = rx + i2 + ry = -rx + ry = ry + t + ry = ry * i + h3 = h3 * s1 + h3 = -h3 + ry = ry + h3 + return (constraints(zero={b.Z - 1 : 'b.z=1'}), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite'}, nonzero={h : 'h!=0'}), jacobianpoint(rx, ry, rz)) + +def formula_secp256k1_gej_add_zinv_var(branch, a, b): + """libsecp256k1's secp256k1_gej_add_zinv_var""" + bzinv = b.Z^(-1) + if branch == 0: + return (constraints(), constraints(nonzero={b.Infinity : 'b_infinite'}), a) + if branch == 1: + bzinv2 = bzinv^2 + bzinv3 = bzinv2 * bzinv + rx = b.X * bzinv2 + ry = b.Y * bzinv3 + rz = 1 + return (constraints(), constraints(zero={b.Infinity : 'b_finite'}, nonzero={a.Infinity : 'a_infinite'}), jacobianpoint(rx, ry, rz)) + azz = a.Z * bzinv + z12 = azz^2 + u1 = a.X + u2 = b.X * z12 + s1 = a.Y + s2 = b.Y * z12 + s2 = s2 * azz + h = -u1 + h = h + u2 + i = -s1 + i = i + s2 + if branch == 2: + r = formula_secp256k1_gej_double_var(a) + return (constraints(), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite', h : 'h=0', i : 'i=0'}), r) + if branch == 3: + return (constraints(), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite', h : 'h=0'}, nonzero={i : 'i!=0'}), point_at_infinity()) + i2 = i^2 + h2 = h^2 + h3 = h * h2 + rz = a.Z + rz = rz * h + t = u1 * h2 + rx = t + rx = rx * 2 + rx = rx + h3 + rx = -rx + rx = rx + i2 + ry = -rx + ry = ry + t + ry = ry * i + h3 = h3 * s1 + h3 = -h3 + ry = ry + h3 + return (constraints(), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite'}, nonzero={h : 'h!=0'}), jacobianpoint(rx, ry, rz)) + +def formula_secp256k1_gej_add_ge(branch, a, b): + """libsecp256k1's secp256k1_gej_add_ge""" + zeroes = {} + nonzeroes = {} + a_infinity = False + if (branch & 4) != 0: + nonzeroes.update({a.Infinity : 'a_infinite'}) + a_infinity = True + else: + zeroes.update({a.Infinity : 'a_finite'}) + zz = a.Z^2 + u1 = a.X + u2 = b.X * zz + s1 = a.Y + s2 = b.Y * zz + s2 = s2 * a.Z + t = u1 + t = t + u2 + m = s1 + m = m + s2 + rr = t^2 + m_alt = -u2 + tt = u1 * m_alt + rr = rr + tt + degenerate = (branch & 3) == 3 + if (branch & 1) != 0: + zeroes.update({m : 'm_zero'}) + else: + nonzeroes.update({m : 'm_nonzero'}) + if (branch & 2) != 0: + zeroes.update({rr : 'rr_zero'}) + else: + nonzeroes.update({rr : 'rr_nonzero'}) + rr_alt = s1 + rr_alt = rr_alt * 2 + m_alt = m_alt + u1 + if not degenerate: + rr_alt = rr + m_alt = m + n = m_alt^2 + q = n * t + n = n^2 + if degenerate: + n = m + t = rr_alt^2 + rz = a.Z * m_alt + infinity = False + if (branch & 8) != 0: + if not a_infinity: + infinity = True + zeroes.update({rz : 'r.z=0'}) + else: + nonzeroes.update({rz : 'r.z!=0'}) + rz = rz * 2 + q = -q + t = t + q + rx = t + t = t * 2 + t = t + q + t = t * rr_alt + t = t + n + ry = -t + rx = rx * 4 + ry = ry * 4 + if a_infinity: + rx = b.X + ry = b.Y + rz = 1 + if infinity: + return (constraints(zero={b.Z - 1 : 'b.z=1', b.Infinity : 'b_finite'}), constraints(zero=zeroes, nonzero=nonzeroes), point_at_infinity()) + return (constraints(zero={b.Z - 1 : 'b.z=1', b.Infinity : 'b_finite'}), constraints(zero=zeroes, nonzero=nonzeroes), jacobianpoint(rx, ry, rz)) + +def formula_secp256k1_gej_add_ge_old(branch, a, b): + """libsecp256k1's old secp256k1_gej_add_ge, which fails when ay+by=0 but ax!=bx""" + a_infinity = (branch & 1) != 0 + zero = {} + nonzero = {} + if a_infinity: + nonzero.update({a.Infinity : 'a_infinite'}) + else: + zero.update({a.Infinity : 'a_finite'}) + zz = a.Z^2 + u1 = a.X + u2 = b.X * zz + s1 = a.Y + s2 = b.Y * zz + s2 = s2 * a.Z + z = a.Z + t = u1 + t = t + u2 + m = s1 + m = m + s2 + n = m^2 + q = n * t + n = n^2 + rr = t^2 + t = u1 * u2 + t = -t + rr = rr + t + t = rr^2 + rz = m * z + infinity = False + if (branch & 2) != 0: + if not a_infinity: + infinity = True + else: + return (constraints(zero={b.Z - 1 : 'b.z=1', b.Infinity : 'b_finite'}), constraints(nonzero={z : 'conflict_a'}, zero={z : 'conflict_b'}), point_at_infinity()) + zero.update({rz : 'r.z=0'}) + else: + nonzero.update({rz : 'r.z!=0'}) + rz = rz * (0 if a_infinity else 2) + rx = t + q = -q + rx = rx + q + q = q * 3 + t = t * 2 + t = t + q + t = t * rr + t = t + n + ry = -t + rx = rx * (0 if a_infinity else 4) + ry = ry * (0 if a_infinity else 4) + t = b.X + t = t * (1 if a_infinity else 0) + rx = rx + t + t = b.Y + t = t * (1 if a_infinity else 0) + ry = ry + t + t = (1 if a_infinity else 0) + rz = rz + t + if infinity: + return (constraints(zero={b.Z - 1 : 'b.z=1', b.Infinity : 'b_finite'}), constraints(zero=zero, nonzero=nonzero), point_at_infinity()) + return (constraints(zero={b.Z - 1 : 'b.z=1', b.Infinity : 'b_finite'}), constraints(zero=zero, nonzero=nonzero), jacobianpoint(rx, ry, rz)) + +if __name__ == "__main__": + check_symbolic_jacobian_weierstrass("secp256k1_gej_add_var", 0, 7, 5, formula_secp256k1_gej_add_var) + check_symbolic_jacobian_weierstrass("secp256k1_gej_add_ge_var", 0, 7, 5, formula_secp256k1_gej_add_ge_var) + check_symbolic_jacobian_weierstrass("secp256k1_gej_add_zinv_var", 0, 7, 5, formula_secp256k1_gej_add_zinv_var) + check_symbolic_jacobian_weierstrass("secp256k1_gej_add_ge", 0, 7, 16, formula_secp256k1_gej_add_ge) + check_symbolic_jacobian_weierstrass("secp256k1_gej_add_ge_old [should fail]", 0, 7, 4, formula_secp256k1_gej_add_ge_old) + + if len(sys.argv) >= 2 and sys.argv[1] == "--exhaustive": + check_exhaustive_jacobian_weierstrass("secp256k1_gej_add_var", 0, 7, 5, formula_secp256k1_gej_add_var, 43) + check_exhaustive_jacobian_weierstrass("secp256k1_gej_add_ge_var", 0, 7, 5, formula_secp256k1_gej_add_ge_var, 43) + check_exhaustive_jacobian_weierstrass("secp256k1_gej_add_zinv_var", 0, 7, 5, formula_secp256k1_gej_add_zinv_var, 43) + check_exhaustive_jacobian_weierstrass("secp256k1_gej_add_ge", 0, 7, 16, formula_secp256k1_gej_add_ge, 43) + check_exhaustive_jacobian_weierstrass("secp256k1_gej_add_ge_old [should fail]", 0, 7, 4, formula_secp256k1_gej_add_ge_old, 43) diff --git a/src/cryptoconditions/src/include/secp256k1/sage/weierstrass_prover.sage b/src/cryptoconditions/src/include/secp256k1/sage/weierstrass_prover.sage new file mode 100644 index 000000000..03ef2ec90 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/sage/weierstrass_prover.sage @@ -0,0 +1,264 @@ +# Prover implementation for Weierstrass curves of the form +# y^2 = x^3 + A * x + B, specifically with a = 0 and b = 7, with group laws +# operating on affine and Jacobian coordinates, including the point at infinity +# represented by a 4th variable in coordinates. + +load("group_prover.sage") + + +class affinepoint: + def __init__(self, x, y, infinity=0): + self.x = x + self.y = y + self.infinity = infinity + def __str__(self): + return "affinepoint(x=%s,y=%s,inf=%s)" % (self.x, self.y, self.infinity) + + +class jacobianpoint: + def __init__(self, x, y, z, infinity=0): + self.X = x + self.Y = y + self.Z = z + self.Infinity = infinity + def __str__(self): + return "jacobianpoint(X=%s,Y=%s,Z=%s,inf=%s)" % (self.X, self.Y, self.Z, self.Infinity) + + +def point_at_infinity(): + return jacobianpoint(1, 1, 1, 1) + + +def negate(p): + if p.__class__ == affinepoint: + return affinepoint(p.x, -p.y) + if p.__class__ == jacobianpoint: + return jacobianpoint(p.X, -p.Y, p.Z) + assert(False) + + +def on_weierstrass_curve(A, B, p): + """Return a set of zero-expressions for an affine point to be on the curve""" + return constraints(zero={p.x^3 + A*p.x + B - p.y^2: 'on_curve'}) + + +def tangential_to_weierstrass_curve(A, B, p12, p3): + """Return a set of zero-expressions for ((x12,y12),(x3,y3)) to be a line that is tangential to the curve at (x12,y12)""" + return constraints(zero={ + (p12.y - p3.y) * (p12.y * 2) - (p12.x^2 * 3 + A) * (p12.x - p3.x): 'tangential_to_curve' + }) + + +def colinear(p1, p2, p3): + """Return a set of zero-expressions for ((x1,y1),(x2,y2),(x3,y3)) to be collinear""" + return constraints(zero={ + (p1.y - p2.y) * (p1.x - p3.x) - (p1.y - p3.y) * (p1.x - p2.x): 'colinear_1', + (p2.y - p3.y) * (p2.x - p1.x) - (p2.y - p1.y) * (p2.x - p3.x): 'colinear_2', + (p3.y - p1.y) * (p3.x - p2.x) - (p3.y - p2.y) * (p3.x - p1.x): 'colinear_3' + }) + + +def good_affine_point(p): + return constraints(nonzero={p.x : 'nonzero_x', p.y : 'nonzero_y'}) + + +def good_jacobian_point(p): + return constraints(nonzero={p.X : 'nonzero_X', p.Y : 'nonzero_Y', p.Z^6 : 'nonzero_Z'}) + + +def good_point(p): + return constraints(nonzero={p.Z^6 : 'nonzero_X'}) + + +def finite(p, *affine_fns): + con = good_point(p) + constraints(zero={p.Infinity : 'finite_point'}) + if p.Z != 0: + return con + reduce(lambda a, b: a + b, (f(affinepoint(p.X / p.Z^2, p.Y / p.Z^3)) for f in affine_fns), con) + else: + return con + +def infinite(p): + return constraints(nonzero={p.Infinity : 'infinite_point'}) + + +def law_jacobian_weierstrass_add(A, B, pa, pb, pA, pB, pC): + """Check whether the passed set of coordinates is a valid Jacobian add, given assumptions""" + assumeLaw = (good_affine_point(pa) + + good_affine_point(pb) + + good_jacobian_point(pA) + + good_jacobian_point(pB) + + on_weierstrass_curve(A, B, pa) + + on_weierstrass_curve(A, B, pb) + + finite(pA) + + finite(pB) + + constraints(nonzero={pa.x - pb.x : 'different_x'})) + require = (finite(pC, lambda pc: on_weierstrass_curve(A, B, pc) + + colinear(pa, pb, negate(pc)))) + return (assumeLaw, require) + + +def law_jacobian_weierstrass_double(A, B, pa, pb, pA, pB, pC): + """Check whether the passed set of coordinates is a valid Jacobian doubling, given assumptions""" + assumeLaw = (good_affine_point(pa) + + good_affine_point(pb) + + good_jacobian_point(pA) + + good_jacobian_point(pB) + + on_weierstrass_curve(A, B, pa) + + on_weierstrass_curve(A, B, pb) + + finite(pA) + + finite(pB) + + constraints(zero={pa.x - pb.x : 'equal_x', pa.y - pb.y : 'equal_y'})) + require = (finite(pC, lambda pc: on_weierstrass_curve(A, B, pc) + + tangential_to_weierstrass_curve(A, B, pa, negate(pc)))) + return (assumeLaw, require) + + +def law_jacobian_weierstrass_add_opposites(A, B, pa, pb, pA, pB, pC): + assumeLaw = (good_affine_point(pa) + + good_affine_point(pb) + + good_jacobian_point(pA) + + good_jacobian_point(pB) + + on_weierstrass_curve(A, B, pa) + + on_weierstrass_curve(A, B, pb) + + finite(pA) + + finite(pB) + + constraints(zero={pa.x - pb.x : 'equal_x', pa.y + pb.y : 'opposite_y'})) + require = infinite(pC) + return (assumeLaw, require) + + +def law_jacobian_weierstrass_add_infinite_a(A, B, pa, pb, pA, pB, pC): + assumeLaw = (good_affine_point(pa) + + good_affine_point(pb) + + good_jacobian_point(pA) + + good_jacobian_point(pB) + + on_weierstrass_curve(A, B, pb) + + infinite(pA) + + finite(pB)) + require = finite(pC, lambda pc: constraints(zero={pc.x - pb.x : 'c.x=b.x', pc.y - pb.y : 'c.y=b.y'})) + return (assumeLaw, require) + + +def law_jacobian_weierstrass_add_infinite_b(A, B, pa, pb, pA, pB, pC): + assumeLaw = (good_affine_point(pa) + + good_affine_point(pb) + + good_jacobian_point(pA) + + good_jacobian_point(pB) + + on_weierstrass_curve(A, B, pa) + + infinite(pB) + + finite(pA)) + require = finite(pC, lambda pc: constraints(zero={pc.x - pa.x : 'c.x=a.x', pc.y - pa.y : 'c.y=a.y'})) + return (assumeLaw, require) + + +def law_jacobian_weierstrass_add_infinite_ab(A, B, pa, pb, pA, pB, pC): + assumeLaw = (good_affine_point(pa) + + good_affine_point(pb) + + good_jacobian_point(pA) + + good_jacobian_point(pB) + + infinite(pA) + + infinite(pB)) + require = infinite(pC) + return (assumeLaw, require) + + +laws_jacobian_weierstrass = { + 'add': law_jacobian_weierstrass_add, + 'double': law_jacobian_weierstrass_double, + 'add_opposite': law_jacobian_weierstrass_add_opposites, + 'add_infinite_a': law_jacobian_weierstrass_add_infinite_a, + 'add_infinite_b': law_jacobian_weierstrass_add_infinite_b, + 'add_infinite_ab': law_jacobian_weierstrass_add_infinite_ab +} + + +def check_exhaustive_jacobian_weierstrass(name, A, B, branches, formula, p): + """Verify an implementation of addition of Jacobian points on a Weierstrass curve, by executing and validating the result for every possible addition in a prime field""" + F = Integers(p) + print "Formula %s on Z%i:" % (name, p) + points = [] + for x in xrange(0, p): + for y in xrange(0, p): + point = affinepoint(F(x), F(y)) + r, e = concrete_verify(on_weierstrass_curve(A, B, point)) + if r: + points.append(point) + + for za in xrange(1, p): + for zb in xrange(1, p): + for pa in points: + for pb in points: + for ia in xrange(2): + for ib in xrange(2): + pA = jacobianpoint(pa.x * F(za)^2, pa.y * F(za)^3, F(za), ia) + pB = jacobianpoint(pb.x * F(zb)^2, pb.y * F(zb)^3, F(zb), ib) + for branch in xrange(0, branches): + assumeAssert, assumeBranch, pC = formula(branch, pA, pB) + pC.X = F(pC.X) + pC.Y = F(pC.Y) + pC.Z = F(pC.Z) + pC.Infinity = F(pC.Infinity) + r, e = concrete_verify(assumeAssert + assumeBranch) + if r: + match = False + for key in laws_jacobian_weierstrass: + assumeLaw, require = laws_jacobian_weierstrass[key](A, B, pa, pb, pA, pB, pC) + r, e = concrete_verify(assumeLaw) + if r: + if match: + print " multiple branches for (%s,%s,%s,%s) + (%s,%s,%s,%s)" % (pA.X, pA.Y, pA.Z, pA.Infinity, pB.X, pB.Y, pB.Z, pB.Infinity) + else: + match = True + r, e = concrete_verify(require) + if not r: + print " failure in branch %i for (%s,%s,%s,%s) + (%s,%s,%s,%s) = (%s,%s,%s,%s): %s" % (branch, pA.X, pA.Y, pA.Z, pA.Infinity, pB.X, pB.Y, pB.Z, pB.Infinity, pC.X, pC.Y, pC.Z, pC.Infinity, e) + print + + +def check_symbolic_function(R, assumeAssert, assumeBranch, f, A, B, pa, pb, pA, pB, pC): + assumeLaw, require = f(A, B, pa, pb, pA, pB, pC) + return check_symbolic(R, assumeLaw, assumeAssert, assumeBranch, require) + +def check_symbolic_jacobian_weierstrass(name, A, B, branches, formula): + """Verify an implementation of addition of Jacobian points on a Weierstrass curve symbolically""" + R. = PolynomialRing(QQ,8,order='invlex') + lift = lambda x: fastfrac(R,x) + ax = lift(ax) + ay = lift(ay) + Az = lift(Az) + bx = lift(bx) + by = lift(by) + Bz = lift(Bz) + Ai = lift(Ai) + Bi = lift(Bi) + + pa = affinepoint(ax, ay, Ai) + pb = affinepoint(bx, by, Bi) + pA = jacobianpoint(ax * Az^2, ay * Az^3, Az, Ai) + pB = jacobianpoint(bx * Bz^2, by * Bz^3, Bz, Bi) + + res = {} + + for key in laws_jacobian_weierstrass: + res[key] = [] + + print ("Formula " + name + ":") + count = 0 + for branch in xrange(branches): + assumeFormula, assumeBranch, pC = formula(branch, pA, pB) + pC.X = lift(pC.X) + pC.Y = lift(pC.Y) + pC.Z = lift(pC.Z) + pC.Infinity = lift(pC.Infinity) + + for key in laws_jacobian_weierstrass: + res[key].append((check_symbolic_function(R, assumeFormula, assumeBranch, laws_jacobian_weierstrass[key], A, B, pa, pb, pA, pB, pC), branch)) + + for key in res: + print " %s:" % key + val = res[key] + for x in val: + if x[0] is not None: + print " branch %i: %s" % (x[1], x[0]) + + print diff --git a/src/cryptoconditions/src/include/secp256k1/src/asm/field_10x26_arm.s b/src/cryptoconditions/src/include/secp256k1/src/asm/field_10x26_arm.s new file mode 100644 index 000000000..5a9cc3ffc --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/asm/field_10x26_arm.s @@ -0,0 +1,919 @@ +@ vim: set tabstop=8 softtabstop=8 shiftwidth=8 noexpandtab syntax=armasm: +/********************************************************************** + * Copyright (c) 2014 Wladimir J. van der Laan * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ +/* +ARM implementation of field_10x26 inner loops. + +Note: + +- To avoid unnecessary loads and make use of available registers, two + 'passes' have every time been interleaved, with the odd passes accumulating c' and d' + which will be added to c and d respectively in the even passes + +*/ + + .syntax unified + .arch armv7-a + @ eabi attributes - see readelf -A + .eabi_attribute 8, 1 @ Tag_ARM_ISA_use = yes + .eabi_attribute 9, 0 @ Tag_Thumb_ISA_use = no + .eabi_attribute 10, 0 @ Tag_FP_arch = none + .eabi_attribute 24, 1 @ Tag_ABI_align_needed = 8-byte + .eabi_attribute 25, 1 @ Tag_ABI_align_preserved = 8-byte, except leaf SP + .eabi_attribute 30, 2 @ Tag_ABI_optimization_goals = Aggressive Speed + .eabi_attribute 34, 1 @ Tag_CPU_unaligned_access = v6 + .text + + @ Field constants + .set field_R0, 0x3d10 + .set field_R1, 0x400 + .set field_not_M, 0xfc000000 @ ~M = ~0x3ffffff + + .align 2 + .global secp256k1_fe_mul_inner + .type secp256k1_fe_mul_inner, %function + @ Arguments: + @ r0 r Restrict: can overlap with a, not with b + @ r1 a + @ r2 b + @ Stack (total 4+10*4 = 44) + @ sp + #0 saved 'r' pointer + @ sp + #4 + 4*X t0,t1,t2,t3,t4,t5,t6,t7,u8,t9 +secp256k1_fe_mul_inner: + stmfd sp!, {r4, r5, r6, r7, r8, r9, r10, r11, r14} + sub sp, sp, #48 @ frame=44 + alignment + str r0, [sp, #0] @ save result address, we need it only at the end + + /****************************************** + * Main computation code. + ****************************************** + + Allocation: + r0,r14,r7,r8 scratch + r1 a (pointer) + r2 b (pointer) + r3:r4 c + r5:r6 d + r11:r12 c' + r9:r10 d' + + Note: do not write to r[] here, it may overlap with a[] + */ + + /* A - interleaved with B */ + ldr r7, [r1, #0*4] @ a[0] + ldr r8, [r2, #9*4] @ b[9] + ldr r0, [r1, #1*4] @ a[1] + umull r5, r6, r7, r8 @ d = a[0] * b[9] + ldr r14, [r2, #8*4] @ b[8] + umull r9, r10, r0, r8 @ d' = a[1] * b[9] + ldr r7, [r1, #2*4] @ a[2] + umlal r5, r6, r0, r14 @ d += a[1] * b[8] + ldr r8, [r2, #7*4] @ b[7] + umlal r9, r10, r7, r14 @ d' += a[2] * b[8] + ldr r0, [r1, #3*4] @ a[3] + umlal r5, r6, r7, r8 @ d += a[2] * b[7] + ldr r14, [r2, #6*4] @ b[6] + umlal r9, r10, r0, r8 @ d' += a[3] * b[7] + ldr r7, [r1, #4*4] @ a[4] + umlal r5, r6, r0, r14 @ d += a[3] * b[6] + ldr r8, [r2, #5*4] @ b[5] + umlal r9, r10, r7, r14 @ d' += a[4] * b[6] + ldr r0, [r1, #5*4] @ a[5] + umlal r5, r6, r7, r8 @ d += a[4] * b[5] + ldr r14, [r2, #4*4] @ b[4] + umlal r9, r10, r0, r8 @ d' += a[5] * b[5] + ldr r7, [r1, #6*4] @ a[6] + umlal r5, r6, r0, r14 @ d += a[5] * b[4] + ldr r8, [r2, #3*4] @ b[3] + umlal r9, r10, r7, r14 @ d' += a[6] * b[4] + ldr r0, [r1, #7*4] @ a[7] + umlal r5, r6, r7, r8 @ d += a[6] * b[3] + ldr r14, [r2, #2*4] @ b[2] + umlal r9, r10, r0, r8 @ d' += a[7] * b[3] + ldr r7, [r1, #8*4] @ a[8] + umlal r5, r6, r0, r14 @ d += a[7] * b[2] + ldr r8, [r2, #1*4] @ b[1] + umlal r9, r10, r7, r14 @ d' += a[8] * b[2] + ldr r0, [r1, #9*4] @ a[9] + umlal r5, r6, r7, r8 @ d += a[8] * b[1] + ldr r14, [r2, #0*4] @ b[0] + umlal r9, r10, r0, r8 @ d' += a[9] * b[1] + ldr r7, [r1, #0*4] @ a[0] + umlal r5, r6, r0, r14 @ d += a[9] * b[0] + @ r7,r14 used in B + + bic r0, r5, field_not_M @ t9 = d & M + str r0, [sp, #4 + 4*9] + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + + /* B */ + umull r3, r4, r7, r14 @ c = a[0] * b[0] + adds r5, r5, r9 @ d += d' + adc r6, r6, r10 + + bic r0, r5, field_not_M @ u0 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u0 * R0 + umlal r3, r4, r0, r14 + + bic r14, r3, field_not_M @ t0 = c & M + str r14, [sp, #4 + 0*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u0 * R1 + umlal r3, r4, r0, r14 + + /* C - interleaved with D */ + ldr r7, [r1, #0*4] @ a[0] + ldr r8, [r2, #2*4] @ b[2] + ldr r14, [r2, #1*4] @ b[1] + umull r11, r12, r7, r8 @ c' = a[0] * b[2] + ldr r0, [r1, #1*4] @ a[1] + umlal r3, r4, r7, r14 @ c += a[0] * b[1] + ldr r8, [r2, #0*4] @ b[0] + umlal r11, r12, r0, r14 @ c' += a[1] * b[1] + ldr r7, [r1, #2*4] @ a[2] + umlal r3, r4, r0, r8 @ c += a[1] * b[0] + ldr r14, [r2, #9*4] @ b[9] + umlal r11, r12, r7, r8 @ c' += a[2] * b[0] + ldr r0, [r1, #3*4] @ a[3] + umlal r5, r6, r7, r14 @ d += a[2] * b[9] + ldr r8, [r2, #8*4] @ b[8] + umull r9, r10, r0, r14 @ d' = a[3] * b[9] + ldr r7, [r1, #4*4] @ a[4] + umlal r5, r6, r0, r8 @ d += a[3] * b[8] + ldr r14, [r2, #7*4] @ b[7] + umlal r9, r10, r7, r8 @ d' += a[4] * b[8] + ldr r0, [r1, #5*4] @ a[5] + umlal r5, r6, r7, r14 @ d += a[4] * b[7] + ldr r8, [r2, #6*4] @ b[6] + umlal r9, r10, r0, r14 @ d' += a[5] * b[7] + ldr r7, [r1, #6*4] @ a[6] + umlal r5, r6, r0, r8 @ d += a[5] * b[6] + ldr r14, [r2, #5*4] @ b[5] + umlal r9, r10, r7, r8 @ d' += a[6] * b[6] + ldr r0, [r1, #7*4] @ a[7] + umlal r5, r6, r7, r14 @ d += a[6] * b[5] + ldr r8, [r2, #4*4] @ b[4] + umlal r9, r10, r0, r14 @ d' += a[7] * b[5] + ldr r7, [r1, #8*4] @ a[8] + umlal r5, r6, r0, r8 @ d += a[7] * b[4] + ldr r14, [r2, #3*4] @ b[3] + umlal r9, r10, r7, r8 @ d' += a[8] * b[4] + ldr r0, [r1, #9*4] @ a[9] + umlal r5, r6, r7, r14 @ d += a[8] * b[3] + ldr r8, [r2, #2*4] @ b[2] + umlal r9, r10, r0, r14 @ d' += a[9] * b[3] + umlal r5, r6, r0, r8 @ d += a[9] * b[2] + + bic r0, r5, field_not_M @ u1 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u1 * R0 + umlal r3, r4, r0, r14 + + bic r14, r3, field_not_M @ t1 = c & M + str r14, [sp, #4 + 1*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u1 * R1 + umlal r3, r4, r0, r14 + + /* D */ + adds r3, r3, r11 @ c += c' + adc r4, r4, r12 + adds r5, r5, r9 @ d += d' + adc r6, r6, r10 + + bic r0, r5, field_not_M @ u2 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u2 * R0 + umlal r3, r4, r0, r14 + + bic r14, r3, field_not_M @ t2 = c & M + str r14, [sp, #4 + 2*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u2 * R1 + umlal r3, r4, r0, r14 + + /* E - interleaved with F */ + ldr r7, [r1, #0*4] @ a[0] + ldr r8, [r2, #4*4] @ b[4] + umull r11, r12, r7, r8 @ c' = a[0] * b[4] + ldr r8, [r2, #3*4] @ b[3] + umlal r3, r4, r7, r8 @ c += a[0] * b[3] + ldr r7, [r1, #1*4] @ a[1] + umlal r11, r12, r7, r8 @ c' += a[1] * b[3] + ldr r8, [r2, #2*4] @ b[2] + umlal r3, r4, r7, r8 @ c += a[1] * b[2] + ldr r7, [r1, #2*4] @ a[2] + umlal r11, r12, r7, r8 @ c' += a[2] * b[2] + ldr r8, [r2, #1*4] @ b[1] + umlal r3, r4, r7, r8 @ c += a[2] * b[1] + ldr r7, [r1, #3*4] @ a[3] + umlal r11, r12, r7, r8 @ c' += a[3] * b[1] + ldr r8, [r2, #0*4] @ b[0] + umlal r3, r4, r7, r8 @ c += a[3] * b[0] + ldr r7, [r1, #4*4] @ a[4] + umlal r11, r12, r7, r8 @ c' += a[4] * b[0] + ldr r8, [r2, #9*4] @ b[9] + umlal r5, r6, r7, r8 @ d += a[4] * b[9] + ldr r7, [r1, #5*4] @ a[5] + umull r9, r10, r7, r8 @ d' = a[5] * b[9] + ldr r8, [r2, #8*4] @ b[8] + umlal r5, r6, r7, r8 @ d += a[5] * b[8] + ldr r7, [r1, #6*4] @ a[6] + umlal r9, r10, r7, r8 @ d' += a[6] * b[8] + ldr r8, [r2, #7*4] @ b[7] + umlal r5, r6, r7, r8 @ d += a[6] * b[7] + ldr r7, [r1, #7*4] @ a[7] + umlal r9, r10, r7, r8 @ d' += a[7] * b[7] + ldr r8, [r2, #6*4] @ b[6] + umlal r5, r6, r7, r8 @ d += a[7] * b[6] + ldr r7, [r1, #8*4] @ a[8] + umlal r9, r10, r7, r8 @ d' += a[8] * b[6] + ldr r8, [r2, #5*4] @ b[5] + umlal r5, r6, r7, r8 @ d += a[8] * b[5] + ldr r7, [r1, #9*4] @ a[9] + umlal r9, r10, r7, r8 @ d' += a[9] * b[5] + ldr r8, [r2, #4*4] @ b[4] + umlal r5, r6, r7, r8 @ d += a[9] * b[4] + + bic r0, r5, field_not_M @ u3 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u3 * R0 + umlal r3, r4, r0, r14 + + bic r14, r3, field_not_M @ t3 = c & M + str r14, [sp, #4 + 3*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u3 * R1 + umlal r3, r4, r0, r14 + + /* F */ + adds r3, r3, r11 @ c += c' + adc r4, r4, r12 + adds r5, r5, r9 @ d += d' + adc r6, r6, r10 + + bic r0, r5, field_not_M @ u4 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u4 * R0 + umlal r3, r4, r0, r14 + + bic r14, r3, field_not_M @ t4 = c & M + str r14, [sp, #4 + 4*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u4 * R1 + umlal r3, r4, r0, r14 + + /* G - interleaved with H */ + ldr r7, [r1, #0*4] @ a[0] + ldr r8, [r2, #6*4] @ b[6] + ldr r14, [r2, #5*4] @ b[5] + umull r11, r12, r7, r8 @ c' = a[0] * b[6] + ldr r0, [r1, #1*4] @ a[1] + umlal r3, r4, r7, r14 @ c += a[0] * b[5] + ldr r8, [r2, #4*4] @ b[4] + umlal r11, r12, r0, r14 @ c' += a[1] * b[5] + ldr r7, [r1, #2*4] @ a[2] + umlal r3, r4, r0, r8 @ c += a[1] * b[4] + ldr r14, [r2, #3*4] @ b[3] + umlal r11, r12, r7, r8 @ c' += a[2] * b[4] + ldr r0, [r1, #3*4] @ a[3] + umlal r3, r4, r7, r14 @ c += a[2] * b[3] + ldr r8, [r2, #2*4] @ b[2] + umlal r11, r12, r0, r14 @ c' += a[3] * b[3] + ldr r7, [r1, #4*4] @ a[4] + umlal r3, r4, r0, r8 @ c += a[3] * b[2] + ldr r14, [r2, #1*4] @ b[1] + umlal r11, r12, r7, r8 @ c' += a[4] * b[2] + ldr r0, [r1, #5*4] @ a[5] + umlal r3, r4, r7, r14 @ c += a[4] * b[1] + ldr r8, [r2, #0*4] @ b[0] + umlal r11, r12, r0, r14 @ c' += a[5] * b[1] + ldr r7, [r1, #6*4] @ a[6] + umlal r3, r4, r0, r8 @ c += a[5] * b[0] + ldr r14, [r2, #9*4] @ b[9] + umlal r11, r12, r7, r8 @ c' += a[6] * b[0] + ldr r0, [r1, #7*4] @ a[7] + umlal r5, r6, r7, r14 @ d += a[6] * b[9] + ldr r8, [r2, #8*4] @ b[8] + umull r9, r10, r0, r14 @ d' = a[7] * b[9] + ldr r7, [r1, #8*4] @ a[8] + umlal r5, r6, r0, r8 @ d += a[7] * b[8] + ldr r14, [r2, #7*4] @ b[7] + umlal r9, r10, r7, r8 @ d' += a[8] * b[8] + ldr r0, [r1, #9*4] @ a[9] + umlal r5, r6, r7, r14 @ d += a[8] * b[7] + ldr r8, [r2, #6*4] @ b[6] + umlal r9, r10, r0, r14 @ d' += a[9] * b[7] + umlal r5, r6, r0, r8 @ d += a[9] * b[6] + + bic r0, r5, field_not_M @ u5 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u5 * R0 + umlal r3, r4, r0, r14 + + bic r14, r3, field_not_M @ t5 = c & M + str r14, [sp, #4 + 5*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u5 * R1 + umlal r3, r4, r0, r14 + + /* H */ + adds r3, r3, r11 @ c += c' + adc r4, r4, r12 + adds r5, r5, r9 @ d += d' + adc r6, r6, r10 + + bic r0, r5, field_not_M @ u6 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u6 * R0 + umlal r3, r4, r0, r14 + + bic r14, r3, field_not_M @ t6 = c & M + str r14, [sp, #4 + 6*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u6 * R1 + umlal r3, r4, r0, r14 + + /* I - interleaved with J */ + ldr r8, [r2, #8*4] @ b[8] + ldr r7, [r1, #0*4] @ a[0] + ldr r14, [r2, #7*4] @ b[7] + umull r11, r12, r7, r8 @ c' = a[0] * b[8] + ldr r0, [r1, #1*4] @ a[1] + umlal r3, r4, r7, r14 @ c += a[0] * b[7] + ldr r8, [r2, #6*4] @ b[6] + umlal r11, r12, r0, r14 @ c' += a[1] * b[7] + ldr r7, [r1, #2*4] @ a[2] + umlal r3, r4, r0, r8 @ c += a[1] * b[6] + ldr r14, [r2, #5*4] @ b[5] + umlal r11, r12, r7, r8 @ c' += a[2] * b[6] + ldr r0, [r1, #3*4] @ a[3] + umlal r3, r4, r7, r14 @ c += a[2] * b[5] + ldr r8, [r2, #4*4] @ b[4] + umlal r11, r12, r0, r14 @ c' += a[3] * b[5] + ldr r7, [r1, #4*4] @ a[4] + umlal r3, r4, r0, r8 @ c += a[3] * b[4] + ldr r14, [r2, #3*4] @ b[3] + umlal r11, r12, r7, r8 @ c' += a[4] * b[4] + ldr r0, [r1, #5*4] @ a[5] + umlal r3, r4, r7, r14 @ c += a[4] * b[3] + ldr r8, [r2, #2*4] @ b[2] + umlal r11, r12, r0, r14 @ c' += a[5] * b[3] + ldr r7, [r1, #6*4] @ a[6] + umlal r3, r4, r0, r8 @ c += a[5] * b[2] + ldr r14, [r2, #1*4] @ b[1] + umlal r11, r12, r7, r8 @ c' += a[6] * b[2] + ldr r0, [r1, #7*4] @ a[7] + umlal r3, r4, r7, r14 @ c += a[6] * b[1] + ldr r8, [r2, #0*4] @ b[0] + umlal r11, r12, r0, r14 @ c' += a[7] * b[1] + ldr r7, [r1, #8*4] @ a[8] + umlal r3, r4, r0, r8 @ c += a[7] * b[0] + ldr r14, [r2, #9*4] @ b[9] + umlal r11, r12, r7, r8 @ c' += a[8] * b[0] + ldr r0, [r1, #9*4] @ a[9] + umlal r5, r6, r7, r14 @ d += a[8] * b[9] + ldr r8, [r2, #8*4] @ b[8] + umull r9, r10, r0, r14 @ d' = a[9] * b[9] + umlal r5, r6, r0, r8 @ d += a[9] * b[8] + + bic r0, r5, field_not_M @ u7 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u7 * R0 + umlal r3, r4, r0, r14 + + bic r14, r3, field_not_M @ t7 = c & M + str r14, [sp, #4 + 7*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u7 * R1 + umlal r3, r4, r0, r14 + + /* J */ + adds r3, r3, r11 @ c += c' + adc r4, r4, r12 + adds r5, r5, r9 @ d += d' + adc r6, r6, r10 + + bic r0, r5, field_not_M @ u8 = d & M + str r0, [sp, #4 + 8*4] + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u8 * R0 + umlal r3, r4, r0, r14 + + /****************************************** + * compute and write back result + ****************************************** + Allocation: + r0 r + r3:r4 c + r5:r6 d + r7 t0 + r8 t1 + r9 t2 + r11 u8 + r12 t9 + r1,r2,r10,r14 scratch + + Note: do not read from a[] after here, it may overlap with r[] + */ + ldr r0, [sp, #0] + add r1, sp, #4 + 3*4 @ r[3..7] = t3..7, r11=u8, r12=t9 + ldmia r1, {r2,r7,r8,r9,r10,r11,r12} + add r1, r0, #3*4 + stmia r1, {r2,r7,r8,r9,r10} + + bic r2, r3, field_not_M @ r[8] = c & M + str r2, [r0, #8*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u8 * R1 + umlal r3, r4, r11, r14 + movw r14, field_R0 @ c += d * R0 + umlal r3, r4, r5, r14 + adds r3, r3, r12 @ c += t9 + adc r4, r4, #0 + + add r1, sp, #4 + 0*4 @ r7,r8,r9 = t0,t1,t2 + ldmia r1, {r7,r8,r9} + + ubfx r2, r3, #0, #22 @ r[9] = c & (M >> 4) + str r2, [r0, #9*4] + mov r3, r3, lsr #22 @ c >>= 22 + orr r3, r3, r4, asl #10 + mov r4, r4, lsr #22 + movw r14, field_R1 << 4 @ c += d * (R1 << 4) + umlal r3, r4, r5, r14 + + movw r14, field_R0 >> 4 @ d = c * (R0 >> 4) + t0 (64x64 multiply+add) + umull r5, r6, r3, r14 @ d = c.lo * (R0 >> 4) + adds r5, r5, r7 @ d.lo += t0 + mla r6, r14, r4, r6 @ d.hi += c.hi * (R0 >> 4) + adc r6, r6, 0 @ d.hi += carry + + bic r2, r5, field_not_M @ r[0] = d & M + str r2, [r0, #0*4] + + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + + movw r14, field_R1 >> 4 @ d += c * (R1 >> 4) + t1 (64x64 multiply+add) + umull r1, r2, r3, r14 @ tmp = c.lo * (R1 >> 4) + adds r5, r5, r8 @ d.lo += t1 + adc r6, r6, #0 @ d.hi += carry + adds r5, r5, r1 @ d.lo += tmp.lo + mla r2, r14, r4, r2 @ tmp.hi += c.hi * (R1 >> 4) + adc r6, r6, r2 @ d.hi += carry + tmp.hi + + bic r2, r5, field_not_M @ r[1] = d & M + str r2, [r0, #1*4] + mov r5, r5, lsr #26 @ d >>= 26 (ignore hi) + orr r5, r5, r6, asl #6 + + add r5, r5, r9 @ d += t2 + str r5, [r0, #2*4] @ r[2] = d + + add sp, sp, #48 + ldmfd sp!, {r4, r5, r6, r7, r8, r9, r10, r11, pc} + .size secp256k1_fe_mul_inner, .-secp256k1_fe_mul_inner + + .align 2 + .global secp256k1_fe_sqr_inner + .type secp256k1_fe_sqr_inner, %function + @ Arguments: + @ r0 r Can overlap with a + @ r1 a + @ Stack (total 4+10*4 = 44) + @ sp + #0 saved 'r' pointer + @ sp + #4 + 4*X t0,t1,t2,t3,t4,t5,t6,t7,u8,t9 +secp256k1_fe_sqr_inner: + stmfd sp!, {r4, r5, r6, r7, r8, r9, r10, r11, r14} + sub sp, sp, #48 @ frame=44 + alignment + str r0, [sp, #0] @ save result address, we need it only at the end + /****************************************** + * Main computation code. + ****************************************** + + Allocation: + r0,r14,r2,r7,r8 scratch + r1 a (pointer) + r3:r4 c + r5:r6 d + r11:r12 c' + r9:r10 d' + + Note: do not write to r[] here, it may overlap with a[] + */ + /* A interleaved with B */ + ldr r0, [r1, #1*4] @ a[1]*2 + ldr r7, [r1, #0*4] @ a[0] + mov r0, r0, asl #1 + ldr r14, [r1, #9*4] @ a[9] + umull r3, r4, r7, r7 @ c = a[0] * a[0] + ldr r8, [r1, #8*4] @ a[8] + mov r7, r7, asl #1 + umull r5, r6, r7, r14 @ d = a[0]*2 * a[9] + ldr r7, [r1, #2*4] @ a[2]*2 + umull r9, r10, r0, r14 @ d' = a[1]*2 * a[9] + ldr r14, [r1, #7*4] @ a[7] + umlal r5, r6, r0, r8 @ d += a[1]*2 * a[8] + mov r7, r7, asl #1 + ldr r0, [r1, #3*4] @ a[3]*2 + umlal r9, r10, r7, r8 @ d' += a[2]*2 * a[8] + ldr r8, [r1, #6*4] @ a[6] + umlal r5, r6, r7, r14 @ d += a[2]*2 * a[7] + mov r0, r0, asl #1 + ldr r7, [r1, #4*4] @ a[4]*2 + umlal r9, r10, r0, r14 @ d' += a[3]*2 * a[7] + ldr r14, [r1, #5*4] @ a[5] + mov r7, r7, asl #1 + umlal r5, r6, r0, r8 @ d += a[3]*2 * a[6] + umlal r9, r10, r7, r8 @ d' += a[4]*2 * a[6] + umlal r5, r6, r7, r14 @ d += a[4]*2 * a[5] + umlal r9, r10, r14, r14 @ d' += a[5] * a[5] + + bic r0, r5, field_not_M @ t9 = d & M + str r0, [sp, #4 + 9*4] + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + + /* B */ + adds r5, r5, r9 @ d += d' + adc r6, r6, r10 + + bic r0, r5, field_not_M @ u0 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u0 * R0 + umlal r3, r4, r0, r14 + bic r14, r3, field_not_M @ t0 = c & M + str r14, [sp, #4 + 0*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u0 * R1 + umlal r3, r4, r0, r14 + + /* C interleaved with D */ + ldr r0, [r1, #0*4] @ a[0]*2 + ldr r14, [r1, #1*4] @ a[1] + mov r0, r0, asl #1 + ldr r8, [r1, #2*4] @ a[2] + umlal r3, r4, r0, r14 @ c += a[0]*2 * a[1] + mov r7, r8, asl #1 @ a[2]*2 + umull r11, r12, r14, r14 @ c' = a[1] * a[1] + ldr r14, [r1, #9*4] @ a[9] + umlal r11, r12, r0, r8 @ c' += a[0]*2 * a[2] + ldr r0, [r1, #3*4] @ a[3]*2 + ldr r8, [r1, #8*4] @ a[8] + umlal r5, r6, r7, r14 @ d += a[2]*2 * a[9] + mov r0, r0, asl #1 + ldr r7, [r1, #4*4] @ a[4]*2 + umull r9, r10, r0, r14 @ d' = a[3]*2 * a[9] + ldr r14, [r1, #7*4] @ a[7] + umlal r5, r6, r0, r8 @ d += a[3]*2 * a[8] + mov r7, r7, asl #1 + ldr r0, [r1, #5*4] @ a[5]*2 + umlal r9, r10, r7, r8 @ d' += a[4]*2 * a[8] + ldr r8, [r1, #6*4] @ a[6] + mov r0, r0, asl #1 + umlal r5, r6, r7, r14 @ d += a[4]*2 * a[7] + umlal r9, r10, r0, r14 @ d' += a[5]*2 * a[7] + umlal r5, r6, r0, r8 @ d += a[5]*2 * a[6] + umlal r9, r10, r8, r8 @ d' += a[6] * a[6] + + bic r0, r5, field_not_M @ u1 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u1 * R0 + umlal r3, r4, r0, r14 + bic r14, r3, field_not_M @ t1 = c & M + str r14, [sp, #4 + 1*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u1 * R1 + umlal r3, r4, r0, r14 + + /* D */ + adds r3, r3, r11 @ c += c' + adc r4, r4, r12 + adds r5, r5, r9 @ d += d' + adc r6, r6, r10 + + bic r0, r5, field_not_M @ u2 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u2 * R0 + umlal r3, r4, r0, r14 + bic r14, r3, field_not_M @ t2 = c & M + str r14, [sp, #4 + 2*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u2 * R1 + umlal r3, r4, r0, r14 + + /* E interleaved with F */ + ldr r7, [r1, #0*4] @ a[0]*2 + ldr r0, [r1, #1*4] @ a[1]*2 + ldr r14, [r1, #2*4] @ a[2] + mov r7, r7, asl #1 + ldr r8, [r1, #3*4] @ a[3] + ldr r2, [r1, #4*4] + umlal r3, r4, r7, r8 @ c += a[0]*2 * a[3] + mov r0, r0, asl #1 + umull r11, r12, r7, r2 @ c' = a[0]*2 * a[4] + mov r2, r2, asl #1 @ a[4]*2 + umlal r11, r12, r0, r8 @ c' += a[1]*2 * a[3] + ldr r8, [r1, #9*4] @ a[9] + umlal r3, r4, r0, r14 @ c += a[1]*2 * a[2] + ldr r0, [r1, #5*4] @ a[5]*2 + umlal r11, r12, r14, r14 @ c' += a[2] * a[2] + ldr r14, [r1, #8*4] @ a[8] + mov r0, r0, asl #1 + umlal r5, r6, r2, r8 @ d += a[4]*2 * a[9] + ldr r7, [r1, #6*4] @ a[6]*2 + umull r9, r10, r0, r8 @ d' = a[5]*2 * a[9] + mov r7, r7, asl #1 + ldr r8, [r1, #7*4] @ a[7] + umlal r5, r6, r0, r14 @ d += a[5]*2 * a[8] + umlal r9, r10, r7, r14 @ d' += a[6]*2 * a[8] + umlal r5, r6, r7, r8 @ d += a[6]*2 * a[7] + umlal r9, r10, r8, r8 @ d' += a[7] * a[7] + + bic r0, r5, field_not_M @ u3 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u3 * R0 + umlal r3, r4, r0, r14 + bic r14, r3, field_not_M @ t3 = c & M + str r14, [sp, #4 + 3*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u3 * R1 + umlal r3, r4, r0, r14 + + /* F */ + adds r3, r3, r11 @ c += c' + adc r4, r4, r12 + adds r5, r5, r9 @ d += d' + adc r6, r6, r10 + + bic r0, r5, field_not_M @ u4 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u4 * R0 + umlal r3, r4, r0, r14 + bic r14, r3, field_not_M @ t4 = c & M + str r14, [sp, #4 + 4*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u4 * R1 + umlal r3, r4, r0, r14 + + /* G interleaved with H */ + ldr r7, [r1, #0*4] @ a[0]*2 + ldr r0, [r1, #1*4] @ a[1]*2 + mov r7, r7, asl #1 + ldr r8, [r1, #5*4] @ a[5] + ldr r2, [r1, #6*4] @ a[6] + umlal r3, r4, r7, r8 @ c += a[0]*2 * a[5] + ldr r14, [r1, #4*4] @ a[4] + mov r0, r0, asl #1 + umull r11, r12, r7, r2 @ c' = a[0]*2 * a[6] + ldr r7, [r1, #2*4] @ a[2]*2 + umlal r11, r12, r0, r8 @ c' += a[1]*2 * a[5] + mov r7, r7, asl #1 + ldr r8, [r1, #3*4] @ a[3] + umlal r3, r4, r0, r14 @ c += a[1]*2 * a[4] + mov r0, r2, asl #1 @ a[6]*2 + umlal r11, r12, r7, r14 @ c' += a[2]*2 * a[4] + ldr r14, [r1, #9*4] @ a[9] + umlal r3, r4, r7, r8 @ c += a[2]*2 * a[3] + ldr r7, [r1, #7*4] @ a[7]*2 + umlal r11, r12, r8, r8 @ c' += a[3] * a[3] + mov r7, r7, asl #1 + ldr r8, [r1, #8*4] @ a[8] + umlal r5, r6, r0, r14 @ d += a[6]*2 * a[9] + umull r9, r10, r7, r14 @ d' = a[7]*2 * a[9] + umlal r5, r6, r7, r8 @ d += a[7]*2 * a[8] + umlal r9, r10, r8, r8 @ d' += a[8] * a[8] + + bic r0, r5, field_not_M @ u5 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u5 * R0 + umlal r3, r4, r0, r14 + bic r14, r3, field_not_M @ t5 = c & M + str r14, [sp, #4 + 5*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u5 * R1 + umlal r3, r4, r0, r14 + + /* H */ + adds r3, r3, r11 @ c += c' + adc r4, r4, r12 + adds r5, r5, r9 @ d += d' + adc r6, r6, r10 + + bic r0, r5, field_not_M @ u6 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u6 * R0 + umlal r3, r4, r0, r14 + bic r14, r3, field_not_M @ t6 = c & M + str r14, [sp, #4 + 6*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u6 * R1 + umlal r3, r4, r0, r14 + + /* I interleaved with J */ + ldr r7, [r1, #0*4] @ a[0]*2 + ldr r0, [r1, #1*4] @ a[1]*2 + mov r7, r7, asl #1 + ldr r8, [r1, #7*4] @ a[7] + ldr r2, [r1, #8*4] @ a[8] + umlal r3, r4, r7, r8 @ c += a[0]*2 * a[7] + ldr r14, [r1, #6*4] @ a[6] + mov r0, r0, asl #1 + umull r11, r12, r7, r2 @ c' = a[0]*2 * a[8] + ldr r7, [r1, #2*4] @ a[2]*2 + umlal r11, r12, r0, r8 @ c' += a[1]*2 * a[7] + ldr r8, [r1, #5*4] @ a[5] + umlal r3, r4, r0, r14 @ c += a[1]*2 * a[6] + ldr r0, [r1, #3*4] @ a[3]*2 + mov r7, r7, asl #1 + umlal r11, r12, r7, r14 @ c' += a[2]*2 * a[6] + ldr r14, [r1, #4*4] @ a[4] + mov r0, r0, asl #1 + umlal r3, r4, r7, r8 @ c += a[2]*2 * a[5] + mov r2, r2, asl #1 @ a[8]*2 + umlal r11, r12, r0, r8 @ c' += a[3]*2 * a[5] + umlal r3, r4, r0, r14 @ c += a[3]*2 * a[4] + umlal r11, r12, r14, r14 @ c' += a[4] * a[4] + ldr r8, [r1, #9*4] @ a[9] + umlal r5, r6, r2, r8 @ d += a[8]*2 * a[9] + @ r8 will be used in J + + bic r0, r5, field_not_M @ u7 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u7 * R0 + umlal r3, r4, r0, r14 + bic r14, r3, field_not_M @ t7 = c & M + str r14, [sp, #4 + 7*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u7 * R1 + umlal r3, r4, r0, r14 + + /* J */ + adds r3, r3, r11 @ c += c' + adc r4, r4, r12 + umlal r5, r6, r8, r8 @ d += a[9] * a[9] + + bic r0, r5, field_not_M @ u8 = d & M + str r0, [sp, #4 + 8*4] + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u8 * R0 + umlal r3, r4, r0, r14 + + /****************************************** + * compute and write back result + ****************************************** + Allocation: + r0 r + r3:r4 c + r5:r6 d + r7 t0 + r8 t1 + r9 t2 + r11 u8 + r12 t9 + r1,r2,r10,r14 scratch + + Note: do not read from a[] after here, it may overlap with r[] + */ + ldr r0, [sp, #0] + add r1, sp, #4 + 3*4 @ r[3..7] = t3..7, r11=u8, r12=t9 + ldmia r1, {r2,r7,r8,r9,r10,r11,r12} + add r1, r0, #3*4 + stmia r1, {r2,r7,r8,r9,r10} + + bic r2, r3, field_not_M @ r[8] = c & M + str r2, [r0, #8*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u8 * R1 + umlal r3, r4, r11, r14 + movw r14, field_R0 @ c += d * R0 + umlal r3, r4, r5, r14 + adds r3, r3, r12 @ c += t9 + adc r4, r4, #0 + + add r1, sp, #4 + 0*4 @ r7,r8,r9 = t0,t1,t2 + ldmia r1, {r7,r8,r9} + + ubfx r2, r3, #0, #22 @ r[9] = c & (M >> 4) + str r2, [r0, #9*4] + mov r3, r3, lsr #22 @ c >>= 22 + orr r3, r3, r4, asl #10 + mov r4, r4, lsr #22 + movw r14, field_R1 << 4 @ c += d * (R1 << 4) + umlal r3, r4, r5, r14 + + movw r14, field_R0 >> 4 @ d = c * (R0 >> 4) + t0 (64x64 multiply+add) + umull r5, r6, r3, r14 @ d = c.lo * (R0 >> 4) + adds r5, r5, r7 @ d.lo += t0 + mla r6, r14, r4, r6 @ d.hi += c.hi * (R0 >> 4) + adc r6, r6, 0 @ d.hi += carry + + bic r2, r5, field_not_M @ r[0] = d & M + str r2, [r0, #0*4] + + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + + movw r14, field_R1 >> 4 @ d += c * (R1 >> 4) + t1 (64x64 multiply+add) + umull r1, r2, r3, r14 @ tmp = c.lo * (R1 >> 4) + adds r5, r5, r8 @ d.lo += t1 + adc r6, r6, #0 @ d.hi += carry + adds r5, r5, r1 @ d.lo += tmp.lo + mla r2, r14, r4, r2 @ tmp.hi += c.hi * (R1 >> 4) + adc r6, r6, r2 @ d.hi += carry + tmp.hi + + bic r2, r5, field_not_M @ r[1] = d & M + str r2, [r0, #1*4] + mov r5, r5, lsr #26 @ d >>= 26 (ignore hi) + orr r5, r5, r6, asl #6 + + add r5, r5, r9 @ d += t2 + str r5, [r0, #2*4] @ r[2] = d + + add sp, sp, #48 + ldmfd sp!, {r4, r5, r6, r7, r8, r9, r10, r11, pc} + .size secp256k1_fe_sqr_inner, .-secp256k1_fe_sqr_inner + diff --git a/src/cryptoconditions/src/include/secp256k1/src/basic-config.h b/src/cryptoconditions/src/include/secp256k1/src/basic-config.h new file mode 100644 index 000000000..fc588061c --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/basic-config.h @@ -0,0 +1,33 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_BASIC_CONFIG_H +#define SECP256K1_BASIC_CONFIG_H + +#ifdef USE_BASIC_CONFIG + +#undef USE_ASM_X86_64 +#undef USE_ENDOMORPHISM +#undef USE_FIELD_10X26 +#undef USE_FIELD_5X52 +#undef USE_FIELD_INV_BUILTIN +#undef USE_FIELD_INV_NUM +#undef USE_NUM_GMP +#undef USE_NUM_NONE +#undef USE_SCALAR_4X64 +#undef USE_SCALAR_8X32 +#undef USE_SCALAR_INV_BUILTIN +#undef USE_SCALAR_INV_NUM + +#define USE_NUM_NONE 1 +#define USE_FIELD_INV_BUILTIN 1 +#define USE_SCALAR_INV_BUILTIN 1 +#define USE_FIELD_10X26 1 +#define USE_SCALAR_8X32 1 + +#endif /* USE_BASIC_CONFIG */ + +#endif /* SECP256K1_BASIC_CONFIG_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/bench.h b/src/cryptoconditions/src/include/secp256k1/src/bench.h index db5f68cee..d5ebe0130 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/bench.h +++ b/src/cryptoconditions/src/include/secp256k1/src/bench.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_BENCH_H_ -#define _SECP256K1_BENCH_H_ +#ifndef SECP256K1_BENCH_H +#define SECP256K1_BENCH_H #include #include @@ -20,8 +20,10 @@ static double gettimedouble(void) { void print_number(double x) { double y = x; int c = 0; - if (y < 0.0) y = -y; - while (y < 100.0) { + if (y < 0.0) { + y = -y; + } + while (y > 0 && y < 100.0) { y *= 10.0; c++; } @@ -35,13 +37,21 @@ void run_benchmark(char *name, void (*benchmark)(void*), void (*setup)(void*), v double max = 0.0; for (i = 0; i < count; i++) { double begin, total; - if (setup) setup(data); + if (setup != NULL) { + setup(data); + } begin = gettimedouble(); benchmark(data); total = gettimedouble() - begin; - if (teardown) teardown(data); - if (total < min) min = total; - if (total > max) max = total; + if (teardown != NULL) { + teardown(data); + } + if (total < min) { + min = total; + } + if (total > max) { + max = total; + } sum += total; } printf("%s: min ", name); @@ -53,4 +63,4 @@ void run_benchmark(char *name, void (*benchmark)(void*), void (*setup)(void*), v printf("us\n"); } -#endif +#endif /* SECP256K1_BENCH_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/bench_ecdh.c b/src/cryptoconditions/src/include/secp256k1/src/bench_ecdh.c new file mode 100644 index 000000000..2de5126d6 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/bench_ecdh.c @@ -0,0 +1,54 @@ +/********************************************************************** + * Copyright (c) 2015 Pieter Wuille, Andrew Poelstra * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#include + +#include "include/secp256k1.h" +#include "include/secp256k1_ecdh.h" +#include "util.h" +#include "bench.h" + +typedef struct { + secp256k1_context *ctx; + secp256k1_pubkey point; + unsigned char scalar[32]; +} bench_ecdh; + +static void bench_ecdh_setup(void* arg) { + int i; + bench_ecdh *data = (bench_ecdh*)arg; + const unsigned char point[] = { + 0x03, + 0x54, 0x94, 0xc1, 0x5d, 0x32, 0x09, 0x97, 0x06, + 0xc2, 0x39, 0x5f, 0x94, 0x34, 0x87, 0x45, 0xfd, + 0x75, 0x7c, 0xe3, 0x0e, 0x4e, 0x8c, 0x90, 0xfb, + 0xa2, 0xba, 0xd1, 0x84, 0xf8, 0x83, 0xc6, 0x9f + }; + + /* create a context with no capabilities */ + data->ctx = secp256k1_context_create(SECP256K1_FLAGS_TYPE_CONTEXT); + for (i = 0; i < 32; i++) { + data->scalar[i] = i + 1; + } + CHECK(secp256k1_ec_pubkey_parse(data->ctx, &data->point, point, sizeof(point)) == 1); +} + +static void bench_ecdh(void* arg) { + int i; + unsigned char res[32]; + bench_ecdh *data = (bench_ecdh*)arg; + + for (i = 0; i < 20000; i++) { + CHECK(secp256k1_ecdh(data->ctx, res, &data->point, data->scalar) == 1); + } +} + +int main(void) { + bench_ecdh data; + + run_benchmark("ecdh", bench_ecdh, bench_ecdh_setup, NULL, &data, 10, 20000); + return 0; +} diff --git a/src/cryptoconditions/src/include/secp256k1/src/bench_internal.c b/src/cryptoconditions/src/include/secp256k1/src/bench_internal.c index a960549b9..9b30c50d0 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/bench_internal.c +++ b/src/cryptoconditions/src/include/secp256k1/src/bench_internal.c @@ -13,20 +13,22 @@ #include "field_impl.h" #include "group_impl.h" #include "scalar_impl.h" +#include "ecmult_const_impl.h" #include "ecmult_impl.h" #include "bench.h" +#include "secp256k1.c" typedef struct { - secp256k1_scalar_t scalar_x, scalar_y; - secp256k1_fe_t fe_x, fe_y; - secp256k1_ge_t ge_x, ge_y; - secp256k1_gej_t gej_x, gej_y; - unsigned char data[32]; + secp256k1_scalar scalar_x, scalar_y; + secp256k1_fe fe_x, fe_y; + secp256k1_ge ge_x, ge_y; + secp256k1_gej gej_x, gej_y; + unsigned char data[64]; int wnaf[256]; -} bench_inv_t; +} bench_inv; void bench_setup(void* arg) { - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; static const unsigned char init_x[32] = { 0x02, 0x03, 0x05, 0x07, 0x0b, 0x0d, 0x11, 0x13, @@ -51,11 +53,12 @@ void bench_setup(void* arg) { secp256k1_gej_set_ge(&data->gej_x, &data->ge_x); secp256k1_gej_set_ge(&data->gej_y, &data->ge_y); memcpy(data->data, init_x, 32); + memcpy(data->data + 32, init_y, 32); } void bench_scalar_add(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 2000000; i++) { secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); @@ -64,7 +67,7 @@ void bench_scalar_add(void* arg) { void bench_scalar_negate(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 2000000; i++) { secp256k1_scalar_negate(&data->scalar_x, &data->scalar_x); @@ -73,7 +76,7 @@ void bench_scalar_negate(void* arg) { void bench_scalar_sqr(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 200000; i++) { secp256k1_scalar_sqr(&data->scalar_x, &data->scalar_x); @@ -82,7 +85,7 @@ void bench_scalar_sqr(void* arg) { void bench_scalar_mul(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 200000; i++) { secp256k1_scalar_mul(&data->scalar_x, &data->scalar_x, &data->scalar_y); @@ -92,11 +95,11 @@ void bench_scalar_mul(void* arg) { #ifdef USE_ENDOMORPHISM void bench_scalar_split(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 20000; i++) { - secp256k1_scalar_t l, r; - secp256k1_scalar_split_lambda_var(&l, &r, &data->scalar_x); + secp256k1_scalar l, r; + secp256k1_scalar_split_lambda(&l, &r, &data->scalar_x); secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); } } @@ -104,7 +107,7 @@ void bench_scalar_split(void* arg) { void bench_scalar_inverse(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 2000; i++) { secp256k1_scalar_inverse(&data->scalar_x, &data->scalar_x); @@ -114,7 +117,7 @@ void bench_scalar_inverse(void* arg) { void bench_scalar_inverse_var(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 2000; i++) { secp256k1_scalar_inverse_var(&data->scalar_x, &data->scalar_x); @@ -124,7 +127,7 @@ void bench_scalar_inverse_var(void* arg) { void bench_field_normalize(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 2000000; i++) { secp256k1_fe_normalize(&data->fe_x); @@ -133,7 +136,7 @@ void bench_field_normalize(void* arg) { void bench_field_normalize_weak(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 2000000; i++) { secp256k1_fe_normalize_weak(&data->fe_x); @@ -142,7 +145,7 @@ void bench_field_normalize_weak(void* arg) { void bench_field_mul(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 200000; i++) { secp256k1_fe_mul(&data->fe_x, &data->fe_x, &data->fe_y); @@ -151,7 +154,7 @@ void bench_field_mul(void* arg) { void bench_field_sqr(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 200000; i++) { secp256k1_fe_sqr(&data->fe_x, &data->fe_x); @@ -160,7 +163,7 @@ void bench_field_sqr(void* arg) { void bench_field_inverse(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 20000; i++) { secp256k1_fe_inv(&data->fe_x, &data->fe_x); @@ -170,7 +173,7 @@ void bench_field_inverse(void* arg) { void bench_field_inverse_var(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 20000; i++) { secp256k1_fe_inv_var(&data->fe_x, &data->fe_x); @@ -178,37 +181,37 @@ void bench_field_inverse_var(void* arg) { } } -void bench_field_sqrt_var(void* arg) { +void bench_field_sqrt(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 20000; i++) { - secp256k1_fe_sqrt_var(&data->fe_x, &data->fe_x); + secp256k1_fe_sqrt(&data->fe_x, &data->fe_x); secp256k1_fe_add(&data->fe_x, &data->fe_y); } } void bench_group_double_var(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 200000; i++) { - secp256k1_gej_double_var(&data->gej_x, &data->gej_x); + secp256k1_gej_double_var(&data->gej_x, &data->gej_x, NULL); } } void bench_group_add_var(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 200000; i++) { - secp256k1_gej_add_var(&data->gej_x, &data->gej_x, &data->gej_y); + secp256k1_gej_add_var(&data->gej_x, &data->gej_x, &data->gej_y, NULL); } } void bench_group_add_affine(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 200000; i++) { secp256k1_gej_add_ge(&data->gej_x, &data->gej_x, &data->ge_y); @@ -217,19 +220,38 @@ void bench_group_add_affine(void* arg) { void bench_group_add_affine_var(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 200000; i++) { - secp256k1_gej_add_ge_var(&data->gej_x, &data->gej_x, &data->ge_y); + secp256k1_gej_add_ge_var(&data->gej_x, &data->gej_x, &data->ge_y, NULL); + } +} + +void bench_group_jacobi_var(void* arg) { + int i; + bench_inv *data = (bench_inv*)arg; + + for (i = 0; i < 20000; i++) { + secp256k1_gej_has_quad_y_var(&data->gej_x); } } void bench_ecmult_wnaf(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; + bench_inv *data = (bench_inv*)arg; for (i = 0; i < 20000; i++) { - secp256k1_ecmult_wnaf(data->wnaf, &data->scalar_x, WINDOW_A); + secp256k1_ecmult_wnaf(data->wnaf, 256, &data->scalar_x, WINDOW_A); + secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); + } +} + +void bench_wnaf_const(void* arg) { + int i; + bench_inv *data = (bench_inv*)arg; + + for (i = 0; i < 20000; i++) { + secp256k1_wnaf_const(data->wnaf, data->scalar_x, WINDOW_A); secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); } } @@ -237,8 +259,8 @@ void bench_ecmult_wnaf(void* arg) { void bench_sha256(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; - secp256k1_sha256_t sha; + bench_inv *data = (bench_inv*)arg; + secp256k1_sha256 sha; for (i = 0; i < 20000; i++) { secp256k1_sha256_initialize(&sha); @@ -249,8 +271,8 @@ void bench_sha256(void* arg) { void bench_hmac_sha256(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; - secp256k1_hmac_sha256_t hmac; + bench_inv *data = (bench_inv*)arg; + secp256k1_hmac_sha256 hmac; for (i = 0; i < 20000; i++) { secp256k1_hmac_sha256_initialize(&hmac, data->data, 32); @@ -261,15 +283,46 @@ void bench_hmac_sha256(void* arg) { void bench_rfc6979_hmac_sha256(void* arg) { int i; - bench_inv_t *data = (bench_inv_t*)arg; - secp256k1_rfc6979_hmac_sha256_t rng; + bench_inv *data = (bench_inv*)arg; + secp256k1_rfc6979_hmac_sha256 rng; for (i = 0; i < 20000; i++) { - secp256k1_rfc6979_hmac_sha256_initialize(&rng, data->data, 32, data->data, 32, NULL, 0); + secp256k1_rfc6979_hmac_sha256_initialize(&rng, data->data, 64); secp256k1_rfc6979_hmac_sha256_generate(&rng, data->data, 32); } } +void bench_context_verify(void* arg) { + int i; + (void)arg; + for (i = 0; i < 20; i++) { + secp256k1_context_destroy(secp256k1_context_create(SECP256K1_CONTEXT_VERIFY)); + } +} + +void bench_context_sign(void* arg) { + int i; + (void)arg; + for (i = 0; i < 200; i++) { + secp256k1_context_destroy(secp256k1_context_create(SECP256K1_CONTEXT_SIGN)); + } +} + +#ifndef USE_NUM_NONE +void bench_num_jacobi(void* arg) { + int i; + bench_inv *data = (bench_inv*)arg; + secp256k1_num nx, norder; + + secp256k1_scalar_get_num(&nx, &data->scalar_x); + secp256k1_scalar_order_get_num(&norder); + secp256k1_scalar_get_num(&norder, &data->scalar_y); + + for (i = 0; i < 200000; i++) { + secp256k1_num_jacobi(&nx, &norder); + } +} +#endif int have_flag(int argc, char** argv, char *flag) { char** argm = argv + argc; @@ -278,14 +331,16 @@ int have_flag(int argc, char** argv, char *flag) { return 1; } while (argv != NULL && argv != argm) { - if (strcmp(*argv, flag) == 0) return 1; + if (strcmp(*argv, flag) == 0) { + return 1; + } argv++; } return 0; } int main(int argc, char **argv) { - bench_inv_t data; + bench_inv data; if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "add")) run_benchmark("scalar_add", bench_scalar_add, bench_setup, NULL, &data, 10, 2000000); if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "negate")) run_benchmark("scalar_negate", bench_scalar_negate, bench_setup, NULL, &data, 10, 2000000); if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "sqr")) run_benchmark("scalar_sqr", bench_scalar_sqr, bench_setup, NULL, &data, 10, 200000); @@ -302,17 +357,26 @@ int main(int argc, char **argv) { if (have_flag(argc, argv, "field") || have_flag(argc, argv, "mul")) run_benchmark("field_mul", bench_field_mul, bench_setup, NULL, &data, 10, 200000); if (have_flag(argc, argv, "field") || have_flag(argc, argv, "inverse")) run_benchmark("field_inverse", bench_field_inverse, bench_setup, NULL, &data, 10, 20000); if (have_flag(argc, argv, "field") || have_flag(argc, argv, "inverse")) run_benchmark("field_inverse_var", bench_field_inverse_var, bench_setup, NULL, &data, 10, 20000); - if (have_flag(argc, argv, "field") || have_flag(argc, argv, "sqrt")) run_benchmark("field_sqrt_var", bench_field_sqrt_var, bench_setup, NULL, &data, 10, 20000); + if (have_flag(argc, argv, "field") || have_flag(argc, argv, "sqrt")) run_benchmark("field_sqrt", bench_field_sqrt, bench_setup, NULL, &data, 10, 20000); if (have_flag(argc, argv, "group") || have_flag(argc, argv, "double")) run_benchmark("group_double_var", bench_group_double_var, bench_setup, NULL, &data, 10, 200000); if (have_flag(argc, argv, "group") || have_flag(argc, argv, "add")) run_benchmark("group_add_var", bench_group_add_var, bench_setup, NULL, &data, 10, 200000); if (have_flag(argc, argv, "group") || have_flag(argc, argv, "add")) run_benchmark("group_add_affine", bench_group_add_affine, bench_setup, NULL, &data, 10, 200000); if (have_flag(argc, argv, "group") || have_flag(argc, argv, "add")) run_benchmark("group_add_affine_var", bench_group_add_affine_var, bench_setup, NULL, &data, 10, 200000); + if (have_flag(argc, argv, "group") || have_flag(argc, argv, "jacobi")) run_benchmark("group_jacobi_var", bench_group_jacobi_var, bench_setup, NULL, &data, 10, 20000); + if (have_flag(argc, argv, "ecmult") || have_flag(argc, argv, "wnaf")) run_benchmark("wnaf_const", bench_wnaf_const, bench_setup, NULL, &data, 10, 20000); if (have_flag(argc, argv, "ecmult") || have_flag(argc, argv, "wnaf")) run_benchmark("ecmult_wnaf", bench_ecmult_wnaf, bench_setup, NULL, &data, 10, 20000); if (have_flag(argc, argv, "hash") || have_flag(argc, argv, "sha256")) run_benchmark("hash_sha256", bench_sha256, bench_setup, NULL, &data, 10, 20000); if (have_flag(argc, argv, "hash") || have_flag(argc, argv, "hmac")) run_benchmark("hash_hmac_sha256", bench_hmac_sha256, bench_setup, NULL, &data, 10, 20000); if (have_flag(argc, argv, "hash") || have_flag(argc, argv, "rng6979")) run_benchmark("hash_rfc6979_hmac_sha256", bench_rfc6979_hmac_sha256, bench_setup, NULL, &data, 10, 20000); + + if (have_flag(argc, argv, "context") || have_flag(argc, argv, "verify")) run_benchmark("context_verify", bench_context_verify, bench_setup, NULL, &data, 10, 20); + if (have_flag(argc, argv, "context") || have_flag(argc, argv, "sign")) run_benchmark("context_sign", bench_context_sign, bench_setup, NULL, &data, 10, 200); + +#ifndef USE_NUM_NONE + if (have_flag(argc, argv, "num") || have_flag(argc, argv, "jacobi")) run_benchmark("num_jacobi", bench_num_jacobi, bench_setup, NULL, &data, 10, 200000); +#endif return 0; } diff --git a/src/cryptoconditions/src/include/secp256k1/src/bench_recover.c b/src/cryptoconditions/src/include/secp256k1/src/bench_recover.c index 56faed11a..506fc1880 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/bench_recover.c +++ b/src/cryptoconditions/src/include/secp256k1/src/bench_recover.c @@ -1,46 +1,55 @@ /********************************************************************** - * Copyright (c) 2014 Pieter Wuille * + * Copyright (c) 2014-2015 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #include "include/secp256k1.h" +#include "include/secp256k1_recovery.h" #include "util.h" #include "bench.h" typedef struct { - secp256k1_context_t *ctx; + secp256k1_context *ctx; unsigned char msg[32]; unsigned char sig[64]; -} bench_recover_t; +} bench_recover; void bench_recover(void* arg) { int i; - bench_recover_t *data = (bench_recover_t*)arg; - unsigned char pubkey[33]; + bench_recover *data = (bench_recover*)arg; + secp256k1_pubkey pubkey; + unsigned char pubkeyc[33]; for (i = 0; i < 20000; i++) { int j; - int pubkeylen = 33; - CHECK(secp256k1_ecdsa_recover_compact(data->ctx, data->msg, data->sig, pubkey, &pubkeylen, 1, i % 2)); + size_t pubkeylen = 33; + secp256k1_ecdsa_recoverable_signature sig; + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(data->ctx, &sig, data->sig, i % 2)); + CHECK(secp256k1_ecdsa_recover(data->ctx, &pubkey, &sig, data->msg)); + CHECK(secp256k1_ec_pubkey_serialize(data->ctx, pubkeyc, &pubkeylen, &pubkey, SECP256K1_EC_COMPRESSED)); for (j = 0; j < 32; j++) { data->sig[j + 32] = data->msg[j]; /* Move former message to S. */ data->msg[j] = data->sig[j]; /* Move former R to message. */ - data->sig[j] = pubkey[j + 1]; /* Move recovered pubkey X coordinate to R (which must be a valid X coordinate). */ + data->sig[j] = pubkeyc[j + 1]; /* Move recovered pubkey X coordinate to R (which must be a valid X coordinate). */ } } } void bench_recover_setup(void* arg) { int i; - bench_recover_t *data = (bench_recover_t*)arg; + bench_recover *data = (bench_recover*)arg; - for (i = 0; i < 32; i++) data->msg[i] = 1 + i; - for (i = 0; i < 64; i++) data->sig[i] = 65 + i; + for (i = 0; i < 32; i++) { + data->msg[i] = 1 + i; + } + for (i = 0; i < 64; i++) { + data->sig[i] = 65 + i; + } } int main(void) { - bench_recover_t data; + bench_recover data; data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY); diff --git a/src/cryptoconditions/src/include/secp256k1/src/bench_sign.c b/src/cryptoconditions/src/include/secp256k1/src/bench_sign.c index 072a37af5..544b43963 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/bench_sign.c +++ b/src/cryptoconditions/src/include/secp256k1/src/bench_sign.c @@ -9,41 +9,47 @@ #include "bench.h" typedef struct { - secp256k1_context_t* ctx; + secp256k1_context* ctx; unsigned char msg[32]; unsigned char key[32]; -} bench_sign_t; +} bench_sign; static void bench_sign_setup(void* arg) { int i; - bench_sign_t *data = (bench_sign_t*)arg; + bench_sign *data = (bench_sign*)arg; - for (i = 0; i < 32; i++) data->msg[i] = i + 1; - for (i = 0; i < 32; i++) data->key[i] = i + 65; + for (i = 0; i < 32; i++) { + data->msg[i] = i + 1; + } + for (i = 0; i < 32; i++) { + data->key[i] = i + 65; + } } -static void bench_sign(void* arg) { +static void bench_sign_run(void* arg) { int i; - bench_sign_t *data = (bench_sign_t*)arg; + bench_sign *data = (bench_sign*)arg; - unsigned char sig[64]; + unsigned char sig[74]; for (i = 0; i < 20000; i++) { + size_t siglen = 74; int j; - int recid = 0; - CHECK(secp256k1_ecdsa_sign_compact(data->ctx, data->msg, sig, data->key, NULL, NULL, &recid)); + secp256k1_ecdsa_signature signature; + CHECK(secp256k1_ecdsa_sign(data->ctx, &signature, data->msg, data->key, NULL, NULL)); + CHECK(secp256k1_ecdsa_signature_serialize_der(data->ctx, sig, &siglen, &signature)); for (j = 0; j < 32; j++) { - data->msg[j] = sig[j]; /* Move former R to message. */ - data->key[j] = sig[j + 32]; /* Move former S to key. */ + data->msg[j] = sig[j]; + data->key[j] = sig[j + 32]; } } } int main(void) { - bench_sign_t data; + bench_sign data; data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN); - run_benchmark("ecdsa_sign", bench_sign, bench_sign_setup, NULL, &data, 10, 20000); + run_benchmark("ecdsa_sign", bench_sign_run, bench_sign_setup, NULL, &data, 10, 20000); secp256k1_context_destroy(data.ctx); return 0; diff --git a/src/cryptoconditions/src/include/secp256k1/src/bench_verify.c b/src/cryptoconditions/src/include/secp256k1/src/bench_verify.c index c8c82752c..418defa0a 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/bench_verify.c +++ b/src/cryptoconditions/src/include/secp256k1/src/bench_verify.c @@ -11,14 +11,23 @@ #include "util.h" #include "bench.h" +#ifdef ENABLE_OPENSSL_TESTS +#include +#include +#include +#endif + typedef struct { - secp256k1_context_t *ctx; + secp256k1_context *ctx; unsigned char msg[32]; unsigned char key[32]; unsigned char sig[72]; - int siglen; + size_t siglen; unsigned char pubkey[33]; - int pubkeylen; + size_t pubkeylen; +#ifdef ENABLE_OPENSSL_TESTS + EC_GROUP* ec_group; +#endif } benchmark_verify_t; static void benchmark_verify(void* arg) { @@ -26,30 +35,77 @@ static void benchmark_verify(void* arg) { benchmark_verify_t* data = (benchmark_verify_t*)arg; for (i = 0; i < 20000; i++) { + secp256k1_pubkey pubkey; + secp256k1_ecdsa_signature sig; data->sig[data->siglen - 1] ^= (i & 0xFF); data->sig[data->siglen - 2] ^= ((i >> 8) & 0xFF); data->sig[data->siglen - 3] ^= ((i >> 16) & 0xFF); - CHECK(secp256k1_ecdsa_verify(data->ctx, data->msg, data->sig, data->siglen, data->pubkey, data->pubkeylen) == (i == 0)); + CHECK(secp256k1_ec_pubkey_parse(data->ctx, &pubkey, data->pubkey, data->pubkeylen) == 1); + CHECK(secp256k1_ecdsa_signature_parse_der(data->ctx, &sig, data->sig, data->siglen) == 1); + CHECK(secp256k1_ecdsa_verify(data->ctx, &sig, data->msg, &pubkey) == (i == 0)); data->sig[data->siglen - 1] ^= (i & 0xFF); data->sig[data->siglen - 2] ^= ((i >> 8) & 0xFF); data->sig[data->siglen - 3] ^= ((i >> 16) & 0xFF); } } +#ifdef ENABLE_OPENSSL_TESTS +static void benchmark_verify_openssl(void* arg) { + int i; + benchmark_verify_t* data = (benchmark_verify_t*)arg; + + for (i = 0; i < 20000; i++) { + data->sig[data->siglen - 1] ^= (i & 0xFF); + data->sig[data->siglen - 2] ^= ((i >> 8) & 0xFF); + data->sig[data->siglen - 3] ^= ((i >> 16) & 0xFF); + { + EC_KEY *pkey = EC_KEY_new(); + const unsigned char *pubkey = &data->pubkey[0]; + int result; + + CHECK(pkey != NULL); + result = EC_KEY_set_group(pkey, data->ec_group); + CHECK(result); + result = (o2i_ECPublicKey(&pkey, &pubkey, data->pubkeylen)) != NULL; + CHECK(result); + result = ECDSA_verify(0, &data->msg[0], sizeof(data->msg), &data->sig[0], data->siglen, pkey) == (i == 0); + CHECK(result); + EC_KEY_free(pkey); + } + data->sig[data->siglen - 1] ^= (i & 0xFF); + data->sig[data->siglen - 2] ^= ((i >> 8) & 0xFF); + data->sig[data->siglen - 3] ^= ((i >> 16) & 0xFF); + } +} +#endif + int main(void) { int i; + secp256k1_pubkey pubkey; + secp256k1_ecdsa_signature sig; benchmark_verify_t data; data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); - for (i = 0; i < 32; i++) data.msg[i] = 1 + i; - for (i = 0; i < 32; i++) data.key[i] = 33 + i; + for (i = 0; i < 32; i++) { + data.msg[i] = 1 + i; + } + for (i = 0; i < 32; i++) { + data.key[i] = 33 + i; + } data.siglen = 72; - secp256k1_ecdsa_sign(data.ctx, data.msg, data.sig, &data.siglen, data.key, NULL, NULL); + CHECK(secp256k1_ecdsa_sign(data.ctx, &sig, data.msg, data.key, NULL, NULL)); + CHECK(secp256k1_ecdsa_signature_serialize_der(data.ctx, data.sig, &data.siglen, &sig)); + CHECK(secp256k1_ec_pubkey_create(data.ctx, &pubkey, data.key)); data.pubkeylen = 33; - CHECK(secp256k1_ec_pubkey_create(data.ctx, data.pubkey, &data.pubkeylen, data.key, 1)); + CHECK(secp256k1_ec_pubkey_serialize(data.ctx, data.pubkey, &data.pubkeylen, &pubkey, SECP256K1_EC_COMPRESSED) == 1); run_benchmark("ecdsa_verify", benchmark_verify, NULL, NULL, &data, 10, 20000); +#ifdef ENABLE_OPENSSL_TESTS + data.ec_group = EC_GROUP_new_by_curve_name(NID_secp256k1); + run_benchmark("ecdsa_verify_openssl", benchmark_verify_openssl, NULL, NULL, &data, 10, 20000); + EC_GROUP_free(data.ec_group); +#endif secp256k1_context_destroy(data.ctx); return 0; diff --git a/src/cryptoconditions/src/include/secp256k1/src/ecdsa.h b/src/cryptoconditions/src/include/secp256k1/src/ecdsa.h index 4ef78e8af..80590c7cc 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/ecdsa.h +++ b/src/cryptoconditions/src/include/secp256k1/src/ecdsa.h @@ -4,21 +4,18 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_ECDSA_ -#define _SECP256K1_ECDSA_ +#ifndef SECP256K1_ECDSA_H +#define SECP256K1_ECDSA_H + +#include #include "scalar.h" #include "group.h" #include "ecmult.h" -typedef struct { - secp256k1_scalar_t r, s; -} secp256k1_ecdsa_sig_t; +static int secp256k1_ecdsa_sig_parse(secp256k1_scalar *r, secp256k1_scalar *s, const unsigned char *sig, size_t size); +static int secp256k1_ecdsa_sig_serialize(unsigned char *sig, size_t *size, const secp256k1_scalar *r, const secp256k1_scalar *s); +static int secp256k1_ecdsa_sig_verify(const secp256k1_ecmult_context *ctx, const secp256k1_scalar* r, const secp256k1_scalar* s, const secp256k1_ge *pubkey, const secp256k1_scalar *message); +static int secp256k1_ecdsa_sig_sign(const secp256k1_ecmult_gen_context *ctx, secp256k1_scalar* r, secp256k1_scalar* s, const secp256k1_scalar *seckey, const secp256k1_scalar *message, const secp256k1_scalar *nonce, int *recid); -static int secp256k1_ecdsa_sig_parse(secp256k1_ecdsa_sig_t *r, const unsigned char *sig, int size); -static int secp256k1_ecdsa_sig_serialize(unsigned char *sig, int *size, const secp256k1_ecdsa_sig_t *a); -static int secp256k1_ecdsa_sig_verify(const secp256k1_ecmult_context_t *ctx, const secp256k1_ecdsa_sig_t *sig, const secp256k1_ge_t *pubkey, const secp256k1_scalar_t *message); -static int secp256k1_ecdsa_sig_sign(const secp256k1_ecmult_gen_context_t *ctx, secp256k1_ecdsa_sig_t *sig, const secp256k1_scalar_t *seckey, const secp256k1_scalar_t *message, const secp256k1_scalar_t *nonce, int *recid); -static int secp256k1_ecdsa_sig_recover(const secp256k1_ecmult_context_t *ctx, const secp256k1_ecdsa_sig_t *sig, secp256k1_ge_t *pubkey, const secp256k1_scalar_t *message, int recid); - -#endif +#endif /* SECP256K1_ECDSA_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/ecdsa_impl.h b/src/cryptoconditions/src/include/secp256k1/src/ecdsa_impl.h index 8d97db946..c3400042d 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/ecdsa_impl.h +++ b/src/cryptoconditions/src/include/secp256k1/src/ecdsa_impl.h @@ -1,12 +1,12 @@ /********************************************************************** - * Copyright (c) 2013, 2014 Pieter Wuille * + * Copyright (c) 2013-2015 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_ECDSA_IMPL_H_ -#define _SECP256K1_ECDSA_IMPL_H_ +#ifndef SECP256K1_ECDSA_IMPL_H +#define SECP256K1_ECDSA_IMPL_H #include "scalar.h" #include "field.h" @@ -28,7 +28,7 @@ * sage: '%x' % (EllipticCurve ([F (a), F (b)]).order()) * 'fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141' */ -static const secp256k1_fe_t secp256k1_ecdsa_const_order_as_fe = SECP256K1_FE_CONST( +static const secp256k1_fe secp256k1_ecdsa_const_order_as_fe = SECP256K1_FE_CONST( 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFEUL, 0xBAAEDCE6UL, 0xAF48A03BUL, 0xBFD25E8CUL, 0xD0364141UL ); @@ -42,90 +42,148 @@ static const secp256k1_fe_t secp256k1_ecdsa_const_order_as_fe = SECP256K1_FE_CON * sage: '%x' % (p - EllipticCurve ([F (a), F (b)]).order()) * '14551231950b75fc4402da1722fc9baee' */ -static const secp256k1_fe_t secp256k1_ecdsa_const_p_minus_order = SECP256K1_FE_CONST( +static const secp256k1_fe secp256k1_ecdsa_const_p_minus_order = SECP256K1_FE_CONST( 0, 0, 0, 1, 0x45512319UL, 0x50B75FC4UL, 0x402DA172UL, 0x2FC9BAEEUL ); -static int secp256k1_ecdsa_sig_parse(secp256k1_ecdsa_sig_t *r, const unsigned char *sig, int size) { +static int secp256k1_der_read_len(const unsigned char **sigp, const unsigned char *sigend) { + int lenleft, b1; + size_t ret = 0; + if (*sigp >= sigend) { + return -1; + } + b1 = *((*sigp)++); + if (b1 == 0xFF) { + /* X.690-0207 8.1.3.5.c the value 0xFF shall not be used. */ + return -1; + } + if ((b1 & 0x80) == 0) { + /* X.690-0207 8.1.3.4 short form length octets */ + return b1; + } + if (b1 == 0x80) { + /* Indefinite length is not allowed in DER. */ + return -1; + } + /* X.690-207 8.1.3.5 long form length octets */ + lenleft = b1 & 0x7F; + if (lenleft > sigend - *sigp) { + return -1; + } + if (**sigp == 0) { + /* Not the shortest possible length encoding. */ + return -1; + } + if ((size_t)lenleft > sizeof(size_t)) { + /* The resulting length would exceed the range of a size_t, so + * certainly longer than the passed array size. + */ + return -1; + } + while (lenleft > 0) { + ret = (ret << 8) | **sigp; + if (ret + lenleft > (size_t)(sigend - *sigp)) { + /* Result exceeds the length of the passed array. */ + return -1; + } + (*sigp)++; + lenleft--; + } + if (ret < 128) { + /* Not the shortest possible length encoding. */ + return -1; + } + return ret; +} - /* libscott had to add this to get this version of the library to read compact sigs */ +static int secp256k1_der_parse_integer(secp256k1_scalar *r, const unsigned char **sig, const unsigned char *sigend) { int overflow = 0; - if (size == 64) { - secp256k1_scalar_set_b32(&r->r, sig, &overflow); - secp256k1_scalar_set_b32(&r->s, sig+32, &overflow); - return 1; - } + unsigned char ra[32] = {0}; + int rlen; - unsigned char ra[32] = {0}, sa[32] = {0}; - const unsigned char *rp; - const unsigned char *sp; - int lenr; - int lens; - if (sig[0] != 0x30) { + if (*sig == sigend || **sig != 0x02) { + /* Not a primitive integer (X.690-0207 8.3.1). */ return 0; } - lenr = sig[3]; - if (5+lenr >= size) { + (*sig)++; + rlen = secp256k1_der_read_len(sig, sigend); + if (rlen <= 0 || (*sig) + rlen > sigend) { + /* Exceeds bounds or not at least length 1 (X.690-0207 8.3.1). */ return 0; } - lens = sig[lenr+5]; - if (sig[1] != lenr+lens+4) { + if (**sig == 0x00 && rlen > 1 && (((*sig)[1]) & 0x80) == 0x00) { + /* Excessive 0x00 padding. */ return 0; } - if (lenr+lens+6 > size) { + if (**sig == 0xFF && rlen > 1 && (((*sig)[1]) & 0x80) == 0x80) { + /* Excessive 0xFF padding. */ return 0; } - if (sig[2] != 0x02) { - return 0; + if ((**sig & 0x80) == 0x80) { + /* Negative. */ + overflow = 1; } - if (lenr == 0) { - return 0; + while (rlen > 0 && **sig == 0) { + /* Skip leading zero bytes */ + rlen--; + (*sig)++; } - if (sig[lenr+4] != 0x02) { - return 0; + if (rlen > 32) { + overflow = 1; } - if (lens == 0) { - return 0; + if (!overflow) { + memcpy(ra + 32 - rlen, *sig, rlen); + secp256k1_scalar_set_b32(r, ra, &overflow); } - sp = sig + 6 + lenr; - while (lens > 0 && sp[0] == 0) { - lens--; - sp++; - } - if (lens > 32) { - return 0; - } - rp = sig + 4; - while (lenr > 0 && rp[0] == 0) { - lenr--; - rp++; - } - if (lenr > 32) { - return 0; - } - memcpy(ra + 32 - lenr, rp, lenr); - memcpy(sa + 32 - lens, sp, lens); - overflow = 0; - secp256k1_scalar_set_b32(&r->r, ra, &overflow); if (overflow) { - return 0; - } - secp256k1_scalar_set_b32(&r->s, sa, &overflow); - if (overflow) { - return 0; + secp256k1_scalar_set_int(r, 0); } + (*sig) += rlen; return 1; } -static int secp256k1_ecdsa_sig_serialize(unsigned char *sig, int *size, const secp256k1_ecdsa_sig_t *a) { +static int secp256k1_ecdsa_sig_parse(secp256k1_scalar *rr, secp256k1_scalar *rs, const unsigned char *sig, size_t size) { + const unsigned char *sigend = sig + size; + int rlen; + if (sig == sigend || *(sig++) != 0x30) { + /* The encoding doesn't start with a constructed sequence (X.690-0207 8.9.1). */ + return 0; + } + rlen = secp256k1_der_read_len(&sig, sigend); + if (rlen < 0 || sig + rlen > sigend) { + /* Tuple exceeds bounds */ + return 0; + } + if (sig + rlen != sigend) { + /* Garbage after tuple. */ + return 0; + } + + if (!secp256k1_der_parse_integer(rr, &sig, sigend)) { + return 0; + } + if (!secp256k1_der_parse_integer(rs, &sig, sigend)) { + return 0; + } + + if (sig != sigend) { + /* Trailing garbage inside tuple. */ + return 0; + } + + return 1; +} + +static int secp256k1_ecdsa_sig_serialize(unsigned char *sig, size_t *size, const secp256k1_scalar* ar, const secp256k1_scalar* as) { unsigned char r[33] = {0}, s[33] = {0}; unsigned char *rp = r, *sp = s; - int lenR = 33, lenS = 33; - secp256k1_scalar_get_b32(&r[1], &a->r); - secp256k1_scalar_get_b32(&s[1], &a->s); + size_t lenR = 33, lenS = 33; + secp256k1_scalar_get_b32(&r[1], ar); + secp256k1_scalar_get_b32(&s[1], as); while (lenR > 1 && rp[0] == 0 && rp[1] < 0x80) { lenR--; rp++; } while (lenS > 1 && sp[0] == 0 && sp[1] < 0x80) { lenS--; sp++; } if (*size < 6+lenS+lenR) { + *size = 6 + lenS + lenR; return 0; } *size = 6 + lenS + lenR; @@ -140,26 +198,41 @@ static int secp256k1_ecdsa_sig_serialize(unsigned char *sig, int *size, const se return 1; } -static int secp256k1_ecdsa_sig_verify(const secp256k1_ecmult_context_t *ctx, const secp256k1_ecdsa_sig_t *sig, const secp256k1_ge_t *pubkey, const secp256k1_scalar_t *message) { +static int secp256k1_ecdsa_sig_verify(const secp256k1_ecmult_context *ctx, const secp256k1_scalar *sigr, const secp256k1_scalar *sigs, const secp256k1_ge *pubkey, const secp256k1_scalar *message) { unsigned char c[32]; - secp256k1_scalar_t sn, u1, u2; - secp256k1_fe_t xr; - secp256k1_gej_t pubkeyj; - secp256k1_gej_t pr; + secp256k1_scalar sn, u1, u2; +#if !defined(EXHAUSTIVE_TEST_ORDER) + secp256k1_fe xr; +#endif + secp256k1_gej pubkeyj; + secp256k1_gej pr; - if (secp256k1_scalar_is_zero(&sig->r) || secp256k1_scalar_is_zero(&sig->s)) { + if (secp256k1_scalar_is_zero(sigr) || secp256k1_scalar_is_zero(sigs)) { return 0; } - secp256k1_scalar_inverse_var(&sn, &sig->s); + secp256k1_scalar_inverse_var(&sn, sigs); secp256k1_scalar_mul(&u1, &sn, message); - secp256k1_scalar_mul(&u2, &sn, &sig->r); + secp256k1_scalar_mul(&u2, &sn, sigr); secp256k1_gej_set_ge(&pubkeyj, pubkey); secp256k1_ecmult(ctx, &pr, &pubkeyj, &u2, &u1); if (secp256k1_gej_is_infinity(&pr)) { return 0; } - secp256k1_scalar_get_b32(c, &sig->r); + +#if defined(EXHAUSTIVE_TEST_ORDER) +{ + secp256k1_scalar computed_r; + secp256k1_ge pr_ge; + secp256k1_ge_set_gej(&pr_ge, &pr); + secp256k1_fe_normalize(&pr_ge.x); + + secp256k1_fe_get_b32(c, &pr_ge.x); + secp256k1_scalar_set_b32(&computed_r, c, NULL); + return secp256k1_scalar_eq(sigr, &computed_r); +} +#else + secp256k1_scalar_get_b32(c, sigr); secp256k1_fe_set_b32(&xr, c); /** We now have the recomputed R point in pr, and its claimed x coordinate (modulo n) @@ -179,11 +252,11 @@ static int secp256k1_ecdsa_sig_verify(const secp256k1_ecmult_context_t *ctx, con * secp256k1_gej_eq_x implements the (xr * pr.z^2 mod p == pr.x) test. */ if (secp256k1_gej_eq_x_var(&xr, &pr)) { - /* xr.x == xr * xr.z^2 mod p, so the signature is valid. */ + /* xr * pr.z^2 mod p == pr.x, so the signature is valid. */ return 1; } if (secp256k1_fe_cmp_var(&xr, &secp256k1_ecdsa_const_p_minus_order) >= 0) { - /* xr + p >= n, so we can skip testing the second case. */ + /* xr + n >= p, so we can skip testing the second case. */ return 0; } secp256k1_fe_add(&xr, &secp256k1_ecdsa_const_order_as_fe); @@ -192,46 +265,14 @@ static int secp256k1_ecdsa_sig_verify(const secp256k1_ecmult_context_t *ctx, con return 1; } return 0; +#endif } -static int secp256k1_ecdsa_sig_recover(const secp256k1_ecmult_context_t *ctx, const secp256k1_ecdsa_sig_t *sig, secp256k1_ge_t *pubkey, const secp256k1_scalar_t *message, int recid) { - unsigned char brx[32]; - secp256k1_fe_t fx; - secp256k1_ge_t x; - secp256k1_gej_t xj; - secp256k1_scalar_t rn, u1, u2; - secp256k1_gej_t qj; - - if (secp256k1_scalar_is_zero(&sig->r) || secp256k1_scalar_is_zero(&sig->s)) { - return 0; - } - - secp256k1_scalar_get_b32(brx, &sig->r); - VERIFY_CHECK(secp256k1_fe_set_b32(&fx, brx)); /* brx comes from a scalar, so is less than the order; certainly less than p */ - if (recid & 2) { - if (secp256k1_fe_cmp_var(&fx, &secp256k1_ecdsa_const_p_minus_order) >= 0) { - return 0; - } - secp256k1_fe_add(&fx, &secp256k1_ecdsa_const_order_as_fe); - } - if (!secp256k1_ge_set_xo_var(&x, &fx, recid & 1)) { - return 0; - } - secp256k1_gej_set_ge(&xj, &x); - secp256k1_scalar_inverse_var(&rn, &sig->r); - secp256k1_scalar_mul(&u1, &rn, message); - secp256k1_scalar_negate(&u1, &u1); - secp256k1_scalar_mul(&u2, &rn, &sig->s); - secp256k1_ecmult(ctx, &qj, &xj, &u2, &u1); - secp256k1_ge_set_gej_var(pubkey, &qj); - return !secp256k1_gej_is_infinity(&qj); -} - -static int secp256k1_ecdsa_sig_sign(const secp256k1_ecmult_gen_context_t *ctx, secp256k1_ecdsa_sig_t *sig, const secp256k1_scalar_t *seckey, const secp256k1_scalar_t *message, const secp256k1_scalar_t *nonce, int *recid) { +static int secp256k1_ecdsa_sig_sign(const secp256k1_ecmult_gen_context *ctx, secp256k1_scalar *sigr, secp256k1_scalar *sigs, const secp256k1_scalar *seckey, const secp256k1_scalar *message, const secp256k1_scalar *nonce, int *recid) { unsigned char b[32]; - secp256k1_gej_t rp; - secp256k1_ge_t r; - secp256k1_scalar_t n; + secp256k1_gej rp; + secp256k1_ge r; + secp256k1_scalar n; int overflow = 0; secp256k1_ecmult_gen(ctx, &rp, nonce); @@ -239,28 +280,29 @@ static int secp256k1_ecdsa_sig_sign(const secp256k1_ecmult_gen_context_t *ctx, s secp256k1_fe_normalize(&r.x); secp256k1_fe_normalize(&r.y); secp256k1_fe_get_b32(b, &r.x); - secp256k1_scalar_set_b32(&sig->r, b, &overflow); - if (secp256k1_scalar_is_zero(&sig->r)) { - /* P.x = order is on the curve, so technically sig->r could end up zero, which would be an invalid signature. */ - secp256k1_gej_clear(&rp); - secp256k1_ge_clear(&r); - return 0; - } + secp256k1_scalar_set_b32(sigr, b, &overflow); + /* These two conditions should be checked before calling */ + VERIFY_CHECK(!secp256k1_scalar_is_zero(sigr)); + VERIFY_CHECK(overflow == 0); + if (recid) { + /* The overflow condition is cryptographically unreachable as hitting it requires finding the discrete log + * of some P where P.x >= order, and only 1 in about 2^127 points meet this criteria. + */ *recid = (overflow ? 2 : 0) | (secp256k1_fe_is_odd(&r.y) ? 1 : 0); } - secp256k1_scalar_mul(&n, &sig->r, seckey); + secp256k1_scalar_mul(&n, sigr, seckey); secp256k1_scalar_add(&n, &n, message); - secp256k1_scalar_inverse(&sig->s, nonce); - secp256k1_scalar_mul(&sig->s, &sig->s, &n); + secp256k1_scalar_inverse(sigs, nonce); + secp256k1_scalar_mul(sigs, sigs, &n); secp256k1_scalar_clear(&n); secp256k1_gej_clear(&rp); secp256k1_ge_clear(&r); - if (secp256k1_scalar_is_zero(&sig->s)) { + if (secp256k1_scalar_is_zero(sigs)) { return 0; } - if (secp256k1_scalar_is_high(&sig->s)) { - secp256k1_scalar_negate(&sig->s, &sig->s); + if (secp256k1_scalar_is_high(sigs)) { + secp256k1_scalar_negate(sigs, sigs); if (recid) { *recid ^= 1; } @@ -268,4 +310,4 @@ static int secp256k1_ecdsa_sig_sign(const secp256k1_ecmult_gen_context_t *ctx, s return 1; } -#endif +#endif /* SECP256K1_ECDSA_IMPL_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/eckey.h b/src/cryptoconditions/src/include/secp256k1/src/eckey.h index 53b818485..b621f1e6c 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/eckey.h +++ b/src/cryptoconditions/src/include/secp256k1/src/eckey.h @@ -4,23 +4,22 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_ECKEY_ -#define _SECP256K1_ECKEY_ +#ifndef SECP256K1_ECKEY_H +#define SECP256K1_ECKEY_H + +#include #include "group.h" #include "scalar.h" #include "ecmult.h" #include "ecmult_gen.h" -static int secp256k1_eckey_pubkey_parse(secp256k1_ge_t *elem, const unsigned char *pub, int size); -static int secp256k1_eckey_pubkey_serialize(secp256k1_ge_t *elem, unsigned char *pub, int *size, int compressed); +static int secp256k1_eckey_pubkey_parse(secp256k1_ge *elem, const unsigned char *pub, size_t size); +static int secp256k1_eckey_pubkey_serialize(secp256k1_ge *elem, unsigned char *pub, size_t *size, int compressed); -static int secp256k1_eckey_privkey_parse(secp256k1_scalar_t *key, const unsigned char *privkey, int privkeylen); -static int secp256k1_eckey_privkey_serialize(const secp256k1_ecmult_gen_context_t *ctx, unsigned char *privkey, int *privkeylen, const secp256k1_scalar_t *key, int compressed); +static int secp256k1_eckey_privkey_tweak_add(secp256k1_scalar *key, const secp256k1_scalar *tweak); +static int secp256k1_eckey_pubkey_tweak_add(const secp256k1_ecmult_context *ctx, secp256k1_ge *key, const secp256k1_scalar *tweak); +static int secp256k1_eckey_privkey_tweak_mul(secp256k1_scalar *key, const secp256k1_scalar *tweak); +static int secp256k1_eckey_pubkey_tweak_mul(const secp256k1_ecmult_context *ctx, secp256k1_ge *key, const secp256k1_scalar *tweak); -static int secp256k1_eckey_privkey_tweak_add(secp256k1_scalar_t *key, const secp256k1_scalar_t *tweak); -static int secp256k1_eckey_pubkey_tweak_add(const secp256k1_ecmult_context_t *ctx, secp256k1_ge_t *key, const secp256k1_scalar_t *tweak); -static int secp256k1_eckey_privkey_tweak_mul(secp256k1_scalar_t *key, const secp256k1_scalar_t *tweak); -static int secp256k1_eckey_pubkey_tweak_mul(const secp256k1_ecmult_context_t *ctx, secp256k1_ge_t *key, const secp256k1_scalar_t *tweak); - -#endif +#endif /* SECP256K1_ECKEY_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/eckey_impl.h b/src/cryptoconditions/src/include/secp256k1/src/eckey_impl.h index a332bd34e..1ab9a68ec 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/eckey_impl.h +++ b/src/cryptoconditions/src/include/secp256k1/src/eckey_impl.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_ECKEY_IMPL_H_ -#define _SECP256K1_ECKEY_IMPL_H_ +#ifndef SECP256K1_ECKEY_IMPL_H +#define SECP256K1_ECKEY_IMPL_H #include "eckey.h" @@ -14,17 +14,18 @@ #include "group.h" #include "ecmult_gen.h" -static int secp256k1_eckey_pubkey_parse(secp256k1_ge_t *elem, const unsigned char *pub, int size) { - if (size == 33 && (pub[0] == 0x02 || pub[0] == 0x03)) { - secp256k1_fe_t x; - return secp256k1_fe_set_b32(&x, pub+1) && secp256k1_ge_set_xo_var(elem, &x, pub[0] == 0x03); +static int secp256k1_eckey_pubkey_parse(secp256k1_ge *elem, const unsigned char *pub, size_t size) { + if (size == 33 && (pub[0] == SECP256K1_TAG_PUBKEY_EVEN || pub[0] == SECP256K1_TAG_PUBKEY_ODD)) { + secp256k1_fe x; + return secp256k1_fe_set_b32(&x, pub+1) && secp256k1_ge_set_xo_var(elem, &x, pub[0] == SECP256K1_TAG_PUBKEY_ODD); } else if (size == 65 && (pub[0] == 0x04 || pub[0] == 0x06 || pub[0] == 0x07)) { - secp256k1_fe_t x, y; + secp256k1_fe x, y; if (!secp256k1_fe_set_b32(&x, pub+1) || !secp256k1_fe_set_b32(&y, pub+33)) { return 0; } secp256k1_ge_set_xy(elem, &x, &y); - if ((pub[0] == 0x06 || pub[0] == 0x07) && secp256k1_fe_is_odd(&y) != (pub[0] == 0x07)) { + if ((pub[0] == SECP256K1_TAG_PUBKEY_HYBRID_EVEN || pub[0] == SECP256K1_TAG_PUBKEY_HYBRID_ODD) && + secp256k1_fe_is_odd(&y) != (pub[0] == SECP256K1_TAG_PUBKEY_HYBRID_ODD)) { return 0; } return secp256k1_ge_is_valid_var(elem); @@ -33,7 +34,7 @@ static int secp256k1_eckey_pubkey_parse(secp256k1_ge_t *elem, const unsigned cha } } -static int secp256k1_eckey_pubkey_serialize(secp256k1_ge_t *elem, unsigned char *pub, int *size, int compressed) { +static int secp256k1_eckey_pubkey_serialize(secp256k1_ge *elem, unsigned char *pub, size_t *size, int compressed) { if (secp256k1_ge_is_infinity(elem)) { return 0; } @@ -42,119 +43,16 @@ static int secp256k1_eckey_pubkey_serialize(secp256k1_ge_t *elem, unsigned char secp256k1_fe_get_b32(&pub[1], &elem->x); if (compressed) { *size = 33; - pub[0] = 0x02 | (secp256k1_fe_is_odd(&elem->y) ? 0x01 : 0x00); + pub[0] = secp256k1_fe_is_odd(&elem->y) ? SECP256K1_TAG_PUBKEY_ODD : SECP256K1_TAG_PUBKEY_EVEN; } else { *size = 65; - pub[0] = 0x04; + pub[0] = SECP256K1_TAG_PUBKEY_UNCOMPRESSED; secp256k1_fe_get_b32(&pub[33], &elem->y); } return 1; } -static int secp256k1_eckey_privkey_parse(secp256k1_scalar_t *key, const unsigned char *privkey, int privkeylen) { - unsigned char c[32] = {0}; - const unsigned char *end = privkey + privkeylen; - int lenb = 0; - int len = 0; - int overflow = 0; - /* sequence header */ - if (end < privkey+1 || *privkey != 0x30) { - return 0; - } - privkey++; - /* sequence length constructor */ - if (end < privkey+1 || !(*privkey & 0x80)) { - return 0; - } - lenb = *privkey & ~0x80; privkey++; - if (lenb < 1 || lenb > 2) { - return 0; - } - if (end < privkey+lenb) { - return 0; - } - /* sequence length */ - len = privkey[lenb-1] | (lenb > 1 ? privkey[lenb-2] << 8 : 0); - privkey += lenb; - if (end < privkey+len) { - return 0; - } - /* sequence element 0: version number (=1) */ - if (end < privkey+3 || privkey[0] != 0x02 || privkey[1] != 0x01 || privkey[2] != 0x01) { - return 0; - } - privkey += 3; - /* sequence element 1: octet string, up to 32 bytes */ - if (end < privkey+2 || privkey[0] != 0x04 || privkey[1] > 0x20 || end < privkey+2+privkey[1]) { - return 0; - } - memcpy(c + 32 - privkey[1], privkey + 2, privkey[1]); - secp256k1_scalar_set_b32(key, c, &overflow); - memset(c, 0, 32); - return !overflow; -} - -static int secp256k1_eckey_privkey_serialize(const secp256k1_ecmult_gen_context_t *ctx, unsigned char *privkey, int *privkeylen, const secp256k1_scalar_t *key, int compressed) { - secp256k1_gej_t rp; - secp256k1_ge_t r; - int pubkeylen = 0; - secp256k1_ecmult_gen(ctx, &rp, key); - secp256k1_ge_set_gej(&r, &rp); - if (compressed) { - static const unsigned char begin[] = { - 0x30,0x81,0xD3,0x02,0x01,0x01,0x04,0x20 - }; - static const unsigned char middle[] = { - 0xA0,0x81,0x85,0x30,0x81,0x82,0x02,0x01,0x01,0x30,0x2C,0x06,0x07,0x2A,0x86,0x48, - 0xCE,0x3D,0x01,0x01,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F,0x30,0x06,0x04,0x01,0x00,0x04,0x01,0x07,0x04, - 0x21,0x02,0x79,0xBE,0x66,0x7E,0xF9,0xDC,0xBB,0xAC,0x55,0xA0,0x62,0x95,0xCE,0x87, - 0x0B,0x07,0x02,0x9B,0xFC,0xDB,0x2D,0xCE,0x28,0xD9,0x59,0xF2,0x81,0x5B,0x16,0xF8, - 0x17,0x98,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFE,0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,0xBF,0xD2,0x5E, - 0x8C,0xD0,0x36,0x41,0x41,0x02,0x01,0x01,0xA1,0x24,0x03,0x22,0x00 - }; - unsigned char *ptr = privkey; - memcpy(ptr, begin, sizeof(begin)); ptr += sizeof(begin); - secp256k1_scalar_get_b32(ptr, key); ptr += 32; - memcpy(ptr, middle, sizeof(middle)); ptr += sizeof(middle); - if (!secp256k1_eckey_pubkey_serialize(&r, ptr, &pubkeylen, 1)) { - return 0; - } - ptr += pubkeylen; - *privkeylen = ptr - privkey; - } else { - static const unsigned char begin[] = { - 0x30,0x82,0x01,0x13,0x02,0x01,0x01,0x04,0x20 - }; - static const unsigned char middle[] = { - 0xA0,0x81,0xA5,0x30,0x81,0xA2,0x02,0x01,0x01,0x30,0x2C,0x06,0x07,0x2A,0x86,0x48, - 0xCE,0x3D,0x01,0x01,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F,0x30,0x06,0x04,0x01,0x00,0x04,0x01,0x07,0x04, - 0x41,0x04,0x79,0xBE,0x66,0x7E,0xF9,0xDC,0xBB,0xAC,0x55,0xA0,0x62,0x95,0xCE,0x87, - 0x0B,0x07,0x02,0x9B,0xFC,0xDB,0x2D,0xCE,0x28,0xD9,0x59,0xF2,0x81,0x5B,0x16,0xF8, - 0x17,0x98,0x48,0x3A,0xDA,0x77,0x26,0xA3,0xC4,0x65,0x5D,0xA4,0xFB,0xFC,0x0E,0x11, - 0x08,0xA8,0xFD,0x17,0xB4,0x48,0xA6,0x85,0x54,0x19,0x9C,0x47,0xD0,0x8F,0xFB,0x10, - 0xD4,0xB8,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFE,0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,0xBF,0xD2,0x5E, - 0x8C,0xD0,0x36,0x41,0x41,0x02,0x01,0x01,0xA1,0x44,0x03,0x42,0x00 - }; - unsigned char *ptr = privkey; - memcpy(ptr, begin, sizeof(begin)); ptr += sizeof(begin); - secp256k1_scalar_get_b32(ptr, key); ptr += 32; - memcpy(ptr, middle, sizeof(middle)); ptr += sizeof(middle); - if (!secp256k1_eckey_pubkey_serialize(&r, ptr, &pubkeylen, 0)) { - return 0; - } - ptr += pubkeylen; - *privkeylen = ptr - privkey; - } - return 1; -} - -static int secp256k1_eckey_privkey_tweak_add(secp256k1_scalar_t *key, const secp256k1_scalar_t *tweak) { +static int secp256k1_eckey_privkey_tweak_add(secp256k1_scalar *key, const secp256k1_scalar *tweak) { secp256k1_scalar_add(key, key, tweak); if (secp256k1_scalar_is_zero(key)) { return 0; @@ -162,9 +60,9 @@ static int secp256k1_eckey_privkey_tweak_add(secp256k1_scalar_t *key, const secp return 1; } -static int secp256k1_eckey_pubkey_tweak_add(const secp256k1_ecmult_context_t *ctx, secp256k1_ge_t *key, const secp256k1_scalar_t *tweak) { - secp256k1_gej_t pt; - secp256k1_scalar_t one; +static int secp256k1_eckey_pubkey_tweak_add(const secp256k1_ecmult_context *ctx, secp256k1_ge *key, const secp256k1_scalar *tweak) { + secp256k1_gej pt; + secp256k1_scalar one; secp256k1_gej_set_ge(&pt, key); secp256k1_scalar_set_int(&one, 1); secp256k1_ecmult(ctx, &pt, &pt, &one, tweak); @@ -176,7 +74,7 @@ static int secp256k1_eckey_pubkey_tweak_add(const secp256k1_ecmult_context_t *ct return 1; } -static int secp256k1_eckey_privkey_tweak_mul(secp256k1_scalar_t *key, const secp256k1_scalar_t *tweak) { +static int secp256k1_eckey_privkey_tweak_mul(secp256k1_scalar *key, const secp256k1_scalar *tweak) { if (secp256k1_scalar_is_zero(tweak)) { return 0; } @@ -185,9 +83,9 @@ static int secp256k1_eckey_privkey_tweak_mul(secp256k1_scalar_t *key, const secp return 1; } -static int secp256k1_eckey_pubkey_tweak_mul(const secp256k1_ecmult_context_t *ctx, secp256k1_ge_t *key, const secp256k1_scalar_t *tweak) { - secp256k1_scalar_t zero; - secp256k1_gej_t pt; +static int secp256k1_eckey_pubkey_tweak_mul(const secp256k1_ecmult_context *ctx, secp256k1_ge *key, const secp256k1_scalar *tweak) { + secp256k1_scalar zero; + secp256k1_gej pt; if (secp256k1_scalar_is_zero(tweak)) { return 0; } @@ -199,4 +97,4 @@ static int secp256k1_eckey_pubkey_tweak_mul(const secp256k1_ecmult_context_t *ct return 1; } -#endif +#endif /* SECP256K1_ECKEY_IMPL_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/ecmult.h b/src/cryptoconditions/src/include/secp256k1/src/ecmult.h index bab9e4ef5..6d44aba60 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/ecmult.h +++ b/src/cryptoconditions/src/include/secp256k1/src/ecmult.h @@ -4,28 +4,28 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_ECMULT_ -#define _SECP256K1_ECMULT_ +#ifndef SECP256K1_ECMULT_H +#define SECP256K1_ECMULT_H #include "num.h" #include "group.h" typedef struct { /* For accelerating the computation of a*P + b*G: */ - secp256k1_ge_storage_t (*pre_g)[]; /* odd multiples of the generator */ + secp256k1_ge_storage (*pre_g)[]; /* odd multiples of the generator */ #ifdef USE_ENDOMORPHISM - secp256k1_ge_storage_t (*pre_g_128)[]; /* odd multiples of 2^128*generator */ + secp256k1_ge_storage (*pre_g_128)[]; /* odd multiples of 2^128*generator */ #endif -} secp256k1_ecmult_context_t; +} secp256k1_ecmult_context; -static void secp256k1_ecmult_context_init(secp256k1_ecmult_context_t *ctx); -static void secp256k1_ecmult_context_build(secp256k1_ecmult_context_t *ctx); -static void secp256k1_ecmult_context_clone(secp256k1_ecmult_context_t *dst, - const secp256k1_ecmult_context_t *src); -static void secp256k1_ecmult_context_clear(secp256k1_ecmult_context_t *ctx); -static int secp256k1_ecmult_context_is_built(const secp256k1_ecmult_context_t *ctx); +static void secp256k1_ecmult_context_init(secp256k1_ecmult_context *ctx); +static void secp256k1_ecmult_context_build(secp256k1_ecmult_context *ctx, const secp256k1_callback *cb); +static void secp256k1_ecmult_context_clone(secp256k1_ecmult_context *dst, + const secp256k1_ecmult_context *src, const secp256k1_callback *cb); +static void secp256k1_ecmult_context_clear(secp256k1_ecmult_context *ctx); +static int secp256k1_ecmult_context_is_built(const secp256k1_ecmult_context *ctx); /** Double multiply: R = na*A + ng*G */ -static void secp256k1_ecmult(const secp256k1_ecmult_context_t *ctx, secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_scalar_t *na, const secp256k1_scalar_t *ng); +static void secp256k1_ecmult(const secp256k1_ecmult_context *ctx, secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_scalar *na, const secp256k1_scalar *ng); -#endif +#endif /* SECP256K1_ECMULT_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/ecmult_const.h b/src/cryptoconditions/src/include/secp256k1/src/ecmult_const.h new file mode 100644 index 000000000..72bf7d758 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/ecmult_const.h @@ -0,0 +1,15 @@ +/********************************************************************** + * Copyright (c) 2015 Andrew Poelstra * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_ECMULT_CONST_H +#define SECP256K1_ECMULT_CONST_H + +#include "scalar.h" +#include "group.h" + +static void secp256k1_ecmult_const(secp256k1_gej *r, const secp256k1_ge *a, const secp256k1_scalar *q); + +#endif /* SECP256K1_ECMULT_CONST_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/ecmult_const_impl.h b/src/cryptoconditions/src/include/secp256k1/src/ecmult_const_impl.h new file mode 100644 index 000000000..7d7a172b7 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/ecmult_const_impl.h @@ -0,0 +1,240 @@ +/********************************************************************** + * Copyright (c) 2015 Pieter Wuille, Andrew Poelstra * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_ECMULT_CONST_IMPL_H +#define SECP256K1_ECMULT_CONST_IMPL_H + +#include "scalar.h" +#include "group.h" +#include "ecmult_const.h" +#include "ecmult_impl.h" + +#ifdef USE_ENDOMORPHISM + #define WNAF_BITS 128 +#else + #define WNAF_BITS 256 +#endif +#define WNAF_SIZE(w) ((WNAF_BITS + (w) - 1) / (w)) + +/* This is like `ECMULT_TABLE_GET_GE` but is constant time */ +#define ECMULT_CONST_TABLE_GET_GE(r,pre,n,w) do { \ + int m; \ + int abs_n = (n) * (((n) > 0) * 2 - 1); \ + int idx_n = abs_n / 2; \ + secp256k1_fe neg_y; \ + VERIFY_CHECK(((n) & 1) == 1); \ + VERIFY_CHECK((n) >= -((1 << ((w)-1)) - 1)); \ + VERIFY_CHECK((n) <= ((1 << ((w)-1)) - 1)); \ + VERIFY_SETUP(secp256k1_fe_clear(&(r)->x)); \ + VERIFY_SETUP(secp256k1_fe_clear(&(r)->y)); \ + for (m = 0; m < ECMULT_TABLE_SIZE(w); m++) { \ + /* This loop is used to avoid secret data in array indices. See + * the comment in ecmult_gen_impl.h for rationale. */ \ + secp256k1_fe_cmov(&(r)->x, &(pre)[m].x, m == idx_n); \ + secp256k1_fe_cmov(&(r)->y, &(pre)[m].y, m == idx_n); \ + } \ + (r)->infinity = 0; \ + secp256k1_fe_negate(&neg_y, &(r)->y, 1); \ + secp256k1_fe_cmov(&(r)->y, &neg_y, (n) != abs_n); \ +} while(0) + + +/** Convert a number to WNAF notation. + * The number becomes represented by sum(2^{wi} * wnaf[i], i=0..WNAF_SIZE(w)+1) - return_val. + * It has the following guarantees: + * - each wnaf[i] an odd integer between -(1 << w) and (1 << w) + * - each wnaf[i] is nonzero + * - the number of words set is always WNAF_SIZE(w) + 1 + * + * Adapted from `The Width-w NAF Method Provides Small Memory and Fast Elliptic Scalar + * Multiplications Secure against Side Channel Attacks`, Okeya and Tagaki. M. Joye (Ed.) + * CT-RSA 2003, LNCS 2612, pp. 328-443, 2003. Springer-Verlagy Berlin Heidelberg 2003 + * + * Numbers reference steps of `Algorithm SPA-resistant Width-w NAF with Odd Scalar` on pp. 335 + */ +static int secp256k1_wnaf_const(int *wnaf, secp256k1_scalar s, int w) { + int global_sign; + int skew = 0; + int word = 0; + + /* 1 2 3 */ + int u_last; + int u; + + int flip; + int bit; + secp256k1_scalar neg_s; + int not_neg_one; + /* Note that we cannot handle even numbers by negating them to be odd, as is + * done in other implementations, since if our scalars were specified to have + * width < 256 for performance reasons, their negations would have width 256 + * and we'd lose any performance benefit. Instead, we use a technique from + * Section 4.2 of the Okeya/Tagaki paper, which is to add either 1 (for even) + * or 2 (for odd) to the number we are encoding, returning a skew value indicating + * this, and having the caller compensate after doing the multiplication. */ + + /* Negative numbers will be negated to keep their bit representation below the maximum width */ + flip = secp256k1_scalar_is_high(&s); + /* We add 1 to even numbers, 2 to odd ones, noting that negation flips parity */ + bit = flip ^ !secp256k1_scalar_is_even(&s); + /* We check for negative one, since adding 2 to it will cause an overflow */ + secp256k1_scalar_negate(&neg_s, &s); + not_neg_one = !secp256k1_scalar_is_one(&neg_s); + secp256k1_scalar_cadd_bit(&s, bit, not_neg_one); + /* If we had negative one, flip == 1, s.d[0] == 0, bit == 1, so caller expects + * that we added two to it and flipped it. In fact for -1 these operations are + * identical. We only flipped, but since skewing is required (in the sense that + * the skew must be 1 or 2, never zero) and flipping is not, we need to change + * our flags to claim that we only skewed. */ + global_sign = secp256k1_scalar_cond_negate(&s, flip); + global_sign *= not_neg_one * 2 - 1; + skew = 1 << bit; + + /* 4 */ + u_last = secp256k1_scalar_shr_int(&s, w); + while (word * w < WNAF_BITS) { + int sign; + int even; + + /* 4.1 4.4 */ + u = secp256k1_scalar_shr_int(&s, w); + /* 4.2 */ + even = ((u & 1) == 0); + sign = 2 * (u_last > 0) - 1; + u += sign * even; + u_last -= sign * even * (1 << w); + + /* 4.3, adapted for global sign change */ + wnaf[word++] = u_last * global_sign; + + u_last = u; + } + wnaf[word] = u * global_sign; + + VERIFY_CHECK(secp256k1_scalar_is_zero(&s)); + VERIFY_CHECK(word == WNAF_SIZE(w)); + return skew; +} + + +static void secp256k1_ecmult_const(secp256k1_gej *r, const secp256k1_ge *a, const secp256k1_scalar *scalar) { + secp256k1_ge pre_a[ECMULT_TABLE_SIZE(WINDOW_A)]; + secp256k1_ge tmpa; + secp256k1_fe Z; + + int skew_1; + int wnaf_1[1 + WNAF_SIZE(WINDOW_A - 1)]; +#ifdef USE_ENDOMORPHISM + secp256k1_ge pre_a_lam[ECMULT_TABLE_SIZE(WINDOW_A)]; + int wnaf_lam[1 + WNAF_SIZE(WINDOW_A - 1)]; + int skew_lam; + secp256k1_scalar q_1, q_lam; +#endif + + int i; + secp256k1_scalar sc = *scalar; + + /* build wnaf representation for q. */ +#ifdef USE_ENDOMORPHISM + /* split q into q_1 and q_lam (where q = q_1 + q_lam*lambda, and q_1 and q_lam are ~128 bit) */ + secp256k1_scalar_split_lambda(&q_1, &q_lam, &sc); + skew_1 = secp256k1_wnaf_const(wnaf_1, q_1, WINDOW_A - 1); + skew_lam = secp256k1_wnaf_const(wnaf_lam, q_lam, WINDOW_A - 1); +#else + skew_1 = secp256k1_wnaf_const(wnaf_1, sc, WINDOW_A - 1); +#endif + + /* Calculate odd multiples of a. + * All multiples are brought to the same Z 'denominator', which is stored + * in Z. Due to secp256k1' isomorphism we can do all operations pretending + * that the Z coordinate was 1, use affine addition formulae, and correct + * the Z coordinate of the result once at the end. + */ + secp256k1_gej_set_ge(r, a); + secp256k1_ecmult_odd_multiples_table_globalz_windowa(pre_a, &Z, r); + for (i = 0; i < ECMULT_TABLE_SIZE(WINDOW_A); i++) { + secp256k1_fe_normalize_weak(&pre_a[i].y); + } +#ifdef USE_ENDOMORPHISM + for (i = 0; i < ECMULT_TABLE_SIZE(WINDOW_A); i++) { + secp256k1_ge_mul_lambda(&pre_a_lam[i], &pre_a[i]); + } +#endif + + /* first loop iteration (separated out so we can directly set r, rather + * than having it start at infinity, get doubled several times, then have + * its new value added to it) */ + i = wnaf_1[WNAF_SIZE(WINDOW_A - 1)]; + VERIFY_CHECK(i != 0); + ECMULT_CONST_TABLE_GET_GE(&tmpa, pre_a, i, WINDOW_A); + secp256k1_gej_set_ge(r, &tmpa); +#ifdef USE_ENDOMORPHISM + i = wnaf_lam[WNAF_SIZE(WINDOW_A - 1)]; + VERIFY_CHECK(i != 0); + ECMULT_CONST_TABLE_GET_GE(&tmpa, pre_a_lam, i, WINDOW_A); + secp256k1_gej_add_ge(r, r, &tmpa); +#endif + /* remaining loop iterations */ + for (i = WNAF_SIZE(WINDOW_A - 1) - 1; i >= 0; i--) { + int n; + int j; + for (j = 0; j < WINDOW_A - 1; ++j) { + secp256k1_gej_double_nonzero(r, r, NULL); + } + + n = wnaf_1[i]; + ECMULT_CONST_TABLE_GET_GE(&tmpa, pre_a, n, WINDOW_A); + VERIFY_CHECK(n != 0); + secp256k1_gej_add_ge(r, r, &tmpa); +#ifdef USE_ENDOMORPHISM + n = wnaf_lam[i]; + ECMULT_CONST_TABLE_GET_GE(&tmpa, pre_a_lam, n, WINDOW_A); + VERIFY_CHECK(n != 0); + secp256k1_gej_add_ge(r, r, &tmpa); +#endif + } + + secp256k1_fe_mul(&r->z, &r->z, &Z); + + { + /* Correct for wNAF skew */ + secp256k1_ge correction = *a; + secp256k1_ge_storage correction_1_stor; +#ifdef USE_ENDOMORPHISM + secp256k1_ge_storage correction_lam_stor; +#endif + secp256k1_ge_storage a2_stor; + secp256k1_gej tmpj; + secp256k1_gej_set_ge(&tmpj, &correction); + secp256k1_gej_double_var(&tmpj, &tmpj, NULL); + secp256k1_ge_set_gej(&correction, &tmpj); + secp256k1_ge_to_storage(&correction_1_stor, a); +#ifdef USE_ENDOMORPHISM + secp256k1_ge_to_storage(&correction_lam_stor, a); +#endif + secp256k1_ge_to_storage(&a2_stor, &correction); + + /* For odd numbers this is 2a (so replace it), for even ones a (so no-op) */ + secp256k1_ge_storage_cmov(&correction_1_stor, &a2_stor, skew_1 == 2); +#ifdef USE_ENDOMORPHISM + secp256k1_ge_storage_cmov(&correction_lam_stor, &a2_stor, skew_lam == 2); +#endif + + /* Apply the correction */ + secp256k1_ge_from_storage(&correction, &correction_1_stor); + secp256k1_ge_neg(&correction, &correction); + secp256k1_gej_add_ge(r, r, &correction); + +#ifdef USE_ENDOMORPHISM + secp256k1_ge_from_storage(&correction, &correction_lam_stor); + secp256k1_ge_neg(&correction, &correction); + secp256k1_ge_mul_lambda(&correction, &correction); + secp256k1_gej_add_ge(r, r, &correction); +#endif + } +} + +#endif /* SECP256K1_ECMULT_CONST_IMPL_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/ecmult_gen.h b/src/cryptoconditions/src/include/secp256k1/src/ecmult_gen.h index 3745633c4..7564b7015 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/ecmult_gen.h +++ b/src/cryptoconditions/src/include/secp256k1/src/ecmult_gen.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_ECMULT_GEN_ -#define _SECP256K1_ECMULT_GEN_ +#ifndef SECP256K1_ECMULT_GEN_H +#define SECP256K1_ECMULT_GEN_H #include "scalar.h" #include "group.h" @@ -23,21 +23,21 @@ typedef struct { * None of the resulting prec group elements have a known scalar, and neither do any of * the intermediate sums while computing a*G. */ - secp256k1_ge_storage_t (*prec)[64][16]; /* prec[j][i] = 16^j * i * G + U_i */ - secp256k1_scalar_t blind; - secp256k1_gej_t initial; -} secp256k1_ecmult_gen_context_t; + secp256k1_ge_storage (*prec)[64][16]; /* prec[j][i] = 16^j * i * G + U_i */ + secp256k1_scalar blind; + secp256k1_gej initial; +} secp256k1_ecmult_gen_context; -static void secp256k1_ecmult_gen_context_init(secp256k1_ecmult_gen_context_t* ctx); -static void secp256k1_ecmult_gen_context_build(secp256k1_ecmult_gen_context_t* ctx); -static void secp256k1_ecmult_gen_context_clone(secp256k1_ecmult_gen_context_t *dst, - const secp256k1_ecmult_gen_context_t* src); -static void secp256k1_ecmult_gen_context_clear(secp256k1_ecmult_gen_context_t* ctx); -static int secp256k1_ecmult_gen_context_is_built(const secp256k1_ecmult_gen_context_t* ctx); +static void secp256k1_ecmult_gen_context_init(secp256k1_ecmult_gen_context* ctx); +static void secp256k1_ecmult_gen_context_build(secp256k1_ecmult_gen_context* ctx, const secp256k1_callback* cb); +static void secp256k1_ecmult_gen_context_clone(secp256k1_ecmult_gen_context *dst, + const secp256k1_ecmult_gen_context* src, const secp256k1_callback* cb); +static void secp256k1_ecmult_gen_context_clear(secp256k1_ecmult_gen_context* ctx); +static int secp256k1_ecmult_gen_context_is_built(const secp256k1_ecmult_gen_context* ctx); /** Multiply with the generator: R = a*G */ -static void secp256k1_ecmult_gen(const secp256k1_ecmult_gen_context_t* ctx, secp256k1_gej_t *r, const secp256k1_scalar_t *a); +static void secp256k1_ecmult_gen(const secp256k1_ecmult_gen_context* ctx, secp256k1_gej *r, const secp256k1_scalar *a); -static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context_t *ctx, const unsigned char *seed32); +static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context *ctx, const unsigned char *seed32); -#endif +#endif /* SECP256K1_ECMULT_GEN_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/ecmult_gen_impl.h b/src/cryptoconditions/src/include/secp256k1/src/ecmult_gen_impl.h index 4697753ac..714f02e94 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/ecmult_gen_impl.h +++ b/src/cryptoconditions/src/include/secp256k1/src/ecmult_gen_impl.h @@ -4,29 +4,33 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_ECMULT_GEN_IMPL_H_ -#define _SECP256K1_ECMULT_GEN_IMPL_H_ +#ifndef SECP256K1_ECMULT_GEN_IMPL_H +#define SECP256K1_ECMULT_GEN_IMPL_H #include "scalar.h" #include "group.h" #include "ecmult_gen.h" #include "hash_impl.h" - -static void secp256k1_ecmult_gen_context_init(secp256k1_ecmult_gen_context_t *ctx) { +#ifdef USE_ECMULT_STATIC_PRECOMPUTATION +#include "ecmult_static_context.h" +#endif +static void secp256k1_ecmult_gen_context_init(secp256k1_ecmult_gen_context *ctx) { ctx->prec = NULL; } -static void secp256k1_ecmult_gen_context_build(secp256k1_ecmult_gen_context_t *ctx) { - secp256k1_ge_t prec[1024]; - secp256k1_gej_t gj; - secp256k1_gej_t nums_gej; +static void secp256k1_ecmult_gen_context_build(secp256k1_ecmult_gen_context *ctx, const secp256k1_callback* cb) { +#ifndef USE_ECMULT_STATIC_PRECOMPUTATION + secp256k1_ge prec[1024]; + secp256k1_gej gj; + secp256k1_gej nums_gej; int i, j; +#endif if (ctx->prec != NULL) { return; } - - ctx->prec = (secp256k1_ge_storage_t (*)[64][16])checked_malloc(sizeof(*ctx->prec)); +#ifndef USE_ECMULT_STATIC_PRECOMPUTATION + ctx->prec = (secp256k1_ge_storage (*)[64][16])checked_malloc(cb, sizeof(*ctx->prec)); /* get the generator */ secp256k1_gej_set_ge(&gj, &secp256k1_ge_const_g); @@ -34,77 +38,93 @@ static void secp256k1_ecmult_gen_context_build(secp256k1_ecmult_gen_context_t *c /* Construct a group element with no known corresponding scalar (nothing up my sleeve). */ { static const unsigned char nums_b32[33] = "The scalar for this x is unknown"; - secp256k1_fe_t nums_x; - secp256k1_ge_t nums_ge; - VERIFY_CHECK(secp256k1_fe_set_b32(&nums_x, nums_b32)); - VERIFY_CHECK(secp256k1_ge_set_xo_var(&nums_ge, &nums_x, 0)); + secp256k1_fe nums_x; + secp256k1_ge nums_ge; + int r; + r = secp256k1_fe_set_b32(&nums_x, nums_b32); + (void)r; + VERIFY_CHECK(r); + r = secp256k1_ge_set_xo_var(&nums_ge, &nums_x, 0); + (void)r; + VERIFY_CHECK(r); secp256k1_gej_set_ge(&nums_gej, &nums_ge); /* Add G to make the bits in x uniformly distributed. */ - secp256k1_gej_add_ge_var(&nums_gej, &nums_gej, &secp256k1_ge_const_g); + secp256k1_gej_add_ge_var(&nums_gej, &nums_gej, &secp256k1_ge_const_g, NULL); } /* compute prec. */ { - secp256k1_gej_t precj[1024]; /* Jacobian versions of prec. */ - secp256k1_gej_t gbase; - secp256k1_gej_t numsbase; + secp256k1_gej precj[1024]; /* Jacobian versions of prec. */ + secp256k1_gej gbase; + secp256k1_gej numsbase; gbase = gj; /* 16^j * G */ numsbase = nums_gej; /* 2^j * nums. */ for (j = 0; j < 64; j++) { /* Set precj[j*16 .. j*16+15] to (numsbase, numsbase + gbase, ..., numsbase + 15*gbase). */ precj[j*16] = numsbase; for (i = 1; i < 16; i++) { - secp256k1_gej_add_var(&precj[j*16 + i], &precj[j*16 + i - 1], &gbase); + secp256k1_gej_add_var(&precj[j*16 + i], &precj[j*16 + i - 1], &gbase, NULL); } /* Multiply gbase by 16. */ for (i = 0; i < 4; i++) { - secp256k1_gej_double_var(&gbase, &gbase); + secp256k1_gej_double_var(&gbase, &gbase, NULL); } /* Multiply numbase by 2. */ - secp256k1_gej_double_var(&numsbase, &numsbase); + secp256k1_gej_double_var(&numsbase, &numsbase, NULL); if (j == 62) { /* In the last iteration, numsbase is (1 - 2^j) * nums instead. */ secp256k1_gej_neg(&numsbase, &numsbase); - secp256k1_gej_add_var(&numsbase, &numsbase, &nums_gej); + secp256k1_gej_add_var(&numsbase, &numsbase, &nums_gej, NULL); } } - secp256k1_ge_set_all_gej_var(1024, prec, precj); + secp256k1_ge_set_all_gej_var(prec, precj, 1024, cb); } for (j = 0; j < 64; j++) { for (i = 0; i < 16; i++) { secp256k1_ge_to_storage(&(*ctx->prec)[j][i], &prec[j*16 + i]); } } +#else + (void)cb; + ctx->prec = (secp256k1_ge_storage (*)[64][16])secp256k1_ecmult_static_context; +#endif secp256k1_ecmult_gen_blind(ctx, NULL); } -static int secp256k1_ecmult_gen_context_is_built(const secp256k1_ecmult_gen_context_t* ctx) { +static int secp256k1_ecmult_gen_context_is_built(const secp256k1_ecmult_gen_context* ctx) { return ctx->prec != NULL; } -static void secp256k1_ecmult_gen_context_clone(secp256k1_ecmult_gen_context_t *dst, - const secp256k1_ecmult_gen_context_t *src) { +static void secp256k1_ecmult_gen_context_clone(secp256k1_ecmult_gen_context *dst, + const secp256k1_ecmult_gen_context *src, const secp256k1_callback* cb) { if (src->prec == NULL) { dst->prec = NULL; } else { - dst->prec = (secp256k1_ge_storage_t (*)[64][16])checked_malloc(sizeof(*dst->prec)); +#ifndef USE_ECMULT_STATIC_PRECOMPUTATION + dst->prec = (secp256k1_ge_storage (*)[64][16])checked_malloc(cb, sizeof(*dst->prec)); memcpy(dst->prec, src->prec, sizeof(*dst->prec)); +#else + (void)cb; + dst->prec = src->prec; +#endif dst->initial = src->initial; dst->blind = src->blind; } } -static void secp256k1_ecmult_gen_context_clear(secp256k1_ecmult_gen_context_t *ctx) { +static void secp256k1_ecmult_gen_context_clear(secp256k1_ecmult_gen_context *ctx) { +#ifndef USE_ECMULT_STATIC_PRECOMPUTATION free(ctx->prec); +#endif secp256k1_scalar_clear(&ctx->blind); secp256k1_gej_clear(&ctx->initial); ctx->prec = NULL; } -static void secp256k1_ecmult_gen(const secp256k1_ecmult_gen_context_t *ctx, secp256k1_gej_t *r, const secp256k1_scalar_t *gn) { - secp256k1_ge_t add; - secp256k1_ge_storage_t adds; - secp256k1_scalar_t gnb; +static void secp256k1_ecmult_gen(const secp256k1_ecmult_gen_context *ctx, secp256k1_gej *r, const secp256k1_scalar *gn) { + secp256k1_ge add; + secp256k1_ge_storage adds; + secp256k1_scalar gnb; int bits; int i, j; memset(&adds, 0, sizeof(adds)); @@ -136,14 +156,15 @@ static void secp256k1_ecmult_gen(const secp256k1_ecmult_gen_context_t *ctx, secp } /* Setup blinding values for secp256k1_ecmult_gen. */ -static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context_t *ctx, const unsigned char *seed32) { - secp256k1_scalar_t b; - secp256k1_gej_t gb; - secp256k1_fe_t s; +static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context *ctx, const unsigned char *seed32) { + secp256k1_scalar b; + secp256k1_gej gb; + secp256k1_fe s; unsigned char nonce32[32]; - secp256k1_rfc6979_hmac_sha256_t rng; + secp256k1_rfc6979_hmac_sha256 rng; int retry; - if (!seed32) { + unsigned char keydata[64] = {0}; + if (seed32 == NULL) { /* When seed is NULL, reset the initial point and blinding value. */ secp256k1_gej_set_ge(&ctx->initial, &secp256k1_ge_const_g); secp256k1_gej_neg(&ctx->initial, &ctx->initial); @@ -155,13 +176,18 @@ static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context_t *ctx, cons * and guards against weak or adversarial seeds. This is a simpler and safer interface than * asking the caller for blinding values directly and expecting them to retry on failure. */ - secp256k1_rfc6979_hmac_sha256_initialize(&rng, seed32 ? seed32 : nonce32, 32, nonce32, 32, NULL, 0); + memcpy(keydata, nonce32, 32); + if (seed32 != NULL) { + memcpy(keydata + 32, seed32, 32); + } + secp256k1_rfc6979_hmac_sha256_initialize(&rng, keydata, seed32 ? 64 : 32); + memset(keydata, 0, sizeof(keydata)); /* Retry for out of range results to achieve uniformity. */ do { secp256k1_rfc6979_hmac_sha256_generate(&rng, nonce32, 32); retry = !secp256k1_fe_set_b32(&s, nonce32); retry |= secp256k1_fe_is_zero(&s); - } while (retry); + } while (retry); /* This branch true is cryptographically unreachable. Requires sha256_hmac output > Fp. */ /* Randomize the projection to defend against multiplier sidechannels. */ secp256k1_gej_rescale(&ctx->initial, &s); secp256k1_fe_clear(&s); @@ -170,7 +196,7 @@ static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context_t *ctx, cons secp256k1_scalar_set_b32(&b, nonce32, &retry); /* A blinding value of 0 works, but would undermine the projection hardening. */ retry |= secp256k1_scalar_is_zero(&b); - } while (retry); + } while (retry); /* This branch true is cryptographically unreachable. Requires sha256_hmac output > order. */ secp256k1_rfc6979_hmac_sha256_finalize(&rng); memset(nonce32, 0, 32); secp256k1_ecmult_gen(ctx, &gb, &b); @@ -181,4 +207,4 @@ static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context_t *ctx, cons secp256k1_gej_clear(&gb); } -#endif +#endif /* SECP256K1_ECMULT_GEN_IMPL_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/ecmult_impl.h b/src/cryptoconditions/src/include/secp256k1/src/ecmult_impl.h index 1b2856f83..93d3794cb 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/ecmult_impl.h +++ b/src/cryptoconditions/src/include/secp256k1/src/ecmult_impl.h @@ -4,16 +4,32 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_ECMULT_IMPL_H_ -#define _SECP256K1_ECMULT_IMPL_H_ +#ifndef SECP256K1_ECMULT_IMPL_H +#define SECP256K1_ECMULT_IMPL_H + +#include #include "group.h" #include "scalar.h" #include "ecmult.h" +#if defined(EXHAUSTIVE_TEST_ORDER) +/* We need to lower these values for exhaustive tests because + * the tables cannot have infinities in them (this breaks the + * affine-isomorphism stuff which tracks z-ratios) */ +# if EXHAUSTIVE_TEST_ORDER > 128 +# define WINDOW_A 5 +# define WINDOW_G 8 +# elif EXHAUSTIVE_TEST_ORDER > 8 +# define WINDOW_A 4 +# define WINDOW_G 4 +# else +# define WINDOW_A 2 +# define WINDOW_G 2 +# endif +#else /* optimal for 128-bit and 256-bit exponents. */ #define WINDOW_A 5 - /** larger numbers may result in slightly better performance, at the cost of exponentially larger precomputed tables. */ #ifdef USE_ENDOMORPHISM @@ -23,63 +39,109 @@ /** One table for window size 16: 1.375 MiB. */ #define WINDOW_G 16 #endif - -/** Fill a table 'pre' with precomputed odd multiples of a. W determines the size of the table. - * pre will contains the values [1*a,3*a,5*a,...,(2^(w-1)-1)*a], so it needs place for - * 2^(w-2) entries. - * - * There are two versions of this function: - * - secp256k1_ecmult_precomp_wnaf_gej, which operates on group elements in jacobian notation, - * fast to precompute, but slower to use in later additions. - * - secp256k1_ecmult_precomp_wnaf_ge, which operates on group elements in affine notations, - * (much) slower to precompute, but a bit faster to use in later additions. - * To compute a*P + b*G, we use the jacobian version for P, and the affine version for G, as - * G is constant, so it only needs to be done once in advance. - */ -static void secp256k1_ecmult_table_precomp_gej_var(secp256k1_gej_t *pre, const secp256k1_gej_t *a, int w) { - secp256k1_gej_t d; - int i; - pre[0] = *a; - secp256k1_gej_double_var(&d, &pre[0]); - for (i = 1; i < (1 << (w-2)); i++) { - secp256k1_gej_add_var(&pre[i], &d, &pre[i-1]); - } -} - -static void secp256k1_ecmult_table_precomp_ge_storage_var(secp256k1_ge_storage_t *pre, const secp256k1_gej_t *a, int w) { - secp256k1_gej_t d; - int i; - const int table_size = 1 << (w-2); - secp256k1_gej_t *prej = (secp256k1_gej_t *)checked_malloc(sizeof(secp256k1_gej_t) * table_size); - secp256k1_ge_t *prea = (secp256k1_ge_t *)checked_malloc(sizeof(secp256k1_ge_t) * table_size); - prej[0] = *a; - secp256k1_gej_double_var(&d, a); - for (i = 1; i < table_size; i++) { - secp256k1_gej_add_var(&prej[i], &d, &prej[i-1]); - } - secp256k1_ge_set_all_gej_var(table_size, prea, prej); - for (i = 0; i < table_size; i++) { - secp256k1_ge_to_storage(&pre[i], &prea[i]); - } - free(prej); - free(prea); -} +#endif /** The number of entries a table with precomputed multiples needs to have. */ #define ECMULT_TABLE_SIZE(w) (1 << ((w)-2)) +/** Fill a table 'prej' with precomputed odd multiples of a. Prej will contain + * the values [1*a,3*a,...,(2*n-1)*a], so it space for n values. zr[0] will + * contain prej[0].z / a.z. The other zr[i] values = prej[i].z / prej[i-1].z. + * Prej's Z values are undefined, except for the last value. + */ +static void secp256k1_ecmult_odd_multiples_table(int n, secp256k1_gej *prej, secp256k1_fe *zr, const secp256k1_gej *a) { + secp256k1_gej d; + secp256k1_ge a_ge, d_ge; + int i; + + VERIFY_CHECK(!a->infinity); + + secp256k1_gej_double_var(&d, a, NULL); + + /* + * Perform the additions on an isomorphism where 'd' is affine: drop the z coordinate + * of 'd', and scale the 1P starting value's x/y coordinates without changing its z. + */ + d_ge.x = d.x; + d_ge.y = d.y; + d_ge.infinity = 0; + + secp256k1_ge_set_gej_zinv(&a_ge, a, &d.z); + prej[0].x = a_ge.x; + prej[0].y = a_ge.y; + prej[0].z = a->z; + prej[0].infinity = 0; + + zr[0] = d.z; + for (i = 1; i < n; i++) { + secp256k1_gej_add_ge_var(&prej[i], &prej[i-1], &d_ge, &zr[i]); + } + + /* + * Each point in 'prej' has a z coordinate too small by a factor of 'd.z'. Only + * the final point's z coordinate is actually used though, so just update that. + */ + secp256k1_fe_mul(&prej[n-1].z, &prej[n-1].z, &d.z); +} + +/** Fill a table 'pre' with precomputed odd multiples of a. + * + * There are two versions of this function: + * - secp256k1_ecmult_odd_multiples_table_globalz_windowa which brings its + * resulting point set to a single constant Z denominator, stores the X and Y + * coordinates as ge_storage points in pre, and stores the global Z in rz. + * It only operates on tables sized for WINDOW_A wnaf multiples. + * - secp256k1_ecmult_odd_multiples_table_storage_var, which converts its + * resulting point set to actually affine points, and stores those in pre. + * It operates on tables of any size, but uses heap-allocated temporaries. + * + * To compute a*P + b*G, we compute a table for P using the first function, + * and for G using the second (which requires an inverse, but it only needs to + * happen once). + */ +static void secp256k1_ecmult_odd_multiples_table_globalz_windowa(secp256k1_ge *pre, secp256k1_fe *globalz, const secp256k1_gej *a) { + secp256k1_gej prej[ECMULT_TABLE_SIZE(WINDOW_A)]; + secp256k1_fe zr[ECMULT_TABLE_SIZE(WINDOW_A)]; + + /* Compute the odd multiples in Jacobian form. */ + secp256k1_ecmult_odd_multiples_table(ECMULT_TABLE_SIZE(WINDOW_A), prej, zr, a); + /* Bring them to the same Z denominator. */ + secp256k1_ge_globalz_set_table_gej(ECMULT_TABLE_SIZE(WINDOW_A), pre, globalz, prej, zr); +} + +static void secp256k1_ecmult_odd_multiples_table_storage_var(int n, secp256k1_ge_storage *pre, const secp256k1_gej *a, const secp256k1_callback *cb) { + secp256k1_gej *prej = (secp256k1_gej*)checked_malloc(cb, sizeof(secp256k1_gej) * n); + secp256k1_ge *prea = (secp256k1_ge*)checked_malloc(cb, sizeof(secp256k1_ge) * n); + secp256k1_fe *zr = (secp256k1_fe*)checked_malloc(cb, sizeof(secp256k1_fe) * n); + int i; + + /* Compute the odd multiples in Jacobian form. */ + secp256k1_ecmult_odd_multiples_table(n, prej, zr, a); + /* Convert them in batch to affine coordinates. */ + secp256k1_ge_set_table_gej_var(prea, prej, zr, n); + /* Convert them to compact storage form. */ + for (i = 0; i < n; i++) { + secp256k1_ge_to_storage(&pre[i], &prea[i]); + } + + free(prea); + free(prej); + free(zr); +} + /** The following two macro retrieves a particular odd multiple from a table * of precomputed multiples. */ -#define ECMULT_TABLE_GET_GEJ(r,pre,n,w) do { \ +#define ECMULT_TABLE_GET_GE(r,pre,n,w) do { \ VERIFY_CHECK(((n) & 1) == 1); \ VERIFY_CHECK((n) >= -((1 << ((w)-1)) - 1)); \ VERIFY_CHECK((n) <= ((1 << ((w)-1)) - 1)); \ if ((n) > 0) { \ *(r) = (pre)[((n)-1)/2]; \ } else { \ - secp256k1_gej_neg((r), &(pre)[(-(n)-1)/2]); \ + secp256k1_ge_neg((r), &(pre)[(-(n)-1)/2]); \ } \ } while(0) + #define ECMULT_TABLE_GET_GE_STORAGE(r,pre,n,w) do { \ VERIFY_CHECK(((n) & 1) == 1); \ VERIFY_CHECK((n) >= -((1 << ((w)-1)) - 1)); \ @@ -92,15 +154,15 @@ static void secp256k1_ecmult_table_precomp_ge_storage_var(secp256k1_ge_storage_t } \ } while(0) -static void secp256k1_ecmult_context_init(secp256k1_ecmult_context_t *ctx) { +static void secp256k1_ecmult_context_init(secp256k1_ecmult_context *ctx) { ctx->pre_g = NULL; #ifdef USE_ENDOMORPHISM ctx->pre_g_128 = NULL; #endif } -static void secp256k1_ecmult_context_build(secp256k1_ecmult_context_t *ctx) { - secp256k1_gej_t gj; +static void secp256k1_ecmult_context_build(secp256k1_ecmult_context *ctx, const secp256k1_callback *cb) { + secp256k1_gej gj; if (ctx->pre_g != NULL) { return; @@ -109,35 +171,35 @@ static void secp256k1_ecmult_context_build(secp256k1_ecmult_context_t *ctx) { /* get the generator */ secp256k1_gej_set_ge(&gj, &secp256k1_ge_const_g); - ctx->pre_g = (secp256k1_ge_storage_t (*)[])checked_malloc(sizeof((*ctx->pre_g)[0]) * ECMULT_TABLE_SIZE(WINDOW_G)); + ctx->pre_g = (secp256k1_ge_storage (*)[])checked_malloc(cb, sizeof((*ctx->pre_g)[0]) * ECMULT_TABLE_SIZE(WINDOW_G)); /* precompute the tables with odd multiples */ - secp256k1_ecmult_table_precomp_ge_storage_var(*ctx->pre_g, &gj, WINDOW_G); + secp256k1_ecmult_odd_multiples_table_storage_var(ECMULT_TABLE_SIZE(WINDOW_G), *ctx->pre_g, &gj, cb); #ifdef USE_ENDOMORPHISM { - secp256k1_gej_t g_128j; + secp256k1_gej g_128j; int i; - ctx->pre_g_128 = (secp256k1_ge_storage_t (*)[])checked_malloc(sizeof((*ctx->pre_g_128)[0]) * ECMULT_TABLE_SIZE(WINDOW_G)); + ctx->pre_g_128 = (secp256k1_ge_storage (*)[])checked_malloc(cb, sizeof((*ctx->pre_g_128)[0]) * ECMULT_TABLE_SIZE(WINDOW_G)); /* calculate 2^128*generator */ g_128j = gj; for (i = 0; i < 128; i++) { - secp256k1_gej_double_var(&g_128j, &g_128j); + secp256k1_gej_double_var(&g_128j, &g_128j, NULL); } - secp256k1_ecmult_table_precomp_ge_storage_var(*ctx->pre_g_128, &g_128j, WINDOW_G); + secp256k1_ecmult_odd_multiples_table_storage_var(ECMULT_TABLE_SIZE(WINDOW_G), *ctx->pre_g_128, &g_128j, cb); } #endif } -static void secp256k1_ecmult_context_clone(secp256k1_ecmult_context_t *dst, - const secp256k1_ecmult_context_t *src) { +static void secp256k1_ecmult_context_clone(secp256k1_ecmult_context *dst, + const secp256k1_ecmult_context *src, const secp256k1_callback *cb) { if (src->pre_g == NULL) { dst->pre_g = NULL; } else { size_t size = sizeof((*dst->pre_g)[0]) * ECMULT_TABLE_SIZE(WINDOW_G); - dst->pre_g = (secp256k1_ge_storage_t (*)[])checked_malloc(size); + dst->pre_g = (secp256k1_ge_storage (*)[])checked_malloc(cb, size); memcpy(dst->pre_g, src->pre_g, size); } #ifdef USE_ENDOMORPHISM @@ -145,17 +207,17 @@ static void secp256k1_ecmult_context_clone(secp256k1_ecmult_context_t *dst, dst->pre_g_128 = NULL; } else { size_t size = sizeof((*dst->pre_g_128)[0]) * ECMULT_TABLE_SIZE(WINDOW_G); - dst->pre_g_128 = (secp256k1_ge_storage_t (*)[])checked_malloc(size); + dst->pre_g_128 = (secp256k1_ge_storage (*)[])checked_malloc(cb, size); memcpy(dst->pre_g_128, src->pre_g_128, size); } #endif } -static int secp256k1_ecmult_context_is_built(const secp256k1_ecmult_context_t *ctx) { +static int secp256k1_ecmult_context_is_built(const secp256k1_ecmult_context *ctx) { return ctx->pre_g != NULL; } -static void secp256k1_ecmult_context_clear(secp256k1_ecmult_context_t *ctx) { +static void secp256k1_ecmult_context_clear(secp256k1_ecmult_context *ctx) { free(ctx->pre_g); #ifdef USE_ENDOMORPHISM free(ctx->pre_g_128); @@ -168,54 +230,68 @@ static void secp256k1_ecmult_context_clear(secp256k1_ecmult_context_t *ctx) { * - each wnaf[i] is either 0, or an odd integer between -(1<<(w-1) - 1) and (1<<(w-1) - 1) * - two non-zero entries in wnaf are separated by at least w-1 zeroes. * - the number of set values in wnaf is returned. This number is at most 256, and at most one more - * - than the number of bits in the (absolute value) of the input. + * than the number of bits in the (absolute value) of the input. */ -static int secp256k1_ecmult_wnaf(int *wnaf, const secp256k1_scalar_t *a, int w) { - secp256k1_scalar_t s = *a; - int set_bits = 0; +static int secp256k1_ecmult_wnaf(int *wnaf, int len, const secp256k1_scalar *a, int w) { + secp256k1_scalar s = *a; + int last_set_bit = -1; int bit = 0; int sign = 1; + int carry = 0; + + VERIFY_CHECK(wnaf != NULL); + VERIFY_CHECK(0 <= len && len <= 256); + VERIFY_CHECK(a != NULL); + VERIFY_CHECK(2 <= w && w <= 31); + + memset(wnaf, 0, len * sizeof(wnaf[0])); if (secp256k1_scalar_get_bits(&s, 255, 1)) { secp256k1_scalar_negate(&s, &s); sign = -1; } - while (bit < 256) { + while (bit < len) { int now; int word; - if (secp256k1_scalar_get_bits(&s, bit, 1) == 0) { + if (secp256k1_scalar_get_bits(&s, bit, 1) == (unsigned int)carry) { bit++; continue; } - while (set_bits < bit) { - wnaf[set_bits++] = 0; - } + now = w; - if (bit + now > 256) { - now = 256 - bit; - } - word = secp256k1_scalar_get_bits_var(&s, bit, now); - if (word & (1 << (w-1))) { - secp256k1_scalar_add_bit(&s, bit + w); - wnaf[set_bits++] = sign * (word - (1 << w)); - } else { - wnaf[set_bits++] = sign * word; + if (now > len - bit) { + now = len - bit; } + + word = secp256k1_scalar_get_bits_var(&s, bit, now) + carry; + + carry = (word >> (w-1)) & 1; + word -= carry << w; + + wnaf[bit] = sign * word; + last_set_bit = bit; + bit += now; } - return set_bits; +#ifdef VERIFY + CHECK(carry == 0); + while (bit < 256) { + CHECK(secp256k1_scalar_get_bits(&s, bit++, 1) == 0); + } +#endif + return last_set_bit + 1; } -static void secp256k1_ecmult(const secp256k1_ecmult_context_t *ctx, secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_scalar_t *na, const secp256k1_scalar_t *ng) { - secp256k1_gej_t tmpj; - secp256k1_gej_t pre_a[ECMULT_TABLE_SIZE(WINDOW_A)]; - secp256k1_ge_t tmpa; +static void secp256k1_ecmult(const secp256k1_ecmult_context *ctx, secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_scalar *na, const secp256k1_scalar *ng) { + secp256k1_ge pre_a[ECMULT_TABLE_SIZE(WINDOW_A)]; + secp256k1_ge tmpa; + secp256k1_fe Z; #ifdef USE_ENDOMORPHISM - secp256k1_gej_t pre_a_lam[ECMULT_TABLE_SIZE(WINDOW_A)]; - secp256k1_scalar_t na_1, na_lam; + secp256k1_ge pre_a_lam[ECMULT_TABLE_SIZE(WINDOW_A)]; + secp256k1_scalar na_1, na_lam; /* Splitted G factors. */ - secp256k1_scalar_t ng_1, ng_128; + secp256k1_scalar ng_1, ng_128; int wnaf_na_1[130]; int wnaf_na_lam[130]; int bits_na_1; @@ -227,7 +303,7 @@ static void secp256k1_ecmult(const secp256k1_ecmult_context_t *ctx, secp256k1_ge #else int wnaf_na[256]; int bits_na; - int wnaf_ng[257]; + int wnaf_ng[256]; int bits_ng; #endif int i; @@ -235,11 +311,11 @@ static void secp256k1_ecmult(const secp256k1_ecmult_context_t *ctx, secp256k1_ge #ifdef USE_ENDOMORPHISM /* split na into na_1 and na_lam (where na = na_1 + na_lam*lambda, and na_1 and na_lam are ~128 bit) */ - secp256k1_scalar_split_lambda_var(&na_1, &na_lam, na); + secp256k1_scalar_split_lambda(&na_1, &na_lam, na); /* build wnaf representation for na_1 and na_lam. */ - bits_na_1 = secp256k1_ecmult_wnaf(wnaf_na_1, &na_1, WINDOW_A); - bits_na_lam = secp256k1_ecmult_wnaf(wnaf_na_lam, &na_lam, WINDOW_A); + bits_na_1 = secp256k1_ecmult_wnaf(wnaf_na_1, 130, &na_1, WINDOW_A); + bits_na_lam = secp256k1_ecmult_wnaf(wnaf_na_lam, 130, &na_lam, WINDOW_A); VERIFY_CHECK(bits_na_1 <= 130); VERIFY_CHECK(bits_na_lam <= 130); bits = bits_na_1; @@ -248,24 +324,33 @@ static void secp256k1_ecmult(const secp256k1_ecmult_context_t *ctx, secp256k1_ge } #else /* build wnaf representation for na. */ - bits_na = secp256k1_ecmult_wnaf(wnaf_na, na, WINDOW_A); + bits_na = secp256k1_ecmult_wnaf(wnaf_na, 256, na, WINDOW_A); bits = bits_na; #endif - /* calculate odd multiples of a */ - secp256k1_ecmult_table_precomp_gej_var(pre_a, a, WINDOW_A); + /* Calculate odd multiples of a. + * All multiples are brought to the same Z 'denominator', which is stored + * in Z. Due to secp256k1' isomorphism we can do all operations pretending + * that the Z coordinate was 1, use affine addition formulae, and correct + * the Z coordinate of the result once at the end. + * The exception is the precomputed G table points, which are actually + * affine. Compared to the base used for other points, they have a Z ratio + * of 1/Z, so we can use secp256k1_gej_add_zinv_var, which uses the same + * isomorphism to efficiently add with a known Z inverse. + */ + secp256k1_ecmult_odd_multiples_table_globalz_windowa(pre_a, &Z, a); #ifdef USE_ENDOMORPHISM for (i = 0; i < ECMULT_TABLE_SIZE(WINDOW_A); i++) { - secp256k1_gej_mul_lambda(&pre_a_lam[i], &pre_a[i]); + secp256k1_ge_mul_lambda(&pre_a_lam[i], &pre_a[i]); } /* split ng into ng_1 and ng_128 (where gn = gn_1 + gn_128*2^128, and gn_1 and gn_128 are ~128 bit) */ secp256k1_scalar_split_128(&ng_1, &ng_128, ng); /* Build wnaf representation for ng_1 and ng_128 */ - bits_ng_1 = secp256k1_ecmult_wnaf(wnaf_ng_1, &ng_1, WINDOW_G); - bits_ng_128 = secp256k1_ecmult_wnaf(wnaf_ng_128, &ng_128, WINDOW_G); + bits_ng_1 = secp256k1_ecmult_wnaf(wnaf_ng_1, 129, &ng_1, WINDOW_G); + bits_ng_128 = secp256k1_ecmult_wnaf(wnaf_ng_128, 129, &ng_128, WINDOW_G); if (bits_ng_1 > bits) { bits = bits_ng_1; } @@ -273,7 +358,7 @@ static void secp256k1_ecmult(const secp256k1_ecmult_context_t *ctx, secp256k1_ge bits = bits_ng_128; } #else - bits_ng = secp256k1_ecmult_wnaf(wnaf_ng, ng, WINDOW_G); + bits_ng = secp256k1_ecmult_wnaf(wnaf_ng, 256, ng, WINDOW_G); if (bits_ng > bits) { bits = bits_ng; } @@ -281,37 +366,41 @@ static void secp256k1_ecmult(const secp256k1_ecmult_context_t *ctx, secp256k1_ge secp256k1_gej_set_infinity(r); - for (i = bits-1; i >= 0; i--) { + for (i = bits - 1; i >= 0; i--) { int n; - secp256k1_gej_double_var(r, r); + secp256k1_gej_double_var(r, r, NULL); #ifdef USE_ENDOMORPHISM if (i < bits_na_1 && (n = wnaf_na_1[i])) { - ECMULT_TABLE_GET_GEJ(&tmpj, pre_a, n, WINDOW_A); - secp256k1_gej_add_var(r, r, &tmpj); + ECMULT_TABLE_GET_GE(&tmpa, pre_a, n, WINDOW_A); + secp256k1_gej_add_ge_var(r, r, &tmpa, NULL); } if (i < bits_na_lam && (n = wnaf_na_lam[i])) { - ECMULT_TABLE_GET_GEJ(&tmpj, pre_a_lam, n, WINDOW_A); - secp256k1_gej_add_var(r, r, &tmpj); + ECMULT_TABLE_GET_GE(&tmpa, pre_a_lam, n, WINDOW_A); + secp256k1_gej_add_ge_var(r, r, &tmpa, NULL); } if (i < bits_ng_1 && (n = wnaf_ng_1[i])) { ECMULT_TABLE_GET_GE_STORAGE(&tmpa, *ctx->pre_g, n, WINDOW_G); - secp256k1_gej_add_ge_var(r, r, &tmpa); + secp256k1_gej_add_zinv_var(r, r, &tmpa, &Z); } if (i < bits_ng_128 && (n = wnaf_ng_128[i])) { ECMULT_TABLE_GET_GE_STORAGE(&tmpa, *ctx->pre_g_128, n, WINDOW_G); - secp256k1_gej_add_ge_var(r, r, &tmpa); + secp256k1_gej_add_zinv_var(r, r, &tmpa, &Z); } #else if (i < bits_na && (n = wnaf_na[i])) { - ECMULT_TABLE_GET_GEJ(&tmpj, pre_a, n, WINDOW_A); - secp256k1_gej_add_var(r, r, &tmpj); + ECMULT_TABLE_GET_GE(&tmpa, pre_a, n, WINDOW_A); + secp256k1_gej_add_ge_var(r, r, &tmpa, NULL); } if (i < bits_ng && (n = wnaf_ng[i])) { ECMULT_TABLE_GET_GE_STORAGE(&tmpa, *ctx->pre_g, n, WINDOW_G); - secp256k1_gej_add_ge_var(r, r, &tmpa); + secp256k1_gej_add_zinv_var(r, r, &tmpa, &Z); } #endif } + + if (!r->infinity) { + secp256k1_fe_mul(&r->z, &r->z, &Z); + } } -#endif +#endif /* SECP256K1_ECMULT_IMPL_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/field.h b/src/cryptoconditions/src/include/secp256k1/src/field.h index 41b280892..bb6692ad5 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/field.h +++ b/src/cryptoconditions/src/include/secp256k1/src/field.h @@ -4,13 +4,13 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_FIELD_ -#define _SECP256K1_FIELD_ +#ifndef SECP256K1_FIELD_H +#define SECP256K1_FIELD_H /** Field element module. * * Field elements can be represented in several ways, but code accessing - * it (and implementations) need to take certain properaties into account: + * it (and implementations) need to take certain properties into account: * - Each field element can be normalized or not. * - Each field element has a magnitude, which represents how far away * its representation is away from normalization. Normalized elements @@ -30,90 +30,103 @@ #error "Please select field implementation" #endif +#include "util.h" + /** Normalize a field element. */ -static void secp256k1_fe_normalize(secp256k1_fe_t *r); +static void secp256k1_fe_normalize(secp256k1_fe *r); /** Weakly normalize a field element: reduce it magnitude to 1, but don't fully normalize. */ -static void secp256k1_fe_normalize_weak(secp256k1_fe_t *r); +static void secp256k1_fe_normalize_weak(secp256k1_fe *r); /** Normalize a field element, without constant-time guarantee. */ -static void secp256k1_fe_normalize_var(secp256k1_fe_t *r); +static void secp256k1_fe_normalize_var(secp256k1_fe *r); /** Verify whether a field element represents zero i.e. would normalize to a zero value. The field * implementation may optionally normalize the input, but this should not be relied upon. */ -static int secp256k1_fe_normalizes_to_zero(secp256k1_fe_t *r); +static int secp256k1_fe_normalizes_to_zero(secp256k1_fe *r); /** Verify whether a field element represents zero i.e. would normalize to a zero value. The field * implementation may optionally normalize the input, but this should not be relied upon. */ -static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe_t *r); +static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe *r); /** Set a field element equal to a small integer. Resulting field element is normalized. */ -static void secp256k1_fe_set_int(secp256k1_fe_t *r, int a); +static void secp256k1_fe_set_int(secp256k1_fe *r, int a); + +/** Sets a field element equal to zero, initializing all fields. */ +static void secp256k1_fe_clear(secp256k1_fe *a); /** Verify whether a field element is zero. Requires the input to be normalized. */ -static int secp256k1_fe_is_zero(const secp256k1_fe_t *a); +static int secp256k1_fe_is_zero(const secp256k1_fe *a); /** Check the "oddness" of a field element. Requires the input to be normalized. */ -static int secp256k1_fe_is_odd(const secp256k1_fe_t *a); +static int secp256k1_fe_is_odd(const secp256k1_fe *a); /** Compare two field elements. Requires magnitude-1 inputs. */ -static int secp256k1_fe_equal_var(const secp256k1_fe_t *a, const secp256k1_fe_t *b); +static int secp256k1_fe_equal(const secp256k1_fe *a, const secp256k1_fe *b); + +/** Same as secp256k1_fe_equal, but may be variable time. */ +static int secp256k1_fe_equal_var(const secp256k1_fe *a, const secp256k1_fe *b); /** Compare two field elements. Requires both inputs to be normalized */ -static int secp256k1_fe_cmp_var(const secp256k1_fe_t *a, const secp256k1_fe_t *b); +static int secp256k1_fe_cmp_var(const secp256k1_fe *a, const secp256k1_fe *b); -/** Set a field element equal to 32-byte big endian value. If succesful, the resulting field element is normalized. */ -static int secp256k1_fe_set_b32(secp256k1_fe_t *r, const unsigned char *a); +/** Set a field element equal to 32-byte big endian value. If successful, the resulting field element is normalized. */ +static int secp256k1_fe_set_b32(secp256k1_fe *r, const unsigned char *a); /** Convert a field element to a 32-byte big endian value. Requires the input to be normalized */ -static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe_t *a); +static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe *a); /** Set a field element equal to the additive inverse of another. Takes a maximum magnitude of the input * as an argument. The magnitude of the output is one higher. */ -static void secp256k1_fe_negate(secp256k1_fe_t *r, const secp256k1_fe_t *a, int m); +static void secp256k1_fe_negate(secp256k1_fe *r, const secp256k1_fe *a, int m); /** Multiplies the passed field element with a small integer constant. Multiplies the magnitude by that * small integer. */ -static void secp256k1_fe_mul_int(secp256k1_fe_t *r, int a); +static void secp256k1_fe_mul_int(secp256k1_fe *r, int a); /** Adds a field element to another. The result has the sum of the inputs' magnitudes as magnitude. */ -static void secp256k1_fe_add(secp256k1_fe_t *r, const secp256k1_fe_t *a); +static void secp256k1_fe_add(secp256k1_fe *r, const secp256k1_fe *a); /** Sets a field element to be the product of two others. Requires the inputs' magnitudes to be at most 8. * The output magnitude is 1 (but not guaranteed to be normalized). */ -static void secp256k1_fe_mul(secp256k1_fe_t *r, const secp256k1_fe_t *a, const secp256k1_fe_t * SECP256K1_RESTRICT b); +static void secp256k1_fe_mul(secp256k1_fe *r, const secp256k1_fe *a, const secp256k1_fe * SECP256K1_RESTRICT b); /** Sets a field element to be the square of another. Requires the input's magnitude to be at most 8. * The output magnitude is 1 (but not guaranteed to be normalized). */ -static void secp256k1_fe_sqr(secp256k1_fe_t *r, const secp256k1_fe_t *a); +static void secp256k1_fe_sqr(secp256k1_fe *r, const secp256k1_fe *a); -/** Sets a field element to be the (modular) square root (if any exist) of another. Requires the - * input's magnitude to be at most 8. The output magnitude is 1 (but not guaranteed to be - * normalized). Return value indicates whether a square root was found. */ -static int secp256k1_fe_sqrt_var(secp256k1_fe_t *r, const secp256k1_fe_t *a); +/** If a has a square root, it is computed in r and 1 is returned. If a does not + * have a square root, the root of its negation is computed and 0 is returned. + * The input's magnitude can be at most 8. The output magnitude is 1 (but not + * guaranteed to be normalized). The result in r will always be a square + * itself. */ +static int secp256k1_fe_sqrt(secp256k1_fe *r, const secp256k1_fe *a); + +/** Checks whether a field element is a quadratic residue. */ +static int secp256k1_fe_is_quad_var(const secp256k1_fe *a); /** Sets a field element to be the (modular) inverse of another. Requires the input's magnitude to be * at most 8. The output magnitude is 1 (but not guaranteed to be normalized). */ -static void secp256k1_fe_inv(secp256k1_fe_t *r, const secp256k1_fe_t *a); +static void secp256k1_fe_inv(secp256k1_fe *r, const secp256k1_fe *a); /** Potentially faster version of secp256k1_fe_inv, without constant-time guarantee. */ -static void secp256k1_fe_inv_var(secp256k1_fe_t *r, const secp256k1_fe_t *a); +static void secp256k1_fe_inv_var(secp256k1_fe *r, const secp256k1_fe *a); /** Calculate the (modular) inverses of a batch of field elements. Requires the inputs' magnitudes to be * at most 8. The output magnitudes are 1 (but not guaranteed to be normalized). The inputs and * outputs must not overlap in memory. */ -static void secp256k1_fe_inv_all_var(size_t len, secp256k1_fe_t *r, const secp256k1_fe_t *a); +static void secp256k1_fe_inv_all_var(secp256k1_fe *r, const secp256k1_fe *a, size_t len); /** Convert a field element to the storage type. */ -static void secp256k1_fe_to_storage(secp256k1_fe_storage_t *r, const secp256k1_fe_t*); +static void secp256k1_fe_to_storage(secp256k1_fe_storage *r, const secp256k1_fe *a); /** Convert a field element back from the storage type. */ -static void secp256k1_fe_from_storage(secp256k1_fe_t *r, const secp256k1_fe_storage_t*); +static void secp256k1_fe_from_storage(secp256k1_fe *r, const secp256k1_fe_storage *a); /** If flag is true, set *r equal to *a; otherwise leave it. Constant-time. */ -static void secp256k1_fe_storage_cmov(secp256k1_fe_storage_t *r, const secp256k1_fe_storage_t *a, int flag); +static void secp256k1_fe_storage_cmov(secp256k1_fe_storage *r, const secp256k1_fe_storage *a, int flag); /** If flag is true, set *r equal to *a; otherwise leave it. Constant-time. */ -static void secp256k1_fe_cmov(secp256k1_fe_t *r, const secp256k1_fe_t *a, int flag); +static void secp256k1_fe_cmov(secp256k1_fe *r, const secp256k1_fe *a, int flag); -#endif +#endif /* SECP256K1_FIELD_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/field_10x26.h b/src/cryptoconditions/src/include/secp256k1/src/field_10x26.h index 44bce6525..727c5267f 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/field_10x26.h +++ b/src/cryptoconditions/src/include/secp256k1/src/field_10x26.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_FIELD_REPR_ -#define _SECP256K1_FIELD_REPR_ +#ifndef SECP256K1_FIELD_REPR_H +#define SECP256K1_FIELD_REPR_H #include @@ -16,20 +16,20 @@ typedef struct { int magnitude; int normalized; #endif -} secp256k1_fe_t; +} secp256k1_fe; /* Unpacks a constant into a overlapping multi-limbed FE element. */ #define SECP256K1_FE_CONST_INNER(d7, d6, d5, d4, d3, d2, d1, d0) { \ (d0) & 0x3FFFFFFUL, \ - ((d0) >> 26) | ((d1) & 0xFFFFFUL) << 6, \ - ((d1) >> 20) | ((d2) & 0x3FFFUL) << 12, \ - ((d2) >> 14) | ((d3) & 0xFFUL) << 18, \ - ((d3) >> 8) | ((d4) & 0x3) << 24, \ - ((d4) >> 2) & 0x3FFFFFFUL, \ - ((d4) >> 28) | ((d5) & 0x3FFFFFUL) << 4, \ - ((d5) >> 22) | ((d6) & 0xFFFF) << 10, \ - ((d6) >> 16) | ((d7) & 0x3FF) << 16, \ - ((d7) >> 10) \ + (((uint32_t)d0) >> 26) | (((uint32_t)(d1) & 0xFFFFFUL) << 6), \ + (((uint32_t)d1) >> 20) | (((uint32_t)(d2) & 0x3FFFUL) << 12), \ + (((uint32_t)d2) >> 14) | (((uint32_t)(d3) & 0xFFUL) << 18), \ + (((uint32_t)d3) >> 8) | (((uint32_t)(d4) & 0x3UL) << 24), \ + (((uint32_t)d4) >> 2) & 0x3FFFFFFUL, \ + (((uint32_t)d4) >> 28) | (((uint32_t)(d5) & 0x3FFFFFUL) << 4), \ + (((uint32_t)d5) >> 22) | (((uint32_t)(d6) & 0xFFFFUL) << 10), \ + (((uint32_t)d6) >> 16) | (((uint32_t)(d7) & 0x3FFUL) << 16), \ + (((uint32_t)d7) >> 10) \ } #ifdef VERIFY @@ -40,8 +40,9 @@ typedef struct { typedef struct { uint32_t n[8]; -} secp256k1_fe_storage_t; +} secp256k1_fe_storage; #define SECP256K1_FE_STORAGE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{ (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7) }} +#define SECP256K1_FE_STORAGE_CONST_GET(d) d.n[7], d.n[6], d.n[5], d.n[4],d.n[3], d.n[2], d.n[1], d.n[0] -#endif +#endif /* SECP256K1_FIELD_REPR_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/field_10x26_impl.h b/src/cryptoconditions/src/include/secp256k1/src/field_10x26_impl.h index 871b91f91..94f8132fc 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/field_10x26_impl.h +++ b/src/cryptoconditions/src/include/secp256k1/src/field_10x26_impl.h @@ -4,17 +4,15 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_FIELD_REPR_IMPL_H_ -#define _SECP256K1_FIELD_REPR_IMPL_H_ +#ifndef SECP256K1_FIELD_REPR_IMPL_H +#define SECP256K1_FIELD_REPR_IMPL_H -#include -#include #include "util.h" #include "num.h" #include "field.h" #ifdef VERIFY -static void secp256k1_fe_verify(const secp256k1_fe_t *a) { +static void secp256k1_fe_verify(const secp256k1_fe *a) { const uint32_t *d = a->n; int m = a->normalized ? 1 : 2 * a->magnitude, r = 1; r &= (d[0] <= 0x3FFFFFFUL * m); @@ -40,13 +38,9 @@ static void secp256k1_fe_verify(const secp256k1_fe_t *a) { } VERIFY_CHECK(r == 1); } -#else -static void secp256k1_fe_verify(const secp256k1_fe_t *a) { - (void)a; -} #endif -static void secp256k1_fe_normalize(secp256k1_fe_t *r) { +static void secp256k1_fe_normalize(secp256k1_fe *r) { uint32_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4], t5 = r->n[5], t6 = r->n[6], t7 = r->n[7], t8 = r->n[8], t9 = r->n[9]; @@ -101,7 +95,7 @@ static void secp256k1_fe_normalize(secp256k1_fe_t *r) { #endif } -static void secp256k1_fe_normalize_weak(secp256k1_fe_t *r) { +static void secp256k1_fe_normalize_weak(secp256k1_fe *r) { uint32_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4], t5 = r->n[5], t6 = r->n[6], t7 = r->n[7], t8 = r->n[8], t9 = r->n[9]; @@ -132,7 +126,7 @@ static void secp256k1_fe_normalize_weak(secp256k1_fe_t *r) { #endif } -static void secp256k1_fe_normalize_var(secp256k1_fe_t *r) { +static void secp256k1_fe_normalize_var(secp256k1_fe *r) { uint32_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4], t5 = r->n[5], t6 = r->n[6], t7 = r->n[7], t8 = r->n[8], t9 = r->n[9]; @@ -188,7 +182,7 @@ static void secp256k1_fe_normalize_var(secp256k1_fe_t *r) { #endif } -static int secp256k1_fe_normalizes_to_zero(secp256k1_fe_t *r) { +static int secp256k1_fe_normalizes_to_zero(secp256k1_fe *r) { uint32_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4], t5 = r->n[5], t6 = r->n[6], t7 = r->n[7], t8 = r->n[8], t9 = r->n[9]; @@ -217,7 +211,7 @@ static int secp256k1_fe_normalizes_to_zero(secp256k1_fe_t *r) { return (z0 == 0) | (z1 == 0x3FFFFFFUL); } -static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe_t *r) { +static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe *r) { uint32_t t0, t1, t2, t3, t4, t5, t6, t7, t8, t9; uint32_t z0, z1; uint32_t x; @@ -252,7 +246,7 @@ static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe_t *r) { t9 &= 0x03FFFFFUL; t1 += (x << 6); - t1 += (t0 >> 26); t0 = z0; + t1 += (t0 >> 26); t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; z0 |= t1; z1 &= t1 ^ 0x40UL; t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; z0 |= t2; z1 &= t2; t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; z0 |= t3; z1 &= t3; @@ -269,7 +263,7 @@ static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe_t *r) { return (z0 == 0) | (z1 == 0x3FFFFFFUL); } -SECP256K1_INLINE static void secp256k1_fe_set_int(secp256k1_fe_t *r, int a) { +SECP256K1_INLINE static void secp256k1_fe_set_int(secp256k1_fe *r, int a) { r->n[0] = a; r->n[1] = r->n[2] = r->n[3] = r->n[4] = r->n[5] = r->n[6] = r->n[7] = r->n[8] = r->n[9] = 0; #ifdef VERIFY @@ -279,7 +273,7 @@ SECP256K1_INLINE static void secp256k1_fe_set_int(secp256k1_fe_t *r, int a) { #endif } -SECP256K1_INLINE static int secp256k1_fe_is_zero(const secp256k1_fe_t *a) { +SECP256K1_INLINE static int secp256k1_fe_is_zero(const secp256k1_fe *a) { const uint32_t *t = a->n; #ifdef VERIFY VERIFY_CHECK(a->normalized); @@ -288,7 +282,7 @@ SECP256K1_INLINE static int secp256k1_fe_is_zero(const secp256k1_fe_t *a) { return (t[0] | t[1] | t[2] | t[3] | t[4] | t[5] | t[6] | t[7] | t[8] | t[9]) == 0; } -SECP256K1_INLINE static int secp256k1_fe_is_odd(const secp256k1_fe_t *a) { +SECP256K1_INLINE static int secp256k1_fe_is_odd(const secp256k1_fe *a) { #ifdef VERIFY VERIFY_CHECK(a->normalized); secp256k1_fe_verify(a); @@ -296,7 +290,7 @@ SECP256K1_INLINE static int secp256k1_fe_is_odd(const secp256k1_fe_t *a) { return a->n[0] & 1; } -SECP256K1_INLINE static void secp256k1_fe_clear(secp256k1_fe_t *a) { +SECP256K1_INLINE static void secp256k1_fe_clear(secp256k1_fe *a) { int i; #ifdef VERIFY a->magnitude = 0; @@ -307,7 +301,7 @@ SECP256K1_INLINE static void secp256k1_fe_clear(secp256k1_fe_t *a) { } } -static int secp256k1_fe_cmp_var(const secp256k1_fe_t *a, const secp256k1_fe_t *b) { +static int secp256k1_fe_cmp_var(const secp256k1_fe *a, const secp256k1_fe *b) { int i; #ifdef VERIFY VERIFY_CHECK(a->normalized); @@ -326,18 +320,18 @@ static int secp256k1_fe_cmp_var(const secp256k1_fe_t *a, const secp256k1_fe_t *b return 0; } -static int secp256k1_fe_set_b32(secp256k1_fe_t *r, const unsigned char *a) { - int i; - r->n[0] = r->n[1] = r->n[2] = r->n[3] = r->n[4] = 0; - r->n[5] = r->n[6] = r->n[7] = r->n[8] = r->n[9] = 0; - for (i=0; i<32; i++) { - int j; - for (j=0; j<4; j++) { - int limb = (8*i+2*j)/26; - int shift = (8*i+2*j)%26; - r->n[limb] |= (uint32_t)((a[31-i] >> (2*j)) & 0x3) << shift; - } - } +static int secp256k1_fe_set_b32(secp256k1_fe *r, const unsigned char *a) { + r->n[0] = (uint32_t)a[31] | ((uint32_t)a[30] << 8) | ((uint32_t)a[29] << 16) | ((uint32_t)(a[28] & 0x3) << 24); + r->n[1] = (uint32_t)((a[28] >> 2) & 0x3f) | ((uint32_t)a[27] << 6) | ((uint32_t)a[26] << 14) | ((uint32_t)(a[25] & 0xf) << 22); + r->n[2] = (uint32_t)((a[25] >> 4) & 0xf) | ((uint32_t)a[24] << 4) | ((uint32_t)a[23] << 12) | ((uint32_t)(a[22] & 0x3f) << 20); + r->n[3] = (uint32_t)((a[22] >> 6) & 0x3) | ((uint32_t)a[21] << 2) | ((uint32_t)a[20] << 10) | ((uint32_t)a[19] << 18); + r->n[4] = (uint32_t)a[18] | ((uint32_t)a[17] << 8) | ((uint32_t)a[16] << 16) | ((uint32_t)(a[15] & 0x3) << 24); + r->n[5] = (uint32_t)((a[15] >> 2) & 0x3f) | ((uint32_t)a[14] << 6) | ((uint32_t)a[13] << 14) | ((uint32_t)(a[12] & 0xf) << 22); + r->n[6] = (uint32_t)((a[12] >> 4) & 0xf) | ((uint32_t)a[11] << 4) | ((uint32_t)a[10] << 12) | ((uint32_t)(a[9] & 0x3f) << 20); + r->n[7] = (uint32_t)((a[9] >> 6) & 0x3) | ((uint32_t)a[8] << 2) | ((uint32_t)a[7] << 10) | ((uint32_t)a[6] << 18); + r->n[8] = (uint32_t)a[5] | ((uint32_t)a[4] << 8) | ((uint32_t)a[3] << 16) | ((uint32_t)(a[2] & 0x3) << 24); + r->n[9] = (uint32_t)((a[2] >> 2) & 0x3f) | ((uint32_t)a[1] << 6) | ((uint32_t)a[0] << 14); + if (r->n[9] == 0x3FFFFFUL && (r->n[8] & r->n[7] & r->n[6] & r->n[5] & r->n[4] & r->n[3] & r->n[2]) == 0x3FFFFFFUL && (r->n[1] + 0x40UL + ((r->n[0] + 0x3D1UL) >> 26)) > 0x3FFFFFFUL) { return 0; } @@ -350,25 +344,46 @@ static int secp256k1_fe_set_b32(secp256k1_fe_t *r, const unsigned char *a) { } /** Convert a field element to a 32-byte big endian value. Requires the input to be normalized */ -static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe_t *a) { - int i; +static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe *a) { #ifdef VERIFY VERIFY_CHECK(a->normalized); secp256k1_fe_verify(a); #endif - for (i=0; i<32; i++) { - int j; - int c = 0; - for (j=0; j<4; j++) { - int limb = (8*i+2*j)/26; - int shift = (8*i+2*j)%26; - c |= ((a->n[limb] >> shift) & 0x3) << (2 * j); - } - r[31-i] = c; - } + r[0] = (a->n[9] >> 14) & 0xff; + r[1] = (a->n[9] >> 6) & 0xff; + r[2] = ((a->n[9] & 0x3F) << 2) | ((a->n[8] >> 24) & 0x3); + r[3] = (a->n[8] >> 16) & 0xff; + r[4] = (a->n[8] >> 8) & 0xff; + r[5] = a->n[8] & 0xff; + r[6] = (a->n[7] >> 18) & 0xff; + r[7] = (a->n[7] >> 10) & 0xff; + r[8] = (a->n[7] >> 2) & 0xff; + r[9] = ((a->n[7] & 0x3) << 6) | ((a->n[6] >> 20) & 0x3f); + r[10] = (a->n[6] >> 12) & 0xff; + r[11] = (a->n[6] >> 4) & 0xff; + r[12] = ((a->n[6] & 0xf) << 4) | ((a->n[5] >> 22) & 0xf); + r[13] = (a->n[5] >> 14) & 0xff; + r[14] = (a->n[5] >> 6) & 0xff; + r[15] = ((a->n[5] & 0x3f) << 2) | ((a->n[4] >> 24) & 0x3); + r[16] = (a->n[4] >> 16) & 0xff; + r[17] = (a->n[4] >> 8) & 0xff; + r[18] = a->n[4] & 0xff; + r[19] = (a->n[3] >> 18) & 0xff; + r[20] = (a->n[3] >> 10) & 0xff; + r[21] = (a->n[3] >> 2) & 0xff; + r[22] = ((a->n[3] & 0x3) << 6) | ((a->n[2] >> 20) & 0x3f); + r[23] = (a->n[2] >> 12) & 0xff; + r[24] = (a->n[2] >> 4) & 0xff; + r[25] = ((a->n[2] & 0xf) << 4) | ((a->n[1] >> 22) & 0xf); + r[26] = (a->n[1] >> 14) & 0xff; + r[27] = (a->n[1] >> 6) & 0xff; + r[28] = ((a->n[1] & 0x3f) << 2) | ((a->n[0] >> 24) & 0x3); + r[29] = (a->n[0] >> 16) & 0xff; + r[30] = (a->n[0] >> 8) & 0xff; + r[31] = a->n[0] & 0xff; } -SECP256K1_INLINE static void secp256k1_fe_negate(secp256k1_fe_t *r, const secp256k1_fe_t *a, int m) { +SECP256K1_INLINE static void secp256k1_fe_negate(secp256k1_fe *r, const secp256k1_fe *a, int m) { #ifdef VERIFY VERIFY_CHECK(a->magnitude <= m); secp256k1_fe_verify(a); @@ -390,7 +405,7 @@ SECP256K1_INLINE static void secp256k1_fe_negate(secp256k1_fe_t *r, const secp25 #endif } -SECP256K1_INLINE static void secp256k1_fe_mul_int(secp256k1_fe_t *r, int a) { +SECP256K1_INLINE static void secp256k1_fe_mul_int(secp256k1_fe *r, int a) { r->n[0] *= a; r->n[1] *= a; r->n[2] *= a; @@ -408,7 +423,7 @@ SECP256K1_INLINE static void secp256k1_fe_mul_int(secp256k1_fe_t *r, int a) { #endif } -SECP256K1_INLINE static void secp256k1_fe_add(secp256k1_fe_t *r, const secp256k1_fe_t *a) { +SECP256K1_INLINE static void secp256k1_fe_add(secp256k1_fe *r, const secp256k1_fe *a) { #ifdef VERIFY secp256k1_fe_verify(a); #endif @@ -429,6 +444,14 @@ SECP256K1_INLINE static void secp256k1_fe_add(secp256k1_fe_t *r, const secp256k1 #endif } +#if defined(USE_EXTERNAL_ASM) + +/* External assembler implementation */ +void secp256k1_fe_mul_inner(uint32_t *r, const uint32_t *a, const uint32_t * SECP256K1_RESTRICT b); +void secp256k1_fe_sqr_inner(uint32_t *r, const uint32_t *a); + +#else + #ifdef VERIFY #define VERIFY_BITS(x, n) VERIFY_CHECK(((x) >> (n)) == 0) #else @@ -1037,9 +1060,9 @@ SECP256K1_INLINE static void secp256k1_fe_sqr_inner(uint32_t *r, const uint32_t VERIFY_BITS(r[2], 27); /* [r9 r8 r7 r6 r5 r4 r3 r2 r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ } +#endif - -static void secp256k1_fe_mul(secp256k1_fe_t *r, const secp256k1_fe_t *a, const secp256k1_fe_t * SECP256K1_RESTRICT b) { +static void secp256k1_fe_mul(secp256k1_fe *r, const secp256k1_fe *a, const secp256k1_fe * SECP256K1_RESTRICT b) { #ifdef VERIFY VERIFY_CHECK(a->magnitude <= 8); VERIFY_CHECK(b->magnitude <= 8); @@ -1055,7 +1078,7 @@ static void secp256k1_fe_mul(secp256k1_fe_t *r, const secp256k1_fe_t *a, const s #endif } -static void secp256k1_fe_sqr(secp256k1_fe_t *r, const secp256k1_fe_t *a) { +static void secp256k1_fe_sqr(secp256k1_fe *r, const secp256k1_fe *a) { #ifdef VERIFY VERIFY_CHECK(a->magnitude <= 8); secp256k1_fe_verify(a); @@ -1068,7 +1091,7 @@ static void secp256k1_fe_sqr(secp256k1_fe_t *r, const secp256k1_fe_t *a) { #endif } -static SECP256K1_INLINE void secp256k1_fe_cmov(secp256k1_fe_t *r, const secp256k1_fe_t *a, int flag) { +static SECP256K1_INLINE void secp256k1_fe_cmov(secp256k1_fe *r, const secp256k1_fe *a, int flag) { uint32_t mask0, mask1; mask0 = flag + ~((uint32_t)0); mask1 = ~mask0; @@ -1083,12 +1106,14 @@ static SECP256K1_INLINE void secp256k1_fe_cmov(secp256k1_fe_t *r, const secp256k r->n[8] = (r->n[8] & mask0) | (a->n[8] & mask1); r->n[9] = (r->n[9] & mask0) | (a->n[9] & mask1); #ifdef VERIFY - r->magnitude = (r->magnitude & mask0) | (a->magnitude & mask1); - r->normalized = (r->normalized & mask0) | (a->normalized & mask1); + if (a->magnitude > r->magnitude) { + r->magnitude = a->magnitude; + } + r->normalized &= a->normalized; #endif } -static SECP256K1_INLINE void secp256k1_fe_storage_cmov(secp256k1_fe_storage_t *r, const secp256k1_fe_storage_t *a, int flag) { +static SECP256K1_INLINE void secp256k1_fe_storage_cmov(secp256k1_fe_storage *r, const secp256k1_fe_storage *a, int flag) { uint32_t mask0, mask1; mask0 = flag + ~((uint32_t)0); mask1 = ~mask0; @@ -1102,7 +1127,7 @@ static SECP256K1_INLINE void secp256k1_fe_storage_cmov(secp256k1_fe_storage_t *r r->n[7] = (r->n[7] & mask0) | (a->n[7] & mask1); } -static void secp256k1_fe_to_storage(secp256k1_fe_storage_t *r, const secp256k1_fe_t *a) { +static void secp256k1_fe_to_storage(secp256k1_fe_storage *r, const secp256k1_fe *a) { #ifdef VERIFY VERIFY_CHECK(a->normalized); #endif @@ -1116,7 +1141,7 @@ static void secp256k1_fe_to_storage(secp256k1_fe_storage_t *r, const secp256k1_f r->n[7] = a->n[8] >> 16 | a->n[9] << 10; } -static SECP256K1_INLINE void secp256k1_fe_from_storage(secp256k1_fe_t *r, const secp256k1_fe_storage_t *a) { +static SECP256K1_INLINE void secp256k1_fe_from_storage(secp256k1_fe *r, const secp256k1_fe_storage *a) { r->n[0] = a->n[0] & 0x3FFFFFFUL; r->n[1] = a->n[0] >> 26 | ((a->n[1] << 6) & 0x3FFFFFFUL); r->n[2] = a->n[1] >> 20 | ((a->n[2] << 12) & 0x3FFFFFFUL); @@ -1133,4 +1158,4 @@ static SECP256K1_INLINE void secp256k1_fe_from_storage(secp256k1_fe_t *r, const #endif } -#endif +#endif /* SECP256K1_FIELD_REPR_IMPL_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/field_5x52.h b/src/cryptoconditions/src/include/secp256k1/src/field_5x52.h index 4513d36f4..bccd8feb4 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/field_5x52.h +++ b/src/cryptoconditions/src/include/secp256k1/src/field_5x52.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_FIELD_REPR_ -#define _SECP256K1_FIELD_REPR_ +#ifndef SECP256K1_FIELD_REPR_H +#define SECP256K1_FIELD_REPR_H #include @@ -16,15 +16,15 @@ typedef struct { int magnitude; int normalized; #endif -} secp256k1_fe_t; +} secp256k1_fe; /* Unpacks a constant into a overlapping multi-limbed FE element. */ #define SECP256K1_FE_CONST_INNER(d7, d6, d5, d4, d3, d2, d1, d0) { \ - (d0) | ((uint64_t)(d1) & 0xFFFFFUL) << 32, \ - ((d1) >> 20) | ((uint64_t)(d2)) << 12 | ((uint64_t)(d3) & 0xFFUL) << 44, \ - ((d3) >> 8) | ((uint64_t)(d4) & 0xFFFFFFFUL) << 24, \ - ((d4) >> 28) | ((uint64_t)(d5)) << 4 | ((uint64_t)(d6) & 0xFFFFUL) << 36, \ - ((d6) >> 16) | ((uint64_t)(d7)) << 16 \ + (d0) | (((uint64_t)(d1) & 0xFFFFFUL) << 32), \ + ((uint64_t)(d1) >> 20) | (((uint64_t)(d2)) << 12) | (((uint64_t)(d3) & 0xFFUL) << 44), \ + ((uint64_t)(d3) >> 8) | (((uint64_t)(d4) & 0xFFFFFFFUL) << 24), \ + ((uint64_t)(d4) >> 28) | (((uint64_t)(d5)) << 4) | (((uint64_t)(d6) & 0xFFFFUL) << 36), \ + ((uint64_t)(d6) >> 16) | (((uint64_t)(d7)) << 16) \ } #ifdef VERIFY @@ -35,13 +35,13 @@ typedef struct { typedef struct { uint64_t n[4]; -} secp256k1_fe_storage_t; +} secp256k1_fe_storage; #define SECP256K1_FE_STORAGE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{ \ - (d0) | ((uint64_t)(d1)) << 32, \ - (d2) | ((uint64_t)(d3)) << 32, \ - (d4) | ((uint64_t)(d5)) << 32, \ - (d6) | ((uint64_t)(d7)) << 32 \ + (d0) | (((uint64_t)(d1)) << 32), \ + (d2) | (((uint64_t)(d3)) << 32), \ + (d4) | (((uint64_t)(d5)) << 32), \ + (d6) | (((uint64_t)(d7)) << 32) \ }} -#endif +#endif /* SECP256K1_FIELD_REPR_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/field_5x52_asm_impl.h b/src/cryptoconditions/src/include/secp256k1/src/field_5x52_asm_impl.h index 98cc004bf..1fc3171f6 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/field_5x52_asm_impl.h +++ b/src/cryptoconditions/src/include/secp256k1/src/field_5x52_asm_impl.h @@ -11,8 +11,8 @@ * - December 2014, Pieter Wuille: converted from YASM to GCC inline assembly */ -#ifndef _SECP256K1_FIELD_INNER5X52_IMPL_H_ -#define _SECP256K1_FIELD_INNER5X52_IMPL_H_ +#ifndef SECP256K1_FIELD_INNER5X52_IMPL_H +#define SECP256K1_FIELD_INNER5X52_IMPL_H SECP256K1_INLINE static void secp256k1_fe_mul_inner(uint64_t *r, const uint64_t *a, const uint64_t * SECP256K1_RESTRICT b) { /** @@ -499,4 +499,4 @@ __asm__ __volatile__( ); } -#endif +#endif /* SECP256K1_FIELD_INNER5X52_IMPL_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/field_5x52_impl.h b/src/cryptoconditions/src/include/secp256k1/src/field_5x52_impl.h index bda4c3dfc..957c61b01 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/field_5x52_impl.h +++ b/src/cryptoconditions/src/include/secp256k1/src/field_5x52_impl.h @@ -4,14 +4,13 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_FIELD_REPR_IMPL_H_ -#define _SECP256K1_FIELD_REPR_IMPL_H_ +#ifndef SECP256K1_FIELD_REPR_IMPL_H +#define SECP256K1_FIELD_REPR_IMPL_H #if defined HAVE_CONFIG_H #include "libsecp256k1-config.h" #endif -#include #include "util.h" #include "num.h" #include "field.h" @@ -31,7 +30,7 @@ */ #ifdef VERIFY -static void secp256k1_fe_verify(const secp256k1_fe_t *a) { +static void secp256k1_fe_verify(const secp256k1_fe *a) { const uint64_t *d = a->n; int m = a->normalized ? 1 : 2 * a->magnitude, r = 1; /* secp256k1 'p' value defined in "Standards for Efficient Cryptography" (SEC2) 2.7.1. */ @@ -50,13 +49,9 @@ static void secp256k1_fe_verify(const secp256k1_fe_t *a) { } VERIFY_CHECK(r == 1); } -#else -static void secp256k1_fe_verify(const secp256k1_fe_t *a) { - (void)a; -} #endif -static void secp256k1_fe_normalize(secp256k1_fe_t *r) { +static void secp256k1_fe_normalize(secp256k1_fe *r) { uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4]; /* Reduce t4 at the start so there will be at most a single carry from the first pass */ @@ -99,7 +94,7 @@ static void secp256k1_fe_normalize(secp256k1_fe_t *r) { #endif } -static void secp256k1_fe_normalize_weak(secp256k1_fe_t *r) { +static void secp256k1_fe_normalize_weak(secp256k1_fe *r) { uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4]; /* Reduce t4 at the start so there will be at most a single carry from the first pass */ @@ -123,7 +118,7 @@ static void secp256k1_fe_normalize_weak(secp256k1_fe_t *r) { #endif } -static void secp256k1_fe_normalize_var(secp256k1_fe_t *r) { +static void secp256k1_fe_normalize_var(secp256k1_fe *r) { uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4]; /* Reduce t4 at the start so there will be at most a single carry from the first pass */ @@ -167,7 +162,7 @@ static void secp256k1_fe_normalize_var(secp256k1_fe_t *r) { #endif } -static int secp256k1_fe_normalizes_to_zero(secp256k1_fe_t *r) { +static int secp256k1_fe_normalizes_to_zero(secp256k1_fe *r) { uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4]; /* z0 tracks a possible raw value of 0, z1 tracks a possible raw value of P */ @@ -190,7 +185,7 @@ static int secp256k1_fe_normalizes_to_zero(secp256k1_fe_t *r) { return (z0 == 0) | (z1 == 0xFFFFFFFFFFFFFULL); } -static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe_t *r) { +static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe *r) { uint64_t t0, t1, t2, t3, t4; uint64_t z0, z1; uint64_t x; @@ -219,7 +214,7 @@ static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe_t *r) { t4 &= 0x0FFFFFFFFFFFFULL; - t1 += (t0 >> 52); t0 = z0; + t1 += (t0 >> 52); t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; z0 |= t1; z1 &= t1; t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; z0 |= t2; z1 &= t2; t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; z0 |= t3; z1 &= t3; @@ -231,7 +226,7 @@ static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe_t *r) { return (z0 == 0) | (z1 == 0xFFFFFFFFFFFFFULL); } -SECP256K1_INLINE static void secp256k1_fe_set_int(secp256k1_fe_t *r, int a) { +SECP256K1_INLINE static void secp256k1_fe_set_int(secp256k1_fe *r, int a) { r->n[0] = a; r->n[1] = r->n[2] = r->n[3] = r->n[4] = 0; #ifdef VERIFY @@ -241,7 +236,7 @@ SECP256K1_INLINE static void secp256k1_fe_set_int(secp256k1_fe_t *r, int a) { #endif } -SECP256K1_INLINE static int secp256k1_fe_is_zero(const secp256k1_fe_t *a) { +SECP256K1_INLINE static int secp256k1_fe_is_zero(const secp256k1_fe *a) { const uint64_t *t = a->n; #ifdef VERIFY VERIFY_CHECK(a->normalized); @@ -250,7 +245,7 @@ SECP256K1_INLINE static int secp256k1_fe_is_zero(const secp256k1_fe_t *a) { return (t[0] | t[1] | t[2] | t[3] | t[4]) == 0; } -SECP256K1_INLINE static int secp256k1_fe_is_odd(const secp256k1_fe_t *a) { +SECP256K1_INLINE static int secp256k1_fe_is_odd(const secp256k1_fe *a) { #ifdef VERIFY VERIFY_CHECK(a->normalized); secp256k1_fe_verify(a); @@ -258,7 +253,7 @@ SECP256K1_INLINE static int secp256k1_fe_is_odd(const secp256k1_fe_t *a) { return a->n[0] & 1; } -SECP256K1_INLINE static void secp256k1_fe_clear(secp256k1_fe_t *a) { +SECP256K1_INLINE static void secp256k1_fe_clear(secp256k1_fe *a) { int i; #ifdef VERIFY a->magnitude = 0; @@ -269,7 +264,7 @@ SECP256K1_INLINE static void secp256k1_fe_clear(secp256k1_fe_t *a) { } } -static int secp256k1_fe_cmp_var(const secp256k1_fe_t *a, const secp256k1_fe_t *b) { +static int secp256k1_fe_cmp_var(const secp256k1_fe *a, const secp256k1_fe *b) { int i; #ifdef VERIFY VERIFY_CHECK(a->normalized); @@ -288,17 +283,41 @@ static int secp256k1_fe_cmp_var(const secp256k1_fe_t *a, const secp256k1_fe_t *b return 0; } -static int secp256k1_fe_set_b32(secp256k1_fe_t *r, const unsigned char *a) { - int i; - r->n[0] = r->n[1] = r->n[2] = r->n[3] = r->n[4] = 0; - for (i=0; i<32; i++) { - int j; - for (j=0; j<2; j++) { - int limb = (8*i+4*j)/52; - int shift = (8*i+4*j)%52; - r->n[limb] |= (uint64_t)((a[31-i] >> (4*j)) & 0xF) << shift; - } - } +static int secp256k1_fe_set_b32(secp256k1_fe *r, const unsigned char *a) { + r->n[0] = (uint64_t)a[31] + | ((uint64_t)a[30] << 8) + | ((uint64_t)a[29] << 16) + | ((uint64_t)a[28] << 24) + | ((uint64_t)a[27] << 32) + | ((uint64_t)a[26] << 40) + | ((uint64_t)(a[25] & 0xF) << 48); + r->n[1] = (uint64_t)((a[25] >> 4) & 0xF) + | ((uint64_t)a[24] << 4) + | ((uint64_t)a[23] << 12) + | ((uint64_t)a[22] << 20) + | ((uint64_t)a[21] << 28) + | ((uint64_t)a[20] << 36) + | ((uint64_t)a[19] << 44); + r->n[2] = (uint64_t)a[18] + | ((uint64_t)a[17] << 8) + | ((uint64_t)a[16] << 16) + | ((uint64_t)a[15] << 24) + | ((uint64_t)a[14] << 32) + | ((uint64_t)a[13] << 40) + | ((uint64_t)(a[12] & 0xF) << 48); + r->n[3] = (uint64_t)((a[12] >> 4) & 0xF) + | ((uint64_t)a[11] << 4) + | ((uint64_t)a[10] << 12) + | ((uint64_t)a[9] << 20) + | ((uint64_t)a[8] << 28) + | ((uint64_t)a[7] << 36) + | ((uint64_t)a[6] << 44); + r->n[4] = (uint64_t)a[5] + | ((uint64_t)a[4] << 8) + | ((uint64_t)a[3] << 16) + | ((uint64_t)a[2] << 24) + | ((uint64_t)a[1] << 32) + | ((uint64_t)a[0] << 40); if (r->n[4] == 0x0FFFFFFFFFFFFULL && (r->n[3] & r->n[2] & r->n[1]) == 0xFFFFFFFFFFFFFULL && r->n[0] >= 0xFFFFEFFFFFC2FULL) { return 0; } @@ -311,25 +330,46 @@ static int secp256k1_fe_set_b32(secp256k1_fe_t *r, const unsigned char *a) { } /** Convert a field element to a 32-byte big endian value. Requires the input to be normalized */ -static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe_t *a) { - int i; +static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe *a) { #ifdef VERIFY VERIFY_CHECK(a->normalized); secp256k1_fe_verify(a); #endif - for (i=0; i<32; i++) { - int j; - int c = 0; - for (j=0; j<2; j++) { - int limb = (8*i+4*j)/52; - int shift = (8*i+4*j)%52; - c |= ((a->n[limb] >> shift) & 0xF) << (4 * j); - } - r[31-i] = c; - } + r[0] = (a->n[4] >> 40) & 0xFF; + r[1] = (a->n[4] >> 32) & 0xFF; + r[2] = (a->n[4] >> 24) & 0xFF; + r[3] = (a->n[4] >> 16) & 0xFF; + r[4] = (a->n[4] >> 8) & 0xFF; + r[5] = a->n[4] & 0xFF; + r[6] = (a->n[3] >> 44) & 0xFF; + r[7] = (a->n[3] >> 36) & 0xFF; + r[8] = (a->n[3] >> 28) & 0xFF; + r[9] = (a->n[3] >> 20) & 0xFF; + r[10] = (a->n[3] >> 12) & 0xFF; + r[11] = (a->n[3] >> 4) & 0xFF; + r[12] = ((a->n[2] >> 48) & 0xF) | ((a->n[3] & 0xF) << 4); + r[13] = (a->n[2] >> 40) & 0xFF; + r[14] = (a->n[2] >> 32) & 0xFF; + r[15] = (a->n[2] >> 24) & 0xFF; + r[16] = (a->n[2] >> 16) & 0xFF; + r[17] = (a->n[2] >> 8) & 0xFF; + r[18] = a->n[2] & 0xFF; + r[19] = (a->n[1] >> 44) & 0xFF; + r[20] = (a->n[1] >> 36) & 0xFF; + r[21] = (a->n[1] >> 28) & 0xFF; + r[22] = (a->n[1] >> 20) & 0xFF; + r[23] = (a->n[1] >> 12) & 0xFF; + r[24] = (a->n[1] >> 4) & 0xFF; + r[25] = ((a->n[0] >> 48) & 0xF) | ((a->n[1] & 0xF) << 4); + r[26] = (a->n[0] >> 40) & 0xFF; + r[27] = (a->n[0] >> 32) & 0xFF; + r[28] = (a->n[0] >> 24) & 0xFF; + r[29] = (a->n[0] >> 16) & 0xFF; + r[30] = (a->n[0] >> 8) & 0xFF; + r[31] = a->n[0] & 0xFF; } -SECP256K1_INLINE static void secp256k1_fe_negate(secp256k1_fe_t *r, const secp256k1_fe_t *a, int m) { +SECP256K1_INLINE static void secp256k1_fe_negate(secp256k1_fe *r, const secp256k1_fe *a, int m) { #ifdef VERIFY VERIFY_CHECK(a->magnitude <= m); secp256k1_fe_verify(a); @@ -346,7 +386,7 @@ SECP256K1_INLINE static void secp256k1_fe_negate(secp256k1_fe_t *r, const secp25 #endif } -SECP256K1_INLINE static void secp256k1_fe_mul_int(secp256k1_fe_t *r, int a) { +SECP256K1_INLINE static void secp256k1_fe_mul_int(secp256k1_fe *r, int a) { r->n[0] *= a; r->n[1] *= a; r->n[2] *= a; @@ -359,7 +399,7 @@ SECP256K1_INLINE static void secp256k1_fe_mul_int(secp256k1_fe_t *r, int a) { #endif } -SECP256K1_INLINE static void secp256k1_fe_add(secp256k1_fe_t *r, const secp256k1_fe_t *a) { +SECP256K1_INLINE static void secp256k1_fe_add(secp256k1_fe *r, const secp256k1_fe *a) { #ifdef VERIFY secp256k1_fe_verify(a); #endif @@ -375,7 +415,7 @@ SECP256K1_INLINE static void secp256k1_fe_add(secp256k1_fe_t *r, const secp256k1 #endif } -static void secp256k1_fe_mul(secp256k1_fe_t *r, const secp256k1_fe_t *a, const secp256k1_fe_t * SECP256K1_RESTRICT b) { +static void secp256k1_fe_mul(secp256k1_fe *r, const secp256k1_fe *a, const secp256k1_fe * SECP256K1_RESTRICT b) { #ifdef VERIFY VERIFY_CHECK(a->magnitude <= 8); VERIFY_CHECK(b->magnitude <= 8); @@ -391,7 +431,7 @@ static void secp256k1_fe_mul(secp256k1_fe_t *r, const secp256k1_fe_t *a, const s #endif } -static void secp256k1_fe_sqr(secp256k1_fe_t *r, const secp256k1_fe_t *a) { +static void secp256k1_fe_sqr(secp256k1_fe *r, const secp256k1_fe *a) { #ifdef VERIFY VERIFY_CHECK(a->magnitude <= 8); secp256k1_fe_verify(a); @@ -404,7 +444,7 @@ static void secp256k1_fe_sqr(secp256k1_fe_t *r, const secp256k1_fe_t *a) { #endif } -static SECP256K1_INLINE void secp256k1_fe_cmov(secp256k1_fe_t *r, const secp256k1_fe_t *a, int flag) { +static SECP256K1_INLINE void secp256k1_fe_cmov(secp256k1_fe *r, const secp256k1_fe *a, int flag) { uint64_t mask0, mask1; mask0 = flag + ~((uint64_t)0); mask1 = ~mask0; @@ -414,12 +454,14 @@ static SECP256K1_INLINE void secp256k1_fe_cmov(secp256k1_fe_t *r, const secp256k r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1); r->n[4] = (r->n[4] & mask0) | (a->n[4] & mask1); #ifdef VERIFY - r->magnitude = (r->magnitude & mask0) | (a->magnitude & mask1); - r->normalized = (r->normalized & mask0) | (a->normalized & mask1); + if (a->magnitude > r->magnitude) { + r->magnitude = a->magnitude; + } + r->normalized &= a->normalized; #endif } -static SECP256K1_INLINE void secp256k1_fe_storage_cmov(secp256k1_fe_storage_t *r, const secp256k1_fe_storage_t *a, int flag) { +static SECP256K1_INLINE void secp256k1_fe_storage_cmov(secp256k1_fe_storage *r, const secp256k1_fe_storage *a, int flag) { uint64_t mask0, mask1; mask0 = flag + ~((uint64_t)0); mask1 = ~mask0; @@ -429,7 +471,7 @@ static SECP256K1_INLINE void secp256k1_fe_storage_cmov(secp256k1_fe_storage_t *r r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1); } -static void secp256k1_fe_to_storage(secp256k1_fe_storage_t *r, const secp256k1_fe_t *a) { +static void secp256k1_fe_to_storage(secp256k1_fe_storage *r, const secp256k1_fe *a) { #ifdef VERIFY VERIFY_CHECK(a->normalized); #endif @@ -439,7 +481,7 @@ static void secp256k1_fe_to_storage(secp256k1_fe_storage_t *r, const secp256k1_f r->n[3] = a->n[3] >> 36 | a->n[4] << 16; } -static SECP256K1_INLINE void secp256k1_fe_from_storage(secp256k1_fe_t *r, const secp256k1_fe_storage_t *a) { +static SECP256K1_INLINE void secp256k1_fe_from_storage(secp256k1_fe *r, const secp256k1_fe_storage *a) { r->n[0] = a->n[0] & 0xFFFFFFFFFFFFFULL; r->n[1] = a->n[0] >> 52 | ((a->n[1] << 12) & 0xFFFFFFFFFFFFFULL); r->n[2] = a->n[1] >> 40 | ((a->n[2] << 24) & 0xFFFFFFFFFFFFFULL); @@ -451,4 +493,4 @@ static SECP256K1_INLINE void secp256k1_fe_from_storage(secp256k1_fe_t *r, const #endif } -#endif +#endif /* SECP256K1_FIELD_REPR_IMPL_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/field_5x52_int128_impl.h b/src/cryptoconditions/src/include/secp256k1/src/field_5x52_int128_impl.h index 9280bb5ea..95a0d1791 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/field_5x52_int128_impl.h +++ b/src/cryptoconditions/src/include/secp256k1/src/field_5x52_int128_impl.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_FIELD_INNER5X52_IMPL_H_ -#define _SECP256K1_FIELD_INNER5X52_IMPL_H_ +#ifndef SECP256K1_FIELD_INNER5X52_IMPL_H +#define SECP256K1_FIELD_INNER5X52_IMPL_H #include @@ -137,7 +137,7 @@ SECP256K1_INLINE static void secp256k1_fe_mul_inner(uint64_t *r, const uint64_t VERIFY_BITS(r[2], 52); VERIFY_BITS(c, 63); /* [d 0 0 0 t4 t3+c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - c += d * R + t3;; + c += d * R + t3; VERIFY_BITS(c, 100); /* [t4 c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ r[3] = c & M; c >>= 52; @@ -259,7 +259,7 @@ SECP256K1_INLINE static void secp256k1_fe_sqr_inner(uint64_t *r, const uint64_t VERIFY_BITS(c, 63); /* [d 0 0 0 t4 t3+c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - c += d * R + t3;; + c += d * R + t3; VERIFY_BITS(c, 100); /* [t4 c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ r[3] = c & M; c >>= 52; @@ -274,4 +274,4 @@ SECP256K1_INLINE static void secp256k1_fe_sqr_inner(uint64_t *r, const uint64_t /* [r4 r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ } -#endif +#endif /* SECP256K1_FIELD_INNER5X52_IMPL_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/field_impl.h b/src/cryptoconditions/src/include/secp256k1/src/field_impl.h index e6ec11e8f..20428648a 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/field_impl.h +++ b/src/cryptoconditions/src/include/secp256k1/src/field_impl.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_FIELD_IMPL_H_ -#define _SECP256K1_FIELD_IMPL_H_ +#ifndef SECP256K1_FIELD_IMPL_H +#define SECP256K1_FIELD_IMPL_H #if defined HAVE_CONFIG_H #include "libsecp256k1-config.h" @@ -21,15 +21,31 @@ #error "Please select field implementation" #endif -SECP256K1_INLINE static int secp256k1_fe_equal_var(const secp256k1_fe_t *a, const secp256k1_fe_t *b) { - secp256k1_fe_t na; +SECP256K1_INLINE static int secp256k1_fe_equal(const secp256k1_fe *a, const secp256k1_fe *b) { + secp256k1_fe na; + secp256k1_fe_negate(&na, a, 1); + secp256k1_fe_add(&na, b); + return secp256k1_fe_normalizes_to_zero(&na); +} + +SECP256K1_INLINE static int secp256k1_fe_equal_var(const secp256k1_fe *a, const secp256k1_fe *b) { + secp256k1_fe na; secp256k1_fe_negate(&na, a, 1); secp256k1_fe_add(&na, b); return secp256k1_fe_normalizes_to_zero_var(&na); } -static int secp256k1_fe_sqrt_var(secp256k1_fe_t *r, const secp256k1_fe_t *a) { - secp256k1_fe_t x2, x3, x6, x9, x11, x22, x44, x88, x176, x220, x223, t1; +static int secp256k1_fe_sqrt(secp256k1_fe *r, const secp256k1_fe *a) { + /** Given that p is congruent to 3 mod 4, we can compute the square root of + * a mod p as the (p+1)/4'th power of a. + * + * As (p+1)/4 is an even number, it will have the same result for a and for + * (-a). Only one of these two numbers actually has a square root however, + * so we test at the end by squaring and comparing to the input. + * Also because (p+1)/4 is an even number, the computed square root is + * itself always a square (a ** ((p+1)/4) is the square of a ** ((p+1)/8)). + */ + secp256k1_fe x2, x3, x6, x9, x11, x22, x44, x88, x176, x220, x223, t1; int j; /** The binary representation of (p + 1)/4 has 3 blocks of 1s, with lengths in @@ -114,11 +130,11 @@ static int secp256k1_fe_sqrt_var(secp256k1_fe_t *r, const secp256k1_fe_t *a) { /* Check that a square root was actually calculated */ secp256k1_fe_sqr(&t1, r); - return secp256k1_fe_equal_var(&t1, a); + return secp256k1_fe_equal(&t1, a); } -static void secp256k1_fe_inv(secp256k1_fe_t *r, const secp256k1_fe_t *a) { - secp256k1_fe_t x2, x3, x6, x9, x11, x22, x44, x88, x176, x220, x223, t1; +static void secp256k1_fe_inv(secp256k1_fe *r, const secp256k1_fe *a) { + secp256k1_fe x2, x3, x6, x9, x11, x22, x44, x88, x176, x220, x223, t1; int j; /** The binary representation of (p - 2) has 5 blocks of 1s, with lengths in @@ -207,11 +223,15 @@ static void secp256k1_fe_inv(secp256k1_fe_t *r, const secp256k1_fe_t *a) { secp256k1_fe_mul(r, a, &t1); } -static void secp256k1_fe_inv_var(secp256k1_fe_t *r, const secp256k1_fe_t *a) { +static void secp256k1_fe_inv_var(secp256k1_fe *r, const secp256k1_fe *a) { #if defined(USE_FIELD_INV_BUILTIN) secp256k1_fe_inv(r, a); #elif defined(USE_FIELD_INV_NUM) - secp256k1_num_t n, m; + secp256k1_num n, m; + static const secp256k1_fe negone = SECP256K1_FE_CONST( + 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, + 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFEUL, 0xFFFFFC2EUL + ); /* secp256k1 field prime, value p defined in "Standards for Efficient Cryptography" (SEC2) 2.7.1. */ static const unsigned char prime[32] = { 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, @@ -220,21 +240,28 @@ static void secp256k1_fe_inv_var(secp256k1_fe_t *r, const secp256k1_fe_t *a) { 0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F }; unsigned char b[32]; - secp256k1_fe_t c = *a; + int res; + secp256k1_fe c = *a; secp256k1_fe_normalize_var(&c); secp256k1_fe_get_b32(b, &c); secp256k1_num_set_bin(&n, b, 32); secp256k1_num_set_bin(&m, prime, 32); secp256k1_num_mod_inverse(&n, &n, &m); secp256k1_num_get_bin(b, 32, &n); - VERIFY_CHECK(secp256k1_fe_set_b32(r, b)); + res = secp256k1_fe_set_b32(r, b); + (void)res; + VERIFY_CHECK(res); + /* Verify the result is the (unique) valid inverse using non-GMP code. */ + secp256k1_fe_mul(&c, &c, r); + secp256k1_fe_add(&c, &negone); + CHECK(secp256k1_fe_normalizes_to_zero_var(&c)); #else #error "Please select field inverse implementation" #endif } -static void secp256k1_fe_inv_all_var(size_t len, secp256k1_fe_t *r, const secp256k1_fe_t *a) { - secp256k1_fe_t u; +static void secp256k1_fe_inv_all_var(secp256k1_fe *r, const secp256k1_fe *a, size_t len) { + secp256k1_fe u; size_t i; if (len < 1) { return; @@ -252,7 +279,7 @@ static void secp256k1_fe_inv_all_var(size_t len, secp256k1_fe_t *r, const secp25 secp256k1_fe_inv_var(&u, &r[--i]); while (i > 0) { - int j = i--; + size_t j = i--; secp256k1_fe_mul(&r[j], &r[i], &u); secp256k1_fe_mul(&u, &u, &a[j]); } @@ -260,4 +287,29 @@ static void secp256k1_fe_inv_all_var(size_t len, secp256k1_fe_t *r, const secp25 r[0] = u; } +static int secp256k1_fe_is_quad_var(const secp256k1_fe *a) { +#ifndef USE_NUM_NONE + unsigned char b[32]; + secp256k1_num n; + secp256k1_num m; + /* secp256k1 field prime, value p defined in "Standards for Efficient Cryptography" (SEC2) 2.7.1. */ + static const unsigned char prime[32] = { + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F + }; + + secp256k1_fe c = *a; + secp256k1_fe_normalize_var(&c); + secp256k1_fe_get_b32(b, &c); + secp256k1_num_set_bin(&n, b, 32); + secp256k1_num_set_bin(&m, prime, 32); + return secp256k1_num_jacobi(&n, &m) >= 0; +#else + secp256k1_fe r; + return secp256k1_fe_sqrt(&r, a); #endif +} + +#endif /* SECP256K1_FIELD_IMPL_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/gen_context.c b/src/cryptoconditions/src/include/secp256k1/src/gen_context.c new file mode 100644 index 000000000..1835fd491 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/gen_context.c @@ -0,0 +1,74 @@ +/********************************************************************** + * Copyright (c) 2013, 2014, 2015 Thomas Daede, Cory Fields * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#define USE_BASIC_CONFIG 1 + +#include "basic-config.h" +#include "include/secp256k1.h" +#include "field_impl.h" +#include "scalar_impl.h" +#include "group_impl.h" +#include "ecmult_gen_impl.h" + +static void default_error_callback_fn(const char* str, void* data) { + (void)data; + fprintf(stderr, "[libsecp256k1] internal consistency check failed: %s\n", str); + abort(); +} + +static const secp256k1_callback default_error_callback = { + default_error_callback_fn, + NULL +}; + +int main(int argc, char **argv) { + secp256k1_ecmult_gen_context ctx; + int inner; + int outer; + FILE* fp; + + (void)argc; + (void)argv; + + fp = fopen("src/ecmult_static_context.h","w"); + if (fp == NULL) { + fprintf(stderr, "Could not open src/ecmult_static_context.h for writing!\n"); + return -1; + } + + fprintf(fp, "#ifndef _SECP256K1_ECMULT_STATIC_CONTEXT_\n"); + fprintf(fp, "#define _SECP256K1_ECMULT_STATIC_CONTEXT_\n"); + fprintf(fp, "#include \"group.h\"\n"); + fprintf(fp, "#define SC SECP256K1_GE_STORAGE_CONST\n"); + fprintf(fp, "static const secp256k1_ge_storage secp256k1_ecmult_static_context[64][16] = {\n"); + + secp256k1_ecmult_gen_context_init(&ctx); + secp256k1_ecmult_gen_context_build(&ctx, &default_error_callback); + for(outer = 0; outer != 64; outer++) { + fprintf(fp,"{\n"); + for(inner = 0; inner != 16; inner++) { + fprintf(fp," SC(%uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu)", SECP256K1_GE_STORAGE_CONST_GET((*ctx.prec)[outer][inner])); + if (inner != 15) { + fprintf(fp,",\n"); + } else { + fprintf(fp,"\n"); + } + } + if (outer != 63) { + fprintf(fp,"},\n"); + } else { + fprintf(fp,"}\n"); + } + } + fprintf(fp,"};\n"); + secp256k1_ecmult_gen_context_clear(&ctx); + + fprintf(fp, "#undef SC\n"); + fprintf(fp, "#endif\n"); + fclose(fp); + + return 0; +} diff --git a/src/cryptoconditions/src/include/secp256k1/src/group.h b/src/cryptoconditions/src/include/secp256k1/src/group.h index 0b08b3b99..ea1302deb 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/group.h +++ b/src/cryptoconditions/src/include/secp256k1/src/group.h @@ -4,118 +4,141 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_GROUP_ -#define _SECP256K1_GROUP_ +#ifndef SECP256K1_GROUP_H +#define SECP256K1_GROUP_H #include "num.h" #include "field.h" /** A group element of the secp256k1 curve, in affine coordinates. */ typedef struct { - secp256k1_fe_t x; - secp256k1_fe_t y; + secp256k1_fe x; + secp256k1_fe y; int infinity; /* whether this represents the point at infinity */ -} secp256k1_ge_t; +} secp256k1_ge; #define SECP256K1_GE_CONST(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) {SECP256K1_FE_CONST((a),(b),(c),(d),(e),(f),(g),(h)), SECP256K1_FE_CONST((i),(j),(k),(l),(m),(n),(o),(p)), 0} #define SECP256K1_GE_CONST_INFINITY {SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), 1} /** A group element of the secp256k1 curve, in jacobian coordinates. */ typedef struct { - secp256k1_fe_t x; /* actual X: x/z^2 */ - secp256k1_fe_t y; /* actual Y: y/z^3 */ - secp256k1_fe_t z; + secp256k1_fe x; /* actual X: x/z^2 */ + secp256k1_fe y; /* actual Y: y/z^3 */ + secp256k1_fe z; int infinity; /* whether this represents the point at infinity */ -} secp256k1_gej_t; +} secp256k1_gej; #define SECP256K1_GEJ_CONST(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) {SECP256K1_FE_CONST((a),(b),(c),(d),(e),(f),(g),(h)), SECP256K1_FE_CONST((i),(j),(k),(l),(m),(n),(o),(p)), SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1), 0} #define SECP256K1_GEJ_CONST_INFINITY {SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), 1} typedef struct { - secp256k1_fe_storage_t x; - secp256k1_fe_storage_t y; -} secp256k1_ge_storage_t; + secp256k1_fe_storage x; + secp256k1_fe_storage y; +} secp256k1_ge_storage; #define SECP256K1_GE_STORAGE_CONST(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) {SECP256K1_FE_STORAGE_CONST((a),(b),(c),(d),(e),(f),(g),(h)), SECP256K1_FE_STORAGE_CONST((i),(j),(k),(l),(m),(n),(o),(p))} -/** Set a group element equal to the point at infinity */ -static void secp256k1_ge_set_infinity(secp256k1_ge_t *r); +#define SECP256K1_GE_STORAGE_CONST_GET(t) SECP256K1_FE_STORAGE_CONST_GET(t.x), SECP256K1_FE_STORAGE_CONST_GET(t.y) /** Set a group element equal to the point with given X and Y coordinates */ -static void secp256k1_ge_set_xy(secp256k1_ge_t *r, const secp256k1_fe_t *x, const secp256k1_fe_t *y); +static void secp256k1_ge_set_xy(secp256k1_ge *r, const secp256k1_fe *x, const secp256k1_fe *y); + +/** Set a group element (affine) equal to the point with the given X coordinate + * and a Y coordinate that is a quadratic residue modulo p. The return value + * is true iff a coordinate with the given X coordinate exists. + */ +static int secp256k1_ge_set_xquad(secp256k1_ge *r, const secp256k1_fe *x); /** Set a group element (affine) equal to the point with the given X coordinate, and given oddness * for Y. Return value indicates whether the result is valid. */ -static int secp256k1_ge_set_xo_var(secp256k1_ge_t *r, const secp256k1_fe_t *x, int odd); +static int secp256k1_ge_set_xo_var(secp256k1_ge *r, const secp256k1_fe *x, int odd); /** Check whether a group element is the point at infinity. */ -static int secp256k1_ge_is_infinity(const secp256k1_ge_t *a); +static int secp256k1_ge_is_infinity(const secp256k1_ge *a); /** Check whether a group element is valid (i.e., on the curve). */ -static int secp256k1_ge_is_valid_var(const secp256k1_ge_t *a); +static int secp256k1_ge_is_valid_var(const secp256k1_ge *a); -static void secp256k1_ge_neg(secp256k1_ge_t *r, const secp256k1_ge_t *a); +static void secp256k1_ge_neg(secp256k1_ge *r, const secp256k1_ge *a); /** Set a group element equal to another which is given in jacobian coordinates */ -static void secp256k1_ge_set_gej(secp256k1_ge_t *r, secp256k1_gej_t *a); +static void secp256k1_ge_set_gej(secp256k1_ge *r, secp256k1_gej *a); /** Set a batch of group elements equal to the inputs given in jacobian coordinates */ -static void secp256k1_ge_set_all_gej_var(size_t len, secp256k1_ge_t *r, const secp256k1_gej_t *a); +static void secp256k1_ge_set_all_gej_var(secp256k1_ge *r, const secp256k1_gej *a, size_t len, const secp256k1_callback *cb); +/** Set a batch of group elements equal to the inputs given in jacobian + * coordinates (with known z-ratios). zr must contain the known z-ratios such + * that mul(a[i].z, zr[i+1]) == a[i+1].z. zr[0] is ignored. */ +static void secp256k1_ge_set_table_gej_var(secp256k1_ge *r, const secp256k1_gej *a, const secp256k1_fe *zr, size_t len); + +/** Bring a batch inputs given in jacobian coordinates (with known z-ratios) to + * the same global z "denominator". zr must contain the known z-ratios such + * that mul(a[i].z, zr[i+1]) == a[i+1].z. zr[0] is ignored. The x and y + * coordinates of the result are stored in r, the common z coordinate is + * stored in globalz. */ +static void secp256k1_ge_globalz_set_table_gej(size_t len, secp256k1_ge *r, secp256k1_fe *globalz, const secp256k1_gej *a, const secp256k1_fe *zr); /** Set a group element (jacobian) equal to the point at infinity. */ -static void secp256k1_gej_set_infinity(secp256k1_gej_t *r); - -/** Set a group element (jacobian) equal to the point with given X and Y coordinates. */ -static void secp256k1_gej_set_xy(secp256k1_gej_t *r, const secp256k1_fe_t *x, const secp256k1_fe_t *y); +static void secp256k1_gej_set_infinity(secp256k1_gej *r); /** Set a group element (jacobian) equal to another which is given in affine coordinates. */ -static void secp256k1_gej_set_ge(secp256k1_gej_t *r, const secp256k1_ge_t *a); +static void secp256k1_gej_set_ge(secp256k1_gej *r, const secp256k1_ge *a); /** Compare the X coordinate of a group element (jacobian). */ -static int secp256k1_gej_eq_x_var(const secp256k1_fe_t *x, const secp256k1_gej_t *a); +static int secp256k1_gej_eq_x_var(const secp256k1_fe *x, const secp256k1_gej *a); /** Set r equal to the inverse of a (i.e., mirrored around the X axis) */ -static void secp256k1_gej_neg(secp256k1_gej_t *r, const secp256k1_gej_t *a); +static void secp256k1_gej_neg(secp256k1_gej *r, const secp256k1_gej *a); /** Check whether a group element is the point at infinity. */ -static int secp256k1_gej_is_infinity(const secp256k1_gej_t *a); +static int secp256k1_gej_is_infinity(const secp256k1_gej *a); -/** Set r equal to the double of a. */ -static void secp256k1_gej_double_var(secp256k1_gej_t *r, const secp256k1_gej_t *a); +/** Check whether a group element's y coordinate is a quadratic residue. */ +static int secp256k1_gej_has_quad_y_var(const secp256k1_gej *a); -/** Set r equal to the sum of a and b. */ -static void secp256k1_gej_add_var(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_gej_t *b); +/** Set r equal to the double of a. If rzr is not-NULL, r->z = a->z * *rzr (where infinity means an implicit z = 0). + * a may not be zero. Constant time. */ +static void secp256k1_gej_double_nonzero(secp256k1_gej *r, const secp256k1_gej *a, secp256k1_fe *rzr); + +/** Set r equal to the double of a. If rzr is not-NULL, r->z = a->z * *rzr (where infinity means an implicit z = 0). */ +static void secp256k1_gej_double_var(secp256k1_gej *r, const secp256k1_gej *a, secp256k1_fe *rzr); + +/** Set r equal to the sum of a and b. If rzr is non-NULL, r->z = a->z * *rzr (a cannot be infinity in that case). */ +static void secp256k1_gej_add_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_gej *b, secp256k1_fe *rzr); /** Set r equal to the sum of a and b (with b given in affine coordinates, and not infinity). */ -static void secp256k1_gej_add_ge(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_ge_t *b); +static void secp256k1_gej_add_ge(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b); /** Set r equal to the sum of a and b (with b given in affine coordinates). This is more efficient than secp256k1_gej_add_var. It is identical to secp256k1_gej_add_ge but without constant-time - guarantee, and b is allowed to be infinity. */ -static void secp256k1_gej_add_ge_var(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_ge_t *b); + guarantee, and b is allowed to be infinity. If rzr is non-NULL, r->z = a->z * *rzr (a cannot be infinity in that case). */ +static void secp256k1_gej_add_ge_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b, secp256k1_fe *rzr); + +/** Set r equal to the sum of a and b (with the inverse of b's Z coordinate passed as bzinv). */ +static void secp256k1_gej_add_zinv_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b, const secp256k1_fe *bzinv); #ifdef USE_ENDOMORPHISM /** Set r to be equal to lambda times a, where lambda is chosen in a way such that this is very fast. */ -static void secp256k1_gej_mul_lambda(secp256k1_gej_t *r, const secp256k1_gej_t *a); +static void secp256k1_ge_mul_lambda(secp256k1_ge *r, const secp256k1_ge *a); #endif -/** Clear a secp256k1_gej_t to prevent leaking sensitive information. */ -static void secp256k1_gej_clear(secp256k1_gej_t *r); +/** Clear a secp256k1_gej to prevent leaking sensitive information. */ +static void secp256k1_gej_clear(secp256k1_gej *r); -/** Clear a secp256k1_ge_t to prevent leaking sensitive information. */ -static void secp256k1_ge_clear(secp256k1_ge_t *r); +/** Clear a secp256k1_ge to prevent leaking sensitive information. */ +static void secp256k1_ge_clear(secp256k1_ge *r); /** Convert a group element to the storage type. */ -static void secp256k1_ge_to_storage(secp256k1_ge_storage_t *r, const secp256k1_ge_t*); +static void secp256k1_ge_to_storage(secp256k1_ge_storage *r, const secp256k1_ge *a); /** Convert a group element back from the storage type. */ -static void secp256k1_ge_from_storage(secp256k1_ge_t *r, const secp256k1_ge_storage_t*); +static void secp256k1_ge_from_storage(secp256k1_ge *r, const secp256k1_ge_storage *a); /** If flag is true, set *r equal to *a; otherwise leave it. Constant-time. */ -static void secp256k1_ge_storage_cmov(secp256k1_ge_storage_t *r, const secp256k1_ge_storage_t *a, int flag); +static void secp256k1_ge_storage_cmov(secp256k1_ge_storage *r, const secp256k1_ge_storage *a, int flag); /** Rescale a jacobian point by b which must be non-zero. Constant-time. */ -static void secp256k1_gej_rescale(secp256k1_gej_t *r, const secp256k1_fe_t *b); +static void secp256k1_gej_rescale(secp256k1_gej *r, const secp256k1_fe *b); -#endif +#endif /* SECP256K1_GROUP_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/group_impl.h b/src/cryptoconditions/src/include/secp256k1/src/group_impl.h index 0f64576fb..b31b6c12e 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/group_impl.h +++ b/src/cryptoconditions/src/include/secp256k1/src/group_impl.h @@ -4,47 +4,101 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_GROUP_IMPL_H_ -#define _SECP256K1_GROUP_IMPL_H_ - -#include +#ifndef SECP256K1_GROUP_IMPL_H +#define SECP256K1_GROUP_IMPL_H #include "num.h" #include "field.h" #include "group.h" +/* These points can be generated in sage as follows: + * + * 0. Setup a worksheet with the following parameters. + * b = 4 # whatever CURVE_B will be set to + * F = FiniteField (0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F) + * C = EllipticCurve ([F (0), F (b)]) + * + * 1. Determine all the small orders available to you. (If there are + * no satisfactory ones, go back and change b.) + * print C.order().factor(limit=1000) + * + * 2. Choose an order as one of the prime factors listed in the above step. + * (You can also multiply some to get a composite order, though the + * tests will crash trying to invert scalars during signing.) We take a + * random point and scale it to drop its order to the desired value. + * There is some probability this won't work; just try again. + * order = 199 + * P = C.random_point() + * P = (int(P.order()) / int(order)) * P + * assert(P.order() == order) + * + * 3. Print the values. You'll need to use a vim macro or something to + * split the hex output into 4-byte chunks. + * print "%x %x" % P.xy() + */ +#if defined(EXHAUSTIVE_TEST_ORDER) +# if EXHAUSTIVE_TEST_ORDER == 199 +const secp256k1_ge secp256k1_ge_const_g = SECP256K1_GE_CONST( + 0xFA7CC9A7, 0x0737F2DB, 0xA749DD39, 0x2B4FB069, + 0x3B017A7D, 0xA808C2F1, 0xFB12940C, 0x9EA66C18, + 0x78AC123A, 0x5ED8AEF3, 0x8732BC91, 0x1F3A2868, + 0x48DF246C, 0x808DAE72, 0xCFE52572, 0x7F0501ED +); + +const int CURVE_B = 4; +# elif EXHAUSTIVE_TEST_ORDER == 13 +const secp256k1_ge secp256k1_ge_const_g = SECP256K1_GE_CONST( + 0xedc60018, 0xa51a786b, 0x2ea91f4d, 0x4c9416c0, + 0x9de54c3b, 0xa1316554, 0x6cf4345c, 0x7277ef15, + 0x54cb1b6b, 0xdc8c1273, 0x087844ea, 0x43f4603e, + 0x0eaf9a43, 0xf6effe55, 0x939f806d, 0x37adf8ac +); +const int CURVE_B = 2; +# else +# error No known generator for the specified exhaustive test group order. +# endif +#else /** Generator for secp256k1, value 'g' defined in * "Standards for Efficient Cryptography" (SEC2) 2.7.1. */ -static const secp256k1_ge_t secp256k1_ge_const_g = SECP256K1_GE_CONST( +static const secp256k1_ge secp256k1_ge_const_g = SECP256K1_GE_CONST( 0x79BE667EUL, 0xF9DCBBACUL, 0x55A06295UL, 0xCE870B07UL, 0x029BFCDBUL, 0x2DCE28D9UL, 0x59F2815BUL, 0x16F81798UL, 0x483ADA77UL, 0x26A3C465UL, 0x5DA4FBFCUL, 0x0E1108A8UL, 0xFD17B448UL, 0xA6855419UL, 0x9C47D08FUL, 0xFB10D4B8UL ); -static void secp256k1_ge_set_infinity(secp256k1_ge_t *r) { - r->infinity = 1; +const int CURVE_B = 7; +#endif + +static void secp256k1_ge_set_gej_zinv(secp256k1_ge *r, const secp256k1_gej *a, const secp256k1_fe *zi) { + secp256k1_fe zi2; + secp256k1_fe zi3; + secp256k1_fe_sqr(&zi2, zi); + secp256k1_fe_mul(&zi3, &zi2, zi); + secp256k1_fe_mul(&r->x, &a->x, &zi2); + secp256k1_fe_mul(&r->y, &a->y, &zi3); + r->infinity = a->infinity; } -static void secp256k1_ge_set_xy(secp256k1_ge_t *r, const secp256k1_fe_t *x, const secp256k1_fe_t *y) { +static void secp256k1_ge_set_xy(secp256k1_ge *r, const secp256k1_fe *x, const secp256k1_fe *y) { r->infinity = 0; r->x = *x; r->y = *y; } -static int secp256k1_ge_is_infinity(const secp256k1_ge_t *a) { +static int secp256k1_ge_is_infinity(const secp256k1_ge *a) { return a->infinity; } -static void secp256k1_ge_neg(secp256k1_ge_t *r, const secp256k1_ge_t *a) { +static void secp256k1_ge_neg(secp256k1_ge *r, const secp256k1_ge *a) { *r = *a; secp256k1_fe_normalize_weak(&r->y); secp256k1_fe_negate(&r->y, &r->y, 1); } -static void secp256k1_ge_set_gej(secp256k1_ge_t *r, secp256k1_gej_t *a) { - secp256k1_fe_t z2, z3; +static void secp256k1_ge_set_gej(secp256k1_ge *r, secp256k1_gej *a) { + secp256k1_fe z2, z3; r->infinity = a->infinity; secp256k1_fe_inv(&a->z, &a->z); secp256k1_fe_sqr(&z2, &a->z); @@ -56,8 +110,8 @@ static void secp256k1_ge_set_gej(secp256k1_ge_t *r, secp256k1_gej_t *a) { r->y = a->y; } -static void secp256k1_ge_set_gej_var(secp256k1_ge_t *r, secp256k1_gej_t *a) { - secp256k1_fe_t z2, z3; +static void secp256k1_ge_set_gej_var(secp256k1_ge *r, secp256k1_gej *a) { + secp256k1_fe z2, z3; r->infinity = a->infinity; if (a->infinity) { return; @@ -72,73 +126,106 @@ static void secp256k1_ge_set_gej_var(secp256k1_ge_t *r, secp256k1_gej_t *a) { r->y = a->y; } -static void secp256k1_ge_set_all_gej_var(size_t len, secp256k1_ge_t *r, const secp256k1_gej_t *a) { - secp256k1_fe_t *az; - secp256k1_fe_t *azi; +static void secp256k1_ge_set_all_gej_var(secp256k1_ge *r, const secp256k1_gej *a, size_t len, const secp256k1_callback *cb) { + secp256k1_fe *az; + secp256k1_fe *azi; size_t i; size_t count = 0; - az = (secp256k1_fe_t *)checked_malloc(sizeof(secp256k1_fe_t) * len); + az = (secp256k1_fe *)checked_malloc(cb, sizeof(secp256k1_fe) * len); for (i = 0; i < len; i++) { if (!a[i].infinity) { az[count++] = a[i].z; } } - azi = (secp256k1_fe_t *)checked_malloc(sizeof(secp256k1_fe_t) * count); - secp256k1_fe_inv_all_var(count, azi, az); + azi = (secp256k1_fe *)checked_malloc(cb, sizeof(secp256k1_fe) * count); + secp256k1_fe_inv_all_var(azi, az, count); free(az); count = 0; for (i = 0; i < len; i++) { r[i].infinity = a[i].infinity; if (!a[i].infinity) { - secp256k1_fe_t zi2, zi3; - secp256k1_fe_t *zi = &azi[count++]; - secp256k1_fe_sqr(&zi2, zi); - secp256k1_fe_mul(&zi3, &zi2, zi); - secp256k1_fe_mul(&r[i].x, &a[i].x, &zi2); - secp256k1_fe_mul(&r[i].y, &a[i].y, &zi3); + secp256k1_ge_set_gej_zinv(&r[i], &a[i], &azi[count++]); } } free(azi); } -static void secp256k1_gej_set_infinity(secp256k1_gej_t *r) { +static void secp256k1_ge_set_table_gej_var(secp256k1_ge *r, const secp256k1_gej *a, const secp256k1_fe *zr, size_t len) { + size_t i = len - 1; + secp256k1_fe zi; + + if (len > 0) { + /* Compute the inverse of the last z coordinate, and use it to compute the last affine output. */ + secp256k1_fe_inv(&zi, &a[i].z); + secp256k1_ge_set_gej_zinv(&r[i], &a[i], &zi); + + /* Work out way backwards, using the z-ratios to scale the x/y values. */ + while (i > 0) { + secp256k1_fe_mul(&zi, &zi, &zr[i]); + i--; + secp256k1_ge_set_gej_zinv(&r[i], &a[i], &zi); + } + } +} + +static void secp256k1_ge_globalz_set_table_gej(size_t len, secp256k1_ge *r, secp256k1_fe *globalz, const secp256k1_gej *a, const secp256k1_fe *zr) { + size_t i = len - 1; + secp256k1_fe zs; + + if (len > 0) { + /* The z of the final point gives us the "global Z" for the table. */ + r[i].x = a[i].x; + r[i].y = a[i].y; + *globalz = a[i].z; + r[i].infinity = 0; + zs = zr[i]; + + /* Work our way backwards, using the z-ratios to scale the x/y values. */ + while (i > 0) { + if (i != len - 1) { + secp256k1_fe_mul(&zs, &zs, &zr[i]); + } + i--; + secp256k1_ge_set_gej_zinv(&r[i], &a[i], &zs); + } + } +} + +static void secp256k1_gej_set_infinity(secp256k1_gej *r) { r->infinity = 1; - secp256k1_fe_set_int(&r->x, 0); - secp256k1_fe_set_int(&r->y, 0); - secp256k1_fe_set_int(&r->z, 0); + secp256k1_fe_clear(&r->x); + secp256k1_fe_clear(&r->y); + secp256k1_fe_clear(&r->z); } -static void secp256k1_gej_set_xy(secp256k1_gej_t *r, const secp256k1_fe_t *x, const secp256k1_fe_t *y) { - r->infinity = 0; - r->x = *x; - r->y = *y; - secp256k1_fe_set_int(&r->z, 1); -} - -static void secp256k1_gej_clear(secp256k1_gej_t *r) { +static void secp256k1_gej_clear(secp256k1_gej *r) { r->infinity = 0; secp256k1_fe_clear(&r->x); secp256k1_fe_clear(&r->y); secp256k1_fe_clear(&r->z); } -static void secp256k1_ge_clear(secp256k1_ge_t *r) { +static void secp256k1_ge_clear(secp256k1_ge *r) { r->infinity = 0; secp256k1_fe_clear(&r->x); secp256k1_fe_clear(&r->y); } -static int secp256k1_ge_set_xo_var(secp256k1_ge_t *r, const secp256k1_fe_t *x, int odd) { - secp256k1_fe_t x2, x3, c; +static int secp256k1_ge_set_xquad(secp256k1_ge *r, const secp256k1_fe *x) { + secp256k1_fe x2, x3, c; r->x = *x; secp256k1_fe_sqr(&x2, x); secp256k1_fe_mul(&x3, x, &x2); r->infinity = 0; - secp256k1_fe_set_int(&c, 7); + secp256k1_fe_set_int(&c, CURVE_B); secp256k1_fe_add(&c, &x3); - if (!secp256k1_fe_sqrt_var(&r->y, &c)) { + return secp256k1_fe_sqrt(&r->y, &c); +} + +static int secp256k1_ge_set_xo_var(secp256k1_ge *r, const secp256k1_fe *x, int odd) { + if (!secp256k1_ge_set_xquad(r, x)) { return 0; } secp256k1_fe_normalize_var(&r->y); @@ -146,24 +233,25 @@ static int secp256k1_ge_set_xo_var(secp256k1_ge_t *r, const secp256k1_fe_t *x, i secp256k1_fe_negate(&r->y, &r->y, 1); } return 1; + } -static void secp256k1_gej_set_ge(secp256k1_gej_t *r, const secp256k1_ge_t *a) { +static void secp256k1_gej_set_ge(secp256k1_gej *r, const secp256k1_ge *a) { r->infinity = a->infinity; r->x = a->x; r->y = a->y; secp256k1_fe_set_int(&r->z, 1); } -static int secp256k1_gej_eq_x_var(const secp256k1_fe_t *x, const secp256k1_gej_t *a) { - secp256k1_fe_t r, r2; +static int secp256k1_gej_eq_x_var(const secp256k1_fe *x, const secp256k1_gej *a) { + secp256k1_fe r, r2; VERIFY_CHECK(!a->infinity); secp256k1_fe_sqr(&r, &a->z); secp256k1_fe_mul(&r, &r, x); r2 = a->x; secp256k1_fe_normalize_weak(&r2); return secp256k1_fe_equal_var(&r, &r2); } -static void secp256k1_gej_neg(secp256k1_gej_t *r, const secp256k1_gej_t *a) { +static void secp256k1_gej_neg(secp256k1_gej *r, const secp256k1_gej *a) { r->infinity = a->infinity; r->x = a->x; r->y = a->y; @@ -172,12 +260,12 @@ static void secp256k1_gej_neg(secp256k1_gej_t *r, const secp256k1_gej_t *a) { secp256k1_fe_negate(&r->y, &r->y, 1); } -static int secp256k1_gej_is_infinity(const secp256k1_gej_t *a) { +static int secp256k1_gej_is_infinity(const secp256k1_gej *a) { return a->infinity; } -static int secp256k1_gej_is_valid_var(const secp256k1_gej_t *a) { - secp256k1_fe_t y2, x3, z2, z6; +static int secp256k1_gej_is_valid_var(const secp256k1_gej *a) { + secp256k1_fe y2, x3, z2, z6; if (a->infinity) { return 0; } @@ -190,38 +278,59 @@ static int secp256k1_gej_is_valid_var(const secp256k1_gej_t *a) { secp256k1_fe_sqr(&x3, &a->x); secp256k1_fe_mul(&x3, &x3, &a->x); secp256k1_fe_sqr(&z2, &a->z); secp256k1_fe_sqr(&z6, &z2); secp256k1_fe_mul(&z6, &z6, &z2); - secp256k1_fe_mul_int(&z6, 7); + secp256k1_fe_mul_int(&z6, CURVE_B); secp256k1_fe_add(&x3, &z6); secp256k1_fe_normalize_weak(&x3); return secp256k1_fe_equal_var(&y2, &x3); } -static int secp256k1_ge_is_valid_var(const secp256k1_ge_t *a) { - secp256k1_fe_t y2, x3, c; +static int secp256k1_ge_is_valid_var(const secp256k1_ge *a) { + secp256k1_fe y2, x3, c; if (a->infinity) { return 0; } /* y^2 = x^3 + 7 */ secp256k1_fe_sqr(&y2, &a->y); secp256k1_fe_sqr(&x3, &a->x); secp256k1_fe_mul(&x3, &x3, &a->x); - secp256k1_fe_set_int(&c, 7); + secp256k1_fe_set_int(&c, CURVE_B); secp256k1_fe_add(&x3, &c); secp256k1_fe_normalize_weak(&x3); return secp256k1_fe_equal_var(&y2, &x3); } -static void secp256k1_gej_double_var(secp256k1_gej_t *r, const secp256k1_gej_t *a) { - /* Operations: 3 mul, 4 sqr, 0 normalize, 12 mul_int/add/negate */ - secp256k1_fe_t t1,t2,t3,t4; +static void secp256k1_gej_double_var(secp256k1_gej *r, const secp256k1_gej *a, secp256k1_fe *rzr) { + /* Operations: 3 mul, 4 sqr, 0 normalize, 12 mul_int/add/negate. + * + * Note that there is an implementation described at + * https://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-dbl-2009-l + * which trades a multiply for a square, but in practice this is actually slower, + * mainly because it requires more normalizations. + */ + secp256k1_fe t1,t2,t3,t4; /** For secp256k1, 2Q is infinity if and only if Q is infinity. This is because if 2Q = infinity, * Q must equal -Q, or that Q.y == -(Q.y), or Q.y is 0. For a point on y^2 = x^3 + 7 to have * y=0, x^3 must be -7 mod p. However, -7 has no cube root mod p. + * + * Having said this, if this function receives a point on a sextic twist, e.g. by + * a fault attack, it is possible for y to be 0. This happens for y^2 = x^3 + 6, + * since -6 does have a cube root mod p. For this point, this function will not set + * the infinity flag even though the point doubles to infinity, and the result + * point will be gibberish (z = 0 but infinity = 0). */ r->infinity = a->infinity; if (r->infinity) { + if (rzr != NULL) { + secp256k1_fe_set_int(rzr, 1); + } return; } + if (rzr != NULL) { + *rzr = a->y; + secp256k1_fe_normalize_weak(rzr); + secp256k1_fe_mul_int(rzr, 2); + } + secp256k1_fe_mul(&r->z, &a->z, &a->y); secp256k1_fe_mul_int(&r->z, 2); /* Z' = 2*Y*Z (2) */ secp256k1_fe_sqr(&t1, &a->x); @@ -244,17 +353,29 @@ static void secp256k1_gej_double_var(secp256k1_gej_t *r, const secp256k1_gej_t * secp256k1_fe_add(&r->y, &t2); /* Y' = 36*X^3*Y^2 - 27*X^6 - 8*Y^4 (4) */ } -static void secp256k1_gej_add_var(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_gej_t *b) { +static SECP256K1_INLINE void secp256k1_gej_double_nonzero(secp256k1_gej *r, const secp256k1_gej *a, secp256k1_fe *rzr) { + VERIFY_CHECK(!secp256k1_gej_is_infinity(a)); + secp256k1_gej_double_var(r, a, rzr); +} + +static void secp256k1_gej_add_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_gej *b, secp256k1_fe *rzr) { /* Operations: 12 mul, 4 sqr, 2 normalize, 12 mul_int/add/negate */ - secp256k1_fe_t z22, z12, u1, u2, s1, s2, h, i, i2, h2, h3, t; + secp256k1_fe z22, z12, u1, u2, s1, s2, h, i, i2, h2, h3, t; + if (a->infinity) { + VERIFY_CHECK(rzr == NULL); *r = *b; return; } + if (b->infinity) { + if (rzr != NULL) { + secp256k1_fe_set_int(rzr, 1); + } *r = *a; return; } + r->infinity = 0; secp256k1_fe_sqr(&z22, &b->z); secp256k1_fe_sqr(&z12, &a->z); @@ -266,8 +387,11 @@ static void secp256k1_gej_add_var(secp256k1_gej_t *r, const secp256k1_gej_t *a, secp256k1_fe_negate(&i, &s1, 1); secp256k1_fe_add(&i, &s2); if (secp256k1_fe_normalizes_to_zero_var(&h)) { if (secp256k1_fe_normalizes_to_zero_var(&i)) { - secp256k1_gej_double_var(r, a); + secp256k1_gej_double_var(r, a, rzr); } else { + if (rzr != NULL) { + secp256k1_fe_set_int(rzr, 0); + } r->infinity = 1; } return; @@ -275,7 +399,11 @@ static void secp256k1_gej_add_var(secp256k1_gej_t *r, const secp256k1_gej_t *a, secp256k1_fe_sqr(&i2, &i); secp256k1_fe_sqr(&h2, &h); secp256k1_fe_mul(&h3, &h, &h2); - secp256k1_fe_mul(&r->z, &a->z, &b->z); secp256k1_fe_mul(&r->z, &r->z, &h); + secp256k1_fe_mul(&h, &h, &b->z); + if (rzr != NULL) { + *rzr = h; + } + secp256k1_fe_mul(&r->z, &a->z, &h); secp256k1_fe_mul(&t, &u1, &h2); r->x = t; secp256k1_fe_mul_int(&r->x, 2); secp256k1_fe_add(&r->x, &h3); secp256k1_fe_negate(&r->x, &r->x, 3); secp256k1_fe_add(&r->x, &i2); secp256k1_fe_negate(&r->y, &r->x, 5); secp256k1_fe_add(&r->y, &t); secp256k1_fe_mul(&r->y, &r->y, &i); @@ -283,21 +411,23 @@ static void secp256k1_gej_add_var(secp256k1_gej_t *r, const secp256k1_gej_t *a, secp256k1_fe_add(&r->y, &h3); } -static void secp256k1_gej_add_ge_var(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_ge_t *b) { +static void secp256k1_gej_add_ge_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b, secp256k1_fe *rzr) { /* 8 mul, 3 sqr, 4 normalize, 12 mul_int/add/negate */ - secp256k1_fe_t z12, u1, u2, s1, s2, h, i, i2, h2, h3, t; + secp256k1_fe z12, u1, u2, s1, s2, h, i, i2, h2, h3, t; if (a->infinity) { - r->infinity = b->infinity; - r->x = b->x; - r->y = b->y; - secp256k1_fe_set_int(&r->z, 1); + VERIFY_CHECK(rzr == NULL); + secp256k1_gej_set_ge(r, b); return; } if (b->infinity) { + if (rzr != NULL) { + secp256k1_fe_set_int(rzr, 1); + } *r = *a; return; } r->infinity = 0; + secp256k1_fe_sqr(&z12, &a->z); u1 = a->x; secp256k1_fe_normalize_weak(&u1); secp256k1_fe_mul(&u2, &b->x, &z12); @@ -307,7 +437,69 @@ static void secp256k1_gej_add_ge_var(secp256k1_gej_t *r, const secp256k1_gej_t * secp256k1_fe_negate(&i, &s1, 1); secp256k1_fe_add(&i, &s2); if (secp256k1_fe_normalizes_to_zero_var(&h)) { if (secp256k1_fe_normalizes_to_zero_var(&i)) { - secp256k1_gej_double_var(r, a); + secp256k1_gej_double_var(r, a, rzr); + } else { + if (rzr != NULL) { + secp256k1_fe_set_int(rzr, 0); + } + r->infinity = 1; + } + return; + } + secp256k1_fe_sqr(&i2, &i); + secp256k1_fe_sqr(&h2, &h); + secp256k1_fe_mul(&h3, &h, &h2); + if (rzr != NULL) { + *rzr = h; + } + secp256k1_fe_mul(&r->z, &a->z, &h); + secp256k1_fe_mul(&t, &u1, &h2); + r->x = t; secp256k1_fe_mul_int(&r->x, 2); secp256k1_fe_add(&r->x, &h3); secp256k1_fe_negate(&r->x, &r->x, 3); secp256k1_fe_add(&r->x, &i2); + secp256k1_fe_negate(&r->y, &r->x, 5); secp256k1_fe_add(&r->y, &t); secp256k1_fe_mul(&r->y, &r->y, &i); + secp256k1_fe_mul(&h3, &h3, &s1); secp256k1_fe_negate(&h3, &h3, 1); + secp256k1_fe_add(&r->y, &h3); +} + +static void secp256k1_gej_add_zinv_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b, const secp256k1_fe *bzinv) { + /* 9 mul, 3 sqr, 4 normalize, 12 mul_int/add/negate */ + secp256k1_fe az, z12, u1, u2, s1, s2, h, i, i2, h2, h3, t; + + if (b->infinity) { + *r = *a; + return; + } + if (a->infinity) { + secp256k1_fe bzinv2, bzinv3; + r->infinity = b->infinity; + secp256k1_fe_sqr(&bzinv2, bzinv); + secp256k1_fe_mul(&bzinv3, &bzinv2, bzinv); + secp256k1_fe_mul(&r->x, &b->x, &bzinv2); + secp256k1_fe_mul(&r->y, &b->y, &bzinv3); + secp256k1_fe_set_int(&r->z, 1); + return; + } + r->infinity = 0; + + /** We need to calculate (rx,ry,rz) = (ax,ay,az) + (bx,by,1/bzinv). Due to + * secp256k1's isomorphism we can multiply the Z coordinates on both sides + * by bzinv, and get: (rx,ry,rz*bzinv) = (ax,ay,az*bzinv) + (bx,by,1). + * This means that (rx,ry,rz) can be calculated as + * (ax,ay,az*bzinv) + (bx,by,1), when not applying the bzinv factor to rz. + * The variable az below holds the modified Z coordinate for a, which is used + * for the computation of rx and ry, but not for rz. + */ + secp256k1_fe_mul(&az, &a->z, bzinv); + + secp256k1_fe_sqr(&z12, &az); + u1 = a->x; secp256k1_fe_normalize_weak(&u1); + secp256k1_fe_mul(&u2, &b->x, &z12); + s1 = a->y; secp256k1_fe_normalize_weak(&s1); + secp256k1_fe_mul(&s2, &b->y, &z12); secp256k1_fe_mul(&s2, &s2, &az); + secp256k1_fe_negate(&h, &u1, 1); secp256k1_fe_add(&h, &u2); + secp256k1_fe_negate(&i, &s1, 1); secp256k1_fe_add(&i, &s2); + if (secp256k1_fe_normalizes_to_zero_var(&h)) { + if (secp256k1_fe_normalizes_to_zero_var(&i)) { + secp256k1_gej_double_var(r, a, NULL); } else { r->infinity = 1; } @@ -324,11 +516,13 @@ static void secp256k1_gej_add_ge_var(secp256k1_gej_t *r, const secp256k1_gej_t * secp256k1_fe_add(&r->y, &h3); } -static void secp256k1_gej_add_ge(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_ge_t *b) { - /* Operations: 7 mul, 5 sqr, 5 normalize, 17 mul_int/add/negate/cmov */ - static const secp256k1_fe_t fe_1 = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1); - secp256k1_fe_t zz, u1, u2, s1, s2, z, t, m, n, q, rr; - int infinity; + +static void secp256k1_gej_add_ge(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b) { + /* Operations: 7 mul, 5 sqr, 4 normalize, 21 mul_int/add/negate/cmov */ + static const secp256k1_fe fe_1 = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1); + secp256k1_fe zz, u1, u2, s1, s2, t, tt, m, n, q, rr; + secp256k1_fe m_alt, rr_alt; + int infinity, degenerate; VERIFY_CHECK(!b->infinity); VERIFY_CHECK(a->infinity == 0 || a->infinity == 1); @@ -352,53 +546,102 @@ static void secp256k1_gej_add_ge(secp256k1_gej_t *r, const secp256k1_gej_t *a, c * Y3 = 4*(R*(3*Q-2*R^2)-M^4) * Z3 = 2*M*Z * (Note that the paper uses xi = Xi / Zi and yi = Yi / Zi instead.) + * + * This formula has the benefit of being the same for both addition + * of distinct points and doubling. However, it breaks down in the + * case that either point is infinity, or that y1 = -y2. We handle + * these cases in the following ways: + * + * - If b is infinity we simply bail by means of a VERIFY_CHECK. + * + * - If a is infinity, we detect this, and at the end of the + * computation replace the result (which will be meaningless, + * but we compute to be constant-time) with b.x : b.y : 1. + * + * - If a = -b, we have y1 = -y2, which is a degenerate case. + * But here the answer is infinity, so we simply set the + * infinity flag of the result, overriding the computed values + * without even needing to cmov. + * + * - If y1 = -y2 but x1 != x2, which does occur thanks to certain + * properties of our curve (specifically, 1 has nontrivial cube + * roots in our field, and the curve equation has no x coefficient) + * then the answer is not infinity but also not given by the above + * equation. In this case, we cmov in place an alternate expression + * for lambda. Specifically (y1 - y2)/(x1 - x2). Where both these + * expressions for lambda are defined, they are equal, and can be + * obtained from each other by multiplication by (y1 + y2)/(y1 + y2) + * then substitution of x^3 + 7 for y^2 (using the curve equation). + * For all pairs of nonzero points (a, b) at least one is defined, + * so this covers everything. */ secp256k1_fe_sqr(&zz, &a->z); /* z = Z1^2 */ u1 = a->x; secp256k1_fe_normalize_weak(&u1); /* u1 = U1 = X1*Z2^2 (1) */ secp256k1_fe_mul(&u2, &b->x, &zz); /* u2 = U2 = X2*Z1^2 (1) */ s1 = a->y; secp256k1_fe_normalize_weak(&s1); /* s1 = S1 = Y1*Z2^3 (1) */ - secp256k1_fe_mul(&s2, &b->y, &zz); /* s2 = Y2*Z2^2 (1) */ + secp256k1_fe_mul(&s2, &b->y, &zz); /* s2 = Y2*Z1^2 (1) */ secp256k1_fe_mul(&s2, &s2, &a->z); /* s2 = S2 = Y2*Z1^3 (1) */ - z = a->z; /* z = Z = Z1*Z2 (8) */ t = u1; secp256k1_fe_add(&t, &u2); /* t = T = U1+U2 (2) */ m = s1; secp256k1_fe_add(&m, &s2); /* m = M = S1+S2 (2) */ - secp256k1_fe_sqr(&n, &m); /* n = M^2 (1) */ - secp256k1_fe_mul(&q, &n, &t); /* q = Q = T*M^2 (1) */ - secp256k1_fe_sqr(&n, &n); /* n = M^4 (1) */ secp256k1_fe_sqr(&rr, &t); /* rr = T^2 (1) */ - secp256k1_fe_mul(&t, &u1, &u2); secp256k1_fe_negate(&t, &t, 1); /* t = -U1*U2 (2) */ - secp256k1_fe_add(&rr, &t); /* rr = R = T^2-U1*U2 (3) */ - secp256k1_fe_sqr(&t, &rr); /* t = R^2 (1) */ - secp256k1_fe_mul(&r->z, &m, &z); /* r->z = M*Z (1) */ - infinity = secp256k1_fe_normalizes_to_zero(&r->z) * (1 - a->infinity); - secp256k1_fe_mul_int(&r->z, 2 * (1 - a->infinity)); /* r->z = Z3 = 2*M*Z (2) */ - r->x = t; /* r->x = R^2 (1) */ - secp256k1_fe_negate(&q, &q, 1); /* q = -Q (2) */ - secp256k1_fe_add(&r->x, &q); /* r->x = R^2-Q (3) */ - secp256k1_fe_normalize(&r->x); - secp256k1_fe_mul_int(&q, 3); /* q = -3*Q (6) */ - secp256k1_fe_mul_int(&t, 2); /* t = 2*R^2 (2) */ - secp256k1_fe_add(&t, &q); /* t = 2*R^2-3*Q (8) */ - secp256k1_fe_mul(&t, &t, &rr); /* t = R*(2*R^2-3*Q) (1) */ - secp256k1_fe_add(&t, &n); /* t = R*(2*R^2-3*Q)+M^4 (2) */ - secp256k1_fe_negate(&r->y, &t, 2); /* r->y = R*(3*Q-2*R^2)-M^4 (3) */ - secp256k1_fe_normalize_weak(&r->y); - secp256k1_fe_mul_int(&r->x, 4 * (1 - a->infinity)); /* r->x = X3 = 4*(R^2-Q) */ - secp256k1_fe_mul_int(&r->y, 4 * (1 - a->infinity)); /* r->y = Y3 = 4*R*(3*Q-2*R^2)-4*M^4 (4) */ + secp256k1_fe_negate(&m_alt, &u2, 1); /* Malt = -X2*Z1^2 */ + secp256k1_fe_mul(&tt, &u1, &m_alt); /* tt = -U1*U2 (2) */ + secp256k1_fe_add(&rr, &tt); /* rr = R = T^2-U1*U2 (3) */ + /** If lambda = R/M = 0/0 we have a problem (except in the "trivial" + * case that Z = z1z2 = 0, and this is special-cased later on). */ + degenerate = secp256k1_fe_normalizes_to_zero(&m) & + secp256k1_fe_normalizes_to_zero(&rr); + /* This only occurs when y1 == -y2 and x1^3 == x2^3, but x1 != x2. + * This means either x1 == beta*x2 or beta*x1 == x2, where beta is + * a nontrivial cube root of one. In either case, an alternate + * non-indeterminate expression for lambda is (y1 - y2)/(x1 - x2), + * so we set R/M equal to this. */ + rr_alt = s1; + secp256k1_fe_mul_int(&rr_alt, 2); /* rr = Y1*Z2^3 - Y2*Z1^3 (2) */ + secp256k1_fe_add(&m_alt, &u1); /* Malt = X1*Z2^2 - X2*Z1^2 */ - /** In case a->infinity == 1, the above code results in r->x, r->y, and r->z all equal to 0. - * Replace r with b->x, b->y, 1 in that case. - */ + secp256k1_fe_cmov(&rr_alt, &rr, !degenerate); + secp256k1_fe_cmov(&m_alt, &m, !degenerate); + /* Now Ralt / Malt = lambda and is guaranteed not to be 0/0. + * From here on out Ralt and Malt represent the numerator + * and denominator of lambda; R and M represent the explicit + * expressions x1^2 + x2^2 + x1x2 and y1 + y2. */ + secp256k1_fe_sqr(&n, &m_alt); /* n = Malt^2 (1) */ + secp256k1_fe_mul(&q, &n, &t); /* q = Q = T*Malt^2 (1) */ + /* These two lines use the observation that either M == Malt or M == 0, + * so M^3 * Malt is either Malt^4 (which is computed by squaring), or + * zero (which is "computed" by cmov). So the cost is one squaring + * versus two multiplications. */ + secp256k1_fe_sqr(&n, &n); + secp256k1_fe_cmov(&n, &m, degenerate); /* n = M^3 * Malt (2) */ + secp256k1_fe_sqr(&t, &rr_alt); /* t = Ralt^2 (1) */ + secp256k1_fe_mul(&r->z, &a->z, &m_alt); /* r->z = Malt*Z (1) */ + infinity = secp256k1_fe_normalizes_to_zero(&r->z) * (1 - a->infinity); + secp256k1_fe_mul_int(&r->z, 2); /* r->z = Z3 = 2*Malt*Z (2) */ + secp256k1_fe_negate(&q, &q, 1); /* q = -Q (2) */ + secp256k1_fe_add(&t, &q); /* t = Ralt^2-Q (3) */ + secp256k1_fe_normalize_weak(&t); + r->x = t; /* r->x = Ralt^2-Q (1) */ + secp256k1_fe_mul_int(&t, 2); /* t = 2*x3 (2) */ + secp256k1_fe_add(&t, &q); /* t = 2*x3 - Q: (4) */ + secp256k1_fe_mul(&t, &t, &rr_alt); /* t = Ralt*(2*x3 - Q) (1) */ + secp256k1_fe_add(&t, &n); /* t = Ralt*(2*x3 - Q) + M^3*Malt (3) */ + secp256k1_fe_negate(&r->y, &t, 3); /* r->y = Ralt*(Q - 2x3) - M^3*Malt (4) */ + secp256k1_fe_normalize_weak(&r->y); + secp256k1_fe_mul_int(&r->x, 4); /* r->x = X3 = 4*(Ralt^2-Q) */ + secp256k1_fe_mul_int(&r->y, 4); /* r->y = Y3 = 4*Ralt*(Q - 2x3) - 4*M^3*Malt (4) */ + + /** In case a->infinity == 1, replace r with (b->x, b->y, 1). */ secp256k1_fe_cmov(&r->x, &b->x, a->infinity); secp256k1_fe_cmov(&r->y, &b->y, a->infinity); secp256k1_fe_cmov(&r->z, &fe_1, a->infinity); r->infinity = infinity; } -static void secp256k1_gej_rescale(secp256k1_gej_t *r, const secp256k1_fe_t *s) { +static void secp256k1_gej_rescale(secp256k1_gej *r, const secp256k1_fe *s) { /* Operations: 4 mul, 1 sqr */ - secp256k1_fe_t zz; + secp256k1_fe zz; VERIFY_CHECK(!secp256k1_fe_is_zero(s)); secp256k1_fe_sqr(&zz, s); secp256k1_fe_mul(&r->x, &r->x, &zz); /* r->x *= s^2 */ @@ -407,8 +650,8 @@ static void secp256k1_gej_rescale(secp256k1_gej_t *r, const secp256k1_fe_t *s) { secp256k1_fe_mul(&r->z, &r->z, s); /* r->z *= s */ } -static void secp256k1_ge_to_storage(secp256k1_ge_storage_t *r, const secp256k1_ge_t *a) { - secp256k1_fe_t x, y; +static void secp256k1_ge_to_storage(secp256k1_ge_storage *r, const secp256k1_ge *a) { + secp256k1_fe x, y; VERIFY_CHECK(!a->infinity); x = a->x; secp256k1_fe_normalize(&x); @@ -418,20 +661,20 @@ static void secp256k1_ge_to_storage(secp256k1_ge_storage_t *r, const secp256k1_g secp256k1_fe_to_storage(&r->y, &y); } -static void secp256k1_ge_from_storage(secp256k1_ge_t *r, const secp256k1_ge_storage_t *a) { +static void secp256k1_ge_from_storage(secp256k1_ge *r, const secp256k1_ge_storage *a) { secp256k1_fe_from_storage(&r->x, &a->x); secp256k1_fe_from_storage(&r->y, &a->y); r->infinity = 0; } -static SECP256K1_INLINE void secp256k1_ge_storage_cmov(secp256k1_ge_storage_t *r, const secp256k1_ge_storage_t *a, int flag) { +static SECP256K1_INLINE void secp256k1_ge_storage_cmov(secp256k1_ge_storage *r, const secp256k1_ge_storage *a, int flag) { secp256k1_fe_storage_cmov(&r->x, &a->x, flag); secp256k1_fe_storage_cmov(&r->y, &a->y, flag); } #ifdef USE_ENDOMORPHISM -static void secp256k1_gej_mul_lambda(secp256k1_gej_t *r, const secp256k1_gej_t *a) { - static const secp256k1_fe_t beta = SECP256K1_FE_CONST( +static void secp256k1_ge_mul_lambda(secp256k1_ge *r, const secp256k1_ge *a) { + static const secp256k1_fe beta = SECP256K1_FE_CONST( 0x7ae96a2bul, 0x657c0710ul, 0x6e64479eul, 0xac3434e9ul, 0x9cf04975ul, 0x12f58995ul, 0xc1396c28ul, 0x719501eeul ); @@ -440,4 +683,18 @@ static void secp256k1_gej_mul_lambda(secp256k1_gej_t *r, const secp256k1_gej_t * } #endif -#endif +static int secp256k1_gej_has_quad_y_var(const secp256k1_gej *a) { + secp256k1_fe yz; + + if (a->infinity) { + return 0; + } + + /* We rely on the fact that the Jacobi symbol of 1 / a->z^3 is the same as + * that of a->z. Thus a->y / a->z^3 is a quadratic residue iff a->y * a->z + is */ + secp256k1_fe_mul(&yz, &a->y, &a->z); + return secp256k1_fe_is_quad_var(&yz); +} + +#endif /* SECP256K1_GROUP_IMPL_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/hash.h b/src/cryptoconditions/src/include/secp256k1/src/hash.h index 843423d7f..de26e4b89 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/hash.h +++ b/src/cryptoconditions/src/include/secp256k1/src/hash.h @@ -4,38 +4,38 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_HASH_ -#define _SECP256K1_HASH_ +#ifndef SECP256K1_HASH_H +#define SECP256K1_HASH_H #include #include typedef struct { - uint32_t s[32]; + uint32_t s[8]; uint32_t buf[16]; /* In big endian */ size_t bytes; -} secp256k1_sha256_t; +} secp256k1_sha256; -static void secp256k1_sha256_initialize(secp256k1_sha256_t *hash); -static void secp256k1_sha256_write(secp256k1_sha256_t *hash, const unsigned char *data, size_t size); -static void secp256k1_sha256_finalize(secp256k1_sha256_t *hash, unsigned char *out32); +static void secp256k1_sha256_initialize(secp256k1_sha256 *hash); +static void secp256k1_sha256_write(secp256k1_sha256 *hash, const unsigned char *data, size_t size); +static void secp256k1_sha256_finalize(secp256k1_sha256 *hash, unsigned char *out32); typedef struct { - secp256k1_sha256_t inner, outer; -} secp256k1_hmac_sha256_t; + secp256k1_sha256 inner, outer; +} secp256k1_hmac_sha256; -static void secp256k1_hmac_sha256_initialize(secp256k1_hmac_sha256_t *hash, const unsigned char *key, size_t size); -static void secp256k1_hmac_sha256_write(secp256k1_hmac_sha256_t *hash, const unsigned char *data, size_t size); -static void secp256k1_hmac_sha256_finalize(secp256k1_hmac_sha256_t *hash, unsigned char *out32); +static void secp256k1_hmac_sha256_initialize(secp256k1_hmac_sha256 *hash, const unsigned char *key, size_t size); +static void secp256k1_hmac_sha256_write(secp256k1_hmac_sha256 *hash, const unsigned char *data, size_t size); +static void secp256k1_hmac_sha256_finalize(secp256k1_hmac_sha256 *hash, unsigned char *out32); typedef struct { unsigned char v[32]; unsigned char k[32]; int retry; -} secp256k1_rfc6979_hmac_sha256_t; +} secp256k1_rfc6979_hmac_sha256; -static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha256_t *rng, const unsigned char *key, size_t keylen, const unsigned char *msg, size_t msglen, const unsigned char *rnd, size_t rndlen); -static void secp256k1_rfc6979_hmac_sha256_generate(secp256k1_rfc6979_hmac_sha256_t *rng, unsigned char *out, size_t outlen); -static void secp256k1_rfc6979_hmac_sha256_finalize(secp256k1_rfc6979_hmac_sha256_t *rng); +static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha256 *rng, const unsigned char *key, size_t keylen); +static void secp256k1_rfc6979_hmac_sha256_generate(secp256k1_rfc6979_hmac_sha256 *rng, unsigned char *out, size_t outlen); +static void secp256k1_rfc6979_hmac_sha256_finalize(secp256k1_rfc6979_hmac_sha256 *rng); -#endif +#endif /* SECP256K1_HASH_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/hash_impl.h b/src/cryptoconditions/src/include/secp256k1/src/hash_impl.h index 9828827bc..c06db9e33 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/hash_impl.h +++ b/src/cryptoconditions/src/include/secp256k1/src/hash_impl.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_HASH_IMPL_H_ -#define _SECP256K1_HASH_IMPL_H_ +#ifndef SECP256K1_HASH_IMPL_H +#define SECP256K1_HASH_IMPL_H #include "hash.h" @@ -33,7 +33,7 @@ #define BE32(p) ((((p) & 0xFF) << 24) | (((p) & 0xFF00) << 8) | (((p) & 0xFF0000) >> 8) | (((p) & 0xFF000000) >> 24)) #endif -static void secp256k1_sha256_initialize(secp256k1_sha256_t *hash) { +static void secp256k1_sha256_initialize(secp256k1_sha256 *hash) { hash->s[0] = 0x6a09e667ul; hash->s[1] = 0xbb67ae85ul; hash->s[2] = 0x3c6ef372ul; @@ -128,7 +128,7 @@ static void secp256k1_sha256_transform(uint32_t* s, const uint32_t* chunk) { s[7] += h; } -static void secp256k1_sha256_write(secp256k1_sha256_t *hash, const unsigned char *data, size_t len) { +static void secp256k1_sha256_write(secp256k1_sha256 *hash, const unsigned char *data, size_t len) { size_t bufsize = hash->bytes & 0x3F; hash->bytes += len; while (bufsize + len >= 64) { @@ -145,7 +145,7 @@ static void secp256k1_sha256_write(secp256k1_sha256_t *hash, const unsigned char } } -static void secp256k1_sha256_finalize(secp256k1_sha256_t *hash, unsigned char *out32) { +static void secp256k1_sha256_finalize(secp256k1_sha256 *hash, unsigned char *out32) { static const unsigned char pad[64] = {0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; uint32_t sizedesc[2]; uint32_t out[8]; @@ -161,14 +161,14 @@ static void secp256k1_sha256_finalize(secp256k1_sha256_t *hash, unsigned char *o memcpy(out32, (const unsigned char*)out, 32); } -static void secp256k1_hmac_sha256_initialize(secp256k1_hmac_sha256_t *hash, const unsigned char *key, size_t keylen) { +static void secp256k1_hmac_sha256_initialize(secp256k1_hmac_sha256 *hash, const unsigned char *key, size_t keylen) { int n; unsigned char rkey[64]; if (keylen <= 64) { memcpy(rkey, key, keylen); memset(rkey + keylen, 0, 64 - keylen); } else { - secp256k1_sha256_t sha256; + secp256k1_sha256 sha256; secp256k1_sha256_initialize(&sha256); secp256k1_sha256_write(&sha256, key, keylen); secp256k1_sha256_finalize(&sha256, rkey); @@ -189,11 +189,11 @@ static void secp256k1_hmac_sha256_initialize(secp256k1_hmac_sha256_t *hash, cons memset(rkey, 0, 64); } -static void secp256k1_hmac_sha256_write(secp256k1_hmac_sha256_t *hash, const unsigned char *data, size_t size) { +static void secp256k1_hmac_sha256_write(secp256k1_hmac_sha256 *hash, const unsigned char *data, size_t size) { secp256k1_sha256_write(&hash->inner, data, size); } -static void secp256k1_hmac_sha256_finalize(secp256k1_hmac_sha256_t *hash, unsigned char *out32) { +static void secp256k1_hmac_sha256_finalize(secp256k1_hmac_sha256 *hash, unsigned char *out32) { unsigned char temp[32]; secp256k1_sha256_finalize(&hash->inner, temp); secp256k1_sha256_write(&hash->outer, temp, 32); @@ -202,8 +202,8 @@ static void secp256k1_hmac_sha256_finalize(secp256k1_hmac_sha256_t *hash, unsign } -static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha256_t *rng, const unsigned char *key, size_t keylen, const unsigned char *msg, size_t msglen, const unsigned char *rnd, size_t rndlen) { - secp256k1_hmac_sha256_t hmac; +static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha256 *rng, const unsigned char *key, size_t keylen) { + secp256k1_hmac_sha256 hmac; static const unsigned char zero[1] = {0x00}; static const unsigned char one[1] = {0x01}; @@ -215,11 +215,6 @@ static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha2 secp256k1_hmac_sha256_write(&hmac, rng->v, 32); secp256k1_hmac_sha256_write(&hmac, zero, 1); secp256k1_hmac_sha256_write(&hmac, key, keylen); - secp256k1_hmac_sha256_write(&hmac, msg, msglen); - if (rnd && rndlen) { - /* RFC6979 3.6 "Additional data". */ - secp256k1_hmac_sha256_write(&hmac, rnd, rndlen); - } secp256k1_hmac_sha256_finalize(&hmac, rng->k); secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); secp256k1_hmac_sha256_write(&hmac, rng->v, 32); @@ -230,11 +225,6 @@ static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha2 secp256k1_hmac_sha256_write(&hmac, rng->v, 32); secp256k1_hmac_sha256_write(&hmac, one, 1); secp256k1_hmac_sha256_write(&hmac, key, keylen); - secp256k1_hmac_sha256_write(&hmac, msg, msglen); - if (rnd && rndlen) { - /* RFC6979 3.6 "Additional data". */ - secp256k1_hmac_sha256_write(&hmac, rnd, rndlen); - } secp256k1_hmac_sha256_finalize(&hmac, rng->k); secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); secp256k1_hmac_sha256_write(&hmac, rng->v, 32); @@ -242,11 +232,11 @@ static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha2 rng->retry = 0; } -static void secp256k1_rfc6979_hmac_sha256_generate(secp256k1_rfc6979_hmac_sha256_t *rng, unsigned char *out, size_t outlen) { +static void secp256k1_rfc6979_hmac_sha256_generate(secp256k1_rfc6979_hmac_sha256 *rng, unsigned char *out, size_t outlen) { /* RFC6979 3.2.h. */ static const unsigned char zero[1] = {0x00}; if (rng->retry) { - secp256k1_hmac_sha256_t hmac; + secp256k1_hmac_sha256 hmac; secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); secp256k1_hmac_sha256_write(&hmac, rng->v, 32); secp256k1_hmac_sha256_write(&hmac, zero, 1); @@ -257,7 +247,7 @@ static void secp256k1_rfc6979_hmac_sha256_generate(secp256k1_rfc6979_hmac_sha256 } while (outlen > 0) { - secp256k1_hmac_sha256_t hmac; + secp256k1_hmac_sha256 hmac; int now = outlen; secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); secp256k1_hmac_sha256_write(&hmac, rng->v, 32); @@ -273,21 +263,19 @@ static void secp256k1_rfc6979_hmac_sha256_generate(secp256k1_rfc6979_hmac_sha256 rng->retry = 1; } -static void secp256k1_rfc6979_hmac_sha256_finalize(secp256k1_rfc6979_hmac_sha256_t *rng) { +static void secp256k1_rfc6979_hmac_sha256_finalize(secp256k1_rfc6979_hmac_sha256 *rng) { memset(rng->k, 0, 32); memset(rng->v, 0, 32); rng->retry = 0; } - +#undef BE32 #undef Round -#undef sigma0 #undef sigma1 -#undef Sigma0 +#undef sigma0 #undef Sigma1 -#undef Ch +#undef Sigma0 #undef Maj -#undef ReadBE32 -#undef WriteBE32 +#undef Ch -#endif +#endif /* SECP256K1_HASH_IMPL_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/java/org/bitcoin/NativeSecp256k1.java b/src/cryptoconditions/src/include/secp256k1/src/java/org/bitcoin/NativeSecp256k1.java index 90a498eaa..1c67802fb 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/java/org/bitcoin/NativeSecp256k1.java +++ b/src/cryptoconditions/src/include/secp256k1/src/java/org/bitcoin/NativeSecp256k1.java @@ -1,60 +1,446 @@ +/* + * Copyright 2013 Google Inc. + * Copyright 2014-2016 the libsecp256k1 contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.bitcoin; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.math.BigInteger; import com.google.common.base.Preconditions; - +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantReadWriteLock; +import static org.bitcoin.NativeSecp256k1Util.*; /** - * This class holds native methods to handle ECDSA verification. - * You can find an example library that can be used for this at - * https://github.com/sipa/secp256k1 + *

This class holds native methods to handle ECDSA verification.

+ * + *

You can find an example library that can be used for this at https://github.com/bitcoin/secp256k1

+ * + *

To build secp256k1 for use with bitcoinj, run + * `./configure --enable-jni --enable-experimental --enable-module-ecdh` + * and `make` then copy `.libs/libsecp256k1.so` to your system library path + * or point the JVM to the folder containing it with -Djava.library.path + *

*/ public class NativeSecp256k1 { - public static final boolean enabled; - static { - boolean isEnabled = true; - try { - System.loadLibrary("javasecp256k1"); - } catch (UnsatisfiedLinkError e) { - isEnabled = false; - } - enabled = isEnabled; - } - + + private static final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); + private static final Lock r = rwl.readLock(); + private static final Lock w = rwl.writeLock(); private static ThreadLocal nativeECDSABuffer = new ThreadLocal(); /** * Verifies the given secp256k1 signature in native code. * Calling when enabled == false is undefined (probably library not loaded) - * + * * @param data The data which was signed, must be exactly 32 bytes * @param signature The signature * @param pub The public key which did the signing */ - public static boolean verify(byte[] data, byte[] signature, byte[] pub) { + public static boolean verify(byte[] data, byte[] signature, byte[] pub) throws AssertFailException{ Preconditions.checkArgument(data.length == 32 && signature.length <= 520 && pub.length <= 520); ByteBuffer byteBuff = nativeECDSABuffer.get(); - if (byteBuff == null) { - byteBuff = ByteBuffer.allocateDirect(32 + 8 + 520 + 520); + if (byteBuff == null || byteBuff.capacity() < 520) { + byteBuff = ByteBuffer.allocateDirect(520); byteBuff.order(ByteOrder.nativeOrder()); nativeECDSABuffer.set(byteBuff); } byteBuff.rewind(); byteBuff.put(data); - byteBuff.putInt(signature.length); - byteBuff.putInt(pub.length); byteBuff.put(signature); byteBuff.put(pub); - return secp256k1_ecdsa_verify(byteBuff) == 1; + + byte[][] retByteArray; + + r.lock(); + try { + return secp256k1_ecdsa_verify(byteBuff, Secp256k1Context.getContext(), signature.length, pub.length) == 1; + } finally { + r.unlock(); + } } /** - * @param byteBuff signature format is byte[32] data, - * native-endian int signatureLength, native-endian int pubkeyLength, - * byte[signatureLength] signature, byte[pubkeyLength] pub - * @returns 1 for valid signature, anything else for invalid + * libsecp256k1 Create an ECDSA signature. + * + * @param data Message hash, 32 bytes + * @param key Secret key, 32 bytes + * + * Return values + * @param sig byte array of signature */ - private static native int secp256k1_ecdsa_verify(ByteBuffer byteBuff); + public static byte[] sign(byte[] data, byte[] sec) throws AssertFailException{ + Preconditions.checkArgument(data.length == 32 && sec.length <= 32); + + ByteBuffer byteBuff = nativeECDSABuffer.get(); + if (byteBuff == null || byteBuff.capacity() < 32 + 32) { + byteBuff = ByteBuffer.allocateDirect(32 + 32); + byteBuff.order(ByteOrder.nativeOrder()); + nativeECDSABuffer.set(byteBuff); + } + byteBuff.rewind(); + byteBuff.put(data); + byteBuff.put(sec); + + byte[][] retByteArray; + + r.lock(); + try { + retByteArray = secp256k1_ecdsa_sign(byteBuff, Secp256k1Context.getContext()); + } finally { + r.unlock(); + } + + byte[] sigArr = retByteArray[0]; + int sigLen = new BigInteger(new byte[] { retByteArray[1][0] }).intValue(); + int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue(); + + assertEquals(sigArr.length, sigLen, "Got bad signature length."); + + return retVal == 0 ? new byte[0] : sigArr; + } + + /** + * libsecp256k1 Seckey Verify - returns 1 if valid, 0 if invalid + * + * @param seckey ECDSA Secret key, 32 bytes + */ + public static boolean secKeyVerify(byte[] seckey) { + Preconditions.checkArgument(seckey.length == 32); + + ByteBuffer byteBuff = nativeECDSABuffer.get(); + if (byteBuff == null || byteBuff.capacity() < seckey.length) { + byteBuff = ByteBuffer.allocateDirect(seckey.length); + byteBuff.order(ByteOrder.nativeOrder()); + nativeECDSABuffer.set(byteBuff); + } + byteBuff.rewind(); + byteBuff.put(seckey); + + r.lock(); + try { + return secp256k1_ec_seckey_verify(byteBuff,Secp256k1Context.getContext()) == 1; + } finally { + r.unlock(); + } + } + + + /** + * libsecp256k1 Compute Pubkey - computes public key from secret key + * + * @param seckey ECDSA Secret key, 32 bytes + * + * Return values + * @param pubkey ECDSA Public key, 33 or 65 bytes + */ + //TODO add a 'compressed' arg + public static byte[] computePubkey(byte[] seckey) throws AssertFailException{ + Preconditions.checkArgument(seckey.length == 32); + + ByteBuffer byteBuff = nativeECDSABuffer.get(); + if (byteBuff == null || byteBuff.capacity() < seckey.length) { + byteBuff = ByteBuffer.allocateDirect(seckey.length); + byteBuff.order(ByteOrder.nativeOrder()); + nativeECDSABuffer.set(byteBuff); + } + byteBuff.rewind(); + byteBuff.put(seckey); + + byte[][] retByteArray; + + r.lock(); + try { + retByteArray = secp256k1_ec_pubkey_create(byteBuff, Secp256k1Context.getContext()); + } finally { + r.unlock(); + } + + byte[] pubArr = retByteArray[0]; + int pubLen = new BigInteger(new byte[] { retByteArray[1][0] }).intValue(); + int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue(); + + assertEquals(pubArr.length, pubLen, "Got bad pubkey length."); + + return retVal == 0 ? new byte[0]: pubArr; + } + + /** + * libsecp256k1 Cleanup - This destroys the secp256k1 context object + * This should be called at the end of the program for proper cleanup of the context. + */ + public static synchronized void cleanup() { + w.lock(); + try { + secp256k1_destroy_context(Secp256k1Context.getContext()); + } finally { + w.unlock(); + } + } + + public static long cloneContext() { + r.lock(); + try { + return secp256k1_ctx_clone(Secp256k1Context.getContext()); + } finally { r.unlock(); } + } + + /** + * libsecp256k1 PrivKey Tweak-Mul - Tweak privkey by multiplying to it + * + * @param tweak some bytes to tweak with + * @param seckey 32-byte seckey + */ + public static byte[] privKeyTweakMul(byte[] privkey, byte[] tweak) throws AssertFailException{ + Preconditions.checkArgument(privkey.length == 32); + + ByteBuffer byteBuff = nativeECDSABuffer.get(); + if (byteBuff == null || byteBuff.capacity() < privkey.length + tweak.length) { + byteBuff = ByteBuffer.allocateDirect(privkey.length + tweak.length); + byteBuff.order(ByteOrder.nativeOrder()); + nativeECDSABuffer.set(byteBuff); + } + byteBuff.rewind(); + byteBuff.put(privkey); + byteBuff.put(tweak); + + byte[][] retByteArray; + r.lock(); + try { + retByteArray = secp256k1_privkey_tweak_mul(byteBuff,Secp256k1Context.getContext()); + } finally { + r.unlock(); + } + + byte[] privArr = retByteArray[0]; + + int privLen = (byte) new BigInteger(new byte[] { retByteArray[1][0] }).intValue() & 0xFF; + int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue(); + + assertEquals(privArr.length, privLen, "Got bad pubkey length."); + + assertEquals(retVal, 1, "Failed return value check."); + + return privArr; + } + + /** + * libsecp256k1 PrivKey Tweak-Add - Tweak privkey by adding to it + * + * @param tweak some bytes to tweak with + * @param seckey 32-byte seckey + */ + public static byte[] privKeyTweakAdd(byte[] privkey, byte[] tweak) throws AssertFailException{ + Preconditions.checkArgument(privkey.length == 32); + + ByteBuffer byteBuff = nativeECDSABuffer.get(); + if (byteBuff == null || byteBuff.capacity() < privkey.length + tweak.length) { + byteBuff = ByteBuffer.allocateDirect(privkey.length + tweak.length); + byteBuff.order(ByteOrder.nativeOrder()); + nativeECDSABuffer.set(byteBuff); + } + byteBuff.rewind(); + byteBuff.put(privkey); + byteBuff.put(tweak); + + byte[][] retByteArray; + r.lock(); + try { + retByteArray = secp256k1_privkey_tweak_add(byteBuff,Secp256k1Context.getContext()); + } finally { + r.unlock(); + } + + byte[] privArr = retByteArray[0]; + + int privLen = (byte) new BigInteger(new byte[] { retByteArray[1][0] }).intValue() & 0xFF; + int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue(); + + assertEquals(privArr.length, privLen, "Got bad pubkey length."); + + assertEquals(retVal, 1, "Failed return value check."); + + return privArr; + } + + /** + * libsecp256k1 PubKey Tweak-Add - Tweak pubkey by adding to it + * + * @param tweak some bytes to tweak with + * @param pubkey 32-byte seckey + */ + public static byte[] pubKeyTweakAdd(byte[] pubkey, byte[] tweak) throws AssertFailException{ + Preconditions.checkArgument(pubkey.length == 33 || pubkey.length == 65); + + ByteBuffer byteBuff = nativeECDSABuffer.get(); + if (byteBuff == null || byteBuff.capacity() < pubkey.length + tweak.length) { + byteBuff = ByteBuffer.allocateDirect(pubkey.length + tweak.length); + byteBuff.order(ByteOrder.nativeOrder()); + nativeECDSABuffer.set(byteBuff); + } + byteBuff.rewind(); + byteBuff.put(pubkey); + byteBuff.put(tweak); + + byte[][] retByteArray; + r.lock(); + try { + retByteArray = secp256k1_pubkey_tweak_add(byteBuff,Secp256k1Context.getContext(), pubkey.length); + } finally { + r.unlock(); + } + + byte[] pubArr = retByteArray[0]; + + int pubLen = (byte) new BigInteger(new byte[] { retByteArray[1][0] }).intValue() & 0xFF; + int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue(); + + assertEquals(pubArr.length, pubLen, "Got bad pubkey length."); + + assertEquals(retVal, 1, "Failed return value check."); + + return pubArr; + } + + /** + * libsecp256k1 PubKey Tweak-Mul - Tweak pubkey by multiplying to it + * + * @param tweak some bytes to tweak with + * @param pubkey 32-byte seckey + */ + public static byte[] pubKeyTweakMul(byte[] pubkey, byte[] tweak) throws AssertFailException{ + Preconditions.checkArgument(pubkey.length == 33 || pubkey.length == 65); + + ByteBuffer byteBuff = nativeECDSABuffer.get(); + if (byteBuff == null || byteBuff.capacity() < pubkey.length + tweak.length) { + byteBuff = ByteBuffer.allocateDirect(pubkey.length + tweak.length); + byteBuff.order(ByteOrder.nativeOrder()); + nativeECDSABuffer.set(byteBuff); + } + byteBuff.rewind(); + byteBuff.put(pubkey); + byteBuff.put(tweak); + + byte[][] retByteArray; + r.lock(); + try { + retByteArray = secp256k1_pubkey_tweak_mul(byteBuff,Secp256k1Context.getContext(), pubkey.length); + } finally { + r.unlock(); + } + + byte[] pubArr = retByteArray[0]; + + int pubLen = (byte) new BigInteger(new byte[] { retByteArray[1][0] }).intValue() & 0xFF; + int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue(); + + assertEquals(pubArr.length, pubLen, "Got bad pubkey length."); + + assertEquals(retVal, 1, "Failed return value check."); + + return pubArr; + } + + /** + * libsecp256k1 create ECDH secret - constant time ECDH calculation + * + * @param seckey byte array of secret key used in exponentiaion + * @param pubkey byte array of public key used in exponentiaion + */ + public static byte[] createECDHSecret(byte[] seckey, byte[] pubkey) throws AssertFailException{ + Preconditions.checkArgument(seckey.length <= 32 && pubkey.length <= 65); + + ByteBuffer byteBuff = nativeECDSABuffer.get(); + if (byteBuff == null || byteBuff.capacity() < 32 + pubkey.length) { + byteBuff = ByteBuffer.allocateDirect(32 + pubkey.length); + byteBuff.order(ByteOrder.nativeOrder()); + nativeECDSABuffer.set(byteBuff); + } + byteBuff.rewind(); + byteBuff.put(seckey); + byteBuff.put(pubkey); + + byte[][] retByteArray; + r.lock(); + try { + retByteArray = secp256k1_ecdh(byteBuff, Secp256k1Context.getContext(), pubkey.length); + } finally { + r.unlock(); + } + + byte[] resArr = retByteArray[0]; + int retVal = new BigInteger(new byte[] { retByteArray[1][0] }).intValue(); + + assertEquals(resArr.length, 32, "Got bad result length."); + assertEquals(retVal, 1, "Failed return value check."); + + return resArr; + } + + /** + * libsecp256k1 randomize - updates the context randomization + * + * @param seed 32-byte random seed + */ + public static synchronized boolean randomize(byte[] seed) throws AssertFailException{ + Preconditions.checkArgument(seed.length == 32 || seed == null); + + ByteBuffer byteBuff = nativeECDSABuffer.get(); + if (byteBuff == null || byteBuff.capacity() < seed.length) { + byteBuff = ByteBuffer.allocateDirect(seed.length); + byteBuff.order(ByteOrder.nativeOrder()); + nativeECDSABuffer.set(byteBuff); + } + byteBuff.rewind(); + byteBuff.put(seed); + + w.lock(); + try { + return secp256k1_context_randomize(byteBuff, Secp256k1Context.getContext()) == 1; + } finally { + w.unlock(); + } + } + + private static native long secp256k1_ctx_clone(long context); + + private static native int secp256k1_context_randomize(ByteBuffer byteBuff, long context); + + private static native byte[][] secp256k1_privkey_tweak_add(ByteBuffer byteBuff, long context); + + private static native byte[][] secp256k1_privkey_tweak_mul(ByteBuffer byteBuff, long context); + + private static native byte[][] secp256k1_pubkey_tweak_add(ByteBuffer byteBuff, long context, int pubLen); + + private static native byte[][] secp256k1_pubkey_tweak_mul(ByteBuffer byteBuff, long context, int pubLen); + + private static native void secp256k1_destroy_context(long context); + + private static native int secp256k1_ecdsa_verify(ByteBuffer byteBuff, long context, int sigLen, int pubLen); + + private static native byte[][] secp256k1_ecdsa_sign(ByteBuffer byteBuff, long context); + + private static native int secp256k1_ec_seckey_verify(ByteBuffer byteBuff, long context); + + private static native byte[][] secp256k1_ec_pubkey_create(ByteBuffer byteBuff, long context); + + private static native byte[][] secp256k1_ec_pubkey_parse(ByteBuffer byteBuff, long context, int inputLen); + + private static native byte[][] secp256k1_ecdh(ByteBuffer byteBuff, long context, int inputLen); + } diff --git a/src/cryptoconditions/src/include/secp256k1/src/java/org/bitcoin/NativeSecp256k1Test.java b/src/cryptoconditions/src/include/secp256k1/src/java/org/bitcoin/NativeSecp256k1Test.java new file mode 100644 index 000000000..c00d08899 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/java/org/bitcoin/NativeSecp256k1Test.java @@ -0,0 +1,226 @@ +package org.bitcoin; + +import com.google.common.io.BaseEncoding; +import java.util.Arrays; +import java.math.BigInteger; +import javax.xml.bind.DatatypeConverter; +import static org.bitcoin.NativeSecp256k1Util.*; + +/** + * This class holds test cases defined for testing this library. + */ +public class NativeSecp256k1Test { + + //TODO improve comments/add more tests + /** + * This tests verify() for a valid signature + */ + public static void testVerifyPos() throws AssertFailException{ + boolean result = false; + byte[] data = BaseEncoding.base16().lowerCase().decode("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A90".toLowerCase()); //sha256hash of "testing" + byte[] sig = BaseEncoding.base16().lowerCase().decode("3044022079BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F817980220294F14E883B3F525B5367756C2A11EF6CF84B730B36C17CB0C56F0AAB2C98589".toLowerCase()); + byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase()); + + result = NativeSecp256k1.verify( data, sig, pub); + assertEquals( result, true , "testVerifyPos"); + } + + /** + * This tests verify() for a non-valid signature + */ + public static void testVerifyNeg() throws AssertFailException{ + boolean result = false; + byte[] data = BaseEncoding.base16().lowerCase().decode("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A91".toLowerCase()); //sha256hash of "testing" + byte[] sig = BaseEncoding.base16().lowerCase().decode("3044022079BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F817980220294F14E883B3F525B5367756C2A11EF6CF84B730B36C17CB0C56F0AAB2C98589".toLowerCase()); + byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase()); + + result = NativeSecp256k1.verify( data, sig, pub); + //System.out.println(" TEST " + new BigInteger(1, resultbytes).toString(16)); + assertEquals( result, false , "testVerifyNeg"); + } + + /** + * This tests secret key verify() for a valid secretkey + */ + public static void testSecKeyVerifyPos() throws AssertFailException{ + boolean result = false; + byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase()); + + result = NativeSecp256k1.secKeyVerify( sec ); + //System.out.println(" TEST " + new BigInteger(1, resultbytes).toString(16)); + assertEquals( result, true , "testSecKeyVerifyPos"); + } + + /** + * This tests secret key verify() for a invalid secretkey + */ + public static void testSecKeyVerifyNeg() throws AssertFailException{ + boolean result = false; + byte[] sec = BaseEncoding.base16().lowerCase().decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF".toLowerCase()); + + result = NativeSecp256k1.secKeyVerify( sec ); + //System.out.println(" TEST " + new BigInteger(1, resultbytes).toString(16)); + assertEquals( result, false , "testSecKeyVerifyNeg"); + } + + /** + * This tests public key create() for a valid secretkey + */ + public static void testPubKeyCreatePos() throws AssertFailException{ + byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase()); + + byte[] resultArr = NativeSecp256k1.computePubkey( sec); + String pubkeyString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); + assertEquals( pubkeyString , "04C591A8FF19AC9C4E4E5793673B83123437E975285E7B442F4EE2654DFFCA5E2D2103ED494718C697AC9AEBCFD19612E224DB46661011863ED2FC54E71861E2A6" , "testPubKeyCreatePos"); + } + + /** + * This tests public key create() for a invalid secretkey + */ + public static void testPubKeyCreateNeg() throws AssertFailException{ + byte[] sec = BaseEncoding.base16().lowerCase().decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF".toLowerCase()); + + byte[] resultArr = NativeSecp256k1.computePubkey( sec); + String pubkeyString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); + assertEquals( pubkeyString, "" , "testPubKeyCreateNeg"); + } + + /** + * This tests sign() for a valid secretkey + */ + public static void testSignPos() throws AssertFailException{ + + byte[] data = BaseEncoding.base16().lowerCase().decode("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A90".toLowerCase()); //sha256hash of "testing" + byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase()); + + byte[] resultArr = NativeSecp256k1.sign(data, sec); + String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); + assertEquals( sigString, "30440220182A108E1448DC8F1FB467D06A0F3BB8EA0533584CB954EF8DA112F1D60E39A202201C66F36DA211C087F3AF88B50EDF4F9BDAA6CF5FD6817E74DCA34DB12390C6E9" , "testSignPos"); + } + + /** + * This tests sign() for a invalid secretkey + */ + public static void testSignNeg() throws AssertFailException{ + byte[] data = BaseEncoding.base16().lowerCase().decode("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A90".toLowerCase()); //sha256hash of "testing" + byte[] sec = BaseEncoding.base16().lowerCase().decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF".toLowerCase()); + + byte[] resultArr = NativeSecp256k1.sign(data, sec); + String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); + assertEquals( sigString, "" , "testSignNeg"); + } + + /** + * This tests private key tweak-add + */ + public static void testPrivKeyTweakAdd_1() throws AssertFailException { + byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase()); + byte[] data = BaseEncoding.base16().lowerCase().decode("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3".toLowerCase()); //sha256hash of "tweak" + + byte[] resultArr = NativeSecp256k1.privKeyTweakAdd( sec , data ); + String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); + assertEquals( sigString , "A168571E189E6F9A7E2D657A4B53AE99B909F7E712D1C23CED28093CD57C88F3" , "testPrivKeyAdd_1"); + } + + /** + * This tests private key tweak-mul + */ + public static void testPrivKeyTweakMul_1() throws AssertFailException { + byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase()); + byte[] data = BaseEncoding.base16().lowerCase().decode("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3".toLowerCase()); //sha256hash of "tweak" + + byte[] resultArr = NativeSecp256k1.privKeyTweakMul( sec , data ); + String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); + assertEquals( sigString , "97F8184235F101550F3C71C927507651BD3F1CDB4A5A33B8986ACF0DEE20FFFC" , "testPrivKeyMul_1"); + } + + /** + * This tests private key tweak-add uncompressed + */ + public static void testPrivKeyTweakAdd_2() throws AssertFailException { + byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase()); + byte[] data = BaseEncoding.base16().lowerCase().decode("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3".toLowerCase()); //sha256hash of "tweak" + + byte[] resultArr = NativeSecp256k1.pubKeyTweakAdd( pub , data ); + String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); + assertEquals( sigString , "0411C6790F4B663CCE607BAAE08C43557EDC1A4D11D88DFCB3D841D0C6A941AF525A268E2A863C148555C48FB5FBA368E88718A46E205FABC3DBA2CCFFAB0796EF" , "testPrivKeyAdd_2"); + } + + /** + * This tests private key tweak-mul uncompressed + */ + public static void testPrivKeyTweakMul_2() throws AssertFailException { + byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase()); + byte[] data = BaseEncoding.base16().lowerCase().decode("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3".toLowerCase()); //sha256hash of "tweak" + + byte[] resultArr = NativeSecp256k1.pubKeyTweakMul( pub , data ); + String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); + assertEquals( sigString , "04E0FE6FE55EBCA626B98A807F6CAF654139E14E5E3698F01A9A658E21DC1D2791EC060D4F412A794D5370F672BC94B722640B5F76914151CFCA6E712CA48CC589" , "testPrivKeyMul_2"); + } + + /** + * This tests seed randomization + */ + public static void testRandomize() throws AssertFailException { + byte[] seed = BaseEncoding.base16().lowerCase().decode("A441B15FE9A3CF56661190A0B93B9DEC7D04127288CC87250967CF3B52894D11".toLowerCase()); //sha256hash of "random" + boolean result = NativeSecp256k1.randomize(seed); + assertEquals( result, true, "testRandomize"); + } + + public static void testCreateECDHSecret() throws AssertFailException{ + + byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase()); + byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase()); + + byte[] resultArr = NativeSecp256k1.createECDHSecret(sec, pub); + String ecdhString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); + assertEquals( ecdhString, "2A2A67007A926E6594AF3EB564FC74005B37A9C8AEF2033C4552051B5C87F043" , "testCreateECDHSecret"); + } + + public static void main(String[] args) throws AssertFailException{ + + + System.out.println("\n libsecp256k1 enabled: " + Secp256k1Context.isEnabled() + "\n"); + + assertEquals( Secp256k1Context.isEnabled(), true, "isEnabled" ); + + //Test verify() success/fail + testVerifyPos(); + testVerifyNeg(); + + //Test secKeyVerify() success/fail + testSecKeyVerifyPos(); + testSecKeyVerifyNeg(); + + //Test computePubkey() success/fail + testPubKeyCreatePos(); + testPubKeyCreateNeg(); + + //Test sign() success/fail + testSignPos(); + testSignNeg(); + + //Test privKeyTweakAdd() 1 + testPrivKeyTweakAdd_1(); + + //Test privKeyTweakMul() 2 + testPrivKeyTweakMul_1(); + + //Test privKeyTweakAdd() 3 + testPrivKeyTweakAdd_2(); + + //Test privKeyTweakMul() 4 + testPrivKeyTweakMul_2(); + + //Test randomize() + testRandomize(); + + //Test ECDH + testCreateECDHSecret(); + + NativeSecp256k1.cleanup(); + + System.out.println(" All tests passed." ); + + } +} diff --git a/src/cryptoconditions/src/include/secp256k1/src/java/org/bitcoin/NativeSecp256k1Util.java b/src/cryptoconditions/src/include/secp256k1/src/java/org/bitcoin/NativeSecp256k1Util.java new file mode 100644 index 000000000..04732ba04 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/java/org/bitcoin/NativeSecp256k1Util.java @@ -0,0 +1,45 @@ +/* + * Copyright 2014-2016 the libsecp256k1 contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.bitcoin; + +public class NativeSecp256k1Util{ + + public static void assertEquals( int val, int val2, String message ) throws AssertFailException{ + if( val != val2 ) + throw new AssertFailException("FAIL: " + message); + } + + public static void assertEquals( boolean val, boolean val2, String message ) throws AssertFailException{ + if( val != val2 ) + throw new AssertFailException("FAIL: " + message); + else + System.out.println("PASS: " + message); + } + + public static void assertEquals( String val, String val2, String message ) throws AssertFailException{ + if( !val.equals(val2) ) + throw new AssertFailException("FAIL: " + message); + else + System.out.println("PASS: " + message); + } + + public static class AssertFailException extends Exception { + public AssertFailException(String message) { + super( message ); + } + } +} diff --git a/src/cryptoconditions/src/include/secp256k1/src/java/org/bitcoin/Secp256k1Context.java b/src/cryptoconditions/src/include/secp256k1/src/java/org/bitcoin/Secp256k1Context.java new file mode 100644 index 000000000..216c986a8 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/java/org/bitcoin/Secp256k1Context.java @@ -0,0 +1,51 @@ +/* + * Copyright 2014-2016 the libsecp256k1 contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.bitcoin; + +/** + * This class holds the context reference used in native methods + * to handle ECDSA operations. + */ +public class Secp256k1Context { + private static final boolean enabled; //true if the library is loaded + private static final long context; //ref to pointer to context obj + + static { //static initializer + boolean isEnabled = true; + long contextRef = -1; + try { + System.loadLibrary("secp256k1"); + contextRef = secp256k1_init_context(); + } catch (UnsatisfiedLinkError e) { + System.out.println("UnsatisfiedLinkError: " + e.toString()); + isEnabled = false; + } + enabled = isEnabled; + context = contextRef; + } + + public static boolean isEnabled() { + return enabled; + } + + public static long getContext() { + if(!enabled) return -1; //sanity check + return context; + } + + private static native long secp256k1_init_context(); +} diff --git a/src/cryptoconditions/src/include/secp256k1/src/java/org_bitcoin_NativeSecp256k1.c b/src/cryptoconditions/src/include/secp256k1/src/java/org_bitcoin_NativeSecp256k1.c index bb4cd7072..bcef7b32c 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/java/org_bitcoin_NativeSecp256k1.c +++ b/src/cryptoconditions/src/include/secp256k1/src/java/org_bitcoin_NativeSecp256k1.c @@ -1,23 +1,377 @@ +#include +#include +#include #include "org_bitcoin_NativeSecp256k1.h" #include "include/secp256k1.h" +#include "include/secp256k1_ecdh.h" +#include "include/secp256k1_recovery.h" -JNIEXPORT jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1verify - (JNIEnv* env, jclass classObject, jobject byteBufferObject) + +SECP256K1_API jlong JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ctx_1clone + (JNIEnv* env, jclass classObject, jlong ctx_l) { - unsigned char* data = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); - int sigLen = *((int*)(data + 32)); - int pubLen = *((int*)(data + 32 + 4)); + const secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; + + jlong ctx_clone_l = (uintptr_t) secp256k1_context_clone(ctx); + + (void)classObject;(void)env; + + return ctx_clone_l; - return secp256k1_ecdsa_verify(data, 32, data+32+8, sigLen, data+32+8+sigLen, pubLen); } -static void __javasecp256k1_attach(void) __attribute__((constructor)); -static void __javasecp256k1_detach(void) __attribute__((destructor)); +SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1context_1randomize + (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) +{ + secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; + + const unsigned char* seed = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); + + (void)classObject; + + return secp256k1_context_randomize(ctx, seed); -static void __javasecp256k1_attach(void) { - secp256k1_start(SECP256K1_START_VERIFY); } -static void __javasecp256k1_detach(void) { - secp256k1_stop(); +SECP256K1_API void JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1destroy_1context + (JNIEnv* env, jclass classObject, jlong ctx_l) +{ + secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; + + secp256k1_context_destroy(ctx); + + (void)classObject;(void)env; +} + +SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1verify + (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint siglen, jint publen) +{ + secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; + + unsigned char* data = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); + const unsigned char* sigdata = { (unsigned char*) (data + 32) }; + const unsigned char* pubdata = { (unsigned char*) (data + siglen + 32) }; + + secp256k1_ecdsa_signature sig; + secp256k1_pubkey pubkey; + + int ret = secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigdata, siglen); + + if( ret ) { + ret = secp256k1_ec_pubkey_parse(ctx, &pubkey, pubdata, publen); + + if( ret ) { + ret = secp256k1_ecdsa_verify(ctx, &sig, data, &pubkey); + } + } + + (void)classObject; + + return ret; +} + +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1sign + (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) +{ + secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; + unsigned char* data = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); + unsigned char* secKey = (unsigned char*) (data + 32); + + jobjectArray retArray; + jbyteArray sigArray, intsByteArray; + unsigned char intsarray[2]; + + secp256k1_ecdsa_signature sig[72]; + + int ret = secp256k1_ecdsa_sign(ctx, sig, data, secKey, NULL, NULL ); + + unsigned char outputSer[72]; + size_t outputLen = 72; + + if( ret ) { + int ret2 = secp256k1_ecdsa_signature_serialize_der(ctx,outputSer, &outputLen, sig ); (void)ret2; + } + + intsarray[0] = outputLen; + intsarray[1] = ret; + + retArray = (*env)->NewObjectArray(env, 2, + (*env)->FindClass(env, "[B"), + (*env)->NewByteArray(env, 1)); + + sigArray = (*env)->NewByteArray(env, outputLen); + (*env)->SetByteArrayRegion(env, sigArray, 0, outputLen, (jbyte*)outputSer); + (*env)->SetObjectArrayElement(env, retArray, 0, sigArray); + + intsByteArray = (*env)->NewByteArray(env, 2); + (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); + (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); + + (void)classObject; + + return retArray; +} + +SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1seckey_1verify + (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) +{ + secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; + unsigned char* secKey = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); + + (void)classObject; + + return secp256k1_ec_seckey_verify(ctx, secKey); +} + +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1pubkey_1create + (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) +{ + secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; + const unsigned char* secKey = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); + + secp256k1_pubkey pubkey; + + jobjectArray retArray; + jbyteArray pubkeyArray, intsByteArray; + unsigned char intsarray[2]; + + int ret = secp256k1_ec_pubkey_create(ctx, &pubkey, secKey); + + unsigned char outputSer[65]; + size_t outputLen = 65; + + if( ret ) { + int ret2 = secp256k1_ec_pubkey_serialize(ctx,outputSer, &outputLen, &pubkey,SECP256K1_EC_UNCOMPRESSED );(void)ret2; + } + + intsarray[0] = outputLen; + intsarray[1] = ret; + + retArray = (*env)->NewObjectArray(env, 2, + (*env)->FindClass(env, "[B"), + (*env)->NewByteArray(env, 1)); + + pubkeyArray = (*env)->NewByteArray(env, outputLen); + (*env)->SetByteArrayRegion(env, pubkeyArray, 0, outputLen, (jbyte*)outputSer); + (*env)->SetObjectArrayElement(env, retArray, 0, pubkeyArray); + + intsByteArray = (*env)->NewByteArray(env, 2); + (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); + (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); + + (void)classObject; + + return retArray; + +} + +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1add + (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) +{ + secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; + unsigned char* privkey = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); + const unsigned char* tweak = (unsigned char*) (privkey + 32); + + jobjectArray retArray; + jbyteArray privArray, intsByteArray; + unsigned char intsarray[2]; + + int privkeylen = 32; + + int ret = secp256k1_ec_privkey_tweak_add(ctx, privkey, tweak); + + intsarray[0] = privkeylen; + intsarray[1] = ret; + + retArray = (*env)->NewObjectArray(env, 2, + (*env)->FindClass(env, "[B"), + (*env)->NewByteArray(env, 1)); + + privArray = (*env)->NewByteArray(env, privkeylen); + (*env)->SetByteArrayRegion(env, privArray, 0, privkeylen, (jbyte*)privkey); + (*env)->SetObjectArrayElement(env, retArray, 0, privArray); + + intsByteArray = (*env)->NewByteArray(env, 2); + (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); + (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); + + (void)classObject; + + return retArray; +} + +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1mul + (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) +{ + secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; + unsigned char* privkey = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); + const unsigned char* tweak = (unsigned char*) (privkey + 32); + + jobjectArray retArray; + jbyteArray privArray, intsByteArray; + unsigned char intsarray[2]; + + int privkeylen = 32; + + int ret = secp256k1_ec_privkey_tweak_mul(ctx, privkey, tweak); + + intsarray[0] = privkeylen; + intsarray[1] = ret; + + retArray = (*env)->NewObjectArray(env, 2, + (*env)->FindClass(env, "[B"), + (*env)->NewByteArray(env, 1)); + + privArray = (*env)->NewByteArray(env, privkeylen); + (*env)->SetByteArrayRegion(env, privArray, 0, privkeylen, (jbyte*)privkey); + (*env)->SetObjectArrayElement(env, retArray, 0, privArray); + + intsByteArray = (*env)->NewByteArray(env, 2); + (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); + (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); + + (void)classObject; + + return retArray; +} + +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1add + (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen) +{ + secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; +/* secp256k1_pubkey* pubkey = (secp256k1_pubkey*) (*env)->GetDirectBufferAddress(env, byteBufferObject);*/ + unsigned char* pkey = (*env)->GetDirectBufferAddress(env, byteBufferObject); + const unsigned char* tweak = (unsigned char*) (pkey + publen); + + jobjectArray retArray; + jbyteArray pubArray, intsByteArray; + unsigned char intsarray[2]; + unsigned char outputSer[65]; + size_t outputLen = 65; + + secp256k1_pubkey pubkey; + int ret = secp256k1_ec_pubkey_parse(ctx, &pubkey, pkey, publen); + + if( ret ) { + ret = secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, tweak); + } + + if( ret ) { + int ret2 = secp256k1_ec_pubkey_serialize(ctx,outputSer, &outputLen, &pubkey,SECP256K1_EC_UNCOMPRESSED );(void)ret2; + } + + intsarray[0] = outputLen; + intsarray[1] = ret; + + retArray = (*env)->NewObjectArray(env, 2, + (*env)->FindClass(env, "[B"), + (*env)->NewByteArray(env, 1)); + + pubArray = (*env)->NewByteArray(env, outputLen); + (*env)->SetByteArrayRegion(env, pubArray, 0, outputLen, (jbyte*)outputSer); + (*env)->SetObjectArrayElement(env, retArray, 0, pubArray); + + intsByteArray = (*env)->NewByteArray(env, 2); + (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); + (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); + + (void)classObject; + + return retArray; +} + +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1mul + (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen) +{ + secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; + unsigned char* pkey = (*env)->GetDirectBufferAddress(env, byteBufferObject); + const unsigned char* tweak = (unsigned char*) (pkey + publen); + + jobjectArray retArray; + jbyteArray pubArray, intsByteArray; + unsigned char intsarray[2]; + unsigned char outputSer[65]; + size_t outputLen = 65; + + secp256k1_pubkey pubkey; + int ret = secp256k1_ec_pubkey_parse(ctx, &pubkey, pkey, publen); + + if ( ret ) { + ret = secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, tweak); + } + + if( ret ) { + int ret2 = secp256k1_ec_pubkey_serialize(ctx,outputSer, &outputLen, &pubkey,SECP256K1_EC_UNCOMPRESSED );(void)ret2; + } + + intsarray[0] = outputLen; + intsarray[1] = ret; + + retArray = (*env)->NewObjectArray(env, 2, + (*env)->FindClass(env, "[B"), + (*env)->NewByteArray(env, 1)); + + pubArray = (*env)->NewByteArray(env, outputLen); + (*env)->SetByteArrayRegion(env, pubArray, 0, outputLen, (jbyte*)outputSer); + (*env)->SetObjectArrayElement(env, retArray, 0, pubArray); + + intsByteArray = (*env)->NewByteArray(env, 2); + (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); + (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); + + (void)classObject; + + return retArray; +} + +SECP256K1_API jlong JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1pubkey_1combine + (JNIEnv * env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint numkeys) +{ + (void)classObject;(void)env;(void)byteBufferObject;(void)ctx_l;(void)numkeys; + + return 0; +} + +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdh + (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen) +{ + secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; + const unsigned char* secdata = (*env)->GetDirectBufferAddress(env, byteBufferObject); + const unsigned char* pubdata = (const unsigned char*) (secdata + 32); + + jobjectArray retArray; + jbyteArray outArray, intsByteArray; + unsigned char intsarray[1]; + secp256k1_pubkey pubkey; + unsigned char nonce_res[32]; + size_t outputLen = 32; + + int ret = secp256k1_ec_pubkey_parse(ctx, &pubkey, pubdata, publen); + + if (ret) { + ret = secp256k1_ecdh( + ctx, + nonce_res, + &pubkey, + secdata + ); + } + + intsarray[0] = ret; + + retArray = (*env)->NewObjectArray(env, 2, + (*env)->FindClass(env, "[B"), + (*env)->NewByteArray(env, 1)); + + outArray = (*env)->NewByteArray(env, outputLen); + (*env)->SetByteArrayRegion(env, outArray, 0, 32, (jbyte*)nonce_res); + (*env)->SetObjectArrayElement(env, retArray, 0, outArray); + + intsByteArray = (*env)->NewByteArray(env, 1); + (*env)->SetByteArrayRegion(env, intsByteArray, 0, 1, (jbyte*)intsarray); + (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); + + (void)classObject; + + return retArray; } diff --git a/src/cryptoconditions/src/include/secp256k1/src/java/org_bitcoin_NativeSecp256k1.h b/src/cryptoconditions/src/include/secp256k1/src/java/org_bitcoin_NativeSecp256k1.h index d7fb004fa..fe613c9e9 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/java/org_bitcoin_NativeSecp256k1.h +++ b/src/cryptoconditions/src/include/secp256k1/src/java/org_bitcoin_NativeSecp256k1.h @@ -1,5 +1,6 @@ /* DO NOT EDIT THIS FILE - it is machine generated */ #include +#include "include/secp256k1.h" /* Header for class org_bitcoin_NativeSecp256k1 */ #ifndef _Included_org_bitcoin_NativeSecp256k1 @@ -9,11 +10,108 @@ extern "C" { #endif /* * Class: org_bitcoin_NativeSecp256k1 - * Method: secp256k1_ecdsa_verify - * Signature: (Ljava/nio/ByteBuffer;)I + * Method: secp256k1_ctx_clone + * Signature: (J)J */ -JNIEXPORT jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1verify - (JNIEnv *, jclass, jobject); +SECP256K1_API jlong JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ctx_1clone + (JNIEnv *, jclass, jlong); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_context_randomize + * Signature: (Ljava/nio/ByteBuffer;J)I + */ +SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1context_1randomize + (JNIEnv *, jclass, jobject, jlong); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_privkey_tweak_add + * Signature: (Ljava/nio/ByteBuffer;J)[[B + */ +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1add + (JNIEnv *, jclass, jobject, jlong); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_privkey_tweak_mul + * Signature: (Ljava/nio/ByteBuffer;J)[[B + */ +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1mul + (JNIEnv *, jclass, jobject, jlong); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_pubkey_tweak_add + * Signature: (Ljava/nio/ByteBuffer;JI)[[B + */ +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1add + (JNIEnv *, jclass, jobject, jlong, jint); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_pubkey_tweak_mul + * Signature: (Ljava/nio/ByteBuffer;JI)[[B + */ +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1mul + (JNIEnv *, jclass, jobject, jlong, jint); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_destroy_context + * Signature: (J)V + */ +SECP256K1_API void JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1destroy_1context + (JNIEnv *, jclass, jlong); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_ecdsa_verify + * Signature: (Ljava/nio/ByteBuffer;JII)I + */ +SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1verify + (JNIEnv *, jclass, jobject, jlong, jint, jint); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_ecdsa_sign + * Signature: (Ljava/nio/ByteBuffer;J)[[B + */ +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1sign + (JNIEnv *, jclass, jobject, jlong); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_ec_seckey_verify + * Signature: (Ljava/nio/ByteBuffer;J)I + */ +SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1seckey_1verify + (JNIEnv *, jclass, jobject, jlong); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_ec_pubkey_create + * Signature: (Ljava/nio/ByteBuffer;J)[[B + */ +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1pubkey_1create + (JNIEnv *, jclass, jobject, jlong); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_ec_pubkey_parse + * Signature: (Ljava/nio/ByteBuffer;JI)[[B + */ +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1pubkey_1parse + (JNIEnv *, jclass, jobject, jlong, jint); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_ecdh + * Signature: (Ljava/nio/ByteBuffer;JI)[[B + */ +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdh + (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen); + #ifdef __cplusplus } diff --git a/src/cryptoconditions/src/include/secp256k1/src/java/org_bitcoin_Secp256k1Context.c b/src/cryptoconditions/src/include/secp256k1/src/java/org_bitcoin_Secp256k1Context.c new file mode 100644 index 000000000..a52939e7e --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/java/org_bitcoin_Secp256k1Context.c @@ -0,0 +1,15 @@ +#include +#include +#include "org_bitcoin_Secp256k1Context.h" +#include "include/secp256k1.h" + +SECP256K1_API jlong JNICALL Java_org_bitcoin_Secp256k1Context_secp256k1_1init_1context + (JNIEnv* env, jclass classObject) +{ + secp256k1_context *ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); + + (void)classObject;(void)env; + + return (uintptr_t)ctx; +} + diff --git a/src/cryptoconditions/src/include/secp256k1/src/java/org_bitcoin_Secp256k1Context.h b/src/cryptoconditions/src/include/secp256k1/src/java/org_bitcoin_Secp256k1Context.h new file mode 100644 index 000000000..0d2bc84b7 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/java/org_bitcoin_Secp256k1Context.h @@ -0,0 +1,22 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +#include "include/secp256k1.h" +/* Header for class org_bitcoin_Secp256k1Context */ + +#ifndef _Included_org_bitcoin_Secp256k1Context +#define _Included_org_bitcoin_Secp256k1Context +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_bitcoin_Secp256k1Context + * Method: secp256k1_init_context + * Signature: ()J + */ +SECP256K1_API jlong JNICALL Java_org_bitcoin_Secp256k1Context_secp256k1_1init_1context + (JNIEnv *, jclass); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/modules/ecdh/Makefile.am.include b/src/cryptoconditions/src/include/secp256k1/src/modules/ecdh/Makefile.am.include new file mode 100644 index 000000000..e3088b469 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/modules/ecdh/Makefile.am.include @@ -0,0 +1,8 @@ +include_HEADERS += include/secp256k1_ecdh.h +noinst_HEADERS += src/modules/ecdh/main_impl.h +noinst_HEADERS += src/modules/ecdh/tests_impl.h +if USE_BENCHMARK +noinst_PROGRAMS += bench_ecdh +bench_ecdh_SOURCES = src/bench_ecdh.c +bench_ecdh_LDADD = libsecp256k1.la $(SECP_LIBS) $(COMMON_LIB) +endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/modules/ecdh/main_impl.h b/src/cryptoconditions/src/include/secp256k1/src/modules/ecdh/main_impl.h new file mode 100644 index 000000000..bd8739eeb --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/modules/ecdh/main_impl.h @@ -0,0 +1,54 @@ +/********************************************************************** + * Copyright (c) 2015 Andrew Poelstra * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_MODULE_ECDH_MAIN_H +#define SECP256K1_MODULE_ECDH_MAIN_H + +#include "include/secp256k1_ecdh.h" +#include "ecmult_const_impl.h" + +int secp256k1_ecdh(const secp256k1_context* ctx, unsigned char *result, const secp256k1_pubkey *point, const unsigned char *scalar) { + int ret = 0; + int overflow = 0; + secp256k1_gej res; + secp256k1_ge pt; + secp256k1_scalar s; + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(result != NULL); + ARG_CHECK(point != NULL); + ARG_CHECK(scalar != NULL); + + secp256k1_pubkey_load(ctx, &pt, point); + secp256k1_scalar_set_b32(&s, scalar, &overflow); + if (overflow || secp256k1_scalar_is_zero(&s)) { + ret = 0; + } else { + unsigned char x[32]; + unsigned char y[1]; + secp256k1_sha256 sha; + + secp256k1_ecmult_const(&res, &pt, &s); + secp256k1_ge_set_gej(&pt, &res); + /* Compute a hash of the point in compressed form + * Note we cannot use secp256k1_eckey_pubkey_serialize here since it does not + * expect its output to be secret and has a timing sidechannel. */ + secp256k1_fe_normalize(&pt.x); + secp256k1_fe_normalize(&pt.y); + secp256k1_fe_get_b32(x, &pt.x); + y[0] = 0x02 | secp256k1_fe_is_odd(&pt.y); + + secp256k1_sha256_initialize(&sha); + secp256k1_sha256_write(&sha, y, sizeof(y)); + secp256k1_sha256_write(&sha, x, sizeof(x)); + secp256k1_sha256_finalize(&sha, result); + ret = 1; + } + + secp256k1_scalar_clear(&s); + return ret; +} + +#endif /* SECP256K1_MODULE_ECDH_MAIN_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/modules/ecdh/tests_impl.h b/src/cryptoconditions/src/include/secp256k1/src/modules/ecdh/tests_impl.h new file mode 100644 index 000000000..0c53f8ee0 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/modules/ecdh/tests_impl.h @@ -0,0 +1,105 @@ +/********************************************************************** + * Copyright (c) 2015 Andrew Poelstra * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_MODULE_ECDH_TESTS_H +#define SECP256K1_MODULE_ECDH_TESTS_H + +void test_ecdh_api(void) { + /* Setup context that just counts errors */ + secp256k1_context *tctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN); + secp256k1_pubkey point; + unsigned char res[32]; + unsigned char s_one[32] = { 0 }; + int32_t ecount = 0; + s_one[31] = 1; + + secp256k1_context_set_error_callback(tctx, counting_illegal_callback_fn, &ecount); + secp256k1_context_set_illegal_callback(tctx, counting_illegal_callback_fn, &ecount); + CHECK(secp256k1_ec_pubkey_create(tctx, &point, s_one) == 1); + + /* Check all NULLs are detected */ + CHECK(secp256k1_ecdh(tctx, res, &point, s_one) == 1); + CHECK(ecount == 0); + CHECK(secp256k1_ecdh(tctx, NULL, &point, s_one) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ecdh(tctx, res, NULL, s_one) == 0); + CHECK(ecount == 2); + CHECK(secp256k1_ecdh(tctx, res, &point, NULL) == 0); + CHECK(ecount == 3); + CHECK(secp256k1_ecdh(tctx, res, &point, s_one) == 1); + CHECK(ecount == 3); + + /* Cleanup */ + secp256k1_context_destroy(tctx); +} + +void test_ecdh_generator_basepoint(void) { + unsigned char s_one[32] = { 0 }; + secp256k1_pubkey point[2]; + int i; + + s_one[31] = 1; + /* Check against pubkey creation when the basepoint is the generator */ + for (i = 0; i < 100; ++i) { + secp256k1_sha256 sha; + unsigned char s_b32[32]; + unsigned char output_ecdh[32]; + unsigned char output_ser[32]; + unsigned char point_ser[33]; + size_t point_ser_len = sizeof(point_ser); + secp256k1_scalar s; + + random_scalar_order(&s); + secp256k1_scalar_get_b32(s_b32, &s); + + /* compute using ECDH function */ + CHECK(secp256k1_ec_pubkey_create(ctx, &point[0], s_one) == 1); + CHECK(secp256k1_ecdh(ctx, output_ecdh, &point[0], s_b32) == 1); + /* compute "explicitly" */ + CHECK(secp256k1_ec_pubkey_create(ctx, &point[1], s_b32) == 1); + CHECK(secp256k1_ec_pubkey_serialize(ctx, point_ser, &point_ser_len, &point[1], SECP256K1_EC_COMPRESSED) == 1); + CHECK(point_ser_len == sizeof(point_ser)); + secp256k1_sha256_initialize(&sha); + secp256k1_sha256_write(&sha, point_ser, point_ser_len); + secp256k1_sha256_finalize(&sha, output_ser); + /* compare */ + CHECK(memcmp(output_ecdh, output_ser, sizeof(output_ser)) == 0); + } +} + +void test_bad_scalar(void) { + unsigned char s_zero[32] = { 0 }; + unsigned char s_overflow[32] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, + 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41 + }; + unsigned char s_rand[32] = { 0 }; + unsigned char output[32]; + secp256k1_scalar rand; + secp256k1_pubkey point; + + /* Create random point */ + random_scalar_order(&rand); + secp256k1_scalar_get_b32(s_rand, &rand); + CHECK(secp256k1_ec_pubkey_create(ctx, &point, s_rand) == 1); + + /* Try to multiply it by bad values */ + CHECK(secp256k1_ecdh(ctx, output, &point, s_zero) == 0); + CHECK(secp256k1_ecdh(ctx, output, &point, s_overflow) == 0); + /* ...and a good one */ + s_overflow[31] -= 1; + CHECK(secp256k1_ecdh(ctx, output, &point, s_overflow) == 1); +} + +void run_ecdh_tests(void) { + test_ecdh_api(); + test_ecdh_generator_basepoint(); + test_bad_scalar(); +} + +#endif /* SECP256K1_MODULE_ECDH_TESTS_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/modules/recovery/Makefile.am.include b/src/cryptoconditions/src/include/secp256k1/src/modules/recovery/Makefile.am.include new file mode 100644 index 000000000..bf23c26e7 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/modules/recovery/Makefile.am.include @@ -0,0 +1,8 @@ +include_HEADERS += include/secp256k1_recovery.h +noinst_HEADERS += src/modules/recovery/main_impl.h +noinst_HEADERS += src/modules/recovery/tests_impl.h +if USE_BENCHMARK +noinst_PROGRAMS += bench_recover +bench_recover_SOURCES = src/bench_recover.c +bench_recover_LDADD = libsecp256k1.la $(SECP_LIBS) $(COMMON_LIB) +endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/modules/recovery/main_impl.h b/src/cryptoconditions/src/include/secp256k1/src/modules/recovery/main_impl.h new file mode 100755 index 000000000..2f6691c5a --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/modules/recovery/main_impl.h @@ -0,0 +1,193 @@ +/********************************************************************** + * Copyright (c) 2013-2015 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_MODULE_RECOVERY_MAIN_H +#define SECP256K1_MODULE_RECOVERY_MAIN_H + +#include "include/secp256k1_recovery.h" + +static void secp256k1_ecdsa_recoverable_signature_load(const secp256k1_context* ctx, secp256k1_scalar* r, secp256k1_scalar* s, int* recid, const secp256k1_ecdsa_recoverable_signature* sig) { + (void)ctx; + if (sizeof(secp256k1_scalar) == 32) { + /* When the secp256k1_scalar type is exactly 32 byte, use its + * representation inside secp256k1_ecdsa_signature, as conversion is very fast. + * Note that secp256k1_ecdsa_signature_save must use the same representation. */ + memcpy(r, &sig->data[0], 32); + memcpy(s, &sig->data[32], 32); + } else { + secp256k1_scalar_set_b32(r, &sig->data[0], NULL); + secp256k1_scalar_set_b32(s, &sig->data[32], NULL); + } + *recid = sig->data[64]; +} + +static void secp256k1_ecdsa_recoverable_signature_save(secp256k1_ecdsa_recoverable_signature* sig, const secp256k1_scalar* r, const secp256k1_scalar* s, int recid) { + if (sizeof(secp256k1_scalar) == 32) { + memcpy(&sig->data[0], r, 32); + memcpy(&sig->data[32], s, 32); + } else { + secp256k1_scalar_get_b32(&sig->data[0], r); + secp256k1_scalar_get_b32(&sig->data[32], s); + } + sig->data[64] = recid; +} + +int secp256k1_ecdsa_recoverable_signature_parse_compact(const secp256k1_context* ctx, secp256k1_ecdsa_recoverable_signature* sig, const unsigned char *input64, int recid) { + secp256k1_scalar r, s; + int ret = 1; + int overflow = 0; + + (void)ctx; + ARG_CHECK(sig != NULL); + ARG_CHECK(input64 != NULL); + ARG_CHECK(recid >= 0 && recid <= 3); + + secp256k1_scalar_set_b32(&r, &input64[0], &overflow); + ret &= !overflow; + secp256k1_scalar_set_b32(&s, &input64[32], &overflow); + ret &= !overflow; + if (ret) { + secp256k1_ecdsa_recoverable_signature_save(sig, &r, &s, recid); + } else { + memset(sig, 0, sizeof(*sig)); + } + return ret; +} + +int secp256k1_ecdsa_recoverable_signature_serialize_compact(const secp256k1_context* ctx, unsigned char *output64, int *recid, const secp256k1_ecdsa_recoverable_signature* sig) { + secp256k1_scalar r, s; + + (void)ctx; + ARG_CHECK(output64 != NULL); + ARG_CHECK(sig != NULL); + ARG_CHECK(recid != NULL); + + secp256k1_ecdsa_recoverable_signature_load(ctx, &r, &s, recid, sig); + secp256k1_scalar_get_b32(&output64[0], &r); + secp256k1_scalar_get_b32(&output64[32], &s); + return 1; +} + +int secp256k1_ecdsa_recoverable_signature_convert(const secp256k1_context* ctx, secp256k1_ecdsa_signature* sig, const secp256k1_ecdsa_recoverable_signature* sigin) { + secp256k1_scalar r, s; + int recid; + + (void)ctx; + ARG_CHECK(sig != NULL); + ARG_CHECK(sigin != NULL); + + secp256k1_ecdsa_recoverable_signature_load(ctx, &r, &s, &recid, sigin); + secp256k1_ecdsa_signature_save(sig, &r, &s); + return 1; +} + +static int secp256k1_ecdsa_sig_recover(const secp256k1_ecmult_context *ctx, const secp256k1_scalar *sigr, const secp256k1_scalar* sigs, secp256k1_ge *pubkey, const secp256k1_scalar *message, int recid) { + unsigned char brx[32]; + secp256k1_fe fx; + secp256k1_ge x; + secp256k1_gej xj; + secp256k1_scalar rn, u1, u2; + secp256k1_gej qj; + int r; + + if (secp256k1_scalar_is_zero(sigr) || secp256k1_scalar_is_zero(sigs)) { + return 0; + } + + secp256k1_scalar_get_b32(brx, sigr); + r = secp256k1_fe_set_b32(&fx, brx); + (void)r; + VERIFY_CHECK(r); /* brx comes from a scalar, so is less than the order; certainly less than p */ + if (recid & 2) { + if (secp256k1_fe_cmp_var(&fx, &secp256k1_ecdsa_const_p_minus_order) >= 0) { + return 0; + } + secp256k1_fe_add(&fx, &secp256k1_ecdsa_const_order_as_fe); + } + if (!secp256k1_ge_set_xo_var(&x, &fx, recid & 1)) { + return 0; + } + secp256k1_gej_set_ge(&xj, &x); + secp256k1_scalar_inverse_var(&rn, sigr); + secp256k1_scalar_mul(&u1, &rn, message); + secp256k1_scalar_negate(&u1, &u1); + secp256k1_scalar_mul(&u2, &rn, sigs); + secp256k1_ecmult(ctx, &qj, &xj, &u2, &u1); + secp256k1_ge_set_gej_var(pubkey, &qj); + return !secp256k1_gej_is_infinity(&qj); +} + +int secp256k1_ecdsa_sign_recoverable(const secp256k1_context* ctx, secp256k1_ecdsa_recoverable_signature *signature, const unsigned char *msg32, const unsigned char *seckey, secp256k1_nonce_function noncefp, const void* noncedata) { + secp256k1_scalar r, s; + secp256k1_scalar sec, non, msg; + int recid; + int ret = 0; + int overflow = 0; + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); + ARG_CHECK(msg32 != NULL); + ARG_CHECK(signature != NULL); + ARG_CHECK(seckey != NULL); + if (noncefp == NULL) { + noncefp = secp256k1_nonce_function_default; + } + + secp256k1_scalar_set_b32(&sec, seckey, &overflow); + /* Fail if the secret key is invalid. */ + if (!overflow && !secp256k1_scalar_is_zero(&sec)) { + unsigned char nonce32[32]; + unsigned int count = 0; + secp256k1_scalar_set_b32(&msg, msg32, NULL); + while (1) { + ret = noncefp(nonce32, msg32, seckey, NULL, (void*)noncedata, count); + if (!ret) { + break; + } + secp256k1_scalar_set_b32(&non, nonce32, &overflow); + if (!secp256k1_scalar_is_zero(&non) && !overflow) { + if (secp256k1_ecdsa_sig_sign(&ctx->ecmult_gen_ctx, &r, &s, &sec, &msg, &non, &recid)) { + break; + } + } + count++; + } + memset(nonce32, 0, 32); + secp256k1_scalar_clear(&msg); + secp256k1_scalar_clear(&non); + secp256k1_scalar_clear(&sec); + } + if (ret) { + secp256k1_ecdsa_recoverable_signature_save(signature, &r, &s, recid); + } else { + memset(signature, 0, sizeof(*signature)); + } + return ret; +} + +int secp256k1_ecdsa_recover(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const secp256k1_ecdsa_recoverable_signature *signature, const unsigned char *msg32) { + secp256k1_ge q; + secp256k1_scalar r, s; + secp256k1_scalar m; + int recid; + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); + ARG_CHECK(msg32 != NULL); + ARG_CHECK(signature != NULL); + ARG_CHECK(pubkey != NULL); + + secp256k1_ecdsa_recoverable_signature_load(ctx, &r, &s, &recid, signature); + VERIFY_CHECK(recid >= 0 && recid < 4); /* should have been caught in parse_compact */ + secp256k1_scalar_set_b32(&m, msg32, NULL); + if (secp256k1_ecdsa_sig_recover(&ctx->ecmult_ctx, &r, &s, &q, &m, recid)) { + secp256k1_pubkey_save(pubkey, &q); + return 1; + } else { + memset(pubkey, 0, sizeof(*pubkey)); + return 0; + } +} + +#endif /* SECP256K1_MODULE_RECOVERY_MAIN_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/modules/recovery/tests_impl.h b/src/cryptoconditions/src/include/secp256k1/src/modules/recovery/tests_impl.h new file mode 100644 index 000000000..5c9bbe861 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/modules/recovery/tests_impl.h @@ -0,0 +1,393 @@ +/********************************************************************** + * Copyright (c) 2013-2015 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_MODULE_RECOVERY_TESTS_H +#define SECP256K1_MODULE_RECOVERY_TESTS_H + +static int recovery_test_nonce_function(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter) { + (void) msg32; + (void) key32; + (void) algo16; + (void) data; + + /* On the first run, return 0 to force a second run */ + if (counter == 0) { + memset(nonce32, 0, 32); + return 1; + } + /* On the second run, return an overflow to force a third run */ + if (counter == 1) { + memset(nonce32, 0xff, 32); + return 1; + } + /* On the next run, return a valid nonce, but flip a coin as to whether or not to fail signing. */ + memset(nonce32, 1, 32); + return secp256k1_rand_bits(1); +} + +void test_ecdsa_recovery_api(void) { + /* Setup contexts that just count errors */ + secp256k1_context *none = secp256k1_context_create(SECP256K1_CONTEXT_NONE); + secp256k1_context *sign = secp256k1_context_create(SECP256K1_CONTEXT_SIGN); + secp256k1_context *vrfy = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY); + secp256k1_context *both = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); + secp256k1_pubkey pubkey; + secp256k1_pubkey recpubkey; + secp256k1_ecdsa_signature normal_sig; + secp256k1_ecdsa_recoverable_signature recsig; + unsigned char privkey[32] = { 1 }; + unsigned char message[32] = { 2 }; + int32_t ecount = 0; + int recid = 0; + unsigned char sig[74]; + unsigned char zero_privkey[32] = { 0 }; + unsigned char over_privkey[32] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; + + secp256k1_context_set_error_callback(none, counting_illegal_callback_fn, &ecount); + secp256k1_context_set_error_callback(sign, counting_illegal_callback_fn, &ecount); + secp256k1_context_set_error_callback(vrfy, counting_illegal_callback_fn, &ecount); + secp256k1_context_set_error_callback(both, counting_illegal_callback_fn, &ecount); + secp256k1_context_set_illegal_callback(none, counting_illegal_callback_fn, &ecount); + secp256k1_context_set_illegal_callback(sign, counting_illegal_callback_fn, &ecount); + secp256k1_context_set_illegal_callback(vrfy, counting_illegal_callback_fn, &ecount); + secp256k1_context_set_illegal_callback(both, counting_illegal_callback_fn, &ecount); + + /* Construct and verify corresponding public key. */ + CHECK(secp256k1_ec_seckey_verify(ctx, privkey) == 1); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, privkey) == 1); + + /* Check bad contexts and NULLs for signing */ + ecount = 0; + CHECK(secp256k1_ecdsa_sign_recoverable(none, &recsig, message, privkey, NULL, NULL) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ecdsa_sign_recoverable(sign, &recsig, message, privkey, NULL, NULL) == 1); + CHECK(ecount == 1); + CHECK(secp256k1_ecdsa_sign_recoverable(vrfy, &recsig, message, privkey, NULL, NULL) == 0); + CHECK(ecount == 2); + CHECK(secp256k1_ecdsa_sign_recoverable(both, &recsig, message, privkey, NULL, NULL) == 1); + CHECK(ecount == 2); + CHECK(secp256k1_ecdsa_sign_recoverable(both, NULL, message, privkey, NULL, NULL) == 0); + CHECK(ecount == 3); + CHECK(secp256k1_ecdsa_sign_recoverable(both, &recsig, NULL, privkey, NULL, NULL) == 0); + CHECK(ecount == 4); + CHECK(secp256k1_ecdsa_sign_recoverable(both, &recsig, message, NULL, NULL, NULL) == 0); + CHECK(ecount == 5); + /* This will fail or succeed randomly, and in either case will not ARG_CHECK failure */ + secp256k1_ecdsa_sign_recoverable(both, &recsig, message, privkey, recovery_test_nonce_function, NULL); + CHECK(ecount == 5); + /* These will all fail, but not in ARG_CHECK way */ + CHECK(secp256k1_ecdsa_sign_recoverable(both, &recsig, message, zero_privkey, NULL, NULL) == 0); + CHECK(secp256k1_ecdsa_sign_recoverable(both, &recsig, message, over_privkey, NULL, NULL) == 0); + /* This one will succeed. */ + CHECK(secp256k1_ecdsa_sign_recoverable(both, &recsig, message, privkey, NULL, NULL) == 1); + CHECK(ecount == 5); + + /* Check signing with a goofy nonce function */ + + /* Check bad contexts and NULLs for recovery */ + ecount = 0; + CHECK(secp256k1_ecdsa_recover(none, &recpubkey, &recsig, message) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ecdsa_recover(sign, &recpubkey, &recsig, message) == 0); + CHECK(ecount == 2); + CHECK(secp256k1_ecdsa_recover(vrfy, &recpubkey, &recsig, message) == 1); + CHECK(ecount == 2); + CHECK(secp256k1_ecdsa_recover(both, &recpubkey, &recsig, message) == 1); + CHECK(ecount == 2); + CHECK(secp256k1_ecdsa_recover(both, NULL, &recsig, message) == 0); + CHECK(ecount == 3); + CHECK(secp256k1_ecdsa_recover(both, &recpubkey, NULL, message) == 0); + CHECK(ecount == 4); + CHECK(secp256k1_ecdsa_recover(both, &recpubkey, &recsig, NULL) == 0); + CHECK(ecount == 5); + + /* Check NULLs for conversion */ + CHECK(secp256k1_ecdsa_sign(both, &normal_sig, message, privkey, NULL, NULL) == 1); + ecount = 0; + CHECK(secp256k1_ecdsa_recoverable_signature_convert(both, NULL, &recsig) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ecdsa_recoverable_signature_convert(both, &normal_sig, NULL) == 0); + CHECK(ecount == 2); + CHECK(secp256k1_ecdsa_recoverable_signature_convert(both, &normal_sig, &recsig) == 1); + + /* Check NULLs for de/serialization */ + CHECK(secp256k1_ecdsa_sign_recoverable(both, &recsig, message, privkey, NULL, NULL) == 1); + ecount = 0; + CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(both, NULL, &recid, &recsig) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(both, sig, NULL, &recsig) == 0); + CHECK(ecount == 2); + CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(both, sig, &recid, NULL) == 0); + CHECK(ecount == 3); + CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(both, sig, &recid, &recsig) == 1); + + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(both, NULL, sig, recid) == 0); + CHECK(ecount == 4); + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(both, &recsig, NULL, recid) == 0); + CHECK(ecount == 5); + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(both, &recsig, sig, -1) == 0); + CHECK(ecount == 6); + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(both, &recsig, sig, 5) == 0); + CHECK(ecount == 7); + /* overflow in signature will fail but not affect ecount */ + memcpy(sig, over_privkey, 32); + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(both, &recsig, sig, recid) == 0); + CHECK(ecount == 7); + + /* cleanup */ + secp256k1_context_destroy(none); + secp256k1_context_destroy(sign); + secp256k1_context_destroy(vrfy); + secp256k1_context_destroy(both); +} + +void test_ecdsa_recovery_end_to_end(void) { + unsigned char extra[32] = {0x00}; + unsigned char privkey[32]; + unsigned char message[32]; + secp256k1_ecdsa_signature signature[5]; + secp256k1_ecdsa_recoverable_signature rsignature[5]; + unsigned char sig[74]; + secp256k1_pubkey pubkey; + secp256k1_pubkey recpubkey; + int recid = 0; + + /* Generate a random key and message. */ + { + secp256k1_scalar msg, key; + random_scalar_order_test(&msg); + random_scalar_order_test(&key); + secp256k1_scalar_get_b32(privkey, &key); + secp256k1_scalar_get_b32(message, &msg); + } + + /* Construct and verify corresponding public key. */ + CHECK(secp256k1_ec_seckey_verify(ctx, privkey) == 1); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, privkey) == 1); + + /* Serialize/parse compact and verify/recover. */ + extra[0] = 0; + CHECK(secp256k1_ecdsa_sign_recoverable(ctx, &rsignature[0], message, privkey, NULL, NULL) == 1); + CHECK(secp256k1_ecdsa_sign(ctx, &signature[0], message, privkey, NULL, NULL) == 1); + CHECK(secp256k1_ecdsa_sign_recoverable(ctx, &rsignature[4], message, privkey, NULL, NULL) == 1); + CHECK(secp256k1_ecdsa_sign_recoverable(ctx, &rsignature[1], message, privkey, NULL, extra) == 1); + extra[31] = 1; + CHECK(secp256k1_ecdsa_sign_recoverable(ctx, &rsignature[2], message, privkey, NULL, extra) == 1); + extra[31] = 0; + extra[0] = 1; + CHECK(secp256k1_ecdsa_sign_recoverable(ctx, &rsignature[3], message, privkey, NULL, extra) == 1); + CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(ctx, sig, &recid, &rsignature[4]) == 1); + CHECK(secp256k1_ecdsa_recoverable_signature_convert(ctx, &signature[4], &rsignature[4]) == 1); + CHECK(memcmp(&signature[4], &signature[0], 64) == 0); + CHECK(secp256k1_ecdsa_verify(ctx, &signature[4], message, &pubkey) == 1); + memset(&rsignature[4], 0, sizeof(rsignature[4])); + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsignature[4], sig, recid) == 1); + CHECK(secp256k1_ecdsa_recoverable_signature_convert(ctx, &signature[4], &rsignature[4]) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &signature[4], message, &pubkey) == 1); + /* Parse compact (with recovery id) and recover. */ + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsignature[4], sig, recid) == 1); + CHECK(secp256k1_ecdsa_recover(ctx, &recpubkey, &rsignature[4], message) == 1); + CHECK(memcmp(&pubkey, &recpubkey, sizeof(pubkey)) == 0); + /* Serialize/destroy/parse signature and verify again. */ + CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(ctx, sig, &recid, &rsignature[4]) == 1); + sig[secp256k1_rand_bits(6)] += 1 + secp256k1_rand_int(255); + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsignature[4], sig, recid) == 1); + CHECK(secp256k1_ecdsa_recoverable_signature_convert(ctx, &signature[4], &rsignature[4]) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &signature[4], message, &pubkey) == 0); + /* Recover again */ + CHECK(secp256k1_ecdsa_recover(ctx, &recpubkey, &rsignature[4], message) == 0 || + memcmp(&pubkey, &recpubkey, sizeof(pubkey)) != 0); +} + +/* Tests several edge cases. */ +void test_ecdsa_recovery_edge_cases(void) { + const unsigned char msg32[32] = { + 'T', 'h', 'i', 's', ' ', 'i', 's', ' ', + 'a', ' ', 'v', 'e', 'r', 'y', ' ', 's', + 'e', 'c', 'r', 'e', 't', ' ', 'm', 'e', + 's', 's', 'a', 'g', 'e', '.', '.', '.' + }; + const unsigned char sig64[64] = { + /* Generated by signing the above message with nonce 'This is the nonce we will use...' + * and secret key 0 (which is not valid), resulting in recid 0. */ + 0x67, 0xCB, 0x28, 0x5F, 0x9C, 0xD1, 0x94, 0xE8, + 0x40, 0xD6, 0x29, 0x39, 0x7A, 0xF5, 0x56, 0x96, + 0x62, 0xFD, 0xE4, 0x46, 0x49, 0x99, 0x59, 0x63, + 0x17, 0x9A, 0x7D, 0xD1, 0x7B, 0xD2, 0x35, 0x32, + 0x4B, 0x1B, 0x7D, 0xF3, 0x4C, 0xE1, 0xF6, 0x8E, + 0x69, 0x4F, 0xF6, 0xF1, 0x1A, 0xC7, 0x51, 0xDD, + 0x7D, 0xD7, 0x3E, 0x38, 0x7E, 0xE4, 0xFC, 0x86, + 0x6E, 0x1B, 0xE8, 0xEC, 0xC7, 0xDD, 0x95, 0x57 + }; + secp256k1_pubkey pubkey; + /* signature (r,s) = (4,4), which can be recovered with all 4 recids. */ + const unsigned char sigb64[64] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + }; + secp256k1_pubkey pubkeyb; + secp256k1_ecdsa_recoverable_signature rsig; + secp256k1_ecdsa_signature sig; + int recid; + + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sig64, 0)); + CHECK(!secp256k1_ecdsa_recover(ctx, &pubkey, &rsig, msg32)); + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sig64, 1)); + CHECK(secp256k1_ecdsa_recover(ctx, &pubkey, &rsig, msg32)); + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sig64, 2)); + CHECK(!secp256k1_ecdsa_recover(ctx, &pubkey, &rsig, msg32)); + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sig64, 3)); + CHECK(!secp256k1_ecdsa_recover(ctx, &pubkey, &rsig, msg32)); + + for (recid = 0; recid < 4; recid++) { + int i; + int recid2; + /* (4,4) encoded in DER. */ + unsigned char sigbder[8] = {0x30, 0x06, 0x02, 0x01, 0x04, 0x02, 0x01, 0x04}; + unsigned char sigcder_zr[7] = {0x30, 0x05, 0x02, 0x00, 0x02, 0x01, 0x01}; + unsigned char sigcder_zs[7] = {0x30, 0x05, 0x02, 0x01, 0x01, 0x02, 0x00}; + unsigned char sigbderalt1[39] = { + 0x30, 0x25, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0x04, + }; + unsigned char sigbderalt2[39] = { + 0x30, 0x25, 0x02, 0x01, 0x04, 0x02, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + }; + unsigned char sigbderalt3[40] = { + 0x30, 0x26, 0x02, 0x21, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0x04, + }; + unsigned char sigbderalt4[40] = { + 0x30, 0x26, 0x02, 0x01, 0x04, 0x02, 0x21, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + }; + /* (order + r,4) encoded in DER. */ + unsigned char sigbderlong[40] = { + 0x30, 0x26, 0x02, 0x21, 0x00, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xBA, 0xAE, 0xDC, + 0xE6, 0xAF, 0x48, 0xA0, 0x3B, 0xBF, 0xD2, 0x5E, + 0x8C, 0xD0, 0x36, 0x41, 0x45, 0x02, 0x01, 0x04 + }; + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sigb64, recid) == 1); + CHECK(secp256k1_ecdsa_recover(ctx, &pubkeyb, &rsig, msg32) == 1); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbder, sizeof(sigbder)) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 1); + for (recid2 = 0; recid2 < 4; recid2++) { + secp256k1_pubkey pubkey2b; + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sigb64, recid2) == 1); + CHECK(secp256k1_ecdsa_recover(ctx, &pubkey2b, &rsig, msg32) == 1); + /* Verifying with (order + r,4) should always fail. */ + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderlong, sizeof(sigbderlong)) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 0); + } + /* DER parsing tests. */ + /* Zero length r/s. */ + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigcder_zr, sizeof(sigcder_zr)) == 0); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigcder_zs, sizeof(sigcder_zs)) == 0); + /* Leading zeros. */ + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt1, sizeof(sigbderalt1)) == 0); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt2, sizeof(sigbderalt2)) == 0); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt3, sizeof(sigbderalt3)) == 0); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt4, sizeof(sigbderalt4)) == 0); + sigbderalt3[4] = 1; + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt3, sizeof(sigbderalt3)) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 0); + sigbderalt4[7] = 1; + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt4, sizeof(sigbderalt4)) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 0); + /* Damage signature. */ + sigbder[7]++; + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbder, sizeof(sigbder)) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 0); + sigbder[7]--; + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbder, 6) == 0); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbder, sizeof(sigbder) - 1) == 0); + for(i = 0; i < 8; i++) { + int c; + unsigned char orig = sigbder[i]; + /*Try every single-byte change.*/ + for (c = 0; c < 256; c++) { + if (c == orig ) { + continue; + } + sigbder[i] = c; + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbder, sizeof(sigbder)) == 0 || secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 0); + } + sigbder[i] = orig; + } + } + + /* Test r/s equal to zero */ + { + /* (1,1) encoded in DER. */ + unsigned char sigcder[8] = {0x30, 0x06, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01}; + unsigned char sigc64[64] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + }; + secp256k1_pubkey pubkeyc; + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sigc64, 0) == 1); + CHECK(secp256k1_ecdsa_recover(ctx, &pubkeyc, &rsig, msg32) == 1); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigcder, sizeof(sigcder)) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyc) == 1); + sigcder[4] = 0; + sigc64[31] = 0; + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sigc64, 0) == 1); + CHECK(secp256k1_ecdsa_recover(ctx, &pubkeyb, &rsig, msg32) == 0); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigcder, sizeof(sigcder)) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyc) == 0); + sigcder[4] = 1; + sigcder[7] = 0; + sigc64[31] = 1; + sigc64[63] = 0; + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sigc64, 0) == 1); + CHECK(secp256k1_ecdsa_recover(ctx, &pubkeyb, &rsig, msg32) == 0); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigcder, sizeof(sigcder)) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyc) == 0); + } +} + +void run_recovery_tests(void) { + int i; + for (i = 0; i < count; i++) { + test_ecdsa_recovery_api(); + } + for (i = 0; i < 64*count; i++) { + test_ecdsa_recovery_end_to_end(); + } + test_ecdsa_recovery_edge_cases(); +} + +#endif /* SECP256K1_MODULE_RECOVERY_TESTS_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/num.h b/src/cryptoconditions/src/include/secp256k1/src/num.h index 339b6bb6e..49f2dd791 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/num.h +++ b/src/cryptoconditions/src/include/secp256k1/src/num.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_NUM_ -#define _SECP256K1_NUM_ +#ifndef SECP256K1_NUM_H +#define SECP256K1_NUM_H #ifndef USE_NUM_NONE @@ -20,49 +20,55 @@ #endif /** Copy a number. */ -static void secp256k1_num_copy(secp256k1_num_t *r, const secp256k1_num_t *a); +static void secp256k1_num_copy(secp256k1_num *r, const secp256k1_num *a); /** Convert a number's absolute value to a binary big-endian string. * There must be enough place. */ -static void secp256k1_num_get_bin(unsigned char *r, unsigned int rlen, const secp256k1_num_t *a); +static void secp256k1_num_get_bin(unsigned char *r, unsigned int rlen, const secp256k1_num *a); /** Set a number to the value of a binary big-endian string. */ -static void secp256k1_num_set_bin(secp256k1_num_t *r, const unsigned char *a, unsigned int alen); +static void secp256k1_num_set_bin(secp256k1_num *r, const unsigned char *a, unsigned int alen); /** Compute a modular inverse. The input must be less than the modulus. */ -static void secp256k1_num_mod_inverse(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *m); +static void secp256k1_num_mod_inverse(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *m); + +/** Compute the jacobi symbol (a|b). b must be positive and odd. */ +static int secp256k1_num_jacobi(const secp256k1_num *a, const secp256k1_num *b); /** Compare the absolute value of two numbers. */ -static int secp256k1_num_cmp(const secp256k1_num_t *a, const secp256k1_num_t *b); +static int secp256k1_num_cmp(const secp256k1_num *a, const secp256k1_num *b); /** Test whether two number are equal (including sign). */ -static int secp256k1_num_eq(const secp256k1_num_t *a, const secp256k1_num_t *b); +static int secp256k1_num_eq(const secp256k1_num *a, const secp256k1_num *b); /** Add two (signed) numbers. */ -static void secp256k1_num_add(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b); +static void secp256k1_num_add(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b); /** Subtract two (signed) numbers. */ -static void secp256k1_num_sub(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b); +static void secp256k1_num_sub(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b); /** Multiply two (signed) numbers. */ -static void secp256k1_num_mul(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b); +static void secp256k1_num_mul(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b); /** Replace a number by its remainder modulo m. M's sign is ignored. The result is a number between 0 and m-1, even if r was negative. */ -static void secp256k1_num_mod(secp256k1_num_t *r, const secp256k1_num_t *m); +static void secp256k1_num_mod(secp256k1_num *r, const secp256k1_num *m); /** Right-shift the passed number by bits bits. */ -static void secp256k1_num_shift(secp256k1_num_t *r, int bits); +static void secp256k1_num_shift(secp256k1_num *r, int bits); /** Check whether a number is zero. */ -static int secp256k1_num_is_zero(const secp256k1_num_t *a); +static int secp256k1_num_is_zero(const secp256k1_num *a); + +/** Check whether a number is one. */ +static int secp256k1_num_is_one(const secp256k1_num *a); /** Check whether a number is strictly negative. */ -static int secp256k1_num_is_neg(const secp256k1_num_t *a); +static int secp256k1_num_is_neg(const secp256k1_num *a); /** Change a number's sign. */ -static void secp256k1_num_negate(secp256k1_num_t *r); +static void secp256k1_num_negate(secp256k1_num *r); #endif -#endif +#endif /* SECP256K1_NUM_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/num_gmp.h b/src/cryptoconditions/src/include/secp256k1/src/num_gmp.h index baa1f2bf2..3619844bd 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/num_gmp.h +++ b/src/cryptoconditions/src/include/secp256k1/src/num_gmp.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_NUM_REPR_ -#define _SECP256K1_NUM_REPR_ +#ifndef SECP256K1_NUM_REPR_H +#define SECP256K1_NUM_REPR_H #include @@ -15,6 +15,6 @@ typedef struct { mp_limb_t data[2*NUM_LIMBS]; int neg; int limbs; -} secp256k1_num_t; +} secp256k1_num; -#endif +#endif /* SECP256K1_NUM_REPR_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/num_gmp_impl.h b/src/cryptoconditions/src/include/secp256k1/src/num_gmp_impl.h index dbbc458d5..0ae2a8ba0 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/num_gmp_impl.h +++ b/src/cryptoconditions/src/include/secp256k1/src/num_gmp_impl.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_NUM_REPR_IMPL_H_ -#define _SECP256K1_NUM_REPR_IMPL_H_ +#ifndef SECP256K1_NUM_REPR_IMPL_H +#define SECP256K1_NUM_REPR_IMPL_H #include #include @@ -15,18 +15,18 @@ #include "num.h" #ifdef VERIFY -static void secp256k1_num_sanity(const secp256k1_num_t *a) { +static void secp256k1_num_sanity(const secp256k1_num *a) { VERIFY_CHECK(a->limbs == 1 || (a->limbs > 1 && a->data[a->limbs-1] != 0)); } #else #define secp256k1_num_sanity(a) do { } while(0) #endif -static void secp256k1_num_copy(secp256k1_num_t *r, const secp256k1_num_t *a) { +static void secp256k1_num_copy(secp256k1_num *r, const secp256k1_num *a) { *r = *a; } -static void secp256k1_num_get_bin(unsigned char *r, unsigned int rlen, const secp256k1_num_t *a) { +static void secp256k1_num_get_bin(unsigned char *r, unsigned int rlen, const secp256k1_num *a) { unsigned char tmp[65]; int len = 0; int shift = 0; @@ -42,7 +42,7 @@ static void secp256k1_num_get_bin(unsigned char *r, unsigned int rlen, const sec memset(tmp, 0, sizeof(tmp)); } -static void secp256k1_num_set_bin(secp256k1_num_t *r, const unsigned char *a, unsigned int alen) { +static void secp256k1_num_set_bin(secp256k1_num *r, const unsigned char *a, unsigned int alen) { int len; VERIFY_CHECK(alen > 0); VERIFY_CHECK(alen <= 64); @@ -59,7 +59,7 @@ static void secp256k1_num_set_bin(secp256k1_num_t *r, const unsigned char *a, un } } -static void secp256k1_num_add_abs(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b) { +static void secp256k1_num_add_abs(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b) { mp_limb_t c = mpn_add(r->data, a->data, a->limbs, b->data, b->limbs); r->limbs = a->limbs; if (c != 0) { @@ -68,8 +68,9 @@ static void secp256k1_num_add_abs(secp256k1_num_t *r, const secp256k1_num_t *a, } } -static void secp256k1_num_sub_abs(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b) { +static void secp256k1_num_sub_abs(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b) { mp_limb_t c = mpn_sub(r->data, a->data, a->limbs, b->data, b->limbs); + (void)c; VERIFY_CHECK(c == 0); r->limbs = a->limbs; while (r->limbs > 1 && r->data[r->limbs-1]==0) { @@ -77,7 +78,7 @@ static void secp256k1_num_sub_abs(secp256k1_num_t *r, const secp256k1_num_t *a, } } -static void secp256k1_num_mod(secp256k1_num_t *r, const secp256k1_num_t *m) { +static void secp256k1_num_mod(secp256k1_num *r, const secp256k1_num *m) { secp256k1_num_sanity(r); secp256k1_num_sanity(m); @@ -97,7 +98,7 @@ static void secp256k1_num_mod(secp256k1_num_t *r, const secp256k1_num_t *m) { } } -static void secp256k1_num_mod_inverse(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *m) { +static void secp256k1_num_mod_inverse(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *m) { int i; mp_limb_t g[NUM_LIMBS+1]; mp_limb_t u[NUM_LIMBS+1]; @@ -125,6 +126,7 @@ static void secp256k1_num_mod_inverse(secp256k1_num_t *r, const secp256k1_num_t } sn = NUM_LIMBS+1; gn = mpn_gcdext(g, r->data, &sn, u, m->limbs, v, m->limbs); + (void)gn; VERIFY_CHECK(gn == 1); VERIFY_CHECK(g[0] == 1); r->neg = a->neg ^ m->neg; @@ -142,15 +144,41 @@ static void secp256k1_num_mod_inverse(secp256k1_num_t *r, const secp256k1_num_t memset(v, 0, sizeof(v)); } -static int secp256k1_num_is_zero(const secp256k1_num_t *a) { +static int secp256k1_num_jacobi(const secp256k1_num *a, const secp256k1_num *b) { + int ret; + mpz_t ga, gb; + secp256k1_num_sanity(a); + secp256k1_num_sanity(b); + VERIFY_CHECK(!b->neg && (b->limbs > 0) && (b->data[0] & 1)); + + mpz_inits(ga, gb, NULL); + + mpz_import(gb, b->limbs, -1, sizeof(mp_limb_t), 0, 0, b->data); + mpz_import(ga, a->limbs, -1, sizeof(mp_limb_t), 0, 0, a->data); + if (a->neg) { + mpz_neg(ga, ga); + } + + ret = mpz_jacobi(ga, gb); + + mpz_clears(ga, gb, NULL); + + return ret; +} + +static int secp256k1_num_is_one(const secp256k1_num *a) { + return (a->limbs == 1 && a->data[0] == 1); +} + +static int secp256k1_num_is_zero(const secp256k1_num *a) { return (a->limbs == 1 && a->data[0] == 0); } -static int secp256k1_num_is_neg(const secp256k1_num_t *a) { +static int secp256k1_num_is_neg(const secp256k1_num *a) { return (a->limbs > 1 || a->data[0] != 0) && a->neg; } -static int secp256k1_num_cmp(const secp256k1_num_t *a, const secp256k1_num_t *b) { +static int secp256k1_num_cmp(const secp256k1_num *a, const secp256k1_num *b) { if (a->limbs > b->limbs) { return 1; } @@ -160,7 +188,7 @@ static int secp256k1_num_cmp(const secp256k1_num_t *a, const secp256k1_num_t *b) return mpn_cmp(a->data, b->data, a->limbs); } -static int secp256k1_num_eq(const secp256k1_num_t *a, const secp256k1_num_t *b) { +static int secp256k1_num_eq(const secp256k1_num *a, const secp256k1_num *b) { if (a->limbs > b->limbs) { return 0; } @@ -173,7 +201,7 @@ static int secp256k1_num_eq(const secp256k1_num_t *a, const secp256k1_num_t *b) return mpn_cmp(a->data, b->data, a->limbs) == 0; } -static void secp256k1_num_subadd(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b, int bneg) { +static void secp256k1_num_subadd(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b, int bneg) { if (!(b->neg ^ bneg ^ a->neg)) { /* a and b have the same sign */ r->neg = a->neg; if (a->limbs >= b->limbs) { @@ -192,19 +220,19 @@ static void secp256k1_num_subadd(secp256k1_num_t *r, const secp256k1_num_t *a, c } } -static void secp256k1_num_add(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b) { +static void secp256k1_num_add(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b) { secp256k1_num_sanity(a); secp256k1_num_sanity(b); secp256k1_num_subadd(r, a, b, 0); } -static void secp256k1_num_sub(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b) { +static void secp256k1_num_sub(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b) { secp256k1_num_sanity(a); secp256k1_num_sanity(b); secp256k1_num_subadd(r, a, b, 1); } -static void secp256k1_num_mul(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b) { +static void secp256k1_num_mul(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b) { mp_limb_t tmp[2*NUM_LIMBS+1]; secp256k1_num_sanity(a); secp256k1_num_sanity(b); @@ -231,13 +259,13 @@ static void secp256k1_num_mul(secp256k1_num_t *r, const secp256k1_num_t *a, cons memset(tmp, 0, sizeof(tmp)); } -static void secp256k1_num_shift(secp256k1_num_t *r, int bits) { - int i; +static void secp256k1_num_shift(secp256k1_num *r, int bits) { if (bits % GMP_NUMB_BITS) { /* Shift within limbs. */ mpn_rshift(r->data, r->data, r->limbs, bits % GMP_NUMB_BITS); } if (bits >= GMP_NUMB_BITS) { + int i; /* Shift full limbs. */ for (i = 0; i < r->limbs; i++) { int index = i + (bits / GMP_NUMB_BITS); @@ -253,8 +281,8 @@ static void secp256k1_num_shift(secp256k1_num_t *r, int bits) { } } -static void secp256k1_num_negate(secp256k1_num_t *r) { +static void secp256k1_num_negate(secp256k1_num *r) { r->neg ^= 1; } -#endif +#endif /* SECP256K1_NUM_REPR_IMPL_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/num_impl.h b/src/cryptoconditions/src/include/secp256k1/src/num_impl.h index 0b0e3a072..c45193b03 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/num_impl.h +++ b/src/cryptoconditions/src/include/secp256k1/src/num_impl.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_NUM_IMPL_H_ -#define _SECP256K1_NUM_IMPL_H_ +#ifndef SECP256K1_NUM_IMPL_H +#define SECP256K1_NUM_IMPL_H #if defined HAVE_CONFIG_H #include "libsecp256k1-config.h" @@ -21,4 +21,4 @@ #error "Please select num implementation" #endif -#endif +#endif /* SECP256K1_NUM_IMPL_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/scalar.h b/src/cryptoconditions/src/include/secp256k1/src/scalar.h index f5d09f8d4..59304cb66 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/scalar.h +++ b/src/cryptoconditions/src/include/secp256k1/src/scalar.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_SCALAR_ -#define _SECP256K1_SCALAR_ +#ifndef SECP256K1_SCALAR_H +#define SECP256K1_SCALAR_H #include "num.h" @@ -13,7 +13,9 @@ #include "libsecp256k1-config.h" #endif -#if defined(USE_SCALAR_4X64) +#if defined(EXHAUSTIVE_TEST_ORDER) +#include "scalar_low.h" +#elif defined(USE_SCALAR_4X64) #include "scalar_4x64.h" #elif defined(USE_SCALAR_8X32) #include "scalar_8x32.h" @@ -22,72 +24,83 @@ #endif /** Clear a scalar to prevent the leak of sensitive data. */ -static void secp256k1_scalar_clear(secp256k1_scalar_t *r); +static void secp256k1_scalar_clear(secp256k1_scalar *r); /** Access bits from a scalar. All requested bits must belong to the same 32-bit limb. */ -static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar_t *a, unsigned int offset, unsigned int count); +static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar *a, unsigned int offset, unsigned int count); /** Access bits from a scalar. Not constant time. */ -static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar_t *a, unsigned int offset, unsigned int count); +static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar *a, unsigned int offset, unsigned int count); /** Set a scalar from a big endian byte array. */ -static void secp256k1_scalar_set_b32(secp256k1_scalar_t *r, const unsigned char *bin, int *overflow); +static void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *bin, int *overflow); /** Set a scalar to an unsigned integer. */ -static void secp256k1_scalar_set_int(secp256k1_scalar_t *r, unsigned int v); +static void secp256k1_scalar_set_int(secp256k1_scalar *r, unsigned int v); /** Convert a scalar to a byte array. */ -static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar_t* a); +static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar* a); /** Add two scalars together (modulo the group order). Returns whether it overflowed. */ -static int secp256k1_scalar_add(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b); +static int secp256k1_scalar_add(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b); -/** Add a power of two to a scalar. The result is not allowed to overflow. */ -static void secp256k1_scalar_add_bit(secp256k1_scalar_t *r, unsigned int bit); +/** Conditionally add a power of two to a scalar. The result is not allowed to overflow. */ +static void secp256k1_scalar_cadd_bit(secp256k1_scalar *r, unsigned int bit, int flag); /** Multiply two scalars (modulo the group order). */ -static void secp256k1_scalar_mul(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b); +static void secp256k1_scalar_mul(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b); + +/** Shift a scalar right by some amount strictly between 0 and 16, returning + * the low bits that were shifted off */ +static int secp256k1_scalar_shr_int(secp256k1_scalar *r, int n); /** Compute the square of a scalar (modulo the group order). */ -static void secp256k1_scalar_sqr(secp256k1_scalar_t *r, const secp256k1_scalar_t *a); +static void secp256k1_scalar_sqr(secp256k1_scalar *r, const secp256k1_scalar *a); /** Compute the inverse of a scalar (modulo the group order). */ -static void secp256k1_scalar_inverse(secp256k1_scalar_t *r, const secp256k1_scalar_t *a); +static void secp256k1_scalar_inverse(secp256k1_scalar *r, const secp256k1_scalar *a); /** Compute the inverse of a scalar (modulo the group order), without constant-time guarantee. */ -static void secp256k1_scalar_inverse_var(secp256k1_scalar_t *r, const secp256k1_scalar_t *a); +static void secp256k1_scalar_inverse_var(secp256k1_scalar *r, const secp256k1_scalar *a); /** Compute the complement of a scalar (modulo the group order). */ -static void secp256k1_scalar_negate(secp256k1_scalar_t *r, const secp256k1_scalar_t *a); +static void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar *a); /** Check whether a scalar equals zero. */ -static int secp256k1_scalar_is_zero(const secp256k1_scalar_t *a); +static int secp256k1_scalar_is_zero(const secp256k1_scalar *a); /** Check whether a scalar equals one. */ -static int secp256k1_scalar_is_one(const secp256k1_scalar_t *a); +static int secp256k1_scalar_is_one(const secp256k1_scalar *a); + +/** Check whether a scalar, considered as an nonnegative integer, is even. */ +static int secp256k1_scalar_is_even(const secp256k1_scalar *a); /** Check whether a scalar is higher than the group order divided by 2. */ -static int secp256k1_scalar_is_high(const secp256k1_scalar_t *a); +static int secp256k1_scalar_is_high(const secp256k1_scalar *a); + +/** Conditionally negate a number, in constant time. + * Returns -1 if the number was negated, 1 otherwise */ +static int secp256k1_scalar_cond_negate(secp256k1_scalar *a, int flag); #ifndef USE_NUM_NONE /** Convert a scalar to a number. */ -static void secp256k1_scalar_get_num(secp256k1_num_t *r, const secp256k1_scalar_t *a); +static void secp256k1_scalar_get_num(secp256k1_num *r, const secp256k1_scalar *a); /** Get the order of the group as a number. */ -static void secp256k1_scalar_order_get_num(secp256k1_num_t *r); +static void secp256k1_scalar_order_get_num(secp256k1_num *r); #endif /** Compare two scalars. */ -static int secp256k1_scalar_eq(const secp256k1_scalar_t *a, const secp256k1_scalar_t *b); +static int secp256k1_scalar_eq(const secp256k1_scalar *a, const secp256k1_scalar *b); #ifdef USE_ENDOMORPHISM /** Find r1 and r2 such that r1+r2*2^128 = a. */ -static void secp256k1_scalar_split_128(secp256k1_scalar_t *r1, secp256k1_scalar_t *r2, const secp256k1_scalar_t *a); +static void secp256k1_scalar_split_128(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a); /** Find r1 and r2 such that r1+r2*lambda = a, and r1 and r2 are maximum 128 bits long (see secp256k1_gej_mul_lambda). */ -static void secp256k1_scalar_split_lambda_var(secp256k1_scalar_t *r1, secp256k1_scalar_t *r2, const secp256k1_scalar_t *a); +static void secp256k1_scalar_split_lambda(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a); #endif /** Multiply a and b (without taking the modulus!), divide by 2**shift, and round to the nearest integer. Shift must be at least 256. */ -static void secp256k1_scalar_mul_shift_var(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b, unsigned int shift); +static void secp256k1_scalar_mul_shift_var(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b, unsigned int shift); -#endif +#endif /* SECP256K1_SCALAR_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/scalar_4x64.h b/src/cryptoconditions/src/include/secp256k1/src/scalar_4x64.h index 82899aa7b..19c7495d1 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/scalar_4x64.h +++ b/src/cryptoconditions/src/include/secp256k1/src/scalar_4x64.h @@ -4,16 +4,16 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_SCALAR_REPR_ -#define _SECP256K1_SCALAR_REPR_ +#ifndef SECP256K1_SCALAR_REPR_H +#define SECP256K1_SCALAR_REPR_H #include /** A scalar modulo the group order of the secp256k1 curve. */ typedef struct { uint64_t d[4]; -} secp256k1_scalar_t; +} secp256k1_scalar; #define SECP256K1_SCALAR_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{((uint64_t)(d1)) << 32 | (d0), ((uint64_t)(d3)) << 32 | (d2), ((uint64_t)(d5)) << 32 | (d4), ((uint64_t)(d7)) << 32 | (d6)}} -#endif +#endif /* SECP256K1_SCALAR_REPR_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/scalar_4x64_impl.h b/src/cryptoconditions/src/include/secp256k1/src/scalar_4x64_impl.h index ff365292f..db1ebf94b 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/scalar_4x64_impl.h +++ b/src/cryptoconditions/src/include/secp256k1/src/scalar_4x64_impl.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_SCALAR_REPR_IMPL_H_ -#define _SECP256K1_SCALAR_REPR_IMPL_H_ +#ifndef SECP256K1_SCALAR_REPR_IMPL_H +#define SECP256K1_SCALAR_REPR_IMPL_H /* Limbs of the secp256k1 order. */ #define SECP256K1_N_0 ((uint64_t)0xBFD25E8CD0364141ULL) @@ -24,26 +24,26 @@ #define SECP256K1_N_H_2 ((uint64_t)0xFFFFFFFFFFFFFFFFULL) #define SECP256K1_N_H_3 ((uint64_t)0x7FFFFFFFFFFFFFFFULL) -SECP256K1_INLINE static void secp256k1_scalar_clear(secp256k1_scalar_t *r) { +SECP256K1_INLINE static void secp256k1_scalar_clear(secp256k1_scalar *r) { r->d[0] = 0; r->d[1] = 0; r->d[2] = 0; r->d[3] = 0; } -SECP256K1_INLINE static void secp256k1_scalar_set_int(secp256k1_scalar_t *r, unsigned int v) { +SECP256K1_INLINE static void secp256k1_scalar_set_int(secp256k1_scalar *r, unsigned int v) { r->d[0] = v; r->d[1] = 0; r->d[2] = 0; r->d[3] = 0; } -SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar_t *a, unsigned int offset, unsigned int count) { +SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar *a, unsigned int offset, unsigned int count) { VERIFY_CHECK((offset + count - 1) >> 6 == offset >> 6); return (a->d[offset >> 6] >> (offset & 0x3F)) & ((((uint64_t)1) << count) - 1); } -SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar_t *a, unsigned int offset, unsigned int count) { +SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar *a, unsigned int offset, unsigned int count) { VERIFY_CHECK(count < 32); VERIFY_CHECK(offset + count <= 256); if ((offset + count - 1) >> 6 == offset >> 6) { @@ -54,7 +54,7 @@ SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits_var(const secp256 } } -SECP256K1_INLINE static int secp256k1_scalar_check_overflow(const secp256k1_scalar_t *a) { +SECP256K1_INLINE static int secp256k1_scalar_check_overflow(const secp256k1_scalar *a) { int yes = 0; int no = 0; no |= (a->d[3] < SECP256K1_N_3); /* No need for a > check. */ @@ -66,7 +66,7 @@ SECP256K1_INLINE static int secp256k1_scalar_check_overflow(const secp256k1_scal return yes; } -SECP256K1_INLINE static int secp256k1_scalar_reduce(secp256k1_scalar_t *r, unsigned int overflow) { +SECP256K1_INLINE static int secp256k1_scalar_reduce(secp256k1_scalar *r, unsigned int overflow) { uint128_t t; VERIFY_CHECK(overflow <= 1); t = (uint128_t)r->d[0] + overflow * SECP256K1_N_C_0; @@ -80,7 +80,7 @@ SECP256K1_INLINE static int secp256k1_scalar_reduce(secp256k1_scalar_t *r, unsig return overflow; } -static int secp256k1_scalar_add(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { +static int secp256k1_scalar_add(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) { int overflow; uint128_t t = (uint128_t)a->d[0] + b->d[0]; r->d[0] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; @@ -96,9 +96,10 @@ static int secp256k1_scalar_add(secp256k1_scalar_t *r, const secp256k1_scalar_t return overflow; } -static void secp256k1_scalar_add_bit(secp256k1_scalar_t *r, unsigned int bit) { +static void secp256k1_scalar_cadd_bit(secp256k1_scalar *r, unsigned int bit, int flag) { uint128_t t; VERIFY_CHECK(bit < 256); + bit += ((uint32_t) flag - 1) & 0x100; /* forcing (bit >> 6) > 3 makes this a noop */ t = (uint128_t)r->d[0] + (((uint64_t)((bit >> 6) == 0)) << (bit & 0x3F)); r->d[0] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; t += (uint128_t)r->d[1] + (((uint64_t)((bit >> 6) == 1)) << (bit & 0x3F)); @@ -113,7 +114,7 @@ static void secp256k1_scalar_add_bit(secp256k1_scalar_t *r, unsigned int bit) { #endif } -static void secp256k1_scalar_set_b32(secp256k1_scalar_t *r, const unsigned char *b32, int *overflow) { +static void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *b32, int *overflow) { int over; r->d[0] = (uint64_t)b32[31] | (uint64_t)b32[30] << 8 | (uint64_t)b32[29] << 16 | (uint64_t)b32[28] << 24 | (uint64_t)b32[27] << 32 | (uint64_t)b32[26] << 40 | (uint64_t)b32[25] << 48 | (uint64_t)b32[24] << 56; r->d[1] = (uint64_t)b32[23] | (uint64_t)b32[22] << 8 | (uint64_t)b32[21] << 16 | (uint64_t)b32[20] << 24 | (uint64_t)b32[19] << 32 | (uint64_t)b32[18] << 40 | (uint64_t)b32[17] << 48 | (uint64_t)b32[16] << 56; @@ -125,18 +126,18 @@ static void secp256k1_scalar_set_b32(secp256k1_scalar_t *r, const unsigned char } } -static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar_t* a) { +static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar* a) { bin[0] = a->d[3] >> 56; bin[1] = a->d[3] >> 48; bin[2] = a->d[3] >> 40; bin[3] = a->d[3] >> 32; bin[4] = a->d[3] >> 24; bin[5] = a->d[3] >> 16; bin[6] = a->d[3] >> 8; bin[7] = a->d[3]; bin[8] = a->d[2] >> 56; bin[9] = a->d[2] >> 48; bin[10] = a->d[2] >> 40; bin[11] = a->d[2] >> 32; bin[12] = a->d[2] >> 24; bin[13] = a->d[2] >> 16; bin[14] = a->d[2] >> 8; bin[15] = a->d[2]; bin[16] = a->d[1] >> 56; bin[17] = a->d[1] >> 48; bin[18] = a->d[1] >> 40; bin[19] = a->d[1] >> 32; bin[20] = a->d[1] >> 24; bin[21] = a->d[1] >> 16; bin[22] = a->d[1] >> 8; bin[23] = a->d[1]; bin[24] = a->d[0] >> 56; bin[25] = a->d[0] >> 48; bin[26] = a->d[0] >> 40; bin[27] = a->d[0] >> 32; bin[28] = a->d[0] >> 24; bin[29] = a->d[0] >> 16; bin[30] = a->d[0] >> 8; bin[31] = a->d[0]; } -SECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar_t *a) { +SECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar *a) { return (a->d[0] | a->d[1] | a->d[2] | a->d[3]) == 0; } -static void secp256k1_scalar_negate(secp256k1_scalar_t *r, const secp256k1_scalar_t *a) { +static void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar *a) { uint64_t nonzero = 0xFFFFFFFFFFFFFFFFULL * (secp256k1_scalar_is_zero(a) == 0); uint128_t t = (uint128_t)(~a->d[0]) + SECP256K1_N_0 + 1; r->d[0] = t & nonzero; t >>= 64; @@ -148,11 +149,11 @@ static void secp256k1_scalar_negate(secp256k1_scalar_t *r, const secp256k1_scala r->d[3] = t & nonzero; } -SECP256K1_INLINE static int secp256k1_scalar_is_one(const secp256k1_scalar_t *a) { +SECP256K1_INLINE static int secp256k1_scalar_is_one(const secp256k1_scalar *a) { return ((a->d[0] ^ 1) | a->d[1] | a->d[2] | a->d[3]) == 0; } -static int secp256k1_scalar_is_high(const secp256k1_scalar_t *a) { +static int secp256k1_scalar_is_high(const secp256k1_scalar *a) { int yes = 0; int no = 0; no |= (a->d[3] < SECP256K1_N_H_3); @@ -164,6 +165,22 @@ static int secp256k1_scalar_is_high(const secp256k1_scalar_t *a) { return yes; } +static int secp256k1_scalar_cond_negate(secp256k1_scalar *r, int flag) { + /* If we are flag = 0, mask = 00...00 and this is a no-op; + * if we are flag = 1, mask = 11...11 and this is identical to secp256k1_scalar_negate */ + uint64_t mask = !flag - 1; + uint64_t nonzero = (secp256k1_scalar_is_zero(r) != 0) - 1; + uint128_t t = (uint128_t)(r->d[0] ^ mask) + ((SECP256K1_N_0 + 1) & mask); + r->d[0] = t & nonzero; t >>= 64; + t += (uint128_t)(r->d[1] ^ mask) + (SECP256K1_N_1 & mask); + r->d[1] = t & nonzero; t >>= 64; + t += (uint128_t)(r->d[2] ^ mask) + (SECP256K1_N_2 & mask); + r->d[2] = t & nonzero; t >>= 64; + t += (uint128_t)(r->d[3] ^ mask) + (SECP256K1_N_3 & mask); + r->d[3] = t & nonzero; + return 2 * (mask == 0) - 1; +} + /* Inspired by the macros in OpenSSL's crypto/bn/asm/x86_64-gcc.c. */ /** Add a*b to the number defined by (c0,c1,c2). c2 must never overflow. */ @@ -250,7 +267,7 @@ static int secp256k1_scalar_is_high(const secp256k1_scalar_t *a) { VERIFY_CHECK(c2 == 0); \ } -static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint64_t *l) { +static void secp256k1_scalar_reduce_512(secp256k1_scalar *r, const uint64_t *l) { #ifdef USE_ASM_X86_64 /* Reduce 512 bits into 385. */ uint64_t m0, m1, m2, m3, m4, m5, m6; @@ -265,8 +282,8 @@ static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint64_t *l "movq 56(%%rsi), %%r14\n" /* Initialize r8,r9,r10 */ "movq 0(%%rsi), %%r8\n" - "movq $0, %%r9\n" - "movq $0, %%r10\n" + "xorq %%r9, %%r9\n" + "xorq %%r10, %%r10\n" /* (r8,r9) += n0 * c0 */ "movq %8, %%rax\n" "mulq %%r11\n" @@ -274,7 +291,7 @@ static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint64_t *l "adcq %%rdx, %%r9\n" /* extract m0 */ "movq %%r8, %q0\n" - "movq $0, %%r8\n" + "xorq %%r8, %%r8\n" /* (r9,r10) += l1 */ "addq 8(%%rsi), %%r9\n" "adcq $0, %%r10\n" @@ -292,7 +309,7 @@ static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint64_t *l "adcq $0, %%r8\n" /* extract m1 */ "movq %%r9, %q1\n" - "movq $0, %%r9\n" + "xorq %%r9, %%r9\n" /* (r10,r8,r9) += l2 */ "addq 16(%%rsi), %%r10\n" "adcq $0, %%r8\n" @@ -315,7 +332,7 @@ static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint64_t *l "adcq $0, %%r9\n" /* extract m2 */ "movq %%r10, %q2\n" - "movq $0, %%r10\n" + "xorq %%r10, %%r10\n" /* (r8,r9,r10) += l3 */ "addq 24(%%rsi), %%r8\n" "adcq $0, %%r9\n" @@ -338,7 +355,7 @@ static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint64_t *l "adcq $0, %%r10\n" /* extract m3 */ "movq %%r8, %q3\n" - "movq $0, %%r8\n" + "xorq %%r8, %%r8\n" /* (r9,r10,r8) += n3 * c1 */ "movq %9, %%rax\n" "mulq %%r14\n" @@ -370,8 +387,8 @@ static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint64_t *l "movq %q11, %%r13\n" /* Initialize (r8,r9,r10) */ "movq %q5, %%r8\n" - "movq $0, %%r9\n" - "movq $0, %%r10\n" + "xorq %%r9, %%r9\n" + "xorq %%r10, %%r10\n" /* (r8,r9) += m4 * c0 */ "movq %12, %%rax\n" "mulq %%r11\n" @@ -379,7 +396,7 @@ static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint64_t *l "adcq %%rdx, %%r9\n" /* extract p0 */ "movq %%r8, %q0\n" - "movq $0, %%r8\n" + "xorq %%r8, %%r8\n" /* (r9,r10) += m1 */ "addq %q6, %%r9\n" "adcq $0, %%r10\n" @@ -397,7 +414,7 @@ static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint64_t *l "adcq $0, %%r8\n" /* extract p1 */ "movq %%r9, %q1\n" - "movq $0, %%r9\n" + "xorq %%r9, %%r9\n" /* (r10,r8,r9) += m2 */ "addq %q7, %%r10\n" "adcq $0, %%r8\n" @@ -455,7 +472,7 @@ static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint64_t *l "movq %%rax, 0(%q6)\n" /* Move to (r8,r9) */ "movq %%rdx, %%r8\n" - "movq $0, %%r9\n" + "xorq %%r9, %%r9\n" /* (r8,r9) += p1 */ "addq %q2, %%r8\n" "adcq $0, %%r9\n" @@ -466,7 +483,7 @@ static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint64_t *l "adcq %%rdx, %%r9\n" /* Extract r1 */ "movq %%r8, 8(%q6)\n" - "movq $0, %%r8\n" + "xorq %%r8, %%r8\n" /* (r9,r8) += p4 */ "addq %%r10, %%r9\n" "adcq $0, %%r8\n" @@ -475,7 +492,7 @@ static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint64_t *l "adcq $0, %%r8\n" /* Extract r2 */ "movq %%r9, 16(%q6)\n" - "movq $0, %%r9\n" + "xorq %%r9, %%r9\n" /* (r8,r9) += p3 */ "addq %q4, %%r8\n" "adcq $0, %%r9\n" @@ -559,7 +576,7 @@ static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint64_t *l secp256k1_scalar_reduce(r, c + secp256k1_scalar_check_overflow(r)); } -static void secp256k1_scalar_mul_512(uint64_t l[8], const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { +static void secp256k1_scalar_mul_512(uint64_t l[8], const secp256k1_scalar *a, const secp256k1_scalar *b) { #ifdef USE_ASM_X86_64 const uint64_t *pb = b->d; __asm__ __volatile__( @@ -721,12 +738,12 @@ static void secp256k1_scalar_mul_512(uint64_t l[8], const secp256k1_scalar_t *a, extract(l[5]); muladd_fast(a->d[3], b->d[3]); extract_fast(l[6]); - VERIFY_CHECK(c1 <= 0); + VERIFY_CHECK(c1 == 0); l[7] = c0; #endif } -static void secp256k1_scalar_sqr_512(uint64_t l[8], const secp256k1_scalar_t *a) { +static void secp256k1_scalar_sqr_512(uint64_t l[8], const secp256k1_scalar *a) { #ifdef USE_ASM_X86_64 __asm__ __volatile__( /* Preload */ @@ -871,19 +888,32 @@ static void secp256k1_scalar_sqr_512(uint64_t l[8], const secp256k1_scalar_t *a) #undef extract #undef extract_fast -static void secp256k1_scalar_mul(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { +static void secp256k1_scalar_mul(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) { uint64_t l[8]; secp256k1_scalar_mul_512(l, a, b); secp256k1_scalar_reduce_512(r, l); } -static void secp256k1_scalar_sqr(secp256k1_scalar_t *r, const secp256k1_scalar_t *a) { +static int secp256k1_scalar_shr_int(secp256k1_scalar *r, int n) { + int ret; + VERIFY_CHECK(n > 0); + VERIFY_CHECK(n < 16); + ret = r->d[0] & ((1 << n) - 1); + r->d[0] = (r->d[0] >> n) + (r->d[1] << (64 - n)); + r->d[1] = (r->d[1] >> n) + (r->d[2] << (64 - n)); + r->d[2] = (r->d[2] >> n) + (r->d[3] << (64 - n)); + r->d[3] = (r->d[3] >> n); + return ret; +} + +static void secp256k1_scalar_sqr(secp256k1_scalar *r, const secp256k1_scalar *a) { uint64_t l[8]; secp256k1_scalar_sqr_512(l, a); secp256k1_scalar_reduce_512(r, l); } -static void secp256k1_scalar_split_128(secp256k1_scalar_t *r1, secp256k1_scalar_t *r2, const secp256k1_scalar_t *a) { +#ifdef USE_ENDOMORPHISM +static void secp256k1_scalar_split_128(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a) { r1->d[0] = a->d[0]; r1->d[1] = a->d[1]; r1->d[2] = 0; @@ -893,12 +923,13 @@ static void secp256k1_scalar_split_128(secp256k1_scalar_t *r1, secp256k1_scalar_ r2->d[2] = 0; r2->d[3] = 0; } +#endif -SECP256K1_INLINE static int secp256k1_scalar_eq(const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { +SECP256K1_INLINE static int secp256k1_scalar_eq(const secp256k1_scalar *a, const secp256k1_scalar *b) { return ((a->d[0] ^ b->d[0]) | (a->d[1] ^ b->d[1]) | (a->d[2] ^ b->d[2]) | (a->d[3] ^ b->d[3])) == 0; } -SECP256K1_INLINE static void secp256k1_scalar_mul_shift_var(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b, unsigned int shift) { +SECP256K1_INLINE static void secp256k1_scalar_mul_shift_var(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b, unsigned int shift) { uint64_t l[8]; unsigned int shiftlimbs; unsigned int shiftlow; @@ -912,9 +943,7 @@ SECP256K1_INLINE static void secp256k1_scalar_mul_shift_var(secp256k1_scalar_t * r->d[1] = shift < 448 ? (l[1 + shiftlimbs] >> shiftlow | (shift < 384 && shiftlow ? (l[2 + shiftlimbs] << shifthigh) : 0)) : 0; r->d[2] = shift < 384 ? (l[2 + shiftlimbs] >> shiftlow | (shift < 320 && shiftlow ? (l[3 + shiftlimbs] << shifthigh) : 0)) : 0; r->d[3] = shift < 320 ? (l[3 + shiftlimbs] >> shiftlow) : 0; - if ((l[(shift - 1) >> 6] >> ((shift - 1) & 0x3f)) & 1) { - secp256k1_scalar_add_bit(r, 0); - } + secp256k1_scalar_cadd_bit(r, 0, (l[(shift - 1) >> 6] >> ((shift - 1) & 0x3f)) & 1); } -#endif +#endif /* SECP256K1_SCALAR_REPR_IMPL_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/scalar_8x32.h b/src/cryptoconditions/src/include/secp256k1/src/scalar_8x32.h index f17017e24..2c9a348e2 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/scalar_8x32.h +++ b/src/cryptoconditions/src/include/secp256k1/src/scalar_8x32.h @@ -4,16 +4,16 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_SCALAR_REPR_ -#define _SECP256K1_SCALAR_REPR_ +#ifndef SECP256K1_SCALAR_REPR_H +#define SECP256K1_SCALAR_REPR_H #include /** A scalar modulo the group order of the secp256k1 curve. */ typedef struct { uint32_t d[8]; -} secp256k1_scalar_t; +} secp256k1_scalar; #define SECP256K1_SCALAR_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{(d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7)}} -#endif +#endif /* SECP256K1_SCALAR_REPR_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/scalar_8x32_impl.h b/src/cryptoconditions/src/include/secp256k1/src/scalar_8x32_impl.h index 22b31d411..4f9ed61fe 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/scalar_8x32_impl.h +++ b/src/cryptoconditions/src/include/secp256k1/src/scalar_8x32_impl.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_SCALAR_REPR_IMPL_H_ -#define _SECP256K1_SCALAR_REPR_IMPL_H_ +#ifndef SECP256K1_SCALAR_REPR_IMPL_H +#define SECP256K1_SCALAR_REPR_IMPL_H /* Limbs of the secp256k1 order. */ #define SECP256K1_N_0 ((uint32_t)0xD0364141UL) @@ -34,7 +34,7 @@ #define SECP256K1_N_H_6 ((uint32_t)0xFFFFFFFFUL) #define SECP256K1_N_H_7 ((uint32_t)0x7FFFFFFFUL) -SECP256K1_INLINE static void secp256k1_scalar_clear(secp256k1_scalar_t *r) { +SECP256K1_INLINE static void secp256k1_scalar_clear(secp256k1_scalar *r) { r->d[0] = 0; r->d[1] = 0; r->d[2] = 0; @@ -45,7 +45,7 @@ SECP256K1_INLINE static void secp256k1_scalar_clear(secp256k1_scalar_t *r) { r->d[7] = 0; } -SECP256K1_INLINE static void secp256k1_scalar_set_int(secp256k1_scalar_t *r, unsigned int v) { +SECP256K1_INLINE static void secp256k1_scalar_set_int(secp256k1_scalar *r, unsigned int v) { r->d[0] = v; r->d[1] = 0; r->d[2] = 0; @@ -56,12 +56,12 @@ SECP256K1_INLINE static void secp256k1_scalar_set_int(secp256k1_scalar_t *r, uns r->d[7] = 0; } -SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar_t *a, unsigned int offset, unsigned int count) { +SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar *a, unsigned int offset, unsigned int count) { VERIFY_CHECK((offset + count - 1) >> 5 == offset >> 5); return (a->d[offset >> 5] >> (offset & 0x1F)) & ((1 << count) - 1); } -SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar_t *a, unsigned int offset, unsigned int count) { +SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar *a, unsigned int offset, unsigned int count) { VERIFY_CHECK(count < 32); VERIFY_CHECK(offset + count <= 256); if ((offset + count - 1) >> 5 == offset >> 5) { @@ -72,7 +72,7 @@ SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits_var(const secp256 } } -SECP256K1_INLINE static int secp256k1_scalar_check_overflow(const secp256k1_scalar_t *a) { +SECP256K1_INLINE static int secp256k1_scalar_check_overflow(const secp256k1_scalar *a) { int yes = 0; int no = 0; no |= (a->d[7] < SECP256K1_N_7); /* No need for a > check. */ @@ -90,7 +90,7 @@ SECP256K1_INLINE static int secp256k1_scalar_check_overflow(const secp256k1_scal return yes; } -SECP256K1_INLINE static int secp256k1_scalar_reduce(secp256k1_scalar_t *r, uint32_t overflow) { +SECP256K1_INLINE static int secp256k1_scalar_reduce(secp256k1_scalar *r, uint32_t overflow) { uint64_t t; VERIFY_CHECK(overflow <= 1); t = (uint64_t)r->d[0] + overflow * SECP256K1_N_C_0; @@ -112,7 +112,7 @@ SECP256K1_INLINE static int secp256k1_scalar_reduce(secp256k1_scalar_t *r, uint3 return overflow; } -static int secp256k1_scalar_add(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { +static int secp256k1_scalar_add(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) { int overflow; uint64_t t = (uint64_t)a->d[0] + b->d[0]; r->d[0] = t & 0xFFFFFFFFULL; t >>= 32; @@ -136,9 +136,10 @@ static int secp256k1_scalar_add(secp256k1_scalar_t *r, const secp256k1_scalar_t return overflow; } -static void secp256k1_scalar_add_bit(secp256k1_scalar_t *r, unsigned int bit) { +static void secp256k1_scalar_cadd_bit(secp256k1_scalar *r, unsigned int bit, int flag) { uint64_t t; VERIFY_CHECK(bit < 256); + bit += ((uint32_t) flag - 1) & 0x100; /* forcing (bit >> 5) > 7 makes this a noop */ t = (uint64_t)r->d[0] + (((uint32_t)((bit >> 5) == 0)) << (bit & 0x1F)); r->d[0] = t & 0xFFFFFFFFULL; t >>= 32; t += (uint64_t)r->d[1] + (((uint32_t)((bit >> 5) == 1)) << (bit & 0x1F)); @@ -161,7 +162,7 @@ static void secp256k1_scalar_add_bit(secp256k1_scalar_t *r, unsigned int bit) { #endif } -static void secp256k1_scalar_set_b32(secp256k1_scalar_t *r, const unsigned char *b32, int *overflow) { +static void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *b32, int *overflow) { int over; r->d[0] = (uint32_t)b32[31] | (uint32_t)b32[30] << 8 | (uint32_t)b32[29] << 16 | (uint32_t)b32[28] << 24; r->d[1] = (uint32_t)b32[27] | (uint32_t)b32[26] << 8 | (uint32_t)b32[25] << 16 | (uint32_t)b32[24] << 24; @@ -177,7 +178,7 @@ static void secp256k1_scalar_set_b32(secp256k1_scalar_t *r, const unsigned char } } -static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar_t* a) { +static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar* a) { bin[0] = a->d[7] >> 24; bin[1] = a->d[7] >> 16; bin[2] = a->d[7] >> 8; bin[3] = a->d[7]; bin[4] = a->d[6] >> 24; bin[5] = a->d[6] >> 16; bin[6] = a->d[6] >> 8; bin[7] = a->d[6]; bin[8] = a->d[5] >> 24; bin[9] = a->d[5] >> 16; bin[10] = a->d[5] >> 8; bin[11] = a->d[5]; @@ -188,11 +189,11 @@ static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar_ bin[28] = a->d[0] >> 24; bin[29] = a->d[0] >> 16; bin[30] = a->d[0] >> 8; bin[31] = a->d[0]; } -SECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar_t *a) { +SECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar *a) { return (a->d[0] | a->d[1] | a->d[2] | a->d[3] | a->d[4] | a->d[5] | a->d[6] | a->d[7]) == 0; } -static void secp256k1_scalar_negate(secp256k1_scalar_t *r, const secp256k1_scalar_t *a) { +static void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar *a) { uint32_t nonzero = 0xFFFFFFFFUL * (secp256k1_scalar_is_zero(a) == 0); uint64_t t = (uint64_t)(~a->d[0]) + SECP256K1_N_0 + 1; r->d[0] = t & nonzero; t >>= 32; @@ -212,11 +213,11 @@ static void secp256k1_scalar_negate(secp256k1_scalar_t *r, const secp256k1_scala r->d[7] = t & nonzero; } -SECP256K1_INLINE static int secp256k1_scalar_is_one(const secp256k1_scalar_t *a) { +SECP256K1_INLINE static int secp256k1_scalar_is_one(const secp256k1_scalar *a) { return ((a->d[0] ^ 1) | a->d[1] | a->d[2] | a->d[3] | a->d[4] | a->d[5] | a->d[6] | a->d[7]) == 0; } -static int secp256k1_scalar_is_high(const secp256k1_scalar_t *a) { +static int secp256k1_scalar_is_high(const secp256k1_scalar *a) { int yes = 0; int no = 0; no |= (a->d[7] < SECP256K1_N_H_7); @@ -234,6 +235,31 @@ static int secp256k1_scalar_is_high(const secp256k1_scalar_t *a) { return yes; } +static int secp256k1_scalar_cond_negate(secp256k1_scalar *r, int flag) { + /* If we are flag = 0, mask = 00...00 and this is a no-op; + * if we are flag = 1, mask = 11...11 and this is identical to secp256k1_scalar_negate */ + uint32_t mask = !flag - 1; + uint32_t nonzero = 0xFFFFFFFFUL * (secp256k1_scalar_is_zero(r) == 0); + uint64_t t = (uint64_t)(r->d[0] ^ mask) + ((SECP256K1_N_0 + 1) & mask); + r->d[0] = t & nonzero; t >>= 32; + t += (uint64_t)(r->d[1] ^ mask) + (SECP256K1_N_1 & mask); + r->d[1] = t & nonzero; t >>= 32; + t += (uint64_t)(r->d[2] ^ mask) + (SECP256K1_N_2 & mask); + r->d[2] = t & nonzero; t >>= 32; + t += (uint64_t)(r->d[3] ^ mask) + (SECP256K1_N_3 & mask); + r->d[3] = t & nonzero; t >>= 32; + t += (uint64_t)(r->d[4] ^ mask) + (SECP256K1_N_4 & mask); + r->d[4] = t & nonzero; t >>= 32; + t += (uint64_t)(r->d[5] ^ mask) + (SECP256K1_N_5 & mask); + r->d[5] = t & nonzero; t >>= 32; + t += (uint64_t)(r->d[6] ^ mask) + (SECP256K1_N_6 & mask); + r->d[6] = t & nonzero; t >>= 32; + t += (uint64_t)(r->d[7] ^ mask) + (SECP256K1_N_7 & mask); + r->d[7] = t & nonzero; + return 2 * (mask == 0) - 1; +} + + /* Inspired by the macros in OpenSSL's crypto/bn/asm/x86_64-gcc.c. */ /** Add a*b to the number defined by (c0,c1,c2). c2 must never overflow. */ @@ -320,7 +346,7 @@ static int secp256k1_scalar_is_high(const secp256k1_scalar_t *a) { VERIFY_CHECK(c2 == 0); \ } -static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint32_t *l) { +static void secp256k1_scalar_reduce_512(secp256k1_scalar *r, const uint32_t *l) { uint64_t c; uint32_t n0 = l[8], n1 = l[9], n2 = l[10], n3 = l[11], n4 = l[12], n5 = l[13], n6 = l[14], n7 = l[15]; uint32_t m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12; @@ -462,7 +488,7 @@ static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint32_t *l secp256k1_scalar_reduce(r, c + secp256k1_scalar_check_overflow(r)); } -static void secp256k1_scalar_mul_512(uint32_t *l, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { +static void secp256k1_scalar_mul_512(uint32_t *l, const secp256k1_scalar *a, const secp256k1_scalar *b) { /* 96 bit accumulator. */ uint32_t c0 = 0, c1 = 0, c2 = 0; @@ -550,7 +576,7 @@ static void secp256k1_scalar_mul_512(uint32_t *l, const secp256k1_scalar_t *a, c l[15] = c0; } -static void secp256k1_scalar_sqr_512(uint32_t *l, const secp256k1_scalar_t *a) { +static void secp256k1_scalar_sqr_512(uint32_t *l, const secp256k1_scalar *a) { /* 96 bit accumulator. */ uint32_t c0 = 0, c1 = 0, c2 = 0; @@ -618,20 +644,36 @@ static void secp256k1_scalar_sqr_512(uint32_t *l, const secp256k1_scalar_t *a) { #undef extract #undef extract_fast -static void secp256k1_scalar_mul(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { +static void secp256k1_scalar_mul(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) { uint32_t l[16]; secp256k1_scalar_mul_512(l, a, b); secp256k1_scalar_reduce_512(r, l); } -static void secp256k1_scalar_sqr(secp256k1_scalar_t *r, const secp256k1_scalar_t *a) { +static int secp256k1_scalar_shr_int(secp256k1_scalar *r, int n) { + int ret; + VERIFY_CHECK(n > 0); + VERIFY_CHECK(n < 16); + ret = r->d[0] & ((1 << n) - 1); + r->d[0] = (r->d[0] >> n) + (r->d[1] << (32 - n)); + r->d[1] = (r->d[1] >> n) + (r->d[2] << (32 - n)); + r->d[2] = (r->d[2] >> n) + (r->d[3] << (32 - n)); + r->d[3] = (r->d[3] >> n) + (r->d[4] << (32 - n)); + r->d[4] = (r->d[4] >> n) + (r->d[5] << (32 - n)); + r->d[5] = (r->d[5] >> n) + (r->d[6] << (32 - n)); + r->d[6] = (r->d[6] >> n) + (r->d[7] << (32 - n)); + r->d[7] = (r->d[7] >> n); + return ret; +} + +static void secp256k1_scalar_sqr(secp256k1_scalar *r, const secp256k1_scalar *a) { uint32_t l[16]; secp256k1_scalar_sqr_512(l, a); secp256k1_scalar_reduce_512(r, l); } #ifdef USE_ENDOMORPHISM -static void secp256k1_scalar_split_128(secp256k1_scalar_t *r1, secp256k1_scalar_t *r2, const secp256k1_scalar_t *a) { +static void secp256k1_scalar_split_128(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a) { r1->d[0] = a->d[0]; r1->d[1] = a->d[1]; r1->d[2] = a->d[2]; @@ -651,11 +693,11 @@ static void secp256k1_scalar_split_128(secp256k1_scalar_t *r1, secp256k1_scalar_ } #endif -SECP256K1_INLINE static int secp256k1_scalar_eq(const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { +SECP256K1_INLINE static int secp256k1_scalar_eq(const secp256k1_scalar *a, const secp256k1_scalar *b) { return ((a->d[0] ^ b->d[0]) | (a->d[1] ^ b->d[1]) | (a->d[2] ^ b->d[2]) | (a->d[3] ^ b->d[3]) | (a->d[4] ^ b->d[4]) | (a->d[5] ^ b->d[5]) | (a->d[6] ^ b->d[6]) | (a->d[7] ^ b->d[7])) == 0; } -SECP256K1_INLINE static void secp256k1_scalar_mul_shift_var(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b, unsigned int shift) { +SECP256K1_INLINE static void secp256k1_scalar_mul_shift_var(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b, unsigned int shift) { uint32_t l[16]; unsigned int shiftlimbs; unsigned int shiftlow; @@ -673,9 +715,7 @@ SECP256K1_INLINE static void secp256k1_scalar_mul_shift_var(secp256k1_scalar_t * r->d[5] = shift < 352 ? (l[5 + shiftlimbs] >> shiftlow | (shift < 320 && shiftlow ? (l[6 + shiftlimbs] << shifthigh) : 0)) : 0; r->d[6] = shift < 320 ? (l[6 + shiftlimbs] >> shiftlow | (shift < 288 && shiftlow ? (l[7 + shiftlimbs] << shifthigh) : 0)) : 0; r->d[7] = shift < 288 ? (l[7 + shiftlimbs] >> shiftlow) : 0; - if ((l[(shift - 1) >> 5] >> ((shift - 1) & 0x1f)) & 1) { - secp256k1_scalar_add_bit(r, 0); - } + secp256k1_scalar_cadd_bit(r, 0, (l[(shift - 1) >> 5] >> ((shift - 1) & 0x1f)) & 1); } -#endif +#endif /* SECP256K1_SCALAR_REPR_IMPL_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/scalar_impl.h b/src/cryptoconditions/src/include/secp256k1/src/scalar_impl.h index 33824983e..fa790570f 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/scalar_impl.h +++ b/src/cryptoconditions/src/include/secp256k1/src/scalar_impl.h @@ -4,10 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_SCALAR_IMPL_H_ -#define _SECP256K1_SCALAR_IMPL_H_ - -#include +#ifndef SECP256K1_SCALAR_IMPL_H +#define SECP256K1_SCALAR_IMPL_H #include "group.h" #include "scalar.h" @@ -16,7 +14,9 @@ #include "libsecp256k1-config.h" #endif -#if defined(USE_SCALAR_4X64) +#if defined(EXHAUSTIVE_TEST_ORDER) +#include "scalar_low_impl.h" +#elif defined(USE_SCALAR_4X64) #include "scalar_4x64_impl.h" #elif defined(USE_SCALAR_8X32) #include "scalar_8x32_impl.h" @@ -25,109 +25,120 @@ #endif #ifndef USE_NUM_NONE -static void secp256k1_scalar_get_num(secp256k1_num_t *r, const secp256k1_scalar_t *a) { +static void secp256k1_scalar_get_num(secp256k1_num *r, const secp256k1_scalar *a) { unsigned char c[32]; secp256k1_scalar_get_b32(c, a); secp256k1_num_set_bin(r, c, 32); } /** secp256k1 curve order, see secp256k1_ecdsa_const_order_as_fe in ecdsa_impl.h */ -static void secp256k1_scalar_order_get_num(secp256k1_num_t *r) { +static void secp256k1_scalar_order_get_num(secp256k1_num *r) { +#if defined(EXHAUSTIVE_TEST_ORDER) + static const unsigned char order[32] = { + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,EXHAUSTIVE_TEST_ORDER + }; +#else static const unsigned char order[32] = { 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, 0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B, 0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x41 }; +#endif secp256k1_num_set_bin(r, order, 32); } #endif -static void secp256k1_scalar_inverse(secp256k1_scalar_t *r, const secp256k1_scalar_t *x) { - secp256k1_scalar_t *t; +static void secp256k1_scalar_inverse(secp256k1_scalar *r, const secp256k1_scalar *x) { +#if defined(EXHAUSTIVE_TEST_ORDER) int i; - /* First compute x ^ (2^N - 1) for some values of N. */ - secp256k1_scalar_t x2, x3, x4, x6, x7, x8, x15, x30, x60, x120, x127; + *r = 0; + for (i = 0; i < EXHAUSTIVE_TEST_ORDER; i++) + if ((i * *x) % EXHAUSTIVE_TEST_ORDER == 1) + *r = i; + /* If this VERIFY_CHECK triggers we were given a noninvertible scalar (and thus + * have a composite group order; fix it in exhaustive_tests.c). */ + VERIFY_CHECK(*r != 0); +} +#else + secp256k1_scalar *t; + int i; + /* First compute xN as x ^ (2^N - 1) for some values of N, + * and uM as x ^ M for some values of M. */ + secp256k1_scalar x2, x3, x6, x8, x14, x28, x56, x112, x126; + secp256k1_scalar u2, u5, u9, u11, u13; - secp256k1_scalar_sqr(&x2, x); - secp256k1_scalar_mul(&x2, &x2, x); + secp256k1_scalar_sqr(&u2, x); + secp256k1_scalar_mul(&x2, &u2, x); + secp256k1_scalar_mul(&u5, &u2, &x2); + secp256k1_scalar_mul(&x3, &u5, &u2); + secp256k1_scalar_mul(&u9, &x3, &u2); + secp256k1_scalar_mul(&u11, &u9, &u2); + secp256k1_scalar_mul(&u13, &u11, &u2); - secp256k1_scalar_sqr(&x3, &x2); - secp256k1_scalar_mul(&x3, &x3, x); - - secp256k1_scalar_sqr(&x4, &x3); - secp256k1_scalar_mul(&x4, &x4, x); - - secp256k1_scalar_sqr(&x6, &x4); + secp256k1_scalar_sqr(&x6, &u13); secp256k1_scalar_sqr(&x6, &x6); - secp256k1_scalar_mul(&x6, &x6, &x2); + secp256k1_scalar_mul(&x6, &x6, &u11); - secp256k1_scalar_sqr(&x7, &x6); - secp256k1_scalar_mul(&x7, &x7, x); + secp256k1_scalar_sqr(&x8, &x6); + secp256k1_scalar_sqr(&x8, &x8); + secp256k1_scalar_mul(&x8, &x8, &x2); - secp256k1_scalar_sqr(&x8, &x7); - secp256k1_scalar_mul(&x8, &x8, x); - - secp256k1_scalar_sqr(&x15, &x8); - for (i = 0; i < 6; i++) { - secp256k1_scalar_sqr(&x15, &x15); + secp256k1_scalar_sqr(&x14, &x8); + for (i = 0; i < 5; i++) { + secp256k1_scalar_sqr(&x14, &x14); } - secp256k1_scalar_mul(&x15, &x15, &x7); + secp256k1_scalar_mul(&x14, &x14, &x6); - secp256k1_scalar_sqr(&x30, &x15); - for (i = 0; i < 14; i++) { - secp256k1_scalar_sqr(&x30, &x30); + secp256k1_scalar_sqr(&x28, &x14); + for (i = 0; i < 13; i++) { + secp256k1_scalar_sqr(&x28, &x28); } - secp256k1_scalar_mul(&x30, &x30, &x15); + secp256k1_scalar_mul(&x28, &x28, &x14); - secp256k1_scalar_sqr(&x60, &x30); - for (i = 0; i < 29; i++) { - secp256k1_scalar_sqr(&x60, &x60); + secp256k1_scalar_sqr(&x56, &x28); + for (i = 0; i < 27; i++) { + secp256k1_scalar_sqr(&x56, &x56); } - secp256k1_scalar_mul(&x60, &x60, &x30); + secp256k1_scalar_mul(&x56, &x56, &x28); - secp256k1_scalar_sqr(&x120, &x60); - for (i = 0; i < 59; i++) { - secp256k1_scalar_sqr(&x120, &x120); + secp256k1_scalar_sqr(&x112, &x56); + for (i = 0; i < 55; i++) { + secp256k1_scalar_sqr(&x112, &x112); } - secp256k1_scalar_mul(&x120, &x120, &x60); + secp256k1_scalar_mul(&x112, &x112, &x56); - secp256k1_scalar_sqr(&x127, &x120); - for (i = 0; i < 6; i++) { - secp256k1_scalar_sqr(&x127, &x127); + secp256k1_scalar_sqr(&x126, &x112); + for (i = 0; i < 13; i++) { + secp256k1_scalar_sqr(&x126, &x126); } - secp256k1_scalar_mul(&x127, &x127, &x7); + secp256k1_scalar_mul(&x126, &x126, &x14); - /* Then accumulate the final result (t starts at x127). */ - t = &x127; - for (i = 0; i < 2; i++) { /* 0 */ + /* Then accumulate the final result (t starts at x126). */ + t = &x126; + for (i = 0; i < 3; i++) { secp256k1_scalar_sqr(t, t); } - secp256k1_scalar_mul(t, t, x); /* 1 */ + secp256k1_scalar_mul(t, t, &u5); /* 101 */ for (i = 0; i < 4; i++) { /* 0 */ secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, &x3); /* 111 */ - for (i = 0; i < 2; i++) { /* 0 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 2; i++) { /* 0 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 2; i++) { /* 0 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ for (i = 0; i < 4; i++) { /* 0 */ secp256k1_scalar_sqr(t, t); } - secp256k1_scalar_mul(t, t, &x3); /* 111 */ - for (i = 0; i < 3; i++) { /* 0 */ + secp256k1_scalar_mul(t, t, &u5); /* 101 */ + for (i = 0; i < 5; i++) { /* 0 */ secp256k1_scalar_sqr(t, t); } - secp256k1_scalar_mul(t, t, &x2); /* 11 */ + secp256k1_scalar_mul(t, t, &u11); /* 1011 */ + for (i = 0; i < 4; i++) { + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &u11); /* 1011 */ for (i = 0; i < 4; i++) { /* 0 */ secp256k1_scalar_sqr(t, t); } @@ -136,38 +147,26 @@ static void secp256k1_scalar_inverse(secp256k1_scalar_t *r, const secp256k1_scal secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, &x3); /* 111 */ - for (i = 0; i < 4; i++) { /* 00 */ + for (i = 0; i < 6; i++) { /* 00 */ secp256k1_scalar_sqr(t, t); } - secp256k1_scalar_mul(t, t, &x2); /* 11 */ - for (i = 0; i < 2; i++) { /* 0 */ + secp256k1_scalar_mul(t, t, &u13); /* 1101 */ + for (i = 0; i < 4; i++) { /* 0 */ secp256k1_scalar_sqr(t, t); } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 2; i++) { /* 0 */ + secp256k1_scalar_mul(t, t, &u5); /* 101 */ + for (i = 0; i < 3; i++) { secp256k1_scalar_sqr(t, t); } - secp256k1_scalar_mul(t, t, x); /* 1 */ + secp256k1_scalar_mul(t, t, &x3); /* 111 */ for (i = 0; i < 5; i++) { /* 0 */ secp256k1_scalar_sqr(t, t); } - secp256k1_scalar_mul(t, t, &x4); /* 1111 */ - for (i = 0; i < 2; i++) { /* 0 */ + secp256k1_scalar_mul(t, t, &u9); /* 1001 */ + for (i = 0; i < 6; i++) { /* 000 */ secp256k1_scalar_sqr(t, t); } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 3; i++) { /* 00 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 4; i++) { /* 000 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 2; i++) { /* 0 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ + secp256k1_scalar_mul(t, t, &u5); /* 101 */ for (i = 0; i < 10; i++) { /* 0000000 */ secp256k1_scalar_sqr(t, t); } @@ -180,50 +179,34 @@ static void secp256k1_scalar_inverse(secp256k1_scalar_t *r, const secp256k1_scal secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, &x8); /* 11111111 */ - for (i = 0; i < 2; i++) { /* 0 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 3; i++) { /* 00 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 3; i++) { /* 00 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ for (i = 0; i < 5; i++) { /* 0 */ secp256k1_scalar_sqr(t, t); } - secp256k1_scalar_mul(t, t, &x4); /* 1111 */ - for (i = 0; i < 2; i++) { /* 0 */ + secp256k1_scalar_mul(t, t, &u9); /* 1001 */ + for (i = 0; i < 6; i++) { /* 00 */ secp256k1_scalar_sqr(t, t); } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 5; i++) { /* 000 */ + secp256k1_scalar_mul(t, t, &u11); /* 1011 */ + for (i = 0; i < 4; i++) { + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &u13); /* 1101 */ + for (i = 0; i < 5; i++) { secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, &x2); /* 11 */ - for (i = 0; i < 4; i++) { /* 00 */ + for (i = 0; i < 6; i++) { /* 00 */ secp256k1_scalar_sqr(t, t); } - secp256k1_scalar_mul(t, t, &x2); /* 11 */ - for (i = 0; i < 2; i++) { /* 0 */ + secp256k1_scalar_mul(t, t, &u13); /* 1101 */ + for (i = 0; i < 10; i++) { /* 000000 */ secp256k1_scalar_sqr(t, t); } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 8; i++) { /* 000000 */ + secp256k1_scalar_mul(t, t, &u13); /* 1101 */ + for (i = 0; i < 4; i++) { secp256k1_scalar_sqr(t, t); } - secp256k1_scalar_mul(t, t, &x2); /* 11 */ - for (i = 0; i < 3; i++) { /* 0 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, &x2); /* 11 */ - for (i = 0; i < 3; i++) { /* 00 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ + secp256k1_scalar_mul(t, t, &u9); /* 1001 */ for (i = 0; i < 6; i++) { /* 00000 */ secp256k1_scalar_sqr(t, t); } @@ -234,24 +217,45 @@ static void secp256k1_scalar_inverse(secp256k1_scalar_t *r, const secp256k1_scal secp256k1_scalar_mul(r, t, &x6); /* 111111 */ } -static void secp256k1_scalar_inverse_var(secp256k1_scalar_t *r, const secp256k1_scalar_t *x) { +SECP256K1_INLINE static int secp256k1_scalar_is_even(const secp256k1_scalar *a) { + return !(a->d[0] & 1); +} +#endif + +static void secp256k1_scalar_inverse_var(secp256k1_scalar *r, const secp256k1_scalar *x) { #if defined(USE_SCALAR_INV_BUILTIN) secp256k1_scalar_inverse(r, x); #elif defined(USE_SCALAR_INV_NUM) unsigned char b[32]; - secp256k1_num_t n, m; - secp256k1_scalar_get_b32(b, x); + secp256k1_num n, m; + secp256k1_scalar t = *x; + secp256k1_scalar_get_b32(b, &t); secp256k1_num_set_bin(&n, b, 32); secp256k1_scalar_order_get_num(&m); secp256k1_num_mod_inverse(&n, &n, &m); secp256k1_num_get_bin(b, 32, &n); secp256k1_scalar_set_b32(r, b, NULL); + /* Verify that the inverse was computed correctly, without GMP code. */ + secp256k1_scalar_mul(&t, &t, r); + CHECK(secp256k1_scalar_is_one(&t)); #else #error "Please select scalar inverse implementation" #endif } #ifdef USE_ENDOMORPHISM +#if defined(EXHAUSTIVE_TEST_ORDER) +/** + * Find k1 and k2 given k, such that k1 + k2 * lambda == k mod n; unlike in the + * full case we don't bother making k1 and k2 be small, we just want them to be + * nontrivial to get full test coverage for the exhaustive tests. We therefore + * (arbitrarily) set k2 = k + 5 and k1 = k - k2 * lambda. + */ +static void secp256k1_scalar_split_lambda(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a) { + *r2 = (*a + 5) % EXHAUSTIVE_TEST_ORDER; + *r1 = (*a + (EXHAUSTIVE_TEST_ORDER - *r2) * EXHAUSTIVE_TEST_LAMBDA) % EXHAUSTIVE_TEST_ORDER; +} +#else /** * The Secp256k1 curve has an endomorphism, where lambda * (x, y) = (beta * x, y), where * lambda is {0x53,0x63,0xad,0x4c,0xc0,0x5c,0x30,0xe0,0xa5,0x26,0x1c,0x02,0x88,0x12,0x64,0x5a, @@ -290,30 +294,31 @@ static void secp256k1_scalar_inverse_var(secp256k1_scalar_t *r, const secp256k1_ * The function below splits a in r1 and r2, such that r1 + lambda * r2 == a (mod order). */ -static void secp256k1_scalar_split_lambda_var(secp256k1_scalar_t *r1, secp256k1_scalar_t *r2, const secp256k1_scalar_t *a) { - secp256k1_scalar_t c1, c2; - static const secp256k1_scalar_t minus_lambda = SECP256K1_SCALAR_CONST( +static void secp256k1_scalar_split_lambda(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a) { + secp256k1_scalar c1, c2; + static const secp256k1_scalar minus_lambda = SECP256K1_SCALAR_CONST( 0xAC9C52B3UL, 0x3FA3CF1FUL, 0x5AD9E3FDUL, 0x77ED9BA4UL, 0xA880B9FCUL, 0x8EC739C2UL, 0xE0CFC810UL, 0xB51283CFUL ); - static const secp256k1_scalar_t minus_b1 = SECP256K1_SCALAR_CONST( + static const secp256k1_scalar minus_b1 = SECP256K1_SCALAR_CONST( 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0xE4437ED6UL, 0x010E8828UL, 0x6F547FA9UL, 0x0ABFE4C3UL ); - static const secp256k1_scalar_t minus_b2 = SECP256K1_SCALAR_CONST( + static const secp256k1_scalar minus_b2 = SECP256K1_SCALAR_CONST( 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFEUL, 0x8A280AC5UL, 0x0774346DUL, 0xD765CDA8UL, 0x3DB1562CUL ); - static const secp256k1_scalar_t g1 = SECP256K1_SCALAR_CONST( + static const secp256k1_scalar g1 = SECP256K1_SCALAR_CONST( 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00003086UL, 0xD221A7D4UL, 0x6BCDE86CUL, 0x90E49284UL, 0xEB153DABUL ); - static const secp256k1_scalar_t g2 = SECP256K1_SCALAR_CONST( + static const secp256k1_scalar g2 = SECP256K1_SCALAR_CONST( 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x0000E443UL, 0x7ED6010EUL, 0x88286F54UL, 0x7FA90ABFUL, 0xE4C42212UL ); VERIFY_CHECK(r1 != a); VERIFY_CHECK(r2 != a); + /* these _var calls are constant time since the shift amount is constant */ secp256k1_scalar_mul_shift_var(&c1, a, &g1, 272); secp256k1_scalar_mul_shift_var(&c2, a, &g2, 272); secp256k1_scalar_mul(&c1, &c1, &minus_b1); @@ -323,5 +328,6 @@ static void secp256k1_scalar_split_lambda_var(secp256k1_scalar_t *r1, secp256k1_ secp256k1_scalar_add(r1, r1, a); } #endif - #endif + +#endif /* SECP256K1_SCALAR_IMPL_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/scalar_low.h b/src/cryptoconditions/src/include/secp256k1/src/scalar_low.h new file mode 100644 index 000000000..5836febc5 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/scalar_low.h @@ -0,0 +1,15 @@ +/********************************************************************** + * Copyright (c) 2015 Andrew Poelstra * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_SCALAR_REPR_H +#define SECP256K1_SCALAR_REPR_H + +#include + +/** A scalar modulo the group order of the secp256k1 curve. */ +typedef uint32_t secp256k1_scalar; + +#endif /* SECP256K1_SCALAR_REPR_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/scalar_low_impl.h b/src/cryptoconditions/src/include/secp256k1/src/scalar_low_impl.h new file mode 100644 index 000000000..c80e70c5a --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/scalar_low_impl.h @@ -0,0 +1,114 @@ +/********************************************************************** + * Copyright (c) 2015 Andrew Poelstra * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_SCALAR_REPR_IMPL_H +#define SECP256K1_SCALAR_REPR_IMPL_H + +#include "scalar.h" + +#include + +SECP256K1_INLINE static int secp256k1_scalar_is_even(const secp256k1_scalar *a) { + return !(*a & 1); +} + +SECP256K1_INLINE static void secp256k1_scalar_clear(secp256k1_scalar *r) { *r = 0; } +SECP256K1_INLINE static void secp256k1_scalar_set_int(secp256k1_scalar *r, unsigned int v) { *r = v; } + +SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar *a, unsigned int offset, unsigned int count) { + if (offset < 32) + return ((*a >> offset) & ((((uint32_t)1) << count) - 1)); + else + return 0; +} + +SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar *a, unsigned int offset, unsigned int count) { + return secp256k1_scalar_get_bits(a, offset, count); +} + +SECP256K1_INLINE static int secp256k1_scalar_check_overflow(const secp256k1_scalar *a) { return *a >= EXHAUSTIVE_TEST_ORDER; } + +static int secp256k1_scalar_add(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) { + *r = (*a + *b) % EXHAUSTIVE_TEST_ORDER; + return *r < *b; +} + +static void secp256k1_scalar_cadd_bit(secp256k1_scalar *r, unsigned int bit, int flag) { + if (flag && bit < 32) + *r += (1 << bit); +#ifdef VERIFY + VERIFY_CHECK(secp256k1_scalar_check_overflow(r) == 0); +#endif +} + +static void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *b32, int *overflow) { + const int base = 0x100 % EXHAUSTIVE_TEST_ORDER; + int i; + *r = 0; + for (i = 0; i < 32; i++) { + *r = ((*r * base) + b32[i]) % EXHAUSTIVE_TEST_ORDER; + } + /* just deny overflow, it basically always happens */ + if (overflow) *overflow = 0; +} + +static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar* a) { + memset(bin, 0, 32); + bin[28] = *a >> 24; bin[29] = *a >> 16; bin[30] = *a >> 8; bin[31] = *a; +} + +SECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar *a) { + return *a == 0; +} + +static void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar *a) { + if (*a == 0) { + *r = 0; + } else { + *r = EXHAUSTIVE_TEST_ORDER - *a; + } +} + +SECP256K1_INLINE static int secp256k1_scalar_is_one(const secp256k1_scalar *a) { + return *a == 1; +} + +static int secp256k1_scalar_is_high(const secp256k1_scalar *a) { + return *a > EXHAUSTIVE_TEST_ORDER / 2; +} + +static int secp256k1_scalar_cond_negate(secp256k1_scalar *r, int flag) { + if (flag) secp256k1_scalar_negate(r, r); + return flag ? -1 : 1; +} + +static void secp256k1_scalar_mul(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) { + *r = (*a * *b) % EXHAUSTIVE_TEST_ORDER; +} + +static int secp256k1_scalar_shr_int(secp256k1_scalar *r, int n) { + int ret; + VERIFY_CHECK(n > 0); + VERIFY_CHECK(n < 16); + ret = *r & ((1 << n) - 1); + *r >>= n; + return ret; +} + +static void secp256k1_scalar_sqr(secp256k1_scalar *r, const secp256k1_scalar *a) { + *r = (*a * *a) % EXHAUSTIVE_TEST_ORDER; +} + +static void secp256k1_scalar_split_128(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a) { + *r1 = *a; + *r2 = 0; +} + +SECP256K1_INLINE static int secp256k1_scalar_eq(const secp256k1_scalar *a, const secp256k1_scalar *b) { + return *a == *b; +} + +#endif /* SECP256K1_SCALAR_REPR_IMPL_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/secp256k1.c b/src/cryptoconditions/src/include/secp256k1/src/secp256k1.c index 48569ad9e..cecb1550b 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/secp256k1.c +++ b/src/cryptoconditions/src/include/secp256k1/src/secp256k1.c @@ -4,8 +4,6 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#define SECP256K1_BUILD (1) - #include "include/secp256k1.h" #include "util.h" @@ -14,89 +12,326 @@ #include "scalar_impl.h" #include "group_impl.h" #include "ecmult_impl.h" +#include "ecmult_const_impl.h" #include "ecmult_gen_impl.h" #include "ecdsa_impl.h" #include "eckey_impl.h" #include "hash_impl.h" -struct secp256k1_context_struct { - secp256k1_ecmult_context_t ecmult_ctx; - secp256k1_ecmult_gen_context_t ecmult_gen_ctx; +#define ARG_CHECK(cond) do { \ + if (EXPECT(!(cond), 0)) { \ + secp256k1_callback_call(&ctx->illegal_callback, #cond); \ + return 0; \ + } \ +} while(0) + +static void default_illegal_callback_fn(const char* str, void* data) { + (void)data; + fprintf(stderr, "[libsecp256k1] illegal argument: %s\n", str); + abort(); +} + +static const secp256k1_callback default_illegal_callback = { + default_illegal_callback_fn, + NULL }; -secp256k1_context_t* secp256k1_context_create(int flags) { - secp256k1_context_t* ret = (secp256k1_context_t*)checked_malloc(sizeof(secp256k1_context_t)); +static void default_error_callback_fn(const char* str, void* data) { + (void)data; + fprintf(stderr, "[libsecp256k1] internal consistency check failed: %s\n", str); + abort(); +} + +static const secp256k1_callback default_error_callback = { + default_error_callback_fn, + NULL +}; + + +struct secp256k1_context_struct { + secp256k1_ecmult_context ecmult_ctx; + secp256k1_ecmult_gen_context ecmult_gen_ctx; + secp256k1_callback illegal_callback; + secp256k1_callback error_callback; +}; + +secp256k1_context* secp256k1_context_create(unsigned int flags) { + secp256k1_context* ret = (secp256k1_context*)checked_malloc(&default_error_callback, sizeof(secp256k1_context)); + ret->illegal_callback = default_illegal_callback; + ret->error_callback = default_error_callback; + + if (EXPECT((flags & SECP256K1_FLAGS_TYPE_MASK) != SECP256K1_FLAGS_TYPE_CONTEXT, 0)) { + secp256k1_callback_call(&ret->illegal_callback, + "Invalid flags"); + free(ret); + return NULL; + } secp256k1_ecmult_context_init(&ret->ecmult_ctx); secp256k1_ecmult_gen_context_init(&ret->ecmult_gen_ctx); - if (flags & SECP256K1_CONTEXT_SIGN) { - secp256k1_ecmult_gen_context_build(&ret->ecmult_gen_ctx); + if (flags & SECP256K1_FLAGS_BIT_CONTEXT_SIGN) { + secp256k1_ecmult_gen_context_build(&ret->ecmult_gen_ctx, &ret->error_callback); } - if (flags & SECP256K1_CONTEXT_VERIFY) { - secp256k1_ecmult_context_build(&ret->ecmult_ctx); + if (flags & SECP256K1_FLAGS_BIT_CONTEXT_VERIFY) { + secp256k1_ecmult_context_build(&ret->ecmult_ctx, &ret->error_callback); } return ret; } -secp256k1_context_t* secp256k1_context_clone(const secp256k1_context_t* ctx) { - secp256k1_context_t* ret = (secp256k1_context_t*)checked_malloc(sizeof(secp256k1_context_t)); - secp256k1_ecmult_context_clone(&ret->ecmult_ctx, &ctx->ecmult_ctx); - secp256k1_ecmult_gen_context_clone(&ret->ecmult_gen_ctx, &ctx->ecmult_gen_ctx); +secp256k1_context* secp256k1_context_clone(const secp256k1_context* ctx) { + secp256k1_context* ret = (secp256k1_context*)checked_malloc(&ctx->error_callback, sizeof(secp256k1_context)); + ret->illegal_callback = ctx->illegal_callback; + ret->error_callback = ctx->error_callback; + secp256k1_ecmult_context_clone(&ret->ecmult_ctx, &ctx->ecmult_ctx, &ctx->error_callback); + secp256k1_ecmult_gen_context_clone(&ret->ecmult_gen_ctx, &ctx->ecmult_gen_ctx, &ctx->error_callback); return ret; } -void secp256k1_context_destroy(secp256k1_context_t* ctx) { - secp256k1_ecmult_context_clear(&ctx->ecmult_ctx); - secp256k1_ecmult_gen_context_clear(&ctx->ecmult_gen_ctx); +void secp256k1_context_destroy(secp256k1_context* ctx) { + if (ctx != NULL) { + secp256k1_ecmult_context_clear(&ctx->ecmult_ctx); + secp256k1_ecmult_gen_context_clear(&ctx->ecmult_gen_ctx); - free(ctx); + free(ctx); + } } -int secp256k1_ecdsa_verify(const secp256k1_context_t* ctx, const unsigned char *msg32, const unsigned char *sig, int siglen, const unsigned char *pubkey, int pubkeylen) { - secp256k1_ge_t q; - secp256k1_ecdsa_sig_t s; - secp256k1_scalar_t m; - int ret = -3; - DEBUG_CHECK(ctx != NULL); - DEBUG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); - DEBUG_CHECK(msg32 != NULL); - DEBUG_CHECK(sig != NULL); - DEBUG_CHECK(pubkey != NULL); +void secp256k1_context_set_illegal_callback(secp256k1_context* ctx, void (*fun)(const char* message, void* data), const void* data) { + if (fun == NULL) { + fun = default_illegal_callback_fn; + } + ctx->illegal_callback.fn = fun; + ctx->illegal_callback.data = data; +} + +void secp256k1_context_set_error_callback(secp256k1_context* ctx, void (*fun)(const char* message, void* data), const void* data) { + if (fun == NULL) { + fun = default_error_callback_fn; + } + ctx->error_callback.fn = fun; + ctx->error_callback.data = data; +} + +static int secp256k1_pubkey_load(const secp256k1_context* ctx, secp256k1_ge* ge, const secp256k1_pubkey* pubkey) { + if (sizeof(secp256k1_ge_storage) == 64) { + /* When the secp256k1_ge_storage type is exactly 64 byte, use its + * representation inside secp256k1_pubkey, as conversion is very fast. + * Note that secp256k1_pubkey_save must use the same representation. */ + secp256k1_ge_storage s; + memcpy(&s, &pubkey->data[0], 64); + secp256k1_ge_from_storage(ge, &s); + } else { + /* Otherwise, fall back to 32-byte big endian for X and Y. */ + secp256k1_fe x, y; + secp256k1_fe_set_b32(&x, pubkey->data); + secp256k1_fe_set_b32(&y, pubkey->data + 32); + secp256k1_ge_set_xy(ge, &x, &y); + } + ARG_CHECK(!secp256k1_fe_is_zero(&ge->x)); + return 1; +} + +static void secp256k1_pubkey_save(secp256k1_pubkey* pubkey, secp256k1_ge* ge) { + if (sizeof(secp256k1_ge_storage) == 64) { + secp256k1_ge_storage s; + secp256k1_ge_to_storage(&s, ge); + memcpy(&pubkey->data[0], &s, 64); + } else { + VERIFY_CHECK(!secp256k1_ge_is_infinity(ge)); + secp256k1_fe_normalize_var(&ge->x); + secp256k1_fe_normalize_var(&ge->y); + secp256k1_fe_get_b32(pubkey->data, &ge->x); + secp256k1_fe_get_b32(pubkey->data + 32, &ge->y); + } +} + +int secp256k1_ec_pubkey_parse(const secp256k1_context* ctx, secp256k1_pubkey* pubkey, const unsigned char *input, size_t inputlen) { + secp256k1_ge Q; + + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(pubkey != NULL); + memset(pubkey, 0, sizeof(*pubkey)); + ARG_CHECK(input != NULL); + if (!secp256k1_eckey_pubkey_parse(&Q, input, inputlen)) { + return 0; + } + secp256k1_pubkey_save(pubkey, &Q); + secp256k1_ge_clear(&Q); + return 1; +} + +int secp256k1_ec_pubkey_serialize(const secp256k1_context* ctx, unsigned char *output, size_t *outputlen, const secp256k1_pubkey* pubkey, unsigned int flags) { + secp256k1_ge Q; + size_t len; + int ret = 0; + + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(outputlen != NULL); + ARG_CHECK(*outputlen >= ((flags & SECP256K1_FLAGS_BIT_COMPRESSION) ? 33 : 65)); + len = *outputlen; + *outputlen = 0; + ARG_CHECK(output != NULL); + memset(output, 0, len); + ARG_CHECK(pubkey != NULL); + ARG_CHECK((flags & SECP256K1_FLAGS_TYPE_MASK) == SECP256K1_FLAGS_TYPE_COMPRESSION); + if (secp256k1_pubkey_load(ctx, &Q, pubkey)) { + ret = secp256k1_eckey_pubkey_serialize(&Q, output, &len, flags & SECP256K1_FLAGS_BIT_COMPRESSION); + if (ret) { + *outputlen = len; + } + } + return ret; +} + +static void secp256k1_ecdsa_signature_load(const secp256k1_context* ctx, secp256k1_scalar* r, secp256k1_scalar* s, const secp256k1_ecdsa_signature* sig) { + (void)ctx; + if (sizeof(secp256k1_scalar) == 32) { + /* When the secp256k1_scalar type is exactly 32 byte, use its + * representation inside secp256k1_ecdsa_signature, as conversion is very fast. + * Note that secp256k1_ecdsa_signature_save must use the same representation. */ + memcpy(r, &sig->data[0], 32); + memcpy(s, &sig->data[32], 32); + } else { + secp256k1_scalar_set_b32(r, &sig->data[0], NULL); + secp256k1_scalar_set_b32(s, &sig->data[32], NULL); + } +} + +static void secp256k1_ecdsa_signature_save(secp256k1_ecdsa_signature* sig, const secp256k1_scalar* r, const secp256k1_scalar* s) { + if (sizeof(secp256k1_scalar) == 32) { + memcpy(&sig->data[0], r, 32); + memcpy(&sig->data[32], s, 32); + } else { + secp256k1_scalar_get_b32(&sig->data[0], r); + secp256k1_scalar_get_b32(&sig->data[32], s); + } +} + +int secp256k1_ecdsa_signature_parse_der(const secp256k1_context* ctx, secp256k1_ecdsa_signature* sig, const unsigned char *input, size_t inputlen) { + secp256k1_scalar r, s; + + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(sig != NULL); + ARG_CHECK(input != NULL); + + if (secp256k1_ecdsa_sig_parse(&r, &s, input, inputlen)) { + secp256k1_ecdsa_signature_save(sig, &r, &s); + return 1; + } else { + memset(sig, 0, sizeof(*sig)); + return 0; + } +} + +int secp256k1_ecdsa_signature_parse_compact(const secp256k1_context* ctx, secp256k1_ecdsa_signature* sig, const unsigned char *input64) { + secp256k1_scalar r, s; + int ret = 1; + int overflow = 0; + + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(sig != NULL); + ARG_CHECK(input64 != NULL); + + secp256k1_scalar_set_b32(&r, &input64[0], &overflow); + ret &= !overflow; + secp256k1_scalar_set_b32(&s, &input64[32], &overflow); + ret &= !overflow; + if (ret) { + secp256k1_ecdsa_signature_save(sig, &r, &s); + } else { + memset(sig, 0, sizeof(*sig)); + } + return ret; +} + +int secp256k1_ecdsa_signature_serialize_der(const secp256k1_context* ctx, unsigned char *output, size_t *outputlen, const secp256k1_ecdsa_signature* sig) { + secp256k1_scalar r, s; + + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(output != NULL); + ARG_CHECK(outputlen != NULL); + ARG_CHECK(sig != NULL); + + secp256k1_ecdsa_signature_load(ctx, &r, &s, sig); + return secp256k1_ecdsa_sig_serialize(output, outputlen, &r, &s); +} + +int secp256k1_ecdsa_signature_serialize_compact(const secp256k1_context* ctx, unsigned char *output64, const secp256k1_ecdsa_signature* sig) { + secp256k1_scalar r, s; + + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(output64 != NULL); + ARG_CHECK(sig != NULL); + + secp256k1_ecdsa_signature_load(ctx, &r, &s, sig); + secp256k1_scalar_get_b32(&output64[0], &r); + secp256k1_scalar_get_b32(&output64[32], &s); + return 1; +} + +int secp256k1_ecdsa_signature_normalize(const secp256k1_context* ctx, secp256k1_ecdsa_signature *sigout, const secp256k1_ecdsa_signature *sigin) { + secp256k1_scalar r, s; + int ret = 0; + + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(sigin != NULL); + + secp256k1_ecdsa_signature_load(ctx, &r, &s, sigin); + ret = secp256k1_scalar_is_high(&s); + if (sigout != NULL) { + if (ret) { + secp256k1_scalar_negate(&s, &s); + } + secp256k1_ecdsa_signature_save(sigout, &r, &s); + } + + return ret; +} + +int secp256k1_ecdsa_verify(const secp256k1_context* ctx, const secp256k1_ecdsa_signature *sig, const unsigned char *msg32, const secp256k1_pubkey *pubkey) { + secp256k1_ge q; + secp256k1_scalar r, s; + secp256k1_scalar m; + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); + ARG_CHECK(msg32 != NULL); + ARG_CHECK(sig != NULL); + ARG_CHECK(pubkey != NULL); secp256k1_scalar_set_b32(&m, msg32, NULL); - - if (secp256k1_eckey_pubkey_parse(&q, pubkey, pubkeylen)) { - if (secp256k1_ecdsa_sig_parse(&s, sig, siglen)) { - if (secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &s, &q, &m)) { - /* success is 1, all other values are fail */ - ret = 1; - } else { - ret = 0; - } - } else { - ret = -2; - } - } else { - ret = -1; - } - - return ret; + secp256k1_ecdsa_signature_load(ctx, &r, &s, sig); + return (!secp256k1_scalar_is_high(&s) && + secp256k1_pubkey_load(ctx, &q, pubkey) && + secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &r, &s, &q, &m)); } - -int secp256k1_ecdsa_check_canonical_sig(const unsigned char *sig, int siglen) { - secp256k1_ecdsa_sig_t s; - if (!secp256k1_ecdsa_sig_parse(&s, sig, siglen)) return -1; - return !secp256k1_scalar_is_high(&s.s); -} - - -static int nonce_function_rfc6979(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, unsigned int counter, const void *data) { - secp256k1_rfc6979_hmac_sha256_t rng; +static int nonce_function_rfc6979(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter) { + unsigned char keydata[112]; + int keylen = 64; + secp256k1_rfc6979_hmac_sha256 rng; unsigned int i; - secp256k1_rfc6979_hmac_sha256_initialize(&rng, key32, 32, msg32, 32, (const unsigned char*)data, data != NULL ? 32 : 0); + /* We feed a byte array to the PRNG as input, consisting of: + * - the private key (32 bytes) and message (32 bytes), see RFC 6979 3.2d. + * - optionally 32 extra bytes of data, see RFC 6979 3.6 Additional Data. + * - optionally 16 extra bytes with the algorithm name. + * Because the arguments have distinct fixed lengths it is not possible for + * different argument mixtures to emulate each other and result in the same + * nonces. + */ + memcpy(keydata, key32, 32); + memcpy(keydata + 32, msg32, 32); + if (data != NULL) { + memcpy(keydata + 64, data, 32); + keylen = 96; + } + if (algo16 != NULL) { + memcpy(keydata + keylen, algo16, 16); + keylen += 16; + } + secp256k1_rfc6979_hmac_sha256_initialize(&rng, keydata, keylen); + memset(keydata, 0, sizeof(keydata)); for (i = 0; i <= counter; i++) { secp256k1_rfc6979_hmac_sha256_generate(&rng, nonce32, 32); } @@ -104,21 +339,19 @@ static int nonce_function_rfc6979(unsigned char *nonce32, const unsigned char *m return 1; } -const secp256k1_nonce_function_t secp256k1_nonce_function_rfc6979 = nonce_function_rfc6979; -const secp256k1_nonce_function_t secp256k1_nonce_function_default = nonce_function_rfc6979; +const secp256k1_nonce_function secp256k1_nonce_function_rfc6979 = nonce_function_rfc6979; +const secp256k1_nonce_function secp256k1_nonce_function_default = nonce_function_rfc6979; -int secp256k1_ecdsa_sign(const secp256k1_context_t* ctx, const unsigned char *msg32, unsigned char *signature, int *signaturelen, const unsigned char *seckey, secp256k1_nonce_function_t noncefp, const void* noncedata) { - secp256k1_ecdsa_sig_t sig; - secp256k1_scalar_t sec, non, msg; +int secp256k1_ecdsa_sign(const secp256k1_context* ctx, secp256k1_ecdsa_signature *signature, const unsigned char *msg32, const unsigned char *seckey, secp256k1_nonce_function noncefp, const void* noncedata) { + secp256k1_scalar r, s; + secp256k1_scalar sec, non, msg; int ret = 0; int overflow = 0; - unsigned int count = 0; - DEBUG_CHECK(ctx != NULL); - DEBUG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); - DEBUG_CHECK(msg32 != NULL); - DEBUG_CHECK(signature != NULL); - DEBUG_CHECK(signaturelen != NULL); - DEBUG_CHECK(seckey != NULL); + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); + ARG_CHECK(msg32 != NULL); + ARG_CHECK(signature != NULL); + ARG_CHECK(seckey != NULL); if (noncefp == NULL) { noncefp = secp256k1_nonce_function_default; } @@ -126,186 +359,112 @@ int secp256k1_ecdsa_sign(const secp256k1_context_t* ctx, const unsigned char *ms secp256k1_scalar_set_b32(&sec, seckey, &overflow); /* Fail if the secret key is invalid. */ if (!overflow && !secp256k1_scalar_is_zero(&sec)) { + unsigned char nonce32[32]; + unsigned int count = 0; secp256k1_scalar_set_b32(&msg, msg32, NULL); while (1) { - unsigned char nonce32[32]; - ret = noncefp(nonce32, msg32, seckey, count, noncedata); + ret = noncefp(nonce32, msg32, seckey, NULL, (void*)noncedata, count); if (!ret) { break; } secp256k1_scalar_set_b32(&non, nonce32, &overflow); - memset(nonce32, 0, 32); - if (!secp256k1_scalar_is_zero(&non) && !overflow) { - if (secp256k1_ecdsa_sig_sign(&ctx->ecmult_gen_ctx, &sig, &sec, &msg, &non, NULL)) { + if (!overflow && !secp256k1_scalar_is_zero(&non)) { + if (secp256k1_ecdsa_sig_sign(&ctx->ecmult_gen_ctx, &r, &s, &sec, &msg, &non, NULL)) { break; } } count++; } - if (ret) { - ret = secp256k1_ecdsa_sig_serialize(signature, signaturelen, &sig); - } + memset(nonce32, 0, 32); secp256k1_scalar_clear(&msg); secp256k1_scalar_clear(&non); secp256k1_scalar_clear(&sec); } - if (!ret) { - *signaturelen = 0; + if (ret) { + secp256k1_ecdsa_signature_save(signature, &r, &s); + } else { + memset(signature, 0, sizeof(*signature)); } return ret; } -int secp256k1_ecdsa_sign_compact(const secp256k1_context_t* ctx, const unsigned char *msg32, unsigned char *sig64, const unsigned char *seckey, secp256k1_nonce_function_t noncefp, const void* noncedata, int *recid) { - secp256k1_ecdsa_sig_t sig; - secp256k1_scalar_t sec, non, msg; - int ret = 0; - int overflow = 0; - unsigned int count = 0; - DEBUG_CHECK(ctx != NULL); - DEBUG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); - DEBUG_CHECK(msg32 != NULL); - DEBUG_CHECK(sig64 != NULL); - DEBUG_CHECK(seckey != NULL); - if (noncefp == NULL) { - noncefp = secp256k1_nonce_function_default; - } - - secp256k1_scalar_set_b32(&sec, seckey, &overflow); - /* Fail if the secret key is invalid. */ - if (!overflow && !secp256k1_scalar_is_zero(&sec)) { - secp256k1_scalar_set_b32(&msg, msg32, NULL); - while (1) { - unsigned char nonce32[32]; - ret = noncefp(nonce32, msg32, seckey, count, noncedata); - if (!ret) { - break; - } - secp256k1_scalar_set_b32(&non, nonce32, &overflow); - memset(nonce32, 0, 32); - if (!secp256k1_scalar_is_zero(&non) && !overflow) { - if (secp256k1_ecdsa_sig_sign(&ctx->ecmult_gen_ctx, &sig, &sec, &msg, &non, recid)) { - break; - } - } - count++; - } - if (ret) { - secp256k1_scalar_get_b32(sig64, &sig.r); - secp256k1_scalar_get_b32(sig64 + 32, &sig.s); - } - secp256k1_scalar_clear(&msg); - secp256k1_scalar_clear(&non); - secp256k1_scalar_clear(&sec); - } - if (!ret) { - memset(sig64, 0, 64); - } - return ret; -} - -int secp256k1_ecdsa_recover_compact(const secp256k1_context_t* ctx, const unsigned char *msg32, const unsigned char *sig64, unsigned char *pubkey, int *pubkeylen, int compressed, int recid) { - secp256k1_ge_t q; - secp256k1_ecdsa_sig_t sig; - secp256k1_scalar_t m; - int ret = 0; - int overflow = 0; - DEBUG_CHECK(ctx != NULL); - DEBUG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); - DEBUG_CHECK(msg32 != NULL); - DEBUG_CHECK(sig64 != NULL); - DEBUG_CHECK(pubkey != NULL); - DEBUG_CHECK(pubkeylen != NULL); - DEBUG_CHECK(recid >= 0 && recid <= 3); - - secp256k1_scalar_set_b32(&sig.r, sig64, &overflow); - if (!overflow) { - secp256k1_scalar_set_b32(&sig.s, sig64 + 32, &overflow); - if (!overflow) { - secp256k1_scalar_set_b32(&m, msg32, NULL); - - if (secp256k1_ecdsa_sig_recover(&ctx->ecmult_ctx, &sig, &q, &m, recid)) { - ret = secp256k1_eckey_pubkey_serialize(&q, pubkey, pubkeylen, compressed); - } - } - } - return ret; -} - -int secp256k1_ec_seckey_verify(const secp256k1_context_t* ctx, const unsigned char *seckey) { - secp256k1_scalar_t sec; +int secp256k1_ec_seckey_verify(const secp256k1_context* ctx, const unsigned char *seckey) { + secp256k1_scalar sec; int ret; int overflow; - DEBUG_CHECK(ctx != NULL); - DEBUG_CHECK(seckey != NULL); - (void)ctx; + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(seckey != NULL); secp256k1_scalar_set_b32(&sec, seckey, &overflow); - ret = !secp256k1_scalar_is_zero(&sec) && !overflow; + ret = !overflow && !secp256k1_scalar_is_zero(&sec); secp256k1_scalar_clear(&sec); return ret; } -int secp256k1_ec_pubkey_verify(const secp256k1_context_t* ctx, const unsigned char *pubkey, int pubkeylen) { - secp256k1_ge_t q; - DEBUG_CHECK(ctx != NULL); - DEBUG_CHECK(pubkey != NULL); - (void)ctx; - - return secp256k1_eckey_pubkey_parse(&q, pubkey, pubkeylen); -} - -int secp256k1_ec_pubkey_create(const secp256k1_context_t* ctx, unsigned char *pubkey, int *pubkeylen, const unsigned char *seckey, int compressed) { - secp256k1_gej_t pj; - secp256k1_ge_t p; - secp256k1_scalar_t sec; +int secp256k1_ec_pubkey_create(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const unsigned char *seckey) { + secp256k1_gej pj; + secp256k1_ge p; + secp256k1_scalar sec; int overflow; int ret = 0; - DEBUG_CHECK(ctx != NULL); - DEBUG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); - DEBUG_CHECK(pubkey != NULL); - DEBUG_CHECK(pubkeylen != NULL); - DEBUG_CHECK(seckey != NULL); + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(pubkey != NULL); + memset(pubkey, 0, sizeof(*pubkey)); + ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); + ARG_CHECK(seckey != NULL); secp256k1_scalar_set_b32(&sec, seckey, &overflow); - if (!overflow) { + ret = (!overflow) & (!secp256k1_scalar_is_zero(&sec)); + if (ret) { secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pj, &sec); - secp256k1_scalar_clear(&sec); secp256k1_ge_set_gej(&p, &pj); - ret = secp256k1_eckey_pubkey_serialize(&p, pubkey, pubkeylen, compressed); - } - if (!ret) { - *pubkeylen = 0; + secp256k1_pubkey_save(pubkey, &p); } + secp256k1_scalar_clear(&sec); return ret; } -int secp256k1_ec_pubkey_decompress(const secp256k1_context_t* ctx, unsigned char *pubkey, int *pubkeylen) { - secp256k1_ge_t p; +int secp256k1_ec_privkey_negate(const secp256k1_context* ctx, unsigned char *seckey) { + secp256k1_scalar sec; + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(seckey != NULL); + + secp256k1_scalar_set_b32(&sec, seckey, NULL); + secp256k1_scalar_negate(&sec, &sec); + secp256k1_scalar_get_b32(seckey, &sec); + + return 1; +} + +int secp256k1_ec_pubkey_negate(const secp256k1_context* ctx, secp256k1_pubkey *pubkey) { int ret = 0; - DEBUG_CHECK(pubkey != NULL); - DEBUG_CHECK(pubkeylen != NULL); - (void)ctx; + secp256k1_ge p; + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(pubkey != NULL); - if (secp256k1_eckey_pubkey_parse(&p, pubkey, *pubkeylen)) { - ret = secp256k1_eckey_pubkey_serialize(&p, pubkey, pubkeylen, 0); + ret = secp256k1_pubkey_load(ctx, &p, pubkey); + memset(pubkey, 0, sizeof(*pubkey)); + if (ret) { + secp256k1_ge_neg(&p, &p); + secp256k1_pubkey_save(pubkey, &p); } return ret; } -int secp256k1_ec_privkey_tweak_add(const secp256k1_context_t* ctx, unsigned char *seckey, const unsigned char *tweak) { - secp256k1_scalar_t term; - secp256k1_scalar_t sec; +int secp256k1_ec_privkey_tweak_add(const secp256k1_context* ctx, unsigned char *seckey, const unsigned char *tweak) { + secp256k1_scalar term; + secp256k1_scalar sec; int ret = 0; int overflow = 0; - DEBUG_CHECK(ctx != NULL); - DEBUG_CHECK(seckey != NULL); - DEBUG_CHECK(tweak != NULL); - (void)ctx; + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(seckey != NULL); + ARG_CHECK(tweak != NULL); secp256k1_scalar_set_b32(&term, tweak, &overflow); secp256k1_scalar_set_b32(&sec, seckey, NULL); - ret = secp256k1_eckey_privkey_tweak_add(&sec, &term) && !overflow; + ret = !overflow && secp256k1_eckey_privkey_tweak_add(&sec, &term); + memset(seckey, 0, 32); if (ret) { secp256k1_scalar_get_b32(seckey, &sec); } @@ -315,45 +474,43 @@ int secp256k1_ec_privkey_tweak_add(const secp256k1_context_t* ctx, unsigned char return ret; } -int secp256k1_ec_pubkey_tweak_add(const secp256k1_context_t* ctx, unsigned char *pubkey, int pubkeylen, const unsigned char *tweak) { - secp256k1_ge_t p; - secp256k1_scalar_t term; +int secp256k1_ec_pubkey_tweak_add(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const unsigned char *tweak) { + secp256k1_ge p; + secp256k1_scalar term; int ret = 0; int overflow = 0; - DEBUG_CHECK(ctx != NULL); - DEBUG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); - DEBUG_CHECK(pubkey != NULL); - DEBUG_CHECK(tweak != NULL); + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); + ARG_CHECK(pubkey != NULL); + ARG_CHECK(tweak != NULL); secp256k1_scalar_set_b32(&term, tweak, &overflow); - if (!overflow) { - ret = secp256k1_eckey_pubkey_parse(&p, pubkey, pubkeylen); - if (ret) { - ret = secp256k1_eckey_pubkey_tweak_add(&ctx->ecmult_ctx, &p, &term); - } - if (ret) { - int oldlen = pubkeylen; - ret = secp256k1_eckey_pubkey_serialize(&p, pubkey, &pubkeylen, oldlen <= 33); - VERIFY_CHECK(pubkeylen == oldlen); + ret = !overflow && secp256k1_pubkey_load(ctx, &p, pubkey); + memset(pubkey, 0, sizeof(*pubkey)); + if (ret) { + if (secp256k1_eckey_pubkey_tweak_add(&ctx->ecmult_ctx, &p, &term)) { + secp256k1_pubkey_save(pubkey, &p); + } else { + ret = 0; } } return ret; } -int secp256k1_ec_privkey_tweak_mul(const secp256k1_context_t* ctx, unsigned char *seckey, const unsigned char *tweak) { - secp256k1_scalar_t factor; - secp256k1_scalar_t sec; +int secp256k1_ec_privkey_tweak_mul(const secp256k1_context* ctx, unsigned char *seckey, const unsigned char *tweak) { + secp256k1_scalar factor; + secp256k1_scalar sec; int ret = 0; int overflow = 0; - DEBUG_CHECK(ctx != NULL); - DEBUG_CHECK(seckey != NULL); - DEBUG_CHECK(tweak != NULL); - (void)ctx; + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(seckey != NULL); + ARG_CHECK(tweak != NULL); secp256k1_scalar_set_b32(&factor, tweak, &overflow); secp256k1_scalar_set_b32(&sec, seckey, NULL); - ret = secp256k1_eckey_privkey_tweak_mul(&sec, &factor) && !overflow; + ret = !overflow && secp256k1_eckey_privkey_tweak_mul(&sec, &factor); + memset(seckey, 0, 32); if (ret) { secp256k1_scalar_get_b32(seckey, &sec); } @@ -363,65 +520,65 @@ int secp256k1_ec_privkey_tweak_mul(const secp256k1_context_t* ctx, unsigned char return ret; } -int secp256k1_ec_pubkey_tweak_mul(const secp256k1_context_t* ctx, unsigned char *pubkey, int pubkeylen, const unsigned char *tweak) { - secp256k1_ge_t p; - secp256k1_scalar_t factor; +int secp256k1_ec_pubkey_tweak_mul(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const unsigned char *tweak) { + secp256k1_ge p; + secp256k1_scalar factor; int ret = 0; int overflow = 0; - DEBUG_CHECK(ctx != NULL); - DEBUG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); - DEBUG_CHECK(pubkey != NULL); - DEBUG_CHECK(tweak != NULL); + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); + ARG_CHECK(pubkey != NULL); + ARG_CHECK(tweak != NULL); secp256k1_scalar_set_b32(&factor, tweak, &overflow); - if (!overflow) { - ret = secp256k1_eckey_pubkey_parse(&p, pubkey, pubkeylen); - if (ret) { - ret = secp256k1_eckey_pubkey_tweak_mul(&ctx->ecmult_ctx, &p, &factor); - } - if (ret) { - int oldlen = pubkeylen; - ret = secp256k1_eckey_pubkey_serialize(&p, pubkey, &pubkeylen, oldlen <= 33); - VERIFY_CHECK(pubkeylen == oldlen); - } - } - - return ret; -} - -int secp256k1_ec_privkey_export(const secp256k1_context_t* ctx, const unsigned char *seckey, unsigned char *privkey, int *privkeylen, int compressed) { - secp256k1_scalar_t key; - int ret = 0; - DEBUG_CHECK(seckey != NULL); - DEBUG_CHECK(privkey != NULL); - DEBUG_CHECK(privkeylen != NULL); - DEBUG_CHECK(ctx != NULL); - DEBUG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); - - secp256k1_scalar_set_b32(&key, seckey, NULL); - ret = secp256k1_eckey_privkey_serialize(&ctx->ecmult_gen_ctx, privkey, privkeylen, &key, compressed); - secp256k1_scalar_clear(&key); - return ret; -} - -int secp256k1_ec_privkey_import(const secp256k1_context_t* ctx, unsigned char *seckey, const unsigned char *privkey, int privkeylen) { - secp256k1_scalar_t key; - int ret = 0; - DEBUG_CHECK(seckey != NULL); - DEBUG_CHECK(privkey != NULL); - (void)ctx; - - ret = secp256k1_eckey_privkey_parse(&key, privkey, privkeylen); + ret = !overflow && secp256k1_pubkey_load(ctx, &p, pubkey); + memset(pubkey, 0, sizeof(*pubkey)); if (ret) { - secp256k1_scalar_get_b32(seckey, &key); + if (secp256k1_eckey_pubkey_tweak_mul(&ctx->ecmult_ctx, &p, &factor)) { + secp256k1_pubkey_save(pubkey, &p); + } else { + ret = 0; + } } - secp256k1_scalar_clear(&key); + return ret; } -int secp256k1_context_randomize(secp256k1_context_t* ctx, const unsigned char *seed32) { - DEBUG_CHECK(ctx != NULL); - DEBUG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); +int secp256k1_context_randomize(secp256k1_context* ctx, const unsigned char *seed32) { + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); secp256k1_ecmult_gen_blind(&ctx->ecmult_gen_ctx, seed32); return 1; } + +int secp256k1_ec_pubkey_combine(const secp256k1_context* ctx, secp256k1_pubkey *pubnonce, const secp256k1_pubkey * const *pubnonces, size_t n) { + size_t i; + secp256k1_gej Qj; + secp256k1_ge Q; + + ARG_CHECK(pubnonce != NULL); + memset(pubnonce, 0, sizeof(*pubnonce)); + ARG_CHECK(n >= 1); + ARG_CHECK(pubnonces != NULL); + + secp256k1_gej_set_infinity(&Qj); + + for (i = 0; i < n; i++) { + secp256k1_pubkey_load(ctx, &Q, pubnonces[i]); + secp256k1_gej_add_ge(&Qj, &Qj, &Q); + } + if (secp256k1_gej_is_infinity(&Qj)) { + return 0; + } + secp256k1_ge_set_gej(&Q, &Qj); + secp256k1_pubkey_save(pubnonce, &Q); + return 1; +} + +#ifdef ENABLE_MODULE_ECDH +# include "modules/ecdh/main_impl.h" +#endif + +#ifdef ENABLE_MODULE_RECOVERY +# include "modules/recovery/main_impl.h" +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/testrand.h b/src/cryptoconditions/src/include/secp256k1/src/testrand.h index 041bb92c4..f1f9be077 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/testrand.h +++ b/src/cryptoconditions/src/include/secp256k1/src/testrand.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_TESTRAND_H_ -#define _SECP256K1_TESTRAND_H_ +#ifndef SECP256K1_TESTRAND_H +#define SECP256K1_TESTRAND_H #if defined HAVE_CONFIG_H #include "libsecp256k1-config.h" @@ -16,13 +16,23 @@ /** Seed the pseudorandom number generator for testing. */ SECP256K1_INLINE static void secp256k1_rand_seed(const unsigned char *seed16); -/** Generate a pseudorandom 32-bit number. */ +/** Generate a pseudorandom number in the range [0..2**32-1]. */ static uint32_t secp256k1_rand32(void); +/** Generate a pseudorandom number in the range [0..2**bits-1]. Bits must be 1 or + * more. */ +static uint32_t secp256k1_rand_bits(int bits); + +/** Generate a pseudorandom number in the range [0..range-1]. */ +static uint32_t secp256k1_rand_int(uint32_t range); + /** Generate a pseudorandom 32-byte array. */ static void secp256k1_rand256(unsigned char *b32); /** Generate a pseudorandom 32-byte array with long sequences of zero and one bits. */ static void secp256k1_rand256_test(unsigned char *b32); -#endif +/** Generate pseudorandom bytes with long sequences of zero and one bits. */ +static void secp256k1_rand_bytes_test(unsigned char *bytes, size_t len); + +#endif /* SECP256K1_TESTRAND_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/testrand_impl.h b/src/cryptoconditions/src/include/secp256k1/src/testrand_impl.h index 21c69f1c5..30a91e529 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/testrand_impl.h +++ b/src/cryptoconditions/src/include/secp256k1/src/testrand_impl.h @@ -1,11 +1,11 @@ /********************************************************************** - * Copyright (c) 2013, 2014 Pieter Wuille * + * Copyright (c) 2013-2015 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_TESTRAND_IMPL_H_ -#define _SECP256K1_TESTRAND_IMPL_H_ +#ifndef SECP256K1_TESTRAND_IMPL_H +#define SECP256K1_TESTRAND_IMPL_H #include #include @@ -13,12 +13,14 @@ #include "testrand.h" #include "hash.h" -static secp256k1_rfc6979_hmac_sha256_t secp256k1_test_rng; +static secp256k1_rfc6979_hmac_sha256 secp256k1_test_rng; static uint32_t secp256k1_test_rng_precomputed[8]; static int secp256k1_test_rng_precomputed_used = 8; +static uint64_t secp256k1_test_rng_integer; +static int secp256k1_test_rng_integer_bits_left = 0; SECP256K1_INLINE static void secp256k1_rand_seed(const unsigned char *seed16) { - secp256k1_rfc6979_hmac_sha256_initialize(&secp256k1_test_rng, (const unsigned char*)"TestRNG", 7, seed16, 16, NULL, 0); + secp256k1_rfc6979_hmac_sha256_initialize(&secp256k1_test_rng, seed16, 16); } SECP256K1_INLINE static uint32_t secp256k1_rand32(void) { @@ -29,32 +31,80 @@ SECP256K1_INLINE static uint32_t secp256k1_rand32(void) { return secp256k1_test_rng_precomputed[secp256k1_test_rng_precomputed_used++]; } +static uint32_t secp256k1_rand_bits(int bits) { + uint32_t ret; + if (secp256k1_test_rng_integer_bits_left < bits) { + secp256k1_test_rng_integer |= (((uint64_t)secp256k1_rand32()) << secp256k1_test_rng_integer_bits_left); + secp256k1_test_rng_integer_bits_left += 32; + } + ret = secp256k1_test_rng_integer; + secp256k1_test_rng_integer >>= bits; + secp256k1_test_rng_integer_bits_left -= bits; + ret &= ((~((uint32_t)0)) >> (32 - bits)); + return ret; +} + +static uint32_t secp256k1_rand_int(uint32_t range) { + /* We want a uniform integer between 0 and range-1, inclusive. + * B is the smallest number such that range <= 2**B. + * two mechanisms implemented here: + * - generate B bits numbers until one below range is found, and return it + * - find the largest multiple M of range that is <= 2**(B+A), generate B+A + * bits numbers until one below M is found, and return it modulo range + * The second mechanism consumes A more bits of entropy in every iteration, + * but may need fewer iterations due to M being closer to 2**(B+A) then + * range is to 2**B. The array below (indexed by B) contains a 0 when the + * first mechanism is to be used, and the number A otherwise. + */ + static const int addbits[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 1, 0}; + uint32_t trange, mult; + int bits = 0; + if (range <= 1) { + return 0; + } + trange = range - 1; + while (trange > 0) { + trange >>= 1; + bits++; + } + if (addbits[bits]) { + bits = bits + addbits[bits]; + mult = ((~((uint32_t)0)) >> (32 - bits)) / range; + trange = range * mult; + } else { + trange = range; + mult = 1; + } + while(1) { + uint32_t x = secp256k1_rand_bits(bits); + if (x < trange) { + return (mult == 1) ? x : (x % range); + } + } +} + static void secp256k1_rand256(unsigned char *b32) { secp256k1_rfc6979_hmac_sha256_generate(&secp256k1_test_rng, b32, 32); } -static void secp256k1_rand256_test(unsigned char *b32) { - int bits=0; - uint64_t ent = 0; - int entleft = 0; - memset(b32, 0, 32); - while (bits < 256) { +static void secp256k1_rand_bytes_test(unsigned char *bytes, size_t len) { + size_t bits = 0; + memset(bytes, 0, len); + while (bits < len * 8) { int now; uint32_t val; - if (entleft < 12) { - ent |= ((uint64_t)secp256k1_rand32()) << entleft; - entleft += 32; - } - now = 1 + ((ent % 64)*((ent >> 6) % 32)+16)/31; - val = 1 & (ent >> 11); - ent >>= 12; - entleft -= 12; - while (now > 0 && bits < 256) { - b32[bits / 8] |= val << (bits % 8); + now = 1 + (secp256k1_rand_bits(6) * secp256k1_rand_bits(5) + 16) / 31; + val = secp256k1_rand_bits(1); + while (now > 0 && bits < len * 8) { + bytes[bits / 8] |= val << (bits % 8); now--; bits++; } } } -#endif +static void secp256k1_rand256_test(unsigned char *b32) { + secp256k1_rand_bytes_test(b32, 32); +} + +#endif /* SECP256K1_TESTRAND_IMPL_H */ diff --git a/src/cryptoconditions/src/include/secp256k1/src/tests.c b/src/cryptoconditions/src/include/secp256k1/src/tests.c index d0e05057f..f307b99d5 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/tests.c +++ b/src/cryptoconditions/src/include/secp256k1/src/tests.c @@ -10,10 +10,12 @@ #include #include +#include #include #include "secp256k1.c" +#include "include/secp256k1.h" #include "testrand_impl.h" #ifdef ENABLE_OPENSSL_TESTS @@ -23,10 +25,40 @@ #include "openssl/obj_mac.h" #endif -static int count = 64; -static secp256k1_context_t *ctx = NULL; +#include "contrib/lax_der_parsing.c" +#include "contrib/lax_der_privatekey_parsing.c" -void random_field_element_test(secp256k1_fe_t *fe) { +#if !defined(VG_CHECK) +# if defined(VALGRIND) +# include +# define VG_UNDEF(x,y) VALGRIND_MAKE_MEM_UNDEFINED((x),(y)) +# define VG_CHECK(x,y) VALGRIND_CHECK_MEM_IS_DEFINED((x),(y)) +# else +# define VG_UNDEF(x,y) +# define VG_CHECK(x,y) +# endif +#endif + +static int count = 64; +static secp256k1_context *ctx = NULL; + +static void counting_illegal_callback_fn(const char* str, void* data) { + /* Dummy callback function that just counts. */ + int32_t *p; + (void)str; + p = data; + (*p)++; +} + +static void uncounting_illegal_callback_fn(const char* str, void* data) { + /* Dummy callback function that just counts (backwards). */ + int32_t *p; + (void)str; + p = data; + (*p)--; +} + +void random_field_element_test(secp256k1_fe *fe) { do { unsigned char b32[32]; secp256k1_rand256_test(b32); @@ -36,9 +68,9 @@ void random_field_element_test(secp256k1_fe_t *fe) { } while(1); } -void random_field_element_magnitude(secp256k1_fe_t *fe) { - secp256k1_fe_t zero; - int n = secp256k1_rand32() % 9; +void random_field_element_magnitude(secp256k1_fe *fe) { + secp256k1_fe zero; + int n = secp256k1_rand_int(9); secp256k1_fe_normalize(fe); if (n == 0) { return; @@ -47,23 +79,22 @@ void random_field_element_magnitude(secp256k1_fe_t *fe) { secp256k1_fe_negate(&zero, &zero, 0); secp256k1_fe_mul_int(&zero, n - 1); secp256k1_fe_add(fe, &zero); -#ifdef VERIFY - CHECK(fe->magnitude == n); -#endif + VERIFY_CHECK(fe->magnitude == n); } -void random_group_element_test(secp256k1_ge_t *ge) { - secp256k1_fe_t fe; +void random_group_element_test(secp256k1_ge *ge) { + secp256k1_fe fe; do { random_field_element_test(&fe); - if (secp256k1_ge_set_xo_var(ge, &fe, secp256k1_rand32() & 1)) { + if (secp256k1_ge_set_xo_var(ge, &fe, secp256k1_rand_bits(1))) { + secp256k1_fe_normalize(&ge->y); break; } } while(1); } -void random_group_element_jacobian_test(secp256k1_gej_t *gej, const secp256k1_ge_t *ge) { - secp256k1_fe_t z2, z3; +void random_group_element_jacobian_test(secp256k1_gej *gej, const secp256k1_ge *ge) { + secp256k1_fe z2, z3; do { random_field_element_test(&gej->z); if (!secp256k1_fe_is_zero(&gej->z)) { @@ -77,7 +108,7 @@ void random_group_element_jacobian_test(secp256k1_gej_t *gej, const secp256k1_ge gej->infinity = ge->infinity; } -void random_scalar_order_test(secp256k1_scalar_t *num) { +void random_scalar_order_test(secp256k1_scalar *num) { do { unsigned char b32[32]; int overflow = 0; @@ -90,7 +121,7 @@ void random_scalar_order_test(secp256k1_scalar_t *num) { } while(1); } -void random_scalar_order(secp256k1_scalar_t *num) { +void random_scalar_order(secp256k1_scalar *num) { do { unsigned char b32[32]; int overflow = 0; @@ -104,19 +135,34 @@ void random_scalar_order(secp256k1_scalar_t *num) { } void run_context_tests(void) { - secp256k1_context_t *none = secp256k1_context_create(0); - secp256k1_context_t *sign = secp256k1_context_create(SECP256K1_CONTEXT_SIGN); - secp256k1_context_t *vrfy = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY); - secp256k1_context_t *both = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); + secp256k1_pubkey pubkey; + secp256k1_pubkey zero_pubkey; + secp256k1_ecdsa_signature sig; + unsigned char ctmp[32]; + int32_t ecount; + int32_t ecount2; + secp256k1_context *none = secp256k1_context_create(SECP256K1_CONTEXT_NONE); + secp256k1_context *sign = secp256k1_context_create(SECP256K1_CONTEXT_SIGN); + secp256k1_context *vrfy = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY); + secp256k1_context *both = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); - secp256k1_gej_t pubj; - secp256k1_ge_t pub; - secp256k1_scalar_t msg, key, nonce; - secp256k1_ecdsa_sig_t sig; + secp256k1_gej pubj; + secp256k1_ge pub; + secp256k1_scalar msg, key, nonce; + secp256k1_scalar sigr, sigs; + + memset(&zero_pubkey, 0, sizeof(zero_pubkey)); + + ecount = 0; + ecount2 = 10; + secp256k1_context_set_illegal_callback(vrfy, counting_illegal_callback_fn, &ecount); + secp256k1_context_set_illegal_callback(sign, counting_illegal_callback_fn, &ecount2); + secp256k1_context_set_error_callback(sign, counting_illegal_callback_fn, NULL); + CHECK(vrfy->error_callback.fn != sign->error_callback.fn); /*** clone and destroy all of them to make sure cloning was complete ***/ { - secp256k1_context_t *ctx_tmp; + secp256k1_context *ctx_tmp; ctx_tmp = none; none = secp256k1_context_clone(none); secp256k1_context_destroy(ctx_tmp); ctx_tmp = sign; sign = secp256k1_context_clone(sign); secp256k1_context_destroy(ctx_tmp); @@ -124,30 +170,82 @@ void run_context_tests(void) { ctx_tmp = both; both = secp256k1_context_clone(both); secp256k1_context_destroy(ctx_tmp); } + /* Verify that the error callback makes it across the clone. */ + CHECK(vrfy->error_callback.fn != sign->error_callback.fn); + /* And that it resets back to default. */ + secp256k1_context_set_error_callback(sign, NULL, NULL); + CHECK(vrfy->error_callback.fn == sign->error_callback.fn); + /*** attempt to use them ***/ random_scalar_order_test(&msg); random_scalar_order_test(&key); secp256k1_ecmult_gen(&both->ecmult_gen_ctx, &pubj, &key); secp256k1_ge_set_gej(&pub, &pubj); + /* Verify context-type checking illegal-argument errors. */ + memset(ctmp, 1, 32); + CHECK(secp256k1_ec_pubkey_create(vrfy, &pubkey, ctmp) == 0); + CHECK(ecount == 1); + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_create(sign, &pubkey, ctmp) == 1); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ecdsa_sign(vrfy, &sig, ctmp, ctmp, NULL, NULL) == 0); + CHECK(ecount == 2); + VG_UNDEF(&sig, sizeof(sig)); + CHECK(secp256k1_ecdsa_sign(sign, &sig, ctmp, ctmp, NULL, NULL) == 1); + VG_CHECK(&sig, sizeof(sig)); + CHECK(ecount2 == 10); + CHECK(secp256k1_ecdsa_verify(sign, &sig, ctmp, &pubkey) == 0); + CHECK(ecount2 == 11); + CHECK(secp256k1_ecdsa_verify(vrfy, &sig, ctmp, &pubkey) == 1); + CHECK(ecount == 2); + CHECK(secp256k1_ec_pubkey_tweak_add(sign, &pubkey, ctmp) == 0); + CHECK(ecount2 == 12); + CHECK(secp256k1_ec_pubkey_tweak_add(vrfy, &pubkey, ctmp) == 1); + CHECK(ecount == 2); + CHECK(secp256k1_ec_pubkey_tweak_mul(sign, &pubkey, ctmp) == 0); + CHECK(ecount2 == 13); + CHECK(secp256k1_ec_pubkey_negate(vrfy, &pubkey) == 1); + CHECK(ecount == 2); + CHECK(secp256k1_ec_pubkey_negate(sign, &pubkey) == 1); + CHECK(ecount == 2); + CHECK(secp256k1_ec_pubkey_negate(sign, NULL) == 0); + CHECK(ecount2 == 14); + CHECK(secp256k1_ec_pubkey_negate(vrfy, &zero_pubkey) == 0); + CHECK(ecount == 3); + CHECK(secp256k1_ec_pubkey_tweak_mul(vrfy, &pubkey, ctmp) == 1); + CHECK(ecount == 3); + CHECK(secp256k1_context_randomize(vrfy, ctmp) == 0); + CHECK(ecount == 4); + CHECK(secp256k1_context_randomize(sign, NULL) == 1); + CHECK(ecount2 == 14); + secp256k1_context_set_illegal_callback(vrfy, NULL, NULL); + secp256k1_context_set_illegal_callback(sign, NULL, NULL); + + /* This shouldn't leak memory, due to already-set tests. */ + secp256k1_ecmult_gen_context_build(&sign->ecmult_gen_ctx, NULL); + secp256k1_ecmult_context_build(&vrfy->ecmult_ctx, NULL); + /* obtain a working nonce */ do { random_scalar_order_test(&nonce); - } while(!secp256k1_ecdsa_sig_sign(&both->ecmult_gen_ctx, &sig, &key, &msg, &nonce, NULL)); + } while(!secp256k1_ecdsa_sig_sign(&both->ecmult_gen_ctx, &sigr, &sigs, &key, &msg, &nonce, NULL)); /* try signing */ - CHECK(secp256k1_ecdsa_sig_sign(&sign->ecmult_gen_ctx, &sig, &key, &msg, &nonce, NULL)); - CHECK(secp256k1_ecdsa_sig_sign(&both->ecmult_gen_ctx, &sig, &key, &msg, &nonce, NULL)); + CHECK(secp256k1_ecdsa_sig_sign(&sign->ecmult_gen_ctx, &sigr, &sigs, &key, &msg, &nonce, NULL)); + CHECK(secp256k1_ecdsa_sig_sign(&both->ecmult_gen_ctx, &sigr, &sigs, &key, &msg, &nonce, NULL)); /* try verifying */ - CHECK(secp256k1_ecdsa_sig_verify(&vrfy->ecmult_ctx, &sig, &pub, &msg)); - CHECK(secp256k1_ecdsa_sig_verify(&both->ecmult_ctx, &sig, &pub, &msg)); + CHECK(secp256k1_ecdsa_sig_verify(&vrfy->ecmult_ctx, &sigr, &sigs, &pub, &msg)); + CHECK(secp256k1_ecdsa_sig_verify(&both->ecmult_ctx, &sigr, &sigs, &pub, &msg)); /* cleanup */ secp256k1_context_destroy(none); secp256k1_context_destroy(sign); secp256k1_context_destroy(vrfy); secp256k1_context_destroy(both); + /* Defined as no-op. */ + secp256k1_context_destroy(NULL); } /***** HASH TESTS *****/ @@ -172,13 +270,13 @@ void run_sha256_tests(void) { int i; for (i = 0; i < 8; i++) { unsigned char out[32]; - secp256k1_sha256_t hasher; + secp256k1_sha256 hasher; secp256k1_sha256_initialize(&hasher); secp256k1_sha256_write(&hasher, (const unsigned char*)(inputs[i]), strlen(inputs[i])); secp256k1_sha256_finalize(&hasher, out); CHECK(memcmp(out, outputs[i], 32) == 0); if (strlen(inputs[i]) > 0) { - int split = secp256k1_rand32() % strlen(inputs[i]); + int split = secp256k1_rand_int(strlen(inputs[i])); secp256k1_sha256_initialize(&hasher); secp256k1_sha256_write(&hasher, (const unsigned char*)(inputs[i]), split); secp256k1_sha256_write(&hasher, (const unsigned char*)(inputs[i] + split), strlen(inputs[i]) - split); @@ -215,14 +313,14 @@ void run_hmac_sha256_tests(void) { }; int i; for (i = 0; i < 6; i++) { - secp256k1_hmac_sha256_t hasher; + secp256k1_hmac_sha256 hasher; unsigned char out[32]; secp256k1_hmac_sha256_initialize(&hasher, (const unsigned char*)(keys[i]), strlen(keys[i])); secp256k1_hmac_sha256_write(&hasher, (const unsigned char*)(inputs[i]), strlen(inputs[i])); secp256k1_hmac_sha256_finalize(&hasher, out); CHECK(memcmp(out, outputs[i], 32) == 0); if (strlen(inputs[i]) > 0) { - int split = secp256k1_rand32() % strlen(inputs[i]); + int split = secp256k1_rand_int(strlen(inputs[i])); secp256k1_hmac_sha256_initialize(&hasher, (const unsigned char*)(keys[i]), strlen(keys[i])); secp256k1_hmac_sha256_write(&hasher, (const unsigned char*)(inputs[i]), split); secp256k1_hmac_sha256_write(&hasher, (const unsigned char*)(inputs[i] + split), strlen(inputs[i]) - split); @@ -233,42 +331,39 @@ void run_hmac_sha256_tests(void) { } void run_rfc6979_hmac_sha256_tests(void) { - static const unsigned char key1[32] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x00}; - static const unsigned char msg1[32] = {0x4b, 0xf5, 0x12, 0x2f, 0x34, 0x45, 0x54, 0xc5, 0x3b, 0xde, 0x2e, 0xbb, 0x8c, 0xd2, 0xb7, 0xe3, 0xd1, 0x60, 0x0a, 0xd6, 0x31, 0xc3, 0x85, 0xa5, 0xd7, 0xcc, 0xe2, 0x3c, 0x77, 0x85, 0x45, 0x9a}; + static const unsigned char key1[65] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x00, 0x4b, 0xf5, 0x12, 0x2f, 0x34, 0x45, 0x54, 0xc5, 0x3b, 0xde, 0x2e, 0xbb, 0x8c, 0xd2, 0xb7, 0xe3, 0xd1, 0x60, 0x0a, 0xd6, 0x31, 0xc3, 0x85, 0xa5, 0xd7, 0xcc, 0xe2, 0x3c, 0x77, 0x85, 0x45, 0x9a, 0}; static const unsigned char out1[3][32] = { {0x4f, 0xe2, 0x95, 0x25, 0xb2, 0x08, 0x68, 0x09, 0x15, 0x9a, 0xcd, 0xf0, 0x50, 0x6e, 0xfb, 0x86, 0xb0, 0xec, 0x93, 0x2c, 0x7b, 0xa4, 0x42, 0x56, 0xab, 0x32, 0x1e, 0x42, 0x1e, 0x67, 0xe9, 0xfb}, {0x2b, 0xf0, 0xff, 0xf1, 0xd3, 0xc3, 0x78, 0xa2, 0x2d, 0xc5, 0xde, 0x1d, 0x85, 0x65, 0x22, 0x32, 0x5c, 0x65, 0xb5, 0x04, 0x49, 0x1a, 0x0c, 0xbd, 0x01, 0xcb, 0x8f, 0x3a, 0xa6, 0x7f, 0xfd, 0x4a}, {0xf5, 0x28, 0xb4, 0x10, 0xcb, 0x54, 0x1f, 0x77, 0x00, 0x0d, 0x7a, 0xfb, 0x6c, 0x5b, 0x53, 0xc5, 0xc4, 0x71, 0xea, 0xb4, 0x3e, 0x46, 0x6d, 0x9a, 0xc5, 0x19, 0x0c, 0x39, 0xc8, 0x2f, 0xd8, 0x2e} }; - static const unsigned char key2[32] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - static const unsigned char msg2[32] = {0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c, 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55}; + static const unsigned char key2[64] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c, 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55}; static const unsigned char out2[3][32] = { {0x9c, 0x23, 0x6c, 0x16, 0x5b, 0x82, 0xae, 0x0c, 0xd5, 0x90, 0x65, 0x9e, 0x10, 0x0b, 0x6b, 0xab, 0x30, 0x36, 0xe7, 0xba, 0x8b, 0x06, 0x74, 0x9b, 0xaf, 0x69, 0x81, 0xe1, 0x6f, 0x1a, 0x2b, 0x95}, {0xdf, 0x47, 0x10, 0x61, 0x62, 0x5b, 0xc0, 0xea, 0x14, 0xb6, 0x82, 0xfe, 0xee, 0x2c, 0x9c, 0x02, 0xf2, 0x35, 0xda, 0x04, 0x20, 0x4c, 0x1d, 0x62, 0xa1, 0x53, 0x6c, 0x6e, 0x17, 0xae, 0xd7, 0xa9}, {0x75, 0x97, 0x88, 0x7c, 0xbd, 0x76, 0x32, 0x1f, 0x32, 0xe3, 0x04, 0x40, 0x67, 0x9a, 0x22, 0xcf, 0x7f, 0x8d, 0x9d, 0x2e, 0xac, 0x39, 0x0e, 0x58, 0x1f, 0xea, 0x09, 0x1c, 0xe2, 0x02, 0xba, 0x94} }; - secp256k1_rfc6979_hmac_sha256_t rng; + secp256k1_rfc6979_hmac_sha256 rng; unsigned char out[32]; - unsigned char zero[1] = {0}; int i; - secp256k1_rfc6979_hmac_sha256_initialize(&rng, key1, 32, msg1, 32, NULL, 1); + secp256k1_rfc6979_hmac_sha256_initialize(&rng, key1, 64); for (i = 0; i < 3; i++) { secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32); CHECK(memcmp(out, out1[i], 32) == 0); } secp256k1_rfc6979_hmac_sha256_finalize(&rng); - secp256k1_rfc6979_hmac_sha256_initialize(&rng, key1, 32, msg1, 32, zero, 1); + secp256k1_rfc6979_hmac_sha256_initialize(&rng, key1, 65); for (i = 0; i < 3; i++) { secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32); CHECK(memcmp(out, out1[i], 32) != 0); } secp256k1_rfc6979_hmac_sha256_finalize(&rng); - secp256k1_rfc6979_hmac_sha256_initialize(&rng, key2, 32, msg2, 32, zero, 0); + secp256k1_rfc6979_hmac_sha256_initialize(&rng, key2, 64); for (i = 0; i < 3; i++) { secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32); CHECK(memcmp(out, out2[i], 32) == 0); @@ -276,30 +371,102 @@ void run_rfc6979_hmac_sha256_tests(void) { secp256k1_rfc6979_hmac_sha256_finalize(&rng); } +/***** RANDOM TESTS *****/ + +void test_rand_bits(int rand32, int bits) { + /* (1-1/2^B)^rounds[B] < 1/10^9, so rounds is the number of iterations to + * get a false negative chance below once in a billion */ + static const unsigned int rounds[7] = {1, 30, 73, 156, 322, 653, 1316}; + /* We try multiplying the results with various odd numbers, which shouldn't + * influence the uniform distribution modulo a power of 2. */ + static const uint32_t mults[6] = {1, 3, 21, 289, 0x9999, 0x80402011}; + /* We only select up to 6 bits from the output to analyse */ + unsigned int usebits = bits > 6 ? 6 : bits; + unsigned int maxshift = bits - usebits; + /* For each of the maxshift+1 usebits-bit sequences inside a bits-bit + number, track all observed outcomes, one per bit in a uint64_t. */ + uint64_t x[6][27] = {{0}}; + unsigned int i, shift, m; + /* Multiply the output of all rand calls with the odd number m, which + should not change the uniformity of its distribution. */ + for (i = 0; i < rounds[usebits]; i++) { + uint32_t r = (rand32 ? secp256k1_rand32() : secp256k1_rand_bits(bits)); + CHECK((((uint64_t)r) >> bits) == 0); + for (m = 0; m < sizeof(mults) / sizeof(mults[0]); m++) { + uint32_t rm = r * mults[m]; + for (shift = 0; shift <= maxshift; shift++) { + x[m][shift] |= (((uint64_t)1) << ((rm >> shift) & ((1 << usebits) - 1))); + } + } + } + for (m = 0; m < sizeof(mults) / sizeof(mults[0]); m++) { + for (shift = 0; shift <= maxshift; shift++) { + /* Test that the lower usebits bits of x[shift] are 1 */ + CHECK(((~x[m][shift]) << (64 - (1 << usebits))) == 0); + } + } +} + +/* Subrange must be a whole divisor of range, and at most 64 */ +void test_rand_int(uint32_t range, uint32_t subrange) { + /* (1-1/subrange)^rounds < 1/10^9 */ + int rounds = (subrange * 2073) / 100; + int i; + uint64_t x = 0; + CHECK((range % subrange) == 0); + for (i = 0; i < rounds; i++) { + uint32_t r = secp256k1_rand_int(range); + CHECK(r < range); + r = r % subrange; + x |= (((uint64_t)1) << r); + } + /* Test that the lower subrange bits of x are 1. */ + CHECK(((~x) << (64 - subrange)) == 0); +} + +void run_rand_bits(void) { + size_t b; + test_rand_bits(1, 32); + for (b = 1; b <= 32; b++) { + test_rand_bits(0, b); + } +} + +void run_rand_int(void) { + static const uint32_t ms[] = {1, 3, 17, 1000, 13771, 999999, 33554432}; + static const uint32_t ss[] = {1, 3, 6, 9, 13, 31, 64}; + unsigned int m, s; + for (m = 0; m < sizeof(ms) / sizeof(ms[0]); m++) { + for (s = 0; s < sizeof(ss) / sizeof(ss[0]); s++) { + test_rand_int(ms[m] * ss[s], ss[s]); + } + } +} + /***** NUM TESTS *****/ #ifndef USE_NUM_NONE -void random_num_negate(secp256k1_num_t *num) { - if (secp256k1_rand32() & 1) { +void random_num_negate(secp256k1_num *num) { + if (secp256k1_rand_bits(1)) { secp256k1_num_negate(num); } } -void random_num_order_test(secp256k1_num_t *num) { - secp256k1_scalar_t sc; +void random_num_order_test(secp256k1_num *num) { + secp256k1_scalar sc; random_scalar_order_test(&sc); secp256k1_scalar_get_num(num, &sc); } -void random_num_order(secp256k1_num_t *num) { - secp256k1_scalar_t sc; +void random_num_order(secp256k1_num *num) { + secp256k1_scalar sc; random_scalar_order(&sc); secp256k1_scalar_get_num(num, &sc); } void test_num_negate(void) { - secp256k1_num_t n1; - secp256k1_num_t n2; + secp256k1_num n1; + secp256k1_num n2; random_num_order_test(&n1); /* n1 = R */ random_num_negate(&n1); secp256k1_num_copy(&n2, &n1); /* n2 = R */ @@ -318,16 +485,17 @@ void test_num_negate(void) { } void test_num_add_sub(void) { - secp256k1_num_t n1; - secp256k1_num_t n2; - secp256k1_num_t n1p2, n2p1, n1m2, n2m1; - int r = secp256k1_rand32(); + int i; + secp256k1_scalar s; + secp256k1_num n1; + secp256k1_num n2; + secp256k1_num n1p2, n2p1, n1m2, n2m1; random_num_order_test(&n1); /* n1 = R1 */ - if (r & 1) { + if (secp256k1_rand_bits(1)) { random_num_negate(&n1); } random_num_order_test(&n2); /* n2 = R2 */ - if (r & 2) { + if (secp256k1_rand_bits(1)) { random_num_negate(&n2); } secp256k1_num_add(&n1p2, &n1, &n2); /* n1p2 = R1 + R2 */ @@ -344,6 +512,110 @@ void test_num_add_sub(void) { CHECK(!secp256k1_num_eq(&n2p1, &n1)); secp256k1_num_sub(&n2p1, &n2p1, &n2); /* n2p1 = R2 + R1 - R2 = R1 */ CHECK(secp256k1_num_eq(&n2p1, &n1)); + + /* check is_one */ + secp256k1_scalar_set_int(&s, 1); + secp256k1_scalar_get_num(&n1, &s); + CHECK(secp256k1_num_is_one(&n1)); + /* check that 2^n + 1 is never 1 */ + secp256k1_scalar_get_num(&n2, &s); + for (i = 0; i < 250; ++i) { + secp256k1_num_add(&n1, &n1, &n1); /* n1 *= 2 */ + secp256k1_num_add(&n1p2, &n1, &n2); /* n1p2 = n1 + 1 */ + CHECK(!secp256k1_num_is_one(&n1p2)); + } +} + +void test_num_mod(void) { + int i; + secp256k1_scalar s; + secp256k1_num order, n; + + /* check that 0 mod anything is 0 */ + random_scalar_order_test(&s); + secp256k1_scalar_get_num(&order, &s); + secp256k1_scalar_set_int(&s, 0); + secp256k1_scalar_get_num(&n, &s); + secp256k1_num_mod(&n, &order); + CHECK(secp256k1_num_is_zero(&n)); + + /* check that anything mod 1 is 0 */ + secp256k1_scalar_set_int(&s, 1); + secp256k1_scalar_get_num(&order, &s); + secp256k1_scalar_get_num(&n, &s); + secp256k1_num_mod(&n, &order); + CHECK(secp256k1_num_is_zero(&n)); + + /* check that increasing the number past 2^256 does not break this */ + random_scalar_order_test(&s); + secp256k1_scalar_get_num(&n, &s); + /* multiply by 2^8, which'll test this case with high probability */ + for (i = 0; i < 8; ++i) { + secp256k1_num_add(&n, &n, &n); + } + secp256k1_num_mod(&n, &order); + CHECK(secp256k1_num_is_zero(&n)); +} + +void test_num_jacobi(void) { + secp256k1_scalar sqr; + secp256k1_scalar small; + secp256k1_scalar five; /* five is not a quadratic residue */ + secp256k1_num order, n; + int i; + /* squares mod 5 are 1, 4 */ + const int jacobi5[10] = { 0, 1, -1, -1, 1, 0, 1, -1, -1, 1 }; + + /* check some small values with 5 as the order */ + secp256k1_scalar_set_int(&five, 5); + secp256k1_scalar_get_num(&order, &five); + for (i = 0; i < 10; ++i) { + secp256k1_scalar_set_int(&small, i); + secp256k1_scalar_get_num(&n, &small); + CHECK(secp256k1_num_jacobi(&n, &order) == jacobi5[i]); + } + + /** test large values with 5 as group order */ + secp256k1_scalar_get_num(&order, &five); + /* we first need a scalar which is not a multiple of 5 */ + do { + secp256k1_num fiven; + random_scalar_order_test(&sqr); + secp256k1_scalar_get_num(&fiven, &five); + secp256k1_scalar_get_num(&n, &sqr); + secp256k1_num_mod(&n, &fiven); + } while (secp256k1_num_is_zero(&n)); + /* next force it to be a residue. 2 is a nonresidue mod 5 so we can + * just multiply by two, i.e. add the number to itself */ + if (secp256k1_num_jacobi(&n, &order) == -1) { + secp256k1_num_add(&n, &n, &n); + } + + /* test residue */ + CHECK(secp256k1_num_jacobi(&n, &order) == 1); + /* test nonresidue */ + secp256k1_num_add(&n, &n, &n); + CHECK(secp256k1_num_jacobi(&n, &order) == -1); + + /** test with secp group order as order */ + secp256k1_scalar_order_get_num(&order); + random_scalar_order_test(&sqr); + secp256k1_scalar_sqr(&sqr, &sqr); + /* test residue */ + secp256k1_scalar_get_num(&n, &sqr); + CHECK(secp256k1_num_jacobi(&n, &order) == 1); + /* test nonresidue */ + secp256k1_scalar_mul(&sqr, &sqr, &five); + secp256k1_scalar_get_num(&n, &sqr); + CHECK(secp256k1_num_jacobi(&n, &order) == -1); + /* test multiple of the order*/ + CHECK(secp256k1_num_jacobi(&order, &order) == 0); + + /* check one less than the order */ + secp256k1_scalar_set_int(&small, 1); + secp256k1_scalar_get_num(&n, &small); + secp256k1_num_sub(&n, &order, &n); + CHECK(secp256k1_num_jacobi(&n, &order) == 1); /* sage confirms this is 1 */ } void run_num_smalltests(void) { @@ -351,6 +623,8 @@ void run_num_smalltests(void) { for (i = 0; i < 100*count; i++) { test_num_negate(); test_num_add_sub(); + test_num_mod(); + test_num_jacobi(); } } #endif @@ -358,12 +632,12 @@ void run_num_smalltests(void) { /***** SCALAR TESTS *****/ void scalar_test(void) { - secp256k1_scalar_t s; - secp256k1_scalar_t s1; - secp256k1_scalar_t s2; + secp256k1_scalar s; + secp256k1_scalar s1; + secp256k1_scalar s2; #ifndef USE_NUM_NONE - secp256k1_num_t snum, s1num, s2num; - secp256k1_num_t order, half_order; + secp256k1_num snum, s1num, s2num; + secp256k1_num order, half_order; #endif unsigned char c[32]; @@ -390,10 +664,10 @@ void scalar_test(void) { { int i; /* Test that fetching groups of 4 bits from a scalar and recursing n(i)=16*n(i-1)+p(i) reconstructs it. */ - secp256k1_scalar_t n; + secp256k1_scalar n; secp256k1_scalar_set_int(&n, 0); for (i = 0; i < 256; i += 4) { - secp256k1_scalar_t t; + secp256k1_scalar t; int j; secp256k1_scalar_set_int(&t, secp256k1_scalar_get_bits(&s, 256 - 4 - i, 4)); for (j = 0; j < 4; j++) { @@ -406,13 +680,13 @@ void scalar_test(void) { { /* Test that fetching groups of randomly-sized bits from a scalar and recursing n(i)=b*n(i-1)+p(i) reconstructs it. */ - secp256k1_scalar_t n; + secp256k1_scalar n; int i = 0; secp256k1_scalar_set_int(&n, 0); while (i < 256) { - secp256k1_scalar_t t; + secp256k1_scalar t; int j; - int now = (secp256k1_rand32() % 15) + 1; + int now = secp256k1_rand_int(15) + 1; if (now + i > 256) { now = 256 - i; } @@ -429,9 +703,9 @@ void scalar_test(void) { #ifndef USE_NUM_NONE { /* Test that adding the scalars together is equal to adding their numbers together modulo the order. */ - secp256k1_num_t rnum; - secp256k1_num_t r2num; - secp256k1_scalar_t r; + secp256k1_num rnum; + secp256k1_num r2num; + secp256k1_scalar r; secp256k1_num_add(&rnum, &snum, &s2num); secp256k1_num_mod(&rnum, &order); secp256k1_scalar_add(&r, &s, &s2); @@ -440,10 +714,10 @@ void scalar_test(void) { } { - /* Test that multipying the scalars is equal to multiplying their numbers modulo the order. */ - secp256k1_scalar_t r; - secp256k1_num_t r2num; - secp256k1_num_t rnum; + /* Test that multiplying the scalars is equal to multiplying their numbers modulo the order. */ + secp256k1_scalar r; + secp256k1_num r2num; + secp256k1_num rnum; secp256k1_num_mul(&rnum, &snum, &s2num); secp256k1_num_mod(&rnum, &order); secp256k1_scalar_mul(&r, &s, &s2); @@ -457,9 +731,9 @@ void scalar_test(void) { } { - secp256k1_scalar_t neg; - secp256k1_num_t negnum; - secp256k1_num_t negnum2; + secp256k1_scalar neg; + secp256k1_num negnum; + secp256k1_num negnum2; /* Check that comparison with zero matches comparison with zero on the number. */ CHECK(secp256k1_num_is_zero(&snum) == secp256k1_scalar_is_zero(&s)); /* Check that comparison with the half order is equal to testing for high scalar. */ @@ -484,12 +758,12 @@ void scalar_test(void) { { /* Test secp256k1_scalar_mul_shift_var. */ - secp256k1_scalar_t r; - secp256k1_num_t one; - secp256k1_num_t rnum; - secp256k1_num_t rnum2; + secp256k1_scalar r; + secp256k1_num one; + secp256k1_num rnum; + secp256k1_num rnum2; unsigned char cone[1] = {0x01}; - unsigned int shift = 256 + (secp256k1_rand32() % 257); + unsigned int shift = 256 + secp256k1_rand_int(257); secp256k1_scalar_mul_shift_var(&r, &s1, &s2, shift); secp256k1_num_mul(&rnum, &s1num, &s2num); secp256k1_num_shift(&rnum, shift - 1); @@ -499,15 +773,29 @@ void scalar_test(void) { secp256k1_scalar_get_num(&rnum2, &r); CHECK(secp256k1_num_eq(&rnum, &rnum2)); } + + { + /* test secp256k1_scalar_shr_int */ + secp256k1_scalar r; + int i; + random_scalar_order_test(&r); + for (i = 0; i < 100; ++i) { + int low; + int shift = 1 + secp256k1_rand_int(15); + int expected = r.d[0] % (1 << shift); + low = secp256k1_scalar_shr_int(&r, shift); + CHECK(expected == low); + } + } #endif { /* Test that scalar inverses are equal to the inverse of their number modulo the order. */ if (!secp256k1_scalar_is_zero(&s)) { - secp256k1_scalar_t inv; + secp256k1_scalar inv; #ifndef USE_NUM_NONE - secp256k1_num_t invnum; - secp256k1_num_t invnum2; + secp256k1_num invnum; + secp256k1_num invnum2; #endif secp256k1_scalar_inverse(&inv, &s); #ifndef USE_NUM_NONE @@ -521,23 +809,27 @@ void scalar_test(void) { secp256k1_scalar_inverse(&inv, &inv); /* Inverting one must result in one. */ CHECK(secp256k1_scalar_is_one(&inv)); +#ifndef USE_NUM_NONE + secp256k1_scalar_get_num(&invnum, &inv); + CHECK(secp256k1_num_is_one(&invnum)); +#endif } } { /* Test commutativity of add. */ - secp256k1_scalar_t r1, r2; + secp256k1_scalar r1, r2; secp256k1_scalar_add(&r1, &s1, &s2); secp256k1_scalar_add(&r2, &s2, &s1); CHECK(secp256k1_scalar_eq(&r1, &r2)); } { - secp256k1_scalar_t r1, r2; - secp256k1_scalar_t b; + secp256k1_scalar r1, r2; + secp256k1_scalar b; int i; /* Test add_bit. */ - int bit = secp256k1_rand32() % 256; + int bit = secp256k1_rand_bits(8); secp256k1_scalar_set_int(&b, 1); CHECK(secp256k1_scalar_is_one(&b)); for (i = 0; i < bit; i++) { @@ -547,14 +839,17 @@ void scalar_test(void) { r2 = s1; if (!secp256k1_scalar_add(&r1, &r1, &b)) { /* No overflow happened. */ - secp256k1_scalar_add_bit(&r2, bit); + secp256k1_scalar_cadd_bit(&r2, bit, 1); + CHECK(secp256k1_scalar_eq(&r1, &r2)); + /* cadd is a noop when flag is zero */ + secp256k1_scalar_cadd_bit(&r2, bit, 0); CHECK(secp256k1_scalar_eq(&r1, &r2)); } } { /* Test commutativity of mul. */ - secp256k1_scalar_t r1, r2; + secp256k1_scalar r1, r2; secp256k1_scalar_mul(&r1, &s1, &s2); secp256k1_scalar_mul(&r2, &s2, &s1); CHECK(secp256k1_scalar_eq(&r1, &r2)); @@ -562,7 +857,7 @@ void scalar_test(void) { { /* Test associativity of add. */ - secp256k1_scalar_t r1, r2; + secp256k1_scalar r1, r2; secp256k1_scalar_add(&r1, &s1, &s2); secp256k1_scalar_add(&r1, &r1, &s); secp256k1_scalar_add(&r2, &s2, &s); @@ -572,7 +867,7 @@ void scalar_test(void) { { /* Test associativity of mul. */ - secp256k1_scalar_t r1, r2; + secp256k1_scalar r1, r2; secp256k1_scalar_mul(&r1, &s1, &s2); secp256k1_scalar_mul(&r1, &r1, &s); secp256k1_scalar_mul(&r2, &s2, &s); @@ -582,7 +877,7 @@ void scalar_test(void) { { /* Test distributitivity of mul over add. */ - secp256k1_scalar_t r1, r2, t; + secp256k1_scalar r1, r2, t; secp256k1_scalar_add(&r1, &s1, &s2); secp256k1_scalar_mul(&r1, &r1, &s); secp256k1_scalar_mul(&r2, &s1, &s); @@ -593,7 +888,7 @@ void scalar_test(void) { { /* Test square. */ - secp256k1_scalar_t r1, r2; + secp256k1_scalar r1, r2; secp256k1_scalar_sqr(&r1, &s1); secp256k1_scalar_mul(&r2, &s1, &s1); CHECK(secp256k1_scalar_eq(&r1, &r2)); @@ -601,7 +896,7 @@ void scalar_test(void) { { /* Test multiplicative identity. */ - secp256k1_scalar_t r1, v1; + secp256k1_scalar r1, v1; secp256k1_scalar_set_int(&v1,1); secp256k1_scalar_mul(&r1, &s1, &v1); CHECK(secp256k1_scalar_eq(&r1, &s1)); @@ -609,7 +904,7 @@ void scalar_test(void) { { /* Test additive identity. */ - secp256k1_scalar_t r1, v0; + secp256k1_scalar r1, v0; secp256k1_scalar_set_int(&v0,0); secp256k1_scalar_add(&r1, &s1, &v0); CHECK(secp256k1_scalar_eq(&r1, &s1)); @@ -617,7 +912,7 @@ void scalar_test(void) { { /* Test zero product property. */ - secp256k1_scalar_t r1, v0; + secp256k1_scalar r1, v0; secp256k1_scalar_set_int(&v0,0); secp256k1_scalar_mul(&r1, &s1, &v0); CHECK(secp256k1_scalar_eq(&r1, &v0)); @@ -633,7 +928,7 @@ void run_scalar_tests(void) { { /* (-1)+1 should be zero. */ - secp256k1_scalar_t s, o; + secp256k1_scalar s, o; secp256k1_scalar_set_int(&s, 1); CHECK(secp256k1_scalar_is_one(&s)); secp256k1_scalar_negate(&o, &s); @@ -646,8 +941,8 @@ void run_scalar_tests(void) { #ifndef USE_NUM_NONE { /* A scalar with value of the curve order should be 0. */ - secp256k1_num_t order; - secp256k1_scalar_t zero; + secp256k1_num order; + secp256k1_scalar zero; unsigned char bin[32]; int overflow = 0; secp256k1_scalar_order_get_num(&order); @@ -657,11 +952,605 @@ void run_scalar_tests(void) { CHECK(secp256k1_scalar_is_zero(&zero)); } #endif + + { + /* Does check_overflow check catch all ones? */ + static const secp256k1_scalar overflowed = SECP256K1_SCALAR_CONST( + 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, + 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL + ); + CHECK(secp256k1_scalar_check_overflow(&overflowed)); + } + + { + /* Static test vectors. + * These were reduced from ~10^12 random vectors based on comparison-decision + * and edge-case coverage on 32-bit and 64-bit implementations. + * The responses were generated with Sage 5.9. + */ + secp256k1_scalar x; + secp256k1_scalar y; + secp256k1_scalar z; + secp256k1_scalar zz; + secp256k1_scalar one; + secp256k1_scalar r1; + secp256k1_scalar r2; +#if defined(USE_SCALAR_INV_NUM) + secp256k1_scalar zzv; +#endif + int overflow; + unsigned char chal[33][2][32] = { + {{0xff, 0xff, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0x03, 0x00, 0xc0, 0xff, 0xff, 0xff}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff}}, + {{0xef, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x80, 0xff}}, + {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x80, 0xff, 0x3f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0x00}, + {0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xe0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff}}, + {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x1e, 0xf8, 0xff, 0xff, 0xff, 0xfd, 0xff}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, + 0x00, 0x00, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xe0, + 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, + 0xf3, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {{0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x1f, 0x00, 0x00, 0x80, 0xff, 0xff, 0x3f, + 0x00, 0xfe, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff}}, + {{0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xfc, 0x9f, + 0xff, 0xff, 0xff, 0x00, 0x80, 0x00, 0x00, 0x80, + 0xff, 0x0f, 0xfc, 0xff, 0x7f, 0x00, 0x00, 0x00, + 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}, + {0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x00, 0xf8, 0xff, 0x0f, 0xc0, 0xff, 0xff, + 0xff, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x07, 0x80, 0xff, 0xff, 0xff}}, + {{0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0x00, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xf0}, + {0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}, + {{0x00, 0xf8, 0xff, 0x03, 0xff, 0xff, 0xff, 0x00, + 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x03, 0xc0, 0xff, 0x0f, 0xfc, 0xff}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, + 0xff, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x00, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}, + {{0x8f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x03, 0x00, 0x80, 0x00, 0x00, 0x80, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x80, 0xff, 0x7f}, + {0xff, 0xcf, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xbf, 0xff, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, + 0xff, 0xff, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x80, 0x00, 0x00, 0x80, + 0xff, 0x01, 0xfc, 0xff, 0x01, 0x00, 0xfe, 0xff}, + {0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00}}, + {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf0, 0xff, 0xff, + 0xe0, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x00}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0xfc, 0xff, 0xff, 0x3f, 0xf0, 0xff, 0xff, 0x3f, + 0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0f, 0x7e, 0x00, 0x00}}, + {{0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x1f, 0x00, 0x00, 0xfe, 0x07, 0x00}, + {0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60}}, + {{0xff, 0x01, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x00, + 0x80, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, + {0xff, 0xff, 0x1f, 0x00, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00}}, + {{0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, + 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff}}, + {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xff, 0xff, 0xcf, 0xff, 0x1f, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x7e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00}, + {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0xff, 0xff, 0x7f, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff}}, + {{0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}, + {0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x80, + 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0x7f, 0xf8, 0xff, 0xff, 0x1f, 0x00, 0xfe}}, + {{0xff, 0xff, 0xff, 0x3f, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0x03, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0xff, 0xff, 0xff, 0xff, 0x01, 0x80, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}}, + {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, + 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40}}, + {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {{0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, + {0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}, + {{0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xc0, + 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0xff, 0xff}}, + {{0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}}, + {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, + 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}, + {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7e, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x07, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, + {0xff, 0x01, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}, + {{0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x00, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, + 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, + 0xff, 0xff, 0x3f, 0x00, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x3f, 0x00, 0x00, 0xc0, 0xf1, 0x7f, 0x00}}, + {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00}, + {0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, + 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1f, + 0x00, 0x00, 0xfc, 0xff, 0xff, 0x01, 0xff, 0xff}}, + {{0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x80, 0x00, 0x00, 0x80, 0xff, 0x03, 0xe0, 0x01, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}, + {0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0xfe, 0xff, 0xff, 0xf0, 0x07, 0x00, 0x3c, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x07, 0xe0, 0xff, 0x00, 0x00, 0x00}}, + {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xf8, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x80, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x7f, 0xfe, 0xff, 0x1f, + 0x00, 0xfe, 0xff, 0x03, 0x00, 0x00, 0xfe, 0xff}}, + {{0xff, 0xff, 0x81, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x83, + 0xff, 0xff, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xf0}, + {0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, + 0xf8, 0x07, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc7, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff}}, + {{0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00, + 0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x03, 0xfb, + 0xfa, 0x8a, 0x7d, 0xdf, 0x13, 0x86, 0xe2, 0x03}, + {0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00, + 0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x03, 0xfb, + 0xfa, 0x8a, 0x7d, 0xdf, 0x13, 0x86, 0xe2, 0x03}} + }; + unsigned char res[33][2][32] = { + {{0x0c, 0x3b, 0x0a, 0xca, 0x8d, 0x1a, 0x2f, 0xb9, + 0x8a, 0x7b, 0x53, 0x5a, 0x1f, 0xc5, 0x22, 0xa1, + 0x07, 0x2a, 0x48, 0xea, 0x02, 0xeb, 0xb3, 0xd6, + 0x20, 0x1e, 0x86, 0xd0, 0x95, 0xf6, 0x92, 0x35}, + {0xdc, 0x90, 0x7a, 0x07, 0x2e, 0x1e, 0x44, 0x6d, + 0xf8, 0x15, 0x24, 0x5b, 0x5a, 0x96, 0x37, 0x9c, + 0x37, 0x7b, 0x0d, 0xac, 0x1b, 0x65, 0x58, 0x49, + 0x43, 0xb7, 0x31, 0xbb, 0xa7, 0xf4, 0x97, 0x15}}, + {{0xf1, 0xf7, 0x3a, 0x50, 0xe6, 0x10, 0xba, 0x22, + 0x43, 0x4d, 0x1f, 0x1f, 0x7c, 0x27, 0xca, 0x9c, + 0xb8, 0xb6, 0xa0, 0xfc, 0xd8, 0xc0, 0x05, 0x2f, + 0xf7, 0x08, 0xe1, 0x76, 0xdd, 0xd0, 0x80, 0xc8}, + {0xe3, 0x80, 0x80, 0xb8, 0xdb, 0xe3, 0xa9, 0x77, + 0x00, 0xb0, 0xf5, 0x2e, 0x27, 0xe2, 0x68, 0xc4, + 0x88, 0xe8, 0x04, 0xc1, 0x12, 0xbf, 0x78, 0x59, + 0xe6, 0xa9, 0x7c, 0xe1, 0x81, 0xdd, 0xb9, 0xd5}}, + {{0x96, 0xe2, 0xee, 0x01, 0xa6, 0x80, 0x31, 0xef, + 0x5c, 0xd0, 0x19, 0xb4, 0x7d, 0x5f, 0x79, 0xab, + 0xa1, 0x97, 0xd3, 0x7e, 0x33, 0xbb, 0x86, 0x55, + 0x60, 0x20, 0x10, 0x0d, 0x94, 0x2d, 0x11, 0x7c}, + {0xcc, 0xab, 0xe0, 0xe8, 0x98, 0x65, 0x12, 0x96, + 0x38, 0x5a, 0x1a, 0xf2, 0x85, 0x23, 0x59, 0x5f, + 0xf9, 0xf3, 0xc2, 0x81, 0x70, 0x92, 0x65, 0x12, + 0x9c, 0x65, 0x1e, 0x96, 0x00, 0xef, 0xe7, 0x63}}, + {{0xac, 0x1e, 0x62, 0xc2, 0x59, 0xfc, 0x4e, 0x5c, + 0x83, 0xb0, 0xd0, 0x6f, 0xce, 0x19, 0xf6, 0xbf, + 0xa4, 0xb0, 0xe0, 0x53, 0x66, 0x1f, 0xbf, 0xc9, + 0x33, 0x47, 0x37, 0xa9, 0x3d, 0x5d, 0xb0, 0x48}, + {0x86, 0xb9, 0x2a, 0x7f, 0x8e, 0xa8, 0x60, 0x42, + 0x26, 0x6d, 0x6e, 0x1c, 0xa2, 0xec, 0xe0, 0xe5, + 0x3e, 0x0a, 0x33, 0xbb, 0x61, 0x4c, 0x9f, 0x3c, + 0xd1, 0xdf, 0x49, 0x33, 0xcd, 0x72, 0x78, 0x18}}, + {{0xf7, 0xd3, 0xcd, 0x49, 0x5c, 0x13, 0x22, 0xfb, + 0x2e, 0xb2, 0x2f, 0x27, 0xf5, 0x8a, 0x5d, 0x74, + 0xc1, 0x58, 0xc5, 0xc2, 0x2d, 0x9f, 0x52, 0xc6, + 0x63, 0x9f, 0xba, 0x05, 0x76, 0x45, 0x7a, 0x63}, + {0x8a, 0xfa, 0x55, 0x4d, 0xdd, 0xa3, 0xb2, 0xc3, + 0x44, 0xfd, 0xec, 0x72, 0xde, 0xef, 0xc0, 0x99, + 0xf5, 0x9f, 0xe2, 0x52, 0xb4, 0x05, 0x32, 0x58, + 0x57, 0xc1, 0x8f, 0xea, 0xc3, 0x24, 0x5b, 0x94}}, + {{0x05, 0x83, 0xee, 0xdd, 0x64, 0xf0, 0x14, 0x3b, + 0xa0, 0x14, 0x4a, 0x3a, 0x41, 0x82, 0x7c, 0xa7, + 0x2c, 0xaa, 0xb1, 0x76, 0xbb, 0x59, 0x64, 0x5f, + 0x52, 0xad, 0x25, 0x29, 0x9d, 0x8f, 0x0b, 0xb0}, + {0x7e, 0xe3, 0x7c, 0xca, 0xcd, 0x4f, 0xb0, 0x6d, + 0x7a, 0xb2, 0x3e, 0xa0, 0x08, 0xb9, 0xa8, 0x2d, + 0xc2, 0xf4, 0x99, 0x66, 0xcc, 0xac, 0xd8, 0xb9, + 0x72, 0x2a, 0x4a, 0x3e, 0x0f, 0x7b, 0xbf, 0xf4}}, + {{0x8c, 0x9c, 0x78, 0x2b, 0x39, 0x61, 0x7e, 0xf7, + 0x65, 0x37, 0x66, 0x09, 0x38, 0xb9, 0x6f, 0x70, + 0x78, 0x87, 0xff, 0xcf, 0x93, 0xca, 0x85, 0x06, + 0x44, 0x84, 0xa7, 0xfe, 0xd3, 0xa4, 0xe3, 0x7e}, + {0xa2, 0x56, 0x49, 0x23, 0x54, 0xa5, 0x50, 0xe9, + 0x5f, 0xf0, 0x4d, 0xe7, 0xdc, 0x38, 0x32, 0x79, + 0x4f, 0x1c, 0xb7, 0xe4, 0xbb, 0xf8, 0xbb, 0x2e, + 0x40, 0x41, 0x4b, 0xcc, 0xe3, 0x1e, 0x16, 0x36}}, + {{0x0c, 0x1e, 0xd7, 0x09, 0x25, 0x40, 0x97, 0xcb, + 0x5c, 0x46, 0xa8, 0xda, 0xef, 0x25, 0xd5, 0xe5, + 0x92, 0x4d, 0xcf, 0xa3, 0xc4, 0x5d, 0x35, 0x4a, + 0xe4, 0x61, 0x92, 0xf3, 0xbf, 0x0e, 0xcd, 0xbe}, + {0xe4, 0xaf, 0x0a, 0xb3, 0x30, 0x8b, 0x9b, 0x48, + 0x49, 0x43, 0xc7, 0x64, 0x60, 0x4a, 0x2b, 0x9e, + 0x95, 0x5f, 0x56, 0xe8, 0x35, 0xdc, 0xeb, 0xdc, + 0xc7, 0xc4, 0xfe, 0x30, 0x40, 0xc7, 0xbf, 0xa4}}, + {{0xd4, 0xa0, 0xf5, 0x81, 0x49, 0x6b, 0xb6, 0x8b, + 0x0a, 0x69, 0xf9, 0xfe, 0xa8, 0x32, 0xe5, 0xe0, + 0xa5, 0xcd, 0x02, 0x53, 0xf9, 0x2c, 0xe3, 0x53, + 0x83, 0x36, 0xc6, 0x02, 0xb5, 0xeb, 0x64, 0xb8}, + {0x1d, 0x42, 0xb9, 0xf9, 0xe9, 0xe3, 0x93, 0x2c, + 0x4c, 0xee, 0x6c, 0x5a, 0x47, 0x9e, 0x62, 0x01, + 0x6b, 0x04, 0xfe, 0xa4, 0x30, 0x2b, 0x0d, 0x4f, + 0x71, 0x10, 0xd3, 0x55, 0xca, 0xf3, 0x5e, 0x80}}, + {{0x77, 0x05, 0xf6, 0x0c, 0x15, 0x9b, 0x45, 0xe7, + 0xb9, 0x11, 0xb8, 0xf5, 0xd6, 0xda, 0x73, 0x0c, + 0xda, 0x92, 0xea, 0xd0, 0x9d, 0xd0, 0x18, 0x92, + 0xce, 0x9a, 0xaa, 0xee, 0x0f, 0xef, 0xde, 0x30}, + {0xf1, 0xf1, 0xd6, 0x9b, 0x51, 0xd7, 0x77, 0x62, + 0x52, 0x10, 0xb8, 0x7a, 0x84, 0x9d, 0x15, 0x4e, + 0x07, 0xdc, 0x1e, 0x75, 0x0d, 0x0c, 0x3b, 0xdb, + 0x74, 0x58, 0x62, 0x02, 0x90, 0x54, 0x8b, 0x43}}, + {{0xa6, 0xfe, 0x0b, 0x87, 0x80, 0x43, 0x67, 0x25, + 0x57, 0x5d, 0xec, 0x40, 0x50, 0x08, 0xd5, 0x5d, + 0x43, 0xd7, 0xe0, 0xaa, 0xe0, 0x13, 0xb6, 0xb0, + 0xc0, 0xd4, 0xe5, 0x0d, 0x45, 0x83, 0xd6, 0x13}, + {0x40, 0x45, 0x0a, 0x92, 0x31, 0xea, 0x8c, 0x60, + 0x8c, 0x1f, 0xd8, 0x76, 0x45, 0xb9, 0x29, 0x00, + 0x26, 0x32, 0xd8, 0xa6, 0x96, 0x88, 0xe2, 0xc4, + 0x8b, 0xdb, 0x7f, 0x17, 0x87, 0xcc, 0xc8, 0xf2}}, + {{0xc2, 0x56, 0xe2, 0xb6, 0x1a, 0x81, 0xe7, 0x31, + 0x63, 0x2e, 0xbb, 0x0d, 0x2f, 0x81, 0x67, 0xd4, + 0x22, 0xe2, 0x38, 0x02, 0x25, 0x97, 0xc7, 0x88, + 0x6e, 0xdf, 0xbe, 0x2a, 0xa5, 0x73, 0x63, 0xaa}, + {0x50, 0x45, 0xe2, 0xc3, 0xbd, 0x89, 0xfc, 0x57, + 0xbd, 0x3c, 0xa3, 0x98, 0x7e, 0x7f, 0x36, 0x38, + 0x92, 0x39, 0x1f, 0x0f, 0x81, 0x1a, 0x06, 0x51, + 0x1f, 0x8d, 0x6a, 0xff, 0x47, 0x16, 0x06, 0x9c}}, + {{0x33, 0x95, 0xa2, 0x6f, 0x27, 0x5f, 0x9c, 0x9c, + 0x64, 0x45, 0xcb, 0xd1, 0x3c, 0xee, 0x5e, 0x5f, + 0x48, 0xa6, 0xaf, 0xe3, 0x79, 0xcf, 0xb1, 0xe2, + 0xbf, 0x55, 0x0e, 0xa2, 0x3b, 0x62, 0xf0, 0xe4}, + {0x14, 0xe8, 0x06, 0xe3, 0xbe, 0x7e, 0x67, 0x01, + 0xc5, 0x21, 0x67, 0xd8, 0x54, 0xb5, 0x7f, 0xa4, + 0xf9, 0x75, 0x70, 0x1c, 0xfd, 0x79, 0xdb, 0x86, + 0xad, 0x37, 0x85, 0x83, 0x56, 0x4e, 0xf0, 0xbf}}, + {{0xbc, 0xa6, 0xe0, 0x56, 0x4e, 0xef, 0xfa, 0xf5, + 0x1d, 0x5d, 0x3f, 0x2a, 0x5b, 0x19, 0xab, 0x51, + 0xc5, 0x8b, 0xdd, 0x98, 0x28, 0x35, 0x2f, 0xc3, + 0x81, 0x4f, 0x5c, 0xe5, 0x70, 0xb9, 0xeb, 0x62}, + {0xc4, 0x6d, 0x26, 0xb0, 0x17, 0x6b, 0xfe, 0x6c, + 0x12, 0xf8, 0xe7, 0xc1, 0xf5, 0x2f, 0xfa, 0x91, + 0x13, 0x27, 0xbd, 0x73, 0xcc, 0x33, 0x31, 0x1c, + 0x39, 0xe3, 0x27, 0x6a, 0x95, 0xcf, 0xc5, 0xfb}}, + {{0x30, 0xb2, 0x99, 0x84, 0xf0, 0x18, 0x2a, 0x6e, + 0x1e, 0x27, 0xed, 0xa2, 0x29, 0x99, 0x41, 0x56, + 0xe8, 0xd4, 0x0d, 0xef, 0x99, 0x9c, 0xf3, 0x58, + 0x29, 0x55, 0x1a, 0xc0, 0x68, 0xd6, 0x74, 0xa4}, + {0x07, 0x9c, 0xe7, 0xec, 0xf5, 0x36, 0x73, 0x41, + 0xa3, 0x1c, 0xe5, 0x93, 0x97, 0x6a, 0xfd, 0xf7, + 0x53, 0x18, 0xab, 0xaf, 0xeb, 0x85, 0xbd, 0x92, + 0x90, 0xab, 0x3c, 0xbf, 0x30, 0x82, 0xad, 0xf6}}, + {{0xc6, 0x87, 0x8a, 0x2a, 0xea, 0xc0, 0xa9, 0xec, + 0x6d, 0xd3, 0xdc, 0x32, 0x23, 0xce, 0x62, 0x19, + 0xa4, 0x7e, 0xa8, 0xdd, 0x1c, 0x33, 0xae, 0xd3, + 0x4f, 0x62, 0x9f, 0x52, 0xe7, 0x65, 0x46, 0xf4}, + {0x97, 0x51, 0x27, 0x67, 0x2d, 0xa2, 0x82, 0x87, + 0x98, 0xd3, 0xb6, 0x14, 0x7f, 0x51, 0xd3, 0x9a, + 0x0b, 0xd0, 0x76, 0x81, 0xb2, 0x4f, 0x58, 0x92, + 0xa4, 0x86, 0xa1, 0xa7, 0x09, 0x1d, 0xef, 0x9b}}, + {{0xb3, 0x0f, 0x2b, 0x69, 0x0d, 0x06, 0x90, 0x64, + 0xbd, 0x43, 0x4c, 0x10, 0xe8, 0x98, 0x1c, 0xa3, + 0xe1, 0x68, 0xe9, 0x79, 0x6c, 0x29, 0x51, 0x3f, + 0x41, 0xdc, 0xdf, 0x1f, 0xf3, 0x60, 0xbe, 0x33}, + {0xa1, 0x5f, 0xf7, 0x1d, 0xb4, 0x3e, 0x9b, 0x3c, + 0xe7, 0xbd, 0xb6, 0x06, 0xd5, 0x60, 0x06, 0x6d, + 0x50, 0xd2, 0xf4, 0x1a, 0x31, 0x08, 0xf2, 0xea, + 0x8e, 0xef, 0x5f, 0x7d, 0xb6, 0xd0, 0xc0, 0x27}}, + {{0x62, 0x9a, 0xd9, 0xbb, 0x38, 0x36, 0xce, 0xf7, + 0x5d, 0x2f, 0x13, 0xec, 0xc8, 0x2d, 0x02, 0x8a, + 0x2e, 0x72, 0xf0, 0xe5, 0x15, 0x9d, 0x72, 0xae, + 0xfc, 0xb3, 0x4f, 0x02, 0xea, 0xe1, 0x09, 0xfe}, + {0x00, 0x00, 0x00, 0x00, 0xfa, 0x0a, 0x3d, 0xbc, + 0xad, 0x16, 0x0c, 0xb6, 0xe7, 0x7c, 0x8b, 0x39, + 0x9a, 0x43, 0xbb, 0xe3, 0xc2, 0x55, 0x15, 0x14, + 0x75, 0xac, 0x90, 0x9b, 0x7f, 0x9a, 0x92, 0x00}}, + {{0x8b, 0xac, 0x70, 0x86, 0x29, 0x8f, 0x00, 0x23, + 0x7b, 0x45, 0x30, 0xaa, 0xb8, 0x4c, 0xc7, 0x8d, + 0x4e, 0x47, 0x85, 0xc6, 0x19, 0xe3, 0x96, 0xc2, + 0x9a, 0xa0, 0x12, 0xed, 0x6f, 0xd7, 0x76, 0x16}, + {0x45, 0xaf, 0x7e, 0x33, 0xc7, 0x7f, 0x10, 0x6c, + 0x7c, 0x9f, 0x29, 0xc1, 0xa8, 0x7e, 0x15, 0x84, + 0xe7, 0x7d, 0xc0, 0x6d, 0xab, 0x71, 0x5d, 0xd0, + 0x6b, 0x9f, 0x97, 0xab, 0xcb, 0x51, 0x0c, 0x9f}}, + {{0x9e, 0xc3, 0x92, 0xb4, 0x04, 0x9f, 0xc8, 0xbb, + 0xdd, 0x9e, 0xc6, 0x05, 0xfd, 0x65, 0xec, 0x94, + 0x7f, 0x2c, 0x16, 0xc4, 0x40, 0xac, 0x63, 0x7b, + 0x7d, 0xb8, 0x0c, 0xe4, 0x5b, 0xe3, 0xa7, 0x0e}, + {0x43, 0xf4, 0x44, 0xe8, 0xcc, 0xc8, 0xd4, 0x54, + 0x33, 0x37, 0x50, 0xf2, 0x87, 0x42, 0x2e, 0x00, + 0x49, 0x60, 0x62, 0x02, 0xfd, 0x1a, 0x7c, 0xdb, + 0x29, 0x6c, 0x6d, 0x54, 0x53, 0x08, 0xd1, 0xc8}}, + {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}, + {{0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1, + 0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0, + 0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59, + 0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92}, + {0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1, + 0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0, + 0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59, + 0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92}}, + {{0x28, 0x56, 0xac, 0x0e, 0x4f, 0x98, 0x09, 0xf0, + 0x49, 0xfa, 0x7f, 0x84, 0xac, 0x7e, 0x50, 0x5b, + 0x17, 0x43, 0x14, 0x89, 0x9c, 0x53, 0xa8, 0x94, + 0x30, 0xf2, 0x11, 0x4d, 0x92, 0x14, 0x27, 0xe8}, + {0x39, 0x7a, 0x84, 0x56, 0x79, 0x9d, 0xec, 0x26, + 0x2c, 0x53, 0xc1, 0x94, 0xc9, 0x8d, 0x9e, 0x9d, + 0x32, 0x1f, 0xdd, 0x84, 0x04, 0xe8, 0xe2, 0x0a, + 0x6b, 0xbe, 0xbb, 0x42, 0x40, 0x67, 0x30, 0x6c}}, + {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4, + 0x40, 0x2d, 0xa1, 0x73, 0x2f, 0xc9, 0xbe, 0xbd}, + {0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1, + 0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0, + 0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59, + 0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92}}, + {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, + 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}, + {{0x1c, 0xc4, 0xf7, 0xda, 0x0f, 0x65, 0xca, 0x39, + 0x70, 0x52, 0x92, 0x8e, 0xc3, 0xc8, 0x15, 0xea, + 0x7f, 0x10, 0x9e, 0x77, 0x4b, 0x6e, 0x2d, 0xdf, + 0xe8, 0x30, 0x9d, 0xda, 0xe8, 0x9a, 0x65, 0xae}, + {0x02, 0xb0, 0x16, 0xb1, 0x1d, 0xc8, 0x57, 0x7b, + 0xa2, 0x3a, 0xa2, 0xa3, 0x38, 0x5c, 0x8f, 0xeb, + 0x66, 0x37, 0x91, 0xa8, 0x5f, 0xef, 0x04, 0xf6, + 0x59, 0x75, 0xe1, 0xee, 0x92, 0xf6, 0x0e, 0x30}}, + {{0x8d, 0x76, 0x14, 0xa4, 0x14, 0x06, 0x9f, 0x9a, + 0xdf, 0x4a, 0x85, 0xa7, 0x6b, 0xbf, 0x29, 0x6f, + 0xbc, 0x34, 0x87, 0x5d, 0xeb, 0xbb, 0x2e, 0xa9, + 0xc9, 0x1f, 0x58, 0xd6, 0x9a, 0x82, 0xa0, 0x56}, + {0xd4, 0xb9, 0xdb, 0x88, 0x1d, 0x04, 0xe9, 0x93, + 0x8d, 0x3f, 0x20, 0xd5, 0x86, 0xa8, 0x83, 0x07, + 0xdb, 0x09, 0xd8, 0x22, 0x1f, 0x7f, 0xf1, 0x71, + 0xc8, 0xe7, 0x5d, 0x47, 0xaf, 0x8b, 0x72, 0xe9}}, + {{0x83, 0xb9, 0x39, 0xb2, 0xa4, 0xdf, 0x46, 0x87, + 0xc2, 0xb8, 0xf1, 0xe6, 0x4c, 0xd1, 0xe2, 0xa9, + 0xe4, 0x70, 0x30, 0x34, 0xbc, 0x52, 0x7c, 0x55, + 0xa6, 0xec, 0x80, 0xa4, 0xe5, 0xd2, 0xdc, 0x73}, + {0x08, 0xf1, 0x03, 0xcf, 0x16, 0x73, 0xe8, 0x7d, + 0xb6, 0x7e, 0x9b, 0xc0, 0xb4, 0xc2, 0xa5, 0x86, + 0x02, 0x77, 0xd5, 0x27, 0x86, 0xa5, 0x15, 0xfb, + 0xae, 0x9b, 0x8c, 0xa9, 0xf9, 0xf8, 0xa8, 0x4a}}, + {{0x8b, 0x00, 0x49, 0xdb, 0xfa, 0xf0, 0x1b, 0xa2, + 0xed, 0x8a, 0x9a, 0x7a, 0x36, 0x78, 0x4a, 0xc7, + 0xf7, 0xad, 0x39, 0xd0, 0x6c, 0x65, 0x7a, 0x41, + 0xce, 0xd6, 0xd6, 0x4c, 0x20, 0x21, 0x6b, 0xc7}, + {0xc6, 0xca, 0x78, 0x1d, 0x32, 0x6c, 0x6c, 0x06, + 0x91, 0xf2, 0x1a, 0xe8, 0x43, 0x16, 0xea, 0x04, + 0x3c, 0x1f, 0x07, 0x85, 0xf7, 0x09, 0x22, 0x08, + 0xba, 0x13, 0xfd, 0x78, 0x1e, 0x3f, 0x6f, 0x62}}, + {{0x25, 0x9b, 0x7c, 0xb0, 0xac, 0x72, 0x6f, 0xb2, + 0xe3, 0x53, 0x84, 0x7a, 0x1a, 0x9a, 0x98, 0x9b, + 0x44, 0xd3, 0x59, 0xd0, 0x8e, 0x57, 0x41, 0x40, + 0x78, 0xa7, 0x30, 0x2f, 0x4c, 0x9c, 0xb9, 0x68}, + {0xb7, 0x75, 0x03, 0x63, 0x61, 0xc2, 0x48, 0x6e, + 0x12, 0x3d, 0xbf, 0x4b, 0x27, 0xdf, 0xb1, 0x7a, + 0xff, 0x4e, 0x31, 0x07, 0x83, 0xf4, 0x62, 0x5b, + 0x19, 0xa5, 0xac, 0xa0, 0x32, 0x58, 0x0d, 0xa7}}, + {{0x43, 0x4f, 0x10, 0xa4, 0xca, 0xdb, 0x38, 0x67, + 0xfa, 0xae, 0x96, 0xb5, 0x6d, 0x97, 0xff, 0x1f, + 0xb6, 0x83, 0x43, 0xd3, 0xa0, 0x2d, 0x70, 0x7a, + 0x64, 0x05, 0x4c, 0xa7, 0xc1, 0xa5, 0x21, 0x51}, + {0xe4, 0xf1, 0x23, 0x84, 0xe1, 0xb5, 0x9d, 0xf2, + 0xb8, 0x73, 0x8b, 0x45, 0x2b, 0x35, 0x46, 0x38, + 0x10, 0x2b, 0x50, 0xf8, 0x8b, 0x35, 0xcd, 0x34, + 0xc8, 0x0e, 0xf6, 0xdb, 0x09, 0x35, 0xf0, 0xda}}, + {{0xdb, 0x21, 0x5c, 0x8d, 0x83, 0x1d, 0xb3, 0x34, + 0xc7, 0x0e, 0x43, 0xa1, 0x58, 0x79, 0x67, 0x13, + 0x1e, 0x86, 0x5d, 0x89, 0x63, 0xe6, 0x0a, 0x46, + 0x5c, 0x02, 0x97, 0x1b, 0x62, 0x43, 0x86, 0xf5}, + {0xdb, 0x21, 0x5c, 0x8d, 0x83, 0x1d, 0xb3, 0x34, + 0xc7, 0x0e, 0x43, 0xa1, 0x58, 0x79, 0x67, 0x13, + 0x1e, 0x86, 0x5d, 0x89, 0x63, 0xe6, 0x0a, 0x46, + 0x5c, 0x02, 0x97, 0x1b, 0x62, 0x43, 0x86, 0xf5}} + }; + secp256k1_scalar_set_int(&one, 1); + for (i = 0; i < 33; i++) { + secp256k1_scalar_set_b32(&x, chal[i][0], &overflow); + CHECK(!overflow); + secp256k1_scalar_set_b32(&y, chal[i][1], &overflow); + CHECK(!overflow); + secp256k1_scalar_set_b32(&r1, res[i][0], &overflow); + CHECK(!overflow); + secp256k1_scalar_set_b32(&r2, res[i][1], &overflow); + CHECK(!overflow); + secp256k1_scalar_mul(&z, &x, &y); + CHECK(!secp256k1_scalar_check_overflow(&z)); + CHECK(secp256k1_scalar_eq(&r1, &z)); + if (!secp256k1_scalar_is_zero(&y)) { + secp256k1_scalar_inverse(&zz, &y); + CHECK(!secp256k1_scalar_check_overflow(&zz)); +#if defined(USE_SCALAR_INV_NUM) + secp256k1_scalar_inverse_var(&zzv, &y); + CHECK(secp256k1_scalar_eq(&zzv, &zz)); +#endif + secp256k1_scalar_mul(&z, &z, &zz); + CHECK(!secp256k1_scalar_check_overflow(&z)); + CHECK(secp256k1_scalar_eq(&x, &z)); + secp256k1_scalar_mul(&zz, &zz, &y); + CHECK(!secp256k1_scalar_check_overflow(&zz)); + CHECK(secp256k1_scalar_eq(&one, &zz)); + } + secp256k1_scalar_mul(&z, &x, &x); + CHECK(!secp256k1_scalar_check_overflow(&z)); + secp256k1_scalar_sqr(&zz, &x); + CHECK(!secp256k1_scalar_check_overflow(&zz)); + CHECK(secp256k1_scalar_eq(&zz, &z)); + CHECK(secp256k1_scalar_eq(&r2, &zz)); + } + } } /***** FIELD TESTS *****/ -void random_fe(secp256k1_fe_t *x) { +void random_fe(secp256k1_fe *x) { unsigned char bin[32]; do { secp256k1_rand256(bin); @@ -671,7 +1560,17 @@ void random_fe(secp256k1_fe_t *x) { } while(1); } -void random_fe_non_zero(secp256k1_fe_t *nz) { +void random_fe_test(secp256k1_fe *x) { + unsigned char bin[32]; + do { + secp256k1_rand256_test(bin); + if (secp256k1_fe_set_b32(x, bin)) { + return; + } + } while(1); +} + +void random_fe_non_zero(secp256k1_fe *nz) { int tries = 10; while (--tries >= 0) { random_fe(nz); @@ -684,25 +1583,25 @@ void random_fe_non_zero(secp256k1_fe_t *nz) { CHECK(tries >= 0); } -void random_fe_non_square(secp256k1_fe_t *ns) { - secp256k1_fe_t r; +void random_fe_non_square(secp256k1_fe *ns) { + secp256k1_fe r; random_fe_non_zero(ns); - if (secp256k1_fe_sqrt_var(&r, ns)) { + if (secp256k1_fe_sqrt(&r, ns)) { secp256k1_fe_negate(ns, ns, 1); } } -int check_fe_equal(const secp256k1_fe_t *a, const secp256k1_fe_t *b) { - secp256k1_fe_t an = *a; - secp256k1_fe_t bn = *b; +int check_fe_equal(const secp256k1_fe *a, const secp256k1_fe *b) { + secp256k1_fe an = *a; + secp256k1_fe bn = *b; secp256k1_fe_normalize_weak(&an); secp256k1_fe_normalize_var(&bn); return secp256k1_fe_equal_var(&an, &bn); } -int check_fe_inverse(const secp256k1_fe_t *a, const secp256k1_fe_t *ai) { - secp256k1_fe_t x; - secp256k1_fe_t one = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1); +int check_fe_inverse(const secp256k1_fe *a, const secp256k1_fe *ai) { + secp256k1_fe x; + secp256k1_fe one = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1); secp256k1_fe_mul(&x, a, ai); return check_fe_equal(&x, &one); } @@ -714,17 +1613,17 @@ void run_field_convert(void) { 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x40 }; - static const secp256k1_fe_storage_t fes = SECP256K1_FE_STORAGE_CONST( + static const secp256k1_fe_storage fes = SECP256K1_FE_STORAGE_CONST( 0x00010203UL, 0x04050607UL, 0x11121314UL, 0x15161718UL, 0x22232425UL, 0x26272829UL, 0x33343536UL, 0x37383940UL ); - static const secp256k1_fe_t fe = SECP256K1_FE_CONST( + static const secp256k1_fe fe = SECP256K1_FE_CONST( 0x00010203UL, 0x04050607UL, 0x11121314UL, 0x15161718UL, 0x22232425UL, 0x26272829UL, 0x33343536UL, 0x37383940UL ); - secp256k1_fe_t fe2; + secp256k1_fe fe2; unsigned char b322[32]; - secp256k1_fe_storage_t fes2; + secp256k1_fe_storage fes2; /* Check conversions to fe. */ CHECK(secp256k1_fe_set_b32(&fe2, b32)); CHECK(secp256k1_fe_equal_var(&fe, &fe2)); @@ -737,15 +1636,24 @@ void run_field_convert(void) { CHECK(memcmp(&fes2, &fes, sizeof(fes)) == 0); } +int fe_memcmp(const secp256k1_fe *a, const secp256k1_fe *b) { + secp256k1_fe t = *b; +#ifdef VERIFY + t.magnitude = a->magnitude; + t.normalized = a->normalized; +#endif + return memcmp(a, &t, sizeof(secp256k1_fe)); +} + void run_field_misc(void) { - secp256k1_fe_t x; - secp256k1_fe_t y; - secp256k1_fe_t z; - secp256k1_fe_t q; - secp256k1_fe_t fe5 = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 5); - int i; + secp256k1_fe x; + secp256k1_fe y; + secp256k1_fe z; + secp256k1_fe q; + secp256k1_fe fe5 = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 5); + int i, j; for (i = 0; i < 5*count; i++) { - secp256k1_fe_storage_t xs, ys, zs; + secp256k1_fe_storage xs, ys, zs; random_fe(&x); random_fe_non_zero(&y); /* Test the fe equality and comparison operations. */ @@ -756,14 +1664,27 @@ void run_field_misc(void) { /* Test fe conditional move; z is not normalized here. */ q = x; secp256k1_fe_cmov(&x, &z, 0); + VERIFY_CHECK(!x.normalized && x.magnitude == z.magnitude); secp256k1_fe_cmov(&x, &x, 1); - CHECK(memcmp(&x, &z, sizeof(x)) != 0); - CHECK(memcmp(&x, &q, sizeof(x)) == 0); + CHECK(fe_memcmp(&x, &z) != 0); + CHECK(fe_memcmp(&x, &q) == 0); secp256k1_fe_cmov(&q, &z, 1); - CHECK(memcmp(&q, &z, sizeof(q)) == 0); - /* Test storage conversion and conditional moves. */ - secp256k1_fe_normalize(&z); + VERIFY_CHECK(!q.normalized && q.magnitude == z.magnitude); + CHECK(fe_memcmp(&q, &z) == 0); + secp256k1_fe_normalize_var(&x); + secp256k1_fe_normalize_var(&z); CHECK(!secp256k1_fe_equal_var(&x, &z)); + secp256k1_fe_normalize_var(&q); + secp256k1_fe_cmov(&q, &z, (i&1)); + VERIFY_CHECK(q.normalized && q.magnitude == 1); + for (j = 0; j < 6; j++) { + secp256k1_fe_negate(&z, &z, j+1); + secp256k1_fe_normalize_var(&q); + secp256k1_fe_cmov(&q, &z, (j&1)); + VERIFY_CHECK(!q.normalized && q.magnitude == (j+2)); + } + secp256k1_fe_normalize_var(&z); + /* Test storage conversion and conditional moves. */ secp256k1_fe_to_storage(&xs, &x); secp256k1_fe_to_storage(&ys, &y); secp256k1_fe_to_storage(&zs, &z); @@ -797,7 +1718,7 @@ void run_field_misc(void) { } void run_field_inv(void) { - secp256k1_fe_t x, xi, xii; + secp256k1_fe x, xi, xii; int i; for (i = 0; i < 10*count; i++) { random_fe_non_zero(&x); @@ -809,7 +1730,7 @@ void run_field_inv(void) { } void run_field_inv_var(void) { - secp256k1_fe_t x, xi, xii; + secp256k1_fe x, xi, xii; int i; for (i = 0; i < 10*count; i++) { random_fe_non_zero(&x); @@ -821,21 +1742,21 @@ void run_field_inv_var(void) { } void run_field_inv_all_var(void) { - secp256k1_fe_t x[16], xi[16], xii[16]; + secp256k1_fe x[16], xi[16], xii[16]; int i; /* Check it's safe to call for 0 elements */ - secp256k1_fe_inv_all_var(0, xi, x); + secp256k1_fe_inv_all_var(xi, x, 0); for (i = 0; i < count; i++) { size_t j; - size_t len = (secp256k1_rand32() & 15) + 1; + size_t len = secp256k1_rand_int(15) + 1; for (j = 0; j < len; j++) { random_fe_non_zero(&x[j]); } - secp256k1_fe_inv_all_var(len, xi, x); + secp256k1_fe_inv_all_var(xi, x, len); for (j = 0; j < len; j++) { CHECK(check_fe_inverse(&x[j], &xi[j])); } - secp256k1_fe_inv_all_var(len, xii, xi); + secp256k1_fe_inv_all_var(xii, xi, len); for (j = 0; j < len; j++) { CHECK(check_fe_equal(&x[j], &xii[j])); } @@ -843,7 +1764,7 @@ void run_field_inv_all_var(void) { } void run_sqr(void) { - secp256k1_fe_t x, s; + secp256k1_fe x, s; { int i; @@ -858,9 +1779,9 @@ void run_sqr(void) { } } -void test_sqrt(const secp256k1_fe_t *a, const secp256k1_fe_t *k) { - secp256k1_fe_t r1, r2; - int v = secp256k1_fe_sqrt_var(&r1, a); +void test_sqrt(const secp256k1_fe *a, const secp256k1_fe *k) { + secp256k1_fe r1, r2; + int v = secp256k1_fe_sqrt(&r1, a); CHECK((v == 0) == (k == NULL)); if (k != NULL) { @@ -873,7 +1794,7 @@ void test_sqrt(const secp256k1_fe_t *a, const secp256k1_fe_t *k) { } void run_sqrt(void) { - secp256k1_fe_t ns, x, s, t; + secp256k1_fe ns, x, s, t; int i; /* Check sqrt(0) is 0 */ @@ -908,19 +1829,19 @@ void run_sqrt(void) { /***** GROUP TESTS *****/ -void ge_equals_ge(const secp256k1_ge_t *a, const secp256k1_ge_t *b) { +void ge_equals_ge(const secp256k1_ge *a, const secp256k1_ge *b) { CHECK(a->infinity == b->infinity); if (a->infinity) { return; } CHECK(secp256k1_fe_equal_var(&a->x, &b->x)); - CHECK(secp256k1_fe_equal_var(&b->y, &b->y)); + CHECK(secp256k1_fe_equal_var(&a->y, &b->y)); } /* This compares jacobian points including their Z, not just their geometric meaning. */ -int gej_xyz_equals_gej(const secp256k1_gej_t *a, const secp256k1_gej_t *b) { - secp256k1_gej_t a2; - secp256k1_gej_t b2; +int gej_xyz_equals_gej(const secp256k1_gej *a, const secp256k1_gej *b) { + secp256k1_gej a2; + secp256k1_gej b2; int ret = 1; ret &= a->infinity == b->infinity; if (ret && !a->infinity) { @@ -939,9 +1860,9 @@ int gej_xyz_equals_gej(const secp256k1_gej_t *a, const secp256k1_gej_t *b) { return ret; } -void ge_equals_gej(const secp256k1_ge_t *a, const secp256k1_gej_t *b) { - secp256k1_fe_t z2s; - secp256k1_fe_t u1, u2, s1, s2; +void ge_equals_gej(const secp256k1_ge *a, const secp256k1_gej *b) { + secp256k1_fe z2s; + secp256k1_fe u1, u2, s1, s2; CHECK(a->infinity == b->infinity); if (a->infinity) { return; @@ -958,21 +1879,39 @@ void ge_equals_gej(const secp256k1_ge_t *a, const secp256k1_gej_t *b) { void test_ge(void) { int i, i1; +#ifdef USE_ENDOMORPHISM + int runs = 6; +#else int runs = 4; +#endif /* Points: (infinity, p1, p1, -p1, -p1, p2, p2, -p2, -p2, p3, p3, -p3, -p3, p4, p4, -p4, -p4). * The second in each pair of identical points uses a random Z coordinate in the Jacobian form. * All magnitudes are randomized. - * All 17*17 combinations of points are added to eachother, using all applicable methods. + * All 17*17 combinations of points are added to each other, using all applicable methods. + * + * When the endomorphism code is compiled in, p5 = lambda*p1 and p6 = lambda^2*p1 are added as well. */ - secp256k1_ge_t *ge = (secp256k1_ge_t *)malloc(sizeof(secp256k1_ge_t) * (1 + 4 * runs)); - secp256k1_gej_t *gej = (secp256k1_gej_t *)malloc(sizeof(secp256k1_gej_t) * (1 + 4 * runs)); + secp256k1_ge *ge = (secp256k1_ge *)checked_malloc(&ctx->error_callback, sizeof(secp256k1_ge) * (1 + 4 * runs)); + secp256k1_gej *gej = (secp256k1_gej *)checked_malloc(&ctx->error_callback, sizeof(secp256k1_gej) * (1 + 4 * runs)); + secp256k1_fe *zinv = (secp256k1_fe *)checked_malloc(&ctx->error_callback, sizeof(secp256k1_fe) * (1 + 4 * runs)); + secp256k1_fe zf; + secp256k1_fe zfi2, zfi3; + secp256k1_gej_set_infinity(&gej[0]); secp256k1_ge_clear(&ge[0]); secp256k1_ge_set_gej_var(&ge[0], &gej[0]); for (i = 0; i < runs; i++) { int j; - secp256k1_ge_t g; + secp256k1_ge g; random_group_element_test(&g); +#ifdef USE_ENDOMORPHISM + if (i >= runs - 2) { + secp256k1_ge_mul_lambda(&g, &ge[1]); + } + if (i >= runs - 1) { + secp256k1_ge_mul_lambda(&g, &g); + } +#endif ge[1 + 4 * i] = g; ge[2 + 4 * i] = g; secp256k1_ge_neg(&ge[3 + 4 * i], &g); @@ -990,18 +1929,65 @@ void test_ge(void) { } } + /* Compute z inverses. */ + { + secp256k1_fe *zs = checked_malloc(&ctx->error_callback, sizeof(secp256k1_fe) * (1 + 4 * runs)); + for (i = 0; i < 4 * runs + 1; i++) { + if (i == 0) { + /* The point at infinity does not have a meaningful z inverse. Any should do. */ + do { + random_field_element_test(&zs[i]); + } while(secp256k1_fe_is_zero(&zs[i])); + } else { + zs[i] = gej[i].z; + } + } + secp256k1_fe_inv_all_var(zinv, zs, 4 * runs + 1); + free(zs); + } + + /* Generate random zf, and zfi2 = 1/zf^2, zfi3 = 1/zf^3 */ + do { + random_field_element_test(&zf); + } while(secp256k1_fe_is_zero(&zf)); + random_field_element_magnitude(&zf); + secp256k1_fe_inv_var(&zfi3, &zf); + secp256k1_fe_sqr(&zfi2, &zfi3); + secp256k1_fe_mul(&zfi3, &zfi3, &zfi2); + for (i1 = 0; i1 < 1 + 4 * runs; i1++) { int i2; for (i2 = 0; i2 < 1 + 4 * runs; i2++) { /* Compute reference result using gej + gej (var). */ - secp256k1_gej_t refj, resj; - secp256k1_ge_t ref; - secp256k1_gej_add_var(&refj, &gej[i1], &gej[i2]); + secp256k1_gej refj, resj; + secp256k1_ge ref; + secp256k1_fe zr; + secp256k1_gej_add_var(&refj, &gej[i1], &gej[i2], secp256k1_gej_is_infinity(&gej[i1]) ? NULL : &zr); + /* Check Z ratio. */ + if (!secp256k1_gej_is_infinity(&gej[i1]) && !secp256k1_gej_is_infinity(&refj)) { + secp256k1_fe zrz; secp256k1_fe_mul(&zrz, &zr, &gej[i1].z); + CHECK(secp256k1_fe_equal_var(&zrz, &refj.z)); + } secp256k1_ge_set_gej_var(&ref, &refj); - /* Test gej + ge (var). */ - secp256k1_gej_add_ge_var(&resj, &gej[i1], &ge[i2]); + /* Test gej + ge with Z ratio result (var). */ + secp256k1_gej_add_ge_var(&resj, &gej[i1], &ge[i2], secp256k1_gej_is_infinity(&gej[i1]) ? NULL : &zr); ge_equals_gej(&ref, &resj); + if (!secp256k1_gej_is_infinity(&gej[i1]) && !secp256k1_gej_is_infinity(&resj)) { + secp256k1_fe zrz; secp256k1_fe_mul(&zrz, &zr, &gej[i1].z); + CHECK(secp256k1_fe_equal_var(&zrz, &resj.z)); + } + + /* Test gej + ge (var, with additional Z factor). */ + { + secp256k1_ge ge2_zfi = ge[i2]; /* the second term with x and y rescaled for z = 1/zf */ + secp256k1_fe_mul(&ge2_zfi.x, &ge2_zfi.x, &zfi2); + secp256k1_fe_mul(&ge2_zfi.y, &ge2_zfi.y, &zfi3); + random_field_element_magnitude(&ge2_zfi.x); + random_field_element_magnitude(&ge2_zfi.y); + secp256k1_gej_add_zinv_var(&resj, &gej[i1], &ge2_zfi, &zf); + ge_equals_gej(&ref, &resj); + } /* Test gej + ge (const). */ if (i2 != 0) { @@ -1012,10 +1998,15 @@ void test_ge(void) { /* Test doubling (var). */ if ((i1 == 0 && i2 == 0) || ((i1 + 3)/4 == (i2 + 3)/4 && ((i1 + 3)%4)/2 == ((i2 + 3)%4)/2)) { - /* Normal doubling. */ - secp256k1_gej_double_var(&resj, &gej[i1]); + secp256k1_fe zr2; + /* Normal doubling with Z ratio result. */ + secp256k1_gej_double_var(&resj, &gej[i1], &zr2); ge_equals_gej(&ref, &resj); - secp256k1_gej_double_var(&resj, &gej[i2]); + /* Check Z ratio. */ + secp256k1_fe_mul(&zr2, &zr2, &gej[i1].z); + CHECK(secp256k1_fe_equal_var(&zr2, &resj.z)); + /* Normal doubling. */ + secp256k1_gej_double_var(&resj, &gej[i2], NULL); ge_equals_gej(&ref, &resj); } @@ -1040,41 +2031,121 @@ void test_ge(void) { /* Test adding all points together in random order equals infinity. */ { - secp256k1_gej_t sum = SECP256K1_GEJ_CONST_INFINITY; - secp256k1_gej_t *gej_shuffled = (secp256k1_gej_t *)malloc((4 * runs + 1) * sizeof(secp256k1_gej_t)); + secp256k1_gej sum = SECP256K1_GEJ_CONST_INFINITY; + secp256k1_gej *gej_shuffled = (secp256k1_gej *)checked_malloc(&ctx->error_callback, (4 * runs + 1) * sizeof(secp256k1_gej)); for (i = 0; i < 4 * runs + 1; i++) { gej_shuffled[i] = gej[i]; } for (i = 0; i < 4 * runs + 1; i++) { - int swap = i + secp256k1_rand32() % (4 * runs + 1 - i); + int swap = i + secp256k1_rand_int(4 * runs + 1 - i); if (swap != i) { - secp256k1_gej_t t = gej_shuffled[i]; + secp256k1_gej t = gej_shuffled[i]; gej_shuffled[i] = gej_shuffled[swap]; gej_shuffled[swap] = t; } } for (i = 0; i < 4 * runs + 1; i++) { - secp256k1_gej_add_var(&sum, &sum, &gej_shuffled[i]); + secp256k1_gej_add_var(&sum, &sum, &gej_shuffled[i], NULL); } CHECK(secp256k1_gej_is_infinity(&sum)); free(gej_shuffled); } - /* Test batch gej -> ge conversion. */ + /* Test batch gej -> ge conversion with and without known z ratios. */ { - secp256k1_ge_t *ge_set_all = (secp256k1_ge_t *)malloc((4 * runs + 1) * sizeof(secp256k1_ge_t)); - secp256k1_ge_set_all_gej_var(4 * runs + 1, ge_set_all, gej); + secp256k1_fe *zr = (secp256k1_fe *)checked_malloc(&ctx->error_callback, (4 * runs + 1) * sizeof(secp256k1_fe)); + secp256k1_ge *ge_set_table = (secp256k1_ge *)checked_malloc(&ctx->error_callback, (4 * runs + 1) * sizeof(secp256k1_ge)); + secp256k1_ge *ge_set_all = (secp256k1_ge *)checked_malloc(&ctx->error_callback, (4 * runs + 1) * sizeof(secp256k1_ge)); for (i = 0; i < 4 * runs + 1; i++) { - secp256k1_fe_t s; + /* Compute gej[i + 1].z / gez[i].z (with gej[n].z taken to be 1). */ + if (i < 4 * runs) { + secp256k1_fe_mul(&zr[i + 1], &zinv[i], &gej[i + 1].z); + } + } + secp256k1_ge_set_table_gej_var(ge_set_table, gej, zr, 4 * runs + 1); + secp256k1_ge_set_all_gej_var(ge_set_all, gej, 4 * runs + 1, &ctx->error_callback); + for (i = 0; i < 4 * runs + 1; i++) { + secp256k1_fe s; random_fe_non_zero(&s); secp256k1_gej_rescale(&gej[i], &s); + ge_equals_gej(&ge_set_table[i], &gej[i]); ge_equals_gej(&ge_set_all[i], &gej[i]); } + free(ge_set_table); free(ge_set_all); + free(zr); } free(ge); free(gej); + free(zinv); +} + +void test_add_neg_y_diff_x(void) { + /* The point of this test is to check that we can add two points + * whose y-coordinates are negatives of each other but whose x + * coordinates differ. If the x-coordinates were the same, these + * points would be negatives of each other and their sum is + * infinity. This is cool because it "covers up" any degeneracy + * in the addition algorithm that would cause the xy coordinates + * of the sum to be wrong (since infinity has no xy coordinates). + * HOWEVER, if the x-coordinates are different, infinity is the + * wrong answer, and such degeneracies are exposed. This is the + * root of https://github.com/bitcoin-core/secp256k1/issues/257 + * which this test is a regression test for. + * + * These points were generated in sage as + * # secp256k1 params + * F = FiniteField (0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F) + * C = EllipticCurve ([F (0), F (7)]) + * G = C.lift_x(0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798) + * N = FiniteField(G.order()) + * + * # endomorphism values (lambda is 1^{1/3} in N, beta is 1^{1/3} in F) + * x = polygen(N) + * lam = (1 - x^3).roots()[1][0] + * + * # random "bad pair" + * P = C.random_element() + * Q = -int(lam) * P + * print " P: %x %x" % P.xy() + * print " Q: %x %x" % Q.xy() + * print "P + Q: %x %x" % (P + Q).xy() + */ + secp256k1_gej aj = SECP256K1_GEJ_CONST( + 0x8d24cd95, 0x0a355af1, 0x3c543505, 0x44238d30, + 0x0643d79f, 0x05a59614, 0x2f8ec030, 0xd58977cb, + 0x001e337a, 0x38093dcd, 0x6c0f386d, 0x0b1293a8, + 0x4d72c879, 0xd7681924, 0x44e6d2f3, 0x9190117d + ); + secp256k1_gej bj = SECP256K1_GEJ_CONST( + 0xc7b74206, 0x1f788cd9, 0xabd0937d, 0x164a0d86, + 0x95f6ff75, 0xf19a4ce9, 0xd013bd7b, 0xbf92d2a7, + 0xffe1cc85, 0xc7f6c232, 0x93f0c792, 0xf4ed6c57, + 0xb28d3786, 0x2897e6db, 0xbb192d0b, 0x6e6feab2 + ); + secp256k1_gej sumj = SECP256K1_GEJ_CONST( + 0x671a63c0, 0x3efdad4c, 0x389a7798, 0x24356027, + 0xb3d69010, 0x278625c3, 0x5c86d390, 0x184a8f7a, + 0x5f6409c2, 0x2ce01f2b, 0x511fd375, 0x25071d08, + 0xda651801, 0x70e95caf, 0x8f0d893c, 0xbed8fbbe + ); + secp256k1_ge b; + secp256k1_gej resj; + secp256k1_ge res; + secp256k1_ge_set_gej(&b, &bj); + + secp256k1_gej_add_var(&resj, &aj, &bj, NULL); + secp256k1_ge_set_gej(&res, &resj); + ge_equals_gej(&res, &sumj); + + secp256k1_gej_add_ge(&resj, &aj, &b); + secp256k1_ge_set_gej(&res, &resj); + ge_equals_gej(&res, &sumj); + + secp256k1_gej_add_ge_var(&resj, &aj, &b, NULL); + secp256k1_ge_set_gej(&res, &resj); + ge_equals_gej(&res, &sumj); } void run_ge(void) { @@ -1082,36 +2153,142 @@ void run_ge(void) { for (i = 0; i < count * 32; i++) { test_ge(); } + test_add_neg_y_diff_x(); +} + +void test_ec_combine(void) { + secp256k1_scalar sum = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0); + secp256k1_pubkey data[6]; + const secp256k1_pubkey* d[6]; + secp256k1_pubkey sd; + secp256k1_pubkey sd2; + secp256k1_gej Qj; + secp256k1_ge Q; + int i; + for (i = 1; i <= 6; i++) { + secp256k1_scalar s; + random_scalar_order_test(&s); + secp256k1_scalar_add(&sum, &sum, &s); + secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &Qj, &s); + secp256k1_ge_set_gej(&Q, &Qj); + secp256k1_pubkey_save(&data[i - 1], &Q); + d[i - 1] = &data[i - 1]; + secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &Qj, &sum); + secp256k1_ge_set_gej(&Q, &Qj); + secp256k1_pubkey_save(&sd, &Q); + CHECK(secp256k1_ec_pubkey_combine(ctx, &sd2, d, i) == 1); + CHECK(memcmp(&sd, &sd2, sizeof(sd)) == 0); + } +} + +void run_ec_combine(void) { + int i; + for (i = 0; i < count * 8; i++) { + test_ec_combine(); + } +} + +void test_group_decompress(const secp256k1_fe* x) { + /* The input itself, normalized. */ + secp256k1_fe fex = *x; + secp256k1_fe fez; + /* Results of set_xquad_var, set_xo_var(..., 0), set_xo_var(..., 1). */ + secp256k1_ge ge_quad, ge_even, ge_odd; + secp256k1_gej gej_quad; + /* Return values of the above calls. */ + int res_quad, res_even, res_odd; + + secp256k1_fe_normalize_var(&fex); + + res_quad = secp256k1_ge_set_xquad(&ge_quad, &fex); + res_even = secp256k1_ge_set_xo_var(&ge_even, &fex, 0); + res_odd = secp256k1_ge_set_xo_var(&ge_odd, &fex, 1); + + CHECK(res_quad == res_even); + CHECK(res_quad == res_odd); + + if (res_quad) { + secp256k1_fe_normalize_var(&ge_quad.x); + secp256k1_fe_normalize_var(&ge_odd.x); + secp256k1_fe_normalize_var(&ge_even.x); + secp256k1_fe_normalize_var(&ge_quad.y); + secp256k1_fe_normalize_var(&ge_odd.y); + secp256k1_fe_normalize_var(&ge_even.y); + + /* No infinity allowed. */ + CHECK(!ge_quad.infinity); + CHECK(!ge_even.infinity); + CHECK(!ge_odd.infinity); + + /* Check that the x coordinates check out. */ + CHECK(secp256k1_fe_equal_var(&ge_quad.x, x)); + CHECK(secp256k1_fe_equal_var(&ge_even.x, x)); + CHECK(secp256k1_fe_equal_var(&ge_odd.x, x)); + + /* Check that the Y coordinate result in ge_quad is a square. */ + CHECK(secp256k1_fe_is_quad_var(&ge_quad.y)); + + /* Check odd/even Y in ge_odd, ge_even. */ + CHECK(secp256k1_fe_is_odd(&ge_odd.y)); + CHECK(!secp256k1_fe_is_odd(&ge_even.y)); + + /* Check secp256k1_gej_has_quad_y_var. */ + secp256k1_gej_set_ge(&gej_quad, &ge_quad); + CHECK(secp256k1_gej_has_quad_y_var(&gej_quad)); + do { + random_fe_test(&fez); + } while (secp256k1_fe_is_zero(&fez)); + secp256k1_gej_rescale(&gej_quad, &fez); + CHECK(secp256k1_gej_has_quad_y_var(&gej_quad)); + secp256k1_gej_neg(&gej_quad, &gej_quad); + CHECK(!secp256k1_gej_has_quad_y_var(&gej_quad)); + do { + random_fe_test(&fez); + } while (secp256k1_fe_is_zero(&fez)); + secp256k1_gej_rescale(&gej_quad, &fez); + CHECK(!secp256k1_gej_has_quad_y_var(&gej_quad)); + secp256k1_gej_neg(&gej_quad, &gej_quad); + CHECK(secp256k1_gej_has_quad_y_var(&gej_quad)); + } +} + +void run_group_decompress(void) { + int i; + for (i = 0; i < count * 4; i++) { + secp256k1_fe fe; + random_fe_test(&fe); + test_group_decompress(&fe); + } } /***** ECMULT TESTS *****/ void run_ecmult_chain(void) { /* random starting point A (on the curve) */ - secp256k1_gej_t a = SECP256K1_GEJ_CONST( + secp256k1_gej a = SECP256K1_GEJ_CONST( 0x8b30bbe9, 0xae2a9906, 0x96b22f67, 0x0709dff3, 0x727fd8bc, 0x04d3362c, 0x6c7bf458, 0xe2846004, 0xa357ae91, 0x5c4a6528, 0x1309edf2, 0x0504740f, 0x0eb33439, 0x90216b4f, 0x81063cb6, 0x5f2f7e0f ); /* two random initial factors xn and gn */ - secp256k1_scalar_t xn = SECP256K1_SCALAR_CONST( + secp256k1_scalar xn = SECP256K1_SCALAR_CONST( 0x84cc5452, 0xf7fde1ed, 0xb4d38a8c, 0xe9b1b84c, 0xcef31f14, 0x6e569be9, 0x705d357a, 0x42985407 ); - secp256k1_scalar_t gn = SECP256K1_SCALAR_CONST( + secp256k1_scalar gn = SECP256K1_SCALAR_CONST( 0xa1e58d22, 0x553dcd42, 0xb2398062, 0x5d4c57a9, 0x6e9323d4, 0x2b3152e5, 0xca2c3990, 0xedc7c9de ); /* two small multipliers to be applied to xn and gn in every iteration: */ - static const secp256k1_scalar_t xf = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0x1337); - static const secp256k1_scalar_t gf = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0x7113); + static const secp256k1_scalar xf = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0x1337); + static const secp256k1_scalar gf = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0x7113); /* accumulators with the resulting coefficients to A and G */ - secp256k1_scalar_t ae = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1); - secp256k1_scalar_t ge = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0); + secp256k1_scalar ae = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1); + secp256k1_scalar ge = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0); /* actual points */ - secp256k1_gej_t x = a; - secp256k1_gej_t x2; + secp256k1_gej x; + secp256k1_gej x2; int i; /* the point being computed */ @@ -1131,7 +2308,7 @@ void run_ecmult_chain(void) { /* verify */ if (i == 19999) { /* expected result after 19999 iterations */ - secp256k1_gej_t rp = SECP256K1_GEJ_CONST( + secp256k1_gej rp = SECP256K1_GEJ_CONST( 0xD6E96687, 0xF9B10D09, 0x2A6F3543, 0x9D86CEBE, 0xA4535D0D, 0x409F5358, 0x6440BD74, 0xB933E830, 0xB95CBCA2, 0xC77DA786, 0x539BE8FD, 0x53354D2D, @@ -1139,30 +2316,32 @@ void run_ecmult_chain(void) { ); secp256k1_gej_neg(&rp, &rp); - secp256k1_gej_add_var(&rp, &rp, &x); + secp256k1_gej_add_var(&rp, &rp, &x, NULL); CHECK(secp256k1_gej_is_infinity(&rp)); } } /* redo the computation, but directly with the resulting ae and ge coefficients: */ secp256k1_ecmult(&ctx->ecmult_ctx, &x2, &a, &ae, &ge); secp256k1_gej_neg(&x2, &x2); - secp256k1_gej_add_var(&x2, &x2, &x); + secp256k1_gej_add_var(&x2, &x2, &x, NULL); CHECK(secp256k1_gej_is_infinity(&x2)); } -void test_point_times_order(const secp256k1_gej_t *point) { +void test_point_times_order(const secp256k1_gej *point) { /* X * (point + G) + (order-X) * (pointer + G) = 0 */ - secp256k1_scalar_t x; - secp256k1_scalar_t nx; - secp256k1_gej_t res1, res2; - secp256k1_ge_t res3; + secp256k1_scalar x; + secp256k1_scalar nx; + secp256k1_scalar zero = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0); + secp256k1_scalar one = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1); + secp256k1_gej res1, res2; + secp256k1_ge res3; unsigned char pub[65]; - int psize = 65; + size_t psize = 65; random_scalar_order_test(&x); secp256k1_scalar_negate(&nx, &x); secp256k1_ecmult(&ctx->ecmult_ctx, &res1, point, &x, &x); /* calc res1 = x * point + x * G; */ secp256k1_ecmult(&ctx->ecmult_ctx, &res2, point, &nx, &nx); /* calc res2 = (order - x) * point + (order - x) * G; */ - secp256k1_gej_add_var(&res1, &res1, &res2); + secp256k1_gej_add_var(&res1, &res1, &res2, NULL); CHECK(secp256k1_gej_is_infinity(&res1)); CHECK(secp256k1_gej_is_valid_var(&res1) == 0); secp256k1_ge_set_gej(&res3, &res1); @@ -1171,19 +2350,29 @@ void test_point_times_order(const secp256k1_gej_t *point) { CHECK(secp256k1_eckey_pubkey_serialize(&res3, pub, &psize, 0) == 0); psize = 65; CHECK(secp256k1_eckey_pubkey_serialize(&res3, pub, &psize, 1) == 0); + /* check zero/one edge cases */ + secp256k1_ecmult(&ctx->ecmult_ctx, &res1, point, &zero, &zero); + secp256k1_ge_set_gej(&res3, &res1); + CHECK(secp256k1_ge_is_infinity(&res3)); + secp256k1_ecmult(&ctx->ecmult_ctx, &res1, point, &one, &zero); + secp256k1_ge_set_gej(&res3, &res1); + ge_equals_gej(&res3, point); + secp256k1_ecmult(&ctx->ecmult_ctx, &res1, point, &zero, &one); + secp256k1_ge_set_gej(&res3, &res1); + ge_equals_ge(&res3, &secp256k1_ge_const_g); } void run_point_times_order(void) { int i; - secp256k1_fe_t x = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 2); - static const secp256k1_fe_t xr = SECP256K1_FE_CONST( + secp256k1_fe x = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 2); + static const secp256k1_fe xr = SECP256K1_FE_CONST( 0x7603CB59, 0xB0EF6C63, 0xFE608479, 0x2A0C378C, 0xDB3233A8, 0x0F8A9A09, 0xA877DEAD, 0x31B38C45 ); for (i = 0; i < 500; i++) { - secp256k1_ge_t p; + secp256k1_ge p; if (secp256k1_ge_set_xo_var(&p, &x, 1)) { - secp256k1_gej_t j; + secp256k1_gej j; CHECK(secp256k1_ge_is_valid_var(&p)); secp256k1_gej_set_ge(&j, &p); CHECK(secp256k1_gej_is_valid_var(&j)); @@ -1195,15 +2384,118 @@ void run_point_times_order(void) { CHECK(secp256k1_fe_equal_var(&x, &xr)); } -void test_wnaf(const secp256k1_scalar_t *number, int w) { - secp256k1_scalar_t x, two, t; +void ecmult_const_random_mult(void) { + /* random starting point A (on the curve) */ + secp256k1_ge a = SECP256K1_GE_CONST( + 0x6d986544, 0x57ff52b8, 0xcf1b8126, 0x5b802a5b, + 0xa97f9263, 0xb1e88044, 0x93351325, 0x91bc450a, + 0x535c59f7, 0x325e5d2b, 0xc391fbe8, 0x3c12787c, + 0x337e4a98, 0xe82a9011, 0x0123ba37, 0xdd769c7d + ); + /* random initial factor xn */ + secp256k1_scalar xn = SECP256K1_SCALAR_CONST( + 0x649d4f77, 0xc4242df7, 0x7f2079c9, 0x14530327, + 0xa31b876a, 0xd2d8ce2a, 0x2236d5c6, 0xd7b2029b + ); + /* expected xn * A (from sage) */ + secp256k1_ge expected_b = SECP256K1_GE_CONST( + 0x23773684, 0x4d209dc7, 0x098a786f, 0x20d06fcd, + 0x070a38bf, 0xc11ac651, 0x03004319, 0x1e2a8786, + 0xed8c3b8e, 0xc06dd57b, 0xd06ea66e, 0x45492b0f, + 0xb84e4e1b, 0xfb77e21f, 0x96baae2a, 0x63dec956 + ); + secp256k1_gej b; + secp256k1_ecmult_const(&b, &a, &xn); + + CHECK(secp256k1_ge_is_valid_var(&a)); + ge_equals_gej(&expected_b, &b); +} + +void ecmult_const_commutativity(void) { + secp256k1_scalar a; + secp256k1_scalar b; + secp256k1_gej res1; + secp256k1_gej res2; + secp256k1_ge mid1; + secp256k1_ge mid2; + random_scalar_order_test(&a); + random_scalar_order_test(&b); + + secp256k1_ecmult_const(&res1, &secp256k1_ge_const_g, &a); + secp256k1_ecmult_const(&res2, &secp256k1_ge_const_g, &b); + secp256k1_ge_set_gej(&mid1, &res1); + secp256k1_ge_set_gej(&mid2, &res2); + secp256k1_ecmult_const(&res1, &mid1, &b); + secp256k1_ecmult_const(&res2, &mid2, &a); + secp256k1_ge_set_gej(&mid1, &res1); + secp256k1_ge_set_gej(&mid2, &res2); + ge_equals_ge(&mid1, &mid2); +} + +void ecmult_const_mult_zero_one(void) { + secp256k1_scalar zero = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0); + secp256k1_scalar one = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1); + secp256k1_scalar negone; + secp256k1_gej res1; + secp256k1_ge res2; + secp256k1_ge point; + secp256k1_scalar_negate(&negone, &one); + + random_group_element_test(&point); + secp256k1_ecmult_const(&res1, &point, &zero); + secp256k1_ge_set_gej(&res2, &res1); + CHECK(secp256k1_ge_is_infinity(&res2)); + secp256k1_ecmult_const(&res1, &point, &one); + secp256k1_ge_set_gej(&res2, &res1); + ge_equals_ge(&res2, &point); + secp256k1_ecmult_const(&res1, &point, &negone); + secp256k1_gej_neg(&res1, &res1); + secp256k1_ge_set_gej(&res2, &res1); + ge_equals_ge(&res2, &point); +} + +void ecmult_const_chain_multiply(void) { + /* Check known result (randomly generated test problem from sage) */ + const secp256k1_scalar scalar = SECP256K1_SCALAR_CONST( + 0x4968d524, 0x2abf9b7a, 0x466abbcf, 0x34b11b6d, + 0xcd83d307, 0x827bed62, 0x05fad0ce, 0x18fae63b + ); + const secp256k1_gej expected_point = SECP256K1_GEJ_CONST( + 0x5494c15d, 0x32099706, 0xc2395f94, 0x348745fd, + 0x757ce30e, 0x4e8c90fb, 0xa2bad184, 0xf883c69f, + 0x5d195d20, 0xe191bf7f, 0x1be3e55f, 0x56a80196, + 0x6071ad01, 0xf1462f66, 0xc997fa94, 0xdb858435 + ); + secp256k1_gej point; + secp256k1_ge res; + int i; + + secp256k1_gej_set_ge(&point, &secp256k1_ge_const_g); + for (i = 0; i < 100; ++i) { + secp256k1_ge tmp; + secp256k1_ge_set_gej(&tmp, &point); + secp256k1_ecmult_const(&point, &tmp, &scalar); + } + secp256k1_ge_set_gej(&res, &point); + ge_equals_gej(&res, &expected_point); +} + +void run_ecmult_const_tests(void) { + ecmult_const_mult_zero_one(); + ecmult_const_random_mult(); + ecmult_const_commutativity(); + ecmult_const_chain_multiply(); +} + +void test_wnaf(const secp256k1_scalar *number, int w) { + secp256k1_scalar x, two, t; int wnaf[256]; int zeroes = -1; int i; int bits; secp256k1_scalar_set_int(&x, 0); secp256k1_scalar_set_int(&two, 2); - bits = secp256k1_ecmult_wnaf(wnaf, number, w); + bits = secp256k1_ecmult_wnaf(wnaf, 256, number, w); CHECK(bits <= 256); for (i = bits-1; i >= 0; i--) { int v = wnaf[i]; @@ -1229,20 +2521,89 @@ void test_wnaf(const secp256k1_scalar_t *number, int w) { CHECK(secp256k1_scalar_eq(&x, number)); /* check that wnaf represents number */ } +void test_constant_wnaf_negate(const secp256k1_scalar *number) { + secp256k1_scalar neg1 = *number; + secp256k1_scalar neg2 = *number; + int sign1 = 1; + int sign2 = 1; + + if (!secp256k1_scalar_get_bits(&neg1, 0, 1)) { + secp256k1_scalar_negate(&neg1, &neg1); + sign1 = -1; + } + sign2 = secp256k1_scalar_cond_negate(&neg2, secp256k1_scalar_is_even(&neg2)); + CHECK(sign1 == sign2); + CHECK(secp256k1_scalar_eq(&neg1, &neg2)); +} + +void test_constant_wnaf(const secp256k1_scalar *number, int w) { + secp256k1_scalar x, shift; + int wnaf[256] = {0}; + int i; + int skew; + secp256k1_scalar num = *number; + + secp256k1_scalar_set_int(&x, 0); + secp256k1_scalar_set_int(&shift, 1 << w); + /* With USE_ENDOMORPHISM on we only consider 128-bit numbers */ +#ifdef USE_ENDOMORPHISM + for (i = 0; i < 16; ++i) { + secp256k1_scalar_shr_int(&num, 8); + } +#endif + skew = secp256k1_wnaf_const(wnaf, num, w); + + for (i = WNAF_SIZE(w); i >= 0; --i) { + secp256k1_scalar t; + int v = wnaf[i]; + CHECK(v != 0); /* check nonzero */ + CHECK(v & 1); /* check parity */ + CHECK(v > -(1 << w)); /* check range above */ + CHECK(v < (1 << w)); /* check range below */ + + secp256k1_scalar_mul(&x, &x, &shift); + if (v >= 0) { + secp256k1_scalar_set_int(&t, v); + } else { + secp256k1_scalar_set_int(&t, -v); + secp256k1_scalar_negate(&t, &t); + } + secp256k1_scalar_add(&x, &x, &t); + } + /* Skew num because when encoding numbers as odd we use an offset */ + secp256k1_scalar_cadd_bit(&num, skew == 2, 1); + CHECK(secp256k1_scalar_eq(&x, &num)); +} + void run_wnaf(void) { int i; - secp256k1_scalar_t n; + secp256k1_scalar n = {{0}}; + + /* Sanity check: 1 and 2 are the smallest odd and even numbers and should + * have easier-to-diagnose failure modes */ + n.d[0] = 1; + test_constant_wnaf(&n, 4); + n.d[0] = 2; + test_constant_wnaf(&n, 4); + /* Random tests */ for (i = 0; i < count; i++) { random_scalar_order(&n); test_wnaf(&n, 4+(i%10)); + test_constant_wnaf_negate(&n); + test_constant_wnaf(&n, 4 + (i % 10)); } + secp256k1_scalar_set_int(&n, 0); + CHECK(secp256k1_scalar_cond_negate(&n, 1) == -1); + CHECK(secp256k1_scalar_is_zero(&n)); + CHECK(secp256k1_scalar_cond_negate(&n, 0) == 1); + CHECK(secp256k1_scalar_is_zero(&n)); } void test_ecmult_constants(void) { /* Test ecmult_gen() for [0..36) and [order-36..0). */ - secp256k1_scalar_t x; - secp256k1_gej_t r; - secp256k1_ge_t ng; + secp256k1_scalar x; + secp256k1_gej r; + secp256k1_ge ng; int i; int j; secp256k1_ge_neg(&ng, &secp256k1_ge_const_g); @@ -1276,14 +2637,14 @@ void run_ecmult_constants(void) { } void test_ecmult_gen_blind(void) { - /* Test ecmult_gen() blinding and confirm that the blinding changes, the affline points match, and the z's don't match. */ - secp256k1_scalar_t key; - secp256k1_scalar_t b; + /* Test ecmult_gen() blinding and confirm that the blinding changes, the affine points match, and the z's don't match. */ + secp256k1_scalar key; + secp256k1_scalar b; unsigned char seed32[32]; - secp256k1_gej_t pgej; - secp256k1_gej_t pgej2; - secp256k1_gej_t i; - secp256k1_ge_t pge; + secp256k1_gej pgej; + secp256k1_gej pgej2; + secp256k1_gej i; + secp256k1_ge pge; random_scalar_order_test(&key); secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pgej, &key); secp256k1_rand256(seed32); @@ -1300,8 +2661,8 @@ void test_ecmult_gen_blind(void) { void test_ecmult_gen_blind_reset(void) { /* Test ecmult_gen() blinding reset and confirm that the blinding is consistent. */ - secp256k1_scalar_t b; - secp256k1_gej_t initial; + secp256k1_scalar b; + secp256k1_gej initial; secp256k1_ecmult_gen_blind(&ctx->ecmult_gen_ctx, 0); b = ctx->ecmult_gen_ctx.blind; initial = ctx->ecmult_gen_ctx.initial; @@ -1318,35 +2679,702 @@ void run_ecmult_gen_blind(void) { } } +#ifdef USE_ENDOMORPHISM +/***** ENDOMORPHISH TESTS *****/ +void test_scalar_split(void) { + secp256k1_scalar full; + secp256k1_scalar s1, slam; + const unsigned char zero[32] = {0}; + unsigned char tmp[32]; -void random_sign(secp256k1_ecdsa_sig_t *sig, const secp256k1_scalar_t *key, const secp256k1_scalar_t *msg, int *recid) { - secp256k1_scalar_t nonce; + random_scalar_order_test(&full); + secp256k1_scalar_split_lambda(&s1, &slam, &full); + + /* check that both are <= 128 bits in size */ + if (secp256k1_scalar_is_high(&s1)) { + secp256k1_scalar_negate(&s1, &s1); + } + if (secp256k1_scalar_is_high(&slam)) { + secp256k1_scalar_negate(&slam, &slam); + } + + secp256k1_scalar_get_b32(tmp, &s1); + CHECK(memcmp(zero, tmp, 16) == 0); + secp256k1_scalar_get_b32(tmp, &slam); + CHECK(memcmp(zero, tmp, 16) == 0); +} + +void run_endomorphism_tests(void) { + test_scalar_split(); +} +#endif + +void ec_pubkey_parse_pointtest(const unsigned char *input, int xvalid, int yvalid) { + unsigned char pubkeyc[65]; + secp256k1_pubkey pubkey; + secp256k1_ge ge; + size_t pubkeyclen; + int32_t ecount; + ecount = 0; + secp256k1_context_set_illegal_callback(ctx, counting_illegal_callback_fn, &ecount); + for (pubkeyclen = 3; pubkeyclen <= 65; pubkeyclen++) { + /* Smaller sizes are tested exhaustively elsewhere. */ + int32_t i; + memcpy(&pubkeyc[1], input, 64); + VG_UNDEF(&pubkeyc[pubkeyclen], 65 - pubkeyclen); + for (i = 0; i < 256; i++) { + /* Try all type bytes. */ + int xpass; + int ypass; + int ysign; + pubkeyc[0] = i; + /* What sign does this point have? */ + ysign = (input[63] & 1) + 2; + /* For the current type (i) do we expect parsing to work? Handled all of compressed/uncompressed/hybrid. */ + xpass = xvalid && (pubkeyclen == 33) && ((i & 254) == 2); + /* Do we expect a parse and re-serialize as uncompressed to give a matching y? */ + ypass = xvalid && yvalid && ((i & 4) == ((pubkeyclen == 65) << 2)) && + ((i == 4) || ((i & 251) == ysign)) && ((pubkeyclen == 33) || (pubkeyclen == 65)); + if (xpass || ypass) { + /* These cases must parse. */ + unsigned char pubkeyo[65]; + size_t outl; + memset(&pubkey, 0, sizeof(pubkey)); + VG_UNDEF(&pubkey, sizeof(pubkey)); + ecount = 0; + CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, pubkeyclen) == 1); + VG_CHECK(&pubkey, sizeof(pubkey)); + outl = 65; + VG_UNDEF(pubkeyo, 65); + CHECK(secp256k1_ec_pubkey_serialize(ctx, pubkeyo, &outl, &pubkey, SECP256K1_EC_COMPRESSED) == 1); + VG_CHECK(pubkeyo, outl); + CHECK(outl == 33); + CHECK(memcmp(&pubkeyo[1], &pubkeyc[1], 32) == 0); + CHECK((pubkeyclen != 33) || (pubkeyo[0] == pubkeyc[0])); + if (ypass) { + /* This test isn't always done because we decode with alternative signs, so the y won't match. */ + CHECK(pubkeyo[0] == ysign); + CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 1); + memset(&pubkey, 0, sizeof(pubkey)); + VG_UNDEF(&pubkey, sizeof(pubkey)); + secp256k1_pubkey_save(&pubkey, &ge); + VG_CHECK(&pubkey, sizeof(pubkey)); + outl = 65; + VG_UNDEF(pubkeyo, 65); + CHECK(secp256k1_ec_pubkey_serialize(ctx, pubkeyo, &outl, &pubkey, SECP256K1_EC_UNCOMPRESSED) == 1); + VG_CHECK(pubkeyo, outl); + CHECK(outl == 65); + CHECK(pubkeyo[0] == 4); + CHECK(memcmp(&pubkeyo[1], input, 64) == 0); + } + CHECK(ecount == 0); + } else { + /* These cases must fail to parse. */ + memset(&pubkey, 0xfe, sizeof(pubkey)); + ecount = 0; + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, pubkeyclen) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(ecount == 0); + CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); + CHECK(ecount == 1); + } + } + } + secp256k1_context_set_illegal_callback(ctx, NULL, NULL); +} + +void run_ec_pubkey_parse_test(void) { +#define SECP256K1_EC_PARSE_TEST_NVALID (12) + const unsigned char valid[SECP256K1_EC_PARSE_TEST_NVALID][64] = { + { + /* Point with leading and trailing zeros in x and y serialization. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x52, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x64, 0xef, 0xa1, 0x7b, 0x77, 0x61, 0xe1, 0xe4, 0x27, 0x06, 0x98, 0x9f, 0xb4, 0x83, + 0xb8, 0xd2, 0xd4, 0x9b, 0xf7, 0x8f, 0xae, 0x98, 0x03, 0xf0, 0x99, 0xb8, 0x34, 0xed, 0xeb, 0x00 + }, + { + /* Point with x equal to a 3rd root of unity.*/ + 0x7a, 0xe9, 0x6a, 0x2b, 0x65, 0x7c, 0x07, 0x10, 0x6e, 0x64, 0x47, 0x9e, 0xac, 0x34, 0x34, 0xe9, + 0x9c, 0xf0, 0x49, 0x75, 0x12, 0xf5, 0x89, 0x95, 0xc1, 0x39, 0x6c, 0x28, 0x71, 0x95, 0x01, 0xee, + 0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14, + 0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee, + }, + { + /* Point with largest x. (1/2) */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2c, + 0x0e, 0x99, 0x4b, 0x14, 0xea, 0x72, 0xf8, 0xc3, 0xeb, 0x95, 0xc7, 0x1e, 0xf6, 0x92, 0x57, 0x5e, + 0x77, 0x50, 0x58, 0x33, 0x2d, 0x7e, 0x52, 0xd0, 0x99, 0x5c, 0xf8, 0x03, 0x88, 0x71, 0xb6, 0x7d, + }, + { + /* Point with largest x. (2/2) */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2c, + 0xf1, 0x66, 0xb4, 0xeb, 0x15, 0x8d, 0x07, 0x3c, 0x14, 0x6a, 0x38, 0xe1, 0x09, 0x6d, 0xa8, 0xa1, + 0x88, 0xaf, 0xa7, 0xcc, 0xd2, 0x81, 0xad, 0x2f, 0x66, 0xa3, 0x07, 0xfb, 0x77, 0x8e, 0x45, 0xb2, + }, + { + /* Point with smallest x. (1/2) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14, + 0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee, + }, + { + /* Point with smallest x. (2/2) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0xbd, 0xe7, 0x0d, 0xf5, 0x19, 0x39, 0xb9, 0x4c, 0x9c, 0x24, 0x97, 0x9f, 0xa7, 0xdd, 0x04, 0xeb, + 0xd9, 0xb3, 0x57, 0x2d, 0xa7, 0x80, 0x22, 0x90, 0x43, 0x8a, 0xf2, 0xa6, 0x81, 0x89, 0x54, 0x41, + }, + { + /* Point with largest y. (1/3) */ + 0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6, + 0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e, + }, + { + /* Point with largest y. (2/3) */ + 0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c, + 0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e, + }, + { + /* Point with largest y. (3/3) */ + 0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc, + 0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e, + }, + { + /* Point with smallest y. (1/3) */ + 0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6, + 0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + }, + { + /* Point with smallest y. (2/3) */ + 0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c, + 0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + }, + { + /* Point with smallest y. (3/3) */ + 0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc, + 0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 + } + }; +#define SECP256K1_EC_PARSE_TEST_NXVALID (4) + const unsigned char onlyxvalid[SECP256K1_EC_PARSE_TEST_NXVALID][64] = { + { + /* Valid if y overflow ignored (y = 1 mod p). (1/3) */ + 0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6, + 0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30, + }, + { + /* Valid if y overflow ignored (y = 1 mod p). (2/3) */ + 0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c, + 0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30, + }, + { + /* Valid if y overflow ignored (y = 1 mod p). (3/3)*/ + 0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc, + 0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30, + }, + { + /* x on curve, y is from y^2 = x^3 + 8. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03 + } + }; +#define SECP256K1_EC_PARSE_TEST_NINVALID (7) + const unsigned char invalid[SECP256K1_EC_PARSE_TEST_NINVALID][64] = { + { + /* x is third root of -8, y is -1 * (x^3+7); also on the curve for y^2 = x^3 + 9. */ + 0x0a, 0x2d, 0x2b, 0xa9, 0x35, 0x07, 0xf1, 0xdf, 0x23, 0x37, 0x70, 0xc2, 0xa7, 0x97, 0x96, 0x2c, + 0xc6, 0x1f, 0x6d, 0x15, 0xda, 0x14, 0xec, 0xd4, 0x7d, 0x8d, 0x27, 0xae, 0x1c, 0xd5, 0xf8, 0x53, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + }, + { + /* Valid if x overflow ignored (x = 1 mod p). */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30, + 0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14, + 0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee, + }, + { + /* Valid if x overflow ignored (x = 1 mod p). */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30, + 0xbd, 0xe7, 0x0d, 0xf5, 0x19, 0x39, 0xb9, 0x4c, 0x9c, 0x24, 0x97, 0x9f, 0xa7, 0xdd, 0x04, 0xeb, + 0xd9, 0xb3, 0x57, 0x2d, 0xa7, 0x80, 0x22, 0x90, 0x43, 0x8a, 0xf2, 0xa6, 0x81, 0x89, 0x54, 0x41, + }, + { + /* x is -1, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 5. */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e, + 0xf4, 0x84, 0x14, 0x5c, 0xb0, 0x14, 0x9b, 0x82, 0x5d, 0xff, 0x41, 0x2f, 0xa0, 0x52, 0xa8, 0x3f, + 0xcb, 0x72, 0xdb, 0x61, 0xd5, 0x6f, 0x37, 0x70, 0xce, 0x06, 0x6b, 0x73, 0x49, 0xa2, 0xaa, 0x28, + }, + { + /* x is -1, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 5. */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e, + 0x0b, 0x7b, 0xeb, 0xa3, 0x4f, 0xeb, 0x64, 0x7d, 0xa2, 0x00, 0xbe, 0xd0, 0x5f, 0xad, 0x57, 0xc0, + 0x34, 0x8d, 0x24, 0x9e, 0x2a, 0x90, 0xc8, 0x8f, 0x31, 0xf9, 0x94, 0x8b, 0xb6, 0x5d, 0x52, 0x07, + }, + { + /* x is zero, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 7. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8f, 0x53, 0x7e, 0xef, 0xdf, 0xc1, 0x60, 0x6a, 0x07, 0x27, 0xcd, 0x69, 0xb4, 0xa7, 0x33, 0x3d, + 0x38, 0xed, 0x44, 0xe3, 0x93, 0x2a, 0x71, 0x79, 0xee, 0xcb, 0x4b, 0x6f, 0xba, 0x93, 0x60, 0xdc, + }, + { + /* x is zero, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 7. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0xac, 0x81, 0x10, 0x20, 0x3e, 0x9f, 0x95, 0xf8, 0xd8, 0x32, 0x96, 0x4b, 0x58, 0xcc, 0xc2, + 0xc7, 0x12, 0xbb, 0x1c, 0x6c, 0xd5, 0x8e, 0x86, 0x11, 0x34, 0xb4, 0x8f, 0x45, 0x6c, 0x9b, 0x53 + } + }; + const unsigned char pubkeyc[66] = { + /* Serialization of G. */ + 0x04, 0x79, 0xBE, 0x66, 0x7E, 0xF9, 0xDC, 0xBB, 0xAC, 0x55, 0xA0, 0x62, 0x95, 0xCE, 0x87, 0x0B, + 0x07, 0x02, 0x9B, 0xFC, 0xDB, 0x2D, 0xCE, 0x28, 0xD9, 0x59, 0xF2, 0x81, 0x5B, 0x16, 0xF8, 0x17, + 0x98, 0x48, 0x3A, 0xDA, 0x77, 0x26, 0xA3, 0xC4, 0x65, 0x5D, 0xA4, 0xFB, 0xFC, 0x0E, 0x11, 0x08, + 0xA8, 0xFD, 0x17, 0xB4, 0x48, 0xA6, 0x85, 0x54, 0x19, 0x9C, 0x47, 0xD0, 0x8F, 0xFB, 0x10, 0xD4, + 0xB8, 0x00 + }; + unsigned char sout[65]; + unsigned char shortkey[2]; + secp256k1_ge ge; + secp256k1_pubkey pubkey; + size_t len; + int32_t i; + int32_t ecount; + int32_t ecount2; + ecount = 0; + /* Nothing should be reading this far into pubkeyc. */ + VG_UNDEF(&pubkeyc[65], 1); + secp256k1_context_set_illegal_callback(ctx, counting_illegal_callback_fn, &ecount); + /* Zero length claimed, fail, zeroize, no illegal arg error. */ + memset(&pubkey, 0xfe, sizeof(pubkey)); + ecount = 0; + VG_UNDEF(shortkey, 2); + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, shortkey, 0) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(ecount == 0); + CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); + CHECK(ecount == 1); + /* Length one claimed, fail, zeroize, no illegal arg error. */ + for (i = 0; i < 256 ; i++) { + memset(&pubkey, 0xfe, sizeof(pubkey)); + ecount = 0; + shortkey[0] = i; + VG_UNDEF(&shortkey[1], 1); + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, shortkey, 1) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(ecount == 0); + CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); + CHECK(ecount == 1); + } + /* Length two claimed, fail, zeroize, no illegal arg error. */ + for (i = 0; i < 65536 ; i++) { + memset(&pubkey, 0xfe, sizeof(pubkey)); + ecount = 0; + shortkey[0] = i & 255; + shortkey[1] = i >> 8; + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, shortkey, 2) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(ecount == 0); + CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); + CHECK(ecount == 1); + } + memset(&pubkey, 0xfe, sizeof(pubkey)); + ecount = 0; + VG_UNDEF(&pubkey, sizeof(pubkey)); + /* 33 bytes claimed on otherwise valid input starting with 0x04, fail, zeroize output, no illegal arg error. */ + CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, 33) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(ecount == 0); + CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); + CHECK(ecount == 1); + /* NULL pubkey, illegal arg error. Pubkey isn't rewritten before this step, since it's NULL into the parser. */ + CHECK(secp256k1_ec_pubkey_parse(ctx, NULL, pubkeyc, 65) == 0); + CHECK(ecount == 2); + /* NULL input string. Illegal arg and zeroize output. */ + memset(&pubkey, 0xfe, sizeof(pubkey)); + ecount = 0; + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, NULL, 65) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(ecount == 1); + CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); + CHECK(ecount == 2); + /* 64 bytes claimed on input starting with 0x04, fail, zeroize output, no illegal arg error. */ + memset(&pubkey, 0xfe, sizeof(pubkey)); + ecount = 0; + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, 64) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(ecount == 0); + CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); + CHECK(ecount == 1); + /* 66 bytes claimed, fail, zeroize output, no illegal arg error. */ + memset(&pubkey, 0xfe, sizeof(pubkey)); + ecount = 0; + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, 66) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(ecount == 0); + CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); + CHECK(ecount == 1); + /* Valid parse. */ + memset(&pubkey, 0, sizeof(pubkey)); + ecount = 0; + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, 65) == 1); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(ecount == 0); + VG_UNDEF(&ge, sizeof(ge)); + CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 1); + VG_CHECK(&ge.x, sizeof(ge.x)); + VG_CHECK(&ge.y, sizeof(ge.y)); + VG_CHECK(&ge.infinity, sizeof(ge.infinity)); + ge_equals_ge(&secp256k1_ge_const_g, &ge); + CHECK(ecount == 0); + /* secp256k1_ec_pubkey_serialize illegal args. */ + ecount = 0; + len = 65; + CHECK(secp256k1_ec_pubkey_serialize(ctx, NULL, &len, &pubkey, SECP256K1_EC_UNCOMPRESSED) == 0); + CHECK(ecount == 1); + CHECK(len == 0); + CHECK(secp256k1_ec_pubkey_serialize(ctx, sout, NULL, &pubkey, SECP256K1_EC_UNCOMPRESSED) == 0); + CHECK(ecount == 2); + len = 65; + VG_UNDEF(sout, 65); + CHECK(secp256k1_ec_pubkey_serialize(ctx, sout, &len, NULL, SECP256K1_EC_UNCOMPRESSED) == 0); + VG_CHECK(sout, 65); + CHECK(ecount == 3); + CHECK(len == 0); + len = 65; + CHECK(secp256k1_ec_pubkey_serialize(ctx, sout, &len, &pubkey, ~0) == 0); + CHECK(ecount == 4); + CHECK(len == 0); + len = 65; + VG_UNDEF(sout, 65); + CHECK(secp256k1_ec_pubkey_serialize(ctx, sout, &len, &pubkey, SECP256K1_EC_UNCOMPRESSED) == 1); + VG_CHECK(sout, 65); + CHECK(ecount == 4); + CHECK(len == 65); + /* Multiple illegal args. Should still set arg error only once. */ + ecount = 0; + ecount2 = 11; + CHECK(secp256k1_ec_pubkey_parse(ctx, NULL, NULL, 65) == 0); + CHECK(ecount == 1); + /* Does the illegal arg callback actually change the behavior? */ + secp256k1_context_set_illegal_callback(ctx, uncounting_illegal_callback_fn, &ecount2); + CHECK(secp256k1_ec_pubkey_parse(ctx, NULL, NULL, 65) == 0); + CHECK(ecount == 1); + CHECK(ecount2 == 10); + secp256k1_context_set_illegal_callback(ctx, NULL, NULL); + /* Try a bunch of prefabbed points with all possible encodings. */ + for (i = 0; i < SECP256K1_EC_PARSE_TEST_NVALID; i++) { + ec_pubkey_parse_pointtest(valid[i], 1, 1); + } + for (i = 0; i < SECP256K1_EC_PARSE_TEST_NXVALID; i++) { + ec_pubkey_parse_pointtest(onlyxvalid[i], 1, 0); + } + for (i = 0; i < SECP256K1_EC_PARSE_TEST_NINVALID; i++) { + ec_pubkey_parse_pointtest(invalid[i], 0, 0); + } +} + +void run_eckey_edge_case_test(void) { + const unsigned char orderc[32] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, + 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41 + }; + const unsigned char zeros[sizeof(secp256k1_pubkey)] = {0x00}; + unsigned char ctmp[33]; + unsigned char ctmp2[33]; + secp256k1_pubkey pubkey; + secp256k1_pubkey pubkey2; + secp256k1_pubkey pubkey_one; + secp256k1_pubkey pubkey_negone; + const secp256k1_pubkey *pubkeys[3]; + size_t len; + int32_t ecount; + /* Group order is too large, reject. */ + CHECK(secp256k1_ec_seckey_verify(ctx, orderc) == 0); + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, orderc) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); + /* Maximum value is too large, reject. */ + memset(ctmp, 255, 32); + CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 0); + memset(&pubkey, 1, sizeof(pubkey)); + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, ctmp) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); + /* Zero is too small, reject. */ + memset(ctmp, 0, 32); + CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 0); + memset(&pubkey, 1, sizeof(pubkey)); + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, ctmp) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); + /* One must be accepted. */ + ctmp[31] = 0x01; + CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 1); + memset(&pubkey, 0, sizeof(pubkey)); + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, ctmp) == 1); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0); + pubkey_one = pubkey; + /* Group order + 1 is too large, reject. */ + memcpy(ctmp, orderc, 32); + ctmp[31] = 0x42; + CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 0); + memset(&pubkey, 1, sizeof(pubkey)); + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, ctmp) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); + /* -1 must be accepted. */ + ctmp[31] = 0x40; + CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 1); + memset(&pubkey, 0, sizeof(pubkey)); + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, ctmp) == 1); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0); + pubkey_negone = pubkey; + /* Tweak of zero leaves the value changed. */ + memset(ctmp2, 0, 32); + CHECK(secp256k1_ec_privkey_tweak_add(ctx, ctmp, ctmp2) == 1); + CHECK(memcmp(orderc, ctmp, 31) == 0 && ctmp[31] == 0x40); + memcpy(&pubkey2, &pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, ctmp2) == 1); + CHECK(memcmp(&pubkey, &pubkey2, sizeof(pubkey)) == 0); + /* Multiply tweak of zero zeroizes the output. */ + CHECK(secp256k1_ec_privkey_tweak_mul(ctx, ctmp, ctmp2) == 0); + CHECK(memcmp(zeros, ctmp, 32) == 0); + CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, ctmp2) == 0); + CHECK(memcmp(&pubkey, zeros, sizeof(pubkey)) == 0); + memcpy(&pubkey, &pubkey2, sizeof(pubkey)); + /* Overflowing key tweak zeroizes. */ + memcpy(ctmp, orderc, 32); + ctmp[31] = 0x40; + CHECK(secp256k1_ec_privkey_tweak_add(ctx, ctmp, orderc) == 0); + CHECK(memcmp(zeros, ctmp, 32) == 0); + memcpy(ctmp, orderc, 32); + ctmp[31] = 0x40; + CHECK(secp256k1_ec_privkey_tweak_mul(ctx, ctmp, orderc) == 0); + CHECK(memcmp(zeros, ctmp, 32) == 0); + memcpy(ctmp, orderc, 32); + ctmp[31] = 0x40; + CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, orderc) == 0); + CHECK(memcmp(&pubkey, zeros, sizeof(pubkey)) == 0); + memcpy(&pubkey, &pubkey2, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, orderc) == 0); + CHECK(memcmp(&pubkey, zeros, sizeof(pubkey)) == 0); + memcpy(&pubkey, &pubkey2, sizeof(pubkey)); + /* Private key tweaks results in a key of zero. */ + ctmp2[31] = 1; + CHECK(secp256k1_ec_privkey_tweak_add(ctx, ctmp2, ctmp) == 0); + CHECK(memcmp(zeros, ctmp2, 32) == 0); + ctmp2[31] = 1; + CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, ctmp2) == 0); + CHECK(memcmp(&pubkey, zeros, sizeof(pubkey)) == 0); + memcpy(&pubkey, &pubkey2, sizeof(pubkey)); + /* Tweak computation wraps and results in a key of 1. */ + ctmp2[31] = 2; + CHECK(secp256k1_ec_privkey_tweak_add(ctx, ctmp2, ctmp) == 1); + CHECK(memcmp(ctmp2, zeros, 31) == 0 && ctmp2[31] == 1); + ctmp2[31] = 2; + CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, ctmp2) == 1); + ctmp2[31] = 1; + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey2, ctmp2) == 1); + CHECK(memcmp(&pubkey, &pubkey2, sizeof(pubkey)) == 0); + /* Tweak mul * 2 = 1+1. */ + CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, ctmp2) == 1); + ctmp2[31] = 2; + CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey2, ctmp2) == 1); + CHECK(memcmp(&pubkey, &pubkey2, sizeof(pubkey)) == 0); + /* Test argument errors. */ + ecount = 0; + secp256k1_context_set_illegal_callback(ctx, counting_illegal_callback_fn, &ecount); + CHECK(ecount == 0); + /* Zeroize pubkey on parse error. */ + memset(&pubkey, 0, 32); + CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, ctmp2) == 0); + CHECK(ecount == 1); + CHECK(memcmp(&pubkey, zeros, sizeof(pubkey)) == 0); + memcpy(&pubkey, &pubkey2, sizeof(pubkey)); + memset(&pubkey2, 0, 32); + CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey2, ctmp2) == 0); + CHECK(ecount == 2); + CHECK(memcmp(&pubkey2, zeros, sizeof(pubkey2)) == 0); + /* Plain argument errors. */ + ecount = 0; + CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 1); + CHECK(ecount == 0); + CHECK(secp256k1_ec_seckey_verify(ctx, NULL) == 0); + CHECK(ecount == 1); + ecount = 0; + memset(ctmp2, 0, 32); + ctmp2[31] = 4; + CHECK(secp256k1_ec_pubkey_tweak_add(ctx, NULL, ctmp2) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, NULL) == 0); + CHECK(ecount == 2); + ecount = 0; + memset(ctmp2, 0, 32); + ctmp2[31] = 4; + CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, NULL, ctmp2) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, NULL) == 0); + CHECK(ecount == 2); + ecount = 0; + memset(ctmp2, 0, 32); + CHECK(secp256k1_ec_privkey_tweak_add(ctx, NULL, ctmp2) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ec_privkey_tweak_add(ctx, ctmp, NULL) == 0); + CHECK(ecount == 2); + ecount = 0; + memset(ctmp2, 0, 32); + ctmp2[31] = 1; + CHECK(secp256k1_ec_privkey_tweak_mul(ctx, NULL, ctmp2) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ec_privkey_tweak_mul(ctx, ctmp, NULL) == 0); + CHECK(ecount == 2); + ecount = 0; + CHECK(secp256k1_ec_pubkey_create(ctx, NULL, ctmp) == 0); + CHECK(ecount == 1); + memset(&pubkey, 1, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, NULL) == 0); + CHECK(ecount == 2); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); + /* secp256k1_ec_pubkey_combine tests. */ + ecount = 0; + pubkeys[0] = &pubkey_one; + VG_UNDEF(&pubkeys[0], sizeof(secp256k1_pubkey *)); + VG_UNDEF(&pubkeys[1], sizeof(secp256k1_pubkey *)); + VG_UNDEF(&pubkeys[2], sizeof(secp256k1_pubkey *)); + memset(&pubkey, 255, sizeof(secp256k1_pubkey)); + VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, pubkeys, 0) == 0); + VG_CHECK(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ec_pubkey_combine(ctx, NULL, pubkeys, 1) == 0); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); + CHECK(ecount == 2); + memset(&pubkey, 255, sizeof(secp256k1_pubkey)); + VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, NULL, 1) == 0); + VG_CHECK(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); + CHECK(ecount == 3); + pubkeys[0] = &pubkey_negone; + memset(&pubkey, 255, sizeof(secp256k1_pubkey)); + VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, pubkeys, 1) == 1); + VG_CHECK(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0); + CHECK(ecount == 3); + len = 33; + CHECK(secp256k1_ec_pubkey_serialize(ctx, ctmp, &len, &pubkey, SECP256K1_EC_COMPRESSED) == 1); + CHECK(secp256k1_ec_pubkey_serialize(ctx, ctmp2, &len, &pubkey_negone, SECP256K1_EC_COMPRESSED) == 1); + CHECK(memcmp(ctmp, ctmp2, 33) == 0); + /* Result is infinity. */ + pubkeys[0] = &pubkey_one; + pubkeys[1] = &pubkey_negone; + memset(&pubkey, 255, sizeof(secp256k1_pubkey)); + VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, pubkeys, 2) == 0); + VG_CHECK(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); + CHECK(ecount == 3); + /* Passes through infinity but comes out one. */ + pubkeys[2] = &pubkey_one; + memset(&pubkey, 255, sizeof(secp256k1_pubkey)); + VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, pubkeys, 3) == 1); + VG_CHECK(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0); + CHECK(ecount == 3); + len = 33; + CHECK(secp256k1_ec_pubkey_serialize(ctx, ctmp, &len, &pubkey, SECP256K1_EC_COMPRESSED) == 1); + CHECK(secp256k1_ec_pubkey_serialize(ctx, ctmp2, &len, &pubkey_one, SECP256K1_EC_COMPRESSED) == 1); + CHECK(memcmp(ctmp, ctmp2, 33) == 0); + /* Adds to two. */ + pubkeys[1] = &pubkey_one; + memset(&pubkey, 255, sizeof(secp256k1_pubkey)); + VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, pubkeys, 2) == 1); + VG_CHECK(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0); + CHECK(ecount == 3); + secp256k1_context_set_illegal_callback(ctx, NULL, NULL); +} + +void random_sign(secp256k1_scalar *sigr, secp256k1_scalar *sigs, const secp256k1_scalar *key, const secp256k1_scalar *msg, int *recid) { + secp256k1_scalar nonce; do { random_scalar_order_test(&nonce); - } while(!secp256k1_ecdsa_sig_sign(&ctx->ecmult_gen_ctx, sig, key, msg, &nonce, recid)); + } while(!secp256k1_ecdsa_sig_sign(&ctx->ecmult_gen_ctx, sigr, sigs, key, msg, &nonce, recid)); } void test_ecdsa_sign_verify(void) { - secp256k1_gej_t pubj; - secp256k1_ge_t pub; - secp256k1_scalar_t one; - secp256k1_scalar_t msg, key; - secp256k1_ecdsa_sig_t sig; + secp256k1_gej pubj; + secp256k1_ge pub; + secp256k1_scalar one; + secp256k1_scalar msg, key; + secp256k1_scalar sigr, sigs; int recid; int getrec; random_scalar_order_test(&msg); random_scalar_order_test(&key); secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pubj, &key); secp256k1_ge_set_gej(&pub, &pubj); - getrec = secp256k1_rand32()&1; - random_sign(&sig, &key, &msg, getrec?&recid:NULL); + getrec = secp256k1_rand_bits(1); + random_sign(&sigr, &sigs, &key, &msg, getrec?&recid:NULL); if (getrec) { CHECK(recid >= 0 && recid < 4); } - CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sig, &pub, &msg)); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sigr, &sigs, &pub, &msg)); secp256k1_scalar_set_int(&one, 1); secp256k1_scalar_add(&msg, &msg, &one); - CHECK(!secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sig, &pub, &msg)); + CHECK(!secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sigr, &sigs, &pub, &msg)); } void run_ecdsa_sign_verify(void) { @@ -1357,22 +3385,23 @@ void run_ecdsa_sign_verify(void) { } /** Dummy nonce generation function that just uses a precomputed nonce, and fails if it is not accepted. Use only for testing. */ -static int precomputed_nonce_function(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, unsigned int counter, const void *data) { +static int precomputed_nonce_function(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter) { (void)msg32; (void)key32; + (void)algo16; memcpy(nonce32, data, 32); return (counter == 0); } -static int nonce_function_test_fail(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, unsigned int counter, const void *data) { +static int nonce_function_test_fail(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter) { /* Dummy nonce generator that has a fatal error on the first counter value. */ if (counter == 0) { return 0; } - return nonce_function_rfc6979(nonce32, msg32, key32, counter - 1, data); + return nonce_function_rfc6979(nonce32, msg32, key32, algo16, data, counter - 1); } -static int nonce_function_test_retry(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, unsigned int counter, const void *data) { +static int nonce_function_test_retry(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter) { /* Dummy nonce generator that produces unacceptable nonces for the first several counter values. */ if (counter < 3) { memset(nonce32, counter==0 ? 0 : 255, 32); @@ -1394,17 +3423,17 @@ static int nonce_function_test_retry(unsigned char *nonce32, const unsigned char } return 1; } - /* Retry rate of 6979 is negligible esp. as we only call this in determinstic tests. */ + /* Retry rate of 6979 is negligible esp. as we only call this in deterministic tests. */ /* If someone does fine a case where it retries for secp256k1, we'd like to know. */ if (counter > 5) { return 0; } - return nonce_function_rfc6979(nonce32, msg32, key32, counter - 5, data); + return nonce_function_rfc6979(nonce32, msg32, key32, algo16, data, counter - 5); } -int is_empty_compact_signature(const unsigned char *sig64) { - static const unsigned char res[64] = {0}; - return memcmp(sig64, res, 64) == 0; +int is_empty_signature(const secp256k1_ecdsa_signature *sig) { + static const unsigned char res[sizeof(secp256k1_ecdsa_signature)] = {0}; + return memcmp(sig, res, sizeof(secp256k1_ecdsa_signature)) == 0; } void test_ecdsa_end_to_end(void) { @@ -1412,26 +3441,20 @@ void test_ecdsa_end_to_end(void) { unsigned char privkey[32]; unsigned char message[32]; unsigned char privkey2[32]; - unsigned char csignature[64]; - unsigned char signature[72]; - unsigned char signature2[72]; - unsigned char signature3[72]; - unsigned char signature4[72]; - unsigned char pubkey[65]; - unsigned char recpubkey[65]; + secp256k1_ecdsa_signature signature[6]; + secp256k1_scalar r, s; + unsigned char sig[74]; + size_t siglen = 74; + unsigned char pubkeyc[65]; + size_t pubkeyclen = 65; + secp256k1_pubkey pubkey; + secp256k1_pubkey pubkey_tmp; unsigned char seckey[300]; - int signaturelen = 72; - int signaturelen2 = 72; - int signaturelen3 = 72; - int signaturelen4 = 72; - int recid = 0; - int recpubkeylen = 0; - int pubkeylen = 65; - int seckeylen = 300; + size_t seckeylen = 300; /* Generate a random key and message. */ { - secp256k1_scalar_t msg, key; + secp256k1_scalar msg, key; random_scalar_order_test(&msg); random_scalar_order_test(&key); secp256k1_scalar_get_b32(privkey, &key); @@ -1440,117 +3463,127 @@ void test_ecdsa_end_to_end(void) { /* Construct and verify corresponding public key. */ CHECK(secp256k1_ec_seckey_verify(ctx, privkey) == 1); - CHECK(secp256k1_ec_pubkey_create(ctx, pubkey, &pubkeylen, privkey, (secp256k1_rand32() & 3) != 0) == 1); - if (secp256k1_rand32() & 1) { - CHECK(secp256k1_ec_pubkey_decompress(ctx, pubkey, &pubkeylen)); - } - CHECK(secp256k1_ec_pubkey_verify(ctx, pubkey, pubkeylen)); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, privkey) == 1); + + /* Verify exporting and importing public key. */ + CHECK(secp256k1_ec_pubkey_serialize(ctx, pubkeyc, &pubkeyclen, &pubkey, secp256k1_rand_bits(1) == 1 ? SECP256K1_EC_COMPRESSED : SECP256K1_EC_UNCOMPRESSED)); + memset(&pubkey, 0, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, pubkeyclen) == 1); + + /* Verify negation changes the key and changes it back */ + memcpy(&pubkey_tmp, &pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_negate(ctx, &pubkey_tmp) == 1); + CHECK(memcmp(&pubkey_tmp, &pubkey, sizeof(pubkey)) != 0); + CHECK(secp256k1_ec_pubkey_negate(ctx, &pubkey_tmp) == 1); + CHECK(memcmp(&pubkey_tmp, &pubkey, sizeof(pubkey)) == 0); /* Verify private key import and export. */ - CHECK(secp256k1_ec_privkey_export(ctx, privkey, seckey, &seckeylen, secp256k1_rand32() % 2) == 1); - CHECK(secp256k1_ec_privkey_import(ctx, privkey2, seckey, seckeylen) == 1); + CHECK(ec_privkey_export_der(ctx, seckey, &seckeylen, privkey, secp256k1_rand_bits(1) == 1)); + CHECK(ec_privkey_import_der(ctx, privkey2, seckey, seckeylen) == 1); CHECK(memcmp(privkey, privkey2, 32) == 0); /* Optionally tweak the keys using addition. */ - if (secp256k1_rand32() % 3 == 0) { + if (secp256k1_rand_int(3) == 0) { int ret1; int ret2; unsigned char rnd[32]; - unsigned char pubkey2[65]; - int pubkeylen2 = 65; + secp256k1_pubkey pubkey2; secp256k1_rand256_test(rnd); ret1 = secp256k1_ec_privkey_tweak_add(ctx, privkey, rnd); - ret2 = secp256k1_ec_pubkey_tweak_add(ctx, pubkey, pubkeylen, rnd); + ret2 = secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, rnd); CHECK(ret1 == ret2); if (ret1 == 0) { return; } - CHECK(secp256k1_ec_pubkey_create(ctx, pubkey2, &pubkeylen2, privkey, pubkeylen == 33) == 1); - CHECK(memcmp(pubkey, pubkey2, pubkeylen) == 0); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey2, privkey) == 1); + CHECK(memcmp(&pubkey, &pubkey2, sizeof(pubkey)) == 0); } /* Optionally tweak the keys using multiplication. */ - if (secp256k1_rand32() % 3 == 0) { + if (secp256k1_rand_int(3) == 0) { int ret1; int ret2; unsigned char rnd[32]; - unsigned char pubkey2[65]; - int pubkeylen2 = 65; + secp256k1_pubkey pubkey2; secp256k1_rand256_test(rnd); ret1 = secp256k1_ec_privkey_tweak_mul(ctx, privkey, rnd); - ret2 = secp256k1_ec_pubkey_tweak_mul(ctx, pubkey, pubkeylen, rnd); + ret2 = secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, rnd); CHECK(ret1 == ret2); if (ret1 == 0) { return; } - CHECK(secp256k1_ec_pubkey_create(ctx, pubkey2, &pubkeylen2, privkey, pubkeylen == 33) == 1); - CHECK(memcmp(pubkey, pubkey2, pubkeylen) == 0); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey2, privkey) == 1); + CHECK(memcmp(&pubkey, &pubkey2, sizeof(pubkey)) == 0); } /* Sign. */ - CHECK(secp256k1_ecdsa_sign(ctx, message, signature, &signaturelen, privkey, NULL, NULL) == 1); - CHECK(signaturelen > 0); - CHECK(secp256k1_ecdsa_sign(ctx, message, signature2, &signaturelen2, privkey, NULL, extra) == 1); - CHECK(signaturelen2 > 0); + CHECK(secp256k1_ecdsa_sign(ctx, &signature[0], message, privkey, NULL, NULL) == 1); + CHECK(secp256k1_ecdsa_sign(ctx, &signature[4], message, privkey, NULL, NULL) == 1); + CHECK(secp256k1_ecdsa_sign(ctx, &signature[1], message, privkey, NULL, extra) == 1); extra[31] = 1; - CHECK(secp256k1_ecdsa_sign(ctx, message, signature3, &signaturelen3, privkey, NULL, extra) == 1); - CHECK(signaturelen3 > 0); + CHECK(secp256k1_ecdsa_sign(ctx, &signature[2], message, privkey, NULL, extra) == 1); extra[31] = 0; extra[0] = 1; - CHECK(secp256k1_ecdsa_sign(ctx, message, signature4, &signaturelen4, privkey, NULL, extra) == 1); - CHECK(signaturelen3 > 0); - CHECK((signaturelen != signaturelen2) || (memcmp(signature, signature2, signaturelen) != 0)); - CHECK((signaturelen != signaturelen3) || (memcmp(signature, signature3, signaturelen) != 0)); - CHECK((signaturelen3 != signaturelen2) || (memcmp(signature3, signature2, signaturelen3) != 0)); - CHECK((signaturelen4 != signaturelen3) || (memcmp(signature4, signature3, signaturelen4) != 0)); - CHECK((signaturelen4 != signaturelen2) || (memcmp(signature4, signature2, signaturelen4) != 0)); - CHECK((signaturelen4 != signaturelen) || (memcmp(signature4, signature, signaturelen4) != 0)); + CHECK(secp256k1_ecdsa_sign(ctx, &signature[3], message, privkey, NULL, extra) == 1); + CHECK(memcmp(&signature[0], &signature[4], sizeof(signature[0])) == 0); + CHECK(memcmp(&signature[0], &signature[1], sizeof(signature[0])) != 0); + CHECK(memcmp(&signature[0], &signature[2], sizeof(signature[0])) != 0); + CHECK(memcmp(&signature[0], &signature[3], sizeof(signature[0])) != 0); + CHECK(memcmp(&signature[1], &signature[2], sizeof(signature[0])) != 0); + CHECK(memcmp(&signature[1], &signature[3], sizeof(signature[0])) != 0); + CHECK(memcmp(&signature[2], &signature[3], sizeof(signature[0])) != 0); /* Verify. */ - CHECK(secp256k1_ecdsa_verify(ctx, message, signature, signaturelen, pubkey, pubkeylen) == 1); - CHECK(secp256k1_ecdsa_verify(ctx, message, signature2, signaturelen2, pubkey, pubkeylen) == 1); - CHECK(secp256k1_ecdsa_verify(ctx, message, signature3, signaturelen3, pubkey, pubkeylen) == 1); - CHECK(secp256k1_ecdsa_verify(ctx, message, signature4, signaturelen4, pubkey, pubkeylen) == 1); - /* Destroy signature and verify again. */ - signature[signaturelen - 1 - secp256k1_rand32() % 20] += 1 + (secp256k1_rand32() % 255); - CHECK(secp256k1_ecdsa_verify(ctx, message, signature, signaturelen, pubkey, pubkeylen) != 1); - - /* Compact sign. */ - CHECK(secp256k1_ecdsa_sign_compact(ctx, message, csignature, privkey, NULL, NULL, &recid) == 1); - CHECK(!is_empty_compact_signature(csignature)); - /* Recover. */ - CHECK(secp256k1_ecdsa_recover_compact(ctx, message, csignature, recpubkey, &recpubkeylen, pubkeylen == 33, recid) == 1); - CHECK(recpubkeylen == pubkeylen); - CHECK(memcmp(pubkey, recpubkey, pubkeylen) == 0); - /* Destroy signature and verify again. */ - csignature[secp256k1_rand32() % 64] += 1 + (secp256k1_rand32() % 255); - CHECK(secp256k1_ecdsa_recover_compact(ctx, message, csignature, recpubkey, &recpubkeylen, pubkeylen == 33, recid) != 1 || - memcmp(pubkey, recpubkey, pubkeylen) != 0); - CHECK(recpubkeylen == pubkeylen); + CHECK(secp256k1_ecdsa_verify(ctx, &signature[0], message, &pubkey) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &signature[1], message, &pubkey) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &signature[2], message, &pubkey) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &signature[3], message, &pubkey) == 1); + /* Test lower-S form, malleate, verify and fail, test again, malleate again */ + CHECK(!secp256k1_ecdsa_signature_normalize(ctx, NULL, &signature[0])); + secp256k1_ecdsa_signature_load(ctx, &r, &s, &signature[0]); + secp256k1_scalar_negate(&s, &s); + secp256k1_ecdsa_signature_save(&signature[5], &r, &s); + CHECK(secp256k1_ecdsa_verify(ctx, &signature[5], message, &pubkey) == 0); + CHECK(secp256k1_ecdsa_signature_normalize(ctx, NULL, &signature[5])); + CHECK(secp256k1_ecdsa_signature_normalize(ctx, &signature[5], &signature[5])); + CHECK(!secp256k1_ecdsa_signature_normalize(ctx, NULL, &signature[5])); + CHECK(!secp256k1_ecdsa_signature_normalize(ctx, &signature[5], &signature[5])); + CHECK(secp256k1_ecdsa_verify(ctx, &signature[5], message, &pubkey) == 1); + secp256k1_scalar_negate(&s, &s); + secp256k1_ecdsa_signature_save(&signature[5], &r, &s); + CHECK(!secp256k1_ecdsa_signature_normalize(ctx, NULL, &signature[5])); + CHECK(secp256k1_ecdsa_verify(ctx, &signature[5], message, &pubkey) == 1); + CHECK(memcmp(&signature[5], &signature[0], 64) == 0); + /* Serialize/parse DER and verify again */ + CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, sig, &siglen, &signature[0]) == 1); + memset(&signature[0], 0, sizeof(signature[0])); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &signature[0], sig, siglen) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &signature[0], message, &pubkey) == 1); + /* Serialize/destroy/parse DER and verify again. */ + siglen = 74; + CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, sig, &siglen, &signature[0]) == 1); + sig[secp256k1_rand_int(siglen)] += 1 + secp256k1_rand_int(255); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &signature[0], sig, siglen) == 0 || + secp256k1_ecdsa_verify(ctx, &signature[0], message, &pubkey) == 0); } void test_random_pubkeys(void) { - secp256k1_ge_t elem; - secp256k1_ge_t elem2; + secp256k1_ge elem; + secp256k1_ge elem2; unsigned char in[65]; /* Generate some randomly sized pubkeys. */ - uint32_t r = secp256k1_rand32(); - int len = (r & 3) == 0 ? 65 : 33; - r>>=2; - if ((r & 3) == 0) { - len = (r & 252) >> 3; + size_t len = secp256k1_rand_bits(2) == 0 ? 65 : 33; + if (secp256k1_rand_bits(2) == 0) { + len = secp256k1_rand_bits(6); } - r>>=8; if (len == 65) { - in[0] = (r & 2) ? 4 : (r & 1? 6 : 7); + in[0] = secp256k1_rand_bits(1) ? 4 : (secp256k1_rand_bits(1) ? 6 : 7); } else { - in[0] = (r & 1) ? 2 : 3; + in[0] = secp256k1_rand_bits(1) ? 2 : 3; } - r>>=2; - if ((r & 7) == 0) { - in[0] = (r & 2040) >> 3; + if (secp256k1_rand_bits(3) == 0) { + in[0] = secp256k1_rand_bits(8); } - r>>=11; if (len > 1) { secp256k1_rand256(&in[1]); } @@ -1561,7 +3594,7 @@ void test_random_pubkeys(void) { unsigned char out[65]; unsigned char firstb; int res; - int size = len; + size_t size = len; firstb = in[0]; /* If the pubkey can be parsed, it should round-trip... */ CHECK(secp256k1_eckey_pubkey_serialize(&elem, out, &size, len == 33)); @@ -1577,7 +3610,7 @@ void test_random_pubkeys(void) { CHECK(secp256k1_eckey_pubkey_parse(&elem2, in, size)); ge_equals_ge(&elem,&elem2); /* Check that the X9.62 hybrid type is checked. */ - in[0] = (r & 1) ? 6 : 7; + in[0] = secp256k1_rand_bits(1) ? 6 : 7; res = secp256k1_eckey_pubkey_parse(&elem2, in, size); if (firstb == 2 || firstb == 3) { if (in[0] == firstb + 4) { @@ -1608,185 +3641,508 @@ void run_ecdsa_end_to_end(void) { } } -/* Tests several edge cases. */ -void test_ecdsa_edge_cases(void) { - const unsigned char msg32[32] = { - 'T', 'h', 'i', 's', ' ', 'i', 's', ' ', - 'a', ' ', 'v', 'e', 'r', 'y', ' ', 's', - 'e', 'c', 'r', 'e', 't', ' ', 'm', 'e', - 's', 's', 'a', 'g', 'e', '.', '.', '.' +int test_ecdsa_der_parse(const unsigned char *sig, size_t siglen, int certainly_der, int certainly_not_der) { + static const unsigned char zeroes[32] = {0}; +#ifdef ENABLE_OPENSSL_TESTS + static const unsigned char max_scalar[32] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, + 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40 }; - const unsigned char sig64[64] = { - /* Generated by signing the above message with nonce 'This is the nonce we will use...' - * and secret key 0 (which is not valid), resulting in recid 0. */ - 0x67, 0xCB, 0x28, 0x5F, 0x9C, 0xD1, 0x94, 0xE8, - 0x40, 0xD6, 0x29, 0x39, 0x7A, 0xF5, 0x56, 0x96, - 0x62, 0xFD, 0xE4, 0x46, 0x49, 0x99, 0x59, 0x63, - 0x17, 0x9A, 0x7D, 0xD1, 0x7B, 0xD2, 0x35, 0x32, - 0x4B, 0x1B, 0x7D, 0xF3, 0x4C, 0xE1, 0xF6, 0x8E, - 0x69, 0x4F, 0xF6, 0xF1, 0x1A, 0xC7, 0x51, 0xDD, - 0x7D, 0xD7, 0x3E, 0x38, 0x7E, 0xE4, 0xFC, 0x86, - 0x6E, 0x1B, 0xE8, 0xEC, 0xC7, 0xDD, 0x95, 0x57 - }; - unsigned char pubkey[65]; - int t; - int pubkeylen = 65; - /* signature (r,s) = (4,4), which can be recovered with all 4 recids. */ - const unsigned char sigb64[64] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, - }; - unsigned char pubkeyb[33]; - int pubkeyblen = 33; - int recid; +#endif - CHECK(!secp256k1_ecdsa_recover_compact(ctx, msg32, sig64, pubkey, &pubkeylen, 0, 0)); - CHECK(secp256k1_ecdsa_recover_compact(ctx, msg32, sig64, pubkey, &pubkeylen, 0, 1)); - CHECK(!secp256k1_ecdsa_recover_compact(ctx, msg32, sig64, pubkey, &pubkeylen, 0, 2)); - CHECK(!secp256k1_ecdsa_recover_compact(ctx, msg32, sig64, pubkey, &pubkeylen, 0, 3)); + int ret = 0; - for (recid = 0; recid < 4; recid++) { - int i; - int recid2; - /* (4,4) encoded in DER. */ - unsigned char sigbder[8] = {0x30, 0x06, 0x02, 0x01, 0x04, 0x02, 0x01, 0x04}; - unsigned char sigcder_zr[7] = {0x30, 0x05, 0x02, 0x00, 0x02, 0x01, 0x01}; - unsigned char sigcder_zs[7] = {0x30, 0x05, 0x02, 0x01, 0x01, 0x02, 0x00}; - unsigned char sigbderalt1[39] = { - 0x30, 0x25, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0x04, - }; - unsigned char sigbderalt2[39] = { - 0x30, 0x25, 0x02, 0x01, 0x04, 0x02, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, - }; - unsigned char sigbderalt3[40] = { - 0x30, 0x26, 0x02, 0x21, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0x04, - }; - unsigned char sigbderalt4[40] = { - 0x30, 0x26, 0x02, 0x01, 0x04, 0x02, 0x21, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, - }; - /* (order + r,4) encoded in DER. */ - unsigned char sigbderlong[40] = { - 0x30, 0x26, 0x02, 0x21, 0x00, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xBA, 0xAE, 0xDC, - 0xE6, 0xAF, 0x48, 0xA0, 0x3B, 0xBF, 0xD2, 0x5E, - 0x8C, 0xD0, 0x36, 0x41, 0x45, 0x02, 0x01, 0x04 - }; - CHECK(secp256k1_ecdsa_recover_compact(ctx, msg32, sigb64, pubkeyb, &pubkeyblen, 1, recid)); - CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbder, sizeof(sigbder), pubkeyb, pubkeyblen) == 1); - for (recid2 = 0; recid2 < 4; recid2++) { - unsigned char pubkey2b[33]; - int pubkey2blen = 33; - CHECK(secp256k1_ecdsa_recover_compact(ctx, msg32, sigb64, pubkey2b, &pubkey2blen, 1, recid2)); - /* Verifying with (order + r,4) should always fail. */ - CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbderlong, sizeof(sigbderlong), pubkey2b, pubkey2blen) != 1); + secp256k1_ecdsa_signature sig_der; + unsigned char roundtrip_der[2048]; + unsigned char compact_der[64]; + size_t len_der = 2048; + int parsed_der = 0, valid_der = 0, roundtrips_der = 0; + + secp256k1_ecdsa_signature sig_der_lax; + unsigned char roundtrip_der_lax[2048]; + unsigned char compact_der_lax[64]; + size_t len_der_lax = 2048; + int parsed_der_lax = 0, valid_der_lax = 0, roundtrips_der_lax = 0; + +#ifdef ENABLE_OPENSSL_TESTS + ECDSA_SIG *sig_openssl; + const unsigned char *sigptr; + unsigned char roundtrip_openssl[2048]; + int len_openssl = 2048; + int parsed_openssl, valid_openssl = 0, roundtrips_openssl = 0; +#endif + + parsed_der = secp256k1_ecdsa_signature_parse_der(ctx, &sig_der, sig, siglen); + if (parsed_der) { + ret |= (!secp256k1_ecdsa_signature_serialize_compact(ctx, compact_der, &sig_der)) << 0; + valid_der = (memcmp(compact_der, zeroes, 32) != 0) && (memcmp(compact_der + 32, zeroes, 32) != 0); + } + if (valid_der) { + ret |= (!secp256k1_ecdsa_signature_serialize_der(ctx, roundtrip_der, &len_der, &sig_der)) << 1; + roundtrips_der = (len_der == siglen) && memcmp(roundtrip_der, sig, siglen) == 0; + } + + parsed_der_lax = ecdsa_signature_parse_der_lax(ctx, &sig_der_lax, sig, siglen); + if (parsed_der_lax) { + ret |= (!secp256k1_ecdsa_signature_serialize_compact(ctx, compact_der_lax, &sig_der_lax)) << 10; + valid_der_lax = (memcmp(compact_der_lax, zeroes, 32) != 0) && (memcmp(compact_der_lax + 32, zeroes, 32) != 0); + } + if (valid_der_lax) { + ret |= (!secp256k1_ecdsa_signature_serialize_der(ctx, roundtrip_der_lax, &len_der_lax, &sig_der_lax)) << 11; + roundtrips_der_lax = (len_der_lax == siglen) && memcmp(roundtrip_der_lax, sig, siglen) == 0; + } + + if (certainly_der) { + ret |= (!parsed_der) << 2; + } + if (certainly_not_der) { + ret |= (parsed_der) << 17; + } + if (valid_der) { + ret |= (!roundtrips_der) << 3; + } + + if (valid_der) { + ret |= (!roundtrips_der_lax) << 12; + ret |= (len_der != len_der_lax) << 13; + ret |= (memcmp(roundtrip_der_lax, roundtrip_der, len_der) != 0) << 14; + } + ret |= (roundtrips_der != roundtrips_der_lax) << 15; + if (parsed_der) { + ret |= (!parsed_der_lax) << 16; + } + +#ifdef ENABLE_OPENSSL_TESTS + sig_openssl = ECDSA_SIG_new(); + sigptr = sig; + parsed_openssl = (d2i_ECDSA_SIG(&sig_openssl, &sigptr, siglen) != NULL); + if (parsed_openssl) { + valid_openssl = !BN_is_negative(sig_openssl->r) && !BN_is_negative(sig_openssl->s) && BN_num_bits(sig_openssl->r) > 0 && BN_num_bits(sig_openssl->r) <= 256 && BN_num_bits(sig_openssl->s) > 0 && BN_num_bits(sig_openssl->s) <= 256; + if (valid_openssl) { + unsigned char tmp[32] = {0}; + BN_bn2bin(sig_openssl->r, tmp + 32 - BN_num_bytes(sig_openssl->r)); + valid_openssl = memcmp(tmp, max_scalar, 32) < 0; } - /* DER parsing tests. */ - /* Zero length r/s. */ - CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigcder_zr, sizeof(sigcder_zr), pubkeyb, pubkeyblen) == -2); - CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigcder_zs, sizeof(sigcder_zs), pubkeyb, pubkeyblen) == -2); - /* Leading zeros. */ - CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbderalt1, sizeof(sigbderalt1), pubkeyb, pubkeyblen) == 1); - CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbderalt2, sizeof(sigbderalt2), pubkeyb, pubkeyblen) == 1); - CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbderalt3, sizeof(sigbderalt3), pubkeyb, pubkeyblen) == 1); - CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbderalt4, sizeof(sigbderalt4), pubkeyb, pubkeyblen) == 1); - sigbderalt3[4] = 1; - CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbderalt3, sizeof(sigbderalt3), pubkeyb, pubkeyblen) == -2); - sigbderalt4[7] = 1; - CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbderalt4, sizeof(sigbderalt4), pubkeyb, pubkeyblen) == -2); - /* Damage signature. */ - sigbder[7]++; - CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbder, sizeof(sigbder), pubkeyb, pubkeyblen) == 0); - sigbder[7]--; - CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbder, 6, pubkeyb, pubkeyblen) == -2); - CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbder, sizeof(sigbder)-1, pubkeyb, pubkeyblen) == -2); - for(i = 0; i < 8; i++) { - int c; - unsigned char orig = sigbder[i]; - /*Try every single-byte change.*/ - for (c = 0; c < 256; c++) { - if (c == orig ) { - continue; - } - sigbder[i] = c; - CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbder, sizeof(sigbder), pubkeyb, pubkeyblen) == - (i==4 || i==7) ? 0 : -2 ); - } - sigbder[i] = orig; + if (valid_openssl) { + unsigned char tmp[32] = {0}; + BN_bn2bin(sig_openssl->s, tmp + 32 - BN_num_bytes(sig_openssl->s)); + valid_openssl = memcmp(tmp, max_scalar, 32) < 0; } } + len_openssl = i2d_ECDSA_SIG(sig_openssl, NULL); + if (len_openssl <= 2048) { + unsigned char *ptr = roundtrip_openssl; + CHECK(i2d_ECDSA_SIG(sig_openssl, &ptr) == len_openssl); + roundtrips_openssl = valid_openssl && ((size_t)len_openssl == siglen) && (memcmp(roundtrip_openssl, sig, siglen) == 0); + } else { + len_openssl = 0; + } + ECDSA_SIG_free(sig_openssl); + + ret |= (parsed_der && !parsed_openssl) << 4; + ret |= (valid_der && !valid_openssl) << 5; + ret |= (roundtrips_openssl && !parsed_der) << 6; + ret |= (roundtrips_der != roundtrips_openssl) << 7; + if (roundtrips_openssl) { + ret |= (len_der != (size_t)len_openssl) << 8; + ret |= (memcmp(roundtrip_der, roundtrip_openssl, len_der) != 0) << 9; + } +#endif + return ret; +} + +static void assign_big_endian(unsigned char *ptr, size_t ptrlen, uint32_t val) { + size_t i; + for (i = 0; i < ptrlen; i++) { + int shift = ptrlen - 1 - i; + if (shift >= 4) { + ptr[i] = 0; + } else { + ptr[i] = (val >> shift) & 0xFF; + } + } +} + +static void damage_array(unsigned char *sig, size_t *len) { + int pos; + int action = secp256k1_rand_bits(3); + if (action < 1 && *len > 3) { + /* Delete a byte. */ + pos = secp256k1_rand_int(*len); + memmove(sig + pos, sig + pos + 1, *len - pos - 1); + (*len)--; + return; + } else if (action < 2 && *len < 2048) { + /* Insert a byte. */ + pos = secp256k1_rand_int(1 + *len); + memmove(sig + pos + 1, sig + pos, *len - pos); + sig[pos] = secp256k1_rand_bits(8); + (*len)++; + return; + } else if (action < 4) { + /* Modify a byte. */ + sig[secp256k1_rand_int(*len)] += 1 + secp256k1_rand_int(255); + return; + } else { /* action < 8 */ + /* Modify a bit. */ + sig[secp256k1_rand_int(*len)] ^= 1 << secp256k1_rand_bits(3); + return; + } +} + +static void random_ber_signature(unsigned char *sig, size_t *len, int* certainly_der, int* certainly_not_der) { + int der; + int nlow[2], nlen[2], nlenlen[2], nhbit[2], nhbyte[2], nzlen[2]; + size_t tlen, elen, glen; + int indet; + int n; + + *len = 0; + der = secp256k1_rand_bits(2) == 0; + *certainly_der = der; + *certainly_not_der = 0; + indet = der ? 0 : secp256k1_rand_int(10) == 0; + + for (n = 0; n < 2; n++) { + /* We generate two classes of numbers: nlow==1 "low" ones (up to 32 bytes), nlow==0 "high" ones (32 bytes with 129 top bits set, or larger than 32 bytes) */ + nlow[n] = der ? 1 : (secp256k1_rand_bits(3) != 0); + /* The length of the number in bytes (the first byte of which will always be nonzero) */ + nlen[n] = nlow[n] ? secp256k1_rand_int(33) : 32 + secp256k1_rand_int(200) * secp256k1_rand_int(8) / 8; + CHECK(nlen[n] <= 232); + /* The top bit of the number. */ + nhbit[n] = (nlow[n] == 0 && nlen[n] == 32) ? 1 : (nlen[n] == 0 ? 0 : secp256k1_rand_bits(1)); + /* The top byte of the number (after the potential hardcoded 16 0xFF characters for "high" 32 bytes numbers) */ + nhbyte[n] = nlen[n] == 0 ? 0 : (nhbit[n] ? 128 + secp256k1_rand_bits(7) : 1 + secp256k1_rand_int(127)); + /* The number of zero bytes in front of the number (which is 0 or 1 in case of DER, otherwise we extend up to 300 bytes) */ + nzlen[n] = der ? ((nlen[n] == 0 || nhbit[n]) ? 1 : 0) : (nlow[n] ? secp256k1_rand_int(3) : secp256k1_rand_int(300 - nlen[n]) * secp256k1_rand_int(8) / 8); + if (nzlen[n] > ((nlen[n] == 0 || nhbit[n]) ? 1 : 0)) { + *certainly_not_der = 1; + } + CHECK(nlen[n] + nzlen[n] <= 300); + /* The length of the length descriptor for the number. 0 means short encoding, anything else is long encoding. */ + nlenlen[n] = nlen[n] + nzlen[n] < 128 ? 0 : (nlen[n] + nzlen[n] < 256 ? 1 : 2); + if (!der) { + /* nlenlen[n] max 127 bytes */ + int add = secp256k1_rand_int(127 - nlenlen[n]) * secp256k1_rand_int(16) * secp256k1_rand_int(16) / 256; + nlenlen[n] += add; + if (add != 0) { + *certainly_not_der = 1; + } + } + CHECK(nlen[n] + nzlen[n] + nlenlen[n] <= 427); + } + + /* The total length of the data to go, so far */ + tlen = 2 + nlenlen[0] + nlen[0] + nzlen[0] + 2 + nlenlen[1] + nlen[1] + nzlen[1]; + CHECK(tlen <= 856); + + /* The length of the garbage inside the tuple. */ + elen = (der || indet) ? 0 : secp256k1_rand_int(980 - tlen) * secp256k1_rand_int(8) / 8; + if (elen != 0) { + *certainly_not_der = 1; + } + tlen += elen; + CHECK(tlen <= 980); + + /* The length of the garbage after the end of the tuple. */ + glen = der ? 0 : secp256k1_rand_int(990 - tlen) * secp256k1_rand_int(8) / 8; + if (glen != 0) { + *certainly_not_der = 1; + } + CHECK(tlen + glen <= 990); + + /* Write the tuple header. */ + sig[(*len)++] = 0x30; + if (indet) { + /* Indeterminate length */ + sig[(*len)++] = 0x80; + *certainly_not_der = 1; + } else { + int tlenlen = tlen < 128 ? 0 : (tlen < 256 ? 1 : 2); + if (!der) { + int add = secp256k1_rand_int(127 - tlenlen) * secp256k1_rand_int(16) * secp256k1_rand_int(16) / 256; + tlenlen += add; + if (add != 0) { + *certainly_not_der = 1; + } + } + if (tlenlen == 0) { + /* Short length notation */ + sig[(*len)++] = tlen; + } else { + /* Long length notation */ + sig[(*len)++] = 128 + tlenlen; + assign_big_endian(sig + *len, tlenlen, tlen); + *len += tlenlen; + } + tlen += tlenlen; + } + tlen += 2; + CHECK(tlen + glen <= 1119); + + for (n = 0; n < 2; n++) { + /* Write the integer header. */ + sig[(*len)++] = 0x02; + if (nlenlen[n] == 0) { + /* Short length notation */ + sig[(*len)++] = nlen[n] + nzlen[n]; + } else { + /* Long length notation. */ + sig[(*len)++] = 128 + nlenlen[n]; + assign_big_endian(sig + *len, nlenlen[n], nlen[n] + nzlen[n]); + *len += nlenlen[n]; + } + /* Write zero padding */ + while (nzlen[n] > 0) { + sig[(*len)++] = 0x00; + nzlen[n]--; + } + if (nlen[n] == 32 && !nlow[n]) { + /* Special extra 16 0xFF bytes in "high" 32-byte numbers */ + int i; + for (i = 0; i < 16; i++) { + sig[(*len)++] = 0xFF; + } + nlen[n] -= 16; + } + /* Write first byte of number */ + if (nlen[n] > 0) { + sig[(*len)++] = nhbyte[n]; + nlen[n]--; + } + /* Generate remaining random bytes of number */ + secp256k1_rand_bytes_test(sig + *len, nlen[n]); + *len += nlen[n]; + nlen[n] = 0; + } + + /* Generate random garbage inside tuple. */ + secp256k1_rand_bytes_test(sig + *len, elen); + *len += elen; + + /* Generate end-of-contents bytes. */ + if (indet) { + sig[(*len)++] = 0; + sig[(*len)++] = 0; + tlen += 2; + } + CHECK(tlen + glen <= 1121); + + /* Generate random garbage outside tuple. */ + secp256k1_rand_bytes_test(sig + *len, glen); + *len += glen; + tlen += glen; + CHECK(tlen <= 1121); + CHECK(tlen == *len); +} + +void run_ecdsa_der_parse(void) { + int i,j; + for (i = 0; i < 200 * count; i++) { + unsigned char buffer[2048]; + size_t buflen = 0; + int certainly_der = 0; + int certainly_not_der = 0; + random_ber_signature(buffer, &buflen, &certainly_der, &certainly_not_der); + CHECK(buflen <= 2048); + for (j = 0; j < 16; j++) { + int ret = 0; + if (j > 0) { + damage_array(buffer, &buflen); + /* We don't know anything anymore about the DERness of the result */ + certainly_der = 0; + certainly_not_der = 0; + } + ret = test_ecdsa_der_parse(buffer, buflen, certainly_der, certainly_not_der); + if (ret != 0) { + size_t k; + fprintf(stderr, "Failure %x on ", ret); + for (k = 0; k < buflen; k++) { + fprintf(stderr, "%02x ", buffer[k]); + } + fprintf(stderr, "\n"); + } + CHECK(ret == 0); + } + } +} + +/* Tests several edge cases. */ +void test_ecdsa_edge_cases(void) { + int t; + secp256k1_ecdsa_signature sig; /* Test the case where ECDSA recomputes a point that is infinity. */ { - secp256k1_gej_t keyj; - secp256k1_ge_t key; - secp256k1_scalar_t msg; - secp256k1_ecdsa_sig_t sig; - secp256k1_scalar_set_int(&sig.s, 1); - secp256k1_scalar_negate(&sig.s, &sig.s); - secp256k1_scalar_inverse(&sig.s, &sig.s); - secp256k1_scalar_set_int(&sig.r, 1); - secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &keyj, &sig.r); + secp256k1_gej keyj; + secp256k1_ge key; + secp256k1_scalar msg; + secp256k1_scalar sr, ss; + secp256k1_scalar_set_int(&ss, 1); + secp256k1_scalar_negate(&ss, &ss); + secp256k1_scalar_inverse(&ss, &ss); + secp256k1_scalar_set_int(&sr, 1); + secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &keyj, &sr); secp256k1_ge_set_gej(&key, &keyj); - msg = sig.s; - CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sig, &key, &msg) == 0); + msg = ss; + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0); } - /* Test r/s equal to zero */ + /* Verify signature with r of zero fails. */ { - /* (1,1) encoded in DER. */ - unsigned char sigcder[8] = {0x30, 0x06, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01}; - unsigned char sigc64[64] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + const unsigned char pubkey_mods_zero[33] = { + 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, + 0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, + 0x41 }; - unsigned char pubkeyc[65]; - int pubkeyclen = 65; - CHECK(secp256k1_ecdsa_recover_compact(ctx, msg32, sigc64, pubkeyc, &pubkeyclen, 0, 0) == 1); - CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigcder, sizeof(sigcder), pubkeyc, pubkeyclen) == 1); - sigcder[4] = 0; - sigc64[31] = 0; - CHECK(secp256k1_ecdsa_recover_compact(ctx, msg32, sigc64, pubkeyb, &pubkeyblen, 1, 0) == 0); - CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigcder, sizeof(sigcder), pubkeyc, pubkeyclen) == 0); - sigcder[4] = 1; - sigcder[7] = 0; - sigc64[31] = 1; - sigc64[63] = 0; - CHECK(secp256k1_ecdsa_recover_compact(ctx, msg32, sigc64, pubkeyb, &pubkeyblen, 1, 0) == 0); - CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigcder, sizeof(sigcder), pubkeyc, pubkeyclen) == 0); + secp256k1_ge key; + secp256k1_scalar msg; + secp256k1_scalar sr, ss; + secp256k1_scalar_set_int(&ss, 1); + secp256k1_scalar_set_int(&msg, 0); + secp256k1_scalar_set_int(&sr, 0); + CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey_mods_zero, 33)); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0); } - /*Signature where s would be zero.*/ + /* Verify signature with s of zero fails. */ { - const unsigned char nonce[32] = { + const unsigned char pubkey[33] = { + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01 + }; + secp256k1_ge key; + secp256k1_scalar msg; + secp256k1_scalar sr, ss; + secp256k1_scalar_set_int(&ss, 0); + secp256k1_scalar_set_int(&msg, 0); + secp256k1_scalar_set_int(&sr, 1); + CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33)); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0); + } + + /* Verify signature with message 0 passes. */ + { + const unsigned char pubkey[33] = { + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02 + }; + const unsigned char pubkey2[33] = { + 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, + 0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, + 0x43 + }; + secp256k1_ge key; + secp256k1_ge key2; + secp256k1_scalar msg; + secp256k1_scalar sr, ss; + secp256k1_scalar_set_int(&ss, 2); + secp256k1_scalar_set_int(&msg, 0); + secp256k1_scalar_set_int(&sr, 2); + CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33)); + CHECK(secp256k1_eckey_pubkey_parse(&key2, pubkey2, 33)); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 1); + secp256k1_scalar_negate(&ss, &ss); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 1); + secp256k1_scalar_set_int(&ss, 1); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 0); + } + + /* Verify signature with message 1 passes. */ + { + const unsigned char pubkey[33] = { + 0x02, 0x14, 0x4e, 0x5a, 0x58, 0xef, 0x5b, 0x22, + 0x6f, 0xd2, 0xe2, 0x07, 0x6a, 0x77, 0xcf, 0x05, + 0xb4, 0x1d, 0xe7, 0x4a, 0x30, 0x98, 0x27, 0x8c, + 0x93, 0xe6, 0xe6, 0x3c, 0x0b, 0xc4, 0x73, 0x76, + 0x25 + }; + const unsigned char pubkey2[33] = { + 0x02, 0x8a, 0xd5, 0x37, 0xed, 0x73, 0xd9, 0x40, + 0x1d, 0xa0, 0x33, 0xd2, 0xdc, 0xf0, 0xaf, 0xae, + 0x34, 0xcf, 0x5f, 0x96, 0x4c, 0x73, 0x28, 0x0f, + 0x92, 0xc0, 0xf6, 0x9d, 0xd9, 0xb2, 0x09, 0x10, + 0x62 + }; + const unsigned char csr[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4, + 0x40, 0x2d, 0xa1, 0x72, 0x2f, 0xc9, 0xba, 0xeb + }; + secp256k1_ge key; + secp256k1_ge key2; + secp256k1_scalar msg; + secp256k1_scalar sr, ss; + secp256k1_scalar_set_int(&ss, 1); + secp256k1_scalar_set_int(&msg, 1); + secp256k1_scalar_set_b32(&sr, csr, NULL); + CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33)); + CHECK(secp256k1_eckey_pubkey_parse(&key2, pubkey2, 33)); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 1); + secp256k1_scalar_negate(&ss, &ss); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 1); + secp256k1_scalar_set_int(&ss, 2); + secp256k1_scalar_inverse_var(&ss, &ss); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 0); + } + + /* Verify signature with message -1 passes. */ + { + const unsigned char pubkey[33] = { + 0x03, 0xaf, 0x97, 0xff, 0x7d, 0x3a, 0xf6, 0xa0, + 0x02, 0x94, 0xbd, 0x9f, 0x4b, 0x2e, 0xd7, 0x52, + 0x28, 0xdb, 0x49, 0x2a, 0x65, 0xcb, 0x1e, 0x27, + 0x57, 0x9c, 0xba, 0x74, 0x20, 0xd5, 0x1d, 0x20, + 0xf1 + }; + const unsigned char csr[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4, + 0x40, 0x2d, 0xa1, 0x72, 0x2f, 0xc9, 0xba, 0xee + }; + secp256k1_ge key; + secp256k1_scalar msg; + secp256k1_scalar sr, ss; + secp256k1_scalar_set_int(&ss, 1); + secp256k1_scalar_set_int(&msg, 1); + secp256k1_scalar_negate(&msg, &msg); + secp256k1_scalar_set_b32(&sr, csr, NULL); + CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33)); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1); + secp256k1_scalar_negate(&ss, &ss); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1); + secp256k1_scalar_set_int(&ss, 3); + secp256k1_scalar_inverse_var(&ss, &ss); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0); + } + + /* Signature where s would be zero. */ + { + secp256k1_pubkey pubkey; + size_t siglen; + int32_t ecount; + unsigned char signature[72]; + static const unsigned char nonce[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1810,21 +4166,72 @@ void test_ecdsa_edge_cases(void) { 0xb8, 0x12, 0xe0, 0x0b, 0x81, 0x7a, 0x77, 0x62, 0x65, 0xdf, 0xdd, 0x31, 0xb9, 0x3e, 0x29, 0xa9, }; - unsigned char sig[72]; - int siglen = 72; - CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, precomputed_nonce_function, nonce) == 0); - CHECK(siglen == 0); - CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, precomputed_nonce_function, nonce2) == 0); - CHECK(siglen == 0); + ecount = 0; + secp256k1_context_set_illegal_callback(ctx, counting_illegal_callback_fn, &ecount); + CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, precomputed_nonce_function, nonce) == 0); + CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, precomputed_nonce_function, nonce2) == 0); msg[31] = 0xaa; + CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, precomputed_nonce_function, nonce) == 1); + CHECK(ecount == 0); + CHECK(secp256k1_ecdsa_sign(ctx, NULL, msg, key, precomputed_nonce_function, nonce2) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ecdsa_sign(ctx, &sig, NULL, key, precomputed_nonce_function, nonce2) == 0); + CHECK(ecount == 2); + CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, NULL, precomputed_nonce_function, nonce2) == 0); + CHECK(ecount == 3); + CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, precomputed_nonce_function, nonce2) == 1); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, key) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, NULL, msg, &pubkey) == 0); + CHECK(ecount == 4); + CHECK(secp256k1_ecdsa_verify(ctx, &sig, NULL, &pubkey) == 0); + CHECK(ecount == 5); + CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg, NULL) == 0); + CHECK(ecount == 6); + CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg, &pubkey) == 1); + CHECK(ecount == 6); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, NULL) == 0); + CHECK(ecount == 7); + /* That pubkeyload fails via an ARGCHECK is a little odd but makes sense because pubkeys are an opaque data type. */ + CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg, &pubkey) == 0); + CHECK(ecount == 8); siglen = 72; - CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, precomputed_nonce_function, nonce) == 1); - CHECK(siglen > 0); - CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, precomputed_nonce_function, nonce2) == 1); - CHECK(siglen > 0); + CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, NULL, &siglen, &sig) == 0); + CHECK(ecount == 9); + CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, signature, NULL, &sig) == 0); + CHECK(ecount == 10); + CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, signature, &siglen, NULL) == 0); + CHECK(ecount == 11); + CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, signature, &siglen, &sig) == 1); + CHECK(ecount == 11); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, NULL, signature, siglen) == 0); + CHECK(ecount == 12); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, NULL, siglen) == 0); + CHECK(ecount == 13); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, signature, siglen) == 1); + CHECK(ecount == 13); siglen = 10; - CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, precomputed_nonce_function, nonce) != 1); - CHECK(siglen == 0); + /* Too little room for a signature does not fail via ARGCHECK. */ + CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, signature, &siglen, &sig) == 0); + CHECK(ecount == 13); + ecount = 0; + CHECK(secp256k1_ecdsa_signature_normalize(ctx, NULL, NULL) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ecdsa_signature_serialize_compact(ctx, NULL, &sig) == 0); + CHECK(ecount == 2); + CHECK(secp256k1_ecdsa_signature_serialize_compact(ctx, signature, NULL) == 0); + CHECK(ecount == 3); + CHECK(secp256k1_ecdsa_signature_serialize_compact(ctx, signature, &sig) == 1); + CHECK(ecount == 3); + CHECK(secp256k1_ecdsa_signature_parse_compact(ctx, NULL, signature) == 0); + CHECK(ecount == 4); + CHECK(secp256k1_ecdsa_signature_parse_compact(ctx, &sig, NULL) == 0); + CHECK(ecount == 5); + CHECK(secp256k1_ecdsa_signature_parse_compact(ctx, &sig, signature) == 1); + CHECK(ecount == 5); + memset(signature, 255, 64); + CHECK(secp256k1_ecdsa_signature_parse_compact(ctx, &sig, signature) == 0); + CHECK(ecount == 5); + secp256k1_context_set_illegal_callback(ctx, NULL, NULL); } /* Nonce function corner cases. */ @@ -1833,65 +4240,43 @@ void test_ecdsa_edge_cases(void) { int i; unsigned char key[32]; unsigned char msg[32]; - unsigned char sig[72]; - unsigned char sig2[72]; - secp256k1_ecdsa_sig_t s[512]; - int siglen = 72; - int siglen2 = 72; - int recid2; + secp256k1_ecdsa_signature sig2; + secp256k1_scalar sr[512], ss; const unsigned char *extra; extra = t == 0 ? NULL : zero; memset(msg, 0, 32); msg[31] = 1; /* High key results in signature failure. */ memset(key, 0xFF, 32); - CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, NULL, extra) == 0); - CHECK(siglen == 0); + CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, NULL, extra) == 0); + CHECK(is_empty_signature(&sig)); /* Zero key results in signature failure. */ memset(key, 0, 32); - CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, NULL, extra) == 0); - CHECK(siglen == 0); + CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, NULL, extra) == 0); + CHECK(is_empty_signature(&sig)); /* Nonce function failure results in signature failure. */ key[31] = 1; - CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, nonce_function_test_fail, extra) == 0); - CHECK(siglen == 0); - CHECK(secp256k1_ecdsa_sign_compact(ctx, msg, sig, key, nonce_function_test_fail, extra, &recid) == 0); - CHECK(is_empty_compact_signature(sig)); + CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, nonce_function_test_fail, extra) == 0); + CHECK(is_empty_signature(&sig)); /* The retry loop successfully makes its way to the first good value. */ - siglen = 72; - CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, nonce_function_test_retry, extra) == 1); - CHECK(siglen > 0); - CHECK(secp256k1_ecdsa_sign(ctx, msg, sig2, &siglen2, key, nonce_function_rfc6979, extra) == 1); - CHECK(siglen > 0); - CHECK((siglen == siglen2) && (memcmp(sig, sig2, siglen) == 0)); - CHECK(secp256k1_ecdsa_sign_compact(ctx, msg, sig, key, nonce_function_test_retry, extra, &recid) == 1); - CHECK(!is_empty_compact_signature(sig)); - CHECK(secp256k1_ecdsa_sign_compact(ctx, msg, sig2, key, nonce_function_rfc6979, extra, &recid2) == 1); - CHECK(!is_empty_compact_signature(sig2)); - CHECK((recid == recid2) && (memcmp(sig, sig2, 64) == 0)); - /* The default nonce function is determinstic. */ - siglen = 72; - siglen2 = 72; - CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, NULL, extra) == 1); - CHECK(siglen > 0); - CHECK(secp256k1_ecdsa_sign(ctx, msg, sig2, &siglen2, key, NULL, extra) == 1); - CHECK(siglen2 > 0); - CHECK((siglen == siglen2) && (memcmp(sig, sig2, siglen) == 0)); - CHECK(secp256k1_ecdsa_sign_compact(ctx, msg, sig, key, NULL, extra, &recid) == 1); - CHECK(!is_empty_compact_signature(sig)); - CHECK(secp256k1_ecdsa_sign_compact(ctx, msg, sig2, key, NULL, extra, &recid2) == 1); - CHECK(!is_empty_compact_signature(sig)); - CHECK((recid == recid2) && (memcmp(sig, sig2, 64) == 0)); + CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, nonce_function_test_retry, extra) == 1); + CHECK(!is_empty_signature(&sig)); + CHECK(secp256k1_ecdsa_sign(ctx, &sig2, msg, key, nonce_function_rfc6979, extra) == 1); + CHECK(!is_empty_signature(&sig2)); + CHECK(memcmp(&sig, &sig2, sizeof(sig)) == 0); + /* The default nonce function is deterministic. */ + CHECK(secp256k1_ecdsa_sign(ctx, &sig2, msg, key, NULL, extra) == 1); + CHECK(!is_empty_signature(&sig2)); + CHECK(memcmp(&sig, &sig2, sizeof(sig)) == 0); /* The default nonce function changes output with different messages. */ for(i = 0; i < 256; i++) { int j; - siglen2 = 72; msg[0] = i; - CHECK(secp256k1_ecdsa_sign(ctx, msg, sig2, &siglen2, key, NULL, extra) == 1); - CHECK(!is_empty_compact_signature(sig)); - CHECK(secp256k1_ecdsa_sig_parse(&s[i], sig2, siglen2)); + CHECK(secp256k1_ecdsa_sign(ctx, &sig2, msg, key, NULL, extra) == 1); + CHECK(!is_empty_signature(&sig2)); + secp256k1_ecdsa_signature_load(ctx, &sr[i], &ss, &sig2); for (j = 0; j < i; j++) { - CHECK(!secp256k1_scalar_eq(&s[i].r, &s[j].r)); + CHECK(!secp256k1_scalar_eq(&sr[i], &sr[j])); } } msg[0] = 0; @@ -1899,17 +4284,45 @@ void test_ecdsa_edge_cases(void) { /* The default nonce function changes output with different keys. */ for(i = 256; i < 512; i++) { int j; - siglen2 = 72; key[0] = i - 256; - CHECK(secp256k1_ecdsa_sign(ctx, msg, sig2, &siglen2, key, NULL, extra) == 1); - CHECK(secp256k1_ecdsa_sig_parse(&s[i], sig2, siglen2)); + CHECK(secp256k1_ecdsa_sign(ctx, &sig2, msg, key, NULL, extra) == 1); + CHECK(!is_empty_signature(&sig2)); + secp256k1_ecdsa_signature_load(ctx, &sr[i], &ss, &sig2); for (j = 0; j < i; j++) { - CHECK(!secp256k1_scalar_eq(&s[i].r, &s[j].r)); + CHECK(!secp256k1_scalar_eq(&sr[i], &sr[j])); } } key[0] = 0; } + { + /* Check that optional nonce arguments do not have equivalent effect. */ + const unsigned char zeros[32] = {0}; + unsigned char nonce[32]; + unsigned char nonce2[32]; + unsigned char nonce3[32]; + unsigned char nonce4[32]; + VG_UNDEF(nonce,32); + VG_UNDEF(nonce2,32); + VG_UNDEF(nonce3,32); + VG_UNDEF(nonce4,32); + CHECK(nonce_function_rfc6979(nonce, zeros, zeros, NULL, NULL, 0) == 1); + VG_CHECK(nonce,32); + CHECK(nonce_function_rfc6979(nonce2, zeros, zeros, zeros, NULL, 0) == 1); + VG_CHECK(nonce2,32); + CHECK(nonce_function_rfc6979(nonce3, zeros, zeros, NULL, (void *)zeros, 0) == 1); + VG_CHECK(nonce3,32); + CHECK(nonce_function_rfc6979(nonce4, zeros, zeros, zeros, (void *)zeros, 0) == 1); + VG_CHECK(nonce4,32); + CHECK(memcmp(nonce, nonce2, 32) != 0); + CHECK(memcmp(nonce, nonce3, 32) != 0); + CHECK(memcmp(nonce, nonce4, 32) != 0); + CHECK(memcmp(nonce2, nonce3, 32) != 0); + CHECK(memcmp(nonce2, nonce4, 32) != 0); + CHECK(memcmp(nonce3, nonce4, 32) != 0); + } + + /* Privkey export where pubkey is the point at infinity. */ { unsigned char privkey[300]; @@ -1919,9 +4332,10 @@ void test_ecdsa_edge_cases(void) { 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41, }; - int outlen = 300; - CHECK(!secp256k1_ec_privkey_export(ctx, seckey, privkey, &outlen, 0)); - CHECK(!secp256k1_ec_privkey_export(ctx, seckey, privkey, &outlen, 1)); + size_t outlen = 300; + CHECK(!ec_privkey_export_der(ctx, privkey, &outlen, seckey, 0)); + outlen = 300; + CHECK(!ec_privkey_export_der(ctx, privkey, &outlen, seckey, 1)); } } @@ -1930,46 +4344,48 @@ void run_ecdsa_edge_cases(void) { } #ifdef ENABLE_OPENSSL_TESTS -EC_KEY *get_openssl_key(const secp256k1_scalar_t *key) { +EC_KEY *get_openssl_key(const unsigned char *key32) { unsigned char privkey[300]; - int privkeylen; + size_t privkeylen; const unsigned char* pbegin = privkey; - int compr = secp256k1_rand32() & 1; + int compr = secp256k1_rand_bits(1); EC_KEY *ec_key = EC_KEY_new_by_curve_name(NID_secp256k1); - CHECK(secp256k1_eckey_privkey_serialize(&ctx->ecmult_gen_ctx, privkey, &privkeylen, key, compr)); + CHECK(ec_privkey_export_der(ctx, privkey, &privkeylen, key32, compr)); CHECK(d2i_ECPrivateKey(&ec_key, &pbegin, privkeylen)); CHECK(EC_KEY_check_key(ec_key)); return ec_key; } void test_ecdsa_openssl(void) { - secp256k1_gej_t qj; - secp256k1_ge_t q; - secp256k1_ecdsa_sig_t sig; - secp256k1_scalar_t one; - secp256k1_scalar_t msg2; - secp256k1_scalar_t key, msg; + secp256k1_gej qj; + secp256k1_ge q; + secp256k1_scalar sigr, sigs; + secp256k1_scalar one; + secp256k1_scalar msg2; + secp256k1_scalar key, msg; EC_KEY *ec_key; unsigned int sigsize = 80; - int secp_sigsize = 80; + size_t secp_sigsize = 80; unsigned char message[32]; unsigned char signature[80]; + unsigned char key32[32]; secp256k1_rand256_test(message); secp256k1_scalar_set_b32(&msg, message, NULL); random_scalar_order_test(&key); + secp256k1_scalar_get_b32(key32, &key); secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &qj, &key); secp256k1_ge_set_gej(&q, &qj); - ec_key = get_openssl_key(&key); - CHECK(ec_key); + ec_key = get_openssl_key(key32); + CHECK(ec_key != NULL); CHECK(ECDSA_sign(0, message, sizeof(message), signature, &sigsize, ec_key)); - CHECK(secp256k1_ecdsa_sig_parse(&sig, signature, sigsize)); - CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sig, &q, &msg)); + CHECK(secp256k1_ecdsa_sig_parse(&sigr, &sigs, signature, sigsize)); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sigr, &sigs, &q, &msg)); secp256k1_scalar_set_int(&one, 1); secp256k1_scalar_add(&msg2, &msg, &one); - CHECK(!secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sig, &q, &msg2)); + CHECK(!secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sigr, &sigs, &q, &msg2)); - random_sign(&sig, &key, &msg, NULL); - CHECK(secp256k1_ecdsa_sig_serialize(signature, &secp_sigsize, &sig)); + random_sign(&sigr, &sigs, &key, &msg, NULL); + CHECK(secp256k1_ecdsa_sig_serialize(signature, &secp_sigsize, &sigr, &sigs)); CHECK(ECDSA_verify(0, message, sizeof(message), signature, secp_sigsize, ec_key) == 1); EC_KEY_free(ec_key); @@ -1983,6 +4399,14 @@ void run_ecdsa_openssl(void) { } #endif +#ifdef ENABLE_MODULE_ECDH +# include "modules/ecdh/tests_impl.h" +#endif + +#ifdef ENABLE_MODULE_RECOVERY +# include "modules/recovery/tests_impl.h" +#endif + int main(int argc, char **argv) { unsigned char seed16[16] = {0}; unsigned char run32[32] = {0}; @@ -2007,7 +4431,7 @@ int main(int argc, char **argv) { } } else { FILE *frand = fopen("/dev/urandom", "r"); - if (!frand || !fread(&seed16, sizeof(seed16), 1, frand)) { + if ((frand == NULL) || !fread(&seed16, sizeof(seed16), 1, frand)) { uint64_t t = time(NULL) * (uint64_t)1337; seed16[0] ^= t; seed16[1] ^= t >> 8; @@ -2028,12 +4452,14 @@ int main(int argc, char **argv) { /* initialize */ run_context_tests(); ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); - - if (secp256k1_rand32() & 1) { + if (secp256k1_rand_bits(1)) { secp256k1_rand256(run32); - CHECK(secp256k1_context_randomize(ctx, secp256k1_rand32() & 1 ? run32 : NULL)); + CHECK(secp256k1_context_randomize(ctx, secp256k1_rand_bits(1) ? run32 : NULL)); } + run_rand_bits(); + run_rand_int(); + run_sha256_tests(); run_hmac_sha256_tests(); run_rfc6979_hmac_sha256_tests(); @@ -2057,6 +4483,7 @@ int main(int argc, char **argv) { /* group tests */ run_ge(); + run_group_decompress(); /* ecmult tests */ run_wnaf(); @@ -2064,9 +4491,28 @@ int main(int argc, char **argv) { run_ecmult_chain(); run_ecmult_constants(); run_ecmult_gen_blind(); + run_ecmult_const_tests(); + run_ec_combine(); + + /* endomorphism tests */ +#ifdef USE_ENDOMORPHISM + run_endomorphism_tests(); +#endif + + /* EC point parser test */ + run_ec_pubkey_parse_test(); + + /* EC key edge cases */ + run_eckey_edge_case_test(); + +#ifdef ENABLE_MODULE_ECDH + /* ecdh tests */ + run_ecdh_tests(); +#endif /* ecdsa tests */ run_random_pubkeys(); + run_ecdsa_der_parse(); run_ecdsa_sign_verify(); run_ecdsa_end_to_end(); run_ecdsa_edge_cases(); @@ -2074,10 +4520,17 @@ int main(int argc, char **argv) { run_ecdsa_openssl(); #endif +#ifdef ENABLE_MODULE_RECOVERY + /* ECDSA pubkey recovery tests */ + run_recovery_tests(); +#endif + secp256k1_rand256(run32); printf("random run = %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n", run32[0], run32[1], run32[2], run32[3], run32[4], run32[5], run32[6], run32[7], run32[8], run32[9], run32[10], run32[11], run32[12], run32[13], run32[14], run32[15]); /* shutdown */ secp256k1_context_destroy(ctx); + + printf("no problems found\n"); return 0; } diff --git a/src/cryptoconditions/src/include/secp256k1/src/tests_exhaustive.c b/src/cryptoconditions/src/include/secp256k1/src/tests_exhaustive.c new file mode 100644 index 000000000..b040bb073 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/tests_exhaustive.c @@ -0,0 +1,470 @@ +/*********************************************************************** + * Copyright (c) 2016 Andrew Poelstra * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#if defined HAVE_CONFIG_H +#include "libsecp256k1-config.h" +#endif + +#include +#include + +#include + +#undef USE_ECMULT_STATIC_PRECOMPUTATION + +#ifndef EXHAUSTIVE_TEST_ORDER +/* see group_impl.h for allowable values */ +#define EXHAUSTIVE_TEST_ORDER 13 +#define EXHAUSTIVE_TEST_LAMBDA 9 /* cube root of 1 mod 13 */ +#endif + +#include "include/secp256k1.h" +#include "group.h" +#include "secp256k1.c" +#include "testrand_impl.h" + +#ifdef ENABLE_MODULE_RECOVERY +#include "src/modules/recovery/main_impl.h" +#include "include/secp256k1_recovery.h" +#endif + +/** stolen from tests.c */ +void ge_equals_ge(const secp256k1_ge *a, const secp256k1_ge *b) { + CHECK(a->infinity == b->infinity); + if (a->infinity) { + return; + } + CHECK(secp256k1_fe_equal_var(&a->x, &b->x)); + CHECK(secp256k1_fe_equal_var(&a->y, &b->y)); +} + +void ge_equals_gej(const secp256k1_ge *a, const secp256k1_gej *b) { + secp256k1_fe z2s; + secp256k1_fe u1, u2, s1, s2; + CHECK(a->infinity == b->infinity); + if (a->infinity) { + return; + } + /* Check a.x * b.z^2 == b.x && a.y * b.z^3 == b.y, to avoid inverses. */ + secp256k1_fe_sqr(&z2s, &b->z); + secp256k1_fe_mul(&u1, &a->x, &z2s); + u2 = b->x; secp256k1_fe_normalize_weak(&u2); + secp256k1_fe_mul(&s1, &a->y, &z2s); secp256k1_fe_mul(&s1, &s1, &b->z); + s2 = b->y; secp256k1_fe_normalize_weak(&s2); + CHECK(secp256k1_fe_equal_var(&u1, &u2)); + CHECK(secp256k1_fe_equal_var(&s1, &s2)); +} + +void random_fe(secp256k1_fe *x) { + unsigned char bin[32]; + do { + secp256k1_rand256(bin); + if (secp256k1_fe_set_b32(x, bin)) { + return; + } + } while(1); +} +/** END stolen from tests.c */ + +int secp256k1_nonce_function_smallint(unsigned char *nonce32, const unsigned char *msg32, + const unsigned char *key32, const unsigned char *algo16, + void *data, unsigned int attempt) { + secp256k1_scalar s; + int *idata = data; + (void)msg32; + (void)key32; + (void)algo16; + /* Some nonces cannot be used because they'd cause s and/or r to be zero. + * The signing function has retry logic here that just re-calls the nonce + * function with an increased `attempt`. So if attempt > 0 this means we + * need to change the nonce to avoid an infinite loop. */ + if (attempt > 0) { + *idata = (*idata + 1) % EXHAUSTIVE_TEST_ORDER; + } + secp256k1_scalar_set_int(&s, *idata); + secp256k1_scalar_get_b32(nonce32, &s); + return 1; +} + +#ifdef USE_ENDOMORPHISM +void test_exhaustive_endomorphism(const secp256k1_ge *group, int order) { + int i; + for (i = 0; i < order; i++) { + secp256k1_ge res; + secp256k1_ge_mul_lambda(&res, &group[i]); + ge_equals_ge(&group[i * EXHAUSTIVE_TEST_LAMBDA % EXHAUSTIVE_TEST_ORDER], &res); + } +} +#endif + +void test_exhaustive_addition(const secp256k1_ge *group, const secp256k1_gej *groupj, int order) { + int i, j; + + /* Sanity-check (and check infinity functions) */ + CHECK(secp256k1_ge_is_infinity(&group[0])); + CHECK(secp256k1_gej_is_infinity(&groupj[0])); + for (i = 1; i < order; i++) { + CHECK(!secp256k1_ge_is_infinity(&group[i])); + CHECK(!secp256k1_gej_is_infinity(&groupj[i])); + } + + /* Check all addition formulae */ + for (j = 0; j < order; j++) { + secp256k1_fe fe_inv; + secp256k1_fe_inv(&fe_inv, &groupj[j].z); + for (i = 0; i < order; i++) { + secp256k1_ge zless_gej; + secp256k1_gej tmp; + /* add_var */ + secp256k1_gej_add_var(&tmp, &groupj[i], &groupj[j], NULL); + ge_equals_gej(&group[(i + j) % order], &tmp); + /* add_ge */ + if (j > 0) { + secp256k1_gej_add_ge(&tmp, &groupj[i], &group[j]); + ge_equals_gej(&group[(i + j) % order], &tmp); + } + /* add_ge_var */ + secp256k1_gej_add_ge_var(&tmp, &groupj[i], &group[j], NULL); + ge_equals_gej(&group[(i + j) % order], &tmp); + /* add_zinv_var */ + zless_gej.infinity = groupj[j].infinity; + zless_gej.x = groupj[j].x; + zless_gej.y = groupj[j].y; + secp256k1_gej_add_zinv_var(&tmp, &groupj[i], &zless_gej, &fe_inv); + ge_equals_gej(&group[(i + j) % order], &tmp); + } + } + + /* Check doubling */ + for (i = 0; i < order; i++) { + secp256k1_gej tmp; + if (i > 0) { + secp256k1_gej_double_nonzero(&tmp, &groupj[i], NULL); + ge_equals_gej(&group[(2 * i) % order], &tmp); + } + secp256k1_gej_double_var(&tmp, &groupj[i], NULL); + ge_equals_gej(&group[(2 * i) % order], &tmp); + } + + /* Check negation */ + for (i = 1; i < order; i++) { + secp256k1_ge tmp; + secp256k1_gej tmpj; + secp256k1_ge_neg(&tmp, &group[i]); + ge_equals_ge(&group[order - i], &tmp); + secp256k1_gej_neg(&tmpj, &groupj[i]); + ge_equals_gej(&group[order - i], &tmpj); + } +} + +void test_exhaustive_ecmult(const secp256k1_context *ctx, const secp256k1_ge *group, const secp256k1_gej *groupj, int order) { + int i, j, r_log; + for (r_log = 1; r_log < order; r_log++) { + for (j = 0; j < order; j++) { + for (i = 0; i < order; i++) { + secp256k1_gej tmp; + secp256k1_scalar na, ng; + secp256k1_scalar_set_int(&na, i); + secp256k1_scalar_set_int(&ng, j); + + secp256k1_ecmult(&ctx->ecmult_ctx, &tmp, &groupj[r_log], &na, &ng); + ge_equals_gej(&group[(i * r_log + j) % order], &tmp); + + if (i > 0) { + secp256k1_ecmult_const(&tmp, &group[i], &ng); + ge_equals_gej(&group[(i * j) % order], &tmp); + } + } + } + } +} + +void r_from_k(secp256k1_scalar *r, const secp256k1_ge *group, int k) { + secp256k1_fe x; + unsigned char x_bin[32]; + k %= EXHAUSTIVE_TEST_ORDER; + x = group[k].x; + secp256k1_fe_normalize(&x); + secp256k1_fe_get_b32(x_bin, &x); + secp256k1_scalar_set_b32(r, x_bin, NULL); +} + +void test_exhaustive_verify(const secp256k1_context *ctx, const secp256k1_ge *group, int order) { + int s, r, msg, key; + for (s = 1; s < order; s++) { + for (r = 1; r < order; r++) { + for (msg = 1; msg < order; msg++) { + for (key = 1; key < order; key++) { + secp256k1_ge nonconst_ge; + secp256k1_ecdsa_signature sig; + secp256k1_pubkey pk; + secp256k1_scalar sk_s, msg_s, r_s, s_s; + secp256k1_scalar s_times_k_s, msg_plus_r_times_sk_s; + int k, should_verify; + unsigned char msg32[32]; + + secp256k1_scalar_set_int(&s_s, s); + secp256k1_scalar_set_int(&r_s, r); + secp256k1_scalar_set_int(&msg_s, msg); + secp256k1_scalar_set_int(&sk_s, key); + + /* Verify by hand */ + /* Run through every k value that gives us this r and check that *one* works. + * Note there could be none, there could be multiple, ECDSA is weird. */ + should_verify = 0; + for (k = 0; k < order; k++) { + secp256k1_scalar check_x_s; + r_from_k(&check_x_s, group, k); + if (r_s == check_x_s) { + secp256k1_scalar_set_int(&s_times_k_s, k); + secp256k1_scalar_mul(&s_times_k_s, &s_times_k_s, &s_s); + secp256k1_scalar_mul(&msg_plus_r_times_sk_s, &r_s, &sk_s); + secp256k1_scalar_add(&msg_plus_r_times_sk_s, &msg_plus_r_times_sk_s, &msg_s); + should_verify |= secp256k1_scalar_eq(&s_times_k_s, &msg_plus_r_times_sk_s); + } + } + /* nb we have a "high s" rule */ + should_verify &= !secp256k1_scalar_is_high(&s_s); + + /* Verify by calling verify */ + secp256k1_ecdsa_signature_save(&sig, &r_s, &s_s); + memcpy(&nonconst_ge, &group[sk_s], sizeof(nonconst_ge)); + secp256k1_pubkey_save(&pk, &nonconst_ge); + secp256k1_scalar_get_b32(msg32, &msg_s); + CHECK(should_verify == + secp256k1_ecdsa_verify(ctx, &sig, msg32, &pk)); + } + } + } + } +} + +void test_exhaustive_sign(const secp256k1_context *ctx, const secp256k1_ge *group, int order) { + int i, j, k; + + /* Loop */ + for (i = 1; i < order; i++) { /* message */ + for (j = 1; j < order; j++) { /* key */ + for (k = 1; k < order; k++) { /* nonce */ + const int starting_k = k; + secp256k1_ecdsa_signature sig; + secp256k1_scalar sk, msg, r, s, expected_r; + unsigned char sk32[32], msg32[32]; + secp256k1_scalar_set_int(&msg, i); + secp256k1_scalar_set_int(&sk, j); + secp256k1_scalar_get_b32(sk32, &sk); + secp256k1_scalar_get_b32(msg32, &msg); + + secp256k1_ecdsa_sign(ctx, &sig, msg32, sk32, secp256k1_nonce_function_smallint, &k); + + secp256k1_ecdsa_signature_load(ctx, &r, &s, &sig); + /* Note that we compute expected_r *after* signing -- this is important + * because our nonce-computing function function might change k during + * signing. */ + r_from_k(&expected_r, group, k); + CHECK(r == expected_r); + CHECK((k * s) % order == (i + r * j) % order || + (k * (EXHAUSTIVE_TEST_ORDER - s)) % order == (i + r * j) % order); + + /* Overflow means we've tried every possible nonce */ + if (k < starting_k) { + break; + } + } + } + } + + /* We would like to verify zero-knowledge here by counting how often every + * possible (s, r) tuple appears, but because the group order is larger + * than the field order, when coercing the x-values to scalar values, some + * appear more often than others, so we are actually not zero-knowledge. + * (This effect also appears in the real code, but the difference is on the + * order of 1/2^128th the field order, so the deviation is not useful to a + * computationally bounded attacker.) + */ +} + +#ifdef ENABLE_MODULE_RECOVERY +void test_exhaustive_recovery_sign(const secp256k1_context *ctx, const secp256k1_ge *group, int order) { + int i, j, k; + + /* Loop */ + for (i = 1; i < order; i++) { /* message */ + for (j = 1; j < order; j++) { /* key */ + for (k = 1; k < order; k++) { /* nonce */ + const int starting_k = k; + secp256k1_fe r_dot_y_normalized; + secp256k1_ecdsa_recoverable_signature rsig; + secp256k1_ecdsa_signature sig; + secp256k1_scalar sk, msg, r, s, expected_r; + unsigned char sk32[32], msg32[32]; + int expected_recid; + int recid; + secp256k1_scalar_set_int(&msg, i); + secp256k1_scalar_set_int(&sk, j); + secp256k1_scalar_get_b32(sk32, &sk); + secp256k1_scalar_get_b32(msg32, &msg); + + secp256k1_ecdsa_sign_recoverable(ctx, &rsig, msg32, sk32, secp256k1_nonce_function_smallint, &k); + + /* Check directly */ + secp256k1_ecdsa_recoverable_signature_load(ctx, &r, &s, &recid, &rsig); + r_from_k(&expected_r, group, k); + CHECK(r == expected_r); + CHECK((k * s) % order == (i + r * j) % order || + (k * (EXHAUSTIVE_TEST_ORDER - s)) % order == (i + r * j) % order); + /* In computing the recid, there is an overflow condition that is disabled in + * scalar_low_impl.h `secp256k1_scalar_set_b32` because almost every r.y value + * will exceed the group order, and our signing code always holds out for r + * values that don't overflow, so with a proper overflow check the tests would + * loop indefinitely. */ + r_dot_y_normalized = group[k].y; + secp256k1_fe_normalize(&r_dot_y_normalized); + /* Also the recovery id is flipped depending if we hit the low-s branch */ + if ((k * s) % order == (i + r * j) % order) { + expected_recid = secp256k1_fe_is_odd(&r_dot_y_normalized) ? 1 : 0; + } else { + expected_recid = secp256k1_fe_is_odd(&r_dot_y_normalized) ? 0 : 1; + } + CHECK(recid == expected_recid); + + /* Convert to a standard sig then check */ + secp256k1_ecdsa_recoverable_signature_convert(ctx, &sig, &rsig); + secp256k1_ecdsa_signature_load(ctx, &r, &s, &sig); + /* Note that we compute expected_r *after* signing -- this is important + * because our nonce-computing function function might change k during + * signing. */ + r_from_k(&expected_r, group, k); + CHECK(r == expected_r); + CHECK((k * s) % order == (i + r * j) % order || + (k * (EXHAUSTIVE_TEST_ORDER - s)) % order == (i + r * j) % order); + + /* Overflow means we've tried every possible nonce */ + if (k < starting_k) { + break; + } + } + } + } +} + +void test_exhaustive_recovery_verify(const secp256k1_context *ctx, const secp256k1_ge *group, int order) { + /* This is essentially a copy of test_exhaustive_verify, with recovery added */ + int s, r, msg, key; + for (s = 1; s < order; s++) { + for (r = 1; r < order; r++) { + for (msg = 1; msg < order; msg++) { + for (key = 1; key < order; key++) { + secp256k1_ge nonconst_ge; + secp256k1_ecdsa_recoverable_signature rsig; + secp256k1_ecdsa_signature sig; + secp256k1_pubkey pk; + secp256k1_scalar sk_s, msg_s, r_s, s_s; + secp256k1_scalar s_times_k_s, msg_plus_r_times_sk_s; + int recid = 0; + int k, should_verify; + unsigned char msg32[32]; + + secp256k1_scalar_set_int(&s_s, s); + secp256k1_scalar_set_int(&r_s, r); + secp256k1_scalar_set_int(&msg_s, msg); + secp256k1_scalar_set_int(&sk_s, key); + secp256k1_scalar_get_b32(msg32, &msg_s); + + /* Verify by hand */ + /* Run through every k value that gives us this r and check that *one* works. + * Note there could be none, there could be multiple, ECDSA is weird. */ + should_verify = 0; + for (k = 0; k < order; k++) { + secp256k1_scalar check_x_s; + r_from_k(&check_x_s, group, k); + if (r_s == check_x_s) { + secp256k1_scalar_set_int(&s_times_k_s, k); + secp256k1_scalar_mul(&s_times_k_s, &s_times_k_s, &s_s); + secp256k1_scalar_mul(&msg_plus_r_times_sk_s, &r_s, &sk_s); + secp256k1_scalar_add(&msg_plus_r_times_sk_s, &msg_plus_r_times_sk_s, &msg_s); + should_verify |= secp256k1_scalar_eq(&s_times_k_s, &msg_plus_r_times_sk_s); + } + } + /* nb we have a "high s" rule */ + should_verify &= !secp256k1_scalar_is_high(&s_s); + + /* We would like to try recovering the pubkey and checking that it matches, + * but pubkey recovery is impossible in the exhaustive tests (the reason + * being that there are 12 nonzero r values, 12 nonzero points, and no + * overlap between the sets, so there are no valid signatures). */ + + /* Verify by converting to a standard signature and calling verify */ + secp256k1_ecdsa_recoverable_signature_save(&rsig, &r_s, &s_s, recid); + secp256k1_ecdsa_recoverable_signature_convert(ctx, &sig, &rsig); + memcpy(&nonconst_ge, &group[sk_s], sizeof(nonconst_ge)); + secp256k1_pubkey_save(&pk, &nonconst_ge); + CHECK(should_verify == + secp256k1_ecdsa_verify(ctx, &sig, msg32, &pk)); + } + } + } + } +} +#endif + +int main(void) { + int i; + secp256k1_gej groupj[EXHAUSTIVE_TEST_ORDER]; + secp256k1_ge group[EXHAUSTIVE_TEST_ORDER]; + + /* Build context */ + secp256k1_context *ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); + + /* TODO set z = 1, then do num_tests runs with random z values */ + + /* Generate the entire group */ + secp256k1_gej_set_infinity(&groupj[0]); + secp256k1_ge_set_gej(&group[0], &groupj[0]); + for (i = 1; i < EXHAUSTIVE_TEST_ORDER; i++) { + /* Set a different random z-value for each Jacobian point */ + secp256k1_fe z; + random_fe(&z); + + secp256k1_gej_add_ge(&groupj[i], &groupj[i - 1], &secp256k1_ge_const_g); + secp256k1_ge_set_gej(&group[i], &groupj[i]); + secp256k1_gej_rescale(&groupj[i], &z); + + /* Verify against ecmult_gen */ + { + secp256k1_scalar scalar_i; + secp256k1_gej generatedj; + secp256k1_ge generated; + + secp256k1_scalar_set_int(&scalar_i, i); + secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &generatedj, &scalar_i); + secp256k1_ge_set_gej(&generated, &generatedj); + + CHECK(group[i].infinity == 0); + CHECK(generated.infinity == 0); + CHECK(secp256k1_fe_equal_var(&generated.x, &group[i].x)); + CHECK(secp256k1_fe_equal_var(&generated.y, &group[i].y)); + } + } + + /* Run the tests */ +#ifdef USE_ENDOMORPHISM + test_exhaustive_endomorphism(group, EXHAUSTIVE_TEST_ORDER); +#endif + test_exhaustive_addition(group, groupj, EXHAUSTIVE_TEST_ORDER); + test_exhaustive_ecmult(ctx, group, groupj, EXHAUSTIVE_TEST_ORDER); + test_exhaustive_sign(ctx, group, EXHAUSTIVE_TEST_ORDER); + test_exhaustive_verify(ctx, group, EXHAUSTIVE_TEST_ORDER); + +#ifdef ENABLE_MODULE_RECOVERY + test_exhaustive_recovery_sign(ctx, group, EXHAUSTIVE_TEST_ORDER); + test_exhaustive_recovery_verify(ctx, group, EXHAUSTIVE_TEST_ORDER); +#endif + + secp256k1_context_destroy(ctx); + return 0; +} + diff --git a/src/cryptoconditions/src/include/secp256k1/src/util.h b/src/cryptoconditions/src/include/secp256k1/src/util.h index ae98639f7..b0441d8e3 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/util.h +++ b/src/cryptoconditions/src/include/secp256k1/src/util.h @@ -4,8 +4,8 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ -#ifndef _SECP256K1_UTIL_H_ -#define _SECP256K1_UTIL_H_ +#ifndef SECP256K1_UTIL_H +#define SECP256K1_UTIL_H #if defined HAVE_CONFIG_H #include "libsecp256k1-config.h" @@ -15,6 +15,15 @@ #include #include +typedef struct { + void (*fn)(const char *text, void* data); + const void* data; +} secp256k1_callback; + +static SECP256K1_INLINE void secp256k1_callback_call(const secp256k1_callback * const cb, const char * const text) { + cb->fn(text, (void*)cb->data); +} + #ifdef DETERMINISTIC #define TEST_FAILURE(msg) do { \ fprintf(stderr, "%s\n", msg); \ @@ -47,23 +56,23 @@ } while(0) #endif -/* Like assert(), but safe to use on expressions with side effects. */ -#ifndef NDEBUG -#define DEBUG_CHECK CHECK -#else -#define DEBUG_CHECK(cond) do { (void)(cond); } while(0) -#endif - -/* Like DEBUG_CHECK(), but when VERIFY is defined instead of NDEBUG not defined. */ -#ifdef VERIFY +/* Like assert(), but when VERIFY is defined, and side-effect safe. */ +#if defined(COVERAGE) +#define VERIFY_CHECK(check) +#define VERIFY_SETUP(stmt) +#elif defined(VERIFY) #define VERIFY_CHECK CHECK +#define VERIFY_SETUP(stmt) do { stmt; } while(0) #else #define VERIFY_CHECK(cond) do { (void)(cond); } while(0) +#define VERIFY_SETUP(stmt) #endif -static SECP256K1_INLINE void *checked_malloc(size_t size) { +static SECP256K1_INLINE void *checked_malloc(const secp256k1_callback* cb, size_t size) { void *ret = malloc(size); - CHECK(ret != NULL); + if (ret == NULL) { + secp256k1_callback_call(cb, "Out of memory"); + } return ret; } @@ -101,4 +110,4 @@ static SECP256K1_INLINE void *checked_malloc(size_t size) { SECP256K1_GNUC_EXT typedef unsigned __int128 uint128_t; #endif -#endif +#endif /* SECP256K1_UTIL_H */ diff --git a/src/cryptoconditions/src/secp256k1.c b/src/cryptoconditions/src/secp256k1.c index 9e09cabe5..895e91b32 100644 --- a/src/cryptoconditions/src/secp256k1.c +++ b/src/cryptoconditions/src/secp256k1.c @@ -23,7 +23,7 @@ static const size_t SECP256K1_SK_SIZE = 32; static const size_t SECP256K1_SIG_SIZE = 64; -secp256k1_context_t *ec_ctx_sign = 0, *ec_ctx_verify = 0; +secp256k1_context *ec_ctx_sign = 0, *ec_ctx_verify = 0; pthread_mutex_t cc_secp256k1ContextLock = PTHREAD_MUTEX_INITIALIZER; @@ -75,16 +75,25 @@ static unsigned char *secp256k1Fingerprint(const CC *cond) { int secp256k1Verify(CC *cond, CCVisitor visitor) { if (cond->type->typeId != cc_secp256k1Type.typeId) return 1; - // TODO: test failure mode: empty sig / null pointer initVerify(); - // Test for non canonical S - int rc = secp256k1_ecdsa_check_canonical_sig(cond->signature, SECP256K1_SIG_SIZE); - if (rc == 1) - // Test for correct sig - rc = secp256k1_ecdsa_verify(ec_ctx_verify, visitor.msg, cond->signature, SECP256K1_SIG_SIZE, - cond->publicKey, SECP256K1_PK_SIZE); - return rc == 1; + int rc; + + // parse pubkey + secp256k1_pubkey pk; + rc = secp256k1_ec_pubkey_parse(ec_ctx_verify, &pk, cond->publicKey, SECP256K1_PK_SIZE); + if (rc != 1) return 0; + + // parse siganature + secp256k1_ecdsa_signature sig; + rc = secp256k1_ecdsa_signature_parse_compact(ec_ctx_verify, &sig, cond->signature); + if (rc != 1) return 0; + + // Only accepts lower S signatures + rc = secp256k1_ecdsa_verify(ec_ctx_verify, &sig, visitor.msg, &pk); + if (rc != 1) return 0; + + return 1; } @@ -119,15 +128,19 @@ static int secp256k1Sign(CC *cond, CCVisitor visitor) { if (cond->type->typeId != cc_secp256k1Type.typeId) return 1; CCSecp256k1SigningData *signing = (CCSecp256k1SigningData*) visitor.context; if (0 != memcmp(cond->publicKey, signing->pk, SECP256K1_PK_SIZE)) return 1; - if (!cond->signature) cond->signature = calloc(1, SECP256K1_SIG_SIZE); + + secp256k1_ecdsa_signature sig; lockSign(); - int rc = secp256k1_ecdsa_sign_compact(ec_ctx_sign, visitor.msg, cond->signature, signing->sk, NULL, NULL, NULL); + int rc = secp256k1_ecdsa_sign(ec_ctx_sign, &sig, visitor.msg, signing->sk, NULL, NULL); unlockSign(); - if (rc) { - signing->nSigned++; - return 1; - } - return 0; + + if (rc != 1) return 0; + + if (!cond->signature) cond->signature = calloc(1, SECP256K1_SIG_SIZE); + secp256k1_ecdsa_signature_serialize_compact(ec_ctx_verify, cond->signature, &sig); + + signing->nSigned++; + return 1; } @@ -140,14 +153,24 @@ int cc_signTreeSecp256k1Msg32(CC *cond, const unsigned char *privateKey, const u // how to combine message and prefix into 32 byte hash return 0; } + + // derive the pubkey + secp256k1_pubkey spk; + lockSign(); + int rc = secp256k1_ec_pubkey_create(ec_ctx_sign, &spk, privateKey); + unlockSign(); + if (rc != 1) return 0; + + // serialize pubkey unsigned char *publicKey = calloc(1, SECP256K1_PK_SIZE); + size_t ol = SECP256K1_PK_SIZE; + secp256k1_ec_pubkey_serialize(ec_ctx_verify, publicKey, &ol, &spk, SECP256K1_EC_COMPRESSED); + + // sign CCSecp256k1SigningData signing = {publicKey, privateKey, 0}; CCVisitor visitor = {&secp256k1Sign, msg32, 32, &signing}; - int ol = 0; - lockSign(); - int rc = secp256k1_ec_pubkey_create(ec_ctx_sign, publicKey, &ol, privateKey, 1); - unlockSign(); - if (rc) cc_visit(cond, visitor); + cc_visit(cond, visitor); + free(publicKey); return signing.nSigned; } @@ -159,15 +182,16 @@ static unsigned long secp256k1Cost(const CC *cond) { static CC *cc_secp256k1Condition(const unsigned char *publicKey, const unsigned char *signature) { - unsigned char *pk = 0, *sig = 0; - - + // Check that pk parses initVerify(); - int rc = secp256k1_ec_pubkey_verify(ec_ctx_verify, publicKey, SECP256K1_PK_SIZE); + secp256k1_pubkey spk; + int rc = secp256k1_ec_pubkey_parse(ec_ctx_verify, &spk, publicKey, SECP256K1_PK_SIZE); if (!rc) { return NULL; } + unsigned char *pk = 0, *sig = 0; + pk = calloc(1, SECP256K1_PK_SIZE); memcpy(pk, publicKey, SECP256K1_PK_SIZE); if (signature) { diff --git a/src/cryptoconditions/test-requirements.txt b/src/cryptoconditions/test-requirements.txt index 2858c9ae3..3e7a933b9 100644 --- a/src/cryptoconditions/test-requirements.txt +++ b/src/cryptoconditions/test-requirements.txt @@ -1,3 +1,3 @@ -nose base58==0.2.5 secp256k1 +pytest diff --git a/src/cryptoconditions/tests/test_ed25519.py b/src/cryptoconditions/tests/test_ed25519.py index 081a7efd5..271b9b023 100644 --- a/src/cryptoconditions/tests/test_ed25519.py +++ b/src/cryptoconditions/tests/test_ed25519.py @@ -1,6 +1,6 @@ import json import base64 -from test_vectors import jsonRPC +from .test_vectors import jsonRPC def test_sign_ed25519_pass_simple(): diff --git a/src/cryptoconditions/tests/test_failure_modes.py b/src/cryptoconditions/tests/test_failure_modes.py index 4e252424f..839eded3b 100644 --- a/src/cryptoconditions/tests/test_failure_modes.py +++ b/src/cryptoconditions/tests/test_failure_modes.py @@ -1,7 +1,7 @@ import json import ctypes import base64 -from test_vectors import jsonRPC, so, decode_base64 as d64 +from .test_vectors import jsonRPC, so, decode_base64 as d64 ''' diff --git a/src/cryptoconditions/tests/test_secp256k1.py b/src/cryptoconditions/tests/test_secp256k1.py index db36da218..bbc9462fa 100644 --- a/src/cryptoconditions/tests/test_secp256k1.py +++ b/src/cryptoconditions/tests/test_secp256k1.py @@ -2,7 +2,7 @@ import json import base64 import hashlib import secp256k1 -from test_vectors import jsonRPC, encode_base64, decode_base64 +from .test_vectors import jsonRPC, encode_base64, decode_base64 key = secp256k1.PrivateKey() @@ -20,7 +20,7 @@ def test_sign_secp256k1_pass_simple(): 'message': msg, }) - sig = encode_base64(key.ecdsa_serialize_compact(key.ecdsa_sign(msg))) + sig = encode_base64(key.ecdsa_serialize_compact(key.ecdsa_sign(msg.encode()))) assert res == { "num_signed": 1, diff --git a/src/cryptoconditions/tests/test_vectors.py b/src/cryptoconditions/tests/test_vectors.py index b94ed9461..34ed9a7d3 100644 --- a/src/cryptoconditions/tests/test_vectors.py +++ b/src/cryptoconditions/tests/test_vectors.py @@ -114,11 +114,15 @@ def decode_base64(data): def encode_base64(data): - return base64.urlsafe_b64encode(data).rstrip(b'=') + if type(data) == str: + data = data.encode() + return base64.urlsafe_b64encode(data).rstrip(b'=').decode() def b16_to_b64(b16): - return encode_base64(base64.b16decode(b16)).decode() + if type(b16) == str: + b16 = b16.encode() + return encode_base64(base64.b16decode(b16)) def _read_vectors(name): diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 444e5ff2b..6ae466e65 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -959,7 +959,7 @@ bool EvalScript( return set_error(serror, SCRIPT_ERR_CRYPTOCONDITION_INVALID_FULFILLMENT); } - bool fSuccess = checker.CheckCryptoCondition(cond, vchCondition, script); + bool fSuccess = checker.CheckCryptoCondition(cond, vchCondition, script, consensusBranchId); cc_free(cond); @@ -1307,10 +1307,15 @@ static int komodoCCEval(CC *cond, void *checker) } -bool TransactionSignatureChecker::CheckCryptoCondition(const CC *cond, const std::vector& condBin, const CScript& scriptCode) const +bool TransactionSignatureChecker::CheckCryptoCondition(const CC *cond, const std::vector& condBin, const CScript& scriptCode, uint32_t consensusBranchId) const { - uint256 message = SignatureHash(scriptCode, *txTo, nIn, SIGHASH_ALL); - return cc_verify(cond, (const unsigned char*)&message, 32, 0, + uint256 sighash; + try { + sighash = SignatureHash(scriptCode, *txTo, nIn, SIGHASH_ALL, amount, consensusBranchId, this->txdata); + } catch (logic_error ex) { + return false; + } + return cc_verify(cond, (const unsigned char*)&sighash, 32, 0, condBin.data(), condBin.size(), komodoCCEval, (void*)this); } diff --git a/src/script/interpreter.h b/src/script/interpreter.h index b13922f07..86d792e0a 100644 --- a/src/script/interpreter.h +++ b/src/script/interpreter.h @@ -128,7 +128,7 @@ public: return false; } - virtual bool CheckCryptoCondition(const CC *cond, const std::vector& condBin, const CScript& scriptCode) const + virtual bool CheckCryptoCondition(const CC *cond, const std::vector& condBin, const CScript& scriptCode, uint32_t consensusBranchId) const { return false; } @@ -152,7 +152,7 @@ public: TransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn, const PrecomputedTransactionData& txdataIn) : txTo(txToIn), nIn(nInIn), amount(amountIn), txdata(&txdataIn) {} bool CheckSig(const std::vector& scriptSig, const std::vector& vchPubKey, const CScript& scriptCode, uint32_t consensusBranchId) const; bool CheckLockTime(const CScriptNum& nLockTime) const; - bool CheckCryptoCondition(const CC *cond, const std::vector& condBin, const CScript& scriptCode) const; + bool CheckCryptoCondition(const CC *cond, const std::vector& condBin, const CScript& scriptCode, uint32_t consensusBranchId) const; bool CheckEvalCondition(const CC *cond) const; }; From 2c8d8268ddd5c8b8f0f1c2433196a458e47fb6e6 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Fri, 30 Mar 2018 15:46:41 -0300 Subject: [PATCH 0758/1062] ImportPayout cc eval code and alot of general cc polish. tests to write --- src/Makefile.am | 13 +- src/Makefile.zcash.include | 4 +- src/cc/eval.cpp | 23 +++ src/cc/eval.h | 18 ++ src/cc/importpayout.cpp | 191 ++++++++++++++++++ src/cryptoconditions/Makefile.am | 2 + .../include/cryptoconditions.h | 2 +- src/cryptoconditions/src/cryptoconditions.c | 4 +- src/cryptoconditions/src/internal.h | 1 - src/cryptoconditions/src/prefix.c | 2 +- src/cryptoconditions/src/secp256k1.c | 4 +- src/cryptoconditions/src/threshold.c | 2 +- src/komodo_cc.h | 40 ++++ src/komodo_cryptoconditions.cpp | 28 --- src/komodo_cryptoconditions.h | 19 -- src/main.cpp | 2 +- src/main.h | 2 +- src/script/interpreter.cpp | 26 ++- src/script/interpreter.h | 4 +- src/script/script.cpp | 16 ++ src/script/script.h | 1 + .../{sigcache.cpp => serverchecker.cpp} | 35 +++- src/script/serverchecker.h | 30 +++ src/script/sigcache.h | 26 --- src/script/standard.cpp | 10 +- 25 files changed, 389 insertions(+), 116 deletions(-) create mode 100644 src/cc/eval.cpp create mode 100644 src/cc/eval.h create mode 100644 src/cc/importpayout.cpp create mode 100644 src/komodo_cc.h delete mode 100644 src/komodo_cryptoconditions.cpp delete mode 100644 src/komodo_cryptoconditions.h rename src/script/{sigcache.cpp => serverchecker.cpp} (65%) create mode 100644 src/script/serverchecker.h delete mode 100644 src/script/sigcache.h diff --git a/src/Makefile.am b/src/Makefile.am index 89ee8ec74..affa61fc6 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -43,7 +43,7 @@ LIBBITCOIN_CLI=libbitcoin_cli.a LIBBITCOIN_UTIL=libbitcoin_util.a LIBBITCOIN_CRYPTO=crypto/libbitcoin_crypto.a LIBSECP256K1=secp256k1/libsecp256k1.la -LIBCRYPTOCONDITIONS=cryptoconditions/cryptoconditions_core.a +LIBCRYPTOCONDITIONS=cryptoconditions/libcryptoconditions_core.la LIBSNARK=snark/libsnark.a LIBUNIVALUE=univalue/libunivalue.la LIBZCASH=libzcash.a -lcurl @@ -135,6 +135,7 @@ BITCOIN_CORE_H = \ asyncrpcqueue.h \ base58.h \ bloom.h \ + cc/eval.h \ chain.h \ chainparams.h \ chainparamsbase.h \ @@ -162,7 +163,7 @@ BITCOIN_CORE_H = \ init.h \ key.h \ keystore.h \ - komodo_cryptoconditions.h \ + komodo_cc.h \ leveldbwrapper.h \ limitedmap.h \ main.h \ @@ -191,7 +192,7 @@ BITCOIN_CORE_H = \ script/interpreter.h \ script/script.h \ script/script_error.h \ - script/sigcache.h \ + script/serverchecker.h \ script/sign.h \ script/standard.h \ serialize.h \ @@ -249,13 +250,14 @@ libbitcoin_server_a_SOURCES = \ asyncrpcoperation.cpp \ asyncrpcqueue.cpp \ bloom.cpp \ + cc/eval.cpp \ + cc/importpayout.cpp \ chain.cpp \ checkpoints.cpp \ deprecation.cpp \ httprpc.cpp \ httpserver.cpp \ init.cpp \ - komodo_cryptoconditions.cpp \ leveldbwrapper.cpp \ main.cpp \ merkleblock.cpp \ @@ -274,7 +276,7 @@ libbitcoin_server_a_SOURCES = \ rpcnet.cpp \ rpcrawtransaction.cpp \ rpcserver.cpp \ - script/sigcache.cpp \ + script/serverchecker.cpp \ timedata.cpp \ torcontrol.cpp \ txdb.cpp \ @@ -378,7 +380,6 @@ libbitcoin_common_a_SOURCES = \ hash.cpp \ key.cpp \ keystore.cpp \ - komodo_cryptoconditions.cpp \ netbase.cpp \ primitives/block.cpp \ primitives/transaction.cpp \ diff --git a/src/Makefile.zcash.include b/src/Makefile.zcash.include index 177931c88..e6730623a 100644 --- a/src/Makefile.zcash.include +++ b/src/Makefile.zcash.include @@ -25,4 +25,6 @@ zcash_CreateJoinSplit_LDADD = \ $(LIBBITCOIN_UTIL) \ $(LIBBITCOIN_CRYPTO) \ $(BOOST_LIBS) \ - $(LIBZCASH_LIBS) + $(LIBZCASH_LIBS) \ + $(LIBCRYPTOCONDITIONS) \ + $(LIBSECP256K1) diff --git a/src/cc/eval.cpp b/src/cc/eval.cpp new file mode 100644 index 000000000..0291d1e3f --- /dev/null +++ b/src/cc/eval.cpp @@ -0,0 +1,23 @@ +#include "primitives/transaction.h" +#include "komodo_cc.h" +#include "cc/eval.h" +#include + + +/* + * Test the validity of an Eval node + */ +bool EvalConditionValidity(const CC *cond, const CTransaction *txTo, int nIn) +{ + if (strcmp(cond->method, "testEval") == 0) { + return cond->paramsBinLength == 8 && + memcmp(cond->paramsBin, "testEval", 8) == 0; + } + + if (strcmp(cond->method, "ImportPayout") == 0) { + return CheckImportPayout(cond, txTo, nIn); + } + + fprintf(stderr, "no defined behaviour for method: %s\n", cond->method); + return 0; +} diff --git a/src/cc/eval.h b/src/cc/eval.h new file mode 100644 index 000000000..8aa797f99 --- /dev/null +++ b/src/cc/eval.h @@ -0,0 +1,18 @@ +#ifndef CC_EVAL_H +#define CC_EVAL_H + +#include "cryptoconditions/include/cryptoconditions.h" +#include "primitives/transaction.h" + +/* + * Test validity of a CC_Eval node + */ +bool EvalConditionValidity(const CC *cond, const CTransaction *tx, int nIn); + +/* + * Test an ImportPayout CC Eval condition + */ +bool CheckImportPayout(const CC *cond, const CTransaction *payoutTx, int nIn); + + +#endif /* CC_EVAL_H */ diff --git a/src/cc/importpayout.cpp b/src/cc/importpayout.cpp new file mode 100644 index 000000000..d0a8c2fb0 --- /dev/null +++ b/src/cc/importpayout.cpp @@ -0,0 +1,191 @@ +#include "primitives/transaction.h" +#include "streams.h" +#include "chain.h" +#include "main.h" +#include "cryptoconditions/include/cryptoconditions.h" + + +bool GetPushData(const CScript &sig, std::vector &data) +{ + opcodetype opcode; + auto pc = sig.begin(); + if (sig.GetOp(pc, opcode, data)) return opcode > OP_0 && opcode <= OP_PUSHDATA4; + return false; +} + + +bool GetOpReturnData(const CScript &sig, std::vector &data) +{ + auto pc = sig.begin(); + opcodetype opcode; + if (sig.GetOp2(pc, opcode, NULL)) + if (opcode == OP_RETURN) + if (sig.GetOp(pc, opcode, data)) + return opcode > OP_0 && opcode <= OP_PUSHDATA4; + return false; +} + + +class MomProof +{ +public: + uint256 notaryHash; + int nPos; // Position of imported tx in MoM + std::vector branch; + + ADD_SERIALIZE_METHODS; + + template + inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { + READWRITE(notaryHash); + READWRITE(VARINT(nPos)); + READWRITE(branch); + } +}; + + +extern int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestamp); + +bool DerefNotaryPubkey(const COutPoint &prevout, char *pk33) +{ + CTransaction tx; + uint256 hashBlock; + if (!GetTransaction(prevout.hash, tx, hashBlock, false)) return false; + if (tx.vout.size() < prevout.n) return false; + const unsigned char *script = tx.vout[prevout.n].scriptPubKey.data(); + if (script[0] != 33) return false; + memcpy(pk33, script+1, 33); + return true; +} + +bool CheckNotaryInputs(const CTransaction &tx, uint32_t height, uint32_t timestamp) +{ + if (tx.vin.size() < 11) return false; + + uint8_t notaries[64][33]; + uint8_t seenNotaries[64]; + int nNotaries = komodo_notaries(notaries, height, timestamp); + char *pk; + + BOOST_FOREACH(const CTxIn &txIn, tx.vin) + { + if (!DerefNotaryPubkey(txIn.prevout, pk)) return false; + + for (int i=0; inHeight, blockindex->nTime)) { + return false; + } + if (!notarisationTx.vout.size() < 1) return 0; + std::vector opret; + if (!GetOpReturnData(notarisationTx.vout[0].scriptPubKey, opret)) return 0; + if (opret.size() < 36) return 0; // In reality it is more than 36, but at the moment I + // only know where it is relative to the end, and this + // is enough to prevent a memory fault. In the case that + // the assumption about the presence of a MoM at this + // offset fails, we will return random other data that is + // not more likely to generate a false positive. + memcpy(mom.begin(), opret.data()+opret.size()-36, 32); + return 1; +} + + +uint256 ExecMerkle(uint256 hash, const std::vector& vMerkleBranch, int nIndex) +{ + return CBlock::CheckMerkleBranch(hash, vMerkleBranch, nIndex); +} + + +/* + * Crypto-Condition EVAL method that verifies a payout against a transaction + * notarised on another chain. + * + * IN: cond - CC EVAL node + * IN: payoutTx - Payout transaction on value chain (KMD) + * IN: nIn - index of input of stake + * + * payoutTx: Spends stakeTx with payouts from asset chain + * + * in 0: Spends Stake TX and contains ImportPayout CC + * out 0: OP_RETURN MomProof + * out 1: OP_RETURN serialized exportTx from other chain + * out 2-: arbitrary payouts + * + * exportTx: Spends sessionTx.0 (opener on asset chain) + * + * in 0: spends sessionTx.0 + * in 1-: anything + * out 0: OP_RETURN hash of payouts + * out 1-: anything + */ +bool CheckImportPayout(const CC *cond, const CTransaction *payoutTx, int nIn) +{ + // TODO: Error messages! + if (payoutTx->vin.size() != 1) return 0; + if (payoutTx->vout.size() < 2) return 0; + + // Get hash of payouts + std::vector payouts(payoutTx->vout.begin() + 2, payoutTx->vout.end()); + uint256 payoutsHash = SerializeHash(payouts); + std::vector vPayoutsHash(payoutsHash.begin(), payoutsHash.end()); + + // load exportTx from vout[1] + CTransaction exportTx; + { + std::vector exportData; + if (!GetOpReturnData(payoutTx->vout[1].scriptPubKey, exportData)) return 0; + CDataStream(exportData, SER_DISK, PROTOCOL_VERSION) >> exportTx; + // TODO: end of stream? exception? + } + + // Check exportTx.0 is vPayoutsHash + std::vector exportPayoutsHash; + if (!GetOpReturnData(exportTx.vout[0].scriptPubKey, exportPayoutsHash)) return 0; + if (exportPayoutsHash != vPayoutsHash) return 0; + + // Check exportTx spends sessionTx.0 + // condition ImportPayout params is session ID from other chain + { + if (cond->paramsBinLength != 32) return 0; + COutPoint prevout = exportTx.vin[0].prevout; + if (memcmp(prevout.hash.begin(), cond->paramsBin, 32) != 0 || + prevout.n != 0) return 0; + } + + // Check exportTx solves momproof from vout[0] + { + std::vector vchMomProof; + if (!GetOpReturnData(payoutTx->vout[0].scriptPubKey, vchMomProof)) return 0; + + MomProof momProof; + CDataStream(vchMomProof, SER_DISK, PROTOCOL_VERSION) >> momProof; + + uint256 mom; + if (!GetMoM(momProof.notaryHash, mom)) return 0; + + uint256 proofResult = ExecMerkle(exportTx.GetHash(), momProof.branch, momProof.nPos); + if (proofResult != mom) return 0; + } + + return 1; +} diff --git a/src/cryptoconditions/Makefile.am b/src/cryptoconditions/Makefile.am index 9469acdbf..eed285064 100644 --- a/src/cryptoconditions/Makefile.am +++ b/src/cryptoconditions/Makefile.am @@ -2,6 +2,8 @@ lib_LTLIBRARIES=libcryptoconditions.la noinst_LTLIBRARIES=$(CRYPTOCONDITIONS_CORE) SUBDIRS = src/include/secp256k1 +include_HEADERS = include/cryptoconditions.h + # Have a separate build target for cryptoconditions that does not contain secp256k1 libcryptoconditions_la_SOURCES = include/cryptoconditions.h diff --git a/src/cryptoconditions/include/cryptoconditions.h b/src/cryptoconditions/include/cryptoconditions.h index c434a486b..88a3a6560 100644 --- a/src/cryptoconditions/include/cryptoconditions.h +++ b/src/cryptoconditions/include/cryptoconditions.h @@ -84,9 +84,9 @@ unsigned char* cc_conditionUri(const CC *cond); unsigned char* cc_jsonRPC(unsigned char *request); unsigned long cc_getCost(const CC *cond); enum CCTypeId cc_typeId(const CC *cond); +uint32_t cc_typeMask(const CC *cond); void cc_free(struct CC *cond); - #ifdef __cplusplus } #endif diff --git a/src/cryptoconditions/src/cryptoconditions.c b/src/cryptoconditions/src/cryptoconditions.c index 147cbb334..805c66236 100644 --- a/src/cryptoconditions/src/cryptoconditions.c +++ b/src/cryptoconditions/src/cryptoconditions.c @@ -42,8 +42,8 @@ void appendUriSubtypes(uint32_t mask, unsigned char *buf) { } else { strcat(buf, "&subtypes="); strcat(buf, typeRegistry[i]->name); + append = 1; } - append = 1; } } } @@ -70,7 +70,7 @@ unsigned char *cc_conditionUri(const CC *cond) { } -static uint32_t getSubtypes(CC *cond) { +uint32_t cc_typeMask(const CC *cond) { uint32_t mask = 1 << cond->type->typeId; if (cond->type->hasSubtypes) { mask |= cond->type->getSubtypes(cond); diff --git a/src/cryptoconditions/src/internal.h b/src/cryptoconditions/src/internal.h index bd0e6376a..bfcc6bd14 100644 --- a/src/cryptoconditions/src/internal.h +++ b/src/cryptoconditions/src/internal.h @@ -49,7 +49,6 @@ static CC *mkAnon(const Condition_t *asnCond); static void asnCondition(const CC *cond, Condition_t *asn); static Condition_t *asnConditionNew(const CC *cond); static Fulfillment_t *asnFulfillmentNew(const CC *cond); -static uint32_t getSubtypes(CC *cond); static cJSON *jsonEncodeCondition(cJSON *params, unsigned char *err); static struct CC *fulfillmentToCC(Fulfillment_t *ffill); static struct CCType *getTypeByAsnEnum(Condition_PR present); diff --git a/src/cryptoconditions/src/prefix.c b/src/cryptoconditions/src/prefix.c index 8fdd0a483..527115709 100644 --- a/src/cryptoconditions/src/prefix.c +++ b/src/cryptoconditions/src/prefix.c @@ -71,7 +71,7 @@ static Fulfillment_t *prefixToFulfillment(const CC *cond) { static uint32_t prefixSubtypes(const CC *cond) { - return getSubtypes(cond->subcondition) & ~(1 << cc_prefixType.typeId); + return cc_typeMask(cond->subcondition) & ~(1 << cc_prefixType.typeId); } diff --git a/src/cryptoconditions/src/secp256k1.c b/src/cryptoconditions/src/secp256k1.c index 895e91b32..be8fbd761 100644 --- a/src/cryptoconditions/src/secp256k1.c +++ b/src/cryptoconditions/src/secp256k1.c @@ -98,7 +98,7 @@ int secp256k1Verify(CC *cond, CCVisitor visitor) { static int cc_secp256k1VerifyTreeMsg32(const CC *cond, const unsigned char *msg32) { - int subtypes = getSubtypes(cond); + int subtypes = cc_typeMask(cond); if (subtypes & (1 << cc_prefixType.typeId) && subtypes & (1 << cc_secp256k1Type.typeId)) { // No support for prefix currently, due to pending protocol decision on @@ -148,7 +148,7 @@ static int secp256k1Sign(CC *cond, CCVisitor visitor) { * Sign secp256k1 conditions in a tree */ int cc_signTreeSecp256k1Msg32(CC *cond, const unsigned char *privateKey, const unsigned char *msg32) { - if (getSubtypes(cond) & (1 << cc_preimageType.typeId)) { + if (cc_typeMask(cond) & (1 << cc_preimageType.typeId)) { // No support for prefix currently, due to pending protocol decision on // how to combine message and prefix into 32 byte hash return 0; diff --git a/src/cryptoconditions/src/threshold.c b/src/cryptoconditions/src/threshold.c index 68f4c557d..d3f4d3e63 100644 --- a/src/cryptoconditions/src/threshold.c +++ b/src/cryptoconditions/src/threshold.c @@ -14,7 +14,7 @@ struct CCType cc_thresholdType; static uint32_t thresholdSubtypes(const CC *cond) { uint32_t mask = 0; for (int i=0; isize; i++) { - mask |= getSubtypes(cond->subconditions[i]); + mask |= cc_typeMask(cond->subconditions[i]); } mask &= ~(1 << cc_thresholdType.typeId); return mask; diff --git a/src/komodo_cc.h b/src/komodo_cc.h new file mode 100644 index 000000000..fe05d3fc0 --- /dev/null +++ b/src/komodo_cc.h @@ -0,0 +1,40 @@ +#ifndef KOMODO_CC_H +#define KOMODO_CC_H + +#include "cryptoconditions/include/cryptoconditions.h" +#include "primitives/transaction.h" + + +/* + * Check if CryptoConditions is enabled based on chain or cmd flag + */ +extern int32_t ASSETCHAINS_CC; +static bool IsCryptoConditionsEnabled() +{ + return 0 != ASSETCHAINS_CC; +} + + +/* + * Check if the server can accept the condition based on it's structure / types + */ +static bool IsAcceptableCryptoCondition(const CC *cond) +{ + int32_t typeMask = cc_typeMask(cond); + + // Require a signature to prevent transaction malleability + if (0 == typeMask & (1 << CC_Secp256k1) || + 0 == typeMask & (1 << CC_Ed25519)) return false; + + // Limit acceptable condition types + // Prefix not enabled because no current use case, ambiguity on how to combine with secp256k1 + // RSA not enabled because no current use case, not implemented + int enabledTypes = 1 << CC_Secp256k1 | 1 << CC_Threshold | 1 << CC_Eval | \ + 1 << CC_Preimage | 1 << CC_Ed25519; + if (typeMask & ~enabledTypes) return false; + + return true; +} + + +#endif /* KOMODO_CC_H */ diff --git a/src/komodo_cryptoconditions.cpp b/src/komodo_cryptoconditions.cpp deleted file mode 100644 index 4ebbebbeb..000000000 --- a/src/komodo_cryptoconditions.cpp +++ /dev/null @@ -1,28 +0,0 @@ -#include "komodo_cryptoconditions.h" -#include "cryptoconditions/include/cryptoconditions.h" - - -/* - * Evaluate the validity of an Eval node - */ -bool EvalConditionValidity(const CC *cond, const CTransaction *txTo) -{ - if (strcmp(cond->method, "testEval") == 0) { - return cond->paramsBinLength == 8 && - memcmp(cond->paramsBin, "testEval", 8) == 0; - } - fprintf(stderr, "no defined behaviour for method: %s\n", cond->method); - return 0; -} - - -bool GetOpReturnData(const CScript &sig, std::vector &data) -{ - auto pc = sig.begin(); - opcodetype opcode; - if (sig.GetOp(pc, opcode)) - if (opcode == OP_RETURN) - if (sig.GetOp(pc, opcode, data)) - return opcode > OP_0 && opcode <= OP_PUSHDATA4; - return false; -} diff --git a/src/komodo_cryptoconditions.h b/src/komodo_cryptoconditions.h deleted file mode 100644 index 4edc2bedc..000000000 --- a/src/komodo_cryptoconditions.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef KOMODO_CRYPTOCONDITIONS_H -#define KOMODO_CRYPTOCONDITIONS_H - -#include "cryptoconditions/include/cryptoconditions.h" -#include "primitives/transaction.h" -#include "script/script.h" - - -extern int32_t ASSETCHAINS_CC; - -static bool IsCryptoConditionsEnabled() { - return 0 != ASSETCHAINS_CC; -} - -bool EvalConditionValidity(const CC *cond, const CTransaction *tx); - -bool GetOpReturnData(const CScript &sig, std::vector &data); - -#endif /* KOMODO_CRYPTOCONDITIONS_H */ diff --git a/src/main.cpp b/src/main.cpp index 151c42383..9fb8402d5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1931,7 +1931,7 @@ void UpdateCoins(const CTransaction& tx, CCoinsViewCache& inputs, int nHeight) bool CScriptCheck::operator()() { const CScript &scriptSig = ptxTo->vin[nIn].scriptSig; - if (!VerifyScript(scriptSig, scriptPubKey, nFlags, CachingTransactionSignatureChecker(ptxTo, nIn, amount, cacheStore, *txdata), consensusBranchId, &error)) { + if (!VerifyScript(scriptSig, scriptPubKey, nFlags, ServerTransactionSignatureChecker(ptxTo, nIn, amount, cacheStore, *txdata), consensusBranchId, &error)) { return ::error("CScriptCheck(): %s:%d VerifySignature failed: %s", ptxTo->GetHash().ToString(), nIn, ScriptErrorString(error)); } return true; diff --git a/src/main.h b/src/main.h index 14513b730..1c864de20 100644 --- a/src/main.h +++ b/src/main.h @@ -20,7 +20,7 @@ #include "primitives/block.h" #include "primitives/transaction.h" #include "script/script.h" -#include "script/sigcache.h" +#include "script/serverchecker.h" #include "script/standard.h" #include "sync.h" #include "tinyformat.h" diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 6ae466e65..20027ea41 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -13,7 +13,7 @@ #include "pubkey.h" #include "script/script.h" #include "uint256.h" -#include "komodo_cryptoconditions.h" +#include "cryptoconditions/include/cryptoconditions.h" using namespace std; @@ -1295,20 +1295,10 @@ bool TransactionSignatureChecker::CheckSig( } -bool TransactionSignatureChecker::CheckEvalCondition(const CC *cond) const -{ - return EvalConditionValidity(cond, txTo); -} - - -static int komodoCCEval(CC *cond, void *checker) -{ - return ((TransactionSignatureChecker*)checker)->CheckEvalCondition(cond); -} - - bool TransactionSignatureChecker::CheckCryptoCondition(const CC *cond, const std::vector& condBin, const CScript& scriptCode, uint32_t consensusBranchId) const { + if (!IsAcceptableCryptoCondition(cond)) return false; + uint256 sighash; try { sighash = SignatureHash(scriptCode, *txTo, nIn, SIGHASH_ALL, amount, consensusBranchId, this->txdata); @@ -1316,7 +1306,15 @@ bool TransactionSignatureChecker::CheckCryptoCondition(const CC *cond, const std return false; } return cc_verify(cond, (const unsigned char*)&sighash, 32, 0, - condBin.data(), condBin.size(), komodoCCEval, (void*)this); + condBin.data(), condBin.size(), GetCCEval(), (void*)this); +} + + +VerifyEval TransactionSignatureChecker::GetCCEval() const { + return [] (CC *cond, void *checker) { + fprintf(stderr, "Cannot check crypto-condition Eval outside of server\n"); + return 0; + }; } diff --git a/src/script/interpreter.h b/src/script/interpreter.h index 86d792e0a..86ab8dac3 100644 --- a/src/script/interpreter.h +++ b/src/script/interpreter.h @@ -8,7 +8,7 @@ #include "script_error.h" #include "primitives/transaction.h" -#include "komodo_cryptoconditions.h" +#include "komodo_cc.h" #include #include @@ -153,7 +153,7 @@ public: bool CheckSig(const std::vector& scriptSig, const std::vector& vchPubKey, const CScript& scriptCode, uint32_t consensusBranchId) const; bool CheckLockTime(const CScriptNum& nLockTime) const; bool CheckCryptoCondition(const CC *cond, const std::vector& condBin, const CScript& scriptCode, uint32_t consensusBranchId) const; - bool CheckEvalCondition(const CC *cond) const; + VerifyEval GetCCEval() const; }; class MutableTransactionSignatureChecker : public TransactionSignatureChecker diff --git a/src/script/script.cpp b/src/script/script.cpp index a4446a0df..d885146a2 100644 --- a/src/script/script.cpp +++ b/src/script/script.cpp @@ -7,6 +7,8 @@ #include "tinyformat.h" #include "utilstrencodings.h" +#include "komodo_cc.h" +#include "cryptoconditions/include/cryptoconditions.h" namespace { inline std::string ValueString(const std::vector& vch) @@ -238,6 +240,20 @@ bool CScript::IsPayToCryptoCondition() const return 0; } +bool CScript::MayAcceptCryptoCondition() const +{ + // Get the type mask of the condition + const_iterator pc = this->begin(); + vector data; + opcodetype opcode; + if (!this->GetOp(pc, opcode, data)) return false; + if (!(opcode > OP_0 && opcode < OP_PUSHDATA1)) return false; + CC *cond = cc_readConditionBinary(data.data(), data.size()); + if (!cond) return false; + bool accept = IsAcceptableCryptoCondition(cond); + return accept; +} + bool CScript::IsPushOnly() const { const_iterator pc = begin(); diff --git a/src/script/script.h b/src/script/script.h index 800289a15..b7442a419 100644 --- a/src/script/script.h +++ b/src/script/script.h @@ -565,6 +565,7 @@ public: bool IsPayToScriptHash() const; bool IsPayToCryptoCondition() const; + bool MayAcceptCryptoCondition() const; /** Called by IsStandardTx and P2SH/BIP62 VerifyScript (which makes it consensus-critical). */ bool IsPushOnly() const; diff --git a/src/script/sigcache.cpp b/src/script/serverchecker.cpp similarity index 65% rename from src/script/sigcache.cpp rename to src/script/serverchecker.cpp index 35b9f0e03..852895305 100644 --- a/src/script/sigcache.cpp +++ b/src/script/serverchecker.cpp @@ -3,7 +3,9 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#include "sigcache.h" +#include "serverchecker.h" +#include "komodo_cc.h" +#include "cc/eval.h" #include "pubkey.h" #include "random.h" @@ -26,13 +28,13 @@ private: //! sigdata_type is (signature hash, signature, public key): typedef boost::tuple, CPubKey> sigdata_type; std::set< sigdata_type> setValid; - boost::shared_mutex cs_sigcache; + boost::shared_mutex cs_serverchecker; public: bool Get(const uint256 &hash, const std::vector& vchSig, const CPubKey& pubKey) { - boost::shared_lock lock(cs_sigcache); + boost::shared_lock lock(cs_serverchecker); sigdata_type k(hash, vchSig, pubKey); std::set::iterator mi = setValid.find(k); @@ -47,10 +49,10 @@ public: // (~200 bytes per cache entry times 50,000 entries) // Since there can be no more than 20,000 signature operations per block // 50,000 is a reasonable default. - int64_t nMaxCacheSize = GetArg("-maxsigcachesize", 50000); + int64_t nMaxCacheSize = GetArg("-maxservercheckersize", 50000); if (nMaxCacheSize <= 0) return; - boost::unique_lock lock(cs_sigcache); + boost::unique_lock lock(cs_serverchecker); while (static_cast(setValid.size()) > nMaxCacheSize) { @@ -74,7 +76,7 @@ public: } -bool CachingTransactionSignatureChecker::VerifySignature(const std::vector& vchSig, const CPubKey& pubkey, const uint256& sighash) const +bool ServerTransactionSignatureChecker::VerifySignature(const std::vector& vchSig, const CPubKey& pubkey, const uint256& sighash) const { static CSignatureCache signatureCache; @@ -88,3 +90,24 @@ bool CachingTransactionSignatureChecker::VerifySignature(const std::vectorCheckEvalCondition(cond); + }; +} + +int ServerTransactionSignatureChecker::CheckEvalCondition(CC *cond) const +{ + return EvalConditionValidity(cond, txTo, nIn); +} diff --git a/src/script/serverchecker.h b/src/script/serverchecker.h new file mode 100644 index 000000000..c680da7ce --- /dev/null +++ b/src/script/serverchecker.h @@ -0,0 +1,30 @@ +// Copyright (c) 2009-2010 Satoshi Nakamoto +// Copyright (c) 2009-2014 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef BITCOIN_SCRIPT_SERVERCHECKER_H +#define BITCOIN_SCRIPT_SERVERCHECKER_H + +#include "script/interpreter.h" + +#include + +class CPubKey; + +class ServerTransactionSignatureChecker : public TransactionSignatureChecker +{ +private: + bool store; + const CTransaction* txTo; + unsigned int nIn; + +public: + ServerTransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn, const CAmount& amount, bool storeIn, PrecomputedTransactionData& txdataIn) : TransactionSignatureChecker(txToIn, nInIn, amount, txdataIn), store(storeIn) {} + + bool VerifySignature(const std::vector& vchSig, const CPubKey& vchPubKey, const uint256& sighash) const; + int CheckEvalCondition(CC *cond) const; + VerifyEval GetCCEval() const; +}; + +#endif // BITCOIN_SCRIPT_SERVERCHECKER_H diff --git a/src/script/sigcache.h b/src/script/sigcache.h deleted file mode 100644 index 134b72a2d..000000000 --- a/src/script/sigcache.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2009-2014 The Bitcoin Core developers -// Distributed under the MIT software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. - -#ifndef BITCOIN_SCRIPT_SIGCACHE_H -#define BITCOIN_SCRIPT_SIGCACHE_H - -#include "script/interpreter.h" - -#include - -class CPubKey; - -class CachingTransactionSignatureChecker : public TransactionSignatureChecker -{ -private: - bool store; - -public: - CachingTransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn, const CAmount& amount, bool storeIn, PrecomputedTransactionData& txdataIn) : TransactionSignatureChecker(txToIn, nInIn, amount, txdataIn), store(storeIn) {} - - bool VerifySignature(const std::vector& vchSig, const CPubKey& vchPubKey, const uint256& sighash) const; -}; - -#endif // BITCOIN_SCRIPT_SIGCACHE_H diff --git a/src/script/standard.cpp b/src/script/standard.cpp index 60f059ac3..ee96581fe 100644 --- a/src/script/standard.cpp +++ b/src/script/standard.cpp @@ -9,7 +9,7 @@ #include "script/script.h" #include "util.h" #include "utilstrencodings.h" -#include "komodo_cryptoconditions.h" +#include "komodo_cc.h" #include @@ -72,9 +72,11 @@ bool Solver(const CScript& scriptPubKey, txnouttype& typeRet, vector Date: Fri, 30 Mar 2018 17:20:02 -0300 Subject: [PATCH 0759/1062] mock up DisputePayout --- src/Makefile.am | 1 + src/cc/disputepayout.cpp | 102 +++++++++++++++++++++++++++++++++++++++ src/cc/eval.cpp | 33 +++++++++++++ src/cc/eval.h | 31 ++++++++++++ src/cc/importpayout.cpp | 44 +++++------------ 5 files changed, 179 insertions(+), 32 deletions(-) create mode 100644 src/cc/disputepayout.cpp diff --git a/src/Makefile.am b/src/Makefile.am index affa61fc6..5bbd26d33 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -252,6 +252,7 @@ libbitcoin_server_a_SOURCES = \ bloom.cpp \ cc/eval.cpp \ cc/importpayout.cpp \ + cc/disputepayout.cpp \ chain.cpp \ checkpoints.cpp \ deprecation.cpp \ diff --git a/src/cc/disputepayout.cpp b/src/cc/disputepayout.cpp new file mode 100644 index 000000000..36a5e1723 --- /dev/null +++ b/src/cc/disputepayout.cpp @@ -0,0 +1,102 @@ +#include "primitives/transaction.h" +#include "streams.h" +#include "chain.h" +#include "main.h" +#include "cc/eval.h" +#include "cryptoconditions/include/cryptoconditions.h" + + +bool GetSpends(uint256 hash, std::vector> &spends) +{ + // NOT IMPLEMENTED + return false; +} + + +class DisputeHeader +{ +public: + int waitBlocks; + std::vector vmHeader; + + ADD_SERIALIZE_METHODS; + + template + inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { + READWRITE(VARINT(waitBlocks)); + READWRITE(vmHeader); + } +}; + + +/* + * Crypto-Condition EVAL method that resolves a dispute of a session + * + * IN: vm - AppVM virtual machine to verify states + * IN: cond - CC EVAL node + * IN: disputeTx - transaction attempting to resolve dispute + * IN: nIn - index of input of dispute tx + * + * disputeTx: attempt to resolve a dispute + * + * in 0: Spends Session TX first output, reveals DisputeHeader + * out 0: OP_RETURN hash of payouts + */ +bool DisputePayout(AppVM &vm, const CC *cond, const CTransaction *disputeTx, int nIn) +{ + // TODO: Error messages! + if (disputeTx->vout.size() < 2) return 0; + + // get payouts hash + std::vector vPayoutHash; + uint256 payoutHash; + if (!GetOpReturnData(disputeTx->vout[0].scriptPubKey, vPayoutHash)) return 0; + memcpy(payoutHash.begin(), vPayoutHash.data(), 32); + + // load dispute header + DisputeHeader disputeHeader; + std::vector headerData(cond->paramsBin, + cond->paramsBin+cond->paramsBinLength); + CDataStream(headerData, SER_DISK, PROTOCOL_VERSION) >> disputeHeader; + // TODO: exception? end of stream? + + // ensure that enough time has passed + CTransaction sessionTx; + uint256 sessionBlockHash; + if (!GetTransaction(disputeTx->vin[0].prevout.hash, sessionTx, sessionBlockHash, false)) + return false; // wth? TODO: log TODO: MUST be upsteam of disputeTx, how to ensure? + // below does this by looking up block in blockindex + // what if GetTransaction returns from mempool, maybe theres no block? + CBlockIndex* sessionBlockIndex = mapBlockIndex[sessionBlockHash]; + if (chainActive.Height() < sessionBlockIndex->nHeight + disputeHeader.waitBlocks) + return false; // Not yet + + // get spends + std::vector> spends; + if (!GetSpends(disputeTx->vin[0].prevout.hash, spends)) return 0; + + // verify result from VM + int maxLength = -1; + uint256 bestPayout; + for (int i=1; i vmBody; + if (!GetOpReturnData(spends[i]->vout[0].scriptPubKey, vmBody)) continue; + auto out = vm.evaluate(disputeHeader.vmHeader, vmBody); + uint256 resultHash = SerializeHash(out.second); + if (out.first > maxLength) { + maxLength = out.first; + bestPayout = resultHash; + } + // The below means that if for any reason there is a draw, + else if (out.first == maxLength) { + if (bestPayout != payoutHash) { + fprintf(stderr, "WARNING: VM has multiple solutions of same length\n"); + bestPayout = resultHash; + } + } + } + + return bestPayout == payoutHash; +} diff --git a/src/cc/eval.cpp b/src/cc/eval.cpp index 0291d1e3f..2615d1e4e 100644 --- a/src/cc/eval.cpp +++ b/src/cc/eval.cpp @@ -18,6 +18,39 @@ bool EvalConditionValidity(const CC *cond, const CTransaction *txTo, int nIn) return CheckImportPayout(cond, txTo, nIn); } + /* Example of how you might call DisputePayout + + if (strcmp(ASSETCHAINS_SYMBOL, "PANGEA") == 0) { + if (strcmp(cond->method, "DisputePoker") == 0) { + return DisputePayout(PokerVM(), cond, txTo, nIn); + } + } + + */ + fprintf(stderr, "no defined behaviour for method: %s\n", cond->method); return 0; } + + + +bool GetPushData(const CScript &sig, std::vector &data) +{ + opcodetype opcode; + auto pc = sig.begin(); + if (sig.GetOp(pc, opcode, data)) return opcode > OP_0 && opcode <= OP_PUSHDATA4; + return false; +} + + +bool GetOpReturnData(const CScript &sig, std::vector &data) +{ + auto pc = sig.begin(); + opcodetype opcode; + if (sig.GetOp2(pc, opcode, NULL)) + if (opcode == OP_RETURN) + if (sig.GetOp(pc, opcode, data)) + return opcode > OP_0 && opcode <= OP_PUSHDATA4; + return false; +} + diff --git a/src/cc/eval.h b/src/cc/eval.h index 8aa797f99..aadb2e85f 100644 --- a/src/cc/eval.h +++ b/src/cc/eval.h @@ -14,5 +14,36 @@ bool EvalConditionValidity(const CC *cond, const CTransaction *tx, int nIn); */ bool CheckImportPayout(const CC *cond, const CTransaction *payoutTx, int nIn); +/* + * Virtual machine to use in the case of on-chain app evaluation + */ +class AppVM +{ +public: + /* + * in: header - paramters agreed upon by all players + * in: body - gamestate + * out: length - length of game (longest wins) + * out: payments - vector of CTxOut, always deterministically sorted. + */ + virtual std::pair> + evaluate(std::vector header, std::vector body) = 0; +}; + +/* + * Test a DisputePayout CC Eval condition, using a provided AppVM + */ +bool DisputePayout(AppVM &vm, const CC *cond, const CTransaction *disputeTx, int nIn); + +/* + * Get PUSHDATA from a script + */ +bool GetPushData(const CScript &sig, std::vector &data); + +/* + * Get OP_RETURN data from a script + */ +bool GetOpReturnData(const CScript &sig, std::vector &data); + #endif /* CC_EVAL_H */ diff --git a/src/cc/importpayout.cpp b/src/cc/importpayout.cpp index d0a8c2fb0..ee8913744 100644 --- a/src/cc/importpayout.cpp +++ b/src/cc/importpayout.cpp @@ -2,30 +2,10 @@ #include "streams.h" #include "chain.h" #include "main.h" +#include "cc/eval.h" #include "cryptoconditions/include/cryptoconditions.h" -bool GetPushData(const CScript &sig, std::vector &data) -{ - opcodetype opcode; - auto pc = sig.begin(); - if (sig.GetOp(pc, opcode, data)) return opcode > OP_0 && opcode <= OP_PUSHDATA4; - return false; -} - - -bool GetOpReturnData(const CScript &sig, std::vector &data) -{ - auto pc = sig.begin(); - opcodetype opcode; - if (sig.GetOp2(pc, opcode, NULL)) - if (opcode == OP_RETURN) - if (sig.GetOp(pc, opcode, data)) - return opcode > OP_0 && opcode <= OP_PUSHDATA4; - return false; -} - - class MomProof { public: @@ -128,10 +108,10 @@ uint256 ExecMerkle(uint256 hash, const std::vector& vMerkleBranch, int * * in 0: Spends Stake TX and contains ImportPayout CC * out 0: OP_RETURN MomProof - * out 1: OP_RETURN serialized exportTx from other chain + * out 1: OP_RETURN serialized disputeTx from other chain * out 2-: arbitrary payouts * - * exportTx: Spends sessionTx.0 (opener on asset chain) + * disputeTx: Spends sessionTx.0 (opener on asset chain) * * in 0: spends sessionTx.0 * in 1-: anything @@ -149,30 +129,30 @@ bool CheckImportPayout(const CC *cond, const CTransaction *payoutTx, int nIn) uint256 payoutsHash = SerializeHash(payouts); std::vector vPayoutsHash(payoutsHash.begin(), payoutsHash.end()); - // load exportTx from vout[1] - CTransaction exportTx; + // load disputeTx from vout[1] + CTransaction disputeTx; { std::vector exportData; if (!GetOpReturnData(payoutTx->vout[1].scriptPubKey, exportData)) return 0; - CDataStream(exportData, SER_DISK, PROTOCOL_VERSION) >> exportTx; + CDataStream(exportData, SER_DISK, PROTOCOL_VERSION) >> disputeTx; // TODO: end of stream? exception? } - // Check exportTx.0 is vPayoutsHash + // Check disputeTx.0 is vPayoutsHash std::vector exportPayoutsHash; - if (!GetOpReturnData(exportTx.vout[0].scriptPubKey, exportPayoutsHash)) return 0; + if (!GetOpReturnData(disputeTx.vout[0].scriptPubKey, exportPayoutsHash)) return 0; if (exportPayoutsHash != vPayoutsHash) return 0; - // Check exportTx spends sessionTx.0 + // Check disputeTx spends sessionTx.0 // condition ImportPayout params is session ID from other chain { if (cond->paramsBinLength != 32) return 0; - COutPoint prevout = exportTx.vin[0].prevout; + COutPoint prevout = disputeTx.vin[0].prevout; if (memcmp(prevout.hash.begin(), cond->paramsBin, 32) != 0 || prevout.n != 0) return 0; } - // Check exportTx solves momproof from vout[0] + // Check disputeTx solves momproof from vout[0] { std::vector vchMomProof; if (!GetOpReturnData(payoutTx->vout[0].scriptPubKey, vchMomProof)) return 0; @@ -183,7 +163,7 @@ bool CheckImportPayout(const CC *cond, const CTransaction *payoutTx, int nIn) uint256 mom; if (!GetMoM(momProof.notaryHash, mom)) return 0; - uint256 proofResult = ExecMerkle(exportTx.GetHash(), momProof.branch, momProof.nPos); + uint256 proofResult = ExecMerkle(disputeTx.GetHash(), momProof.branch, momProof.nPos); if (proofResult != mom) return 0; } From 563581aff4f1ec94465fb9fcb2ee2f7f6d09d14d Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Sat, 31 Mar 2018 23:20:03 -0300 Subject: [PATCH 0760/1062] many changes: * fix CC malleability * extra validations for CCs such as requiring a signature and limiting types * different SIGHASH types for CC --- src/Makefile.am | 1 + src/Makefile.zcash.include | 1 + src/cryptoconditions/Makefile.am | 1 + .../include/cryptoconditions.h | 16 +++- src/cryptoconditions/src/anon.c | 15 ++-- src/cryptoconditions/src/cryptoconditions.c | 74 ++++++++++++------- src/cryptoconditions/src/ed25519.c | 3 +- src/cryptoconditions/src/eval.c | 3 +- src/cryptoconditions/src/internal.h | 5 +- src/cryptoconditions/src/prefix.c | 5 +- src/cryptoconditions/src/preimage.c | 3 +- src/cryptoconditions/src/secp256k1.c | 3 +- src/cryptoconditions/src/threshold.c | 51 +++++++++---- src/cryptoconditions/src/utils.c | 1 + .../tests/test_failure_modes.py | 13 +++- src/komodo_cc.cpp | 44 +++++++++++ src/komodo_cc.h | 29 ++------ src/script/interpreter.cpp | 45 ++++++----- src/script/interpreter.h | 12 ++- src/script/script.cpp | 5 +- src/zcash/CreateJoinSplit.cpp | 1 + 21 files changed, 215 insertions(+), 116 deletions(-) create mode 100644 src/komodo_cc.cpp diff --git a/src/Makefile.am b/src/Makefile.am index 5bbd26d33..7c64dcfd9 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -381,6 +381,7 @@ libbitcoin_common_a_SOURCES = \ hash.cpp \ key.cpp \ keystore.cpp \ + komodo_cc.cpp \ netbase.cpp \ primitives/block.cpp \ primitives/transaction.cpp \ diff --git a/src/Makefile.zcash.include b/src/Makefile.zcash.include index e6730623a..da5b4344d 100644 --- a/src/Makefile.zcash.include +++ b/src/Makefile.zcash.include @@ -28,3 +28,4 @@ zcash_CreateJoinSplit_LDADD = \ $(LIBZCASH_LIBS) \ $(LIBCRYPTOCONDITIONS) \ $(LIBSECP256K1) + diff --git a/src/cryptoconditions/Makefile.am b/src/cryptoconditions/Makefile.am index eed285064..3b482b9c7 100644 --- a/src/cryptoconditions/Makefile.am +++ b/src/cryptoconditions/Makefile.am @@ -21,6 +21,7 @@ CRYPTOCONDITIONS_CORE=libcryptoconditions_core.la libcryptoconditions_core_la_SOURCES = \ src/cryptoconditions.c \ + src/utils.c \ src/include/cJSON.c \ src/include/sha256.c \ src/include/ed25519/src/keypair.c \ diff --git a/src/cryptoconditions/include/cryptoconditions.h b/src/cryptoconditions/include/cryptoconditions.h index 88a3a6560..64cd1db70 100644 --- a/src/cryptoconditions/include/cryptoconditions.h +++ b/src/cryptoconditions/include/cryptoconditions.h @@ -16,6 +16,7 @@ struct CCType; enum CCTypeId { + CC_Condition = -1, CC_Preimage = 0, CC_Prefix = 1, CC_Threshold = 2, @@ -31,19 +32,27 @@ enum CCTypeId { typedef int (*VerifyEval)(struct CC *cond, void *context); + /* * Crypto Condition */ typedef struct CC { struct CCType *type; union { + // public key types struct { unsigned char *publicKey, *signature; }; + // preimage struct { unsigned char *preimage; size_t preimageLength; }; + // threshold struct { long threshold; int size; struct CC **subconditions; }; + // prefix struct { unsigned char *prefix; size_t prefixLength; struct CC *subcondition; unsigned long maxMessageLength; }; + // eval struct { char method[64]; unsigned char *paramsBin; size_t paramsBinLength; }; - struct { unsigned char fingerprint[32]; uint32_t subtypes; unsigned long cost; }; + // anon + struct { unsigned char fingerprint[32]; uint32_t subtypes; unsigned long cost; + struct CCType *conditionType; }; }; } CC; @@ -76,14 +85,15 @@ size_t cc_fulfillmentBinary(const CC *cond, unsigned char *buf, size_t static int cc_secp256k1VerifyTreeMsg32(const CC *cond, const unsigned char *msg32); struct CC* cc_conditionFromJSON(cJSON *params, unsigned char *err); struct CC* cc_conditionFromJSONString(const unsigned char *json, unsigned char *err); -struct CC* cc_readConditionBinary(unsigned char *cond_bin, size_t cond_bin_len); -struct CC* cc_readFulfillmentBinary(unsigned char *ffill_bin, size_t ffill_bin_len); +struct CC* cc_readConditionBinary(const unsigned char *cond_bin, size_t cond_bin_len); +struct CC* cc_readFulfillmentBinary(const unsigned char *ffill_bin, size_t ffill_bin_len); struct cJSON* cc_conditionToJSON(const CC *cond); unsigned char* cc_conditionToJSONString(const CC *cond); unsigned char* cc_conditionUri(const CC *cond); unsigned char* cc_jsonRPC(unsigned char *request); unsigned long cc_getCost(const CC *cond); enum CCTypeId cc_typeId(const CC *cond); +char* cc_typeName(const CC *cond); uint32_t cc_typeMask(const CC *cond); void cc_free(struct CC *cond); diff --git a/src/cryptoconditions/src/anon.c b/src/cryptoconditions/src/anon.c index e23fffe3e..0d10e0df0 100644 --- a/src/cryptoconditions/src/anon.c +++ b/src/cryptoconditions/src/anon.c @@ -11,22 +11,19 @@ struct CCType cc_anonType; static CC *mkAnon(const Condition_t *asnCond) { + CCType *realType = getTypeByAsnEnum(asnCond->present); if (!realType) { printf("Unknown ASN type: %i", asnCond->present); return 0; } CC *cond = calloc(1, sizeof(CC)); - cond->type = (CCType*) calloc(1, sizeof(CCType)); - *cond->type = cc_anonType; - strcpy(cond->type->name, realType->name); - cond->type->hasSubtypes = realType->hasSubtypes; - cond->type->typeId = realType->typeId; - cond->type->asnType = realType->asnType; + cond->type = &cc_anonType; + cond->conditionType = realType; const CompoundSha256Condition_t *deets = &asnCond->choice.thresholdSha256; memcpy(cond->fingerprint, deets->fingerprint.buf, 32); cond->cost = deets->cost; - if (realType->hasSubtypes) { + if (realType->getSubtypes) { cond->subtypes = fromAsnSubtypes(deets->subtypes); } return cond; @@ -66,8 +63,6 @@ static Fulfillment_t *anonFulfillment(const CC *cond) { static void anonFree(CC *cond) { - free(cond->type); - free(cond); } @@ -76,4 +71,4 @@ static int anonIsFulfilled(const CC *cond) { } -struct CCType cc_anonType = { -1, "anon (a buffer large enough to accomodate any type name)", Condition_PR_NOTHING, 0, NULL, &anonFingerprint, &anonCost, &anonSubtypes, NULL, &anonToJSON, NULL, &anonFulfillment, &anonIsFulfilled, &anonFree }; +struct CCType cc_anonType = { -1, "(anon)", Condition_PR_NOTHING, NULL, &anonFingerprint, &anonCost, &anonSubtypes, NULL, &anonToJSON, NULL, &anonFulfillment, &anonIsFulfilled, &anonFree }; diff --git a/src/cryptoconditions/src/cryptoconditions.c b/src/cryptoconditions/src/cryptoconditions.c index 805c66236..164d58f9c 100644 --- a/src/cryptoconditions/src/cryptoconditions.c +++ b/src/cryptoconditions/src/cryptoconditions.c @@ -12,7 +12,6 @@ #include "src/anon.c" #include "src/eval.c" #include "src/json_rpc.c" -#include "src/utils.c" #include #include @@ -57,9 +56,9 @@ unsigned char *cc_conditionUri(const CC *cond) { unsigned char *out = calloc(1, 1000); sprintf(out, "ni:///sha-256;%s?fpt=%s&cost=%lu", - encoded, cond->type->name, cc_getCost(cond)); + encoded, cc_typeName(cond), cc_getCost(cond)); - if (cond->type->hasSubtypes) { + if (cond->type->getSubtypes) { appendUriSubtypes(cond->type->getSubtypes(cond), out); } @@ -70,15 +69,6 @@ unsigned char *cc_conditionUri(const CC *cond) { } -uint32_t cc_typeMask(const CC *cond) { - uint32_t mask = 1 << cond->type->typeId; - if (cond->type->hasSubtypes) { - mask |= cond->type->getSubtypes(cond); - } - return mask; -} - - static ConditionTypes_t asnSubtypes(uint32_t mask) { ConditionTypes_t types; uint8_t buf[4] = {0,0,0,0}; @@ -115,7 +105,7 @@ size_t cc_conditionBinary(const CC *cond, unsigned char *buf) { asnCondition(cond, asn); asn_enc_rval_t rc = der_encode_to_buffer(&asn_DEF_Condition, asn, buf, 1000); if (rc.encoded == -1) { - printf("CONDITION NOT ENCODED\n"); + fprintf(stderr, "CONDITION NOT ENCODED\n"); return 0; } ASN_STRUCT_FREE(asn_DEF_Condition, asn); @@ -127,7 +117,7 @@ size_t cc_fulfillmentBinary(const CC *cond, unsigned char *buf, size_t length) { Fulfillment_t *ffill = asnFulfillmentNew(cond); asn_enc_rval_t rc = der_encode_to_buffer(&asn_DEF_Fulfillment, ffill, buf, length); if (rc.encoded == -1) { - printf("FULFILLMENT NOT ENCODED\n"); + fprintf(stderr, "FULFILLMENT NOT ENCODED\n"); return 0; } ASN_STRUCT_FREE(asn_DEF_Fulfillment, ffill); @@ -136,7 +126,7 @@ size_t cc_fulfillmentBinary(const CC *cond, unsigned char *buf, size_t length) { static void asnCondition(const CC *cond, Condition_t *asn) { - asn->present = cond->type->asnType; + asn->present = cc_isAnon(cond) ? cond->conditionType->asnType : cond->type->asnType; // This may look a little weird - we dont have a reference here to the correct // union choice for the condition type, so we just assign everything to the threshold @@ -187,14 +177,28 @@ static CC *fulfillmentToCC(Fulfillment_t *ffill) { } -CC *cc_readFulfillmentBinary(unsigned char *ffill_bin, size_t ffill_bin_len) { - Fulfillment_t *ffill = 0; +CC *cc_readFulfillmentBinary(const unsigned char *ffill_bin, size_t ffill_bin_len) { CC *cond = 0; + unsigned char *buf = malloc(ffill_bin_len); + Fulfillment_t *ffill = 0; asn_dec_rval_t rval = ber_decode(0, &asn_DEF_Fulfillment, (void **)&ffill, ffill_bin, ffill_bin_len); - if (rval.code == RC_OK) { - cond = fulfillmentToCC(ffill); - ASN_STRUCT_FREE(asn_DEF_Fulfillment, ffill); + if (rval.code != RC_OK) { + goto end; } + // Do malleability check + asn_enc_rval_t rc = der_encode_to_buffer(&asn_DEF_Fulfillment, ffill, buf, ffill_bin_len); + if (rc.encoded == -1) { + fprintf(stderr, "FULFILLMENT NOT ENCODED\n"); + goto end; + } + if (rc.encoded != ffill_bin_len || 0 != memcmp(ffill_bin, buf, rc.encoded)) { + goto end; + } + + cond = fulfillmentToCC(ffill); +end: + free(buf); + if (ffill) ASN_STRUCT_FREE(asn_DEF_Fulfillment, ffill); return cond; } @@ -224,6 +228,7 @@ int cc_verify(const struct CC *cond, const unsigned char *msg, size_t msgLength, unsigned char msgHash[32]; if (doHashMsg) sha256(msg, msgLength, msgHash); else memcpy(msgHash, msg, 32); + if (!cc_secp256k1VerifyTreeMsg32(cond, msgHash)) { return 0; } @@ -235,7 +240,7 @@ int cc_verify(const struct CC *cond, const unsigned char *msg, size_t msgLength, } -CC *cc_readConditionBinary(unsigned char *cond_bin, size_t length) { +CC *cc_readConditionBinary(const unsigned char *cond_bin, size_t length) { Condition_t *asnCond = 0; asn_dec_rval_t rval; rval = ber_decode(0, &asn_DEF_Condition, (void **)&asnCond, cond_bin, length); @@ -249,8 +254,21 @@ CC *cc_readConditionBinary(unsigned char *cond_bin, size_t length) { } +int cc_isAnon(const CC *cond) { + return cond->type->typeId == CC_Condition; +} + + enum CCTypeId cc_typeId(const CC *cond) { - return cond->type->typeId; + return cc_isAnon(cond) ? cond->conditionType->typeId : cond->type->typeId; +} + + +uint32_t cc_typeMask(const CC *cond) { + uint32_t mask = 1 << cc_typeId(cond); + if (cond->type->getSubtypes) + mask |= cond->type->getSubtypes(cond); + return mask; } @@ -259,9 +277,15 @@ int cc_isFulfilled(const CC *cond) { } -void cc_free(CC *cond) { - if (cond) - cond->type->free(cond); +char *cc_typeName(const CC *cond) { + return cc_isAnon(cond) ? cond->conditionType->name : cond->type->name; +} + + +void cc_free(CC *cond) { + if (cond) + cond->type->free(cond); + free(cond); } diff --git a/src/cryptoconditions/src/ed25519.c b/src/cryptoconditions/src/ed25519.c index 85655c2dc..b835cefc0 100644 --- a/src/cryptoconditions/src/ed25519.c +++ b/src/cryptoconditions/src/ed25519.c @@ -158,7 +158,6 @@ static void ed25519Free(CC *cond) { if (cond->signature) { free(cond->signature); } - free(cond); } @@ -167,4 +166,4 @@ static uint32_t ed25519Subtypes(const CC *cond) { } -struct CCType cc_ed25519Type = { 4, "ed25519-sha-256", Condition_PR_ed25519Sha256, 0, 0, &ed25519Fingerprint, &ed25519Cost, &ed25519Subtypes, &ed25519FromJSON, &ed25519ToJSON, &ed25519FromFulfillment, &ed25519ToFulfillment, &ed25519IsFulfilled, &ed25519Free }; +struct CCType cc_ed25519Type = { 4, "ed25519-sha-256", Condition_PR_ed25519Sha256, 0, &ed25519Fingerprint, &ed25519Cost, &ed25519Subtypes, &ed25519FromJSON, &ed25519ToJSON, &ed25519FromFulfillment, &ed25519ToFulfillment, &ed25519IsFulfilled, &ed25519Free }; diff --git a/src/cryptoconditions/src/eval.c b/src/cryptoconditions/src/eval.c index 976af32d7..13388b117 100644 --- a/src/cryptoconditions/src/eval.c +++ b/src/cryptoconditions/src/eval.c @@ -98,7 +98,6 @@ int evalIsFulfilled(const CC *cond) { static void evalFree(CC *cond) { free(cond->paramsBin); - free(cond); } @@ -139,4 +138,4 @@ int cc_verifyEval(const CC *cond, VerifyEval verify, void *context) { } -struct CCType cc_evalType = { 15, "eval-sha-256", Condition_PR_evalSha256, 0, 0, &evalFingerprint, &evalCost, &evalSubtypes, &evalFromJSON, &evalToJSON, &evalFromFulfillment, &evalToFulfillment, &evalIsFulfilled, &evalFree }; +struct CCType cc_evalType = { 15, "eval-sha-256", Condition_PR_evalSha256, 0, &evalFingerprint, &evalCost, &evalSubtypes, &evalFromJSON, &evalToJSON, &evalFromFulfillment, &evalToFulfillment, &evalIsFulfilled, &evalFree }; diff --git a/src/cryptoconditions/src/internal.h b/src/cryptoconditions/src/internal.h index bfcc6bd14..28b3661f4 100644 --- a/src/cryptoconditions/src/internal.h +++ b/src/cryptoconditions/src/internal.h @@ -1,3 +1,5 @@ +#include +#include #include "include/cJSON.h" #include "asn/asn_application.h" #include "cryptoconditions.h" @@ -17,10 +19,9 @@ extern "C" { /* * Condition Type */ typedef struct CCType { - uint8_t typeId; + int typeId; unsigned char name[100]; Condition_PR asnType; - int hasSubtypes; int (*visitChildren)(CC *cond, CCVisitor visitor); unsigned char *(*fingerprint)(const CC *cond); unsigned long (*getCost)(const CC *cond); diff --git a/src/cryptoconditions/src/prefix.c b/src/cryptoconditions/src/prefix.c index 527115709..423ee3ecf 100644 --- a/src/cryptoconditions/src/prefix.c +++ b/src/cryptoconditions/src/prefix.c @@ -71,7 +71,7 @@ static Fulfillment_t *prefixToFulfillment(const CC *cond) { static uint32_t prefixSubtypes(const CC *cond) { - return cc_typeMask(cond->subcondition) & ~(1 << cc_prefixType.typeId); + return cc_typeMask(cond->subcondition) & ~(1 << CC_Prefix); } @@ -119,8 +119,7 @@ int prefixIsFulfilled(const CC *cond) { static void prefixFree(CC *cond) { free(cond->prefix); cc_free(cond->subcondition); - free(cond); } -struct CCType cc_prefixType = { 1, "prefix-sha-256", Condition_PR_prefixSha256, 1, &prefixVisitChildren, &prefixFingerprint, &prefixCost, &prefixSubtypes, &prefixFromJSON, &prefixToJSON, &prefixFromFulfillment, &prefixToFulfillment, &prefixIsFulfilled, &prefixFree }; +struct CCType cc_prefixType = { 1, "prefix-sha-256", Condition_PR_prefixSha256, &prefixVisitChildren, &prefixFingerprint, &prefixCost, &prefixSubtypes, &prefixFromJSON, &prefixToJSON, &prefixFromFulfillment, &prefixToFulfillment, &prefixIsFulfilled, &prefixFree }; diff --git a/src/cryptoconditions/src/preimage.c b/src/cryptoconditions/src/preimage.c index 71d3b2e89..95f19c09d 100644 --- a/src/cryptoconditions/src/preimage.c +++ b/src/cryptoconditions/src/preimage.c @@ -71,7 +71,6 @@ int preimageIsFulfilled(const CC *cond) { static void preimageFree(CC *cond) { free(cond->preimage); - free(cond); } @@ -80,4 +79,4 @@ static uint32_t preimageSubtypes(const CC *cond) { } -struct CCType cc_preimageType = { 0, "preimage-sha-256", Condition_PR_preimageSha256, 0, 0, &preimageFingerprint, &preimageCost, &preimageSubtypes, &preimageFromJSON, &preimageToJSON, &preimageFromFulfillment, &preimageToFulfillment, &preimageIsFulfilled, &preimageFree }; +struct CCType cc_preimageType = { 0, "preimage-sha-256", Condition_PR_preimageSha256, 0, &preimageFingerprint, &preimageCost, &preimageSubtypes, &preimageFromJSON, &preimageToJSON, &preimageFromFulfillment, &preimageToFulfillment, &preimageIsFulfilled, &preimageFree }; diff --git a/src/cryptoconditions/src/secp256k1.c b/src/cryptoconditions/src/secp256k1.c index be8fbd761..cfaf7c3de 100644 --- a/src/cryptoconditions/src/secp256k1.c +++ b/src/cryptoconditions/src/secp256k1.c @@ -270,7 +270,6 @@ static void secp256k1Free(CC *cond) { if (cond->signature) { free(cond->signature); } - free(cond); } @@ -279,4 +278,4 @@ static uint32_t secp256k1Subtypes(const CC *cond) { } -struct CCType cc_secp256k1Type = { 5, "secp256k1-sha-256", Condition_PR_secp256k1Sha256, 0, 0, &secp256k1Fingerprint, &secp256k1Cost, &secp256k1Subtypes, &secp256k1FromJSON, &secp256k1ToJSON, &secp256k1FromFulfillment, &secp256k1ToFulfillment, &secp256k1IsFulfilled, &secp256k1Free }; +struct CCType cc_secp256k1Type = { 5, "secp256k1-sha-256", Condition_PR_secp256k1Sha256, 0, &secp256k1Fingerprint, &secp256k1Cost, &secp256k1Subtypes, &secp256k1FromJSON, &secp256k1ToJSON, &secp256k1FromFulfillment, &secp256k1ToFulfillment, &secp256k1IsFulfilled, &secp256k1Free }; diff --git a/src/cryptoconditions/src/threshold.c b/src/cryptoconditions/src/threshold.c index d3f4d3e63..d79c01813 100644 --- a/src/cryptoconditions/src/threshold.c +++ b/src/cryptoconditions/src/threshold.c @@ -16,7 +16,7 @@ static uint32_t thresholdSubtypes(const CC *cond) { for (int i=0; isize; i++) { mask |= cc_typeMask(cond->subconditions[i]); } - mask &= ~(1 << cc_thresholdType.typeId); + mask &= ~(1 << CC_Threshold); return mask; } @@ -53,13 +53,19 @@ static int thresholdVisitChildren(CC *cond, CCVisitor visitor) { } -static int cmpConditions(const void *a, const void *b) { +static int cmpConditionBin(const void *a, const void *b) { /* Compare conditions by their ASN binary representation */ unsigned char bufa[BUF_SIZE], bufb[BUF_SIZE]; asn_enc_rval_t r0 = der_encode_to_buffer(&asn_DEF_Condition, *(Condition_t**)a, bufa, BUF_SIZE); asn_enc_rval_t r1 = der_encode_to_buffer(&asn_DEF_Condition, *(Condition_t**)b, bufb, BUF_SIZE); - int diff = r0.encoded - r1.encoded; - return diff != 0 ? diff : strcmp(bufa, bufb); + + // below copied from ASN lib + size_t commonLen = r0.encoded < r1.encoded ? r0.encoded : r1.encoded; + int ret = memcmp(bufa, bufb, commonLen); + + if (ret == 0) + return r0.encoded < r1.encoded ? -1 : 1; + return 0; } @@ -68,13 +74,32 @@ static unsigned char *thresholdFingerprint(const CC *cond) { ThresholdFingerprintContents_t *fp = calloc(1, sizeof(ThresholdFingerprintContents_t)); fp->threshold = cond->threshold; for (int i=0; isize; i++) { - asn_set_add(&fp->subconditions2, asnConditionNew(cond->subconditions[i])); + Condition_t *asnCond = asnConditionNew(cond->subconditions[i]); + asn_set_add(&fp->subconditions2, asnCond); } - qsort(fp->subconditions2.list.array, cond->size, sizeof(Condition_t*), cmpConditions); + qsort(fp->subconditions2.list.array, cond->size, sizeof(Condition_t*), cmpConditionBin); return hashFingerprintContents(&asn_DEF_ThresholdFingerprintContents, fp); } +static int cmpConditionCost(const void *a, const void *b) { + CC *ca = *((CC**)a); + CC *cb = *((CC**)b); + + int out = cc_getCost(ca) - cc_getCost(cb); + if (out != 0) return out; + + // Do an additional sort to establish consistent order + // between conditions with the same cost. + Condition_t *asna = asnConditionNew(ca); + Condition_t *asnb = asnConditionNew(cb); + out = cmpConditionBin(&asna, &asnb); + ASN_STRUCT_FREE(asn_DEF_Condition, asna); + ASN_STRUCT_FREE(asn_DEF_Condition, asnb); + return out; +} + + static CC *thresholdFromFulfillment(const Fulfillment_t *ffill) { ThresholdFulfillment_t *t = ffill->choice.thresholdSha256; int threshold = t->subfulfillments.list.count; @@ -83,7 +108,7 @@ static CC *thresholdFromFulfillment(const Fulfillment_t *ffill) { CC **subconditions = calloc(size, sizeof(CC*)); for (int i=0; isubfulfillments.list.array[i]) : mkAnon(t->subconditions.list.array[i-threshold]); @@ -103,16 +128,11 @@ static CC *thresholdFromFulfillment(const Fulfillment_t *ffill) { } -static int cmpByCostDesc(const void *c1, const void *c2) { - return cc_getCost(*((CC**)c1)) - cc_getCost(*((CC**)c2)); -} - - static Fulfillment_t *thresholdToFulfillment(const CC *cond) { CC *sub; Fulfillment_t *fulfillment; - qsort(cond->subconditions, cond->size, sizeof(CC*), cmpByCostDesc); + qsort(cond->subconditions, cond->size, sizeof(CC*), cmpConditionCost); ThresholdFulfillment_t *tf = calloc(1, sizeof(ThresholdFulfillment_t)); @@ -124,7 +144,7 @@ static Fulfillment_t *thresholdToFulfillment(const CC *cond) { asn_set_add(&tf->subfulfillments, fulfillment); needed--; } else { - asn_set_add(&tf->subconditions, asnConditionNew(cond->subconditions[i])); + asn_set_add(&tf->subconditions, asnConditionNew(sub)); } } @@ -199,8 +219,7 @@ static void thresholdFree(CC *cond) { cc_free(cond->subconditions[i]); } free(cond->subconditions); - free(cond); } -struct CCType cc_thresholdType = { 2, "threshold-sha-256", Condition_PR_thresholdSha256, 1, &thresholdVisitChildren, &thresholdFingerprint, &thresholdCost, &thresholdSubtypes, &thresholdFromJSON, &thresholdToJSON, &thresholdFromFulfillment, &thresholdToFulfillment, &thresholdIsFulfilled, &thresholdFree }; +struct CCType cc_thresholdType = { 2, "threshold-sha-256", Condition_PR_thresholdSha256, &thresholdVisitChildren, &thresholdFingerprint, &thresholdCost, &thresholdSubtypes, &thresholdFromJSON, &thresholdToJSON, &thresholdFromFulfillment, &thresholdToFulfillment, &thresholdIsFulfilled, &thresholdFree }; diff --git a/src/cryptoconditions/src/utils.c b/src/cryptoconditions/src/utils.c index d1e63629f..69db32042 100644 --- a/src/cryptoconditions/src/utils.c +++ b/src/cryptoconditions/src/utils.c @@ -187,6 +187,7 @@ int jsonGetBase64Optional(const cJSON *params, unsigned char *key, unsigned char return checkDecodeBase64(item, key, err, data, size); } + void jsonAddBase64(cJSON *params, unsigned char *key, unsigned char *bin, size_t size) { unsigned char *b64 = base64_encode(bin, size); cJSON_AddItemToObject(params, key, cJSON_CreateString(b64)); diff --git a/src/cryptoconditions/tests/test_failure_modes.py b/src/cryptoconditions/tests/test_failure_modes.py index 839eded3b..52ab3bdb9 100644 --- a/src/cryptoconditions/tests/test_failure_modes.py +++ b/src/cryptoconditions/tests/test_failure_modes.py @@ -1,7 +1,7 @@ import json import ctypes import base64 -from .test_vectors import jsonRPC, so, decode_base64 as d64 +from .test_vectors import jsonRPC, so, decode_base64 as d64, encode_base64 as e64 ''' @@ -10,7 +10,6 @@ These tests are aimed at edge cases of serverside deployment. As such, the main functions to test are decoding and verifying fulfillment payloads. ''' - cc_rfb = lambda f: so.cc_readFulfillmentBinary(f, len(f)) cc_rcb = lambda f: so.cc_readConditionBinary(f, len(f)) @@ -44,7 +43,7 @@ def test_large_fulfillment(): def test_decode_valid_condition(): # Valid preimage - assert cc_rcb(d64('oCWAIMqXgRLKG73K-sIxs5oj3E2nhu_4FHxOcrmAd4Wv7ki7gQEB')) + assert cc_rcb(d64(b'oCWAIMqXgRLKG73K-sIxs5oj3E2nhu_4FHxOcrmAd4Wv7ki7gQEB')) # Somewhat bogus condition (prefix with no subtypes) but nonetheless valid structure assert cc_rcb(unhex("a10a8001618101ff82020700")) @@ -76,3 +75,11 @@ def test_non_canonical_secp256k1(): 'message': '' }) assert res['valid'] == False + + +def test_malleability_checked(): + assert cc_rfb(b'\xa2\x13\xa0\x0f\xa0\x05\x80\x03abc\xa0\x06\x80\x04abcd\xa1\x00') + assert not cc_rfb(b'\xa2\x13\xa0\x0f\xa0\x06\x80\x04abcd\xa0\x05\x80\x03abc\xa1\x00') + + +so.cc_conditionUri.restype = ctypes.c_char_p diff --git a/src/komodo_cc.cpp b/src/komodo_cc.cpp new file mode 100644 index 000000000..1b05ea070 --- /dev/null +++ b/src/komodo_cc.cpp @@ -0,0 +1,44 @@ +#include "cryptoconditions/include/cryptoconditions.h" +#include "komodo_cc.h" + + +bool IsCryptoConditionsEnabled() +{ + return 0 != ASSETCHAINS_CC; +} + +// Limit acceptable condition types +// Prefix not enabled because no current use case, ambiguity on how to combine with secp256k1 +// RSA not enabled because no current use case, not implemented +int CCEnabledTypes = 1 << CC_Secp256k1 | \ + 1 << CC_Threshold | \ + 1 << CC_Eval | \ + 1 << CC_Preimage | \ + 1 << CC_Ed25519; + + +int CCSigningNodes = 1 << CC_Ed25519 | 1 << CC_Secp256k1; + + +bool IsSupportedCryptoCondition(const CC *cond) +{ + int mask = cc_typeMask(cond); + + if (mask & ~CCEnabledTypes) return false; + + // Also require that the condition have at least one signable node + if (!(mask & CCSigningNodes)) return false; + + return true; +} + + +bool IsSignedCryptoCondition(const CC *cond) +{ + if (!cc_isFulfilled(cond)) return false; + if (1 << cc_typeId(cond) & CCSigningNodes) return true; + if (cc_typeId(cond) == CC_Threshold) + for (int i=0; isize; i++) + if (IsSignedCryptoCondition(cond->subconditions[i])) return true; + return false; +} diff --git a/src/komodo_cc.h b/src/komodo_cc.h index fe05d3fc0..57d24f92e 100644 --- a/src/komodo_cc.h +++ b/src/komodo_cc.h @@ -2,39 +2,22 @@ #define KOMODO_CC_H #include "cryptoconditions/include/cryptoconditions.h" -#include "primitives/transaction.h" -/* - * Check if CryptoConditions is enabled based on chain or cmd flag - */ extern int32_t ASSETCHAINS_CC; -static bool IsCryptoConditionsEnabled() -{ - return 0 != ASSETCHAINS_CC; -} +bool IsCryptoConditionsEnabled(); /* * Check if the server can accept the condition based on it's structure / types */ -static bool IsAcceptableCryptoCondition(const CC *cond) -{ - int32_t typeMask = cc_typeMask(cond); +bool IsSupportedCryptoCondition(const CC *cond); - // Require a signature to prevent transaction malleability - if (0 == typeMask & (1 << CC_Secp256k1) || - 0 == typeMask & (1 << CC_Ed25519)) return false; - // Limit acceptable condition types - // Prefix not enabled because no current use case, ambiguity on how to combine with secp256k1 - // RSA not enabled because no current use case, not implemented - int enabledTypes = 1 << CC_Secp256k1 | 1 << CC_Threshold | 1 << CC_Eval | \ - 1 << CC_Preimage | 1 << CC_Ed25519; - if (typeMask & ~enabledTypes) return false; - - return true; -} +/* + * Check if crypto condition is signed. Can only accept signed conditions. + */ +bool IsSignedCryptoCondition(const CC *cond); #endif /* KOMODO_CC_H */ diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 20027ea41..851904eb3 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -950,27 +950,19 @@ bool EvalScript( if (stack.size() < 2) return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); - valtype& vchFulfillment = stacktop(-2); - valtype& vchCondition = stacktop(-1); - - CC *cond = cc_readFulfillmentBinary((unsigned char*)vchFulfillment.data(), - vchFulfillment.size()); - if (!cond) { + int fResult = checker.CheckCryptoCondition(stacktop(-1), stacktop(-2), script, consensusBranchId); + if (fResult == -1) { return set_error(serror, SCRIPT_ERR_CRYPTOCONDITION_INVALID_FULFILLMENT); } - - bool fSuccess = checker.CheckCryptoCondition(cond, vchCondition, script, consensusBranchId); - - cc_free(cond); - + popstack(stack); popstack(stack); - stack.push_back(fSuccess ? vchTrue : vchFalse); + stack.push_back(fResult == 1 ? vchTrue : vchFalse); if (opcode == OP_CHECKCRYPTOCONDITIONVERIFY) { - if (fSuccess) + if (fResult == 1) popstack(stack); else return set_error(serror, SCRIPT_ERR_CRYPTOCONDITION_VERIFY); @@ -1295,18 +1287,33 @@ bool TransactionSignatureChecker::CheckSig( } -bool TransactionSignatureChecker::CheckCryptoCondition(const CC *cond, const std::vector& condBin, const CScript& scriptCode, uint32_t consensusBranchId) const +int TransactionSignatureChecker::CheckCryptoCondition( + const std::vector& condBin, + const std::vector& ffillBin, + const CScript& scriptCode, + uint32_t consensusBranchId) const { - if (!IsAcceptableCryptoCondition(cond)) return false; + // Hash type is one byte tacked on to the end of the fulfillment + if (ffillBin.empty()) + return false; + + CC *cond = cc_readFulfillmentBinary((unsigned char*)ffillBin.data(), ffillBin.size()-1); + if (!cond) return -1; + + if (!IsSupportedCryptoCondition(cond)) return 0; + if (!IsSignedCryptoCondition(cond)) return 0; uint256 sighash; + int nHashType = ffillBin.back(); try { - sighash = SignatureHash(scriptCode, *txTo, nIn, SIGHASH_ALL, amount, consensusBranchId, this->txdata); + sighash = SignatureHash(scriptCode, *txTo, nIn, nHashType, amount, consensusBranchId, this->txdata); } catch (logic_error ex) { - return false; + return 0; } - return cc_verify(cond, (const unsigned char*)&sighash, 32, 0, - condBin.data(), condBin.size(), GetCCEval(), (void*)this); + int out = cc_verify(cond, (const unsigned char*)&sighash, 32, 0, + condBin.data(), condBin.size(), GetCCEval(), (void*)this); + cc_free(cond); + return out; } diff --git a/src/script/interpreter.h b/src/script/interpreter.h index 86ab8dac3..699d6e78c 100644 --- a/src/script/interpreter.h +++ b/src/script/interpreter.h @@ -128,7 +128,11 @@ public: return false; } - virtual bool CheckCryptoCondition(const CC *cond, const std::vector& condBin, const CScript& scriptCode, uint32_t consensusBranchId) const + virtual int CheckCryptoCondition( + const std::vector& condBin, + const std::vector& ffillBin, + const CScript& scriptCode, + uint32_t consensusBranchId) const { return false; } @@ -152,7 +156,11 @@ public: TransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn, const PrecomputedTransactionData& txdataIn) : txTo(txToIn), nIn(nInIn), amount(amountIn), txdata(&txdataIn) {} bool CheckSig(const std::vector& scriptSig, const std::vector& vchPubKey, const CScript& scriptCode, uint32_t consensusBranchId) const; bool CheckLockTime(const CScriptNum& nLockTime) const; - bool CheckCryptoCondition(const CC *cond, const std::vector& condBin, const CScript& scriptCode, uint32_t consensusBranchId) const; + int CheckCryptoCondition( + const std::vector& condBin, + const std::vector& ffillBin, + const CScript& scriptCode, + uint32_t consensusBranchId) const; VerifyEval GetCCEval() const; }; diff --git a/src/script/script.cpp b/src/script/script.cpp index d885146a2..cfea13efe 100644 --- a/src/script/script.cpp +++ b/src/script/script.cpp @@ -250,8 +250,9 @@ bool CScript::MayAcceptCryptoCondition() const if (!(opcode > OP_0 && opcode < OP_PUSHDATA1)) return false; CC *cond = cc_readConditionBinary(data.data(), data.size()); if (!cond) return false; - bool accept = IsAcceptableCryptoCondition(cond); - return accept; + bool out = IsSupportedCryptoCondition(cond); + cc_free(cond); + return out; } bool CScript::IsPushOnly() const diff --git a/src/zcash/CreateJoinSplit.cpp b/src/zcash/CreateJoinSplit.cpp index 8f651f910..166b4fac7 100644 --- a/src/zcash/CreateJoinSplit.cpp +++ b/src/zcash/CreateJoinSplit.cpp @@ -11,6 +11,7 @@ char ASSETCHAINS_SYMBOL[KOMODO_ASSETCHAIN_MAXLEN]; int64_t MAX_MONEY = 200000000 * 100000000LL; uint16_t BITCOIND_PORT = 7771; +uint32_t ASSETCHAINS_CC = 0; using namespace libzcash; From 4c121ffdb0b3ddcaab24f518809e5633ac9fef19 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Sun, 1 Apr 2018 21:18:01 -0300 Subject: [PATCH 0761/1062] cpp test suite for cryptoconditions integration --- depends/packages/packages.mk | 4 +- qa/cryptoconditions/README.md | 11 - qa/cryptoconditions/test_integration.py | 223 ----------------- qa/cryptoconditions/testsupport.py | 151 ------------ src/Makefile.am | 5 +- src/Makefile.ktest.include | 14 ++ src/cc/eval.cpp | 4 +- .../include/cryptoconditions.h | 15 +- src/cryptoconditions/src/cryptoconditions.c | 18 +- src/cryptoconditions/src/internal.h | 20 +- src/cryptoconditions/src/json_rpc.c | 50 ++-- src/cryptoconditions/src/secp256k1.c | 9 +- src/cryptoconditions/src/threshold.c | 4 +- src/cryptoconditions/src/utils.c | 10 +- src/komodo_cc.cpp | 12 - src/komodo_cc.h | 11 + src/script/interpreter.h | 2 +- src/test-komodo/main.cpp | 12 + src/test-komodo/test_cryptoconditions.cpp | 226 ++++++++++++++++++ 19 files changed, 336 insertions(+), 465 deletions(-) delete mode 100644 qa/cryptoconditions/README.md delete mode 100644 qa/cryptoconditions/test_integration.py delete mode 100644 qa/cryptoconditions/testsupport.py create mode 100644 src/Makefile.ktest.include create mode 100644 src/test-komodo/main.cpp create mode 100644 src/test-komodo/test_cryptoconditions.cpp diff --git a/depends/packages/packages.mk b/depends/packages/packages.mk index 8475ec7d5..f75fcb50e 100644 --- a/depends/packages/packages.mk +++ b/depends/packages/packages.mk @@ -3,9 +3,9 @@ rust_packages := rust librustzcash proton_packages := proton zcash_packages := libgmp libsodium ifeq ($(host_os),linux) - packages := boost openssl libevent zeromq $(zcash_packages) #googletest googlemock + packages := boost openssl libevent zeromq $(zcash_packages) googletest # googlemock else - packages := boost openssl libevent zeromq $(zcash_packages) libcurl # googletest googlemock libcurl + packages := boost openssl libevent zeromq $(zcash_packages) libcurl googletest # googlemock endif native_packages := native_ccache diff --git a/qa/cryptoconditions/README.md b/qa/cryptoconditions/README.md deleted file mode 100644 index 2bf479ecd..000000000 --- a/qa/cryptoconditions/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# Integration tests for Crypto-Conditions - -These tests are for the [Crypto-Conditions](https://github.com/rfcs/crypto-conditions) functionality in Komodod, using [Hoek](https://github.com/libscott/hoek) as a tool to create and sign transactions. - -## How to run the tests - -1. Install hoek: https://github.com/libscott/hoek -1. Allow peer-less block creation: set "fMiningRequiresPeers = false" in src/chainparams.cpp, then build komodod. -1. Start komodod: `src/komodod -ac_name=CCTEST -ac_supply=21000000 -gen -pubkey=0205a8ad0c1dbc515f149af377981aab58b836af008d4d7ab21bd76faf80550b47 -ac_cc=1` -1. Set environment variable pointing to Komodo conf: `export KOMODO_CONF_PATH=~/.komodo/CCTEST/CCTEST.conf` -1. Run tests: `python test_integration.py` (you can also use a test runner such as `nose`). diff --git a/qa/cryptoconditions/test_integration.py b/qa/cryptoconditions/test_integration.py deleted file mode 100644 index bd72b961d..000000000 --- a/qa/cryptoconditions/test_integration.py +++ /dev/null @@ -1,223 +0,0 @@ -import sys -import time -import json -import logging -import binascii -import struct -from testsupport import * - - -SCRIPT_FALSE = 'Script evaluated without error but finished with a false/empty top stack element' - - -@fanout_input(0) -def test_basic_spend(inp): - spend = {'inputs': [inp], "outputs": [nospend]} - spend_txid = submit(sign(spend)) - assert rpc.getrawtransaction(spend_txid) - - -@fanout_input(1) -def test_fulfillment_wrong_signature(inp): - # Set other pubkey and sign - inp['script']['fulfillment']['publicKey'] = bob_pk - spend = {'inputs': [inp], 'outputs': [nospend]} - signed = sign(spend) - - # Set the correct pubkey, signature is bob's - signed['inputs'][0]['script']['fulfillment']['publicKey'] = alice_pk - - try: - assert not submit(signed), 'should raise an error' - except RPCError as e: - assert SCRIPT_FALSE in str(e), str(e) - - -@fanout_input(2) -def test_fulfillment_wrong_pubkey(inp): - spend = {'inputs': [inp], 'outputs': [nospend]} - signed = sign(spend) - - # Set the wrong pubkey, signature is correct - signed['inputs'][0]['script']['fulfillment']['publicKey'] = bob_pk - - try: - assert not submit(signed), 'should raise an error' - except RPCError as e: - assert SCRIPT_FALSE in str(e), str(e) - - -@fanout_input(3) -def test_invalid_fulfillment_binary(inp): - # Create a valid script with an invalid fulfillment payload - inp['script'] = binascii.hexlify(b"\007invalid").decode('utf-8') - spend = {'inputs': [inp], 'outputs': [nospend]} - - try: - assert not submit(spend), 'should raise an error' - except RPCError as e: - assert 'Crypto-Condition payload is invalid' in str(e), str(e) - - -@fanout_input(4) -def test_invalid_condition(inp): - # Create a valid output script with an invalid cryptocondition binary - outputscript = to_hex(b"\007invalid\xcc") - spend = {'inputs': [inp], 'outputs': [{'amount': 1000, 'script': outputscript}]} - spend_txid = submit(sign(spend)) - - spend1 = { - 'inputs': [{'txid': spend_txid, 'idx': 0, 'script': {'fulfillment': cond_alice}}], - 'outputs': [nospend], - } - - try: - assert not submit(sign(spend1)), 'should raise an error' - except RPCError as e: - assert SCRIPT_FALSE in str(e), str(e) - - -@fanout_input(5) -def test_oversize_fulfillment(inp): - # Create oversize fulfillment script where the total length is <2000 - binscript = b'\x4d%s%s' % (struct.pack('h', 2000), b'a' * 2000) - inp['script'] = to_hex(binscript) - spend = {'inputs': [inp], 'outputs': [nospend]} - - try: - assert not submit(spend), 'should raise an error' - except RPCError as e: - assert 'scriptsig-size' in str(e), str(e) - - -@fanout_input(6) -def test_aux_basic(inp): - aux_cond = { - 'type': 'aux-sha-256', - 'method': 'equals', - 'conditionAux': 'LTE', - 'fulfillmentAux': 'LTE' - } - - # Setup some aux outputs - spend0 = { - 'inputs': [inp], - 'outputs': [ - {'amount': 500, 'script': {'condition': aux_cond}}, - {'amount': 500, 'script': {'condition': aux_cond}} - ] - } - spend0_txid = submit(sign(spend0)) - assert rpc.getrawtransaction(spend0_txid) - - # Test a good fulfillment - spend1 = { - 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {'fulfillment': aux_cond}}], - 'outputs': [{'amount': 500, 'script': {'condition': aux_cond}}] - } - spend1_txid = submit(sign(spend1)) - assert rpc.getrawtransaction(spend1_txid) - - # Test a bad fulfillment - aux_cond['fulfillmentAux'] = 'WYW' - spend2 = { - 'inputs': [{'txid': spend0_txid, 'idx': 1, 'script': {'fulfillment': aux_cond}}], - 'outputs': [{'amount': 500, 'script': {'condition': aux_cond}}] - } - try: - assert not submit(sign(spend2)), 'should raise an error' - except RPCError as e: - assert SCRIPT_FALSE in str(e), str(e) - - -@fanout_input(7) -def test_aux_complex(inp): - aux_cond = { - 'type': 'aux-sha-256', - 'method': 'inputIsReturn', - 'conditionAux': '', - 'fulfillmentAux': 'AQ' # \1 (tx.vout[1]) - } - - # Setup some aux outputs - spend0 = { - 'inputs': [inp], - 'outputs': [ - {'amount': 500, 'script': {'condition': aux_cond}}, - {'amount': 500, 'script': {'condition': aux_cond}} - ] - } - spend0_txid = submit(sign(spend0)) - assert rpc.getrawtransaction(spend0_txid) - - # Test a good fulfillment - spend1 = { - 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {'fulfillment': aux_cond}}], - 'outputs': [ - {'amount': 250, 'script': {'condition': aux_cond}}, - {'amount': 250, 'script': "6A0B68656C6C6F207468657265"} # OP_RETURN somedata - ] - } - spend1_txid = submit(sign(spend1)) - assert rpc.getrawtransaction(spend1_txid) - - # Test a bad fulfillment - spend2 = { - 'inputs': [{'txid': spend0_txid, 'idx': 1, 'script': {'fulfillment': aux_cond}}], - 'outputs': [ - {'amount': 500, 'script': "6A0B68656C6C6F207468657265"} # OP_RETURN somedata - ] - } - try: - assert not submit(sign(spend2)), 'should raise an error' - except RPCError as e: - assert SCRIPT_FALSE in str(e), str(e) - - -@fanout_input(8) -def test_secp256k1_condition(inp): - ec_cond = { - 'type': 'secp256k1-sha-256', - 'publicKey': notary_pk - } - - # Create some secp256k1 outputs - spend0 = { - 'inputs': [inp], - 'outputs': [ - {'amount': 500, 'script': {'condition': ec_cond}}, - {'amount': 500, 'script': {'condition': ec_cond}} - ] - } - spend0_txid = submit(sign(spend0)) - assert rpc.getrawtransaction(spend0_txid) - - # Test a good fulfillment - spend1 = { - 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {'fulfillment': ec_cond}}], - 'outputs': [{'amount': 500, 'script': {'condition': ec_cond}}] - } - spend1_txid = submit(sign(spend1)) - assert rpc.getrawtransaction(spend1_txid) - - # Test a bad fulfillment - spend2 = { - 'inputs': [{'txid': spend0_txid, 'idx': 1, 'script': {'fulfillment': ec_cond}}], - 'outputs': [{'amount': 500, 'script': {'condition': ec_cond}}] - } - signed = sign(spend2) - signed['inputs'][0]['script']['fulfillment']['publicKey'] = \ - '0275cef12fc5c49be64f5aab3d1fbba08cd7b0d02908b5112fbd8504218d14bc7d' - try: - assert not submit(signed), 'should raise an error' - except RPCError as e: - assert SCRIPT_FALSE in str(e), str(e) - - -if __name__ == '__main__': - logging.basicConfig(level=logging.INFO) - for name, f in globals().items(): - if name.startswith('test_'): - logging.info("Running test: %s" % name) - f() - logging.info("Test OK: %s" % name) diff --git a/qa/cryptoconditions/testsupport.py b/qa/cryptoconditions/testsupport.py deleted file mode 100644 index e22520f3f..000000000 --- a/qa/cryptoconditions/testsupport.py +++ /dev/null @@ -1,151 +0,0 @@ -from __future__ import print_function -import sys -import json -import time -import copy -import base64 -import logging -import functools -import subprocess - - -class RPCError(IOError): - pass - - -class JsonClient(object): - def __getattr__(self, method): - if method[0] == '_': - return getattr(super(JsonClient, self), method) - def inner(*args): - return self._exec(method, args) - return inner - - def load_response(self, data): - data = json.loads(data.decode("utf-8")) - if data.get('error'): - raise RPCError(data['error']) - if 'result' in data: - return data['result'] - return data - - -def run_cmd(cmd): - proc = subprocess.Popen(cmd, stdout=subprocess.PIPE) - assert proc.wait() == 0 - return proc.stdout.read() - - -def to_hex(s): - return base64.b16encode(s).decode('utf-8') - - -class Hoek(JsonClient): - def _exec(self, method, args): - cmd = ['hoek', method, json.dumps(args[0])] - return self.load_response(run_cmd(cmd)) - - -class Komodod(JsonClient): - def _exec(self, method, args): - if not hasattr(self, '_url'): - urltpl = 'http://$rpcuser:$rpcpassword@${rpchost:-127.0.0.1}:$rpcport' - cmd = ['bash', '-c', '. $KOMODO_CONF_PATH && echo -n %s' % urltpl] - self._url = run_cmd(cmd) - - req = {'method': method, 'params': args, 'id': 1} - cmd = ['curl', '-s', '-H', 'Content-Type: application/json', '-d', json.dumps(req), self._url] - return self.load_response(run_cmd(cmd)) - - -rpc = Komodod() -hoek = Hoek() - - -def wait_for_block(height): - logging.info("Waiting for block height %s" % height) - for i in range(100): - try: - return rpc.getblock(str(height)) - except RPCError as e: - time.sleep(3) - raise Exception('Time out waiting for block at height %s' % height) - - -def sign(tx): - signed = hoek.signTxBitcoin({'tx': tx, 'privateKeys': [notary_sk]}) - signed = hoek.signTxEd25519({'tx': signed, 'privateKeys': [alice_sk, bob_sk]}) - return hoek.signTxSecp256k1({'tx': signed, 'privateKeys': [notary_sk]}) - - -def submit(tx): - encoded = hoek.encodeTx(tx) - try: - rpc.getrawtransaction(encoded['txid']) - logging.info("Transaction already in chain: %s" % encoded['txid']) - return encoded['txid'] - except RPCError: - pass - logging.info("submit transaction: %s:%s" % (encoded['txid'], json.dumps(tx))) - return rpc.sendrawtransaction(encoded['hex']) - - -def get_fanout_txid(): - block = wait_for_block(1) - reward_txid = block['tx'][0] - reward_tx_raw = rpc.getrawtransaction(reward_txid) - reward_tx = hoek.decodeTx({'hex': reward_tx_raw}) - balance = reward_tx['outputs'][0]['amount'] - - n_outs = 16 - remainder = balance - n_outs * 1000 - - fanout = { - 'inputs': [ - {'txid': reward_txid, 'idx': 0, 'script': {'pubkey': notary_pk}} - ], - "outputs": (n_outs * [ - {"amount": 1000, "script": {"condition": cond_alice}} - ] + [{"amount": remainder, 'script': {'address': notary_addr}}]) - } - - return submit(sign(fanout)) - - -def fanout_input(n): - def decorate(f): - def wrapper(): - if not hasattr(fanout_input, 'txid'): - fanout_input.txid = get_fanout_txid() - inp = {'txid': fanout_input.txid, 'idx': n, 'script': {'fulfillment': cond_alice}} - f(copy.deepcopy(inp)) - return functools.wraps(f)(wrapper) - return decorate - - -def decode_base64(data): - """Decode base64, padding being optional. - - :param data: Base64 data as an ASCII byte string - :returns: The decoded byte string. - """ - missing_padding = len(data) % 4 - if missing_padding: - data += '=' * (4 - missing_padding) - return base64.urlsafe_b64decode(data) - - -def encode_base64(data): - return base64.urlsafe_b64encode(data).rstrip(b'=') - - -notary_addr = 'RXSwmXKtDURwXP7sdqNfsJ6Ga8RaxTchxE' -notary_pk = '0205a8ad0c1dbc515f149af377981aab58b836af008d4d7ab21bd76faf80550b47' -notary_sk = 'UxFWWxsf1d7w7K5TvAWSkeX4H95XQKwdwGv49DXwWUTzPTTjHBbU' -alice_pk = '8ryTLBMnozUK4xUz7y49fjzZhxDDMK7c4mucLdbVY6jW' -alice_sk = 'E4ER7uYvaSTdpQFzTXNNSTkR6jNRJyqhZPJMGuU899nY' -cond_alice = {"type": "ed25519-sha-256", "publicKey": alice_pk} -bob_pk = 'C8MfEjKiFxDguacHvcM7MV83cRQ55RAHacC73xqg8qeu' -bob_sk = 'GrP1fZdUxUc1NYmu7kiNkJV4p7PKpshp1yBY7hogPUWT' -cond_bob = {"type": "ed25519-sha-256", "publicKey": bob_pk} -nospend = {"amount": 1000, "script": {"address": notary_addr}} diff --git a/src/Makefile.am b/src/Makefile.am index 7c64dcfd9..092015600 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -620,9 +620,10 @@ endif @test -f $(PROTOC) $(AM_V_GEN) $(PROTOC) --cpp_out=$(@D) --proto_path=$(abspath $(method, "testEval") == 0) { + if (strcmp(cond->method, "TestEval") == 0) { return cond->paramsBinLength == 8 && - memcmp(cond->paramsBin, "testEval", 8) == 0; + memcmp(cond->paramsBin, "TestEval", 8) == 0; } if (strcmp(cond->method, "ImportPayout") == 0) { diff --git a/src/cryptoconditions/include/cryptoconditions.h b/src/cryptoconditions/include/cryptoconditions.h index 64cd1db70..a911ffd79 100644 --- a/src/cryptoconditions/include/cryptoconditions.h +++ b/src/cryptoconditions/include/cryptoconditions.h @@ -26,6 +26,7 @@ enum CCTypeId { }; + /* * Evaliliary verification callback */ @@ -83,17 +84,17 @@ int cc_signTreeSecp256k1Msg32(CC *cond, const unsigned char *private size_t cc_conditionBinary(const CC *cond, unsigned char *buf); size_t cc_fulfillmentBinary(const CC *cond, unsigned char *buf, size_t bufLength); static int cc_secp256k1VerifyTreeMsg32(const CC *cond, const unsigned char *msg32); -struct CC* cc_conditionFromJSON(cJSON *params, unsigned char *err); -struct CC* cc_conditionFromJSONString(const unsigned char *json, unsigned char *err); +struct CC* cc_conditionFromJSON(cJSON *params, char *err); +struct CC* cc_conditionFromJSONString(const char *json, char *err); struct CC* cc_readConditionBinary(const unsigned char *cond_bin, size_t cond_bin_len); struct CC* cc_readFulfillmentBinary(const unsigned char *ffill_bin, size_t ffill_bin_len); struct cJSON* cc_conditionToJSON(const CC *cond); -unsigned char* cc_conditionToJSONString(const CC *cond); -unsigned char* cc_conditionUri(const CC *cond); -unsigned char* cc_jsonRPC(unsigned char *request); -unsigned long cc_getCost(const CC *cond); -enum CCTypeId cc_typeId(const CC *cond); +char* cc_conditionToJSONString(const CC *cond); +char* cc_conditionUri(const CC *cond); +char* cc_jsonRPC(char *request); char* cc_typeName(const CC *cond); +enum CCTypeId cc_typeId(const CC *cond); +unsigned long cc_getCost(const CC *cond); uint32_t cc_typeMask(const CC *cond); void cc_free(struct CC *cond); diff --git a/src/cryptoconditions/src/cryptoconditions.c b/src/cryptoconditions/src/cryptoconditions.c index 164d58f9c..037946a5f 100644 --- a/src/cryptoconditions/src/cryptoconditions.c +++ b/src/cryptoconditions/src/cryptoconditions.c @@ -16,7 +16,7 @@ #include -static struct CCType *typeRegistry[] = { +struct CCType *CCTypeRegistry[] = { &cc_preimageType, &cc_prefixType, &cc_thresholdType, @@ -28,7 +28,7 @@ static struct CCType *typeRegistry[] = { }; -static int typeRegistryLength = sizeof(typeRegistry) / sizeof(typeRegistry[0]); +int CCTypeRegistryLength = sizeof(CCTypeRegistry) / sizeof(CCTypeRegistry[0]); void appendUriSubtypes(uint32_t mask, unsigned char *buf) { @@ -37,10 +37,10 @@ void appendUriSubtypes(uint32_t mask, unsigned char *buf) { if (mask & 1 << i) { if (append) { strcat(buf, ","); - strcat(buf, typeRegistry[i]->name); + strcat(buf, CCTypeRegistry[i]->name); } else { strcat(buf, "&subtypes="); - strcat(buf, typeRegistry[i]->name); + strcat(buf, CCTypeRegistry[i]->name); append = 1; } } @@ -48,7 +48,7 @@ void appendUriSubtypes(uint32_t mask, unsigned char *buf) { } -unsigned char *cc_conditionUri(const CC *cond) { +char *cc_conditionUri(const CC *cond) { unsigned char *fp = cond->type->fingerprint(cond); if (!fp) return NULL; @@ -158,9 +158,9 @@ unsigned long cc_getCost(const CC *cond) { CCType *getTypeByAsnEnum(Condition_PR present) { - for (int i=0; iasnType == present) { - return typeRegistry[i]; + for (int i=0; iasnType == present) { + return CCTypeRegistry[i]; } } return NULL; @@ -245,7 +245,7 @@ CC *cc_readConditionBinary(const unsigned char *cond_bin, size_t length) { asn_dec_rval_t rval; rval = ber_decode(0, &asn_DEF_Condition, (void **)&asnCond, cond_bin, length); if (rval.code != RC_OK) { - printf("Failed reading condition binary\n"); + fprintf(stderr, "Failed reading condition binary\n"); return NULL; } CC *cond = mkAnon(asnCond); diff --git a/src/cryptoconditions/src/internal.h b/src/cryptoconditions/src/internal.h index 28b3661f4..e4cdd49ba 100644 --- a/src/cryptoconditions/src/internal.h +++ b/src/cryptoconditions/src/internal.h @@ -20,13 +20,13 @@ extern "C" { * Condition Type */ typedef struct CCType { int typeId; - unsigned char name[100]; + char name[100]; Condition_PR asnType; int (*visitChildren)(CC *cond, CCVisitor visitor); unsigned char *(*fingerprint)(const CC *cond); unsigned long (*getCost)(const CC *cond); uint32_t (*getSubtypes)(const CC *cond); - CC *(*fromJSON)(const cJSON *params, unsigned char *err); + CC *(*fromJSON)(const cJSON *params, char *err); void (*toJSON)(const CC *cond, cJSON *params); CC *(*fromFulfillment)(const Fulfillment_t *ffill); Fulfillment_t *(*toFulfillment)(const CC *cond); @@ -38,8 +38,8 @@ typedef struct CCType { /* * Globals */ -static struct CCType *typeRegistry[]; -static int typeRegistryLength; +struct CCType *CCTypeRegistry[]; +int CCTypeRegistryLength; /* @@ -50,7 +50,7 @@ static CC *mkAnon(const Condition_t *asnCond); static void asnCondition(const CC *cond, Condition_t *asn); static Condition_t *asnConditionNew(const CC *cond); static Fulfillment_t *asnFulfillmentNew(const CC *cond); -static cJSON *jsonEncodeCondition(cJSON *params, unsigned char *err); +static cJSON *jsonEncodeCondition(cJSON *params, char *err); static struct CC *fulfillmentToCC(Fulfillment_t *ffill); static struct CCType *getTypeByAsnEnum(Condition_PR present); @@ -62,11 +62,11 @@ unsigned char *base64_encode(const unsigned char *data, size_t input_length); unsigned char *base64_decode(const unsigned char *data_, size_t *output_length); unsigned char *hashFingerprintContents(asn_TYPE_descriptor_t *asnType, void *fp); void dumpStr(unsigned char *str, size_t len); -int checkString(const cJSON *value, unsigned char *key, unsigned char *err); -int checkDecodeBase64(const cJSON *value, unsigned char *key, unsigned char *err, unsigned char **data, size_t *size); -int jsonGetBase64(const cJSON *params, unsigned char *key, unsigned char *err, unsigned char **data, size_t *size); -int jsonGetBase64Optional(const cJSON *params, unsigned char *key, unsigned char *err, unsigned char **data, size_t *size); -void jsonAddBase64(cJSON *params, unsigned char *key, unsigned char *bin, size_t size); +int checkString(const cJSON *value, char *key, char *err); +int checkDecodeBase64(const cJSON *value, char *key, char *err, unsigned char **data, size_t *size); +int jsonGetBase64(const cJSON *params, char *key, char *err, unsigned char **data, size_t *size); +int jsonGetBase64Optional(const cJSON *params, char *key, char *err, unsigned char **data, size_t *size); +void jsonAddBase64(cJSON *params, char *key, unsigned char *bin, size_t size); #ifdef __cplusplus diff --git a/src/cryptoconditions/src/json_rpc.c b/src/cryptoconditions/src/json_rpc.c index 8fcf47fdb..13972ca35 100644 --- a/src/cryptoconditions/src/json_rpc.c +++ b/src/cryptoconditions/src/json_rpc.c @@ -34,7 +34,7 @@ static cJSON *jsonFulfillment(CC *cond) { } -CC *cc_conditionFromJSON(cJSON *params, unsigned char *err) { +CC *cc_conditionFromJSON(cJSON *params, char *err) { if (!params || !cJSON_IsObject(params)) { strcpy(err, "Condition params must be an object"); return NULL; @@ -44,10 +44,10 @@ CC *cc_conditionFromJSON(cJSON *params, unsigned char *err) { strcpy(err, "\"type\" must be a string"); return NULL; } - for (int i=0; ivaluestring, typeRegistry[i]->name)) { - return typeRegistry[i]->fromJSON(params, err); + for (int i=0; ivaluestring, CCTypeRegistry[i]->name)) { + return CCTypeRegistry[i]->fromJSON(params, err); } } } @@ -56,7 +56,7 @@ CC *cc_conditionFromJSON(cJSON *params, unsigned char *err) { } -CC *cc_conditionFromJSONString(const unsigned char *data, unsigned char *err) { +CC *cc_conditionFromJSONString(const char *data, char *err) { cJSON *params = cJSON_Parse(data); CC *out = cc_conditionFromJSON(params, err); cJSON_Delete(params); @@ -64,7 +64,7 @@ CC *cc_conditionFromJSONString(const unsigned char *data, unsigned char *err) { } -static cJSON *jsonEncodeCondition(cJSON *params, unsigned char *err) { +static cJSON *jsonEncodeCondition(cJSON *params, char *err) { CC *cond = cc_conditionFromJSON(params, err); cJSON *out = NULL; if (cond != NULL) { @@ -75,7 +75,7 @@ static cJSON *jsonEncodeCondition(cJSON *params, unsigned char *err) { } -static cJSON *jsonEncodeFulfillment(cJSON *params, unsigned char *err) { +static cJSON *jsonEncodeFulfillment(cJSON *params, char *err) { CC *cond = cc_conditionFromJSON(params, err); cJSON *out = NULL; if (cond != NULL) { @@ -86,14 +86,14 @@ static cJSON *jsonEncodeFulfillment(cJSON *params, unsigned char *err) { } -static cJSON *jsonErr(unsigned char *err) { +static cJSON *jsonErr(char *err) { cJSON *out = cJSON_CreateObject(); cJSON_AddItemToObject(out, "error", cJSON_CreateString(err)); return out; } -static cJSON *jsonVerifyFulfillment(cJSON *params, unsigned char *err) { +static cJSON *jsonVerifyFulfillment(cJSON *params, char *err) { unsigned char *ffill_bin = 0, *msg = 0, *cond_bin = 0; size_t ffill_bin_len, msg_len, cond_bin_len; cJSON *out = 0; @@ -121,7 +121,7 @@ END: } -static cJSON *jsonDecodeFulfillment(cJSON *params, unsigned char *err) { +static cJSON *jsonDecodeFulfillment(cJSON *params, char *err) { size_t ffill_bin_len; unsigned char *ffill_bin; if (!jsonGetBase64(params, "fulfillment", err, &ffill_bin, &ffill_bin_len)) @@ -139,7 +139,7 @@ static cJSON *jsonDecodeFulfillment(cJSON *params, unsigned char *err) { } -static cJSON *jsonDecodeCondition(cJSON *params, unsigned char *err) { +static cJSON *jsonDecodeCondition(cJSON *params, char *err) { size_t cond_bin_len; unsigned char *cond_bin; if (!jsonGetBase64(params, "bin", err, &cond_bin, &cond_bin_len)) @@ -160,7 +160,7 @@ static cJSON *jsonDecodeCondition(cJSON *params, unsigned char *err) { } -static cJSON *jsonSignTreeEd25519(cJSON *params, unsigned char *err) { +static cJSON *jsonSignTreeEd25519(cJSON *params, char *err) { cJSON *out = 0; unsigned char *msg = 0, *sk = 0; @@ -197,7 +197,7 @@ END: } -static cJSON *jsonSignTreeSecp256k1(cJSON *params, unsigned char *err) { +static cJSON *jsonSignTreeSecp256k1(cJSON *params, char *err) { cJSON *out = 0; unsigned char *msg = 0, *sk = 0; @@ -244,22 +244,22 @@ cJSON *cc_conditionToJSON(const CC *cond) { } -unsigned char *cc_conditionToJSONString(const CC *cond) { +char *cc_conditionToJSONString(const CC *cond) { assert(cond != NULL); cJSON *params = cc_conditionToJSON(cond); - unsigned char *out = cJSON_Print(params); + char *out = cJSON_Print(params); cJSON_Delete(params); return out; } -static cJSON *jsonListMethods(cJSON *params, unsigned char *err); +static cJSON *jsonListMethods(cJSON *params, char *err); typedef struct JsonMethod { - unsigned char *name; - cJSON* (*method)(cJSON *params, unsigned char *err); - unsigned char *description; + char *name; + cJSON* (*method)(cJSON *params, char *err); + char *description; } JsonMethod; @@ -278,7 +278,7 @@ static JsonMethod cc_jsonMethods[] = { static int nJsonMethods = sizeof(cc_jsonMethods) / sizeof(*cc_jsonMethods); -static cJSON *jsonListMethods(cJSON *params, unsigned char *err) { +static cJSON *jsonListMethods(cJSON *params, char *err) { cJSON *list = cJSON_CreateArray(); for (int i=0; itype->typeId != cc_secp256k1Type.typeId) return 1; + if (cond->type->typeId != CC_Secp256k1) return 1; CCSecp256k1SigningData *signing = (CCSecp256k1SigningData*) visitor.context; if (0 != memcmp(cond->publicKey, signing->pk, SECP256K1_PK_SIZE)) return 1; @@ -148,7 +148,7 @@ static int secp256k1Sign(CC *cond, CCVisitor visitor) { * Sign secp256k1 conditions in a tree */ int cc_signTreeSecp256k1Msg32(CC *cond, const unsigned char *privateKey, const unsigned char *msg32) { - if (cc_typeMask(cond) & (1 << cc_preimageType.typeId)) { + if (cc_typeMask(cond) & (1 << CC_Prefix)) { // No support for prefix currently, due to pending protocol decision on // how to combine message and prefix into 32 byte hash return 0; @@ -159,7 +159,10 @@ int cc_signTreeSecp256k1Msg32(CC *cond, const unsigned char *privateKey, const u lockSign(); int rc = secp256k1_ec_pubkey_create(ec_ctx_sign, &spk, privateKey); unlockSign(); - if (rc != 1) return 0; + if (rc != 1) { + fprintf(stderr, "Cryptoconditions couldn't derive secp256k1 pubkey\n"); + return 0; + } // serialize pubkey unsigned char *publicKey = calloc(1, SECP256K1_PK_SIZE); diff --git a/src/cryptoconditions/src/threshold.c b/src/cryptoconditions/src/threshold.c index d79c01813..1efe9f9e8 100644 --- a/src/cryptoconditions/src/threshold.c +++ b/src/cryptoconditions/src/threshold.c @@ -44,7 +44,7 @@ static unsigned long thresholdCost(const CC *cond) { static int thresholdVisitChildren(CC *cond, CCVisitor visitor) { - for (int i=0; ithreshold; i++) { + for (int i=0; isize; i++) { if (!cc_visit(cond->subconditions[i], visitor)) { return 0; } @@ -203,7 +203,7 @@ static void thresholdToJSON(const CC *cond, cJSON *params) { static int thresholdIsFulfilled(const CC *cond) { int nFulfilled = 0; for (int i=0; ithreshold; i++) { - if (!cc_isFulfilled(cond->subconditions[i])) { + if (cc_isFulfilled(cond->subconditions[i])) { nFulfilled++; } if (nFulfilled == cond->threshold) { diff --git a/src/cryptoconditions/src/utils.c b/src/cryptoconditions/src/utils.c index 69db32042..c87e8ddda 100644 --- a/src/cryptoconditions/src/utils.c +++ b/src/cryptoconditions/src/utils.c @@ -141,7 +141,7 @@ void dumpStr(unsigned char *str, size_t len) { -int checkString(const cJSON *value, unsigned char *key, unsigned char *err) { +int checkString(const cJSON *value, char *key, char *err) { if (value == NULL) { sprintf(err, "%s is required", key); return 0; @@ -153,7 +153,7 @@ int checkString(const cJSON *value, unsigned char *key, unsigned char *err) { return 1; } -int checkDecodeBase64(const cJSON *value, unsigned char *key, unsigned char *err, unsigned char **data, size_t *size) { +int checkDecodeBase64(const cJSON *value, char *key, char *err, unsigned char **data, size_t *size) { if (!checkString(value, key, err)) { sprintf(err, "%s must be valid base64 string", key); return 0; @@ -168,7 +168,7 @@ int checkDecodeBase64(const cJSON *value, unsigned char *key, unsigned char *err } -int jsonGetBase64(const cJSON *params, unsigned char *key, unsigned char *err, unsigned char **data, size_t *size) +int jsonGetBase64(const cJSON *params, char *key, char *err, unsigned char **data, size_t *size) { cJSON *item = cJSON_GetObjectItem(params, key); if (!item) { @@ -179,7 +179,7 @@ int jsonGetBase64(const cJSON *params, unsigned char *key, unsigned char *err, u } -int jsonGetBase64Optional(const cJSON *params, unsigned char *key, unsigned char *err, unsigned char **data, size_t *size) { +int jsonGetBase64Optional(const cJSON *params, char *key, char *err, unsigned char **data, size_t *size) { cJSON *item = cJSON_GetObjectItem(params, key); if (!item) { return 1; @@ -188,7 +188,7 @@ int jsonGetBase64Optional(const cJSON *params, unsigned char *key, unsigned char } -void jsonAddBase64(cJSON *params, unsigned char *key, unsigned char *bin, size_t size) { +void jsonAddBase64(cJSON *params, char *key, unsigned char *bin, size_t size) { unsigned char *b64 = base64_encode(bin, size); cJSON_AddItemToObject(params, key, cJSON_CreateString(b64)); free(b64); diff --git a/src/komodo_cc.cpp b/src/komodo_cc.cpp index 1b05ea070..81459fe2b 100644 --- a/src/komodo_cc.cpp +++ b/src/komodo_cc.cpp @@ -7,18 +7,6 @@ bool IsCryptoConditionsEnabled() return 0 != ASSETCHAINS_CC; } -// Limit acceptable condition types -// Prefix not enabled because no current use case, ambiguity on how to combine with secp256k1 -// RSA not enabled because no current use case, not implemented -int CCEnabledTypes = 1 << CC_Secp256k1 | \ - 1 << CC_Threshold | \ - 1 << CC_Eval | \ - 1 << CC_Preimage | \ - 1 << CC_Ed25519; - - -int CCSigningNodes = 1 << CC_Ed25519 | 1 << CC_Secp256k1; - bool IsSupportedCryptoCondition(const CC *cond) { diff --git a/src/komodo_cc.h b/src/komodo_cc.h index 57d24f92e..62e584a94 100644 --- a/src/komodo_cc.h +++ b/src/komodo_cc.h @@ -7,6 +7,17 @@ extern int32_t ASSETCHAINS_CC; bool IsCryptoConditionsEnabled(); +// Limit acceptable condition types +// Prefix not enabled because no current use case, ambiguity on how to combine with secp256k1 +// RSA not enabled because no current use case, not implemented +const int CCEnabledTypes = 1 << CC_Secp256k1 | \ + 1 << CC_Threshold | \ + 1 << CC_Eval | \ + 1 << CC_Preimage | \ + 1 << CC_Ed25519; + +const int CCSigningNodes = 1 << CC_Ed25519 | 1 << CC_Secp256k1; + /* * Check if the server can accept the condition based on it's structure / types diff --git a/src/script/interpreter.h b/src/script/interpreter.h index 699d6e78c..57051f797 100644 --- a/src/script/interpreter.h +++ b/src/script/interpreter.h @@ -161,7 +161,7 @@ public: const std::vector& ffillBin, const CScript& scriptCode, uint32_t consensusBranchId) const; - VerifyEval GetCCEval() const; + virtual VerifyEval GetCCEval() const; }; class MutableTransactionSignatureChecker : public TransactionSignatureChecker diff --git a/src/test-komodo/main.cpp b/src/test-komodo/main.cpp new file mode 100644 index 000000000..2a83e47fa --- /dev/null +++ b/src/test-komodo/main.cpp @@ -0,0 +1,12 @@ +#include "key.h" +#include "gtest/gtest.h" +#include "crypto/common.h" + + +int main(int argc, char **argv) { + assert(init_and_check_sodium() != -1); + ECC_Start(); + + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/src/test-komodo/test_cryptoconditions.cpp b/src/test-komodo/test_cryptoconditions.cpp new file mode 100644 index 000000000..9ab4b676c --- /dev/null +++ b/src/test-komodo/test_cryptoconditions.cpp @@ -0,0 +1,226 @@ +#include +#include + +#include "base58.h" +#include "key.h" +#include "komodo_cc.h" +#include "primitives/transaction.h" +#include "script/interpreter.h" +#include "script/serverchecker.h" + + +#define VCH(a,b) std::vector(a, a + b) + +std::string pubkey = "0205a8ad0c1dbc515f149af377981aab58b836af008d4d7ab21bd76faf80550b47"; +std::string secret = "UxFWWxsf1d7w7K5TvAWSkeX4H95XQKwdwGv49DXwWUTzPTTjHBbU"; +CKey notaryKey; + + +char ccjsonerr[1000] = "\0"; +#define CCFromJson(o,s) \ + o = cc_conditionFromJSONString(s, ccjsonerr); \ + if (!o) FAIL() << "bad json: " << ccjsonerr; + + +CScript CCPubKey(const CC *cond) { + unsigned char buf[1000]; + size_t len = cc_conditionBinary(cond, buf); + return CScript() << VCH(buf, len) << OP_CHECKCRYPTOCONDITION; +} + + +CScript CCSig(const CC *cond) { + unsigned char buf[1000]; + size_t len = cc_fulfillmentBinary(cond, buf, 1000); + auto ffill = VCH(buf, len); + ffill.push_back(SIGHASH_ALL); + return CScript() << ffill; +} + + +void CCSign(CMutableTransaction &tx, CC *cond) { + tx.vin.resize(1); + PrecomputedTransactionData txdata(tx); + uint256 sighash = SignatureHash(CCPubKey(cond), tx, 0, SIGHASH_ALL, 0, 0, &txdata); + + int out = cc_signTreeSecp256k1Msg32(cond, notaryKey.begin(), sighash.begin()); + tx.vin[0].scriptSig = CCSig(cond); +} + + +class CCTest : public ::testing::Test { +protected: + static void SetUpTestCase() { + SelectParams(CBaseChainParams::REGTEST); + // Notary key + CBitcoinSecret vchSecret; + // this returns false due to network prefix mismatch but works anyway + vchSecret.SetString(secret); + notaryKey = vchSecret.GetKey(); + } + virtual void SetUp() { + // enable CC + ASSETCHAINS_CC = 1; + } +}; + + +TEST_F(CCTest, testIsPayToCryptoCondition) +{ + CScript s = CScript() << VCH("a", 1); + ASSERT_FALSE(s.IsPayToCryptoCondition()); + + s = CScript() << VCH("a", 1) << OP_CHECKCRYPTOCONDITION; + ASSERT_TRUE(s.IsPayToCryptoCondition()); + + s = CScript() << OP_CHECKCRYPTOCONDITION; + ASSERT_FALSE(s.IsPayToCryptoCondition()); +} + + +TEST_F(CCTest, testMayAcceptCryptoCondition) +{ + CC *cond; + + // ok + CCFromJson(cond, R"!!( + { "type": "threshold-sha-256", + "threshold": 2, + "subfulfillments": [ + { "type": "secp256k1-sha-256", "publicKey": "AgWorQwdvFFfFJrzd5gaq1i4Nq8AjU16shvXb6+AVQtH" } + ] + })!!"); + ASSERT_TRUE(CCPubKey(cond).MayAcceptCryptoCondition()); + + + // prefix not allowed + CCFromJson(cond, R"!!( + { "type": "prefix-sha-256", + "prefix": "abc", + "maxMessageLength": 10, + "subfulfillment": + { "type": "secp256k1-sha-256", "publicKey": "AgWorQwdvFFfFJrzd5gaq1i4Nq8AjU16shvXb6+AVQtH" } + })!!"); + ASSERT_FALSE(CCPubKey(cond).MayAcceptCryptoCondition()); + + + // has no signature nodes + CCFromJson(cond, R"!!( + { "type": "threshold-sha-256", + "threshold": 1, + "subfulfillments": [ + { "type": "eval-sha-256", "method": "test", "params": "" }, + { "type": "eval-sha-256", "method": "test", "params": "" } + ] + })!!"); + ASSERT_FALSE(CCPubKey(cond).MayAcceptCryptoCondition()); +} + + +TEST_F(CCTest, testVerifyCryptoCondition) +{ + CC *cond; + ScriptError error; + CMutableTransaction mtxTo; + + auto Verify = [&] (const CC *cond) { + CAmount amount; + CTransaction txTo(mtxTo); + PrecomputedTransactionData txdata(txTo); + auto checker = ServerTransactionSignatureChecker(&txTo, 0, amount, false, txdata); + return VerifyScript(CCSig(cond), CCPubKey(cond), 0, checker, 0, &error); + }; + + // ok + CCFromJson(cond, R"!!({ + "type": "secp256k1-sha-256", + "publicKey": "AgWorQwdvFFfFJrzd5gaq1i4Nq8AjU16shvXb6+AVQtH" + })!!"); + CCSign(mtxTo, cond); + ASSERT_TRUE(Verify(cond)); + + + // has signature nodes + CCFromJson(cond, R"!!({ + "type": "threshold-sha-256", + "threshold": 1, + "subfulfillments": [ + { "type": "preimage-sha-256", "preimage": "" }, + { "type": "secp256k1-sha-256", "publicKey": "AgWorQwdvFFfFJrzd5gaq1i4Nq8AjU16shvXb6+AVQtH" } + ] + })!!"); + cond->threshold = 2; + CCSign(mtxTo, cond); + ASSERT_TRUE(Verify(cond)); + + // no signatures; the preimage will get encoded as a fulfillment because it's cheaper + // and the secp256k1 node will get encoded as a condition + cond->threshold = 1; + ASSERT_FALSE(Verify(cond)); + + // here the signature is set wrong + cond->threshold = 2; + ASSERT_TRUE(Verify(cond)); + memset(cond->subconditions[1]->signature, 0, 32); + ASSERT_FALSE(Verify(cond)); +} + + +TEST_F(CCTest, testVerifyEvalCondition) +{ + CC *cond; + ScriptError error; + CMutableTransaction mtxTo; + + auto Verify = [&] (const CC *cond) { + CAmount amount; + CTransaction txTo(mtxTo); + PrecomputedTransactionData txdata(txTo); + auto checker = ServerTransactionSignatureChecker(&txTo, 0, amount, false, txdata); + return VerifyScript(CCSig(cond), CCPubKey(cond), 0, checker, 0, &error); + }; + + // ok + CCFromJson(cond, R"!!({ + "type": "threshold-sha-256", + "threshold": 2, + "subfulfillments": [ + { "type": "secp256k1-sha-256", "publicKey": "AgWorQwdvFFfFJrzd5gaq1i4Nq8AjU16shvXb6+AVQtH" }, + { "type": "eval-sha-256", "method": "TestEval", "params": "" } + ]})!!"); + CC *ecCond = cond->subconditions[1]; + ecCond->paramsBin = (unsigned char*) "TestEval"; + ecCond->paramsBinLength = 8; + CCSign(mtxTo, cond); // will reorder subconditions + ASSERT_TRUE(Verify(cond)); + + ecCond->paramsBin = (unsigned char*) "FailEval"; + ASSERT_FALSE(Verify(cond)); +} + + +TEST_F(CCTest, testCryptoConditionsDisabled) +{ + CC *cond; + ScriptError error; + CMutableTransaction mtxTo; + + auto Verify = [&] (const CC *cond) { + CAmount amount; + CTransaction txTo(mtxTo); + PrecomputedTransactionData txdata(txTo); + auto checker = ServerTransactionSignatureChecker(&txTo, 0, amount, false, txdata); + return VerifyScript(CCSig(cond), CCPubKey(cond), 0, checker, 0, &error); + }; + + // ok + CCFromJson(cond, R"!!({ + "type": "secp256k1-sha-256", + "publicKey": "AgWorQwdvFFfFJrzd5gaq1i4Nq8AjU16shvXb6+AVQtH" + })!!"); + CCSign(mtxTo, cond); + ASSERT_TRUE(Verify(cond)); + + ASSETCHAINS_CC = 0; + ASSERT_FALSE(Verify(cond)); +} From 660b32c300981dae415b55afeafb529bafdad298 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Mon, 2 Apr 2018 20:44:10 -0300 Subject: [PATCH 0762/1062] cryptoconditions functions to create conditions --- .../include/cryptoconditions.h | 2 +- src/cryptoconditions/src/anon.c | 6 +++--- src/cryptoconditions/src/cryptoconditions.c | 20 ++++++++++++------- src/cryptoconditions/src/ed25519.c | 12 +++++------ src/cryptoconditions/src/eval.c | 10 +++++----- src/cryptoconditions/src/internal.h | 3 ++- src/cryptoconditions/src/prefix.c | 8 ++++---- src/cryptoconditions/src/preimage.c | 8 ++++---- src/cryptoconditions/src/secp256k1.c | 12 +++++------ src/cryptoconditions/src/threshold.c | 8 ++++---- 10 files changed, 48 insertions(+), 41 deletions(-) diff --git a/src/cryptoconditions/include/cryptoconditions.h b/src/cryptoconditions/include/cryptoconditions.h index a911ffd79..1af542b03 100644 --- a/src/cryptoconditions/include/cryptoconditions.h +++ b/src/cryptoconditions/include/cryptoconditions.h @@ -26,7 +26,6 @@ enum CCTypeId { }; - /* * Evaliliary verification callback */ @@ -88,6 +87,7 @@ struct CC* cc_conditionFromJSON(cJSON *params, char *err); struct CC* cc_conditionFromJSONString(const char *json, char *err); struct CC* cc_readConditionBinary(const unsigned char *cond_bin, size_t cond_bin_len); struct CC* cc_readFulfillmentBinary(const unsigned char *ffill_bin, size_t ffill_bin_len); +struct CC* cc_new(int typeId); struct cJSON* cc_conditionToJSON(const CC *cond); char* cc_conditionToJSONString(const CC *cond); char* cc_conditionUri(const CC *cond); diff --git a/src/cryptoconditions/src/anon.c b/src/cryptoconditions/src/anon.c index 0d10e0df0..c9baa6245 100644 --- a/src/cryptoconditions/src/anon.c +++ b/src/cryptoconditions/src/anon.c @@ -7,7 +7,7 @@ #include "cryptoconditions.h" -struct CCType cc_anonType; +struct CCType CC_AnonType; static CC *mkAnon(const Condition_t *asnCond) { @@ -18,7 +18,7 @@ static CC *mkAnon(const Condition_t *asnCond) { return 0; } CC *cond = calloc(1, sizeof(CC)); - cond->type = &cc_anonType; + cond->type = &CC_AnonType; cond->conditionType = realType; const CompoundSha256Condition_t *deets = &asnCond->choice.thresholdSha256; memcpy(cond->fingerprint, deets->fingerprint.buf, 32); @@ -71,4 +71,4 @@ static int anonIsFulfilled(const CC *cond) { } -struct CCType cc_anonType = { -1, "(anon)", Condition_PR_NOTHING, NULL, &anonFingerprint, &anonCost, &anonSubtypes, NULL, &anonToJSON, NULL, &anonFulfillment, &anonIsFulfilled, &anonFree }; +struct CCType CC_AnonType = { -1, "(anon)", Condition_PR_NOTHING, NULL, &anonFingerprint, &anonCost, &anonSubtypes, NULL, &anonToJSON, NULL, &anonFulfillment, &anonIsFulfilled, &anonFree }; diff --git a/src/cryptoconditions/src/cryptoconditions.c b/src/cryptoconditions/src/cryptoconditions.c index 037946a5f..f993b277f 100644 --- a/src/cryptoconditions/src/cryptoconditions.c +++ b/src/cryptoconditions/src/cryptoconditions.c @@ -17,14 +17,14 @@ struct CCType *CCTypeRegistry[] = { - &cc_preimageType, - &cc_prefixType, - &cc_thresholdType, - NULL, /* &cc_rsaType */ - &cc_ed25519Type, - &cc_secp256k1Type, + &CC_PreimageType, + &CC_PrefixType, + &CC_ThresholdType, + NULL, /* &CC_rsaType */ + &CC_Ed25519Type, + &CC_Secp256k1Type, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 6-14 unused */ - &cc_evalType + &CC_EvalType }; @@ -281,6 +281,12 @@ char *cc_typeName(const CC *cond) { return cc_isAnon(cond) ? cond->conditionType->name : cond->type->name; } +CC *cc_new(int typeId) { + CC *cond = malloc(sizeof(CC*)); + cond->type = CCTypeRegistry[type]; + return cond; +} + void cc_free(CC *cond) { if (cond) diff --git a/src/cryptoconditions/src/ed25519.c b/src/cryptoconditions/src/ed25519.c index b835cefc0..541c9b896 100644 --- a/src/cryptoconditions/src/ed25519.c +++ b/src/cryptoconditions/src/ed25519.c @@ -7,7 +7,7 @@ #include "cryptoconditions.h" -struct CCType cc_ed25519Type; +struct CCType CC_Ed25519Type; static unsigned char *ed25519Fingerprint(const CC *cond) { @@ -18,7 +18,7 @@ static unsigned char *ed25519Fingerprint(const CC *cond) { int ed25519Verify(CC *cond, CCVisitor visitor) { - if (cond->type->typeId != cc_ed25519Type.typeId) return 1; + if (cond->type->typeId != CC_Ed25519Type.typeId) return 1; // TODO: test failure mode: empty sig / null pointer return ed25519_verify(cond->signature, visitor.msg, visitor.msgLength, cond->publicKey); } @@ -44,7 +44,7 @@ typedef struct CCEd25519SigningData { * Visitor that signs an ed25519 condition if it has a matching public key */ static int ed25519Sign(CC *cond, CCVisitor visitor) { - if (cond->type->typeId != cc_ed25519Type.typeId) return 1; + if (cond->type->typeId != CC_Ed25519Type.typeId) return 1; CCEd25519SigningData *signing = (CCEd25519SigningData*) visitor.context; if (0 != memcmp(cond->publicKey, signing->pk, 32)) return 1; if (!cond->signature) cond->signature = malloc(64); @@ -105,7 +105,7 @@ static CC *ed25519FromJSON(const cJSON *params, unsigned char *err) { } CC *cond = calloc(1, sizeof(CC)); - cond->type = &cc_ed25519Type; + cond->type = &CC_Ed25519Type; cond->publicKey = pk; cond->signature = sig; return cond; @@ -126,7 +126,7 @@ static void ed25519ToJSON(const CC *cond, cJSON *params) { static CC *ed25519FromFulfillment(const Fulfillment_t *ffill) { CC *cond = calloc(1, sizeof(CC)); - cond->type = &cc_ed25519Type; + cond->type = &CC_Ed25519Type; cond->publicKey = malloc(32); memcpy(cond->publicKey, ffill->choice.ed25519Sha256.publicKey.buf, 32); cond->signature = malloc(64); @@ -166,4 +166,4 @@ static uint32_t ed25519Subtypes(const CC *cond) { } -struct CCType cc_ed25519Type = { 4, "ed25519-sha-256", Condition_PR_ed25519Sha256, 0, &ed25519Fingerprint, &ed25519Cost, &ed25519Subtypes, &ed25519FromJSON, &ed25519ToJSON, &ed25519FromFulfillment, &ed25519ToFulfillment, &ed25519IsFulfilled, &ed25519Free }; +struct CCType CC_Ed25519Type = { 4, "ed25519-sha-256", Condition_PR_ed25519Sha256, 0, &ed25519Fingerprint, &ed25519Cost, &ed25519Subtypes, &ed25519FromJSON, &ed25519ToJSON, &ed25519FromFulfillment, &ed25519ToFulfillment, &ed25519IsFulfilled, &ed25519Free }; diff --git a/src/cryptoconditions/src/eval.c b/src/cryptoconditions/src/eval.c index 13388b117..14db14c70 100644 --- a/src/cryptoconditions/src/eval.c +++ b/src/cryptoconditions/src/eval.c @@ -8,7 +8,7 @@ #include "include/cJSON.h" -struct CCType cc_evalType; +struct CCType CC_EvalType; static unsigned char *evalFingerprint(const CC *cond) { @@ -46,7 +46,7 @@ static CC *evalFromJSON(const cJSON *params, unsigned char *err) { strcpy(cond->method, method_item->valuestring); cond->paramsBin = paramsBin; cond->paramsBinLength = paramsBinLength; - cond->type = &cc_evalType; + cond->type = &CC_EvalType; return cond; } @@ -65,7 +65,7 @@ static void evalToJSON(const CC *cond, cJSON *params) { static CC *evalFromFulfillment(const Fulfillment_t *ffill) { CC *cond = calloc(1, sizeof(CC)); - cond->type = &cc_evalType; + cond->type = &CC_EvalType; EvalFulfillment_t *eval = &ffill->choice.evalSha256; @@ -125,7 +125,7 @@ typedef struct CCEvalVerifyData { int evalVisit(CC *cond, CCVisitor visitor) { - if (cond->type->typeId != cc_evalType.typeId) return 1; + if (cond->type->typeId != CC_Eval) return 1; CCEvalVerifyData *evalData = visitor.context; return evalData->verify(cond, evalData->context); } @@ -138,4 +138,4 @@ int cc_verifyEval(const CC *cond, VerifyEval verify, void *context) { } -struct CCType cc_evalType = { 15, "eval-sha-256", Condition_PR_evalSha256, 0, &evalFingerprint, &evalCost, &evalSubtypes, &evalFromJSON, &evalToJSON, &evalFromFulfillment, &evalToFulfillment, &evalIsFulfilled, &evalFree }; +struct CCType CC_EvalType = { 15, "eval-sha-256", Condition_PR_evalSha256, 0, &evalFingerprint, &evalCost, &evalSubtypes, &evalFromJSON, &evalToJSON, &evalFromFulfillment, &evalToFulfillment, &evalIsFulfilled, &evalFree }; diff --git a/src/cryptoconditions/src/internal.h b/src/cryptoconditions/src/internal.h index e4cdd49ba..d8e09310a 100644 --- a/src/cryptoconditions/src/internal.h +++ b/src/cryptoconditions/src/internal.h @@ -17,7 +17,8 @@ extern "C" { /* - * Condition Type */ + * Condition Type + */ typedef struct CCType { int typeId; char name[100]; diff --git a/src/cryptoconditions/src/prefix.c b/src/cryptoconditions/src/prefix.c index 423ee3ecf..d8d8b7aad 100644 --- a/src/cryptoconditions/src/prefix.c +++ b/src/cryptoconditions/src/prefix.c @@ -7,7 +7,7 @@ #include "cryptoconditions.h" -struct CCType cc_prefixType; +struct CCType CC_PrefixType; static int prefixVisitChildren(CC *cond, CCVisitor visitor) { @@ -43,7 +43,7 @@ static CC *prefixFromFulfillment(const Fulfillment_t *ffill) { CC *sub = fulfillmentToCC(p->subfulfillment); if (!sub) return 0; CC *cond = calloc(1, sizeof(CC)); - cond->type = &cc_prefixType; + cond->type = &CC_PrefixType; cond->maxMessageLength = p->maxMessageLength; cond->prefix = calloc(1, p->prefix.size); memcpy(cond->prefix, p->prefix.buf, p->prefix.size); @@ -89,7 +89,7 @@ static CC *prefixFromJSON(const cJSON *params, unsigned char *err) { } CC *cond = calloc(1, sizeof(CC)); - cond->type = &cc_prefixType; + cond->type = &CC_PrefixType; cond->maxMessageLength = (unsigned long) mml_item->valuedouble; cond->subcondition = sub; @@ -122,4 +122,4 @@ static void prefixFree(CC *cond) { } -struct CCType cc_prefixType = { 1, "prefix-sha-256", Condition_PR_prefixSha256, &prefixVisitChildren, &prefixFingerprint, &prefixCost, &prefixSubtypes, &prefixFromJSON, &prefixToJSON, &prefixFromFulfillment, &prefixToFulfillment, &prefixIsFulfilled, &prefixFree }; +struct CCType CC_PrefixType = { 1, "prefix-sha-256", Condition_PR_prefixSha256, &prefixVisitChildren, &prefixFingerprint, &prefixCost, &prefixSubtypes, &prefixFromJSON, &prefixToJSON, &prefixFromFulfillment, &prefixToFulfillment, &prefixIsFulfilled, &prefixFree }; diff --git a/src/cryptoconditions/src/preimage.c b/src/cryptoconditions/src/preimage.c index 95f19c09d..639bd1009 100644 --- a/src/cryptoconditions/src/preimage.c +++ b/src/cryptoconditions/src/preimage.c @@ -7,7 +7,7 @@ #include "cryptoconditions.h" -struct CCType cc_preimageType; +struct CCType CC_PreimageType; static CC *preimageFromJSON(const cJSON *params, unsigned char *err) { @@ -19,7 +19,7 @@ static CC *preimageFromJSON(const cJSON *params, unsigned char *err) { unsigned char *preimage_b64 = preimage_item->valuestring; CC *cond = calloc(1, sizeof(CC)); - cond->type = &cc_preimageType; + cond->type = &CC_PreimageType; cond->preimage = base64_decode(preimage_b64, &cond->preimageLength); return cond; } @@ -46,7 +46,7 @@ static unsigned char *preimageFingerprint(const CC *cond) { static CC *preimageFromFulfillment(const Fulfillment_t *ffill) { CC *cond = calloc(1, sizeof(CC)); - cond->type = &cc_preimageType; + cond->type = &CC_PreimageType; PreimageFulfillment_t p = ffill->choice.preimageSha256; cond->preimage = calloc(1, p.preimage.size); memcpy(cond->preimage, p.preimage.buf, p.preimage.size); @@ -79,4 +79,4 @@ static uint32_t preimageSubtypes(const CC *cond) { } -struct CCType cc_preimageType = { 0, "preimage-sha-256", Condition_PR_preimageSha256, 0, &preimageFingerprint, &preimageCost, &preimageSubtypes, &preimageFromJSON, &preimageToJSON, &preimageFromFulfillment, &preimageToFulfillment, &preimageIsFulfilled, &preimageFree }; +struct CCType CC_PreimageType = { 0, "preimage-sha-256", Condition_PR_preimageSha256, 0, &preimageFingerprint, &preimageCost, &preimageSubtypes, &preimageFromJSON, &preimageToJSON, &preimageFromFulfillment, &preimageToFulfillment, &preimageIsFulfilled, &preimageFree }; diff --git a/src/cryptoconditions/src/secp256k1.c b/src/cryptoconditions/src/secp256k1.c index 4a7588a89..f83397db8 100644 --- a/src/cryptoconditions/src/secp256k1.c +++ b/src/cryptoconditions/src/secp256k1.c @@ -15,7 +15,7 @@ #include "internal.h" -struct CCType cc_secp256k1Type; +struct CCType CC_Secp256k1Type; static const size_t SECP256K1_PK_SIZE = 33; @@ -74,7 +74,7 @@ static unsigned char *secp256k1Fingerprint(const CC *cond) { int secp256k1Verify(CC *cond, CCVisitor visitor) { - if (cond->type->typeId != cc_secp256k1Type.typeId) return 1; + if (cond->type->typeId != CC_Secp256k1Type.typeId) return 1; initVerify(); int rc; @@ -99,8 +99,8 @@ int secp256k1Verify(CC *cond, CCVisitor visitor) { static int cc_secp256k1VerifyTreeMsg32(const CC *cond, const unsigned char *msg32) { int subtypes = cc_typeMask(cond); - if (subtypes & (1 << cc_prefixType.typeId) && - subtypes & (1 << cc_secp256k1Type.typeId)) { + if (subtypes & (1 << CC_PrefixType.typeId) && + subtypes & (1 << CC_Secp256k1Type.typeId)) { // No support for prefix currently, due to pending protocol decision on // how to combine message and prefix into 32 byte hash return 0; @@ -203,7 +203,7 @@ static CC *cc_secp256k1Condition(const unsigned char *publicKey, const unsigned } CC *cond = calloc(1, sizeof(CC)); - cond->type = &cc_secp256k1Type; + cond->type = &CC_Secp256k1Type; cond->publicKey = pk; cond->signature = sig; return cond; @@ -281,4 +281,4 @@ static uint32_t secp256k1Subtypes(const CC *cond) { } -struct CCType cc_secp256k1Type = { 5, "secp256k1-sha-256", Condition_PR_secp256k1Sha256, 0, &secp256k1Fingerprint, &secp256k1Cost, &secp256k1Subtypes, &secp256k1FromJSON, &secp256k1ToJSON, &secp256k1FromFulfillment, &secp256k1ToFulfillment, &secp256k1IsFulfilled, &secp256k1Free }; +struct CCType CC_Secp256k1Type = { 5, "secp256k1-sha-256", Condition_PR_secp256k1Sha256, 0, &secp256k1Fingerprint, &secp256k1Cost, &secp256k1Subtypes, &secp256k1FromJSON, &secp256k1ToJSON, &secp256k1FromFulfillment, &secp256k1ToFulfillment, &secp256k1IsFulfilled, &secp256k1Free }; diff --git a/src/cryptoconditions/src/threshold.c b/src/cryptoconditions/src/threshold.c index 1efe9f9e8..82ef3d736 100644 --- a/src/cryptoconditions/src/threshold.c +++ b/src/cryptoconditions/src/threshold.c @@ -8,7 +8,7 @@ #include "internal.h" -struct CCType cc_thresholdType; +struct CCType CC_ThresholdType; static uint32_t thresholdSubtypes(const CC *cond) { @@ -120,7 +120,7 @@ static CC *thresholdFromFulfillment(const Fulfillment_t *ffill) { } CC *cond = calloc(1, sizeof(CC)); - cond->type = &cc_thresholdType; + cond->type = &CC_ThresholdType; cond->threshold = threshold; cond->size = size; cond->subconditions = subconditions; @@ -174,7 +174,7 @@ static CC *thresholdFromJSON(const cJSON *params, unsigned char *err) { } CC *cond = calloc(1, sizeof(CC)); - cond->type = &cc_thresholdType; + cond->type = &CC_ThresholdType; cond->threshold = (long) threshold_item->valuedouble; cond->size = cJSON_GetArraySize(subfulfillments_item); cond->subconditions = calloc(cond->size, sizeof(CC*)); @@ -222,4 +222,4 @@ static void thresholdFree(CC *cond) { } -struct CCType cc_thresholdType = { 2, "threshold-sha-256", Condition_PR_thresholdSha256, &thresholdVisitChildren, &thresholdFingerprint, &thresholdCost, &thresholdSubtypes, &thresholdFromJSON, &thresholdToJSON, &thresholdFromFulfillment, &thresholdToFulfillment, &thresholdIsFulfilled, &thresholdFree }; +struct CCType CC_ThresholdType = { 2, "threshold-sha-256", Condition_PR_thresholdSha256, &thresholdVisitChildren, &thresholdFingerprint, &thresholdCost, &thresholdSubtypes, &thresholdFromJSON, &thresholdToJSON, &thresholdFromFulfillment, &thresholdToFulfillment, &thresholdIsFulfilled, &thresholdFree }; From 375927407bca42e268e7e2f6072563b472c31205 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Tue, 3 Apr 2018 04:48:24 -0300 Subject: [PATCH 0763/1062] betprotocol functions --- src/cc/betprotocol.cpp | 240 ++++++++++++++++++ src/cc/importpayout.cpp | 31 +-- src/cc/importpayout.h | 26 ++ src/cryptoconditions/README.md | 2 +- .../include/cryptoconditions.h | 2 +- src/cryptoconditions/src/anon.c | 3 +- src/cryptoconditions/src/cryptoconditions.c | 7 +- src/cryptoconditions/src/ed25519.c | 6 +- src/cryptoconditions/src/eval.c | 6 +- src/cryptoconditions/src/prefix.c | 6 +- src/cryptoconditions/src/preimage.c | 6 +- src/cryptoconditions/src/secp256k1.c | 3 +- src/cryptoconditions/src/threshold.c | 6 +- src/komodo_notary.h | 1 + src/rpcblockchain.cpp | 78 ++++++ src/rpcclient.cpp | 1 + src/rpcserver.cpp | 1 + src/rpcserver.h | 1 + 18 files changed, 371 insertions(+), 55 deletions(-) create mode 100644 src/cc/betprotocol.cpp create mode 100644 src/cc/importpayout.h diff --git a/src/cc/betprotocol.cpp b/src/cc/betprotocol.cpp new file mode 100644 index 000000000..024b4c001 --- /dev/null +++ b/src/cc/betprotocol.cpp @@ -0,0 +1,240 @@ +#include + +#include "primitives/transaction.h" + + +class DisputeHeader +{ +public: + int waitBlocks; + std::vector vmParams; + + ADD_SERIALIZE_METHODS; + + template + inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { + READWRITE(VARINT(waitBlocks)); + READWRITE(vmParams); + } +}; + + +static CScript CCPubKey(const CC *cond) +{ + unsigned char buf[1000]; + size_t len = cc_conditionBinary(cond, buf); + return CScript() << std::vector(buf, buf+len) << OP_CHECKCRYPTOCONDITION; +} + + +static CScript CCSig(const CC *cond) +{ + unsigned char buf[1000]; + size_t len = cc_fulfillmentBinary(cond, buf, 1000); + auto ffill = std::vector(buf, buf+len); + ffill.push_back(SIGHASH_ALL); + return CScript() << ffill; +} + + +static unsigned char* CopyPubKey(CPubKey pkIn) +{ + auto *pk = malloc(33); + memcpy(pk, pkIn.begin(), 33); // TODO: compressed? + return pk; +} + + +class PokerProtocol +{ +public: + CAmount MINFEE = 1; + std::vector players; + DisputeHeader disputeHeader; + + // on PANGEA + CC* MakeDisputeCond(); + CMutableTransaction MakeSessionTx(CTxIn dealerInput); + CMutableTransaction MakeDisputeTx(uint256 signedSessionTxHash); + CMutableTransaction MakePostEvidenceTx(uint256 signedSessionTxHash, + CPubKey playerKey, std::vector state); + + // on KMD + CC* MakePayoutCond(); + CMutableTransaction MakeStakeTx(CAmount totalPayout, std::vector playerInputs, + uint256 signedSessionTx); + CMutableTransaction MakeAgreePayoutTx(std::vector payouts, + CC *signedPayoutCond, uint256 signedStakeTxHash); + CMutableTransaction MakeImportPayoutTx(std::vector payouts, + CC *signedPayoutCond, CTransaction signedDisputeTx); +} + + +CC* PokerProtocol::MakeDisputeCond() +{ + CC *disputePoker = cond->subconditions[0] = cc_new(CC_Eval); + char err[1000]; + std::vector headerData; + disputeHeader >> CDataStream(headerData, SER_DISK, PROTOCOL_VERSION); + disputePoker->paramsBin = malloc(headerData.size()); + memcpy(disputePoker->paramsBin, headerData.data()); + disputePoker.paramsBinLength = headerData.size(); + + CC *spendSig = cond->subconditions[1] = cc_new(CC_Threshold); + spendSig->threshold = 1; + spendSig->size = players.size() + 1; + spendSig->subconditions = malloc(spendSig->size, sizeof(CC*)); + + for (int i=0; isubconditions[i] = cc_new(CC_Secp256k1); + sub->publicKey = CopyPubKey(players[i]); + } + + CC *cond = cc_new(CC_Threshold); + cond->threshold = 2; + cond->size = 2; + cond->subconditions = calloc(2, sizeof(CC*)); + cond->subconditions[0] = disputePoker; + cond->subconditions[1] = spendSig; + return cond; +} + + +CMutableTransaction PokerProtocol::MakeSessionTx(CTxIn dealerInput) +{ + CMutableTransaction mtx; + mtx.vin.push_back(dealerInput); + + CC *disputeCond = MakeDisputeCond(players, disputeHeader); + mtx.vout.push_back(CTxOut(MINFEE, CCPubKey(disputeCond))); + cc_free(disputeCond); + + for (int i=0; ipublicKey = CopyPubKey(players[i]); + mtx.vout.push_back(CTxOut(MINFEE, CCPubKey(cond))); + cc_free(cond); + } + return mtx; +} + + +CMutableTransaction PokerProtocol::MakeDisputeTx(uint256 signedSessionTxHash, CC *signedDisputeCond, uint256 vmResultHash) +{ + CMutableTransaction mtx; + + CC *disputeCond = MakeDisputeCond(); + mtx.vin.push_back(CTxIn(signedSessionTxHash, 0, CCSig(signedDisputeCond))); + + std::vector result(vmResultHash.begin(), vmResultHash.begin()+32); + mtx.vout.push_back(CTxOut(0, CScript() << OP_RETURN << result)); + return mtx; +} + + +CMutableTransaction PokerProtocol::MakePostEvidenceTx(uint256 signedSessionTxHash, + int playerIdx, std::vector state) +{ + CMutableTransaction mtx; + + CC *cond = cc_new(CC_Secp256k1); + cond->publicKey = CopyPubKey(players[i]); + mtx.vin.push_back(CTxIn(signedSessionTxHash, playerIdx+1, CCSig(cond))); + + mtx.vout.push_back(CTxOut(0, CScript() << OP_RETURN << state)); + + return mtx; +} + +CC* CCNewThreshold(int t, std::vector v) +{ + CC *cond = cc_new(CC_Threshold); + cond->threshold = t; + cond->size = v.size(); + cond->subconditions = calloc(1, sizeof(CC*)); + memcpy(cond->subconditions, v.data(), v.size() * sizeof(CC*)); + return cond; +} + + +CCNewSecp256k1(CPubKey &k) +{ + cond = cc_new(CC_Secp256k1); + cond->publicKey = CopyPubKey(players[i]); + return cond; +} + + +CCNewEval(char *method, unsigned char* paramsBin, size_t len) +{ + CC *cond = cc_new(CC_Eval); + strcpy(cond->method, method); + cond->paramsBin = malloc(32); + memcpy(cond->paramsBin, bin, len); + cond->paramsBinLength = len; + return cond; +} + + +CC* MakePayoutCond(uint256 signedSessionTx) +{ + CC* agree; + { + // TODO: 2/3 majority + std::vector subs; + for (int i=0; i subs; + for (int i=0; i playerInputs, + uint256 signedSessionTx) +{ + CMutableTransaction mtx; + mtx.vin = playerInputs; + + CC *payoutCond = MakePayoutCond(signedSessionTx);push + mtx.vout.push_back(CTxOut(totalPayout, CCPubKey(payoutCond))); + cc_free(payoutCond); + + return mtx; +} + + +CMutableTransaction PokerProtocol::MakeAgreePayoutTx(std::vector payouts, + CC *signedPayoutCond, uint256 signedStakeTxHash) +{ + CMutableTransaction mtx; + mtx.vin.push_back(CTxIn(signedStakeTxHash, 0, CCSig(signedPayoutCond))); + mtx.vouts = payouts; + return mtx; +} + + +CMutableTransaction PokerProtocol::MakeImportPayoutTx(std::vector payouts, + CC *signedPayoutCond, CTransaction signedDisputeTx, uint256 signedStakeTxHash) +{ + std::vector vDisputeTx; + signedDisputeTx >> CDataStream(vDisputeTx, SER_DISK, PROTOCOL_VERSION); + CMutableTransaction mtx; + mtx.vin.push_back(CTxInput(signedStakeTxHash, 0, CCSig(signedPayoutCond))); + mtx.vout = payouts; + CMutableTransaction.vout.insert(0, CTxOutput(0, CScript() << OP_RETURN << "PROOF HERE")); + CMutableTransaction.vout.insert(1, CTxOutput(0, CScript() << OP_RETURN << vDisputeTx)); +} diff --git a/src/cc/importpayout.cpp b/src/cc/importpayout.cpp index ee8913744..f05abb943 100644 --- a/src/cc/importpayout.cpp +++ b/src/cc/importpayout.cpp @@ -3,27 +3,10 @@ #include "chain.h" #include "main.h" #include "cc/eval.h" +#include "cc/importpayout.h" #include "cryptoconditions/include/cryptoconditions.h" -class MomProof -{ -public: - uint256 notaryHash; - int nPos; // Position of imported tx in MoM - std::vector branch; - - ADD_SERIALIZE_METHODS; - - template - inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { - READWRITE(notaryHash); - READWRITE(VARINT(nPos)); - READWRITE(branch); - } -}; - - extern int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestamp); bool DerefNotaryPubkey(const COutPoint &prevout, char *pk33) @@ -89,11 +72,7 @@ bool GetMoM(const uint256 notaryHash, uint256 &mom) return 1; } - -uint256 ExecMerkle(uint256 hash, const std::vector& vMerkleBranch, int nIndex) -{ - return CBlock::CheckMerkleBranch(hash, vMerkleBranch, nIndex); -} +#define ExecMerkle CBlock::CheckMerkleBranch /* @@ -157,13 +136,13 @@ bool CheckImportPayout(const CC *cond, const CTransaction *payoutTx, int nIn) std::vector vchMomProof; if (!GetOpReturnData(payoutTx->vout[0].scriptPubKey, vchMomProof)) return 0; - MomProof momProof; + MoMProof momProof; CDataStream(vchMomProof, SER_DISK, PROTOCOL_VERSION) >> momProof; uint256 mom; - if (!GetMoM(momProof.notaryHash, mom)) return 0; + if (!GetMoM(momProof.notarisationHash, mom)) return 0; - uint256 proofResult = ExecMerkle(disputeTx.GetHash(), momProof.branch, momProof.nPos); + uint256 proofResult = ExecMerkle(disputeTx.GetHash(), momProof.branch, momProof.nIndex); if (proofResult != mom) return 0; } diff --git a/src/cc/importpayout.h b/src/cc/importpayout.h new file mode 100644 index 000000000..3ae094e80 --- /dev/null +++ b/src/cc/importpayout.h @@ -0,0 +1,26 @@ +#ifndef KOMODO_TXPROOF_H +#define KOMODO_TXPROOF_H + + +class MoMProof +{ +public: + int nIndex; + std::vector branch; + uint256 notarisationHash; + + MoMProof() {} + MoMProof(int i, std::vector b, uint256 n) : notarisationHash(n), nIndex(i), branch(b) {} + + ADD_SERIALIZE_METHODS; + + template + inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { + READWRITE(VARINT(nIndex)); + READWRITE(branch); + READWRITE(notarisationHash); + } +}; + + +#endif /* KOMODO_TXPROOF_H */ diff --git a/src/cryptoconditions/README.md b/src/cryptoconditions/README.md index 45418b62a..9ec2a6a5f 100644 --- a/src/cryptoconditions/README.md +++ b/src/cryptoconditions/README.md @@ -17,7 +17,7 @@ make ## Status -JSON interface not particularly safe. The rest is getting there. +JSON interface may not be particularly safe. The rest is pretty good now. ## Embedding diff --git a/src/cryptoconditions/include/cryptoconditions.h b/src/cryptoconditions/include/cryptoconditions.h index 1af542b03..439fe3f4a 100644 --- a/src/cryptoconditions/include/cryptoconditions.h +++ b/src/cryptoconditions/include/cryptoconditions.h @@ -16,7 +16,7 @@ struct CCType; enum CCTypeId { - CC_Condition = -1, + CC_Anon = -1, CC_Preimage = 0, CC_Prefix = 1, CC_Threshold = 2, diff --git a/src/cryptoconditions/src/anon.c b/src/cryptoconditions/src/anon.c index c9baa6245..38f8e8543 100644 --- a/src/cryptoconditions/src/anon.c +++ b/src/cryptoconditions/src/anon.c @@ -17,8 +17,7 @@ static CC *mkAnon(const Condition_t *asnCond) { printf("Unknown ASN type: %i", asnCond->present); return 0; } - CC *cond = calloc(1, sizeof(CC)); - cond->type = &CC_AnonType; + CC *cond = cc_new(CC_Anon); cond->conditionType = realType; const CompoundSha256Condition_t *deets = &asnCond->choice.thresholdSha256; memcpy(cond->fingerprint, deets->fingerprint.buf, 32); diff --git a/src/cryptoconditions/src/cryptoconditions.c b/src/cryptoconditions/src/cryptoconditions.c index f993b277f..622f09530 100644 --- a/src/cryptoconditions/src/cryptoconditions.c +++ b/src/cryptoconditions/src/cryptoconditions.c @@ -255,7 +255,7 @@ CC *cc_readConditionBinary(const unsigned char *cond_bin, size_t length) { int cc_isAnon(const CC *cond) { - return cond->type->typeId == CC_Condition; + return cond->type->typeId == CC_Anon; } @@ -281,9 +281,10 @@ char *cc_typeName(const CC *cond) { return cc_isAnon(cond) ? cond->conditionType->name : cond->type->name; } + CC *cc_new(int typeId) { - CC *cond = malloc(sizeof(CC*)); - cond->type = CCTypeRegistry[type]; + CC *cond = calloc(1, sizeof(CC)); + cond->type = CCTypeRegistry[typeId]; return cond; } diff --git a/src/cryptoconditions/src/ed25519.c b/src/cryptoconditions/src/ed25519.c index 541c9b896..18a75fd5c 100644 --- a/src/cryptoconditions/src/ed25519.c +++ b/src/cryptoconditions/src/ed25519.c @@ -104,8 +104,7 @@ static CC *ed25519FromJSON(const cJSON *params, unsigned char *err) { } } - CC *cond = calloc(1, sizeof(CC)); - cond->type = &CC_Ed25519Type; + CC *cond = cc_new(CC_Ed25519); cond->publicKey = pk; cond->signature = sig; return cond; @@ -125,8 +124,7 @@ static void ed25519ToJSON(const CC *cond, cJSON *params) { static CC *ed25519FromFulfillment(const Fulfillment_t *ffill) { - CC *cond = calloc(1, sizeof(CC)); - cond->type = &CC_Ed25519Type; + CC *cond = cc_new(CC_Ed25519); cond->publicKey = malloc(32); memcpy(cond->publicKey, ffill->choice.ed25519Sha256.publicKey.buf, 32); cond->signature = malloc(64); diff --git a/src/cryptoconditions/src/eval.c b/src/cryptoconditions/src/eval.c index 14db14c70..92a1c6e70 100644 --- a/src/cryptoconditions/src/eval.c +++ b/src/cryptoconditions/src/eval.c @@ -42,11 +42,10 @@ static CC *evalFromJSON(const cJSON *params, unsigned char *err) { return NULL; } - CC *cond = calloc(1, sizeof(CC)); + CC *cond = cc_new(CC_Eval); strcpy(cond->method, method_item->valuestring); cond->paramsBin = paramsBin; cond->paramsBinLength = paramsBinLength; - cond->type = &CC_EvalType; return cond; } @@ -64,8 +63,7 @@ static void evalToJSON(const CC *cond, cJSON *params) { static CC *evalFromFulfillment(const Fulfillment_t *ffill) { - CC *cond = calloc(1, sizeof(CC)); - cond->type = &CC_EvalType; + CC *cond = cc_new(CC_Eval); EvalFulfillment_t *eval = &ffill->choice.evalSha256; diff --git a/src/cryptoconditions/src/prefix.c b/src/cryptoconditions/src/prefix.c index d8d8b7aad..15a7fa2b7 100644 --- a/src/cryptoconditions/src/prefix.c +++ b/src/cryptoconditions/src/prefix.c @@ -42,8 +42,7 @@ static CC *prefixFromFulfillment(const Fulfillment_t *ffill) { PrefixFulfillment_t *p = ffill->choice.prefixSha256; CC *sub = fulfillmentToCC(p->subfulfillment); if (!sub) return 0; - CC *cond = calloc(1, sizeof(CC)); - cond->type = &CC_PrefixType; + CC *cond = cc_new(CC_Prefix); cond->maxMessageLength = p->maxMessageLength; cond->prefix = calloc(1, p->prefix.size); memcpy(cond->prefix, p->prefix.buf, p->prefix.size); @@ -88,8 +87,7 @@ static CC *prefixFromJSON(const cJSON *params, unsigned char *err) { return NULL; } - CC *cond = calloc(1, sizeof(CC)); - cond->type = &CC_PrefixType; + CC *cond = cc_new(CC_Prefix); cond->maxMessageLength = (unsigned long) mml_item->valuedouble; cond->subcondition = sub; diff --git a/src/cryptoconditions/src/preimage.c b/src/cryptoconditions/src/preimage.c index 639bd1009..39953e815 100644 --- a/src/cryptoconditions/src/preimage.c +++ b/src/cryptoconditions/src/preimage.c @@ -18,8 +18,7 @@ static CC *preimageFromJSON(const cJSON *params, unsigned char *err) { } unsigned char *preimage_b64 = preimage_item->valuestring; - CC *cond = calloc(1, sizeof(CC)); - cond->type = &CC_PreimageType; + CC *cond = cc_new(CC_Preimage); cond->preimage = base64_decode(preimage_b64, &cond->preimageLength); return cond; } @@ -45,8 +44,7 @@ static unsigned char *preimageFingerprint(const CC *cond) { static CC *preimageFromFulfillment(const Fulfillment_t *ffill) { - CC *cond = calloc(1, sizeof(CC)); - cond->type = &CC_PreimageType; + CC *cond = cc_new(CC_Preimage); PreimageFulfillment_t p = ffill->choice.preimageSha256; cond->preimage = calloc(1, p.preimage.size); memcpy(cond->preimage, p.preimage.buf, p.preimage.size); diff --git a/src/cryptoconditions/src/secp256k1.c b/src/cryptoconditions/src/secp256k1.c index f83397db8..78fbd7602 100644 --- a/src/cryptoconditions/src/secp256k1.c +++ b/src/cryptoconditions/src/secp256k1.c @@ -202,8 +202,7 @@ static CC *cc_secp256k1Condition(const unsigned char *publicKey, const unsigned memcpy(sig, signature, SECP256K1_SIG_SIZE); } - CC *cond = calloc(1, sizeof(CC)); - cond->type = &CC_Secp256k1Type; + CC *cond = cc_new(CC_Secp256k1); cond->publicKey = pk; cond->signature = sig; return cond; diff --git a/src/cryptoconditions/src/threshold.c b/src/cryptoconditions/src/threshold.c index 82ef3d736..da8a3027a 100644 --- a/src/cryptoconditions/src/threshold.c +++ b/src/cryptoconditions/src/threshold.c @@ -119,8 +119,7 @@ static CC *thresholdFromFulfillment(const Fulfillment_t *ffill) { } } - CC *cond = calloc(1, sizeof(CC)); - cond->type = &CC_ThresholdType; + CC *cond = cc_new(CC_Threshold); cond->threshold = threshold; cond->size = size; cond->subconditions = subconditions; @@ -173,8 +172,7 @@ static CC *thresholdFromJSON(const cJSON *params, unsigned char *err) { return NULL; } - CC *cond = calloc(1, sizeof(CC)); - cond->type = &CC_ThresholdType; + CC *cond = cc_new(CC_Threshold); cond->threshold = (long) threshold_item->valuedouble; cond->size = cJSON_GetArraySize(subfulfillments_item); cond->subconditions = calloc(cond->size, sizeof(CC*)); diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 638327e81..dbaa5f2e4 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -419,6 +419,7 @@ int32_t komodo_notarized_height(uint256 *hashp,uint256 *txidp) } } + int32_t komodo_MoMdata(int32_t *notarized_htp,uint256 *MoMp,uint256 *kmdtxidp,int32_t height) { int32_t i; char symbol[KOMODO_ASSETCHAIN_MAXLEN],dest[KOMODO_ASSETCHAIN_MAXLEN]; struct komodo_state *sp; struct notarized_checkpoint *np = 0; diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 1254217ac..30d2c0aab 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -8,6 +8,7 @@ #include "chainparams.h" #include "checkpoints.h" #include "consensus/validation.h" +#include "cc/importpayout.h" #include "main.h" #include "primitives/transaction.h" #include "rpcserver.h" @@ -621,6 +622,83 @@ UniValue height_MoM(const UniValue& params, bool fHelp) return ret; } +UniValue txMoMproof(const UniValue& params, bool fHelp) +{ + uint256 hash, notarisationHash, MoM; + int32_t notarisedHeight, depth; + CBlockIndex* blockIndex; + std::vector branch; + int nIndex; + + // parse params and get notarisation data for tx + { + if ( fHelp || params.size() != 1) + throw runtime_error("txmomproof needs a txid"); + + uint256 hash(uint256S(params[0].get_str())); + + uint256 blockHash; + CTransaction tx; + if (!GetTransaction(hash, tx, blockHash, true)) + throw runtime_error("cannot find transaction"); + + blockIndex = mapBlockIndex[blockHash]; + + depth = komodo_MoM(¬arisedHeight, &MoM, ¬arisationHash, blockIndex->nHeight); + + if (!depth) + throw runtime_error("notarisation not found"); + + // index of block in MoM leaves + nIndex = notarisedHeight - blockIndex->nHeight; + } + + // build merkle chain from blocks to MoM + { + // since the merkle branch code is tied up in a block class + // and we want to make a merkle branch for something that isnt transactions + CBlock fakeBlock; + for (int i=0; ihashMerkleRoot; + CTransaction fakeTx; + // first value in CTransaction memory is it's hash + memcpy((void*)&fakeTx, mRoot.begin(), 32); + fakeBlock.vtx.push_back(fakeTx); + } + branch = fakeBlock.GetMerkleBranch(nIndex); + } + + // Now get the tx merkle branch + { + CBlock block; + + if (fHavePruned && !(blockIndex->nStatus & BLOCK_HAVE_DATA) && blockIndex->nTx > 0) + throw JSONRPCError(RPC_INTERNAL_ERROR, "Block not available (pruned data)"); + + if(!ReadBlockFromDisk(block, blockIndex)) + throw JSONRPCError(RPC_INTERNAL_ERROR, "Can't read block from disk"); + + // Locate the transaction in the block + int nTxIndex; + for (nTxIndex = 0; nTxIndex < (int)block.vtx.size(); nTxIndex++) + if (block.vtx[nTxIndex].GetHash() == hash) + break; + + if (nTxIndex == (int)block.vtx.size()) + throw JSONRPCError(RPC_INTERNAL_ERROR, "Error locating tx in block"); + + // concatenate branches + std::vector txBranch = block.GetMerkleBranch(nTxIndex); + nIndex = nIndex << txBranch.size() + nTxIndex; + branch.insert(branch.begin(), txBranch.begin(), txBranch.end()); + } + + // Encode and return + CDataStream ssProof(SER_NETWORK, PROTOCOL_VERSION); + ssProof << MoMProof(nIndex, branch, notarisationHash); + return HexStr(ssProof.begin(), ssProof.end()); +} + UniValue minerids(const UniValue& params, bool fHelp) { uint32_t timestamp = 0; UniValue ret(UniValue::VOBJ); UniValue a(UniValue::VARR); uint8_t minerids[2000],pubkeys[65][33]; int32_t i,j,n,numnotaries,tally[129]; diff --git a/src/rpcclient.cpp b/src/rpcclient.cpp index 13e9c357b..6a83e8c19 100644 --- a/src/rpcclient.cpp +++ b/src/rpcclient.cpp @@ -126,6 +126,7 @@ static const CRPCConvertParam vRPCConvertParams[] = { "paxpending", 0 }, { "notaries", 2 }, { "height_MoM", 1 }, + { "txMoMproof", 1 }, { "minerids", 1 }, { "kvsearch", 1 }, { "kvupdate", 4 }, diff --git a/src/rpcserver.cpp b/src/rpcserver.cpp index 716992082..5d573f62b 100644 --- a/src/rpcserver.cpp +++ b/src/rpcserver.cpp @@ -297,6 +297,7 @@ static const CRPCCommand vRPCCommands[] = { "blockchain", "paxprices", &paxprices, true }, { "blockchain", "notaries", ¬aries, true }, { "blockchain", "height_MoM", &height_MoM, true }, + { "blockchain", "txMoMproof", &txMoMproof, true }, { "blockchain", "minerids", &minerids, true }, { "blockchain", "kvsearch", &kvsearch, true }, { "blockchain", "kvupdate", &kvupdate, true }, diff --git a/src/rpcserver.h b/src/rpcserver.h index 1f6bd2f94..b4e6ed8fc 100644 --- a/src/rpcserver.h +++ b/src/rpcserver.h @@ -305,6 +305,7 @@ extern UniValue z_getpaymentdisclosure(const UniValue& params, bool fHelp); // i extern UniValue z_validatepaymentdisclosure(const UniValue ¶ms, bool fHelp); // in rpcdisclosure.cpp extern UniValue height_MoM(const UniValue& params, bool fHelp); +extern UniValue txMoMproof(const UniValue& params, bool fHelp); extern UniValue notaries(const UniValue& params, bool fHelp); extern UniValue minerids(const UniValue& params, bool fHelp); extern UniValue kvsearch(const UniValue& params, bool fHelp); From ee5d6946326d89ce8de56d8157c081a9e6fd63c6 Mon Sep 17 00:00:00 2001 From: ca333 Date: Wed, 4 Apr 2018 03:28:48 +0200 Subject: [PATCH 0764/1062] add BNTN --- src/assetchains | 1 + src/assetchains.old | 1 + src/dpowassets | 1 + src/fiat-cli | 1 + src/fiat/bntn | 2 ++ 5 files changed, 6 insertions(+) create mode 100644 src/fiat/bntn diff --git a/src/assetchains b/src/assetchains index d6e60be12..c3e161142 100755 --- a/src/assetchains +++ b/src/assetchains @@ -52,3 +52,4 @@ komodo_asset PIZZA 100000000 komodo_asset BEER 100000000 komodo_asset NINJA 100000000 komodo_asset OOT 216000000 +komodo_asset BNTN 500000000 diff --git a/src/assetchains.old b/src/assetchains.old index 9839c56e6..6bb60d95a 100755 --- a/src/assetchains.old +++ b/src/assetchains.old @@ -29,6 +29,7 @@ echo $pubkey ./komodod -pubkey=$pubkey -ac_name=PIZZA -ac_supply=100000000 -addnode=78.47.196.146 & ./komodod -pubkey=$pubkey -ac_name=NINJA -ac_supply=100000000 -addnode=78.47.196.146 & ./komodod -pubkey=$pubkey -ac_name=OOT -ac_supply=216000000 -addnode=174.138.107.226 & +./komodod -pubkey=$pubkey -ac_name=BNTN -ac_supply=500000000 -addnode=94.130.169.205 & #sleep $delay #./komodod -pubkey=$pubkey -ac_name=USD -addnode=78.47.196.146 $1 & diff --git a/src/dpowassets b/src/dpowassets index d2f0006ff..bd970c357 100755 --- a/src/dpowassets +++ b/src/dpowassets @@ -30,6 +30,7 @@ curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dp curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"VOTE2018\",\"pubkey\":\"$pubkey\"}" curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"NINJA\",\"pubkey\":\"$pubkey\"}" curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"OOT\",\"pubkey\":\"$pubkey\"}" +#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"BNTN\",\"pubkey\":\"$pubkey\"}" #curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"USD\",\"pubkey\":\"$pubkey\"}" #curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"EUR\",\"pubkey\":\"$pubkey\"}" diff --git a/src/fiat-cli b/src/fiat-cli index 89f82c632..a7ee8c62e 100755 --- a/src/fiat-cli +++ b/src/fiat-cli @@ -25,3 +25,4 @@ echo beer; fiat/beer $1 $2 $3 $4 echo vote2018; fiat/vote2018 $1 $2 $3 $4 echo ninja; fiat/ninja $1 $2 $3 $4 echo oot; fiat/oot $1 $2 $3 $4 +echo bntn: fiat/bntn $1 $2 $3 $4 diff --git a/src/fiat/bntn b/src/fiat/bntn new file mode 100644 index 000000000..7ae6f4e8d --- /dev/null +++ b/src/fiat/bntn @@ -0,0 +1,2 @@ +#!/bin/bash +./komodo-cli -ac_name=BNTN $1 $2 $3 $4 $5 $6 From 50045b3671d71e6ee18ee9e8b9650f40e5820a32 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 4 Apr 2018 18:59:09 +0300 Subject: [PATCH 0765/1062] Disable cross chain checking of notarization, libscott says it is ok --- src/komodo.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo.h b/src/komodo.h index ded368381..8ec38587c 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -573,7 +573,7 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr { notarized = 1; } - if ( notarized != 0 && *notarizedheightp > sp->NOTARIZED_HEIGHT && *notarizedheightp < height && (height < sp->CURRENT_HEIGHT-64 || komodo_verifynotarization(ASSETCHAINS_SYMBOL[0]==0?(char *)"KMD":ASSETCHAINS_SYMBOL,(char *)(ASSETCHAINS_SYMBOL[0] == 0 ? "BTC" : "KMD"),height,*notarizedheightp,kmdtxid,desttxid) == 0) ) + if ( notarized != 0 && *notarizedheightp > sp->NOTARIZED_HEIGHT && *notarizedheightp < height ) //&& (height < sp->CURRENT_HEIGHT-64 || komodo_verifynotarization(ASSETCHAINS_SYMBOL[0]==0?(char *)"KMD":ASSETCHAINS_SYMBOL,(char *)(ASSETCHAINS_SYMBOL[0] == 0 ? "BTC" : "KMD"),height,*notarizedheightp,kmdtxid,desttxid) == 0) ) { int32_t nameoffset = (int32_t)strlen(ASSETCHAINS_SYMBOL) + 1; sp->NOTARIZED_HEIGHT = *notarizedheightp; From a3bf7b967a7bd532ba39b7aa4cbd757012ce74cd Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 4 Apr 2018 19:36:16 +0300 Subject: [PATCH 0766/1062] Enable KMD validation for KMD --- src/komodo.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/komodo.h b/src/komodo.h index 8ec38587c..78e0006ba 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -573,7 +573,12 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr { notarized = 1; } - if ( notarized != 0 && *notarizedheightp > sp->NOTARIZED_HEIGHT && *notarizedheightp < height ) //&& (height < sp->CURRENT_HEIGHT-64 || komodo_verifynotarization(ASSETCHAINS_SYMBOL[0]==0?(char *)"KMD":ASSETCHAINS_SYMBOL,(char *)(ASSETCHAINS_SYMBOL[0] == 0 ? "BTC" : "KMD"),height,*notarizedheightp,kmdtxid,desttxid) == 0) ) + int32_t validated = 0; + if ( ASSETCHAINS_SYMBOL[0] != 0 ) + validated = 1; + else if ( height < sp->CURRENT_HEIGHT-64 || komodo_verifynotarization((char *)"KMD",(char *)"BTC",height,*notarizedheightp,kmdtxid,desttxid) == 0 ) + validated = 1; + if ( notarized != 0 && *notarizedheightp > sp->NOTARIZED_HEIGHT && *notarizedheightp < height && validated != 0 ) { int32_t nameoffset = (int32_t)strlen(ASSETCHAINS_SYMBOL) + 1; sp->NOTARIZED_HEIGHT = *notarizedheightp; From 561f3e18c1ec34e379640e491ddf836a3e3fd5e2 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Thu, 5 Apr 2018 05:06:22 -0300 Subject: [PATCH 0767/1062] tests for bet protocol done; verify notarisation still to test --- src/Makefile.am | 2 +- src/Makefile.ktest.include | 3 +- src/cc/betprotocol.cpp | 229 +++---- src/cc/betprotocol.h | 85 +++ src/cc/disputepayout.cpp | 88 ++- src/cc/eval.cpp | 137 +++- src/cc/eval.h | 92 ++- src/cc/importpayout.cpp | 136 +--- src/cc/importpayout.h | 26 - .../include/cryptoconditions.h | 1 + src/cryptoconditions/src/cryptoconditions.c | 2 +- src/cryptoconditions/src/threshold.c | 12 +- src/komodo_cc.cpp | 69 ++ src/komodo_cc.h | 39 ++ src/rpcblockchain.cpp | 2 +- src/script/interpreter.cpp | 16 +- src/script/interpreter.h | 5 +- src/script/serverchecker.cpp | 11 +- src/script/serverchecker.h | 7 +- src/test-komodo/main.cpp | 10 +- src/test-komodo/test_bet.cpp | 596 ++++++++++++++++++ src/test-komodo/test_cryptoconditions.cpp | 55 +- src/test-komodo/testutils.h | 15 + 23 files changed, 1195 insertions(+), 443 deletions(-) create mode 100644 src/cc/betprotocol.h delete mode 100644 src/cc/importpayout.h create mode 100644 src/test-komodo/test_bet.cpp create mode 100644 src/test-komodo/testutils.h diff --git a/src/Makefile.am b/src/Makefile.am index 092015600..07150d0c6 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -163,7 +163,6 @@ BITCOIN_CORE_H = \ init.h \ key.h \ keystore.h \ - komodo_cc.h \ leveldbwrapper.h \ limitedmap.h \ main.h \ @@ -253,6 +252,7 @@ libbitcoin_server_a_SOURCES = \ cc/eval.cpp \ cc/importpayout.cpp \ cc/disputepayout.cpp \ + cc/betprotocol.cpp \ chain.cpp \ checkpoints.cpp \ deprecation.cpp \ diff --git a/src/Makefile.ktest.include b/src/Makefile.ktest.include index 3ae3d9be8..cef80b0d1 100644 --- a/src/Makefile.ktest.include +++ b/src/Makefile.ktest.include @@ -5,7 +5,8 @@ bin_PROGRAMS += komodo-test # tool for generating our public parameters komodo_test_SOURCES = \ test-komodo/main.cpp \ - test-komodo/test_cryptoconditions.cpp + test-komodo/test_cryptoconditions.cpp \ + test-komodo/test_bet.cpp komodo_test_CPPFLAGS = $(komodod_CPPFLAGS) diff --git a/src/cc/betprotocol.cpp b/src/cc/betprotocol.cpp index 024b4c001..92ec961ee 100644 --- a/src/cc/betprotocol.cpp +++ b/src/cc/betprotocol.cpp @@ -1,117 +1,79 @@ #include +#include "streams.h" +#include "komodo_cc.h" +#include "cc/eval.h" +#include "cc/betprotocol.h" #include "primitives/transaction.h" -class DisputeHeader -{ -public: - int waitBlocks; - std::vector vmParams; - - ADD_SERIALIZE_METHODS; - - template - inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { - READWRITE(VARINT(waitBlocks)); - READWRITE(vmParams); - } -}; - - -static CScript CCPubKey(const CC *cond) -{ - unsigned char buf[1000]; - size_t len = cc_conditionBinary(cond, buf); - return CScript() << std::vector(buf, buf+len) << OP_CHECKCRYPTOCONDITION; -} - - -static CScript CCSig(const CC *cond) -{ - unsigned char buf[1000]; - size_t len = cc_fulfillmentBinary(cond, buf, 1000); - auto ffill = std::vector(buf, buf+len); - ffill.push_back(SIGHASH_ALL); - return CScript() << ffill; -} - - static unsigned char* CopyPubKey(CPubKey pkIn) { - auto *pk = malloc(33); + unsigned char* pk = (unsigned char*) malloc(33); memcpy(pk, pkIn.begin(), 33); // TODO: compressed? return pk; } -class PokerProtocol +CC* CCNewThreshold(int t, std::vector v) { -public: - CAmount MINFEE = 1; - std::vector players; - DisputeHeader disputeHeader; - - // on PANGEA - CC* MakeDisputeCond(); - CMutableTransaction MakeSessionTx(CTxIn dealerInput); - CMutableTransaction MakeDisputeTx(uint256 signedSessionTxHash); - CMutableTransaction MakePostEvidenceTx(uint256 signedSessionTxHash, - CPubKey playerKey, std::vector state); - - // on KMD - CC* MakePayoutCond(); - CMutableTransaction MakeStakeTx(CAmount totalPayout, std::vector playerInputs, - uint256 signedSessionTx); - CMutableTransaction MakeAgreePayoutTx(std::vector payouts, - CC *signedPayoutCond, uint256 signedStakeTxHash); - CMutableTransaction MakeImportPayoutTx(std::vector payouts, - CC *signedPayoutCond, CTransaction signedDisputeTx); -} - - -CC* PokerProtocol::MakeDisputeCond() -{ - CC *disputePoker = cond->subconditions[0] = cc_new(CC_Eval); - char err[1000]; - std::vector headerData; - disputeHeader >> CDataStream(headerData, SER_DISK, PROTOCOL_VERSION); - disputePoker->paramsBin = malloc(headerData.size()); - memcpy(disputePoker->paramsBin, headerData.data()); - disputePoker.paramsBinLength = headerData.size(); - - CC *spendSig = cond->subconditions[1] = cc_new(CC_Threshold); - spendSig->threshold = 1; - spendSig->size = players.size() + 1; - spendSig->subconditions = malloc(spendSig->size, sizeof(CC*)); - - for (int i=0; isubconditions[i] = cc_new(CC_Secp256k1); - sub->publicKey = CopyPubKey(players[i]); - } - CC *cond = cc_new(CC_Threshold); - cond->threshold = 2; - cond->size = 2; - cond->subconditions = calloc(2, sizeof(CC*)); - cond->subconditions[0] = disputePoker; - cond->subconditions[1] = spendSig; + cond->threshold = t; + cond->size = v.size(); + cond->subconditions = (CC**) calloc(v.size(), sizeof(CC*)); + memcpy(cond->subconditions, v.data(), v.size() * sizeof(CC*)); return cond; } -CMutableTransaction PokerProtocol::MakeSessionTx(CTxIn dealerInput) +CC* CCNewSecp256k1(CPubKey k) +{ + CC *cond = cc_new(CC_Secp256k1); + cond->publicKey = CopyPubKey(k); + return cond; +} + + +CC* CCNewEval(std::string method, std::vector paramsBin) +{ + CC *cond = cc_new(CC_Eval); + strcpy(cond->method, method.data()); + cond->paramsBin = (unsigned char*) malloc(paramsBin.size()); + memcpy(cond->paramsBin, paramsBin.data(), paramsBin.size()); + cond->paramsBinLength = paramsBin.size(); + return cond; +} + + +std::vector BetProtocol::PlayerConditions() +{ + std::vector subs; + for (int i=0; ipublicKey = CopyPubKey(players[i]); + CC *cond = CCNewSecp256k1(players[i]); mtx.vout.push_back(CTxOut(MINFEE, CCPubKey(cond))); cc_free(cond); } @@ -119,12 +81,12 @@ CMutableTransaction PokerProtocol::MakeSessionTx(CTxIn dealerInput) } -CMutableTransaction PokerProtocol::MakeDisputeTx(uint256 signedSessionTxHash, CC *signedDisputeCond, uint256 vmResultHash) +CMutableTransaction BetProtocol::MakeDisputeTx(uint256 signedSessionTxHash, uint256 vmResultHash) { CMutableTransaction mtx; CC *disputeCond = MakeDisputeCond(); - mtx.vin.push_back(CTxIn(signedSessionTxHash, 0, CCSig(signedDisputeCond))); + mtx.vin.push_back(CTxIn(signedSessionTxHash, 0, CScript())); std::vector result(vmResultHash.begin(), vmResultHash.begin()+32); mtx.vout.push_back(CTxOut(0, CScript() << OP_RETURN << result)); @@ -132,69 +94,29 @@ CMutableTransaction PokerProtocol::MakeDisputeTx(uint256 signedSessionTxHash, CC } -CMutableTransaction PokerProtocol::MakePostEvidenceTx(uint256 signedSessionTxHash, +CMutableTransaction BetProtocol::MakePostEvidenceTx(uint256 signedSessionTxHash, int playerIdx, std::vector state) { CMutableTransaction mtx; - CC *cond = cc_new(CC_Secp256k1); - cond->publicKey = CopyPubKey(players[i]); - mtx.vin.push_back(CTxIn(signedSessionTxHash, playerIdx+1, CCSig(cond))); - + mtx.vin.push_back(CTxIn(signedSessionTxHash, playerIdx+1, CScript())); mtx.vout.push_back(CTxOut(0, CScript() << OP_RETURN << state)); return mtx; } -CC* CCNewThreshold(int t, std::vector v) + +CC* BetProtocol::MakePayoutCond(uint256 signedSessionTxHash) { - CC *cond = cc_new(CC_Threshold); - cond->threshold = t; - cond->size = v.size(); - cond->subconditions = calloc(1, sizeof(CC*)); - memcpy(cond->subconditions, v.data(), v.size() * sizeof(CC*)); - return cond; -} - - -CCNewSecp256k1(CPubKey &k) -{ - cond = cc_new(CC_Secp256k1); - cond->publicKey = CopyPubKey(players[i]); - return cond; -} - - -CCNewEval(char *method, unsigned char* paramsBin, size_t len) -{ - CC *cond = cc_new(CC_Eval); - strcpy(cond->method, method); - cond->paramsBin = malloc(32); - memcpy(cond->paramsBin, bin, len); - cond->paramsBinLength = len; - return cond; -} - - -CC* MakePayoutCond(uint256 signedSessionTx) -{ - CC* agree; - { - // TODO: 2/3 majority - std::vector subs; - for (int i=0; i vHash(signedSessionTxHash.begin(), signedSessionTxHash.end()); + CC *importEval = CCNewEval("ImportPayout", vHash); - std::vector subs; - for (int i=0; i playerInputs, - uint256 signedSessionTx) +CMutableTransaction BetProtocol::MakeStakeTx(CAmount totalPayout, uint256 signedSessionTxHash) { CMutableTransaction mtx; - mtx.vin = playerInputs; - CC *payoutCond = MakePayoutCond(signedSessionTx);push + CC *payoutCond = MakePayoutCond(signedSessionTxHash); mtx.vout.push_back(CTxOut(totalPayout, CCPubKey(payoutCond))); cc_free(payoutCond); @@ -217,24 +137,23 @@ CMutableTransaction PokerProtocol::MakeStakeTx(CAmount totalPayout, std::vector< } -CMutableTransaction PokerProtocol::MakeAgreePayoutTx(std::vector payouts, - CC *signedPayoutCond, uint256 signedStakeTxHash) +CMutableTransaction BetProtocol::MakeAgreePayoutTx(std::vector payouts, + uint256 signedStakeTxHash) { CMutableTransaction mtx; - mtx.vin.push_back(CTxIn(signedStakeTxHash, 0, CCSig(signedPayoutCond))); - mtx.vouts = payouts; + mtx.vin.push_back(CTxIn(signedStakeTxHash, 0, CScript())); + mtx.vout = payouts; return mtx; } -CMutableTransaction PokerProtocol::MakeImportPayoutTx(std::vector payouts, - CC *signedPayoutCond, CTransaction signedDisputeTx, uint256 signedStakeTxHash) +CMutableTransaction BetProtocol::MakeImportPayoutTx(std::vector payouts, + CTransaction signedDisputeTx, uint256 signedStakeTxHash, MoMProof momProof) { - std::vector vDisputeTx; - signedDisputeTx >> CDataStream(vDisputeTx, SER_DISK, PROTOCOL_VERSION); CMutableTransaction mtx; - mtx.vin.push_back(CTxInput(signedStakeTxHash, 0, CCSig(signedPayoutCond))); + mtx.vin.push_back(CTxIn(signedStakeTxHash, 0, CScript())); mtx.vout = payouts; - CMutableTransaction.vout.insert(0, CTxOutput(0, CScript() << OP_RETURN << "PROOF HERE")); - CMutableTransaction.vout.insert(1, CTxOutput(0, CScript() << OP_RETURN << vDisputeTx)); + mtx.vout.insert(mtx.vout.begin(), CTxOut(0, CScript() << OP_RETURN << CheckSerialize(momProof))); + mtx.vout.insert(mtx.vout.begin()+1, CTxOut(0, CScript() << OP_RETURN << CheckSerialize(signedDisputeTx))); + return mtx; } diff --git a/src/cc/betprotocol.h b/src/cc/betprotocol.h new file mode 100644 index 000000000..dcbb6ec4e --- /dev/null +++ b/src/cc/betprotocol.h @@ -0,0 +1,85 @@ +#ifndef BETPROTOCOL_H +#define BETPROTOCOL_H + +#include "pubkey.h" +#include "primitives/transaction.h" +#include "cryptoconditions/include/cryptoconditions.h" + + +#define ExecMerkle CBlock::CheckMerkleBranch + + +class MoMProof +{ +public: + int nIndex; + std::vector branch; + uint256 notarisationHash; + + MoMProof() {} + MoMProof(int i, std::vector b, uint256 n) : notarisationHash(n), nIndex(i), branch(b) {} + + ADD_SERIALIZE_METHODS; + + template + inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { + READWRITE(VARINT(nIndex)); + READWRITE(branch); + READWRITE(notarisationHash); + } +}; + + +class DisputeHeader +{ +public: + int waitBlocks; + std::vector vmParams; + + DisputeHeader() {} + DisputeHeader(int w, std::vector vmp) : waitBlocks(w), vmParams(vmp) {} + + ADD_SERIALIZE_METHODS; + + template + inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { + READWRITE(VARINT(waitBlocks)); + READWRITE(vmParams); + } +}; + + +class BetProtocol +{ +protected: + char* disputeFunc = (char*) "DisputeBet"; + std::vector playerConditions(); +public: + CAmount MINFEE = 1; + std::vector players; + DisputeHeader disputeHeader; + + // Utility + BetProtocol(std::vector ps, DisputeHeader dh) : players(ps), disputeHeader(dh) {} + std::vector PlayerConditions(); + + // on PANGEA + CC* MakeDisputeCond(); + CMutableTransaction MakeSessionTx(); + CMutableTransaction MakeDisputeTx(uint256 signedSessionTxHash, uint256 vmResultHash); + CMutableTransaction MakePostEvidenceTx(uint256 signedSessionTxHash, + int playerIndex, std::vector state); + + // on KMD + CC* MakePayoutCond(uint256 signedSessionTxHash); + CMutableTransaction MakeStakeTx(CAmount totalPayout, uint256 signedSessionTx); + CMutableTransaction MakeAgreePayoutTx(std::vector payouts, uint256 signedStakeTxHash); + CMutableTransaction MakeImportPayoutTx(std::vector payouts, + CTransaction signedDisputeTx, uint256 signedStakeTxHash, MoMProof momProof); +}; + + +CC* CCNewSecp256k1(CPubKey k); + + +#endif /* BETPROTOCOL_H */ diff --git a/src/cc/disputepayout.cpp b/src/cc/disputepayout.cpp index 36a5e1723..ea34ed23c 100644 --- a/src/cc/disputepayout.cpp +++ b/src/cc/disputepayout.cpp @@ -1,34 +1,27 @@ -#include "primitives/transaction.h" -#include "streams.h" +#include + +#include "hash.h" #include "chain.h" -#include "main.h" +#include "version.h" +#include "komodo_cc.h" #include "cc/eval.h" -#include "cryptoconditions/include/cryptoconditions.h" +#include "cc/betprotocol.h" +#include "primitives/transaction.h" -bool GetSpends(uint256 hash, std::vector> &spends) +class DisputeHeader; + + +static bool GetOpReturnHash(CScript script, uint256 &hash) { - // NOT IMPLEMENTED - return false; + std::vector vHash; + GetOpReturnData(script, vHash); + if (vHash.size() != 32) return false; + memcpy(hash.begin(), vHash.data(), 32); + return true; } -class DisputeHeader -{ -public: - int waitBlocks; - std::vector vmHeader; - - ADD_SERIALIZE_METHODS; - - template - inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { - READWRITE(VARINT(waitBlocks)); - READWRITE(vmHeader); - } -}; - - /* * Crypto-Condition EVAL method that resolves a dispute of a session * @@ -42,48 +35,51 @@ public: * in 0: Spends Session TX first output, reveals DisputeHeader * out 0: OP_RETURN hash of payouts */ -bool DisputePayout(AppVM &vm, const CC *cond, const CTransaction *disputeTx, int nIn) +bool Eval::DisputePayout(AppVM &vm, const CC *cond, const CTransaction &disputeTx, unsigned int nIn) { - // TODO: Error messages! - if (disputeTx->vout.size() < 2) return 0; + if (disputeTx.vout.size() == 0) return Invalid("no-vouts"); // get payouts hash - std::vector vPayoutHash; uint256 payoutHash; - if (!GetOpReturnData(disputeTx->vout[0].scriptPubKey, vPayoutHash)) return 0; - memcpy(payoutHash.begin(), vPayoutHash.data(), 32); + if (!GetOpReturnHash(disputeTx.vout[0].scriptPubKey, payoutHash)) + return Invalid("invalid-payout-hash"); // load dispute header DisputeHeader disputeHeader; std::vector headerData(cond->paramsBin, cond->paramsBin+cond->paramsBinLength); - CDataStream(headerData, SER_DISK, PROTOCOL_VERSION) >> disputeHeader; - // TODO: exception? end of stream? + if (!CheckDeserialize(headerData, disputeHeader)) + return Invalid("invalid-dispute-header"); // ensure that enough time has passed CTransaction sessionTx; uint256 sessionBlockHash; - if (!GetTransaction(disputeTx->vin[0].prevout.hash, sessionTx, sessionBlockHash, false)) - return false; // wth? TODO: log TODO: MUST be upsteam of disputeTx, how to ensure? - // below does this by looking up block in blockindex - // what if GetTransaction returns from mempool, maybe theres no block? - CBlockIndex* sessionBlockIndex = mapBlockIndex[sessionBlockHash]; - if (chainActive.Height() < sessionBlockIndex->nHeight + disputeHeader.waitBlocks) - return false; // Not yet + CBlockIndex sessionBlock; + + if (!GetTx(disputeTx.vin[0].prevout.hash, sessionTx, sessionBlockHash, false)) + return Error("couldnt-get-parent"); + // TODO: This may not be an error, if both txs are to go into the same block... + // Probably change it to Invalid + if (!GetBlock(sessionBlockHash, sessionBlock)) + return Error("couldnt-get-block"); + + if (GetCurrentHeight() < sessionBlock.nHeight + disputeHeader.waitBlocks) + return Invalid("dispute-too-soon"); // Not yet // get spends - std::vector> spends; - if (!GetSpends(disputeTx->vin[0].prevout.hash, spends)) return 0; + std::vector spends; + if (!GetSpends(disputeTx.vin[0].prevout.hash, spends)) + return Error("couldnt-get-spends"); // verify result from VM int maxLength = -1; uint256 bestPayout; for (int i=1; i vmBody; - if (!GetOpReturnData(spends[i]->vout[0].scriptPubKey, vmBody)) continue; - auto out = vm.evaluate(disputeHeader.vmHeader, vmBody); + std::vector vmState; + if (!spends[i].vout.size() > 0) continue; + if (!GetOpReturnData(spends[i].vout[0].scriptPubKey, vmState)) continue; + auto out = vm.evaluate(disputeHeader.vmParams, vmState); uint256 resultHash = SerializeHash(out.second); if (out.first > maxLength) { maxLength = out.first; @@ -98,5 +94,7 @@ bool DisputePayout(AppVM &vm, const CC *cond, const CTransaction *disputeTx, int } } - return bestPayout == payoutHash; + if (maxLength == -1) return Invalid("no-evidence"); + + return bestPayout == payoutHash ? Valid() : Invalid("wrong-payout"); } diff --git a/src/cc/eval.cpp b/src/cc/eval.cpp index f61a7c241..589a362c0 100644 --- a/src/cc/eval.cpp +++ b/src/cc/eval.cpp @@ -1,56 +1,151 @@ +#include +#include + #include "primitives/transaction.h" #include "komodo_cc.h" #include "cc/eval.h" -#include +#include "main.h" +#include "chain.h" + + +Eval* EVAL_TEST = 0; + + +bool RunCCEval(const CC *cond, const CTransaction &tx, unsigned int nIn) +{ + Eval eval_; + Eval *eval = EVAL_TEST; + if (!eval) eval = &eval_; + + bool out = eval->Dispatch(cond, tx, nIn); + assert(eval->state.IsValid() == out); + + if (eval->state.IsValid()) return true; + + std::string lvl = eval->state.IsInvalid() ? "Invalid" : "Error!"; + fprintf(stderr, "CC Eval %s %s: %s in tx %s\n", lvl.data(), cond->method, + eval->state.GetRejectReason().data(), tx.GetHash().GetHex().data()); + return false; +} /* * Test the validity of an Eval node */ -bool EvalConditionValidity(const CC *cond, const CTransaction *txTo, int nIn) +bool Eval::Dispatch(const CC *cond, const CTransaction &txTo, unsigned int nIn) { if (strcmp(cond->method, "TestEval") == 0) { - return cond->paramsBinLength == 8 && - memcmp(cond->paramsBin, "TestEval", 8) == 0; + bool valid = cond->paramsBinLength == 8 && memcmp(cond->paramsBin, "TestEval", 8) == 0; + return valid ? Valid() : Invalid("testing"); } if (strcmp(cond->method, "ImportPayout") == 0) { - return CheckImportPayout(cond, txTo, nIn); + return ImportPayout(cond, txTo, nIn); } /* Example of how you might call DisputePayout - if (strcmp(ASSETCHAINS_SYMBOL, "PANGEA") == 0) { if (strcmp(cond->method, "DisputePoker") == 0) { return DisputePayout(PokerVM(), cond, txTo, nIn); } } - */ - fprintf(stderr, "no defined behaviour for method: %s\n", cond->method); - return 0; + return Invalid("no-such-method"); } - -bool GetPushData(const CScript &sig, std::vector &data) +bool Eval::GetSpends(uint256 hash, std::vector &spends) const { - opcodetype opcode; - auto pc = sig.begin(); - if (sig.GetOp(pc, opcode, data)) return opcode > OP_0 && opcode <= OP_PUSHDATA4; + // NOT IMPLEMENTED return false; } -bool GetOpReturnData(const CScript &sig, std::vector &data) +bool Eval::GetTx(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock, bool fAllowSlow) const { - auto pc = sig.begin(); - opcodetype opcode; - if (sig.GetOp2(pc, opcode, NULL)) - if (opcode == OP_RETURN) - if (sig.GetOp(pc, opcode, data)) - return opcode > OP_0 && opcode <= OP_PUSHDATA4; + return GetTransaction(hash, txOut, hashBlock, fAllowSlow); +} + + +unsigned int Eval::GetCurrentHeight() const +{ + return chainActive.Height(); +} + + +bool Eval::GetBlock(uint256 hash, CBlockIndex& blockIdx) const +{ + auto r = mapBlockIndex.find(hash); + if (r != mapBlockIndex.end()) { + blockIdx = *r->second; + return true; + } return false; } + +extern int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestamp); + + +bool Eval::CheckNotaryInputs(const CTransaction &tx, uint32_t height, uint32_t timestamp) const +{ + if (tx.vin.size() < 11) return false; + + uint8_t notaries[64][33]; + uint8_t seenNotaries[64]; + int nNotaries = komodo_notaries(notaries, height, timestamp); + char pk[33]; + + BOOST_FOREACH(const CTxIn &txIn, tx.vin) + { + // Get notary pubkey + CTransaction tx; + uint256 hashBlock; + if (!GetTx(txIn.prevout.hash, tx, hashBlock, false)) return false; + if (tx.vout.size() < txIn.prevout.n) return false; + const unsigned char *script = tx.vout[txIn.prevout.n].scriptPubKey.data(); + if (script[0] != 33) return false; + memcpy(pk, script+1, 33); + return true; + + // Check it's a notary + for (int i=0; i opret; + if (!GetOpReturnData(notarisationTx.vout[0].scriptPubKey, opret)) return 0; + if (opret.size() < 36) return 0; // In reality it is more than 36, but at the moment I + // only know where it is relative to the end, and this + // is enough to prevent a memory fault. In the case that + // the assumption about the presence of a MoM at this + // offset fails, we will return random other data that is + // not more likely to generate a false positive. + memcpy(mom.begin(), opret.data()+opret.size()-36, 32); + return 1; +} diff --git a/src/cc/eval.h b/src/cc/eval.h index aadb2e85f..2060d76ca 100644 --- a/src/cc/eval.h +++ b/src/cc/eval.h @@ -1,18 +1,56 @@ #ifndef CC_EVAL_H #define CC_EVAL_H -#include "cryptoconditions/include/cryptoconditions.h" +#include + +#include "chain.h" +#include "streams.h" +#include "version.h" +#include "consensus/validation.h" #include "primitives/transaction.h" -/* - * Test validity of a CC_Eval node - */ -bool EvalConditionValidity(const CC *cond, const CTransaction *tx, int nIn); -/* - * Test an ImportPayout CC Eval condition - */ -bool CheckImportPayout(const CC *cond, const CTransaction *payoutTx, int nIn); +class AppVM; + + +class Eval +{ +public: + CValidationState state; + + bool Invalid(std::string s) { return state.Invalid(false, 0, s); } + bool Error(std::string s) { return state.Error(s); } + bool Valid() { return true; } + + /* + * Test validity of a CC_Eval node + */ + virtual bool Dispatch(const CC *cond, const CTransaction &tx, unsigned int nIn); + + /* + * Dispute a payout using a VM + */ + bool DisputePayout(AppVM &vm, const CC *cond, const CTransaction &disputeTx, unsigned int nIn); + + /* + * Test an ImportPayout CC Eval condition + */ + bool ImportPayout(const CC *cond, const CTransaction &payoutTx, unsigned int nIn); + + /* + * IO functions + */ + virtual bool GetTx(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock, bool fAllowSlow) const; + virtual unsigned int GetCurrentHeight() const; + virtual bool GetSpends(uint256 hash, std::vector &spends) const; + virtual bool GetBlock(uint256 hash, CBlockIndex& blockIdx) const; + virtual bool GetMoM(uint256 notarisationHash, uint256& MoM) const; + virtual bool CheckNotaryInputs(const CTransaction &tx, uint32_t height, uint32_t timestamp) const; +}; + + +bool RunCCEval(const CC *cond, const CTransaction &tx, unsigned int nIn); + /* * Virtual machine to use in the case of on-chain app evaluation @@ -30,20 +68,36 @@ public: evaluate(std::vector header, std::vector body) = 0; }; -/* - * Test a DisputePayout CC Eval condition, using a provided AppVM - */ -bool DisputePayout(AppVM &vm, const CC *cond, const CTransaction *disputeTx, int nIn); /* - * Get PUSHDATA from a script + * Serialisation boilerplate */ -bool GetPushData(const CScript &sig, std::vector &data); +template +std::vector CheckSerialize(T &in); +template +bool CheckDeserialize(std::vector vIn, T &out); -/* - * Get OP_RETURN data from a script - */ -bool GetOpReturnData(const CScript &sig, std::vector &data); + + +template +std::vector CheckSerialize(T &in) +{ + CDataStream ss(SER_NETWORK, PROTOCOL_VERSION); + ss << in; + return std::vector(ss.begin(), ss.end()); +} + + +template +bool CheckDeserialize(std::vector vIn, T &out) +{ + CDataStream ss(vIn, SER_NETWORK, PROTOCOL_VERSION); + try { + ss >> out; + if (ss.eof()) return true; + } catch(...) {} + return false; +} #endif /* CC_EVAL_H */ diff --git a/src/cc/importpayout.cpp b/src/cc/importpayout.cpp index f05abb943..5251f1dfd 100644 --- a/src/cc/importpayout.cpp +++ b/src/cc/importpayout.cpp @@ -1,78 +1,11 @@ -#include "primitives/transaction.h" -#include "streams.h" -#include "chain.h" +#include + #include "main.h" +#include "chain.h" +#include "streams.h" #include "cc/eval.h" -#include "cc/importpayout.h" -#include "cryptoconditions/include/cryptoconditions.h" - - -extern int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestamp); - -bool DerefNotaryPubkey(const COutPoint &prevout, char *pk33) -{ - CTransaction tx; - uint256 hashBlock; - if (!GetTransaction(prevout.hash, tx, hashBlock, false)) return false; - if (tx.vout.size() < prevout.n) return false; - const unsigned char *script = tx.vout[prevout.n].scriptPubKey.data(); - if (script[0] != 33) return false; - memcpy(pk33, script+1, 33); - return true; -} - -bool CheckNotaryInputs(const CTransaction &tx, uint32_t height, uint32_t timestamp) -{ - if (tx.vin.size() < 11) return false; - - uint8_t notaries[64][33]; - uint8_t seenNotaries[64]; - int nNotaries = komodo_notaries(notaries, height, timestamp); - char *pk; - - BOOST_FOREACH(const CTxIn &txIn, tx.vin) - { - if (!DerefNotaryPubkey(txIn.prevout, pk)) return false; - - for (int i=0; inHeight, blockindex->nTime)) { - return false; - } - if (!notarisationTx.vout.size() < 1) return 0; - std::vector opret; - if (!GetOpReturnData(notarisationTx.vout[0].scriptPubKey, opret)) return 0; - if (opret.size() < 36) return 0; // In reality it is more than 36, but at the moment I - // only know where it is relative to the end, and this - // is enough to prevent a memory fault. In the case that - // the assumption about the presence of a MoM at this - // offset fails, we will return random other data that is - // not more likely to generate a false positive. - memcpy(mom.begin(), opret.data()+opret.size()-36, 32); - return 1; -} - -#define ExecMerkle CBlock::CheckMerkleBranch +#include "cc/betprotocol.h" +#include "primitives/transaction.h" /* @@ -97,54 +30,51 @@ bool GetMoM(const uint256 notaryHash, uint256 &mom) * out 0: OP_RETURN hash of payouts * out 1-: anything */ -bool CheckImportPayout(const CC *cond, const CTransaction *payoutTx, int nIn) +bool Eval::ImportPayout(const CC *cond, const CTransaction &payoutTx, unsigned int nIn) { // TODO: Error messages! - if (payoutTx->vin.size() != 1) return 0; - if (payoutTx->vout.size() < 2) return 0; - - // Get hash of payouts - std::vector payouts(payoutTx->vout.begin() + 2, payoutTx->vout.end()); - uint256 payoutsHash = SerializeHash(payouts); - std::vector vPayoutsHash(payoutsHash.begin(), payoutsHash.end()); + if (payoutTx.vout.size() < 2) return Invalid("need-2-vouts"); // load disputeTx from vout[1] CTransaction disputeTx; - { - std::vector exportData; - if (!GetOpReturnData(payoutTx->vout[1].scriptPubKey, exportData)) return 0; - CDataStream(exportData, SER_DISK, PROTOCOL_VERSION) >> disputeTx; - // TODO: end of stream? exception? - } + std::vector exportData; + GetOpReturnData(payoutTx.vout[1].scriptPubKey, exportData); + if (!CheckDeserialize(exportData, disputeTx)) + return Invalid("invalid-dispute-tx"); - // Check disputeTx.0 is vPayoutsHash - std::vector exportPayoutsHash; - if (!GetOpReturnData(disputeTx.vout[0].scriptPubKey, exportPayoutsHash)) return 0; - if (exportPayoutsHash != vPayoutsHash) return 0; + // Check disputeTx.0 shows correct payouts + { + std::vector payouts(payoutTx.vout.begin() + 2, payoutTx.vout.end()); + uint256 payoutsHash = SerializeHash(payouts); + std::vector vPayoutsHash(payoutsHash.begin(), payoutsHash.end()); + + if (disputeTx.vout[0].scriptPubKey != CScript() << OP_RETURN << vPayoutsHash) + return Invalid("wrong-payouts"); + } // Check disputeTx spends sessionTx.0 // condition ImportPayout params is session ID from other chain { - if (cond->paramsBinLength != 32) return 0; + if (cond->paramsBinLength != 32) return Invalid("malformed-params"); COutPoint prevout = disputeTx.vin[0].prevout; if (memcmp(prevout.hash.begin(), cond->paramsBin, 32) != 0 || - prevout.n != 0) return 0; + prevout.n != 0) return Invalid("wrong-session"); } // Check disputeTx solves momproof from vout[0] { - std::vector vchMomProof; - if (!GetOpReturnData(payoutTx->vout[0].scriptPubKey, vchMomProof)) return 0; + std::vector vProof; + GetOpReturnData(payoutTx.vout[0].scriptPubKey, vProof); + MoMProof proof; + if (!CheckDeserialize(vProof, proof)) + return Invalid("invalid-mom-proof-payload"); - MoMProof momProof; - CDataStream(vchMomProof, SER_DISK, PROTOCOL_VERSION) >> momProof; - - uint256 mom; - if (!GetMoM(momProof.notarisationHash, mom)) return 0; + uint256 MoM; + if (!GetMoM(proof.notarisationHash, MoM)) return Invalid("coudnt-load-mom"); - uint256 proofResult = ExecMerkle(disputeTx.GetHash(), momProof.branch, momProof.nIndex); - if (proofResult != mom) return 0; + if (MoM != ExecMerkle(disputeTx.GetHash(), proof.branch, proof.nIndex)) + return Invalid("mom-check-fail"); } - return 1; + return Valid(); } diff --git a/src/cc/importpayout.h b/src/cc/importpayout.h deleted file mode 100644 index 3ae094e80..000000000 --- a/src/cc/importpayout.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef KOMODO_TXPROOF_H -#define KOMODO_TXPROOF_H - - -class MoMProof -{ -public: - int nIndex; - std::vector branch; - uint256 notarisationHash; - - MoMProof() {} - MoMProof(int i, std::vector b, uint256 n) : notarisationHash(n), nIndex(i), branch(b) {} - - ADD_SERIALIZE_METHODS; - - template - inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { - READWRITE(VARINT(nIndex)); - READWRITE(branch); - READWRITE(notarisationHash); - } -}; - - -#endif /* KOMODO_TXPROOF_H */ diff --git a/src/cryptoconditions/include/cryptoconditions.h b/src/cryptoconditions/include/cryptoconditions.h index 439fe3f4a..a192b06c2 100644 --- a/src/cryptoconditions/include/cryptoconditions.h +++ b/src/cryptoconditions/include/cryptoconditions.h @@ -96,6 +96,7 @@ char* cc_typeName(const CC *cond); enum CCTypeId cc_typeId(const CC *cond); unsigned long cc_getCost(const CC *cond); uint32_t cc_typeMask(const CC *cond); +int cc_isAnon(const CC *cond); void cc_free(struct CC *cond); #ifdef __cplusplus diff --git a/src/cryptoconditions/src/cryptoconditions.c b/src/cryptoconditions/src/cryptoconditions.c index 622f09530..6a6513b59 100644 --- a/src/cryptoconditions/src/cryptoconditions.c +++ b/src/cryptoconditions/src/cryptoconditions.c @@ -284,7 +284,7 @@ char *cc_typeName(const CC *cond) { CC *cc_new(int typeId) { CC *cond = calloc(1, sizeof(CC)); - cond->type = CCTypeRegistry[typeId]; + cond->type = typeId == CC_Anon ? &CC_AnonType : CCTypeRegistry[typeId]; return cond; } diff --git a/src/cryptoconditions/src/threshold.c b/src/cryptoconditions/src/threshold.c index da8a3027a..f4684cd7b 100644 --- a/src/cryptoconditions/src/threshold.c +++ b/src/cryptoconditions/src/threshold.c @@ -130,15 +130,19 @@ static CC *thresholdFromFulfillment(const Fulfillment_t *ffill) { static Fulfillment_t *thresholdToFulfillment(const CC *cond) { CC *sub; Fulfillment_t *fulfillment; + + // Make a copy of subconditions so we can leave original order alone + CC** subconditions = malloc(cond->size*sizeof(CC*)); + memcpy(subconditions, cond->subconditions, cond->size*sizeof(CC*)); - qsort(cond->subconditions, cond->size, sizeof(CC*), cmpConditionCost); + qsort(subconditions, cond->size, sizeof(CC*), cmpConditionCost); ThresholdFulfillment_t *tf = calloc(1, sizeof(ThresholdFulfillment_t)); int needed = cond->threshold; for (int i=0; isize; i++) { - sub = cond->subconditions[i]; + sub = subconditions[i]; if (needed && (fulfillment = asnFulfillmentNew(sub))) { asn_set_add(&tf->subfulfillments, fulfillment); needed--; @@ -147,6 +151,8 @@ static Fulfillment_t *thresholdToFulfillment(const CC *cond) { } } + free(subconditions); + if (needed) { ASN_STRUCT_FREE(asn_DEF_ThresholdFulfillment, tf); return NULL; @@ -200,7 +206,7 @@ static void thresholdToJSON(const CC *cond, cJSON *params) { static int thresholdIsFulfilled(const CC *cond) { int nFulfilled = 0; - for (int i=0; ithreshold; i++) { + for (int i=0; isize; i++) { if (cc_isFulfilled(cond->subconditions[i])) { nFulfilled++; } diff --git a/src/komodo_cc.cpp b/src/komodo_cc.cpp index 81459fe2b..e7b166eba 100644 --- a/src/komodo_cc.cpp +++ b/src/komodo_cc.cpp @@ -30,3 +30,72 @@ bool IsSignedCryptoCondition(const CC *cond) if (IsSignedCryptoCondition(cond->subconditions[i])) return true; return false; } + + + +CScript CCPubKey(const CC *cond) +{ + unsigned char buf[1000]; + size_t len = cc_conditionBinary(cond, buf); + return CScript() << std::vector(buf, buf+len) << OP_CHECKCRYPTOCONDITION; +} + + +CScript CCSig(const CC *cond) +{ + unsigned char buf[1000]; + size_t len = cc_fulfillmentBinary(cond, buf, 1000); + auto ffill = std::vector(buf, buf+len); + ffill.push_back(1); // SIGHASH_ALL + return CScript() << ffill; +} + + +std::string CCShowStructure(CC *cond) +{ + std::string out; + if (cc_isAnon(cond)) { + out = "A" + std::to_string(cc_typeId(cond)); + } + else if (cc_typeId(cond) == CC_Threshold) { + out += "(" + std::to_string(cond->threshold) + " of "; + for (int i=0; isize; i++) { + out += CCShowStructure(cond->subconditions[i]); + if (i < cond->size - 1) out += ","; + } + out += ")"; + } + else { + out = std::to_string(cc_typeId(cond)); + } + return out; +} + + +CC* CCPrune(CC *cond) +{ + std::vector ffillBin; + GetPushData(CCSig(cond), ffillBin); + return cc_readFulfillmentBinary(ffillBin.data(), ffillBin.size()-1); +} + + +bool GetPushData(const CScript &sig, std::vector &data) +{ + opcodetype opcode; + auto pc = sig.begin(); + if (sig.GetOp(pc, opcode, data)) return opcode > OP_0 && opcode <= OP_PUSHDATA4; + return false; +} + + +bool GetOpReturnData(const CScript &sig, std::vector &data) +{ + auto pc = sig.begin(); + opcodetype opcode; + if (sig.GetOp2(pc, opcode, NULL)) + if (opcode == OP_RETURN) + if (sig.GetOp(pc, opcode, data)) + return opcode > OP_0 && opcode <= OP_PUSHDATA4; + return false; +} diff --git a/src/komodo_cc.h b/src/komodo_cc.h index 62e584a94..78cb4401a 100644 --- a/src/komodo_cc.h +++ b/src/komodo_cc.h @@ -1,6 +1,7 @@ #ifndef KOMODO_CC_H #define KOMODO_CC_H +#include "script/script.h" #include "cryptoconditions/include/cryptoconditions.h" @@ -31,4 +32,42 @@ bool IsSupportedCryptoCondition(const CC *cond); bool IsSignedCryptoCondition(const CC *cond); +/* + * Turn a condition into a scriptPubKey + */ +CScript CCPubKey(const CC *cond); + + +/* + * Turn a condition into a scriptSig + * + * Note: This will fail in undefined ways if the condition is missing signatures + */ +CScript CCSig(const CC *cond); + + +/* + * Produces a string showing the structure of a CC condition + */ +std::string CCShowStructure(CC *cond); + + +/* + * Take a signed CC, encode it, and decode it again. This has the effect + * of removing branches unneccesary for fulfillment. + */ +CC* CCPrune(CC *cond); + + +/* + * Get PUSHDATA from a script + */ +bool GetPushData(const CScript &sig, std::vector &data); + +/* + * Get OP_RETURN data from a script + */ +bool GetOpReturnData(const CScript &sig, std::vector &data); + + #endif /* KOMODO_CC_H */ diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 30d2c0aab..f353d549d 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -8,7 +8,7 @@ #include "chainparams.h" #include "checkpoints.h" #include "consensus/validation.h" -#include "cc/importpayout.h" +#include "cc/betprotocol.h" #include "main.h" #include "primitives/transaction.h" #include "rpcserver.h" diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 851904eb3..31a7fdbd0 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -1310,18 +1310,22 @@ int TransactionSignatureChecker::CheckCryptoCondition( } catch (logic_error ex) { return 0; } + + VerifyEval eval = [] (CC *cond, void *checker) { + return ((TransactionSignatureChecker*)checker)->CheckEvalCondition(cond); + }; + int out = cc_verify(cond, (const unsigned char*)&sighash, 32, 0, - condBin.data(), condBin.size(), GetCCEval(), (void*)this); + condBin.data(), condBin.size(), eval, (void*)this); cc_free(cond); return out; } -VerifyEval TransactionSignatureChecker::GetCCEval() const { - return [] (CC *cond, void *checker) { - fprintf(stderr, "Cannot check crypto-condition Eval outside of server\n"); - return 0; - }; +int TransactionSignatureChecker::CheckEvalCondition(const CC *cond) const +{ + fprintf(stderr, "Cannot check crypto-condition Eval outside of server\n"); + return 0; } diff --git a/src/script/interpreter.h b/src/script/interpreter.h index 57051f797..46c0818d2 100644 --- a/src/script/interpreter.h +++ b/src/script/interpreter.h @@ -142,13 +142,12 @@ public: class TransactionSignatureChecker : public BaseSignatureChecker { -private: +protected: const CTransaction* txTo; unsigned int nIn; const CAmount amount; const PrecomputedTransactionData* txdata; -protected: virtual bool VerifySignature(const std::vector& vchSig, const CPubKey& vchPubKey, const uint256& sighash) const; public: @@ -161,7 +160,7 @@ public: const std::vector& ffillBin, const CScript& scriptCode, uint32_t consensusBranchId) const; - virtual VerifyEval GetCCEval() const; + virtual int CheckEvalCondition(const CC *cond) const; }; class MutableTransactionSignatureChecker : public TransactionSignatureChecker diff --git a/src/script/serverchecker.cpp b/src/script/serverchecker.cpp index 852895305..0baaee9f5 100644 --- a/src/script/serverchecker.cpp +++ b/src/script/serverchecker.cpp @@ -100,14 +100,7 @@ bool ServerTransactionSignatureChecker::VerifySignature(const std::vectorCheckEvalCondition(cond); - }; -} - -int ServerTransactionSignatureChecker::CheckEvalCondition(CC *cond) const -{ - return EvalConditionValidity(cond, txTo, nIn); + return RunCCEval(cond, *txTo, nIn); } diff --git a/src/script/serverchecker.h b/src/script/serverchecker.h index c680da7ce..107586689 100644 --- a/src/script/serverchecker.h +++ b/src/script/serverchecker.h @@ -16,15 +16,12 @@ class ServerTransactionSignatureChecker : public TransactionSignatureChecker { private: bool store; - const CTransaction* txTo; - unsigned int nIn; public: - ServerTransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn, const CAmount& amount, bool storeIn, PrecomputedTransactionData& txdataIn) : TransactionSignatureChecker(txToIn, nInIn, amount, txdataIn), store(storeIn) {} + ServerTransactionSignatureChecker(const CTransaction* txToIn, unsigned int nIn, const CAmount& amount, bool storeIn, PrecomputedTransactionData& txdataIn) : TransactionSignatureChecker(txToIn, nIn, amount, txdataIn), store(storeIn) {} bool VerifySignature(const std::vector& vchSig, const CPubKey& vchPubKey, const uint256& sighash) const; - int CheckEvalCondition(CC *cond) const; - VerifyEval GetCCEval() const; + int CheckEvalCondition(const CC *cond) const; }; #endif // BITCOIN_SCRIPT_SERVERCHECKER_H diff --git a/src/test-komodo/main.cpp b/src/test-komodo/main.cpp index 2a83e47fa..527d7666e 100644 --- a/src/test-komodo/main.cpp +++ b/src/test-komodo/main.cpp @@ -1,12 +1,14 @@ #include "key.h" +#include "chainparams.h" #include "gtest/gtest.h" #include "crypto/common.h" int main(int argc, char **argv) { - assert(init_and_check_sodium() != -1); - ECC_Start(); + assert(init_and_check_sodium() != -1); + ECC_Start(); + SelectParams(CBaseChainParams::REGTEST); - testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); } diff --git a/src/test-komodo/test_bet.cpp b/src/test-komodo/test_bet.cpp new file mode 100644 index 000000000..d0072ad38 --- /dev/null +++ b/src/test-komodo/test_bet.cpp @@ -0,0 +1,596 @@ +#include +#include + +#include "cc/betprotocol.h" +#include "cc/eval.h" +#include "base58.h" +#include "key.h" +#include "main.h" +#include "komodo_cc.h" +#include "primitives/transaction.h" +#include "script/interpreter.h" +#include "script/serverchecker.h" + +#include "testutils.h" + + + +static std::vector playerSecrets; +static std::vector players; + +static int Dealer = 0, Player1 = 1, Player2 = 2; + + +int CCSign(CMutableTransaction &tx, unsigned int nIn, CC *cond, std::vector keyIds) { + PrecomputedTransactionData txdata(tx); + uint256 sighash = SignatureHash(CCPubKey(cond), tx, nIn, SIGHASH_ALL, 0, 0, &txdata); + int nSigned = 0; + for (int i=0; i> evaluate( + std::vector header, std::vector body) + { + std::vector outs; + if (memcmp(header.data(), "BetHeader", 9)) { + printf("Wrong VM header\n"); + return std::make_pair(0, outs); + } + outs.push_back(CTxOut(2, CScript() << OP_RETURN << body.size())); + return std::make_pair(body.size(), outs); + } +}; + + +class EvalMock : public Eval +{ +public: + uint256 MoM; + int currentHeight; + std::map txs; + std::map blocks; + std::map> spends; + + bool Dispatch(const CC *cond, const CTransaction &txTo, unsigned int nIn) + { + if (strcmp(cond->method, "DisputeBet") == 0) { + MockVM vm; + return DisputePayout(vm, cond, txTo, nIn); + } + if (strcmp(cond->method, "ImportPayout") == 0) { + return ImportPayout(cond, txTo, nIn); + } + return Invalid("invalid-method"); + } + + bool GetSpends(uint256 hash, std::vector &spendsOut) const + { + auto r = spends.find(hash); + if (r != spends.end()) { + spendsOut = r->second; + return true; + } + return false; + } + + bool GetTx(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock, bool fAllowSlow) const + { + auto r = txs.find(hash); + if (r != txs.end()) { + txOut = r->second; + hashBlock = hash; + return true; + } + return false; + } + + unsigned int GetCurrentHeight() const { return currentHeight; } + + bool GetBlock(uint256 hash, CBlockIndex& blockIdx) const + { + auto r = blocks.find(hash); + if (r == blocks.end()) return false; + blockIdx = r->second; + return true; + } + + bool GetMoM(uint256 notarisationHash, uint256& _MoM) const + { + if (notarisationHash == NotarisationHash()) { + _MoM = MoM; + return true; + } + return false; + } + + static uint256 NotarisationHash() + { + uint256 h; + h.begin()[0] = 123; + return h; + } +}; + + +extern Eval* EVAL_TEST; + + +/* + * Generates example data that we will test with and shows how to call BetProtocol. + */ +class ExampleBet +{ +public: + BetProtocol bet; + CAmount totalPayout; + + ExampleBet() : bet(BetProtocol(players, DisputeHeader(2, VCH("BetHeader", 9)))), totalPayout(100) {} + ~ExampleBet() {}; + + CTransaction SessionTx() + { + return CTransaction(bet.MakeSessionTx()); + } + + CC* DisputeCond() + { + return bet.MakeDisputeCond(); + } + + CC* PayoutCond() + { + return bet.MakePayoutCond(SessionTx().GetHash()); + } + + CTransaction StakeTx() + { + return CTransaction(bet.MakeStakeTx(totalPayout, SessionTx().GetHash())); + } + + std::vector PlayerState(int playerIdx) + { + std::vector state; + for (int i=0; i Payouts(int playerIdx) + { + return MockVM().evaluate(bet.disputeHeader.vmParams, PlayerState(playerIdx)).second; + } + + CMutableTransaction DisputeTx(int playerIdx) + { + return bet.MakeDisputeTx(SessionTx().GetHash(), SerializeHash(Payouts(playerIdx))); + } + + CMutableTransaction PostEvidenceTx(int playerIdx) + { + return bet.MakePostEvidenceTx(SessionTx().GetHash(), playerIdx, PlayerState(playerIdx)); + } + + CMutableTransaction AgreePayoutTx() + { + std::vector v; + return bet.MakeAgreePayoutTx(v, uint256()); + } + + MoMProof GetMoMProof() + { + int nIndex = 5; + std::vector vBranch; + vBranch.resize(3); + return MoMProof(nIndex, vBranch, EvalMock::NotarisationHash()); + } + + CMutableTransaction ImportPayoutTx() + { + CMutableTransaction disputeTx = DisputeTx(Player2); + return bet.MakeImportPayoutTx(Payouts(Player2), disputeTx, uint256(), GetMoMProof()); + } + + EvalMock SetEvalMock(int currentHeight) + { + EvalMock eval; + CTransaction sessionTx = SessionTx(); + + eval.txs[sessionTx.GetHash()] = sessionTx; + + CBlockIndex sessionBlock; + sessionBlock.nHeight = 10; + eval.blocks[sessionTx.GetHash()] = sessionBlock; + + std::vector sessionSpends; + sessionSpends.push_back(CTransaction(PostEvidenceTx(Dealer))); + sessionSpends.push_back(CTransaction()); // Invalid, should be ignored + sessionSpends.push_back(CTransaction(PostEvidenceTx(Player2))); + eval.spends[sessionTx.GetHash()] = sessionSpends; + + eval.currentHeight = currentHeight; + + MoMProof proof = GetMoMProof(); + eval.MoM = ExecMerkle(DisputeTx(Player2).GetHash(), proof.branch, proof.nIndex); + + EVAL_TEST = &eval; + return eval; + } +}; + + +ExampleBet ebet; + + +class TestBet : public ::testing::Test { +protected: + static void SetUpTestCase() { + // Make playerSecrets + CBitcoinSecret vchSecret; + auto addKey = [&] (std::string k) { vchSecret.SetString(k); playerSecrets.push_back(vchSecret.GetKey()); }; + addKey("UwFBKf4d6wC3yqdnk3LoGrFjy7gwxrWerBT8jTFamrBbem8wSw9L"); + addKey("Up6GpWwrmx2VpqF8rD3snJXToKT56Dzc8YSoL24osXnfNdCucaMR"); + addKey("UxEHwki3A95PSHHVRzE2N67eHTeoUcqLkovxp6yDPVViv54skF8c"); + // Make playerpubkeys + for (int i=0; isubconditions[0]->paramsBin, 11)); + for (int i=0; isubconditions[1]->subconditions[i])); +} + + +TEST_F(TestBet, testSignDisputeCond) +{ + // Only one key needed to dispute + CMutableTransaction disputeTx = ebet.DisputeTx(Player1); + CC *disputeCond = ebet.DisputeCond(); + EXPECT_EQ(1, CCSign(disputeTx, 0, disputeCond, {Player1})); + + EXPECT_EQ(1, cc_isFulfilled(disputeCond->subconditions[0])); + EXPECT_EQ(1, cc_isFulfilled(disputeCond->subconditions[1])); + EXPECT_EQ(0, cc_isFulfilled(disputeCond->subconditions[1]->subconditions[0])); + EXPECT_EQ(1, cc_isFulfilled(disputeCond->subconditions[1]->subconditions[1])); + EXPECT_EQ(0, cc_isFulfilled(disputeCond->subconditions[1]->subconditions[2])); + EXPECT_EQ(1, cc_isFulfilled(disputeCond)); +} + + +TEST_F(TestBet, testDispute) +{ + EvalMock eval = ebet.SetEvalMock(12); + + // Only one key needed to dispute + CMutableTransaction disputeTx = ebet.DisputeTx(Player2); + CC *disputeCond = ebet.DisputeCond(); + EXPECT_EQ(1, CCSign(disputeTx, 0, disputeCond, {Player2})); + + // Success + EXPECT_TRUE(TestCC(disputeTx, 0, disputeCond)); + + // Set result hash to some rubbish and check false + uint256 rubbishHash; + std::vector rubbish(rubbishHash.begin(), rubbishHash.end()); + disputeTx.vout[0].scriptPubKey = CScript() << OP_RETURN << rubbish; + EXPECT_EQ(1, CCSign(disputeTx, 0, disputeCond, {Player2})); + EXPECT_FALSE(TestCC(disputeTx, 0, disputeCond)); + EXPECT_EQ("wrong-payout", eval.state.GetRejectReason()); +} + + +TEST_F(TestBet, testDisputeInvalidOutput) +{ + EvalMock eval = ebet.SetEvalMock(11); + + // Only one key needed to dispute + CMutableTransaction disputeTx = ebet.DisputeTx(Dealer); + CC *disputeCond = ebet.DisputeCond(); + + // invalid payout hash + std::vector invalidHash = {0,1,2}; + disputeTx.vout[0].scriptPubKey = CScript() << OP_RETURN << invalidHash; + ASSERT_EQ(1, CCSign(disputeTx, 0, disputeCond, {Player1})); + EXPECT_FALSE(TestCC(disputeTx, 0, disputeCond)); + EXPECT_EQ("invalid-payout-hash", eval.state.GetRejectReason()); + + // no vout at all + disputeTx.vout.resize(0); + ASSERT_EQ(1, CCSign(disputeTx, 0, disputeCond, {Player1})); + EXPECT_FALSE(TestCC(disputeTx, 0, disputeCond)); + EXPECT_EQ("no-vouts", eval.state.GetRejectReason()); +} + + +TEST_F(TestBet, testDisputeEarly) +{ + EvalMock eval = ebet.SetEvalMock(11); + + // Only one key needed to dispute + CMutableTransaction disputeTx = ebet.DisputeTx(Dealer); + CC *disputeCond = ebet.DisputeCond(); + EXPECT_EQ(1, CCSign(disputeTx, 0, disputeCond, {Player1})); + + EXPECT_FALSE(TestCC(disputeTx, 0, disputeCond)); + EXPECT_EQ("dispute-too-soon", eval.state.GetRejectReason()); +} + + +TEST_F(TestBet, testDisputeInvalidParams) +{ + EvalMock eval = ebet.SetEvalMock(12); + + CMutableTransaction disputeTx = ebet.DisputeTx(Player2); + CC *disputeCond = ebet.DisputeCond(); + CC *evalCond = disputeCond->subconditions[0]; + + // too long + evalCond->paramsBin = (unsigned char*) realloc(evalCond->paramsBin, ++evalCond->paramsBinLength); + ASSERT_EQ(1, CCSign(disputeTx, 0, disputeCond, {Player2})); + EXPECT_FALSE(TestCC(disputeTx, 0, disputeCond)); + EXPECT_EQ("invalid-dispute-header", eval.state.GetRejectReason()); + + // too short + eval.state = CValidationState(); + evalCond->paramsBinLength = 1; + ASSERT_EQ(1, CCSign(disputeTx, 0, disputeCond, {Player2})); + EXPECT_FALSE(TestCC(disputeTx, 0, disputeCond)); + EXPECT_EQ("invalid-dispute-header", eval.state.GetRejectReason()); + + // is fine + eval.state = CValidationState(); + evalCond->paramsBinLength = 11; + ASSERT_EQ(1, CCSign(disputeTx, 0, disputeCond, {Player2})); + EXPECT_TRUE(TestCC(disputeTx, 0, disputeCond)); +} + + +TEST_F(TestBet, testDisputeInvalidEvidence) +{ + EvalMock eval = ebet.SetEvalMock(12); + + CMutableTransaction disputeTx = ebet.DisputeTx(Player2); + CC *disputeCond = ebet.DisputeCond(); + CCSign(disputeTx, 0, disputeCond, {Player2}); + + CMutableTransaction mtx; + + mtx.vout.resize(1); + mtx.vout[0].scriptPubKey = CScript(); + eval.spends[ebet.SessionTx().GetHash()][1] = CTransaction(mtx); + ASSERT_TRUE(TestCC(disputeTx, 0, disputeCond)); + + mtx.vout[0].scriptPubKey << OP_RETURN; + eval.spends[ebet.SessionTx().GetHash()][1] = CTransaction(mtx); + ASSERT_TRUE(TestCC(disputeTx, 0, disputeCond)); + + mtx.vout[0].scriptPubKey = CScript() << 0; + eval.spends[ebet.SessionTx().GetHash()][1] = CTransaction(mtx); + ASSERT_TRUE(TestCC(disputeTx, 0, disputeCond)); + + eval.spends[ebet.SessionTx().GetHash()].resize(1); + eval.spends[ebet.SessionTx().GetHash()][0] = CTransaction(); + ASSERT_FALSE(TestCC(disputeTx, 0, disputeCond)); + EXPECT_EQ("no-evidence", eval.state.GetRejectReason()); +} + + +TEST_F(TestBet, testMakeStakeTx) +{ + CTransaction stakeTx = ebet.StakeTx(); + EXPECT_EQ(0, stakeTx.vin.size()); + EXPECT_EQ(1, stakeTx.vout.size()); + EXPECT_EQ(ebet.totalPayout, stakeTx.vout[0].nValue); + EXPECT_EQ(CCPubKey(ebet.PayoutCond()), stakeTx.vout[0].scriptPubKey); +} + + +TEST_F(TestBet, testMakePayoutCond) +{ + CC *payoutCond = ebet.PayoutCond(); + EXPECT_EQ("(1 of (3 of 5,5,5),(2 of (1 of 5,5,5),15))", CCShowStructure(payoutCond)); + EXPECT_EQ(0, memcmp(payoutCond->subconditions[1]->subconditions[1]->paramsBin, + ebet.SessionTx().GetHash().begin(), 32)); +} + + +TEST_F(TestBet, testSignPayout) +{ + + CMutableTransaction payoutTx = ebet.AgreePayoutTx(); + CC *payoutCond = ebet.PayoutCond(); + + EXPECT_EQ(0, cc_isFulfilled(payoutCond->subconditions[0])); + EXPECT_EQ(0, cc_isFulfilled(payoutCond->subconditions[1])); + EXPECT_EQ(0, cc_isFulfilled(payoutCond)); + + EXPECT_EQ(2, CCSign(payoutTx, 0, payoutCond, {Player1})); + EXPECT_EQ(0, cc_isFulfilled(payoutCond->subconditions[0])); + EXPECT_EQ(1, cc_isFulfilled(payoutCond->subconditions[1])); + EXPECT_EQ(1, cc_isFulfilled(payoutCond)); + + EXPECT_EQ(2, CCSign(payoutTx, 0, payoutCond, {Player2})); + EXPECT_EQ(0, cc_isFulfilled(payoutCond->subconditions[0])); + + EXPECT_EQ(2, CCSign(payoutTx, 0, payoutCond, {Dealer})); + EXPECT_EQ(1, cc_isFulfilled(payoutCond->subconditions[0])); +} + + +TEST_F(TestBet, testAgreePayout) +{ + EvalMock eval = ebet.SetEvalMock(12); + + CMutableTransaction payoutTx = ebet.AgreePayoutTx(); + CC *payoutCond = ebet.PayoutCond(); + + EXPECT_EQ(2, CCSign(payoutTx, 0, payoutCond, {Dealer})); + EXPECT_FALSE(TestCC(payoutTx, 0, payoutCond)); + EXPECT_EQ("(1 of (2 of (1 of 5,A5,A5),15),A2)", + CCShowStructure(CCPrune(payoutCond))); + + EXPECT_EQ(2, CCSign(payoutTx, 0, payoutCond, {Player1})); + EXPECT_FALSE(TestCC(payoutTx, 0, payoutCond)); + EXPECT_EQ("(1 of (2 of (1 of 5,A5,A5),15),A2)", + CCShowStructure(CCPrune(payoutCond))); + + EXPECT_EQ(2, CCSign(payoutTx, 0, payoutCond, {Player2})); + EXPECT_TRUE( TestCC(payoutTx, 0, payoutCond)); + EXPECT_EQ("(1 of (3 of 5,5,5),A2)", + CCShowStructure(CCPrune(payoutCond))); +} + + +TEST_F(TestBet, testImportPayout) +{ + EvalMock eval = ebet.SetEvalMock(12); + + CMutableTransaction importTx = ebet.ImportPayoutTx(); + CC *payoutCond = ebet.PayoutCond(); + EXPECT_EQ(2, CCSign(importTx, 0, payoutCond, {Player2})); + EXPECT_TRUE(TestCC(importTx, 0, payoutCond)); +} + + +TEST_F(TestBet, testImportPayoutFewVouts) +{ + EvalMock eval = ebet.SetEvalMock(12); + + CMutableTransaction importTx = ebet.ImportPayoutTx(); + importTx.vout.resize(1); + CC *payoutCond = ebet.PayoutCond(); + EXPECT_EQ(2, CCSign(importTx, 0, payoutCond, {Player2})); + EXPECT_FALSE(TestCC(importTx, 0, payoutCond)); + EXPECT_EQ("need-2-vouts", eval.state.GetRejectReason()); +} + + +TEST_F(TestBet, testImportPayoutInvalidDisputeTx) +{ + EvalMock eval = ebet.SetEvalMock(12); + + CMutableTransaction importTx = ebet.ImportPayoutTx(); + importTx.vout[1].scriptPubKey.pop_back(); + CC *payoutCond = ebet.PayoutCond(); + EXPECT_EQ(2, CCSign(importTx, 0, payoutCond, {Player2})); + EXPECT_FALSE(TestCC(importTx, 0, payoutCond)); + EXPECT_EQ("invalid-dispute-tx", eval.state.GetRejectReason()); +} + + +TEST_F(TestBet, testImportPayoutWrongPayouts) +{ + EvalMock eval = ebet.SetEvalMock(12); + + CMutableTransaction importTx = ebet.ImportPayoutTx(); + importTx.vout[2].nValue = 7; + CC *payoutCond = ebet.PayoutCond(); + EXPECT_EQ(2, CCSign(importTx, 0, payoutCond, {Player2})); + ASSERT_FALSE(TestCC(importTx, 0, payoutCond)); + EXPECT_EQ("wrong-payouts", eval.state.GetRejectReason()); +} + + +TEST_F(TestBet, testImportPayoutMangleSessionId) +{ + EvalMock eval = ebet.SetEvalMock(12); + + CMutableTransaction importTx = ebet.ImportPayoutTx(); + CC *payoutCond = ebet.PayoutCond(); + payoutCond->subconditions[1]->subconditions[1]->paramsBinLength = 31; + EXPECT_EQ(2, CCSign(importTx, 0, payoutCond, {Player2})); + ASSERT_FALSE(TestCC(importTx, 0, payoutCond)); + EXPECT_EQ("malformed-params", eval.state.GetRejectReason()); + + payoutCond = ebet.PayoutCond(); + memset(payoutCond->subconditions[1]->subconditions[1]->paramsBin, 1, 32); + EXPECT_EQ(2, CCSign(importTx, 0, payoutCond, {Player2})); + ASSERT_FALSE(TestCC(importTx, 0, payoutCond)); + EXPECT_EQ("wrong-session", eval.state.GetRejectReason()); +} + + +TEST_F(TestBet, testImportPayoutInvalidProofPayload) +{ + EvalMock eval = ebet.SetEvalMock(12); + + CMutableTransaction importTx = ebet.ImportPayoutTx(); + importTx.vout[0].scriptPubKey.pop_back(); + CC *payoutCond = ebet.PayoutCond(); + EXPECT_EQ(2, CCSign(importTx, 0, payoutCond, {Player2})); + EXPECT_FALSE(TestCC(importTx, 0, payoutCond)); + EXPECT_EQ("invalid-mom-proof-payload", eval.state.GetRejectReason()); +} + + +TEST_F(TestBet, testImportPayoutInvalidNotarisationHash) +{ + EvalMock eval = ebet.SetEvalMock(12); + + CMutableTransaction importTx = ebet.ImportPayoutTx(); + MoMProof proof = ebet.GetMoMProof(); + proof.notarisationHash = uint256(); + importTx.vout[0].scriptPubKey = CScript() << OP_RETURN << CheckSerialize(proof); + CC *payoutCond = ebet.PayoutCond(); + EXPECT_EQ(2, CCSign(importTx, 0, payoutCond, {Player2})); + EXPECT_FALSE(TestCC(importTx, 0, payoutCond)); + EXPECT_EQ("coudnt-load-mom", eval.state.GetRejectReason()); +} + + +TEST_F(TestBet, testImportPayoutMomFail) +{ + EvalMock eval = ebet.SetEvalMock(12); + + CMutableTransaction importTx = ebet.ImportPayoutTx(); + MoMProof proof = ebet.GetMoMProof(); + proof.nIndex ^= 1; + importTx.vout[0].scriptPubKey = CScript() << OP_RETURN << CheckSerialize(proof); + CC *payoutCond = ebet.PayoutCond(); + EXPECT_EQ(2, CCSign(importTx, 0, payoutCond, {Player2})); + EXPECT_FALSE(TestCC(importTx, 0, payoutCond)); + EXPECT_EQ("mom-check-fail", eval.state.GetRejectReason()); +} diff --git a/src/test-komodo/test_cryptoconditions.cpp b/src/test-komodo/test_cryptoconditions.cpp index 9ab4b676c..f22d50be3 100644 --- a/src/test-komodo/test_cryptoconditions.cpp +++ b/src/test-komodo/test_cryptoconditions.cpp @@ -8,60 +8,35 @@ #include "script/interpreter.h" #include "script/serverchecker.h" +#include "testutils.h" -#define VCH(a,b) std::vector(a, a + b) + +CKey notaryKey; std::string pubkey = "0205a8ad0c1dbc515f149af377981aab58b836af008d4d7ab21bd76faf80550b47"; std::string secret = "UxFWWxsf1d7w7K5TvAWSkeX4H95XQKwdwGv49DXwWUTzPTTjHBbU"; -CKey notaryKey; - - -char ccjsonerr[1000] = "\0"; -#define CCFromJson(o,s) \ - o = cc_conditionFromJSONString(s, ccjsonerr); \ - if (!o) FAIL() << "bad json: " << ccjsonerr; - - -CScript CCPubKey(const CC *cond) { - unsigned char buf[1000]; - size_t len = cc_conditionBinary(cond, buf); - return CScript() << VCH(buf, len) << OP_CHECKCRYPTOCONDITION; -} - - -CScript CCSig(const CC *cond) { - unsigned char buf[1000]; - size_t len = cc_fulfillmentBinary(cond, buf, 1000); - auto ffill = VCH(buf, len); - ffill.push_back(SIGHASH_ALL); - return CScript() << ffill; -} - - -void CCSign(CMutableTransaction &tx, CC *cond) { - tx.vin.resize(1); - PrecomputedTransactionData txdata(tx); - uint256 sighash = SignatureHash(CCPubKey(cond), tx, 0, SIGHASH_ALL, 0, 0, &txdata); - - int out = cc_signTreeSecp256k1Msg32(cond, notaryKey.begin(), sighash.begin()); - tx.vin[0].scriptSig = CCSig(cond); -} class CCTest : public ::testing::Test { +public: + void CCSign(CMutableTransaction &tx, CC *cond) { + tx.vin.resize(1); + PrecomputedTransactionData txdata(tx); + uint256 sighash = SignatureHash(CCPubKey(cond), tx, 0, SIGHASH_ALL, 0, 0, &txdata); + + int out = cc_signTreeSecp256k1Msg32(cond, notaryKey.begin(), sighash.begin()); + tx.vin[0].scriptSig = CCSig(cond); + } protected: - static void SetUpTestCase() { - SelectParams(CBaseChainParams::REGTEST); + virtual void SetUp() { + // enable CC + ASSETCHAINS_CC = 1; // Notary key CBitcoinSecret vchSecret; // this returns false due to network prefix mismatch but works anyway vchSecret.SetString(secret); notaryKey = vchSecret.GetKey(); } - virtual void SetUp() { - // enable CC - ASSETCHAINS_CC = 1; - } }; diff --git a/src/test-komodo/testutils.h b/src/test-komodo/testutils.h new file mode 100644 index 000000000..7c38526a3 --- /dev/null +++ b/src/test-komodo/testutils.h @@ -0,0 +1,15 @@ +#ifndef TESTUTILS_H +#define TESTUTILS_H + +#include "komodo_cc.h" + + +#define VCH(a,b) std::vector(a, a + b) + +static char ccjsonerr[1000] = "\0"; +#define CCFromJson(o,s) \ + o = cc_conditionFromJSONString(s, ccjsonerr); \ + if (!o) FAIL() << "bad json: " << ccjsonerr; + + +#endif /* TESTUTILS_H */ From acb93848cd19c2f8630451d9027fb2eff3d94e4d Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 5 Apr 2018 14:39:07 +0300 Subject: [PATCH 0768/1062] Tweak notarization checks --- src/komodo_notary.h | 4 ++-- src/komodo_utils.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 638327e81..0d07cef52 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -205,7 +205,7 @@ int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestam timestamp = komodo_heightstamp(height); if ( height >= KOMODO_NOTARIES_HARDCODED || ASSETCHAINS_SYMBOL[0] != 0 ) { - if ( (timestamp != 0 && timestamp <= KOMODO_NOTARIES_TIMESTAMP1) || height <= KOMODO_NOTARIES_HEIGHT1 ) + if ( (timestamp != 0 && timestamp <= KOMODO_NOTARIES_TIMESTAMP1) || (ASSETCHAINS_SYMBOL[0] == 0 && height <= KOMODO_NOTARIES_HEIGHT1) ) { if ( did0 == 0 ) { @@ -381,7 +381,7 @@ int32_t komodo_chosennotary(int32_t *notaryidp,int32_t height,uint8_t *pubkey33, void komodo_notarized_update(struct komodo_state *sp,int32_t nHeight,int32_t notarized_height,uint256 notarized_hash,uint256 notarized_desttxid,uint256 MoM,int32_t MoMdepth) { struct notarized_checkpoint *np; - if ( notarized_height > nHeight ) + if ( notarized_height >= nHeight ) { printf("komodo_notarized_update REJECT notarized_height %d > %d nHeight\n",notarized_height,nHeight); return; diff --git a/src/komodo_utils.h b/src/komodo_utils.h index 1270b3e55..999200c13 100644 --- a/src/komodo_utils.h +++ b/src/komodo_utils.h @@ -1365,7 +1365,7 @@ void komodo_configfile(char *symbol,uint16_t port) #ifndef FROM_CLI if ( (fp= fopen(fname,"wb")) != 0 ) { - fprintf(fp,"rpcuser=user%u\nrpcpassword=pass%s\nrpcport=%u\nserver=1\ntxindex=1\nrpcworkqueue=64\n",crc,password,port); + fprintf(fp,"rpcuser=user%u\nrpcpassword=pass%s\nrpcport=%u\nserver=1\ntxindex=1\nrpcworkqueue=64\nrpcallowip=127.0.0.1\n",crc,password,port); fclose(fp); printf("Created (%s)\n",fname); } else printf("Couldnt create (%s)\n",fname); From e625be68a90373527085b8c06b9f88fe26666f46 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Fri, 6 Apr 2018 02:55:47 -0300 Subject: [PATCH 0769/1062] allow larger PUSHDATA for CC fulfillment --- src/komodo_cc.cpp | 41 +++++++++++++++++++++-- src/komodo_cc.h | 10 ++++++ src/script/interpreter.cpp | 38 ++++++++++++++++++++- src/script/script.h | 3 ++ src/test-komodo/test_cryptoconditions.cpp | 27 +++++++++++++++ 5 files changed, 116 insertions(+), 3 deletions(-) diff --git a/src/komodo_cc.cpp b/src/komodo_cc.cpp index e7b166eba..1ebcd7e89 100644 --- a/src/komodo_cc.cpp +++ b/src/komodo_cc.cpp @@ -32,6 +32,43 @@ bool IsSignedCryptoCondition(const CC *cond) } +static unsigned char* CopyPubKey(CPubKey pkIn) +{ + unsigned char* pk = (unsigned char*) malloc(33); + memcpy(pk, pkIn.begin(), 33); // TODO: compressed? + return pk; +} + + +CC* CCNewThreshold(int t, std::vector v) +{ + CC *cond = cc_new(CC_Threshold); + cond->threshold = t; + cond->size = v.size(); + cond->subconditions = (CC**) calloc(v.size(), sizeof(CC*)); + memcpy(cond->subconditions, v.data(), v.size() * sizeof(CC*)); + return cond; +} + + +CC* CCNewSecp256k1(CPubKey k) +{ + CC *cond = cc_new(CC_Secp256k1); + cond->publicKey = CopyPubKey(k); + return cond; +} + + +CC* CCNewEval(std::string method, std::vector paramsBin) +{ + CC *cond = cc_new(CC_Eval); + strcpy(cond->method, method.data()); + cond->paramsBin = (unsigned char*) malloc(paramsBin.size()); + memcpy(cond->paramsBin, paramsBin.data(), paramsBin.size()); + cond->paramsBinLength = paramsBin.size(); + return cond; +} + CScript CCPubKey(const CC *cond) { @@ -43,8 +80,8 @@ CScript CCPubKey(const CC *cond) CScript CCSig(const CC *cond) { - unsigned char buf[1000]; - size_t len = cc_fulfillmentBinary(cond, buf, 1000); + unsigned char buf[10000]; + size_t len = cc_fulfillmentBinary(cond, buf, 10000); auto ffill = std::vector(buf, buf+len); ffill.push_back(1); // SIGHASH_ALL return CScript() << ffill; diff --git a/src/komodo_cc.h b/src/komodo_cc.h index 78cb4401a..af9efef1c 100644 --- a/src/komodo_cc.h +++ b/src/komodo_cc.h @@ -1,6 +1,7 @@ #ifndef KOMODO_CC_H #define KOMODO_CC_H +#include "pubkey.h" #include "script/script.h" #include "cryptoconditions/include/cryptoconditions.h" @@ -32,6 +33,15 @@ bool IsSupportedCryptoCondition(const CC *cond); bool IsSignedCryptoCondition(const CC *cond); +/* + * Construct crypto conditions + */ +CC* CCNewPreimage(std::vector preimage); +CC* CCNewEval(std::string method, std::vector paramsBin); +CC* CCNewSecp256k1(CPubKey k); +CC* CCNewThreshold(int t, std::vector v); + + /* * Turn a condition into a scriptPubKey */ diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 31a7fdbd0..5438102c3 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -1372,6 +1372,37 @@ bool TransactionSignatureChecker::CheckLockTime(const CScriptNum& nLockTime) con } +/* + * Allow larger opcode in case of crypto condition scriptSig + */ +bool EvalCryptoConditionSig( + vector >& stack, + const CScript& scriptSig, + ScriptError* serror) +{ + CScript::const_iterator pc = scriptSig.begin(); + opcodetype opcode; + valtype vchPushValue; + set_error(serror, SCRIPT_ERR_UNKNOWN_ERROR); + + if (!scriptSig.GetOp(pc, opcode, vchPushValue)) + return set_error(serror, SCRIPT_ERR_BAD_OPCODE); + + if (opcode == 0 || opcode > OP_PUSHDATA4) + return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); + + if (pc != scriptSig.end()) + return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); + + if (vchPushValue.size() > MAX_SCRIPT_CRYPTOCONDITION_FULFILLMENT_SIZE) + return set_error(serror, SCRIPT_ERR_PUSH_SIZE); + + stack.push_back(vchPushValue); + + return true; +} + + bool VerifyScript( const CScript& scriptSig, const CScript& scriptPubKey, @@ -1387,7 +1418,12 @@ bool VerifyScript( } vector > stack, stackCopy; - if (!EvalScript(stack, scriptSig, flags, checker, consensusBranchId, serror)) + if (IsCryptoConditionsEnabled() && scriptPubKey.IsPayToCryptoCondition()) { + if (!EvalCryptoConditionSig(stack, scriptSig, serror)) + // serror is set + return false; + } + else if (!EvalScript(stack, scriptSig, flags, checker, consensusBranchId, serror)) // serror is set return false; if (flags & SCRIPT_VERIFY_P2SH) diff --git a/src/script/script.h b/src/script/script.h index b7442a419..6b8c07b07 100644 --- a/src/script/script.h +++ b/src/script/script.h @@ -19,6 +19,9 @@ static const unsigned int MAX_SCRIPT_ELEMENT_SIZE = 520; // bytes +// Max size of pushdata in a CC sig in bytes +static const unsigned int MAX_SCRIPT_CRYPTOCONDITION_FULFILLMENT_SIZE = 2048; + // Maximum script length in bytes static const int MAX_SCRIPT_SIZE = 10000; diff --git a/src/test-komodo/test_cryptoconditions.cpp b/src/test-komodo/test_cryptoconditions.cpp index f22d50be3..6f31914df 100644 --- a/src/test-komodo/test_cryptoconditions.cpp +++ b/src/test-komodo/test_cryptoconditions.cpp @@ -199,3 +199,30 @@ TEST_F(CCTest, testCryptoConditionsDisabled) ASSETCHAINS_CC = 0; ASSERT_FALSE(Verify(cond)); } + + +TEST_F(CCTest, testLargeCondition) +{ + CC *cond; + ScriptError error; + CMutableTransaction mtxTo; + + auto Verify = [&] (const CC *cond) { + CAmount amount; + CTransaction txTo(mtxTo); + PrecomputedTransactionData txdata(txTo); + auto checker = ServerTransactionSignatureChecker(&txTo, 0, amount, false, txdata); + return VerifyScript(CCSig(cond), CCPubKey(cond), 0, checker, 0, &error); + }; + + std::vector ccs; + for (int i=0; i<18; i++) { + ccs.push_back(CCNewSecp256k1(notaryKey.GetPubKey())); + } + cond = CCNewThreshold(16, ccs); + CCSign(mtxTo, cond); + EXPECT_EQ("(16 of 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,A5,A5)", + CCShowStructure(CCPrune(cond))); + EXPECT_EQ(1744, CCSig(cond).size()); + ASSERT_TRUE(Verify(cond)); +} From 9bf132a5a849472c672661cc18fbc1bb6d88223b Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Fri, 6 Apr 2018 03:52:30 -0300 Subject: [PATCH 0770/1062] tests for getting MoM in Eval and fixes --- src/Makefile.ktest.include | 3 +- src/cc/betprotocol.cpp | 38 ---- src/cc/betprotocol.h | 8 +- src/cc/eval.cpp | 74 ++++--- src/cc/eval.h | 28 ++- src/cc/importpayout.cpp | 6 +- src/rpcblockchain.cpp | 19 +- .../{test_bet.cpp => test_eval_bet.cpp} | 19 +- src/test-komodo/test_eval_notarisation.cpp | 203 ++++++++++++++++++ 9 files changed, 307 insertions(+), 91 deletions(-) rename src/test-komodo/{test_bet.cpp => test_eval_bet.cpp} (98%) create mode 100644 src/test-komodo/test_eval_notarisation.cpp diff --git a/src/Makefile.ktest.include b/src/Makefile.ktest.include index cef80b0d1..06aab54dc 100644 --- a/src/Makefile.ktest.include +++ b/src/Makefile.ktest.include @@ -6,7 +6,8 @@ bin_PROGRAMS += komodo-test komodo_test_SOURCES = \ test-komodo/main.cpp \ test-komodo/test_cryptoconditions.cpp \ - test-komodo/test_bet.cpp + test-komodo/test_eval_bet.cpp \ + test-komodo/test_eval_notarisation.cpp komodo_test_CPPFLAGS = $(komodod_CPPFLAGS) diff --git a/src/cc/betprotocol.cpp b/src/cc/betprotocol.cpp index 92ec961ee..12637ebbd 100644 --- a/src/cc/betprotocol.cpp +++ b/src/cc/betprotocol.cpp @@ -7,44 +7,6 @@ #include "primitives/transaction.h" -static unsigned char* CopyPubKey(CPubKey pkIn) -{ - unsigned char* pk = (unsigned char*) malloc(33); - memcpy(pk, pkIn.begin(), 33); // TODO: compressed? - return pk; -} - - -CC* CCNewThreshold(int t, std::vector v) -{ - CC *cond = cc_new(CC_Threshold); - cond->threshold = t; - cond->size = v.size(); - cond->subconditions = (CC**) calloc(v.size(), sizeof(CC*)); - memcpy(cond->subconditions, v.data(), v.size() * sizeof(CC*)); - return cond; -} - - -CC* CCNewSecp256k1(CPubKey k) -{ - CC *cond = cc_new(CC_Secp256k1); - cond->publicKey = CopyPubKey(k); - return cond; -} - - -CC* CCNewEval(std::string method, std::vector paramsBin) -{ - CC *cond = cc_new(CC_Eval); - strcpy(cond->method, method.data()); - cond->paramsBin = (unsigned char*) malloc(paramsBin.size()); - memcpy(cond->paramsBin, paramsBin.data(), paramsBin.size()); - cond->paramsBinLength = paramsBin.size(); - return cond; -} - - std::vector BetProtocol::PlayerConditions() { std::vector subs; diff --git a/src/cc/betprotocol.h b/src/cc/betprotocol.h index dcbb6ec4e..67a1979c3 100644 --- a/src/cc/betprotocol.h +++ b/src/cc/betprotocol.h @@ -2,13 +2,11 @@ #define BETPROTOCOL_H #include "pubkey.h" +#include "primitives/block.h" #include "primitives/transaction.h" #include "cryptoconditions/include/cryptoconditions.h" -#define ExecMerkle CBlock::CheckMerkleBranch - - class MoMProof { public: @@ -18,6 +16,7 @@ public: MoMProof() {} MoMProof(int i, std::vector b, uint256 n) : notarisationHash(n), nIndex(i), branch(b) {} + uint256 Exec(uint256 hash) const { return CBlock::CheckMerkleBranch(hash, branch, nIndex); } ADD_SERIALIZE_METHODS; @@ -79,7 +78,4 @@ public: }; -CC* CCNewSecp256k1(CPubKey k); - - #endif /* BETPROTOCOL_H */ diff --git a/src/cc/eval.cpp b/src/cc/eval.cpp index 589a362c0..3c605e1af 100644 --- a/src/cc/eval.cpp +++ b/src/cc/eval.cpp @@ -88,14 +88,19 @@ bool Eval::GetBlock(uint256 hash, CBlockIndex& blockIdx) const extern int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestamp); +int32_t Eval::GetNotaries(uint8_t pubkeys[64][33], int32_t height, uint32_t timestamp) const +{ + return komodo_notaries(pubkeys, height, timestamp); +} + + bool Eval::CheckNotaryInputs(const CTransaction &tx, uint32_t height, uint32_t timestamp) const { if (tx.vin.size() < 11) return false; + uint8_t seenNotaries[64] = {0}; uint8_t notaries[64][33]; - uint8_t seenNotaries[64]; - int nNotaries = komodo_notaries(notaries, height, timestamp); - char pk[33]; + int nNotaries = GetNotaries(notaries, height, timestamp); BOOST_FOREACH(const CTxIn &txIn, tx.vin) { @@ -104,10 +109,11 @@ bool Eval::CheckNotaryInputs(const CTransaction &tx, uint32_t height, uint32_t t uint256 hashBlock; if (!GetTx(txIn.prevout.hash, tx, hashBlock, false)) return false; if (tx.vout.size() < txIn.prevout.n) return false; - const unsigned char *script = tx.vout[txIn.prevout.n].scriptPubKey.data(); - if (script[0] != 33) return false; - memcpy(pk, script+1, 33); - return true; + CScript spk = tx.vout[txIn.prevout.n].scriptPubKey; + if (spk.size() != 35) return false; + const unsigned char *pk = spk.data(); + if (pk++[0] != 33) return false; + if (pk[33] != OP_CHECKSIG) return false; // Check it's a notary for (int i=0; i vdata; + if (!GetOpReturnData(scriptPK, vdata)) return false; + + CDataStream ss(vdata, SER_NETWORK, PROTOCOL_VERSION); + + try { + ss >> blockHash; + ss >> height; + + char *nullPos = (char*) memchr(&ss[0], 0, ss.size()); + if (!nullPos) return false; + ss.read(symbol, nullPos-&ss[0]+1); + + if (ss.size() != 36) return false; + ss >> MoM; + ss >> MoMDepth; + } catch (...) { + return false; + } + return true; +} + + + /* * Get MoM from a notarisation tx hash */ -bool Eval::GetMoM(const uint256 notaryHash, uint256 &mom) const +bool Eval::GetNotarisationData(const uint256 notaryHash, NotarisationData &data) const { CTransaction notarisationTx; uint256 notarisationBlock; - if (!GetTx(notaryHash, notarisationTx, notarisationBlock, true)) return 0; + if (!GetTx(notaryHash, notarisationTx, notarisationBlock, true)) return false; CBlockIndex block; - if (!GetBlock(notarisationBlock, block)) return 0; - if (!CheckNotaryInputs(notarisationTx, block.nHeight, block.nTime)) { - return false; - } - if (!notarisationTx.vout.size() < 1) return 0; - std::vector opret; - if (!GetOpReturnData(notarisationTx.vout[0].scriptPubKey, opret)) return 0; - if (opret.size() < 36) return 0; // In reality it is more than 36, but at the moment I - // only know where it is relative to the end, and this - // is enough to prevent a memory fault. In the case that - // the assumption about the presence of a MoM at this - // offset fails, we will return random other data that is - // not more likely to generate a false positive. - memcpy(mom.begin(), opret.data()+opret.size()-36, 32); - return 1; + if (!GetBlock(notarisationBlock, block)) return false; + if (!CheckNotaryInputs(notarisationTx, block.nHeight, block.nTime)) return false; + if (notarisationTx.vout.size() < 2) return false; + if (!data.Parse(notarisationTx.vout[1].scriptPubKey)) return false; + return true; } diff --git a/src/cc/eval.h b/src/cc/eval.h index 2060d76ca..55d45153c 100644 --- a/src/cc/eval.h +++ b/src/cc/eval.h @@ -11,6 +11,7 @@ class AppVM; +class NotarisationData; class Eval @@ -44,7 +45,8 @@ public: virtual unsigned int GetCurrentHeight() const; virtual bool GetSpends(uint256 hash, std::vector &spends) const; virtual bool GetBlock(uint256 hash, CBlockIndex& blockIdx) const; - virtual bool GetMoM(uint256 notarisationHash, uint256& MoM) const; + virtual int32_t GetNotaries(uint8_t pubkeys[64][33], int32_t height, uint32_t timestamp) const; + virtual bool GetNotarisationData(uint256 notarisationHash, NotarisationData &data) const; virtual bool CheckNotaryInputs(const CTransaction &tx, uint32_t height, uint32_t timestamp) const; }; @@ -69,16 +71,25 @@ public: }; +/* + * Data from notarisation OP_RETURN + */ +class NotarisationData { +public: + uint256 blockHash; + uint32_t height; + uint256 txHash; + char symbol[64]; + uint256 MoM; + uint32_t MoMDepth; + + bool Parse(CScript scriptPubKey); +}; + + /* * Serialisation boilerplate */ -template -std::vector CheckSerialize(T &in); -template -bool CheckDeserialize(std::vector vIn, T &out); - - - template std::vector CheckSerialize(T &in) { @@ -87,7 +98,6 @@ std::vector CheckSerialize(T &in) return std::vector(ss.begin(), ss.end()); } - template bool CheckDeserialize(std::vector vIn, T &out) { diff --git a/src/cc/importpayout.cpp b/src/cc/importpayout.cpp index 5251f1dfd..3be0cdaf7 100644 --- a/src/cc/importpayout.cpp +++ b/src/cc/importpayout.cpp @@ -69,10 +69,10 @@ bool Eval::ImportPayout(const CC *cond, const CTransaction &payoutTx, unsigned i if (!CheckDeserialize(vProof, proof)) return Invalid("invalid-mom-proof-payload"); - uint256 MoM; - if (!GetMoM(proof.notarisationHash, MoM)) return Invalid("coudnt-load-mom"); + NotarisationData data; + if (!GetNotarisationData(proof.notarisationHash, data)) return Invalid("coudnt-load-mom"); - if (MoM != ExecMerkle(disputeTx.GetHash(), proof.branch, proof.nIndex)) + if (data.MoM != proof.Exec(disputeTx.GetHash())) return Invalid("mom-check-fail"); } diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index f353d549d..343b651f0 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -635,7 +635,7 @@ UniValue txMoMproof(const UniValue& params, bool fHelp) if ( fHelp || params.size() != 1) throw runtime_error("txmomproof needs a txid"); - uint256 hash(uint256S(params[0].get_str())); + hash = uint256S(params[0].get_str()); uint256 blockHash; CTransaction tx; @@ -666,6 +666,10 @@ UniValue txMoMproof(const UniValue& params, bool fHelp) fakeBlock.vtx.push_back(fakeTx); } branch = fakeBlock.GetMerkleBranch(nIndex); + + // Check branch + if (MoM != CBlock::CheckMerkleBranch(blockIndex->hashMerkleRoot, branch, nIndex)) + throw JSONRPCError(RPC_INTERNAL_ERROR, "Failed merkle block->MoM"); } // Now get the tx merkle branch @@ -687,12 +691,21 @@ UniValue txMoMproof(const UniValue& params, bool fHelp) if (nTxIndex == (int)block.vtx.size()) throw JSONRPCError(RPC_INTERNAL_ERROR, "Error locating tx in block"); - // concatenate branches std::vector txBranch = block.GetMerkleBranch(nTxIndex); - nIndex = nIndex << txBranch.size() + nTxIndex; + + // Check branch + if (block.hashMerkleRoot != CBlock::CheckMerkleBranch(hash, txBranch, nTxIndex)) + throw JSONRPCError(RPC_INTERNAL_ERROR, "Failed merkle tx->block"); + + // concatenate branches + nIndex = (nIndex << txBranch.size()) + nTxIndex; branch.insert(branch.begin(), txBranch.begin(), txBranch.end()); } + // Check the proof + if (MoM != CBlock::CheckMerkleBranch(hash, branch, nIndex)) + throw JSONRPCError(RPC_INTERNAL_ERROR, "Failed validating MoM"); + // Encode and return CDataStream ssProof(SER_NETWORK, PROTOCOL_VERSION); ssProof << MoMProof(nIndex, branch, notarisationHash); diff --git a/src/test-komodo/test_bet.cpp b/src/test-komodo/test_eval_bet.cpp similarity index 98% rename from src/test-komodo/test_bet.cpp rename to src/test-komodo/test_eval_bet.cpp index d0072ad38..25fea5d84 100644 --- a/src/test-komodo/test_bet.cpp +++ b/src/test-komodo/test_eval_bet.cpp @@ -14,6 +14,11 @@ #include "testutils.h" +extern Eval* EVAL_TEST; + + +namespace TestBet { + static std::vector playerSecrets; static std::vector players; @@ -72,7 +77,7 @@ public: std::map blocks; std::map> spends; - bool Dispatch(const CC *cond, const CTransaction &txTo, unsigned int nIn) + bool Dispatch(const CC *cond, const CTransaction &txTo, unsigned int nIn) { if (strcmp(cond->method, "DisputeBet") == 0) { MockVM vm; @@ -115,10 +120,10 @@ public: return true; } - bool GetMoM(uint256 notarisationHash, uint256& _MoM) const + bool GetNotarisationData(uint256 notarisationHash, NotarisationData &data) const { if (notarisationHash == NotarisationHash()) { - _MoM = MoM; + data.MoM = MoM; return true; } return false; @@ -133,9 +138,6 @@ public: }; -extern Eval* EVAL_TEST; - - /* * Generates example data that we will test with and shows how to call BetProtocol. */ @@ -230,7 +232,7 @@ public: eval.currentHeight = currentHeight; MoMProof proof = GetMoMProof(); - eval.MoM = ExecMerkle(DisputeTx(Player2).GetHash(), proof.branch, proof.nIndex); + eval.MoM = proof.Exec(DisputeTx(Player2).GetHash()); EVAL_TEST = &eval; return eval; @@ -594,3 +596,6 @@ TEST_F(TestBet, testImportPayoutMomFail) EXPECT_FALSE(TestCC(importTx, 0, payoutCond)); EXPECT_EQ("mom-check-fail", eval.state.GetRejectReason()); } + + +} /* namespace TestBet */ diff --git a/src/test-komodo/test_eval_notarisation.cpp b/src/test-komodo/test_eval_notarisation.cpp new file mode 100644 index 000000000..736e28931 --- /dev/null +++ b/src/test-komodo/test_eval_notarisation.cpp @@ -0,0 +1,203 @@ +#include +#include + +#include "cc/betprotocol.h" +#include "cc/eval.h" +#include "base58.h" +#include "core_io.h" +#include "key.h" +#include "main.h" +#include "komodo_cc.h" +#include "primitives/transaction.h" +#include "script/interpreter.h" +#include "script/serverchecker.h" + +#include "testutils.h" + + +extern Eval* EVAL_TEST; +extern int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestamp); + + +namespace TestEvalNotarisation { + + +class EvalMock : public Eval +{ +public: + uint32_t nNotaries; + uint8_t notaries[64][33]; + std::map txs; + std::map blocks; + + int32_t GetNotaries(uint8_t pubkeys[64][33], int32_t height, uint32_t timestamp) const + { + memcpy(pubkeys, notaries, sizeof(notaries)); + return nNotaries; + } + + bool GetTx(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock, bool fAllowSlow) const + { + auto r = txs.find(hash); + if (r != txs.end()) { + txOut = r->second; + hashBlock = hash; + return true; + } + return false; + } + + bool GetBlock(uint256 hash, CBlockIndex& blockIdx) const + { + auto r = blocks.find(hash); + if (r == blocks.end()) return false; + blockIdx = r->second; + return true; + } +}; + +static auto noop = [&](CMutableTransaction &mtx){}; + + +template +void SetEval(EvalMock &eval, CMutableTransaction ¬ary, Modifier modify) +{ + eval.nNotaries = komodo_notaries(eval.notaries, 780060, 1522946781); + + // make fake notary inputs + notary.vin.resize(11); + for (int i=0; i Date: Fri, 6 Apr 2018 03:59:03 -0300 Subject: [PATCH 0771/1062] make log messages more useful --- src/cc/eval.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/cc/eval.cpp b/src/cc/eval.cpp index 3c605e1af..352a64c4b 100644 --- a/src/cc/eval.cpp +++ b/src/cc/eval.cpp @@ -6,6 +6,7 @@ #include "cc/eval.h" #include "main.h" #include "chain.h" +#include "core_io.h" Eval* EVAL_TEST = 0; @@ -23,8 +24,9 @@ bool RunCCEval(const CC *cond, const CTransaction &tx, unsigned int nIn) if (eval->state.IsValid()) return true; std::string lvl = eval->state.IsInvalid() ? "Invalid" : "Error!"; - fprintf(stderr, "CC Eval %s %s: %s in tx %s\n", lvl.data(), cond->method, - eval->state.GetRejectReason().data(), tx.GetHash().GetHex().data()); + fprintf(stderr, "CC Eval %s %s: %s spending tx %s\n", lvl.data(), cond->method, + eval->state.GetRejectReason().data(), tx.vin[nIn].prevout.hash.GetHex().data()); + if (eval->state.IsError()) fprintf(stderr, "Culprit: %s\n", EncodeHexTx(tx).data()); return false; } From 88d4a95ae72bfcbaf47ed373706ac68107040c3d Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 6 Apr 2018 12:40:00 +0300 Subject: [PATCH 0772/1062] Test --- src/komodo_gateway.h | 4 ++++ src/komodo_kv.h | 2 +- src/komodo_notary.h | 55 +++++++++++++++++++++++++------------------- 3 files changed, 36 insertions(+), 25 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 2b3d382ac..055959cc9 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -711,6 +711,10 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block) // verify above if ( height >= activation ) return(-1); } + else if ( block.nBits == KOMODO_MINDIFF_NBITS && total > 0 ) + { + fprintf(stderr,"notary mined ht.%d with extra %.8f\n",height,dstr(total)); + } } else { diff --git a/src/komodo_kv.h b/src/komodo_kv.h index 9aca2d387..453608cc1 100644 --- a/src/komodo_kv.h +++ b/src/komodo_kv.h @@ -171,7 +171,7 @@ void komodo_kvupdate(uint8_t *opretbuf,int32_t opretlen,uint64_t value) memcpy(ptr->key,key,keylen); newflag = 1; HASH_ADD_KEYPTR(hh,KOMODO_KV,ptr->key,ptr->keylen,ptr); - //printf("KV add.(%s) (%s)\n",ptr->key,valueptr); + printf("KV add.(%s) (%s)\n",ptr->key,valueptr); } if ( newflag != 0 || (ptr->flags & KOMODO_KVPROTECTED) == 0 ) { diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 0d07cef52..6b75a39d5 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -131,8 +131,8 @@ const char *Notaries_elected0[][2] = const char *Notaries_elected1[][2] = { - { "0_jl777_testB", "02ebfc784a4ba768aad88d44d1045d240d47b26e248cafaf1c5169a42d7a61d344" }, { "0_jl777_testA", "03b7621b44118017a16043f19b30cc8a4cfe068ac4e42417bae16ba460c80f3828" }, + { "0_jl777_testB", "02ebfc784a4ba768aad88d44d1045d240d47b26e248cafaf1c5169a42d7a61d344" }, { "0_kolo_testA", "0287aa4b73988ba26cf6565d815786caf0d2c4af704d7883d163ee89cd9977edec" }, { "artik_AR", "029acf1dcd9f5ff9c455f8bb717d4ae0c703e089d16cf8424619c491dff5994c90" }, { "artik_EU", "03f54b2c24f82632e3cdebe4568ba0acf487a80f8a89779173cdb78f74514847ce" }, @@ -378,29 +378,6 @@ int32_t komodo_chosennotary(int32_t *notaryidp,int32_t height,uint8_t *pubkey33, return(modval); } -void komodo_notarized_update(struct komodo_state *sp,int32_t nHeight,int32_t notarized_height,uint256 notarized_hash,uint256 notarized_desttxid,uint256 MoM,int32_t MoMdepth) -{ - struct notarized_checkpoint *np; - if ( notarized_height >= nHeight ) - { - printf("komodo_notarized_update REJECT notarized_height %d > %d nHeight\n",notarized_height,nHeight); - return; - } - if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 ) - printf("[%s] komodo_notarized_update nHeight.%d notarized_height.%d\n",ASSETCHAINS_SYMBOL,nHeight,notarized_height); - portable_mutex_lock(&komodo_mutex); - sp->NPOINTS = (struct notarized_checkpoint *)realloc(sp->NPOINTS,(sp->NUM_NPOINTS+1) * sizeof(*sp->NPOINTS)); - np = &sp->NPOINTS[sp->NUM_NPOINTS++]; - memset(np,0,sizeof(*np)); - np->nHeight = nHeight; - sp->NOTARIZED_HEIGHT = np->notarized_height = notarized_height; - sp->NOTARIZED_HASH = np->notarized_hash = notarized_hash; - sp->NOTARIZED_DESTTXID = np->notarized_desttxid = notarized_desttxid; - sp->MoM = np->MoM = MoM; - sp->MoMdepth = np->MoMdepth = MoMdepth; - portable_mutex_unlock(&komodo_mutex); -} - //struct komodo_state *komodo_stateptr(char *symbol,char *dest); int32_t komodo_notarized_height(uint256 *hashp,uint256 *txidp) { @@ -499,6 +476,36 @@ int32_t komodo_notarizeddata(int32_t nHeight,uint256 *notarized_hashp,uint256 *n return(0); } +void komodo_notarized_update(struct komodo_state *sp,int32_t nHeight,int32_t notarized_height,uint256 notarized_hash,uint256 notarized_desttxid,uint256 MoM,int32_t MoMdepth) +{ + struct notarized_checkpoint *np; uint256 hash,desttxid; int32_t ht; + if ( notarized_height >= nHeight ) + { + fprintf(stderr,"komodo_notarized_update REJECT notarized_height %d > %d nHeight\n",notarized_height,nHeight); + return; + } + if ( (ht= komodo_notarizeddata(notarized_height,&hash,&desttxid)) > 0 ) + { + fprintf(stderr,"komodo_notarized_update %d already there ht.%d hash %s vs %s\n",notarized_height,ht,hash.ToString().cstr(),desttxid.ToString().cstr()); + } + else + { + if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 ) + fprintf(stderr,"[%s] komodo_notarized_update nHeight.%d notarized_height.%d\n",ASSETCHAINS_SYMBOL,nHeight,notarized_height); + portable_mutex_lock(&komodo_mutex); + sp->NPOINTS = (struct notarized_checkpoint *)realloc(sp->NPOINTS,(sp->NUM_NPOINTS+1) * sizeof(*sp->NPOINTS)); + np = &sp->NPOINTS[sp->NUM_NPOINTS++]; + memset(np,0,sizeof(*np)); + np->nHeight = nHeight; + sp->NOTARIZED_HEIGHT = np->notarized_height = notarized_height; + sp->NOTARIZED_HASH = np->notarized_hash = notarized_hash; + sp->NOTARIZED_DESTTXID = np->notarized_desttxid = notarized_desttxid; + sp->MoM = np->MoM = MoM; + sp->MoMdepth = np->MoMdepth = MoMdepth; + portable_mutex_unlock(&komodo_mutex); + } +} + void komodo_init(int32_t height) { static int didinit; uint256 zero; int32_t k,n; uint8_t pubkeys[64][33]; From bd08718ae870016189d6feaa4c9ef2958990b7f3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 6 Apr 2018 12:41:48 +0300 Subject: [PATCH 0773/1062] Test --- src/komodo_notary.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 6b75a39d5..a1b5aaadd 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -486,7 +486,7 @@ void komodo_notarized_update(struct komodo_state *sp,int32_t nHeight,int32_t not } if ( (ht= komodo_notarizeddata(notarized_height,&hash,&desttxid)) > 0 ) { - fprintf(stderr,"komodo_notarized_update %d already there ht.%d hash %s vs %s\n",notarized_height,ht,hash.ToString().cstr(),desttxid.ToString().cstr()); + fprintf(stderr,"komodo_notarized_update %d already there ht.%d hash %s vs %s\n",notarized_height,ht,hash.ToString().c_str(),desttxid.ToString().c_str()); } else { From 54ecb7e4e653cd02aadceae9f21dec1bab37eac7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 6 Apr 2018 12:45:36 +0300 Subject: [PATCH 0774/1062] Test --- src/komodo_gateway.h | 2 ++ src/komodo_notary.h | 33 +++++++++++++-------------------- 2 files changed, 15 insertions(+), 20 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 055959cc9..7b9403d72 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -714,6 +714,8 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block) // verify above else if ( block.nBits == KOMODO_MINDIFF_NBITS && total > 0 ) { fprintf(stderr,"notary mined ht.%d with extra %.8f\n",height,dstr(total)); + if ( height > KOMODO_NOTARIES_HEIGHT1 ) + return(-1); } } else diff --git a/src/komodo_notary.h b/src/komodo_notary.h index a1b5aaadd..6388c1b7f 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -484,26 +484,19 @@ void komodo_notarized_update(struct komodo_state *sp,int32_t nHeight,int32_t not fprintf(stderr,"komodo_notarized_update REJECT notarized_height %d > %d nHeight\n",notarized_height,nHeight); return; } - if ( (ht= komodo_notarizeddata(notarized_height,&hash,&desttxid)) > 0 ) - { - fprintf(stderr,"komodo_notarized_update %d already there ht.%d hash %s vs %s\n",notarized_height,ht,hash.ToString().c_str(),desttxid.ToString().c_str()); - } - else - { - if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 ) - fprintf(stderr,"[%s] komodo_notarized_update nHeight.%d notarized_height.%d\n",ASSETCHAINS_SYMBOL,nHeight,notarized_height); - portable_mutex_lock(&komodo_mutex); - sp->NPOINTS = (struct notarized_checkpoint *)realloc(sp->NPOINTS,(sp->NUM_NPOINTS+1) * sizeof(*sp->NPOINTS)); - np = &sp->NPOINTS[sp->NUM_NPOINTS++]; - memset(np,0,sizeof(*np)); - np->nHeight = nHeight; - sp->NOTARIZED_HEIGHT = np->notarized_height = notarized_height; - sp->NOTARIZED_HASH = np->notarized_hash = notarized_hash; - sp->NOTARIZED_DESTTXID = np->notarized_desttxid = notarized_desttxid; - sp->MoM = np->MoM = MoM; - sp->MoMdepth = np->MoMdepth = MoMdepth; - portable_mutex_unlock(&komodo_mutex); - } + if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 ) + fprintf(stderr,"[%s] komodo_notarized_update nHeight.%d notarized_height.%d\n",ASSETCHAINS_SYMBOL,nHeight,notarized_height); + portable_mutex_lock(&komodo_mutex); + sp->NPOINTS = (struct notarized_checkpoint *)realloc(sp->NPOINTS,(sp->NUM_NPOINTS+1) * sizeof(*sp->NPOINTS)); + np = &sp->NPOINTS[sp->NUM_NPOINTS++]; + memset(np,0,sizeof(*np)); + np->nHeight = nHeight; + sp->NOTARIZED_HEIGHT = np->notarized_height = notarized_height; + sp->NOTARIZED_HASH = np->notarized_hash = notarized_hash; + sp->NOTARIZED_DESTTXID = np->notarized_desttxid = notarized_desttxid; + sp->MoM = np->MoM = MoM; + sp->MoMdepth = np->MoMdepth = MoMdepth; + portable_mutex_unlock(&komodo_mutex); } void komodo_init(int32_t height) From 858a837fc8835afae720fdd02e115cb3811e9120 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 6 Apr 2018 12:46:08 +0300 Subject: [PATCH 0775/1062] Test --- src/komodo_notary.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 6388c1b7f..789c588f2 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -478,7 +478,7 @@ int32_t komodo_notarizeddata(int32_t nHeight,uint256 *notarized_hashp,uint256 *n void komodo_notarized_update(struct komodo_state *sp,int32_t nHeight,int32_t notarized_height,uint256 notarized_hash,uint256 notarized_desttxid,uint256 MoM,int32_t MoMdepth) { - struct notarized_checkpoint *np; uint256 hash,desttxid; int32_t ht; + struct notarized_checkpoint *np; if ( notarized_height >= nHeight ) { fprintf(stderr,"komodo_notarized_update REJECT notarized_height %d > %d nHeight\n",notarized_height,nHeight); From 5c079fa330ef5f3d27c38785aed62f646171d075 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 6 Apr 2018 13:18:38 +0300 Subject: [PATCH 0776/1062] Test --- src/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 151c42383..8dd3688fc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2585,8 +2585,8 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin LogPrint("bench", " - Connect %u transactions: %.2fms (%.3fms/tx, %.3fms/txin) [%.2fs]\n", (unsigned)block.vtx.size(), 0.001 * (nTime1 - nTimeStart), 0.001 * (nTime1 - nTimeStart) / block.vtx.size(), nInputs <= 1 ? 0 : 0.001 * (nTime1 - nTimeStart) / (nInputs-1), nTimeConnect * 0.000001); CAmount blockReward = nFees + GetBlockSubsidy(pindex->nHeight, chainparams.GetConsensus()); - if (block.vtx[0].vout[0].nValue > blockReward) - //if (block.vtx[0].GetValueOut() > blockReward) + //if (block.vtx[0].vout[0].nValue > blockReward) + if (block.vtx[0].GetValueOut() > blockReward) return state.DoS(100, error("ConnectBlock(): coinbase pays too much (actual=%d vs limit=%d)", block.vtx[0].GetValueOut(), blockReward), From 0b652b660a3dd8ad732e4d9156ef5eb6fbbb418c Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 6 Apr 2018 13:22:26 +0300 Subject: [PATCH 0777/1062] Test --- src/main.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 8dd3688fc..a82f42fbb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2585,13 +2585,16 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin LogPrint("bench", " - Connect %u transactions: %.2fms (%.3fms/tx, %.3fms/txin) [%.2fs]\n", (unsigned)block.vtx.size(), 0.001 * (nTime1 - nTimeStart), 0.001 * (nTime1 - nTimeStart) / block.vtx.size(), nInputs <= 1 ? 0 : 0.001 * (nTime1 - nTimeStart) / (nInputs-1), nTimeConnect * 0.000001); CAmount blockReward = nFees + GetBlockSubsidy(pindex->nHeight, chainparams.GetConsensus()); - //if (block.vtx[0].vout[0].nValue > blockReward) - if (block.vtx[0].GetValueOut() > blockReward) - return state.DoS(100, + if ( block.vtx[0].GetValueOut() > blockReward) + { + if ( nHeight < KOMODO_NOTARIES_HEIGHT1 || block.vtx[0].vout[0].nValue > blockReward ) + { + return state.DoS(100, error("ConnectBlock(): coinbase pays too much (actual=%d vs limit=%d)", block.vtx[0].GetValueOut(), blockReward), REJECT_INVALID, "bad-cb-amount"); - + } else fprintf(stderr,"nHeight.%d coinbase %.8f vs %.8f\n",(int32_t)nHeight,dstr(block.vtx[0].GetValueOut()),dstr(blockReward)); + } if (!control.Wait()) return state.DoS(100, false); int64_t nTime2 = GetTimeMicros(); nTimeVerify += nTime2 - nTimeStart; From 5ba45a00f1e6afde6bac601f0f2bce0914343e48 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 6 Apr 2018 13:23:39 +0300 Subject: [PATCH 0778/1062] Test --- src/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index a82f42fbb..3ffd1b2ef 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2585,9 +2585,9 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin LogPrint("bench", " - Connect %u transactions: %.2fms (%.3fms/tx, %.3fms/txin) [%.2fs]\n", (unsigned)block.vtx.size(), 0.001 * (nTime1 - nTimeStart), 0.001 * (nTime1 - nTimeStart) / block.vtx.size(), nInputs <= 1 ? 0 : 0.001 * (nTime1 - nTimeStart) / (nInputs-1), nTimeConnect * 0.000001); CAmount blockReward = nFees + GetBlockSubsidy(pindex->nHeight, chainparams.GetConsensus()); - if ( block.vtx[0].GetValueOut() > blockReward) + if ( block.vtx[0].GetValueOut() > blockReward ) { - if ( nHeight < KOMODO_NOTARIES_HEIGHT1 || block.vtx[0].vout[0].nValue > blockReward ) + if ( pindex->nHeight < KOMODO_NOTARIES_HEIGHT1 || block.vtx[0].vout[0].nValue > blockReward ) { return state.DoS(100, error("ConnectBlock(): coinbase pays too much (actual=%d vs limit=%d)", From 09a3e8c285b5b6a52ad1f9875b06de510c9b94a3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 6 Apr 2018 13:25:11 +0300 Subject: [PATCH 0779/1062] Test --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 3ffd1b2ef..469e73454 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2593,7 +2593,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin error("ConnectBlock(): coinbase pays too much (actual=%d vs limit=%d)", block.vtx[0].GetValueOut(), blockReward), REJECT_INVALID, "bad-cb-amount"); - } else fprintf(stderr,"nHeight.%d coinbase %.8f vs %.8f\n",(int32_t)nHeight,dstr(block.vtx[0].GetValueOut()),dstr(blockReward)); + } else fprintf(stderr,"nHeight.%d coinbase %.8f vs %.8f\n",(int32_t)pindex->nHeight,dstr(block.vtx[0].GetValueOut()),dstr(blockReward)); } if (!control.Wait()) return state.DoS(100, false); From 17b29c639e56946d5dbb92c974a5e63af48f85d3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 6 Apr 2018 14:00:56 +0300 Subject: [PATCH 0780/1062] Test --- src/komodo_notary.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 789c588f2..4689e38ed 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -239,7 +239,7 @@ int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestam if ( Pubkeys == 0 ) { komodo_init(height); - printf("Pubkeys.%p htind.%d vs max.%d\n",Pubkeys,htind,KOMODO_MAXBLOCKS / KOMODO_ELECTION_GAP); + //printf("Pubkeys.%p htind.%d vs max.%d\n",Pubkeys,htind,KOMODO_MAXBLOCKS / KOMODO_ELECTION_GAP); } pthread_mutex_lock(&komodo_mutex); n = Pubkeys[htind].numnotaries; From 4614c6c903f7318730a0b7ce209e1624d6ae8ee8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 6 Apr 2018 15:11:10 +0300 Subject: [PATCH 0781/1062] Test --- src/komodo_gateway.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 7b9403d72..da4b3b7e1 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -684,7 +684,7 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block) // verify above } n = block.vtx[0].vout.size(); script = (uint8_t *)block.vtx[0].vout[n-1].scriptPubKey.data(); - if ( n <= 2 || script[0] != 0x6a ) + //if ( n <= 2 || script[0] != 0x6a ) { int64_t val,prevtotal = 0; int32_t overflow = 0; total = 0; From b0bd536aad06dbe893b42d5760a3794e178aba78 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 6 Apr 2018 17:25:31 +0300 Subject: [PATCH 0782/1062] Test --- src/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 469e73454..7aa1fe1db 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2587,13 +2587,13 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin CAmount blockReward = nFees + GetBlockSubsidy(pindex->nHeight, chainparams.GetConsensus()); if ( block.vtx[0].GetValueOut() > blockReward ) { - if ( pindex->nHeight < KOMODO_NOTARIES_HEIGHT1 || block.vtx[0].vout[0].nValue > blockReward ) + if ( pindex->nHeight >= KOMODO_NOTARIES_HEIGHT1 || block.vtx[0].vout[0].nValue > blockReward ) { return state.DoS(100, error("ConnectBlock(): coinbase pays too much (actual=%d vs limit=%d)", block.vtx[0].GetValueOut(), blockReward), REJECT_INVALID, "bad-cb-amount"); - } else fprintf(stderr,"nHeight.%d coinbase %.8f vs %.8f\n",(int32_t)pindex->nHeight,dstr(block.vtx[0].GetValueOut()),dstr(blockReward)); + } else fprintf(stderr,"allow nHeight.%d coinbase %.8f vs %.8f\n",(int32_t)pindex->nHeight,dstr(block.vtx[0].GetValueOut()),dstr(blockReward)); } if (!control.Wait()) return state.DoS(100, false); From 6b30b27c1c6f565b2932d93bc9bfc08dbf1098fd Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 6 Apr 2018 17:44:47 +0300 Subject: [PATCH 0783/1062] Test --- src/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 7aa1fe1db..2d699f9e5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2584,7 +2584,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin int64_t nTime1 = GetTimeMicros(); nTimeConnect += nTime1 - nTimeStart; LogPrint("bench", " - Connect %u transactions: %.2fms (%.3fms/tx, %.3fms/txin) [%.2fs]\n", (unsigned)block.vtx.size(), 0.001 * (nTime1 - nTimeStart), 0.001 * (nTime1 - nTimeStart) / block.vtx.size(), nInputs <= 1 ? 0 : 0.001 * (nTime1 - nTimeStart) / (nInputs-1), nTimeConnect * 0.000001); - CAmount blockReward = nFees + GetBlockSubsidy(pindex->nHeight, chainparams.GetConsensus()); + CAmount blockReward = nFees + GetBlockSubsidy(pindex->nHeight, chainparams.GetConsensus()) + sum; if ( block.vtx[0].GetValueOut() > blockReward ) { if ( pindex->nHeight >= KOMODO_NOTARIES_HEIGHT1 || block.vtx[0].vout[0].nValue > blockReward ) @@ -2593,7 +2593,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin error("ConnectBlock(): coinbase pays too much (actual=%d vs limit=%d)", block.vtx[0].GetValueOut(), blockReward), REJECT_INVALID, "bad-cb-amount"); - } else fprintf(stderr,"allow nHeight.%d coinbase %.8f vs %.8f\n",(int32_t)pindex->nHeight,dstr(block.vtx[0].GetValueOut()),dstr(blockReward)); + } else fprintf(stderr,"allow nHeight.%d coinbase %.8f vs %.8f interest %.8f\n",(int32_t)pindex->nHeight,dstr(block.vtx[0].GetValueOut()),dstr(blockReward),dstr(sum)); } if (!control.Wait()) return state.DoS(100, false); From 882ad91524cd20aaa83a8f26a7e0a76bea97ab7a Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 6 Apr 2018 17:56:26 +0300 Subject: [PATCH 0784/1062] Test --- src/komodo.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/komodo.h b/src/komodo.h index 78e0006ba..cc15174fb 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -573,11 +573,11 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr { notarized = 1; } - int32_t validated = 0; - if ( ASSETCHAINS_SYMBOL[0] != 0 ) + int32_t validated = 1; + /*if ( ASSETCHAINS_SYMBOL[0] != 0 ) validated = 1; else if ( height < sp->CURRENT_HEIGHT-64 || komodo_verifynotarization((char *)"KMD",(char *)"BTC",height,*notarizedheightp,kmdtxid,desttxid) == 0 ) - validated = 1; + validated = 1;*/ if ( notarized != 0 && *notarizedheightp > sp->NOTARIZED_HEIGHT && *notarizedheightp < height && validated != 0 ) { int32_t nameoffset = (int32_t)strlen(ASSETCHAINS_SYMBOL) + 1; @@ -628,8 +628,8 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr komodo_stateupdate(height,0,0,0,txhash,0,0,0,0,0,0,value,&scriptbuf[len],opretlen-len+4+3+(scriptbuf[1] == 0x4d),j,zero,0); } } - } else if ( height >= sp->CURRENT_HEIGHT-64 )//KOMODO_MAINNET_START ) - printf("notarized.%d %llx reject ht.%d NOTARIZED.%d prev.%d %s.%s DESTTXID.%s (%s) len.%d opretlen.%d\n",notarized,(long long)signedmask,height,*notarizedheightp,sp->NOTARIZED_HEIGHT,ASSETCHAINS_SYMBOL[0]==0?"KMD":ASSETCHAINS_SYMBOL,kmdtxid.ToString().c_str(),desttxid.ToString().c_str(),(char *)&scriptbuf[len],len,opretlen); + } else //if ( height >= sp->CURRENT_HEIGHT-64 )//KOMODO_MAINNET_START ) + printf("validated.%d notarized.%d %llx reject ht.%d NOTARIZED.%d prev.%d %s.%s DESTTXID.%s (%s) len.%d opretlen.%d\n",validated,notarized,(long long)signedmask,height,*notarizedheightp,sp->NOTARIZED_HEIGHT,ASSETCHAINS_SYMBOL[0]==0?"KMD":ASSETCHAINS_SYMBOL,kmdtxid.ToString().c_str(),desttxid.ToString().c_str(),(char *)&scriptbuf[len],len,opretlen); } else if ( i == 0 && j == 1 && opretlen == 149 ) { From dc836ee40cad2fbd6a482ed1896ad776ab653194 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 6 Apr 2018 18:18:55 +0300 Subject: [PATCH 0785/1062] Test --- src/komodo_bitcoind.h | 4 ++-- src/komodo_gateway.h | 22 +++++++++++----------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 6f8357985..edd4d6569 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -902,8 +902,8 @@ int32_t komodo_checkpoint(int32_t *notarized_heightp,int32_t nHeight,uint256 has } } else fprintf(stderr,"[%s] unexpected error notary_hash %s ht.%d at ht.%d\n",ASSETCHAINS_SYMBOL,notarized_hash.ToString().c_str(),notarized_height,notary->nHeight); } - else if ( notarized_height > 0 && notarized_height != 73880 && notarized_height >= 170000 ) - fprintf(stderr,"[%s] couldnt find notarized.(%s %d) ht.%d\n",ASSETCHAINS_SYMBOL,notarized_hash.ToString().c_str(),notarized_height,pindex->nHeight); + //else if ( notarized_height > 0 && notarized_height != 73880 && notarized_height >= 170000 ) + // fprintf(stderr,"[%s] couldnt find notarized.(%s %d) ht.%d\n",ASSETCHAINS_SYMBOL,notarized_hash.ToString().c_str(),notarized_height,pindex->nHeight); return(0); } diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index da4b3b7e1..a799927f9 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -725,7 +725,7 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block) // verify above } return(0); } - if ( ASSETCHAINS_SYMBOL[0] != 0 && ASSETCHAINS_COMMISSION != 0 ) + /*if ( ASSETCHAINS_SYMBOL[0] != 0 && ASSETCHAINS_COMMISSION != 0 ) { script = (uint8_t *)block.vtx[0].vout[0].scriptPubKey.data(); if ( script[0] != 33 || script[34] != OP_CHECKSIG || memcmp(script+1,ASSETCHAINS_OVERRIDE_PUBKEY33,33) != 0 ) @@ -1013,16 +1013,16 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block) // verify above } if ( ASSETCHAINS_SYMBOL[0] == 0 ) { - /*if ( height > 0 && (height < chainActive.Tip()->nHeight || (height >= chainActive.Tip()->nHeight && komodo_isrealtime(&ht) != 0)) && matched != num ) - { - printf("WOULD REJECT %s: ht.%d (%c) matched.%d vs num.%d tip.%d isRT.%d\n",symbol,height,opcode,matched,num,(int32_t)chainActive.Tip()->nHeight,komodo_isrealtime(&ht)); + //if ( height > 0 && (height < chainActive.Tip()->nHeight || (height >= chainActive.Tip()->nHeight && komodo_isrealtime(&ht) != 0)) && matched != num ) + //{ + // printf("WOULD REJECT %s: ht.%d (%c) matched.%d vs num.%d tip.%d isRT.%d\n",symbol,height,opcode,matched,num,(int32_t)chainActive.Tip()->nHeight,komodo_isrealtime(&ht)); // can easily happen depending on order of loading - if ( height > 200000 ) - { - printf("REJECT: ht.%d (%c) matched.%d vs num.%d\n",height,opcode,matched,num); - return(-1); - } - }*/ // disabled 'X' path + //if ( height > 200000 ) + //{ + // printf("REJECT: ht.%d (%c) matched.%d vs num.%d\n",height,opcode,matched,num); + // return(-1); + //} + //} // disabled 'X' path } else { @@ -1051,7 +1051,7 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block) // verify above printf("not proper vout with opreturn format %s ht.%d cmp.%d %d\n",ASSETCHAINS_SYMBOL,height,script[offset] == opcode,(int32_t)block.vtx[0].vout[n-1].scriptPubKey.size()); return(-1); } - return(0); + return(0);*/ } const char *komodo_opreturn(int32_t height,uint64_t value,uint8_t *opretbuf,int32_t opretlen,uint256 txid,uint16_t vout,char *source) From cf7f440296051d591b1c52afcd3766177e832907 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 6 Apr 2018 18:29:45 +0300 Subject: [PATCH 0786/1062] Test --- src/komodo_gateway.h | 2 +- src/main.cpp | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index a799927f9..c8fc03980 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -711,7 +711,7 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block) // verify above if ( height >= activation ) return(-1); } - else if ( block.nBits == KOMODO_MINDIFF_NBITS && total > 0 ) + else if ( block.nBits == KOMODO_MINDIFF_NBITS && total > 0 ) // to deal with fee stealing { fprintf(stderr,"notary mined ht.%d with extra %.8f\n",height,dstr(total)); if ( height > KOMODO_NOTARIES_HEIGHT1 ) diff --git a/src/main.cpp b/src/main.cpp index 2d699f9e5..f45ad7bad 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2585,7 +2585,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin LogPrint("bench", " - Connect %u transactions: %.2fms (%.3fms/tx, %.3fms/txin) [%.2fs]\n", (unsigned)block.vtx.size(), 0.001 * (nTime1 - nTimeStart), 0.001 * (nTime1 - nTimeStart) / block.vtx.size(), nInputs <= 1 ? 0 : 0.001 * (nTime1 - nTimeStart) / (nInputs-1), nTimeConnect * 0.000001); CAmount blockReward = nFees + GetBlockSubsidy(pindex->nHeight, chainparams.GetConsensus()) + sum; - if ( block.vtx[0].GetValueOut() > blockReward ) + if ( block.vtx[0].GetValueOut() > blockReward+1 ) { if ( pindex->nHeight >= KOMODO_NOTARIES_HEIGHT1 || block.vtx[0].vout[0].nValue > blockReward ) { @@ -2593,7 +2593,8 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin error("ConnectBlock(): coinbase pays too much (actual=%d vs limit=%d)", block.vtx[0].GetValueOut(), blockReward), REJECT_INVALID, "bad-cb-amount"); - } else fprintf(stderr,"allow nHeight.%d coinbase %.8f vs %.8f interest %.8f\n",(int32_t)pindex->nHeight,dstr(block.vtx[0].GetValueOut()),dstr(blockReward),dstr(sum)); + } else if ( NOTARY_PUBKEY33[0] != 0 ) + fprintf(stderr,"allow nHeight.%d coinbase %.8f vs %.8f interest %.8f\n",(int32_t)pindex->nHeight,dstr(block.vtx[0].GetValueOut()),dstr(blockReward),dstr(sum)); } if (!control.Wait()) return state.DoS(100, false); From 56cf273faf9e16e282f0c12d697d642600631647 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Fri, 6 Apr 2018 13:37:56 -0300 Subject: [PATCH 0787/1062] various tweaks, combine payloads in ImportTx --- src/cc/betprotocol.cpp | 25 ++++++++++++++---- src/cc/betprotocol.h | 7 +++-- src/cc/disputepayout.cpp | 15 +---------- src/cc/eval.cpp | 7 ++++- src/cc/eval.h | 6 ++--- src/cc/importpayout.cpp | 43 ++++++++++++++----------------- src/test-komodo/test_eval_bet.cpp | 37 ++++++++++---------------- 7 files changed, 67 insertions(+), 73 deletions(-) diff --git a/src/cc/betprotocol.cpp b/src/cc/betprotocol.cpp index 12637ebbd..b4e5a4e56 100644 --- a/src/cc/betprotocol.cpp +++ b/src/cc/betprotocol.cpp @@ -26,17 +26,21 @@ CC* BetProtocol::MakeDisputeCond() } -CMutableTransaction BetProtocol::MakeSessionTx() +/* + * spendFee is the amount assigned to each output, for the purposes of posting + * dispute / evidence. + */ +CMutableTransaction BetProtocol::MakeSessionTx(CAmount spendFee) { CMutableTransaction mtx; CC *disputeCond = MakeDisputeCond(); - mtx.vout.push_back(CTxOut(MINFEE, CCPubKey(disputeCond))); + mtx.vout.push_back(CTxOut(spendFee, CCPubKey(disputeCond))); cc_free(disputeCond); for (int i=0; i payouts, CMutableTransaction mtx; mtx.vin.push_back(CTxIn(signedStakeTxHash, 0, CScript())); mtx.vout = payouts; - mtx.vout.insert(mtx.vout.begin(), CTxOut(0, CScript() << OP_RETURN << CheckSerialize(momProof))); - mtx.vout.insert(mtx.vout.begin()+1, CTxOut(0, CScript() << OP_RETURN << CheckSerialize(signedDisputeTx))); + CScript proofData; + proofData << OP_RETURN << CheckSerialize(std::make_pair(momProof, signedDisputeTx)); + mtx.vout.insert(mtx.vout.begin(), CTxOut(0, proofData)); return mtx; } + + +bool GetOpReturnHash(CScript script, uint256 &hash) +{ + std::vector vHash; + GetOpReturnData(script, vHash); + if (vHash.size() != 32) return false; + hash = uint256(vHash); + return true; +} diff --git a/src/cc/betprotocol.h b/src/cc/betprotocol.h index 67a1979c3..ae4346c09 100644 --- a/src/cc/betprotocol.h +++ b/src/cc/betprotocol.h @@ -54,7 +54,6 @@ protected: char* disputeFunc = (char*) "DisputeBet"; std::vector playerConditions(); public: - CAmount MINFEE = 1; std::vector players; DisputeHeader disputeHeader; @@ -64,7 +63,7 @@ public: // on PANGEA CC* MakeDisputeCond(); - CMutableTransaction MakeSessionTx(); + CMutableTransaction MakeSessionTx(CAmount spendFee); CMutableTransaction MakeDisputeTx(uint256 signedSessionTxHash, uint256 vmResultHash); CMutableTransaction MakePostEvidenceTx(uint256 signedSessionTxHash, int playerIndex, std::vector state); @@ -78,4 +77,8 @@ public: }; + +bool GetOpReturnHash(CScript script, uint256 &hash); + + #endif /* BETPROTOCOL_H */ diff --git a/src/cc/disputepayout.cpp b/src/cc/disputepayout.cpp index ea34ed23c..9bd765c62 100644 --- a/src/cc/disputepayout.cpp +++ b/src/cc/disputepayout.cpp @@ -9,19 +9,6 @@ #include "primitives/transaction.h" -class DisputeHeader; - - -static bool GetOpReturnHash(CScript script, uint256 &hash) -{ - std::vector vHash; - GetOpReturnData(script, vHash); - if (vHash.size() != 32) return false; - memcpy(hash.begin(), vHash.data(), 32); - return true; -} - - /* * Crypto-Condition EVAL method that resolves a dispute of a session * @@ -85,7 +72,7 @@ bool Eval::DisputePayout(AppVM &vm, const CC *cond, const CTransaction &disputeT maxLength = out.first; bestPayout = resultHash; } - // The below means that if for any reason there is a draw, + // The below means that if for any reason there is a draw, the first dispute wins else if (out.first == maxLength) { if (bestPayout != payoutHash) { fprintf(stderr, "WARNING: VM has multiple solutions of same length\n"); diff --git a/src/cc/eval.cpp b/src/cc/eval.cpp index 352a64c4b..eeb84311b 100644 --- a/src/cc/eval.cpp +++ b/src/cc/eval.cpp @@ -134,6 +134,9 @@ bool Eval::CheckNotaryInputs(const CTransaction &tx, uint32_t height, uint32_t t } +extern char ASSETCHAINS_SYMBOL[16]; + + bool NotarisationData::Parse(const CScript scriptPK) { *this = NotarisationData(); @@ -146,12 +149,14 @@ bool NotarisationData::Parse(const CScript scriptPK) try { ss >> blockHash; ss >> height; + if (ASSETCHAINS_SYMBOL[0]) + ss >> txHash; char *nullPos = (char*) memchr(&ss[0], 0, ss.size()); if (!nullPos) return false; ss.read(symbol, nullPos-&ss[0]+1); - if (ss.size() != 36) return false; + if (ss.size() < 36) return false; ss >> MoM; ss >> MoMDepth; } catch (...) { diff --git a/src/cc/eval.h b/src/cc/eval.h index 55d45153c..3eb4350b1 100644 --- a/src/cc/eval.h +++ b/src/cc/eval.h @@ -78,7 +78,7 @@ class NotarisationData { public: uint256 blockHash; uint32_t height; - uint256 txHash; + uint256 txHash; // Only get this guy in asset chains not in KMD char symbol[64]; uint256 MoM; uint32_t MoMDepth; @@ -91,7 +91,7 @@ public: * Serialisation boilerplate */ template -std::vector CheckSerialize(T &in) +std::vector CheckSerialize(const T in) { CDataStream ss(SER_NETWORK, PROTOCOL_VERSION); ss << in; @@ -99,7 +99,7 @@ std::vector CheckSerialize(T &in) } template -bool CheckDeserialize(std::vector vIn, T &out) +bool CheckDeserialize(const std::vector vIn, T &out) { CDataStream ss(vIn, SER_NETWORK, PROTOCOL_VERSION); try { diff --git a/src/cc/importpayout.cpp b/src/cc/importpayout.cpp index 3be0cdaf7..858e71f31 100644 --- a/src/cc/importpayout.cpp +++ b/src/cc/importpayout.cpp @@ -13,15 +13,14 @@ * notarised on another chain. * * IN: cond - CC EVAL node - * IN: payoutTx - Payout transaction on value chain (KMD) + * IN: importTx - Payout transaction on value chain (KMD) * IN: nIn - index of input of stake * - * payoutTx: Spends stakeTx with payouts from asset chain + * importTx: Spends stakeTx with payouts from asset chain * * in 0: Spends Stake TX and contains ImportPayout CC - * out 0: OP_RETURN MomProof - * out 1: OP_RETURN serialized disputeTx from other chain - * out 2-: arbitrary payouts + * out 0: OP_RETURN MomProof, disputeTx + * out 1-: arbitrary payouts * * disputeTx: Spends sessionTx.0 (opener on asset chain) * @@ -30,25 +29,27 @@ * out 0: OP_RETURN hash of payouts * out 1-: anything */ -bool Eval::ImportPayout(const CC *cond, const CTransaction &payoutTx, unsigned int nIn) +bool Eval::ImportPayout(const CC *cond, const CTransaction &importTx, unsigned int nIn) { - // TODO: Error messages! - if (payoutTx.vout.size() < 2) return Invalid("need-2-vouts"); + if (importTx.vout.size() == 0) return Invalid("no-vouts"); - // load disputeTx from vout[1] + // load data from vout[0] + MoMProof proof; CTransaction disputeTx; - std::vector exportData; - GetOpReturnData(payoutTx.vout[1].scriptPubKey, exportData); - if (!CheckDeserialize(exportData, disputeTx)) - return Invalid("invalid-dispute-tx"); + { + std::pair pair(proof, disputeTx); + std::vector vopret; + GetOpReturnData(importTx.vout[0].scriptPubKey, vopret); + if (!CheckDeserialize(vopret, pair)) + return Invalid("invalid-payload"); + } // Check disputeTx.0 shows correct payouts { - std::vector payouts(payoutTx.vout.begin() + 2, payoutTx.vout.end()); - uint256 payoutsHash = SerializeHash(payouts); - std::vector vPayoutsHash(payoutsHash.begin(), payoutsHash.end()); - - if (disputeTx.vout[0].scriptPubKey != CScript() << OP_RETURN << vPayoutsHash) + uint256 givenPayoutsHash; + GetOpReturnHash(disputeTx.vout[0].scriptPubKey, givenPayoutsHash); + std::vector payouts(importTx.vout.begin() + 1, importTx.vout.end()); + if (givenPayoutsHash != SerializeHash(payouts)) return Invalid("wrong-payouts"); } @@ -63,12 +64,6 @@ bool Eval::ImportPayout(const CC *cond, const CTransaction &payoutTx, unsigned i // Check disputeTx solves momproof from vout[0] { - std::vector vProof; - GetOpReturnData(payoutTx.vout[0].scriptPubKey, vProof); - MoMProof proof; - if (!CheckDeserialize(vProof, proof)) - return Invalid("invalid-mom-proof-payload"); - NotarisationData data; if (!GetNotarisationData(proof.notarisationHash, data)) return Invalid("coudnt-load-mom"); diff --git a/src/test-komodo/test_eval_bet.cpp b/src/test-komodo/test_eval_bet.cpp index 25fea5d84..5da437646 100644 --- a/src/test-komodo/test_eval_bet.cpp +++ b/src/test-komodo/test_eval_bet.cpp @@ -152,7 +152,7 @@ public: CTransaction SessionTx() { - return CTransaction(bet.MakeSessionTx()); + return CTransaction(bet.MakeSessionTx(1)); } CC* DisputeCond() @@ -502,24 +502,24 @@ TEST_F(TestBet, testImportPayoutFewVouts) EvalMock eval = ebet.SetEvalMock(12); CMutableTransaction importTx = ebet.ImportPayoutTx(); - importTx.vout.resize(1); + importTx.vout.resize(0); CC *payoutCond = ebet.PayoutCond(); EXPECT_EQ(2, CCSign(importTx, 0, payoutCond, {Player2})); EXPECT_FALSE(TestCC(importTx, 0, payoutCond)); - EXPECT_EQ("need-2-vouts", eval.state.GetRejectReason()); + EXPECT_EQ("no-vouts", eval.state.GetRejectReason()); } -TEST_F(TestBet, testImportPayoutInvalidDisputeTx) +TEST_F(TestBet, testImportPayoutInvalidPayload) { EvalMock eval = ebet.SetEvalMock(12); CMutableTransaction importTx = ebet.ImportPayoutTx(); - importTx.vout[1].scriptPubKey.pop_back(); + importTx.vout[0].scriptPubKey.pop_back(); CC *payoutCond = ebet.PayoutCond(); EXPECT_EQ(2, CCSign(importTx, 0, payoutCond, {Player2})); EXPECT_FALSE(TestCC(importTx, 0, payoutCond)); - EXPECT_EQ("invalid-dispute-tx", eval.state.GetRejectReason()); + EXPECT_EQ("invalid-payload", eval.state.GetRejectReason()); } @@ -528,7 +528,7 @@ TEST_F(TestBet, testImportPayoutWrongPayouts) EvalMock eval = ebet.SetEvalMock(12); CMutableTransaction importTx = ebet.ImportPayoutTx(); - importTx.vout[2].nValue = 7; + importTx.vout[1].nValue = 7; CC *payoutCond = ebet.PayoutCond(); EXPECT_EQ(2, CCSign(importTx, 0, payoutCond, {Player2})); ASSERT_FALSE(TestCC(importTx, 0, payoutCond)); @@ -555,27 +555,15 @@ TEST_F(TestBet, testImportPayoutMangleSessionId) } -TEST_F(TestBet, testImportPayoutInvalidProofPayload) -{ - EvalMock eval = ebet.SetEvalMock(12); - - CMutableTransaction importTx = ebet.ImportPayoutTx(); - importTx.vout[0].scriptPubKey.pop_back(); - CC *payoutCond = ebet.PayoutCond(); - EXPECT_EQ(2, CCSign(importTx, 0, payoutCond, {Player2})); - EXPECT_FALSE(TestCC(importTx, 0, payoutCond)); - EXPECT_EQ("invalid-mom-proof-payload", eval.state.GetRejectReason()); -} - - TEST_F(TestBet, testImportPayoutInvalidNotarisationHash) { EvalMock eval = ebet.SetEvalMock(12); - CMutableTransaction importTx = ebet.ImportPayoutTx(); MoMProof proof = ebet.GetMoMProof(); proof.notarisationHash = uint256(); - importTx.vout[0].scriptPubKey = CScript() << OP_RETURN << CheckSerialize(proof); + CMutableTransaction importTx = ebet.bet.MakeImportPayoutTx( + ebet.Payouts(Player2), ebet.DisputeTx(Player2), uint256(), proof); + CC *payoutCond = ebet.PayoutCond(); EXPECT_EQ(2, CCSign(importTx, 0, payoutCond, {Player2})); EXPECT_FALSE(TestCC(importTx, 0, payoutCond)); @@ -587,10 +575,11 @@ TEST_F(TestBet, testImportPayoutMomFail) { EvalMock eval = ebet.SetEvalMock(12); - CMutableTransaction importTx = ebet.ImportPayoutTx(); MoMProof proof = ebet.GetMoMProof(); proof.nIndex ^= 1; - importTx.vout[0].scriptPubKey = CScript() << OP_RETURN << CheckSerialize(proof); + CMutableTransaction importTx = ebet.bet.MakeImportPayoutTx( + ebet.Payouts(Player2), ebet.DisputeTx(Player2), uint256(), proof); + CC *payoutCond = ebet.PayoutCond(); EXPECT_EQ(2, CCSign(importTx, 0, payoutCond, {Player2})); EXPECT_FALSE(TestCC(importTx, 0, payoutCond)); From 4729632250df4d9d5360de0d72494cb57f1a56f3 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Fri, 6 Apr 2018 14:35:46 -0300 Subject: [PATCH 0788/1062] * make interface for getting tx safer in Eval * restrict lengths in cryptoconditions to avoid ridiculous situations --- src/cc/disputepayout.cpp | 28 +++++++++---------- src/cc/eval.cpp | 23 +++++++++++---- src/cc/eval.h | 5 ++-- .../include/cryptoconditions.h | 12 ++++---- src/cryptoconditions/src/ed25519.c | 2 +- src/test-komodo/test_eval_bet.cpp | 7 +++-- src/test-komodo/test_eval_notarisation.cpp | 5 ++-- 7 files changed, 47 insertions(+), 35 deletions(-) diff --git a/src/cc/disputepayout.cpp b/src/cc/disputepayout.cpp index 9bd765c62..e36f4781d 100644 --- a/src/cc/disputepayout.cpp +++ b/src/cc/disputepayout.cpp @@ -33,29 +33,27 @@ bool Eval::DisputePayout(AppVM &vm, const CC *cond, const CTransaction &disputeT // load dispute header DisputeHeader disputeHeader; - std::vector headerData(cond->paramsBin, - cond->paramsBin+cond->paramsBinLength); + std::vector headerData( + cond->paramsBin, cond->paramsBin+cond->paramsBinLength); if (!CheckDeserialize(headerData, disputeHeader)) return Invalid("invalid-dispute-header"); // ensure that enough time has passed - CTransaction sessionTx; - uint256 sessionBlockHash; - CBlockIndex sessionBlock; - - if (!GetTx(disputeTx.vin[0].prevout.hash, sessionTx, sessionBlockHash, false)) - return Error("couldnt-get-parent"); - // TODO: This may not be an error, if both txs are to go into the same block... - // Probably change it to Invalid - if (!GetBlock(sessionBlockHash, sessionBlock)) - return Error("couldnt-get-block"); + { + CTransaction sessionTx; + CBlockIndex sessionBlock; + + // if unconformed its too soon + if (!GetTxConfirmed(disputeTx.vin[0].prevout.hash, sessionTx, sessionBlock)) + return Error("couldnt-get-parent"); - if (GetCurrentHeight() < sessionBlock.nHeight + disputeHeader.waitBlocks) - return Invalid("dispute-too-soon"); // Not yet + if (GetCurrentHeight() < sessionBlock.nHeight + disputeHeader.waitBlocks) + return Invalid("dispute-too-soon"); // Not yet + } // get spends std::vector spends; - if (!GetSpends(disputeTx.vin[0].prevout.hash, spends)) + if (!GetSpendsConfirmed(disputeTx.vin[0].prevout.hash, spends)) return Error("couldnt-get-spends"); // verify result from VM diff --git a/src/cc/eval.cpp b/src/cc/eval.cpp index eeb84311b..503507160 100644 --- a/src/cc/eval.cpp +++ b/src/cc/eval.cpp @@ -57,19 +57,31 @@ bool Eval::Dispatch(const CC *cond, const CTransaction &txTo, unsigned int nIn) } -bool Eval::GetSpends(uint256 hash, std::vector &spends) const +bool Eval::GetSpendsConfirmed(uint256 hash, std::vector &spends) const { // NOT IMPLEMENTED return false; } -bool Eval::GetTx(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock, bool fAllowSlow) const +bool Eval::GetTxUnconfirmed(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock) const { + bool fAllowSlow = false; // Don't allow slow return GetTransaction(hash, txOut, hashBlock, fAllowSlow); } +bool Eval::GetTxConfirmed(const uint256 &hash, CTransaction &txOut, CBlockIndex &block) const +{ + uint256 hashBlock; + if (!GetTxUnconfirmed(hash, txOut, hashBlock)) + return false; + if (hashBlock.IsNull() || !GetBlock(hashBlock, block)) + return false; + return true; +} + + unsigned int Eval::GetCurrentHeight() const { return chainActive.Height(); @@ -83,6 +95,7 @@ bool Eval::GetBlock(uint256 hash, CBlockIndex& blockIdx) const blockIdx = *r->second; return true; } + fprintf(stderr, "CC Eval Error: Can't get block from index\n"); return false; } @@ -109,7 +122,7 @@ bool Eval::CheckNotaryInputs(const CTransaction &tx, uint32_t height, uint32_t t // Get notary pubkey CTransaction tx; uint256 hashBlock; - if (!GetTx(txIn.prevout.hash, tx, hashBlock, false)) return false; + if (!GetTxUnconfirmed(txIn.prevout.hash, tx, hashBlock)) return false; if (tx.vout.size() < txIn.prevout.n) return false; CScript spk = tx.vout[txIn.prevout.n].scriptPubKey; if (spk.size() != 35) return false; @@ -173,10 +186,8 @@ bool NotarisationData::Parse(const CScript scriptPK) bool Eval::GetNotarisationData(const uint256 notaryHash, NotarisationData &data) const { CTransaction notarisationTx; - uint256 notarisationBlock; - if (!GetTx(notaryHash, notarisationTx, notarisationBlock, true)) return false; CBlockIndex block; - if (!GetBlock(notarisationBlock, block)) return false; + if (!GetTxConfirmed(notaryHash, notarisationTx, block)) return false; if (!CheckNotaryInputs(notarisationTx, block.nHeight, block.nTime)) return false; if (notarisationTx.vout.size() < 2) return false; if (!data.Parse(notarisationTx.vout[1].scriptPubKey)) return false; diff --git a/src/cc/eval.h b/src/cc/eval.h index 3eb4350b1..b884da5d8 100644 --- a/src/cc/eval.h +++ b/src/cc/eval.h @@ -41,9 +41,10 @@ public: /* * IO functions */ - virtual bool GetTx(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock, bool fAllowSlow) const; + virtual bool GetTxUnconfirmed(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock) const; + virtual bool GetTxConfirmed(const uint256 &hash, CTransaction &txOut, CBlockIndex &block) const; virtual unsigned int GetCurrentHeight() const; - virtual bool GetSpends(uint256 hash, std::vector &spends) const; + virtual bool GetSpendsConfirmed(uint256 hash, std::vector &spends) const; virtual bool GetBlock(uint256 hash, CBlockIndex& blockIdx) const; virtual int32_t GetNotaries(uint8_t pubkeys[64][33], int32_t height, uint32_t timestamp) const; virtual bool GetNotarisationData(uint256 notarisationHash, NotarisationData &data) const; diff --git a/src/cryptoconditions/include/cryptoconditions.h b/src/cryptoconditions/include/cryptoconditions.h index a192b06c2..1c70441b3 100644 --- a/src/cryptoconditions/include/cryptoconditions.h +++ b/src/cryptoconditions/include/cryptoconditions.h @@ -42,14 +42,14 @@ typedef struct CC { // public key types struct { unsigned char *publicKey, *signature; }; // preimage - struct { unsigned char *preimage; size_t preimageLength; }; + struct { unsigned char *preimage; uint16_t preimageLength; }; // threshold - struct { long threshold; int size; struct CC **subconditions; }; + struct { long threshold; uint8_t size; struct CC **subconditions; }; // prefix - struct { unsigned char *prefix; size_t prefixLength; struct CC *subcondition; - unsigned long maxMessageLength; }; + struct { unsigned char *prefix; uint16_t prefixLength; struct CC *subcondition; + uint16_t maxMessageLength; }; // eval - struct { char method[64]; unsigned char *paramsBin; size_t paramsBinLength; }; + struct { char method[64]; unsigned char *paramsBin; uint16_t paramsBinLength; }; // anon struct { unsigned char fingerprint[32]; uint32_t subtypes; unsigned long cost; struct CCType *conditionType; }; @@ -78,7 +78,7 @@ int cc_verify(const struct CC *cond, const unsigned char *msg, size_ VerifyEval verifyEval, void *evalContext); int cc_visit(CC *cond, struct CCVisitor visitor); int cc_signTreeEd25519(CC *cond, const unsigned char *privateKey, - const unsigned char *msg, size_t msgLength); + const unsigned char *msg, uint16_t msgLength); int cc_signTreeSecp256k1Msg32(CC *cond, const unsigned char *privateKey, const unsigned char *msg32); size_t cc_conditionBinary(const CC *cond, unsigned char *buf); size_t cc_fulfillmentBinary(const CC *cond, unsigned char *buf, size_t bufLength); diff --git a/src/cryptoconditions/src/ed25519.c b/src/cryptoconditions/src/ed25519.c index 18a75fd5c..18cee0768 100644 --- a/src/cryptoconditions/src/ed25519.c +++ b/src/cryptoconditions/src/ed25519.c @@ -58,7 +58,7 @@ static int ed25519Sign(CC *cond, CCVisitor visitor) { /* * Sign ed25519 conditions in a tree */ -int cc_signTreeEd25519(CC *cond, const unsigned char *privateKey, const unsigned char *msg, size_t msgLength) { +int cc_signTreeEd25519(CC *cond, const unsigned char *privateKey, const unsigned char *msg, uint16_t msgLength) { unsigned char pk[32], skpk[64]; ed25519_create_keypair(pk, skpk, privateKey); diff --git a/src/test-komodo/test_eval_bet.cpp b/src/test-komodo/test_eval_bet.cpp index 5da437646..cff8a972c 100644 --- a/src/test-komodo/test_eval_bet.cpp +++ b/src/test-komodo/test_eval_bet.cpp @@ -89,7 +89,7 @@ public: return Invalid("invalid-method"); } - bool GetSpends(uint256 hash, std::vector &spendsOut) const + bool GetSpendsConfirmed(uint256 hash, std::vector &spendsOut) const { auto r = spends.find(hash); if (r != spends.end()) { @@ -99,12 +99,13 @@ public: return false; } - bool GetTx(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock, bool fAllowSlow) const + bool GetTxUnconfirmed(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock) const { auto r = txs.find(hash); if (r != txs.end()) { txOut = r->second; - hashBlock = hash; + if (blocks.count(hash) > 0) + hashBlock = hash; return true; } return false; diff --git a/src/test-komodo/test_eval_notarisation.cpp b/src/test-komodo/test_eval_notarisation.cpp index 736e28931..7fc2f1b4d 100644 --- a/src/test-komodo/test_eval_notarisation.cpp +++ b/src/test-komodo/test_eval_notarisation.cpp @@ -36,12 +36,13 @@ public: return nNotaries; } - bool GetTx(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock, bool fAllowSlow) const + bool GetTxUnconfirmed(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock) const { auto r = txs.find(hash); if (r != txs.end()) { txOut = r->second; - hashBlock = hash; + if (blocks.count(hash) > 0) + hashBlock = hash; return true; } return false; From ceb3e73b4cbb0f52d08c9866d19b3702b1914c08 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 6 Apr 2018 22:19:59 +0300 Subject: [PATCH 0789/1062] Fix kvupdate 4096 limit --- src/komodo.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo.h b/src/komodo.h index cc15174fb..c387198f8 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -693,7 +693,7 @@ void komodo_connectblock(CBlockIndex *pindex,CBlock& block) { static int32_t hwmheight; uint64_t signedmask,voutmask; char symbol[KOMODO_ASSETCHAIN_MAXLEN],dest[KOMODO_ASSETCHAIN_MAXLEN]; struct komodo_state *sp; - uint8_t scriptbuf[4096],pubkeys[64][33],rmd160[20],scriptPubKey[35]; uint256 kmdtxid,zero,btctxid,txhash; + uint8_t scriptbuf[10001],pubkeys[64][33],rmd160[20],scriptPubKey[35]; uint256 kmdtxid,zero,btctxid,txhash; int32_t i,j,k,numnotaries,notarized,scriptlen,isratification,nid,numvalid,specialtx,notarizedheight,notaryid,len,numvouts,numvins,height,txn_count; memset(&zero,0,sizeof(zero)); komodo_init(pindex->nHeight); From 4f616c5a44ce1eae506575e964a43344712da0ac Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 6 Apr 2018 22:32:48 +0300 Subject: [PATCH 0790/1062] Enable overwriting key's value --- src/komodo_kv.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/komodo_kv.h b/src/komodo_kv.h index 453608cc1..611f3a77e 100644 --- a/src/komodo_kv.h +++ b/src/komodo_kv.h @@ -182,7 +182,7 @@ void komodo_kvupdate(uint8_t *opretbuf,int32_t opretlen,uint64_t value) ptr->value = (uint8_t *)calloc(1,valuesize); memcpy(ptr->value,valueptr,valuesize); } - } + } else fprintf(stderr,"newflag.%d zero or protected %d\n",newflag,(ptr->flags & KOMODO_KVPROTECTED)); /*for (i=0; i<32; i++) printf("%02x",((uint8_t *)&ptr->pubkey)[i]); printf(" <- "); @@ -191,10 +191,10 @@ void komodo_kvupdate(uint8_t *opretbuf,int32_t opretlen,uint64_t value) printf(" new pubkey\n");*/ memcpy(&ptr->pubkey,&pubkey,sizeof(ptr->pubkey)); ptr->height = height; - ptr->flags = flags | 1; + ptr->flags = flags; portable_mutex_unlock(&KOMODO_KV_mutex); - } //else printf("size mismatch %d vs %d\n",opretlen,coresize); - } + } else fprintf(stderr,"size mismatch %d vs %d\n",opretlen,coresize); + } else fprintf(stderr,"not enough fee\n"); } #endif From 7e907fddadbe4369a7b4c0b821bbaa7cfdf56ca5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 11:29:40 +0300 Subject: [PATCH 0791/1062] komodo_port.c to calculate assetchain rpc port, p2p port one below --- src/komodo_kv.h | 2 +- src/komodo_port.c | 848 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 849 insertions(+), 1 deletion(-) create mode 100644 src/komodo_port.c diff --git a/src/komodo_kv.h b/src/komodo_kv.h index 611f3a77e..0d5259eaa 100644 --- a/src/komodo_kv.h +++ b/src/komodo_kv.h @@ -191,7 +191,7 @@ void komodo_kvupdate(uint8_t *opretbuf,int32_t opretlen,uint64_t value) printf(" new pubkey\n");*/ memcpy(&ptr->pubkey,&pubkey,sizeof(ptr->pubkey)); ptr->height = height; - ptr->flags = flags; + ptr->flags = flags; // jl777 used to or in KVPROTECTED portable_mutex_unlock(&KOMODO_KV_mutex); } else fprintf(stderr,"size mismatch %d vs %d\n",opretlen,coresize); } else fprintf(stderr,"not enough fee\n"); diff --git a/src/komodo_port.c b/src/komodo_port.c new file mode 100644 index 000000000..11d3ce5b4 --- /dev/null +++ b/src/komodo_port.c @@ -0,0 +1,848 @@ +// +// main.c +// spawn +// +// Created by Mac on 4/7/18. +// Copyright © 2018 SuperNET. All rights reserved. +// + +#include +#include +#include +#include + +uint64_t ASSETCHAINS_COMMISSION; +uint32_t ASSETCHAINS_MAGIC = 2387029918; +uint8_t ASSETCHAINS_OVERRIDE_PUBKEY33[33]; + +struct sha256_vstate { uint64_t length; uint32_t state[8],curlen; uint8_t buf[64]; }; +struct rmd160_vstate { uint64_t length; uint8_t buf[64]; uint32_t curlen, state[5]; }; +union _bits256 { uint8_t bytes[32]; uint16_t ushorts[16]; uint32_t uints[8]; uint64_t ulongs[4]; uint64_t txid; }; +typedef union _bits256 bits256; + +// following is ported from libtom + +#define STORE32L(x, y) \ +{ (y)[3] = (uint8_t)(((x)>>24)&255); (y)[2] = (uint8_t)(((x)>>16)&255); \ +(y)[1] = (uint8_t)(((x)>>8)&255); (y)[0] = (uint8_t)((x)&255); } + +#define LOAD32L(x, y) \ +{ x = (uint32_t)(((uint64_t)((y)[3] & 255)<<24) | \ +((uint32_t)((y)[2] & 255)<<16) | \ +((uint32_t)((y)[1] & 255)<<8) | \ +((uint32_t)((y)[0] & 255))); } + +#define STORE64L(x, y) \ +{ (y)[7] = (uint8_t)(((x)>>56)&255); (y)[6] = (uint8_t)(((x)>>48)&255); \ +(y)[5] = (uint8_t)(((x)>>40)&255); (y)[4] = (uint8_t)(((x)>>32)&255); \ +(y)[3] = (uint8_t)(((x)>>24)&255); (y)[2] = (uint8_t)(((x)>>16)&255); \ +(y)[1] = (uint8_t)(((x)>>8)&255); (y)[0] = (uint8_t)((x)&255); } + +#define LOAD64L(x, y) \ +{ x = (((uint64_t)((y)[7] & 255))<<56)|(((uint64_t)((y)[6] & 255))<<48)| \ +(((uint64_t)((y)[5] & 255))<<40)|(((uint64_t)((y)[4] & 255))<<32)| \ +(((uint64_t)((y)[3] & 255))<<24)|(((uint64_t)((y)[2] & 255))<<16)| \ +(((uint64_t)((y)[1] & 255))<<8)|(((uint64_t)((y)[0] & 255))); } + +#define STORE32H(x, y) \ +{ (y)[0] = (uint8_t)(((x)>>24)&255); (y)[1] = (uint8_t)(((x)>>16)&255); \ +(y)[2] = (uint8_t)(((x)>>8)&255); (y)[3] = (uint8_t)((x)&255); } + +#define LOAD32H(x, y) \ +{ x = (uint32_t)(((uint64_t)((y)[0] & 255)<<24) | \ +((uint32_t)((y)[1] & 255)<<16) | \ +((uint32_t)((y)[2] & 255)<<8) | \ +((uint32_t)((y)[3] & 255))); } + +#define STORE64H(x, y) \ +{ (y)[0] = (uint8_t)(((x)>>56)&255); (y)[1] = (uint8_t)(((x)>>48)&255); \ +(y)[2] = (uint8_t)(((x)>>40)&255); (y)[3] = (uint8_t)(((x)>>32)&255); \ +(y)[4] = (uint8_t)(((x)>>24)&255); (y)[5] = (uint8_t)(((x)>>16)&255); \ +(y)[6] = (uint8_t)(((x)>>8)&255); (y)[7] = (uint8_t)((x)&255); } + +#define LOAD64H(x, y) \ +{ x = (((uint64_t)((y)[0] & 255))<<56)|(((uint64_t)((y)[1] & 255))<<48) | \ +(((uint64_t)((y)[2] & 255))<<40)|(((uint64_t)((y)[3] & 255))<<32) | \ +(((uint64_t)((y)[4] & 255))<<24)|(((uint64_t)((y)[5] & 255))<<16) | \ +(((uint64_t)((y)[6] & 255))<<8)|(((uint64_t)((y)[7] & 255))); } + +// Various logical functions +#define RORc(x, y) ( ((((uint32_t)(x)&0xFFFFFFFFUL)>>(uint32_t)((y)&31)) | ((uint32_t)(x)<<(uint32_t)(32-((y)&31)))) & 0xFFFFFFFFUL) +#define Ch(x,y,z) (z ^ (x & (y ^ z))) +#define Maj(x,y,z) (((x | y) & z) | (x & y)) +#define S(x, n) RORc((x),(n)) +#define R(x, n) (((x)&0xFFFFFFFFUL)>>(n)) +#define Sigma0(x) (S(x, 2) ^ S(x, 13) ^ S(x, 22)) +#define Sigma1(x) (S(x, 6) ^ S(x, 11) ^ S(x, 25)) +#define Gamma0(x) (S(x, 7) ^ S(x, 18) ^ R(x, 3)) +#define Gamma1(x) (S(x, 17) ^ S(x, 19) ^ R(x, 10)) +#define MIN(x, y) ( ((x)<(y))?(x):(y) ) + +static inline int32_t sha256_vcompress(struct sha256_vstate * md,uint8_t *buf) +{ + uint32_t S[8],W[64],t0,t1,i; + for (i=0; i<8; i++) // copy state into S + S[i] = md->state[i]; + for (i=0; i<16; i++) // copy the state into 512-bits into W[0..15] + LOAD32H(W[i],buf + (4*i)); + for (i=16; i<64; i++) // fill W[16..63] + W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16]; + +#define RND(a,b,c,d,e,f,g,h,i,ki) \ +t0 = h + Sigma1(e) + Ch(e, f, g) + ki + W[i]; \ +t1 = Sigma0(a) + Maj(a, b, c); \ +d += t0; \ +h = t0 + t1; + + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],0,0x428a2f98); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],1,0x71374491); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],2,0xb5c0fbcf); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],3,0xe9b5dba5); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],4,0x3956c25b); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],5,0x59f111f1); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],6,0x923f82a4); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],7,0xab1c5ed5); + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],8,0xd807aa98); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],9,0x12835b01); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],10,0x243185be); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],11,0x550c7dc3); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],12,0x72be5d74); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],13,0x80deb1fe); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],14,0x9bdc06a7); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],15,0xc19bf174); + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],16,0xe49b69c1); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],17,0xefbe4786); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],18,0x0fc19dc6); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],19,0x240ca1cc); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],20,0x2de92c6f); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],21,0x4a7484aa); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],22,0x5cb0a9dc); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],23,0x76f988da); + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],24,0x983e5152); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],25,0xa831c66d); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],26,0xb00327c8); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],27,0xbf597fc7); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],28,0xc6e00bf3); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],29,0xd5a79147); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],30,0x06ca6351); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],31,0x14292967); + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],32,0x27b70a85); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],33,0x2e1b2138); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],34,0x4d2c6dfc); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],35,0x53380d13); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],36,0x650a7354); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],37,0x766a0abb); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],38,0x81c2c92e); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],39,0x92722c85); + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],40,0xa2bfe8a1); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],41,0xa81a664b); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],42,0xc24b8b70); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],43,0xc76c51a3); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],44,0xd192e819); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],45,0xd6990624); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],46,0xf40e3585); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],47,0x106aa070); + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],48,0x19a4c116); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],49,0x1e376c08); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],50,0x2748774c); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],51,0x34b0bcb5); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],52,0x391c0cb3); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],53,0x4ed8aa4a); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],54,0x5b9cca4f); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],55,0x682e6ff3); + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],56,0x748f82ee); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],57,0x78a5636f); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],58,0x84c87814); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],59,0x8cc70208); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],60,0x90befffa); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],61,0xa4506ceb); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],62,0xbef9a3f7); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],63,0xc67178f2); +#undef RND + for (i=0; i<8; i++) // feedback + md->state[i] = md->state[i] + S[i]; + return(0); +} + +#undef RORc +#undef Ch +#undef Maj +#undef S +#undef R +#undef Sigma0 +#undef Sigma1 +#undef Gamma0 +#undef Gamma1 + +static inline void sha256_vinit(struct sha256_vstate * md) +{ + md->curlen = 0; + md->length = 0; + md->state[0] = 0x6A09E667UL; + md->state[1] = 0xBB67AE85UL; + md->state[2] = 0x3C6EF372UL; + md->state[3] = 0xA54FF53AUL; + md->state[4] = 0x510E527FUL; + md->state[5] = 0x9B05688CUL; + md->state[6] = 0x1F83D9ABUL; + md->state[7] = 0x5BE0CD19UL; +} + +static inline int32_t sha256_vprocess(struct sha256_vstate *md,const uint8_t *in,uint64_t inlen) +{ + uint64_t n; int32_t err; + if ( md->curlen > sizeof(md->buf) ) + return(-1); + while ( inlen > 0 ) + { + if ( md->curlen == 0 && inlen >= 64 ) + { + if ( (err= sha256_vcompress(md,(uint8_t *)in)) != 0 ) + return(err); + md->length += 64 * 8, in += 64, inlen -= 64; + } + else + { + n = MIN(inlen,64 - md->curlen); + memcpy(md->buf + md->curlen,in,(size_t)n); + md->curlen += n, in += n, inlen -= n; + if ( md->curlen == 64 ) + { + if ( (err= sha256_vcompress(md,md->buf)) != 0 ) + return(err); + md->length += 8*64; + md->curlen = 0; + } + } + } + return(0); +} + +static inline int32_t sha256_vdone(struct sha256_vstate *md,uint8_t *out) +{ + int32_t i; + if ( md->curlen >= sizeof(md->buf) ) + return(-1); + md->length += md->curlen * 8; // increase the length of the message + md->buf[md->curlen++] = (uint8_t)0x80; // append the '1' bit + // if len > 56 bytes we append zeros then compress. Then we can fall back to padding zeros and length encoding like normal. + if ( md->curlen > 56 ) + { + while ( md->curlen < 64 ) + md->buf[md->curlen++] = (uint8_t)0; + sha256_vcompress(md,md->buf); + md->curlen = 0; + } + while ( md->curlen < 56 ) // pad upto 56 bytes of zeroes + md->buf[md->curlen++] = (uint8_t)0; + STORE64H(md->length,md->buf+56); // store length + sha256_vcompress(md,md->buf); + for (i=0; i<8; i++) // copy output + STORE32H(md->state[i],out+(4*i)); + return(0); +} + +void vcalc_sha256(char deprecated[(256 >> 3) * 2 + 1],uint8_t hash[256 >> 3],uint8_t *src,int32_t len) +{ + struct sha256_vstate md; + sha256_vinit(&md); + sha256_vprocess(&md,src,len); + sha256_vdone(&md,hash); +} + +bits256 bits256_doublesha256(char *deprecated,uint8_t *data,int32_t datalen) +{ + bits256 hash,hash2; int32_t i; + vcalc_sha256(0,hash.bytes,data,datalen); + vcalc_sha256(0,hash2.bytes,hash.bytes,sizeof(hash)); + for (i=0; i>(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL) + +/* the ten basic operations FF() through III() */ +#define FF(a, b, c, d, e, x, s) \ +(a) += F((b), (c), (d)) + (x);\ +(a) = ROLc((a), (s)) + (e);\ +(c) = ROLc((c), 10); + +#define GG(a, b, c, d, e, x, s) \ +(a) += G((b), (c), (d)) + (x) + 0x5a827999UL;\ +(a) = ROLc((a), (s)) + (e);\ +(c) = ROLc((c), 10); + +#define HH(a, b, c, d, e, x, s) \ +(a) += H((b), (c), (d)) + (x) + 0x6ed9eba1UL;\ +(a) = ROLc((a), (s)) + (e);\ +(c) = ROLc((c), 10); + +#define II(a, b, c, d, e, x, s) \ +(a) += I((b), (c), (d)) + (x) + 0x8f1bbcdcUL;\ +(a) = ROLc((a), (s)) + (e);\ +(c) = ROLc((c), 10); + +#define JJ(a, b, c, d, e, x, s) \ +(a) += J((b), (c), (d)) + (x) + 0xa953fd4eUL;\ +(a) = ROLc((a), (s)) + (e);\ +(c) = ROLc((c), 10); + +#define FFF(a, b, c, d, e, x, s) \ +(a) += F((b), (c), (d)) + (x);\ +(a) = ROLc((a), (s)) + (e);\ +(c) = ROLc((c), 10); + +#define GGG(a, b, c, d, e, x, s) \ +(a) += G((b), (c), (d)) + (x) + 0x7a6d76e9UL;\ +(a) = ROLc((a), (s)) + (e);\ +(c) = ROLc((c), 10); + +#define HHH(a, b, c, d, e, x, s) \ +(a) += H((b), (c), (d)) + (x) + 0x6d703ef3UL;\ +(a) = ROLc((a), (s)) + (e);\ +(c) = ROLc((c), 10); + +#define III(a, b, c, d, e, x, s) \ +(a) += I((b), (c), (d)) + (x) + 0x5c4dd124UL;\ +(a) = ROLc((a), (s)) + (e);\ +(c) = ROLc((c), 10); + +#define JJJ(a, b, c, d, e, x, s) \ +(a) += J((b), (c), (d)) + (x) + 0x50a28be6UL;\ +(a) = ROLc((a), (s)) + (e);\ +(c) = ROLc((c), 10); + +static int32_t rmd160_vcompress(struct rmd160_vstate *md,uint8_t *buf) +{ + uint32_t aa,bb,cc,dd,ee,aaa,bbb,ccc,ddd,eee,X[16]; + int i; + + /* load words X */ + for (i = 0; i < 16; i++){ + LOAD32L(X[i], buf + (4 * i)); + } + + /* load state */ + aa = aaa = md->state[0]; + bb = bbb = md->state[1]; + cc = ccc = md->state[2]; + dd = ddd = md->state[3]; + ee = eee = md->state[4]; + + /* round 1 */ + FF(aa, bb, cc, dd, ee, X[ 0], 11); + FF(ee, aa, bb, cc, dd, X[ 1], 14); + FF(dd, ee, aa, bb, cc, X[ 2], 15); + FF(cc, dd, ee, aa, bb, X[ 3], 12); + FF(bb, cc, dd, ee, aa, X[ 4], 5); + FF(aa, bb, cc, dd, ee, X[ 5], 8); + FF(ee, aa, bb, cc, dd, X[ 6], 7); + FF(dd, ee, aa, bb, cc, X[ 7], 9); + FF(cc, dd, ee, aa, bb, X[ 8], 11); + FF(bb, cc, dd, ee, aa, X[ 9], 13); + FF(aa, bb, cc, dd, ee, X[10], 14); + FF(ee, aa, bb, cc, dd, X[11], 15); + FF(dd, ee, aa, bb, cc, X[12], 6); + FF(cc, dd, ee, aa, bb, X[13], 7); + FF(bb, cc, dd, ee, aa, X[14], 9); + FF(aa, bb, cc, dd, ee, X[15], 8); + + /* round 2 */ + GG(ee, aa, bb, cc, dd, X[ 7], 7); + GG(dd, ee, aa, bb, cc, X[ 4], 6); + GG(cc, dd, ee, aa, bb, X[13], 8); + GG(bb, cc, dd, ee, aa, X[ 1], 13); + GG(aa, bb, cc, dd, ee, X[10], 11); + GG(ee, aa, bb, cc, dd, X[ 6], 9); + GG(dd, ee, aa, bb, cc, X[15], 7); + GG(cc, dd, ee, aa, bb, X[ 3], 15); + GG(bb, cc, dd, ee, aa, X[12], 7); + GG(aa, bb, cc, dd, ee, X[ 0], 12); + GG(ee, aa, bb, cc, dd, X[ 9], 15); + GG(dd, ee, aa, bb, cc, X[ 5], 9); + GG(cc, dd, ee, aa, bb, X[ 2], 11); + GG(bb, cc, dd, ee, aa, X[14], 7); + GG(aa, bb, cc, dd, ee, X[11], 13); + GG(ee, aa, bb, cc, dd, X[ 8], 12); + + /* round 3 */ + HH(dd, ee, aa, bb, cc, X[ 3], 11); + HH(cc, dd, ee, aa, bb, X[10], 13); + HH(bb, cc, dd, ee, aa, X[14], 6); + HH(aa, bb, cc, dd, ee, X[ 4], 7); + HH(ee, aa, bb, cc, dd, X[ 9], 14); + HH(dd, ee, aa, bb, cc, X[15], 9); + HH(cc, dd, ee, aa, bb, X[ 8], 13); + HH(bb, cc, dd, ee, aa, X[ 1], 15); + HH(aa, bb, cc, dd, ee, X[ 2], 14); + HH(ee, aa, bb, cc, dd, X[ 7], 8); + HH(dd, ee, aa, bb, cc, X[ 0], 13); + HH(cc, dd, ee, aa, bb, X[ 6], 6); + HH(bb, cc, dd, ee, aa, X[13], 5); + HH(aa, bb, cc, dd, ee, X[11], 12); + HH(ee, aa, bb, cc, dd, X[ 5], 7); + HH(dd, ee, aa, bb, cc, X[12], 5); + + /* round 4 */ + II(cc, dd, ee, aa, bb, X[ 1], 11); + II(bb, cc, dd, ee, aa, X[ 9], 12); + II(aa, bb, cc, dd, ee, X[11], 14); + II(ee, aa, bb, cc, dd, X[10], 15); + II(dd, ee, aa, bb, cc, X[ 0], 14); + II(cc, dd, ee, aa, bb, X[ 8], 15); + II(bb, cc, dd, ee, aa, X[12], 9); + II(aa, bb, cc, dd, ee, X[ 4], 8); + II(ee, aa, bb, cc, dd, X[13], 9); + II(dd, ee, aa, bb, cc, X[ 3], 14); + II(cc, dd, ee, aa, bb, X[ 7], 5); + II(bb, cc, dd, ee, aa, X[15], 6); + II(aa, bb, cc, dd, ee, X[14], 8); + II(ee, aa, bb, cc, dd, X[ 5], 6); + II(dd, ee, aa, bb, cc, X[ 6], 5); + II(cc, dd, ee, aa, bb, X[ 2], 12); + + /* round 5 */ + JJ(bb, cc, dd, ee, aa, X[ 4], 9); + JJ(aa, bb, cc, dd, ee, X[ 0], 15); + JJ(ee, aa, bb, cc, dd, X[ 5], 5); + JJ(dd, ee, aa, bb, cc, X[ 9], 11); + JJ(cc, dd, ee, aa, bb, X[ 7], 6); + JJ(bb, cc, dd, ee, aa, X[12], 8); + JJ(aa, bb, cc, dd, ee, X[ 2], 13); + JJ(ee, aa, bb, cc, dd, X[10], 12); + JJ(dd, ee, aa, bb, cc, X[14], 5); + JJ(cc, dd, ee, aa, bb, X[ 1], 12); + JJ(bb, cc, dd, ee, aa, X[ 3], 13); + JJ(aa, bb, cc, dd, ee, X[ 8], 14); + JJ(ee, aa, bb, cc, dd, X[11], 11); + JJ(dd, ee, aa, bb, cc, X[ 6], 8); + JJ(cc, dd, ee, aa, bb, X[15], 5); + JJ(bb, cc, dd, ee, aa, X[13], 6); + + /* parallel round 1 */ + JJJ(aaa, bbb, ccc, ddd, eee, X[ 5], 8); + JJJ(eee, aaa, bbb, ccc, ddd, X[14], 9); + JJJ(ddd, eee, aaa, bbb, ccc, X[ 7], 9); + JJJ(ccc, ddd, eee, aaa, bbb, X[ 0], 11); + JJJ(bbb, ccc, ddd, eee, aaa, X[ 9], 13); + JJJ(aaa, bbb, ccc, ddd, eee, X[ 2], 15); + JJJ(eee, aaa, bbb, ccc, ddd, X[11], 15); + JJJ(ddd, eee, aaa, bbb, ccc, X[ 4], 5); + JJJ(ccc, ddd, eee, aaa, bbb, X[13], 7); + JJJ(bbb, ccc, ddd, eee, aaa, X[ 6], 7); + JJJ(aaa, bbb, ccc, ddd, eee, X[15], 8); + JJJ(eee, aaa, bbb, ccc, ddd, X[ 8], 11); + JJJ(ddd, eee, aaa, bbb, ccc, X[ 1], 14); + JJJ(ccc, ddd, eee, aaa, bbb, X[10], 14); + JJJ(bbb, ccc, ddd, eee, aaa, X[ 3], 12); + JJJ(aaa, bbb, ccc, ddd, eee, X[12], 6); + + /* parallel round 2 */ + III(eee, aaa, bbb, ccc, ddd, X[ 6], 9); + III(ddd, eee, aaa, bbb, ccc, X[11], 13); + III(ccc, ddd, eee, aaa, bbb, X[ 3], 15); + III(bbb, ccc, ddd, eee, aaa, X[ 7], 7); + III(aaa, bbb, ccc, ddd, eee, X[ 0], 12); + III(eee, aaa, bbb, ccc, ddd, X[13], 8); + III(ddd, eee, aaa, bbb, ccc, X[ 5], 9); + III(ccc, ddd, eee, aaa, bbb, X[10], 11); + III(bbb, ccc, ddd, eee, aaa, X[14], 7); + III(aaa, bbb, ccc, ddd, eee, X[15], 7); + III(eee, aaa, bbb, ccc, ddd, X[ 8], 12); + III(ddd, eee, aaa, bbb, ccc, X[12], 7); + III(ccc, ddd, eee, aaa, bbb, X[ 4], 6); + III(bbb, ccc, ddd, eee, aaa, X[ 9], 15); + III(aaa, bbb, ccc, ddd, eee, X[ 1], 13); + III(eee, aaa, bbb, ccc, ddd, X[ 2], 11); + + /* parallel round 3 */ + HHH(ddd, eee, aaa, bbb, ccc, X[15], 9); + HHH(ccc, ddd, eee, aaa, bbb, X[ 5], 7); + HHH(bbb, ccc, ddd, eee, aaa, X[ 1], 15); + HHH(aaa, bbb, ccc, ddd, eee, X[ 3], 11); + HHH(eee, aaa, bbb, ccc, ddd, X[ 7], 8); + HHH(ddd, eee, aaa, bbb, ccc, X[14], 6); + HHH(ccc, ddd, eee, aaa, bbb, X[ 6], 6); + HHH(bbb, ccc, ddd, eee, aaa, X[ 9], 14); + HHH(aaa, bbb, ccc, ddd, eee, X[11], 12); + HHH(eee, aaa, bbb, ccc, ddd, X[ 8], 13); + HHH(ddd, eee, aaa, bbb, ccc, X[12], 5); + HHH(ccc, ddd, eee, aaa, bbb, X[ 2], 14); + HHH(bbb, ccc, ddd, eee, aaa, X[10], 13); + HHH(aaa, bbb, ccc, ddd, eee, X[ 0], 13); + HHH(eee, aaa, bbb, ccc, ddd, X[ 4], 7); + HHH(ddd, eee, aaa, bbb, ccc, X[13], 5); + + /* parallel round 4 */ + GGG(ccc, ddd, eee, aaa, bbb, X[ 8], 15); + GGG(bbb, ccc, ddd, eee, aaa, X[ 6], 5); + GGG(aaa, bbb, ccc, ddd, eee, X[ 4], 8); + GGG(eee, aaa, bbb, ccc, ddd, X[ 1], 11); + GGG(ddd, eee, aaa, bbb, ccc, X[ 3], 14); + GGG(ccc, ddd, eee, aaa, bbb, X[11], 14); + GGG(bbb, ccc, ddd, eee, aaa, X[15], 6); + GGG(aaa, bbb, ccc, ddd, eee, X[ 0], 14); + GGG(eee, aaa, bbb, ccc, ddd, X[ 5], 6); + GGG(ddd, eee, aaa, bbb, ccc, X[12], 9); + GGG(ccc, ddd, eee, aaa, bbb, X[ 2], 12); + GGG(bbb, ccc, ddd, eee, aaa, X[13], 9); + GGG(aaa, bbb, ccc, ddd, eee, X[ 9], 12); + GGG(eee, aaa, bbb, ccc, ddd, X[ 7], 5); + GGG(ddd, eee, aaa, bbb, ccc, X[10], 15); + GGG(ccc, ddd, eee, aaa, bbb, X[14], 8); + + /* parallel round 5 */ + FFF(bbb, ccc, ddd, eee, aaa, X[12] , 8); + FFF(aaa, bbb, ccc, ddd, eee, X[15] , 5); + FFF(eee, aaa, bbb, ccc, ddd, X[10] , 12); + FFF(ddd, eee, aaa, bbb, ccc, X[ 4] , 9); + FFF(ccc, ddd, eee, aaa, bbb, X[ 1] , 12); + FFF(bbb, ccc, ddd, eee, aaa, X[ 5] , 5); + FFF(aaa, bbb, ccc, ddd, eee, X[ 8] , 14); + FFF(eee, aaa, bbb, ccc, ddd, X[ 7] , 6); + FFF(ddd, eee, aaa, bbb, ccc, X[ 6] , 8); + FFF(ccc, ddd, eee, aaa, bbb, X[ 2] , 13); + FFF(bbb, ccc, ddd, eee, aaa, X[13] , 6); + FFF(aaa, bbb, ccc, ddd, eee, X[14] , 5); + FFF(eee, aaa, bbb, ccc, ddd, X[ 0] , 15); + FFF(ddd, eee, aaa, bbb, ccc, X[ 3] , 13); + FFF(ccc, ddd, eee, aaa, bbb, X[ 9] , 11); + FFF(bbb, ccc, ddd, eee, aaa, X[11] , 11); + + /* combine results */ + ddd += cc + md->state[1]; /* final result for md->state[0] */ + md->state[1] = md->state[2] + dd + eee; + md->state[2] = md->state[3] + ee + aaa; + md->state[3] = md->state[4] + aa + bbb; + md->state[4] = md->state[0] + bb + ccc; + md->state[0] = ddd; + + return 0; +} + +/** + Initialize the hash state + @param md The hash state you wish to initialize + @return 0 if successful + */ +int rmd160_vinit(struct rmd160_vstate * md) +{ + md->state[0] = 0x67452301UL; + md->state[1] = 0xefcdab89UL; + md->state[2] = 0x98badcfeUL; + md->state[3] = 0x10325476UL; + md->state[4] = 0xc3d2e1f0UL; + md->curlen = 0; + md->length = 0; + return 0; +} +#define HASH_PROCESS(func_name, compress_name, state_var, block_size) \ +int func_name (struct rmd160_vstate * md, const unsigned char *in, unsigned long inlen) \ +{ \ +unsigned long n; \ +int err; \ +if (md->curlen > sizeof(md->buf)) { \ +return -1; \ +} \ +while (inlen > 0) { \ +if (md->curlen == 0 && inlen >= block_size) { \ +if ((err = compress_name (md, (unsigned char *)in)) != 0) { \ +return err; \ +} \ +md->length += block_size * 8; \ +in += block_size; \ +inlen -= block_size; \ +} else { \ +n = MIN(inlen, (block_size - md->curlen)); \ +memcpy(md->buf + md->curlen, in, (size_t)n); \ +md->curlen += n; \ +in += n; \ +inlen -= n; \ +if (md->curlen == block_size) { \ +if ((err = compress_name (md, md->buf)) != 0) { \ +return err; \ +} \ +md->length += 8*block_size; \ +md->curlen = 0; \ +} \ +} \ +} \ +return 0; \ +} + +/** + Process a block of memory though the hash + @param md The hash state + @param in The data to hash + @param inlen The length of the data (octets) + @return 0 if successful + */ +HASH_PROCESS(rmd160_vprocess, rmd160_vcompress, rmd160, 64) + +/** + Terminate the hash to get the digest + @param md The hash state + @param out [out] The destination of the hash (20 bytes) + @return 0 if successful + */ +int rmd160_vdone(struct rmd160_vstate * md, unsigned char *out) +{ + int i; + if (md->curlen >= sizeof(md->buf)) { + return -1; + } + /* increase the length of the message */ + md->length += md->curlen * 8; + + /* append the '1' bit */ + md->buf[md->curlen++] = (unsigned char)0x80; + + /* if the length is currently above 56 bytes we append zeros + * then compress. Then we can fall back to padding zeros and length + * encoding like normal. + */ + if (md->curlen > 56) { + while (md->curlen < 64) { + md->buf[md->curlen++] = (unsigned char)0; + } + rmd160_vcompress(md, md->buf); + md->curlen = 0; + } + /* pad upto 56 bytes of zeroes */ + while (md->curlen < 56) { + md->buf[md->curlen++] = (unsigned char)0; + } + /* store length */ + STORE64L(md->length, md->buf+56); + rmd160_vcompress(md, md->buf); + /* copy output */ + for (i = 0; i < 5; i++) { + STORE32L(md->state[i], out+(4*i)); + } + return 0; +} + +void calc_rmd160(char deprecated[41],uint8_t buf[20],uint8_t *msg,int32_t len) +{ + struct rmd160_vstate md; + rmd160_vinit(&md); + rmd160_vprocess(&md,msg,len); + rmd160_vdone(&md, buf); +} +#undef F +#undef G +#undef H +#undef I +#undef J +#undef ROLc +#undef FF +#undef GG +#undef HH +#undef II +#undef JJ +#undef FFF +#undef GGG +#undef HHH +#undef III +#undef JJJ + +static const uint32_t crc32_tab[] = { + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, + 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, + 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, + 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, + 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, + 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, + 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, + 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, + 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, + 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, + 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, + 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, + 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, + 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, + 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, + 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, + 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, + 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, + 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, + 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, + 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, + 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, + 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, + 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, + 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, + 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, + 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d +}; + +uint32_t calc_crc32(uint32_t crc,const void *buf,size_t size) +{ + const uint8_t *p; + + p = (const uint8_t *)buf; + crc = crc ^ ~0U; + + while (size--) + crc = crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8); + + return crc ^ ~0U; +} + +void calc_rmd160_sha256(uint8_t rmd160[20],uint8_t *data,int32_t datalen) +{ + bits256 hash; + vcalc_sha256(0,hash.bytes,data,datalen); + calc_rmd160(0,rmd160,hash.bytes,sizeof(hash)); +} + +int32_t iguana_rwnum(int32_t rwflag,uint8_t *serialized,int32_t len,void *endianedp) +{ + int32_t i; uint64_t x; + if ( rwflag == 0 ) + { + x = 0; + for (i=len-1; i>=0; i--) + { + x <<= 8; + x |= serialized[i]; + } + switch ( len ) + { + case 1: *(uint8_t *)endianedp = (uint8_t)x; break; + case 2: *(uint16_t *)endianedp = (uint16_t)x; break; + case 4: *(uint32_t *)endianedp = (uint32_t)x; break; + case 8: *(uint64_t *)endianedp = (uint64_t)x; break; + } + } + else + { + x = 0; + switch ( len ) + { + case 1: x = *(uint8_t *)endianedp; break; + case 2: x = *(uint16_t *)endianedp; break; + case 4: x = *(uint32_t *)endianedp; break; + case 8: x = *(uint64_t *)endianedp; break; + } + for (i=0; i>= 8) + serialized[i] = (uint8_t)(x & 0xff); + } + return(len); +} + +uint32_t komodo_assetmagic(char *symbol,uint64_t supply,uint8_t *extraptr,int32_t extralen) +{ + uint8_t buf[512]; uint32_t crc0=0; int32_t len = 0; bits256 hash; + if ( strcmp(symbol,"KMD") == 0 ) + return(0x8de4eef9); + len = iguana_rwnum(1,&buf[len],sizeof(supply),(void *)&supply); + strcpy((char *)&buf[len],symbol); + len += strlen(symbol); + if ( extraptr != 0 && extralen != 0 ) + { + vcalc_sha256(0,hash.bytes,extraptr,extralen); + crc0 = hash.uints[0]; + } + return(calc_crc32(crc0,buf,len)); +} + +uint16_t komodo_assetport(uint32_t magic,int32_t extralen) +{ + if ( magic == 0x8de4eef9 ) + return(7770); + else if ( extralen == 0 ) + return(8000 + (magic % 7777)); + else return(16000 + (magic % 49500)); +} + +uint16_t komodo_port(char *symbol,uint64_t supply,uint32_t *magicp,uint8_t *extraptr,int32_t extralen) +{ + if ( symbol == 0 || symbol[0] == 0 || strcmp("KMD",symbol) == 0 ) + { + *magicp = 0x8de4eef9; + return(7770); + } + *magicp = komodo_assetmagic(symbol,supply,extraptr,extralen); + return(komodo_assetport(*magicp,extralen)); +} + +uint16_t komodo_calcport(char *name,uint64_t supply,uint64_t endsubsidy,uint64_t reward,uint64_t halving,uint64_t decay) +{ + uint8_t extrabuf[4096],*extraptr=0; int32_t extralen=0; + if ( halving != 0 && halving < 1440 ) + { + halving = 1440; + printf("halving must be at least 1440 blocks\n"); + } + if ( decay == 100000000 && endsubsidy == 0 ) + { + decay = 0; + printf("decay of 100000000 means linear and that needs endsubsidy\n"); + } + else if ( decay > 100000000 ) + { + decay = 0; + printf("decay cant be more than 100000000\n"); + } + if ( endsubsidy != 0 || reward != 0 || halving != 0 || decay != 0 || ASSETCHAINS_COMMISSION != 0 ) + { + printf("end.%llu reward.%llu halving.%llu decay.%llu perc.%llu\n",(long long)endsubsidy,(long long)reward,(long long)halving,(long long)decay,(long long)ASSETCHAINS_COMMISSION); + extraptr = extrabuf; + memcpy(extraptr,ASSETCHAINS_OVERRIDE_PUBKEY33,33), extralen = 33; + extralen += iguana_rwnum(1,&extraptr[extralen],sizeof(endsubsidy),(void *)&endsubsidy); + extralen += iguana_rwnum(1,&extraptr[extralen],sizeof(reward),(void *)&reward); + extralen += iguana_rwnum(1,&extraptr[extralen],sizeof(halving),(void *)&halving); + extralen += iguana_rwnum(1,&extraptr[extralen],sizeof(decay),(void *)&decay); + extralen += iguana_rwnum(1,&extraptr[extralen],sizeof(ASSETCHAINS_COMMISSION),(void *)&ASSETCHAINS_COMMISSION); + } + return(komodo_port(name,supply,&ASSETCHAINS_MAGIC,extraptr,extralen)); +} + +int main(int argc, char * argv[]) +{ + uint16_t rpcport; uint64_t supply=10,endsubsidy,reward,halving,decay; + endsubsidy = reward = halving = decay = 0; + if ( argc < 2 ) + { + printf("%s usage: name supply endsubsidy reward halving decay\n",argv[0]); + return(-1); + } + if ( argc > 2 ) + supply = (long long)atof(argv[2]); + if ( argc > 3 ) + endsubsidy = (long long)atof(argv[3]); + if ( argc > 4 ) + reward = (long long)atof(argv[4]); + if ( argc > 5 ) + halving = (long long)atof(argv[5]); + if ( argc > 6 ) + decay = (long long)atof(argv[6]); + rpcport = 1 + komodo_calcport(argv[1],supply,endsubsidy,reward,halving,decay); + printf("%s supply=%llu endsubsidy=%llu reward=%llu halving=%llu decay=%llu -> rpcport %u\n",argv[1],(long long)supply,(long long)endsubsidy,(long long)reward,(long long)halving,(long long)decay,rpcport); + return(0); +} From 9e5384c9b4a1615889450a211ff946f00a26cf63 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 13:07:25 +0300 Subject: [PATCH 0792/1062] Test --- src/komodo_utils.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_utils.h b/src/komodo_utils.h index 999200c13..34b55a086 100644 --- a/src/komodo_utils.h +++ b/src/komodo_utils.h @@ -1564,7 +1564,7 @@ void komodo_args(char *argv0) } if ( ASSETCHAINS_ENDSUBSIDY != 0 || ASSETCHAINS_REWARD != 0 || ASSETCHAINS_HALVING != 0 || ASSETCHAINS_DECAY != 0 || ASSETCHAINS_COMMISSION != 0 ) { - printf("end.%llu reward.%llu halving.%llu decay.%llu perc.%llu\n",(long long)ASSETCHAINS_ENDSUBSIDY,(long long)ASSETCHAINS_REWARD,(long long)ASSETCHAINS_HALVING,(long long)ASSETCHAINS_DECAY,(long long)ASSETCHAINS_COMMISSION); + fprintf(stderr,"end.%llu reward.%llu halving.%llu decay.%llu perc.%llu\n",(long long)ASSETCHAINS_ENDSUBSIDY,(long long)ASSETCHAINS_REWARD,(long long)ASSETCHAINS_HALVING,(long long)ASSETCHAINS_DECAY,(long long)ASSETCHAINS_COMMISSION); extraptr = extrabuf; memcpy(extraptr,ASSETCHAINS_OVERRIDE_PUBKEY33,33), extralen = 33; extralen += iguana_rwnum(1,&extraptr[extralen],sizeof(ASSETCHAINS_ENDSUBSIDY),(void *)&ASSETCHAINS_ENDSUBSIDY); From c244ea42457e7e4fa0456c2dced34156c88f3956 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 13:14:08 +0300 Subject: [PATCH 0793/1062] komodo_port.c -gen option --- src/komodo_port.c | 60 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 46 insertions(+), 14 deletions(-) diff --git a/src/komodo_port.c b/src/komodo_port.c index 11d3ce5b4..d866ea5c8 100644 --- a/src/komodo_port.c +++ b/src/komodo_port.c @@ -825,24 +825,56 @@ uint16_t komodo_calcport(char *name,uint64_t supply,uint64_t endsubsidy,uint64_t int main(int argc, char * argv[]) { - uint16_t rpcport; uint64_t supply=10,endsubsidy,reward,halving,decay; + uint16_t rpcport; int32_t i,j,offset=0,num = 1; uint64_t supply=10,endsubsidy,reward,halving,decay; uint8_t *allocated=0; endsubsidy = reward = halving = decay = 0; if ( argc < 2 ) { - printf("%s usage: name supply endsubsidy reward halving decay\n",argv[0]); + printf("%s name supply endsubsidy reward halving decay\n",argv[0]); + printf("%s -gen num name supply endsubsidy reward halving decay\n",argv[0]); return(-1); } - if ( argc > 2 ) - supply = (long long)atof(argv[2]); - if ( argc > 3 ) - endsubsidy = (long long)atof(argv[3]); - if ( argc > 4 ) - reward = (long long)atof(argv[4]); - if ( argc > 5 ) - halving = (long long)atof(argv[5]); - if ( argc > 6 ) - decay = (long long)atof(argv[6]); - rpcport = 1 + komodo_calcport(argv[1],supply,endsubsidy,reward,halving,decay); - printf("%s supply=%llu endsubsidy=%llu reward=%llu halving=%llu decay=%llu -> rpcport %u\n",argv[1],(long long)supply,(long long)endsubsidy,(long long)reward,(long long)halving,(long long)decay,rpcport); + if ( strcmp(argv[1],"-gen") == 0 ) + { + num = atoi(argv[2]); + offset = 2; + allocated = calloc(1,1 << 16); + } + if ( argc > offset + 2 ) + supply = (long long)atof(argv[offset + 2]); + if ( argc > offset + 3 ) + endsubsidy = (long long)atof(argv[offset + 3]); + if ( argc > offset + 4 ) + reward = (long long)atof(argv[offset + 4]); + if ( argc > offset + 5 ) + halving = (long long)atof(argv[offset + 5]); + if ( argc > offset + 6 ) + decay = (long long)atof(argv[offset + 6]); + rpcport = 1 + komodo_calcport(argv[offset + 1],supply,endsubsidy,reward,halving,decay); + printf("./komodod -ac_name=%s -ac_supply=%llu -ac_end=%llu -ac_reward=%llu -ac_halving=%llu -ac_decay=%llu & # rpcport %u\n",argv[offset + 1],(long long)supply,(long long)endsubsidy,(long long)reward,(long long)halving,(long long)decay,rpcport); + if ( allocated != 0 ) + { + char name[64],newname[64]; + strcpy(name,argv[offset + 1]); + allocated[rpcport] = 1; + allocated[rpcport-1] = 1; + for (i=0; i Date: Sat, 7 Apr 2018 14:27:17 +0300 Subject: [PATCH 0794/1062] Sane -ac_perc --- src/komodo_gateway.h | 37 ++++++++++++++++++++++++------------- src/miner.cpp | 13 +++++++++++++ 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index c8fc03980..cc005d9f8 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -650,6 +650,22 @@ int32_t komodo_bannedset(int32_t *indallvoutsp,uint256 *array,int32_t max) void komodo_passport_iteration(); +uint64_t komodo_commission(const CBlock &block) +{ + int32_t i,j,n,txn_count; uint64_t total = 0; + txn_count = block.vtx.size(); + for (i=0; i 1 ) { - script = (uint8_t *)block.vtx[0].vout[0].scriptPubKey.data(); + script = (uint8_t *)block.vtx[0].vout[1].scriptPubKey.data(); if ( script[0] != 33 || script[34] != OP_CHECKSIG || memcmp(script+1,ASSETCHAINS_OVERRIDE_PUBKEY33,33) != 0 ) return(-1); - total = 0; - for (i=1; i Date: Sat, 7 Apr 2018 14:28:37 +0300 Subject: [PATCH 0795/1062] Test --- src/komodo_gateway.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index cc005d9f8..0ba6ec2d3 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -741,7 +741,7 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block) // verify above } return(0); } - if ( ASSETCHAINS_SYMBOL[0] != 0 && ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 && ASSETCHAINS_COMMISSION != 0 && block.vtx[0].size() > 1 ) + if ( ASSETCHAINS_SYMBOL[0] != 0 && ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 && ASSETCHAINS_COMMISSION != 0 && block.vtx[0].vout.size() > 1 ) { script = (uint8_t *)block.vtx[0].vout[1].scriptPubKey.data(); if ( script[0] != 33 || script[34] != OP_CHECKSIG || memcmp(script+1,ASSETCHAINS_OVERRIDE_PUBKEY33,33) != 0 ) From c48fd6e3180c9ef8d9adf0ea70016fdcde86a71d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 14:30:34 +0300 Subject: [PATCH 0796/1062] Test --- src/miner.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/miner.cpp b/src/miner.cpp index c14c4286a..f49de0314 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -398,6 +398,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) txNew.vin[0].scriptSig = CScript() << nHeight << OP_0; if ( ASSETCHAINS_SYMBOL[0] != 0 && ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 && ASSETCHAINS_COMMISSION != 0 && (checktoshis= komodo_commission(block)) != 0 ) { + int32_t i; uint8_t *ptr; txNew.vout.resize(2); txNew.vout[1].nValue = checktoshis; txNew.vout[1].scriptPubKey.resize(35); From f9155fec3ca21159605046f364775abd414e2a63 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 14:32:54 +0300 Subject: [PATCH 0797/1062] Test --- src/miner.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/miner.cpp b/src/miner.cpp index f49de0314..1e55a2f09 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -190,7 +190,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) pblock->nTime = GetAdjustedTime(); const int64_t nMedianTimePast = pindexPrev->GetMedianTimePast(); CCoinsViewCache view(pcoinsTip); - uint32_t expired; + uint32_t expired; uint64_t commission; // Priority order to process transactions list vOrphan; // list memory doesn't move @@ -396,11 +396,11 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) // Add fees txNew.vout[0].nValue += nFees; txNew.vin[0].scriptSig = CScript() << nHeight << OP_0; - if ( ASSETCHAINS_SYMBOL[0] != 0 && ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 && ASSETCHAINS_COMMISSION != 0 && (checktoshis= komodo_commission(block)) != 0 ) + if ( ASSETCHAINS_SYMBOL[0] != 0 && ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 && ASSETCHAINS_COMMISSION != 0 && (commission= komodo_commission(pblocktemplate->block)) != 0 ) { int32_t i; uint8_t *ptr; txNew.vout.resize(2); - txNew.vout[1].nValue = checktoshis; + txNew.vout[1].nValue = commission; txNew.vout[1].scriptPubKey.resize(35); ptr = (uint8_t *)txNew.vout[1].scriptPubKey.data(); ptr[0] = 33; From 7313172ace3fea6d9f2f631abc581fc53ab4b9bb Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 14:40:38 +0300 Subject: [PATCH 0798/1062] Test --- src/komodo_gateway.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 0ba6ec2d3..f061a5dbe 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -660,9 +660,13 @@ uint64_t komodo_commission(const CBlock &block) for (j=0; j %.8f\n",dstr(total),dstr((total * ASSETCHAINS_COMMISSION) / COIN)); return((total * ASSETCHAINS_COMMISSION) / COIN); } From 72af1b7ea5ddf5ed89effc4adcff163bba6cb1b3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 14:44:09 +0300 Subject: [PATCH 0799/1062] Test --- src/komodo_gateway.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index f061a5dbe..b40d0dad1 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -652,7 +652,7 @@ void komodo_passport_iteration(); uint64_t komodo_commission(const CBlock &block) { - int32_t i,j,n,txn_count; uint64_t total = 0; + int32_t i,j,n=0,txn_count; uint64_t total = 0; txn_count = block.vtx.size(); for (i=0; i %.8f\n",dstr(total),dstr((total * ASSETCHAINS_COMMISSION) / COIN)); + fprintf(stderr,"txn.%d n.%d commission total %.8f -> %.8f\n",txn_count,n,dstr(total),dstr((total * ASSETCHAINS_COMMISSION) / COIN)); return((total * ASSETCHAINS_COMMISSION) / COIN); } From 418ff77170e7097f3d7d10c624adcbaaacd964f5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 14:48:03 +0300 Subject: [PATCH 0800/1062] Test --- src/komodo_gateway.h | 2 +- src/miner.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index b40d0dad1..f34ca1e3d 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -659,9 +659,9 @@ uint64_t komodo_commission(const CBlock &block) n = block.vtx[i].vout.size(); for (j=0; jblock)) != 0 ) + if ( ASSETCHAINS_SYMBOL[0] != 0 && ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 && ASSETCHAINS_COMMISSION != 0 && (commission= komodo_commission(*pblock)) != 0 ) { int32_t i; uint8_t *ptr; txNew.vout.resize(2); From c000c9ca1d6a9b423eff9a9be27651754da66c63 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 14:55:14 +0300 Subject: [PATCH 0801/1062] Test --- src/komodo_utils.h | 2 +- src/miner.cpp | 25 +++++++++++++------------ 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/komodo_utils.h b/src/komodo_utils.h index 34b55a086..4788b039e 100644 --- a/src/komodo_utils.h +++ b/src/komodo_utils.h @@ -1564,7 +1564,7 @@ void komodo_args(char *argv0) } if ( ASSETCHAINS_ENDSUBSIDY != 0 || ASSETCHAINS_REWARD != 0 || ASSETCHAINS_HALVING != 0 || ASSETCHAINS_DECAY != 0 || ASSETCHAINS_COMMISSION != 0 ) { - fprintf(stderr,"end.%llu reward.%llu halving.%llu decay.%llu perc.%llu\n",(long long)ASSETCHAINS_ENDSUBSIDY,(long long)ASSETCHAINS_REWARD,(long long)ASSETCHAINS_HALVING,(long long)ASSETCHAINS_DECAY,(long long)ASSETCHAINS_COMMISSION); + fprintf(stderr,"end.%llu reward.%llu halving.%llu decay.%llu perc %.4f [%02x]\n",(long long)ASSETCHAINS_ENDSUBSIDY,(long long)ASSETCHAINS_REWARD,(long long)ASSETCHAINS_HALVING,(long long)ASSETCHAINS_DECAY,dstr(ASSETCHAINS_COMMISSION)*100,ASSETCHAINS_OVERRIDE_PUBKEY33[0]); extraptr = extrabuf; memcpy(extraptr,ASSETCHAINS_OVERRIDE_PUBKEY33,33), extralen = 33; extralen += iguana_rwnum(1,&extraptr[extralen],sizeof(ASSETCHAINS_ENDSUBSIDY),(void *)&ASSETCHAINS_ENDSUBSIDY); diff --git a/src/miner.cpp b/src/miner.cpp index b61ebe936..de641d5c8 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -396,18 +396,6 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) // Add fees txNew.vout[0].nValue += nFees; txNew.vin[0].scriptSig = CScript() << nHeight << OP_0; - if ( ASSETCHAINS_SYMBOL[0] != 0 && ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 && ASSETCHAINS_COMMISSION != 0 && (commission= komodo_commission(*pblock)) != 0 ) - { - int32_t i; uint8_t *ptr; - txNew.vout.resize(2); - txNew.vout[1].nValue = commission; - txNew.vout[1].scriptPubKey.resize(35); - ptr = (uint8_t *)txNew.vout[1].scriptPubKey.data(); - ptr[0] = 33; - for (i=0; i<33; i++) - ptr[i+1] = ASSETCHAINS_OVERRIDE_PUBKEY33[i]; - ptr[34] = OP_CHECKSIG; - } /*if ( ASSETCHAINS_SYMBOL[0] == 0 ) { @@ -434,6 +422,19 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) }*/ pblock->vtx[0] = txNew; + if ( ASSETCHAINS_SYMBOL[0] != 0 && ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 && ASSETCHAINS_COMMISSION != 0 && (commission= komodo_commission(pblocktemplate->block)) != 0 ) + { + int32_t i; uint8_t *ptr; + txNew.vout.resize(2); + txNew.vout[1].nValue = commission; + txNew.vout[1].scriptPubKey.resize(35); + ptr = (uint8_t *)txNew.vout[1].scriptPubKey.data(); + ptr[0] = 33; + for (i=0; i<33; i++) + ptr[i+1] = ASSETCHAINS_OVERRIDE_PUBKEY33[i]; + ptr[34] = OP_CHECKSIG; + printf("autocreate commision vout\n"); + } pblocktemplate->vTxFees[0] = -nFees; // Randomise nonce arith_uint256 nonce = UintToArith256(GetRandHash()); From 105aceb5a8c8a5bc055998917a605056258f3c12 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 14:57:47 +0300 Subject: [PATCH 0802/1062] Test --- src/miner.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/miner.cpp b/src/miner.cpp index de641d5c8..74bbbefc2 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -425,10 +425,10 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) if ( ASSETCHAINS_SYMBOL[0] != 0 && ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 && ASSETCHAINS_COMMISSION != 0 && (commission= komodo_commission(pblocktemplate->block)) != 0 ) { int32_t i; uint8_t *ptr; - txNew.vout.resize(2); - txNew.vout[1].nValue = commission; - txNew.vout[1].scriptPubKey.resize(35); - ptr = (uint8_t *)txNew.vout[1].scriptPubKey.data(); + pblock->vtx[0].resize(2); + pblock->vtx[0].vout[1].nValue = commission; + pblock->vtx[0].vout[1].scriptPubKey.resize(35); + ptr = (uint8_t *)pblock->vtx[0].vout[1].scriptPubKey.data(); ptr[0] = 33; for (i=0; i<33; i++) ptr[i+1] = ASSETCHAINS_OVERRIDE_PUBKEY33[i]; From 9ed1be037d11577260b855f6e87286c431920865 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 14:59:11 +0300 Subject: [PATCH 0803/1062] Test --- src/miner.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/miner.cpp b/src/miner.cpp index 74bbbefc2..56b21492f 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -422,18 +422,19 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) }*/ pblock->vtx[0] = txNew; - if ( ASSETCHAINS_SYMBOL[0] != 0 && ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 && ASSETCHAINS_COMMISSION != 0 && (commission= komodo_commission(pblocktemplate->block)) != 0 ) + if ( ASSETCHAINS_SYMBOL[0] != 0 && ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 && ASSETCHAINS_COMMISSION != 0 && (commission= komodo_commission(*pblock)) != 0 ) { int32_t i; uint8_t *ptr; - pblock->vtx[0].resize(2); - pblock->vtx[0].vout[1].nValue = commission; - pblock->vtx[0].vout[1].scriptPubKey.resize(35); - ptr = (uint8_t *)pblock->vtx[0].vout[1].scriptPubKey.data(); + txNew.vout.resize(2); + txNew.vout[1].nValue = commission; + txNew.vout[1].scriptPubKey.resize(35); + ptr = (uint8_t *)txNew.vout[1].scriptPubKey.data(); ptr[0] = 33; for (i=0; i<33; i++) ptr[i+1] = ASSETCHAINS_OVERRIDE_PUBKEY33[i]; ptr[34] = OP_CHECKSIG; printf("autocreate commision vout\n"); + pblock->vtx[0] = txNew; } pblocktemplate->vTxFees[0] = -nFees; // Randomise nonce From 852af44bb5fa02f38997e7344b4aa041af05482b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 15:00:40 +0300 Subject: [PATCH 0804/1062] Test --- src/miner.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/miner.cpp b/src/miner.cpp index 56b21492f..22f1ed10c 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -422,7 +422,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) }*/ pblock->vtx[0] = txNew; - if ( ASSETCHAINS_SYMBOL[0] != 0 && ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 && ASSETCHAINS_COMMISSION != 0 && (commission= komodo_commission(*pblock)) != 0 ) + if ( ASSETCHAINS_SYMBOL[0] != 0 && ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 && ASSETCHAINS_COMMISSION != 0 && (commission= komodo_commission(pblocktemplate->block)) != 0 ) { int32_t i; uint8_t *ptr; txNew.vout.resize(2); From c4c3dbe2502e74d8eeb7a62589a044e16a3b2b31 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 15:08:32 +0300 Subject: [PATCH 0805/1062] Test --- src/komodo_utils.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/komodo_utils.h b/src/komodo_utils.h index 4788b039e..4e4cf1440 100644 --- a/src/komodo_utils.h +++ b/src/komodo_utils.h @@ -1582,6 +1582,7 @@ void komodo_args(char *argv0) else if ( ASSETCHAINS_REWARD == 0 ) MAX_MONEY = (ASSETCHAINS_SUPPLY+1) * SATOSHIDEN; else MAX_MONEY = (ASSETCHAINS_SUPPLY+1) * SATOSHIDEN + ASSETCHAINS_REWARD * (ASSETCHAINS_ENDSUBSIDY==0 ? 10000000 : ASSETCHAINS_ENDSUBSIDY); + MAX_MONEY += (MAX_MONEY * ASSETCHAINS_COMMISSOION) / COIN; //printf("baseid.%d MAX_MONEY.%s %.8f\n",baseid,ASSETCHAINS_SYMBOL,(double)MAX_MONEY/SATOSHIDEN); ASSETCHAINS_PORT = komodo_port(ASSETCHAINS_SYMBOL,ASSETCHAINS_SUPPLY,&ASSETCHAINS_MAGIC,extraptr,extralen); while ( (dirname= (char *)GetDataDir(false).string().c_str()) == 0 || dirname[0] == 0 ) From ecf5f2b37268d30a604c27f39e132318ea11b700 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 15:09:17 +0300 Subject: [PATCH 0806/1062] Test --- src/komodo_utils.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_utils.h b/src/komodo_utils.h index 4e4cf1440..6268c6108 100644 --- a/src/komodo_utils.h +++ b/src/komodo_utils.h @@ -1582,7 +1582,7 @@ void komodo_args(char *argv0) else if ( ASSETCHAINS_REWARD == 0 ) MAX_MONEY = (ASSETCHAINS_SUPPLY+1) * SATOSHIDEN; else MAX_MONEY = (ASSETCHAINS_SUPPLY+1) * SATOSHIDEN + ASSETCHAINS_REWARD * (ASSETCHAINS_ENDSUBSIDY==0 ? 10000000 : ASSETCHAINS_ENDSUBSIDY); - MAX_MONEY += (MAX_MONEY * ASSETCHAINS_COMMISSOION) / COIN; + MAX_MONEY += (MAX_MONEY * ASSETCHAINS_COMMISSION) / COIN; //printf("baseid.%d MAX_MONEY.%s %.8f\n",baseid,ASSETCHAINS_SYMBOL,(double)MAX_MONEY/SATOSHIDEN); ASSETCHAINS_PORT = komodo_port(ASSETCHAINS_SYMBOL,ASSETCHAINS_SUPPLY,&ASSETCHAINS_MAGIC,extraptr,extralen); while ( (dirname= (char *)GetDataDir(false).string().c_str()) == 0 || dirname[0] == 0 ) From 10ad05f68ae75f7d41c25531b74d9892d11cc9ff Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 15:10:24 +0300 Subject: [PATCH 0807/1062] Test --- src/komodo_utils.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_utils.h b/src/komodo_utils.h index 6268c6108..7c189be50 100644 --- a/src/komodo_utils.h +++ b/src/komodo_utils.h @@ -1582,7 +1582,7 @@ void komodo_args(char *argv0) else if ( ASSETCHAINS_REWARD == 0 ) MAX_MONEY = (ASSETCHAINS_SUPPLY+1) * SATOSHIDEN; else MAX_MONEY = (ASSETCHAINS_SUPPLY+1) * SATOSHIDEN + ASSETCHAINS_REWARD * (ASSETCHAINS_ENDSUBSIDY==0 ? 10000000 : ASSETCHAINS_ENDSUBSIDY); - MAX_MONEY += (MAX_MONEY * ASSETCHAINS_COMMISSION) / COIN; + MAX_MONEY += (MAX_MONEY * ASSETCHAINS_COMMISSION) / SATOSHIDEN; //printf("baseid.%d MAX_MONEY.%s %.8f\n",baseid,ASSETCHAINS_SYMBOL,(double)MAX_MONEY/SATOSHIDEN); ASSETCHAINS_PORT = komodo_port(ASSETCHAINS_SYMBOL,ASSETCHAINS_SUPPLY,&ASSETCHAINS_MAGIC,extraptr,extralen); while ( (dirname= (char *)GetDataDir(false).string().c_str()) == 0 || dirname[0] == 0 ) From a43401b400f8f90bfdf5bbe5f3367eb616f17b4c Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 15:19:20 +0300 Subject: [PATCH 0808/1062] Test --- src/komodo_gateway.h | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index f34ca1e3d..89b4b0c93 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -740,25 +740,25 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block) // verify above } else { - if ( overflow != 0 || total > 0 ) + if ( ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 && ASSETCHAINS_COMMISSION != 0 && block.vtx[0].vout.size() > 1 ) + { + script = (uint8_t *)block.vtx[0].vout[1].scriptPubKey.data(); + if ( script[0] != 33 || script[34] != OP_CHECKSIG || memcmp(script+1,ASSETCHAINS_OVERRIDE_PUBKEY33,33) != 0 ) + return(-1); + if ( (checktoshis = komodo_commission(block)) != 0 ) + { + if ( block.vtx[0].vout.size() < 2 || block.vtx[0].vout[1].nValue != checktoshis ) + { + fprintf(stderr,"checktoshis %.8f vs actual vout[1] %.8f\n",dstr(checktoshis),dstr(block.vtx[0].vout[1].nValue)); + return(-1); + } + } + } + else if ( overflow != 0 || total > 0 ) return(-1); } return(0); } - if ( ASSETCHAINS_SYMBOL[0] != 0 && ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 && ASSETCHAINS_COMMISSION != 0 && block.vtx[0].vout.size() > 1 ) - { - script = (uint8_t *)block.vtx[0].vout[1].scriptPubKey.data(); - if ( script[0] != 33 || script[34] != OP_CHECKSIG || memcmp(script+1,ASSETCHAINS_OVERRIDE_PUBKEY33,33) != 0 ) - return(-1); - if ( (checktoshis = komodo_commission(block)) != 0 ) - { - if ( block.vtx[0].vout.size() < 2 || block.vtx[0].vout[1].nValue != checktoshis ) - { - fprintf(stderr,"checktoshis %.8f vs actual vout[1] %.8f\n",dstr(checktoshis),dstr(block.vtx[0].vout[1].nValue)); - return(-1); - } - } - } /* //fprintf(stderr,"ht.%d n.%d nValue %.8f (%d %d %d)\n",height,n,dstr(block.vtx[0].vout[1].nValue),KOMODO_PAX,komodo_isrealtime(&ht),KOMODO_PASSPORT_INITDONE); offset += komodo_scriptitemlen(&opretlen,&script[offset]); From 0587a0e53778cf4253d53f9f59668d1d51d3184c Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 15:25:09 +0300 Subject: [PATCH 0809/1062] CTEST --- src/ctest | 1 + 1 file changed, 1 insertion(+) create mode 100755 src/ctest diff --git a/src/ctest b/src/ctest new file mode 100755 index 000000000..1bb1a92a8 --- /dev/null +++ b/src/ctest @@ -0,0 +1 @@ +./komodod -ac_name=CTEST -ac_supply=1000000 -ac_perc=100000 -ac_pubkey=02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92 -ac_reward=300000000 -addnode=136.243.58.134 & From 146d2aa22d13dfa14ba8b93e6e87f30efc3ba12a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 15:26:50 +0300 Subject: [PATCH 0810/1062] Test --- src/komodo_gateway.h | 4 ++-- src/miner.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 89b4b0c93..7e4666d4b 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -659,14 +659,14 @@ uint64_t komodo_commission(const CBlock &block) n = block.vtx[i].vout.size(); for (j=0; j %.8f\n",txn_count,n,dstr(total),dstr((total * ASSETCHAINS_COMMISSION) / COIN)); + //fprintf(stderr,"txn.%d n.%d commission total %.8f -> %.8f\n",txn_count,n,dstr(total),dstr((total * ASSETCHAINS_COMMISSION) / COIN)); return((total * ASSETCHAINS_COMMISSION) / COIN); } diff --git a/src/miner.cpp b/src/miner.cpp index 22f1ed10c..46fcc342a 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -433,7 +433,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) for (i=0; i<33; i++) ptr[i+1] = ASSETCHAINS_OVERRIDE_PUBKEY33[i]; ptr[34] = OP_CHECKSIG; - printf("autocreate commision vout\n"); + //printf("autocreate commision vout\n"); pblock->vtx[0] = txNew; } pblocktemplate->vTxFees[0] = -nFees; From de4a435c680da069eaff08adb35f7986a1cf7dbe Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 15:42:18 +0300 Subject: [PATCH 0811/1062] Test --- src/komodo_gateway.h | 4 ++-- src/main.cpp | 12 +++++++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 7e4666d4b..50641b589 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -751,10 +751,10 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block) // verify above { fprintf(stderr,"checktoshis %.8f vs actual vout[1] %.8f\n",dstr(checktoshis),dstr(block.vtx[0].vout[1].nValue)); return(-1); - } + } else return(0); } } - else if ( overflow != 0 || total > 0 ) + if ( overflow != 0 || total > 0 ) return(-1); } return(0); diff --git a/src/main.cpp b/src/main.cpp index f45ad7bad..a0b4084e8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2585,6 +2585,16 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin LogPrint("bench", " - Connect %u transactions: %.2fms (%.3fms/tx, %.3fms/txin) [%.2fs]\n", (unsigned)block.vtx.size(), 0.001 * (nTime1 - nTimeStart), 0.001 * (nTime1 - nTimeStart) / block.vtx.size(), nInputs <= 1 ? 0 : 0.001 * (nTime1 - nTimeStart) / (nInputs-1), nTimeConnect * 0.000001); CAmount blockReward = nFees + GetBlockSubsidy(pindex->nHeight, chainparams.GetConsensus()) + sum; + if ( ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 && ASSETCHAINS_COMMISSION != 0 && block.vtx[0].vout.size() > 1 ) + { + uint64_t checktoshis; + if ( (checktoshis = komodo_commission(block)) != 0 ) + { + if ( block.vtx[0].vout.size() == 2 && block.vtx[0].vout[1].nValue == checktoshis ) + { + } else fprintf(stderr,"checktoshis %.8f vs actual vout[1] %.8f\n",dstr(checktoshis),dstr(block.vtx[0].vout[1].nValue)); + } + } if ( block.vtx[0].GetValueOut() > blockReward+1 ) { if ( pindex->nHeight >= KOMODO_NOTARIES_HEIGHT1 || block.vtx[0].vout[0].nValue > blockReward ) @@ -2593,7 +2603,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin error("ConnectBlock(): coinbase pays too much (actual=%d vs limit=%d)", block.vtx[0].GetValueOut(), blockReward), REJECT_INVALID, "bad-cb-amount"); - } else if ( NOTARY_PUBKEY33[0] != 0 ) + } //else if ( NOTARY_PUBKEY33[0] != 0 ) fprintf(stderr,"allow nHeight.%d coinbase %.8f vs %.8f interest %.8f\n",(int32_t)pindex->nHeight,dstr(block.vtx[0].GetValueOut()),dstr(blockReward),dstr(sum)); } if (!control.Wait()) From 479f8ea9b8e96978e9a9decd0a15cdaa90dd6724 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 15:48:02 +0300 Subject: [PATCH 0812/1062] Test --- src/komodo_utils.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_utils.h b/src/komodo_utils.h index 7c189be50..3973bf305 100644 --- a/src/komodo_utils.h +++ b/src/komodo_utils.h @@ -1564,7 +1564,7 @@ void komodo_args(char *argv0) } if ( ASSETCHAINS_ENDSUBSIDY != 0 || ASSETCHAINS_REWARD != 0 || ASSETCHAINS_HALVING != 0 || ASSETCHAINS_DECAY != 0 || ASSETCHAINS_COMMISSION != 0 ) { - fprintf(stderr,"end.%llu reward.%llu halving.%llu decay.%llu perc %.4f [%02x]\n",(long long)ASSETCHAINS_ENDSUBSIDY,(long long)ASSETCHAINS_REWARD,(long long)ASSETCHAINS_HALVING,(long long)ASSETCHAINS_DECAY,dstr(ASSETCHAINS_COMMISSION)*100,ASSETCHAINS_OVERRIDE_PUBKEY33[0]); + fprintf(stderr,"end.%llu blocks, reward %.8f halving.%llu blocks, decay.%llu perc %.4f%% ac_pub=[%02x...]\n",(long long)ASSETCHAINS_ENDSUBSIDY,dstr(ASSETCHAINS_REWARD),(long long)ASSETCHAINS_HALVING,(long long)ASSETCHAINS_DECAY,dstr(ASSETCHAINS_COMMISSION)*100,ASSETCHAINS_OVERRIDE_PUBKEY33[0]); extraptr = extrabuf; memcpy(extraptr,ASSETCHAINS_OVERRIDE_PUBKEY33,33), extralen = 33; extralen += iguana_rwnum(1,&extraptr[extralen],sizeof(ASSETCHAINS_ENDSUBSIDY),(void *)&ASSETCHAINS_ENDSUBSIDY); From b7dc56995ed0a7861bb5150d880b51407197f92c Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 15:48:51 +0300 Subject: [PATCH 0813/1062] Test --- src/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index a0b4084e8..fd9443f7c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2591,8 +2591,8 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin if ( (checktoshis = komodo_commission(block)) != 0 ) { if ( block.vtx[0].vout.size() == 2 && block.vtx[0].vout[1].nValue == checktoshis ) - { - } else fprintf(stderr,"checktoshis %.8f vs actual vout[1] %.8f\n",dstr(checktoshis),dstr(block.vtx[0].vout[1].nValue)); + blockReward += checktoshis; + else fprintf(stderr,"checktoshis %.8f vs actual vout[1] %.8f\n",dstr(checktoshis),dstr(block.vtx[0].vout[1].nValue)); } } if ( block.vtx[0].GetValueOut() > blockReward+1 ) From ea1244288b9a478f0942e1ca9ff8e7ee38252527 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 15:50:31 +0300 Subject: [PATCH 0814/1062] Test --- src/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index fd9443f7c..f6b8feba0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2597,13 +2597,13 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin } if ( block.vtx[0].GetValueOut() > blockReward+1 ) { - if ( pindex->nHeight >= KOMODO_NOTARIES_HEIGHT1 || block.vtx[0].vout[0].nValue > blockReward ) + if ( ASSETCHAINS_SYMBOL[0] != 0 || pindex->nHeight >= KOMODO_NOTARIES_HEIGHT1 || block.vtx[0].vout[0].nValue > blockReward ) { return state.DoS(100, error("ConnectBlock(): coinbase pays too much (actual=%d vs limit=%d)", block.vtx[0].GetValueOut(), blockReward), REJECT_INVALID, "bad-cb-amount"); - } //else if ( NOTARY_PUBKEY33[0] != 0 ) + } else if ( NOTARY_PUBKEY33[0] != 0 ) fprintf(stderr,"allow nHeight.%d coinbase %.8f vs %.8f interest %.8f\n",(int32_t)pindex->nHeight,dstr(block.vtx[0].GetValueOut()),dstr(blockReward),dstr(sum)); } if (!control.Wait()) From ce5dd5473e55cbbbaa9aed62bb4147ec904eb218 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 18:53:54 +0300 Subject: [PATCH 0815/1062] Test --- src/komodo_bitcoind.h | 5 ++++- src/komodo_gateway.h | 11 +++++++++-- src/komodo_globals.h | 2 +- src/komodo_kv.h | 2 +- src/komodo_utils.h | 6 ++++-- src/main.cpp | 5 +++-- src/pow.cpp | 12 ------------ src/rpcblockchain.cpp | 1 - 8 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index edd4d6569..cd780e172 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -557,10 +557,11 @@ uint64_t komodo_seed(int32_t height) return(seed); } -uint32_t komodo_txtime(uint256 hash) +uint32_t komodo_txtime(uint64_t *valuep,uint256 hash,int32_t n) { CTransaction tx; uint256 hashBlock; + *valuep = 0; if (!GetTransaction(hash, tx, #ifndef KOMODO_ZCASH Params().GetConsensus(), @@ -568,6 +569,8 @@ uint32_t komodo_txtime(uint256 hash) hashBlock, true)) { //printf("null GetTransaction\n"); + if ( n < tx.vout.size() ) + *valuep = tx.vout[n].nValue; return(tx.nLockTime); } return(0); diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 50641b589..a4d839c91 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -670,7 +670,7 @@ uint64_t komodo_commission(const CBlock &block) return((total * ASSETCHAINS_COMMISSION) / COIN); } -int32_t komodo_check_deposit(int32_t height,const CBlock& block) // verify above block is valid pax pricing +int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtime) // verify above block is valid pax pricing { static uint256 array[64]; static int32_t numbanned,indallvouts; int32_t i,j,k,n,ht,baseid,txn_count,activation,num,opretlen,offset=1,errs=0,matched=0,kmdheights[256],otherheights[256]; uint256 hash,txids[256]; char symbol[KOMODO_ASSETCHAIN_MAXLEN],base[KOMODO_ASSETCHAIN_MAXLEN]; uint16_t vouts[256]; int8_t baseids[256]; uint8_t *script,opcode,rmd160s[256*20]; uint64_t total,subsidy,available,deposited,issued,withdrawn,approved,redeemed,checktoshis,seed; int64_t values[256],srcvalues[256]; struct pax_transaction *pax; struct komodo_state *sp; @@ -740,6 +740,13 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block) // verify above } else { + if ( ASSETCHAINS_STAKED != 0 ) + { + uint32_t txtime,minutes; uint64_t value; + txtime = komodo_txtime(&value,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n); + minutes = (block.nTime - txtime) / 60; + fprintf(stderr,"txn_count.%d txtime.%u blocktime.%u prev.%u gap.%d minutes.%d %.8f\n",txn_count,txtime,block.nTime,prevtime,(int32_t)(block.nTime-prevtime),minutes,dstr(value)); + } if ( ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 && ASSETCHAINS_COMMISSION != 0 && block.vtx[0].vout.size() > 1 ) { script = (uint8_t *)block.vtx[0].vout[1].scriptPubKey.data(); @@ -747,7 +754,7 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block) // verify above return(-1); if ( (checktoshis = komodo_commission(block)) != 0 ) { - if ( block.vtx[0].vout.size() < 2 || block.vtx[0].vout[1].nValue != checktoshis ) + if ( block.vtx[0].vout[1].nValue != checktoshis ) { fprintf(stderr,"checktoshis %.8f vs actual vout[1] %.8f\n",dstr(checktoshis),dstr(block.vtx[0].vout[1].nValue)); return(-1); diff --git a/src/komodo_globals.h b/src/komodo_globals.h index 518d22cbd..4f8433f03 100644 --- a/src/komodo_globals.h +++ b/src/komodo_globals.h @@ -54,7 +54,7 @@ char ASSETCHAINS_SYMBOL[KOMODO_ASSETCHAIN_MAXLEN]; uint16_t ASSETCHAINS_PORT; uint32_t ASSETCHAIN_INIT; uint32_t ASSETCHAINS_MAGIC = 2387029918; -uint64_t ASSETCHAINS_ENDSUBSIDY,ASSETCHAINS_REWARD,ASSETCHAINS_HALVING,ASSETCHAINS_DECAY,ASSETCHAINS_COMMISSION,ASSETCHAINS_SUPPLY = 10; +uint64_t ASSETCHAINS_ENDSUBSIDY,ASSETCHAINS_REWARD,ASSETCHAINS_HALVING,ASSETCHAINS_DECAY,ASSETCHAINS_COMMISSION,ASSETCHAINS_STAKED,ASSETCHAINS_SUPPLY = 10; uint32_t KOMODO_INITDONE; char KMDUSERPASS[4096],BTCUSERPASS[4096]; uint16_t KMD_PORT = 7771,BITCOIND_PORT = 7771; diff --git a/src/komodo_kv.h b/src/komodo_kv.h index 0d5259eaa..7c20becb1 100644 --- a/src/komodo_kv.h +++ b/src/komodo_kv.h @@ -171,7 +171,7 @@ void komodo_kvupdate(uint8_t *opretbuf,int32_t opretlen,uint64_t value) memcpy(ptr->key,key,keylen); newflag = 1; HASH_ADD_KEYPTR(hh,KOMODO_KV,ptr->key,ptr->keylen,ptr); - printf("KV add.(%s) (%s)\n",ptr->key,valueptr); + //printf("KV add.(%s) (%s)\n",ptr->key,valueptr); } if ( newflag != 0 || (ptr->flags & KOMODO_KVPROTECTED) == 0 ) { diff --git a/src/komodo_utils.h b/src/komodo_utils.h index 3973bf305..47da06c0d 100644 --- a/src/komodo_utils.h +++ b/src/komodo_utils.h @@ -1501,7 +1501,7 @@ char *argv0names[] = void komodo_args(char *argv0) { extern int64_t MAX_MONEY; - std::string name,addn; char *dirname,fname[512],arg0str[64],magicstr[9]; uint8_t magic[4],extrabuf[256],*extraptr=0; FILE *fp; int32_t i,baseid,len,n,extralen = 0; + std::string name,addn; char *dirname,fname[512],arg0str[64],magicstr[9]; uint8_t magic[4],extrabuf[256],*extraptr=0; FILE *fp; uint64_t val; int32_t i,baseid,len,n,extralen = 0; IS_KOMODO_NOTARY = GetBoolArg("-notary", false); if ( (KOMODO_EXCHANGEWALLET= GetBoolArg("-exchange", false)) != 0 ) fprintf(stderr,"KOMODO_EXCHANGEWALLET mode active\n"); @@ -1540,6 +1540,7 @@ void komodo_args(char *argv0) ASSETCHAINS_DECAY = GetArg("-ac_decay",0); ASSETCHAINS_COMMISSION = GetArg("-ac_perc",0); ASSETCHAINS_OVERRIDE_PUBKEY = GetArg("-ac_pubkey",""); + ASSETCHAINS_STAKED = GetArg("-ac_staked",0); if ( ASSETCHAINS_HALVING != 0 && ASSETCHAINS_HALVING < 1440 ) { ASSETCHAINS_HALVING = 1440; @@ -1571,7 +1572,8 @@ void komodo_args(char *argv0) extralen += iguana_rwnum(1,&extraptr[extralen],sizeof(ASSETCHAINS_REWARD),(void *)&ASSETCHAINS_REWARD); extralen += iguana_rwnum(1,&extraptr[extralen],sizeof(ASSETCHAINS_HALVING),(void *)&ASSETCHAINS_HALVING); extralen += iguana_rwnum(1,&extraptr[extralen],sizeof(ASSETCHAINS_DECAY),(void *)&ASSETCHAINS_DECAY); - extralen += iguana_rwnum(1,&extraptr[extralen],sizeof(ASSETCHAINS_COMMISSION),(void *)&ASSETCHAINS_COMMISSION); + val = ASSETCHAINS_COMMISSION | ((ASSETCHAINS_STAKED & 0xffff) << 32); + extralen += iguana_rwnum(1,&extraptr[extralen],sizeof(val),(void *)&val); } addn = GetArg("-seednode",""); if ( strlen(addn.c_str()) > 0 ) diff --git a/src/main.cpp b/src/main.cpp index f6b8feba0..3266bf4e4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3506,7 +3506,8 @@ bool CheckBlockHeader(int32_t height,CBlockIndex *pindex, const CBlockHeader& bl return true; } -int32_t komodo_check_deposit(int32_t height,const CBlock& block); +int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtime); + bool CheckBlock(int32_t height,CBlockIndex *pindex,const CBlock& block, CValidationState& state, libzcash::ProofVerifier& verifier, bool fCheckPOW, bool fCheckMerkleRoot) @@ -3568,7 +3569,7 @@ bool CheckBlock(int32_t height,CBlockIndex *pindex,const CBlock& block, CValidat if (nSigOps > MAX_BLOCK_SIGOPS) return state.DoS(100, error("CheckBlock(): out-of-bounds SigOpCount"), REJECT_INVALID, "bad-blk-sigops", true); - if ( komodo_check_deposit(ASSETCHAINS_SYMBOL[0] == 0 ? height : pindex != 0 ? (int32_t)pindex->nHeight : chainActive.Tip()->nHeight+1,block) < 0 ) + if ( komodo_check_deposit(ASSETCHAINS_SYMBOL[0] == 0 ? height : pindex != 0 ? (int32_t)pindex->nHeight : chainActive.Tip()->nHeight+1,block,pindex==0||pindex->pprev==0?0:pindex->pprev->nTime) < 0 ) { static uint32_t counter; if ( counter++ < 100 ) diff --git a/src/pow.cpp b/src/pow.cpp index 76960933d..63806033d 100644 --- a/src/pow.cpp +++ b/src/pow.cpp @@ -190,18 +190,6 @@ bool CheckProofOfWork(int32_t height,uint8_t *pubkey33,uint256 hash, unsigned in } else fprintf(stderr,"skip return error height.%d loading.%d\n",height,KOMODO_LOADINGBLOCKS); } //else fprintf(stderr,"skip height.%d loading.%d\n",height,KOMODO_LOADINGBLOCKS); } - if ( 0 && height > 248000 ) - { - for (i=31; i>=0; i--) - fprintf(stderr,"%02x",((uint8_t *)&hash)[i]); - fprintf(stderr," hash vs "); - for (i=31; i>=0; i--) - fprintf(stderr,"%02x",((uint8_t *)&bnTarget)[i]); - fprintf(stderr," POW ok for ht.%d notaryid.%d: ",height,notaryid); - for (i=0; i<33; i++) - fprintf(stderr,"%02x",pubkey33[i]); - fprintf(stderr,"\n"); - } return true; } diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 1254217ac..168c00f32 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -544,7 +544,6 @@ UniValue gettxoutsetinfo(const UniValue& params, bool fHelp) #define KOMODO_KVBINARY 2 extern char ASSETCHAINS_SYMBOL[KOMODO_ASSETCHAIN_MAXLEN]; uint64_t komodo_interest(int32_t txheight,uint64_t nValue,uint32_t nLockTime,uint32_t tiptime); -uint32_t komodo_txtime(uint256 hash); uint64_t komodo_paxprice(uint64_t *seedp,int32_t height,char *base,char *rel,uint64_t basevolume); int32_t komodo_paxprices(int32_t *heights,uint64_t *prices,int32_t max,char *base,char *rel); int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestamp); From d078d0baa8b174d7dfe154c9d4e7269b2fc4224d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 19:05:19 +0300 Subject: [PATCH 0816/1062] Test --- src/komodo_gateway.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index a4d839c91..927a8fd36 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -742,7 +742,12 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtim { if ( ASSETCHAINS_STAKED != 0 ) { - uint32_t txtime,minutes; uint64_t value; + uint32_t txtime,minutes; uint64_t value; CBlockIndex *previndex; + if ( prevtime == 0 ) + { + if ( (previndex= mapBlockIndex[block.GetHash()]) != 0 ) + prevtime = (uint32_t)previndex->nTime; + } txtime = komodo_txtime(&value,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n); minutes = (block.nTime - txtime) / 60; fprintf(stderr,"txn_count.%d txtime.%u blocktime.%u prev.%u gap.%d minutes.%d %.8f\n",txn_count,txtime,block.nTime,prevtime,(int32_t)(block.nTime-prevtime),minutes,dstr(value)); From 56832841c2706e1f7d89c87a21826632538de1c2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 19:07:27 +0300 Subject: [PATCH 0817/1062] Test --- src/komodo_gateway.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 927a8fd36..818b171f0 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -750,7 +750,7 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtim } txtime = komodo_txtime(&value,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n); minutes = (block.nTime - txtime) / 60; - fprintf(stderr,"txn_count.%d txtime.%u blocktime.%u prev.%u gap.%d minutes.%d %.8f\n",txn_count,txtime,block.nTime,prevtime,(int32_t)(block.nTime-prevtime),minutes,dstr(value)); + fprintf(stderr,"ht.%d txn_count.%d txtime.%u blocktime.%u prev.%u gap.%d minutes.%d %.8f\n",(int32_t)block.nHeight,txn_count,txtime,block.nTime,prevtime,(int32_t)(block.nTime-prevtime),minutes,dstr(value)); } if ( ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 && ASSETCHAINS_COMMISSION != 0 && block.vtx[0].vout.size() > 1 ) { From 0cffe79b2fd90801338876f7c9b0686ae68e5ebc Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 19:08:49 +0300 Subject: [PATCH 0818/1062] Test --- src/komodo_gateway.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 818b171f0..16e8152a8 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -750,7 +750,7 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtim } txtime = komodo_txtime(&value,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n); minutes = (block.nTime - txtime) / 60; - fprintf(stderr,"ht.%d txn_count.%d txtime.%u blocktime.%u prev.%u gap.%d minutes.%d %.8f\n",(int32_t)block.nHeight,txn_count,txtime,block.nTime,prevtime,(int32_t)(block.nTime-prevtime),minutes,dstr(value)); + fprintf(stderr,"ht.%d txn_count.%d txtime.%u blocktime.%u prev.%u gap.%d minutes.%d %.8f\n",komodo_block2height(&block),txn_count,txtime,block.nTime,prevtime,(int32_t)(block.nTime-prevtime),minutes,dstr(value)); } if ( ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 && ASSETCHAINS_COMMISSION != 0 && block.vtx[0].vout.size() > 1 ) { From 145d4d4eee2c6a9e6df675c358b231917acf001d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 19:10:56 +0300 Subject: [PATCH 0819/1062] Test --- src/komodo_gateway.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 16e8152a8..0046042c0 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -750,7 +750,7 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtim } txtime = komodo_txtime(&value,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n); minutes = (block.nTime - txtime) / 60; - fprintf(stderr,"ht.%d txn_count.%d txtime.%u blocktime.%u prev.%u gap.%d minutes.%d %.8f\n",komodo_block2height(&block),txn_count,txtime,block.nTime,prevtime,(int32_t)(block.nTime-prevtime),minutes,dstr(value)); + fprintf(stderr,"ht.%d txn_count.%d txtime.%u blocktime.%u prev.%u gap.%d minutes.%d %.8f\n",komodo_block2height((CBlock *)&block),txn_count,txtime,block.nTime,prevtime,(int32_t)(block.nTime-prevtime),minutes,dstr(value)); } if ( ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 && ASSETCHAINS_COMMISSION != 0 && block.vtx[0].vout.size() > 1 ) { From a4a40a38adf9ab136fd5e31aead21fcad940e952 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 20:10:46 +0300 Subject: [PATCH 0820/1062] Test --- src/komodo_gateway.h | 2 +- src/miner.cpp | 32 ++++++++++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 0046042c0..3f22e20e5 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -745,7 +745,7 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtim uint32_t txtime,minutes; uint64_t value; CBlockIndex *previndex; if ( prevtime == 0 ) { - if ( (previndex= mapBlockIndex[block.GetHash()]) != 0 ) + if ( (previndex= mapBlockIndex[block.hashPrevBlock]) != 0 ) prevtime = (uint32_t)previndex->nTime; } txtime = komodo_txtime(&value,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n); diff --git a/src/miner.cpp b/src/miner.cpp index 46fcc342a..46ea9f377 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -121,6 +121,11 @@ int32_t komodo_isrealtime(int32_t *kmdheightp); int32_t komodo_validate_interest(const CTransaction &tx,int32_t txheight,uint32_t nTime,int32_t dispflag); uint64_t komodo_commission(const CBlock &block); +int32_t komodo_staked(uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig) +{ + return(-1); +} + CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) { uint64_t deposits; int32_t isrealtime,kmdheight; const CChainParams& chainparams = Params(); @@ -309,7 +314,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) // Legacy limits on sigOps: unsigned int nTxSigOps = GetLegacySigOpCount(tx); - if (nBlockSigOps + nTxSigOps >= MAX_BLOCK_SIGOPS) + if (nBlockSigOps + nTxSigOps >= MAX_BLOCK_SIGOPS-1) continue; // Skip free transactions if we're past the minimum block size: @@ -336,7 +341,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) CAmount nTxFees = view.GetValueIn(chainActive.Tip()->nHeight,&interest,tx,chainActive.Tip()->nTime)-tx.GetValueOut(); nTxSigOps += GetP2SHSigOpCount(tx, view); - if (nBlockSigOps + nTxSigOps >= MAX_BLOCK_SIGOPS) + if (nBlockSigOps + nTxSigOps >= MAX_BLOCK_SIGOPS-1) continue; // Note that flags: we don't want to set mempool/IsStandard() @@ -384,6 +389,29 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) nLastBlockTx = nBlockTx; nLastBlockSize = nBlockSize; LogPrintf("CreateNewBlock(): total size %u\n", nBlockSize); + if ( ASSETCHAINS_SYMBOL[0] != 0 && ASSETCHAINS_STAKED != 0 && NOTARY_PUBKEY33[0] != 0 ) + { + uint64_t txfees,utxovalue; uint256 utxotxid; int32_t numsigs,utxovout; uint8_t utxosig[128]; + if ( komodo_staked(&utxotxid,&utxovout,&utxovalue,utxosig) == 0 ) + { + CMutableTransaction txStaked = CreateNewContextualCMutableTransaction(chainparams.GetConsensus(), nHeight); + CAmount txfees = view.GetValueIn(chainActive.Tip()->nHeight,&interest,txStaked,chainActive.Tip()->nTime)-txStaked.GetValueOut(); + txStaked.vin.resize(1); + txStaked.vout.resize(1); + txStaked.vin[0].prevout.hash = utxotxid; + txStaked.vin[0].prevout.n = utxovout; + txStaked.vin[0].scriptSig = utxosig; + txStaked.vout[0].scriptPubKey = CScript() << ParseHex(NOTARY_PUBKEY) << OP_CHECKSIG; + txStaked.vout[0].nValue = utxovalue - 10000; + txStaked.nLockTime = chainActive.Tip()->nTime + chainparams.GetConsensus().nPowTargetSpacing; + + pblock->vtx.push_back(txStaked); + numsigs = GetLegacySigOpCount(txStaked); + pblocktemplate->vTxFees.push_back(txfees); + pblocktemplate->vTxSigOps.push_back(numsigs); + nFees += txfees; + } + } // Create coinbase tx CMutableTransaction txNew = CreateNewContextualCMutableTransaction(chainparams.GetConsensus(), nHeight); From 44d2da57f21523804c455c28bfa214c6de3fa129 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 20:17:43 +0300 Subject: [PATCH 0821/1062] Test --- src/miner.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/miner.cpp b/src/miner.cpp index 46ea9f377..99ba3708a 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -106,7 +106,7 @@ void UpdateTime(CBlockHeader* pblock, const Consensus::Params& consensusParams, #include "komodo_defs.h" extern int32_t ASSETCHAINS_SEED,IS_KOMODO_NOTARY,USE_EXTERNAL_PUBKEY,KOMODO_CHOSEN_ONE,ASSETCHAIN_INIT,KOMODO_INITDONE,KOMODO_ON_DEMAND,KOMODO_INITDONE,KOMODO_PASSPORT_INITDONE; -extern uint32_t ASSETCHAINS_REWARD,ASSETCHAINS_COMMISSION; +extern uint64_t ASSETCHAINS_REWARD,ASSETCHAINS_COMMISSION,ASSETCHAINS_STAKED; extern char ASSETCHAINS_SYMBOL[KOMODO_ASSETCHAIN_MAXLEN]; extern std::string NOTARY_PUBKEY; extern uint8_t NOTARY_PUBKEY33[33],ASSETCHAINS_OVERRIDE_PUBKEY33[33]; @@ -123,7 +123,7 @@ uint64_t komodo_commission(const CBlock &block); int32_t komodo_staked(uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig) { - return(-1); + return(0); } CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) @@ -391,18 +391,21 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) LogPrintf("CreateNewBlock(): total size %u\n", nBlockSize); if ( ASSETCHAINS_SYMBOL[0] != 0 && ASSETCHAINS_STAKED != 0 && NOTARY_PUBKEY33[0] != 0 ) { - uint64_t txfees,utxovalue; uint256 utxotxid; int32_t numsigs,utxovout; uint8_t utxosig[128]; - if ( komodo_staked(&utxotxid,&utxovout,&utxovalue,utxosig) == 0 ) + uint64_t txfees,utxovalue; uint256 utxotxid; int32_t siglen,numsigs,utxovout; uint8_t utxosig[128],*ptr; + if ( (siglen= komodo_staked(&utxotxid,&utxovout,&utxovalue,utxosig)) > 0 ) { CMutableTransaction txStaked = CreateNewContextualCMutableTransaction(chainparams.GetConsensus(), nHeight); - CAmount txfees = view.GetValueIn(chainActive.Tip()->nHeight,&interest,txStaked,chainActive.Tip()->nTime)-txStaked.GetValueOut(); + CAmount txfees = 10000; txStaked.vin.resize(1); txStaked.vout.resize(1); txStaked.vin[0].prevout.hash = utxotxid; txStaked.vin[0].prevout.n = utxovout; - txStaked.vin[0].scriptSig = utxosig; + txStaked.vin[0].scriptSig.resize(siglen); + ptr = (uint8_t *)txStaked.vin[0].scriptSig.data(); + for (i=0; inTime + chainparams.GetConsensus().nPowTargetSpacing; pblock->vtx.push_back(txStaked); From d913f07b6ea82f2bdabcfb1f52e447eb2c372ff4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 20:18:25 +0300 Subject: [PATCH 0822/1062] Test --- src/miner.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/miner.cpp b/src/miner.cpp index 99ba3708a..57de5366c 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -391,7 +391,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) LogPrintf("CreateNewBlock(): total size %u\n", nBlockSize); if ( ASSETCHAINS_SYMBOL[0] != 0 && ASSETCHAINS_STAKED != 0 && NOTARY_PUBKEY33[0] != 0 ) { - uint64_t txfees,utxovalue; uint256 utxotxid; int32_t siglen,numsigs,utxovout; uint8_t utxosig[128],*ptr; + uint64_t txfees,utxovalue; uint256 utxotxid; int32_t i,siglen,numsigs,utxovout; uint8_t utxosig[128],*ptr; if ( (siglen= komodo_staked(&utxotxid,&utxovout,&utxovalue,utxosig)) > 0 ) { CMutableTransaction txStaked = CreateNewContextualCMutableTransaction(chainparams.GetConsensus(), nHeight); From ec5ed2f7b7ba466e15699aabfce056f70616458b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 20:31:53 +0300 Subject: [PATCH 0823/1062] Test --- src/komodo_bitcoind.h | 10 ++++++++++ src/miner.cpp | 6 +----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index cd780e172..18ac579e3 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -987,3 +987,13 @@ int32_t komodo_validate_interest(const CTransaction &tx,int32_t txheight,uint32_ } return(0); } + +int32_t komodo_staked(uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig) +{ + memset(utxotxidp,0,sizeof(*utxotxidp)); + memset(utxovoutp,0,sizeof(*utxovoutp)); + memset(utxovaluep,0,sizeof(*utxovaluep)); + memset(utxosig,0,72); + return(72); +} + diff --git a/src/miner.cpp b/src/miner.cpp index 57de5366c..e14338641 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -120,11 +120,7 @@ int32_t komodo_gateway_deposits(CMutableTransaction *txNew,char *symbol,int32_t int32_t komodo_isrealtime(int32_t *kmdheightp); int32_t komodo_validate_interest(const CTransaction &tx,int32_t txheight,uint32_t nTime,int32_t dispflag); uint64_t komodo_commission(const CBlock &block); - -int32_t komodo_staked(uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig) -{ - return(0); -} +int32_t komodo_staked(uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig); CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) { From 85d77224f2093edb8916f8ef501a12bddf8d60ea Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 20:36:22 +0300 Subject: [PATCH 0824/1062] Test --- src/komodo_bitcoind.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 18ac579e3..217ac7194 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -990,9 +990,9 @@ int32_t komodo_validate_interest(const CTransaction &tx,int32_t txheight,uint32_ int32_t komodo_staked(uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig) { + *utxovaluep = 100000; memset(utxotxidp,0,sizeof(*utxotxidp)); memset(utxovoutp,0,sizeof(*utxovoutp)); - memset(utxovaluep,0,sizeof(*utxovaluep)); memset(utxosig,0,72); return(72); } From dfb57be5ece1550fce47b06ae7c76c550e34402d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 20:48:53 +0300 Subject: [PATCH 0825/1062] Test --- src/komodo_bitcoind.h | 9 ++++++++- src/komodo_globals.h | 2 +- src/komodo_utils.h | 1 + 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 217ac7194..847ffceb4 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -990,10 +990,17 @@ int32_t komodo_validate_interest(const CTransaction &tx,int32_t txheight,uint32_ int32_t komodo_staked(uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig) { - *utxovaluep = 100000; + char *retstr; + *utxovaluep = 0; memset(utxotxidp,0,sizeof(*utxotxidp)); memset(utxovoutp,0,sizeof(*utxovoutp)); memset(utxosig,0,72); + if ( (retstr= komodo_issuemethod(KOMODO_USERPASS,"listunspent","[]",BITCOIND_PORT)) != 0 ) + { + fprintf(stderr,"listunspent.(%s)\n",retstr); + free(retstr); + *utxovaluep = 100000; + } return(72); } diff --git a/src/komodo_globals.h b/src/komodo_globals.h index 4f8433f03..cb8f61988 100644 --- a/src/komodo_globals.h +++ b/src/komodo_globals.h @@ -50,7 +50,7 @@ int32_t KOMODO_LASTMINED,prevKOMODO_LASTMINED,JUMBLR_PAUSE,ASSETCHAINS_CC; std::string NOTARY_PUBKEY,ASSETCHAINS_NOTARIES,ASSETCHAINS_OVERRIDE_PUBKEY; uint8_t NOTARY_PUBKEY33[33],ASSETCHAINS_OVERRIDE_PUBKEY33[33]; -char ASSETCHAINS_SYMBOL[KOMODO_ASSETCHAIN_MAXLEN]; +char ASSETCHAINS_SYMBOL[KOMODO_ASSETCHAIN_MAXLEN],ASSETCHAINS_USERPASS[4096]; uint16_t ASSETCHAINS_PORT; uint32_t ASSETCHAIN_INIT; uint32_t ASSETCHAINS_MAGIC = 2387029918; diff --git a/src/komodo_utils.h b/src/komodo_utils.h index 47da06c0d..f86a62a60 100644 --- a/src/komodo_utils.h +++ b/src/komodo_utils.h @@ -1422,6 +1422,7 @@ uint16_t komodo_userpass(char *userpass,char *symbol) { port = komodo_userpass(username,password,fp); sprintf(userpass,"%s:%s",username,password); + strcpy(ASSETCHAINS_USERPASS,userpass); fclose(fp); return((int32_t)strlen(userpass)); } From b50b085aa843fc90854895acd0d0a000e7c010cb Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 20:49:54 +0300 Subject: [PATCH 0826/1062] Test --- src/komodo_bitcoind.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 847ffceb4..a15faeade 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -995,7 +995,7 @@ int32_t komodo_staked(uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep memset(utxotxidp,0,sizeof(*utxotxidp)); memset(utxovoutp,0,sizeof(*utxovoutp)); memset(utxosig,0,72); - if ( (retstr= komodo_issuemethod(KOMODO_USERPASS,"listunspent","[]",BITCOIND_PORT)) != 0 ) + if ( (retstr= komodo_issuemethod(ASSETCHAINS_USERPASS,"listunspent","[]",BITCOIND_PORT)) != 0 ) { fprintf(stderr,"listunspent.(%s)\n",retstr); free(retstr); From f16f9bb3688adcbcb0dd253e19f320c9f46f6627 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 20:51:42 +0300 Subject: [PATCH 0827/1062] Test --- src/komodo_bitcoind.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index a15faeade..13032a12e 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -995,7 +995,7 @@ int32_t komodo_staked(uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep memset(utxotxidp,0,sizeof(*utxotxidp)); memset(utxovoutp,0,sizeof(*utxovoutp)); memset(utxosig,0,72); - if ( (retstr= komodo_issuemethod(ASSETCHAINS_USERPASS,"listunspent","[]",BITCOIND_PORT)) != 0 ) + if ( (retstr= komodo_issuemethod(ASSETCHAINS_USERPASS,(char *)"listunspent",(char *)"[]",BITCOIND_PORT)) != 0 ) { fprintf(stderr,"listunspent.(%s)\n",retstr); free(retstr); From a643c0781042fc6c5e4df1ee281427a9af337c18 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 20:58:31 +0300 Subject: [PATCH 0828/1062] Test --- src/komodo_bitcoind.h | 1 + src/komodo_utils.h | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 13032a12e..04c68620d 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -995,6 +995,7 @@ int32_t komodo_staked(uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep memset(utxotxidp,0,sizeof(*utxotxidp)); memset(utxovoutp,0,sizeof(*utxovoutp)); memset(utxosig,0,72); + printf("%s port.%u %s\n",ASSETCHAINS_SYMBOL,BITCOIND_PORT,ASSETCHAINS_USERPASS); if ( (retstr= komodo_issuemethod(ASSETCHAINS_USERPASS,(char *)"listunspent",(char *)"[]",BITCOIND_PORT)) != 0 ) { fprintf(stderr,"listunspent.(%s)\n",retstr); diff --git a/src/komodo_utils.h b/src/komodo_utils.h index f86a62a60..16886a52c 100644 --- a/src/komodo_utils.h +++ b/src/komodo_utils.h @@ -1422,7 +1422,8 @@ uint16_t komodo_userpass(char *userpass,char *symbol) { port = komodo_userpass(username,password,fp); sprintf(userpass,"%s:%s",username,password); - strcpy(ASSETCHAINS_USERPASS,userpass); + if ( strcmp(symbol,ASSETCHAINS_SYMBOL) == 0 ) + strcpy(ASSETCHAINS_USERPASS,userpass); fclose(fp); return((int32_t)strlen(userpass)); } From bbb607b4db1b6bf514fb8e68926563714a1414a3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 21:15:20 +0300 Subject: [PATCH 0829/1062] Test --- src/komodo_utils.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_utils.h b/src/komodo_utils.h index 16886a52c..0f18d5873 100644 --- a/src/komodo_utils.h +++ b/src/komodo_utils.h @@ -1605,7 +1605,7 @@ void komodo_args(char *argv0) extern int COINBASE_MATURITY; komodo_configfile(ASSETCHAINS_SYMBOL,ASSETCHAINS_PORT + 1); COINBASE_MATURITY = 1; - LogPrintf("ASSETCHAINS_PORT %s %u\n",ASSETCHAINS_SYMBOL,ASSETCHAINS_PORT); + fprintf(stderr,"ASSETCHAINS_PORT %s %u (%s)\n",ASSETCHAINS_SYMBOL,ASSETCHAINS_PORT,ASSETCHAINS_USERPASS); } //ASSETCHAINS_NOTARIES = GetArg("-ac_notaries",""); //komodo_assetchain_pubkeys((char *)ASSETCHAINS_NOTARIES.c_str()); From 4d3e54094d4ccfbfec110e3d377504d902305ab5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 21:20:26 +0300 Subject: [PATCH 0830/1062] Test --- src/komodo_utils.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/komodo_utils.h b/src/komodo_utils.h index 0f18d5873..e8e801141 100644 --- a/src/komodo_utils.h +++ b/src/komodo_utils.h @@ -1604,6 +1604,7 @@ void komodo_args(char *argv0) int32_t komodo_baseid(char *origbase); extern int COINBASE_MATURITY; komodo_configfile(ASSETCHAINS_SYMBOL,ASSETCHAINS_PORT + 1); + komodo_userpass(ASSETCHAINS_USERPASS,ASSETCHAINS_SYMBOL); COINBASE_MATURITY = 1; fprintf(stderr,"ASSETCHAINS_PORT %s %u (%s)\n",ASSETCHAINS_SYMBOL,ASSETCHAINS_PORT,ASSETCHAINS_USERPASS); } From 4fb123112bb36239215ec61801b402b287c0f3cf Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 21:23:53 +0300 Subject: [PATCH 0831/1062] Test --- src/komodo_bitcoind.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 04c68620d..f48879e85 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -1001,7 +1001,7 @@ int32_t komodo_staked(uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep fprintf(stderr,"listunspent.(%s)\n",retstr); free(retstr); *utxovaluep = 100000; - } + } else printf("null retstr\n"); return(72); } From e5b7a04e768abf788faa9db4d9c65bf1c73e0c25 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 21:31:33 +0300 Subject: [PATCH 0832/1062] Test --- src/komodo_bitcoind.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index f48879e85..d7949cc7e 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -336,7 +336,7 @@ char *curl_post(CURL **cHandlep,char *url,char *userpass,char *postfields,char * char *komodo_issuemethod(char *userpass,char *method,char *params,uint16_t port) { - //static void *cHandle; + static void *cHandle; char url[512],*retstr=0,*retstr2=0,postdata[8192]; if ( params == 0 || params[0] == 0 ) params = (char *)"[]"; @@ -344,9 +344,9 @@ char *komodo_issuemethod(char *userpass,char *method,char *params,uint16_t port) { sprintf(url,(char *)"http://127.0.0.1:%u",port); sprintf(postdata,"{\"method\":\"%s\",\"params\":%s}",method,params); - //printf("[%s] (%s) postdata.(%s) params.(%s) USERPASS.(%s)\n",ASSETCHAINS_SYMBOL,url,postdata,params,KMDUSERPASS); - retstr2 = bitcoind_RPC(&retstr,(char *)"debug",url,userpass,method,params); - //retstr = curl_post(&cHandle,url,USERPASS,postdata,0,0,0,0); + printf("[%s] (%s) postdata.(%s) params.(%s) USERPASS.(%s)\n",ASSETCHAINS_SYMBOL,url,postdata,params,userpass); + //retstr2 = bitcoind_RPC(&retstr,(char *)"debug",url,userpass,method,params); + retstr2 = curl_post(&cHandle,url,userpass,postdata,0,0,0,0); } return(retstr2); } From 50653d13c69263411795c84d1a710443f12069e7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 21:34:06 +0300 Subject: [PATCH 0833/1062] Test --- src/komodo_bitcoind.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index d7949cc7e..579a2809e 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -336,7 +336,7 @@ char *curl_post(CURL **cHandlep,char *url,char *userpass,char *postfields,char * char *komodo_issuemethod(char *userpass,char *method,char *params,uint16_t port) { - static void *cHandle; + //static void *cHandle; char url[512],*retstr=0,*retstr2=0,postdata[8192]; if ( params == 0 || params[0] == 0 ) params = (char *)"[]"; @@ -344,9 +344,9 @@ char *komodo_issuemethod(char *userpass,char *method,char *params,uint16_t port) { sprintf(url,(char *)"http://127.0.0.1:%u",port); sprintf(postdata,"{\"method\":\"%s\",\"params\":%s}",method,params); - printf("[%s] (%s) postdata.(%s) params.(%s) USERPASS.(%s)\n",ASSETCHAINS_SYMBOL,url,postdata,params,userpass); - //retstr2 = bitcoind_RPC(&retstr,(char *)"debug",url,userpass,method,params); - retstr2 = curl_post(&cHandle,url,userpass,postdata,0,0,0,0); + //printf("[%s] (%s) postdata.(%s) params.(%s) USERPASS.(%s)\n",ASSETCHAINS_SYMBOL,url,postdata,params,KMDUSERPASS); + retstr2 = bitcoind_RPC(&retstr,(char *)"debug",url,userpass,method,params); + //retstr = curl_post(&cHandle,url,USERPASS,postdata,0,0,0,0); } return(retstr2); } @@ -996,12 +996,12 @@ int32_t komodo_staked(uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep memset(utxovoutp,0,sizeof(*utxovoutp)); memset(utxosig,0,72); printf("%s port.%u %s\n",ASSETCHAINS_SYMBOL,BITCOIND_PORT,ASSETCHAINS_USERPASS); - if ( (retstr= komodo_issuemethod(ASSETCHAINS_USERPASS,(char *)"listunspent",(char *)"[]",BITCOIND_PORT)) != 0 ) + if ( (retstr= komodo_issuemethod(ASSETCHAINS_USERPASS,(char *)"getinfo",(char *)"[]",BITCOIND_PORT)) != 0 ) { fprintf(stderr,"listunspent.(%s)\n",retstr); free(retstr); *utxovaluep = 100000; - } else printf("null retstr\n"); + } else fprintf(stderr,"null retstr\n"); return(72); } From aee5fd82c6a70926029f8b1fe2f8790385aaf4dd Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 21:49:35 +0300 Subject: [PATCH 0834/1062] Test --- src/komodo_bitcoind.h | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 579a2809e..498c8511b 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -988,20 +988,17 @@ int32_t komodo_validate_interest(const CTransaction &tx,int32_t txheight,uint32_ return(0); } +UniValue listunspent(const UniValue& params, bool fHelp); + int32_t komodo_staked(uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig) { - char *retstr; + char *retstr; UniValue ret,params = NullUniValue; *utxovaluep = 0; memset(utxotxidp,0,sizeof(*utxotxidp)); memset(utxovoutp,0,sizeof(*utxovoutp)); memset(utxosig,0,72); - printf("%s port.%u %s\n",ASSETCHAINS_SYMBOL,BITCOIND_PORT,ASSETCHAINS_USERPASS); - if ( (retstr= komodo_issuemethod(ASSETCHAINS_USERPASS,(char *)"getinfo",(char *)"[]",BITCOIND_PORT)) != 0 ) - { - fprintf(stderr,"listunspent.(%s)\n",retstr); - free(retstr); - *utxovaluep = 100000; - } else fprintf(stderr,"null retstr\n"); + ret = listunspent(params,false); + fprintf(stderr,"listunspent.(%s)\n",ret.get_str().c_str()); return(72); } From 701aa497dfbaff142fef10f157decb4a2038edf4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 21:55:15 +0300 Subject: [PATCH 0835/1062] Test --- src/komodo_bitcoind.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 498c8511b..6a5b2ce8f 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -992,13 +992,14 @@ UniValue listunspent(const UniValue& params, bool fHelp); int32_t komodo_staked(uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig) { - char *retstr; UniValue ret,params = NullUniValue; + UniValue result,params = NullUniValue; *utxovaluep = 0; memset(utxotxidp,0,sizeof(*utxotxidp)); memset(utxovoutp,0,sizeof(*utxovoutp)); memset(utxosig,0,72); - ret = listunspent(params,false); - fprintf(stderr,"listunspent.(%s)\n",ret.get_str().c_str()); + fprintf(stderr,"call listunspent\n"); + result = listunspent(params,false); + fprintf(stderr,"listunspent.(%s)\n",result.get_str().c_str()); return(72); } From 9de70efe3a05513b79f65e872e6d13467f7205f5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 22:05:45 +0300 Subject: [PATCH 0836/1062] Test --- src/komodo_bitcoind.h | 9 ++++++--- src/komodo_utils.h | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 6a5b2ce8f..7737b1973 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -992,14 +992,17 @@ UniValue listunspent(const UniValue& params, bool fHelp); int32_t komodo_staked(uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig) { - UniValue result,params = NullUniValue; + UniValue params = NullUniValue; *utxovaluep = 0; memset(utxotxidp,0,sizeof(*utxotxidp)); memset(utxovoutp,0,sizeof(*utxovoutp)); memset(utxosig,0,72); fprintf(stderr,"call listunspent\n"); - result = listunspent(params,false); - fprintf(stderr,"listunspent.(%s)\n",result.get_str().c_str()); + vector vecOutputs; + assert(pwalletMain != NULL); + LOCK2(cs_main, pwalletMain->cs_wallet); + pwalletMain->AvailableCoins(vecOutputs, false, NULL, true); + fprintf(stderr,"listunspent done\n"); return(72); } diff --git a/src/komodo_utils.h b/src/komodo_utils.h index e8e801141..c38df1411 100644 --- a/src/komodo_utils.h +++ b/src/komodo_utils.h @@ -1606,7 +1606,7 @@ void komodo_args(char *argv0) komodo_configfile(ASSETCHAINS_SYMBOL,ASSETCHAINS_PORT + 1); komodo_userpass(ASSETCHAINS_USERPASS,ASSETCHAINS_SYMBOL); COINBASE_MATURITY = 1; - fprintf(stderr,"ASSETCHAINS_PORT %s %u (%s)\n",ASSETCHAINS_SYMBOL,ASSETCHAINS_PORT,ASSETCHAINS_USERPASS); + //fprintf(stderr,"ASSETCHAINS_PORT %s %u (%s)\n",ASSETCHAINS_SYMBOL,ASSETCHAINS_PORT,ASSETCHAINS_USERPASS); } //ASSETCHAINS_NOTARIES = GetArg("-ac_notaries",""); //komodo_assetchain_pubkeys((char *)ASSETCHAINS_NOTARIES.c_str()); From ee06bbb7b3db2436e9493119de34f7a232243adb Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 22:13:40 +0300 Subject: [PATCH 0837/1062] Test --- src/komodo_bitcoind.h | 55 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 7737b1973..326870f66 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -992,7 +992,7 @@ UniValue listunspent(const UniValue& params, bool fHelp); int32_t komodo_staked(uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig) { - UniValue params = NullUniValue; + int32_t nMinDepth = 1,nMaxDepth = 9999999; *utxovaluep = 0; memset(utxotxidp,0,sizeof(*utxotxidp)); memset(utxovoutp,0,sizeof(*utxovoutp)); @@ -1002,6 +1002,59 @@ int32_t komodo_staked(uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep assert(pwalletMain != NULL); LOCK2(cs_main, pwalletMain->cs_wallet); pwalletMain->AvailableCoins(vecOutputs, false, NULL, true); + BOOST_FOREACH(const COutput& out, vecOutputs) + { + if ( out.nDepth < nMinDepth || out.nDepth > nMaxDepth ) + continue; + if ( setAddress.size() ) + { + CTxDestination address; + if (!ExtractDestination(out.tx->vout[out.i].scriptPubKey, address)) + continue; + if (!setAddress.count(address)) + continue; + } + CAmount nValue = out.tx->vout[out.i].nValue; + const CScript& pk = out.tx->vout[out.i].scriptPubKey; + UniValue entry(UniValue::VOBJ); + entry.push_back(Pair("txid", out.tx->GetHash().GetHex())); + entry.push_back(Pair("vout", out.i)); + entry.push_back(Pair("generated", out.tx->IsCoinBase())); + CTxDestination address; + if (ExtractDestination(out.tx->vout[out.i].scriptPubKey, address)) { + entry.push_back(Pair("address", CBitcoinAddress(address).ToString())); + if (pwalletMain->mapAddressBook.count(address)) + entry.push_back(Pair("account", pwalletMain->mapAddressBook[address].name)); + } + entry.push_back(Pair("scriptPubKey", HexStr(pk.begin(), pk.end()))); + if (pk.IsPayToScriptHash()) + { + CTxDestination address; + if (ExtractDestination(pk, address)) { + const CScriptID& hash = boost::get(address); + CScript redeemScript; + if (pwalletMain->GetCScript(hash, redeemScript)) + entry.push_back(Pair("redeemScript", HexStr(redeemScript.begin(), redeemScript.end()))); + } + } + entry.push_back(Pair("amount",ValueFromAmount(nValue))); + if ( out.tx->nLockTime != 0 ) + { + BlockMap::iterator it = mapBlockIndex.find(pcoinsTip->GetBestBlock()); + CBlockIndex *tipindex,*pindex = it->second; + uint64_t interest; uint32_t locktime; int32_t txheight; + if ( pindex != 0 && (tipindex= chainActive.Tip()) != 0 ) + { + komodo_accrued_interest(&txheight,&locktime,out.tx->GetHash(),out.i,0,nValue,(int32_t)tipindex->nHeight); + interest = komodo_interest(txheight,nValue,out.tx->nLockTime,tipindex->nTime); + entry.push_back(Pair("interest",ValueFromAmount(interest))); + } + //fprintf(stderr,"nValue %.8f pindex.%p tipindex.%p locktime.%u txheight.%d pindexht.%d\n",(double)nValue/COIN,pindex,chainActive.Tip(),locktime,txheight,pindex->nHeight); + } + entry.push_back(Pair("confirmations",out.nDepth)); + entry.push_back(Pair("spendable", out.fSpendable)); + fprintf(stderr,"%s\n",results.get_str().c_str()); + } fprintf(stderr,"listunspent done\n"); return(72); } From f8d5490f7cd69dd394a6e5da52c35683840e8baf Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 22:14:34 +0300 Subject: [PATCH 0838/1062] Test --- src/komodo_bitcoind.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 326870f66..8c4b99a4b 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -1053,7 +1053,7 @@ int32_t komodo_staked(uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep } entry.push_back(Pair("confirmations",out.nDepth)); entry.push_back(Pair("spendable", out.fSpendable)); - fprintf(stderr,"%s\n",results.get_str().c_str()); + fprintf(stderr,"%s\n",entry.get_str().c_str()); } fprintf(stderr,"listunspent done\n"); return(72); From 700c389b13796f4ceb1b30640e25f04f74d27d2f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 22:16:06 +0300 Subject: [PATCH 0839/1062] Test --- src/komodo_bitcoind.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 8c4b99a4b..a3a3788fa 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -988,11 +988,11 @@ int32_t komodo_validate_interest(const CTransaction &tx,int32_t txheight,uint32_ return(0); } -UniValue listunspent(const UniValue& params, bool fHelp); +UniValue ValueFromAmount(const CAmount& amount); int32_t komodo_staked(uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig) { - int32_t nMinDepth = 1,nMaxDepth = 9999999; + set setAddress; int32_t nMinDepth = 1,nMaxDepth = 9999999; *utxovaluep = 0; memset(utxotxidp,0,sizeof(*utxotxidp)); memset(utxovoutp,0,sizeof(*utxovoutp)); From a16386bc8ccb74ee280bac256fea762117883108 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 22:23:00 +0300 Subject: [PATCH 0840/1062] Test --- src/komodo_bitcoind.h | 62 ++-------------------------------------- src/wallet/rpcwallet.cpp | 62 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 59 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index a3a3788fa..4c75249b6 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -988,7 +988,7 @@ int32_t komodo_validate_interest(const CTransaction &tx,int32_t txheight,uint32_ return(0); } -UniValue ValueFromAmount(const CAmount& amount); +void komodo_listunspent(); int32_t komodo_staked(uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig) { @@ -997,64 +997,8 @@ int32_t komodo_staked(uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep memset(utxotxidp,0,sizeof(*utxotxidp)); memset(utxovoutp,0,sizeof(*utxovoutp)); memset(utxosig,0,72); - fprintf(stderr,"call listunspent\n"); - vector vecOutputs; - assert(pwalletMain != NULL); - LOCK2(cs_main, pwalletMain->cs_wallet); - pwalletMain->AvailableCoins(vecOutputs, false, NULL, true); - BOOST_FOREACH(const COutput& out, vecOutputs) - { - if ( out.nDepth < nMinDepth || out.nDepth > nMaxDepth ) - continue; - if ( setAddress.size() ) - { - CTxDestination address; - if (!ExtractDestination(out.tx->vout[out.i].scriptPubKey, address)) - continue; - if (!setAddress.count(address)) - continue; - } - CAmount nValue = out.tx->vout[out.i].nValue; - const CScript& pk = out.tx->vout[out.i].scriptPubKey; - UniValue entry(UniValue::VOBJ); - entry.push_back(Pair("txid", out.tx->GetHash().GetHex())); - entry.push_back(Pair("vout", out.i)); - entry.push_back(Pair("generated", out.tx->IsCoinBase())); - CTxDestination address; - if (ExtractDestination(out.tx->vout[out.i].scriptPubKey, address)) { - entry.push_back(Pair("address", CBitcoinAddress(address).ToString())); - if (pwalletMain->mapAddressBook.count(address)) - entry.push_back(Pair("account", pwalletMain->mapAddressBook[address].name)); - } - entry.push_back(Pair("scriptPubKey", HexStr(pk.begin(), pk.end()))); - if (pk.IsPayToScriptHash()) - { - CTxDestination address; - if (ExtractDestination(pk, address)) { - const CScriptID& hash = boost::get(address); - CScript redeemScript; - if (pwalletMain->GetCScript(hash, redeemScript)) - entry.push_back(Pair("redeemScript", HexStr(redeemScript.begin(), redeemScript.end()))); - } - } - entry.push_back(Pair("amount",ValueFromAmount(nValue))); - if ( out.tx->nLockTime != 0 ) - { - BlockMap::iterator it = mapBlockIndex.find(pcoinsTip->GetBestBlock()); - CBlockIndex *tipindex,*pindex = it->second; - uint64_t interest; uint32_t locktime; int32_t txheight; - if ( pindex != 0 && (tipindex= chainActive.Tip()) != 0 ) - { - komodo_accrued_interest(&txheight,&locktime,out.tx->GetHash(),out.i,0,nValue,(int32_t)tipindex->nHeight); - interest = komodo_interest(txheight,nValue,out.tx->nLockTime,tipindex->nTime); - entry.push_back(Pair("interest",ValueFromAmount(interest))); - } - //fprintf(stderr,"nValue %.8f pindex.%p tipindex.%p locktime.%u txheight.%d pindexht.%d\n",(double)nValue/COIN,pindex,chainActive.Tip(),locktime,txheight,pindex->nHeight); - } - entry.push_back(Pair("confirmations",out.nDepth)); - entry.push_back(Pair("spendable", out.fSpendable)); - fprintf(stderr,"%s\n",entry.get_str().c_str()); - } + fprintf(stderr,"start listunspent\n"); + komodo_listunspent(); fprintf(stderr,"listunspent done\n"); return(72); } diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 27e94134d..438b1f0be 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -2691,6 +2691,68 @@ UniValue listunspent(const UniValue& params, bool fHelp) return results; } +void komodo_listunspent() +{ + fprintf(stderr,"call listunspent\n"); + vector vecOutputs; + assert(pwalletMain != NULL); + LOCK2(cs_main, pwalletMain->cs_wallet); + pwalletMain->AvailableCoins(vecOutputs, false, NULL, true); + BOOST_FOREACH(const COutput& out, vecOutputs) + { + if ( out.nDepth < nMinDepth || out.nDepth > nMaxDepth ) + continue; + if ( setAddress.size() ) + { + CTxDestination address; + if (!ExtractDestination(out.tx->vout[out.i].scriptPubKey, address)) + continue; + if (!setAddress.count(address)) + continue; + } + CAmount nValue = out.tx->vout[out.i].nValue; + const CScript& pk = out.tx->vout[out.i].scriptPubKey; + UniValue entry(UniValue::VOBJ); + entry.push_back(Pair("txid", out.tx->GetHash().GetHex())); + entry.push_back(Pair("vout", out.i)); + entry.push_back(Pair("generated", out.tx->IsCoinBase())); + CTxDestination address; + if (ExtractDestination(out.tx->vout[out.i].scriptPubKey, address)) { + entry.push_back(Pair("address", CBitcoinAddress(address).ToString())); + if (pwalletMain->mapAddressBook.count(address)) + entry.push_back(Pair("account", pwalletMain->mapAddressBook[address].name)); + } + entry.push_back(Pair("scriptPubKey", HexStr(pk.begin(), pk.end()))); + if (pk.IsPayToScriptHash()) + { + CTxDestination address; + if (ExtractDestination(pk, address)) { + const CScriptID& hash = boost::get(address); + CScript redeemScript; + if (pwalletMain->GetCScript(hash, redeemScript)) + entry.push_back(Pair("redeemScript", HexStr(redeemScript.begin(), redeemScript.end()))); + } + } + entry.push_back(Pair("amount",ValueFromAmount(nValue))); + if ( out.tx->nLockTime != 0 ) + { + BlockMap::iterator it = mapBlockIndex.find(pcoinsTip->GetBestBlock()); + CBlockIndex *tipindex,*pindex = it->second; + uint64_t interest; uint32_t locktime; int32_t txheight; + if ( pindex != 0 && (tipindex= chainActive.Tip()) != 0 ) + { + komodo_accrued_interest(&txheight,&locktime,out.tx->GetHash(),out.i,0,nValue,(int32_t)tipindex->nHeight); + interest = komodo_interest(txheight,nValue,out.tx->nLockTime,tipindex->nTime); + entry.push_back(Pair("interest",ValueFromAmount(interest))); + } + fprintf(stderr,"nValue %.8f pindex.%p tipindex.%p locktime.%u txheight.%d pindexht.%d\n",(double)nValue/COIN,pindex,chainActive.Tip(),locktime,txheight,pindex->nHeight); + } + entry.push_back(Pair("confirmations",out.nDepth)); + entry.push_back(Pair("spendable", out.fSpendable)); + fprintf(stderr,"%s\n",entry.get_str().c_str()); + } +} + uint64_t komodo_interestsum() { uint64_t interest,sum = 0; From 073421433b0bd31817f11de3ed0806ac826af96b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 22:25:09 +0300 Subject: [PATCH 0841/1062] Test --- src/komodo_bitcoind.h | 1 - src/wallet/rpcwallet.cpp | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 4c75249b6..53ec13b00 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -992,7 +992,6 @@ void komodo_listunspent(); int32_t komodo_staked(uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig) { - set setAddress; int32_t nMinDepth = 1,nMaxDepth = 9999999; *utxovaluep = 0; memset(utxotxidp,0,sizeof(*utxotxidp)); memset(utxovoutp,0,sizeof(*utxovoutp)); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 438b1f0be..461b81c89 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -2693,8 +2693,7 @@ UniValue listunspent(const UniValue& params, bool fHelp) void komodo_listunspent() { - fprintf(stderr,"call listunspent\n"); - vector vecOutputs; + set setAddress; int32_t nMinDepth = 1,nMaxDepth = 9999999; vector vecOutputs; assert(pwalletMain != NULL); LOCK2(cs_main, pwalletMain->cs_wallet); pwalletMain->AvailableCoins(vecOutputs, false, NULL, true); From 50a7fa9e125d5a3080cf3901567415c9796d08da Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 22:32:56 +0300 Subject: [PATCH 0842/1062] Test --- src/wallet/rpcwallet.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 461b81c89..d999e0d80 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -2711,7 +2711,7 @@ void komodo_listunspent() } CAmount nValue = out.tx->vout[out.i].nValue; const CScript& pk = out.tx->vout[out.i].scriptPubKey; - UniValue entry(UniValue::VOBJ); + /*UniValue entry(UniValue::VOBJ); entry.push_back(Pair("txid", out.tx->GetHash().GetHex())); entry.push_back(Pair("vout", out.i)); entry.push_back(Pair("generated", out.tx->IsCoinBase())); @@ -2732,7 +2732,7 @@ void komodo_listunspent() entry.push_back(Pair("redeemScript", HexStr(redeemScript.begin(), redeemScript.end()))); } } - entry.push_back(Pair("amount",ValueFromAmount(nValue))); + entry.push_back(Pair("amount",ValueFromAmount(nValue)));*/ if ( out.tx->nLockTime != 0 ) { BlockMap::iterator it = mapBlockIndex.find(pcoinsTip->GetBestBlock()); @@ -2742,13 +2742,11 @@ void komodo_listunspent() { komodo_accrued_interest(&txheight,&locktime,out.tx->GetHash(),out.i,0,nValue,(int32_t)tipindex->nHeight); interest = komodo_interest(txheight,nValue,out.tx->nLockTime,tipindex->nTime); - entry.push_back(Pair("interest",ValueFromAmount(interest))); + //entry.push_back(Pair("interest",ValueFromAmount(interest))); } - fprintf(stderr,"nValue %.8f pindex.%p tipindex.%p locktime.%u txheight.%d pindexht.%d\n",(double)nValue/COIN,pindex,chainActive.Tip(),locktime,txheight,pindex->nHeight); + fprintf(stderr,"(%s) %s/v%d nValue %.8f locktime.%u txheight.%d pindexht.%d\n",CBitcoinAddress(address).ToString().c_str(),out.tx->GetHash().GetHex().c_str(),out.i,(double)nValue/COIN,locktime,txheight,pindex->nHeight); } - entry.push_back(Pair("confirmations",out.nDepth)); - entry.push_back(Pair("spendable", out.fSpendable)); - fprintf(stderr,"%s\n",entry.get_str().c_str()); + fprintf(stderr,"entry done\n"); } } From 74f0baa46875ff256fd743bca29a1c540a2446a6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 22:34:16 +0300 Subject: [PATCH 0843/1062] Test --- src/wallet/rpcwallet.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index d999e0d80..bf785e38c 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -2693,7 +2693,7 @@ UniValue listunspent(const UniValue& params, bool fHelp) void komodo_listunspent() { - set setAddress; int32_t nMinDepth = 1,nMaxDepth = 9999999; vector vecOutputs; + set setAddress; int32_t nMinDepth = 1,nMaxDepth = 9999999; vector vecOutputs; CTxDestination address; assert(pwalletMain != NULL); LOCK2(cs_main, pwalletMain->cs_wallet); pwalletMain->AvailableCoins(vecOutputs, false, NULL, true); @@ -2703,7 +2703,6 @@ void komodo_listunspent() continue; if ( setAddress.size() ) { - CTxDestination address; if (!ExtractDestination(out.tx->vout[out.i].scriptPubKey, address)) continue; if (!setAddress.count(address)) From c6e53b1ad31d475d06c94fb69af1b9f35019d15d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 22:39:43 +0300 Subject: [PATCH 0844/1062] Test --- src/komodo_bitcoind.h | 2 -- src/wallet/rpcwallet.cpp | 20 +++++++++----------- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 53ec13b00..6933be624 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -996,9 +996,7 @@ int32_t komodo_staked(uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep memset(utxotxidp,0,sizeof(*utxotxidp)); memset(utxovoutp,0,sizeof(*utxovoutp)); memset(utxosig,0,72); - fprintf(stderr,"start listunspent\n"); komodo_listunspent(); - fprintf(stderr,"listunspent done\n"); return(72); } diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index bf785e38c..fee31efcd 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -2693,7 +2693,7 @@ UniValue listunspent(const UniValue& params, bool fHelp) void komodo_listunspent() { - set setAddress; int32_t nMinDepth = 1,nMaxDepth = 9999999; vector vecOutputs; CTxDestination address; + set setAddress; int32_t nMinDepth = 1,nMaxDepth = 9999999; vector vecOutputs; assert(pwalletMain != NULL); LOCK2(cs_main, pwalletMain->cs_wallet); pwalletMain->AvailableCoins(vecOutputs, false, NULL, true); @@ -2703,6 +2703,7 @@ void komodo_listunspent() continue; if ( setAddress.size() ) { + CTxDestination address; if (!ExtractDestination(out.tx->vout[out.i].scriptPubKey, address)) continue; if (!setAddress.count(address)) @@ -2710,17 +2711,15 @@ void komodo_listunspent() } CAmount nValue = out.tx->vout[out.i].nValue; const CScript& pk = out.tx->vout[out.i].scriptPubKey; - /*UniValue entry(UniValue::VOBJ); - entry.push_back(Pair("txid", out.tx->GetHash().GetHex())); - entry.push_back(Pair("vout", out.i)); - entry.push_back(Pair("generated", out.tx->IsCoinBase())); + //entry.push_back(Pair("generated", out.tx->IsCoinBase())); CTxDestination address; - if (ExtractDestination(out.tx->vout[out.i].scriptPubKey, address)) { - entry.push_back(Pair("address", CBitcoinAddress(address).ToString())); - if (pwalletMain->mapAddressBook.count(address)) - entry.push_back(Pair("account", pwalletMain->mapAddressBook[address].name)); + if (ExtractDestination(out.tx->vout[out.i].scriptPubKey, address)) + { + //entry.push_back(Pair("address", CBitcoinAddress(address).ToString())); + //if (pwalletMain->mapAddressBook.count(address)) + // entry.push_back(Pair("account", pwalletMain->mapAddressBook[address].name)); } - entry.push_back(Pair("scriptPubKey", HexStr(pk.begin(), pk.end()))); + /*entry.push_back(Pair("scriptPubKey", HexStr(pk.begin(), pk.end()))); if (pk.IsPayToScriptHash()) { CTxDestination address; @@ -2745,7 +2744,6 @@ void komodo_listunspent() } fprintf(stderr,"(%s) %s/v%d nValue %.8f locktime.%u txheight.%d pindexht.%d\n",CBitcoinAddress(address).ToString().c_str(),out.tx->GetHash().GetHex().c_str(),out.i,(double)nValue/COIN,locktime,txheight,pindex->nHeight); } - fprintf(stderr,"entry done\n"); } } From eb6c7bb831b7784cacafdf5b6a3fbdae5ae53d4b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 22:46:38 +0300 Subject: [PATCH 0845/1062] Test --- src/komodo_bitcoind.h | 12 ------------ src/miner.cpp | 6 +++--- src/wallet/rpcwallet.cpp | 10 +++++++++- 3 files changed, 12 insertions(+), 16 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 6933be624..46913d43e 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -988,15 +988,3 @@ int32_t komodo_validate_interest(const CTransaction &tx,int32_t txheight,uint32_ return(0); } -void komodo_listunspent(); - -int32_t komodo_staked(uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig) -{ - *utxovaluep = 0; - memset(utxotxidp,0,sizeof(*utxotxidp)); - memset(utxovoutp,0,sizeof(*utxovoutp)); - memset(utxosig,0,72); - komodo_listunspent(); - return(72); -} - diff --git a/src/miner.cpp b/src/miner.cpp index e14338641..2e6305f26 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -120,7 +120,7 @@ int32_t komodo_gateway_deposits(CMutableTransaction *txNew,char *symbol,int32_t int32_t komodo_isrealtime(int32_t *kmdheightp); int32_t komodo_validate_interest(const CTransaction &tx,int32_t txheight,uint32_t nTime,int32_t dispflag); uint64_t komodo_commission(const CBlock &block); -int32_t komodo_staked(uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig); +int32_t komodo_staked(uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig); CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) { @@ -387,8 +387,8 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) LogPrintf("CreateNewBlock(): total size %u\n", nBlockSize); if ( ASSETCHAINS_SYMBOL[0] != 0 && ASSETCHAINS_STAKED != 0 && NOTARY_PUBKEY33[0] != 0 ) { - uint64_t txfees,utxovalue; uint256 utxotxid; int32_t i,siglen,numsigs,utxovout; uint8_t utxosig[128],*ptr; - if ( (siglen= komodo_staked(&utxotxid,&utxovout,&utxovalue,utxosig)) > 0 ) + uint64_t txfees,utxovalue; uint32_t txtime; uint256 utxotxid; int32_t i,siglen,numsigs,utxovout; uint8_t utxosig[128],*ptr; + if ( (siglen= komodo_staked(&txtime,&utxotxid,&utxovout,&utxovalue,utxosig)) > 0 ) { CMutableTransaction txStaked = CreateNewContextualCMutableTransaction(chainparams.GetConsensus(), nHeight); CAmount txfees = 10000; diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index fee31efcd..c7cf5d52b 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -2691,11 +2691,15 @@ UniValue listunspent(const UniValue& params, bool fHelp) return results; } -void komodo_listunspent() +int32_t komodo_staked(uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig) { set setAddress; int32_t nMinDepth = 1,nMaxDepth = 9999999; vector vecOutputs; assert(pwalletMain != NULL); LOCK2(cs_main, pwalletMain->cs_wallet); + *utxovaluep = 0; + memset(utxotxidp,0,sizeof(*utxotxidp)); + memset(utxovoutp,0,sizeof(*utxovoutp)); + memset(utxosig,0,72); pwalletMain->AvailableCoins(vecOutputs, false, NULL, true); BOOST_FOREACH(const COutput& out, vecOutputs) { @@ -2712,6 +2716,10 @@ void komodo_listunspent() CAmount nValue = out.tx->vout[out.i].nValue; const CScript& pk = out.tx->vout[out.i].scriptPubKey; //entry.push_back(Pair("generated", out.tx->IsCoinBase())); + *utxovaluep = (uint64_t)nValue; + decode_hex(utxotxidp,32,out.tx->GetHash().GetHex().c_str()); + *utxovoutp = out.i; + *txtimep = (uint32_t)out.tx->nLockTime; CTxDestination address; if (ExtractDestination(out.tx->vout[out.i].scriptPubKey, address)) { From 478b0dadb10ccd4e1196f50e661d5b9dad67b0c6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 22:50:39 +0300 Subject: [PATCH 0846/1062] Test --- src/miner.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/miner.cpp b/src/miner.cpp index 2e6305f26..a87a82914 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -402,6 +402,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) ptr[i] = utxosig[i]; txStaked.vout[0].scriptPubKey = CScript() << ParseHex(NOTARY_PUBKEY) << OP_CHECKSIG; txStaked.vout[0].nValue = utxovalue - txfees; + fprintf(stderr,"utxovout.%d txtime.%u %.8f\n",utxovout,txtime,(double)utxovalue/COIN); txStaked.nLockTime = chainActive.Tip()->nTime + chainparams.GetConsensus().nPowTargetSpacing; pblock->vtx.push_back(txStaked); From 30092d77e2697c4d50db3b5e0e295105f81bd957 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 22:52:09 +0300 Subject: [PATCH 0847/1062] Test --- src/wallet/rpcwallet.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index c7cf5d52b..bf148e9d2 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -2691,6 +2691,8 @@ UniValue listunspent(const UniValue& params, bool fHelp) return results; } +int32_t decode_hex(uint8_t *bytes,int32_t n,char *hex); + int32_t komodo_staked(uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig) { set setAddress; int32_t nMinDepth = 1,nMaxDepth = 9999999; vector vecOutputs; From 5611b8ff59c92d4d7bc4bf95ad20cb1569c1d927 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 22:53:26 +0300 Subject: [PATCH 0848/1062] Test --- src/wallet/rpcwallet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index bf148e9d2..62b028042 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -2719,7 +2719,7 @@ int32_t komodo_staked(uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,ui const CScript& pk = out.tx->vout[out.i].scriptPubKey; //entry.push_back(Pair("generated", out.tx->IsCoinBase())); *utxovaluep = (uint64_t)nValue; - decode_hex(utxotxidp,32,out.tx->GetHash().GetHex().c_str()); + decode_hex((uint8_t *)utxotxidp,32,out.tx->GetHash().GetHex().c_str()); *utxovoutp = out.i; *txtimep = (uint32_t)out.tx->nLockTime; CTxDestination address; From 565aa1b298324271b1f972a802928d891d6d7593 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 22:54:14 +0300 Subject: [PATCH 0849/1062] Test --- src/wallet/rpcwallet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 62b028042..8067b429c 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -2719,7 +2719,7 @@ int32_t komodo_staked(uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,ui const CScript& pk = out.tx->vout[out.i].scriptPubKey; //entry.push_back(Pair("generated", out.tx->IsCoinBase())); *utxovaluep = (uint64_t)nValue; - decode_hex((uint8_t *)utxotxidp,32,out.tx->GetHash().GetHex().c_str()); + decode_hex((uint8_t *)utxotxidp,32,(char *)out.tx->GetHash().GetHex().c_str()); *utxovoutp = out.i; *txtimep = (uint32_t)out.tx->nLockTime; CTxDestination address; From be7928150b3325870a4d202cb6c457e3034ff3b3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 22:58:10 +0300 Subject: [PATCH 0850/1062] Test --- src/komodo_gateway.h | 2 +- src/wallet/rpcwallet.cpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 3f22e20e5..29d8bd984 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -750,7 +750,7 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtim } txtime = komodo_txtime(&value,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n); minutes = (block.nTime - txtime) / 60; - fprintf(stderr,"ht.%d txn_count.%d txtime.%u blocktime.%u prev.%u gap.%d minutes.%d %.8f\n",komodo_block2height((CBlock *)&block),txn_count,txtime,block.nTime,prevtime,(int32_t)(block.nTime-prevtime),minutes,dstr(value)); + fprintf(stderr,"txn_count.%d txtime.%u blocktime.%u prev.%u gap.%d minutes.%d %.8f\n",txn_count,txtime,block.nTime,prevtime,(int32_t)(block.nTime-prevtime),minutes,dstr(value)); } if ( ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 && ASSETCHAINS_COMMISSION != 0 && block.vtx[0].vout.size() > 1 ) { diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 8067b429c..09b403f7f 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -2755,6 +2755,7 @@ int32_t komodo_staked(uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,ui fprintf(stderr,"(%s) %s/v%d nValue %.8f locktime.%u txheight.%d pindexht.%d\n",CBitcoinAddress(address).ToString().c_str(),out.tx->GetHash().GetHex().c_str(),out.i,(double)nValue/COIN,locktime,txheight,pindex->nHeight); } } + return(72); } uint64_t komodo_interestsum() From 69530bb2c7cb40a7dcfd6eba8b0139321a38ba4e Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Apr 2018 23:02:42 +0300 Subject: [PATCH 0851/1062] Test --- src/miner.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/miner.cpp b/src/miner.cpp index a87a82914..6f59771bf 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -387,14 +387,16 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) LogPrintf("CreateNewBlock(): total size %u\n", nBlockSize); if ( ASSETCHAINS_SYMBOL[0] != 0 && ASSETCHAINS_STAKED != 0 && NOTARY_PUBKEY33[0] != 0 ) { - uint64_t txfees,utxovalue; uint32_t txtime; uint256 utxotxid; int32_t i,siglen,numsigs,utxovout; uint8_t utxosig[128],*ptr; + uint64_t txfees,utxovalue; uint32_t txtime; uint256 utxotxid,revtxid; int32_t i,siglen,numsigs,utxovout; uint8_t utxosig[128],*ptr; if ( (siglen= komodo_staked(&txtime,&utxotxid,&utxovout,&utxovalue,utxosig)) > 0 ) { CMutableTransaction txStaked = CreateNewContextualCMutableTransaction(chainparams.GetConsensus(), nHeight); CAmount txfees = 10000; txStaked.vin.resize(1); txStaked.vout.resize(1); - txStaked.vin[0].prevout.hash = utxotxid; + for (i=0; i<32; i++) + ((uint8_t *)&revtxid)[i] = ((uint8_t *)&utxotxid)[31 - i]; + txStaked.vin[0].prevout.hash = revtxid; txStaked.vin[0].prevout.n = utxovout; txStaked.vin[0].scriptSig.resize(siglen); ptr = (uint8_t *)txStaked.vin[0].scriptSig.data(); From 39c9911e9c2257a2afe748fd5225787df1a4c364 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Sat, 7 Apr 2018 18:07:52 -0300 Subject: [PATCH 0852/1062] change Eval data structure to single code blob --- src/cc/betprotocol.cpp | 11 ++- src/cc/betprotocol.h | 28 ++---- src/cc/disputepayout.cpp | 19 ++-- src/cc/eval.cpp | 68 ++++++++------ src/cc/eval.h | 41 ++++++-- src/cc/importpayout.cpp | 19 ++-- src/cryptoconditions/.gitignore | 1 + src/cryptoconditions/Makefile.am | 8 +- .../include/cryptoconditions.h | 34 +++---- src/cryptoconditions/src/anon.c | 2 +- .../src/asn/AuxFingerprintContents.c | 94 ------------------- .../src/asn/AuxFingerprintContents.h | 38 -------- src/cryptoconditions/src/asn/AuxFulfillment.c | 78 --------------- src/cryptoconditions/src/asn/AuxFulfillment.h | 39 -------- .../src/asn/AuxSha512Fulfillment.c | 78 --------------- .../src/asn/AuxSha512Fulfillment.h | 39 -------- .../src/asn/CryptoConditions.asn | 9 +- .../src/asn/EvalFingerprintContents.c | 94 ------------------- .../src/asn/EvalFingerprintContents.h | 38 -------- .../src/asn/EvalFulfillment.c | 46 +-------- .../src/asn/EvalFulfillment.h | 3 +- .../src/asn/Makefile.am.sample | 6 +- src/cryptoconditions/src/asn/asn_system.h | 10 -- src/cryptoconditions/src/cryptoconditions.c | 12 +-- src/cryptoconditions/src/ed25519.c | 5 +- src/cryptoconditions/src/eval.c | 63 +++++-------- src/cryptoconditions/src/internal.h | 17 ++-- src/cryptoconditions/src/prefix.c | 2 +- src/cryptoconditions/src/preimage.c | 4 +- src/cryptoconditions/src/secp256k1.c | 4 +- src/cryptoconditions/src/threshold.c | 2 +- .../1000_test-minimal-eval.json | 1 - src/komodo_cc.cpp | 9 +- src/komodo_cc.h | 2 +- src/test-komodo/test_cryptoconditions.cpp | 33 ++++--- src/test-komodo/test_eval_bet.cpp | 48 ++++++---- src/test-komodo/test_eval_notarisation.cpp | 2 +- 37 files changed, 239 insertions(+), 768 deletions(-) delete mode 100644 src/cryptoconditions/src/asn/AuxFingerprintContents.c delete mode 100644 src/cryptoconditions/src/asn/AuxFingerprintContents.h delete mode 100644 src/cryptoconditions/src/asn/AuxFulfillment.c delete mode 100644 src/cryptoconditions/src/asn/AuxFulfillment.h delete mode 100644 src/cryptoconditions/src/asn/AuxSha512Fulfillment.c delete mode 100644 src/cryptoconditions/src/asn/AuxSha512Fulfillment.h delete mode 100644 src/cryptoconditions/src/asn/EvalFingerprintContents.c delete mode 100644 src/cryptoconditions/src/asn/EvalFingerprintContents.h diff --git a/src/cc/betprotocol.cpp b/src/cc/betprotocol.cpp index b4e5a4e56..1b42321d7 100644 --- a/src/cc/betprotocol.cpp +++ b/src/cc/betprotocol.cpp @@ -18,7 +18,9 @@ std::vector BetProtocol::PlayerConditions() CC* BetProtocol::MakeDisputeCond() { - CC *disputePoker = CCNewEval(disputeFunc, CheckSerialize(disputeHeader)); + CC *disputePoker = CCNewEval(E_MARSHAL( + ss << disputeCode << VARINT(waitBlocks) << vmParams; + )); CC *anySig = CCNewThreshold(1, PlayerConditions()); @@ -79,8 +81,9 @@ CC* BetProtocol::MakePayoutCond(uint256 signedSessionTxHash) CC *import; { - std::vector vHash(signedSessionTxHash.begin(), signedSessionTxHash.end()); - CC *importEval = CCNewEval("ImportPayout", vHash); + CC *importEval = CCNewEval(E_MARSHAL( + ss << EVAL_IMPORTPAYOUT << signedSessionTxHash; + )); CC *oneof = CCNewThreshold(1, PlayerConditions()); @@ -120,7 +123,7 @@ CMutableTransaction BetProtocol::MakeImportPayoutTx(std::vector payouts, mtx.vin.push_back(CTxIn(signedStakeTxHash, 0, CScript())); mtx.vout = payouts; CScript proofData; - proofData << OP_RETURN << CheckSerialize(std::make_pair(momProof, signedDisputeTx)); + proofData << OP_RETURN << E_MARSHAL(ss << momProof << signedDisputeTx); mtx.vout.insert(mtx.vout.begin(), CTxOut(0, proofData)); return mtx; } diff --git a/src/cc/betprotocol.h b/src/cc/betprotocol.h index ae4346c09..b08783b85 100644 --- a/src/cc/betprotocol.h +++ b/src/cc/betprotocol.h @@ -1,6 +1,7 @@ #ifndef BETPROTOCOL_H #define BETPROTOCOL_H +#include "cc/eval.h" #include "pubkey.h" #include "primitives/block.h" #include "primitives/transaction.h" @@ -29,36 +30,19 @@ public: }; -class DisputeHeader -{ -public: - int waitBlocks; - std::vector vmParams; - - DisputeHeader() {} - DisputeHeader(int w, std::vector vmp) : waitBlocks(w), vmParams(vmp) {} - - ADD_SERIALIZE_METHODS; - - template - inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { - READWRITE(VARINT(waitBlocks)); - READWRITE(vmParams); - } -}; - - class BetProtocol { protected: - char* disputeFunc = (char*) "DisputeBet"; std::vector playerConditions(); public: + EvalCode disputeCode; std::vector players; - DisputeHeader disputeHeader; + std::vector vmParams; + uint32_t waitBlocks; // Utility - BetProtocol(std::vector ps, DisputeHeader dh) : players(ps), disputeHeader(dh) {} + BetProtocol(EvalCode dc, std::vector ps, uint32_t wb, std::vector vmp) + : disputeCode(dc), waitBlocks(wb), vmParams(vmp), players(ps) {} std::vector PlayerConditions(); // on PANGEA diff --git a/src/cc/disputepayout.cpp b/src/cc/disputepayout.cpp index e36f4781d..22ce333d4 100644 --- a/src/cc/disputepayout.cpp +++ b/src/cc/disputepayout.cpp @@ -13,7 +13,7 @@ * Crypto-Condition EVAL method that resolves a dispute of a session * * IN: vm - AppVM virtual machine to verify states - * IN: cond - CC EVAL node + * IN: params - condition params * IN: disputeTx - transaction attempting to resolve dispute * IN: nIn - index of input of dispute tx * @@ -22,7 +22,7 @@ * in 0: Spends Session TX first output, reveals DisputeHeader * out 0: OP_RETURN hash of payouts */ -bool Eval::DisputePayout(AppVM &vm, const CC *cond, const CTransaction &disputeTx, unsigned int nIn) +bool Eval::DisputePayout(AppVM &vm, std::vector params, const CTransaction &disputeTx, unsigned int nIn) { if (disputeTx.vout.size() == 0) return Invalid("no-vouts"); @@ -31,12 +31,11 @@ bool Eval::DisputePayout(AppVM &vm, const CC *cond, const CTransaction &disputeT if (!GetOpReturnHash(disputeTx.vout[0].scriptPubKey, payoutHash)) return Invalid("invalid-payout-hash"); - // load dispute header - DisputeHeader disputeHeader; - std::vector headerData( - cond->paramsBin, cond->paramsBin+cond->paramsBinLength); - if (!CheckDeserialize(headerData, disputeHeader)) - return Invalid("invalid-dispute-header"); + // load params + uint16_t waitBlocks; + std::vector vmParams; + if (!E_UNMARSHAL(params, ss >> VARINT(waitBlocks); ss >> vmParams)) + return Invalid("malformed-params"); // ensure that enough time has passed { @@ -47,7 +46,7 @@ bool Eval::DisputePayout(AppVM &vm, const CC *cond, const CTransaction &disputeT if (!GetTxConfirmed(disputeTx.vin[0].prevout.hash, sessionTx, sessionBlock)) return Error("couldnt-get-parent"); - if (GetCurrentHeight() < sessionBlock.nHeight + disputeHeader.waitBlocks) + if (GetCurrentHeight() < sessionBlock.nHeight + waitBlocks) return Invalid("dispute-too-soon"); // Not yet } @@ -64,7 +63,7 @@ bool Eval::DisputePayout(AppVM &vm, const CC *cond, const CTransaction &disputeT std::vector vmState; if (!spends[i].vout.size() > 0) continue; if (!GetOpReturnData(spends[i].vout[0].scriptPubKey, vmState)) continue; - auto out = vm.evaluate(disputeHeader.vmParams, vmState); + auto out = vm.evaluate(vmParams, vmState); uint256 resultHash = SerializeHash(out.second); if (out.first > maxLength) { maxLength = out.first; diff --git a/src/cc/eval.cpp b/src/cc/eval.cpp index 503507160..495ec8c79 100644 --- a/src/cc/eval.cpp +++ b/src/cc/eval.cpp @@ -24,8 +24,11 @@ bool RunCCEval(const CC *cond, const CTransaction &tx, unsigned int nIn) if (eval->state.IsValid()) return true; std::string lvl = eval->state.IsInvalid() ? "Invalid" : "Error!"; - fprintf(stderr, "CC Eval %s %s: %s spending tx %s\n", lvl.data(), cond->method, - eval->state.GetRejectReason().data(), tx.vin[nIn].prevout.hash.GetHex().data()); + fprintf(stderr, "CC Eval %s %s: %s spending tx %s\n", + EvalToStr(cond->code[0]).data(), + lvl.data(), + eval->state.GetRejectReason().data(), + tx.vin[nIn].prevout.hash.GetHex().data()); if (eval->state.IsError()) fprintf(stderr, "Culprit: %s\n", EncodeHexTx(tx).data()); return false; } @@ -36,24 +39,17 @@ bool RunCCEval(const CC *cond, const CTransaction &tx, unsigned int nIn) */ bool Eval::Dispatch(const CC *cond, const CTransaction &txTo, unsigned int nIn) { - if (strcmp(cond->method, "TestEval") == 0) { - bool valid = cond->paramsBinLength == 8 && memcmp(cond->paramsBin, "TestEval", 8) == 0; - return valid ? Valid() : Invalid("testing"); + if (cond->codeLength == 0) + return Invalid("empty-eval"); + + uint8_t ecode = cond->code[0]; + std::vector vparams(cond->code+1, cond->code+cond->codeLength); + + if (ecode == EVAL_IMPORTPAYOUT) { + return ImportPayout(vparams, txTo, nIn); } - if (strcmp(cond->method, "ImportPayout") == 0) { - return ImportPayout(cond, txTo, nIn); - } - - /* Example of how you might call DisputePayout - if (strcmp(ASSETCHAINS_SYMBOL, "PANGEA") == 0) { - if (strcmp(cond->method, "DisputePoker") == 0) { - return DisputePayout(PokerVM(), cond, txTo, nIn); - } - } - */ - - return Invalid("no-such-method"); + return Invalid("invalid-code"); } @@ -147,9 +143,26 @@ bool Eval::CheckNotaryInputs(const CTransaction &tx, uint32_t height, uint32_t t } -extern char ASSETCHAINS_SYMBOL[16]; +/* + * Get MoM from a notarisation tx hash + */ +bool Eval::GetNotarisationData(const uint256 notaryHash, NotarisationData &data) const +{ + CTransaction notarisationTx; + CBlockIndex block; + if (!GetTxConfirmed(notaryHash, notarisationTx, block)) return false; + if (!CheckNotaryInputs(notarisationTx, block.nHeight, block.nTime)) return false; + if (notarisationTx.vout.size() < 2) return false; + if (!data.Parse(notarisationTx.vout[1].scriptPubKey)) return false; + return true; +} +/* + * Notarisation data, ie, OP_RETURN payload in notarisation transactions + */ +extern char ASSETCHAINS_SYMBOL[16]; + bool NotarisationData::Parse(const CScript scriptPK) { *this = NotarisationData(); @@ -179,17 +192,14 @@ bool NotarisationData::Parse(const CScript scriptPK) } - /* - * Get MoM from a notarisation tx hash + * Misc */ -bool Eval::GetNotarisationData(const uint256 notaryHash, NotarisationData &data) const + +std::string EvalToStr(EvalCode c) { - CTransaction notarisationTx; - CBlockIndex block; - if (!GetTxConfirmed(notaryHash, notarisationTx, block)) return false; - if (!CheckNotaryInputs(notarisationTx, block.nHeight, block.nTime)) return false; - if (notarisationTx.vout.size() < 2) return false; - if (!data.Parse(notarisationTx.vout[1].scriptPubKey)) return false; - return true; + FOREACH_EVAL(EVAL_GENERATE_STRING); + char s[10]; + sprintf(s, "0x%x", c); + return std::string(s); } diff --git a/src/cc/eval.h b/src/cc/eval.h index b884da5d8..f998c9f3d 100644 --- a/src/cc/eval.h +++ b/src/cc/eval.h @@ -10,6 +10,22 @@ #include "primitives/transaction.h" +/* + * Eval codes + * + * Add to below macro to generate new code. + * + * If at some point a new interpretation model is introduced, + * there should be a code identifying it. For example, + * a possible code is EVAL_BITCOIN_SCRIPT, where the entire binary + * after the code is interpreted as a bitcoin script. + */ +#define FOREACH_EVAL(EVAL) \ + EVAL(EVAL_IMPORTPAYOUT, 0xe1) + +typedef uint8_t EvalCode; + + class AppVM; class NotarisationData; @@ -31,12 +47,12 @@ public: /* * Dispute a payout using a VM */ - bool DisputePayout(AppVM &vm, const CC *cond, const CTransaction &disputeTx, unsigned int nIn); + bool DisputePayout(AppVM &vm, std::vector params, const CTransaction &disputeTx, unsigned int nIn); /* * Test an ImportPayout CC Eval condition */ - bool ImportPayout(const CC *cond, const CTransaction &payoutTx, unsigned int nIn); + bool ImportPayout(std::vector params, const CTransaction &importTx, unsigned int nIn); /* * IO functions @@ -88,23 +104,36 @@ public: }; +/* + * Eval code utilities. + */ +#define EVAL_GENERATE_DEF(L,I) const uint8_t L = I; +#define EVAL_GENERATE_STRING(L,I) if (c == I) return #L; + +FOREACH_EVAL(EVAL_GENERATE_DEF); + +std::string EvalToStr(EvalCode c); + + /* * Serialisation boilerplate */ +#define E_MARSHAL(body) SerializeF([&] (CDataStream &ss) {body;}) template -std::vector CheckSerialize(const T in) +std::vector SerializeF(const T f) { CDataStream ss(SER_NETWORK, PROTOCOL_VERSION); - ss << in; + f(ss); return std::vector(ss.begin(), ss.end()); } +#define E_UNMARSHAL(params, body) DeserializeF(params, [&] (CDataStream &ss) {body;}) template -bool CheckDeserialize(const std::vector vIn, T &out) +bool DeserializeF(const std::vector vIn, T f) { CDataStream ss(vIn, SER_NETWORK, PROTOCOL_VERSION); try { - ss >> out; + f(ss); if (ss.eof()) return true; } catch(...) {} return false; diff --git a/src/cc/importpayout.cpp b/src/cc/importpayout.cpp index 858e71f31..1363eb924 100644 --- a/src/cc/importpayout.cpp +++ b/src/cc/importpayout.cpp @@ -12,7 +12,7 @@ * Crypto-Condition EVAL method that verifies a payout against a transaction * notarised on another chain. * - * IN: cond - CC EVAL node + * IN: params - condition params * IN: importTx - Payout transaction on value chain (KMD) * IN: nIn - index of input of stake * @@ -29,7 +29,7 @@ * out 0: OP_RETURN hash of payouts * out 1-: anything */ -bool Eval::ImportPayout(const CC *cond, const CTransaction &importTx, unsigned int nIn) +bool Eval::ImportPayout(const std::vector params, const CTransaction &importTx, unsigned int nIn) { if (importTx.vout.size() == 0) return Invalid("no-vouts"); @@ -37,10 +37,9 @@ bool Eval::ImportPayout(const CC *cond, const CTransaction &importTx, unsigned i MoMProof proof; CTransaction disputeTx; { - std::pair pair(proof, disputeTx); std::vector vopret; GetOpReturnData(importTx.vout[0].scriptPubKey, vopret); - if (!CheckDeserialize(vopret, pair)) + if (!E_UNMARSHAL(vopret, ss >> proof; ss >> disputeTx)) return Invalid("invalid-payload"); } @@ -56,16 +55,18 @@ bool Eval::ImportPayout(const CC *cond, const CTransaction &importTx, unsigned i // Check disputeTx spends sessionTx.0 // condition ImportPayout params is session ID from other chain { - if (cond->paramsBinLength != 32) return Invalid("malformed-params"); - COutPoint prevout = disputeTx.vin[0].prevout; - if (memcmp(prevout.hash.begin(), cond->paramsBin, 32) != 0 || - prevout.n != 0) return Invalid("wrong-session"); + uint256 sessionHash; + if (!E_UNMARSHAL(params, ss >> sessionHash)) + return Invalid("malformed-params"); + if (disputeTx.vin[0].prevout != COutPoint(sessionHash, 0)) + return Invalid("wrong-session"); } // Check disputeTx solves momproof from vout[0] { NotarisationData data; - if (!GetNotarisationData(proof.notarisationHash, data)) return Invalid("coudnt-load-mom"); + if (!GetNotarisationData(proof.notarisationHash, data)) + return Invalid("coudnt-load-mom"); if (data.MoM != proof.Exec(disputeTx.GetHash())) return Invalid("mom-check-fail"); diff --git a/src/cryptoconditions/.gitignore b/src/cryptoconditions/.gitignore index 1d84f2618..c70559748 100644 --- a/src/cryptoconditions/.gitignore +++ b/src/cryptoconditions/.gitignore @@ -22,3 +22,4 @@ converter-sample.c config.* .pytest_cache +src/asn/asn_system.h diff --git a/src/cryptoconditions/Makefile.am b/src/cryptoconditions/Makefile.am index 3b482b9c7..52f12eee0 100644 --- a/src/cryptoconditions/Makefile.am +++ b/src/cryptoconditions/Makefile.am @@ -48,7 +48,6 @@ libcryptoconditions_core_la_SOURCES = \ src/asn/ThresholdFingerprintContents.c \ src/asn/RsaFingerprintContents.c \ src/asn/Ed25519FingerprintContents.c \ - src/asn/EvalFingerprintContents.c \ src/asn/EvalFulfillment.c \ src/asn/Secp256k1FingerprintContents.c \ src/asn/Secp256k1Fulfillment.c \ @@ -83,3 +82,10 @@ test: test-debug-interactive: gdb -ex run --args python3 -m pytest -s -x -v + +asn: + cd src/asn; \ + mv asn_system.h asn_system.bak; \ + rm *.c *.h; \ + asn1c CryptoConditions.asn; \ + mv asn_system.bak asn_system.h diff --git a/src/cryptoconditions/include/cryptoconditions.h b/src/cryptoconditions/include/cryptoconditions.h index 1c70441b3..08f00a2ca 100644 --- a/src/cryptoconditions/include/cryptoconditions.h +++ b/src/cryptoconditions/include/cryptoconditions.h @@ -40,18 +40,18 @@ typedef struct CC { struct CCType *type; union { // public key types - struct { unsigned char *publicKey, *signature; }; + struct { uint8_t *publicKey, *signature; }; // preimage - struct { unsigned char *preimage; uint16_t preimageLength; }; + struct { uint8_t *preimage; size_t preimageLength; }; // threshold struct { long threshold; uint8_t size; struct CC **subconditions; }; // prefix - struct { unsigned char *prefix; uint16_t prefixLength; struct CC *subcondition; - uint16_t maxMessageLength; }; + struct { uint8_t *prefix; size_t prefixLength; struct CC *subcondition; + size_t maxMessageLength; }; // eval - struct { char method[64]; unsigned char *paramsBin; uint16_t paramsBinLength; }; + struct { uint8_t *code; size_t codeLength; }; // anon - struct { unsigned char fingerprint[32]; uint32_t subtypes; unsigned long cost; + struct { uint8_t fingerprint[32]; uint32_t subtypes; unsigned long cost; struct CCType *conditionType; }; }; } CC; @@ -63,7 +63,7 @@ typedef struct CC { */ typedef struct CCVisitor { int (*visit)(CC *cond, struct CCVisitor visitor); - const unsigned char *msg; + const uint8_t *msg; size_t msgLength; void *context; } CCVisitor; @@ -73,20 +73,20 @@ typedef struct CCVisitor { * Public methods */ int cc_isFulfilled(const CC *cond); -int cc_verify(const struct CC *cond, const unsigned char *msg, size_t msgLength, - int doHashMessage, const unsigned char *condBin, size_t condBinLength, +int cc_verify(const struct CC *cond, const uint8_t *msg, size_t msgLength, + int doHashMessage, const uint8_t *condBin, size_t condBinLength, VerifyEval verifyEval, void *evalContext); int cc_visit(CC *cond, struct CCVisitor visitor); -int cc_signTreeEd25519(CC *cond, const unsigned char *privateKey, - const unsigned char *msg, uint16_t msgLength); -int cc_signTreeSecp256k1Msg32(CC *cond, const unsigned char *privateKey, const unsigned char *msg32); -size_t cc_conditionBinary(const CC *cond, unsigned char *buf); -size_t cc_fulfillmentBinary(const CC *cond, unsigned char *buf, size_t bufLength); -static int cc_secp256k1VerifyTreeMsg32(const CC *cond, const unsigned char *msg32); +int cc_signTreeEd25519(CC *cond, const uint8_t *privateKey, const uint8_t *msg, + const size_t msgLength); +int cc_signTreeSecp256k1Msg32(CC *cond, const uint8_t *privateKey, const uint8_t *msg32); +int cc_secp256k1VerifyTreeMsg32(const CC *cond, const uint8_t *msg32); +size_t cc_conditionBinary(const CC *cond, uint8_t *buf); +size_t cc_fulfillmentBinary(const CC *cond, uint8_t *buf, size_t bufLength); struct CC* cc_conditionFromJSON(cJSON *params, char *err); struct CC* cc_conditionFromJSONString(const char *json, char *err); -struct CC* cc_readConditionBinary(const unsigned char *cond_bin, size_t cond_bin_len); -struct CC* cc_readFulfillmentBinary(const unsigned char *ffill_bin, size_t ffill_bin_len); +struct CC* cc_readConditionBinary(const uint8_t *cond_bin, size_t cond_bin_len); +struct CC* cc_readFulfillmentBinary(const uint8_t *ffill_bin, size_t ffill_bin_len); struct CC* cc_new(int typeId); struct cJSON* cc_conditionToJSON(const CC *cond); char* cc_conditionToJSONString(const CC *cond); diff --git a/src/cryptoconditions/src/anon.c b/src/cryptoconditions/src/anon.c index 38f8e8543..80161a36a 100644 --- a/src/cryptoconditions/src/anon.c +++ b/src/cryptoconditions/src/anon.c @@ -10,7 +10,7 @@ struct CCType CC_AnonType; -static CC *mkAnon(const Condition_t *asnCond) { +CC *mkAnon(const Condition_t *asnCond) { CCType *realType = getTypeByAsnEnum(asnCond->present); if (!realType) { diff --git a/src/cryptoconditions/src/asn/AuxFingerprintContents.c b/src/cryptoconditions/src/asn/AuxFingerprintContents.c deleted file mode 100644 index cc8aefa3f..000000000 --- a/src/cryptoconditions/src/asn/AuxFingerprintContents.c +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) - * From ASN.1 module "Crypto-Conditions" - * found in "CryptoConditions.asn" - */ - -#include "AuxFingerprintContents.h" - -static int -memb_method_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, - asn_app_constraint_failed_f *ctfailcb, void *app_key) { - const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; - size_t size; - - if(!sptr) { - ASN__CTFAIL(app_key, td, sptr, - "%s: value not given (%s:%d)", - td->name, __FILE__, __LINE__); - return -1; - } - - size = st->size; - - if((size == 64)) { - /* Constraint check succeeded */ - return 0; - } else { - ASN__CTFAIL(app_key, td, sptr, - "%s: constraint failed (%s:%d)", - td->name, __FILE__, __LINE__); - return -1; - } -} - -static asn_TYPE_member_t asn_MBR_AuxFingerprintContents_1[] = { - { ATF_NOFLAGS, 0, offsetof(struct AuxFingerprintContents, method), - (ASN_TAG_CLASS_CONTEXT | (0 << 2)), - -1, /* IMPLICIT tag at current level */ - &asn_DEF_OCTET_STRING, - memb_method_constraint_1, - 0, /* PER is not compiled, use -gen-PER */ - 0, - "method" - }, - { ATF_NOFLAGS, 0, offsetof(struct AuxFingerprintContents, conditionAux), - (ASN_TAG_CLASS_CONTEXT | (1 << 2)), - -1, /* IMPLICIT tag at current level */ - &asn_DEF_OCTET_STRING, - 0, /* Defer constraints checking to the member type */ - 0, /* PER is not compiled, use -gen-PER */ - 0, - "conditionAux" - }, -}; -static const ber_tlv_tag_t asn_DEF_AuxFingerprintContents_tags_1[] = { - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) -}; -static const asn_TYPE_tag2member_t asn_MAP_AuxFingerprintContents_tag2el_1[] = { - { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* method */ - { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* conditionAux */ -}; -static asn_SEQUENCE_specifics_t asn_SPC_AuxFingerprintContents_specs_1 = { - sizeof(struct AuxFingerprintContents), - offsetof(struct AuxFingerprintContents, _asn_ctx), - asn_MAP_AuxFingerprintContents_tag2el_1, - 2, /* Count of tags in the map */ - 0, 0, 0, /* Optional elements (not needed) */ - -1, /* Start extensions */ - -1 /* Stop extensions */ -}; -asn_TYPE_descriptor_t asn_DEF_AuxFingerprintContents = { - "AuxFingerprintContents", - "AuxFingerprintContents", - SEQUENCE_free, - SEQUENCE_print, - SEQUENCE_constraint, - SEQUENCE_decode_ber, - SEQUENCE_encode_der, - SEQUENCE_decode_xer, - SEQUENCE_encode_xer, - 0, 0, /* No PER support, use "-gen-PER" to enable */ - 0, /* Use generic outmost tag fetcher */ - asn_DEF_AuxFingerprintContents_tags_1, - sizeof(asn_DEF_AuxFingerprintContents_tags_1) - /sizeof(asn_DEF_AuxFingerprintContents_tags_1[0]), /* 1 */ - asn_DEF_AuxFingerprintContents_tags_1, /* Same as above */ - sizeof(asn_DEF_AuxFingerprintContents_tags_1) - /sizeof(asn_DEF_AuxFingerprintContents_tags_1[0]), /* 1 */ - 0, /* No PER visible constraints */ - asn_MBR_AuxFingerprintContents_1, - 2, /* Elements count */ - &asn_SPC_AuxFingerprintContents_specs_1 /* Additional specs */ -}; - diff --git a/src/cryptoconditions/src/asn/AuxFingerprintContents.h b/src/cryptoconditions/src/asn/AuxFingerprintContents.h deleted file mode 100644 index 9f14a1bac..000000000 --- a/src/cryptoconditions/src/asn/AuxFingerprintContents.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) - * From ASN.1 module "Crypto-Conditions" - * found in "CryptoConditions.asn" - */ - -#ifndef _AuxFingerprintContents_H_ -#define _AuxFingerprintContents_H_ - - -#include - -/* Including external dependencies */ -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* AuxFingerprintContents */ -typedef struct AuxFingerprintContents { - OCTET_STRING_t method; - OCTET_STRING_t conditionAux; - - /* Context for parsing across buffer boundaries */ - asn_struct_ctx_t _asn_ctx; -} AuxFingerprintContents_t; - -/* Implementation */ -extern asn_TYPE_descriptor_t asn_DEF_AuxFingerprintContents; - -#ifdef __cplusplus -} -#endif - -#endif /* _AuxFingerprintContents_H_ */ -#include diff --git a/src/cryptoconditions/src/asn/AuxFulfillment.c b/src/cryptoconditions/src/asn/AuxFulfillment.c deleted file mode 100644 index 84362f79d..000000000 --- a/src/cryptoconditions/src/asn/AuxFulfillment.c +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) - * From ASN.1 module "Crypto-Conditions" - * found in "CryptoConditions.asn" - */ - -#include "AuxFulfillment.h" - -static asn_TYPE_member_t asn_MBR_AuxFulfillment_1[] = { - { ATF_NOFLAGS, 0, offsetof(struct AuxFulfillment, method), - (ASN_TAG_CLASS_CONTEXT | (0 << 2)), - -1, /* IMPLICIT tag at current level */ - &asn_DEF_OCTET_STRING, - 0, /* Defer constraints checking to the member type */ - 0, /* PER is not compiled, use -gen-PER */ - 0, - "method" - }, - { ATF_NOFLAGS, 0, offsetof(struct AuxFulfillment, conditionAux), - (ASN_TAG_CLASS_CONTEXT | (1 << 2)), - -1, /* IMPLICIT tag at current level */ - &asn_DEF_OCTET_STRING, - 0, /* Defer constraints checking to the member type */ - 0, /* PER is not compiled, use -gen-PER */ - 0, - "conditionAux" - }, - { ATF_NOFLAGS, 0, offsetof(struct AuxFulfillment, fulfillmentAux), - (ASN_TAG_CLASS_CONTEXT | (2 << 2)), - -1, /* IMPLICIT tag at current level */ - &asn_DEF_OCTET_STRING, - 0, /* Defer constraints checking to the member type */ - 0, /* PER is not compiled, use -gen-PER */ - 0, - "fulfillmentAux" - }, -}; -static const ber_tlv_tag_t asn_DEF_AuxFulfillment_tags_1[] = { - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) -}; -static const asn_TYPE_tag2member_t asn_MAP_AuxFulfillment_tag2el_1[] = { - { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* method */ - { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* conditionAux */ - { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* fulfillmentAux */ -}; -static asn_SEQUENCE_specifics_t asn_SPC_AuxFulfillment_specs_1 = { - sizeof(struct AuxFulfillment), - offsetof(struct AuxFulfillment, _asn_ctx), - asn_MAP_AuxFulfillment_tag2el_1, - 3, /* Count of tags in the map */ - 0, 0, 0, /* Optional elements (not needed) */ - -1, /* Start extensions */ - -1 /* Stop extensions */ -}; -asn_TYPE_descriptor_t asn_DEF_AuxFulfillment = { - "AuxFulfillment", - "AuxFulfillment", - SEQUENCE_free, - SEQUENCE_print, - SEQUENCE_constraint, - SEQUENCE_decode_ber, - SEQUENCE_encode_der, - SEQUENCE_decode_xer, - SEQUENCE_encode_xer, - 0, 0, /* No PER support, use "-gen-PER" to enable */ - 0, /* Use generic outmost tag fetcher */ - asn_DEF_AuxFulfillment_tags_1, - sizeof(asn_DEF_AuxFulfillment_tags_1) - /sizeof(asn_DEF_AuxFulfillment_tags_1[0]), /* 1 */ - asn_DEF_AuxFulfillment_tags_1, /* Same as above */ - sizeof(asn_DEF_AuxFulfillment_tags_1) - /sizeof(asn_DEF_AuxFulfillment_tags_1[0]), /* 1 */ - 0, /* No PER visible constraints */ - asn_MBR_AuxFulfillment_1, - 3, /* Elements count */ - &asn_SPC_AuxFulfillment_specs_1 /* Additional specs */ -}; - diff --git a/src/cryptoconditions/src/asn/AuxFulfillment.h b/src/cryptoconditions/src/asn/AuxFulfillment.h deleted file mode 100644 index 89b514b77..000000000 --- a/src/cryptoconditions/src/asn/AuxFulfillment.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) - * From ASN.1 module "Crypto-Conditions" - * found in "CryptoConditions.asn" - */ - -#ifndef _AuxFulfillment_H_ -#define _AuxFulfillment_H_ - - -#include - -/* Including external dependencies */ -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* AuxFulfillment */ -typedef struct AuxFulfillment { - OCTET_STRING_t method; - OCTET_STRING_t conditionAux; - OCTET_STRING_t fulfillmentAux; - - /* Context for parsing across buffer boundaries */ - asn_struct_ctx_t _asn_ctx; -} AuxFulfillment_t; - -/* Implementation */ -extern asn_TYPE_descriptor_t asn_DEF_AuxFulfillment; - -#ifdef __cplusplus -} -#endif - -#endif /* _AuxFulfillment_H_ */ -#include diff --git a/src/cryptoconditions/src/asn/AuxSha512Fulfillment.c b/src/cryptoconditions/src/asn/AuxSha512Fulfillment.c deleted file mode 100644 index 62ad8a76f..000000000 --- a/src/cryptoconditions/src/asn/AuxSha512Fulfillment.c +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) - * From ASN.1 module "Crypto-Conditions" - * found in "CryptoConditions.asn" - */ - -#include "AuxSha512Fulfillment.h" - -static asn_TYPE_member_t asn_MBR_AuxSha512Fulfillment_1[] = { - { ATF_NOFLAGS, 0, offsetof(struct AuxSha512Fulfillment, method), - (ASN_TAG_CLASS_CONTEXT | (0 << 2)), - -1, /* IMPLICIT tag at current level */ - &asn_DEF_OCTET_STRING, - 0, /* Defer constraints checking to the member type */ - 0, /* PER is not compiled, use -gen-PER */ - 0, - "method" - }, - { ATF_NOFLAGS, 0, offsetof(struct AuxSha512Fulfillment, conditionAux), - (ASN_TAG_CLASS_CONTEXT | (1 << 2)), - -1, /* IMPLICIT tag at current level */ - &asn_DEF_OCTET_STRING, - 0, /* Defer constraints checking to the member type */ - 0, /* PER is not compiled, use -gen-PER */ - 0, - "conditionAux" - }, - { ATF_NOFLAGS, 0, offsetof(struct AuxSha512Fulfillment, fulfillmentAux), - (ASN_TAG_CLASS_CONTEXT | (2 << 2)), - -1, /* IMPLICIT tag at current level */ - &asn_DEF_OCTET_STRING, - 0, /* Defer constraints checking to the member type */ - 0, /* PER is not compiled, use -gen-PER */ - 0, - "fulfillmentAux" - }, -}; -static const ber_tlv_tag_t asn_DEF_AuxSha512Fulfillment_tags_1[] = { - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) -}; -static const asn_TYPE_tag2member_t asn_MAP_AuxSha512Fulfillment_tag2el_1[] = { - { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* method */ - { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* conditionAux */ - { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* fulfillmentAux */ -}; -static asn_SEQUENCE_specifics_t asn_SPC_AuxSha512Fulfillment_specs_1 = { - sizeof(struct AuxSha512Fulfillment), - offsetof(struct AuxSha512Fulfillment, _asn_ctx), - asn_MAP_AuxSha512Fulfillment_tag2el_1, - 3, /* Count of tags in the map */ - 0, 0, 0, /* Optional elements (not needed) */ - -1, /* Start extensions */ - -1 /* Stop extensions */ -}; -asn_TYPE_descriptor_t asn_DEF_AuxSha512Fulfillment = { - "AuxSha512Fulfillment", - "AuxSha512Fulfillment", - SEQUENCE_free, - SEQUENCE_print, - SEQUENCE_constraint, - SEQUENCE_decode_ber, - SEQUENCE_encode_der, - SEQUENCE_decode_xer, - SEQUENCE_encode_xer, - 0, 0, /* No PER support, use "-gen-PER" to enable */ - 0, /* Use generic outmost tag fetcher */ - asn_DEF_AuxSha512Fulfillment_tags_1, - sizeof(asn_DEF_AuxSha512Fulfillment_tags_1) - /sizeof(asn_DEF_AuxSha512Fulfillment_tags_1[0]), /* 1 */ - asn_DEF_AuxSha512Fulfillment_tags_1, /* Same as above */ - sizeof(asn_DEF_AuxSha512Fulfillment_tags_1) - /sizeof(asn_DEF_AuxSha512Fulfillment_tags_1[0]), /* 1 */ - 0, /* No PER visible constraints */ - asn_MBR_AuxSha512Fulfillment_1, - 3, /* Elements count */ - &asn_SPC_AuxSha512Fulfillment_specs_1 /* Additional specs */ -}; - diff --git a/src/cryptoconditions/src/asn/AuxSha512Fulfillment.h b/src/cryptoconditions/src/asn/AuxSha512Fulfillment.h deleted file mode 100644 index 81a7fa140..000000000 --- a/src/cryptoconditions/src/asn/AuxSha512Fulfillment.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) - * From ASN.1 module "Crypto-Conditions" - * found in "CryptoConditions.asn" - */ - -#ifndef _AuxSha512Fulfillment_H_ -#define _AuxSha512Fulfillment_H_ - - -#include - -/* Including external dependencies */ -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* AuxSha512Fulfillment */ -typedef struct AuxSha512Fulfillment { - OCTET_STRING_t method; - OCTET_STRING_t conditionAux; - OCTET_STRING_t fulfillmentAux; - - /* Context for parsing across buffer boundaries */ - asn_struct_ctx_t _asn_ctx; -} AuxSha512Fulfillment_t; - -/* Implementation */ -extern asn_TYPE_descriptor_t asn_DEF_AuxSha512Fulfillment; - -#ifdef __cplusplus -} -#endif - -#endif /* _AuxSha512Fulfillment_H_ */ -#include diff --git a/src/cryptoconditions/src/asn/CryptoConditions.asn b/src/cryptoconditions/src/asn/CryptoConditions.asn index 8aa1e365b..42a3c88f1 100644 --- a/src/cryptoconditions/src/asn/CryptoConditions.asn +++ b/src/cryptoconditions/src/asn/CryptoConditions.asn @@ -78,14 +78,14 @@ Crypto-Conditions DEFINITIONS AUTOMATIC TAGS ::= BEGIN } EvalFulfillment ::= SEQUENCE { - method OCTET STRING (SIZE(64)), - paramsBin OCTET STRING + code OCTET STRING } -- Fingerprint Content -- The PREIMAGE-SHA-256 condition fingerprint content is not DER encoded -- The fingerprint content is the preimage + -- Same for Eval PrefixFingerprintContents ::= SEQUENCE { prefix OCTET STRING, @@ -110,9 +110,4 @@ Crypto-Conditions DEFINITIONS AUTOMATIC TAGS ::= BEGIN publicKey OCTET STRING (SIZE(33)) } - EvalFingerprintContents ::= SEQUENCE { - method OCTET STRING (SIZE(64)), - paramsBin OCTET STRING - } - END diff --git a/src/cryptoconditions/src/asn/EvalFingerprintContents.c b/src/cryptoconditions/src/asn/EvalFingerprintContents.c deleted file mode 100644 index d23e3c386..000000000 --- a/src/cryptoconditions/src/asn/EvalFingerprintContents.c +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) - * From ASN.1 module "Crypto-Conditions" - * found in "CryptoConditions.asn" - */ - -#include "EvalFingerprintContents.h" - -static int -memb_method_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, - asn_app_constraint_failed_f *ctfailcb, void *app_key) { - const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; - size_t size; - - if(!sptr) { - ASN__CTFAIL(app_key, td, sptr, - "%s: value not given (%s:%d)", - td->name, __FILE__, __LINE__); - return -1; - } - - size = st->size; - - if((size == 64)) { - /* Constraint check succeeded */ - return 0; - } else { - ASN__CTFAIL(app_key, td, sptr, - "%s: constraint failed (%s:%d)", - td->name, __FILE__, __LINE__); - return -1; - } -} - -static asn_TYPE_member_t asn_MBR_EvalFingerprintContents_1[] = { - { ATF_NOFLAGS, 0, offsetof(struct EvalFingerprintContents, method), - (ASN_TAG_CLASS_CONTEXT | (0 << 2)), - -1, /* IMPLICIT tag at current level */ - &asn_DEF_OCTET_STRING, - memb_method_constraint_1, - 0, /* PER is not compiled, use -gen-PER */ - 0, - "method" - }, - { ATF_NOFLAGS, 0, offsetof(struct EvalFingerprintContents, paramsBin), - (ASN_TAG_CLASS_CONTEXT | (1 << 2)), - -1, /* IMPLICIT tag at current level */ - &asn_DEF_OCTET_STRING, - 0, /* Defer constraints checking to the member type */ - 0, /* PER is not compiled, use -gen-PER */ - 0, - "paramsBin" - }, -}; -static const ber_tlv_tag_t asn_DEF_EvalFingerprintContents_tags_1[] = { - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) -}; -static const asn_TYPE_tag2member_t asn_MAP_EvalFingerprintContents_tag2el_1[] = { - { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* method */ - { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* paramsBin */ -}; -static asn_SEQUENCE_specifics_t asn_SPC_EvalFingerprintContents_specs_1 = { - sizeof(struct EvalFingerprintContents), - offsetof(struct EvalFingerprintContents, _asn_ctx), - asn_MAP_EvalFingerprintContents_tag2el_1, - 2, /* Count of tags in the map */ - 0, 0, 0, /* Optional elements (not needed) */ - -1, /* Start extensions */ - -1 /* Stop extensions */ -}; -asn_TYPE_descriptor_t asn_DEF_EvalFingerprintContents = { - "EvalFingerprintContents", - "EvalFingerprintContents", - SEQUENCE_free, - SEQUENCE_print, - SEQUENCE_constraint, - SEQUENCE_decode_ber, - SEQUENCE_encode_der, - SEQUENCE_decode_xer, - SEQUENCE_encode_xer, - 0, 0, /* No PER support, use "-gen-PER" to enable */ - 0, /* Use generic outmost tag fetcher */ - asn_DEF_EvalFingerprintContents_tags_1, - sizeof(asn_DEF_EvalFingerprintContents_tags_1) - /sizeof(asn_DEF_EvalFingerprintContents_tags_1[0]), /* 1 */ - asn_DEF_EvalFingerprintContents_tags_1, /* Same as above */ - sizeof(asn_DEF_EvalFingerprintContents_tags_1) - /sizeof(asn_DEF_EvalFingerprintContents_tags_1[0]), /* 1 */ - 0, /* No PER visible constraints */ - asn_MBR_EvalFingerprintContents_1, - 2, /* Elements count */ - &asn_SPC_EvalFingerprintContents_specs_1 /* Additional specs */ -}; - diff --git a/src/cryptoconditions/src/asn/EvalFingerprintContents.h b/src/cryptoconditions/src/asn/EvalFingerprintContents.h deleted file mode 100644 index 52fb9ba62..000000000 --- a/src/cryptoconditions/src/asn/EvalFingerprintContents.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) - * From ASN.1 module "Crypto-Conditions" - * found in "CryptoConditions.asn" - */ - -#ifndef _EvalFingerprintContents_H_ -#define _EvalFingerprintContents_H_ - - -#include - -/* Including external dependencies */ -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* EvalFingerprintContents */ -typedef struct EvalFingerprintContents { - OCTET_STRING_t method; - OCTET_STRING_t paramsBin; - - /* Context for parsing across buffer boundaries */ - asn_struct_ctx_t _asn_ctx; -} EvalFingerprintContents_t; - -/* Implementation */ -extern asn_TYPE_descriptor_t asn_DEF_EvalFingerprintContents; - -#ifdef __cplusplus -} -#endif - -#endif /* _EvalFingerprintContents_H_ */ -#include diff --git a/src/cryptoconditions/src/asn/EvalFulfillment.c b/src/cryptoconditions/src/asn/EvalFulfillment.c index e56b80317..f43b21e1f 100644 --- a/src/cryptoconditions/src/asn/EvalFulfillment.c +++ b/src/cryptoconditions/src/asn/EvalFulfillment.c @@ -6,64 +6,28 @@ #include "EvalFulfillment.h" -static int -memb_method_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, - asn_app_constraint_failed_f *ctfailcb, void *app_key) { - const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; - size_t size; - - if(!sptr) { - ASN__CTFAIL(app_key, td, sptr, - "%s: value not given (%s:%d)", - td->name, __FILE__, __LINE__); - return -1; - } - - size = st->size; - - if((size == 64)) { - /* Constraint check succeeded */ - return 0; - } else { - ASN__CTFAIL(app_key, td, sptr, - "%s: constraint failed (%s:%d)", - td->name, __FILE__, __LINE__); - return -1; - } -} - static asn_TYPE_member_t asn_MBR_EvalFulfillment_1[] = { - { ATF_NOFLAGS, 0, offsetof(struct EvalFulfillment, method), + { ATF_NOFLAGS, 0, offsetof(struct EvalFulfillment, code), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_OCTET_STRING, - memb_method_constraint_1, - 0, /* PER is not compiled, use -gen-PER */ - 0, - "method" - }, - { ATF_NOFLAGS, 0, offsetof(struct EvalFulfillment, paramsBin), - (ASN_TAG_CLASS_CONTEXT | (1 << 2)), - -1, /* IMPLICIT tag at current level */ - &asn_DEF_OCTET_STRING, 0, /* Defer constraints checking to the member type */ 0, /* PER is not compiled, use -gen-PER */ 0, - "paramsBin" + "code" }, }; static const ber_tlv_tag_t asn_DEF_EvalFulfillment_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static const asn_TYPE_tag2member_t asn_MAP_EvalFulfillment_tag2el_1[] = { - { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* method */ - { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* paramsBin */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* code */ }; static asn_SEQUENCE_specifics_t asn_SPC_EvalFulfillment_specs_1 = { sizeof(struct EvalFulfillment), offsetof(struct EvalFulfillment, _asn_ctx), asn_MAP_EvalFulfillment_tag2el_1, - 2, /* Count of tags in the map */ + 1, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ @@ -88,7 +52,7 @@ asn_TYPE_descriptor_t asn_DEF_EvalFulfillment = { /sizeof(asn_DEF_EvalFulfillment_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_EvalFulfillment_1, - 2, /* Elements count */ + 1, /* Elements count */ &asn_SPC_EvalFulfillment_specs_1 /* Additional specs */ }; diff --git a/src/cryptoconditions/src/asn/EvalFulfillment.h b/src/cryptoconditions/src/asn/EvalFulfillment.h index a513ed160..378baa367 100644 --- a/src/cryptoconditions/src/asn/EvalFulfillment.h +++ b/src/cryptoconditions/src/asn/EvalFulfillment.h @@ -20,8 +20,7 @@ extern "C" { /* EvalFulfillment */ typedef struct EvalFulfillment { - OCTET_STRING_t method; - OCTET_STRING_t paramsBin; + OCTET_STRING_t code; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; diff --git a/src/cryptoconditions/src/asn/Makefile.am.sample b/src/cryptoconditions/src/asn/Makefile.am.sample index 0bf696a74..9ff904aca 100644 --- a/src/cryptoconditions/src/asn/Makefile.am.sample +++ b/src/cryptoconditions/src/asn/Makefile.am.sample @@ -15,8 +15,7 @@ ASN_MODULE_SOURCES= \ ThresholdFingerprintContents.c \ RsaFingerprintContents.c \ Ed25519FingerprintContents.c \ - Secp256k1FingerprintContents.c \ - EvalFingerprintContents.c + Secp256k1FingerprintContents.c ASN_MODULE_HEADERS= \ Condition.h \ @@ -35,8 +34,7 @@ ASN_MODULE_HEADERS= \ ThresholdFingerprintContents.h \ RsaFingerprintContents.h \ Ed25519FingerprintContents.h \ - Secp256k1FingerprintContents.h \ - EvalFingerprintContents.h + Secp256k1FingerprintContents.h ASN_MODULE_HEADERS+=INTEGER.h ASN_MODULE_HEADERS+=NativeEnumerated.h diff --git a/src/cryptoconditions/src/asn/asn_system.h b/src/cryptoconditions/src/asn/asn_system.h index 71596fc34..7e64ba109 100644 --- a/src/cryptoconditions/src/asn/asn_system.h +++ b/src/cryptoconditions/src/asn/asn_system.h @@ -125,14 +125,4 @@ typedef unsigned int uint32_t; #define offsetof(s, m) ((ptrdiff_t)&(((s *)0)->m) - (ptrdiff_t)((s *)0)) #endif /* offsetof */ - -//#ifndef MIN /* Suitable for comparing primitive types (integers) */ -//#if defined(__GNUC__) -//#define MIN(a,b) ({ __typeof a _a = a; __typeof b _b = b; \ -// ((_a)<(_b)?(_a):(_b)); }) -//#else /* !__GNUC__ */ -//#define MIN(a,b) ((a)<(b)?(a):(b)) /* Unsafe variant */ -//#endif /* __GNUC__ */ -//#endif /* MIN */ - #endif /* ASN_SYSTEM_H */ diff --git a/src/cryptoconditions/src/cryptoconditions.c b/src/cryptoconditions/src/cryptoconditions.c index 6a6513b59..2f136917e 100644 --- a/src/cryptoconditions/src/cryptoconditions.c +++ b/src/cryptoconditions/src/cryptoconditions.c @@ -69,7 +69,7 @@ char *cc_conditionUri(const CC *cond) { } -static ConditionTypes_t asnSubtypes(uint32_t mask) { +ConditionTypes_t asnSubtypes(uint32_t mask) { ConditionTypes_t types; uint8_t buf[4] = {0,0,0,0}; int maxId = 0; @@ -89,7 +89,7 @@ static ConditionTypes_t asnSubtypes(uint32_t mask) { } -static uint32_t fromAsnSubtypes(const ConditionTypes_t types) { +uint32_t fromAsnSubtypes(const ConditionTypes_t types) { uint32_t mask = 0; for (int i=0; i> 3] & (1 << (7 - i % 8))) { @@ -125,7 +125,7 @@ size_t cc_fulfillmentBinary(const CC *cond, unsigned char *buf, size_t length) { } -static void asnCondition(const CC *cond, Condition_t *asn) { +void asnCondition(const CC *cond, Condition_t *asn) { asn->present = cc_isAnon(cond) ? cond->conditionType->asnType : cond->type->asnType; // This may look a little weird - we dont have a reference here to the correct @@ -140,14 +140,14 @@ static void asnCondition(const CC *cond, Condition_t *asn) { } -static Condition_t *asnConditionNew(const CC *cond) { +Condition_t *asnConditionNew(const CC *cond) { Condition_t *asn = calloc(1, sizeof(Condition_t)); asnCondition(cond, asn); return asn; } -static Fulfillment_t *asnFulfillmentNew(const CC *cond) { +Fulfillment_t *asnFulfillmentNew(const CC *cond) { return cond->type->toFulfillment(cond); } @@ -167,7 +167,7 @@ CCType *getTypeByAsnEnum(Condition_PR present) { } -static CC *fulfillmentToCC(Fulfillment_t *ffill) { +CC *fulfillmentToCC(Fulfillment_t *ffill) { CCType *type = getTypeByAsnEnum(ffill->present); if (!type) { fprintf(stderr, "Unknown fulfillment type: %i\n", ffill->present); diff --git a/src/cryptoconditions/src/ed25519.c b/src/cryptoconditions/src/ed25519.c index 18cee0768..7ae99b226 100644 --- a/src/cryptoconditions/src/ed25519.c +++ b/src/cryptoconditions/src/ed25519.c @@ -58,7 +58,8 @@ static int ed25519Sign(CC *cond, CCVisitor visitor) { /* * Sign ed25519 conditions in a tree */ -int cc_signTreeEd25519(CC *cond, const unsigned char *privateKey, const unsigned char *msg, uint16_t msgLength) { +int cc_signTreeEd25519(CC *cond, const unsigned char *privateKey, const unsigned char *msg, + const size_t msgLength) { unsigned char pk[32], skpk[64]; ed25519_create_keypair(pk, skpk, privateKey); @@ -74,7 +75,7 @@ static unsigned long ed25519Cost(const CC *cond) { } -static CC *ed25519FromJSON(const cJSON *params, unsigned char *err) { +static CC *ed25519FromJSON(const cJSON *params, char *err) { size_t binsz; cJSON *pk_item = cJSON_GetObjectItem(params, "publicKey"); diff --git a/src/cryptoconditions/src/eval.c b/src/cryptoconditions/src/eval.c index 92a1c6e70..2c15b7c0e 100644 --- a/src/cryptoconditions/src/eval.c +++ b/src/cryptoconditions/src/eval.c @@ -1,7 +1,6 @@ #include "asn/Condition.h" #include "asn/Fulfillment.h" #include "asn/EvalFulfillment.h" -#include "asn/EvalFingerprintContents.h" #include "asn/OCTET_STRING.h" #include "cryptoconditions.h" #include "internal.h" @@ -12,10 +11,9 @@ struct CCType CC_EvalType; static unsigned char *evalFingerprint(const CC *cond) { - EvalFingerprintContents_t *fp = calloc(1, sizeof(EvalFingerprintContents_t)); - OCTET_STRING_fromBuf(&fp->method, cond->method, strlen(cond->method)); - OCTET_STRING_fromBuf(&fp->paramsBin, cond->paramsBin, cond->paramsBinLength); - return hashFingerprintContents(&asn_DEF_EvalFingerprintContents, fp); + unsigned char *hash = calloc(1, 32); + sha256(cond->code, cond->codeLength, hash); + return hash; } @@ -24,40 +22,26 @@ static unsigned long evalCost(const CC *cond) { } -static CC *evalFromJSON(const cJSON *params, unsigned char *err) { - size_t paramsBinLength; - unsigned char *paramsBin = 0; +static CC *evalFromJSON(const cJSON *params, char *err) { + size_t codeLength; + unsigned char *code = 0; - cJSON *method_item = cJSON_GetObjectItem(params, "method"); - if (!checkString(method_item, "method", err)) { - return NULL; - } - - if (strlen(method_item->valuestring) > 64) { - strcpy(err, "method must be less than or equal to 64 bytes"); - return NULL; - } - - if (!jsonGetBase64(params, "params", err, ¶msBin, ¶msBinLength)) { + if (!jsonGetBase64(params, "code", err, &code, &codeLength)) { return NULL; } CC *cond = cc_new(CC_Eval); - strcpy(cond->method, method_item->valuestring); - cond->paramsBin = paramsBin; - cond->paramsBinLength = paramsBinLength; + cond->code = code; + cond->codeLength = codeLength; return cond; } -static void evalToJSON(const CC *cond, cJSON *params) { +static void evalToJSON(const CC *cond, cJSON *code) { - // add method - cJSON_AddItemToObject(params, "method", cJSON_CreateString(cond->method)); - - // add params - unsigned char *b64 = base64_encode(cond->paramsBin, cond->paramsBinLength); - cJSON_AddItemToObject(params, "params", cJSON_CreateString(b64)); + // add code + unsigned char *b64 = base64_encode(cond->code, cond->codeLength); + cJSON_AddItemToObject(code, "code", cJSON_CreateString(b64)); free(b64); } @@ -67,13 +51,10 @@ static CC *evalFromFulfillment(const Fulfillment_t *ffill) { EvalFulfillment_t *eval = &ffill->choice.evalSha256; - memcpy(cond->method, eval->method.buf, eval->method.size); - cond->method[eval->method.size] = 0; - - OCTET_STRING_t octets = eval->paramsBin; - cond->paramsBinLength = octets.size; - cond->paramsBin = malloc(octets.size); - memcpy(cond->paramsBin, octets.buf, octets.size); + OCTET_STRING_t octets = eval->code; + cond->codeLength = octets.size; + cond->code = malloc(octets.size); + memcpy(cond->code, octets.buf, octets.size); return cond; } @@ -83,8 +64,7 @@ static Fulfillment_t *evalToFulfillment(const CC *cond) { Fulfillment_t *ffill = calloc(1, sizeof(Fulfillment_t)); ffill->present = Fulfillment_PR_evalSha256; EvalFulfillment_t *eval = &ffill->choice.evalSha256; - OCTET_STRING_fromBuf(&eval->method, cond->method, strlen(cond->method)); - OCTET_STRING_fromBuf(&eval->paramsBin, cond->paramsBin, cond->paramsBinLength); + OCTET_STRING_fromBuf(&eval->code, cond->code, cond->codeLength); return ffill; } @@ -95,7 +75,7 @@ int evalIsFulfilled(const CC *cond) { static void evalFree(CC *cond) { - free(cond->paramsBin); + free(cond->code); } @@ -108,9 +88,8 @@ static uint32_t evalSubtypes(const CC *cond) { * The JSON api doesn't contain custom verifiers, so a stub method is provided suitable for testing */ int jsonVerifyEval(CC *cond, void *context) { - if (strcmp(cond->method, "testEval") == 0) { - return memcmp(cond->paramsBin, "testEval", cond->paramsBinLength) == 0; - } + if (cond->codeLength == 9 && memcmp(cond->code, "TestEval", 8)) + return cond->code[8]; fprintf(stderr, "Cannot verify eval; user function unknown\n"); return 0; } diff --git a/src/cryptoconditions/src/internal.h b/src/cryptoconditions/src/internal.h index d8e09310a..90c997dfe 100644 --- a/src/cryptoconditions/src/internal.h +++ b/src/cryptoconditions/src/internal.h @@ -39,21 +39,20 @@ typedef struct CCType { /* * Globals */ -struct CCType *CCTypeRegistry[]; +struct CCType *CCTypeRegistry[32]; int CCTypeRegistryLength; /* * Internal API */ -static uint32_t fromAsnSubtypes(ConditionTypes_t types); -static CC *mkAnon(const Condition_t *asnCond); -static void asnCondition(const CC *cond, Condition_t *asn); -static Condition_t *asnConditionNew(const CC *cond); -static Fulfillment_t *asnFulfillmentNew(const CC *cond); -static cJSON *jsonEncodeCondition(cJSON *params, char *err); -static struct CC *fulfillmentToCC(Fulfillment_t *ffill); -static struct CCType *getTypeByAsnEnum(Condition_PR present); +uint32_t fromAsnSubtypes(ConditionTypes_t types); +CC *mkAnon(const Condition_t *asnCond); +void asnCondition(const CC *cond, Condition_t *asn); +Condition_t *asnConditionNew(const CC *cond); +Fulfillment_t *asnFulfillmentNew(const CC *cond); +struct CC *fulfillmentToCC(Fulfillment_t *ffill); +struct CCType *getTypeByAsnEnum(Condition_PR present); /* diff --git a/src/cryptoconditions/src/prefix.c b/src/cryptoconditions/src/prefix.c index 15a7fa2b7..66d432bd2 100644 --- a/src/cryptoconditions/src/prefix.c +++ b/src/cryptoconditions/src/prefix.c @@ -74,7 +74,7 @@ static uint32_t prefixSubtypes(const CC *cond) { } -static CC *prefixFromJSON(const cJSON *params, unsigned char *err) { +static CC *prefixFromJSON(const cJSON *params, char *err) { cJSON *mml_item = cJSON_GetObjectItem(params, "maxMessageLength"); if (!cJSON_IsNumber(mml_item)) { strcpy(err, "maxMessageLength must be a number"); diff --git a/src/cryptoconditions/src/preimage.c b/src/cryptoconditions/src/preimage.c index 39953e815..049e0eecc 100644 --- a/src/cryptoconditions/src/preimage.c +++ b/src/cryptoconditions/src/preimage.c @@ -10,13 +10,13 @@ struct CCType CC_PreimageType; -static CC *preimageFromJSON(const cJSON *params, unsigned char *err) { +static CC *preimageFromJSON(const cJSON *params, char *err) { cJSON *preimage_item = cJSON_GetObjectItem(params, "preimage"); if (!cJSON_IsString(preimage_item)) { strcpy(err, "preimage must be a string"); return NULL; } - unsigned char *preimage_b64 = preimage_item->valuestring; + char *preimage_b64 = preimage_item->valuestring; CC *cond = cc_new(CC_Preimage); cond->preimage = base64_decode(preimage_b64, &cond->preimageLength); diff --git a/src/cryptoconditions/src/secp256k1.c b/src/cryptoconditions/src/secp256k1.c index 78fbd7602..b62b2c178 100644 --- a/src/cryptoconditions/src/secp256k1.c +++ b/src/cryptoconditions/src/secp256k1.c @@ -97,7 +97,7 @@ int secp256k1Verify(CC *cond, CCVisitor visitor) { } -static int cc_secp256k1VerifyTreeMsg32(const CC *cond, const unsigned char *msg32) { +int cc_secp256k1VerifyTreeMsg32(const CC *cond, const unsigned char *msg32) { int subtypes = cc_typeMask(cond); if (subtypes & (1 << CC_PrefixType.typeId) && subtypes & (1 << CC_Secp256k1Type.typeId)) { @@ -209,7 +209,7 @@ static CC *cc_secp256k1Condition(const unsigned char *publicKey, const unsigned } -static CC *secp256k1FromJSON(const cJSON *params, unsigned char *err) { +static CC *secp256k1FromJSON(const cJSON *params, char *err) { CC *cond = 0; unsigned char *pk = 0, *sig = 0; size_t pkSize, sigSize; diff --git a/src/cryptoconditions/src/threshold.c b/src/cryptoconditions/src/threshold.c index f4684cd7b..9c1800302 100644 --- a/src/cryptoconditions/src/threshold.c +++ b/src/cryptoconditions/src/threshold.c @@ -165,7 +165,7 @@ static Fulfillment_t *thresholdToFulfillment(const CC *cond) { } -static CC *thresholdFromJSON(const cJSON *params, unsigned char *err) { +static CC *thresholdFromJSON(const cJSON *params, char *err) { cJSON *threshold_item = cJSON_GetObjectItem(params, "threshold"); if (!cJSON_IsNumber(threshold_item)) { strcpy(err, "threshold must be a number"); diff --git a/src/cryptoconditions/tests/custom-vectors/1000_test-minimal-eval.json b/src/cryptoconditions/tests/custom-vectors/1000_test-minimal-eval.json index 14ab8ca49..2b91d0b36 100644 --- a/src/cryptoconditions/tests/custom-vectors/1000_test-minimal-eval.json +++ b/src/cryptoconditions/tests/custom-vectors/1000_test-minimal-eval.json @@ -1,7 +1,6 @@ { "json": { "type": "eval-sha-256", - "method": "testEval", "params": "dGVzdEV2YWw" }, "cost": 131072, diff --git a/src/komodo_cc.cpp b/src/komodo_cc.cpp index 1ebcd7e89..cf18323cf 100644 --- a/src/komodo_cc.cpp +++ b/src/komodo_cc.cpp @@ -59,13 +59,12 @@ CC* CCNewSecp256k1(CPubKey k) } -CC* CCNewEval(std::string method, std::vector paramsBin) +CC* CCNewEval(std::vector code) { CC *cond = cc_new(CC_Eval); - strcpy(cond->method, method.data()); - cond->paramsBin = (unsigned char*) malloc(paramsBin.size()); - memcpy(cond->paramsBin, paramsBin.data(), paramsBin.size()); - cond->paramsBinLength = paramsBin.size(); + cond->code = (unsigned char*) malloc(code.size()); + memcpy(cond->code, code.data(), code.size()); + cond->codeLength = code.size(); return cond; } diff --git a/src/komodo_cc.h b/src/komodo_cc.h index af9efef1c..b85ddfc5e 100644 --- a/src/komodo_cc.h +++ b/src/komodo_cc.h @@ -37,7 +37,7 @@ bool IsSignedCryptoCondition(const CC *cond); * Construct crypto conditions */ CC* CCNewPreimage(std::vector preimage); -CC* CCNewEval(std::string method, std::vector paramsBin); +CC* CCNewEval(std::vector code); CC* CCNewSecp256k1(CPubKey k); CC* CCNewThreshold(int t, std::vector v); diff --git a/src/test-komodo/test_cryptoconditions.cpp b/src/test-komodo/test_cryptoconditions.cpp index 6f31914df..c9ffde955 100644 --- a/src/test-komodo/test_cryptoconditions.cpp +++ b/src/test-komodo/test_cryptoconditions.cpp @@ -4,6 +4,7 @@ #include "base58.h" #include "key.h" #include "komodo_cc.h" +#include "cc/eval.h" #include "primitives/transaction.h" #include "script/interpreter.h" #include "script/serverchecker.h" @@ -84,8 +85,8 @@ TEST_F(CCTest, testMayAcceptCryptoCondition) { "type": "threshold-sha-256", "threshold": 1, "subfulfillments": [ - { "type": "eval-sha-256", "method": "test", "params": "" }, - { "type": "eval-sha-256", "method": "test", "params": "" } + { "type": "eval-sha-256", "code": "" }, + { "type": "eval-sha-256", "code": "" } ] })!!"); ASSERT_FALSE(CCPubKey(cond).MayAcceptCryptoCondition()); @@ -140,9 +141,22 @@ TEST_F(CCTest, testVerifyCryptoCondition) ASSERT_FALSE(Verify(cond)); } +extern Eval* EVAL_TEST; TEST_F(CCTest, testVerifyEvalCondition) { + + class EvalMock : public Eval + { + public: + bool Dispatch(const CC *cond, const CTransaction &txTo, unsigned int nIn) + { return cond->code[0] ? Valid() : Invalid(""); } + }; + + EvalMock eval; + EVAL_TEST = &eval; + + CC *cond; ScriptError error; CMutableTransaction mtxTo; @@ -156,20 +170,11 @@ TEST_F(CCTest, testVerifyEvalCondition) }; // ok - CCFromJson(cond, R"!!({ - "type": "threshold-sha-256", - "threshold": 2, - "subfulfillments": [ - { "type": "secp256k1-sha-256", "publicKey": "AgWorQwdvFFfFJrzd5gaq1i4Nq8AjU16shvXb6+AVQtH" }, - { "type": "eval-sha-256", "method": "TestEval", "params": "" } - ]})!!"); - CC *ecCond = cond->subconditions[1]; - ecCond->paramsBin = (unsigned char*) "TestEval"; - ecCond->paramsBinLength = 8; - CCSign(mtxTo, cond); // will reorder subconditions + cond = CCNewThreshold(2, { CCNewSecp256k1(notaryKey.GetPubKey()), CCNewEval({1}) }); + CCSign(mtxTo, cond); ASSERT_TRUE(Verify(cond)); - ecCond->paramsBin = (unsigned char*) "FailEval"; + cond->subconditions[1]->code[0] = 0; ASSERT_FALSE(Verify(cond)); } diff --git a/src/test-komodo/test_eval_bet.cpp b/src/test-komodo/test_eval_bet.cpp index cff8a972c..2529b4e46 100644 --- a/src/test-komodo/test_eval_bet.cpp +++ b/src/test-komodo/test_eval_bet.cpp @@ -67,6 +67,7 @@ public: } }; +const EvalCode EVAL_DISPUTEBET = 0xf2; class EvalMock : public Eval { @@ -79,14 +80,17 @@ public: bool Dispatch(const CC *cond, const CTransaction &txTo, unsigned int nIn) { - if (strcmp(cond->method, "DisputeBet") == 0) { + EvalCode ecode = cond->code[0]; + std::vector vparams(cond->code+1, cond->code+cond->codeLength); + + if (ecode == EVAL_DISPUTEBET) { MockVM vm; - return DisputePayout(vm, cond, txTo, nIn); + return DisputePayout(vm, vparams, txTo, nIn); } - if (strcmp(cond->method, "ImportPayout") == 0) { - return ImportPayout(cond, txTo, nIn); + if (ecode == EVAL_IMPORTPAYOUT) { + return ImportPayout(vparams, txTo, nIn); } - return Invalid("invalid-method"); + return Invalid("invalid-code"); } bool GetSpendsConfirmed(uint256 hash, std::vector &spendsOut) const @@ -148,7 +152,7 @@ public: BetProtocol bet; CAmount totalPayout; - ExampleBet() : bet(BetProtocol(players, DisputeHeader(2, VCH("BetHeader", 9)))), totalPayout(100) {} + ExampleBet() : bet(BetProtocol(EVAL_DISPUTEBET, players, 2, VCH("BetHeader", 9))), totalPayout(100) {} ~ExampleBet() {}; CTransaction SessionTx() @@ -180,7 +184,7 @@ public: std::vector Payouts(int playerIdx) { - return MockVM().evaluate(bet.disputeHeader.vmParams, PlayerState(playerIdx)).second; + return MockVM().evaluate(bet.vmParams, PlayerState(playerIdx)).second; } CMutableTransaction DisputeTx(int playerIdx) @@ -280,7 +284,12 @@ TEST_F(TestBet, testMakeDisputeCond) { CC *disputeCond = ebet.DisputeCond(); EXPECT_EQ("(2 of 15,(1 of 5,5,5))", CCShowStructure(disputeCond)); - EXPECT_EQ(0, memcmp("\x2\tBetHeader", (char*) disputeCond->subconditions[0]->paramsBin, 11)); + + CC *evalCond = disputeCond->subconditions[0]; + uint8_t target[100]; + sprintf((char*)target, "%c\x02\tBetHeader", EVAL_DISPUTEBET); + EXPECT_EQ(0, memcmp(target, evalCond->code, 12)); + for (int i=0; isubconditions[1]->subconditions[i])); @@ -315,10 +324,9 @@ TEST_F(TestBet, testDispute) // Success EXPECT_TRUE(TestCC(disputeTx, 0, disputeCond)); - // Set result hash to some rubbish and check false - uint256 rubbishHash; - std::vector rubbish(rubbishHash.begin(), rubbishHash.end()); - disputeTx.vout[0].scriptPubKey = CScript() << OP_RETURN << rubbish; + // Set result hash to 0 and check false + uint256 nonsense; + disputeTx.vout[0].scriptPubKey = CScript() << OP_RETURN << E_MARSHAL(ss << nonsense); EXPECT_EQ(1, CCSign(disputeTx, 0, disputeCond, {Player2})); EXPECT_FALSE(TestCC(disputeTx, 0, disputeCond)); EXPECT_EQ("wrong-payout", eval.state.GetRejectReason()); @@ -371,21 +379,21 @@ TEST_F(TestBet, testDisputeInvalidParams) CC *evalCond = disputeCond->subconditions[0]; // too long - evalCond->paramsBin = (unsigned char*) realloc(evalCond->paramsBin, ++evalCond->paramsBinLength); + evalCond->code = (unsigned char*) realloc(evalCond->code, ++evalCond->codeLength); ASSERT_EQ(1, CCSign(disputeTx, 0, disputeCond, {Player2})); EXPECT_FALSE(TestCC(disputeTx, 0, disputeCond)); - EXPECT_EQ("invalid-dispute-header", eval.state.GetRejectReason()); + EXPECT_EQ("malformed-params", eval.state.GetRejectReason()); // too short eval.state = CValidationState(); - evalCond->paramsBinLength = 1; + evalCond->codeLength = 1; ASSERT_EQ(1, CCSign(disputeTx, 0, disputeCond, {Player2})); EXPECT_FALSE(TestCC(disputeTx, 0, disputeCond)); - EXPECT_EQ("invalid-dispute-header", eval.state.GetRejectReason()); + EXPECT_EQ("malformed-params", eval.state.GetRejectReason()); // is fine eval.state = CValidationState(); - evalCond->paramsBinLength = 11; + evalCond->codeLength = 12; ASSERT_EQ(1, CCSign(disputeTx, 0, disputeCond, {Player2})); EXPECT_TRUE(TestCC(disputeTx, 0, disputeCond)); } @@ -435,7 +443,7 @@ TEST_F(TestBet, testMakePayoutCond) { CC *payoutCond = ebet.PayoutCond(); EXPECT_EQ("(1 of (3 of 5,5,5),(2 of (1 of 5,5,5),15))", CCShowStructure(payoutCond)); - EXPECT_EQ(0, memcmp(payoutCond->subconditions[1]->subconditions[1]->paramsBin, + EXPECT_EQ(0, memcmp(payoutCond->subconditions[1]->subconditions[1]->code+1, ebet.SessionTx().GetHash().begin(), 32)); } @@ -543,13 +551,13 @@ TEST_F(TestBet, testImportPayoutMangleSessionId) CMutableTransaction importTx = ebet.ImportPayoutTx(); CC *payoutCond = ebet.PayoutCond(); - payoutCond->subconditions[1]->subconditions[1]->paramsBinLength = 31; + payoutCond->subconditions[1]->subconditions[1]->codeLength = 31; EXPECT_EQ(2, CCSign(importTx, 0, payoutCond, {Player2})); ASSERT_FALSE(TestCC(importTx, 0, payoutCond)); EXPECT_EQ("malformed-params", eval.state.GetRejectReason()); payoutCond = ebet.PayoutCond(); - memset(payoutCond->subconditions[1]->subconditions[1]->paramsBin, 1, 32); + memset(payoutCond->subconditions[1]->subconditions[1]->code+1, 1, 32); EXPECT_EQ(2, CCSign(importTx, 0, payoutCond, {Player2})); ASSERT_FALSE(TestCC(importTx, 0, payoutCond)); EXPECT_EQ("wrong-session", eval.state.GetRejectReason()); diff --git a/src/test-komodo/test_eval_notarisation.cpp b/src/test-komodo/test_eval_notarisation.cpp index 7fc2f1b4d..e9cd7bea5 100644 --- a/src/test-komodo/test_eval_notarisation.cpp +++ b/src/test-komodo/test_eval_notarisation.cpp @@ -110,7 +110,7 @@ TEST(TestEvalNotarisation, testGetNotarisation) EXPECT_EQ(data.MoM.GetHex(), "88289b6566a48567f65c8e60ca65b7f3877bbdb97cfc3958da31bcf073a70b05"); MoMProof proof; - CheckDeserialize(vMomProof, proof); + E_UNMARSHAL(vMomProof, ss >> proof); EXPECT_EQ(data.MoM, proof.Exec(proofTxHash)); } From e36af93babe8fcaed62c6601fd1a74580ebe62d5 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Sat, 7 Apr 2018 21:46:29 -0300 Subject: [PATCH 0853/1062] update cryptoconditions --- src/cryptoconditions/.gitmodules | 3 - src/cryptoconditions/src/anon.c | 2 +- src/cryptoconditions/src/eval.c | 5 +- src/cryptoconditions/src/internal.h | 8 ++ src/cryptoconditions/src/json_rpc.c | 37 ++++---- src/cryptoconditions/src/preimage.c | 14 +-- src/cryptoconditions/src/secp256k1.c | 8 +- src/cryptoconditions/src/utils.c | 88 ++++++++++++++++++- .../1000_test-minimal-eval.json | 13 --- src/cryptoconditions/tests/test_ed25519.py | 6 +- .../tests/test_failure_modes.py | 4 +- src/cryptoconditions/tests/test_secp256k1.py | 16 ++-- src/cryptoconditions/tests/test_vectors.py | 23 +++-- .../vectors/0000_test-minimal-preimage.json | 13 +++ .../vectors/0001_test-minimal-prefix.json | 20 +++++ .../vectors/0002_test-minimal-threshold.json | 21 +++++ .../tests/vectors/0003_test-minimal-rsa.json | 14 +++ .../vectors/0004_test-minimal-ed25519.json | 14 +++ .../vectors/0005_test-basic-preimage.json | 13 +++ .../tests/vectors/0006_test-basic-prefix.json | 21 +++++ ...007_test-basic-prefix-two-levels-deep.json | 26 ++++++ .../vectors/0008_test-basic-threshold.json | 39 ++++++++ ...-basic-threshold-same-condition-twice.json | 54 ++++++++++++ ...asic-threshold-same-fulfillment-twice.json | 48 ++++++++++ ..._test-basic-threshold-two-levels-deep.json | 50 +++++++++++ ...012_test-basic-threshold-schroedinger.json | 25 ++++++ .../tests/vectors/0013_test-basic-rsa.json | 14 +++ .../vectors/0014_test-basic-rsa4096.json | 14 +++ .../vectors/0015_test-basic-ed25519.json | 14 +++ .../0016_test-advanced-notarized-receipt.json | 33 +++++++ ...d-notarized-receipt-multiple-notaries.json | 74 ++++++++++++++++ .../tests/vectors/1000_test-minimal-eval.json | 13 +++ .../1001_test-minimal-secp256k1.json | 4 +- src/test-komodo/test_cryptoconditions.cpp | 11 +-- 34 files changed, 674 insertions(+), 88 deletions(-) delete mode 100644 src/cryptoconditions/.gitmodules delete mode 100644 src/cryptoconditions/tests/custom-vectors/1000_test-minimal-eval.json create mode 100644 src/cryptoconditions/tests/vectors/0000_test-minimal-preimage.json create mode 100644 src/cryptoconditions/tests/vectors/0001_test-minimal-prefix.json create mode 100644 src/cryptoconditions/tests/vectors/0002_test-minimal-threshold.json create mode 100644 src/cryptoconditions/tests/vectors/0003_test-minimal-rsa.json create mode 100644 src/cryptoconditions/tests/vectors/0004_test-minimal-ed25519.json create mode 100644 src/cryptoconditions/tests/vectors/0005_test-basic-preimage.json create mode 100644 src/cryptoconditions/tests/vectors/0006_test-basic-prefix.json create mode 100644 src/cryptoconditions/tests/vectors/0007_test-basic-prefix-two-levels-deep.json create mode 100644 src/cryptoconditions/tests/vectors/0008_test-basic-threshold.json create mode 100644 src/cryptoconditions/tests/vectors/0009_test-basic-threshold-same-condition-twice.json create mode 100644 src/cryptoconditions/tests/vectors/0010_test-basic-threshold-same-fulfillment-twice.json create mode 100644 src/cryptoconditions/tests/vectors/0011_test-basic-threshold-two-levels-deep.json create mode 100644 src/cryptoconditions/tests/vectors/0012_test-basic-threshold-schroedinger.json create mode 100644 src/cryptoconditions/tests/vectors/0013_test-basic-rsa.json create mode 100644 src/cryptoconditions/tests/vectors/0014_test-basic-rsa4096.json create mode 100644 src/cryptoconditions/tests/vectors/0015_test-basic-ed25519.json create mode 100644 src/cryptoconditions/tests/vectors/0016_test-advanced-notarized-receipt.json create mode 100644 src/cryptoconditions/tests/vectors/0017_test-advanced-notarized-receipt-multiple-notaries.json create mode 100644 src/cryptoconditions/tests/vectors/1000_test-minimal-eval.json rename src/cryptoconditions/tests/{custom-vectors => vectors}/1001_test-minimal-secp256k1.json (71%) diff --git a/src/cryptoconditions/.gitmodules b/src/cryptoconditions/.gitmodules deleted file mode 100644 index 635f6c43d..000000000 --- a/src/cryptoconditions/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "ext/crypto-conditions"] - path = ext/crypto-conditions - url = http://github.com/libscott/crypto-conditions.git diff --git a/src/cryptoconditions/src/anon.c b/src/cryptoconditions/src/anon.c index 80161a36a..114517074 100644 --- a/src/cryptoconditions/src/anon.c +++ b/src/cryptoconditions/src/anon.c @@ -14,7 +14,7 @@ CC *mkAnon(const Condition_t *asnCond) { CCType *realType = getTypeByAsnEnum(asnCond->present); if (!realType) { - printf("Unknown ASN type: %i", asnCond->present); + fprintf(stderr, "Unknown ASN type: %i", asnCond->present); return 0; } CC *cond = cc_new(CC_Anon); diff --git a/src/cryptoconditions/src/eval.c b/src/cryptoconditions/src/eval.c index 2c15b7c0e..4a7d13276 100644 --- a/src/cryptoconditions/src/eval.c +++ b/src/cryptoconditions/src/eval.c @@ -88,8 +88,9 @@ static uint32_t evalSubtypes(const CC *cond) { * The JSON api doesn't contain custom verifiers, so a stub method is provided suitable for testing */ int jsonVerifyEval(CC *cond, void *context) { - if (cond->codeLength == 9 && memcmp(cond->code, "TestEval", 8)) - return cond->code[8]; + if (cond->codeLength == 5 && 0 == memcmp(cond->code, "TEST", 4)) { + return cond->code[5]; + } fprintf(stderr, "Cannot verify eval; user function unknown\n"); return 0; } diff --git a/src/cryptoconditions/src/internal.h b/src/cryptoconditions/src/internal.h index 90c997dfe..76955f406 100644 --- a/src/cryptoconditions/src/internal.h +++ b/src/cryptoconditions/src/internal.h @@ -15,6 +15,8 @@ extern "C" { #define BUF_SIZE 1024 * 1024 +typedef char bool; + /* * Condition Type @@ -67,6 +69,12 @@ int checkDecodeBase64(const cJSON *value, char *key, char *err, unsigned char ** int jsonGetBase64(const cJSON *params, char *key, char *err, unsigned char **data, size_t *size); int jsonGetBase64Optional(const cJSON *params, char *key, char *err, unsigned char **data, size_t *size); void jsonAddBase64(cJSON *params, char *key, unsigned char *bin, size_t size); +char* cc_hex_encode(const uint8_t *bin, size_t len); +uint8_t* cc_hex_decode(const char* hex); +bool checkDecodeHex(const cJSON *params, char *key, char *err, uint8_t **data, size_t *size); +bool jsonGetHex(const cJSON *params, char *key, char *err, unsigned char **data, size_t *size); +void jsonAddHex(cJSON *params, char *key, uint8_t *bin, size_t size); +int jsonGetHexOptional(const cJSON *params, char *key, char *err, unsigned char **data, size_t *size); #ifdef __cplusplus diff --git a/src/cryptoconditions/src/json_rpc.c b/src/cryptoconditions/src/json_rpc.c index 13972ca35..42c13612c 100644 --- a/src/cryptoconditions/src/json_rpc.c +++ b/src/cryptoconditions/src/json_rpc.c @@ -5,31 +5,26 @@ static cJSON *jsonCondition(CC *cond) { - unsigned char buf[1000]; - size_t conditionBinLength = cc_conditionBinary(cond, buf); - cJSON *root = cJSON_CreateObject(); - unsigned char *uri = cc_conditionUri(cond); + + char *uri = cc_conditionUri(cond); cJSON_AddItemToObject(root, "uri", cJSON_CreateString(uri)); free(uri); - unsigned char *b64 = base64_encode(buf, conditionBinLength); - cJSON_AddItemToObject(root, "bin", cJSON_CreateString(b64)); - free(b64); + unsigned char buf[1000]; + size_t conditionBinLength = cc_conditionBinary(cond, buf); + jsonAddHex(root, "bin", buf, conditionBinLength); return root; } static cJSON *jsonFulfillment(CC *cond) { - unsigned char buf[1000000]; + uint8_t buf[1000000]; size_t fulfillmentBinLength = cc_fulfillmentBinary(cond, buf, 1000000); cJSON *root = cJSON_CreateObject(); - unsigned char *b64 = base64_encode(buf, fulfillmentBinLength); - cJSON_AddItemToObject(root, "fulfillment", cJSON_CreateString(b64)); - free(b64); - + jsonAddHex(root, "fulfillment", buf, fulfillmentBinLength); return root; } @@ -98,9 +93,9 @@ static cJSON *jsonVerifyFulfillment(cJSON *params, char *err) { size_t ffill_bin_len, msg_len, cond_bin_len; cJSON *out = 0; - if (!(jsonGetBase64(params, "fulfillment", err, &ffill_bin, &ffill_bin_len) && - jsonGetBase64(params, "message", err, &msg, &msg_len) && - jsonGetBase64(params, "condition", err, &cond_bin, &cond_bin_len))) + if (!(jsonGetHex(params, "fulfillment", err, &ffill_bin, &ffill_bin_len) && + jsonGetHex(params, "message", err, &msg, &msg_len) && + jsonGetHex(params, "condition", err, &cond_bin, &cond_bin_len))) goto END; CC *cond = cc_readFulfillmentBinary(ffill_bin, ffill_bin_len); @@ -124,7 +119,7 @@ END: static cJSON *jsonDecodeFulfillment(cJSON *params, char *err) { size_t ffill_bin_len; unsigned char *ffill_bin; - if (!jsonGetBase64(params, "fulfillment", err, &ffill_bin, &ffill_bin_len)) + if (!jsonGetHex(params, "fulfillment", err, &ffill_bin, &ffill_bin_len)) return NULL; CC *cond = cc_readFulfillmentBinary(ffill_bin, ffill_bin_len); @@ -142,7 +137,7 @@ static cJSON *jsonDecodeFulfillment(cJSON *params, char *err) { static cJSON *jsonDecodeCondition(cJSON *params, char *err) { size_t cond_bin_len; unsigned char *cond_bin; - if (!jsonGetBase64(params, "bin", err, &cond_bin, &cond_bin_len)) + if (!jsonGetHex(params, "bin", err, &cond_bin, &cond_bin_len)) return NULL; CC *cond = cc_readConditionBinary(cond_bin, cond_bin_len); @@ -171,7 +166,7 @@ static cJSON *jsonSignTreeEd25519(cJSON *params, char *err) { } size_t skLength; - if (!jsonGetBase64(params, "privateKey", err, &sk, &skLength)) { + if (!jsonGetHex(params, "privateKey", err, &sk, &skLength)) { goto END; } @@ -180,7 +175,7 @@ static cJSON *jsonSignTreeEd25519(cJSON *params, char *err) { } size_t msgLength; - if (!jsonGetBase64(params, "message", err, &msg, &msgLength)) { + if (!jsonGetHex(params, "message", err, &msg, &msgLength)) { goto END; } @@ -208,7 +203,7 @@ static cJSON *jsonSignTreeSecp256k1(cJSON *params, char *err) { } size_t skLength; - if (!jsonGetBase64(params, "privateKey", err, &sk, &skLength)) { + if (!jsonGetHex(params, "privateKey", err, &sk, &skLength)) { goto END; } @@ -217,7 +212,7 @@ static cJSON *jsonSignTreeSecp256k1(cJSON *params, char *err) { } size_t msgLength; - if (!jsonGetBase64(params, "message", err, &msg, &msgLength)) { + if (!jsonGetHex(params, "message", err, &msg, &msgLength)) { goto END; } diff --git a/src/cryptoconditions/src/preimage.c b/src/cryptoconditions/src/preimage.c index 049e0eecc..2e3ec7c77 100644 --- a/src/cryptoconditions/src/preimage.c +++ b/src/cryptoconditions/src/preimage.c @@ -11,23 +11,17 @@ struct CCType CC_PreimageType; static CC *preimageFromJSON(const cJSON *params, char *err) { - cJSON *preimage_item = cJSON_GetObjectItem(params, "preimage"); - if (!cJSON_IsString(preimage_item)) { - strcpy(err, "preimage must be a string"); + CC *cond = cc_new(CC_Preimage); + if (!jsonGetBase64(params, "preimage", err, &cond->preimage, &cond->preimageLength)) { + free(cond); return NULL; } - char *preimage_b64 = preimage_item->valuestring; - - CC *cond = cc_new(CC_Preimage); - cond->preimage = base64_decode(preimage_b64, &cond->preimageLength); return cond; } static void preimageToJSON(const CC *cond, cJSON *params) { - unsigned char *encoded = base64_encode(cond->preimage, cond->preimageLength); - cJSON_AddStringToObject(params, "preimage", encoded); - free(encoded); + jsonAddBase64(params, "preimage", cond->preimage, cond->preimageLength); } diff --git a/src/cryptoconditions/src/secp256k1.c b/src/cryptoconditions/src/secp256k1.c index b62b2c178..73f7a9164 100644 --- a/src/cryptoconditions/src/secp256k1.c +++ b/src/cryptoconditions/src/secp256k1.c @@ -214,9 +214,9 @@ static CC *secp256k1FromJSON(const cJSON *params, char *err) { unsigned char *pk = 0, *sig = 0; size_t pkSize, sigSize; - if (!jsonGetBase64(params, "publicKey", err, &pk, &pkSize)) goto END; + if (!jsonGetHex(params, "publicKey", err, &pk, &pkSize)) goto END; - if (!jsonGetBase64Optional(params, "signature", err, &sig, &sigSize)) goto END; + if (!jsonGetHexOptional(params, "signature", err, &sig, &sigSize)) goto END; if (sig && SECP256K1_SIG_SIZE != sigSize) { strcpy(err, "signature has incorrect length"); goto END; @@ -234,9 +234,9 @@ END: static void secp256k1ToJSON(const CC *cond, cJSON *params) { - jsonAddBase64(params, "publicKey", cond->publicKey, SECP256K1_PK_SIZE); + jsonAddHex(params, "publicKey", cond->publicKey, SECP256K1_PK_SIZE); if (cond->signature) { - jsonAddBase64(params, "signature", cond->signature, SECP256K1_SIG_SIZE); + jsonAddHex(params, "signature", cond->signature, SECP256K1_SIG_SIZE); } } diff --git a/src/cryptoconditions/src/utils.c b/src/cryptoconditions/src/utils.c index c87e8ddda..b795932b3 100644 --- a/src/cryptoconditions/src/utils.c +++ b/src/cryptoconditions/src/utils.c @@ -154,10 +154,9 @@ int checkString(const cJSON *value, char *key, char *err) { } int checkDecodeBase64(const cJSON *value, char *key, char *err, unsigned char **data, size_t *size) { - if (!checkString(value, key, err)) { - sprintf(err, "%s must be valid base64 string", key); + if (!checkString(value, key, err)) return 0; - } + *data = base64_decode(value->valuestring, size); if (!*data) { @@ -200,10 +199,91 @@ unsigned char *hashFingerprintContents(asn_TYPE_descriptor_t *asnType, void *fp) asn_enc_rval_t rc = der_encode_to_buffer(asnType, fp, buf, BUF_SIZE); ASN_STRUCT_FREE(*asnType, fp); if (rc.encoded < 1) { - printf("Encoding fingerprint failed\n"); + fprintf(stderr, "Encoding fingerprint failed\n"); return 0; } unsigned char *hash = malloc(32); sha256(buf, rc.encoded, hash); return hash; } + + +char* cc_hex_encode(const uint8_t *bin, size_t len) +{ + char* hex = malloc(len*2+1); + if (bin == NULL) return hex; + char map[16] = "0123456789ABCDEF"; + for (int i=0; i> 4]; + hex[i*2+1] = map[bin[i] & 0x0F]; + } + hex[len*2] = '\0'; + return hex; +} + + +uint8_t* cc_hex_decode(const char* hex) +{ + size_t len = strlen(hex); + + if (len % 2 == 1) return NULL; + + uint8_t* bin = calloc(1, len/2); + + for (int i=0; i 15) goto ERR; + + bin[i/2] += c << (i%2 ? 0 : 4); + } + return bin; +ERR: + free(bin); + return NULL; +} + + +bool checkDecodeHex(const cJSON *value, char *key, char *err, unsigned char **data, size_t *size) { + if (!checkString(value, key, err)) + return 0; + + *data = cc_hex_decode(value->valuestring); + if (!*data) { + sprintf(err, "%s must be valid hex string", key); + return 0; + } + *size = strlen(value->valuestring) / 2; + return 1; +} + + +bool jsonGetHex(const cJSON *params, char *key, char *err, unsigned char **data, size_t *size) +{ + cJSON *item = cJSON_GetObjectItem(params, key); + if (!item) { + sprintf(err, "%s is required", key); + return 0; + } + return checkDecodeHex(item, key, err, data, size); +} + + +void jsonAddHex(cJSON *params, char *key, unsigned char *bin, size_t size) { + unsigned char *hex = cc_hex_encode(bin, size); + cJSON_AddItemToObject(params, key, cJSON_CreateString(hex)); + free(hex); +} + + +int jsonGetHexOptional(const cJSON *params, char *key, char *err, unsigned char **data, size_t *size) { + cJSON *item = cJSON_GetObjectItem(params, key); + if (!item) { + return 1; + } + return checkDecodeHex(item, key, err, data, size); +} + + diff --git a/src/cryptoconditions/tests/custom-vectors/1000_test-minimal-eval.json b/src/cryptoconditions/tests/custom-vectors/1000_test-minimal-eval.json deleted file mode 100644 index 2b91d0b36..000000000 --- a/src/cryptoconditions/tests/custom-vectors/1000_test-minimal-eval.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "json": { - "type": "eval-sha-256", - "params": "dGVzdEV2YWw" - }, - "cost": 131072, - "subtypes": [], - "fingerprintContents": "", - "fulfillment": "AF148008746573744576616C8108746573744576616C", - "conditionBinary": "AF27802062CC11575F91E1611379B5A0B53678805FC03858544FC28E72BB66A14629C08F8103100000", - "conditionUri": "ni:///sha-256;YswRV1-R4WETebWgtTZ4gF_AOFhUT8KOcrtmoUYpwI8?fpt=eval-sha-256&cost=1048576", - "message": "" -} diff --git a/src/cryptoconditions/tests/test_ed25519.py b/src/cryptoconditions/tests/test_ed25519.py index 271b9b023..ba97bdd9d 100644 --- a/src/cryptoconditions/tests/test_ed25519.py +++ b/src/cryptoconditions/tests/test_ed25519.py @@ -9,7 +9,7 @@ def test_sign_ed25519_pass_simple(): 'type': 'ed25519-sha-256', 'publicKey': "E0x0Ws4GhWhO_zBoUyaLbuqCz6hDdq11Ft1Dgbe9y9k", }, - 'privateKey': '11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo', + 'privateKey': 'D75A980182B10AB7D54BFED3C964073A0EE172F3DAA62325AF021A68F707511A', 'message': '', }) @@ -34,7 +34,7 @@ def test_sign_ed25519_pass_prefix(): 'publicKey': "E0x0Ws4GhWhO_zBoUyaLbuqCz6hDdq11Ft1Dgbe9y9k", } }, - 'privateKey': '11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo', + 'privateKey': 'D75A980182B10AB7D54BFED3C964073A0EE172F3DAA62325AF021A68F707511A', 'message': '', }) @@ -60,7 +60,7 @@ def test_sign_ed25519_fail(): 'type': 'ed25519-sha-256', 'publicKey': "E0x0Ws4GhWhO_zBoUyaLbuqCz6hDdq11Ft1Dgbe9y9k", }, - 'privateKey': '22qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo', + 'privateKey': '225A980182B10AB7D54BFED3C964073A0EE172F3DAA62325AF021A68F707511A', 'message': '', }) diff --git a/src/cryptoconditions/tests/test_failure_modes.py b/src/cryptoconditions/tests/test_failure_modes.py index 52ab3bdb9..59b0b3f24 100644 --- a/src/cryptoconditions/tests/test_failure_modes.py +++ b/src/cryptoconditions/tests/test_failure_modes.py @@ -65,9 +65,9 @@ def test_validate_empty_sigs(): def test_non_canonical_secp256k1(): cond = { "type": "secp256k1-sha-256", - "publicKey": "AtXZaTBVNawpp3B5wR1PDdQGYc-W4E6XSl6NfjdO4iWq", + "publicKey": "02D5D969305535AC29A77079C11D4F0DD40661CF96E04E974A5E8D7E374EE225AA", # Signature is correct, but non canonical; validation should fail - "signature": "nC1v8580C7r2XohL3_rnQ2p7dWiDnFuhF_poGCRfudrDITgwKywgjm5CTdnHAnkK4QskG4nI0KBrActwgzSrbg" + "signature": "9C2D6FF39F340BBAF65E884BDFFAE7436A7B7568839C5BA117FA6818245FB9DAC32138302B2C208E6E424DD9C702790AE10B241B89C8D0A06B01CB708334AB6E" } res = jsonRPC('verifyFulfillment', { 'fulfillment': jsonRPC('encodeFulfillment', cond)['fulfillment'], diff --git a/src/cryptoconditions/tests/test_secp256k1.py b/src/cryptoconditions/tests/test_secp256k1.py index bbc9462fa..fe3c72b67 100644 --- a/src/cryptoconditions/tests/test_secp256k1.py +++ b/src/cryptoconditions/tests/test_secp256k1.py @@ -2,25 +2,25 @@ import json import base64 import hashlib import secp256k1 -from .test_vectors import jsonRPC, encode_base64, decode_base64 +from .test_vectors import jsonRPC key = secp256k1.PrivateKey() def test_sign_secp256k1_pass_simple(): - pubkey = encode_base64(key.pubkey.serialize()) + pubkey = encode_b16(key.pubkey.serialize()) msg = '' res = jsonRPC('signTreeSecp256k1', { 'condition': { 'type': 'secp256k1-sha-256', 'publicKey': pubkey, }, - 'privateKey': encode_base64(key.private_key), + 'privateKey': encode_b16(key.private_key), 'message': msg, }) - sig = encode_base64(key.ecdsa_serialize_compact(key.ecdsa_sign(msg.encode()))) + sig = encode_b16(key.ecdsa_serialize_compact(key.ecdsa_sign(msg.encode()))) assert res == { "num_signed": 1, @@ -42,14 +42,14 @@ def test_sign_secp256k1_pass_simple(): def test_sign_secp256k1_fail(): # privateKey doesnt match publicKey - pubkey = encode_base64(key.pubkey.serialize()) + pubkey = encode_b16(key.pubkey.serialize()) msg = '' res = jsonRPC('signTreeSecp256k1', { 'condition': { 'type': 'secp256k1-sha-256', 'publicKey': pubkey, }, - 'privateKey': encode_base64('0' * 32), + 'privateKey': encode_b16(b'0' * 32), 'message': msg, }) @@ -60,3 +60,7 @@ def test_sign_secp256k1_fail(): "publicKey": pubkey, } } + + +def encode_b16(s): + return base64.b16encode(s).decode() diff --git a/src/cryptoconditions/tests/test_vectors.py b/src/cryptoconditions/tests/test_vectors.py index 34ed9a7d3..884d695be 100644 --- a/src/cryptoconditions/tests/test_vectors.py +++ b/src/cryptoconditions/tests/test_vectors.py @@ -125,25 +125,24 @@ def b16_to_b64(b16): return encode_base64(base64.b16decode(b16)) +def b64_to_b16(b64): + #if type(b64) == str: + # b64 = b64.encode() + return base64.b16encode(decode_base64(b64)).decode() + + def _read_vectors(name): - paths = ['ext/crypto-conditions/test-vectors/valid/%s.json', - 'tests/custom-vectors/%s.json'] - for fmt in paths: - path = fmt % name - if os.path.isfile(path): - vectors = json.load(open(path)) - break - else: - raise IOError("Vectors file not found: %s.json" % name) - for key in ['conditionBinary', 'fulfillment', 'message']: - vectors[key] = b16_to_b64(vectors[key]) - return vectors + path = 'tests/vectors/%s.json' % name + if os.path.isfile(path): + return json.load(open(path)) + raise IOError("Vectors file not found: %s.json" % name) so = cdll.LoadLibrary('.libs/libcryptoconditions.so') so.cc_jsonRPC.restype = c_char_p + def jsonRPC(method, params): req = json.dumps({ 'method': method, diff --git a/src/cryptoconditions/tests/vectors/0000_test-minimal-preimage.json b/src/cryptoconditions/tests/vectors/0000_test-minimal-preimage.json new file mode 100644 index 000000000..a0cf7be8f --- /dev/null +++ b/src/cryptoconditions/tests/vectors/0000_test-minimal-preimage.json @@ -0,0 +1,13 @@ +{ + "json": { + "type": "preimage-sha-256", + "preimage": "" + }, + "cost": 0, + "subtypes": [], + "fingerprintContents": "", + "fulfillment": "A0028000", + "conditionBinary": "A0258020E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855810100", + "conditionUri": "ni:///sha-256;47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU?fpt=preimage-sha-256&cost=0", + "message": "" +} \ No newline at end of file diff --git a/src/cryptoconditions/tests/vectors/0001_test-minimal-prefix.json b/src/cryptoconditions/tests/vectors/0001_test-minimal-prefix.json new file mode 100644 index 000000000..e2e942e9f --- /dev/null +++ b/src/cryptoconditions/tests/vectors/0001_test-minimal-prefix.json @@ -0,0 +1,20 @@ +{ + "json": { + "type": "prefix-sha-256", + "maxMessageLength": 0, + "prefix": "", + "subfulfillment": { + "type": "preimage-sha-256", + "preimage": "" + } + }, + "cost": 1024, + "subtypes": [ + "preimage-sha-256" + ], + "fingerprintContents": "302E8000810100A227A0258020E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855810100", + "fulfillment": "A10B8000810100A204A0028000", + "conditionBinary": "A12A8020BB1AC5260C0141B7E54B26EC2330637C5597BF811951AC09E744AD20FF77E2878102040082020780", + "conditionUri": "ni:///sha-256;uxrFJgwBQbflSybsIzBjfFWXv4EZUawJ50StIP934oc?fpt=prefix-sha-256&cost=1024&subtypes=preimage-sha-256", + "message": "" +} \ No newline at end of file diff --git a/src/cryptoconditions/tests/vectors/0002_test-minimal-threshold.json b/src/cryptoconditions/tests/vectors/0002_test-minimal-threshold.json new file mode 100644 index 000000000..67d2d551e --- /dev/null +++ b/src/cryptoconditions/tests/vectors/0002_test-minimal-threshold.json @@ -0,0 +1,21 @@ +{ + "json": { + "type": "threshold-sha-256", + "threshold": 1, + "subfulfillments": [ + { + "type": "preimage-sha-256", + "preimage": "" + } + ] + }, + "cost": 1024, + "subtypes": [ + "preimage-sha-256" + ], + "fingerprintContents": "302C800101A127A0258020E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855810100", + "fulfillment": "A208A004A0028000A100", + "conditionBinary": "A22A8020B4B84136DF48A71D73F4985C04C6767A778ECB65BA7023B4506823BEEE7631B98102040082020780", + "conditionUri": "ni:///sha-256;tLhBNt9Ipx1z9JhcBMZ2eneOy2W6cCO0UGgjvu52Mbk?fpt=threshold-sha-256&cost=1024&subtypes=preimage-sha-256", + "message": "" +} \ No newline at end of file diff --git a/src/cryptoconditions/tests/vectors/0003_test-minimal-rsa.json b/src/cryptoconditions/tests/vectors/0003_test-minimal-rsa.json new file mode 100644 index 000000000..881a8c527 --- /dev/null +++ b/src/cryptoconditions/tests/vectors/0003_test-minimal-rsa.json @@ -0,0 +1,14 @@ +{ + "json": { + "type": "rsa-sha-256", + "modulus": "4e-LJNb3awnIHtd1KqJi8ETwSodNQ4CdMc6mEvmbDJeotDdBU-Pu89ZmFoQ-DkHCkyZLcbYXPbHPDWzVWMWGV3Bvzwl_cExIPlnL_f1bPue8gNdAxeDwR_PoX8DXWBV3am8_I8XcXnlxOaaILjgzakpfs2E3Yg_zZj264yhHKAGGL3Ly-HsgK5yJrdfNWwoHb3xT41A59n7RfsgV5bQwXMYxlwaNXm5Xm6beX04-V99eTgcv8s5MZutFIzlzh1J1ljnwJXv1fb1cRD-1FYzOCj02rce6AfM6C7bbsr-YnWBxEvI0TZk-d-VjwdNh3t9X2pbvLPxoXwArY4JGpbMJuQ", + "signature": "vULWVp9lma7UVflrwO0I7RSAvzbNnhRn-cb3RGHJ46dJM0svZASqX59rr-dsNH0GklCzXRyXDHkwWe5zOoGT8w-nj-x8rkWePd_XYzgF1HaUDQy1PX-zidza6vboz0jEtWNUMOTyvN_lBcLA_Be0DZPH7bfCYev0OJWnBeAkqgVJpmD3CjIVBkdSLb5rY1IEl8_4-NXXR2iifFuG5YC-P83Jbxl2KTy6DVjfxgtRi2MqbcHpUMQ-Ix_ho3mqbdzFLHDt-FHGwBI6lkJhz9s4V81s1a3DfY2izJJO2uHYTPYSRYfydMH6NpfaKQHwJp8DskPAO2FOA4Xhlh-sUAD5uw" + }, + "cost": 65536, + "subtypes": [], + "fingerprintContents": "3082010480820100E1EF8B24D6F76B09C81ED7752AA262F044F04A874D43809D31CEA612F99B0C97A8B4374153E3EEF3D66616843E0E41C293264B71B6173DB1CF0D6CD558C58657706FCF097F704C483E59CBFDFD5B3EE7BC80D740C5E0F047F3E85FC0D75815776A6F3F23C5DC5E797139A6882E38336A4A5FB36137620FF3663DBAE328472801862F72F2F87B202B9C89ADD7CD5B0A076F7C53E35039F67ED17EC815E5B4305CC63197068D5E6E579BA6DE5F4E3E57DF5E4E072FF2CE4C66EB452339738752759639F0257BF57DBD5C443FB5158CCE0A3D36ADC7BA01F33A0BB6DBB2BF989D607112F2344D993E77E563C1D361DEDF57DA96EF2CFC685F002B638246A5B309B9", + "fulfillment": "A382020880820100E1EF8B24D6F76B09C81ED7752AA262F044F04A874D43809D31CEA612F99B0C97A8B4374153E3EEF3D66616843E0E41C293264B71B6173DB1CF0D6CD558C58657706FCF097F704C483E59CBFDFD5B3EE7BC80D740C5E0F047F3E85FC0D75815776A6F3F23C5DC5E797139A6882E38336A4A5FB36137620FF3663DBAE328472801862F72F2F87B202B9C89ADD7CD5B0A076F7C53E35039F67ED17EC815E5B4305CC63197068D5E6E579BA6DE5F4E3E57DF5E4E072FF2CE4C66EB452339738752759639F0257BF57DBD5C443FB5158CCE0A3D36ADC7BA01F33A0BB6DBB2BF989D607112F2344D993E77E563C1D361DEDF57DA96EF2CFC685F002B638246A5B309B981820100BD42D6569F6599AED455F96BC0ED08ED1480BF36CD9E1467F9C6F74461C9E3A749334B2F6404AA5F9F6BAFE76C347D069250B35D1C970C793059EE733A8193F30FA78FEC7CAE459E3DDFD7633805D476940D0CB53D7FB389DCDAEAF6E8CF48C4B5635430E4F2BCDFE505C2C0FC17B40D93C7EDB7C261EBF43895A705E024AA0549A660F70A32150647522DBE6B63520497CFF8F8D5D74768A27C5B86E580BE3FCDC96F1976293CBA0D58DFC60B518B632A6DC1E950C43E231FE1A379AA6DDCC52C70EDF851C6C0123A964261CFDB3857CD6CD5ADC37D8DA2CC924EDAE1D84CF6124587F274C1FA3697DA2901F0269F03B243C03B614E0385E1961FAC5000F9BB", + "conditionBinary": "A3278020B31FA8206E4EA7E515337B3B33082B877651801085ED84FB4DAEB247BF698D7F8103010000", + "conditionUri": "ni:///sha-256;sx-oIG5Op-UVM3s7Mwgrh3ZRgBCF7YT7Ta6yR79pjX8?fpt=rsa-sha-256&cost=65536", + "message": "" +} \ No newline at end of file diff --git a/src/cryptoconditions/tests/vectors/0004_test-minimal-ed25519.json b/src/cryptoconditions/tests/vectors/0004_test-minimal-ed25519.json new file mode 100644 index 000000000..669dc6d98 --- /dev/null +++ b/src/cryptoconditions/tests/vectors/0004_test-minimal-ed25519.json @@ -0,0 +1,14 @@ +{ + "json": { + "type": "ed25519-sha-256", + "publicKey": "11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo", + "signature": "5VZDAMNgrHKQhuLMgG6CioSHfx645dl02HPgZSJJAVVfuIIVkKM7rMYeOXAc-bRr0lv18FlbviRlUUFDjnoQCw" + }, + "cost": 131072, + "subtypes": [], + "fingerprintContents": "30228020D75A980182B10AB7D54BFED3C964073A0EE172F3DAA62325AF021A68F707511A", + "fulfillment": "A4648020D75A980182B10AB7D54BFED3C964073A0EE172F3DAA62325AF021A68F707511A8140E5564300C360AC729086E2CC806E828A84877F1EB8E5D974D873E065224901555FB8821590A33BACC61E39701CF9B46BD25BF5F0595BBE24655141438E7A100B", + "conditionBinary": "A4278020799239ABA8FC4FF7EABFBC4C44E69E8BDFED993324E12ED64792ABE289CF1D5F8103020000", + "conditionUri": "ni:///sha-256;eZI5q6j8T_fqv7xMROaei9_tmTMk4S7WR5Kr4onPHV8?fpt=ed25519-sha-256&cost=131072", + "message": "" +} \ No newline at end of file diff --git a/src/cryptoconditions/tests/vectors/0005_test-basic-preimage.json b/src/cryptoconditions/tests/vectors/0005_test-basic-preimage.json new file mode 100644 index 000000000..585fe2e47 --- /dev/null +++ b/src/cryptoconditions/tests/vectors/0005_test-basic-preimage.json @@ -0,0 +1,13 @@ +{ + "json": { + "type": "preimage-sha-256", + "preimage": "YWFh" + }, + "cost": 3, + "subtypes": [], + "fingerprintContents": "616161", + "fulfillment": "A0058003616161", + "conditionBinary": "A02580209834876DCFB05CB167A5C24953EBA58C4AC89B1ADF57F28F2F9D09AF107EE8F0810103", + "conditionUri": "ni:///sha-256;mDSHbc-wXLFnpcJJU-uljErImxrfV_KPL50JrxB-6PA?fpt=preimage-sha-256&cost=3", + "message": "" +} \ No newline at end of file diff --git a/src/cryptoconditions/tests/vectors/0006_test-basic-prefix.json b/src/cryptoconditions/tests/vectors/0006_test-basic-prefix.json new file mode 100644 index 000000000..59cd7b361 --- /dev/null +++ b/src/cryptoconditions/tests/vectors/0006_test-basic-prefix.json @@ -0,0 +1,21 @@ +{ + "json": { + "type": "prefix-sha-256", + "maxMessageLength": 0, + "prefix": "YWFh", + "subfulfillment": { + "type": "ed25519-sha-256", + "publicKey": "11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo", + "signature": "UGoepoMY5i1AY12tBD4Zh-vCbltcRAb3vfhacziPv-XCRaxJ9HcOvHh3CCcKpqh2n-_okw_Q6h7mSzFAfXaVCQ" + } + }, + "cost": 132099, + "subtypes": [ + "ed25519-sha-256" + ], + "fingerprintContents": "30338003616161810100A229A4278020799239ABA8FC4FF7EABFBC4C44E69E8BDFED993324E12ED64792ABE289CF1D5F8103020000", + "fulfillment": "A1708003616161810100A266A4648020D75A980182B10AB7D54BFED3C964073A0EE172F3DAA62325AF021A68F707511A8140506A1EA68318E62D40635DAD043E1987EBC26E5B5C4406F7BDF85A73388FBFE5C245AC49F4770EBC787708270AA6A8769FEFE8930FD0EA1EE64B31407D769509", + "conditionBinary": "A12B8020451FE15F16299D495993FE692DB989E56A5230A90476F77392A3CD3213C0733F810302040382020308", + "conditionUri": "ni:///sha-256;RR_hXxYpnUlZk_5pLbmJ5WpSMKkEdvdzkqPNMhPAcz8?fpt=prefix-sha-256&cost=132099&subtypes=ed25519-sha-256", + "message": "" +} \ No newline at end of file diff --git a/src/cryptoconditions/tests/vectors/0007_test-basic-prefix-two-levels-deep.json b/src/cryptoconditions/tests/vectors/0007_test-basic-prefix-two-levels-deep.json new file mode 100644 index 000000000..93dfb249e --- /dev/null +++ b/src/cryptoconditions/tests/vectors/0007_test-basic-prefix-two-levels-deep.json @@ -0,0 +1,26 @@ +{ + "json": { + "type": "prefix-sha-256", + "maxMessageLength": 3, + "prefix": "YmJi", + "subfulfillment": { + "type": "prefix-sha-256", + "maxMessageLength": 6, + "prefix": "YWFh", + "subfulfillment": { + "type": "ed25519-sha-256", + "publicKey": "11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo", + "signature": "pCNg9H99uG218DfIECQiNyB9et1uPlMX4hKyB-Jb7SrLSFrQvLtXdVcmDsu71ncY1sq630W61lXRuM6EYJ6XAQ" + } + } + }, + "cost": 133135, + "subtypes": [ + "ed25519-sha-256" + ], + "fingerprintContents": "30378003626262810103A22DA12B80207F19C9BB3BC767DE39657E11D16068F8CAB00E3E3C23916DF967B584A28B26DC810302040982020308", + "fulfillment": "A17C8003626262810103A272A1708003616161810106A266A4648020D75A980182B10AB7D54BFED3C964073A0EE172F3DAA62325AF021A68F707511A8140A42360F47F7DB86DB5F037C810242237207D7ADD6E3E5317E212B207E25BED2ACB485AD0BCBB577557260ECBBBD67718D6CABADF45BAD655D1B8CE84609E9701", + "conditionBinary": "A12B8020177350AD8566C528B92D9B5382DF2C68D9BA9F9FA41D43DBDD8E40B118DD9641810302080F82020308", + "conditionUri": "ni:///sha-256;F3NQrYVmxSi5LZtTgt8saNm6n5-kHUPb3Y5AsRjdlkE?fpt=prefix-sha-256&cost=133135&subtypes=ed25519-sha-256", + "message": "7A7A7A" +} \ No newline at end of file diff --git a/src/cryptoconditions/tests/vectors/0008_test-basic-threshold.json b/src/cryptoconditions/tests/vectors/0008_test-basic-threshold.json new file mode 100644 index 000000000..56b4984d8 --- /dev/null +++ b/src/cryptoconditions/tests/vectors/0008_test-basic-threshold.json @@ -0,0 +1,39 @@ +{ + "json": { + "type": "threshold-sha-256", + "threshold": 2, + "subfulfillments": [ + { + "type": "rsa-sha-256", + "modulus": "u7ChoxT_ai_HmuBvYQ3I1EIckz7QxDVOaurZHvlH6k-PYysuL3i4oHp4wzJIlcfLCRbrM0wQCQ5e254Cle0v8d6v0fSfVEEuQ-3iywbP_DlTAzCaTOPqwjQdmvMYgzfuur09Skr49D4VfW8C-dHySkJ3cEnJMKojP-1cY7B_clzea7JEBPy_wLhyR-rLfbBEeFumbt6OeSESRwFQQB4KhHG9428tXsuWD1cboX2vOB2DeN7CHhAS5LN2yebEa7Z9aO7xK6mhWWf0hti8kbPisG-l_KabdSQmrwKcsUnqWG3thR66Fgh2rNhfBiJx-tc9FfXw8CLiYTCSJr7jVnrQUvl0bKi_rPDU9BcwCFwJegICgwHZKgxUXAOXRywu7lthIiAl1jRw7mgc4yUnR86coj8Z5m8vY4bmrRORHXrazTjOXKj_LC2Zq7D1w7qEdQlhPmYyoSzm73jaTIIOkINAUwA9EZf2pXsBAP7hUshMixszu5ZXGYh4D6-9aXz4NwqZ2o-q91aH2VHMZTPHi44c4uHVzrmhFikgGvQ3R1yUAn-lJhS0MAt33PGArEnKo0AWjzJi_R7osTgCzqNXVLQjuDP6FMXdDEdt3l1ee_c3TWHySMO6uRywVQvRy-9wUH7o2xzzmTB-Io1PRZKmbFhXPP7MY5ZoBvr4gQnMsJkj6ls", + "signature": "QSAOQpYe6kYMgnbyOatmt2-PKGnqzMX56ZRcCrxjsUMGVvPaLSF6QzJ-6M4RJ9FKhddK9BL-k3A0W6a0QAPXca7dK6D8JQYn_fYWMa_WTpvucUsbr7afkBvutvlZsWpUsyippnTIg8r8T8L3sEdtvKqNm_1H9zTjRza_ZulzsxXCq_RyewYso8QCk261CEnhgV3RYEpgTe-maM_oI7AIv4979XzrG0HlGP9TrpEe-YgFcbPRdCNB1g48sr65PrXxePjve6DG8ikLmVXYPWD5Q9ZEVx7I1fBk2V8doedZ1pINhKVMvEl4NkCnsM89Ao5ifsetJakV9tjCSy4JkVKKAsW-8BBsGLPznFmZVut6J7M3MT3Pk-dYZ2BqSsWhq2-btETcHa0fVG-u3mrpNIhASQF2kTcdUe4dZQ785YGzDGhDCH5wFBkPRGAmfYlNUlgU3aNDuaBIncCMajQzR0LOowtJJRLSlXRSF91l7P7LnKGNIS-EpQbXACbtMyiWvSSmMFoMve6d_Yq7hQf4QOuUz6jpKOaRDCdfe2jRH5ZGPBAqWWYTR4aVvHZx-ycwkTnGzS8Vyn4kBS5H9ONO-LhE7DZKhb3JvoQlz_cqd76Y2QFphqZnEJgl8e8Y4IFwqHtDaOfBQsGdrRBgXE80HVIJmHrzGrqOLklj8-B5TdEfC3I" + }, + { + "type": "prefix-sha-256", + "maxMessageLength": 0, + "prefix": "YWFh", + "subfulfillment": { + "type": "ed25519-sha-256", + "publicKey": "11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo", + "signature": "NEydEqAqV7Nf2WYZPO6V1du7xndVP86_QUwY2nUAKd05xuU63Yks7-RCNYMf-OXzaGiO93zPb5l_1BGmp-v5Ag" + } + }, + { + "type": "ed25519-sha-256", + "publicKey": "11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo", + "signature": "UGoepoMY5i1AY12tBD4Zh-vCbltcRAb3vfhacziPv-XCRaxJ9HcOvHh3CCcKpqh2n-_okw_Q6h7mSzFAfXaVCQ" + } + ] + }, + "cost": 397315, + "subtypes": [ + "ed25519-sha-256", + "prefix-sha-256", + "rsa-sha-256" + ], + "fingerprintContents": "308184800102A17FA12B8020451FE15F16299D495993FE692DB989E56A5230A90476F77392A3CD3213C0733F810302040382020308A32780204DD2EA7F85B3EACB8F19058E8360955C32E74C124392A1F44660739709C539C38103040000A4278020799239ABA8FC4FF7EABFBC4C44E69E8BDFED993324E12ED64792ABE289CF1D5F8103020000", + "fulfillment": "A2820106A081D8A1708003616161810100A266A4648020D75A980182B10AB7D54BFED3C964073A0EE172F3DAA62325AF021A68F707511A8140344C9D12A02A57B35FD966193CEE95D5DBBBC677553FCEBF414C18DA750029DD39C6E53ADD892CEFE44235831FF8E5F368688EF77CCF6F997FD411A6A7EBF902A4648020D75A980182B10AB7D54BFED3C964073A0EE172F3DAA62325AF021A68F707511A8140506A1EA68318E62D40635DAD043E1987EBC26E5B5C4406F7BDF85A73388FBFE5C245AC49F4770EBC787708270AA6A8769FEFE8930FD0EA1EE64B31407D769509A129A32780204DD2EA7F85B3EACB8F19058E8360955C32E74C124392A1F44660739709C539C38103040000", + "conditionBinary": "A22B8020B6ACF4083E438BE4356F25FF92C295E9C8E1BAB141B4607BA48511EBA35AEFCC810306100382020358", + "conditionUri": "ni:///sha-256;tqz0CD5Di-Q1byX_ksKV6cjhurFBtGB7pIUR66Na78w?fpt=threshold-sha-256&cost=397315&subtypes=prefix-sha-256,rsa-sha-256,ed25519-sha-256", + "message": "616161" +} diff --git a/src/cryptoconditions/tests/vectors/0009_test-basic-threshold-same-condition-twice.json b/src/cryptoconditions/tests/vectors/0009_test-basic-threshold-same-condition-twice.json new file mode 100644 index 000000000..a669b8d5f --- /dev/null +++ b/src/cryptoconditions/tests/vectors/0009_test-basic-threshold-same-condition-twice.json @@ -0,0 +1,54 @@ +{ + "json": { + "type": "threshold-sha-256", + "threshold": 1, + "subfulfillments": [ + { + "type": "prefix-sha-256", + "maxMessageLength": 0, + "prefix": "YWFh", + "subfulfillment": { + "type": "ed25519-sha-256", + "publicKey": "11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo", + "signature": "UGoepoMY5i1AY12tBD4Zh-vCbltcRAb3vfhacziPv-XCRaxJ9HcOvHh3CCcKpqh2n-_okw_Q6h7mSzFAfXaVCQ" + } + }, + { + "type": "rsa-sha-256", + "modulus": "u7ChoxT_ai_HmuBvYQ3I1EIckz7QxDVOaurZHvlH6k-PYysuL3i4oHp4wzJIlcfLCRbrM0wQCQ5e254Cle0v8d6v0fSfVEEuQ-3iywbP_DlTAzCaTOPqwjQdmvMYgzfuur09Skr49D4VfW8C-dHySkJ3cEnJMKojP-1cY7B_clzea7JEBPy_wLhyR-rLfbBEeFumbt6OeSESRwFQQB4KhHG9428tXsuWD1cboX2vOB2DeN7CHhAS5LN2yebEa7Z9aO7xK6mhWWf0hti8kbPisG-l_KabdSQmrwKcsUnqWG3thR66Fgh2rNhfBiJx-tc9FfXw8CLiYTCSJr7jVnrQUvl0bKi_rPDU9BcwCFwJegICgwHZKgxUXAOXRywu7lthIiAl1jRw7mgc4yUnR86coj8Z5m8vY4bmrRORHXrazTjOXKj_LC2Zq7D1w7qEdQlhPmYyoSzm73jaTIIOkINAUwA9EZf2pXsBAP7hUshMixszu5ZXGYh4D6-9aXz4NwqZ2o-q91aH2VHMZTPHi44c4uHVzrmhFikgGvQ3R1yUAn-lJhS0MAt33PGArEnKo0AWjzJi_R7osTgCzqNXVLQjuDP6FMXdDEdt3l1ee_c3TWHySMO6uRywVQvRy-9wUH7o2xzzmTB-Io1PRZKmbFhXPP7MY5ZoBvr4gQnMsJkj6ls", + "signature": "fss4we3Ml_SM2IUwwkbFSRKGf1EbxN3QjFc8ogg6yf2qNFwXdo2t6YNCSBjbUqNy4oD7pWgvZSFalz-3KGdJO2T4-zQVM5felzo2xzxSuR4DQBtvpWP3d4T6r4ggQFvukx6jX3qNlCUUrlhsH8yo7e-biQTRuOEcnNjdu38VG3cX4STnLVejyjP0TkrXvDvYf9wge6rqrbax8XVPx48bQmbd84bl1STBo4cGUjqoIPEYsFN3Law-SoZ700WkvDWSCe9sHIPPVDKcJUjRrwUd_tr1PoBA9_OwYThrJ7UMj98w-k_X1fPfTbB0RMW4Z9V_P9L5r0AXRyHlYEJILwy4oEx4b74N47mHskntvTC32yuSic9E0OfLLmvewIpukErdNo5AwKf5LoSGWAaLDdbF7989xvK3YBB8AfWqr6jjf3ZmKIb8XS2yXduOP9T6ixFPj-pjn0VfAugCY_a85IO6LiChBeliMO84t5OO-qUKmdnj1qMd5Piy_H28FnXN_57X6tSUmOfo1oNTvMKBCWBg5azgw5dZNCYu18OxfmpxsXPgWF8Th7omsxSFqCCOOBoFPoFdVu3Lj_2pa9pLgJF5FzWZKKNEBnwBjPf6MD_PkybcjX9atigIbUvTgEbwKVNZrgENagDTgT984cfm7baOB4eYWTuaV6ycCgpMLSgk-gA" + }, + { + "type": "prefix-sha-256", + "maxMessageLength": 0, + "prefix": "YWFh", + "subfulfillment": { + "type": "ed25519-sha-256", + "publicKey": "11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo", + "signature": "UGoepoMY5i1AY12tBD4Zh-vCbltcRAb3vfhacziPv-XCRaxJ9HcOvHh3CCcKpqh2n-_okw_Q6h7mSzFAfXaVCQ" + } + }, + { + "type": "rsa-sha-256", + "modulus": "u7ChoxT_ai_HmuBvYQ3I1EIckz7QxDVOaurZHvlH6k-PYysuL3i4oHp4wzJIlcfLCRbrM0wQCQ5e254Cle0v8d6v0fSfVEEuQ-3iywbP_DlTAzCaTOPqwjQdmvMYgzfuur09Skr49D4VfW8C-dHySkJ3cEnJMKojP-1cY7B_clzea7JEBPy_wLhyR-rLfbBEeFumbt6OeSESRwFQQB4KhHG9428tXsuWD1cboX2vOB2DeN7CHhAS5LN2yebEa7Z9aO7xK6mhWWf0hti8kbPisG-l_KabdSQmrwKcsUnqWG3thR66Fgh2rNhfBiJx-tc9FfXw8CLiYTCSJr7jVnrQUvl0bKi_rPDU9BcwCFwJegICgwHZKgxUXAOXRywu7lthIiAl1jRw7mgc4yUnR86coj8Z5m8vY4bmrRORHXrazTjOXKj_LC2Zq7D1w7qEdQlhPmYyoSzm73jaTIIOkINAUwA9EZf2pXsBAP7hUshMixszu5ZXGYh4D6-9aXz4NwqZ2o-q91aH2VHMZTPHi44c4uHVzrmhFikgGvQ3R1yUAn-lJhS0MAt33PGArEnKo0AWjzJi_R7osTgCzqNXVLQjuDP6FMXdDEdt3l1ee_c3TWHySMO6uRywVQvRy-9wUH7o2xzzmTB-Io1PRZKmbFhXPP7MY5ZoBvr4gQnMsJkj6ls", + "signature": "fss4we3Ml_SM2IUwwkbFSRKGf1EbxN3QjFc8ogg6yf2qNFwXdo2t6YNCSBjbUqNy4oD7pWgvZSFalz-3KGdJO2T4-zQVM5felzo2xzxSuR4DQBtvpWP3d4T6r4ggQFvukx6jX3qNlCUUrlhsH8yo7e-biQTRuOEcnNjdu38VG3cX4STnLVejyjP0TkrXvDvYf9wge6rqrbax8XVPx48bQmbd84bl1STBo4cGUjqoIPEYsFN3Law-SoZ700WkvDWSCe9sHIPPVDKcJUjRrwUd_tr1PoBA9_OwYThrJ7UMj98w-k_X1fPfTbB0RMW4Z9V_P9L5r0AXRyHlYEJILwy4oEx4b74N47mHskntvTC32yuSic9E0OfLLmvewIpukErdNo5AwKf5LoSGWAaLDdbF7989xvK3YBB8AfWqr6jjf3ZmKIb8XS2yXduOP9T6ixFPj-pjn0VfAugCY_a85IO6LiChBeliMO84t5OO-qUKmdnj1qMd5Piy_H28FnXN_57X6tSUmOfo1oNTvMKBCWBg5azgw5dZNCYu18OxfmpxsXPgWF8Th7omsxSFqCCOOBoFPoFdVu3Lj_2pa9pLgJF5FzWZKKNEBnwBjPf6MD_PkybcjX9atigIbUvTgEbwKVNZrgENagDTgT984cfm7baOB4eYWTuaV6ycCgpMLSgk-gA" + }, + { + "type": "preimage-sha-256", + "preimage": "YWFh" + } + ] + }, + "cost": 267264, + "subtypes": [ + "ed25519-sha-256", + "prefix-sha-256", + "preimage-sha-256", + "rsa-sha-256" + ], + "fingerprintContents": "3081D9800101A181D3A02580209834876DCFB05CB167A5C24953EBA58C4AC89B1ADF57F28F2F9D09AF107EE8F0810103A12B8020451FE15F16299D495993FE692DB989E56A5230A90476F77392A3CD3213C0733F810302040382020308A12B8020451FE15F16299D495993FE692DB989E56A5230A90476F77392A3CD3213C0733F810302040382020308A32780204DD2EA7F85B3EACB8F19058E8360955C32E74C124392A1F44660739709C539C38103040000A32780204DD2EA7F85B3EACB8F19058E8360955C32E74C124392A1F44660739709C539C38103040000", + "fulfillment": "A281B8A007A0058003616161A181ACA12B8020451FE15F16299D495993FE692DB989E56A5230A90476F77392A3CD3213C0733F810302040382020308A12B8020451FE15F16299D495993FE692DB989E56A5230A90476F77392A3CD3213C0733F810302040382020308A32780204DD2EA7F85B3EACB8F19058E8360955C32E74C124392A1F44660739709C539C38103040000A32780204DD2EA7F85B3EACB8F19058E8360955C32E74C124392A1F44660739709C539C38103040000", + "conditionBinary": "A22B80209A0B2C63DF80686E6020D0CA21CBFE668CCEC3D1AF82713FEAE9B8DD4A0F9BB78103041400820203D8", + "conditionUri": "ni:///sha-256;mgssY9-AaG5gINDKIcv-ZozOw9GvgnE_6um43UoPm7c?fpt=threshold-sha-256&cost=267264&subtypes=preimage-sha-256,prefix-sha-256,rsa-sha-256,ed25519-sha-256", + "message": "" +} diff --git a/src/cryptoconditions/tests/vectors/0010_test-basic-threshold-same-fulfillment-twice.json b/src/cryptoconditions/tests/vectors/0010_test-basic-threshold-same-fulfillment-twice.json new file mode 100644 index 000000000..9a1927d4b --- /dev/null +++ b/src/cryptoconditions/tests/vectors/0010_test-basic-threshold-same-fulfillment-twice.json @@ -0,0 +1,48 @@ +{ + "json": { + "type": "threshold-sha-256", + "threshold": 4, + "subfulfillments": [ + { + "type": "prefix-sha-256", + "maxMessageLength": 0, + "prefix": "YWFh", + "subfulfillment": { + "type": "ed25519-sha-256", + "publicKey": "11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo", + "signature": "UGoepoMY5i1AY12tBD4Zh-vCbltcRAb3vfhacziPv-XCRaxJ9HcOvHh3CCcKpqh2n-_okw_Q6h7mSzFAfXaVCQ" + } + }, + { + "type": "ed25519-sha-256", + "publicKey": "11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo", + "signature": "5VZDAMNgrHKQhuLMgG6CioSHfx645dl02HPgZSJJAVVfuIIVkKM7rMYeOXAc-bRr0lv18FlbviRlUUFDjnoQCw" + }, + { + "type": "prefix-sha-256", + "maxMessageLength": 0, + "prefix": "YWFh", + "subfulfillment": { + "type": "ed25519-sha-256", + "publicKey": "11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo", + "signature": "UGoepoMY5i1AY12tBD4Zh-vCbltcRAb3vfhacziPv-XCRaxJ9HcOvHh3CCcKpqh2n-_okw_Q6h7mSzFAfXaVCQ" + } + }, + { + "type": "ed25519-sha-256", + "publicKey": "11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo", + "signature": "5VZDAMNgrHKQhuLMgG6CioSHfx645dl02HPgZSJJAVVfuIIVkKM7rMYeOXAc-bRr0lv18FlbviRlUUFDjnoQCw" + } + ] + }, + "cost": 530438, + "subtypes": [ + "ed25519-sha-256", + "prefix-sha-256" + ], + "fingerprintContents": "3081B2800104A181ACA12B8020451FE15F16299D495993FE692DB989E56A5230A90476F77392A3CD3213C0733F810302040382020308A12B8020451FE15F16299D495993FE692DB989E56A5230A90476F77392A3CD3213C0733F810302040382020308A4278020799239ABA8FC4FF7EABFBC4C44E69E8BDFED993324E12ED64792ABE289CF1D5F8103020000A4278020799239ABA8FC4FF7EABFBC4C44E69E8BDFED993324E12ED64792ABE289CF1D5F8103020000", + "fulfillment": "A28201B6A08201B0A1708003616161810100A266A4648020D75A980182B10AB7D54BFED3C964073A0EE172F3DAA62325AF021A68F707511A8140506A1EA68318E62D40635DAD043E1987EBC26E5B5C4406F7BDF85A73388FBFE5C245AC49F4770EBC787708270AA6A8769FEFE8930FD0EA1EE64B31407D769509A1708003616161810100A266A4648020D75A980182B10AB7D54BFED3C964073A0EE172F3DAA62325AF021A68F707511A8140506A1EA68318E62D40635DAD043E1987EBC26E5B5C4406F7BDF85A73388FBFE5C245AC49F4770EBC787708270AA6A8769FEFE8930FD0EA1EE64B31407D769509A4648020D75A980182B10AB7D54BFED3C964073A0EE172F3DAA62325AF021A68F707511A8140E5564300C360AC729086E2CC806E828A84877F1EB8E5D974D873E065224901555FB8821590A33BACC61E39701CF9B46BD25BF5F0595BBE24655141438E7A100BA4648020D75A980182B10AB7D54BFED3C964073A0EE172F3DAA62325AF021A68F707511A8140E5564300C360AC729086E2CC806E828A84877F1EB8E5D974D873E065224901555FB8821590A33BACC61E39701CF9B46BD25BF5F0595BBE24655141438E7A100BA100", + "conditionBinary": "A22B80208E433EF5D3EAA00A2B34A05CA7C22DD392973A19F1A243268CB53111BDF1C844810308180682020348", + "conditionUri": "ni:///sha-256;jkM-9dPqoAorNKBcp8It05KXOhnxokMmjLUxEb3xyEQ?fpt=threshold-sha-256&cost=530438&subtypes=prefix-sha-256,ed25519-sha-256", + "message": "" +} diff --git a/src/cryptoconditions/tests/vectors/0011_test-basic-threshold-two-levels-deep.json b/src/cryptoconditions/tests/vectors/0011_test-basic-threshold-two-levels-deep.json new file mode 100644 index 000000000..af153f473 --- /dev/null +++ b/src/cryptoconditions/tests/vectors/0011_test-basic-threshold-two-levels-deep.json @@ -0,0 +1,50 @@ +{ + "json": { + "type": "threshold-sha-256", + "threshold": 2, + "subfulfillments": [ + { + "type": "threshold-sha-256", + "threshold": 2, + "subfulfillments": [ + { + "type": "rsa-sha-256", + "modulus": "u7ChoxT_ai_HmuBvYQ3I1EIckz7QxDVOaurZHvlH6k-PYysuL3i4oHp4wzJIlcfLCRbrM0wQCQ5e254Cle0v8d6v0fSfVEEuQ-3iywbP_DlTAzCaTOPqwjQdmvMYgzfuur09Skr49D4VfW8C-dHySkJ3cEnJMKojP-1cY7B_clzea7JEBPy_wLhyR-rLfbBEeFumbt6OeSESRwFQQB4KhHG9428tXsuWD1cboX2vOB2DeN7CHhAS5LN2yebEa7Z9aO7xK6mhWWf0hti8kbPisG-l_KabdSQmrwKcsUnqWG3thR66Fgh2rNhfBiJx-tc9FfXw8CLiYTCSJr7jVnrQUvl0bKi_rPDU9BcwCFwJegICgwHZKgxUXAOXRywu7lthIiAl1jRw7mgc4yUnR86coj8Z5m8vY4bmrRORHXrazTjOXKj_LC2Zq7D1w7qEdQlhPmYyoSzm73jaTIIOkINAUwA9EZf2pXsBAP7hUshMixszu5ZXGYh4D6-9aXz4NwqZ2o-q91aH2VHMZTPHi44c4uHVzrmhFikgGvQ3R1yUAn-lJhS0MAt33PGArEnKo0AWjzJi_R7osTgCzqNXVLQjuDP6FMXdDEdt3l1ee_c3TWHySMO6uRywVQvRy-9wUH7o2xzzmTB-Io1PRZKmbFhXPP7MY5ZoBvr4gQnMsJkj6ls", + "signature": "fss4we3Ml_SM2IUwwkbFSRKGf1EbxN3QjFc8ogg6yf2qNFwXdo2t6YNCSBjbUqNy4oD7pWgvZSFalz-3KGdJO2T4-zQVM5felzo2xzxSuR4DQBtvpWP3d4T6r4ggQFvukx6jX3qNlCUUrlhsH8yo7e-biQTRuOEcnNjdu38VG3cX4STnLVejyjP0TkrXvDvYf9wge6rqrbax8XVPx48bQmbd84bl1STBo4cGUjqoIPEYsFN3Law-SoZ700WkvDWSCe9sHIPPVDKcJUjRrwUd_tr1PoBA9_OwYThrJ7UMj98w-k_X1fPfTbB0RMW4Z9V_P9L5r0AXRyHlYEJILwy4oEx4b74N47mHskntvTC32yuSic9E0OfLLmvewIpukErdNo5AwKf5LoSGWAaLDdbF7989xvK3YBB8AfWqr6jjf3ZmKIb8XS2yXduOP9T6ixFPj-pjn0VfAugCY_a85IO6LiChBeliMO84t5OO-qUKmdnj1qMd5Piy_H28FnXN_57X6tSUmOfo1oNTvMKBCWBg5azgw5dZNCYu18OxfmpxsXPgWF8Th7omsxSFqCCOOBoFPoFdVu3Lj_2pa9pLgJF5FzWZKKNEBnwBjPf6MD_PkybcjX9atigIbUvTgEbwKVNZrgENagDTgT984cfm7baOB4eYWTuaV6ycCgpMLSgk-gA" + }, + { + "type": "prefix-sha-256", + "maxMessageLength": 0, + "prefix": "YWFh", + "subfulfillment": { + "type": "ed25519-sha-256", + "publicKey": "11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo", + "signature": "UGoepoMY5i1AY12tBD4Zh-vCbltcRAb3vfhacziPv-XCRaxJ9HcOvHh3CCcKpqh2n-_okw_Q6h7mSzFAfXaVCQ" + } + }, + { + "type": "ed25519-sha-256", + "publicKey": "11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo", + "signature": "5VZDAMNgrHKQhuLMgG6CioSHfx645dl02HPgZSJJAVVfuIIVkKM7rMYeOXAc-bRr0lv18FlbviRlUUFDjnoQCw" + } + ] + }, + { + "type": "preimage-sha-256", + "preimage": "YWFh" + } + ] + }, + "cost": 399366, + "subtypes": [ + "ed25519-sha-256", + "prefix-sha-256", + "preimage-sha-256", + "rsa-sha-256" + ], + "fingerprintContents": "3059800102A154A02580209834876DCFB05CB167A5C24953EBA58C4AC89B1ADF57F28F2F9D09AF107EE8F0810103A22B8020B6ACF4083E438BE4356F25FF92C295E9C8E1BAB141B4607BA48511EBA35AEFCC810306100382020358", + "fulfillment": "A2820117A0820111A0058003616161A2820106A081D8A1708003616161810100A266A4648020D75A980182B10AB7D54BFED3C964073A0EE172F3DAA62325AF021A68F707511A8140506A1EA68318E62D40635DAD043E1987EBC26E5B5C4406F7BDF85A73388FBFE5C245AC49F4770EBC787708270AA6A8769FEFE8930FD0EA1EE64B31407D769509A4648020D75A980182B10AB7D54BFED3C964073A0EE172F3DAA62325AF021A68F707511A8140E5564300C360AC729086E2CC806E828A84877F1EB8E5D974D873E065224901555FB8821590A33BACC61E39701CF9B46BD25BF5F0595BBE24655141438E7A100BA129A32780204DD2EA7F85B3EACB8F19058E8360955C32E74C124392A1F44660739709C539C38103040000A100", + "conditionBinary": "A22B80200C99630A201A99B0748D2BADB205E5CA939692C687D1C4A697E39BA8BA1EBE718103061806820203D8", + "conditionUri": "ni:///sha-256;DJljCiAambB0jSutsgXlypOWksaH0cSml-ObqLoevnE?fpt=threshold-sha-256&cost=399366&subtypes=preimage-sha-256,prefix-sha-256,rsa-sha-256,ed25519-sha-256", + "message": "" +} diff --git a/src/cryptoconditions/tests/vectors/0012_test-basic-threshold-schroedinger.json b/src/cryptoconditions/tests/vectors/0012_test-basic-threshold-schroedinger.json new file mode 100644 index 000000000..4285ac44d --- /dev/null +++ b/src/cryptoconditions/tests/vectors/0012_test-basic-threshold-schroedinger.json @@ -0,0 +1,25 @@ +{ + "json": { + "type": "threshold-sha-256", + "threshold": 1, + "subfulfillments": [ + { + "type": "preimage-sha-256", + "preimage": "YWFh" + }, + { + "type": "preimage-sha-256", + "preimage": "YWFh" + } + ] + }, + "cost": 2051, + "subtypes": [ + "preimage-sha-256" + ], + "fingerprintContents": "3053800101A14EA02580209834876DCFB05CB167A5C24953EBA58C4AC89B1ADF57F28F2F9D09AF107EE8F0810103A02580209834876DCFB05CB167A5C24953EBA58C4AC89B1ADF57F28F2F9D09AF107EE8F0810103", + "fulfillment": "A232A007A0058003616161A127A02580209834876DCFB05CB167A5C24953EBA58C4AC89B1ADF57F28F2F9D09AF107EE8F0810103", + "conditionBinary": "A22A8020E4FDB4652C6F17A38B2ABE9AA00640B1E184FE7A8D0C971B5D24F7EDA6FC68BF8102080382020780", + "conditionUri": "ni:///sha-256;5P20ZSxvF6OLKr6aoAZAseGE_nqNDJcbXST37ab8aL8?fpt=threshold-sha-256&cost=2051&subtypes=preimage-sha-256", + "message": "" +} \ No newline at end of file diff --git a/src/cryptoconditions/tests/vectors/0013_test-basic-rsa.json b/src/cryptoconditions/tests/vectors/0013_test-basic-rsa.json new file mode 100644 index 000000000..5681fc5c1 --- /dev/null +++ b/src/cryptoconditions/tests/vectors/0013_test-basic-rsa.json @@ -0,0 +1,14 @@ +{ + "json": { + "type": "rsa-sha-256", + "modulus": "4e-LJNb3awnIHtd1KqJi8ETwSodNQ4CdMc6mEvmbDJeotDdBU-Pu89ZmFoQ-DkHCkyZLcbYXPbHPDWzVWMWGV3Bvzwl_cExIPlnL_f1bPue8gNdAxeDwR_PoX8DXWBV3am8_I8XcXnlxOaaILjgzakpfs2E3Yg_zZj264yhHKAGGL3Ly-HsgK5yJrdfNWwoHb3xT41A59n7RfsgV5bQwXMYxlwaNXm5Xm6beX04-V99eTgcv8s5MZutFIzlzh1J1ljnwJXv1fb1cRD-1FYzOCj02rce6AfM6C7bbsr-YnWBxEvI0TZk-d-VjwdNh3t9X2pbvLPxoXwArY4JGpbMJuQ", + "signature": "SOiUXv4AdVbVv01fJJ5ICPcwfilRHTJi2u9h2ICY-apKi8BiOoyXVzj2XWv0WdVD8onXPLx69Oo6M_vz7ERARHkR1yKUCR5WGDNijkmncu1gjebERZWpHj4X1s9ew7JSjWPSrdZGOYmxLuxXffZHCWDfaDKp2Ew2DRwhetZMhiW9tZT7CtoIbN7LveWA1CS_l0bS8MMSgm27sArWi1LEy31HFWujXjqYHJc4Y3ksyA0EoYAhClJBWGW2Szphd0sdOXXXipiwgh7lXKD4YwXUJSnhDrAVzv1AL7WbKruN7uUqbyRH0ihGA9IZzU6M-c_91UmIicN4C1ndalfvfXMmIA" + }, + "cost": 65536, + "subtypes": [], + "fingerprintContents": "3082010480820100E1EF8B24D6F76B09C81ED7752AA262F044F04A874D43809D31CEA612F99B0C97A8B4374153E3EEF3D66616843E0E41C293264B71B6173DB1CF0D6CD558C58657706FCF097F704C483E59CBFDFD5B3EE7BC80D740C5E0F047F3E85FC0D75815776A6F3F23C5DC5E797139A6882E38336A4A5FB36137620FF3663DBAE328472801862F72F2F87B202B9C89ADD7CD5B0A076F7C53E35039F67ED17EC815E5B4305CC63197068D5E6E579BA6DE5F4E3E57DF5E4E072FF2CE4C66EB452339738752759639F0257BF57DBD5C443FB5158CCE0A3D36ADC7BA01F33A0BB6DBB2BF989D607112F2344D993E77E563C1D361DEDF57DA96EF2CFC685F002B638246A5B309B9", + "fulfillment": "A382020880820100E1EF8B24D6F76B09C81ED7752AA262F044F04A874D43809D31CEA612F99B0C97A8B4374153E3EEF3D66616843E0E41C293264B71B6173DB1CF0D6CD558C58657706FCF097F704C483E59CBFDFD5B3EE7BC80D740C5E0F047F3E85FC0D75815776A6F3F23C5DC5E797139A6882E38336A4A5FB36137620FF3663DBAE328472801862F72F2F87B202B9C89ADD7CD5B0A076F7C53E35039F67ED17EC815E5B4305CC63197068D5E6E579BA6DE5F4E3E57DF5E4E072FF2CE4C66EB452339738752759639F0257BF57DBD5C443FB5158CCE0A3D36ADC7BA01F33A0BB6DBB2BF989D607112F2344D993E77E563C1D361DEDF57DA96EF2CFC685F002B638246A5B309B98182010048E8945EFE007556D5BF4D5F249E4808F7307E29511D3262DAEF61D88098F9AA4A8BC0623A8C975738F65D6BF459D543F289D73CBC7AF4EA3A33FBF3EC4440447911D72294091E561833628E49A772ED608DE6C44595A91E3E17D6CF5EC3B2528D63D2ADD6463989B12EEC577DF6470960DF6832A9D84C360D1C217AD64C8625BDB594FB0ADA086CDECBBDE580D424BF9746D2F0C312826DBBB00AD68B52C4CB7D47156BA35E3A981C973863792CC80D04A180210A52415865B64B3A61774B1D3975D78A98B0821EE55CA0F86305D42529E10EB015CEFD402FB59B2ABB8DEEE52A6F2447D2284603D219CD4E8CF9CFFDD5498889C3780B59DD6A57EF7D732620", + "conditionBinary": "A3278020B31FA8206E4EA7E515337B3B33082B877651801085ED84FB4DAEB247BF698D7F8103010000", + "conditionUri": "ni:///sha-256;sx-oIG5Op-UVM3s7Mwgrh3ZRgBCF7YT7Ta6yR79pjX8?fpt=rsa-sha-256&cost=65536", + "message": "616161" +} \ No newline at end of file diff --git a/src/cryptoconditions/tests/vectors/0014_test-basic-rsa4096.json b/src/cryptoconditions/tests/vectors/0014_test-basic-rsa4096.json new file mode 100644 index 000000000..ab17137b2 --- /dev/null +++ b/src/cryptoconditions/tests/vectors/0014_test-basic-rsa4096.json @@ -0,0 +1,14 @@ +{ + "json": { + "type": "rsa-sha-256", + "modulus": "u7ChoxT_ai_HmuBvYQ3I1EIckz7QxDVOaurZHvlH6k-PYysuL3i4oHp4wzJIlcfLCRbrM0wQCQ5e254Cle0v8d6v0fSfVEEuQ-3iywbP_DlTAzCaTOPqwjQdmvMYgzfuur09Skr49D4VfW8C-dHySkJ3cEnJMKojP-1cY7B_clzea7JEBPy_wLhyR-rLfbBEeFumbt6OeSESRwFQQB4KhHG9428tXsuWD1cboX2vOB2DeN7CHhAS5LN2yebEa7Z9aO7xK6mhWWf0hti8kbPisG-l_KabdSQmrwKcsUnqWG3thR66Fgh2rNhfBiJx-tc9FfXw8CLiYTCSJr7jVnrQUvl0bKi_rPDU9BcwCFwJegICgwHZKgxUXAOXRywu7lthIiAl1jRw7mgc4yUnR86coj8Z5m8vY4bmrRORHXrazTjOXKj_LC2Zq7D1w7qEdQlhPmYyoSzm73jaTIIOkINAUwA9EZf2pXsBAP7hUshMixszu5ZXGYh4D6-9aXz4NwqZ2o-q91aH2VHMZTPHi44c4uHVzrmhFikgGvQ3R1yUAn-lJhS0MAt33PGArEnKo0AWjzJi_R7osTgCzqNXVLQjuDP6FMXdDEdt3l1ee_c3TWHySMO6uRywVQvRy-9wUH7o2xzzmTB-Io1PRZKmbFhXPP7MY5ZoBvr4gQnMsJkj6ls", + "signature": "QSAOQpYe6kYMgnbyOatmt2-PKGnqzMX56ZRcCrxjsUMGVvPaLSF6QzJ-6M4RJ9FKhddK9BL-k3A0W6a0QAPXca7dK6D8JQYn_fYWMa_WTpvucUsbr7afkBvutvlZsWpUsyippnTIg8r8T8L3sEdtvKqNm_1H9zTjRza_ZulzsxXCq_RyewYso8QCk261CEnhgV3RYEpgTe-maM_oI7AIv4979XzrG0HlGP9TrpEe-YgFcbPRdCNB1g48sr65PrXxePjve6DG8ikLmVXYPWD5Q9ZEVx7I1fBk2V8doedZ1pINhKVMvEl4NkCnsM89Ao5ifsetJakV9tjCSy4JkVKKAsW-8BBsGLPznFmZVut6J7M3MT3Pk-dYZ2BqSsWhq2-btETcHa0fVG-u3mrpNIhASQF2kTcdUe4dZQ785YGzDGhDCH5wFBkPRGAmfYlNUlgU3aNDuaBIncCMajQzR0LOowtJJRLSlXRSF91l7P7LnKGNIS-EpQbXACbtMyiWvSSmMFoMve6d_Yq7hQf4QOuUz6jpKOaRDCdfe2jRH5ZGPBAqWWYTR4aVvHZx-ycwkTnGzS8Vyn4kBS5H9ONO-LhE7DZKhb3JvoQlz_cqd76Y2QFphqZnEJgl8e8Y4IFwqHtDaOfBQsGdrRBgXE80HVIJmHrzGrqOLklj8-B5TdEfC3I" + }, + "cost": 262144, + "subtypes": [], + "fingerprintContents": "3082020480820200BBB0A1A314FF6A2FC79AE06F610DC8D4421C933ED0C4354E6AEAD91EF947EA4F8F632B2E2F78B8A07A78C3324895C7CB0916EB334C10090E5EDB9E0295ED2FF1DEAFD1F49F54412E43EDE2CB06CFFC395303309A4CE3EAC2341D9AF3188337EEBABD3D4A4AF8F43E157D6F02F9D1F24A42777049C930AA233FED5C63B07F725CDE6BB24404FCBFC0B87247EACB7DB044785BA66EDE8E792112470150401E0A8471BDE36F2D5ECB960F571BA17DAF381D8378DEC21E1012E4B376C9E6C46BB67D68EEF12BA9A15967F486D8BC91B3E2B06FA5FCA69B752426AF029CB149EA586DED851EBA160876ACD85F062271FAD73D15F5F0F022E261309226BEE3567AD052F9746CA8BFACF0D4F41730085C097A02028301D92A0C545C0397472C2EEE5B61222025D63470EE681CE3252747CE9CA23F19E66F2F6386E6AD13911D7ADACD38CE5CA8FF2C2D99ABB0F5C3BA847509613E6632A12CE6EF78DA4C820E90834053003D1197F6A57B0100FEE152C84C8B1B33BB96571988780FAFBD697CF8370A99DA8FAAF75687D951CC6533C78B8E1CE2E1D5CEB9A11629201AF437475C94027FA52614B4300B77DCF180AC49CAA340168F3262FD1EE8B13802CEA35754B423B833FA14C5DD0C476DDE5D5E7BF7374D61F248C3BAB91CB0550BD1CBEF70507EE8DB1CF399307E228D4F4592A66C58573CFECC63966806FAF88109CCB09923EA5B", + "fulfillment": "A382040880820200BBB0A1A314FF6A2FC79AE06F610DC8D4421C933ED0C4354E6AEAD91EF947EA4F8F632B2E2F78B8A07A78C3324895C7CB0916EB334C10090E5EDB9E0295ED2FF1DEAFD1F49F54412E43EDE2CB06CFFC395303309A4CE3EAC2341D9AF3188337EEBABD3D4A4AF8F43E157D6F02F9D1F24A42777049C930AA233FED5C63B07F725CDE6BB24404FCBFC0B87247EACB7DB044785BA66EDE8E792112470150401E0A8471BDE36F2D5ECB960F571BA17DAF381D8378DEC21E1012E4B376C9E6C46BB67D68EEF12BA9A15967F486D8BC91B3E2B06FA5FCA69B752426AF029CB149EA586DED851EBA160876ACD85F062271FAD73D15F5F0F022E261309226BEE3567AD052F9746CA8BFACF0D4F41730085C097A02028301D92A0C545C0397472C2EEE5B61222025D63470EE681CE3252747CE9CA23F19E66F2F6386E6AD13911D7ADACD38CE5CA8FF2C2D99ABB0F5C3BA847509613E6632A12CE6EF78DA4C820E90834053003D1197F6A57B0100FEE152C84C8B1B33BB96571988780FAFBD697CF8370A99DA8FAAF75687D951CC6533C78B8E1CE2E1D5CEB9A11629201AF437475C94027FA52614B4300B77DCF180AC49CAA340168F3262FD1EE8B13802CEA35754B423B833FA14C5DD0C476DDE5D5E7BF7374D61F248C3BAB91CB0550BD1CBEF70507EE8DB1CF399307E228D4F4592A66C58573CFECC63966806FAF88109CCB09923EA5B8182020041200E42961EEA460C8276F239AB66B76F8F2869EACCC5F9E9945C0ABC63B1430656F3DA2D217A43327EE8CE1127D14A85D74AF412FE9370345BA6B44003D771AEDD2BA0FC250627FDF61631AFD64E9BEE714B1BAFB69F901BEEB6F959B16A54B328A9A674C883CAFC4FC2F7B0476DBCAA8D9BFD47F734E34736BF66E973B315C2ABF4727B062CA3C402936EB50849E1815DD1604A604DEFA668CFE823B008BF8F7BF57CEB1B41E518FF53AE911EF9880571B3D1742341D60E3CB2BEB93EB5F178F8EF7BA0C6F2290B9955D83D60F943D644571EC8D5F064D95F1DA1E759D6920D84A54CBC49783640A7B0CF3D028E627EC7AD25A915F6D8C24B2E0991528A02C5BEF0106C18B3F39C599956EB7A27B337313DCF93E75867606A4AC5A1AB6F9BB444DC1DAD1F546FAEDE6AE934884049017691371D51EE1D650EFCE581B30C6843087E7014190F4460267D894D525814DDA343B9A0489DC08C6A34334742CEA30B492512D295745217DD65ECFECB9CA18D212F84A506D70026ED332896BD24A6305A0CBDEE9DFD8ABB8507F840EB94CFA8E928E6910C275F7B68D11F96463C102A596613478695BC7671FB27309139C6CD2F15CA7E24052E47F4E34EF8B844EC364A85BDC9BE8425CFF72A77BE98D9016986A667109825F1EF18E08170A87B4368E7C142C19DAD10605C4F341D5209987AF31ABA8E2E4963F3E0794DD11F0B72", + "conditionBinary": "A32780204DD2EA7F85B3EACB8F19058E8360955C32E74C124392A1F44660739709C539C38103040000", + "conditionUri": "ni:///sha-256;TdLqf4Wz6suPGQWOg2CVXDLnTBJDkqH0RmBzlwnFOcM?fpt=rsa-sha-256&cost=262144", + "message": "616161" +} \ No newline at end of file diff --git a/src/cryptoconditions/tests/vectors/0015_test-basic-ed25519.json b/src/cryptoconditions/tests/vectors/0015_test-basic-ed25519.json new file mode 100644 index 000000000..89247eb1b --- /dev/null +++ b/src/cryptoconditions/tests/vectors/0015_test-basic-ed25519.json @@ -0,0 +1,14 @@ +{ + "json": { + "type": "ed25519-sha-256", + "publicKey": "11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo", + "signature": "UGoepoMY5i1AY12tBD4Zh-vCbltcRAb3vfhacziPv-XCRaxJ9HcOvHh3CCcKpqh2n-_okw_Q6h7mSzFAfXaVCQ" + }, + "cost": 131072, + "subtypes": [], + "fingerprintContents": "30228020D75A980182B10AB7D54BFED3C964073A0EE172F3DAA62325AF021A68F707511A", + "fulfillment": "A4648020D75A980182B10AB7D54BFED3C964073A0EE172F3DAA62325AF021A68F707511A8140506A1EA68318E62D40635DAD043E1987EBC26E5B5C4406F7BDF85A73388FBFE5C245AC49F4770EBC787708270AA6A8769FEFE8930FD0EA1EE64B31407D769509", + "conditionBinary": "A4278020799239ABA8FC4FF7EABFBC4C44E69E8BDFED993324E12ED64792ABE289CF1D5F8103020000", + "conditionUri": "ni:///sha-256;eZI5q6j8T_fqv7xMROaei9_tmTMk4S7WR5Kr4onPHV8?fpt=ed25519-sha-256&cost=131072", + "message": "616161" +} \ No newline at end of file diff --git a/src/cryptoconditions/tests/vectors/0016_test-advanced-notarized-receipt.json b/src/cryptoconditions/tests/vectors/0016_test-advanced-notarized-receipt.json new file mode 100644 index 000000000..f1dc75bf8 --- /dev/null +++ b/src/cryptoconditions/tests/vectors/0016_test-advanced-notarized-receipt.json @@ -0,0 +1,33 @@ +{ + "json": { + "type": "threshold-sha-256", + "threshold": 2, + "subfulfillments": [ + { + "type": "prefix-sha-256", + "maxMessageLength": 0, + "prefix": "aHR0cHM6Ly9ub3RhcnkuZXhhbXBsZS9jYXNlcy82NTdjMTJkYS04ZGNhLTQzYjAtOTdjYS04ZWU4YzM4YWI5Zjcvc3RhdGUvZXhlY3V0ZWQ", + "subfulfillment": { + "type": "ed25519-sha-256", + "publicKey": "LlMeiL_oxBn5Ya2ckB3ivdjnoOcUhFUFnonreZhrJSQ", + "signature": "5f3bvsLo21m8tqaA5KcFb91GUAtOmaNxnyVzUDahSSg-KHzt7c2eWlDNl2q0EfhP9Wmqveb24M5qC90MSoJGCA" + } + }, + { + "type": "preimage-sha-256", + "preimage": "aHR0cHM6Ly9ub3RhcnkuZXhhbXBsZS9jYXNlcy82NTdjMTJkYS04ZGNhLTQzYjAtOTdjYS04ZWU4YzM4YWI5Zjcvc3RhdGUvZXhlY3V0ZWQ" + } + ] + }, + "cost": 134304, + "subtypes": [ + "ed25519-sha-256", + "prefix-sha-256", + "preimage-sha-256" + ], + "fingerprintContents": "3059800102A154A02580200B4AC3A1E0932CB71B74309FAD7D15DF51BD4D1359ED59FF7C917B35DF24464A810150A12B80203F94525555CF4C5234BF77CB108501D97B9D8A28D1E7A3A7FE8D3D7F031FDEBD810302045082020308", + "fulfillment": "A282011AA0820114A052805068747470733A2F2F6E6F746172792E6578616D706C652F63617365732F36353763313264612D386463612D343362302D393763612D3865653863333861623966372F73746174652F6578656375746564A181BD805068747470733A2F2F6E6F746172792E6578616D706C652F63617365732F36353763313264612D386463612D343362302D393763612D3865653863333861623966372F73746174652F6578656375746564810100A266A46480202E531E88BFE8C419F961AD9C901DE2BDD8E7A0E7148455059E89EB79986B25248140E5FDDBBEC2E8DB59BCB6A680E4A7056FDD46500B4E99A3719F25735036A149283E287CEDEDCD9E5A50CD976AB411F84FF569AABDE6F6E0CE6A0BDD0C4A824608A100", + "conditionBinary": "A22B802009E391004628725E88F8557E954FB2A0EAE2B7C151C47DF3C4AF22F8C16988F98103020CA0820203C8", + "conditionUri": "ni:///sha-256;CeORAEYocl6I-FV-lU-yoOrit8FRxH3zxK8i-MFpiPk?fpt=threshold-sha-256&cost=134304&subtypes=preimage-sha-256,prefix-sha-256,ed25519-sha-256", + "message": "" +} diff --git a/src/cryptoconditions/tests/vectors/0017_test-advanced-notarized-receipt-multiple-notaries.json b/src/cryptoconditions/tests/vectors/0017_test-advanced-notarized-receipt-multiple-notaries.json new file mode 100644 index 000000000..a8e98bc20 --- /dev/null +++ b/src/cryptoconditions/tests/vectors/0017_test-advanced-notarized-receipt-multiple-notaries.json @@ -0,0 +1,74 @@ +{ + "json": { + "type": "threshold-sha-256", + "threshold": 2, + "subfulfillments": [ + { + "type": "prefix-sha-256", + "maxMessageLength": 0, + "prefix": "Y2FzZXMvNjU3YzEyZGEtOGRjYS00M2IwLTk3Y2EtOGVlOGMzOGFiOWY3L3N0YXRlL2V4ZWN1dGVk", + "subfulfillment": { + "type": "threshold-sha-256", + "threshold": 3, + "subfulfillments": [ + { + "type": "prefix-sha-256", + "maxMessageLength": 1025, + "prefix": "aHR0cHM6Ly9ub3Rhcnk0LmV4YW1wbGUv", + "subfulfillment": { + "type": "ed25519-sha-256", + "publicKey": "Rkvo5cq-MB4FMv5iIUjPy8zxG_MXop9cyHg5xpUf6pg", + "signature": "rlayC5_mc7O1szd9hCV8kIVronrH_IYj89BwVubxNmV2CacPp9ASs8UqqLrQPtxIKp7kA-aA5IPjr1mlxK05BA" + } + }, + { + "type": "prefix-sha-256", + "maxMessageLength": 1024, + "prefix": "aHR0cHM6Ly9ub3RhcnkxLmV4YW1wbGUv", + "subfulfillment": { + "type": "ed25519-sha-256", + "publicKey": "LlMeiL_oxBn5Ya2ckB3ivdjnoOcUhFUFnonreZhrJSQ", + "signature": "hzAaGAj3PCA_DpyBBvEwcQiB2s2sgHwQ00m3mCDcs0B8d7nSPbQoJ2QL3EE4P9xOynYZwXA36HA3pcfPM4F6Dg" + } + }, + { + "type": "prefix-sha-256", + "maxMessageLength": 1024, + "prefix": "aHR0cHM6Ly9ub3RhcnkyLmV4YW1wbGUv", + "subfulfillment": { + "type": "ed25519-sha-256", + "publicKey": "WQI-doqchYdsYeuqo07BjmSFf6dmksVamWNfm4jlr5A", + "signature": "rPnug4hbpY9ixCtImejOqRWpGS90iMFZLOlZVgtS-Ho3kOA208aVS4dVQUjRMcy682nGimajE3_o-kNooWWgCg" + } + }, + { + "type": "prefix-sha-256", + "maxMessageLength": 1024, + "prefix": "aHR0cHM6Ly9ub3RhcnkzLmV4YW1wbGUv", + "subfulfillment": { + "type": "ed25519-sha-256", + "publicKey": "mpisbb_wkOluONgfBUd9-Gs7uw7_wxG8e0LNrJnWvdk", + "signature": "l6MrDGHOFRA2ytNZacn5XrVEZepdYpupZav4pqkX8Q3RSr5V0zBUQ45oyRWmtnwd34oMFtLYAfjQuoXv7pu_Dw" + } + } + ] + } + }, + { + "type": "preimage-sha-256", + "preimage": "aHR0cHM6Ly9ub3RhcnkuZXhhbXBsZS9jYXNlcy82NTdjMTJkYS04ZGNhLTQzYjAtOTdjYS04ZWU4YzM4YWI5Zjcvc3RhdGUvZXhlY3V0ZWQ" + } + ] + }, + "cost": 406738, + "subtypes": [ + "ed25519-sha-256", + "prefix-sha-256", + "preimage-sha-256" + ], + "fingerprintContents": "3059800102A154A02580200B4AC3A1E0932CB71B74309FAD7D15DF51BD4D1359ED59FF7C917B35DF24464A810150A12B8020062F2C1BDD08661FE7FEFAC20E02DA8B0184FCD36F6C6C54C53CC28D2E54DD118103062C8282020328", + "fulfillment": "A2820272A082026CA052805068747470733A2F2F6E6F746172792E6578616D706C652F63617365732F36353763313264612D386463612D343362302D393763612D3865653863333861623966372F73746174652F6578656375746564A1820214803963617365732F36353763313264612D386463612D343362302D393763612D3865653863333861623966372F73746174652F6578656375746564810100A28201D2A28201CEA082019BA18186801868747470733A2F2F6E6F74617279312E6578616D706C652F81020400A266A46480202E531E88BFE8C419F961AD9C901DE2BDD8E7A0E7148455059E89EB79986B2524814087301A1808F73C203F0E9C8106F130710881DACDAC807C10D349B79820DCB3407C77B9D23DB42827640BDC41383FDC4ECA7619C17037E87037A5C7CF33817A0EA18186801868747470733A2F2F6E6F74617279322E6578616D706C652F81020400A266A464802059023E768A9C85876C61EBAAA34EC18E64857FA76692C55A99635F9B88E5AF908140ACF9EE83885BA58F62C42B4899E8CEA915A9192F7488C1592CE959560B52F87A3790E036D3C6954B87554148D131CCBAF369C68A66A3137FE8FA4368A165A00AA18186801868747470733A2F2F6E6F74617279332E6578616D706C652F81020400A266A46480209A98AC6DBFF090E96E38D81F05477DF86B3BBB0EFFC311BC7B42CDAC99D6BDD9814097A32B0C61CE151036CAD35969C9F95EB54465EA5D629BA965ABF8A6A917F10DD14ABE55D33054438E68C915A6B67C1DDF8A0C16D2D801F8D0BA85EFEE9BBF0FA12DA12B8020EE0BC02F977C264B6C306ED1B168FEB4FD600950AD21750CE8A86ECBD4603538810302081982020308A100", + "conditionBinary": "A22B8020424A704949529267B621B3D79119D729B2382CED8B296C3C028FA97D350F6D0781030634D2820203C8", + "conditionUri": "ni:///sha-256;QkpwSUlSkme2IbPXkRnXKbI4LO2LKWw8Ao-pfTUPbQc?fpt=threshold-sha-256&cost=406738&subtypes=preimage-sha-256,prefix-sha-256,ed25519-sha-256", + "message": "" +} diff --git a/src/cryptoconditions/tests/vectors/1000_test-minimal-eval.json b/src/cryptoconditions/tests/vectors/1000_test-minimal-eval.json new file mode 100644 index 000000000..74e52beee --- /dev/null +++ b/src/cryptoconditions/tests/vectors/1000_test-minimal-eval.json @@ -0,0 +1,13 @@ +{ + "json": { + "type": "eval-sha-256", + "code": "VEVTVAE" + }, + "cost": 131072, + "subtypes": [], + "fingerprintContents": "", + "fulfillment": "AF0780055445535401", + "conditionBinary": "AF278020FD9DA5ADD8CF3164C4F46EF3B8B4925001F414718A13CEDEDD27A27CA93D5A238103100000", + "conditionUri": "ni:///sha-256;_Z2lrdjPMWTE9G7zuLSSUAH0FHGKE87e3SeifKk9WiM?fpt=eval-sha-256&cost=1048576", + "message": "" +} diff --git a/src/cryptoconditions/tests/custom-vectors/1001_test-minimal-secp256k1.json b/src/cryptoconditions/tests/vectors/1001_test-minimal-secp256k1.json similarity index 71% rename from src/cryptoconditions/tests/custom-vectors/1001_test-minimal-secp256k1.json rename to src/cryptoconditions/tests/vectors/1001_test-minimal-secp256k1.json index d34de80fa..a85b29d91 100644 --- a/src/cryptoconditions/tests/custom-vectors/1001_test-minimal-secp256k1.json +++ b/src/cryptoconditions/tests/vectors/1001_test-minimal-secp256k1.json @@ -1,8 +1,8 @@ { "json": { "type": "secp256k1-sha-256", - "publicKey": "AtXZaTBVNawpp3B5wR1PDdQGYc-W4E6XSl6NfjdO4iWq", - "signature": "nC1v8580C7r2XohL3_rnQ2p7dWiDnFuhF_poGCRfudo83sfP1NPfcZG9siY4_Ybz2aO4yyV_z5tU0JMcTQGV0w" + "publicKey": "02D5D969305535AC29A77079C11D4F0DD40661CF96E04E974A5E8D7E374EE225AA", + "signature": "9C2D6FF39F340BBAF65E884BDFFAE7436A7B7568839C5BA117FA6818245FB9DA3CDEC7CFD4D3DF7191BDB22638FD86F3D9A3B8CB257FCF9B54D0931C4D0195D3" }, "cost": 131072, "subtypes": [], diff --git a/src/test-komodo/test_cryptoconditions.cpp b/src/test-komodo/test_cryptoconditions.cpp index c9ffde955..6d7ac67c8 100644 --- a/src/test-komodo/test_cryptoconditions.cpp +++ b/src/test-komodo/test_cryptoconditions.cpp @@ -63,7 +63,7 @@ TEST_F(CCTest, testMayAcceptCryptoCondition) { "type": "threshold-sha-256", "threshold": 2, "subfulfillments": [ - { "type": "secp256k1-sha-256", "publicKey": "AgWorQwdvFFfFJrzd5gaq1i4Nq8AjU16shvXb6+AVQtH" } + { "type": "secp256k1-sha-256", "publicKey": "0205a8ad0c1dbc515f149af377981aab58b836af008d4d7ab21bd76faf80550b47" } ] })!!"); ASSERT_TRUE(CCPubKey(cond).MayAcceptCryptoCondition()); @@ -75,7 +75,7 @@ TEST_F(CCTest, testMayAcceptCryptoCondition) "prefix": "abc", "maxMessageLength": 10, "subfulfillment": - { "type": "secp256k1-sha-256", "publicKey": "AgWorQwdvFFfFJrzd5gaq1i4Nq8AjU16shvXb6+AVQtH" } + { "type": "secp256k1-sha-256", "publicKey": "0205a8ad0c1dbc515f149af377981aab58b836af008d4d7ab21bd76faf80550b47" } })!!"); ASSERT_FALSE(CCPubKey(cond).MayAcceptCryptoCondition()); @@ -108,9 +108,10 @@ TEST_F(CCTest, testVerifyCryptoCondition) }; // ok + cond = CCNewSecp256k1(notaryKey.GetPubKey()); CCFromJson(cond, R"!!({ "type": "secp256k1-sha-256", - "publicKey": "AgWorQwdvFFfFJrzd5gaq1i4Nq8AjU16shvXb6+AVQtH" + "publicKey": "0205a8ad0c1dbc515f149af377981aab58b836af008d4d7ab21bd76faf80550b47" })!!"); CCSign(mtxTo, cond); ASSERT_TRUE(Verify(cond)); @@ -122,7 +123,7 @@ TEST_F(CCTest, testVerifyCryptoCondition) "threshold": 1, "subfulfillments": [ { "type": "preimage-sha-256", "preimage": "" }, - { "type": "secp256k1-sha-256", "publicKey": "AgWorQwdvFFfFJrzd5gaq1i4Nq8AjU16shvXb6+AVQtH" } + { "type": "secp256k1-sha-256", "publicKey": "0205a8ad0c1dbc515f149af377981aab58b836af008d4d7ab21bd76faf80550b47" } ] })!!"); cond->threshold = 2; @@ -196,7 +197,7 @@ TEST_F(CCTest, testCryptoConditionsDisabled) // ok CCFromJson(cond, R"!!({ "type": "secp256k1-sha-256", - "publicKey": "AgWorQwdvFFfFJrzd5gaq1i4Nq8AjU16shvXb6+AVQtH" + "publicKey": "0205a8ad0c1dbc515f149af377981aab58b836af008d4d7ab21bd76faf80550b47" })!!"); CCSign(mtxTo, cond); ASSERT_TRUE(Verify(cond)); From 7214ca0730df0a4854dc6620497c83ecb38ed532 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 8 Apr 2018 13:39:53 +0300 Subject: [PATCH 0854/1062] Test --- src/komodo_events.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_events.h b/src/komodo_events.h index 315a78686..7e9dfa2df 100644 --- a/src/komodo_events.h +++ b/src/komodo_events.h @@ -40,7 +40,7 @@ struct komodo_event *komodo_eventadd(struct komodo_state *sp,int32_t height,char void komodo_eventadd_notarized(struct komodo_state *sp,char *symbol,int32_t height,char *dest,uint256 notarized_hash,uint256 notarized_desttxid,int32_t notarizedheight,uint256 MoM,int32_t MoMdepth) { struct komodo_event_notarized N; - if ( komodo_verifynotarization(symbol,dest,height,notarizedheight,notarized_hash,notarized_desttxid) != 0 ) + if ( 0 && komodo_verifynotarization(symbol,dest,height,notarizedheight,notarized_hash,notarized_desttxid) != 0 ) { if ( height > 50000 || ASSETCHAINS_SYMBOL[0] != 0 ) printf("[%s] error validating notarization ht.%d notarized_height.%d, if on a pruned %s node this can be ignored\n",ASSETCHAINS_SYMBOL,height,notarizedheight,dest); From 9caa00ee19efbfcd6626d63167cdcc228de7515a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 8 Apr 2018 13:48:29 +0300 Subject: [PATCH 0855/1062] Test --- src/fiat/bntn | 0 src/komodo_events.h | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) mode change 100644 => 100755 src/fiat/bntn diff --git a/src/fiat/bntn b/src/fiat/bntn old mode 100644 new mode 100755 diff --git a/src/komodo_events.h b/src/komodo_events.h index 7e9dfa2df..897f3b7bd 100644 --- a/src/komodo_events.h +++ b/src/komodo_events.h @@ -40,12 +40,12 @@ struct komodo_event *komodo_eventadd(struct komodo_state *sp,int32_t height,char void komodo_eventadd_notarized(struct komodo_state *sp,char *symbol,int32_t height,char *dest,uint256 notarized_hash,uint256 notarized_desttxid,int32_t notarizedheight,uint256 MoM,int32_t MoMdepth) { struct komodo_event_notarized N; - if ( 0 && komodo_verifynotarization(symbol,dest,height,notarizedheight,notarized_hash,notarized_desttxid) != 0 ) + /*if ( komodo_verifynotarization(symbol,dest,height,notarizedheight,notarized_hash,notarized_desttxid) != 0 ) { if ( height > 50000 || ASSETCHAINS_SYMBOL[0] != 0 ) printf("[%s] error validating notarization ht.%d notarized_height.%d, if on a pruned %s node this can be ignored\n",ASSETCHAINS_SYMBOL,height,notarizedheight,dest); } - else + else*/ { if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 ) fprintf(stderr,"validated [%s] ht.%d notarized %d\n",ASSETCHAINS_SYMBOL,height,notarizedheight); From 605e77944e7542ae3780cafe6cc89939fcf6c211 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 8 Apr 2018 14:04:11 +0300 Subject: [PATCH 0856/1062] Test --- src/komodo_events.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo_events.h b/src/komodo_events.h index 897f3b7bd..9b44cdd3e 100644 --- a/src/komodo_events.h +++ b/src/komodo_events.h @@ -40,12 +40,12 @@ struct komodo_event *komodo_eventadd(struct komodo_state *sp,int32_t height,char void komodo_eventadd_notarized(struct komodo_state *sp,char *symbol,int32_t height,char *dest,uint256 notarized_hash,uint256 notarized_desttxid,int32_t notarizedheight,uint256 MoM,int32_t MoMdepth) { struct komodo_event_notarized N; - /*if ( komodo_verifynotarization(symbol,dest,height,notarizedheight,notarized_hash,notarized_desttxid) != 0 ) + if ( NOTARY_PUBKEY33[0] == 0 || komodo_verifynotarization(symbol,dest,height,notarizedheight,notarized_hash,notarized_desttxid) != 0 ) { if ( height > 50000 || ASSETCHAINS_SYMBOL[0] != 0 ) printf("[%s] error validating notarization ht.%d notarized_height.%d, if on a pruned %s node this can be ignored\n",ASSETCHAINS_SYMBOL,height,notarizedheight,dest); } - else*/ + else { if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 ) fprintf(stderr,"validated [%s] ht.%d notarized %d\n",ASSETCHAINS_SYMBOL,height,notarizedheight); From 6a933d59d80282fed84a2545e757c7b87392d53e Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 8 Apr 2018 18:53:33 +0300 Subject: [PATCH 0857/1062] Test --- src/komodo.h | 23 ++++++++++++----------- src/komodo_events.h | 2 +- src/main.cpp | 2 +- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/komodo.h b/src/komodo.h index c387198f8..0ff04b529 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -508,7 +508,7 @@ void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotar int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scriptbuf,int32_t scriptlen,int32_t height,uint256 txhash,int32_t i,int32_t j,uint64_t *voutmaskp,int32_t *specialtxp,int32_t *notarizedheightp,uint64_t value,int32_t notarized,uint64_t signedmask,uint32_t timestamp) { static uint256 zero; static FILE *signedfp; - int32_t opretlen,nid,k,len = 0; uint256 kmdtxid,desttxid; uint8_t crypto777[33]; struct komodo_state *sp; char symbol[KOMODO_ASSETCHAIN_MAXLEN],dest[KOMODO_ASSETCHAIN_MAXLEN]; + int32_t opretlen,nid,k,len = 0; uint256 srchash,desttxid; uint8_t crypto777[33]; struct komodo_state *sp; char symbol[KOMODO_ASSETCHAIN_MAXLEN],dest[KOMODO_ASSETCHAIN_MAXLEN]; if ( (sp= komodo_stateptr(symbol,dest)) == 0 ) return(-1); if ( scriptlen == 35 && scriptbuf[0] == 33 && scriptbuf[34] == 0xac ) @@ -566,23 +566,24 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr printf("[%s] notarized.%d notarizedht.%d sp.Nht %d sp.ht %d opretlen.%d (%c %c %c)\n",ASSETCHAINS_SYMBOL,notarized,*notarizedheightp,sp->NOTARIZED_HEIGHT,sp->CURRENT_HEIGHT,opretlen,scriptbuf[len+32*2+4],scriptbuf[len+32*2+4+1],scriptbuf[len+32*2+4+2]); if ( j == 1 && opretlen >= 32*2+4 && strcmp(ASSETCHAINS_SYMBOL[0]==0?"KMD":ASSETCHAINS_SYMBOL,(char *)&scriptbuf[len+32*2+4]) == 0 ) { - len += iguana_rwbignum(0,&scriptbuf[len],32,(uint8_t *)&kmdtxid); + len += iguana_rwbignum(0,&scriptbuf[len],32,(uint8_t *)&srchash); len += iguana_rwnum(0,&scriptbuf[len],sizeof(*notarizedheightp),(uint8_t *)notarizedheightp); len += iguana_rwbignum(0,&scriptbuf[len],32,(uint8_t *)&desttxid); if ( strcmp("PIZZA",ASSETCHAINS_SYMBOL) == 0 && opretlen == 110 ) { notarized = 1; } - int32_t validated = 1; - /*if ( ASSETCHAINS_SYMBOL[0] != 0 ) - validated = 1; - else if ( height < sp->CURRENT_HEIGHT-64 || komodo_verifynotarization((char *)"KMD",(char *)"BTC",height,*notarizedheightp,kmdtxid,desttxid) == 0 ) - validated = 1;*/ + int32_t validated = 0; + CBlockIndex *pindex; + if ( (pindex= mapBlockIndex[srchash]) == 0 || pindex->nHeight != *notarizedheightp ) + { + fprintf(stderr,"FORK detected. notarized.%d %s no in this chain! REWIND to %d\n",*notarizedheightp,srchash.ToString().c_str(),sp->NOTARIZED_HEIGHT); + } else validated = 1; if ( notarized != 0 && *notarizedheightp > sp->NOTARIZED_HEIGHT && *notarizedheightp < height && validated != 0 ) { int32_t nameoffset = (int32_t)strlen(ASSETCHAINS_SYMBOL) + 1; sp->NOTARIZED_HEIGHT = *notarizedheightp; - sp->NOTARIZED_HASH = kmdtxid; + sp->NOTARIZED_HASH = srchash; sp->NOTARIZED_DESTTXID = desttxid; memset(&sp->MoM,0,sizeof(sp->MoM)); sp->MoMdepth = 0; @@ -603,7 +604,7 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr komodo_stateupdate(height,0,0,0,zero,0,0,0,0,0,0,0,0,0,0,sp->MoM,sp->MoMdepth); len += nameoffset; if ( ASSETCHAINS_SYMBOL[0] != 0 ) - printf("[%s] ht.%d NOTARIZED.%d %s.%s %sTXID.%s lens.(%d %d) MoM.%s %d\n",ASSETCHAINS_SYMBOL,height,*notarizedheightp,ASSETCHAINS_SYMBOL[0]==0?"KMD":ASSETCHAINS_SYMBOL,kmdtxid.ToString().c_str(),ASSETCHAINS_SYMBOL[0]==0?"BTC":"KMD",desttxid.ToString().c_str(),opretlen,len,sp->MoM.ToString().c_str(),sp->MoMdepth); + printf("[%s] ht.%d NOTARIZED.%d %s.%s %sTXID.%s lens.(%d %d) MoM.%s %d\n",ASSETCHAINS_SYMBOL,height,*notarizedheightp,ASSETCHAINS_SYMBOL[0]==0?"KMD":ASSETCHAINS_SYMBOL,srchash.ToString().c_str(),ASSETCHAINS_SYMBOL[0]==0?"BTC":"KMD",desttxid.ToString().c_str(),opretlen,len,sp->MoM.ToString().c_str(),sp->MoMdepth); if ( ASSETCHAINS_SYMBOL[0] == 0 ) { if ( signedfp == 0 ) @@ -629,7 +630,7 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr } } } else //if ( height >= sp->CURRENT_HEIGHT-64 )//KOMODO_MAINNET_START ) - printf("validated.%d notarized.%d %llx reject ht.%d NOTARIZED.%d prev.%d %s.%s DESTTXID.%s (%s) len.%d opretlen.%d\n",validated,notarized,(long long)signedmask,height,*notarizedheightp,sp->NOTARIZED_HEIGHT,ASSETCHAINS_SYMBOL[0]==0?"KMD":ASSETCHAINS_SYMBOL,kmdtxid.ToString().c_str(),desttxid.ToString().c_str(),(char *)&scriptbuf[len],len,opretlen); + printf("validated.%d notarized.%d %llx reject ht.%d NOTARIZED.%d prev.%d %s.%s DESTTXID.%s (%s) len.%d opretlen.%d\n",validated,notarized,(long long)signedmask,height,*notarizedheightp,sp->NOTARIZED_HEIGHT,ASSETCHAINS_SYMBOL[0]==0?"KMD":ASSETCHAINS_SYMBOL,srchash.ToString().c_str(),desttxid.ToString().c_str(),(char *)&scriptbuf[len],len,opretlen); } else if ( i == 0 && j == 1 && opretlen == 149 ) { @@ -693,7 +694,7 @@ void komodo_connectblock(CBlockIndex *pindex,CBlock& block) { static int32_t hwmheight; uint64_t signedmask,voutmask; char symbol[KOMODO_ASSETCHAIN_MAXLEN],dest[KOMODO_ASSETCHAIN_MAXLEN]; struct komodo_state *sp; - uint8_t scriptbuf[10001],pubkeys[64][33],rmd160[20],scriptPubKey[35]; uint256 kmdtxid,zero,btctxid,txhash; + uint8_t scriptbuf[10001],pubkeys[64][33],rmd160[20],scriptPubKey[35]; uint256 zero,btctxid,txhash; int32_t i,j,k,numnotaries,notarized,scriptlen,isratification,nid,numvalid,specialtx,notarizedheight,notaryid,len,numvouts,numvins,height,txn_count; memset(&zero,0,sizeof(zero)); komodo_init(pindex->nHeight); diff --git a/src/komodo_events.h b/src/komodo_events.h index 9b44cdd3e..4d9ff87dc 100644 --- a/src/komodo_events.h +++ b/src/komodo_events.h @@ -40,7 +40,7 @@ struct komodo_event *komodo_eventadd(struct komodo_state *sp,int32_t height,char void komodo_eventadd_notarized(struct komodo_state *sp,char *symbol,int32_t height,char *dest,uint256 notarized_hash,uint256 notarized_desttxid,int32_t notarizedheight,uint256 MoM,int32_t MoMdepth) { struct komodo_event_notarized N; - if ( NOTARY_PUBKEY33[0] == 0 || komodo_verifynotarization(symbol,dest,height,notarizedheight,notarized_hash,notarized_desttxid) != 0 ) + if ( NOTARY_PUBKEY33[0] != 0 && komodo_verifynotarization(symbol,dest,height,notarizedheight,notarized_hash,notarized_desttxid) != 0 ) { if ( height > 50000 || ASSETCHAINS_SYMBOL[0] != 0 ) printf("[%s] error validating notarization ht.%d notarized_height.%d, if on a pruned %s node this can be ignored\n",ASSETCHAINS_SYMBOL,height,notarizedheight,dest); diff --git a/src/main.cpp b/src/main.cpp index 929589df9..4bfa9f122 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3089,7 +3089,7 @@ static bool ActivateBestChainStep(CValidationState &state, CBlockIndex *pindexMo } } fprintf(stderr,"reached rewind.%d, best to do: ./komodo-cli stop\n",KOMODO_REWIND); - sleep(60); + sleep(300); KOMODO_REWIND = 0; return(true); } From dbbdf7de87a1e5d1a9e7a3c76df9d0e0f317300a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 8 Apr 2018 18:57:56 +0300 Subject: [PATCH 0858/1062] Test --- src/komodo.h | 2 ++ src/main.cpp | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/komodo.h b/src/komodo.h index 0ff04b529..c9ee4142c 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -578,6 +578,8 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr if ( (pindex= mapBlockIndex[srchash]) == 0 || pindex->nHeight != *notarizedheightp ) { fprintf(stderr,"FORK detected. notarized.%d %s no in this chain! REWIND to %d\n",*notarizedheightp,srchash.ToString().c_str(),sp->NOTARIZED_HEIGHT); + if ( sp->NOTARIZED_HEIGHT > 0 ) + KOMODO_REWIND = sp->NOTARIZED_HEIGHT - 1; } else validated = 1; if ( notarized != 0 && *notarizedheightp > sp->NOTARIZED_HEIGHT && *notarizedheightp < height && validated != 0 ) { diff --git a/src/main.cpp b/src/main.cpp index 4bfa9f122..4482cf4c6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3079,9 +3079,10 @@ static bool ActivateBestChainStep(CValidationState &state, CBlockIndex *pindexMo } if ( KOMODO_REWIND != 0 ) { - fprintf(stderr,"rewind start ht.%d\n",chainActive.Tip()->nHeight); + fprintf(stderr,">>>>>>>>>>> rewind start ht.%d\n",chainActive.Tip()->nHeight); while ( KOMODO_REWIND > 0 && chainActive.Tip()->nHeight > KOMODO_REWIND ) { + fprintf(stderr,"%d ",(int32_t)chainActive.Tip()->nHeight); if ( !DisconnectTip(state) ) { InvalidateBlock(state,chainActive.Tip()); @@ -3089,7 +3090,7 @@ static bool ActivateBestChainStep(CValidationState &state, CBlockIndex *pindexMo } } fprintf(stderr,"reached rewind.%d, best to do: ./komodo-cli stop\n",KOMODO_REWIND); - sleep(300); + sleep(60); KOMODO_REWIND = 0; return(true); } From 91165f19e604d537712061b81aade2b742485bfc Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 8 Apr 2018 19:01:04 +0300 Subject: [PATCH 0859/1062] Test --- src/main.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 4482cf4c6..9b736d3dd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3079,7 +3079,7 @@ static bool ActivateBestChainStep(CValidationState &state, CBlockIndex *pindexMo } if ( KOMODO_REWIND != 0 ) { - fprintf(stderr,">>>>>>>>>>> rewind start ht.%d\n",chainActive.Tip()->nHeight); + fprintf(stderr,">>>>>>>>>>> rewind start ht.%d -> KOMODO_REWIND.%d\n",chainActive.Tip()->nHeight,KOMODO_REWIND); while ( KOMODO_REWIND > 0 && chainActive.Tip()->nHeight > KOMODO_REWIND ) { fprintf(stderr,"%d ",(int32_t)chainActive.Tip()->nHeight); @@ -3091,6 +3091,7 @@ static bool ActivateBestChainStep(CValidationState &state, CBlockIndex *pindexMo } fprintf(stderr,"reached rewind.%d, best to do: ./komodo-cli stop\n",KOMODO_REWIND); sleep(60); + fprintf(stderr,"resuming normal operations\n"); KOMODO_REWIND = 0; return(true); } From c5803d26ecb02d8a27b17c1dbe531af54b3896f7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 8 Apr 2018 19:11:10 +0300 Subject: [PATCH 0860/1062] Rewind to min ht --- src/komodo.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/komodo.h b/src/komodo.h index c9ee4142c..2d510acae 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -578,8 +578,10 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr if ( (pindex= mapBlockIndex[srchash]) == 0 || pindex->nHeight != *notarizedheightp ) { fprintf(stderr,"FORK detected. notarized.%d %s no in this chain! REWIND to %d\n",*notarizedheightp,srchash.ToString().c_str(),sp->NOTARIZED_HEIGHT); - if ( sp->NOTARIZED_HEIGHT > 0 ) + if ( sp->NOTARIZED_HEIGHT > 0 && sp->NOTARIZED_HEIGHT < *notarized_heightp ) KOMODO_REWIND = sp->NOTARIZED_HEIGHT - 1; + else if ( *notarized_heightp > 101 ) + KOMODO_REWIND = *notarized_heightp - 101; } else validated = 1; if ( notarized != 0 && *notarizedheightp > sp->NOTARIZED_HEIGHT && *notarizedheightp < height && validated != 0 ) { From 986ec226cd7f1df14313a0afdb1795a5243229e4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 8 Apr 2018 19:22:47 +0300 Subject: [PATCH 0861/1062] Print --- src/komodo.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo.h b/src/komodo.h index 2d510acae..efded0840 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -577,7 +577,7 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr CBlockIndex *pindex; if ( (pindex= mapBlockIndex[srchash]) == 0 || pindex->nHeight != *notarizedheightp ) { - fprintf(stderr,"FORK detected. notarized.%d %s no in this chain! REWIND to %d\n",*notarizedheightp,srchash.ToString().c_str(),sp->NOTARIZED_HEIGHT); + fprintf(stderr,"FORK detected. notarized.%d %s not in this chain! REWIND to %d\n",*notarizedheightp,srchash.ToString().c_str(),sp->NOTARIZED_HEIGHT); if ( sp->NOTARIZED_HEIGHT > 0 && sp->NOTARIZED_HEIGHT < *notarized_heightp ) KOMODO_REWIND = sp->NOTARIZED_HEIGHT - 1; else if ( *notarized_heightp > 101 ) From 6c93ad75b277bd504a027917ba59038a63a9feb9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 8 Apr 2018 19:40:37 +0300 Subject: [PATCH 0862/1062] Test --- src/komodo.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo.h b/src/komodo.h index efded0840..985e28a21 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -578,7 +578,7 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr if ( (pindex= mapBlockIndex[srchash]) == 0 || pindex->nHeight != *notarizedheightp ) { fprintf(stderr,"FORK detected. notarized.%d %s not in this chain! REWIND to %d\n",*notarizedheightp,srchash.ToString().c_str(),sp->NOTARIZED_HEIGHT); - if ( sp->NOTARIZED_HEIGHT > 0 && sp->NOTARIZED_HEIGHT < *notarized_heightp ) + if ( sp->NOTARIZED_HEIGHT > 0 && sp->NOTARIZED_HEIGHT < *notarizedheightp ) KOMODO_REWIND = sp->NOTARIZED_HEIGHT - 1; else if ( *notarized_heightp > 101 ) KOMODO_REWIND = *notarized_heightp - 101; From 83de8f955e0cdbc6aadb0805497a37dd72db43e3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 8 Apr 2018 19:41:18 +0300 Subject: [PATCH 0863/1062] Test --- src/komodo.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo.h b/src/komodo.h index 985e28a21..092c572ac 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -580,7 +580,7 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr fprintf(stderr,"FORK detected. notarized.%d %s not in this chain! REWIND to %d\n",*notarizedheightp,srchash.ToString().c_str(),sp->NOTARIZED_HEIGHT); if ( sp->NOTARIZED_HEIGHT > 0 && sp->NOTARIZED_HEIGHT < *notarizedheightp ) KOMODO_REWIND = sp->NOTARIZED_HEIGHT - 1; - else if ( *notarized_heightp > 101 ) + else if ( *notarizedheightp > 101 ) KOMODO_REWIND = *notarized_heightp - 101; } else validated = 1; if ( notarized != 0 && *notarizedheightp > sp->NOTARIZED_HEIGHT && *notarizedheightp < height && validated != 0 ) From 34dd6cc4fdd7d0398e49fce65b3ca9df2762796d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 8 Apr 2018 19:41:51 +0300 Subject: [PATCH 0864/1062] Test --- src/komodo.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo.h b/src/komodo.h index 092c572ac..99bd008d8 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -581,7 +581,7 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr if ( sp->NOTARIZED_HEIGHT > 0 && sp->NOTARIZED_HEIGHT < *notarizedheightp ) KOMODO_REWIND = sp->NOTARIZED_HEIGHT - 1; else if ( *notarizedheightp > 101 ) - KOMODO_REWIND = *notarized_heightp - 101; + KOMODO_REWIND = *notarizedheightp - 101; } else validated = 1; if ( notarized != 0 && *notarizedheightp > sp->NOTARIZED_HEIGHT && *notarizedheightp < height && validated != 0 ) { From 935e05222a7e5d3dab01cb58de6d365343450c0d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 8 Apr 2018 19:48:35 +0300 Subject: [PATCH 0865/1062] Test --- src/komodo.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo.h b/src/komodo.h index 99bd008d8..2979a49b1 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -575,7 +575,7 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr } int32_t validated = 0; CBlockIndex *pindex; - if ( (pindex= mapBlockIndex[srchash]) == 0 || pindex->nHeight != *notarizedheightp ) + if ( IsInitialBlockDownload() == 0 && (pindex= mapBlockIndex[srchash]) == 0 || pindex->nHeight != *notarizedheightp ) { fprintf(stderr,"FORK detected. notarized.%d %s not in this chain! REWIND to %d\n",*notarizedheightp,srchash.ToString().c_str(),sp->NOTARIZED_HEIGHT); if ( sp->NOTARIZED_HEIGHT > 0 && sp->NOTARIZED_HEIGHT < *notarizedheightp ) From fd836de79b15c53064e543073e92049525c3399f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 8 Apr 2018 19:59:29 +0300 Subject: [PATCH 0866/1062] Test --- src/komodo.h | 4 ++-- src/main.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/komodo.h b/src/komodo.h index 2979a49b1..8f24032d7 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -578,10 +578,10 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr if ( IsInitialBlockDownload() == 0 && (pindex= mapBlockIndex[srchash]) == 0 || pindex->nHeight != *notarizedheightp ) { fprintf(stderr,"FORK detected. notarized.%d %s not in this chain! REWIND to %d\n",*notarizedheightp,srchash.ToString().c_str(),sp->NOTARIZED_HEIGHT); - if ( sp->NOTARIZED_HEIGHT > 0 && sp->NOTARIZED_HEIGHT < *notarizedheightp ) + /*if ( sp->NOTARIZED_HEIGHT > 0 && sp->NOTARIZED_HEIGHT < *notarizedheightp ) KOMODO_REWIND = sp->NOTARIZED_HEIGHT - 1; else if ( *notarizedheightp > 101 ) - KOMODO_REWIND = *notarizedheightp - 101; + KOMODO_REWIND = *notarizedheightp - 101;*/ } else validated = 1; if ( notarized != 0 && *notarizedheightp > sp->NOTARIZED_HEIGHT && *notarizedheightp < height && validated != 0 ) { diff --git a/src/main.cpp b/src/main.cpp index 9b736d3dd..f69adbd50 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3089,7 +3089,7 @@ static bool ActivateBestChainStep(CValidationState &state, CBlockIndex *pindexMo break; } } - fprintf(stderr,"reached rewind.%d, best to do: ./komodo-cli stop\n",KOMODO_REWIND); + fprintf(stderr,"reached rewind.%d, best to do: ./komodo-cli -ac_name=%s stop\n",KOMODO_REWIND,ASSETCHAINS_SYMBOL); sleep(60); fprintf(stderr,"resuming normal operations\n"); KOMODO_REWIND = 0; From f4e0076aa0914ab6c83ca5ea1f7a6cd8be55aec9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 8 Apr 2018 20:07:56 +0300 Subject: [PATCH 0867/1062] Test --- src/komodo.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/komodo.h b/src/komodo.h index 8f24032d7..95b4a8478 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -575,13 +575,13 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr } int32_t validated = 0; CBlockIndex *pindex; - if ( IsInitialBlockDownload() == 0 && (pindex= mapBlockIndex[srchash]) == 0 || pindex->nHeight != *notarizedheightp ) + if ( IsInitialBlockDownload() == 0 && ((pindex= mapBlockIndex[srchash]) == 0 || pindex->nHeight != *notarizedheightp) ) { fprintf(stderr,"FORK detected. notarized.%d %s not in this chain! REWIND to %d\n",*notarizedheightp,srchash.ToString().c_str(),sp->NOTARIZED_HEIGHT); - /*if ( sp->NOTARIZED_HEIGHT > 0 && sp->NOTARIZED_HEIGHT < *notarizedheightp ) + if ( sp->NOTARIZED_HEIGHT > 0 && sp->NOTARIZED_HEIGHT < *notarizedheightp ) KOMODO_REWIND = sp->NOTARIZED_HEIGHT - 1; else if ( *notarizedheightp > 101 ) - KOMODO_REWIND = *notarizedheightp - 101;*/ + KOMODO_REWIND = *notarizedheightp - 101; } else validated = 1; if ( notarized != 0 && *notarizedheightp > sp->NOTARIZED_HEIGHT && *notarizedheightp < height && validated != 0 ) { From 11ed15a670c46c87bbd6eb3710b80b6be4388898 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 8 Apr 2018 21:34:49 +0300 Subject: [PATCH 0868/1062] Test --- src/komodo.h | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/komodo.h b/src/komodo.h index 95b4a8478..d0e1075be 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -577,11 +577,18 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr CBlockIndex *pindex; if ( IsInitialBlockDownload() == 0 && ((pindex= mapBlockIndex[srchash]) == 0 || pindex->nHeight != *notarizedheightp) ) { - fprintf(stderr,"FORK detected. notarized.%d %s not in this chain! REWIND to %d\n",*notarizedheightp,srchash.ToString().c_str(),sp->NOTARIZED_HEIGHT); + static int32_t last_rewind; int32_t rewindtarget; if ( sp->NOTARIZED_HEIGHT > 0 && sp->NOTARIZED_HEIGHT < *notarizedheightp ) - KOMODO_REWIND = sp->NOTARIZED_HEIGHT - 1; + rewindtarget = sp->NOTARIZED_HEIGHT - 1; else if ( *notarizedheightp > 101 ) - KOMODO_REWIND = *notarizedheightp - 101; + rewindtarget = *notarizedheightp - 101; + else rewindtarget = 0; + if ( rewindtarget != 0 && rewindtarget > KOMODO_REWIND && rewindtarget > last_rewind ) + { + last_rewind = rewindtarget; + KOMODO_REWIND = rewindtarget; + fprintf(stderr,"FORK detected. notarized.%d %s not in this chain! last notarization %d -> rewindtarget.%d\n",*notarizedheightp,srchash.ToString().c_str(),sp->NOTARIZED_HEIGHT,rewindtarget); + } } else validated = 1; if ( notarized != 0 && *notarizedheightp > sp->NOTARIZED_HEIGHT && *notarizedheightp < height && validated != 0 ) { From 8d787d2580a72813ab6d8fdef38e6ee35aee277b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 8 Apr 2018 21:55:19 +0300 Subject: [PATCH 0869/1062] Test --- src/komodo.h | 2 +- src/main.cpp | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/komodo.h b/src/komodo.h index d0e1075be..95691f33d 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -640,7 +640,7 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr komodo_stateupdate(height,0,0,0,txhash,0,0,0,0,0,0,value,&scriptbuf[len],opretlen-len+4+3+(scriptbuf[1] == 0x4d),j,zero,0); } } - } else //if ( height >= sp->CURRENT_HEIGHT-64 )//KOMODO_MAINNET_START ) + } else if ( *notarizedheightp != sp->NOTARIZED_HEIGHT ) printf("validated.%d notarized.%d %llx reject ht.%d NOTARIZED.%d prev.%d %s.%s DESTTXID.%s (%s) len.%d opretlen.%d\n",validated,notarized,(long long)signedmask,height,*notarizedheightp,sp->NOTARIZED_HEIGHT,ASSETCHAINS_SYMBOL[0]==0?"KMD":ASSETCHAINS_SYMBOL,srchash.ToString().c_str(),desttxid.ToString().c_str(),(char *)&scriptbuf[len],len,opretlen); } else if ( i == 0 && j == 1 && opretlen == 149 ) diff --git a/src/main.cpp b/src/main.cpp index f69adbd50..6f4dd89fa 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3610,8 +3610,14 @@ bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& sta { // Check that the block chain matches the known block chain up to a checkpoint if (!Checkpoints::CheckBlock(chainParams.Checkpoints(), nHeight, hash)) - return state.DoS(100, error("%s: rejected by checkpoint lock-in at %d", __func__, nHeight),REJECT_CHECKPOINT, "checkpoint mismatch"); - + { + CBlockIndex *heightblock = chainActive[nHeight]; + if ( heightblock != 0 && heightblock->GetBlockHash() == hash ) + { + //fprintf(stderr,"got a pre notarization block that matches height.%d\n",(int32_t)nHeight); + return true; + } return state.DoS(100, error("%s: rejected by checkpoint lock-in at %d", __func__, nHeight),REJECT_CHECKPOINT, "checkpoint mismatch"); + } // Don't accept any forks from the main chain prior to last checkpoint CBlockIndex* pcheckpoint = Checkpoints::GetLastCheckpoint(chainParams.Checkpoints()); int32_t notarized_height; From 576f0b157f0350631b68fe1a9163b21a76d6066f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 8 Apr 2018 21:56:37 +0300 Subject: [PATCH 0870/1062] Test --- src/komodo.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo.h b/src/komodo.h index 95691f33d..dbad75aa7 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -574,8 +574,8 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr notarized = 1; } int32_t validated = 0; - CBlockIndex *pindex; - if ( IsInitialBlockDownload() == 0 && ((pindex= mapBlockIndex[srchash]) == 0 || pindex->nHeight != *notarizedheightp) ) + CBlockIndex *pindex;//IsInitialBlockDownload() == 0 && + if ( ((pindex= mapBlockIndex[srchash]) == 0 || pindex->nHeight != *notarizedheightp) ) { static int32_t last_rewind; int32_t rewindtarget; if ( sp->NOTARIZED_HEIGHT > 0 && sp->NOTARIZED_HEIGHT < *notarizedheightp ) From 899aa3878532f56a6e3f8ff33cc5a3743ca5358a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 8 Apr 2018 22:06:26 +0300 Subject: [PATCH 0871/1062] Test --- src/komodo.h | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/komodo.h b/src/komodo.h index dbad75aa7..aa358ab4e 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -573,11 +573,11 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr { notarized = 1; } - int32_t validated = 0; + static int32_t last_rewind; + int32_t rewindtarget,validated = 0; CBlockIndex *pindex;//IsInitialBlockDownload() == 0 && if ( ((pindex= mapBlockIndex[srchash]) == 0 || pindex->nHeight != *notarizedheightp) ) { - static int32_t last_rewind; int32_t rewindtarget; if ( sp->NOTARIZED_HEIGHT > 0 && sp->NOTARIZED_HEIGHT < *notarizedheightp ) rewindtarget = sp->NOTARIZED_HEIGHT - 1; else if ( *notarizedheightp > 101 ) @@ -585,11 +585,19 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr else rewindtarget = 0; if ( rewindtarget != 0 && rewindtarget > KOMODO_REWIND && rewindtarget > last_rewind ) { + if ( last_rewind != 0 ) + { + KOMODO_REWIND = rewindtarget; + fprintf(stderr,"%s FORK detected. notarized.%d %s not in this chain! last notarization %d -> rewindtarget.%d\n",ASSETCHAINS_SYMBOL,*notarizedheightp,srchash.ToString().c_str(),sp->NOTARIZED_HEIGHT,rewindtarget); + } last_rewind = rewindtarget; - KOMODO_REWIND = rewindtarget; - fprintf(stderr,"FORK detected. notarized.%d %s not in this chain! last notarization %d -> rewindtarget.%d\n",*notarizedheightp,srchash.ToString().c_str(),sp->NOTARIZED_HEIGHT,rewindtarget); } - } else validated = 1; + } + else + { + last_rewind = 0; + validated = 1; + } if ( notarized != 0 && *notarizedheightp > sp->NOTARIZED_HEIGHT && *notarizedheightp < height && validated != 0 ) { int32_t nameoffset = (int32_t)strlen(ASSETCHAINS_SYMBOL) + 1; From 79d54107a1caa69dfb6ceefb322664b3b7f685d9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 8 Apr 2018 22:12:14 +0300 Subject: [PATCH 0872/1062] Test --- src/komodo.h | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/komodo.h b/src/komodo.h index aa358ab4e..6a27ffb62 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -592,12 +592,7 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr } last_rewind = rewindtarget; } - } - else - { - last_rewind = 0; - validated = 1; - } + } else validated = 1; if ( notarized != 0 && *notarizedheightp > sp->NOTARIZED_HEIGHT && *notarizedheightp < height && validated != 0 ) { int32_t nameoffset = (int32_t)strlen(ASSETCHAINS_SYMBOL) + 1; From 6a11ba537be4dc6464b38d9a9e75e24de9a00f5b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 8 Apr 2018 22:25:29 +0300 Subject: [PATCH 0873/1062] Test --- src/komodo.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo.h b/src/komodo.h index 6a27ffb62..32fcce047 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -575,8 +575,8 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr } static int32_t last_rewind; int32_t rewindtarget,validated = 0; - CBlockIndex *pindex;//IsInitialBlockDownload() == 0 && - if ( ((pindex= mapBlockIndex[srchash]) == 0 || pindex->nHeight != *notarizedheightp) ) + CBlockIndex *pindex;// + if ( IsInitialBlockDownload() == 0 && ((pindex= mapBlockIndex[srchash]) == 0 || pindex->nHeight != *notarizedheightp) ) { if ( sp->NOTARIZED_HEIGHT > 0 && sp->NOTARIZED_HEIGHT < *notarizedheightp ) rewindtarget = sp->NOTARIZED_HEIGHT - 1; From 21965c3f7af9b75e340d804ef9cbeb665fae62e7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 14:26:07 +0300 Subject: [PATCH 0874/1062] Test --- src/wallet/rpcwallet.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 09b403f7f..c350e0e28 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -2695,7 +2695,7 @@ int32_t decode_hex(uint8_t *bytes,int32_t n,char *hex); int32_t komodo_staked(uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig) { - set setAddress; int32_t nMinDepth = 1,nMaxDepth = 9999999; vector vecOutputs; + set setAddress; int32_t i,siglen=0,nMinDepth = 1,nMaxDepth = 9999999; vector vecOutputs; assert(pwalletMain != NULL); LOCK2(cs_main, pwalletMain->cs_wallet); *utxovaluep = 0; @@ -2754,8 +2754,21 @@ int32_t komodo_staked(uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,ui } fprintf(stderr,"(%s) %s/v%d nValue %.8f locktime.%u txheight.%d pindexht.%d\n",CBitcoinAddress(address).ToString().c_str(),out.tx->GetHash().GetHex().c_str(),out.i,(double)nValue/COIN,locktime,txheight,pindex->nHeight); } + bool signSuccess; SignatureData sigdata; uint8_t *ptr; + auto consensusBranchId = CurrentEpochBranchId(chainActive.Height() + 1, Params().GetConsensus()); + CTransaction txNewConst(txNew); + signSuccess = ProduceSignature(TransactionSignatureCreator(this, &txNewConst, 0, nValue, SIGHASH_ALL), out.tx->vout[out.i].scriptPubKey, sigdata, consensusBranchId); + if (!signSuccess) + fprintf(stderr,"failed to create signature\n"); + else + { + ptr = (uint8_t *)sigdata.data(); + siglen = sigdata.size(); + for (i=0; i Date: Mon, 9 Apr 2018 14:35:50 +0300 Subject: [PATCH 0875/1062] Test --- src/wallet/rpcwallet.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index c350e0e28..ef0088330 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -2691,6 +2691,7 @@ UniValue listunspent(const UniValue& params, bool fHelp) return results; } +#include "script/sign.h" int32_t decode_hex(uint8_t *bytes,int32_t n,char *hex); int32_t komodo_staked(uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig) @@ -2754,8 +2755,18 @@ int32_t komodo_staked(uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,ui } fprintf(stderr,"(%s) %s/v%d nValue %.8f locktime.%u txheight.%d pindexht.%d\n",CBitcoinAddress(address).ToString().c_str(),out.tx->GetHash().GetHex().c_str(),out.i,(double)nValue/COIN,locktime,txheight,pindex->nHeight); } - bool signSuccess; SignatureData sigdata; uint8_t *ptr; + bool signSuccess; SignatureData sigdata; uint8_t *ptr; uint256 revtxid,utxotxid; auto consensusBranchId = CurrentEpochBranchId(chainActive.Height() + 1, Params().GetConsensus()); + CMutableTransaction txNew = CreateNewContextualCMutableTransaction(Params().GetConsensus(), chainActive.Height() + 1); + txNew.vin.resize(1); + txNew.vout.resize(1); + for (i=0; i<32; i++) + ((uint8_t *)&revtxid)[i] = ((uint8_t *)utxotxidp)[31 - i]; + txNew.vin[0].prevout.hash = revtxid; + txNew.vin[0].prevout.n = *utxovoutp; + txNew.vout[0].scriptPubKey = CScript() << ParseHex(NOTARY_PUBKEY) << OP_CHECKSIG; + txNew.vout[0].nValue = nValue - txfees; + txNew.nLockTime = (uint32_t)chainActive.Tip()->nTime + chainparams.GetConsensus().nPowTargetSpacing; // set to a time close to now CTransaction txNewConst(txNew); signSuccess = ProduceSignature(TransactionSignatureCreator(this, &txNewConst, 0, nValue, SIGHASH_ALL), out.tx->vout[out.i].scriptPubKey, sigdata, consensusBranchId); if (!signSuccess) From 969322e04240990be02ddabf710fd516bd56de19 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 14:36:59 +0300 Subject: [PATCH 0876/1062] Test --- src/wallet/rpcwallet.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index ef0088330..c9e9d0009 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -2776,7 +2776,8 @@ int32_t komodo_staked(uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,ui ptr = (uint8_t *)sigdata.data(); siglen = sigdata.size(); for (i=0; i Date: Mon, 9 Apr 2018 14:37:43 +0300 Subject: [PATCH 0877/1062] Test --- src/wallet/rpcwallet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index c9e9d0009..085d39fd0 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -2773,7 +2773,7 @@ int32_t komodo_staked(uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,ui fprintf(stderr,"failed to create signature\n"); else { - ptr = (uint8_t *)sigdata.data(); + ptr = (uint8_t *)sigdata.scriptSig.data(); siglen = sigdata.size(); for (i=0; i Date: Mon, 9 Apr 2018 14:42:07 +0300 Subject: [PATCH 0878/1062] Test --- src/miner.cpp | 2 +- src/wallet/rpcwallet.cpp | 188 ++++++++++++++++++++------------------- 2 files changed, 97 insertions(+), 93 deletions(-) diff --git a/src/miner.cpp b/src/miner.cpp index 6f59771bf..bba4e62d3 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -405,7 +405,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) txStaked.vout[0].scriptPubKey = CScript() << ParseHex(NOTARY_PUBKEY) << OP_CHECKSIG; txStaked.vout[0].nValue = utxovalue - txfees; fprintf(stderr,"utxovout.%d txtime.%u %.8f\n",utxovout,txtime,(double)utxovalue/COIN); - txStaked.nLockTime = chainActive.Tip()->nTime + chainparams.GetConsensus().nPowTargetSpacing; + txStaked.nLockTime = chainActive.Tip()->nTime + 60; pblock->vtx.push_back(txStaked); numsigs = GetLegacySigOpCount(txStaked); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 085d39fd0..68b280651 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -2691,98 +2691,6 @@ UniValue listunspent(const UniValue& params, bool fHelp) return results; } -#include "script/sign.h" -int32_t decode_hex(uint8_t *bytes,int32_t n,char *hex); - -int32_t komodo_staked(uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig) -{ - set setAddress; int32_t i,siglen=0,nMinDepth = 1,nMaxDepth = 9999999; vector vecOutputs; - assert(pwalletMain != NULL); - LOCK2(cs_main, pwalletMain->cs_wallet); - *utxovaluep = 0; - memset(utxotxidp,0,sizeof(*utxotxidp)); - memset(utxovoutp,0,sizeof(*utxovoutp)); - memset(utxosig,0,72); - pwalletMain->AvailableCoins(vecOutputs, false, NULL, true); - BOOST_FOREACH(const COutput& out, vecOutputs) - { - if ( out.nDepth < nMinDepth || out.nDepth > nMaxDepth ) - continue; - if ( setAddress.size() ) - { - CTxDestination address; - if (!ExtractDestination(out.tx->vout[out.i].scriptPubKey, address)) - continue; - if (!setAddress.count(address)) - continue; - } - CAmount nValue = out.tx->vout[out.i].nValue; - const CScript& pk = out.tx->vout[out.i].scriptPubKey; - //entry.push_back(Pair("generated", out.tx->IsCoinBase())); - *utxovaluep = (uint64_t)nValue; - decode_hex((uint8_t *)utxotxidp,32,(char *)out.tx->GetHash().GetHex().c_str()); - *utxovoutp = out.i; - *txtimep = (uint32_t)out.tx->nLockTime; - CTxDestination address; - if (ExtractDestination(out.tx->vout[out.i].scriptPubKey, address)) - { - //entry.push_back(Pair("address", CBitcoinAddress(address).ToString())); - //if (pwalletMain->mapAddressBook.count(address)) - // entry.push_back(Pair("account", pwalletMain->mapAddressBook[address].name)); - } - /*entry.push_back(Pair("scriptPubKey", HexStr(pk.begin(), pk.end()))); - if (pk.IsPayToScriptHash()) - { - CTxDestination address; - if (ExtractDestination(pk, address)) { - const CScriptID& hash = boost::get(address); - CScript redeemScript; - if (pwalletMain->GetCScript(hash, redeemScript)) - entry.push_back(Pair("redeemScript", HexStr(redeemScript.begin(), redeemScript.end()))); - } - } - entry.push_back(Pair("amount",ValueFromAmount(nValue)));*/ - if ( out.tx->nLockTime != 0 ) - { - BlockMap::iterator it = mapBlockIndex.find(pcoinsTip->GetBestBlock()); - CBlockIndex *tipindex,*pindex = it->second; - uint64_t interest; uint32_t locktime; int32_t txheight; - if ( pindex != 0 && (tipindex= chainActive.Tip()) != 0 ) - { - komodo_accrued_interest(&txheight,&locktime,out.tx->GetHash(),out.i,0,nValue,(int32_t)tipindex->nHeight); - interest = komodo_interest(txheight,nValue,out.tx->nLockTime,tipindex->nTime); - //entry.push_back(Pair("interest",ValueFromAmount(interest))); - } - fprintf(stderr,"(%s) %s/v%d nValue %.8f locktime.%u txheight.%d pindexht.%d\n",CBitcoinAddress(address).ToString().c_str(),out.tx->GetHash().GetHex().c_str(),out.i,(double)nValue/COIN,locktime,txheight,pindex->nHeight); - } - bool signSuccess; SignatureData sigdata; uint8_t *ptr; uint256 revtxid,utxotxid; - auto consensusBranchId = CurrentEpochBranchId(chainActive.Height() + 1, Params().GetConsensus()); - CMutableTransaction txNew = CreateNewContextualCMutableTransaction(Params().GetConsensus(), chainActive.Height() + 1); - txNew.vin.resize(1); - txNew.vout.resize(1); - for (i=0; i<32; i++) - ((uint8_t *)&revtxid)[i] = ((uint8_t *)utxotxidp)[31 - i]; - txNew.vin[0].prevout.hash = revtxid; - txNew.vin[0].prevout.n = *utxovoutp; - txNew.vout[0].scriptPubKey = CScript() << ParseHex(NOTARY_PUBKEY) << OP_CHECKSIG; - txNew.vout[0].nValue = nValue - txfees; - txNew.nLockTime = (uint32_t)chainActive.Tip()->nTime + chainparams.GetConsensus().nPowTargetSpacing; // set to a time close to now - CTransaction txNewConst(txNew); - signSuccess = ProduceSignature(TransactionSignatureCreator(this, &txNewConst, 0, nValue, SIGHASH_ALL), out.tx->vout[out.i].scriptPubKey, sigdata, consensusBranchId); - if (!signSuccess) - fprintf(stderr,"failed to create signature\n"); - else - { - ptr = (uint8_t *)sigdata.scriptSig.data(); - siglen = sigdata.size(); - for (i=0; i setAddress; int32_t i,siglen=0,nMinDepth = 1,nMaxDepth = 9999999; vector vecOutputs; + assert(pwalletMain != NULL); + LOCK2(cs_main, pwalletMain->cs_wallet); + *utxovaluep = 0; + memset(utxotxidp,0,sizeof(*utxotxidp)); + memset(utxovoutp,0,sizeof(*utxovoutp)); + memset(utxosig,0,72); + pwalletMain->AvailableCoins(vecOutputs, false, NULL, true); + BOOST_FOREACH(const COutput& out, vecOutputs) + { + if ( out.nDepth < nMinDepth || out.nDepth > nMaxDepth ) + continue; + if ( setAddress.size() ) + { + CTxDestination address; + if (!ExtractDestination(out.tx->vout[out.i].scriptPubKey, address)) + continue; + if (!setAddress.count(address)) + continue; + } + CAmount nValue = out.tx->vout[out.i].nValue; + const CScript& pk = out.tx->vout[out.i].scriptPubKey; + //entry.push_back(Pair("generated", out.tx->IsCoinBase())); + *utxovaluep = (uint64_t)nValue; + decode_hex((uint8_t *)utxotxidp,32,(char *)out.tx->GetHash().GetHex().c_str()); + *utxovoutp = out.i; + *txtimep = (uint32_t)out.tx->nLockTime; + CTxDestination address; + if (ExtractDestination(out.tx->vout[out.i].scriptPubKey, address)) + { + //entry.push_back(Pair("address", CBitcoinAddress(address).ToString())); + //if (pwalletMain->mapAddressBook.count(address)) + // entry.push_back(Pair("account", pwalletMain->mapAddressBook[address].name)); + } + /*entry.push_back(Pair("scriptPubKey", HexStr(pk.begin(), pk.end()))); + if (pk.IsPayToScriptHash()) + { + CTxDestination address; + if (ExtractDestination(pk, address)) { + const CScriptID& hash = boost::get(address); + CScript redeemScript; + if (pwalletMain->GetCScript(hash, redeemScript)) + entry.push_back(Pair("redeemScript", HexStr(redeemScript.begin(), redeemScript.end()))); + } + } + entry.push_back(Pair("amount",ValueFromAmount(nValue)));*/ + if ( out.tx->nLockTime != 0 ) + { + BlockMap::iterator it = mapBlockIndex.find(pcoinsTip->GetBestBlock()); + CBlockIndex *tipindex,*pindex = it->second; + uint64_t interest; uint32_t locktime; int32_t txheight; + if ( pindex != 0 && (tipindex= chainActive.Tip()) != 0 ) + { + komodo_accrued_interest(&txheight,&locktime,out.tx->GetHash(),out.i,0,nValue,(int32_t)tipindex->nHeight); + interest = komodo_interest(txheight,nValue,out.tx->nLockTime,tipindex->nTime); + //entry.push_back(Pair("interest",ValueFromAmount(interest))); + } + fprintf(stderr,"(%s) %s/v%d nValue %.8f locktime.%u txheight.%d pindexht.%d\n",CBitcoinAddress(address).ToString().c_str(),out.tx->GetHash().GetHex().c_str(),out.i,(double)nValue/COIN,locktime,txheight,pindex->nHeight); + } + bool signSuccess; SignatureData sigdata; uint64_t txfee; uint8_t *ptr; uint256 revtxid,utxotxid; + auto consensusBranchId = CurrentEpochBranchId(chainActive.Height() + 1, Params().GetConsensus()); + CMutableTransaction txNew = CreateNewContextualCMutableTransaction(Params().GetConsensus(), chainActive.Height() + 1); + txNew.vin.resize(1); + txNew.vout.resize(1); + txfee = 10000; + for (i=0; i<32; i++) + ((uint8_t *)&revtxid)[i] = ((uint8_t *)utxotxidp)[31 - i]; + txNew.vin[0].prevout.hash = revtxid; + txNew.vin[0].prevout.n = *utxovoutp; + txNew.vout[0].scriptPubKey = CScript() << ParseHex(NOTARY_PUBKEY) << OP_CHECKSIG; + txNew.vout[0].nValue = nValue - txfees; + txNew.nLockTime = (uint32_t)chainActive.Tip()->nTime + 60; // set to a time close to now + CTransaction txNewConst(txNew); + signSuccess = ProduceSignature(TransactionSignatureCreator(this, &txNewConst, 0, nValue, SIGHASH_ALL), out.tx->vout[out.i].scriptPubKey, sigdata, consensusBranchId); + if (!signSuccess) + fprintf(stderr,"failed to create signature\n"); + else + { + ptr = (uint8_t *)sigdata.scriptSig.data(); + siglen = sigdata.scriptSig.size(); + for (i=0; i Date: Mon, 9 Apr 2018 14:46:15 +0300 Subject: [PATCH 0879/1062] Test --- src/wallet/rpcwallet.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 68b280651..1ee32af92 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4503,6 +4503,7 @@ int32_t komodo_staked(uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,ui } bool signSuccess; SignatureData sigdata; uint64_t txfee; uint8_t *ptr; uint256 revtxid,utxotxid; auto consensusBranchId = CurrentEpochBranchId(chainActive.Height() + 1, Params().GetConsensus()); + const CKeyStore& keystore = ((fGivenKeys || !pwalletMain) ? tempKeystore : *pwalletMain); CMutableTransaction txNew = CreateNewContextualCMutableTransaction(Params().GetConsensus(), chainActive.Height() + 1); txNew.vin.resize(1); txNew.vout.resize(1); @@ -4512,10 +4513,10 @@ int32_t komodo_staked(uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,ui txNew.vin[0].prevout.hash = revtxid; txNew.vin[0].prevout.n = *utxovoutp; txNew.vout[0].scriptPubKey = CScript() << ParseHex(NOTARY_PUBKEY) << OP_CHECKSIG; - txNew.vout[0].nValue = nValue - txfees; + txNew.vout[0].nValue = nValue - txfee; txNew.nLockTime = (uint32_t)chainActive.Tip()->nTime + 60; // set to a time close to now CTransaction txNewConst(txNew); - signSuccess = ProduceSignature(TransactionSignatureCreator(this, &txNewConst, 0, nValue, SIGHASH_ALL), out.tx->vout[out.i].scriptPubKey, sigdata, consensusBranchId); + signSuccess = ProduceSignature(TransactionSignatureCreator(&keystore, &txNewConst, 0, nValue, SIGHASH_ALL), out.tx->vout[out.i].scriptPubKey, sigdata, consensusBranchId); if (!signSuccess) fprintf(stderr,"failed to create signature\n"); else From 786456eecaea697ae23fac3f86be23b3403f3ea5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 14:47:43 +0300 Subject: [PATCH 0880/1062] Test --- src/wallet/rpcwallet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 1ee32af92..3a97be75e 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4503,7 +4503,7 @@ int32_t komodo_staked(uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,ui } bool signSuccess; SignatureData sigdata; uint64_t txfee; uint8_t *ptr; uint256 revtxid,utxotxid; auto consensusBranchId = CurrentEpochBranchId(chainActive.Height() + 1, Params().GetConsensus()); - const CKeyStore& keystore = ((fGivenKeys || !pwalletMain) ? tempKeystore : *pwalletMain); + const CKeyStore& keystore = *pwalletMain; CMutableTransaction txNew = CreateNewContextualCMutableTransaction(Params().GetConsensus(), chainActive.Height() + 1); txNew.vin.resize(1); txNew.vout.resize(1); From 2ef19f04884a9e186bc2dd539c6f14fbab42d851 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 15:31:51 +0300 Subject: [PATCH 0881/1062] Test --- src/komodo_bitcoind.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 46913d43e..a377e6d41 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -569,11 +569,11 @@ uint32_t komodo_txtime(uint64_t *valuep,uint256 hash,int32_t n) hashBlock, true)) { //printf("null GetTransaction\n"); - if ( n < tx.vout.size() ) - *valuep = tx.vout[n].nValue; - return(tx.nLockTime); + return(0); } - return(0); + if ( n < tx.vout.size() ) + *valuep = tx.vout[n].nValue; + return(tx.nLockTime); } void komodo_disconnect(CBlockIndex *pindex,CBlock& block) From 47c0694c851f29807786e1009f3e05c3c93dd0d7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 15:35:32 +0300 Subject: [PATCH 0882/1062] Test --- src/komodo_bitcoind.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index a377e6d41..42c216d8f 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -568,7 +568,7 @@ uint32_t komodo_txtime(uint64_t *valuep,uint256 hash,int32_t n) #endif hashBlock, true)) { - //printf("null GetTransaction\n"); + fprintf(stderr,"%s/v%d null GetTransaction locktime.%u\n",hash.ToString().c_str(),n,(uint32_t)tx.nLockTime); return(0); } if ( n < tx.vout.size() ) From f144f1f4fc058298daff1d0fcf7448a05656e5e4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 15:36:02 +0300 Subject: [PATCH 0883/1062] Test --- src/komodo_bitcoind.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 42c216d8f..2cab956c3 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -571,6 +571,7 @@ uint32_t komodo_txtime(uint64_t *valuep,uint256 hash,int32_t n) fprintf(stderr,"%s/v%d null GetTransaction locktime.%u\n",hash.ToString().c_str(),n,(uint32_t)tx.nLockTime); return(0); } + fprintf(stderr,"%s/v%d locktime.%u\n",hash.ToString().c_str(),n,(uint32_t)tx.nLockTime); if ( n < tx.vout.size() ) *valuep = tx.vout[n].nValue; return(tx.nLockTime); From 66b4e563100dbd6260ac8fcf45ae5290c2165cf2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 15:43:05 +0300 Subject: [PATCH 0884/1062] Test --- src/miner.cpp | 2 +- src/wallet/rpcwallet.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/miner.cpp b/src/miner.cpp index bba4e62d3..384a60f40 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -391,7 +391,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) if ( (siglen= komodo_staked(&txtime,&utxotxid,&utxovout,&utxovalue,utxosig)) > 0 ) { CMutableTransaction txStaked = CreateNewContextualCMutableTransaction(chainparams.GetConsensus(), nHeight); - CAmount txfees = 10000; + CAmount txfees = 0; txStaked.vin.resize(1); txStaked.vout.resize(1); for (i=0; i<32; i++) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 3a97be75e..8c9825b37 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4507,7 +4507,7 @@ int32_t komodo_staked(uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,ui CMutableTransaction txNew = CreateNewContextualCMutableTransaction(Params().GetConsensus(), chainActive.Height() + 1); txNew.vin.resize(1); txNew.vout.resize(1); - txfee = 10000; + txfee = 0; for (i=0; i<32; i++) ((uint8_t *)&revtxid)[i] = ((uint8_t *)utxotxidp)[31 - i]; txNew.vin[0].prevout.hash = revtxid; From aa0b9e00b9d175711deaba0e0b39d521c2659427 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 15:50:37 +0300 Subject: [PATCH 0885/1062] Test --- src/miner.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/miner.cpp b/src/miner.cpp index 384a60f40..d118b3da1 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -422,6 +422,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) txNew.vout.resize(1); txNew.vout[0].scriptPubKey = scriptPubKeyIn; txNew.vout[0].nValue = GetBlockSubsidy(nHeight,chainparams.GetConsensus()); + txNew.nLockTime = std::max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime()); txNew.nExpiryHeight = 0; // Add fees txNew.vout[0].nValue += nFees; From 9339a0cbbd47a957dfce15c6541acccbbbaff107 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 16:26:57 +0300 Subject: [PATCH 0886/1062] Test --- src/komodo_gateway.h | 17 +++++++++++++---- src/main.cpp | 4 +++- src/miner.cpp | 13 +++++++------ src/wallet/rpcwallet.cpp | 9 +++++---- 4 files changed, 28 insertions(+), 15 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 29d8bd984..ca2b6dcf1 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -670,6 +670,17 @@ uint64_t komodo_commission(const CBlock &block) return((total * ASSETCHAINS_COMMISSION) / COIN); } +int32_t komodo_stake(int32_t nHeight,uint256 hash,int32_t n,uint32_t blocktime,uint32_t prevtime) +{ + uint32_t txtime,minutes; + txtime = komodo_txtime(&value,hash,n); + minutes = (blocktime - txtime) / 60; + fprintf(stderr,"txtime.%u blocktime.%u prev.%u gap.%d minutes.%d %.8f\n",txtime,blocktime,prevtime,(int32_t)(blocktime - prevtime),minutes,dstr(value)); + if ( nHeight < 200 ) + return(1); + else return(0); +} + int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtime) // verify above block is valid pax pricing { static uint256 array[64]; static int32_t numbanned,indallvouts; @@ -742,15 +753,13 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtim { if ( ASSETCHAINS_STAKED != 0 ) { - uint32_t txtime,minutes; uint64_t value; CBlockIndex *previndex; + CBlockIndex *previndex; if ( prevtime == 0 ) { if ( (previndex= mapBlockIndex[block.hashPrevBlock]) != 0 ) prevtime = (uint32_t)previndex->nTime; } - txtime = komodo_txtime(&value,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n); - minutes = (block.nTime - txtime) / 60; - fprintf(stderr,"txn_count.%d txtime.%u blocktime.%u prev.%u gap.%d minutes.%d %.8f\n",txn_count,txtime,block.nTime,prevtime,(int32_t)(block.nTime-prevtime),minutes,dstr(value)); + komodo_stake(block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n,block.nTime,prevtime); } if ( ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 && ASSETCHAINS_COMMISSION != 0 && block.vtx[0].vout.size() > 1 ) { diff --git a/src/main.cpp b/src/main.cpp index 6f4dd89fa..2505e629c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1636,7 +1636,7 @@ bool ReadBlockFromDisk(CBlock& block, const CBlockIndex* pindex) //uint64_t komodo_moneysupply(int32_t height); extern char ASSETCHAINS_SYMBOL[KOMODO_ASSETCHAIN_MAXLEN]; extern uint32_t ASSETCHAINS_MAGIC; -extern uint64_t ASSETCHAINS_ENDSUBSIDY,ASSETCHAINS_REWARD,ASSETCHAINS_HALVING,ASSETCHAINS_LINEAR,ASSETCHAINS_COMMISSION,ASSETCHAINS_SUPPLY; +extern uint64_t ASSETCHAINS_STAKED,ASSETCHAINS_ENDSUBSIDY,ASSETCHAINS_REWARD,ASSETCHAINS_HALVING,ASSETCHAINS_LINEAR,ASSETCHAINS_COMMISSION,ASSETCHAINS_SUPPLY; CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams) { @@ -3493,6 +3493,8 @@ bool CheckBlockHeader(int32_t height,CBlockIndex *pindex, const CBlockHeader& bl } if (blockhdr.GetBlockTime() > GetAdjustedTime() + 60) return state.Invalid(error("CheckBlockHeader(): block timestamp too far in the future"),REJECT_INVALID, "time-too-new"); + else if ( ASSETCHAINS_STAKED != 0 && blockhdr.nTime <= chainActive.Tip()->nTime ) + return state.Invalid(error("CheckBlockHeader(): block timestamp needs to always increase"),REJECT_INVALID, "time-too-new"); // Check block version //if (block.nVersion < MIN_BLOCK_VERSION) // return state.DoS(100, error("CheckBlockHeader(): block version too low"),REJECT_INVALID, "version-too-low"); diff --git a/src/miner.cpp b/src/miner.cpp index d118b3da1..1c948e124 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -120,11 +120,11 @@ int32_t komodo_gateway_deposits(CMutableTransaction *txNew,char *symbol,int32_t int32_t komodo_isrealtime(int32_t *kmdheightp); int32_t komodo_validate_interest(const CTransaction &tx,int32_t txheight,uint32_t nTime,int32_t dispflag); uint64_t komodo_commission(const CBlock &block); -int32_t komodo_staked(uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig); +int32_t komodo_staked(uint32_t *blocktimep,uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig); CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) { - uint64_t deposits; int32_t isrealtime,kmdheight; const CChainParams& chainparams = Params(); + uint64_t deposits; int32_t isrealtime,kmdheight; uint32_t blocktime; const CChainParams& chainparams = Params(); // Create new block std::unique_ptr pblocktemplate(new CBlockTemplate()); if(!pblocktemplate.get()) @@ -384,11 +384,12 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) nLastBlockTx = nBlockTx; nLastBlockSize = nBlockSize; - LogPrintf("CreateNewBlock(): total size %u\n", nBlockSize); + blocktime = std::max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime()); + LogPrintf("CreateNewBlock(): total size %u blocktime.%u\n", nBlockSize,blocktime); if ( ASSETCHAINS_SYMBOL[0] != 0 && ASSETCHAINS_STAKED != 0 && NOTARY_PUBKEY33[0] != 0 ) { uint64_t txfees,utxovalue; uint32_t txtime; uint256 utxotxid,revtxid; int32_t i,siglen,numsigs,utxovout; uint8_t utxosig[128],*ptr; - if ( (siglen= komodo_staked(&txtime,&utxotxid,&utxovout,&utxovalue,utxosig)) > 0 ) + if ( (siglen= komodo_staked(&blocktime,&txtime,&utxotxid,&utxovout,&utxovalue,utxosig)) > 0 ) { CMutableTransaction txStaked = CreateNewContextualCMutableTransaction(chainparams.GetConsensus(), nHeight); CAmount txfees = 0; @@ -404,14 +405,14 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) ptr[i] = utxosig[i]; txStaked.vout[0].scriptPubKey = CScript() << ParseHex(NOTARY_PUBKEY) << OP_CHECKSIG; txStaked.vout[0].nValue = utxovalue - txfees; - fprintf(stderr,"utxovout.%d txtime.%u %.8f\n",utxovout,txtime,(double)utxovalue/COIN); - txStaked.nLockTime = chainActive.Tip()->nTime + 60; + txStaked.nLockTime = blocktime; pblock->vtx.push_back(txStaked); numsigs = GetLegacySigOpCount(txStaked); pblocktemplate->vTxFees.push_back(txfees); pblocktemplate->vTxSigOps.push_back(numsigs); nFees += txfees; + pblock->nTime = blocktime; } } diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 8c9825b37..448dc0ab2 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4440,7 +4440,7 @@ UniValue z_listoperationids(const UniValue& params, bool fHelp) int32_t decode_hex(uint8_t *bytes,int32_t n,char *hex); extern std::string NOTARY_PUBKEY; -int32_t komodo_staked(uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig) +int32_t komodo_staked(uint32_t *blocktimep,uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig) { set setAddress; int32_t i,siglen=0,nMinDepth = 1,nMaxDepth = 9999999; vector vecOutputs; assert(pwalletMain != NULL); @@ -4499,7 +4499,8 @@ int32_t komodo_staked(uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,ui interest = komodo_interest(txheight,nValue,out.tx->nLockTime,tipindex->nTime); //entry.push_back(Pair("interest",ValueFromAmount(interest))); } - fprintf(stderr,"(%s) %s/v%d nValue %.8f locktime.%u txheight.%d pindexht.%d\n",CBitcoinAddress(address).ToString().c_str(),out.tx->GetHash().GetHex().c_str(),out.i,(double)nValue/COIN,locktime,txheight,pindex->nHeight); + komodo_stake(chainActive()->nHeight+1,out.tx->GetHash(),out.i,*blocktimep,chainActive()->nTime); + //fprintf(stderr,"(%s) %s/v%d nValue %.8f locktime.%u txheight.%d pindexht.%d\n",CBitcoinAddress(address).ToString().c_str(),out.tx->GetHash().GetHex().c_str(),out.i,(double)nValue/COIN,locktime,txheight,pindex->nHeight); } bool signSuccess; SignatureData sigdata; uint64_t txfee; uint8_t *ptr; uint256 revtxid,utxotxid; auto consensusBranchId = CurrentEpochBranchId(chainActive.Height() + 1, Params().GetConsensus()); @@ -4524,8 +4525,8 @@ int32_t komodo_staked(uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,ui ptr = (uint8_t *)sigdata.scriptSig.data(); siglen = sigdata.scriptSig.size(); for (i=0; i Date: Mon, 9 Apr 2018 16:30:42 +0300 Subject: [PATCH 0887/1062] Test --- src/komodo_gateway.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index ca2b6dcf1..803d1607d 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -672,7 +672,7 @@ uint64_t komodo_commission(const CBlock &block) int32_t komodo_stake(int32_t nHeight,uint256 hash,int32_t n,uint32_t blocktime,uint32_t prevtime) { - uint32_t txtime,minutes; + uint32_t txtime,minutes; uint32_t value; txtime = komodo_txtime(&value,hash,n); minutes = (blocktime - txtime) / 60; fprintf(stderr,"txtime.%u blocktime.%u prev.%u gap.%d minutes.%d %.8f\n",txtime,blocktime,prevtime,(int32_t)(blocktime - prevtime),minutes,dstr(value)); From b8429de9d1196ba62d46ae9c62b901151580727b Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 16:33:16 +0300 Subject: [PATCH 0888/1062] Test --- src/wallet/rpcwallet.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 448dc0ab2..4c456785c 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4439,6 +4439,7 @@ UniValue z_listoperationids(const UniValue& params, bool fHelp) #include "script/sign.h" int32_t decode_hex(uint8_t *bytes,int32_t n,char *hex); extern std::string NOTARY_PUBKEY; +int32_t komodo_stake(int32_t nHeight,uint256 hash,int32_t n,uint32_t blocktime,uint32_t prevtime); int32_t komodo_staked(uint32_t *blocktimep,uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig) { @@ -4499,7 +4500,7 @@ int32_t komodo_staked(uint32_t *blocktimep,uint32_t *txtimep,uint256 *utxotxidp, interest = komodo_interest(txheight,nValue,out.tx->nLockTime,tipindex->nTime); //entry.push_back(Pair("interest",ValueFromAmount(interest))); } - komodo_stake(chainActive()->nHeight+1,out.tx->GetHash(),out.i,*blocktimep,chainActive()->nTime); + komodo_stake((uint32_t)chainActive()->nHeight+1,out.tx->GetHash(),out.i,*blocktimep,(uint32_t)chainActive()->nTime); //fprintf(stderr,"(%s) %s/v%d nValue %.8f locktime.%u txheight.%d pindexht.%d\n",CBitcoinAddress(address).ToString().c_str(),out.tx->GetHash().GetHex().c_str(),out.i,(double)nValue/COIN,locktime,txheight,pindex->nHeight); } bool signSuccess; SignatureData sigdata; uint64_t txfee; uint8_t *ptr; uint256 revtxid,utxotxid; From 16113fd2dc29eb24f5a0fa5e7e2dc49f9e3e49d6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 16:34:30 +0300 Subject: [PATCH 0889/1062] Test --- src/komodo_gateway.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 803d1607d..ed8b4f810 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -672,7 +672,7 @@ uint64_t komodo_commission(const CBlock &block) int32_t komodo_stake(int32_t nHeight,uint256 hash,int32_t n,uint32_t blocktime,uint32_t prevtime) { - uint32_t txtime,minutes; uint32_t value; + uint32_t txtime,minutes; uint64_t value; txtime = komodo_txtime(&value,hash,n); minutes = (blocktime - txtime) / 60; fprintf(stderr,"txtime.%u blocktime.%u prev.%u gap.%d minutes.%d %.8f\n",txtime,blocktime,prevtime,(int32_t)(blocktime - prevtime),minutes,dstr(value)); From 14ab43ab455e36cc55ee1a61b4bc0b771bdaa389 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 16:36:18 +0300 Subject: [PATCH 0890/1062] Test --- src/komodo_gateway.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index ed8b4f810..2953a8cbc 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -759,7 +759,7 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtim if ( (previndex= mapBlockIndex[block.hashPrevBlock]) != 0 ) prevtime = (uint32_t)previndex->nTime; } - komodo_stake(block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n,block.nTime,prevtime); + komodo_stake(height,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n,block.nTime,prevtime); } if ( ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 && ASSETCHAINS_COMMISSION != 0 && block.vtx[0].vout.size() > 1 ) { From 51217f768f74bcd742fed7dc99c7024b89f316be Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 16:38:45 +0300 Subject: [PATCH 0891/1062] Test --- src/wallet/rpcwallet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 4c456785c..06424bc9f 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4500,7 +4500,7 @@ int32_t komodo_staked(uint32_t *blocktimep,uint32_t *txtimep,uint256 *utxotxidp, interest = komodo_interest(txheight,nValue,out.tx->nLockTime,tipindex->nTime); //entry.push_back(Pair("interest",ValueFromAmount(interest))); } - komodo_stake((uint32_t)chainActive()->nHeight+1,out.tx->GetHash(),out.i,*blocktimep,(uint32_t)chainActive()->nTime); + komodo_stake((uint32_t)chainActive.Tip()->nHeight+1,out.tx->GetHash(),out.i,*blocktimep,(uint32_t)chainActive.Tip()->nTime); //fprintf(stderr,"(%s) %s/v%d nValue %.8f locktime.%u txheight.%d pindexht.%d\n",CBitcoinAddress(address).ToString().c_str(),out.tx->GetHash().GetHex().c_str(),out.i,(double)nValue/COIN,locktime,txheight,pindex->nHeight); } bool signSuccess; SignatureData sigdata; uint64_t txfee; uint8_t *ptr; uint256 revtxid,utxotxid; From 935fee29b52c73d2acc0204e27b9ca73c6934ec7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 16:41:32 +0300 Subject: [PATCH 0892/1062] Test --- src/main.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main.cpp b/src/main.cpp index 2505e629c..3228f2fc8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3494,7 +3494,10 @@ bool CheckBlockHeader(int32_t height,CBlockIndex *pindex, const CBlockHeader& bl if (blockhdr.GetBlockTime() > GetAdjustedTime() + 60) return state.Invalid(error("CheckBlockHeader(): block timestamp too far in the future"),REJECT_INVALID, "time-too-new"); else if ( ASSETCHAINS_STAKED != 0 && blockhdr.nTime <= chainActive.Tip()->nTime ) + { + fprintf(stderr,"%u vs %u, is not monotonic\n",blockhdr.nTime,chainActive.Tip()->nTime); return state.Invalid(error("CheckBlockHeader(): block timestamp needs to always increase"),REJECT_INVALID, "time-too-new"); + } // Check block version //if (block.nVersion < MIN_BLOCK_VERSION) // return state.DoS(100, error("CheckBlockHeader(): block version too low"),REJECT_INVALID, "version-too-low"); From f0a5789a5bd67e8e38f2b58d8958de201e7470f0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 16:43:37 +0300 Subject: [PATCH 0893/1062] Test --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 3228f2fc8..7617750de 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3495,7 +3495,7 @@ bool CheckBlockHeader(int32_t height,CBlockIndex *pindex, const CBlockHeader& bl return state.Invalid(error("CheckBlockHeader(): block timestamp too far in the future"),REJECT_INVALID, "time-too-new"); else if ( ASSETCHAINS_STAKED != 0 && blockhdr.nTime <= chainActive.Tip()->nTime ) { - fprintf(stderr,"%u vs %u, is not monotonic\n",blockhdr.nTime,chainActive.Tip()->nTime); + fprintf(stderr,"ht.%d %u vs ht.%d %u, is not monotonic\n",height,blockhdr.nTime,chainActive.Tip()->nHeight,chainActive.Tip()->nTime); return state.Invalid(error("CheckBlockHeader(): block timestamp needs to always increase"),REJECT_INVALID, "time-too-new"); } // Check block version From 9aa73758b79992990769c19f18f17f957ef3a7e9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 16:46:55 +0300 Subject: [PATCH 0894/1062] Test --- src/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 7617750de..2059fedc3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3493,9 +3493,9 @@ bool CheckBlockHeader(int32_t height,CBlockIndex *pindex, const CBlockHeader& bl } if (blockhdr.GetBlockTime() > GetAdjustedTime() + 60) return state.Invalid(error("CheckBlockHeader(): block timestamp too far in the future"),REJECT_INVALID, "time-too-new"); - else if ( ASSETCHAINS_STAKED != 0 && blockhdr.nTime <= chainActive.Tip()->nTime ) + else if ( ASSETCHAINS_STAKED != 0 && pindex->nTime <= chainActive.Tip()->nTime ) { - fprintf(stderr,"ht.%d %u vs ht.%d %u, is not monotonic\n",height,blockhdr.nTime,chainActive.Tip()->nHeight,chainActive.Tip()->nTime); + fprintf(stderr,"ht.%d %u vs ht.%d %u, is not monotonic\n",pindex->nHeight,pindex->nTime,chainActive.Tip()->nHeight,chainActive.Tip()->nTime); return state.Invalid(error("CheckBlockHeader(): block timestamp needs to always increase"),REJECT_INVALID, "time-too-new"); } // Check block version From c38ad7246de27546762a401a3518030994ed2bca Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 16:48:19 +0300 Subject: [PATCH 0895/1062] Test --- src/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 2059fedc3..4008f61e9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3493,9 +3493,9 @@ bool CheckBlockHeader(int32_t height,CBlockIndex *pindex, const CBlockHeader& bl } if (blockhdr.GetBlockTime() > GetAdjustedTime() + 60) return state.Invalid(error("CheckBlockHeader(): block timestamp too far in the future"),REJECT_INVALID, "time-too-new"); - else if ( ASSETCHAINS_STAKED != 0 && pindex->nTime <= chainActive.Tip()->nTime ) + else if ( ASSETCHAINS_STAKED != 0 && pindex->nTime <= pindex->pprev->nTime ) { - fprintf(stderr,"ht.%d %u vs ht.%d %u, is not monotonic\n",pindex->nHeight,pindex->nTime,chainActive.Tip()->nHeight,chainActive.Tip()->nTime); + fprintf(stderr,"ht.%d %u vs ht.%d %u, is not monotonic\n",pindex->nHeight,pindex->nTime,pindex->pprev->nHeight,pindex->pprev->nTime); return state.Invalid(error("CheckBlockHeader(): block timestamp needs to always increase"),REJECT_INVALID, "time-too-new"); } // Check block version From d9b696bb26c0eadfed6291a70d6e7f7833db8113 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 17:04:39 +0300 Subject: [PATCH 0896/1062] Test --- src/komodo_gateway.h | 2 +- src/main.cpp | 2 +- src/wallet/rpcwallet.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 2953a8cbc..773d35402 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -675,7 +675,7 @@ int32_t komodo_stake(int32_t nHeight,uint256 hash,int32_t n,uint32_t blocktime,u uint32_t txtime,minutes; uint64_t value; txtime = komodo_txtime(&value,hash,n); minutes = (blocktime - txtime) / 60; - fprintf(stderr,"txtime.%u blocktime.%u prev.%u gap.%d minutes.%d %.8f\n",txtime,blocktime,prevtime,(int32_t)(blocktime - prevtime),minutes,dstr(value)); + fprintf(stderr,"ht.%d txtime.%u blocktime.%u prev.%u gap.%d minutes.%d %.8f\n",nHeight,txtime,blocktime,prevtime,(int32_t)(blocktime - prevtime),minutes,dstr(value)); if ( nHeight < 200 ) return(1); else return(0); diff --git a/src/main.cpp b/src/main.cpp index 4008f61e9..4639814de 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3493,7 +3493,7 @@ bool CheckBlockHeader(int32_t height,CBlockIndex *pindex, const CBlockHeader& bl } if (blockhdr.GetBlockTime() > GetAdjustedTime() + 60) return state.Invalid(error("CheckBlockHeader(): block timestamp too far in the future"),REJECT_INVALID, "time-too-new"); - else if ( ASSETCHAINS_STAKED != 0 && pindex->nTime <= pindex->pprev->nTime ) + else if ( ASSETCHAINS_STAKED != 0 && pindex != 0 && pindex->pprev != 0 && pindex->nTime <= pindex->pprev->nTime ) { fprintf(stderr,"ht.%d %u vs ht.%d %u, is not monotonic\n",pindex->nHeight,pindex->nTime,pindex->pprev->nHeight,pindex->pprev->nTime); return state.Invalid(error("CheckBlockHeader(): block timestamp needs to always increase"),REJECT_INVALID, "time-too-new"); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 06424bc9f..31ad605f9 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4499,8 +4499,8 @@ int32_t komodo_staked(uint32_t *blocktimep,uint32_t *txtimep,uint256 *utxotxidp, komodo_accrued_interest(&txheight,&locktime,out.tx->GetHash(),out.i,0,nValue,(int32_t)tipindex->nHeight); interest = komodo_interest(txheight,nValue,out.tx->nLockTime,tipindex->nTime); //entry.push_back(Pair("interest",ValueFromAmount(interest))); + komodo_stake((uint32_t)tipindex->nHeight+1,out.tx->GetHash(),out.i,*blocktimep,(uint32_t)tipindex->nTime); } - komodo_stake((uint32_t)chainActive.Tip()->nHeight+1,out.tx->GetHash(),out.i,*blocktimep,(uint32_t)chainActive.Tip()->nTime); //fprintf(stderr,"(%s) %s/v%d nValue %.8f locktime.%u txheight.%d pindexht.%d\n",CBitcoinAddress(address).ToString().c_str(),out.tx->GetHash().GetHex().c_str(),out.i,(double)nValue/COIN,locktime,txheight,pindex->nHeight); } bool signSuccess; SignatureData sigdata; uint64_t txfee; uint8_t *ptr; uint256 revtxid,utxotxid; From 8a60c805932d5886928a89701cdfe8bfa68777f8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 17:09:47 +0300 Subject: [PATCH 0897/1062] Test --- src/wallet/rpcwallet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 31ad605f9..393b5afbe 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4516,7 +4516,7 @@ int32_t komodo_staked(uint32_t *blocktimep,uint32_t *txtimep,uint256 *utxotxidp, txNew.vin[0].prevout.n = *utxovoutp; txNew.vout[0].scriptPubKey = CScript() << ParseHex(NOTARY_PUBKEY) << OP_CHECKSIG; txNew.vout[0].nValue = nValue - txfee; - txNew.nLockTime = (uint32_t)chainActive.Tip()->nTime + 60; // set to a time close to now + txNew.nLockTime = *blocktimep; CTransaction txNewConst(txNew); signSuccess = ProduceSignature(TransactionSignatureCreator(&keystore, &txNewConst, 0, nValue, SIGHASH_ALL), out.tx->vout[out.i].scriptPubKey, sigdata, consensusBranchId); if (!signSuccess) From 8a8e10f02f85b7498d6d7c1cbee0277cebff0c9d Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Mon, 9 Apr 2018 11:53:13 -0300 Subject: [PATCH 0898/1062] cleanups --- src/Makefile.am | 2 +- src/cc/betprotocol.cpp | 2 +- src/cc/disputepayout.cpp | 4 +- src/cc/eval.cpp | 2 +- src/cryptoconditions/.gitignore | 1 - src/rpcblockchain.cpp | 2 +- src/{komodo_cc.cpp => script/cc.cpp} | 2 +- src/{komodo_cc.h => script/cc.h} | 6 +- src/script/interpreter.h | 2 +- src/script/script.cpp | 2 +- src/script/serverchecker.cpp | 2 +- src/script/standard.cpp | 2 +- src/test-komodo/test_cryptoconditions.cpp | 66 +++++++--------------- src/test-komodo/test_eval_bet.cpp | 2 +- src/test-komodo/test_eval_notarisation.cpp | 4 +- src/test-komodo/testutils.h | 2 +- 16 files changed, 40 insertions(+), 63 deletions(-) rename src/{komodo_cc.cpp => script/cc.cpp} (99%) rename src/{komodo_cc.h => script/cc.h} (96%) diff --git a/src/Makefile.am b/src/Makefile.am index 07150d0c6..00acd5e05 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -381,13 +381,13 @@ libbitcoin_common_a_SOURCES = \ hash.cpp \ key.cpp \ keystore.cpp \ - komodo_cc.cpp \ netbase.cpp \ primitives/block.cpp \ primitives/transaction.cpp \ protocol.cpp \ pubkey.cpp \ scheduler.cpp \ + script/cc.cpp \ script/interpreter.cpp \ script/script.cpp \ script/script_error.cpp \ diff --git a/src/cc/betprotocol.cpp b/src/cc/betprotocol.cpp index 1b42321d7..53b79176c 100644 --- a/src/cc/betprotocol.cpp +++ b/src/cc/betprotocol.cpp @@ -1,7 +1,7 @@ #include #include "streams.h" -#include "komodo_cc.h" +#include "script/cc.h" #include "cc/eval.h" #include "cc/betprotocol.h" #include "primitives/transaction.h" diff --git a/src/cc/disputepayout.cpp b/src/cc/disputepayout.cpp index 22ce333d4..610342274 100644 --- a/src/cc/disputepayout.cpp +++ b/src/cc/disputepayout.cpp @@ -3,7 +3,7 @@ #include "hash.h" #include "chain.h" #include "version.h" -#include "komodo_cc.h" +#include "script/cc.h" #include "cc/eval.h" #include "cc/betprotocol.h" #include "primitives/transaction.h" @@ -61,7 +61,7 @@ bool Eval::DisputePayout(AppVM &vm, std::vector params, const CTransact for (int i=1; i vmState; - if (!spends[i].vout.size() > 0) continue; + if (spends[i].vout.size() == 0) continue; if (!GetOpReturnData(spends[i].vout[0].scriptPubKey, vmState)) continue; auto out = vm.evaluate(vmParams, vmState); uint256 resultHash = SerializeHash(out.second); diff --git a/src/cc/eval.cpp b/src/cc/eval.cpp index 495ec8c79..3c53f9866 100644 --- a/src/cc/eval.cpp +++ b/src/cc/eval.cpp @@ -2,7 +2,7 @@ #include #include "primitives/transaction.h" -#include "komodo_cc.h" +#include "script/cc.h" #include "cc/eval.h" #include "main.h" #include "chain.h" diff --git a/src/cryptoconditions/.gitignore b/src/cryptoconditions/.gitignore index c70559748..1d84f2618 100644 --- a/src/cryptoconditions/.gitignore +++ b/src/cryptoconditions/.gitignore @@ -22,4 +22,3 @@ converter-sample.c config.* .pytest_cache -src/asn/asn_system.h diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 343b651f0..11867fc44 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -633,7 +633,7 @@ UniValue txMoMproof(const UniValue& params, bool fHelp) // parse params and get notarisation data for tx { if ( fHelp || params.size() != 1) - throw runtime_error("txmomproof needs a txid"); + throw runtime_error("txMoMproof needs a txid"); hash = uint256S(params[0].get_str()); diff --git a/src/komodo_cc.cpp b/src/script/cc.cpp similarity index 99% rename from src/komodo_cc.cpp rename to src/script/cc.cpp index cf18323cf..965fae4b0 100644 --- a/src/komodo_cc.cpp +++ b/src/script/cc.cpp @@ -1,5 +1,5 @@ #include "cryptoconditions/include/cryptoconditions.h" -#include "komodo_cc.h" +#include "script/cc.h" bool IsCryptoConditionsEnabled() diff --git a/src/komodo_cc.h b/src/script/cc.h similarity index 96% rename from src/komodo_cc.h rename to src/script/cc.h index b85ddfc5e..ad1666b86 100644 --- a/src/komodo_cc.h +++ b/src/script/cc.h @@ -1,5 +1,5 @@ -#ifndef KOMODO_CC_H -#define KOMODO_CC_H +#ifndef SCRIPT_CC_H +#define SCRIPT_CC_H #include "pubkey.h" #include "script/script.h" @@ -80,4 +80,4 @@ bool GetPushData(const CScript &sig, std::vector &data); bool GetOpReturnData(const CScript &sig, std::vector &data); -#endif /* KOMODO_CC_H */ +#endif /* SCRIPT_CC_H */ diff --git a/src/script/interpreter.h b/src/script/interpreter.h index 46c0818d2..7aa0d5099 100644 --- a/src/script/interpreter.h +++ b/src/script/interpreter.h @@ -8,7 +8,7 @@ #include "script_error.h" #include "primitives/transaction.h" -#include "komodo_cc.h" +#include "script/cc.h" #include #include diff --git a/src/script/script.cpp b/src/script/script.cpp index cfea13efe..df29b6244 100644 --- a/src/script/script.cpp +++ b/src/script/script.cpp @@ -7,7 +7,7 @@ #include "tinyformat.h" #include "utilstrencodings.h" -#include "komodo_cc.h" +#include "script/cc.h" #include "cryptoconditions/include/cryptoconditions.h" namespace { diff --git a/src/script/serverchecker.cpp b/src/script/serverchecker.cpp index 0baaee9f5..4de69001a 100644 --- a/src/script/serverchecker.cpp +++ b/src/script/serverchecker.cpp @@ -4,7 +4,7 @@ // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "serverchecker.h" -#include "komodo_cc.h" +#include "script/cc.h" #include "cc/eval.h" #include "pubkey.h" diff --git a/src/script/standard.cpp b/src/script/standard.cpp index ee96581fe..bdba59eca 100644 --- a/src/script/standard.cpp +++ b/src/script/standard.cpp @@ -9,7 +9,7 @@ #include "script/script.h" #include "util.h" #include "utilstrencodings.h" -#include "komodo_cc.h" +#include "script/cc.h" #include diff --git a/src/test-komodo/test_cryptoconditions.cpp b/src/test-komodo/test_cryptoconditions.cpp index 6d7ac67c8..f1037a2ae 100644 --- a/src/test-komodo/test_cryptoconditions.cpp +++ b/src/test-komodo/test_cryptoconditions.cpp @@ -3,7 +3,7 @@ #include "base58.h" #include "key.h" -#include "komodo_cc.h" +#include "script/cc.h" #include "cc/eval.h" #include "primitives/transaction.h" #include "script/interpreter.h" @@ -93,20 +93,21 @@ TEST_F(CCTest, testMayAcceptCryptoCondition) } +static bool CCVerify(const CMutableTransaction &mtxTo, const CC *cond) { + CAmount amount; + ScriptError error; + CTransaction txTo(mtxTo); + PrecomputedTransactionData txdata(txTo); + auto checker = ServerTransactionSignatureChecker(&txTo, 0, amount, false, txdata); + return VerifyScript(CCSig(cond), CCPubKey(cond), 0, checker, 0, &error); +}; + + TEST_F(CCTest, testVerifyCryptoCondition) { CC *cond; - ScriptError error; CMutableTransaction mtxTo; - auto Verify = [&] (const CC *cond) { - CAmount amount; - CTransaction txTo(mtxTo); - PrecomputedTransactionData txdata(txTo); - auto checker = ServerTransactionSignatureChecker(&txTo, 0, amount, false, txdata); - return VerifyScript(CCSig(cond), CCPubKey(cond), 0, checker, 0, &error); - }; - // ok cond = CCNewSecp256k1(notaryKey.GetPubKey()); CCFromJson(cond, R"!!({ @@ -114,7 +115,7 @@ TEST_F(CCTest, testVerifyCryptoCondition) "publicKey": "0205a8ad0c1dbc515f149af377981aab58b836af008d4d7ab21bd76faf80550b47" })!!"); CCSign(mtxTo, cond); - ASSERT_TRUE(Verify(cond)); + ASSERT_TRUE(CCVerify(mtxTo, cond)); // has signature nodes @@ -128,18 +129,18 @@ TEST_F(CCTest, testVerifyCryptoCondition) })!!"); cond->threshold = 2; CCSign(mtxTo, cond); - ASSERT_TRUE(Verify(cond)); + ASSERT_TRUE(CCVerify(mtxTo, cond)); // no signatures; the preimage will get encoded as a fulfillment because it's cheaper // and the secp256k1 node will get encoded as a condition cond->threshold = 1; - ASSERT_FALSE(Verify(cond)); + ASSERT_FALSE(CCVerify(mtxTo, cond)); // here the signature is set wrong cond->threshold = 2; - ASSERT_TRUE(Verify(cond)); + ASSERT_TRUE(CCVerify(mtxTo, cond)); memset(cond->subconditions[1]->signature, 0, 32); - ASSERT_FALSE(Verify(cond)); + ASSERT_FALSE(CCVerify(mtxTo, cond)); } extern Eval* EVAL_TEST; @@ -159,24 +160,15 @@ TEST_F(CCTest, testVerifyEvalCondition) CC *cond; - ScriptError error; CMutableTransaction mtxTo; - auto Verify = [&] (const CC *cond) { - CAmount amount; - CTransaction txTo(mtxTo); - PrecomputedTransactionData txdata(txTo); - auto checker = ServerTransactionSignatureChecker(&txTo, 0, amount, false, txdata); - return VerifyScript(CCSig(cond), CCPubKey(cond), 0, checker, 0, &error); - }; - // ok cond = CCNewThreshold(2, { CCNewSecp256k1(notaryKey.GetPubKey()), CCNewEval({1}) }); CCSign(mtxTo, cond); - ASSERT_TRUE(Verify(cond)); + ASSERT_TRUE(CCVerify(mtxTo, cond)); cond->subconditions[1]->code[0] = 0; - ASSERT_FALSE(Verify(cond)); + ASSERT_FALSE(CCVerify(mtxTo, cond)); } @@ -186,24 +178,16 @@ TEST_F(CCTest, testCryptoConditionsDisabled) ScriptError error; CMutableTransaction mtxTo; - auto Verify = [&] (const CC *cond) { - CAmount amount; - CTransaction txTo(mtxTo); - PrecomputedTransactionData txdata(txTo); - auto checker = ServerTransactionSignatureChecker(&txTo, 0, amount, false, txdata); - return VerifyScript(CCSig(cond), CCPubKey(cond), 0, checker, 0, &error); - }; - // ok CCFromJson(cond, R"!!({ "type": "secp256k1-sha-256", "publicKey": "0205a8ad0c1dbc515f149af377981aab58b836af008d4d7ab21bd76faf80550b47" })!!"); CCSign(mtxTo, cond); - ASSERT_TRUE(Verify(cond)); + ASSERT_TRUE(CCVerify(mtxTo, cond)); ASSETCHAINS_CC = 0; - ASSERT_FALSE(Verify(cond)); + ASSERT_FALSE(CCVerify(mtxTo, cond)); } @@ -213,14 +197,6 @@ TEST_F(CCTest, testLargeCondition) ScriptError error; CMutableTransaction mtxTo; - auto Verify = [&] (const CC *cond) { - CAmount amount; - CTransaction txTo(mtxTo); - PrecomputedTransactionData txdata(txTo); - auto checker = ServerTransactionSignatureChecker(&txTo, 0, amount, false, txdata); - return VerifyScript(CCSig(cond), CCPubKey(cond), 0, checker, 0, &error); - }; - std::vector ccs; for (int i=0; i<18; i++) { ccs.push_back(CCNewSecp256k1(notaryKey.GetPubKey())); @@ -230,5 +206,5 @@ TEST_F(CCTest, testLargeCondition) EXPECT_EQ("(16 of 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,A5,A5)", CCShowStructure(CCPrune(cond))); EXPECT_EQ(1744, CCSig(cond).size()); - ASSERT_TRUE(Verify(cond)); + ASSERT_TRUE(CCVerify(mtxTo, cond)); } diff --git a/src/test-komodo/test_eval_bet.cpp b/src/test-komodo/test_eval_bet.cpp index 2529b4e46..6f41608b9 100644 --- a/src/test-komodo/test_eval_bet.cpp +++ b/src/test-komodo/test_eval_bet.cpp @@ -6,7 +6,7 @@ #include "base58.h" #include "key.h" #include "main.h" -#include "komodo_cc.h" +#include "script/cc.h" #include "primitives/transaction.h" #include "script/interpreter.h" #include "script/serverchecker.h" diff --git a/src/test-komodo/test_eval_notarisation.cpp b/src/test-komodo/test_eval_notarisation.cpp index e9cd7bea5..c33cc4686 100644 --- a/src/test-komodo/test_eval_notarisation.cpp +++ b/src/test-komodo/test_eval_notarisation.cpp @@ -7,7 +7,7 @@ #include "core_io.h" #include "key.h" #include "main.h" -#include "komodo_cc.h" +#include "script/cc.h" #include "primitives/transaction.h" #include "script/interpreter.h" #include "script/serverchecker.h" @@ -111,6 +111,8 @@ TEST(TestEvalNotarisation, testGetNotarisation) MoMProof proof; E_UNMARSHAL(vMomProof, ss >> proof); + printf("lb:%lu\n", proof.branch.size()); + printf("%i, %s\n", proof.nIndex, proof.notarisationHash.GetHex().data()); EXPECT_EQ(data.MoM, proof.Exec(proofTxHash)); } diff --git a/src/test-komodo/testutils.h b/src/test-komodo/testutils.h index 7c38526a3..df8e88cd9 100644 --- a/src/test-komodo/testutils.h +++ b/src/test-komodo/testutils.h @@ -1,7 +1,7 @@ #ifndef TESTUTILS_H #define TESTUTILS_H -#include "komodo_cc.h" +#include "script/cc.h" #define VCH(a,b) std::vector(a, a + b) From 1f34df6b3f22a8f6f73257df0c334a5aca2272da Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 17:59:33 +0300 Subject: [PATCH 0899/1062] Test --- src/komodo_bitcoind.h | 3 +- src/komodo_gateway.h | 15 +++++---- src/wallet/rpcwallet.cpp | 70 ++++++++++++++++++++++------------------ 3 files changed, 49 insertions(+), 39 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 2cab956c3..f7d9af114 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -568,10 +568,9 @@ uint32_t komodo_txtime(uint64_t *valuep,uint256 hash,int32_t n) #endif hashBlock, true)) { - fprintf(stderr,"%s/v%d null GetTransaction locktime.%u\n",hash.ToString().c_str(),n,(uint32_t)tx.nLockTime); return(0); } - fprintf(stderr,"%s/v%d locktime.%u\n",hash.ToString().c_str(),n,(uint32_t)tx.nLockTime); + //fprintf(stderr,"%s/v%d locktime.%u\n",hash.ToString().c_str(),n,(uint32_t)tx.nLockTime); if ( n < tx.vout.size() ) *valuep = tx.vout[n].nValue; return(tx.nLockTime); diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 773d35402..e002711ac 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -670,14 +670,15 @@ uint64_t komodo_commission(const CBlock &block) return((total * ASSETCHAINS_COMMISSION) / COIN); } -int32_t komodo_stake(int32_t nHeight,uint256 hash,int32_t n,uint32_t blocktime,uint32_t prevtime) +uint32_t komodo_stake(int32_t nHeight,uint256 hash,int32_t n,uint32_t blocktime,uint32_t prevtime) { - uint32_t txtime,minutes; uint64_t value; + uint32_t txtime,minutes; uint64_t value,hit; txtime = komodo_txtime(&value,hash,n); minutes = (blocktime - txtime) / 60; - fprintf(stderr,"ht.%d txtime.%u blocktime.%u prev.%u gap.%d minutes.%d %.8f\n",nHeight,txtime,blocktime,prevtime,(int32_t)(blocktime - prevtime),minutes,dstr(value)); + hit = value / (blocktime - txtime); + fprintf(stderr,"hit.%llu ht.%d txtime.%u blocktime.%u prev.%u gap.%d minutes.%d %.8f\n",(long long)hit,nHeight,txtime,blocktime,prevtime,(int32_t)(blocktime - prevtime),minutes,dstr(value)); if ( nHeight < 200 ) - return(1); + return(blocktime); else return(0); } @@ -753,13 +754,15 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtim { if ( ASSETCHAINS_STAKED != 0 ) { - CBlockIndex *previndex; + CBlockIndex *previndex; uint32_t eligible; if ( prevtime == 0 ) { if ( (previndex= mapBlockIndex[block.hashPrevBlock]) != 0 ) prevtime = (uint32_t)previndex->nTime; } - komodo_stake(height,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n,block.nTime,prevtime); + eligible = komodo_stake(height,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n,block.nTime,prevtime); + if ( eligible > block.nTime ) + fprintf(stderr,"eligible.%u vs blocktime.%u, lag.%d\n",eligible,(uint32_t)block.nTime,(int32_t)(eligible - block.nTime)); } if ( ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 && ASSETCHAINS_COMMISSION != 0 && block.vtx[0].vout.size() > 1 ) { diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 393b5afbe..60c1aa7be 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4439,11 +4439,11 @@ UniValue z_listoperationids(const UniValue& params, bool fHelp) #include "script/sign.h" int32_t decode_hex(uint8_t *bytes,int32_t n,char *hex); extern std::string NOTARY_PUBKEY; -int32_t komodo_stake(int32_t nHeight,uint256 hash,int32_t n,uint32_t blocktime,uint32_t prevtime); +uint32_t komodo_stake(int32_t nHeight,uint256 hash,int32_t n,uint32_t blocktime,uint32_t prevtime); int32_t komodo_staked(uint32_t *blocktimep,uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig) { - set setAddress; int32_t i,siglen=0,nMinDepth = 1,nMaxDepth = 9999999; vector vecOutputs; + set setAddress; int32_t i,siglen=0,nMinDepth = 1,nMaxDepth = 9999999; vector vecOutputs; const COutput& best; uint32_t earliest = 0; assert(pwalletMain != NULL); LOCK2(cs_main, pwalletMain->cs_wallet); *utxovaluep = 0; @@ -4466,10 +4466,6 @@ int32_t komodo_staked(uint32_t *blocktimep,uint32_t *txtimep,uint256 *utxotxidp, CAmount nValue = out.tx->vout[out.i].nValue; const CScript& pk = out.tx->vout[out.i].scriptPubKey; //entry.push_back(Pair("generated", out.tx->IsCoinBase())); - *utxovaluep = (uint64_t)nValue; - decode_hex((uint8_t *)utxotxidp,32,(char *)out.tx->GetHash().GetHex().c_str()); - *utxovoutp = out.i; - *txtimep = (uint32_t)out.tx->nLockTime; CTxDestination address; if (ExtractDestination(out.tx->vout[out.i].scriptPubKey, address)) { @@ -4499,35 +4495,47 @@ int32_t komodo_staked(uint32_t *blocktimep,uint32_t *txtimep,uint256 *utxotxidp, komodo_accrued_interest(&txheight,&locktime,out.tx->GetHash(),out.i,0,nValue,(int32_t)tipindex->nHeight); interest = komodo_interest(txheight,nValue,out.tx->nLockTime,tipindex->nTime); //entry.push_back(Pair("interest",ValueFromAmount(interest))); - komodo_stake((uint32_t)tipindex->nHeight+1,out.tx->GetHash(),out.i,*blocktimep,(uint32_t)tipindex->nTime); + eligible = komodo_stake((uint32_t)tipindex->nHeight+1,out.tx->GetHash(),out.i,*blocktimep,(uint32_t)tipindex->nTime); + if ( eligible > 0 && eligible < earliest ) + { + earliest = eligible; + best = out; + *utxovaluep = (uint64_t)nValue; + decode_hex((uint8_t *)utxotxidp,32,(char *)out.tx->GetHash().GetHex().c_str()); + *utxovoutp = out.i; + *txtimep = (uint32_t)out.tx->nLockTime; + } } //fprintf(stderr,"(%s) %s/v%d nValue %.8f locktime.%u txheight.%d pindexht.%d\n",CBitcoinAddress(address).ToString().c_str(),out.tx->GetHash().GetHex().c_str(),out.i,(double)nValue/COIN,locktime,txheight,pindex->nHeight); } - bool signSuccess; SignatureData sigdata; uint64_t txfee; uint8_t *ptr; uint256 revtxid,utxotxid; - auto consensusBranchId = CurrentEpochBranchId(chainActive.Height() + 1, Params().GetConsensus()); - const CKeyStore& keystore = *pwalletMain; - CMutableTransaction txNew = CreateNewContextualCMutableTransaction(Params().GetConsensus(), chainActive.Height() + 1); - txNew.vin.resize(1); - txNew.vout.resize(1); - txfee = 0; - for (i=0; i<32; i++) - ((uint8_t *)&revtxid)[i] = ((uint8_t *)utxotxidp)[31 - i]; - txNew.vin[0].prevout.hash = revtxid; - txNew.vin[0].prevout.n = *utxovoutp; - txNew.vout[0].scriptPubKey = CScript() << ParseHex(NOTARY_PUBKEY) << OP_CHECKSIG; - txNew.vout[0].nValue = nValue - txfee; - txNew.nLockTime = *blocktimep; - CTransaction txNewConst(txNew); - signSuccess = ProduceSignature(TransactionSignatureCreator(&keystore, &txNewConst, 0, nValue, SIGHASH_ALL), out.tx->vout[out.i].scriptPubKey, sigdata, consensusBranchId); - if (!signSuccess) - fprintf(stderr,"failed to create signature\n"); - else + if ( earliest != 0 ) { - ptr = (uint8_t *)sigdata.scriptSig.data(); - siglen = sigdata.scriptSig.size(); - for (i=0; ivout[best.i].scriptPubKey, sigdata, consensusBranchId); + if (!signSuccess) + fprintf(stderr,"failed to create signature\n"); + else + { + ptr = (uint8_t *)sigdata.scriptSig.data(); + siglen = sigdata.scriptSig.size(); + for (i=0; i Date: Mon, 9 Apr 2018 18:02:28 +0300 Subject: [PATCH 0900/1062] Test --- src/wallet/rpcwallet.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 60c1aa7be..88454da8d 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4443,10 +4443,11 @@ uint32_t komodo_stake(int32_t nHeight,uint256 hash,int32_t n,uint32_t blocktime, int32_t komodo_staked(uint32_t *blocktimep,uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig) { - set setAddress; int32_t i,siglen=0,nMinDepth = 1,nMaxDepth = 9999999; vector vecOutputs; const COutput& best; uint32_t earliest = 0; + set setAddress; int32_t i,siglen=0,nMinDepth = 1,nMaxDepth = 9999999; vector vecOutputs; const COutpu best; uint32_t eligible,earliest = 0; assert(pwalletMain != NULL); LOCK2(cs_main, pwalletMain->cs_wallet); *utxovaluep = 0; + memset(&best,0,sizeof(best)); memset(utxotxidp,0,sizeof(*utxotxidp)); memset(utxovoutp,0,sizeof(*utxovoutp)); memset(utxosig,0,72); @@ -4492,9 +4493,6 @@ int32_t komodo_staked(uint32_t *blocktimep,uint32_t *txtimep,uint256 *utxotxidp, uint64_t interest; uint32_t locktime; int32_t txheight; if ( pindex != 0 && (tipindex= chainActive.Tip()) != 0 ) { - komodo_accrued_interest(&txheight,&locktime,out.tx->GetHash(),out.i,0,nValue,(int32_t)tipindex->nHeight); - interest = komodo_interest(txheight,nValue,out.tx->nLockTime,tipindex->nTime); - //entry.push_back(Pair("interest",ValueFromAmount(interest))); eligible = komodo_stake((uint32_t)tipindex->nHeight+1,out.tx->GetHash(),out.i,*blocktimep,(uint32_t)tipindex->nTime); if ( eligible > 0 && eligible < earliest ) { From ebcb53068f0c88b536012281d100ee8834d2e904 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 18:03:28 +0300 Subject: [PATCH 0901/1062] Test --- src/wallet/rpcwallet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 88454da8d..b8a0a87de 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4443,7 +4443,7 @@ uint32_t komodo_stake(int32_t nHeight,uint256 hash,int32_t n,uint32_t blocktime, int32_t komodo_staked(uint32_t *blocktimep,uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig) { - set setAddress; int32_t i,siglen=0,nMinDepth = 1,nMaxDepth = 9999999; vector vecOutputs; const COutpu best; uint32_t eligible,earliest = 0; + set setAddress; int32_t i,siglen=0,nMinDepth = 1,nMaxDepth = 9999999; vector vecOutputs; COutput best; uint32_t eligible,earliest = 0; assert(pwalletMain != NULL); LOCK2(cs_main, pwalletMain->cs_wallet); *utxovaluep = 0; From df643d5cd7d11ce2fda8090ea64b81e54668b462 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 18:06:37 +0300 Subject: [PATCH 0902/1062] Test --- src/wallet/rpcwallet.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index b8a0a87de..5d3feeeb0 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4443,11 +4443,10 @@ uint32_t komodo_stake(int32_t nHeight,uint256 hash,int32_t n,uint32_t blocktime, int32_t komodo_staked(uint32_t *blocktimep,uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig) { - set setAddress; int32_t i,siglen=0,nMinDepth = 1,nMaxDepth = 9999999; vector vecOutputs; COutput best; uint32_t eligible,earliest = 0; + set setAddress; int32_t i,siglen=0,nMinDepth = 1,nMaxDepth = 9999999; vector vecOutputs; uint32_t eligible,earliest = 0; CScript best_scriptPubkey; assert(pwalletMain != NULL); LOCK2(cs_main, pwalletMain->cs_wallet); *utxovaluep = 0; - memset(&best,0,sizeof(best)); memset(utxotxidp,0,sizeof(*utxotxidp)); memset(utxovoutp,0,sizeof(*utxovoutp)); memset(utxosig,0,72); @@ -4497,7 +4496,7 @@ int32_t komodo_staked(uint32_t *blocktimep,uint32_t *txtimep,uint256 *utxotxidp, if ( eligible > 0 && eligible < earliest ) { earliest = eligible; - best = out; + best_scriptPubkey = out.tx->vout[out.i].scriptPubKey; *utxovaluep = (uint64_t)nValue; decode_hex((uint8_t *)utxotxidp,32,(char *)out.tx->GetHash().GetHex().c_str()); *utxovoutp = out.i; @@ -4523,7 +4522,7 @@ int32_t komodo_staked(uint32_t *blocktimep,uint32_t *txtimep,uint256 *utxotxidp, txNew.vout[0].nValue = nValue - txfee; txNew.nLockTime = *blocktimep; CTransaction txNewConst(txNew); - signSuccess = ProduceSignature(TransactionSignatureCreator(&keystore, &txNewConst, 0, nValue, SIGHASH_ALL), best.tx->vout[best.i].scriptPubKey, sigdata, consensusBranchId); + signSuccess = ProduceSignature(TransactionSignatureCreator(&keystore, &txNewConst, 0, nValue, SIGHASH_ALL), best_scriptPubKey, sigdata, consensusBranchId); if (!signSuccess) fprintf(stderr,"failed to create signature\n"); else From 9159a0408bfbc53b994caaa1cdcce1872bd4fc80 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 18:07:58 +0300 Subject: [PATCH 0903/1062] Test --- src/wallet/rpcwallet.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 5d3feeeb0..f208635ff 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4443,7 +4443,7 @@ uint32_t komodo_stake(int32_t nHeight,uint256 hash,int32_t n,uint32_t blocktime, int32_t komodo_staked(uint32_t *blocktimep,uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig) { - set setAddress; int32_t i,siglen=0,nMinDepth = 1,nMaxDepth = 9999999; vector vecOutputs; uint32_t eligible,earliest = 0; CScript best_scriptPubkey; + set setAddress; int32_t i,siglen=0,nMinDepth = 1,nMaxDepth = 9999999; vector vecOutputs; uint32_t eligible,earliest = 0; CScript best_scriptPubKey; assert(pwalletMain != NULL); LOCK2(cs_main, pwalletMain->cs_wallet); *utxovaluep = 0; @@ -4496,7 +4496,7 @@ int32_t komodo_staked(uint32_t *blocktimep,uint32_t *txtimep,uint256 *utxotxidp, if ( eligible > 0 && eligible < earliest ) { earliest = eligible; - best_scriptPubkey = out.tx->vout[out.i].scriptPubKey; + best_scriptPubKey = out.tx->vout[out.i].scriptPubKey; *utxovaluep = (uint64_t)nValue; decode_hex((uint8_t *)utxotxidp,32,(char *)out.tx->GetHash().GetHex().c_str()); *utxovoutp = out.i; From 39e050579014fa89308de9b72269b39545b23544 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 18:24:11 +0300 Subject: [PATCH 0904/1062] Test --- src/komodo_gateway.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index e002711ac..232a78eb1 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -672,11 +672,11 @@ uint64_t komodo_commission(const CBlock &block) uint32_t komodo_stake(int32_t nHeight,uint256 hash,int32_t n,uint32_t blocktime,uint32_t prevtime) { - uint32_t txtime,minutes; uint64_t value,hit; + uint32_t txtime,minutes; uint64_t value,coinage; txtime = komodo_txtime(&value,hash,n); minutes = (blocktime - txtime) / 60; - hit = value / (blocktime - txtime); - fprintf(stderr,"hit.%llu ht.%d txtime.%u blocktime.%u prev.%u gap.%d minutes.%d %.8f\n",(long long)hit,nHeight,txtime,blocktime,prevtime,(int32_t)(blocktime - prevtime),minutes,dstr(value)); + coinage = value * (blocktime - txtime); + fprintf(stderr,"coinage.%llu ht.%d txtime.%u blocktime.%u prev.%u gap.%d minutes.%d %.8f\n",(long long)coinage,nHeight,txtime,blocktime,prevtime,(int32_t)(blocktime - prevtime),minutes,dstr(value)); if ( nHeight < 200 ) return(blocktime); else return(0); From 8a29624f4ce98d017449b8a694e21563686e454c Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Mon, 9 Apr 2018 12:36:43 -0300 Subject: [PATCH 0905/1062] remove stray printf --- src/test-komodo/test_eval_notarisation.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/test-komodo/test_eval_notarisation.cpp b/src/test-komodo/test_eval_notarisation.cpp index c33cc4686..86d5f58c4 100644 --- a/src/test-komodo/test_eval_notarisation.cpp +++ b/src/test-komodo/test_eval_notarisation.cpp @@ -111,8 +111,6 @@ TEST(TestEvalNotarisation, testGetNotarisation) MoMProof proof; E_UNMARSHAL(vMomProof, ss >> proof); - printf("lb:%lu\n", proof.branch.size()); - printf("%i, %s\n", proof.nIndex, proof.notarisationHash.GetHex().data()); EXPECT_EQ(data.MoM, proof.Exec(proofTxHash)); } From add7f889fd862c0825afde268778e401f6ff53ca Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 18:38:38 +0300 Subject: [PATCH 0906/1062] Test --- src/komodo_gateway.h | 2 ++ src/wallet/rpcwallet.cpp | 27 ++++++++++++--------------- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 232a78eb1..e1c8ec4fd 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -675,6 +675,8 @@ uint32_t komodo_stake(int32_t nHeight,uint256 hash,int32_t n,uint32_t blocktime, uint32_t txtime,minutes; uint64_t value,coinage; txtime = komodo_txtime(&value,hash,n); minutes = (blocktime - txtime) / 60; + if ( txtime == 0 ) + txtime = prevtime; coinage = value * (blocktime - txtime); fprintf(stderr,"coinage.%llu ht.%d txtime.%u blocktime.%u prev.%u gap.%d minutes.%d %.8f\n",(long long)coinage,nHeight,txtime,blocktime,prevtime,(int32_t)(blocktime - prevtime),minutes,dstr(value)); if ( nHeight < 200 ) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index f208635ff..9954456fd 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4485,23 +4485,20 @@ int32_t komodo_staked(uint32_t *blocktimep,uint32_t *txtimep,uint256 *utxotxidp, } } entry.push_back(Pair("amount",ValueFromAmount(nValue)));*/ - if ( out.tx->nLockTime != 0 ) + BlockMap::iterator it = mapBlockIndex.find(pcoinsTip->GetBestBlock()); + CBlockIndex *tipindex,*pindex = it->second; + uint64_t interest; uint32_t locktime; int32_t txheight; + if ( pindex != 0 && (tipindex= chainActive.Tip()) != 0 ) { - BlockMap::iterator it = mapBlockIndex.find(pcoinsTip->GetBestBlock()); - CBlockIndex *tipindex,*pindex = it->second; - uint64_t interest; uint32_t locktime; int32_t txheight; - if ( pindex != 0 && (tipindex= chainActive.Tip()) != 0 ) + eligible = komodo_stake((uint32_t)tipindex->nHeight+1,out.tx->GetHash(),out.i,*blocktimep,(uint32_t)tipindex->nTime); + if ( eligible > 0 && eligible < earliest ) { - eligible = komodo_stake((uint32_t)tipindex->nHeight+1,out.tx->GetHash(),out.i,*blocktimep,(uint32_t)tipindex->nTime); - if ( eligible > 0 && eligible < earliest ) - { - earliest = eligible; - best_scriptPubKey = out.tx->vout[out.i].scriptPubKey; - *utxovaluep = (uint64_t)nValue; - decode_hex((uint8_t *)utxotxidp,32,(char *)out.tx->GetHash().GetHex().c_str()); - *utxovoutp = out.i; - *txtimep = (uint32_t)out.tx->nLockTime; - } + earliest = eligible; + best_scriptPubKey = out.tx->vout[out.i].scriptPubKey; + *utxovaluep = (uint64_t)nValue; + decode_hex((uint8_t *)utxotxidp,32,(char *)out.tx->GetHash().GetHex().c_str()); + *utxovoutp = out.i; + *txtimep = (uint32_t)out.tx->nLockTime; } //fprintf(stderr,"(%s) %s/v%d nValue %.8f locktime.%u txheight.%d pindexht.%d\n",CBitcoinAddress(address).ToString().c_str(),out.tx->GetHash().GetHex().c_str(),out.i,(double)nValue/COIN,locktime,txheight,pindex->nHeight); } From a2cc707b5433bbe343fc0330bd53d8a8d7d83001 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 18:44:52 +0300 Subject: [PATCH 0907/1062] Test --- src/komodo_gateway.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index e1c8ec4fd..901fb6487 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -678,7 +678,7 @@ uint32_t komodo_stake(int32_t nHeight,uint256 hash,int32_t n,uint32_t blocktime, if ( txtime == 0 ) txtime = prevtime; coinage = value * (blocktime - txtime); - fprintf(stderr,"coinage.%llu ht.%d txtime.%u blocktime.%u prev.%u gap.%d minutes.%d %.8f\n",(long long)coinage,nHeight,txtime,blocktime,prevtime,(int32_t)(blocktime - prevtime),minutes,dstr(value)); + fprintf(stderr,"coinage.%llu %d ht.%d txtime.%u blocktime.%u prev.%u gap.%d minutes.%d %.8f\n",(long long)coinage,(int32_t)(blocktime - txtime),nHeight,txtime,blocktime,prevtime,(int32_t)(blocktime - prevtime),minutes,dstr(value)); if ( nHeight < 200 ) return(blocktime); else return(0); From f65cd56ff25f590939b8da748a90c7fa146413da Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 18:49:38 +0300 Subject: [PATCH 0908/1062] Test --- src/komodo_gateway.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 901fb6487..99657dfec 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -672,13 +672,13 @@ uint64_t komodo_commission(const CBlock &block) uint32_t komodo_stake(int32_t nHeight,uint256 hash,int32_t n,uint32_t blocktime,uint32_t prevtime) { - uint32_t txtime,minutes; uint64_t value,coinage; + uint32_t txtime,minutes; uint64_t value,coinage,supply = ASSETCHAINS_SUPPLY*SATOSHIDEN + nHeight*ASSETCHAINS_REWARD; txtime = komodo_txtime(&value,hash,n); minutes = (blocktime - txtime) / 60; if ( txtime == 0 ) txtime = prevtime; - coinage = value * (blocktime - txtime); - fprintf(stderr,"coinage.%llu %d ht.%d txtime.%u blocktime.%u prev.%u gap.%d minutes.%d %.8f\n",(long long)coinage,(int32_t)(blocktime - txtime),nHeight,txtime,blocktime,prevtime,(int32_t)(blocktime - prevtime),minutes,dstr(value)); + coinage = value * (blocktime - txtime) * value / supply; + fprintf(stderr,"coinage.%llu %d ht.%d txtime.%u blocktime.%u prev.%u gap.%d minutes.%d %.8f.%.8f\n",(long long)coinage,(int32_t)(blocktime - txtime),nHeight,txtime,blocktime,prevtime,(int32_t)(blocktime - prevtime),minutes,dstr(value),dstr(supply)); if ( nHeight < 200 ) return(blocktime); else return(0); From 97dfa23436a2450d09687b90beddc5cf55192022 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 18:52:59 +0300 Subject: [PATCH 0909/1062] Test --- src/komodo_gateway.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 99657dfec..c5f5b0f5c 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -672,12 +672,12 @@ uint64_t komodo_commission(const CBlock &block) uint32_t komodo_stake(int32_t nHeight,uint256 hash,int32_t n,uint32_t blocktime,uint32_t prevtime) { - uint32_t txtime,minutes; uint64_t value,coinage,supply = ASSETCHAINS_SUPPLY*SATOSHIDEN + nHeight*ASSETCHAINS_REWARD; + uint32_t txtime,minutes; uint64_t value,coinage,supply = ASSETCHAINS_SUPPLY + nHeight*ASSETCHAINS_REWARD/SATOSHIDEN; txtime = komodo_txtime(&value,hash,n); minutes = (blocktime - txtime) / 60; if ( txtime == 0 ) txtime = prevtime; - coinage = value * (blocktime - txtime) * value / supply; + coinage = value * (blocktime - txtime) / supply; fprintf(stderr,"coinage.%llu %d ht.%d txtime.%u blocktime.%u prev.%u gap.%d minutes.%d %.8f.%.8f\n",(long long)coinage,(int32_t)(blocktime - txtime),nHeight,txtime,blocktime,prevtime,(int32_t)(blocktime - prevtime),minutes,dstr(value),dstr(supply)); if ( nHeight < 200 ) return(blocktime); From d16afe20169cc87c5fa4eadfbe1ca34e859e8361 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 18:57:37 +0300 Subject: [PATCH 0910/1062] Test --- src/komodo_gateway.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index c5f5b0f5c..8a026e239 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -678,7 +678,7 @@ uint32_t komodo_stake(int32_t nHeight,uint256 hash,int32_t n,uint32_t blocktime, if ( txtime == 0 ) txtime = prevtime; coinage = value * (blocktime - txtime) / supply; - fprintf(stderr,"coinage.%llu %d ht.%d txtime.%u blocktime.%u prev.%u gap.%d minutes.%d %.8f.%.8f\n",(long long)coinage,(int32_t)(blocktime - txtime),nHeight,txtime,blocktime,prevtime,(int32_t)(blocktime - prevtime),minutes,dstr(value),dstr(supply)); + fprintf(stderr,"coinage.%llu %d ht.%d txtime.%u blocktime.%u prev.%u gap.%d minutes.%d %.8f/%llu\n",(long long)coinage,(int32_t)(blocktime - txtime),nHeight,txtime,blocktime,prevtime,(int32_t)(blocktime - prevtime),minutes,dstr(value),(long long)supply); if ( nHeight < 200 ) return(blocktime); else return(0); From 357e4ca5f0ea40e93912b90e6c3b5ae90b6738a6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 19:33:50 +0300 Subject: [PATCH 0911/1062] Test --- src/komodo_gateway.h | 32 +++++++++++++++++++++++--------- src/miner.cpp | 11 +++++++---- src/wallet/rpcwallet.cpp | 9 +++++---- 3 files changed, 35 insertions(+), 17 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 8a026e239..3a6f97af6 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -670,18 +670,31 @@ uint64_t komodo_commission(const CBlock &block) return((total * ASSETCHAINS_COMMISSION) / COIN); } -uint32_t komodo_stake(int32_t nHeight,uint256 hash,int32_t n,uint32_t blocktime,uint32_t prevtime) +uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 hash,int32_t n,uint32_t blocktime,uint32_t prevtime) { - uint32_t txtime,minutes; uint64_t value,coinage,supply = ASSETCHAINS_SUPPLY + nHeight*ASSETCHAINS_REWARD/SATOSHIDEN; + CBlockIndex *pindex; arith_uint256 hashval; uint256 hash; int32_t i; uint32_t txtime,minutes,winner = 0; uint64_t value,coinage,supply = ASSETCHAINS_SUPPLY + nHeight*ASSETCHAINS_REWARD/SATOSHIDEN; + if ( nHeight < 200 ) + return(blocktime); txtime = komodo_txtime(&value,hash,n); minutes = (blocktime - txtime) / 60; if ( txtime == 0 ) txtime = prevtime; - coinage = value * (blocktime - txtime) / supply; - fprintf(stderr,"coinage.%llu %d ht.%d txtime.%u blocktime.%u prev.%u gap.%d minutes.%d %.8f/%llu\n",(long long)coinage,(int32_t)(blocktime - txtime),nHeight,txtime,blocktime,prevtime,(int32_t)(blocktime - prevtime),minutes,dstr(value),(long long)supply); - if ( nHeight < 200 ) - return(blocktime); - else return(0); + if ( (pindex= komodo_chainactive(nHeight-200)) != 0 ) + { + coinage = value * (blocktime - txtime) / supply; + hash = pindex->GetBlockHash(); // hash pubkey + hashval = UintToArith256(hash); + hashval = (hashval / arith_uint256(coinage+1)); + if ( hashval <= bnTarget ) + winner = 1; + for (i=31; i>=0; i--) + printf("%02x",((uint8_t *)&hashval)[i]); + printf(" vs "); + for (i=31; i>=0; i--) + printf("%02x",((uint8_t *)&bnTarget)[i]); + fprintf(stderr," winner.%d %s coinage.%llu %d ht.%d gap.%d minutes.%d %.8f/%llu\n",winner,(long long)coinage,(int32_t)(blocktime - txtime),nHeight,(int32_t)(blocktime - prevtime),minutes,dstr(value),(long long)supply); + } + return(0); } int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtime) // verify above block is valid pax pricing @@ -756,13 +769,14 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtim { if ( ASSETCHAINS_STAKED != 0 ) { - CBlockIndex *previndex; uint32_t eligible; + arith_uint256 bnTarget; bool fNegative,fOverflow; CBlockIndex *previndex; uint32_t eligible; if ( prevtime == 0 ) { if ( (previndex= mapBlockIndex[block.hashPrevBlock]) != 0 ) prevtime = (uint32_t)previndex->nTime; } - eligible = komodo_stake(height,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n,block.nTime,prevtime); + bnTarget.SetCompact(block.nBits, &fNegative, &fOverflow); + eligible = komodo_stake(height,bnTarget,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n,block.nTime,prevtime); if ( eligible > block.nTime ) fprintf(stderr,"eligible.%u vs blocktime.%u, lag.%d\n",eligible,(uint32_t)block.nTime,(int32_t)(eligible - block.nTime)); } diff --git a/src/miner.cpp b/src/miner.cpp index 1c948e124..adc562bdf 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -120,7 +120,7 @@ int32_t komodo_gateway_deposits(CMutableTransaction *txNew,char *symbol,int32_t int32_t komodo_isrealtime(int32_t *kmdheightp); int32_t komodo_validate_interest(const CTransaction &tx,int32_t txheight,uint32_t nTime,int32_t dispflag); uint64_t komodo_commission(const CBlock &block); -int32_t komodo_staked(uint32_t *blocktimep,uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig); +int32_t komodo_staked(uint32_t nBits,uint32_t *blocktimep,uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig); CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) { @@ -385,7 +385,9 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) nLastBlockTx = nBlockTx; nLastBlockSize = nBlockSize; blocktime = std::max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime()); - LogPrintf("CreateNewBlock(): total size %u blocktime.%u\n", nBlockSize,blocktime); + pblock->nTime = blocktime; + pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, Params().GetConsensus()); + LogPrintf("CreateNewBlock(): total size %u blocktime.%u nBits.%08x\n", nBlockSize,blocktime,pblock->nBits); if ( ASSETCHAINS_SYMBOL[0] != 0 && ASSETCHAINS_STAKED != 0 && NOTARY_PUBKEY33[0] != 0 ) { uint64_t txfees,utxovalue; uint32_t txtime; uint256 utxotxid,revtxid; int32_t i,siglen,numsigs,utxovout; uint8_t utxosig[128],*ptr; @@ -480,7 +482,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) pblock->hashPrevBlock = pindexPrev->GetBlockHash(); pblock->hashReserved = uint256(); //UpdateTime(pblock, Params().GetConsensus(), pindexPrev); - pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, Params().GetConsensus()); + //pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, Params().GetConsensus()); pblock->nSolution.clear(); pblocktemplate->vTxSigOps[0] = GetLegacySigOpCount(pblock->vtx[0]); @@ -1033,7 +1035,8 @@ void static BitcoinMiner() // Update nNonce and nTime pblock->nNonce = ArithToUint256(UintToArith256(pblock->nNonce) + 1); pblock->nBits = savebits; - UpdateTime(pblock, chainparams.GetConsensus(), pindexPrev); + if ( ASSETCHAINS_STAKED == 0 ) + UpdateTime(pblock, chainparams.GetConsensus(), pindexPrev); if (chainparams.GetConsensus().fPowAllowMinDifficultyBlocks) { // Changing pblock->nTime can change work required on testnet: diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 9954456fd..53e3fdeff 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4439,11 +4439,12 @@ UniValue z_listoperationids(const UniValue& params, bool fHelp) #include "script/sign.h" int32_t decode_hex(uint8_t *bytes,int32_t n,char *hex); extern std::string NOTARY_PUBKEY; -uint32_t komodo_stake(int32_t nHeight,uint256 hash,int32_t n,uint32_t blocktime,uint32_t prevtime); +uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 hash,int32_t n,uint32_t blocktime,uint32_t prevtime); -int32_t komodo_staked(uint32_t *blocktimep,uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig) +int32_t komodo_staked(uint32_t nBits,uint32_t *blocktimep,uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig) { - set setAddress; int32_t i,siglen=0,nMinDepth = 1,nMaxDepth = 9999999; vector vecOutputs; uint32_t eligible,earliest = 0; CScript best_scriptPubKey; + set setAddress; int32_t i,siglen=0,nMinDepth = 1,nMaxDepth = 9999999; vector vecOutputs; uint32_t eligible,earliest = 0; CScript best_scriptPubKey; arith_uint256 bnTarget; bool fNegative,fOverflow; + bnTarget.SetCompact(nBits, &fNegative, &fOverflow); assert(pwalletMain != NULL); LOCK2(cs_main, pwalletMain->cs_wallet); *utxovaluep = 0; @@ -4490,7 +4491,7 @@ int32_t komodo_staked(uint32_t *blocktimep,uint32_t *txtimep,uint256 *utxotxidp, uint64_t interest; uint32_t locktime; int32_t txheight; if ( pindex != 0 && (tipindex= chainActive.Tip()) != 0 ) { - eligible = komodo_stake((uint32_t)tipindex->nHeight+1,out.tx->GetHash(),out.i,*blocktimep,(uint32_t)tipindex->nTime); + eligible = komodo_stake(bnTarget,(uint32_t)tipindex->nHeight+1,out.tx->GetHash(),out.i,*blocktimep,(uint32_t)tipindex->nTime); if ( eligible > 0 && eligible < earliest ) { earliest = eligible; From 42673bc0722b84ec03c270b68952cf28679a7625 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 19:34:56 +0300 Subject: [PATCH 0912/1062] Test --- src/komodo_gateway.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 3a6f97af6..44abafa92 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -776,7 +776,7 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtim prevtime = (uint32_t)previndex->nTime; } bnTarget.SetCompact(block.nBits, &fNegative, &fOverflow); - eligible = komodo_stake(height,bnTarget,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n,block.nTime,prevtime); + eligible = komodo_stake(bnTarget,height,bnTarget,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n,block.nTime,prevtime); if ( eligible > block.nTime ) fprintf(stderr,"eligible.%u vs blocktime.%u, lag.%d\n",eligible,(uint32_t)block.nTime,(int32_t)(eligible - block.nTime)); } From 66b30bbc39c4bf0b847e986c742c7d42b44b3cf1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 19:35:48 +0300 Subject: [PATCH 0913/1062] Test --- src/komodo_gateway.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 44abafa92..9541f1949 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -670,12 +670,12 @@ uint64_t komodo_commission(const CBlock &block) return((total * ASSETCHAINS_COMMISSION) / COIN); } -uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 hash,int32_t n,uint32_t blocktime,uint32_t prevtime) +uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_t vout,uint32_t blocktime,uint32_t prevtime) { CBlockIndex *pindex; arith_uint256 hashval; uint256 hash; int32_t i; uint32_t txtime,minutes,winner = 0; uint64_t value,coinage,supply = ASSETCHAINS_SUPPLY + nHeight*ASSETCHAINS_REWARD/SATOSHIDEN; if ( nHeight < 200 ) return(blocktime); - txtime = komodo_txtime(&value,hash,n); + txtime = komodo_txtime(&value,txid,vout); minutes = (blocktime - txtime) / 60; if ( txtime == 0 ) txtime = prevtime; From c59bdf3a8152f2d2dda593bdc0501cf3dd5b1ce1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 19:37:00 +0300 Subject: [PATCH 0914/1062] Test --- src/komodo_gateway.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 9541f1949..dc4a021f0 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -692,7 +692,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ printf(" vs "); for (i=31; i>=0; i--) printf("%02x",((uint8_t *)&bnTarget)[i]); - fprintf(stderr," winner.%d %s coinage.%llu %d ht.%d gap.%d minutes.%d %.8f/%llu\n",winner,(long long)coinage,(int32_t)(blocktime - txtime),nHeight,(int32_t)(blocktime - prevtime),minutes,dstr(value),(long long)supply); + fprintf(stderr," winner.%d coinage.%llu %d ht.%d gap.%d minutes.%d %.8f/%llu\n",winner,(long long)coinage,(int32_t)(blocktime - txtime),nHeight,(int32_t)(blocktime - prevtime),minutes,dstr(value),(long long)supply); } return(0); } From fd573503ba10d577bc165dac6f9f7dfadc53ed9d Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 19:40:22 +0300 Subject: [PATCH 0915/1062] Test --- src/komodo_gateway.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index dc4a021f0..3bfd0b58a 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -776,7 +776,7 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtim prevtime = (uint32_t)previndex->nTime; } bnTarget.SetCompact(block.nBits, &fNegative, &fOverflow); - eligible = komodo_stake(bnTarget,height,bnTarget,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n,block.nTime,prevtime); + eligible = komodo_stake(bnTarget,height,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n,block.nTime,prevtime); if ( eligible > block.nTime ) fprintf(stderr,"eligible.%u vs blocktime.%u, lag.%d\n",eligible,(uint32_t)block.nTime,(int32_t)(eligible - block.nTime)); } From acb3822ea063ff2317c6eadc07d1ccb56b66e7e5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 19:42:12 +0300 Subject: [PATCH 0916/1062] Test --- src/miner.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/miner.cpp b/src/miner.cpp index adc562bdf..5acd8da34 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -391,7 +391,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) if ( ASSETCHAINS_SYMBOL[0] != 0 && ASSETCHAINS_STAKED != 0 && NOTARY_PUBKEY33[0] != 0 ) { uint64_t txfees,utxovalue; uint32_t txtime; uint256 utxotxid,revtxid; int32_t i,siglen,numsigs,utxovout; uint8_t utxosig[128],*ptr; - if ( (siglen= komodo_staked(&blocktime,&txtime,&utxotxid,&utxovout,&utxovalue,utxosig)) > 0 ) + if ( (siglen= komodo_staked(pblock->nBits,&blocktime,&txtime,&utxotxid,&utxovout,&utxovalue,utxosig)) > 0 ) { CMutableTransaction txStaked = CreateNewContextualCMutableTransaction(chainparams.GetConsensus(), nHeight); CAmount txfees = 0; From aa789b4f24f1c102573c5eac54bd9f4d629ceae0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 19:46:18 +0300 Subject: [PATCH 0917/1062] Test --- src/komodo_gateway.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 3bfd0b58a..e52c27ac4 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -688,10 +688,10 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ if ( hashval <= bnTarget ) winner = 1; for (i=31; i>=0; i--) - printf("%02x",((uint8_t *)&hashval)[i]); - printf(" vs "); + fprintf(stderr,"%02x",((uint8_t *)&hashval)[i]); + fprintf(stderr," vs "); for (i=31; i>=0; i--) - printf("%02x",((uint8_t *)&bnTarget)[i]); + fprintf(stderr,"%02x",((uint8_t *)&bnTarget)[i]); fprintf(stderr," winner.%d coinage.%llu %d ht.%d gap.%d minutes.%d %.8f/%llu\n",winner,(long long)coinage,(int32_t)(blocktime - txtime),nHeight,(int32_t)(blocktime - prevtime),minutes,dstr(value),(long long)supply); } return(0); From 6eb0958c4d03eae1f2705f667d9cf947f7a5c4af Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 19:57:32 +0300 Subject: [PATCH 0918/1062] Test --- src/komodo_gateway.h | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index e52c27ac4..4e0257fff 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -672,21 +672,30 @@ uint64_t komodo_commission(const CBlock &block) uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_t vout,uint32_t blocktime,uint32_t prevtime) { - CBlockIndex *pindex; arith_uint256 hashval; uint256 hash; int32_t i; uint32_t txtime,minutes,winner = 0; uint64_t value,coinage,supply = ASSETCHAINS_SUPPLY + nHeight*ASSETCHAINS_REWARD/SATOSHIDEN; + CBlockIndex *pindex; arith_uint256 hashval; uint256 hash; int32_t i; uint32_t txtime,minutes,winner = 0; uint64_t diff,value,coinage,supply = ASSETCHAINS_SUPPLY + nHeight*ASSETCHAINS_REWARD/SATOSHIDEN; if ( nHeight < 200 ) return(blocktime); txtime = komodo_txtime(&value,txid,vout); minutes = (blocktime - txtime) / 60; if ( txtime == 0 ) txtime = prevtime; - if ( (pindex= komodo_chainactive(nHeight-200)) != 0 ) + if ( blocktime > txtime && (pindex= komodo_chainactive(nHeight-200)) != 0 ) { - coinage = value * (blocktime - txtime) / supply; + diff = (blocktime - txtime); + coinage = value * diff / supply; hash = pindex->GetBlockHash(); // hash pubkey hashval = UintToArith256(hash); hashval = (hashval / arith_uint256(coinage+1)); if ( hashval <= bnTarget ) winner = 1; + else + { + arith_uint256 val; + val = bnTarget * arith_uint256(value*diff/supply) / UintToArith256(hash) + for (i=31; i>=0; i--) + fprintf(stderr,"%02x",((uint8_t *)&val)[i]); + printf(" adjust val\n"); + } for (i=31; i>=0; i--) fprintf(stderr,"%02x",((uint8_t *)&hashval)[i]); fprintf(stderr," vs "); From dd5541420a60692d48d5fcd8d78e15a4b834110a Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 19:58:41 +0300 Subject: [PATCH 0919/1062] Test --- src/komodo_gateway.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 4e0257fff..17a62d990 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -691,7 +691,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ else { arith_uint256 val; - val = bnTarget * arith_uint256(value*diff/supply) / UintToArith256(hash) + val = bnTarget * arith_uint256(value*diff/supply) / UintToArith256(hash); for (i=31; i>=0; i--) fprintf(stderr,"%02x",((uint8_t *)&val)[i]); printf(" adjust val\n"); From 8e9ef91cf4b37998b77f8cb343d40dd9bc4ae276 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 20:06:19 +0300 Subject: [PATCH 0920/1062] Test --- src/miner.cpp | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/miner.cpp b/src/miner.cpp index 5acd8da34..69a7d240c 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -752,7 +752,7 @@ void static BitcoinMiner() Mining_height = pindexPrev->nHeight+1; Mining_start = (uint32_t)time(NULL); } - if ( ASSETCHAINS_SYMBOL[0] != 0 ) + if ( ASSETCHAINS_SYMBOL[0] != 0 && ASSETCHAINS_STAKED == 0 ) { //fprintf(stderr,"%s create new block ht.%d\n",ASSETCHAINS_SYMBOL,Mining_height); sleep(3); @@ -900,17 +900,26 @@ void static BitcoinMiner() // fprintf(stderr," missed target\n"); return false; } - if ( /*ASSETCHAINS_SYMBOL[0] == 0 &&*/ Mining_start != 0 && time(NULL) < Mining_start+roundrobin_delay ) + if ( ASSETCHAINS_STAKED == 0 ) { - //printf("Round robin diff sleep %d\n",(int32_t)(Mining_start+roundrobin_delay-time(NULL))); - int32_t nseconds = Mining_start+roundrobin_delay-time(NULL); - if ( nseconds > 0 ) - sleep(nseconds); - MilliSleep((rand() % 1700) + 1); + if ( Mining_start != 0 && time(NULL) < Mining_start+roundrobin_delay ) + { + //printf("Round robin diff sleep %d\n",(int32_t)(Mining_start+roundrobin_delay-time(NULL))); + int32_t nseconds = Mining_start+roundrobin_delay-time(NULL); + if ( nseconds > 0 ) + sleep(nseconds); + MilliSleep((rand() % 1700) + 1); + } + else if ( ASSETCHAINS_SYMBOL[0] != 0 ) + { + sleep(rand() % 30); + } } - else if ( ASSETCHAINS_SYMBOL[0] != 0 ) + else { - sleep(rand() % 30); + printf("need to wait %d seconds to submit\n",(int32_t)(pblock->nTime - GetAdjustedTime())); + while ( GetAdjustedTime() < pblock->nTime ) + sleep(1); } KOMODO_CHOSEN_ONE = 1; // Found a solution From ee2d6a73da2ad82348b0073077783b316eb9ade8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 20:07:45 +0300 Subject: [PATCH 0921/1062] Test --- src/komodo_gateway.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 17a62d990..353f8f72f 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -703,7 +703,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ fprintf(stderr,"%02x",((uint8_t *)&bnTarget)[i]); fprintf(stderr," winner.%d coinage.%llu %d ht.%d gap.%d minutes.%d %.8f/%llu\n",winner,(long long)coinage,(int32_t)(blocktime - txtime),nHeight,(int32_t)(blocktime - prevtime),minutes,dstr(value),(long long)supply); } - return(0); + return(blocktime * winner); } int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtime) // verify above block is valid pax pricing @@ -786,7 +786,7 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtim } bnTarget.SetCompact(block.nBits, &fNegative, &fOverflow); eligible = komodo_stake(bnTarget,height,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n,block.nTime,prevtime); - if ( eligible > block.nTime ) + if ( eligible == 0 || eligible > block.nTime ) fprintf(stderr,"eligible.%u vs blocktime.%u, lag.%d\n",eligible,(uint32_t)block.nTime,(int32_t)(eligible - block.nTime)); } if ( ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 && ASSETCHAINS_COMMISSION != 0 && block.vtx[0].vout.size() > 1 ) From 274f9fb365400f89dd81963f033892cfea941f02 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 20:14:41 +0300 Subject: [PATCH 0922/1062] Test --- src/komodo_gateway.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 353f8f72f..9b16c846e 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -682,7 +682,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ if ( blocktime > txtime && (pindex= komodo_chainactive(nHeight-200)) != 0 ) { diff = (blocktime - txtime); - coinage = value * diff / supply; + coinage = value * diff;// / supply; hash = pindex->GetBlockHash(); // hash pubkey hashval = UintToArith256(hash); hashval = (hashval / arith_uint256(coinage+1)); From 64eb9cb21d37cc983ae6b882d7039fb0e99aebc3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 20:21:15 +0300 Subject: [PATCH 0923/1062] Test --- src/komodo_gateway.h | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 9b16c846e..10edb63db 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -672,7 +672,7 @@ uint64_t komodo_commission(const CBlock &block) uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_t vout,uint32_t blocktime,uint32_t prevtime) { - CBlockIndex *pindex; arith_uint256 hashval; uint256 hash; int32_t i; uint32_t txtime,minutes,winner = 0; uint64_t diff,value,coinage,supply = ASSETCHAINS_SUPPLY + nHeight*ASSETCHAINS_REWARD/SATOSHIDEN; + CBlockIndex *pindex; arith_uint256 hashval; uint256 hash; int32_t i,j; uint32_t txtime,minutes,winner = 0; uint64_t diff,value,coinage,supply = ASSETCHAINS_SUPPLY + nHeight*ASSETCHAINS_REWARD/SATOSHIDEN; if ( nHeight < 200 ) return(blocktime); txtime = komodo_txtime(&value,txid,vout); @@ -681,11 +681,10 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ txtime = prevtime; if ( blocktime > txtime && (pindex= komodo_chainactive(nHeight-200)) != 0 ) { - diff = (blocktime - txtime); - coinage = value * diff;// / supply; hash = pindex->GetBlockHash(); // hash pubkey - hashval = UintToArith256(hash); - hashval = (hashval / arith_uint256(coinage+1)); + diff = (blocktime - txtime); + coinage = value * diff / supply; + hashval = (UintToArith256(hash) / arith_uint256(coinage+1)); if ( hashval <= bnTarget ) winner = 1; else @@ -694,7 +693,19 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ val = bnTarget * arith_uint256(value*diff/supply) / UintToArith256(hash); for (i=31; i>=0; i--) fprintf(stderr,"%02x",((uint8_t *)&val)[i]); - printf(" adjust val\n"); + fprintf(stderr," adjust val\n"); + for (i=1; i<3600; i++) + { + diff = (i + blocktime - txtime); + coinage = value * diff / supply; + hashval = (UintToArith256(hash) / arith_uint256(coinage+1)); + if ( hashval <= bnTarget ) + { + winner = 1; + break; + } + } + fprintf(stderr,"iterated until i.%d winner.%d\n",i,winner); } for (i=31; i>=0; i--) fprintf(stderr,"%02x",((uint8_t *)&hashval)[i]); From 41ed65c8381b7634d495175058ffd585f1c91d48 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 20:25:20 +0300 Subject: [PATCH 0924/1062] Test --- src/komodo_gateway.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 10edb63db..bf172052c 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -676,6 +676,8 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ if ( nHeight < 200 ) return(blocktime); txtime = komodo_txtime(&value,txid,vout); + if ( value == 0 ) + return(0); minutes = (blocktime - txtime) / 60; if ( txtime == 0 ) txtime = prevtime; @@ -684,7 +686,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ hash = pindex->GetBlockHash(); // hash pubkey diff = (blocktime - txtime); coinage = value * diff / supply; - hashval = (UintToArith256(hash) / arith_uint256(coinage+1)); + hashval = arith_uint256(1000000) * (UintToArith256(hash) / arith_uint256(coinage+1)); if ( hashval <= bnTarget ) winner = 1; else @@ -698,7 +700,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ { diff = (i + blocktime - txtime); coinage = value * diff / supply; - hashval = (UintToArith256(hash) / arith_uint256(coinage+1)); + hashval = arith_uint256(1000000) * (UintToArith256(hash) / arith_uint256(coinage+1)); if ( hashval <= bnTarget ) { winner = 1; From cb6b9bd10dec6f820a2c2361f721b24124f78d79 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 20:33:08 +0300 Subject: [PATCH 0925/1062] Test --- src/komodo_gateway.h | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index bf172052c..5008c1753 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -685,25 +685,21 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ { hash = pindex->GetBlockHash(); // hash pubkey diff = (blocktime - txtime); - coinage = value * diff / supply; + coinage = (value * diff * diff) / supply; hashval = arith_uint256(1000000) * (UintToArith256(hash) / arith_uint256(coinage+1)); if ( hashval <= bnTarget ) winner = 1; else { - arith_uint256 val; - val = bnTarget * arith_uint256(value*diff/supply) / UintToArith256(hash); - for (i=31; i>=0; i--) - fprintf(stderr,"%02x",((uint8_t *)&val)[i]); - fprintf(stderr," adjust val\n"); - for (i=1; i<3600; i++) + for (i=1; i<3600*8; i++) { diff = (i + blocktime - txtime); - coinage = value * diff / supply; + coinage = (value * diff * diff) / supply; hashval = arith_uint256(1000000) * (UintToArith256(hash) / arith_uint256(coinage+1)); if ( hashval <= bnTarget ) { winner = 1; + blocktime += i; break; } } From 7591c6aa4751baab61fd36726b1e66c7b63e045f Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 20:35:59 +0300 Subject: [PATCH 0926/1062] Test --- src/komodo_gateway.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 5008c1753..fdb30bb73 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -686,7 +686,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ hash = pindex->GetBlockHash(); // hash pubkey diff = (blocktime - txtime); coinage = (value * diff * diff) / supply; - hashval = arith_uint256(1000000) * (UintToArith256(hash) / arith_uint256(coinage+1)); + hashval = arith_uint256(100000000000) * (UintToArith256(hash) / arith_uint256(coinage+1)); if ( hashval <= bnTarget ) winner = 1; else @@ -695,7 +695,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ { diff = (i + blocktime - txtime); coinage = (value * diff * diff) / supply; - hashval = arith_uint256(1000000) * (UintToArith256(hash) / arith_uint256(coinage+1)); + hashval = arith_uint256(100000000000) * (UintToArith256(hash) / arith_uint256(coinage+1)); if ( hashval <= bnTarget ) { winner = 1; @@ -796,7 +796,9 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtim bnTarget.SetCompact(block.nBits, &fNegative, &fOverflow); eligible = komodo_stake(bnTarget,height,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n,block.nTime,prevtime); if ( eligible == 0 || eligible > block.nTime ) + { fprintf(stderr,"eligible.%u vs blocktime.%u, lag.%d\n",eligible,(uint32_t)block.nTime,(int32_t)(eligible - block.nTime)); + } } if ( ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 && ASSETCHAINS_COMMISSION != 0 && block.vtx[0].vout.size() > 1 ) { From 1ac4a10dbe986114695af9b5bb257649b6a942a1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 20:38:18 +0300 Subject: [PATCH 0927/1062] Test --- src/komodo_gateway.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index fdb30bb73..8238130ee 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -685,7 +685,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ { hash = pindex->GetBlockHash(); // hash pubkey diff = (blocktime - txtime); - coinage = (value * diff * diff) / supply; + coinage = (((value * diff) / supply) * diff) / supply; hashval = arith_uint256(100000000000) * (UintToArith256(hash) / arith_uint256(coinage+1)); if ( hashval <= bnTarget ) winner = 1; @@ -694,7 +694,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ for (i=1; i<3600*8; i++) { diff = (i + blocktime - txtime); - coinage = (value * diff * diff) / supply; + coinage = (((value * diff) / supply) * diff) / supply; hashval = arith_uint256(100000000000) * (UintToArith256(hash) / arith_uint256(coinage+1)); if ( hashval <= bnTarget ) { From e1a17ed172f47f65cc253f6775ccdc70daf8649c Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 20:47:37 +0300 Subject: [PATCH 0928/1062] Test --- src/komodo_gateway.h | 19 +++++++++---------- src/wallet/rpcwallet.cpp | 1 + 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 8238130ee..3ed0c607f 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -672,13 +672,12 @@ uint64_t komodo_commission(const CBlock &block) uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_t vout,uint32_t blocktime,uint32_t prevtime) { - CBlockIndex *pindex; arith_uint256 hashval; uint256 hash; int32_t i,j; uint32_t txtime,minutes,winner = 0; uint64_t diff,value,coinage,supply = ASSETCHAINS_SUPPLY + nHeight*ASSETCHAINS_REWARD/SATOSHIDEN; + CBlockIndex *pindex; arith_uint256 hashval; uint256 hash; int32_t i,iter=0; uint32_t txtime,winner = 0; uint64_t diff,value,coinage,supply = ASSETCHAINS_SUPPLY + nHeight*ASSETCHAINS_REWARD/SATOSHIDEN; if ( nHeight < 200 ) return(blocktime); txtime = komodo_txtime(&value,txid,vout); if ( value == 0 ) return(0); - minutes = (blocktime - txtime) / 60; if ( txtime == 0 ) txtime = prevtime; if ( blocktime > txtime && (pindex= komodo_chainactive(nHeight-200)) != 0 ) @@ -691,26 +690,26 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ winner = 1; else { - for (i=1; i<3600*8; i++) + for (iter=1; iter<3600*8; iter++) { - diff = (i + blocktime - txtime); + diff = (iter + blocktime - txtime); coinage = (((value * diff) / supply) * diff) / supply; hashval = arith_uint256(100000000000) * (UintToArith256(hash) / arith_uint256(coinage+1)); if ( hashval <= bnTarget ) { winner = 1; - blocktime += i; + blocktime += iter; break; } } - fprintf(stderr,"iterated until i.%d winner.%d\n",i,winner); + //fprintf(stderr,"iterated until i.%d winner.%d\n",i,winner); } for (i=31; i>=0; i--) fprintf(stderr,"%02x",((uint8_t *)&hashval)[i]); - fprintf(stderr," vs "); - for (i=31; i>=0; i--) - fprintf(stderr,"%02x",((uint8_t *)&bnTarget)[i]); - fprintf(stderr," winner.%d coinage.%llu %d ht.%d gap.%d minutes.%d %.8f/%llu\n",winner,(long long)coinage,(int32_t)(blocktime - txtime),nHeight,(int32_t)(blocktime - prevtime),minutes,dstr(value),(long long)supply); + //fprintf(stderr," vs "); + //for (i=31; i>=0; i--) + // fprintf(stderr,"%02x",((uint8_t *)&bnTarget)[i]); + fprintf(stderr," iter.%d winner.%d coinage.%llu %d ht.%d gap.%d %.8f/%llu\n",iter,winner,(long long)coinage,(int32_t)(blocktime - txtime),nHeight,(int32_t)(blocktime - prevtime),dstr(value),(long long)supply); } return(blocktime * winner); } diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 53e3fdeff..a9e64158c 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4530,6 +4530,7 @@ int32_t komodo_staked(uint32_t nBits,uint32_t *blocktimep,uint32_t *txtimep,uint for (i=0; i Date: Mon, 9 Apr 2018 20:51:52 +0300 Subject: [PATCH 0929/1062] Test --- src/komodo_gateway.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 3ed0c607f..11ce8f359 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -680,7 +680,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ return(0); if ( txtime == 0 ) txtime = prevtime; - if ( blocktime > txtime && (pindex= komodo_chainactive(nHeight-200)) != 0 ) + if ( blocktime > txtime+6000 && (pindex= komodo_chainactive(nHeight-200)) != 0 ) { hash = pindex->GetBlockHash(); // hash pubkey diff = (blocktime - txtime); From d5d586e078189a8485d3a6a99ad980bb55edb08f Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 20:59:16 +0300 Subject: [PATCH 0930/1062] Test --- src/komodo_gateway.h | 4 ++-- src/wallet/rpcwallet.cpp | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 11ce8f359..605225eed 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -685,7 +685,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ hash = pindex->GetBlockHash(); // hash pubkey diff = (blocktime - txtime); coinage = (((value * diff) / supply) * diff) / supply; - hashval = arith_uint256(100000000000) * (UintToArith256(hash) / arith_uint256(coinage+1)); + hashval = arith_uint256(1000000) * (UintToArith256(hash) / arith_uint256(coinage+1)); if ( hashval <= bnTarget ) winner = 1; else @@ -694,7 +694,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ { diff = (iter + blocktime - txtime); coinage = (((value * diff) / supply) * diff) / supply; - hashval = arith_uint256(100000000000) * (UintToArith256(hash) / arith_uint256(coinage+1)); + hashval = arith_uint256(1000000) * (UintToArith256(hash) / arith_uint256(coinage+1)); if ( hashval <= bnTarget ) { winner = 1; diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index a9e64158c..3d36e43ac 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4530,6 +4530,7 @@ int32_t komodo_staked(uint32_t nBits,uint32_t *blocktimep,uint32_t *txtimep,uint for (i=0; i Date: Mon, 9 Apr 2018 21:03:02 +0300 Subject: [PATCH 0931/1062] Test --- src/komodo_gateway.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 605225eed..a9cf3edfc 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -684,7 +684,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ { hash = pindex->GetBlockHash(); // hash pubkey diff = (blocktime - txtime); - coinage = (((value * diff) / supply) * diff) / supply; + coinage = (((value * diff) / supply) * diff); hashval = arith_uint256(1000000) * (UintToArith256(hash) / arith_uint256(coinage+1)); if ( hashval <= bnTarget ) winner = 1; @@ -693,7 +693,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ for (iter=1; iter<3600*8; iter++) { diff = (iter + blocktime - txtime); - coinage = (((value * diff) / supply) * diff) / supply; + coinage = (((value * diff) / supply) * diff); hashval = arith_uint256(1000000) * (UintToArith256(hash) / arith_uint256(coinage+1)); if ( hashval <= bnTarget ) { From 14a53f21a1e9e69e226ca150f4d0aad2ecde95ef Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 21:08:46 +0300 Subject: [PATCH 0932/1062] Test --- src/wallet/rpcwallet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 3d36e43ac..a52d7ab46 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4492,7 +4492,7 @@ int32_t komodo_staked(uint32_t nBits,uint32_t *blocktimep,uint32_t *txtimep,uint if ( pindex != 0 && (tipindex= chainActive.Tip()) != 0 ) { eligible = komodo_stake(bnTarget,(uint32_t)tipindex->nHeight+1,out.tx->GetHash(),out.i,*blocktimep,(uint32_t)tipindex->nTime); - if ( eligible > 0 && eligible < earliest ) + if ( (eligible > 0 && eligible < earliest) || (eligible == earliest && (*utxovaluep == 0 || nValue < *utxovaluep)) ) { earliest = eligible; best_scriptPubKey = out.tx->vout[out.i].scriptPubKey; From e005f57633c3f198c821b5726b4ad3c60cd71d89 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 21:12:25 +0300 Subject: [PATCH 0933/1062] Test --- src/komodo_gateway.h | 8 ++++---- src/wallet/rpcwallet.cpp | 17 ++++++++++------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index a9cf3edfc..367393fde 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -704,11 +704,11 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ } //fprintf(stderr,"iterated until i.%d winner.%d\n",i,winner); } - for (i=31; i>=0; i--) + for (i=31; i>=24; i--) fprintf(stderr,"%02x",((uint8_t *)&hashval)[i]); - //fprintf(stderr," vs "); - //for (i=31; i>=0; i--) - // fprintf(stderr,"%02x",((uint8_t *)&bnTarget)[i]); + fprintf(stderr," vs "); + for (i=31; i>=24; i--) + fprintf(stderr,"%02x",((uint8_t *)&bnTarget)[i]); fprintf(stderr," iter.%d winner.%d coinage.%llu %d ht.%d gap.%d %.8f/%llu\n",iter,winner,(long long)coinage,(int32_t)(blocktime - txtime),nHeight,(int32_t)(blocktime - prevtime),dstr(value),(long long)supply); } return(blocktime * winner); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index a52d7ab46..b31948013 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4492,14 +4492,17 @@ int32_t komodo_staked(uint32_t nBits,uint32_t *blocktimep,uint32_t *txtimep,uint if ( pindex != 0 && (tipindex= chainActive.Tip()) != 0 ) { eligible = komodo_stake(bnTarget,(uint32_t)tipindex->nHeight+1,out.tx->GetHash(),out.i,*blocktimep,(uint32_t)tipindex->nTime); - if ( (eligible > 0 && eligible < earliest) || (eligible == earliest && (*utxovaluep == 0 || nValue < *utxovaluep)) ) + if ( eligible > 0 ) { - earliest = eligible; - best_scriptPubKey = out.tx->vout[out.i].scriptPubKey; - *utxovaluep = (uint64_t)nValue; - decode_hex((uint8_t *)utxotxidp,32,(char *)out.tx->GetHash().GetHex().c_str()); - *utxovoutp = out.i; - *txtimep = (uint32_t)out.tx->nLockTime; + if ( earliest == 0 || eligible < earliest || (eligible == earliest && (*utxovaluep == 0 || nValue < *utxovaluep)) ) + { + earliest = eligible; + best_scriptPubKey = out.tx->vout[out.i].scriptPubKey; + *utxovaluep = (uint64_t)nValue; + decode_hex((uint8_t *)utxotxidp,32,(char *)out.tx->GetHash().GetHex().c_str()); + *utxovoutp = out.i; + *txtimep = (uint32_t)out.tx->nLockTime; + } } //fprintf(stderr,"(%s) %s/v%d nValue %.8f locktime.%u txheight.%d pindexht.%d\n",CBitcoinAddress(address).ToString().c_str(),out.tx->GetHash().GetHex().c_str(),out.i,(double)nValue/COIN,locktime,txheight,pindex->nHeight); } From fd098285ce5619a15e6fddc2b1e968a23d59008b Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 21:12:49 +0300 Subject: [PATCH 0934/1062] Test --- src/komodo_gateway.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 367393fde..a2c726007 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -685,7 +685,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ hash = pindex->GetBlockHash(); // hash pubkey diff = (blocktime - txtime); coinage = (((value * diff) / supply) * diff); - hashval = arith_uint256(1000000) * (UintToArith256(hash) / arith_uint256(coinage+1)); + hashval = arith_uint256(supply) * (UintToArith256(hash) / arith_uint256(coinage+1)); if ( hashval <= bnTarget ) winner = 1; else @@ -694,7 +694,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ { diff = (iter + blocktime - txtime); coinage = (((value * diff) / supply) * diff); - hashval = arith_uint256(1000000) * (UintToArith256(hash) / arith_uint256(coinage+1)); + hashval = arith_uint256(supply) * (UintToArith256(hash) / arith_uint256(coinage+1)); if ( hashval <= bnTarget ) { winner = 1; From 8c218b4887a14409ea07442cbbfb9d300a2cbb56 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 21:18:40 +0300 Subject: [PATCH 0935/1062] Test --- src/miner.cpp | 4 ++- src/wallet/rpcwallet.cpp | 58 ++++++++++++++++++++-------------------- 2 files changed, 32 insertions(+), 30 deletions(-) diff --git a/src/miner.cpp b/src/miner.cpp index 69a7d240c..6102451d8 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -384,7 +384,9 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) nLastBlockTx = nBlockTx; nLastBlockSize = nBlockSize; - blocktime = std::max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime()); + if ( ASSETCHAINS_STAKED != 0 ) + blocktime = pindexPrev->GetMedianTimePast()+1; + else blocktime = std::max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime()); pblock->nTime = blocktime; pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, Params().GetConsensus()); LogPrintf("CreateNewBlock(): total size %u blocktime.%u nBits.%08x\n", nBlockSize,blocktime,pblock->nBits); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index b31948013..6d04ccd6a 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4506,36 +4506,36 @@ int32_t komodo_staked(uint32_t nBits,uint32_t *blocktimep,uint32_t *txtimep,uint } //fprintf(stderr,"(%s) %s/v%d nValue %.8f locktime.%u txheight.%d pindexht.%d\n",CBitcoinAddress(address).ToString().c_str(),out.tx->GetHash().GetHex().c_str(),out.i,(double)nValue/COIN,locktime,txheight,pindex->nHeight); } - if ( earliest != 0 ) + } + if ( earliest != 0 ) + { + bool signSuccess; SignatureData sigdata; uint64_t txfee; uint8_t *ptr; uint256 revtxid,utxotxid; + auto consensusBranchId = CurrentEpochBranchId(chainActive.Height() + 1, Params().GetConsensus()); + const CKeyStore& keystore = *pwalletMain; + CMutableTransaction txNew = CreateNewContextualCMutableTransaction(Params().GetConsensus(), chainActive.Height() + 1); + txNew.vin.resize(1); + txNew.vout.resize(1); + txfee = 0; + for (i=0; i<32; i++) + ((uint8_t *)&revtxid)[i] = ((uint8_t *)utxotxidp)[31 - i]; + txNew.vin[0].prevout.hash = revtxid; + txNew.vin[0].prevout.n = *utxovoutp; + txNew.vout[0].scriptPubKey = CScript() << ParseHex(NOTARY_PUBKEY) << OP_CHECKSIG; + txNew.vout[0].nValue = nValue - txfee; + txNew.nLockTime = *blocktimep; + CTransaction txNewConst(txNew); + signSuccess = ProduceSignature(TransactionSignatureCreator(&keystore, &txNewConst, 0, nValue, SIGHASH_ALL), best_scriptPubKey, sigdata, consensusBranchId); + if (!signSuccess) + fprintf(stderr,"failed to create signature\n"); + else { - bool signSuccess; SignatureData sigdata; uint64_t txfee; uint8_t *ptr; uint256 revtxid,utxotxid; - auto consensusBranchId = CurrentEpochBranchId(chainActive.Height() + 1, Params().GetConsensus()); - const CKeyStore& keystore = *pwalletMain; - CMutableTransaction txNew = CreateNewContextualCMutableTransaction(Params().GetConsensus(), chainActive.Height() + 1); - txNew.vin.resize(1); - txNew.vout.resize(1); - txfee = 0; - for (i=0; i<32; i++) - ((uint8_t *)&revtxid)[i] = ((uint8_t *)utxotxidp)[31 - i]; - txNew.vin[0].prevout.hash = revtxid; - txNew.vin[0].prevout.n = *utxovoutp; - txNew.vout[0].scriptPubKey = CScript() << ParseHex(NOTARY_PUBKEY) << OP_CHECKSIG; - txNew.vout[0].nValue = nValue - txfee; - txNew.nLockTime = *blocktimep; - CTransaction txNewConst(txNew); - signSuccess = ProduceSignature(TransactionSignatureCreator(&keystore, &txNewConst, 0, nValue, SIGHASH_ALL), best_scriptPubKey, sigdata, consensusBranchId); - if (!signSuccess) - fprintf(stderr,"failed to create signature\n"); - else - { - ptr = (uint8_t *)sigdata.scriptSig.data(); - siglen = sigdata.scriptSig.size(); - for (i=0; i Date: Mon, 9 Apr 2018 21:20:28 +0300 Subject: [PATCH 0936/1062] Test --- src/wallet/rpcwallet.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 6d04ccd6a..ca3fde8d0 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4521,10 +4521,10 @@ int32_t komodo_staked(uint32_t nBits,uint32_t *blocktimep,uint32_t *txtimep,uint txNew.vin[0].prevout.hash = revtxid; txNew.vin[0].prevout.n = *utxovoutp; txNew.vout[0].scriptPubKey = CScript() << ParseHex(NOTARY_PUBKEY) << OP_CHECKSIG; - txNew.vout[0].nValue = nValue - txfee; + txNew.vout[0].nValue = *utxovaluep - txfee; txNew.nLockTime = *blocktimep; CTransaction txNewConst(txNew); - signSuccess = ProduceSignature(TransactionSignatureCreator(&keystore, &txNewConst, 0, nValue, SIGHASH_ALL), best_scriptPubKey, sigdata, consensusBranchId); + signSuccess = ProduceSignature(TransactionSignatureCreator(&keystore, &txNewConst, 0, *utxovaluep, SIGHASH_ALL), best_scriptPubKey, sigdata, consensusBranchId); if (!signSuccess) fprintf(stderr,"failed to create signature\n"); else From 6d649e094ef0e4ca97ce333107fcb4518f80b73b Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 21:24:23 +0300 Subject: [PATCH 0937/1062] Test --- src/komodo_gateway.h | 1 + src/pow.cpp | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index a2c726007..645ef6145 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -797,6 +797,7 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtim if ( eligible == 0 || eligible > block.nTime ) { fprintf(stderr,"eligible.%u vs blocktime.%u, lag.%d\n",eligible,(uint32_t)block.nTime,(int32_t)(eligible - block.nTime)); + return(-1); } } if ( ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 && ASSETCHAINS_COMMISSION != 0 && block.vtx[0].vout.size() > 1 ) diff --git a/src/pow.cpp b/src/pow.cpp index 63806033d..23f1cf67b 100644 --- a/src/pow.cpp +++ b/src/pow.cpp @@ -122,6 +122,7 @@ int32_t komodo_currentheight(); CBlockIndex *komodo_chainactive(int32_t height); void komodo_index2pubkey33(uint8_t *pubkey33,CBlockIndex *pindex,int32_t height); extern int32_t KOMODO_CHOSEN_ONE; +extern uint64_t ASSETCHAINS_STAKED; extern char ASSETCHAINS_SYMBOL[]; #define KOMODO_ELECTION_GAP 2000 @@ -141,7 +142,9 @@ bool CheckProofOfWork(int32_t height,uint8_t *pubkey33,uint256 hash, unsigned in height = komodo_currentheight() + 1; special = komodo_chosennotary(¬aryid,height,pubkey33,timestamp); flag = komodo_eligiblenotary(pubkeys,mids,&nonzpkeys,height); - if ( height > 34000 && ASSETCHAINS_SYMBOL[0] == 0 ) // 0 -> non-special notary + if ( ASSETCHAINS_STAKED != 0 ) + bnTarget.SetCompact(KOMODO_MINDIFF_NBITS,&fNegative,&fOverflow); + else if ( height > 34000 && ASSETCHAINS_SYMBOL[0] == 0 ) // 0 -> non-special notary { for (i=0; i<33; i++) { From e12ea51956ec3e70911b50b5090e93ae5f77e75c Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 21:24:42 +0300 Subject: [PATCH 0938/1062] Test --- src/miner.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/miner.cpp b/src/miner.cpp index 6102451d8..69a7d240c 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -384,9 +384,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) nLastBlockTx = nBlockTx; nLastBlockSize = nBlockSize; - if ( ASSETCHAINS_STAKED != 0 ) - blocktime = pindexPrev->GetMedianTimePast()+1; - else blocktime = std::max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime()); + blocktime = std::max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime()); pblock->nTime = blocktime; pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, Params().GetConsensus()); LogPrintf("CreateNewBlock(): total size %u blocktime.%u nBits.%08x\n", nBlockSize,blocktime,pblock->nBits); From d3b5a9083eacd23dbfbcc73d31fdab82ce8de82e Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 21:52:41 +0300 Subject: [PATCH 0939/1062] Test --- src/komodo_gateway.h | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 645ef6145..7760d907c 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -672,15 +672,17 @@ uint64_t komodo_commission(const CBlock &block) uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_t vout,uint32_t blocktime,uint32_t prevtime) { - CBlockIndex *pindex; arith_uint256 hashval; uint256 hash; int32_t i,iter=0; uint32_t txtime,winner = 0; uint64_t diff,value,coinage,supply = ASSETCHAINS_SUPPLY + nHeight*ASSETCHAINS_REWARD/SATOSHIDEN; - if ( nHeight < 200 ) + CBlockIndex *pindex; arith_uint256 hashval; uint256 hash; int32_t minage,i,iter=0; uint32_t txtime,winner = 0; uint64_t diff,value,coinage,supply = ASSETCHAINS_SUPPLY + nHeight*ASSETCHAINS_REWARD/SATOSHIDEN; + if ( nHeight < 30 ) return(blocktime); txtime = komodo_txtime(&value,txid,vout); if ( value == 0 ) return(0); if ( txtime == 0 ) txtime = prevtime; - if ( blocktime > txtime+6000 && (pindex= komodo_chainactive(nHeight-200)) != 0 ) + if ( (minage= nHeight*30) > 6000 ) + minage = 6000; + if ( blocktime > txtime+minage && (pindex= komodo_chainactive(nHeight>200?nHeight-200:1)) != 0 ) { hash = pindex->GetBlockHash(); // hash pubkey diff = (blocktime - txtime); @@ -794,7 +796,7 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtim } bnTarget.SetCompact(block.nBits, &fNegative, &fOverflow); eligible = komodo_stake(bnTarget,height,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n,block.nTime,prevtime); - if ( eligible == 0 || eligible > block.nTime ) + if ( height > 100 && (eligible == 0 || eligible > block.nTime) ) { fprintf(stderr,"eligible.%u vs blocktime.%u, lag.%d\n",eligible,(uint32_t)block.nTime,(int32_t)(eligible - block.nTime)); return(-1); From d3aea61d5629add32ef0fa5246687d0d5c6b7b35 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 21:55:36 +0300 Subject: [PATCH 0940/1062] Test --- src/komodo_gateway.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 7760d907c..ae07d92bc 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -680,7 +680,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ return(0); if ( txtime == 0 ) txtime = prevtime; - if ( (minage= nHeight*30) > 6000 ) + if ( (minage= nHeight*3) > 6000 ) minage = 6000; if ( blocktime > txtime+minage && (pindex= komodo_chainactive(nHeight>200?nHeight-200:1)) != 0 ) { From 36067f15e97747f962276c72a7a9ffe5b1092a07 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 21:58:28 +0300 Subject: [PATCH 0941/1062] Test --- src/komodo_gateway.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index ae07d92bc..6231c458c 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -796,7 +796,7 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtim } bnTarget.SetCompact(block.nBits, &fNegative, &fOverflow); eligible = komodo_stake(bnTarget,height,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n,block.nTime,prevtime); - if ( height > 100 && (eligible == 0 || eligible > block.nTime) ) + if ( height >= 30 && (eligible == 0 || eligible > block.nTime) ) { fprintf(stderr,"eligible.%u vs blocktime.%u, lag.%d\n",eligible,(uint32_t)block.nTime,(int32_t)(eligible - block.nTime)); return(-1); From 6d94e8a836f4349ed71263dec604598987544606 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 22:13:18 +0300 Subject: [PATCH 0942/1062] Test --- src/komodo_gateway.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 6231c458c..23d95ff0b 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -676,8 +676,8 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ if ( nHeight < 30 ) return(blocktime); txtime = komodo_txtime(&value,txid,vout); - if ( value == 0 ) - return(0); + //if ( value == 0 ) + // return(0); if ( txtime == 0 ) txtime = prevtime; if ( (minage= nHeight*3) > 6000 ) From d354a959cdba222a738be1f110608171d66da397 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 22:15:42 +0300 Subject: [PATCH 0943/1062] Test --- src/komodo_gateway.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 23d95ff0b..5e792a707 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -673,8 +673,6 @@ uint64_t komodo_commission(const CBlock &block) uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_t vout,uint32_t blocktime,uint32_t prevtime) { CBlockIndex *pindex; arith_uint256 hashval; uint256 hash; int32_t minage,i,iter=0; uint32_t txtime,winner = 0; uint64_t diff,value,coinage,supply = ASSETCHAINS_SUPPLY + nHeight*ASSETCHAINS_REWARD/SATOSHIDEN; - if ( nHeight < 30 ) - return(blocktime); txtime = komodo_txtime(&value,txid,vout); //if ( value == 0 ) // return(0); @@ -713,6 +711,8 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ fprintf(stderr,"%02x",((uint8_t *)&bnTarget)[i]); fprintf(stderr," iter.%d winner.%d coinage.%llu %d ht.%d gap.%d %.8f/%llu\n",iter,winner,(long long)coinage,(int32_t)(blocktime - txtime),nHeight,(int32_t)(blocktime - prevtime),dstr(value),(long long)supply); } + if ( nHeight < 30 ) + return(blocktime); return(blocktime * winner); } From c4cd1663968c3399fead6a6bb6656e7f98ff2438 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 22:19:21 +0300 Subject: [PATCH 0944/1062] Test --- src/komodo_gateway.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 5e792a707..02aacbe86 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -685,7 +685,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ hash = pindex->GetBlockHash(); // hash pubkey diff = (blocktime - txtime); coinage = (((value * diff) / supply) * diff); - hashval = arith_uint256(supply) * (UintToArith256(hash) / arith_uint256(coinage+1)); + hashval = (UintToArith256(hash) / arith_uint256(coinage+1)); if ( hashval <= bnTarget ) winner = 1; else @@ -694,7 +694,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ { diff = (iter + blocktime - txtime); coinage = (((value * diff) / supply) * diff); - hashval = arith_uint256(supply) * (UintToArith256(hash) / arith_uint256(coinage+1)); + hashval = (UintToArith256(hash) / arith_uint256(coinage+1)); if ( hashval <= bnTarget ) { winner = 1; From 28d89a8620fbcb6bc2f15bd263f74e992ab4b6b9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 22:22:12 +0300 Subject: [PATCH 0945/1062] Test --- src/komodo_bitcoind.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index f7d9af114..0495d12c8 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -568,9 +568,10 @@ uint32_t komodo_txtime(uint64_t *valuep,uint256 hash,int32_t n) #endif hashBlock, true)) { + fprintf(stderr,"ERROR: %s/v%d locktime.%u\n",hash.ToString().c_str(),n,(uint32_t)tx.nLockTime); return(0); } - //fprintf(stderr,"%s/v%d locktime.%u\n",hash.ToString().c_str(),n,(uint32_t)tx.nLockTime); + fprintf(stderr,"%s/v%d locktime.%u\n",hash.ToString().c_str(),n,(uint32_t)tx.nLockTime); if ( n < tx.vout.size() ) *valuep = tx.vout[n].nValue; return(tx.nLockTime); From e6eb32402005a0de39d16dcd20652a44ac90472b Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 22:27:24 +0300 Subject: [PATCH 0946/1062] Test --- src/wallet/rpcwallet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index ca3fde8d0..54a9350b6 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4504,7 +4504,7 @@ int32_t komodo_staked(uint32_t nBits,uint32_t *blocktimep,uint32_t *txtimep,uint *txtimep = (uint32_t)out.tx->nLockTime; } } - //fprintf(stderr,"(%s) %s/v%d nValue %.8f locktime.%u txheight.%d pindexht.%d\n",CBitcoinAddress(address).ToString().c_str(),out.tx->GetHash().GetHex().c_str(),out.i,(double)nValue/COIN,locktime,txheight,pindex->nHeight); + fprintf(stderr,"(%s) %s/v%d nValue %.8f locktime.%u txheight.%d pindexht.%d\n",CBitcoinAddress(address).ToString().c_str(),out.tx->GetHash().GetHex().c_str(),out.i,(double)nValue/COIN,locktime,txheight,pindex->nHeight); } } if ( earliest != 0 ) From fd331cdc33b951640c78b5a84353a0b5d0fd9a75 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 22:30:25 +0300 Subject: [PATCH 0947/1062] Test --- src/komodo_gateway.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 02aacbe86..2a2f1f190 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -711,7 +711,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ fprintf(stderr,"%02x",((uint8_t *)&bnTarget)[i]); fprintf(stderr," iter.%d winner.%d coinage.%llu %d ht.%d gap.%d %.8f/%llu\n",iter,winner,(long long)coinage,(int32_t)(blocktime - txtime),nHeight,(int32_t)(blocktime - prevtime),dstr(value),(long long)supply); } - if ( nHeight < 30 ) + if ( nHeight < 2 ) return(blocktime); return(blocktime * winner); } @@ -796,7 +796,7 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtim } bnTarget.SetCompact(block.nBits, &fNegative, &fOverflow); eligible = komodo_stake(bnTarget,height,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n,block.nTime,prevtime); - if ( height >= 30 && (eligible == 0 || eligible > block.nTime) ) + if ( height >= 2 && (eligible == 0 || eligible > block.nTime) ) { fprintf(stderr,"eligible.%u vs blocktime.%u, lag.%d\n",eligible,(uint32_t)block.nTime,(int32_t)(eligible - block.nTime)); return(-1); From 9dd28ae0a3866ef149ea036c8f21f968c003abb0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 22:41:04 +0300 Subject: [PATCH 0948/1062] Test --- src/komodo_gateway.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 2a2f1f190..acd0efed7 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -786,7 +786,7 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtim } else { - if ( ASSETCHAINS_STAKED != 0 ) + if ( ASSETCHAINS_STAKED != 0 && height >= 2 ) { arith_uint256 bnTarget; bool fNegative,fOverflow; CBlockIndex *previndex; uint32_t eligible; if ( prevtime == 0 ) @@ -795,8 +795,10 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtim prevtime = (uint32_t)previndex->nTime; } bnTarget.SetCompact(block.nBits, &fNegative, &fOverflow); - eligible = komodo_stake(bnTarget,height,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n,block.nTime,prevtime); - if ( height >= 2 && (eligible == 0 || eligible > block.nTime) ) + if ( txn_count == 1 ) + eligible = komodo_stake(bnTarget,height,block.vtx[0].vout[0].hash,0,block.nTime,prevtime); + else eligible = komodo_stake(bnTarget,height,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n,block.nTime,prevtime); + if ( eligible == 0 || eligible > block.nTime ) { fprintf(stderr,"eligible.%u vs blocktime.%u, lag.%d\n",eligible,(uint32_t)block.nTime,(int32_t)(eligible - block.nTime)); return(-1); From 34f8b3543763bceaf8b21dcd2fdb3b8ccac0faf4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 22:44:23 +0300 Subject: [PATCH 0949/1062] Test --- src/komodo_gateway.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index acd0efed7..25d494043 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -786,7 +786,7 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtim } else { - if ( ASSETCHAINS_STAKED != 0 && height >= 2 ) + if ( ASSETCHAINS_STAKED != 0 && height >= 2 && txn_count > 1 ) { arith_uint256 bnTarget; bool fNegative,fOverflow; CBlockIndex *previndex; uint32_t eligible; if ( prevtime == 0 ) @@ -795,9 +795,7 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtim prevtime = (uint32_t)previndex->nTime; } bnTarget.SetCompact(block.nBits, &fNegative, &fOverflow); - if ( txn_count == 1 ) - eligible = komodo_stake(bnTarget,height,block.vtx[0].vout[0].hash,0,block.nTime,prevtime); - else eligible = komodo_stake(bnTarget,height,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n,block.nTime,prevtime); + eligible = komodo_stake(bnTarget,height,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n,block.nTime,prevtime); if ( eligible == 0 || eligible > block.nTime ) { fprintf(stderr,"eligible.%u vs blocktime.%u, lag.%d\n",eligible,(uint32_t)block.nTime,(int32_t)(eligible - block.nTime)); From 37af9d4af9a2adf404cc0fb0e6bd77245faeb5d5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 22:48:28 +0300 Subject: [PATCH 0950/1062] Test --- src/komodo_gateway.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 25d494043..60281aabb 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -674,6 +674,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ { CBlockIndex *pindex; arith_uint256 hashval; uint256 hash; int32_t minage,i,iter=0; uint32_t txtime,winner = 0; uint64_t diff,value,coinage,supply = ASSETCHAINS_SUPPLY + nHeight*ASSETCHAINS_REWARD/SATOSHIDEN; txtime = komodo_txtime(&value,txid,vout); + fprintf(stderr,"%s/v%d %.8f txtime.%u\n",txid.ToString().c_str(),vout,dstr(value),txtime); //if ( value == 0 ) // return(0); if ( txtime == 0 ) From a030053610246158540e5c8476fd8ba8adf5811d Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 22:55:21 +0300 Subject: [PATCH 0951/1062] Test --- src/miner.cpp | 2 +- src/wallet/rpcwallet.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/miner.cpp b/src/miner.cpp index 69a7d240c..4817da0ba 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -415,7 +415,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) pblocktemplate->vTxSigOps.push_back(numsigs); nFees += txfees; pblock->nTime = blocktime; - } + } else fprintf(stderr,"no utxos eligible for staking\n"); } // Create coinbase tx diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 54a9350b6..71c2025ed 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4487,9 +4487,9 @@ int32_t komodo_staked(uint32_t nBits,uint32_t *blocktimep,uint32_t *txtimep,uint } entry.push_back(Pair("amount",ValueFromAmount(nValue)));*/ BlockMap::iterator it = mapBlockIndex.find(pcoinsTip->GetBestBlock()); - CBlockIndex *tipindex,*pindex = it->second; + CBlockIndex *tipindex; uint64_t interest; uint32_t locktime; int32_t txheight; - if ( pindex != 0 && (tipindex= chainActive.Tip()) != 0 ) + if ( (tipindex= chainActive.Tip()) != 0 ) { eligible = komodo_stake(bnTarget,(uint32_t)tipindex->nHeight+1,out.tx->GetHash(),out.i,*blocktimep,(uint32_t)tipindex->nTime); if ( eligible > 0 ) @@ -4504,7 +4504,7 @@ int32_t komodo_staked(uint32_t nBits,uint32_t *blocktimep,uint32_t *txtimep,uint *txtimep = (uint32_t)out.tx->nLockTime; } } - fprintf(stderr,"(%s) %s/v%d nValue %.8f locktime.%u txheight.%d pindexht.%d\n",CBitcoinAddress(address).ToString().c_str(),out.tx->GetHash().GetHex().c_str(),out.i,(double)nValue/COIN,locktime,txheight,pindex->nHeight); + fprintf(stderr,"(%s) %s/v%d nValue %.8f locktime.%u txheight.%d\n",CBitcoinAddress(address).ToString().c_str(),out.tx->GetHash().GetHex().c_str(),out.i,(double)nValue/COIN,locktime,txheight); } } if ( earliest != 0 ) From d10b3e3c62b21601e7eccbb4ffb2f6ccdc5b6ad7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 23:01:54 +0300 Subject: [PATCH 0952/1062] Test --- src/komodo_gateway.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 60281aabb..474184e5c 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -686,7 +686,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ hash = pindex->GetBlockHash(); // hash pubkey diff = (blocktime - txtime); coinage = (((value * diff) / supply) * diff); - hashval = (UintToArith256(hash) / arith_uint256(coinage+1)); + hashval = arith_uint256(supply) * (UintToArith256(hash) / arith_uint256(coinage+1)); if ( hashval <= bnTarget ) winner = 1; else @@ -695,7 +695,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ { diff = (iter + blocktime - txtime); coinage = (((value * diff) / supply) * diff); - hashval = (UintToArith256(hash) / arith_uint256(coinage+1)); + hashval = arith_uint256(supply) * (UintToArith256(hash) / arith_uint256(coinage+1)); if ( hashval <= bnTarget ) { winner = 1; From d231a6a77519acb836cfbd6eda74601791022a7c Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 23:17:34 +0300 Subject: [PATCH 0953/1062] Test --- src/komodo_gateway.h | 6 +++--- src/miner.cpp | 12 ++++++------ src/wallet/rpcwallet.cpp | 6 +++--- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 474184e5c..292302a55 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -674,9 +674,9 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ { CBlockIndex *pindex; arith_uint256 hashval; uint256 hash; int32_t minage,i,iter=0; uint32_t txtime,winner = 0; uint64_t diff,value,coinage,supply = ASSETCHAINS_SUPPLY + nHeight*ASSETCHAINS_REWARD/SATOSHIDEN; txtime = komodo_txtime(&value,txid,vout); - fprintf(stderr,"%s/v%d %.8f txtime.%u\n",txid.ToString().c_str(),vout,dstr(value),txtime); - //if ( value == 0 ) - // return(0); + //fprintf(stderr,"%s/v%d %.8f txtime.%u\n",txid.ToString().c_str(),vout,dstr(value),txtime); + if ( value == 0 ) + return(0); if ( txtime == 0 ) txtime = prevtime; if ( (minage= nHeight*3) > 6000 ) diff --git a/src/miner.cpp b/src/miner.cpp index 4817da0ba..2b658d5ee 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -120,7 +120,7 @@ int32_t komodo_gateway_deposits(CMutableTransaction *txNew,char *symbol,int32_t int32_t komodo_isrealtime(int32_t *kmdheightp); int32_t komodo_validate_interest(const CTransaction &tx,int32_t txheight,uint32_t nTime,int32_t dispflag); uint64_t komodo_commission(const CBlock &block); -int32_t komodo_staked(uint32_t nBits,uint32_t *blocktimep,uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig); +int32_t komodo_staked(CMutableTransaction &txNew,uint32_t nBits,uint32_t *blocktimep,uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig); CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) { @@ -391,10 +391,11 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) if ( ASSETCHAINS_SYMBOL[0] != 0 && ASSETCHAINS_STAKED != 0 && NOTARY_PUBKEY33[0] != 0 ) { uint64_t txfees,utxovalue; uint32_t txtime; uint256 utxotxid,revtxid; int32_t i,siglen,numsigs,utxovout; uint8_t utxosig[128],*ptr; - if ( (siglen= komodo_staked(pblock->nBits,&blocktime,&txtime,&utxotxid,&utxovout,&utxovalue,utxosig)) > 0 ) + CMutableTransaction txStaked = CreateNewContextualCMutableTransaction(Params().GetConsensus(), chainActive.Height() + 1); + if ( (siglen= komodo_staked(txStaked,pblock->nBits,&blocktime,&txtime,&utxotxid,&utxovout,&utxovalue,utxosig)) > 0 ) { - CMutableTransaction txStaked = CreateNewContextualCMutableTransaction(chainparams.GetConsensus(), nHeight); CAmount txfees = 0; + /*CMutableTransaction txStaked = CreateNewContextualCMutableTransaction(chainparams.GetConsensus(), nHeight); txStaked.vin.resize(1); txStaked.vout.resize(1); for (i=0; i<32; i++) @@ -407,12 +408,11 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) ptr[i] = utxosig[i]; txStaked.vout[0].scriptPubKey = CScript() << ParseHex(NOTARY_PUBKEY) << OP_CHECKSIG; txStaked.vout[0].nValue = utxovalue - txfees; - txStaked.nLockTime = blocktime; + txStaked.nLockTime = blocktime;*/ pblock->vtx.push_back(txStaked); - numsigs = GetLegacySigOpCount(txStaked); pblocktemplate->vTxFees.push_back(txfees); - pblocktemplate->vTxSigOps.push_back(numsigs); + pblocktemplate->vTxSigOps.push_back(GetLegacySigOpCount(txStaked)); nFees += txfees; pblock->nTime = blocktime; } else fprintf(stderr,"no utxos eligible for staking\n"); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 71c2025ed..5a56a16f4 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4441,7 +4441,7 @@ int32_t decode_hex(uint8_t *bytes,int32_t n,char *hex); extern std::string NOTARY_PUBKEY; uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 hash,int32_t n,uint32_t blocktime,uint32_t prevtime); -int32_t komodo_staked(uint32_t nBits,uint32_t *blocktimep,uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig) +int32_t komodo_staked(CMutableTransaction &txNew,uint32_t nBits,uint32_t *blocktimep,uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig) { set setAddress; int32_t i,siglen=0,nMinDepth = 1,nMaxDepth = 9999999; vector vecOutputs; uint32_t eligible,earliest = 0; CScript best_scriptPubKey; arith_uint256 bnTarget; bool fNegative,fOverflow; bnTarget.SetCompact(nBits, &fNegative, &fOverflow); @@ -4504,7 +4504,7 @@ int32_t komodo_staked(uint32_t nBits,uint32_t *blocktimep,uint32_t *txtimep,uint *txtimep = (uint32_t)out.tx->nLockTime; } } - fprintf(stderr,"(%s) %s/v%d nValue %.8f locktime.%u txheight.%d\n",CBitcoinAddress(address).ToString().c_str(),out.tx->GetHash().GetHex().c_str(),out.i,(double)nValue/COIN,locktime,txheight); + //fprintf(stderr,"(%s) %s/v%d nValue %.8f locktime.%u txheight.%d\n",CBitcoinAddress(address).ToString().c_str(),out.tx->GetHash().GetHex().c_str(),out.i,(double)nValue/COIN,locktime,txheight); } } if ( earliest != 0 ) @@ -4512,7 +4512,6 @@ int32_t komodo_staked(uint32_t nBits,uint32_t *blocktimep,uint32_t *txtimep,uint bool signSuccess; SignatureData sigdata; uint64_t txfee; uint8_t *ptr; uint256 revtxid,utxotxid; auto consensusBranchId = CurrentEpochBranchId(chainActive.Height() + 1, Params().GetConsensus()); const CKeyStore& keystore = *pwalletMain; - CMutableTransaction txNew = CreateNewContextualCMutableTransaction(Params().GetConsensus(), chainActive.Height() + 1); txNew.vin.resize(1); txNew.vout.resize(1); txfee = 0; @@ -4529,6 +4528,7 @@ int32_t komodo_staked(uint32_t nBits,uint32_t *blocktimep,uint32_t *txtimep,uint fprintf(stderr,"failed to create signature\n"); else { + UpdateTransaction(txNew,0,sigdata); ptr = (uint8_t *)sigdata.scriptSig.data(); siglen = sigdata.scriptSig.size(); for (i=0; i Date: Mon, 9 Apr 2018 23:27:19 +0300 Subject: [PATCH 0954/1062] Test --- src/komodo_bitcoind.h | 2 +- src/wallet/rpcwallet.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 0495d12c8..ca9157adc 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -571,7 +571,7 @@ uint32_t komodo_txtime(uint64_t *valuep,uint256 hash,int32_t n) fprintf(stderr,"ERROR: %s/v%d locktime.%u\n",hash.ToString().c_str(),n,(uint32_t)tx.nLockTime); return(0); } - fprintf(stderr,"%s/v%d locktime.%u\n",hash.ToString().c_str(),n,(uint32_t)tx.nLockTime); + //fprintf(stderr,"%s/v%d locktime.%u\n",hash.ToString().c_str(),n,(uint32_t)tx.nLockTime); if ( n < tx.vout.size() ) *valuep = tx.vout[n].nValue; return(tx.nLockTime); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 5a56a16f4..0a9524d88 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4502,9 +4502,9 @@ int32_t komodo_staked(CMutableTransaction &txNew,uint32_t nBits,uint32_t *blockt decode_hex((uint8_t *)utxotxidp,32,(char *)out.tx->GetHash().GetHex().c_str()); *utxovoutp = out.i; *txtimep = (uint32_t)out.tx->nLockTime; + fprintf(stderr,"earliest.%u [%d] (%s) nValue %.8f locktime.%u txheight.%d\n",earliest,(int32_t)(earliest- *blocktimep)CBitcoinAddress(address).ToString().c_str(),(double)nValue/COIN,locktime,txheight); } } - //fprintf(stderr,"(%s) %s/v%d nValue %.8f locktime.%u txheight.%d\n",CBitcoinAddress(address).ToString().c_str(),out.tx->GetHash().GetHex().c_str(),out.i,(double)nValue/COIN,locktime,txheight); } } if ( earliest != 0 ) From 3f26119e04eed251f79e2099d62df24a67921248 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 23:29:03 +0300 Subject: [PATCH 0955/1062] Test --- src/wallet/rpcwallet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 0a9524d88..637edbbd8 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4502,7 +4502,7 @@ int32_t komodo_staked(CMutableTransaction &txNew,uint32_t nBits,uint32_t *blockt decode_hex((uint8_t *)utxotxidp,32,(char *)out.tx->GetHash().GetHex().c_str()); *utxovoutp = out.i; *txtimep = (uint32_t)out.tx->nLockTime; - fprintf(stderr,"earliest.%u [%d] (%s) nValue %.8f locktime.%u txheight.%d\n",earliest,(int32_t)(earliest- *blocktimep)CBitcoinAddress(address).ToString().c_str(),(double)nValue/COIN,locktime,txheight); + fprintf(stderr,"earliest.%u [%d] (%s) nValue %.8f locktime.%u txheight.%d\n",earliest,(int32_t)(earliest- *blocktimep),CBitcoinAddress(address).ToString().c_str(),(double)nValue/COIN,locktime,txheight); } } } From 09cde8ab10f7866f8d262abf811344f1ba16d77a Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 23:34:24 +0300 Subject: [PATCH 0956/1062] Test --- src/wallet/rpcwallet.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 637edbbd8..98e2cd0f6 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4521,7 +4521,7 @@ int32_t komodo_staked(CMutableTransaction &txNew,uint32_t nBits,uint32_t *blockt txNew.vin[0].prevout.n = *utxovoutp; txNew.vout[0].scriptPubKey = CScript() << ParseHex(NOTARY_PUBKEY) << OP_CHECKSIG; txNew.vout[0].nValue = *utxovaluep - txfee; - txNew.nLockTime = *blocktimep; + txNew.nLockTime = earliest; CTransaction txNewConst(txNew); signSuccess = ProduceSignature(TransactionSignatureCreator(&keystore, &txNewConst, 0, *utxovaluep, SIGHASH_ALL), best_scriptPubKey, sigdata, consensusBranchId); if (!signSuccess) @@ -4534,8 +4534,8 @@ int32_t komodo_staked(CMutableTransaction &txNew,uint32_t nBits,uint32_t *blockt for (i=0; i Date: Mon, 9 Apr 2018 23:45:45 +0300 Subject: [PATCH 0957/1062] Test --- src/komodo_gateway.h | 4 ++-- src/miner.cpp | 26 +++++++++++--------------- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 292302a55..34f1b0161 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -686,7 +686,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ hash = pindex->GetBlockHash(); // hash pubkey diff = (blocktime - txtime); coinage = (((value * diff) / supply) * diff); - hashval = arith_uint256(supply) * (UintToArith256(hash) / arith_uint256(coinage+1)); + hashval = arith_uint256(supply * 64) * (UintToArith256(hash) / arith_uint256(coinage+1)); if ( hashval <= bnTarget ) winner = 1; else @@ -695,7 +695,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ { diff = (iter + blocktime - txtime); coinage = (((value * diff) / supply) * diff); - hashval = arith_uint256(supply) * (UintToArith256(hash) / arith_uint256(coinage+1)); + hashval = arith_uint256(supply * 64) * (UintToArith256(hash) / arith_uint256(coinage+1)); if ( hashval <= bnTarget ) { winner = 1; diff --git a/src/miner.cpp b/src/miner.cpp index 2b658d5ee..67e8e9cb3 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -395,26 +395,22 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) if ( (siglen= komodo_staked(txStaked,pblock->nBits,&blocktime,&txtime,&utxotxid,&utxovout,&utxovalue,utxosig)) > 0 ) { CAmount txfees = 0; - /*CMutableTransaction txStaked = CreateNewContextualCMutableTransaction(chainparams.GetConsensus(), nHeight); - txStaked.vin.resize(1); - txStaked.vout.resize(1); - for (i=0; i<32; i++) - ((uint8_t *)&revtxid)[i] = ((uint8_t *)&utxotxid)[31 - i]; - txStaked.vin[0].prevout.hash = revtxid; - txStaked.vin[0].prevout.n = utxovout; - txStaked.vin[0].scriptSig.resize(siglen); - ptr = (uint8_t *)txStaked.vin[0].scriptSig.data(); - for (i=0; ivtx.push_back(txStaked); pblocktemplate->vTxFees.push_back(txfees); pblocktemplate->vTxSigOps.push_back(GetLegacySigOpCount(txStaked)); nFees += txfees; pblock->nTime = blocktime; + if ( GetAdjustedTime()+30 < pblock->nTime ) + { + printf("need to wait %d seconds to submit: ",(int32_t)(pblock->nTime - GetAdjustedTime())); + while ( GetAdjustedTime()+30 < pblock->nTime ) + { + sleep(1); + fprintf(stderr,"%d ",pblock->nTime - GetAdjustedTime()); + } + fprintf(stderr,"finished waiting\n"); + } + } else fprintf(stderr,"no utxos eligible for staking\n"); } From 1599d4c8efc1a917cdb935dcfd27cfec16046265 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 23:48:34 +0300 Subject: [PATCH 0958/1062] Test --- src/miner.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/miner.cpp b/src/miner.cpp index 67e8e9cb3..edbc3ae24 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -406,7 +406,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) while ( GetAdjustedTime()+30 < pblock->nTime ) { sleep(1); - fprintf(stderr,"%d ",pblock->nTime - GetAdjustedTime()); + fprintf(stderr,"%d ",(int32_t)(pblock->nTime - GetAdjustedTime())); } fprintf(stderr,"finished waiting\n"); } From 9465da966b7c9102daca7a75ee763b7b2287bc24 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Apr 2018 23:59:13 +0300 Subject: [PATCH 0959/1062] Test --- src/komodo_gateway.h | 15 +++++++++------ src/miner.cpp | 11 ++++++----- src/wallet/rpcwallet.cpp | 5 ++--- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 34f1b0161..56165d598 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -705,12 +705,15 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ } //fprintf(stderr,"iterated until i.%d winner.%d\n",i,winner); } - for (i=31; i>=24; i--) - fprintf(stderr,"%02x",((uint8_t *)&hashval)[i]); - fprintf(stderr," vs "); - for (i=31; i>=24; i--) - fprintf(stderr,"%02x",((uint8_t *)&bnTarget)[i]); - fprintf(stderr," iter.%d winner.%d coinage.%llu %d ht.%d gap.%d %.8f/%llu\n",iter,winner,(long long)coinage,(int32_t)(blocktime - txtime),nHeight,(int32_t)(blocktime - prevtime),dstr(value),(long long)supply); + if ( 0 ) + { + for (i=31; i>=24; i--) + fprintf(stderr,"%02x",((uint8_t *)&hashval)[i]); + fprintf(stderr," vs "); + for (i=31; i>=24; i--) + fprintf(stderr,"%02x",((uint8_t *)&bnTarget)[i]); + fprintf(stderr," iter.%d winner.%d coinage.%llu %d ht.%d gap.%d %.8f/%llu\n",iter,winner,(long long)coinage,(int32_t)(blocktime - txtime),nHeight,(int32_t)(blocktime - prevtime),dstr(value),(long long)supply); + } } if ( nHeight < 2 ) return(blocktime); diff --git a/src/miner.cpp b/src/miner.cpp index edbc3ae24..853cda770 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -402,13 +402,14 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) pblock->nTime = blocktime; if ( GetAdjustedTime()+30 < pblock->nTime ) { - printf("need to wait %d seconds to submit: ",(int32_t)(pblock->nTime - GetAdjustedTime())); - while ( GetAdjustedTime()+30 < pblock->nTime ) + //printf("need to wait %d seconds to submit: ",(int32_t)(pblock->nTime - GetAdjustedTime())); + /*while ( GetAdjustedTime()+30 < pblock->nTime ) { - sleep(1); + sleep(30); fprintf(stderr,"%d ",(int32_t)(pblock->nTime - GetAdjustedTime())); - } - fprintf(stderr,"finished waiting\n"); + }*/ + //fprintf(stderr,"finished waiting\n"); + sleep(30); } } else fprintf(stderr,"no utxos eligible for staking\n"); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 98e2cd0f6..9169f1079 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4486,9 +4486,8 @@ int32_t komodo_staked(CMutableTransaction &txNew,uint32_t nBits,uint32_t *blockt } } entry.push_back(Pair("amount",ValueFromAmount(nValue)));*/ - BlockMap::iterator it = mapBlockIndex.find(pcoinsTip->GetBestBlock()); + //BlockMap::iterator it = mapBlockIndex.find(pcoinsTip->GetBestBlock()); CBlockIndex *tipindex; - uint64_t interest; uint32_t locktime; int32_t txheight; if ( (tipindex= chainActive.Tip()) != 0 ) { eligible = komodo_stake(bnTarget,(uint32_t)tipindex->nHeight+1,out.tx->GetHash(),out.i,*blocktimep,(uint32_t)tipindex->nTime); @@ -4502,7 +4501,7 @@ int32_t komodo_staked(CMutableTransaction &txNew,uint32_t nBits,uint32_t *blockt decode_hex((uint8_t *)utxotxidp,32,(char *)out.tx->GetHash().GetHex().c_str()); *utxovoutp = out.i; *txtimep = (uint32_t)out.tx->nLockTime; - fprintf(stderr,"earliest.%u [%d] (%s) nValue %.8f locktime.%u txheight.%d\n",earliest,(int32_t)(earliest- *blocktimep),CBitcoinAddress(address).ToString().c_str(),(double)nValue/COIN,locktime,txheight); + fprintf(stderr,"earliest.%u [%d] (%s) nValue %.8f locktime.%u\n",earliest,(int32_t)(earliest- *blocktimep),CBitcoinAddress(address).ToString().c_str(),(double)nValue/COIN,*txtimep); } } } From 8d584a9c9142ca7ddc3c927ef3e4dc9a6684c052 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Apr 2018 00:09:41 +0300 Subject: [PATCH 0960/1062] Test --- src/komodo_bitcoind.h | 10 +++++++--- src/komodo_gateway.h | 10 +++++----- src/wallet/rpcwallet.cpp | 2 +- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index ca9157adc..0f44119cb 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -557,11 +557,11 @@ uint64_t komodo_seed(int32_t height) return(seed); } -uint32_t komodo_txtime(uint64_t *valuep,uint256 hash,int32_t n) +uint32_t komodo_txtime(uint64_t *valuep,uint256 hash,int32_t n,char *address) { - CTransaction tx; - uint256 hashBlock; + CTxDestination address; CTransaction tx; uint256 hashBlock; *valuep = 0; + address[0] = 0; if (!GetTransaction(hash, tx, #ifndef KOMODO_ZCASH Params().GetConsensus(), @@ -573,7 +573,11 @@ uint32_t komodo_txtime(uint64_t *valuep,uint256 hash,int32_t n) } //fprintf(stderr,"%s/v%d locktime.%u\n",hash.ToString().c_str(),n,(uint32_t)tx.nLockTime); if ( n < tx.vout.size() ) + { *valuep = tx.vout[n].nValue; + if (ExtractDestination(tx.scriptPubKey, address)) + strcpy(address,CBitcoinAddress(address).ToString().c_str()); + } return(tx.nLockTime); } diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 56165d598..fba23a4bc 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -670,11 +670,11 @@ uint64_t komodo_commission(const CBlock &block) return((total * ASSETCHAINS_COMMISSION) / COIN); } -uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_t vout,uint32_t blocktime,uint32_t prevtime) +uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_t vout,uint32_t blocktime,uint32_t prevtime,char *destaddr) { - CBlockIndex *pindex; arith_uint256 hashval; uint256 hash; int32_t minage,i,iter=0; uint32_t txtime,winner = 0; uint64_t diff,value,coinage,supply = ASSETCHAINS_SUPPLY + nHeight*ASSETCHAINS_REWARD/SATOSHIDEN; - txtime = komodo_txtime(&value,txid,vout); - //fprintf(stderr,"%s/v%d %.8f txtime.%u\n",txid.ToString().c_str(),vout,dstr(value),txtime); + CBlockIndex *pindex; char address[64]; arith_uint256 hashval; uint256 hash; int32_t minage,i,iter=0; uint32_t txtime,winner = 0; uint64_t diff,value,coinage,supply = ASSETCHAINS_SUPPLY + nHeight*ASSETCHAINS_REWARD/SATOSHIDEN; + txtime = komodo_txtime(&value,txid,vout,address); + fprintf(stderr,"(%s) vs. (%s) %s/v%d %.8f txtime.%u\n",address,destaddr,txid.ToString().c_str(),vout,dstr(value),txtime); if ( value == 0 ) return(0); if ( txtime == 0 ) @@ -799,7 +799,7 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtim prevtime = (uint32_t)previndex->nTime; } bnTarget.SetCompact(block.nBits, &fNegative, &fOverflow); - eligible = komodo_stake(bnTarget,height,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n,block.nTime,prevtime); + eligible = komodo_stake(bnTarget,height,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n,block.nTime,prevtime,""); if ( eligible == 0 || eligible > block.nTime ) { fprintf(stderr,"eligible.%u vs blocktime.%u, lag.%d\n",eligible,(uint32_t)block.nTime,(int32_t)(eligible - block.nTime)); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 9169f1079..3dcd63951 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4490,7 +4490,7 @@ int32_t komodo_staked(CMutableTransaction &txNew,uint32_t nBits,uint32_t *blockt CBlockIndex *tipindex; if ( (tipindex= chainActive.Tip()) != 0 ) { - eligible = komodo_stake(bnTarget,(uint32_t)tipindex->nHeight+1,out.tx->GetHash(),out.i,*blocktimep,(uint32_t)tipindex->nTime); + eligible = komodo_stake(bnTarget,(uint32_t)tipindex->nHeight+1,out.tx->GetHash(),out.i,*blocktimep,(uint32_t)tipindex->nTime,CBitcoinAddress(address).ToString().c_str()); if ( eligible > 0 ) { if ( earliest == 0 || eligible < earliest || (eligible == earliest && (*utxovaluep == 0 || nValue < *utxovaluep)) ) From af79cd4cfc468aafb20ae792897720c487d815fa Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Apr 2018 00:14:42 +0300 Subject: [PATCH 0961/1062] Test --- src/komodo_gateway.h | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index fba23a4bc..839e96304 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -672,9 +672,8 @@ uint64_t komodo_commission(const CBlock &block) uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_t vout,uint32_t blocktime,uint32_t prevtime,char *destaddr) { - CBlockIndex *pindex; char address[64]; arith_uint256 hashval; uint256 hash; int32_t minage,i,iter=0; uint32_t txtime,winner = 0; uint64_t diff,value,coinage,supply = ASSETCHAINS_SUPPLY + nHeight*ASSETCHAINS_REWARD/SATOSHIDEN; + CBlockIndex *pindex; uint8_t hashbuf[128]; char address[64]; arith_uint256 hashval; uint256 hash,addrhash,pasthash; int32_t minage,i,iter=0; uint32_t txtime,winner = 0; uint64_t diff,value,coinage,supply = ASSETCHAINS_SUPPLY + nHeight*ASSETCHAINS_REWARD/SATOSHIDEN; txtime = komodo_txtime(&value,txid,vout,address); - fprintf(stderr,"(%s) vs. (%s) %s/v%d %.8f txtime.%u\n",address,destaddr,txid.ToString().c_str(),vout,dstr(value),txtime); if ( value == 0 ) return(0); if ( txtime == 0 ) @@ -683,7 +682,10 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ minage = 6000; if ( blocktime > txtime+minage && (pindex= komodo_chainactive(nHeight>200?nHeight-200:1)) != 0 ) { - hash = pindex->GetBlockHash(); // hash pubkey + vcalc_sha256(0,(uint8_t *)&addrhash,(int32_t)strlen(address)); + pasthash = pindex->GetBlockHash(); + hash = (pasthash ^ addrhash); + fprintf(stderr,"(%s) vs. (%s) %s %.8f txtime.%u\n",address,destaddr,hash.ToString().c_str(),dstr(value),txtime); diff = (blocktime - txtime); coinage = (((value * diff) / supply) * diff); hashval = arith_uint256(supply * 64) * (UintToArith256(hash) / arith_uint256(coinage+1)); @@ -799,7 +801,7 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtim prevtime = (uint32_t)previndex->nTime; } bnTarget.SetCompact(block.nBits, &fNegative, &fOverflow); - eligible = komodo_stake(bnTarget,height,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n,block.nTime,prevtime,""); + eligible = komodo_stake(bnTarget,height,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n,block.nTime,prevtime,(char *)""); if ( eligible == 0 || eligible > block.nTime ) { fprintf(stderr,"eligible.%u vs blocktime.%u, lag.%d\n",eligible,(uint32_t)block.nTime,(int32_t)(eligible - block.nTime)); From 4da475be2fff2c2302f872fdc2da2a26e09b3078 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Apr 2018 00:18:22 +0300 Subject: [PATCH 0962/1062] Test --- src/komodo_gateway.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 839e96304..dd7e041de 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -682,9 +682,11 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ minage = 6000; if ( blocktime > txtime+minage && (pindex= komodo_chainactive(nHeight>200?nHeight-200:1)) != 0 ) { - vcalc_sha256(0,(uint8_t *)&addrhash,(int32_t)strlen(address)); + vcalc_sha256(0,(uint8_t *)&addrhash,address,(int32_t)strlen(address)); pasthash = pindex->GetBlockHash(); - hash = (pasthash ^ addrhash); + memcpy(hashbuf,&pasthash,sizeof(pasthash)); + memcpy(&hashbuf[sizeof(pasthash)],&addrhash,sizeof(addrhash)); + vcalc_sha256(0,(uint8_t *)&hash,hashbuf,(int32_t)sizeof(uint256)*2); fprintf(stderr,"(%s) vs. (%s) %s %.8f txtime.%u\n",address,destaddr,hash.ToString().c_str(),dstr(value),txtime); diff = (blocktime - txtime); coinage = (((value * diff) / supply) * diff); From fa4d9e24afe2d1e43953156a54187a9ccfa6e10e Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Apr 2018 00:26:00 +0300 Subject: [PATCH 0963/1062] Test --- src/komodo_bitcoind.h | 7 +++---- src/komodo_gateway.h | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 0f44119cb..6ffa4022c 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -557,11 +557,10 @@ uint64_t komodo_seed(int32_t height) return(seed); } -uint32_t komodo_txtime(uint64_t *valuep,uint256 hash,int32_t n,char *address) +uint32_t komodo_txtime(uint64_t *valuep,uint256 hash,int32_t n,char *destaddr) { CTxDestination address; CTransaction tx; uint256 hashBlock; *valuep = 0; - address[0] = 0; if (!GetTransaction(hash, tx, #ifndef KOMODO_ZCASH Params().GetConsensus(), @@ -575,8 +574,8 @@ uint32_t komodo_txtime(uint64_t *valuep,uint256 hash,int32_t n,char *address) if ( n < tx.vout.size() ) { *valuep = tx.vout[n].nValue; - if (ExtractDestination(tx.scriptPubKey, address)) - strcpy(address,CBitcoinAddress(address).ToString().c_str()); + if (ExtractDestination(tx.vout[n].scriptPubKey, address)) + strcpy(destaddr,CBitcoinAddress(address).ToString().c_str()); } return(tx.nLockTime); } diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index dd7e041de..e77e8bcb3 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -682,7 +682,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ minage = 6000; if ( blocktime > txtime+minage && (pindex= komodo_chainactive(nHeight>200?nHeight-200:1)) != 0 ) { - vcalc_sha256(0,(uint8_t *)&addrhash,address,(int32_t)strlen(address)); + vcalc_sha256(0,(uint8_t *)&addrhash,(uint8_t *)address,(int32_t)strlen(address)); pasthash = pindex->GetBlockHash(); memcpy(hashbuf,&pasthash,sizeof(pasthash)); memcpy(&hashbuf[sizeof(pasthash)],&addrhash,sizeof(addrhash)); From 1a2b98fab06458bd858444e1cdaae7d330c11186 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Apr 2018 00:28:19 +0300 Subject: [PATCH 0964/1062] Test --- src/wallet/rpcwallet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 3dcd63951..8f9234c1b 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4439,7 +4439,7 @@ UniValue z_listoperationids(const UniValue& params, bool fHelp) #include "script/sign.h" int32_t decode_hex(uint8_t *bytes,int32_t n,char *hex); extern std::string NOTARY_PUBKEY; -uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 hash,int32_t n,uint32_t blocktime,uint32_t prevtime); +uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 hash,int32_t n,uint32_t blocktime,uint32_t prevtime,char *destaddr); int32_t komodo_staked(CMutableTransaction &txNew,uint32_t nBits,uint32_t *blocktimep,uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig) { From e07cf6b5f9330a2801b1002d425afcda770f6060 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Apr 2018 00:28:51 +0300 Subject: [PATCH 0965/1062] Test --- src/wallet/rpcwallet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 8f9234c1b..ed318819a 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4490,7 +4490,7 @@ int32_t komodo_staked(CMutableTransaction &txNew,uint32_t nBits,uint32_t *blockt CBlockIndex *tipindex; if ( (tipindex= chainActive.Tip()) != 0 ) { - eligible = komodo_stake(bnTarget,(uint32_t)tipindex->nHeight+1,out.tx->GetHash(),out.i,*blocktimep,(uint32_t)tipindex->nTime,CBitcoinAddress(address).ToString().c_str()); + eligible = komodo_stake(bnTarget,(uint32_t)tipindex->nHeight+1,out.tx->GetHash(),out.i,*blocktimep,(uint32_t)tipindex->nTime,(char *)CBitcoinAddress(address).ToString().c_str()); if ( eligible > 0 ) { if ( earliest == 0 || eligible < earliest || (eligible == earliest && (*utxovaluep == 0 || nValue < *utxovaluep)) ) From 2e90eb0c2a0fa1788bcc218765bf645215f3e132 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Apr 2018 00:37:13 +0300 Subject: [PATCH 0966/1062] Test --- src/komodo_gateway.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index e77e8bcb3..7b417c040 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -687,7 +687,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ memcpy(hashbuf,&pasthash,sizeof(pasthash)); memcpy(&hashbuf[sizeof(pasthash)],&addrhash,sizeof(addrhash)); vcalc_sha256(0,(uint8_t *)&hash,hashbuf,(int32_t)sizeof(uint256)*2); - fprintf(stderr,"(%s) vs. (%s) %s %.8f txtime.%u\n",address,destaddr,hash.ToString().c_str(),dstr(value),txtime); + //fprintf(stderr,"(%s) vs. (%s) %s %.8f txtime.%u\n",address,destaddr,hash.ToString().c_str(),dstr(value),txtime); diff = (blocktime - txtime); coinage = (((value * diff) / supply) * diff); hashval = arith_uint256(supply * 64) * (UintToArith256(hash) / arith_uint256(coinage+1)); @@ -709,7 +709,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ } //fprintf(stderr,"iterated until i.%d winner.%d\n",i,winner); } - if ( 0 ) + if ( 1 ) { for (i=31; i>=24; i--) fprintf(stderr,"%02x",((uint8_t *)&hashval)[i]); From 22439b80345a3dfff11ddb3b0705e687cc2069ca Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Apr 2018 00:43:42 +0300 Subject: [PATCH 0967/1062] Test --- src/komodo_gateway.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 7b417c040..c4bbcd92a 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -672,7 +672,7 @@ uint64_t komodo_commission(const CBlock &block) uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_t vout,uint32_t blocktime,uint32_t prevtime,char *destaddr) { - CBlockIndex *pindex; uint8_t hashbuf[128]; char address[64]; arith_uint256 hashval; uint256 hash,addrhash,pasthash; int32_t minage,i,iter=0; uint32_t txtime,winner = 0; uint64_t diff,value,coinage,supply = ASSETCHAINS_SUPPLY + nHeight*ASSETCHAINS_REWARD/SATOSHIDEN; + CBlockIndex *pindex; uint8_t hashbuf[128]; char address[64]; bits256 addrhash; arith_uint256 hashval; uint256 hash,pasthash; int32_t segid,minage,i,iter=0; uint32_t txtime,winner = 0; uint64_t diff,value,coinage,supply = ASSETCHAINS_SUPPLY + nHeight*ASSETCHAINS_REWARD/SATOSHIDEN; txtime = komodo_txtime(&value,txid,vout,address); if ( value == 0 ) return(0); @@ -683,6 +683,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ if ( blocktime > txtime+minage && (pindex= komodo_chainactive(nHeight>200?nHeight-200:1)) != 0 ) { vcalc_sha256(0,(uint8_t *)&addrhash,(uint8_t *)address,(int32_t)strlen(address)); + segid = ((nHeight + addrhash.uints[0]) & 0x3f); pasthash = pindex->GetBlockHash(); memcpy(hashbuf,&pasthash,sizeof(pasthash)); memcpy(&hashbuf[sizeof(pasthash)],&addrhash,sizeof(addrhash)); @@ -704,6 +705,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ { winner = 1; blocktime += iter; + blocktime += segid; break; } } @@ -716,7 +718,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ fprintf(stderr," vs "); for (i=31; i>=24; i--) fprintf(stderr,"%02x",((uint8_t *)&bnTarget)[i]); - fprintf(stderr," iter.%d winner.%d coinage.%llu %d ht.%d gap.%d %.8f/%llu\n",iter,winner,(long long)coinage,(int32_t)(blocktime - txtime),nHeight,(int32_t)(blocktime - prevtime),dstr(value),(long long)supply); + fprintf(stderr," segid.%d iter.%d winner.%d coinage.%llu %d ht.%d gap.%d %.8f/%llu\n",segid,iter,winner,(long long)coinage,(int32_t)(blocktime - txtime),nHeight,(int32_t)(blocktime - prevtime),dstr(value),(long long)supply); } } if ( nHeight < 2 ) From 1dd815ba0bcf7e7dca15381d950d3628ba716c68 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Apr 2018 00:49:11 +0300 Subject: [PATCH 0968/1062] Test --- src/komodo_gateway.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index c4bbcd92a..c90e1dd80 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -711,7 +711,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ } //fprintf(stderr,"iterated until i.%d winner.%d\n",i,winner); } - if ( 1 ) + if ( 0 ) { for (i=31; i>=24; i--) fprintf(stderr,"%02x",((uint8_t *)&hashval)[i]); From 8b6faa2e8438e1fec3cfd282917737870c7bafb6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Apr 2018 01:09:27 +0300 Subject: [PATCH 0969/1062] Test --- src/pow.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/pow.cpp b/src/pow.cpp index 23f1cf67b..93ef9ab11 100644 --- a/src/pow.cpp +++ b/src/pow.cpp @@ -142,9 +142,10 @@ bool CheckProofOfWork(int32_t height,uint8_t *pubkey33,uint256 hash, unsigned in height = komodo_currentheight() + 1; special = komodo_chosennotary(¬aryid,height,pubkey33,timestamp); flag = komodo_eligiblenotary(pubkeys,mids,&nonzpkeys,height); - if ( ASSETCHAINS_STAKED != 0 ) + /*if ( ASSETCHAINS_STAKED != 0 ) bnTarget.SetCompact(KOMODO_MINDIFF_NBITS,&fNegative,&fOverflow); - else if ( height > 34000 && ASSETCHAINS_SYMBOL[0] == 0 ) // 0 -> non-special notary + else*/ + if ( height > 34000 && ASSETCHAINS_SYMBOL[0] == 0 ) // 0 -> non-special notary { for (i=0; i<33; i++) { From 5bb3d0fe9f55683827d7ed9bbc0acdb117a7bf38 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Apr 2018 01:19:49 +0300 Subject: [PATCH 0970/1062] Test --- src/main.cpp | 2 +- src/miner.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 4639814de..fc5d4873c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3579,7 +3579,7 @@ bool CheckBlock(int32_t height,CBlockIndex *pindex,const CBlock& block, CValidat if ( komodo_check_deposit(ASSETCHAINS_SYMBOL[0] == 0 ? height : pindex != 0 ? (int32_t)pindex->nHeight : chainActive.Tip()->nHeight+1,block,pindex==0||pindex->pprev==0?0:pindex->pprev->nTime) < 0 ) { static uint32_t counter; - if ( counter++ < 100 ) + if ( counter++ < 100 && ASSETCHAINS_STAKED == 0 ) fprintf(stderr,"check deposit rejection\n"); return(false); } diff --git a/src/miner.cpp b/src/miner.cpp index 853cda770..d249dcce1 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -487,7 +487,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) if ( !TestBlockValidity(state, *pblock, pindexPrev, false, false)) { static uint32_t counter; - if ( counter++ < 100 ) + if ( counter++ < 100 && ASSETCHAINS_STAKED == 0 ) fprintf(stderr,"warning: testblockvalidity failed\n"); return(0); } @@ -762,7 +762,7 @@ void static BitcoinMiner() if ( ptr == 0 ) { static uint32_t counter; - if ( counter++ < 100 ) + if ( counter++ < 100 && ASSETCHAINS_STAKED == 0 ) fprintf(stderr,"created illegal block, retry\n"); continue; } From f08e247d5729c8acfded39c831ada4eea76c95a9 Mon Sep 17 00:00:00 2001 From: "Jonathan \"Duke\" Leto" Date: Tue, 10 Apr 2018 00:33:49 -0700 Subject: [PATCH 0971/1062] jl777 rebased so now we have viewing keys --- contrib/komodo-cli.bash-completion | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/contrib/komodo-cli.bash-completion b/contrib/komodo-cli.bash-completion index c1a9930ef..1efc05d46 100644 --- a/contrib/komodo-cli.bash-completion +++ b/contrib/komodo-cli.bash-completion @@ -86,11 +86,10 @@ _komodo_cli() { COMPREPLY=( $( compgen -W "true false" -- "$cur" ) ) return 0 ;; -# KMD does not have viewing keys, yet -# z_importkey|z_importviewingkey) -# COMPREPLY=( $( compgen -W "yes no whenkeyisnew" -- "$cur" ) ) -# return 0 -# ;; + z_importkey|z_importviewingkey) + COMPREPLY=( $( compgen -W "yes no whenkeyisnew" -- "$cur" ) ) + return 0 + ;; move|setaccount) _komodo_accounts return 0 From 67b849d7d464b08b393f818bbbf6dafedd3cf36d Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 3 Apr 2018 02:43:52 +0100 Subject: [PATCH 0972/1062] Fix z_importviewingkey startHeight parameter Closes #2937. --- qa/rpc-tests/wallet_nullifiers.py | 2 +- src/wallet/rpcdump.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/qa/rpc-tests/wallet_nullifiers.py b/qa/rpc-tests/wallet_nullifiers.py index 743af7c92..207631efb 100755 --- a/qa/rpc-tests/wallet_nullifiers.py +++ b/qa/rpc-tests/wallet_nullifiers.py @@ -182,7 +182,7 @@ class WalletNullifiersTest (BitcoinTestFramework): # add node 1 address and node 2 viewing key to node 3 myzvkey = self.nodes[2].z_exportviewingkey(myzaddr) self.nodes[3].importaddress(mytaddr1) - self.nodes[3].z_importviewingkey(myzvkey) + self.nodes[3].z_importviewingkey(myzvkey, 'whenkeyisnew', 1) # Check the address has been imported assert_equal(myzaddr in self.nodes[3].z_listaddresses(), False) diff --git a/src/wallet/rpcdump.cpp b/src/wallet/rpcdump.cpp index bb42ffa1d..33dc90bb3 100644 --- a/src/wallet/rpcdump.cpp +++ b/src/wallet/rpcdump.cpp @@ -653,7 +653,7 @@ UniValue z_importviewingkey(const UniValue& params, bool fHelp) if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - if (fHelp || params.size() < 1 || params.size() > 2) + if (fHelp || params.size() < 1 || params.size() > 3) throw runtime_error( "z_importviewingkey \"vkey\" ( rescan startHeight )\n" "\nAdds a viewing key (as returned by z_exportviewingkey) to your wallet.\n" From 70420ff34f02aed28d9bc9995a46020d5bdf2d53 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 6 Mar 2018 15:45:25 +0100 Subject: [PATCH 0973/1062] Test calling z_mergetoaddress to merge notes while a note merge is ongoing --- qa/rpc-tests/wallet_mergetoaddress.py | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/qa/rpc-tests/wallet_mergetoaddress.py b/qa/rpc-tests/wallet_mergetoaddress.py index ff3534e9b..d8531319c 100755 --- a/qa/rpc-tests/wallet_mergetoaddress.py +++ b/qa/rpc-tests/wallet_mergetoaddress.py @@ -324,13 +324,25 @@ class WalletMergeToAddressTest (BitcoinTestFramework): self.sync_all() # Verify maximum number of notes which node 0 can shield can be set by the limit parameter - result = self.nodes[0].z_mergetoaddress([myzaddr], myzaddr, 0, 50, 2) - assert_equal(result["mergingUTXOs"], Decimal('0')) + # Also check that we can set off a second merge before the first one is complete + result1 = self.nodes[0].z_mergetoaddress([myzaddr], myzaddr, 0, 50, 2) + result2 = self.nodes[0].z_mergetoaddress([myzaddr], myzaddr, 0, 50, 2) + + # First merge should select from all notes + assert_equal(result1["mergingUTXOs"], Decimal('0')) # Remaining UTXOs are only counted if we are trying to merge any UTXOs - assert_equal(result["remainingUTXOs"], Decimal('0')) - assert_equal(result["mergingNotes"], Decimal('2')) - assert_equal(result["remainingNotes"], Decimal('3')) - wait_and_assert_operationid_status(self.nodes[0], result['opid']) + assert_equal(result1["remainingUTXOs"], Decimal('0')) + assert_equal(result1["mergingNotes"], Decimal('2')) + assert_equal(result1["remainingNotes"], Decimal('3')) + + # Second merge should ignore locked notes + assert_equal(result2["mergingUTXOs"], Decimal('0')) + assert_equal(result2["remainingUTXOs"], Decimal('0')) + assert_equal(result2["mergingNotes"], Decimal('2')) + assert_equal(result2["remainingNotes"], Decimal('1')) + + wait_and_assert_operationid_status(self.nodes[0], result1['opid']) + wait_and_assert_operationid_status(self.nodes[0], result2['opid']) self.sync_all() self.nodes[1].generate(1) self.sync_all() @@ -340,7 +352,7 @@ class WalletMergeToAddressTest (BitcoinTestFramework): assert_equal(result["mergingUTXOs"], Decimal('10')) assert_equal(result["remainingUTXOs"], Decimal('7')) assert_equal(result["mergingNotes"], Decimal('2')) - assert_equal(result["remainingNotes"], Decimal('2')) + assert_equal(result["remainingNotes"], Decimal('1')) wait_and_assert_operationid_status(self.nodes[0], result['opid']) # Don't sync node 2 which rejects the tx due to its mempooltxinputlimit sync_blocks(self.nodes[:2]) From 98a4f6a6569d57e6792c9b814a480aec4e6d0b42 Mon Sep 17 00:00:00 2001 From: Brad Miller Date: Thu, 15 Mar 2018 15:58:31 -0600 Subject: [PATCH 0974/1062] Implement note locking for z_mergetoaddress Co-authored-by: Eirik Ogilvie-Wigley --- qa/rpc-tests/wallet_mergetoaddress.py | 8 ++-- .../asyncrpcoperation_mergetoaddress.cpp | 24 +++++++++++ src/wallet/asyncrpcoperation_mergetoaddress.h | 4 ++ src/wallet/gtest/test_wallet.cpp | 33 +++++++++++++++ src/wallet/wallet.cpp | 41 +++++++++++++++++++ src/wallet/wallet.h | 9 ++++ 6 files changed, 116 insertions(+), 3 deletions(-) diff --git a/qa/rpc-tests/wallet_mergetoaddress.py b/qa/rpc-tests/wallet_mergetoaddress.py index d8531319c..e5d5089a4 100755 --- a/qa/rpc-tests/wallet_mergetoaddress.py +++ b/qa/rpc-tests/wallet_mergetoaddress.py @@ -325,8 +325,10 @@ class WalletMergeToAddressTest (BitcoinTestFramework): # Verify maximum number of notes which node 0 can shield can be set by the limit parameter # Also check that we can set off a second merge before the first one is complete - result1 = self.nodes[0].z_mergetoaddress([myzaddr], myzaddr, 0, 50, 2) - result2 = self.nodes[0].z_mergetoaddress([myzaddr], myzaddr, 0, 50, 2) + + # myzaddr has 5 notes at this point + result1 = self.nodes[0].z_mergetoaddress([myzaddr], myzaddr, 0.0001, 50, 2) + result2 = self.nodes[0].z_mergetoaddress([myzaddr], myzaddr, 0.0001, 50, 2) # First merge should select from all notes assert_equal(result1["mergingUTXOs"], Decimal('0')) @@ -340,9 +342,9 @@ class WalletMergeToAddressTest (BitcoinTestFramework): assert_equal(result2["remainingUTXOs"], Decimal('0')) assert_equal(result2["mergingNotes"], Decimal('2')) assert_equal(result2["remainingNotes"], Decimal('1')) - wait_and_assert_operationid_status(self.nodes[0], result1['opid']) wait_and_assert_operationid_status(self.nodes[0], result2['opid']) + self.sync_all() self.nodes[1].generate(1) self.sync_all() diff --git a/src/wallet/asyncrpcoperation_mergetoaddress.cpp b/src/wallet/asyncrpcoperation_mergetoaddress.cpp index 30ef560df..fa823f50a 100644 --- a/src/wallet/asyncrpcoperation_mergetoaddress.cpp +++ b/src/wallet/asyncrpcoperation_mergetoaddress.cpp @@ -98,6 +98,7 @@ AsyncRPCOperation_mergetoaddress::AsyncRPCOperation_mergetoaddress( // Lock UTXOs lock_utxos(); + lock_notes(); // Enable payment disclosure if requested paymentDisclosureMode = fExperimentalMode && GetBoolArg("-paymentdisclosure", false); @@ -111,6 +112,7 @@ void AsyncRPCOperation_mergetoaddress::main() { if (isCancelled()) { unlock_utxos(); // clean up + unlock_notes(); return; } @@ -173,6 +175,7 @@ void AsyncRPCOperation_mergetoaddress::main() LogPrintf("%s", s); unlock_utxos(); // clean up + unlock_notes(); // clean up // !!! Payment disclosure START if (success && paymentDisclosureMode && paymentDisclosureData_.size() > 0) { @@ -921,3 +924,24 @@ void AsyncRPCOperation_mergetoaddress::unlock_utxos() { pwalletMain->UnlockCoin(std::get<0>(utxo)); } } + + +/** + * Lock input notes + */ + void AsyncRPCOperation_mergetoaddress::lock_notes() { + LOCK2(cs_main, pwalletMain->cs_wallet); + for (auto note : noteInputs_) { + pwalletMain->LockNote(std::get<0>(note)); + } +} + +/** + * Unlock input notes + */ +void AsyncRPCOperation_mergetoaddress::unlock_notes() { + LOCK2(cs_main, pwalletMain->cs_wallet); + for (auto note : noteInputs_) { + pwalletMain->UnlockNote(std::get<0>(note)); + } +} diff --git a/src/wallet/asyncrpcoperation_mergetoaddress.h b/src/wallet/asyncrpcoperation_mergetoaddress.h index 1619b5c97..34548a5ba 100644 --- a/src/wallet/asyncrpcoperation_mergetoaddress.h +++ b/src/wallet/asyncrpcoperation_mergetoaddress.h @@ -121,6 +121,10 @@ private: void unlock_utxos(); + void lock_notes(); + + void unlock_notes(); + // payment disclosure! std::vector paymentDisclosureData_; }; diff --git a/src/wallet/gtest/test_wallet.cpp b/src/wallet/gtest/test_wallet.cpp index 4aeaf00df..e976e4ae4 100644 --- a/src/wallet/gtest/test_wallet.cpp +++ b/src/wallet/gtest/test_wallet.cpp @@ -1046,3 +1046,36 @@ TEST(wallet_tests, MarkAffectedTransactionsDirty) { wallet.MarkAffectedTransactionsDirty(wtx2); EXPECT_FALSE(wallet.mapWallet[hash].fDebitCached); } + +TEST(wallet_tests, NoteLocking) { + TestWallet wallet; + + auto sk = libzcash::SpendingKey::random(); + wallet.AddSpendingKey(sk); + + auto wtx = GetValidReceive(sk, 10, true); + auto wtx2 = GetValidReceive(sk, 10, true); + + JSOutPoint jsoutpt {wtx.GetHash(), 0, 0}; + JSOutPoint jsoutpt2 {wtx2.GetHash(),0, 0}; + + // Test selective locking + wallet.LockNote(jsoutpt); + EXPECT_TRUE(wallet.IsLockedNote(jsoutpt.hash, jsoutpt.js, jsoutpt.n)); + EXPECT_FALSE(wallet.IsLockedNote(jsoutpt2.hash, jsoutpt2.js, jsoutpt2.n)); + + // Test selective unlocking + wallet.UnlockNote(jsoutpt); + EXPECT_FALSE(wallet.IsLockedNote(jsoutpt.hash, jsoutpt.js, jsoutpt.n)); + + // Test multiple locking + wallet.LockNote(jsoutpt); + wallet.LockNote(jsoutpt2); + EXPECT_TRUE(wallet.IsLockedNote(jsoutpt.hash, jsoutpt.js, jsoutpt.n)); + EXPECT_TRUE(wallet.IsLockedNote(jsoutpt2.hash, jsoutpt2.js, jsoutpt2.n)); + + // Test unlock all + wallet.UnlockAllNotes(); + EXPECT_FALSE(wallet.IsLockedNote(jsoutpt.hash, jsoutpt.js, jsoutpt.n)); + EXPECT_FALSE(wallet.IsLockedNote(jsoutpt2.hash, jsoutpt2.js, jsoutpt2.n)); +} diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 8172c00e3..eadf7f36d 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -3535,6 +3535,42 @@ void CWallet::ListLockedCoins(std::vector& vOutpts) } } + +// Note Locking Operations + +void CWallet::LockNote(JSOutPoint& output) +{ + AssertLockHeld(cs_wallet); // setLockedNotes + setLockedNotes.insert(output); +} + +void CWallet::UnlockNote(JSOutPoint& output) +{ + AssertLockHeld(cs_wallet); // setLockedNotes + setLockedNotes.erase(output); +} + +void CWallet::UnlockAllNotes() +{ + AssertLockHeld(cs_wallet); // setLockedNotes + setLockedNotes.clear(); +} + +bool CWallet::IsLockedNote(uint256 hash, size_t js, uint8_t n) const +{ + AssertLockHeld(cs_wallet); // setLockedNotes + JSOutPoint outpt(hash, js, n); + + return (setLockedNotes.count(outpt) > 0); +} + +std::vector CWallet::ListLockedNotes() +{ + AssertLockHeld(cs_wallet); // setLockedNotes + std::vector vOutpts(setLockedNotes.begin(), setLockedNotes.end()); + return vOutpts; +} + /** @} */ // end of Actions class CAffectedKeysVisitor : public boost::static_visitor { @@ -3825,6 +3861,11 @@ void CWallet::GetFilteredNotes( if (ignoreUnspendable && !HaveSpendingKey(pa)) { continue; } + + // skip locked notes + if (IsLockedNote(jsop.hash, jsop.js, jsop.n)) { + continue; + } int i = jsop.js; // Index into CTransaction.vjoinsplit int j = jsop.n; // Index into JSDescription.ciphertexts diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index 0f9e6c5da..f77a55a04 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -882,6 +882,7 @@ public: CPubKey vchDefaultKey; std::set setLockedCoins; + std::set setLockedNotes; int64_t nTimeFirstKey; @@ -902,6 +903,14 @@ public: void UnlockAllCoins(); void ListLockedCoins(std::vector& vOutpts); + + bool IsLockedNote(uint256 hash, size_t js, uint8_t n) const; + void LockNote(JSOutPoint& output); + void UnlockNote(JSOutPoint& output); + void UnlockAllNotes(); + std::vector ListLockedNotes(); + + /** * keystore implementation * Generate a new key From 6ff482a5099e754a05d81bc505917c43329d3241 Mon Sep 17 00:00:00 2001 From: Mihail Fedorov Date: Tue, 10 Apr 2018 15:36:01 +0300 Subject: [PATCH 0975/1062] BNTN, CHAIN, PRLPAY --- src/assetchains | 2 ++ src/assetchains.old | 2 ++ src/dpowassets | 5 +++-- src/fiat-cli | 2 ++ src/fiat/bntn | 0 src/fiat/chain | 2 ++ src/fiat/prlpay | 2 ++ 7 files changed, 13 insertions(+), 2 deletions(-) mode change 100644 => 100755 src/fiat/bntn create mode 100755 src/fiat/chain create mode 100755 src/fiat/prlpay diff --git a/src/assetchains b/src/assetchains index c3e161142..517687097 100755 --- a/src/assetchains +++ b/src/assetchains @@ -53,3 +53,5 @@ komodo_asset BEER 100000000 komodo_asset NINJA 100000000 komodo_asset OOT 216000000 komodo_asset BNTN 500000000 +komodo_asset CHAIN 999999 +komodo_asset PRLPAY 500000000 diff --git a/src/assetchains.old b/src/assetchains.old index 6bb60d95a..c025e0430 100755 --- a/src/assetchains.old +++ b/src/assetchains.old @@ -30,6 +30,8 @@ echo $pubkey ./komodod -pubkey=$pubkey -ac_name=NINJA -ac_supply=100000000 -addnode=78.47.196.146 & ./komodod -pubkey=$pubkey -ac_name=OOT -ac_supply=216000000 -addnode=174.138.107.226 & ./komodod -pubkey=$pubkey -ac_name=BNTN -ac_supply=500000000 -addnode=94.130.169.205 & +./komodod -pubkey=$pubkey -ac_name=CHAIN -ac_supply=999999 -addnode=78.47.146.222 & +./komodod -pubkey=$pubkey -ac_name=PRLPAY -ac_supply=500000000 -addnode=13.250.226.125 & #sleep $delay #./komodod -pubkey=$pubkey -ac_name=USD -addnode=78.47.196.146 $1 & diff --git a/src/dpowassets b/src/dpowassets index bd970c357..cd68083ae 100755 --- a/src/dpowassets +++ b/src/dpowassets @@ -26,11 +26,12 @@ curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dp curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"AXO\",\"pubkey\":\"$pubkey\"}" curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"ETOMIC\",\"pubkey\":\"$pubkey\"}" curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"BTCH\",\"pubkey\":\"$pubkey\"}" -#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CHAIN\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CHAIN\",\"pubkey\":\"$pubkey\"}" curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"VOTE2018\",\"pubkey\":\"$pubkey\"}" curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"NINJA\",\"pubkey\":\"$pubkey\"}" curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"OOT\",\"pubkey\":\"$pubkey\"}" -#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"BNTN\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"BNTN\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"PRLPAY\",\"pubkey\":\"$pubkey\"}" #curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"USD\",\"pubkey\":\"$pubkey\"}" #curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"EUR\",\"pubkey\":\"$pubkey\"}" diff --git a/src/fiat-cli b/src/fiat-cli index a7ee8c62e..f170d4c1c 100755 --- a/src/fiat-cli +++ b/src/fiat-cli @@ -26,3 +26,5 @@ echo vote2018; fiat/vote2018 $1 $2 $3 $4 echo ninja; fiat/ninja $1 $2 $3 $4 echo oot; fiat/oot $1 $2 $3 $4 echo bntn: fiat/bntn $1 $2 $3 $4 +echo chain: fiat/chain $1 $2 $3 $4 +echo prlpay: fiat/prlpay $1 $2 $3 $4 diff --git a/src/fiat/bntn b/src/fiat/bntn old mode 100644 new mode 100755 diff --git a/src/fiat/chain b/src/fiat/chain new file mode 100755 index 000000000..c55d30fbd --- /dev/null +++ b/src/fiat/chain @@ -0,0 +1,2 @@ +#!/bin/bash +./komodo-cli -ac_name=CHAIN $1 $2 $3 $4 $5 $6 diff --git a/src/fiat/prlpay b/src/fiat/prlpay new file mode 100755 index 000000000..7ae6f4e8d --- /dev/null +++ b/src/fiat/prlpay @@ -0,0 +1,2 @@ +#!/bin/bash +./komodo-cli -ac_name=BNTN $1 $2 $3 $4 $5 $6 From 4786d20c0b2f813c5a209817469cdcf3bc514bcc Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Apr 2018 16:40:59 +0300 Subject: [PATCH 0976/1062] PoW targeting in -ac_staking=perc mode --- src/komodo_gateway.h | 105 ++++++++++++++++++++++++++++++++++++++----- src/komodo_utils.h | 5 ++- src/main.cpp | 2 +- 3 files changed, 98 insertions(+), 14 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index c90e1dd80..94a68fb4b 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -726,6 +726,66 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ return(blocktime * winner); } +#define KOMODO_POWMINMULT 16 +arith_uint256 komodo_PoWtarget(int32_t *PoSpercp,arith_uint256 target,int32_t height,int32_t goalperc) +{ + CBlockIndex *pindex; arith_uint256 bnTarget,hashval,sum,ave; bool fNegative,fOverflow; int32_t i,n,ht,percPoS,i,diff; + *percPoSp = percPoS = 0; + sum = arith_uint256(0); + ave = sum; + for (i=n=0; i<100; i++) + { + ht = height - 100 + i; + if ( (pindex= komodo_chainactive(ht)) != 0 ) + { + bnTarget.SetCompact(pindex->nBits,&fNegative,&fOverflow); + bnTarget = (bnTarget / arith_uint256(KOMODO_POWMINMULT)); + hashval = UintToArith256(pindex->GetBlockHash()); + if ( hashval <= bnTarget ) // PoW is never as easy as PoS/64, some PoS will be counted as PoW + { + sum += hashval; + n++; + } else percPoS++; + } + } + *percPoSp = percPoS; + target = (target / arith_uint256(KOMODO_POWMINMULT)); + if ( n > 0 ) + { + ave = (sum / arith_uint256(n)); + if ( ave > target ) + ave = target; + } else return(target); + if ( percPoS < goalperc ) // increase PoW diff -> lower bnTarget + { + bnTarget = (ave * arith_uint256(goalperc)) / arith_uint256(percPoS + goalperc); + for (i=31; i>=24; i--) + fprintf(stderr,"%02x",((uint8_t *)&ave)[i]); + fprintf(stderr," increase diff -> ") + for (i=31; i>=24; i--) + fprintf(stderr,"%02x",((uint8_t *)&bnTarget)[i]); + fprintf(stderr," floor diff ") + for (i=31; i>=24; i--) + fprintf(stderr,"%02x",((uint8_t *)&target)[i]); + fprintf(stderr," ht.%d percPoS.%d vs goal.%d -> diff %d\n",height,percPoS,goalperc,goalperc - percPoS); + } + else if ( percPoS > goalperc ) // decrease PoW diff -> raise bnTarget + { + bnTarget = ((ave * arith_uint256(goalperc)) + (target * arith_uint256(percPoS))) / arith_uint256(percPoS + goalperc); + for (i=31; i>=24; i--) + fprintf(stderr,"%02x",((uint8_t *)&ave)[i]); + fprintf(stderr," decrease diff -> ") + for (i=31; i>=24; i--) + fprintf(stderr,"%02x",((uint8_t *)&bnTarget)[i]); + fprintf(stderr," floor diff ") + for (i=31; i>=24; i--) + fprintf(stderr,"%02x",((uint8_t *)&target)[i]); + fprintf(stderr," ht.%d percPoS.%d vs goal.%d -> diff %d\n",height,percPoS,goalperc,goalperc - percPoS); + } + else bnTarget = ave; // recent ave is perfect + return(bnTarget); +} + int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtime) // verify above block is valid pax pricing { static uint256 array[64]; static int32_t numbanned,indallvouts; @@ -796,20 +856,43 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtim } else { - if ( ASSETCHAINS_STAKED != 0 && height >= 2 && txn_count > 1 ) + if ( ASSETCHAINS_STAKED != 0 && height >= 2 ) { - arith_uint256 bnTarget; bool fNegative,fOverflow; CBlockIndex *previndex; uint32_t eligible; - if ( prevtime == 0 ) - { - if ( (previndex= mapBlockIndex[block.hashPrevBlock]) != 0 ) - prevtime = (uint32_t)previndex->nTime; - } + arith_uint256 bnTarget,hashval; int32_t PoSperc; bool fNegative,fOverflow; CBlockIndex *previndex; uint32_t eligible,isPoS = 0; bnTarget.SetCompact(block.nBits, &fNegative, &fOverflow); - eligible = komodo_stake(bnTarget,height,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n,block.nTime,prevtime,(char *)""); - if ( eligible == 0 || eligible > block.nTime ) + if ( txn_count > 1 ) { - fprintf(stderr,"eligible.%u vs blocktime.%u, lag.%d\n",eligible,(uint32_t)block.nTime,(int32_t)(eligible - block.nTime)); - return(-1); + if ( prevtime == 0 ) + { + if ( (previndex= mapBlockIndex[block.hashPrevBlock]) != 0 ) + prevtime = (uint32_t)previndex->nTime; + } + eligible = komodo_stake(bnTarget,height,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n,block.nTime,prevtime,(char *)""); + if ( eligible == 0 || eligible > block.nTime ) + { + fprintf(stderr,"PoS failute ht.%d eligible.%u vs blocktime.%u, lag.%d\n",height,eligible,(uint32_t)block.nTime,(int32_t)(eligible - block.nTime)); + } else isPoS = 1; + } + if ( isPoS == 0 && height > 100 ) + { + if ( ASSETCHAINS_STAKED == 100 ) + { + fprintf(stderr,"ht.%d 100% PoS after height 100 rule violated for -ac_staking=100\n",height); + return(-1); + } + // check PoW + bnTarget = komodo_PoWtarget(&PoSperc,bnTarget,height,ASSETCHAINS_STAKED); + hashval = UintToArith256(block.GetBlockHash()); + if ( hashval > bnTarget ) + { + for (i=31; i>=0; i--) + fprintf(stderr,"%02x",((uint8_t *)&hashval)[i]); + fprintf(stderr," > "); + for (i=31; i>=0; i--) + fprintf(stderr,"%02x",((uint8_t *)&bnTarget)[i]); + fprintf(stderr," ht.%d PoW diff violation PoSperc.%d vs goalperc.%d\n",height,PoSperc,(int32_t)ASSETCHAINS_STAKED); + return(-1); + } } } if ( ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 && ASSETCHAINS_COMMISSION != 0 && block.vtx[0].vout.size() > 1 ) diff --git a/src/komodo_utils.h b/src/komodo_utils.h index c38df1411..3059ebf64 100644 --- a/src/komodo_utils.h +++ b/src/komodo_utils.h @@ -1542,7 +1542,8 @@ void komodo_args(char *argv0) ASSETCHAINS_DECAY = GetArg("-ac_decay",0); ASSETCHAINS_COMMISSION = GetArg("-ac_perc",0); ASSETCHAINS_OVERRIDE_PUBKEY = GetArg("-ac_pubkey",""); - ASSETCHAINS_STAKED = GetArg("-ac_staked",0); + if ( (ASSETCHAINS_STAKED= GetArg("-ac_staked",0)) > 100 ) + ASSETCHAINS_STAKED = 100; if ( ASSETCHAINS_HALVING != 0 && ASSETCHAINS_HALVING < 1440 ) { ASSETCHAINS_HALVING = 1440; @@ -1574,7 +1575,7 @@ void komodo_args(char *argv0) extralen += iguana_rwnum(1,&extraptr[extralen],sizeof(ASSETCHAINS_REWARD),(void *)&ASSETCHAINS_REWARD); extralen += iguana_rwnum(1,&extraptr[extralen],sizeof(ASSETCHAINS_HALVING),(void *)&ASSETCHAINS_HALVING); extralen += iguana_rwnum(1,&extraptr[extralen],sizeof(ASSETCHAINS_DECAY),(void *)&ASSETCHAINS_DECAY); - val = ASSETCHAINS_COMMISSION | ((ASSETCHAINS_STAKED & 0xffff) << 32); + val = ASSETCHAINS_COMMISSION | ((ASSETCHAINS_STAKED & 0xff) << 32); extralen += iguana_rwnum(1,&extraptr[extralen],sizeof(val),(void *)&val); } addn = GetArg("-seednode",""); diff --git a/src/main.cpp b/src/main.cpp index fc5d4873c..94c536c2f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3626,7 +3626,7 @@ bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& sta // Don't accept any forks from the main chain prior to last checkpoint CBlockIndex* pcheckpoint = Checkpoints::GetLastCheckpoint(chainParams.Checkpoints()); int32_t notarized_height; - if (pcheckpoint && (nHeight < pcheckpoint->nHeight || nHeight == 1 && chainActive.Tip() != 0 && chainActive.Tip()->nHeight > 1) ) + if (pcheckpoint && nHeight > 1 && nHeight < pcheckpoint->nHeight ) return state.DoS(100, error("%s: forked chain older than last checkpoint (height %d) vs %d", __func__, nHeight,pcheckpoint->nHeight)); else if ( komodo_checkpoint(¬arized_height,nHeight,hash) < 0 ) { From 2d9c76280a19f9c2d1a673a48614ecd3706763ba Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Apr 2018 16:49:15 +0300 Subject: [PATCH 0977/1062] Test --- src/komodo_gateway.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 94a68fb4b..a87c1deb8 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -727,9 +727,9 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ } #define KOMODO_POWMINMULT 16 -arith_uint256 komodo_PoWtarget(int32_t *PoSpercp,arith_uint256 target,int32_t height,int32_t goalperc) +arith_uint256 komodo_PoWtarget(int32_t *percPoSp,arith_uint256 target,int32_t height,int32_t goalperc) { - CBlockIndex *pindex; arith_uint256 bnTarget,hashval,sum,ave; bool fNegative,fOverflow; int32_t i,n,ht,percPoS,i,diff; + CBlockIndex *pindex; arith_uint256 bnTarget,hashval,sum,ave; bool fNegative,fOverflow; int32_t i,n,ht,percPoS,diff; *percPoSp = percPoS = 0; sum = arith_uint256(0); ave = sum; @@ -877,12 +877,12 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtim { if ( ASSETCHAINS_STAKED == 100 ) { - fprintf(stderr,"ht.%d 100% PoS after height 100 rule violated for -ac_staking=100\n",height); + fprintf(stderr,"ht.%d 100%% PoS after height 100 rule violated for -ac_staking=100\n",height); return(-1); } // check PoW bnTarget = komodo_PoWtarget(&PoSperc,bnTarget,height,ASSETCHAINS_STAKED); - hashval = UintToArith256(block.GetBlockHash()); + hashval = UintToArith256(block.GetHash()); if ( hashval > bnTarget ) { for (i=31; i>=0; i--) From 8706c053521e8ffcdacbdd26afae674c3e4cd124 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Apr 2018 16:50:39 +0300 Subject: [PATCH 0978/1062] Test --- src/komodo_gateway.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index a87c1deb8..89e4b6080 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -761,10 +761,10 @@ arith_uint256 komodo_PoWtarget(int32_t *percPoSp,arith_uint256 target,int32_t he bnTarget = (ave * arith_uint256(goalperc)) / arith_uint256(percPoS + goalperc); for (i=31; i>=24; i--) fprintf(stderr,"%02x",((uint8_t *)&ave)[i]); - fprintf(stderr," increase diff -> ") + fprintf(stderr," increase diff -> "); for (i=31; i>=24; i--) fprintf(stderr,"%02x",((uint8_t *)&bnTarget)[i]); - fprintf(stderr," floor diff ") + fprintf(stderr," floor diff "); for (i=31; i>=24; i--) fprintf(stderr,"%02x",((uint8_t *)&target)[i]); fprintf(stderr," ht.%d percPoS.%d vs goal.%d -> diff %d\n",height,percPoS,goalperc,goalperc - percPoS); @@ -774,10 +774,10 @@ arith_uint256 komodo_PoWtarget(int32_t *percPoSp,arith_uint256 target,int32_t he bnTarget = ((ave * arith_uint256(goalperc)) + (target * arith_uint256(percPoS))) / arith_uint256(percPoS + goalperc); for (i=31; i>=24; i--) fprintf(stderr,"%02x",((uint8_t *)&ave)[i]); - fprintf(stderr," decrease diff -> ") + fprintf(stderr," decrease diff -> "); for (i=31; i>=24; i--) fprintf(stderr,"%02x",((uint8_t *)&bnTarget)[i]); - fprintf(stderr," floor diff ") + fprintf(stderr," floor diff "); for (i=31; i>=24; i--) fprintf(stderr,"%02x",((uint8_t *)&target)[i]); fprintf(stderr," ht.%d percPoS.%d vs goal.%d -> diff %d\n",height,percPoS,goalperc,goalperc - percPoS); From deba7f205242c6b980df9bea40bd9e0389bcfdd9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Apr 2018 17:05:51 +0300 Subject: [PATCH 0979/1062] Mine PoW for ac_staking --- src/miner.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/miner.cpp b/src/miner.cpp index d249dcce1..e29ec3e08 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -855,6 +855,14 @@ void static BitcoinMiner() } //else fprintf(stderr,"duplicate at j.%d\n",j); } else Mining_start = 0; } else Mining_start = 0; + if ( ASSETCHAINS_STAKED != 0 && NOTARY_PUBKEY33[0] == 0 ) + { + int32_t percPoS,z; + haskTarget = komodo_PoWtarget(&percPoS,haskTarget,pblock->nHeight,ASSETCHAINS_STAKED); + for (z=31; z>=0; z--) + fprintf(stderr,"%02x",((uint8_t *)&hashTarget)[z]); + fprintf(stderr," PoW for staked coin\n"); + } while (true) { /*if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 && pblock->vtx[0].vout.size() == 1 && Mining_height > ASSETCHAINS_MINHEIGHT ) // skips when it shouldnt @@ -914,9 +922,12 @@ void static BitcoinMiner() } else { - printf("need to wait %d seconds to submit\n",(int32_t)(pblock->nTime - GetAdjustedTime())); - while ( GetAdjustedTime() < pblock->nTime ) - sleep(1); + if ( NOTARY_PUBKEY33[0] != 0 ) + { + printf("need to wait %d seconds to submit\n",(int32_t)(pblock->nTime - GetAdjustedTime())); + while ( GetAdjustedTime() < pblock->nTime ) + sleep(1); + } } KOMODO_CHOSEN_ONE = 1; // Found a solution From a8e51a65048be2b04c9e9831066d4fe1d502f778 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Apr 2018 17:09:15 +0300 Subject: [PATCH 0980/1062] Test --- src/miner.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/miner.cpp b/src/miner.cpp index e29ec3e08..e4991515e 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -858,7 +858,7 @@ void static BitcoinMiner() if ( ASSETCHAINS_STAKED != 0 && NOTARY_PUBKEY33[0] == 0 ) { int32_t percPoS,z; - haskTarget = komodo_PoWtarget(&percPoS,haskTarget,pblock->nHeight,ASSETCHAINS_STAKED); + hashTarget = komodo_PoWtarget(&percPoS,haskTarget,Mining_height,ASSETCHAINS_STAKED); for (z=31; z>=0; z--) fprintf(stderr,"%02x",((uint8_t *)&hashTarget)[z]); fprintf(stderr," PoW for staked coin\n"); From 898a4b9b6847ba4d52820de6e51eb7ce6a9898e8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Apr 2018 17:09:50 +0300 Subject: [PATCH 0981/1062] Test --- src/miner.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/miner.cpp b/src/miner.cpp index e4991515e..78dcbea9d 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -858,7 +858,7 @@ void static BitcoinMiner() if ( ASSETCHAINS_STAKED != 0 && NOTARY_PUBKEY33[0] == 0 ) { int32_t percPoS,z; - hashTarget = komodo_PoWtarget(&percPoS,haskTarget,Mining_height,ASSETCHAINS_STAKED); + hashTarget = komodo_PoWtarget(&percPoS,hashTarget,Mining_height,ASSETCHAINS_STAKED); for (z=31; z>=0; z--) fprintf(stderr,"%02x",((uint8_t *)&hashTarget)[z]); fprintf(stderr," PoW for staked coin\n"); From 13691369bf9993e120183ad0dd561ef2a2f0c8f5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Apr 2018 17:10:41 +0300 Subject: [PATCH 0982/1062] Test --- src/miner.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/miner.cpp b/src/miner.cpp index 78dcbea9d..b02a62513 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -654,6 +654,7 @@ static bool ProcessBlockFound(CBlock* pblock) int32_t komodo_baseid(char *origbase); int32_t komodo_eligiblenotary(uint8_t pubkeys[66][33],int32_t *mids,int32_t *nonzpkeysp,int32_t height); +arith_uint256 komodo_PoWtarget(int32_t *percPoSp,arith_uint256 target,int32_t height,int32_t goalperc); int32_t FOUND_BLOCK,KOMODO_MAYBEMINED; extern int32_t KOMODO_LASTMINED; int32_t roundrobin_delay; From 7dbeae5dc35def1354d346c688757074a7c73984 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Apr 2018 17:21:31 +0300 Subject: [PATCH 0983/1062] Test --- src/miner.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/miner.cpp b/src/miner.cpp index b02a62513..27ac64234 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -387,7 +387,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) blocktime = std::max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime()); pblock->nTime = blocktime; pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, Params().GetConsensus()); - LogPrintf("CreateNewBlock(): total size %u blocktime.%u nBits.%08x\n", nBlockSize,blocktime,pblock->nBits); + //LogPrintf("CreateNewBlock(): total size %u blocktime.%u nBits.%08x\n", nBlockSize,blocktime,pblock->nBits); if ( ASSETCHAINS_SYMBOL[0] != 0 && ASSETCHAINS_STAKED != 0 && NOTARY_PUBKEY33[0] != 0 ) { uint64_t txfees,utxovalue; uint32_t txtime; uint256 utxotxid,revtxid; int32_t i,siglen,numsigs,utxovout; uint8_t utxosig[128],*ptr; From 0d8ffadc4a924f25d40ce7ffb99e362cee170ef6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Apr 2018 17:29:21 +0300 Subject: [PATCH 0984/1062] Test --- src/miner.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/miner.cpp b/src/miner.cpp index 27ac64234..17ab7353e 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -1053,7 +1053,7 @@ void static BitcoinMiner() // Update nNonce and nTime pblock->nNonce = ArithToUint256(UintToArith256(pblock->nNonce) + 1); pblock->nBits = savebits; - if ( ASSETCHAINS_STAKED == 0 ) + if ( ASSETCHAINS_STAKED == 0 || NOTARY_PUBKEY33[0] == 0 ) UpdateTime(pblock, chainparams.GetConsensus(), pindexPrev); if (chainparams.GetConsensus().fPowAllowMinDifficultyBlocks) { From 4972b74b60027f75534811b6e63bf027171a15e6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Apr 2018 17:49:11 +0300 Subject: [PATCH 0985/1062] Test --- src/komodo_gateway.h | 42 ++++++++++++++++++++++++------------------ src/miner.cpp | 6 +++--- 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 89e4b6080..1363a6c84 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -759,28 +759,34 @@ arith_uint256 komodo_PoWtarget(int32_t *percPoSp,arith_uint256 target,int32_t he if ( percPoS < goalperc ) // increase PoW diff -> lower bnTarget { bnTarget = (ave * arith_uint256(goalperc)) / arith_uint256(percPoS + goalperc); - for (i=31; i>=24; i--) - fprintf(stderr,"%02x",((uint8_t *)&ave)[i]); - fprintf(stderr," increase diff -> "); - for (i=31; i>=24; i--) - fprintf(stderr,"%02x",((uint8_t *)&bnTarget)[i]); - fprintf(stderr," floor diff "); - for (i=31; i>=24; i--) - fprintf(stderr,"%02x",((uint8_t *)&target)[i]); - fprintf(stderr," ht.%d percPoS.%d vs goal.%d -> diff %d\n",height,percPoS,goalperc,goalperc - percPoS); + if ( 0 ) + { + for (i=31; i>=24; i--) + fprintf(stderr,"%02x",((uint8_t *)&ave)[i]); + fprintf(stderr," increase diff -> "); + for (i=31; i>=24; i--) + fprintf(stderr,"%02x",((uint8_t *)&bnTarget)[i]); + fprintf(stderr," floor diff "); + for (i=31; i>=24; i--) + fprintf(stderr,"%02x",((uint8_t *)&target)[i]); + fprintf(stderr," ht.%d percPoS.%d vs goal.%d -> diff %d\n",height,percPoS,goalperc,goalperc - percPoS); + } } else if ( percPoS > goalperc ) // decrease PoW diff -> raise bnTarget { bnTarget = ((ave * arith_uint256(goalperc)) + (target * arith_uint256(percPoS))) / arith_uint256(percPoS + goalperc); - for (i=31; i>=24; i--) - fprintf(stderr,"%02x",((uint8_t *)&ave)[i]); - fprintf(stderr," decrease diff -> "); - for (i=31; i>=24; i--) - fprintf(stderr,"%02x",((uint8_t *)&bnTarget)[i]); - fprintf(stderr," floor diff "); - for (i=31; i>=24; i--) - fprintf(stderr,"%02x",((uint8_t *)&target)[i]); - fprintf(stderr," ht.%d percPoS.%d vs goal.%d -> diff %d\n",height,percPoS,goalperc,goalperc - percPoS); + if ( 0 ) + { + for (i=31; i>=24; i--) + fprintf(stderr,"%02x",((uint8_t *)&ave)[i]); + fprintf(stderr," decrease diff -> "); + for (i=31; i>=24; i--) + fprintf(stderr,"%02x",((uint8_t *)&bnTarget)[i]); + fprintf(stderr," floor diff "); + for (i=31; i>=24; i--) + fprintf(stderr,"%02x",((uint8_t *)&target)[i]); + fprintf(stderr," ht.%d percPoS.%d vs goal.%d -> diff %d\n",height,percPoS,goalperc,goalperc - percPoS); + } } else bnTarget = ave; // recent ave is perfect return(bnTarget); diff --git a/src/miner.cpp b/src/miner.cpp index 17ab7353e..79cd2588e 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -100,7 +100,7 @@ public: void UpdateTime(CBlockHeader* pblock, const Consensus::Params& consensusParams, const CBlockIndex* pindexPrev) { - pblock->nTime = std::max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime()); + pblock->nTime = 1 + std::max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime()); } #include "komodo_defs.h" @@ -902,8 +902,8 @@ void static BitcoinMiner() solutionTargetChecks.increment(); if ( UintToArith256(pblock->GetHash()) > hashTarget ) { - //if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 ) - // fprintf(stderr," missed target\n"); + if ( ASSETCHAINS_SYMBOL[0] != 0 ) + fprintf(stderr," missed target\n"); return false; } if ( ASSETCHAINS_STAKED == 0 ) From 68d0354d9de9c556cbce49ff9270462c37eba6b9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Apr 2018 17:58:38 +0300 Subject: [PATCH 0986/1062] Test --- src/miner.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/miner.cpp b/src/miner.cpp index 79cd2588e..21e0a8fdd 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -929,6 +929,15 @@ void static BitcoinMiner() while ( GetAdjustedTime() < pblock->nTime ) sleep(1); } + else + { + CValidationState state; + if ( !TestBlockValidity(state, *pblock, pindexPrev, false, false)) + { + fprintf(stderr,"Invalid block mined, try again\n"); + return(false); + } + } } KOMODO_CHOSEN_ONE = 1; // Found a solution From 25d977f73d321acf9c1d3909ed36b2fcf1741c21 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Apr 2018 17:58:56 +0300 Subject: [PATCH 0987/1062] Test --- src/miner.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/miner.cpp b/src/miner.cpp index 21e0a8fdd..1a0a5c6f7 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -902,8 +902,8 @@ void static BitcoinMiner() solutionTargetChecks.increment(); if ( UintToArith256(pblock->GetHash()) > hashTarget ) { - if ( ASSETCHAINS_SYMBOL[0] != 0 ) - fprintf(stderr," missed target\n"); + //if ( ASSETCHAINS_SYMBOL[0] != 0 ) + // fprintf(stderr," missed target\n"); return false; } if ( ASSETCHAINS_STAKED == 0 ) From 14bbc7eb1d4bc42352e7a89b0ebaffd70837f7f1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Apr 2018 18:01:04 +0300 Subject: [PATCH 0988/1062] Test --- src/miner.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/miner.cpp b/src/miner.cpp index 1a0a5c6f7..9fbe1adb0 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -932,7 +932,7 @@ void static BitcoinMiner() else { CValidationState state; - if ( !TestBlockValidity(state, *pblock, pindexPrev, false, false)) + if ( !TestBlockValidity(state, *pblock, chainActive.Tip(), false, false)) { fprintf(stderr,"Invalid block mined, try again\n"); return(false); From b1e74295fd6f3ee91dfeb4eb713374051f5d80d0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Apr 2018 18:19:27 +0300 Subject: [PATCH 0989/1062] Test --- src/main.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 94c536c2f..1aafc6c26 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3576,7 +3576,8 @@ bool CheckBlock(int32_t height,CBlockIndex *pindex,const CBlock& block, CValidat if (nSigOps > MAX_BLOCK_SIGOPS) return state.DoS(100, error("CheckBlock(): out-of-bounds SigOpCount"), REJECT_INVALID, "bad-blk-sigops", true); - if ( komodo_check_deposit(ASSETCHAINS_SYMBOL[0] == 0 ? height : pindex != 0 ? (int32_t)pindex->nHeight : chainActive.Tip()->nHeight+1,block,pindex==0||pindex->pprev==0?0:pindex->pprev->nTime) < 0 ) + if ( komodo_check_deposit(height,block,(pindex==0||pindex->pprev==0)?0:pindex->pprev->nTime) < 0 ) + //if ( komodo_check_deposit(ASSETCHAINS_SYMBOL[0] == 0 ? height : pindex != 0 ? (int32_t)pindex->nHeight : chainActive.Tip()->nHeight+1,block,pindex==0||pindex->pprev==0?0:pindex->pprev->nTime) < 0 ) { static uint32_t counter; if ( counter++ < 100 && ASSETCHAINS_STAKED == 0 ) From 294925c70ab56c5d52d09889f3ea131d5f348a74 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Apr 2018 18:22:32 +0300 Subject: [PATCH 0990/1062] Test --- src/main.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main.cpp b/src/main.cpp index 1aafc6c26..2895e888e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4534,6 +4534,8 @@ bool InitBlockIndex() { if (!WriteBlockToDisk(block, blockPos, chainparams.MessageStart())) return error("LoadBlockIndex(): writing genesis block to disk failed"); CBlockIndex *pindex = AddToBlockIndex(block); + if ( pindex == 0 ) + return error("LoadBlockIndex(): couldnt add to block index"); if (!ReceivedBlockTransactions(block, state, pindex, blockPos)) return error("LoadBlockIndex(): genesis block not accepted"); if (!ActivateBestChain(state, &block)) From b7aaca4be3ce163c523911f2a2a11e8f212e9e8d Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Apr 2018 19:03:31 +0300 Subject: [PATCH 0991/1062] Test --- src/miner.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/miner.cpp b/src/miner.cpp index 9fbe1adb0..9e705a40f 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -937,6 +937,10 @@ void static BitcoinMiner() fprintf(stderr,"Invalid block mined, try again\n"); return(false); } + arith_uint256 tmp = pblock->GetHash(); + int32_t z; for (z=31; z>=0; z--) + fprintf(stderr,"%02x",((uint8_t *)&tmp)[z]); + fprintf(stderr," mined block!\n"); } } KOMODO_CHOSEN_ONE = 1; From e4821a8282527c676f6026e3a58b9b059b59b511 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Apr 2018 19:06:11 +0300 Subject: [PATCH 0992/1062] Test --- src/miner.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/miner.cpp b/src/miner.cpp index 9e705a40f..c444f0423 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -937,7 +937,7 @@ void static BitcoinMiner() fprintf(stderr,"Invalid block mined, try again\n"); return(false); } - arith_uint256 tmp = pblock->GetHash(); + uint256 tmp = pblock->GetHash(); int32_t z; for (z=31; z>=0; z--) fprintf(stderr,"%02x",((uint8_t *)&tmp)[z]); fprintf(stderr," mined block!\n"); From dc60244b09ccbcdaf514133ad5a80e32ae69a2df Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Apr 2018 19:08:25 +0300 Subject: [PATCH 0993/1062] Test --- src/komodo_gateway.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 1363a6c84..a5654363d 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -891,12 +891,12 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtim hashval = UintToArith256(block.GetHash()); if ( hashval > bnTarget ) { - for (i=31; i>=0; i--) + /*for (i=31; i>=0; i--) fprintf(stderr,"%02x",((uint8_t *)&hashval)[i]); fprintf(stderr," > "); for (i=31; i>=0; i--) fprintf(stderr,"%02x",((uint8_t *)&bnTarget)[i]); - fprintf(stderr," ht.%d PoW diff violation PoSperc.%d vs goalperc.%d\n",height,PoSperc,(int32_t)ASSETCHAINS_STAKED); + fprintf(stderr," ht.%d PoW diff violation PoSperc.%d vs goalperc.%d\n",height,PoSperc,(int32_t)ASSETCHAINS_STAKED);*/ return(-1); } } From 88287857643acde870e749da79b4a59551327df9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Apr 2018 19:10:18 +0300 Subject: [PATCH 0994/1062] Test --- src/miner.cpp | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/miner.cpp b/src/miner.cpp index c444f0423..d8211a869 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -658,6 +658,7 @@ arith_uint256 komodo_PoWtarget(int32_t *percPoSp,arith_uint256 target,int32_t he int32_t FOUND_BLOCK,KOMODO_MAYBEMINED; extern int32_t KOMODO_LASTMINED; int32_t roundrobin_delay; +arith_uint256 HASHTarget; #ifdef ENABLE_WALLET void static BitcoinMiner(CWallet *pwallet) @@ -800,7 +801,7 @@ void static BitcoinMiner() // uint8_t pubkeys[66][33]; int mids[256],gpucount,nonzpkeys,i,j,externalflag; uint32_t savebits; int64_t nStart = GetTime(); savebits = pblock->nBits; - arith_uint256 hashTarget = arith_uint256().SetCompact(pblock->nBits); + HASHTarget = arith_uint256().SetCompact(pblock->nBits); roundrobin_delay = ROUNDROBIN_DELAY; if ( ASSETCHAINS_SYMBOL[0] == 0 && notaryid >= 0 ) { @@ -851,7 +852,7 @@ void static BitcoinMiner() } else fprintf(stderr,"no nonz pubkeys\n"); if ( (Mining_height >= 235300 && Mining_height < 236000) || (j == 65 && Mining_height > KOMODO_MAYBEMINED+1 && Mining_height > KOMODO_LASTMINED+64) ) { - hashTarget = arith_uint256().SetCompact(KOMODO_MINDIFF_NBITS); + HASHTarget = arith_uint256().SetCompact(KOMODO_MINDIFF_NBITS); fprintf(stderr,"I am the chosen one for %s ht.%d\n",ASSETCHAINS_SYMBOL,pindexPrev->nHeight+1); } //else fprintf(stderr,"duplicate at j.%d\n",j); } else Mining_start = 0; @@ -859,9 +860,9 @@ void static BitcoinMiner() if ( ASSETCHAINS_STAKED != 0 && NOTARY_PUBKEY33[0] == 0 ) { int32_t percPoS,z; - hashTarget = komodo_PoWtarget(&percPoS,hashTarget,Mining_height,ASSETCHAINS_STAKED); + HASHTarget = komodo_PoWtarget(&percPoS,HASHTarget,Mining_height,ASSETCHAINS_STAKED); for (z=31; z>=0; z--) - fprintf(stderr,"%02x",((uint8_t *)&hashTarget)[z]); + fprintf(stderr,"%02x",((uint8_t *)&HASHTarget)[z]); fprintf(stderr," PoW for staked coin\n"); } while (true) @@ -891,16 +892,16 @@ void static BitcoinMiner() //fprintf(stderr,"running solver\n"); std::function)> validBlock = #ifdef ENABLE_WALLET - [&pblock, &hashTarget, &pwallet, &reservekey, &m_cs, &cancelSolver, &chainparams] + [&pblock, &HASHTarget, &pwallet, &reservekey, &m_cs, &cancelSolver, &chainparams] #else - [&pblock, &hashTarget, &m_cs, &cancelSolver, &chainparams] + [&pblock, &HASHTarget, &m_cs, &cancelSolver, &chainparams] #endif (std::vector soln) { // Write the solution to the hash and compute the result. LogPrint("pow", "- Checking solution against target\n"); pblock->nSolution = soln; solutionTargetChecks.increment(); - if ( UintToArith256(pblock->GetHash()) > hashTarget ) + if ( UintToArith256(pblock->GetHash()) > HASHTarget ) { //if ( ASSETCHAINS_SYMBOL[0] != 0 ) // fprintf(stderr," missed target\n"); @@ -934,7 +935,7 @@ void static BitcoinMiner() CValidationState state; if ( !TestBlockValidity(state, *pblock, chainActive.Tip(), false, false)) { - fprintf(stderr,"Invalid block mined, try again\n"); + //fprintf(stderr,"Invalid block mined, try again\n"); return(false); } uint256 tmp = pblock->GetHash(); @@ -947,7 +948,7 @@ void static BitcoinMiner() // Found a solution SetThreadPriority(THREAD_PRIORITY_NORMAL); LogPrintf("KomodoMiner:\n"); - LogPrintf("proof-of-work found \n hash: %s \ntarget: %s\n", pblock->GetHash().GetHex(), hashTarget.GetHex()); + LogPrintf("proof-of-work found \n hash: %s \ntarget: %s\n", pblock->GetHash().GetHex(), HASHTarget.GetHex()); #ifdef ENABLE_WALLET if (ProcessBlockFound(pblock, *pwallet, reservekey)) { #else @@ -1071,7 +1072,7 @@ void static BitcoinMiner() if (chainparams.GetConsensus().fPowAllowMinDifficultyBlocks) { // Changing pblock->nTime can change work required on testnet: - hashTarget.SetCompact(pblock->nBits); + HASHTarget.SetCompact(pblock->nBits); } } } From 7da8410746ded9c6daff43dc22fc7d777240fddc Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Apr 2018 19:11:57 +0300 Subject: [PATCH 0995/1062] Test --- src/miner.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/miner.cpp b/src/miner.cpp index d8211a869..e45b9e59b 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -889,12 +889,13 @@ void static BitcoinMiner() crypto_generichash_blake2b_update(&curr_state,pblock->nNonce.begin(),pblock->nNonce.size()); // (x_1, x_2, ...) = A(I, V, n, k) LogPrint("pow", "Running Equihash solver \"%s\" with nNonce = %s\n",solver, pblock->nNonce.ToString()); + arith_uint256 hashTarget = HASHTarget; //fprintf(stderr,"running solver\n"); std::function)> validBlock = #ifdef ENABLE_WALLET - [&pblock, &HASHTarget, &pwallet, &reservekey, &m_cs, &cancelSolver, &chainparams] + [&pblock, &hashTarget, &pwallet, &reservekey, &m_cs, &cancelSolver, &chainparams] #else - [&pblock, &HASHTarget, &m_cs, &cancelSolver, &chainparams] + [&pblock, &hashTarget, &m_cs, &cancelSolver, &chainparams] #endif (std::vector soln) { // Write the solution to the hash and compute the result. From 053fef7cfd9904cc251c3186f5c21561d6d4c32f Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Apr 2018 19:18:32 +0300 Subject: [PATCH 0996/1062] Test --- src/komodo_gateway.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index a5654363d..0ebccabcf 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -759,7 +759,7 @@ arith_uint256 komodo_PoWtarget(int32_t *percPoSp,arith_uint256 target,int32_t he if ( percPoS < goalperc ) // increase PoW diff -> lower bnTarget { bnTarget = (ave * arith_uint256(goalperc)) / arith_uint256(percPoS + goalperc); - if ( 0 ) + if ( 1 ) { for (i=31; i>=24; i--) fprintf(stderr,"%02x",((uint8_t *)&ave)[i]); @@ -775,7 +775,7 @@ arith_uint256 komodo_PoWtarget(int32_t *percPoSp,arith_uint256 target,int32_t he else if ( percPoS > goalperc ) // decrease PoW diff -> raise bnTarget { bnTarget = ((ave * arith_uint256(goalperc)) + (target * arith_uint256(percPoS))) / arith_uint256(percPoS + goalperc); - if ( 0 ) + if ( 1 ) { for (i=31; i>=24; i--) fprintf(stderr,"%02x",((uint8_t *)&ave)[i]); From 49c374d7ad712d50f2d7ff4b2aafc3cc14271908 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Apr 2018 19:34:22 +0300 Subject: [PATCH 0997/1062] Test --- src/komodo_gateway.h | 2 +- src/miner.cpp | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 0ebccabcf..b4ff7affd 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -876,7 +876,7 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtim eligible = komodo_stake(bnTarget,height,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n,block.nTime,prevtime,(char *)""); if ( eligible == 0 || eligible > block.nTime ) { - fprintf(stderr,"PoS failute ht.%d eligible.%u vs blocktime.%u, lag.%d\n",height,eligible,(uint32_t)block.nTime,(int32_t)(eligible - block.nTime)); + fprintf(stderr,"PoS failure ht.%d eligible.%u vs blocktime.%u, lag.%d\n",height,eligible,(uint32_t)block.nTime,(int32_t)(eligible - block.nTime)); } else isPoS = 1; } if ( isPoS == 0 && height > 100 ) diff --git a/src/miner.cpp b/src/miner.cpp index e45b9e59b..be2c5a0aa 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -925,6 +925,12 @@ void static BitcoinMiner() } else { + CValidationState state; + if ( !TestBlockValidity(state, *pblock, chainActive.Tip(), false, false)) + { + //fprintf(stderr,"Invalid block mined, try again\n"); + return(false); + } if ( NOTARY_PUBKEY33[0] != 0 ) { printf("need to wait %d seconds to submit\n",(int32_t)(pblock->nTime - GetAdjustedTime())); @@ -933,12 +939,6 @@ void static BitcoinMiner() } else { - CValidationState state; - if ( !TestBlockValidity(state, *pblock, chainActive.Tip(), false, false)) - { - //fprintf(stderr,"Invalid block mined, try again\n"); - return(false); - } uint256 tmp = pblock->GetHash(); int32_t z; for (z=31; z>=0; z--) fprintf(stderr,"%02x",((uint8_t *)&tmp)[z]); From 409c28a2e2c43d21ecca6f9687c70581c6eb4590 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Apr 2018 19:46:33 +0300 Subject: [PATCH 0998/1062] Test --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 2895e888e..fb833bff5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -562,7 +562,7 @@ CBlockIndex* FindForkInGlobalIndex(const CChain& chain, const CBlockLocator& loc CBlockIndex* pindex = (*mi).second; if (pindex != 0 && chain.Contains(pindex)) return pindex; - if (pindex->GetAncestor(chain.Height()) == chain.Tip()) { + if (pindex != 0 && pindex->GetAncestor(chain.Height()) == chain.Tip()) { return chain.Tip(); } } From 007aca381b562e2c2e32ee8dc89cf00efc0c92f7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Apr 2018 20:38:12 +0300 Subject: [PATCH 0999/1062] Test --- src/arith_uint256.cpp | 2 +- src/komodo_gateway.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/arith_uint256.cpp b/src/arith_uint256.cpp index a1865b649..c9074fe91 100644 --- a/src/arith_uint256.cpp +++ b/src/arith_uint256.cpp @@ -111,7 +111,7 @@ int base_uint::CompareTo(const base_uint& b) const { if ( (uint64_t)pn < 0x1000 || (uint64_t)b.pn <= 0x1000 ) { - fprintf(stderr,"CompareTo null %p or %p\n",pn,b.pn); + //fprintf(stderr,"CompareTo null %p or %p\n",pn,b.pn); return(0); } for (int i = WIDTH - 1; i >= 0; i--) { diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index b4ff7affd..e85252367 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -876,7 +876,7 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtim eligible = komodo_stake(bnTarget,height,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n,block.nTime,prevtime,(char *)""); if ( eligible == 0 || eligible > block.nTime ) { - fprintf(stderr,"PoS failure ht.%d eligible.%u vs blocktime.%u, lag.%d\n",height,eligible,(uint32_t)block.nTime,(int32_t)(eligible - block.nTime)); + fprintf(stderr,"PoS failure ht.%d eligible.%u vs blocktime.%u, lag.%d -> check to see if it is PoW block\n",height,eligible,(uint32_t)block.nTime,(int32_t)(eligible - block.nTime)); } else isPoS = 1; } if ( isPoS == 0 && height > 100 ) From a6cb17f049780374d0bf2f143cdc5b9494f9ec1d Mon Sep 17 00:00:00 2001 From: Mihail Fedorov Date: Tue, 10 Apr 2018 21:25:36 +0300 Subject: [PATCH 1000/1062] fat finger typo --- src/fiat-cli | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/fiat-cli b/src/fiat-cli index f170d4c1c..ce2e7a51d 100755 --- a/src/fiat-cli +++ b/src/fiat-cli @@ -25,6 +25,6 @@ echo beer; fiat/beer $1 $2 $3 $4 echo vote2018; fiat/vote2018 $1 $2 $3 $4 echo ninja; fiat/ninja $1 $2 $3 $4 echo oot; fiat/oot $1 $2 $3 $4 -echo bntn: fiat/bntn $1 $2 $3 $4 -echo chain: fiat/chain $1 $2 $3 $4 -echo prlpay: fiat/prlpay $1 $2 $3 $4 +echo bntn; fiat/bntn $1 $2 $3 $4 +echo chain; fiat/chain $1 $2 $3 $4 +echo prlpay; fiat/prlpay $1 $2 $3 $4 From 234c0ac057d67d348addfd74ac69d6a16dfcf304 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 11 Apr 2018 04:07:06 +0300 Subject: [PATCH 1001/1062] Skew nBits PoS diff to 1 --- src/miner.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/miner.cpp b/src/miner.cpp index be2c5a0aa..692db8ce6 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -392,6 +392,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) { uint64_t txfees,utxovalue; uint32_t txtime; uint256 utxotxid,revtxid; int32_t i,siglen,numsigs,utxovout; uint8_t utxosig[128],*ptr; CMutableTransaction txStaked = CreateNewContextualCMutableTransaction(Params().GetConsensus(), chainActive.Height() + 1); + blocktime += 2; if ( (siglen= komodo_staked(txStaked,pblock->nBits,&blocktime,&txtime,&utxotxid,&utxovout,&utxovalue,utxosig)) > 0 ) { CAmount txfees = 0; From 3815678c0dc3bc293d069f73f01a788328fbba70 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 11 Apr 2018 04:21:48 +0300 Subject: [PATCH 1002/1062] Add segid even if winning block --- src/komodo_gateway.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index e85252367..4a92b6e5a 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -693,7 +693,10 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ coinage = (((value * diff) / supply) * diff); hashval = arith_uint256(supply * 64) * (UintToArith256(hash) / arith_uint256(coinage+1)); if ( hashval <= bnTarget ) + { winner = 1; + blocktime += segid; + } else { for (iter=1; iter<3600*8; iter++) From 8373141bb7b8fdaadbfd125358d89d986024ff3e Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 11 Apr 2018 04:43:43 +0300 Subject: [PATCH 1003/1062] Test --- src/komodo_gateway.h | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 4a92b6e5a..026969dac 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -689,9 +689,13 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ memcpy(&hashbuf[sizeof(pasthash)],&addrhash,sizeof(addrhash)); vcalc_sha256(0,(uint8_t *)&hash,hashbuf,(int32_t)sizeof(uint256)*2); //fprintf(stderr,"(%s) vs. (%s) %s %.8f txtime.%u\n",address,destaddr,hash.ToString().c_str(),dstr(value),txtime); - diff = (blocktime - txtime); - coinage = (((value * diff) / supply) * diff); - hashval = arith_uint256(supply * 64) * (UintToArith256(hash) / arith_uint256(coinage+1)); + diff = (blocktime - txtime - minage); + //if ( diff > 3600 ) + // diff = 3600; + //coinage = (((value * diff) / supply) * diff); + coinage = (value * diff); + //hashval = arith_uint256(supply * 64) * (UintToArith256(hash) / arith_uint256(coinage+1)); + hashval = (UintToArith256(hash) / arith_uint256(coinage+1)); if ( hashval <= bnTarget ) { winner = 1; @@ -699,9 +703,11 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ } else { - for (iter=1; iter<3600*8; iter++) + for (iter=1; iter<3600; iter++) { - diff = (iter + blocktime - txtime); + diff = (iter + blocktime - txtime - minage); + //if ( diff > 3600 ) + // break; coinage = (((value * diff) / supply) * diff); hashval = arith_uint256(supply * 64) * (UintToArith256(hash) / arith_uint256(coinage+1)); if ( hashval <= bnTarget ) From 188e19a735d6e7c42a1f97a86dfbe73ae5f3ed44 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 11 Apr 2018 04:45:45 +0300 Subject: [PATCH 1004/1062] Test --- src/komodo_gateway.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 026969dac..d89936c37 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -693,7 +693,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ //if ( diff > 3600 ) // diff = 3600; //coinage = (((value * diff) / supply) * diff); - coinage = (value * diff); + coinage = (value * diff) * ((diff >> 16) + 1); //hashval = arith_uint256(supply * 64) * (UintToArith256(hash) / arith_uint256(coinage+1)); hashval = (UintToArith256(hash) / arith_uint256(coinage+1)); if ( hashval <= bnTarget ) @@ -720,7 +720,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ } //fprintf(stderr,"iterated until i.%d winner.%d\n",i,winner); } - if ( 0 ) + if ( 1 ) { for (i=31; i>=24; i--) fprintf(stderr,"%02x",((uint8_t *)&hashval)[i]); From c09e3fa1a7873504b2bcc561733e41fcc30b7115 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 11 Apr 2018 04:48:32 +0300 Subject: [PATCH 1005/1062] Test --- src/komodo_gateway.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index d89936c37..778be3eca 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -690,8 +690,8 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ vcalc_sha256(0,(uint8_t *)&hash,hashbuf,(int32_t)sizeof(uint256)*2); //fprintf(stderr,"(%s) vs. (%s) %s %.8f txtime.%u\n",address,destaddr,hash.ToString().c_str(),dstr(value),txtime); diff = (blocktime - txtime - minage); - //if ( diff > 3600 ) - // diff = 3600; + if ( diff > 3600*24 ) + diff = 3600*24; //coinage = (((value * diff) / supply) * diff); coinage = (value * diff) * ((diff >> 16) + 1); //hashval = arith_uint256(supply * 64) * (UintToArith256(hash) / arith_uint256(coinage+1)); @@ -706,8 +706,8 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ for (iter=1; iter<3600; iter++) { diff = (iter + blocktime - txtime - minage); - //if ( diff > 3600 ) - // break; + if ( diff > 3600*24 ) + break; coinage = (((value * diff) / supply) * diff); hashval = arith_uint256(supply * 64) * (UintToArith256(hash) / arith_uint256(coinage+1)); if ( hashval <= bnTarget ) From 52955b6feca259312188859a43860703564c3299 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 11 Apr 2018 04:53:05 +0300 Subject: [PATCH 1006/1062] Test --- src/komodo_gateway.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 778be3eca..d29e70261 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -694,8 +694,8 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ diff = 3600*24; //coinage = (((value * diff) / supply) * diff); coinage = (value * diff) * ((diff >> 16) + 1); - //hashval = arith_uint256(supply * 64) * (UintToArith256(hash) / arith_uint256(coinage+1)); - hashval = (UintToArith256(hash) / arith_uint256(coinage+1)); + hashval = arith_uint256(supply * 64) * (UintToArith256(hash) / arith_uint256(coinage+1)); + //hashval = (UintToArith256(hash) / arith_uint256(coinage+1)); if ( hashval <= bnTarget ) { winner = 1; From f21f0d70412eb8b072342534f9af2833a4c938b3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 11 Apr 2018 04:59:39 +0300 Subject: [PATCH 1007/1062] Test --- src/miner.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/miner.cpp b/src/miner.cpp index 692db8ce6..b5187a615 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -385,7 +385,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) nLastBlockTx = nBlockTx; nLastBlockSize = nBlockSize; blocktime = std::max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime()); - pblock->nTime = blocktime; + pblock->nTime = blocktime + 1; pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, Params().GetConsensus()); //LogPrintf("CreateNewBlock(): total size %u blocktime.%u nBits.%08x\n", nBlockSize,blocktime,pblock->nBits); if ( ASSETCHAINS_SYMBOL[0] != 0 && ASSETCHAINS_STAKED != 0 && NOTARY_PUBKEY33[0] != 0 ) From a0845beaadafa072fcf111a1ffbaf2def86cd1f8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 11 Apr 2018 05:15:04 +0300 Subject: [PATCH 1008/1062] Test --- src/komodo_gateway.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index d29e70261..c6d736686 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -720,7 +720,7 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ } //fprintf(stderr,"iterated until i.%d winner.%d\n",i,winner); } - if ( 1 ) + if ( 0 ) { for (i=31; i>=24; i--) fprintf(stderr,"%02x",((uint8_t *)&hashval)[i]); From c966741fb69aabc9a80be17beb9973c29232ece6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 11 Apr 2018 05:16:30 +0300 Subject: [PATCH 1009/1062] Test --- src/miner.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/miner.cpp b/src/miner.cpp index b5187a615..f95933117 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -861,6 +861,11 @@ void static BitcoinMiner() if ( ASSETCHAINS_STAKED != 0 && NOTARY_PUBKEY33[0] == 0 ) { int32_t percPoS,z; + if ( Mining_height <= 100 ) + { + sleep(60); + continue; + } HASHTarget = komodo_PoWtarget(&percPoS,HASHTarget,Mining_height,ASSETCHAINS_STAKED); for (z=31; z>=0; z--) fprintf(stderr,"%02x",((uint8_t *)&HASHTarget)[z]); From 21d3884815f0880fece09875fb511e70f49fbbf2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 11 Apr 2018 05:24:20 +0300 Subject: [PATCH 1010/1062] Test --- src/komodo_gateway.h | 39 ++++++++++++--------------------------- 1 file changed, 12 insertions(+), 27 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index c6d736686..39e3d4d21 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -689,37 +689,22 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ memcpy(&hashbuf[sizeof(pasthash)],&addrhash,sizeof(addrhash)); vcalc_sha256(0,(uint8_t *)&hash,hashbuf,(int32_t)sizeof(uint256)*2); //fprintf(stderr,"(%s) vs. (%s) %s %.8f txtime.%u\n",address,destaddr,hash.ToString().c_str(),dstr(value),txtime); - diff = (blocktime - txtime - minage); - if ( diff > 3600*24 ) - diff = 3600*24; - //coinage = (((value * diff) / supply) * diff); - coinage = (value * diff) * ((diff >> 16) + 1); - hashval = arith_uint256(supply * 64) * (UintToArith256(hash) / arith_uint256(coinage+1)); - //hashval = (UintToArith256(hash) / arith_uint256(coinage+1)); - if ( hashval <= bnTarget ) + for (iter=0; iter<3600; iter++) { - winner = 1; - blocktime += segid; - } - else - { - for (iter=1; iter<3600; iter++) + diff = (iter + blocktime - txtime - minage); + if ( diff > 3600*24 ) + break; + coinage = (value * diff) * ((diff >> 16) + 1); + hashval = arith_uint256(supply * 64) * (UintToArith256(hash) / arith_uint256(coinage+1)); + if ( hashval <= bnTarget ) { - diff = (iter + blocktime - txtime - minage); - if ( diff > 3600*24 ) - break; - coinage = (((value * diff) / supply) * diff); - hashval = arith_uint256(supply * 64) * (UintToArith256(hash) / arith_uint256(coinage+1)); - if ( hashval <= bnTarget ) - { - winner = 1; - blocktime += iter; - blocktime += segid; - break; - } + winner = 1; + blocktime += iter; + blocktime += segid; + break; } - //fprintf(stderr,"iterated until i.%d winner.%d\n",i,winner); } + //fprintf(stderr,"iterated until i.%d winner.%d\n",i,winner); if ( 0 ) { for (i=31; i>=24; i--) From a7fc955463118f9a5a3ac35baf0c51de5ea595bd Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 11 Apr 2018 05:30:00 +0300 Subject: [PATCH 1011/1062] Test --- src/komodo_gateway.h | 13 +++++++++---- src/wallet/rpcwallet.cpp | 4 ++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 39e3d4d21..f39441a5c 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -670,7 +670,7 @@ uint64_t komodo_commission(const CBlock &block) return((total * ASSETCHAINS_COMMISSION) / COIN); } -uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_t vout,uint32_t blocktime,uint32_t prevtime,char *destaddr) +uint32_t komodo_stake(int32_t validateflag,arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_t vout,uint32_t blocktime,uint32_t prevtime,char *destaddr) { CBlockIndex *pindex; uint8_t hashbuf[128]; char address[64]; bits256 addrhash; arith_uint256 hashval; uint256 hash,pasthash; int32_t segid,minage,i,iter=0; uint32_t txtime,winner = 0; uint64_t diff,value,coinage,supply = ASSETCHAINS_SUPPLY + nHeight*ASSETCHAINS_REWARD/SATOSHIDEN; txtime = komodo_txtime(&value,txid,vout,address); @@ -699,10 +699,15 @@ uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_ if ( hashval <= bnTarget ) { winner = 1; - blocktime += iter; - blocktime += segid; + if ( validateflag == 0 ) + { + blocktime += iter; + blocktime += segid; + } break; } + if ( validateflag != 0 ) + break; } //fprintf(stderr,"iterated until i.%d winner.%d\n",i,winner); if ( 0 ) @@ -867,7 +872,7 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtim if ( (previndex= mapBlockIndex[block.hashPrevBlock]) != 0 ) prevtime = (uint32_t)previndex->nTime; } - eligible = komodo_stake(bnTarget,height,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n,block.nTime,prevtime,(char *)""); + eligible = komodo_stake(1,bnTarget,height,block.vtx[txn_count-1].vin[0].prevout.hash,block.vtx[txn_count-1].vin[0].prevout.n,block.nTime,prevtime,(char *)""); if ( eligible == 0 || eligible > block.nTime ) { fprintf(stderr,"PoS failure ht.%d eligible.%u vs blocktime.%u, lag.%d -> check to see if it is PoW block\n",height,eligible,(uint32_t)block.nTime,(int32_t)(eligible - block.nTime)); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index ed318819a..c349a3e38 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4439,7 +4439,7 @@ UniValue z_listoperationids(const UniValue& params, bool fHelp) #include "script/sign.h" int32_t decode_hex(uint8_t *bytes,int32_t n,char *hex); extern std::string NOTARY_PUBKEY; -uint32_t komodo_stake(arith_uint256 bnTarget,int32_t nHeight,uint256 hash,int32_t n,uint32_t blocktime,uint32_t prevtime,char *destaddr); +uint32_t komodo_stake(int32_t validateflag,arith_uint256 bnTarget,int32_t nHeight,uint256 hash,int32_t n,uint32_t blocktime,uint32_t prevtime,char *destaddr); int32_t komodo_staked(CMutableTransaction &txNew,uint32_t nBits,uint32_t *blocktimep,uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig) { @@ -4490,7 +4490,7 @@ int32_t komodo_staked(CMutableTransaction &txNew,uint32_t nBits,uint32_t *blockt CBlockIndex *tipindex; if ( (tipindex= chainActive.Tip()) != 0 ) { - eligible = komodo_stake(bnTarget,(uint32_t)tipindex->nHeight+1,out.tx->GetHash(),out.i,*blocktimep,(uint32_t)tipindex->nTime,(char *)CBitcoinAddress(address).ToString().c_str()); + eligible = komodo_stake(0,bnTarget,(uint32_t)tipindex->nHeight+1,out.tx->GetHash(),out.i,*blocktimep,(uint32_t)tipindex->nTime,(char *)CBitcoinAddress(address).ToString().c_str()); if ( eligible > 0 ) { if ( earliest == 0 || eligible < earliest || (eligible == earliest && (*utxovaluep == 0 || nValue < *utxovaluep)) ) From 84ec4ab355d5c73730cf3210778c111c7348487b Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 11 Apr 2018 05:42:24 +0300 Subject: [PATCH 1012/1062] Test --- src/komodo_gateway.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index f39441a5c..a5438ab3e 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -707,7 +707,15 @@ uint32_t komodo_stake(int32_t validateflag,arith_uint256 bnTarget,int32_t nHeigh break; } if ( validateflag != 0 ) + { + for (i=31; i>=24; i--) + fprintf(stderr,"%02x",((uint8_t *)&hashval)[i]); + fprintf(stderr," vs target "); + for (i=31; i>=24; i--) + fprintf(stderr,"%02x",((uint8_t *)&bnTarget)[i]); + fprintf(stderr," segid.%d iter.%d winner.%d coinage.%llu %d ht.%d gap.%d %.8f/%llu\n",segid,iter,winner,(long long)coinage,(int32_t)(blocktime - txtime),nHeight,(int32_t)(blocktime - prevtime),dstr(value),(long long)supply); break; + } } //fprintf(stderr,"iterated until i.%d winner.%d\n",i,winner); if ( 0 ) From 8a183a994049e80c47b1082e932da43180ad72cd Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 11 Apr 2018 14:08:14 +0300 Subject: [PATCH 1013/1062] Revert segid for initial hit --- src/komodo_gateway.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index a5438ab3e..2cb6ab49e 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -702,7 +702,8 @@ uint32_t komodo_stake(int32_t validateflag,arith_uint256 bnTarget,int32_t nHeigh if ( validateflag == 0 ) { blocktime += iter; - blocktime += segid; + if ( iter > 0 ) + blocktime += segid; } break; } From bbe4341700742db4e5d15b09f81038d8388cf3c3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 11 Apr 2018 14:12:58 +0300 Subject: [PATCH 1014/1062] Test --- src/komodo_gateway.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 2cb6ab49e..9c8b73c00 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -719,14 +719,14 @@ uint32_t komodo_stake(int32_t validateflag,arith_uint256 bnTarget,int32_t nHeigh } } //fprintf(stderr,"iterated until i.%d winner.%d\n",i,winner); - if ( 0 ) + if ( 1 ) { for (i=31; i>=24; i--) fprintf(stderr,"%02x",((uint8_t *)&hashval)[i]); fprintf(stderr," vs "); for (i=31; i>=24; i--) fprintf(stderr,"%02x",((uint8_t *)&bnTarget)[i]); - fprintf(stderr," segid.%d iter.%d winner.%d coinage.%llu %d ht.%d gap.%d %.8f/%llu\n",segid,iter,winner,(long long)coinage,(int32_t)(blocktime - txtime),nHeight,(int32_t)(blocktime - prevtime),dstr(value),(long long)supply); + fprintf(stderr," segid.%d iter.%d winner.%d coinage.%llu %d ht.%d t.%u %.8f/%llu\n",segid,iter,winner,(long long)coinage,(int32_t)(blocktime - txtime),nHeight,blocktime,dstr(value),(long long)supply); } } if ( nHeight < 2 ) From 8d7a7f1fefffaf8408923b6e7a62b125a8c32bc6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 11 Apr 2018 14:29:01 +0300 Subject: [PATCH 1015/1062] Test --- src/komodo_gateway.h | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 9c8b73c00..490f5d8c6 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -672,12 +672,10 @@ uint64_t komodo_commission(const CBlock &block) uint32_t komodo_stake(int32_t validateflag,arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_t vout,uint32_t blocktime,uint32_t prevtime,char *destaddr) { - CBlockIndex *pindex; uint8_t hashbuf[128]; char address[64]; bits256 addrhash; arith_uint256 hashval; uint256 hash,pasthash; int32_t segid,minage,i,iter=0; uint32_t txtime,winner = 0; uint64_t diff,value,coinage,supply = ASSETCHAINS_SUPPLY + nHeight*ASSETCHAINS_REWARD/SATOSHIDEN; + CBlockIndex *pindex; uint8_t hashbuf[128]; char address[64]; bits256 addrhash; arith_uint256 hashval; uint256 hash,pasthash; int32_t segid,minage,i,iter=0; uint32_t txtime,winner = 0; uint64_t diff=0,value,coinage,supply = ASSETCHAINS_SUPPLY + nHeight*ASSETCHAINS_REWARD/SATOSHIDEN; txtime = komodo_txtime(&value,txid,vout,address); - if ( value == 0 ) + if ( value == 0 || txtime == 0 ) return(0); - if ( txtime == 0 ) - txtime = prevtime; if ( (minage= nHeight*3) > 6000 ) minage = 6000; if ( blocktime > txtime+minage && (pindex= komodo_chainactive(nHeight>200?nHeight-200:1)) != 0 ) @@ -714,7 +712,7 @@ uint32_t komodo_stake(int32_t validateflag,arith_uint256 bnTarget,int32_t nHeigh fprintf(stderr," vs target "); for (i=31; i>=24; i--) fprintf(stderr,"%02x",((uint8_t *)&bnTarget)[i]); - fprintf(stderr," segid.%d iter.%d winner.%d coinage.%llu %d ht.%d gap.%d %.8f/%llu\n",segid,iter,winner,(long long)coinage,(int32_t)(blocktime - txtime),nHeight,(int32_t)(blocktime - prevtime),dstr(value),(long long)supply); + fprintf(stderr," segid.%d iter.%d winner.%d coinage.%llu %d ht.%d gap.%d %.8f diff.%d\n",segid,iter,winner,(long long)coinage,(int32_t)(blocktime - txtime),nHeight,(int32_t)(blocktime - prevtime),dstr(value),diff); break; } } @@ -726,7 +724,7 @@ uint32_t komodo_stake(int32_t validateflag,arith_uint256 bnTarget,int32_t nHeigh fprintf(stderr," vs "); for (i=31; i>=24; i--) fprintf(stderr,"%02x",((uint8_t *)&bnTarget)[i]); - fprintf(stderr," segid.%d iter.%d winner.%d coinage.%llu %d ht.%d t.%u %.8f/%llu\n",segid,iter,winner,(long long)coinage,(int32_t)(blocktime - txtime),nHeight,blocktime,dstr(value),(long long)supply); + fprintf(stderr," segid.%d iter.%d winner.%d coinage.%llu %d ht.%d t.%u %.8f diff.%d\n",segid,iter,winner,(long long)coinage,(int32_t)(blocktime - txtime),nHeight,blocktime,dstr(value),diff); } } if ( nHeight < 2 ) From 55004a5e0bd0b478116a532dbedac362b0467024 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 11 Apr 2018 14:36:16 +0300 Subject: [PATCH 1016/1062] Test --- src/komodo_gateway.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 490f5d8c6..ee18d23ba 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -672,7 +672,7 @@ uint64_t komodo_commission(const CBlock &block) uint32_t komodo_stake(int32_t validateflag,arith_uint256 bnTarget,int32_t nHeight,uint256 txid,int32_t vout,uint32_t blocktime,uint32_t prevtime,char *destaddr) { - CBlockIndex *pindex; uint8_t hashbuf[128]; char address[64]; bits256 addrhash; arith_uint256 hashval; uint256 hash,pasthash; int32_t segid,minage,i,iter=0; uint32_t txtime,winner = 0; uint64_t diff=0,value,coinage,supply = ASSETCHAINS_SUPPLY + nHeight*ASSETCHAINS_REWARD/SATOSHIDEN; + CBlockIndex *pindex; uint8_t hashbuf[128]; char address[64]; bits256 addrhash; arith_uint256 hashval; uint256 hash,pasthash; int64_t diff=0; int32_t segid,minage,i,iter=0; uint32_t txtime,winner = 0; uint64_t value,coinage,supply = ASSETCHAINS_SUPPLY + nHeight*ASSETCHAINS_REWARD/SATOSHIDEN; txtime = komodo_txtime(&value,txid,vout,address); if ( value == 0 || txtime == 0 ) return(0); @@ -712,7 +712,7 @@ uint32_t komodo_stake(int32_t validateflag,arith_uint256 bnTarget,int32_t nHeigh fprintf(stderr," vs target "); for (i=31; i>=24; i--) fprintf(stderr,"%02x",((uint8_t *)&bnTarget)[i]); - fprintf(stderr," segid.%d iter.%d winner.%d coinage.%llu %d ht.%d gap.%d %.8f diff.%d\n",segid,iter,winner,(long long)coinage,(int32_t)(blocktime - txtime),nHeight,(int32_t)(blocktime - prevtime),dstr(value),diff); + fprintf(stderr," segid.%d iter.%d winner.%d coinage.%llu %d ht.%d gap.%d %.8f diff.%d\n",segid,iter,winner,(long long)coinage,(int32_t)(blocktime - txtime),nHeight,(int32_t)(blocktime - prevtime),dstr(value),(int32_t)diff); break; } } @@ -724,7 +724,7 @@ uint32_t komodo_stake(int32_t validateflag,arith_uint256 bnTarget,int32_t nHeigh fprintf(stderr," vs "); for (i=31; i>=24; i--) fprintf(stderr,"%02x",((uint8_t *)&bnTarget)[i]); - fprintf(stderr," segid.%d iter.%d winner.%d coinage.%llu %d ht.%d t.%u %.8f diff.%d\n",segid,iter,winner,(long long)coinage,(int32_t)(blocktime - txtime),nHeight,blocktime,dstr(value),diff); + fprintf(stderr," segid.%d iter.%d winner.%d coinage.%llu %d ht.%d t.%u %.8f diff.%d\n",segid,iter,winner,(long long)coinage,(int32_t)(blocktime - txtime),nHeight,blocktime,dstr(value),(int32_t)diff); } } if ( nHeight < 2 ) From b0e712e72d571bbb0b06827813aa8def5b36411c Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 11 Apr 2018 14:52:09 +0300 Subject: [PATCH 1017/1062] Test --- src/wallet/rpcwallet.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index c349a3e38..407514eb5 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4493,7 +4493,9 @@ int32_t komodo_staked(CMutableTransaction &txNew,uint32_t nBits,uint32_t *blockt eligible = komodo_stake(0,bnTarget,(uint32_t)tipindex->nHeight+1,out.tx->GetHash(),out.i,*blocktimep,(uint32_t)tipindex->nTime,(char *)CBitcoinAddress(address).ToString().c_str()); if ( eligible > 0 ) { - if ( earliest == 0 || eligible < earliest || (eligible == earliest && (*utxovaluep == 0 || nValue < *utxovaluep)) ) + if ( eligible != komodo_stake(1,bnTarget,(uint32_t)tipindex->nHeight+1,out.tx->GetHash(),out.i,*blocktimep,(uint32_t)tipindex->nTime,(char *)CBitcoinAddress(address).ToString().c_str()) ) + fprintf(stderr,"validation of winning blocktime failed\n"); + else if ( earliest == 0 || eligible < earliest || (eligible == earliest && (*utxovaluep == 0 || nValue < *utxovaluep)) ) { earliest = eligible; best_scriptPubKey = out.tx->vout[out.i].scriptPubKey; From 15da4215d3ee81dbdcfd4933c85bbf11c66678d5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 11 Apr 2018 14:56:09 +0300 Subject: [PATCH 1018/1062] Test --- src/wallet/rpcwallet.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 407514eb5..7f64ece38 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4493,8 +4493,8 @@ int32_t komodo_staked(CMutableTransaction &txNew,uint32_t nBits,uint32_t *blockt eligible = komodo_stake(0,bnTarget,(uint32_t)tipindex->nHeight+1,out.tx->GetHash(),out.i,*blocktimep,(uint32_t)tipindex->nTime,(char *)CBitcoinAddress(address).ToString().c_str()); if ( eligible > 0 ) { - if ( eligible != komodo_stake(1,bnTarget,(uint32_t)tipindex->nHeight+1,out.tx->GetHash(),out.i,*blocktimep,(uint32_t)tipindex->nTime,(char *)CBitcoinAddress(address).ToString().c_str()) ) - fprintf(stderr,"validation of winning blocktime failed\n"); + if ( eligible != komodo_stake(1,bnTarget,(uint32_t)tipindex->nHeight+1,out.tx->GetHash(),out.i,eligible,(uint32_t)tipindex->nTime,(char *)CBitcoinAddress(address).ToString().c_str()) ) + fprintf(stderr,"validation of winning blocktime failed eligible.%u\n",*blocktimep,eligible); else if ( earliest == 0 || eligible < earliest || (eligible == earliest && (*utxovaluep == 0 || nValue < *utxovaluep)) ) { earliest = eligible; From 2a3bc0f1e5f6c37fc38cf6ac67d6369af17d1225 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 11 Apr 2018 14:57:42 +0300 Subject: [PATCH 1019/1062] Test --- src/wallet/rpcwallet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 7f64ece38..347c15f2d 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4494,7 +4494,7 @@ int32_t komodo_staked(CMutableTransaction &txNew,uint32_t nBits,uint32_t *blockt if ( eligible > 0 ) { if ( eligible != komodo_stake(1,bnTarget,(uint32_t)tipindex->nHeight+1,out.tx->GetHash(),out.i,eligible,(uint32_t)tipindex->nTime,(char *)CBitcoinAddress(address).ToString().c_str()) ) - fprintf(stderr,"validation of winning blocktime failed eligible.%u\n",*blocktimep,eligible); + fprintf(stderr,"validation of winning blocktime failed %u -> eligible.%u\n",*blocktimep,eligible); else if ( earliest == 0 || eligible < earliest || (eligible == earliest && (*utxovaluep == 0 || nValue < *utxovaluep)) ) { earliest = eligible; From 90af749c8fa555c8466db07bddf0a4438846242e Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 11 Apr 2018 15:22:38 +0300 Subject: [PATCH 1020/1062] Test --- src/komodo_gateway.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index ee18d23ba..72f36a21c 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -700,8 +700,7 @@ uint32_t komodo_stake(int32_t validateflag,arith_uint256 bnTarget,int32_t nHeigh if ( validateflag == 0 ) { blocktime += iter; - if ( iter > 0 ) - blocktime += segid; + blocktime += segid * 2; } break; } @@ -717,7 +716,7 @@ uint32_t komodo_stake(int32_t validateflag,arith_uint256 bnTarget,int32_t nHeigh } } //fprintf(stderr,"iterated until i.%d winner.%d\n",i,winner); - if ( 1 ) + if ( 0 ) { for (i=31; i>=24; i--) fprintf(stderr,"%02x",((uint8_t *)&hashval)[i]); From 22fd8aaf5cb1c7762aca0154420985a297e5761d Mon Sep 17 00:00:00 2001 From: Mihail Fedorov Date: Thu, 12 Apr 2018 13:09:20 +0300 Subject: [PATCH 1021/1062] prlpay fix --- src/fiat/prlpay | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fiat/prlpay b/src/fiat/prlpay index 7ae6f4e8d..3d1063d13 100755 --- a/src/fiat/prlpay +++ b/src/fiat/prlpay @@ -1,2 +1,2 @@ #!/bin/bash -./komodo-cli -ac_name=BNTN $1 $2 $3 $4 $5 $6 +./komodo-cli -ac_name=PRLPAY $1 $2 $3 $4 $5 $6 From 52e780cc101f5c91ad619bdd2df8feaa52652e46 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Apr 2018 11:59:10 +0300 Subject: [PATCH 1022/1062] Test --- src/komodo_bitcoind.h | 6 +++--- src/komodo_notary.h | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 6ffa4022c..901325324 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -857,13 +857,13 @@ int32_t komodo_is_special(int32_t height,uint8_t pubkey33[33],uint32_t timestamp komodo_chosennotary(&nid,height-i,pubkey33,timestamp); if ( nid == notaryid ) { - if ( (0) && notaryid > 0 ) - fprintf(stderr,"ht.%d notaryid.%d already mined -i.%d nid.%d\n",height,notaryid,i,nid); + //if ( (0) && notaryid > 0 ) + fprintf(stderr,"komodo_is_special: ht.%d notaryid.%d already mined -i.%d nid.%d\n",height,notaryid,i,nid); if ( height > 225000 ) return(-1); } } - //fprintf(stderr,"special notaryid.%d ht.%d limit.%d\n",notaryid,height,limit); + fprintf(stderr,"special notaryid.%d ht.%d limit.%d\n",notaryid,height,limit); return(1); } return(0); diff --git a/src/komodo_notary.h b/src/komodo_notary.h index f46681718..85bbb021a 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -203,6 +203,8 @@ int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestam int32_t i,htind,n; uint64_t mask = 0; struct knotary_entry *kp,*tmp; if ( timestamp == 0 && ASSETCHAINS_SYMBOL[0] != 0 ) timestamp = komodo_heightstamp(height); + else if ( ASSETCHAINS_SYMBOL[0] == 0 ) + timestamp = 0; if ( height >= KOMODO_NOTARIES_HARDCODED || ASSETCHAINS_SYMBOL[0] != 0 ) { if ( (timestamp != 0 && timestamp <= KOMODO_NOTARIES_TIMESTAMP1) || (ASSETCHAINS_SYMBOL[0] == 0 && height <= KOMODO_NOTARIES_HEIGHT1) ) From c54cb7d57bd31c937d99ec79883e5a6e01e4c8a4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Apr 2018 14:18:51 +0300 Subject: [PATCH 1023/1062] Patch 790833 bug --- src/komodo_bitcoind.h | 54 +++++++++++++++++++++++++------------ src/pow.cpp | 63 ++++++++++++++++++------------------------- 2 files changed, 63 insertions(+), 54 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 901325324..958578b63 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -840,31 +840,51 @@ int32_t komodo_minerids(uint8_t *minerids,int32_t height,int32_t width) // depre return(-1); } -int32_t komodo_is_special(int32_t height,uint8_t pubkey33[33],uint32_t timestamp) +int32_t komodo_is_special(uint8_t pubkeys[66][33],int32_t mids[66],int32_t height,uint8_t pubkey33[33],uint32_t timestamp) { int32_t i,notaryid=0,minerid,limit,nid; //uint8_t _pubkey33[33]; if ( height >= 225000 ) - komodo_chosennotary(¬aryid,height,pubkey33,timestamp); - if ( height >= 34000 && notaryid >= 0 ) { - if ( height < 79693 ) - limit = 64; - else if ( height < 82000 ) - limit = 8; - else limit = 66; - for (i=1; i= 0 ) { - komodo_chosennotary(&nid,height-i,pubkey33,timestamp); - if ( nid == notaryid ) + for (i=1; i<66; i++) { - //if ( (0) && notaryid > 0 ) - fprintf(stderr,"komodo_is_special: ht.%d notaryid.%d already mined -i.%d nid.%d\n",height,notaryid,i,nid); - if ( height > 225000 ) - return(-1); + if ( mids[i] == mids[0] ) + { + fprintf(stderr,"ht.%d repeat notaryid.%d in mids[%d]\n",height,mids[0],i); + if ( height > 790000 ) + return(-1); + else break; + } } + return(1); + } else return(0); + } + else + { + if ( height >= 225000 ) + komodo_chosennotary(¬aryid,height,pubkey33,timestamp); + if ( height >= 34000 && notaryid >= 0 ) + { + if ( height < 79693 ) + limit = 64; + else if ( height < 82000 ) + limit = 8; + else limit = 66; + for (i=1; i 0 ) + fprintf(stderr,"ht.%d notaryid.%d already mined -i.%d nid.%d\n",height,notaryid,i,nid); + if ( height > 225000 ) + return(-1); + } + } + //fprintf(stderr,"special notaryid.%d ht.%d limit.%d\n",notaryid,height,limit); + return(1); } - fprintf(stderr,"special notaryid.%d ht.%d limit.%d\n",notaryid,height,limit); - return(1); } return(0); } diff --git a/src/pow.cpp b/src/pow.cpp index 93ef9ab11..ac36dc0a2 100644 --- a/src/pow.cpp +++ b/src/pow.cpp @@ -117,7 +117,7 @@ bool CheckEquihashSolution(const CBlockHeader *pblock, const CChainParams& param } int32_t komodo_chosennotary(int32_t *notaryidp,int32_t height,uint8_t *pubkey33,uint32_t timestamp); -int32_t komodo_is_special(int32_t height,uint8_t pubkey33[33],uint32_t timestamp); +int32_t komodo_is_special(uint8_t pubkeys[66][33],int32_t mids[66],int32_t height,uint8_t pubkey33[33],uint32_t timestamp); int32_t komodo_currentheight(); CBlockIndex *komodo_chainactive(int32_t height); void komodo_index2pubkey33(uint8_t *pubkey33,CBlockIndex *pindex,int32_t height); @@ -125,7 +125,7 @@ extern int32_t KOMODO_CHOSEN_ONE; extern uint64_t ASSETCHAINS_STAKED; extern char ASSETCHAINS_SYMBOL[]; #define KOMODO_ELECTION_GAP 2000 - + int32_t komodo_eligiblenotary(uint8_t pubkeys[66][33],int32_t *mids,int32_t *nonzpkeysp,int32_t height); int32_t KOMODO_LOADINGBLOCKS; @@ -134,27 +134,31 @@ extern std::string NOTARY_PUBKEY; bool CheckProofOfWork(int32_t height,uint8_t *pubkey33,uint256 hash, unsigned int nBits, const Consensus::Params& params) { extern int32_t KOMODO_REWIND; - bool fNegative,fOverflow; int32_t i,nonzpkeys=0,nonz=0,special=0,special2=0,notaryid=-1,duplicate,flag = 0, mids[66]; uint32_t timestamp = 0; - arith_uint256 bnTarget; CBlockIndex *pindex; uint8_t pubkeys[66][33]; + bool fNegative,fOverflow; int32_t i,nonzpkeys=0,nonz=0,special=0,special2=0,notaryid=-1,flag = 0, mids[66]; uint32_t timestamp = 0; + arith_uint256 bnTarget; uint8_t pubkeys[66][33]; timestamp = komodo_chainactive_timestamp(); bnTarget.SetCompact(nBits, &fNegative, &fOverflow); if ( height == 0 ) - height = komodo_currentheight() + 1; - special = komodo_chosennotary(¬aryid,height,pubkey33,timestamp); - flag = komodo_eligiblenotary(pubkeys,mids,&nonzpkeys,height); - /*if ( ASSETCHAINS_STAKED != 0 ) - bnTarget.SetCompact(KOMODO_MINDIFF_NBITS,&fNegative,&fOverflow); - else*/ - if ( height > 34000 && ASSETCHAINS_SYMBOL[0] == 0 ) // 0 -> non-special notary { + height = komodo_currentheight() + 1; + //fprintf(stderr,"set height to %d\n",height); + } + if ( height > 34000 && ASSETCHAINS_SYMBOL[0] == 0 ) // 0 -> non-special notary + { + special = komodo_chosennotary(¬aryid,height,pubkey33,timestamp); for (i=0; i<33; i++) { if ( pubkey33[i] != 0 ) nonz++; } if ( nonz == 0 ) + { + //fprintf(stderr,"ht.%d null pubkey checkproof return\n",height); return(true); // will come back via different path with pubkey set - special2 = komodo_is_special(height,pubkey33,timestamp); + } + flag = komodo_eligiblenotary(pubkeys,mids,&nonzpkeys,height); + special2 = komodo_is_special(pubkeys,mids,height,pubkey33,timestamp); + //fprintf(stderr,"ht.%d notaryid.%d special.%d flag.%d special2.%d\n",height,notaryid,special,flag,special2); if ( notaryid >= 0 ) { if ( height > 10000 && height < 80000 && (special != 0 || special2 > 0) ) @@ -163,37 +167,22 @@ bool CheckProofOfWork(int32_t height,uint8_t *pubkey33,uint256 hash, unsigned in flag = 1; else if ( height >= 108000 && special2 > 0 ) flag = ((height % KOMODO_ELECTION_GAP) > 64 || (height % KOMODO_ELECTION_GAP) == 0); - if ( flag != 0 ) - bnTarget.SetCompact(KOMODO_MINDIFF_NBITS,&fNegative,&fOverflow); + else if ( height == 790833 ) + flag = 1; + else if ( special2 < 0 && height > 800000 ) + flag = 0; + } + if ( flag != 0 || special2 > 0 ) + { + //fprintf(stderr,"EASY MINING ht.%d\n",height); + bnTarget.SetCompact(KOMODO_MINDIFF_NBITS,&fNegative,&fOverflow); } } if (fNegative || bnTarget == 0 || fOverflow || bnTarget > UintToArith256(params.powLimit)) return error("CheckProofOfWork(): nBits below minimum work"); // Check proof of work matches claimed amount if ( UintToArith256(hash) > bnTarget ) - { - if ( 0 && (height < 235300 || height >= 236000) && KOMODO_LOADINGBLOCKS == 0 && height > 188000 ) - //&& )//186269, 182507&& komodo_chainactive(height) != 0 && nonzpkeys > 0 - { - for (i=31; i>=0; i--) - printf("%02x",((uint8_t *)&hash)[i]); - printf(" hash vs "); - for (i=31; i>=0; i--) - printf("%02x",((uint8_t *)&bnTarget)[i]); - printf(" ht.%d special.%d notaryid.%d ht.%d mod.%d error\n",height,special,notaryid,height,(height % 35)); - for (i=0; i<33; i++) - printf("%02x",pubkey33[i]); - printf(" <- pubkey\n"); - for (i=0; i<66; i++) - printf("%d ",mids[i]); - printf(" minerids from ht.%d\n",height); - if ( KOMODO_REWIND == 0 && (notaryid >= 0 || height > 225000) ) - { - fprintf(stderr,"pow error height.%d loading.%d notaryid.%d\n",height,KOMODO_LOADINGBLOCKS,notaryid); - return error("CheckProofOfWork(): hash doesn't match nBits"); - } else fprintf(stderr,"skip return error height.%d loading.%d\n",height,KOMODO_LOADINGBLOCKS); - } //else fprintf(stderr,"skip height.%d loading.%d\n",height,KOMODO_LOADINGBLOCKS); - } + return false; return true; } From 05912706be9eaa7788e643bad4f91e437a3d7589 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Apr 2018 15:02:52 +0300 Subject: [PATCH 1024/1062] Change to 792000 --- src/pow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pow.cpp b/src/pow.cpp index ac36dc0a2..d8fc47f86 100644 --- a/src/pow.cpp +++ b/src/pow.cpp @@ -169,7 +169,7 @@ bool CheckProofOfWork(int32_t height,uint8_t *pubkey33,uint256 hash, unsigned in flag = ((height % KOMODO_ELECTION_GAP) > 64 || (height % KOMODO_ELECTION_GAP) == 0); else if ( height == 790833 ) flag = 1; - else if ( special2 < 0 && height > 800000 ) + else if ( special2 < 0 && height > 792000 ) flag = 0; } if ( flag != 0 || special2 > 0 ) From 6864ae44a44ec785f8687f2c5f8a3f8bcc639dbe Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Apr 2018 15:03:21 +0300 Subject: [PATCH 1025/1062] Change to 792000 --- src/pow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pow.cpp b/src/pow.cpp index ac36dc0a2..d8fc47f86 100644 --- a/src/pow.cpp +++ b/src/pow.cpp @@ -169,7 +169,7 @@ bool CheckProofOfWork(int32_t height,uint8_t *pubkey33,uint256 hash, unsigned in flag = ((height % KOMODO_ELECTION_GAP) > 64 || (height % KOMODO_ELECTION_GAP) == 0); else if ( height == 790833 ) flag = 1; - else if ( special2 < 0 && height > 800000 ) + else if ( special2 < 0 && height > 792000 ) flag = 0; } if ( flag != 0 || special2 > 0 ) From 204e6b350056fb1289e04c3d26dc0bc889ab9275 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Apr 2018 15:21:38 +0300 Subject: [PATCH 1026/1062] Fix --- src/pow.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/pow.cpp b/src/pow.cpp index d8fc47f86..5db2aedb2 100644 --- a/src/pow.cpp +++ b/src/pow.cpp @@ -171,11 +171,11 @@ bool CheckProofOfWork(int32_t height,uint8_t *pubkey33,uint256 hash, unsigned in flag = 1; else if ( special2 < 0 && height > 792000 ) flag = 0; - } - if ( flag != 0 || special2 > 0 ) - { - //fprintf(stderr,"EASY MINING ht.%d\n",height); - bnTarget.SetCompact(KOMODO_MINDIFF_NBITS,&fNegative,&fOverflow); + if ( flag != 0 || special2 > 0 ) + { + //fprintf(stderr,"EASY MINING ht.%d\n",height); + bnTarget.SetCompact(KOMODO_MINDIFF_NBITS,&fNegative,&fOverflow); + } } } if (fNegative || bnTarget == 0 || fOverflow || bnTarget > UintToArith256(params.powLimit)) From 93684bd008ed3449f09eed8ed1a8118e5c0d3dbd Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Apr 2018 15:22:31 +0300 Subject: [PATCH 1027/1062] Fix --- src/pow.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/pow.cpp b/src/pow.cpp index d8fc47f86..5db2aedb2 100644 --- a/src/pow.cpp +++ b/src/pow.cpp @@ -171,11 +171,11 @@ bool CheckProofOfWork(int32_t height,uint8_t *pubkey33,uint256 hash, unsigned in flag = 1; else if ( special2 < 0 && height > 792000 ) flag = 0; - } - if ( flag != 0 || special2 > 0 ) - { - //fprintf(stderr,"EASY MINING ht.%d\n",height); - bnTarget.SetCompact(KOMODO_MINDIFF_NBITS,&fNegative,&fOverflow); + if ( flag != 0 || special2 > 0 ) + { + //fprintf(stderr,"EASY MINING ht.%d\n",height); + bnTarget.SetCompact(KOMODO_MINDIFF_NBITS,&fNegative,&fOverflow); + } } } if (fNegative || bnTarget == 0 || fOverflow || bnTarget > UintToArith256(params.powLimit)) From d4f13ed8018ffaa8afba8c3737854f0db1dd41ad Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Apr 2018 15:24:19 +0300 Subject: [PATCH 1028/1062] Test --- src/komodo_bitcoind.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 958578b63..d5eab1b0f 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -843,7 +843,7 @@ int32_t komodo_minerids(uint8_t *minerids,int32_t height,int32_t width) // depre int32_t komodo_is_special(uint8_t pubkeys[66][33],int32_t mids[66],int32_t height,uint8_t pubkey33[33],uint32_t timestamp) { int32_t i,notaryid=0,minerid,limit,nid; //uint8_t _pubkey33[33]; - if ( height >= 225000 ) + if ( height >= 790000 ) { if ( mids[0] >= 0 ) { From 7fd353f0224fdbee339f01d1e02f02cafc21e720 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Apr 2018 15:25:05 +0300 Subject: [PATCH 1029/1062] Test --- src/komodo_bitcoind.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 958578b63..d5eab1b0f 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -843,7 +843,7 @@ int32_t komodo_minerids(uint8_t *minerids,int32_t height,int32_t width) // depre int32_t komodo_is_special(uint8_t pubkeys[66][33],int32_t mids[66],int32_t height,uint8_t pubkey33[33],uint32_t timestamp) { int32_t i,notaryid=0,minerid,limit,nid; //uint8_t _pubkey33[33]; - if ( height >= 225000 ) + if ( height >= 790000 ) { if ( mids[0] >= 0 ) { From f796b1fb8fa9e6aafc798db24bcb52fccc34a271 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Apr 2018 18:44:18 +0300 Subject: [PATCH 1030/1062] Clean fix and speedup --- src/komodo_bitcoind.h | 244 ++++++++++++++++++++++-------------------- src/main.cpp | 24 ++++- src/pow.cpp | 31 +++++- 3 files changed, 180 insertions(+), 119 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index d5eab1b0f..f6f097940 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2017 The SuperNET Developers. * + * Copyright © 2014-2018 The SuperNET Developers. * * * * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * * the top-level directory of this distribution for the individual copyright * @@ -169,14 +169,14 @@ try_again: curl_handle = curl_easy_init(); init_string(&s); headers = curl_slist_append(0,"Expect:"); - - curl_easy_setopt(curl_handle,CURLOPT_USERAGENT,"mozilla/4.0");//"Mozilla/4.0 (compatible; )"); + + curl_easy_setopt(curl_handle,CURLOPT_USERAGENT,"mozilla/4.0");//"Mozilla/4.0 (compatible; )"); curl_easy_setopt(curl_handle,CURLOPT_HTTPHEADER, headers); curl_easy_setopt(curl_handle,CURLOPT_URL, url); curl_easy_setopt(curl_handle,CURLOPT_WRITEFUNCTION, (void *)accumulatebytes); // send all data to this function curl_easy_setopt(curl_handle,CURLOPT_WRITEDATA, &s); // we pass our 's' struct to the callback curl_easy_setopt(curl_handle,CURLOPT_NOSIGNAL, 1L); // supposed to fix "Alarm clock" and long jump crash - curl_easy_setopt(curl_handle,CURLOPT_NOPROGRESS, 1L); // no progress callback + curl_easy_setopt(curl_handle,CURLOPT_NOPROGRESS, 1L); // no progress callback if ( strncmp(url,"https",5) == 0 ) { curl_easy_setopt(curl_handle,CURLOPT_SSL_VERIFYPEER,0); @@ -198,7 +198,7 @@ try_again: bracket0 = (char *)"["; bracket1 = (char *)"]"; } - + databuf = (char *)malloc(256 + strlen(command) + strlen(params)); sprintf(databuf,"{\"id\":\"jl777\",\"method\":\"%s\",\"params\":%s%s%s}",command,bracket0,params,bracket1); //printf("url.(%s) userpass.(%s) databuf.(%s)\n",url,userpass,databuf); @@ -238,7 +238,7 @@ try_again: free(s.ptr); sleep((1< 10 ) - height -= 10; - if ( ASSETCHAINS_SYMBOL[0] == 0 ) - hash = _komodo_getblockhash(height); - if ( memcmp(&hash,&zero,sizeof(hash)) == 0 ) - hash = komodo_getblockhash(height); - int32_t i; - for (i=0; i<32; i++) - printf("%02x",((uint8_t *)&hash)[i]); - printf(" seed.%d\n",height); - seed = arith_uint256(hash.GetHex()).GetLow64(); - } - else*/ + { + uint256 hash,zero; CBlockIndex *pindex; + memset(&hash,0,sizeof(hash)); + memset(&zero,0,sizeof(zero)); + if ( height > 10 ) + height -= 10; + if ( ASSETCHAINS_SYMBOL[0] == 0 ) + hash = _komodo_getblockhash(height); + if ( memcmp(&hash,&zero,sizeof(hash)) == 0 ) + hash = komodo_getblockhash(height); + int32_t i; + for (i=0; i<32; i++) + printf("%02x",((uint8_t *)&hash)[i]); + printf(" seed.%d\n",height); + seed = arith_uint256(hash.GetHex()).GetLow64(); + } + else*/ { seed = (height << 13) ^ (height << 2); seed <<= 21; @@ -662,7 +662,9 @@ int32_t komodo_block2height(CBlock *block) void komodo_block2pubkey33(uint8_t *pubkey33,CBlock& block) { int32_t n; - memset(pubkey33,0,33); + if ( KOMODO_LOADINGBLOCKS == 0 ) + memset(pubkey33,0xff,33); + else memset(pubkey33,0,33); if ( block.vtx[0].vout.size() > 0 ) { #ifdef KOMODO_ZCASH @@ -722,60 +724,68 @@ uint32_t komodo_heightstamp(int32_t height) return(0); } +void komodo_pindex_init(CBlockIndex *pindex,int32_t height) +{ + int32_t i,num; uint8_t pubkeys[64][33]; CBlock block; + if ( pindex->didinit != 0 ) + return; + //printf("pindex.%d komodo_pindex_init notary.%d from height.%d\n",pindex->nHeight,pindex->notaryid,height); + if ( pindex->didinit == 0 ) + { + pindex->notaryid = -1; + if ( KOMODO_LOADINGBLOCKS == 0 ) + memset(pindex->pubkey33,0xff,33); + else memset(pindex->pubkey33,0,33); + if ( komodo_blockload(block,pindex) == 0 ) + { + komodo_block2pubkey33(pindex->pubkey33,block); + //for (i=0; i<33; i++) + // fprintf(stderr,"%02x",pindex->pubkey33[i]); + //fprintf(stderr," set pubkey at height %d/%d\n",pindex->nHeight,height); + pindex->didinit = (KOMODO_LOADINGBLOCKS == 0); + } // else fprintf(stderr,"error loading block at %d/%d",pindex->nHeight,height); + } + if ( pindex->didinit != 0 && pindex->nHeight >= 0 && (num= komodo_notaries(pubkeys,(int32_t)pindex->nHeight,(uint32_t)pindex->nTime)) > 0 ) + { + for (i=0; ipubkey33,33) == 0 ) + { + pindex->notaryid = i; + break; + } + } + if ( 0 && i == num ) + { + for (i=0; i<33; i++) + fprintf(stderr,"%02x",pindex->pubkey33[i]); + fprintf(stderr," unmatched pubkey at height %d/%d\n",pindex->nHeight,height); + } + } +} + void komodo_index2pubkey33(uint8_t *pubkey33,CBlockIndex *pindex,int32_t height) { - CBlock block; int32_t num,i; uint8_t pubkeys[64][33]; - //komodo_init(height); + CBlock block; int32_t num,i; memset(pubkey33,0,33); if ( pindex != 0 ) { - if ( pindex->pubkey33[0] == 2 || pindex->pubkey33[0] == 3 ) + if ( pindex->didinit != 0 ) { memcpy(pubkey33,pindex->pubkey33,33); return; } - if ( komodo_blockload(block,pindex) == 0 ) - { - komodo_block2pubkey33(pubkey33,block); - if ( (pubkey33[0] == 2 || pubkey33[0] == 3) ) - { - memcpy(pindex->pubkey33,pubkey33,33); - if ( (num= komodo_notaries(pubkeys,(int32_t)pindex->nHeight,(uint32_t)pindex->nTime)) > 0 ) - { - pindex->notaryid = -1; - for (i=0; inotaryid = i; - break; - } - } - } - } else pindex->notaryid = -1; - } - } - else - { - // height -> pubkey33 - //printf("extending chaintip komodo_index2pubkey33 height.%d need to get pubkey33\n",height); + komodo_pindex_init(pindex,height); + memcpy(pubkey33,pindex->pubkey33,33); } } -/*void komodo_connectpindex(CBlockIndex *pindex) -{ - CBlock block; - if ( komodo_blockload(block,pindex) == 0 ) - komodo_connectblock(pindex,block); -}*/ - - int8_t komodo_minerid(int32_t height,uint8_t *pubkey33) { int32_t num,i,numnotaries; CBlockIndex *pindex; uint32_t timestamp=0; uint8_t _pubkey33[33],pubkeys[64][33]; if ( (pindex= chainActive[height]) != 0 ) { - if ( (pindex->pubkey33[0] == 2 || pindex->pubkey33[0] == 3) ) + if ( pindex->didinit != 0 ) { if ( pubkey33 != 0 ) memcpy(pubkey33,pindex->pubkey33,33); @@ -802,7 +812,7 @@ int32_t komodo_eligiblenotary(uint8_t pubkeys[66][33],int32_t *mids,int32_t *non { if ( (pindex= komodo_chainactive(height-i)) != 0 ) { - if ( pindex->notaryid >= 0 && (pindex->pubkey33[0] == 2 || pindex->pubkey33[0] == 3) ) + if ( pindex->notaryid >= 0 && pindex->didinit != 0 ) { memcpy(pubkeys[i],pindex->pubkey33,33); mids[i] = pindex->notaryid; @@ -810,8 +820,9 @@ int32_t komodo_eligiblenotary(uint8_t pubkeys[66][33],int32_t *mids,int32_t *non } else { - komodo_index2pubkey33(pubkey33,pindex,height-i); - memcpy(pubkeys[i],pubkey33,33); + komodo_pindex_init(pindex,height-i); + //komodo_index2pubkey33(pubkey33,pindex,height-i); + memcpy(pubkeys[i],pindex->pubkey33,33); if ( (mids[i]= komodo_minerid(height-i,pubkey33)) >= 0 ) { //mids[i] = *(int32_t *)pubkey33; @@ -830,20 +841,23 @@ int32_t komodo_eligiblenotary(uint8_t pubkeys[66][33],int32_t *mids,int32_t *non int32_t komodo_minerids(uint8_t *minerids,int32_t height,int32_t width) // deprecate { /*int32_t i,n=0; - for (i=0; i= 790000 ) + if ( height >= 225000 ) + komodo_chosennotary(¬aryid,height,pubkey33,timestamp); + if ( height >= 700000 ) { if ( mids[0] >= 0 ) { @@ -862,8 +876,6 @@ int32_t komodo_is_special(uint8_t pubkeys[66][33],int32_t mids[66],int32_t heigh } else { - if ( height >= 225000 ) - komodo_chosennotary(¬aryid,height,pubkey33,timestamp); if ( height >= 34000 && notaryid >= 0 ) { if ( height < 79693 ) @@ -889,10 +901,10 @@ int32_t komodo_is_special(uint8_t pubkeys[66][33],int32_t mids[66],int32_t heigh return(0); } -int32_t komodo_MoM(int32_t *notarized_heightp,uint256 *MoMp,uint256 *kmdtxidp,int32_t nHeight) +int32_t komodo_MoM(int32_t *notarized_heightp,uint256 *MoMp,uint256 *kmdtxidp,int32_t nHeight,uint256 *MoMoMp,int32_t *MoMoMoffsetp,int32_t *MoMoMdepthp,int32_t *kmdstartip,int32_t *kmdendip) { int32_t depth,notarized_ht; uint256 MoM,kmdtxid; - depth = komodo_MoMdata(¬arized_ht,&MoM,&kmdtxid,nHeight); + depth = komodo_MoMdata(¬arized_ht,&MoM,&kmdtxid,nHeight,MoMoMp,MoMoMoffsetp,MoMoMdepthp,kmdstartip,kmdendip); memset(MoMp,0,sizeof(*MoMp)); memset(kmdtxidp,0,sizeof(*kmdtxidp)); *notarized_heightp = 0; diff --git a/src/main.cpp b/src/main.cpp index fb833bff5..0e82ce73a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -53,6 +53,7 @@ using namespace std; CCriticalSection cs_main; extern uint8_t NOTARY_PUBKEY33[33]; +extern int32_t KOMODO_LOADINGBLOCKS; BlockMap mapBlockIndex; CChain chainActive; @@ -4037,6 +4038,7 @@ bool CheckDiskSpace(uint64_t nAdditionalBytes) FILE* OpenDiskFile(const CDiskBlockPos &pos, const char *prefix, bool fReadOnly) { + static int32_t didinit; long fsize,fpos; int32_t incr = 16*1024*1024; if (pos.IsNull()) return NULL; boost::filesystem::path path = GetBlockPosFilename(pos, prefix); @@ -4048,6 +4050,27 @@ FILE* OpenDiskFile(const CDiskBlockPos &pos, const char *prefix, bool fReadOnly) LogPrintf("Unable to open file %s\n", path.string()); return NULL; } + if ( didinit == 0 && strcmp(prefix,(char *)"blk") == 0 ) + { + fpos = ftell(file); + fseek(file,0,SEEK_END); + fsize = ftell(file); + if ( fsize > incr ) + { + char *ignore = (char *)malloc(incr); + if ( ignore != 0 ) + { + rewind(file); + while ( fread(ignore,1,incr,file) == incr ) + fprintf(stderr,"."); + free(ignore); + fprintf(stderr,"loaded %ld bytes set fpos.%ld loading.%d\n",(long)ftell(file),(long)fpos,KOMODO_LOADINGBLOCKS); + } + } + fseek(file,fpos,SEEK_SET); + KOMODO_LOADINGBLOCKS = 0; + didinit = 1; + } if (pos.nPos) { if (fseek(file, pos.nPos, SEEK_SET)) { LogPrintf("Unable to seek to position %u of %s\n", pos.nPos, path.string()); @@ -4491,7 +4514,6 @@ void UnloadBlockIndex() bool LoadBlockIndex() { - extern int32_t KOMODO_LOADINGBLOCKS; // Load block index from databases KOMODO_LOADINGBLOCKS = 1; if (!fReindex && !LoadBlockIndexDB()) diff --git a/src/pow.cpp b/src/pow.cpp index 5db2aedb2..dba8c1403 100644 --- a/src/pow.cpp +++ b/src/pow.cpp @@ -116,6 +116,7 @@ bool CheckEquihashSolution(const CBlockHeader *pblock, const CChainParams& param return true; } +void komodo_pindex_init(CBlockIndex *pindex,int32_t height); int32_t komodo_chosennotary(int32_t *notaryidp,int32_t height,uint8_t *pubkey33,uint32_t timestamp); int32_t komodo_is_special(uint8_t pubkeys[66][33],int32_t mids[66],int32_t height,uint8_t pubkey33[33],uint32_t timestamp); int32_t komodo_currentheight(); @@ -134,7 +135,7 @@ extern std::string NOTARY_PUBKEY; bool CheckProofOfWork(int32_t height,uint8_t *pubkey33,uint256 hash, unsigned int nBits, const Consensus::Params& params) { extern int32_t KOMODO_REWIND; - bool fNegative,fOverflow; int32_t i,nonzpkeys=0,nonz=0,special=0,special2=0,notaryid=-1,flag = 0, mids[66]; uint32_t timestamp = 0; + bool fNegative,fOverflow; int32_t i,nonzpkeys=0,nonz=0,special=0,special2=0,notaryid=-1,flag = 0, mids[66]; uint32_t timestamp = 0; CBlockIndex *pindex; arith_uint256 bnTarget; uint8_t pubkeys[66][33]; timestamp = komodo_chainactive_timestamp(); bnTarget.SetCompact(nBits, &fNegative, &fOverflow); @@ -145,6 +146,13 @@ bool CheckProofOfWork(int32_t height,uint8_t *pubkey33,uint256 hash, unsigned in } if ( height > 34000 && ASSETCHAINS_SYMBOL[0] == 0 ) // 0 -> non-special notary { + if ( KOMODO_LOADINGBLOCKS == 0 ) + return(true); + if ( (pindex= komodo_chainactive(height)) != 0 ) + { + komodo_pindex_init(pindex,height); + memcpy(pubkey33,pindex->pubkey33,33); + } special = komodo_chosennotary(¬aryid,height,pubkey33,timestamp); for (i=0; i<33; i++) { @@ -158,7 +166,7 @@ bool CheckProofOfWork(int32_t height,uint8_t *pubkey33,uint256 hash, unsigned in } flag = komodo_eligiblenotary(pubkeys,mids,&nonzpkeys,height); special2 = komodo_is_special(pubkeys,mids,height,pubkey33,timestamp); - //fprintf(stderr,"ht.%d notaryid.%d special.%d flag.%d special2.%d\n",height,notaryid,special,flag,special2); + fprintf(stderr,"ht.%d notaryid.%d special.%d flag.%d special2.%d\n",height,notaryid,special,flag,special2); if ( notaryid >= 0 ) { if ( height > 10000 && height < 80000 && (special != 0 || special2 > 0) ) @@ -182,7 +190,26 @@ bool CheckProofOfWork(int32_t height,uint8_t *pubkey33,uint256 hash, unsigned in return error("CheckProofOfWork(): nBits below minimum work"); // Check proof of work matches claimed amount if ( UintToArith256(hash) > bnTarget ) + { + for (i=31; i>=0; i--) + printf("%02x",((uint8_t *)&hash)[i]); + printf(" hash vs "); + for (i=31; i>=0; i--) + printf("%02x",((uint8_t *)&bnTarget)[i]); + printf(" ht.%d special.%d notaryid.%d ht.%d mod.%d error\n",height,special,notaryid,height,(height % 35)); + if ( pindex != 0 ) + { + pindex->didinit = 0; + komodo_pindex_init(pindex,height); + } + for (i=0; i<33; i++) + printf("%02x",pubkey33[i]); + printf(" <- pubkey\n"); + for (i=0; i<66; i++) + printf("%d ",mids[i]); + printf(" minerids from ht.%d pindex.%p\n",height,pindex); return false; + } return true; } From 69c24cd06e93c8a7116b55b32cd564511940c4d0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Apr 2018 18:47:42 +0300 Subject: [PATCH 1031/1062] Manual merge --- src/chain.h | 2 +- src/komodo_globals.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/chain.h b/src/chain.h index d3c46f9d6..3b8bbd9bd 100644 --- a/src/chain.h +++ b/src/chain.h @@ -177,7 +177,7 @@ public: //! (memory only) Sequential id assigned to distinguish order in which blocks are received. uint32_t nSequenceId; - int8_t notaryid; uint8_t pubkey33[33]; + int8_t notaryid; uint8_t pubkey33[33],didinit; void SetNull() { diff --git a/src/komodo_globals.h b/src/komodo_globals.h index cb8f61988..ecd8bfd6a 100644 --- a/src/komodo_globals.h +++ b/src/komodo_globals.h @@ -18,7 +18,7 @@ uint32_t komodo_heightstamp(int32_t height); void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotaries,uint8_t notaryid,uint256 txhash,uint64_t voutmask,uint8_t numvouts,uint32_t *pvals,uint8_t numpvals,int32_t kheight,uint32_t ktime,uint64_t opretvalue,uint8_t *opretbuf,uint16_t opretlen,uint16_t vout,uint256 MoM,int32_t MoMdepth); void komodo_init(int32_t height); -int32_t komodo_MoMdata(int32_t *notarized_htp,uint256 *MoMp,uint256 *kmdtxidp,int32_t nHeight); +int32_t komodo_MoMdata(int32_t *notarized_htp,uint256 *MoMp,uint256 *kmdtxidp,int32_t nHeight,uint256 *MoMoMp,int32_t *MoMoMoffsetp,int32_t *MoMoMdepthp,int32_t *kmdstartip,int32_t *kmdendip); int32_t komodo_notarizeddata(int32_t nHeight,uint256 *notarized_hashp,uint256 *notarized_desttxidp); char *komodo_issuemethod(char *userpass,char *method,char *params,uint16_t port); void komodo_init(int32_t height); From 2574cf491b6cfb2a9a4644166d5656b15930ae78 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Apr 2018 19:00:42 +0300 Subject: [PATCH 1032/1062] Fix missing functionality --- src/komodo_notary.h | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 85bbb021a..393e89796 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -399,30 +399,29 @@ int32_t komodo_notarized_height(uint256 *hashp,uint256 *txidp) } -int32_t komodo_MoMdata(int32_t *notarized_htp,uint256 *MoMp,uint256 *kmdtxidp,int32_t height) +int32_t komodo_MoMdata(int32_t *notarized_htp,uint256 *MoMp,uint256 *kmdtxidp,int32_t height,uint256 *MoMoMp,int32_t *MoMoMoffsetp,int32_t *MoMoMdepthp,int32_t *kmdstartip,int32_t *kmdendip) { - int32_t i; char symbol[KOMODO_ASSETCHAIN_MAXLEN],dest[KOMODO_ASSETCHAIN_MAXLEN]; struct komodo_state *sp; struct notarized_checkpoint *np = 0; - np = 0; - if ( (sp= komodo_stateptr(symbol,dest)) != 0 ) + struct notarized_checkpoint *np = 0; + if ( (np= komodo_npptr(height)) != 0 ) { - for (i=sp->NUM_NPOINTS-1; i>=0; i--) - { - np = &sp->NPOINTS[i]; - if ( np->MoMdepth > 0 && height > np->notarized_height-np->MoMdepth && height <= np->notarized_height ) - { - *notarized_htp = np->notarized_height; - *MoMp = np->MoM; - *kmdtxidp = np->notarized_desttxid; - return(np->MoMdepth); - } - } + *notarized_htp = np->notarized_height; + *MoMp = np->MoM; + *kmdtxidp = np->notarized_desttxid; + *MoMoMp = np->MoMoM; + *MoMoMoffsetp = np->MoMoMoffset; + *MoMoMdepthp = np->MoMoMdepth; + *kmdstartip = np->kmdstarti; + *kmdendip = np->kmdendi; + return(np->MoMdepth); } - *notarized_htp = 0; + *notarized_htp = *MoMoMoffsetp = *MoMoMdepthp = *kmdstartip = *kmdendip = 0; memset(MoMp,0,sizeof(*MoMp)); + memset(MoMoMp,0,sizeof(*MoMoMp)); memset(kmdtxidp,0,sizeof(*kmdtxidp)); return(0); } + int32_t komodo_notarizeddata(int32_t nHeight,uint256 *notarized_hashp,uint256 *notarized_desttxidp) { struct notarized_checkpoint *np = 0; int32_t i=0,flag = 0; char symbol[KOMODO_ASSETCHAIN_MAXLEN],dest[KOMODO_ASSETCHAIN_MAXLEN]; struct komodo_state *sp; From 252031d2a33e234ae2b315fbcdefc56c044d75cd Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Apr 2018 19:05:59 +0300 Subject: [PATCH 1033/1062] Test --- src/komodo_notary.h | 15 +++++++++++++++ src/komodo_structs.h | 4 ++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 393e89796..5f534957f 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -399,6 +399,21 @@ int32_t komodo_notarized_height(uint256 *hashp,uint256 *txidp) } +struct notarized_checkpoint *komodo_npptr(int32_t height) +{ + char symbol[KOMODO_ASSETCHAIN_MAXLEN],dest[KOMODO_ASSETCHAIN_MAXLEN]; int32_t i; struct komodo_state *sp; struct notarized_checkpoint *np = 0; + if ( (sp= komodo_stateptr(symbol,dest)) != 0 ) + { + for (i=sp->NUM_NPOINTS-1; i>=0; i--) + { + np = &sp->NPOINTS[i]; + if ( np->MoMdepth > 0 && height > np->notarized_height-np->MoMdepth && height <= np->notarized_height ) + return(np); + } + } + return(0); +} + int32_t komodo_MoMdata(int32_t *notarized_htp,uint256 *MoMp,uint256 *kmdtxidp,int32_t height,uint256 *MoMoMp,int32_t *MoMoMoffsetp,int32_t *MoMoMdepthp,int32_t *kmdstartip,int32_t *kmdendip) { struct notarized_checkpoint *np = 0; diff --git a/src/komodo_structs.h b/src/komodo_structs.h index 38a2b3138..50984eb31 100644 --- a/src/komodo_structs.h +++ b/src/komodo_structs.h @@ -85,8 +85,8 @@ struct knotary_entry { UT_hash_handle hh; uint8_t pubkey[33],notaryid; }; struct knotaries_entry { int32_t height,numnotaries; struct knotary_entry *Notaries; }; struct notarized_checkpoint { - uint256 notarized_hash,notarized_desttxid,MoM; - int32_t nHeight,notarized_height,MoMdepth; + uint256 notarized_hash,notarized_desttxid,MoM,MoMoM; + int32_t nHeight,notarized_height,MoMdepth,MoMoMdepth,MoMoMoffset,kmdstarti,kmdendi; }; struct komodo_state From a9ba7b1169b720d6941b285e67b1b431e173eacf Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Apr 2018 19:11:15 +0300 Subject: [PATCH 1034/1062] height_MoM --- src/rpcblockchain.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 010fb051c..f882b1d0f 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -552,7 +552,7 @@ char *bitcoin_address(char *coinaddr,uint8_t addrtype,uint8_t *pubkey_or_rmd160, //uint32_t komodo_interest_args(int32_t *txheightp,uint32_t *tiptimep,uint64_t *valuep,uint256 hash,int32_t n); int32_t komodo_minerids(uint8_t *minerids,int32_t height,int32_t width); int32_t komodo_kvsearch(uint256 *refpubkeyp,int32_t current_height,uint32_t *flagsp,int32_t *heightp,uint8_t value[IGUANA_MAXSCRIPTSIZE],uint8_t *key,int32_t keylen); -int32_t komodo_MoM(int32_t *notarized_htp,uint256 *MoMp,uint256 *kmdtxidp,int32_t nHeight); +int32_t komodo_MoM(int32_t *notarized_htp,uint256 *MoMp,uint256 *kmdtxidp,int32_t nHeight,uint256 *MoMoMp,int32_t *MoMoMoffsetp,int32_t *MoMoMdepthp,int32_t *kmdstartip,int32_t *kmdendip); UniValue kvsearch(const UniValue& params, bool fHelp) { @@ -591,9 +591,9 @@ UniValue kvsearch(const UniValue& params, bool fHelp) UniValue height_MoM(const UniValue& params, bool fHelp) { - int32_t height,depth,notarized_height; uint256 MoM,kmdtxid; uint32_t timestamp = 0; UniValue ret(UniValue::VOBJ); UniValue a(UniValue::VARR); + int32_t height,depth,notarized_height,MoMoMdepth,MoMoMoffset,kmdstarti,kmdendi; uint256 MoM,MoMoM,kmdtxid; uint32_t timestamp = 0; UniValue ret(UniValue::VOBJ); UniValue a(UniValue::VARR); if ( fHelp || params.size() != 1 ) - throw runtime_error("height_MoM needs height\n"); + throw runtime_error("height_MoM height\n"); LOCK(cs_main); height = atoi(params[0].get_str().c_str()); if ( height <= 0 ) @@ -606,7 +606,7 @@ UniValue height_MoM(const UniValue& params, bool fHelp) height = chainActive.Tip()->nHeight; } //fprintf(stderr,"height_MoM height.%d\n",height); - depth = komodo_MoM(¬arized_height,&MoM,&kmdtxid,height); + depth = komodo_MoM(¬arized_height,&MoM,&kmdtxid,height,&MoMoM,&MoMoMoffset,&MoMoMdepth,&kmdstarti,&kmdendi); ret.push_back(Pair("coin",(char *)(ASSETCHAINS_SYMBOL[0] == 0 ? "KMD" : ASSETCHAINS_SYMBOL))); ret.push_back(Pair("height",height)); ret.push_back(Pair("timestamp",(uint64_t)timestamp)); @@ -616,8 +616,16 @@ UniValue height_MoM(const UniValue& params, bool fHelp) ret.push_back(Pair("notarized_height",notarized_height)); ret.push_back(Pair("MoM",MoM.GetHex())); ret.push_back(Pair("kmdtxid",kmdtxid.GetHex())); + if ( ASSETCHAINS_SYMBOL[0] != 0 ) + { + ret.push_back(Pair("MoMoM",MoMoM.GetHex())); + ret.push_back(Pair("MoMoMoffset",MoMoMoffset)); + ret.push_back(Pair("MoMoMdepth",MoMoMdepth)); + ret.push_back(Pair("kmdstarti",kmdstarti)); + ret.push_back(Pair("kmdendi",kmdendi)); + } } else ret.push_back(Pair("error",(char *)"no MoM for height")); - + return ret; } From 9557a5930137cb559b52a57d04f8ac8770862ed5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Apr 2018 19:14:45 +0300 Subject: [PATCH 1035/1062] Test --- src/pow.cpp | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/src/pow.cpp b/src/pow.cpp index dba8c1403..15c5c8732 100644 --- a/src/pow.cpp +++ b/src/pow.cpp @@ -146,7 +146,7 @@ bool CheckProofOfWork(int32_t height,uint8_t *pubkey33,uint256 hash, unsigned in } if ( height > 34000 && ASSETCHAINS_SYMBOL[0] == 0 ) // 0 -> non-special notary { - if ( KOMODO_LOADINGBLOCKS == 0 ) + if ( KOMODO_LOADINGBLOCKS != 0 ) return(true); if ( (pindex= komodo_chainactive(height)) != 0 ) { @@ -191,28 +191,17 @@ bool CheckProofOfWork(int32_t height,uint8_t *pubkey33,uint256 hash, unsigned in // Check proof of work matches claimed amount if ( UintToArith256(hash) > bnTarget ) { - for (i=31; i>=0; i--) - printf("%02x",((uint8_t *)&hash)[i]); - printf(" hash vs "); - for (i=31; i>=0; i--) - printf("%02x",((uint8_t *)&bnTarget)[i]); - printf(" ht.%d special.%d notaryid.%d ht.%d mod.%d error\n",height,special,notaryid,height,(height % 35)); if ( pindex != 0 ) { pindex->didinit = 0; komodo_pindex_init(pindex,height); } - for (i=0; i<33; i++) - printf("%02x",pubkey33[i]); - printf(" <- pubkey\n"); - for (i=0; i<66; i++) - printf("%d ",mids[i]); - printf(" minerids from ht.%d pindex.%p\n",height,pindex); return false; } return true; } + arith_uint256 GetBlockProof(const CBlockIndex& block) { arith_uint256 bnTarget; From 0b5f32ccc257b968f488a6192fd8e26c87c0e943 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Apr 2018 19:16:30 +0300 Subject: [PATCH 1036/1062] Test --- src/rpcblockchain.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index f882b1d0f..c6a3ab0ec 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -631,9 +631,7 @@ UniValue height_MoM(const UniValue& params, bool fHelp) UniValue txMoMproof(const UniValue& params, bool fHelp) { - uint256 hash, notarisationHash, MoM; - int32_t notarisedHeight, depth; - CBlockIndex* blockIndex; + uint256 hash, notarisationHash, MoM,MoMoM; int32_t notarisedHeight, depth; CBlockIndex* blockIndex; std::vector branch; int nIndex; @@ -651,7 +649,7 @@ UniValue txMoMproof(const UniValue& params, bool fHelp) blockIndex = mapBlockIndex[blockHash]; - depth = komodo_MoM(¬arisedHeight, &MoM, ¬arisationHash, blockIndex->nHeight); + depth = komodo_MoM(¬arisedHeight, &MoM, ¬arisationHash, blockIndex->nHeight,&MoMoM,&MoMoMoffset,&MoMoMdepth,&kmdstarti,&kmdendi); if (!depth) throw runtime_error("notarisation not found"); From d955963d5844126ee5844cad3dc07f5375bf8a5b Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Apr 2018 19:19:31 +0300 Subject: [PATCH 1037/1062] Test --- src/komodo_bitcoind.h | 4 ++-- src/rpcblockchain.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index f6f097940..629b375fa 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -855,8 +855,6 @@ int32_t komodo_minerids(uint8_t *minerids,int32_t height,int32_t width) // depre int32_t komodo_is_special(uint8_t pubkeys[66][33],int32_t mids[66],int32_t height,uint8_t pubkey33[33],uint32_t timestamp) { int32_t i,notaryid=0,minerid,limit,nid; //uint8_t _pubkey33[33]; - if ( height >= 225000 ) - komodo_chosennotary(¬aryid,height,pubkey33,timestamp); if ( height >= 700000 ) { if ( mids[0] >= 0 ) @@ -878,6 +876,8 @@ int32_t komodo_is_special(uint8_t pubkeys[66][33],int32_t mids[66],int32_t heigh { if ( height >= 34000 && notaryid >= 0 ) { + if ( height >= 225000 ) + komodo_chosennotary(¬aryid,height,pubkey33,timestamp); if ( height < 79693 ) limit = 64; else if ( height < 82000 ) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index c6a3ab0ec..a2ac900d2 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -633,7 +633,7 @@ UniValue txMoMproof(const UniValue& params, bool fHelp) { uint256 hash, notarisationHash, MoM,MoMoM; int32_t notarisedHeight, depth; CBlockIndex* blockIndex; std::vector branch; - int nIndex; + int nIndex,MoMoMdepth,MoMoMoffset,kmdstarti,kmdendi; // parse params and get notarisation data for tx { From 4323ab1cfbfc0f66f513cd1977ed616a13893055 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Apr 2018 19:26:23 +0300 Subject: [PATCH 1038/1062] Test --- src/init.cpp | 2 ++ src/main.cpp | 10 ++++------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/init.cpp b/src/init.cpp index 3bacc7087..e16474c02 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -69,6 +69,7 @@ using namespace std; extern void ThreadSendAlert(); +extern int32_t KOMODO_LOADINGBLOCKS; ZCJoinSplit* pzcashParams = NULL; @@ -1421,6 +1422,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) strLoadError = _("Error initializing block database"); break; } + KOMODO_LOADINGBLOCKS = 0; // Check for changed -txindex state if (fTxIndex != GetBoolArg("-txindex", true)) { diff --git a/src/main.cpp b/src/main.cpp index 0e82ce73a..f691a3674 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4038,7 +4038,7 @@ bool CheckDiskSpace(uint64_t nAdditionalBytes) FILE* OpenDiskFile(const CDiskBlockPos &pos, const char *prefix, bool fReadOnly) { - static int32_t didinit; long fsize,fpos; int32_t incr = 16*1024*1024; + static int32_t didinit[1000]; long fsize,fpos; int32_t incr = 16*1024*1024; if (pos.IsNull()) return NULL; boost::filesystem::path path = GetBlockPosFilename(pos, prefix); @@ -4050,7 +4050,7 @@ FILE* OpenDiskFile(const CDiskBlockPos &pos, const char *prefix, bool fReadOnly) LogPrintf("Unable to open file %s\n", path.string()); return NULL; } - if ( didinit == 0 && strcmp(prefix,(char *)"blk") == 0 ) + if ( pos.nFile < sizeof(didinit)/sizeof(*didinit) && didinit[pos.nFile] == 0 && strcmp(prefix,(char *)"blk") == 0 ) { fpos = ftell(file); fseek(file,0,SEEK_END); @@ -4064,12 +4064,11 @@ FILE* OpenDiskFile(const CDiskBlockPos &pos, const char *prefix, bool fReadOnly) while ( fread(ignore,1,incr,file) == incr ) fprintf(stderr,"."); free(ignore); - fprintf(stderr,"loaded %ld bytes set fpos.%ld loading.%d\n",(long)ftell(file),(long)fpos,KOMODO_LOADINGBLOCKS); + fprintf(stderr,"blk.%d loaded %ld bytes set fpos.%ld loading.%d\n",(int)pos.nFile,(long)ftell(file),(long)fpos,KOMODO_LOADINGBLOCKS); } } fseek(file,fpos,SEEK_SET); - KOMODO_LOADINGBLOCKS = 0; - didinit = 1; + didinit[pos.nFile] = 1; } if (pos.nPos) { if (fseek(file, pos.nPos, SEEK_SET)) { @@ -4521,7 +4520,6 @@ bool LoadBlockIndex() KOMODO_LOADINGBLOCKS = 0; return false; } - KOMODO_LOADINGBLOCKS = 0; fprintf(stderr,"finished loading blocks %s\n",ASSETCHAINS_SYMBOL); return true; } From 54f7311d4ee5c4207d7ce65ed4a006d395696bfc Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Apr 2018 22:41:35 +0300 Subject: [PATCH 1039/1062] -cache --- src/init.cpp | 2 + src/komodo_bitcoind.h | 199 +++++++++++++++++++++--------------------- src/pow.cpp | 33 +++---- 3 files changed, 114 insertions(+), 120 deletions(-) diff --git a/src/init.cpp b/src/init.cpp index e16474c02..7268c362c 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -626,6 +626,7 @@ void ThreadImport(std::vector vImportFiles) LogPrintf("Reindexing finished\n"); // To avoid ending up in a situation without genesis block, re-try initializing (no-op if reindexing worked): InitBlockIndex(); + KOMODO_LOADINGBLOCKS = 0; } // hardcoded $DATADIR/bootstrap.dat @@ -1485,6 +1486,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) } } } + KOMODO_LOADINGBLOCKS = 0; // As LoadBlockIndex can take several minutes, it's possible the user // requested to kill the GUI during the last operation. If so, exit. diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 629b375fa..ece63942e 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -659,21 +659,21 @@ int32_t komodo_block2height(CBlock *block) return(height); } -void komodo_block2pubkey33(uint8_t *pubkey33,CBlock& block) +void komodo_block2pubkey33(uint8_t *pubkey33,CBlock *block) { int32_t n; if ( KOMODO_LOADINGBLOCKS == 0 ) memset(pubkey33,0xff,33); else memset(pubkey33,0,33); - if ( block.vtx[0].vout.size() > 0 ) + if ( block->vtx[0].vout.size() > 0 ) { #ifdef KOMODO_ZCASH - uint8_t *ptr = (uint8_t *)block.vtx[0].vout[0].scriptPubKey.data(); + uint8_t *ptr = (uint8_t *)block->vtx[0].vout[0].scriptPubKey.data(); #else - uint8_t *ptr = (uint8_t *)&block.vtx[0].vout[0].scriptPubKey[0]; + uint8_t *ptr = (uint8_t *)&block->vtx[0].vout[0].scriptPubKey[0]; #endif //komodo_init(0); - n = block.vtx[0].vout[0].scriptPubKey.size(); + n = block->vtx[0].vout[0].scriptPubKey.size(); if ( n == 35 ) memcpy(pubkey33,ptr+1,33); } @@ -724,111 +724,108 @@ uint32_t komodo_heightstamp(int32_t height) return(0); } -void komodo_pindex_init(CBlockIndex *pindex,int32_t height) -{ - int32_t i,num; uint8_t pubkeys[64][33]; CBlock block; - if ( pindex->didinit != 0 ) - return; - //printf("pindex.%d komodo_pindex_init notary.%d from height.%d\n",pindex->nHeight,pindex->notaryid,height); - if ( pindex->didinit == 0 ) - { - pindex->notaryid = -1; - if ( KOMODO_LOADINGBLOCKS == 0 ) - memset(pindex->pubkey33,0xff,33); - else memset(pindex->pubkey33,0,33); - if ( komodo_blockload(block,pindex) == 0 ) - { - komodo_block2pubkey33(pindex->pubkey33,block); - //for (i=0; i<33; i++) - // fprintf(stderr,"%02x",pindex->pubkey33[i]); - //fprintf(stderr," set pubkey at height %d/%d\n",pindex->nHeight,height); - pindex->didinit = (KOMODO_LOADINGBLOCKS == 0); - } // else fprintf(stderr,"error loading block at %d/%d",pindex->nHeight,height); - } - if ( pindex->didinit != 0 && pindex->nHeight >= 0 && (num= komodo_notaries(pubkeys,(int32_t)pindex->nHeight,(uint32_t)pindex->nTime)) > 0 ) - { - for (i=0; ipubkey33,33) == 0 ) - { - pindex->notaryid = i; - break; - } - } - if ( 0 && i == num ) - { - for (i=0; i<33; i++) - fprintf(stderr,"%02x",pindex->pubkey33[i]); - fprintf(stderr," unmatched pubkey at height %d/%d\n",pindex->nHeight,height); - } - } -} +/*void komodo_pindex_init(CBlockIndex *pindex,int32_t height) gets data corrupted + { + int32_t i,num; uint8_t pubkeys[64][33]; CBlock block; + if ( pindex->didinit != 0 ) + return; + //printf("pindex.%d komodo_pindex_init notary.%d from height.%d\n",pindex->nHeight,pindex->notaryid,height); + if ( pindex->didinit == 0 ) + { + pindex->notaryid = -1; + if ( KOMODO_LOADINGBLOCKS == 0 ) + memset(pindex->pubkey33,0xff,33); + else memset(pindex->pubkey33,0,33); + if ( komodo_blockload(block,pindex) == 0 ) + { + komodo_block2pubkey33(pindex->pubkey33,&block); + //for (i=0; i<33; i++) + // fprintf(stderr,"%02x",pindex->pubkey33[i]); + //fprintf(stderr," set pubkey at height %d/%d\n",pindex->nHeight,height); + //if ( pindex->pubkey33[0] == 2 || pindex->pubkey33[0] == 3 ) + // pindex->didinit = (KOMODO_LOADINGBLOCKS == 0); + } // else fprintf(stderr,"error loading block at %d/%d",pindex->nHeight,height); + } + if ( pindex->didinit != 0 && pindex->nHeight >= 0 && (num= komodo_notaries(pubkeys,(int32_t)pindex->nHeight,(uint32_t)pindex->nTime)) > 0 ) + { + for (i=0; ipubkey33,33) == 0 ) + { + pindex->notaryid = i; + break; + } + } + if ( 0 && i == num ) + { + for (i=0; i<33; i++) + fprintf(stderr,"%02x",pindex->pubkey33[i]); + fprintf(stderr," unmatched pubkey at height %d/%d\n",pindex->nHeight,height); + } + } + }*/ void komodo_index2pubkey33(uint8_t *pubkey33,CBlockIndex *pindex,int32_t height) { - CBlock block; int32_t num,i; + int32_t num,i; CBlock block; memset(pubkey33,0,33); if ( pindex != 0 ) { - if ( pindex->didinit != 0 ) - { - memcpy(pubkey33,pindex->pubkey33,33); - return; - } - komodo_pindex_init(pindex,height); - memcpy(pubkey33,pindex->pubkey33,33); + if ( komodo_blockload(block,pindex) == 0 ) + komodo_block2pubkey33(pubkey33,&block); } } -int8_t komodo_minerid(int32_t height,uint8_t *pubkey33) -{ - int32_t num,i,numnotaries; CBlockIndex *pindex; uint32_t timestamp=0; uint8_t _pubkey33[33],pubkeys[64][33]; - if ( (pindex= chainActive[height]) != 0 ) - { - if ( pindex->didinit != 0 ) - { - if ( pubkey33 != 0 ) - memcpy(pubkey33,pindex->pubkey33,33); - return(pindex->notaryid); - } - if ( pubkey33 != 0 ) - komodo_index2pubkey33(pubkey33,pindex,height); - timestamp = pindex->GetBlockTime(); - if ( (num= komodo_notaries(pubkeys,height,timestamp)) > 0 ) - { - for (i=0; ididinit != 0 ) + { + if ( destpubkey33 != 0 ) + memcpy(destpubkey33,pindex->pubkey33,33); + return(pindex->notaryid); + } + komodo_index2pubkey33(pubkey33,pindex,height); + if ( destpubkey33 != 0 ) + memcpy(destpubkey33,pindex->pubkey33,33); + if ( pindex->didinit != 0 ) + return(pindex->notaryid); + timestamp = pindex->GetBlockTime(); + if ( (num= komodo_notaries(pubkeys,height,timestamp)) > 0 ) + { + for (i=0; inotaryid >= 0 && pindex->didinit != 0 ) + if ( komodo_blockload(block,pindex) == 0 ) { - memcpy(pubkeys[i],pindex->pubkey33,33); - mids[i] = pindex->notaryid; - (*nonzpkeysp)++; - } - else - { - komodo_pindex_init(pindex,height-i); - //komodo_index2pubkey33(pubkey33,pindex,height-i); - memcpy(pubkeys[i],pindex->pubkey33,33); - if ( (mids[i]= komodo_minerid(height-i,pubkey33)) >= 0 ) + komodo_block2pubkey33(pubkeys[i],&block); + for (j=0; j= 0 && i > 0 && mids[i] == mids[0] ) duplicate++; } @@ -854,17 +851,20 @@ int32_t komodo_minerids(uint8_t *minerids,int32_t height,int32_t width) // depre int32_t komodo_is_special(uint8_t pubkeys[66][33],int32_t mids[66],int32_t height,uint8_t pubkey33[33],uint32_t timestamp) { - int32_t i,notaryid=0,minerid,limit,nid; //uint8_t _pubkey33[33]; - if ( height >= 700000 ) + int32_t i,j,notaryid=0,minerid,limit,nid; uint8_t destpubkey33[33]; + komodo_chosennotary(¬aryid,height,pubkey33,timestamp); + if ( height >= 82000 ) { - if ( mids[0] >= 0 ) + if ( notaryid >= 0 ) { for (i=1; i<66; i++) { - if ( mids[i] == mids[0] ) + if ( mids[i] == notaryid ) { - fprintf(stderr,"ht.%d repeat notaryid.%d in mids[%d]\n",height,mids[0],i); - if ( height > 790000 ) + for (j=0; j<66; j++) + fprintf(stderr,"%d ",mids[j]); + fprintf(stderr,"ht.%d repeat notaryid.%d in mids[%d]\n",height,notaryid,i); + if ( height > 792000 ) return(-1); else break; } @@ -876,8 +876,6 @@ int32_t komodo_is_special(uint8_t pubkeys[66][33],int32_t mids[66],int32_t heigh { if ( height >= 34000 && notaryid >= 0 ) { - if ( height >= 225000 ) - komodo_chosennotary(¬aryid,height,pubkey33,timestamp); if ( height < 79693 ) limit = 64; else if ( height < 82000 ) @@ -888,8 +886,9 @@ int32_t komodo_is_special(uint8_t pubkeys[66][33],int32_t mids[66],int32_t heigh komodo_chosennotary(&nid,height-i,pubkey33,timestamp); if ( nid == notaryid ) { - if ( (0) && notaryid > 0 ) - fprintf(stderr,"ht.%d notaryid.%d already mined -i.%d nid.%d\n",height,notaryid,i,nid); + //for (j=0; j<66; j++) + // fprintf(stderr,"%d ",mids[j]); + //fprintf(stderr,"ht.%d repeat mids[%d] nid.%d notaryid.%d\n",height-i,i,nid,notaryid); if ( height > 225000 ) return(-1); } diff --git a/src/pow.cpp b/src/pow.cpp index 15c5c8732..009297242 100644 --- a/src/pow.cpp +++ b/src/pow.cpp @@ -116,7 +116,6 @@ bool CheckEquihashSolution(const CBlockHeader *pblock, const CChainParams& param return true; } -void komodo_pindex_init(CBlockIndex *pindex,int32_t height); int32_t komodo_chosennotary(int32_t *notaryidp,int32_t height,uint8_t *pubkey33,uint32_t timestamp); int32_t komodo_is_special(uint8_t pubkeys[66][33],int32_t mids[66],int32_t height,uint8_t pubkey33[33],uint32_t timestamp); int32_t komodo_currentheight(); @@ -128,15 +127,16 @@ extern char ASSETCHAINS_SYMBOL[]; #define KOMODO_ELECTION_GAP 2000 int32_t komodo_eligiblenotary(uint8_t pubkeys[66][33],int32_t *mids,int32_t *nonzpkeysp,int32_t height); -int32_t KOMODO_LOADINGBLOCKS; +int32_t KOMODO_LOADINGBLOCKS = 1; extern std::string NOTARY_PUBKEY; bool CheckProofOfWork(int32_t height,uint8_t *pubkey33,uint256 hash, unsigned int nBits, const Consensus::Params& params) { extern int32_t KOMODO_REWIND; - bool fNegative,fOverflow; int32_t i,nonzpkeys=0,nonz=0,special=0,special2=0,notaryid=-1,flag = 0, mids[66]; uint32_t timestamp = 0; CBlockIndex *pindex; + bool fNegative,fOverflow; uint8_t origpubkey33[33]; int32_t i,nonzpkeys=0,nonz=0,special=0,special2=0,notaryid=-1,flag = 0, mids[66]; uint32_t timestamp = 0; CBlockIndex *pindex=0; arith_uint256 bnTarget; uint8_t pubkeys[66][33]; + memcpy(origpubkey33,pubkey33,33); timestamp = komodo_chainactive_timestamp(); bnTarget.SetCompact(nBits, &fNegative, &fOverflow); if ( height == 0 ) @@ -146,13 +146,6 @@ bool CheckProofOfWork(int32_t height,uint8_t *pubkey33,uint256 hash, unsigned in } if ( height > 34000 && ASSETCHAINS_SYMBOL[0] == 0 ) // 0 -> non-special notary { - if ( KOMODO_LOADINGBLOCKS != 0 ) - return(true); - if ( (pindex= komodo_chainactive(height)) != 0 ) - { - komodo_pindex_init(pindex,height); - memcpy(pubkey33,pindex->pubkey33,33); - } special = komodo_chosennotary(¬aryid,height,pubkey33,timestamp); for (i=0; i<33; i++) { @@ -166,7 +159,6 @@ bool CheckProofOfWork(int32_t height,uint8_t *pubkey33,uint256 hash, unsigned in } flag = komodo_eligiblenotary(pubkeys,mids,&nonzpkeys,height); special2 = komodo_is_special(pubkeys,mids,height,pubkey33,timestamp); - fprintf(stderr,"ht.%d notaryid.%d special.%d flag.%d special2.%d\n",height,notaryid,special,flag,special2); if ( notaryid >= 0 ) { if ( height > 10000 && height < 80000 && (special != 0 || special2 > 0) ) @@ -177,8 +169,12 @@ bool CheckProofOfWork(int32_t height,uint8_t *pubkey33,uint256 hash, unsigned in flag = ((height % KOMODO_ELECTION_GAP) > 64 || (height % KOMODO_ELECTION_GAP) == 0); else if ( height == 790833 ) flag = 1; - else if ( special2 < 0 && height > 792000 ) - flag = 0; + else if ( special2 < 0 ) + { + if ( height > 792000 ) + flag = 0; + else fprintf(stderr,"ht.%d notaryid.%d special.%d flag.%d special2.%d\n",height,notaryid,special,flag,special2); + } if ( flag != 0 || special2 > 0 ) { //fprintf(stderr,"EASY MINING ht.%d\n",height); @@ -191,17 +187,14 @@ bool CheckProofOfWork(int32_t height,uint8_t *pubkey33,uint256 hash, unsigned in // Check proof of work matches claimed amount if ( UintToArith256(hash) > bnTarget ) { - if ( pindex != 0 ) - { - pindex->didinit = 0; - komodo_pindex_init(pindex,height); - } - return false; + if ( KOMODO_LOADINGBLOCKS != 0 ) + return true; + if ( height > 792000 ) + return false; } return true; } - arith_uint256 GetBlockProof(const CBlockIndex& block) { arith_uint256 bnTarget; From b5ca03bca7b6ba6b189aa73c54ad5980d81349be Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Apr 2018 22:49:40 +0300 Subject: [PATCH 1040/1062] Test --- src/chain.h | 1 - src/main.cpp | 10 +++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/chain.h b/src/chain.h index 3b8bbd9bd..a28e4e44a 100644 --- a/src/chain.h +++ b/src/chain.h @@ -177,7 +177,6 @@ public: //! (memory only) Sequential id assigned to distinguish order in which blocks are received. uint32_t nSequenceId; - int8_t notaryid; uint8_t pubkey33[33],didinit; void SetNull() { diff --git a/src/main.cpp b/src/main.cpp index f691a3674..30d46eb05 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1610,7 +1610,7 @@ bool ReadBlockFromDisk(int32_t height,CBlock& block, const CDiskBlockPos& pos) return error("%s: Deserialize or I/O error - %s at %s", __func__, e.what(), pos.ToString()); } // Check the header - komodo_block2pubkey33(pubkey33,block); + komodo_block2pubkey33(pubkey33,(CBlock *)block); if (!(CheckEquihashSolution(&block, Params()) && CheckProofOfWork(height,pubkey33,block.GetHash(), block.nBits, Params().GetConsensus()))) { int32_t i; for (i=0; i<33; i++) @@ -3508,9 +3508,9 @@ bool CheckBlockHeader(int32_t height,CBlockIndex *pindex, const CBlockHeader& bl return state.DoS(100, error("CheckBlockHeader(): Equihash solution invalid"),REJECT_INVALID, "invalid-solution"); // Check proof of work matches claimed amount - komodo_index2pubkey33(pubkey33,pindex,height); + /*komodo_index2pubkey33(pubkey33,pindex,height); if ( fCheckPOW && !CheckProofOfWork(height,pubkey33,blockhdr.GetHash(), blockhdr.nBits, Params().GetConsensus()) ) - return state.DoS(50, error("CheckBlockHeader(): proof of work failed"),REJECT_INVALID, "high-hash"); + return state.DoS(50, error("CheckBlockHeader(): proof of work failed"),REJECT_INVALID, "high-hash");*/ return true; } @@ -3520,12 +3520,16 @@ bool CheckBlock(int32_t height,CBlockIndex *pindex,const CBlock& block, CValidat libzcash::ProofVerifier& verifier, bool fCheckPOW, bool fCheckMerkleRoot) { + uint8_t pubkey33[33]; // These are checks that are independent of context. // Check that the header is valid (particularly PoW). This is mostly // redundant with the call in AcceptBlockHeader. if (!CheckBlockHeader(height,pindex,block,state,fCheckPOW)) return false; + komodo_block2pubkey33(pubkey33,(CBlock *)&block); + if ( fCheckPOW && !CheckProofOfWork(height,pubkey33,block.GetHash(), block.nBits, Params().GetConsensus()) ) + return state.DoS(50, error("CheckBlock(): proof of work failed"),REJECT_INVALID, "high-hash"); // Check the merkle root. if (fCheckMerkleRoot) { From f90c9f681c687ad11993d88a280edad69aef0e41 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Apr 2018 22:53:01 +0300 Subject: [PATCH 1041/1062] Test --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 30d46eb05..da117a6e2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1610,7 +1610,7 @@ bool ReadBlockFromDisk(int32_t height,CBlock& block, const CDiskBlockPos& pos) return error("%s: Deserialize or I/O error - %s at %s", __func__, e.what(), pos.ToString()); } // Check the header - komodo_block2pubkey33(pubkey33,(CBlock *)block); + komodo_block2pubkey33(pubkey33,(CBlock *)&block); if (!(CheckEquihashSolution(&block, Params()) && CheckProofOfWork(height,pubkey33,block.GetHash(), block.nBits, Params().GetConsensus()))) { int32_t i; for (i=0; i<33; i++) From 188c971923ce88de93585cedb10ff3f7e20e5cc4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Apr 2018 23:04:29 +0300 Subject: [PATCH 1042/1062] New notaries --- src/komodo_notary.h | 132 ++++++++++++++++++++++---------------------- 1 file changed, 66 insertions(+), 66 deletions(-) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 5f534957f..d0e02999a 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -126,75 +126,75 @@ const char *Notaries_elected0[][2] = { "xxspot2_XX", "03d85b221ea72ebcd25373e7961f4983d12add66a92f899deaf07bab1d8b6f5573" } }; -#define KOMODO_NOTARIES_TIMESTAMP1 1530921600 // 7/7/2017 -#define KOMODO_NOTARIES_HEIGHT1 ((900000 / KOMODO_ELECTION_GAP) * KOMODO_ELECTION_GAP) +#define KOMODO_NOTARIES_TIMESTAMP1 1525132800 // May 1st 2018 1530921600 // 7/7/2017 +#define KOMODO_NOTARIES_HEIGHT1 ((820000 / KOMODO_ELECTION_GAP) * KOMODO_ELECTION_GAP) const char *Notaries_elected1[][2] = { - { "0_jl777_testA", "03b7621b44118017a16043f19b30cc8a4cfe068ac4e42417bae16ba460c80f3828" }, - { "0_jl777_testB", "02ebfc784a4ba768aad88d44d1045d240d47b26e248cafaf1c5169a42d7a61d344" }, - { "0_kolo_testA", "0287aa4b73988ba26cf6565d815786caf0d2c4af704d7883d163ee89cd9977edec" }, - { "artik_AR", "029acf1dcd9f5ff9c455f8bb717d4ae0c703e089d16cf8424619c491dff5994c90" }, - { "artik_EU", "03f54b2c24f82632e3cdebe4568ba0acf487a80f8a89779173cdb78f74514847ce" }, - { "artik_NA", "0224e31f93eff0cc30eaf0b2389fbc591085c0e122c4d11862c1729d090106c842" }, - { "artik_SH", "02bdd8840a34486f38305f311c0e2ae73e84046f6e9c3dd3571e32e58339d20937" }, - { "badass_EU", "0209d48554768dd8dada988b98aca23405057ac4b5b46838a9378b95c3e79b9b9e" }, - { "badass_NA", "02afa1a9f948e1634a29dc718d218e9d150c531cfa852843a1643a02184a63c1a7" }, - { "badass_SH", "026b49dd3923b78a592c1b475f208e23698d3f085c4c3b4906a59faf659fd9530b" }, - { "crackers_EU", "03bc819982d3c6feb801ec3b720425b017d9b6ee9a40746b84422cbbf929dc73c3" }, // 10 - { "crackers_NA", "03205049103113d48c7c7af811b4c8f194dafc43a50d5313e61a22900fc1805b45" }, - { "crackers_SH", "02be28310e6312d1dd44651fd96f6a44ccc269a321f907502aae81d246fabdb03e" }, - { "durerus_EU", "02bcbd287670bdca2c31e5d50130adb5dea1b53198f18abeec7211825f47485d57" }, - { "etszombi_AR", "031c79168d15edabf17d9ec99531ea9baa20039d0cdc14d9525863b83341b210e9" }, - { "etszombi_EU", "0281b1ad28d238a2b217e0af123ce020b79e91b9b10ad65a7917216eda6fe64bf7" }, // 15 - { "etszombi_SH", "025d7a193c0757f7437fad3431f027e7b5ed6c925b77daba52a8755d24bf682dde" }, - { "farl4web_EU", "0300ecf9121cccf14cf9423e2adb5d98ce0c4e251721fa345dec2e03abeffbab3f" }, - { "farl4web_SH", "0396bb5ed3c57aa1221d7775ae0ff751e4c7dc9be220d0917fa8bbdf670586c030" }, - { "fullmoon_AR", "0254b1d64840ce9ff6bec9dd10e33beb92af5f7cee628f999cb6bc0fea833347cc" }, - { "fullmoon_NA", "031fb362323b06e165231c887836a8faadb96eda88a79ca434e28b3520b47d235b" }, // 20 - { "fullmoon_SH", "030e12b42ec33a80e12e570b6c8274ce664565b5c3da106859e96a7208b93afd0d" }, - { "grewal_NA", "03adc0834c203d172bce814df7c7a5e13dc603105e6b0adabc942d0421aefd2132" }, - { "grewal_SH", "03212a73f5d38a675ee3cdc6e82542a96c38c3d1c79d25a1ed2e42fcf6a8be4e68" }, - { "indenodes_AR", "02ec0fa5a40f47fd4a38ea5c89e375ad0b6ddf4807c99733c9c3dc15fb978ee147" }, - { "indenodes_EU", "0221387ff95c44cb52b86552e3ec118a3c311ca65b75bf807c6c07eaeb1be8303c" }, - { "indenodes_NA", "02698c6f1c9e43b66e82dbb163e8df0e5a2f62f3a7a882ca387d82f86e0b3fa988" }, - { "indenodes_SH", "0334e6e1ec8285c4b85bd6dae67e17d67d1f20e7328efad17ce6fd24ae97cdd65e" }, - { "jeezy_EU", "023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6" }, - { "jsgalt_NA", "027b3fb6fede798cd17c30dbfb7baf9332b3f8b1c7c513f443070874c410232446" }, - { "karasugoi_NA", "02a348b03b9c1a8eac1b56f85c402b041c9bce918833f2ea16d13452309052a982" }, // 30 - { "kashifali_EU", "033777c52a0190f261c6f66bd0e2bb299d30f012dcb8bfff384103211edb8bb207" }, - { "kolo_AR", "03016d19344c45341e023b72f9fb6e6152fdcfe105f3b4f50b82a4790ff54e9dc6" }, - { "kolo_SH", "02aa24064500756d9b0959b44d5325f2391d8e95c6127e109184937152c384e185" }, - { "metaphilibert_AR", "02adad675fae12b25fdd0f57250b0caf7f795c43f346153a31fe3e72e7db1d6ac6" }, - { "movecrypto_AR", "022783d94518e4dc77cbdf1a97915b29f427d7bc15ea867900a76665d3112be6f3" }, - { "movecrypto_EU", "021ab53bc6cf2c46b8a5456759f9d608966eff87384c2b52c0ac4cc8dd51e9cc42" }, - { "movecrypto_NA", "02efb12f4d78f44b0542d1c60146738e4d5506d27ec98a469142c5c84b29de0a80" }, - { "movecrypto_SH", "031f9739a3ebd6037a967ce1582cde66e79ea9a0551c54731c59c6b80f635bc859" }, - { "muros_AR", "022d77402fd7179335da39479c829be73428b0ef33fb360a4de6890f37c2aa005e" }, - { "noashh_AR", "029d93ef78197dc93892d2a30e5a54865f41e0ca3ab7eb8e3dcbc59c8756b6e355" }, // 40 - { "noashh_EU", "02061c6278b91fd4ac5cab4401100ffa3b2d5a277e8f71db23401cc071b3665546" }, - { "noashh_NA", "033c073366152b6b01535e15dd966a3a8039169584d06e27d92a69889b720d44e1" }, - { "nxtswe_EU", "032fb104e5eaa704a38a52c126af8f67e870d70f82977e5b2f093d5c1c21ae5899" }, - { "polycryptoblog_NA", "02708dcda7c45fb54b78469673c2587bfdd126e381654819c4c23df0e00b679622" }, - { "pondsea_AR", "032e1c213787312099158f2d74a89e8240a991d162d4ce8017d8504d1d7004f735" }, - { "pondsea_EU", "0225aa6f6f19e543180b31153d9e6d55d41bc7ec2ba191fd29f19a2f973544e29d" }, - { "pondsea_NA", "031bcfdbb62268e2ff8dfffeb9ddff7fe95fca46778c77eebff9c3829dfa1bb411" }, - { "pondsea_SH", "02209073bc0943451498de57f802650311b1f12aa6deffcd893da198a544c04f36" }, - { "popcornbag_AR", "02761f106fb34fbfc5ddcc0c0aa831ed98e462a908550b280a1f7bd32c060c6fa3" }, - { "popcornbag_NA", "03c6085c7fdfff70988fda9b197371f1caf8397f1729a844790e421ee07b3a93e8" }, // 50 - { "ptytrader_NA", "0328c61467148b207400b23875234f8a825cce65b9c4c9b664f47410b8b8e3c222" }, - { "ptytrader_SH", "0250c93c492d8d5a6b565b90c22bee07c2d8701d6118c6267e99a4efd3c7748fa4" }, - { "rnr_AR", "029bdb08f931c0e98c2c4ba4ef45c8e33a34168cb2e6bf953cef335c359d77bfcd" }, - { "rnr_EU", "03f5c08dadffa0ffcafb8dd7ffc38c22887bd02702a6c9ac3440deddcf2837692b" }, - { "rnr_NA", "02e17c5f8c3c80f584ed343b8dcfa6d710dfef0889ec1e7728ce45ce559347c58c" }, - { "rnr_SH", "037536fb9bdfed10251f71543fb42679e7c52308bcd12146b2568b9a818d8b8377" }, - { "titomane_AR", "03cda6ca5c2d02db201488a54a548dbfc10533bdc275d5ea11928e8d6ab33c2185" }, - { "titomane_EU", "02e41feded94f0cc59f55f82f3c2c005d41da024e9a805b41105207ef89aa4bfbd" }, - { "titomane_SH", "035f49d7a308dd9a209e894321f010d21b7793461b0c89d6d9231a3fe5f68d9960" }, - { "vanbreuk_EU", "024f3cad7601d2399c131fd070e797d9cd8533868685ddbe515daa53c2e26004c3" }, // 60 - { "xrobesx_NA", "03f0cc6d142d14a40937f12dbd99dbd9021328f45759e26f1877f2a838876709e1" }, - { "xxspot1_XX", "02ef445a392fcaf3ad4176a5da7f43580e8056594e003eba6559a713711a27f955" }, - { "xxspot2_XX", "03d85b221ea72ebcd25373e7961f4983d12add66a92f899deaf07bab1d8b6f5573" } + {"0dev1_jl777", "03b7621b44118017a16043f19b30cc8a4cfe068ac4e42417bae16ba460c80f3828" }, + {"0dev2_kolo", "030f34af4b908fb8eb2099accb56b8d157d49f6cfb691baa80fdd34f385efed961" }, + {"0dev3_kolo", "025af9d2b2a05338478159e9ac84543968fd18c45fd9307866b56f33898653b014" }, + {"0dev4_decker", "028eea44a09674dda00d88ffd199a09c9b75ba9782382cc8f1e97c0fd565fe5707" }, + {"a-team_SH", "03b59ad322b17cb94080dc8e6dc10a0a865de6d47c16fb5b1a0b5f77f9507f3cce" }, + {"artik_AR", "029acf1dcd9f5ff9c455f8bb717d4ae0c703e089d16cf8424619c491dff5994c90" }, + {"artik_EU", "03f54b2c24f82632e3cdebe4568ba0acf487a80f8a89779173cdb78f74514847ce" }, + {"artik_NA", "0224e31f93eff0cc30eaf0b2389fbc591085c0e122c4d11862c1729d090106c842" }, + {"artik_SH", "02bdd8840a34486f38305f311c0e2ae73e84046f6e9c3dd3571e32e58339d20937" }, + {"badass_EU", "0209d48554768dd8dada988b98aca23405057ac4b5b46838a9378b95c3e79b9b9e" }, + {"badass_NA", "02afa1a9f948e1634a29dc718d218e9d150c531cfa852843a1643a02184a63c1a7" }, + {"batman_AR", "033ecb640ec5852f42be24c3bf33ca123fb32ced134bed6aa2ba249cf31b0f2563" }, + {"batman_SH", "02ca5898931181d0b8aafc75ef56fce9c43656c0b6c9f64306e7c8542f6207018c" }, + {"ca333_EU", "03fc87b8c804f12a6bd18efd43b0ba2828e4e38834f6b44c0bfee19f966a12ba99" }, + {"chainmakers_EU", "02f3b08938a7f8d2609d567aebc4989eeded6e2e880c058fdf092c5da82c3bc5ee" }, + {"chainmakers_NA", "0276c6d1c65abc64c8559710b8aff4b9e33787072d3dda4ec9a47b30da0725f57a" }, + {"chainstrike_SH", "0370bcf10575d8fb0291afad7bf3a76929734f888228bc49e35c5c49b336002153" }, + {"cipi_AR", "02c4f89a5b382750836cb787880d30e23502265054e1c327a5bfce67116d757ce8" }, + {"cipi_NA", "02858904a2a1a0b44df4c937b65ee1f5b66186ab87a751858cf270dee1d5031f18" }, + {"crackers_EU", "03bc819982d3c6feb801ec3b720425b017d9b6ee9a40746b84422cbbf929dc73c3" }, + {"crackers_NA", "03205049103113d48c7c7af811b4c8f194dafc43a50d5313e61a22900fc1805b45" }, + {"dwy_EU", "0259c646288580221fdf0e92dbeecaee214504fdc8bbdf4a3019d6ec18b7540424" }, + {"emmanux_SH", "033f316114d950497fc1d9348f03770cd420f14f662ab2db6172df44c389a2667a" }, + {"etszombi_EU", "0281b1ad28d238a2b217e0af123ce020b79e91b9b10ad65a7917216eda6fe64bf7" }, + {"fullmoon_AR", "03380314c4f42fa854df8c471618751879f9e8f0ff5dbabda2bd77d0f96cb35676" }, + {"fullmoon_NA", "030216211d8e2a48bae9e5d7eb3a42ca2b7aae8770979a791f883869aea2fa6eef" }, + {"fullmoon_SH", "03f34282fa57ecc7aba8afaf66c30099b5601e98dcbfd0d8a58c86c20d8b692c64" }, + {"goldenman_EU", "02d6f13a8f745921cdb811e32237bb98950af1a5952be7b3d429abd9152f8e388d" }, + {"indenodes_AR", "02ec0fa5a40f47fd4a38ea5c89e375ad0b6ddf4807c99733c9c3dc15fb978ee147" }, + {"indenodes_EU", "0221387ff95c44cb52b86552e3ec118a3c311ca65b75bf807c6c07eaeb1be8303c" }, + {"indenodes_NA", "02698c6f1c9e43b66e82dbb163e8df0e5a2f62f3a7a882ca387d82f86e0b3fa988" }, + {"indenodes_SH", "0334e6e1ec8285c4b85bd6dae67e17d67d1f20e7328efad17ce6fd24ae97cdd65e" }, + {"jackson_AR", "038ff7cfe34cb13b524e0941d5cf710beca2ffb7e05ddf15ced7d4f14fbb0a6f69" }, + {"jeezy_EU", "023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6" }, + {"karasugoi_NA", "02a348b03b9c1a8eac1b56f85c402b041c9bce918833f2ea16d13452309052a982" }, + {"komodoninja_EU", "038e567b99806b200b267b27bbca2abf6a3e8576406df5f872e3b38d30843cd5ba" }, + {"komodoninja_SH", "033178586896915e8456ebf407b1915351a617f46984001790f0cce3d6f3ada5c2" }, + {"komodopioneers_SH", "033ace50aedf8df70035b962a805431363a61cc4e69d99d90726a2d48fb195f68c" }, + {"libscott_SH", "03301a8248d41bc5dc926088a8cf31b65e2daf49eed7eb26af4fb03aae19682b95" }, + {"lukechilds_AR", "031aa66313ee024bbee8c17915cf7d105656d0ace5b4a43a3ab5eae1e14ec02696" }, + {"madmax_AR", "03891555b4a4393d655bf76f0ad0fb74e5159a615b6925907678edc2aac5e06a75" }, + {"meshbits_AR", "02957fd48ae6cb361b8a28cdb1b8ccf5067ff68eb1f90cba7df5f7934ed8eb4b2c" }, + {"meshbits_SH", "025c6e94877515dfd7b05682b9cc2fe4a49e076efe291e54fcec3add78183c1edb" }, + {"metaphilibert_AR", "02adad675fae12b25fdd0f57250b0caf7f795c43f346153a31fe3e72e7db1d6ac6" }, + {"metaphilibert_SH", "0284af1a5ef01503e6316a2ca4abf8423a794e9fc17ac6846f042b6f4adedc3309" }, + {"patchkez_SH", "0296270f394140640f8fa15684fc11255371abb6b9f253416ea2734e34607799c4" }, + {"pbca26_NA", "0276aca53a058556c485bbb60bdc54b600efe402a8b97f0341a7c04803ce204cb5" }, + {"peer2cloud_AR", "034e5563cb885999ae1530bd66fab728e580016629e8377579493b386bf6cebb15" }, + {"peer2cloud_SH", "03396ac453b3f23e20f30d4793c5b8ab6ded6993242df4f09fd91eb9a4f8aede84" }, + {"polycryptoblog_NA", "02708dcda7c45fb54b78469673c2587bfdd126e381654819c4c23df0e00b679622" }, + {"hyper_AR", "020f2f984d522051bd5247b61b080b4374a7ab389d959408313e8062acad3266b4" }, + {"hyper_EU", "03d00cf9ceace209c59fb013e112a786ad583d7de5ca45b1e0df3b4023bb14bf51" }, + {"hyper_SH", "0383d0b37f59f4ee5e3e98a47e461c861d49d0d90c80e9e16f7e63686a2dc071f3" }, + {"hyper_NA", "03d91c43230336c0d4b769c9c940145a8c53168bf62e34d1bccd7f6cfc7e5592de" }, + {"popcornbag_AR", "02761f106fb34fbfc5ddcc0c0aa831ed98e462a908550b280a1f7bd32c060c6fa3" }, + {"popcornbag_NA", "03c6085c7fdfff70988fda9b197371f1caf8397f1729a844790e421ee07b3a93e8" }, + {"alien_AR", "0348d9b1fc6acf81290405580f525ee49b4749ed4637b51a28b18caa26543b20f0" }, + {"alien_EU", "020aab8308d4df375a846a9e3b1c7e99597b90497efa021d50bcf1bbba23246527" }, + {"thegaltmines_NA", "031bea28bec98b6380958a493a703ddc3353d7b05eb452109a773eefd15a32e421" }, + {"titomane_AR", "029d19215440d8cb9cc6c6b7a4744ae7fb9fb18d986e371b06aeb34b64845f9325" }, + {"titomane_EU", "0360b4805d885ff596f94312eed3e4e17cb56aa8077c6dd78d905f8de89da9499f" }, + {"titomane_SH", "03573713c5b20c1e682a2e8c0f8437625b3530f278e705af9b6614de29277a435b" }, + {"webworker01_NA", "03bb7d005e052779b1586f071834c5facbb83470094cff5112f0072b64989f97d7" }, + {"xrobesx_NA", "03f0cc6d142d14a40937f12dbd99dbd9021328f45759e26f1877f2a838876709e1" }, }; int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestamp) From 56aa66a0db2718b63fbd7ad51ba63d72dffc3bd5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 14 Apr 2018 00:20:47 +0300 Subject: [PATCH 1043/1062] Test --- src/pow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pow.cpp b/src/pow.cpp index 009297242..b7b945353 100644 --- a/src/pow.cpp +++ b/src/pow.cpp @@ -189,7 +189,7 @@ bool CheckProofOfWork(int32_t height,uint8_t *pubkey33,uint256 hash, unsigned in { if ( KOMODO_LOADINGBLOCKS != 0 ) return true; - if ( height > 792000 ) + if ( ASSETCHAINS_SYMBOL[0] != 0 || height > 792000 ) return false; } return true; From 2689bd1275e04f48191125ea588e7226bb5b174f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 14 Apr 2018 00:26:03 +0300 Subject: [PATCH 1044/1062] -print --- src/komodo_bitcoind.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index ece63942e..4d513ca90 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -861,9 +861,9 @@ int32_t komodo_is_special(uint8_t pubkeys[66][33],int32_t mids[66],int32_t heigh { if ( mids[i] == notaryid ) { - for (j=0; j<66; j++) - fprintf(stderr,"%d ",mids[j]); - fprintf(stderr,"ht.%d repeat notaryid.%d in mids[%d]\n",height,notaryid,i); + //for (j=0; j<66; j++) + // fprintf(stderr,"%d ",mids[j]); + //fprintf(stderr,"ht.%d repeat notaryid.%d in mids[%d]\n",height,notaryid,i); if ( height > 792000 ) return(-1); else break; From a20f07e7d17f6d4000358a3b580a495b02193fdf Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 14 Apr 2018 15:19:14 +0300 Subject: [PATCH 1045/1062] Fix buffer overflows and reduce KMD men usage --- src/komodo_events.h | 94 ++++++++++++++++++++++++--------------------- 1 file changed, 51 insertions(+), 43 deletions(-) diff --git a/src/komodo_events.h b/src/komodo_events.h index 4d9ff87dc..b301f8a25 100644 --- a/src/komodo_events.h +++ b/src/komodo_events.h @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2017 The SuperNET Developers. * + * Copyright © 2014-2018 The SuperNET Developers. * * * * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * * the top-level directory of this distribution for the individual copyright * @@ -20,7 +20,7 @@ struct komodo_event *komodo_eventadd(struct komodo_state *sp,int32_t height,char *symbol,uint8_t type,uint8_t *data,uint16_t datalen) { struct komodo_event *ep=0; uint16_t len = (uint16_t)(sizeof(*ep) + datalen); - if ( sp != 0 ) + if ( sp != 0 && ASSETCHAINS_SYMBOL[0] != 0 ) { portable_mutex_lock(&komodo_mutex); ep = (struct komodo_event *)calloc(1,len); @@ -55,7 +55,7 @@ void komodo_eventadd_notarized(struct komodo_state *sp,char *symbol,int32_t heig N.notarizedheight = notarizedheight; N.MoM = MoM; N.MoMdepth = MoMdepth; - strcpy(N.dest,dest); + strncpy(N.dest,dest,sizeof(N.dest)-1); komodo_eventadd(sp,height,symbol,KOMODO_EVENT_NOTARIZED,(uint8_t *)&N,sizeof(N)); if ( sp != 0 ) komodo_notarized_update(sp,height,notarizedheight,notarized_hash,notarized_desttxid,MoM,MoMdepth); @@ -77,27 +77,34 @@ void komodo_eventadd_pubkeys(struct komodo_state *sp,char *symbol,int32_t height void komodo_eventadd_pricefeed(struct komodo_state *sp,char *symbol,int32_t height,uint32_t *prices,uint8_t num) { struct komodo_event_pricefeed F; - memset(&F,0,sizeof(F)); - F.num = num; - memcpy(F.prices,prices,sizeof(*F.prices) * num); - komodo_eventadd(sp,height,symbol,KOMODO_EVENT_PRICEFEED,(uint8_t *)&F,(int32_t)(sizeof(F.num) + sizeof(*F.prices) * num)); - if ( sp != 0 ) - komodo_pvals(height,prices,num); + if ( num == sizeof(F.prices)/sizeof(*F.prices) ) + { + memset(&F,0,sizeof(F)); + F.num = num; + memcpy(F.prices,prices,sizeof(*F.prices) * num); + komodo_eventadd(sp,height,symbol,KOMODO_EVENT_PRICEFEED,(uint8_t *)&F,(int32_t)(sizeof(F.num) + sizeof(*F.prices) * num)); + if ( sp != 0 ) + komodo_pvals(height,prices,num); + } else fprintf(stderr,"skip pricefeed[%d]\n",num); } void komodo_eventadd_opreturn(struct komodo_state *sp,char *symbol,int32_t height,uint256 txid,uint64_t value,uint16_t vout,uint8_t *buf,uint16_t opretlen) { - struct komodo_event_opreturn O; uint8_t opret[16384]; - memset(&O,0,sizeof(O)); - O.txid = txid; - O.value = value; - O.vout = vout; - memcpy(opret,&O,sizeof(O)); - memcpy(&opret[sizeof(O)],buf,opretlen); - O.oplen = (int32_t)(opretlen + sizeof(O)); - komodo_eventadd(sp,height,symbol,KOMODO_EVENT_OPRETURN,opret,O.oplen); - if ( sp != 0 ) - komodo_opreturn(height,value,buf,opretlen,txid,vout,symbol); + struct komodo_event_opreturn O; uint8_t *opret; + if ( ASSETCHAINS_SYMBOL[0] != 0 ) + { + opret = (uint8_t *)calloc(1,sizeof(O) + opretlen + 16); + O.txid = txid; + O.value = value; + O.vout = vout; + memcpy(opret,&O,sizeof(O)); + memcpy(&opret[sizeof(O)],buf,opretlen); + O.oplen = (int32_t)(opretlen + sizeof(O)); + komodo_eventadd(sp,height,symbol,KOMODO_EVENT_OPRETURN,opret,O.oplen); + free(opret); + if ( sp != 0 ) + komodo_opreturn(height,value,buf,opretlen,txid,vout,symbol); + } } void komodo_event_undo(struct komodo_state *sp,struct komodo_event *ep) @@ -171,6 +178,7 @@ void komodo_eventadd_kmdheight(struct komodo_state *sp,char *symbol,int32_t heig } else { + //fprintf(stderr,"REWIND kmdheight.%d\n",kmdheight); kmdheight = -kmdheight; komodo_eventadd(sp,height,symbol,KOMODO_EVENT_REWIND,(uint8_t *)&height,sizeof(height)); if ( sp != 0 ) @@ -180,30 +188,30 @@ void komodo_eventadd_kmdheight(struct komodo_state *sp,char *symbol,int32_t heig /*void komodo_eventadd_deposit(int32_t actionflag,char *symbol,int32_t height,uint64_t komodoshis,char *fiat,uint64_t fiatoshis,uint8_t rmd160[20],bits256 kmdtxid,uint16_t kmdvout,uint64_t price) -{ - uint8_t opret[512]; uint16_t opretlen; - komodo_eventadd_opreturn(symbol,height,KOMODO_OPRETURN_DEPOSIT,kmdtxid,komodoshis,kmdvout,opret,opretlen); -} - -void komodo_eventadd_issued(int32_t actionflag,char *symbol,int32_t height,int32_t fiatheight,bits256 fiattxid,uint16_t fiatvout,bits256 kmdtxid,uint16_t kmdvout,uint64_t fiatoshis) -{ - uint8_t opret[512]; uint16_t opretlen; - komodo_eventadd_opreturn(symbol,height,KOMODO_OPRETURN_ISSUED,fiattxid,fiatoshis,fiatvout,opret,opretlen); -} - -void komodo_eventadd_withdraw(int32_t actionflag,char *symbol,int32_t height,uint64_t komodoshis,char *fiat,uint64_t fiatoshis,uint8_t rmd160[20],bits256 fiattxid,int32_t fiatvout,uint64_t price) -{ - uint8_t opret[512]; uint16_t opretlen; - komodo_eventadd_opreturn(symbol,height,KOMODO_OPRETURN_WITHDRAW,fiattxid,fiatoshis,fiatvout,opret,opretlen); -} - -void komodo_eventadd_redeemed(int32_t actionflag,char *symbol,int32_t height,bits256 kmdtxid,uint16_t kmdvout,int32_t fiatheight,bits256 fiattxid,uint16_t fiatvout,uint64_t komodoshis) -{ - uint8_t opret[512]; uint16_t opretlen; - komodo_eventadd_opreturn(symbol,height,KOMODO_OPRETURN_REDEEMED,kmdtxid,komodoshis,kmdvout,opret,opretlen); -}*/ + { + uint8_t opret[512]; uint16_t opretlen; + komodo_eventadd_opreturn(symbol,height,KOMODO_OPRETURN_DEPOSIT,kmdtxid,komodoshis,kmdvout,opret,opretlen); + } + + void komodo_eventadd_issued(int32_t actionflag,char *symbol,int32_t height,int32_t fiatheight,bits256 fiattxid,uint16_t fiatvout,bits256 kmdtxid,uint16_t kmdvout,uint64_t fiatoshis) + { + uint8_t opret[512]; uint16_t opretlen; + komodo_eventadd_opreturn(symbol,height,KOMODO_OPRETURN_ISSUED,fiattxid,fiatoshis,fiatvout,opret,opretlen); + } + + void komodo_eventadd_withdraw(int32_t actionflag,char *symbol,int32_t height,uint64_t komodoshis,char *fiat,uint64_t fiatoshis,uint8_t rmd160[20],bits256 fiattxid,int32_t fiatvout,uint64_t price) + { + uint8_t opret[512]; uint16_t opretlen; + komodo_eventadd_opreturn(symbol,height,KOMODO_OPRETURN_WITHDRAW,fiattxid,fiatoshis,fiatvout,opret,opretlen); + } + + void komodo_eventadd_redeemed(int32_t actionflag,char *symbol,int32_t height,bits256 kmdtxid,uint16_t kmdvout,int32_t fiatheight,bits256 fiattxid,uint16_t fiatvout,uint64_t komodoshis) + { + uint8_t opret[512]; uint16_t opretlen; + komodo_eventadd_opreturn(symbol,height,KOMODO_OPRETURN_REDEEMED,kmdtxid,komodoshis,kmdvout,opret,opretlen); + }*/ // process events -// +// #endif From 862285c784153a6b7ce6a328416361aec6fdad69 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 14 Apr 2018 15:27:25 +0300 Subject: [PATCH 1046/1062] -print --- src/komodo_events.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_events.h b/src/komodo_events.h index b301f8a25..c64ccbaa2 100644 --- a/src/komodo_events.h +++ b/src/komodo_events.h @@ -85,7 +85,7 @@ void komodo_eventadd_pricefeed(struct komodo_state *sp,char *symbol,int32_t heig komodo_eventadd(sp,height,symbol,KOMODO_EVENT_PRICEFEED,(uint8_t *)&F,(int32_t)(sizeof(F.num) + sizeof(*F.prices) * num)); if ( sp != 0 ) komodo_pvals(height,prices,num); - } else fprintf(stderr,"skip pricefeed[%d]\n",num); + } //else fprintf(stderr,"skip pricefeed[%d]\n",num); } void komodo_eventadd_opreturn(struct komodo_state *sp,char *symbol,int32_t height,uint256 txid,uint64_t value,uint16_t vout,uint8_t *buf,uint16_t opretlen) From 657617dad1a566ca42fa5b06e72596fb6472eccb Mon Sep 17 00:00:00 2001 From: Mihail Fedorov Date: Sun, 15 Apr 2018 01:23:57 +0300 Subject: [PATCH 1047/1062] curl fix --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 92b0b779c..7a4308f7d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,7 +5,7 @@ RUN apt-get -y update && \ apt-get -y upgrade && \ apt-get -y install build-essential pkg-config libc6-dev m4 g++-multilib autoconf libtool ncurses-dev \ unzip python zlib1g-dev wget bsdmainutils automake libssl-dev libprotobuf-dev \ - protobuf-compiler libqrencode-dev libdb++-dev software-properties-common libcurl4-openssl-dev && \ + protobuf-compiler libqrencode-dev libdb++-dev software-properties-common libcurl4-openssl-dev curl && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* From e8131126d5f07a30f504d09eee4000932b3f4217 Mon Sep 17 00:00:00 2001 From: Mihail Fedorov Date: Sun, 15 Apr 2018 01:36:52 +0300 Subject: [PATCH 1048/1062] readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 25c573317..74425bd3c 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ Dependencies ``` #The following packages are needed: -sudo apt-get install build-essential pkg-config libc6-dev m4 g++-multilib autoconf libtool ncurses-dev unzip git python python-zmq zlib1g-dev wget libcurl3-gnutls-dev bsdmainutils automake +sudo apt-get install build-essential pkg-config libc6-dev m4 g++-multilib autoconf libtool ncurses-dev unzip git python python-zmq zlib1g-dev wget libcurl4-openssl-dev bsdmainutils automake curl ``` Komodo From 3230f71b9f61eb9b57ad8401c7bd45aaff32b4a1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 15 Apr 2018 12:45:19 +0300 Subject: [PATCH 1049/1062] -USD/EUR --- src/dpowassets | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/dpowassets b/src/dpowassets index cd68083ae..14bb39912 100755 --- a/src/dpowassets +++ b/src/dpowassets @@ -33,5 +33,3 @@ curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dp curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"BNTN\",\"pubkey\":\"$pubkey\"}" curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"PRLPAY\",\"pubkey\":\"$pubkey\"}" -#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"USD\",\"pubkey\":\"$pubkey\"}" -#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"EUR\",\"pubkey\":\"$pubkey\"}" From e708237b8afe06a1ece474d4795ef8614a934825 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 15 Apr 2018 15:56:43 +0300 Subject: [PATCH 1050/1062] -print --- src/komodo_bitcoind.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 4d513ca90..e9a379abc 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -651,7 +651,7 @@ int32_t komodo_block2height(CBlock *block) } if ( height != height2 ) { - fprintf(stderr,"block2height height.%d vs height2.%d, match.%d mismatch.%d\n",height,height2,match,mismatch); + //fprintf(stderr,"block2height height.%d vs height2.%d, match.%d mismatch.%d\n",height,height2,match,mismatch); mismatch++; if ( height2 >= 0 ) height = height2; From 59e8a4f7eec0c1703213a8d19783a6c8d5ea15fe Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 15 Apr 2018 20:27:23 +0300 Subject: [PATCH 1051/1062] Sync main.cpp to jl777 --- src/main.cpp | 2360 ++++++++++++++++++++++++++------------------------ 1 file changed, 1208 insertions(+), 1152 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index da117a6e2..19e3c29ee 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -53,7 +53,8 @@ using namespace std; CCriticalSection cs_main; extern uint8_t NOTARY_PUBKEY33[33]; -extern int32_t KOMODO_LOADINGBLOCKS; +extern int32_t KOMODO_LOADINGBLOCKS,KOMODO_LONGESTCHAIN; +void komodo_block2pubkey33(uint8_t *pubkey33,CBlock *block); BlockMap mapBlockIndex; CChain chainActive; @@ -105,30 +106,30 @@ const string strMessageMagic = "Komodo Signed Message:\n"; // Internal stuff namespace { - + struct CBlockIndexWorkComparator { bool operator()(CBlockIndex *pa, CBlockIndex *pb) const { // First sort by most total work, ... if (pa->nChainWork > pb->nChainWork) return false; if (pa->nChainWork < pb->nChainWork) return true; - + // ... then by earliest time received, ... if (pa->nSequenceId < pb->nSequenceId) return false; if (pa->nSequenceId > pb->nSequenceId) return true; - + // Use pointer address as tie breaker (should only happen with blocks // loaded from disk, as those all have id 0). if (pa < pb) return false; if (pa > pb) return true; - + // Identical blocks. return false; } }; - + CBlockIndex *pindexBestInvalid; - + /** * The set of all CBlockIndex entries with BLOCK_VALID_TRANSACTIONS (for itself and all ancestors) and * as good as our current tip or better. Entries may be failed, though, and pruning nodes may be @@ -138,10 +139,10 @@ namespace { /** Number of nodes with fSyncStarted. */ int nSyncStarted = 0; /** All pairs A->B, where A (or one if its ancestors) misses transactions, but B has transactions. - * Pruned nodes may have entries where B is missing data. - */ + * Pruned nodes may have entries where B is missing data. + */ multimap mapBlocksUnlinked; - + CCriticalSection cs_LastBlockFile; std::vector vinfoBlockFile; int nLastBlockFile = 0; @@ -150,7 +151,7 @@ namespace { * or if we allocate more file space when we're in prune mode */ bool fCheckForPruning = false; - + /** * Every received block is assigned a unique and increasing identifier, so we * know which one to give priority in case of a fork. @@ -158,14 +159,14 @@ namespace { CCriticalSection cs_nBlockSequenceId; /** Blocks loaded from disk are assigned id 0, so start the counter at 1. */ uint32_t nBlockSequenceId = 1; - + /** * Sources of received blocks, saved to be able to send them reject * messages or ban them when processing happens afterwards. Protected by * cs_main. */ map mapBlockSource; - + /** * Filter for transactions that were recently rejected by * AcceptToMemoryPool. These are not rerequested until the chain tip @@ -188,7 +189,7 @@ namespace { */ boost::scoped_ptr recentRejects; uint256 hashRecentRejectsChainTip; - + /** Blocks that are in flight, and that are in the queue to be downloaded. Protected by cs_main. */ struct QueuedBlock { uint256 hash; @@ -198,16 +199,16 @@ namespace { int64_t nTimeDisconnect; //! The timeout for this block request (for disconnecting a slow peer) }; map::iterator> > mapBlocksInFlight; - + /** Number of blocks in flight with validated headers. */ int nQueuedValidatedHeaders = 0; - + /** Number of preferable block download peers. */ int nPreferredDownload = 0; - + /** Dirty block index entries. */ set setDirtyBlockIndex; - + /** Dirty block file entries. */ set setDirtyFileInfo; } // anon namespace @@ -218,306 +219,306 @@ namespace { // namespace { - -struct CBlockReject { - unsigned char chRejectCode; - string strRejectReason; - uint256 hashBlock; -}; - -/** - * Maintain validation-specific state about nodes, protected by cs_main, instead - * by CNode's own locks. This simplifies asynchronous operation, where - * processing of incoming data is done after the ProcessMessage call returns, - * and we're no longer holding the node's locks. - */ -struct CNodeState { - //! The peer's address - CService address; - //! Whether we have a fully established connection. - bool fCurrentlyConnected; - //! Accumulated misbehaviour score for this peer. - int nMisbehavior; - //! Whether this peer should be disconnected and banned (unless whitelisted). - bool fShouldBan; - //! String name of this peer (debugging/logging purposes). - std::string name; - //! List of asynchronously-determined block rejections to notify this peer about. - std::vector rejects; - //! The best known block we know this peer has announced. - CBlockIndex *pindexBestKnownBlock; - //! The hash of the last unknown block this peer has announced. - uint256 hashLastUnknownBlock; - //! The last full block we both have. - CBlockIndex *pindexLastCommonBlock; - //! Whether we've started headers synchronization with this peer. - bool fSyncStarted; - //! Since when we're stalling block download progress (in microseconds), or 0. - int64_t nStallingSince; - list vBlocksInFlight; - int nBlocksInFlight; - int nBlocksInFlightValidHeaders; - //! Whether we consider this a preferred download peer. - bool fPreferredDownload; - - CNodeState() { - fCurrentlyConnected = false; - nMisbehavior = 0; - fShouldBan = false; - pindexBestKnownBlock = NULL; - hashLastUnknownBlock.SetNull(); - pindexLastCommonBlock = NULL; - fSyncStarted = false; - nStallingSince = 0; - nBlocksInFlight = 0; - nBlocksInFlightValidHeaders = 0; - fPreferredDownload = false; - } -}; - -/** Map maintaining per-node state. Requires cs_main. */ -map mapNodeState; - -// Requires cs_main. -CNodeState *State(NodeId pnode) { - map::iterator it = mapNodeState.find(pnode); - if (it == mapNodeState.end()) - return NULL; - return &it->second; -} - -int GetHeight() -{ - LOCK(cs_main); - return chainActive.Height(); -} - -void UpdatePreferredDownload(CNode* node, CNodeState* state) -{ - nPreferredDownload -= state->fPreferredDownload; - - // Whether this node should be marked as a preferred download node. - state->fPreferredDownload = (!node->fInbound || node->fWhitelisted) && !node->fOneShot && !node->fClient; - - nPreferredDownload += state->fPreferredDownload; -} - -// Returns time at which to timeout block request (nTime in microseconds) -int64_t GetBlockTimeout(int64_t nTime, int nValidatedQueuedBefore, const Consensus::Params &consensusParams) -{ - return nTime + 500000 * consensusParams.nPowTargetSpacing * (4 + nValidatedQueuedBefore); -} - -void InitializeNode(NodeId nodeid, const CNode *pnode) { - LOCK(cs_main); - CNodeState &state = mapNodeState.insert(std::make_pair(nodeid, CNodeState())).first->second; - state.name = pnode->addrName; - state.address = pnode->addr; -} - -void FinalizeNode(NodeId nodeid) { - LOCK(cs_main); - CNodeState *state = State(nodeid); - - if (state->fSyncStarted) - nSyncStarted--; - - if (state->nMisbehavior == 0 && state->fCurrentlyConnected) { - AddressCurrentlyConnected(state->address); - } - - BOOST_FOREACH(const QueuedBlock& entry, state->vBlocksInFlight) - mapBlocksInFlight.erase(entry.hash); - EraseOrphansFor(nodeid); - nPreferredDownload -= state->fPreferredDownload; - - mapNodeState.erase(nodeid); -} -void LimitMempoolSize(CTxMemPool& pool, size_t limit, unsigned long age) -{ -/* int expired = pool.Expire(GetTime() - age); - if (expired != 0) - LogPrint("mempool", "Expired %i transactions from the memory pool\n", expired); + struct CBlockReject { + unsigned char chRejectCode; + string strRejectReason; + uint256 hashBlock; + }; - std::vector vNoSpendsRemaining; - pool.TrimToSize(limit, &vNoSpendsRemaining); - BOOST_FOREACH(const uint256& removed, vNoSpendsRemaining) - pcoinsTip->Uncache(removed);*/ -} - -// Requires cs_main. -// Returns a bool indicating whether we requested this block. -bool MarkBlockAsReceived(const uint256& hash) { - map::iterator> >::iterator itInFlight = mapBlocksInFlight.find(hash); - if (itInFlight != mapBlocksInFlight.end()) { - CNodeState *state = State(itInFlight->second.first); - nQueuedValidatedHeaders -= itInFlight->second.second->fValidatedHeaders; - state->nBlocksInFlightValidHeaders -= itInFlight->second.second->fValidatedHeaders; - state->vBlocksInFlight.erase(itInFlight->second.second); - state->nBlocksInFlight--; - state->nStallingSince = 0; - mapBlocksInFlight.erase(itInFlight); - return true; - } - return false; -} - -// Requires cs_main. -void MarkBlockAsInFlight(NodeId nodeid, const uint256& hash, const Consensus::Params& consensusParams, CBlockIndex *pindex = NULL) { - CNodeState *state = State(nodeid); - assert(state != NULL); - - // Make sure it's not listed somewhere already. - MarkBlockAsReceived(hash); - - int64_t nNow = GetTimeMicros(); - QueuedBlock newentry = {hash, pindex, nNow, pindex != NULL, GetBlockTimeout(nNow, nQueuedValidatedHeaders, consensusParams)}; - nQueuedValidatedHeaders += newentry.fValidatedHeaders; - list::iterator it = state->vBlocksInFlight.insert(state->vBlocksInFlight.end(), newentry); - state->nBlocksInFlight++; - state->nBlocksInFlightValidHeaders += newentry.fValidatedHeaders; - mapBlocksInFlight[hash] = std::make_pair(nodeid, it); -} - -/** Check whether the last unknown block a peer advertized is not yet known. */ -void ProcessBlockAvailability(NodeId nodeid) { - CNodeState *state = State(nodeid); - assert(state != NULL); - - if (!state->hashLastUnknownBlock.IsNull()) { - BlockMap::iterator itOld = mapBlockIndex.find(state->hashLastUnknownBlock); - if (itOld != mapBlockIndex.end() && itOld->second->nChainWork > 0) - { - if (state->pindexBestKnownBlock == NULL || itOld->second->nChainWork >= state->pindexBestKnownBlock->nChainWork) - state->pindexBestKnownBlock = itOld->second; - state->hashLastUnknownBlock.SetNull(); + /** + * Maintain validation-specific state about nodes, protected by cs_main, instead + * by CNode's own locks. This simplifies asynchronous operation, where + * processing of incoming data is done after the ProcessMessage call returns, + * and we're no longer holding the node's locks. + */ + struct CNodeState { + //! The peer's address + CService address; + //! Whether we have a fully established connection. + bool fCurrentlyConnected; + //! Accumulated misbehaviour score for this peer. + int nMisbehavior; + //! Whether this peer should be disconnected and banned (unless whitelisted). + bool fShouldBan; + //! String name of this peer (debugging/logging purposes). + std::string name; + //! List of asynchronously-determined block rejections to notify this peer about. + std::vector rejects; + //! The best known block we know this peer has announced. + CBlockIndex *pindexBestKnownBlock; + //! The hash of the last unknown block this peer has announced. + uint256 hashLastUnknownBlock; + //! The last full block we both have. + CBlockIndex *pindexLastCommonBlock; + //! Whether we've started headers synchronization with this peer. + bool fSyncStarted; + //! Since when we're stalling block download progress (in microseconds), or 0. + int64_t nStallingSince; + list vBlocksInFlight; + int nBlocksInFlight; + int nBlocksInFlightValidHeaders; + //! Whether we consider this a preferred download peer. + bool fPreferredDownload; + + CNodeState() { + fCurrentlyConnected = false; + nMisbehavior = 0; + fShouldBan = false; + pindexBestKnownBlock = NULL; + hashLastUnknownBlock.SetNull(); + pindexLastCommonBlock = NULL; + fSyncStarted = false; + nStallingSince = 0; + nBlocksInFlight = 0; + nBlocksInFlightValidHeaders = 0; + fPreferredDownload = false; } + }; + + /** Map maintaining per-node state. Requires cs_main. */ + map mapNodeState; + + // Requires cs_main. + CNodeState *State(NodeId pnode) { + map::iterator it = mapNodeState.find(pnode); + if (it == mapNodeState.end()) + return NULL; + return &it->second; } -} - -/** Update tracking information about which blocks a peer is assumed to have. */ -void UpdateBlockAvailability(NodeId nodeid, const uint256 &hash) { - CNodeState *state = State(nodeid); - assert(state != NULL); - - /*ProcessBlockAvailability(nodeid); - - BlockMap::iterator it = mapBlockIndex.find(hash); - if (it != mapBlockIndex.end() && it->second->nChainWork > 0) { - // An actually better block was announced. - if (state->pindexBestKnownBlock == NULL || it->second->nChainWork >= state->pindexBestKnownBlock->nChainWork) - state->pindexBestKnownBlock = it->second; - } else*/ + + int GetHeight() { - // An unknown block was announced; just assume that the latest one is the best one. - state->hashLastUnknownBlock = hash; + LOCK(cs_main); + return chainActive.Height(); } -} - -/** Find the last common ancestor two blocks have. - * Both pa and pb must be non-NULL. */ -CBlockIndex* LastCommonAncestor(CBlockIndex* pa, CBlockIndex* pb) { - if (pa->nHeight > pb->nHeight) { - pa = pa->GetAncestor(pb->nHeight); - } else if (pb->nHeight > pa->nHeight) { - pb = pb->GetAncestor(pa->nHeight); + + void UpdatePreferredDownload(CNode* node, CNodeState* state) + { + nPreferredDownload -= state->fPreferredDownload; + + // Whether this node should be marked as a preferred download node. + state->fPreferredDownload = (!node->fInbound || node->fWhitelisted) && !node->fOneShot && !node->fClient; + + nPreferredDownload += state->fPreferredDownload; } - - while (pa != pb && pa && pb) { - pa = pa->pprev; - pb = pb->pprev; + + // Returns time at which to timeout block request (nTime in microseconds) + int64_t GetBlockTimeout(int64_t nTime, int nValidatedQueuedBefore, const Consensus::Params &consensusParams) + { + return nTime + 500000 * consensusParams.nPowTargetSpacing * (4 + nValidatedQueuedBefore); } - - // Eventually all chain branches meet at the genesis block. - assert(pa == pb); - return pa; -} - -/** Update pindexLastCommonBlock and add not-in-flight missing successors to vBlocks, until it has - * at most count entries. */ -void FindNextBlocksToDownload(NodeId nodeid, unsigned int count, std::vector& vBlocks, NodeId& nodeStaller) { - if (count == 0) - return; - - vBlocks.reserve(vBlocks.size() + count); - CNodeState *state = State(nodeid); - assert(state != NULL); - - // Make sure pindexBestKnownBlock is up to date, we'll need it. - ProcessBlockAvailability(nodeid); - - if (state->pindexBestKnownBlock == NULL || state->pindexBestKnownBlock->nChainWork < chainActive.Tip()->nChainWork) { - // This peer has nothing interesting. - return; + + void InitializeNode(NodeId nodeid, const CNode *pnode) { + LOCK(cs_main); + CNodeState &state = mapNodeState.insert(std::make_pair(nodeid, CNodeState())).first->second; + state.name = pnode->addrName; + state.address = pnode->addr; } - - if (state->pindexLastCommonBlock == NULL) { - // Bootstrap quickly by guessing a parent of our best tip is the forking point. - // Guessing wrong in either direction is not a problem. - state->pindexLastCommonBlock = chainActive[std::min(state->pindexBestKnownBlock->nHeight, chainActive.Height())]; - } - - // If the peer reorganized, our previous pindexLastCommonBlock may not be an ancestor - // of its current tip anymore. Go back enough to fix that. - state->pindexLastCommonBlock = LastCommonAncestor(state->pindexLastCommonBlock, state->pindexBestKnownBlock); - if (state->pindexLastCommonBlock == state->pindexBestKnownBlock) - return; - - std::vector vToFetch; - CBlockIndex *pindexWalk = state->pindexLastCommonBlock; - // Never fetch further than the best block we know the peer has, or more than BLOCK_DOWNLOAD_WINDOW + 1 beyond the last - // linked block we have in common with this peer. The +1 is so we can detect stalling, namely if we would be able to - // download that next block if the window were 1 larger. - int nWindowEnd = state->pindexLastCommonBlock->nHeight + BLOCK_DOWNLOAD_WINDOW; - int nMaxHeight = std::min(state->pindexBestKnownBlock->nHeight, nWindowEnd + 1); - NodeId waitingfor = -1; - while (pindexWalk->nHeight < nMaxHeight) { - // Read up to 128 (or more, if more blocks than that are needed) successors of pindexWalk (towards - // pindexBestKnownBlock) into vToFetch. We fetch 128, because CBlockIndex::GetAncestor may be as expensive - // as iterating over ~100 CBlockIndex* entries anyway. - int nToFetch = std::min(nMaxHeight - pindexWalk->nHeight, std::max(count - vBlocks.size(), 128)); - vToFetch.resize(nToFetch); - pindexWalk = state->pindexBestKnownBlock->GetAncestor(pindexWalk->nHeight + nToFetch); - vToFetch[nToFetch - 1] = pindexWalk; - for (unsigned int i = nToFetch - 1; i > 0; i--) { - vToFetch[i - 1] = vToFetch[i]->pprev; + + void FinalizeNode(NodeId nodeid) { + LOCK(cs_main); + CNodeState *state = State(nodeid); + + if (state->fSyncStarted) + nSyncStarted--; + + if (state->nMisbehavior == 0 && state->fCurrentlyConnected) { + AddressCurrentlyConnected(state->address); } - - // Iterate over those blocks in vToFetch (in forward direction), adding the ones that - // are not yet downloaded and not in flight to vBlocks. In the meantime, update - // pindexLastCommonBlock as long as all ancestors are already downloaded, or if it's - // already part of our chain (and therefore don't need it even if pruned). - BOOST_FOREACH(CBlockIndex* pindex, vToFetch) { - if (!pindex->IsValid(BLOCK_VALID_TREE)) { - // We consider the chain that this peer is on invalid. - return; + + BOOST_FOREACH(const QueuedBlock& entry, state->vBlocksInFlight) + mapBlocksInFlight.erase(entry.hash); + EraseOrphansFor(nodeid); + nPreferredDownload -= state->fPreferredDownload; + + mapNodeState.erase(nodeid); + } + + void LimitMempoolSize(CTxMemPool& pool, size_t limit, unsigned long age) + { + /* int expired = pool.Expire(GetTime() - age); + if (expired != 0) + LogPrint("mempool", "Expired %i transactions from the memory pool\n", expired); + + std::vector vNoSpendsRemaining; + pool.TrimToSize(limit, &vNoSpendsRemaining); + BOOST_FOREACH(const uint256& removed, vNoSpendsRemaining) + pcoinsTip->Uncache(removed);*/ + } + + // Requires cs_main. + // Returns a bool indicating whether we requested this block. + bool MarkBlockAsReceived(const uint256& hash) { + map::iterator> >::iterator itInFlight = mapBlocksInFlight.find(hash); + if (itInFlight != mapBlocksInFlight.end()) { + CNodeState *state = State(itInFlight->second.first); + nQueuedValidatedHeaders -= itInFlight->second.second->fValidatedHeaders; + state->nBlocksInFlightValidHeaders -= itInFlight->second.second->fValidatedHeaders; + state->vBlocksInFlight.erase(itInFlight->second.second); + state->nBlocksInFlight--; + state->nStallingSince = 0; + mapBlocksInFlight.erase(itInFlight); + return true; + } + return false; + } + + // Requires cs_main. + void MarkBlockAsInFlight(NodeId nodeid, const uint256& hash, const Consensus::Params& consensusParams, CBlockIndex *pindex = NULL) { + CNodeState *state = State(nodeid); + assert(state != NULL); + + // Make sure it's not listed somewhere already. + MarkBlockAsReceived(hash); + + int64_t nNow = GetTimeMicros(); + QueuedBlock newentry = {hash, pindex, nNow, pindex != NULL, GetBlockTimeout(nNow, nQueuedValidatedHeaders, consensusParams)}; + nQueuedValidatedHeaders += newentry.fValidatedHeaders; + list::iterator it = state->vBlocksInFlight.insert(state->vBlocksInFlight.end(), newentry); + state->nBlocksInFlight++; + state->nBlocksInFlightValidHeaders += newentry.fValidatedHeaders; + mapBlocksInFlight[hash] = std::make_pair(nodeid, it); + } + + /** Check whether the last unknown block a peer advertized is not yet known. */ + void ProcessBlockAvailability(NodeId nodeid) { + CNodeState *state = State(nodeid); + assert(state != NULL); + + if (!state->hashLastUnknownBlock.IsNull()) { + BlockMap::iterator itOld = mapBlockIndex.find(state->hashLastUnknownBlock); + if (itOld != mapBlockIndex.end() && itOld->second->nChainWork > 0) + { + if (state->pindexBestKnownBlock == NULL || itOld->second->nChainWork >= state->pindexBestKnownBlock->nChainWork) + state->pindexBestKnownBlock = itOld->second; + state->hashLastUnknownBlock.SetNull(); } - if (pindex->nStatus & BLOCK_HAVE_DATA || chainActive.Contains(pindex)) { - if (pindex->nChainTx) - state->pindexLastCommonBlock = pindex; - } else if (mapBlocksInFlight.count(pindex->GetBlockHash()) == 0) { - // The block is not already downloaded, and not yet in flight. - if (pindex->nHeight > nWindowEnd) { - // We reached the end of the window. - if (vBlocks.size() == 0 && waitingfor != nodeid) { - // We aren't able to fetch anything, but we would be if the download window was one larger. - nodeStaller = waitingfor; + } + } + + /** Update tracking information about which blocks a peer is assumed to have. */ + void UpdateBlockAvailability(NodeId nodeid, const uint256 &hash) { + CNodeState *state = State(nodeid); + assert(state != NULL); + + /*ProcessBlockAvailability(nodeid); + + BlockMap::iterator it = mapBlockIndex.find(hash); + if (it != mapBlockIndex.end() && it->second->nChainWork > 0) { + // An actually better block was announced. + if (state->pindexBestKnownBlock == NULL || it->second->nChainWork >= state->pindexBestKnownBlock->nChainWork) + state->pindexBestKnownBlock = it->second; + } else*/ + { + // An unknown block was announced; just assume that the latest one is the best one. + state->hashLastUnknownBlock = hash; + } + } + + /** Find the last common ancestor two blocks have. + * Both pa and pb must be non-NULL. */ + CBlockIndex* LastCommonAncestor(CBlockIndex* pa, CBlockIndex* pb) { + if (pa->nHeight > pb->nHeight) { + pa = pa->GetAncestor(pb->nHeight); + } else if (pb->nHeight > pa->nHeight) { + pb = pb->GetAncestor(pa->nHeight); + } + + while (pa != pb && pa && pb) { + pa = pa->pprev; + pb = pb->pprev; + } + + // Eventually all chain branches meet at the genesis block. + assert(pa == pb); + return pa; + } + + /** Update pindexLastCommonBlock and add not-in-flight missing successors to vBlocks, until it has + * at most count entries. */ + void FindNextBlocksToDownload(NodeId nodeid, unsigned int count, std::vector& vBlocks, NodeId& nodeStaller) { + if (count == 0) + return; + + vBlocks.reserve(vBlocks.size() + count); + CNodeState *state = State(nodeid); + assert(state != NULL); + + // Make sure pindexBestKnownBlock is up to date, we'll need it. + ProcessBlockAvailability(nodeid); + + if (state->pindexBestKnownBlock == NULL || state->pindexBestKnownBlock->nChainWork < chainActive.Tip()->nChainWork) { + // This peer has nothing interesting. + return; + } + + if (state->pindexLastCommonBlock == NULL) { + // Bootstrap quickly by guessing a parent of our best tip is the forking point. + // Guessing wrong in either direction is not a problem. + state->pindexLastCommonBlock = chainActive[std::min(state->pindexBestKnownBlock->nHeight, chainActive.Height())]; + } + + // If the peer reorganized, our previous pindexLastCommonBlock may not be an ancestor + // of its current tip anymore. Go back enough to fix that. + state->pindexLastCommonBlock = LastCommonAncestor(state->pindexLastCommonBlock, state->pindexBestKnownBlock); + if (state->pindexLastCommonBlock == state->pindexBestKnownBlock) + return; + + std::vector vToFetch; + CBlockIndex *pindexWalk = state->pindexLastCommonBlock; + // Never fetch further than the best block we know the peer has, or more than BLOCK_DOWNLOAD_WINDOW + 1 beyond the last + // linked block we have in common with this peer. The +1 is so we can detect stalling, namely if we would be able to + // download that next block if the window were 1 larger. + int nWindowEnd = state->pindexLastCommonBlock->nHeight + BLOCK_DOWNLOAD_WINDOW; + int nMaxHeight = std::min(state->pindexBestKnownBlock->nHeight, nWindowEnd + 1); + NodeId waitingfor = -1; + while (pindexWalk->nHeight < nMaxHeight) { + // Read up to 128 (or more, if more blocks than that are needed) successors of pindexWalk (towards + // pindexBestKnownBlock) into vToFetch. We fetch 128, because CBlockIndex::GetAncestor may be as expensive + // as iterating over ~100 CBlockIndex* entries anyway. + int nToFetch = std::min(nMaxHeight - pindexWalk->nHeight, std::max(count - vBlocks.size(), 128)); + vToFetch.resize(nToFetch); + pindexWalk = state->pindexBestKnownBlock->GetAncestor(pindexWalk->nHeight + nToFetch); + vToFetch[nToFetch - 1] = pindexWalk; + for (unsigned int i = nToFetch - 1; i > 0; i--) { + vToFetch[i - 1] = vToFetch[i]->pprev; + } + + // Iterate over those blocks in vToFetch (in forward direction), adding the ones that + // are not yet downloaded and not in flight to vBlocks. In the meantime, update + // pindexLastCommonBlock as long as all ancestors are already downloaded, or if it's + // already part of our chain (and therefore don't need it even if pruned). + BOOST_FOREACH(CBlockIndex* pindex, vToFetch) { + if (!pindex->IsValid(BLOCK_VALID_TREE)) { + // We consider the chain that this peer is on invalid. + return; + } + if (pindex->nStatus & BLOCK_HAVE_DATA || chainActive.Contains(pindex)) { + if (pindex->nChainTx) + state->pindexLastCommonBlock = pindex; + } else if (mapBlocksInFlight.count(pindex->GetBlockHash()) == 0) { + // The block is not already downloaded, and not yet in flight. + if (pindex->nHeight > nWindowEnd) { + // We reached the end of the window. + if (vBlocks.size() == 0 && waitingfor != nodeid) { + // We aren't able to fetch anything, but we would be if the download window was one larger. + nodeStaller = waitingfor; + } + return; } - return; + vBlocks.push_back(pindex); + if (vBlocks.size() == count) { + return; + } + } else if (waitingfor == -1) { + // This is the first already-in-flight block. + waitingfor = mapBlocksInFlight[pindex->GetBlockHash()].first; } - vBlocks.push_back(pindex); - if (vBlocks.size() == count) { - return; - } - } else if (waitingfor == -1) { - // This is the first already-in-flight block. - waitingfor = mapBlocksInFlight[pindex->GetBlockHash()].first; } } } -} - + } // anon namespace bool GetNodeStateStats(NodeId nodeid, CNodeStateStats &stats) { @@ -589,7 +590,7 @@ bool AddOrphanTx(const CTransaction& tx, NodeId peer) EXCLUSIVE_LOCKS_REQUIRED(c uint256 hash = tx.GetHash(); if (mapOrphanTransactions.count(hash)) return false; - + // Ignore big transactions, to avoid a // send-big-orphans memory exhaustion attack. If a peer has a legitimate // large transaction with a missing parent then we assume @@ -603,12 +604,12 @@ bool AddOrphanTx(const CTransaction& tx, NodeId peer) EXCLUSIVE_LOCKS_REQUIRED(c LogPrint("mempool", "ignoring large orphan tx (size: %u, hash: %s)\n", sz, hash.ToString()); return false; } - + mapOrphanTransactions[hash].tx = tx; mapOrphanTransactions[hash].fromPeer = peer; BOOST_FOREACH(const CTxIn& txin, tx.vin) - mapOrphanTransactionsByPrev[txin.prevout.hash].insert(hash); - + mapOrphanTransactionsByPrev[txin.prevout.hash].insert(hash); + LogPrint("mempool", "stored orphan tx %s (mapsz %u prevsz %u)\n", hash.ToString(), mapOrphanTransactions.size(), mapOrphanTransactionsByPrev.size()); return true; @@ -658,8 +659,8 @@ unsigned int LimitOrphanTxSize(unsigned int nMaxOrphans) EXCLUSIVE_LOCKS_REQUIRE map::iterator it = mapOrphanTransactions.lower_bound(randomhash); if (it == mapOrphanTransactions.end()) it = mapOrphanTransactions.begin(); - EraseOrphanTx(it->first); - ++nEvicted; + EraseOrphanTx(it->first); + ++nEvicted; } return nEvicted; } @@ -668,7 +669,7 @@ unsigned int LimitOrphanTxSize(unsigned int nMaxOrphans) EXCLUSIVE_LOCKS_REQUIRE bool IsStandardTx(const CTransaction& tx, string& reason, const int nHeight) { bool isOverwinter = NetworkUpgradeActive(nHeight, Params().GetConsensus(), Consensus::UPGRADE_OVERWINTER); - + if (isOverwinter) { // Overwinter standard rules apply if (tx.nVersion > CTransaction::OVERWINTER_MAX_CURRENT_VERSION || tx.nVersion < CTransaction::OVERWINTER_MIN_CURRENT_VERSION) { @@ -682,7 +683,7 @@ bool IsStandardTx(const CTransaction& tx, string& reason, const int nHeight) return false; } } - + BOOST_FOREACH(const CTxIn& txin, tx.vin) { // Biggest 'standard' txin is a 15-of-15 P2SH multisig with compressed @@ -701,7 +702,7 @@ bool IsStandardTx(const CTransaction& tx, string& reason, const int nHeight) return false; } } - + unsigned int v=0,nDataOut = 0; txnouttype whichType; BOOST_FOREACH(const CTxOut& txout, tx.vout) @@ -727,13 +728,13 @@ bool IsStandardTx(const CTransaction& tx, string& reason, const int nHeight) } v++; } - + // only one OP_RETURN txout is permitted if (nDataOut > 1) { reason = "multi-op-return"; return false; } - + return true; } @@ -770,7 +771,7 @@ bool IsExpiredTx(const CTransaction &tx, int nBlockHeight) bool CheckFinalTx(const CTransaction &tx, int flags) { AssertLockHeld(cs_main); - + // By convention a negative value for flags indicates that the // current network-enforced consensus rules should be used. In // a future soft-fork scenario that would mean checking which @@ -778,7 +779,7 @@ bool CheckFinalTx(const CTransaction &tx, int flags) // appropriate flags. At the present time no soft-forks are // scheduled, so no flags are set. flags = std::max(flags, 0); - + // CheckFinalTx() uses chainActive.Height()+1 to evaluate // nLockTime because when IsFinalTx() is called within // CBlock::AcceptBlock(), the height of the block *being* @@ -786,15 +787,15 @@ bool CheckFinalTx(const CTransaction &tx, int flags) // transaction can be part of the *next* block, we need to call // IsFinalTx() with one more than chainActive.Height(). const int nBlockHeight = chainActive.Height() + 1; - + // Timestamps on the other hand don't get any special treatment, // because we can't know what timestamp the next block will have, // and there aren't timestamp applications where it matters. // However this changes once median past time-locks are enforced: const int64_t nBlockTime = (flags & LOCKTIME_MEDIAN_TIME_PAST) - ? chainActive.Tip()->GetMedianTimePast() - : GetAdjustedTime(); - + ? chainActive.Tip()->GetMedianTimePast() + : GetAdjustedTime(); + return IsFinalTx(tx, nBlockHeight, nBlockTime); } @@ -811,11 +812,11 @@ bool AreInputsStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs, { if (tx.IsCoinBase()) return true; // Coinbases don't use vin normally - + for (unsigned int i = 0; i < tx.vin.size(); i++) { const CTxOut& prev = mapInputs.GetOutputFor(tx.vin[i]); - + vector > vSolutions; txnouttype whichType; // get the scriptPubKey corresponding to this input: @@ -825,7 +826,7 @@ bool AreInputsStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs, int nArgsExpected = ScriptSigArgsExpected(whichType, vSolutions); if (nArgsExpected < 0) return false; - + // Transactions with extra stuff in their scriptSigs are // non-standard. Note that this EvalScript() call will // be quick, because if there are any operations @@ -835,7 +836,7 @@ bool AreInputsStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs, vector > stack; if (!EvalScript(stack, tx.vin[i].scriptSig, SCRIPT_VERIFY_NONE, BaseSignatureChecker(), consensusBranchId)) return false; - + if (whichType == TX_SCRIPTHASH) { if (stack.empty()) @@ -858,11 +859,11 @@ bool AreInputsStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs, return (sigops <= MAX_P2SH_SIGOPS); } } - + if (stack.size() != (unsigned int)nArgsExpected) return false; } - + return true; } @@ -884,7 +885,7 @@ unsigned int GetP2SHSigOpCount(const CTransaction& tx, const CCoinsViewCache& in { if (tx.IsCoinBase()) return 0; - + unsigned int nSigOps = 0; for (unsigned int i = 0; i < tx.vin.size(); i++) { @@ -897,7 +898,7 @@ unsigned int GetP2SHSigOpCount(const CTransaction& tx, const CCoinsViewCache& in /** * Check a transaction contextually against a set of consensus rules valid at a given block height. - * + * * Notes: * 1. AcceptToMemoryPool calls CheckTransaction and this function. * 2. ProcessNewBlock calls AcceptBlock, which calls CheckBlock (which calls CheckTransaction) @@ -907,39 +908,39 @@ bool ContextualCheckTransaction(const CTransaction& tx, CValidationState &state, { bool isOverwinter = NetworkUpgradeActive(nHeight, Params().GetConsensus(), Consensus::UPGRADE_OVERWINTER); bool isSprout = !isOverwinter; - + // If Sprout rules apply, reject transactions which are intended for Overwinter and beyond if (isSprout && tx.fOverwintered) { return state.DoS(dosLevel, error("ContextualCheckTransaction(): overwinter is not active yet"), REJECT_INVALID, "tx-overwinter-not-active"); } - + // If Overwinter rules apply: if (isOverwinter) { // Reject transactions with valid version but missing overwinter flag if (tx.nVersion >= OVERWINTER_MIN_TX_VERSION && !tx.fOverwintered) { return state.DoS(dosLevel, error("ContextualCheckTransaction(): overwinter flag must be set"), - REJECT_INVALID, "tx-overwinter-flag-not-set"); + REJECT_INVALID, "tx-overwinter-flag-not-set"); } - + // Reject transactions with invalid version if (tx.fOverwintered && tx.nVersion > OVERWINTER_MAX_TX_VERSION ) { return state.DoS(100, error("CheckTransaction(): overwinter version too high"), - REJECT_INVALID, "bad-tx-overwinter-version-too-high"); + REJECT_INVALID, "bad-tx-overwinter-version-too-high"); } - + // Reject transactions intended for Sprout if (!tx.fOverwintered) { return state.DoS(dosLevel, error("ContextualCheckTransaction: overwinter is active"), - REJECT_INVALID, "tx-overwinter-active"); + REJECT_INVALID, "tx-overwinter-active"); } - + // Check that all transactions are unexpired if (IsExpiredTx(tx, nHeight)) { return state.DoS(dosLevel, error("ContextualCheckTransaction(): transaction is expired"), REJECT_INVALID, "tx-overwinter-expired"); } } - + if (!(tx.IsCoinBase() || tx.vjoinsplit.empty())) { auto consensusBranchId = CurrentEpochBranchId(nHeight, Params().GetConsensus()); // Empty output script. @@ -949,11 +950,11 @@ bool ContextualCheckTransaction(const CTransaction& tx, CValidationState &state, dataToBeSigned = SignatureHash(scriptCode, tx, NOT_AN_INPUT, SIGHASH_ALL, 0, consensusBranchId); } catch (std::logic_error ex) { return state.DoS(100, error("CheckTransaction(): error computing signature hash"), - REJECT_INVALID, "error-computing-signature-hash"); + REJECT_INVALID, "error-computing-signature-hash"); } - + BOOST_STATIC_ASSERT(crypto_sign_PUBLICKEYBYTES == 32); - + // We rely on libsodium to check that the signature is canonical. // https://github.com/jedisct1/libsodium/commit/62911edb7ff2275cccd74bf1c8aefcc4d76924e0 if (crypto_sign_verify_detached(&tx.joinSplitSig[0], @@ -961,7 +962,7 @@ bool ContextualCheckTransaction(const CTransaction& tx, CValidationState &state, tx.joinSplitPubKey.begin() ) != 0) { return state.DoS(100, error("CheckTransaction(): invalid joinsplit signature"), - REJECT_INVALID, "bad-txns-invalid-joinsplit-signature"); + REJECT_INVALID, "bad-txns-invalid-joinsplit-signature"); } } return true; @@ -987,11 +988,11 @@ bool CheckTransaction(const CTransaction& tx, CValidationState &state, } } } - // Don't count coinbase transactions because mining skews the count + // Don't count coinbase transactions because mining skews the count if (!tx.IsCoinBase()) { transactionsValidated.increment(); } - + if (!CheckTransactionWithoutProofVerification(tx, state)) { return false; } else { @@ -999,7 +1000,7 @@ bool CheckTransaction(const CTransaction& tx, CValidationState &state, BOOST_FOREACH(const JSDescription &joinsplit, tx.vjoinsplit) { if (!joinsplit.Verify(*pzcashParams, verifier, tx.joinSplitPubKey)) { return state.DoS(100, error("CheckTransaction(): joinsplit does not verify"), - REJECT_INVALID, "bad-txns-joinsplit-verification-failed"); + REJECT_INVALID, "bad-txns-joinsplit-verification-failed"); } } return true; @@ -1009,7 +1010,7 @@ bool CheckTransaction(const CTransaction& tx, CValidationState &state, bool CheckTransactionWithoutProofVerification(const CTransaction& tx, CValidationState &state) { // Basic checks that don't depend on any context - + /** * Previously: * 1. The consensus rule below was: @@ -1039,18 +1040,18 @@ bool CheckTransactionWithoutProofVerification(const CTransaction& tx, CValidatio else if (tx.fOverwintered) { if (tx.nVersion < OVERWINTER_MIN_TX_VERSION) { return state.DoS(100, error("CheckTransaction(): overwinter version too low"), - REJECT_INVALID, "bad-tx-overwinter-version-too-low"); + REJECT_INVALID, "bad-tx-overwinter-version-too-low"); } if (tx.nVersionGroupId != OVERWINTER_VERSION_GROUP_ID) { return state.DoS(100, error("CheckTransaction(): unknown tx version group id"), - REJECT_INVALID, "bad-tx-version-group-id"); + REJECT_INVALID, "bad-tx-version-group-id"); } if (tx.nExpiryHeight >= TX_EXPIRY_HEIGHT_THRESHOLD) { return state.DoS(100, error("CheckTransaction(): expiry height is too high"), - REJECT_INVALID, "bad-tx-expiry-height-too-high"); + REJECT_INVALID, "bad-tx-expiry-height-too-high"); } } - + // Transactions can contain empty `vin` and `vout` so long as // `vjoinsplit` is non-empty. if (tx.vin.empty() && tx.vjoinsplit.empty()) @@ -1059,13 +1060,13 @@ bool CheckTransactionWithoutProofVerification(const CTransaction& tx, CValidatio if (tx.vout.empty() && tx.vjoinsplit.empty()) return state.DoS(10, error("CheckTransaction(): vout empty"), REJECT_INVALID, "bad-txns-vout-empty"); - + // Size limits BOOST_STATIC_ASSERT(MAX_BLOCK_SIZE > MAX_TX_SIZE); // sanity if (::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION) > MAX_TX_SIZE) return state.DoS(100, error("CheckTransaction(): size limits failed"), REJECT_INVALID, "bad-txns-oversize"); - + // Check for negative or overflow output values CAmount nValueOut = 0; BOOST_FOREACH(const CTxOut& txout, tx.vout) @@ -1083,7 +1084,7 @@ bool CheckTransactionWithoutProofVerification(const CTransaction& tx, CValidatio return state.DoS(100, error("CheckTransaction(): txout total out of range"), REJECT_INVALID, "bad-txns-txouttotal-toolarge"); } - + // Ensure that joinsplit values are well-formed BOOST_FOREACH(const JSDescription& joinsplit, tx.vjoinsplit) { @@ -1091,34 +1092,34 @@ bool CheckTransactionWithoutProofVerification(const CTransaction& tx, CValidatio return state.DoS(100, error("CheckTransaction(): joinsplit.vpub_old negative"), REJECT_INVALID, "bad-txns-vpub_old-negative"); } - + if (joinsplit.vpub_new < 0) { return state.DoS(100, error("CheckTransaction(): joinsplit.vpub_new negative"), REJECT_INVALID, "bad-txns-vpub_new-negative"); } - + if (joinsplit.vpub_old > MAX_MONEY) { return state.DoS(100, error("CheckTransaction(): joinsplit.vpub_old too high"), REJECT_INVALID, "bad-txns-vpub_old-toolarge"); } - + if (joinsplit.vpub_new > MAX_MONEY) { return state.DoS(100, error("CheckTransaction(): joinsplit.vpub_new too high"), REJECT_INVALID, "bad-txns-vpub_new-toolarge"); } - + if (joinsplit.vpub_new != 0 && joinsplit.vpub_old != 0) { return state.DoS(100, error("CheckTransaction(): joinsplit.vpub_new and joinsplit.vpub_old both nonzero"), REJECT_INVALID, "bad-txns-vpubs-both-nonzero"); } - + nValueOut += joinsplit.vpub_old; if (!MoneyRange(nValueOut)) { return state.DoS(100, error("CheckTransaction(): txout total out of range"), REJECT_INVALID, "bad-txns-txouttotal-toolarge"); } } - + // Ensure input values do not exceed MAX_MONEY // We have not resolved the txin values at this stage, // but we do know what the joinsplits claim to add @@ -1128,15 +1129,15 @@ bool CheckTransactionWithoutProofVerification(const CTransaction& tx, CValidatio for (std::vector::const_iterator it(tx.vjoinsplit.begin()); it != tx.vjoinsplit.end(); ++it) { nValueIn += it->vpub_new; - + if (!MoneyRange(it->vpub_new) || !MoneyRange(nValueIn)) { return state.DoS(100, error("CheckTransaction(): txin total out of range"), REJECT_INVALID, "bad-txns-txintotal-toolarge"); } } } - - + + // Check for duplicate inputs set vInOutPoints; BOOST_FOREACH(const CTxIn& txin, tx.vin) @@ -1146,7 +1147,7 @@ bool CheckTransactionWithoutProofVerification(const CTransaction& tx, CValidatio REJECT_INVALID, "bad-txns-inputs-duplicate"); vInOutPoints.insert(txin.prevout); } - + // Check for duplicate joinsplit nullifiers in this transaction set vJoinSplitNullifiers; BOOST_FOREACH(const JSDescription& joinsplit, tx.vjoinsplit) @@ -1155,19 +1156,19 @@ bool CheckTransactionWithoutProofVerification(const CTransaction& tx, CValidatio { if (vJoinSplitNullifiers.count(nf)) return state.DoS(100, error("CheckTransaction(): duplicate nullifiers"), - REJECT_INVALID, "bad-joinsplits-nullifiers-duplicate"); - + REJECT_INVALID, "bad-joinsplits-nullifiers-duplicate"); + vJoinSplitNullifiers.insert(nf); } } - + if (tx.IsCoinBase()) { // There should be no joinsplits in a coinbase transaction if (tx.vjoinsplit.size() > 0) return state.DoS(100, error("CheckTransaction(): coinbase has joinsplits"), REJECT_INVALID, "bad-cb-has-joinsplits"); - + if (tx.vin[0].scriptSig.size() < 2 || tx.vin[0].scriptSig.size() > 100) return state.DoS(100, error("CheckTransaction(): coinbase script size"), REJECT_INVALID, "bad-cb-length"); @@ -1175,11 +1176,11 @@ bool CheckTransactionWithoutProofVerification(const CTransaction& tx, CValidatio else { BOOST_FOREACH(const CTxIn& txin, tx.vin) - if (txin.prevout.IsNull()) - return state.DoS(10, error("CheckTransaction(): prevout is null"), - REJECT_INVALID, "bad-txns-prevout-null"); + if (txin.prevout.IsNull()) + return state.DoS(10, error("CheckTransaction(): prevout is null"), + REJECT_INVALID, "bad-txns-prevout-null"); } - + return true; } @@ -1195,9 +1196,9 @@ CAmount GetMinRelayFee(const CTransaction& tx, unsigned int nBytes, bool fAllowF if (dPriorityDelta > 0 || nFeeDelta > 0) return 0; } - + CAmount nMinFee = ::minRelayTxFee.GetFee(nBytes); - + if (fAllowFree) { // There is a free transaction area in blocks created by most miners, @@ -1207,7 +1208,7 @@ CAmount GetMinRelayFee(const CTransaction& tx, unsigned int nBytes, bool fAllowF if (nBytes < (DEFAULT_BLOCK_PRIORITY_SIZE - 1000)) nMinFee = 0; } - + if (!MoneyRange(nMinFee)) nMinFee = MAX_MONEY; return nMinFee; @@ -1241,11 +1242,14 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa return error("AcceptToMemoryPool: komodo_validate_interest failed"); } if (!CheckTransaction(tx, state, verifier)) + { + return error("AcceptToMemoryPool: CheckTransaction failed"); - + } // DoS level set to 10 to be more forgiving. // Check transaction contextually against the set of consensus rules which apply in the next block to be mined. - if (!ContextualCheckTransaction(tx, state, nextBlockHeight, 10)) { + if (!ContextualCheckTransaction(tx, state, nextBlockHeight, 10)) + { return error("AcceptToMemoryPool: ContextualCheckTransaction failed"); } @@ -1305,7 +1309,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa } } } - + { CCoinsView dummy; CCoinsViewCache view(&dummy); @@ -1376,7 +1380,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa fprintf(stderr,"accept failure.4\n"); return state.DoS(0, error("AcceptToMemoryPool: too many sigops %s, %d > %d", hash.ToString(), nSigOps, MAX_STANDARD_TX_SIGOPS),REJECT_NONSTANDARD, "bad-txns-too-many-sigops"); } - + CAmount nValueOut = tx.GetValueOut(); CAmount nFees = nValueIn-nValueOut; double dPriority = view.GetPriority(tx, chainActive.Height()); @@ -1408,7 +1412,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa CAmount txMinFee = GetMinRelayFee(tx, nSize, true); if (fLimitFree && nFees < txMinFee) { - fprintf(stderr,"accept failure.5\n"); + //fprintf(stderr,"accept failure.5\n"); return state.DoS(0, error("AcceptToMemoryPool: not enough fees %s, %d < %d",hash.ToString(), nFees, txMinFee),REJECT_INSUFFICIENTFEE, "insufficient fee"); } } @@ -1490,14 +1494,14 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa bool GetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock, bool fAllowSlow) { CBlockIndex *pindexSlow = NULL; - + LOCK(cs_main); - + if (mempool.lookup(hash, txOut)) { return true; } - + if (fTxIndex) { CDiskTxPos postx; if (pblocktree->ReadTxIndex(hash, postx)) { @@ -1518,7 +1522,7 @@ bool GetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock return true; } } - + if (fAllowSlow) { // use coin database to locate block that contains transaction, and scan it int nHeight = -1; { @@ -1530,7 +1534,7 @@ bool GetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock if (nHeight > 0) pindexSlow = chainActive[nHeight]; } - + if (pindexSlow) { CBlock block; if (ReadBlockFromDisk(block, pindexSlow)) { @@ -1543,23 +1547,23 @@ bool GetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock } } } - + return false; } /*char *komodo_getspendscript(uint256 hash,int32_t n) -{ - CTransaction tx; uint256 hashBlock; - if ( !GetTransaction(hash,tx,hashBlock,true) ) - { - printf("null GetTransaction\n"); - return(0); - } - if ( n >= 0 && n < tx.vout.size() ) - return((char *)tx.vout[n].scriptPubKey.ToString().c_str()); - else printf("getspendscript illegal n.%d\n",n); - return(0); -}*/ + { + CTransaction tx; uint256 hashBlock; + if ( !GetTransaction(hash,tx,hashBlock,true) ) + { + printf("null GetTransaction\n"); + return(0); + } + if ( n >= 0 && n < tx.vout.size() ) + return((char *)tx.vout[n].scriptPubKey.ToString().c_str()); + else printf("getspendscript illegal n.%d\n",n); + return(0); + }*/ ////////////////////////////////////////////////////////////////////////////// @@ -1573,18 +1577,18 @@ bool WriteBlockToDisk(CBlock& block, CDiskBlockPos& pos, const CMessageHeader::M CAutoFile fileout(OpenBlockFile(pos), SER_DISK, CLIENT_VERSION); if (fileout.IsNull()) return error("WriteBlockToDisk: OpenBlockFile failed"); - + // Write index header unsigned int nSize = fileout.GetSerializeSize(block); fileout << FLATDATA(messageStart) << nSize; - + // Write block long fileOutPos = ftell(fileout.Get()); if (fileOutPos < 0) return error("WriteBlockToDisk: ftell failed"); pos.nPos = (unsigned int)fileOutPos; fileout << block; - + return true; } @@ -1592,7 +1596,7 @@ bool ReadBlockFromDisk(int32_t height,CBlock& block, const CDiskBlockPos& pos) { uint8_t pubkey33[33]; block.SetNull(); - + // Open history file to read CAutoFile filein(OpenBlockFile(pos, true), SER_DISK, CLIENT_VERSION); if (filein.IsNull()) @@ -1600,7 +1604,7 @@ bool ReadBlockFromDisk(int32_t height,CBlock& block, const CDiskBlockPos& pos) //fprintf(stderr,"readblockfromdisk err A\n"); return false;//error("ReadBlockFromDisk: OpenBlockFile failed for %s", pos.ToString()); } - + // Read block try { filein >> block; @@ -1614,7 +1618,7 @@ bool ReadBlockFromDisk(int32_t height,CBlock& block, const CDiskBlockPos& pos) if (!(CheckEquihashSolution(&block, Params()) && CheckProofOfWork(height,pubkey33,block.GetHash(), block.nBits, Params().GetConsensus()))) { int32_t i; for (i=0; i<33; i++) - printf("%02x",pubkey33[i]); + fprintf(stderr,"%02x",pubkey33[i]); fprintf(stderr," warning unexpected diff at ht.%d\n",height); return error("ReadBlockFromDisk: Errors in block header at %s", pos.ToString()); @@ -1630,7 +1634,7 @@ bool ReadBlockFromDisk(CBlock& block, const CBlockIndex* pindex) return false; if (block.GetHash() != pindex->GetBlockHash()) return error("ReadBlockFromDisk(CBlock&, CBlockIndex*): GetHash() doesn't match index for %s at %s", - pindex->ToString(), pindex->GetBlockPos().ToString()); + pindex->ToString(), pindex->GetBlockPos().ToString()); return true; } @@ -1695,27 +1699,27 @@ CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams) return(nSubsidy); } else return(0); } -/* - // Mining slow start - // The subsidy is ramped up linearly, skipping the middle payout of - // MAX_SUBSIDY/2 to keep the monetary curve consistent with no slow start. - if (nHeight < consensusParams.nSubsidySlowStartInterval / 2) { - nSubsidy /= consensusParams.nSubsidySlowStartInterval; - nSubsidy *= nHeight; - return nSubsidy; - } else if (nHeight < consensusParams.nSubsidySlowStartInterval) { - nSubsidy /= consensusParams.nSubsidySlowStartInterval; - nSubsidy *= (nHeight+1); - return nSubsidy; - } - - assert(nHeight > consensusParams.SubsidySlowStartShift()); - int halvings = (nHeight - consensusParams.SubsidySlowStartShift()) / consensusParams.nSubsidyHalvingInterval;*/ + /* + // Mining slow start + // The subsidy is ramped up linearly, skipping the middle payout of + // MAX_SUBSIDY/2 to keep the monetary curve consistent with no slow start. + if (nHeight < consensusParams.nSubsidySlowStartInterval / 2) { + nSubsidy /= consensusParams.nSubsidySlowStartInterval; + nSubsidy *= nHeight; + return nSubsidy; + } else if (nHeight < consensusParams.nSubsidySlowStartInterval) { + nSubsidy /= consensusParams.nSubsidySlowStartInterval; + nSubsidy *= (nHeight+1); + return nSubsidy; + } + + assert(nHeight > consensusParams.SubsidySlowStartShift()); + int halvings = (nHeight - consensusParams.SubsidySlowStartShift()) / consensusParams.nSubsidyHalvingInterval;*/ // Force block reward to zero when right shift is undefined. //int halvings = nHeight / consensusParams.nSubsidyHalvingInterval; //if (halvings >= 64) // return 0; - + // Subsidy is cut in half every 840,000 blocks which will occur approximately every 4 years. //nSubsidy >>= halvings; return nSubsidy; @@ -1747,8 +1751,8 @@ bool IsInitialBlockDownload() else if ( pindexBestHeader != 0 && pindexBestHeader->nHeight > ptr->nHeight ) ptr = pindexBestHeader; //if ( ASSETCHAINS_SYMBOL[0] == 0 ) - state = ((chainActive.Height() < ptr->nHeight - 24*60) || - ptr->GetBlockTime() < (GetTime() - chainParams.MaxTipAge())); + state = ((chainActive.Height() < ptr->nHeight - 24*60) || + ptr->GetBlockTime() < (GetTime() - chainParams.MaxTipAge())); //else state = (chainActive.Height() < ptr->nHeight - 24*60); //fprintf(stderr,"state.%d ht.%d vs %d, t.%u %u\n",state,(int32_t)chainActive.Height(),(uint32_t)ptr->nHeight,(int32_t)ptr->GetBlockTime(),(uint32_t)(GetTime() - chainParams.MaxTipAge())); if (!state) @@ -1769,25 +1773,25 @@ void CheckForkWarningConditions() // (we assume we don't get stuck on a fork before the last checkpoint) if (IsInitialBlockDownload()) return; - + // If our best fork is no longer within 288 blocks (+/- 12 hours if no one mines it) // of our head, drop it if (pindexBestForkTip && chainActive.Height() - pindexBestForkTip->nHeight >= 288) pindexBestForkTip = NULL; - + if (pindexBestForkTip || (pindexBestInvalid && pindexBestInvalid->nChainWork > chainActive.Tip()->nChainWork + (GetBlockProof(*chainActive.Tip()) * 6))) { if (!fLargeWorkForkFound && pindexBestForkBase) { std::string warning = std::string("'Warning: Large-work fork detected, forking after block ") + - pindexBestForkBase->phashBlock->ToString() + std::string("'"); + pindexBestForkBase->phashBlock->ToString() + std::string("'"); CAlert::Notify(warning, true); } if (pindexBestForkTip && pindexBestForkBase) { LogPrintf("%s: Warning: Large valid fork found\n forking the chain at height %d (%s)\n lasting to height %d (%s).\nChain state database corruption likely.\n", __func__, - pindexBestForkBase->nHeight, pindexBestForkBase->phashBlock->ToString(), - pindexBestForkTip->nHeight, pindexBestForkTip->phashBlock->ToString()); + pindexBestForkBase->nHeight, pindexBestForkBase->phashBlock->ToString(), + pindexBestForkTip->nHeight, pindexBestForkTip->phashBlock->ToString()); fLargeWorkForkFound = true; } else @@ -1819,7 +1823,7 @@ void CheckForkWarningConditionsOnNewFork(CBlockIndex* pindexNewForkTip) break; pfork = pfork->pprev; } - + // We define a condition where we should warn the user about as a fork of at least 7 blocks // with a tip within 72 blocks (+/- 3 hours if no one mines it) of ours // We use 7 blocks rather arbitrarily as it represents just under 10% of sustained network @@ -1828,13 +1832,13 @@ void CheckForkWarningConditionsOnNewFork(CBlockIndex* pindexNewForkTip) // We define it this way because it allows us to only store the highest fork tip (+ base) which meets // the 7-block condition and from this always have the most-likely-to-cause-warning fork if (pfork && (!pindexBestForkTip || (pindexBestForkTip && pindexNewForkTip->nHeight > pindexBestForkTip->nHeight)) && - pindexNewForkTip->nChainWork - pfork->nChainWork > (GetBlockProof(*pfork) * 7) && - chainActive.Height() - pindexNewForkTip->nHeight < 72) + pindexNewForkTip->nChainWork - pfork->nChainWork > (GetBlockProof(*pfork) * 7) && + chainActive.Height() - pindexNewForkTip->nHeight < 72) { pindexBestForkTip = pindexNewForkTip; pindexBestForkBase = pfork; } - + CheckForkWarningConditions(); } @@ -1843,13 +1847,13 @@ void Misbehaving(NodeId pnode, int howmuch) { if (howmuch == 0) return; - + CNodeState *state = State(pnode); if (state == NULL) return; - + state->nMisbehavior += howmuch; - int banscore = GetArg("-banscore", 100); + int banscore = GetArg("-banscore", 101); if (state->nMisbehavior >= banscore && state->nMisbehavior - howmuch < banscore) { LogPrintf("%s: %s (%d -> %d) BAN THRESHOLD EXCEEDED\n", __func__, state->name, state->nMisbehavior-howmuch, state->nMisbehavior); @@ -1862,16 +1866,16 @@ void static InvalidChainFound(CBlockIndex* pindexNew) { if (!pindexBestInvalid || pindexNew->nChainWork > pindexBestInvalid->nChainWork) pindexBestInvalid = pindexNew; - + LogPrintf("%s: invalid block=%s height=%d log2_work=%.8g date=%s\n", __func__, - pindexNew->GetBlockHash().ToString(), pindexNew->nHeight, - log(pindexNew->nChainWork.getdouble())/log(2.0), DateTimeStrFormat("%Y-%m-%d %H:%M:%S", - pindexNew->GetBlockTime())); + pindexNew->GetBlockHash().ToString(), pindexNew->nHeight, + log(pindexNew->nChainWork.getdouble())/log(2.0), DateTimeStrFormat("%Y-%m-%d %H:%M:%S", + pindexNew->GetBlockTime())); CBlockIndex *tip = chainActive.Tip(); assert (tip); LogPrintf("%s: current best=%s height=%d log2_work=%.8g date=%s\n", __func__, - tip->GetBlockHash().ToString(), chainActive.Height(), log(tip->nChainWork.getdouble())/log(2.0), - DateTimeStrFormat("%Y-%m-%d %H:%M:%S", tip->GetBlockTime())); + tip->GetBlockHash().ToString(), chainActive.Height(), log(tip->nChainWork.getdouble())/log(2.0), + DateTimeStrFormat("%Y-%m-%d %H:%M:%S", tip->GetBlockTime())); CheckForkWarningConditions(); } @@ -1902,7 +1906,7 @@ void UpdateCoins(const CTransaction& tx, CCoinsViewCache& inputs, CTxUndo &txund BOOST_FOREACH(const CTxIn &txin, tx.vin) { CCoinsModifier coins = inputs.ModifyCoins(txin.prevout.hash); unsigned nPos = txin.prevout.n; - + if (nPos >= coins->vout.size() || coins->vout[nPos].IsNull()) assert(false); // mark an outpoint spent, and construct undo information @@ -1946,17 +1950,17 @@ int GetSpendHeight(const CCoinsViewCache& inputs) } namespace Consensus { -bool CheckTxInputs(const CTransaction& tx, CValidationState& state, const CCoinsViewCache& inputs, int nSpendHeight, const Consensus::Params& consensusParams) -{ + bool CheckTxInputs(const CTransaction& tx, CValidationState& state, const CCoinsViewCache& inputs, int nSpendHeight, const Consensus::Params& consensusParams) + { // This doesn't trigger the DoS code on purpose; if it did, it would make it easier // for an attacker to attempt to split the network. if (!inputs.HaveInputs(tx)) return state.Invalid(error("CheckInputs(): %s inputs unavailable", tx.GetHash().ToString())); - + // are the JoinSplit's requirements met? if (!inputs.HaveJoinSplitRequirements(tx)) return state.Invalid(error("CheckInputs(): %s JoinSplit requirements not met", tx.GetHash().ToString())); - + CAmount nValueIn = 0; CAmount nFees = 0; for (unsigned int i = 0; i < tx.vin.size(); i++) @@ -1964,26 +1968,26 @@ bool CheckTxInputs(const CTransaction& tx, CValidationState& state, const CCoins const COutPoint &prevout = tx.vin[i].prevout; const CCoins *coins = inputs.AccessCoins(prevout.hash); assert(coins); - + if (coins->IsCoinBase()) { // Ensure that coinbases are matured if (nSpendHeight - coins->nHeight < COINBASE_MATURITY) { return state.Invalid( - error("CheckInputs(): tried to spend coinbase at depth %d", nSpendHeight - coins->nHeight), - REJECT_INVALID, "bad-txns-premature-spend-of-coinbase"); + error("CheckInputs(): tried to spend coinbase at depth %d", nSpendHeight - coins->nHeight), + REJECT_INVALID, "bad-txns-premature-spend-of-coinbase"); } - + // Ensure that coinbases cannot be spent to transparent outputs // Disabled on regtest if (fCoinbaseEnforcedProtectionEnabled && consensusParams.fCoinbaseMustBeProtected && !tx.vout.empty()) { return state.Invalid( - error("CheckInputs(): tried to spend coinbase with transparent outputs"), - REJECT_INVALID, "bad-txns-coinbase-spend-has-transparent-outputs"); + error("CheckInputs(): tried to spend coinbase with transparent outputs"), + REJECT_INVALID, "bad-txns-coinbase-spend-has-transparent-outputs"); } } - + // Check for negative or overflow input values nValueIn += coins->vout[prevout.n].nValue; #ifdef KOMODO_ENABLE_INTEREST @@ -1994,7 +1998,7 @@ bool CheckTxInputs(const CTransaction& tx, CValidationState& state, const CCoins int64_t interest; int32_t txheight; uint32_t locktime; if ( (interest= komodo_accrued_interest(&txheight,&locktime,prevout.hash,prevout.n,0,coins->vout[prevout.n].nValue,(int32_t)nSpendHeight-1)) != 0 ) { -//fprintf(stderr,"checkResult %.8f += val %.8f interest %.8f ht.%d lock.%u tip.%u\n",(double)nValueIn/COIN,(double)coins->vout[prevout.n].nValue/COIN,(double)interest/COIN,txheight,locktime,chainActive.Tip()->nTime); + //fprintf(stderr,"checkResult %.8f += val %.8f interest %.8f ht.%d lock.%u tip.%u\n",(double)nValueIn/COIN,(double)coins->vout[prevout.n].nValue/COIN,(double)interest/COIN,txheight,locktime,chainActive.Tip()->nTime); nValueIn += interest; } } @@ -2003,14 +2007,14 @@ bool CheckTxInputs(const CTransaction& tx, CValidationState& state, const CCoins if (!MoneyRange(coins->vout[prevout.n].nValue) || !MoneyRange(nValueIn)) return state.DoS(100, error("CheckInputs(): txin values out of range"), REJECT_INVALID, "bad-txns-inputvalues-outofrange"); - + } - + nValueIn += tx.GetJoinSplitValueIn(); if (!MoneyRange(nValueIn)) return state.DoS(100, error("CheckInputs(): vpub_old values out of range"), REJECT_INVALID, "bad-txns-inputvalues-outofrange"); - + if (nValueIn < tx.GetValueOut()) { fprintf(stderr,"spentheight.%d valuein %s vs %s error\n",nSpendHeight,FormatMoney(nValueIn).c_str(), FormatMoney(tx.GetValueOut()).c_str()); @@ -2026,35 +2030,35 @@ bool CheckTxInputs(const CTransaction& tx, CValidationState& state, const CCoins if (!MoneyRange(nFees)) return state.DoS(100, error("CheckInputs(): nFees out of range"), REJECT_INVALID, "bad-txns-fee-outofrange"); - return true; -} + return true; + } }// namespace Consensus bool ContextualCheckInputs( - const CTransaction& tx, - CValidationState &state, - const CCoinsViewCache &inputs, - bool fScriptChecks, - unsigned int flags, - bool cacheStore, - PrecomputedTransactionData& txdata, - const Consensus::Params& consensusParams, - uint32_t consensusBranchId, - std::vector *pvChecks) + const CTransaction& tx, + CValidationState &state, + const CCoinsViewCache &inputs, + bool fScriptChecks, + unsigned int flags, + bool cacheStore, + PrecomputedTransactionData& txdata, + const Consensus::Params& consensusParams, + uint32_t consensusBranchId, + std::vector *pvChecks) { if (!tx.IsCoinBase()) { if (!Consensus::CheckTxInputs(tx, state, inputs, GetSpendHeight(inputs), consensusParams)) { return false; } - + if (pvChecks) pvChecks->reserve(tx.vin.size()); - + // The first loop above does all the inexpensive checks. // Only if ALL inputs pass do we perform expensive ECDSA signature checks. // Helps prevent CPU exhaustion attacks. - + // Skip ECDSA signature verification when connecting blocks // before the last block chain checkpoint. This is safe because block merkle hashes are // still computed and checked, and any change will be caught at the next checkpoint. @@ -2063,7 +2067,7 @@ bool ContextualCheckInputs( const COutPoint &prevout = tx.vin[i].prevout; const CCoins* coins = inputs.AccessCoins(prevout.hash); assert(coins); - + // Verify signature CScriptCheck check(*coins, tx, i, flags, cacheStore, consensusBranchId, &txdata); if (pvChecks) { @@ -2078,7 +2082,7 @@ bool ContextualCheckInputs( // avoid splitting the network between upgraded and // non-upgraded nodes. CScriptCheck check2(*coins, tx, i, - flags & ~STANDARD_NOT_MANDATORY_VERIFY_FLAGS, cacheStore, consensusBranchId, &txdata); + flags & ~STANDARD_NOT_MANDATORY_VERIFY_FLAGS, cacheStore, consensusBranchId, &txdata); if (check2()) return state.Invalid(false, REJECT_NONSTANDARD, strprintf("non-mandatory-script-verify-flag (%s)", ScriptErrorString(check.GetScriptError()))); } @@ -2094,123 +2098,123 @@ bool ContextualCheckInputs( } } } - + return true; } /*bool ContextualCheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsViewCache &inputs, bool fScriptChecks, unsigned int flags, bool cacheStore, const Consensus::Params& consensusParams, std::vector *pvChecks) -{ - if (!NonContextualCheckInputs(tx, state, inputs, fScriptChecks, flags, cacheStore, consensusParams, pvChecks)) { - fprintf(stderr,"ContextualCheckInputs failure.0\n"); - return false; - } - - if (!tx.IsCoinBase()) - { - // While checking, GetBestBlock() refers to the parent block. - // This is also true for mempool checks. - CBlockIndex *pindexPrev = mapBlockIndex.find(inputs.GetBestBlock())->second; - int nSpendHeight = pindexPrev->nHeight + 1; - for (unsigned int i = 0; i < tx.vin.size(); i++) - { - const COutPoint &prevout = tx.vin[i].prevout; - const CCoins *coins = inputs.AccessCoins(prevout.hash); - // Assertion is okay because NonContextualCheckInputs ensures the inputs - // are available. - assert(coins); - - // If prev is coinbase, check that it's matured - if (coins->IsCoinBase()) { - if ( ASSETCHAINS_SYMBOL[0] == 0 ) - COINBASE_MATURITY = _COINBASE_MATURITY; - if (nSpendHeight - coins->nHeight < COINBASE_MATURITY) { - fprintf(stderr,"ContextualCheckInputs failure.1 i.%d of %d\n",i,(int32_t)tx.vin.size()); - - return state.Invalid( - error("CheckInputs(): tried to spend coinbase at depth %d", nSpendHeight - coins->nHeight),REJECT_INVALID, "bad-txns-premature-spend-of-coinbase"); - } - } - } - } - - return true; -}*/ + { + if (!NonContextualCheckInputs(tx, state, inputs, fScriptChecks, flags, cacheStore, consensusParams, pvChecks)) { + fprintf(stderr,"ContextualCheckInputs failure.0\n"); + return false; + } + + if (!tx.IsCoinBase()) + { + // While checking, GetBestBlock() refers to the parent block. + // This is also true for mempool checks. + CBlockIndex *pindexPrev = mapBlockIndex.find(inputs.GetBestBlock())->second; + int nSpendHeight = pindexPrev->nHeight + 1; + for (unsigned int i = 0; i < tx.vin.size(); i++) + { + const COutPoint &prevout = tx.vin[i].prevout; + const CCoins *coins = inputs.AccessCoins(prevout.hash); + // Assertion is okay because NonContextualCheckInputs ensures the inputs + // are available. + assert(coins); + + // If prev is coinbase, check that it's matured + if (coins->IsCoinBase()) { + if ( ASSETCHAINS_SYMBOL[0] == 0 ) + COINBASE_MATURITY = _COINBASE_MATURITY; + if (nSpendHeight - coins->nHeight < COINBASE_MATURITY) { + fprintf(stderr,"ContextualCheckInputs failure.1 i.%d of %d\n",i,(int32_t)tx.vin.size()); + + return state.Invalid( + error("CheckInputs(): tried to spend coinbase at depth %d", nSpendHeight - coins->nHeight),REJECT_INVALID, "bad-txns-premature-spend-of-coinbase"); + } + } + } + } + + return true; + }*/ namespace { - -bool UndoWriteToDisk(const CBlockUndo& blockundo, CDiskBlockPos& pos, const uint256& hashBlock, const CMessageHeader::MessageStartChars& messageStart) -{ - // Open history file to append - CAutoFile fileout(OpenUndoFile(pos), SER_DISK, CLIENT_VERSION); - if (fileout.IsNull()) - return error("%s: OpenUndoFile failed", __func__); - - // Write index header - unsigned int nSize = fileout.GetSerializeSize(blockundo); - fileout << FLATDATA(messageStart) << nSize; - - // Write undo data - long fileOutPos = ftell(fileout.Get()); - if (fileOutPos < 0) - return error("%s: ftell failed", __func__); - pos.nPos = (unsigned int)fileOutPos; - fileout << blockundo; - - // calculate & write checksum - CHashWriter hasher(SER_GETHASH, PROTOCOL_VERSION); - hasher << hashBlock; - hasher << blockundo; - fileout << hasher.GetHash(); - - return true; -} - -bool UndoReadFromDisk(CBlockUndo& blockundo, const CDiskBlockPos& pos, const uint256& hashBlock) -{ - // Open history file to read - CAutoFile filein(OpenUndoFile(pos, true), SER_DISK, CLIENT_VERSION); - if (filein.IsNull()) - return error("%s: OpenBlockFile failed", __func__); - - // Read block - uint256 hashChecksum; - try { - filein >> blockundo; - filein >> hashChecksum; + + bool UndoWriteToDisk(const CBlockUndo& blockundo, CDiskBlockPos& pos, const uint256& hashBlock, const CMessageHeader::MessageStartChars& messageStart) + { + // Open history file to append + CAutoFile fileout(OpenUndoFile(pos), SER_DISK, CLIENT_VERSION); + if (fileout.IsNull()) + return error("%s: OpenUndoFile failed", __func__); + + // Write index header + unsigned int nSize = fileout.GetSerializeSize(blockundo); + fileout << FLATDATA(messageStart) << nSize; + + // Write undo data + long fileOutPos = ftell(fileout.Get()); + if (fileOutPos < 0) + return error("%s: ftell failed", __func__); + pos.nPos = (unsigned int)fileOutPos; + fileout << blockundo; + + // calculate & write checksum + CHashWriter hasher(SER_GETHASH, PROTOCOL_VERSION); + hasher << hashBlock; + hasher << blockundo; + fileout << hasher.GetHash(); + + return true; } - catch (const std::exception& e) { - return error("%s: Deserialize or I/O error - %s", __func__, e.what()); + + bool UndoReadFromDisk(CBlockUndo& blockundo, const CDiskBlockPos& pos, const uint256& hashBlock) + { + // Open history file to read + CAutoFile filein(OpenUndoFile(pos, true), SER_DISK, CLIENT_VERSION); + if (filein.IsNull()) + return error("%s: OpenBlockFile failed", __func__); + + // Read block + uint256 hashChecksum; + try { + filein >> blockundo; + filein >> hashChecksum; + } + catch (const std::exception& e) { + return error("%s: Deserialize or I/O error - %s", __func__, e.what()); + } + + // Verify checksum + CHashWriter hasher(SER_GETHASH, PROTOCOL_VERSION); + hasher << hashBlock; + hasher << blockundo; + if (hashChecksum != hasher.GetHash()) + return error("%s: Checksum mismatch", __func__); + + return true; } - - // Verify checksum - CHashWriter hasher(SER_GETHASH, PROTOCOL_VERSION); - hasher << hashBlock; - hasher << blockundo; - if (hashChecksum != hasher.GetHash()) - return error("%s: Checksum mismatch", __func__); - - return true; -} - -/** Abort with a message */ -bool AbortNode(const std::string& strMessage, const std::string& userMessage="") -{ - strMiscWarning = strMessage; - LogPrintf("*** %s\n", strMessage); - uiInterface.ThreadSafeMessageBox( - userMessage.empty() ? _("Error: A fatal internal error occurred, see debug.log for details") : userMessage, - "", CClientUIInterface::MSG_ERROR); - StartShutdown(); - return false; -} - -bool AbortNode(CValidationState& state, const std::string& strMessage, const std::string& userMessage="") -{ - AbortNode(strMessage, userMessage); - return state.Error(strMessage); -} - + + /** Abort with a message */ + bool AbortNode(const std::string& strMessage, const std::string& userMessage="") + { + strMiscWarning = strMessage; + LogPrintf("*** %s\n", strMessage); + uiInterface.ThreadSafeMessageBox( + userMessage.empty() ? _("Error: A fatal internal error occurred, see debug.log for details") : userMessage, + "", CClientUIInterface::MSG_ERROR); + StartShutdown(); + return false; + } + + bool AbortNode(CValidationState& state, const std::string& strMessage, const std::string& userMessage="") + { + AbortNode(strMessage, userMessage); + return state.Error(strMessage); + } + } // anon namespace /** @@ -2223,7 +2227,7 @@ bool AbortNode(CValidationState& state, const std::string& strMessage, const std static bool ApplyTxInUndo(const CTxInUndo& undo, CCoinsViewCache& view, const COutPoint& out) { bool fClean = true; - + CCoinsModifier coins = view.ModifyCoins(out.hash); if (undo.nHeight != 0) { // undo data contains height: this is the last output of the prevout tx being spent @@ -2242,17 +2246,17 @@ static bool ApplyTxInUndo(const CTxInUndo& undo, CCoinsViewCache& view, const CO if (coins->vout.size() < out.n+1) coins->vout.resize(out.n+1); coins->vout[out.n] = undo.txout; - + return fClean; } bool DisconnectBlock(CBlock& block, CValidationState& state, CBlockIndex* pindex, CCoinsViewCache& view, bool* pfClean) { assert(pindex->GetBlockHash() == view.GetBestBlock()); - + if (pfClean) *pfClean = false; - + bool fClean = true; komodo_disconnect(pindex,block); CBlockUndo blockUndo; @@ -2261,41 +2265,41 @@ bool DisconnectBlock(CBlock& block, CValidationState& state, CBlockIndex* pindex return error("DisconnectBlock(): no undo data available"); if (!UndoReadFromDisk(blockUndo, pos, pindex->pprev->GetBlockHash())) return error("DisconnectBlock(): failure reading undo data"); - + if (blockUndo.vtxundo.size() + 1 != block.vtx.size()) return error("DisconnectBlock(): block and undo data inconsistent"); - + // undo transactions in reverse order for (int i = block.vtx.size() - 1; i >= 0; i--) { const CTransaction &tx = block.vtx[i]; uint256 hash = tx.GetHash(); - + // Check that all outputs are available and match the outputs in the block itself // exactly. { - CCoinsModifier outs = view.ModifyCoins(hash); - outs->ClearUnspendable(); - - CCoins outsBlock(tx, pindex->nHeight); - // The CCoins serialization does not serialize negative numbers. - // No network rules currently depend on the version here, so an inconsistency is harmless - // but it must be corrected before txout nversion ever influences a network rule. - if (outsBlock.nVersion < 0) - outs->nVersion = outsBlock.nVersion; - if (*outs != outsBlock) - fClean = fClean && error("DisconnectBlock(): added transaction mismatch? database corrupted"); - - // remove outputs - outs->Clear(); + CCoinsModifier outs = view.ModifyCoins(hash); + outs->ClearUnspendable(); + + CCoins outsBlock(tx, pindex->nHeight); + // The CCoins serialization does not serialize negative numbers. + // No network rules currently depend on the version here, so an inconsistency is harmless + // but it must be corrected before txout nversion ever influences a network rule. + if (outsBlock.nVersion < 0) + outs->nVersion = outsBlock.nVersion; + if (*outs != outsBlock) + fClean = fClean && error("DisconnectBlock(): added transaction mismatch? database corrupted"); + + // remove outputs + outs->Clear(); } - + // unspend nullifiers BOOST_FOREACH(const JSDescription &joinsplit, tx.vjoinsplit) { BOOST_FOREACH(const uint256 &nf, joinsplit.nullifiers) { view.SetNullifier(nf, false); } } - + // restore inputs if (i > 0) { // not coinbases const CTxUndo &txundo = blockUndo.vtxundo[i-1]; @@ -2309,27 +2313,27 @@ bool DisconnectBlock(CBlock& block, CValidationState& state, CBlockIndex* pindex } } } - + // set the old best anchor back view.PopAnchor(blockUndo.old_tree_root); - + // move best block pointer to prevout block view.SetBestBlock(pindex->pprev->GetBlockHash()); - + if (pfClean) { *pfClean = fClean; return true; } - + return fClean; } void static FlushBlockFile(bool fFinalize = false) { LOCK(cs_LastBlockFile); - + CDiskBlockPos posOld(nLastBlockFile, 0); - + FILE *fileOld = OpenBlockFile(posOld); if (fileOld) { if (fFinalize) @@ -2337,7 +2341,7 @@ void static FlushBlockFile(bool fFinalize = false) FileCommit(fileOld); fclose(fileOld); } - + fileOld = OpenUndoFile(posOld); if (fileOld) { if (fFinalize) @@ -2365,20 +2369,20 @@ void PartitionCheck(bool (*initialDownloadCheck)(), CCriticalSection& cs, const int64_t nPowTargetSpacing) { if (bestHeader == NULL || initialDownloadCheck()) return; - + static int64_t lastAlertTime = 0; int64_t now = GetAdjustedTime(); if (lastAlertTime > now-60*60*24) return; // Alert at most once per day - + const int SPAN_HOURS=4; const int SPAN_SECONDS=SPAN_HOURS*60*60; int BLOCKS_EXPECTED = SPAN_SECONDS / nPowTargetSpacing; - + boost::math::poisson_distribution poisson(BLOCKS_EXPECTED); - + std::string strWarning; int64_t startTime = GetAdjustedTime()-SPAN_SECONDS; - + LOCK(cs); const CBlockIndex* i = bestHeader; int nBlocks = 0; @@ -2387,17 +2391,17 @@ void PartitionCheck(bool (*initialDownloadCheck)(), CCriticalSection& cs, const i = i->pprev; if (i == NULL) return; // Ran out of chain, we must not be fully synced } - + // How likely is it to find that many by chance? double p = boost::math::pdf(poisson, nBlocks); - + LogPrint("partitioncheck", "%s : Found %d blocks in the last %d hours\n", __func__, nBlocks, SPAN_HOURS); LogPrint("partitioncheck", "%s : likelihood: %g\n", __func__, p); - + // Aim for one false-positive about every fifty years of normal running: const int FIFTY_YEARS = 50*365*24*60*60; double alertThreshold = 1.0 / (FIFTY_YEARS / SPAN_SECONDS); - + if (p <= alertThreshold && nBlocks < BLOCKS_EXPECTED) { // Many fewer blocks than expected: alert! @@ -2427,6 +2431,7 @@ static int64_t nTimeTotal = 0; bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pindex, CCoinsViewCache& view, bool fJustCheck) { const CChainParams& chainparams = Params(); + //fprintf(stderr,"connectblock ht.%d\n",(int32_t)pindex->nHeight); AssertLockHeld(cs_main); bool fExpensiveChecks = true; @@ -2439,15 +2444,15 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin } auto verifier = libzcash::ProofVerifier::Strict(); auto disabledVerifier = libzcash::ProofVerifier::Disabled(); - + // Check it again to verify JoinSplit proofs, and in case a previous version let a bad block in if (!CheckBlock(pindex->nHeight,pindex,block, state, fExpensiveChecks ? verifier : disabledVerifier, !fJustCheck, !fJustCheck)) return false; - + // verify that the view's current state corresponds to the previous block uint256 hashPrevBlock = pindex->pprev == NULL ? uint256() : pindex->pprev->GetBlockHash(); assert(hashPrevBlock == view.GetBestBlock()); - + // Special case for the genesis block, skipping connection of its transactions // (its coinbase is unspendable) if (block.GetHash() == chainparams.GetConsensus().hashGenesisBlock) { @@ -2461,7 +2466,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin } return true; } - + bool fScriptChecks = (!fCheckpointsEnabled || pindex->nHeight >= Checkpoints::GetTotalBlocksEstimate(chainparams.Checkpoints())); //if ( KOMODO_TESTNET_EXPIRATION != 0 && pindex->nHeight > KOMODO_TESTNET_EXPIRATION ) // "testnet" // return(false); @@ -2473,15 +2478,15 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin return state.DoS(100, error("ConnectBlock(): tried to overwrite transaction"), REJECT_INVALID, "bad-txns-BIP30"); } - + unsigned int flags = SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY; - + // DERSIG (BIP66) is also always enforced, but does not have a flag. - + CBlockUndo blockundo; - + CCheckQueueControl control(fExpensiveChecks && nScriptCheckThreads ? &scriptcheckqueue : NULL); - + int64_t nTimeStart = GetTimeMicros(); CAmount nFees = 0; int nInputs = 0; @@ -2491,7 +2496,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin std::vector > vPos; vPos.reserve(block.vtx.size()); blockundo.vtxundo.reserve(block.vtx.size() - 1); - + // Construct the incremental merkle tree at the current // block position, auto old_tree_root = view.GetBestAnchor(); @@ -2503,16 +2508,16 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin // This should never fail: we should always be able to get the root // that is on the tip of our chain assert(view.GetAnchorAt(old_tree_root, tree)); - + { // Consistency check: the root of the tree we're given should // match what we asked for. assert(tree.root() == old_tree_root); } - + // Grab the consensus branch ID for the block's height auto consensusBranchId = CurrentEpochBranchId(pindex->nHeight, Params().GetConsensus()); - + std::vector txdata; txdata.reserve(block.vtx.size()); // Required so that pointers to individual PrecomputedTransactionData don't get invalidated for (unsigned int i = 0; i < block.vtx.size(); i++) @@ -2523,18 +2528,18 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin if (nSigOps > MAX_BLOCK_SIGOPS) return state.DoS(100, error("ConnectBlock(): too many sigops"), REJECT_INVALID, "bad-blk-sigops"); -//fprintf(stderr,"ht.%d vout0 t%u\n",pindex->nHeight,tx.nLockTime); + //fprintf(stderr,"ht.%d vout0 t%u\n",pindex->nHeight,tx.nLockTime); if (!tx.IsCoinBase()) { if (!view.HaveInputs(tx)) return state.DoS(100, error("ConnectBlock(): inputs missing/spent"), REJECT_INVALID, "bad-txns-inputs-missingorspent"); - + // are the JoinSplit's requirements met? if (!view.HaveJoinSplitRequirements(tx)) return state.DoS(100, error("ConnectBlock(): JoinSplit requirements not met"), REJECT_INVALID, "bad-txns-joinsplit-requirements-not-met"); - + // Add in sigops done by pay-to-script-hash inputs; // this is to prevent a "rogue miner" from creating // an incredibly-expensive-to-validate block. @@ -2543,14 +2548,14 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin return state.DoS(100, error("ConnectBlock(): too many sigops"), REJECT_INVALID, "bad-blk-sigops"); } - + txdata.emplace_back(tx); - + if (!tx.IsCoinBase()) { nFees += view.GetValueIn(chainActive.Tip()->nHeight,&interest,tx,chainActive.Tip()->nTime) - tx.GetValueOut(); sum += interest; - + std::vector vChecks; if (!ContextualCheckInputs(tx, state, view, fExpensiveChecks, flags, false, txdata[i], chainparams.GetConsensus(), consensusBranchId, nScriptCheckThreads ? &vChecks : NULL)) return false; @@ -2563,28 +2568,28 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin blockundo.vtxundo.push_back(CTxUndo()); } UpdateCoins(tx, view, i == 0 ? undoDummy : blockundo.vtxundo.back(), pindex->nHeight); - + BOOST_FOREACH(const JSDescription &joinsplit, tx.vjoinsplit) { BOOST_FOREACH(const uint256 ¬e_commitment, joinsplit.commitments) { // Insert the note commitments into our temporary tree. - + tree.append(note_commitment); } } - + vPos.push_back(std::make_pair(tx.GetHash(), pos)); pos.nTxOffset += ::GetSerializeSize(tx, SER_DISK, CLIENT_VERSION); } - + view.PushAnchor(tree); if (!fJustCheck) { pindex->hashAnchorEnd = tree.root(); } blockundo.old_tree_root = old_tree_root; - + int64_t nTime1 = GetTimeMicros(); nTimeConnect += nTime1 - nTimeStart; LogPrint("bench", " - Connect %u transactions: %.2fms (%.3fms/tx, %.3fms/txin) [%.2fs]\n", (unsigned)block.vtx.size(), 0.001 * (nTime1 - nTimeStart), 0.001 * (nTime1 - nTimeStart) / block.vtx.size(), nInputs <= 1 ? 0 : 0.001 * (nTime1 - nTimeStart) / (nInputs-1), nTimeConnect * 0.000001); - + CAmount blockReward = nFees + GetBlockSubsidy(pindex->nHeight, chainparams.GetConsensus()) + sum; if ( ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 && ASSETCHAINS_COMMISSION != 0 && block.vtx[0].vout.size() > 1 ) { @@ -2601,9 +2606,9 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin if ( ASSETCHAINS_SYMBOL[0] != 0 || pindex->nHeight >= KOMODO_NOTARIES_HEIGHT1 || block.vtx[0].vout[0].nValue > blockReward ) { return state.DoS(100, - error("ConnectBlock(): coinbase pays too much (actual=%d vs limit=%d)", - block.vtx[0].GetValueOut(), blockReward), - REJECT_INVALID, "bad-cb-amount"); + error("ConnectBlock(): coinbase pays too much (actual=%d vs limit=%d)", + block.vtx[0].GetValueOut(), blockReward), + REJECT_INVALID, "bad-cb-amount"); } else if ( NOTARY_PUBKEY33[0] != 0 ) fprintf(stderr,"allow nHeight.%d coinbase %.8f vs %.8f interest %.8f\n",(int32_t)pindex->nHeight,dstr(block.vtx[0].GetValueOut()),dstr(blockReward),dstr(sum)); } @@ -2611,10 +2616,10 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin return state.DoS(100, false); int64_t nTime2 = GetTimeMicros(); nTimeVerify += nTime2 - nTimeStart; LogPrint("bench", " - Verify %u txins: %.2fms (%.3fms/txin) [%.2fs]\n", nInputs - 1, 0.001 * (nTime2 - nTimeStart), nInputs <= 1 ? 0 : 0.001 * (nTime2 - nTimeStart) / (nInputs-1), nTimeVerify * 0.000001); - + if (fJustCheck) return true; - + // Write undo information to disk if (pindex->GetUndoPos().IsNull() || !pindex->IsValid(BLOCK_VALID_SCRIPTS)) { @@ -2624,42 +2629,42 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin return error("ConnectBlock(): FindUndoPos failed"); if (!UndoWriteToDisk(blockundo, pos, pindex->pprev->GetBlockHash(), chainparams.MessageStart())) return AbortNode(state, "Failed to write undo data"); - + // update nUndoPos in block index pindex->nUndoPos = pos.nPos; pindex->nStatus |= BLOCK_HAVE_UNDO; } - + // Now that all consensus rules have been validated, set nCachedBranchId. // Move this if BLOCK_VALID_CONSENSUS is ever altered. static_assert(BLOCK_VALID_CONSENSUS == BLOCK_VALID_SCRIPTS, - "nCachedBranchId must be set after all consensus rules have been validated."); + "nCachedBranchId must be set after all consensus rules have been validated."); if (IsActivationHeightForAnyUpgrade(pindex->nHeight, Params().GetConsensus())) { pindex->nStatus |= BLOCK_ACTIVATES_UPGRADE; pindex->nCachedBranchId = CurrentEpochBranchId(pindex->nHeight, chainparams.GetConsensus()); } else if (pindex->pprev) { pindex->nCachedBranchId = pindex->pprev->nCachedBranchId; } - + pindex->RaiseValidity(BLOCK_VALID_SCRIPTS); setDirtyBlockIndex.insert(pindex); } - + if (fTxIndex) if (!pblocktree->WriteTxIndex(vPos)) return AbortNode(state, "Failed to write transaction index"); - + // add this block to the view's block chain view.SetBestBlock(pindex->GetBlockHash()); - + int64_t nTime3 = GetTimeMicros(); nTimeIndex += nTime3 - nTime2; LogPrint("bench", " - Index writing: %.2fms [%.2fs]\n", 0.001 * (nTime3 - nTime2), nTimeIndex * 0.000001); - + // Watch for changes to the previous coinbase transaction. static uint256 hashPrevBestCoinBase; GetMainSignals().UpdatedTransaction(hashPrevBestCoinBase); hashPrevBestCoinBase = block.vtx[0].GetHash(); - + int64_t nTime4 = GetTimeMicros(); nTimeCallbacks += nTime4 - nTime3; LogPrint("bench", " - Callbacks: %.2fms [%.2fs]\n", 0.001 * (nTime4 - nTime3), nTimeCallbacks * 0.000001); @@ -2689,88 +2694,88 @@ bool static FlushStateToDisk(CValidationState &state, FlushStateMode mode) { std::set setFilesToPrune; bool fFlushForPrune = false; try { - if (fPruneMode && fCheckForPruning && !fReindex) { - FindFilesToPrune(setFilesToPrune); - fCheckForPruning = false; - if (!setFilesToPrune.empty()) { - fFlushForPrune = true; - if (!fHavePruned) { - pblocktree->WriteFlag("prunedblockfiles", true); - fHavePruned = true; + if (fPruneMode && fCheckForPruning && !fReindex) { + FindFilesToPrune(setFilesToPrune); + fCheckForPruning = false; + if (!setFilesToPrune.empty()) { + fFlushForPrune = true; + if (!fHavePruned) { + pblocktree->WriteFlag("prunedblockfiles", true); + fHavePruned = true; + } } } - } - int64_t nNow = GetTimeMicros(); - // Avoid writing/flushing immediately after startup. - if (nLastWrite == 0) { - nLastWrite = nNow; - } - if (nLastFlush == 0) { - nLastFlush = nNow; - } - if (nLastSetChain == 0) { - nLastSetChain = nNow; - } - size_t cacheSize = pcoinsTip->DynamicMemoryUsage(); - // The cache is large and close to the limit, but we have time now (not in the middle of a block processing). - bool fCacheLarge = mode == FLUSH_STATE_PERIODIC && cacheSize * (10.0/9) > nCoinCacheUsage; - // The cache is over the limit, we have to write now. - bool fCacheCritical = mode == FLUSH_STATE_IF_NEEDED && cacheSize > nCoinCacheUsage; - // It's been a while since we wrote the block index to disk. Do this frequently, so we don't need to redownload after a crash. - bool fPeriodicWrite = mode == FLUSH_STATE_PERIODIC && nNow > nLastWrite + (int64_t)DATABASE_WRITE_INTERVAL * 1000000; - // It's been very long since we flushed the cache. Do this infrequently, to optimize cache usage. - bool fPeriodicFlush = mode == FLUSH_STATE_PERIODIC && nNow > nLastFlush + (int64_t)DATABASE_FLUSH_INTERVAL * 1000000; - // Combine all conditions that result in a full cache flush. - bool fDoFullFlush = (mode == FLUSH_STATE_ALWAYS) || fCacheLarge || fCacheCritical || fPeriodicFlush || fFlushForPrune; - // Write blocks and block index to disk. - if (fDoFullFlush || fPeriodicWrite) { - // Depend on nMinDiskSpace to ensure we can write block index - if (!CheckDiskSpace(0)) - return state.Error("out of disk space"); - // First make sure all block and undo data is flushed to disk. - FlushBlockFile(); - // Then update all block file information (which may refer to block and undo files). - { - std::vector > vFiles; - vFiles.reserve(setDirtyFileInfo.size()); - for (set::iterator it = setDirtyFileInfo.begin(); it != setDirtyFileInfo.end(); ) { - vFiles.push_back(make_pair(*it, &vinfoBlockFile[*it])); - setDirtyFileInfo.erase(it++); - } - std::vector vBlocks; - vBlocks.reserve(setDirtyBlockIndex.size()); - for (set::iterator it = setDirtyBlockIndex.begin(); it != setDirtyBlockIndex.end(); ) { - vBlocks.push_back(*it); - setDirtyBlockIndex.erase(it++); - } - if (!pblocktree->WriteBatchSync(vFiles, nLastBlockFile, vBlocks)) { - return AbortNode(state, "Files to write to block index database"); - } + int64_t nNow = GetTimeMicros(); + // Avoid writing/flushing immediately after startup. + if (nLastWrite == 0) { + nLastWrite = nNow; + } + if (nLastFlush == 0) { + nLastFlush = nNow; + } + if (nLastSetChain == 0) { + nLastSetChain = nNow; + } + size_t cacheSize = pcoinsTip->DynamicMemoryUsage(); + // The cache is large and close to the limit, but we have time now (not in the middle of a block processing). + bool fCacheLarge = mode == FLUSH_STATE_PERIODIC && cacheSize * (10.0/9) > nCoinCacheUsage; + // The cache is over the limit, we have to write now. + bool fCacheCritical = mode == FLUSH_STATE_IF_NEEDED && cacheSize > nCoinCacheUsage; + // It's been a while since we wrote the block index to disk. Do this frequently, so we don't need to redownload after a crash. + bool fPeriodicWrite = mode == FLUSH_STATE_PERIODIC && nNow > nLastWrite + (int64_t)DATABASE_WRITE_INTERVAL * 1000000; + // It's been very long since we flushed the cache. Do this infrequently, to optimize cache usage. + bool fPeriodicFlush = mode == FLUSH_STATE_PERIODIC && nNow > nLastFlush + (int64_t)DATABASE_FLUSH_INTERVAL * 1000000; + // Combine all conditions that result in a full cache flush. + bool fDoFullFlush = (mode == FLUSH_STATE_ALWAYS) || fCacheLarge || fCacheCritical || fPeriodicFlush || fFlushForPrune; + // Write blocks and block index to disk. + if (fDoFullFlush || fPeriodicWrite) { + // Depend on nMinDiskSpace to ensure we can write block index + if (!CheckDiskSpace(0)) + return state.Error("out of disk space"); + // First make sure all block and undo data is flushed to disk. + FlushBlockFile(); + // Then update all block file information (which may refer to block and undo files). + { + std::vector > vFiles; + vFiles.reserve(setDirtyFileInfo.size()); + for (set::iterator it = setDirtyFileInfo.begin(); it != setDirtyFileInfo.end(); ) { + vFiles.push_back(make_pair(*it, &vinfoBlockFile[*it])); + setDirtyFileInfo.erase(it++); + } + std::vector vBlocks; + vBlocks.reserve(setDirtyBlockIndex.size()); + for (set::iterator it = setDirtyBlockIndex.begin(); it != setDirtyBlockIndex.end(); ) { + vBlocks.push_back(*it); + setDirtyBlockIndex.erase(it++); + } + if (!pblocktree->WriteBatchSync(vFiles, nLastBlockFile, vBlocks)) { + return AbortNode(state, "Files to write to block index database"); + } + } + // Finally remove any pruned files + if (fFlushForPrune) + UnlinkPrunedFiles(setFilesToPrune); + nLastWrite = nNow; + } + // Flush best chain related state. This can only be done if the blocks / block index write was also done. + if (fDoFullFlush) { + // Typical CCoins structures on disk are around 128 bytes in size. + // Pushing a new one to the database can cause it to be written + // twice (once in the log, and once in the tables). This is already + // an overestimation, as most will delete an existing entry or + // overwrite one. Still, use a conservative safety factor of 2. + if (!CheckDiskSpace(128 * 2 * 2 * pcoinsTip->GetCacheSize())) + return state.Error("out of disk space"); + // Flush the chainstate (which may refer to block index entries). + if (!pcoinsTip->Flush()) + return AbortNode(state, "Failed to write to coin database"); + nLastFlush = nNow; + } + if ((mode == FLUSH_STATE_ALWAYS || mode == FLUSH_STATE_PERIODIC) && nNow > nLastSetChain + (int64_t)DATABASE_WRITE_INTERVAL * 1000000) { + // Update best block in wallet (so we can detect restored wallets). + GetMainSignals().SetBestChain(chainActive.GetLocator()); + nLastSetChain = nNow; } - // Finally remove any pruned files - if (fFlushForPrune) - UnlinkPrunedFiles(setFilesToPrune); - nLastWrite = nNow; - } - // Flush best chain related state. This can only be done if the blocks / block index write was also done. - if (fDoFullFlush) { - // Typical CCoins structures on disk are around 128 bytes in size. - // Pushing a new one to the database can cause it to be written - // twice (once in the log, and once in the tables). This is already - // an overestimation, as most will delete an existing entry or - // overwrite one. Still, use a conservative safety factor of 2. - if (!CheckDiskSpace(128 * 2 * 2 * pcoinsTip->GetCacheSize())) - return state.Error("out of disk space"); - // Flush the chainstate (which may refer to block index entries). - if (!pcoinsTip->Flush()) - return AbortNode(state, "Failed to write to coin database"); - nLastFlush = nNow; - } - if ((mode == FLUSH_STATE_ALWAYS || mode == FLUSH_STATE_PERIODIC) && nNow > nLastSetChain + (int64_t)DATABASE_WRITE_INTERVAL * 1000000) { - // Update best block in wallet (so we can detect restored wallets). - GetMainSignals().SetBestChain(chainActive.GetLocator()); - nLastSetChain = nNow; - } } catch (const std::runtime_error& e) { return AbortNode(state, std::string("System error while flushing: ") + e.what()); } @@ -2792,18 +2797,18 @@ void PruneAndFlush() { void static UpdateTip(CBlockIndex *pindexNew) { const CChainParams& chainParams = Params(); chainActive.SetTip(pindexNew); - + // New best block nTimeBestReceived = GetTime(); mempool.AddTransactionsUpdated(1); - + LogPrintf("%s: new best=%s height=%d log2_work=%.8g tx=%lu date=%s progress=%f cache=%.1fMiB(%utx)\n", __func__, - chainActive.Tip()->GetBlockHash().ToString(), chainActive.Height(), log(chainActive.Tip()->nChainWork.getdouble())/log(2.0), (unsigned long)chainActive.Tip()->nChainTx, - DateTimeStrFormat("%Y-%m-%d %H:%M:%S", chainActive.Tip()->GetBlockTime()), - Checkpoints::GuessVerificationProgress(chainParams.Checkpoints(), chainActive.Tip()), pcoinsTip->DynamicMemoryUsage() * (1.0 / (1<<20)), pcoinsTip->GetCacheSize()); - + chainActive.Tip()->GetBlockHash().ToString(), chainActive.Height(), log(chainActive.Tip()->nChainWork.getdouble())/log(2.0), (unsigned long)chainActive.Tip()->nChainTx, + DateTimeStrFormat("%Y-%m-%d %H:%M:%S", chainActive.Tip()->GetBlockTime()), + Checkpoints::GuessVerificationProgress(chainParams.Checkpoints(), chainActive.Tip()), pcoinsTip->DynamicMemoryUsage() * (1.0 / (1<<20)), pcoinsTip->GetCacheSize()); + cvBlockChange.notify_all(); - + // Check the version of the last 100 blocks to see if we need to upgrade: static bool fWarned = false; if (!IsInitialBlockDownload() && !fWarned) @@ -2853,7 +2858,7 @@ bool static DisconnectTip(CValidationState &state, bool fBare = false) { // Write the chain state to disk, if necessary. if (!FlushStateToDisk(state, FLUSH_STATE_IF_NEEDED)) return false; - + if (!fBare) { // Resurrect mempool transactions from the disconnected block. BOOST_FOREACH(const CTransaction &tx, block.vtx) { @@ -2869,7 +2874,7 @@ bool static DisconnectTip(CValidationState &state, bool fBare = false) { mempool.removeWithAnchor(anchorBeforeDisconnect); } } - + // Update chainActive and related variables. UpdateTip(pindexDelete->pprev); // Get the current commitment tree @@ -2939,10 +2944,10 @@ bool static ConnectTip(CValidationState &state, CBlockIndex *pindexNew, CBlock * // Remove conflicting transactions from the mempool. list txConflicted; mempool.removeForBlock(pblock->vtx, pindexNew->nHeight, txConflicted, !IsInitialBlockDownload()); - + // Remove transactions that expire at new block height from mempool mempool.removeExpired(pindexNew->nHeight); - + // Update chainActive & related variables. UpdateTip(pindexNew); // Tell wallet about transactions that went from mempool @@ -2957,9 +2962,9 @@ bool static ConnectTip(CValidationState &state, CBlockIndex *pindexNew, CBlock * // Update cached incremental witnesses //fprintf(stderr,"chaintip true\n"); GetMainSignals().ChainTip(pindexNew, pblock, oldTree, true); - + EnforceNodeDeprecation(pindexNew->nHeight); - + int64_t nTime6 = GetTimeMicros(); nTimePostConnect += nTime6 - nTime5; nTimeTotal += nTime6 - nTime1; LogPrint("bench", " - Connect postprocess: %.2fms [%.2fs]\n", (nTime6 - nTime5) * 0.001, nTimePostConnect * 0.000001); LogPrint("bench", "- Connect block: %.2fms [%.2fs]\n", (nTime6 - nTime1) * 0.001, nTimeTotal * 0.000001); @@ -2973,7 +2978,7 @@ bool static ConnectTip(CValidationState &state, CBlockIndex *pindexNew, CBlock * static CBlockIndex* FindMostWorkChain() { do { CBlockIndex *pindexNew = NULL; - + // Find the best candidate header. { std::set::reverse_iterator it = setBlockIndexCandidates.rbegin(); @@ -2981,14 +2986,14 @@ static CBlockIndex* FindMostWorkChain() { return NULL; pindexNew = *it; } - + // Check whether all blocks on the path between the currently active chain and the candidate are valid. // Just going until the active chain is an optimization, as we know all blocks in it are valid already. CBlockIndex *pindexTest = pindexNew; bool fInvalidAncestor = false; while (pindexTest && !chainActive.Contains(pindexTest)) { assert(pindexTest->nChainTx || pindexTest->nHeight == 0); - + // Pruned nodes may have entries in setBlockIndexCandidates for // which block files have been deleted. Remove those as candidates // for the most work chain if we come across them; we can't switch @@ -3045,7 +3050,7 @@ static bool ActivateBestChainStep(CValidationState &state, CBlockIndex *pindexMo bool fInvalidFound = false; const CBlockIndex *pindexOldTip = chainActive.Tip(); const CBlockIndex *pindexFork = chainActive.FindFork(pindexMostWork); - + // - On ChainDB initialization, pindexOldTip will be null, so there are no removable blocks. // - If pindexMostWork is in a chain that doesn't have the same genesis block as our chain, // then pindexFork will be null, and we would need to remove the entire chain including @@ -3054,23 +3059,23 @@ static bool ActivateBestChainStep(CValidationState &state, CBlockIndex *pindexMo static_assert(MAX_REORG_LENGTH > 0, "We must be able to reorg some distance"); if (reorgLength > MAX_REORG_LENGTH) { auto msg = strprintf(_( - "A block chain reorganization has been detected that would roll back %d blocks! " - "This is larger than the maximum of %d blocks, and so the node is shutting down for your safety." - ), reorgLength, MAX_REORG_LENGTH) + "\n\n" + - _("Reorganization details") + ":\n" + - "- " + strprintf(_("Current tip: %s, height %d, work %s"), - pindexOldTip->phashBlock->GetHex(), pindexOldTip->nHeight, pindexOldTip->nChainWork.GetHex()) + "\n" + - "- " + strprintf(_("New tip: %s, height %d, work %s"), - pindexMostWork->phashBlock->GetHex(), pindexMostWork->nHeight, pindexMostWork->nChainWork.GetHex()) + "\n" + - "- " + strprintf(_("Fork point: %s, height %d"), - pindexFork->phashBlock->GetHex(), pindexFork->nHeight) + "\n\n" + - _("Please help, human!"); + "A block chain reorganization has been detected that would roll back %d blocks! " + "This is larger than the maximum of %d blocks, and so the node is shutting down for your safety." + ), reorgLength, MAX_REORG_LENGTH) + "\n\n" + + _("Reorganization details") + ":\n" + + "- " + strprintf(_("Current tip: %s, height %d, work %s"), + pindexOldTip->phashBlock->GetHex(), pindexOldTip->nHeight, pindexOldTip->nChainWork.GetHex()) + "\n" + + "- " + strprintf(_("New tip: %s, height %d, work %s"), + pindexMostWork->phashBlock->GetHex(), pindexMostWork->nHeight, pindexMostWork->nChainWork.GetHex()) + "\n" + + "- " + strprintf(_("Fork point: %s, height %d"), + pindexFork->phashBlock->GetHex(), pindexFork->nHeight) + "\n\n" + + _("Please help, human!"); LogPrintf("*** %s\n", msg); uiInterface.ThreadSafeMessageBox(msg, "", CClientUIInterface::MSG_ERROR); StartShutdown(); return false; } - + // Disconnect active blocks which are no longer in the best chain. bool fBlocksDisconnected = false; while (chainActive.Tip() && chainActive.Tip() != pindexFork) { @@ -3080,21 +3085,21 @@ static bool ActivateBestChainStep(CValidationState &state, CBlockIndex *pindexMo } if ( KOMODO_REWIND != 0 ) { + CBlockIndex *tipindex; fprintf(stderr,">>>>>>>>>>> rewind start ht.%d -> KOMODO_REWIND.%d\n",chainActive.Tip()->nHeight,KOMODO_REWIND); - while ( KOMODO_REWIND > 0 && chainActive.Tip()->nHeight > KOMODO_REWIND ) + while ( KOMODO_REWIND > 0 && (tipindex= chainActive.Tip()) != 0 && tipindex->nHeight > KOMODO_REWIND ) { - fprintf(stderr,"%d ",(int32_t)chainActive.Tip()->nHeight); + fBlocksDisconnected = true; + fprintf(stderr,"%d ",(int32_t)tipindex->nHeight); + InvalidateBlock(state,tipindex); if ( !DisconnectTip(state) ) - { - InvalidateBlock(state,chainActive.Tip()); break; - } } fprintf(stderr,"reached rewind.%d, best to do: ./komodo-cli -ac_name=%s stop\n",KOMODO_REWIND,ASSETCHAINS_SYMBOL); - sleep(60); + sleep(20); fprintf(stderr,"resuming normal operations\n"); KOMODO_REWIND = 0; - return(true); + //return(true); } // Build list of new blocks to connect. std::vector vpindexToConnect; @@ -3112,7 +3117,7 @@ static bool ActivateBestChainStep(CValidationState &state, CBlockIndex *pindexMo pindexIter = pindexIter->pprev; } nHeight = nTargetHeight; - + // Connect new blocks. BOOST_REVERSE_FOREACH(CBlockIndex *pindexConnect, vpindexToConnect) { if (!ConnectTip(state, pindexConnect, pindexConnect == pindexMostWork ? pblock : NULL)) { @@ -3138,20 +3143,20 @@ static bool ActivateBestChainStep(CValidationState &state, CBlockIndex *pindexMo } } } - + if (fBlocksDisconnected) { mempool.removeForReorg(pcoinsTip, chainActive.Tip()->nHeight + 1, STANDARD_LOCKTIME_VERIFY_FLAGS); } mempool.removeWithoutBranchId( - CurrentEpochBranchId(chainActive.Tip()->nHeight + 1, Params().GetConsensus())); + CurrentEpochBranchId(chainActive.Tip()->nHeight + 1, Params().GetConsensus())); mempool.check(pcoinsTip); - + // Callbacks/notifications for a new best chain. if (fInvalidFound) CheckForkWarningConditionsOnNewFork(vpindexToConnect.back()); else CheckForkWarningConditions(); - + return true; } @@ -3166,23 +3171,23 @@ bool ActivateBestChain(CValidationState &state, CBlock *pblock) { const CChainParams& chainParams = Params(); do { boost::this_thread::interruption_point(); - + bool fInitialDownload; { LOCK(cs_main); pindexMostWork = FindMostWorkChain(); - + // Whether we have anything to do at all. if (pindexMostWork == NULL || pindexMostWork == chainActive.Tip()) return true; - + if (!ActivateBestChainStep(state, pindexMostWork, pblock && pblock->GetHash() == pindexMostWork->GetBlockHash() ? pblock : NULL)) return false; pindexNewTip = chainActive.Tip(); fInitialDownload = IsInitialBlockDownload(); } // When we reach this point, we switched to a new tip (stored in pindexNewTip). - + // Notifications/callbacks that can run without cs_main if (!fInitialDownload) { uint256 hashNewTip = pindexNewTip->GetBlockHash(); @@ -3195,8 +3200,8 @@ bool ActivateBestChain(CValidationState &state, CBlock *pblock) { if (nLocalServices & NODE_NETWORK) { LOCK(cs_vNodes); BOOST_FOREACH(CNode* pnode, vNodes) - if (chainActive.Height() > (pnode->nStartingHeight != -1 ? pnode->nStartingHeight - 2000 : nBlockEstimate)) - pnode->PushInventory(CInv(MSG_BLOCK, hashNewTip)); + if (chainActive.Height() > (pnode->nStartingHeight != -1 ? pnode->nStartingHeight - 2000 : nBlockEstimate)) + pnode->PushInventory(CInv(MSG_BLOCK, hashNewTip)); } // Notify external listeners about the new tip. GetMainSignals().UpdatedBlockTip(pindexNewTip); @@ -3204,23 +3209,23 @@ bool ActivateBestChain(CValidationState &state, CBlock *pblock) { } //else fprintf(stderr,"initial download skips propagation\n"); } while(pindexMostWork != chainActive.Tip()); CheckBlockIndex(); - + // Write changes periodically to disk, after relay. if (!FlushStateToDisk(state, FLUSH_STATE_PERIODIC)) { return false; } - + return true; } bool InvalidateBlock(CValidationState& state, CBlockIndex *pindex) { AssertLockHeld(cs_main); - + // Mark the block itself as invalid. pindex->nStatus |= BLOCK_FAILED_VALID; setDirtyBlockIndex.insert(pindex); setBlockIndexCandidates.erase(pindex); - + while (chainActive.Contains(pindex)) { CBlockIndex *pindexWalk = chainActive.Tip(); pindexWalk->nStatus |= BLOCK_FAILED_CHILD; @@ -3231,12 +3236,12 @@ bool InvalidateBlock(CValidationState& state, CBlockIndex *pindex) { if (!DisconnectTip(state)) { mempool.removeForReorg(pcoinsTip, chainActive.Tip()->nHeight + 1, STANDARD_LOCKTIME_VERIFY_FLAGS); mempool.removeWithoutBranchId( - CurrentEpochBranchId(chainActive.Tip()->nHeight + 1, Params().GetConsensus())); + CurrentEpochBranchId(chainActive.Tip()->nHeight + 1, Params().GetConsensus())); return false; } } //LimitMempoolSize(mempool, GetArg("-maxmempool", DEFAULT_MAX_MEMPOOL_SIZE) * 1000000, GetArg("-mempoolexpiry", DEFAULT_MEMPOOL_EXPIRY) * 60 * 60); - + // The resulting new best tip may not be in setBlockIndexCandidates anymore, so // add it again. BlockMap::iterator it = mapBlockIndex.begin(); @@ -3246,19 +3251,19 @@ bool InvalidateBlock(CValidationState& state, CBlockIndex *pindex) { } it++; } - + InvalidChainFound(pindex); mempool.removeForReorg(pcoinsTip, chainActive.Tip()->nHeight + 1, STANDARD_LOCKTIME_VERIFY_FLAGS); mempool.removeWithoutBranchId( - CurrentEpochBranchId(chainActive.Tip()->nHeight + 1, Params().GetConsensus())); + CurrentEpochBranchId(chainActive.Tip()->nHeight + 1, Params().GetConsensus())); return true; } bool ReconsiderBlock(CValidationState& state, CBlockIndex *pindex) { AssertLockHeld(cs_main); - + int nHeight = pindex->nHeight; - + // Remove the invalidity flag from this block and all its descendants. BlockMap::iterator it = mapBlockIndex.begin(); while (it != mapBlockIndex.end()) { @@ -3275,7 +3280,7 @@ bool ReconsiderBlock(CValidationState& state, CBlockIndex *pindex) { } it++; } - + // Remove the invalidity flag from all ancestors too. while (pindex != NULL) { if (pindex->nStatus & BLOCK_FAILED_MASK) { @@ -3294,7 +3299,7 @@ CBlockIndex* AddToBlockIndex(const CBlockHeader& block) BlockMap::iterator it = mapBlockIndex.find(hash); if (it != mapBlockIndex.end()) return it->second; - + // Construct new block index object CBlockIndex* pindexNew = new CBlockIndex(block); assert(pindexNew); @@ -3315,9 +3320,9 @@ CBlockIndex* AddToBlockIndex(const CBlockHeader& block) pindexNew->RaiseValidity(BLOCK_VALID_TREE); if (pindexBestHeader == NULL || pindexBestHeader->nChainWork < pindexNew->nChainWork) pindexBestHeader = pindexNew; - + setDirtyBlockIndex.insert(pindexNew); - + return pindexNew; } @@ -3341,12 +3346,12 @@ bool ReceivedBlockTransactions(const CBlock &block, CValidationState& state, CBl pindexNew->nStatus |= BLOCK_HAVE_DATA; pindexNew->RaiseValidity(BLOCK_VALID_TRANSACTIONS); setDirtyBlockIndex.insert(pindexNew); - + if (pindexNew->pprev == NULL || pindexNew->pprev->nChainTx) { // If pindexNew is the genesis block or all parents are BLOCK_VALID_TRANSACTIONS. deque queue; queue.push_back(pindexNew); - + // Recursively process any descendant blocks that now may be eligible to be connected. while (!queue.empty()) { CBlockIndex *pindex = queue.front(); @@ -3381,19 +3386,19 @@ bool ReceivedBlockTransactions(const CBlock &block, CValidationState& state, CBl mapBlocksUnlinked.insert(std::make_pair(pindexNew->pprev, pindexNew)); } } - + return true; } bool FindBlockPos(CValidationState &state, CDiskBlockPos &pos, unsigned int nAddSize, unsigned int nHeight, uint64_t nTime, bool fKnown = false) { LOCK(cs_LastBlockFile); - + unsigned int nFile = fKnown ? pos.nFile : nLastBlockFile; if (vinfoBlockFile.size() <= nFile) { vinfoBlockFile.resize(nFile + 1); } - + if (!fKnown) { while (vinfoBlockFile[nFile].nSize + nAddSize >= MAX_BLOCKFILE_SIZE) { nFile++; @@ -3404,7 +3409,7 @@ bool FindBlockPos(CValidationState &state, CDiskBlockPos &pos, unsigned int nAdd pos.nFile = nFile; pos.nPos = vinfoBlockFile[nFile].nSize; } - + if (nFile != nLastBlockFile) { if (!fKnown) { LogPrintf("Leaving block file %i: %s\n", nFile, vinfoBlockFile[nFile].ToString()); @@ -3412,13 +3417,13 @@ bool FindBlockPos(CValidationState &state, CDiskBlockPos &pos, unsigned int nAdd FlushBlockFile(!fKnown); nLastBlockFile = nFile; } - + vinfoBlockFile[nFile].AddBlock(nHeight, nTime); if (fKnown) vinfoBlockFile[nFile].nSize = std::max(pos.nPos + nAddSize, vinfoBlockFile[nFile].nSize); else vinfoBlockFile[nFile].nSize += nAddSize; - + if (!fKnown) { unsigned int nOldChunks = (pos.nPos + BLOCKFILE_CHUNK_SIZE - 1) / BLOCKFILE_CHUNK_SIZE; unsigned int nNewChunks = (vinfoBlockFile[nFile].nSize + BLOCKFILE_CHUNK_SIZE - 1) / BLOCKFILE_CHUNK_SIZE; @@ -3437,7 +3442,7 @@ bool FindBlockPos(CValidationState &state, CDiskBlockPos &pos, unsigned int nAdd return state.Error("out of disk space"); } } - + setDirtyFileInfo.insert(nFile); return true; } @@ -3445,14 +3450,14 @@ bool FindBlockPos(CValidationState &state, CDiskBlockPos &pos, unsigned int nAdd bool FindUndoPos(CValidationState &state, int nFile, CDiskBlockPos &pos, unsigned int nAddSize) { pos.nFile = nFile; - + LOCK(cs_LastBlockFile); - + unsigned int nNewSize; pos.nPos = vinfoBlockFile[nFile].nUndoSize; nNewSize = vinfoBlockFile[nFile].nUndoSize += nAddSize; setDirtyFileInfo.insert(nFile); - + unsigned int nOldChunks = (pos.nPos + UNDOFILE_CHUNK_SIZE - 1) / UNDOFILE_CHUNK_SIZE; unsigned int nNewChunks = (nNewSize + UNDOFILE_CHUNK_SIZE - 1) / UNDOFILE_CHUNK_SIZE; if (nNewChunks > nOldChunks) { @@ -3469,13 +3474,12 @@ bool FindUndoPos(CValidationState &state, int nFile, CDiskBlockPos &pos, unsigne else return state.Error("out of disk space"); } - + return true; } bool CheckBlockHeader(int32_t height,CBlockIndex *pindex, const CBlockHeader& blockhdr, CValidationState& state, bool fCheckPOW) { - uint8_t pubkey33[33]; // Check timestamp if ( 0 ) { @@ -3502,35 +3506,68 @@ bool CheckBlockHeader(int32_t height,CBlockIndex *pindex, const CBlockHeader& bl // Check block version //if (block.nVersion < MIN_BLOCK_VERSION) // return state.DoS(100, error("CheckBlockHeader(): block version too low"),REJECT_INVALID, "version-too-low"); - + // Check Equihash solution is valid if ( fCheckPOW && !CheckEquihashSolution(&blockhdr, Params()) ) return state.DoS(100, error("CheckBlockHeader(): Equihash solution invalid"),REJECT_INVALID, "invalid-solution"); // Check proof of work matches claimed amount /*komodo_index2pubkey33(pubkey33,pindex,height); - if ( fCheckPOW && !CheckProofOfWork(height,pubkey33,blockhdr.GetHash(), blockhdr.nBits, Params().GetConsensus()) ) - return state.DoS(50, error("CheckBlockHeader(): proof of work failed"),REJECT_INVALID, "high-hash");*/ + if ( fCheckPOW && !CheckProofOfWork(height,pubkey33,blockhdr.GetHash(), blockhdr.nBits, Params().GetConsensus()) ) + return state.DoS(50, error("CheckBlockHeader(): proof of work failed"),REJECT_INVALID, "high-hash");*/ return true; } int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtime); +int32_t komodo_reverify_blockcheck(CValidationState& state,int32_t height,CBlockIndex *pindex) +{ + static int32_t oneshot; + CBlockIndex *tipindex; int32_t rewindtarget; + if ( oneshot == 0 && IsInitialBlockDownload() == 0 && (tipindex= chainActive.Tip()) != 0 ) + { + // if 200 blocks behind longestchain and no blocks for 2 hours + if ( KOMODO_LONGESTCHAIN > height+200 ) + { + if ( GetAdjustedTime() > tipindex->nTime+3600*2 ) + { + fprintf(stderr,"tip.%d longest.%d newblock.%d lag.%d blocktime.%u\n",tipindex->nHeight,KOMODO_LONGESTCHAIN,height,(int32_t)(GetAdjustedTime() - tipindex->nTime),tipindex->nTime); + rewindtarget = tipindex->nHeight - 11; + fprintf(stderr,"rewindtarget <- %d\n",rewindtarget); + oneshot = 1; + while ( rewindtarget > 0 && (tipindex= chainActive.Tip()) != 0 && tipindex->nHeight > rewindtarget ) + { + fprintf(stderr,"%d ",(int32_t)tipindex->nHeight); + InvalidateBlock(state,tipindex); + if ( !DisconnectTip(state) ) + break; + } + tipindex = chainActive.Tip(); + fprintf(stderr,"rewind done to %d\n",tipindex!=0?tipindex->nHeight:-1); + } + } + } + return(0); +} + bool CheckBlock(int32_t height,CBlockIndex *pindex,const CBlock& block, CValidationState& state, libzcash::ProofVerifier& verifier, bool fCheckPOW, bool fCheckMerkleRoot) { uint8_t pubkey33[33]; // These are checks that are independent of context. - + // Check that the header is valid (particularly PoW). This is mostly // redundant with the call in AcceptBlockHeader. if (!CheckBlockHeader(height,pindex,block,state,fCheckPOW)) return false; + //komodo_index2pubkey33(pubkey33,pindex,height); komodo_block2pubkey33(pubkey33,(CBlock *)&block); if ( fCheckPOW && !CheckProofOfWork(height,pubkey33,block.GetHash(), block.nBits, Params().GetConsensus()) ) - return state.DoS(50, error("CheckBlock(): proof of work failed"),REJECT_INVALID, "high-hash"); - + { + komodo_reverify_blockcheck(state,height,pindex); + return state.DoS(33, error("CheckBlock(): proof of work failed"),REJECT_INVALID, "high-hash"); + } // Check the merkle root. if (fCheckMerkleRoot) { bool mutated; @@ -3538,7 +3575,7 @@ bool CheckBlock(int32_t height,CBlockIndex *pindex,const CBlock& block, CValidat if (block.hashMerkleRoot != hashMerkleRoot2) return state.DoS(100, error("CheckBlock(): hashMerkleRoot mismatch"), REJECT_INVALID, "bad-txnmrklroot", true); - + // Check for merkle tree malleability (CVE-2012-2459): repeating sequences // of transactions in a block without affecting the merkle root of a block, // while still invalidating it. @@ -3546,16 +3583,16 @@ bool CheckBlock(int32_t height,CBlockIndex *pindex,const CBlock& block, CValidat return state.DoS(100, error("CheckBlock(): duplicate transaction"), REJECT_INVALID, "bad-txns-duplicate", true); } - + // All potential-corruption validation must be done before we do any // transaction validation, as otherwise we may mark the header as invalid // because we receive the wrong transactions for it. - + // Size limits if (block.vtx.empty() || block.vtx.size() > MAX_BLOCK_SIZE || ::GetSerializeSize(block, SER_NETWORK, PROTOCOL_VERSION) > MAX_BLOCK_SIZE) return state.DoS(100, error("CheckBlock(): size limits failed"), REJECT_INVALID, "bad-blk-length"); - + // First transaction must be coinbase, the rest must not be if (block.vtx.empty() || !block.vtx[0].IsCoinBase()) return state.DoS(100, error("CheckBlock(): first tx is not coinbase"), @@ -3564,12 +3601,12 @@ bool CheckBlock(int32_t height,CBlockIndex *pindex,const CBlock& block, CValidat if (block.vtx[i].IsCoinBase()) return state.DoS(100, error("CheckBlock(): more than one coinbase"), REJECT_INVALID, "bad-cb-multiple"); - + // Check transactions BOOST_FOREACH(const CTransaction& tx, block.vtx) { if ( komodo_validate_interest(tx,height == 0 ? komodo_block2height((CBlock *)&block) : height,block.nTime,1) < 0 ) - return error("CheckBlock: komodo_validate_interest failed"); + return error("CheckBlock: komodo_validate_interest failed"); if (!CheckTransaction(tx, state, verifier)) return error("CheckBlock(): CheckTransaction failed"); } @@ -3582,7 +3619,7 @@ bool CheckBlock(int32_t height,CBlockIndex *pindex,const CBlock& block, CValidat return state.DoS(100, error("CheckBlock(): out-of-bounds SigOpCount"), REJECT_INVALID, "bad-blk-sigops", true); if ( komodo_check_deposit(height,block,(pindex==0||pindex->pprev==0)?0:pindex->pprev->nTime) < 0 ) - //if ( komodo_check_deposit(ASSETCHAINS_SYMBOL[0] == 0 ? height : pindex != 0 ? (int32_t)pindex->nHeight : chainActive.Tip()->nHeight+1,block,pindex==0||pindex->pprev==0?0:pindex->pprev->nTime) < 0 ) + //if ( komodo_check_deposit(ASSETCHAINS_SYMBOL[0] == 0 ? height : pindex != 0 ? (int32_t)pindex->nHeight : chainActive.Tip()->nHeight+1,block,pindex==0||pindex->pprev==0?0:pindex->pprev->nTime) < 0 ) { static uint32_t counter; if ( counter++ < 100 && ASSETCHAINS_STAKED == 0 ) @@ -3599,11 +3636,11 @@ bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& sta uint256 hash = block.GetHash(); if (hash == consensusParams.hashGenesisBlock) return true; - + assert(pindexPrev); - + int nHeight = pindexPrev->nHeight+1; - + // Check proof of work if ( (nHeight < 235300 || nHeight > 236000) && block.nBits != GetNextWorkRequired(pindexPrev, &block, consensusParams)) { @@ -3611,12 +3648,12 @@ bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& sta return state.DoS(100, error("%s: incorrect proof of work", __func__), REJECT_INVALID, "bad-diffbits"); } - + // Check timestamp against prev if (block.GetBlockTime() <= pindexPrev->GetMedianTimePast()) return state.Invalid(error("%s: block's timestamp is too early", __func__), REJECT_INVALID, "time-too-old"); - + if (fCheckpointsEnabled) { // Check that the block chain matches the known block chain up to a checkpoint @@ -3648,7 +3685,7 @@ bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& sta if (block.nVersion < 4) return state.Invalid(error("%s : rejected nVersion<4 block", __func__), REJECT_OBSOLETE, "bad-version"); - + return true; } @@ -3656,24 +3693,24 @@ bool ContextualCheckBlock(const CBlock& block, CValidationState& state, CBlockIn { const int nHeight = pindexPrev == NULL ? 0 : pindexPrev->nHeight + 1; const Consensus::Params& consensusParams = Params().GetConsensus(); - + // Check that all transactions are finalized BOOST_FOREACH(const CTransaction& tx, block.vtx) { - + // Check transaction contextually against consensus rules at block height if (!ContextualCheckTransaction(tx, state, nHeight, 100)) { return false; // Failure reason has been set in validation state object } - + int nLockTimeFlags = 0; int64_t nLockTimeCutoff = (nLockTimeFlags & LOCKTIME_MEDIAN_TIME_PAST) - ? pindexPrev->GetMedianTimePast() - : block.GetBlockTime(); + ? pindexPrev->GetMedianTimePast() + : block.GetBlockTime(); if (!IsFinalTx(tx, nHeight, nLockTimeCutoff)) { return state.DoS(10, error("%s: contains a non-final transaction", __func__), REJECT_INVALID, "bad-txns-nonfinal"); } } - + // Enforce BIP 34 rule that the coinbase starts with serialized block height. // In Zcash this has been enforced since launch, except that the genesis // block didn't include the height in the coinbase (see Zcash protocol spec @@ -3686,7 +3723,7 @@ bool ContextualCheckBlock(const CBlock& block, CValidationState& state, CBlockIn return state.DoS(100, error("%s: block height mismatch in coinbase", __func__), REJECT_INVALID, "bad-cb-height"); } } - + return true; } @@ -3703,8 +3740,11 @@ bool AcceptBlockHeader(const CBlockHeader& block, CValidationState& state, CBloc pindex = miSelf->second; if (ppindex) *ppindex = pindex; - if (pindex != 0 && pindex->nStatus & BLOCK_FAILED_MASK) + if ( pindex != 0 && pindex->nStatus & BLOCK_FAILED_MASK ) + { + komodo_reverify_blockcheck(state,pindex->nHeight,pindex); return state.Invalid(error("%s: block is marked invalid", __func__), 0, "duplicate"); + } if ( pindex != 0 && IsInitialBlockDownload() == 0 ) // jl777 debug test { if (!CheckBlockHeader(pindex->nHeight,pindex, block, state)) @@ -3734,17 +3774,16 @@ bool AcceptBlockHeader(const CBlockHeader& block, CValidationState& state, CBloc if (!ContextualCheckBlockHeader(block, state, pindexPrev)) { pindex->nStatus |= BLOCK_FAILED_MASK; - fprintf(stderr,"known block.%d failing ContextualCheckBlockHeader\n",(int32_t)pindex->nHeight); + //fprintf(stderr,"known block.%d failing ContextualCheckBlockHeader\n",(int32_t)pindex->nHeight); return false; } } - return true; } - + if (!CheckBlockHeader(*ppindex!=0?(*ppindex)->nHeight:0,*ppindex, block, state)) return false; - + // Get prev block index CBlockIndex* pindexPrev = NULL; if (hash != chainparams.GetConsensus().hashGenesisBlock) { @@ -3770,13 +3809,13 @@ bool AcceptBlock(CBlock& block, CValidationState& state, CBlockIndex** ppindex, { const CChainParams& chainparams = Params(); AssertLockHeld(cs_main); - + CBlockIndex *&pindex = *ppindex; if (!AcceptBlockHeader(block, state, &pindex)) return false; if ( pindex == 0 ) { - fprintf(stderr,"AcceptBlock error null pindex\n"); + //fprintf(stderr,"AcceptBlock error null pindex\n"); return false; } // Try to process all requested blocks that we don't have, but only @@ -3790,7 +3829,7 @@ bool AcceptBlock(CBlock& block, CValidationState& state, CBlockIndex** ppindex, // regardless of whether pruning is enabled; it should generally be safe to // not process unrequested blocks. bool fTooFarAhead = (pindex->nHeight > int(chainActive.Height() + MIN_BLOCKS_TO_KEEP)); - + // TODO: deal better with return value and error conditions for duplicate // and unrequested blocks. if (fAlreadyHave) return true; @@ -3799,7 +3838,7 @@ bool AcceptBlock(CBlock& block, CValidationState& state, CBlockIndex** ppindex, if (!fHasMoreWork) return true; // Don't process less-work chains if (fTooFarAhead) return true; // Block height is too high } - + // See method docstring for why this is always disabled auto verifier = libzcash::ProofVerifier::Disabled(); if ((!CheckBlock(pindex->nHeight,pindex,block, state, verifier)) || !ContextualCheckBlock(block, state, pindex->pprev)) { @@ -3809,9 +3848,9 @@ bool AcceptBlock(CBlock& block, CValidationState& state, CBlockIndex** ppindex, } return false; } - + int nHeight = pindex->nHeight; - + // Write block to history file try { unsigned int nBlockSize = ::GetSerializeSize(block, SER_DISK, CLIENT_VERSION); @@ -3828,10 +3867,10 @@ bool AcceptBlock(CBlock& block, CValidationState& state, CBlockIndex** ppindex, } catch (const std::runtime_error& e) { return AbortNode(state, std::string("System error: ") + e.what()); } - + if (fCheckForPruning) FlushStateToDisk(state, FLUSH_STATE_NONE); // we just allocated more disk space for block files - + return true; } @@ -3863,12 +3902,15 @@ bool ProcessNewBlock(int32_t height,CValidationState &state, CNode* pfrom, CBloc LOCK(cs_main); bool fRequested = MarkBlockAsReceived(pblock->GetHash()); fRequested |= fForceProcessing; - if (!checked) { + if (!checked) + { if ( pfrom != 0 ) + { Misbehaving(pfrom->GetId(), 1); + } return error("%s: CheckBlock FAILED", __func__); } - + // Store to disk CBlockIndex *pindex = NULL; bool ret = AcceptBlock(*pblock, state, &pindex, fRequested, dbp); @@ -3879,10 +3921,10 @@ bool ProcessNewBlock(int32_t height,CValidationState &state, CNode* pfrom, CBloc if (!ret) return error("%s: AcceptBlock FAILED", __func__); } - + if (!ActivateBestChain(state, pblock)) return error("%s: ActivateBestChain failed", __func__); - + return true; } @@ -3890,14 +3932,14 @@ bool TestBlockValidity(CValidationState &state, const CBlock& block, CBlockIndex { AssertLockHeld(cs_main); assert(pindexPrev == chainActive.Tip()); - + CCoinsViewCache viewNew(pcoinsTip); CBlockIndex indexDummy(block); indexDummy.pprev = pindexPrev; indexDummy.nHeight = pindexPrev->nHeight + 1; // JoinSplit proofs are verified in ConnectBlock auto verifier = libzcash::ProofVerifier::Disabled(); - + // NOTE: CheckBlockHeader is called by CheckBlock if (!ContextualCheckBlockHeader(block, state, pindexPrev)) { @@ -3920,7 +3962,7 @@ bool TestBlockValidity(CValidationState &state, const CBlock& block, CBlockIndex return false; } assert(state.IsValid()); - + return true; } @@ -3950,7 +3992,7 @@ void PruneOneBlockFile(const int fileNumber) pindex->nDataPos = 0; pindex->nUndoPos = 0; setDirtyBlockIndex.insert(pindex); - + // Prune from mapBlocksUnlinked -- any block we prune would have // to be downloaded again in order to consider its chain, at which // point it would be considered as a candidate for @@ -3965,7 +4007,7 @@ void PruneOneBlockFile(const int fileNumber) } } } - + vinfoBlockFile[fileNumber].SetNull(); setDirtyFileInfo.insert(fileNumber); } @@ -3991,7 +4033,7 @@ void FindFilesToPrune(std::set& setFilesToPrune) if (chainActive.Tip()->nHeight <= Params().PruneAfterHeight()) { return; } - + unsigned int nLastBlockWeCanPrune = chainActive.Tip()->nHeight - MIN_BLOCKS_TO_KEEP; uint64_t nCurrentUsage = CalculateCurrentUsage(); // We don't check to prune until after we've allocated new space for files @@ -4000,21 +4042,21 @@ void FindFilesToPrune(std::set& setFilesToPrune) uint64_t nBuffer = BLOCKFILE_CHUNK_SIZE + UNDOFILE_CHUNK_SIZE; uint64_t nBytesToPrune; int count=0; - + if (nCurrentUsage + nBuffer >= nPruneTarget) { for (int fileNumber = 0; fileNumber < nLastBlockFile; fileNumber++) { nBytesToPrune = vinfoBlockFile[fileNumber].nSize + vinfoBlockFile[fileNumber].nUndoSize; - + if (vinfoBlockFile[fileNumber].nSize == 0) continue; - + if (nCurrentUsage + nBuffer < nPruneTarget) // are we below our target? break; - + // don't prune files that could have a block within MIN_BLOCKS_TO_KEEP of the main chain's tip but keep scanning if (vinfoBlockFile[fileNumber].nHeightLast > nLastBlockWeCanPrune) continue; - + PruneOneBlockFile(fileNumber); // Queue up the files for removal setFilesToPrune.insert(fileNumber); @@ -4022,24 +4064,25 @@ void FindFilesToPrune(std::set& setFilesToPrune) count++; } } - + LogPrint("prune", "Prune: target=%dMiB actual=%dMiB diff=%dMiB max_prune_height=%d removed %d blk/rev pairs\n", - nPruneTarget/1024/1024, nCurrentUsage/1024/1024, - ((int64_t)nPruneTarget - (int64_t)nCurrentUsage)/1024/1024, - nLastBlockWeCanPrune, count); + nPruneTarget/1024/1024, nCurrentUsage/1024/1024, + ((int64_t)nPruneTarget - (int64_t)nCurrentUsage)/1024/1024, + nLastBlockWeCanPrune, count); } bool CheckDiskSpace(uint64_t nAdditionalBytes) { uint64_t nFreeBytesAvailable = boost::filesystem::space(GetDataDir()).available; - + // Check for nMinDiskSpace bytes (currently 50MB) if (nFreeBytesAvailable < nMinDiskSpace + nAdditionalBytes) return AbortNode("Disk space is low!", _("Error: Disk space is low!")); - + return true; } + FILE* OpenDiskFile(const CDiskBlockPos &pos, const char *prefix, bool fReadOnly) { static int32_t didinit[1000]; long fsize,fpos; int32_t incr = 16*1024*1024; @@ -4101,30 +4144,32 @@ CBlockIndex * InsertBlockIndex(uint256 hash) { if (hash.IsNull()) return NULL; - + // Return existing BlockMap::iterator mi = mapBlockIndex.find(hash); if (mi != mapBlockIndex.end()) return (*mi).second; - + // Create new CBlockIndex* pindexNew = new CBlockIndex(); if (!pindexNew) throw runtime_error("LoadBlockIndex(): new CBlockIndex failed"); mi = mapBlockIndex.insert(make_pair(hash, pindexNew)).first; pindexNew->phashBlock = &((*mi).first); - + return pindexNew; } +//void komodo_pindex_init(CBlockIndex *pindex,int32_t height); + bool static LoadBlockIndexDB() { const CChainParams& chainparams = Params(); if (!pblocktree->LoadBlockIndexGuts()) return false; - + boost::this_thread::interruption_point(); - + // Calculate nChainWork vector > vSortedByHeight; vSortedByHeight.reserve(mapBlockIndex.size()); @@ -4132,6 +4177,7 @@ bool static LoadBlockIndexDB() { CBlockIndex* pindex = item.second; vSortedByHeight.push_back(make_pair(pindex->nHeight, pindex)); + //komodo_pindex_init(pindex,(int32_t)pindex->nHeight); } sort(vSortedByHeight.begin(), vSortedByHeight.end()); BOOST_FOREACH(const PAIRTYPE(int, CBlockIndex*)& item, vSortedByHeight) @@ -4180,8 +4226,9 @@ bool static LoadBlockIndexDB() pindex->BuildSkip(); if (pindex->IsValid(BLOCK_VALID_TREE) && (pindexBestHeader == NULL || CBlockIndexWorkComparator()(pindexBestHeader, pindex))) pindexBestHeader = pindex; + //komodo_pindex_init(pindex,(int32_t)pindex->nHeight); } - + // Load block file info pblocktree->ReadLastBlockFile(nLastBlockFile); vinfoBlockFile.resize(nLastBlockFile + 1); @@ -4198,7 +4245,7 @@ bool static LoadBlockIndexDB() break; } } - + // Check presence of blk files LogPrintf("Checking all blk files are present...\n"); set setBlkDataFiles; @@ -4208,6 +4255,7 @@ bool static LoadBlockIndexDB() if (pindex->nStatus & BLOCK_HAVE_DATA) { setBlkDataFiles.insert(pindex->nFile); } + //komodo_pindex_init(pindex,(int32_t)pindex->nHeight); } for (std::set::iterator it = setBlkDataFiles.begin(); it != setBlkDataFiles.end(); it++) { @@ -4216,21 +4264,21 @@ bool static LoadBlockIndexDB() return false; } } - + // Check whether we have ever pruned block & undo files pblocktree->ReadFlag("prunedblockfiles", fHavePruned); if (fHavePruned) LogPrintf("LoadBlockIndexDB(): Block files have previously been pruned\n"); - + // Check whether we need to continue reindexing bool fReindexing = false; pblocktree->ReadReindexing(fReindexing); fReindex |= fReindexing; - + // Check whether we have a transaction index pblocktree->ReadFlag("txindex", fTxIndex); LogPrintf("%s: transaction index %s\n", __func__, fTxIndex ? "enabled" : "disabled"); - + // Fill in-memory data BOOST_FOREACH(const PAIRTYPE(uint256, CBlockIndex*)& item, mapBlockIndex) { @@ -4243,8 +4291,9 @@ bool static LoadBlockIndexDB() if (pindex->pprev) { pindex->pprev->hashAnchorEnd = pindex->hashAnchor; } + //komodo_pindex_init(pindex,(int32_t)pindex->nHeight); } - + // Load pointer to end of best chain BlockMap::iterator it = mapBlockIndex.find(pcoinsTip->GetBestBlock()); if (it == mapBlockIndex.end()) @@ -4252,16 +4301,16 @@ bool static LoadBlockIndexDB() chainActive.SetTip(it->second); // Set hashAnchorEnd for the end of best chain it->second->hashAnchorEnd = pcoinsTip->GetBestAnchor(); - + PruneBlockIndexCandidates(); - + LogPrintf("%s: hashBestChain=%s height=%d date=%s progress=%f\n", __func__, - chainActive.Tip()->GetBlockHash().ToString(), chainActive.Height(), - DateTimeStrFormat("%Y-%m-%d %H:%M:%S", chainActive.Tip()->GetBlockTime()), - Checkpoints::GuessVerificationProgress(chainparams.Checkpoints(), chainActive.Tip())); - + chainActive.Tip()->GetBlockHash().ToString(), chainActive.Height(), + DateTimeStrFormat("%Y-%m-%d %H:%M:%S", chainActive.Tip()->GetBlockTime()), + Checkpoints::GuessVerificationProgress(chainparams.Checkpoints(), chainActive.Tip())); + EnforceNodeDeprecation(chainActive.Height(), true); - + return true; } @@ -4280,7 +4329,7 @@ bool CVerifyDB::VerifyDB(CCoinsView *coinsview, int nCheckLevel, int nCheckDepth LOCK(cs_main); if (chainActive.Tip() == NULL || chainActive.Tip()->pprev == NULL) return true; - + // Verify blocks in the best chain if (nCheckDepth <= 0) nCheckDepth = 1000000000; // suffices until the year 19000 @@ -4334,7 +4383,7 @@ bool CVerifyDB::VerifyDB(CCoinsView *coinsview, int nCheckLevel, int nCheckDepth } if (pindexFailure) return error("VerifyDB(): *** coin database inconsistencies found (last %i blocks, %i good transactions before that)\n", chainActive.Height() - pindexFailure->nHeight + 1, nGoodTransactions); - + // check level 4: try reconnecting blocks if (nCheckLevel >= 4) { CBlockIndex *pindex = pindexState; @@ -4349,16 +4398,16 @@ bool CVerifyDB::VerifyDB(CCoinsView *coinsview, int nCheckLevel, int nCheckDepth return error("VerifyDB(): *** found unconnectable block at %d, hash=%s", pindex->nHeight, pindex->GetBlockHash().ToString()); } } - + LogPrintf("No coin database inconsistencies in last %i blocks (%i transactions)\n", chainActive.Height() - pindexState->nHeight, nGoodTransactions); - + return true; } bool RewindBlockIndex(const CChainParams& params) { LOCK(cs_main); - + // RewindBlockIndex is called after LoadBlockIndex, so at this point every block // index will have nCachedBranchId set based on the values previously persisted // to disk. By definition, a set nCachedBranchId means that the block was @@ -4373,10 +4422,10 @@ bool RewindBlockIndex(const CChainParams& params) bool fFlagSet = pindex->nStatus & BLOCK_ACTIVATES_UPGRADE; bool fFlagExpected = IsActivationHeightForAnyUpgrade(pindex->nHeight, consensus); return fFlagSet == fFlagExpected && - pindex->nCachedBranchId && - *pindex->nCachedBranchId == CurrentEpochBranchId(pindex->nHeight, consensus); + pindex->nCachedBranchId && + *pindex->nCachedBranchId == CurrentEpochBranchId(pindex->nHeight, consensus); }; - + int nHeight = 1; while (nHeight <= chainActive.Height()) { if (!sufficientlyValidated(chainActive[nHeight])) { @@ -4384,28 +4433,28 @@ bool RewindBlockIndex(const CChainParams& params) } nHeight++; } - + // nHeight is now the height of the first insufficiently-validated block, or tipheight + 1 auto rewindLength = chainActive.Height() - nHeight; if (rewindLength > 0 && rewindLength > MAX_REORG_LENGTH) { auto pindexOldTip = chainActive.Tip(); auto pindexRewind = chainActive[nHeight - 1]; auto msg = strprintf(_( - "A block chain rewind has been detected that would roll back %d blocks! " - "This is larger than the maximum of %d blocks, and so the node is shutting down for your safety." - ), rewindLength, MAX_REORG_LENGTH) + "\n\n" + - _("Rewind details") + ":\n" + - "- " + strprintf(_("Current tip: %s, height %d"), - pindexOldTip->phashBlock->GetHex(), pindexOldTip->nHeight) + "\n" + - "- " + strprintf(_("Rewinding to: %s, height %d"), - pindexRewind->phashBlock->GetHex(), pindexRewind->nHeight) + "\n\n" + - _("Please help, human!"); + "A block chain rewind has been detected that would roll back %d blocks! " + "This is larger than the maximum of %d blocks, and so the node is shutting down for your safety." + ), rewindLength, MAX_REORG_LENGTH) + "\n\n" + + _("Rewind details") + ":\n" + + "- " + strprintf(_("Current tip: %s, height %d"), + pindexOldTip->phashBlock->GetHex(), pindexOldTip->nHeight) + "\n" + + "- " + strprintf(_("Rewinding to: %s, height %d"), + pindexRewind->phashBlock->GetHex(), pindexRewind->nHeight) + "\n\n" + + _("Please help, human!"); LogPrintf("*** %s\n", msg); uiInterface.ThreadSafeMessageBox(msg, "", CClientUIInterface::MSG_ERROR); StartShutdown(); return false; } - + CValidationState state; CBlockIndex* pindex = chainActive.Tip(); while (chainActive.Height() >= nHeight) { @@ -4424,13 +4473,13 @@ bool RewindBlockIndex(const CChainParams& params) if (!FlushStateToDisk(state, FLUSH_STATE_PERIODIC)) return false; } - + // Reduce validity flag and have-data flags. // We do this after actual disconnecting, otherwise we'll end up writing the lack of data // to disk before writing the chainstate, resulting in a failure to continue if interrupted. for (BlockMap::iterator it = mapBlockIndex.begin(); it != mapBlockIndex.end(); it++) { CBlockIndex* pindexIter = it->second; - + // Note: If we encounter an insufficiently validated block that // is on chainActive, it must be because we are a pruning node, and // this block or some successor doesn't HAVE_DATA, so we were unable to @@ -4439,8 +4488,8 @@ bool RewindBlockIndex(const CChainParams& params) if (!sufficientlyValidated(pindexIter) && !chainActive.Contains(pindexIter)) { // Reduce validity pindexIter->nStatus = - std::min(pindexIter->nStatus & BLOCK_VALID_MASK, BLOCK_VALID_TREE) | - (pindexIter->nStatus & ~BLOCK_VALID_MASK); + std::min(pindexIter->nStatus & BLOCK_VALID_MASK, BLOCK_VALID_TREE) | + (pindexIter->nStatus & ~BLOCK_VALID_MASK); // Remove have-data flags pindexIter->nStatus &= ~(BLOCK_HAVE_DATA | BLOCK_HAVE_UNDO); // Remove branch ID @@ -4458,6 +4507,12 @@ bool RewindBlockIndex(const CChainParams& params) pindexIter->nSequenceId = 0; // Make sure it gets written setDirtyBlockIndex.insert(pindexIter); + if (pindexIter == pindexBestInvalid) + { + fprintf(stderr,"Reset invalid block marker if it was pointing to this block\n"); + pindexBestInvalid = NULL; + } + // Update indices setBlockIndexCandidates.erase(pindexIter); auto ret = mapBlocksUnlinked.equal_range(pindexIter->pprev); @@ -4472,15 +4527,15 @@ bool RewindBlockIndex(const CChainParams& params) setBlockIndexCandidates.insert(pindexIter); } } - + PruneBlockIndexCandidates(); - + CheckBlockIndex(); - + if (!FlushStateToDisk(state, FLUSH_STATE_ALWAYS)) { return false; } - + return true; } @@ -4507,7 +4562,7 @@ void UnloadBlockIndex() setDirtyFileInfo.clear(); mapNodeState.clear(); recentRejects.reset(NULL); - + BOOST_FOREACH(BlockMap::value_type& entry, mapBlockIndex) { delete entry.second; } @@ -4532,19 +4587,19 @@ bool LoadBlockIndex() bool InitBlockIndex() { const CChainParams& chainparams = Params(); LOCK(cs_main); - + // Initialize global variables that cannot be constructed at startup. recentRejects.reset(new CRollingBloomFilter(120000, 0.000001)); - + // Check whether we're already initialized if (chainActive.Genesis() != NULL) return true; - + // Use the provided setting for -txindex in the new database fTxIndex = GetBoolArg("-txindex", true); pblocktree->WriteFlag("txindex", fTxIndex); LogPrintf("Initializing databases...\n"); - + // Only add the genesis block if not reindexing (in which case we reuse the one already on disk) if (!fReindex) { try { @@ -4570,7 +4625,7 @@ bool InitBlockIndex() { return error("LoadBlockIndex(): failed to initialize block database: %s", e.what()); } } - + return true; } @@ -4582,7 +4637,7 @@ bool LoadExternalBlockFile(FILE* fileIn, CDiskBlockPos *dbp) // Map of disk positions for blocks with unknown parent (only used for reindex) static std::multimap mapBlocksUnknownParent; int64_t nStart = GetTimeMillis(); - + int nLoaded = 0; try { // This takes over fileIn and calls fclose() on it in the CBufferedFile destructor @@ -4590,7 +4645,7 @@ bool LoadExternalBlockFile(FILE* fileIn, CDiskBlockPos *dbp) uint64_t nRewind = blkdat.GetPos(); while (!blkdat.eof()) { boost::this_thread::interruption_point(); - + blkdat.SetPos(nRewind); nRewind++; // start one byte further next time, in case of failure blkdat.SetLimit(); // remove former limit @@ -4621,17 +4676,17 @@ bool LoadExternalBlockFile(FILE* fileIn, CDiskBlockPos *dbp) CBlock block; blkdat >> block; nRewind = blkdat.GetPos(); - + // detect out of order blocks, and store them for later uint256 hash = block.GetHash(); if (hash != chainparams.GetConsensus().hashGenesisBlock && mapBlockIndex.find(block.hashPrevBlock) == mapBlockIndex.end()) { LogPrint("reindex", "%s: Out of order block %s, parent %s not known\n", __func__, hash.ToString(), - block.hashPrevBlock.ToString()); + block.hashPrevBlock.ToString()); if (dbp) mapBlocksUnknownParent.insert(std::make_pair(block.hashPrevBlock, *dbp)); continue; } - + // process in case the block isn't known yet if (mapBlockIndex.count(hash) == 0 || (mapBlockIndex[hash]->nStatus & BLOCK_HAVE_DATA) == 0) { CValidationState state; @@ -4642,7 +4697,7 @@ bool LoadExternalBlockFile(FILE* fileIn, CDiskBlockPos *dbp) } else if (hash != chainparams.GetConsensus().hashGenesisBlock && mapBlockIndex[hash]->nHeight % 1000 == 0) { LogPrintf("Block Import: already had block %s at height %d\n", hash.ToString(), mapBlockIndex[hash]->nHeight); } - + // Recursively process earlier encountered successors of this block deque queue; queue.push_back(hash); @@ -4655,7 +4710,7 @@ bool LoadExternalBlockFile(FILE* fileIn, CDiskBlockPos *dbp) if (ReadBlockFromDisk(mapBlockIndex[hash]!=0?mapBlockIndex[hash]->nHeight:0,block, it->second)) { LogPrintf("%s: Processing out of order child %s of %s\n", __func__, block.GetHash().ToString(), - head.ToString()); + head.ToString()); CValidationState dummy; if (ProcessNewBlock(0,dummy, NULL, &block, true, &it->second)) { @@ -4685,9 +4740,9 @@ void static CheckBlockIndex() if (!fCheckBlockIndex) { return; } - + LOCK(cs_main); - + // During a reindex, we read the genesis block and call CheckBlockIndex before ActivateBestChain, // so we have the genesis block in mapBlockIndex but no active chain. (A few of the tests when // iterating the block tree require that chainActive has been initialized.) @@ -4695,20 +4750,20 @@ void static CheckBlockIndex() assert(mapBlockIndex.size() <= 1); return; } - + // Build forward-pointing map of the entire block tree. std::multimap forward; for (BlockMap::iterator it = mapBlockIndex.begin(); it != mapBlockIndex.end(); it++) { - forward.insert(std::make_pair(it->second->pprev, it->second)); + forward.insert(std::make_pair(it->second->pprev, it->second)); } - + assert(forward.size() == mapBlockIndex.size()); - + std::pair::iterator,std::multimap::iterator> rangeGenesis = forward.equal_range(NULL); CBlockIndex *pindex = rangeGenesis.first->second; rangeGenesis.first++; assert(rangeGenesis.first == rangeGenesis.second); // There is only one index entry with parent NULL. - + // Iterate over the entire block tree, using depth-first search. // Along the way, remember whether there are blocks on the path from genesis // block being explored which are the first to have certain properties. @@ -4730,7 +4785,7 @@ void static CheckBlockIndex() if (pindex->pprev != NULL && pindexFirstNotTransactionsValid == NULL && (pindex->nStatus & BLOCK_VALID_MASK) < BLOCK_VALID_TRANSACTIONS) pindexFirstNotTransactionsValid = pindex; if (pindex->pprev != NULL && pindexFirstNotChainValid == NULL && (pindex->nStatus & BLOCK_VALID_MASK) < BLOCK_VALID_CHAIN) pindexFirstNotChainValid = pindex; if (pindex->pprev != NULL && pindexFirstNotScriptsValid == NULL && (pindex->nStatus & BLOCK_VALID_MASK) < BLOCK_VALID_SCRIPTS) pindexFirstNotScriptsValid = pindex; - + // Begin: actual consistency checks. if (pindex->pprev == NULL) { // Genesis block checks. @@ -4816,7 +4871,7 @@ void static CheckBlockIndex() } // assert(pindex->GetBlockHash() == pindex->GetBlockHeader().GetHash()); // Perhaps too slow // End: actual consistency checks. - + // Try descending into the first subnode. std::pair::iterator,std::multimap::iterator> range = forward.equal_range(pindex); if (range.first != range.second) { @@ -4859,7 +4914,7 @@ void static CheckBlockIndex() } } } - + // Check that we actually traversed the entire map. assert(nNodes == forward.size()); } @@ -4874,20 +4929,20 @@ std::string GetWarnings(const std::string& strFor) int nPriority = 0; string strStatusBar; string strRPC; - + if (!CLIENT_VERSION_IS_RELEASE) strStatusBar = _("This is a pre-release test build - use at your own risk - do not use for mining or merchant applications"); - + if (GetBoolArg("-testsafemode", false)) strStatusBar = strRPC = "testsafemode enabled"; - + // Misc warnings like out of disk space and clock is wrong if (strMiscWarning != "") { nPriority = 1000; strStatusBar = strMiscWarning; } - + if (fLargeWorkForkFound) { nPriority = 2000; @@ -4898,7 +4953,7 @@ std::string GetWarnings(const std::string& strFor) nPriority = 2000; strStatusBar = strRPC = _("Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade."); } - + // Alerts { LOCK(cs_mapAlerts); @@ -4915,7 +4970,7 @@ std::string GetWarnings(const std::string& strFor) } } } - + if (strFor == "statusbar") return strStatusBar; else if (strFor == "rpc") @@ -4941,7 +4996,7 @@ bool static AlreadyHave(const CInv& inv) EXCLUSIVE_LOCKS_REQUIRED(cs_main) { switch (inv.type) { - case MSG_TX: + case MSG_TX: { assert(recentRejects); if (chainActive.Tip()->GetBlockHash() != hashRecentRejectsChainTip) @@ -4953,14 +5008,14 @@ bool static AlreadyHave(const CInv& inv) EXCLUSIVE_LOCKS_REQUIRED(cs_main) hashRecentRejectsChainTip = chainActive.Tip()->GetBlockHash(); recentRejects->reset(); } - + return recentRejects->contains(inv.hash) || - mempool.exists(inv.hash) || - mapOrphanTransactions.count(inv.hash) || - pcoinsTip->HaveCoins(inv.hash); + mempool.exists(inv.hash) || + mapOrphanTransactions.count(inv.hash) || + pcoinsTip->HaveCoins(inv.hash); } - case MSG_BLOCK: - return mapBlockIndex.count(inv.hash); + case MSG_BLOCK: + return mapBlockIndex.count(inv.hash); } // Don't know what it is, just say we already got one return true; @@ -4969,21 +5024,21 @@ bool static AlreadyHave(const CInv& inv) EXCLUSIVE_LOCKS_REQUIRED(cs_main) void static ProcessGetData(CNode* pfrom) { std::deque::iterator it = pfrom->vRecvGetData.begin(); - + vector vNotFound; - + LOCK(cs_main); - + while (it != pfrom->vRecvGetData.end()) { // Don't bother if send buffer is too full to respond anyway if (pfrom->nSendSize >= SendBufferSize()) break; - + const CInv &inv = *it; { boost::this_thread::interruption_point(); it++; - + if (inv.type == MSG_BLOCK || inv.type == MSG_FILTERED_BLOCK) { bool send = false; @@ -4998,8 +5053,8 @@ void static ProcessGetData(CNode* pfrom) // chain if they are valid, and no more than a month older (both in time, and in // best equivalent proof of work) than the best header chain we know about. send = mi->second->IsValid(BLOCK_VALID_SCRIPTS) && (pindexBestHeader != NULL) && - (pindexBestHeader->GetBlockTime() - mi->second->GetBlockTime() < nOneMonth) && - (GetBlockProofEquivalentTime(*pindexBestHeader, *mi->second, *pindexBestHeader, Params().GetConsensus()) < nOneMonth); + (pindexBestHeader->GetBlockTime() - mi->second->GetBlockTime() < nOneMonth) && + (GetBlockProofEquivalentTime(*pindexBestHeader, *mi->second, *pindexBestHeader, Params().GetConsensus()) < nOneMonth); if (!send) { LogPrintf("%s: ignoring request from peer=%i for old block that isn't in the main chain\n", __func__, pfrom->GetId()); } @@ -5087,17 +5142,17 @@ void static ProcessGetData(CNode* pfrom) vNotFound.push_back(inv); } } - + // Track requests for our stuff. GetMainSignals().Inventory(inv.hash); - + if (inv.type == MSG_BLOCK || inv.type == MSG_FILTERED_BLOCK) break; } } - + pfrom->vRecvGetData.erase(pfrom->vRecvGetData.begin(), it); - + if (!vNotFound.empty()) { // Let the peer know that we didn't find what it asked for, so it doesn't // have to wait around forever. Currently only SPV clients actually care @@ -5120,10 +5175,10 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, LogPrintf("dropmessagestest DROPPING RECV MESSAGE\n"); return true; } - - - - + + + + if (strCommand == "version") { // Each connection can only send one version message @@ -5133,7 +5188,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, Misbehaving(pfrom->GetId(), 1); return false; } - + int64_t nTime; CAddress addrMe; CAddress addrFrom; @@ -5148,7 +5203,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, pfrom->fDisconnect = true; return false; } - + // When Overwinter is active, reject incoming connections from non-Overwinter nodes const Consensus::Params& params = Params().GetConsensus(); if (NetworkUpgradeActive(GetHeight(), params, Consensus::UPGRADE_OVERWINTER) @@ -5156,12 +5211,12 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, { LogPrintf("peer=%d using obsolete version %i; disconnecting\n", pfrom->id, pfrom->nVersion); pfrom->PushMessage("reject", strCommand, REJECT_OBSOLETE, - strprintf("Version must be %d or greater", - params.vUpgrades[Consensus::UPGRADE_OVERWINTER].nProtocolVersion)); + strprintf("Version must be %d or greater", + params.vUpgrades[Consensus::UPGRADE_OVERWINTER].nProtocolVersion)); pfrom->fDisconnect = true; return false; } - + if (pfrom->nVersion == 10300) pfrom->nVersion = 300; if (!vRecv.empty()) @@ -5176,7 +5231,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, vRecv >> pfrom->fRelayTxes; // set to true after we get the first filter* message else pfrom->fRelayTxes = true; - + // Disconnect if we connected to ourself if (nNonce == nLocalHostNonce && nNonce > 1) { @@ -5184,26 +5239,26 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, pfrom->fDisconnect = true; return true; } - + pfrom->addrLocal = addrMe; if (pfrom->fInbound && addrMe.IsRoutable()) { SeenLocal(addrMe); } - + // Be shy and don't send version until we hear if (pfrom->fInbound) pfrom->PushVersion(); - + pfrom->fClient = !(pfrom->nServices & NODE_NETWORK); - + // Potentially mark this peer as a preferred download peer. UpdatePreferredDownload(pfrom, State(pfrom->GetId())); - + // Change version pfrom->PushMessage("verack"); pfrom->ssSend.SetVersion(min(pfrom->nVersion, PROTOCOL_VERSION)); - + if (!pfrom->fInbound) { // Advertise our address @@ -5220,7 +5275,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, pfrom->PushAddress(addr); } } - + // Get recent addresses if (pfrom->fOneShot || pfrom->nVersion >= CADDR_TIME_VERSION || addrman.size() < 1000) { @@ -5235,72 +5290,72 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, addrman.Good(addrFrom); } } - + // Relay alerts { LOCK(cs_mapAlerts); BOOST_FOREACH(PAIRTYPE(const uint256, CAlert)& item, mapAlerts) - item.second.RelayTo(pfrom); + item.second.RelayTo(pfrom); } - + pfrom->fSuccessfullyConnected = true; - + string remoteAddr; if (fLogIPs) remoteAddr = ", peeraddr=" + pfrom->addr.ToString(); - + LogPrintf("receive version message: %s: version %d, blocks=%d, us=%s, peer=%d%s\n", pfrom->cleanSubVer, pfrom->nVersion, pfrom->nStartingHeight, addrMe.ToString(), pfrom->id, remoteAddr); - + int64_t nTimeOffset = nTime - GetTime(); pfrom->nTimeOffset = nTimeOffset; AddTimeData(pfrom->addr, nTimeOffset); } - - + + else if (pfrom->nVersion == 0) { // Must have a version message before anything else Misbehaving(pfrom->GetId(), 1); return false; } - - + + else if (strCommand == "verack") { pfrom->SetRecvVersion(min(pfrom->nVersion, PROTOCOL_VERSION)); - + // Mark this node as currently connected, so we update its timestamp later. if (pfrom->fNetworkNode) { LOCK(cs_main); State(pfrom->GetId())->fCurrentlyConnected = true; } } - - + + // Disconnect existing peer connection when: // 1. The version message has been received // 2. Overwinter is active // 3. Peer version is pre-Overwinter else if (NetworkUpgradeActive(GetHeight(), chainparams.GetConsensus(), Consensus::UPGRADE_OVERWINTER) - && (pfrom->nVersion < chainparams.GetConsensus().vUpgrades[Consensus::UPGRADE_OVERWINTER].nProtocolVersion)) + && (pfrom->nVersion < chainparams.GetConsensus().vUpgrades[Consensus::UPGRADE_OVERWINTER].nProtocolVersion)) { LogPrintf("peer=%d using obsolete version %i; disconnecting\n", pfrom->id, pfrom->nVersion); pfrom->PushMessage("reject", strCommand, REJECT_OBSOLETE, - strprintf("Version must be %d or greater", - chainparams.GetConsensus().vUpgrades[Consensus::UPGRADE_OVERWINTER].nProtocolVersion)); + strprintf("Version must be %d or greater", + chainparams.GetConsensus().vUpgrades[Consensus::UPGRADE_OVERWINTER].nProtocolVersion)); pfrom->fDisconnect = true; return false; } - - + + else if (strCommand == "addr") { vector vAddr; vRecv >> vAddr; - + // Don't want addr from older versions unless seeding if (pfrom->nVersion < CADDR_TIME_VERSION && addrman.size() > 1000) return true; @@ -5309,7 +5364,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, Misbehaving(pfrom->GetId(), 20); return error("message addr size() = %u", vAddr.size()); } - + // Store the new addresses vector vAddrOk; int64_t nNow = GetAdjustedTime(); @@ -5317,7 +5372,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, BOOST_FOREACH(CAddress& addr, vAddr) { boost::this_thread::interruption_point(); - + if (addr.nTime <= 100000000 || addr.nTime > nNow + 10 * 60) addr.nTime = nNow - 5 * 24 * 60 * 60; pfrom->AddAddressKnown(addr); @@ -5361,8 +5416,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, if (pfrom->fOneShot) pfrom->fDisconnect = true; } - - + + else if (strCommand == "inv") { vector vInv; @@ -5372,24 +5427,24 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, Misbehaving(pfrom->GetId(), 20); return error("message inv size() = %u", vInv.size()); } - + LOCK(cs_main); - + std::vector vToFetch; - + for (unsigned int nInv = 0; nInv < vInv.size(); nInv++) { const CInv &inv = vInv[nInv]; - + boost::this_thread::interruption_point(); pfrom->AddInventoryKnown(inv); - + bool fAlreadyHave = AlreadyHave(inv); LogPrint("net", "got inv: %s %s peer=%d\n", inv.ToString(), fAlreadyHave ? "have" : "new", pfrom->id); - + if (!fAlreadyHave && !fImporting && !fReindex && inv.type != MSG_BLOCK) pfrom->AskFor(inv); - + if (inv.type == MSG_BLOCK) { UpdateBlockAvailability(pfrom->GetId(), inv.hash); if (!fAlreadyHave && !fImporting && !fReindex && !mapBlocksInFlight.count(inv.hash)) { @@ -5413,21 +5468,21 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, LogPrint("net", "getheaders (%d) %s to peer=%d\n", pindexBestHeader->nHeight, inv.hash.ToString(), pfrom->id); } } - + // Track requests for our stuff GetMainSignals().Inventory(inv.hash); - + if (pfrom->nSendSize > (SendBufferSize() * 2)) { Misbehaving(pfrom->GetId(), 50); return error("send buffer size() = %u", pfrom->nSendSize); } } - + if (!vToFetch.empty()) pfrom->PushMessage("getdata", vToFetch); } - - + + else if (strCommand == "getdata") { vector vInv; @@ -5437,29 +5492,29 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, Misbehaving(pfrom->GetId(), 20); return error("message getdata size() = %u", vInv.size()); } - + if (fDebug || (vInv.size() != 1)) LogPrint("net", "received getdata (%u invsz) peer=%d\n", vInv.size(), pfrom->id); - + if ((fDebug && vInv.size() > 0) || (vInv.size() == 1)) LogPrint("net", "received getdata for: %s peer=%d\n", vInv[0].ToString(), pfrom->id); - + pfrom->vRecvGetData.insert(pfrom->vRecvGetData.end(), vInv.begin(), vInv.end()); ProcessGetData(pfrom); } - - + + else if (strCommand == "getblocks") { CBlockLocator locator; uint256 hashStop; vRecv >> locator >> hashStop; - + LOCK(cs_main); - + // Find the last block the caller has in the main chain CBlockIndex* pindex = FindForkInGlobalIndex(chainActive, locator); - + // Send the rest of the chain if (pindex) pindex = chainActive.Next(pindex); @@ -5483,19 +5538,19 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, } } } - - + + else if (strCommand == "getheaders") { CBlockLocator locator; uint256 hashStop; vRecv >> locator >> hashStop; - + LOCK(cs_main); - + if (IsInitialBlockDownload()) return true; - + CBlockIndex* pindex = NULL; if (locator.IsNull()) { @@ -5512,7 +5567,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, if (pindex) pindex = chainActive.Next(pindex); } - + // we must use CBlocks, as CBlockHeaders won't include the 0x00 nTx count at the end vector vHeaders; int nLimit = MAX_HEADERS_RESULTS; @@ -5535,37 +5590,37 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, fprintf(stderr,"you can ignore redundant getheaders from peer.%d %d prev.%d\n",(int32_t)pfrom->id,(int32_t)(pindex ? pindex->nHeight : -1),pfrom->lasthdrsreq); } } - - + + else if (strCommand == "tx") { vector vWorkQueue; vector vEraseQueue; CTransaction tx; vRecv >> tx; - + CInv inv(MSG_TX, tx.GetHash()); pfrom->AddInventoryKnown(inv); - + LOCK(cs_main); - + bool fMissingInputs = false; CValidationState state; - + pfrom->setAskFor.erase(inv.hash); mapAlreadyAskedFor.erase(inv); - + if (!AlreadyHave(inv) && AcceptToMemoryPool(mempool, state, tx, true, &fMissingInputs)) { mempool.check(pcoinsTip); RelayTransaction(tx); vWorkQueue.push_back(inv.hash); - + LogPrint("mempool", "AcceptToMemoryPool: peer=%d %s: accepted %s (poolsz %u)\n", - pfrom->id, pfrom->cleanSubVer, - tx.GetHash().ToString(), - mempool.mapTx.size()); - + pfrom->id, pfrom->cleanSubVer, + tx.GetHash().ToString(), + mempool.mapTx.size()); + // Recursively process any orphan transactions that depended on this one set setMisbehaving; for (unsigned int i = 0; i < vWorkQueue.size(); i++) @@ -5585,8 +5640,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, // resolution (that is, feeding people an invalid transaction based on LegitTxX in order to get // anyone relaying LegitTxX banned) CValidationState stateDummy; - - + + if (setMisbehaving.count(fromPeer)) continue; if (AcceptToMemoryPool(mempool, stateDummy, orphanTx, true, &fMissingInputs2)) @@ -5616,15 +5671,15 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, mempool.check(pcoinsTip); } } - + BOOST_FOREACH(uint256 hash, vEraseQueue) - EraseOrphanTx(hash); + EraseOrphanTx(hash); } // TODO: currently, prohibit joinsplits from entering mapOrphans else if (fMissingInputs && tx.vjoinsplit.size() == 0) { AddOrphanTx(tx, pfrom->GetId()); - + // DoS prevention: do not allow mapOrphanTransactions to grow unbounded unsigned int nMaxOrphanTx = (unsigned int)std::max((int64_t)0, GetArg("-maxorphantx", DEFAULT_MAX_ORPHAN_TRANSACTIONS)); unsigned int nEvicted = LimitOrphanTxSize(nMaxOrphanTx); @@ -5633,7 +5688,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, } else { assert(recentRejects); recentRejects->insert(tx.GetHash()); - + if (pfrom->fWhitelisted) { // Always relay transactions received from whitelisted peers, even // if they were already in the mempool or rejected from it due @@ -5649,7 +5704,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, RelayTransaction(tx); } else { LogPrintf("Not relaying invalid transaction %s from whitelisted peer=%d (%s (code %d))\n", - tx.GetHash().ToString(), pfrom->id, state.GetRejectReason(), state.GetRejectCode()); + tx.GetHash().ToString(), pfrom->id, state.GetRejectReason(), state.GetRejectCode()); } } } @@ -5657,20 +5712,20 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, if (state.IsInvalid(nDoS)) { LogPrint("mempool", "%s from peer=%d %s was not accepted into the memory pool: %s\n", tx.GetHash().ToString(), - pfrom->id, pfrom->cleanSubVer, - state.GetRejectReason()); + pfrom->id, pfrom->cleanSubVer, + state.GetRejectReason()); pfrom->PushMessage("reject", strCommand, state.GetRejectCode(), state.GetRejectReason().substr(0, MAX_REJECT_MESSAGE_LENGTH), inv.hash); if (nDoS > 0) Misbehaving(pfrom->GetId(), nDoS); } } - - + + else if (strCommand == "headers" && !fImporting && !fReindex) // Ignore headers received while importing { std::vector headers; - + // Bypass the normal CBlock deserialization, as we don't want to risk deserializing 2000 full blocks. unsigned int nCount = ReadCompactSize(vRecv); if (nCount > MAX_HEADERS_RESULTS) { @@ -5682,14 +5737,14 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, vRecv >> headers[n]; ReadCompactSize(vRecv); // ignore tx count; assume it is 0. } - + LOCK(cs_main); - + if (nCount == 0) { // Nothing interesting. Stop asking this peers for more headers. return true; } - + CBlockIndex *pindexLast = NULL; BOOST_FOREACH(const CBlockHeader& header, headers) { CValidationState state; @@ -5699,17 +5754,18 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, } if (!AcceptBlockHeader(header, state, &pindexLast)) { int nDoS; - if (state.IsInvalid(nDoS)) { + if (state.IsInvalid(nDoS)) + { if (nDoS > 0) Misbehaving(pfrom->GetId(), nDoS/nDoS); return error("invalid header received"); } } } - + if (pindexLast) UpdateBlockAvailability(pfrom->GetId(), pindexLast->GetBlockHash()); - + if (nCount == MAX_HEADERS_RESULTS && pindexLast) { // Headers message had its maximum size; the peer may have more headers. // TODO: optimize: if pindexLast is an ancestor of chainActive.Tip or pindexBestHeader, continue @@ -5721,20 +5777,20 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, pfrom->PushMessage("getheaders", chainActive.GetLocator(pindexLast), uint256()); } } - + CheckBlockIndex(); } - + else if (strCommand == "block" && !fImporting && !fReindex) // Ignore blocks received while importing { CBlock block; vRecv >> block; - + CInv inv(MSG_BLOCK, block.GetHash()); LogPrint("net", "received block %s peer=%d\n", inv.hash.ToString(), pfrom->id); - + pfrom->AddInventoryKnown(inv); - + CValidationState state; // Process all blocks from whitelisted peers, even if not requested, // unless we're still syncing with the network. @@ -5751,10 +5807,10 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, Misbehaving(pfrom->GetId(), nDoS); } } - + } - - + + // This asymmetric behavior for inbound and outbound connections was introduced // to prevent a fingerprinting attack: an attacker can send specific fake addresses // to users' AddrMan and later request them by sending getaddr messages. @@ -5769,18 +5825,18 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, return true; } pfrom->fSentAddr = true; - + pfrom->vAddrToSend.clear(); vector vAddr = addrman.GetAddr(); BOOST_FOREACH(const CAddress &addr, vAddr) - pfrom->PushAddress(addr); + pfrom->PushAddress(addr); } - - + + else if (strCommand == "mempool") { LOCK2(cs_main, pfrom->cs_filter); - + std::vector vtxid; mempool.queryHashes(vtxid); vector vInv; @@ -5790,7 +5846,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, bool fInMemPool = mempool.lookup(hash, tx); if (!fInMemPool) continue; // another thread removed since queryHashes, maybe... if ((pfrom->pfilter && pfrom->pfilter->IsRelevantAndUpdate(tx)) || - (!pfrom->pfilter)) + (!pfrom->pfilter)) vInv.push_back(inv); if (vInv.size() == MAX_INV_SZ) { pfrom->PushMessage("inv", vInv); @@ -5800,8 +5856,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, if (vInv.size() > 0) pfrom->PushMessage("inv", vInv); } - - + + else if (strCommand == "ping") { if (pfrom->nVersion > BIP0031_VERSION) @@ -5822,8 +5878,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, pfrom->PushMessage("pong", nonce); } } - - + + else if (strCommand == "pong") { int64_t pingUsecEnd = nTimeReceived; @@ -5831,10 +5887,10 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, size_t nAvail = vRecv.in_avail(); bool bPingFinished = false; std::string sProblem; - + if (nAvail >= sizeof(nonce)) { vRecv >> nonce; - + // Only process pong message if there is an outstanding ping (old ping without nonce should never pong) if (pfrom->nPingNonceSent != 0) { if (nonce == pfrom->nPingNonceSent) { @@ -5866,27 +5922,27 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, bPingFinished = true; sProblem = "Short payload"; } - + if (!(sProblem.empty())) { LogPrint("net", "pong peer=%d %s: %s, %x expected, %x received, %u bytes\n", - pfrom->id, - pfrom->cleanSubVer, - sProblem, - pfrom->nPingNonceSent, - nonce, - nAvail); + pfrom->id, + pfrom->cleanSubVer, + sProblem, + pfrom->nPingNonceSent, + nonce, + nAvail); } if (bPingFinished) { pfrom->nPingNonceSent = 0; } } - - + + else if (fAlerts && strCommand == "alert") { CAlert alert; vRecv >> alert; - + uint256 alertHash = alert.GetHash(); if (pfrom->setKnown.count(alertHash) == 0) { @@ -5897,7 +5953,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, { LOCK(cs_vNodes); BOOST_FOREACH(CNode* pnode, vNodes) - alert.RelayTo(pnode); + alert.RelayTo(pnode); } } else { @@ -5911,13 +5967,13 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, } } } - - + + else if (strCommand == "filterload") { CBloomFilter filter; vRecv >> filter; - + if (!filter.IsWithinSizeConstraints()) // There is no excuse for sending a too-large filter Misbehaving(pfrom->GetId(), 100); @@ -5930,13 +5986,13 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, } pfrom->fRelayTxes = true; } - - + + else if (strCommand == "filteradd") { vector vData; vRecv >> vData; - + // Nodes must NEVER send a data item > 520 bytes (the max size for a script data object, // and thus, the maximum size any matched object can have) in a filteradd message if (vData.size() > MAX_SCRIPT_ELEMENT_SIZE) @@ -5950,8 +6006,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, Misbehaving(pfrom->GetId(), 100); } } - - + + else if (strCommand == "filterclear") { LOCK(pfrom->cs_filter); @@ -5959,18 +6015,18 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, pfrom->pfilter = new CBloomFilter(); pfrom->fRelayTxes = true; } - - + + else if (strCommand == "reject") { if (fDebug) { try { string strMsg; unsigned char ccode; string strReason; vRecv >> LIMITED_STRING(strMsg, CMessageHeader::COMMAND_SIZE) >> ccode >> LIMITED_STRING(strReason, MAX_REJECT_MESSAGE_LENGTH); - + ostringstream ss; ss << strMsg << " code " << itostr(ccode) << ": " << strReason; - + if (strMsg == "block" || strMsg == "tx") { uint256 hash; @@ -5988,14 +6044,14 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, // We do not care about the NOTFOUND message, but logging an Unknown Command // message would be undesirable as we transmit it ourselves. } - + else { // Ignore unknown commands for extensibility LogPrint("net", "Unknown command \"%s\" from peer=%d\n", SanitizeString(strCommand), pfrom->id); } - - - + + + return true; } @@ -6004,7 +6060,7 @@ bool ProcessMessages(CNode* pfrom) { //if (fDebug) // LogPrintf("%s(%u messages)\n", __func__, pfrom->vRecvMsg.size()); - + // // Message format // (4) message start @@ -6014,41 +6070,41 @@ bool ProcessMessages(CNode* pfrom) // (x) data // bool fOk = true; - + if (!pfrom->vRecvGetData.empty()) ProcessGetData(pfrom); - + // this maintains the order of responses if (!pfrom->vRecvGetData.empty()) return fOk; - + std::deque::iterator it = pfrom->vRecvMsg.begin(); while (!pfrom->fDisconnect && it != pfrom->vRecvMsg.end()) { // Don't bother if send buffer is too full to respond anyway if (pfrom->nSendSize >= SendBufferSize()) break; - + // get next message CNetMessage& msg = *it; - + //if (fDebug) // LogPrintf("%s(message %u msgsz, %u bytes, complete:%s)\n", __func__, // msg.hdr.nMessageSize, msg.vRecv.size(), // msg.complete() ? "Y" : "N"); - + // end, if an incomplete message is found if (!msg.complete()) break; - + // at this point, any failure means we can delete the current message it++; - + // Scan for message start if (memcmp(msg.hdr.pchMessageStart, Params().MessageStart(), MESSAGE_START_SIZE) != 0) { LogPrintf("PROCESSMESSAGE: INVALID MESSAGESTART %s peer=%d\n", SanitizeString(msg.hdr.GetCommand()), pfrom->id); fOk = false; break; } - + // Read header CMessageHeader& hdr = msg.hdr; if (!hdr.IsValid(Params().MessageStart())) @@ -6057,10 +6113,10 @@ bool ProcessMessages(CNode* pfrom) continue; } string strCommand = hdr.GetCommand(); - + // Message size unsigned int nMessageSize = hdr.nMessageSize; - + // Checksum CDataStream& vRecv = msg.vRecv; uint256 hash = Hash(vRecv.begin(), vRecv.begin() + nMessageSize); @@ -6068,10 +6124,10 @@ bool ProcessMessages(CNode* pfrom) if (nChecksum != hdr.nChecksum) { LogPrintf("%s(%s, %u bytes): CHECKSUM ERROR nChecksum=%08x hdr.nChecksum=%08x\n", __func__, - SanitizeString(strCommand), nMessageSize, nChecksum, hdr.nChecksum); + SanitizeString(strCommand), nMessageSize, nChecksum, hdr.nChecksum); continue; } - + // Process message bool fRet = false; try @@ -6105,17 +6161,17 @@ bool ProcessMessages(CNode* pfrom) } catch (...) { PrintExceptionContinue(NULL, "ProcessMessages()"); } - + if (!fRet) LogPrintf("%s(%s, %u bytes) FAILED peer=%d\n", __func__, SanitizeString(strCommand), nMessageSize, pfrom->id); - + break; } - + // In case the connection got shut down, its receive buffer was wiped if (!pfrom->fDisconnect) pfrom->vRecvMsg.erase(pfrom->vRecvMsg.begin(), it); - + return fOk; } @@ -6127,7 +6183,7 @@ bool SendMessages(CNode* pto, bool fSendTrickle) // Don't send anything until we get its version message if (pto->nVersion == 0) return true; - + // // Message: ping // @@ -6156,11 +6212,11 @@ bool SendMessages(CNode* pto, bool fSendTrickle) pto->PushMessage("ping"); } } - + TRY_LOCK(cs_main, lockMain); // Acquire cs_main for IsInitialBlockDownload() and CNodeState() if (!lockMain) return true; - + // Address refresh broadcast static int64_t nLastRebroadcast; if (!IsInitialBlockDownload() && (GetTime() - nLastRebroadcast > 24 * 60 * 60)) @@ -6171,14 +6227,14 @@ bool SendMessages(CNode* pto, bool fSendTrickle) // Periodically clear addrKnown to allow refresh broadcasts if (nLastRebroadcast) pnode->addrKnown.reset(); - + // Rebroadcast our address AdvertizeLocal(pnode); } if (!vNodes.empty()) nLastRebroadcast = GetTime(); } - + // // Message: addr // @@ -6204,7 +6260,7 @@ bool SendMessages(CNode* pto, bool fSendTrickle) if (!vAddr.empty()) pto->PushMessage("addr", vAddr); } - + CNodeState &state = *State(pto->GetId()); if (state.fShouldBan) { if (pto->fWhitelisted) @@ -6220,11 +6276,11 @@ bool SendMessages(CNode* pto, bool fSendTrickle) } state.fShouldBan = false; } - + BOOST_FOREACH(const CBlockReject& reject, state.rejects) - pto->PushMessage("reject", (string)"block", reject.chRejectCode, reject.strRejectReason, reject.hashBlock); + pto->PushMessage("reject", (string)"block", reject.chRejectCode, reject.strRejectReason, reject.hashBlock); state.rejects.clear(); - + // Start block sync if (pindexBestHeader == NULL) pindexBestHeader = chainActive.Tip(); @@ -6239,7 +6295,7 @@ bool SendMessages(CNode* pto, bool fSendTrickle) pto->PushMessage("getheaders", chainActive.GetLocator(pindexStart), uint256()); } } - + // Resend wallet transactions that haven't gotten in a block yet // Except during reindex, importing and IBD, when old wallet // transactions become unconfirmed and spams other nodes. @@ -6247,7 +6303,7 @@ bool SendMessages(CNode* pto, bool fSendTrickle) { GetMainSignals().Broadcast(nTimeBestReceived); } - + // // Message: inventory // @@ -6261,7 +6317,7 @@ bool SendMessages(CNode* pto, bool fSendTrickle) { if (pto->setInventoryKnown.count(inv)) continue; - + // trickle out tx inv to protect privacy if (inv.type == MSG_TX && !fSendTrickle) { @@ -6272,14 +6328,14 @@ bool SendMessages(CNode* pto, bool fSendTrickle) uint256 hashRand = ArithToUint256(UintToArith256(inv.hash) ^ UintToArith256(hashSalt)); hashRand = Hash(BEGIN(hashRand), END(hashRand)); bool fTrickleWait = ((UintToArith256(hashRand) & 3) != 0); - + if (fTrickleWait) { vInvWait.push_back(inv); continue; } } - + // returns true if wasn't already contained in the set if (pto->setInventoryKnown.insert(inv).second) { @@ -6295,7 +6351,7 @@ bool SendMessages(CNode* pto, bool fSendTrickle) } if (!vInv.empty()) pto->PushMessage("inv", vInv); - + // Detect whether we're stalling int64_t nNow = GetTimeMicros(); if (!pto->fDisconnect && state.nStallingSince && state.nStallingSince < nNow - 1000000 * BLOCK_STALLING_TIMEOUT) { @@ -6327,7 +6383,7 @@ bool SendMessages(CNode* pto, bool fSendTrickle) pto->fDisconnect = true; } } - + // // Message: getdata (blocks) // @@ -6340,7 +6396,7 @@ bool SendMessages(CNode* pto, bool fSendTrickle) vGetData.push_back(CInv(MSG_BLOCK, pindex->GetBlockHash())); MarkBlockAsInFlight(pto->GetId(), pindex->GetBlockHash(), consensusParams, pindex); LogPrint("net", "Requesting block %s (%d) peer=%d\n", pindex->GetBlockHash().ToString(), - pindex->nHeight, pto->id); + pindex->nHeight, pto->id); } if (state.nBlocksInFlight == 0 && staller != -1) { if (State(staller)->nStallingSince == 0) { @@ -6349,7 +6405,7 @@ bool SendMessages(CNode* pto, bool fSendTrickle) } } } - + // // Message: getdata (non-blocks) // @@ -6374,14 +6430,14 @@ bool SendMessages(CNode* pto, bool fSendTrickle) } if (!vGetData.empty()) pto->PushMessage("getdata", vGetData); - + } return true; } - std::string CBlockFileInfo::ToString() const { - return strprintf("CBlockFileInfo(blocks=%u, size=%u, heights=%u...%u, time=%s...%s)", nBlocks, nSize, nHeightFirst, nHeightLast, DateTimeStrFormat("%Y-%m-%d", nTimeFirst), DateTimeStrFormat("%Y-%m-%d", nTimeLast)); - } +std::string CBlockFileInfo::ToString() const { + return strprintf("CBlockFileInfo(blocks=%u, size=%u, heights=%u...%u, time=%s...%s)", nBlocks, nSize, nHeightFirst, nHeightLast, DateTimeStrFormat("%Y-%m-%d", nTimeFirst), DateTimeStrFormat("%Y-%m-%d", nTimeLast)); +} @@ -6395,7 +6451,7 @@ public: for (; it1 != mapBlockIndex.end(); it1++) delete (*it1).second; mapBlockIndex.clear(); - + // orphan transactions mapOrphanTransactions.clear(); mapOrphanTransactionsByPrev.clear(); @@ -6404,7 +6460,7 @@ public: extern "C" const char* getDataDir() { - return GetDataDir().string().c_str(); + return GetDataDir().string().c_str(); } @@ -6412,14 +6468,14 @@ extern "C" const char* getDataDir() CMutableTransaction CreateNewContextualCMutableTransaction(const Consensus::Params& consensusParams, int nHeight) { CMutableTransaction mtx; - + bool isOverwintered = NetworkUpgradeActive(nHeight, consensusParams, Consensus::UPGRADE_OVERWINTER); if (isOverwintered) { mtx.fOverwintered = true; mtx.nVersionGroupId = OVERWINTER_VERSION_GROUP_ID; mtx.nVersion = 3; // Expiry height is not set. Only fields required for a parser to treat as a valid Overwinter V3 tx. - + // TODO: In future, when moving from Overwinter to Sapling, it will be useful // to set the expiry height to: min(activation_height - 1, default_expiry_height) } From caf6b6b54ac2fd8b121592fe5ac159ed0d696682 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 15 Apr 2018 20:30:30 +0300 Subject: [PATCH 1052/1062] KOMODO_LONGESTCHAIN = height; --- src/rpcnet.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/rpcnet.cpp b/src/rpcnet.cpp index d2798f10c..a7a4bf051 100644 --- a/src/rpcnet.cpp +++ b/src/rpcnet.cpp @@ -165,6 +165,7 @@ UniValue getpeerinfo(const UniValue& params, bool fHelp) return ret; } +int32_t KOMODO_LONGESTCHAIN; int32_t komodo_longestchain() { int32_t ht,n=0,num=0,maxheight=0,height = 0; @@ -191,8 +192,12 @@ int32_t komodo_longestchain() height = ht; } if ( num > (n >> 1) ) + { + KOMODO_LONGESTCHAIN = height; return(height); - else return(0); + } + KOMODO_LONGESTCHAIN = 0; + return(0); } UniValue addnode(const UniValue& params, bool fHelp) From a1f98933bc1c3a2ac6e85bd676238d23d7a47c25 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 15 Apr 2018 20:43:36 +0300 Subject: [PATCH 1053/1062] Test --- src/main.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 19e3c29ee..a1ace1022 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3091,9 +3091,11 @@ static bool ActivateBestChainStep(CValidationState &state, CBlockIndex *pindexMo { fBlocksDisconnected = true; fprintf(stderr,"%d ",(int32_t)tipindex->nHeight); - InvalidateBlock(state,tipindex); if ( !DisconnectTip(state) ) + { + InvalidateBlock(state,tipindex); break; + } } fprintf(stderr,"reached rewind.%d, best to do: ./komodo-cli -ac_name=%s stop\n",KOMODO_REWIND,ASSETCHAINS_SYMBOL); sleep(20); @@ -3538,9 +3540,11 @@ int32_t komodo_reverify_blockcheck(CValidationState& state,int32_t height,CBlock while ( rewindtarget > 0 && (tipindex= chainActive.Tip()) != 0 && tipindex->nHeight > rewindtarget ) { fprintf(stderr,"%d ",(int32_t)tipindex->nHeight); - InvalidateBlock(state,tipindex); if ( !DisconnectTip(state) ) + { + InvalidateBlock(state,tipindex); break; + } } tipindex = chainActive.Tip(); fprintf(stderr,"rewind done to %d\n",tipindex!=0?tipindex->nHeight:-1); @@ -3743,7 +3747,8 @@ bool AcceptBlockHeader(const CBlockHeader& block, CValidationState& state, CBloc if ( pindex != 0 && pindex->nStatus & BLOCK_FAILED_MASK ) { komodo_reverify_blockcheck(state,pindex->nHeight,pindex); - return state.Invalid(error("%s: block is marked invalid", __func__), 0, "duplicate"); + if ( KOMODO_LONGESTCHAIN != 0 && pindex->nHeight > KOMODO_LONGESTCHAIN-100 ) + return state.Invalid(error("%s: block is marked invalid", __func__), 0, "duplicate"); } if ( pindex != 0 && IsInitialBlockDownload() == 0 ) // jl777 debug test { From 549446dd13dd7abbe7be27d6d281c6cf03540598 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 15 Apr 2018 20:44:32 +0300 Subject: [PATCH 1054/1062] Test --- src/main.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main.cpp b/src/main.cpp index a1ace1022..e65600528 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3749,6 +3749,10 @@ bool AcceptBlockHeader(const CBlockHeader& block, CValidationState& state, CBloc komodo_reverify_blockcheck(state,pindex->nHeight,pindex); if ( KOMODO_LONGESTCHAIN != 0 && pindex->nHeight > KOMODO_LONGESTCHAIN-100 ) return state.Invalid(error("%s: block is marked invalid", __func__), 0, "duplicate"); + else + { + pindex->nStatus &= ~BLOCK_FAILED_MASK; + } } if ( pindex != 0 && IsInitialBlockDownload() == 0 ) // jl777 debug test { From 02626c56b280295e38596c60c6d480d2ea343734 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 15 Apr 2018 20:59:34 +0300 Subject: [PATCH 1055/1062] Test --- src/main.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index e65600528..fa66fdb12 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3091,11 +3091,9 @@ static bool ActivateBestChainStep(CValidationState &state, CBlockIndex *pindexMo { fBlocksDisconnected = true; fprintf(stderr,"%d ",(int32_t)tipindex->nHeight); + InvalidateBlock(state,tipindex); if ( !DisconnectTip(state) ) - { - InvalidateBlock(state,tipindex); break; - } } fprintf(stderr,"reached rewind.%d, best to do: ./komodo-cli -ac_name=%s stop\n",KOMODO_REWIND,ASSETCHAINS_SYMBOL); sleep(20); @@ -3526,6 +3524,8 @@ int32_t komodo_reverify_blockcheck(CValidationState& state,int32_t height,CBlock { static int32_t oneshot; CBlockIndex *tipindex; int32_t rewindtarget; + if ( KOMODO_REWIND != 0 ) + oneshot = KOMODO_REWIND; if ( oneshot == 0 && IsInitialBlockDownload() == 0 && (tipindex= chainActive.Tip()) != 0 ) { // if 200 blocks behind longestchain and no blocks for 2 hours @@ -3540,11 +3540,9 @@ int32_t komodo_reverify_blockcheck(CValidationState& state,int32_t height,CBlock while ( rewindtarget > 0 && (tipindex= chainActive.Tip()) != 0 && tipindex->nHeight > rewindtarget ) { fprintf(stderr,"%d ",(int32_t)tipindex->nHeight); + InvalidateBlock(state,tipindex); if ( !DisconnectTip(state) ) - { - InvalidateBlock(state,tipindex); break; - } } tipindex = chainActive.Tip(); fprintf(stderr,"rewind done to %d\n",tipindex!=0?tipindex->nHeight:-1); From df280f67b30735c3496cc64fd637a72d002282da Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 15 Apr 2018 22:12:27 +0300 Subject: [PATCH 1056/1062] Fix n -> static n0/n1 --- src/komodo_notary.h | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index d0e02999a..75c391528 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -199,8 +199,8 @@ const char *Notaries_elected1[][2] = int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestamp) { - static uint8_t elected_pubkeys0[64][33],elected_pubkeys1[64][33],did0,did1; - int32_t i,htind,n; uint64_t mask = 0; struct knotary_entry *kp,*tmp; + static uint8_t elected_pubkeys0[64][33],elected_pubkeys1[64][33],did0,did1,n0,n1; + int32_t i,htind; uint64_t mask = 0; struct knotary_entry *kp,*tmp; if ( timestamp == 0 && ASSETCHAINS_SYMBOL[0] != 0 ) timestamp = komodo_heightstamp(height); else if ( ASSETCHAINS_SYMBOL[0] == 0 ) @@ -211,29 +211,30 @@ int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestam { if ( did0 == 0 ) { - n = (int32_t)(sizeof(Notaries_elected0)/sizeof(*Notaries_elected0)); - for (i=0; i= KOMODO_MAXBLOCKS / KOMODO_ELECTION_GAP ) From c8a89440acc7da19570b278063764726fcb44229 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 15 Apr 2018 22:14:35 +0300 Subject: [PATCH 1057/1062] Syntax --- src/komodo_notary.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 75c391528..fd6fcc906 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -200,7 +200,7 @@ const char *Notaries_elected1[][2] = int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestamp) { static uint8_t elected_pubkeys0[64][33],elected_pubkeys1[64][33],did0,did1,n0,n1; - int32_t i,htind; uint64_t mask = 0; struct knotary_entry *kp,*tmp; + int32_t i,htind,n; uint64_t mask = 0; struct knotary_entry *kp,*tmp; if ( timestamp == 0 && ASSETCHAINS_SYMBOL[0] != 0 ) timestamp = komodo_heightstamp(height); else if ( ASSETCHAINS_SYMBOL[0] == 0 ) From 7f0228a121906d1f9571eb8e1ec32aae2b8fca76 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 15 Apr 2018 22:32:03 +0300 Subject: [PATCH 1058/1062] Change n0/n1 size to int32_t --- src/komodo_notary.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index fd6fcc906..ca56ecb61 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -199,7 +199,7 @@ const char *Notaries_elected1[][2] = int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestamp) { - static uint8_t elected_pubkeys0[64][33],elected_pubkeys1[64][33],did0,did1,n0,n1; + static uint8_t elected_pubkeys0[64][33],elected_pubkeys1[64][33],did0,did1; static int32_t n0,n1; int32_t i,htind,n; uint64_t mask = 0; struct knotary_entry *kp,*tmp; if ( timestamp == 0 && ASSETCHAINS_SYMBOL[0] != 0 ) timestamp = komodo_heightstamp(height); From d9daa6281a77dd814a89fa2ec4ecacbdc2e5b5d8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 15 Apr 2018 23:25:26 +0300 Subject: [PATCH 1059/1062] Prevent autorewind if syncing. Not a critical update --- src/main.cpp | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index fa66fdb12..18800d4b2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -53,7 +53,7 @@ using namespace std; CCriticalSection cs_main; extern uint8_t NOTARY_PUBKEY33[33]; -extern int32_t KOMODO_LOADINGBLOCKS,KOMODO_LONGESTCHAIN; +extern int32_t KOMODO_LOADINGBLOCKS,KOMODO_LONGESTCHAIN,KOMODO_NEWBLOCKS; void komodo_block2pubkey33(uint8_t *pubkey33,CBlock *block); BlockMap mapBlockIndex; @@ -3529,23 +3529,25 @@ int32_t komodo_reverify_blockcheck(CValidationState& state,int32_t height,CBlock if ( oneshot == 0 && IsInitialBlockDownload() == 0 && (tipindex= chainActive.Tip()) != 0 ) { // if 200 blocks behind longestchain and no blocks for 2 hours - if ( KOMODO_LONGESTCHAIN > height+200 ) + if ( KOMODO_LONGESTCHAIN > height+200 && KOMODO_NEWBLOCKS == 0 ) { if ( GetAdjustedTime() > tipindex->nTime+3600*2 ) { fprintf(stderr,"tip.%d longest.%d newblock.%d lag.%d blocktime.%u\n",tipindex->nHeight,KOMODO_LONGESTCHAIN,height,(int32_t)(GetAdjustedTime() - tipindex->nTime),tipindex->nTime); - rewindtarget = tipindex->nHeight - 11; - fprintf(stderr,"rewindtarget <- %d\n",rewindtarget); - oneshot = 1; - while ( rewindtarget > 0 && (tipindex= chainActive.Tip()) != 0 && tipindex->nHeight > rewindtarget ) - { - fprintf(stderr,"%d ",(int32_t)tipindex->nHeight); - InvalidateBlock(state,tipindex); - if ( !DisconnectTip(state) ) - break; - } - tipindex = chainActive.Tip(); - fprintf(stderr,"rewind done to %d\n",tipindex!=0?tipindex->nHeight:-1); + KOMODO_REWIND = tipindex->nHeight - 11; + /* + rewindtarget = tipindex->nHeight - 11; + fprintf(stderr,"rewindtarget <- %d\n",rewindtarget); + oneshot = 1; + while ( rewindtarget > 0 && (tipindex= chainActive.Tip()) != 0 && tipindex->nHeight > rewindtarget ) + { + fprintf(stderr,"%d ",(int32_t)tipindex->nHeight); + InvalidateBlock(state,tipindex); + if ( !DisconnectTip(state) ) + break; + } + tipindex = chainActive.Tip(); + fprintf(stderr,"rewind done to %d\n",tipindex!=0?tipindex->nHeight:-1);*/ } } } From 1758d3df4690c1ae134c8da26cf34dd73d57c980 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 15 Apr 2018 23:55:51 +0300 Subject: [PATCH 1060/1062] KOMODO_NEWBLOCKS --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 18800d4b2..5e4b501d3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2801,7 +2801,7 @@ void static UpdateTip(CBlockIndex *pindexNew) { // New best block nTimeBestReceived = GetTime(); mempool.AddTransactionsUpdated(1); - + KOMODO_NEWBLOCKS++; LogPrintf("%s: new best=%s height=%d log2_work=%.8g tx=%lu date=%s progress=%f cache=%.1fMiB(%utx)\n", __func__, chainActive.Tip()->GetBlockHash().ToString(), chainActive.Height(), log(chainActive.Tip()->nChainWork.getdouble())/log(2.0), (unsigned long)chainActive.Tip()->nChainTx, DateTimeStrFormat("%Y-%m-%d %H:%M:%S", chainActive.Tip()->GetBlockTime()), From 9c0f7e89473bcc0f21336571301b8b27167073f2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 15 Apr 2018 23:56:46 +0300 Subject: [PATCH 1061/1062] Declare --- src/main.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 5e4b501d3..e6ad465a7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -53,7 +53,8 @@ using namespace std; CCriticalSection cs_main; extern uint8_t NOTARY_PUBKEY33[33]; -extern int32_t KOMODO_LOADINGBLOCKS,KOMODO_LONGESTCHAIN,KOMODO_NEWBLOCKS; +extern int32_t KOMODO_LOADINGBLOCKS,KOMODO_LONGESTCHAIN; +int32_t KOMODO_NEWBLOCKS; void komodo_block2pubkey33(uint8_t *pubkey33,CBlock *block); BlockMap mapBlockIndex; From b012e5ed5dd4339b6b61ff757e5f27d341d53a46 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 16 Apr 2018 02:48:12 +0300 Subject: [PATCH 1062/1062] Delay PoW check until connect block --- src/main.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index e6ad465a7..3255c3380 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3809,7 +3809,10 @@ bool AcceptBlockHeader(const CBlockHeader& block, CValidationState& state, CBloc if (!ContextualCheckBlockHeader(block, state, pindexPrev)) return false; if (pindex == NULL) - pindex = AddToBlockIndex(block); + { + if ( (pindex= AddToBlockIndex(block)) == 0 ) + fprintf(stderr,"couldnt add to block index\n"); + } if (ppindex) *ppindex = pindex; return true; @@ -3825,7 +3828,7 @@ bool AcceptBlock(CBlock& block, CValidationState& state, CBlockIndex** ppindex, return false; if ( pindex == 0 ) { - //fprintf(stderr,"AcceptBlock error null pindex\n"); + fprintf(stderr,"AcceptBlock error null pindex\n"); return false; } // Try to process all requested blocks that we don't have, but only